ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtcGNpLWRldmljZXMtY2Npc3MKaW5kZXggMGE5MmE3Yy4uNGYyOWU1ZjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCkBAIC0zMSwzICszMSwzMSBAQAogS2VybmVsIFZlcnNpb246IDIuNi4zMAogQ29udGFjdDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCiBEZXNjcmlwdGlvbjoJQSBzeW1ib2xpYyBsaW5rIHRvIC9zeXMvYmxvY2svY2Npc3MhY1hkWQorCitXaGVyZToJCS9zeXMvYnVzL3BjaS9kZXZpY2VzLzxkZXY+L2NjaXNzWC9yZXNjYW4KK0RhdGU6CQlBdWd1c3QgMjAwOQorS2VybmVsIFZlcnNpb246CTIuNi4zMQorQ29udGFjdDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCitEZXNjcmlwdGlvbjoJS2lja3Mgb2YgYSByZXNjYW4gb2YgdGhlIGNvbnRyb2xsZXIgdG8gZGlzY292ZXIgbG9naWNhbAorCQlkcml2ZSB0b3BvbG9neSBjaGFuZ2VzLgorCitXaGVyZToJCS9zeXMvYnVzL3BjaS9kZXZpY2VzLzxkZXY+L2NjaXNzWC9jWGRZL2x1bmlkCitEYXRlOgkJQXVndXN0IDIwMDkKK0tlcm5lbCBWZXJzaW9uOiAyLjYuMzEKK0NvbnRhY3Q6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQorRGVzY3JpcHRpb246CURpc3BsYXlzIHRoZSA4LWJ5dGUgTFVOIElEIHVzZWQgdG8gYWRkcmVzcyBsb2dpY2FsCisJCWRyaXZlIFkgb2YgY29udHJvbGxlciBYLgorCitXaGVyZToJCS9zeXMvYnVzL3BjaS9kZXZpY2VzLzxkZXY+L2NjaXNzWC9jWGRZL3JhaWRfbGV2ZWwKK0RhdGU6CQlBdWd1c3QgMjAwOQorS2VybmVsIFZlcnNpb246IDIuNi4zMQorQ29udGFjdDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCitEZXNjcmlwdGlvbjoJRGlzcGxheXMgdGhlIFJBSUQgbGV2ZWwgb2YgbG9naWNhbCBkcml2ZSBZIG9mCisJCWNvbnRyb2xsZXIgWC4KKworV2hlcmU6CQkvc3lzL2J1cy9wY2kvZGV2aWNlcy88ZGV2Pi9jY2lzc1gvY1hkWS91c2FnZV9jb3VudAorRGF0ZToJCUF1Z3VzdCAyMDA5CitLZXJuZWwgVmVyc2lvbjogMi42LjMxCitDb250YWN0Oglpc3Nfc3RvcmFnZWRldkBocC5jb20KK0Rlc2NyaXB0aW9uOglEaXNwbGF5cyB0aGUgdXNhZ2UgY291bnQgKG51bWJlciBvZiBvcGVucykgb2YgbG9naWNhbCBkcml2ZSBZCisJCW9mIGNvbnRyb2xsZXIgWC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtdXNiX2hvc3QgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXV3Yl9yYy13dXNiaGMKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy11c2JfaG9zdApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy11d2JfcmMtd3VzYmhjCmluZGV4IDQ2YjY2YWQxLi40ZTgxMDZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXVzYl9ob3N0CisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtdXdiX3JjLXd1c2JoYwpAQCAtMSw0ICsxLDQgQEAKLVdoYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL3VzYl9ob3N0L3VzYl9ob3N0Ti93dXNiX2NoaWQKK1doYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL3V3Yl9yYy91d2JOL3d1c2JoYy93dXNiX2NoaWQKIERhdGU6ICAgICAgICAgICBKdWx5IDIwMDgKIEtlcm5lbFZlcnNpb246ICAyLjYuMjcKIENvbnRhY3Q6ICAgICAgICBEYXZpZCBWcmFiZWwgPGRhdmlkLnZyYWJlbEBjc3IuY29tPgpAQCAtOSw3ICs5LDcgQEAKIAogICAgICAgICAgICAgICAgIFNldCBhbiBhbGwgemVybyBDSElEIHRvIHN0b3AgdGhlIGhvc3QgY29udHJvbGxlci4KIAotV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvdXNiX2hvc3QvdXNiX2hvc3ROL3d1c2JfdHJ1c3RfdGltZW91dAorV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvdXdiX3JjL3V3Yk4vd3VzYmhjL3d1c2JfdHJ1c3RfdGltZW91dAogRGF0ZTogICAgICAgICAgIEp1bHkgMjAwOAogS2VybmVsVmVyc2lvbjogIDIuNi4yNwogQ29udGFjdDogICAgICAgIERhdmlkIFZyYWJlbCA8ZGF2aWQudnJhYmVsQGNzci5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtY2FjaGVfZGlzYWJsZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1jYWNoZV9kaXNhYmxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzViYjRmLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1jYWNoZV9kaXNhYmxlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotV2hhdDogICAgICAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUqL2NhY2hlL2luZGV4Ki9jYWNoZV9kaXNhYmxlX1gKLURhdGU6ICAgICAgQXVndXN0IDIwMDgKLUtlcm5lbFZlcnNpb246CTIuNi4yNwotQ29udGFjdDoJbWFyay5sYW5nc2RvcmZAYW1kLmNvbQotRGVzY3JpcHRpb246CVRoZXNlIGZpbGVzIGV4aXN0IGluIGV2ZXJ5IGNwdSdzIGNhY2hlIGluZGV4IGRpcmVjdG9yaWVzLgotCQlUaGVyZSBhcmUgY3VycmVudGx5IDIgY2FjaGVfZGlzYWJsZV8jIGZpbGVzIGluIGVhY2gKLQkJZGlyZWN0b3J5LiAgUmVhZGluZyBmcm9tIHRoZXNlIGZpbGVzIG9uIGEgc3VwcG9ydGVkCi0JCXByb2Nlc3NvciB3aWxsIHJldHVybiB0aGF0IGNhY2hlIGRpc2FibGUgaW5kZXggdmFsdWUKLQkJZm9yIHRoYXQgcHJvY2Vzc29yIGFuZCBub2RlLiAgV3JpdGluZyB0byBvbmUgb2YgdGhlc2UKLQkJZmlsZXMgd2lsbCBjYXVzZSB0aGUgc3BlY2lmaWNlZCBjYWNoZSBpbmRleCB0byBiZSBkaXNhYmxlZC4KLQotCQlDdXJyZW50bHksIG9ubHkgQU1EIEZhbWlseSAxMGggUHJvY2Vzc29ycyBzdXBwb3J0IGNhY2hlIGluZGV4Ci0JCWRpc2FibGUsIGFuZCBvbmx5IGZvciB0aGVpciBMMyBjYWNoZXMuICBTZWUgdGhlIEJJT1MgYW5kCi0JCUtlcm5lbCBEZXZlbG9wZXIncyBHdWlkZSBhdAotCQlodHRwOi8vd3d3LmFtZC5jb20vdXMtZW4vYXNzZXRzL2NvbnRlbnRfdHlwZS93aGl0ZV9wYXBlcnNfYW5kX3RlY2hfZG9jcy8zMTExNi1QdWJsaWMtR0gtQktER18zLjIwXzItNC0wOS5wZGYKLQkJZm9yIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gYW5kIG90aGVyIGRldGFpbHMgb24gdGhlCi0JCWNhY2hlIGluZGV4IGRpc2FibGUuCi1Vc2VyczogICAgam9hY2hpbS5kZWd1YXJhQGFtZC5jb20KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tY3B1IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwM2I5ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tY3B1CkBAIC0wLDAgKzEsMTU2IEBACitXaGF0OgkJL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvCitEYXRlOgkJcHJlLWdpdCBoaXN0b3J5CitDb250YWN0OglMaW51eCBrZXJuZWwgbWFpbGluZyBsaXN0IDxsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnPgorRGVzY3JpcHRpb246CisJCUEgY29sbGVjdGlvbiBvZiBib3RoIGdsb2JhbCBhbmQgaW5kaXZpZHVhbCBDUFUgYXR0cmlidXRlcworCisJCUluZGl2aWR1YWwgQ1BVIGF0dHJpYnV0ZXMgYXJlIGNvbnRhaW5lZCBpbiBzdWJkaXJlY3RvcmllcworCQluYW1lZCBieSB0aGUga2VybmVsJ3MgbG9naWNhbCBDUFUgbnVtYmVyLCBlLmcuOgorCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSMvCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9zY2hlZF9tY19wb3dlcl9zYXZpbmdzCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L3NjaGVkX3NtdF9wb3dlcl9zYXZpbmdzCitEYXRlOgkJSnVuZSAyMDA2CitDb250YWN0OglMaW51eCBrZXJuZWwgbWFpbGluZyBsaXN0IDxsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnPgorRGVzY3JpcHRpb246CURpc2NvdmVyIGFuZCBhZGp1c3QgdGhlIGtlcm5lbCdzIG11bHRpLWNvcmUgc2NoZWR1bGVyIHN1cHBvcnQuCisKKwkJUG9zc2libGUgdmFsdWVzIGFyZToKKworCQkwIC0gTm8gcG93ZXIgc2F2aW5nIGxvYWQgYmFsYW5jZSAoZGVmYXVsdCB2YWx1ZSkKKwkJMSAtIEZpbGwgb25lIHRocmVhZC9jb3JlL3BhY2thZ2UgZmlyc3QgZm9yIGxvbmcgcnVubmluZyB0aHJlYWRzCisJCTIgLSBBbHNvIGJpYXMgdGFzayB3YWtldXBzIHRvIHNlbWktaWRsZSBjcHUgcGFja2FnZSBmb3IgcG93ZXIKKwkJICAgIHNhdmluZ3MKKworCQlzY2hlZF9tY19wb3dlcl9zYXZpbmdzIGlzIGRlcGVuZGVudCB1cG9uIFNDSEVEX01DLCB3aGljaCBpcworCQlpdHNlbGYgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudC4KKworCQlzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncyBpcyBkZXBlbmRlbnQgdXBvbiBTQ0hFRF9TTVQsIHdoaWNoCisJCWlzIGl0c2VsZiBhcmNoaXRlY3R1cmUgZGVwZW5kZW50LgorCisJCVRoZSB0d28gZmlsZXMgYXJlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuIEl0IGlzIHBvc3NpYmxlCisJCXRoYXQgb25lIGZpbGUgbWF5IGJlIHByZXNlbnQgd2l0aG91dCB0aGUgb3RoZXIuCisKKwkJSW50cm9kdWNlZCBieSBnaXQgY29tbWl0IDVjNDViZjI3LgorCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9rZXJuZWxfbWF4CisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L29mZmxpbmUKKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvb25saW5lCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L3Bvc3NpYmxlCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L3ByZXNlbnQKK0RhdGU6CQlEZWNlbWJlciAyMDA4CitDb250YWN0OglMaW51eCBrZXJuZWwgbWFpbGluZyBsaXN0IDxsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnPgorRGVzY3JpcHRpb246CUNQVSB0b3BvbG9neSBmaWxlcyB0aGF0IGRlc2NyaWJlIGtlcm5lbCBsaW1pdHMgcmVsYXRlZCB0bworCQlob3RwbHVnLiBCcmllZmx5OgorCisJCWtlcm5lbF9tYXg6IHRoZSBtYXhpbXVtIGNwdSBpbmRleCBhbGxvd2VkIGJ5IHRoZSBrZXJuZWwKKwkJY29uZmlndXJhdGlvbi4KKworCQlvZmZsaW5lOiBjcHVzIHRoYXQgYXJlIG5vdCBvbmxpbmUgYmVjYXVzZSB0aGV5IGhhdmUgYmVlbgorCQlIT1RQTFVHR0VEIG9mZiBvciBleGNlZWQgdGhlIGxpbWl0IG9mIGNwdXMgYWxsb3dlZCBieSB0aGUKKwkJa2VybmVsIGNvbmZpZ3VyYXRpb24gKGtlcm5lbF9tYXggYWJvdmUpLgorCisJCW9ubGluZTogY3B1cyB0aGF0IGFyZSBvbmxpbmUgYW5kIGJlaW5nIHNjaGVkdWxlZC4KKworCQlwb3NzaWJsZTogY3B1cyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgcmVzb3VyY2VzIGFuZCBjYW4gYmUKKwkJYnJvdWdodCBvbmxpbmUgaWYgdGhleSBhcmUgcHJlc2VudC4KKworCQlwcmVzZW50OiBjcHVzIHRoYXQgaGF2ZSBiZWVuIGlkZW50aWZpZWQgYXMgYmVpbmcgcHJlc2VudCBpbgorCQl0aGUgc3lzdGVtLgorCisJCVNlZSBEb2N1bWVudGF0aW9uL2NwdXRvcG9sb2d5LnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUjL25vZGUKK0RhdGU6CQlPY3RvYmVyIDIwMDkKK0NvbnRhY3Q6CUxpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IG1haWxpbmcgbGlzdCA8bGludXgtbW1Aa3ZhY2sub3JnPgorRGVzY3JpcHRpb246CURpc2NvdmVyIE5VTUEgbm9kZSBhIENQVSBiZWxvbmdzIHRvCisKKwkJV2hlbiBDT05GSUdfTlVNQSBpcyBlbmFibGVkLCBhIHN5bWJvbGljIGxpbmsgdGhhdCBwb2ludHMKKwkJdG8gdGhlIGNvcnJlc3BvbmRpbmcgTlVNQSBub2RlIGRpcmVjdG9yeS4KKworCQlGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzeW1saW5rIGlzIGNyZWF0ZWQgZm9yIGNwdTQyCisJCWluIE5VTUEgbm9kZSAyOgorCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTQyL25vZGUyIC0+IC4uLy4uL25vZGUvbm9kZTIKKworCitXaGF0OgkJL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Iy90b3BvbG9neS9jb3JlX2lkCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSMvdG9wb2xvZ3kvY29yZV9zaWJsaW5ncworCQkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUjL3RvcG9sb2d5L2NvcmVfc2libGluZ3NfbGlzdAorCQkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUjL3RvcG9sb2d5L3BoeXNpY2FsX3BhY2thZ2VfaWQKKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Iy90b3BvbG9neS90aHJlYWRfc2libGluZ3MKKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Iy90b3BvbG9neS90aHJlYWRfc2libGluZ3NfbGlzdAorRGF0ZToJCURlY2VtYmVyIDIwMDgKK0NvbnRhY3Q6CUxpbnV4IGtlcm5lbCBtYWlsaW5nIGxpc3QgPGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc+CitEZXNjcmlwdGlvbjoJQ1BVIHRvcG9sb2d5IGZpbGVzIHRoYXQgZGVzY3JpYmUgYSBsb2dpY2FsIENQVSdzIHJlbGF0aW9uc2hpcAorCQl0byBvdGhlciBjb3JlcyBhbmQgdGhyZWFkcyBpbiB0aGUgc2FtZSBwaHlzaWNhbCBwYWNrYWdlLgorCisJCU9uZSBjcHUjIGRpcmVjdG9yeSBpcyBjcmVhdGVkIHBlciBsb2dpY2FsIENQVSBpbiB0aGUgc3lzdGVtLAorCQllLmcuIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTQyLy4KKworCQlCcmllZmx5LCB0aGUgZmlsZXMgYWJvdmUgYXJlOgorCisJCWNvcmVfaWQ6IHRoZSBDUFUgY29yZSBJRCBvZiBjcHUjLiBUeXBpY2FsbHkgaXQgaXMgdGhlCisJCWhhcmR3YXJlIHBsYXRmb3JtJ3MgaWRlbnRpZmllciAocmF0aGVyIHRoYW4gdGhlIGtlcm5lbCdzKS4KKwkJVGhlIGFjdHVhbCB2YWx1ZSBpcyBhcmNoaXRlY3R1cmUgYW5kIHBsYXRmb3JtIGRlcGVuZGVudC4KKworCQljb3JlX3NpYmxpbmdzOiBpbnRlcm5hbCBrZXJuZWwgbWFwIG9mIGNwdSMncyBoYXJkd2FyZSB0aHJlYWRzCisJCXdpdGhpbiB0aGUgc2FtZSBwaHlzaWNhbF9wYWNrYWdlX2lkLgorCisJCWNvcmVfc2libGluZ3NfbGlzdDogaHVtYW4tcmVhZGFibGUgbGlzdCBvZiB0aGUgbG9naWNhbCBDUFUKKwkJbnVtYmVycyB3aXRoaW4gdGhlIHNhbWUgcGh5c2ljYWxfcGFja2FnZV9pZCBhcyBjcHUjLgorCisJCXBoeXNpY2FsX3BhY2thZ2VfaWQ6IHBoeXNpY2FsIHBhY2thZ2UgaWQgb2YgY3B1Iy4gVHlwaWNhbGx5CisJCWNvcnJlc3BvbmRzIHRvIGEgcGh5c2ljYWwgc29ja2V0IG51bWJlciwgYnV0IHRoZSBhY3R1YWwgdmFsdWUKKwkJaXMgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBkZXBlbmRlbnQuCisKKwkJdGhyZWFkX3NpYmxpbmdzOiBpbnRlcm5lbCBrZXJuZWwgbWFwIG9mIGNwdSMncyBoYXJkd2FyZQorCQl0aHJlYWRzIHdpdGhpbiB0aGUgc2FtZSBjb3JlIGFzIGNwdSMKKworCQl0aHJlYWRfc2libGluZ3NfbGlzdDogaHVtYW4tcmVhZGFibGUgbGlzdCBvZiBjcHUjJ3MgaGFyZHdhcmUKKwkJdGhyZWFkcyB3aXRoaW4gdGhlIHNhbWUgY29yZSBhcyBjcHUjCisKKwkJU2VlIERvY3VtZW50YXRpb24vY3B1dG9wb2xvZ3kudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHVpZGxlL2N1cnJlbnRfZHJpdmVyCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdWlkbGUvY3VycmVudF9nb3Zlcm5lcl9ybworRGF0ZToJCVNlcHRlbWJlciAyMDA3CitDb250YWN0OglMaW51eCBrZXJuZWwgbWFpbGluZyBsaXN0IDxsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnPgorRGVzY3JpcHRpb246CURpc2NvdmVyIGNwdWlkbGUgcG9saWN5IGFuZCBtZWNoYW5pc20KKworCQlWYXJpb3VzIENQVXMgdG9kYXkgc3VwcG9ydCBtdWx0aXBsZSBpZGxlIGxldmVscyB0aGF0IGFyZQorCQlkaWZmZXJlbnRpYXRlZCBieSB2YXJ5aW5nIGV4aXQgbGF0ZW5jaWVzIGFuZCBwb3dlcgorCQljb25zdW1wdGlvbiBkdXJpbmcgaWRsZS4KKworCQlJZGxlIHBvbGljeSAoZ292ZXJub3IpIGlzIGRpZmZlcmVudGlhdGVkIGZyb20gaWRsZSBtZWNoYW5pc20KKwkJKGRyaXZlcikKKworCQljdXJyZW50X2RyaXZlcjogZGlzcGxheXMgY3VycmVudCBpZGxlIG1lY2hhbmlzbQorCisJCWN1cnJlbnRfZ292ZXJub3Jfcm86IGRpc3BsYXlzIGN1cnJlbnQgaWRsZSBwb2xpY3kKKworCQlTZWUgZmlsZXMgaW4gRG9jdW1lbnRhdGlvbi9jcHVpZGxlLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCitXaGF0OiAgICAgIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSovY2FjaGUvaW5kZXgqL2NhY2hlX2Rpc2FibGVfWAorRGF0ZTogICAgICBBdWd1c3QgMjAwOAorS2VybmVsVmVyc2lvbjoJMi42LjI3CitDb250YWN0OgltYXJrLmxhbmdzZG9yZkBhbWQuY29tCitEZXNjcmlwdGlvbjoJVGhlc2UgZmlsZXMgZXhpc3QgaW4gZXZlcnkgY3B1J3MgY2FjaGUgaW5kZXggZGlyZWN0b3JpZXMuCisJCVRoZXJlIGFyZSBjdXJyZW50bHkgMiBjYWNoZV9kaXNhYmxlXyMgZmlsZXMgaW4gZWFjaAorCQlkaXJlY3RvcnkuICBSZWFkaW5nIGZyb20gdGhlc2UgZmlsZXMgb24gYSBzdXBwb3J0ZWQKKwkJcHJvY2Vzc29yIHdpbGwgcmV0dXJuIHRoYXQgY2FjaGUgZGlzYWJsZSBpbmRleCB2YWx1ZQorCQlmb3IgdGhhdCBwcm9jZXNzb3IgYW5kIG5vZGUuICBXcml0aW5nIHRvIG9uZSBvZiB0aGVzZQorCQlmaWxlcyB3aWxsIGNhdXNlIHRoZSBzcGVjaWZpY2VkIGNhY2hlIGluZGV4IHRvIGJlIGRpc2FibGVkLgorCisJCUN1cnJlbnRseSwgb25seSBBTUQgRmFtaWx5IDEwaCBQcm9jZXNzb3JzIHN1cHBvcnQgY2FjaGUgaW5kZXgKKwkJZGlzYWJsZSwgYW5kIG9ubHkgZm9yIHRoZWlyIEwzIGNhY2hlcy4gIFNlZSB0aGUgQklPUyBhbmQKKwkJS2VybmVsIERldmVsb3BlcidzIEd1aWRlIGF0CisJCWh0dHA6Ly93d3cuYW1kLmNvbS91cy1lbi9hc3NldHMvY29udGVudF90eXBlL3doaXRlX3BhcGVyc19hbmRfdGVjaF9kb2NzLzMxMTE2LVB1YmxpYy1HSC1CS0RHXzMuMjBfMi00LTA5LnBkZgorCQlmb3IgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBhbmQgb3RoZXIgZGV0YWlscyBvbiB0aGUKKwkJY2FjaGUgaW5kZXggZGlzYWJsZS4KK1VzZXJzOiAgICBqb2FjaGltLmRlZ3VhcmFAYW1kLmNvbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKaW5kZXggYjdmOWQzYi4uNzI2NTFmNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC0yMzIsNyArMjMyLDcgQEAKIFdoZW4gc2VuZGluZyBwYXRjaGVzIHRvIExpbnVzLCBhbHdheXMgZm9sbG93IHN0ZXAgIzcuCiAKIExhcmdlIGNoYW5nZXMgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgbWFpbGluZyBsaXN0cywgYW5kIHNvbWUKLW1haW50YWluZXJzLiAgSWYgeW91ciBwYXRjaCwgdW5jb21wcmVzc2VkLCBleGNlZWRzIDQwIGtCIGluIHNpemUsCittYWludGFpbmVycy4gIElmIHlvdXIgcGF0Y2gsIHVuY29tcHJlc3NlZCwgZXhjZWVkcyAzMDAga0IgaW4gc2l6ZSwKIGl0IGlzIHByZWZlcnJlZCB0aGF0IHlvdSBzdG9yZSB5b3VyIHBhdGNoIG9uIGFuIEludGVybmV0LWFjY2Vzc2libGUKIHNlcnZlciwgYW5kIHByb3ZpZGUgaW5zdGVhZCBhIFVSTCAobGluaykgcG9pbnRpbmcgdG8geW91ciBwYXRjaC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vdGNtLnR4dCBiL0RvY3VtZW50YXRpb24vYXJtL3RjbS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmZDkzNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYXJtL3RjbS50eHQKQEAgLTAsMCArMSwxNDcgQEAKK0FSTSBUQ00gKFRpZ2h0bHktQ291cGxlZCBNZW1vcnkpIGhhbmRsaW5nIGluIExpbnV4CistLS0tCitXcml0dGVuIGJ5IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+CisKK1NvbWUgQVJNIFNvQzpzIGhhdmUgYSBzby1jYWxsZWQgVENNIChUaWdodGx5LUNvdXBsZWQgTWVtb3J5KS4KK1RoaXMgaXMgdXN1YWxseSBqdXN0IGEgZmV3ICg0LTY0KSBLaUIgb2YgUkFNIGluc2lkZSB0aGUgQVJNCitwcm9jZXNzb3IuCisKK0R1ZSB0byBiZWluZyBlbWJlZGRlZCBpbnNpZGUgdGhlIENQVSBUaGUgVENNIGhhcyBhCitIYXJ2YXJkLWFyY2hpdGVjdHVyZSwgc28gdGhlcmUgaXMgYW4gSVRDTSAoaW5zdHJ1Y3Rpb24gVENNKQorYW5kIGEgRFRDTSAoZGF0YSBUQ00pLiBUaGUgRFRDTSBjYW4gbm90IGNvbnRhaW4gYW55CitpbnN0cnVjdGlvbnMsIGJ1dCB0aGUgSVRDTSBjYW4gYWN0dWFsbHkgY29udGFpbiBkYXRhLgorVGhlIHNpemUgb2YgRFRDTSBvciBJVENNIGlzIG1pbmltdW0gNEtpQiBzbyB0aGUgdHlwaWNhbAorbWluaW11bSBjb25maWd1cmF0aW9uIGlzIDRLaUIgSVRDTSBhbmQgNEtpQiBEVENNLgorCitBUk0gQ1BVOnMgaGF2ZSBzcGVjaWFsIHJlZ2lzdGVycyB0byByZWFkIG91dCBzdGF0dXMsIHBoeXNpY2FsCitsb2NhdGlvbiBhbmQgc2l6ZSBvZiBUQ00gbWVtb3JpZXMuIGFyY2gvYXJtL2luY2x1ZGUvYXNtL2NwdXR5cGUuaAorZGVmaW5lcyBhIENQVUlEX1RDTSByZWdpc3RlciB0aGF0IHlvdSBjYW4gcmVhZCBvdXQgZnJvbSB0aGUKK3N5c3RlbSBjb250cm9sIGNvcHJvY2Vzc29yLiBEb2N1bWVudGF0aW9uIGZyb20gQVJNIGNhbiBiZSBmb3VuZAorYXQgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbSwgc2VhcmNoIGZvciAiVENNIFN0YXR1cyBSZWdpc3RlciIKK3RvIHNlZSBkb2N1bWVudHMgZm9yIGFsbCBDUFVzLiBSZWFkaW5nIHRoaXMgcmVnaXN0ZXIgeW91IGNhbgorZGV0ZXJtaW5lIGlmIElUQ00gKGJpdCAwKSBhbmQvb3IgRFRDTSAoYml0IDE2KSBpcyBwcmVzZW50IGluIHRoZQorbWFjaGluZS4KKworVGhlcmUgaXMgZnVydGhlciBhIFRDTSByZWdpb24gcmVnaXN0ZXIgKHNlYXJjaCBmb3IgIlRDTSBSZWdpb24KK1JlZ2lzdGVycyIgYXQgdGhlIEFSTSBzaXRlKSB0aGF0IGNhbiByZXBvcnQgYW5kIG1vZGlmeSB0aGUgbG9jYXRpb24KK3NpemUgb2YgVENNIG1lbW9yaWVzIGF0IHJ1bnRpbWUuIFRoaXMgaXMgdXNlZCB0byByZWFkIG91dCBhbmQgbW9kaWZ5CitUQ00gbG9jYXRpb24gYW5kIHNpemUuIE5vdGljZSB0aGF0IHRoaXMgaXMgbm90IGEgTU1VIHRhYmxlOiB5b3UKK2FjdHVhbGx5IG1vdmUgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSBUQ00gYXJvdW5kLiBBdCB0aGUKK3BsYWNlIHlvdSBwdXQgaXQsIGl0IHdpbGwgbWFzayBhbnkgdW5kZXJseWluZyBSQU0gZnJvbSB0aGUKK0NQVSBzbyBpdCBpcyB1c3VhbGx5IHdpc2Ugbm90IHRvIG92ZXJsYXAgYW55IHBoeXNpY2FsIFJBTSB3aXRoCit0aGUgVENNLgorCitUaGUgVENNIG1lbW9yeSBjYW4gdGhlbiBiZSByZW1hcHBlZCB0byBhbm90aGVyIGFkZHJlc3MgYWdhaW4gdXNpbmcKK3RoZSBNTVUsIGJ1dCBub3RpY2UgdGhhdCB0aGUgVENNIGlmIG9mdGVuIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZQordGhlIE1NVSBpcyB0dXJuZWQgb2ZmLiBUbyBhdm9pZCBjb25mdXNpb24gdGhlIGN1cnJlbnQgTGludXgKK2ltcGxlbWVudGF0aW9uIHdpbGwgbWFwIHRoZSBUQ00gMSB0byAxIGZyb20gcGh5c2ljYWwgdG8gdmlydHVhbAorbWVtb3J5IGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIG1hY2hpbmUuCisKK1RDTSBpcyB1c2VkIGZvciBhIGZldyB0aGluZ3M6CisKKy0gRklRIGFuZCBvdGhlciBpbnRlcnJ1cHQgaGFuZGxlcnMgdGhhdCBuZWVkIGRldGVybWluaXN0aWMKKyAgdGltaW5nIGFuZCBjYW5ub3Qgd2FpdCBmb3IgY2FjaGUgbWlzc2VzLgorCistIElkbGUgbG9vcHMgd2hlcmUgYWxsIGV4dGVybmFsIFJBTSBpcyBzZXQgdG8gc2VsZi1yZWZyZXNoCisgIHJldGVudGlvbiBtb2RlLCBzbyBvbmx5IG9uLWNoaXAgUkFNIGlzIGFjY2Vzc2libGUgYnkKKyAgdGhlIENQVSBhbmQgdGhlbiB3ZSBoYW5nIGluc2lkZSBJVENNIHdhaXRpbmcgZm9yIGFuCisgIGludGVycnVwdC4KKworLSBPdGhlciBvcGVyYXRpb25zIHdoaWNoIGltcGxpZXMgc2h1dHRpbmcgb2ZmIG9yIHJlY29uZmlndXJpbmcKKyAgdGhlIGV4dGVybmFsIFJBTSBjb250cm9sbGVyLgorCitUaGVyZSBpcyBhbiBpbnRlcmZhY2UgZm9yIHVzaW5nIFRDTSBvbiB0aGUgQVJNIGFyY2hpdGVjdHVyZQoraW4gPGFzbS90Y20uaD4uIFVzaW5nIHRoaXMgaW50ZXJmYWNlIGl0IGlzIHBvc3NpYmxlIHRvOgorCistIERlZmluZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiBJVENNIGFuZCBEVENNLgorCistIFRhZyBmdW5jdGlvbnMgdG8gYmUgY29tcGlsZWQgaW50byBJVENNLgorCistIFRhZyBkYXRhIGFuZCBjb25zdGFudHMgdG8gYmUgYWxsb2NhdGVkIHRvIERUQ00gYW5kIElUQ00uCisKKy0gSGF2ZSB0aGUgcmVtYWluaW5nIFRDTSBSQU0gYWRkZWQgdG8gYSBzcGVjaWFsCisgIGFsbG9jYXRpb24gcG9vbCB3aXRoIGdlbl9wb29sX2NyZWF0ZSgpIGFuZCBnZW5fcG9vbF9hZGQoKQorICBhbmQgcHJvdmljZSB0Y21fYWxsb2MoKSBhbmQgdGNtX2ZyZWUoKSBmb3IgdGhpcworICBtZW1vcnkuIFN1Y2ggYSBoZWFwIGlzIGdyZWF0IGZvciB0aGluZ3MgbGlrZSBzYXZpbmcKKyAgZGV2aWNlIHN0YXRlIHdoZW4gc2h1dHRpbmcgb2ZmIGRldmljZSBwb3dlciBkb21haW5zLgorCitBIG1hY2hpbmUgdGhhdCBoYXMgVENNIG1lbW9yeSBzaGFsbCBzZWxlY3QgSEFWRV9UQ00gaW4KK2FyY2gvYXJtL0tjb25maWcgZm9yIGl0c2VsZiwgYW5kIHRoZW4gdGhlCityZXN0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IHdpbGwgZGVwZW5kIG9uIHRoZSBwaHlzaWNhbAorbG9jYXRpb24gYW5kIHNpemUgb2YgSVRDTSBhbmQgRFRDTSB0byBiZSBkZWZpbmVkIGluCittYWNoL21lbW9yeS5oIGZvciB0aGUgbWFjaGluZS4gQ29kZSB0aGF0IG5lZWRzIHRvIHVzZQorVENNIHNoYWxsICNpbmNsdWRlIDxhc20vdGNtLmg+IElmIHRoZSBUQ00gaXMgbm90IGxvY2F0ZWQKK2F0IHRoZSBwbGFjZSBnaXZlbiBpbiBtZW1vcnkuaCBpdCB3aWxsIGJlIG1vdmVkIHVzaW5nCit0aGUgVENNIFJlZ2lvbiByZWdpc3RlcnMuCisKK0Z1bmN0aW9ucyB0byBnbyBpbnRvIGl0Y20gY2FuIGJlIHRhZ2dlZCBsaWtlIHRoaXM6CitpbnQgX190Y21mdW5jIGZvbyhpbnQgYmFyKTsKKworVmFyaWFibGVzIHRvIGdvIGludG8gZHRjbSBjYW4gYmUgdGFnZ2VkIGxpa2UgdGhpczoKK2ludCBfX3RjbWRhdGEgZm9vOworCitDb25zdGFudHMgY2FuIGJlIHRhZ2dlZCBsaWtlIHRoaXM6CitpbnQgX190Y21jb25zdCBmb287CisKK1RvIHB1dCBhc3NlbWJsZXIgaW50byBUQ00ganVzdCB1c2UKKy5zZWN0aW9uICIudGNtLnRleHQiIG9yIC5zZWN0aW9uICIudGNtLmRhdGEiCityZXNwZWN0aXZlbHkuCisKK0V4YW1wbGUgY29kZToKKworI2luY2x1ZGUgPGFzbS90Y20uaD4KKworLyogVW5pbml0aWFsaXplZCBkYXRhICovCitzdGF0aWMgdTMyIF9fdGNtZGF0YSB0Y212YXI7CisvKiBJbml0aWFsaXplZCBkYXRhICovCitzdGF0aWMgdTMyIF9fdGNtZGF0YSB0Y21hc3NpZ25lZCA9IDB4MkJBREJBQkVVOworLyogQ29uc3RhbnQgKi8KK3N0YXRpYyBjb25zdCB1MzIgX190Y21jb25zdCB0Y21jb25zdCA9IDB4Q0FGRUJBQkVVOworCitzdGF0aWMgdm9pZCBfX3RjbWxvY2FsZnVuYyB0Y21fdG9fdGNtKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorCQl0Y212YXIgKys7Cit9CisKK3N0YXRpYyB2b2lkIF9fdGNtZnVuYyBoZWxsb190Y20odm9pZCkKK3sKKwkvKiBTb21lIGFic3RyYWN0IGNvZGUgdGhhdCBydW5zIGluIElUQ00gKi8KKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJdGNtdmFyICsrOworCX0KKwl0Y21fdG9fdGNtKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X3RjbSh2b2lkKQoreworCXUzMiAqdGNtZW07CisJaW50IGk7CisKKwloZWxsb190Y20oKTsKKwlwcmludGsoIkhlbGxvIFRDTSBleGVjdXRlZCBmcm9tIElUQ00gUkFNXG4iKTsKKworCXByaW50aygiVENNIHZhcmlhYmxlIGZyb20gdGVzdHJ1bjogJXUgQCAlcFxuIiwgdGNtdmFyLCAmdGNtdmFyKTsKKwl0Y212YXIgPSAweERFQURCRUVGVTsKKwlwcmludGsoIlRDTSB2YXJpYWJsZTogMHgleCBAICVwXG4iLCB0Y212YXIsICZ0Y212YXIpOworCisJcHJpbnRrKCJUQ00gYXNzaWduZWQgdmFyaWFibGU6IDB4JXggQCAlcFxuIiwgdGNtYXNzaWduZWQsICZ0Y21hc3NpZ25lZCk7CisKKwlwcmludGsoIlRDTSBjb25zdGFudDogMHgleCBAICVwXG4iLCB0Y21jb25zdCwgJnRjbWNvbnN0KTsKKworCS8qIEFsbG9jYXRlIHNvbWUgVENNIG1lbW9yeSBmcm9tIHRoZSBwb29sICovCisJdGNtZW0gPSB0Y21fYWxsb2MoMjApOworCWlmICh0Y21lbSkgeworCQlwcmludGsoIlRDTSBBbGxvY2F0ZWQgMjAgYnl0ZXMgb2YgVENNIEAgJXBcbiIsIHRjbWVtKTsKKwkJdGNtZW1bMF0gPSAweERFQURCRUVGVTsKKwkJdGNtZW1bMV0gPSAweDJCQURCQUJFVTsKKwkJdGNtZW1bMl0gPSAweENBRkVCQUJFVTsKKwkJdGNtZW1bM10gPSAweERFQURCRUVGVTsKKwkJdGNtZW1bNF0gPSAweDJCQURCQUJFVTsKKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJCXByaW50aygiVENNIHRjbWVtWyVkXSA9ICUwOHhcbiIsIGksIHRjbWVtW2ldKTsKKwkJdGNtX2ZyZWUodGNtZW0sIDIwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2F1eGRpc3BsYXkvY2ZhZzEyODY0Yi1leGFtcGxlLmMgYi9Eb2N1bWVudGF0aW9uL2F1eGRpc3BsYXkvY2ZhZzEyODY0Yi1leGFtcGxlLmMKaW5kZXggMWQyYzAxMC4uZTc4MjNmZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hdXhkaXNwbGF5L2NmYWcxMjg2NGItZXhhbXBsZS5jCisrKyBiL0RvY3VtZW50YXRpb24vYXV4ZGlzcGxheS9jZmFnMTI4NjRiLWV4YW1wbGUuYwpAQCAtMTk0LDcgKzE5NCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNkZWZpbmUgRVhBTVBMRVMJNgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKaW5kZXggNmViMWE5Ny4uMGIzM2JmZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dApAQCAtMjI3LDcgKzIyNywxNCBAQAogRWFjaCBjZ3JvdXAgaXMgcmVwcmVzZW50ZWQgYnkgYSBkaXJlY3RvcnkgaW4gdGhlIGNncm91cCBmaWxlIHN5c3RlbQogY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGZpbGVzIGRlc2NyaWJpbmcgdGhhdCBjZ3JvdXA6CiAKLSAtIHRhc2tzOiBsaXN0IG9mIHRhc2tzIChieSBwaWQpIGF0dGFjaGVkIHRvIHRoYXQgY2dyb3VwCisgLSB0YXNrczogbGlzdCBvZiB0YXNrcyAoYnkgcGlkKSBhdHRhY2hlZCB0byB0aGF0IGNncm91cC4gIFRoaXMgbGlzdAorICAgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc29ydGVkLiAgV3JpdGluZyBhIHRocmVhZCBpZCBpbnRvIHRoaXMgZmlsZQorICAgbW92ZXMgdGhlIHRocmVhZCBpbnRvIHRoaXMgY2dyb3VwLgorIC0gY2dyb3VwLnByb2NzOiBsaXN0IG9mIHRnaWRzIGluIHRoZSBjZ3JvdXAuICBUaGlzIGxpc3QgaXMgbm90CisgICBndWFyYW50ZWVkIHRvIGJlIHNvcnRlZCBvciBmcmVlIG9mIGR1cGxpY2F0ZSB0Z2lkcywgYW5kIHVzZXJzcGFjZQorICAgc2hvdWxkIHNvcnQvdW5pcXVpZnkgdGhlIGxpc3QgaWYgdGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZC4KKyAgIFdyaXRpbmcgYSB0Z2lkIGludG8gdGhpcyBmaWxlIG1vdmVzIGFsbCB0aHJlYWRzIHdpdGggdGhhdCB0Z2lkIGludG8KKyAgIHRoaXMgY2dyb3VwLgogIC0gbm90aWZ5X29uX3JlbGVhc2UgZmxhZzogcnVuIHRoZSByZWxlYXNlIGFnZW50IG9uIGV4aXQ/CiAgLSByZWxlYXNlX2FnZW50OiB0aGUgcGF0aCB0byB1c2UgZm9yIHJlbGVhc2Ugbm90aWZpY2F0aW9ucyAodGhpcyBmaWxlCiAgICBleGlzdHMgaW4gdGhlIHRvcCBjZ3JvdXAgb25seSkKQEAgLTM3NCw3ICszODEsNyBAQAogCiBJbiB0aGlzIGRpcmVjdG9yeSB5b3UgY2FuIGZpbmQgc2V2ZXJhbCBmaWxlczoKICMgbHMKLW5vdGlmeV9vbl9yZWxlYXNlIHRhc2tzCitjZ3JvdXAucHJvY3Mgbm90aWZ5X29uX3JlbGVhc2UgdGFza3MKIChwbHVzIHdoYXRldmVyIGZpbGVzIGFkZGVkIGJ5IHRoZSBhdHRhY2hlZCBzdWJzeXN0ZW1zKQogCiBOb3cgYXR0YWNoIHlvdXIgc2hlbGwgdG8gdGhpcyBjZ3JvdXA6CkBAIC00MDgsNiArNDE1LDI2IEBACiAKICMgZWNobyAwID4gdGFza3MKIAorMi4zIE1vdW50aW5nIGhpZXJhcmNoaWVzIGJ5IG5hbWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Bhc3NpbmcgdGhlIG5hbWU9PHg+IG9wdGlvbiB3aGVuIG1vdW50aW5nIGEgY2dyb3VwcyBoaWVyYXJjaHkKK2Fzc29jaWF0ZXMgdGhlIGdpdmVuIG5hbWUgd2l0aCB0aGUgaGllcmFyY2h5LiAgVGhpcyBjYW4gYmUgdXNlZCB3aGVuCittb3VudGluZyBhIHByZS1leGlzdGluZyBoaWVyYXJjaHksIGluIG9yZGVyIHRvIHJlZmVyIHRvIGl0IGJ5IG5hbWUKK3JhdGhlciB0aGFuIGJ5IGl0cyBzZXQgb2YgYWN0aXZlIHN1YnN5c3RlbXMuICBFYWNoIGhpZXJhcmNoeSBpcyBlaXRoZXIKK25hbWVsZXNzLCBvciBoYXMgYSB1bmlxdWUgbmFtZS4KKworVGhlIG5hbWUgc2hvdWxkIG1hdGNoIFtcdy4tXSsKKworV2hlbiBwYXNzaW5nIGEgbmFtZT08eD4gb3B0aW9uIGZvciBhIG5ldyBoaWVyYXJjaHksIHlvdSBuZWVkIHRvCitzcGVjaWZ5IHN1YnN5c3RlbXMgbWFudWFsbHk7IHRoZSBsZWdhY3kgYmVoYXZpb3VyIG9mIG1vdW50aW5nIGFsbAorc3Vic3lzdGVtcyB3aGVuIG5vbmUgYXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbgoreW91IGdpdmUgYSBzdWJzeXN0ZW0gYSBuYW1lLgorCitUaGUgbmFtZSBvZiB0aGUgc3Vic3lzdGVtIGFwcGVhcnMgYXMgcGFydCBvZiB0aGUgaGllcmFyY2h5IGRlc2NyaXB0aW9uCitpbiAvcHJvYy9tb3VudHMgYW5kIC9wcm9jLzxwaWQ+L2Nncm91cHMuCisKKwogMy4gS2VybmVsIEFQSQogPT09PT09PT09PT09PQogCkBAIC01MDEsNyArNTI4LDcgQEAKIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhZ2FpbnN0IGEgY2dyb3VwLgogCiBpbnQgY2FuX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCi0JICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKKwkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBib29sIHRocmVhZGdyb3VwKQogKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIHByaW9yIHRvIG1vdmluZyBhIHRhc2sgaW50byBhIGNncm91cDsgaWYgdGhlIHN1YnN5c3RlbQpAQCAtNTA5LDE0ICs1MzYsMjAgQEAKIHRhc2sgaXMgcGFzc2VkLCB0aGVuIGEgc3VjY2Vzc2Z1bCByZXN1bHQgaW5kaWNhdGVzIHRoYXQgKmFueSoKIHVuc3BlY2lmaWVkIHRhc2sgY2FuIGJlIG1vdmVkIGludG8gdGhlIGNncm91cC4gTm90ZSB0aGF0IHRoaXMgaXNuJ3QKIGNhbGxlZCBvbiBhIGZvcmsuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgMCAoc3VjY2VzcykgdGhlbiB0aGlzIHNob3VsZAotcmVtYWluIHZhbGlkIHdoaWxlIHRoZSBjYWxsZXIgaG9sZHMgY2dyb3VwX211dGV4LgorcmVtYWluIHZhbGlkIHdoaWxlIHRoZSBjYWxsZXIgaG9sZHMgY2dyb3VwX211dGV4LiBJZiB0aHJlYWRncm91cCBpcwordHJ1ZSwgdGhlbiBhIHN1Y2Nlc3NmdWwgcmVzdWx0IGluZGljYXRlcyB0aGF0IGFsbCB0aHJlYWRzIGluIHRoZSBnaXZlbgordGhyZWFkJ3MgdGhyZWFkZ3JvdXAgY2FuIGJlIG1vdmVkIHRvZ2V0aGVyLgogCiB2b2lkIGF0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCi0JICAgIHN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCisJICAgIHN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJICAgIGJvb2wgdGhyZWFkZ3JvdXApCiAoY2dyb3VwX211dGV4IGhlbGQgYnkgY2FsbGVyKQogCiBDYWxsZWQgYWZ0ZXIgdGhlIHRhc2sgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIGNncm91cCwgdG8gYWxsb3cgYW55CiBwb3N0LWF0dGFjaG1lbnQgYWN0aXZpdHkgdGhhdCByZXF1aXJlcyBtZW1vcnkgYWxsb2NhdGlvbnMgb3IgYmxvY2tpbmcuCitJZiB0aHJlYWRncm91cCBpcyB0cnVlLCB0aGUgc3Vic3lzdGVtIHNob3VsZCB0YWtlIGNhcmUgb2YgYWxsIHRocmVhZHMKK2luIHRoZSBzcGVjaWZpZWQgdGhyZWFkJ3MgdGhyZWFkZ3JvdXAuIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IGFueQorc3Vic3lzdGVtIHRoYXQgbWlnaHQgbmVlZCB0aGUgb2xkX2NncnAgZm9yIGV2ZXJ5IHRocmVhZCBpbiB0aGUgZ3JvdXAuCiAKIHZvaWQgZm9yayhzdHJ1Y3QgY2dyb3VwX3N1YnN5ICpzcywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtb3J5LnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CmluZGV4IDIzZDEyNjIuLmI4NzFmMjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CkBAIC0xNzksNiArMTc5LDkgQEAKIHBhZ2VzIHRoYXQgYXJlIHNlbGVjdGVkIGZvciByZWNsYWltaW5nIGNvbWUgZnJvbSB0aGUgcGVyIGNncm91cCBMUlUKIGxpc3QuCiAKK05PVEU6IFJlY2xhaW0gZG9lcyBub3Qgd29yayBmb3IgdGhlIHJvb3QgY2dyb3VwLCBzaW5jZSB3ZSBjYW5ub3Qgc2V0IGFueQorbGltaXRzIG9uIHRoZSByb290IGNncm91cC4KKwogMi4gTG9ja2luZwogCiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgdXNlcyB0aGUgZm9sbG93aW5nIGhpZXJhcmNoeQpAQCAtMjEwLDYgKzIxMyw3IEBACiBOT1RFOiBXZSBjYW4gdXNlIGEgc3VmZml4IChrLCBLLCBtLCBNLCBnIG9yIEcpIHRvIGluZGljYXRlIHZhbHVlcyBpbiBraWxvLAogbWVnYSBvciBnaWdhYnl0ZXMuCiBOT1RFOiBXZSBjYW4gd3JpdGUgIi0xIiB0byByZXNldCB0aGUgKi5saW1pdF9pbl9ieXRlcyh1bmxpbWl0ZWQpLgorTk9URTogV2UgY2Fubm90IHNldCBsaW1pdHMgb24gdGhlIHJvb3QgY2dyb3VwIGFueSBtb3JlLgogCiAjIGNhdCAvY2dyb3Vwcy8wL21lbW9yeS5saW1pdF9pbl9ieXRlcwogNDE5NDMwNApAQCAtMzc1LDcgKzM3OSw0MiBAQAogCiBOT1RFMjogVGhpcyBmZWF0dXJlIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHBlciBzdWJ0cmVlLgogCi03LiBUT0RPCis3LiBTb2Z0IGxpbWl0cworCitTb2Z0IGxpbWl0cyBhbGxvdyBmb3IgZ3JlYXRlciBzaGFyaW5nIG9mIG1lbW9yeS4gVGhlIGlkZWEgYmVoaW5kIHNvZnQgbGltaXRzCitpcyB0byBhbGxvdyBjb250cm9sIGdyb3VwcyB0byB1c2UgYXMgbXVjaCBvZiB0aGUgbWVtb3J5IGFzIG5lZWRlZCwgcHJvdmlkZWQKKworYS4gVGhlcmUgaXMgbm8gbWVtb3J5IGNvbnRlbnRpb24KK2IuIFRoZXkgZG8gbm90IGV4Y2VlZCB0aGVpciBoYXJkIGxpbWl0CisKK1doZW4gdGhlIHN5c3RlbSBkZXRlY3RzIG1lbW9yeSBjb250ZW50aW9uIG9yIGxvdyBtZW1vcnkgY29udHJvbCBncm91cHMKK2FyZSBwdXNoZWQgYmFjayB0byB0aGVpciBzb2Z0IGxpbWl0cy4gSWYgdGhlIHNvZnQgbGltaXQgb2YgZWFjaCBjb250cm9sCitncm91cCBpcyB2ZXJ5IGhpZ2gsIHRoZXkgYXJlIHB1c2hlZCBiYWNrIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gbWFrZQorc3VyZSB0aGF0IG9uZSBjb250cm9sIGdyb3VwIGRvZXMgbm90IHN0YXJ2ZSB0aGUgb3RoZXJzIG9mIG1lbW9yeS4KKworUGxlYXNlIG5vdGUgdGhhdCBzb2Z0IGxpbWl0cyBpcyBhIGJlc3QgZWZmb3J0IGZlYXR1cmUsIGl0IGNvbWVzIHdpdGgKK25vIGd1YXJhbnRlZXMsIGJ1dCBpdCBkb2VzIGl0cyBiZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHdoZW4gbWVtb3J5IGlzCitoZWF2aWx5IGNvbnRlbmRlZCBmb3IsIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYmFzZWQgb24gdGhlIHNvZnQgbGltaXQKK2hpbnRzL3NldHVwLiBDdXJyZW50bHkgc29mdCBsaW1pdCBiYXNlZCByZWNsYWltIGlzIHNldHVwIHN1Y2ggdGhhdAoraXQgZ2V0cyBpbnZva2VkIGZyb20gYmFsYW5jZV9wZ2RhdCAoa3N3YXBkKS4KKworNy4xIEludGVyZmFjZQorCitTb2Z0IGxpbWl0cyBjYW4gYmUgc2V0dXAgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kcyAoaW4gdGhpcyBleGFtcGxlIHdlCithc3N1bWUgYSBzb2Z0IGxpbWl0IG9mIDI1NiBtZWdhYnl0ZXMpCisKKyMgZWNobyAyNTZNID4gbWVtb3J5LnNvZnRfbGltaXRfaW5fYnl0ZXMKKworSWYgd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyB0byAxRywgd2UgY2FuIGF0IGFueSB0aW1lIHVzZQorCisjIGVjaG8gMUcgPiBtZW1vcnkuc29mdF9saW1pdF9pbl9ieXRlcworCitOT1RFMTogU29mdCBsaW1pdHMgdGFrZSBlZmZlY3Qgb3ZlciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUsIHNpbmNlIHRoZXkgaW52b2x2ZQorICAgICAgIHJlY2xhaW1pbmcgbWVtb3J5IGZvciBiYWxhbmNpbmcgYmV0d2VlbiBtZW1vcnkgY2dyb3VwcworTk9URTI6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHNldCB0aGUgc29mdCBsaW1pdCBhbHdheXMgYmVsb3cgdGhlIGhhcmQgbGltaXQsCisgICAgICAgb3RoZXJ3aXNlIHRoZSBoYXJkIGxpbWl0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLgorCis4LiBUT0RPCiAKIDEuIEFkZCBzdXBwb3J0IGZvciBhY2NvdW50aW5nIGh1Z2UgcGFnZXMgKGFzIGEgc2VwYXJhdGUgY29udHJvbGxlcikKIDIuIE1ha2UgcGVyLWNncm91cCBzY2FubmVyIHJlY2xhaW0gbm90LXNoYXJlZCBwYWdlcyBmaXJzdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY25fdGVzdC5jIGIvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY25fdGVzdC5jCmluZGV4IDE3MTFhZGMuLmIwN2FkZDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29ubmVjdG9yL2NuX3Rlc3QuYworKysgYi9Eb2N1bWVudGF0aW9uL2Nvbm5lY3Rvci9jbl90ZXN0LmMKQEAgLTM0LDcgKzM0LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc29jayAqbmxzOwogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGNuX3Rlc3RfdGltZXI7CiAKLXN0YXRpYyB2b2lkIGNuX3Rlc3RfY2FsbGJhY2soc3RydWN0IGNuX21zZyAqbXNnKQorc3RhdGljIHZvaWQgY25fdGVzdF9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2csIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqbnNwKQogewogCXByX2luZm8oIiVzOiAlbHU6IGlkeD0leCwgdmFsPSV4LCBzZXE9JXUsIGFjaz0ldSwgbGVuPSVkOiAlcy5cbiIsCiAJICAgICAgICBfX2Z1bmNfXywgamlmZmllcywgbXNnLT5pZC5pZHgsIG1zZy0+aWQudmFsLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY29ubmVjdG9yLnR4dCBiL0RvY3VtZW50YXRpb24vY29ubmVjdG9yL2Nvbm5lY3Rvci50eHQKaW5kZXggODFlNmJmNi4uNzhjOTQ2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IvY29ubmVjdG9yLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nvbm5lY3Rvci9jb25uZWN0b3IudHh0CkBAIC0yMyw3ICsyMyw3IEBACiBuZXRsaW5rIGJhc2VkIG5ldHdvcmtpbmcgZm9yIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiBpbiBhIHNpZ25pZmljYW50bHkKIGVhc2llciB3YXk6CiAKLWludCBjbl9hZGRfY2FsbGJhY2soc3RydWN0IGNiX2lkICppZCwgY2hhciAqbmFtZSwgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqKSk7CitpbnQgY25fYWRkX2NhbGxiYWNrKHN0cnVjdCBjYl9pZCAqaWQsIGNoYXIgKm5hbWUsIHZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBjbl9tc2cgKiwgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICopKTsKIHZvaWQgY25fbmV0bGlua19zZW5kKHN0cnVjdCBjbl9tc2cgKm1zZywgdTMyIF9fZ3JvdXAsIGludCBnZnBfbWFzayk7CiAKIHN0cnVjdCBjYl9pZApAQCAtNTMsMTUgKzUzLDE1IEBACiBDb25uZWN0b3IgaW50ZXJmYWNlcy4KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGNuX2FkZF9jYWxsYmFjayhzdHJ1Y3QgY2JfaWQgKmlkLCBjaGFyICpuYW1lLCB2b2lkICgqY2FsbGJhY2spICh2b2lkICopKTsKK2ludCBjbl9hZGRfY2FsbGJhY2soc3RydWN0IGNiX2lkICppZCwgY2hhciAqbmFtZSwgdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IGNuX21zZyAqLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKikpOwogCiAgUmVnaXN0ZXJzIG5ldyBjYWxsYmFjayB3aXRoIGNvbm5lY3RvciBjb3JlLgogCiAgc3RydWN0IGNiX2lkICppZAkJLSB1bmlxdWUgY29ubmVjdG9yJ3MgdXNlciBpZGVudGlmaWVyLgogCQkJCSAgSXQgbXVzdCBiZSByZWdpc3RlcmVkIGluIGNvbm5lY3Rvci5oIGZvciBsZWdhbCBpbi1rZXJuZWwgdXNlcnMuCiAgY2hhciAqbmFtZQkJCS0gY29ubmVjdG9yJ3MgY2FsbGJhY2sgc3ltYm9saWMgbmFtZS4KLSB2b2lkICgqY2FsbGJhY2spICh2b2lkICopCS0gY29ubmVjdG9yJ3MgY2FsbGJhY2suCi0JCQkJICBBcmd1bWVudCBtdXN0IGJlIGRlcmVmZXJlbmNlZCB0byBzdHJ1Y3QgY25fbXNnICouCisgdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IGNuLi4pCS0gY29ubmVjdG9yJ3MgY2FsbGJhY2suCisJCQkJICBjbl9tc2cgYW5kIHRoZSBzZW5kZXIncyBjcmVkZW50aWFscwogCiAKIHZvaWQgY25fZGVsX2NhbGxiYWNrKHN0cnVjdCBjYl9pZCAqaWQpOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHV0b3BvbG9neS50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdXRvcG9sb2d5LnR4dAppbmRleCBiNDFmM2U1Li5mMWM1YzRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdXRvcG9sb2d5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdXRvcG9sb2d5LnR4dApAQCAtMSwxNSArMSwyOCBAQAogCi1FeHBvcnQgY3B1IHRvcG9sb2d5IGluZm8gdmlhIHN5c2ZzLiBJdGVtcyAoYXR0cmlidXRlcykgYXJlIHNpbWlsYXIKK0V4cG9ydCBDUFUgdG9wb2xvZ3kgaW5mbyB2aWEgc3lzZnMuIEl0ZW1zIChhdHRyaWJ1dGVzKSBhcmUgc2ltaWxhcgogdG8gL3Byb2MvY3B1aW5mby4KIAogMSkgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1WC90b3BvbG9neS9waHlzaWNhbF9wYWNrYWdlX2lkOgotcmVwcmVzZW50IHRoZSBwaHlzaWNhbCBwYWNrYWdlIGlkIG9mICBjcHUgWDsKKworCXBoeXNpY2FsIHBhY2thZ2UgaWQgb2YgY3B1WC4gVHlwaWNhbGx5IGNvcnJlc3BvbmRzIHRvIGEgcGh5c2ljYWwKKwlzb2NrZXQgbnVtYmVyLCBidXQgdGhlIGFjdHVhbCB2YWx1ZSBpcyBhcmNoaXRlY3R1cmUgYW5kIHBsYXRmb3JtCisJZGVwZW5kZW50LgorCiAyKSAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHVYL3RvcG9sb2d5L2NvcmVfaWQ6Ci1yZXByZXNlbnQgdGhlIGNwdSBjb3JlIGlkIHRvIGNwdSBYOworCisJdGhlIENQVSBjb3JlIElEIG9mIGNwdVguIFR5cGljYWxseSBpdCBpcyB0aGUgaGFyZHdhcmUgcGxhdGZvcm0ncworCWlkZW50aWZpZXIgKHJhdGhlciB0aGFuIHRoZSBrZXJuZWwncykuICBUaGUgYWN0dWFsIHZhbHVlIGlzCisJYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBkZXBlbmRlbnQuCisKIDMpIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvdG9wb2xvZ3kvdGhyZWFkX3NpYmxpbmdzOgotcmVwcmVzZW50IHRoZSB0aHJlYWQgc2libGluZ3MgdG8gY3B1IFggaW4gdGhlIHNhbWUgY29yZTsKKworCWludGVybmVsIGtlcm5lbCBtYXAgb2YgY3B1WCdzIGhhcmR3YXJlIHRocmVhZHMgd2l0aGluIHRoZSBzYW1lCisJY29yZSBhcyBjcHVYCisKIDQpIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvdG9wb2xvZ3kvY29yZV9zaWJsaW5nczoKLXJlcHJlc2VudCB0aGUgdGhyZWFkIHNpYmxpbmdzIHRvIGNwdSBYIGluIHRoZSBzYW1lIHBoeXNpY2FsIHBhY2thZ2U7CisKKwlpbnRlcm5hbCBrZXJuZWwgbWFwIG9mIGNwdVgncyBoYXJkd2FyZSB0aHJlYWRzIHdpdGhpbiB0aGUgc2FtZQorCXBoeXNpY2FsX3BhY2thZ2VfaWQuCiAKIFRvIGltcGxlbWVudCBpdCBpbiBhbiBhcmNoaXRlY3R1cmUtbmV1dHJhbCB3YXksIGEgbmV3IHNvdXJjZSBmaWxlLAogZHJpdmVycy9iYXNlL3RvcG9sb2d5LmMsIGlzIHRvIGV4cG9ydCB0aGUgNCBhdHRyaWJ1dGVzLgpAQCAtMzIsMzIgKzQ1LDMyIEBACiAzKSB0aHJlYWRfc2libGluZ3M6IGp1c3QgdGhlIGdpdmVuIENQVQogNCkgY29yZV9zaWJsaW5nczoganVzdCB0aGUgZ2l2ZW4gQ1BVCiAKLUFkZGl0aW9uYWxseSwgY3B1IHRvcG9sb2d5IGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHVuZGVyCitBZGRpdGlvbmFsbHksIENQVSB0b3BvbG9neSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCB1bmRlcgogL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUgYW5kIGluY2x1ZGVzIHRoZXNlIGZpbGVzLiAgVGhlIGludGVybmFsCiBzb3VyY2UgZm9yIHRoZSBvdXRwdXQgaXMgaW4gYnJhY2tldHMgKCJbXSIpLgogCi0gICAga2VybmVsX21heDogdGhlIG1heGltdW0gY3B1IGluZGV4IGFsbG93ZWQgYnkgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLgorICAgIGtlcm5lbF9tYXg6IHRoZSBtYXhpbXVtIENQVSBpbmRleCBhbGxvd2VkIGJ5IHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4KIAkJW05SX0NQVVMtMV0KIAotICAgIG9mZmxpbmU6CWNwdXMgdGhhdCBhcmUgbm90IG9ubGluZSBiZWNhdXNlIHRoZXkgaGF2ZSBiZWVuCisgICAgb2ZmbGluZToJQ1BVcyB0aGF0IGFyZSBub3Qgb25saW5lIGJlY2F1c2UgdGhleSBoYXZlIGJlZW4KIAkJSE9UUExVR0dFRCBvZmYgKHNlZSBjcHUtaG90cGx1Zy50eHQpIG9yIGV4Y2VlZCB0aGUgbGltaXQKLQkJb2YgY3B1cyBhbGxvd2VkIGJ5IHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiAoa2VybmVsX21heAorCQlvZiBDUFVzIGFsbG93ZWQgYnkgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIChrZXJuZWxfbWF4CiAJCWFib3ZlKS4gW35jcHVfb25saW5lX21hc2sgKyBjcHVzID49IE5SX0NQVVNdCiAKLSAgICBvbmxpbmU6CWNwdXMgdGhhdCBhcmUgb25saW5lIGFuZCBiZWluZyBzY2hlZHVsZWQgW2NwdV9vbmxpbmVfbWFza10KKyAgICBvbmxpbmU6CUNQVXMgdGhhdCBhcmUgb25saW5lIGFuZCBiZWluZyBzY2hlZHVsZWQgW2NwdV9vbmxpbmVfbWFza10KIAotICAgIHBvc3NpYmxlOgljcHVzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCByZXNvdXJjZXMgYW5kIGNhbiBiZQorICAgIHBvc3NpYmxlOglDUFVzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCByZXNvdXJjZXMgYW5kIGNhbiBiZQogCQlicm91Z2h0IG9ubGluZSBpZiB0aGV5IGFyZSBwcmVzZW50LiBbY3B1X3Bvc3NpYmxlX21hc2tdCiAKLSAgICBwcmVzZW50OgljcHVzIHRoYXQgaGF2ZSBiZWVuIGlkZW50aWZpZWQgYXMgYmVpbmcgcHJlc2VudCBpbiB0aGUKKyAgICBwcmVzZW50OglDUFVzIHRoYXQgaGF2ZSBiZWVuIGlkZW50aWZpZWQgYXMgYmVpbmcgcHJlc2VudCBpbiB0aGUKIAkJc3lzdGVtLiBbY3B1X3ByZXNlbnRfbWFza10KIAogVGhlIGZvcm1hdCBmb3IgdGhlIGFib3ZlIG91dHB1dCBpcyBjb21wYXRpYmxlIHdpdGggY3B1bGlzdF9wYXJzZSgpCiBbc2VlIDxsaW51eC9jcHVtYXNrLmg+XS4gIFNvbWUgZXhhbXBsZXMgZm9sbG93LgogCi1JbiB0aGlzIGV4YW1wbGUsIHRoZXJlIGFyZSA2NCBjcHVzIGluIHRoZSBzeXN0ZW0gYnV0IGNwdXMgMzItNjMgZXhjZWVkCitJbiB0aGlzIGV4YW1wbGUsIHRoZXJlIGFyZSA2NCBDUFVzIGluIHRoZSBzeXN0ZW0gYnV0IGNwdXMgMzItNjMgZXhjZWVkCiB0aGUga2VybmVsIG1heCB3aGljaCBpcyBsaW1pdGVkIHRvIDAuLjMxIGJ5IHRoZSBOUl9DUFVTIGNvbmZpZyBvcHRpb24KLWJlaW5nIDMyLiAgTm90ZSBhbHNvIHRoYXQgY3B1cyAyIGFuZCA0LTMxIGFyZSBub3Qgb25saW5lIGJ1dCBjb3VsZCBiZQorYmVpbmcgMzIuICBOb3RlIGFsc28gdGhhdCBDUFVzIDIgYW5kIDQtMzEgYXJlIG5vdCBvbmxpbmUgYnV0IGNvdWxkIGJlCiBicm91Z2h0IG9ubGluZSBhcyB0aGV5IGFyZSBib3RoIHByZXNlbnQgYW5kIHBvc3NpYmxlLgogCiAgICAgIGtlcm5lbF9tYXg6IDMxCkBAIC02Nyw4ICs4MCw4IEBACiAgICAgICAgIHByZXNlbnQ6IDAtMzEKIAogSW4gdGhpcyBleGFtcGxlLCB0aGUgTlJfQ1BVUyBjb25maWcgb3B0aW9uIGlzIDEyOCwgYnV0IHRoZSBrZXJuZWwgd2FzCi1zdGFydGVkIHdpdGggcG9zc2libGVfY3B1cz0xNDQuICBUaGVyZSBhcmUgNCBjcHVzIGluIHRoZSBzeXN0ZW0gYW5kIGNwdTIKLXdhcyBtYW51YWxseSB0YWtlbiBvZmZsaW5lIChhbmQgaXMgdGhlIG9ubHkgY3B1IHRoYXQgY2FuIGJlIGJyb3VnaHQKK3N0YXJ0ZWQgd2l0aCBwb3NzaWJsZV9jcHVzPTE0NC4gIFRoZXJlIGFyZSA0IENQVXMgaW4gdGhlIHN5c3RlbSBhbmQgY3B1Mgord2FzIG1hbnVhbGx5IHRha2VuIG9mZmxpbmUgKGFuZCBpcyB0aGUgb25seSBDUFUgdGhhdCBjYW4gYmUgYnJvdWdodAogb25saW5lLikKIAogICAgICBrZXJuZWxfbWF4OiAxMjcKQEAgLTc4LDQgKzkxLDQgQEAKICAgICAgICAgcHJlc2VudDogMC0zCiAKIFNlZSBjcHUtaG90cGx1Zy50eHQgZm9yIHRoZSBwb3NzaWJsZV9jcHVzPU5VTSBrZXJuZWwgc3RhcnQgcGFyYW1ldGVyCi1hcyB3ZWxsIGFzIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHZhcmlvdXMgY3B1bWFzaydzLgorYXMgd2VsbCBhcyBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSB2YXJpb3VzIGNwdW1hc2tzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXN5bmMtdHgtYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vY3J5cHRvL2FzeW5jLXR4LWFwaS50eHQKaW5kZXggOWY1OWZjYi4uYmEwNDZiOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXN5bmMtdHgtYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NyeXB0by9hc3luYy10eC1hcGkudHh0CkBAIC01NCwyMCArNTQsMjMgQEAKIAogMy4xIEdlbmVyYWwgZm9ybWF0IG9mIHRoZSBBUEk6CiBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgotYXN5bmNfPG9wZXJhdGlvbj4oPG9wIHNwZWNpZmljIHBhcmFtZXRlcnM+LAotCQkgIGVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3MsCi0gICAgICAgIAkgIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwZW5kZW5jeSwKLSAgICAgICAgCSAgZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrX3JvdXRpbmUsCi0JCSAgdm9pZCAqY2FsbGJhY2tfcGFyYW1ldGVyKTsKK2FzeW5jXzxvcGVyYXRpb24+KDxvcCBzcGVjaWZpYyBwYXJhbWV0ZXJzPiwgc3RydWN0IGFzeW5jX3N1Ym1pdCBjdGwgKnN1Ym1pdCkKIAogMy4yIFN1cHBvcnRlZCBvcGVyYXRpb25zOgotbWVtY3B5ICAgICAgIC0gbWVtb3J5IGNvcHkgYmV0d2VlbiBhIHNvdXJjZSBhbmQgYSBkZXN0aW5hdGlvbiBidWZmZXIKLW1lbXNldCAgICAgICAtIGZpbGwgYSBkZXN0aW5hdGlvbiBidWZmZXIgd2l0aCBhIGJ5dGUgdmFsdWUKLXhvciAgICAgICAgICAtIHhvciBhIHNlcmllcyBvZiBzb3VyY2UgYnVmZmVycyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBhCi0JICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlcgoteG9yX3plcm9fc3VtIC0geG9yIGEgc2VyaWVzIG9mIHNvdXJjZSBidWZmZXJzIGFuZCBzZXQgYSBmbGFnIGlmIHRoZQotCSAgICAgICByZXN1bHQgaXMgemVyby4gIFRoZSBpbXBsZW1lbnRhdGlvbiBhdHRlbXB0cyB0byBwcmV2ZW50Ci0JICAgICAgIHdyaXRlcyB0byBtZW1vcnkKK21lbWNweSAgLSBtZW1vcnkgY29weSBiZXR3ZWVuIGEgc291cmNlIGFuZCBhIGRlc3RpbmF0aW9uIGJ1ZmZlcgorbWVtc2V0ICAtIGZpbGwgYSBkZXN0aW5hdGlvbiBidWZmZXIgd2l0aCBhIGJ5dGUgdmFsdWUKK3hvciAgICAgLSB4b3IgYSBzZXJpZXMgb2Ygc291cmNlIGJ1ZmZlcnMgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gYQorCSAgZGVzdGluYXRpb24gYnVmZmVyCit4b3JfdmFsIC0geG9yIGEgc2VyaWVzIG9mIHNvdXJjZSBidWZmZXJzIGFuZCBzZXQgYSBmbGFnIGlmIHRoZQorCSAgcmVzdWx0IGlzIHplcm8uICBUaGUgaW1wbGVtZW50YXRpb24gYXR0ZW1wdHMgdG8gcHJldmVudAorCSAgd3JpdGVzIHRvIG1lbW9yeQorcHEJLSBnZW5lcmF0ZSB0aGUgcCtxIChyYWlkNiBzeW5kcm9tZSkgZnJvbSBhIHNlcmllcyBvZiBzb3VyY2UgYnVmZmVycworcHFfdmFsICAtIHZhbGlkYXRlIHRoYXQgYSBwIGFuZCBvciBxIGJ1ZmZlciBhcmUgaW4gc3luYyB3aXRoIGEgZ2l2ZW4gc2VyaWVzIG9mCisJICBzb3VyY2VzCitkYXRhcAktIChyYWlkNl9kYXRhcF9yZWNvdikgcmVjb3ZlciBhIHJhaWQ2IGRhdGEgYmxvY2sgYW5kIHRoZSBwIGJsb2NrCisJICBmcm9tIHRoZSBnaXZlbiBzb3VyY2VzCisyZGF0YQktIChyYWlkNl8yZGF0YV9yZWNvdikgcmVjb3ZlciAyIHJhaWQ2IGRhdGEgYmxvY2tzIGZyb20gdGhlIGdpdmVuCisJICBzb3VyY2VzCiAKIDMuMyBEZXNjcmlwdG9yIG1hbmFnZW1lbnQ6CiBUaGUgcmV0dXJuIHZhbHVlIGlzIG5vbi1OVUxMIGFuZCBwb2ludHMgdG8gYSAnZGVzY3JpcHRvcicgd2hlbiB0aGUgb3BlcmF0aW9uCkBAIC04MCw4ICs4Myw4IEBACiByZWN5Y2xlIChvciBmcmVlKSB0aGUgZGVzY3JpcHRvci4gIEEgZGVzY3JpcHRvciBjYW4gYmUgYWNrZWQgYnkgb25lIG9mIHRoZQogZm9sbG93aW5nIG1ldGhvZHM6CiAxLyBzZXR0aW5nIHRoZSBBU1lOQ19UWF9BQ0sgZmxhZyBpZiBubyBjaGlsZCBvcGVyYXRpb25zIGFyZSB0byBiZSBzdWJtaXR0ZWQKLTIvIHNldHRpbmcgdGhlIEFTWU5DX1RYX0RFUF9BQ0sgZmxhZyB0byBhY2tub3dsZWRnZSB0aGUgcGFyZW50Ci0gICBkZXNjcmlwdG9yIG9mIGEgbmV3IG9wZXJhdGlvbi4KKzIvIHN1Ym1pdHRpbmcgYW4gdW5hY2tub3dsZWRnZWQgZGVzY3JpcHRvciBhcyBhIGRlcGVuZGVuY3kgdG8gYW5vdGhlcgorICAgYXN5bmNfdHggY2FsbCB3aWxsIGltcGxpY2l0bHkgc2V0IHRoZSBhY2tub3dsZWRnZWQgc3RhdGUuCiAzLyBjYWxsaW5nIGFzeW5jX3R4X2FjaygpIG9uIHRoZSBkZXNjcmlwdG9yLgogCiAzLjQgV2hlbiBkb2VzIHRoZSBvcGVyYXRpb24gZXhlY3V0ZT8KQEAgLTExOSwzMCArMTIyLDQyIEBACiBQZXJmb3JtIGEgeG9yLT5jb3B5LT54b3Igb3BlcmF0aW9uIHdoZXJlIGVhY2ggb3BlcmF0aW9uIGRlcGVuZHMgb24gdGhlCiByZXN1bHQgZnJvbSB0aGUgcHJldmlvdXMgb3BlcmF0aW9uOgogCi12b2lkIGNvbXBsZXRlX3hvcl9jb3B5X3hvcih2b2lkICpwYXJhbSkKK3ZvaWQgY2FsbGJhY2sodm9pZCAqcGFyYW0pCiB7Ci0JcHJpbnRrKCJjb21wbGV0ZVxuIik7CisJc3RydWN0IGNvbXBsZXRpb24gKmNtcCA9IHBhcmFtOworCisJY29tcGxldGUoY21wKTsKIH0KIAotaW50IHJ1bl94b3JfY29weV94b3Ioc3RydWN0IHBhZ2UgKip4b3Jfc3JjcywKLQkJICAgICBpbnQgeG9yX3NyY19jbnQsCi0JCSAgICAgc3RydWN0IHBhZ2UgKnhvcl9kZXN0LAotCQkgICAgIHNpemVfdCB4b3JfbGVuLAotCQkgICAgIHN0cnVjdCBwYWdlICpjb3B5X3NyYywKLQkJICAgICBzdHJ1Y3QgcGFnZSAqY29weV9kZXN0LAotCQkgICAgIHNpemVfdCBjb3B5X2xlbikKK3ZvaWQgcnVuX3hvcl9jb3B5X3hvcihzdHJ1Y3QgcGFnZSAqKnhvcl9zcmNzLAorCQkgICAgICBpbnQgeG9yX3NyY19jbnQsCisJCSAgICAgIHN0cnVjdCBwYWdlICp4b3JfZGVzdCwKKwkJICAgICAgc2l6ZV90IHhvcl9sZW4sCisJCSAgICAgIHN0cnVjdCBwYWdlICpjb3B5X3NyYywKKwkJICAgICAgc3RydWN0IHBhZ2UgKmNvcHlfZGVzdCwKKwkJICAgICAgc2l6ZV90IGNvcHlfbGVuKQogewogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisJYWRkcl9jb252X3QgYWRkcl9jb252W3hvcl9zcmNfY250XTsKKwlzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCBzdWJtaXQ7CisJYWRkcl9jb252X3QgYWRkcl9jb252W05ESVNLU107CisJc3RydWN0IGNvbXBsZXRpb24gY21wOwogCi0JdHggPSBhc3luY194b3IoeG9yX2Rlc3QsIHhvcl9zcmNzLCAwLCB4b3Jfc3JjX2NudCwgeG9yX2xlbiwKLQkJICAgICAgIEFTWU5DX1RYX1hPUl9EUk9QX0RTVCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JdHggPSBhc3luY19tZW1jcHkoY29weV9kZXN0LCBjb3B5X3NyYywgMCwgMCwgY29weV9sZW4sCi0JCQkgIEFTWU5DX1RYX0RFUF9BQ0ssIHR4LCBOVUxMLCBOVUxMKTsKLQl0eCA9IGFzeW5jX3hvcih4b3JfZGVzdCwgeG9yX3NyY3MsIDAsIHhvcl9zcmNfY250LCB4b3JfbGVuLAotCQkgICAgICAgQVNZTkNfVFhfWE9SX0RST1BfRFNUIHwgQVNZTkNfVFhfREVQX0FDSyB8IEFTWU5DX1RYX0FDSywKLQkJICAgICAgIHR4LCBjb21wbGV0ZV94b3JfY29weV94b3IsIE5VTEwpOworCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIEFTWU5DX1RYX1hPUl9EUk9QX0RTVCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCSAgYWRkcl9jb252KTsKKwl0eCA9IGFzeW5jX3hvcih4b3JfZGVzdCwgeG9yX3NyY3MsIDAsIHhvcl9zcmNfY250LCB4b3JfbGVuLCAmc3VibWl0KQorCisJc3VibWl0LT5kZXBlbmRfdHggPSB0eDsKKwl0eCA9IGFzeW5jX21lbWNweShjb3B5X2Rlc3QsIGNvcHlfc3JjLCAwLCAwLCBjb3B5X2xlbiwgJnN1Ym1pdCk7CisKKwlpbml0X2NvbXBsZXRpb24oJmNtcCk7CisJaW5pdF9hc3luY19zdWJtaXQoJnN1Ym1pdCwgQVNZTkNfVFhfWE9SX0RST1BfRFNUIHwgQVNZTkNfVFhfQUNLLCB0eCwKKwkJCSAgY2FsbGJhY2ssICZjbXAsIGFkZHJfY29udik7CisJdHggPSBhc3luY194b3IoeG9yX2Rlc3QsIHhvcl9zcmNzLCAwLCB4b3Jfc3JjX2NudCwgeG9yX2xlbiwgJnN1Ym1pdCk7CiAKIAlhc3luY190eF9pc3N1ZV9wZW5kaW5nX2FsbCgpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmY21wKTsKIH0KIAogU2VlIGluY2x1ZGUvbGludXgvYXN5bmNfdHguaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmxhZ3MuICBTZWUgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RlYnVnZ2luZy12aWEtb2hjaTEzOTQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmctdmlhLW9oY2kxMzk0LnR4dAppbmRleCA1OWE5MWU1Li42MTFmNWE1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RlYnVnZ2luZy12aWEtb2hjaTEzOTQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGVidWdnaW5nLXZpYS1vaGNpMTM5NC50eHQKQEAgLTY0LDE0ICs2NCwxNCBAQAogCiBCZXJuaGFyZCBLYWluZGwgZW5oYW5jZWQgZmlyZXNjb3BlIHRvIHN1cHBvcnQgYWNjZXNzaW5nIDY0LWJpdCBtYWNoaW5lcwogZnJvbSAzMi1iaXQgZmlyZXNjb3BlIGFuZCB2aWNlIHZlcnNhOgotLSBmdHA6Ly9mdHAuc3VzZS5kZS9wcml2YXRlL2JrL2ZpcmV3aXJlL3Rvb2xzL2ZpcmVzY29wZS0wLjIuMi50YXIuYnoyCistIGh0dHA6Ly9oYWxvYmF0ZXMuZGUvZmlyZXdpcmUvZmlyZXNjb3BlLTAuMi4yLnRhci5iejIKIAogYW5kIGhlIGltcGxlbWVudGVkIGZhc3Qgc3lzdGVtIGR1bXAgKGFscGhhIHZlcnNpb24gLSByZWFkIFJFQURNRS50eHQpOgotLSBmdHA6Ly9mdHAuc3VzZS5kZS9wcml2YXRlL2JrL2ZpcmV3aXJlL3Rvb2xzL2ZpcmVkdW1wLTAuMS50YXIuYnoyCistIGh0dHA6Ly9oYWxvYmF0ZXMuZGUvZmlyZXdpcmUvZmlyZWR1bXAtMC4xLnRhci5iejIKIAogVGhlcmUgaXMgYWxzbyBhIGdkYiBwcm94eSBmb3IgZmlyZXdpcmUgd2hpY2ggYWxsb3dzIHRvIHVzZSBnZGIgdG8gYWNjZXNzCiBkYXRhIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGZyb20gc3ltYm9scyBmb3VuZCBieSBnZGIgaW4gdm1saW51eDoKLS0gZnRwOi8vZnRwLnN1c2UuZGUvcHJpdmF0ZS9iay9maXJld2lyZS90b29scy9maXJlcHJveHktMC4zMy50YXIuYnoyCistIGh0dHA6Ly9oYWxvYmF0ZXMuZGUvZmlyZXdpcmUvZmlyZXByb3h5LTAuMzMudGFyLmJ6MgogCiBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBnZGIgcHJveHkgKGZpcmVwcm94eS0wLjM0KSBjYW4gY29tbXVuaWNhdGUgKG5vdAogeWV0IHN0YWJsZSkgd2l0aCBrZ2RiIG92ZXIgYW4gbWVtb3J5LWJhc2VkIGNvbW11bmljYXRpb24gbW9kdWxlIChrZ2Rib20pLgpAQCAtMTc4LDcgKzE3OCw3IEBACiAKIE5vdGVzCiAtLS0tLQotRG9jdW1lbnRhdGlvbiBhbmQgc3BlY2lmaWNhdGlvbnM6IGZ0cDovL2Z0cC5zdXNlLmRlL3ByaXZhdGUvYmsvZmlyZXdpcmUvZG9jcworRG9jdW1lbnRhdGlvbiBhbmQgc3BlY2lmaWNhdGlvbnM6IGh0dHA6Ly9oYWxvYmF0ZXMuZGUvZmlyZXdpcmUvCiAKIEZpcmVXaXJlIGlzIGEgdHJhZGVtYXJrIG9mIEFwcGxlIEluYy4gLSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG86CiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZpcmVXaXJlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggZmE3NTIyMC4uYmM2OTNmZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMzU0LDE0ICszNTQsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJZnNjaGVyIGFuZCBmc2Nwb3MgZHJpdmVycwotV2hlbjoJSnVuZSAyMDA5Ci1XaHk6CURlcHJlY2F0ZWQgYnkgdGhlIG5ldyBmc2NobWQgZHJpdmVyLgotV2hvOglIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgotCUplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJc3lzZnMgdWkgZm9yIGNoYW5naW5nIHA0LWNsb2NrbW9kIHBhcmFtZXRlcnMKIFdoZW46CVNlcHRlbWJlciAyMDA5CiBXaHk6CVNlZSBjb21taXRzIDEyOWY4YWU5YjFiNWJlOTQ1MTdkYTc2MDA5ZWE5NTZlODkxMDRjZTggYW5kCkBAIC00MjYsNiArNDE4LDE0IEBACiBXaHk6CVNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB1c2Vyc3BhY2UsIHBvbGljeSBkYWVtb24uCiBXaG86CUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CiAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglDT05GSUdfSU5PVElGWQorV2hlbjoJMi42LjMzCitXaHk6CWxhc3QgdXNlciAoYXVkaXQpIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBuZXdlciBtb3JlIGdlbmVyaWMKKwlhbmQgbW9yZSBlYXNpbHkgbWFpbnRhaW5lZCBmc25vdGlmeSBzdWJzeXN0ZW0KK1dobzoJRXJpYyBQYXJpcyA8ZXBhcmlzQHJlZGhhdC5jb20+CisKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogV2hhdDoJbG9ja19wb2xpY3lfcndzZW1fKiBhbmQgdW5sb2NrX3BvbGljeV9yd3NlbV8qIHdpbGwgbm90IGJlCkBAIC00NTksMyArNDU5LDMzIEBACiAJd2lsbCBhbHNvIGFsbG93IG1ha2luZyBBTFNBIE9TUyBlbXVsYXRpb24gaW5kZXBlbmRlbnQgb2YKIAlzb3VuZF9jb3JlLiAgVGhlIGRlcGVuZGVuY3kgd2lsbCBiZSBicm9rZW4gdGhlbiB0b28uCiBXaG86CVRlanVuIEhlbyA8dGpAa2VybmVsLm9yZz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglTdXBwb3J0IGZvciBWTXdhcmUncyBndWVzdCBwYXJhdmlydHVsaWF6YXRpb24gdGVjaG5pcXVlIFtWTUldIHdpbGwgYmUKKwlkcm9wcGVkLgorV2hlbjoJMi42LjM3IG9yIGVhcmxpZXIuCitXaHk6CVdpdGggdGhlIHJlY2VudCBpbm5vdmF0aW9ucyBpbiBDUFUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIHRlY2hub2xvZ2llcworCWZyb20gSW50ZWwgYW5kIEFNRCwgVk13YXJlIHJhbiBhIGZldyBleHBlcmltZW50cyB0byBjb21wYXJlIHRoZXNlCisJdGVjaG5pcXVlcyB0byBndWVzdCBwYXJhdmlydHVhbGl6YXRpb24gdGVjaG5pcXVlIG9uIFZNd2FyZSdzIHBsYXRmb3JtLgorCVRoZXNlIGhhcmR3YXJlIGFzc2lzdGVkIHZpcnR1YWxpemF0aW9uIHRlY2huaXF1ZXMgaGF2ZSBvdXRwZXJmb3JtZWQgdGhlCisJcGVyZm9ybWFuY2UgYmVuZWZpdHMgcHJvdmlkZWQgYnkgVk1JIGluIG1vc3Qgb2YgdGhlIHdvcmtsb2Fkcy4gVk13YXJlCisJZXhwZWN0cyB0aGF0IHRoZXNlIGhhcmR3YXJlIGZlYXR1cmVzIHdpbGwgYmUgdWJpcXVpdG91cyBpbiBhIGNvdXBsZSBvZgorCXllYXJzLCBhcyBhIHJlc3VsdCwgVk13YXJlIGhhcyBzdGFydGVkIGEgcGhhc2VkIHJldGlyZW1lbnQgb2YgdGhpcworCWZlYXR1cmUgZnJvbSB0aGUgaHlwZXJ2aXNvci4gV2Ugd2lsbCBiZSByZW1vdmluZyB0aGlzIGZlYXR1cmUgZnJvbSB0aGUKKwlLZXJuZWwgdG9vLiBSaWdodCBub3cgd2UgYXJlIHRhcmdldGluZyAyLjYuMzcgYnV0IGNhbiByZXRpcmUgZWFybGllciBpZgorCXRlY2huaWNhbCByZWFzb25zIChyZWFkIG9wcG9ydHVuaXR5IHRvIHJlbW92ZSBtYWpvciBjaHVuayBvZiBwdm9wcykKKwlhcmlzZS4KKworCVBsZWFzZSBub3RlIHRoYXQgVk1JIGhhcyBhbHdheXMgYmVlbiBhbiBvcHRpbWl6YXRpb24gYW5kIG5vbi1WTUkga2VybmVscworCXN0aWxsIHdvcmsgZmluZSBvbiBWTXdhcmUncyBwbGF0Zm9ybS4KKwlMYXRlc3QgdmVyc2lvbnMgb2YgVk13YXJlJ3MgcHJvZHVjdCB3aGljaCBzdXBwb3J0IFZNSSBhcmUsCisJV29ya3N0YXRpb24gNy4wIGFuZCBWU3BoZXJlIDQuMCBvbiBFU1ggc2lkZSwgZnV0dXJlIG1haW50YWluZW5jZQorCXJlbGVhc2VzIGZvciB0aGVzZSBwcm9kdWN0cyB3aWxsIGNvbnRpbnVlIHN1cHBvcnRpbmcgVk1JLgorCisJRm9yIG1vcmUgZGV0YWlscyBhYm91dCBWTUkgcmV0aXJlbWVudCB0YWtlIGEgbG9vayBhdCB0aGlzLAorCWh0dHA6Ly9ibG9ncy52bXdhcmUuY29tL2d1ZXN0b3NndWlkZS8yMDA5LzA5L3ZtaS1yZXRpcmVtZW50Lmh0bWwKKworV2hvOglBbG9rIE4gS2F0YXJpYSA8YWthdGFyaWFAdm13YXJlLmNvbT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy85cC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzlwLnR4dAppbmRleCA2MjA4ZjU1Li41N2UwYjgwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzlwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzlwLnR4dApAQCAtMTgsMTEgKzE4LDExIEBACiAKIE90aGVyIGFwcGxpY2F0aW9ucyBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgcGFwZXJzOgogCSogWENQVSAmIENsdXN0ZXJpbmcKLQkJaHR0cDovL3d3dy54Y3B1Lm9yZy94Y3B1LXRhbGsucGRmCisJCWh0dHA6Ly94Y3B1Lm9yZy9wYXBlcnMveGNwdS10YWxrLnBkZgogCSogS1ZNRlM6IGNvbnRyb2wgZmlsZSBzeXN0ZW0gZm9yIEtWTQotCQlodHRwOi8vd3d3LnhjcHUub3JnL2t2bWZzLnBkZgotCSogQ2VsbEZTOiBBIE5ldyBQcm9ncmFtbWluZ01vZGVsIGZvciB0aGUgQ2VsbCBCRQotCQlodHRwOi8vd3d3LnhjcHUub3JnL2NlbGxmcy10YWxrLnBkZgorCQlodHRwOi8veGNwdS5vcmcvcGFwZXJzL2t2bWZzLnBkZgorCSogQ2VsbEZTOiBBIE5ldyBQcm9ncmFtbWluZyBNb2RlbCBmb3IgdGhlIENlbGwgQkUKKwkJaHR0cDovL3hjcHUub3JnL3BhcGVycy9jZWxsZnMtdGFsay5wZGYKIAkqIFBST1NFIEkvTzogVXNpbmcgOXAgdG8gZW5hYmxlIEFwcGxpY2F0aW9uIFBhcnRpdGlvbnMKIAkJaHR0cDovL3BsYW45LmVzY2V0LnVyamMuZXMvaXdwOS9jcmVhZHkvUFJPU0VfaXdwOV8yMDA2LnBkZgogCkBAIC00OCw2ICs0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgcmZkbm8gYW5kIHdmZG5vKQogCQkJdmlydGlvCS0gY29ubmVjdCB0byB0aGUgbmV4dCB2aXJ0aW8gY2hhbm5lbCBhdmFpbGFibGUKIAkJCQkoZnJvbSBsZ3Vlc3Qgb3IgS1ZNIHdpdGggdHJhbnNfdmlydGlvIG1vZHVsZSkKKwkJCXJkbWEJLSBjb25uZWN0IHRvIGEgc3BlY2lmaWVkIFJETUEgY2hhbm5lbAogCiAgIHVuYW1lPW5hbWUJdXNlciBuYW1lIHRvIGF0dGVtcHQgbW91bnQgYXMgb24gdGhlIHJlbW90ZSBzZXJ2ZXIuICBUaGUKICAgCQlzZXJ2ZXIgbWF5IG92ZXJyaWRlIG9yIGlnbm9yZSB0aGlzIHZhbHVlLiAgQ2VydGFpbiB1c2VyCkBAIC01OSwxNiArNjAsMjIgQEAKICAgY2FjaGU9bW9kZQlzcGVjaWZpZXMgYSBjYWNoaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQsIG5vIGNhY2hlcyBhcmUgdXNlZC4KIAkJCWxvb3NlID0gbm8gYXR0ZW1wdHMgYXJlIG1hZGUgYXQgY29uc2lzdGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciBleGNsdXNpdmUsIHJlYWQtb25seSBtb3VudHMKKwkJCWZzY2FjaGUgPSB1c2UgRlMtQ2FjaGUgZm9yIGEgcGVyc2lzdGVudCwgcmVhZC1vbmx5CisJCQkJY2FjaGUgYmFja2VuZC4KIAogICBkZWJ1Zz1uCXNwZWNpZmllcyBkZWJ1ZyBsZXZlbC4gIFRoZSBkZWJ1ZyBsZXZlbCBpcyBhIGJpdG1hc2suCi0gIAkJCTB4MDEgPSBkaXNwbGF5IHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMKLQkJCTB4MDIgPSBkZXZlbG9wZXIgZGVidWcgKERFQlVHX0NVUlJFTlQpCi0JCQkweDA0ID0gZGlzcGxheSA5cCB0cmFjZQotCQkJMHgwOCA9IGRpc3BsYXkgVkZTIHRyYWNlCi0JCQkweDEwID0gZGlzcGxheSBNYXJzaGFsbGluZyBkZWJ1ZwotCQkJMHgyMCA9IGRpc3BsYXkgUlBDIGRlYnVnCi0JCQkweDQwID0gZGlzcGxheSB0cmFuc3BvcnQgZGVidWcKLQkJCTB4ODAgPSBkaXNwbGF5IGFsbG9jYXRpb24gZGVidWcKKwkJCTB4MDEgID0gZGlzcGxheSB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzCisJCQkweDAyICA9IGRldmVsb3BlciBkZWJ1ZyAoREVCVUdfQ1VSUkVOVCkKKwkJCTB4MDQgID0gZGlzcGxheSA5cCB0cmFjZQorCQkJMHgwOCAgPSBkaXNwbGF5IFZGUyB0cmFjZQorCQkJMHgxMCAgPSBkaXNwbGF5IE1hcnNoYWxsaW5nIGRlYnVnCisJCQkweDIwICA9IGRpc3BsYXkgUlBDIGRlYnVnCisJCQkweDQwICA9IGRpc3BsYXkgdHJhbnNwb3J0IGRlYnVnCisJCQkweDgwICA9IGRpc3BsYXkgYWxsb2NhdGlvbiBkZWJ1ZworCQkJMHgxMDAgPSBkaXNwbGF5IHByb3RvY29sIG1lc3NhZ2UgZGVidWcKKwkJCTB4MjAwID0gZGlzcGxheSBGaWQgZGVidWcKKwkJCTB4NDAwID0gZGlzcGxheSBwYWNrZXQgZGVidWcKKwkJCTB4ODAwID0gZGlzcGxheSBmc2NhY2hlIHRyYWNpbmcgZGVidWcKIAogICByZmRubz1uCXRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHJlYWRpbmcgd2l0aCB0cmFucz1mZAogCkBAIC0xMDAsNiArMTA3LDEwIEBACiAJCQlhbnkgICA9IHY5ZnMgZG9lcyBzaW5nbGUgYXR0YWNoIGFuZCBwZXJmb3JtcyBhbGwKIAkJCQlvcGVyYXRpb25zIGFzIG9uZSB1c2VyCiAKKyAgY2FjaGV0YWcJY2FjaGUgdGFnIHRvIHVzZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgY2FjaGUuCisJCWNhY2hlIHRhZ3MgZm9yIGV4aXN0aW5nIGNhY2hlIHNlc3Npb25zIGNhbiBiZSBsaXN0ZWQgYXQKKwkJL3N5cy9mcy85cC9jYWNoZXMuIChhcHBsaWVzIG9ubHkgdG8gY2FjaGU9ZnNjYWNoZSkKKwogUkVTT1VSQ0VTCiA9PT09PT09PT0KIApAQCAtMTE4LDcgKzEyOSw3IEBACiBBIExpbnV4IHZlcnNpb24gb2YgdGhlIDlwIHNlcnZlciBpcyBub3cgbWFpbnRhaW5lZCB1bmRlciB0aGUgbnBmcyBwcm9qZWN0CiBvbiBzb3VyY2Vmb3JnZSAoaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ucGZzKS4gIFRoZSBjdXJyZW50bHkKIG1haW50YWluZWQgdmVyc2lvbiBpcyB0aGUgc2luZ2xlLXRocmVhZGVkIHZlcnNpb24gb2YgdGhlIHNlcnZlciAobmFtZWQgc3BmcykKLWF2YWlsYWJsZSBmcm9tIHRoZSBzYW1lIENWUyByZXBvc2l0b3J5LgorYXZhaWxhYmxlIGZyb20gdGhlIHNhbWUgU1ZOIHJlcG9zaXRvcnkuCiAKIFRoZXJlIGFyZSB1c2VyIGFuZCBkZXZlbG9wZXIgbWFpbGluZyBsaXN0cyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgdjlmcyBwcm9qZWN0CiBvbiBzb3VyY2Vmb3JnZSAoaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy92OWZzKS4KQEAgLTEyNiw3ICsxMzcsOCBAQAogQSBzdGFuZC1hbG9uZSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgKHdoaWNoIHNob3VsZCBidWlsZCBmb3IgYW55IDIuNiBrZXJuZWwpCiBpcyBhdmFpbGFibGUgdmlhIChodHRwOi8vZ2l0aHViLmNvbS9lcmljdmgvOXAtc2FjL3RyZWUvbWFzdGVyKQogCi1OZXdzIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIG9uIFNXaUsgKGh0dHA6Ly9zd2lrLm5ldC92OWZzKS4KK05ld3MgYW5kIG90aGVyIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgb24gU1dpSyAoaHR0cDovL3N3aWsubmV0L3Y5ZnMpCithbmQgdGhlIFdpa2kgKGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvdjlmcy9pbmRleC5waHApLgogCiBCdWcgcmVwb3J0cyBtYXkgYmUgaXNzdWVkIHRocm91Z2ggdGhlIGtlcm5lbC5vcmcgYnVnemlsbGEgCiAoaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dAppbmRleCA1NzBmOWJkLi4wNWQ1Y2YxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKQEAgLTEyMywxMCArMTIzLDE4IEBACiAKIHNiPW4JCQlVc2UgYWx0ZXJuYXRlIHN1cGVyYmxvY2sgYXQgdGhpcyBsb2NhdGlvbi4KIAotcXVvdGEKLW5vcXVvdGEKLWdycHF1b3RhCi11c3JxdW90YQorcXVvdGEJCQlUaGVzZSBvcHRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBmaWxlc3lzdGVtLiBUaGV5Citub3F1b3RhCQkJYXJlIHVzZWQgb25seSBieSBxdW90YSB0b29scyB0byByZWNvZ25pemUgdm9sdW1lcworZ3JwcXVvdGEJCXdoZXJlIHF1b3RhIHNob3VsZCBiZSB0dXJuZWQgb24uIFNlZSBkb2N1bWVudGF0aW9uCit1c3JxdW90YQkJaW4gdGhlIHF1b3RhLXRvb2xzIHBhY2thZ2UgZm9yIG1vcmUgZGV0YWlscworCQkJKGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXhxdW90YSkuCisKK2pxZm10PTxxdW90YSB0eXBlPglUaGVzZSBvcHRpb25zIHRlbGwgZmlsZXN5c3RlbSBkZXRhaWxzIGFib3V0IHF1b3RhCit1c3JqcXVvdGE9PGZpbGU+CXNvIHRoYXQgcXVvdGEgaW5mb3JtYXRpb24gY2FuIGJlIHByb3Blcmx5IHVwZGF0ZWQKK2dycGpxdW90YT08ZmlsZT4JZHVyaW5nIGpvdXJuYWwgcmVwbGF5LiBUaGV5IHJlcGxhY2UgdGhlIGFib3ZlCisJCQlxdW90YSBvcHRpb25zLiBTZWUgZG9jdW1lbnRhdGlvbiBpbiB0aGUgcXVvdGEtdG9vbHMKKwkJCXBhY2thZ2UgZm9yIG1vcmUgZGV0YWlscworCQkJKGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXhxdW90YSkuCiAKIGJoCQkoKikJZXh0MyBhc3NvY2lhdGVzIGJ1ZmZlciBoZWFkcyB0byBkYXRhIHBhZ2VzIHRvCiBub2JoCQkJKGEpIGNhY2hlIGRpc2sgYmxvY2sgbWFwcGluZyBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQKaW5kZXggMThiNWVjOC4uNmQ5NGUwNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0CkBAIC0xMzQsOSArMTM0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAJbW91bnQgb3B0aW9ucyAicm8sbm9sb2FkIiBjYW4gYmUgdXNlZCB0byBwcmV2ZW50CiAJCSAgICAgCXdyaXRlcyB0byB0aGUgZmlsZXN5c3RlbS4KIAoram91cm5hbF9jaGVja3N1bQlFbmFibGUgY2hlY2tzdW1taW5nIG9mIHRoZSBqb3VybmFsIHRyYW5zYWN0aW9ucy4KKwkJCVRoaXMgd2lsbCBhbGxvdyB0aGUgcmVjb3ZlcnkgY29kZSBpbiBlMmZzY2sgYW5kIHRoZQorCQkJa2VybmVsIHRvIGRldGVjdCBjb3JydXB0aW9uIGluIHRoZSBrZXJuZWwuICBJdCBpcyBhCisJCQljb21wYXRpYmxlIGNoYW5nZSBhbmQgd2lsbCBiZSBpZ25vcmVkIGJ5IG9sZGVyIGtlcm5lbHMuCisKIGpvdXJuYWxfYXN5bmNfY29tbWl0CUNvbW1pdCBibG9jayBjYW4gYmUgd3JpdHRlbiB0byBkaXNrIHdpdGhvdXQgd2FpdGluZwogCQkJZm9yIGRlc2NyaXB0b3IgYmxvY2tzLiBJZiBlbmFibGVkIG9sZGVyIGtlcm5lbHMgY2Fubm90Ci0JCQltb3VudCB0aGUgZGV2aWNlLgorCQkJbW91bnQgdGhlIGRldmljZS4gVGhpcyB3aWxsIGVuYWJsZSAnam91cm5hbF9jaGVja3N1bScKKwkJCWludGVybmFsbHkuCiAKIGpvdXJuYWw9dXBkYXRlCQlVcGRhdGUgdGhlIGV4dDQgZmlsZSBzeXN0ZW0ncyBqb3VybmFsIHRvIHRoZSBjdXJyZW50CiAJCQlmb3JtYXQuCkBAIC0yODIsOSArMjg4LDE2IEBACiAJCQl0byB1c2UgZm9yIGFsbG9jYXRpb24gc2l6ZSBhbmQgYWxpZ25tZW50LiBGb3IgUkFJRDUvNgogCQkJc3lzdGVtcyB0aGlzIHNob3VsZCBiZSB0aGUgbnVtYmVyIG9mIGRhdGEKIAkJCWRpc2tzICogIFJBSUQgY2h1bmsgc2l6ZSBpbiBmaWxlIHN5c3RlbSBibG9ja3MuCi1kZWxhbGxvYwkoKikJRGVmZXJyaW5nIGJsb2NrIGFsbG9jYXRpb24gdW50aWwgd3JpdGUtb3V0IHRpbWUuCi1ub2RlbGFsbG9jCQlEaXNhYmxlIGRlbGF5ZWQgYWxsb2NhdGlvbi4gQmxvY2tzIGFyZSBhbGxvY2F0aW9uCi0JCQl3aGVuIGRhdGEgaXMgY29waWVkIGZyb20gdXNlciB0byBwYWdlIGNhY2hlLgorCitkZWxhbGxvYwkoKikJRGVmZXIgYmxvY2sgYWxsb2NhdGlvbiB1bnRpbCBqdXN0IGJlZm9yZSBleHQ0CisJCQl3cml0ZXMgb3V0IHRoZSBibG9jayhzKSBpbiBxdWVzdGlvbi4gIFRoaXMKKwkJCWFsbG93cyBleHQ0IHRvIGJldHRlciBhbGxvY2F0aW9uIGRlY2lzaW9ucworCQkJbW9yZSBlZmZpY2llbnRseS4KK25vZGVsYWxsb2MJCURpc2FibGUgZGVsYXllZCBhbGxvY2F0aW9uLiAgQmxvY2tzIGFyZSBhbGxvY2F0ZWQKKwkJCXdoZW4gdGhlIGRhdGEgaXMgY29waWVkIGZyb20gdXNlcnNwYWNlIHRvIHRoZQorCQkJcGFnZSBjYWNoZSwgZWl0aGVyIHZpYSB0aGUgd3JpdGUoMikgc3lzdGVtIGNhbGwKKwkJCW9yIHdoZW4gYW4gbW1hcCdlZCBwYWdlIHdoaWNoIHdhcyBwcmV2aW91c2x5CisJCQl1bmFsbG9jYXRlZCBpcyB3cml0dGVuIGZvciB0aGUgZmlyc3QgdGltZS4KIAogbWF4X2JhdGNoX3RpbWU9dXNlYwlNYXhpbXVtIGFtb3VudCBvZiB0aW1lIGV4dDQgc2hvdWxkIHdhaXQgZm9yCiAJCQlhZGRpdGlvbmFsIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyB0byBiZSBiYXRjaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggYjVhZWU3OC4uMmM0OGY5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC0xMTEzLDcgKzExMTMsNiBAQAogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICAgICAgICAgIENvbnRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgbWJfZ3JvdXBzICAgICAgIGRldGFpbHMgb2YgbXVsdGlibG9jayBhbGxvY2F0b3IgYnVkZHkgY2FjaGUgb2YgZnJlZSBibG9ja3MKLSBtYl9oaXN0b3J5ICAgICAgbXVsdGlibG9jayBhbGxvY2F0aW9uIGhpc3RvcnkKIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc2hhcmVkc3VidHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NoYXJlZHN1YnRyZWUudHh0CmluZGV4IDczNjU0MDAuLjIzYTE4MTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc2hhcmVkc3VidHJlZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zaGFyZWRzdWJ0cmVlLnR4dApAQCAtNCw3ICs0LDcgQEAKIENvbnRlbnRzOgogCTEpIE92ZXJ2aWV3CiAJMikgRmVhdHVyZXMKLQkzKSBzbW91bnQgY29tbWFuZAorCTMpIFNldHRpbmcgbW91bnQgc3RhdGVzCiAJNCkgVXNlLWNhc2UKIAk1KSBEZXRhaWxlZCBzZW1hbnRpY3MKIAk2KSBRdWl6CkBAIC00MSwxNCArNDEsMTQgQEAKIAogCUhlcmUgaXMgYW4gZXhhbXBsZToKIAotCUxldHMgc2F5IC9tbnQgaGFzIGEgbW91bnQgdGhhdCBpcyBzaGFyZWQuCisJTGV0J3Mgc2F5IC9tbnQgaGFzIGEgbW91bnQgdGhhdCBpcyBzaGFyZWQuCiAJbW91bnQgLS1tYWtlLXNoYXJlZCAvbW50CiAKLQlub3RlOiBtb3VudCBjb21tYW5kIGRvZXMgbm90IHlldCBzdXBwb3J0IHRoZSAtLW1ha2Utc2hhcmVkIGZsYWcuCi0JSSBoYXZlIGluY2x1ZGVkIGEgc21hbGwgQyBwcm9ncmFtIHdoaWNoIGRvZXMgdGhlIHNhbWUgYnkgZXhlY3V0aW5nCi0JJ3Ntb3VudCAvbW50IHNoYXJlZCcKKwlOb3RlOiBtb3VudCg4KSBjb21tYW5kIG5vdyBzdXBwb3J0cyB0aGUgLS1tYWtlLXNoYXJlZCBmbGFnLAorCXNvIHRoZSBzYW1wbGUgJ3Ntb3VudCcgcHJvZ3JhbSBpcyBubyBsb25nZXIgbmVlZGVkIGFuZCBoYXMgYmVlbgorCXJlbW92ZWQuCiAKLQkjbW91bnQgLS1iaW5kIC9tbnQgL3RtcAorCSMgbW91bnQgLS1iaW5kIC9tbnQgL3RtcAogCVRoZSBhYm92ZSBjb21tYW5kIHJlcGxpY2F0ZXMgdGhlIG1vdW50IGF0IC9tbnQgdG8gdGhlIG1vdW50cG9pbnQgL3RtcAogCWFuZCB0aGUgY29udGVudHMgb2YgYm90aCB0aGUgbW91bnRzIHJlbWFpbiBpZGVudGljYWwuCiAKQEAgLTU4LDggKzU4LDggQEAKIAkjbHMgL3RtcAogCWEgYiBjCiAKLQlOb3cgbGV0cyBzYXkgd2UgbW91bnQgYSBkZXZpY2UgYXQgL3RtcC9hCi0JI21vdW50IC9kZXYvc2QwICAvdG1wL2EKKwlOb3cgbGV0J3Mgc2F5IHdlIG1vdW50IGEgZGV2aWNlIGF0IC90bXAvYQorCSMgbW91bnQgL2Rldi9zZDAgIC90bXAvYQogCiAJI2xzIC90bXAvYQogCXQxIHQyIHQyCkBAIC04MCwyMSArODAsMjAgQEAKIAogCUhlcmUgaXMgYW4gZXhhbXBsZToKIAotCUxldHMgc2F5IC9tbnQgaGFzIGEgbW91bnQgd2hpY2ggaXMgc2hhcmVkLgotCSNtb3VudCAtLW1ha2Utc2hhcmVkIC9tbnQKKwlMZXQncyBzYXkgL21udCBoYXMgYSBtb3VudCB3aGljaCBpcyBzaGFyZWQuCisJIyBtb3VudCAtLW1ha2Utc2hhcmVkIC9tbnQKIAotCUxldHMgYmluZCBtb3VudCAvbW50IHRvIC90bXAKLQkjbW91bnQgLS1iaW5kIC9tbnQgL3RtcAorCUxldCdzIGJpbmQgbW91bnQgL21udCB0byAvdG1wCisJIyBtb3VudCAtLWJpbmQgL21udCAvdG1wCiAKIAl0aGUgbmV3IG1vdW50IGF0IC90bXAgYmVjb21lcyBhIHNoYXJlZCBtb3VudCBhbmQgaXQgaXMgYSByZXBsaWNhIG9mCiAJdGhlIG1vdW50IGF0IC9tbnQuCiAKLQlOb3cgbGV0cyBtYWtlIHRoZSBtb3VudCBhdCAvdG1wOyBhIHNsYXZlIG9mIC9tbnQKLQkjbW91bnQgLS1tYWtlLXNsYXZlIC90bXAKLQlbb3Igc21vdW50IC90bXAgc2xhdmVdCisJTm93IGxldCdzIG1ha2UgdGhlIG1vdW50IGF0IC90bXA7IGEgc2xhdmUgb2YgL21udAorCSMgbW91bnQgLS1tYWtlLXNsYXZlIC90bXAKIAotCWxldHMgbW91bnQgL2Rldi9zZDAgb24gL21udC9hCi0JI21vdW50IC9kZXYvc2QwIC9tbnQvYQorCWxldCdzIG1vdW50IC9kZXYvc2QwIG9uIC9tbnQvYQorCSMgbW91bnQgL2Rldi9zZDAgL21udC9hCiAKIAkjbHMgL21udC9hCiAJdDEgdDIgdDMKQEAgLTEwNCw5ICsxMDMsOSBAQAogCiAJTm90ZSB0aGUgbW91bnQgZXZlbnQgaGFzIHByb3BhZ2F0ZWQgdG8gdGhlIG1vdW50IGF0IC90bXAKIAotCUhvd2V2ZXIgbGV0cyBzZWUgd2hhdCBoYXBwZW5zIGlmIHdlIG1vdW50IHNvbWV0aGluZyBvbiB0aGUgbW91bnQgYXQgL3RtcAorCUhvd2V2ZXIgbGV0J3Mgc2VlIHdoYXQgaGFwcGVucyBpZiB3ZSBtb3VudCBzb21ldGhpbmcgb24gdGhlIG1vdW50IGF0IC90bXAKIAotCSNtb3VudCAvZGV2L3NkMSAvdG1wL2IKKwkjIG1vdW50IC9kZXYvc2QxIC90bXAvYgogCiAJI2xzIC90bXAvYgogCXMxIHMyIHMzCkBAIC0xMjQsMTIgKzEyMywxMSBAQAogCiAyZCkgQSB1bmJpbmRhYmxlIG1vdW50IGlzIGEgdW5iaW5kYWJsZSBwcml2YXRlIG1vdW50CiAKLQlsZXRzIHNheSB3ZSBoYXZlIGEgbW91bnQgYXQgL21udCBhbmQgd2UgbWFrZSBpcyB1bmJpbmRhYmxlCisJbGV0J3Mgc2F5IHdlIGhhdmUgYSBtb3VudCBhdCAvbW50IGFuZCB3ZSBtYWtlIGlzIHVuYmluZGFibGUKIAotCSNtb3VudCAtLW1ha2UtdW5iaW5kYWJsZSAvbW50Ci0JIFsgc21vdW50IC9tbnQgIHVuYmluZGFibGUgXQorCSMgbW91bnQgLS1tYWtlLXVuYmluZGFibGUgL21udAogCi0JIExldHMgdHJ5IHRvIGJpbmQgbW91bnQgdGhpcyBtb3VudCBzb21ld2hlcmUgZWxzZS4KKwkgTGV0J3MgdHJ5IHRvIGJpbmQgbW91bnQgdGhpcyBtb3VudCBzb21ld2hlcmUgZWxzZS4KIAkgIyBtb3VudCAtLWJpbmQgL21udCAvdG1wCiAJIG1vdW50OiB3cm9uZyBmcyB0eXBlLCBiYWQgb3B0aW9uLCBiYWQgc3VwZXJibG9jayBvbiAvbW50LAogCSAgICAgICAgb3IgdG9vIG1hbnkgbW91bnRlZCBmaWxlIHN5c3RlbXMKQEAgLTEzNywxNDkgKzEzNSwxNSBAQAogCUJpbmRpbmcgYSB1bmJpbmRhYmxlIG1vdW50IGlzIGEgaW52YWxpZCBvcGVyYXRpb24uCiAKIAotMykgc21vdW50IGNvbW1hbmQKKzMpIFNldHRpbmcgbW91bnQgc3RhdGVzCiAKLQlDdXJyZW50bHkgdGhlIG1vdW50IGNvbW1hbmQgaXMgbm90IGF3YXJlIG9mIHNoYXJlZCBzdWJ0cmVlIGZlYXR1cmVzLgotCVdvcmsgaXMgaW4gcHJvZ3Jlc3MgdG8gYWRkIHRoZSBzdXBwb3J0IGluIG1vdW50ICggdXRpbC1saW51eCBwYWNrYWdlICkuCi0JVGlsbCB0aGVuIHVzZSB0aGUgZm9sbG93aW5nIHByb2dyYW0uCisJVGhlIG1vdW50IGNvbW1hbmQgKHV0aWwtbGludXggcGFja2FnZSkgY2FuIGJlIHVzZWQgdG8gc2V0IG1vdW50CisJc3RhdGVzOgogCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8KLQkvL3RoaXMgY29kZSB3YXMgZGV2ZWxvcGVkIG15IE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KLQkvL2FuZCBtb2RpZmllZCBieSBSYW0gUGFpIDxsaW51eHJhbUB1cy5pYm0uY29tPgotCS8vIHNhbXBsZSB1c2FnZToKLQkvLyAgICAgICAgICAgICAgc21vdW50IC90bXAgc2hhcmVkCi0JLy8KLQkjaW5jbHVkZSA8c3RkaW8uaD4KLQkjaW5jbHVkZSA8c3RkbGliLmg+Ci0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQkjaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0JI2luY2x1ZGUgPHN5cy9mc3VpZC5oPgotCi0JI2lmbmRlZiBNU19SRUMKLQkjZGVmaW5lIE1TX1JFQwkJMHg0MDAwCS8qIDE2Mzg0OiBSZWN1cnNpdmUgbG9vcGJhY2sgKi8KLQkjZW5kaWYKLQotCSNpZm5kZWYgTVNfU0hBUkVECi0JI2RlZmluZSBNU19TSEFSRUQJCTE8PDIwCS8qIFNoYXJlZCAqLwotCSNlbmRpZgotCi0JI2lmbmRlZiBNU19QUklWQVRFCi0JI2RlZmluZSBNU19QUklWQVRFCQkxPDwxOAkvKiBQcml2YXRlICovCi0JI2VuZGlmCi0KLQkjaWZuZGVmIE1TX1NMQVZFCi0JI2RlZmluZSBNU19TTEFWRQkJMTw8MTkJLyogU2xhdmUgKi8KLQkjZW5kaWYKLQotCSNpZm5kZWYgTVNfVU5CSU5EQUJMRQotCSNkZWZpbmUgTVNfVU5CSU5EQUJMRQkJMTw8MTcJLyogVW5iaW5kYWJsZSAqLwotCSNlbmRpZgotCi0JaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLQl7Ci0JCWludCB0eXBlOwotCQlpZihhcmdjICE9IDMpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIGRpciAiCi0JCQkiPHJzaGFyZWR8cnNsYXZlfHJwcml2YXRlfHJ1bmJpbmRhYmxlfHNoYXJlZHxzbGF2ZSIKLQkJCSJ8cHJpdmF0ZXx1bmJpbmRhYmxlPlxuIiAsIGFyZ3ZbMF0pOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlmcHJpbnRmKHN0ZG91dCwgIiVzICVzICVzXG4iLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKLQotCQlpZiAoc3RyY21wKGFyZ3ZbMl0sInJzaGFyZWQiKT09MCkKLQkJCXR5cGU9KE1TX1NIQVJFRHxNU19SRUMpOwotCQllbHNlIGlmIChzdHJjbXAoYXJndlsyXSwicnNsYXZlIik9PTApCi0JCQl0eXBlPShNU19TTEFWRXxNU19SRUMpOwotCQllbHNlIGlmIChzdHJjbXAoYXJndlsyXSwicnByaXZhdGUiKT09MCkKLQkJCXR5cGU9KE1TX1BSSVZBVEV8TVNfUkVDKTsKLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sInJ1bmJpbmRhYmxlIik9PTApCi0JCQl0eXBlPShNU19VTkJJTkRBQkxFfE1TX1JFQyk7Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCJzaGFyZWQiKT09MCkKLQkJCXR5cGU9TVNfU0hBUkVEOwotCQllbHNlIGlmIChzdHJjbXAoYXJndlsyXSwic2xhdmUiKT09MCkKLQkJCXR5cGU9TVNfU0xBVkU7Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCJwcml2YXRlIik9PTApCi0JCQl0eXBlPU1TX1BSSVZBVEU7Ci0JCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCJ1bmJpbmRhYmxlIik9PTApCi0JCQl0eXBlPU1TX1VOQklOREFCTEU7Ci0JCWVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIG9wZXJhdGlvbjogJXNcbiIsIGFyZ3ZbMl0pOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJc2V0ZnN1aWQoZ2V0dWlkKCkpOwotCi0JCWlmKG1vdW50KCIiLCBhcmd2WzFdLCAiZG9udGNhcmUiLCB0eXBlLCAiIikgPT0gLTEpIHsKLQkJCXBlcnJvcigibW91bnQiKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JQ29weSB0aGUgYWJvdmUgY29kZSBzbmlwcGV0IGludG8gc21vdW50LmMKLQlnY2MgLW8gc21vdW50IHNtb3VudC5jCi0KLQotCShpKSBUbyBtYXJrIGFsbCB0aGUgbW91bnRzIHVuZGVyIC9tbnQgYXMgc2hhcmVkIGV4ZWN1dGUgdGhlIGZvbGxvd2luZwotCWNvbW1hbmQ6Ci0KLQkgCXNtb3VudCAvbW50IHJzaGFyZWQKLQkJdGhlIGNvcnJlc3BvbmRpbmcgc3ludGF4IHBsYW5uZWQgZm9yIG1vdW50IGNvbW1hbmQgaXMKLQkJbW91bnQgLS1tYWtlLXJzaGFyZWQgL21udAotCi0JICAgIGp1c3QgdG8gbWFyayBhIG1vdW50IC9tbnQgYXMgc2hhcmVkLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcKLQkgICAgY29tbWFuZDoKLQkgCXNtb3VudCAvbW50IHNoYXJlZAotCQl0aGUgY29ycmVzcG9uZGluZyBzeW50YXggcGxhbm5lZCBmb3IgbW91bnQgY29tbWFuZCBpcwotCQltb3VudCAtLW1ha2Utc2hhcmVkIC9tbnQKLQotCShpaSkgVG8gbWFyayBhbGwgdGhlIHNoYXJlZCBtb3VudHMgdW5kZXIgL21udCBhcyBzbGF2ZSBleGVjdXRlIHRoZQotCWZvbGxvd2luZwotCi0JICAgICBjb21tYW5kOgotCQlzbW91bnQgL21udCByc2xhdmUKLQkJdGhlIGNvcnJlc3BvbmRpbmcgc3ludGF4IHBsYW5uZWQgZm9yIG1vdW50IGNvbW1hbmQgaXMKLQkJbW91bnQgLS1tYWtlLXJzbGF2ZSAvbW50Ci0KLQkgICAganVzdCB0byBtYXJrIGEgbW91bnQgL21udCBhcyBzbGF2ZSwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nCi0JICAgIGNvbW1hbmQ6Ci0JIAlzbW91bnQgL21udCBzbGF2ZQotCQl0aGUgY29ycmVzcG9uZGluZyBzeW50YXggcGxhbm5lZCBmb3IgbW91bnQgY29tbWFuZCBpcwotCQltb3VudCAtLW1ha2Utc2xhdmUgL21udAotCi0JKGlpaSkgVG8gbWFyayBhbGwgdGhlIG1vdW50cyB1bmRlciAvbW50IGFzIHByaXZhdGUgZXhlY3V0ZSB0aGUKLQlmb2xsb3dpbmcgY29tbWFuZDoKLQotCQlzbW91bnQgL21udCBycHJpdmF0ZQotCQl0aGUgY29ycmVzcG9uZGluZyBzeW50YXggcGxhbm5lZCBmb3IgbW91bnQgY29tbWFuZCBpcwotCQltb3VudCAtLW1ha2UtcnByaXZhdGUgL21udAotCi0JICAgIGp1c3QgdG8gbWFyayBhIG1vdW50IC9tbnQgYXMgcHJpdmF0ZSwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nCi0JICAgIGNvbW1hbmQ6Ci0JIAlzbW91bnQgL21udCBwcml2YXRlCi0JCXRoZSBjb3JyZXNwb25kaW5nIHN5bnRheCBwbGFubmVkIGZvciBtb3VudCBjb21tYW5kIGlzCi0JCW1vdW50IC0tbWFrZS1wcml2YXRlIC9tbnQKLQotCSAgICAgIE5PVEU6IGJ5IGRlZmF1bHQgYWxsIHRoZSBtb3VudHMgYXJlIGNyZWF0ZWQgYXMgcHJpdmF0ZS4gQnV0IGlmCi0JICAgICAgeW91IHdhbnQgdG8gY2hhbmdlIHNvbWUgc2hhcmVkL3NsYXZlL3VuYmluZGFibGUgIG1vdW50IGFzCi0JICAgICAgcHJpdmF0ZSBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUsIHRoaXMgY29tbWFuZCBjYW4gaGVscC4KLQotCShpdikgVG8gbWFyayBhbGwgdGhlIG1vdW50cyB1bmRlciAvbW50IGFzIHVuYmluZGFibGUgZXhlY3V0ZSB0aGUKLQlmb2xsb3dpbmcKLQotCSAgICAgY29tbWFuZDoKLQkJc21vdW50IC9tbnQgcnVuYmluZGFibGUKLQkJdGhlIGNvcnJlc3BvbmRpbmcgc3ludGF4IHBsYW5uZWQgZm9yIG1vdW50IGNvbW1hbmQgaXMKLQkJbW91bnQgLS1tYWtlLXJ1bmJpbmRhYmxlIC9tbnQKLQotCSAgICBqdXN0IHRvIG1hcmsgYSBtb3VudCAvbW50IGFzIHVuYmluZGFibGUsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZwotCSAgICBjb21tYW5kOgotCSAJc21vdW50IC9tbnQgdW5iaW5kYWJsZQotCQl0aGUgY29ycmVzcG9uZGluZyBzeW50YXggcGxhbm5lZCBmb3IgbW91bnQgY29tbWFuZCBpcwotCQltb3VudCAtLW1ha2UtdW5iaW5kYWJsZSAvbW50CisJbW91bnQgLS1tYWtlLXNoYXJlZCBtb3VudHBvaW50CisJbW91bnQgLS1tYWtlLXNsYXZlIG1vdW50cG9pbnQKKwltb3VudCAtLW1ha2UtcHJpdmF0ZSBtb3VudHBvaW50CisJbW91bnQgLS1tYWtlLXVuYmluZGFibGUgbW91bnRwb2ludAogCiAKIDQpIFVzZSBjYXNlcwpAQCAtMzUwLDcgKzIxNCw3IEBACiAJCW1vdW50IC0tcmJpbmQgLyAvdmlldy92MwogCQltb3VudCAtLXJiaW5kIC8gL3ZpZXcvdjQKIAotCQlhbmQgaWYgL3VzciBoYXMgYSB2ZXJzaW9uaW5nIGZpbGVzeXN0ZW0gbW91bnRlZCwgdGhhbiB0aGF0CisJCWFuZCBpZiAvdXNyIGhhcyBhIHZlcnNpb25pbmcgZmlsZXN5c3RlbSBtb3VudGVkLCB0aGVuIHRoYXQKIAkJbW91bnQgYXBwZWFycyBhdCAvdmlldy92MS91c3IsIC92aWV3L3YyL3VzciwgL3ZpZXcvdjMvdXNyIGFuZAogCQkvdmlldy92NC91c3IgdG9vCiAKQEAgLTM5MCw3ICsyNTQsNyBAQAogCiAJCUZvciBleGFtcGxlOgogCQkJbW91bnQgLS1tYWtlLXNoYXJlZCAvbW50Ci0JCQltb3VudCAtLWJpbiAvbW50IC90bXAKKwkJCW1vdW50IC0tYmluZCAvbW50IC90bXAKIAogCQlUaGUgbW91bnQgYXQgL21udCBhbmQgdGhhdCBhdCAvdG1wIGFyZSBib3RoIHNoYXJlZCBhbmQgYmVsb25nCiAJCXRvIHRoZSBzYW1lIHBlZXIgZ3JvdXAuIEFueXRoaW5nIG1vdW50ZWQgb3IgdW5tb3VudGVkIHVuZGVyCkBAIC01NTgsNyArNDIyLDcgQEAKIAl0aGVuIHRoZSBzdWJ0cmVlIHVuZGVyIHRoZSB1bmJpbmRhYmxlIG1vdW50IGlzIHBydW5lZCBpbiB0aGUgbmV3CiAJbG9jYXRpb24uCiAKLQllZzogbGV0cyBzYXkgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIG1vdW50IHRyZWUuCisJZWc6IGxldCdzIHNheSB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgbW91bnQgdHJlZS4KIAogCQlBCiAJICAgICAgLyAgIFwKQEAgLTU2Niw3ICs0MzAsNyBAQAogCSAgICAgLyBcIC8gXAogCSAgICAgRCBFIEYgRwogCi0JICAgICBMZXRzIHNheSBhbGwgdGhlIG1vdW50IGV4Y2VwdCB0aGUgbW91bnQgQyBpbiB0aGUgdHJlZSBhcmUKKwkgICAgIExldCdzIHNheSBhbGwgdGhlIG1vdW50IGV4Y2VwdCB0aGUgbW91bnQgQyBpbiB0aGUgdHJlZSBhcmUKIAkgICAgIG9mIGEgdHlwZSBvdGhlciB0aGFuIHVuYmluZGFibGUuCiAKIAkgICAgIElmIHRoaXMgdHJlZSBpcyByYm91bmQgdG8gc2F5IFoKQEAgLTY4MywxMyArNTQ3LDEzIEBACiAJJ2InIG9uIG1vdW50cyB0aGF0IHJlY2VpdmUgcHJvcGFnYXRpb24gZnJvbSBtb3VudCAnQicgYW5kIGRvZXMgbm90IGhhdmUKIAlzdWItbW91bnRzIHdpdGhpbiB0aGVtIGFyZSB1bm1vdW50ZWQuCiAKLQlFeGFtcGxlOiBMZXRzIHNheSAnQjEnLCAnQjInLCAnQjMnIGFyZSBzaGFyZWQgbW91bnRzIHRoYXQgcHJvcGFnYXRlIHRvCisJRXhhbXBsZTogTGV0J3Mgc2F5ICdCMScsICdCMicsICdCMycgYXJlIHNoYXJlZCBtb3VudHMgdGhhdCBwcm9wYWdhdGUgdG8KIAllYWNoIG90aGVyLgogCi0JbGV0cyBzYXkgJ0ExJywgJ0EyJywgJ0EzJyBhcmUgZmlyc3QgbW91bnRlZCBhdCBkZW50cnkgJ2InIG9uIG1vdW50CisJbGV0J3Mgc2F5ICdBMScsICdBMicsICdBMycgYXJlIGZpcnN0IG1vdW50ZWQgYXQgZGVudHJ5ICdiJyBvbiBtb3VudAogCSdCMScsICdCMicgYW5kICdCMycgcmVzcGVjdGl2ZWx5LgogCi0JbGV0cyBzYXkgJ0MxJywgJ0MyJywgJ0MzJyBhcmUgbmV4dCBtb3VudGVkIGF0IHRoZSBzYW1lIGRlbnRyeSAnYicgb24KKwlsZXQncyBzYXkgJ0MxJywgJ0MyJywgJ0MzJyBhcmUgbmV4dCBtb3VudGVkIGF0IHRoZSBzYW1lIGRlbnRyeSAnYicgb24KIAltb3VudCAnQjEnLCAnQjInIGFuZCAnQjMnIHJlc3BlY3RpdmVseS4KIAogCWlmICdDMScgaXMgdW5tb3VudGVkLCBhbGwgdGhlIG1vdW50cyB0aGF0IGFyZSBtb3N0LXJlY2VudGx5LW1vdW50ZWQgb24KQEAgLTcxMCw3ICs1NzQsNyBAQAogCUEgY2xvbmVkIG5hbWVzcGFjZSBjb250YWlucyBhbGwgdGhlIG1vdW50cyBhcyB0aGF0IG9mIHRoZSBwYXJlbnQKIAluYW1lc3BhY2UuCiAKLQlMZXRzIHNheSAnQScgYW5kICdCJyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbW91bnRzIGluIHRoZSBwYXJlbnQgYW5kIHRoZQorCUxldCdzIHNheSAnQScgYW5kICdCJyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbW91bnRzIGluIHRoZSBwYXJlbnQgYW5kIHRoZQogCWNoaWxkIG5hbWVzcGFjZS4KIAogCUlmICdBJyBpcyBzaGFyZWQsIHRoZW4gJ0InIGlzIGFsc28gc2hhcmVkIGFuZCAnQScgYW5kICdCJyBwcm9wYWdhdGUgdG8KQEAgLTc1OSwxMSArNjIzLDExIEBACiAJCW1vdW50IC0tbWFrZS1zbGF2ZSAvbW50CiAKIAkJQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHRoZSBmaXJzdCBtb3VudCBhdCAvdG1wIGFuZAotCQlpdHMgcm9vdCBkZW50cnkgaXMgMS4gTGV0cyBjYWxsIHRoaXMgbW91bnQgJ0EnCisJCWl0cyByb290IGRlbnRyeSBpcyAxLiBMZXQncyBjYWxsIHRoaXMgbW91bnQgJ0EnCiAJCUFuZCB0aGVuIHdlIGhhdmUgYSBzZWNvbmQgbW91bnQgYXQgL3RtcDEgd2l0aCByb290Ci0JCWRlbnRyeSAyLiBMZXRzIGNhbGwgdGhpcyBtb3VudCAnQicKKwkJZGVudHJ5IDIuIExldCdzIGNhbGwgdGhpcyBtb3VudCAnQicKIAkJTmV4dCB3ZSBoYXZlIGEgdGhpcmQgbW91bnQgYXQgL21udCB3aXRoIHJvb3QgZGVudHJ5Ci0JCW1udC4gTGV0cyBjYWxsIHRoaXMgbW91bnQgJ0MnCisJCW1udC4gTGV0J3MgY2FsbCB0aGlzIG1vdW50ICdDJwogCiAJCSdCJyBpcyB0aGUgc2xhdmUgb2YgJ0EnIGFuZCAnQycgaXMgYSBzbGF2ZSBvZiAnQicKIAkJQSAtPiBCIC0+IEMKQEAgLTc5NCw3ICs2NTgsNyBAQAogCiAJUTMgV2h5IGlzIHVuYmluZGFibGUgbW91bnQgbmVlZGVkPwogCi0JCUxldHMgc2F5IHdlIHdhbnQgdG8gcmVwbGljYXRlIHRoZSBtb3VudCB0cmVlIGF0IG11bHRpcGxlCisJCUxldCdzIHNheSB3ZSB3YW50IHRvIHJlcGxpY2F0ZSB0aGUgbW91bnQgdHJlZSBhdCBtdWx0aXBsZQogCQlsb2NhdGlvbnMgd2l0aGluIHRoZSBzYW1lIHN1YnRyZWUuCiAKIAkJaWYgb25lIHJiaW5kIG1vdW50cyBhIHRyZWUgd2l0aGluIHRoZSBzYW1lIHN1YnRyZWUgJ24nIHRpbWVzCkBAIC04MDMsNyArNjY3LDcgQEAKIAkJbW91bnRzLiBIZXJlIGlzIGEgZXhhbXBsZS4KIAogCQlzdGVwIDE6Ci0JCSAgIGxldHMgc2F5IHRoZSByb290IHRyZWUgaGFzIGp1c3QgdHdvIGRpcmVjdG9yaWVzIHdpdGgKKwkJICAgbGV0J3Mgc2F5IHRoZSByb290IHRyZWUgaGFzIGp1c3QgdHdvIGRpcmVjdG9yaWVzIHdpdGgKIAkJICAgb25lIHZmc21vdW50LgogCQkJCSAgICByb290CiAJCQkJICAgLyAgICBcCkBAIC04NzUsNyArNzM5LDcgQEAKIAkJVW5jbG9uYWJsZSBtb3VudHMgY29tZSBpbiBoYW5keSBoZXJlLgogCiAJCXN0ZXAgMToKLQkJICAgbGV0cyBzYXkgdGhlIHJvb3QgdHJlZSBoYXMganVzdCB0d28gZGlyZWN0b3JpZXMgd2l0aAorCQkgICBsZXQncyBzYXkgdGhlIHJvb3QgdHJlZSBoYXMganVzdCB0d28gZGlyZWN0b3JpZXMgd2l0aAogCQkgICBvbmUgdmZzbW91bnQuCiAJCQkJICAgIHJvb3QKIAkJCQkgICAvICAgIFwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZhdC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3ZmYXQudHh0CmluZGV4IGI1OGI4NGIuLmVlZDUyMGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZhdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZmF0LnR4dApAQCAtMTAyLDcgKzEwMiw3IEBACiAJCSB3aW5udDogZW11bGF0ZSB0aGUgV2luZG93cyBOVCBydWxlIGZvciBkaXNwbGF5L2NyZWF0ZS4KIAkJIG1peGVkOiBlbXVsYXRlIHRoZSBXaW5kb3dzIE5UIHJ1bGUgZm9yIGRpc3BsYXksCiAJCQllbXVsYXRlIHRoZSBXaW5kb3dzIDk1IHJ1bGUgZm9yIGNyZWF0ZS4KLQkJIERlZmF1bHQgc2V0dGluZyBpcyBgbG93ZXInLgorCQkgRGVmYXVsdCBzZXR0aW5nIGlzIGBtaXhlZCcuCiAKIHR6PVVUQyAgICAgICAgLS0gSW50ZXJwcmV0IHRpbWVzdGFtcHMgYXMgVVRDIHJhdGhlciB0aGFuIGxvY2FsIHRpbWUuCiAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGRpc2FibGVzIHRoZSBjb252ZXJzaW9uIG9mIHRpbWVzdGFtcHMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAppbmRleCBmNDllZWNmLi42MjNmMDk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CkBAIC01MzYsNiArNTM2LDcgQEAKIAkvKiBtaWdyYXRlIHRoZSBjb250ZW50cyBvZiBhIHBhZ2UgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgKi8KIAlpbnQgKCptaWdyYXRlcGFnZSkgKHN0cnVjdCBwYWdlICosIHN0cnVjdCBwYWdlICopOwogCWludCAoKmxhdW5kZXJfcGFnZSkgKHN0cnVjdCBwYWdlICopOworCWludCAoKmVycm9yX3JlbW92ZV9wYWdlKSAoc3RydWN0IG1hcHBpbmcgKm1hcHBpbmcsIHN0cnVjdCBwYWdlICpwYWdlKTsKIH07CiAKICAgd3JpdGVwYWdlOiBjYWxsZWQgYnkgdGhlIFZNIHRvIHdyaXRlIGEgZGlydHkgcGFnZSB0byBiYWNraW5nIHN0b3JlLgpAQCAtNjk0LDYgKzY5NSwxMiBAQAogICAJcHJldmVudCByZWRpcnR5aW5nIHRoZSBwYWdlLCBpdCBpcyBrZXB0IGxvY2tlZCBkdXJpbmcgdGhlIHdob2xlCiAJb3BlcmF0aW9uLgogCisgIGVycm9yX3JlbW92ZV9wYWdlOiBub3JtYWxseSBzZXQgdG8gZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZSBpZiB0cnVuY2F0aW9uCisJaXMgb2sgZm9yIHRoaXMgYWRkcmVzcyBzcGFjZS4gVXNlZCBmb3IgbWVtb3J5IGZhaWx1cmUgaGFuZGxpbmcuCisJU2V0dGluZyB0aGlzIGltcGxpZXMgeW91IGRlYWwgd2l0aCBwYWdlcyBnb2luZyBhd2F5IHVuZGVyIHlvdSwKKwl1bmxlc3MgeW91IGhhdmUgdGhlbSBsb2NrZWQgb3IgcmVmZXJlbmNlIGNvdW50cyBpbmNyZWFzZWQuCisKKwogVGhlIEZpbGUgT2JqZWN0CiA9PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mbGV4aWJsZS1hcnJheXMudHh0IGIvRG9jdW1lbnRhdGlvbi9mbGV4aWJsZS1hcnJheXMudHh0CmluZGV4IDg0ZWIyNjguLmNiOGEzYTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmxleGlibGUtYXJyYXlzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZsZXhpYmxlLWFycmF5cy50eHQKQEAgLTEsNSArMSw1IEBACiBVc2luZyBmbGV4aWJsZSBhcnJheXMgaW4gdGhlIGtlcm5lbAotTGFzdCB1cGRhdGVkIGZvciAyLjYuMzEKK0xhc3QgdXBkYXRlZCBmb3IgMi42LjMyCiBKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PgogCiBMYXJnZSBjb250aWd1b3VzIG1lbW9yeSBhbGxvY2F0aW9ucyBjYW4gYmUgdW5yZWxpYWJsZSBpbiB0aGUgTGludXgga2VybmVsLgpAQCAtNDAsNiArNDAsMTMgQEAKIHRoZSBjdXJyZW50IGNvZGUsIHVzaW5nIGZsYWdzIHRvIGFzayBmb3IgaGlnaCBtZW1vcnkgaXMgbGlrZWx5IHRvIGxlYWQgdG8KIG5vdGFibHkgdW5wbGVhc2FudCBzaWRlIGVmZmVjdHMuCiAKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gZGVmaW5lIGZsZXhpYmxlIGFycmF5cyBhdCBjb21waWxlIHRpbWUgd2l0aDoKKworICAgIERFRklORV9GTEVYX0FSUkFZKG5hbWUsIGVsZW1lbnRfc2l6ZSwgdG90YWwpOworCitUaGlzIG1hY3JvIHdpbGwgcmVzdWx0IGluIGEgZGVmaW5pdGlvbiBvZiBhbiBhcnJheSB3aXRoIHRoZSBnaXZlbiBuYW1lOyB0aGUKK2VsZW1lbnQgc2l6ZSBhbmQgdG90YWwgd2lsbCBiZSBjaGVja2VkIGZvciB2YWxpZGl0eSBhdCBjb21waWxlIHRpbWUuCisKIFN0b3JpbmcgZGF0YSBpbnRvIGEgZmxleGlibGUgYXJyYXkgaXMgYWNjb21wbGlzaGVkIHdpdGggYSBjYWxsIHRvOgogCiAgICAgaW50IGZsZXhfYXJyYXlfcHV0KHN0cnVjdCBmbGV4X2FycmF5ICphcnJheSwgdW5zaWduZWQgaW50IGVsZW1lbnRfbnIsCkBAIC03NiwxNiArODMsMzAgQEAKIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYmFjayBhIHZhbGlkIHBvaW50ZXIgZm9yIGFuIGVsZW1lbnQgd2hpY2gKIGhhcyBuZXZlciBiZWVuIHN0b3JlZCBpbiB0aGUgYXJyYXkuICBNZW1vcnkgZm9yIGFycmF5IGVsZW1lbnRzIGlzIGFsbG9jYXRlZAogb25lIHBhZ2UgYXQgYSB0aW1lOyBhIHNpbmdsZSBhbGxvY2F0aW9uIGNvdWxkIHByb3ZpZGUgbWVtb3J5IGZvciBzZXZlcmFsCi1hZGphY2VudCBlbGVtZW50cy4gIFRoZSBmbGV4aWJsZSBhcnJheSBjb2RlIGRvZXMgbm90IGtub3cgaWYgYSBzcGVjaWZpYwotZWxlbWVudCBoYXMgYmVlbiB3cml0dGVuOyBpdCBvbmx5IGtub3dzIGlmIHRoZSBhc3NvY2lhdGVkIG1lbW9yeSBpcwotcHJlc2VudC4gIFNvIGEgZmxleF9hcnJheV9nZXQoKSBjYWxsIG9uIGFuIGVsZW1lbnQgd2hpY2ggd2FzIG5ldmVyIHN0b3JlZAotaW4gdGhlIGFycmF5IGhhcyB0aGUgcG90ZW50aWFsIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gcmFuZG9tIGRhdGEuICBJZiB0aGUKLWNhbGxlciBkb2VzIG5vdCBoYXZlIGEgc2VwYXJhdGUgd2F5IHRvIGtub3cgd2hpY2ggZWxlbWVudHMgd2VyZSBhY3R1YWxseQotc3RvcmVkLCBpdCBtaWdodCBiZSB3aXNlLCBhdCBsZWFzdCwgdG8gYWRkIEdGUF9aRVJPIHRvIHRoZSBmbGFncyBhcmd1bWVudAotdG8gZW5zdXJlIHRoYXQgYWxsIGVsZW1lbnRzIGFyZSB6ZXJvZWQuCithZGphY2VudCBlbGVtZW50cy4gIEZsZXhpYmxlIGFycmF5IGVsZW1lbnRzIGFyZSBub3JtYWxseSBpbml0aWFsaXplZCB0byB0aGUKK3ZhbHVlIEZMRVhfQVJSQVlfRlJFRSAoZGVmaW5lZCBhcyAweDZjIGluIDxsaW51eC9wb2lzb24uaD4pLCBzbyBlcnJvcnMKK2ludm9sdmluZyB0aGF0IG51bWJlciBwcm9iYWJseSByZXN1bHQgZnJvbSB1c2Ugb2YgdW5zdG9yZWQgYXJyYXkgZW50cmllcy4KK05vdGUgdGhhdCwgaWYgYXJyYXkgZWxlbWVudHMgYXJlIGFsbG9jYXRlZCB3aXRoIF9fR0ZQX1pFUk8sIHRoZXkgd2lsbCBiZQoraW5pdGlhbGl6ZWQgdG8gemVybyBhbmQgdGhpcyBwb2lzb25pbmcgd2lsbCBub3QgaGFwcGVuLgogCi1UaGVyZSBpcyBubyB3YXkgdG8gcmVtb3ZlIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuICBJdCBpcyBwb3NzaWJsZSwKLXRob3VnaCwgdG8gcmVtb3ZlIGFsbCBlbGVtZW50cyB3aXRoIGEgY2FsbCB0bzoKK0luZGl2aWR1YWwgZWxlbWVudHMgaW4gdGhlIGFycmF5IGNhbiBiZSBjbGVhcmVkIHdpdGg6CisKKyAgICBpbnQgZmxleF9hcnJheV9jbGVhcihzdHJ1Y3QgZmxleF9hcnJheSAqYXJyYXksIHVuc2lnbmVkIGludCBlbGVtZW50X25yKTsKKworVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgZ2l2ZW4gZWxlbWVudCB0byBGTEVYX0FSUkFZX0ZSRUUgYW5kIHJldHVybgoremVyby4gIElmIHN0b3JhZ2UgZm9yIHRoZSBpbmRpY2F0ZWQgZWxlbWVudCBpcyBub3QgYWxsb2NhdGVkIGZvciB0aGUgYXJyYXksCitmbGV4X2FycmF5X2NsZWFyKCkgd2lsbCByZXR1cm4gLUVJTlZBTCBpbnN0ZWFkLiAgTm90ZSB0aGF0IGNsZWFyaW5nIGFuCitlbGVtZW50IGRvZXMgbm90IHJlbGVhc2UgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIGl0OyB0byByZWR1Y2UgdGhlCithbGxvY2F0ZWQgc2l6ZSBvZiBhbiBhcnJheSwgY2FsbDoKKworICAgIGludCBmbGV4X2FycmF5X3NocmluayhzdHJ1Y3QgZmxleF9hcnJheSAqYXJyYXkpOworCitUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIG51bWJlciBvZiBwYWdlcyBvZiBtZW1vcnkgYWN0dWFsbHkgZnJlZWQuCitUaGlzIGZ1bmN0aW9uIHdvcmtzIGJ5IHNjYW5uaW5nIHRoZSBhcnJheSBmb3IgcGFnZXMgY29udGFpbmluZyBub3RoaW5nIGJ1dAorRkxFWF9BUlJBWV9GUkVFIGJ5dGVzLCBzbyAoMSkgaXQgY2FuIGJlIGV4cGVuc2l2ZSwgYW5kICgyKSBpdCB3aWxsIG5vdCB3b3JrCitpZiB0aGUgYXJyYXkncyBwYWdlcyBhcmUgYWxsb2NhdGVkIHdpdGggX19HRlBfWkVSTy4KKworSXQgaXMgcG9zc2libGUgdG8gcmVtb3ZlIGFsbCBlbGVtZW50cyBvZiBhbiBhcnJheSB3aXRoIGEgY2FsbCB0bzoKIAogICAgIHZvaWQgZmxleF9hcnJheV9mcmVlX3BhcnRzKHN0cnVjdCBmbGV4X2FycmF5ICphcnJheSk7CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vY29yZXRlbXAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2NvcmV0ZW1wCmluZGV4IGRiYmU2YzcwLi45MjI2N2I2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2NvcmV0ZW1wCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vY29yZXRlbXAKQEAgLTQsNyArNCw5IEBACiBTdXBwb3J0ZWQgY2hpcHM6CiAgICogQWxsIEludGVsIENvcmUgZmFtaWx5CiAgICAgUHJlZml4OiAnY29yZXRlbXAnCi0gICAgQ1BVSUQ6IGZhbWlseSAweDYsIG1vZGVscyAweGUsIDB4ZiwgMHgxNiwgMHgxNworICAgIENQVUlEOiBmYW1pbHkgMHg2LCBtb2RlbHMgMHhlIChQZW50aXVtIE0gREMpLCAweGYgKENvcmUgMiBEQyA2NW5tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYgKENvcmUgMiBTQyA2NW5tKSwgMHgxNyAoUGVucnluIDQ1bm0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYSAoTmVoYWxlbSksIDB4MWMgKEF0b20pLCAweDFlIChMeW5uZmllbGQpCiAgICAgRGF0YXNoZWV0OiBJbnRlbCA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwKICAgICAgICAgICAgICAgIFZvbHVtZSAzQTogU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlCiAgICAgICAgICAgICAgICBodHRwOi8vc29mdHdhcmVjb21tdW5pdHkuaW50ZWwuY29tL1dpa2kvTW9iaWxpdHkvNzIwLmh0bQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9mc2NoZXIgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2ZzY2hlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwMzE2NS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2ZzY2hlcgorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi1LZXJuZWwgZHJpdmVyIGZzY2hlcgotPT09PT09PT09PT09PT09PT09PT0KLQotU3VwcG9ydGVkIGNoaXBzOgotICAqIEZ1aml0c3UtU2llbWVucyBIZXJtZXMgY2hpcAotICAgIFByZWZpeDogJ2ZzY2hlcicKLSAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4NzMKLQotQXV0aG9yczoKLSAgICAgICAgUmVpbmhhcmQgTmlzc2wgPHJuaXNzbEBnbXguZGU+IGJhc2VkIG9uIHdvcmsKLSAgICAgICAgZnJvbSBIZXJtYW5uIEp1bmcgPGhlakBvZG4uZGU+LAotICAgICAgICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LAotICAgICAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+Ci0KLURlc2NyaXB0aW9uCi0tLS0tLS0tLS0tLQotCi1UaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBGdWppdHN1LVNpZW1lbnMgSGVybWVzIGNoaXAuIEl0IGlzCi1kZXNjcmliZWQgaW4gdGhlICdSZWdpc3RlciBTZXQgU3BlY2lmaWNhdGlvbiBCTUMgSGVybWVzIGJhc2VkIFN5c3RlbWJvYXJkJwotZnJvbSBGdWppdHN1LVNpZW1lbnMuCi0KLVRoZSBIZXJtZXMgY2hpcCBpbXBsZW1lbnRzIGEgaGFyZHdhcmUtYmFzZWQgc3lzdGVtIG1hbmFnZW1lbnQsIGUuZy4gZm9yCi1jb250cm9sbGluZyBmYW4gc3BlZWQgYW5kIGNvcmUgdm9sdGFnZS4gVGhlcmUgaXMgYWxzbyBhIHdhdGNoZG9nIGNvdW50ZXIgb24KLXRoZSBjaGlwIHdoaWNoIGNhbiB0cmlnZ2VyIGFuIGFsYXJtIGFuZCBldmVuIHNodXQgdGhlIHN5c3RlbSBkb3duLgotCi1UaGUgY2hpcCBwcm92aWRlcyB0aHJlZSB0ZW1wZXJhdHVyZSB2YWx1ZXMgKENQVSwgbW90aGVyYm9hcmQgYW5kCi1hdXhpbGlhcnkpLCB0aHJlZSB2b2x0YWdlIHZhbHVlcyAoKzEyViwgKzVWIGFuZCBiYXR0ZXJ5KSBhbmQgdGhyZWUgZmFucwotKHBvd2VyIHN1cHBseSwgQ1BVIGFuZCBhdXhpbGlhcnkpLgotCi1UZW1wZXJhdHVyZXMgYXJlIG1lYXN1cmVkIGluIGRlZ3JlZXMgQ2Vsc2l1cy4gVGhlIHJlc29sdXRpb24gaXMgMSBkZWdyZWUuCi0KLUZhbiByb3RhdGlvbiBzcGVlZHMgYXJlIHJlcG9ydGVkIGluIFJQTSAocm90YXRpb25zIHBlciBtaW51dGUpLiBUaGUgdmFsdWUKLWNhbiBiZSBkaXZpZGVkIGJ5IGEgcHJvZ3JhbW1hYmxlIGRpdmlkZXIgKDEsIDIgb3IgNCkgd2hpY2ggaXMgc3RvcmVkIG9uCi10aGUgY2hpcC4KLQotVm9sdGFnZSBzZW5zb3JzIChhbHNvIGtub3duIGFzICJpbiIgc2Vuc29ycykgcmVwb3J0IHRoZWlyIHZhbHVlcyBpbiB2b2x0cy4KLQotQWxsIHZhbHVlcyBhcmUgcmVwb3J0ZWQgYXMgZmluYWwgdmFsdWVzIGZyb20gdGhlIGRyaXZlci4gVGhlcmUgaXMgbm8gbmVlZAotZm9yIGZ1cnRoZXIgY2FsY3VsYXRpb25zLgotCi0KLURldGFpbGVkIGRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CZWxvdyB5b3UnbGwgZmluZCBhIHNpbmdsZSBsaW5lIGRlc2NyaXB0aW9uIG9mIGFsbCB0aGUgYml0IHZhbHVlcy4gV2l0aAotdGhpcyBpbmZvcm1hdGlvbiwgeW91J3JlIGFibGUgdG8gZGVjb2RlIGUuIGcuIGFsYXJtcywgd2RvZywgZXRjLiBUbyBtYWtlCi11c2Ugb2YgdGhlIHdhdGNoZG9nLCB5b3UnbGwgbmVlZCB0byBzZXQgdGhlIHdhdGNoZG9nIHRpbWUgYW5kIGVuYWJsZSB0aGUKLXdhdGNoZG9nLiBBZnRlciB0aGF0IGl0IGlzIG5lY2Vzc2FyeSB0byByZXN0YXJ0IHRoZSB3YXRjaGRvZyB0aW1lIHdpdGhpbgotdGhlIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZSwgb3IgYSBzeXN0ZW0gcmVzZXQgd2lsbCBvY2N1ci4KLQotKiByZXZpc2lvbgotICBSRUFESU5HICYgMHhmZiA9IDB4Pz86IEhFUk1FUyByZXZpc2lvbiBpZGVudGlmaWNhdGlvbgotCi0qIGFsYXJtcwotICBSRUFESU5HICYgMHg4MCA9IDB4ODA6IENQVSB0aHJvdHRsaW5nIGFjdGl2ZQotICBSRUFESU5HICYgMHg4MCA9IDB4MDA6IENQVSBydW5uaW5nIGF0IGZ1bGwgc3BlZWQKLQotICBSRUFESU5HICYgMHgxMCA9IDB4MTA6IHNvZnR3YXJlIGV2ZW50IChzZWUgY29udHJvbDoxKQotICBSRUFESU5HICYgMHgxMCA9IDB4MDA6IG5vIHNvZnR3YXJlIGV2ZW50Ci0KLSAgUkVBRElORyAmIDB4MDggPSAweDA4OiB3YXRjaGRvZyBldmVudCAoc2VlIHdkb2c6MikKLSAgUkVBRElORyAmIDB4MDggPSAweDAwOiBubyB3YXRjaGRvZyBldmVudAotCi0gIFJFQURJTkcgJiAweDAyID0gMHgwMjogdGhlcm1hbCBldmVudCAoc2VlIHRlbXAqOjEpCi0gIFJFQURJTkcgJiAweDAyID0gMHgwMDogbm8gdGhlcm1hbCBldmVudAotCi0gIFJFQURJTkcgJiAweDAxID0gMHgwMTogZmFuIGV2ZW50IChzZWUgZmFuKjoxKQotICBSRUFESU5HICYgMHgwMSA9IDB4MDA6IG5vIGZhbiBldmVudAotCi0gIFJFQURJTkcgJiAweDEzICEgMHgwMDogQUxFUlQgTEVEIGlzIGZsYXNoaW5nCi0KLSogY29udHJvbAotICBSRUFESU5HICYgMHgwMSA9IDB4MDE6IHNvZnR3YXJlIGV2ZW50Ci0gIFJFQURJTkcgJiAweDAxID0gMHgwMDogbm8gc29mdHdhcmUgZXZlbnQKLQotICBXUklUSU5HICYgMHgwMSA9IDB4MDE6IHNldCBzb2Z0d2FyZSBldmVudAotICBXUklUSU5HICYgMHgwMSA9IDB4MDA6IGNsZWFyIHNvZnR3YXJlIGV2ZW50Ci0KLSogd2F0Y2hkb2dfY29udHJvbAotICBSRUFESU5HICYgMHg4MCA9IDB4ODA6IHBvd2VyIG9mZiBvbiB3YXRjaGRvZyBldmVudCB3aGlsZSB0aGVybWFsIGV2ZW50Ci0gIFJFQURJTkcgJiAweDgwID0gMHgwMDogd2F0Y2hkb2cgcG93ZXIgb2ZmIGRpc2FibGVkIChqdXN0IHN5c3RlbSByZXNldCBlbmFibGVkKQotCi0gIFJFQURJTkcgJiAweDQwID0gMHg0MDogd2F0Y2hkb2cgdGltZWJhc2UgNjAgc2Vjb25kcyAoc2VlIGFsc28gd2RvZzoxKQotICBSRUFESU5HICYgMHg0MCA9IDB4MDA6IHdhdGNoZG9nIHRpbWViYXNlICAyIHNlY29uZHMKLQotICBSRUFESU5HICYgMHgxMCA9IDB4MTA6IHdhdGNoZG9nIGVuYWJsZWQKLSAgUkVBRElORyAmIDB4MTAgPSAweDAwOiB3YXRjaGRvZyBkaXNhYmxlZAotCi0gIFdSSVRJTkcgJiAweDgwID0gMHg4MDogZW5hYmxlICJwb3dlciBvZmYgb24gd2F0Y2hkb2cgZXZlbnQgd2hpbGUgdGhlcm1hbCBldmVudCIKLSAgV1JJVElORyAmIDB4ODAgPSAweDAwOiBkaXNhYmxlICJwb3dlciBvZmYgb24gd2F0Y2hkb2cgZXZlbnQgd2hpbGUgdGhlcm1hbCBldmVudCIKLQotICBXUklUSU5HICYgMHg0MCA9IDB4NDA6IHNldCB3YXRjaGRvZyB0aW1lYmFzZSB0byA2MCBzZWNvbmRzCi0gIFdSSVRJTkcgJiAweDQwID0gMHgwMDogc2V0IHdhdGNoZG9nIHRpbWViYXNlIHRvICAyIHNlY29uZHMKLQotICBXUklUSU5HICYgMHgyMCA9IDB4MjA6IGRpc2FibGUgd2F0Y2hkb2cKLQotICBXUklUSU5HICYgMHgxMCA9IDB4MTA6IGVuYWJsZSB3YXRjaGRvZyAvIHJlc3RhcnQgd2F0Y2hkb2cgdGltZQotCi0qIHdhdGNoZG9nX3N0YXRlCi0gIFJFQURJTkcgJiAweDAyID0gMHgwMjogd2F0Y2hkb2cgc3lzdGVtIHJlc2V0IG9jY3VycmVkCi0gIFJFQURJTkcgJiAweDAyID0gMHgwMDogbm8gd2F0Y2hkb2cgc3lzdGVtIHJlc2V0IG9jY3VycmVkCi0KLSAgV1JJVElORyAmIDB4MDIgPSAweDAyOiBjbGVhciB3YXRjaGRvZyBldmVudAotCi0qIHdhdGNoZG9nX3ByZXNldAotICBSRUFESU5HICYgMHhmZiA9IDB4Pz86IGNvbmZpZ3VyZWQgd2F0Y2ggZG9nIHRpbWUgaW4gdW5pdHMgKHNlZSB3ZG9nOjMgMHg0MCkKLQotICBXUklUSU5HICYgMHhmZiA9IDB4Pz86IGNvbmZpZ3VyZSB3YXRjaCBkb2cgdGltZSBpbiB1bml0cwotCi0qIGluKiAgICAgKDA6ICs1ViwgMTogKzEyViwgMjogb25ib2FyZCAzViBiYXR0ZXJ5KQotICBSRUFESU5HOiBhY3R1YWwgdm9sdGFnZSB2YWx1ZQotCi0qIHRlbXAqX3N0YXR1cyAgICgxOiBDUFUgc2Vuc29yLCAyOiBvbmJvYXJkIHNlbnNvciwgMzogYXV4aWxpYXJ5IHNlbnNvcikKLSAgUkVBRElORyAmIDB4MDIgPSAweDAyOiB0aGVybWFsIGV2ZW50IChvdmVydGVtcGVyYXR1cmUpCi0gIFJFQURJTkcgJiAweDAyID0gMHgwMDogbm8gdGhlcm1hbCBldmVudAotCi0gIFJFQURJTkcgJiAweDAxID0gMHgwMTogc2Vuc29yIGlzIHdvcmtpbmcKLSAgUkVBRElORyAmIDB4MDEgPSAweDAwOiBzZW5zb3IgaXMgZmF1bHR5Ci0KLSAgV1JJVElORyAmIDB4MDIgPSAweDAyOiBjbGVhciB0aGVybWFsIGV2ZW50Ci0KLSogdGVtcCpfaW5wdXQgICAoMTogQ1BVIHNlbnNvciwgMjogb25ib2FyZCBzZW5zb3IsIDM6IGF1eGlsaWFyeSBzZW5zb3IpCi0gIFJFQURJTkc6IGFjdHVhbCB0ZW1wZXJhdHVyZSB2YWx1ZQotCi0qIGZhbipfc3RhdHVzICAgKDE6IHBvd2VyIHN1cHBseSBmYW4sIDI6IENQVSBmYW4sIDM6IGF1eGlsaWFyeSBmYW4pCi0gIFJFQURJTkcgJiAweDA0ID0gMHgwNDogZmFuIGV2ZW50IChmYW4gZmF1bHQpCi0gIFJFQURJTkcgJiAweDA0ID0gMHgwMDogbm8gZmFuIGV2ZW50Ci0KLSAgV1JJVElORyAmIDB4MDQgPSAweDA0OiBjbGVhciBmYW4gZXZlbnQKLQotKiBmYW4qX2RpdiAoMTogcG93ZXIgc3VwcGx5IGZhbiwgMjogQ1BVIGZhbiwgMzogYXV4aWxpYXJ5IGZhbikKLSAgCURpdmlzb3JzIDIsNCBhbmQgOCBhcmUgc3VwcG9ydGVkLCBib3RoIGZvciByZWFkaW5nIGFuZCB3cml0aW5nCi0KLSogZmFuKl9wd20gICAoMTogcG93ZXIgc3VwcGx5IGZhbiwgMjogQ1BVIGZhbiwgMzogYXV4aWxpYXJ5IGZhbikKLSAgUkVBRElORyAmIDB4ZmYgPSAweDAwOiBmYW4gbWF5IGJlIHN3aXRjaGVkIG9mZgotICBSRUFESU5HICYgMHhmZiA9IDB4MDE6IGZhbiBtdXN0IHJ1biBhdCBsZWFzdCBhdCBtaW5pbXVtIHNwZWVkIChzdXBwbHk6IDZWKQotICBSRUFESU5HICYgMHhmZiA9IDB4ZmY6IGZhbiBtdXN0IHJ1biBhdCBtYXhpbXVtIHNwZWVkIChzdXBwbHk6IDEyVikKLSAgUkVBRElORyAmIDB4ZmYgPSAweD8/OiBmYW4gbXVzdCBydW4gYXQgbGVhc3QgYXQgZ2l2ZW4gc3BlZWQgKHN1cHBseTogNlYuLjEyVikKLQotICBXUklUSU5HICYgMHhmZiA9IDB4MDA6IGZhbiBtYXkgYmUgc3dpdGNoZWQgb2ZmCi0gIFdSSVRJTkcgJiAweGZmID0gMHgwMTogZmFuIG11c3QgcnVuIGF0IGxlYXN0IGF0IG1pbmltdW0gc3BlZWQgKHN1cHBseTogNlYpCi0gIFdSSVRJTkcgJiAweGZmID0gMHhmZjogZmFuIG11c3QgcnVuIGF0IG1heGltdW0gc3BlZWQgKHN1cHBseTogMTJWKQotICBXUklUSU5HICYgMHhmZiA9IDB4Pz86IGZhbiBtdXN0IHJ1biBhdCBsZWFzdCBhdCBnaXZlbiBzcGVlZCAoc3VwcGx5OiA2Vi4uMTJWKQotCi0qIGZhbipfaW5wdXQgICAoMTogcG93ZXIgc3VwcGx5IGZhbiwgMjogQ1BVIGZhbiwgMzogYXV4aWxpYXJ5IGZhbikKLSAgUkVBRElORzogYWN0dWFsIFJQTSB2YWx1ZQotCi0KLUxpbWl0YXRpb25zCi0tLS0tLS0tLS0tLQotCi0qIE1lYXN1cmluZyBmYW4gc3BlZWQKLUl0IHNlZW1zIHRoYXQgdGhlIGNoaXAgY291bnRzICJyaXBwbGVzIiAodHlwaWNhbCBmYW5zIHByb2R1Y2UgMiByaXBwbGVzIHBlcgotcm90YXRpb24gd2hpbGUgVkVSQVggZmFucyBwcm9kdWNlIDE4KSBpbiBhIDktYml0IHJlZ2lzdGVyLiBUaGlzIHJlZ2lzdGVyIGlzCi1yZWFkIG91dCBldmVyeSBzZWNvbmQsIHRoZW4gdGhlIHJpcHBsZSBwcmVzY2FsZXIgKDIsIDQgb3IgOCkgaXMgYXBwbGllZCBhbmQKLXRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSA4IGJpdCBvdXRwdXQgcmVnaXN0ZXIuIER1ZSB0byB0aGUgbGltaXRhdGlvbiBvZgotdGhlIGNvdW50aW5nIHJlZ2lzdGVyIHRvIDkgYml0cywgaXQgaXMgaW1wb3NzaWJsZSB0byBtZWFzdXJlIGEgVkVSQVggZmFuCi1wcm9wZXJseSAoZXZlbiB3aXRoIGEgcHJlc2NhbGVyIG9mIDgpLiBBdCBpdHMgbWF4aW11bSBzcGVlZCBvZiAzNTAwIFJQTSB0aGUKLWZhbiBwcm9kdWNlcyAxMDgwIHJpcHBsZXMgcGVyIHNlY29uZCB3aGljaCBjYXVzZXMgdGhlIGNvdW50aW5nIHJlZ2lzdGVyIHRvCi1vdmVyZmxvdyB0d2ljZSwgbGVhZGluZyB0byBvbmx5IDE4NiBSUE0uCi0KLSogTWVhc3VyaW5nIGlucHV0IHZvbHRhZ2VzCi1pbjIgKCJiYXR0ZXJ5IikgcmVwb3J0cyB0aGUgdm9sdGFnZSBvZiB0aGUgb25ib2FyZCBsaXRoaXVtIGJhdHRlcnkgYW5kIG5vdAotKzMuM1YgZnJvbSB0aGUgcG93ZXIgc3VwcGx5LgotCi0qIFVuZG9jdW1lbnRlZCBmZWF0dXJlcwotRnVqaXRzdS1TaWVtZW5zIENvbXB1dGVycyBoYXMgbm90IGRvY3VtZW50ZWQgYWxsIGZlYXR1cmVzIG9mIHRoZSBjaGlwIHNvCi1mYXIuIFRoZWlyIHNvZnR3YXJlLCBTeXN0ZW0gR3VhcmQsIHNob3dzIHRoYXQgdGhlcmUgYXJlIGEgc3RpbGwgc29tZQotZmVhdHVyZXMgd2hpY2ggY2Fubm90IGJlIGNvbnRyb2xsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbHRjNDIxNSBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjNDIxNQppbmRleCAyZTZhMjFlLi5jMTk2YTE4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzQyMTUKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjE1CkBAIC0yMiwxMiArMjIsMTMgQEAKIC0tLS0tLS0tLS0tCiAKIFRoaXMgZHJpdmVyIGRvZXMgbm90IHByb2JlIGZvciBMVEM0MjE1IGRldmljZXMsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHNvbWUKLW9mIHRoZSBwb3NzaWJsZSBhZGRyZXNzZXMgYXJlIHVuZnJpZW5kbHkgdG8gcHJvYmluZy4gWW91IHdpbGwgbmVlZCB0byB1c2UKLXRoZSAiZm9yY2UiIHBhcmFtZXRlciB0byB0ZWxsIHRoZSBkcml2ZXIgd2hlcmUgdG8gZmluZCB0aGUgZGV2aWNlLgorb2YgdGhlIHBvc3NpYmxlIGFkZHJlc3NlcyBhcmUgdW5mcmllbmRseSB0byBwcm9iaW5nLiBZb3Ugd2lsbCBoYXZlIHRvCitpbnN0YW50aWF0ZSB0aGUgZGV2aWNlcyBleHBsaWNpdGx5LgogCiBFeGFtcGxlOiB0aGUgZm9sbG93aW5nIHdpbGwgbG9hZCB0aGUgZHJpdmVyIGZvciBhbiBMVEM0MjE1IGF0IGFkZHJlc3MgMHg0NAogb24gSTJDIGJ1cyAjMDoKLSQgbW9kcHJvYmUgbHRjNDIxNSBmb3JjZT0wLDB4NDQKKyQgbW9kcHJvYmUgbHRjNDIxNQorJCBlY2hvIGx0YzQyMTUgMHg0NCA+IC9zeXMvYnVzL2kyYy9kZXZpY2VzL2kyYy0wL25ld19kZXZpY2UKIAogCiBTeXNmcyBlbnRyaWVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzQyNDUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzQyNDUKaW5kZXggYmFlN2EzYS4uMDI4MzhhNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjQ1CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjNDI0NQpAQCAtMjMsMTIgKzIzLDEzIEBACiAtLS0tLS0tLS0tLQogCiBUaGlzIGRyaXZlciBkb2VzIG5vdCBwcm9iZSBmb3IgTFRDNDI0NSBkZXZpY2VzLCBkdWUgdG8gdGhlIGZhY3QgdGhhdCBzb21lCi1vZiB0aGUgcG9zc2libGUgYWRkcmVzc2VzIGFyZSB1bmZyaWVuZGx5IHRvIHByb2JpbmcuIFlvdSB3aWxsIG5lZWQgdG8gdXNlCi10aGUgImZvcmNlIiBwYXJhbWV0ZXIgdG8gdGVsbCB0aGUgZHJpdmVyIHdoZXJlIHRvIGZpbmQgdGhlIGRldmljZS4KK29mIHRoZSBwb3NzaWJsZSBhZGRyZXNzZXMgYXJlIHVuZnJpZW5kbHkgdG8gcHJvYmluZy4gWW91IHdpbGwgaGF2ZSB0bworaW5zdGFudGlhdGUgdGhlIGRldmljZXMgZXhwbGljaXRseS4KIAogRXhhbXBsZTogdGhlIGZvbGxvd2luZyB3aWxsIGxvYWQgdGhlIGRyaXZlciBmb3IgYW4gTFRDNDI0NSBhdCBhZGRyZXNzIDB4MjMKIG9uIEkyQyBidXMgIzE6Ci0kIG1vZHByb2JlIGx0YzQyNDUgZm9yY2U9MSwweDIzCiskIG1vZHByb2JlIGx0YzQyNDUKKyQgZWNobyBsdGM0MjQ1IDB4MjMgPiAvc3lzL2J1cy9pMmMvZGV2aWNlcy9pMmMtMS9uZXdfZGV2aWNlCiAKIAogU3lzZnMgZW50cmllcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQppbmRleCBkY2JkNTAyLi44MmRlZjg4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQpAQCAtMzUzLDEwICszNTMsMjAgQEAKIAkJCQlVbml0OiBtaWNyb1dhdHQKIAkJCQlSTwogCi1wb3dlclsxLSpdX2F2ZXJhZ2VfaW50ZXJ2YWwJUG93ZXIgdXNlIGF2ZXJhZ2luZyBpbnRlcnZhbAorcG93ZXJbMS0qXV9hdmVyYWdlX2ludGVydmFsCVBvd2VyIHVzZSBhdmVyYWdpbmcgaW50ZXJ2YWwuICBBIHBvbGwKKwkJCQlub3RpZmljYXRpb24gaXMgc2VudCB0byB0aGlzIGZpbGUgaWYgdGhlCisJCQkJaGFyZHdhcmUgY2hhbmdlcyB0aGUgYXZlcmFnaW5nIGludGVydmFsLgogCQkJCVVuaXQ6IG1pbGxpc2Vjb25kcwogCQkJCVJXCiAKK3Bvd2VyWzEtKl1fYXZlcmFnZV9pbnRlcnZhbF9tYXgJTWF4aW11bSBwb3dlciB1c2UgYXZlcmFnaW5nIGludGVydmFsCisJCQkJVW5pdDogbWlsbGlzZWNvbmRzCisJCQkJUk8KKworcG93ZXJbMS0qXV9hdmVyYWdlX2ludGVydmFsX21pbglNaW5pbXVtIHBvd2VyIHVzZSBhdmVyYWdpbmcgaW50ZXJ2YWwKKwkJCQlVbml0OiBtaWxsaXNlY29uZHMKKwkJCQlSTworCiBwb3dlclsxLSpdX2F2ZXJhZ2VfaGlnaGVzdAlIaXN0b3JpY2FsIGF2ZXJhZ2UgbWF4aW11bSBwb3dlciB1c2UKIAkJCQlVbml0OiBtaWNyb1dhdHQKIAkJCQlSTwpAQCAtMzY1LDYgKzM3NSwxOCBAQAogCQkJCVVuaXQ6IG1pY3JvV2F0dAogCQkJCVJPCiAKK3Bvd2VyWzEtKl1fYXZlcmFnZV9tYXgJCUEgcG9sbCBub3RpZmljYXRpb24gaXMgc2VudCB0bworCQkJCXBvd2VyWzEtKl1fYXZlcmFnZSB3aGVuIHBvd2VyIHVzZQorCQkJCXJpc2VzIGFib3ZlIHRoaXMgdmFsdWUuCisJCQkJVW5pdDogbWljcm9XYXR0CisJCQkJUlcKKworcG93ZXJbMS0qXV9hdmVyYWdlX21pbgkJQSBwb2xsIG5vdGlmaWNhdGlvbiBpcyBzZW50IHRvCisJCQkJcG93ZXJbMS0qXV9hdmVyYWdlIHdoZW4gcG93ZXIgdXNlCisJCQkJc2lua3MgYmVsb3cgdGhpcyB2YWx1ZS4KKwkJCQlVbml0OiBtaWNyb1dhdHQKKwkJCQlSVworCiBwb3dlclsxLSpdX2lucHV0CQlJbnN0YW50YW5lb3VzIHBvd2VyIHVzZQogCQkJCVVuaXQ6IG1pY3JvV2F0dAogCQkJCVJPCkBAIC0zODEsNiArNDAzLDM5IEBACiAJCQkJYXZlcmFnZV9oaWdoZXN0IGFuZCBhdmVyYWdlX2xvd2VzdC4KIAkJCQlXTwogCitwb3dlclsxLSpdX2FjY3VyYWN5CQlBY2N1cmFjeSBvZiB0aGUgcG93ZXIgbWV0ZXIuCisJCQkJVW5pdDogUGVyY2VudAorCQkJCVJPCisKK3Bvd2VyWzEtKl1fYWxhcm0JCTEgaWYgdGhlIHN5c3RlbSBpcyBkcmF3aW5nIG1vcmUgcG93ZXIgdGhhbiB0aGUKKwkJCQljYXAgYWxsb3dzOyAwIG90aGVyd2lzZS4gIEEgcG9sbCBub3RpZmljYXRpb24gaXMKKwkJCQlzZW50IHRvIHRoaXMgZmlsZSB3aGVuIHRoZSBwb3dlciB1c2UgZXhjZWVkcyB0aGUKKwkJCQljYXAuICBUaGlzIGZpbGUgb25seSBhcHBlYXJzIGlmIHRoZSBjYXAgaXMga25vd24KKwkJCQl0byBiZSBlbmZvcmNlZCBieSBoYXJkd2FyZS4KKwkJCQlSTworCitwb3dlclsxLSpdX2NhcAkJCUlmIHBvd2VyIHVzZSByaXNlcyBhYm92ZSB0aGlzIGxpbWl0LCB0aGUKKwkJCQlzeXN0ZW0gc2hvdWxkIHRha2UgYWN0aW9uIHRvIHJlZHVjZSBwb3dlciB1c2UuCisJCQkJQSBwb2xsIG5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIHRoaXMgZmlsZSBpZiB0aGUKKwkJCQljYXAgaXMgY2hhbmdlZCBieSB0aGUgaGFyZHdhcmUuICBUaGUgKl9jYXAKKwkJCQlmaWxlcyBvbmx5IGFwcGVhciBpZiB0aGUgY2FwIGlzIGtub3duIHRvIGJlCisJCQkJZW5mb3JjZWQgYnkgaGFyZHdhcmUuCisJCQkJVW5pdDogbWljcm9XYXR0CisJCQkJUlcKKworcG93ZXJbMS0qXV9jYXBfaHlzdAkJTWFyZ2luIG9mIGh5c3RlcmVzaXMgYnVpbHQgYXJvdW5kIGNhcHBpbmcgYW5kCisJCQkJbm90aWZpY2F0aW9uLgorCQkJCVVuaXQ6IG1pY3JvV2F0dAorCQkJCVJXCisKK3Bvd2VyWzEtKl1fY2FwX21heAkJTWF4aW11bSBjYXAgdGhhdCBjYW4gYmUgc2V0LgorCQkJCVVuaXQ6IG1pY3JvV2F0dAorCQkJCVJPCisKK3Bvd2VyWzEtKl1fY2FwX21pbgkJTWluaW11bSBjYXAgdGhhdCBjYW4gYmUgc2V0LgorCQkJCVVuaXQ6IG1pY3JvV2F0dAorCQkJCVJPCisKICoqKioqKioqKioKICogRW5lcmd5ICoKICoqKioqKioqKioKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2luc3RhbnRpYXRpbmctZGV2aWNlcyBiL0RvY3VtZW50YXRpb24vaTJjL2luc3RhbnRpYXRpbmctZGV2aWNlcwppbmRleCBjNzQwYjdiLi5lODk0OTAyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9pbnN0YW50aWF0aW5nLWRldmljZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvaW5zdGFudGlhdGluZy1kZXZpY2VzCkBAIC0xODgsNyArMTg4LDcgQEAKIGRlbGV0ZWQuCiAKIEV4YW1wbGU6Ci0jIGVjaG8gZWVwcm9tIDB4NTAgPiAvc3lzL2NsYXNzL2kyYy1hZGFwdGVyL2kyYy0zL25ld19kZXZpY2UKKyMgZWNobyBlZXByb20gMHg1MCA+IC9zeXMvYnVzL2kyYy9kZXZpY2VzL2kyYy0zL25ld19kZXZpY2UKIAogV2hpbGUgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGluLWtlcm5lbCBkZXZpY2UgZGVjbGFyYXRpb24KIGNhbid0IGJlIGRvbmUsIHRoZXJlIGlzIGEgdmFyaWV0eSBvZiBjYXNlcyB3aGVyZSBpdCBjYW4gYmUgaGVscGZ1bDoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX21hZC50eHQgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl9tYWQudHh0CmluZGV4IDc0NDY4N2QuLjhhMzY2OTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX21hZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfbWFkLnR4dApAQCAtMTI4LDggKzEyOCw4IEBACiAgIFRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY2hhcmFjdGVyIGRldmljZSBmaWxlcyBhdXRvbWF0aWNhbGx5IHdpdGgKICAgdWRldiwgYSBydWxlIGxpa2UKIAotICAgIEtFUk5FTD0idW1hZCoiLCBOQU1FPSJpbmZpbmliYW5kLyVrIgotICAgIEtFUk5FTD0iaXNzbSoiLCBOQU1FPSJpbmZpbmliYW5kLyVrIgorICAgIEtFUk5FTD09InVtYWQqIiwgTkFNRT0iaW5maW5pYmFuZC8layIKKyAgICBLRVJORUw9PSJpc3NtKiIsIE5BTUU9ImluZmluaWJhbmQvJWsiCiAKICAgY2FuIGJlIHVzZWQuICBUaGlzIHdpbGwgY3JlYXRlIGRldmljZSBub2RlcyBuYW1lZAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy50eHQgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl92ZXJicy50eHQKaW5kZXggZjg0NzUwMS4uYWZlM2Y4ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnR4dApAQCAtNTgsNyArNTgsNyBAQAogICBUbyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGNoYXJhY3RlciBkZXZpY2UgZmlsZXMgYXV0b21hdGljYWxseSB3aXRoCiAgIHVkZXYsIGEgcnVsZSBsaWtlCiAKLSAgICBLRVJORUw9InV2ZXJicyoiLCBOQU1FPSJpbmZpbmliYW5kLyVrIgorICAgIEtFUk5FTD09InV2ZXJicyoiLCBOQU1FPSJpbmZpbmliYW5kLyVrIgogCiAgIGNhbiBiZSB1c2VkLiAgVGhpcyB3aWxsIGNyZWF0ZSBkZXZpY2Ugbm9kZXMgbmFtZWQKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CmluZGV4IGFhZmNhMGEuLjk0NzM3NDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKQEAgLTEzNSw2ICsxMzUsNyBAQAogCQkJCQk8aHR0cDovL21pa29ub3MuZGlhLnVuaXNhLml0L3RjZnM+CiAnbCcJNDAtN0YJbGludXgvdWRmX2ZzX2kuaAlpbiBkZXZlbG9wbWVudDoKIAkJCQkJPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXgtdWRmLz4KKydtJwkwMC0wOQlsaW51eC9tbXRpbWVyLmgKICdtJwlhbGwJbGludXgvbXRpby5oCQljb25mbGljdCEKICdtJwlhbGwJbGludXgvc291bmRjYXJkLmgJY29uZmxpY3QhCiAnbScJYWxsCWxpbnV4L3N5bmNsaW5rLmgJY29uZmxpY3QhCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lzZG4vSU5URVJGQUNFLkNBUEkgYi9Eb2N1bWVudGF0aW9uL2lzZG4vSU5URVJGQUNFLkNBUEkKaW5kZXggNjg2ZTEwNy4uNWZlOGRlNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pc2RuL0lOVEVSRkFDRS5DQVBJCisrKyBiL0RvY3VtZW50YXRpb24vaXNkbi9JTlRFUkZBQ0UuQ0FQSQpAQCAtNjAsMTAgKzYwLDkgQEAKIAogQWZ0ZXIgYSBzdWNjZXNzZnVsIHJldHVybiBmcm9tIHJlZ2lzdGVyX2FwcGwoKSwgQ0FQSSBtZXNzYWdlcyBmcm9tIHRoZQogYXBwbGljYXRpb24gbWF5IGJlIHBhc3NlZCB0byB0aGUgZHJpdmVyIGZvciB0aGUgZGV2aWNlIHZpYSBjYWxscyB0byB0aGUKLXNlbmRfbWVzc2FnZSgpIGNhbGxiYWNrIGZ1bmN0aW9uLiBUaGUgQ0FQSSBtZXNzYWdlIHRvIHNlbmQgaXMgc3RvcmVkIGluIHRoZQotZGF0YSBwb3J0aW9uIG9mIGFuIHNrYi4gQ29udmVyc2VseSwgdGhlIGRyaXZlciBtYXkgY2FsbCBLZXJuZWwgQ0FQSSdzCi1jYXBpX2N0cl9oYW5kbGVfbWVzc2FnZSgpIGZ1bmN0aW9uIHRvIHBhc3MgYSByZWNlaXZlZCBDQVBJIG1lc3NhZ2UgdG8gS2VybmVsCi1DQVBJIGZvciBmb3J3YXJkaW5nIHRvIGFuIGFwcGxpY2F0aW9uLCBzcGVjaWZ5aW5nIGl0cyBBcHBsSUQuCitzZW5kX21lc3NhZ2UoKSBjYWxsYmFjayBmdW5jdGlvbi4gQ29udmVyc2VseSwgdGhlIGRyaXZlciBtYXkgY2FsbCBLZXJuZWwKK0NBUEkncyBjYXBpX2N0cl9oYW5kbGVfbWVzc2FnZSgpIGZ1bmN0aW9uIHRvIHBhc3MgYSByZWNlaXZlZCBDQVBJIG1lc3NhZ2UgdG8KK0tlcm5lbCBDQVBJIGZvciBmb3J3YXJkaW5nIHRvIGFuIGFwcGxpY2F0aW9uLCBzcGVjaWZ5aW5nIGl0cyBBcHBsSUQuCiAKIERlcmVnaXN0cmF0aW9uIHJlcXVlc3RzIChDQVBJIG9wZXJhdGlvbiBDQVBJX1JFTEVBU0UpIGZyb20gYXBwbGljYXRpb25zIGFyZQogZm9yd2FyZGVkIGFzIGNhbGxzIHRvIHRoZSByZWxlYXNlX2FwcGwoKSBjYWxsYmFjayBmdW5jdGlvbiwgcGFzc2luZyB0aGUgc2FtZQpAQCAtMTQyLDYgKzE0MSw3IEBACiAJdG8gYWNjZXB0aW5nIG9yIHF1ZXVlaW5nIHRoZSBtZXNzYWdlLiBFcnJvcnMgb2NjdXJyaW5nIGR1cmluZyB0aGUKIAlhY3R1YWwgcHJvY2Vzc2luZyBvZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc2lnbmFsZWQgd2l0aCBhbgogCWFwcHJvcHJpYXRlIHJlcGx5IG1lc3NhZ2UuCisJTWF5IGJlIGNhbGxlZCBpbiBwcm9jZXNzIG9yIGludGVycnVwdCBjb250ZXh0LgogCUNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIG5vdCBzZXJpYWxpemVkIGJ5IEtlcm5lbCBDQVBJLCBpZS4gaXQgbXVzdAogCWJlIHByZXBhcmVkIHRvIGJlIHJlLWVudGVyZWQuCiAKQEAgLTE1NCw3ICsxNTQsOCBAQAogCXN5c3RlbSBlbnRyeSwgL3Byb2MvY2FwaS9jb250cm9sbGVycy88bj47IHdpbGwgYmUgY2FsbGVkIHdpdGggYQogCXBvaW50ZXIgdG8gdGhlIGRldmljZSdzIGNhcGlfY3RyIHN0cnVjdHVyZSBhcyB0aGUgbGFzdCAoZGF0YSkgYXJndW1lbnQKIAotTm90ZTogQ2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBuZXZlciBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCitOb3RlOiBDYWxsYmFjayBmdW5jdGlvbnMgZXhjZXB0IHNlbmRfbWVzc2FnZSgpIGFyZSBuZXZlciBjYWxsZWQgaW4gaW50ZXJydXB0Citjb250ZXh0LgogCiAtIHRvIGJlIGZpbGxlZCBpbiBiZWZvcmUgY2FsbGluZyBjYXBpX2N0cl9yZWFkeSgpOgogCkBAIC0xNzEsMTQgKzE3Miw0MCBAQAogCXZhbHVlIHRvIHJldHVybiBmb3IgQ0FQSV9HRVRfU0VSSUFMCiAKIAotNC4zIFRoZSBfY21zZyBTdHJ1Y3R1cmUKKzQuMyBTS0JzCisKK0NBUEkgbWVzc2FnZXMgYXJlIHBhc3NlZCBiZXR3ZWVuIEtlcm5lbCBDQVBJIGFuZCB0aGUgZHJpdmVyIHZpYSBzZW5kX21lc3NhZ2UoKQorYW5kIGNhcGlfY3RyX2hhbmRsZV9tZXNzYWdlKCksIHN0b3JlZCBpbiB0aGUgZGF0YSBwb3J0aW9uIG9mIGEgc29ja2V0IGJ1ZmZlcgorKHNrYikuICBFYWNoIHNrYiBjb250YWlucyBhIHNpbmdsZSBDQVBJIG1lc3NhZ2UgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBDQVBJIDIuMAorc3RhbmRhcmQuCisKK0ZvciB0aGUgZGF0YSB0cmFuc2ZlciBtZXNzYWdlcywgREFUQV9CM19SRVEgYW5kIERBVEFfQjNfSU5ELCB0aGUgYWN0dWFsCitwYXlsb2FkIGRhdGEgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgQ0FQSSBtZXNzYWdlIGl0c2VsZiB3aXRoaW4gdGhlIHNhbWUgc2tiLgorVGhlIERhdGEgYW5kIERhdGE2NCBwYXJhbWV0ZXJzIGFyZSBub3QgdXNlZCBmb3IgcHJvY2Vzc2luZy4gVGhlIERhdGE2NAorcGFyYW1ldGVyIG1heSBiZSBvbWl0dGVkIGJ5IHNldHRpbmcgdGhlIGxlbmd0aCBmaWVsZCBvZiB0aGUgQ0FQSSBtZXNzYWdlIHRvIDIyCitpbnN0ZWFkIG9mIDMwLgorCisKKzQuNCBUaGUgX2Ntc2cgU3RydWN0dXJlCiAKIChkZWNsYXJlZCBpbiA8bGludXgvaXNkbi9jYXBpdXRpbC5oPikKIAogVGhlIF9jbXNnIHN0cnVjdHVyZSBzdG9yZXMgdGhlIGNvbnRlbnRzIG9mIGEgQ0FQSSAyLjAgbWVzc2FnZSBpbiBhbiBlYXNpbHkKLWFjY2Vzc2libGUgZm9ybS4gSXQgY29udGFpbnMgbWVtYmVycyBmb3IgYWxsIHBvc3NpYmxlIENBUEkgMi4wIHBhcmFtZXRlcnMsIG9mCi13aGljaCBvbmx5IHRob3NlIGFwcGVhcmluZyBpbiB0aGUgbWVzc2FnZSB0eXBlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgYXJlCi1hY3R1YWxseSB1c2VkLiBVbnVzZWQgbWVtYmVycyBzaG91bGQgYmUgc2V0IHRvIHplcm8uCithY2Nlc3NpYmxlIGZvcm0uIEl0IGNvbnRhaW5zIG1lbWJlcnMgZm9yIGFsbCBwb3NzaWJsZSBDQVBJIDIuMCBwYXJhbWV0ZXJzLAoraW5jbHVkaW5nIHN1YnBhcmFtZXRlcnMgb2YgdGhlIEFkZGl0aW9uYWwgSW5mbyBhbmQgQiBQcm90b2NvbCBzdHJ1Y3R1cmVkCitwYXJhbWV0ZXJzLCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKKworKiBzZWNvbmQgQ2FsbGluZyBwYXJ0eSBudW1iZXIgKENPTk5FQ1RfSU5EKQorCisqIERhdGE2NCAoREFUQV9CM19SRVEgYW5kIERBVEFfQjNfSU5EKQorCisqIFNlbmRpbmcgY29tcGxldGUgKHN1YnBhcmFtZXRlciBvZiBBZGRpdGlvbmFsIEluZm8sIENPTk5FQ1RfUkVRIGFuZCBJTkZPX1JFUSkKKworKiBHbG9iYWwgQ29uZmlndXJhdGlvbiAoc3VicGFyYW1ldGVyIG9mIEIgUHJvdG9jb2wsIENPTk5FQ1RfUkVRLCBDT05ORUNUX1JFU1AKKyAgYW5kIFNFTEVDVF9CX1BST1RPQ09MX1JFUSkKKworT25seSB0aG9zZSBwYXJhbWV0ZXJzIGFwcGVhcmluZyBpbiB0aGUgbWVzc2FnZSB0eXBlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQKK2FyZSBhY3R1YWxseSB1c2VkLiBVbnVzZWQgbWVtYmVycyBzaG91bGQgYmUgc2V0IHRvIHplcm8uCiAKIE1lbWJlcnMgYXJlIG5hbWVkIGFmdGVyIHRoZSBDQVBJIDIuMCBzdGFuZGFyZCBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycyB0aGV5CiByZXByZXNlbnQuIFNlZSA8bGludXgvaXNkbi9jYXBpdXRpbC5oPiBmb3IgdGhlIGV4YWN0IHNwZWxsaW5nLiBNZW1iZXIgZGF0YQpAQCAtMTkwLDE4ICsyMTcsMTkgQEAKIAogdTMyICAgICAgICAgZm9yIENBUEkgcGFyYW1ldGVycyBvZiB0eXBlICdkd29yZCcKIAotX2NzdHJ1Y3QgICAgZm9yIENBUEkgcGFyYW1ldGVycyBvZiB0eXBlICdzdHJ1Y3QnIG5vdCBjb250YWluaW5nIGFueQotCSAgICB2YXJpYWJseS1zaXplZCAoc3RydWN0KSBzdWJwYXJhbWV0ZXJzIChlZy4gJ0NhbGxlZCBQYXJ0eSBOdW1iZXInKQorX2NzdHJ1Y3QgICAgZm9yIENBUEkgcGFyYW1ldGVycyBvZiB0eXBlICdzdHJ1Y3QnCiAJICAgIFRoZSBtZW1iZXIgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlciBpbgogCSAgICBDQVBJIGVuY29kaW5nIChsZW5ndGggKyBjb250ZW50KS4gSXQgbWF5IGFsc28gYmUgTlVMTCwgd2hpY2ggd2lsbAogCSAgICBiZSB0YWtlbiB0byByZXByZXNlbnQgYW4gZW1wdHkgKHplcm8gbGVuZ3RoKSBwYXJhbWV0ZXIuCisJICAgIFN1YnBhcmFtZXRlcnMgYXJlIHN0b3JlZCBpbiBlbmNvZGVkIGZvcm0gd2l0aGluIHRoZSBjb250ZW50IHBhcnQuCiAKLV9jbXN0cnVjdCAgIGZvciBDQVBJIHBhcmFtZXRlcnMgb2YgdHlwZSAnc3RydWN0JyBjb250YWluaW5nICdzdHJ1Y3QnCi0JICAgIHN1YnBhcmFtZXRlcnMgKCdBZGRpdGlvbmFsIEluZm8nIGFuZCAnQiBQcm90b2NvbCcpCitfY21zdHJ1Y3QgICBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbiBmb3IgQ0FQSSBwYXJhbWV0ZXJzIG9mIHR5cGUgJ3N0cnVjdCcKKwkgICAgKHVzZWQgb25seSBmb3IgdGhlICdBZGRpdGlvbmFsIEluZm8nIGFuZCAnQiBQcm90b2NvbCcgcGFyYW1ldGVycykKIAkgICAgVGhlIHJlcHJlc2VudGF0aW9uIGlzIGEgc2luZ2xlIGJ5dGUgY29udGFpbmluZyBvbmUgb2YgdGhlIHZhbHVlczoKLQkgICAgQ0FQSV9ERUZBVUxUOiB0aGUgcGFyYW1ldGVyIGlzIGVtcHR5Ci0JICAgIENBUElfQ09NUE9TRTogdGhlIHZhbHVlcyBvZiB0aGUgc3VicGFyYW1ldGVycyBhcmUgc3RvcmVkCi0JICAgIGluZGl2aWR1YWxseSBpbiB0aGUgY29ycmVzcG9uZGluZyBfY21zZyBzdHJ1Y3R1cmUgbWVtYmVycworCSAgICBDQVBJX0RFRkFVTFQ6IFRoZSBwYXJhbWV0ZXIgaXMgZW1wdHkvYWJzZW50LgorCSAgICBDQVBJX0NPTVBPU0U6IFRoZSBwYXJhbWV0ZXIgaXMgcHJlc2VudC4KKwkgICAgU3VicGFyYW1ldGVyIHZhbHVlcyBhcmUgc3RvcmVkIGluZGl2aWR1YWxseSBpbiB0aGUgY29ycmVzcG9uZGluZworCSAgICBfY21zZyBzdHJ1Y3R1cmUgbWVtYmVycy4KIAogRnVuY3Rpb25zIGNhcGlfY21zZzJtZXNzYWdlKCkgYW5kIGNhcGlfbWVzc2FnZTJjbXNnKCkgYXJlIHByb3ZpZGVkIHRvIGNvbnZlcnQKIG1lc3NhZ2VzIGJldHdlZW4gdGhlaXIgdHJhbnNwb3J0IGVuY29kaW5nIGRlc2NyaWJlZCBpbiB0aGUgQ0FQSSAyLjAgc3RhbmRhcmQKQEAgLTI5NywzICszMjUsMjYgQEAKIAliZSBOVUxMIGlmIHRoZSBjb21tYW5kL3N1YmNvbW1hbmQgaXMgbm90IG9uZSBvZiB0aG9zZSBkZWZpbmVkIGluIHRoZQogCUNBUEkgMi4wIHN0YW5kYXJkLgogCisKKzcuIERlYnVnZ2luZworCitUaGUgbW9kdWxlIGtlcm5lbGNhcGkgaGFzIGEgbW9kdWxlIHBhcmFtZXRlciBzaG93Y2FwaW1zZ3MgY29udHJvbGxpbmcgc29tZQorZGVidWdnaW5nIG91dHB1dCBwcm9kdWNlZCBieSB0aGUgbW9kdWxlLiBJdCBjYW4gb25seSBiZSBzZXQgd2hlbiB0aGUgbW9kdWxlIGlzCitsb2FkZWQsIHZpYSBhIHBhcmFtZXRlciAic2hvd2NhcGltc2dzPTxuPiIgdG8gdGhlIG1vZHByb2JlIGNvbW1hbmQsIGVpdGhlciBvbgordGhlIGNvbW1hbmQgbGluZSBvciBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCitJZiB0aGUgbG93ZXN0IGJpdCBvZiBzaG93Y2FwaW1zZ3MgaXMgc2V0LCBrZXJuZWxjYXBpIGxvZ3MgY29udHJvbGxlciBhbmQKK2FwcGxpY2F0aW9uIHVwIGFuZCBkb3duIGV2ZW50cy4KKworSW4gYWRkaXRpb24sIGV2ZXJ5IHJlZ2lzdGVyZWQgQ0FQSSBjb250cm9sbGVyIGhhcyBhbiBhc3NvY2lhdGVkIHRyYWNlZmxhZworcGFyYW1ldGVyIGNvbnRyb2xsaW5nIGhvdyBDQVBJIG1lc3NhZ2VzIHNlbnQgZnJvbSBhbmQgdG8gdGhhIGNvbnRyb2xsZXIgYXJlCitsb2dnZWQuIFRoZSB0cmFjZWZsYWcgcGFyYW1ldGVyIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZQorc2hvd2NhcGltc2dzIHBhcmFtZXRlciB3aGVuIHRoZSBjb250cm9sbGVyIGlzIHJlZ2lzdGVyZWQsIGJ1dCBjYW4gbGF0ZXIgYmUKK2NoYW5nZWQgdmlhIHRoZSBNQU5VRkFDVFVSRVJfUkVRIGNvbW1hbmQgS0NBUElfQ01EX1RSQUNFLgorCitJZiB0aGUgdmFsdWUgb2YgdHJhY2VmbGFnIGlzIG5vbi16ZXJvLCBDQVBJIG1lc3NhZ2VzIGFyZSBsb2dnZWQuCitEQVRBX0IzIG1lc3NhZ2VzIGFyZSBvbmx5IGxvZ2dlZCBpZiB0aGUgdmFsdWUgb2YgdHJhY2VmbGFnIGlzID4gMi4KKworSWYgdGhlIGxvd2VzdCBiaXQgb2YgdHJhY2VmbGFnIGlzIHNldCwgb25seSB0aGUgY29tbWFuZC9zdWJjb21tYW5kIGFuZCBtZXNzYWdlCitsZW5ndGggYXJlIGxvZ2dlZC4gT3RoZXJ3aXNlLCBrZXJuZWxjYXBpIGxvZ3MgYSByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZgordGhlIGVudGlyZSBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dCBiL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQKaW5kZXggZjMzNTViNi4uYmIzYmYzOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0CkBAIC02NSw2ICs2NSwyMiBAQAogSU5TVEFMTF9QQVRIIHNwZWNpZmllcyB3aGVyZSB0byBwbGFjZSB0aGUgdXBkYXRlZCBrZXJuZWwgYW5kIHN5c3RlbSBtYXAKIGltYWdlcy4gRGVmYXVsdCBpcyAvYm9vdCwgYnV0IHlvdSBjYW4gc2V0IGl0IHRvIG90aGVyIHZhbHVlcy4KIAorSU5TVEFMTEtFUk5FTAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luc3RhbGwgc2NyaXB0IGNhbGxlZCB3aGVuIHVzaW5nICJtYWtlIGluc3RhbGwiLgorVGhlIGRlZmF1bHQgbmFtZSBpcyAiaW5zdGFsbGtlcm5lbCIuCisKK1RoZSBzY3JpcHQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAgICAkMSAtIGtlcm5lbCB2ZXJzaW9uCisgICAgJDIgLSBrZXJuZWwgaW1hZ2UgZmlsZQorICAgICQzIC0ga2VybmVsIG1hcCBmaWxlCisgICAgJDQgLSBkZWZhdWx0IGluc3RhbGwgcGF0aCAodXNlIHJvb3QgZGlyZWN0b3J5IGlmIGJsYW5rKQorCitUaGUgaW1wbG1lbnRhdGlvbiBvZiAibWFrZSBpbnN0YWxsIiBpcyBhcmNoaXRlY3R1cmUgc3BlY2lmaWMKK2FuZCBpdCBtYXkgZGlmZmVyIGZyb20gdGhlIGFib3ZlLgorCitJTlNUQUxMS0VSTkVMIGlzIHByb3ZpZGVkIHRvIGVuYWJsZSB0aGUgcG9zc2liaWxpdHkgdG8KK3NwZWNpZnkgYSBjdXN0b20gaW5zdGFsbGVyIHdoZW4gY3Jvc3MgY29tcGlsaW5nIGEga2VybmVsLgogCiBNT0RMSUIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAppbmRleCBkNzZjZmQ4Li43MWM2MDJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKQEAgLTE4LDYgKzE4LDcgQEAKIAkgICAtLS0gMy45IERlcGVuZGVuY3kgdHJhY2tpbmcKIAkgICAtLS0gMy4xMCBTcGVjaWFsIFJ1bGVzCiAJICAgLS0tIDMuMTEgJChDQykgc3VwcG9ydCBmdW5jdGlvbnMKKwkgICAtLS0gMy4xMiAkKExEKSBzdXBwb3J0IGZ1bmN0aW9ucwogCiAJPT09IDQgSG9zdCBQcm9ncmFtIHN1cHBvcnQKIAkgICAtLS0gNC4xIFNpbXBsZSBIb3N0IFByb2dyYW0KQEAgLTQzNSwxNCArNDM2LDE0IEBACiAJVGhlIHNlY29uZCBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGlmIHN1cHBsaWVkIHdpbGwgYmUgdXNlZAogCWlmIGZpcnN0IGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQuCiAKLSAgICBsZC1vcHRpb24KLQlsZC1vcHRpb24gaXMgdXNlZCB0byBjaGVjayBpZiAkKENDKSB3aGVuIHVzZWQgdG8gbGluayBvYmplY3QgZmlsZXMKKyAgICBjYy1sZG9wdGlvbgorCWNjLWxkb3B0aW9uIGlzIHVzZWQgdG8gY2hlY2sgaWYgJChDQykgd2hlbiB1c2VkIHRvIGxpbmsgb2JqZWN0IGZpbGVzCiAJc3VwcG9ydHMgdGhlIGdpdmVuIG9wdGlvbi4gIEFuIG9wdGlvbmFsIHNlY29uZCBvcHRpb24gbWF5IGJlCiAJc3BlY2lmaWVkIGlmIGZpcnN0IG9wdGlvbiBhcmUgbm90IHN1cHBvcnRlZC4KIAogCUV4YW1wbGU6CiAJCSNhcmNoL2kzODYva2VybmVsL01ha2VmaWxlCi0JCXZzeXNjYWxsLWZsYWdzICs9ICQoY2FsbCBsZC1vcHRpb24sIC1XbCQoY29tbWEpLS1oYXNoLXN0eWxlPXN5c3YpCisJCXZzeXNjYWxsLWZsYWdzICs9ICQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKIAogCUluIHRoZSBhYm92ZSBleGFtcGxlLCB2c3lzY2FsbC1mbGFncyB3aWxsIGJlIGFzc2lnbmVkIHRoZSBvcHRpb24KIAktV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1zeXN2IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAkKENDKS4KQEAgLTU3MCw2ICs1NzEsMTkgQEAKIAkJCWVuZGlmCiAJCWVuZGlmCiAKKy0tLSAzLjEyICQoTEQpIHN1cHBvcnQgZnVuY3Rpb25zCisKKyAgICBsZC1vcHRpb24KKwlsZC1vcHRpb24gaXMgdXNlZCB0byBjaGVjayBpZiAkKExEKSBzdXBwb3J0cyB0aGUgc3VwcGxpZWQgb3B0aW9uLgorCWxkLW9wdGlvbiB0YWtlcyB0d28gb3B0aW9ucyBhcyBhcmd1bWVudHMuCisJVGhlIHNlY29uZCBhcmd1bWVudCBpcyBhbiBvcHRpb25hbCBvcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBpZiB0aGUKKwlmaXJzdCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBieSAkKExEKS4KKworCUV4YW1wbGU6CisJCSNNYWtlZmlsZQorCQlMREZMQUdTX3ZtbGludXggKz0gJChjYWxsIHJlYWxseS1sZC1vcHRpb24sIC1YKQorCisKID09PSA0IEhvc3QgUHJvZ3JhbSBzdXBwb3J0CiAKIEtidWlsZCBzdXBwb3J0cyBidWlsZGluZyBleGVjdXRhYmxlcyBvbiB0aGUgaG9zdCBmb3IgdXNlIGR1cmluZyB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggNmZhNzI5Mi4uOTEwN2IzOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTY3MSw2ICs2NzEsNyBAQAogCWVhcmx5cHJpbnRrPQlbWDg2LFNILEJMQUNLRklOXQogCQkJZWFybHlwcmludGs9dmdhCiAJCQllYXJseXByaW50az1zZXJpYWxbLHR0eVNuWyxiYXVkcmF0ZV1dCisJCQllYXJseXByaW50az10dHlTblssYmF1ZHJhdGVdCiAJCQllYXJseXByaW50az1kYmdwW2RlYnVnQ29udHJvbGxlciNdCiAKIAkJCUFwcGVuZCAiLGtlZXAiIHRvIG5vdCBkaXNhYmxlIGl0IHdoZW4gdGhlIHJlYWwgY29uc29sZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CmluZGV4IDZkMDM0ODcuLmFhZmNhYTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKQEAgLTE5OSwxOCArMTk5LDIyIEBACiAKIE5vdCBhbGwgYml0cyBpbiB0aGUgbWFzayBjYW4gYmUgbW9kaWZpZWQuICBOb3QgYWxsIGJpdHMgdGhhdCBjYW4gYmUKIG1vZGlmaWVkIGRvIGFueXRoaW5nLiAgTm90IGFsbCBob3Qga2V5cyBjYW4gYmUgaW5kaXZpZHVhbGx5IGNvbnRyb2xsZWQKLWJ5IHRoZSBtYXNrLiAgU29tZSBtb2RlbHMgZG8gbm90IHN1cHBvcnQgdGhlIG1hc2sgYXQgYWxsLCBhbmQgaW4gdGhvc2UKLW1vZGVscywgaG90IGtleXMgY2Fubm90IGJlIGNvbnRyb2xsZWQgaW5kaXZpZHVhbGx5LiAgVGhlIGJlaGF2aW91ciBvZgotdGhlIG1hc2sgaXMsIHRoZXJlZm9yZSwgaGlnaGx5IGRlcGVuZGVudCBvbiB0aGUgVGhpbmtQYWQgbW9kZWwuCitieSB0aGUgbWFzay4gIFNvbWUgbW9kZWxzIGRvIG5vdCBzdXBwb3J0IHRoZSBtYXNrIGF0IGFsbC4gIFRoZSBiZWhhdmlvdXIKK29mIHRoZSBtYXNrIGlzLCB0aGVyZWZvcmUsIGhpZ2hseSBkZXBlbmRlbnQgb24gdGhlIFRoaW5rUGFkIG1vZGVsLgorCitUaGUgZHJpdmVyIHdpbGwgZmlsdGVyIG91dCBhbnkgdW5tYXNrZWQgaG90a2V5cywgc28gZXZlbiBpZiB0aGUgZmlybXdhcmUKK2RvZXNuJ3QgYWxsb3cgZGlzYWJsaW5nIGFuIHNwZWNpZmljIGhvdGtleSwgdGhlIGRyaXZlciB3aWxsIG5vdCByZXBvcnQKK2V2ZW50cyBmb3IgdW5tYXNrZWQgaG90a2V5cy4KIAogTm90ZSB0aGF0IHVubWFza2luZyBzb21lIGtleXMgcHJldmVudHMgdGhlaXIgZGVmYXVsdCBiZWhhdmlvci4gIEZvcgogZXhhbXBsZSwgaWYgRm4rRjUgaXMgdW5tYXNrZWQsIHRoYXQga2V5IHdpbGwgbm8gbG9uZ2VyIGVuYWJsZS9kaXNhYmxlCi1CbHVldG9vdGggYnkgaXRzZWxmLgorQmx1ZXRvb3RoIGJ5IGl0c2VsZiBpbiBmaXJtd2FyZS4KIAotTm90ZSBhbHNvIHRoYXQgbm90IGFsbCBGbiBrZXkgY29tYmluYXRpb25zIGFyZSBzdXBwb3J0ZWQgdGhyb3VnaCBBQ1BJLgotRm9yIGV4YW1wbGUsIG9uIHRoZSBYNDAsIHRoZSBicmlnaHRuZXNzLCB2b2x1bWUgYW5kICJBY2Nlc3MgSUJNIiBidXR0b25zCi1kbyBub3QgZ2VuZXJhdGUgQUNQSSBldmVudHMgZXZlbiB3aXRoIHRoaXMgZHJpdmVyLiAgVGhleSAqY2FuKiBiZSB1c2VkCi10aHJvdWdoIHRoZSAiVGhpbmtQYWQgQnV0dG9ucyIgdXRpbGl0eSwgc2VlIGh0dHA6Ly93d3cubm9uZ251Lm9yZy90cGIvCitOb3RlIGFsc28gdGhhdCBub3QgYWxsIEZuIGtleSBjb21iaW5hdGlvbnMgYXJlIHN1cHBvcnRlZCB0aHJvdWdoIEFDUEkKK2RlcGVuZGluZyBvbiB0aGUgVGhpbmtQYWQgbW9kZWwgYW5kIGZpcm13YXJlIHZlcnNpb24uICBPbiB0aG9zZQorVGhpbmtQYWRzLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBzdXBwb3J0IHNvbWUgZXh0cmEgaG90a2V5cyBieQorcG9sbGluZyB0aGUgIkNNT1MgTlZSQU0iIGF0IGxlYXN0IDEwIHRpbWVzIHBlciBzZWNvbmQuICBUaGUgZHJpdmVyCithdHRlbXB0cyB0byBlbmFibGVzIHRoaXMgZnVuY3Rpb25hbGl0eSBhdXRvbWF0aWNhbGx5IHdoZW4gcmVxdWlyZWQuCiAKIHByb2NmcyBub3RlczoKIApAQCAtMjU1LDE4ICsyNTksMTEgQEAKIAkJMTogZG9lcyBub3RoaW5nCiAKIAlob3RrZXlfbWFzazoKLQkJYml0IG1hc2sgdG8gZW5hYmxlIGRyaXZlci1oYW5kbGluZyAoYW5kIGRlcGVuZGluZyBvbgorCQliaXQgbWFzayB0byBlbmFibGUgcmVwb3J0aW5nIChhbmQgZGVwZW5kaW5nIG9uCiAJCXRoZSBmaXJtd2FyZSwgQUNQSSBldmVudCBnZW5lcmF0aW9uKSBmb3IgZWFjaCBob3Qga2V5CiAJCShzZWUgYWJvdmUpLiAgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGhvdCBrZXlzCiAJCW1hc2ssIGFuZCBhbGxvd3Mgb25lIHRvIG1vZGlmeSBpdC4KIAotCQlOb3RlOiB3aGVuIE5WUkFNIHBvbGxpbmcgaXMgYWN0aXZlLCB0aGUgZmlybXdhcmUgbWFzawotCQl3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSByZXR1cm5lZCBieQotCQlob3RrZXlfbWFzay4gIFRoZSBkcml2ZXIgd2lsbCByZXRhaW4gZW5hYmxlZCBiaXRzIGZvcgotCQlob3RrZXlzIHRoYXQgYXJlIHVuZGVyIE5WUkFNIHBvbGxpbmcgZXZlbiBpZiB0aGUKLQkJZmlybXdhcmUgcmVmdXNlcyB0aGVtLCBhbmQgd2lsbCBub3Qgc2V0IHRoZXNlIGJpdHMgb24KLQkJdGhlIGZpcm13YXJlIGhvdCBrZXkgbWFzay4KLQogCWhvdGtleV9hbGxfbWFzazoKIAkJYml0IG1hc2sgdGhhdCBzaG91bGQgZW5hYmxlIGV2ZW50IHJlcG9ydGluZyBmb3IgYWxsCiAJCXN1cHBvcnRlZCBob3Qga2V5cywgd2hlbiBlY2hvZWQgdG8gaG90a2V5X21hc2sgYWJvdmUuCkBAIC0yNzksNyArMjc2LDggQEAKIAkJYml0IG1hc2sgdGhhdCBzaG91bGQgZW5hYmxlIGV2ZW50IHJlcG9ydGluZyBmb3IgYWxsCiAJCXN1cHBvcnRlZCBob3Qga2V5cywgZXhjZXB0IHRob3NlIHdoaWNoIGFyZSBhbHdheXMKIAkJaGFuZGxlZCBieSB0aGUgZmlybXdhcmUgYW55d2F5LiAgRWNobyBpdCB0bwotCQlob3RrZXlfbWFzayBhYm92ZSwgdG8gdXNlLgorCQlob3RrZXlfbWFzayBhYm92ZSwgdG8gdXNlLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBtYXNrCisJCXVzZWQgYnkgdGhlIGRyaXZlci4KIAogCWhvdGtleV9zb3VyY2VfbWFzazoKIAkJYml0IG1hc2sgdGhhdCBzZWxlY3RzIHdoaWNoIGhvdCBrZXlzIHdpbGwgdGhlIGRyaXZlcgpAQCAtMjg3LDkgKzI4NSwxMCBAQAogCQliYXNlZCBvbiB0aGUgY2FwYWJpbGl0aWVzIHJlcG9ydGVkIGJ5IHRoZSBBQ1BJIGZpcm13YXJlLAogCQlidXQgaXQgY2FuIGJlIG92ZXJyaWRkZW4gYXQgcnVudGltZS4KIAotCQlIb3Qga2V5cyB3aG9zZSBiaXRzIGFyZSBzZXQgaW4gYm90aCBob3RrZXlfc291cmNlX21hc2sKLQkJYW5kIGFsc28gb24gaG90a2V5X21hc2sgYXJlIHBvbGxlZCBmb3IgaW4gTlZSQU0uICBPbmx5IGEKLQkJZmV3IGhvdCBrZXlzIGFyZSBhdmFpbGFibGUgdGhyb3VnaCBDTU9TIE5WUkFNIHBvbGxpbmcuCisJCUhvdCBrZXlzIHdob3NlIGJpdHMgYXJlIHNldCBpbiBob3RrZXlfc291cmNlX21hc2sgYXJlCisJCXBvbGxlZCBmb3IgaW4gTlZSQU0sIGFuZCByZXBvcnRlZCBhcyBob3RrZXkgZXZlbnRzIGlmCisJCWVuYWJsZWQgaW4gaG90a2V5X21hc2suICBPbmx5IGEgZmV3IGhvdCBrZXlzIGFyZQorCQlhdmFpbGFibGUgdGhyb3VnaCBDTU9TIE5WUkFNIHBvbGxpbmcuCiAKIAkJV2FybmluZzogd2hlbiBpbiBOVlJBTSBtb2RlLCB0aGUgdm9sdW1lIHVwL2Rvd24vbXV0ZQogCQlrZXlzIGFyZSBzeW50aGVzaXplZCBhY2NvcmRpbmcgdG8gY2hhbmdlcyBpbiB0aGUgbWl4ZXIsCkBAIC01MjUsNiArNTI0LDcgQEAKIDB4MjMwNQkJU3lzdGVtIGlzIHdha2luZyB1cCBmcm9tIHN1c3BlbmQgdG8gZWplY3QgYmF5CiAweDI0MDQJCVN5c3RlbSBpcyB3YWtpbmcgdXAgZnJvbSBoaWJlcm5hdGlvbiB0byB1bmRvY2sKIDB4MjQwNQkJU3lzdGVtIGlzIHdha2luZyB1cCBmcm9tIGhpYmVybmF0aW9uIHRvIGVqZWN0IGJheQorMHg1MDEwCQlCcmlnaHRuZXNzIGxldmVsIGNoYW5nZWQvY29udHJvbCBldmVudAogCiBUaGUgYWJvdmUgZXZlbnRzIGFyZSBuZXZlciBwcm9wYWdhdGVkIGJ5IHRoZSBkcml2ZXIuCiAKQEAgLTUzMiw3ICs1MzIsNiBAQAogMHg0MDAzCQlVbmRvY2tlZCAoc2VlIDB4MngwNCksIGNhbiBzbGVlcCBhZ2FpbgogMHg1MDBCCQlUYWJsZXQgcGVuIGluc2VydGVkIGludG8gaXRzIHN0b3JhZ2UgYmF5CiAweDUwMEMJCVRhYmxldCBwZW4gcmVtb3ZlZCBmcm9tIGl0cyBzdG9yYWdlIGJheQotMHg1MDEwCQlCcmlnaHRuZXNzIGxldmVsIGNoYW5nZWQgKG5ld2VyIExlbm92byBCSU9TZXMpCiAKIFRoZSBhYm92ZSBldmVudHMgYXJlIHByb3BhZ2F0ZWQgYnkgdGhlIGRyaXZlci4KIApAQCAtNjIxLDYgKzYyMCw4IEBACiAyLiBEbyAqTk9UKiBsb2FkIHVwIEFDUEkgdmlkZW8sIGVuYWJsZSB0aGUgaG90a2V5cyBpbiB0aGlua3BhZC1hY3BpLAogICAgYW5kIG1hcCB0aGVtIHRvIEtFWV9CUklHSFRORVNTX1VQIGFuZCBLRVlfQlJJR0hUTkVTU19ET1dOLiAgUHJvY2VzcwogICAgdGhlc2Uga2V5cyBvbiB1c2Vyc3BhY2Ugc29tZWhvdyAoZS5nLiBieSBjYWxsaW5nIHhiYWNrbGlnaHQpLgorICAgVGhlIGRyaXZlciB3aWxsIGRvIHRoaXMgYXV0b21hdGljYWxseSBpZiBpdCBkZXRlY3RzIHRoYXQgQUNQSSB2aWRlbworICAgaGFzIGJlZW4gZGlzYWJsZWQuCiAKIAogQmx1ZXRvb3RoCkBAIC0xNDU5LDMgKzE0NjAsOCBAQAogMHgwMjA0MDA6CU1hcmtlciBmb3IgMTYgTEVEcyBzdXBwb3J0LiAgQWxzbywgTEVEcyB0aGF0IGFyZSBrbm93bgogCQl0byBub3QgZXhpc3QgaW4gYSBnaXZlbiBtb2RlbCBhcmUgbm90IHJlZ2lzdGVyZWQgd2l0aAogCQl0aGUgTEVEIHN5c2ZzIGNsYXNzIGFueW1vcmUuCisKKzB4MDIwNTAwOglVcGRhdGVkIGhvdGtleSBkcml2ZXIsIGhvdGtleV9tYXNrIGlzIGFsd2F5cyBhdmFpbGFibGUKKwkJYW5kIGl0IGlzIGFsd2F5cyBhYmxlIHRvIGRpc2FibGUgaG90IGtleXMuICBWZXJ5IG9sZAorCQl0aGlua3BhZHMgYXJlIHByb3Blcmx5IHN1cHBvcnRlZC4gIGhvdGtleV9iaW9zX21hc2sKKwkJaXMgZGVwcmVjYXRlZCBhbmQgbWFya2VkIGZvciByZW1vdmFsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LmMgYi9Eb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QuYwppbmRleCBiYTkzNzNmLi4wOThkZTViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QuYworKysgYi9Eb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgImxpbnV4L2xndWVzdF9sYXVuY2hlci5oIgogI2luY2x1ZGUgImxpbnV4L3ZpcnRpb19jb25maWcuaCIKLSNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSAibGludXgvdmlydGlvX25ldC5oIgogI2luY2x1ZGUgImxpbnV4L3ZpcnRpb19ibGsuaCIKICNpbmNsdWRlICJsaW51eC92aXJ0aW9fY29uc29sZS5oIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvZWVwcm9tIGIvRG9jdW1lbnRhdGlvbi9taXNjLWRldmljZXMvZWVwcm9tCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9lZXByb20KcmVuYW1lIHRvIERvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL2VlcHJvbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4Njg3NSBiL0RvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL21heDY4NzUKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4Njg3NQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9taXNjLWRldmljZXMvbWF4Njg3NQppbmRleCAxMGNhNDNjLi4xZTg5ZWUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9tYXg2ODc1CisrKyBiL0RvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL21heDY4NzUKQEAgLTQyLDEwICs0MiwxMiBAQAogCiBWYWxpZCBhZGRyZXNzZXMgZm9yIHRoZSBNQVg2ODc1IGFyZSAweDUwIGFuZCAweDUyLgogVmFsaWQgYWRkcmVzc2VzIGZvciB0aGUgTUFYNjg3NCBhcmUgMHg1MCwgMHg1MiwgMHg1NCBhbmQgMHg1Ni4KLVRoZSBkcml2ZXIgZG9lcyBub3QgcHJvYmUgYW55IGFkZHJlc3MsIHNvIHlvdSBtdXN0IGZvcmNlIHRoZSBhZGRyZXNzLgorVGhlIGRyaXZlciBkb2VzIG5vdCBwcm9iZSBhbnkgYWRkcmVzcywgc28geW91IGV4cGxpY2l0bHkgaW5zdGFudGlhdGUgdGhlCitkZXZpY2VzLgogCiBFeGFtcGxlOgotJCBtb2Rwcm9iZSBtYXg2ODc1IGZvcmNlPTAsMHg1MAorJCBtb2Rwcm9iZSBtYXg2ODc1CiskIGVjaG8gbWF4Njg3NSAweDUwID4gL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTAvbmV3X2RldmljZQogCiBUaGUgTUFYNjg3NC9NQVg2ODc1IGlnbm9yZXMgYWRkcmVzcyBiaXQgMCwgc28gdGhpcyBkcml2ZXIgYXR0YWNoZXMgdG8gbXVsdGlwbGUKIGFkZHJlc3Nlcy4gIEZvciBleGFtcGxlLCBmb3IgYWRkcmVzcyAweDUwLCBpdCBhbHNvIHJlc2VydmVzIDB4NTEuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGt0Z2VuLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CmluZGV4IGM2Y2Y0YTMuLjYxYmI2NDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CkBAIC05MCw2ICs5MCwxMSBAQAogIHBnc2V0ICJkc3RtYWMgMDA6MDA6MDA6MDA6MDA6MDAiICAgIHNldHMgTUFDIGRlc3RpbmF0aW9uIGFkZHJlc3MKICBwZ3NldCAic3JjbWFjIDAwOjAwOjAwOjAwOjAwOjAwIiAgICBzZXRzIE1BQyBzb3VyY2UgYWRkcmVzcwogCisgcGdzZXQgInF1ZXVlX21hcF9taW4gMCIgU2V0cyB0aGUgbWluIHZhbHVlIG9mIHR4IHF1ZXVlIGludGVydmFsCisgcGdzZXQgInF1ZXVlX21hcF9tYXggNyIgU2V0cyB0aGUgbWF4IHZhbHVlIG9mIHR4IHF1ZXVlIGludGVydmFsLCBmb3IgbXVsdGlxdWV1ZSBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgVG8gc2VsZWN0IHF1ZXVlIDEgb2YgYSBnaXZlbiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIHF1ZXVlX21hcF9taW49MSBhbmQgcXVldWVfbWFwX21heD0xCisKICBwZ3NldCAic3JjX21hY19jb3VudCAxIiBTZXRzIHRoZSBudW1iZXIgb2YgTUFDcyB3ZSdsbCByYW5nZSB0aHJvdWdoLiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICdtaW5pbXVtJyBNQUMgaXMgd2hhdCB5b3Ugc2V0IHdpdGggc3JjbWFjLgogCkBAIC0xMDEsNiArMTA2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQRFNUX1JORCwgVURQU1JDX1JORCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVEUERTVF9STkQsIE1BQ1NSQ19STkQsIE1BQ0RTVF9STkQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUExTX1JORCwgVklEX1JORCwgU1ZJRF9STkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVVFX01BUF9STkQgIyBxdWV1ZSBtYXAgcmFuZG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVVRV9NQVBfQ1BVICMgcXVldWUgbWFwIG1pcnJvcnMgc21wX3Byb2Nlc3Nvcl9pZCgpCisKIAogIHBnc2V0ICJ1ZHBfc3JjX21pbiA5IiAgIHNldCBVRFAgc291cmNlIHBvcnQgbWluLCBJZiA8IHVkcF9zcmNfbWF4LCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUgdGhyb3VnaCB0aGUgcG9ydCByYW5nZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90aW1lc3RhbXBpbmcvdGltZXN0YW1waW5nLmMgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdGltZXN0YW1waW5nL3RpbWVzdGFtcGluZy5jCmluZGV4IDQzZDE0MzEuLmE3OTM2ZmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90aW1lc3RhbXBpbmcvdGltZXN0YW1waW5nLmMKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RpbWVzdGFtcGluZy90aW1lc3RhbXBpbmcuYwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJbWVtc2V0KCZod3RzdGFtcCwgMCwgc2l6ZW9mKGh3dHN0YW1wKSk7CiAJc3RybmNweShod3RzdGFtcC5pZnJfbmFtZSwgaW50ZXJmYWNlLCBzaXplb2YoaHd0c3RhbXAuaWZyX25hbWUpKTsKIAlod3RzdGFtcC5pZnJfZGF0YSA9ICh2b2lkICopJmh3Y29uZmlnOwotCW1lbXNldCgmaHdjb25maWcsIDAsIHNpemVvZigmaHdjb25maWcpKTsKKwltZW1zZXQoJmh3Y29uZmlnLCAwLCBzaXplb2YoaHdjb25maWcpKTsKIAlod2NvbmZpZy50eF90eXBlID0KIAkJKHNvX3RpbWVzdGFtcGluZ19mbGFncyAmIFNPRl9USU1FU1RBTVBJTkdfVFhfSEFSRFdBUkUpID8KIAkJSFdUU1RBTVBfVFhfT04gOiBIV1RTVEFNUF9UWF9PRkY7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3Bvd2VyX3N1cHBseV9jbGFzcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3Bvd2VyX3N1cHBseV9jbGFzcy50eHQKaW5kZXggYzZjZDQ5NS4uOWYxNmM1MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9wb3dlcl9zdXBwbHlfY2xhc3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvcG93ZXJfc3VwcGx5X2NsYXNzLnR4dApAQCAtNzYsNiArNzYsMTEgQEAKIGRpc2NoYXJnaW5nIChpLmUuIHBvd2VyaW5nIGEgbG9hZCksIGV0Yy4pLiBUaGlzIGNvcnJlc3BvbmRzIHRvCiBCQVRURVJZX1NUQVRVU18qIHZhbHVlcywgYXMgZGVmaW5lZCBpbiBiYXR0ZXJ5LmguCiAKK0NIQVJHRV9UWVBFIC0gYmF0dGVyaWVzIGNhbiB0eXBpY2FsbHkgY2hhcmdlIGF0IGRpZmZlcmVudCByYXRlcy4KK1RoaXMgZGVmaW5lcyB0cmlja2xlIGFuZCBmYXN0IGNoYXJnZXMuICBGb3IgYmF0dGVyaWVzIHRoYXQKK2FyZSBhbHJlYWR5IGNoYXJnZWQgb3IgZGlzY2hhcmdpbmcsICduL2EnIGNhbiBiZSBkaXNwbGF5ZWQgKG9yCisndW5rbm93bicsIGlmIHRoZSBzdGF0dXMgaXMgbm90IGtub3duKS4KKwogSEVBTFRIIC0gcmVwcmVzZW50cyBoZWFsdGggb2YgdGhlIGJhdHRlcnksIHZhbHVlcyBjb3JyZXNwb25kcyB0bwogUE9XRVJfU1VQUExZX0hFQUxUSF8qLCBkZWZpbmVkIGluIGJhdHRlcnkuaC4KIApAQCAtMTA4LDYgKzExMyw4IEBACiBFTkVSR1lfRlVMTCwgRU5FUkdZX0VNUFRZIC0gc2FtZSBhcyBhYm92ZSBidXQgZm9yIGVuZXJneS4KIAogQ0FQQUNJVFkgLSBjYXBhY2l0eSBpbiBwZXJjZW50cy4KK0NBUEFDSVRZX0xFVkVMIC0gY2FwYWNpdHkgbGV2ZWwuIFRoaXMgY29ycmVzcG9uZHMgdG8KK1BPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF8qLgogCiBURU1QIC0gdGVtcGVyYXR1cmUgb2YgdGhlIHBvd2VyIHN1cHBseS4KIFRFTVBfQU1CSUVOVCAtIGFtYmllbnQgdGVtcGVyYXR1cmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvaHB0aW9wLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9ocHRpb3AudHh0CmluZGV4IGE2ZWI0YWQuLjk2MDUxNzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9ocHRpb3AudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9ocHRpb3AudHh0CkBAIC0zLDYgKzMsMjUgQEAKIENvbnRyb2xsZXIgUmVnaXN0ZXIgTWFwCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK0ZvciBSUjQ0eHggSW50ZWwgSU9QIGJhc2VkIGFkYXB0ZXJzLCB0aGUgY29udHJvbGxlciBJT1AgaXMgYWNjZXNzZWQgdmlhIFBDSSBCQVIwIGFuZCBCQVIyOgorCisgICAgIEJBUjAgb2Zmc2V0ICAgIFJlZ2lzdGVyCisgICAgICAgICAgICAweDExQzVDIExpbmsgSW50ZXJmYWNlIElSUSBTZXQKKyAgICAgICAgICAgIDB4MTFDNjAgTGluayBJbnRlcmZhY2UgSVJRIENsZWFyCisKKyAgICAgQkFSMiBvZmZzZXQgICAgUmVnaXN0ZXIKKyAgICAgICAgICAgIDB4MTAgICAgSW5ib3VuZCBNZXNzYWdlIFJlZ2lzdGVyIDAKKyAgICAgICAgICAgIDB4MTQgICAgSW5ib3VuZCBNZXNzYWdlIFJlZ2lzdGVyIDEKKyAgICAgICAgICAgIDB4MTggICAgT3V0Ym91bmQgTWVzc2FnZSBSZWdpc3RlciAwCisgICAgICAgICAgICAweDFDICAgIE91dGJvdW5kIE1lc3NhZ2UgUmVnaXN0ZXIgMQorICAgICAgICAgICAgMHgyMCAgICBJbmJvdW5kIERvb3JiZWxsIFJlZ2lzdGVyCisgICAgICAgICAgICAweDI0ICAgIEluYm91bmQgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgorICAgICAgICAgICAgMHgyOCAgICBJbmJvdW5kIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyCisgICAgICAgICAgICAweDMwICAgIE91dGJvdW5kIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIKKyAgICAgICAgICAgIDB4MzQgICAgT3V0Ym91bmQgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIKKyAgICAgICAgICAgIDB4NDAgICAgSW5ib3VuZCBRdWV1ZSBQb3J0CisgICAgICAgICAgICAweDQ0ICAgIE91dGJvdW5kIFF1ZXVlIFBvcnQKKwogRm9yIEludGVsIElPUCBiYXNlZCBhZGFwdGVycywgdGhlIGNvbnRyb2xsZXIgSU9QIGlzIGFjY2Vzc2VkIHZpYSBQQ0kgQkFSMDoKIAogICAgICBCQVIwIG9mZnNldCAgICBSZWdpc3RlcgpAQCAtOTMsNyArMTEyLDcgQEAKIAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgSGlnaFBvaW50IFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgSGlnaFBvaW50IFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiAgIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAppbmRleCAxYzhlYjQ1Li5mZDlhMmY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dApAQCAtNTIyLDcgKzUyMiw3IEBACiAgICAgcGNtX2RldnMgICAgICAgLSBOdW1iZXIgb2YgUENNIGRldmljZXMgYXNzaWduZWQgdG8gZWFjaCBjYXJkCiAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA9IDEsIHVwIHRvIDQpCiAgICAgcGNtX3N1YnN0cmVhbXMgLSBOdW1iZXIgb2YgUENNIHN1YnN0cmVhbXMgYXNzaWduZWQgdG8gZWFjaCBQQ00KLSAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gOCwgdXAgdG8gMTYpCisgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA9IDgsIHVwIHRvIDEyOCkKICAgICBocnRpbWVyICAgICAgICAtIFVzZSBocnRpbWVyICg9MSwgZGVmYXVsdCkgb3Igc3lzdGVtIHRpbWVyICg9MCkKICAgICBmYWtlX2J1ZmZlciAgICAtIEZha2UgYnVmZmVyIGFsbG9jYXRpb25zIChkZWZhdWx0ID0gMSkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dAppbmRleCBmMTcwOGI3Li40YzdmOWFlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dApAQCAtMjA5LDYgKzIwOSw3IEBACiAgIGxhcHRvcAlsYXB0b3Agd2l0aCBIUCBqYWNrIHNlbnNpbmcKICAgbW9iaWxlCW1vYmlsZSBkZXZpY2VzIHdpdGggSFAgamFjayBzZW5zaW5nCiAgIHRoaW5rcGFkCUxlbm92byBUaGlua3BhZCBYMzAwCisgIHRvdWNoc21hcnQJSFAgVG91Y2hzbWFydAogCiBBRDE4ODQKID09PT09PQpAQCAtMzU4LDYgKzM1OSw3IEBACiAgIDVzdGFjay1uby1mcAlEOTY1IDVzdGFjayB3aXRob3V0IGZyb250IHBhbmVsCiAgIGRlbGwtM3N0YWNrCURlbGwgRGltZW5zaW9uIEU1MjAKICAgZGVsbC1iaW9zCUZpeGVzIHdpdGggRGVsbCBCSU9TIHNldHVwCisgIHZvbGtub2IJRml4ZXMgd2l0aCB2b2x1bWUta25vYiB3aWRnZXQgMHgyNAogICBhdXRvCQlCSU9TIHNldHVwIChkZWZhdWx0KQogCiBTVEFDOTJIRDcxQioKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dAppbmRleCAxNDU4NDQ4Li42MjY4MjUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9mcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvZnMudHh0CkBAIC05NiwxMyArOTYsMTYgQEAKIG9mIGVycm9yIG1lc3NhZ2VzIGFib3V0IHJ1bm5pbmcgb3V0IG9mIGZpbGUgaGFuZGxlcywgeW91IG1pZ2h0CiB3YW50IHRvIGluY3JlYXNlIHRoaXMgbGltaXQuCiAKLVRoZSB0aHJlZSB2YWx1ZXMgaW4gZmlsZS1uciBkZW5vdGUgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQKLWZpbGUgaGFuZGxlcywgdGhlIG51bWJlciBvZiB1bnVzZWQgZmlsZSBoYW5kbGVzIGFuZCB0aGUgbWF4aW11bQotbnVtYmVyIG9mIGZpbGUgaGFuZGxlcy4gV2hlbiB0aGUgYWxsb2NhdGVkIGZpbGUgaGFuZGxlcyBjb21lCi1jbG9zZSB0byB0aGUgbWF4aW11bSwgYnV0IHRoZSBudW1iZXIgb2YgdW51c2VkIGZpbGUgaGFuZGxlcyBpcwotc2lnbmlmaWNhbnRseSBncmVhdGVyIHRoYW4gMCwgeW91J3ZlIGVuY291bnRlcmVkIGEgcGVhayBpbiB5b3VyIAotdXNhZ2Ugb2YgZmlsZSBoYW5kbGVzIGFuZCB5b3UgZG9uJ3QgbmVlZCB0byBpbmNyZWFzZSB0aGUgbWF4aW11bS4KK0hpc3RvcmljYWxseSwgdGhlIHRocmVlIHZhbHVlcyBpbiBmaWxlLW5yIGRlbm90ZWQgdGhlIG51bWJlciBvZgorYWxsb2NhdGVkIGZpbGUgaGFuZGxlcywgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgYnV0IHVudXNlZCBmaWxlCitoYW5kbGVzLCBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGUgaGFuZGxlcy4gTGludXggMi42IGFsd2F5cworcmVwb3J0cyAwIGFzIHRoZSBudW1iZXIgb2YgZnJlZSBmaWxlIGhhbmRsZXMgLS0gdGhpcyBpcyBub3QgYW4KK2Vycm9yLCBpdCBqdXN0IG1lYW5zIHRoYXQgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgZmlsZSBoYW5kbGVzCitleGFjdGx5IG1hdGNoZXMgdGhlIG51bWJlciBvZiB1c2VkIGZpbGUgaGFuZGxlcy4KIAorQXR0ZW1wdHMgdG8gYWxsb2NhdGUgbW9yZSBmaWxlIGRlc2NyaXB0b3JzIHRoYW4gZmlsZS1tYXggYXJlCityZXBvcnRlZCB3aXRoIHByaW50aywgbG9vayBmb3IgIlZGUzogZmlsZS1tYXggbGltaXQgPG51bWJlcj4KK3JlYWNoZWQiLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogbnJfb3BlbjoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IGIzZDhiNDkuLmEwMjhiOTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtMjIsNiArMjIsNyBAQAogLSBjYWxsaG9tZQkJICAgICBbIFMzOTAgb25seSBdCiAtIGF1dG9fbXNnbW5pCiAtIGNvcmVfcGF0dGVybgorLSBjb3JlX3BpcGVfbGltaXQKIC0gY29yZV91c2VzX3BpZAogLSBjdHJsLWFsdC1kZWwKIC0gZGVudHJ5LXN0YXRlCkBAIC0xMzUsNiArMTM2LDI3IEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK2NvcmVfcGlwZV9saW1pdDoKKworVGhpcyBzeXNjdGwgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4gY29yZV9wYXR0ZXJuIGlzIGNvbmZpZ3VyZWQgdG8gcGlwZSBjb3JlCitmaWxlcyB0byB1c2VyIHNwYWNlIGhlbHBlciBhICh3aGVuIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgY29yZV9wYXR0ZXJuIGlzIGEgJ3wnLAorc2VlIGFib3ZlKS4gIFdoZW4gY29sbGVjdGluZyBjb3JlcyB2aWEgYSBwaXBlIHRvIGFuIGFwcGxpY2F0aW9uLCBpdCBpcworb2NjYXNpb25hbGx5IHVzZWZ1bGwgZm9yIHRoZSBjb2xsZWN0aW5nIGFwcGxpY2F0aW9uIHRvIGdhdGhlciBkYXRhIGFib3V0IHRoZQorY3Jhc2hpbmcgcHJvY2VzcyBmcm9tIGl0cyAvcHJvYy9waWQgZGlyZWN0b3J5LiAgSW4gb3JkZXIgdG8gZG8gdGhpcyBzYWZlbHksIHRoZQora2VybmVsIG11c3Qgd2FpdCBmb3IgdGhlIGNvbGxlY3RpbmcgcHJvY2VzcyB0byBleGl0LCBzbyBhcyBub3QgdG8gcmVtb3ZlIHRoZQorY3Jhc2hpbmcgcHJvY2Vzc2VzIHByb2MgZmlsZXMgcHJlbWF0dXJlbHkuICBUaGlzIGluIHR1cm4gY3JlYXRlcyB0aGUgcG9zc2liaWxpdHkKK3RoYXQgYSBtaXNiZWhhdmluZyB1c2Vyc3BhY2UgY29sbGVjdGluZyBwcm9jZXNzIGNhbiBibG9jayB0aGUgcmVhcGluZyBvZiBhCitjcmFzaGVkIHByb2Nlc3Mgc2ltcGx5IGJ5IG5ldmVyIGV4aXRpbmcuICBUaGlzIHN5c2N0bCBkZWZlbmRzIGFnYWluc3QgdGhhdC4gIEl0CitkZWZpbmVzIGhvdyBtYW55IGNvbmN1cnJlbnQgY3Jhc2hpbmcgcHJvY2Vzc2VzIG1heSBiZSBwaXBlZCB0byB1c2VyIHNwYWNlCithcHBsaWNhdGlvbnMgaW4gcGFyYWxsZWwuICBJZiB0aGlzIHZhbHVlIGlzIGV4Y2VlZGVkLCB0aGVuIHRob3NlIGNyYXNoaW5nCitwcm9jZXNzZXMgYWJvdmUgdGhhdCB2YWx1ZSBhcmUgbm90ZWQgdmlhIHRoZSBrZXJuZWwgbG9nIGFuZCB0aGVpciBjb3JlcyBhcmUKK3NraXBwZWQuICAwIGlzIGEgc3BlY2lhbCB2YWx1ZSwgaW5kaWNhdGluZyB0aGF0IHVubGltaXRlZCBwcm9jZXNzZXMgbWF5IGJlCitjYXB0dXJlZCBpbiBwYXJhbGxlbCwgYnV0IHRoYXQgbm8gd2FpdGluZyB3aWxsIHRha2UgcGxhY2UgKGkuZS4gdGhlIGNvbGxlY3RpbmcKK3Byb2Nlc3MgaXMgbm90IGd1YXJhbnRlZWQgYWNjZXNzIHRvIC9wcm9jLzxjcmFoaW5nIHBpZD4vKS4gIFRoaXMgdmFsdWUgZGVmYXVsdHMKK3RvIDAuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIGNvcmVfdXNlc19waWQ6CiAKIFRoZSBkZWZhdWx0IGNvcmVkdW1wIGZpbGVuYW1lIGlzICJjb3JlIi4gIEJ5IHNldHRpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCBlNmZiMWVjLi5hNmUzNjBkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC0zMiw2ICszMiw4IEBACiAtIGxlZ2FjeV92YV9sYXlvdXQKIC0gbG93bWVtX3Jlc2VydmVfcmF0aW8KIC0gbWF4X21hcF9jb3VudAorLSBtZW1vcnlfZmFpbHVyZV9lYXJseV9raWxsCistIG1lbW9yeV9mYWlsdXJlX3JlY292ZXJ5CiAtIG1pbl9mcmVlX2tieXRlcwogLSBtaW5fc2xhYl9yYXRpbwogLSBtaW5fdW5tYXBwZWRfcmF0aW8KQEAgLTUzLDcgKzU1LDYgQEAKIC0gdmZzX2NhY2hlX3ByZXNzdXJlCiAtIHpvbmVfcmVjbGFpbV9tb2RlCiAKLQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogYmxvY2tfZHVtcApAQCAtMjc1LDYgKzI3Niw0NCBAQAogCiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA2NTUzNi4KIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCittZW1vcnlfZmFpbHVyZV9lYXJseV9raWxsOgorCitDb250cm9sIGhvdyB0byBraWxsIHByb2Nlc3NlcyB3aGVuIHVuY29ycmVjdGVkIG1lbW9yeSBlcnJvciAodHlwaWNhbGx5CithIDJiaXQgZXJyb3IgaW4gYSBtZW1vcnkgbW9kdWxlKSBpcyBkZXRlY3RlZCBpbiB0aGUgYmFja2dyb3VuZCBieSBoYXJkd2FyZQordGhhdCBjYW5ub3QgYmUgaGFuZGxlZCBieSB0aGUga2VybmVsLiBJbiBzb21lIGNhc2VzIChsaWtlIHRoZSBwYWdlCitzdGlsbCBoYXZpbmcgYSB2YWxpZCBjb3B5IG9uIGRpc2spIHRoZSBrZXJuZWwgd2lsbCBoYW5kbGUgdGhlIGZhaWx1cmUKK3RyYW5zcGFyZW50bHkgd2l0aG91dCBhZmZlY3RpbmcgYW55IGFwcGxpY2F0aW9ucy4gQnV0IGlmIHRoZXJlIGlzCitubyBvdGhlciB1cHRvZGF0ZSBjb3B5IG9mIHRoZSBkYXRhIGl0IHdpbGwga2lsbCB0byBwcmV2ZW50IGFueSBkYXRhCitjb3JydXB0aW9ucyBmcm9tIHByb3BhZ2F0aW5nLgorCisxOiBLaWxsIGFsbCBwcm9jZXNzZXMgdGhhdCBoYXZlIHRoZSBjb3JydXB0ZWQgYW5kIG5vdCByZWxvYWRhYmxlIHBhZ2UgbWFwcGVkCithcyBzb29uIGFzIHRoZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLiAgTm90ZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQKK2ZvciBhIGZldyB0eXBlcyBvZiBwYWdlcywgbGlrZSBrZXJuZWwgaW50ZXJuYWxseSBhbGxvY2F0ZWQgZGF0YSBvcgordGhlIHN3YXAgY2FjaGUsIGJ1dCB3b3JrcyBmb3IgdGhlIG1ham9yaXR5IG9mIHVzZXIgcGFnZXMuCisKKzA6IE9ubHkgdW5tYXAgdGhlIGNvcnJ1cHRlZCBwYWdlIGZyb20gYWxsIHByb2Nlc3NlcyBhbmQgb25seSBraWxsIGEgcHJvY2Vzcword2hvIHRyaWVzIHRvIGFjY2VzcyBpdC4KKworVGhlIGtpbGwgaXMgZG9uZSB1c2luZyBhIGNhdGNoYWJsZSBTSUdCVVMgd2l0aCBCVVNfTUNFRVJSX0FPLCBzbyBwcm9jZXNzZXMgY2FuCitoYW5kbGUgdGhpcyBpZiB0aGV5IHdhbnQgdG8uCisKK1RoaXMgaXMgb25seSBhY3RpdmUgb24gYXJjaGl0ZWN0dXJlcy9wbGF0Zm9ybXMgd2l0aCBhZHZhbmNlZCBtYWNoaW5lCitjaGVjayBoYW5kbGluZyBhbmQgZGVwZW5kcyBvbiB0aGUgaGFyZHdhcmUgY2FwYWJpbGl0aWVzLgorCitBcHBsaWNhdGlvbnMgY2FuIG92ZXJyaWRlIHRoaXMgc2V0dGluZyBpbmRpdmlkdWFsbHkgd2l0aCB0aGUgUFJfTUNFX0tJTEwgcHJjdGwKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbWVtb3J5X2ZhaWx1cmVfcmVjb3ZlcnkKKworRW5hYmxlIG1lbW9yeSBmYWlsdXJlIHJlY292ZXJ5ICh3aGVuIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0pCisKKzE6IEF0dGVtcHQgcmVjb3ZlcnkuCisKKzA6IEFsd2F5cyBwYW5pYyBvbiBhIG1lbW9yeSBmYWlsdXJlLgorCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBtaW5fZnJlZV9rYnl0ZXM6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQKaW5kZXggOTU3YjIyZi4uODE3OTY5MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLnR4dApAQCAtMTIzMSw2ICsxMjMxLDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNkZWZpbmUgX1NUUih4KSAjeAogI2RlZmluZSBTVFIoeCkgX1NUUih4KQpAQCAtMTI2NSw2ICsxMjY2LDcgQEAKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KIAorICAgICAgIHN0cmNhdChkZWJ1Z2ZzLCAiL3RyYWNpbmcvIik7CiAgICAgICAgZGVidWdmc19mb3VuZCA9IDE7CiAKICAgICAgICByZXR1cm4gZGVidWdmczsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vLmdpdGlnbm9yZSBiL0RvY3VtZW50YXRpb24vdm0vLmdpdGlnbm9yZQppbmRleCAzM2U4YTAyLi4wOWIxNjRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtLy5naXRpZ25vcmUKKysrIGIvRG9jdW1lbnRhdGlvbi92bS8uZ2l0aWdub3JlCkBAIC0xICsxLDIgQEAKK3BhZ2UtdHlwZXMKIHNsYWJpbmZvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL2h3cG9pc29uLnR4dCBiL0RvY3VtZW50YXRpb24vdm0vaHdwb2lzb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZmFkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2h3cG9pc29uLnR4dApAQCAtMCwwICsxLDEzNiBAQAorV2hhdCBpcyBod3BvaXNvbj8KKworVXBjb21pbmcgSW50ZWwgQ1BVcyBoYXZlIHN1cHBvcnQgZm9yIHJlY292ZXJpbmcgZnJvbSBzb21lIG1lbW9yeSBlcnJvcnMKKyhgYE1DQSByZWNvdmVyeScnKS4gVGhpcyByZXF1aXJlcyB0aGUgT1MgdG8gZGVjbGFyZSBhIHBhZ2UgInBvaXNvbmVkIiwKK2tpbGwgdGhlIHByb2Nlc3NlcyBhc3NvY2lhdGVkIHdpdGggaXQgYW5kIGF2b2lkIHVzaW5nIGl0IGluIHRoZSBmdXR1cmUuCisKK1RoaXMgcGF0Y2hraXQgaW1wbGVtZW50cyB0aGUgbmVjZXNzYXJ5IGluZnJhc3RydWN0dXJlIGluIHRoZSBWTS4KKworVG8gcXVvdGUgdGhlIG92ZXJ2aWV3IGNvbW1lbnQ6CisKKyAqIEhpZ2ggbGV2ZWwgbWFjaGluZSBjaGVjayBoYW5kbGVyLiBIYW5kbGVzIHBhZ2VzIHJlcG9ydGVkIGJ5IHRoZQorICogaGFyZHdhcmUgYXMgYmVpbmcgY29ycnVwdGVkIHVzdWFsbHkgZHVlIHRvIGEgMmJpdCBFQ0MgbWVtb3J5IG9yIGNhY2hlCisgKiBmYWlsdXJlLgorICoKKyAqIFRoaXMgZm9jdXNzZXMgb24gcGFnZXMgZGV0ZWN0ZWQgYXMgY29ycnVwdGVkIGluIHRoZSBiYWNrZ3JvdW5kLgorICogV2hlbiB0aGUgY3VycmVudCBDUFUgdHJpZXMgdG8gY29uc3VtZSBjb3JydXB0aW9uIHRoZSBjdXJyZW50bHkKKyAqIHJ1bm5pbmcgcHJvY2VzcyBjYW4ganVzdCBiZSBraWxsZWQgZGlyZWN0bHkgaW5zdGVhZC4gVGhpcyBpbXBsaWVzCisgKiB0aGF0IGlmIHRoZSBlcnJvciBjYW5ub3QgYmUgaGFuZGxlZCBmb3Igc29tZSByZWFzb24gaXQncyBzYWZlIHRvCisgKiBqdXN0IGlnbm9yZSBpdCBiZWNhdXNlIG5vIGNvcnJ1cHRpb24gaGFzIGJlZW4gY29uc3VtZWQgeWV0LiBJbnN0ZWFkCisgKiB3aGVuIHRoYXQgaGFwcGVucyBhbm90aGVyIG1hY2hpbmUgY2hlY2sgd2lsbCBoYXBwZW4uCisgKgorICogSGFuZGxlcyBwYWdlIGNhY2hlIHBhZ2VzIGluIHZhcmlvdXMgc3RhdGVzLiBUaGUgdHJpY2t5IHBhcnQKKyAqIGhlcmUgaXMgdGhhdCB3ZSBjYW4gYWNjZXNzIGFueSBwYWdlIGFzeW5jaHJvbm91cyB0byBvdGhlciBWTQorICogdXNlcnMsIGJlY2F1c2UgbWVtb3J5IGZhaWx1cmVzIGNvdWxkIGhhcHBlbiBhbnl0aW1lIGFuZCBhbnl3aGVyZSwKKyAqIHBvc3NpYmx5IHZpb2xhdGluZyBzb21lIG9mIHRoZWlyIGFzc3VtcHRpb25zLiBUaGlzIGlzIHdoeSB0aGlzIGNvZGUKKyAqIGhhcyB0byBiZSBleHRyZW1lbHkgY2FyZWZ1bC4gR2VuZXJhbGx5IGl0IHRyaWVzIHRvIHVzZSBub3JtYWwgbG9ja2luZworICogcnVsZXMsIGFzIGluIGdldCB0aGUgc3RhbmRhcmQgbG9ja3MsIGV2ZW4gaWYgdGhhdCBtZWFucyB0aGUKKyAqIGVycm9yIGhhbmRsaW5nIHRha2VzIHBvdGVudGlhbGx5IGEgbG9uZyB0aW1lLgorICoKKyAqIFNvbWUgb2YgdGhlIG9wZXJhdGlvbnMgaGVyZSBhcmUgc29tZXdoYXQgaW5lZmZpY2llbnQgYW5kIGhhdmUgbm9uCisgKiBsaW5lYXIgYWxnb3JpdGhtaWMgY29tcGxleGl0eSwgYmVjYXVzZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGhhdmUgbm90CisgKiBiZWVuIG9wdGltaXplZCBmb3IgdGhpcyBjYXNlLiBUaGlzIGlzIGluIHBhcnRpY3VsYXIgdGhlIGNhc2UKKyAqIGZvciB0aGUgbWFwcGluZyBmcm9tIGEgdm1hIHRvIGEgcHJvY2Vzcy4gU2luY2UgdGhpcyBjYXNlIGlzIGV4cGVjdGVkCisgKiB0byBiZSByYXJlIHdlIGhvcGUgd2UgY2FuIGdldCBhd2F5IHdpdGggdGhpcy4KKworVGhlIGNvZGUgY29uc2lzdHMgb2YgYSB0aGUgaGlnaCBsZXZlbCBoYW5kbGVyIGluIG1tL21lbW9yeS1mYWlsdXJlLmMsCithIG5ldyBwYWdlIHBvaXNvbiBiaXQgYW5kIHZhcmlvdXMgY2hlY2tzIGluIHRoZSBWTSB0byBoYW5kbGUgcG9pc29uZWQKK3BhZ2VzLgorCitUaGUgbWFpbiB0YXJnZXQgcmlnaHQgbm93IGlzIEtWTSBndWVzdHMsIGJ1dCBpdCB3b3JrcyBmb3IgYWxsIGtpbmRzCitvZiBhcHBsaWNhdGlvbnMuIEtWTSBzdXBwb3J0IHJlcXVpcmVzIGEgcmVjZW50IHFlbXUta3ZtIHJlbGVhc2UuCisKK0ZvciB0aGUgS1ZNIHVzZSB0aGVyZSB3YXMgbmVlZCBmb3IgYSBuZXcgc2lnbmFsIHR5cGUgc28gdGhhdAorS1ZNIGNhbiBpbmplY3QgdGhlIG1hY2hpbmUgY2hlY2sgaW50byB0aGUgZ3Vlc3Qgd2l0aCB0aGUgcHJvcGVyCithZGRyZXNzLiBUaGlzIGluIHRoZW9yeSBhbGxvd3Mgb3RoZXIgYXBwbGljYXRpb25zIHRvIGhhbmRsZQorbWVtb3J5IGZhaWx1cmVzIHRvby4gVGhlIGV4cGVjdGlvbiBpcyB0aGF0IG5lYXIgYWxsIGFwcGxpY2F0aW9ucword29uJ3QgZG8gdGhhdCwgYnV0IHNvbWUgdmVyeSBzcGVjaWFsaXplZCBvbmVzIG1pZ2h0LgorCistLS0KKworVGhlcmUgYXJlIHR3byAoYWN0dWFsbHkgdGhyZWUpIG1vZGkgbWVtb3J5IGZhaWx1cmUgcmVjb3ZlcnkgY2FuIGJlIGluOgorCit2bS5tZW1vcnlfZmFpbHVyZV9yZWNvdmVyeSBzeXNjdGwgc2V0IHRvIHplcm86CisJQWxsIG1lbW9yeSBmYWlsdXJlcyBjYXVzZSBhIHBhbmljLiBEbyBub3QgYXR0ZW1wdCByZWNvdmVyeS4KKwkob24geDg2IHRoaXMgY2FuIGJlIGFsc28gYWZmZWN0ZWQgYnkgdGhlIHRvbGVyYW50IGxldmVsIG9mIHRoZQorCU1DRSBzdWJzeXN0ZW0pCisKK2Vhcmx5IGtpbGwKKwkoY2FuIGJlIGNvbnRyb2xsZWQgZ2xvYmFsbHkgYW5kIHBlciBwcm9jZXNzKQorCVNlbmQgU0lHQlVTIHRvIHRoZSBhcHBsaWNhdGlvbiBhcyBzb29uIGFzIHRoZSBlcnJvciBpcyBkZXRlY3RlZAorCVRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyB3aG8gY2FuIHByb2Nlc3MgbWVtb3J5IGVycm9ycyBpbiBhIGdlbnRsZQorCXdheSAoZS5nLiBkcm9wIGFmZmVjdGVkIG9iamVjdCkKKwlUaGlzIGlzIHRoZSBtb2RlIHVzZWQgYnkgS1ZNIHFlbXUuCisKK2xhdGUga2lsbAorCVNlbmQgU0lHQlVTIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHJ1bnMgaW50byB0aGUgY29ycnVwdGVkIHBhZ2UuCisJVGhpcyBpcyBiZXN0IGZvciBtZW1vcnkgZXJyb3IgdW5hd2FyZSBhcHBsaWNhdGlvbnMgYW5kIGRlZmF1bHQKKwlOb3RlIHNvbWUgcGFnZXMgYXJlIGFsd2F5cyBoYW5kbGVkIGFzIGxhdGUga2lsbC4KKworLS0tCisKK1VzZXIgY29udHJvbDoKKwordm0ubWVtb3J5X2ZhaWx1cmVfcmVjb3ZlcnkKKwlTZWUgc3lzY3RsLnR4dAorCit2bS5tZW1vcnlfZmFpbHVyZV9lYXJseV9raWxsCisJRW5hYmxlIGVhcmx5IGtpbGwgbW9kZSBnbG9iYWxseQorCitQUl9NQ0VfS0lMTAorCVNldCBlYXJseS9sYXRlIGtpbGwgbW9kZS9yZXZlcnQgdG8gc3lzdGVtIGRlZmF1bHQKKwlhcmcxOiBQUl9NQ0VfS0lMTF9DTEVBUjogUmV2ZXJ0IHRvIHN5c3RlbSBkZWZhdWx0CisJYXJnMTogUFJfTUNFX0tJTExfU0VUOiBhcmcyIGRlZmluZXMgdGhyZWFkIHNwZWNpZmljIG1vZGUKKwkJUFJfTUNFX0tJTExfRUFSTFk6IEVhcmx5IGtpbGwKKwkJUFJfTUNFX0tJTExfTEFURTogIExhdGUga2lsbAorCQlQUl9NQ0VfS0lMTF9ERUZBVUxUOiBVc2Ugc3lzdGVtIGdsb2JhbCBkZWZhdWx0CitQUl9NQ0VfS0lMTF9HRVQKKwlyZXR1cm4gY3VycmVudCBtb2RlCisKKworLS0tCisKK1Rlc3Rpbmc6CisKK21hZHZpc2UoTUFEVl9QT0lTT04sIC4uLi4pCisJKGFzIHJvb3QpCisJUG9pc29uIGEgcGFnZSBpbiB0aGUgcHJvY2VzcyBmb3IgdGVzdGluZworCisKK2h3cG9pc29uLWluamVjdCBtb2R1bGUgdGhyb3VnaCBkZWJ1Z2ZzCisJL3N5cy9kZWJ1Zy9od3BvaXNvbi9jb3JydXB0LXBmbgorCitJbmplY3QgaHdwb2lzb24gZmF1bHQgYXQgUEZOIGVjaG9lZCBpbnRvIHRoaXMgZmlsZQorCisKK0FyY2hpdGVjdHVyZSBzcGVjaWZpYyBNQ0UgaW5qZWN0b3IKKworeDg2IGhhcyBtY2UtaW5qZWN0LCBtY2UtdGVzdAorCitTb21lIHBvcnRhYmxlIGh3cG9pc29uIHRlc3QgcHJvZ3JhbXMgaW4gbWNlLXRlc3QsIHNlZSBibG93LgorCistLS0KKworUmVmZXJlbmNlczoKKworaHR0cDovL2hhbG9iYXRlcy5kZS9tY2UtbGMwOS0yLnBkZgorCU92ZXJ2aWV3IHByZXNlbnRhdGlvbiBmcm9tIExpbnV4Q29uIDA5CisKK2dpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vdXRpbHMvY3B1L21jZS9tY2UtdGVzdC5naXQKKwlUZXN0IHN1aXRlIChod3BvaXNvbiBzcGVjaWZpYyBwb3J0YWJsZSB0ZXN0cyBpbiB0c3JjKQorCitnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL3V0aWxzL2NwdS9tY2UvbWNlLWluamVjdC5naXQKKwl4ODYgc3BlY2lmaWMgaW5qZWN0b3IKKworCistLS0KKworTGltaXRhdGlvbnM6CisKKy0gTm90IGFsbCBwYWdlIHR5cGVzIGFyZSBzdXBwb3J0ZWQgYW5kIG5ldmVyIHdpbGwuIE1vc3Qga2VybmVsIGludGVybmFsCitvYmplY3RzIGNhbm5vdCBiZSByZWNvdmVyZWQsIG9ubHkgTFJVIHBhZ2VzIGZvciBub3cuCistIFJpZ2h0IG5vdyBodWdlcGFnZSBzdXBwb3J0IGlzIG1pc3NpbmcuCisKKy0tLQorQW5kaSBLbGVlbiwgT2N0IDIwMDkKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9rc20udHh0IGIvRG9jdW1lbnRhdGlvbi92bS9rc20udHh0CmluZGV4IDcyYTIyZjYuLjI2MmQ4ZTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0va3NtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2tzbS50eHQKQEAgLTUyLDE1ICs1MiwxNSBAQAogcmVhZGFibGUgYnkgYWxsIGJ1dCB3cml0YWJsZSBvbmx5IGJ5IHJvb3Q6CiAKIG1heF9rZXJuZWxfcGFnZXMgLSBzZXQgdG8gbWF4aW11bSBudW1iZXIgb2Yga2VybmVsIHBhZ2VzIHRoYXQgS1NNIG1heSB1c2UKLSAgICAgICAgICAgICAgICAgICBlLmcuICJlY2hvIDIwMDAgPiAvc3lzL2tlcm5lbC9tbS9rc20vbWF4X2tlcm5lbF9wYWdlcyIKKyAgICAgICAgICAgICAgICAgICBlLmcuICJlY2hvIDEwMDAwMCA+IC9zeXMva2VybmVsL21tL2tzbS9tYXhfa2VybmVsX3BhZ2VzIgogICAgICAgICAgICAgICAgICAgIFZhbHVlIDAgaW1wb3NlcyBubyBsaW1pdCBvbiB0aGUga2VybmVsIHBhZ2VzIEtTTSBtYXkgdXNlOwogICAgICAgICAgICAgICAgICAgIGJ1dCBub3RlIHRoYXQgYW55IHByb2Nlc3MgdXNpbmcgTUFEVl9NRVJHRUFCTEUgY2FuIGNhdXNlCiAgICAgICAgICAgICAgICAgICAgS1NNIHRvIGFsbG9jYXRlIHRoZXNlIHBhZ2VzLCB1bnN3YXBwYWJsZSB1bnRpbCBpdCBleGl0cy4KLSAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAyMDAwIChjaG9zZW4gZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMpCisgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogcXVhcnRlciBvZiBtZW1vcnkgKGNob3NlbiB0byBub3QgcGluIHRvbyBtdWNoKQogCiBwYWdlc190b19zY2FuICAgIC0gaG93IG1hbnkgcHJlc2VudCBwYWdlcyB0byBzY2FuIGJlZm9yZSBrc21kIGdvZXMgdG8gc2xlZXAKLSAgICAgICAgICAgICAgICAgICBlLmcuICJlY2hvIDIwMCA+IC9zeXMva2VybmVsL21tL2tzbS9wYWdlc190b19zY2FuIgotICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDIwMCAoY2hvc2VuIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzKQorICAgICAgICAgICAgICAgICAgIGUuZy4gImVjaG8gMTAwID4gL3N5cy9rZXJuZWwvbW0va3NtL3BhZ2VzX3RvX3NjYW4iCisgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogMTAwIChjaG9zZW4gZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMpCiAKIHNsZWVwX21pbGxpc2VjcyAgLSBob3cgbWFueSBtaWxsaXNlY29uZHMga3NtZCBzaG91bGQgc2xlZXAgYmVmb3JlIG5leHQgc2NhbgogICAgICAgICAgICAgICAgICAgIGUuZy4gImVjaG8gMjAgPiAvc3lzL2tlcm5lbC9tbS9rc20vc2xlZXBfbWlsbGlzZWNzIgpAQCAtNzAsNyArNzAsOCBAQAogICAgICAgICAgICAgICAgICAgIHNldCAxIHRvIHJ1biBrc21kIGUuZy4gImVjaG8gMSA+IC9zeXMva2VybmVsL21tL2tzbS9ydW4iLAogICAgICAgICAgICAgICAgICAgIHNldCAyIHRvIHN0b3Aga3NtZCBhbmQgdW5tZXJnZSBhbGwgcGFnZXMgY3VycmVudGx5IG1lcmdlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgbGVhdmUgbWVyZ2VhYmxlIGFyZWFzIHJlZ2lzdGVyZWQgZm9yIG5leHQgcnVuCi0gICAgICAgICAgICAgICAgICAgRGVmYXVsdDogMSAoZm9yIGltbWVkaWF0ZSB1c2UgYnkgYXBwcyB3aGljaCByZWdpc3RlcikKKyAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAwIChtdXN0IGJlIGNoYW5nZWQgdG8gMSB0byBhY3RpdmF0ZSBLU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGlmIENPTkZJR19TWVNGUyBpcyBkaXNhYmxlZCkKIAogVGhlIGVmZmVjdGl2ZW5lc3Mgb2YgS1NNIGFuZCBNQURWX01FUkdFQUJMRSBpcyBzaG93biBpbiAvc3lzL2tlcm5lbC9tbS9rc20vOgogCkBAIC04Niw0ICs4Nyw0IEBACiBwcm9wb3J0aW9uIHRoZXJlIHdvdWxkIGFsc28gaW5kaWNhdGUgcG9vciB1c2Ugb2YgbWFkdmlzZSBNQURWX01FUkdFQUJMRS4KIAogSXppayBFaWR1cywKLUh1Z2ggRGlja2lucywgMzAgSnVseSAyMDA5CitIdWdoIERpY2tpbnMsIDI0IFNlcHQgMjAwOQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9sb2NraW5nIGIvRG9jdW1lbnRhdGlvbi92bS9sb2NraW5nCmluZGV4IGYzNjZmYTkuLjI1ZmFkYjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vbG9ja2luZworKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2xvY2tpbmcKQEAgLTgwLDcgKzgwLDcgQEAKIG1tIHN0YXJ0IHVwIC4uLiB0aGlzIGlzIGEgbG9vc2UgZm9ybSBvZiBzdGFiaWxpdHkgb24gbW1fdXNlcnMuIEZvcgogZXhhbXBsZSwgaXQgaXMgdXNlZCBpbiBjb3B5X21tIHRvIHByb3RlY3QgYWdhaW5zdCBhIHJhY2luZyB0bGJfZ2F0aGVyX21tdQogc2luZ2xlIGFkZHJlc3Mgc3BhY2Ugb3B0aW1pemF0aW9uLCBzbyB0aGF0IHRoZSB6YXBfcGFnZV9yYW5nZSAoZnJvbQotdm10cnVuY2F0ZSkgZG9lcyBub3QgbG9zZSBzZW5kaW5nIGlwaSdzIHRvIGNsb25lZCB0aHJlYWRzIHRoYXQgbWlnaHQgCit0cnVuY2F0ZSkgZG9lcyBub3QgbG9zZSBzZW5kaW5nIGlwaSdzIHRvIGNsb25lZCB0aHJlYWRzIHRoYXQgbWlnaHQKIGJlIHNwYXduZWQgdW5kZXJuZWF0aCBpdCBhbmQgZ28gdG8gdXNlciBtb2RlIHRvIGRyYWcgaW4gcHRlJ3MgaW50byB0bGJzLgogCiBzd2FwX2xvY2sKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vcGFnZS10eXBlcy5jIGIvRG9jdW1lbnRhdGlvbi92bS9wYWdlLXR5cGVzLmMKaW5kZXggM2VkYThlYS4uM2VjNGYyYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS9wYWdlLXR5cGVzLmMKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9wYWdlLXR5cGVzLmMKQEAgLTIsOSArMiwxMyBAQAogICogcGFnZS10eXBlczogVG9vbCBmb3IgcXVlcnlpbmcgcGFnZSBmbGFncwogICoKICAqIENvcHlyaWdodCAoQykgMjAwOSBJbnRlbCBjb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChDKSAyMDA5IFd1IEZlbmdndWFuZyA8ZmVuZ2d1YW5nLnd1QGludGVsLmNvbT4KKyAqCisgKiBBdXRob3JzOiBXdSBGZW5nZ3VhbmcgPGZlbmdndWFuZy53dUBpbnRlbC5jb20+CisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCiAgKi8KIAorI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTEzLDEyICsxNywzMyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGdldG9wdC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9lcnJuby5oPgogI2luY2x1ZGUgPHN5cy9mY250bC5oPgogCiAKIC8qCisgKiBwYWdlbWFwIGtlcm5lbCBBQkkgYml0cworICovCisKKyNkZWZpbmUgUE1fRU5UUllfQllURVMgICAgICBzaXplb2YodWludDY0X3QpCisjZGVmaW5lIFBNX1NUQVRVU19CSVRTICAgICAgMworI2RlZmluZSBQTV9TVEFUVVNfT0ZGU0VUICAgICg2NCAtIFBNX1NUQVRVU19CSVRTKQorI2RlZmluZSBQTV9TVEFUVVNfTUFTSyAgICAgICgoKDFMTCA8PCBQTV9TVEFUVVNfQklUUykgLSAxKSA8PCBQTV9TVEFUVVNfT0ZGU0VUKQorI2RlZmluZSBQTV9TVEFUVVMobnIpICAgICAgICgoKG5yKSA8PCBQTV9TVEFUVVNfT0ZGU0VUKSAmIFBNX1NUQVRVU19NQVNLKQorI2RlZmluZSBQTV9QU0hJRlRfQklUUyAgICAgIDYKKyNkZWZpbmUgUE1fUFNISUZUX09GRlNFVCAgICAoUE1fU1RBVFVTX09GRlNFVCAtIFBNX1BTSElGVF9CSVRTKQorI2RlZmluZSBQTV9QU0hJRlRfTUFTSyAgICAgICgoKDFMTCA8PCBQTV9QU0hJRlRfQklUUykgLSAxKSA8PCBQTV9QU0hJRlRfT0ZGU0VUKQorI2RlZmluZSBQTV9QU0hJRlQoeCkgICAgICAgICgoKHU2NCkgKHgpIDw8IFBNX1BTSElGVF9PRkZTRVQpICYgUE1fUFNISUZUX01BU0spCisjZGVmaW5lIFBNX1BGUkFNRV9NQVNLICAgICAgKCgxTEwgPDwgUE1fUFNISUZUX09GRlNFVCkgLSAxKQorI2RlZmluZSBQTV9QRlJBTUUoeCkgICAgICAgICgoeCkgJiBQTV9QRlJBTUVfTUFTSykKKworI2RlZmluZSBQTV9QUkVTRU5UICAgICAgICAgIFBNX1NUQVRVUyg0TEwpCisjZGVmaW5lIFBNX1NXQVAgICAgICAgICAgICAgUE1fU1RBVFVTKDJMTCkKKworCisvKgogICoga2VybmVsIHBhZ2UgZmxhZ3MKICAqLwogCkBAIC00Nyw3ICs3Miw5IEBACiAjZGVmaW5lIEtQRl9DT01QT1VORF9UQUlMCTE2CiAjZGVmaW5lIEtQRl9IVUdFCQkxNwogI2RlZmluZSBLUEZfVU5FVklDVEFCTEUJCTE4CisjZGVmaW5lIEtQRl9IV1BPSVNPTgkJMTkKICNkZWZpbmUgS1BGX05PUEFHRQkJMjAKKyNkZWZpbmUgS1BGX0tTTQkJCTIxCiAKIC8qIFszMi1dIGtlcm5lbCBoYWNraW5nIGFzc2lzdGFuY2VzICovCiAjZGVmaW5lIEtQRl9SRVNFUlZFRAkJMzIKQEAgLTk0LDcgKzEyMSw5IEBACiAJW0tQRl9DT01QT1VORF9UQUlMXQk9ICJUOmNvbXBvdW5kX3RhaWwiLAogCVtLUEZfSFVHRV0JCT0gIkc6aHVnZSIsCiAJW0tQRl9VTkVWSUNUQUJMRV0JPSAidTp1bmV2aWN0YWJsZSIsCisJW0tQRl9IV1BPSVNPTl0JCT0gIlg6aHdwb2lzb24iLAogCVtLUEZfTk9QQUdFXQkJPSAibjpub3BhZ2UiLAorCVtLUEZfS1NNXQkJPSAieDprc20iLAogCiAJW0tQRl9SRVNFUlZFRF0JCT0gInI6cmVzZXJ2ZWQiLAogCVtLUEZfTUxPQ0tFRF0JCT0gIm06bWxvY2tlZCIsCkBAIC0xMjYsNiArMTU1LDExIEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZwlvcHRfb2Zmc2V0W01BWF9BRERSX1JBTkdFU107CiBzdGF0aWMgdW5zaWduZWQgbG9uZwlvcHRfc2l6ZVtNQVhfQUREUl9SQU5HRVNdOwogCisjZGVmaW5lIE1BWF9WTUFTCTEwMjQwCitzdGF0aWMgaW50CQlucl92bWFzOworc3RhdGljIHVuc2lnbmVkIGxvbmcJcGdfc3RhcnRbTUFYX1ZNQVNdOworc3RhdGljIHVuc2lnbmVkIGxvbmcJcGdfZW5kW01BWF9WTUFTXTsKKwogI2RlZmluZSBNQVhfQklUX0ZJTFRFUlMJNjQKIHN0YXRpYyBpbnQJCW5yX2JpdF9maWx0ZXJzOwogc3RhdGljIHVpbnQ2NF90CQlvcHRfbWFza1tNQVhfQklUX0ZJTFRFUlNdOwpAQCAtMTMzLDkgKzE2NywxNSBAQAogCiBzdGF0aWMgaW50CQlwYWdlX3NpemU7CiAKLSNkZWZpbmUgUEFHRVNfQkFUQ0gJKDY0IDw8IDEwKQkvKiA2NGsgcGFnZXMgKi8KK3N0YXRpYyBpbnQJCXBhZ2VtYXBfZmQ7CiBzdGF0aWMgaW50CQlrcGFnZWZsYWdzX2ZkOwotc3RhdGljIHVpbnQ2NF90CQlrcGFnZWZsYWdzX2J1ZltLUEZfQllURVMgKiBQQUdFU19CQVRDSF07CisKK3N0YXRpYyBpbnQJCW9wdF9od3BvaXNvbjsKK3N0YXRpYyBpbnQJCW9wdF91bnBvaXNvbjsKKworc3RhdGljIGNoYXIJCSpod3BvaXNvbl9kZWJ1Z19mcyA9ICIvZGVidWcvaHdwb2lzb24iOworc3RhdGljIGludAkJaHdwb2lzb25faW5qZWN0X2ZkOworc3RhdGljIGludAkJaHdwb2lzb25fZm9yZ2V0X2ZkOwogCiAjZGVmaW5lIEhBU0hfU0hJRlQJMTMKICNkZWZpbmUgSEFTSF9TSVpFCSgxIDw8IEhBU0hfU0hJRlQpCkBAIC0xNTgsNiArMTk4LDExIEBACiAJdHlwZSBfX21pbjIgPSAoeSk7CQkJXAogCV9fbWluMSA8IF9fbWluMiA/IF9fbWluMSA6IF9fbWluMjsgfSkKIAorI2RlZmluZSBtYXhfdCh0eXBlLCB4LCB5KSAoewkJCVwKKwl0eXBlIF9fbWF4MSA9ICh4KTsJCQlcCisJdHlwZSBfX21heDIgPSAoeSk7CQkJXAorCV9fbWF4MSA+IF9fbWF4MiA/IF9fbWF4MSA6IF9fbWF4MjsgfSkKKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZXMybWIodW5zaWduZWQgbG9uZyBwYWdlcykKIHsKIAlyZXR1cm4gKHBhZ2VzICogcGFnZV9zaXplKSA+PiAyMDsKQEAgLTE3Myw2ICsyMTgsNzQgQEAKIAlleGl0KEVYSVRfRkFJTFVSRSk7CiB9CiAKK2ludCBjaGVja2VkX29wZW4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncykKK3sKKwlpbnQgZmQgPSBvcGVuKHBhdGhuYW1lLCBmbGFncyk7CisKKwlpZiAoZmQgPCAwKSB7CisJCXBlcnJvcihwYXRobmFtZSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlyZXR1cm4gZmQ7Cit9CisKKy8qCisgKiBwYWdlbWFwL2twYWdlZmxhZ3Mgcm91dGluZXMKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkb191NjRfcmVhZChpbnQgZmQsIGNoYXIgKm5hbWUsCisJCQkJIHVpbnQ2NF90ICpidWYsCisJCQkJIHVuc2lnbmVkIGxvbmcgaW5kZXgsCisJCQkJIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJbG9uZyBieXRlczsKKworCWlmIChpbmRleCA+IFVMT05HX01BWCAvIDgpCisJCWZhdGFsKCJpbmRleCBvdmVyZmxvdzogJWx1XG4iLCBpbmRleCk7CisKKwlpZiAobHNlZWsoZmQsIGluZGV4ICogOCwgU0VFS19TRVQpIDwgMCkgeworCQlwZXJyb3IobmFtZSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlieXRlcyA9IHJlYWQoZmQsIGJ1ZiwgY291bnQgKiA4KTsKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCXBlcnJvcihuYW1lKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlpZiAoYnl0ZXMgJSA4KQorCQlmYXRhbCgicGFydGlhbCByZWFkOiAlbHUgYnl0ZXNcbiIsIGJ5dGVzKTsKKworCXJldHVybiBieXRlcyAvIDg7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGtwYWdlZmxhZ3NfcmVhZCh1aW50NjRfdCAqYnVmLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBpbmRleCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGFnZXMpCit7CisJcmV0dXJuIGRvX3U2NF9yZWFkKGtwYWdlZmxhZ3NfZmQsIFBST0NfS1BBR0VGTEFHUywgYnVmLCBpbmRleCwgcGFnZXMpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlbWFwX3JlYWQodWludDY0X3QgKmJ1ZiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgaW5kZXgsCisJCQkJICB1bnNpZ25lZCBsb25nIHBhZ2VzKQoreworCXJldHVybiBkb191NjRfcmVhZChwYWdlbWFwX2ZkLCAiL3Byb2MvcGlkL3BhZ2VtYXAiLCBidWYsIGluZGV4LCBwYWdlcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2VtYXBfcGZuKHVpbnQ2NF90IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIHBmbjsKKworCWlmICh2YWwgJiBQTV9QUkVTRU5UKQorCQlwZm4gPSBQTV9QRlJBTUUodmFsKTsKKwllbHNlCisJCXBmbiA9IDA7CisKKwlyZXR1cm4gcGZuOworfQorCiAKIC8qCiAgKiBwYWdlIGZsYWcgbmFtZXMKQEAgLTIyMSwyOSArMzM0LDM5IEBACiAgKiBwYWdlIGxpc3QgYW5kIHN1bW1hcnkKICAqLwogCi1zdGF0aWMgdm9pZCBzaG93X3BhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVpbnQ2NF90IGZsYWdzKQorc3RhdGljIHZvaWQgc2hvd19wYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgdm9mZnNldCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdWludDY0X3QgZmxhZ3MpCiB7CiAJc3RhdGljIHVpbnQ2NF90ICAgICAgZmxhZ3MwOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHZvZmY7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5kZXg7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnQ7CiAKLQlpZiAoZmxhZ3MgPT0gZmxhZ3MwICYmIG9mZnNldCA9PSBpbmRleCArIGNvdW50KSB7CisJaWYgKGZsYWdzID09IGZsYWdzMCAmJiBvZmZzZXQgPT0gaW5kZXggKyBjb3VudCAmJgorCSAgICAoIW9wdF9waWQgfHwgdm9mZnNldCA9PSB2b2ZmICsgY291bnQpKSB7CiAJCWNvdW50Kys7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoY291bnQpCi0JCXByaW50ZigiJWx1XHQlbHVcdCVzXG4iLAorCWlmIChjb3VudCkgeworCQlpZiAob3B0X3BpZCkKKwkJCXByaW50ZigiJWx4XHQiLCB2b2ZmKTsKKwkJcHJpbnRmKCIlbHhcdCVseFx0JXNcbiIsCiAJCQkJaW5kZXgsIGNvdW50LCBwYWdlX2ZsYWdfbmFtZShmbGFnczApKTsKKwl9CiAKIAlmbGFnczAgPSBmbGFnczsKIAlpbmRleCAgPSBvZmZzZXQ7CisJdm9mZiAgID0gdm9mZnNldDsKIAljb3VudCAgPSAxOwogfQogCi1zdGF0aWMgdm9pZCBzaG93X3BhZ2UodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVpbnQ2NF90IGZsYWdzKQorc3RhdGljIHZvaWQgc2hvd19wYWdlKHVuc2lnbmVkIGxvbmcgdm9mZnNldCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVpbnQ2NF90IGZsYWdzKQogewotCXByaW50ZigiJWx1XHQlc1xuIiwgb2Zmc2V0LCBwYWdlX2ZsYWdfbmFtZShmbGFncykpOworCWlmIChvcHRfcGlkKQorCQlwcmludGYoIiVseFx0Iiwgdm9mZnNldCk7CisJcHJpbnRmKCIlbHhcdCVzXG4iLCBvZmZzZXQsIHBhZ2VfZmxhZ19uYW1lKGZsYWdzKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNob3dfc3VtbWFyeSh2b2lkKQpAQCAtMzIwLDYgKzQ0Myw2MiBAQAogCXJldHVybiBmbGFnczsKIH0KIAorc3RhdGljIHVpbnQ2NF90IGtwYWdlZmxhZ3NfZmxhZ3ModWludDY0X3QgZmxhZ3MpCit7CisJZmxhZ3MgPSBleHBhbmRfb3ZlcmxvYWRlZF9mbGFncyhmbGFncyk7CisKKwlpZiAoIW9wdF9yYXcpCisJCWZsYWdzID0gd2VsbF9rbm93bl9mbGFncyhmbGFncyk7CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKKy8qCisgKiBwYWdlIGFjdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBwcmVwYXJlX2h3cG9pc29uX2ZkKHZvaWQpCit7CisJY2hhciBidWZbMTAwXTsKKworCWlmIChvcHRfaHdwb2lzb24gJiYgIWh3cG9pc29uX2luamVjdF9mZCkgeworCQlzcHJpbnRmKGJ1ZiwgIiVzL2NvcnJ1cHQtcGZuIiwgaHdwb2lzb25fZGVidWdfZnMpOworCQlod3BvaXNvbl9pbmplY3RfZmQgPSBjaGVja2VkX29wZW4oYnVmLCBPX1dST05MWSk7CisJfQorCisJaWYgKG9wdF91bnBvaXNvbiAmJiAhaHdwb2lzb25fZm9yZ2V0X2ZkKSB7CisJCXNwcmludGYoYnVmLCAiJXMvcmVuZXctcGZuIiwgaHdwb2lzb25fZGVidWdfZnMpOworCQlod3BvaXNvbl9mb3JnZXRfZmQgPSBjaGVja2VkX29wZW4oYnVmLCBPX1dST05MWSk7CisJfQorfQorCitzdGF0aWMgaW50IGh3cG9pc29uX3BhZ2UodW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJY2hhciBidWZbMTAwXTsKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihidWYsICIweCVseFxuIiwgb2Zmc2V0KTsKKwlsZW4gPSB3cml0ZShod3BvaXNvbl9pbmplY3RfZmQsIGJ1ZiwgbGVuKTsKKwlpZiAobGVuIDwgMCkgeworCQlwZXJyb3IoImh3cG9pc29uIGluamVjdCIpOworCQlyZXR1cm4gbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bnBvaXNvbl9wYWdlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWNoYXIgYnVmWzEwMF07CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiMHglbHhcbiIsIG9mZnNldCk7CisJbGVuID0gd3JpdGUoaHdwb2lzb25fZm9yZ2V0X2ZkLCBidWYsIGxlbik7CisJaWYgKGxlbiA8IDApIHsKKwkJcGVycm9yKCJod3BvaXNvbiBmb3JnZXQiKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgKiBwYWdlIGZyYW1lIHdhbGtlcgpAQCAtMzUyLDczICs1MzEsMTI0IEBACiAJZXhpdChFWElUX0ZBSUxVUkUpOwogfQogCi1zdGF0aWMgdm9pZCBhZGRfcGFnZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdWludDY0X3QgZmxhZ3MpCitzdGF0aWMgdm9pZCBhZGRfcGFnZSh1bnNpZ25lZCBsb25nIHZvZmZzZXQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVpbnQ2NF90IGZsYWdzKQogewotCWZsYWdzID0gZXhwYW5kX292ZXJsb2FkZWRfZmxhZ3MoZmxhZ3MpOwotCi0JaWYgKCFvcHRfcmF3KQotCQlmbGFncyA9IHdlbGxfa25vd25fZmxhZ3MoZmxhZ3MpOworCWZsYWdzID0ga3BhZ2VmbGFnc19mbGFncyhmbGFncyk7CiAKIAlpZiAoIWJpdF9tYXNrX29rKGZsYWdzKSkKIAkJcmV0dXJuOwogCisJaWYgKG9wdF9od3BvaXNvbikKKwkJaHdwb2lzb25fcGFnZShvZmZzZXQpOworCWlmIChvcHRfdW5wb2lzb24pCisJCXVucG9pc29uX3BhZ2Uob2Zmc2V0KTsKKwogCWlmIChvcHRfbGlzdCA9PSAxKQotCQlzaG93X3BhZ2VfcmFuZ2Uob2Zmc2V0LCBmbGFncyk7CisJCXNob3dfcGFnZV9yYW5nZSh2b2Zmc2V0LCBvZmZzZXQsIGZsYWdzKTsKIAllbHNlIGlmIChvcHRfbGlzdCA9PSAyKQotCQlzaG93X3BhZ2Uob2Zmc2V0LCBmbGFncyk7CisJCXNob3dfcGFnZSh2b2Zmc2V0LCBvZmZzZXQsIGZsYWdzKTsKIAogCW5yX3BhZ2VzW2hhc2hfc2xvdChmbGFncyldKys7CiAJdG90YWxfcGFnZXMrKzsKIH0KIAotc3RhdGljIHZvaWQgd2Fsa19wZm4odW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBjb3VudCkKKyNkZWZpbmUgS1BBR0VGTEFHU19CQVRDSAkoNjQgPDwgMTApCS8qIDY0ayBwYWdlcyAqLworc3RhdGljIHZvaWQgd2Fsa19wZm4odW5zaWduZWQgbG9uZyB2b2Zmc2V0LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgaW5kZXgsCisJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKKwl1aW50NjRfdCBidWZbS1BBR0VGTEFHU19CQVRDSF07CiAJdW5zaWduZWQgbG9uZyBiYXRjaDsKLQl1bnNpZ25lZCBsb25nIG47CisJdW5zaWduZWQgbG9uZyBwYWdlczsKIAl1bnNpZ25lZCBsb25nIGk7CiAKLQlpZiAoaW5kZXggPiBVTE9OR19NQVggLyBLUEZfQllURVMpCi0JCWZhdGFsKCJpbmRleCBvdmVyZmxvdzogJWx1XG4iLCBpbmRleCk7CisJd2hpbGUgKGNvdW50KSB7CisJCWJhdGNoID0gbWluX3QodW5zaWduZWQgbG9uZywgY291bnQsIEtQQUdFRkxBR1NfQkFUQ0gpOworCQlwYWdlcyA9IGtwYWdlZmxhZ3NfcmVhZChidWYsIGluZGV4LCBiYXRjaCk7CisJCWlmIChwYWdlcyA9PSAwKQorCQkJYnJlYWs7CiAKLQlsc2VlayhrcGFnZWZsYWdzX2ZkLCBpbmRleCAqIEtQRl9CWVRFUywgU0VFS19TRVQpOworCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykKKwkJCWFkZF9wYWdlKHZvZmZzZXQgKyBpLCBpbmRleCArIGksIGJ1ZltpXSk7CisKKwkJaW5kZXggKz0gcGFnZXM7CisJCWNvdW50IC09IHBhZ2VzOworCX0KK30KKworI2RlZmluZSBQQUdFTUFQX0JBVENICSg2NCA8PCAxMCkKK3N0YXRpYyB2b2lkIHdhbGtfdm1hKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJdWludDY0X3QgYnVmW1BBR0VNQVBfQkFUQ0hdOworCXVuc2lnbmVkIGxvbmcgYmF0Y2g7CisJdW5zaWduZWQgbG9uZyBwYWdlczsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwl1bnNpZ25lZCBsb25nIGk7CiAKIAl3aGlsZSAoY291bnQpIHsKLQkJYmF0Y2ggPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjb3VudCwgUEFHRVNfQkFUQ0gpOwotCQluID0gcmVhZChrcGFnZWZsYWdzX2ZkLCBrcGFnZWZsYWdzX2J1ZiwgYmF0Y2ggKiBLUEZfQllURVMpOwotCQlpZiAobiA9PSAwKQorCQliYXRjaCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50LCBQQUdFTUFQX0JBVENIKTsKKwkJcGFnZXMgPSBwYWdlbWFwX3JlYWQoYnVmLCBpbmRleCwgYmF0Y2gpOworCQlpZiAocGFnZXMgPT0gMCkKIAkJCWJyZWFrOwotCQlpZiAobiA8IDApIHsKLQkJCXBlcnJvcihQUk9DX0tQQUdFRkxBR1MpOwotCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCisJCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CisJCQlwZm4gPSBwYWdlbWFwX3BmbihidWZbaV0pOworCQkJaWYgKHBmbikKKwkJCQl3YWxrX3BmbihpbmRleCArIGksIHBmbiwgMSk7CiAJCX0KIAotCQlpZiAobiAlIEtQRl9CWVRFUyAhPSAwKQotCQkJZmF0YWwoInBhcnRpYWwgcmVhZDogJWx1IGJ5dGVzXG4iLCBuKTsKLQkJbiA9IG4gLyBLUEZfQllURVM7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJCWFkZF9wYWdlKGluZGV4ICsgaSwga3BhZ2VmbGFnc19idWZbaV0pOwotCi0JCWluZGV4ICs9IGJhdGNoOwotCQljb3VudCAtPSBiYXRjaDsKKwkJaW5kZXggKz0gcGFnZXM7CisJCWNvdW50IC09IHBhZ2VzOwogCX0KIH0KIAorc3RhdGljIHZvaWQgd2Fsa190YXNrKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyBlbmQgPSBpbmRleCArIGNvdW50OworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGluZGV4IDwgZW5kKSB7CisKKwkJd2hpbGUgKHBnX2VuZFtpXSA8PSBpbmRleCkKKwkJCWlmICgrK2kgPj0gbnJfdm1hcykKKwkJCQlyZXR1cm47CisJCWlmIChwZ19zdGFydFtpXSA+PSBlbmQpCisJCQlyZXR1cm47CisKKwkJc3RhcnQgPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBwZ19zdGFydFtpXSwgaW5kZXgpOworCQlpbmRleCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHBnX2VuZFtpXSwgZW5kKTsKKworCQlhc3NlcnQoc3RhcnQgPCBpbmRleCk7CisJCXdhbGtfdm1hKHN0YXJ0LCBpbmRleCAtIHN0YXJ0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9hZGRyX3JhbmdlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKG5yX2FkZHJfcmFuZ2VzID49IE1BWF9BRERSX1JBTkdFUykKKwkJZmF0YWwoInRvbyBtYW55IGFkZHIgcmFuZ2VzXG4iKTsKKworCW9wdF9vZmZzZXRbbnJfYWRkcl9yYW5nZXNdID0gb2Zmc2V0OworCW9wdF9zaXplW25yX2FkZHJfcmFuZ2VzXSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHNpemUsIFVMT05HX01BWC1vZmZzZXQpOworCW5yX2FkZHJfcmFuZ2VzKys7Cit9CisKIHN0YXRpYyB2b2lkIHdhbGtfYWRkcl9yYW5nZXModm9pZCkKIHsKIAlpbnQgaTsKIAotCWtwYWdlZmxhZ3NfZmQgPSBvcGVuKFBST0NfS1BBR0VGTEFHUywgT19SRE9OTFkpOwotCWlmIChrcGFnZWZsYWdzX2ZkIDwgMCkgewotCQlwZXJyb3IoUFJPQ19LUEFHRUZMQUdTKTsKLQkJZXhpdChFWElUX0ZBSUxVUkUpOwotCX0KKwlrcGFnZWZsYWdzX2ZkID0gY2hlY2tlZF9vcGVuKFBST0NfS1BBR0VGTEFHUywgT19SRE9OTFkpOwogCiAJaWYgKCFucl9hZGRyX3JhbmdlcykKLQkJd2Fsa19wZm4oMCwgVUxPTkdfTUFYKTsKKwkJYWRkX2FkZHJfcmFuZ2UoMCwgVUxPTkdfTUFYKTsKIAogCWZvciAoaSA9IDA7IGkgPCBucl9hZGRyX3JhbmdlczsgaSsrKQotCQl3YWxrX3BmbihvcHRfb2Zmc2V0W2ldLCBvcHRfc2l6ZVtpXSk7CisJCWlmICghb3B0X3BpZCkKKwkJCXdhbGtfcGZuKDAsIG9wdF9vZmZzZXRbaV0sIG9wdF9zaXplW2ldKTsKKwkJZWxzZQorCQkJd2Fsa190YXNrKG9wdF9vZmZzZXRbaV0sIG9wdF9zaXplW2ldKTsKIAogCWNsb3NlKGtwYWdlZmxhZ3NfZmQpOwogfQpAQCAtNDQ2LDIwICs2NzYsMjIgQEAKICIgICAgICAgICAgICAtcnwtLXJhdyAgICAgICAgICAgICAgICAgIFJhdyBtb2RlLCBmb3Iga2VybmVsIGRldmVsb3BlcnNcbiIKICIgICAgICAgICAgICAtYXwtLWFkZHIgICAgYWRkci1zcGVjICAgIFdhbGsgYSByYW5nZSBvZiBwYWdlc1xuIgogIiAgICAgICAgICAgIC1ifC0tYml0cyAgICBiaXRzLXNwZWMgICAgV2FsayBwYWdlcyB3aXRoIHNwZWNpZmllZCBiaXRzXG4iCi0jaWYgMCAvKiBwbGFubmVkIGZlYXR1cmVzICovCiAiICAgICAgICAgICAgLXB8LS1waWQgICAgIHBpZCAgICAgICAgICBXYWxrIHByb2Nlc3MgYWRkcmVzcyBzcGFjZVxuIgorI2lmIDAgLyogcGxhbm5lZCBmZWF0dXJlcyAqLwogIiAgICAgICAgICAgIC1mfC0tZmlsZSAgICBmaWxlbmFtZSAgICAgV2FsayBmaWxlIGFkZHJlc3Mgc3BhY2VcbiIKICNlbmRpZgogIiAgICAgICAgICAgIC1sfC0tbGlzdCAgICAgICAgICAgICAgICAgU2hvdyBwYWdlIGRldGFpbHMgaW4gcmFuZ2VzXG4iCiAiICAgICAgICAgICAgLUx8LS1saXN0LWVhY2ggICAgICAgICAgICBTaG93IHBhZ2UgZGV0YWlscyBvbmUgYnkgb25lXG4iCiAiICAgICAgICAgICAgLU58LS1uby1zdW1tYXJ5ICAgICAgICAgICBEb24ndCBzaG93IHN1bW1heSBpbmZvXG4iCisiICAgICAgICAgICAgLVh8LS1od3BvaXNvbiAgICAgICAgICAgICBod3BvaXNvbiBwYWdlc1xuIgorIiAgICAgICAgICAgIC14fC0tdW5wb2lzb24gICAgICAgICAgICAgdW5wb2lzb24gcGFnZXNcbiIKICIgICAgICAgICAgICAtaHwtLWhlbHAgICAgICAgICAgICAgICAgIFNob3cgdGhpcyB1c2FnZSBtZXNzYWdlXG4iCiAiYWRkci1zcGVjOlxuIgogIiAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgICAgICAgICAgb25lIHBhZ2UgYXQgb2Zmc2V0IE4gKHVuaXQ6IHBhZ2VzKVxuIgogIiAgICAgICAgICAgIE4rTSAgICAgICAgICAgICAgICAgICAgICAgcGFnZXMgcmFuZ2UgZnJvbSBOIHRvIE4rTS0xXG4iCiAiICAgICAgICAgICAgTixNICAgICAgICAgICAgICAgICAgICAgICBwYWdlcyByYW5nZSBmcm9tIE4gdG8gTS0xXG4iCiAiICAgICAgICAgICAgTiwgICAgICAgICAgICAgICAgICAgICAgICBwYWdlcyByYW5nZSBmcm9tIE4gdG8gZW5kXG4iCi0iICAgICAgICAgICAgLE0gICAgICAgICAgICAgICAgICAgICAgICBwYWdlcyByYW5nZSBmcm9tIDAgdG8gTVxuIgorIiAgICAgICAgICAgICxNICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXMgcmFuZ2UgZnJvbSAwIHRvIE0tMVxuIgogImJpdHMtc3BlYzpcbiIKICIgICAgICAgICAgICBiaXQxLGJpdDIgICAgICAgICAgICAgICAgIChmbGFncyAmIChiaXQxfGJpdDIpKSAhPSAwXG4iCiAiICAgICAgICAgICAgYml0MSxiaXQyPWJpdDEgICAgICAgICAgICAoZmxhZ3MgJiAoYml0MXxiaXQyKSkgPT0gYml0MVxuIgpAQCAtNDk2LDIzICs3MjgsNTUgQEAKIAogc3RhdGljIHZvaWQgcGFyc2VfcGlkKGNvbnN0IGNoYXIgKnN0cikKIHsKKwlGSUxFICpmaWxlOworCWNoYXIgYnVmWzUwMDBdOworCiAJb3B0X3BpZCA9IHBhcnNlX251bWJlcihzdHIpOworCisJc3ByaW50ZihidWYsICIvcHJvYy8lZC9wYWdlbWFwIiwgb3B0X3BpZCk7CisJcGFnZW1hcF9mZCA9IGNoZWNrZWRfb3BlbihidWYsIE9fUkRPTkxZKTsKKworCXNwcmludGYoYnVmLCAiL3Byb2MvJWQvbWFwcyIsIG9wdF9waWQpOworCWZpbGUgPSBmb3BlbihidWYsICJyIik7CisJaWYgKCFmaWxlKSB7CisJCXBlcnJvcihidWYpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZpbGUpICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgbG9uZyB2bV9zdGFydDsKKwkJdW5zaWduZWQgbG9uZyB2bV9lbmQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBwZ29mZjsKKwkJaW50IG1ham9yLCBtaW5vcjsKKwkJY2hhciByLCB3LCB4LCBzOworCQl1bnNpZ25lZCBsb25nIGlubzsKKwkJaW50IG47CisKKwkJbiA9IHNzY2FuZihidWYsICIlbHgtJWx4ICVjJWMlYyVjICVsbHggJXg6JXggJWx1IiwKKwkJCSAgICZ2bV9zdGFydCwKKwkJCSAgICZ2bV9lbmQsCisJCQkgICAmciwgJncsICZ4LCAmcywKKwkJCSAgICZwZ29mZiwKKwkJCSAgICZtYWpvciwgJm1pbm9yLAorCQkJICAgJmlubyk7CisJCWlmIChuIDwgMTApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCBsaW5lOiAlc1xuIiwgYnVmKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBnX3N0YXJ0W25yX3ZtYXNdID0gdm1fc3RhcnQgLyBwYWdlX3NpemU7CisJCXBnX2VuZFtucl92bWFzXSA9IHZtX2VuZCAvIHBhZ2Vfc2l6ZTsKKwkJaWYgKCsrbnJfdm1hcyA+PSBNQVhfVk1BUykgeworCQkJZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBWTUFzXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZjbG9zZShmaWxlKTsKIH0KIAogc3RhdGljIHZvaWQgcGFyc2VfZmlsZShjb25zdCBjaGFyICpuYW1lKQogewogfQogCi1zdGF0aWMgdm9pZCBhZGRfYWRkcl9yYW5nZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmIChucl9hZGRyX3JhbmdlcyA+PSBNQVhfQUREUl9SQU5HRVMpCi0JCWZhdGFsKCJ0b28gbXVjaCBhZGRyIHJhbmdlc1xuIik7Ci0KLQlvcHRfb2Zmc2V0W25yX2FkZHJfcmFuZ2VzXSA9IG9mZnNldDsKLQlvcHRfc2l6ZVtucl9hZGRyX3Jhbmdlc10gPSBzaXplOwotCW5yX2FkZHJfcmFuZ2VzKys7Ci19Ci0KIHN0YXRpYyB2b2lkIHBhcnNlX2FkZHJfcmFuZ2UoY29uc3QgY2hhciAqb3B0YXJnKQogewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwpAQCAtNjMwLDYgKzg5NCw4IEBACiAJeyAibGlzdCIgICAgICAsIDAsIE5VTEwsICdsJyB9LAogCXsgImxpc3QtZWFjaCIgLCAwLCBOVUxMLCAnTCcgfSwKIAl7ICJuby1zdW1tYXJ5IiwgMCwgTlVMTCwgJ04nIH0sCisJeyAiaHdwb2lzb24iICAsIDAsIE5VTEwsICdYJyB9LAorCXsgInVucG9pc29uIiAgLCAwLCBOVUxMLCAneCcgfSwKIAl7ICJoZWxwIiAgICAgICwgMCwgTlVMTCwgJ2gnIH0sCiAJeyBOVUxMICAgICAgICAsIDAsIE5VTEwsIDAgfQogfTsKQEAgLTY0MSw3ICs5MDcsNyBAQAogCXBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiAKIAl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LAotCQkJCSJycDpmOmE6YjpsTE5oIiwgb3B0cywgTlVMTCkpICE9IC0xKSB7CisJCQkJInJwOmY6YTpiOmxMTlh4aCIsIG9wdHMsIE5VTEwpKSAhPSAtMSkgewogCQlzd2l0Y2ggKGMpIHsKIAkJY2FzZSAncic6CiAJCQlvcHRfcmF3ID0gMTsKQEAgLTY2Nyw2ICs5MzMsMTQgQEAKIAkJY2FzZSAnTic6CiAJCQlvcHRfbm9fc3VtbWFyeSA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSAnWCc6CisJCQlvcHRfaHdwb2lzb24gPSAxOworCQkJcHJlcGFyZV9od3BvaXNvbl9mZCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJb3B0X3VucG9pc29uID0gMTsKKwkJCXByZXBhcmVfaHdwb2lzb25fZmQoKTsKKwkJCWJyZWFrOwogCQljYXNlICdoJzoKIAkJCXVzYWdlKCk7CiAJCQlleGl0KDApOwpAQCAtNjc2LDE1ICs5NTAsMTcgQEAKIAkJfQogCX0KIAorCWlmIChvcHRfbGlzdCAmJiBvcHRfcGlkKQorCQlwcmludGYoInZvZmZzZXRcdCIpOwogCWlmIChvcHRfbGlzdCA9PSAxKQotCQlwcmludGYoIm9mZnNldFx0Y291bnRcdGZsYWdzXG4iKTsKKwkJcHJpbnRmKCJvZmZzZXRcdGxlblx0ZmxhZ3NcbiIpOwogCWlmIChvcHRfbGlzdCA9PSAyKQogCQlwcmludGYoIm9mZnNldFx0ZmxhZ3NcbiIpOwogCiAJd2Fsa19hZGRyX3JhbmdlcygpOwogCiAJaWYgKG9wdF9saXN0ID09IDEpCi0JCXNob3dfcGFnZV9yYW5nZSgwLCAwKTsgIC8qIGRyYWluIHRoZSBidWZmZXIgKi8KKwkJc2hvd19wYWdlX3JhbmdlKDAsIDAsIDApOyAgLyogZHJhaW4gdGhlIGJ1ZmZlciAqLwogCiAJaWYgKG9wdF9ub19zdW1tYXJ5KQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vcGFnZW1hcC50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL3BhZ2VtYXAudHh0CmluZGV4IDYwMGEzMDQuLmRmMDliOTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vcGFnZW1hcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9wYWdlbWFwLnR4dApAQCAtNTcsNyArNTcsOSBAQAogICAgIDE2LiBDT01QT1VORF9UQUlMCiAgICAgMTYuIEhVR0UKICAgICAxOC4gVU5FVklDVEFCTEUKKyAgICAxOS4gSFdQT0lTT04KICAgICAyMC4gTk9QQUdFCisgICAgMjEuIEtTTQogCiBTaG9ydCBkZXNjcmlwdGlvbnMgdG8gdGhlIHBhZ2UgZmxhZ3M6CiAKQEAgLTg2LDkgKzg4LDE1IEBACiAxNy4gSFVHRQogICAgIHRoaXMgaXMgYW4gaW50ZWdyYWwgcGFydCBvZiBhIEh1Z2VUTEIgcGFnZQogCisxOS4gSFdQT0lTT04KKyAgICBoYXJkd2FyZSBkZXRlY3RlZCBtZW1vcnkgY29ycnVwdGlvbiBvbiB0aGlzIHBhZ2U6IGRvbid0IHRvdWNoIHRoZSBkYXRhIQorCiAyMC4gTk9QQUdFCiAgICAgbm8gcGFnZSBmcmFtZSBleGlzdHMgYXQgdGhlIHJlcXVlc3RlZCBhZGRyZXNzCiAKKzIxLiBLU00KKyAgICBpZGVudGljYWwgbWVtb3J5IHBhZ2VzIGR5bmFtaWNhbGx5IHNoYXJlZCBiZXR3ZWVuIG9uZSBvciBtb3JlIHByb2Nlc3NlcworCiAgICAgW0lPIHJlbGF0ZWQgcGFnZSBmbGFnc10KICAxLiBFUlJPUiAgICAgSU8gZXJyb3Igb2NjdXJyZWQKICAzLiBVUFRPREFURSAgcGFnZSBoYXMgdXAtdG8tZGF0ZSBkYXRhCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDgyIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ4MgppbmRleCA5MjEwZDZmLi4yOTliOTFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDgyCisrKyBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0ODIKQEAgLTI0LDggKzI0LDggQEAKIAogVmFsaWQgYWRkcmVzc2VzIGFyZSAweDE4LCAweDE5LCAweDFhLCBhbmQgMHgxYi4KIEhvd2V2ZXIsIHRoZSBkZXZpY2UgY2Fubm90IGJlIGRldGVjdGVkIHdpdGhvdXQgd3JpdGluZyB0byB0aGUgaTJjIGJ1cywgc28gbm8KLWRldGVjdGlvbiBpcyBkb25lLgotWW91IHNob3VsZCBmb3JjZSB0aGUgZGV2aWNlIGFkZHJlc3MuCitkZXRlY3Rpb24gaXMgZG9uZS4gWW91IHNob3VsZCBpbnN0YW50aWF0ZSB0aGUgZGV2aWNlIGV4cGxpY2l0bHkuCiAKLSQgbW9kcHJvYmUgZHMyNDgyIGZvcmNlPTAsMHgxOAorJCBtb2Rwcm9iZSBkczI0ODIKKyQgZWNobyBkczI0ODIgMHgxOCA+IC9zeXMvYnVzL2kyYy9kZXZpY2VzL2kyYy0wL25ld19kZXZpY2UKIApkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA4ZjYyOTc4Li5hMWEyYWNlIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNjUsNDMgKzY1LDUxIEBACiAKIDguCUhhcHB5IGhhY2tpbmcuCiAKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Rlc2NyaXB0aW9ucyBvZiBzZWN0aW9uIGVudHJpZXM6CiAKLU1haW50YWluZXJzIExpc3QgKHRyeSB0byBsb29rIGZvciBtb3N0IHByZWNpc2UgYXJlYXMgZmlyc3QpCisJUDogUGVyc29uIChvYnNvbGV0ZSkKKwlNOiBNYWlsIHBhdGNoZXMgdG86IEZ1bGxOYW1lIDxhZGRyZXNzQGRvbWFpbj4KKwlMOiBNYWlsaW5nIGxpc3QgdGhhdCBpcyByZWxldmFudCB0byB0aGlzIGFyZWEKKwlXOiBXZWItcGFnZSB3aXRoIHN0YXR1cy9pbmZvCisJVDogU0NNIHRyZWUgdHlwZSBhbmQgbG9jYXRpb24uICBUeXBlIGlzIG9uZSBvZjogZ2l0LCBoZywgcXVpbHQsIHN0Z2l0LgorCVM6IFN0YXR1cywgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICAgU3VwcG9ydGVkOglTb21lb25lIGlzIGFjdHVhbGx5IHBhaWQgdG8gbG9vayBhZnRlciB0aGlzLgorCSAgIE1haW50YWluZWQ6CVNvbWVvbmUgYWN0dWFsbHkgbG9va3MgYWZ0ZXIgaXQuCisJICAgT2RkIEZpeGVzOglJdCBoYXMgYSBtYWludGFpbmVyIGJ1dCB0aGV5IGRvbid0IGhhdmUgdGltZSB0byBkbworCQkJbXVjaCBvdGhlciB0aGFuIHRocm93IHRoZSBvZGQgcGF0Y2ggaW4uIFNlZSBiZWxvdy4uCisJICAgT3JwaGFuOglObyBjdXJyZW50IG1haW50YWluZXIgW2J1dCBtYXliZSB5b3UgY291bGQgdGFrZSB0aGUKKwkJCXJvbGUgYXMgeW91IHdyaXRlIHlvdXIgbmV3IGNvZGVdLgorCSAgIE9ic29sZXRlOglPbGQgY29kZS4gU29tZXRoaW5nIHRhZ2dlZCBvYnNvbGV0ZSBnZW5lcmFsbHkgbWVhbnMKKwkJCWl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGEgYmV0dGVyIHN5c3RlbSBhbmQgeW91CisJCQlzaG91bGQgYmUgdXNpbmcgdGhhdC4KKwlGOiBGaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aCB3aWxkY2FyZCBwYXR0ZXJucy4KKwkgICBBIHRyYWlsaW5nIHNsYXNoIGluY2x1ZGVzIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3J5IGZpbGVzLgorCSAgIEY6CWRyaXZlcnMvbmV0LwlhbGwgZmlsZXMgaW4gYW5kIGJlbG93IGRyaXZlcnMvbmV0CisJICAgRjoJZHJpdmVycy9uZXQvKglhbGwgZmlsZXMgaW4gZHJpdmVycy9uZXQsIGJ1dCBub3QgYmVsb3cKKwkgICBGOgkqL25ldC8qCQlhbGwgZmlsZXMgaW4gImFueSB0b3AgbGV2ZWwgZGlyZWN0b3J5Ii9uZXQKKwkgICBPbmUgcGF0dGVybiBwZXIgbGluZS4gIE11bHRpcGxlIEY6IGxpbmVzIGFjY2VwdGFibGUuCisJWDogRmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRoYXQgYXJlIE5PVCBtYWludGFpbmVkLCBzYW1lIHJ1bGVzIGFzIEY6CisJICAgRmlsZXMgZXhjbHVzaW9ucyBhcmUgdGVzdGVkIGJlZm9yZSBmaWxlIG1hdGNoZXMuCisJICAgQ2FuIGJlIHVzZWZ1bCBmb3IgZXhjbHVkaW5nIGEgc3BlY2lmaWMgc3ViZGlyZWN0b3J5LCBmb3IgaW5zdGFuY2U6CisJICAgRjoJbmV0LworCSAgIFg6CW5ldC9pcHY2LworCSAgIG1hdGNoZXMgYWxsIGZpbGVzIGluIGFuZCBiZWxvdyBuZXQgZXhjbHVkaW5nIG5ldC9pcHY2LworCUs6IEtleXdvcmQgcGVybCBleHRlbmRlZCByZWdleCBwYXR0ZXJuIHRvIG1hdGNoIGNvbnRlbnQgaW4gYQorCSAgIHBhdGNoIG9yIGZpbGUuICBGb3IgaW5zdGFuY2U6CisJICAgSzogb2ZfZ2V0X3Byb2ZpbGUKKwkgICAgICBtYXRjaGVzIHBhdGNoZXMgb3IgZmlsZXMgdGhhdCBjb250YWluICJvZl9nZXRfcHJvZmlsZSIKKwkgICBLOiBcYihwcmludGt8cHJfKGluZm98ZXJyKSlcYgorCSAgICAgIG1hdGNoZXMgcGF0Y2hlcyBvciBmaWxlcyB0aGF0IGNvbnRhaW4gb25lIG9yIG1vcmUgb2YgdGhlIHdvcmRzCisJICAgICAgcHJpbnRrLCBwcl9pbmZvIG9yIHByX2VycgorCSAgIE9uZSByZWdleCBwYXR0ZXJuIHBlciBsaW5lLiAgTXVsdGlwbGUgSzogbGluZXMgYWNjZXB0YWJsZS4KIAogTm90ZTogRm9yIHRoZSBoYXJkIG9mIHRoaW5raW5nLCB0aGlzIGxpc3QgaXMgbWVhbnQgdG8gcmVtYWluIGluIGFscGhhYmV0aWNhbAogb3JkZXIuIElmIHlvdSBjb3VsZCBhZGQgeW91cnNlbHZlcyB0byBpdCBpbiBhbHBoYWJldGljYWwgb3JkZXIgdGhhdCB3b3VsZCBiZQogc28gbXVjaCBlYXNpZXIgW0VkXQogCi1QOiBQZXJzb24gKG9ic29sZXRlKQotTTogTWFpbCBwYXRjaGVzIHRvOiBGdWxsTmFtZSA8YWRkcmVzc0Bkb21haW4+Ci1MOiBNYWlsaW5nIGxpc3QgdGhhdCBpcyByZWxldmFudCB0byB0aGlzIGFyZWEKLVc6IFdlYi1wYWdlIHdpdGggc3RhdHVzL2luZm8KLVQ6IFNDTSB0cmVlIHR5cGUgYW5kIGxvY2F0aW9uLiAgVHlwZSBpcyBvbmUgb2Y6IGdpdCwgaGcsIHF1aWx0LCBzdGdpdC4KLVM6IFN0YXR1cywgb25lIG9mIHRoZSBmb2xsb3dpbmc6CitNYWludGFpbmVycyBMaXN0ICh0cnkgdG8gbG9vayBmb3IgbW9zdCBwcmVjaXNlIGFyZWFzIGZpcnN0KQogCi0JU3VwcG9ydGVkOglTb21lb25lIGlzIGFjdHVhbGx5IHBhaWQgdG8gbG9vayBhZnRlciB0aGlzLgotCU1haW50YWluZWQ6CVNvbWVvbmUgYWN0dWFsbHkgbG9va3MgYWZ0ZXIgaXQuCi0JT2RkIEZpeGVzOglJdCBoYXMgYSBtYWludGFpbmVyIGJ1dCB0aGV5IGRvbid0IGhhdmUgdGltZSB0byBkbwotCQkJbXVjaCBvdGhlciB0aGFuIHRocm93IHRoZSBvZGQgcGF0Y2ggaW4uIFNlZSBiZWxvdy4uCi0JT3JwaGFuOgkJTm8gY3VycmVudCBtYWludGFpbmVyIFtidXQgbWF5YmUgeW91IGNvdWxkIHRha2UgdGhlCi0JCQlyb2xlIGFzIHlvdSB3cml0ZSB5b3VyIG5ldyBjb2RlXS4KLQlPYnNvbGV0ZToJT2xkIGNvZGUuIFNvbWV0aGluZyB0YWdnZWQgb2Jzb2xldGUgZ2VuZXJhbGx5IG1lYW5zCi0JCQlpdCBoYXMgYmVlbiByZXBsYWNlZCBieSBhIGJldHRlciBzeXN0ZW0gYW5kIHlvdQotCQkJc2hvdWxkIGJlIHVzaW5nIHRoYXQuCi0KLUY6IEZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIHdpbGRjYXJkIHBhdHRlcm5zLgotICAgQSB0cmFpbGluZyBzbGFzaCBpbmNsdWRlcyBhbGwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yeSBmaWxlcy4KLQlGOglkcml2ZXJzL25ldC8JYWxsIGZpbGVzIGluIGFuZCBiZWxvdyBkcml2ZXJzL25ldAotCUY6CWRyaXZlcnMvbmV0LyoJYWxsIGZpbGVzIGluIGRyaXZlcnMvbmV0LCBidXQgbm90IGJlbG93Ci0JRjoJKi9uZXQvKgkJYWxsIGZpbGVzIGluICJhbnkgdG9wIGxldmVsIGRpcmVjdG9yeSIvbmV0Ci0gICBPbmUgcGF0dGVybiBwZXIgbGluZS4gIE11bHRpcGxlIEY6IGxpbmVzIGFjY2VwdGFibGUuCi1YOiBGaWxlcyBhbmQgZGlyZWN0b3JpZXMgdGhhdCBhcmUgTk9UIG1haW50YWluZWQsIHNhbWUgcnVsZXMgYXMgRjoKLSAgIEZpbGVzIGV4Y2x1c2lvbnMgYXJlIHRlc3RlZCBiZWZvcmUgZmlsZSBtYXRjaGVzLgotICAgQ2FuIGJlIHVzZWZ1bCBmb3IgZXhjbHVkaW5nIGEgc3BlY2lmaWMgc3ViZGlyZWN0b3J5LCBmb3IgaW5zdGFuY2U6Ci0JRjoJbmV0LwotCVg6CW5ldC9pcHY2LwotICAgbWF0Y2hlcyBhbGwgZmlsZXMgaW4gYW5kIGJlbG93IG5ldCBleGNsdWRpbmcgbmV0L2lwdjYvCisJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIDNDNTA1IE5FVFdPUksgRFJJVkVSCiBNOglQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CkBAIC0yNTcsMTEgKzI2NSwxMiBAQAogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL2FjcGkvZmFuLmMKIAotQUNQSSBQQ0kgSE9UUExVRyBEUklWRVIKLU06CUtyaXN0ZW4gQ2FybHNvbiBBY2NhcmRpIDxrcmlzdGVuLmMuYWNjYXJkaUBpbnRlbC5jb20+Ci1MOglsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnCitBQ1BJIFBST0NFU1NPUiBBR0dSRUdBVE9SIERSSVZFUgorTToJU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CitMOglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5sZXNzd2F0dHMub3JnL3Byb2plY3RzL2FjcGkvCiBTOglTdXBwb3J0ZWQKLUY6CWRyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaSoKK0Y6CWRyaXZlcnMvYWNwaS9hY3BpX3BhZC5jCiAKIEFDUEkgVEhFUk1BTCBEUklWRVIKIE06CVpoYW5nIFJ1aSA8cnVpLnpoYW5nQGludGVsLmNvbT4KQEAgLTU3Niw2ICs1ODUsMTEgQEAKIEw6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBTOglNYWludGFpbmVkCiAKK0FSTS9DT05URUMgTUlDUk85IE1BQ0hJTkUgU1VQUE9SVAorTToJSHViZXJ0IEZldXJzdGVpbiA8aHViZXJ0LmZldXJzdGVpbkBjb250ZWMuYXQ+CitTOglNYWludGFpbmVkCitGOglhcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYworCiBBUk0vQ09SR0kgTUFDSElORSBTVVBQT1JUCiBNOglSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBycHN5cy5uZXQ+CiBTOglNYWludGFpbmVkCkBAIC02NTIsMjQgKzY2NiwyNCBAQAogTToJTGVubmVydCBCdXl0ZW5oZWsgPGtlcm5lbEB3YW50c3RvZmx5Lm9yZz4KIE06CURhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKLVM6CVN1cHBvcnRlZAorUzoJTWFpbnRhaW5lZAogCiBBUk0vSU5URUwgSU9QMzNYIEFSTSBBUkNISVRFQ1RVUkUKIE06CURhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKLVM6CVN1cHBvcnRlZAorUzoJTWFpbnRhaW5lZAogCiBBUk0vSU5URUwgSU9QMTNYWCBBUk0gQVJDSElURUNUVVJFCiBNOglMZW5uZXJ0IEJ1eXRlbmhlayA8a2VybmVsQHdhbnRzdG9mbHkub3JnPgogTToJRGFuIFdpbGxpYW1zIDxkYW4uai53aWxsaWFtc0BpbnRlbC5jb20+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQotUzoJU3VwcG9ydGVkCitTOglNYWludGFpbmVkCiAKIEFSTS9JTlRFTCBJUTgxMzQyRVggTUFDSElORSBTVVBQT1JUCiBNOglMZW5uZXJ0IEJ1eXRlbmhlayA8a2VybmVsQHdhbnRzdG9mbHkub3JnPgogTToJRGFuIFdpbGxpYW1zIDxkYW4uai53aWxsaWFtc0BpbnRlbC5jb20+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQotUzoJU3VwcG9ydGVkCitTOglNYWludGFpbmVkCiAKIEFSTS9JTlRFTCBJWFAyMDAwIEFSTSBBUkNISVRFQ1RVUkUKIE06CUxlbm5lcnQgQnV5dGVuaGVrIDxrZXJuZWxAd2FudHN0b2ZseS5vcmc+CkBAIC02ODYsMTEgKzcwMCwxOCBAQAogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CU1haW50YWluZWQKIAorQVJNL0lOVEVMIElYUDRYWCBBUk0gQVJDSElURUNUVVJFCitNOglJbXJlIEthbG96IDxrYWxvekBvcGVud3J0Lm9yZz4KK006CUtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vbWFjaC1peHA0eHgvCisKIEFSTS9JTlRFTCBYU0MzIChNQU5aQU5PKSBBUk0gQ09SRQogTToJTGVubmVydCBCdXl0ZW5oZWsgPGtlcm5lbEB3YW50c3RvZmx5Lm9yZz4KIE06CURhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKLVM6CVN1cHBvcnRlZAorUzoJTWFpbnRhaW5lZAogCiBBUk0vSVAgRkFCUklDUyBET1VCTEUgRVNQUkVTU08gTUFDSElORSBTVVBQT1JUCiBNOglMZW5uZXJ0IEJ1eXRlbmhlayA8a2VybmVsQHdhbnRzdG9mbHkub3JnPgpAQCAtNzM5LDIwICs3NjAsMzcgQEAKIE06CURpcmsgT3BmZXIgPGRpcmtAb3BmZXItb25saW5lLmRlPgogUzoJTWFpbnRhaW5lZAogCi1BUk0vUEFMTVRYLFBBTE1UNSxQQUxNTEQsUEFMTVRFMiBTVVBQT1JUCitBUk0vUEFMTVRYLFBBTE1UNSxQQUxNTEQsUEFMTVRFMixQQUxNVEMgU1VQUE9SVAogTToJTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4KK0w6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwogVzoJaHR0cDovL2hhY2tuZGV2LmNvbQogUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10eC5oCitGOglhcmNoL2FybS9tYWNoLXB4YS9wYWxtdHguYworRjoJYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10NS5oCitGOglhcmNoL2FybS9tYWNoLXB4YS9wYWxtdDUuYworRjoJYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG1sZC5oCitGOglhcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYworRjoJYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10ZTIuaAorRjoJYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRlMi5jCitGOglhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXRjLmgKK0Y6CWFyY2gvYXJtL21hY2gtcHhhL3BhbG10Yy5jCiAKIEFSTS9QQUxNIFRSRU8gNjgwIFNVUFBPUlQKIE06CVRvbWFzIENlY2ggPHNsZWVwX3dhbGtlckBzdXNlLmN6PgorTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCiBXOglodHRwOi8vaGFja25kZXYuY29tCiBTOglNYWludGFpbmVkCitGOglhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdHJlbzY4MC5oCitGOglhcmNoL2FybS9tYWNoLXB4YS90cmVvNjgwLmMKIAogQVJNL1BBTE1aNzIgU1VQUE9SVAogTToJU2VyZ2V5IExhcGluIDxzbGFwaW5Ab3NzZmFucy5vcmc+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKIFc6CWh0dHA6Ly9oYWNrbmRldi5jb20KIFM6CU1haW50YWluZWQKK0Y6CWFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtejcyLmgKK0Y6CWFyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYwogCiBBUk0vUExFQiBTVVBQT1JUCiBNOglQZXRlciBDaHViYiA8cGxlYkBnZWxhdG8udW5zdy5lZHUuYXU+CkBAIC05NjIsNyArMTAwMCw3IEBACiAKIEFUTQogTToJQ2hhcyBXaWxsaWFtcyA8Y2hhc0BjbWYubnJsLm5hdnkubWlsPgotTDoJbGludXgtYXRtLWdlbmVyYWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpYmVycy1vbmx5KQorTDoJbGludXgtYXRtLWdlbmVyYWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9saW51eC1hdG0uc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCkBAIC0xMjA2LDYgKzEyNDQsMTMgQEAKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9uZXQvdGczLioKIAorQlJPQ0FERSBCRkEgRkMgU0NTSSBEUklWRVIKK1A6ICAgICAgSmluZyBIdWFuZworTTogICAgICBodWFuZ2pAYnJvY2FkZS5jb20KK0w6ICAgICAgbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKK1M6ICAgICAgU3VwcG9ydGVkCitGOiAgICAgIGRyaXZlcnMvc2NzaS9iZmEvCisKIEJTRyAoYmxvY2sgbGF5ZXIgZ2VuZXJpYyBzZyB2NCBkcml2ZXIpCiBNOglGVUpJVEEgVG9tb25vcmkgPGZ1aml0YS50b21vbm9yaUBsYWIubnR0LmNvLmpwPgogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKQEAgLTE0NDMsNiArMTQ4OCw3IEBACiAKIENPUkVURU1QIEhBUkRXQVJFIE1PTklUT1JJTkcgRFJJVkVSCiBNOglSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PgorTToJSHVheHUgV2FuIDxodWF4dS53YW5AaW50ZWwuY29tPgogTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9od21vbi9jb3JldGVtcApAQCAtMjAzMyw3ICsyMDc5LDcgQEAKIEY6CWZzLyoKIAogRklOVEVLIEY3NTM3NVMgSEFSRFdBUkUgTU9OSVRPUiBBTkQgRkFOIENPTlRST0xMRVIgRFJJVkVSCi1NOglSaWt1IFZvaXBpbyA8cmlrdS52aXBpb0Bpa2kuZmk+CitNOglSaWt1IFZvaXBpbyA8cmlrdS52b2lwaW9AaWtpLmZpPgogTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9od21vbi9mNzUzNzVzLmMKQEAgLTIxMTQsNyArMjE2MCw3IEBACiBGOglhcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi8KIEY6CWFyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS8qcWUuaAogCi1GUkVFU0NBTEUgVVNCIFBFUklQSEVSSUFMIERSSVZFUlMKK0ZSRUVTQ0FMRSBVU0IgUEVSSVBIRVJBTCBEUklWRVJTCiBNOglMaSBZYW5nIDxsZW9saUBmcmVlc2NhbGUuY29tPgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKQEAgLTIxNjUsMTggKzIyMTEsNiBAQAogRjoJZnMvZnNjYWNoZS8KIEY6CWluY2x1ZGUvbGludXgvZnNjYWNoZSouaAogCi1UUkFDSU5HCi1NOglTdGV2ZW4gUm9zdGVkdCA8cm9zdGVkdEBnb29kbWlzLm9yZz4KLU06CUZyZWRlcmljIFdlaXNiZWNrZXIgPGZ3ZWlzYmVjQGdtYWlsLmNvbT4KLU06CUluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvbGludXgtMi42LXRpcC5naXQgdHJhY2luZy9jb3JlCi1TOglNYWludGFpbmVkCi1GOglEb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQKLUY6CWFyY2gvKi8qLyovZnRyYWNlLmgKLUY6CWFyY2gvKi9rZXJuZWwvZnRyYWNlLmMKLUY6CWluY2x1ZGUvKi9mdHJhY2UuaCBpbmNsdWRlL3RyYWNlLyBpbmNsdWRlL2xpbnV4L3RyYWNlKi5oCi1GOglrZXJuZWwvdHJhY2UvCi0KIEZVSklUU1UgRlItViAoRlJWKSBQT1JUCiBNOglEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29tPgogUzoJTWFpbnRhaW5lZApAQCAtMjIzNSw5ICsyMjY5LDggQEAKIEY6CWluY2x1ZGUvYXNtLWdlbmVyaWMKIAogR0VORVJJQyBVSU8gRFJJVkVSIEZPUiBQQ0kgREVWSUNFUwotTToJTWljaGFlbCBTLiBUc2lya2luIDxtc3RAcmVkaGF0LmNvbT4KK006CSJNaWNoYWVsIFMuIFRzaXJraW4iIDxtc3RAcmVkaGF0LmNvbT4KIEw6CWt2bUB2Z2VyLmtlcm5lbC5vcmcKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy91aW8vdWlvX3BjaV9nZW5lcmljLmMKIApAQCAtMjMyNCw3ICsyMzU3LDkgQEAKIEY6CWRyaXZlcnMvaHdtb24vCiAKIEhBUkRXQVJFIFJBTkRPTSBOVU1CRVIgR0VORVJBVE9SIENPUkUKLVM6CU9ycGhhbgorTToJTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+CitNOglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CitTOglPZGQgZml4ZXMKIEY6CURvY3VtZW50YXRpb24vaHdfcmFuZG9tLnR4dAogRjoJZHJpdmVycy9jaGFyL2h3X3JhbmRvbS8KIEY6CWluY2x1ZGUvbGludXgvaHdfcmFuZG9tLmgKQEAgLTI1NzYsNiArMjYxMSw3IEBACiBXOglodHRwOi8vd3d3LmxpbnV4MTM5NC5vcmcvCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2llZWUxMzk0L2xpbnV4MTM5NC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCitGOglEb2N1bWVudGF0aW9uL2RlYnVnZ2luZy12aWEtb2hjaTEzOTQudHh0CiBGOglkcml2ZXJzL2llZWUxMzk0LwogCiBJRUVFIDEzOTQgUkFXIEkvTyBEUklWRVIKQEAgLTI2NzUsNyArMjcxMSw3IEBACiAKIElOVEVMIElPUC1BRE1BIERNQSBEUklWRVIKIE06CURhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tPgotUzoJU3VwcG9ydGVkCitTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2RtYS9pb3AtYWRtYS5jCiAKIElOVEVMIElYUDRYWCBRTUdSLCBOUEUsIEVUSEVSTkVUIGFuZCBIU1MgU1VQUE9SVApAQCAtMjk2NCw4ICszMDAwLDggQEAKIAogS0VSTkVMIEpBTklUT1JTCiBMOglrZXJuZWwtamFuaXRvcnNAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vd3d3Lmtlcm5lbGphbml0b3JzLm9yZy8KLVM6CU1haW50YWluZWQKK1c6CWh0dHA6Ly9qYW5pdG9yLmtlcm5lbG5ld2JpZXMub3JnLworUzoJT2RkIEZpeGVzCiAKIEtFUk5FTCBORlNELCBTVU5SUEMsIEFORCBMT0NLRCBTRVJWRVJTCiBNOgkiSi4gQnJ1Y2UgRmllbGRzIiA8YmZpZWxkc0BmaWVsZHNlcy5vcmc+CkBAIC0zNjE2LDEwICszNjUyLDE4IEBACiBGOglkcml2ZXJzL2Jsb2NrL25iZC5jCiBGOglpbmNsdWRlL2xpbnV4L25iZC5oCiAKK05FVFdPUksgRFJPUCBNT05JVE9SCitNOglOZWlsIEhvcm1hbiA8bmhvcm1hbkB0dXhkcml2ZXIuY29tPgorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorVzoJaHR0cHM6Ly9mZWRvcmFob3N0ZWQub3JnL2Ryb3B3YXRjaC8KK0Y6CW5ldC9jb3JlL2Ryb3BfbW9uaXRvci5jCisKIE5FVFdPUktJTkcgW0dFTkVSQUxdCiBNOgkiRGF2aWQgUy4gTWlsbGVyIiA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cubGludXhmb3VuZGF0aW9uLm9yZy9lbi9OZXQKK1c6CWh0dHA6Ly9wYXRjaHdvcmsub3psYWJzLm9yZy9wcm9qZWN0L25ldGRldi9saXN0LwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9kYXZlbS9uZXQtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogRjoJbmV0LwpAQCAtMzczNyw3ICszNzgxLDcgQEAKIEY6CWRyaXZlcnMvdmlkZW8vbnZpZGlhLwogCiBPTUFQIFNVUFBPUlQKLU06CSJUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPiIgPHRvbnlAYXRvbWlkZS5jb20+CitNOglUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgogTDoJbGludXgtb21hcEB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cubXVydS5jb20vbGludXgvb21hcC8KIFc6CWh0dHA6Ly9saW51eC5vbWFwLmNvbS8KQEAgLTM4NDIsNiArMzg4NiwxNSBAQAogRjoJRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1vY29yZXMKIEY6CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKIAorT1BFTiBGSVJNV0FSRSBBTkQgRkxBVFRFTkVEIERFVklDRSBUUkVFCitNOglHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitMOglkZXZpY2V0cmVlLWRpc2N1c3NAbGlzdHMub3psYWJzLm9yZworVzoJaHR0cDovL2ZkdC5zZWNyZXRsYWIuY2EKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvb2YKK0Y6CWluY2x1ZGUvbGludXgvb2YqLmgKK0s6CW9mX2dldF9wcm9wZXJ0eQorCiBPUFJPRklMRQogTToJUm9iZXJ0IFJpY2h0ZXIgPHJvYmVydC5yaWNodGVyQGFtZC5jb20+CiBMOglvcHJvZmlsZS1saXN0QGxpc3RzLnNmLm5ldApAQCAtMzk0Niw2ICszOTk5LDcgQEAKIFBBUklTQyBBUkNISVRFQ1RVUkUKIE06CUt5bGUgTWNNYXJ0aW4gPGt5bGVAbWNtYXJ0aW4uY2E+CiBNOglIZWxnZSBEZWxsZXIgPGRlbGxlckBnbXguZGU+CitNOgkiSmFtZXMgRS5KLiBCb3R0b21sZXkiIDxqZWpiQHBhcmlzYy1saW51eC5vcmc+CiBMOglsaW51eC1wYXJpc2NAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vd3d3LnBhcmlzYy1saW51eC5vcmcvCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2t5bGUvcGFyaXNjLTIuNi5naXQKQEAgLTM5OTYsMTEgKzQwNTAsMTEgQEAKIEY6CWRyaXZlcnMvcGNpLwogRjoJaW5jbHVkZS9saW51eC9wY2kqCiAKLVBDSUUgSE9UUExVRyBEUklWRVIKLU06CUtyaXN0ZW4gQ2FybHNvbiBBY2NhcmRpIDxrcmlzdGVuLmMuYWNjYXJkaUBpbnRlbC5jb20+CitQQ0kgSE9UUExVRworTToJSmVzc2UgQmFybmVzIDxqYmFybmVzQHZpcnR1b3VzZ2Vlay5vcmc+CiBMOglsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKLUY6CWRyaXZlcnMvcGNpL3BjaWUvCitGOglkcml2ZXJzL3BjaS9ob3RwbHVnCiAKIFBDTUNJQSBTVUJTWVNURU0KIFA6CUxpbnV4IFBDTUNJQSBUZWFtCkBAIC00MDI5LDYgKzQwODMsMTMgQEAKIE06CVBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgogTToJSW5nbyBNb2xuYXIgPG1pbmdvQGVsdGUuaHU+CiBTOglTdXBwb3J0ZWQKK0Y6CWtlcm5lbC9wZXJmX2V2ZW50LmMKK0Y6CWluY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCitGOglhcmNoLyovKi9rZXJuZWwvcGVyZl9ldmVudC5jCitGOglhcmNoLyovaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCitGOglhcmNoLyovbGliL3BlcmZfZXZlbnQuYworRjoJYXJjaC8qL2tlcm5lbC9wZXJmX2NhbGxjaGFpbi5jCitGOgl0b29scy9wZXJmLwogCiBQRVJTT05BTElUWSBIQU5ETElORwogTToJQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgpAQCAtNDI2OSw3ICs0MzMwLDcgQEAKIFJBTElOSyBSVDJYMDAgV0lSRUxFU1MgTEFOIERSSVZFUgogUDoJcnQyeDAwIHByb2plY3QKIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwotTDoJdXNlcnNAcnQyeDAwLnNlcmlhbG1vbmtleS5jb20KK0w6CXVzZXJzQHJ0MngwMC5zZXJpYWxtb25rZXkuY29tIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly9ydDJ4MDAuc2VyaWFsbW9ua2V5LmNvbS8KIFM6CU1haW50YWluZWQKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvaXZkL3J0MngwMC5naXQKQEAgLTQ0NzgsMTIgKzQ1MzksMTEgQEAKIEY6CWluY2x1ZGUvbGludXgvc2NoZWQuaAogCiBTQ09SRSBBUkNISVRFQ1RVUkUKLVA6CUNoZW4gTGlxaW4KLU06CWxpcWluLmNoZW5Ac3VucGx1c2N0LmNvbQotUDoJTGVubm94IFd1Ci1NOglsZW5ub3gud3VAZ21haWwuY29tCitNOglDaGVuIExpcWluIDxsaXFpbi5jaGVuQHN1bnBsdXNjdC5jb20+CitNOglMZW5ub3ggV3UgPGxlbm5veC53dUBnbWFpbC5jb20+CiBXOglodHRwOi8vd3d3LnN1bnBsdXNjdC5jb20KIFM6CVN1cHBvcnRlZAorRjoJYXJjaC9zY29yZS8KIAogU0NTSSBDRFJPTSBEUklWRVIKIE06CUplbnMgQXhib2UgPGF4Ym9lQGtlcm5lbC5kaz4KQEAgLTQ1NTYsMjAgKzQ2MTYsMjAgQEAKIEY6CWRyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jCiAKIFNFQ1VSRSBESUdJVEFMIEhPU1QgQ09OVFJPTExFUiBJTlRFUkZBQ0UgKFNESENJKSBEUklWRVIKLVM6ICAgICBPcnBoYW4KLUw6ICAgICBsaW51eC1tbWNAdmdlci5rZXJuZWwub3JnCi1GOiAgICAgZHJpdmVycy9tbWMvaG9zdC9zZGhjaS4qCitTOglPcnBoYW4KK0w6CWxpbnV4LW1tY0B2Z2VyLmtlcm5lbC5vcmcKK0Y6CWRyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuKgogCiBTRUNVUkUgRElHSVRBTCBIT1NUIENPTlRST0xMRVIgSU5URVJGQUNFLCBPUEVOIEZJUk1XQVJFIEJJTkRJTkdTIChTREhDSS1PRikKIE06CUFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgogTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKLUw6ICAgICBsaW51eC1tbWNAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC1tbWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCi1GOiAgICAgZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi4qCitGOglkcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLioKIAogU0VDVVJFIERJR0lUQUwgSE9TVCBDT05UUk9MTEVSIElOVEVSRkFDRSAoU0RIQ0kpIFNBTVNVTkcgRFJJVkVSCiBNOglCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+Ci1MOiAgICAgbGludXgtbW1jQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtbW1jQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYwogCkBAIC00NjExLDYgKzQ2NzEsMTQgQEAKIEY6CWluY2x1ZGUvbGludXgvYXRhLmgKIEY6CWluY2x1ZGUvbGludXgvbGliYXRhLmgKIAorU0VSVkVSIEVOR0lORVMgMTBHYnBzIGlTQ1NJIC0gQmxhZGVFbmdpbmUgMiBEUklWRVIKK1A6ICAgICBKYXlhbW9oYW4gS2FsbGlja2FsCitNOiAgICAgamF5YW1vaGFua0BzZXJ2ZXJlbmdpbmVzLmNvbQorTDogICAgIGxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitXOiAgICAgaHR0cDovL3d3dy5zZXJ2ZXJlbmdpbmVzLmNvbQorUzogICAgIFN1cHBvcnRlZAorRjogICAgIGRyaXZlcnMvc2NzaS9iZTJpc2NzaS8KKwogU0VSVkVSIEVOR0lORVMgMTBHYnBzIE5JQyAtIEJsYWRlRW5naW5lIDIgRFJJVkVSCiBNOglTYXRoeWEgUGVybGEgPHNhdGh5YXBAc2VydmVyZW5naW5lcy5jb20+CiBNOglTdWJidSBTZWV0aGFyYW1hbiA8c3ViYnVzQHNlcnZlcmVuZ2luZXMuY29tPgpAQCAtNDY2MywxNSArNDczMSw4IEBACiBGOglkcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQwKgogRjoJZHJpdmVycy91c2IvaG9zdC9vaGNpLWxoN2E0MCoKIAotU0hQQyBIT1RQTFVHIERSSVZFUgotTToJS3Jpc3RlbiBDYXJsc29uIEFjY2FyZGkgPGtyaXN0ZW4uYy5hY2NhcmRpQGludGVsLmNvbT4KLUw6CWxpbnV4LXBjaUB2Z2VyLmtlcm5lbC5vcmcKLVM6CVN1cHBvcnRlZAotRjoJZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAqCi0KIFNJTVBMRSBGSVJNV0FSRSBJTlRFUkZBQ0UgKFNGSSkKLVA6CUxlbiBCcm93bgotTToJbGVuYkBrZXJuZWwub3JnCitNOglMZW4gQnJvd24gPGxlbmJAa2VybmVsLm9yZz4KIEw6CXNmaS1kZXZlbEBzaW1wbGVmaXJtd2FyZS5vcmcKIFc6CWh0dHA6Ly9zaW1wbGVmaXJtd2FyZS5vcmcvCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2xlbmIvbGludXgtc2ZpLTIuNi5naXQKQEAgLTQ2ODAsNyArNDc0MSw2IEBACiBGOglkcml2ZXJzL3NmaS8KIEY6CWluY2x1ZGUvbGludXgvc2ZpKi5oCiAKLQogU0lNVEVDIEVCMTEwQVRYIChDaGFsaWNlIENBVFMpCiBQOglCZW4gRG9va3MKIE06CVZpbmNlbnQgU2FuZGVycyA8c3VwcG9ydEBzaW10ZWMuY28udWs+CkBAIC01MTIwLDYgKzUxODAsMjAgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvY2hhci90cG0vCiAKK1RSQUNJTkcKK006CVN0ZXZlbiBSb3N0ZWR0IDxyb3N0ZWR0QGdvb2RtaXMub3JnPgorTToJRnJlZGVyaWMgV2Vpc2JlY2tlciA8ZndlaXNiZWNAZ21haWwuY29tPgorTToJSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC9saW51eC0yLjYtdGlwLmdpdCB0cmFjaW5nL2NvcmUKK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLnR4dAorRjoJYXJjaC8qLyovKi9mdHJhY2UuaAorRjoJYXJjaC8qL2tlcm5lbC9mdHJhY2UuYworRjoJaW5jbHVkZS8qL2Z0cmFjZS5oCitGOglpbmNsdWRlL2xpbnV4L3RyYWNlKi5oCitGOglpbmNsdWRlL3RyYWNlLworRjoJa2VybmVsL3RyYWNlLworCiBUUklWSUFMIFBBVENIRVMKIE06CUppcmkgS29zaW5hIDx0cml2aWFsQGtlcm5lbC5vcmc+CiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2ppa29zL3RyaXZpYWwuZ2l0CkBAIC01NjA4LDYgKzU2ODIsMTMgQEAKIEY6CWRyaXZlcnMvdmx5bnEvdmx5bnEuYwogRjoJaW5jbHVkZS9saW51eC92bHlucS5oCiAKK1ZNV0FSRSBWTVhORVQzIEVUSEVSTkVUIERSSVZFUgorTTogICAgIFNocmV5YXMgQmhhdGV3YXJhIDxzYmhhdGV3YXJhQHZtd2FyZS5jb20+CitNOiAgICAgVk13YXJlLCBJbmMuIDxwdi1kcml2ZXJzQHZtd2FyZS5jb20+CitMOiAgICAgbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzogICAgIE1haW50YWluZWQKK0Y6ICAgICBkcml2ZXJzL25ldC92bXhuZXQzLworCiBWT0xUQUdFIEFORCBDVVJSRU5UIFJFR1VMQVRPUiBGUkFNRVdPUksKIE06CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBNOglNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KQEAgLTU2NzksOCArNTc2MCw3IEBACiBGOglkcml2ZXJzL3Njc2kvd2Q3MDAwLmMKIAogV0lOQk9ORCBDSVIgRFJJVkVSCi1QOglEYXZpZCBI5HJkZW1hbgotTToJZGF2aWRAaGFyZGVtYW4ubnUKK006CURhdmlkIEjDpHJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2lucHV0L21pc2Mvd2luYm9uZC1jaXIuYwogCkBAIC01NzM3LDkgKzU4MTcsNyBAQAogRjoJaW5jbHVkZS9saW51eC93bTk3eHguaAogCiBXT0xGU09OIE1JQ1JPRUxFQ1RST05JQ1MgUE1JQyBEUklWRVJTCi1QOglNYXJrIEJyb3duCi1NOglicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbQotTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworTToJTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CiBUOglnaXQgZ2l0Oi8vb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tL2xpbnV4LTIuNi1hdWRpb3BsdXMKIFc6CWh0dHA6Ly9vcGVuc291cmNlLndvbGZzb25taWNyby5jb20vbm9kZS84CiBTOglTdXBwb3J0ZWQKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNDMzNDkzYS4uYjRjMDRmNyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBWRVJTSU9OID0gMgogUEFUQ0hMRVZFTCA9IDYKLVNVQkxFVkVMID0gMzEKLUVYVFJBVkVSU0lPTiA9CitTVUJMRVZFTCA9IDMyCitFWFRSQVZFUlNJT04gPSAtcmM2CiBOQU1FID0gTWFuLUVhdGluZyBTZWFscyBvZiBBbnRpcXVpdHkKIAogIyAqRE9DVU1FTlRBVElPTioKQEAgLTMxNSw2ICszMTUsNyBAQAogT0JKRFVNUAkJPSAkKENST1NTX0NPTVBJTEUpb2JqZHVtcAogQVdLCQk9IGF3awogR0VOS1NZTVMJPSBzY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zCitJTlNUQUxMS0VSTkVMICA6PSBpbnN0YWxsa2VybmVsCiBERVBNT0QJCT0gL3NiaW4vZGVwbW9kCiBLQUxMU1lNUwk9IHNjcmlwdHMva2FsbHN5bXMKIFBFUkwJCT0gcGVybApAQCAtMzUzLDcgKzM1NCw4IEBACiAKIGV4cG9ydCBWRVJTSU9OIFBBVENITEVWRUwgU1VCTEVWRUwgS0VSTkVMUkVMRUFTRSBLRVJORUxWRVJTSU9OCiBleHBvcnQgQVJDSCBTUkNBUkNIIENPTkZJR19TSEVMTCBIT1NUQ0MgSE9TVENGTEFHUyBDUk9TU19DT01QSUxFIEFTIExEIENDCi1leHBvcnQgQ1BQIEFSIE5NIFNUUklQIE9CSkNPUFkgT0JKRFVNUCBNQUtFIEFXSyBHRU5LU1lNUyBQRVJMIFVUU19NQUNISU5FCitleHBvcnQgQ1BQIEFSIE5NIFNUUklQIE9CSkNPUFkgT0JKRFVNUAorZXhwb3J0IE1BS0UgQVdLIEdFTktTWU1TIElOU1RBTExLRVJORUwgUEVSTCBVVFNfTUFDSElORQogZXhwb3J0IEhPU1RDWFggSE9TVENYWEZMQUdTIExERkxBR1NfTU9EVUxFIENIRUNLIENIRUNLRkxBR1MKIAogZXhwb3J0IEtCVUlMRF9DUFBGTEFHUyBOT1NURElOQ19GTEFHUyBMSU5VWElOQ0xVREUgT0JKQ09QWUZMQUdTIExERkxBR1MKQEAgLTU3MSw2ICs1NzMsOSBAQAogIyByZXZlcnQgdG8gcHJlLWdjYy00LjQgYmVoYXZpb3VyIG9mIC5laF9mcmFtZQogS0JVSUxEX0NGTEFHUwkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tZHdhcmYyLWNmaS1hc20pCiAKKyMgY29uc2VydmUgc3RhY2sgaWYgYXZhaWxhYmxlCitLQlVJTERfQ0ZMQUdTICAgKz0gJChjYWxsIGNjLW9wdGlvbiwtZmNvbnNlcnZlLXN0YWNrKQorCiAjIEFkZCB1c2VyIHN1cHBsaWVkIENQUEZMQUdTLCBBRkxBR1MgYW5kIENGTEFHUyBhcyB0aGUgbGFzdCBhc3NpZ25tZW50cwogIyBCdXQgd2FybiB1c2VyIHdoZW4gd2UgZG8gc28KIHdhcm4tYXNzaWduID0gXApAQCAtNTkxLDEyICs1OTYsMTIgQEAKIAogIyBVc2UgLS1idWlsZC1pZCB3aGVuIGF2YWlsYWJsZS4KIExERkxBR1NfQlVJTERfSUQgPSAkKHBhdHN1YnN0IC1XbCQoY29tbWEpJSwlLFwKLQkJCSAgICAgICQoY2FsbCBsZC1vcHRpb24sIC1XbCQoY29tbWEpLS1idWlsZC1pZCwpKQorCQkJICAgICAgJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0tYnVpbGQtaWQsKSkKIExERkxBR1NfTU9EVUxFICs9ICQoTERGTEFHU19CVUlMRF9JRCkKIExERkxBR1Nfdm1saW51eCArPSAkKExERkxBR1NfQlVJTERfSUQpCiAKIGlmZXEgKCQoQ09ORklHX1NUUklQX0FTTV9TWU1TKSx5KQotTERGTEFHU192bWxpbnV4CSs9IC1YCitMREZMQUdTX3ZtbGludXgJKz0gJChjYWxsIGxkLW9wdGlvbiwgLVgsKQogZW5kaWYKIAogIyBEZWZhdWx0IGtlcm5lbCBpbWFnZSB0byBidWlsZCB3aGVuIG5vIHNwZWNpZmljIHRhcmdldCBpcyBnaXZlbi4KQEAgLTk4MCwxMSArOTg1LDYgQEAKICMgQWxsIHRoZSBwcmVwYXJpbmcuLgogcHJlcGFyZTogcHJlcGFyZTAKIAotIyBMZWF2ZSB0aGlzIGFzIGRlZmF1bHQgZm9yIHByZXByb2Nlc3Npbmcgdm1saW51eC5sZHMuUywgd2hpY2ggaXMgbm93Ci0jIGRvbmUgaW4gYXJjaC8kKEFSQ0gpL2tlcm5lbC9NYWtlZmlsZQotCi1leHBvcnQgQ1BQRkxBR1Nfdm1saW51eC5sZHMgKz0gLVAgLUMgLVUkKEFSQ0gpCi0KICMgVGhlIGFzbSBzeW1saW5rIGNoYW5nZXMgd2hlbiAkKEFSQ0gpIGNoYW5nZXMuCiAjIERldGVjdCB0aGlzIGFuZCBhc2sgdXNlciB0byBydW4gbWFrZSBtcnByb3BlcgogIyBJZiBhc20gaXMgYSBzdGFsZSBzeW1saW5rIChwb2ludCB0byBkaXIgdGhhdCBkb2VzIG5vdCBleGlzdCkgcmVtb3ZlIGl0CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2ZjbnRsLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2ZjbnRsLmgKaW5kZXggMjVkYTAwMS4uZTQyODIzZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9mY250bC5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vZmNudGwuaApAQCAtMjYsNiArMjYsOCBAQAogI2RlZmluZSBGX0dFVE9XTgk2CS8qICBmb3Igc29ja2V0cy4gKi8KICNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCisjZGVmaW5lIEZfU0VUT1dOX0VYCTEyCisjZGVmaW5lIEZfR0VUT1dOX0VYCTEzCiAKIC8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCiAjZGVmaW5lIEZfUkRMQ0sJCTEKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IDU0N2U5MDkuLjNmMzkwZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zbXAuaApAQCAtNDcsNyArNDcsNyBAQAogZXh0ZXJuIGludCBzbXBfbnVtX2NwdXM7CiAKIGV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSk7Ci1leHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGkoY3B1bWFza190IG1hc2spOworZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwogCiAjZWxzZSAvKiBDT05GSUdfU01QICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCBiNGYyODRjLi4zNmIzYTMwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC0yMiwyMyArMjIsNiBAQAogCXJldHVybiBub2RlOwogfQogCi1zdGF0aWMgaW5saW5lIGNwdW1hc2tfdCBub2RlX3RvX2NwdW1hc2soaW50IG5vZGUpCi17Ci0JY3B1bWFza190IG5vZGVfY3B1X21hc2sgPSBDUFVfTUFTS19OT05FOwotCWludCBjcHU7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlpZiAoY3B1X3RvX25vZGUoY3B1KSA9PSBub2RlKQotCQkJY3B1X3NldChjcHUsIG5vZGVfY3B1X21hc2spOwotCX0KLQotI2lmZGVmIERFQlVHX05VTUEKLQlwcmludGsoIm5vZGUgJWQ6IGNwdV9tYXNrOiAlMDE2bHhcbiIsIG5vZGUsIG5vZGVfY3B1X21hc2spOwotI2VuZGlmCi0KLQlyZXR1cm4gbm9kZV9jcHVfbWFzazsKLX0KLQogZXh0ZXJuIHN0cnVjdCBjcHVtYXNrIG5vZGVfdG9fY3B1bWFza19tYXBbXTsKIC8qIEZJWE1FOiBUaGlzIGlzIGR1bWIsIHJlY2FsY3VsYXRpbmcgZXZlcnkgdGltZS4gIEJ1dCBzaW1wbGUuICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2tfb2Zfbm9kZShpbnQgbm9kZSkKQEAgLTU1LDcgKzM4LDYgQEAKIAlyZXR1cm4gJm5vZGVfdG9fY3B1bWFza19tYXBbbm9kZV07CiB9CiAKLSNkZWZpbmUgcGNpYnVzX3RvX2NwdW1hc2soYnVzKQkoY3B1X29ubGluZV9tYXApCiAjZGVmaW5lIGNwdW1hc2tfb2ZfcGNpYnVzKGJ1cykJKGNwdV9vbmxpbmVfbWFzaykKIAogI2VuZGlmIC8qICFDT05GSUdfTlVNQSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9tYXJ2ZWwuYyBiL2FyY2gvYWxwaGEva2VybmVsL2NvcmVfbWFydmVsLmMKaW5kZXggZTMwMmRhZS4uOGUwNTllNSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9tYXJ2ZWwuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogewogCXN0cnVjdCBtYXJ2ZWxfYWdwX2FwZXJ0dXJlICphcGVyID0gYWdwLT5hcGVydHVyZS5zeXNkYXRhOwogCXJldHVybiBpb21tdV9iaW5kKGFwZXItPmFyZW5hLCBhcGVyLT5wZ19zdGFydCArIHBnX3N0YXJ0LCAKLQkJCSAgbWVtLT5wYWdlX2NvdW50LCBtZW0tPm1lbW9yeSk7CisJCQkgIG1lbS0+cGFnZV9jb3VudCwgbWVtLT5wYWdlcyk7CiB9CiAKIHN0YXRpYyBpbnQgCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX3RpdGFuLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX3RpdGFuLmMKaW5kZXggMzE5ZmNiNy4uNzY2ODY0OSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV90aXRhbi5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2NvcmVfdGl0YW4uYwpAQCAtNjgwLDcgKzY4MCw3IEBACiB7CiAJc3RydWN0IHRpdGFuX2FncF9hcGVydHVyZSAqYXBlciA9IGFncC0+YXBlcnR1cmUuc3lzZGF0YTsKIAlyZXR1cm4gaW9tbXVfYmluZChhcGVyLT5hcmVuYSwgYXBlci0+cGdfc3RhcnQgKyBwZ19zdGFydCwgCi0JCQkgIG1lbS0+cGFnZV9jb3VudCwgbWVtLT5tZW1vcnkpOworCQkJICBtZW0tPnBhZ2VfY291bnQsIG1lbS0+cGFnZXMpOwogfQogCiBzdGF0aWMgaW50IApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCAxOWI4NjMyLi42ZjgwY2E0IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMTMsNiArMTMsNSBAQAogc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzayA9IElOSVRfVEFTSyhpbml0X3Rhc2spOwogRVhQT1JUX1NZTUJPTChpbml0X3Rhc2spOwogCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuZGF0YS5pbml0X3RocmVhZCIpKSkKLQk9IHsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07Cit1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gX19pbml0X3Rhc2tfZGF0YSA9CisJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pbXBsLmggYi9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW1wbC5oCmluZGV4IDAwZWRkMDQuLjg1NDU3YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pbXBsLmgKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpX2ltcGwuaApAQCAtMTk4LDcgKzE5OCw3IEBACiAKIGV4dGVybiBpbnQgaW9tbXVfcmVzZXJ2ZShzdHJ1Y3QgcGNpX2lvbW11X2FyZW5hICosIGxvbmcsIGxvbmcpOwogZXh0ZXJuIGludCBpb21tdV9yZWxlYXNlKHN0cnVjdCBwY2lfaW9tbXVfYXJlbmEgKiwgbG9uZywgbG9uZyk7Ci1leHRlcm4gaW50IGlvbW11X2JpbmQoc3RydWN0IHBjaV9pb21tdV9hcmVuYSAqLCBsb25nLCBsb25nLCB1bnNpZ25lZCBsb25nICopOworZXh0ZXJuIGludCBpb21tdV9iaW5kKHN0cnVjdCBwY2lfaW9tbXVfYXJlbmEgKiwgbG9uZywgbG9uZywgc3RydWN0IHBhZ2UgKiopOwogZXh0ZXJuIGludCBpb21tdV91bmJpbmQoc3RydWN0IHBjaV9pb21tdV9hcmVuYSAqLCBsb25nLCBsb25nKTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCmluZGV4IGQxNWFlZGYuLjg0NDk1MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCkBAIC04NzYsNyArODc2LDcgQEAKIAogaW50CiBpb21tdV9iaW5kKHN0cnVjdCBwY2lfaW9tbXVfYXJlbmEgKmFyZW5hLCBsb25nIHBnX3N0YXJ0LCBsb25nIHBnX2NvdW50LCAKLQkgICB1bnNpZ25lZCBsb25nICpwaHlzYWRkcnMpCisJICAgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgKnB0ZXM7CkBAIC04OTYsNyArODk2LDcgQEAKIAl9CiAJCQogCWZvcihpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgcGdfY291bnQ7IGkrKywgaisrKQotCQlwdGVzW2pdID0gbWtfaW9tbXVfcHRlKHBoeXNhZGRyc1tpXSk7CisJCXB0ZXNbal0gPSBta19pb21tdV9wdGUocGFnZV90b19waHlzKHBhZ2VzW2ldKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmVuYS0+bG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggM2EyZmI3YS4uMjg5MDM5YiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKaW5kZXggYjFmZTU2Ny4uNDJhYTA3OCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKQEAgLTU0OCwxNiArNTQ4LDE2IEBACiAKIAwKIHN0YXRpYyB2b2lkCi1zZW5kX2lwaV9tZXNzYWdlKGNwdW1hc2tfdCB0b193aG9tLCBlbnVtIGlwaV9tZXNzYWdlX3R5cGUgb3BlcmF0aW9uKQorc2VuZF9pcGlfbWVzc2FnZShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqdG9fd2hvbSwgZW51bSBpcGlfbWVzc2FnZV90eXBlIG9wZXJhdGlvbikKIHsKIAlpbnQgaTsKIAogCW1iKCk7Ci0JZm9yX2VhY2hfY3B1X21hc2soaSwgdG9fd2hvbSkKKwlmb3JfZWFjaF9jcHUoaSwgdG9fd2hvbSkKIAkJc2V0X2JpdChvcGVyYXRpb24sICZpcGlfZGF0YVtpXS5iaXRzKTsKIAogCW1iKCk7Ci0JZm9yX2VhY2hfY3B1X21hc2soaSwgdG9fd2hvbSkKKwlmb3JfZWFjaF9jcHUoaSwgdG9fd2hvbSkKIAkJd3JpcGlyKGkpOwogfQogCkBAIC02MjQsNyArNjI0LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgInNtcF9zZW5kX3Jlc2NoZWR1bGU6IFNlbmRpbmcgSVBJIHRvIHNlbGYuXG4iKTsKICNlbmRpZgotCXNlbmRfaXBpX21lc3NhZ2UoY3B1bWFza19vZl9jcHUoY3B1KSwgSVBJX1JFU0NIRURVTEUpOworCXNlbmRfaXBpX21lc3NhZ2UoY3B1bWFza19vZihjcHUpLCBJUElfUkVTQ0hFRFVMRSk7CiB9CiAKIHZvaWQKQEAgLTYzNiwxNyArNjM2LDE3IEBACiAJaWYgKGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGJvb3RfY3B1X2lkKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzbXBfc2VuZF9zdG9wOiBOb3Qgb24gYm9vdCBjcHUuXG4iKTsKICNlbmRpZgotCXNlbmRfaXBpX21lc3NhZ2UodG9fd2hvbSwgSVBJX0NQVV9TVE9QKTsKKwlzZW5kX2lwaV9tZXNzYWdlKCZ0b193aG9tLCBJUElfQ1BVX1NUT1ApOwogfQogCi12b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaShjcHVtYXNrX3QgbWFzaykKK3ZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJc2VuZF9pcGlfbWVzc2FnZShtYXNrLCBJUElfQ0FMTF9GVU5DKTsKIH0KIAogdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpCiB7Ci0Jc2VuZF9pcGlfbWVzc2FnZShjcHVtYXNrX29mX2NwdShjcHUpLCBJUElfQ0FMTF9GVU5DX1NJTkdMRSk7CisJc2VuZF9pcGlfbWVzc2FnZShjcHVtYXNrX29mKGNwdSksIElQSV9DQUxMX0ZVTkNfU0lOR0xFKTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FscGhhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDZkYzAzYzMuLjAwM2VmNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIE9VVFBVVF9GT1JNQVQoImVsZjY0LWFscGhhIikKQEAgLTMxLDg4ICszMiwyMSBAQAogCX0gOmtlcm5lbAogCiAJUk9EQVRBCi0KLQkvKiBFeGNlcHRpb24gdGFibGUgKi8KLQkuID0gQUxJR04oMTYpOwotCV9fZXhfdGFibGUgOiB7Ci0JCV9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0JCSooX19leF90YWJsZSkKLQkJX19zdG9wX19fZXhfdGFibGUgPSAuOwotCX0KKwlFWENFUFRJT05fVEFCTEUoMTYpCiAKIAkvKiBXaWxsIGJlIGZyZWVkIGFmdGVyIGluaXQgKi8KLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KLQlfX2luaXRfYmVnaW4gPSAuOwotCS5pbml0LnRleHQgOiB7Ci0JCV9zaW5pdHRleHQgPSAuOwotCQlJTklUX1RFWFQKLQkJX2Vpbml0dGV4dCA9IC47Ci0JfQotCS5pbml0LmRhdGEgOiB7Ci0JCUlOSVRfREFUQQotCX0KLQotCS4gPSBBTElHTigxNik7Ci0JLmluaXQuc2V0dXAgOiB7Ci0JCV9fc2V0dXBfc3RhcnQgPSAuOwotCQkqKC5pbml0LnNldHVwKQotCQlfX3NldHVwX2VuZCA9IC47Ci0JfQotCi0JLiA9IEFMSUdOKDgpOwotCS5pbml0Y2FsbC5pbml0IDogewotCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJSU5JVENBTExTCi0JCV9faW5pdGNhbGxfZW5kID0gLjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQkuaW5pdC5yYW1mcyA6IHsKLQkJX19pbml0cmFtZnNfc3RhcnQgPSAuOwotCQkqKC5pbml0LnJhbWZzKQotCQlfX2luaXRyYW1mc19lbmQgPSAuOwotCX0KLSNlbmRpZgotCi0JLiA9IEFMSUdOKDgpOwotCS5jb25faW5pdGNhbGwuaW5pdCA6IHsKLQkJX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotCQkqKC5jb25faW5pdGNhbGwuaW5pdCkKLQkJX19jb25faW5pdGNhbGxfZW5kID0gLjsKLQl9Ci0KLQkuID0gQUxJR04oOCk7Ci0JU0VDVVJJVFlfSU5JVAotCisJX19pbml0X2JlZ2luID0gQUxJR04oUEFHRV9TSVpFKTsKKwlJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCisJSU5JVF9EQVRBX1NFQ1RJT04oMTYpCiAJUEVSQ1BVKFBBR0VfU0laRSkKLQotCS4gPSBBTElHTigyICogUEFHRV9TSVpFKTsKKwkvKiBBbGlnbiB0byBUSFJFQURfU0laRSByYXRoZXIgdGhhbiBQQUdFX1NJWkUgaGVyZSBzbyBhbnkgcGFkZGluZyBwYWdlCisJICAgbmVlZGVkIGZvciB0aGUgVEhSRUFEX1NJWkUgYWxpZ25lZCBpbml0X3Rhc2sgZ2V0cyBmcmVlZCBhZnRlciBpbml0ICovCisJLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsKIAlfX2luaXRfZW5kID0gLjsKIAkvKiBGcmVlZCBhZnRlciBpbml0IGVuZHMgaGVyZSAqLwogCi0JLyogTm90ZSAyIHBhZ2UgYWxpZ25tZW50IGFib3ZlLiAgKi8KLQkuZGF0YS5pbml0X3RocmVhZCA6IHsKLQkJKiguZGF0YS5pbml0X3RocmVhZCkKLQl9Ci0KLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQkuZGF0YS5wYWdlX2FsaWduZWQgOiB7Ci0JCSooLmRhdGEucGFnZV9hbGlnbmVkKQotCX0KLQotCS4gPSBBTElHTig2NCk7Ci0JLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7Ci0JCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0JfQotCiAJX2RhdGEgPSAuOwotCS8qIERhdGEgKi8KLQkuZGF0YSA6IHsKLQkJREFUQV9EQVRBCi0JCUNPTlNUUlVDVE9SUwotCX0KKwlSV19EQVRBX1NFQ1RJT04oNjQsIFBBR0VfU0laRSwgVEhSRUFEX1NJWkUpCiAKIAkuZ290IDogewogCQkqKC5nb3QpCkBAIC0xMjIsMTYgKzU2LDcgQEAKIAl9CiAJX2VkYXRhID0gLjsJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwogCi0JX19ic3Nfc3RhcnQgPSAuOwotCS5zYnNzIDogewotCQkqKC5zYnNzKQotCQkqKC5zY29tbW9uKQotCX0KLQkuYnNzIDogewotCQkqKC5ic3MpCi0JCSooQ09NTU9OKQotCX0KLQlfX2Jzc19zdG9wID0gLjsKKwlCU1NfU0VDVElPTigwLCAwLCAwKQogCV9lbmQgPSAuOwogCiAJLm1kZWJ1ZyAwIDogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggZDc3OGE2OS4uMWM0MTE5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC00Niw2ICs0NiwxMCBAQAogCWRlcGVuZHMgb24gR0VORVJJQ19DTE9DS0VWRU5UUwogCWRlZmF1bHQgeSBpZiBTTVAgJiYgIUxPQ0FMX1RJTUVSUwogCitjb25maWcgSEFWRV9UQ00KKwlib29sCisJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCisKIGNvbmZpZyBOT19JT1BPUlQKIAlib29sCiAKQEAgLTY0OSw2ICs2NTMsNyBAQAogCWJvb2wgIlNULUVyaWNzc29uIFUzMDAgU2VyaWVzIgogCWRlcGVuZHMgb24gTU1VCiAJc2VsZWN0IENQVV9BUk05MjZUCisJc2VsZWN0IEhBVkVfVENNCiAJc2VsZWN0IEFSTV9BTUJBCiAJc2VsZWN0IEFSTV9WSUMKIAlzZWxlY3QgR0VORVJJQ19USU1FCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDU0NjYxMTIuLmE3M2NhYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0xNCw3ICsxNCw3IEBACiBpZmVxICgkKENPTkZJR19DUFVfRU5ESUFOX0JFOCkseSkKIExERkxBR1Nfdm1saW51eAkrPSAtLWJlOAogZW5kaWYKLUNQUEZMQUdTX3ZtbGludXgubGRzID0gLURURVhUX09GRlNFVD0kKFRFWFRfT0ZGU0VUKQorCiBPQkpDT1BZRkxBR1MJOj0tTyBiaW5hcnkgLVIgLm5vdGUgLVIgLm5vdGUuZ251LmJ1aWxkLWlkIC1SIC5jb21tZW50IC1TCiBHWkZMQUdTCQk6PS05CiAjS0JVSUxEX0NGTEFHUwkrPS1waXBlCkBAIC0yNzksNyArMjc5LDcgQEAKICAgZWNobyAgJyAgICAgICAgICAgICAgICAgIChzdXBwbHkgaW5pdHJkIGltYWdlIHZpYSBtYWtlIHZhcmlhYmxlIElOSVRSRD08cGF0aD4pJwogICBlY2hvICAnICBpbnN0YWxsICAgICAgIC0gSW5zdGFsbCB1bmNvbXByZXNzZWQga2VybmVsJwogICBlY2hvICAnICB6aW5zdGFsbCAgICAgIC0gSW5zdGFsbCBjb21wcmVzc2VkIGtlcm5lbCcKLSAgZWNobyAgJyAgICAgICAgICAgICAgICAgIEluc3RhbGwgdXNpbmcgKHlvdXIpIH4vYmluL2luc3RhbGxrZXJuZWwgb3InCi0gIGVjaG8gICcgICAgICAgICAgICAgICAgICAoZGlzdHJpYnV0aW9uKSAvc2Jpbi9pbnN0YWxsa2VybmVsIG9yJworICBlY2hvICAnICAgICAgICAgICAgICAgICAgSW5zdGFsbCB1c2luZyAoeW91cikgfi9iaW4vJChJTlNUQUxMS0VSTkVMKSBvcicKKyAgZWNobyAgJyAgICAgICAgICAgICAgICAgIChkaXN0cmlidXRpb24pIC9zYmluLyQoSU5TVEFMTEtFUk5FTCkgb3InCiAgIGVjaG8gICcgICAgICAgICAgICAgICAgICBpbnN0YWxsIHRvICQkKElOU1RBTExfUEFUSCkgYW5kIHJ1biBsaWxvJwogZW5kZWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gvYXJtL2Jvb3QvaW5zdGFsbC5zaAppbmRleCA5ZjliZWQyLi4wNmVhN2Q0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2luc3RhbGwuc2gKKysrIGIvYXJjaC9hcm0vYm9vdC9pbnN0YWxsLnNoCkBAIC0yMSw4ICsyMSw4IEBACiAjCiAKICMgVXNlciBtYXkgaGF2ZSBhIGN1c3RvbSBpbnN0YWxsIHNjcmlwdAotaWYgWyAteCB+L2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCBdOyB0aGVuIGV4ZWMgfi9iaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgIiRAIjsgZmkKLWlmIFsgLXggL3NiaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIC9zYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsICIkQCI7IGZpCitpZiBbIC14IH4vYmluLyR7SU5TVEFMTEtFUk5FTH0gXTsgdGhlbiBleGVjIH4vYmluLyR7SU5TVEFMTEtFUk5FTH0gIiRAIjsgZmkKK2lmIFsgLXggL3NiaW4vJHtJTlNUQUxMS0VSTkVMfSBdOyB0aGVuIGV4ZWMgL3NiaW4vJHtJTlNUQUxMS0VSTkVMfSAiJEAiOyBmaQogCiBpZiBbICIkKGJhc2VuYW1lICQyKSIgPSAiekltYWdlIiBdOyB0aGVuCiAjIENvbXByZXNzZWQgaW5zdGFsbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCmluZGV4IDIyOTNmMGMuLmJkMzZjNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYworKysgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKQEAgLTg2NSw2ICs4NjUsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0wobG9jb21vX2dwaW9fc2V0X2Rpcik7CiAKIGludCBsb2NvbW9fZ3Bpb19yZWFkX2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGJpdHMpCiB7CkBAIC04ODIsNiArODgzLDcgQEAKIAlyZXQgJj0gYml0czsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChsb2NvbW9fZ3Bpb19yZWFkX2xldmVsKTsKIAogaW50IGxvY29tb19ncGlvX3JlYWRfb3V0cHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGJpdHMpCiB7CkBAIC04OTksNiArOTAxLDcgQEAKIAlyZXQgJj0gYml0czsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChsb2NvbW9fZ3Bpb19yZWFkX291dHB1dCk7CiAKIHZvaWQgbG9jb21vX2dwaW9fd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYml0cywgdW5zaWduZWQgaW50IHNldCkKIHsKQEAgLTkyMCw2ICs5MjMsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0wobG9jb21vX2dwaW9fd3JpdGUpOwogCiBzdGF0aWMgdm9pZCBsb2NvbW9fbTYyMzMyX3NlbmRiaXQodm9pZCAqbWFwYmFzZSwgaW50IGJpdCkKIHsKQEAgLTEwODQsMTMgKzEwODgsMTIgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjaGlwLT5sb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKGxvY29tb19tNjIzMzJfc2VuZGRhdGEpOwogCiAvKgogICoJRnJvbnRsaWdodCBjb250cm9sCiAgKi8KIAotc3RhdGljIHN0cnVjdCBsb2NvbW8gKmxvY29tb19jaGlwX2RyaXZlcihzdHJ1Y3QgbG9jb21vX2RldiAqbGRldik7Ci0KIHZvaWQgbG9jb21vX2Zyb250bGlnaHRfc2V0KHN0cnVjdCBsb2NvbW9fZGV2ICpkZXYsIGludCBkdXR5LCBpbnQgdnIsIGludCBicHdmKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMTgyLDExICsxMTg1LDEzIEBACiAJZHJpdmVyLT5kcnYuYnVzID0gJmxvY29tb19idXNfdHlwZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRydik7CiB9CitFWFBPUlRfU1lNQk9MKGxvY29tb19kcml2ZXJfcmVnaXN0ZXIpOwogCiB2b2lkIGxvY29tb19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgbG9jb21vX2RyaXZlciAqZHJpdmVyKQogewogCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRydik7CiB9CitFWFBPUlRfU1lNQk9MKGxvY29tb19kcml2ZXJfdW5yZWdpc3Rlcik7CiAKIHN0YXRpYyBpbnQgX19pbml0IGxvY29tb19pbml0KHZvaWQpCiB7CkBAIC0xMjA4LDExICsxMjEzLDMgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU2hhcnAgTG9Db01vIGNvcmUgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJKb2huIExlbnogPGxlbnpAY3Mud2lzYy5lZHU+Iik7Ci0KLUVYUE9SVF9TWU1CT0wobG9jb21vX2RyaXZlcl9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKGxvY29tb19kcml2ZXJfdW5yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKGxvY29tb19ncGlvX3NldF9kaXIpOwotRVhQT1JUX1NZTUJPTChsb2NvbW9fZ3Bpb19yZWFkX2xldmVsKTsKLUVYUE9SVF9TWU1CT0wobG9jb21vX2dwaW9fcmVhZF9vdXRwdXQpOwotRVhQT1JUX1NZTUJPTChsb2NvbW9fZ3Bpb193cml0ZSk7Ci1FWFBPUlRfU1lNQk9MKGxvY29tb19tNjIzMzJfc2VuZGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCmluZGV4IGVmMTI3OTQuLjhiYTcwNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYworKysgYi9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKQEAgLTEwMzIsNiArMTAzMiw3IEBACiAKIAlyZXR1cm4gX19zYTExMTFfcGxsX2Nsb2NrKHNhY2hpcCk7CiB9CitFWFBPUlRfU1lNQk9MKHNhMTExMV9wbGxfY2xvY2spOwogCiAvKioKICAqCXNhMTExMV9zZWxlY3RfYXVkaW9fbW9kZSAtIHNlbGVjdCBJMlMgb3IgQUMgbGluayBtb2RlCkBAIC0xMDU5LDYgKzEwNjAsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2FjaGlwLT5sb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKHNhMTExMV9zZWxlY3RfYXVkaW9fbW9kZSk7CiAKIC8qKgogICoJc2ExMTExX3NldF9hdWRpb19yYXRlIC0gc2V0IHRoZSBhdWRpbyBzYW1wbGUgcmF0ZQpAQCAtMTA4Myw2ICsxMDg1LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzYTExMTFfc2V0X2F1ZGlvX3JhdGUpOwogCiAvKioKICAqCXNhMTExMV9nZXRfYXVkaW9fcmF0ZSAtIGdldCB0aGUgYXVkaW8gc2FtcGxlIHJhdGUKQEAgLTExMDAsNiArMTEwMyw3IEBACiAKIAlyZXR1cm4gX19zYTExMTFfcGxsX2Nsb2NrKHNhY2hpcCkgLyAoMjU2ICogZGl2KTsKIH0KK0VYUE9SVF9TWU1CT0woc2ExMTExX2dldF9hdWRpb19yYXRlKTsKIAogdm9pZCBzYTExMTFfc2V0X2lvX2RpcihzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgYml0cywgdW5zaWduZWQgaW50IGRpciwKQEAgLTExMjgsNiArMTEzMiw3IEBACiAJTU9ESUZZX0JJVFMoZ3BpbyArIFNBMTExMV9HUElPX1BDU0RSLCAoYml0cyA+PiAxNikgJiAyNTUsIHNsZWVwX2RpciA+PiAxNik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2FjaGlwLT5sb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKHNhMTExMV9zZXRfaW9fZGlyKTsKIAogdm9pZCBzYTExMTFfc2V0X2lvKHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiwgdW5zaWduZWQgaW50IGJpdHMsIHVuc2lnbmVkIGludCB2KQogewpAQCAtMTE0Miw2ICsxMTQ3LDcgQEAKIAlNT0RJRllfQklUUyhncGlvICsgU0ExMTExX0dQSU9fUENEV1IsIChiaXRzID4+IDE2KSAmIDI1NSwgdiA+PiAxNik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2FjaGlwLT5sb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKHNhMTExMV9zZXRfaW8pOwogCiB2b2lkIHNhMTExMV9zZXRfc2xlZXBfaW8oc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2LCB1bnNpZ25lZCBpbnQgYml0cywgdW5zaWduZWQgaW50IHYpCiB7CkBAIC0xMTU2LDYgKzExNjIsNyBAQAogCU1PRElGWV9CSVRTKGdwaW8gKyBTQTExMTFfR1BJT19QQ1NTUiwgKGJpdHMgPj4gMTYpICYgMjU1LCB2ID4+IDE2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0woc2ExMTExX3NldF9zbGVlcF9pbyk7CiAKIC8qCiAgKiBJbmRpdmlkdWFsIGRldmljZSBvcGVyYXRpb25zLgpAQCAtMTE3Niw2ICsxMTgzLDcgQEAKIAlzYTExMTFfd3JpdGVsKHZhbCB8IHNhZGV2LT5za3Bjcl9tYXNrLCBzYWNoaXAtPmJhc2UgKyBTQTExMTFfU0tQQ1IpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTChzYTExMTFfZW5hYmxlX2RldmljZSk7CiAKIC8qKgogICoJc2ExMTExX2Rpc2FibGVfZGV2aWNlIC0gZGlzYWJsZSBhbiBvbi1jaGlwIFNBMTExMSBmdW5jdGlvbiBibG9jawpAQCAtMTE5Miw2ICsxMjAwLDcgQEAKIAlzYTExMTFfd3JpdGVsKHZhbCAmIH5zYWRldi0+c2twY3JfbWFzaywgc2FjaGlwLT5iYXNlICsgU0ExMTExX1NLUENSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0woc2ExMTExX2Rpc2FibGVfZGV2aWNlKTsKIAogLyoKICAqCVNBMTExMSAiUmVnaXN0ZXIgQWNjZXNzIEJ1cy4iCkBAIC0xMjU5LDE3ICsxMjY4LDIwIEBACiAJLnN1c3BlbmQJPSBzYTExMTFfYnVzX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBzYTExMTFfYnVzX3Jlc3VtZSwKIH07CitFWFBPUlRfU1lNQk9MKHNhMTExMV9idXNfdHlwZSk7CiAKIGludCBzYTExMTFfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBzYTExMTFfZHJpdmVyICpkcml2ZXIpCiB7CiAJZHJpdmVyLT5kcnYuYnVzID0gJnNhMTExMV9idXNfdHlwZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRydik7CiB9CitFWFBPUlRfU1lNQk9MKHNhMTExMV9kcml2ZXJfcmVnaXN0ZXIpOwogCiB2b2lkIHNhMTExMV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJpdmVyKQogewogCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRydik7CiB9CitFWFBPUlRfU1lNQk9MKHNhMTExMV9kcml2ZXJfdW5yZWdpc3Rlcik7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNhMTExMV9pbml0KHZvaWQpCiB7CkBAIC0xMjkwLDE2ICsxMzAyLDMgQEAKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBDb3Jwb3JhdGlvbiBTQTExMTEgY29yZSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotRVhQT1JUX1NZTUJPTChzYTExMTFfc2VsZWN0X2F1ZGlvX21vZGUpOwotRVhQT1JUX1NZTUJPTChzYTExMTFfc2V0X2F1ZGlvX3JhdGUpOwotRVhQT1JUX1NZTUJPTChzYTExMTFfZ2V0X2F1ZGlvX3JhdGUpOwotRVhQT1JUX1NZTUJPTChzYTExMTFfc2V0X2lvX2Rpcik7Ci1FWFBPUlRfU1lNQk9MKHNhMTExMV9zZXRfaW8pOwotRVhQT1JUX1NZTUJPTChzYTExMTFfc2V0X3NsZWVwX2lvKTsKLUVYUE9SVF9TWU1CT0woc2ExMTExX2VuYWJsZV9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChzYTExMTFfZGlzYWJsZV9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChzYTExMTFfcGxsX2Nsb2NrKTsKLUVYUE9SVF9TWU1CT0woc2ExMTExX2J1c190eXBlKTsKLUVYUE9SVF9TWU1CT0woc2ExMTExX2RyaXZlcl9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKHNhMTExMV9kcml2ZXJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vdmljLmMgYi9hcmNoL2FybS9jb21tb24vdmljLmMKaW5kZXggOTIwY2VkMC4uZjIzMjk0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3ZpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi92aWMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9oMzYwMF9kZWZjb25maWcKaW5kZXggMTUwMjk1Ny4uZjZhZWQ3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9oMzYwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9oMzYwMF9kZWZjb25maWcKQEAgLTkwLDcgKzkwLDYgQEAKICMgQ09ORklHX1NBMTEwMF9DT0xMSUUgaXMgbm90IHNldAogIyBDT05GSUdfU0ExMTAwX0gzMTAwIGlzIG5vdCBzZXQKIENPTkZJR19TQTExMDBfSDM2MDA9eQotQ09ORklHX1NBMTEwMF9IM1hYWD15CiAjIENPTkZJR19TQTExMDBfQkFER0U0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NBMTEwMF9KT1JOQURBNzIwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBMTEwMF9IQUNLS0lUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaW9wMzN4X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW9wMzN4X2RlZmNvbmZpZwppbmRleCBlZWM0ODgyLi5lZDJkNTlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2lvcDMzeF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9pb3AzM3hfZGVmY29uZmlnCkBAIC0xLDI5ICsxLDI2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQtcmM1Ci0jIFdlZCBEZWMgMTIgMTY6MTE6MjcgMjAwNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxLXJjNgorIyBUdWUgQXVnIDE4IDEzOjQxOjQxIDIwMDkKICMKIENPTkZJR19BUk09eQogQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKLSMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAotIyBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19HUElPPXkKIENPTkZJR19NTVU9eQotIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKIENPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQogQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC00MCwyMSArMzcsMzkgQEAKIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCisjIENPTkZJR19DTEFTU0lDX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfTkFNRVNQQUNFUz15CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9OUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19SRF9HWklQPXkKK0NPTkZJR19SRF9CWklQMj15CitDT05GSUdfUkRfTFpNQT15CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CkBAIC02NywyOSArODIsNDggQEAKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15Ci1DT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQorQ09ORklHX0FJTz15CisKKyMKKyMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUENJX1FVSVJLUz15CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15Ci0jIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKIENPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MU0YgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xMDMsNiArMTM3LDcgQEAKIENPTkZJR19ERUZBVUxUX0NGUT15CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CiAKICMKICMgU3lzdGVtIFR5cGUKQEAgLTExMiwxNSArMTQ3LDE1IEBACiAjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0dFTUlOSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1RNUDNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0lPUDMzWD15CkBAIC0xMjgsMTkgKzE2MywyNiBAQAogIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LSVJLV09PRCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xPS0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NVjc4WFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01NUCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0tTODY5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX05TOVhYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1c5MFg5MDAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVNNIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzY0WFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9VMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAotQ09ORklHX0lPUDNYWF9BVFU9eQogCiAjCiAjIElPUDMzeCBJbXBsZW1lbnRhdGlvbiBPcHRpb25zCkBAIC0xNTEsMTQgKzE5Myw2IEBACiAjCiBDT05GSUdfQVJDSF9JUTgwMzMxPXkKIENPTkZJR19NQUNIX0lRODAzMzI9eQotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQKLSMKIENPTkZJR19QTEFUX0lPUD15CiAKICMKQEAgLTE2OCw2ICsyMDIsNyBAQAogQ09ORklHX0NQVV9YU0NBTEU9eQogQ09ORklHX0NQVV8zMnY1PXkKIENPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfUEFCUlRfTk9JRkFSPXkKIENPTkZJR19DUFVfQ0FDSEVfVklWVD15CiBDT05GSUdfQ1BVX1RMQl9WNFdCST15CiBDT05GSUdfQ1BVX0NQMTU9eQpAQCAtMTc4LDcgKzIxMyw2IEBACiAjCiAjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX09VVEVSX0NBQ0hFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lXTU1YVCBpcyBub3Qgc2V0CiBDT05GSUdfWFNDQUxFX1BNVT15CiAKQEAgLTE5MCw0MSArMjI0LDU1IEBACiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiBDT05GSUdfUENJX0xFR0FDWT15CiAjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUENJX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0lPViBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBGZWF0dXJlcwogIwotIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKK0NPTkZJR19WTVNQTElUXzNHPXkKKyMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAorIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MTAwCiAjIENPTkZJR19BRUFCSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAorIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQogIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2Ci0jIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQotQ09ORklHX0JPVU5DRT15CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCiBDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0hBVkVfTUxPQ0s9eQorQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CisjIENPTkZJR19VQUNDRVNTX1dJVEhfTUVNQ1BZIGlzIG5vdCBzZXQKIAogIwogIyBCb290IG9wdGlvbnMKICMKIENPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKIENPTkZJR19aQk9PVF9ST01fQlNTPTB4MAotQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAgY2FjaGVwb2xpY3k9d3JpdGVhbGxvYyIKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDExNTIwMCByb290PS9kZXYvbmZzIGlwPWJvb3RwIGNhY2hlcG9saWN5PXdyaXRlYWxsb2MgaW9wM3h4X2luaXRfYXR1PXkiCiAjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKIAogIworIyBDUFUgUG93ZXIgTWFuYWdlbWVudAorIworIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAorCisjCiAjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgogIwogCkBAIC0yMzksNiArMjg3LDggQEAKICMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCiAjCiBDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BT1VUPXkKIENPTkZJR19CSU5GTVRfQU9VVD15CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldApAQCAtMjQ3LDExICsyOTcsNyBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKLQotIwotIyBOZXR3b3JraW5nCi0jCitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0yNjQsNiArMzEwLDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKIENPTkZJR19JUF9NVUxUSUNBU1Q9eQpAQCAtMzEwLDYgKzM1Nyw3IEBACiAjIENPTkZJR19JUFY2X1NJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01ST1VURSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldApAQCAtMzE3LDYgKzM2NSw3IEBACiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKQEAgLTMyNiwyNCArMzc1LDMxIEBACiAjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19EQ0IgaXMgbm90IHNldAogCiAjCiAjIE5ldHdvcmsgdGVzdGluZwogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKIAogIwotIyBXaXJlbGVzcworIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCisjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKIApAQCAtMzU3LDcgKzQxMyw5IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKK0NPTkZJR19GV19MT0FERVI9eQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKICMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldApAQCAtMzY2LDEyICs0MjQsMTQgQEAKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKIENPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTEKIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRD15CiBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFk9eQogIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNDIxLDkgKzQ4MSw3IEBACiAjCiAjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1BIWVNNQVA9eQotQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4MAotQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAKLUNPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MQorIyBDT05GSUdfTVREX1BIWVNNQVBfQ09NUEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfSU5URUxfVlJfTk9SIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKQEAgLTQ0Nyw2ICs1MDUsMTEgQEAKICMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKIAogIworIyBMUEREUiBmbGFzaCBtZW1vcnkgZHJpdmVycworIworIyBDT05GSUdfTVREX0xQRERSIGlzIG5vdCBzZXQKKworIwogIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKICMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldApAQCAtNDYzLDE0ICs1MjYsMjkgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfTUdfRElTSyBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKICMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JQ1M5MzJTNDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAorIyBDT05GSUdfSVNMMjkwMDMgaXMgbm90IHNldAorIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKKworIworIyBFRVBST00gc3VwcG9ydAorIworIyBDT05GSUdfRUVQUk9NX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfQ0I3MTBfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDkyLDEwICs1NzAsNiBAQAogIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CiBDT05GSUdfQ0hSX0RFVl9TRz15CiAjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCi0jCiAjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldApAQCAtNTEyLDYgKzU4Niw4IEBACiAjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DWEdCM19JU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JOWDJfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldApAQCAtNTIwLDEzICs1OTYsMTggQEAKICMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FEVkFOU1lTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTVBUMlNBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldApAQCAtNTQzLDE1ICs2MjQsMTggQEAKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogQ09ORklHX01EPXkKIENPTkZJR19CTEtfREVWX01EPXkKK0NPTkZJR19NRF9BVVRPREVURUNUPXkKIENPTkZJR19NRF9MSU5FQVI9eQogQ09ORklHX01EX1JBSUQwPXkKIENPTkZJR19NRF9SQUlEMT15CiAjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAogQ09ORklHX01EX1JBSUQ0NTY9eQotIyBDT05GSUdfTURfUkFJRDVfUkVTSEFQRSBpcyBub3Qgc2V0CitDT05GSUdfTURfUkFJRDZfUFE9eQogIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9ETT15CkBAIC01NjgsMjcgKzY1MiwzNCBAQAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CiAjCisKKyMKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMk8gaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZFVEggaXMgbm90IHNldAotIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKICMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15Ci1DT05GSUdfRTEwMDBfTkFQST15Ci0jIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19FMTAwMEUgaXMgbm90IHNldAorIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQiBpcyBub3Qgc2V0CisjIENPTkZJR19JR0JWRiBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKQEAgLTU5NiwyMyArNjg3LDM0IEBACiAjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NOSUMgaXMgbm90IHNldAogIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pNRSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKICMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorQ09ORklHX0NIRUxTSU9fVDNfREVQRU5EUz15CiAjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOSUMgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYR0UgaXMgbm90IHNldAogIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAogIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19OSVUgaXMgbm90IHNldAorIyBDT05GSUdfTUxYNF9FTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NTFg0X0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfVEVIVVRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FMR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFMk5FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0CiAKICMKQEAgLTYyMCwxMyArNzIyLDE2IEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorCisjCisjIEVuYWJsZSBXaU1BWCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKKyMKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldApAQCAtNjcwLDEwICs3NzUsMTMgQEAKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19OT1pPTUkgaXMgbm90IHNldAogCiAjCiAjIFNlcmlhbCBkcml2ZXJzCkBAIC02OTIsMTEgKzgwMCwxMiBAQAogQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQogIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET01fVElNRVJJT01FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKQEAgLTcwNSw2NyArODE0LDk3IEBACiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15Ci0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIFBDIFNNQnVzIGhvc3QgY29udHJvbGxlciBkcml2ZXJzCisjCiAjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0NIIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX0lPUDNYWD15CiAjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCisjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0lPUDNYWD15CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3MgYWRhcHRlciBJMkMvRERDIGNoYW5uZWwgZHJpdmVycworIwogIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAogCiAjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk9NX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CiAKICMKLSMgU1BJIHN1cHBvcnQKKyMgTWVtb3J5IG1hcHBlZCBHUElPIGV4cGFuZGVyczoKICMKLSMgQ09ORklHX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBJMkMgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX01BWDczMlggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0E5NTNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENGODU3WCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19CVDhYWCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CkBAIC03NzMsMTMgKzkxMiwxNyBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDYyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JNUtfQU1CIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjc1Mzc1UyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0c3NjBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKQEAgLTc5NCwxNiArOTM3LDIzIEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xUQzQyMTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MVEM0MjQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05NTI0MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0hUMTUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVE1QNDAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CkBAIC04MTIsMjggKzk2MiwzOCBAQAogIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKICMKICMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCiAjCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKICMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfREFCPXkKKyMgQ09ORklHX01GRF9BU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfRUdQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2NTAxMCBpcyBub3Qgc2V0CisjIENPTkZJR19UV0w0MDMwX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM5M1hCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKQEAgLTg1NCwxNSArMTAxNCwxNiBAQAogIwogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotCi0jCi0jIFNvdW5kCi0jCiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15CiAjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKIENPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQpAQCAtODcwLDE0ICsxMDMxLDIxIEBACiAjIENPTkZJR19VU0IgaXMgbm90IHNldAogCiAjCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMgRW5hYmxlIEhvc3Qgb3IgR2FkZ2V0IHN1cHBvcnQgdG8gc2VlIEludmVudHJhIG9wdGlvbnMKICMKIAogIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQogIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgT1RHIGFuZCByZWxhdGVkIGluZnJhc3RydWN0dXJlCisjCisjIENPTkZJR19VV0IgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKQEAgLTg5Myw2ICsxMDYxLDEyIEBACiAjIERNQSBDbGllbnRzCiAjCiBDT05GSUdfTkVUX0RNQT15CisjIENPTkZJR19BU1lOQ19UWF9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfRE1BVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCkBAIC05MDEsMTAgKzEwNzUsMTEgQEAKICMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAogIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQogQ09ORklHX0ZTX01CQ0FDSEU9eQogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldApAQCAtOTEzLDE3ICsxMDg4LDIzIEBACiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKK0NPTkZJR19GU05PVElGWT15CitDT05GSUdfRE5PVElGWT15CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC05NDEsMTUgKzExMjIsMTMgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQogQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15CiAjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCitDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKQEAgLTk1OSwyOSArMTEzOCwzMSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfU1FVQVNIRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CiBDT05GSUdfTkZTRD15CiBDT05GSUdfTkZTRF9WMz15CiAjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0RfVENQIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz15CiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKQEAgLTEwMTMsOSArMTE5NCw2IEBACiAjIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX05MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTEwMjMsNiArMTIwMSw3IEBACiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogQ09ORklHX01BR0lDX1NZU1JRPXkKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKQEAgLTEwMzAsMTAgKzEyMDksMTcgQEAKIENPTkZJR19ERUJVR19LRVJORUw9eQogIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAogQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CisjIENPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDX1ZBTFVFPTAKIENPTkZJR19TQ0hFRF9ERUJVRz15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CkBAIC0xMDQ3LDE2ICsxMjMzLDQxIEBACiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX0ZPUkNFRF9JTkxJTklORyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1BPSVNPTklORyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CitDT05GSUdfRlRSQUNFPXkKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX0RFRkFVTFRfVFJBQ0VSUyBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CitDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CisjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FMTF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19VU0VSPXkKICMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKIApAQCAtMTA2NSwyNCArMTI3NiwxMTcgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CiBDT05GSUdfWE9SX0JMT0NLUz15CiBDT05GSUdfQVNZTkNfQ09SRT15CiBDT05GSUdfQVNZTkNfTUVNQ1BZPXkKIENPTkZJR19BU1lOQ19YT1I9eQotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWkxJQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQ1JZUFRPX0RFVl9ISUZOXzc5NVggaXMgbm90IHNldAorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0dFTkVSSUNfRklORF9MQVNUX0JJVD15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15Ci1DT05GSUdfUExJU1Q9eQorQ09ORklHX0RFQ09NUFJFU1NfR1pJUD15CitDT05GSUdfREVDT01QUkVTU19CWklQMj15CitDT05GSUdfREVDT01QUkVTU19MWk1BPXkKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX05MQVRUUj15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2xpdHRsZXRvbl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2xpdHRsZXRvbl9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYjQ5NjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9saXR0bGV0b25fZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNzgzICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC1yYzUKLSMgRnJpIERlYyAyMSAxMTowNjoxOSAyMDA3Ci0jCi1DT05GSUdfQVJNPXkKLUNPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15Ci1DT05GSUdfR0VORVJJQ19HUElPPXkKLUNPTkZJR19HRU5FUklDX1RJTUU9eQotQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQotQ09ORklHX01NVT15Ci0jIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQotQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15Ci1DT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKLUNPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLUNPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQotQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15Ci1DT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19BUkNIX01URF9YSVA9eQotQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCi1DT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0xPQ0tfS0VSTkVMPXkKLUNPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfU1lTVklQQ19TWVNDVEw9eQotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQotIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi1DT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQotQ09ORklHX1NZU0NUTD15Ci0jIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVUlEMTY9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19BTk9OX0lOT0RFUz15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX1NJR05BTEZEPXkKLUNPTkZJR19FVkVOVEZEPXkKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotQ09ORklHX1NMQUI9eQotIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKLUNPTkZJR19SVF9NVVRFWEVTPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tNT0QgaXMgbm90IHNldAotQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xTRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX0NGUT15Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgotCi0jCi0jIFN5c3RlbSBUeXBlCi0jCi0jIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1BYQT15Ci0jIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0KLSMKLSMgSW50ZWwgUFhBMnh4L1BYQTN4eCBJbXBsZW1lbnRhdGlvbnMKLSMKLQotIwotIyBTdXBwb3J0ZWQgUFhBM3h4IFByb2Nlc3NvciBWYXJpYW50cwotIwotQ09ORklHX0NQVV9QWEEzMDA9eQotQ09ORklHX0NQVV9QWEEzMTA9eQotIyBDT05GSUdfQ1BVX1BYQTMyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0xVQkJPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9MT0dJQ1BEX1BYQTI3MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX01BSU5TVE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1BYQV9JRFAgaXMgbm90IHNldAotIyBDT05GSUdfUFhBX1NIQVJQU0wgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9UUklaRVBTNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX0VNX1gyNzAgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9aWUxPTklURSBpcyBub3Qgc2V0Ci1DT05GSUdfTUFDSF9MSVRUTEVUT049eQotIyBDT05GSUdfTUFDSF9BUk1DT1JFIGlzIG5vdCBzZXQKLUNPTkZJR19QWEEzeHg9eQotQ09ORklHX1BYQV9TU1A9eQotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQKLSMKLQotIwotIyBQcm9jZXNzb3IgVHlwZQotIwotQ09ORklHX0NQVV8zMj15Ci1DT05GSUdfQ1BVX1hTQzM9eQotQ09ORklHX0NQVV8zMnY1PXkKLUNPTkZJR19DUFVfQUJSVF9FVjVUPXkKLUNPTkZJR19DUFVfQ0FDSEVfVklWVD15Ci1DT05GSUdfQ1BVX1RMQl9WNFdCST15Ci1DT05GSUdfQ1BVX0NQMTU9eQotQ09ORklHX0NQVV9DUDE1X01NVT15Ci1DT05GSUdfSU9fMzY9eQotCi0jCi0jIFByb2Nlc3NvciBGZWF0dXJlcwotIwotIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0Ci1DT05GSUdfSVdNTVhUPXkKLQotIwotIyBCdXMgc3VwcG9ydAotIwotIyBDT05GSUdfUENJX1NZU0NBTEwgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgRmVhdHVyZXMKLSMKLUNPTkZJR19USUNLX09ORVNIT1Q9eQotIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAotIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKLUNPTkZJR19QUkVFTVBUPXkKLUNPTkZJR19IWj0xMDAKLUNPTkZJR19BRUFCST15Ci1DT05GSUdfT0FCSV9DT01QQVQ9eQotIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKLUNPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2Ci0jIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQotQ09ORklHX0JPVU5DRT15Ci1DT05GSUdfVklSVF9UT19CVVM9eQotQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKLQotIwotIyBCb290IG9wdGlvbnMKLSMKLUNPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKLUNPTkZJR19aQk9PVF9ST01fQlNTPTB4MAotQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9uZnMgcm9vdGZzdHlwZT1uZnMgbmZzcm9vdD0xOTIuMTY4LjEuMTAwOi9uZnNyb290LyBpcD0xOTIuMTY4LjEuMTAxOjE5Mi4xNjguMS4xMDA6OjI1NS4yNTUuMjU1LjA6OmV0aDA6b24gY29uc29sZT10dHlTMiwzODQwMCBtZW09NjRNIgotIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCi0jCi0jIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCi0jCi0KLSMKLSMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCi0jCi1DT05GSUdfRlBFX05XRlBFPXkKLSMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCi0jCi1DT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci1DT05GSUdfU1VTUEVORF9VUF9QT1NTSUJMRT15Ci0KLSMKLSMgTmV0d29ya2luZwotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLSMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15Ci0jIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9ESUFHPXkKLUNPTkZJR19JTkVUX1RDUF9ESUFHPXkKLSMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19DVUJJQz15Ci1DT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCi0jIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIwotIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRktJTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCi0jIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAotQ09ORklHX0ZXX0xPQURFUj15Ci0jIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVEQgaXMgbm90IHNldAotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9eQotIyBDT05GSUdfQVg4ODc5NiBpcyBub3Qgc2V0Ci1DT05GSUdfU01DOTFYPXkKLSMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUM5MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKLSMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBJL08gcG9ydHMKLSMKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotQ09ORklHX1ZUPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9QWEE9eQotQ09ORklHX1NFUklBTF9QWEFfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLSMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0KLSMKLSMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCi0jCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKLSMgQ09ORklHX1NTQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EQUIgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKLUNPTkZJR19GQj15Ci0jIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKLUNPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQotQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQotIyBDT05GSUdfRkJfQ0ZCX1JFVl9QSVhFTFNfSU5fQllURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAotQ09ORklHX0ZCX0RFRkVSUkVEX0lPPXkKLSMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotCi0jCi0jIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCi0jCi0jIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfUFhBPXkKLSMgQ09ORklHX0ZCX1BYQV9QQVJBTUVURVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01CWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKLSMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkgaXMgbm90IHNldAotIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfRk9OVFM9eQotIyBDT05GSUdfRk9OVF84eDggaXMgbm90IHNldAotQ09ORklHX0ZPTlRfOHgxNj15Ci0jIENPTkZJR19GT05UXzZ4MTEgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF83eDE0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfUEVBUkxfOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfQUNPUk5fOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfTUlOSV80eDYgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF8xMHgxOCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HTz15Ci1DT05GSUdfTE9HT19MSU5VWF9NT05PPXkKLUNPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKLUNPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQotCi0jCi0jIFNvdW5kCi0jCi0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NTUMgaXMgbm90IHNldAotIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAotQ09ORklHX1JUQ19MSUI9eQotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLSMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfUE9TSVhfQUNMPXkKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX1NZU0NUTD15Ci1DT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci1DT05GSUdfTkZTX1YzX0FDTD15Ci1DT05GSUdfTkZTX1Y0PXkKLUNPTkZJR19ORlNfRElSRUNUSU89eQotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfTkZTX0FDTF9TVVBQT1JUPXkKLUNPTkZJR19ORlNfQ09NTU9OPXkKLUNPTkZJR19TVU5SUEM9eQotQ09ORklHX1NVTlJQQ19HU1M9eQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0Ci1DT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETE0gaXMgbm90IHNldAotIyBDT05GSUdfSU5TVFJVTUVOVEFUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotQ09ORklHX1BSSU5US19USU1FPXkKLUNPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKLUNPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15Ci1DT05GSUdfU0NIRURfREVCVUc9eQotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKLUNPTkZJR19ERUJVR19JTkZPPXkKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAotQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX0ZPUkNFRF9JTkxJTklORz15Ci0jIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19VU0VSPXkKLUNPTkZJR19ERUJVR19FUlJPUlM9eQotQ09ORklHX0RFQlVHX0xMPXkKLSMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPPXkKLUNPTkZJR19DUllQVE9fQUxHQVBJPXkKLUNPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj15Ci0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTUQ1PXkKLSMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0NCQz15Ci0jIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0RFUz15Ci0jIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fSFc9eQotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLUNPTkZJR19CSVRSRVZFUlNFPXkKLUNPTkZJR19DUkNfQ0NJVFQ9eQotIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKLUNPTkZJR19DUkMzMj15Ci0jIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0Ci1DT05GSUdfUExJU1Q9eQotQ09ORklHX0hBU19JT01FTT15Ci1DT05GSUdfSEFTX0lPUE9SVD15Ci1DT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL244eDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9uOHgwX2RlZmNvbmZpZwppbmRleCA4ZGE3NWRlLi4yNjRmNTJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL244eDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvbjh4MF9kZWZjb25maWcKQEAgLTMwNCw3ICszMDQsNyBAQAogQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MTBDMDgwMDAKIENPTkZJR19aQk9PVF9ST01fQlNTPTB4MTAyMDAwMDAKICMgQ09ORklHX1pCT09UX1JPTSBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORT0icm9vdD0xZjAzIHJvb3Rmc3R5cGU9amZmczIgY29uc29sZT10dHlTMCwxMTUyMDBuOCIKK0NPTkZJR19DTURMSU5FPSJyb290PTFmMDMgcm9vdGZzdHlwZT1qZmZzMiBjb25zb2xlPXR0eVMyLDExNTIwMG44IgogIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcDNfYmVhZ2xlX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcDNfYmVhZ2xlX2RlZmNvbmZpZwppbmRleCAzNTdkNDAyLi5iM2M4Y2NlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29tYXAzX2JlYWdsZV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwM19iZWFnbGVfZGVmY29uZmlnCkBAIC05NjksNyArOTY5LDYgQEAKICMKIENPTkZJR19VU0JfT1RHX1VUSUxTPXkKICMgQ09ORklHX1VTQl9HUElPX1ZCVVMgaXMgbm90IHNldAotIyBDT05GSUdfSVNQMTMwMV9PTUFQIGlzIG5vdCBzZXQKIENPTkZJR19UV0w0MDMwX1VTQj15CiAjIENPTkZJR19OT1BfVVNCX1hDRUlWIGlzIG5vdCBzZXQKIENPTkZJR19NTUM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9weGEzeHhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9weGEzeHhfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2I4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL3B4YTN4eF9kZWZjb25maWcKQEAgLTAsMCArMSwxMzMyIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEtcmMxCisjIE1vbiBKdWwgMTMgMjI6NDg6NDkgMjAwOQorIworQ09ORklHX0FSTT15CitDT05GSUdfSEFWRV9QV009eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKK0NPTkZJR19HRU5FUklDX0dQSU89eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0FSQ0hfTVREX1hJUD15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCisjIENPTkZJR19DTEFTU0lDX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE4CitDT05GSUdfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX05BTUVTUEFDRVM9eQorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0FJTz15CisKKyMKKyMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX0hBVkVfQ0xLPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0JMT0NLPXkKK0NPTkZJR19MQkRBRj15CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9HRU1JTkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NUTVAzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LSVJLV09PRCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xPS0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NVjc4WFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01NUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tTODY5NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05TOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1c5MFg5MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1BYQT15CisjIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0M2NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVTMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKworIworIyBJbnRlbCBQWEEyeHgvUFhBM3h4IEltcGxlbWVudGF0aW9ucworIworCisjCisjIFN1cHBvcnRlZCBQWEEzeHggUHJvY2Vzc29yIFZhcmlhbnRzCisjCitDT05GSUdfQ1BVX1BYQTMwMD15CitDT05GSUdfQ1BVX1BYQTMxMD15CitDT05GSUdfQ1BVX1BYQTMyMD15CitDT05GSUdfQ1BVX1BYQTkzMD15CitDT05GSUdfQ1BVX1BYQTkzNT15CisjIENPTkZJR19BUkNIX0dVTVNUSVggaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9JTlRFTE1PVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfU1RBUkdBVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTFVCQk9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xPR0lDUERfUFhBMjcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTUFJTlNUT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTVA5MDBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBX0lEUCBpcyBub3Qgc2V0CisjIENPTkZJR19QWEFfU0hBUlBTTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZJUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBX0VTRVJJRVMgaXMgbm90IHNldAorIyBDT05GSUdfVFJJWkVQU19QWEEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9INTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0VNX1gyNzAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9FWEVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NPTElCUkkgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9DT0xJQlJJMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ09MSUJSSTMyMCBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9aWUxPTklURT15CitDT05GSUdfTUFDSF9MSVRUTEVUT049eQorQ09ORklHX01BQ0hfVEFWT1JFVkI9eQorQ09ORklHX01BQ0hfU0FBUj15CisjIENPTkZJR19NQUNIX0FSTUNPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9DTV9YMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfSDQ3MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NQUdJQ0lBTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0hJTUFMQVlBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTUlPQTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1BDTTAyNyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9QQUxNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ1NCNzI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BYQV9FWlggaXMgbm90IHNldAorQ09ORklHX1BYQTN4eD15CitDT05GSUdfUFhBX1NTUD15CitDT05GSUdfUFhBX0hBVkVfQk9BUkRfSVJRUz15CitDT05GSUdfUExBVF9QWEE9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfWFNDMz15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQorQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKK0NPTkZJR19JT18zNj15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfT1VURVJfQ0FDSEU9eQorQ09ORklHX0NBQ0hFX1hTQzNMMj15CitDT05GSUdfSVdNTVhUPXkKK0NPTkZJR19DT01NT05fQ0xLREVWPXkKKworIworIyBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfUENJX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19WTVNQTElUXzNHPXkKKyMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAorIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0haPTEwMAorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19PQUJJX0NPTVBBVD15CisjIENPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfSEFWRV9NTE9DSz15CitDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKK0NPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKyMgQ09ORklHX1VBQ0NFU1NfV0lUSF9NRU1DUFkgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0icm9vdD0vZGV2L25mcyByb290ZnN0eXBlPW5mcyBuZnNyb290PTE5Mi4xNjguMS4xMDA6L25mc3Jvb3QvIGlwPTE5Mi4xNjguMS4xMDE6MTkyLjE2OC4xLjEwMDo6MjU1LjI1NS4yNTUuMDo6ZXRoMDpvbiBjb25zb2xlPXR0eVMwLDExNTIwMCBtZW09NjRNIGRlYnVnIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19EQ0IgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9DRkkgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9EQVRBRkxBU0ggaXMgbm90IHNldAorIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEU9eQorIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0gxOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0dQSU8gaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX0lEUz15CisjIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX1NIQVJQU0wgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX1BYQTN4eD15CitDT05GSUdfTVREX05BTkRfUFhBM3h4X0JVSUxUSU49eQorIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfTVREX09ORU5BTkQ9eQorQ09ORklHX01URF9PTkVOQU5EX1ZFUklGWV9XUklURT15CitDT05GSUdfTVREX09ORU5BTkRfR0VORVJJQz15CisjIENPTkZJR19NVERfT05FTkFORF9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkRfMlhfUFJPR1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORF9TSU0gaXMgbm90IHNldAorCisjCisjIExQRERSIGZsYXNoIG1lbW9yeSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfTFBERFIgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19NR19ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfQVg4ODc5NiBpcyBub3Qgc2V0CitDT05GSUdfU01DOTFYPXkKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CisjIENPTkZJR19FVEhPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RORVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorCisjCisjIEVuYWJsZSBXaU1BWCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MTTgzMjMgaXMgbm90IHNldAorQ09ORklHX0tFWUJPQVJEX1BYQTI3eD15CitDT05GSUdfS0VZQk9BUkRfUFhBOTMwX1JPVEFSWT15CitDT05GSUdfS0VZQk9BUkRfR1BJTz15CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CitDT05GSUdfTU9VU0VfUFMyX0FMUFM9eQorQ09ORklHX01PVVNFX1BTMl9MT0dJUFMyUFA9eQorQ09ORklHX01PVVNFX1BTMl9TWU5BUFRJQ1M9eQorQ09ORklHX01PVVNFX1BTMl9UUkFDS1BPSU5UPXkKKyMgQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QUzJfVE9VQ0hLSVQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfTU9VU0VfUFhBOTMwX1RSS0JBTEw9eQorIyBDT05GSUdfTU9VU0VfU1lOQVBUSUNTX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAorQ09ORklHX1RPVUNIU0NSRUVOX0RBOTAzND15CisjIENPTkZJR19UT1VDSFNDUkVFTl9FRVRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0ZVSklUU1UgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fR1VOWkUgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRUxPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1dBQ09NX1c4MDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX01UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9JTkVYSU8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTUs3MTIgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fUEVOTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hSSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RTQzIwMDcgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVzkwWDkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19TRVJJQUxfTUFYMzEwMCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX1BYQT15CitDT05GSUdfU0VSSUFMX1BYQV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKKyMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19IRUxQRVJfQVVUTyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19QWEE9eQorIyBDT05GSUdfSTJDX1BYQV9TTEFWRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfU1BJX1BYQTJYWD15CisKKyMKKyMgU1BJIFByb3RvY29sIE1hc3RlcnMKKyMKKyMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hcHBlZCBHUElPIGV4cGFuZGVyczoKKyMKKworIworIyBJMkMgR1BJTyBleHBhbmRlcnM6CisjCitDT05GSUdfR1BJT19NQVg3MzJYPXkKK0NPTkZJR19HUElPX1BDQTk1M1g9eQorQ09ORklHX0dQSU9fUENGODU3WD15CisKKyMKKyMgUENJIEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKK0NPTkZJR19HUElPX01BWDczMDE9eQorIyBDT05GSUdfR1BJT19NQ1AyM1MwOCBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CitDT05GSUdfUE9XRVJfU1VQUExZPXkKK0NPTkZJR19QT1dFUl9TVVBQTFlfREVCVUc9eQorQ09ORklHX1BEQV9QT1dFUj15CisjIENPTkZJR19CQVRURVJZX0RTMjc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CQVRURVJZX0JRMjd4MDAgaXMgbm90IHNldAorQ09ORklHX0JBVFRFUllfREE5MDMwPXkKKyMgQ09ORklHX0JBVFRFUllfTUFYMTcwNDAgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX0FTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzY1MDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXTDQwMzBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVDdMNjZYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2Mzg3WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM5M1hCIGlzIG5vdCBzZXQKK0NPTkZJR19QTUlDX0RBOTAzWD15CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19FWlhfUENBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CitDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CitDT05GSUdfRkJfUFhBPXkKKyMgQ09ORklHX0ZCX1BYQV9PVkVSTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BYQV9TTUFSVFBBTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BYQV9QQVJBTUVURVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01CWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9XMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01CODYyWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQlJPQURTSEVFVCBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPXkKKyMgQ09ORklHX0xDRF9MVFYzNTBRViBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfSUxJOTMyMCBpcyBub3Qgc2V0CitDT05GSUdfTENEX1RETzI0TT15CisjIENPTkZJR19MQ0RfVkdHMjQzMkE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CisjIENPTkZJR19CQUNLTElHSFRfR0VORVJJQyBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX1BXTT15CitDT05GSUdfQkFDS0xJR0hUX0RBOTAzWD15CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04gaXMgbm90IHNldAorQ09ORklHX0ZPTlRTPXkKKyMgQ09ORklHX0ZPTlRfOHg4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfOHgxNiBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF82eDExPXkKKyMgQ09ORklHX0ZPTlRfN3gxNCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX0FDT1JOXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX01JTklfNHg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfMTB4MTggaXMgbm90IHNldAorQ09ORklHX0xPR089eQorQ09ORklHX0xPR09fTElOVVhfTU9OTz15CitDT05GSUdfTE9HT19MSU5VWF9WR0ExNj15CitDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBDYXJkIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfQkxPQ0s9eQorQ09ORklHX01NQ19CTE9DS19CT1VOQ0U9eQorIyBDT05GSUdfU0RJT19VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19URVNUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX01NQ19QWEE9eQorIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9bQorCisjCisjIExFRCBkcml2ZXJzCisjCisjIENPTkZJR19MRURTX1BDQTk1MzIgaXMgbm90IHNldAorQ09ORklHX0xFRFNfR1BJTz1tCitDT05GSUdfTEVEU19HUElPX1BMQVRGT1JNPXkKKyMgQ09ORklHX0xFRFNfTFA1NTIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfUENBOTU1WCBpcyBub3Qgc2V0CitDT05GSUdfTEVEU19EQTkwM1g9bQorIyBDT05GSUdfTEVEU19EQUMxMjRTMDg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfUFdNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfQkQyODAyIGlzIG5vdCBzZXQKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKK0NPTkZJR19MRURTX1RSSUdHRVJTPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9bQorQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9bQorQ09ORklHX0xFRFNfVFJJR0dFUl9CQUNLTElHSFQ9bQorQ09ORklHX0xFRFNfVFJJR0dFUl9HUElPPW0KK0NPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTj1tCisKKyMKKyMgaXB0YWJsZXMgdHJpZ2dlciBpcyB1bmRlciBOZXRmaWx0ZXIgY29uZmlnIChMRUQgdGFyZ2V0KQorIworQ09ORklHX1JUQ19MSUI9eQorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CitDT05GSUdfUkVHVUxBVE9SPXkKK0NPTkZJR19SRUdVTEFUT1JfREVCVUc9eQorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSPXkKKyMgQ09ORklHX1JFR1VMQVRPUl9VU0VSU1BBQ0VfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX01BWDE1ODYgaXMgbm90IHNldAorQ09ORklHX1JFR1VMQVRPUl9EQTkwM1g9eQorIyBDT05GSUdfUkVHVUxBVE9SX0xQMzk3MSBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKK0NPTkZJR19GU05PVElGWT15CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKK0NPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWT15CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TPXkKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9MWk89eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKK0NPTkZJR19KRkZTMl9SVUJJTj15CisjIENPTkZJR19KRkZTMl9DTU9ERV9OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9DTU9ERV9QUklPUklUWT15CisjIENPTkZJR19KRkZTMl9DTU9ERV9TSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NNT0RFX0ZBVk9VUkxaTyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1FVQVNIRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WM19BQ0w9eQorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfVjRfMSBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQUNMX1NVUFBPUlQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfUFJJTlRLX1RJTUU9eQorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0RFQlVHX1NISVJRPXkKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUM9eQorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTEKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUNfVkFMVUU9MAorIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS01FTUxFQUsgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1BSRUVNUFQ9eQorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NQSU5MT0NLPXkKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVA9eQorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1BPSVNPTklORyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0FSTV9VTldJTkQ9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQorQ09ORklHX0NSWVBUT19BRUFEMj15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9eQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fSEFTSDI9eQorQ09ORklHX0NSWVBUT19STkcyPXkKK0NPTkZJR19DUllQVE9fUENPTVA9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUjI9eQorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fV09SS1FVRVVFPXkKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fQ0JDPXkKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19aTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTEFTVF9CSVQ9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorQ09ORklHX0xaT19DT01QUkVTUz15CitDT05GSUdfTFpPX0RFQ09NUFJFU1M9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CitDT05GSUdfTkxBVFRSPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvdTMwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3UzMDBfZGVmY29uZmlnCmluZGV4IDdkNjFhZTYuLjk1M2JhMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvdTMwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy91MzAwX2RlZmNvbmZpZwpAQCAtMSwxNCArMSwxNCBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxLXJjMwotIyBUaHUgSnVsIDE2IDIzOjM2OjEwIDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMi1yYzUKKyMgU2F0IE9jdCAxNyAyMzozMjoyNCAyMDA5CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CiBDT05GSUdfR0VORVJJQ19HUElPPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQotQ09ORklHX01NVT15CitDT05GSUdfSEFWRV9UQ009eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQpAQCAtNDQsMTEgKzQ0LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKQEAgLTgwLDE3ICs4MSwxNSBAQAogIyBDT05GSUdfQUlPIGlzIG5vdCBzZXQKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIwogIyBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1NMVUJfREVCVUc9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xVQj15CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfS1BST0JFUz15CkBAIC0xMzMsNiArMTMyLDcgQEAKICMKICMgU3lzdGVtIFR5cGUKICMKK0NPTkZJR19NTVU9eQogIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CkBAIC0xNDcsNiArMTQ3LDcgQEAKICMgQ09ORklHX0FSQ0hfU1RNUDNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OT01BRElLIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0CkBAIC0xNjksMTEgKzE3MCwxMyBAQAogIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUzNDNjRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1M1UEMxWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAogQ09ORklHX0FSQ0hfVTMwMD15CiAjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQkNNUklORyBpcyBub3Qgc2V0CiAKICMKICMgU1QtRXJpY3Nzb24gQUIgVTMwMC9VMzMwL1UzMzUvVTM2NSBQbGF0Zm9ybQpAQCAtMTk1LDYgKzE5OCw3IEBACiBDT05GSUdfTUFDSF9VMzAwX0RVQUxfUkFNPXkKIENPTkZJR19VMzAwX0RFQlVHPXkKICMgQ09ORklHX01BQ0hfVTMwMF9TRU1JX0lTX1NIQVJFRCBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9VMzAwX1NQSURVTU1ZPXkKIAogIwogIyBBbGwgdGhlIHNldHRpbmdzIGJlbG93IG11c3QgbWF0Y2ggdGhlIGJvb3Rsb2FkZXIncyBzZXR0aW5ncwpAQCAtMjA3LDcgKzIxMSw3IEBACiBDT05GSUdfQ1BVX0FSTTkyNlQ9eQogQ09ORklHX0NQVV8zMnY1PXkKIENPTkZJR19DUFVfQUJSVF9FVjVUSj15Ci1DT05GSUdfQ1BVX1BBQlJUX05PSUZBUj15CitDT05GSUdfQ1BVX1BBQlJUX0xFR0FDWT15CiBDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQogQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQogQ09ORklHX0NQVV9UTEJfVjRXQkk9eQpAQCAtMjIyLDYgKzIyNiw3IEBACiAjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOIGlzIG5vdCBzZXQKK0NPTkZJR19BUk1fTDFfQ0FDSEVfU0hJRlQ9NQogQ09ORklHX0FSTV9WSUM9eQogQ09ORklHX0FSTV9WSUNfTlI9MgogQ09ORklHX0NPTU1PTl9DTEtERVY9eQpAQCAtMjQ1LDYgKzI1MCw4IEBACiAjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAogQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CiBDT05GSUdfSFo9MTAwCiBDT05GSUdfQUVBQkk9eQpAQCAtMjY1LDYgKzI3Miw3IEBACiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiBDT05GSUdfQUxJR05NRU5UX1RSQVA9eQogIyBDT05GSUdfVUFDQ0VTU19XSVRIX01FTUNQWSBpcyBub3Qgc2V0CkBAIC0zMTMsNiArMzIxLDcgQEAKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NVU1BFTkQgaXMgbm90IHNldAogIyBDT05GSUdfQVBNX0VNVUxBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9SVU5USU1FIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogQ09ORklHX05FVD15CiAKQEAgLTM1MSw2ICszNjAsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTM5MSw2ICs0MDEsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CiBDT05GSUdfRldfTE9BREVSPXkKQEAgLTQwMiw5ICs0MTMsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKICMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldApAQCAtNDUzLDYgKzQ2NCw3IEBACiAjCiAjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NTVDI1TCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldApAQCAtNTIwLDYgKzUzMiw3IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAogCiAjCiAjIElucHV0IGRldmljZSBzdXBwb3J0CkBAIC01NDAsMTIgKzU1MywxNiBAQAogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKKyMgQ09ORklHX0tFWUJPQVJEX0FEUDU1ODggaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTUFUUklYIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xNODMyMyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKQEAgLTU5Nyw2ICs2MTQsNyBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKICMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC02MjksOSArNjQ3LDYgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CkBAIC02NTMsMTYgKzY2OCwyMSBAQAogIwogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiBDT05GSUdfUE9XRVJfU1VQUExZPXkKICMgQ09ORklHX1BPV0VSX1NVUFBMWV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19QREFfUE9XRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkFUVEVSWV9EUzI3NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkFUVEVSWV9EUzI3ODIgaXMgbm90IHNldAogIyBDT05GSUdfQkFUVEVSWV9CUTI3eDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBVFRFUllfTUFYMTcwNDAgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTY5MCwxMCArNzEwLDI0IEBACiAjIENPTkZJR19NRkRfVEM2Mzg3WEIgaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUMxMzc4MyBpcyBub3Qgc2V0CiBDT05GSUdfQUIzMTAwX0NPUkU9eQorQ09ORklHX0FCMzEwMF9PVFA9eQogIyBDT05GSUdfRVpYX1BDQVAgaXMgbm90IHNldAorQ09ORklHX1JFR1VMQVRPUj15CisjIENPTkZJR19SRUdVTEFUT1JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1VTRVJTUEFDRV9DT05TVU1FUiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfQlEyNDAyMiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfTUFYMTU4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfTFAzOTcxIGlzIG5vdCBzZXQKK0NPTkZJR19SRUdVTEFUT1JfQUIzMTAwPXkKKyMgQ09ORklHX1JFR1VMQVRPUl9UUFM2NTAyMyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfVFBTNjUwN1ggaXMgbm90IHNldAogIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKQEAgLTc5Miw5ICs4MjYsMTAgQEAKICMKIENPTkZJR19NTUNfQVJNTU1DST15CiAjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX0FUTUVMTUNJIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQ19TUEkgaXMgbm90IHNldAogIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiBDT05GSUdfTkVXX0xFRFM9eQogQ09ORklHX0xFRFNfQ0xBU1M9eQogCkBAIC04MjAsMTAgKzg1NSwxMCBAQAogIwogIyBpcHRhYmxlcyB0cmlnZ2VyIGlzIHVuZGVyIE5ldGZpbHRlciBjb25maWcgKExFRCB0YXJnZXQpCiAjCisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIENPTkZJR19SVENfTElCPXkKIENPTkZJR19SVENfQ0xBU1M9eQotQ09ORklHX1JUQ19IQ1RPU1lTPXkKLUNPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfSENUT1NZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAogCiAjCkBAIC04NjMsNiArODk4LDcgQEAKICMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGMjEyMyBpcyBub3Qgc2V0CiAKICMKICMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKQEAgLTg3OCwyNyArOTE0LDI1IEBACiAjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfRFJWX0FCMzEwMD15CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiAjIENPTkZJR19SVENfRFJWX1BMMDMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUEwwMzEgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfQ09IOTAxMzMxPXkKIENPTkZJR19ETUFERVZJQ0VTPXkKIAogIwogIyBETUEgRGV2aWNlcwogIwogIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0Ci1DT05GSUdfUkVHVUxBVE9SPXkKLSMgQ09ORklHX1JFR1VMQVRPUl9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1JfVklSVFVBTF9DT05TVU1FUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1JfVVNFUlNQQUNFX0NPTlNVTUVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUl9NQVgxNTg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUl9MUDM5NzEgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBUSSBWTFlOUQorIwogIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKQEAgLTkxMyw2ICs5NDcsNyBAQAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTk3NSw3ICsxMDEwLDYgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKIAogIwpAQCAtMTAzMyw2ICsxMDY3LDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTEwNjYsMTEgKzExMDEsMTMgQEAKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMTIxLDYgKzExNTgsNyBAQAogIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQUxMT0NBVE9SPXkKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy94Y2VwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MveGNlcF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiYjcyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MveGNlcF9kZWZjb25maWcKQEAgLTAsMCArMSwxMTI5IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEtcmM2CisjIFRodSBBdWcgMjAgMDk6MDI6MzcgMjAwOQorIworQ09ORklHX0FSTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9NVERfWElQPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIueGNlcC1pdGVjaCIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorCisjCisjIFJDVSBTdWJzeXN0ZW0KKyMKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTYKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19SRF9HWklQPXkKKyMgQ09ORklHX1JEX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEX0xaTUEgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19VSUQxNiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CisjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQUlPPXkKKworIworIyBQZXJmb3JtYW5jZSBDb3VudGVycworIworIyBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlMgaXMgbm90IHNldAorQ09ORklHX1NUUklQX0FTTV9TWU1TPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKK0NPTkZJR19TTE9CPXkKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfVFJBQ0VQT0lOVFM9eQorQ09ORklHX01BUktFUlM9eQorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorQ09ORklHX0tQUk9CRVM9eQorQ09ORklHX0tSRVRQUk9CRVM9eQorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19IQVZFX0NMSz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CisjIENPTkZJR19CTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0dFTUlOSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1RNUDNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVzkwWDkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUFhBPXkKKyMgQ09ORklHX0FSQ0hfTVNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzY0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9VMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorCisjCisjIEludGVsIFBYQTJ4eC9QWEEzeHggSW1wbGVtZW50YXRpb25zCisjCisjIENPTkZJR19BUkNIX0dVTVNUSVggaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9JTlRFTE1PVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfU1RBUkdBVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTFVCQk9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xPR0lDUERfUFhBMjcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTUFJTlNUT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTVA5MDBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBX0lEUCBpcyBub3Qgc2V0CisjIENPTkZJR19QWEFfU0hBUlBTTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZJUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBX0VTRVJJRVMgaXMgbm90IHNldAorIyBDT05GSUdfVFJJWkVQU19QWEEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9INTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0VNX1gyNzAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9FWEVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NPTElCUkkgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9DT0xJQlJJMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ09MSUJSSTMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1pZTE9OSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTElUVExFVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfVEFWT1JFVkIgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9TQUFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQVJNQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NNX1gzMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9INDcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX01BR0lDSUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfSElNQUxBWUEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NSU9BNzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfUENNMDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBX1BBTE0gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9DU0I3MjYgaXMgbm90IHNldAorIyBDT05GSUdfUFhBX0VaWCBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9YQ0VQPXkKK0NPTkZJR19QWEEyNXg9eQorQ09ORklHX1BYQV9TU1A9eQorQ09ORklHX1BMQVRfUFhBPXkKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1hTQ0FMRT15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQorQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19JV01NWFQ9eQorQ09ORklHX1hTQ0FMRV9QTVU9eQorQ09ORklHX0NPTU1PTl9DTEtERVY9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfVk1TUExJVF8zRz15CisjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19PQUJJX0NPTVBBVD15CisjIENPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfSEFWRV9NTE9DSz15CitDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKK0NPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKyMgQ09ORklHX1VBQ0NFU1NfV0lUSF9NRU1DUFkgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0icm9vdD1tdGQ0IHJvb3Rmc3R5cGU9amZmczIgcm8gY29uc29sZT10dHlTMCwxMTUyMDAiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKworIworIyBDUFUgUG93ZXIgTWFuYWdlbWVudAorIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQU9VVD15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD1tCitDT05GSUdfUEFDS0VUX01NQVA9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfS0VZPXkKKyMgQ09ORklHX05FVF9LRVlfTUlHUkFURSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9MUk89eQorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxNTQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RDQiBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9UQ1BQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFJPUF9NT05JVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQorQ09ORklHX01URF9QSFlTTUFQPXkKKyMgQ09ORklHX01URF9QSFlTTUFQX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BYQTJYWD15CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgTFBERFIgZmxhc2ggbWVtb3J5IGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9MUEREUiBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKK0NPTkZJR19TTUM5MVg9eQorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfRE5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRW5hYmxlIFdpTUFYIChOZXR3b3JraW5nIG9wdGlvbnMpIHRvIHNlZSB0aGUgV2lNQVggZHJpdmVycworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfUFhBPXkKK0NPTkZJR19TRVJJQUxfUFhBX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPW0KK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj1tCitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19QWEE9bQorIyBDT05GSUdfSTJDX1BYQV9TTEFWRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9SRVFVSVJFX0dQSU9MSUI9eQorQ09ORklHX0dQSU9MSUI9eQorIyBDT05GSUdfREVCVUdfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1NZU0ZTIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbWFwcGVkIEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIEkyQyBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDQTk1M1ggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0Y4NTdYIGlzIG5vdCBzZXQKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTj1tCisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfQURNMTAyMT1tCisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ2MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjc1Mzc1UyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0c3NjBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MVEM0MjE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTFRDNDI0NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTUyNDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKK0NPTkZJR19TRU5TT1JTX01BWDY2NTA9bQorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSFQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RNUDQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9BU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfRUdQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2NTAxMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVDdMNjZYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2Mzg3WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM5M1hCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9bQorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDg1ODEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDgwMjUgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0NNT1MgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NBMTEwMD1tCisjIENPTkZJR19SVENfRFJWX1BYQSBpcyBub3Qgc2V0CitDT05GSUdfRE1BREVWSUNFUz15CisKKyMKKyMgRE1BIERldmljZXMKKyMKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfRlNOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRllfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZPXkKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9bQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD1tCitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz1tCisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05MUz1tCitDT05GSUdfTkxTX0RFRkFVTFQ9InV0ZjgiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9bQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CisjIENPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDX1ZBTFVFPTAKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tQUk9CRVNfU0FOSVRZX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX1VOV0lORCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BTEdBUEk9bQorQ09ORklHX0NSWVBUT19BTEdBUEkyPW0KK0NPTkZJR19DUllQVE9fSEFTSD1tCitDT05GSUdfQ1JZUFRPX0hBU0gyPW0KKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKK0NPTkZJR19DUllQVE9fQ1JDMzJDPW0KKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19aTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTEFTVF9CSVQ9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKK0NPTkZJR19MSUJDUkMzMkM9bQorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19ERUNPTVBSRVNTX0daSVA9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CitDT05GSUdfTkxBVFRSPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvenlsb25pdGVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy96eWxvbml0ZV9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NDlkMDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy96eWxvbml0ZV9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIzCi0jIFR1ZSBPY3QgMjMgMTM6MzM6MjAgMjAwNwotIwotQ09ORklHX0FSTT15Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQotQ09ORklHX0dFTkVSSUNfR1BJTz15Ci1DT05GSUdfR0VORVJJQ19USU1FPXkKLUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKLUNPTkZJR19NTVU9eQotIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLUNPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQotQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15Ci1DT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15Ci1DT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKLUNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfQVJDSF9NVERfWElQPXkKLUNPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAotQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLUNPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfU1lTVklQQ19TWVNDVEw9eQotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTgKLSMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15Ci0jIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLUNPTkZJR19VSUQxNj15Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX0tBTExTWU1TPXkKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfQU5PTl9JTk9ERVM9eQotQ09ORklHX0VQT0xMPXkKLUNPTkZJR19TSUdOQUxGRD15Ci1DT05GSUdfRVZFTlRGRD15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19TTFVCX0RFQlVHPXkKLSMgQ09ORklHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX1NMVUI9eQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci1DT05GSUdfUlRfTVVURVhFUz15Ci0jIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX1NNQUxMPTAKLUNPTkZJR19NT0RVTEVTPXkKLSMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tNT0QgaXMgbm90IHNldAotQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xTRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX0NGUT15Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgotCi0jCi0jIFN5c3RlbSBUeXBlCi0jCi0jIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1BYQT15Ci0jIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0KLSMKLSMgSW50ZWwgUFhBMnh4L1BYQTN4eCBJbXBsZW1lbnRhdGlvbnMKLSMKLQotIwotIyBTdXBwb3J0ZWQgUFhBM3h4IFByb2Nlc3NvciBWYXJpYW50cwotIwotQ09ORklHX0NQVV9QWEEzMDA9eQotQ09ORklHX0NQVV9QWEEzMTA9eQotQ09ORklHX0NQVV9QWEEzMjA9eQotIyBDT05GSUdfQVJDSF9MVUJCT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfTE9HSUNQRF9QWEEyNzAgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9NQUlOU1RPTkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QWEFfSURQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BYQV9TSEFSUFNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfVFJJWkVQUzQgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9FTV9YMjcwIGlzIG5vdCBzZXQKLUNPTkZJR19NQUNIX1pZTE9OSVRFPXkKLSMgQ09ORklHX01BQ0hfQVJNQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfUFhBM3h4PXkKLQotIwotIyBCb290IG9wdGlvbnMKLSMKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50Ci0jCi0KLSMKLSMgUHJvY2Vzc29yIFR5cGUKLSMKLUNPTkZJR19DUFVfMzI9eQotQ09ORklHX0NQVV9YU0MzPXkKLUNPTkZJR19DUFVfMzJ2NT15Ci1DT05GSUdfQ1BVX0FCUlRfRVY1VD15Ci1DT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQotQ09ORklHX0NQVV9UTEJfVjRXQkk9eQotQ09ORklHX0NQVV9DUDE1PXkKLUNPTkZJR19DUFVfQ1AxNV9NTVU9eQotQ09ORklHX0lPXzM2PXkKLQotIwotIyBQcm9jZXNzb3IgRmVhdHVyZXMKLSMKLSMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUgaXMgbm90IHNldAotIyBDT05GSUdfT1VURVJfQ0FDSEUgaXMgbm90IHNldAotQ09ORklHX0lXTU1YVD15Ci0KLSMKLSMgQnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIEZlYXR1cmVzCi0jCi0jIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAotIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAotIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotQ09ORklHX0haPTEwMAotQ09ORklHX0FFQUJJPXkKLUNPTkZJR19PQUJJX0NPTVBBVD15Ci0jIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAotQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKLSMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci1DT05GSUdfRkxBVE1FTT15Ci1DT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKLSMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUFfRkxBRz0xCi1DT05GSUdfQk9VTkNFPXkKLUNPTkZJR19WSVJUX1RPX0JVUz15Ci1DT05GSUdfQUxJR05NRU5UX1RSQVA9eQotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfQ01ETElORT0icm9vdD0vZGV2L25mcyByb290ZnN0eXBlPW5mcyBuZnNyb290PTE5Mi4xNjguMS4xMDA6L25mcy9yb290ZnMvIGlwPTE5Mi4xNjguMS4xMDE6MTkyLjE2OC4xLjEwMDo6MjU1LjI1NS4yNTUuMDo6ZXRoMDpvbiBjb25zb2xlPXR0eVMwLDM4NDAwIG1lbT02NE0gZGVidWciCi0jIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLQotIwotIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KLSMKLQotIwotIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKLSMKLUNPTkZJR19GUEVfTldGUEU9eQotIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKLQotIwotIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKLSMKLUNPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKLQotIwotIyBOZXR3b3JraW5nCi0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLUNPTkZJR19JUF9QTlBfUkFSUD15Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9eQotQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKLSMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj15Ci0jIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX0FYODg3OTYgaXMgbm90IHNldAotQ09ORklHX1NNQzkxWD15Ci0jIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAotIyBDT05GSUdfU01DOTExWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCi0jIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLSMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfUFhBPXkKLUNPTkZJR19TRVJJQUxfUFhBX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci0jIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotCi0jCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCi0jIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0Ci1DT05GSUdfRkI9eQotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9EREMgaXMgbm90IHNldAotQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15Ci1DT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKLUNPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKLSMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9ERUZFUlJFRF9JTz15Ci0jIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKLQotIwotIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwotIwotIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAotQ09ORklHX0ZCX1BYQT15Ci0jIENPTkZJR19GQl9QWEFfUEFSQU1FVEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9NQlggaXMgbm90IHNldAotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWT15Ci0jIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19GT05UUz15Ci0jIENPTkZJR19GT05UXzh4OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UXzh4MTYgaXMgbm90IHNldAotQ09ORklHX0ZPTlRfNngxMT15Ci0jIENPTkZJR19GT05UXzd4MTQgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9QRUFSTF84eDggaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9BQ09STl84eDggaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9NSU5JXzR4NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX1NVTjh4MTYgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UXzEweDE4IGlzIG5vdCBzZXQKLUNPTkZJR19MT0dPPXkKLUNPTkZJR19MT0dPX0xJTlVYX01PTk89eQotQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQotQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0xJQj15Ci0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19GU19QT1NJWF9BQ0w9eQotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX1NZU0NUTD15Ci1DT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci1DT05GSUdfTkZTX1YzX0FDTD15Ci1DT05GSUdfTkZTX1Y0PXkKLUNPTkZJR19ORlNfRElSRUNUSU89eQotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfTkZTX0FDTF9TVVBQT1JUPXkKLUNPTkZJR19ORlNfQ09NTU9OPXkKLUNPTkZJR19TVU5SUEM9eQotQ09ORklHX1NVTlJQQ19HU1M9eQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0Ci1DT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETE0gaXMgbm90IHNldAotIyBDT05GSUdfSU5TVFJVTUVOVEFUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQotQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfVVNFUj15Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPPXkKLUNPTkZJR19DUllQVE9fQUxHQVBJPXkKLUNPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj15Ci0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTUQ1PXkKLSMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0NCQz15Ci0jIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0RFUz15Ci0jIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotQ09ORklHX0JJVFJFVkVSU0U9eQotIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAotQ09ORklHX1BMSVNUPXkKLUNPTkZJR19IQVNfSU9NRU09eQotQ09ORklHX0hBU19JT1BPUlQ9eQotQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA5ZWQyMzc3Li5kMGRhZWFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMTksMzEgKzE5LDIxIEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKy8qCisgKiBPbiBBUk0sIG9yZGluYXJ5IGFzc2lnbm1lbnQgKHN0ciBpbnN0cnVjdGlvbikgZG9lc24ndCBjbGVhciB0aGUgbG9jYWwKKyAqIHN0cmV4L2xkcmV4IG1vbml0b3Igb24gc29tZSBpbXBsZW1lbnRhdGlvbnMuIFRoZSByZWFzb24gd2UgY2FuIHVzZSBpdCBmb3IKKyAqIGF0b21pY19zZXQoKSBpcyB0aGUgY2xyZXggb3IgZHVtbXkgc3RyZXggZG9uZSBvbiBldmVyeSBleGNlcHRpb24gcmV0dXJuLgorICovCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCSgodiktPmNvdW50ZXIpCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCiAKICNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgogCiAvKgogICogQVJNdjYgVVAgYW5kIFNNUCBzYWZlIGF0b21pYyBvcHMuICBXZSB1c2UgbG9hZCBleGNsdXNpdmUgYW5kCiAgKiBzdG9yZSBleGNsdXNpdmUgdG8gZW5zdXJlIHRoYXQgdGhlc2UgYXJlIGF0b21pYy4gIFdlIG1heSBsb29wCi0gKiB0byBlbnN1cmUgdGhhdCB0aGUgdXBkYXRlIGhhcHBlbnMuICBXcml0aW5nIHRvICd2LT5jb3VudGVyJwotICogd2l0aG91dCB1c2luZyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgV0lMTCBicmVhayB0aGUgYXRvbWljCi0gKiBuYXR1cmUgb2YgdGhlc2Ugb3BzLgorICogdG8gZW5zdXJlIHRoYXQgdGhlIHVwZGF0ZSBoYXBwZW5zLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3NldChhdG9taWNfdCAqdiwgaW50IGkpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiQCBhdG9taWNfc2V0XG4iCi0iMToJbGRyZXgJJTAsIFslMV1cbiIKLSIJc3RyZXgJJTAsICUyLCBbJTFdXG4iCi0iCXRlcQklMCwgIzBcbiIKLSIJYm5lCTFiIgotCTogIj0mciIgKHRtcCkKLQk6ICJyIiAoJnYtPmNvdW50ZXIpLCAiciIgKGkpCi0JOiAiY2MiKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICp2KQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwpAQCAtMTYzLDggKzE1Myw2IEBACiAjZXJyb3IgU01QIG5vdCBzdXBwb3J0ZWQgb24gcHJlLUFSTXY2IENQVXMKICNlbmRpZgogCi0jZGVmaW5lIGF0b21pY19zZXQodixpKQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCi0KIHN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYml0b3BzLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCA2M2E0ODFmLi4zMzhmZjE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9iaXRvcHMuaApAQCAtODQsNyArODQsNyBAQAogCSpwID0gcmVzIHwgbWFzazsKIAlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JcmV0dXJuIHJlcyAmIG1hc2s7CisJcmV0dXJuIChyZXMgJiBtYXNrKSAhPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtMTAxLDcgKzEwMSw3IEBACiAJKnAgPSByZXMgJiB+bWFzazsKIAlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JcmV0dXJuIHJlcyAmIG1hc2s7CisJcmV0dXJuIChyZXMgJiBtYXNrKSAhPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtMTE4LDcgKzExOCw3IEBACiAJKnAgPSByZXMgXiBtYXNrOwogCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKLQlyZXR1cm4gcmVzICYgbWFzazsKKwlyZXR1cm4gKHJlcyAmIG1hc2spICE9IDA7CiB9CiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvbm9uLWF0b21pYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlLmgKaW5kZXggZmVhYTc1Zi4uNjZjMTYwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZS5oCkBAIC00LDcgKzQsNyBAQAogI2lmbmRlZiBfX0FTTUFSTV9DQUNIRV9ICiAjZGVmaW5lIF9fQVNNQVJNX0NBQ0hFX0gKIAotI2RlZmluZSBMMV9DQUNIRV9TSElGVAkJNQorI2RlZmluZSBMMV9DQUNIRV9TSElGVAkJQ09ORklHX0FSTV9MMV9DQUNIRV9TSElGVAogI2RlZmluZSBMMV9DQUNIRV9CWVRFUwkJKDEgPDwgTDFfQ0FDSEVfU0hJRlQpCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggMWE3MTFlYS4uM2QwY2RkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMzM0LDE0ICszMzQsMTQgQEAKICNpZm5kZWYgQ09ORklHX0NQVV9DQUNIRV9WSVBUCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JaWYgKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIG1tLT5jcHVfdm1fbWFzaykpCisJaWYgKGNwdW1hc2tfdGVzdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbV9jcHVtYXNrKG1tKSkpCiAJCV9fY3B1Y19mbHVzaF91c2VyX2FsbCgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlpZiAoY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgdm1hLT52bV9tbS0+Y3B1X3ZtX21hc2spKQorCWlmIChjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW1fY3B1bWFzayh2bWEtPnZtX21tKSkpCiAJCV9fY3B1Y19mbHVzaF91c2VyX3JhbmdlKHN0YXJ0ICYgUEFHRV9NQVNLLCBQQUdFX0FMSUdOKGVuZCksCiAJCQkJCXZtYS0+dm1fZmxhZ3MpOwogfQpAQCAtMzQ5LDcgKzM0OSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGZsdXNoX2NhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyLCB1bnNpZ25lZCBsb25nIHBmbikKIHsKLQlpZiAoY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgdm1hLT52bV9tbS0+Y3B1X3ZtX21hc2spKSB7CisJaWYgKGNwdW1hc2tfdGVzdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbV9jcHVtYXNrKHZtYS0+dm1fbW0pKSkgewogCQl1bnNpZ25lZCBsb25nIGFkZHIgPSB1c2VyX2FkZHIgJiBQQUdFX01BU0s7CiAJCV9fY3B1Y19mbHVzaF91c2VyX3JhbmdlKGFkZHIsIGFkZHIgKyBQQUdFX1NJWkUsIHZtYS0+dm1fZmxhZ3MpOwogCX0KQEAgLTM2MCw3ICszNjAsNyBAQAogCQkJIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHZvaWQgKmthZGRyLAogCQkJIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgd3JpdGUpCiB7Ci0JaWYgKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHZtYS0+dm1fbW0tPmNwdV92bV9tYXNrKSkgeworCWlmIChjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW1fY3B1bWFzayh2bWEtPnZtX21tKSkpIHsKIAkJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpa2FkZHI7CiAJCV9fY3B1Y19jb2hlcmVudF9rZXJuX3JhbmdlKGFkZHIsIGFkZHIgKyBsZW4pOwogCX0KQEAgLTQxNCw5ICs0MTQsMTQgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIF9fZmx1c2hfaWNhY2hlX2FsbCh2b2lkKQogeworI2lmZGVmIENPTkZJR19BUk1fRVJSQVRBXzQxMTkyMAorCWV4dGVybiB2b2lkIHY2X2ljYWNoZV9pbnZhbF9hbGwodm9pZCk7CisJdjZfaWNhY2hlX2ludmFsX2FsbCgpOworI2Vsc2UKIAlhc20oIm1jcglwMTUsIDAsICUwLCBjNywgYzUsIDAJQCBpbnZhbGlkYXRlIEktY2FjaGVcbiIKIAkgICAgOgogCSAgICA6ICJyIiAoMCkpOworI2VuZGlmCiB9CiAKICNkZWZpbmUgQVJDSF9IQVNfRkxVU0hfQU5PTl9QQUdFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHV0eXBlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKaW5kZXggYjNlNjU2Yy4uMjBhZTk2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NwdXR5cGUuaApAQCAtNjMsNiArNjMsMTEgQEAKIAlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9DQUNIRVRZUEUpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfdGNtc3RhdHVzKHZvaWQpCit7CisJcmV0dXJuIHJlYWRfY3B1aWQoQ1BVSURfVENNKTsKK30KKwogLyoKICAqIEludGVsJ3MgWFNjYWxlMyBjb3JlIHN1cHBvcnRzIHNvbWUgdjYgZmVhdHVyZXMgKHN1cGVyc2VjdGlvbnMsIEwyKQogICogYnV0IGFkdmVydGlzZXMgaXRzZWxmIGFzIHY1IGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHY2IElTQS4gIEZvcgpAQCAtNzMsNyArNzgsMTAgQEAKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBjcHVfaXNfeHNjMyh2b2lkKQogewotCWlmICgocmVhZF9jcHVpZF9pZCgpICYgMHhmZmZmZTAwMCkgPT0gMHg2OTA1NjAwMCkKKwl1bnNpZ25lZCBpbnQgaWQ7CisJaWQgPSByZWFkX2NwdWlkX2lkKCkgJiAweGZmZmZlMDAwOworCS8qIEl0IGNvdmVycyBib3RoIEludGVsIElEIGFuZCBNYXJ2ZWxsIElEICovCisJaWYgKChpZCA9PSAweDY5MDU2MDAwKSB8fCAoaWQgPT0gMHg1NjA1NjAwMCkpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IGMzYjkxMWUuLjZhYWMzZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC05OCw2ICs5OCw5IEBACiBleHRlcm4gaW50IGFybV9lbGZfcmVhZF9pbXBsaWVzX2V4ZWMoY29uc3Qgc3RydWN0IGVsZjMyX2hkciAqLCBpbnQpOwogI2RlZmluZSBlbGZfcmVhZF9pbXBsaWVzX2V4ZWMoZXgsc3RrKSBhcm1fZWxmX3JlYWRfaW1wbGllc19leGVjKCYoZXgpLCBzdGspCiAKK2ludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGVsZl9ncmVnc2V0X3QgKmVsZnJlZ3MpOworI2RlZmluZSBFTEZfQ09SRV9DT1BZX1RBU0tfUkVHUyBkdW1wX3Rhc2tfcmVncworCiAjZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCiAjZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCTQwOTYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ2x1ZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ2x1ZS5oCmluZGV4IGEwZTM5ZDUuLjIzNGEzZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dsdWUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9nbHVlLmgKQEAgLTEyMCwyNSArMTIwLDM5IEBACiAjZW5kaWYKIAogLyoKLSAqIFByZWZldGNoIGFib3J0IGhhbmRsZXIuICBJZiB0aGUgQ1BVIGhhcyBhbiBJRkFSIHVzZSB0aGF0LCBvdGhlcndpc2UKLSAqIHVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgYWJvcnRlZCBpbnN0cnVjdGlvbgorICoJUHJlZmV0Y2ggQWJvcnQgTW9kZWwKKyAqCT09PT09PT09PT09PT09PT0KKyAqCisgKglXZSBoYXZlIHRoZSBmb2xsb3dpbmcgdG8gY2hvb3NlIGZyb206CisgKgkgIGxlZ2FjeQktIG5vIElGU1IsIG5vIElGQVIKKyAqCSAgdjYJCS0gQVJNdjY6IElGU1IsIG5vIElGQVIKKyAqCSAgdjcJCS0gQVJNdjc6IElGU1IgYW5kIElGQVIKICAqLworCiAjdW5kZWYgQ1BVX1BBQk9SVF9IQU5ETEVSCiAjdW5kZWYgTVVMVElfUEFCT1JUCiAKLSNpZmRlZiBDT05GSUdfQ1BVX1BBQlJUX0lGQVIKKyNpZmRlZiBDT05GSUdfQ1BVX1BBQlJUX0xFR0FDWQogIyBpZmRlZiBDUFVfUEFCT1JUX0hBTkRMRVIKICMgIGRlZmluZSBNVUxUSV9QQUJPUlQgMQogIyBlbHNlCi0jICBkZWZpbmUgQ1BVX1BBQk9SVF9IQU5ETEVSKHJlZywgaW5zbikJbXJjIHAxNSwgMCwgcmVnLCBjcjYsIGNyMCwgMgorIyAgZGVmaW5lIENQVV9QQUJPUlRfSEFORExFUiBsZWdhY3lfcGFib3J0CiAjIGVuZGlmCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19DUFVfUEFCUlRfTk9JRkFSCisjaWZkZWYgQ09ORklHX0NQVV9QQUJSVF9WNgogIyBpZmRlZiBDUFVfUEFCT1JUX0hBTkRMRVIKICMgIGRlZmluZSBNVUxUSV9QQUJPUlQgMQogIyBlbHNlCi0jICBkZWZpbmUgQ1BVX1BBQk9SVF9IQU5ETEVSKHJlZywgaW5zbikJbW92IHJlZywgaW5zbgorIyAgZGVmaW5lIENQVV9QQUJPUlRfSEFORExFUiB2Nl9wYWJvcnQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NQVV9QQUJSVF9WNworIyBpZmRlZiBDUFVfUEFCT1JUX0hBTkRMRVIKKyMgIGRlZmluZSBNVUxUSV9QQUJPUlQgMQorIyBlbHNlCisjICBkZWZpbmUgQ1BVX1BBQk9SVF9IQU5ETEVSIHY3X3BhYm9ydAogIyBlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvcDN4eC1hZG1hLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb3AzeHgtYWRtYS5oCmluZGV4IDgzZTZiYTMuLjFhOGM3MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvcDN4eC1hZG1hLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaW9wM3h4LWFkbWEuaApAQCAtMTg3LDExICsxODcsNzQgQEAKIAl2b2lkICpwdHI7CiB9OwogCisvKiBObyBzdXBwb3J0IGZvciBwK3Egb3BlcmF0aW9ucyAqLworc3RhdGljIGlubGluZSBpbnQKK2lvcF9jaGFuX3BxX3Nsb3RfY291bnQoc2l6ZV90IGxlbiwgaW50IHNyY19jbnQsIGludCAqc2xvdHNfcGVyX29wKQoreworCUJVRygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lvcF9kZXNjX2luaXRfcHEoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgaW50IHNyY19jbnQsCisJCSAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpb3BfZGVzY19zZXRfcHFfYWRkcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLCBkbWFfYWRkcl90ICphZGRyKQoreworCUJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lvcF9kZXNjX3NldF9wcV9zcmNfYWRkcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLCBpbnQgc3JjX2lkeCwKKwkJCSBkbWFfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGNoYXIgY29lZikKK3sKKwlCVUcoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lvcF9jaGFuX3BxX3plcm9fc3VtX3Nsb3RfY291bnQoc2l6ZV90IGxlbiwgaW50IHNyY19jbnQsIGludCAqc2xvdHNfcGVyX29wKQoreworCUJVRygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lvcF9kZXNjX2luaXRfcHFfemVyb19zdW0oc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgaW50IHNyY19jbnQsCisJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW9wX2Rlc2Nfc2V0X3BxX3plcm9fc3VtX2J5dGVfY291bnQoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgdTMyIGxlbikKK3sKKwlCVUcoKTsKK30KKworI2RlZmluZSBpb3BfZGVzY19zZXRfcHFfemVyb19zdW1fc3JjX2FkZHIgaW9wX2Rlc2Nfc2V0X3BxX3NyY19hZGRyCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW9wX2Rlc2Nfc2V0X3BxX3plcm9fc3VtX2FkZHIoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgaW50IHBxX2lkeCwKKwkJCSAgICAgIGRtYV9hZGRyX3QgKnNyYykKK3sKKwlCVUcoKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgaW9wX2FkbWFfZ2V0X21heF94b3Iodm9pZCkKIHsKIAlyZXR1cm4gMzI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlvcF9hZG1hX2dldF9tYXhfcHEodm9pZCkKK3sKKwlCVUcoKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSB1MzIgaW9wX2NoYW5fZ2V0X2N1cnJlbnRfZGVzY3JpcHRvcihzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hhbikKIHsKIAlpbnQgaWQgPSBjaGFuLT5kZXZpY2UtPmlkOwpAQCAtMzMyLDYgKzM5NSwxMSBAQAogCXJldHVybiBzbG90X2NudDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaW9wX2Rlc2NfaXNfcHEoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYykKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSB1MzIgaW9wX2Rlc2NfZ2V0X2Rlc3RfYWRkcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLAogCQkJCQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hhbikKIHsKQEAgLTM0OSw2ICs0MTcsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorCitzdGF0aWMgaW5saW5lIHUzMiBpb3BfZGVzY19nZXRfcWRlc3RfYWRkcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLAorCQkJCQkgIHN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuKQoreworCUJVRygpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiBpb3BfZGVzY19nZXRfYnl0ZV9jb3VudChzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLAogCQkJCQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hhbikKIHsKQEAgLTc1NiwxMyArODMyLDE0IEBACiAJaHdfZGVzYy0+c3JjWzBdID0gdmFsOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpb3BfZGVzY19nZXRfemVyb19yZXN1bHQoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYykKK3N0YXRpYyBpbmxpbmUgZW51bSBzdW1fY2hlY2tfZmxhZ3MKK2lvcF9kZXNjX2dldF96ZXJvX3Jlc3VsdChzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjKQogewogCXN0cnVjdCBpb3AzeHhfZGVzY19hYXUgKmh3X2Rlc2MgPSBkZXNjLT5od19kZXNjOwogCXN0cnVjdCBpb3AzeHhfYWF1X2Rlc2NfY3RybCBkZXNjX2N0cmwgPSBod19kZXNjLT5kZXNjX2N0cmxfZmllbGQ7CiAKIAlpb3BfcGFyYW5vaWEoIShkZXNjX2N0cmwudHhfY29tcGxldGUgJiYgZGVzY19jdHJsLnplcm9fcmVzdWx0X2VuKSk7Ci0JcmV0dXJuIGRlc2NfY3RybC56ZXJvX3Jlc3VsdF9lcnI7CisJcmV0dXJuIGRlc2NfY3RybC56ZXJvX3Jlc3VsdF9lcnIgPDwgU1VNX0NIRUNLX1A7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpb3BfY2hhbl9hcHBlbmQoc3RydWN0IGlvcF9hZG1hX2NoYW4gKmNoYW4pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb3AzeHguaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvcDN4eC5oCmluZGV4IDRiOGU3ZjUuLjhkNjBhZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvcDN4eC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvcDN4eC5oCkBAIC0yMTUsNiArMjE1LDcgQEAKICAqIElPUDNYWCBJL08gYW5kIE1lbSBzcGFjZSByZWdpb25zIGZvciBQQ0kgYXV0b2NvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBJT1AzWFhfUENJX0xPV0VSX01FTV9QQQkweDgwMDAwMDAwCisjZGVmaW5lIElPUDNYWF9QQ0lfTUVNX1dJTkRPV19TSVpFCTB4MDgwMDAwMDAKIAogI2RlZmluZSBJT1AzWFhfUENJX0lPX1dJTkRPV19TSVpFCTB4MDAwMTAwMDAKICNkZWZpbmUgSU9QM1hYX1BDSV9MT1dFUl9JT19QQQkJMHg5MDAwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaW9wX2FkbWEuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvcF9hZG1hLmgKaW5kZXggMzg1YzZlOC4uNTliOGMzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaW9wX2FkbWEuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb3BfYWRtYS5oCkBAIC04Niw2ICs4Niw3IEBACiAgKiBAaWR4OiBwb29sIGluZGV4CiAgKiBAdW5tYXBfc3JjX2NudDogbnVtYmVyIG9mIHhvciBzb3VyY2VzCiAgKiBAdW5tYXBfbGVuOiB0cmFuc2FjdGlvbiBieXRlY291bnQKKyAqIEB0eF9saXN0OiBsaXN0IG9mIGRlc2NyaXB0b3JzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBvbmUgb3BlcmF0aW9uCiAgKiBAYXN5bmNfdHg6IHN1cHBvcnQgZm9yIHRoZSBhc3luY190eCBhcGkKICAqIEBncm91cF9saXN0OiBsaXN0IG9mIHNsb3RzIHRoYXQgbWFrZSB1cCBhIG11bHRpLWRlc2NyaXB0b3IgdHJhbnNhY3Rpb24KICAqCWZvciBleGFtcGxlIHRyYW5zZmVyIGxlbmd0aHMgbGFyZ2VyIHRoYW4gdGhlIHN1cHBvcnRlZCBodyBtYXgKQEAgLTEwMiwxMCArMTAzLDEyIEBACiAJdTE2IGlkeDsKIAl1MTYgdW5tYXBfc3JjX2NudDsKIAlzaXplX3QgdW5tYXBfbGVuOworCXN0cnVjdCBsaXN0X2hlYWQgdHhfbGlzdDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgYXN5bmNfdHg7CiAJdW5pb24gewogCQl1MzIgKnhvcl9jaGVja19yZXN1bHQ7CiAJCXUzMiAqY3JjMzJfcmVzdWx0OworCQl1MzIgKnBxX2NoZWNrX3Jlc3VsdDsKIAl9OwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggYmNkYjkyOS4uZGU2Y2VmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0xMDMsMTQgKzEwMywxNSBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIGNoZWNrIGZvciBwb3NzaWJsZSB0aHJlYWQgbWlncmF0aW9uICovCi0JaWYgKCFjcHVzX2VtcHR5KG5leHQtPmNwdV92bV9tYXNrKSAmJiAhY3B1X2lzc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spKQorCWlmICghY3B1bWFza19lbXB0eShtbV9jcHVtYXNrKG5leHQpKSAmJgorCSAgICAhY3B1bWFza190ZXN0X2NwdShjcHUsIG1tX2NwdW1hc2sobmV4dCkpKQogCQlfX2ZsdXNoX2ljYWNoZV9hbGwoKTsKICNlbmRpZgotCWlmICghY3B1X3Rlc3RfYW5kX3NldChjcHUsIG5leHQtPmNwdV92bV9tYXNrKSB8fCBwcmV2ICE9IG5leHQpIHsKKwlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfc2V0X2NwdShjcHUsIG1tX2NwdW1hc2sobmV4dCkpIHx8IHByZXYgIT0gbmV4dCkgewogCQljaGVja19jb250ZXh0KG5leHQpOwogCQljcHVfc3dpdGNoX21tKG5leHQtPnBnZCwgbmV4dCk7CiAJCWlmIChjYWNoZV9pc192aXZ0KCkpCi0JCQljcHVfY2xlYXIoY3B1LCBwcmV2LT5jcHVfdm1fbWFzayk7CisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG1tX2NwdW1hc2socHJldikpOwogCX0KICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCBhMDZlNzM1Li5lMGQ3NjNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXAuaApAQCAtOTMsNyArOTMsNiBAQAogCiBleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwotI2RlZmluZSBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzawogCiAvKgogICogc2hvdyBsb2NhbCBpbnRlcnJ1cHQgaW5mbwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc21wX3BsYXQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcF9wbGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzMDNlMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcF9wbGF0LmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIEFSTSBzcGVjaWZpYyBTTVAgaGVhZGVyLCB0aGlzIGNvbnRhaW5zIG91ciBpbXBsZW1lbnRhdGlvbgorICogZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0FTTUFSTV9TTVBfUExBVF9ICisjZGVmaW5lIF9fQVNNQVJNX1NNUF9QTEFUX0gKKworI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CisKKy8qIGFsbCBTTVAgY29uZmlndXJhdGlvbnMgaGF2ZSB0aGUgZXh0ZW5kZWQgQ1BVSUQgcmVnaXN0ZXJzICovCitzdGF0aWMgaW5saW5lIGludCB0bGJfb3BzX25lZWRfYnJvYWRjYXN0KHZvaWQpCit7CisJcmV0dXJuICgocmVhZF9jcHVpZF9leHQoQ1BVSURfRVhUX01NRlIzKSA+PiAxMikgJiAweGYpIDwgMjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS90Y20uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjllZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90Y20uaApAQCAtMCwwICsxLDMxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFNULUVyaWNzc29uIEFCCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqCisgKiBBdXRob3I6IFJpY2thcmQgQW5kZXJzc29uIDxyaWNrYXJkLmFuZGVyc3NvbkBzdGVyaWNzc29uLmNvbT4KKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KKyAqCisgKi8KKyNpZm5kZWYgX19BU01BUk1fVENNX0gKKyNkZWZpbmUgX19BU01BUk1fVENNX0gKKworI2lmbmRlZiBDT05GSUdfSEFWRV9UQ00KKyNlcnJvciAiWW91IHNob3VsZCBub3QgYmUgaW5jbHVkaW5nIHRjbS5oIHVubGVzcyB5b3UgaGF2ZSBhIFRDTSEiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKy8qIFRhZyB2YXJpYWJsZXMgd2l0aCB0aGlzICovCisjZGVmaW5lIF9fdGNtZGF0YSBfX3NlY3Rpb24oLnRjbS5kYXRhKQorLyogVGFnIGNvbnN0YW50cyB3aXRoIHRoaXMgKi8KKyNkZWZpbmUgX190Y21jb25zdCBfX3NlY3Rpb24oLnRjbS5yb2RhdGEpCisvKiBUYWcgZnVuY3Rpb25zIGluc2lkZSBUQ00gY2FsbGVkIGZyb20gb3V0c2lkZSBUQ00gd2l0aCB0aGlzICovCisjZGVmaW5lIF9fdGNtZnVuYyBfX2F0dHJpYnV0ZV9fKChsb25nX2NhbGwpKSBfX3NlY3Rpb24oLnRjbS50ZXh0KSBub2lubGluZQorLyogVGFnIGZ1bmN0aW9uIGluc2lkZSBUQ00gY2FsbGVkIGZyb20gaW5zaWRlIFRDTSAgd2l0aCB0aGlzICovCisjZGVmaW5lIF9fdGNtbG9jYWxmdW5jIF9fc2VjdGlvbigudGNtLnRleHQpCisKK3ZvaWQgKnRjbV9hbGxvYyhzaXplX3QgbGVuKTsKK3ZvaWQgdGNtX2ZyZWUodm9pZCAqYWRkciwgc2l6ZV90IGxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGxiZmx1c2guaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggYzk2NGYzZi4uYzJmMTYwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGxiZmx1c2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCkBAIC0zNTAsNyArMzUwLDcgQEAKIAlpZiAodGxiX2ZsYWcoVExCX1dCKSkKIAkJZHNiKCk7CiAKLQlpZiAoY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW0tPmNwdV92bV9tYXNrKSkgeworCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGdldF9jcHUoKSwgbW1fY3B1bWFzayhtbSkpKSB7CiAJCWlmICh0bGJfZmxhZyhUTEJfVjNfRlVMTCkpCiAJCQlhc20oIm1jciBwMTUsIDAsICUwLCBjNiwgYzAsIDAiIDogOiAiciIgKHplcm8pIDogImNjIik7CiAJCWlmICh0bGJfZmxhZyhUTEJfVjRfVV9GVUxMKSkKQEAgLTM2MCw2ICszNjAsNyBAQAogCQlpZiAodGxiX2ZsYWcoVExCX1Y0X0lfRlVMTCkpCiAJCQlhc20oIm1jciBwMTUsIDAsICUwLCBjOCwgYzUsIDAiIDogOiAiciIgKHplcm8pIDogImNjIik7CiAJfQorCXB1dF9jcHUoKTsKIAogCWlmICh0bGJfZmxhZyhUTEJfVjZfVV9BU0lEKSkKIAkJYXNtKCJtY3IgcDE1LCAwLCAlMCwgYzgsIGM3LCAyIiA6IDogInIiIChhc2lkKSA6ICJjYyIpOwpAQCAtMzg4LDcgKzM4OSw3IEBACiAJaWYgKHRsYl9mbGFnKFRMQl9XQikpCiAJCWRzYigpOwogCi0JaWYgKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHZtYS0+dm1fbW0tPmNwdV92bV9tYXNrKSkgeworCWlmIChjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW1fY3B1bWFzayh2bWEtPnZtX21tKSkpIHsKIAkJaWYgKHRsYl9mbGFnKFRMQl9WM19QQUdFKSkKIAkJCWFzbSgibWNyIHAxNSwgMCwgJTAsIGM2LCBjMCwgMCIgOiA6ICJyIiAodWFkZHIpIDogImNjIik7CiAJCWlmICh0bGJfZmxhZyhUTEJfVjRfVV9QQUdFKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3VuaWZpZWQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3VuaWZpZWQuaAppbmRleCAwNzNlODViLi5iYzYzMTE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS91bmlmaWVkLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdW5pZmllZC5oCkBAIC0zNSw3ICszNSw5IEBACiAKICNkZWZpbmUgQVJNKHguLi4pCiAjZGVmaW5lIFRIVU1CKHguLi4pCXgKKyNpZmRlZiBfX0FTU0VNQkxZX18KICNkZWZpbmUgVyhpbnN0cikJaW5zdHIudworI2VuZGlmCiAjZGVmaW5lIEJTWU0oc3ltKQlzeW0gKyAxCiAKICNlbHNlCS8qICFDT05GSUdfVEhVTUIyX0tFUk5FTCAqLwpAQCAtNDUsNyArNDcsOSBAQAogCiAjZGVmaW5lIEFSTSh4Li4uKQl4CiAjZGVmaW5lIFRIVU1CKHguLi4pCisjaWZkZWYgX19BU1NFTUJMWV9fCiAjZGVmaW5lIFcoaW5zdHIpCWluc3RyCisjZW5kaWYKICNkZWZpbmUgQlNZTShzeW0pCXN5bQogCiAjZW5kaWYJLyogQ09ORklHX1RIVU1CMl9LRVJORUwgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggODlmN2VhZC4uNzAyMDIxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTQ1Niw2ICs0NTYsNyBAQAogICogVW5pbXBsZW1lbnRlZCAob3IgYWx0ZXJuYXRpdmVseSBpbXBsZW1lbnRlZCkgc3lzY2FsbHMKICAqLwogI2RlZmluZSBfX0lHTk9SRV9mYWR2aXNlNjRfNjQJCTEKKyNkZWZpbmUgX19JR05PUkVfbWlncmF0ZV9wYWdlcwkJMQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX0FSTV9VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlIGIvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCmluZGV4IDMyMTNjOTMuLjc5MDg3ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKQEAgLTIsNyArMiw4IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgogIwogCi1BRkxBR1NfaGVhZC5vIDo9IC1EVEVYVF9PRkZTRVQ9JChURVhUX09GRlNFVCkKK0NQUEZMQUdTX3ZtbGludXgubGRzIDo9IC1EVEVYVF9PRkZTRVQ9JChURVhUX09GRlNFVCkKK0FGTEFHU19oZWFkLm8gICAgICAgIDo9IC1EVEVYVF9PRkZTRVQ9JChURVhUX09GRlNFVCkKIAogaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCiBDRkxBR1NfUkVNT1ZFX2Z0cmFjZS5vID0gLXBnCkBAIC0zNCw2ICszNSw3IEBACiBvYmotJChDT05GSUdfQVJNX1RIVU1CRUUpCSs9IHRodW1iZWUubwogb2JqLSQoQ09ORklHX0tHREIpCQkrPSBrZ2RiLm8KIG9iai0kKENPTkZJR19BUk1fVU5XSU5EKQkrPSB1bndpbmQubworb2JqLSQoQ09ORklHX0hBVkVfVENNKQkJKz0gdGNtLm8KIAogb2JqLSQoQ09ORklHX0NSVU5DSCkJCSs9IGNydW5jaC5vIGNydW5jaC1iaXRzLm8KIEFGTEFHU19jcnVuY2gtYml0cy5vCQk6PSAtV2EsLW1jcHU9ZXA5MzEyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwppbmRleCAzZDcyN2E4Li4wMDIyYjRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKQEAgLTI3Miw3ICsyNzIsMTUgQEAKIAlACiAJQCAgcjAgLSBpbnN0cnVjdGlvbgogCUAKKyNpZm5kZWYJQ09ORklHX1RIVU1CMl9LRVJORUwKIAlsZHIJcjAsIFtyMiwgIy00XQorI2Vsc2UKKwlsZHJoCXIwLCBbcjIsICMtMl0JCQlAIFRodW1iIGluc3RydWN0aW9uIGF0IExSIC0gMgorCWFuZAlyOSwgcjAsICMweGY4MDAKKwljbXAJcjksICMweGU4MDAJCQlAIDMyLWJpdCBpbnN0cnVjdGlvbiBpZiB4eCA+PSAwCisJbGRyaGhzCXI5LCBbcjJdCQkJQCBib3R0b20gMTYgYml0cworCW9ycmhzCXIwLCByOSwgcjAsIGxzbCAjMTYKKyNlbmRpZgogCWFkcglyOSwgQlNZTSgxZikKIAlibAljYWxsX2ZwZQogCkBAIC0zMDMsMjIgKzMxMSwxNiBAQAogCXRzdAlyMywgI1BTUl9JX0JJVAogCWJpY2VxCXI5LCByOSwgI1BTUl9JX0JJVAogCi0JQAotCUAgc2V0IGFyZ3MsIHRoZW4gY2FsbCBtYWluIGhhbmRsZXIKLQlACi0JQCAgcjAgLSBhZGRyZXNzIG9mIGZhdWx0aW5nIGluc3RydWN0aW9uCi0JQCAgcjEgLSBwb2ludGVyIHRvIHJlZ2lzdGVycyBvbiBzdGFjawotCUAKLSNpZmRlZiBNVUxUSV9QQUJPUlQKIAltb3YJcjAsIHIyCQkJQCBwYXNzIGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbi4KKyNpZmRlZiBNVUxUSV9QQUJPUlQKIAlsZHIJcjQsIC5MQ3Byb2NmbnMKIAltb3YJbHIsIHBjCiAJbGRyCXBjLCBbcjQsICNQUk9DRVNTT1JfUEFCVF9GVU5DXQogI2Vsc2UKLQlDUFVfUEFCT1JUX0hBTkRMRVIocjAsIHIyKQorCWJsCUNQVV9QQUJPUlRfSEFORExFUgogI2VuZGlmCiAJbXNyCWNwc3JfYywgcjkJCQlAIE1heWJlIGVuYWJsZSBpbnRlcnJ1cHRzCi0JbW92CXIxLCBzcAkJCQlAIHJlZ3MKKwltb3YJcjIsIHNwCQkJCUAgcmVncwogCWJsCWRvX1ByZWZldGNoQWJvcnQJCUAgY2FsbCBhYm9ydCBoYW5kbGVyCiAKIAlACkBAIC02MDYsMzMgKzYwOCwzMyBAQAogIFRIVU1CKAlhZGQJcGMsIHI4CQkJKQogCW5vcAogCi0JVyhtb3YpCXBjLCBscgkJCQlAIENQIzAKKwltb3Z3X3BjCWxyCQkJCUAgQ1AjMAogCVcoYikJZG9fZnBlCQkJCUAgQ1AjMSAoRlBFKQogCVcoYikJZG9fZnBlCQkJCUAgQ1AjMiAoRlBFKQotCVcobW92KQlwYywgbHIJCQkJQCBDUCMzCisJbW92d19wYwlscgkJCQlAIENQIzMKICNpZmRlZiBDT05GSUdfQ1JVTkNICiAJYgljcnVuY2hfdGFza19lbmFibGUJCUAgQ1AjNCAoTWF2ZXJpY2tDcnVuY2gpCiAJYgljcnVuY2hfdGFza19lbmFibGUJCUAgQ1AjNSAoTWF2ZXJpY2tDcnVuY2gpCiAJYgljcnVuY2hfdGFza19lbmFibGUJCUAgQ1AjNiAoTWF2ZXJpY2tDcnVuY2gpCiAjZWxzZQotCVcobW92KQlwYywgbHIJCQkJQCBDUCM0Ci0JVyhtb3YpCXBjLCBscgkJCQlAIENQIzUKLQlXKG1vdikJcGMsIGxyCQkJCUAgQ1AjNgorCW1vdndfcGMJbHIJCQkJQCBDUCM0CisJbW92d19wYwlscgkJCQlAIENQIzUKKwltb3Z3X3BjCWxyCQkJCUAgQ1AjNgogI2VuZGlmCi0JVyhtb3YpCXBjLCBscgkJCQlAIENQIzcKLQlXKG1vdikJcGMsIGxyCQkJCUAgQ1AjOAotCVcobW92KQlwYywgbHIJCQkJQCBDUCM5CisJbW92d19wYwlscgkJCQlAIENQIzcKKwltb3Z3X3BjCWxyCQkJCUAgQ1AjOAorCW1vdndfcGMJbHIJCQkJQCBDUCM5CiAjaWZkZWYgQ09ORklHX1ZGUAogCVcoYikJZG9fdmZwCQkJCUAgQ1AjMTAgKFZGUCkKIAlXKGIpCWRvX3ZmcAkJCQlAIENQIzExIChWRlApCiAjZWxzZQotCVcobW92KQlwYywgbHIJCQkJQCBDUCMxMCAoVkZQKQotCVcobW92KQlwYywgbHIJCQkJQCBDUCMxMSAoVkZQKQorCW1vdndfcGMJbHIJCQkJQCBDUCMxMCAoVkZQKQorCW1vdndfcGMJbHIJCQkJQCBDUCMxMSAoVkZQKQogI2VuZGlmCi0JVyhtb3YpCXBjLCBscgkJCQlAIENQIzEyCi0JVyhtb3YpCXBjLCBscgkJCQlAIENQIzEzCi0JVyhtb3YpCXBjLCBscgkJCQlAIENQIzE0IChEZWJ1ZykKLQlXKG1vdikJcGMsIGxyCQkJCUAgQ1AjMTUgKENvbnRyb2wpCisJbW92d19wYwlscgkJCQlAIENQIzEyCisJbW92d19wYwlscgkJCQlAIENQIzEzCisJbW92d19wYwlscgkJCQlAIENQIzE0IChEZWJ1ZykKKwltb3Z3X3BjCWxyCQkJCUAgQ1AjMTUgKENvbnRyb2wpCiAKICNpZmRlZiBDT05GSUdfTkVPTgogCS5hbGlnbgk2CkBAIC02NzgsNyArNjgwLDkgQEAKIAkud29yZAlub19mcAogCS5wcmV2aW91cwogCi1ub19mcDoJbW92CXBjLCBscgorRU5UUlkobm9fZnApCisJbW92CXBjLCBscgorRU5EUFJPQyhub19mcCkKIAogX191bmRfdXNyX3Vua25vd246CiAJZW5hYmxlX2lycQpAQCAtNjkxLDE2ICs2OTUsMTYgQEAKIF9fcGFidF91c3I6CiAJdXNyX2VudHJ5CiAKLSNpZmRlZiBNVUxUSV9QQUJPUlQKIAltb3YJcjAsIHIyCQkJQCBwYXNzIGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbi4KKyNpZmRlZiBNVUxUSV9QQUJPUlQKIAlsZHIJcjQsIC5MQ3Byb2NmbnMKIAltb3YJbHIsIHBjCiAJbGRyCXBjLCBbcjQsICNQUk9DRVNTT1JfUEFCVF9GVU5DXQogI2Vsc2UKLQlDUFVfUEFCT1JUX0hBTkRMRVIocjAsIHIyKQorCWJsCUNQVV9QQUJPUlRfSEFORExFUgogI2VuZGlmCiAJZW5hYmxlX2lycQkJCQlAIEVuYWJsZSBpbnRlcnJ1cHRzCi0JbW92CXIxLCBzcAkJCQlAIHJlZ3MKKwltb3YJcjIsIHNwCQkJCUAgcmVncwogCWJsCWRvX1ByZWZldGNoQWJvcnQJCUAgY2FsbCBhYm9ydCBoYW5kbGVyCiAgVU5XSU5EKC5mbmVuZAkJKQogCS8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtNzM0LDEzICs3MzgsNiBAQAogI2lmZGVmIENPTkZJR19NTVUKIAlsZHIJcjYsIFtyMiwgI1RJX0NQVV9ET01BSU5dCiAjZW5kaWYKLSNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgotI2lmZGVmIENPTkZJR19DUFVfMzJ2NksKLQljbHJleAotI2Vsc2UKLQlzdHJleAlyNSwgcjQsIFtpcF0JCQlAIENsZWFyIGV4Y2x1c2l2ZSBtb25pdG9yCi0jZW5kaWYKLSNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0hBU19UTFNfUkVHKQogCW1jcglwMTUsIDAsIHIzLCBjMTMsIGMwLCAzCQlAIHNldCBUTFMgcmVnaXN0ZXIKICNlbGlmICFkZWZpbmVkKENPTkZJR19UTFNfUkVHX0VNVUwpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggODA3Y2ZlYi4uZjBmZTk1YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJY21wIHIwLCByMgogCWJuZSBnbnVfdHJhY2UKIAlsZG1pYSBzcCEsIHtyMC1yMywgaXAsIGxyfQotCWJ4IGlwCisJbW92IHBjLCBpcAogCiBnbnVfdHJhY2U6CiAJbGRyIHIxLCBbc3AsICMyMF0JCQlAIGxyIG9mIGluc3RydW1lbnRlZCByb3V0aW5lCkBAIC0xMzUsNyArMTM1LDcgQEAKIAltb3YgbHIsIHBjCiAJbW92IHBjLCByMgogCWxkbWlhIHNwISwge3IwLXIzLCBpcCwgbHJ9Ci0JYnggaXAKKwltb3YgcGMsIGlwCiAKIEVOVFJZKG1jb3VudCkKIAlzdG1kYiBzcCEsIHtyMC1yMywgbHJ9CkBAIC00MjUsMTMgKzQyNSw2IEBACiAjZW5kaWYKIEVORFBST0Moc3lzX21tYXAyKQogCi1FTlRSWShwYWJvcnRfaWZhcikKLQkJbXJjCXAxNSwgMCwgcjAsIGNyNiwgY3IwLCAyCi1FTlRSWShwYWJvcnRfbm9pZmFyKQotCQltb3YJcGMsIGxyCi1FTkRQUk9DKHBhYm9ydF9pZmFyKQotRU5EUFJPQyhwYWJvcnRfbm9pZmFyKQotCiAjaWZkZWYgQ09ORklHX09BQklfQ09NUEFUCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktaGVhZGVyLlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktaGVhZGVyLlMKaW5kZXggYTRlYWY0Zi4uN2U5ZWQxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUwpAQCAtNzYsMTMgKzc2LDI3IEBACiAjaWZuZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCiAJLm1hY3JvCXN2Y19leGl0LCBycHNyCiAJbXNyCXNwc3JfY3hzZiwgXHJwc3IKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfMzJ2NkspCisJY2xyZXgJCQkJCUAgY2xlYXIgdGhlIGV4Y2x1c2l2ZSBtb25pdG9yCiAJbGRtaWEJc3AsIHtyMCAtIHBjfV4JCQlAIGxvYWQgcjAgLSBwYywgY3BzcgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0NQVV9WNikKKwlsZHIJcjAsIFtzcF0KKwlzdHJleAlyMSwgcjIsIFtzcF0JCQlAIGNsZWFyIHRoZSBleGNsdXNpdmUgbW9uaXRvcgorCWxkbWliCXNwLCB7cjEgLSBwY31eCQkJQCBsb2FkIHIxIC0gcGMsIGNwc3IKKyNlbHNlCisJbGRtaWEJc3AsIHtyMCAtIHBjfV4JCQlAIGxvYWQgcjAgLSBwYywgY3BzcgorI2VuZGlmCiAJLmVuZG0KIAogCS5tYWNybwlyZXN0b3JlX3VzZXJfcmVncywgZmFzdCA9IDAsIG9mZnNldCA9IDAKIAlsZHIJcjEsIFtzcCwgI1xvZmZzZXQgKyBTX1BTUl0JQCBnZXQgY2FsbGluZyBjcHNyCiAJbGRyCWxyLCBbc3AsICNcb2Zmc2V0ICsgU19QQ10hCUAgZ2V0IHBjCiAJbXNyCXNwc3JfY3hzZiwgcjEJCQlAIHNhdmUgaW4gc3Bzcl9zdmMKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfMzJ2NkspCisJY2xyZXgJCQkJCUAgY2xlYXIgdGhlIGV4Y2x1c2l2ZSBtb25pdG9yCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQ1BVX1Y2KQorCXN0cmV4CXIxLCByMiwgW3NwXQkJCUAgY2xlYXIgdGhlIGV4Y2x1c2l2ZSBtb25pdG9yCisjZW5kaWYKIAkuaWYJXGZhc3QKIAlsZG1kYglzcCwge3IxIC0gbHJ9XgkJCUAgZ2V0IGNhbGxpbmcgcjEgLSBscgogCS5lbHNlCkBAIC05Niw4ICsxMTAsMTYgQEAKIAltb3YJXHJkLCBzcCwgbHNyICMxMwogCW1vdglccmQsIFxyZCwgbHNsICMxMwogCS5lbmRtCisKKwlACisJQCAzMi1iaXQgd2lkZSAibW92IHBjLCByZWciCisJQAorCS5tYWNybwltb3Z3X3BjLCByZWcKKwltb3YJcGMsIFxyZWcKKwkuZW5kbQogI2Vsc2UJLyogQ09ORklHX1RIVU1CMl9LRVJORUwgKi8KIAkubWFjcm8Jc3ZjX2V4aXQsIHJwc3IKKwljbHJleAkJCQkJQCBjbGVhciB0aGUgZXhjbHVzaXZlIG1vbml0b3IKIAlsZHIJcjAsIFtzcCwgI1NfU1BdCQkJQCB0b3Agb2YgdGhlIHN0YWNrCiAJbGRyCXIxLCBbc3AsICNTX1BDXQkJCUAgcmV0dXJuIGFkZHJlc3MKIAl0c3QJcjAsICM0CQkJCUAgb3JpZyBzdGFjayA4LWJ5dGUgYWxpZ25lZD8KQEAgLTExMCw2ICsxMzIsNyBAQAogCS5lbmRtCiAKIAkubWFjcm8JcmVzdG9yZV91c2VyX3JlZ3MsIGZhc3QgPSAwLCBvZmZzZXQgPSAwCisJY2xyZXgJCQkJCUAgY2xlYXIgdGhlIGV4Y2x1c2l2ZSBtb25pdG9yCiAJbW92CXIyLCBzcAogCWxvYWRfdXNlcl9zcF9sciByMiwgcjMsIFxvZmZzZXQgKyBTX1NQCUAgY2FsbGluZyBzcCwgbHIKIAlsZHIJcjEsIFtzcCwgI1xvZmZzZXQgKyBTX1BTUl0JQCBnZXQgY2FsbGluZyBjcHNyCkBAIC0xMzAsNiArMTUzLDE0IEBACiAJbHNyCVxyZCwgXHJkLCAjMTMKIAltb3YJXHJkLCBccmQsIGxzbCAjMTMKIAkuZW5kbQorCisJQAorCUAgMzItYml0IHdpZGUgIm1vdiBwYywgcmVnIgorCUAKKwkubWFjcm8JbW92d19wYywgcmVnCisJbW92CXBjLCBccmVnCisJbm9wCisJLmVuZG0KICNlbmRpZgkvKiAhQ09ORklHX1RIVU1CMl9LRVJORUwgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLWNvbW1vbi5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQtY29tbW9uLlMKaW5kZXggOTNhZDU3Ni4uODg1YTcyMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2hlYWQtY29tbW9uLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQtY29tbW9uLlMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2RlZmluZSBBVEFHX0NPUkUgMHg1NDQxMDAwMQogI2RlZmluZSBBVEFHX0NPUkVfU0laRSAoKDIqNCArIDMqNCkgPj4gMikKKyNkZWZpbmUgQVRBR19DT1JFX1NJWkVfRU1QVFkgKCgyKjQpID4+IDIpCiAKIAkuYWxpZ24JMgogCS50eXBlCV9fc3dpdGNoX2RhdGEsICVvYmplY3QKQEAgLTI1MSw3ICsyNTIsOCBAQAogCWJuZQkxZgogCiAJbGRyCXI1LCBbcjIsICMwXQkJCUAgaXMgZmlyc3QgdGFnIEFUQUdfQ09SRT8KLQlzdWJzCXI1LCByNSwgI0FUQUdfQ09SRV9TSVpFCisJY21wCXI1LCAjQVRBR19DT1JFX1NJWkUKKwljbXBuZQlyNSwgI0FUQUdfQ09SRV9TSVpFX0VNUFRZCiAJYm5lCTFmCiAJbGRyCXI1LCBbcjIsICM0XQogCWxkcglyNiwgPUFUQUdfQ09SRQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9hcm0va2VybmVsL2luaXRfdGFzay5jCmluZGV4IDNmNDcwODYuLmU3Y2JiNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL2FybS9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTI0LDkgKzI0LDggQEAKICAqCiAgKiBUaGUgdGhpbmdzIHdlIGRvIGZvciBwZXJmb3JtYW5jZS4uCiAgKi8KLXVuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbgotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KLQkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KKwl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwogCiAvKgogICogSW5pdGlhbCB0YXNrIHN0cnVjdHVyZS4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGY2OTJlZmQuLjYwYzYyYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtODMsMTAgKzg0LDI0IEBACiAJZmx1c2hfaW5zbnMocC0+YWRkciwgMSk7CiB9CiAKKy8qCisgKiBUaGUgYWN0dWFsIGRpc2FybWluZyBpcyBkb25lIGhlcmUgb24gZWFjaCBDUFUgYW5kIHN5bmNocm9uaXplZCB1c2luZworICogc3RvcF9tYWNoaW5lLiBUaGlzIHN5bmNocm9uaXphdGlvbiBpcyBuZWNlc3Nhcnkgb24gU01QIHRvIGF2b2lkIHJlbW92aW5nCisgKiBhIHByb2JlIGJldHdlZW4gdGhlIG1vbWVudCB0aGUgJ1VuZGVmaW5lZCBJbnN0cnVjdGlvbicgZXhjZXB0aW9uIGlzIHJhaXNlZAorICogYW5kIHRoZSBtb21lbnQgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIHJlYWRzIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiBmcm9tCisgKiBtZW1vcnkuCisgKi8KK2ludCBfX2twcm9iZXMgX19hcmNoX2Rpc2FybV9rcHJvYmUodm9pZCAqcCkKK3sKKwlzdHJ1Y3Qga3Byb2JlICprcCA9IHA7CisJKmtwLT5hZGRyID0ga3AtPm9wY29kZTsKKwlmbHVzaF9pbnNucyhrcC0+YWRkciwgMSk7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCSpwLT5hZGRyID0gcC0+b3Bjb2RlOwotCWZsdXNoX2luc25zKHAtPmFkZHIsIDEpOworCXN0b3BfbWFjaGluZShfX2FyY2hfZGlzYXJtX2twcm9iZSwgcCwgJmNwdV9vbmxpbmVfbWFwKTsKIH0KIAogdm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwppbmRleCA3OTBmYmVlLi4wZDk2ZDAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMyOCw2ICszMjgsMTUgQEAKIH0KIAogLyoKKyAqIEZpbGwgaW4gdGhlIHRhc2sncyBlbGZyZWdzIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuCisgKi8KK2ludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGVsZl9ncmVnc2V0X3QgKmVsZnJlZ3MpCit7CisJZWxmX2NvcmVfY29weV9yZWdzKGVsZnJlZ3MsIHRhc2tfcHRfcmVncyh0KSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCiAgKiBmaWxsIGluIHRoZSBmcGUgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uLgogICovCiBpbnQgZHVtcF9mcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlcl9mcCAqZnApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IGQ0ZDRmNzcuLmM2YzU3YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC00NSw2ICs0NSw3IEBACiAKICNpbmNsdWRlICJjb21wYXQuaCIKICNpbmNsdWRlICJhdGFncy5oIgorI2luY2x1ZGUgInRjbS5oIgogCiAjaWZuZGVmIE1FTV9TSVpFCiAjZGVmaW5lIE1FTV9TSVpFCSgxNioxMDI0KjEwMjQpCkBAIC03NDksNiArNzUwLDcgQEAKICNlbmRpZgogCiAJY3B1X2luaXQoKTsKKwl0Y21faW5pdCgpOwogCiAJLyoKIAkgKiBTZXQgdXAgdmFyaW91cyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgcG9pbnRlcnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYwppbmRleCAxNDIzYTM0Li4yYTU3M2Q0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBsaW51eC9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgUnVzc2VsbCBLaW5nCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDkgUnVzc2VsbCBLaW5nCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0yOSw2ICsyOSw3IEBACiAgKi8KICNkZWZpbmUgU1dJX1NZU19TSUdSRVRVUk4JKDB4ZWYwMDAwMDB8KF9fTlJfc2lncmV0dXJuKXwoX19OUl9PQUJJX1NZU0NBTExfQkFTRSkpCiAjZGVmaW5lIFNXSV9TWVNfUlRfU0lHUkVUVVJOCSgweGVmMDAwMDAwfChfX05SX3J0X3NpZ3JldHVybil8KF9fTlJfT0FCSV9TWVNDQUxMX0JBU0UpKQorI2RlZmluZSBTV0lfU1lTX1JFU1RBUlQJCSgweGVmMDAwMDAwfF9fTlJfcmVzdGFydF9zeXNjYWxsfF9fTlJfT0FCSV9TWVNDQUxMX0JBU0UpCiAKIC8qCiAgKiBXaXRoIEVBQkksIHRoZSBzeXNjYWxsIG51bWJlciBoYXMgdG8gYmUgbG9hZGVkIGludG8gcjcuCkBAIC00OSw2ICs1MCwxOCBAQAogfTsKIAogLyoKKyAqIEVpdGhlciB3ZSBzdXBwb3J0IE9BQkkgb25seSwgb3Igd2UgaGF2ZSBFQUJJIHdpdGggdGhlIE9BQkkKKyAqIGNvbXBhdCBsYXllciBlbmFibGVkLiAgSW4gdGhlIGxhdGVyIGNhc2Ugd2UgZG9uJ3Qga25vdyBpZgorICogdXNlciBzcGFjZSBpcyBFQUJJIG9yIG5vdCwgYW5kIGlmIG5vdCB3ZSBtdXN0IG5vdCBjbG9iYmVyIHI3LgorICogQWx3YXlzIHVzaW5nIHRoZSBPQUJJIHN5c2NhbGwgc29sdmVzIHRoYXQgaXNzdWUgYW5kIHdvcmtzIGZvcgorICogYWxsIHRob3NlIGNhc2VzLgorICovCitjb25zdCB1bnNpZ25lZCBsb25nIHN5c2NhbGxfcmVzdGFydF9jb2RlWzJdID0geworCVNXSV9TWVNfUkVTVEFSVCwJLyogc3dpCV9fTlJfcmVzdGFydF9zeXNjYWxsICovCisJMHhlNDlkZjAwNCwJCS8qIGxkcglwYywgW3NwXSwgIzQgKi8KK307CisKKy8qCiAgKiBhdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgogICovCiBhc21saW5rYWdlIGludCBzeXNfc2lnc3VzcGVuZChpbnQgcmVzdGFydCwgdW5zaWduZWQgbG9uZyBvbGRtYXNrLCBvbGRfc2lnc2V0X3QgbWFzaykKQEAgLTY0NSwzMiArNjU4LDEyIEBACiAJCQkJcmVncy0+QVJNX3BjIC09IDQ7CiAjZWxzZQogCQkJCXUzMiBfX3VzZXIgKnVzcDsKLQkJCQl1MzIgc3dpdmFsID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CiAKLQkJCQlyZWdzLT5BUk1fc3AgLT0gMTI7CisJCQkJcmVncy0+QVJNX3NwIC09IDQ7CiAJCQkJdXNwID0gKHUzMiBfX3VzZXIgKilyZWdzLT5BUk1fc3A7CiAKLQkJCQkvKgotCQkJCSAqIEVpdGhlciB3ZSBzdXBwb3J0cyBPQUJJIG9ubHksIG9yIHdlIGhhdmUKLQkJCQkgKiBFQUJJIHdpdGggdGhlIE9BQkkgY29tcGF0IGxheWVyIGVuYWJsZWQuCi0JCQkJICogSW4gdGhlIGxhdGVyIGNhc2Ugd2UgZG9uJ3Qga25vdyBpZiB1c2VyCi0JCQkJICogc3BhY2UgaXMgRUFCSSBvciBub3QsIGFuZCBpZiBub3Qgd2UgbXVzdAotCQkJCSAqIG5vdCBjbG9iYmVyIHI3LiAgQWx3YXlzIHVzaW5nIHRoZSBPQUJJCi0JCQkJICogc3lzY2FsbCBzb2x2ZXMgdGhhdCBpc3N1ZSBhbmQgd29ya3MgZm9yCi0JCQkJICogYWxsIHRob3NlIGNhc2VzLgotCQkJCSAqLwotCQkJCXN3aXZhbCA9IHN3aXZhbCAtIF9fTlJfU1lTQ0FMTF9CQVNFICsgX19OUl9PQUJJX1NZU0NBTExfQkFTRTsKLQotCQkJCXB1dF91c2VyKHJlZ3MtPkFSTV9wYywgJnVzcFswXSk7Ci0JCQkJLyogc3dpIF9fTlJfcmVzdGFydF9zeXNjYWxsICovCi0JCQkJcHV0X3VzZXIoMHhlZjAwMDAwMCB8IHN3aXZhbCwgJnVzcFsxXSk7Ci0JCQkJLyogbGRyCXBjLCBbc3BdLCAjMTIgKi8KLQkJCQlwdXRfdXNlcigweGU0OWRmMDBjLCAmdXNwWzJdKTsKLQotCQkJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl1c3AsCi0JCQkJCQkgICAodW5zaWduZWQgbG9uZykodXNwICsgMykpOwotCi0JCQkJcmVncy0+QVJNX3BjID0gcmVncy0+QVJNX3NwICsgNDsKKwkJCQlwdXRfdXNlcihyZWdzLT5BUk1fcGMsIHVzcCk7CisJCQkJcmVncy0+QVJNX3BjID0gS0VSTl9SRVNUQVJUX0NPREU7CiAjZW5kaWYKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5oIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5oCmluZGV4IDI3YmVlY2UuLjZmY2ZlODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuaAorKysgYi9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmgKQEAgLTEsMTIgKzEsMTQgQEAKIC8qCiAgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5oCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNSBSdXNzZWxsIEtpbmcuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDkgUnVzc2VsbCBLaW5nLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNkZWZpbmUgS0VSTl9TSUdSRVRVUk5fQ09ERQkoQ09ORklHX1ZFQ1RPUlNfQkFTRSArIDB4MDAwMDA1MDApCisjZGVmaW5lIEtFUk5fUkVTVEFSVF9DT0RFCShLRVJOX1NJR1JFVFVSTl9DT0RFICsgc2l6ZW9mKHNpZ3JldHVybl9jb2RlcykpCiAKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIHNpZ3JldHVybl9jb2Rlc1s3XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIHN5c2NhbGxfcmVzdGFydF9jb2RlWzJdOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IGRlODg1ZmQuLjU3MTYyYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2xvY2FsdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vc21wX3BsYXQuaD4KIAogLyoKICAqIGFzIGZyb20gMi41LCBrZXJuZWxzIG5vIGxvbmdlciBoYXZlIGFuIGluaXRfdGFza3Mgc3RydWN0dXJlCkBAIC0xNTMsNyArMTU0LDcgQEAKIC8qCiAgKiBfX2NwdV9kaXNhYmxlIHJ1bnMgb24gdGhlIHByb2Nlc3NvciB0byBiZSBzaHV0ZG93bi4KICAqLwotaW50IF9fY3B1ZXhpdCBfX2NwdV9kaXNhYmxlKHZvaWQpCitpbnQgX19jcHVfZGlzYWJsZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwpAQCAtMTg5LDcgKzE5MCw3IEBACiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlmb3JfZWFjaF9wcm9jZXNzKHApIHsKIAkJaWYgKHAtPm1tKQotCQkJY3B1X2NsZWFyKGNwdSwgcC0+bW0tPmNwdV92bV9tYXNrKTsKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbW1fY3B1bWFzayhwLT5tbSkpOwogCX0KIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAKQEAgLTIwMCw3ICsyMDEsNyBAQAogICogY2FsbGVkIG9uIHRoZSB0aHJlYWQgd2hpY2ggaXMgYXNraW5nIGZvciBhIENQVSB0byBiZSBzaHV0ZG93biAtCiAgKiB3YWl0cyB1bnRpbCBzaHV0ZG93biBoYXMgY29tcGxldGVkLCBvciBpdCBpcyB0aW1lZCBvdXQuCiAgKi8KLXZvaWQgX19jcHVleGl0IF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQordm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpZiAoIXBsYXRmb3JtX2NwdV9raWxsKGNwdSkpCiAJCXByaW50aygiQ1BVJXU6IHVuYWJsZSB0byBraWxsXG4iLCBjcHUpOwpAQCAtMjE0LDcgKzIxNSw3IEBACiAgKiBvZiB0aGUgb3RoZXIgaG90cGx1Zy1jcHUgY2FwYWJsZSBjb3Jlcywgc28gcHJlc3VtYWJseSBjb21pbmcKICAqIG91dCBvZiBpZGxlIGZpeGVzIHRoaXMuCiAgKi8KLXZvaWQgX19jcHVleGl0IGNwdV9kaWUodm9pZCkKK3ZvaWQgX19yZWYgY3B1X2RpZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKQEAgLTI1Nyw3ICsyNTgsNyBAQAogCWF0b21pY19pbmMoJm1tLT5tbV91c2Vycyk7CiAJYXRvbWljX2luYygmbW0tPm1tX2NvdW50KTsKIAljdXJyZW50LT5hY3RpdmVfbW0gPSBtbTsKLQljcHVfc2V0KGNwdSwgbW0tPmNwdV92bV9tYXNrKTsKKwljcHVtYXNrX3NldF9jcHUoY3B1LCBtbV9jcHVtYXNrKG1tKSk7CiAJY3B1X3N3aXRjaF9tbShtbS0+cGdkLCBtbSk7CiAJZW50ZXJfbGF6eV90bGIobW0sIGN1cnJlbnQpOwogCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKQEAgLTU4NiwxMiArNTg3LDYgQEAKIAl1bnNpZ25lZCBsb25nIHRhX2VuZDsKIH07CiAKLS8qIGFsbCBTTVAgY29uZmlndXJhdGlvbnMgaGF2ZSB0aGUgZXh0ZW5kZWQgQ1BVSUQgcmVnaXN0ZXJzICovCi1zdGF0aWMgaW5saW5lIGludCB0bGJfb3BzX25lZWRfYnJvYWRjYXN0KHZvaWQpCi17Ci0JcmV0dXJuICgocmVhZF9jcHVpZF9leHQoQ1BVSURfRVhUX01NRlIzKSA+PiAxMikgJiAweGYpIDwgMjsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGlwaV9mbHVzaF90bGJfYWxsKHZvaWQgKmlnbm9yZWQpCiB7CiAJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwpAQCAtNjQzLDcgKzYzOCw3IEBACiB2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlpZiAodGxiX29wc19uZWVkX2Jyb2FkY2FzdCgpKQotCQlvbl9lYWNoX2NwdV9tYXNrKGlwaV9mbHVzaF90bGJfbW0sIG1tLCAxLCAmbW0tPmNwdV92bV9tYXNrKTsKKwkJb25fZWFjaF9jcHVfbWFzayhpcGlfZmx1c2hfdGxiX21tLCBtbSwgMSwgbW1fY3B1bWFzayhtbSkpOwogCWVsc2UKIAkJbG9jYWxfZmx1c2hfdGxiX21tKG1tKTsKIH0KQEAgLTY1NCw3ICs2NDksNyBAQAogCQlzdHJ1Y3QgdGxiX2FyZ3MgdGE7CiAJCXRhLnRhX3ZtYSA9IHZtYTsKIAkJdGEudGFfc3RhcnQgPSB1YWRkcjsKLQkJb25fZWFjaF9jcHVfbWFzayhpcGlfZmx1c2hfdGxiX3BhZ2UsICZ0YSwgMSwgJnZtYS0+dm1fbW0tPmNwdV92bV9tYXNrKTsKKwkJb25fZWFjaF9jcHVfbWFzayhpcGlfZmx1c2hfdGxiX3BhZ2UsICZ0YSwgMSwgbW1fY3B1bWFzayh2bWEtPnZtX21tKSk7CiAJfSBlbHNlCiAJCWxvY2FsX2ZsdXNoX3RsYl9wYWdlKHZtYSwgdWFkZHIpOwogfQpAQCAtNjc3LDcgKzY3Miw3IEBACiAJCXRhLnRhX3ZtYSA9IHZtYTsKIAkJdGEudGFfc3RhcnQgPSBzdGFydDsKIAkJdGEudGFfZW5kID0gZW5kOwotCQlvbl9lYWNoX2NwdV9tYXNrKGlwaV9mbHVzaF90bGJfcmFuZ2UsICZ0YSwgMSwgJnZtYS0+dm1fbW0tPmNwdV92bV9tYXNrKTsKKwkJb25fZWFjaF9jcHVfbWFzayhpcGlfZmx1c2hfdGxiX3JhbmdlLCAmdGEsIDEsIG1tX2NwdW1hc2sodm1hLT52bV9tbSkpOwogCX0gZWxzZQogCQlsb2NhbF9mbHVzaF90bGJfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCmluZGV4IGQ4Yzg4YzYuLmE3M2EzNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwpAQCAtMTY2LDEwICsxNjYsMTIgQEAKIAljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2xrKTsKIH0KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyoKICAqIHRha2UgYSBsb2NhbCB0aW1lciBkb3duCiAgKi8KLXZvaWQgX19jcHVleGl0IHR3ZF90aW1lcl9zdG9wKHZvaWQpCit2b2lkIHR3ZF90aW1lcl9zdG9wKHZvaWQpCiB7CiAJX19yYXdfd3JpdGVsKDAsIHR3ZF9iYXNlICsgVFdEX1RJTUVSX0NPTlRST0wpOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jIGIvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYwppbmRleCBiM2VjNjQxLi43OGVjYWFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RjbS5jIGIvYXJjaC9hcm0va2VybmVsL3RjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDMwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvdGNtLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBTVC1Fcmljc3NvbiBBQgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKiBUQ00gbWVtb3J5IGhhbmRsaW5nIGZvciBBUk0gc3lzdGVtcworICoKKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KKyAqIEF1dGhvcjogUmlja2FyZCBBbmRlcnNzb24gPHJpY2thcmQuYW5kZXJzc29uQHN0ZXJpY3Nzb24uY29tPgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIG1lbWNweSAqLworI2luY2x1ZGUgPGFzbS9wYWdlLmg+IC8qIFBBR0VfU0hJRlQgKi8KKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvbWVtb3J5Lmg+CisjaW5jbHVkZSAidGNtLmgiCisKKy8qIFNjcmVhbSBhbmQgd2FybiBhYm91dCBtaXN1c2UgKi8KKyNpZiAhZGVmaW5lZChJVENNX09GRlNFVCkgfHwgIWRlZmluZWQoSVRDTV9FTkQpIHx8IFwKKyAgICAhZGVmaW5lZChEVENNX09GRlNFVCkgfHwgIWRlZmluZWQoRFRDTV9FTkQpCisjZXJyb3IgIlRDTSBzdXBwb3J0IHNlbGVjdGVkIGJ1dCBvZmZzZXRzIG5vdCBkZWZpbmVkISIKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGdlbl9wb29sICp0Y21fcG9vbDsKKworLyogVENNIHNlY3Rpb24gZGVmaW5pdGlvbnMgZnJvbSB0aGUgbGlua2VyICovCitleHRlcm4gY2hhciBfX2l0Y21fc3RhcnQsIF9fc2l0Y21fdGV4dCwgX19laXRjbV90ZXh0OworZXh0ZXJuIGNoYXIgX19kdGNtX3N0YXJ0LCBfX3NkdGNtX2RhdGEsIF9fZWR0Y21fZGF0YTsKKworLyoKKyAqIFRDTSBtZW1vcnkgcmVzb3VyY2VzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZHRjbV9yZXMgPSB7CisJLm5hbWUgPSAiRFRDTSBSQU0iLAorCS5zdGFydCA9IERUQ01fT0ZGU0VULAorCS5lbmQgPSBEVENNX0VORCwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpdGNtX3JlcyA9IHsKKwkubmFtZSA9ICJJVENNIFJBTSIsCisJLnN0YXJ0ID0gSVRDTV9PRkZTRVQsCisJLmVuZCA9IElUQ01fRU5ELAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGR0Y21faW9tYXBbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSBEVENNX09GRlNFVCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKERUQ01fT0ZGU0VUKSwKKwkJLmxlbmd0aAkJPSAoRFRDTV9FTkQgLSBEVENNX09GRlNFVCArIDEpLAorCQkudHlwZQkJPSBNVF9VTkNBQ0hFRAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaXRjbV9pb21hcFtdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbAk9IElUQ01fT0ZGU0VULAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oSVRDTV9PRkZTRVQpLAorCQkubGVuZ3RoCQk9IChJVENNX0VORCAtIElUQ01fT0ZGU0VUICsgMSksCisJCS50eXBlCQk9IE1UX1VOQ0FDSEVECisJfQorfTsKKworLyoKKyAqIEFsbG9jYXRlIGEgY2h1bmsgb2YgVENNIG1lbW9yeQorICovCit2b2lkICp0Y21fYWxsb2Moc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIHZhZGRyOworCisJaWYgKCF0Y21fcG9vbCkKKwkJcmV0dXJuIE5VTEw7CisKKwl2YWRkciA9IGdlbl9wb29sX2FsbG9jKHRjbV9wb29sLCBsZW4pOworCWlmICghdmFkZHIpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICh2b2lkICopIHZhZGRyOworfQorRVhQT1JUX1NZTUJPTCh0Y21fYWxsb2MpOworCisvKgorICogRnJlZSBhIGNodW5rIG9mIFRDTSBtZW1vcnkKKyAqLwordm9pZCB0Y21fZnJlZSh2b2lkICphZGRyLCBzaXplX3QgbGVuKQoreworCWdlbl9wb29sX2ZyZWUodGNtX3Bvb2wsICh1bnNpZ25lZCBsb25nKSBhZGRyLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTCh0Y21fZnJlZSk7CisKKworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3RjbV9iYW5rKHU4IHR5cGUsIHUzMiBvZmZzZXQsIHUzMiBleHBlY3RlZF9zaXplKQoreworCWNvbnN0IGludCB0Y21fc2l6ZXNbMTZdID0geyAwLCAtMSwgLTEsIDQsIDgsIDE2LCAzMiwgNjQsIDEyOCwKKwkJCQkgICAgMjU2LCA1MTIsIDEwMjQsIC0xLCAtMSwgLTEsIC0xIH07CisJdTMyIHRjbV9yZWdpb247CisJaW50IHRjbV9zaXplOworCisJLyogUmVhZCB0aGUgc3BlY2lhbCBUQ00gcmVnaW9uIHJlZ2lzdGVyIGM5LCAwICovCisJaWYgKCF0eXBlKQorCQlhc20oIm1yYwlwMTUsIDAsICUwLCBjOSwgYzEsIDAiCisJCSAgICA6ICI9ciIgKHRjbV9yZWdpb24pKTsKKwllbHNlCisJCWFzbSgibXJjCXAxNSwgMCwgJTAsIGM5LCBjMSwgMSIKKwkJICAgIDogIj1yIiAodGNtX3JlZ2lvbikpOworCisJdGNtX3NpemUgPSB0Y21fc2l6ZXNbKHRjbV9yZWdpb24gPj4gMikgJiAweDBmXTsKKwlpZiAodGNtX3NpemUgPCAwKSB7CisJCXByX2VycigiQ1BVOiAlc1RDTSBvZiB1bmtub3duIHNpemUhXG4iLAorCQkJdHlwZSA/ICJJIiA6ICJEIik7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygiQ1BVOiBmb3VuZCAlc1RDTSAlZGsgQCAlMDh4LCAlc2VuYWJsZWRcbiIsCisJCQl0eXBlID8gIkkiIDogIkQiLAorCQkJdGNtX3NpemUsCisJCQkodGNtX3JlZ2lvbiAmIDB4ZmZmZmYwMDBVKSwKKwkJCSh0Y21fcmVnaW9uICYgMSkgPyAiIiA6ICJub3QgIik7CisJfQorCisJaWYgKHRjbV9zaXplICE9IGV4cGVjdGVkX3NpemUpIHsKKwkJcHJfY3JpdCgiQ1BVOiAlc1RDTSB3YXMgZGV0ZWN0ZWQgJWRrIGJ1dCBleHBlY3RlZCAlZGshXG4iLAorCQkgICAgICAgdHlwZSA/ICJJIiA6ICJEIiwKKwkJICAgICAgIHRjbV9zaXplLAorCQkgICAgICAgZXhwZWN0ZWRfc2l6ZSk7CisJCS8qIEFkanVzdCB0byB0aGUgZXhwZWN0ZWQgc2l6ZT8gd2hhdCBjYW4gd2UgZG8uLi4gKi8KKwl9CisKKwkvKiBGb3JjZSBtb3ZlIHRoZSBUQ00gYmFuayB0byB3aGVyZSB3ZSB3YW50IGl0LCBlbmFibGUgKi8KKwl0Y21fcmVnaW9uID0gb2Zmc2V0IHwgKHRjbV9yZWdpb24gJiAweDAwMDAwZmZlVSkgfCAxOworCisJaWYgKCF0eXBlKQorCQlhc20oIm1jcglwMTUsIDAsICUwLCBjOSwgYzEsIDAiCisJCSAgICA6IC8qIE5vIG91dHB1dCBvcGVyYW5kcyAqLworCQkgICAgOiAiciIgKHRjbV9yZWdpb24pKTsKKwllbHNlCisJCWFzbSgibWNyCXAxNSwgMCwgJTAsIGM5LCBjMSwgMSIKKwkJICAgIDogLyogTm8gb3V0cHV0IG9wZXJhbmRzICovCisJCSAgICA6ICJyIiAodGNtX3JlZ2lvbikpOworCisJcHJfZGVidWcoIkNQVTogbW92ZWQgJXNUQ00gJWRrIHRvICUwOHgsIGVuYWJsZWRcbiIsCisJCSB0eXBlID8gIkkiIDogIkQiLAorCQkgdGNtX3NpemUsCisJCSAodGNtX3JlZ2lvbiAmIDB4ZmZmZmYwMDBVKSk7Cit9CisKKy8qCisgKiBUaGlzIGluaXRpYWxpemVzIHRoZSBUQ00gbWVtb3J5CisgKi8KK3ZvaWQgX19pbml0IHRjbV9pbml0KHZvaWQpCit7CisJdTMyIHRjbV9zdGF0dXMgPSByZWFkX2NwdWlkX3RjbXN0YXR1cygpOworCWNoYXIgKnN0YXJ0OworCWNoYXIgKmVuZDsKKwljaGFyICpyYW07CisKKwkvKiBTZXR1cCBEVENNIGlmIHByZXNlbnQgKi8KKwlpZiAodGNtX3N0YXR1cyAmICgxIDw8IDE2KSkgeworCQlzZXR1cF90Y21fYmFuaygwLCBEVENNX09GRlNFVCwKKwkJCSAgICAgICAoRFRDTV9FTkQgLSBEVENNX09GRlNFVCArIDEpID4+IDEwKTsKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZkdGNtX3Jlcyk7CisJCWlvdGFibGVfaW5pdChkdGNtX2lvbWFwLCAxKTsKKwkJLyogQ29weSBkYXRhIGZyb20gUkFNIHRvIERUQ00gKi8KKwkJc3RhcnQgPSAmX19zZHRjbV9kYXRhOworCQllbmQgICA9ICZfX2VkdGNtX2RhdGE7CisJCXJhbSAgID0gJl9fZHRjbV9zdGFydDsKKwkJbWVtY3B5KHN0YXJ0LCByYW0sIChlbmQtc3RhcnQpKTsKKwkJcHJfZGVidWcoIkNQVSBEVENNOiBjb3BpZWQgZGF0YSBmcm9tICVwIC0gJXBcbiIsIHN0YXJ0LCBlbmQpOworCX0KKworCS8qIFNldHVwIElUQ00gaWYgcHJlc2VudCAqLworCWlmICh0Y21fc3RhdHVzICYgMSkgeworCQlzZXR1cF90Y21fYmFuaygxLCBJVENNX09GRlNFVCwKKwkJCSAgICAgICAoSVRDTV9FTkQgLSBJVENNX09GRlNFVCArIDEpID4+IDEwKTsKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZpdGNtX3Jlcyk7CisJCWlvdGFibGVfaW5pdChpdGNtX2lvbWFwLCAxKTsKKwkJLyogQ29weSBjb2RlIGZyb20gUkFNIHRvIElUQ00gKi8KKwkJc3RhcnQgPSAmX19zaXRjbV90ZXh0OworCQllbmQgICA9ICZfX2VpdGNtX3RleHQ7CisJCXJhbSAgID0gJl9faXRjbV9zdGFydDsKKwkJbWVtY3B5KHN0YXJ0LCByYW0sIChlbmQtc3RhcnQpKTsKKwkJcHJfZGVidWcoIkNQVSBJVENNOiBjb3BpZWQgY29kZSBmcm9tICVwIC0gJXBcbiIsIHN0YXJ0LCBlbmQpOworCX0KK30KKworLyoKKyAqIFRoaXMgY3JlYXRlcyB0aGUgVENNIG1lbW9yeSBwb29sIGFuZCBoYXMgdG8gYmUgZG9uZSBsYXRlciwKKyAqIGR1cmluZyB0aGUgY29yZV9pbml0aWNhbGxzLCBzaW5jZSB0aGUgYWxsb2NhdG9yIGlzIG5vdCB5ZXQKKyAqIHVwIGFuZCBydW5uaW5nIHdoZW4gdGhlIGZpcnN0IGluaXRpYWxpemF0aW9uIHJ1bnMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3RjbV9wb29sKHZvaWQpCit7CisJdTMyIHRjbV9zdGF0dXMgPSByZWFkX2NwdWlkX3RjbXN0YXR1cygpOworCXUzMiBkdGNtX3Bvb2xfc3RhcnQgPSAodTMyKSAmX19lZHRjbV9kYXRhOworCXUzMiBpdGNtX3Bvb2xfc3RhcnQgPSAodTMyKSAmX19laXRjbV90ZXh0OworCWludCByZXQ7CisKKwkvKgorCSAqIFNldCB1cCBtYWxsb2MgcG9vbCwgMl4yID0gNCBieXRlcyBncmFudWxhcml0eSBzaW5jZQorCSAqIHRoZSBUQ00gaXMgc29tZXRpbWVzIGp1c3QgNCBLaUIuIE5COiBwYWdlcyBhbmQgY2FjaGUKKwkgKiBsaW5lIGFsaWdubWVudHMgZG9lcyBub3QgbWF0dGVyIGluIFRDTSEKKwkgKi8KKwl0Y21fcG9vbCA9IGdlbl9wb29sX2NyZWF0ZSgyLCAtMSk7CisKKwlwcl9kZWJ1ZygiU2V0dGluZyB1cCBUQ00gbWVtb3J5IHBvb2xcbiIpOworCisJLyogQWRkIHRoZSByZXN0IG9mIERUQ00gdG8gdGhlIFRDTSBwb29sICovCisJaWYgKHRjbV9zdGF0dXMgJiAoMSA8PCAxNikpIHsKKwkJaWYgKGR0Y21fcG9vbF9zdGFydCA8IERUQ01fRU5EKSB7CisJCQlyZXQgPSBnZW5fcG9vbF9hZGQodGNtX3Bvb2wsIGR0Y21fcG9vbF9zdGFydCwKKwkJCQkJICAgRFRDTV9FTkQgLSBkdGNtX3Bvb2xfc3RhcnQgKyAxLCAtMSk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJfZXJyKCJDUFUgRFRDTTogY291bGQgbm90IGFkZCBEVENNICIgXAorCQkJCSAgICAgICAicmVtYWluZGVyIHRvIHBvb2whXG4iKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJcHJfZGVidWcoIkNQVSBEVENNOiBBZGRlZCAlMDh4IGJ5dGVzIEAgJTA4eCB0byAiIFwKKwkJCQkgInRoZSBUQ00gbWVtb3J5IHBvb2xcbiIsCisJCQkJIERUQ01fRU5EIC0gZHRjbV9wb29sX3N0YXJ0ICsgMSwKKwkJCQkgZHRjbV9wb29sX3N0YXJ0KTsKKwkJfQorCX0KKworCS8qIEFkZCB0aGUgcmVzdCBvZiBJVENNIHRvIHRoZSBUQ00gcG9vbCAqLworCWlmICh0Y21fc3RhdHVzICYgMSkgeworCQlpZiAoaXRjbV9wb29sX3N0YXJ0IDwgSVRDTV9FTkQpIHsKKwkJCXJldCA9IGdlbl9wb29sX2FkZCh0Y21fcG9vbCwgaXRjbV9wb29sX3N0YXJ0LAorCQkJCQkgICBJVENNX0VORCAtIGl0Y21fcG9vbF9zdGFydCArIDEsIC0xKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoIkNQVSBJVENNOiBjb3VsZCBub3QgYWRkIElUQ00gIiBcCisJCQkJICAgICAgICJyZW1haW5kZXIgdG8gcG9vbCFcbiIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlwcl9kZWJ1ZygiQ1BVIElUQ006IEFkZGVkICUwOHggYnl0ZXMgQCAlMDh4IHRvICIgXAorCQkJCSAidGhlIFRDTSBtZW1vcnkgcG9vbFxuIiwKKwkJCQkgSVRDTV9FTkQgLSBpdGNtX3Bvb2xfc3RhcnQgKyAxLAorCQkJCSBpdGNtX3Bvb2xfc3RhcnQpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKHNldHVwX3RjbV9wb29sKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90Y20uaCBiL2FyY2gvYXJtL2tlcm5lbC90Y20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDE1YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL3RjbS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBTVC1Fcmljc3NvbiBBQgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKiBUQ00gbWVtb3J5IGhhbmRsaW5nIGZvciBBUk0gc3lzdGVtcworICoKKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KKyAqIEF1dGhvcjogUmlja2FyZCBBbmRlcnNzb24gPHJpY2thcmQuYW5kZXJzc29uQHN0ZXJpY3Nzb24uY29tPgorICovCisKKyNpZmRlZiBDT05GSUdfSEFWRV9UQ00KK3ZvaWQgX19pbml0IHRjbV9pbml0KHZvaWQpOworI2Vsc2UKKy8qIE5vIFRDTSBzdXBwb3J0LCBqdXN0IGJsYW5rIGlubGluZXMgdG8gYmUgb3B0aW1pemVkIG91dCAqLworaW5saW5lIHZvaWQgdGNtX2luaXQodm9pZCkKK3sKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RpbWUuYyBiL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKaW5kZXggNGNkYzRhMC4uZDM4Y2RmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggNTdlYjBmNi4uOTU3MThhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCiAgKgotICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIFJ1c3NlbGwgS2luZworICogIENvcHlyaWdodCAoQykgMTk5NS0yMDA5IFJ1c3NlbGwgS2luZwogICogIEZyYWdtZW50cyB0aGF0IGFwcGVhciB0aGUgc2FtZSBhcyBsaW51eC9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMgKEMpIExpbnVzIFRvcnZhbGRzCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTQ1LDIxICs0NSwyMSBAQAogX19zZXR1cCgidXNlcl9kZWJ1Zz0iLCB1c2VyX2RlYnVnX3NldHVwKTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBkdW1wX21lbShjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgYm90dG9tLCB1bnNpZ25lZCBsb25nIHRvcCk7CitzdGF0aWMgdm9pZCBkdW1wX21lbShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiAKIHZvaWQgZHVtcF9iYWNrdHJhY2VfZW50cnkodW5zaWduZWQgbG9uZyB3aGVyZSwgdW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIGZyYW1lKQogewogI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCXByaW50aygiWzwlMDhseD5dICIsIHdoZXJlKTsKLQlwcmludF9zeW1ib2woIiglcykgIiwgd2hlcmUpOwotCXByaW50aygiZnJvbSBbPCUwOGx4Pl0gIiwgZnJvbSk7Ci0JcHJpbnRfc3ltYm9sKCIoJXMpXG4iLCBmcm9tKTsKKwljaGFyIHN5bTFbS1NZTV9TWU1CT0xfTEVOXSwgc3ltMltLU1lNX1NZTUJPTF9MRU5dOworCXNwcmludF9zeW1ib2woc3ltMSwgd2hlcmUpOworCXNwcmludF9zeW1ib2woc3ltMiwgZnJvbSk7CisJcHJpbnRrKCJbPCUwOGx4Pl0gKCVzKSBmcm9tIFs8JTA4bHg+XSAoJXMpXG4iLCB3aGVyZSwgc3ltMSwgZnJvbSwgc3ltMik7CiAjZWxzZQogCXByaW50aygiRnVuY3Rpb24gZW50ZXJlZCBhdCBbPCUwOGx4Pl0gZnJvbSBbPCUwOGx4Pl1cbiIsIHdoZXJlLCBmcm9tKTsKICNlbmRpZgogCiAJaWYgKGluX2V4Y2VwdGlvbl90ZXh0KHdoZXJlKSkKLQkJZHVtcF9tZW0oIkV4Y2VwdGlvbiBzdGFjayIsIGZyYW1lICsgNCwgZnJhbWUgKyA0ICsgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJCWR1bXBfbWVtKCIiLCAiRXhjZXB0aW9uIHN0YWNrIiwgZnJhbWUgKyA0LCBmcmFtZSArIDQgKyBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKIH0KIAogI2lmbmRlZiBDT05GSUdfQVJNX1VOV0lORApAQCAtODEsOSArODEsMTAgQEAKIC8qCiAgKiBEdW1wIG91dCB0aGUgY29udGVudHMgb2Ygc29tZSBtZW1vcnkgbmljZWx5Li4uCiAgKi8KLXN0YXRpYyB2b2lkIGR1bXBfbWVtKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBib3R0b20sIHVuc2lnbmVkIGxvbmcgdG9wKQorc3RhdGljIHZvaWQgZHVtcF9tZW0oY29uc3QgY2hhciAqbHZsLCBjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgYm90dG9tLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgdG9wKQogewotCXVuc2lnbmVkIGxvbmcgcCA9IGJvdHRvbSAmIH4zMTsKKwl1bnNpZ25lZCBsb25nIGZpcnN0OwogCW1tX3NlZ21lbnRfdCBmczsKIAlpbnQgaTsKIApAQCAtOTUsMzMgKzk2LDM3IEBACiAJZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoS0VSTkVMX0RTKTsKIAotCXByaW50aygiJXMoMHglMDhseCB0byAweCUwOGx4KVxuIiwgc3RyLCBib3R0b20sIHRvcCk7CisJcHJpbnRrKCIlcyVzKDB4JTA4bHggdG8gMHglMDhseClcbiIsIGx2bCwgc3RyLCBib3R0b20sIHRvcCk7CiAKLQlmb3IgKHAgPSBib3R0b20gJiB+MzE7IHAgPCB0b3A7KSB7Ci0JCXByaW50aygiJTA0bHg6ICIsIHAgJiAweGZmZmYpOworCWZvciAoZmlyc3QgPSBib3R0b20gJiB+MzE7IGZpcnN0IDwgdG9wOyBmaXJzdCArPSAzMikgeworCQl1bnNpZ25lZCBsb25nIHA7CisJCWNoYXIgc3RyW3NpemVvZigiIDEyMzQ1Njc4IikgKiA4ICsgMV07CiAKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgcCArPSA0KSB7Ci0JCQl1bnNpZ25lZCBpbnQgdmFsOworCQltZW1zZXQoc3RyLCAnICcsIHNpemVvZihzdHIpKTsKKwkJc3RyW3NpemVvZihzdHIpIC0gMV0gPSAnXDAnOwogCi0JCQlpZiAocCA8IGJvdHRvbSB8fCBwID49IHRvcCkKLQkJCQlwcmludGsoIiAgICAgICAgICIpOwotCQkJZWxzZSB7Ci0JCQkJX19nZXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopcCk7Ci0JCQkJcHJpbnRrKCIlMDh4ICIsIHZhbCk7CisJCWZvciAocCA9IGZpcnN0LCBpID0gMDsgaSA8IDggJiYgcCA8IHRvcDsgaSsrLCBwICs9IDQpIHsKKwkJCWlmIChwID49IGJvdHRvbSAmJiBwIDwgdG9wKSB7CisJCQkJdW5zaWduZWQgbG9uZyB2YWw7CisJCQkJaWYgKF9fZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyAqKXApID09IDApCisJCQkJCXNwcmludGYoc3RyICsgaSAqIDksICIgJTA4bHgiLCB2YWwpOworCQkJCWVsc2UKKwkJCQkJc3ByaW50ZihzdHIgKyBpICogOSwgIiA/Pz8/Pz8/PyIpOwogCQkJfQogCQl9Ci0JCXByaW50ayAoIlxuIik7CisJCXByaW50aygiJXMlMDRseDolc1xuIiwgbHZsLCBmaXJzdCAmIDB4ZmZmZiwgc3RyKTsKIAl9CiAKIAlzZXRfZnMoZnMpOwogfQogCi1zdGF0aWMgdm9pZCBkdW1wX2luc3RyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgZHVtcF9pbnN0cihjb25zdCBjaGFyICpsdmwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CiAJY29uc3QgaW50IHRodW1iID0gdGh1bWJfbW9kZShyZWdzKTsKIAljb25zdCBpbnQgd2lkdGggPSB0aHVtYiA/IDQgOiA4OwogCW1tX3NlZ21lbnRfdCBmczsKKwljaGFyIHN0cltzaXplb2YoIjAwMDAwMDAwICIpICogNSArIDIgKyAxXSwgKnAgPSBzdHI7CiAJaW50IGk7CiAKIAkvKgpAQCAtMTMyLDcgKzEzNyw2IEBACiAJZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoS0VSTkVMX0RTKTsKIAotCXByaW50aygiQ29kZTogIik7CiAJZm9yIChpID0gLTQ7IGkgPCAxOyBpKyspIHsKIAkJdW5zaWduZWQgaW50IHZhbCwgYmFkOwogCkBAIC0xNDIsMTMgKzE0NiwxNCBAQAogCQkJYmFkID0gX19nZXRfdXNlcih2YWwsICYoKHUzMiAqKWFkZHIpW2ldKTsKIAogCQlpZiAoIWJhZCkKLQkJCXByaW50ayhpID09IDAgPyAiKCUwKngpICIgOiAiJTAqeCAiLCB3aWR0aCwgdmFsKTsKKwkJCXAgKz0gc3ByaW50ZihwLCBpID09IDAgPyAiKCUwKngpICIgOiAiJTAqeCAiLAorCQkJCQl3aWR0aCwgdmFsKTsKIAkJZWxzZSB7Ci0JCQlwcmludGsoImJhZCBQQyB2YWx1ZS4iKTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiYmFkIFBDIHZhbHVlIik7CiAJCQlicmVhazsKIAkJfQogCX0KLQlwcmludGsoIlxuIik7CisJcHJpbnRrKCIlc0NvZGU6ICVzXG4iLCBsdmwsIHN0cik7CiAKIAlzZXRfZnMoZnMpOwogfQpAQCAtMjI0LDE4ICsyMjksMTkgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IHRocmVhZC0+dGFzazsKIAlzdGF0aWMgaW50IGRpZV9jb3VudGVyOwogCi0JcHJpbnRrKCJJbnRlcm5hbCBlcnJvcjogJXM6ICV4IFsjJWRdIiBTX1BSRUVNUFQgU19TTVAgIlxuIiwKKwlwcmludGsoS0VSTl9FTUVSRyAiSW50ZXJuYWwgZXJyb3I6ICVzOiAleCBbIyVkXSIgU19QUkVFTVBUIFNfU01QICJcbiIsCiAJICAgICAgIHN0ciwgZXJyLCArK2RpZV9jb3VudGVyKTsKKwlzeXNmc19wcmludGtfbGFzdF9maWxlKCk7CiAJcHJpbnRfbW9kdWxlcygpOwogCV9fc2hvd19yZWdzKHJlZ3MpOwotCXByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2sgbGltaXQgPSAweCVwKVxuIiwKLQkJdHNrLT5jb21tLCB0YXNrX3BpZF9ucih0c2spLCB0aHJlYWQgKyAxKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiUHJvY2VzcyAlLipzIChwaWQ6ICVkLCBzdGFjayBsaW1pdCA9IDB4JXApXG4iLAorCQlUQVNLX0NPTU1fTEVOLCB0c2stPmNvbW0sIHRhc2tfcGlkX25yKHRzayksIHRocmVhZCArIDEpOwogCiAJaWYgKCF1c2VyX21vZGUocmVncykgfHwgaW5faW50ZXJydXB0KCkpIHsKLQkJZHVtcF9tZW0oIlN0YWNrOiAiLCByZWdzLT5BUk1fc3AsCisJCWR1bXBfbWVtKEtFUk5fRU1FUkcsICJTdGFjazogIiwgcmVncy0+QVJNX3NwLAogCQkJIFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRzaykpOwogCQlkdW1wX2JhY2t0cmFjZShyZWdzLCB0c2spOwotCQlkdW1wX2luc3RyKHJlZ3MpOworCQlkdW1wX2luc3RyKEtFUk5fRU1FUkcsIHJlZ3MpOwogCX0KIH0KIApAQCAtMjUwLDEzICsyNTYsMTQgQEAKIAogCW9vcHNfZW50ZXIoKTsKIAotCWNvbnNvbGVfdmVyYm9zZSgpOwogCXNwaW5fbG9ja19pcnEoJmRpZV9sb2NrKTsKKwljb25zb2xlX3ZlcmJvc2UoKTsKIAlidXN0X3NwaW5sb2NrcygxKTsKIAlfX2RpZShzdHIsIGVyciwgdGhyZWFkLCByZWdzKTsKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKKwlvb3BzX2V4aXQoKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTI2NCw3ICsyNzEsNiBAQAogCWlmIChwYW5pY19vbl9vb3BzKQogCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CiAKLQlvb3BzX2V4aXQoKTsKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCkBAIC0zNDksNyArMzU1LDcgQEAKIAlpZiAodXNlcl9kZWJ1ZyAmIFVEQkdfVU5ERUZJTkVEKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzICglZCk6IHVuZGVmaW5lZCBpbnN0cnVjdGlvbjogcGM9JXBcbiIsCiAJCQljdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgcGMpOwotCQlkdW1wX2luc3RyKHJlZ3MpOworCQlkdW1wX2luc3RyKEtFUk5fSU5GTywgcmVncyk7CiAJfQogI2VuZGlmCiAKQEAgLTQwMCw3ICs0MDYsNyBAQAogCWlmICh1c2VyX2RlYnVnICYgVURCR19TWVNDQUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiWyVkXSAlczogb2Jzb2xldGUgc3lzdGVtIGNhbGwgJTA4eC5cbiIsCiAJCQl0YXNrX3BpZF9ucihjdXJyZW50KSwgY3VycmVudC0+Y29tbSwgbik7Ci0JCWR1bXBfaW5zdHIocmVncyk7CisJCWR1bXBfaW5zdHIoS0VSTl9FUlIsIHJlZ3MpOwogCX0KICNlbmRpZgogCkBAIC00MTgsMTIgKzQyNCwxNCBAQAogc3RhdGljIGlubGluZSB2b2lkCiBkb19jYWNoZV9vcCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50IGZsYWdzKQogeworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+YWN0aXZlX21tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCiAJaWYgKGVuZCA8IHN0YXJ0IHx8IGZsYWdzKQogCQlyZXR1cm47CiAKLQl2bWEgPSBmaW5kX3ZtYShjdXJyZW50LT5hY3RpdmVfbW0sIHN0YXJ0KTsKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdm1hID0gZmluZF92bWEobW0sIHN0YXJ0KTsKIAlpZiAodm1hICYmIHZtYS0+dm1fc3RhcnQgPCBlbmQpIHsKIAkJaWYgKHN0YXJ0IDwgdm1hLT52bV9zdGFydCkKIAkJCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKQEAgLTQzMiw2ICs0NDAsNyBAQAogCiAJCWZsdXNoX2NhY2hlX3VzZXJfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKTsKIAl9CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIH0KIAogLyoKQEAgLTU3Niw3ICs1ODUsNyBAQAogCWlmICh1c2VyX2RlYnVnICYgVURCR19TWVNDQUxMKSB7CiAJCXByaW50aygiWyVkXSAlczogYXJtIHN5c2NhbGwgJWRcbiIsCiAJCSAgICAgICB0YXNrX3BpZF9ucihjdXJyZW50KSwgY3VycmVudC0+Y29tbSwgbm8pOwotCQlkdW1wX2luc3RyKHJlZ3MpOworCQlkdW1wX2luc3RyKCIiLCByZWdzKTsKIAkJaWYgKHVzZXJfbW9kZShyZWdzKSkgewogCQkJX19zaG93X3JlZ3MocmVncyk7CiAJCQljX2JhY2t0cmFjZShyZWdzLT5BUk1fZnAsIHByb2Nlc3Nvcl9tb2RlKHJlZ3MpKTsKQEAgLTY1Myw3ICs2NjIsNyBAQAogCWlmICh1c2VyX2RlYnVnICYgVURCR19CQURBQk9SVCkgewogCQlwcmludGsoS0VSTl9FUlIgIlslZF0gJXM6IGJhZCBkYXRhIGFib3J0OiBjb2RlICVkIGluc3RyIDB4JTA4bHhcbiIsCiAJCQl0YXNrX3BpZF9ucihjdXJyZW50KSwgY3VycmVudC0+Y29tbSwgY29kZSwgaW5zdHIpOwotCQlkdW1wX2luc3RyKHJlZ3MpOworCQlkdW1wX2luc3RyKEtFUk5fRVJSLCByZWdzKTsKIAkJc2hvd19wdGUoY3VycmVudC0+bW0sIGFkZHIpOwogCX0KICNlbmRpZgpAQCAtNzQyLDYgKzc1MSw4IEBACiAJICovCiAJbWVtY3B5KCh2b2lkICopS0VSTl9TSUdSRVRVUk5fQ09ERSwgc2lncmV0dXJuX2NvZGVzLAogCSAgICAgICBzaXplb2Yoc2lncmV0dXJuX2NvZGVzKSk7CisJbWVtY3B5KCh2b2lkICopS0VSTl9SRVNUQVJUX0NPREUsIHN5c2NhbGxfcmVzdGFydF9jb2RlLAorCSAgICAgICBzaXplb2Yoc3lzY2FsbF9yZXN0YXJ0X2NvZGUpKTsKIAogCWZsdXNoX2ljYWNoZV9yYW5nZSh2ZWN0b3JzLCB2ZWN0b3JzICsgUEFHRV9TSVpFKTsKIAltb2RpZnlfZG9tYWluKERPTUFJTl9VU0VSLCBET01BSU5fQ0xJRU5UKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC91bndpbmQuYyBiL2FyY2gvYXJtL2tlcm5lbC91bndpbmQuYwppbmRleCAzOWJhZjExLi43ODZhYzJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdW53aW5kLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Vud2luZC5jCkBAIC0yNiw2ICsyNiwxNSBAQAogICogaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL3RvcGljL2NvbS5hcm0uZG9jLnN1YnNldC5zd2Rldi5hYmkvaW5kZXguaHRtbAogICovCiAKKyNpZiAhZGVmaW5lZCAoX19BUk1fRUFCSV9fKQorI3dhcm5pbmcgWW91ciBjb21waWxlciBkb2VzIG5vdCBoYXZlIEVBQkkgc3VwcG9ydC4KKyN3YXJuaW5nICAgIEFSTSB1bndpbmQgaXMga25vd24gdG8gY29tcGlsZSBvbmx5IHdpdGggRUFCSSBjb21waWxlcnMuCisjd2FybmluZyAgICBDaGFuZ2UgY29tcGlsZXIgb3IgZGlzYWJsZSBBUk1fVU5XSU5EIG9wdGlvbi4KKyNlbGlmIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fIDw9IDIpCisjd2FybmluZyBZb3VyIGNvbXBpbGVyIGlzIHRvbyBidWdneTsgaXQgaXMga25vd24gdG8gbm90IGNvbXBpbGUgQVJNIHVud2luZCBzdXBwb3J0LgorI3dhcm5pbmcgICAgQ2hhbmdlIGNvbXBpbGVyIG9yIGRpc2FibGUgQVJNX1VOV0lORCBvcHRpb24uCisjZW5kaWYKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNWNjNDgxMi4uYWVjZjg3ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xOTksNiArMTk5LDYzIEBACiAJfQogCV9lZGF0YV9sb2MgPSBfX2RhdGFfbG9jICsgU0laRU9GKC5kYXRhKTsKIAorI2lmZGVmIENPTkZJR19IQVZFX1RDTQorICAgICAgICAvKgorCSAqIFdlIGFsaWduIGV2ZXJ5dGhpbmcgdG8gYSBwYWdlIGJvdW5kYXJ5IHNvIHdlIGNhbgorCSAqIGZyZWUgaXQgYWZ0ZXIgaW5pdCBoYXMgY29tbWVuY2VkIGFuZCBUQ00gY29udGVudHMgaGF2ZQorCSAqIGJlZW4gY29waWVkIHRvIGl0cyBkZXN0aW5hdGlvbi4KKwkgKi8KKwkudGNtX3N0YXJ0IDogeworCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkJX190Y21fc3RhcnQgPSAuOworCQlfX2l0Y21fc3RhcnQgPSAuOworCX0KKworCS8qCisJICogTGluayB0aGVzZSB0byB0aGUgSVRDTSBSQU0KKwkgKiBQdXQgVk1BIHRvIHRoZSBUQ00gYWRkcmVzcyBhbmQgTE1BIHRvIHRoZSBjb21tb24gUkFNCisJICogYW5kIHdlJ2xsIHVwbG9hZCB0aGUgY29udGVudHMgZnJvbSBSQU0gdG8gVENNIGFuZCBmcmVlCisJICogdGhlIHVzZWQgUkFNIGFmdGVyIHRoYXQuCisJICovCisJLnRleHRfaXRjbSBJVENNX09GRlNFVCA6IEFUKF9faXRjbV9zdGFydCkKKwl7CisJCV9fc2l0Y21fdGV4dCA9IC47CisJCSooLnRjbS50ZXh0KQorCQkqKC50Y20ucm9kYXRhKQorCQkuID0gQUxJR04oNCk7CisJCV9fZWl0Y21fdGV4dCA9IC47CisJfQorCisJLyoKKwkgKiBSZXNldCB0aGUgZG90IHBvaW50ZXIsIHRoaXMgaXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUKKwkgKiByZWxhdGl2ZSBfX2R0Y21fc3RhcnQgYmVsb3cgKHRvIGJlIHVzZWQgYXMgZXh0ZXJuIGluIGNvZGUpLgorCSAqLworCS4gPSBBRERSKC50Y21fc3RhcnQpICsgU0laRU9GKC50Y21fc3RhcnQpICsgU0laRU9GKC50ZXh0X2l0Y20pOworCisJLmR0Y21fc3RhcnQgOiB7CisJCV9fZHRjbV9zdGFydCA9IC47CisJfQorCisJLyogVE9ETzogYWRkIHJlbWFpbmRlciBvZiBJVENNIGFzIHdlbGwsIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRhdGEhICovCisJLmRhdGFfZHRjbSBEVENNX09GRlNFVCA6IEFUKF9fZHRjbV9zdGFydCkKKwl7CisJCS4gPSBBTElHTig0KTsKKwkJX19zZHRjbV9kYXRhID0gLjsKKwkJKigudGNtLmRhdGEpCisJCS4gPSBBTElHTig0KTsKKwkJX19lZHRjbV9kYXRhID0gLjsKKwl9CisKKwkvKiBSZXNldCB0aGUgZG90IHBvaW50ZXIgb3IgdGhlIGxpbmtlciBnZXRzIGNvbmZ1c2VkICovCisJLiA9IEFERFIoLmR0Y21fc3RhcnQpICsgU0laRU9GKC5kYXRhX2R0Y20pOworCisJLyogRW5kIG1hcmtlciBmb3IgZnJlZWluZyBUQ00gY29weSBpbiBsaW5rZWQgb2JqZWN0ICovCisJLnRjbV9lbmQgOiBBVChBRERSKC5kdGNtX3N0YXJ0KSArIFNJWkVPRiguZGF0YV9kdGNtKSl7CisJCS4gPSBBTElHTihQQUdFX1NJWkUpOworCQlfX3RjbV9lbmQgPSAuOworCX0KKyNlbmRpZgorCiAJLmJzcyA6IHsKIAkJX19ic3Nfc3RhcnQgPSAuOwkvKiBCU1MJCQkJKi8KIAkJKiguYnNzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TIGIvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TCmluZGV4IDZhZTA0ZGIuLjZlZTJmNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jb3B5X3BhZ2UuUworKysgYi9hcmNoL2FybS9saWIvY29weV9wYWdlLlMKQEAgLTEyLDggKzEyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCi0jZGVmaW5lIENPUFlfQ09VTlQgKFBBR0VfU1ovNjQgUExEKCAtMSApKQorI2RlZmluZSBDT1BZX0NPVU5UIChQQUdFX1NaIC8gKDIgKiBMMV9DQUNIRV9CWVRFUykgUExEKCAtMSApKQogCiAJCS50ZXh0CiAJCS5hbGlnbgk1CkBAIC0yNiwxNyArMjcsMTYgQEAKIEVOVFJZKGNvcHlfcGFnZSkKIAkJc3RtZmQJc3AhLCB7cjQsIGxyfQkJCUAJMgogCVBMRCgJcGxkCVtyMSwgIzBdCQkpCi0JUExEKAlwbGQJW3IxLCAjMzJdCQkpCisJUExEKAlwbGQJW3IxLCAjTDFfQ0FDSEVfQllURVNdCQkpCiAJCW1vdglyMiwgI0NPUFlfQ09VTlQJCQlACTEKIAkJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMQotMToJUExEKAlwbGQJW3IxLCAjNjRdCQkpCi0JUExEKAlwbGQJW3IxLCAjOTZdCQkpCi0yOgkJc3RtaWEJcjAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQKLQkJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMQotCQlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAJNAotCQlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAJNCsxCisxOglQTEQoCXBsZAlbcjEsICMyICogTDFfQ0FDSEVfQllURVNdKQorCVBMRCgJcGxkCVtyMSwgIzMgKiBMMV9DQUNIRV9CWVRFU10pCisyOgorCS5yZXB0CSgyICogTDFfQ0FDSEVfQllURVMgLyAxNiAtIDEpCiAJCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0CiAJCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQAk0CisJLmVuZHIKIAkJc3VicwlyMiwgcjIsICMxCQkJQAkxCiAJCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0CiAJCWxkbWd0aWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jCmluZGV4IDQxMmFhNDkuLmQxZjc3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYwpAQCAtNzcxLDkgKzc3MSw5IEBACiAgKiAgQUM5NwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9BVDkxX0FDOTcpIHx8IGRlZmluZWQoQ09ORklHX1NORF9BVDkxX0FDOTdfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX1NORF9BVE1FTF9BQzk3QykgfHwgZGVmaW5lZChDT05GSUdfU05EX0FUTUVMX0FDOTdDX01PRFVMRSkKIHN0YXRpYyB1NjQgYWM5N19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLXN0YXRpYyBzdHJ1Y3QgYXRtZWxfYWM5N19kYXRhIGFjOTdfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N2NfcGxhdGZvcm1fZGF0YSBhYzk3X2RhdGE7CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWM5N19yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CkBAIC03ODksNyArNzg5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFjYXA5X2FjOTdfZGV2aWNlID0gewotCS5uYW1lCQk9ICJhYzk3YyIsCisJLm5hbWUJCT0gImF0bWVsX2FjOTdjIiwKIAkuaWQJCT0gMSwKIAkuZGV2CQk9IHsKIAkJCQkuZG1hX21hc2sJCT0gJmFjOTdfZG1hbWFzaywKQEAgLTgwMCw3ICs4MDAsNyBAQAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhYzk3X3Jlc291cmNlcyksCiB9OwogCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfYWM5NyhzdHJ1Y3QgYXRtZWxfYWM5N19kYXRhICpkYXRhKQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2FjOTcoc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgKmRhdGEpCiB7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm47CkBAIC04MTgsNyArODE4LDcgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFjYXA5X2FjOTdfZGV2aWNlKTsKIH0KICNlbHNlCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfYWM5NyhzdHJ1Y3QgYXRtZWxfYWM5N19kYXRhICpkYXRhKSB7fQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2FjOTcoc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgKmRhdGEpIHt9CiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYwppbmRleCA1NTcxOWE5Li5mYjVjMjNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKQEAgLTc1Nyw2ICs3NTcsNDIgQEAKIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9hYzk3KHN0cnVjdCBhYzk3Y19wbGF0Zm9ybV9kYXRhICpkYXRhKSB7fQogI2VuZGlmCiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQ0FOIENvbnRyb2xsZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19DQU5fQVQ5MSkgfHwgZGVmaW5lZChDT05GSUdfQ0FOX0FUOTFfTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjYW5fcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2M19CQVNFX0NBTiwKKwkJLmVuZAk9IEFUOTFTQU05MjYzX0JBU0VfQ0FOICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYzX0lEX0NBTiwKKwkJLmVuZAk9IEFUOTFTQU05MjYzX0lEX0NBTiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYzX2Nhbl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0OTFfY2FuIiwKKwkuaWQJCT0gLTEsCisJLnJlc291cmNlCT0gY2FuX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY2FuX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfY2FuKHN0cnVjdCBhdDkxX2Nhbl9kYXRhICpkYXRhKQoreworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTMsIDApOwkvKiBDQU5UWCAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTQsIDApOwkvKiBDQU5SWCAqLworCWF0OTFzYW05MjYzX2Nhbl9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSBkYXRhOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxc2FtOTI2M19jYW5fZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfY2FuKHN0cnVjdCBhdDkxX2Nhbl9kYXRhICpkYXRhKSB7fQorI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgTENEIENvbnRyb2xsZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jCmluZGV4IGQ3NDZlODYuLjMzMmI3ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1X2RldmljZXMuYwpAQCAtMjQsMTEgKzI0LDU5IEBACiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOWc0NS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlnNDVfbWF0cml4Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KKyNpbmNsdWRlIDxtYWNoL2F0X2hkbWFjLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBIRE1BQyAtIEFIQiBETUEgQ29udHJvbGxlcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FUX0hETUFDKSB8fCBkZWZpbmVkKENPTkZJR19BVF9IRE1BQ19NT0RVTEUpCitzdGF0aWMgdTY0IGhkbWFjX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IGF0X2RtYV9wbGF0Zm9ybV9kYXRhIGF0ZG1hX3BkYXRhID0geworCS5ucl9jaGFubmVscwk9IDgsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGhkbWFjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfRE1BLAorCQkuZW5kCT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfRE1BICsgU1pfNTEyIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05RzQ1X0lEX0RNQSwKKwkJLmVuZAk9IEFUOTFTQU05RzQ1X0lEX0RNQSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0X2hkbWFjX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRfaGRtYWMiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJmhkbWFjX2RtYW1hc2ssCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJCQkucGxhdGZvcm1fZGF0YQkJPSAmYXRkbWFfcGRhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBoZG1hY19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhkbWFjX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfaGRtYWModm9pZCkKK3sKKwlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBhdGRtYV9wZGF0YS5jYXBfbWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBhdGRtYV9wZGF0YS5jYXBfbWFzayk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdF9oZG1hY19kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9oZG1hYyh2b2lkKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBVU0IgSG9zdCAoT0hDSSkKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTU1MCw2ICs1OTgsNjEgQEAKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEFDOTcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfQVRNRUxfQUM5N0MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9BVE1FTF9BQzk3Q19NT0RVTEUpCitzdGF0aWMgdTY0IGFjOTdfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CitzdGF0aWMgc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgYWM5N19kYXRhOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFjOTdfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOUc0NV9CQVNFX0FDOTdDLAorCQkuZW5kCT0gQVQ5MVNBTTlHNDVfQkFTRV9BQzk3QyArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOUc0NV9JRF9BQzk3QywKKwkJLmVuZAk9IEFUOTFTQU05RzQ1X0lEX0FDOTdDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTlnNDVfYWM5N19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX2FjOTdjIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJmFjOTdfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZhYzk3X2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBhYzk3X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYWM5N19yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2FjOTcoc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgKmRhdGEpCit7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QRDgsIDApOwkvKiBBQzk3RlMgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QRDksIDApOwkvKiBBQzk3Q0sgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QRDcsIDApOwkvKiBBQzk3VFggKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QRDYsIDApOwkvKiBBQzk3UlggKi8KKworCS8qIHJlc2V0ICovCisJaWYgKGRhdGEtPnJlc2V0X3BpbikKKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+cmVzZXRfcGluLCAwKTsKKworCWFjOTdfZGF0YSA9ICpkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTlnNDVfYWM5N19kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9hYzk3KHN0cnVjdCBhYzk3Y19wbGF0Zm9ybV9kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBMQ0QgQ29udHJvbGxlcgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNzM1LDcgKzgzOCw3IEBACiAgKiAgV2F0Y2hkb2cKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19BVDkxU0FNOV9XQVRDSERPRykgfHwgZGVmaW5lZChDT05GSUdfQVQ5MVNBTTlfV0FUQ0hET0dfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0FUOTFTQU05WF9XQVRDSERPRykgfHwgZGVmaW5lZChDT05GSUdfQVQ5MVNBTTlYX1dBVENIRE9HX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05ZzQ1X3dkdF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gImF0OTFfd2R0IiwKIAkuaWQJCT0gLTEsCkBAIC0xMjIwLDYgKzEzMjMsNyBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBhdDkxX2FkZF9zdGFuZGFyZF9kZXZpY2VzKHZvaWQpCiB7CisJYXQ5MV9hZGRfZGV2aWNlX2hkbWFjKCk7CiAJYXQ5MV9hZGRfZGV2aWNlX3J0YygpOwogCWF0OTFfYWRkX2RldmljZV9ydHQoKTsKIAlhdDkxX2FkZF9kZXZpY2Vfd2F0Y2hkb2coKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwppbmRleCA3MjgxODY1Li5kMzQ1ZjU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCkBAIC0yMSwxMSArMjEsNTcgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05cmwuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05cmxfbWF0cml4Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KKyNpbmNsdWRlIDxtYWNoL2F0X2hkbWFjLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBIRE1BQyAtIEFIQiBETUEgQ29udHJvbGxlcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FUX0hETUFDKSB8fCBkZWZpbmVkKENPTkZJR19BVF9IRE1BQ19NT0RVTEUpCitzdGF0aWMgdTY0IGhkbWFjX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IGF0X2RtYV9wbGF0Zm9ybV9kYXRhIGF0ZG1hX3BkYXRhID0geworCS5ucl9jaGFubmVscwk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGhkbWFjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfRE1BLAorCQkuZW5kCT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfRE1BICsgU1pfNTEyIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05UkxfSURfRE1BLAorCQkuZW5kCT0gQVQ5MVNBTTlSTF9JRF9ETUEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdF9oZG1hY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0X2hkbWFjIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCQkJLmRtYV9tYXNrCQk9ICZoZG1hY19kbWFtYXNrLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJCQkJLnBsYXRmb3JtX2RhdGEJCT0gJmF0ZG1hX3BkYXRhLAorCX0sCisJLnJlc291cmNlCT0gaGRtYWNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZG1hY19yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2hkbWFjKHZvaWQpCit7CisJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgYXRkbWFfcGRhdGEuY2FwX21hc2spOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXRfaGRtYWNfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfaGRtYWModm9pZCkge30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFVTQiBIUyBEZXZpY2UgKEdhZGdldCkKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTM5OCw2ICs0NDQsNjEgQEAKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEFDOTcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfQVRNRUxfQUM5N0MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9BVE1FTF9BQzk3Q19NT0RVTEUpCitzdGF0aWMgdTY0IGFjOTdfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CitzdGF0aWMgc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgYWM5N19kYXRhOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFjOTdfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOVJMX0JBU0VfQUM5N0MsCisJCS5lbmQJPSBBVDkxU0FNOVJMX0JBU0VfQUM5N0MgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTlSTF9JRF9BQzk3QywKKwkJLmVuZAk9IEFUOTFTQU05UkxfSURfQUM5N0MsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOXJsX2FjOTdfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdG1lbF9hYzk3YyIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCQkJLmRtYV9tYXNrCQk9ICZhYzk3X2RtYW1hc2ssCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJCQkucGxhdGZvcm1fZGF0YQkJPSAmYWM5N19kYXRhLAorCX0sCisJLnJlc291cmNlCT0gYWM5N19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGFjOTdfcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9hYzk3KHN0cnVjdCBhYzk3Y19wbGF0Zm9ybV9kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEQxLCAwKTsJLyogQUM5N0ZTICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEQyLCAwKTsJLyogQUM5N0NLICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEQzLCAwKTsJLyogQUM5N1RYICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEQ0LCAwKTsJLyogQUM5N1JYICovCisKKwkvKiByZXNldCAqLworCWlmIChkYXRhLT5yZXNldF9waW4pCisJCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPnJlc2V0X3BpbiwgMCk7CisKKwlhYzk3X2RhdGEgPSAqZGF0YTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFzYW05cmxfYWM5N19kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9hYzk3KHN0cnVjdCBhYzk3Y19wbGF0Zm9ybV9kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBMQ0QgQ29udHJvbGxlcgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTEwMyw2ICsxMjA0LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgYXQ5MV9hZGRfc3RhbmRhcmRfZGV2aWNlcyh2b2lkKQogeworCWF0OTFfYWRkX2RldmljZV9oZG1hYygpOwogCWF0OTFfYWRkX2RldmljZV9ydGMoKTsKIAlhdDkxX2FkZF9kZXZpY2VfcnR0KCk7CiAJYXQ5MV9hZGRfZGV2aWNlX3dhdGNoZG9nKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYwppbmRleCA4M2ExYTBmLi5kNjk0MDg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKQEAgLTM2NCw3ICszNjQsNyBAQAogLyoKICAqIEFDOTcKICAqLwotc3RhdGljIHN0cnVjdCBhdG1lbF9hYzk3X2RhdGEgY2FwOWFka19hYzk3X2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgY2FwOWFka19hYzk3X2RhdGEgPSB7CiAvLwkucmVzZXRfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jCmluZGV4IDhjMGI3MWMuLjdjMWUzODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYwpAQCAtMzQwLDcgKzM0MCw3IEBACiAvKgogICogQUM5NwogICovCi1zdGF0aWMgc3RydWN0IGF0bWVsX2FjOTdfZGF0YSBuZW9jb3JlOTI2X2FjOTdfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYWM5N2NfcGxhdGZvcm1fZGF0YSBuZW9jb3JlOTI2X2FjOTdfZGF0YSA9IHsKIAkucmVzZXRfcGluCT0gQVQ5MV9QSU5fUEExMywKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYwppbmRleCAyNmYxYWE2Li4yZDg2N2ZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCkBAIC00MDAsNiArNDAwLDIzIEBACiAJfQogfTsKIAorLyoKKyAqIENBTgorICovCitzdGF0aWMgdm9pZCBzYW05MjYzZWtfdHJhbnNjZWl2ZXJfc3dpdGNoKGludCBvbikKK3sKKwlpZiAob24pIHsKKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoQVQ5MV9QSU5fUEExOCwgMSk7IC8qIENBTlJYRU4gKi8KKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoQVQ5MV9QSU5fUEExOSwgMCk7IC8qIENBTlJTICovCisJfSBlbHNlIHsKKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoQVQ5MV9QSU5fUEExOCwgMCk7IC8qIENBTlJYRU4gKi8KKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoQVQ5MV9QSU5fUEExOSwgMSk7IC8qIENBTlJTICovCisJfQorfQorCitzdGF0aWMgc3RydWN0IGF0OTFfY2FuX2RhdGEgZWtfY2FuX2RhdGEgPSB7CisJLnRyYW5zY2VpdmVyX3N3aXRjaCA9IHNhbTkyNjNla190cmFuc2NlaXZlcl9zd2l0Y2gsCit9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYm9hcmRfaW5pdCh2b2lkKQogewpAQCAtNDMxLDYgKzQ0OCw4IEBACiAJLyogTEVEcyAqLwogCWF0OTFfZ3Bpb19sZWRzKGVrX2xlZHMsIEFSUkFZX1NJWkUoZWtfbGVkcykpOwogCWF0OTFfcHdtX2xlZHMoZWtfcHdtX2xlZCwgQVJSQVlfU0laRShla19wd21fbGVkKSk7CisJLyogQ0FOICovCisJYXQ5MV9hZGRfZGV2aWNlX2NhbigmZWtfY2FuX2RhdGEpOwogfQogCiBNQUNISU5FX1NUQVJUKEFUOTFTQU05MjYzRUssICJBdG1lbCBBVDkxU0FNOTI2My1FSyIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKaW5kZXggYjg1NThlYS4uNjRjMzg0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYwpAQCAtMzExLDYgKzMxMSwxNCBAQAogCiAKIC8qCisgKiBBQzk3CisgKiByZXNldF9waW4gaXMgbm90IGNvbm5lY3RlZDogTlJTVAorICovCitzdGF0aWMgc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgZWtfYWM5N19kYXRhID0geworfTsKKworCisvKgogICogTEVEcyAuLi4gdGhlc2UgY291bGQgYWxsIGJlIFBXTS1kcml2ZW4sIGZvciB2YXJpYWJsZSBicmlnaHRuZXNzCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZWtfbGVkc1tdID0gewpAQCAtMzcyLDYgKzM4MCw4IEBACiAJYXQ5MV9hZGRfZGV2aWNlX2xjZGMoJmVrX2xjZGNfZGF0YSk7CiAJLyogUHVzaCBCdXR0b25zICovCiAJZWtfYWRkX2RldmljZV9idXR0b25zKCk7CisJLyogQUM5NyAqLworCWF0OTFfYWRkX2RldmljZV9hYzk3KCZla19hYzk3X2RhdGEpOwogCS8qIExFRHMgKi8KIAlhdDkxX2dwaW9fbGVkcyhla19sZWRzLCBBUlJBWV9TSVpFKGVrX2xlZHMpKTsKIAlhdDkxX3B3bV9sZWRzKGVrX3B3bV9sZWQsIEFSUkFZX1NJWkUoZWtfcHdtX2xlZCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwppbmRleCA5NGZmYjVjLi5iZDI4ZTk4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwpAQCAtMjExLDYgKzIxMSwxNCBAQAogCiAKIC8qCisgKiBBQzk3CisgKiByZXNldF9waW4gaXMgbm90IGNvbm5lY3RlZDogTlJTVAorICovCitzdGF0aWMgc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgZWtfYWM5N19kYXRhID0geworfTsKKworCisvKgogICogTEVEcwogICovCiBzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGVrX2xlZHNbXSA9IHsKQEAgLTI5OSw2ICszMDcsOCBAQAogCWF0OTFfYWRkX2RldmljZV9tbWMoMCwgJmVrX21tY19kYXRhKTsKIAkvKiBMQ0QgQ29udHJvbGxlciAqLwogCWF0OTFfYWRkX2RldmljZV9sY2RjKCZla19sY2RjX2RhdGEpOworCS8qIEFDOTcgKi8KKwlhdDkxX2FkZF9kZXZpY2VfYWM5NygmZWtfYWM5N19kYXRhKTsKIAkvKiBUb3VjaCBTY3JlZW4gQ29udHJvbGxlciAqLwogCWF0OTFfYWRkX2RldmljZV90c2FkY2MoKTsKIAkvKiBMRURzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmgKaW5kZXggNTgzZjM4YS4uMmY0ZmNlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ib2FyZC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYm9hcmQuaApAQCAtMTg4LDYgKzE4OCwxMiBAQAogIC8qIFRvdWNoc2NyZWVuIENvbnRyb2xsZXIgKi8KIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdHNhZGNjKHZvaWQpOwogCisvKiBDQU4gKi8KK3N0cnVjdCBhdDkxX2Nhbl9kYXRhIHsKKwl2b2lkICgqdHJhbnNjZWl2ZXJfc3dpdGNoKShpbnQgb24pOworfTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfY2FuKHN0cnVjdCBhdDkxX2Nhbl9kYXRhICpkYXRhKTsKKwogIC8qIExFRHMgKi8KIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxX2luaXRfbGVkcyh1OCBjcHVfbGVkLCB1OCB0aW1lcl9sZWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfZ3Bpb19sZWRzKHN0cnVjdCBncGlvX2xlZCAqbGVkcywgaW50IG5yKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oCmluZGV4IDM0YTk1MDIuLmMyMmRmMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9jcHUuaApAQCAtMjUsNiArMjUsOCBAQAogI2RlZmluZSBBUkNIX0lEX0FUOTFTQU05RzIwCTB4MDE5OTA1YTAKICNkZWZpbmUgQVJDSF9JRF9BVDkxU0FNOVJMNjQJMHgwMTliMDNhMAogI2RlZmluZSBBUkNIX0lEX0FUOTFTQU05RzQ1CTB4ODE5YjA1YTAKKyNkZWZpbmUgQVJDSF9JRF9BVDkxU0FNOUc0NU1STAkweDgxOWIwNWEyCS8qIGFrYSA5RzQ1LUVTMiAmIG5vbiBFUyBsb3RzICovCisjZGVmaW5lIEFSQ0hfSURfQVQ5MVNBTTlHNDVFUwkweDgxOWIwNWExCS8qIDlHNDUtRVMgKEVuZ2luZWVyaW5nIFNhbXBsZSkgKi8KICNkZWZpbmUgQVJDSF9JRF9BVDkxQ0FQOQkweDAzOUEwM0EwCiAKICNkZWZpbmUgQVJDSF9JRF9BVDkxU0FNOVhFMTI4CTB4MzI5OTczYTAKQEAgLTQxLDYgKzQzLDExIEBACiAJcmV0dXJuIChhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKSAmIH5BVDkxX0NJRFJfVkVSU0lPTik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxX2NwdV9mdWxseV9pZGVudGlmeSh2b2lkKQoreworCXJldHVybiBhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKTsKK30KKwogI2RlZmluZSBBUkNIX0VYSURfQVQ5MVNBTTlNMTEJMHgwMDAwMDAwMQogI2RlZmluZSBBUkNIX0VYSURfQVQ5MVNBTTlNMTAJMHgwMDAwMDAwMgogI2RlZmluZSBBUkNIX0VYSURfQVQ5MVNBTTlHNDUJMHgwMDAwMDAwNApAQCAtMTE4LDggKzEyNSwxMCBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTlHNDUKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1KCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOUc0NSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1ZXMoKQkoYXQ5MV9jcHVfZnVsbHlfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05RzQ1RVMpCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDUoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1ZXMoKQkoMCkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MUNBUDkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvY29yZS5jCmluZGV4IDQ5MmM2NDkuLmU1OTBiYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2NvcmUuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogCi0jaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxtYWNoL2NzcC9tbV9hZGRyLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9jbGtkZXYuaD4KQEAgLTQ1LDcgKzQ0LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CiAKICNpbmNsdWRlIDxjZmdfZ2xvYmFsLmg+CiAKQEAgLTI3MywxMiArMjcxLDEyIEBACiAJLmhhbmRsZXIgPSBiY21yaW5nX3RpbWVyX2ludGVycnVwdCwKIH07CiAKLXN0YXRpYyBjeWNsZV90IGJjbXJpbmdfZ2V0X2N5Y2xlc190aW1lcjEodm9pZCkKK3N0YXRpYyBjeWNsZV90IGJjbXJpbmdfZ2V0X2N5Y2xlc190aW1lcjEoc3RydWN0IGNsb2Nrc291cmNlICpjcykKIHsKIAlyZXR1cm4gfnJlYWRsKFRJTUVSMV9WQV9CQVNFICsgVElNRVJfVkFMVUUpOwogfQogCi1zdGF0aWMgY3ljbGVfdCBiY21yaW5nX2dldF9jeWNsZXNfdGltZXIzKHZvaWQpCitzdGF0aWMgY3ljbGVfdCBiY21yaW5nX2dldF9jeWNsZXNfdGltZXIzKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7CiAJcmV0dXJuIH5yZWFkbChUSU1FUjNfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmluZGV4IGNkYmY5M2MuLjM4YjM3MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMjksNyArMjksNyBAQAogCWNwdV9kb19pZGxlKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSwgY2hhciAqY21kKQorc3RhdGljIGlubGluZSB2b2lkIGFyY2hfcmVzZXQoY2hhciBtb2RlLCBjb25zdCBjaGFyICpjbWQpCiB7CiAJcHJpbnRrKCJhcmNoX3Jlc2V0OiVjICV4XG4iLCBtb2RlLCBiY21yaW5nX2FyY2hfd2FybV9yZWJvb3QpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMKaW5kZXggYTFkNWU3ZC4uNTJkZDgwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL25hbmQuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L0tjb25maWcKaW5kZXggZDcyOTFjNi4uOTE2N2MzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9LY29uZmlnCkBAIC0xNywxMyArMTcsMzEgQEAKIAlib29sICIweDAwMDAwMDAwIC0gU0RDRTMvU3luY0Jvb3QiCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIEVQOTN4eCBib2FyZHMgd2l0aCB0aGUKLQkgIGZpcnN0IFNEUkFNIGJhbmsgYXQgMHgwMDAwMDAwMAorCSAgZmlyc3QgU0RSQU0gYmFuayBhdCAweDAwMDAwMDAwLgogCiBjb25maWcgRVA5M1hYX1NEQ0UwX1BIWVNfT0ZGU0VUCiAJYm9vbCAiMHhjMDAwMDAwMCAtIFNEQ0VPIgogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBFUDkzeHggYm9hcmRzIHdpdGggdGhlCi0JICBmaXJzdCBTRFJBTSBiYW5rIGF0IDB4YzAwMDAwMDAKKwkgIGZpcnN0IFNEUkFNIGJhbmsgYXQgMHhjMDAwMDAwMC4KKworY29uZmlnIEVQOTNYWF9TRENFMV9QSFlTX09GRlNFVAorCWJvb2wgIjB4ZDAwMDAwMDAgLSBTRENFMSIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgRVA5M3h4IGJvYXJkcyB3aXRoIHRoZQorCSAgZmlyc3QgU0RSQU0gYmFuayBhdCAweGQwMDAwMDAwLgorCitjb25maWcgRVA5M1hYX1NEQ0UyX1BIWVNfT0ZGU0VUCisJYm9vbCAiMHhlMDAwMDAwMCAtIFNEQ0UyIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBFUDkzeHggYm9hcmRzIHdpdGggdGhlCisJICBmaXJzdCBTRFJBTSBiYW5rIGF0IDB4ZTAwMDAwMDAuCisKK2NvbmZpZyBFUDkzWFhfU0RDRTNfQVNZTkNfUEhZU19PRkZTRVQKKwlib29sICIweGYwMDAwMDAwIC0gU0RDRTMvQXN5bmNCb290IgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBFUDkzeHggYm9hcmRzIHdpdGggdGhlCisJICBmaXJzdCBTRFJBTSBiYW5rIGF0IDB4ZjAwMDAwMDAuCiAKIGVuZGNob2ljZQogCkBAIC0xMTIsMjggKzEzMCwzNiBAQAogCWJvb2wKIAogY29uZmlnIE1BQ0hfTUlDUk85SAotCWJvb2wgIlN1cHBvcnQgQ29udGVjIEh5cGVyY29udHJvbCBNaWNybzktSCIKKwlib29sICJTdXBwb3J0IENvbnRlYyBNaWNybzktSGlnaCIKIAlkZXBlbmRzIG9uIEVQOTNYWF9TRENFM19TWU5DX1BIWVNfT0ZGU0VUCiAJc2VsZWN0IE1BQ0hfTUlDUk85CiAJaGVscAogCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCi0JICBDb250ZWMgSHlwZXJjb250cm9sIE1pY3JvOS1IIGJvYXJkLgorCSAgQ29udGVjIE1pY3JvOS1IaWdoIGJvYXJkLgogCiBjb25maWcgTUFDSF9NSUNSTzlNCi0JYm9vbCAiU3VwcG9ydCBDb250ZWMgSHlwZXJjb250cm9sIE1pY3JvOS1NIgotCWRlcGVuZHMgb24gRVA5M1hYX1NEQ0UzX1NZTkNfUEhZU19PRkZTRVQKKwlib29sICJTdXBwb3J0IENvbnRlYyBNaWNybzktTWlkIgorCWRlcGVuZHMgb24gRVA5M1hYX1NEQ0UzX0FTWU5DX1BIWVNfT0ZGU0VUCiAJc2VsZWN0IE1BQ0hfTUlDUk85CiAJaGVscAogCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCi0JICBDb250ZWMgSHlwZXJjb250cm9sIE1pY3JvOS1NIGJvYXJkLgorCSAgQ29udGVjIE1pY3JvOS1NaWQgYm9hcmQuCiAKIGNvbmZpZyBNQUNIX01JQ1JPOUwKLQlib29sICJTdXBwb3J0IENvbnRlYyBIeXBlcmNvbnRyb2wgTWljcm85LUwiCisJYm9vbCAiU3VwcG9ydCBDb250ZWMgTWljcm85LUxpdGUiCiAJZGVwZW5kcyBvbiBFUDkzWFhfU0RDRTNfU1lOQ19QSFlTX09GRlNFVAogCXNlbGVjdCBNQUNIX01JQ1JPOQogCWhlbHAKIAkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IHRoZQotCSAgQ29udGVjIEh5cGVyY29udHJvbCBNaWNybzktTCBib2FyZC4KKwkgIENvbnRlYyBNaWNybzktTGl0ZSBib2FyZC4KKworY29uZmlnIE1BQ0hfTUlDUk85UworCWJvb2wgIlN1cHBvcnQgQ29udGVjIE1pY3JvOS1TbGltIgorCWRlcGVuZHMgb24gRVA5M1hYX1NEQ0UzX0FTWU5DX1BIWVNfT0ZGU0VUCisJc2VsZWN0IE1BQ0hfTUlDUk85CisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCisJICBDb250ZWMgTWljcm85LVNsaW0gYm9hcmQuCiAKIGNvbmZpZyBNQUNIX1RTNzJYWAogCWJvb2wgIlN1cHBvcnQgVGVjaG5vbG9naWMgU3lzdGVtcyBUUy03Mnh4IFNCQyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9NYWtlZmlsZS5ib290CmluZGV4IDI3YTA4NWEuLjBhZDMzZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlLmJvb3QKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUuYm9vdApAQCAtMywzICszLDEyIEBACiAKICAgIHpyZWxhZGRyLSQoQ09ORklHX0VQOTNYWF9TRENFMF9QSFlTX09GRlNFVCkJCTo9IDB4YzAwMDgwMDAKIHBhcmFtc19waHlzLSQoQ09ORklHX0VQOTNYWF9TRENFMF9QSFlTX09GRlNFVCkJCTo9IDB4YzAwMDAxMDAKKworICAgenJlbGFkZHItJChDT05GSUdfRVA5M1hYX1NEQ0UxX1BIWVNfT0ZGU0VUKQkJOj0gMHhkMDAwODAwMAorcGFyYW1zX3BoeXMtJChDT05GSUdfRVA5M1hYX1NEQ0UxX1BIWVNfT0ZGU0VUKQkJOj0gMHhkMDAwMDEwMAorCisgICB6cmVsYWRkci0kKENPTkZJR19FUDkzWFhfU0RDRTJfUEhZU19PRkZTRVQpCQk6PSAweGUwMDA4MDAwCitwYXJhbXNfcGh5cy0kKENPTkZJR19FUDkzWFhfU0RDRTJfUEhZU19PRkZTRVQpCQk6PSAweGUwMDAwMTAwCisKKyAgIHpyZWxhZGRyLSQoQ09ORklHX0VQOTNYWF9TRENFM19BU1lOQ19QSFlTX09GRlNFVCkJOj0gMHhmMDAwODAwMAorcGFyYW1zX3BoeXMtJChDT05GSUdfRVA5M1hYX1NEQ0UzX0FTWU5DX1BIWVNfT0ZGU0VUKQk6PSAweGYwMDAwMTAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYwppbmRleCBkZGExOWNkNy4uMWQwZjlkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jbG9jay5jCkBAIC0xNiwxMyArMTYsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAKIHN0cnVjdCBjbGsgeworCXN0cnVjdCBjbGsJKnBhcmVudDsKIAl1bnNpZ25lZCBsb25nCXJhdGU7CiAJaW50CQl1c2VyczsKIAlpbnQJCXN3X2xvY2tlZDsKQEAgLTM5LDQwICs0Miw2MCBAQAogc3RhdGljIGludCBzZXRfa2V5dGNoY2xrX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwogc3RhdGljIGludCBzZXRfZGl2X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwogCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa194dGFsaSA9IHsKKwkucmF0ZQkJPSBFUDkzWFhfRVhUX0NMS19SQVRFLAorfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa191YXJ0MSA9IHsKKwkucGFyZW50CQk9ICZjbGtfeHRhbGksCiAJLnN3X2xvY2tlZAk9IDEsCiAJLmVuYWJsZV9yZWcJPSBFUDkzWFhfU1lTQ09OX0RFVkNGRywKIAkuZW5hYmxlX21hc2sJPSBFUDkzWFhfU1lTQ09OX0RFVkNGR19VMUVOLAogCS5nZXRfcmF0ZQk9IGdldF91YXJ0X3JhdGUsCiB9Owogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3VhcnQyID0geworCS5wYXJlbnQJCT0gJmNsa194dGFsaSwKIAkuc3dfbG9ja2VkCT0gMSwKIAkuZW5hYmxlX3JlZwk9IEVQOTNYWF9TWVNDT05fREVWQ0ZHLAogCS5lbmFibGVfbWFzawk9IEVQOTNYWF9TWVNDT05fREVWQ0ZHX1UyRU4sCiAJLmdldF9yYXRlCT0gZ2V0X3VhcnRfcmF0ZSwKIH07CiBzdGF0aWMgc3RydWN0IGNsayBjbGtfdWFydDMgPSB7CisJLnBhcmVudAkJPSAmY2xrX3h0YWxpLAogCS5zd19sb2NrZWQJPSAxLAogCS5lbmFibGVfcmVnCT0gRVA5M1hYX1NZU0NPTl9ERVZDRkcsCiAJLmVuYWJsZV9tYXNrCT0gRVA5M1hYX1NZU0NPTl9ERVZDRkdfVTNFTiwKIAkuZ2V0X3JhdGUJPSBnZXRfdWFydF9yYXRlLAogfTsKLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wbGwxOwotc3RhdGljIHN0cnVjdCBjbGsgY2xrX2Y7Ci1zdGF0aWMgc3RydWN0IGNsayBjbGtfaDsKLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wOwotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3BsbDI7CitzdGF0aWMgc3RydWN0IGNsayBjbGtfcGxsMSA9IHsKKwkucGFyZW50CQk9ICZjbGtfeHRhbGksCit9Oworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2YgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BsbDEsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2ggPSB7CisJLnBhcmVudAkJPSAmY2xrX3BsbDEsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3AgPSB7CisJLnBhcmVudAkJPSAmY2xrX3BsbDEsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3BsbDIgPSB7CisJLnBhcmVudAkJPSAmY2xrX3h0YWxpLAorfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa191c2JfaG9zdCA9IHsKKwkucGFyZW50CQk9ICZjbGtfcGxsMiwKIAkuZW5hYmxlX3JlZwk9IEVQOTNYWF9TWVNDT05fUFdSQ05ULAogCS5lbmFibGVfbWFzawk9IEVQOTNYWF9TWVNDT05fUFdSQ05UX1VTSF9FTiwKIH07CiBzdGF0aWMgc3RydWN0IGNsayBjbGtfa2V5cGFkID0geworCS5wYXJlbnQJCT0gJmNsa194dGFsaSwKIAkuc3dfbG9ja2VkCT0gMSwKIAkuZW5hYmxlX3JlZwk9IEVQOTNYWF9TWVNDT05fS0VZVENIQ0xLRElWLAogCS5lbmFibGVfbWFzawk9IEVQOTNYWF9TWVNDT05fS0VZVENIQ0xLRElWX0tFTiwKIAkuc2V0X3JhdGUJPSBzZXRfa2V5dGNoY2xrX3JhdGUsCiB9Owogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3B3bSA9IHsKKwkucGFyZW50CQk9ICZjbGtfeHRhbGksCiAJLnJhdGUJCT0gRVA5M1hYX0VYVF9DTEtfUkFURSwKIH07CiAKQEAgLTg1LDUwICsxMDgsNjIgQEAKIAogLyogRE1BIENsb2NrcyAqLwogc3RhdGljIHN0cnVjdCBjbGsgY2xrX20ycDAgPSB7CisJLnBhcmVudAkJPSAmY2xrX2gsCiAJLmVuYWJsZV9yZWcJPSBFUDkzWFhfU1lTQ09OX1BXUkNOVCwKIAkuZW5hYmxlX21hc2sJPSBFUDkzWFhfU1lTQ09OX1BXUkNOVF9ETUFfTTJQMCwKIH07CiBzdGF0aWMgc3RydWN0IGNsayBjbGtfbTJwMSA9IHsKKwkucGFyZW50CQk9ICZjbGtfaCwKIAkuZW5hYmxlX3JlZwk9IEVQOTNYWF9TWVNDT05fUFdSQ05ULAogCS5lbmFibGVfbWFzawk9IEVQOTNYWF9TWVNDT05fUFdSQ05UX0RNQV9NMlAxLAogfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19tMnAyID0geworCS5wYXJlbnQJCT0gJmNsa19oLAogCS5lbmFibGVfcmVnCT0gRVA5M1hYX1NZU0NPTl9QV1JDTlQsCiAJLmVuYWJsZV9tYXNrCT0gRVA5M1hYX1NZU0NPTl9QV1JDTlRfRE1BX00yUDIsCiB9Owogc3RhdGljIHN0cnVjdCBjbGsgY2xrX20ycDMgPSB7CisJLnBhcmVudAkJPSAmY2xrX2gsCiAJLmVuYWJsZV9yZWcJPSBFUDkzWFhfU1lTQ09OX1BXUkNOVCwKIAkuZW5hYmxlX21hc2sJPSBFUDkzWFhfU1lTQ09OX1BXUkNOVF9ETUFfTTJQMywKIH07CiBzdGF0aWMgc3RydWN0IGNsayBjbGtfbTJwNCA9IHsKKwkucGFyZW50CQk9ICZjbGtfaCwKIAkuZW5hYmxlX3JlZwk9IEVQOTNYWF9TWVNDT05fUFdSQ05ULAogCS5lbmFibGVfbWFzawk9IEVQOTNYWF9TWVNDT05fUFdSQ05UX0RNQV9NMlA0LAogfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19tMnA1ID0geworCS5wYXJlbnQJCT0gJmNsa19oLAogCS5lbmFibGVfcmVnCT0gRVA5M1hYX1NZU0NPTl9QV1JDTlQsCiAJLmVuYWJsZV9tYXNrCT0gRVA5M1hYX1NZU0NPTl9QV1JDTlRfRE1BX00yUDUsCiB9Owogc3RhdGljIHN0cnVjdCBjbGsgY2xrX20ycDYgPSB7CisJLnBhcmVudAkJPSAmY2xrX2gsCiAJLmVuYWJsZV9yZWcJPSBFUDkzWFhfU1lTQ09OX1BXUkNOVCwKIAkuZW5hYmxlX21hc2sJPSBFUDkzWFhfU1lTQ09OX1BXUkNOVF9ETUFfTTJQNiwKIH07CiBzdGF0aWMgc3RydWN0IGNsayBjbGtfbTJwNyA9IHsKKwkucGFyZW50CQk9ICZjbGtfaCwKIAkuZW5hYmxlX3JlZwk9IEVQOTNYWF9TWVNDT05fUFdSQ05ULAogCS5lbmFibGVfbWFzawk9IEVQOTNYWF9TWVNDT05fUFdSQ05UX0RNQV9NMlA3LAogfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19tMnA4ID0geworCS5wYXJlbnQJCT0gJmNsa19oLAogCS5lbmFibGVfcmVnCT0gRVA5M1hYX1NZU0NPTl9QV1JDTlQsCiAJLmVuYWJsZV9tYXNrCT0gRVA5M1hYX1NZU0NPTl9QV1JDTlRfRE1BX00yUDgsCiB9Owogc3RhdGljIHN0cnVjdCBjbGsgY2xrX20ycDkgPSB7CisJLnBhcmVudAkJPSAmY2xrX2gsCiAJLmVuYWJsZV9yZWcJPSBFUDkzWFhfU1lTQ09OX1BXUkNOVCwKIAkuZW5hYmxlX21hc2sJPSBFUDkzWFhfU1lTQ09OX1BXUkNOVF9ETUFfTTJQOSwKIH07CiBzdGF0aWMgc3RydWN0IGNsayBjbGtfbTJtMCA9IHsKKwkucGFyZW50CQk9ICZjbGtfaCwKIAkuZW5hYmxlX3JlZwk9IEVQOTNYWF9TWVNDT05fUFdSQ05ULAogCS5lbmFibGVfbWFzawk9IEVQOTNYWF9TWVNDT05fUFdSQ05UX0RNQV9NMk0wLAogfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19tMm0xID0geworCS5wYXJlbnQJCT0gJmNsa19oLAogCS5lbmFibGVfcmVnCT0gRVA5M1hYX1NZU0NPTl9QV1JDTlQsCiAJLmVuYWJsZV9tYXNrCT0gRVA5M1hYX1NZU0NPTl9QV1JDTlRfRE1BX00yTTEsCiB9OwpAQCAtMTM3LDYgKzE3Miw3IEBACiAJeyAuZGV2X2lkID0gZGV2LCAuY29uX2lkID0gY29uLCAuY2xrID0gY2sgfQogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgY2xvY2tzW10gPSB7CisJSU5JVF9DSyhOVUxMLAkJCSJ4dGFsaSIsCSZjbGtfeHRhbGkpLAogCUlOSVRfQ0soImFwYjp1YXJ0MSIsCQlOVUxMLAkJJmNsa191YXJ0MSksCiAJSU5JVF9DSygiYXBiOnVhcnQyIiwJCU5VTEwsCQkmY2xrX3VhcnQyKSwKIAlJTklUX0NLKCJhcGI6dWFydDMiLAkJTlVMTCwJCSZjbGtfdWFydDMpLApAQCAtMTYzLDQ4ICsxOTksODQgQEAKIAlJTklUX0NLKE5VTEwsCQkJIm0ybTEiLAkJJmNsa19tMm0xKSwKIH07CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xrX2xvY2spOworCitzdGF0aWMgdm9pZCBfX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCWlmICghY2xrLT51c2VycysrKSB7CisJCWlmIChjbGstPnBhcmVudCkKKwkJCV9fY2xrX2VuYWJsZShjbGstPnBhcmVudCk7CisKKwkJaWYgKGNsay0+ZW5hYmxlX3JlZykgeworCQkJdTMyIHY7CisKKwkJCXYgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQkJdiB8PSBjbGstPmVuYWJsZV9tYXNrOworCQkJaWYgKGNsay0+c3dfbG9ja2VkKQorCQkJCWVwOTN4eF9zeXNjb25fc3dsb2NrZWRfd3JpdGUodiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJCWVsc2UKKwkJCQlfX3Jhd193cml0ZWwodiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfQorCX0KK30KIAogaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQogewotCWlmICghY2xrLT51c2VycysrICYmIGNsay0+ZW5hYmxlX3JlZykgewotCQl1MzIgdmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQl2YWx1ZSA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7Ci0JCXZhbHVlIHw9IGNsay0+ZW5hYmxlX21hc2s7Ci0JCWlmIChjbGstPnN3X2xvY2tlZCkKLQkJCWVwOTN4eF9zeXNjb25fc3dsb2NrZWRfd3JpdGUodmFsdWUsIGNsay0+ZW5hYmxlX3JlZyk7Ci0JCWVsc2UKLQkJCV9fcmF3X3dyaXRlbCh2YWx1ZSwgY2xrLT5lbmFibGVfcmVnKTsKLQl9CisJaWYgKCFjbGspCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsa19sb2NrLCBmbGFncyk7CisJX19jbGtfZW5hYmxlKGNsayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xrX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKIAorc3RhdGljIHZvaWQgX19jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaWYgKCEtLWNsay0+dXNlcnMpIHsKKwkJaWYgKGNsay0+ZW5hYmxlX3JlZykgeworCQkJdTMyIHY7CisKKwkJCXYgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQkJdiAmPSB+Y2xrLT5lbmFibGVfbWFzazsKKwkJCWlmIChjbGstPnN3X2xvY2tlZCkKKwkJCQllcDkzeHhfc3lzY29uX3N3bG9ja2VkX3dyaXRlKHYsIGNsay0+ZW5hYmxlX3JlZyk7CisJCQllbHNlCisJCQkJX19yYXdfd3JpdGVsKHYsIGNsay0+ZW5hYmxlX3JlZyk7CisJCX0KKworCQlpZiAoY2xrLT5wYXJlbnQpCisJCQlfX2Nsa19kaXNhYmxlKGNsay0+cGFyZW50KTsKKwl9Cit9CisKIHZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQogewotCWlmICghLS1jbGstPnVzZXJzICYmIGNsay0+ZW5hYmxlX3JlZykgewotCQl1MzIgdmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQl2YWx1ZSA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7Ci0JCXZhbHVlICY9IH5jbGstPmVuYWJsZV9tYXNrOwotCQlpZiAoY2xrLT5zd19sb2NrZWQpCi0JCQllcDkzeHhfc3lzY29uX3N3bG9ja2VkX3dyaXRlKHZhbHVlLCBjbGstPmVuYWJsZV9yZWcpOwotCQllbHNlCi0JCQlfX3Jhd193cml0ZWwodmFsdWUsIGNsay0+ZW5hYmxlX3JlZyk7Ci0JfQorCWlmICghY2xrKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xrX2xvY2ssIGZsYWdzKTsKKwlfX2Nsa19kaXNhYmxlKGNsayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xrX2xvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfdWFydF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKIHsKKwl1bnNpZ25lZCBsb25nIHJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwogCXUzMiB2YWx1ZTsKIAogCXZhbHVlID0gX19yYXdfcmVhZGwoRVA5M1hYX1NZU0NPTl9QV1JDTlQpOwogCWlmICh2YWx1ZSAmIEVQOTNYWF9TWVNDT05fUFdSQ05UX1VBUlRCQVVEKQotCQlyZXR1cm4gRVA5M1hYX0VYVF9DTEtfUkFURTsKKwkJcmV0dXJuIHJhdGU7CiAJZWxzZQotCQlyZXR1cm4gRVA5M1hYX0VYVF9DTEtfUkFURSAvIDI7CisJCXJldHVybiByYXRlIC8gMjsKIH0KIAogdW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQpAQCAtMjQ0LDE2ICszMTYsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY19jbGtfZGl2KHVuc2lnbmVkIGxvbmcgcmF0ZSwgaW50ICpwc2VsLCBpbnQgKmVzZWwsCi0JCQkJICBpbnQgKnBkaXYsIGludCAqZGl2KQorc3RhdGljIGludCBjYWxjX2Nsa19kaXYoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUsCisJCQlpbnQgKnBzZWwsIGludCAqZXNlbCwgaW50ICpwZGl2LCBpbnQgKmRpdikKIHsKLQl1bnNpZ25lZCBsb25nIG1heF9yYXRlLCBiZXN0X3JhdGUgPSAwLAotCQlhY3R1YWxfcmF0ZSA9IDAsIG1jbGtfcmF0ZSA9IDAsIHJhdGVfZXJyID0gLTE7CisJc3RydWN0IGNsayAqbWNsazsKKwl1bnNpZ25lZCBsb25nIG1heF9yYXRlLCBhY3R1YWxfcmF0ZSwgbWNsa19yYXRlLCByYXRlX2VyciA9IC0xOwogCWludCBpLCBmb3VuZCA9IDAsIF9fZGl2ID0gMCwgX19wZGl2ID0gMDsKIAogCS8qIERvbid0IGV4Y2VlZCB0aGUgbWF4aW11bSByYXRlICovCiAJbWF4X3JhdGUgPSBtYXgobWF4KGNsa19wbGwxLnJhdGUgLyA0LCBjbGtfcGxsMi5yYXRlIC8gNCksCi0JCSAgICAgICAodW5zaWduZWQgbG9uZylFUDkzWFhfRVhUX0NMS19SQVRFIC8gNCk7CisJCSAgICAgICBjbGtfeHRhbGkucmF0ZSAvIDQpOwogCXJhdGUgPSBtaW4ocmF0ZSwgbWF4X3JhdGUpOwogCiAJLyoKQEAgLTI2NywxMSArMzM5LDEyIEBACiAJICovCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlpZiAoaSA9PSAwKQotCQkJbWNsa19yYXRlID0gRVA5M1hYX0VYVF9DTEtfUkFURSAqIDI7CisJCQltY2xrID0gJmNsa194dGFsaTsKIAkJZWxzZSBpZiAoaSA9PSAxKQotCQkJbWNsa19yYXRlID0gY2xrX3BsbDEucmF0ZSAqIDI7Ci0JCWVsc2UgaWYgKGkgPT0gMikKLQkJCW1jbGtfcmF0ZSA9IGNsa19wbGwyLnJhdGUgKiAyOworCQkJbWNsayA9ICZjbGtfcGxsMTsKKwkJZWxzZQorCQkJbWNsayA9ICZjbGtfcGxsMjsKKwkJbWNsa19yYXRlID0gbWNsay0+cmF0ZSAqIDI7CiAKIAkJLyogVHJ5IGVhY2ggcHJlZGl2aWRlciB2YWx1ZSAqLwogCQlmb3IgKF9fcGRpdiA9IDQ7IF9fcGRpdiA8PSA2OyBfX3BkaXYrKykgewpAQCAtMjg2LDcgKzM1OSw4IEBACiAJCQkJKmRpdiA9IF9fZGl2OwogCQkJCSpwc2VsID0gKGkgPT0gMik7CiAJCQkJKmVzZWwgPSAoaSAhPSAwKTsKLQkJCQliZXN0X3JhdGUgPSBhY3R1YWxfcmF0ZTsKKwkJCQljbGstPnBhcmVudCA9IG1jbGs7CisJCQkJY2xrLT5yYXRlID0gYWN0dWFsX3JhdGU7CiAJCQkJcmF0ZV9lcnIgPSBhYnMoYWN0dWFsX3JhdGUgLSByYXRlKTsKIAkJCQlmb3VuZCA9IDE7CiAJCQl9CkBAIC0yOTQsMjEgKzM2OCwxOSBAQAogCX0KIAogCWlmICghZm91bmQpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBiZXN0X3JhdGU7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2V0X2Rpdl9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQogewotCXVuc2lnbmVkIGxvbmcgYWN0dWFsX3JhdGU7Ci0JaW50IHBzZWwgPSAwLCBlc2VsID0gMCwgcGRpdiA9IDAsIGRpdiA9IDA7CisJaW50IGVyciwgcHNlbCA9IDAsIGVzZWwgPSAwLCBwZGl2ID0gMCwgZGl2ID0gMDsKIAl1MzIgdmFsOwogCi0JYWN0dWFsX3JhdGUgPSBjYWxjX2Nsa19kaXYocmF0ZSwgJnBzZWwsICZlc2VsLCAmcGRpdiwgJmRpdik7Ci0JaWYgKGFjdHVhbF9yYXRlID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWNsay0+cmF0ZSA9IGFjdHVhbF9yYXRlOworCWVyciA9IGNhbGNfY2xrX2RpdihjbGssIHJhdGUsICZwc2VsLCAmZXNlbCwgJnBkaXYsICZkaXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAkvKiBDbGVhciB0aGUgZXNlbCwgcHNlbCwgcGRpdiBhbmQgZGl2IGJpdHMgKi8KIAl2YWwgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOwpAQCAtMzQ0LDcgKzQxNiw3IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIHJhdGU7CiAJaW50IGk7CiAKLQlyYXRlID0gRVA5M1hYX0VYVF9DTEtfUkFURTsKKwlyYXRlID0gY2xrX3h0YWxpLnJhdGU7CiAJcmF0ZSAqPSAoKGNvbmZpZ193b3JkID4+IDExKSAmIDB4MWYpICsgMTsJCS8qIFgxRkJEICovCiAJcmF0ZSAqPSAoKGNvbmZpZ193b3JkID4+IDUpICYgMHgzZikgKyAxOwkJLyogWDJGQkQgKi8KIAlkb19kaXYocmF0ZSwgKGNvbmZpZ193b3JkICYgMHgxZikgKyAxKTsJCQkvKiBYMklQRCAqLwpAQCAtMzc3LDcgKzQ0OSw3IEBACiAKIAl2YWx1ZSA9IF9fcmF3X3JlYWRsKEVQOTNYWF9TWVNDT05fQ0xPQ0tfU0VUMSk7CiAJaWYgKCEodmFsdWUgJiAweDAwODAwMDAwKSkgewkJCS8qIFBMTDEgYnlwYXNzZWQ/ICAqLwotCQljbGtfcGxsMS5yYXRlID0gRVA5M1hYX0VYVF9DTEtfUkFURTsKKwkJY2xrX3BsbDEucmF0ZSA9IGNsa194dGFsaS5yYXRlOwogCX0gZWxzZSB7CiAJCWNsa19wbGwxLnJhdGUgPSBjYWxjX3BsbF9yYXRlKHZhbHVlKTsKIAl9CkBAIC0zODgsNyArNDYwLDcgQEAKIAogCXZhbHVlID0gX19yYXdfcmVhZGwoRVA5M1hYX1NZU0NPTl9DTE9DS19TRVQyKTsKIAlpZiAoISh2YWx1ZSAmIDB4MDAwODAwMDApKSB7CQkJLyogUExMMiBieXBhc3NlZD8gICovCi0JCWNsa19wbGwyLnJhdGUgPSBFUDkzWFhfRVhUX0NMS19SQVRFOworCQljbGtfcGxsMi5yYXRlID0gY2xrX3h0YWxpLnJhdGU7CiAJfSBlbHNlIGlmICh2YWx1ZSAmIDB4MDAwNDAwMDApIHsJCS8qIFBMTDIgZW5hYmxlZD8gICovCiAJCWNsa19wbGwyLnJhdGUgPSBjYWxjX3BsbF9yYXRlKHZhbHVlKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCmluZGV4IGY3ZWJlZDkuLmI0MzU3YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKQEAgLTIwNiw3ICsyMDYsNiBAQAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJaWYgKHN0YXR1cyAmICgxIDw8IGkpKSB7CiAJCQlpbnQgZ3Bpb19pcnEgPSBncGlvX3RvX2lycShFUDkzWFhfR1BJT19MSU5FX0IoMCkpICsgaTsKLQkJCWRlc2MgPSBpcnFfZGVzYyArIGdwaW9faXJxOwogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGdwaW9faXJxKTsKIAkJfQogCX0KQEAgLTU1MCwxMyArNTQ5LDExIEBACiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlcDkzeHhfZXRoX2RldmljZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YSBlcDkzeHhfaTJjX2RhdGEgPSB7Ci0JLnNkYV9waW4JCT0gRVA5M1hYX0dQSU9fTElORV9FRURBVCwKLQkuc2RhX2lzX29wZW5fZHJhaW4JPSAwLAotCS5zY2xfcGluCQk9IEVQOTNYWF9HUElPX0xJTkVfRUVDTEssCi0JLnNjbF9pc19vcGVuX2RyYWluCT0gMCwKLQkudWRlbGF5CQkJPSAyLAotfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVQOTN4eCBpMmMgcGVyaXBoZXJhbCBoYW5kbGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGkyY19ncGlvX3BsYXRmb3JtX2RhdGEgZXA5M3h4X2kyY19kYXRhOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlcDkzeHhfaTJjX2RldmljZSA9IHsKIAkubmFtZQkJCT0gImkyYy1ncGlvIiwKQEAgLTU2NCw4ICs1NjEsMjUgQEAKIAkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmZXA5M3h4X2kyY19kYXRhLAogfTsKIAotdm9pZCBfX2luaXQgZXA5M3h4X3JlZ2lzdGVyX2kyYyhzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmRldmljZXMsIGludCBudW0pCit2b2lkIF9faW5pdCBlcDkzeHhfcmVnaXN0ZXJfaTJjKHN0cnVjdCBpMmNfZ3Bpb19wbGF0Zm9ybV9kYXRhICpkYXRhLAorCQkJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqZGV2aWNlcywgaW50IG51bSkKIHsKKwkvKgorCSAqIFNldCB0aGUgRUVQUk9NIGludGVyZmFjZSBwaW4gZHJpdmUgdHlwZSBjb250cm9sLgorCSAqIERlZmluZXMgdGhlIGRyaXZlciB0eXBlIGZvciB0aGUgRUVDTEsgYW5kIEVFREFUIHBpbnMgYXMgZWl0aGVyCisJICogb3BlbiBkcmFpbiwgd2hpY2ggd2lsbCByZXF1aXJlIGFuIGV4dGVybmFsIHB1bGwtdXAsIG9yIGEgbm9ybWFsCisJICogQ01PUyBkcml2ZXIuCisJICovCisJaWYgKGRhdGEtPnNkYV9pc19vcGVuX2RyYWluICYmIGRhdGEtPnNkYV9waW4gIT0gRVA5M1hYX0dQSU9fTElORV9FRURBVCkKKwkJcHJfd2FybmluZygiZXA5M3h4OiBzZGEgIT0gRUVEQVQsIG9wZW4gZHJhaW4gaGFzIG5vIGVmZmVjdFxuIik7CisJaWYgKGRhdGEtPnNjbF9pc19vcGVuX2RyYWluICYmIGRhdGEtPnNjbF9waW4gIT0gRVA5M1hYX0dQSU9fTElORV9FRUNMSykKKwkJcHJfd2FybmluZygiZXA5M3h4OiBzY2wgIT0gRUVDTEssIG9wZW4gZHJhaW4gaGFzIG5vIGVmZmVjdFxuIik7CisKKwlfX3Jhd193cml0ZWwoKGRhdGEtPnNkYV9pc19vcGVuX2RyYWluIDw8IDEpIHwKKwkJICAgICAoZGF0YS0+c2NsX2lzX29wZW5fZHJhaW4gPDwgMCksCisJCSAgICAgRVA5M1hYX0dQSU9fRUVEUklWRSk7CisKKwllcDkzeHhfaTJjX2RhdGEgPSAqZGF0YTsKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBkZXZpY2VzLCBudW0pOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZXA5M3h4X2kyY19kZXZpY2UpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTN4eC5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTN4eC5jCmluZGV4IDczMTQ1YWUuLmE0YTdiZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzeHguYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5M3h4LmMKQEAgLTI3LDggKzI3LDEwIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKQEAgLTc2LDEzICs3OCwyNiBAQAogCS5waHlfaWQJCT0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBlZGI5M3h4YV9pMmNfZGF0YVtdID0geworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRURCOTN4eCBpMmMgcGVyaXBoZXJhbCBoYW5kbGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGkyY19ncGlvX3BsYXRmb3JtX2RhdGEgZWRiOTN4eF9pMmNfZ3Bpb19kYXRhID0geworCS5zZGFfcGluCQk9IEVQOTNYWF9HUElPX0xJTkVfRUVEQVQsCisJLnNkYV9pc19vcGVuX2RyYWluCT0gMCwKKwkuc2NsX3BpbgkJPSBFUDkzWFhfR1BJT19MSU5FX0VFQ0xLLAorCS5zY2xfaXNfb3Blbl9kcmFpbgk9IDAsCisJLnVkZWxheQkJCT0gMCwJLyogZGVmYXVsdCB0byAxMDAga0h6ICovCisJLnRpbWVvdXQJCT0gMCwJLyogZGVmYXVsdCB0byAxMDAgbXMgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBlZGI5M3h4YV9pMmNfYm9hcmRfaW5mb1tdID0gewogCXsKIAkJSTJDX0JPQVJEX0lORk8oImlzbDEyMDgiLCAweDZmKSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGVkYjkzeHhfaTJjX2RhdGFbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBlZGI5M3h4X2kyY19ib2FyZF9pbmZvW10gPSB7CiAJewogCQlJMkNfQk9BUkRfSU5GTygiZHMxMzM3IiwgMHg2OCksCiAJfSwKQEAgLTkyLDEyICsxMDcsMTQgQEAKIHsKIAlpZiAobWFjaGluZV9pc19lZGI5MzAyYSgpIHx8IG1hY2hpbmVfaXNfZWRiOTMwN2EoKSB8fAogCSAgICBtYWNoaW5lX2lzX2VkYjkzMTVhKCkpIHsKLQkJZXA5M3h4X3JlZ2lzdGVyX2kyYyhlZGI5M3h4YV9pMmNfZGF0YSwKLQkJCQlBUlJBWV9TSVpFKGVkYjkzeHhhX2kyY19kYXRhKSk7CisJCWVwOTN4eF9yZWdpc3Rlcl9pMmMoJmVkYjkzeHhfaTJjX2dwaW9fZGF0YSwKKwkJCQkgICAgZWRiOTN4eGFfaTJjX2JvYXJkX2luZm8sCisJCQkJICAgIEFSUkFZX1NJWkUoZWRiOTN4eGFfaTJjX2JvYXJkX2luZm8pKTsKIAl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfZWRiOTMwNygpIHx8IG1hY2hpbmVfaXNfZWRiOTMxMigpIHx8CiAJCSAgIG1hY2hpbmVfaXNfZWRiOTMxNSgpKSB7Ci0JCWVwOTN4eF9yZWdpc3Rlcl9pMmMoZWRiOTN4eF9pMmNfZGF0YSwKLQkJCQlBUlJBWV9TSVpFKGVkYjkzeHhfaTJjX2RhdGEpKTsKKwkJZXA5M3h4X3JlZ2lzdGVyX2kyYygmZWRiOTN4eF9pMmNfZ3Bpb19kYXRhLAorCQkJCSAgICBlZGI5M3h4X2kyY19ib2FyZF9pbmZvLAorCQkJCSAgICBBUlJBWV9TSVpFKGVkYjkzeHhfaTJjX2JvYXJkX2luZm8pKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9lcDkzeHgtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2VwOTN4eC1yZWdzLmgKaW5kZXggMGZiZjg3Yi4uYjFmOTM3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2VwOTN4eC1yZWdzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2VwOTN4eC1yZWdzLmgKQEAgLTUyLDI1ICs1MiwyNyBAQAogI2RlZmluZSBFUDkzWFhfQUhCX1ZJUlRfQkFTRQkJMHhmZWYwMDAwMAogI2RlZmluZSBFUDkzWFhfQUhCX1NJWkUJCQkweDAwMTAwMDAwCiAKKyNkZWZpbmUgRVA5M1hYX0FIQl9QSFlTKHgpCQkoRVA5M1hYX0FIQl9QSFlTX0JBU0UgKyAoeCkpCiAjZGVmaW5lIEVQOTNYWF9BSEJfSU9NRU0oeCkJCUlPTUVNKEVQOTNYWF9BSEJfVklSVF9CQVNFICsgKHgpKQogCiAjZGVmaW5lIEVQOTNYWF9BUEJfUEhZU19CQVNFCQkweDgwODAwMDAwCiAjZGVmaW5lIEVQOTNYWF9BUEJfVklSVF9CQVNFCQkweGZlZDAwMDAwCiAjZGVmaW5lIEVQOTNYWF9BUEJfU0laRQkJCTB4MDAyMDAwMDAKIAorI2RlZmluZSBFUDkzWFhfQVBCX1BIWVMoeCkJCShFUDkzWFhfQVBCX1BIWVNfQkFTRSArICh4KSkKICNkZWZpbmUgRVA5M1hYX0FQQl9JT01FTSh4KQkJSU9NRU0oRVA5M1hYX0FQQl9WSVJUX0JBU0UgKyAoeCkpCiAKIAogLyogQUhCIHBlcmlwaGVyYWxzICovCiAjZGVmaW5lIEVQOTNYWF9ETUFfQkFTRQkJCUVQOTNYWF9BSEJfSU9NRU0oMHgwMDAwMDAwMCkKIAotI2RlZmluZSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFCShFUDkzWFhfQUhCX1BIWVNfQkFTRSArIDB4MDAwMTAwMDApCisjZGVmaW5lIEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UJRVA5M1hYX0FIQl9QSFlTKDB4MDAwMTAwMDApCiAjZGVmaW5lIEVQOTNYWF9FVEhFUk5FVF9CQVNFCQlFUDkzWFhfQUhCX0lPTUVNKDB4MDAwMTAwMDApCiAKLSNkZWZpbmUgRVA5M1hYX1VTQl9QSFlTX0JBU0UJCShFUDkzWFhfQUhCX1BIWVNfQkFTRSArIDB4MDAwMjAwMDApCisjZGVmaW5lIEVQOTNYWF9VU0JfUEhZU19CQVNFCQlFUDkzWFhfQUhCX1BIWVMoMHgwMDAyMDAwMCkKICNkZWZpbmUgRVA5M1hYX1VTQl9CQVNFCQkJRVA5M1hYX0FIQl9JT01FTSgweDAwMDIwMDAwKQogCi0jZGVmaW5lIEVQOTNYWF9SQVNURVJfUEhZU19CQVNFCQkoRVA5M1hYX0FIQl9QSFlTX0JBU0UgKyAweDAwMDMwMDAwKQorI2RlZmluZSBFUDkzWFhfUkFTVEVSX1BIWVNfQkFTRQkJRVA5M1hYX0FIQl9QSFlTKDB4MDAwMzAwMDApCiAjZGVmaW5lIEVQOTNYWF9SQVNURVJfQkFTRQkJRVA5M1hYX0FIQl9JT01FTSgweDAwMDMwMDAwKQogCiAjZGVmaW5lIEVQOTNYWF9HUkFQSElDU19BQ0NFTF9CQVNFCUVQOTNYWF9BSEJfSU9NRU0oMHgwMDA0MDAwMCkKQEAgLTExMiwyMSArMTE0LDEwIEBACiAKICNkZWZpbmUgRVA5M1hYX0dQSU9fQkFTRQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMDQwMDAwKQogI2RlZmluZSBFUDkzWFhfR1BJT19SRUcoeCkJCShFUDkzWFhfR1BJT19CQVNFICsgKHgpKQotI2RlZmluZSBFUDkzWFhfR1BJT19GX0lOVF9UWVBFMQkJRVA5M1hYX0dQSU9fUkVHKDB4NGMpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0ZfSU5UX1RZUEUyCQlFUDkzWFhfR1BJT19SRUcoMHg1MCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fRl9JTlRfQUNLCQlFUDkzWFhfR1BJT19SRUcoMHg1NCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fRl9JTlRfRU5BQkxFCUVQOTNYWF9HUElPX1JFRygweDU4KQogI2RlZmluZSBFUDkzWFhfR1BJT19GX0lOVF9TVEFUVVMJRVA5M1hYX0dQSU9fUkVHKDB4NWMpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0FfSU5UX1RZUEUxCQlFUDkzWFhfR1BJT19SRUcoMHg5MCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fQV9JTlRfVFlQRTIJCUVQOTNYWF9HUElPX1JFRygweDk0KQotI2RlZmluZSBFUDkzWFhfR1BJT19BX0lOVF9BQ0sJCUVQOTNYWF9HUElPX1JFRygweDk4KQotI2RlZmluZSBFUDkzWFhfR1BJT19BX0lOVF9FTkFCTEUJRVA5M1hYX0dQSU9fUkVHKDB4OWMpCiAjZGVmaW5lIEVQOTNYWF9HUElPX0FfSU5UX1NUQVRVUwlFUDkzWFhfR1BJT19SRUcoMHhhMCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fQl9JTlRfVFlQRTEJCUVQOTNYWF9HUElPX1JFRygweGFjKQotI2RlZmluZSBFUDkzWFhfR1BJT19CX0lOVF9UWVBFMgkJRVA5M1hYX0dQSU9fUkVHKDB4YjApCi0jZGVmaW5lIEVQOTNYWF9HUElPX0JfSU5UX0FDSwkJRVA5M1hYX0dQSU9fUkVHKDB4YjQpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0JfSU5UX0VOQUJMRQlFUDkzWFhfR1BJT19SRUcoMHhiOCkKICNkZWZpbmUgRVA5M1hYX0dQSU9fQl9JTlRfU1RBVFVTCUVQOTNYWF9HUElPX1JFRygweGJjKQorI2RlZmluZSBFUDkzWFhfR1BJT19FRURSSVZFCQlFUDkzWFhfR1BJT19SRUcoMHhjOCkKIAogI2RlZmluZSBFUDkzWFhfQUFDX0JBU0UJCQlFUDkzWFhfQVBCX0lPTUVNKDB4MDAwODAwMDApCiAKQEAgLTEzNCwxMyArMTI1LDEzIEBACiAKICNkZWZpbmUgRVA5M1hYX0lSREFfQkFTRQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMGIwMDAwKQogCi0jZGVmaW5lIEVQOTNYWF9VQVJUMV9QSFlTX0JBU0UJCShFUDkzWFhfQVBCX1BIWVNfQkFTRSArIDB4MDAwYzAwMDApCisjZGVmaW5lIEVQOTNYWF9VQVJUMV9QSFlTX0JBU0UJCUVQOTNYWF9BUEJfUEhZUygweDAwMGMwMDAwKQogI2RlZmluZSBFUDkzWFhfVUFSVDFfQkFTRQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMGMwMDAwKQogCi0jZGVmaW5lIEVQOTNYWF9VQVJUMl9QSFlTX0JBU0UJCShFUDkzWFhfQVBCX1BIWVNfQkFTRSArIDB4MDAwZDAwMDApCisjZGVmaW5lIEVQOTNYWF9VQVJUMl9QSFlTX0JBU0UJCUVQOTNYWF9BUEJfUEhZUygweDAwMGQwMDAwKQogI2RlZmluZSBFUDkzWFhfVUFSVDJfQkFTRQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMGQwMDAwKQogCi0jZGVmaW5lIEVQOTNYWF9VQVJUM19QSFlTX0JBU0UJCShFUDkzWFhfQVBCX1BIWVNfQkFTRSArIDB4MDAwZTAwMDApCisjZGVmaW5lIEVQOTNYWF9VQVJUM19QSFlTX0JBU0UJCUVQOTNYWF9BUEJfUEhZUygweDAwMGUwMDAwKQogI2RlZmluZSBFUDkzWFhfVUFSVDNfQkFTRQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMGUwMDAwKQogCiAjZGVmaW5lIEVQOTNYWF9LRVlfTUFUUklYX0JBU0UJCUVQOTNYWF9BUEJfSU9NRU0oMHgwMDBmMDAwMCkKQEAgLTE0OCwxMCArMTM5LDEwIEBACiAjZGVmaW5lIEVQOTNYWF9BRENfQkFTRQkJCUVQOTNYWF9BUEJfSU9NRU0oMHgwMDEwMDAwMCkKICNkZWZpbmUgRVA5M1hYX1RPVUNIU0NSRUVOX0JBU0UJCUVQOTNYWF9BUEJfSU9NRU0oMHgwMDEwMDAwMCkKIAotI2RlZmluZSBFUDkzWFhfUFdNX1BIWVNfQkFTRQkJKEVQOTNYWF9BUEJfUEhZU19CQVNFICsgMHgwMDExMDAwMCkKKyNkZWZpbmUgRVA5M1hYX1BXTV9QSFlTX0JBU0UJCUVQOTNYWF9BUEJfUEhZUygweDAwMTEwMDAwKQogI2RlZmluZSBFUDkzWFhfUFdNX0JBU0UJCQlFUDkzWFhfQVBCX0lPTUVNKDB4MDAxMTAwMDApCiAKLSNkZWZpbmUgRVA5M1hYX1JUQ19QSFlTX0JBU0UJCShFUDkzWFhfQVBCX1BIWVNfQkFTRSArIDB4MDAxMjAwMDApCisjZGVmaW5lIEVQOTNYWF9SVENfUEhZU19CQVNFCQlFUDkzWFhfQVBCX1BIWVMoMHgwMDEyMDAwMCkKICNkZWZpbmUgRVA5M1hYX1JUQ19CQVNFCQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMTIwMDAwKQogCiAjZGVmaW5lIEVQOTNYWF9TWVNDT05fQkFTRQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMTMwMDAwKQpAQCAtMjE4LDYgKzIwOSwxNyBAQAogI2RlZmluZSBFUDkzWFhfU1lTQ09OX0tFWVRDSENMS0RJVl9BRElWCSgxPDwxNikKICNkZWZpbmUgRVA5M1hYX1NZU0NPTl9LRVlUQ0hDTEtESVZfS0VOCSgxPDwxNSkKICNkZWZpbmUgRVA5M1hYX1NZU0NPTl9LRVlUQ0hDTEtESVZfS0RJVgkoMTw8MCkKKyNkZWZpbmUgRVA5M1hYX1NZU0NPTl9TWVNDRkcJCUVQOTNYWF9TWVNDT05fUkVHKDB4OWMpCisjZGVmaW5lIEVQOTNYWF9TWVNDT05fU1lTQ0ZHX1JFVl9NQVNLCSgweGYwMDAwMDAwKQorI2RlZmluZSBFUDkzWFhfU1lTQ09OX1NZU0NGR19SRVZfU0hJRlQJKDI4KQorI2RlZmluZSBFUDkzWFhfU1lTQ09OX1NZU0NGR19TQk9PVAkoMTw8OCkKKyNkZWZpbmUgRVA5M1hYX1NZU0NPTl9TWVNDRkdfTENTTjcJKDE8PDcpCisjZGVmaW5lIEVQOTNYWF9TWVNDT05fU1lTQ0ZHX0xDU042CSgxPDw2KQorI2RlZmluZSBFUDkzWFhfU1lTQ09OX1NZU0NGR19MQVNETwkoMTw8NSkKKyNkZWZpbmUgRVA5M1hYX1NZU0NPTl9TWVNDRkdfTEVFREEJKDE8PDQpCisjZGVmaW5lIEVQOTNYWF9TWVNDT05fU1lTQ0ZHX0xFRUNMSwkoMTw8MykKKyNkZWZpbmUgRVA5M1hYX1NZU0NPTl9TWVNDRkdfTENTTjIJKDE8PDEpCisjZGVmaW5lIEVQOTNYWF9TWVNDT05fU1lTQ0ZHX0xDU04xCSgxPDwwKQogI2RlZmluZSBFUDkzWFhfU1lTQ09OX1NXTE9DSwkJRVA5M1hYX1NZU0NPTl9SRUcoMHhjMCkKIAogI2RlZmluZSBFUDkzWFhfV0FUQ0hET0dfQkFTRQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMTQwMDAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggMGExNDk4YS4uYzk5MWIxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xMTQsMTcgKzExNCw5IEBACiAgKiAgICAgICAgICBCMC4uQjcgICg3Li4xNSkgdG8gaXJxIDcyLi43OSwgYW5kCiAgKiAgICAgICAgICBGMC4uRjcgKDE2Li4yNCkgdG8gaXJxIDgwLi44Ny4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKLXsKLQlpZiAoZ3BpbyA8PSBFUDkzWFhfR1BJT19MSU5FX01BWF9JUlEpCi0JCXJldHVybiA2NCArIGdwaW87CisjZGVmaW5lIGdwaW9fdG9faXJxKGdwaW8pCVwKKwkoKChncGlvKSA8PSBFUDkzWFhfR1BJT19MSU5FX01BWF9JUlEpID8gKDY0ICsgKGdwaW8pKSA6IC1FSU5WQUwpCiAKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQotewotCXJldHVybiBpcnEgLSBncGlvX3RvX2lycSgwKTsKLX0KKyNkZWZpbmUgaXJxX3RvX2dwaW8oaXJxKQkoKGlycSkgLSBncGlvX3RvX2lycSgwKSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggOTI1YjEyZS4uNTU0MDY0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtOSw2ICs5LDEyIEBACiAjZGVmaW5lIFBIWVNfT0ZGU0VUCQlVTCgweDAwMDAwMDAwKQogI2VsaWYgZGVmaW5lZChDT05GSUdfRVA5M1hYX1NEQ0UwX1BIWVNfT0ZGU0VUKQogI2RlZmluZSBQSFlTX09GRlNFVAkJVUwoMHhjMDAwMDAwMCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0VQOTNYWF9TRENFMV9QSFlTX09GRlNFVCkKKyNkZWZpbmUgUEhZU19PRkZTRVQJCVVMKDB4ZDAwMDAwMDApCisjZWxpZiBkZWZpbmVkKENPTkZJR19FUDkzWFhfU0RDRTJfUEhZU19PRkZTRVQpCisjZGVmaW5lIFBIWVNfT0ZGU0VUCQlVTCgweGUwMDAwMDAwKQorI2VsaWYgZGVmaW5lZChDT05GSUdfRVA5M1hYX1NEQ0UzX0FTWU5DX1BIWVNfT0ZGU0VUKQorI2RlZmluZSBQSFlTX09GRlNFVAkJVUwoMHhmMDAwMDAwMCkKICNlbHNlCiAjZXJyb3IgIktjb25maWcgYnVnOiBObyBFUDkzeHggUEhZU19PRkZTRVQgc2V0IgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvcGxhdGZvcm0uaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oCmluZGV4IDAxYTBmMDguLjQ2OWZkOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oCkBAIC00LDYgKzQsNyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCitzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YTsKIHN0cnVjdCBpMmNfYm9hcmRfaW5mbzsKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CiBzdHJ1Y3QgZXA5M3h4ZmJfbWFjaF9pbmZvOwpAQCAtMTYsNyArMTcsNiBAQAogCiB2b2lkIGVwOTN4eF9tYXBfaW8odm9pZCk7CiB2b2lkIGVwOTN4eF9pbml0X2lycSh2b2lkKTsKLXZvaWQgZXA5M3h4X2luaXRfdGltZSh1bnNpZ25lZCBsb25nKTsKIAogLyogRVA5M3h4IFN5c3RlbSBDb250cm9sbGVyIHNvZnR3YXJlIGxvY2tlZCByZWdpc3RlciB3cml0ZSAqLwogdm9pZCBlcDkzeHhfc3lzY29uX3N3bG9ja2VkX3dyaXRlKHVuc2lnbmVkIGludCB2YWwsIHZvaWQgX19pb21lbSAqcmVnKTsKQEAgLTMzLDcgKzMzLDggQEAKIH0KIAogdm9pZCBlcDkzeHhfcmVnaXN0ZXJfZXRoKHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgKmRhdGEsIGludCBjb3B5X2FkZHIpOwotdm9pZCBlcDkzeHhfcmVnaXN0ZXJfaTJjKHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqZGV2aWNlcywgaW50IG51bSk7Cit2b2lkIGVwOTN4eF9yZWdpc3Rlcl9pMmMoc3RydWN0IGkyY19ncGlvX3BsYXRmb3JtX2RhdGEgKmRhdGEsCisJCQkgc3RydWN0IGkyY19ib2FyZF9pbmZvICpkZXZpY2VzLCBpbnQgbnVtKTsKIHZvaWQgZXA5M3h4X3JlZ2lzdGVyX2ZiKHN0cnVjdCBlcDkzeHhmYl9tYWNoX2luZm8gKmRhdGEpOwogdm9pZCBlcDkzeHhfcmVnaXN0ZXJfcHdtKGludCBwd20wLCBpbnQgcHdtMSk7CiBpbnQgZXA5M3h4X3B3bV9hY3F1aXJlX2dwaW8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jCmluZGV4IDBhMzEzZTguLmQ4M2I4MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jCkBAIC0yLDcgKzIsOSBAQAogICogIGxpbnV4L2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IENvbnRlYyBTdGV1ZXJ1bmdzdGVjaG5payAmIEF1dG9tYXRpb24gR21iSAotICogICAgICAgICAgICAgICAgICAgTWFuZnJlZCBHcnViZXIgPG1hbmZyZWQuZ3J1YmVyQGNvbnRlYy5hdD4KKyAqICAgICAgICAgICAgICAgICAgICBNYW5mcmVkIEdydWJlciA8bS5ncnViZXJAdGlyb2wuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IENvbnRlYyBTdGV1ZXJ1bmdzdGVjaG5payAmIEF1dG9tYXRpb24gR21iSAorICogICAgICAgICAgICAgICAgICAgIEh1YmVydCBGZXVyc3RlaW4gPGh1YmVydC5mZXVyc3RlaW5AY29udGVjLmF0PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMjAsMTA0ICsyMiwxMjQgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKIAotc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgbWljcm85X2V0aF9kYXRhID0gewotCS5waHlfaWQJCT0gMHgxZiwKLX07CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWljcm85IE5PUiBGbGFzaAorICoKKyAqIE1pY3JvOS1IaWdoIGhhcyB1cCB0byA2NE1CIG9mIDMyLWJpdCBmbGFzaCBvbiBDUzEKKyAqIE1pY3JvOS1NaWQgaGFzIHVwIHRvIDY0TUIgb2YgZWl0aGVyIDMyLWJpdCBvciAxNi1iaXQgZmxhc2ggb24gQ1MxCisgKiBNaWNybzktTGl0ZSB1c2VzIGEgc2VwZXJhdGUgTVREIG1hcCBkcml2ZXIgZm9yIGZsYXNoIHN1cHBvcnQKKyAqIE1pY3JvOS1TbGltIGhhcyB1cCB0byA2NE1CIG9mIGVpdGhlciAzMi1iaXQgb3IgMTYtYml0IGZsYXNoIG9uIENTMQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBtaWNybzlfZmxhc2hfZGF0YTsKIAotc3RhdGljIHZvaWQgX19pbml0IG1pY3JvOV9pbml0KHZvaWQpCi17Ci0JZXA5M3h4X3JlZ2lzdGVyX2V0aCgmbWljcm85X2V0aF9kYXRhLCAxKTsKLX0KLQotLyoKLSAqIE1pY3JvOS1ICi0gKi8KLSNpZmRlZiBDT05GSUdfTUFDSF9NSUNSTzlICi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBtaWNybzloX2ZsYXNoX2RhdGEgPSB7Ci0JLndpZHRoCQk9IDQsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG1pY3JvOWhfZmxhc2hfcmVzb3VyY2UgPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1pY3JvOV9mbGFzaF9yZXNvdXJjZSA9IHsKIAkuc3RhcnQJCT0gRVA5M1hYX0NTMV9QSFlTX0JBU0UsCiAJLmVuZAkJPSBFUDkzWFhfQ1MxX1BIWVNfQkFTRSArIFNaXzY0TSAtIDEsCiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWljcm85aF9mbGFzaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1pY3JvOV9mbGFzaCA9IHsKIAkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCiAJLmlkCQk9IDAsCiAJLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJm1pY3JvOWhfZmxhc2hfZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbWljcm85X2ZsYXNoX2RhdGEsCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IDEsCi0JLnJlc291cmNlCT0gJm1pY3JvOWhfZmxhc2hfcmVzb3VyY2UsCisJLnJlc291cmNlCT0gJm1pY3JvOV9mbGFzaF9yZXNvdXJjZSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtaWNybzloX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBfX21pY3JvOV9yZWdpc3Rlcl9mbGFzaCh1bnNpZ25lZCBpbnQgd2lkdGgpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtaWNybzloX2ZsYXNoKTsKKwltaWNybzlfZmxhc2hfZGF0YS53aWR0aCA9IHdpZHRoOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtaWNybzlfZmxhc2gpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbWljcm85aF9pbml0X21hY2hpbmUodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IG1pY3JvOV9kZXRlY3RfYm9vdHdpZHRoKHZvaWQpCit7CisJdTMyIHY7CisKKwkvKiBEZXRlY3QgdGhlIGJ1cyB3aWR0aCBvZiB0aGUgZXh0ZXJuYWwgZmxhc2ggbWVtb3J5ICovCisJdiA9IF9fcmF3X3JlYWRsKEVQOTNYWF9TWVNDT05fU1lTQ0ZHKTsKKwlpZiAodiAmIEVQOTNYWF9TWVNDT05fU1lTQ0ZHX0xDU043KQorCQlyZXR1cm4gNDsgLyogMzItYml0ICovCisJZWxzZQorCQlyZXR1cm4gMjsgLyogMTYtYml0ICovCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtaWNybzlfcmVnaXN0ZXJfZmxhc2godm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19taWNybzkoKSkKKwkJX19taWNybzlfcmVnaXN0ZXJfZmxhc2goNCk7CisJZWxzZSBpZiAobWFjaGluZV9pc19taWNybzltKCkgfHwgbWFjaGluZV9pc19taWNybzlzKCkpCisJCV9fbWljcm85X3JlZ2lzdGVyX2ZsYXNoKG1pY3JvOV9kZXRlY3RfYm9vdHdpZHRoKCkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNaWNybzkgRXRoZXJuZXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgbWljcm85X2V0aF9kYXRhID0geworCS5waHlfaWQJCT0gMHgxZiwKK307CisKKworc3RhdGljIHZvaWQgX19pbml0IG1pY3JvOV9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7Ci0JbWljcm85X2luaXQoKTsKLQltaWNybzloX2luaXQoKTsKKwllcDkzeHhfcmVnaXN0ZXJfZXRoKCZtaWNybzlfZXRoX2RhdGEsIDEpOworCW1pY3JvOV9yZWdpc3Rlcl9mbGFzaCgpOwogfQogCi1NQUNISU5FX1NUQVJUKE1JQ1JPOSwgIkNvbnRlYyBIeXBlcmNvbnRyb2wgTWljcm85LUgiKQotCS8qIE1haW50YWluZXI6IE1hbmZyZWQgR3J1YmVyIDxtYW5mcmVkLmdydWJlckBjb250ZWMuYXQ+ICovCisKKyNpZmRlZiBDT05GSUdfTUFDSF9NSUNSTzlICitNQUNISU5FX1NUQVJUKE1JQ1JPOSwgIkNvbnRlYyBNaWNybzktSGlnaCIpCisJLyogTWFpbnRhaW5lcjogSHViZXJ0IEZldXJzdGVpbiA8aHViZXJ0LmZldXJzdGVpbkBjb250ZWMuYXQ+ICovCiAJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKLQkuaW5pdF9tYWNoaW5lCT0gbWljcm85aF9pbml0X21hY2hpbmUsCisJLmluaXRfbWFjaGluZQk9IG1pY3JvOV9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKLS8qCi0gKiBNaWNybzktTQotICovCiAjaWZkZWYgQ09ORklHX01BQ0hfTUlDUk85TQotc3RhdGljIHZvaWQgX19pbml0IG1pY3JvOW1faW5pdF9tYWNoaW5lKHZvaWQpCi17Ci0JZXA5M3h4X2luaXRfZGV2aWNlcygpOwotCW1pY3JvOV9pbml0KCk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoTUlDUk85TSwgIkNvbnRlYyBIeXBlcmNvbnRyb2wgTWljcm85LU0iKQotCS8qIE1haW50YWluZXI6IE1hbmZyZWQgR3J1YmVyIDxtYW5mcmVkLmdydWJlckBjb250ZWMuYXQ+ICovCitNQUNISU5FX1NUQVJUKE1JQ1JPOU0sICJDb250ZWMgTWljcm85LU1pZCIpCisJLyogTWFpbnRhaW5lcjogSHViZXJ0IEZldXJzdGVpbiA8aHViZXJ0LmZldXJzdGVpbkBjb250ZWMuYXQ+ICovCiAJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCisJLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9BU1lOQyArIDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCi0JLmluaXRfbWFjaGluZQk9IG1pY3JvOW1faW5pdF9tYWNoaW5lLAorCS5pbml0X21hY2hpbmUJPSBtaWNybzlfaW5pdF9tYWNoaW5lLAogTUFDSElORV9FTkQKICNlbmRpZgogCi0vKgotICogTWljcm85LUwKLSAqLwogI2lmZGVmIENPTkZJR19NQUNIX01JQ1JPOUwKLXN0YXRpYyB2b2lkIF9faW5pdCBtaWNybzlsX2luaXRfbWFjaGluZSh2b2lkKQotewotCWVwOTN4eF9pbml0X2RldmljZXMoKTsKLQltaWNybzlfaW5pdCgpOwotfQotCi1NQUNISU5FX1NUQVJUKE1JQ1JPOUwsICJDb250ZWMgSHlwZXJjb250cm9sIE1pY3JvOS1MIikKLQkvKiBNYWludGFpbmVyOiBNYW5mcmVkIEdydWJlciA8bWFuZnJlZC5ncnViZXJAY29udGVjLmF0PiAqLworTUFDSElORV9TVEFSVChNSUNSTzlMLCAiQ29udGVjIE1pY3JvOS1MaXRlIikKKwkvKiBNYWludGFpbmVyOiBIdWJlcnQgRmV1cnN0ZWluIDxodWJlcnQuZmV1cnN0ZWluQGNvbnRlYy5hdD4gKi8KIAkucGh5c19pbwk9IEVQOTNYWF9BUEJfUEhZU19CQVNFLAogCS5pb19wZ19vZmZzdAk9ICgoRVA5M1hYX0FQQl9WSVJUX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLAotCS5pbml0X21hY2hpbmUJPSBtaWNybzlsX2luaXRfbWFjaGluZSwKKwkuaW5pdF9tYWNoaW5lCT0gbWljcm85X2luaXRfbWFjaGluZSwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19NQUNIX01JQ1JPOVMKK01BQ0hJTkVfU1RBUlQoTUlDUk85UywgIkNvbnRlYyBNaWNybzktU2xpbSIpCisJLyogTWFpbnRhaW5lcjogSHViZXJ0IEZldXJzdGVpbiA8aHViZXJ0LmZldXJzdGVpbkBjb250ZWMuYXQ+ICovCisJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9BU1lOQyArIDB4MTAwLAorCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG1pY3JvOV9pbml0X21hY2hpbmUsCitNQUNISU5FX0VORAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCAyYjJlN2ExLi40ODkxODI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTI4LDUgKzI4LDYgQEAKICNkZWZpbmUgQlVTX09GRlNFVAlVTCgweDgwMDAwMDAwKQogI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCSgoeCkgLSBQQUdFX09GRlNFVCArIEJVU19PRkZTRVQpCiAjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKCh4KSAtIEJVU19PRkZTRVQgKyBQQUdFX09GRlNFVCkKKyNkZWZpbmUgX19wZm5fdG9fYnVzKHgpCQkoKCh4KSA8PCBQQUdFX1NISUZUKSArIEJVU19PRkZTRVQpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKaW5kZXggMmEzMThlYi4uM2YzNTI5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2ttaS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvY2xjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CkBAIC0zNSw3ICszNiw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCkBAIC00MDAsNyArNDAwLDcgQEAKIAlyZXR1cm4gc3RhdHVzICYgODsKIH0KIAotc3RhdGljIHN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSBtbWNfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbW1jaV9wbGF0Zm9ybV9kYXRhIG1tY19kYXRhID0gewogCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKIAkuc3RhdHVzCQk9IG1tY19zdGF0dXMsCiAJLmdwaW9fd3AJPSAtMSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2lfdjMuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2lfdjMuYwppbmRleCBmMWQ3MmIyLi4xNDhkMjVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpX3YzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaV92My5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CkBAIC00ODYsNyArNDg3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdHJ1Y3QgcGNpX2J1cyAqcGNpX3YzX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQorc3RydWN0IHBjaV9idXMgKiBfX2luaXQgcGNpX3YzX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQogewogCXJldHVybiBwY2lfc2Nhbl9idXMoc3lzLT5idXNuciwgJnBjaV92M19vcHMsIHN5cyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL2FkbWEuaCBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvYWRtYS5oCmluZGV4IDU3MjJlODYuLjZkMzc4MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvYWRtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvYWRtYS5oCkBAIC0xNTAsNiArMTUwLDggQEAKIAlyZXR1cm4gMTY7CiB9CiAKKyNkZWZpbmUgaW9wX2FkbWFfZ2V0X21heF9wcSBpb3BfYWRtYV9nZXRfbWF4X3hvcgorCiBzdGF0aWMgaW5saW5lIHUzMiBpb3BfY2hhbl9nZXRfY3VycmVudF9kZXNjcmlwdG9yKHN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuKQogewogCXJldHVybiBfX3Jhd19yZWFkbChBRE1BX0FEQVIoY2hhbikpOwpAQCAtMjExLDcgKzIxMywxMCBAQAogI2RlZmluZSBJT1BfQURNQV9NQVhfQllURV9DT1VOVCBBRE1BX01BWF9CWVRFX0NPVU5UCiAjZGVmaW5lIElPUF9BRE1BX1pFUk9fU1VNX01BWF9CWVRFX0NPVU5UIEFETUFfTUFYX0JZVEVfQ09VTlQKICNkZWZpbmUgSU9QX0FETUFfWE9SX01BWF9CWVRFX0NPVU5UIEFETUFfTUFYX0JZVEVfQ09VTlQKKyNkZWZpbmUgSU9QX0FETUFfUFFfTUFYX0JZVEVfQ09VTlQgQURNQV9NQVhfQllURV9DT1VOVAogI2RlZmluZSBpb3BfY2hhbl96ZXJvX3N1bV9zbG90X2NvdW50KGwsIHMsIG8pIGlvcF9jaGFuX3hvcl9zbG90X2NvdW50KGwsIHMsIG8pCisjZGVmaW5lIGlvcF9jaGFuX3BxX3Nsb3RfY291bnQgaW9wX2NoYW5feG9yX3Nsb3RfY291bnQKKyNkZWZpbmUgaW9wX2NoYW5fcHFfemVyb19zdW1fc2xvdF9jb3VudCBpb3BfY2hhbl94b3Jfc2xvdF9jb3VudAogCiBzdGF0aWMgaW5saW5lIHUzMiBpb3BfZGVzY19nZXRfZGVzdF9hZGRyKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsCiAJCQkJCXN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuKQpAQCAtMjIwLDYgKzIyNSwxMyBAQAogCXJldHVybiBod19kZXNjLT5kZXN0X2FkZHI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIGlvcF9kZXNjX2dldF9xZGVzdF9hZGRyKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsCisJCQkJCSAgc3RydWN0IGlvcF9hZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGlvcDEzeHhfYWRtYV9kZXNjX2h3ICpod19kZXNjID0gZGVzYy0+aHdfZGVzYzsKKwlyZXR1cm4gaHdfZGVzYy0+cV9kZXN0X2FkZHI7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIGlvcF9kZXNjX2dldF9ieXRlX2NvdW50KHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsCiAJCQkJCXN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuKQogewpAQCAtMzE5LDYgKzMzMSw1OCBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQKK2lvcF9kZXNjX2luaXRfcHEoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgaW50IHNyY19jbnQsCisJCSAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaW9wMTN4eF9hZG1hX2Rlc2NfaHcgKmh3X2Rlc2MgPSBkZXNjLT5od19kZXNjOworCXVuaW9uIHsKKwkJdTMyIHZhbHVlOworCQlzdHJ1Y3QgaW9wMTN4eF9hZG1hX2Rlc2NfY3RybCBmaWVsZDsKKwl9IHVfZGVzY19jdHJsOworCisJdV9kZXNjX2N0cmwudmFsdWUgPSAwOworCXVfZGVzY19jdHJsLmZpZWxkLnNyY19zZWxlY3QgPSBzcmNfY250IC0gMTsKKwl1X2Rlc2NfY3RybC5maWVsZC54ZmVyX2RpciA9IDM7IC8qIGxvY2FsIHRvIGludGVybmFsIGJ1cyAqLworCXVfZGVzY19jdHJsLmZpZWxkLnBxX3hmZXJfZW4gPSAxOworCXVfZGVzY19jdHJsLmZpZWxkLnBfeGZlcl9kaXMgPSAhIShmbGFncyAmIERNQV9QUkVQX1BRX0RJU0FCTEVfUCk7CisJdV9kZXNjX2N0cmwuZmllbGQuaW50X2VuID0gZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQ7CisJaHdfZGVzYy0+ZGVzY19jdHJsID0gdV9kZXNjX2N0cmwudmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlvcF9kZXNjX2lzX3BxKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MpCit7CisJc3RydWN0IGlvcDEzeHhfYWRtYV9kZXNjX2h3ICpod19kZXNjID0gZGVzYy0+aHdfZGVzYzsKKwl1bmlvbiB7CisJCXUzMiB2YWx1ZTsKKwkJc3RydWN0IGlvcDEzeHhfYWRtYV9kZXNjX2N0cmwgZmllbGQ7CisJfSB1X2Rlc2NfY3RybDsKKworCXVfZGVzY19jdHJsLnZhbHVlID0gaHdfZGVzYy0+ZGVzY19jdHJsOworCXJldHVybiB1X2Rlc2NfY3RybC5maWVsZC5wcV94ZmVyX2VuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lvcF9kZXNjX2luaXRfcHFfemVyb19zdW0oc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgaW50IHNyY19jbnQsCisJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGlvcDEzeHhfYWRtYV9kZXNjX2h3ICpod19kZXNjID0gZGVzYy0+aHdfZGVzYzsKKwl1bmlvbiB7CisJCXUzMiB2YWx1ZTsKKwkJc3RydWN0IGlvcDEzeHhfYWRtYV9kZXNjX2N0cmwgZmllbGQ7CisJfSB1X2Rlc2NfY3RybDsKKworCXVfZGVzY19jdHJsLnZhbHVlID0gMDsKKwl1X2Rlc2NfY3RybC5maWVsZC5zcmNfc2VsZWN0ID0gc3JjX2NudCAtIDE7CisJdV9kZXNjX2N0cmwuZmllbGQueGZlcl9kaXIgPSAzOyAvKiBsb2NhbCB0byBpbnRlcm5hbCBidXMgKi8KKwl1X2Rlc2NfY3RybC5maWVsZC56ZXJvX3Jlc3VsdCA9IDE7CisJdV9kZXNjX2N0cmwuZmllbGQuc3RhdHVzX3dyaXRlX2JhY2tfZW4gPSAxOworCXVfZGVzY19jdHJsLmZpZWxkLnBxX3hmZXJfZW4gPSAxOworCXVfZGVzY19jdHJsLmZpZWxkLnBfeGZlcl9kaXMgPSAhIShmbGFncyAmIERNQV9QUkVQX1BRX0RJU0FCTEVfUCk7CisJdV9kZXNjX2N0cmwuZmllbGQuaW50X2VuID0gZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQ7CisJaHdfZGVzYy0+ZGVzY19jdHJsID0gdV9kZXNjX2N0cmwudmFsdWU7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpb3BfZGVzY19zZXRfYnl0ZV9jb3VudChzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLAogCQkJCQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hhbiwKIAkJCQkJdTMyIGJ5dGVfY291bnQpCkBAIC0zNTEsNiArNDE1LDcgQEAKIAl9CiB9CiAKKyNkZWZpbmUgaW9wX2Rlc2Nfc2V0X3BxX3plcm9fc3VtX2J5dGVfY291bnQgaW9wX2Rlc2Nfc2V0X3plcm9fc3VtX2J5dGVfY291bnQKIAogc3RhdGljIGlubGluZSB2b2lkIGlvcF9kZXNjX3NldF9kZXN0X2FkZHIoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywKIAkJCQkJc3RydWN0IGlvcF9hZG1hX2NoYW4gKmNoYW4sCkBAIC0zNjEsNiArNDI2LDE2IEBACiAJaHdfZGVzYy0+dXBwZXJfZGVzdF9hZGRyID0gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkCitpb3BfZGVzY19zZXRfcHFfYWRkcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLCBkbWFfYWRkcl90ICphZGRyKQoreworCXN0cnVjdCBpb3AxM3h4X2FkbWFfZGVzY19odyAqaHdfZGVzYyA9IGRlc2MtPmh3X2Rlc2M7CisKKwlod19kZXNjLT5kZXN0X2FkZHIgPSBhZGRyWzBdOworCWh3X2Rlc2MtPnFfZGVzdF9hZGRyID0gYWRkclsxXTsKKwlod19kZXNjLT51cHBlcl9kZXN0X2FkZHIgPSAwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9wX2Rlc2Nfc2V0X21lbWNweV9zcmNfYWRkcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLAogCQkJCQlkbWFfYWRkcl90IGFkZHIpCiB7CkBAIC0zODksNiArNDY0LDI5IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAoraW9wX2Rlc2Nfc2V0X3BxX3NyY19hZGRyKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsIGludCBzcmNfaWR4LAorCQkJIGRtYV9hZGRyX3QgYWRkciwgdW5zaWduZWQgY2hhciBjb2VmKQoreworCWludCBzbG90X2NudCA9IGRlc2MtPnNsb3RfY250LCBzbG90c19wZXJfb3AgPSBkZXNjLT5zbG90c19wZXJfb3A7CisJc3RydWN0IGlvcDEzeHhfYWRtYV9kZXNjX2h3ICpod19kZXNjID0gZGVzYy0+aHdfZGVzYywgKml0ZXI7CisJc3RydWN0IGlvcDEzeHhfYWRtYV9zcmMgKnNyYzsKKwlpbnQgaSA9IDA7CisKKwlkbyB7CisJCWl0ZXIgPSBpb3BfaHdfZGVzY19zbG90X2lkeChod19kZXNjLCBpKTsKKwkJc3JjID0gJml0ZXItPnNyY1tzcmNfaWR4XTsKKwkJc3JjLT5zcmNfYWRkciA9IGFkZHI7CisJCXNyYy0+cHFfdXBwZXJfc3JjX2FkZHIgPSAwOworCQlzcmMtPnBxX2RtbHQgPSBjb2VmOworCQlzbG90X2NudCAtPSBzbG90c19wZXJfb3A7CisJCWlmIChzbG90X2NudCkgeworCQkJaSArPSBzbG90c19wZXJfb3A7CisJCQlhZGRyICs9IElPUF9BRE1BX1BRX01BWF9CWVRFX0NPVU5UOworCQl9CisJfSB3aGlsZSAoc2xvdF9jbnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKIGlvcF9kZXNjX2luaXRfaW50ZXJydXB0KHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsCiAJc3RydWN0IGlvcF9hZG1hX2NoYW4gKmNoYW4pCiB7CkBAIC0zOTksNiArNDk3LDE1IEBACiB9CiAKICNkZWZpbmUgaW9wX2Rlc2Nfc2V0X3plcm9fc3VtX3NyY19hZGRyIGlvcF9kZXNjX3NldF94b3Jfc3JjX2FkZHIKKyNkZWZpbmUgaW9wX2Rlc2Nfc2V0X3BxX3plcm9fc3VtX3NyY19hZGRyIGlvcF9kZXNjX3NldF9wcV9zcmNfYWRkcgorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lvcF9kZXNjX3NldF9wcV96ZXJvX3N1bV9hZGRyKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsIGludCBwcV9pZHgsCisJCQkgICAgICBkbWFfYWRkcl90ICpzcmMpCit7CisJaW9wX2Rlc2Nfc2V0X3hvcl9zcmNfYWRkcihkZXNjLCBwcV9pZHgsIHNyY1twcV9pZHhdKTsKKwlpb3BfZGVzY19zZXRfeG9yX3NyY19hZGRyKGRlc2MsIHBxX2lkeCsxLCBzcmNbcHFfaWR4KzFdKTsKK30KIAogc3RhdGljIGlubGluZSB2b2lkIGlvcF9kZXNjX3NldF9uZXh0X2Rlc2Moc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywKIAkJCQkJdTMyIG5leHRfZGVzY19hZGRyKQpAQCAtNDI4LDE4ICs1MzUsMjAgQEAKIAlod19kZXNjLT5ibG9ja19maWxsX2RhdGEgPSB2YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlvcF9kZXNjX2dldF96ZXJvX3Jlc3VsdChzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNjKQorc3RhdGljIGlubGluZSBlbnVtIHN1bV9jaGVja19mbGFncworaW9wX2Rlc2NfZ2V0X3plcm9fcmVzdWx0KHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MpCiB7CiAJc3RydWN0IGlvcDEzeHhfYWRtYV9kZXNjX2h3ICpod19kZXNjID0gZGVzYy0+aHdfZGVzYzsKIAlzdHJ1Y3QgaW9wMTN4eF9hZG1hX2Rlc2NfY3RybCBkZXNjX2N0cmwgPSBod19kZXNjLT5kZXNjX2N0cmxfZmllbGQ7CiAJc3RydWN0IGlvcDEzeHhfYWRtYV9ieXRlX2NvdW50IGJ5dGVfY291bnQgPSBod19kZXNjLT5ieXRlX2NvdW50X2ZpZWxkOworCWVudW0gc3VtX2NoZWNrX2ZsYWdzIGZsYWdzOwogCiAJQlVHX09OKCEoYnl0ZV9jb3VudC50eF9jb21wbGV0ZSAmJiBkZXNjX2N0cmwuemVyb19yZXN1bHQpKTsKIAotCWlmIChkZXNjX2N0cmwucHFfeGZlcl9lbikKLQkJcmV0dXJuIGJ5dGVfY291bnQuemVyb19yZXN1bHRfZXJyX3E7Ci0JZWxzZQotCQlyZXR1cm4gYnl0ZV9jb3VudC56ZXJvX3Jlc3VsdF9lcnI7CisJZmxhZ3MgPSBieXRlX2NvdW50Lnplcm9fcmVzdWx0X2Vycl9xIDw8IFNVTV9DSEVDS19ROworCWZsYWdzIHw9IGJ5dGVfY291bnQuemVyb19yZXN1bHRfZXJyIDw8IFNVTV9DSEVDS19QOworCisJcmV0dXJuIGZsYWdzOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9wX2NoYW5fYXBwZW5kKHN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3NldHVwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvc2V0dXAuYwppbmRleCBiZWU0MmM2Li41YzE0N2ZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvc2V0dXAuYwpAQCAtNDc3LDEwICs0NzcsOCBAQAogCQkJcGxhdF9kYXRhID0gJmlvcDEzeHhfYWRtYV8wX2RhdGE7CiAJCQlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKIAkJCWRtYV9jYXBfc2V0KERNQV9YT1IsIHBsYXRfZGF0YS0+Y2FwX21hc2spOwotCQkJZG1hX2NhcF9zZXQoRE1BX0RVQUxfWE9SLCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKLQkJCWRtYV9jYXBfc2V0KERNQV9aRVJPX1NVTSwgcGxhdF9kYXRhLT5jYXBfbWFzayk7CisJCQlkbWFfY2FwX3NldChETUFfWE9SX1ZBTCwgcGxhdF9kYXRhLT5jYXBfbWFzayk7CiAJCQlkbWFfY2FwX3NldChETUFfTUVNU0VULCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKLQkJCWRtYV9jYXBfc2V0KERNQV9NRU1DUFlfQ1JDMzJDLCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKIAkJCWRtYV9jYXBfc2V0KERNQV9JTlRFUlJVUFQsIHBsYXRfZGF0YS0+Y2FwX21hc2spOwogCQkJYnJlYWs7CiAJCWNhc2UgSU9QMTNYWF9JTklUX0FETUFfMToKQEAgLTQ4OSwxMCArNDg3LDggQEAKIAkJCXBsYXRfZGF0YSA9ICZpb3AxM3h4X2FkbWFfMV9kYXRhOwogCQkJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgcGxhdF9kYXRhLT5jYXBfbWFzayk7CiAJCQlkbWFfY2FwX3NldChETUFfWE9SLCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKLQkJCWRtYV9jYXBfc2V0KERNQV9EVUFMX1hPUiwgcGxhdF9kYXRhLT5jYXBfbWFzayk7Ci0JCQlkbWFfY2FwX3NldChETUFfWkVST19TVU0sIHBsYXRfZGF0YS0+Y2FwX21hc2spOworCQkJZG1hX2NhcF9zZXQoRE1BX1hPUl9WQUwsIHBsYXRfZGF0YS0+Y2FwX21hc2spOwogCQkJZG1hX2NhcF9zZXQoRE1BX01FTVNFVCwgcGxhdF9kYXRhLT5jYXBfbWFzayk7Ci0JCQlkbWFfY2FwX3NldChETUFfTUVNQ1BZX0NSQzMyQywgcGxhdF9kYXRhLT5jYXBfbWFzayk7CiAJCQlkbWFfY2FwX3NldChETUFfSU5URVJSVVBULCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKIAkJCWJyZWFrOwogCQljYXNlIElPUDEzWFhfSU5JVF9BRE1BXzI6CkBAIC01MDEsMTQgKzQ5NywxMSBAQAogCQkJcGxhdF9kYXRhID0gJmlvcDEzeHhfYWRtYV8yX2RhdGE7CiAJCQlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKIAkJCWRtYV9jYXBfc2V0KERNQV9YT1IsIHBsYXRfZGF0YS0+Y2FwX21hc2spOwotCQkJZG1hX2NhcF9zZXQoRE1BX0RVQUxfWE9SLCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKLQkJCWRtYV9jYXBfc2V0KERNQV9aRVJPX1NVTSwgcGxhdF9kYXRhLT5jYXBfbWFzayk7CisJCQlkbWFfY2FwX3NldChETUFfWE9SX1ZBTCwgcGxhdF9kYXRhLT5jYXBfbWFzayk7CiAJCQlkbWFfY2FwX3NldChETUFfTUVNU0VULCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKLQkJCWRtYV9jYXBfc2V0KERNQV9NRU1DUFlfQ1JDMzJDLCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKIAkJCWRtYV9jYXBfc2V0KERNQV9JTlRFUlJVUFQsIHBsYXRfZGF0YS0+Y2FwX21hc2spOwotCQkJZG1hX2NhcF9zZXQoRE1BX1BRX1hPUiwgcGxhdF9kYXRhLT5jYXBfbWFzayk7Ci0JCQlkbWFfY2FwX3NldChETUFfUFFfVVBEQVRFLCBwbGF0X2RhdGEtPmNhcF9tYXNrKTsKLQkJCWRtYV9jYXBfc2V0KERNQV9QUV9aRVJPX1NVTSwgcGxhdF9kYXRhLT5jYXBfbWFzayk7CisJCQlkbWFfY2FwX3NldChETUFfUFEsIHBsYXRfZGF0YS0+Y2FwX21hc2spOworCQkJZG1hX2NhcF9zZXQoRE1BX1BRX1ZBTCwgcGxhdF9kYXRhLT5jYXBfbWFzayk7CiAJCQlicmVhazsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9pb3AzMnguaCBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9pb3AzMnguaAppbmRleCBhYmQ5ZWI0Li45NDFmMzYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvaW9wMzJ4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL2lvcDMyeC5oCkBAIC0zMSw3ICszMSw1IEBACiAjZGVmaW5lIElPUDMyWF9NQVhfUkFNX1NJWkUgICAgICAgICAgICAweDQwMDAwMDAwVUwKICNkZWZpbmUgSU9QM1hYX01BWF9SQU1fU0laRSAgICAgICAgICAgIElPUDMyWF9NQVhfUkFNX1NJWkUKICNkZWZpbmUgSU9QM1hYX1BDSV9MT1dFUl9NRU1fQkEgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgSU9QMzJYX1BDSV9NRU1fV0lORE9XX1NJWkUgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgSU9QM1hYX1BDSV9NRU1fV0lORE9XX1NJWkUgICAgIElPUDMyWF9QQ0lfTUVNX1dJTkRPV19TSVpFCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL2lvcDMzeC5oIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL2lvcDMzeC5oCmluZGV4IDI0NTY3MzEuLmE4OWMwYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9pb3AzM3guaAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvaW9wMzN4LmgKQEAgLTM2LDggKzM2LDYgQEAKICNkZWZpbmUgSU9QMzNYX01BWF9SQU1fU0laRQkJMHg4MDAwMDAwMFVMCiAjZGVmaW5lIElPUDNYWF9NQVhfUkFNX1NJWkUJCUlPUDMzWF9NQVhfUkFNX1NJWkUKICNkZWZpbmUgSU9QM1hYX1BDSV9MT1dFUl9NRU1fQkEJKFBIWVNfT0ZGU0VUICsgSU9QMzNYX01BWF9SQU1fU0laRSkKLSNkZWZpbmUgSU9QMzNYX1BDSV9NRU1fV0lORE9XX1NJWkUJMHgwODAwMDAwMAotI2RlZmluZSBJT1AzWFhfUENJX01FTV9XSU5ET1dfU0laRQlJT1AzM1hfUENJX01FTV9XSU5ET1dfU0laRQogCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwppbmRleCA1MDgzZjAzLi5jZmQ1MmZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwpAQCAtNDEsOCArNDEsOCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAotc3RhdGljIGludCBfX2luaXQgaXhwNHh4X2Nsb2Nrc291cmNlX2luaXQodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBpeHA0eHhfY2xvY2tldmVudF9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgX19pbml0IGl4cDR4eF9jbG9ja3NvdXJjZV9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgX19pbml0IGl4cDR4eF9jbG9ja2V2ZW50X2luaXQodm9pZCk7CiBzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBjbG9ja2V2ZW50X2l4cDR4eDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaXhwNHh4X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gJmNsb2NrZXZlbnRfaXhwNHh4OworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IGRldl9pZDsKIAogCS8qIENsZWFyIFBlbmRpbmcgSW50ZXJydXB0IGJ5IHdyaXRpbmcgJzEnIHRvIGl0ICovCiAJKklYUDRYWF9PU1NUID0gSVhQNFhYX09TU1RfVElNRVJfMV9QRU5EOwpAQCAtMjgxLDYgKzI4MSw3IEBACiAJLm5hbWUJCT0gInRpbWVyMSIsCiAJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAogCS5oYW5kbGVyCT0gaXhwNHh4X3RpbWVyX2ludGVycnVwdCwKKwkuZGV2X2lkCQk9ICZjbG9ja2V2ZW50X2l4cDR4eCwKIH07CiAKIHZvaWQgX19pbml0IGl4cDR4eF90aW1lcl9pbml0KHZvaWQpCkBAIC00MDEsNyArNDAyLDcgQEAKIC8qCiAgKiBjbG9ja3NvdXJjZQogICovCi1jeWNsZV90IGl4cDR4eF9nZXRfY3ljbGVzKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCitzdGF0aWMgY3ljbGVfdCBpeHA0eHhfZ2V0X2N5Y2xlcyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQogewogCXJldHVybiAqSVhQNFhYX09TVFM7CiB9CkBAIC00MTcsMTQgKzQxOCwxMiBAQAogCiB1bnNpZ25lZCBsb25nIGl4cDR4eF90aW1lcl9mcmVxID0gRlJFUTsKIEVYUE9SVF9TWU1CT0woaXhwNHh4X3RpbWVyX2ZyZXEpOwotc3RhdGljIGludCBfX2luaXQgaXhwNHh4X2Nsb2Nrc291cmNlX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBpeHA0eHhfY2xvY2tzb3VyY2VfaW5pdCh2b2lkKQogewogCWNsb2Nrc291cmNlX2l4cDR4eC5tdWx0ID0KIAkJY2xvY2tzb3VyY2VfaHoybXVsdChpeHA0eHhfdGltZXJfZnJlcSwKIAkJCQkgICAgY2xvY2tzb3VyY2VfaXhwNHh4LnNoaWZ0KTsKIAljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfaXhwNHh4KTsKLQotCXJldHVybiAwOwogfQogCiAvKgpAQCAtNDgwLDcgKzQ3OSw3IEBACiAJLnNldF9uZXh0X2V2ZW50CT0gaXhwNHh4X3NldF9uZXh0X2V2ZW50LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgaXhwNHh4X2Nsb2NrZXZlbnRfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGl4cDR4eF9jbG9ja2V2ZW50X2luaXQodm9pZCkKIHsKIAljbG9ja2V2ZW50X2l4cDR4eC5tdWx0ID0gZGl2X3NjKEZSRVEsIE5TRUNfUEVSX1NFQywKIAkJCQkJY2xvY2tldmVudF9peHA0eHguc2hpZnQpOwpAQCAtNDkxLDUgKzQ5MCw0IEBACiAJY2xvY2tldmVudF9peHA0eHguY3B1bWFzayA9IGNwdW1hc2tfb2YoMCk7CiAKIAljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJmNsb2NrZXZlbnRfaXhwNHh4KTsKLQlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCBkMmFhMjZmLi41NGMwYWY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC0xMyw5ICsxMywxMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCiB7CisJLyogaXhwNHh4IGRvZXMgbm90IGltcGxlbWVudCB0aGUgWFNjYWxlIFBXUk1PREUgcmVnaXN0ZXIsCisJICogc28gaXQgbXVzdCBub3QgY2FsbCBjcHVfZG9faWRsZSgpIGhlcmUuCisJICovCiAjaWYgMAotCWlmICghaGx0X2NvdW50ZXIpCi0JCWNwdV9kb19pZGxlKDApOworCWNwdV9kb19pZGxlKCk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvY2xvY2tfaW14MjcuYyBiL2FyY2gvYXJtL21hY2gtbXgyL2Nsb2NrX2lteDI3LmMKaW5kZXggNDA4OTk1MS4uZmY1ZTMzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvY2xvY2tfaW14MjcuYworKysgYi9hcmNoL2FybS9tYWNoLW14Mi9jbG9ja19pbXgyNy5jCkBAIC02MzgsOSArNjM4LDkgQEAKIAlfUkVHSVNURVJfQ0xPQ0soIm14Yy1tbWMuMCIsIE5VTEwsIHNkaGMxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Yy1tbWMuMSIsIE5VTEwsIHNkaGMyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Yy1tbWMuMiIsIE5VTEwsIHNkaGMzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImNzcGkxIiwgY3NwaTFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY3NwaTIiLCBjc3BpMl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJjc3BpMyIsIGNzcGkzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNwaV9pbXguMCIsIE5VTEwsIGNzcGkxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNwaV9pbXguMSIsIE5VTEwsIGNzcGkyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNwaV9pbXguMiIsIE5VTEwsIGNzcGkzX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1mYi4wIiwgTlVMTCwgbGNkY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJjc2kiLCBjc2lfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiZnNsLXVzYjItdWRjIiwgInVzYiIsIHVzYl9jbGspCkBAIC02NjUsNyArNjY1LDcgQEAKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNhaGFyYTIiLCBzYWhhcmEyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImF0YSIsIGF0YV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtc3RpY2siLCBtc3RpY2tfY2xrKQotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAid2RvZyIsIHdkb2dfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14LXdkdC4wIiwgTlVMTCwgd2RvZ19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncGlvIiwgZ3Bpb19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjAiLCBOVUxMLCBpMmMxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMSIsIE5VTEwsIGkyYzJfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvcGNtMDM4LmMgYi9hcmNoL2FybS9tYWNoLW14Mi9wY20wMzguYwppbmRleCBlZTY1ZGRhLi45MDZkNTliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9wY20wMzguYworKysgYi9hcmNoL2FybS9tYWNoLW14Mi9wY20wMzguYwpAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGxhdC1yYW0uaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21jMTM3ODMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTM1LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxtYWNoL2lvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvbXhjX25hbmQuaD4KKyNpbmNsdWRlIDxtYWNoL3NwaS5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogCkBAIC03OCw4ICs4Myw2IEBACiAJUEM2X1BGX0kyQzJfU0NMLAogCS8qIFNQSTEgKi8KIAlQRDI1X1BGX0NTUEkxX1JEWSwKLQlQRDI3X1BGX0NTUEkxX1NTMSwKLQlQRDI4X1BGX0NTUEkxX1NTMCwKIAlQRDI5X1BGX0NTUEkxX1NDTEssCiAJUEQzMF9QRl9DU1BJMV9NSVNPLAogCVBEMzFfUEZfQ1NQSTFfTU9TSSwKQEAgLTE5Niw2ICsxOTksODYgQEAKIAl9CiB9OwogCitzdGF0aWMgaW50IHBjbTAzOF9zcGlfY3NbXSA9IHtHUElPX1BPUlREICsgMjh9OworCitzdGF0aWMgc3RydWN0IHNwaV9pbXhfbWFzdGVyIHBjbTAzOF9zcGlfMF9kYXRhID0geworCS5jaGlwc2VsZWN0ID0gcGNtMDM4X3NwaV9jcywKKwkubnVtX2NoaXBzZWxlY3QgPSBBUlJBWV9TSVpFKHBjbTAzOF9zcGlfY3MpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHNkaGMxX2NvbnN1bWVyc1tdID0geworCXsKKwkJLmRldgk9ICZteGNfc2RoY19kZXZpY2UxLmRldiwKKwkJLnN1cHBseQk9ICJzZGhjX3ZjYyIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBzZGhjMV9kYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91ViA9IDMwMDAwMDAsCisJCS5tYXhfdVYgPSAzNDAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAorCQkJUkVHVUxBVE9SX0NIQU5HRV9NT0RFIHwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS52YWxpZF9tb2Rlc19tYXNrID0gUkVHVUxBVE9SX01PREVfTk9STUFMIHwKKwkJCVJFR1VMQVRPUl9NT0RFX0ZBU1QsCisJCS5hbHdheXNfb24gPSAwLAorCQkuYm9vdF9vbiA9IDAsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShzZGhjMV9jb25zdW1lcnMpLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IHNkaGMxX2NvbnN1bWVycywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBjYW1fY29uc3VtZXJzW10gPSB7CisJeworCQkuZGV2CT0gTlVMTCwKKwkJLnN1cHBseQk9ICJpbXhfY2FtX3ZjYyIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBjYW1fZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5taW5fdVYgPSAzMDAwMDAwLAorCQkubWF4X3VWID0gMzQwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCVJFR1VMQVRPUl9DSEFOR0VfTU9ERSB8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTCB8CisJCQlSRUdVTEFUT1JfTU9ERV9GQVNULAorCQkuYWx3YXlzX29uID0gMCwKKwkJLmJvb3Rfb24gPSAwLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoY2FtX2NvbnN1bWVycyksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gY2FtX2NvbnN1bWVycywKK307CisKK3N0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9pbml0X2RhdGEgcGNtMDM4X3JlZ3VsYXRvcnNbXSA9IHsKKwl7CisJCS5pZCA9IE1DMTM3ODNfUkVHVV9WQ0FNLAorCQkuaW5pdF9kYXRhID0gJmNhbV9kYXRhLAorCX0sIHsKKwkJLmlkID0gTUMxMzc4M19SRUdVX1ZNTUMxLAorCQkuaW5pdF9kYXRhID0gJnNkaGMxX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWMxMzc4M19wbGF0Zm9ybV9kYXRhIHBjbTAzOF9wbWljID0geworCS5yZWd1bGF0b3JzID0gcGNtMDM4X3JlZ3VsYXRvcnMsCisJLm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRShwY20wMzhfcmVndWxhdG9ycyksCisJLmZsYWdzID0gTUMxMzc4M19VU0VfQURDIHwgTUMxMzc4M19VU0VfUkVHVUxBVE9SIHwKKwkJIE1DMTM3ODNfVVNFX1RPVUNIU0NSRUVOLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBwY20wMzhfc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworCXsKKwkJLm1vZGFsaWFzID0gIm1jMTM3ODMiLAorCQkuaXJxID0gSVJRX0dQSU9CKDIzKSwKKwkJLm1heF9zcGVlZF9oeiA9IDMwMDAwMCwKKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAwLAorCQkucGxhdGZvcm1fZGF0YSA9ICZwY20wMzhfcG1pYywKKwkJLm1vZGUgPSBTUElfQ1NfSElHSCwKKwl9Cit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgcGNtMDM4X2luaXQodm9pZCkKIHsKIAlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKHBjbTAzOF9waW5zLCBBUlJBWV9TSVpFKHBjbTAzOF9waW5zKSwKQEAgLTIxOSw2ICszMDIsMTUgQEAKIAkvKiBQRTE4IGZvciB1c2VyLUxFRCBENDAgKi8KIAlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEUgfCAxOCB8IEdQSU9fR1BJTyB8IEdQSU9fT1VUKTsKIAorCW14Y19ncGlvX21vZGUoR1BJT19QT1JURCB8IDI4IHwgR1BJT19HUElPIHwgR1BJT19PVVQpOworCisJLyogTUMxMzc4MyBJUlEgKi8KKwlteGNfZ3Bpb19tb2RlKEdQSU9fUE9SVEIgfCAyMyB8IEdQSU9fR1BJTyB8IEdQSU9fSU4pOworCisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3NwaV9kZXZpY2UwLCAmcGNtMDM4X3NwaV8wX2RhdGEpOworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHBjbTAzOF9zcGlfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKHBjbTAzOF9zcGlfYm9hcmRfaW5mbykpOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CiAKICNpZmRlZiBDT05GSUdfTUFDSF9QQ005NzBfQkFTRUJPQVJECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9wY205NzAtYmFzZWJvYXJkLmMgYi9hcmNoL2FybS9tYWNoLW14Mi9wY205NzAtYmFzZWJvYXJkLmMKaW5kZXggYzI2MWY1OS4uM2NiN2Y0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvcGNtOTcwLWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyL3BjbTk3MC1iYXNlYm9hcmQuYwpAQCAtMzksNyArMzksNiBAQAogCVBCN19QRl9TRDJfRDMsCiAJUEI4X1BGX1NEMl9DTUQsCiAJUEI5X1BGX1NEMl9DTEssCi0JR1BJT19QT1JUQyB8IDI4IHwgR1BJT19HUElPIHwgR1BJT19JTiwgLyogY2FyZCBkZXRlY3QgKi8KIAkvKiBkaXNwbGF5ICovCiAJUEE1X1BGX0xTQ0xLLAogCVBBNl9QRl9MRDAsCkBAIC0yMjgsNiArMjI3LDcgQEAKIAkJCSJQQ005NzAiKTsKIAogCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19mYl9kZXZpY2UsICZwY20wMzhfZmJfZGF0YSk7CisJbXhjX2dwaW9fbW9kZShHUElPX1BPUlRDIHwgMjggfCBHUElPX0dQSU8gfCBHUElPX0lOKTsKIAlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfc2RoY19kZXZpY2UxLCAmc2RoY19wZGF0YSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwY205NzBfc2phMTAwMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MjUvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1teDI1L2RldmljZXMuYwppbmRleCBlYjEyZGUxLi42MzUxMWRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14MjUvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyNS9kZXZpY2VzLmMKQEAgLTEsNCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IFNhc2NoYSBIYXVlciwgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvbXgyNS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDI1L214MjVwZGsuYyBiL2FyY2gvYXJtL21hY2gtbXgyNS9teDI1cGRrLmMKaW5kZXggOTJhYTRmZC4uZDIzYWU1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDI1L214MjVwZGsuYworKysgYi9hcmNoL2FybS9tYWNoLW14MjUvbXgyNXBkay5jCkBAIC0xLDMgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBTYXNjaGEgSGF1ZXIsIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KQEAgLTIzLDE5ICs0MSwxMiBAQAogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwogCi1zdGF0aWMgc3RydWN0IG14Y19uYW5kX3BsYXRmb3JtX2RhdGEgbmFuZF9ib2FyZF9pbmZvID0gewotCS53aWR0aCA9IDEsCi0JLmh3X2VjYyA9IDEsCi19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgyNXBka19pbml0KHZvaWQpCiB7CiAJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOwogCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2JoMiwgTlVMTCk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX25hbmRfZGV2aWNlLCAmbmFuZF9ib2FyZF9pbmZvKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgyNXBka190aW1lcl9pbml0KHZvaWQpCiB7CiAJbXgyNV9jbG9ja3NfaW5pdCgyNjAwMDAwMCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9jbG9jay1pbXgzNS5jIGIvYXJjaC9hcm0vbWFjaC1teDMvY2xvY2staW14MzUuYwppbmRleCBmZTVjNDIxLi5jNTk1MjYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9jbG9jay1pbXgzNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL2Nsb2NrLWlteDM1LmMKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMSIsICJ1c2IiLCB1c2JvdGdfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMiIsICJ1c2IiLCB1c2JvdGdfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiZnNsLXVzYjItdWRjIiwgInVzYiIsIHVzYm90Z19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJteGNfd2R0LjAiLCBOVUxMLCB3ZG9nX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC13ZHQuMCIsIE5VTEwsIHdkb2dfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAibWF4IiwgbWF4X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImFkbXV4IiwgYWRtdXhfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY3NpIiwgY3NpX2NsaykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLW14My9jbG9jay5jCmluZGV4IDA2YmQ2MTguLmIyYTNiY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvY2xvY2suYwpAQCAtNTMwLDcgKzUzMCw3IEBACiAJX1JFR0lTVEVSX0NMT0NLKCJzcGlfaW14LjIiLCBOVUxMLCBjc3BpM19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQiLCBncHRfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicHdtIiwgcHdtX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIndkb2ciLCB3ZG9nX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteC13ZHQuMCIsIE5VTEwsIHdkb2dfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicnRjIiwgcnRjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImVwaXQiLCBlcGl0MV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJlcGl0IiwgZXBpdDJfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jCmluZGV4IDhhNTc3ZjMuLmU2YWJlMTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogICogU1BJIG1hc3RlciBjb250cm9sbGVyCiAgKiAzIGNoYW5uZWxzCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3NwaV8wX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfc3BpXzBfcmVzb3VyY2VzW10gPSB7CiAJewogCSAgICAgICAuc3RhcnQgPSBDU1BJMV9CQVNFX0FERFIsCiAJICAgICAgIC5lbmQgPSBDU1BJMV9CQVNFX0FERFIgKyBTWl80SyAtIDEsCkBAIC00NzEsNyArNDcxLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfc3BpXzFfcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19zcGlfMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IENTUEkyX0JBU0VfQUREUiwKIAkJLmVuZCA9IENTUEkyX0JBU0VfQUREUiArIFNaXzRLIC0gMSwKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGlteF9zcGlfMl9yZXNvdXJjZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX3NwaV8yX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gQ1NQSTNfQkFTRV9BRERSLAogCQkuZW5kID0gQ1NQSTNfQkFTRV9BRERSICsgU1pfNEsgLSAxLApAQCAtNDk1LDI1ICs0OTUsMjUgQEAKIAl9LAogfTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3BpX2RldmljZTAgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19zcGlfZGV2aWNlMCA9IHsKIAkubmFtZSA9ICJzcGlfaW14IiwKIAkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShpbXhfc3BpXzBfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBpbXhfc3BpXzBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfc3BpXzBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBteGNfc3BpXzBfcmVzb3VyY2VzLAogfTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3BpX2RldmljZTEgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19zcGlfZGV2aWNlMSA9IHsKIAkubmFtZSA9ICJzcGlfaW14IiwKIAkuaWQgPSAxLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShpbXhfc3BpXzFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBpbXhfc3BpXzFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfc3BpXzFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBteGNfc3BpXzFfcmVzb3VyY2VzLAogfTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3BpX2RldmljZTIgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19zcGlfZGV2aWNlMiA9IHsKIAkubmFtZSA9ICJzcGlfaW14IiwKIAkuaWQgPSAyLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShpbXhfc3BpXzJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBpbXhfc3BpXzJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfc3BpXzJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBteGNfc3BpXzJfcmVzb3VyY2VzLAogfTsKIAogI2lmZGVmIENPTkZJR19BUkNIX01YMzUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuaAppbmRleCA3OWYyYmU0Li5hYjg3NDE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5oCkBAIC0yMCw3ICsyMCw3IEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiaDE7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiaDI7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfcm5nYV9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3BpX2RldmljZTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3BpX2RldmljZTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfc3BpX2RldmljZTI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc3BpX2RldmljZTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc3BpX2RldmljZTE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfc3BpX2RldmljZTI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21tLmMgYi9hcmNoL2FybS9tYWNoLW14My9tbS5jCmluZGV4IGFkNWExMTIuLmJlZGY1YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL21tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbW0uYwpAQCAtODEsNiArODEsNyBAQAogCWlvdGFibGVfaW5pdChteGNfaW9fZGVzYywgQVJSQVlfU0laRShteGNfaW9fZGVzYykpOwogfQogCisjaWZkZWYgQ09ORklHX0FSQ0hfTVgzNQogdm9pZCBfX2luaXQgbXgzNV9tYXBfaW8odm9pZCkKIHsKIAlteGNfc2V0X2NwdV90eXBlKE1YQ19DUFVfTVgzNSk7CkBAIC04OSw2ICs5MCw3IEBACiAKIAlpb3RhYmxlX2luaXQobXhjX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXhjX2lvX2Rlc2MpKTsKIH0KKyNlbmRpZgogCiB2b2lkIF9faW5pdCBteDMxX2luaXRfaXJxKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5zOXh4eC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1uczl4eHgvY2xvY2suYwppbmRleCA0NGVkMjBkLi5jZjgxY2JjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5zOXh4eC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtbnM5eHh4L2Nsb2NrLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBjbGtfZGVidWdmc19zaG93LCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2xrX2RlYnVnZnNfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNsa19kZWJ1Z2ZzX29wZXJhdGlvbnMgPSB7CiAJLm9wZW4gPSBjbGtfZGVidWdmc19vcGVuLAogCS5yZWFkID0gc2VxX3JlYWQsCiAJLmxsc2VlayA9IHNlcV9sc2VlaywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jCmluZGV4IDQyOTIwZjkuLjhhZDVjYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1hbXMtZGVsdGEuYwpAQCAtMjE5LDYgKzIxOSwxMCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgYW1zX2RlbHRhX2luaXQodm9pZCkKIHsKKwkvKiBtdXggcGlucyBmb3IgdWFydHMgKi8KKwlvbWFwX2NmZ19yZWcoVUFSVDFfVFgpOworCW9tYXBfY2ZnX3JlZyhVQVJUMV9SVFMpOworCiAJaW90YWJsZV9pbml0KGFtc19kZWx0YV9pb19kZXNjLCBBUlJBWV9TSVpFKGFtc19kZWx0YV9pb19kZXNjKSk7CiAKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IGFtc19kZWx0YV9jb25maWc7CkBAIC0yMzEsNiArMjM1LDggQEAKIAogCW9tYXBfdXNiX2luaXQoJmFtc19kZWx0YV91c2JfY29uZmlnKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhbXNfZGVsdGFfZGV2aWNlcywgQVJSQVlfU0laRShhbXNfZGVsdGFfZGV2aWNlcykpOworCisJb21hcF93cml0ZXcob21hcF9yZWFkdyhBUk1fUlNUQ1QxKSB8IDB4MDAwNCwgQVJNX1JTVENUMSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgYW1zX2RlbHRhX21vZGVtX3BvcnRzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCmluZGV4IGZiNDcyMzkuLjZjOGE0MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCkBAIC02NCw2ICs2NCwxNCBAQAogewogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCiAJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCS8qIG11eCBwaW5zIGZvciB1YXJ0cyAqLworCQlvbWFwX2NmZ19yZWcoVUFSVDFfVFgpOworCQlvbWFwX2NmZ19yZWcoVUFSVDFfUlRTKTsKKwkJb21hcF9jZmdfcmVnKFVBUlQyX1RYKTsKKwkJb21hcF9jZmdfcmVnKFVBUlQyX1JUUyk7CisJCW9tYXBfY2ZnX3JlZyhVQVJUM19UWCk7CisJCW9tYXBfY2ZnX3JlZyhVQVJUM19SWCk7CisKIAkJb21hcF91c2JfaW5pdCgmZ2VuZXJpYzE1MTBfdXNiX2NvbmZpZyk7CiAJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwppbmRleCBjYzJhYmJiLi5jZDZjMzk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKQEAgLTM3Niw2ICszNzYsMjYgQEAKIHsKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAogCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQl1bnNpZ25lZCBjaGFyIHJlZzsKKworCQkvKiBtdXggcGlucyBmb3IgdWFydHMgKi8KKwkJb21hcF9jZmdfcmVnKFVBUlQxX1RYKTsKKwkJb21hcF9jZmdfcmVnKFVBUlQxX1JUUyk7CisJCW9tYXBfY2ZnX3JlZyhVQVJUMl9UWCk7CisJCW9tYXBfY2ZnX3JlZyhVQVJUMl9SVFMpOworCQlvbWFwX2NmZ19yZWcoVUFSVDNfVFgpOworCQlvbWFwX2NmZ19yZWcoVUFSVDNfUlgpOworCisJCXJlZyA9IGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJcmVnIHw9IE9NQVAxNTEwX0ZQR0FfUENSX0NPTTFfRU47CisJCWZwZ2Ffd3JpdGUocmVnLCBPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJdWRlbGF5KDEwKTsKKworCQlyZWcgPSBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUik7CisJCXJlZyB8PSBPTUFQMTUxMF9GUEdBX1BDUl9DT00yX0VOOworCQlmcGdhX3dyaXRlKHJlZywgT01BUDE1MTBfRlBHQV9QT1dFUik7CisJCXVkZWxheSgxMCk7CisKIAkJcGxhdGZvcm1fYWRkX2RldmljZXMoaW5ub3ZhdG9yMTUxMF9kZXZpY2VzLCBBUlJBWV9TSVpFKGlubm92YXRvcjE1MTBfZGV2aWNlcykpOwogCQlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhpbm5vdmF0b3IxNTEwX2JvYXJkaW5mbywKIAkJCQlBUlJBWV9TSVpFKGlubm92YXRvcjE1MTBfYm9hcmRpbmZvKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYwppbmRleCA5MGRkMDQzLi40ZGUyNTg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXRlLmMKQEAgLTM0Miw2ICszNDIsMTQgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGFsbXRlX2luaXQodm9pZCkKIHsKKwkvKiBtdXggcGlucyBmb3IgdWFydHMgKi8KKwlvbWFwX2NmZ19yZWcoVUFSVDFfVFgpOworCW9tYXBfY2ZnX3JlZyhVQVJUMV9SVFMpOworCW9tYXBfY2ZnX3JlZyhVQVJUMl9UWCk7CisJb21hcF9jZmdfcmVnKFVBUlQyX1JUUyk7CisJb21hcF9jZmdfcmVnKFVBUlQzX1RYKTsKKwlvbWFwX2NmZ19yZWcoVUFSVDNfUlgpOworCiAJb21hcF9ib2FyZF9jb25maWcgPSBwYWxtdGVfY29uZmlnOwogCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHBhbG10ZV9jb25maWcpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10dC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdHQuYwppbmRleCA4MjU2MTM5Li5kOTcyY2Y5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10dC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXR0LmMKQEAgLTI4OSw2ICsyODksMTQgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGFsbXR0X2luaXQodm9pZCkKIHsKKwkvKiBtdXggcGlucyBmb3IgdWFydHMgKi8KKwlvbWFwX2NmZ19yZWcoVUFSVDFfVFgpOworCW9tYXBfY2ZnX3JlZyhVQVJUMV9SVFMpOworCW9tYXBfY2ZnX3JlZyhVQVJUMl9UWCk7CisJb21hcF9jZmdfcmVnKFVBUlQyX1JUUyk7CisJb21hcF9jZmdfcmVnKFVBUlQzX1RYKTsKKwlvbWFwX2NmZ19yZWcoVUFSVDNfUlgpOworCiAJb21hcF9tcHVfd2R0X21vZGUoMCk7CiAKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IHBhbG10dF9jb25maWc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXo3MS5jCmluZGV4IDgxYjZiZGUuLjk4NmJkNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXo3MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXo3MS5jCkBAIC0zMDcsNiArMzA3LDE0IEBACiBzdGF0aWMgdm9pZCBfX2luaXQKIG9tYXBfcGFsbXo3MV9pbml0KHZvaWQpCiB7CisJLyogbXV4IHBpbnMgZm9yIHVhcnRzICovCisJb21hcF9jZmdfcmVnKFVBUlQxX1RYKTsKKwlvbWFwX2NmZ19yZWcoVUFSVDFfUlRTKTsKKwlvbWFwX2NmZ19yZWcoVUFSVDJfVFgpOworCW9tYXBfY2ZnX3JlZyhVQVJUMl9SVFMpOworCW9tYXBfY2ZnX3JlZyhVQVJUM19UWCk7CisJb21hcF9jZmdfcmVnKFVBUlQzX1JYKTsKKwogCXBhbG16NzFfZ3Bpb19zZXR1cCgxKTsKIAlvbWFwX21wdV93ZHRfbW9kZSgwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMKaW5kZXggMDJjODVjYS4uMDU2YWU2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS5jCkBAIC0zNzcsNiArMzc3LDE0IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3N4MV9pbml0KHZvaWQpCiB7CisJLyogbXV4IHBpbnMgZm9yIHVhcnRzICovCisJb21hcF9jZmdfcmVnKFVBUlQxX1RYKTsKKwlvbWFwX2NmZ19yZWcoVUFSVDFfUlRTKTsKKwlvbWFwX2NmZ19yZWcoVUFSVDJfVFgpOworCW9tYXBfY2ZnX3JlZyhVQVJUMl9SVFMpOworCW9tYXBfY2ZnX3JlZyhVQVJUM19UWCk7CisJb21hcF9jZmdfcmVnKFVBUlQzX1JYKTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHN4MV9kZXZpY2VzLCBBUlJBWV9TSVpFKHN4MV9kZXZpY2VzKSk7CiAKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IHN4MV9jb25maWc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwppbmRleCBjMDZlN2E1Li4wN2IwNzUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKQEAgLTE1Miw2ICsxNTIsMTQgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9pbml0KHZvaWQpCiB7CisJLyogbXV4IHBpbnMgZm9yIHVhcnRzICovCisJb21hcF9jZmdfcmVnKFVBUlQxX1RYKTsKKwlvbWFwX2NmZ19yZWcoVUFSVDFfUlRTKTsKKwlvbWFwX2NmZ19yZWcoVUFSVDJfVFgpOworCW9tYXBfY2ZnX3JlZyhVQVJUMl9SVFMpOworCW9tYXBfY2ZnX3JlZyhVQVJUM19UWCk7CisJb21hcF9jZmdfcmVnKFVBUlQzX1JYKTsKKwogCS8qIFdhdGNoZG9nICovCiAJZ3Bpb19yZXF1ZXN0KDAsICJXYXRjaGRvZyIpOwogCS8qIHNtYzkxeCByZXNldCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jCmluZGV4IDRlZjI2ZmEuLmU1ZGNkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaWQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAl7IC5qdGFnX2lkID0gMHhiNTc0LCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzEwMzE1LCAudHlwZSA9IDB4MDMxMDAwMDB9LAogCXsgLmp0YWdfaWQgPSAweDM1NWYsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAwMDAsIC50eXBlID0gMHgwNzMwMDEwMH0sCiAJeyAuanRhZ19pZCA9IDB4YjU1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDA3MzAwMzAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNTVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwNTAwLCAudHlwZSA9IDB4MDg1MDAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2MmMsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMjA1MDAsIC50eXBlID0gMHgwODUwMDAwMH0sCiAJeyAuanRhZ19pZCA9IDB4YjQ3MCwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMxMDEwMCwgLnR5cGUgPSAweDE1MTAwMDAwfSwKIAl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MTYxMDAwMDB9LAogCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMjAxMDAsIC50eXBlID0gMHgxNjExMDAwMH0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYwppbmRleCBkNDk2ZTUwLi5kMjM5NzliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKQEAgLTEzMSw4ICsxMzEsNiBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBPTUFQX01BWF9OUl9QT1JUUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGNoYXIgcmVnOwotCiAJCXN3aXRjaCAoaSkgewogCQljYXNlIDA6CiAJCQl1YXJ0MV9jayA9IGNsa19nZXQoTlVMTCwgInVhcnQxX2NrIik7CkBAIC0xNDMsMTYgKzE0MSw2IEBACiAJCQkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKQogCQkJCQljbGtfc2V0X3JhdGUodWFydDFfY2ssIDEyMDAwMDAwKTsKIAkJCX0KLQkJCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMV9UWCk7Ci0JCQkJb21hcF9jZmdfcmVnKFVBUlQxX1JUUyk7Ci0JCQkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSkgewotCQkJCQlyZWcgPSBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXJlZyB8PSBPTUFQMTUxMF9GUEdBX1BDUl9DT00xX0VOOwotCQkJCQlmcGdhX3dyaXRlKHJlZywgT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXVkZWxheSgxMCk7Ci0JCQkJfQotCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgMToKIAkJCXVhcnQyX2NrID0gY2xrX2dldChOVUxMLCAidWFydDJfY2siKTsKQEAgLTE2NSwxNiArMTUzLDYgQEAKIAkJCQllbHNlCiAJCQkJCWNsa19zZXRfcmF0ZSh1YXJ0Ml9jaywgNDgwMDAwMDApOwogCQkJfQotCQkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7Ci0JCQkJb21hcF9jZmdfcmVnKFVBUlQyX1RYKTsKLQkJCQlvbWFwX2NmZ19yZWcoVUFSVDJfUlRTKTsKLQkJCQlpZiAobWFjaGluZV9pc19vbWFwX2lubm92YXRvcigpKSB7Ci0JCQkJCXJlZyA9IGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1BPV0VSKTsKLQkJCQkJcmVnIHw9IE9NQVAxNTEwX0ZQR0FfUENSX0NPTTJfRU47Ci0JCQkJCWZwZ2Ffd3JpdGUocmVnLCBPTUFQMTUxMF9GUEdBX1BPV0VSKTsKLQkJCQkJdWRlbGF5KDEwKTsKLQkJCQl9Ci0JCQl9CiAJCQlicmVhazsKIAkJY2FzZSAyOgogCQkJdWFydDNfY2sgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0M19jayIpOwpAQCAtMTg1LDEwICsxNjMsNiBAQAogCQkJCWlmIChjcHVfaXNfb21hcDE1eHgoKSkKIAkJCQkJY2xrX3NldF9yYXRlKHVhcnQzX2NrLCAxMjAwMDAwMCk7CiAJCQl9Ci0JCQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKLQkJCQlvbWFwX2NmZ19yZWcoVUFSVDNfVFgpOwotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUM19SWCk7Ci0JCQl9CiAJCQlicmVhazsKIAkJfQogCQlvbWFwX3NlcmlhbF9yZXNldCgmc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCmluZGV4IDc1YjFjN2UuLmFhZDE5NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKQEAgLTczLDkgKzczLDIxIEBACiAJYm9vbCAiT01BUCAzNDMwIFNEUCBib2FyZCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAogCitjb25maWcgTUFDSF9OT0tJQV9OODAwCisgICAgICAgYm9vbAorCitjb25maWcgTUFDSF9OT0tJQV9OODEwCisgICAgICAgYm9vbAorCitjb25maWcgTUFDSF9OT0tJQV9OODEwX1dJTUFYCisgICAgICAgYm9vbAorCiBjb25maWcgTUFDSF9OT0tJQV9OOFgwCiAJYm9vbCAiTm9raWEgTjgwMC9OODEwIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMjQyMAorCXNlbGVjdCBNQUNIX05PS0lBX044MDAKKwlzZWxlY3QgTUFDSF9OT0tJQV9OODEwCisJc2VsZWN0IE1BQ0hfTk9LSUFfTjgxMF9XSU1BWAogCiBjb25maWcgTUFDSF9OT0tJQV9SWDUxCiAJYm9vbCAiTm9raWEgUlgtNTEgYm9hcmQiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCmluZGV4IGJkNTdlYzcuLjBhY2I1NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgpAQCAtMzgsNyArMzksNiBAQAogI2luY2x1ZGUgPG1hY2gvZ3BtYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8bWFjaC9rZXlwYWQuaD4KICNpbmNsdWRlIDxtYWNoL2dwbWMtc21jOTF4Lmg+CiAKICNpbmNsdWRlICJzZHJhbS1xaW1vbmRhLWh5YjE4bTUxMjE2MGFmLTYuaCIKQEAgLTU0LDcgKzU0LDcgQEAKIAogI2RlZmluZSBUV0w0MDMwX01TRUNVUkVfR1BJTyAyMgogCi1zdGF0aWMgaW50IHNkcDM0MzBfa2V5bWFwW10gPSB7CitzdGF0aWMgaW50IGJvYXJkX2tleW1hcFtdID0gewogCUtFWSgwLCAwLCBLRVlfTEVGVCksCiAJS0VZKDAsIDEsIEtFWV9SSUdIVCksCiAJS0VZKDAsIDIsIEtFWV9BKSwKQEAgLTg4LDExICs4OCwxNSBAQAogCTAKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIGJvYXJkX21hcF9kYXRhID0geworCS5rZXltYXAJCQk9IGJvYXJkX2tleW1hcCwKKwkua2V5bWFwX3NpemUJCT0gQVJSQVlfU0laRShib2FyZF9rZXltYXApLAorfTsKKwogc3RhdGljIHN0cnVjdCB0d2w0MDMwX2tleXBhZF9kYXRhIHNkcDM0MzBfa3BfZGF0YSA9IHsKKwkua2V5bWFwX2RhdGEJPSAmYm9hcmRfbWFwX2RhdGEsCiAJLnJvd3MJCT0gNSwKIAkuY29scwkJPSA2LAotCS5rZXltYXAJCT0gc2RwMzQzMF9rZXltYXAsCi0JLmtleW1hcHNpemUJPSBBUlJBWV9TSVpFKHNkcDM0MzBfa2V5bWFwKSwKIAkucmVwCQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCmluZGV4IGViMzdjNDAuLjYwOWE1YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCkBAIC01OCw2ICs1OCw4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwXzQ0MzBzZHBfaW5pdF9pcnEodm9pZCkKIHsKKwlvbWFwX2JvYXJkX2NvbmZpZyA9IHNkcDQ0MzBfY29uZmlnOworCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHNkcDQ0MzBfY29uZmlnKTsKIAlvbWFwMl9pbml0X2NvbW1vbl9odyhOVUxMLCBOVUxMKTsKICNpZmRlZiBDT05GSUdfT01BUF8zMktfVElNRVIKIAlvbWFwMl9ncF9jbG9ja2V2ZW50X3NldF9ncHRpbWVyKDEpOwpAQCAtNzAsOCArNzIsNiBAQAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfNDQzMHNkcF9pbml0KHZvaWQpCiB7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc2RwNDQzMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNkcDQ0MzBfZGV2aWNlcykpOwotCW9tYXBfYm9hcmRfY29uZmlnID0gc2RwNDQzMF9jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoc2RwNDQzMF9jb25maWcpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKaW5kZXggZWM2ODU0Yy4uZDU3ZWMyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTQxLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxtYWNoL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxtYWNoL3VzYi5oPgotI2luY2x1ZGUgPG1hY2gva2V5cGFkLmg+CiAKICNpbmNsdWRlICJtbWMtdHdsNDAzMC5oIgogCkBAIC04MCw3ICs4MCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgbGRwX3R3bDQwMzBfa2V5bWFwW10gPSB7CitzdGF0aWMgaW50IGJvYXJkX2tleW1hcFtdID0gewogCUtFWSgwLCAwLCBLRVlfMSksCiAJS0VZKDEsIDAsIEtFWV8yKSwKIAlLRVkoMiwgMCwgS0VZXzMpLApAQCAtMTAxLDExICsxMDEsMTUgQEAKIAkwCiB9OwogCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBib2FyZF9tYXBfZGF0YSA9IHsKKwkua2V5bWFwCQkJPSBib2FyZF9rZXltYXAsCisJLmtleW1hcF9zaXplCQk9IEFSUkFZX1NJWkUoYm9hcmRfa2V5bWFwKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9rZXlwYWRfZGF0YSBsZHBfa3BfdHdsNDAzMF9kYXRhID0geworCS5rZXltYXBfZGF0YQk9ICZib2FyZF9tYXBfZGF0YSwKIAkucm93cwkJPSA2LAogCS5jb2xzCQk9IDYsCi0JLmtleW1hcAkJPSBsZHBfdHdsNDAzMF9rZXltYXAsCi0JLmtleW1hcHNpemUJPSBBUlJBWV9TSVpFKGxkcF90d2w0MDMwX2tleW1hcCksCiAJLnJlcAkJPSAxLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCmluZGV4IDUwMGM5OTUuLjcwZGY2YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKQEAgLTEzOSw4ICsxMzksMTMgQEAKIHN0YXRpYyBpbnQgYmVhZ2xlX3R3bF9ncGlvX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8pCiB7CisJaWYgKHN5c3RlbV9yZXYgPj0gMHgyMCAmJiBzeXN0ZW1fcmV2IDw9IDB4MzQzMDEwMDApIHsKKwkJb21hcF9jZmdfcmVnKEFHOV8zNFhYX0dQSU8yMyk7CisJCW1tY1swXS5ncGlvX3dwID0gMjM7CisJfSBlbHNlIHsKKwkJb21hcF9jZmdfcmVnKEFIOF8zNFhYX0dQSU8yOSk7CisJfQogCS8qIGdwaW8gKyAwIGlzICJtbWMwX2NkIiAoaW5wdXQvSVJRKSAqLwotCW9tYXBfY2ZnX3JlZyhBSDhfMzRYWF9HUElPMjkpOwogCW1tY1swXS5ncGlvX2NkID0gZ3BpbyArIDA7CiAJdHdsNDAzMF9tbWNfaW5pdChtbWMpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMKaW5kZXggZDUwYjliZS4uNGM0ZDdmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNldm0uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CkBAIC0zNyw3ICszOCw2IEBACiAjaW5jbHVkZSA8bWFjaC91c2IuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvbWNzcGkuaD4KLSNpbmNsdWRlIDxtYWNoL2tleXBhZC5oPgogCiAjaW5jbHVkZSAic2RyYW0tbWljcm9uLW10NDZoMzJtMzJsZi02LmgiCiAjaW5jbHVkZSAibW1jLXR3bDQwMzAuaCIKQEAgLTE1OSw3ICsxNTksNyBAQAogCS51c2JfbW9kZQk9IFQyX1VTQl9NT0RFX1VMUEksCiB9OwogCi1zdGF0aWMgaW50IG9tYXAzZXZtX2tleW1hcFtdID0geworc3RhdGljIGludCBib2FyZF9rZXltYXBbXSA9IHsKIAlLRVkoMCwgMCwgS0VZX0xFRlQpLAogCUtFWSgwLCAxLCBLRVlfUklHSFQpLAogCUtFWSgwLCAyLCBLRVlfQSksCkBAIC0xNzgsMTEgKzE3OCwxNSBAQAogCUtFWSgzLCAzLCBLRVlfUCkKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIGJvYXJkX21hcF9kYXRhID0geworCS5rZXltYXAJCQk9IGJvYXJkX2tleW1hcCwKKwkua2V5bWFwX3NpemUJCT0gQVJSQVlfU0laRShib2FyZF9rZXltYXApLAorfTsKKwogc3RhdGljIHN0cnVjdCB0d2w0MDMwX2tleXBhZF9kYXRhIG9tYXAzZXZtX2twX2RhdGEgPSB7CisJLmtleW1hcF9kYXRhCT0gJmJvYXJkX21hcF9kYXRhLAogCS5yb3dzCQk9IDQsCiAJLmNvbHMJCT0gNCwKLQkua2V5bWFwCQk9IG9tYXAzZXZtX2tleW1hcCwKLQkua2V5bWFwc2l6ZQk9IEFSUkFZX1NJWkUob21hcDNldm1fa2V5bWFwKSwKIAkucmVwCQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYwppbmRleCBiNDNmNmUzLi41MzI2ZTBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0zOSw3ICs0MCw2IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbWNzcGkuaD4KICNpbmNsdWRlIDxtYWNoL3VzYi5oPgotI2luY2x1ZGUgPG1hY2gva2V5cGFkLmg+CiAjaW5jbHVkZSA8bWFjaC9tdXguaD4KIAogI2luY2x1ZGUgInNkcmFtLW1pY3Jvbi1tdDQ2aDMybTMybGYtNi5oIgpAQCAtMTMzLDcgKzEzMyw3IEBACiAJb21hcF9zZXRfZ3Bpb19kZWJvdW5jZV90aW1lKDMyICogNSwgR1BJT19ERUJPVU5DRV9USU1FKTsKIH0KIAotc3RhdGljIGludCBwYW5kb3JhX2tleXBhZF9tYXBbXSA9IHsKK3N0YXRpYyBpbnQgYm9hcmRfa2V5bWFwW10gPSB7CiAJLyogY29sLCByb3csIGNvZGUgKi8KIAlLRVkoMCwgMCwgS0VZXzkpLAogCUtFWSgwLCAxLCBLRVlfMCksCkBAIC0xODAsMTEgKzE4MCwxNSBAQAogCUtFWSg1LCAyLCBLRVlfRk4pLAogfTsKIAorc3RhdGljIHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgYm9hcmRfbWFwX2RhdGEgPSB7CisJLmtleW1hcAkJCT0gYm9hcmRfa2V5bWFwLAorCS5rZXltYXBfc2l6ZQkJPSBBUlJBWV9TSVpFKGJvYXJkX2tleW1hcCksCit9OworCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfa2V5cGFkX2RhdGEgcGFuZG9yYV9rcF9kYXRhID0geworCS5rZXltYXBfZGF0YQk9ICZib2FyZF9tYXBfZGF0YSwKIAkucm93cwkJPSA4LAogCS5jb2xzCQk9IDYsCi0JLmtleW1hcAkJPSBwYW5kb3JhX2tleXBhZF9tYXAsCi0JLmtleW1hcHNpemUJPSBBUlJBWV9TSVpFKHBhbmRvcmFfa2V5cGFkX21hcCksCiAJLnJlcAkJPSAxLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwppbmRleCBlNmU4MjkwLi5lMzRkOTZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KQEAgLTI3LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9ncG1jLmg+Ci0jaW5jbHVkZSA8bWFjaC9rZXlwYWQuaD4KICNpbmNsdWRlIDxtYWNoL29uZW5hbmQuaD4KICNpbmNsdWRlIDxtYWNoL2dwbWMtc21jOTF4Lmg+CiAKQEAgLTM2LDU4ICszNiw2MiBAQAogI2RlZmluZSBTWVNURU1fUkVWX0JfVVNFU19WQVVYMwkweDE2OTkKICNkZWZpbmUgU1lTVEVNX1JFVl9TX1VTRVNfVkFVWDMgMHg4CiAKLXN0YXRpYyBpbnQgcng1MV9rZXltYXBbXSA9IHsKK3N0YXRpYyBpbnQgYm9hcmRfa2V5bWFwW10gPSB7CiAJS0VZKDAsIDAsIEtFWV9RKSwKLQlLRVkoMCwgMSwgS0VZX1cpLAotCUtFWSgwLCAyLCBLRVlfRSksCi0JS0VZKDAsIDMsIEtFWV9SKSwKLQlLRVkoMCwgNCwgS0VZX1QpLAotCUtFWSgwLCA1LCBLRVlfWSksCi0JS0VZKDAsIDYsIEtFWV9VKSwKLQlLRVkoMCwgNywgS0VZX0kpLAotCUtFWSgxLCAwLCBLRVlfTyksCisJS0VZKDAsIDEsIEtFWV9PKSwKKwlLRVkoMCwgMiwgS0VZX1ApLAorCUtFWSgwLCAzLCBLRVlfQ09NTUEpLAorCUtFWSgwLCA0LCBLRVlfQkFDS1NQQUNFKSwKKwlLRVkoMCwgNiwgS0VZX0EpLAorCUtFWSgwLCA3LCBLRVlfUyksCisJS0VZKDEsIDAsIEtFWV9XKSwKIAlLRVkoMSwgMSwgS0VZX0QpLAotCUtFWSgxLCAyLCBLRVlfRE9UKSwKLQlLRVkoMSwgMywgS0VZX1YpLAotCUtFWSgxLCA0LCBLRVlfRE9XTiksCi0JS0VZKDIsIDAsIEtFWV9QKSwKLQlLRVkoMiwgMSwgS0VZX0YpLAorCUtFWSgxLCAyLCBLRVlfRiksCisJS0VZKDEsIDMsIEtFWV9HKSwKKwlLRVkoMSwgNCwgS0VZX0gpLAorCUtFWSgxLCA1LCBLRVlfSiksCisJS0VZKDEsIDYsIEtFWV9LKSwKKwlLRVkoMSwgNywgS0VZX0wpLAorCUtFWSgyLCAwLCBLRVlfRSksCisJS0VZKDIsIDEsIEtFWV9ET1QpLAogCUtFWSgyLCAyLCBLRVlfVVApLAotCUtFWSgyLCAzLCBLRVlfQiksCi0JS0VZKDIsIDQsIEtFWV9SSUdIVCksCi0JS0VZKDMsIDAsIEtFWV9DT01NQSksCi0JS0VZKDMsIDEsIEtFWV9HKSwKLQlLRVkoMywgMiwgS0VZX0VOVEVSKSwKKwlLRVkoMiwgMywgS0VZX0VOVEVSKSwKKwlLRVkoMiwgNSwgS0VZX1opLAorCUtFWSgyLCA2LCBLRVlfWCksCisJS0VZKDIsIDcsIEtFWV9DKSwKKwlLRVkoMywgMCwgS0VZX1IpLAorCUtFWSgzLCAxLCBLRVlfViksCisJS0VZKDMsIDIsIEtFWV9CKSwKIAlLRVkoMywgMywgS0VZX04pLAotCUtFWSg0LCAwLCBLRVlfQkFDS1NQQUNFKSwKLQlLRVkoNCwgMSwgS0VZX0gpLAotCUtFWSg0LCAzLCBLRVlfTSksCisJS0VZKDMsIDQsIEtFWV9NKSwKKwlLRVkoMywgNSwgS0VZX1NQQUNFKSwKKwlLRVkoMywgNiwgS0VZX1NQQUNFKSwKKwlLRVkoMywgNywgS0VZX0xFRlQpLAorCUtFWSg0LCAwLCBLRVlfVCksCisJS0VZKDQsIDEsIEtFWV9ET1dOKSwKKwlLRVkoNCwgMiwgS0VZX1JJR0hUKSwKIAlLRVkoNCwgNCwgS0VZX0xFRlRDVFJMKSwKLQlLRVkoNSwgMSwgS0VZX0opLAotCUtFWSg1LCAyLCBLRVlfWiksCi0JS0VZKDUsIDMsIEtFWV9TUEFDRSksCi0JS0VZKDUsIDQsIEtFWV9MRUZUU0hJRlQpLAotCUtFWSg2LCAwLCBLRVlfQSksCi0JS0VZKDYsIDEsIEtFWV9LKSwKLQlLRVkoNiwgMiwgS0VZX1gpLAotCUtFWSg2LCAzLCBLRVlfU1BBQ0UpLAotCUtFWSg2LCA0LCBLRVlfRk4pLAotCUtFWSg3LCAwLCBLRVlfUyksCi0JS0VZKDcsIDEsIEtFWV9MKSwKLQlLRVkoNywgMiwgS0VZX0MpLAotCUtFWSg3LCAzLCBLRVlfTEVGVCksCi0JS0VZKDB4ZmYsIDAsIEtFWV9GNiksCi0JS0VZKDB4ZmYsIDEsIEtFWV9GNyksCi0JS0VZKDB4ZmYsIDIsIEtFWV9GOCksCi0JS0VZKDB4ZmYsIDQsIEtFWV9GOSksCi0JS0VZKDB4ZmYsIDUsIEtFWV9GMTApLAorCUtFWSg0LCA1LCBLRVlfUklHSFRBTFQpLAorCUtFWSg0LCA2LCBLRVlfTEVGVFNISUZUKSwKKwlLRVkoNSwgMCwgS0VZX1kpLAorCUtFWSg2LCAwLCBLRVlfVSksCisJS0VZKDcsIDAsIEtFWV9JKSwKKwlLRVkoNywgMSwgS0VZX0Y3KSwKKwlLRVkoNywgMiwgS0VZX0Y4KSwKKwlLRVkoMHhmZiwgMiwgS0VZX0Y5KSwKKwlLRVkoMHhmZiwgNCwgS0VZX0YxMCksCisJS0VZKDB4ZmYsIDUsIEtFWV9GMTEpLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgYm9hcmRfbWFwX2RhdGEgPSB7CisJLmtleW1hcAkJCT0gYm9hcmRfa2V5bWFwLAorCS5rZXltYXBfc2l6ZQkJPSBBUlJBWV9TSVpFKGJvYXJkX2tleW1hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfa2V5cGFkX2RhdGEgcng1MV9rcF9kYXRhID0geworCS5rZXltYXBfZGF0YQk9ICZib2FyZF9tYXBfZGF0YSwKIAkucm93cwkJPSA4LAogCS5jb2xzCQk9IDgsCi0JLmtleW1hcAkJPSByeDUxX2tleW1hcCwKLQkua2V5bWFwc2l6ZQk9IEFSUkFZX1NJWkUocng1MV9rZXltYXApLAogCS5yZXAJCT0gMSwKIH07CiAKQEAgLTQ0MCw3ICs0NDQsNyBAQAogCQlyeDUxX3R3bGRhdGEudmF1eDMgPSAmcng1MV92YXV4M19jYW07CiAJCXJ4NTFfdHdsZGF0YS52bW1jMiA9ICZyeDUxX3ZtbWMyOwogCX0KLQlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgMjYwMCwgcng1MV9wZXJpcGhlcmFsc19pMmNfYm9hcmRfaW5mb18xLAorCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygxLCAyMjAwLCByeDUxX3BlcmlwaGVyYWxzX2kyY19ib2FyZF9pbmZvXzEsCiAJCQlBUlJBWV9TSVpFKHJ4NTFfcGVyaXBoZXJhbHNfaTJjX2JvYXJkX2luZm9fMSkpOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygyLCAxMDAsIE5VTEwsIDApOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCA0MDAsIE5VTEwsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYwppbmRleCBmOTE5NmMzLi43ODg2OWE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9rZXlwYWQuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvZ3BtYy5oPgogI2luY2x1ZGUgPG1hY2gvdXNiLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20yLmMKaW5kZXggMzI0MDA5ZS4uZWEwMDQ4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbTIuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgpAQCAtMjIsMTIgKzIzLDEyIEBACiAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvdXNiLmg+Ci0jaW5jbHVkZSA8bWFjaC9rZXlwYWQuaD4KIAogI2luY2x1ZGUgIm1tYy10d2w0MDMwLmgiCisjaW5jbHVkZSAic2RyYW0tbWljcm9uLW10NDZoMzJtMzJsZi02LmgiCiAKIC8qIFpvb20yIGhhcyBRd2VydHkga2V5Ym9hcmQqLwotc3RhdGljIGludCB6b29tMl90d2w0MDMwX2tleW1hcFtdID0geworc3RhdGljIGludCBib2FyZF9rZXltYXBbXSA9IHsKIAlLRVkoMCwgMCwgS0VZX0UpLAogCUtFWSgxLCAwLCBLRVlfUiksCiAJS0VZKDIsIDAsIEtFWV9UKSwKQEAgLTgyLDExICs4MywxNSBAQAogCTAKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIGJvYXJkX21hcF9kYXRhID0geworCS5rZXltYXAJCQk9IGJvYXJkX2tleW1hcCwKKwkua2V5bWFwX3NpemUJCT0gQVJSQVlfU0laRShib2FyZF9rZXltYXApLAorfTsKKwogc3RhdGljIHN0cnVjdCB0d2w0MDMwX2tleXBhZF9kYXRhIHpvb20yX2twX3R3bDQwMzBfZGF0YSA9IHsKKwkua2V5bWFwX2RhdGEJPSAmYm9hcmRfbWFwX2RhdGEsCiAJLnJvd3MJCT0gOCwKIAkuY29scwkJPSA4LAotCS5rZXltYXAJCT0gem9vbTJfdHdsNDAzMF9rZXltYXAsCi0JLmtleW1hcHNpemUJPSBBUlJBWV9TSVpFKHpvb20yX3R3bDQwMzBfa2V5bWFwKSwKIAkucmVwCQk9IDEsCiB9OwogCkBAIC0yMDksNyArMjE0LDggQEAKIHsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IHpvb20yX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRSh6b29tMl9jb25maWcpOwotCW9tYXAyX2luaXRfY29tbW9uX2h3KE5VTEwsIE5VTEwpOworCW9tYXAyX2luaXRfY29tbW9uX2h3KG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCisJCQkJIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwogCW9tYXBfaW5pdF9pcnEoKTsKIAlvbWFwX2dwaW9faW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmMKaW5kZXggYmM1ZDNhYy4uZTJkYmVkZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5jCkBAIC03NjksNiArNzY5LDcgQEAKIAkJaWYgKGMtPmNwdSAmIGNwdV9tYXNrKSB7CiAJCQljbGtkZXZfYWRkKCZjLT5sayk7CiAJCQljbGtfcmVnaXN0ZXIoYy0+bGsuY2xrKTsKKwkJCW9tYXAyX2luaXRfY2xrX2Nsa2RtKGMtPmxrLmNsayk7CiAJCX0KIAogCS8qIENoZWNrIHRoZSBNUFUgcmF0ZSBzZXQgYnkgYm9vdGxvYWRlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmMKaW5kZXggZmFmY2QzMi4uNDg5NTU2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5jCkBAIC0zMzgsNiArMzM4LDEzIEBACiAgKi8KICNkZWZpbmUgU0RSQ19NUFVSQVRFX0xPT1BTCQk5NgogCisvKgorICogRFBMTDVfRlJFUV9GT1JfVVNCSE9TVDogVVNCSE9TVCBhbmQgVVNCVExMIGFyZSB0aGUgb25seSBjbG9ja3MKKyAqIHRoYXQgYXJlIHNvdXJjZWQgYnkgRFBMTDUsIGFuZCBib3RoIG9mIHRoZXNlIHJlcXVpcmUgdGhpcyBjbG9jaworICogdG8gYmUgYXQgMTIwIE1IeiBmb3IgcHJvcGVyIG9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBEUExMNV9GUkVRX0ZPUl9VU0JIT1NUCQkxMjAwMDAwMDAKKwogLyoqCiAgKiBvbWFwMzQzMGVzMl9jbGtfc3NpX2ZpbmRfaWRsZXN0IC0gcmV0dXJuIENNX0lETEVTVCBpbmZvIGZvciBTU0kKICAqIEBjbGs6IHN0cnVjdCBjbGsgKiBiZWluZyBlbmFibGVkCkBAIC0xMDU2LDYgKzEwNjMsMjggQEAKICNlbmRpZgogfQogCitzdGF0aWMgdm9pZCBvbWFwM19jbGtfbG9ja19kcGxsNSh2b2lkKQoreworCXN0cnVjdCBjbGsgKmRwbGw1X2NsazsKKwlzdHJ1Y3QgY2xrICpkcGxsNV9tMl9jbGs7CisKKwlkcGxsNV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJkcGxsNV9jayIpOworCWNsa19zZXRfcmF0ZShkcGxsNV9jbGssIERQTEw1X0ZSRVFfRk9SX1VTQkhPU1QpOworCWNsa19lbmFibGUoZHBsbDVfY2xrKTsKKworCS8qIEVuYWJsZSBhdXRvaWRsZSB0byBhbGxvdyBpdCB0byBlbnRlciBsb3cgcG93ZXIgYnlwYXNzICovCisJb21hcDNfZHBsbF9hbGxvd19pZGxlKGRwbGw1X2Nsayk7CisKKwkvKiBQcm9ncmFtIGRwbGw1X20yX2NsayBkaXZpZGVyIGZvciBubyBkaXZpc2lvbiAqLworCWRwbGw1X20yX2NsayA9IGNsa19nZXQoTlVMTCwgImRwbGw1X20yX2NrIik7CisJY2xrX2VuYWJsZShkcGxsNV9tMl9jbGspOworCWNsa19zZXRfcmF0ZShkcGxsNV9tMl9jbGssIERQTEw1X0ZSRVFfRk9SX1VTQkhPU1QpOworCisJY2xrX2Rpc2FibGUoZHBsbDVfbTJfY2xrKTsKKwljbGtfZGlzYWJsZShkcGxsNV9jbGspOworCXJldHVybjsKK30KKwogLyogUkVWSVNJVDogTW92ZSB0aGlzIGluaXQgc3R1ZmYgb3V0IGludG8gY2xvY2suYyAqLwogCiAvKgpAQCAtMTE0OCw2ICsxMTc3LDEyIEBACiAJICovCiAJY2xrX2VuYWJsZV9pbml0X2Nsb2NrcygpOwogCisJLyoKKwkgKiBMb2NrIERQTEw1IGFuZCBwdXQgaXQgaW4gYXV0b2lkbGUuCisJICovCisJaWYgKG9tYXBfcmV2KCkgPj0gT01BUDM0MzBfUkVWX0VTMl8wKQorCQlvbWFwM19jbGtfbG9ja19kcGxsNSgpOworCiAJLyogQXZvaWQgc2xlZXBpbmcgZHVyaW5nIG9tYXAyX2Nsa19wcmVwYXJlX2Zvcl9yZWJvb3QoKSAqLwogCS8qIFJFVklTSVQ6IG5vdCB5ZXQgcmVhZHkgZm9yIDM0M3ggKi8KICNpZiAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmMKaW5kZXggNGVmN2I0Zi4uNThhZmY4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4uYwpAQCAtMTM3LDYgKzEzNywzNiBAQAogCX0KIH0KIAorLyoKKyAqIF9vbWFwMl9jbGtkbV9zZXRfaHdzdXAgLSBzZXQgdGhlIGh3c3VwIGlkbGUgdHJhbnNpdGlvbiBiaXQKKyAqIEBjbGtkbTogc3RydWN0IGNsb2NrZG9tYWluICoKKyAqIEBlbmFibGU6IGludCAwIHRvIGRpc2FibGUsIDEgdG8gZW5hYmxlCisgKgorICogSW50ZXJuYWwgaGVscGVyIGZvciBhY3R1YWxseSBzd2l0Y2hpbmcgdGhlIGJpdCB0aGF0IGNvbnRyb2xzIGh3c3VwCisgKiBpZGxlIHRyYW5zaXRpb25zIGZvciBjbGtkbS4KKyAqLworc3RhdGljIHZvaWQgX29tYXAyX2Nsa2RtX3NldF9od3N1cChzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtLCBpbnQgZW5hYmxlKQoreworCXUzMiB2OworCisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CisJCWlmIChlbmFibGUpCisJCQl2ID0gT01BUDI0WFhfQ0xLU1RDVFJMX0VOQUJMRV9BVVRPOworCQllbHNlCisJCQl2ID0gT01BUDI0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTzsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCWlmIChlbmFibGUpCisJCQl2ID0gT01BUDM0WFhfQ0xLU1RDVFJMX0VOQUJMRV9BVVRPOworCQllbHNlCisJCQl2ID0gT01BUDM0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTzsKKwl9IGVsc2UgeworCQlCVUcoKTsKKwl9CisKKwljbV9ybXdfbW9kX3JlZ19iaXRzKGNsa2RtLT5jbGt0cmN0cmxfbWFzaywKKwkJCSAgICB2IDw8IF9fZmZzKGNsa2RtLT5jbGt0cmN0cmxfbWFzayksCisJCQkgICAgY2xrZG0tPnB3cmRtLnB0ci0+cHJjbV9vZmZzLCBDTV9DTEtTVENUUkwpOworfQogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluICpfY2xrZG1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC00NTYsOCArNDg2LDYgQEAKICAqLwogdm9pZCBvbWFwMl9jbGtkbV9hbGxvd19pZGxlKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pCiB7Ci0JdTMyIHY7Ci0KIAlpZiAoIWNsa2RtKQogCQlyZXR1cm47CiAKQEAgLTQ3MywxOCArNTAxLDcgQEAKIAlpZiAoYXRvbWljX3JlYWQoJmNsa2RtLT51c2Vjb3VudCkgPiAwKQogCQlfY2xrZG1fYWRkX2F1dG9kZXBzKGNsa2RtKTsKIAotCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKLQkJdiA9IE9NQVAyNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTzsKLQllbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSkKLQkJdiA9IE9NQVAzNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTzsKLQllbHNlCi0JCUJVRygpOwotCi0KLQljbV9ybXdfbW9kX3JlZ19iaXRzKGNsa2RtLT5jbGt0cmN0cmxfbWFzaywKLQkJCSAgICB2IDw8IF9fZmZzKGNsa2RtLT5jbGt0cmN0cmxfbWFzayksCi0JCQkgICAgY2xrZG0tPnB3cmRtLnB0ci0+cHJjbV9vZmZzLAotCQkJICAgIENNX0NMS1NUQ1RSTCk7CisJX29tYXAyX2Nsa2RtX3NldF9od3N1cChjbGtkbSwgMSk7CiAKIAlwd3JkbV9jbGtkbV9zdGF0ZV9zd2l0Y2goY2xrZG0pOwogfQpAQCAtNTAwLDggKzUxNyw2IEBACiAgKi8KIHZvaWQgb21hcDJfY2xrZG1fZGVueV9pZGxlKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pCiB7Ci0JdTMyIHY7Ci0KIAlpZiAoIWNsa2RtKQogCQlyZXR1cm47CiAKQEAgLTUxNCwxNiArNTI5LDcgQEAKIAlwcl9kZWJ1ZygiY2xvY2tkb21haW46IGRpc2FibGluZyBhdXRvbWF0aWMgaWRsZSB0cmFuc2l0aW9ucyBmb3IgJXNcbiIsCiAJCSBjbGtkbS0+bmFtZSk7CiAKLQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCi0JCXYgPSBPTUFQMjRYWF9DTEtTVENUUkxfRElTQUJMRV9BVVRPOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKQotCQl2ID0gT01BUDM0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTzsKLQllbHNlCi0JCUJVRygpOwotCi0JY21fcm13X21vZF9yZWdfYml0cyhjbGtkbS0+Y2xrdHJjdHJsX21hc2ssCi0JCQkgICAgdiA8PCBfX2ZmcyhjbGtkbS0+Y2xrdHJjdHJsX21hc2spLAotCQkJICAgIGNsa2RtLT5wd3JkbS5wdHItPnByY21fb2ZmcywgQ01fQ0xLU1RDVFJMKTsKKwlfb21hcDJfY2xrZG1fc2V0X2h3c3VwKGNsa2RtLCAwKTsKIAogCWlmIChhdG9taWNfcmVhZCgmY2xrZG0tPnVzZWNvdW50KSA+IDApCiAJCV9jbGtkbV9kZWxfYXV0b2RlcHMoY2xrZG0pOwpAQCAtNTY5LDEwICs1NzUsMTQgQEAKIAl2ID0gb21hcDJfY2xrZG1fY2xrdHJjdHJsX3JlYWQoY2xrZG0pOwogCiAJaWYgKChjcHVfaXNfb21hcDM0eHgoKSAmJiB2ID09IE9NQVAzNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTykgfHwKLQkgICAgKGNwdV9pc19vbWFwMjR4eCgpICYmIHYgPT0gT01BUDI0WFhfQ0xLU1RDVFJMX0VOQUJMRV9BVVRPKSkKKwkgICAgKGNwdV9pc19vbWFwMjR4eCgpICYmIHYgPT0gT01BUDI0WFhfQ0xLU1RDVFJMX0VOQUJMRV9BVVRPKSkgeworCQkvKiBEaXNhYmxlIEhXIHRyYW5zaXRpb25zIHdoZW4gd2UgYXJlIGNoYW5naW5nIGRlcHMgKi8KKwkJX29tYXAyX2Nsa2RtX3NldF9od3N1cChjbGtkbSwgMCk7CiAJCV9jbGtkbV9hZGRfYXV0b2RlcHMoY2xrZG0pOwotCWVsc2UKKwkJX29tYXAyX2Nsa2RtX3NldF9od3N1cChjbGtkbSwgMSk7CisJfSBlbHNlIHsKIAkJb21hcDJfY2xrZG1fd2FrZXVwKGNsa2RtKTsKKwl9CiAKIAlwd3JkbV93YWl0X3RyYW5zaXRpb24oY2xrZG0tPnB3cmRtLnB0cik7CiAJcHdyZG1fY2xrZG1fc3RhdGVfc3dpdGNoKGNsa2RtKTsKQEAgLTYyMywxMCArNjMzLDE0IEBACiAJdiA9IG9tYXAyX2Nsa2RtX2Nsa3RyY3RybF9yZWFkKGNsa2RtKTsKIAogCWlmICgoY3B1X2lzX29tYXAzNHh4KCkgJiYgdiA9PSBPTUFQMzRYWF9DTEtTVENUUkxfRU5BQkxFX0FVVE8pIHx8Ci0JICAgIChjcHVfaXNfb21hcDI0eHgoKSAmJiB2ID09IE9NQVAyNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTykpCisJICAgIChjcHVfaXNfb21hcDI0eHgoKSAmJiB2ID09IE9NQVAyNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTykpIHsKKwkJLyogRGlzYWJsZSBIVyB0cmFuc2l0aW9ucyB3aGVuIHdlIGFyZSBjaGFuZ2luZyBkZXBzICovCisJCV9vbWFwMl9jbGtkbV9zZXRfaHdzdXAoY2xrZG0sIDApOwogCQlfY2xrZG1fZGVsX2F1dG9kZXBzKGNsa2RtKTsKLQllbHNlCisJCV9vbWFwMl9jbGtkbV9zZXRfaHdzdXAoY2xrZG0sIDEpOworCX0gZWxzZSB7CiAJCW9tYXAyX2Nsa2RtX3NsZWVwKGNsa2RtKTsKKwl9CiAKIAlwd3JkbV9jbGtkbV9zdGF0ZV9zd2l0Y2goY2xrZG0pOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NtNHh4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbTR4eHguYwppbmRleCBlNGViZDZkLi40YWY3NmJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NtNHh4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY200eHh4LmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNpbmNsdWRlICJjbS5oIgotI2luY2x1ZGUgImNtLXJlZ2JpdHMtNHh4eC5oIgogCiAvKiBYWFggbW92ZSB0aGlzIHRvIGNtLmggKi8KIC8qIE1BWF9NT0RVTEVfUkVBRFlfVElNRTogbWF4IG1pbGxpc2Vjb25kcyBmb3IgbW9kdWxlIHRvIGxlYXZlIGlkbGUgKi8KQEAgLTUwLDE5ICs0OSw3IEBACiAgKi8KIGludCBvbWFwNF9jbV93YWl0X2lkbGVzdF9yZWFkeSh1MzIgcHJjbV9tb2QsIHU4IHByY21fZGV2X29mZnMpCiB7Ci0JaW50IGkgPSAwOwotCXU4IGNtX2lkOwotCXUxNiBwcmNtX21vZF9vZmZzOwotCXUzMiBtYXNrID0gT01BUDRfUFJDTV9DTV9DTEtDVFJMX0lETEVTVF9NQVNLOwotCi0JY21faWQgPSBwcmNtX21vZCA+PiBPTUFQNF9QUkNNX01PRF9DTV9JRF9TSElGVDsKLQlwcmNtX21vZF9vZmZzID0gcHJjbV9tb2QgJiBPTUFQNF9QUkNNX01PRF9PRkZTX01BU0s7Ci0KLQl3aGlsZSAoKChvbWFwNF9jbV9yZWFkX21vZF9yZWcoY21faWQsIHByY21fbW9kX29mZnMsIHByY21fZGV2X29mZnMsCi0JCQkJICAgICAgIE9NQVA0X0NNX0NMS0NUUkxfRFJFRykgJiBtYXNrKSAhPSAwKSAmJgotCSAgICAgICAoaSsrIDwgTUFYX01PRFVMRV9SRUFEWV9USU1FKSkKLQkJdWRlbGF5KDEpOwotCi0JcmV0dXJuIChpIDwgTUFYX01PRFVMRV9SRUFEWV9USU1FKSA/IDAgOiAtRUJVU1k7CisJLyogRklYTUU6IEFkZCBjbG9jayBtYW5hZ2VyIHJlbGF0ZWQgY29kZSAqLworCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCmluZGV4IGJjZmNmYzcuLmZhZjdhMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCkBAIC0zNTUsMjkgKzM1NSw2MCBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBvbWFwX2luaXRfbWNzcGkodm9pZCkKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNAorc3RhdGljIGlubGluZSB2b2lkIG9tYXA0X21jc3BpX2ZpeHVwKHZvaWQpCiB7Ci0JaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCW9tYXAyX21jc3BpMV9yZXNvdXJjZXNbMF0uc3RhcnQJPSBPTUFQNF9NQ1NQSTFfQkFTRTsKLQkJb21hcDJfbWNzcGkxX3Jlc291cmNlc1swXS5lbmQJPSBPTUFQNF9NQ1NQSTFfQkFTRSArIDB4ZmY7Ci0JCW9tYXAyX21jc3BpMl9yZXNvdXJjZXNbMF0uc3RhcnQJPSBPTUFQNF9NQ1NQSTJfQkFTRTsKLQkJb21hcDJfbWNzcGkyX3Jlc291cmNlc1swXS5lbmQJPSBPTUFQNF9NQ1NQSTJfQkFTRSArIDB4ZmY7Ci0JCW9tYXAyX21jc3BpM19yZXNvdXJjZXNbMF0uc3RhcnQJPSBPTUFQNF9NQ1NQSTNfQkFTRTsKLQkJb21hcDJfbWNzcGkzX3Jlc291cmNlc1swXS5lbmQJPSBPTUFQNF9NQ1NQSTNfQkFTRSArIDB4ZmY7Ci0JCW9tYXAyX21jc3BpNF9yZXNvdXJjZXNbMF0uc3RhcnQJPSBPTUFQNF9NQ1NQSTRfQkFTRTsKLQkJb21hcDJfbWNzcGk0X3Jlc291cmNlc1swXS5lbmQJPSBPTUFQNF9NQ1NQSTRfQkFTRSArIDB4ZmY7Ci0JfQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcDJfbWNzcGkxKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXAyX21jc3BpMik7CisJb21hcDJfbWNzcGkxX3Jlc291cmNlc1swXS5zdGFydAk9IE9NQVA0X01DU1BJMV9CQVNFOworCW9tYXAyX21jc3BpMV9yZXNvdXJjZXNbMF0uZW5kCT0gT01BUDRfTUNTUEkxX0JBU0UgKyAweGZmOworCW9tYXAyX21jc3BpMl9yZXNvdXJjZXNbMF0uc3RhcnQJPSBPTUFQNF9NQ1NQSTJfQkFTRTsKKwlvbWFwMl9tY3NwaTJfcmVzb3VyY2VzWzBdLmVuZAk9IE9NQVA0X01DU1BJMl9CQVNFICsgMHhmZjsKKwlvbWFwMl9tY3NwaTNfcmVzb3VyY2VzWzBdLnN0YXJ0CT0gT01BUDRfTUNTUEkzX0JBU0U7CisJb21hcDJfbWNzcGkzX3Jlc291cmNlc1swXS5lbmQJPSBPTUFQNF9NQ1NQSTNfQkFTRSArIDB4ZmY7CisJb21hcDJfbWNzcGk0X3Jlc291cmNlc1swXS5zdGFydAk9IE9NQVA0X01DU1BJNF9CQVNFOworCW9tYXAyX21jc3BpNF9yZXNvdXJjZXNbMF0uZW5kCT0gT01BUDRfTUNTUEk0X0JBU0UgKyAweGZmOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwNF9tY3NwaV9maXh1cCh2b2lkKQoreworfQorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKSB8fCBcCiAJZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNCkKLQlpZiAoY3B1X2lzX29tYXAyNDMwKCkgfHwgY3B1X2lzX29tYXAzNDN4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkpCi0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcDJfbWNzcGkzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMl9tY3NwaTNfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcDJfbWNzcGkzKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcDJfbWNzcGkzX2luaXQodm9pZCkKK3sKK30KICNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNCkKLQlpZiAoY3B1X2lzX29tYXAzNDN4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkpCi0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcDJfbWNzcGk0KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMl9tY3NwaTRfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcDJfbWNzcGk0KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcDJfbWNzcGk0X2luaXQodm9pZCkKK3sKK30KICNlbmRpZgorCitzdGF0aWMgdm9pZCBvbWFwX2luaXRfbWNzcGkodm9pZCkKK3sKKwlpZiAoY3B1X2lzX29tYXA0NHh4KCkpCisJCW9tYXA0X21jc3BpX2ZpeHVwKCk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXAyX21jc3BpMSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvbWFwMl9tY3NwaTIpOworCisJaWYgKGNwdV9pc19vbWFwMjQzMCgpIHx8IGNwdV9pc19vbWFwMzQzeCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKQorCQlvbWFwMl9tY3NwaTNfaW5pdCgpOworCisJaWYgKGNwdV9pc19vbWFwMzQzeCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKQorCQlvbWFwMl9tY3NwaTRfaW5pdCgpOwogfQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCmluZGV4IDc1NzRiNmYuLjU2YmU4N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKQEAgLTI5NCwxNSArMjk0LDE3IEBACiAJZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpCiAJCWh3bW9kcyA9IG9tYXAzNHh4X2h3bW9kczsKIAotCW9tYXBfaHdtb2RfaW5pdChod21vZHMpOwotCW9tYXAyX211eF9pbml0KCk7CiAjaWZuZGVmIENPTkZJR19BUkNIX09NQVA0IC8qIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIHRoZSBjbGtkZXYgaXMgcmVhZHkgKi8KIAkvKiBUaGUgT1BQIHRhYmxlcyBoYXZlIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIGEgY2xrIGluaXQgKi8KKwlvbWFwX2h3bW9kX2luaXQoaHdtb2RzKTsKKwlvbWFwMl9tdXhfaW5pdCgpOwogCW9tYXBfcG1faWZfZWFybHlfaW5pdChtcHVfb3BwcywgZHNwX29wcHMsIGwzX29wcHMpOwogCXB3cmRtX2luaXQocG93ZXJkb21haW5zX29tYXApOwogCWNsa2RtX2luaXQoY2xvY2tkb21haW5zX29tYXAsIGNsa2RtX3B3cmRtX2F1dG9kZXBzKTsKIAlvbWFwMl9jbGtfaW5pdCgpOworI2VuZGlmCiAJb21hcF9zZXJpYWxfZWFybHlfaW5pdCgpOworI2lmbmRlZiBDT05GSUdfQVJDSF9PTUFQNAogCW9tYXBfaHdtb2RfbGF0ZV9pbml0KCk7CiAJb21hcF9wbV9pZl9pbml0KCk7CiAJb21hcDJfc2RyY19pbml0KHNkcmNfY3MwLCBzZHJjX2NzMSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lvbW11Mi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pb21tdTIuYwppbmRleCAyZDliNWNjLi40YTBlMWNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lvbW11Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW9tbXUyLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkJbCA9IGlvbW11X3JlYWRfcmVnKG9iaiwgTU1VX1NZU1NUQVRVUyk7CiAJCWlmIChsICYgTU1VX1NZU19SRVNFVERPTkUpCiAJCQlicmVhazsKLQl9IHdoaWxlICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKTsKKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSk7CiAKIAlpZiAoIShsICYgTU1VX1NZU19SRVNFVERPTkUpKSB7CiAJCWRldl9lcnIob2JqLT5kZXYsICJjYW4ndCB0YWtlIG1tdSBvdXQgb2YgcmVzZXRcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tYWlsYm94LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYwppbmRleCA2ZjcxZjM3Li5jMDM1YWQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYwpAQCAtMzAsNiArMzAsMTQgQEAKICNkZWZpbmUgTUFJTEJPWF9JUlFfTkVXTVNHKHUpCQkoMSA8PCAoMiAqICh1KSkpCiAjZGVmaW5lIE1BSUxCT1hfSVJRX05PVEZVTEwodSkJCSgxIDw8ICgyICogKHUpICsgMSkpCiAKKy8qIFNZU0NPTkZJRzogcmVnaXN0ZXIgYml0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgQVVUT0lETEUJKDEgPDwgMCkKKyNkZWZpbmUgU09GVFJFU0VUCSgxIDw8IDEpCisjZGVmaW5lIFNNQVJUSURMRQkoMiA8PCAzKQorCisvKiBTWVNTVEFUVVM6IHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9uICovCisjZGVmaW5lIFJFU0VURE9ORQkoMSA8PCAwKQorCiAjZGVmaW5lIE1CT1hfUkVHX1NJWkUJCQkweDEyMAogI2RlZmluZSBNQk9YX05SX1JFR1MJCQkoTUJPWF9SRUdfU0laRSAvIHNpemVvZih1MzIpKQogCkBAIC02OSwyMSArNzcsMzMgQEAKIC8qIE1haWxib3ggSC9XIHByZXBhcmF0aW9ucyAqLwogc3RhdGljIGludCBvbWFwMl9tYm94X3N0YXJ0dXAoc3RydWN0IG9tYXBfbWJveCAqbWJveCkKIHsKLQl1bnNpZ25lZCBpbnQgbDsKKwl1MzIgbDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKIAltYm94X2lja19oYW5kbGUgPSBjbGtfZ2V0KE5VTEwsICJtYWlsYm94ZXNfaWNrIik7CiAJaWYgKElTX0VSUihtYm94X2lja19oYW5kbGUpKSB7Ci0JCXByaW50aygiQ291bGQgbm90IGdldCBtYWlsYm94ZXNfaWNrXG4iKTsKKwkJcHJfZXJyKCJDYW4ndCBnZXQgbWFpbGJveGVzX2lja1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAljbGtfZW5hYmxlKG1ib3hfaWNrX2hhbmRsZSk7CiAKKwltYm94X3dyaXRlX3JlZyhTT0ZUUkVTRVQsIE1BSUxCT1hfU1lTQ09ORklHKTsKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCWRvIHsKKwkJbCA9IG1ib3hfcmVhZF9yZWcoTUFJTEJPWF9TWVNTVEFUVVMpOworCQlpZiAobCAmIFJFU0VURE9ORSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKTsKKworCWlmICghKGwgJiBSRVNFVERPTkUpKSB7CisJCXByX2VycigiQ2FuJ3QgdGFrZSBtbXUgb3V0IG9mIHJlc2V0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJbCA9IG1ib3hfcmVhZF9yZWcoTUFJTEJPWF9SRVZJU0lPTik7CiAJcHJfaW5mbygib21hcCBtYWlsYm94IHJldiAlZC4lZFxuIiwgKGwgJiAweGYwKSA+PiA0LCAobCAmIDB4MGYpKTsKIAotCS8qIHNldCBzbWFydC1pZGxlICYgYXV0b2lkbGUgKi8KLQlsID0gbWJveF9yZWFkX3JlZyhNQUlMQk9YX1NZU0NPTkZJRyk7Ci0JbCB8PSAweDAwMDAwMDExOworCWwgPSBTTUFSVElETEUgfCBBVVRPSURMRTsKIAltYm94X3dyaXRlX3JlZyhsLCBNQUlMQk9YX1NZU0NPTkZJRyk7CiAKIAlvbWFwMl9tYm94X2VuYWJsZV9pcnEobWJveCwgSVJRX1JYKTsKQEAgLTE1Niw2ICsxNzYsOSBAQAogCXUzMiBiaXQgPSAoaXJxID09IElSUV9UWCkgPyBwLT5ub3RmdWxsX2JpdCA6IHAtPm5ld21zZ19iaXQ7CiAKIAltYm94X3dyaXRlX3JlZyhiaXQsIHAtPmlycXN0YXR1cyk7CisKKwkvKiBGbHVzaCBwb3N0ZWQgd3JpdGUgZm9yIGlycSBzdGF0dXMgdG8gYXZvaWQgc3B1cmlvdXMgaW50ZXJydXB0cyAqLworCW1ib3hfcmVhZF9yZWcocC0+aXJxc3RhdHVzKTsKIH0KIAogc3RhdGljIGludCBvbWFwMl9tYm94X2lzX2lycShzdHJ1Y3Qgb21hcF9tYm94ICptYm94LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMKaW5kZXggMmRhYTU5NS4uYjVmYWMzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCkBAIC00NjAsNiArNDYwLDggQEAKIAkJT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUKQogTVVYX0NGR18zNFhYKCJBRjIyXzM0WFhfR1BJTzkiLCAweGExOCwKIAkJT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUKQorTVVYX0NGR18zNFhYKCJBRzlfMzRYWF9HUElPMjMiLCAweDVlZSwKKwkJT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUKQogTVVYX0NGR18zNFhYKCJBSDhfMzRYWF9HUElPMjkiLCAweDVmYSwKIAkJT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUKQogTVVYX0NGR18zNFhYKCJVOF8zNFhYX0dQSU81NF9PVVQiLCAweDBiNCwKQEAgLTQ3Miw2ICs0NzQsOCBAQAogCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQogTVVYX0NGR18zNFhYKCJBRzRfMzRYWF9HUElPMTM0X09VVCIsIDB4MTYwLAogCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQorTVVYX0NGR18zNFhYKCJBRjRfMzRYWF9HUElPMTM1X09VVCIsIDB4MTYyLAorCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQogTVVYX0NGR18zNFhYKCJBRTRfMzRYWF9HUElPMTM2X09VVCIsIDB4MTY0LAogCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQogTVVYX0NGR18zNFhYKCJBRjZfMzRYWF9HUElPMTQwX1VQIiwgMHgxNmMsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLWRlYnVnLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLWRlYnVnLmMKaW5kZXggMWI0YzE2MC4uMmZjNGQ2YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS1kZWJ1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0tZGVidWcuYwpAQCAtNTQxLDcgKzU0MSw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9ubHkgT01BUDMgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQkJCisKIAlkID0gZGVidWdmc19jcmVhdGVfZGlyKCJwbV9kZWJ1ZyIsIE5VTEwpOwogCWlmIChJU19FUlIoZCkpCiAJCXJldHVybiBQVFJfRVJSKGQpOwpAQCAtNTUxLDcgKzU1MSw3IEBACiAJKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRpbWUiLCBTX0lSVUdPLAogCQlkLCAodm9pZCAqKURFQlVHX0ZJTEVfVElNRVJTLCAmZGVidWdfZm9wcyk7CiAKLQlwd3JkbV9mb3JfZWFjaChwd3JkbXNfc2V0dXAsICh2b2lkICopZCk7CisJcHdyZG1fZm9yX2VhY2hfbm9sb2NrKHB3cmRtc19zZXR1cCwgKHZvaWQgKilkKTsKIAogCXBtX2RiZ19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJlZ2lzdGVycyIsIGQpOwogCWlmIChJU19FUlIocG1fZGJnX2RpcikpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTM0eHguYwppbmRleCAwZmY1YTZjLi44OTQ2MzE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmMKQEAgLTUxLDk3ICs1MSwxMTIgQEAKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiAqbXB1X3B3cmRtOwogCi0vKiBQUkNNIEludGVycnVwdCBIYW5kbGVyIGZvciB3YWtldXBzICovCisvKgorICogUFJDTSBJbnRlcnJ1cHQgSGFuZGxlciBIZWxwZXIgRnVuY3Rpb24KKyAqCisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGNsZWFyIGFueSB3YWtlLXVwIGV2ZW50cyBsYXRjaGVkCisgKiBpbiB0aGUgUFJDTSBQTV9XS1NUX3ggcmVnaXN0ZXJzLiBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgd2FrZS11cCBldmVudAorICogbWF5IG9jY3VyIHdoaWxzdCBhdHRlbXB0aW5nIHRvIGNsZWFyIGEgUE1fV0tTVF94IHJlZ2lzdGVyIGFuZCB0aHVzCisgKiBzZXQgYW5vdGhlciBiaXQgaW4gdGhpcyByZWdpc3Rlci4gQSB3aGlsZSBsb29wIGlzIHVzZWQgdG8gZW5zdXJlCisgKiB0aGF0IGFueSBwZXJpcGhlcmFsIHdha2UtdXAgZXZlbnRzIG9jY3VycmluZyB3aGlsZSBhdHRlbXB0aW5nIHRvCisgKiBjbGVhciB0aGUgUE1fV0tTVF94IGFyZSBkZXRlY3RlZCBhbmQgY2xlYXJlZC4KKyAqLworc3RhdGljIGludCBwcmNtX2NsZWFyX21vZF9pcnFzKHMxNiBtb2R1bGUsIHU4IHJlZ3MpCit7CisJdTMyIHdrc3QsIGZjbGssIGljbGssIGNsa2VuOworCXUxNiB3a3N0X29mZiA9IChyZWdzID09IDMpID8gT01BUDM0MzBFUzJfUE1fV0tTVDMgOiBQTV9XS1NUMTsKKwl1MTYgZmNsa19vZmYgPSAocmVncyA9PSAzKSA/IE9NQVAzNDMwRVMyX0NNX0ZDTEtFTjMgOiBDTV9GQ0xLRU4xOworCXUxNiBpY2xrX29mZiA9IChyZWdzID09IDMpID8gQ01fSUNMS0VOMyA6IENNX0lDTEtFTjE7CisJdTE2IGdycHNlbF9vZmYgPSAocmVncyA9PSAzKSA/CisJCU9NQVAzNDMwRVMyX1BNX01QVUdSUFNFTDMgOiBPTUFQMzQzMF9QTV9NUFVHUlBTRUw7CisJaW50IGMgPSAwOworCisJd2tzdCA9IHBybV9yZWFkX21vZF9yZWcobW9kdWxlLCB3a3N0X29mZik7CisJd2tzdCAmPSBwcm1fcmVhZF9tb2RfcmVnKG1vZHVsZSwgZ3Jwc2VsX29mZik7CisJaWYgKHdrc3QpIHsKKwkJaWNsayA9IGNtX3JlYWRfbW9kX3JlZyhtb2R1bGUsIGljbGtfb2ZmKTsKKwkJZmNsayA9IGNtX3JlYWRfbW9kX3JlZyhtb2R1bGUsIGZjbGtfb2ZmKTsKKwkJd2hpbGUgKHdrc3QpIHsKKwkJCWNsa2VuID0gd2tzdDsKKwkJCWNtX3NldF9tb2RfcmVnX2JpdHMoY2xrZW4sIG1vZHVsZSwgaWNsa19vZmYpOworCQkJLyoKKwkJCSAqIEZvciBVU0JIT1NULCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgSE9TVDEgb3IKKwkJCSAqIEhPU1QyIHdva2UgdXMgdXAsIHNvIGVuYWJsZSBib3RoIGYtY2xvY2tzCisJCQkgKi8KKwkJCWlmIChtb2R1bGUgPT0gT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QpCisJCQkJY2xrZW4gfD0gMSA8PCBPTUFQMzQzMEVTMl9FTl9VU0JIT1NUMl9TSElGVDsKKwkJCWNtX3NldF9tb2RfcmVnX2JpdHMoY2xrZW4sIG1vZHVsZSwgZmNsa19vZmYpOworCQkJcHJtX3dyaXRlX21vZF9yZWcod2tzdCwgbW9kdWxlLCB3a3N0X29mZik7CisJCQl3a3N0ID0gcHJtX3JlYWRfbW9kX3JlZyhtb2R1bGUsIHdrc3Rfb2ZmKTsKKwkJCWMrKzsKKwkJfQorCQljbV93cml0ZV9tb2RfcmVnKGljbGssIG1vZHVsZSwgaWNsa19vZmYpOworCQljbV93cml0ZV9tb2RfcmVnKGZjbGssIG1vZHVsZSwgZmNsa19vZmYpOworCX0KKworCXJldHVybiBjOworfQorCitzdGF0aWMgaW50IF9wcmNtX2ludF9oYW5kbGVfd2FrZXVwKHZvaWQpCit7CisJaW50IGM7CisKKwljID0gcHJjbV9jbGVhcl9tb2RfaXJxcyhXS1VQX01PRCwgMSk7CisJYyArPSBwcmNtX2NsZWFyX21vZF9pcnFzKENPUkVfTU9ELCAxKTsKKwljICs9IHByY21fY2xlYXJfbW9kX2lycXMoT01BUDM0MzBfUEVSX01PRCwgMSk7CisJaWYgKG9tYXBfcmV2KCkgPiBPTUFQMzQzMF9SRVZfRVMxXzApIHsKKwkJYyArPSBwcmNtX2NsZWFyX21vZF9pcnFzKENPUkVfTU9ELCAzKTsKKwkJYyArPSBwcmNtX2NsZWFyX21vZF9pcnFzKE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELCAxKTsKKwl9CisKKwlyZXR1cm4gYzsKK30KKworLyoKKyAqIFBSQ00gSW50ZXJydXB0IEhhbmRsZXIKKyAqCisgKiBUaGUgUFJNX0lSUVNUQVRVU19NUFUgcmVnaXN0ZXIgaW5kaWNhdGVzIGlmIHRoZXJlIGFyZSBhbnkgcGVuZGluZworICogaW50ZXJydXB0cyBmcm9tIHRoZSBQUkNNIGZvciB0aGUgTVBVLiBUaGVzZSBiaXRzIG11c3QgYmUgY2xlYXJlZCBpbgorICogb3JkZXIgdG8gY2xlYXIgdGhlIFBSQ00gaW50ZXJydXB0LiBUaGUgUFJDTSBpbnRlcnJ1cHQgaGFuZGxlciBpcworICogaW1wbGVtZW50ZWQgdG8gc2ltcGx5IGNsZWFyIHRoZSBQUk1fSVJRU1RBVFVTX01QVSBpbiBvcmRlciB0byBjbGVhcgorICogdGhlIFBSQ00gaW50ZXJydXB0LiBQbGVhc2Ugbm90ZSB0aGF0IGJpdCAwIG9mIHRoZSBQUk1fSVJRU1RBVFVTX01QVQorICogcmVnaXN0ZXIgaW5kaWNhdGVzIHRoYXQgYSB3YWtlLXVwIGV2ZW50IGlzIHBlbmRpbmcgZm9yIHRoZSBNUFUgYW5kCisgKiB0aGlzIGJpdCBjYW4gb25seSBiZSBjbGVhcmVkIGlmIHRoZSBhbGwgdGhlIHdha2UtdXAgZXZlbnRzIGxhdGNoZWQKKyAqIGluIHRoZSB2YXJpb3VzIFBNX1dLU1RfeCByZWdpc3RlcnMgaGF2ZSBiZWVuIGNsZWFyZWQuIFRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBkby13aGlsZSBsb29wIHNvIHRoYXQgaWYgYSB3YWtlLXVwCisgKiBldmVudCBvY2N1cnJlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHByY20gaW50ZXJydXB0IGhhbmRsZXIKKyAqIChzZXR0aW5nIGEgYml0IGluIHRoZSBjb3JyZXNwb25kaW5nIFBNX1dLU1RfeCByZWdpc3RlciBhbmQgdGh1cworICogcHJldmVudGluZyB1cyBmcm9tIGNsZWFyaW5nIGJpdCAwIG9mIHRoZSBQUk1fSVJRU1RBVFVTX01QVSByZWdpc3RlcikKKyAqIHRoaXMgd291bGQgYmUgaGFuZGxlZC4KKyAqLwogc3RhdGljIGlycXJldHVybl90IHByY21faW50ZXJydXB0X2hhbmRsZXIgKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQl1MzIgd2tzdCwgaXJxc3RhdHVzX21wdTsKLQl1MzIgZmNsaywgaWNsazsKKwl1MzIgaXJxc3RhdHVzX21wdTsKKwlpbnQgYyA9IDA7CiAKLQkvKiBXS1VQICovCi0Jd2tzdCA9IHBybV9yZWFkX21vZF9yZWcoV0tVUF9NT0QsIFBNX1dLU1QpOwotCWlmICh3a3N0KSB7Ci0JCWljbGsgPSBjbV9yZWFkX21vZF9yZWcoV0tVUF9NT0QsIENNX0lDTEtFTik7Ci0JCWZjbGsgPSBjbV9yZWFkX21vZF9yZWcoV0tVUF9NT0QsIENNX0ZDTEtFTik7Ci0JCWNtX3NldF9tb2RfcmVnX2JpdHMod2tzdCwgV0tVUF9NT0QsIENNX0lDTEtFTik7Ci0JCWNtX3NldF9tb2RfcmVnX2JpdHMod2tzdCwgV0tVUF9NT0QsIENNX0ZDTEtFTik7Ci0JCXBybV93cml0ZV9tb2RfcmVnKHdrc3QsIFdLVVBfTU9ELCBQTV9XS1NUKTsKLQkJd2hpbGUgKHBybV9yZWFkX21vZF9yZWcoV0tVUF9NT0QsIFBNX1dLU1QpKQotCQkJY3B1X3JlbGF4KCk7Ci0JCWNtX3dyaXRlX21vZF9yZWcoaWNsaywgV0tVUF9NT0QsIENNX0lDTEtFTik7Ci0JCWNtX3dyaXRlX21vZF9yZWcoZmNsaywgV0tVUF9NT0QsIENNX0ZDTEtFTik7Ci0JfQorCWRvIHsKKwkJaXJxc3RhdHVzX21wdSA9IHBybV9yZWFkX21vZF9yZWcoT0NQX01PRCwKKwkJCQkJT01BUDNfUFJNX0lSUVNUQVRVU19NUFVfT0ZGU0VUKTsKIAotCS8qIENPUkUgKi8KLQl3a3N0ID0gcHJtX3JlYWRfbW9kX3JlZyhDT1JFX01PRCwgUE1fV0tTVDEpOwotCWlmICh3a3N0KSB7Ci0JCWljbGsgPSBjbV9yZWFkX21vZF9yZWcoQ09SRV9NT0QsIENNX0lDTEtFTjEpOwotCQlmY2xrID0gY21fcmVhZF9tb2RfcmVnKENPUkVfTU9ELCBDTV9GQ0xLRU4xKTsKLQkJY21fc2V0X21vZF9yZWdfYml0cyh3a3N0LCBDT1JFX01PRCwgQ01fSUNMS0VOMSk7Ci0JCWNtX3NldF9tb2RfcmVnX2JpdHMod2tzdCwgQ09SRV9NT0QsIENNX0ZDTEtFTjEpOwotCQlwcm1fd3JpdGVfbW9kX3JlZyh3a3N0LCBDT1JFX01PRCwgUE1fV0tTVDEpOwotCQl3aGlsZSAocHJtX3JlYWRfbW9kX3JlZyhDT1JFX01PRCwgUE1fV0tTVDEpKQotCQkJY3B1X3JlbGF4KCk7Ci0JCWNtX3dyaXRlX21vZF9yZWcoaWNsaywgQ09SRV9NT0QsIENNX0lDTEtFTjEpOwotCQljbV93cml0ZV9tb2RfcmVnKGZjbGssIENPUkVfTU9ELCBDTV9GQ0xLRU4xKTsKLQl9Ci0Jd2tzdCA9IHBybV9yZWFkX21vZF9yZWcoQ09SRV9NT0QsIE9NQVAzNDMwRVMyX1BNX1dLU1QzKTsKLQlpZiAod2tzdCkgewotCQlpY2xrID0gY21fcmVhZF9tb2RfcmVnKENPUkVfTU9ELCBDTV9JQ0xLRU4zKTsKLQkJZmNsayA9IGNtX3JlYWRfbW9kX3JlZyhDT1JFX01PRCwgT01BUDM0MzBFUzJfQ01fRkNMS0VOMyk7Ci0JCWNtX3NldF9tb2RfcmVnX2JpdHMod2tzdCwgQ09SRV9NT0QsIENNX0lDTEtFTjMpOwotCQljbV9zZXRfbW9kX3JlZ19iaXRzKHdrc3QsIENPUkVfTU9ELCBPTUFQMzQzMEVTMl9DTV9GQ0xLRU4zKTsKLQkJcHJtX3dyaXRlX21vZF9yZWcod2tzdCwgQ09SRV9NT0QsIE9NQVAzNDMwRVMyX1BNX1dLU1QzKTsKLQkJd2hpbGUgKHBybV9yZWFkX21vZF9yZWcoQ09SRV9NT0QsIE9NQVAzNDMwRVMyX1BNX1dLU1QzKSkKLQkJCWNwdV9yZWxheCgpOwotCQljbV93cml0ZV9tb2RfcmVnKGljbGssIENPUkVfTU9ELCBDTV9JQ0xLRU4zKTsKLQkJY21fd3JpdGVfbW9kX3JlZyhmY2xrLCBDT1JFX01PRCwgT01BUDM0MzBFUzJfQ01fRkNMS0VOMyk7Ci0JfQorCQlpZiAoaXJxc3RhdHVzX21wdSAmIChPTUFQMzQzMF9XS1VQX1NUIHwgT01BUDM0MzBfSU9fU1QpKSB7CisJCQljID0gX3ByY21faW50X2hhbmRsZV93YWtldXAoKTsKIAotCS8qIFBFUiAqLwotCXdrc3QgPSBwcm1fcmVhZF9tb2RfcmVnKE9NQVAzNDMwX1BFUl9NT0QsIFBNX1dLU1QpOwotCWlmICh3a3N0KSB7Ci0JCWljbGsgPSBjbV9yZWFkX21vZF9yZWcoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKTsKLQkJZmNsayA9IGNtX3JlYWRfbW9kX3JlZyhPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pOwotCQljbV9zZXRfbW9kX3JlZ19iaXRzKHdrc3QsIE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTik7Ci0JCWNtX3NldF9tb2RfcmVnX2JpdHMod2tzdCwgT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKTsKLQkJcHJtX3dyaXRlX21vZF9yZWcod2tzdCwgT01BUDM0MzBfUEVSX01PRCwgUE1fV0tTVCk7Ci0JCXdoaWxlIChwcm1fcmVhZF9tb2RfcmVnKE9NQVAzNDMwX1BFUl9NT0QsIFBNX1dLU1QpKQotCQkJY3B1X3JlbGF4KCk7Ci0JCWNtX3dyaXRlX21vZF9yZWcoaWNsaywgT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKTsKLQkJY21fd3JpdGVfbW9kX3JlZyhmY2xrLCBPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pOwotCX0KLQotCWlmIChvbWFwX3JldigpID4gT01BUDM0MzBfUkVWX0VTMV8wKSB7Ci0JCS8qIFVTQkhPU1QgKi8KLQkJd2tzdCA9IHBybV9yZWFkX21vZF9yZWcoT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsIFBNX1dLU1QpOwotCQlpZiAod2tzdCkgewotCQkJaWNsayA9IGNtX3JlYWRfbW9kX3JlZyhPTUFQMzQzMEVTMl9VU0JIT1NUX01PRCwKLQkJCQkJICAgICAgIENNX0lDTEtFTik7Ci0JCQlmY2xrID0gY21fcmVhZF9tb2RfcmVnKE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELAotCQkJCQkgICAgICAgQ01fRkNMS0VOKTsKLQkJCWNtX3NldF9tb2RfcmVnX2JpdHMod2tzdCwgT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsCi0JCQkJCSAgICBDTV9JQ0xLRU4pOwotCQkJY21fc2V0X21vZF9yZWdfYml0cyh3a3N0LCBPTUFQMzQzMEVTMl9VU0JIT1NUX01PRCwKLQkJCQkJICAgIENNX0ZDTEtFTik7Ci0JCQlwcm1fd3JpdGVfbW9kX3JlZyh3a3N0LCBPTUFQMzQzMEVTMl9VU0JIT1NUX01PRCwKLQkJCQkJICBQTV9XS1NUKTsKLQkJCXdoaWxlIChwcm1fcmVhZF9tb2RfcmVnKE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELAotCQkJCQkJUE1fV0tTVCkpCi0JCQkJY3B1X3JlbGF4KCk7Ci0JCQljbV93cml0ZV9tb2RfcmVnKGljbGssIE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELAotCQkJCQkgQ01fSUNMS0VOKTsKLQkJCWNtX3dyaXRlX21vZF9yZWcoZmNsaywgT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsCi0JCQkJCSBDTV9GQ0xLRU4pOworCQkJLyoKKwkJCSAqIElzIHRoZSBNUFUgUFJDTSBpbnRlcnJ1cHQgaGFuZGxlciByYWNpbmcgd2l0aCB0aGUKKwkJCSAqIElWQTIgUFJDTSBpbnRlcnJ1cHQgaGFuZGxlciA/CisJCQkgKi8KKwkJCVdBUk4oYyA9PSAwLCAicHJjbTogV0FSTklORzogUFJDTSBpbmRpY2F0ZWQgTVBVIHdha2V1cCAiCisJCQkgICAgICJidXQgbm8gd2FrZXVwIHNvdXJjZXMgYXJlIG1hcmtlZFxuIik7CisJCX0gZWxzZSB7CisJCQkvKiBYWFggd2UgbmVlZCB0byBleHBhbmQgb3VyIFBSQ00gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJCVdBUk4oMSwgInByY206IFdBUk5JTkc6IFBSQ00gaW50ZXJydXB0IHJlY2VpdmVkLCBidXQgIgorCQkJICAgICAibm8gY29kZSB0byBoYW5kbGUgaXQgKCUwOHgpXG4iLCBpcnFzdGF0dXNfbXB1KTsKIAkJfQotCX0KIAotCWlycXN0YXR1c19tcHUgPSBwcm1fcmVhZF9tb2RfcmVnKE9DUF9NT0QsCi0JCQkJCSBPTUFQM19QUk1fSVJRU1RBVFVTX01QVV9PRkZTRVQpOwotCXBybV93cml0ZV9tb2RfcmVnKGlycXN0YXR1c19tcHUsIE9DUF9NT0QsCi0JCQkgIE9NQVAzX1BSTV9JUlFTVEFUVVNfTVBVX09GRlNFVCk7CisJCXBybV93cml0ZV9tb2RfcmVnKGlycXN0YXR1c19tcHUsIE9DUF9NT0QsCisJCQkJCU9NQVAzX1BSTV9JUlFTVEFUVVNfTVBVX09GRlNFVCk7CiAKLQl3aGlsZSAocHJtX3JlYWRfbW9kX3JlZyhPQ1BfTU9ELCBPTUFQM19QUk1fSVJRU1RBVFVTX01QVV9PRkZTRVQpKQotCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlIChwcm1fcmVhZF9tb2RfcmVnKE9DUF9NT0QsIE9NQVAzX1BSTV9JUlFTVEFUVVNfTVBVX09GRlNFVCkpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNjI0LDYgKzYzOSwxNyBAQAogCXBybV93cml0ZV9tb2RfcmVnKE9NQVAzNDMwX0lPX0VOIHwgT01BUDM0MzBfV0tVUF9FTiwKIAkJCSAgT0NQX01PRCwgT01BUDNfUFJNX0lSUUVOQUJMRV9NUFVfT0ZGU0VUKTsKIAorCS8qIEVuYWJsZSB3YWtldXBzIGluIFBFUiAqLworCXBybV93cml0ZV9tb2RfcmVnKE9NQVAzNDMwX0VOX0dQSU8yIHwgT01BUDM0MzBfRU5fR1BJTzMgfAorCQkJICBPTUFQMzQzMF9FTl9HUElPNCB8IE9NQVAzNDMwX0VOX0dQSU81IHwKKwkJCSAgT01BUDM0MzBfRU5fR1BJTzYgfCBPTUFQMzQzMF9FTl9VQVJUMywKKwkJCSAgT01BUDM0MzBfUEVSX01PRCwgUE1fV0tFTik7CisJLyogYW5kIGFsbG93IHRoZW0gdG8gd2FrZSB1cCBNUFUgKi8KKwlwcm1fd3JpdGVfbW9kX3JlZyhPTUFQMzQzMF9HUlBTRUxfR1BJTzIgfCBPTUFQMzQzMF9FTl9HUElPMyB8CisJCQkgIE9NQVAzNDMwX0dSUFNFTF9HUElPNCB8IE9NQVAzNDMwX0VOX0dQSU81IHwKKwkJCSAgT01BUDM0MzBfR1JQU0VMX0dQSU82IHwgT01BUDM0MzBfRU5fVUFSVDMsCisJCQkgIE9NQVAzNDMwX1BFUl9NT0QsIE9NQVAzNDMwX1BNX01QVUdSUFNFTCk7CisKIAkvKiBEb24ndCBhdHRhY2ggSVZBIGludGVycnVwdHMgKi8KIAlwcm1fd3JpdGVfbW9kX3JlZygwLCBXS1VQX01PRCwgT01BUDM0MzBfUE1fSVZBR1JQU0VMKTsKIAlwcm1fd3JpdGVfbW9kX3JlZygwLCBDT1JFX01PRCwgT01BUDM0MzBfUE1fSVZBR1JQU0VMMSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMKaW5kZXggMjU5NGNiZi4uZjAwMjg5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uYwpAQCAtMjczLDM1ICsyNzMsNTAgQEAKIH0KIAogLyoqCi0gKiBwd3JkbV9mb3JfZWFjaCAtIGNhbGwgZnVuY3Rpb24gb24gZWFjaCByZWdpc3RlcmVkIGNsb2NrZG9tYWluCisgKiBwd3JkbV9mb3JfZWFjaF9ub2xvY2sgLSBjYWxsIGZ1bmN0aW9uIG9uIGVhY2ggcmVnaXN0ZXJlZCBjbG9ja2RvbWFpbgogICogQGZuOiBjYWxsYmFjayBmdW5jdGlvbiAqCiAgKgogICogQ2FsbCB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gZm9yIGVhY2ggcmVnaXN0ZXJlZCBwb3dlcmRvbWFpbi4gIFRoZQogICogY2FsbGJhY2sgZnVuY3Rpb24gY2FuIHJldHVybiBhbnl0aGluZyBidXQgMCB0byBiYWlsIG91dCBlYXJseSBmcm9tCi0gKiB0aGUgaXRlcmF0b3IuICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHB3cmRtX3J3bG9jawotICogaGVsZCBmb3IgcmVhZGluZywgc28gbm8gcG93ZXJkb21haW4gc3RydWN0dXJlIG1hbmlwdWxhdGlvbgotICogZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2ssIGFsdGhvdWdoIGhhcmR3YXJlCi0gKiBwb3dlcmRvbWFpbiBjb250cm9sIGZ1bmN0aW9ucyBhcmUgZmluZS4gIFJldHVybnMgdGhlIGxhc3QgcmV0dXJuCi0gKiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIHdoaWNoIHNob3VsZCBiZSAwIGZvciBzdWNjZXNzIG9yCi0gKiBhbnl0aGluZyBlbHNlIHRvIGluZGljYXRlIGZhaWx1cmU7IG9yIC1FSU5WQUwgaWYgdGhlIGZ1bmN0aW9uCi0gKiBwb2ludGVyIGlzIG51bGwuCisgKiB0aGUgaXRlcmF0b3IuICBSZXR1cm5zIHRoZSBsYXN0IHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIHdoaWNoCisgKiBzaG91bGQgYmUgMCBmb3Igc3VjY2VzcyBvciBhbnl0aGluZyBlbHNlIHRvIGluZGljYXRlIGZhaWx1cmU7IG9yIC1FSU5WQUwgaWYKKyAqIHRoZSBmdW5jdGlvbiBwb2ludGVyIGlzIG51bGwuCiAgKi8KLWludCBwd3JkbV9mb3JfZWFjaChpbnQgKCpmbikoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgdm9pZCAqdXNlciksCi0JCQl2b2lkICp1c2VyKQoraW50IHB3cmRtX2Zvcl9lYWNoX25vbG9jayhpbnQgKCpmbikoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgdm9pZCAqdXNlciksCisJCQkJdm9pZCAqdXNlcikKIHsKIAlzdHJ1Y3QgcG93ZXJkb21haW4gKnRlbXBfcHdyZG07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghZm4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmVhZF9sb2NrX2lycXNhdmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcF9wd3JkbSwgJnB3cmRtX2xpc3QsIG5vZGUpIHsKIAkJcmV0ID0gKCpmbikodGVtcF9wd3JkbSwgdXNlcik7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHB3cmRtX2Zvcl9lYWNoIC0gY2FsbCBmdW5jdGlvbiBvbiBlYWNoIHJlZ2lzdGVyZWQgY2xvY2tkb21haW4KKyAqIEBmbjogY2FsbGJhY2sgZnVuY3Rpb24gKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgJ3B3cmRtX2Zvcl9lYWNoX25vbG9jaygpJywgYnV0IGtlZXBzIHRoZQorICogJnB3cmRtX3J3bG9jayBsb2NrZWQgZm9yIHJlYWRpbmcsIHNvIG5vIHBvd2VyZG9tYWluIHN0cnVjdHVyZSBtYW5pcHVsYXRpb24KKyAqIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrLCBhbHRob3VnaCBoYXJkd2FyZSBwb3dlcmRvbWFpbgorICogY29udHJvbCBmdW5jdGlvbnMgYXJlIGZpbmUuCisgKi8KK2ludCBwd3JkbV9mb3JfZWFjaChpbnQgKCpmbikoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgdm9pZCAqdXNlciksCisJCQl2b2lkICp1c2VyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZwd3JkbV9yd2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBwd3JkbV9mb3JfZWFjaF9ub2xvY2soZm4sIHVzZXIpOwogCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jCmluZGV4IDNhNTI5YzcuLjU0ZGZlYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYwpAQCAtMTA5LDE2ICsxMDksNiBAQAogCQkucmVnc2hpZnQJPSAyLAogCQkudWFydGNsawk9IE9NQVAyNFhYX0JBU0VfQkFVRCAqIDE2LAogCX0sIHsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNAotCQkubWVtYmFzZQk9IElPX0FERFJFU1MoT01BUF9VQVJUNF9CQVNFKSwKLQkJLm1hcGJhc2UJPSBPTUFQX1VBUlQ0X0JBU0UsCi0JCS5pcnEJCT0gNzAsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJLnJlZ3NoaWZ0CT0gMiwKLQkJLnVhcnRjbGsJPSBPTUFQMjRYWF9CQVNFX0JBVUQgKiAxNiwKLQl9LCB7Ci0jZW5kaWYKIAkJLmZsYWdzCQk9IDAKIAl9CiB9OwpAQCAtMTI2LDcgKzExNiw3IEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDQKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGEzW10gPSB7CiAJewotCQkubWVtYmFzZQk9IElPX0FERFJFU1MoT01BUF9VQVJUNF9CQVNFKSwKKwkJLm1lbWJhc2UJPSBPTUFQMl9JT19BRERSRVNTKE9NQVBfVUFSVDRfQkFTRSksCiAJCS5tYXBiYXNlCT0gT01BUF9VQVJUNF9CQVNFLAogCQkuaXJxCQk9IDcwLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCkBAIC01NzksNyArNTY5LDcgQEAKIAl7CiAJCS5wZGV2ID0gewogCQkJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkJCS5pZAkJCT0gMworCQkJLmlkCQkJPSAzLAogCQkJLmRldgkJCT0gewogCQkJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEzLAogCQkJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnCmluZGV4IDg5Yzk5MmIuLmE2ZjhlYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZwpAQCAtMjEsNiArMjEsMTEgQEAKIAogY29uZmlnIENQVV9QWEE5MzUKIAlib29sICJQWEE5MzUgKGNvZGVuYW1lIFRhdm9yLVA2NSkiCisJc2VsZWN0IENQVV9QWEE5MzAKKworY29uZmlnIENQVV9QWEE5NTAKKwlib29sICJQWEE5NTAgKGNvZGVuYW1lIFRhdm9yLVBWMikiCisJc2VsZWN0IENQVV9QWEE5MzAKIAogZW5kbWVudQogCkBAIC03OSw2ICs4NCwxMiBAQAogCWJvb2wgIk5lYyBNb2JpbGVwcm8gOTAwL2MiCiAJc2VsZWN0IFBYQTI1eAogCitjb25maWcgTUFDSF9CQUxMT09OMworCWJvb2wgIkJhbGxvb24gMyBib2FyZCIKKwlzZWxlY3QgUFhBMjd4CisJc2VsZWN0IElXTU1YVAorCXNlbGVjdCBQWEFfSEFWRV9CT0FSRF9JUlFTCisKIGNvbmZpZyBBUkNIX1BYQV9JRFAKIAlib29sICJBY2NlbGVudCBYc2NhbGUgSURQIgogCXNlbGVjdCBQWEEyNXgKQEAgLTM3MSw2ICszODIsMTUgQEAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gYSBQYWxtIFR1bmdzdGVufEUyCiAJICBoYW5kaGVsZCBjb21wdXRlci4KIAorY29uZmlnIE1BQ0hfUEFMTVRDCisJYm9vbCAiUGFsbSBUdW5nc3RlbnxDIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVJDSF9QWEFfUEFMTQorCXNlbGVjdCBQWEEyNXgKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIGEgUGFsbSBUdW5nc3RlbnxDCisJICBoYW5kaGVsZCBjb21wdXRlci4KKwogY29uZmlnIE1BQ0hfUEFMTVQ1CiAJYm9vbCAiUGFsbSBUdW5nc3RlbnxUNSIKIAlkZWZhdWx0IHkKQEAgLTQ1OCw2ICs0NzgsNyBAQAogCXNlbGVjdCBQWEEyN3gKIAlzZWxlY3QgSVdNTVhUCiAJc2VsZWN0IEhBVkVfUFdNCisJc2VsZWN0IFBYQV9IQVZFX0JPQVJEX0lSUVMKIAogY29uZmlnIE1BQ0hfRVpYX0E3ODAKIAlib29sICJNb3Rvcm9sYSBFWlggQTc4MCIKQEAgLTQ4OSw2ICs1MTAsMjEgQEAKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIFBYQV9FWlgKIAorY29uZmlnIE1BQ0hfWENFUAorCWJvb2wgIklza3JhdGVsIEVsZWN0cm9uaWNzIFhDRVAiCisJc2VsZWN0IFBYQTI1eAorCXNlbGVjdCBNVEQKKwlzZWxlY3QgTVREX1BBUlRJVElPTlMKKwlzZWxlY3QgTVREX1BIWVNNQVAKKwlzZWxlY3QgTVREX0NGSV9JTlRFTEVYVAorCXNlbGVjdCBNVERfQ0ZJCisJc2VsZWN0IE1URF9DSEFSCisJc2VsZWN0IFNNQzkxWAorCXNlbGVjdCBQWEFfU1NQCisJaGVscAorCSAgUFhBMjU1IGJhc2VkIFNpbmdsZSBCb2FyZCBDb21wdXRlciB3aXRoIFNNQyA5MUMxMTEgZXRoZXJuZXQgY2hpcCBhbmQgNjQgTUIgb2YgZmxhc2guCisJICBUdW5lZCBmb3IgdXNhZ2UgaW4gTGliZXJhIGluc3RydW1lbnRzIGZvciBwYXJ0aWNsZSBhY2NlbGVyYXRvcnMuCisKIGVuZG1lbnUKIAogY29uZmlnIFBYQTI1eApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQppbmRleCBkNGM2MTIyLi5mMTBlMTUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQpAQCAtMzEsNiArMzEsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfTFVCQk9DSykJKz0gbHViYm9jay5vCiBvYmotJChDT05GSUdfTUFDSF9MT0dJQ1BEX1BYQTI3MCkgKz0gbHBkMjcwLm8KIG9iai0kKENPTkZJR19NQUNIX01BSU5TVE9ORSkJKz0gbWFpbnN0b25lLm8KK29iai0kKENPTkZJR19NQUNIX0JBTExPT04zKQkrPSBiYWxsb29uMy5vCiBvYmotJChDT05GSUdfTUFDSF9NUDkwMEMpCSs9IG1wOTAwLm8KIG9iai0kKENPTkZJR19BUkNIX1BYQV9JRFApCSs9IGlkcC5vCiBvYmotJChDT05GSUdfTUFDSF9UUklaRVBTNCkJKz0gdHJpemVwczQubwpAQCAtNTgsNiArNTksNyBAQAogb2JqLSQoQ09ORklHX01BQ0hfRTQwMCkJCSs9IGU0MDAubwogb2JqLSQoQ09ORklHX01BQ0hfRTgwMCkJCSs9IGU4MDAubwogb2JqLSQoQ09ORklHX01BQ0hfUEFMTVRFMikJKz0gcGFsbXRlMi5vCitvYmotJChDT05GSUdfTUFDSF9QQUxNVEMpCSs9IHBhbG10Yy5vCiBvYmotJChDT05GSUdfTUFDSF9QQUxNVDUpCSs9IHBhbG10NS5vCiBvYmotJChDT05GSUdfTUFDSF9QQUxNVFgpCSs9IHBhbG10eC5vCiBvYmotJChDT05GSUdfTUFDSF9QQUxNTEQpCSs9IHBhbG1sZC5vCkBAIC03OCw2ICs4MCw4IEBACiBvYmotJChDT05GSUdfTUFDSF9DTV9YMzAwKSAgICAgICs9IGNtLXgzMDAubwogb2JqLSQoQ09ORklHX1BYQV9FWlgpICAgICAgICAgICArPSBlengubwogCitvYmotJChDT05GSUdfTUFDSF9YQ0VQKSAgICAgICAgICs9IHhjZXAubworCiBvYmotJChDT05GSUdfTUFDSF9JTlRFTE1PVEUyKSAgICs9IGltb3RlMi5vCiBvYmotJChDT05GSUdfTUFDSF9TVEFSR0FURTIpCSs9IHN0YXJnYXRlMi5vCiBvYmotJChDT05GSUdfTUFDSF9DU0I3MjYpCSs9IGNzYjcyNi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9iYWxsb29uMy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvYmFsbG9vbjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjMxMzhiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvYmFsbG9vbjMuYwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS9iYWxsb29uMy5jCisgKgorICogIFN1cHBvcnQgZm9yIEJhbGxvb25ib2FyZC5vcmcgQmFsbG9vbjMgYm9hcmQuCisgKgorICogIEF1dGhvcjoJTmljayBCYW5lLCBXb29rZXksIEpvbmF0aGFuIE1jRG93ZWxsCisgKiAgQ3JlYXRlZDoJSnVuZSwgMjAwNgorICogIENvcHlyaWdodDoJVG9ieSBDaHVyY2hpbGwgTHRkCisgKiAgRGVyaXZlZCBmcm9tIG1haW5zdG9uZS5jLCBieSBOaWNvIFBpdHJlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisKKyNpbmNsdWRlIDxtYWNoL3B4YTI3eC5oPgorI2luY2x1ZGUgPG1hY2gvYmFsbG9vbjMuaD4KKyNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgorI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC91ZGMuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTI3eC11ZGMuaD4KKyNpbmNsdWRlIDxtYWNoL2lyZGEuaD4KKyNpbmNsdWRlIDxtYWNoL29oY2kuaD4KKworI2luY2x1ZGUgPHBsYXQvaTJjLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiYWxsb29uM19pcnFfZW5hYmxlZDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFsbG9vbjNfZmVhdHVyZXNfcHJlc2VudCA9CisJCSgxIDw8IEJBTExPT04zX0ZFQVRVUkVfT0hDSSkgfCAoMSA8PCBCQUxMT09OM19GRUFUVVJFX0NGKSB8CisJCSgxIDw8IEJBTExPT04zX0ZFQVRVUkVfQVVESU8pIHwKKwkJKDEgPDwgQkFMTE9PTjNfRkVBVFVSRV9UT1BQT0xZKTsKKworaW50IGJhbGxvb24zX2hhcyhlbnVtIGJhbGxvb24zX2ZlYXR1cmVzIGZlYXR1cmUpCit7CisJcmV0dXJuIChiYWxsb29uM19mZWF0dXJlc19wcmVzZW50ICYgKDEgPDwgZmVhdHVyZSkpID8gMSA6IDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChiYWxsb29uM19oYXMpOworCitpbnQgX19pbml0IHBhcnNlX2JhbGxvb24zX2ZlYXR1cmVzKGNoYXIgKmFyZykKK3sKKwlpZiAoIWFyZykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc3RyaWN0X3N0cnRvdWwoYXJnLCAwLCAmYmFsbG9vbjNfZmVhdHVyZXNfcHJlc2VudCk7Cit9CitlYXJseV9wYXJhbSgiYmFsbG9vbjNfZmVhdHVyZXMiLCBwYXJzZV9iYWxsb29uM19mZWF0dXJlcyk7CisKK3N0YXRpYyB2b2lkIGJhbGxvb24zX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGJhbGxvb24zX2lycSA9IChpcnEgLSBCQUxMT09OM19JUlEoMCkpOworCWJhbGxvb24zX2lycV9lbmFibGVkICY9IH4oMSA8PCBiYWxsb29uM19pcnEpOworCV9fcmF3X3dyaXRlbCh+YmFsbG9vbjNfaXJxX2VuYWJsZWQsIEJBTExPT04zX0lOVF9DT05UUk9MX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGJhbGxvb24zX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgYmFsbG9vbjNfaXJxID0gKGlycSAtIEJBTExPT04zX0lSUSgwKSk7CisJYmFsbG9vbjNfaXJxX2VuYWJsZWQgfD0gKDEgPDwgYmFsbG9vbjNfaXJxKTsKKwlfX3Jhd193cml0ZWwofmJhbGxvb24zX2lycV9lbmFibGVkLCBCQUxMT09OM19JTlRfQ09OVFJPTF9SRUcpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJhbGxvb24zX2lycV9jaGlwID0geworCS5uYW1lCQk9ICJGUEdBIiwKKwkuYWNrCQk9IGJhbGxvb24zX21hc2tfaXJxLAorCS5tYXNrCQk9IGJhbGxvb24zX21hc2tfaXJxLAorCS51bm1hc2sJCT0gYmFsbG9vbjNfdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyB2b2lkIGJhbGxvb24zX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBsb25nIHBlbmRpbmcgPSBfX3Jhd19yZWFkbChCQUxMT09OM19JTlRfQ09OVFJPTF9SRUcpICYKKwkJCQkJYmFsbG9vbjNfaXJxX2VuYWJsZWQ7CisKKwlkbyB7CisJCS8qIGNsZWFyIHVzZWxlc3MgZWRnZSBub3RpZmljYXRpb24gKi8KKwkJaWYgKGRlc2MtPmNoaXAtPmFjaykKKwkJCWRlc2MtPmNoaXAtPmFjayhCQUxMT09OM19BVVhfTklSUSk7CisJCXdoaWxlIChwZW5kaW5nKSB7CisJCQlpcnEgPSBCQUxMT09OM19JUlEoMCkgKyBfX2ZmcyhwZW5kaW5nKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOworCQkJcGVuZGluZyAmPSBwZW5kaW5nIC0gMTsKKwkJfQorCQlwZW5kaW5nID0gX19yYXdfcmVhZGwoQkFMTE9PTjNfSU5UX0NPTlRST0xfUkVHKSAmCisJCQkJYmFsbG9vbjNfaXJxX2VuYWJsZWQ7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBiYWxsb29uM19pbml0X2lycSh2b2lkKQoreworCWludCBpcnE7CisKKwlweGEyN3hfaW5pdF9pcnEoKTsKKwkvKiBzZXR1cCBleHRyYSBCYWxsb29uMyBpcnFzICovCisJZm9yIChpcnEgPSBCQUxMT09OM19JUlEoMCk7IGlycSA8PSBCQUxMT09OM19JUlEoNyk7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZiYWxsb29uM19pcnFfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCX0KKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKEJBTExPT04zX0FVWF9OSVJRLCBiYWxsb29uM19pcnFfaGFuZGxlcik7CisJc2V0X2lycV90eXBlKEJBTExPT04zX0FVWF9OSVJRLCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOworCisJcHJfZGVidWcoIiVzOiBjaGFpbmVkIGhhbmRsZXIgaW5zdGFsbGVkIC0gaXJxICVkIGF1dG9tYXRpY2FsbHkgIgorCQkiZW5hYmxlZFxuIiwgX19mdW5jX18sIEJBTExPT04zX0FVWF9OSVJRKTsKK30KKworc3RhdGljIHZvaWQgYmFsbG9vbjNfYmFja2xpZ2h0X3Bvd2VyKGludCBvbikKK3sKKwlwcl9kZWJ1ZygiJXM6IHBvd2VyIGlzICVzXG4iLCBfX2Z1bmNfXywgb24gPyAib24iIDogIm9mZiIpOworCWdwaW9fc2V0X3ZhbHVlKEJBTExPT04zX0dQSU9fUlVOX0JBQ0tMSUdIVCwgb24pOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiYWxsb29uM19sY2RfcGluX2NvbmZpZ1tdID0geworCS8qIExDRCAtIDE2YnBwIEFjdGl2ZSBURlQgKi8KKwlHUElPNThfTENEX0xERF8wLAorCUdQSU81OV9MQ0RfTEREXzEsCisJR1BJTzYwX0xDRF9MRERfMiwKKwlHUElPNjFfTENEX0xERF8zLAorCUdQSU82Ml9MQ0RfTEREXzQsCisJR1BJTzYzX0xDRF9MRERfNSwKKwlHUElPNjRfTENEX0xERF82LAorCUdQSU82NV9MQ0RfTEREXzcsCisJR1BJTzY2X0xDRF9MRERfOCwKKwlHUElPNjdfTENEX0xERF85LAorCUdQSU82OF9MQ0RfTEREXzEwLAorCUdQSU82OV9MQ0RfTEREXzExLAorCUdQSU83MF9MQ0RfTEREXzEyLAorCUdQSU83MV9MQ0RfTEREXzEzLAorCUdQSU83Ml9MQ0RfTEREXzE0LAorCUdQSU83M19MQ0RfTEREXzE1LAorCUdQSU83NF9MQ0RfRkNMSywKKwlHUElPNzVfTENEX0xDTEssCisJR1BJTzc2X0xDRF9QQ0xLLAorCUdQSU83N19MQ0RfQklBUywKKworCUdQSU85OV9HUElPLAkJLyogQmFja2xpZ2h0ICovCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21vZGVfaW5mbyBiYWxsb29uM19sY2RfbW9kZXNbXSA9IHsKKwl7CisJCS5waXhjbG9jawkJPSAzODAwMCwKKwkJLnhyZXMJCQk9IDQ4MCwKKwkJLnlyZXMJCQk9IDY0MCwKKwkJLmJwcAkJCT0gMTYsCisJCS5oc3luY19sZW4JCT0gOCwKKwkJLmxlZnRfbWFyZ2luCQk9IDgsCisJCS5yaWdodF9tYXJnaW4JCT0gOCwKKwkJLnZzeW5jX2xlbgkJPSAyLAorCQkudXBwZXJfbWFyZ2luCQk9IDQsCisJCS5sb3dlcl9tYXJnaW4JCT0gNSwKKwkJLnN5bmMJCQk9IDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGJhbGxvb24zX3B4YWZiX2luZm8gPSB7CisJLm1vZGVzCQkJPSBiYWxsb29uM19sY2RfbW9kZXMsCisJLm51bV9tb2RlcwkJPSBBUlJBWV9TSVpFKGJhbGxvb24zX2xjZF9tb2RlcyksCisJLmxjZF9jb25uCQk9IExDRF9DT0xPUl9URlRfMTZCUFAgfCBMQ0RfUENMS19FREdFX0ZBTEwsCisJLnB4YWZiX2JhY2tsaWdodF9wb3dlcgk9IGJhbGxvb24zX2JhY2tsaWdodF9wb3dlciwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJhbGxvb24zX21tY19waW5fY29uZmlnW10gPSB7CisJR1BJTzMyX01NQ19DTEssCisJR1BJTzkyX01NQ19EQVRfMCwKKwlHUElPMTA5X01NQ19EQVRfMSwKKwlHUElPMTEwX01NQ19EQVRfMiwKKwlHUElPMTExX01NQ19EQVRfMywKKwlHUElPMTEyX01NQ19DTUQsCit9OworCitzdGF0aWMgdm9pZCBiYWxsb29uM19tY2lfc2V0cG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdmRkKQoreworCXN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSAqcF9kID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCgxIDw8IHZkZCkgJiBwX2QtPm9jcl9tYXNrKSB7CisJCXByX2RlYnVnKCIlczogb25cbiIsIF9fZnVuY19fKTsKKwkJLyogRklYTUUgc29tZXRoaW5nIHRvIHByb2QgaGVyZT8gKi8KKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IG9mZlxuIiwgX19mdW5jX18pOworCQkvKiBGSVhNRSBzb21ldGhpbmcgdG8gcHJvZCBoZXJlPyAqLworCX0KK30KKworc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBiYWxsb29uM19tY2lfcGxhdGZvcm1fZGF0YSA9IHsKKwkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLnNldHBvd2VyIAk9IGJhbGxvb24zX21jaV9zZXRwb3dlciwKK307CisKK3N0YXRpYyBpbnQgYmFsbG9vbjNfdWRjX2lzX2Nvbm5lY3RlZCh2b2lkKQoreworCXByX2RlYnVnKCIlczogdWRjIGNvbm5lY3RlZFxuIiwgX19mdW5jX18pOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBiYWxsb29uM191ZGNfY29tbWFuZChpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQWEEyWFhfVURDX0NNRF9DT05ORUNUOgorCQlVUDJPQ1IgfD0gKFVQMk9DUl9EUFBVRSArIFVQMk9DUl9EUFBVQkUpOworCQlwcl9kZWJ1ZygiJXM6IGNvbm5lY3RcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJY2FzZSBQWEEyWFhfVURDX0NNRF9ESVNDT05ORUNUOgorCQlVUDJPQ1IgJj0gflVQMk9DUl9EUFBVRTsKKwkJcHJfZGVidWcoIiVzOiBkaXNjb25uZWN0XG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbyBiYWxsb29uM191ZGNfaW5mbyA9IHsKKwkudWRjX2lzX2Nvbm5lY3RlZCA9IGJhbGxvb24zX3VkY19pc19jb25uZWN0ZWQsCisJLnVkY19jb21tYW5kICAgICAgPSBiYWxsb29uM191ZGNfY29tbWFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIGJhbGxvb24zX2ZpY3BfcGxhdGZvcm1fZGF0YSA9IHsKKwkudHJhbnNjZWl2ZXJfY2FwICA9IElSX1NJUk1PREUgfCBJUl9GSVJNT0RFIHwgSVJfT0ZGLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFsbG9vbjNfb2hjaV9waW5fY29uZmlnW10gPSB7CisJR1BJTzg4X1VTQkgxX1BXUiwKKwlHUElPODlfVVNCSDFfUEVOLAorfTsKKworc3RhdGljIHN0cnVjdCBweGFvaGNpX3BsYXRmb3JtX2RhdGEgYmFsbG9vbjNfb2hjaV9wbGF0Zm9ybV9kYXRhID0geworCS5wb3J0X21vZGUJPSBQTU1fUEVSUE9SVF9NT0RFLAorCS5mbGFncwkJPSBFTkFCTEVfUE9SVF9BTEwgfCBQT1dFUl9DT05UUk9MX0xPVyB8IFBPV0VSX1NFTlNFX0xPVywKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJhbGxvb24zX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIFNlbGVjdCBCVFVBUlQgJ0NPTTEvdHR5UzAnIGFzIElPIG9wdGlvbiBmb3IgcGlucyA0Mi80My80NC80NSAqLworCUdQSU80Ml9CVFVBUlRfUlhELAorCUdQSU80M19CVFVBUlRfVFhELAorCUdQSU80NF9CVFVBUlRfQ1RTLAorCUdQSU80NV9CVFVBUlRfUlRTLAorCisJLyogV2FrZXVwIEdQSU8gKi8KKwlHUElPMV9HUElPIHwgV0FLRVVQX09OX0VER0VfQk9USCwKKworCS8qIE5BTkQgJiBJRExFIExFRCBHUElPcyAqLworCUdQSU85X0dQSU8sCisJR1BJTzEwX0dQSU8sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGJhbGxvb24zX2dwaW9fbGVkc1tdID0geworCXsKKwkJLm5hbWUJCQk9ICJiYWxsb29uMzpncmVlbjppZGxlIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJoZWFydGJlYXQiLAorCQkuZ3BpbwkJCT0gQkFMTE9PTjNfR1BJT19MRURfSURMRSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJiYWxsb29uMzpncmVlbjpuYW5kIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJuYW5kLWRpc2siLAorCQkuZ3BpbwkJCT0gQkFMTE9PTjNfR1BJT19MRURfTkFORCwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGJhbGxvb24zX2dwaW9fbGVkc19wbGF0Zm9ybV9kYXRhID0geworCS5sZWRzCQk9IGJhbGxvb24zX2dwaW9fbGVkcywKKwkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGJhbGxvb24zX2dwaW9fbGVkcyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiYWxsb29uM2xlZF9kZXZpY2UgPSB7CisJLm5hbWUJPSAibGVkcy1ncGlvIiwKKwkuaWQJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZiYWxsb29uM19ncGlvX2xlZHNfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGJhbGxvb24zX2luaXQodm9pZCkKK3sKKwlwcl9pbmZvKCJJbml0aWFsaXNpbmcgQmFsbG9vbjNcbiIpOworCisJLyogc3lzdGVtIGJ1cyBhcmJpdGVyIHNldHRpbmcKKwkgKiAtIENvcmVfUGFyaworCSAqIC0gTENEX3d0OkRNQV93dDpDT1JFX1d0ID0gMjozOjQKKwkgKi8KKwlBUkJfQ05UUkwgPSBBUkJfQ09SRV9QQVJLIHwgMHgyMzQ7CisKKwlweGFfc2V0X2kyY19pbmZvKE5VTEwpOworCWlmIChiYWxsb29uM19oYXMoQkFMTE9PTjNfRkVBVFVSRV9BVURJTykpCisJCXB4YV9zZXRfYWM5N19pbmZvKE5VTEwpOworCisJaWYgKGJhbGxvb24zX2hhcyhCQUxMT09OM19GRUFUVVJFX1RPUFBPTFkpKSB7CisJCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGJhbGxvb24zX2xjZF9waW5fY29uZmlnKSk7CisJCWdwaW9fcmVxdWVzdChCQUxMT09OM19HUElPX1JVTl9CQUNLTElHSFQsCisJCQkiTENEIEJhY2tsaWdodCBQb3dlciIpOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoQkFMTE9PTjNfR1BJT19SVU5fQkFDS0xJR0hULCAxKTsKKwkJc2V0X3B4YV9mYl9pbmZvKCZiYWxsb29uM19weGFmYl9pbmZvKTsKKwl9CisKKwlpZiAoYmFsbG9vbjNfaGFzKEJBTExPT04zX0ZFQVRVUkVfTU1DKSkgeworCQlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShiYWxsb29uM19tbWNfcGluX2NvbmZpZykpOworCQlweGFfc2V0X21jaV9pbmZvKCZiYWxsb29uM19tY2lfcGxhdGZvcm1fZGF0YSk7CisJfQorCXB4YV9zZXRfZmljcF9pbmZvKCZiYWxsb29uM19maWNwX3BsYXRmb3JtX2RhdGEpOworCWlmIChiYWxsb29uM19oYXMoQkFMTE9PTjNfRkVBVFVSRV9PSENJKSkgeworCQlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShiYWxsb29uM19vaGNpX3Bpbl9jb25maWcpKTsKKwkJcHhhX3NldF9vaGNpX2luZm8oJmJhbGxvb24zX29oY2lfcGxhdGZvcm1fZGF0YSk7CisJfQorCXB4YV9zZXRfdWRjX2luZm8oJmJhbGxvb24zX3VkY19pbmZvKTsKKworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGJhbGxvb24zX3Bpbl9jb25maWcpKTsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYmFsbG9vbjNsZWRfZGV2aWNlKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBiYWxsb29uM19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CS8qIENQTEQvRlBHQSAqLworCQkudmlydHVhbAk9ICBCQUxMT09OM19GUEdBX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihCQUxMT09OM19GUEdBX1BIWVMpLAorCQkubGVuZ3RoCQk9IEJBTExPT04zX0ZQR0FfTEVOR1RILAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBiYWxsb29uM19tYXBfaW8odm9pZCkKK3sKKwlweGFfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KGJhbGxvb24zX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYmFsbG9vbjNfaW9fZGVzYykpOworfQorCitNQUNISU5FX1NUQVJUKEJBTExPT04zLCAiQmFsbG9vbjMiKQorCS8qIE1haW50YWluZXI6IE5pY2sgQmFuZS4gKi8KKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBiYWxsb29uM19tYXBfaW8sCisJLmluaXRfaXJxCT0gYmFsbG9vbjNfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGJhbGxvb24zX2luaXQsCisJLmJvb3RfcGFyYW1zCT0gUEhZU19PRkZTRVQgKyAweDEwMCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2suaAppbmRleCA1NTk5YmNlLi45NzhhMzY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2Nsb2NrLmgKQEAgLTEyLDcgKzEyLDYgQEAKIAl1bnNpZ25lZCBpbnQJCWNrZW47CiAJdW5zaWduZWQgaW50CQlkZWxheTsKIAl1bnNpZ25lZCBpbnQJCWVuYWJsZWQ7Ci0Jc3RydWN0IGNsawkJKm90aGVyOwogfTsKIAogI2RlZmluZSBJTklUX0NMS1JFRyhfY2xrLF9kZXZuYW1lLF9jb25uYW1lKQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC5jCmluZGV4IDFkMmNlYzIuLmVlYTc4YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNzAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14MjcwLmMKQEAgLTEzLDEzICsxMywxOCBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8bGludXgvcnRjLXYzMDIwLmg+CiAjaW5jbHVkZSA8dmlkZW8vbWJ4ZmIuaD4KIAorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvbGliZXJ0YXNfc3BpLmg+CisKICNpbmNsdWRlIDxtYWNoL3B4YTI3eC5oPgogI2luY2x1ZGUgPG1hY2gvb2hjaS5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC9weGEyeHhfc3BpLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKQEAgLTM0LDYgKzM5LDEwIEBACiAvKiBNTUMgcG93ZXIgZW5hYmxlICovCiAjZGVmaW5lIEdQSU8xMDVfTU1DX1BPV0VSCSgxMDUpCiAKKy8qIFdMQU4gR1BJT1MgKi8KKyNkZWZpbmUgR1BJTzE5X1dMQU5fU1RSQVAJKDE5KQorI2RlZmluZSBHUElPMTAyX1dMQU5fUlNUCSgxMDIpCisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNteDI3MF9waW5fY29uZmlnW10gPSB7CiAJLyogQUMnOTcgKi8KIAlHUElPMjhfQUM5N19CSVRDTEssCkBAIC05NCw4ICsxMDMsOCBAQAogCUdQSU8yNl9TU1AxX1JYRCwKIAogCS8qIFNTUDIgKi8KLQlHUElPMTlfU1NQMl9TQ0xLLAotCUdQSU8xNF9TU1AyX1NGUk0sCisJR1BJTzE5X0dQSU8sCS8qIFNTUDIgY2xvY2sgaXMgdXNlZCBhcyBHUElPIGZvciBMaWJlcnRhcyBwaW4tc3RyYXAgKi8KKwlHUElPMTRfR1BJTywKIAlHUElPODdfU1NQMl9UWEQsCiAJR1BJTzg4X1NTUDJfUlhELAogCkBAIC0xMjMsNiArMTMyLDcgQEAKIAlHUElPMF9HUElPCXwgV0FLRVVQX09OX0VER0VfQk9USCwKIAlHUElPMTA1X0dQSU8JfCBNRlBfTFBNX0RSSVZFX0hJR0gsCS8qIE1NQy9TRCBwb3dlciAqLwogCUdQSU81M19HUElPLAkJCQkvKiBQQyBjYXJkIHJlc2V0ICovCisJR1BJTzEwMl9HUElPLAkJCQkvKiBXTEFOIHJlc2V0ICovCiAKIAkvKiBOQU5EIGNvbnRyb2xzICovCiAJR1BJTzExX0dQSU8JfCBNRlBfTFBNX0RSSVZFX0hJR0gsCS8qIE5BTkQgQ0UjICovCkBAIC0xMzEsNiArMTQxLDcgQEAKIAkvKiBpbnRlcnJ1cHRzICovCiAJR1BJTzEwX0dQSU8sCS8qIERNOTAwMCBpbnRlcnJ1cHQgKi8KIAlHUElPODNfR1BJTywJLyogTU1DIGNhcmQgZGV0ZWN0ICovCisJR1BJTzk1X0dQSU8sCS8qIFdMQU4gaW50ZXJydXB0ICovCiB9OwogCiAvKiBWMzAyMCBSVEMgKi8KQEAgLTI3MSw1NiArMjgyLDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01NQykgfHwgZGVmaW5lZChDT05GSUdfTU1DX01PRFVMRSkKLXN0YXRpYyBpbnQgY214MjcwX21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgIGlycV9oYW5kbGVyX3QgY214MjcwX2RldGVjdF9pbnQsCi0JCQkgICB2b2lkICpkYXRhKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBncGlvX3JlcXVlc3QoR1BJTzEwNV9NTUNfUE9XRVIsICJNTUMvU0QgcG93ZXIiKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl93YXJuKGRldiwgInBvd2VyIGdwaW8gdW5hdmFpbGFibGVcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPMTA1X01NQ19QT1dFUiwgMCk7Ci0KLQllcnIgPSByZXF1ZXN0X2lycShDTVgyNzBfTU1DX0lSUSwgY214MjcwX2RldGVjdF9pbnQsCi0JCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCSAgIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOwotCWlmIChlcnIpIHsKLQkJZ3Bpb19mcmVlKEdQSU8xMDVfTU1DX1BPV0VSKTsKLQkJZGV2X2VycihkZXYsICJjbXgyNzBfbWNpX2luaXQ6IE1NQy9TRDogY2FuJ3QiCi0JCQkiIHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIik7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgY214MjcwX21jaV9zZXRwb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2ZGQpCi17Ci0Jc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhICpwX2QgPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoKDEgPDwgdmRkKSAmIHBfZC0+b2NyX21hc2spIHsKLQkJZGV2X2RiZyhkZXYsICJwb3dlciBvblxuIik7Ci0JCWdwaW9fc2V0X3ZhbHVlKEdQSU8xMDVfTU1DX1BPV0VSLCAwKTsKLQl9IGVsc2UgewotCQlncGlvX3NldF92YWx1ZShHUElPMTA1X01NQ19QT1dFUiwgMSk7Ci0JCWRldl9kYmcoZGV2LCAicG93ZXIgb2ZmXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNteDI3MF9tY2lfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JZnJlZV9pcnEoQ01YMjcwX01NQ19JUlEsIGRhdGEpOwotCWdwaW9fZnJlZShHUElPMTA1X01NQ19QT1dFUik7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY214MjcwX21jaV9wbGF0Zm9ybV9kYXRhID0gewotCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKLQkuaW5pdCAJCT0gY214MjcwX21jaV9pbml0LAotCS5zZXRwb3dlciAJPSBjbXgyNzBfbWNpX3NldHBvd2VyLAotCS5leGl0CQk9IGNteDI3MF9tY2lfZXhpdCwKKwkub2NyX21hc2sJCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gR1BJTzgzX01NQ19JUlEsCisJLmdwaW9fY2FyZF9ybwkJPSAtMSwKKwkuZ3Bpb19wb3dlcgkJPSBHUElPMTA1X01NQ19QT1dFUiwKKwkuZ3Bpb19wb3dlcl9pbnZlcnQJPSAxLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGNteDI3MF9pbml0X21tYyh2b2lkKQpAQCAtMzMxLDYgKzI5OCwxMDAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbXgyNzBfaW5pdF9tbWModm9pZCkge30KICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1BYQTJYWCkgfHwgZGVmaW5lZChDT05GSUdfU1BJX1BYQTJYWF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHB4YTJ4eF9zcGlfbWFzdGVyIGNtX3gyNzBfc3BpX2luZm8gPSB7CisJLm51bV9jaGlwc2VsZWN0CT0gMSwKKwkuZW5hYmxlX2RtYQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHB4YTJ4eF9zcGlfY2hpcCBjbV94MjcwX2xpYmVydGFzX2NoaXAgPSB7CisJLnJ4X3RocmVzaG9sZAk9IDEsCisJLnR4X3RocmVzaG9sZAk9IDEsCisJLnRpbWVvdXQJPSAxMDAwLAorCS5ncGlvX2NzCT0gMTQsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbV94MjcwX2xpYmVydGFzX3Bpbl9jb25maWdbXSA9IHsKKwkvKiBTU1AyICovCisJR1BJTzE5X1NTUDJfU0NMSywKKwlHUElPMTRfR1BJTywKKwlHUElPODdfU1NQMl9UWEQsCisJR1BJTzg4X1NTUDJfUlhELAorCit9OworCitzdGF0aWMgaW50IGNtX3gyNzBfbGliZXJ0YXNfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU8xOV9XTEFOX1NUUkFQLCAiV0xBTiBTVFJBUCIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoR1BJTzEwMl9XTEFOX1JTVCwgIldMQU4gUlNUIik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9zdHJhcDsKKworCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPMTAyX1dMQU5fUlNULCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX3N0cmFwOworCW1zbGVlcCgxMDApOworCisJZXJyID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU8xOV9XTEFOX1NUUkFQLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX3N0cmFwOworCW1zbGVlcCgxMDApOworCisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoY21feDI3MF9saWJlcnRhc19waW5fY29uZmlnKSk7CisKKwlncGlvX3NldF92YWx1ZShHUElPMTAyX1dMQU5fUlNULCAxKTsKKwltc2xlZXAoMTAwKTsKKworCXNwaS0+Yml0c19wZXJfd29yZCA9IDE2OworCXNwaV9zZXR1cChzcGkpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX3N0cmFwOgorCWdwaW9fZnJlZShHUElPMTlfV0xBTl9TVFJBUCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNtX3gyNzBfbGliZXJ0YXNfdGVhcmRvd24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlncGlvX3NldF92YWx1ZShHUElPMTAyX1dMQU5fUlNULCAwKTsKKwlncGlvX2ZyZWUoR1BJTzEwMl9XTEFOX1JTVCk7CisJZ3Bpb19mcmVlKEdQSU8xOV9XTEFOX1NUUkFQKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGliZXJ0YXNfc3BpX3BsYXRmb3JtX2RhdGEgY21feDI3MF9saWJlcnRhc19wZGF0YSA9IHsKKwkudXNlX2R1bW15X3dyaXRlcwk9IDEsCisJLnNldHVwCQkJPSBjbV94MjcwX2xpYmVydGFzX3NldHVwLAorCS50ZWFyZG93bgkJPSBjbV94MjcwX2xpYmVydGFzX3RlYXJkb3duLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBjbV94MjcwX3NwaV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5tb2RhbGlhcwkJPSAibGliZXJ0YXNfc3BpIiwKKwkJLm1heF9zcGVlZF9oegkJPSAxMzAwMDAwMCwKKwkJLmJ1c19udW0JCT0gMiwKKwkJLmlycQkJCT0gZ3Bpb190b19pcnEoOTUpLAorCQkuY2hpcF9zZWxlY3QJCT0gMCwKKwkJLmNvbnRyb2xsZXJfZGF0YQk9ICZjbV94MjcwX2xpYmVydGFzX2NoaXAsCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZjbV94MjcwX2xpYmVydGFzX3BkYXRhLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY214MjcwX2luaXRfc3BpKHZvaWQpCit7CisJcHhhMnh4X3NldF9zcGlfaW5mbygyLCAmY21feDI3MF9zcGlfaW5mbyk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oQVJSQVlfQU5EX1NJWkUoY21feDI3MF9zcGlfZGV2aWNlcykpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXgyNzBfaW5pdF9zcGkodm9pZCkge30KKyNlbmRpZgorCiB2b2lkIF9faW5pdCBjbXgyNzBfaW5pdCh2b2lkKQogewogCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGNteDI3MF9waW5fY29uZmlnKSk7CkBAIC0zNDMsNCArNDA0LDUgQEAKIAljbXgyNzBfaW5pdF9tbWMoKTsKIAljbXgyNzBfaW5pdF9vaGNpKCk7CiAJY214MjcwX2luaXRfMjcwMEcoKTsKKwljbXgyNzBfaW5pdF9zcGkoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYwppbmRleCA0NjVkYTI2Li4xMDI5MTZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14MzAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDMwMC5jCkBAIC00MywxMCArNDMsMTAgQEAKIAogI2RlZmluZSBDTV9YMzAwX0VUSF9QSFlTCTB4MDgwMDAwMTAKIAotI2RlZmluZSBHUElPODJfTU1DMl9JUlEJCSg4MikKLSNkZWZpbmUgR1BJTzg1X01NQzJfV1AJCSg4NSkKKyNkZWZpbmUgR1BJTzgyX01NQ19JUlEJCSg4MikKKyNkZWZpbmUgR1BJTzg1X01NQ19XUAkJKDg1KQogCi0jZGVmaW5lCUNNX1gzMDBfTU1DMl9JUlEJSVJRX0dQSU8oR1BJTzgyX01NQzJfSVJRKQorI2RlZmluZQlDTV9YMzAwX01NQ19JUlEJCUlSUV9HUElPKEdQSU84Ml9NTUNfSVJRKQogCiAjZGVmaW5lIEdQSU85NV9SVENfQ1MJCSg5NSkKICNkZWZpbmUgR1BJTzk2X1JUQ19XUgkJKDk2KQpAQCAtMjkyLDgyICsyOTIsMzUgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfTU9EVUxFKQotLyogVGhlIGZpcnN0IE1NQyBzbG90IG9mIENNLVgzMDAgaXMgaGFyZHdpcmVkIHRvIExpYmVydGFzIGNhcmQgYW5kIGhhcwotICAgbm8gZGV0ZWN0aW9uL3JvIHBpbnMgKi8KLXN0YXRpYyBpbnQgY21feDMwMF9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgaXJxX2hhbmRsZXJfdCBjbV94MzAwX2RldGVjdF9pbnQsCi0JCQkgICAgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY21feDMwMF9tY2lfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY21feDMwMF9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkuZGV0ZWN0X2RlbGF5CT0gMjAsCi0JLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAotCS5pbml0IAkJPSBjbV94MzAwX21jaV9pbml0LAotCS5leGl0CQk9IGNtX3gzMDBfbWNpX2V4aXQsCisJLmRldGVjdF9kZWxheQkJPSAyMCwKKwkub2NyX21hc2sJCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gR1BJTzgyX01NQ19JUlEsCisJLmdwaW9fY2FyZF9ybwkJPSBHUElPODVfTU1DX1dQLAorCS5ncGlvX3Bvd2VyCQk9IC0xLAogfTsKIAotc3RhdGljIGludCBjbV94MzAwX21jaTJfcm8oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBncGlvX2dldF92YWx1ZShHUElPODVfTU1DMl9XUCk7Ci19Ci0KKy8qIFRoZSBzZWNvbmQgTU1DIHNsb3Qgb2YgQ00tWDMwMCBpcyBoYXJkd2lyZWQgdG8gTGliZXJ0YXMgY2FyZCBhbmQgaGFzCisgICBubyBkZXRlY3Rpb24vcm8gcGlucyAqLwogc3RhdGljIGludCBjbV94MzAwX21jaTJfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIGlycV9oYW5kbGVyX3QgY21feDMwMF9kZXRlY3RfaW50LAotCQkJICAgICB2b2lkICpkYXRhKQorCXZvaWQgKmRhdGEpCiB7Ci0JaW50IGVycjsKLQotCS8qCi0JICogc2V0dXAgR1BJTyBmb3IgQ00tWDMwMCBNTUMgY29udHJvbGxlcgotCSAqLwotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPODJfTU1DMl9JUlEsICJtbWMgY2FyZCBkZXRlY3QiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yZXF1ZXN0X2NkOwotCWdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU84Ml9NTUMyX0lSUSk7Ci0KLQllcnIgPSBncGlvX3JlcXVlc3QoR1BJTzg1X01NQzJfV1AsICJtbWMgd3JpdGUgcHJvdGVjdCIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlcXVlc3Rfd3A7Ci0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJTzg1X01NQzJfV1ApOwotCi0JZXJyID0gcmVxdWVzdF9pcnEoQ01fWDMwMF9NTUMyX0lSUSwgY21feDMwMF9kZXRlY3RfaW50LAotCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCi0JCQkgICJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IE1NQy9TRC9TRElPOiAiCi0JCQkJImNhbid0IHJlcXVlc3QgY2FyZCBkZXRlY3QgSVJRXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3JlcXVlc3RfaXJxOwotCX0KLQogCXJldHVybiAwOwotCi1lcnJfcmVxdWVzdF9pcnE6Ci0JZ3Bpb19mcmVlKEdQSU84NV9NTUMyX1dQKTsKLWVycl9yZXF1ZXN0X3dwOgotCWdwaW9fZnJlZShHUElPODJfTU1DMl9JUlEpOwotZXJyX3JlcXVlc3RfY2Q6Ci0JcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgY21feDMwMF9tY2kyX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCWZyZWVfaXJxKENNX1gzMDBfTU1DMl9JUlEsIGRhdGEpOwotCWdwaW9fZnJlZShHUElPODJfTU1DMl9JUlEpOwotCWdwaW9fZnJlZShHUElPODVfTU1DMl9XUCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY21feDMwMF9tY2kyX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLmRldGVjdF9kZWxheQk9IDIwLAotCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKLQkuaW5pdCAJCT0gY21feDMwMF9tY2kyX2luaXQsCi0JLmV4aXQJCT0gY21feDMwMF9tY2kyX2V4aXQsCi0JLmdldF9ybwkJPSBjbV94MzAwX21jaTJfcm8sCisJLmRldGVjdF9kZWxheQkJPSAyMCwKKwkub2NyX21hc2sJCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAorCS5pbml0IAkJCT0gY21feDMwMF9tY2kyX2luaXQsCisJLmV4aXQJCQk9IGNtX3gzMDBfbWNpMl9leGl0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gLTEsCisJLmdwaW9fY2FyZF9ybwkJPSAtMSwKKwkuZ3Bpb19wb3dlcgkJPSAtMSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjbV94MzAwX2luaXRfbW1jKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTMwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzMDAuYwppbmRleCA3YzljMzRjLi4zN2MyMzljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTMwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMzAwLmMKQEAgLTE3Miw2ICsxNzIsNyBAQAogewogCWNvbGlicmlfcHhhMzAwX2luaXRfZXRoKCk7CiAJY29saWJyaV9weGEzMDBfaW5pdF9vaGNpKCk7CisJY29saWJyaV9weGEzeHhfaW5pdF9uYW5kKCk7CiAJY29saWJyaV9weGEzMDBfaW5pdF9sY2QoKTsKIAljb2xpYnJpX3B4YTN4eF9pbml0X2xjZChtZnBfdG9fZ3BpbyhHUElPMzlfR1BJTykpOwogCWNvbGlicmlfcHhhMzEwX2luaXRfYWM5NygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzMjAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMzIwLmMKaW5kZXggYTE4ZDM3Yi4uNDk0NTcyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzMjAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTMyMC5jCkBAIC0xNjQsMTUgKzE2NCw0OCBAQAogc3RhdGljIGlubGluZSB2b2lkIGNvbGlicmlfcHhhMzIwX2luaXRfYWM5Nyh2b2lkKSB7fQogI2VuZGlmCiAKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gaXMgdmVyaWZpZWQgdG8gd29yayB3aXRoIHRoZSBUb3JhZGV4IE9yY2hpZAorICogY2FycmllciBib2FyZAorICovCitzdGF0aWMgbWZwX2NmZ190IGNvbGlicmlfcHhhMzIwX3VhcnRfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyogVUFSVCAxIGNvbmZpZ3VyYXRpb24gKG1heSBiZSBzZXQgYnkgYm9vdGxvYWRlcikgKi8KKwlHUElPOTlfVUFSVDFfQ1RTLAorCUdQSU8xMDRfVUFSVDFfUlRTLAorCUdQSU85N19VQVJUMV9SWEQsCisJR1BJTzk4X1VBUlQxX1RYRCwKKwlHUElPMTAxX1VBUlQxX0RUUiwKKwlHUElPMTAzX1VBUlQxX0RTUiwKKwlHUElPMTAwX1VBUlQxX0RDRCwKKwlHUElPMTAyX1VBUlQxX1JJLAorCisJLyogVUFSVCAyIGNvbmZpZ3VyYXRpb24gKi8KKwlHUElPMTA5X1VBUlQyX0NUUywKKwlHUElPMTEyX1VBUlQyX1JUUywKKwlHUElPMTEwX1VBUlQyX1JYRCwKKwlHUElPMTExX1VBUlQyX1RYRCwKKworCS8qIFVBUlQgMyBjb25maWd1cmF0aW9uICovCisJR1BJTzMwX1VBUlQzX1JYRCwKKwlHUElPMzFfVUFSVDNfVFhELAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGNvbGlicmlfcHhhMzIwX2luaXRfdWFydCh2b2lkKQoreworCXB4YTN4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGNvbGlicmlfcHhhMzIwX3VhcnRfcGluX2NvbmZpZykpOworfQorCiB2b2lkIF9faW5pdCBjb2xpYnJpX3B4YTMyMF9pbml0KHZvaWQpCiB7CiAJY29saWJyaV9weGEzMjBfaW5pdF9ldGgoKTsKIAljb2xpYnJpX3B4YTMyMF9pbml0X29oY2koKTsKKwljb2xpYnJpX3B4YTN4eF9pbml0X25hbmQoKTsKIAljb2xpYnJpX3B4YTMyMF9pbml0X2xjZCgpOwogCWNvbGlicmlfcHhhM3h4X2luaXRfbGNkKG1mcF90b19ncGlvKEdQSU80OV9HUElPKSk7CiAJY29saWJyaV9weGEzMjBfaW5pdF9hYzk3KCk7CiAJY29saWJyaV9weGEzeHhfaW5pdF9tbWMoQVJSQVlfQU5EX1NJWkUoY29saWJyaV9weGEzMjBfbW1jX3Bpbl9jb25maWcpLAogCQkJCW1mcF90b19ncGlvKE1GUF9QSU5fR1BJTzI4KSk7CisJY29saWJyaV9weGEzMjBfaW5pdF91YXJ0KCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ09MSUJSSTMyMCwgIlRvcmFkZXggQ29saWJyaSBQWEEzMjAiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhM3h4LmMKaW5kZXggZWEzNGUzNC4uZWZlYmFmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzeHguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTN4eC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bWFjaC9jb2xpYnJpLmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CisjaW5jbHVkZSA8bWFjaC9weGEzeHhfbmFuZC5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKQEAgLTk1LDEwICs5NiwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIGNvbGlicmlfcHhhM3h4X21jaV9wbGF0Zm9ybV9kYXRhID0gewotCS5kZXRlY3RfZGVsYXkJPSAyMCwKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKLQkuaW5pdAkJPSBjb2xpYnJpX3B4YTN4eF9tY2lfaW5pdCwKLQkuZXhpdAkJPSBjb2xpYnJpX3B4YTN4eF9tY2lfZXhpdCwKKwkuZGV0ZWN0X2RlbGF5CQk9IDIwLAorCS5vY3JfbWFzawkJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKKwkuaW5pdAkJCT0gY29saWJyaV9weGEzeHhfbWNpX2luaXQsCisJLmV4aXQJCQk9IGNvbGlicmlfcHhhM3h4X21jaV9leGl0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gLTEsCisJLmdwaW9fY2FyZF9ybwkJPSAtMSwKKwkuZ3Bpb19wb3dlcgkJPSAtMSwKIH07CiAKIHZvaWQgX19pbml0IGNvbGlicmlfcHhhM3h4X2luaXRfbW1jKG1mcF9jZmdfdCAqcGlucywgaW50IGxlbiwgaW50IGRldGVjdF9waW4pCkBAIC0xNTQsMyArMTU4LDQzIEBACiB9CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX1BYQTN4eCkgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfUFhBM3h4X01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjb2xpYnJpX25hbmRfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUgICAgICAgID0gImJvb3Rsb2FkZXIiLAorCQkub2Zmc2V0ICAgICAgPSAwLAorCQkuc2l6ZSAgICAgICAgPSBTWl81MTJLLAorCQkubWFza19mbGFncyAgPSBNVERfV1JJVEVBQkxFLCAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LAorCXsKKwkJLm5hbWUgICAgICAgID0gImtlcm5lbCIsCisJCS5vZmZzZXQgICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUgICAgICAgID0gU1pfNE0sCisJCS5tYXNrX2ZsYWdzICA9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJeworCQkubmFtZSAgICAgICAgPSAicmVzZXJ2ZWQiLAorCQkub2Zmc2V0ICAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplICAgICAgICA9IFNaXzFNLAorCQkubWFza19mbGFncyAgPSBNVERfV1JJVEVBQkxFLCAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LAorCXsKKwkJLm5hbWUgICAgICAgID0gImZzIiwKKwkJLm9mZnNldCAgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZSAgICAgICAgPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgY29saWJyaV9uYW5kX2luZm8gPSB7CisJLmVuYWJsZV9hcmJpdGVyCT0gMSwKKwkua2VlcF9jb25maWcJPSAxLAorCS5wYXJ0cwkJPSBjb2xpYnJpX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGNvbGlicmlfbmFuZF9wYXJ0aXRpb25zKSwKK307CisKK3ZvaWQgX19pbml0IGNvbGlicmlfcHhhM3h4X2luaXRfbmFuZCh2b2lkKQoreworCXB4YTN4eF9zZXRfbmFuZF9pbmZvKCZjb2xpYnJpX25hbmRfaW5mbyk7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKaW5kZXggNTM2M2UxYS4uYjUzNmI1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvY29yZ2lfbGNkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3NoYXJwc2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CiAjaW5jbHVkZSA8dmlkZW8vdzEwMGZiLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTEwNCw2ICsxMDUsMjggQEAKIAlHUElPNl9NTUNfQ0xLLAogCUdQSU84X01NQ19DUzAsCiAKKwkvKiBHUElPIE1hdHJpeCBLZXlwYWQgKi8KKwlHUElPNjZfR1BJTywJLyogY29sdW1uIDAgKi8KKwlHUElPNjdfR1BJTywJLyogY29sdW1uIDEgKi8KKwlHUElPNjhfR1BJTywJLyogY29sdW1uIDIgKi8KKwlHUElPNjlfR1BJTywJLyogY29sdW1uIDMgKi8KKwlHUElPNzBfR1BJTywJLyogY29sdW1uIDQgKi8KKwlHUElPNzFfR1BJTywJLyogY29sdW1uIDUgKi8KKwlHUElPNzJfR1BJTywJLyogY29sdW1uIDYgKi8KKwlHUElPNzNfR1BJTywJLyogY29sdW1uIDcgKi8KKwlHUElPNzRfR1BJTywJLyogY29sdW1uIDggKi8KKwlHUElPNzVfR1BJTywJLyogY29sdW1uIDkgKi8KKwlHUElPNzZfR1BJTywJLyogY29sdW1uIDEwICovCisJR1BJTzc3X0dQSU8sCS8qIGNvbHVtbiAxMSAqLworCUdQSU81OF9HUElPLAkvKiByb3cgMCAqLworCUdQSU81OV9HUElPLAkvKiByb3cgMSAqLworCUdQSU82MF9HUElPLAkvKiByb3cgMiAqLworCUdQSU82MV9HUElPLAkvKiByb3cgMyAqLworCUdQSU82Ml9HUElPLAkvKiByb3cgNCAqLworCUdQSU82M19HUElPLAkvKiByb3cgNSAqLworCUdQSU82NF9HUElPLAkvKiByb3cgNiAqLworCUdQSU82NV9HUElPLAkvKiByb3cgNyAqLworCiAJLyogR1BJTyAqLwogCUdQSU85X0dQSU8sCS8qIENPUkdJX0dQSU9fblNEX0RFVEVDVCAqLwogCUdQSU83X0dQSU8sCS8qIENPUkdJX0dQSU9fblNEX1dQICovCkBAIC0yNjcsOSArMjkwLDExNSBAQAogLyoKICAqIENvcmdpIEtleWJvYXJkIERldmljZQogICovCisjZGVmaW5lIENPUkdJX0tFWV9DQUxFTkRFUglLRVlfRjEKKyNkZWZpbmUgQ09SR0lfS0VZX0FERFJFU1MJS0VZX0YyCisjZGVmaW5lIENPUkdJX0tFWV9GTgkJS0VZX0YzCisjZGVmaW5lIENPUkdJX0tFWV9DQU5DRUwJS0VZX0Y0CisjZGVmaW5lIENPUkdJX0tFWV9PRkYJCUtFWV9TVVNQRU5ECisjZGVmaW5lIENPUkdJX0tFWV9FWE9LCQlLRVlfRjUKKyNkZWZpbmUgQ09SR0lfS0VZX0VYQ0FOQ0VMCUtFWV9GNgorI2RlZmluZSBDT1JHSV9LRVlfRVhKT0dET1dOCUtFWV9GNworI2RlZmluZSBDT1JHSV9LRVlfRVhKT0dVUAlLRVlfRjgKKyNkZWZpbmUgQ09SR0lfS0VZX0pBUDEJCUtFWV9MRUZUQ1RSTAorI2RlZmluZSBDT1JHSV9LRVlfSkFQMgkJS0VZX0xFRlRBTFQKKyNkZWZpbmUgQ09SR0lfS0VZX01BSUwJCUtFWV9GMTAKKyNkZWZpbmUgQ09SR0lfS0VZX09LCQlLRVlfRjExCisjZGVmaW5lIENPUkdJX0tFWV9NRU5VCQlLRVlfRjEyCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBjb3JnaWtiZF9rZXltYXBbXSA9IHsKKwlLRVkoMCwgMSwgS0VZXzEpLAorCUtFWSgwLCAyLCBLRVlfMyksCisJS0VZKDAsIDMsIEtFWV81KSwKKwlLRVkoMCwgNCwgS0VZXzYpLAorCUtFWSgwLCA1LCBLRVlfNyksCisJS0VZKDAsIDYsIEtFWV85KSwKKwlLRVkoMCwgNywgS0VZXzApLAorCUtFWSgwLCA4LCBLRVlfQkFDS1NQQUNFKSwKKwlLRVkoMSwgMSwgS0VZXzIpLAorCUtFWSgxLCAyLCBLRVlfNCksCisJS0VZKDEsIDMsIEtFWV9SKSwKKwlLRVkoMSwgNCwgS0VZX1kpLAorCUtFWSgxLCA1LCBLRVlfOCksCisJS0VZKDEsIDYsIEtFWV9JKSwKKwlLRVkoMSwgNywgS0VZX08pLAorCUtFWSgxLCA4LCBLRVlfUCksCisJS0VZKDIsIDAsIEtFWV9UQUIpLAorCUtFWSgyLCAxLCBLRVlfUSksCisJS0VZKDIsIDIsIEtFWV9FKSwKKwlLRVkoMiwgMywgS0VZX1QpLAorCUtFWSgyLCA0LCBLRVlfRyksCisJS0VZKDIsIDUsIEtFWV9VKSwKKwlLRVkoMiwgNiwgS0VZX0opLAorCUtFWSgyLCA3LCBLRVlfSyksCisJS0VZKDMsIDAsIENPUkdJX0tFWV9DQUxFTkRFUiksCisJS0VZKDMsIDEsIEtFWV9XKSwKKwlLRVkoMywgMiwgS0VZX1MpLAorCUtFWSgzLCAzLCBLRVlfRiksCisJS0VZKDMsIDQsIEtFWV9WKSwKKwlLRVkoMywgNSwgS0VZX0gpLAorCUtFWSgzLCA2LCBLRVlfTSksCisJS0VZKDMsIDcsIEtFWV9MKSwKKwlLRVkoMywgOSwgS0VZX1JJR0hUU0hJRlQpLAorCUtFWSg0LCAwLCBDT1JHSV9LRVlfQUREUkVTUyksCisJS0VZKDQsIDEsIEtFWV9BKSwKKwlLRVkoNCwgMiwgS0VZX0QpLAorCUtFWSg0LCAzLCBLRVlfQyksCisJS0VZKDQsIDQsIEtFWV9CKSwKKwlLRVkoNCwgNSwgS0VZX04pLAorCUtFWSg0LCA2LCBLRVlfRE9UKSwKKwlLRVkoNCwgOCwgS0VZX0VOVEVSKSwKKwlLRVkoNCwgMTAsIEtFWV9MRUZUU0hJRlQpLAorCUtFWSg1LCAwLCBDT1JHSV9LRVlfTUFJTCksCisJS0VZKDUsIDEsIEtFWV9aKSwKKwlLRVkoNSwgMiwgS0VZX1gpLAorCUtFWSg1LCAzLCBLRVlfTUlOVVMpLAorCUtFWSg1LCA0LCBLRVlfU1BBQ0UpLAorCUtFWSg1LCA1LCBLRVlfQ09NTUEpLAorCUtFWSg1LCA3LCBLRVlfVVApLAorCUtFWSg1LCAxMSwgQ09SR0lfS0VZX0ZOKSwKKwlLRVkoNiwgMCwgS0VZX1NZU1JRKSwKKwlLRVkoNiwgMSwgQ09SR0lfS0VZX0pBUDEpLAorCUtFWSg2LCAyLCBDT1JHSV9LRVlfSkFQMiksCisJS0VZKDYsIDMsIENPUkdJX0tFWV9DQU5DRUwpLAorCUtFWSg2LCA0LCBDT1JHSV9LRVlfT0spLAorCUtFWSg2LCA1LCBDT1JHSV9LRVlfTUVOVSksCisJS0VZKDYsIDYsIEtFWV9MRUZUKSwKKwlLRVkoNiwgNywgS0VZX0RPV04pLAorCUtFWSg2LCA4LCBLRVlfUklHSFQpLAorCUtFWSg3LCAwLCBDT1JHSV9LRVlfT0ZGKSwKKwlLRVkoNywgMSwgQ09SR0lfS0VZX0VYT0spLAorCUtFWSg3LCAyLCBDT1JHSV9LRVlfRVhDQU5DRUwpLAorCUtFWSg3LCAzLCBDT1JHSV9LRVlfRVhKT0dET1dOKSwKKwlLRVkoNywgNCwgQ09SR0lfS0VZX0VYSk9HVVApLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgY29yZ2lrYmRfa2V5bWFwX2RhdGEgPSB7CisJLmtleW1hcAkJPSBjb3JnaWtiZF9rZXltYXAsCisJLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRShjb3JnaWtiZF9rZXltYXApLAorfTsKKworc3RhdGljIGNvbnN0IGludCBjb3JnaWtiZF9yb3dfZ3Bpb3NbXSA9CisJCXsgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsIDY1IH07CitzdGF0aWMgY29uc3QgaW50IGNvcmdpa2JkX2NvbF9ncGlvc1tdID0KKwkJeyA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3IH07CisKK3N0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleXBhZF9wbGF0Zm9ybV9kYXRhIGNvcmdpa2JkX3BkYXRhID0geworCS5rZXltYXBfZGF0YQkJPSAmY29yZ2lrYmRfa2V5bWFwX2RhdGEsCisJLnJvd19ncGlvcwkJPSBjb3JnaWtiZF9yb3dfZ3Bpb3MsCisJLmNvbF9ncGlvcwkJPSBjb3JnaWtiZF9jb2xfZ3Bpb3MsCisJLm51bV9yb3dfZ3Bpb3MJCT0gQVJSQVlfU0laRShjb3JnaWtiZF9yb3dfZ3Bpb3MpLAorCS5udW1fY29sX2dwaW9zCQk9IEFSUkFZX1NJWkUoY29yZ2lrYmRfY29sX2dwaW9zKSwKKwkuY29sX3NjYW5fZGVsYXlfdXMJPSAxMCwKKwkuZGVib3VuY2VfbXMJCT0gMTAsCisJLndha2V1cAkJCT0gMSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpa2JkX2RldmljZSA9IHsKLQkubmFtZQkJPSAiY29yZ2kta2V5Ym9hcmQiLAorCS5uYW1lCQk9ICJtYXRyaXgta2V5cGFkIiwKIAkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmNvcmdpa2JkX3BkYXRhLAorCX0sCiB9OwogCiAvKgpAQCAtMzA3LDExMSArNDM2LDIwIEBACiAgKiBUaGUgY2FyZCBkZXRlY3QgaW50ZXJydXB0IGlzbid0IGRlYm91bmNlZCBzbyB3ZSBkZWxheSBpdCBieSAyNTBtcwogICogdG8gZ2l2ZSB0aGUgY2FyZCBhIGNoYW5jZSB0byBmdWxseSBpbnNlcnQvZWplY3QuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGE7Ci0KLXN0YXRpYyBpbnQgY29yZ2lfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFfaGFuZGxlcl90IGNvcmdpX2RldGVjdF9pbnQsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IGdwaW9fcmVxdWVzdChDT1JHSV9HUElPX25TRF9ERVRFQ1QsICJuU0RfREVURUNUIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0OwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KENPUkdJX0dQSU9fblNEX1dQLCAiblNEX1dQIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZnJlZV8xOwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KENPUkdJX0dQSU9fU0RfUFdSLCAiU0RfUFdSIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZnJlZV8yOwotCi0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoQ09SR0lfR1BJT19uU0RfREVURUNUKTsKLQlncGlvX2RpcmVjdGlvbl9pbnB1dChDT1JHSV9HUElPX25TRF9XUCk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KENPUkdJX0dQSU9fU0RfUFdSLCAwKTsKLQotCWNvcmdpX21jaV9wbGF0Zm9ybV9kYXRhLmRldGVjdF9kZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKLQotCWVyciA9IHJlcXVlc3RfaXJxKENPUkdJX0lSUV9HUElPX25TRF9ERVRFQ1QsIGNvcmdpX2RldGVjdF9pbnQsCi0JCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9SSVNJTkcgfAotCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAotCQkJCSJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiJXM6IE1NQy9TRDogY2FuJ3QgcmVxdWVzdCBNTUMgY2FyZCBkZXRlY3QgSVJRXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJZ290byBlcnJfZnJlZV8zOwotCX0KLQlyZXR1cm4gMDsKLQotZXJyX2ZyZWVfMzoKLQlncGlvX2ZyZWUoQ09SR0lfR1BJT19TRF9QV1IpOwotZXJyX2ZyZWVfMjoKLQlncGlvX2ZyZWUoQ09SR0lfR1BJT19uU0RfV1ApOwotZXJyX2ZyZWVfMToKLQlncGlvX2ZyZWUoQ09SR0lfR1BJT19uU0RfREVURUNUKTsKLWVycl9vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgY29yZ2lfbWNpX3NldHBvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZkZCkKLXsKLQlzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEqIHBfZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQotCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fU0RfUFdSLCAoKDEgPDwgdmRkKSAmIHBfZC0+b2NyX21hc2spKTsKLX0KLQotc3RhdGljIGludCBjb3JnaV9tY2lfZ2V0X3JvKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoQ09SR0lfR1BJT19uU0RfV1ApOwotfQotCi1zdGF0aWMgdm9pZCBjb3JnaV9tY2lfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JZnJlZV9pcnEoQ09SR0lfSVJRX0dQSU9fblNEX0RFVEVDVCwgZGF0YSk7Ci0JZ3Bpb19mcmVlKENPUkdJX0dQSU9fU0RfUFdSKTsKLQlncGlvX2ZyZWUoQ09SR0lfR1BJT19uU0RfV1ApOwotCWdwaW9fZnJlZShDT1JHSV9HUElPX25TRF9ERVRFQ1QpOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIGNvcmdpX21jaV9wbGF0Zm9ybV9kYXRhID0gewotCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKLQkuaW5pdCAJCT0gY29yZ2lfbWNpX2luaXQsCi0JLmdldF9ybwkJPSBjb3JnaV9tY2lfZ2V0X3JvLAotCS5zZXRwb3dlciAJPSBjb3JnaV9tY2lfc2V0cG93ZXIsCi0JLmV4aXQJCT0gY29yZ2lfbWNpX2V4aXQsCisJLm9jcl9tYXNrCQk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuZ3Bpb19jYXJkX2RldGVjdAk9IC0xLAorCS5ncGlvX2NhcmRfcm8JCT0gQ09SR0lfR1BJT19uU0RfV1AsCisJLmdwaW9fcG93ZXIJCT0gQ09SR0lfR1BJT19TRF9QV1IsCiB9OwogCiAKIC8qCiAgKiBJcmRhCiAgKi8KLXN0YXRpYyB2b2lkIGNvcmdpX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQotewotCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fSVJfT04sIG1vZGUgJiBJUl9PRkYpOwotCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7Ci19Ci0KLXN0YXRpYyBpbnQgY29yZ2lfaXJkYV9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KENPUkdJX0dQSU9fSVJfT04sICJJUl9PTiIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoQ09SR0lfR1BJT19JUl9PTiwgMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcmdpX2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQotewotCWdwaW9fZnJlZShDT1JHSV9HUElPX0lSX09OKTsKLX0KLQogc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgY29yZ2lfZmljcF9wbGF0Zm9ybV9kYXRhID0geworCS5ncGlvX3B3ZG93bgkJPSBDT1JHSV9HUElPX0lSX09OLAogCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAotCS50cmFuc2NlaXZlcl9tb2RlCT0gY29yZ2lfaXJkYV90cmFuc2NlaXZlcl9tb2RlLAotCS5zdGFydHVwCQk9IGNvcmdpX2lyZGFfc3RhcnR1cCwKLQkuc2h1dGRvd24JCT0gY29yZ2lfaXJkYV9zaHV0ZG93biwKIH07CiAKIApAQCAtNjM2LDYgKzY3NCw3IEBACiAJY29yZ2lfaW5pdF9zcGkoKTsKIAogIAlweGFfc2V0X3VkY19pbmZvKCZ1ZGNfaW5mbyk7CisJY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGEuZGV0ZWN0X2RlbGF5ID0gbXNlY3NfdG9famlmZmllcygyNTApOwogCXB4YV9zZXRfbWNpX2luZm8oJmNvcmdpX21jaV9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X2ZpY3BfaW5mbygmY29yZ2lfZmljcF9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X2kyY19pbmZvKE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY3B1ZnJlcS1weGEyeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NwdWZyZXEtcHhhMnh4LmMKaW5kZXggM2E4ZWUyMi4uOTgzY2M4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY3B1ZnJlcS1weGEyeHguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jcHVmcmVxLXB4YTJ4eC5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAogc3RhdGljIHB4YV9mcmVxc190IHB4YTI3eF9mcmVxc1tdID0gewogCXsxMDQwMDAsIDEwNDAwMCwgUFhBMjd4X0NDQ1IoMSwJIDgsIDIpLCAwLCBDQ0xLQ0ZHMigxLCAwLCAxKSwgIDkwMDAwMCwgMTcwNTAwMCB9LAotCXsxNTYwMDAsIDEwNDAwMCwgUFhBMjd4X0NDQ1IoMSwJIDgsIDYpLCAwLCBDQ0xLQ0ZHMigxLCAxLCAxKSwgMTAwMDAwMCwgMTcwNTAwMCB9LAorCXsxNTYwMDAsIDEwNDAwMCwgUFhBMjd4X0NDQ1IoMSwJIDgsIDMpLCAwLCBDQ0xLQ0ZHMigxLCAwLCAxKSwgMTAwMDAwMCwgMTcwNTAwMCB9LAogCXsyMDgwMDAsIDIwODAwMCwgUFhBMjd4X0NDQ1IoMCwgMTYsIDIpLCAxLCBDQ0xLQ0ZHMigwLCAwLCAxKSwgMTE4MDAwMCwgMTcwNTAwMCB9LAogCXszMTIwMDAsIDIwODAwMCwgUFhBMjd4X0NDQ1IoMSwgMTYsIDMpLCAxLCBDQ0xLQ0ZHMigxLCAwLCAxKSwgMTI1MDAwMCwgMTcwNTAwMCB9LAogCXs0MTYwMDAsIDIwODAwMCwgUFhBMjd4X0NDQ1IoMSwgMTYsIDQpLCAxLCBDQ0xLQ0ZHMigxLCAwLCAxKSwgMTM1MDAwMCwgMTcwNTAwMCB9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY3NiNzI2LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jc2I3MjYuYwppbmRleCA3ZDNlMWI0Li45NjU0ODBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jc2I3MjYuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jc2I3MjYuYwpAQCAtMTMwLDYxICsxMzAsMTcgQEAKIHN0YXRpYyBpbnQgY3NiNzI2X21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJaXJxX2hhbmRsZXJfdCBkZXRlY3QsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IGVycjsKLQogCWNzYjcyNl9tY2lfZGF0YS5kZXRlY3RfZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDUwMCk7Ci0KLQllcnIgPSBncGlvX3JlcXVlc3QoQ1NCNzI2X0dQSU9fTU1DX0RFVEVDVCwgIk1NQyBkZXRlY3QiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9kZXRfcmVxOwotCi0JZXJyID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoQ1NCNzI2X0dQSU9fTU1DX0RFVEVDVCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZGV0X2RpcjsKLQotCWVyciA9IGdwaW9fcmVxdWVzdChDU0I3MjZfR1BJT19NTUNfUk8sICJNTUMgcm8iKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yb19yZXE7Ci0KLQllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChDU0I3MjZfR1BJT19NTUNfUk8pOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JvX2RpcjsKLQotCWVyciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKENTQjcyNl9HUElPX01NQ19ERVRFQ1QpLCBkZXRlY3QsCi0JCQlJUlFGX0RJU0FCTEVELCAiTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfaXJxOwotCiAJcmV0dXJuIDA7Ci0KLWVycl9pcnE6Ci1lcnJfcm9fZGlyOgotCWdwaW9fZnJlZShDU0I3MjZfR1BJT19NTUNfUk8pOwotZXJyX3JvX3JlcToKLWVycl9kZXRfZGlyOgotCWdwaW9fZnJlZShDU0I3MjZfR1BJT19NTUNfREVURUNUKTsKLWVycl9kZXRfcmVxOgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgY3NiNzI2X21jaV9nZXRfcm8oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBncGlvX2dldF92YWx1ZShDU0I3MjZfR1BJT19NTUNfUk8pOwotfQotCi1zdGF0aWMgdm9pZCBjc2I3MjZfbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCWZyZWVfaXJxKGdwaW9fdG9faXJxKENTQjcyNl9HUElPX01NQ19ERVRFQ1QpLCBkYXRhKTsKLQlncGlvX2ZyZWUoQ1NCNzI2X0dQSU9fTU1DX1JPKTsKLQlncGlvX2ZyZWUoQ1NCNzI2X0dQSU9fTU1DX0RFVEVDVCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY3NiNzI2X21jaSA9IHsKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCi0JLmluaXQJCT0gY3NiNzI2X21jaV9pbml0LAotCS5nZXRfcm8JCT0gY3NiNzI2X21jaV9nZXRfcm8sCisJLm9jcl9tYXNrCQk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuaW5pdAkJCT0gY3NiNzI2X21jaV9pbml0LAogCS8qIEZJWE1FIHNldHBvd2VyICovCi0JLmV4aXQJCT0gY3NiNzI2X21jaV9leGl0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gQ1NCNzI2X0dQSU9fTU1DX0RFVEVDVCwKKwkuZ3Bpb19jYXJkX3JvCQk9IENTQjcyNl9HUElPX01NQ19STywKKwkuZ3Bpb19wb3dlcgkJPSAtMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhb2hjaV9wbGF0Zm9ybV9kYXRhIGNzYjcyNl9vaGNpX3BsYXRmb3JtX2RhdGEgPSB7CkBAIC0yODIsNyArMjM4LDcgQEAKIH07CiAKIHN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgY3NiNzI2X2xhbl9jb25maWcgPSB7Ci0JLmlycV90eXBlCT0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9MT1csCisJLmlycV9wb2xhcml0eQk9IFNNU0M5MTFYX0lSUV9QT0xBUklUWV9BQ1RJVkVfTE9XLAogCS5pcnFfdHlwZQk9IFNNU0M5MTFYX0lSUV9UWVBFX1BVU0hfUFVMTCwKIAkuZmxhZ3MJCT0gU01TQzkxMVhfVVNFXzMyQklULAogCS5waHlfaW50ZXJmYWNlCT0gUEhZX0lOVEVSRkFDRV9NT0RFX01JSSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuYwppbmRleCBlY2MwOGYzLi40NmZhYmUxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuYwpAQCAtOTM1LDYgKzkzNSwzMyBAQAogewogCXB4YV9yZWdpc3Rlcl9kZXZpY2UoJnB4YTN4eF9kZXZpY2VfbmFuZCwgaW5mbyk7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhM3h4X3Jlc291cmNlc19nY3VbXSA9IHsKKwl7CisJCS5zdGFydAk9IDB4NTQwMDAwMDAsCisJCS5lbmQJPSAweDU0MDAwZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gSVJRX0dDVSwKKwkJLmVuZAk9IElSUV9HQ1UsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IHB4YTN4eF9nY3VfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHhhM3h4X2RldmljZV9nY3UgPSB7CisJLm5hbWUJCT0gInB4YTN4eC1nY3UiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocHhhM3h4X3Jlc291cmNlc19nY3UpLAorCS5yZXNvdXJjZQk9IHB4YTN4eF9yZXNvdXJjZXNfZ2N1LAorCS5kZXYJCT0geworCQkuZG1hX21hc2sgPSAmcHhhM3h4X2djdV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCit9OworCiAjZW5kaWYgLyogQ09ORklHX1BYQTN4eCAqLwogCiAvKiBweGEyeHgtc3BpIHBsYXRmb3JtLWRldmljZSBJRCBlcXVhbHMgcmVzcGVjdGl2ZSBTU1AgcGxhdGZvcm0tZGV2aWNlIElEICsgMS4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuaAppbmRleCBlY2MyNGE0Li45MzgxN2Q5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZGV2aWNlcy5oCkBAIC0zNSw0ICszNSw2IEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGEzeHhfZGV2aWNlX25hbmQ7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGEzeHhfZGV2aWNlX2kyY19wb3dlcjsKIAorZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHhhM3h4X2RldmljZV9nY3U7CisKIHZvaWQgX19pbml0IHB4YV9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYwppbmRleCBhMzZmYzE3Li40OWFjZGZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lNzQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc0MC5jCkBAIC0xOTksNyArMTk5LDYgQEAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKIAlweGFfc2V0X3VkY19pbmZvKCZlN3h4X3VkY19tYWNoX2luZm8pOwogCXB4YV9zZXRfYWM5N19pbmZvKE5VTEwpOwotCWU3eHhfaXJkYV9pbml0KCk7CiAJcHhhX3NldF9maWNwX2luZm8oJmU3eHhfZmljcF9wbGF0Zm9ybV9kYXRhKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTc1MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc1MC5jCmluZGV4IDFkMDAxMTAuLjQwNTJlY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lNzUwLmMKQEAgLTIwMCw3ICsyMDAsNiBAQAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCXB4YV9zZXRfdWRjX2luZm8oJmU3eHhfdWRjX21hY2hfaW5mbyk7CiAJcHhhX3NldF9hYzk3X2luZm8oTlVMTCk7Ci0JZTd4eF9pcmRhX2luaXQoKTsKIAlweGFfc2V0X2ZpY3BfaW5mbygmZTd4eF9maWNwX3BsYXRmb3JtX2RhdGEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lbS14MjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lbS14MjcwLmMKaW5kZXggOWNkMDk0Ni4uYWVjN2Y0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZW0teDI3MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2VtLXgyNzAuYwpAQCAtNjQ2LDEzICs2NDYsMTYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBlbV94MjcwX21jaV9wbGF0Zm9ybV9kYXRhID0gewotCS5vY3JfbWFzawk9IE1NQ19WRERfMjBfMjF8TU1DX1ZERF8yMV8yMnxNTUNfVkREXzIyXzIzfAotCQkJICBNTUNfVkREXzI0XzI1fE1NQ19WRERfMjVfMjZ8TU1DX1ZERF8yNl8yN3wKLQkJCSAgTU1DX1ZERF8yN18yOHxNTUNfVkREXzI4XzI5fE1NQ19WRERfMjlfMzB8Ci0JCQkgIE1NQ19WRERfMzBfMzF8TU1DX1ZERF8zMV8zMiwKLQkuaW5pdCAJCT0gZW1feDI3MF9tY2lfaW5pdCwKLQkuc2V0cG93ZXIgCT0gZW1feDI3MF9tY2lfc2V0cG93ZXIsCi0JLmV4aXQJCT0gZW1feDI3MF9tY2lfZXhpdCwKKwkub2NyX21hc2sJCT0gTU1DX1ZERF8yMF8yMXxNTUNfVkREXzIxXzIyfE1NQ19WRERfMjJfMjN8CisJCQkJICBNTUNfVkREXzI0XzI1fE1NQ19WRERfMjVfMjZ8TU1DX1ZERF8yNl8yN3wKKwkJCQkgIE1NQ19WRERfMjdfMjh8TU1DX1ZERF8yOF8yOXxNTUNfVkREXzI5XzMwfAorCQkJCSAgTU1DX1ZERF8zMF8zMXxNTUNfVkREXzMxXzMyLAorCS5pbml0IAkJCT0gZW1feDI3MF9tY2lfaW5pdCwKKwkuc2V0cG93ZXIgCQk9IGVtX3gyNzBfbWNpX3NldHBvd2VyLAorCS5leGl0CQkJPSBlbV94MjcwX21jaV9leGl0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gLTEsCisJLmdwaW9fY2FyZF9ybwkJPSAtMSwKKwkuZ3Bpb19wb3dlcgkJPSAtMSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlbV94MjcwX2luaXRfbW1jKHZvaWQpCkBAIC0xMDIyLDIyICsxMDI1LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rIGljbGluayA9IHsKLQkuYnVzX2lkCT0gMCwKLQkucG93ZXIgPSBlbV94MjcwX3NlbnNvcl9wb3dlciwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gZW1feDI3MF9pMmNfY2FtX2luZm9bXSA9IHsKIAl7CiAJCUkyQ19CT0FSRF9JTkZPKCJtdDltMTExIiwgMHg0OCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rIGljbGluayA9IHsKKwkuYnVzX2lkCQk9IDAsCisJLnBvd2VyCQk9IGVtX3gyNzBfc2Vuc29yX3Bvd2VyLAorCS5ib2FyZF9pbmZvCT0gJmVtX3gyNzBfaTJjX2NhbV9pbmZvWzBdLAorCS5pMmNfYWRhcHRlcl9pZAk9IDAsCisJLm1vZHVsZV9uYW1lCT0gIm10OW0xMTEiLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZW1feDI3MF9jYW1lcmEgPSB7CisJLm5hbWUJPSAic29jLWNhbWVyYS1wZHJ2IiwKKwkuaWQJPSAtMSwKKwkuZGV2CT0gewogCQkucGxhdGZvcm1fZGF0YSA9ICZpY2xpbmssCiAJfSwKIH07CiAKIHN0YXRpYyB2b2lkICBfX2luaXQgZW1feDI3MF9pbml0X2NhbWVyYSh2b2lkKQogewotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIEFSUkFZX0FORF9TSVpFKGVtX3gyNzBfaTJjX2NhbV9pbmZvKSk7CiAJcHhhX3NldF9jYW1lcmFfaW5mbygmZW1feDI3MF9jYW1lcmFfcGxhdGZvcm1fZGF0YSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlbV94MjcwX2NhbWVyYSk7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGVtX3gyNzBfaW5pdF9jYW1lcmEodm9pZCkge30KQEAgLTExMDMsNiArMTExNiw3IEBACiBSRUdVTEFUT1JfQ09OU1VNRVIobGRvMTAsICZweGFfZGV2aWNlX21jaS5kZXYsICJ2Y2Mgc2RpbyIpOwogUkVHVUxBVE9SX0NPTlNVTUVSKGxkbzEyLCBOVUxMLCAidmNjIHVzYiIpOwogUkVHVUxBVE9SX0NPTlNVTUVSKGxkbzE5LCAmZW1feDI3MF9ncHJzX3VzZXJzcGFjZV9jb25zdW1lci5kZXYsICJ2Y2MgZ3BycyIpOworUkVHVUxBVE9SX0NPTlNVTUVSKGJ1Y2syLCBOVUxMLCAidmNjX2NvcmUiKTsKIAogI2RlZmluZSBSRUdVTEFUT1JfSU5JVChfbGRvLCBfbWluX3VWLCBfbWF4X3VWLCBfb3BzX21hc2spCQlcCiAJc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9sZG8jI19kYXRhID0gewkJXApAQCAtMTEyNSw2ICsxMTM5LDcgQEAKIAkgICAgICAgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMgfCBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UpOwogUkVHVUxBVE9SX0lOSVQobGRvMTIsIDMwMDAwMDAsIDMwMDAwMDAsIFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTKTsKIFJFR1VMQVRPUl9JTklUKGxkbzE5LCAzMjAwMDAwLCAzMjAwMDAwLCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUyk7CitSRUdVTEFUT1JfSU5JVChidWNrMiwgMTAwMDAwMCwgMTY1MDAwMCwgUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFKTsKIAogc3RydWN0IGxlZF9pbmZvIGVtX3gyNzBfbGVkX2luZm8gPSB7CiAJLm5hbWUgPSAiZW0teDI3MDpvcmFuZ2UiLApAQCAtMTE5NCw2ICsxMjA5LDggQEAKIAlEQTkwMzBfTERPKDEyKSwKIAlEQTkwMzBfTERPKDE5KSwKIAorCURBOTAzMF9TVUJERVYocmVndWxhdG9yLCBCVUNLMiwgJmJ1Y2syX2RhdGEpLAorCiAJREE5MDMwX1NVQkRFVihsZWQsIExFRF9QQywgJmVtX3gyNzBfbGVkX2luZm8pLAogCURBOTAzMF9TVUJERVYoYmFja2xpZ2h0LCBXTEVELCAmZW1feDI3MF9sZWRfaW5mbyksCiAJREE5MDMwX1NVQkRFVihiYXR0ZXJ5LCBCQVQsICZlbV94MjcwX2JhdHRlcnR5X2luZm8pLApAQCAtMTI0NSw3ICsxMjYyLDYgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGVtX3gyNzBfbW9kdWxlX2luaXQodm9pZCkKIHsKLQlwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOwogCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGVtX3gyNzBfcGluX2NvbmZpZykpOwogCiAJbW1jX2NkID0gR1BJTzEzX01NQ19DRDsKQEAgLTEyNTcsNyArMTI3Myw2IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlbV94MjcwX2V4ZWRhX2luaXQodm9pZCkKIHsKLQlwcl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOwogCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGV4ZWRhX3Bpbl9jb25maWcpKTsKIAogCW1tY19jZCA9IEdQSU8xMTRfTU1DX0NEOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jCmluZGV4IGM2MGRhZGYuLjkxNDE3ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmMKQEAgLTQ3LDQ0ICs0Nyw5IEBACiAJLmdwaW9fcHVsbHVwX2ludmVydGVkID0gMQogfTsKIAotc3RhdGljIHZvaWQgZTd4eF9pcmRhX3RyYW5zY2VpdmVyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSkKLXsKLQlpZiAobW9kZSAmIElSX09GRikgewotCQlncGlvX3NldF92YWx1ZShHUElPX0U3WFhfSVJfT0ZGLCAxKTsKLQkJcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoZGV2LCBtb2RlKTsKLQl9IGVsc2UgewotCQlweGEyeHhfdHJhbnNjZWl2ZXJfbW9kZShkZXYsIG1vZGUpOwotCQlncGlvX3NldF92YWx1ZShHUElPX0U3WFhfSVJfT0ZGLCAwKTsKLQl9Ci19Ci0KLWludCBlN3h4X2lyZGFfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19FN1hYX0lSX09GRiwgIklyREEgcG93ZXIiKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0U3WFhfSVJfT0ZGLCAwKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCWU3eHhfaXJkYV90cmFuc2NlaXZlcl9tb2RlKE5VTEwsIElSX1NJUk1PREUgfCBJUl9PRkYpOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGU3eHhfaXJkYV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JZTd4eF9pcmRhX3RyYW5zY2VpdmVyX21vZGUoZGV2LCBJUl9TSVJNT0RFIHwgSVJfT0ZGKTsKLQlncGlvX2ZyZWUoR1BJT19FN1hYX0lSX09GRik7Ci19Ci0KIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgZTd4eF9maWNwX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLnRyYW5zY2VpdmVyX2NhcCAgPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAotCS50cmFuc2NlaXZlcl9tb2RlID0gZTd4eF9pcmRhX3RyYW5zY2VpdmVyX21vZGUsCi0JLnNodXRkb3duID0gZTd4eF9pcmRhX3NodXRkb3duLAorCS5ncGlvX3B3ZG93bgkJPSBHUElPX0U3WFhfSVJfT0ZGLAorCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAogfTsKIAogaW50IGVzZXJpZXNfdG1pb19lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZ3Vtc3RpeC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZ3Vtc3RpeC5jCmluZGV4IGNhOTkxMmUuLjE3MDhjMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2d1bXN0aXguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9ndW1zdGl4LmMKQEAgLTg4LDcgKzg4LDEwIEBACiAKICNpZmRlZiBDT05GSUdfTU1DX1BYQQogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBndW1zdGl4X21jaV9wbGF0Zm9ybV9kYXRhID0gewotCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkub2NyX21hc2sJCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAorCS5ncGlvX2NhcmRfZGV0ZWN0IAk9IC0xLAorCS5ncGlvX2NhcmRfcm8JCT0gLTEsCisJLmdwaW9fcG93ZXIJCT0gLTEsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZ3Vtc3RpeF9tbWNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaHg0NzAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYwppbmRleCA4MTM1OWQ1Li5hYmZmOWUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPG1hY2gvaXJkYS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4X3NwaS5oPgogCisjaW5jbHVkZSA8dmlkZW8vcGxhdGZvcm1fbGNkLmg+CiAjaW5jbHVkZSA8dmlkZW8vdzEwMGZiLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLmgiCkBAIC0xNzQsMTQgKzE3NSw5IEBACiAgKiBJUkRBCiAgKi8KIAotc3RhdGljIHZvaWQgaXJkYV90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJTzEwNV9IWDQ3MDBfbklSX09OLCBtb2RlICYgSVJfT0ZGKTsKLX0KLQogc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgZmljcF9pbmZvID0gewotCS50cmFuc2NlaXZlcl9jYXAgID0gSVJfU0lSTU9ERSB8IElSX09GRiwKLQkudHJhbnNjZWl2ZXJfbW9kZSA9IGlyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkuZ3Bpb19wd2Rvd24JCT0gR1BJTzEwNV9IWDQ3MDBfbklSX09OLAorCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAogfTsKIAogLyoKQEAgLTM2OCw4ICszNjQsNiBAQAogICogTENEIC0gU29ueSBkaXNwbGF5IGNvbm5lY3RlZCB0byBBVEkgSW1hZ2VvbiB3MzIyMAogICovCiAKLXN0YXRpYyBpbnQgbGNkX3Bvd2VyOwotCiBzdGF0aWMgdm9pZCBzb255X2xjZF9pbml0KHZvaWQpCiB7CiAJZ3Bpb19zZXRfdmFsdWUoR1BJTzg0X0hYNDcwMF9MQ0RfU1FOLCAxKTsKQEAgLTQxMCwzNSArNDA0LDYgQEAKIAlncGlvX3NldF92YWx1ZShHUElPMTEwX0hYNDcwMF9MQ0RfTFZERF8zVjNfT04sIDApOwogfQogCi1zdGF0aWMgaW50IGh4NDcwMF9sY2Rfc2V0X3Bvd2VyKHN0cnVjdCBsY2RfZGV2aWNlICpsZGV2LCBpbnQgbGV2ZWwpCi17Ci0Jc3dpdGNoIChsZXZlbCkgewotCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKLQkJc29ueV9sY2RfaW5pdCgpOwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX05PUk1BTDoKLQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6Ci0JY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgotCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgotCQlzb255X2xjZF9vZmYoKTsKLQkJYnJlYWs7Ci0JfQotCWxjZF9wb3dlciA9IGxldmVsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGh4NDcwMF9sY2RfZ2V0X3Bvd2VyKHN0cnVjdCBsY2RfZGV2aWNlICpsbSkKLXsKLQlyZXR1cm4gbGNkX3Bvd2VyOwotfQotCi1zdGF0aWMgc3RydWN0IGxjZF9vcHMgaHg0NzAwX2xjZF9vcHMgPSB7Ci0JLmdldF9wb3dlciA9IGh4NDcwMF9sY2RfZ2V0X3Bvd2VyLAotCS5zZXRfcG93ZXIgPSBoeDQ3MDBfbGNkX3NldF9wb3dlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbGNkX2RldmljZSAqaHg0NzAwX2xjZF9kZXZpY2U7Ci0KICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyB2b2lkIHczMjIwX2xjZF9zdXNwZW5kKHN0cnVjdCB3MTAwZmJfcGFyICp3ZmIpCiB7CkBAIC01NzMsNiArNTM4LDI3IEBACiAJLnJlc291cmNlICAgICAgPSB3MzIyMF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgdm9pZCBoeDQ3MDBfbGNkX3NldF9wb3dlcihzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsIHVuc2lnbmVkIGludCBwb3dlcikKK3sKKwlpZiAocG93ZXIpCisJCXNvbnlfbGNkX2luaXQoKTsKKwllbHNlCisJCXNvbnlfbGNkX29mZigpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgaHg0NzAwX2xjZF9kYXRhID0geworCS5zZXRfcG93ZXIgPSBoeDQ3MDBfbGNkX3NldF9wb3dlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGh4NDcwMF9sY2QgPSB7CisJLm5hbWUgPSAicGxhdGZvcm0tbGNkIiwKKwkuaWQgICA9IC0xLAorCS5kZXYgID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZoeDQ3MDBfbGNkX2RhdGEsCisJCS5wYXJlbnQgICAgICAgID0gJnczMjIwLmRldiwKKwl9LAorfTsKKwogLyoKICAqIEJhY2tsaWdodAogICovCkBAIC04NzIsOSArODU4LDYgQEAKIAlweGEyeHhfc2V0X3NwaV9pbmZvKDIsICZweGFfc3NwMl9tYXN0ZXJfaW5mbyk7CiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oQVJSQVlfQU5EX1NJWkUodHNjMjA0Nl9ib2FyZF9pbmZvKSk7CiAKLQloeDQ3MDBfbGNkX2RldmljZSA9IGxjZF9kZXZpY2VfcmVnaXN0ZXIoIncxMDBmYiIsIE5VTEwsCi0JCQkJCSh2b2lkICopJnczMjIwX2luZm8sICZoeDQ3MDBfbGNkX29wcyk7Ci0KIAlncGlvX3NldF92YWx1ZShHUElPNzFfSFg0NzAwX0FTSUMzX25SRVNFVCwgMCk7CiAJbWRlbGF5KDEwKTsKIAlncGlvX3NldF92YWx1ZShHUElPNzFfSFg0NzAwX0FTSUMzX25SRVNFVCwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCmluZGV4IGI2MjQzYjUuLmI2NDg2ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCkBAIC0xNjgsNyArMTY4LDEwIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIGlkcF9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLm9jcl9tYXNrCQk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuZ3Bpb19jYXJkX2RldGVjdAk9IC0xLAorCS5ncGlvX2NhcmRfcm8JCT0gLTEsCisJLmdwaW9fcG93ZXIJCT0gLTEsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaWRwX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2ltb3RlMi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaW1vdGUyLmMKaW5kZXggOTYxODA3ZC4uMmE0OTQ1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW1vdGUyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW1vdGUyLmMKQEAgLTM4OSw2ICszODksOSBAQAogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBpbW90ZTJfbWNpX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm9jcl9tYXNrID0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQsIC8qIGRlZmF1bHQgYW55d2F5ICovCiAJLmdldF9ybyA9IGltb3RlMl9tY2lfZ2V0X3JvLAorCS5ncGlvX2NhcmRfZGV0ZWN0ID0gLTEsCisJLmdwaW9fY2FyZF9ybwk9IC0xLAorCS5ncGlvX3Bvd2VyID0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gaW1vdGUyZmxhc2hfcGFydGl0aW9uc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2JhbGxvb24zLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvYmFsbG9vbjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmVjMDliCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2JhbGxvb24zLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2JhbGxvb24zLmgKKyAqCisgKiAgQXV0aG9yczoJTmljayBCYW5lIGFuZCBXb29rZXkKKyAqICBDcmVhdGVkOglPY3QsIDIwMDUKKyAqICBDb3B5cmlnaHQ6CVRvYnkgQ2h1cmNoaWxsIEx0ZAorICogIENyaWJiZWQgZnJvbSBtYWluc3RvbmUuYywgYnkgTmljaG9sYXMgUGl0cmUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgQVNNX0FSQ0hfQkFMTE9PTjNfSAorI2RlZmluZSBBU01fQVJDSF9CQUxMT09OM19ICisKK2VudW0gYmFsbG9vbjNfZmVhdHVyZXMgeworCUJBTExPT04zX0ZFQVRVUkVfT0hDSSwKKwlCQUxMT09OM19GRUFUVVJFX01NQywKKwlCQUxMT09OM19GRUFUVVJFX0NGLAorCUJBTExPT04zX0ZFQVRVUkVfQVVESU8sCisJQkFMTE9PTjNfRkVBVFVSRV9UT1BQT0xZLAorfTsKKworI2RlZmluZSBCQUxMT09OM19GUEdBX1BIWVMJUFhBX0NTNF9QSFlTCisjZGVmaW5lIEJBTExPT04zX0ZQR0FfVklSVAkoMHhmMTAwMDAwMCkJLyogYXMgcGVyIGJhbGxvb24yICovCisjZGVmaW5lIEJBTExPT04zX0ZQR0FfTEVOR1RICTB4MDEwMDAwMDAKKworLyogRlBHQS9DUExEIHJlZ2lzdGVycyAqLworI2RlZmluZSBCQUxMT09OM19QQ01DSUEwX1JFRwkJKEJBTExPT04zX0ZQR0FfVklSVCArIDB4MDBlMDAwMDgpCisvKiBmaXhtZSAtIHNhbWUgZm9yIG5vdyAqLworI2RlZmluZSBCQUxMT09OM19QQ01DSUExX1JFRwkJKEJBTExPT04zX0ZQR0FfVklSVCArIDB4MDBlMDAwMDgpCisjZGVmaW5lIEJBTExPT04zX05BTkRJT19JT19SRUcJCShCQUxMT09OM19GUEdBX1ZJUlQgKyAweDAwZTAwMDAwKQorLyogZnBnYS9jcGxkIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEJBTExPT04zX0lOVF9DT05UUk9MX1JFRwkoQkFMTE9PTjNfRlBHQV9WSVJUICsgMHgwMGUwMDAwQykKKyNkZWZpbmUgQkFMTE9PTjNfTkFORElPX0NUTDJfUkVHIAkoQkFMTE9PTjNfRlBHQV9WSVJUICsgMHgwMGUwMDAxMCkKKyNkZWZpbmUgQkFMTE9PTjNfTkFORElPX0NUTF9SRUcgCShCQUxMT09OM19GUEdBX1ZJUlQgKyAweDAwZTAwMDE0KQorI2RlZmluZSBCQUxMT09OM19WRVJTSU9OX1JFRwkJKEJBTExPT04zX0ZQR0FfVklSVCArIDB4MDBlMDAwMWMpCisKKyNkZWZpbmUgQkFMTE9PTjNfU0FNT1NBX0FERFJfUkVHCShCQUxMT09OM19GUEdBX1ZJUlQgKyAweDAwYzAwMDAwKQorI2RlZmluZSBCQUxMT09OM19TQU1PU0FfREFUQV9SRUcJKEJBTExPT04zX0ZQR0FfVklSVCArIDB4MDBjMDAwMDQpCisjZGVmaW5lIEJBTExPT04zX1NBTU9TQV9TVEFUVVNfUkVHCShCQUxMT09OM19GUEdBX1ZJUlQgKyAweDAwYzAwMDFjKQorCisvKiBHUElPcyBmb3IgaXJxcyAqLworI2RlZmluZSBCQUxMT09OM19HUElPX0FVWF9OSVJRCQkoOTQpCisjZGVmaW5lIEJBTExPT04zX0dQSU9fQ09ERUNfSVJRCQkoOTUpCisKKy8qIFRpbWVyIGFuZCBJZGxlIExFRCBsb2NhdGlvbnMgKi8KKyNkZWZpbmUgQkFMTE9PTjNfR1BJT19MRURfTkFORAkJKDkpCisjZGVmaW5lIEJBTExPT04zX0dQSU9fTEVEX0lETEUJCSgxMCkKKworLyogYmFja2xpZ2h0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQkFMTE9PTjNfR1BJT19SVU5fQkFDS0xJR0hUCSg5OSkKKworI2RlZmluZSBCQUxMT09OM19HUElPX1MwX0NECQkoMTA1KQorCisvKiBGUEdBIEludGVycnVwdCBNYXNrL0Fja25vd2xlZGdlIFJlZ2lzdGVyICovCisjZGVmaW5lIEJBTExPT04zX0lOVF9TMF9JUlEJCSgxIDw8IDApICAvKiBQQ01DSUEgMCBJUlEgKi8KKyNkZWZpbmUgQkFMTE9PTjNfSU5UX1MwX1NUU0NIRwkJKDEgPDwgMSkgIC8qIFBDTUNJQSAwIHN0YXR1cyBjaGFuZ2VkICovCisKKy8qIENGIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBCQUxMT09OM19QQ01DSUFfbklSUQkJKDEgPDwgMCkgIC8qIElSUSAvIHJlYWR5IHNpZ25hbCAqLworI2RlZmluZSBCQUxMT09OM19QQ01DSUFfblNUU0NIR19CVkQxCSgxIDw8IDEpCisJCQkJCS8qIFZERCBzZW5zZSAvIGNhcmQgc3RhdHVzIGNoYW5nZWQgKi8KKworLyogQ0YgY29udHJvbCByZWdpc3RlciAod3JpdGUpICovCisjZGVmaW5lIEJBTExPT04zX1BDTUNJQV9SRVNFVAkJKDEgPDwgMCkgICAvKiBDYXJkIHJlc2V0IHNpZ25hbCAqLworI2RlZmluZSBCQUxMT09OM19QQ01DSUFfRU5BQkxFCQkoMSA8PCAxKQorI2RlZmluZSBCQUxMT09OM19QQ01DSUFfQUREX0VOQUJMRQkoMSA8PCAyKQorCisvKiBDUExEIChhbmQgRlBHQSkgaW50ZXJmYWNlIGRlZmluaXRpb25zICovCisjZGVmaW5lIENQTERfTENEMF9EQVRBX1NFVCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENQTERfTENEMF9EQVRBX0NMUiAgICAgICAgICAgICAweDEwCisjZGVmaW5lIENQTERfTENEMF9DT01NQU5EX1NFVCAgICAgICAgICAweDAxCisjZGVmaW5lIENQTERfTENEMF9DT01NQU5EX0NMUiAgICAgICAgICAweDExCisjZGVmaW5lIENQTERfTENEMV9EQVRBX1NFVCAgICAgICAgICAgICAweDAyCisjZGVmaW5lIENQTERfTENEMV9EQVRBX0NMUiAgICAgICAgICAgICAweDEyCisjZGVmaW5lIENQTERfTENEMV9DT01NQU5EX1NFVCAgICAgICAgICAweDAzCisjZGVmaW5lIENQTERfTENEMV9DT01NQU5EX0NMUiAgICAgICAgICAweDEzCisKKyNkZWZpbmUgQ1BMRF9NSVNDX1NFVCAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgQ1BMRF9NSVNDX0NMUiAgICAgICAgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgQ1BMRF9NSVNDX0xPT05fTlJFU0VUX0JJVCAgICAgIDAKKyNkZWZpbmUgQ1BMRF9NSVNDX0xPT05fVU5TVVNQX0JJVCAgICAgIDEKKyNkZWZpbmUgQ1BMRF9NSVNDX1JVTl81Vl9CSVQgICAgICAgICAgIDIKKyNkZWZpbmUgQ1BMRF9NSVNDX0NIR19EMF9CSVQgICAgICAgICAgIDMKKyNkZWZpbmUgQ1BMRF9NSVNDX0NIR19EMV9CSVQgICAgICAgICAgIDQKKyNkZWZpbmUgQ1BMRF9NSVNDX0RBQ19OQ1NfQklUICAgICAgICAgIDUKKworI2RlZmluZSBDUExEX0xDRF9TRVQgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBDUExEX0xDRF9DTFIgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBDUExEX0xDRF9CQUNLTElHSFRfRU5fMF9CSVQgICAgMAorI2RlZmluZSBDUExEX0xDRF9CQUNLTElHSFRfRU5fMV9CSVQgICAgMQorI2RlZmluZSBDUExEX0xDRF9MRURfUkVEX0JJVCAgICAgICAgICAgNAorI2RlZmluZSBDUExEX0xDRF9MRURfR1JFRU5fQklUICAgICAgICAgNQorI2RlZmluZSBDUExEX0xDRF9OUkVTRVRfQklUICAgICAgICAgICAgNworCisjZGVmaW5lIENQTERfTENEX1JPX1NFVCAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIENQTERfTENEX1JPX0NMUiAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIENQTERfTENEX1JPX0xDRDBfbldBSVRfQklUICAgICAwCisjZGVmaW5lIENQTERfTENEX1JPX0xDRDFfbldBSVRfQklUICAgICAxCisKKyNkZWZpbmUgQ1BMRF9TRVJJQUxfU0VUICAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgQ1BMRF9TRVJJQUxfQ0xSICAgICAgICAgICAgICAgIDB4MWEKKyNkZWZpbmUgQ1BMRF9TRVJJQUxfR1NNX1JJX0JJVCAgICAgICAgIDAKKyNkZWZpbmUgQ1BMRF9TRVJJQUxfR1NNX0NUU19CSVQgICAgICAgIDEKKyNkZWZpbmUgQ1BMRF9TRVJJQUxfR1NNX0RUUl9CSVQgICAgICAgIDIKKyNkZWZpbmUgQ1BMRF9TRVJJQUxfTFBSX0NUU19CSVQgICAgICAgIDMKKyNkZWZpbmUgQ1BMRF9TRVJJQUxfVEMyMzJfQ1RTX0JJVCAgICAgIDQKKyNkZWZpbmUgQ1BMRF9TRVJJQUxfVEMyMzJfRFNSX0JJVCAgICAgIDUKKworI2RlZmluZSBDUExEX1NST1VUSU5HX1NFVCAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBDUExEX1NST1VUSU5HX0NMUiAgICAgICAgICAgICAgMHgxYgorI2RlZmluZSBDUExEX1NST1VUSU5HX01TUDQzMF9MUFIgICAgICAgMAorI2RlZmluZSBDUExEX1NST1VUSU5HX01TUDQzMF9UQzIzMiAgICAgMQorI2RlZmluZSBDUExEX1NST1VUSU5HX01TUDQzMF9HU00gICAgICAgMgorI2RlZmluZSBDUExEX1NST1VUSU5HX0xPT05fTFBSICAgICAgICAgKDAgPDwgNCkKKyNkZWZpbmUgQ1BMRF9TUk9VVElOR19MT09OX1RDMjMyICAgICAgICgxIDw8IDQpCisjZGVmaW5lIENQTERfU1JPVVRJTkdfTE9PTl9HU00gICAgICAgICAoMiA8PCA0KQorCisjZGVmaW5lIENQTERfQVJPVVRJTkdfU0VUICAgICAgICAgICAgICAweDBjCisjZGVmaW5lIENQTERfQVJPVVRJTkdfQ0xSICAgICAgICAgICAgICAweDFjCisjZGVmaW5lIENQTERfQVJPVVRJTkdfTUlDMlBIT05FX0JJVCAgICAwCisjZGVmaW5lIENQTERfQVJPVVRJTkdfUEhPTkUySU5UX0JJVCAgICAxCisjZGVmaW5lIENQTERfQVJPVVRJTkdfUEhPTkUyRVhUX0JJVCAgICAyCisjZGVmaW5lIENQTERfQVJPVVRJTkdfTE9PTkwySU5UX0JJVCAgICAzCisjZGVmaW5lIENQTERfQVJPVVRJTkdfTE9PTkwyRVhUX0JJVCAgICA0CisjZGVmaW5lIENQTERfQVJPVVRJTkdfTE9PTlIyUEhPTkVfQklUICA1CisjZGVmaW5lIENQTERfQVJPVVRJTkdfTE9PTlIySU5UX0JJVCAgICA2CisjZGVmaW5lIENQTERfQVJPVVRJTkdfTE9PTlIyRVhUX0JJVCAgICA3CisKK2V4dGVybiBpbnQgYmFsbG9vbjNfaGFzKGVudW0gYmFsbG9vbjNfZmVhdHVyZXMgZmVhdHVyZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2NvbGlicmkuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9jb2xpYnJpLmgKaW5kZXggYTg4ZDdjYS4uODExNzQzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2NvbGlicmkuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY29saWJyaS5oCkBAIC0yMyw2ICsyMywxMiBAQAogZXh0ZXJuIHZvaWQgY29saWJyaV9weGEzeHhfaW5pdF9ldGgoc3RydWN0IGF4X3BsYXRfZGF0YSAqcGxhdF9kYXRhKTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfUFhBM3h4KSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9QWEEzeHhfTU9EVUxFKQorZXh0ZXJuIHZvaWQgY29saWJyaV9weGEzeHhfaW5pdF9uYW5kKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb2xpYnJpX3B4YTN4eF9pbml0X25hbmQodm9pZCkge30KKyNlbmRpZgorCiAvKiBwaHlzaWNhbCBtZW1vcnkgcmVnaW9ucyAqLwogI2RlZmluZSBDT0xJQlJJX1NEUkFNX0JBU0UJMHhhMDAwMDAwMCAgICAgIC8qIFNEUkFNIHJlZ2lvbiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IGY2YjRiZjMuLjI0MTg4MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC0yNCwzNCArMjQsMjcgQEAKIAkJbW92CVx0bXAsIFx0bXAsIGxzciAjMTMKIAkJYW5kCVx0bXAsIFx0bXAsICMweDcJCUAgQ29yZSBHCiAJCWNtcAlcdG1wLCAjMQotCQliaGkJMTAwNGYKKwkJYmhpCTEwMDJmCiAKKwkJQCBDb3JlIEdlbmVyYXRpb24gMSAoUFhBMjV4KQogCQltb3YJXGJhc2UsICNpb19wMnYoMHg0MDAwMDAwMCkJQCBJSVIgQ3RsID0gMHg0MGQwMDAwMAogCQlhZGQJXGJhc2UsIFxiYXNlLCAjMHgwMGQwMDAwMAogCQlsZHIJXGlycXN0YXQsIFtcYmFzZSwgIzBdCQlAIElDSVAKIAkJbGRyCVxpcnFuciwgW1xiYXNlLCAjNF0JCUAgSUNNUgotCQliCTEwMDJmCiAKLTEwMDQ6Ci0JCW1yYwlwNiwgMCwgXGlycXN0YXQsIGM2LCBjMCwgMAlAIElDSVAyCi0JCW1yYwlwNiwgMCwgXGlycW5yLCBjNywgYzAsIDAJQCBJQ01SMgotCQlhbmRzCVxpcnFuciwgXGlycXN0YXQsIFxpcnFucgotCQliZXEJMTAwM2YKLQkJcnNiCVxpcnFzdGF0LCBcaXJxbnIsICMwCi0JCWFuZAlcaXJxc3RhdCwgXGlycXN0YXQsIFxpcnFucgotCQljbHoJXGlycW5yLCBcaXJxc3RhdAotCQlyc2IJXGlycW5yLCBcaXJxbnIsICMzMQotCQlhZGQJXGlycW5yLCBcaXJxbnIsICMoMzIgKyBQWEFfSVJRKDApKQotCQliCTEwMDFmCi0xMDAzOgotCQltcmMJcDYsIDAsIFxpcnFzdGF0LCBjMCwgYzAsIDAJQCBJQ0lQCi0JCW1yYwlwNiwgMCwgXGlycW5yLCBjMSwgYzAsIDAJQCBJQ01SCi0xMDAyOgogCQlhbmRzCVxpcnFuciwgXGlycXN0YXQsIFxpcnFucgogCQliZXEJMTAwMWYKIAkJcnNiCVxpcnFzdGF0LCBcaXJxbnIsICMwCiAJCWFuZAlcaXJxc3RhdCwgXGlycXN0YXQsIFxpcnFucgogCQljbHoJXGlycW5yLCBcaXJxc3RhdAogCQlyc2IJXGlycW5yLCBcaXJxbnIsICMoMzEgKyBQWEFfSVJRKDApKQorCQliCTEwMDFmCisxMDAyOgorCQlAIENvcmUgR2VuZXJhdGlvbiAyIChQWEEyN3gpIG9yIENvcmUgR2VuZXJhdGlvbiAzIChQWEEzeHgpCisJCW1yYwlwNiwgMCwgXGlycXN0YXQsIGM1LCBjMCwgMAlAIElDSFAKKwkJdHN0CVxpcnFzdGF0LCAjMHg4MDAwMDAwMAorCQliZXEJMTAwMWYKKwkJYmljCVxpcnFzdGF0LCBcaXJxc3RhdCwgIzB4ODAwMDAwMDAKKwkJbW92CVxpcnFuciwgXGlycXN0YXQsIGxzciAjMTYKIDEwMDE6CiAJCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IDE2YWI3OTUuLmFhM2Q5ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0xOTcsNiArMTk3LDE2IEBACiAjZGVmaW5lIF9fY3B1X2lzX3B4YTkzNShpZCkJKDApCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19DUFVfUFhBOTUwCisjZGVmaW5lIF9fY3B1X2lzX3B4YTk1MChpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXVuc2lnbmVkIGludCBfaWQgPSAoaWQpID4+IDQgJiAweGZmZjsJXAorCQlpZCA9PSAweDY5NzsJCQkJXAorCSB9KQorI2Vsc2UKKyNkZWZpbmUgX19jcHVfaXNfcHhhOTUwKGlkKQkoMCkKKyNlbmRpZgorCiAjZGVmaW5lIGNwdV9pc19weGEyMTAoKQkJCQkJXAogCSh7CQkJCQkJXAogCQlfX2NwdV9pc19weGEyMTAocmVhZF9jcHVpZF9pZCgpKTsJXApAQCAtMjQ5LDYgKzI1OSwxMyBAQAogCQlfX2NwdV9pc19weGE5MzUoaWQpOwkJCVwKIAkgfSkKIAorI2RlZmluZSBjcHVfaXNfcHhhOTUwKCkJCQkJCVwKKwkoewkJCQkJCVwKKwkJdW5zaWduZWQgaW50IGlkID0gcmVhZF9jcHVpZChDUFVJRF9JRCk7CVwKKwkJX19jcHVfaXNfcHhhOTUwKGlkKTsJCQlcCisJIH0pCisKKwogLyoKICAqIENQVUlEIENvcmUgR2VuZXJhdGlvbiBCaXQKICAqIDw9IDB4MiBmb3IgcHhhMjF4L3B4YTI1eC9weGEyNngvcHhhMjd4CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaXJkYS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2lyZGEuaAppbmRleCAwYTUwYzNjLi4zY2Q0MWY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaXJkYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9pcmRhLmgKQEAgLTEyLDYgKzEyLDggQEAKIAl2b2lkICgqdHJhbnNjZWl2ZXJfbW9kZSkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSk7CiAJaW50ICgqc3RhcnR1cCkoc3RydWN0IGRldmljZSAqZGV2KTsKIAl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50IGdwaW9fcHdkb3duOwkJLyogcG93ZXJkb3duIEdQSU8gZm9yIHRoZSBJckRBIGNoaXAgKi8KKwlib29sIGdwaW9fcHdkb3duX2ludmVydGVkOwkvKiBncGlvX3B3ZG93biBpcyBpbnZlcnRlZCAqLwogfTsKIAogZXh0ZXJuIHZvaWQgcHhhX3NldF9maWNwX2luZm8oc3RydWN0IHB4YWZpY3BfcGxhdGZvcm1fZGF0YSAqaW5mbyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCA2YTFkOTU5Li4zNjc3YTlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTY4LDkgKzY4LDEwIEBACiAjaWZkZWYgQ09ORklHX1BYQTN4eAogI2RlZmluZSBJUlFfU1NQNAlQWEFfSVJRKDEzKQkvKiBTU1A0IHNlcnZpY2UgcmVxdWVzdCAqLwogI2RlZmluZSBJUlFfQ0lSCQlQWEFfSVJRKDM0KQkvKiBDb25zdW1lciBJUiAqLworI2RlZmluZSBJUlFfQ09NTV9XRFQJUFhBX0lSUSgzNSkgCS8qIENvbW0gV0RUIGludGVycnVwdCAqLwogI2RlZmluZSBJUlFfVFNJCQlQWEFfSVJRKDM2KQkvKiBUb3VjaCBTY3JlZW4gSW50ZXJmYWNlIChQWEEzMjApICovCiAjZGVmaW5lIElSUV9VU0lNMglQWEFfSVJRKDM4KQkvKiBVU0lNMiBDb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9HUlBISUNTCVBYQV9JUlEoMzkpCS8qIEdyYXBoaWNzIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgSVJRX0dDVQkJUFhBX0lSUSgzOSkJLyogR3JhcGhpY3MgQ29udHJvbGxlciAqLwogI2RlZmluZSBJUlFfTU1DMglQWEFfSVJRKDQxKQkvKiBNTUMyIENvbnRyb2xsZXIgKi8KICNkZWZpbmUgSVJRXzFXSVJFCVBYQV9JUlEoNDQpCS8qIDEtV2lyZSBDb250cm9sbGVyICovCiAjZGVmaW5lIElSUV9OQU5ECVBYQV9JUlEoNDUpCS8qIE5BTkQgQ29udHJvbGxlciAqLwpAQCAtODEsOCArODIsMzEgQEAKICNkZWZpbmUgSVJRX01NQzMJUFhBX0lSUSg1NSkJLyogTU1DMyBDb250cm9sbGVyIChQWEEzMTApICovCiAjZW5kaWYKIAotI2RlZmluZSBQWEFfR1BJT19JUlFfQkFTRQlQWEFfSVJRKDY0KQotI2RlZmluZSBQWEFfR1BJT19JUlFfTlVNCSgxMjgpCisjaWZkZWYgQ09ORklHX0NQVV9QWEE5MzUKKyNkZWZpbmUgSVJRX1UyTwkJUFhBX0lSUSg2NCkJLyogVVNCIE9URyAyLjAgQ29udHJvbGxlciAoUFhBOTM1KSAqLworI2RlZmluZSBJUlFfVTJICQlQWEFfSVJRKDY1KQkvKiBVU0IgSG9zdCAyLjAgQ29udHJvbGxlciAoUFhBOTM1KSAqLworCisjZGVmaW5lIElSUV9NTUMzX1BYQTkzNQlQWEFfSVJRKDcyKQkvKiBNTUMzIENvbnRyb2xsZXIgKFBYQTkzNSkgKi8KKyNkZWZpbmUgSVJRX01NQzRfUFhBOTM1CVBYQV9JUlEoNzMpCS8qIE1NQzQgQ29udHJvbGxlciAoUFhBOTM1KSAqLworI2RlZmluZSBJUlFfTU1DNV9QWEE5MzUJUFhBX0lSUSg3NCkJLyogTU1DNSBDb250cm9sbGVyIChQWEE5MzUpICovCisKKyNkZWZpbmUgSVJRX1UyUAkJUFhBX0lSUSg5MykJLyogVVNCIFBIWSBEKy9ELSBMaW5lcyAoUFhBOTM1KSAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ1BVX1BYQTkzMAorI2RlZmluZSBJUlFfRU5IUk9UCVBYQV9JUlEoMzcpCS8qIEVuaGFuY2VkIFJvdGFyeSAoUFhBOTMwKSAqLworI2RlZmluZSBJUlFfQUNJUEMwCVBYQV9JUlEoNSkKKyNkZWZpbmUgSVJRX0FDSVBDMQlQWEFfSVJRKDQwKQorI2RlZmluZSBJUlFfQUNJUEMyCVBYQV9JUlEoMTkpCisjZGVmaW5lIElSUV9UUktCQUxMCVBYQV9JUlEoNDMpCS8qIFRyYWNrIEJhbGwgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NQVV9QWEE5NTAKKyNkZWZpbmUgSVJRX0dDNTAwCVBYQV9JUlEoNzApCS8qIEdyYXBoaWNzIENvbnRyb2xsZXIgKFBYQTk1MCkgKi8KKyNlbmRpZgorCisjZGVmaW5lIFBYQV9HUElPX0lSUV9CQVNFCVBYQV9JUlEoOTYpCisjZGVmaW5lIFBYQV9HUElPX0lSUV9OVU0JKDE5MikKIAogI2RlZmluZSBHUElPXzJfeF9UT19JUlEoeCkJKFBYQV9HUElPX0lSUV9CQVNFICsgKHgpKQogI2RlZmluZSBJUlFfR1BJTyh4KQkoKCh4KSA8IDIpID8gKElSUV9HUElPMCArICh4KSkgOiBHUElPXzJfeF9UT19JUlEoeCkpCkBAIC0xMDUsNiArMTI5LDggQEAKICNkZWZpbmUgSVJRX0JPQVJEX0VORAkJKElSUV9CT0FSRF9TVEFSVCArIDcwKQogI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9aWUxPTklURSkKICNkZWZpbmUgSVJRX0JPQVJEX0VORAkJKElSUV9CT0FSRF9TVEFSVCArIDMyKQorI2VsaWYgZGVmaW5lZChDT05GSUdfUFhBX0VaWCkKKyNkZWZpbmUgSVJRX0JPQVJEX0VORAkJKElSUV9CT0FSRF9TVEFSVCArIDIzKQogI2Vsc2UKICNkZWZpbmUgSVJRX0JPQVJEX0VORAkJKElSUV9CT0FSRF9TVEFSVCArIDE2KQogI2VuZGlmCkBAIC0yMzcsNiArMjYzLDE2IEBACiAjZGVmaW5lIE1BSU5TVE9ORV9TMV9TVFNDSEdfSVJRCU1BSU5TVE9ORV9JUlEoMTQpCiAjZGVmaW5lIE1BSU5TVE9ORV9TMV9JUlEJTUFJTlNUT05FX0lSUSgxNSkKIAorLyogQmFsbG9vbjMgSW50ZXJydXB0cyAqLworI2RlZmluZSBCQUxMT09OM19JUlEoeCkJCShJUlFfQk9BUkRfU1RBUlQgKyAoeCkpCisKKyNkZWZpbmUgQkFMTE9PTjNfQlBfQ0ZfTlJEWV9JUlEJQkFMTE9PTjNfSVJRKDApCisjZGVmaW5lIEJBTExPT04zX0JQX05TVFNDSEdfSVJRCUJBTExPT04zX0lSUSgxKQorCisjZGVmaW5lIEJBTExPT04zX0FVWF9OSVJRCUlSUV9HUElPKEJBTExPT04zX0dQSU9fQVVYX05JUlEpCisjZGVmaW5lIEJBTExPT04zX0NPREVDX0lSUQlJUlFfR1BJTyhCQUxMT09OM19HUElPX0NPREVDX0lSUSkKKyNkZWZpbmUgQkFMTE9PTjNfUzBfQ0RfSVJRCUlSUV9HUElPKEJBTExPT04zX0dQSU9fUzBfQ0QpCisKIC8qIExvQ29NbyBJbnRlcnJ1cHRzIChDT05GSUdfU0hBUlBfTE9DT01PKSAqLwogI2RlZmluZSBJUlFfTE9DT01PX0tFWV9CQVNFCShJUlFfQk9BUkRfU1RBUlQgKyAwKQogI2RlZmluZSBJUlFfTE9DT01PX0dQSU9fQkFTRQkoSVJRX0JPQVJEX1NUQVJUICsgMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAuaAppbmRleCA0ODIxODUwLi4yNzFlMjQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC5oCkBAIC0xNiwzMDUgKzE2LDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9NRlBfSAogI2RlZmluZSBfX0FTTV9BUkNIX01GUF9ICiAKLSNkZWZpbmUgbWZwX3RvX2dwaW8obSkJKChtKSAlIDEyOCkKLQotLyogbGlzdCBvZiBhbGwgdGhlIGNvbmZpZ3VyYWJsZSBNRlAgcGlucyAqLwotZW51bSB7Ci0JTUZQX1BJTl9JTlZBTElEID0gLTEsCi0KLQlNRlBfUElOX0dQSU8wID0gMCwKLQlNRlBfUElOX0dQSU8xLAotCU1GUF9QSU5fR1BJTzIsCi0JTUZQX1BJTl9HUElPMywKLQlNRlBfUElOX0dQSU80LAotCU1GUF9QSU5fR1BJTzUsCi0JTUZQX1BJTl9HUElPNiwKLQlNRlBfUElOX0dQSU83LAotCU1GUF9QSU5fR1BJTzgsCi0JTUZQX1BJTl9HUElPOSwKLQlNRlBfUElOX0dQSU8xMCwKLQlNRlBfUElOX0dQSU8xMSwKLQlNRlBfUElOX0dQSU8xMiwKLQlNRlBfUElOX0dQSU8xMywKLQlNRlBfUElOX0dQSU8xNCwKLQlNRlBfUElOX0dQSU8xNSwKLQlNRlBfUElOX0dQSU8xNiwKLQlNRlBfUElOX0dQSU8xNywKLQlNRlBfUElOX0dQSU8xOCwKLQlNRlBfUElOX0dQSU8xOSwKLQlNRlBfUElOX0dQSU8yMCwKLQlNRlBfUElOX0dQSU8yMSwKLQlNRlBfUElOX0dQSU8yMiwKLQlNRlBfUElOX0dQSU8yMywKLQlNRlBfUElOX0dQSU8yNCwKLQlNRlBfUElOX0dQSU8yNSwKLQlNRlBfUElOX0dQSU8yNiwKLQlNRlBfUElOX0dQSU8yNywKLQlNRlBfUElOX0dQSU8yOCwKLQlNRlBfUElOX0dQSU8yOSwKLQlNRlBfUElOX0dQSU8zMCwKLQlNRlBfUElOX0dQSU8zMSwKLQlNRlBfUElOX0dQSU8zMiwKLQlNRlBfUElOX0dQSU8zMywKLQlNRlBfUElOX0dQSU8zNCwKLQlNRlBfUElOX0dQSU8zNSwKLQlNRlBfUElOX0dQSU8zNiwKLQlNRlBfUElOX0dQSU8zNywKLQlNRlBfUElOX0dQSU8zOCwKLQlNRlBfUElOX0dQSU8zOSwKLQlNRlBfUElOX0dQSU80MCwKLQlNRlBfUElOX0dQSU80MSwKLQlNRlBfUElOX0dQSU80MiwKLQlNRlBfUElOX0dQSU80MywKLQlNRlBfUElOX0dQSU80NCwKLQlNRlBfUElOX0dQSU80NSwKLQlNRlBfUElOX0dQSU80NiwKLQlNRlBfUElOX0dQSU80NywKLQlNRlBfUElOX0dQSU80OCwKLQlNRlBfUElOX0dQSU80OSwKLQlNRlBfUElOX0dQSU81MCwKLQlNRlBfUElOX0dQSU81MSwKLQlNRlBfUElOX0dQSU81MiwKLQlNRlBfUElOX0dQSU81MywKLQlNRlBfUElOX0dQSU81NCwKLQlNRlBfUElOX0dQSU81NSwKLQlNRlBfUElOX0dQSU81NiwKLQlNRlBfUElOX0dQSU81NywKLQlNRlBfUElOX0dQSU81OCwKLQlNRlBfUElOX0dQSU81OSwKLQlNRlBfUElOX0dQSU82MCwKLQlNRlBfUElOX0dQSU82MSwKLQlNRlBfUElOX0dQSU82MiwKLQlNRlBfUElOX0dQSU82MywKLQlNRlBfUElOX0dQSU82NCwKLQlNRlBfUElOX0dQSU82NSwKLQlNRlBfUElOX0dQSU82NiwKLQlNRlBfUElOX0dQSU82NywKLQlNRlBfUElOX0dQSU82OCwKLQlNRlBfUElOX0dQSU82OSwKLQlNRlBfUElOX0dQSU83MCwKLQlNRlBfUElOX0dQSU83MSwKLQlNRlBfUElOX0dQSU83MiwKLQlNRlBfUElOX0dQSU83MywKLQlNRlBfUElOX0dQSU83NCwKLQlNRlBfUElOX0dQSU83NSwKLQlNRlBfUElOX0dQSU83NiwKLQlNRlBfUElOX0dQSU83NywKLQlNRlBfUElOX0dQSU83OCwKLQlNRlBfUElOX0dQSU83OSwKLQlNRlBfUElOX0dQSU84MCwKLQlNRlBfUElOX0dQSU84MSwKLQlNRlBfUElOX0dQSU84MiwKLQlNRlBfUElOX0dQSU84MywKLQlNRlBfUElOX0dQSU84NCwKLQlNRlBfUElOX0dQSU84NSwKLQlNRlBfUElOX0dQSU84NiwKLQlNRlBfUElOX0dQSU84NywKLQlNRlBfUElOX0dQSU84OCwKLQlNRlBfUElOX0dQSU84OSwKLQlNRlBfUElOX0dQSU85MCwKLQlNRlBfUElOX0dQSU85MSwKLQlNRlBfUElOX0dQSU85MiwKLQlNRlBfUElOX0dQSU85MywKLQlNRlBfUElOX0dQSU85NCwKLQlNRlBfUElOX0dQSU85NSwKLQlNRlBfUElOX0dQSU85NiwKLQlNRlBfUElOX0dQSU85NywKLQlNRlBfUElOX0dQSU85OCwKLQlNRlBfUElOX0dQSU85OSwKLQlNRlBfUElOX0dQSU8xMDAsCi0JTUZQX1BJTl9HUElPMTAxLAotCU1GUF9QSU5fR1BJTzEwMiwKLQlNRlBfUElOX0dQSU8xMDMsCi0JTUZQX1BJTl9HUElPMTA0LAotCU1GUF9QSU5fR1BJTzEwNSwKLQlNRlBfUElOX0dQSU8xMDYsCi0JTUZQX1BJTl9HUElPMTA3LAotCU1GUF9QSU5fR1BJTzEwOCwKLQlNRlBfUElOX0dQSU8xMDksCi0JTUZQX1BJTl9HUElPMTEwLAotCU1GUF9QSU5fR1BJTzExMSwKLQlNRlBfUElOX0dQSU8xMTIsCi0JTUZQX1BJTl9HUElPMTEzLAotCU1GUF9QSU5fR1BJTzExNCwKLQlNRlBfUElOX0dQSU8xMTUsCi0JTUZQX1BJTl9HUElPMTE2LAotCU1GUF9QSU5fR1BJTzExNywKLQlNRlBfUElOX0dQSU8xMTgsCi0JTUZQX1BJTl9HUElPMTE5LAotCU1GUF9QSU5fR1BJTzEyMCwKLQlNRlBfUElOX0dQSU8xMjEsCi0JTUZQX1BJTl9HUElPMTIyLAotCU1GUF9QSU5fR1BJTzEyMywKLQlNRlBfUElOX0dQSU8xMjQsCi0JTUZQX1BJTl9HUElPMTI1LAotCU1GUF9QSU5fR1BJTzEyNiwKLQlNRlBfUElOX0dQSU8xMjcsCi0JTUZQX1BJTl9HUElPMF8yLAotCU1GUF9QSU5fR1BJTzFfMiwKLQlNRlBfUElOX0dQSU8yXzIsCi0JTUZQX1BJTl9HUElPM18yLAotCU1GUF9QSU5fR1BJTzRfMiwKLQlNRlBfUElOX0dQSU81XzIsCi0JTUZQX1BJTl9HUElPNl8yLAotCU1GUF9QSU5fR1BJTzdfMiwKLQlNRlBfUElOX0dQSU84XzIsCi0JTUZQX1BJTl9HUElPOV8yLAotCU1GUF9QSU5fR1BJTzEwXzIsCi0JTUZQX1BJTl9HUElPMTFfMiwKLQlNRlBfUElOX0dQSU8xMl8yLAotCU1GUF9QSU5fR1BJTzEzXzIsCi0JTUZQX1BJTl9HUElPMTRfMiwKLQlNRlBfUElOX0dQSU8xNV8yLAotCU1GUF9QSU5fR1BJTzE2XzIsCi0JTUZQX1BJTl9HUElPMTdfMiwKLQotCU1GUF9QSU5fVUxQSV9TVFAsCi0JTUZQX1BJTl9VTFBJX05YVCwKLQlNRlBfUElOX1VMUElfRElSLAotCi0JTUZQX1BJTl9uWENWUkVOLAotCU1GUF9QSU5fREZfQ0xFX25PRSwKLQlNRlBfUElOX0RGX25BRFYxX0FMRSwKLQlNRlBfUElOX0RGX1NDTEtfRSwKLQlNRlBfUElOX0RGX1NDTEtfUywKLQlNRlBfUElOX25CRTAsCi0JTUZQX1BJTl9uQkUxLAotCU1GUF9QSU5fREZfbkFEVjJfQUxFLAotCU1GUF9QSU5fREZfSU5UX1JuQiwKLQlNRlBfUElOX0RGX25DUzAsCi0JTUZQX1BJTl9ERl9uQ1MxLAotCU1GUF9QSU5fbkxVQSwKLQlNRlBfUElOX25MTEEsCi0JTUZQX1BJTl9ERl9uV0UsCi0JTUZQX1BJTl9ERl9BTEVfbldFLAotCU1GUF9QSU5fREZfblJFX25PRSwKLQlNRlBfUElOX0RGX0FERFIwLAotCU1GUF9QSU5fREZfQUREUjEsCi0JTUZQX1BJTl9ERl9BRERSMiwKLQlNRlBfUElOX0RGX0FERFIzLAotCU1GUF9QSU5fREZfSU8wLAotCU1GUF9QSU5fREZfSU8xLAotCU1GUF9QSU5fREZfSU8yLAotCU1GUF9QSU5fREZfSU8zLAotCU1GUF9QSU5fREZfSU80LAotCU1GUF9QSU5fREZfSU81LAotCU1GUF9QSU5fREZfSU82LAotCU1GUF9QSU5fREZfSU83LAotCU1GUF9QSU5fREZfSU84LAotCU1GUF9QSU5fREZfSU85LAotCU1GUF9QSU5fREZfSU8xMCwKLQlNRlBfUElOX0RGX0lPMTEsCi0JTUZQX1BJTl9ERl9JTzEyLAotCU1GUF9QSU5fREZfSU8xMywKLQlNRlBfUElOX0RGX0lPMTQsCi0JTUZQX1BJTl9ERl9JTzE1LAotCi0JLyogYWRkaXRpb25hbCBwaW5zIG9uIFBYQTkzMCAqLwotCU1GUF9QSU5fR1NJTV9VSU8sCi0JTUZQX1BJTl9HU0lNX1VDTEssCi0JTUZQX1BJTl9HU0lNX1VERVQsCi0JTUZQX1BJTl9HU0lNX25VUlNULAotCU1GUF9QSU5fUE1JQ19JTlQsCi0JTUZQX1BJTl9SRFksCi0KLQlNRlBfUElOX01BWCwKLX07Ci0KLS8qCi0gKiBhIHBvc3NpYmxlIE1GUCBjb25maWd1cmF0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IGEgMzItYml0IGludGVnZXIKLSAqCi0gKiBiaXQgIDAuLiA5IC0gTUZQIFBpbiBOdW1iZXIgKDEwMjQgUGlucyBNYXhpbXVtKQotICogYml0IDEwLi4xMiAtIEFsdGVybmF0ZSBGdW5jdGlvbiBTZWxlY3Rpb24KLSAqIGJpdCAxMy4uMTUgLSBEcml2ZSBTdHJlbmd0aAotICogYml0IDE2Li4xOCAtIExvdyBQb3dlciBNb2RlIFN0YXRlCi0gKiBiaXQgMTkuLjIwIC0gTG93IFBvd2VyIE1vZGUgRWRnZSBEZXRlY3Rpb24KLSAqIGJpdCAyMS4uMjIgLSBSdW4gTW9kZSBQdWxsIFN0YXRlCi0gKgotICogdG8gZmFjaWxpdGF0ZSB0aGUgZGVmaW5pdGlvbiwgdGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHByb3ZpZGVkCi0gKgotICogTUZQX0NGR19ERUZBVUxUIC0gZGVmYXVsdCBNRlAgY29uZmlndXJhdGlvbiB2YWx1ZSwgd2l0aAotICogCQkgIGFsdGVybmF0ZSBmdW5jdGlvbiA9IDAsCi0gKiAJCSAgZHJpdmUgc3RyZW5ndGggPSBmYXN0IDNtQSAoTUZQX0RTMDNYKQotICogCQkgIGxvdyBwb3dlciBtb2RlID0gZGVmYXVsdAotICogCQkgIGVkZ2UgZGV0ZWN0aW9uID0gbm9uZQotICoKLSAqIE1GUF9DRkcJLSBkZWZhdWx0IE1GUFIgdmFsdWUgd2l0aCBhbHRlcm5hdGUgZnVuY3Rpb24KLSAqIE1GUF9DRkdfRFJWCS0gZGVmYXVsdCBNRlBSIHZhbHVlIHdpdGggYWx0ZXJuYXRlIGZ1bmN0aW9uIGFuZAotICogCQkgIHBpbiBkcml2ZSBzdHJlbmd0aAotICogTUZQX0NGR19MUE0JLSBkZWZhdWx0IE1GUFIgdmFsdWUgd2l0aCBhbHRlcm5hdGUgZnVuY3Rpb24gYW5kCi0gKiAJCSAgbG93IHBvd2VyIG1vZGUKLSAqIE1GUF9DRkdfWAktIGRlZmF1bHQgTUZQUiB2YWx1ZSB3aXRoIGFsdGVybmF0ZSBmdW5jdGlvbiwKLSAqIAkJICBwaW4gZHJpdmUgc3RyZW5ndGggYW5kIGxvdyBwb3dlciBtb2RlCi0gKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIG1mcF9jZmdfdDsKLQotI2RlZmluZSBNRlBfUElOKHgpCQkoKHgpICYgMHgzZmYpCi0KLSNkZWZpbmUgTUZQX0FGMAkJCSgweDAgPDwgMTApCi0jZGVmaW5lIE1GUF9BRjEJCQkoMHgxIDw8IDEwKQotI2RlZmluZSBNRlBfQUYyCQkJKDB4MiA8PCAxMCkKLSNkZWZpbmUgTUZQX0FGMwkJCSgweDMgPDwgMTApCi0jZGVmaW5lIE1GUF9BRjQJCQkoMHg0IDw8IDEwKQotI2RlZmluZSBNRlBfQUY1CQkJKDB4NSA8PCAxMCkKLSNkZWZpbmUgTUZQX0FGNgkJCSgweDYgPDwgMTApCi0jZGVmaW5lIE1GUF9BRjcJCQkoMHg3IDw8IDEwKQotI2RlZmluZSBNRlBfQUZfTUFTSwkJKDB4NyA8PCAxMCkKLSNkZWZpbmUgTUZQX0FGKHgpCQkoKCh4KSA+PiAxMCkgJiAweDcpCi0KLSNkZWZpbmUgTUZQX0RTMDFYCQkoMHgwIDw8IDEzKQotI2RlZmluZSBNRlBfRFMwMlgJCSgweDEgPDwgMTMpCi0jZGVmaW5lIE1GUF9EUzAzWAkJKDB4MiA8PCAxMykKLSNkZWZpbmUgTUZQX0RTMDRYCQkoMHgzIDw8IDEzKQotI2RlZmluZSBNRlBfRFMwNlgJCSgweDQgPDwgMTMpCi0jZGVmaW5lIE1GUF9EUzA4WAkJKDB4NSA8PCAxMykKLSNkZWZpbmUgTUZQX0RTMTBYCQkoMHg2IDw8IDEzKQotI2RlZmluZSBNRlBfRFMxM1gJCSgweDcgPDwgMTMpCi0jZGVmaW5lIE1GUF9EU19NQVNLCQkoMHg3IDw8IDEzKQotI2RlZmluZSBNRlBfRFMoeCkJCSgoKHgpID4+IDEzKSAmIDB4NykKLQotI2RlZmluZSBNRlBfTFBNX0RFRkFVTFQJCSgweDAgPDwgMTYpCi0jZGVmaW5lIE1GUF9MUE1fRFJJVkVfTE9XCSgweDEgPDwgMTYpCi0jZGVmaW5lIE1GUF9MUE1fRFJJVkVfSElHSAkoMHgyIDw8IDE2KQotI2RlZmluZSBNRlBfTFBNX1BVTExfTE9XCSgweDMgPDwgMTYpCi0jZGVmaW5lIE1GUF9MUE1fUFVMTF9ISUdICSgweDQgPDwgMTYpCi0jZGVmaW5lIE1GUF9MUE1fRkxPQVQJCSgweDUgPDwgMTYpCi0jZGVmaW5lIE1GUF9MUE1fSU5QVVQJCSgweDYgPDwgMTYpCi0jZGVmaW5lIE1GUF9MUE1fU1RBVEVfTUFTSwkoMHg3IDw8IDE2KQotI2RlZmluZSBNRlBfTFBNX1NUQVRFKHgpCSgoKHgpID4+IDE2KSAmIDB4NykKLQotI2RlZmluZSBNRlBfTFBNX0VER0VfTk9ORQkoMHgwIDw8IDE5KQotI2RlZmluZSBNRlBfTFBNX0VER0VfUklTRQkoMHgxIDw8IDE5KQotI2RlZmluZSBNRlBfTFBNX0VER0VfRkFMTAkoMHgyIDw8IDE5KQotI2RlZmluZSBNRlBfTFBNX0VER0VfQk9USAkoMHgzIDw8IDE5KQotI2RlZmluZSBNRlBfTFBNX0VER0VfTUFTSwkoMHgzIDw8IDE5KQotI2RlZmluZSBNRlBfTFBNX0VER0UoeCkJCSgoKHgpID4+IDE5KSAmIDB4MykKLQotI2RlZmluZSBNRlBfUFVMTF9OT05FCQkoMHgwIDw8IDIxKQotI2RlZmluZSBNRlBfUFVMTF9MT1cJCSgweDEgPDwgMjEpCi0jZGVmaW5lIE1GUF9QVUxMX0hJR0gJCSgweDIgPDwgMjEpCi0jZGVmaW5lIE1GUF9QVUxMX0JPVEgJCSgweDMgPDwgMjEpCi0jZGVmaW5lIE1GUF9QVUxMX01BU0sJCSgweDMgPDwgMjEpCi0jZGVmaW5lIE1GUF9QVUxMKHgpCQkoKCh4KSA+PiAyMSkgJiAweDMpCi0KLSNkZWZpbmUgTUZQX0NGR19ERUZBVUxUCQkoTUZQX0FGMCB8IE1GUF9EUzAzWCB8IE1GUF9MUE1fREVGQVVMVCB8XAotCQkJCSBNRlBfTFBNX0VER0VfTk9ORSB8IE1GUF9QVUxMX05PTkUpCi0KLSNkZWZpbmUgTUZQX0NGRyhwaW4sIGFmKQkJXAotCSgoTUZQX0NGR19ERUZBVUxUICYgfk1GUF9BRl9NQVNLKSB8XAotCSAoTUZQX1BJTihNRlBfUElOXyMjcGluKSB8IE1GUF8jI2FmKSkKLQotI2RlZmluZSBNRlBfQ0ZHX0RSVihwaW4sIGFmLCBkcnYpCVwKLQkoKE1GUF9DRkdfREVGQVVMVCAmIH4oTUZQX0FGX01BU0sgfCBNRlBfRFNfTUFTSykpIHxcCi0JIChNRlBfUElOKE1GUF9QSU5fIyNwaW4pIHwgTUZQXyMjYWYgfCBNRlBfIyNkcnYpKQotCi0jZGVmaW5lIE1GUF9DRkdfTFBNKHBpbiwgYWYsIGxwbSkJXAotCSgoTUZQX0NGR19ERUZBVUxUICYgfihNRlBfQUZfTUFTSyB8IE1GUF9MUE1fU1RBVEVfTUFTSykpIHxcCi0JIChNRlBfUElOKE1GUF9QSU5fIyNwaW4pIHwgTUZQXyMjYWYgfCBNRlBfTFBNXyMjbHBtKSkKLQotI2RlZmluZSBNRlBfQ0ZHX1gocGluLCBhZiwgZHJ2LCBscG0pCVwKLQkoKE1GUF9DRkdfREVGQVVMVCAmIH4oTUZQX0FGX01BU0sgfCBNRlBfRFNfTUFTSyB8IE1GUF9MUE1fU1RBVEVfTUFTSykpIHxcCi0JIChNRlBfUElOKE1GUF9QSU5fIyNwaW4pIHwgTUZQXyMjYWYgfCBNRlBfIyNkcnYgfCBNRlBfTFBNXyMjbHBtKSkKKyNpbmNsdWRlIDxwbGF0L21mcC5oPgogCiAjZW5kaWYgLyogX19BU01fQVJDSF9NRlBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21tYy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21tYy5oCmluZGV4IDZkMTMwNGMuLjAyYTY5ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tbWMuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbW1jLmgKQEAgLTE0LDYgKzE0LDExIEBACiAJaW50ICgqZ2V0X3JvKShzdHJ1Y3QgZGV2aWNlICopOwogCXZvaWQgKCpzZXRwb3dlcikoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBpbnQpOwogCXZvaWQgKCpleGl0KShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKik7CisJaW50IGdwaW9fY2FyZF9kZXRlY3Q7CQkJLyogZ3BpbyBkZXRlY3RpbmcgY2FyZCBpbnNlcnRpb24gKi8KKwlpbnQgZ3Bpb19jYXJkX3JvOwkJCS8qIGdwaW8gZGV0ZWN0aW5nIHJlYWQgb25seSB0b2dnbGUgKi8KKwlib29sIGdwaW9fY2FyZF9yb19pbnZlcnQ7CQkvKiBncGlvIHJvIGlzIGludmVydGVkICovCisJaW50IGdwaW9fcG93ZXI7CQkJCS8qIGdwaW8gcG93ZXJpbmcgdXAgTU1DIGJ1cyAqLworCWJvb2wgZ3Bpb19wb3dlcl9pbnZlcnQ7CQkJLyogZ3BpbyBwb3dlciBpcyBpbnZlcnRlZCAqLwogfTsKIAogZXh0ZXJuIHZvaWQgcHhhX3NldF9tY2lfaW5mbyhzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgKmluZm8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10Yy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzliMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXRjLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9wYWxtdGMtZ3Bpby5oCisgKgorICogR1BJT3MgYW5kIGludGVycnVwdHMgZm9yIFBhbG0gVHVuZ3N0ZW58QyBIYW5kaGVsZCBDb21wdXRlcgorICoKKyAqIEF1dGhvcnM6CUFsZXggT3Nib3JuZSA8Ym9ib2Zkb29tQGdtYWlsLmNvbT4KKyAqCQlNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoJCUhvbGdlciBCb2NrbGV0IDxiaXR6LmVtYWlsQGdteC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfSU5DTFVERV9QQUxNVENfSF8KKyNkZWZpbmUgX0lOQ0xVREVfUEFMTVRDX0hfCisKKy8qKiBIRVJFIEFSRSBHUElPcyAqKi8KKworLyogR1BJT3MgKi8KKyNkZWZpbmUgR1BJT19OUl9QQUxNVENfRUFSUEhPTkVfREVURUNUCTIKKyNkZWZpbmUgR1BJT19OUl9QQUxNVENfQ1JBRExFX0RFVEVDVAk1CisjZGVmaW5lIEdQSU9fTlJfUEFMTVRDX0hPVFNZTkNfQlVUVE9OCTcKKworLyogU0QvTU1DICovCisjZGVmaW5lIEdQSU9fTlJfUEFMTVRDX1NEX0RFVEVDVF9OCTEyCisjZGVmaW5lIEdQSU9fTlJfUEFMTVRDX1NEX1BPV0VSCQkzMgorI2RlZmluZSBHUElPX05SX1BBTE1UQ19TRF9SRUFET05MWQk1NAorCisvKiBXTEFOICovCisjZGVmaW5lIEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9SRUFEWQkxMworI2RlZmluZSBHUElPX05SX1BBTE1UQ19QQ01DSUFfUFdSUkVBRFkJMTQKKyNkZWZpbmUgR1BJT19OUl9QQUxNVENfUENNQ0lBX1BPV0VSMQkxNQorI2RlZmluZSBHUElPX05SX1BBTE1UQ19QQ01DSUFfUE9XRVIyCTMzCisjZGVmaW5lIEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9QT1dFUjMJNTUKKyNkZWZpbmUgR1BJT19OUl9QQUxNVENfUENNQ0lBX1JFU0VUCTc4CisKKy8qIFVEQyAqLworI2RlZmluZSBHUElPX05SX1BBTE1UQ19VU0JfREVURUNUX04JNAorI2RlZmluZSBHUElPX05SX1BBTE1UQ19VU0JfUE9XRVIJMzYKKworLyogTENEL0JBQ0tMSUdIVCAqLworI2RlZmluZSBHUElPX05SX1BBTE1UQ19CTF9QT1dFUgkJMTYKKyNkZWZpbmUgR1BJT19OUl9QQUxNVENfTENEX1BPV0VSCTQ0CisjZGVmaW5lIEdQSU9fTlJfUEFMTVRDX0xDRF9CTEFOSwkzOAorCisvKiBVQVJUICovCisjZGVmaW5lIEdQSU9fTlJfUEFMTVRDX1JTMjMyX1BPV0VSCTM3CisKKy8qIElSREEgKi8KKyNkZWZpbmUgR1BJT19OUl9QQUxNVENfSVJfRElTQUJMRQk0NQorCisvKiBJUlFzICovCisjZGVmaW5lIElSUV9HUElPX1BBTE1UQ19TRF9ERVRFQ1RfTglJUlFfR1BJTyhHUElPX05SX1BBTE1UQ19TRF9ERVRFQ1RfTikKKyNkZWZpbmUgSVJRX0dQSU9fUEFMTVRDX1dMQU5fUkVBRFkJSVJRX0dQSU8oR1BJT19OUl9QQUxNVENfV0xBTl9SRUFEWSkKKworLyogVUNCMTQwMCBHUElPcyAqLworI2RlZmluZSBHUElPX05SX1BBTE1UQ19QT1dFUl9ERVRFQ1QJKDB4ODAgfCAweDAwKQorI2RlZmluZSBHUElPX05SX1BBTE1UQ19IRUFEUEhPTkVfREVURUNUCSgweDgwIHwgMHgwMSkKKyNkZWZpbmUgR1BJT19OUl9QQUxNVENfU1BFQUtFUl9FTkFCTEUJKDB4ODAgfCAweDAzKQorI2RlZmluZSBHUElPX05SX1BBTE1UQ19WSUJSQV9QT1dFUgkoMHg4MCB8IDB4MDUpCisjZGVmaW5lIEdQSU9fTlJfUEFMTVRDX0xFRF9QT1dFUgkoMHg4MCB8IDB4MDcpCisKKy8qKiBIRVJFIEFSRSBJTklUIFZBTFVFUyAqKi8KKyNkZWZpbmUgUEFMTVRDX1VDQjE0MDBfR1BJT19PRkZTRVQJMHg4MAorCisvKiBCQVRURVJZICovCisjZGVmaW5lIFBBTE1UQ19CQVRfTUFYX1ZPTFRBR0UJCTQwMDAJLyogNC4wMFYgbWF4aW11bSB2b2x0YWdlICovCisjZGVmaW5lIFBBTE1UQ19CQVRfTUlOX1ZPTFRBR0UJCTM1NTAJLyogMy41NVYgY3JpdGljYWwgdm9sdGFnZSAqLworI2RlZmluZSBQQUxNVENfQkFUX01BWF9DVVJSRU5UCQkwCS8qIHVua25va24gKi8KKyNkZWZpbmUgUEFMTVRDX0JBVF9NSU5fQ1VSUkVOVAkJMAkvKiB1bmtub3duICovCisjZGVmaW5lIFBBTE1UQ19CQVRfTUFYX0NIQVJHRQkJMQkvKiB1bmtub3duICovCisjZGVmaW5lIFBBTE1UQ19CQVRfTUlOX0NIQVJHRQkJMQkvKiB1bmtub3duICovCisjZGVmaW5lIFBBTE1UQ19NQVhfTElGRV9NSU5TCQkyNDAJLyogb24tbGlmZSBpbiBtaW51dGVzICovCisKKyNkZWZpbmUgUEFMTVRDX0JBVF9NRUFTVVJFX0RFTEFZCShIWiAqIDEpCisKKy8qIEJBQ0tMSUdIVCAqLworI2RlZmluZSBQQUxNVENfTUFYX0lOVEVOU0lUWQkJMHhGRQorI2RlZmluZSBQQUxNVENfREVGQVVMVF9JTlRFTlNJVFkJMHg3RQorI2RlZmluZSBQQUxNVENfTElNSVRfTUFTSwkJMHg3RgorI2RlZmluZSBQQUxNVENfUFJFU0NBTEVSCQkweDNGCisjZGVmaW5lIFBBTE1UQ19QRVJJT0RfTlMJCTM1MDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXR4LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXR4LmgKaW5kZXggZTc0MDgyYy4uMWJlMGRiNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdHguaApAQCAtODIsNiArODIsMTEgQEAKICNkZWZpbmUgUEFMTVRYX1BIWVNfRkxBU0hfU1RBUlQJUFhBX0NTMF9QSFlTCS8qIENoaXBTZWxlY3QgMCAqLwogI2RlZmluZSBQQUxNVFhfUEhZU19OQU5EX1NUQVJUCVBYQV9DUzFfUEhZUwkvKiBDaGlwU2VsZWN0IDEgKi8KIAorI2RlZmluZSBQQUxNVFhfTkFORF9BTEVfUEhZUwkoUEFMTVRYX1BIWVNfTkFORF9TVEFSVCB8ICgxIDw8IDI0KSkKKyNkZWZpbmUgUEFMTVRYX05BTkRfQ0xFX1BIWVMJKFBBTE1UWF9QSFlTX05BTkRfU1RBUlQgfCAoMSA8PCAyNSkpCisjZGVmaW5lIFBBTE1UWF9OQU5EX0FMRV9WSVJUCTB4ZmYxMDAwMDAKKyNkZWZpbmUgUEFMTVRYX05BTkRfQ0xFX1ZJUlQJMHhmZjIwMDAwMAorCiAvKiBUT1VDSFNDUkVFTiAqLwogI2RlZmluZSBBQzk3X0xJTktfRlJBTUUJCQkyMQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhM3h4LXJlZ3MuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCmluZGV4IDdkMWEwNTkuLmU5MWQ2M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCkBAIC0yMDgsNyArMjA4LDcgQEAKICNkZWZpbmUgQ0tFTl9NVkVECTQzCS8qIDwgTVZFRCBjbG9jayBlbmFibGUgKi8KIAogLyogTm90ZTogR0NVIGNsb2NrIGVuYWJsZSBiaXQgZGlmZmVycyBvbiBQWEEzMDAvUFhBMzEwIGFuZCBQWEEzMjAgKi8KLSNkZWZpbmUgUFhBMzAwX0NLRU5fR1JBUEhJQ1MJNDIJLyogR3JhcGhpY3MgY29udHJvbGxlciBjbG9jayBlbmFibGUgKi8KLSNkZWZpbmUgUFhBMzIwX0NLRU5fR1JBUEhJQ1MJNwkvKiBHcmFwaGljcyBjb250cm9sbGVyIGNsb2NrIGVuYWJsZSAqLworI2RlZmluZSBDS0VOX1BYQTMwMF9HQ1UJCTQyCS8qIEdyYXBoaWNzIGNvbnRyb2xsZXIgY2xvY2sgZW5hYmxlICovCisjZGVmaW5lIENLRU5fUFhBMzIwX0dDVQkJNwkvKiBHcmFwaGljcyBjb250cm9sbGVyIGNsb2NrIGVuYWJsZSAqLwogCiAjZW5kaWYgLyogX19BU01fQVJDSF9QWEEzWFhfUkVHU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhZmIuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGFmYi5oCmluZGV4IDY5MzI3MjAuLmY3MzA2MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGFmYi5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGFmYi5oCkBAIC0xMTgsNyArMTE4LDggQEAKIAl1X2ludAkJZml4ZWRfbW9kZXM6MSwKIAkJCWNtYXBfaW52ZXJzZToxLAogCQkJY21hcF9zdGF0aWM6MSwKLQkJCXVudXNlZDoyOTsKKwkJCWFjY2VsZXJhdGlvbl9lbmFibGVkOjEsCisJCQl1bnVzZWQ6Mjg7CiAKIAkvKiBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBkZWZpbmVkIGluIExDQ1IwCiAJICogICAgICBMQ0NSMF9BY3Qgb3IgTENDUjBfUGFzICAgICAgICAgIEFjdGl2ZSBvciBQYXNzaXZlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy1pbnRjLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy1pbnRjLmgKaW5kZXggYWQyM2U3NC4uNjg0NjRjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3JlZ3MtaW50Yy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9yZWdzLWludGMuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBJQ0ZQCQlfX1JFRygweDQwRDAwMDBDKSAgLyogSW50ZXJydXB0IENvbnRyb2xsZXIgRklRIFBlbmRpbmcgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSUNQUgkJX19SRUcoMHg0MEQwMDAxMCkgIC8qIEludGVycnVwdCBDb250cm9sbGVyIFBlbmRpbmcgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSUNDUgkJX19SRUcoMHg0MEQwMDAxNCkgIC8qIEludGVycnVwdCBDb250cm9sbGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUNIUAkJX19SRUcoMHg0MEQwMDAxOCkgIC8qIEludGVycnVwdCBDb250cm9sbGVyIEhpZ2hlc3QgUHJpb3JpdHkgUmVnaXN0ZXIgKi8KIAogI2RlZmluZSBJQ0lQMgkJX19SRUcoMHg0MEQwMDA5QykgIC8qIEludGVycnVwdCBDb250cm9sbGVyIElSUSBQZW5kaW5nIFJlZ2lzdGVyIDIgKi8KICNkZWZpbmUgSUNNUjIJCV9fUkVHKDB4NDBEMDAwQTApICAvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciBNYXNrIFJlZ2lzdGVyIDIgKi8KQEAgLTIwLDQgKzIxLDE0IEBACiAjZGVmaW5lIElDRlAyCQlfX1JFRygweDQwRDAwMEE4KSAgLyogSW50ZXJydXB0IENvbnRyb2xsZXIgRklRIFBlbmRpbmcgUmVnaXN0ZXIgMiAqLwogI2RlZmluZSBJQ1BSMgkJX19SRUcoMHg0MEQwMDBBQykgIC8qIEludGVycnVwdCBDb250cm9sbGVyIFBlbmRpbmcgUmVnaXN0ZXIgMiAqLwogCisjZGVmaW5lIElDSVAzCQlfX1JFRygweDQwRDAwMTMwKSAgLyogSW50ZXJydXB0IENvbnRyb2xsZXIgSVJRIFBlbmRpbmcgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBJQ01SMwkJX19SRUcoMHg0MEQwMDEzNCkgIC8qIEludGVycnVwdCBDb250cm9sbGVyIE1hc2sgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBJQ0xSMwkJX19SRUcoMHg0MEQwMDEzOCkgIC8qIEludGVycnVwdCBDb250cm9sbGVyIExldmVsIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgSUNGUDMJCV9fUkVHKDB4NDBEMDAxM0MpICAvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciBGSVEgUGVuZGluZyBSZWdpc3RlciAzICovCisjZGVmaW5lIElDUFIzCQlfX1JFRygweDQwRDAwMTQwKSAgLyogSW50ZXJydXB0IENvbnRyb2xsZXIgUGVuZGluZyBSZWdpc3RlciAzICovCisKKyNkZWZpbmUgSVBSKHgpCQlfX1JFRygweDQwRDAwMDFDICsgKHggPCAzMiA/ICh4IDw8IDIpCQlcCisJCQkJOiAoeCA8IDY0ID8gKDB4OTQgKyAoKHggLSAzMikgPDwgMikpCVwKKwkJCQk6ICgweDEyOCArICgoeCAtIDY0KSA8PCAyKSkpKSkKKwogI2VuZGlmIC8qIF9fQVNNX01BQ0hfUkVHU19JTlRDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IGI1NDc0OTQuLjIzNzczNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtMzcsNyArMzcsNyBAQAogewogCWlmIChtYWNoaW5lX2lzX2xpdHRsZXRvbigpIHx8IG1hY2hpbmVfaXNfaW50ZWxtb3RlMigpCiAJICAgIHx8IG1hY2hpbmVfaXNfY3NiNzI2KCkgfHwgbWFjaGluZV9pc19zdGFyZ2F0ZTIoKQotCSAgICB8fCBtYWNoaW5lX2lzX2NtX3gzMDAoKSkKKwkgICAgfHwgbWFjaGluZV9pc19jbV94MzAwKCkgfHwgbWFjaGluZV9pc19iYWxsb29uMygpKQogCQlVQVJUID0gU1RVQVJUOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCmluZGV4IGY2ZTAzMDAuLmQ2OTRjZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogdm9pZCBfX2luaXQgcHhhX2luaXRfaXJxKGludCBpcnFfbnIsIHNldF93YWtlX3QgZm4pCiB7Ci0JaW50IGlycTsKKwlpbnQgaXJxLCBpOwogCiAJcHhhX2ludGVybmFsX2lycV9uciA9IGlycV9ucjsKIApAQCAtMTI5LDYgKzEyOSwxMiBAQAogCQlfSUNMUihpcnEpID0gMDsJLyogYWxsIElSUXMgYXJlIElSUSwgbm90IEZJUSAqLwogCX0KIAorCS8qIGluaXRpYWxpemUgaW50ZXJydXB0IHByaW9yaXR5ICovCisJaWYgKGNwdV9pc19weGEyN3goKSB8fCBjcHVfaXNfcHhhM3h4KCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGlycV9ucjsgaSsrKQorCQkJSVBSKGkpID0gaSB8ICgxIDw8IDMxKTsKKwl9CisKIAkvKiBvbmx5IHVubWFza2VkIGludGVycnVwdHMga2ljayB1cyBvdXQgb2YgaWRsZSAqLwogCUlDQ1IgPSAxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9saXR0bGV0b24uYyBiL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCmluZGV4IDU1YjM3ODguLjEzODQ4OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCkBAIC0yNjUsNDUgKzI2NSwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NTUNfUFhBKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfUFhBX01PRFVMRSkKLXN0YXRpYyBpbnQgbGl0dGxldG9uX21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIGlycV9oYW5kbGVyX3QgbGl0dGxldG9uX2RldGVjdF9pbnQsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGVyciwgZ3Bpb19jZCA9IEdQSU9fTU1DMV9DQVJEX0RFVEVDVDsKLQotCWVyciA9IGdwaW9fcmVxdWVzdChncGlvX2NkLCAibW1jIGNhcmQgZGV0ZWN0Iik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcmVxdWVzdF9jZDsKLQotCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW9fY2QpOwotCi0JZXJyID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoZ3Bpb19jZCksIGxpdHRsZXRvbl9kZXRlY3RfaW50LAotCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCi0JCQkgICJtbWMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgY2FyZCBkZXRlY3QgSVJRXG4iKTsKLQkJZ290byBlcnJfcmVxdWVzdF9pcnE7Ci0JfQotCXJldHVybiAwOwotCi1lcnJfcmVxdWVzdF9pcnE6Ci0JZ3Bpb19mcmVlKGdwaW9fY2QpOwotZXJyX3JlcXVlc3RfY2Q6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgbGl0dGxldG9uX21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgZ3Bpb19jZCA9IEdQSU9fTU1DMV9DQVJEX0RFVEVDVDsKLQotCWZyZWVfaXJxKGdwaW9fdG9faXJxKGdwaW9fY2QpLCBkYXRhKTsKLQlncGlvX2ZyZWUoZ3Bpb19jZCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgbGl0dGxldG9uX21jaV9wbGF0Zm9ybV9kYXRhID0gewotCS5kZXRlY3RfZGVsYXkJPSAyMCwKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKLQkuaW5pdCAJCT0gbGl0dGxldG9uX21jaV9pbml0LAotCS5leGl0CQk9IGxpdHRsZXRvbl9tY2lfZXhpdCwKKwkuZGV0ZWN0X2RlbGF5CQk9IDIwLAorCS5vY3JfbWFzawkJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKKwkuZ3Bpb19jYXJkX2RldGVjdAk9IEdQSU9fTU1DMV9DQVJEX0RFVEVDVCwKKwkuZ3Bpb19jYXJkX3JvCQk9IC0xLAorCS5ncGlvX3Bvd2VyCQk9IC0xLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGxpdHRsZXRvbl9pbml0X21tYyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCmluZGV4IGYwNGM4MzMuLmM2YTk0ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKQEAgLTQ4MiwxMSArNDgyLDE0IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgbHViYm9ja19tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCi0JLmRldGVjdF9kZWxheQk9IDEsCi0JLmluaXQgCQk9IGx1YmJvY2tfbWNpX2luaXQsCi0JLmdldF9ybwkJPSBsdWJib2NrX21jaV9nZXRfcm8sCi0JLmV4aXQgCQk9IGx1YmJvY2tfbWNpX2V4aXQsCisJLm9jcl9tYXNrCQk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuZGV0ZWN0X2RlbGF5CQk9IDEsCisJLmluaXQgCQkJPSBsdWJib2NrX21jaV9pbml0LAorCS5nZXRfcm8JCQk9IGx1YmJvY2tfbWNpX2dldF9ybywKKwkuZXhpdCAJCQk9IGx1YmJvY2tfbWNpX2V4aXQsCisJLmdwaW9fY2FyZF9kZXRlY3QJPSAtMSwKKwkuZ3Bpb19jYXJkX3JvCQk9IC0xLAorCS5ncGlvX3Bvd2VyCQk9IC0xLAogfTsKIAogc3RhdGljIHZvaWQgbHViYm9ja19pcmRhX3RyYW5zY2VpdmVyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSkKQEAgLTUwNCw4ICs1MDcsOSBAQAogfQogCiBzdGF0aWMgc3RydWN0IHB4YWZpY3BfcGxhdGZvcm1fZGF0YSBsdWJib2NrX2ZpY3BfcGxhdGZvcm1fZGF0YSA9IHsKLQkudHJhbnNjZWl2ZXJfY2FwICA9IElSX1NJUk1PREUgfCBJUl9GSVJNT0RFLAotCS50cmFuc2NlaXZlcl9tb2RlID0gbHViYm9ja19pcmRhX3RyYW5zY2VpdmVyX21vZGUsCisJLmdwaW9fcHdkb3duCQk9IC0xLAorCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfRklSTU9ERSwKKwkudHJhbnNjZWl2ZXJfbW9kZQk9IGx1YmJvY2tfaXJkYV90cmFuc2NlaXZlcl9tb2RlLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGx1YmJvY2tfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYyBiL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKaW5kZXggY2EzOTY2OS4uNTM2MGMwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCkBAIC0xNDAsMTUgKzE0MCw5IEBACiAgKiBJUkRBCiAgKi8KIAotc3RhdGljIHZvaWQgbWFnaWNpYW5faXJkYV90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJTzgzX01BR0lDSUFOX25JUl9FTiwgbW9kZSAmIElSX09GRik7Ci0JcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoZGV2LCBtb2RlKTsKLX0KLQogc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgbWFnaWNpYW5fZmljcF9pbmZvID0gewotCS50cmFuc2NlaXZlcl9jYXAgID0gSVJfU0lSTU9ERSB8IElSX09GRiwKLQkudHJhbnNjZWl2ZXJfbW9kZSA9IG1hZ2ljaWFuX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkuZ3Bpb19wd2Rvd24JCT0gR1BJTzgzX01BR0lDSUFOX25JUl9FTiwKKwkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX09GRiwKIH07CiAKIC8qCkBAIC02NTEsNTUgKzY0NSwyNCBAQAogc3RhdGljIGludCBtYWdpY2lhbl9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJaXJxX2hhbmRsZXJfdCBkZXRlY3RfaXJxLCB2b2lkICpkYXRhKQogewotCWludCBlcnI7Ci0KLQllcnIgPSByZXF1ZXN0X2lycShJUlFfTUFHSUNJQU5fU0QsIGRldGVjdF9pcnEsCisJcmV0dXJuIHJlcXVlc3RfaXJxKElSUV9NQUdJQ0lBTl9TRCwgZGV0ZWN0X2lycSwKIAkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAotCQkJCSJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKLQllcnIgPSBncGlvX3JlcXVlc3QoRUdQSU9fTUFHSUNJQU5fU0RfUE9XRVIsICJTRF9QT1dFUiIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlcXVlc3RfcG93ZXI7Ci0JZXJyID0gZ3Bpb19yZXF1ZXN0KEVHUElPX01BR0lDSUFOX25TRF9SRUFET05MWSwgIm5TRF9SRUFET05MWSIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlcXVlc3RfcmVhZG9ubHk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3JlcXVlc3RfcmVhZG9ubHk6Ci0JZ3Bpb19mcmVlKEVHUElPX01BR0lDSUFOX1NEX1BPV0VSKTsKLWVycl9yZXF1ZXN0X3Bvd2VyOgotCWZyZWVfaXJxKElSUV9NQUdJQ0lBTl9TRCwgZGF0YSk7Ci1lcnJfcmVxdWVzdF9pcnE6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgbWFnaWNpYW5fbWNpX3NldHBvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZkZCkKLXsKLQlzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCi0JZ3Bpb19zZXRfdmFsdWUoRUdQSU9fTUFHSUNJQU5fU0RfUE9XRVIsICgxIDw8IHZkZCkgJiBwZGF0YS0+b2NyX21hc2spOwotfQotCi1zdGF0aWMgaW50IG1hZ2ljaWFuX21jaV9nZXRfcm8oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiAoIWdwaW9fZ2V0X3ZhbHVlKEVHUElPX01BR0lDSUFOX25TRF9SRUFET05MWSkpOworCQkJCSJtbWMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKIH0KIAogc3RhdGljIHZvaWQgbWFnaWNpYW5fbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCWdwaW9fZnJlZShFR1BJT19NQUdJQ0lBTl9uU0RfUkVBRE9OTFkpOwotCWdwaW9fZnJlZShFR1BJT19NQUdJQ0lBTl9TRF9QT1dFUik7CiAJZnJlZV9pcnEoSVJRX01BR0lDSUFOX1NELCBkYXRhKTsKIH0KIAogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBtYWdpY2lhbl9tY2lfaW5mbyA9IHsKLQkub2NyX21hc2sgPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCi0JLmluaXQgICAgID0gbWFnaWNpYW5fbWNpX2luaXQsCi0JLmdldF9ybyAgID0gbWFnaWNpYW5fbWNpX2dldF9ybywKLQkuc2V0cG93ZXIgPSBtYWdpY2lhbl9tY2lfc2V0cG93ZXIsCi0JLmV4aXQgICAgID0gbWFnaWNpYW5fbWNpX2V4aXQsCisJLm9jcl9tYXNrIAkJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLmluaXQgICAgIAkJPSBtYWdpY2lhbl9tY2lfaW5pdCwKKwkuZXhpdCAgICAgCQk9IG1hZ2ljaWFuX21jaV9leGl0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gLTEsCisJLmdwaW9fY2FyZF9ybwkJPSBFR1BJT19NQUdJQ0lBTl9uU0RfUkVBRE9OTFksCisJLmdwaW9fY2FyZF9yb19pbnZlcnQJPSAxLAorCS5ncGlvX3Bvd2VyCQk9IEVHUElPX01BR0lDSUFOX1NEX1BPV0VSLAogfTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCmluZGV4IGY0ZGFiZjAuLmE0ZWVhZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCkBAIC00NTAsMTAgKzQ1MCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIG1haW5zdG9uZV9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCi0JLmluaXQgCQk9IG1haW5zdG9uZV9tY2lfaW5pdCwKLQkuc2V0cG93ZXIgCT0gbWFpbnN0b25lX21jaV9zZXRwb3dlciwKLQkuZXhpdAkJPSBtYWluc3RvbmVfbWNpX2V4aXQsCisJLm9jcl9tYXNrCQk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuaW5pdCAJCQk9IG1haW5zdG9uZV9tY2lfaW5pdCwKKwkuc2V0cG93ZXIgCQk9IG1haW5zdG9uZV9tY2lfc2V0cG93ZXIsCisJLmV4aXQJCQk9IG1haW5zdG9uZV9tY2lfZXhpdCwKKwkuZ3Bpb19jYXJkX2RldGVjdAk9IC0xLAorCS5ncGlvX2NhcmRfcm8JCT0gLTEsCisJLmdwaW9fcG93ZXIJCT0gLTEsCiB9OwogCiBzdGF0aWMgdm9pZCBtYWluc3RvbmVfaXJkYV90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCkBAIC00NzYsOCArNDc5LDkgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgbWFpbnN0b25lX2ZpY3BfcGxhdGZvcm1fZGF0YSA9IHsKLQkudHJhbnNjZWl2ZXJfY2FwICA9IElSX1NJUk1PREUgfCBJUl9GSVJNT0RFIHwgSVJfT0ZGLAotCS50cmFuc2NlaXZlcl9tb2RlID0gbWFpbnN0b25lX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkuZ3Bpb19wd2Rvd24JCT0gLTEsCisJLnRyYW5zY2VpdmVyX2NhcAk9IElSX1NJUk1PREUgfCBJUl9GSVJNT0RFIHwgSVJfT0ZGLAorCS50cmFuc2NlaXZlcl9tb2RlCT0gbWFpbnN0b25lX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBncGlvX2tleXNfYnV0dG9uW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMKaW5kZXggMmQyODEzMi4uM2NhYjQ1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYwpAQCAtNDM0LDcyICs0MzQsMTUgQEAKIC8qCiAgKiBTRElPL01NQyBDYXJkIGNvbnRyb2xsZXIKICAqLwotc3RhdGljIHZvaWQgbWNpX3NldHBvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZkZCkKLXsKLQlzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgKnBfZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQotCWlmICgoMSA8PCB2ZGQpICYgcF9kLT5vY3JfbWFzaykKLQkJZ3Bpb19zZXRfdmFsdWUoR1BJTzkxX1NESU9fRU4sIDEpOwkvKiBlbmFibGUgU0RJTyBwb3dlciAqLwotCWVsc2UKLQkJZ3Bpb19zZXRfdmFsdWUoR1BJTzkxX1NESU9fRU4sIDApOwkvKiBkaXNhYmxlIFNESU8gcG93ZXIgKi8KLX0KLQotc3RhdGljIGludCBtY2lfZ2V0X3JvKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoR1BJTzc4X1NESU9fUk8pOwotfQotCi1zdHJ1Y3QgZ3Bpb19yZXNzIG1jaV9ncGlvc1tdID0gewotCU1JT19HUElPX0lOKEdQSU83OF9TRElPX1JPLCAJIlNESU8gcmVhZG9ubHkgZGV0ZWN0IiksCi0JTUlPX0dQSU9fSU4oR1BJTzE1X1NESU9fSU5TRVJULAkiU0RJTyBpbnNlcnRpb24gZGV0ZWN0IiksCi0JTUlPX0dQSU9fT1VUKEdQSU85MV9TRElPX0VOLCAwLAkiU0RJTyBwb3dlciBlbmFibGUiKQotfTsKLQotc3RhdGljIHZvaWQgbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCW1pb19ncGlvX2ZyZWUoQVJSQVlfQU5EX1NJWkUobWNpX2dwaW9zKSk7Ci0JZnJlZV9pcnEoZ3Bpb190b19pcnEoR1BJTzE1X1NESU9fSU5TRVJUKSwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgbWlvYTcwMV9tY2lfaW5mbzsKLQogLyoqCiAgKiBUaGUgY2FyZCBkZXRlY3QgaW50ZXJydXB0IGlzbid0IGRlYm91bmNlZCBzbyB3ZSBkZWxheSBpdCBieSAyNTBtcwogICogdG8gZ2l2ZSB0aGUgY2FyZCBhIGNoYW5jZSB0byBmdWxseSBpbnNlcnQvZWplY3QuCiAgKi8KLXN0YXRpYyBpbnQgbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFfaGFuZGxlcl90IGRldGVjdF9pbnQsIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJjOwotCWludCBpcnEgPSBncGlvX3RvX2lycShHUElPMTVfU0RJT19JTlNFUlQpOwotCi0JcmMgPSBtaW9fZ3Bpb19yZXF1ZXN0KEFSUkFZX0FORF9TSVpFKG1jaV9ncGlvcykpOwotCWlmIChyYykKLQkJZ290byBlcnJfZ3BpbzsKLQkvKiBlbmFibGUgUkUvRkUgaW50ZXJydXB0IG9uIGNhcmQgaW5zZXJ0aW9uIGFuZCByZW1vdmFsICovCi0JcmMgPSByZXF1ZXN0X2lycShpcnEsIGRldGVjdF9pbnQsCi0JCQkgSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9SSVNJTkcgfAotCQkJIElSUUZfVFJJR0dFUl9GQUxMSU5HLAotCQkJICJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyX2lycTsKLQotCW1pb2E3MDFfbWNpX2luZm8uZGV0ZWN0X2RlbGF5ID0gbXNlY3NfdG9famlmZmllcygyNTApOwotCXJldHVybiAwOwotCi1lcnJfaXJxOgotCWRldl9lcnIoZGV2LCAibWlvYTcwMV9tY2lfaW5pdDogTU1DL1NEOiIKLQkJIiBjYW4ndCByZXF1ZXN0IE1NQyBjYXJkIGRldGVjdCBJUlFcbiIpOwotCW1pb19ncGlvX2ZyZWUoQVJSQVlfQU5EX1NJWkUobWNpX2dwaW9zKSk7Ci1lcnJfZ3BpbzoKLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgbWlvYTcwMV9tY2lfaW5mbyA9IHsKLQkub2NyX21hc2sgPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKLQkuaW5pdAkgID0gbWNpX2luaXQsCi0JLmdldF9ybwkgID0gbWNpX2dldF9ybywKLQkuc2V0cG93ZXIgPSBtY2lfc2V0cG93ZXIsCi0JLmV4aXQJICA9IG1jaV9leGl0LAorCS5vY3JfbWFzayAJCT0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQsCisJLmdwaW9fY2FyZF9kZXRlY3QJPSBHUElPMTVfU0RJT19JTlNFUlQsCisJLmdwaW9fY2FyZF9ybwkJPSBHUElPNzhfU0RJT19STywKKwkuZ3Bpb19wb3dlcgkJPSBHUElPOTFfU0RJT19FTiwKIH07CiAKIC8qIEZsYXNoUkFNICovCkBAIC03NjUsMTkgKzcwOCwyMCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfbGluayBpY2xpbmsgPSB7Ci0JLmJ1c19pZAk9IDAsIC8qIE11c3QgbWF0Y2ggaWQgaW4gcHhhMjd4X2RldmljZV9jYW1lcmEgaW4gZGV2aWNlLmMgKi8KLX07Ci0KIC8qIEJvYXJkIEkyQyBkZXZpY2VzLiAqLwogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIG1pb2E3MDFfaTJjX2RldmljZXNbXSA9IHsKIAl7Ci0JCS8qIE11c3QgaW5pdGlhbGl6ZSBiZWZvcmUgdGhlIGNhbWVyYShzKSAqLwogCQlJMkNfQk9BUkRfSU5GTygibXQ5bTExMSIsIDB4NWQpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZpY2xpbmssCiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rIGljbGluayA9IHsKKwkuYnVzX2lkCQk9IDAsIC8qIE1hdGNoIGlkIGluIHB4YTI3eF9kZXZpY2VfY2FtZXJhIGluIGRldmljZS5jICovCisJLmJvYXJkX2luZm8JPSAmbWlvYTcwMV9pMmNfZGV2aWNlc1swXSwKKwkuaTJjX2FkYXB0ZXJfaWQJPSAwLAorCS5tb2R1bGVfbmFtZQk9ICJtdDltMTExIiwKK307CisKIHN0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgaTJjX3BkYXRhID0gewogCS5mYXN0X21vZGUgPSAxLAogfTsKQEAgLTgxMSw2ICs3NTUsNyBAQAogTUlPX1NJTVBMRV9ERVYobWlvYTcwMV9zb3VuZCwJICAibWlvYTcwMS13bTk3MTMiLCBOVUxMKQogTUlPX1NJTVBMRV9ERVYobWlvYTcwMV9ib2FyZCwJICAibWlvYTcwMS1ib2FyZCIsICBOVUxMKQogTUlPX1NJTVBMRV9ERVYoZ3Bpb192YnVzLAkgICJncGlvLXZidXMiLCAgICAgICZncGlvX3ZidXNfZGF0YSk7CitNSU9fU0lNUExFX0RFVihtaW9hNzAxX2NhbWVyYSwJICAic29jLWNhbWVyYS1wZHJ2IiwmaWNsaW5rKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZtaW9hNzAxX2dwaW9fa2V5cywKQEAgLTgyMSw2ICs3NjYsNyBAQAogCSZwb3dlcl9kZXYsCiAJJnN0cmF0YWZsYXNoLAogCSZncGlvX3ZidXMsCisJJm1pb2E3MDFfY2FtZXJhLAogCSZtaW9hNzAxX2JvYXJkLAogfTsKIApAQCAtODQxLDcgKzc4Nyw3IEBACiBzdGF0aWMgc3RydWN0IGdwaW9fcmVzcyBnbG9iYWxfZ3Bpb3NbXSA9IHsKIAlNSU9fR1BJT19PVVQoR1BJTzlfQ0hBUkdFX0VOLCAxLCAiQ2hhcmdlciBlbmFibGUiKSwKIAlNSU9fR1BJT19PVVQoR1BJTzE4X1BPV0VST0ZGLCAwLCAiUG93ZXIgT2ZmIiksCi0JTUlPX0dQSU9fT1VUKEdQSU84N19MQ0RfUE9XRVIsIDAsICJMQ0QgUG93ZXIiKQorCU1JT19HUElPX09VVChHUElPODdfTENEX1BPV0VSLCAwLCAiTENEIFBvd2VyIiksCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgbWlvYTcwMV9tYWNoaW5lX2luaXQodm9pZCkKQEAgLTg1NSw2ICs4MDEsNyBAQAogCW1pb19ncGlvX3JlcXVlc3QoQVJSQVlfQU5EX1NJWkUoZ2xvYmFsX2dwaW9zKSk7CiAJYm9vdHN0cmFwX2luaXQoKTsKIAlzZXRfcHhhX2ZiX2luZm8oJm1pb2E3MDFfcHhhZmJfaW5mbyk7CisJbWlvYTcwMV9tY2lfaW5mby5kZXRlY3RfZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDI1MCk7CiAJcHhhX3NldF9tY2lfaW5mbygmbWlvYTcwMV9tY2lfaW5mbyk7CiAJcHhhX3NldF9rZXlwYWRfaW5mbygmbWlvYTcwMV9rZXlwYWRfaW5mbyk7CiAJd205N3h4X2JhdF9zZXRfcGRhdGEoJm1pb2E3MDFfYmF0dGVyeV9kYXRhKTsKQEAgLTg2OSw3ICs4MTYsNiBAQAogCXB4YV9zZXRfaTJjX2luZm8oJmkyY19wZGF0YSk7CiAJcHhhMjd4X3NldF9pMmNfcG93ZXJfaW5mbyhOVUxMKTsKIAlweGFfc2V0X2NhbWVyYV9pbmZvKCZtaW9hNzAxX3B4YWNhbWVyYV9wbGF0Zm9ybV9kYXRhKTsKLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBBUlJBWV9BTkRfU0laRShtaW9hNzAxX2kyY19kZXZpY2VzKSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1pb2E3MDFfbWFjaGluZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG1sZC5jCmluZGV4IDE2OWZjYzEuLjFhZDAyOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG1sZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG1sZC5jCkBAIC0yNSw2ICsyNSw5IEBACiAjaW5jbHVkZSA8bGludXgvd205N3h4X2JhdHQuaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0xNDEsODUgKzE0NCw1MCBAQAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9SIEZsYXNoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhbG1sZF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZQkJPSAiRmxhc2giLAorCQkub2Zmc2V0CQk9IDB4MDAwMDAwMDAsCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5tYXNrX2ZsYWdzCT0gMAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHBhbG1sZF9mbGFzaF9kYXRhW10gPSB7CisJeworCQkud2lkdGgJCT0gMiwJCQkvKiBiYW5rd2lkdGggaW4gYnl0ZXMgKi8KKwkJLnBhcnRzCQk9IHBhbG1sZF9wYXJ0aXRpb25zLAorCQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKHBhbG1sZF9wYXJ0aXRpb25zKQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGFsbWxkX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAk9IFBYQV9DUzBfUEhZUywKKwkuZW5kCT0gUFhBX0NTMF9QSFlTICsgU1pfNE0gLSAxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGFsbWxkX2ZsYXNoID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gMCwKKwkucmVzb3VyY2UJPSAmcGFsbWxkX2ZsYXNoX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkuZGV2IAkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gcGFsbWxkX2ZsYXNoX2RhdGEsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNEL01NQyBjYXJkIGNvbnRyb2xsZXIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHBhbG1sZF9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgcGFsbWxkX2RldGVjdF9pbnQsCi0JCQkJdm9pZCAqZGF0YSkKLXsKLQlpbnQgZXJyID0gMDsKLQotCS8qIFNldHVwIGFuIGludGVycnVwdCBmb3IgZGV0ZWN0aW5nIGNhcmQgaW5zZXJ0L3JlbW92ZSBldmVudHMgKi8KLQllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNTERfU0RfREVURUNUX04sICJTRCBJUlEiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjsKLQllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX05SX1BBTE1MRF9TRF9ERVRFQ1RfTik7Ci0JaWYgKGVycikKLQkJZ290byBlcnIyOwotCWVyciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKEdQSU9fTlJfUEFMTUxEX1NEX0RFVEVDVF9OKSwKLQkJCXBhbG1sZF9kZXRlY3RfaW50LCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TQU1QTEVfUkFORE9NIHwKLQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJCSJTRC9NTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCByZXF1ZXN0IFNEL01NQyBjYXJkIGRldGVjdCBJUlFcbiIsCi0JCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjI7Ci0JfQotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTUxEX1NEX1BPV0VSLCAiU0RfUE9XRVIiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjM7Ci0JZXJyID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTlJfUEFMTUxEX1NEX1BPV0VSLCAwKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjQ7Ci0KLQllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNTERfU0RfUkVBRE9OTFksICJTRF9SRUFET05MWSIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyNDsKLQllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX05SX1BBTE1MRF9TRF9SRUFET05MWSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnI1OwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpcnEgcmVnaXN0ZXJlZFxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIDA7Ci0KLWVycjU6Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTUxEX1NEX1JFQURPTkxZKTsKLWVycjQ6Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTUxEX1NEX1BPV0VSKTsKLWVycjM6Ci0JZnJlZV9pcnEoZ3Bpb190b19pcnEoR1BJT19OUl9QQUxNTERfU0RfREVURUNUX04pLCBkYXRhKTsKLWVycjI6Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTUxEX1NEX0RFVEVDVF9OKTsKLWVycjoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtbGRfbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCWdwaW9fZnJlZShHUElPX05SX1BBTE1MRF9TRF9SRUFET05MWSk7Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTUxEX1NEX1BPV0VSKTsKLQlmcmVlX2lycShncGlvX3RvX2lycShHUElPX05SX1BBTE1MRF9TRF9ERVRFQ1RfTiksIGRhdGEpOwotCWdwaW9fZnJlZShHUElPX05SX1BBTE1MRF9TRF9ERVRFQ1RfTik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG1sZF9tY2lfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdmRkKQotewotCXN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSAqcF9kID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTUxEX1NEX1BPV0VSLCBwX2QtPm9jcl9tYXNrICYgKDEgPDwgdmRkKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFsbWxkX21jaV9nZXRfcm8oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBncGlvX2dldF92YWx1ZShHUElPX05SX1BBTE1MRF9TRF9SRUFET05MWSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgcGFsbWxkX21jaV9wbGF0Zm9ybV9kYXRhID0gewotCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAotCS5zZXRwb3dlcgk9IHBhbG1sZF9tY2lfcG93ZXIsCi0JLmdldF9ybwkJPSBwYWxtbGRfbWNpX2dldF9ybywKLQkuaW5pdCAJCT0gcGFsbWxkX21jaV9pbml0LAotCS5leGl0CQk9IHBhbG1sZF9tY2lfZXhpdCwKKwkub2NyX21hc2sJCT0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQsCisJLmdwaW9fY2FyZF9kZXRlY3QJPSBHUElPX05SX1BBTE1MRF9TRF9ERVRFQ1RfTiwKKwkuZ3Bpb19jYXJkX3JvCQk9IEdQSU9fTlJfUEFMTUxEX1NEX1JFQURPTkxZLAorCS5ncGlvX3Bvd2VyCQk9IEdQSU9fTlJfUEFMTUxEX1NEX1BPV0VSLAorCS5kZXRlY3RfZGVsYXkJCT0gMjAsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzYsMzUgKzMwNCw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJckRBCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwYWxtbGRfaXJkYV9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgZXJyOwotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1MRF9JUl9ESVNBQkxFLCAiSVIgRElTQUJMRSIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwotCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1MRF9JUl9ESVNBQkxFLCAxKTsKLQlpZiAoZXJyKQotCQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNTERfSVJfRElTQUJMRSk7Ci1lcnI6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgcGFsbWxkX2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQotewotCWdwaW9fZnJlZShHUElPX05SX1BBTE1MRF9JUl9ESVNBQkxFKTsKLX0KLQotc3RhdGljIHZvaWQgcGFsbWxkX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQotewotCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTUxEX0lSX0RJU0FCTEUsIG1vZGUgJiBJUl9PRkYpOwotCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIHBhbG1sZF9maWNwX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLnN0YXJ0dXAJCT0gcGFsbWxkX2lyZGFfc3RhcnR1cCwKLQkuc2h1dGRvd24JCT0gcGFsbWxkX2lyZGFfc2h1dGRvd24sCi0JLnRyYW5zY2VpdmVyX2NhcAk9IElSX1NJUk1PREUgfCBJUl9GSVJNT0RFIHwgSVJfT0ZGLAotCS50cmFuc2NlaXZlcl9tb2RlCT0gcGFsbWxkX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkuZ3Bpb19wd2Rvd24JCT0gR1BJT19OUl9QQUxNTERfSVJfRElTQUJMRSwKKwkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX09GRiwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU2MCw2ICs1MDIsNyBAQAogCSZwb3dlcl9zdXBwbHksCiAJJnBhbG1sZF9hc29jLAogCSZwYWxtbGRfaGRkLAorCSZwYWxtbGRfZmxhc2gsCiB9OwogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHBhbG1sZF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10NS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXQ1LmMKaW5kZXggMzNmNzI2Zi4uMmRkN2NlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXQ1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXQ1LmMKQEAgLTEyNCw4MyArMTI0LDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBTRC9NTUMgY2FyZCBjb250cm9sbGVyCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwYWxtdDVfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFfaGFuZGxlcl90IHBhbG10NV9kZXRlY3RfaW50LAotCQkJCXZvaWQgKmRhdGEpCi17Ci0JaW50IGVyciA9IDA7Ci0KLQkvKiBTZXR1cCBhbiBpbnRlcnJ1cHQgZm9yIGRldGVjdGluZyBjYXJkIGluc2VydC9yZW1vdmUgZXZlbnRzICovCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVQ1X1NEX0RFVEVDVF9OLCAiU0QgSVJRIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnI7Ci0JZXJyID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJT19OUl9QQUxNVDVfU0RfREVURUNUX04pOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyMjsKLQllcnIgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShHUElPX05SX1BBTE1UNV9TRF9ERVRFQ1RfTiksCi0JCQlwYWxtdDVfZGV0ZWN0X2ludCwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0FNUExFX1JBTkRPTSB8Ci0JCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCi0JCQkiU0QvTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgcmVxdWVzdCBTRC9NTUMgY2FyZCBkZXRlY3QgSVJRXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJZ290byBlcnIyOwotCX0KLQotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1UNV9TRF9QT1dFUiwgIlNEX1BPV0VSIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnIzOwotCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1UNV9TRF9QT1dFUiwgMCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnI0OwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVQ1X1NEX1JFQURPTkxZLCAiU0RfUkVBRE9OTFkiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjQ7Ci0JZXJyID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJT19OUl9QQUxNVDVfU0RfUkVBRE9OTFkpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyNTsKLQotCXByaW50ayhLRVJOX0RFQlVHICIlczogaXJxIHJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotCi1lcnI1OgotCWdwaW9fZnJlZShHUElPX05SX1BBTE1UNV9TRF9SRUFET05MWSk7Ci1lcnI0OgotCWdwaW9fZnJlZShHUElPX05SX1BBTE1UNV9TRF9QT1dFUik7Ci1lcnIzOgotCWZyZWVfaXJxKGdwaW9fdG9faXJxKEdQSU9fTlJfUEFMTVQ1X1NEX0RFVEVDVF9OKSwgZGF0YSk7Ci1lcnIyOgotCWdwaW9fZnJlZShHUElPX05SX1BBTE1UNV9TRF9ERVRFQ1RfTik7Ci1lcnI6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgcGFsbXQ1X21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVDVfU0RfUkVBRE9OTFkpOwotCWdwaW9fZnJlZShHUElPX05SX1BBTE1UNV9TRF9QT1dFUik7Ci0JZnJlZV9pcnEoSVJRX0dQSU9fUEFMTVQ1X1NEX0RFVEVDVF9OLCBkYXRhKTsKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVDVfU0RfREVURUNUX04pOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtdDVfbWNpX3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZkZCkKLXsKLQlzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgKnBfZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1UNV9TRF9QT1dFUiwgcF9kLT5vY3JfbWFzayAmICgxIDw8IHZkZCkpOwotfQotCi1zdGF0aWMgaW50IHBhbG10NV9tY2lfZ2V0X3JvKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoR1BJT19OUl9QQUxNVDVfU0RfUkVBRE9OTFkpOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHBhbG10NV9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKLQkuc2V0cG93ZXIJPSBwYWxtdDVfbWNpX3Bvd2VyLAotCS5nZXRfcm8JCT0gcGFsbXQ1X21jaV9nZXRfcm8sCi0JLmluaXQgCQk9IHBhbG10NV9tY2lfaW5pdCwKLQkuZXhpdAkJPSBwYWxtdDVfbWNpX2V4aXQsCisJLm9jcl9tYXNrCQk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gR1BJT19OUl9QQUxNVDVfU0RfREVURUNUX04sCisJLmdwaW9fY2FyZF9ybwkJPSBHUElPX05SX1BBTE1UNV9TRF9SRUFET05MWSwKKwkuZ3Bpb19wb3dlcgkJPSBHUElPX05SX1BBTE1UNV9TRF9QT1dFUiwKKwkuZGV0ZWN0X2RlbGF5CQk9IDIwLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzE0LDM1ICsyNDMsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSXJEQQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcGFsbXQ1X2lyZGFfc3RhcnR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IGVycjsKLQllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNVDVfSVJfRElTQUJMRSwgIklSIERJU0FCTEUiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjsKLQllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNVDVfSVJfRElTQUJMRSwgMSk7Ci0JaWYgKGVycikKLQkJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVQ1X0lSX0RJU0FCTEUpOwotZXJyOgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG10NV9pcmRhX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVDVfSVJfRElTQUJMRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG10NV9pcmRhX3RyYW5zY2VpdmVyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSkKLXsKLQlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1UNV9JUl9ESVNBQkxFLCBtb2RlICYgSVJfT0ZGKTsKLQlweGEyeHhfdHJhbnNjZWl2ZXJfbW9kZShkZXYsIG1vZGUpOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YWZpY3BfcGxhdGZvcm1fZGF0YSBwYWxtdDVfZmljcF9wbGF0Zm9ybV9kYXRhID0gewotCS5zdGFydHVwCQk9IHBhbG10NV9pcmRhX3N0YXJ0dXAsCi0JLnNodXRkb3duCQk9IHBhbG10NV9pcmRhX3NodXRkb3duLAotCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfRklSTU9ERSB8IElSX09GRiwKLQkudHJhbnNjZWl2ZXJfbW9kZQk9IHBhbG10NV9pcmRhX3RyYW5zY2VpdmVyX21vZGUsCisJLmdwaW9fcHdkb3duCQk9IEdQSU9fTlJfUEFMTVQ1X0lSX0RJU0FCTEUsCisJLnRyYW5zY2VpdmVyX2NhcAk9IElSX1NJUk1PREUgfCBJUl9PRkYsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdGMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMmNjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdGMuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL3BhbG10Yy5jCisgKgorICogU3VwcG9ydCBmb3IgdGhlIFBhbG0gVHVuZ3N0ZW58QworICoKKyAqIEF1dGhvcjoJTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiB3b3JrIG9mOgorICoJCVBldHIgQmxhaGEgPHAzdDNAY2VudHJ1bS5jej4KKyAqCQlDaGV0YW4gUy4gS3VtYXIgPHNoaXZha3VtYXIuY2hldGFuQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CisjaW5jbHVkZSA8bGludXgvdWNiMTQwMC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KKyNpbmNsdWRlIDxtYWNoL3BhbG10Yy5oPgorI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgorI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI1eC5oPgorI2luY2x1ZGUgPG1hY2gvaXJkYS5oPgorI2luY2x1ZGUgPG1hY2gvdWRjLmg+CisjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGluIGNvbmZpZ3VyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtdGNfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyogTU1DICovCisJR1BJTzZfTU1DX0NMSywKKwlHUElPOF9NTUNfQ1MwLAorCUdQSU8xMl9HUElPLAkvKiBkZXRlY3QgKi8KKwlHUElPMzJfR1BJTywJLyogcG93ZXIgKi8KKwlHUElPNTRfR1BJTywJLyogci9vIHN3aXRjaCAqLworCisJLyogUENNQ0lBICovCisJR1BJTzUyX25QQ0VfMSwKKwlHUElPNTNfblBDRV8yLAorCUdQSU81MF9uUElPUiwKKwlHUElPNTFfblBJT1csCisJR1BJTzQ5X25QV0UsCisJR1BJTzQ4X25QT0UsCisJR1BJTzUyX25QQ0VfMSwKKwlHUElPNTNfblBDRV8yLAorCUdQSU81N19uSU9JUzE2LAorCUdQSU81Nl9uUFdBSVQsCisKKwkvKiBBQzk3ICovCisJR1BJTzI4X0FDOTdfQklUQ0xLLAorCUdQSU8yOV9BQzk3X1NEQVRBX0lOXzAsCisJR1BJTzMwX0FDOTdfU0RBVEFfT1VULAorCUdQSU8zMV9BQzk3X1NZTkMsCisKKwkvKiBJckRBICovCisJR1BJTzQ1X0dQSU8sCS8qIGlyIGRpc2FibGUgKi8KKwlHUElPNDZfRklDUF9SWEQsCisJR1BJTzQ3X0ZJQ1BfVFhELAorCisJLyogUFdNICovCisJR1BJTzE3X1BXTTFfT1VULAorCisJLyogVVNCICovCisJR1BJTzRfR1BJTywJLyogZGV0ZWN0ICovCisJR1BJTzM2X0dQSU8sCS8qIHB1bGx1cCAqLworCisJLyogTENEICovCisJR1BJTzU4X0xDRF9MRERfMCwKKwlHUElPNTlfTENEX0xERF8xLAorCUdQSU82MF9MQ0RfTEREXzIsCisJR1BJTzYxX0xDRF9MRERfMywKKwlHUElPNjJfTENEX0xERF80LAorCUdQSU82M19MQ0RfTEREXzUsCisJR1BJTzY0X0xDRF9MRERfNiwKKwlHUElPNjVfTENEX0xERF83LAorCUdQSU82Nl9MQ0RfTEREXzgsCisJR1BJTzY3X0xDRF9MRERfOSwKKwlHUElPNjhfTENEX0xERF8xMCwKKwlHUElPNjlfTENEX0xERF8xMSwKKwlHUElPNzBfTENEX0xERF8xMiwKKwlHUElPNzFfTENEX0xERF8xMywKKwlHUElPNzJfTENEX0xERF8xNCwKKwlHUElPNzNfTENEX0xERF8xNSwKKwlHUElPNzRfTENEX0ZDTEssCisJR1BJTzc1X0xDRF9MQ0xLLAorCUdQSU83Nl9MQ0RfUENMSywKKwlHUElPNzdfTENEX0JJQVMsCisKKwkvKiBNQVRSSVggS0VZUEFEICovCisJR1BJTzBfR1BJTyB8IFdBS0VVUF9PTl9FREdFX0JPVEgsCS8qIGluIDAgKi8KKwlHUElPOV9HUElPIHwgV0FLRVVQX09OX0VER0VfQk9USCwJLyogaW4gMSAqLworCUdQSU8xMF9HUElPIHwgV0FLRVVQX09OX0VER0VfQk9USCwJLyogaW4gMiAqLworCUdQSU8xMV9HUElPIHwgV0FLRVVQX09OX0VER0VfQk9USCwJLyogaW4gMyAqLworCUdQSU8xOF9HUElPIHwgTUZQX0xQTV9EUklWRV9MT1csCS8qIG91dCAwICovCisJR1BJTzE5X0dQSU8gfCBNRlBfTFBNX0RSSVZFX0xPVywJLyogb3V0IDEgKi8KKwlHUElPMjBfR1BJTyB8IE1GUF9MUE1fRFJJVkVfTE9XLAkvKiBvdXQgMiAqLworCUdQSU8yMV9HUElPIHwgTUZQX0xQTV9EUklWRV9MT1csCS8qIG91dCAzICovCisJR1BJTzIyX0dQSU8gfCBNRlBfTFBNX0RSSVZFX0xPVywJLyogb3V0IDQgKi8KKwlHUElPMjNfR1BJTyB8IE1GUF9MUE1fRFJJVkVfTE9XLAkvKiBvdXQgNSAqLworCUdQSU8yNF9HUElPIHwgTUZQX0xQTV9EUklWRV9MT1csCS8qIG91dCA2ICovCisJR1BJTzI1X0dQSU8gfCBNRlBfTFBNX0RSSVZFX0xPVywJLyogb3V0IDcgKi8KKwlHUElPMjZfR1BJTyB8IE1GUF9MUE1fRFJJVkVfTE9XLAkvKiBvdXQgOCAqLworCUdQSU8yN19HUElPIHwgTUZQX0xQTV9EUklWRV9MT1csCS8qIG91dCA5ICovCisJR1BJTzc5X0dQSU8gfCBNRlBfTFBNX0RSSVZFX0xPVywJLyogb3V0IDEwICovCisJR1BJTzgwX0dQSU8gfCBNRlBfTFBNX0RSSVZFX0xPVywJLyogb3V0IDExICovCisKKwkvKiBQWEEgR1BJTyBLRVlTICovCisJR1BJTzdfR1BJTyB8IFdBS0VVUF9PTl9FREdFX0JPVEgsCS8qIGhvdHN5bmMgYnV0dG9uIG9uIGNyYWRsZSAqLworCisJLyogTUlTQyAqLworCUdQSU8xX1JTVCwJLyogcmVzZXQgKi8KKwlHUElPMl9HUElPLAkvKiBlYXJwaG9uZSBkZXRlY3QgKi8KKwlHUElPMTZfR1BJTywJLyogYmFja2xpZ2h0IHN3aXRjaCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0QvTU1DIGNhcmQgY29udHJvbGxlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgcGFsbXRjX21jaV9wbGF0Zm9ybV9kYXRhID0geworCS5vY3JfbWFzawkJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKKwkuZ3Bpb19wb3dlcgkJPSBHUElPX05SX1BBTE1UQ19TRF9QT1dFUiwKKwkuZ3Bpb19jYXJkX3JvCQk9IEdQSU9fTlJfUEFMTVRDX1NEX1JFQURPTkxZLAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gR1BJT19OUl9QQUxNVENfU0RfREVURUNUX04sCisJLmRldGVjdF9kZWxheQkJPSAyMCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdQSU8ga2V5cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBwYWxtdGNfcHhhX2J1dHRvbnNbXSA9IHsKKwl7S0VZX0Y4LCBHUElPX05SX1BBTE1UQ19IT1RTWU5DX0JVVFRPTiwgMSwgIkhvdFN5bmMgQnV0dG9uIiwgRVZfS0VZLCAxfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgcGFsbXRjX3B4YV9rZXlzX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBwYWxtdGNfcHhhX2J1dHRvbnMsCisJLm5idXR0b25zCT0gQVJSQVlfU0laRShwYWxtdGNfcHhhX2J1dHRvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGFsbXRjX3B4YV9rZXlzID0geworCS5uYW1lCT0gImdwaW8ta2V5cyIsCisJLmlkCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcGFsbXRjX3B4YV9rZXlzX2RhdGEsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJhY2tsaWdodAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcGFsbXRjX2JhY2tsaWdodF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVRDX0JMX1BPV0VSLCAiQkwgUE9XRVIiKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNVENfQkxfUE9XRVIsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKworCXJldHVybiAwOworCitlcnIyOgorCWdwaW9fZnJlZShHUElPX05SX1BBTE1UQ19CTF9QT1dFUik7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYWxtdGNfYmFja2xpZ2h0X25vdGlmeShpbnQgYnJpZ2h0bmVzcykKK3sKKwkvKiBiYWNrbGlnaHQgaXMgb24gd2hlbiBHUElPMTYgQUYwIGlzIGhpZ2ggKi8KKwlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1UQ19CTF9QT1dFUiwgYnJpZ2h0bmVzcyk7CisJcmV0dXJuIGJyaWdodG5lc3M7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10Y19iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRDX0JMX1BPV0VSKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgcGFsbXRjX2JhY2tsaWdodF9kYXRhID0geworCS5wd21faWQJCT0gMSwKKwkubWF4X2JyaWdodG5lc3MJPSBQQUxNVENfTUFYX0lOVEVOU0lUWSwKKwkuZGZ0X2JyaWdodG5lc3MJPSBQQUxNVENfTUFYX0lOVEVOU0lUWSwKKwkucHdtX3BlcmlvZF9ucwk9IFBBTE1UQ19QRVJJT0RfTlMsCisJLmluaXQJCT0gcGFsbXRjX2JhY2tsaWdodF9pbml0LAorCS5ub3RpZnkJCT0gcGFsbXRjX2JhY2tsaWdodF9ub3RpZnksCisJLmV4aXQJCT0gcGFsbXRjX2JhY2tsaWdodF9leGl0LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGFsbXRjX2JhY2tsaWdodCA9IHsKKwkubmFtZQk9ICJwd20tYmFja2xpZ2h0IiwKKwkuZGV2CT0geworCQkucGFyZW50CQk9ICZweGEyNXhfZGV2aWNlX3B3bTEuZGV2LAorCQkucGxhdGZvcm1fZGF0YQk9ICZwYWxtdGNfYmFja2xpZ2h0X2RhdGEsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElyREEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHB4YWZpY3BfcGxhdGZvcm1fZGF0YSBwYWxtdGNfZmljcF9wbGF0Zm9ybV9kYXRhID0geworCS5ncGlvX3B3ZG93bgkJPSBHUElPX05SX1BBTE1UQ19JUl9ESVNBQkxFLAorCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogS2V5Ym9hcmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgdWludDMyX3QgcGFsbXRjX21hdHJpeF9rZXlzW10gPSB7CisJS0VZKDAsIDAsIEtFWV9GMSksCisJS0VZKDAsIDEsIEtFWV9YKSwKKwlLRVkoMCwgMiwgS0VZX1BPV0VSKSwKKwlLRVkoMCwgMywgS0VZX1RBQiksCisJS0VZKDAsIDQsIEtFWV9BKSwKKwlLRVkoMCwgNSwgS0VZX1EpLAorCUtFWSgwLCA2LCBLRVlfTEVGVFNISUZUKSwKKwlLRVkoMCwgNywgS0VZX1opLAorCUtFWSgwLCA4LCBLRVlfUyksCisJS0VZKDAsIDksIEtFWV9XKSwKKwlLRVkoMCwgMTAsIEtFWV9FKSwKKwlLRVkoMCwgMTEsIEtFWV9VUCksCisKKwlLRVkoMSwgMCwgS0VZX0YyKSwKKwlLRVkoMSwgMSwgS0VZX0RPV04pLAorCUtFWSgxLCAzLCBLRVlfRCksCisJS0VZKDEsIDQsIEtFWV9DKSwKKwlLRVkoMSwgNSwgS0VZX0YpLAorCUtFWSgxLCA2LCBLRVlfUiksCisJS0VZKDEsIDcsIEtFWV9TUEFDRSksCisJS0VZKDEsIDgsIEtFWV9WKSwKKwlLRVkoMSwgOSwgS0VZX0cpLAorCUtFWSgxLCAxMCwgS0VZX1QpLAorCUtFWSgxLCAxMSwgS0VZX0xFRlQpLAorCisJS0VZKDIsIDAsIEtFWV9GMyksCisJS0VZKDIsIDEsIEtFWV9MRUZUQ1RSTCksCisJS0VZKDIsIDMsIEtFWV9IKSwKKwlLRVkoMiwgNCwgS0VZX1kpLAorCUtFWSgyLCA1LCBLRVlfTiksCisJS0VZKDIsIDYsIEtFWV9KKSwKKwlLRVkoMiwgNywgS0VZX1UpLAorCUtFWSgyLCA4LCBLRVlfTSksCisJS0VZKDIsIDksIEtFWV9LKSwKKwlLRVkoMiwgMTAsIEtFWV9JKSwKKwlLRVkoMiwgMTEsIEtFWV9SSUdIVCksCisKKwlLRVkoMywgMCwgS0VZX0Y0KSwKKwlLRVkoMywgMSwgS0VZX0VOVEVSKSwKKwlLRVkoMywgMywgS0VZX0RPVCksCisJS0VZKDMsIDQsIEtFWV9MKSwKKwlLRVkoMywgNSwgS0VZX08pLAorCUtFWSgzLCA2LCBLRVlfTEVGVEFMVCksCisJS0VZKDMsIDcsIEtFWV9FTlRFUiksCisJS0VZKDMsIDgsIEtFWV9CQUNLU1BBQ0UpLAorCUtFWSgzLCA5LCBLRVlfUCksCisJS0VZKDMsIDEwLCBLRVlfQiksCisJS0VZKDMsIDExLCBLRVlfRk4pLAorfTsKKworY29uc3Qgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBwYWxtdGNfa2V5bWFwX2RhdGEgPSB7CisJLmtleW1hcAkJCT0gcGFsbXRjX21hdHJpeF9rZXlzLAorCS5rZXltYXBfc2l6ZQkJPSBBUlJBWV9TSVpFKHBhbG10Y19tYXRyaXhfa2V5cyksCit9OworCitjb25zdCBzdGF0aWMgdW5zaWduZWQgaW50IHBhbG10Y19rZXlwYWRfcm93X2dwaW9zW10gPSB7CisJMCwgOSwgMTAsIDExCit9OworCitjb25zdCBzdGF0aWMgdW5zaWduZWQgaW50IHBhbG10Y19rZXlwYWRfY29sX2dwaW9zW10gPSB7CisJMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDc5LCA4MAorfTsKKworc3RhdGljIHN0cnVjdCBtYXRyaXhfa2V5cGFkX3BsYXRmb3JtX2RhdGEgcGFsbXRjX2tleXBhZF9wbGF0Zm9ybV9kYXRhID0geworCS5rZXltYXBfZGF0YQk9ICZwYWxtdGNfa2V5bWFwX2RhdGEsCisJLmNvbF9ncGlvcwk9IHBhbG10Y19rZXlwYWRfcm93X2dwaW9zLAorCS5udW1fY29sX2dwaW9zCT0gMTIsCisJLnJvd19ncGlvcwk9IHBhbG10Y19rZXlwYWRfY29sX2dwaW9zLAorCS5udW1fcm93X2dwaW9zCT0gNCwKKwkuYWN0aXZlX2xvdwk9IDEsCisKKwkuZGVib3VuY2VfbXMJCT0gMjAsCisJLmNvbF9zY2FuX2RlbGF5X3VzCT0gNSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBhbG10Y19rZXlib2FyZCA9IHsKKwkubmFtZQk9ICJtYXRyaXgta2V5cGFkIiwKKwkuaWQJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZwYWxtdGNfa2V5cGFkX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVEQworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gcGFsbXRjX3VkY19pbmZvIF9faW5pdGRhdGEgPSB7CisJLmdwaW9fdmJ1cwkJPSBHUElPX05SX1BBTE1UQ19VU0JfREVURUNUX04sCisJLmdwaW9fdmJ1c19pbnZlcnRlZAk9IDEsCisJLmdwaW9fcHVsbHVwCQk9IEdQSU9fTlJfUEFMTVRDX1VTQl9QT1dFUiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRvdWNoc2NyZWVuIC8gQmF0dGVyeSAvIEdQSU8tZXh0ZW5kZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwYWxtdGNfdWNiMTQwMF9jb3JlID0geworCS5uYW1lCT0gInVjYjE0MDBfY29yZSIsCisJLmlkCT0gLTEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1IgRmxhc2gKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBhbG10Y19mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSBQWEFfQ1MwX1BIWVMsCisJLmVuZAk9IFBYQV9DUzBfUEhZUyArIFNaXzE2TSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFsbXRjX2ZsYXNoX3BhcnRzW10gPSB7CisJeworCQkubmFtZQk9ICJVLUJvb3QgQm9vdGxvYWRlciIsCisJCS5vZmZzZXQJPSAweDAsCisJCS5zaXplCT0gMHg0MDAwMCwKKwl9LAorCXsKKwkJLm5hbWUJPSAiTGludXggS2VybmVsIiwKKwkJLm9mZnNldAk9IDB4NDAwMDAsCisJCS5zaXplCT0gMHgyYzAwMDAsCisJfSwKKwl7CisJCS5uYW1lCT0gIkZpbGVzeXN0ZW0iLAorCQkub2Zmc2V0CT0gMHgzMDAwMDAsCisJCS5zaXplCT0gMHhjYzAwMDAsCisJfSwKKwl7CisJCS5uYW1lCT0gIlUtQm9vdCBFbnZpcm9ubWVudCIsCisJCS5vZmZzZXQJPSAweGZjMDAwMCwKKwkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBwYWxtdGNfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJCT0gNCwKKwkucGFydHMJCT0gcGFsbXRjX2ZsYXNoX3BhcnRzLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUocGFsbXRjX2ZsYXNoX3BhcnRzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBhbG10Y19mbGFzaCA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IC0xLAorCS5yZXNvdXJjZQk9ICZwYWxtdGNfZmxhc2hfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBhbG10Y19mbGFzaF9kYXRhLAorCX0sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGcmFtZWJ1ZmZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIHBhbG10Y19sY2RfbW9kZXNbXSA9IHsKK3sKKwkucGl4Y2xvY2sJPSAxMTUzODQsCisJLnhyZXMJCT0gMzIwLAorCS55cmVzCQk9IDMyMCwKKwkuYnBwCQk9IDE2LAorCisJLmxlZnRfbWFyZ2luCT0gMjcsCisJLnJpZ2h0X21hcmdpbgk9IDcsCisJLnVwcGVyX21hcmdpbgk9IDcsCisJLmxvd2VyX21hcmdpbgk9IDgsCisKKwkuaHN5bmNfbGVuCT0gNiwKKwkudnN5bmNfbGVuCT0gMSwKK30sCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBwYWxtdGNfbGNkX3NjcmVlbiA9IHsKKwkubW9kZXMJCQk9IHBhbG10Y19sY2RfbW9kZXMsCisJLm51bV9tb2RlcwkJPSBBUlJBWV9TSVpFKHBhbG10Y19sY2RfbW9kZXMpLAorCS5sY2RfY29ubgkJPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWFjaGluZSBpbml0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZwYWxtdGNfYmFja2xpZ2h0LAorCSZwYWxtdGNfdWNiMTQwMF9jb3JlLAorCSZwYWxtdGNfa2V5Ym9hcmQsCisJJnBhbG10Y19weGFfa2V5cywKKwkmcGFsbXRjX2ZsYXNoLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHBhbG10Y19pbml0KHZvaWQpCit7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUocGFsbXRjX3Bpbl9jb25maWcpKTsKKworCXNldF9weGFfZmJfaW5mbygmcGFsbXRjX2xjZF9zY3JlZW4pOworCXB4YV9zZXRfbWNpX2luZm8oJnBhbG10Y19tY2lfcGxhdGZvcm1fZGF0YSk7CisJcHhhX3NldF91ZGNfaW5mbygmcGFsbXRjX3VkY19pbmZvKTsKKwlweGFfc2V0X2FjOTdfaW5mbyhOVUxMKTsKKwlweGFfc2V0X2ZpY3BfaW5mbygmcGFsbXRjX2ZpY3BfcGxhdGZvcm1fZGF0YSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKK307CisKK01BQ0hJTkVfU1RBUlQoUEFMTVRDLCAiUGFsbSBUdW5nc3RlbnxDIikKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmJvb3RfcGFyYW1zIAk9IDB4YTAwMDAxMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBweGFfbWFwX2lvLAorCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKKwkudGltZXIJCT0gJnB4YV90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gcGFsbXRjX2luaXQKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdGUyLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdGUyLmMKaW5kZXggZDgyM2IwOS4uMjc3YzQwNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRlMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10ZTIuYwpAQCAtMTE3LDgzICsxMTcsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNEL01NQyBjYXJkIGNvbnRyb2xsZXIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHBhbG10ZTJfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCWlycV9oYW5kbGVyX3QgcGFsbXRlMl9kZXRlY3RfaW50LCB2b2lkICpkYXRhKQotewotCWludCBlcnIgPSAwOwotCi0JLyogU2V0dXAgYW4gaW50ZXJydXB0IGZvciBkZXRlY3RpbmcgY2FyZCBpbnNlcnQvcmVtb3ZlIGV2ZW50cyAqLwotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1URTJfU0RfREVURUNUX04sICJTRCBJUlEiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjsKLQllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX05SX1BBTE1URTJfU0RfREVURUNUX04pOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyMjsKLQllcnIgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShHUElPX05SX1BBTE1URTJfU0RfREVURUNUX04pLAotCQkJcGFsbXRlMl9kZXRlY3RfaW50LCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TQU1QTEVfUkFORE9NIHwKLQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJCSJTRC9NTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCByZXF1ZXN0IFNEL01NQyBjYXJkIGRldGVjdCBJUlFcbiIsCi0JCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjI7Ci0JfQotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVRFMl9TRF9QT1dFUiwgIlNEX1BPV0VSIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnIzOwotCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1URTJfU0RfUE9XRVIsIDApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyNDsKLQotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1URTJfU0RfUkVBRE9OTFksICJTRF9SRUFET05MWSIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyNDsKLQllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX05SX1BBTE1URTJfU0RfUkVBRE9OTFkpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyNTsKLQotCXByaW50ayhLRVJOX0RFQlVHICIlczogaXJxIHJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotCi1lcnI1OgotCWdwaW9fZnJlZShHUElPX05SX1BBTE1URTJfU0RfUkVBRE9OTFkpOwotZXJyNDoKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVEUyX1NEX1BPV0VSKTsKLWVycjM6Ci0JZnJlZV9pcnEoZ3Bpb190b19pcnEoR1BJT19OUl9QQUxNVEUyX1NEX0RFVEVDVF9OKSwgZGF0YSk7Ci1lcnIyOgotCWdwaW9fZnJlZShHUElPX05SX1BBTE1URTJfU0RfREVURUNUX04pOwotZXJyOgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG10ZTJfbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCWdwaW9fZnJlZShHUElPX05SX1BBTE1URTJfU0RfUkVBRE9OTFkpOwotCWdwaW9fZnJlZShHUElPX05SX1BBTE1URTJfU0RfUE9XRVIpOwotCWZyZWVfaXJxKGdwaW9fdG9faXJxKEdQSU9fTlJfUEFMTVRFMl9TRF9ERVRFQ1RfTiksIGRhdGEpOwotCWdwaW9fZnJlZShHUElPX05SX1BBTE1URTJfU0RfREVURUNUX04pOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtdGUyX21jaV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2ZGQpCi17Ci0Jc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhICpwX2QgPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9QQUxNVEUyX1NEX1BPV0VSLCBwX2QtPm9jcl9tYXNrICYgKDEgPDwgdmRkKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFsbXRlMl9tY2lfZ2V0X3JvKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoR1BJT19OUl9QQUxNVEUyX1NEX1JFQURPTkxZKTsKLX0KLQogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBwYWxtdGUyX21jaV9wbGF0Zm9ybV9kYXRhID0gewotCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAotCS5zZXRwb3dlcgk9IHBhbG10ZTJfbWNpX3Bvd2VyLAotCS5nZXRfcm8JCT0gcGFsbXRlMl9tY2lfZ2V0X3JvLAotCS5pbml0IAkJPSBwYWxtdGUyX21jaV9pbml0LAotCS5leGl0CQk9IHBhbG10ZTJfbWNpX2V4aXQsCisJLm9jcl9tYXNrCQk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gR1BJT19OUl9QQUxNVEUyX1NEX0RFVEVDVF9OLAorCS5ncGlvX2NhcmRfcm8JCT0gR1BJT19OUl9QQUxNVEUyX1NEX1JFQURPTkxZLAorCS5ncGlvX3Bvd2VyCQk9IEdQSU9fTlJfUEFMTVRFMl9TRF9QT1dFUiwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4NywzNSArMjE1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElyREEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHBhbG10ZTJfaXJkYV9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgZXJyOwotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1URTJfSVJfRElTQUJMRSwgIklSIERJU0FCTEUiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjsKLQllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNVEUyX0lSX0RJU0FCTEUsIDEpOwotCWlmIChlcnIpCi0JCWdwaW9fZnJlZShHUElPX05SX1BBTE1URTJfSVJfRElTQUJMRSk7Ci1lcnI6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgcGFsbXRlMl9pcmRhX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVEUyX0lSX0RJU0FCTEUpOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtdGUyX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQotewotCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVRFMl9JUl9ESVNBQkxFLCBtb2RlICYgSVJfT0ZGKTsKLQlweGEyeHhfdHJhbnNjZWl2ZXJfbW9kZShkZXYsIG1vZGUpOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YWZpY3BfcGxhdGZvcm1fZGF0YSBwYWxtdGUyX2ZpY3BfcGxhdGZvcm1fZGF0YSA9IHsKLQkuc3RhcnR1cAkJPSBwYWxtdGUyX2lyZGFfc3RhcnR1cCwKLQkuc2h1dGRvd24JCT0gcGFsbXRlMl9pcmRhX3NodXRkb3duLAotCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfRklSTU9ERSB8IElSX09GRiwKLQkudHJhbnNjZWl2ZXJfbW9kZQk9IHBhbG10ZTJfaXJkYV90cmFuc2NlaXZlcl9tb2RlLAorCS5ncGlvX3B3ZG93bgkJPSBHUElPX05SX1BBTE1URTJfSVJfRElTQUJMRSwKKwkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX09GRiwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXR4LmMKaW5kZXggODNkMDIwOC4uNzZhMmIzNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXR4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXR4LmMKQEAgLTI4LDYgKzI4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvd205N3h4X2JhdHQuaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ3Bpb192YnVzLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0xMzEsNiArMTM1LDEwIEBACiAJR1BJTzM0X0ZGVUFSVF9SWEQsCiAJR1BJTzM5X0ZGVUFSVF9UWEQsCiAKKwkvKiBOQU5EICovCisJR1BJTzE1X25DU18xLAorCUdQSU8xOF9SRFksCisKIAkvKiBNSVNDLiAqLwogCUdQSU8xMF9HUElPLAkvKiBob3RzeW5jIGJ1dHRvbiAqLwogCUdQSU8xMl9HUElPLAkvKiBwb3dlciBkZXRlY3QgKi8KQEAgLTEzOCw4NSArMTQ2LDUwIEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1IgRmxhc2gKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFsbXR4X3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJGbGFzaCIsCisJCS5vZmZzZXQJCT0gMHgwMDAwMDAwMCwKKwkJLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm1hc2tfZmxhZ3MJPSAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgcGFsbXR4X2ZsYXNoX2RhdGFbXSA9IHsKKwl7CisJCS53aWR0aAkJPSAyLAkJCS8qIGJhbmt3aWR0aCBpbiBieXRlcyAqLworCQkucGFydHMJCT0gcGFsbXR4X3BhcnRpdGlvbnMsCisJCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUocGFsbXR4X3BhcnRpdGlvbnMpCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwYWxtdHhfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CT0gUFhBX0NTMF9QSFlTLAorCS5lbmQJPSBQWEFfQ1MwX1BIWVMgKyBTWl84TSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwYWxtdHhfZmxhc2ggPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAwLAorCS5yZXNvdXJjZQk9ICZwYWxtdHhfZmxhc2hfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5kZXYgCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSBwYWxtdHhfZmxhc2hfZGF0YSwKKwl9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU0QvTU1DIGNhcmQgY29udHJvbGxlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcGFsbXR4X21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBwYWxtdHhfZGV0ZWN0X2ludCwKLQkJCQl2b2lkICpkYXRhKQotewotCWludCBlcnIgPSAwOwotCi0JLyogU2V0dXAgYW4gaW50ZXJydXB0IGZvciBkZXRlY3RpbmcgY2FyZCBpbnNlcnQvcmVtb3ZlIGV2ZW50cyAqLwotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1UWF9TRF9ERVRFQ1RfTiwgIlNEIElSUSIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwotCWVyciA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fTlJfUEFMTVRYX1NEX0RFVEVDVF9OKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjI7Ci0JZXJyID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoR1BJT19OUl9QQUxNVFhfU0RfREVURUNUX04pLAotCQkJcGFsbXR4X2RldGVjdF9pbnQsIElSUUZfRElTQUJMRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00gfAotCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAotCQkJIlNEL01NQyBjYXJkIGRldGVjdCIsIGRhdGEpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHJlcXVlc3QgU0QvTU1DIGNhcmQgZGV0ZWN0IElSUVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0KLQllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNVFhfU0RfUE9XRVIsICJTRF9QT1dFUiIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyMzsKLQllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNVFhfU0RfUE9XRVIsIDApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyNDsKLQotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1UWF9TRF9SRUFET05MWSwgIlNEX1JFQURPTkxZIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnI0OwotCWVyciA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fTlJfUEFMTVRYX1NEX1JFQURPTkxZKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjU7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlycSByZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyNToKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVFhfU0RfUkVBRE9OTFkpOwotZXJyNDoKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVFhfU0RfUE9XRVIpOwotZXJyMzoKLQlmcmVlX2lycShncGlvX3RvX2lycShHUElPX05SX1BBTE1UWF9TRF9ERVRFQ1RfTiksIGRhdGEpOwotZXJyMjoKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVFhfU0RfREVURUNUX04pOwotZXJyOgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG10eF9tY2lfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRYX1NEX1JFQURPTkxZKTsKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVFhfU0RfUE9XRVIpOwotCWZyZWVfaXJxKGdwaW9fdG9faXJxKEdQSU9fTlJfUEFMTVRYX1NEX0RFVEVDVF9OKSwgZGF0YSk7Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRYX1NEX0RFVEVDVF9OKTsKLX0KLQotc3RhdGljIHZvaWQgcGFsbXR4X21jaV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2ZGQpCi17Ci0Jc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhICpwX2QgPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9QQUxNVFhfU0RfUE9XRVIsIHBfZC0+b2NyX21hc2sgJiAoMSA8PCB2ZGQpKTsKLX0KLQotc3RhdGljIGludCBwYWxtdHhfbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVRYX1NEX1JFQURPTkxZKTsKLX0KLQogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBwYWxtdHhfbWNpX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQsCi0JLnNldHBvd2VyCT0gcGFsbXR4X21jaV9wb3dlciwKLQkuZ2V0X3JvCQk9IHBhbG10eF9tY2lfZ2V0X3JvLAotCS5pbml0IAkJPSBwYWxtdHhfbWNpX2luaXQsCi0JLmV4aXQJCT0gcGFsbXR4X21jaV9leGl0LAorCS5vY3JfbWFzawkJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKKwkuZ3Bpb19jYXJkX2RldGVjdAk9IEdQSU9fTlJfUEFMTVRYX1NEX0RFVEVDVF9OLAorCS5ncGlvX2NhcmRfcm8JCT0gR1BJT19OUl9QQUxNVFhfU0RfUkVBRE9OTFksCisJLmdwaW9fcG93ZXIJCT0gR1BJT19OUl9QQUxNVFhfU0RfUE9XRVIsCisJLmRldGVjdF9kZWxheQkJPSAyMCwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMzMCwzNSArMzAzLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElyREEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHBhbG10eF9pcmRhX3N0YXJ0dXAoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCBlcnI7Ci0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVRYX0lSX0RJU0FCTEUsICJJUiBESVNBQkxFIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnI7Ci0JZXJyID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTlJfUEFMTVRYX0lSX0RJU0FCTEUsIDEpOwotCWlmIChlcnIpCi0JCWdwaW9fZnJlZShHUElPX05SX1BBTE1UWF9JUl9ESVNBQkxFKTsKLWVycjoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtdHhfaXJkYV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRYX0lSX0RJU0FCTEUpOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtdHhfaXJkYV90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9QQUxNVFhfSVJfRElTQUJMRSwgbW9kZSAmIElSX09GRik7Ci0JcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoZGV2LCBtb2RlKTsKLX0KLQogc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgcGFsbXR4X2ZpY3BfcGxhdGZvcm1fZGF0YSA9IHsKLQkuc3RhcnR1cAkJPSBwYWxtdHhfaXJkYV9zdGFydHVwLAotCS5zaHV0ZG93bgkJPSBwYWxtdHhfaXJkYV9zaHV0ZG93biwKLQkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX0ZJUk1PREUgfCBJUl9PRkYsCi0JLnRyYW5zY2VpdmVyX21vZGUJPSBwYWxtdHhfaXJkYV90cmFuc2NlaXZlcl9tb2RlLAorCS5ncGlvX3B3ZG93bgkJPSBHUElPX05SX1BBTE1UWF9JUl9ESVNBQkxFLAorCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDkzLDYgKzQ0MCw2OCBAQAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTkFORCBGbGFzaAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBhbG10eF9uYW5kX2NtZF9jdGwoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQsCisJCQkJIHVuc2lnbmVkIGludCBjdHJsKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJdW5zaWduZWQgbG9uZyBuYW5kYWRkciA9ICh1bnNpZ25lZCBsb25nKXRoaXMtPklPX0FERFJfVzsKKworCWlmIChjbWQgPT0gTkFORF9DTURfTk9ORSkKKwkJcmV0dXJuOworCisJaWYgKGN0cmwgJiBOQU5EX0NMRSkKKwkJd3JpdGViKGNtZCwgUEFMTVRYX05BTkRfQ0xFX1ZJUlQpOworCWVsc2UgaWYgKGN0cmwgJiBOQU5EX0FMRSkKKwkJd3JpdGViKGNtZCwgUEFMTVRYX05BTkRfQUxFX1ZJUlQpOworCWVsc2UKKwkJd3JpdGViKGNtZCwgbmFuZGFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFsbXR4X3BhcnRpdGlvbl9pbmZvW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJwYWxtdHgtMCIsCisJCS5vZmZzZXQJPSAwLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnBhbG10eF9wYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07CisKK3N0cnVjdCBwbGF0Zm9ybV9uYW5kX2RhdGEgcGFsbXR4X25hbmRfcGxhdGRhdGEgPSB7CisJLmNoaXAJPSB7CisJCS5ucl9jaGlwcwkJPSAxLAorCQkuY2hpcF9vZmZzZXQJCT0gMCwKKwkJLm5yX3BhcnRpdGlvbnMJCT0gQVJSQVlfU0laRShwYWxtdHhfcGFydGl0aW9uX2luZm8pLAorCQkucGFydGl0aW9ucwkJPSBwYWxtdHhfcGFydGl0aW9uX2luZm8sCisJCS5jaGlwX2RlbGF5CQk9IDIwLAorCQkucGFydF9wcm9iZV90eXBlcyAJPSBwYWxtdHhfcGFydF9wcm9iZXMsCisJfSwKKwkuY3RybAk9IHsKKwkJLmNtZF9jdHJsCT0gcGFsbXR4X25hbmRfY21kX2N0bCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwYWxtdHhfbmFuZF9yZXNvdXJjZVtdID0geworCVswXQk9IHsKKwkJLnN0YXJ0CT0gUFhBX0NTMV9QSFlTLAorCQkuZW5kCT0gUFhBX0NTMV9QSFlTICsgU1pfMU0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGFsbXR4X25hbmQgPSB7CisJLm5hbWUJCT0gImdlbl9uYW5kIiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocGFsbXR4X25hbmRfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHBhbG10eF9uYW5kX3Jlc291cmNlLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcGFsbXR4X25hbmRfcGxhdGRhdGEsCisJfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUG93ZXIgbWFuYWdlbWVudCAtIHN0YW5kYnkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFsbXR4X3BtX2luaXQodm9pZCkKQEAgLTUxOCw2ICs1MjcsOCBAQAogCSZwb3dlcl9zdXBwbHksCiAJJnBhbG10eF9hc29jLAogCSZwYWxtdHhfZ3Bpb192YnVzLAorCSZwYWxtdHhfZmxhc2gsCisJJnBhbG10eF9uYW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBwYWxtdHhfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CkBAIC01MjUsOCArNTM2LDE4IEBACiAJLnZpcnR1YWwJPSBQQUxNVFhfUENNQ0lBX1ZJUlQsCiAJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFBBTE1UWF9QQ01DSUFfUEhZUyksCiAJLmxlbmd0aAkJPSBQQUxNVFhfUENNQ0lBX1NJWkUsCi0JLnR5cGUJCT0gTVRfREVWSUNFCi19LAorCS50eXBlCQk9IE1UX0RFVklDRSwKK30sIHsKKwkudmlydHVhbAk9IFBBTE1UWF9OQU5EX0FMRV9WSVJULAorCS5wZm4JCT0gX19waHlzX3RvX3BmbihQQUxNVFhfTkFORF9BTEVfUEhZUyksCisJLmxlbmd0aAkJPSBTWl8xTSwKKwkudHlwZQkJPSBNVF9ERVZJQ0UsCit9LCB7CisJLnZpcnR1YWwJPSBQQUxNVFhfTkFORF9DTEVfVklSVCwKKwkucGZuCQk9IF9fcGh5c190b19wZm4oUEFMTVRYX05BTkRfQ0xFX1BIWVMpLAorCS5sZW5ndGgJCT0gU1pfMU0sCisJLnR5cGUJCT0gTVRfREVWSUNFLAorfQogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IHBhbG10eF9tYXBfaW8odm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYwppbmRleCBjMzY0NWFhLi5jMmJmNDkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtejcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXo3Mi5jCkBAIC0xMjksODggKzEyOSwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU0QvTU1DIGNhcmQgY29udHJvbGxlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcGFsbXo3Ml9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJaXJxX2hhbmRsZXJfdCBwYWxtejcyX2RldGVjdF9pbnQsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGVyciA9IDA7Ci0KLQkvKiBTZXR1cCBhbiBpbnRlcnJ1cHQgZm9yIGRldGVjdGluZyBjYXJkIGluc2VydC9yZW1vdmUgZXZlbnRzICovCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVo3Ml9TRF9ERVRFQ1RfTiwgIlNEIElSUSIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwotCWVyciA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fTlJfUEFMTVo3Ml9TRF9ERVRFQ1RfTik7Ci0JaWYgKGVycikKLQkJZ290byBlcnIyOwotCWVyciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKEdQSU9fTlJfUEFMTVo3Ml9TRF9ERVRFQ1RfTiksCi0JCQlwYWxtejcyX2RldGVjdF9pbnQsIElSUUZfRElTQUJMRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00gfAotCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAotCQkJIlNEL01NQyBjYXJkIGRldGVjdCIsIGRhdGEpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHJlcXVlc3QgU0QvTU1DIGNhcmQgZGV0ZWN0IElSUVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0KLQkvKiBTRF9QT1dFUiBpcyBub3QgYWN0dWFsbHkgcG93ZXIsIGJ1dCBpdCBpcyBtb3JlIGxpa2UgY2hpcAotCSAqIHNlbGVjdCwgaS5lLiBpdCBpcyBpbnZlcnRlZCAqLwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVo3Ml9TRF9QT1dFUl9OLCAiU0RfUE9XRVIiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjM7Ci0JZXJyID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTlJfUEFMTVo3Ml9TRF9QT1dFUl9OLCAwKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjQ7Ci0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVo3Ml9TRF9STywgIlNEX1JPIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnI0OwotCWVyciA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fTlJfUEFMTVo3Ml9TRF9STyk7Ci0JaWYgKGVycikKLQkJZ290byBlcnI1OwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpcnEgcmVnaXN0ZXJlZFxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIDA7Ci0KLWVycjU6Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9TRF9STyk7Ci1lcnI0OgotCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfU0RfUE9XRVJfTik7Ci1lcnIzOgotCWZyZWVfaXJxKGdwaW9fdG9faXJxKEdQSU9fTlJfUEFMTVo3Ml9TRF9ERVRFQ1RfTiksIGRhdGEpOwotZXJyMjoKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNWjcyX1NEX0RFVEVDVF9OKTsKLWVycjoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtejcyX21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlncGlvX2ZyZWUoR1BJT19OUl9QQUxNWjcyX1NEX1BPV0VSX04pOwotCWZyZWVfaXJxKGdwaW9fdG9faXJxKEdQSU9fTlJfUEFMTVo3Ml9TRF9ERVRFQ1RfTiksIGRhdGEpOwotCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfU0RfREVURUNUX04pOwotCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfU0RfUk8pOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtejcyX21jaV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2ZGQpCi17Ci0Jc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhICpwX2QgPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHBfZC0+b2NyX21hc2sgJiAoMSA8PCB2ZGQpKQotCQlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1aNzJfU0RfUE9XRVJfTiwgMCk7Ci0JZWxzZQotCQlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1aNzJfU0RfUE9XRVJfTiwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFsbXo3Ml9tY2lfcm8oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBncGlvX2dldF92YWx1ZShHUElPX05SX1BBTE1aNzJfU0RfUk8pOwotfQotCisvKiBTRF9QT1dFUiBpcyBub3QgYWN0dWFsbHkgcG93ZXIsIGJ1dCBpdCBpcyBtb3JlIGxpa2UgY2hpcAorICogc2VsZWN0LCBpLmUuIGl0IGlzIGludmVydGVkICovCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHBhbG16NzJfbWNpX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQsCi0JLnNldHBvd2VyCT0gcGFsbXo3Ml9tY2lfcG93ZXIsCi0JLmdldF9ybwkJPSBwYWxtejcyX21jaV9ybywKLQkuaW5pdCAJCT0gcGFsbXo3Ml9tY2lfaW5pdCwKLQkuZXhpdAkJPSBwYWxtejcyX21jaV9leGl0LAorCS5vY3JfbWFzawkJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKKwkuZ3Bpb19jYXJkX2RldGVjdAk9IEdQSU9fTlJfUEFMTVo3Ml9TRF9ERVRFQ1RfTiwKKwkuZ3Bpb19jYXJkX3JvCQk9IEdQSU9fTlJfUEFMTVo3Ml9TRF9STywKKwkuZ3Bpb19wb3dlcgkJPSBHUElPX05SX1BBTE1aNzJfU0RfUE9XRVJfTiwKKwkuZ3Bpb19wb3dlcl9pbnZlcnQJPSAxLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzA0LDM1ICsyMzAsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSXJEQQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcGFsbXo3Ml9pcmRhX3N0YXJ0dXAoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCBlcnI7Ci0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVo3Ml9JUl9ESVNBQkxFLCAiSVIgRElTQUJMRSIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwotCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1aNzJfSVJfRElTQUJMRSwgMSk7Ci0JaWYgKGVycikKLQkJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9JUl9ESVNBQkxFKTsKLWVycjoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBwYWxtejcyX2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQotewotCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfSVJfRElTQUJMRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG16NzJfaXJkYV90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9QQUxNWjcyX0lSX0RJU0FCTEUsIG1vZGUgJiBJUl9PRkYpOwotCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIHBhbG16NzJfZmljcF9wbGF0Zm9ybV9kYXRhID0gewotCS5zdGFydHVwCQk9IHBhbG16NzJfaXJkYV9zdGFydHVwLAotCS5zaHV0ZG93bgkJPSBwYWxtejcyX2lyZGFfc2h1dGRvd24sCisJLmdwaW9fcHdkb3duCQk9IEdQSU9fTlJfUEFMTVo3Ml9JUl9ESVNBQkxFLAogCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAotCS50cmFuc2NlaXZlcl9tb2RlCT0gcGFsbXo3Ml9pcmRhX3RyYW5zY2VpdmVyX21vZGUsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wY205OTAtYmFzZWJvYXJkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wY205OTAtYmFzZWJvYXJkLmMKaW5kZXggMDE3OTFkNy4uYmJkYTU3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGNtOTkwLWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BjbTk5MC1iYXNlYm9hcmQuYwpAQCAtMzIxLDExICszMjEsMTQgQEAKICNkZWZpbmUgTVNFQ1NfUEVSX0pJRkZZICgxMDAwL0haKQogCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHBjbTk5MF9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkuZGV0ZWN0X2RlbGF5CT0gMjUwIC8gTVNFQ1NfUEVSX0pJRkZZLAotCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAotCS5pbml0IAkJPSBwY205OTBfbWNpX2luaXQsCi0JLnNldHBvd2VyIAk9IHBjbTk5MF9tY2lfc2V0cG93ZXIsCi0JLmV4aXQJCT0gcGNtOTkwX21jaV9leGl0LAorCS5kZXRlY3RfZGVsYXkJCT0gMjUwIC8gTVNFQ1NfUEVSX0pJRkZZLAorCS5vY3JfbWFzawkJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKKwkuaW5pdCAJCQk9IHBjbTk5MF9tY2lfaW5pdCwKKwkuc2V0cG93ZXIgCQk9IHBjbTk5MF9tY2lfc2V0cG93ZXIsCisJLmV4aXQJCQk9IHBjbTk5MF9tY2lfZXhpdCwKKwkuZ3Bpb19jYXJkX2RldGVjdAk9IC0xLAorCS5ncGlvX2NhcmRfcm8JCT0gLTEsCisJLmdwaW9fcG93ZXIJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSBwY205OTBfb2hjaV9wbGF0Zm9ybV9kYXRhID0gewpAQCAtNDI3LDI1ICs0MzAsNTYgQEAKIAlncGlvX2J1c19zd2l0Y2ggPSAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfbGluayBpY2xpbmsgPSB7Ci0JLmJ1c19pZAk9IDAsIC8qIE11c3QgbWF0Y2ggd2l0aCB0aGUgY2FtZXJhIElEIGFib3ZlICovCi0JLnF1ZXJ5X2J1c19wYXJhbSA9IHBjbTk5MF9jYW1lcmFfcXVlcnlfYnVzX3BhcmFtLAotCS5zZXRfYnVzX3BhcmFtID0gcGNtOTkwX2NhbWVyYV9zZXRfYnVzX3BhcmFtLAotCS5mcmVlX2J1cyA9IHBjbTk5MF9jYW1lcmFfZnJlZV9idXMsCi19OwotCiAvKiBCb2FyZCBJMkMgZGV2aWNlcy4gKi8KIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBwY205OTBfaTJjX2RldmljZXNbXSA9IHsKIAl7CiAJCS8qIE11c3QgaW5pdGlhbGl6ZSBiZWZvcmUgdGhlIGNhbWVyYShzKSAqLwogCQlJMkNfQk9BUkRfSU5GTygicGNhOTUzNiIsIDB4NDEpLAogCQkucGxhdGZvcm1fZGF0YSA9ICZwY2E5NTM2X2RhdGEsCi0JfSwgeworCX0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIHBjbTk5MF9jYW1lcmFfaTJjW10gPSB7CisJewogCQlJMkNfQk9BUkRfSU5GTygibXQ5djAyMiIsIDB4NDgpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZpY2xpbmssIC8qIFdpdGggZXh0ZW5kZXIgKi8KIAl9LCB7CiAJCUkyQ19CT0FSRF9JTkZPKCJtdDltMDAxIiwgMHg1ZCksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJmljbGluaywgLyogV2l0aCBleHRlbmRlciAqLworCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfbGluayBpY2xpbmtbXSA9IHsKKwl7CisJCS5idXNfaWQJCQk9IDAsIC8qIE11c3QgbWF0Y2ggd2l0aCB0aGUgY2FtZXJhIElEICovCisJCS5ib2FyZF9pbmZvCQk9ICZwY205OTBfY2FtZXJhX2kyY1swXSwKKwkJLmkyY19hZGFwdGVyX2lkCQk9IDAsCisJCS5xdWVyeV9idXNfcGFyYW0JPSBwY205OTBfY2FtZXJhX3F1ZXJ5X2J1c19wYXJhbSwKKwkJLnNldF9idXNfcGFyYW0JCT0gcGNtOTkwX2NhbWVyYV9zZXRfYnVzX3BhcmFtLAorCQkuZnJlZV9idXMJCT0gcGNtOTkwX2NhbWVyYV9mcmVlX2J1cywKKwkJLm1vZHVsZV9uYW1lCQk9ICJtdDl2MDIyIiwKKwl9LCB7CisJCS5idXNfaWQJCQk9IDAsIC8qIE11c3QgbWF0Y2ggd2l0aCB0aGUgY2FtZXJhIElEICovCisJCS5ib2FyZF9pbmZvCQk9ICZwY205OTBfY2FtZXJhX2kyY1sxXSwKKwkJLmkyY19hZGFwdGVyX2lkCQk9IDAsCisJCS5xdWVyeV9idXNfcGFyYW0JPSBwY205OTBfY2FtZXJhX3F1ZXJ5X2J1c19wYXJhbSwKKwkJLnNldF9idXNfcGFyYW0JCT0gcGNtOTkwX2NhbWVyYV9zZXRfYnVzX3BhcmFtLAorCQkuZnJlZV9idXMJCT0gcGNtOTkwX2NhbWVyYV9mcmVlX2J1cywKKwkJLm1vZHVsZV9uYW1lCQk9ICJtdDltMDAxIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGNtOTkwX2NhbWVyYVtdID0geworCXsKKwkJLm5hbWUJPSAic29jLWNhbWVyYS1wZHJ2IiwKKwkJLmlkCT0gMCwKKwkJLmRldgk9IHsKKwkJCS5wbGF0Zm9ybV9kYXRhID0gJmljbGlua1swXSwKKwkJfSwKKwl9LCB7CisJCS5uYW1lCT0gInNvYy1jYW1lcmEtcGRydiIsCisJCS5pZAk9IDEsCisJCS5kZXYJPSB7CisJCQkucGxhdGZvcm1fZGF0YSA9ICZpY2xpbmtbMV0sCisJCX0sCiAJfSwKIH07CiAjZW5kaWYgLyogQ09ORklHX1ZJREVPX1BYQTI3eCB8fENPTkZJR19WSURFT19QWEEyN3hfTU9EVUxFICovCkBAIC01MDEsNiArNTM1LDkgQEAKIAlweGFfc2V0X2NhbWVyYV9pbmZvKCZwY205OTBfcHhhY2FtZXJhX3BsYXRmb3JtX2RhdGEpOwogCiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgQVJSQVlfQU5EX1NJWkUocGNtOTkwX2kyY19kZXZpY2VzKSk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBjbTk5MF9jYW1lcmFbMF0pOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGNtOTkwX2NhbWVyYVsxXSk7CiAjZW5kaWYKIAogCXByaW50ayhLRVJOX0lORk8gIlBDTS05OTAgRXZhbHVhdGlvbiBiYXNlYm9hcmQgaW5pdGlhbGl6ZWRcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwppbmRleCA5MzUyZDRhLi5hMTg2OTk0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwpAQCAtMjQ1LDIwICsyNDUsMTAgQEAKICAqIFRoZSBjYXJkIGRldGVjdCBpbnRlcnJ1cHQgaXNuJ3QgZGVib3VuY2VkIHNvIHdlIGRlbGF5IGl0IGJ5IDI1MG1zCiAgKiB0byBnaXZlIHRoZSBjYXJkIGEgY2hhbmNlIHRvIGZ1bGx5IGluc2VydC9lamVjdC4KICAqLwotc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBwb29kbGVfbWNpX3BsYXRmb3JtX2RhdGE7Ci0KIHN0YXRpYyBpbnQgcG9vZGxlX21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBwb29kbGVfZGV0ZWN0X2ludCwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KFBPT0RMRV9HUElPX25TRF9ERVRFQ1QsICJuU0RfREVURUNUIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0OwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KFBPT0RMRV9HUElPX25TRF9XUCwgIm5TRF9XUCIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWVfMTsKLQogCWVyciA9IGdwaW9fcmVxdWVzdChQT09ETEVfR1BJT19TRF9QV1IsICJTRF9QV1IiKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9mcmVlXzI7CkBAIC0yNjcsMzQgKzI1NywxNCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2ZyZWVfMzsKIAotCWdwaW9fZGlyZWN0aW9uX2lucHV0KFBPT0RMRV9HUElPX25TRF9ERVRFQ1QpOwotCWdwaW9fZGlyZWN0aW9uX2lucHV0KFBPT0RMRV9HUElPX25TRF9XUCk7Ci0KIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoUE9PRExFX0dQSU9fU0RfUFdSLCAwKTsKIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoUE9PRExFX0dQSU9fU0RfUFdSMSwgMCk7CiAKLQlwb29kbGVfbWNpX3BsYXRmb3JtX2RhdGEuZGV0ZWN0X2RlbGF5ID0gbXNlY3NfdG9famlmZmllcygyNTApOwotCi0JZXJyID0gcmVxdWVzdF9pcnEoUE9PRExFX0lSUV9HUElPX25TRF9ERVRFQ1QsIHBvb2RsZV9kZXRlY3RfaW50LAotCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAotCQkJICAiTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoIiVzOiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2ZyZWVfNDsKLQl9Ci0KIAlyZXR1cm4gMDsKIAotZXJyX2ZyZWVfNDoKLQlncGlvX2ZyZWUoUE9PRExFX0dQSU9fU0RfUFdSMSk7CiBlcnJfZnJlZV8zOgogCWdwaW9fZnJlZShQT09ETEVfR1BJT19TRF9QV1IpOwogZXJyX2ZyZWVfMjoKLQlncGlvX2ZyZWUoUE9PRExFX0dQSU9fblNEX1dQKTsKLWVycl9mcmVlXzE6Ci0JZ3Bpb19mcmVlKFBPT0RMRV9HUElPX25TRF9ERVRFQ1QpOwotZXJyX291dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zMTIsNjIgKzI4MiwyOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBwb29kbGVfbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuICEhZ3Bpb19nZXRfdmFsdWUoUE9PRExFX0dQSU9fblNEX1dQKTsKLQlyZXR1cm4gR1BMUihQT09ETEVfR1BJT19uU0RfV1ApICYgR1BJT19iaXQoUE9PRExFX0dQSU9fblNEX1dQKTsKLX0KLQotCiBzdGF0aWMgdm9pZCBwb29kbGVfbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCWZyZWVfaXJxKFBPT0RMRV9JUlFfR1BJT19uU0RfREVURUNULCBkYXRhKTsKIAlncGlvX2ZyZWUoUE9PRExFX0dQSU9fU0RfUFdSMSk7CiAJZ3Bpb19mcmVlKFBPT0RMRV9HUElPX1NEX1BXUik7Ci0JZ3Bpb19mcmVlKFBPT0RMRV9HUElPX25TRF9XUCk7Ci0JZ3Bpb19mcmVlKFBPT0RMRV9HUElPX25TRF9ERVRFQ1QpOwogfQogCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHBvb2RsZV9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCi0JLmluaXQgCQk9IHBvb2RsZV9tY2lfaW5pdCwKLQkuZ2V0X3JvCQk9IHBvb2RsZV9tY2lfZ2V0X3JvLAotCS5zZXRwb3dlciAJPSBwb29kbGVfbWNpX3NldHBvd2VyLAotCS5leGl0CQk9IHBvb2RsZV9tY2lfZXhpdCwKKwkub2NyX21hc2sJCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAorCS5pbml0IAkJCT0gcG9vZGxlX21jaV9pbml0LAorCS5zZXRwb3dlciAJCT0gcG9vZGxlX21jaV9zZXRwb3dlciwKKwkuZXhpdAkJCT0gcG9vZGxlX21jaV9leGl0LAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gUE9PRExFX0lSUV9HUElPX25TRF9ERVRFQ1QsCisJLmdwaW9fY2FyZF9ybwkJPSBQT09ETEVfR1BJT19uU0RfV1AsCisJLmdwaW9fcG93ZXIJCT0gLTEsCiB9OwogCiAKIC8qCiAgKiBJcmRhCiAgKi8KLXN0YXRpYyB2b2lkIHBvb2RsZV9pcmRhX3RyYW5zY2VpdmVyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSkKLXsKLQlncGlvX3NldF92YWx1ZShQT09ETEVfR1BJT19JUl9PTiwgbW9kZSAmIElSX09GRik7Ci0JcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoZGV2LCBtb2RlKTsKLX0KLQotc3RhdGljIGludCBwb29kbGVfaXJkYV9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KFBPT0RMRV9HUElPX0lSX09OLCAiSVJfT04iKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFBPT0RMRV9HUElPX0lSX09OLCAxKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcG9vZGxlX2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQotewotCWdwaW9fZnJlZShQT09ETEVfR1BJT19JUl9PTik7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIHBvb2RsZV9maWNwX3BsYXRmb3JtX2RhdGEgPSB7CisJLmdwaW9fcHdkb3duCQk9IFBPT0RMRV9HUElPX0lSX09OLAogCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAotCS50cmFuc2NlaXZlcl9tb2RlCT0gcG9vZGxlX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKLQkuc3RhcnR1cAkJPSBwb29kbGVfaXJkYV9zdGFydHVwLAotCS5zaHV0ZG93bgkJPSBwb29kbGVfaXJkYV9zaHV0ZG93biwKIH07CiAKIApAQCAtNTIxLDYgKzQ1OCw3IEBACiAJc2V0X3B4YV9mYl9wYXJlbnQoJnBvb2RsZV9sb2NvbW9fZGV2aWNlLmRldik7CiAJc2V0X3B4YV9mYl9pbmZvKCZwb29kbGVfZmJfaW5mbyk7CiAJcHhhX3NldF91ZGNfaW5mbygmdWRjX2luZm8pOworCXBvb2RsZV9tY2lfcGxhdGZvcm1fZGF0YS5kZXRlY3RfZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDI1MCk7CiAJcHhhX3NldF9tY2lfaW5mbygmcG9vZGxlX21jaV9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X2ZpY3BfaW5mbygmcG9vZGxlX2ZpY3BfcGxhdGZvcm1fZGF0YSk7CiAJcHhhX3NldF9pMmNfaW5mbyhOVUxMKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMnh4LmMKaW5kZXggMmYzMzk0Zi4uODY4MjcwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMnh4LmMKQEAgLTUyLDMgKzUyLDQgQEAKIAl9IGVsc2UKIAkJQlVHKCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChweGEyeHhfdHJhbnNjZWl2ZXJfbW9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEzMDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTMwMC5jCmluZGV4IDRiYTZkMjEuLmY0YWY2ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTMwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTMwMC5jCkBAIC04NCw5ICs4NCwxMSBAQAogfTsKIAogc3RhdGljIERFRklORV9QWEEzX0NLRU4oY29tbW9uX25hbmQsIE5BTkQsIDE1NjAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihnY3UsIFBYQTMwMF9HQ1UsIDAsIDApOwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgY29tbW9uX2Nsa3JlZ3NbXSA9IHsKIAlJTklUX0NMS1JFRygmY2xrX2NvbW1vbl9uYW5kLCAicHhhM3h4LW5hbmQiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX2djdSwgInB4YTN4eC1nY3UiLCBOVUxMKSwKIH07CiAKIHN0YXRpYyBERUZJTkVfUFhBM19DS0VOKHB4YTMxMF9tbWMzLCBNTUMzLCAxOTUwMDAwMCwgMCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEzMjAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTMyMC5jCmluZGV4IDhiM2Q5N2UuLmM3MzczZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTMyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTMyMC5jCkBAIC03OCw5ICs3OCwxMSBAQAogfTsKIAogc3RhdGljIERFRklORV9QWEEzX0NLRU4ocHhhMzIwX25hbmQsIE5BTkQsIDEwNDAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihnY3UsIFBYQTMyMF9HQ1UsIDAsIDApOwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcHhhMzIwX2Nsa3JlZ3NbXSA9IHsKIAlJTklUX0NMS1JFRygmY2xrX3B4YTMyMF9uYW5kLCAicHhhM3h4LW5hbmQiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX2djdSwgInB4YTN4eC1nY3UiLCBOVUxMKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHB4YTMyMF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGE5MzAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTkzMC5jCmluZGV4IDcxMTMxNzQuLjA2NDI5MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTkzMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTkzMC5jCkBAIC0xNzYsMTMgKzE3NiwzMCBAQAogCU1GUF9BRERSX0VORCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbWZwX2FkZHJfbWFwIHB4YTkzNV9tZnBfYWRkcl9tYXBbXSBfX2luaXRkYXRhID0geworCU1GUF9BRERSKEdQSU8xNTksIDB4MDUyNCksCisJTUZQX0FERFIoR1BJTzE2MywgMHgwNTM0KSwKKwlNRlBfQUREUihHUElPMTY3LCAweDA1NDQpLAorCU1GUF9BRERSKEdQSU8xNjgsIDB4MDU0OCksCisJTUZQX0FERFIoR1BJTzE2OSwgMHgwNTRjKSwKKwlNRlBfQUREUihHUElPMTcwLCAweDA1NTApLAorCU1GUF9BRERSKEdQSU8xNzEsIDB4MDU1NCksCisJTUZQX0FERFIoR1BJTzE3MiwgMHgwNTU4KSwKKwlNRlBfQUREUihHUElPMTczLCAweDA1NWMpLAorCisJTUZQX0FERFJfRU5ELAorfTsKKwogc3RhdGljIGludCBfX2luaXQgcHhhOTMwX2luaXQodm9pZCkKIHsKLQlpZiAoY3B1X2lzX3B4YTkzMCgpKSB7CisJaWYgKGNwdV9pc19weGE5MzAoKSB8fCBjcHVfaXNfcHhhOTM1KCkpIHsKIAkJbWZwX2luaXRfYmFzZShpb19wMnYoTUZQUl9CQVNFKSk7CiAJCW1mcF9pbml0X2FkZHIocHhhOTMwX21mcF9hZGRyX21hcCk7CiAJfQogCisJaWYgKGNwdV9pc19weGE5MzUoKSkKKwkJbWZwX2luaXRfYWRkcihweGE5MzVfbWZwX2FkZHJfbWFwKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYwppbmRleCBkZGEzMTBmLi44MmZmNTczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KQEAgLTI0LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9jb3JnaV9sY2QuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvc2hhcnBzbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0xMTEsNiArMTEzLDI2IEBACiAJR1BJTzEwNV9HUElPLAkvKiBTUElUWl9HUElPX0NGX0lSUSAqLwogCUdQSU8xMDZfR1BJTywJLyogU1BJVFpfR1BJT19DRjJfSVJRICovCiAKKwkvKiBHUElPIG1hdHJpeCBrZXlwYWQgKi8KKwlHUElPODhfR1BJTywJLyogY29sdW1uIDAgKi8KKwlHUElPMjNfR1BJTywJLyogY29sdW1uIDEgKi8KKwlHUElPMjRfR1BJTywJLyogY29sdW1uIDIgKi8KKwlHUElPMjVfR1BJTywJLyogY29sdW1uIDMgKi8KKwlHUElPMjZfR1BJTywJLyogY29sdW1uIDQgKi8KKwlHUElPMjdfR1BJTywJLyogY29sdW1uIDUgKi8KKwlHUElPNTJfR1BJTywJLyogY29sdW1uIDYgKi8KKwlHUElPMTAzX0dQSU8sCS8qIGNvbHVtbiA3ICovCisJR1BJTzEwN19HUElPLAkvKiBjb2x1bW4gOCAqLworCUdQSU8xMDhfR1BJTywJLyogY29sdW1uIDkgKi8KKwlHUElPMTE0X0dQSU8sCS8qIGNvbHVtbiAxMCAqLworCUdQSU8xMl9HUElPLAkvKiByb3cgMCAqLworCUdQSU8xN19HUElPLAkvKiByb3cgMSAqLworCUdQSU85MV9HUElPLAkvKiByb3cgMiAqLworCUdQSU8zNF9HUElPLAkvKiByb3cgMyAqLworCUdQSU8zNl9HUElPLAkvKiByb3cgNCAqLworCUdQSU8zOF9HUElPLAkvKiByb3cgNSAqLworCUdQSU8zOV9HUElPLAkvKiByb3cgNiAqLworCiAJLyogSTJDICovCiAJR1BJTzExN19JMkNfU0NMLAogCUdQSU8xMThfSTJDX1NEQSwKQEAgLTI0Miw5ICsyNjQsMTUyIEBACiAvKgogICogU3BpdHogS2V5Ym9hcmQgRGV2aWNlCiAgKi8KKyNkZWZpbmUgU1BJVFpfS0VZX0NBTEVOREFSCUtFWV9GMQorI2RlZmluZSBTUElUWl9LRVlfQUREUkVTUwlLRVlfRjIKKyNkZWZpbmUgU1BJVFpfS0VZX0ZOCQlLRVlfRjMKKyNkZWZpbmUgU1BJVFpfS0VZX0NBTkNFTAlLRVlfRjQKKyNkZWZpbmUgU1BJVFpfS0VZX0VYT0sJCUtFWV9GNQorI2RlZmluZSBTUElUWl9LRVlfRVhDQU5DRUwJS0VZX0Y2CisjZGVmaW5lIFNQSVRaX0tFWV9FWEpPR0RPV04JS0VZX0Y3CisjZGVmaW5lIFNQSVRaX0tFWV9FWEpPR1VQCUtFWV9GOAorI2RlZmluZSBTUElUWl9LRVlfSkFQMQkJS0VZX0xFRlRBTFQKKyNkZWZpbmUgU1BJVFpfS0VZX0pBUDIJCUtFWV9SSUdIVENUUkwKKyNkZWZpbmUgU1BJVFpfS0VZX1NZTkMJCUtFWV9GOQorI2RlZmluZSBTUElUWl9LRVlfTUFJTAkJS0VZX0YxMAorI2RlZmluZSBTUElUWl9LRVlfT0sJCUtFWV9GMTEKKyNkZWZpbmUgU1BJVFpfS0VZX01FTlUJCUtFWV9GMTIKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHNwaXR6a2JkX2tleW1hcFtdID0geworCUtFWSgwLCAwLCBLRVlfTEVGVENUUkwpLAorCUtFWSgwLCAxLCBLRVlfMSksCisJS0VZKDAsIDIsIEtFWV8zKSwKKwlLRVkoMCwgMywgS0VZXzUpLAorCUtFWSgwLCA0LCBLRVlfNiksCisJS0VZKDAsIDUsIEtFWV83KSwKKwlLRVkoMCwgNiwgS0VZXzkpLAorCUtFWSgwLCA3LCBLRVlfMCksCisJS0VZKDAsIDgsIEtFWV9CQUNLU1BBQ0UpLAorCUtFWSgwLCA5LCBTUElUWl9LRVlfRVhPSyksCS8qIEVYT0sgKi8KKwlLRVkoMCwgMTAsIFNQSVRaX0tFWV9FWENBTkNFTCksCS8qIEVYQ0FOQ0VMICovCisJS0VZKDEsIDEsIEtFWV8yKSwKKwlLRVkoMSwgMiwgS0VZXzQpLAorCUtFWSgxLCAzLCBLRVlfUiksCisJS0VZKDEsIDQsIEtFWV9ZKSwKKwlLRVkoMSwgNSwgS0VZXzgpLAorCUtFWSgxLCA2LCBLRVlfSSksCisJS0VZKDEsIDcsIEtFWV9PKSwKKwlLRVkoMSwgOCwgS0VZX1ApLAorCUtFWSgxLCA5LCBTUElUWl9LRVlfRVhKT0dET1dOKSwJLyogRVhKT0dET1dOICovCisJS0VZKDEsIDEwLCBTUElUWl9LRVlfRVhKT0dVUCksCS8qIEVYSk9HVVAgKi8KKwlLRVkoMiwgMCwgS0VZX1RBQiksCisJS0VZKDIsIDEsIEtFWV9RKSwKKwlLRVkoMiwgMiwgS0VZX0UpLAorCUtFWSgyLCAzLCBLRVlfVCksCisJS0VZKDIsIDQsIEtFWV9HKSwKKwlLRVkoMiwgNSwgS0VZX1UpLAorCUtFWSgyLCA2LCBLRVlfSiksCisJS0VZKDIsIDcsIEtFWV9LKSwKKwlLRVkoMywgMCwgU1BJVFpfS0VZX0FERFJFU1MpLAkvKiBBRERSRVNTICovCisJS0VZKDMsIDEsIEtFWV9XKSwKKwlLRVkoMywgMiwgS0VZX1MpLAorCUtFWSgzLCAzLCBLRVlfRiksCisJS0VZKDMsIDQsIEtFWV9WKSwKKwlLRVkoMywgNSwgS0VZX0gpLAorCUtFWSgzLCA2LCBLRVlfTSksCisJS0VZKDMsIDcsIEtFWV9MKSwKKwlLRVkoMywgOSwgS0VZX1JJR0hUU0hJRlQpLAorCUtFWSg0LCAwLCBTUElUWl9LRVlfQ0FMRU5EQVIpLAkvKiBDQUxFTkRBUiAqLworCUtFWSg0LCAxLCBLRVlfQSksCisJS0VZKDQsIDIsIEtFWV9EKSwKKwlLRVkoNCwgMywgS0VZX0MpLAorCUtFWSg0LCA0LCBLRVlfQiksCisJS0VZKDQsIDUsIEtFWV9OKSwKKwlLRVkoNCwgNiwgS0VZX0RPVCksCisJS0VZKDQsIDgsIEtFWV9FTlRFUiksCisJS0VZKDQsIDksIEtFWV9MRUZUU0hJRlQpLAorCUtFWSg1LCAwLCBTUElUWl9LRVlfTUFJTCksCS8qIE1BSUwgKi8KKwlLRVkoNSwgMSwgS0VZX1opLAorCUtFWSg1LCAyLCBLRVlfWCksCisJS0VZKDUsIDMsIEtFWV9NSU5VUyksCisJS0VZKDUsIDQsIEtFWV9TUEFDRSksCisJS0VZKDUsIDUsIEtFWV9DT01NQSksCisJS0VZKDUsIDcsIEtFWV9VUCksCisJS0VZKDUsIDEwLCBTUElUWl9LRVlfRk4pLAkvKiBGTiAqLworCUtFWSg2LCAwLCBLRVlfU1lTUlEpLAorCUtFWSg2LCAxLCBTUElUWl9LRVlfSkFQMSksCS8qIEpBUDEgKi8KKwlLRVkoNiwgMiwgU1BJVFpfS0VZX0pBUDIpLAkvKiBKQVAyICovCisJS0VZKDYsIDMsIFNQSVRaX0tFWV9DQU5DRUwpLAkvKiBDQU5DRUwgKi8KKwlLRVkoNiwgNCwgU1BJVFpfS0VZX09LKSwJLyogT0sgKi8KKwlLRVkoNiwgNSwgU1BJVFpfS0VZX01FTlUpLAkvKiBNRU5VICovCisJS0VZKDYsIDYsIEtFWV9MRUZUKSwKKwlLRVkoNiwgNywgS0VZX0RPV04pLAorCUtFWSg2LCA4LCBLRVlfUklHSFQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgc3BpdHprYmRfa2V5bWFwX2RhdGEgPSB7CisJLmtleW1hcAkJPSBzcGl0emtiZF9rZXltYXAsCisJLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRShzcGl0emtiZF9rZXltYXApLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IHNwaXR6a2JkX3Jvd19ncGlvc1tdID0KKwkJeyAxMiwgMTcsIDkxLCAzNCwgMzYsIDM4LCAzOSB9Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IHNwaXR6a2JkX2NvbF9ncGlvc1tdID0KKwkJeyA4OCwgMjMsIDI0LCAyNSwgMjYsIDI3LCA1MiwgMTAzLCAxMDcsIDEwOCwgMTE0IH07CisKK3N0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleXBhZF9wbGF0Zm9ybV9kYXRhIHNwaXR6a2JkX3BkYXRhID0geworCS5rZXltYXBfZGF0YQkJPSAmc3BpdHprYmRfa2V5bWFwX2RhdGEsCisJLnJvd19ncGlvcwkJPSBzcGl0emtiZF9yb3dfZ3Bpb3MsCisJLmNvbF9ncGlvcwkJPSBzcGl0emtiZF9jb2xfZ3Bpb3MsCisJLm51bV9yb3dfZ3Bpb3MJCT0gQVJSQVlfU0laRShzcGl0emtiZF9yb3dfZ3Bpb3MpLAorCS5udW1fY29sX2dwaW9zCQk9IEFSUkFZX1NJWkUoc3BpdHprYmRfY29sX2dwaW9zKSwKKwkuY29sX3NjYW5fZGVsYXlfdXMJPSAxMCwKKwkuZGVib3VuY2VfbXMJCT0gMTAsCisJLndha2V1cAkJCT0gMSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaXR6a2JkX2RldmljZSA9IHsKLQkubmFtZQkJPSAic3BpdHota2V5Ym9hcmQiLAorCS5uYW1lCQk9ICJtYXRyaXgta2V5cGFkIiwKIAkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaXR6a2JkX3BkYXRhLAorCX0sCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBzcGl0el9ncGlvX2tleXNbXSA9IHsKKwl7CisJCS50eXBlCT0gRVZfUFdSLAorCQkuY29kZQk9IEtFWV9TVVNQRU5ELAorCQkuZ3Bpbwk9IFNQSVRaX0dQSU9fT05fS0VZLAorCQkuZGVzYwk9ICJPbi9PZmYiLAorCQkud2FrZXVwCT0gMSwKKwl9LAorCS8qIFR3byBidXR0b25zIGRldGVjdGluZyB0aGUgbGlkIHN0YXRlICovCisJeworCQkudHlwZQk9IEVWX1NXLAorCQkuY29kZQk9IDAsCisJCS5ncGlvCT0gU1BJVFpfR1BJT19TV0EsCisJCS5kZXNjCT0gIu+7v0Rpc3BsYXkgRG93biIsCisJfSwKKwl7CisJCS50eXBlCT0gRVZfU1csCisJCS5jb2RlCT0gMSwKKwkJLmdwaW8JPSBTUElUWl9HUElPX1NXQiwKKwkJLmRlc2MJPSAi77u/TGlkIENsb3NlZCIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgc3BpdHpfZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBzcGl0el9ncGlvX2tleXMsCisJLm5idXR0b25zCT0gQVJSQVlfU0laRShzcGl0el9ncGlvX2tleXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3BpdHpfZ3Bpb19rZXlzX2RldmljZSA9IHsKKwkubmFtZQk9ICJncGlvLWtleXMiLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNwaXR6X2dwaW9fa2V5c19wbGF0Zm9ybV9kYXRhLAorCX0sCiB9OwogCiAKQEAgLTI5Niw2ICs0NjEsNyBAQAogCS52cmVmX2RlbGF5X3VzZWNzCT0gMTAwLAogCS54X3BsYXRlX29obXMJCT0gNDE5LAogCS55X3BsYXRlX29obXMJCT0gNDg2LAorCS5wcmVzc3VyZV9tYXgJCT0gMTAyNCwKIAkuZ3Bpb19wZW5kb3duCQk9IFNQSVRaX0dQSU9fVFBfSU5ULAogCS53YWl0X2Zvcl9zeW5jCQk9IHNwaXR6X3dhaXRfZm9yX2hzeW5jLAogfTsKQEAgLTM3OCw0NSArNTQ0LDYgQEAKICAqIFRoZSBjYXJkIGRldGVjdCBpbnRlcnJ1cHQgaXNuJ3QgZGVib3VuY2VkIHNvIHdlIGRlbGF5IGl0IGJ5IDI1MG1zCiAgKiB0byBnaXZlIHRoZSBjYXJkIGEgY2hhbmNlIHRvIGZ1bGx5IGluc2VydC9lamVjdC4KICAqLwotCi1zdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHNwaXR6X21jaV9wbGF0Zm9ybV9kYXRhOwotCi1zdGF0aWMgaW50IHNwaXR6X21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBzcGl0el9kZXRlY3RfaW50LCB2b2lkICpkYXRhKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBncGlvX3JlcXVlc3QoU1BJVFpfR1BJT19uU0RfREVURUNULCAiblNEX0RFVEVDVCIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dDsKLQotCWVyciA9IGdwaW9fcmVxdWVzdChTUElUWl9HUElPX25TRF9XUCwgIm5TRF9XUCIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWVfMTsKLQotCWdwaW9fZGlyZWN0aW9uX2lucHV0KFNQSVRaX0dQSU9fblNEX0RFVEVDVCk7Ci0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoU1BJVFpfR1BJT19uU0RfV1ApOwotCi0Jc3BpdHpfbWNpX3BsYXRmb3JtX2RhdGEuZGV0ZWN0X2RlbGF5ID0gbXNlY3NfdG9famlmZmllcygyNTApOwotCi0JZXJyID0gcmVxdWVzdF9pcnEoU1BJVFpfSVJRX0dQSU9fblNEX0RFVEVDVCwgc3BpdHpfZGV0ZWN0X2ludCwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9SSVNJTkcgfAotCQkJICBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCSAgIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCIlczogTU1DL1NEOiBjYW4ndCByZXF1ZXN0IE1NQyBjYXJkIGRldGVjdCBJUlFcbiIsCi0JCQkJX19mdW5jX18pOwotCQlnb3RvIGVycl9mcmVlXzI7Ci0JfQotCXJldHVybiAwOwotCi1lcnJfZnJlZV8yOgotCWdwaW9fZnJlZShTUElUWl9HUElPX25TRF9XUCk7Ci1lcnJfZnJlZV8xOgotCWdwaW9fZnJlZShTUElUWl9HUElPX25TRF9ERVRFQ1QpOwotZXJyX291dDoKLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgdm9pZCBzcGl0el9tY2lfc2V0cG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdmRkKQogewogCXN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSogcF9kID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwpAQCAtNDI3LDI0ICs1NTQsMTIgQEAKIAkJc3BpdHpfY2FyZF9wd3JfY3RybChTUElUWl9QV1JfU0QsIDB4MDAwMCk7CiB9CiAKLXN0YXRpYyBpbnQgc3BpdHpfbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKFNQSVRaX0dQSU9fblNEX1dQKTsKLX0KLQotc3RhdGljIHZvaWQgc3BpdHpfbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCWZyZWVfaXJxKFNQSVRaX0lSUV9HUElPX25TRF9ERVRFQ1QsIGRhdGEpOwotCWdwaW9fZnJlZShTUElUWl9HUElPX25TRF9XUCk7Ci0JZ3Bpb19mcmVlKFNQSVRaX0dQSU9fblNEX0RFVEVDVCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgc3BpdHpfbWNpX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAotCS5pbml0IAkJPSBzcGl0el9tY2lfaW5pdCwKLQkuZ2V0X3JvCQk9IHNwaXR6X21jaV9nZXRfcm8sCi0JLnNldHBvd2VyIAk9IHNwaXR6X21jaV9zZXRwb3dlciwKLQkuZXhpdAkJPSBzcGl0el9tY2lfZXhpdCwKKwkub2NyX21hc2sJCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAorCS5zZXRwb3dlciAJCT0gc3BpdHpfbWNpX3NldHBvd2VyLAorCS5ncGlvX2NhcmRfZGV0ZWN0CT0gU1BJVFpfR1BJT19uU0RfREVURUNULAorCS5ncGlvX2NhcmRfcm8JCT0gU1BJVFpfR1BJT19uU0RfV1AsCisJLmdwaW9fcG93ZXIJCT0gLTEsCiB9OwogCiAKQEAgLTQ4NCw1MCArNTk5LDEwIEBACiAvKgogICogSXJkYQogICovCi1zdGF0aWMgaW50IHNwaXR6X2lyZGFfc3RhcnR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBncGlvX3JlcXVlc3QoU1BJVFpfR1BJT19JUl9PTiwgIklyREEgb24iKTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyOwotCi0JcmMgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoU1BJVFpfR1BJT19JUl9PTiwgMSk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9kaXI7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2RpcjoKLQlncGlvX2ZyZWUoU1BJVFpfR1BJT19JUl9PTik7Ci1lcnI6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBzcGl0el9pcmRhX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlncGlvX2ZyZWUoU1BJVFpfR1BJT19JUl9PTik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNwaXR6X2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQotewotCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fSVJfT04sIG1vZGUgJiBJUl9PRkYpOwotCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTUFDSF9BS0lUQQotc3RhdGljIHZvaWQgYWtpdGFfaXJkYV90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoQUtJVEFfR1BJT19JUl9PTiwgbW9kZSAmIElSX09GRik7Ci0JcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoZGV2LCBtb2RlKTsKLX0KLSNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHB4YWZpY3BfcGxhdGZvcm1fZGF0YSBzcGl0el9maWNwX3BsYXRmb3JtX2RhdGEgPSB7CisvKiAuZ3Bpb19wd2Rvd24gaXMgc2V0IGluIHNwaXR6X2luaXQoKSBhbmQgYWtpdGFfaW5pdCgpIGFjY29yZGluZ2x5ICovCiAJLnRyYW5zY2VpdmVyX2NhcAk9IElSX1NJUk1PREUgfCBJUl9PRkYsCi0JLnRyYW5zY2VpdmVyX21vZGUJPSBzcGl0el9pcmRhX3RyYW5zY2VpdmVyX21vZGUsCi0JLnN0YXJ0dXAJCT0gc3BpdHpfaXJkYV9zdGFydHVwLAotCS5zaHV0ZG93bgkJPSBzcGl0el9pcmRhX3NodXRkb3duLAogfTsKIAogCkBAIC02NTIsNiArNzI3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmc3BpdHpzY29vcF9kZXZpY2UsCiAJJnNwaXR6a2JkX2RldmljZSwKKwkmc3BpdHpfZ3Bpb19rZXlzX2RldmljZSwKIAkmc3BpdHpsZWRfZGV2aWNlLAogCSZzaGFycHNsX25hbmRfZGV2aWNlLAogCSZzaGFycHNsX3JvbV9kZXZpY2UsCkBAIC02OTUsNiArNzcxLDcgQEAKIAlzcGl0el9pbml0X3NwaSgpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CisJc3BpdHpfbWNpX3BsYXRmb3JtX2RhdGEuZGV0ZWN0X2RlbGF5ID0gbXNlY3NfdG9famlmZmllcygyNTApOwogCXB4YV9zZXRfbWNpX2luZm8oJnNwaXR6X21jaV9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X29oY2lfaW5mbygmc3BpdHpfb2hjaV9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X2ZpY3BfaW5mbygmc3BpdHpfZmljcF9wbGF0Zm9ybV9kYXRhKTsKQEAgLTcwNSw2ICs3ODIsOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfU1BJVFopIHx8IGRlZmluZWQoQ09ORklHX01BQ0hfQk9SWk9JKQogc3RhdGljIHZvaWQgX19pbml0IHNwaXR6X2luaXQodm9pZCkKIHsKKwlzcGl0el9maWNwX3BsYXRmb3JtX2RhdGEuZ3Bpb19wd2Rvd24gPSBTUElUWl9HUElPX0lSX09OOworCiAJcGxhdGZvcm1fc2Nvb3BfY29uZmlnID0gJnNwaXR6X3BjbWNpYV9jb25maWc7CiAKIAljb21tb25faW5pdCgpOwpAQCAtNzQ3LDcgKzgyNiw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBha2l0YV9pbml0KHZvaWQpCiB7Ci0Jc3BpdHpfZmljcF9wbGF0Zm9ybV9kYXRhLnRyYW5zY2VpdmVyX21vZGUgPSBha2l0YV9pcmRhX3RyYW5zY2VpdmVyX21vZGU7CisJc3BpdHpfZmljcF9wbGF0Zm9ybV9kYXRhLmdwaW9fcHdkb3duID0gQUtJVEFfR1BJT19JUl9PTjsKIAogCXNoYXJwc2xfbmFuZF9wbGF0Zm9ybV9kYXRhLmJhZGJsb2NrX3BhdHRlcm4gPSAmc2hhcnBzbF9ha2l0YV9iYnQ7CiAJc2hhcnBzbF9uYW5kX3BsYXRmb3JtX2RhdGEuZWNjX2xheW91dCA9ICZha2l0YV9vb2JpbmZvOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdG9zYS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvdG9zYS5jCmluZGV4IDExN2FkNTkuLmU4MWE1MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3Rvc2EuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMKQEAgLTI0Nyw0OSArMjQ3LDEwIEBACiAvKgogICogTU1DL1NEIERldmljZQogICovCi1zdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHRvc2FfbWNpX3BsYXRmb3JtX2RhdGE7Ci0KIHN0YXRpYyBpbnQgdG9zYV9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgdG9zYV9kZXRlY3RfaW50LCB2b2lkICpkYXRhKQogewogCWludCBlcnI7CiAKLQl0b3NhX21jaV9wbGF0Zm9ybV9kYXRhLmRldGVjdF9kZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKLQotCWVyciA9IGdwaW9fcmVxdWVzdChUT1NBX0dQSU9fblNEX0RFVEVDVCwgIk1NQy9TRCBjYXJkIGRldGVjdCIpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0b3NhX21jaV9pbml0OiBjYW4ndCByZXF1ZXN0IG5TRF9ERVRFQ1QgZ3Bpb1xuIik7Ci0JCWdvdG8gZXJyX2dwaW9fZGV0ZWN0OwotCX0KLQllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChUT1NBX0dQSU9fblNEX0RFVEVDVCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZ3Bpb19kZXRlY3RfZGlyOwotCi0JZXJyID0gcmVxdWVzdF9pcnEoVE9TQV9JUlFfR1BJT19uU0RfREVURUNULCB0b3NhX2RldGVjdF9pbnQsCi0JCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCi0JCQkJIk1NQy9TRCBjYXJkIGRldGVjdCIsIGRhdGEpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0b3NhX21jaV9pbml0OiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIik7Ci0JCWdvdG8gZXJyX2lycTsKLQl9Ci0KLQllcnIgPSBncGlvX3JlcXVlc3QoVE9TQV9HUElPX1NEX1dQLCAiU0QgV3JpdGUgUHJvdGVjdCIpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0b3NhX21jaV9pbml0OiBjYW4ndCByZXF1ZXN0IFNEX1dQIGdwaW9cbiIpOwotCQlnb3RvIGVycl9ncGlvX3dwOwotCX0KLQllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChUT1NBX0dQSU9fU0RfV1ApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2dwaW9fd3BfZGlyOwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KFRPU0FfR1BJT19QV1JfT04sICJTRCBQb3dlciIpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0b3NhX21jaV9pbml0OiBjYW4ndCByZXF1ZXN0IFNEX1BXUiBncGlvXG4iKTsKLQkJZ290byBlcnJfZ3Bpb19wd3I7Ci0JfQotCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChUT1NBX0dQSU9fUFdSX09OLCAwKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9ncGlvX3B3cl9kaXI7Ci0KIAllcnIgPSBncGlvX3JlcXVlc3QoVE9TQV9HUElPX25TRF9JTlQsICJTRCBJbnQiKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidG9zYV9tY2lfaW5pdDogY2FuJ3QgcmVxdWVzdCBTRF9QV1IgZ3Bpb1xuIik7CkBAIC0zMDQsNTEgKzI2NSwyMSBAQAogZXJyX2dwaW9faW50X2RpcjoKIAlncGlvX2ZyZWUoVE9TQV9HUElPX25TRF9JTlQpOwogZXJyX2dwaW9faW50OgotZXJyX2dwaW9fcHdyX2RpcjoKLQlncGlvX2ZyZWUoVE9TQV9HUElPX1BXUl9PTik7Ci1lcnJfZ3Bpb19wd3I6Ci1lcnJfZ3Bpb193cF9kaXI6Ci0JZ3Bpb19mcmVlKFRPU0FfR1BJT19TRF9XUCk7Ci1lcnJfZ3Bpb193cDoKLQlmcmVlX2lycShUT1NBX0lSUV9HUElPX25TRF9ERVRFQ1QsIGRhdGEpOwotZXJyX2lycToKLWVycl9ncGlvX2RldGVjdF9kaXI6Ci0JZ3Bpb19mcmVlKFRPU0FfR1BJT19uU0RfREVURUNUKTsKLWVycl9ncGlvX2RldGVjdDoKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCB0b3NhX21jaV9zZXRwb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2ZGQpCi17Ci0Jc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhKiBwX2QgPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoKCAxIDw8IHZkZCkgJiBwX2QtPm9jcl9tYXNrKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlKFRPU0FfR1BJT19QV1JfT04sIDEpOwotCX0gZWxzZSB7Ci0JCWdwaW9fc2V0X3ZhbHVlKFRPU0FfR1BJT19QV1JfT04sIDApOwotCX0KLX0KLQotc3RhdGljIGludCB0b3NhX21jaV9nZXRfcm8oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBncGlvX2dldF92YWx1ZShUT1NBX0dQSU9fU0RfV1ApOwotfQotCiBzdGF0aWMgdm9pZCB0b3NhX21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlncGlvX2ZyZWUoVE9TQV9HUElPX25TRF9JTlQpOwotCWdwaW9fZnJlZShUT1NBX0dQSU9fUFdSX09OKTsKLQlncGlvX2ZyZWUoVE9TQV9HUElPX1NEX1dQKTsKLQlmcmVlX2lycShUT1NBX0lSUV9HUElPX25TRF9ERVRFQ1QsIGRhdGEpOwotCWdwaW9fZnJlZShUT1NBX0dQSU9fblNEX0RFVEVDVCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgdG9zYV9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkub2NyX21hc2sgICAgICAgPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCi0JLmluaXQgICAgICAgICAgID0gdG9zYV9tY2lfaW5pdCwKLQkuZ2V0X3JvCQk9IHRvc2FfbWNpX2dldF9ybywKLQkuc2V0cG93ZXIgICAgICAgPSB0b3NhX21jaV9zZXRwb3dlciwKLQkuZXhpdCAgICAgICAgICAgPSB0b3NhX21jaV9leGl0LAorCS5vY3JfbWFzayAgICAgICAJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLmluaXQgICAgICAgICAgIAk9IHRvc2FfbWNpX2luaXQsCisJLmV4aXQgICAgICAgICAgIAk9IHRvc2FfbWNpX2V4aXQsCisJLmdwaW9fY2FyZF9kZXRlY3QJPSBUT1NBX0dQSU9fblNEX0RFVEVDVCwKKwkuZ3Bpb19jYXJkX3JvCQk9IFRPU0FfR1BJT19TRF9XUCwKKwkuZ3Bpb19wb3dlcgkJPSBUT1NBX0dQSU9fUFdSX09OLAogfTsKIAogLyoKQEAgLTQwNiwxMCArMzM3LDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIHRvc2FfZmljcF9wbGF0Zm9ybV9kYXRhID0gewotCS50cmFuc2NlaXZlcl9jYXAgID0gSVJfU0lSTU9ERSB8IElSX09GRiwKLQkudHJhbnNjZWl2ZXJfbW9kZSA9IHRvc2FfaXJkYV90cmFuc2NlaXZlcl9tb2RlLAotCS5zdGFydHVwID0gdG9zYV9pcmRhX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gdG9zYV9pcmRhX3NodXRkb3duLAorCS5ncGlvX3B3ZG93bgkJPSAtMSwKKwkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX09GRiwKKwkudHJhbnNjZWl2ZXJfbW9kZQk9IHRvc2FfaXJkYV90cmFuc2NlaXZlcl9tb2RlLAorCS5zdGFydHVwCQk9IHRvc2FfaXJkYV9zdGFydHVwLAorCS5zaHV0ZG93bgkJPSB0b3NhX2lyZGFfc2h1dGRvd24sCiB9OwogCiAvKgpAQCAtOTEwLDYgKzg0Miw3IEBACiAJZHVtbXkgPSBncGlvY2hpcF9yZXNlcnZlKFRPU0FfU0NPT1BfSkNfR1BJT19CQVNFLCAxMik7CiAJZHVtbXkgPSBncGlvY2hpcF9yZXNlcnZlKFRPU0FfVEM2MzkzWEJfR1BJT19CQVNFLCAxNik7CiAKKwl0b3NhX21jaV9wbGF0Zm9ybV9kYXRhLmRldGVjdF9kZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKIAlweGFfc2V0X21jaV9pbmZvKCZ0b3NhX21jaV9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X3VkY19pbmZvKCZ1ZGNfaW5mbyk7CiAJcHhhX3NldF9maWNwX2luZm8oJnRvc2FfZmljcF9wbGF0Zm9ybV9kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3RyZW82ODAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3RyZW82ODAuYwppbmRleCA3NTNlYzRkLi5mZTA4NTA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS90cmVvNjgwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdHJlbzY4MC5jCkBAIC0xNTMsODcgKzE1MywxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU0QvTU1DIGNhcmQgY29udHJvbGxlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgdHJlbzY4MF9tY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCWlycV9oYW5kbGVyX3QgdHJlbzY4MF9kZXRlY3RfaW50LCB2b2lkICpkYXRhKQotewotCWludCBlcnIgPSAwOwotCi0JLyogU2V0dXAgYW4gaW50ZXJydXB0IGZvciBkZXRlY3RpbmcgY2FyZCBpbnNlcnQvcmVtb3ZlIGV2ZW50cyAqLwotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPX05SX1RSRU82ODBfU0RfREVURUNUX04sICJTRCBJUlEiKTsKLQotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwotCi0JZXJyID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJT19OUl9UUkVPNjgwX1NEX0RFVEVDVF9OKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjI7Ci0KLQllcnIgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShHUElPX05SX1RSRU82ODBfU0RfREVURUNUX04pLAotCQkJdHJlbzY4MF9kZXRlY3RfaW50LCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TQU1QTEVfUkFORE9NIHwKLQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJCSJTRC9NTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQotCWlmIChlcnIpIHsKLQkJZGV2X2VycihkZXYsICIlczogY2Fubm90IHJlcXVlc3QgU0QvTU1DIGNhcmQgZGV0ZWN0IElSUVxuIiwKLQkJCSAgICAgX19mdW5jX18pOwotCQlnb3RvIGVycjI7Ci0JfQotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfVFJFTzY4MF9TRF9QT1dFUiwgIlNEX1BPV0VSIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnIzOwotCi0JZXJyID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTlJfVFJFTzY4MF9TRF9QT1dFUiwgMSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnI0OwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfVFJFTzY4MF9TRF9SRUFET05MWSwgIlNEX1JFQURPTkxZIik7Ci0JaWYgKGVycikKLQkJZ290byBlcnI0OwotCi0JZXJyID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJT19OUl9UUkVPNjgwX1NEX1JFQURPTkxZKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjU7Ci0KLQlyZXR1cm4gMDsKLQotZXJyNToKLQlncGlvX2ZyZWUoR1BJT19OUl9UUkVPNjgwX1NEX1JFQURPTkxZKTsKLWVycjQ6Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfVFJFTzY4MF9TRF9QT1dFUik7Ci1lcnIzOgotCWZyZWVfaXJxKGdwaW9fdG9faXJxKEdQSU9fTlJfVFJFTzY4MF9TRF9ERVRFQ1RfTiksIGRhdGEpOwotZXJyMjoKLQlncGlvX2ZyZWUoR1BJT19OUl9UUkVPNjgwX1NEX0RFVEVDVF9OKTsKLWVycjoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCB0cmVvNjgwX21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlncGlvX2ZyZWUoR1BJT19OUl9UUkVPNjgwX1NEX1JFQURPTkxZKTsKLQlncGlvX2ZyZWUoR1BJT19OUl9UUkVPNjgwX1NEX1BPV0VSKTsKLQlmcmVlX2lycShncGlvX3RvX2lycShHUElPX05SX1RSRU82ODBfU0RfREVURUNUX04pLCBkYXRhKTsKLQlncGlvX2ZyZWUoR1BJT19OUl9UUkVPNjgwX1NEX0RFVEVDVF9OKTsKLX0KLQotc3RhdGljIHZvaWQgdHJlbzY4MF9tY2lfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdmRkKQotewotCXN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSAqcF9kID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfVFJFTzY4MF9TRF9QT1dFUiwgcF9kLT5vY3JfbWFzayAmICgxIDw8IHZkZCkpOwotfQotCi1zdGF0aWMgaW50IHRyZW82ODBfbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEdQSU9fTlJfVFJFTzY4MF9TRF9SRUFET05MWSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgdHJlbzY4MF9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKLQkuc2V0cG93ZXIJPSB0cmVvNjgwX21jaV9wb3dlciwKLQkuZ2V0X3JvCQk9IHRyZW82ODBfbWNpX2dldF9ybywKLQkuaW5pdCAJCT0gdHJlbzY4MF9tY2lfaW5pdCwKLQkuZXhpdAkJPSB0cmVvNjgwX21jaV9leGl0LAorCS5vY3JfbWFzawkJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKKwkuZ3Bpb19jYXJkX2RldGVjdAk9IEdQSU9fTlJfVFJFTzY4MF9TRF9ERVRFQ1RfTiwKKwkuZ3Bpb19jYXJkX3JvCQk9IEdQSU9fTlJfVFJFTzY4MF9TRF9SRUFET05MWSwKKwkuZ3Bpb19wb3dlcgkJPSBHUElPX05SX1RSRU82ODBfU0RfUE9XRVIsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMzAsMTYgKzI1NCw5IEBACiAJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTlJfVFJFTzY4MF9CTF9QT1dFUiwgMCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnIyOwotCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX05SX1RSRU82ODBfTENEX1BPV0VSLCAiTENEIFBPV0VSIik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnIyOwotCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1RSRU82ODBfTENEX1BPV0VSLCAwKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjM7CiAKIAlyZXR1cm4gMDsKLWVycjM6Ci0JZ3Bpb19mcmVlKEdQSU9fTlJfVFJFTzY4MF9MQ0RfUE9XRVIpOworCiBlcnIyOgogCWdwaW9fZnJlZShHUElPX05SX1RSRU82ODBfQkxfUE9XRVIpOwogZXJyOgpAQCAtMzU1LDcgKzI3Miw2IEBACiBzdGF0aWMgdm9pZCB0cmVvNjgwX2JhY2tsaWdodF9leGl0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlncGlvX2ZyZWUoR1BJT19OUl9UUkVPNjgwX0JMX1BPV0VSKTsKLQlncGlvX2ZyZWUoR1BJT19OUl9UUkVPNjgwX0xDRF9QT1dFUik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHRyZW82ODBfYmFja2xpZ2h0X2RhdGEgPSB7CkBAIC0zNzksNDQgKzI5NSw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJckRBCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdHJlbzY4MF90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9UUkVPNjgwX0lSX0VOLCBtb2RlICYgSVJfT0ZGKTsKLQlweGEyeHhfdHJhbnNjZWl2ZXJfbW9kZShkZXYsIG1vZGUpOwotfQotCi1zdGF0aWMgaW50IHRyZW82ODBfaXJkYV9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfVFJFTzY4MF9JUl9FTiwgIklyIHBvcnQgZGlzYWJsZSIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyMTsKLQotCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1RSRU82ODBfSVJfRU4sIDEpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyMjsKLQotCXJldHVybiAwOwotCi1lcnIyOgotCWRldl9lcnIoZGV2LCAidHJlbzY4MF9pcmRhOiBjYW5ub3QgY2hhbmdlIElSIGdwaW8gZGlyZWN0aW9uXG4iKTsKLQlncGlvX2ZyZWUoR1BJT19OUl9UUkVPNjgwX0lSX0VOKTsKLWVycjE6Ci0JZGV2X2VycihkZXYsICJ0cmVvNjgwX2lyZGE6IGNhbm5vdCBhbGxvY2F0ZSBJUiBncGlvXG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCB0cmVvNjgwX2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQotewotCWdwaW9fZnJlZShHUElPX05SX1RSRU82ODBfSVJfRU4pOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YWZpY3BfcGxhdGZvcm1fZGF0YSB0cmVvNjgwX2ZpY3BfaW5mbyA9IHsKLQkudHJhbnNjZWl2ZXJfY2FwICA9IElSX0ZJUk1PREUgfCBJUl9TSVJNT0RFIHwgSVJfT0ZGLAotCS5zdGFydHVwICAgICAgICAgID0gdHJlbzY4MF9pcmRhX3N0YXJ0dXAsCi0JLnNodXRkb3duICAgICAgICAgPSB0cmVvNjgwX2lyZGFfc2h1dGRvd24sCi0JLnRyYW5zY2VpdmVyX21vZGUgPSB0cmVvNjgwX3RyYW5zY2VpdmVyX21vZGUsCisJLmdwaW9fcHdkb3duCQk9IEdQSU9fTlJfVFJFTzY4MF9JUl9FTiwKKwkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX09GRiwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU0Niw2ICs0MjcsMTEgQEAKIH0sCiB9OwogCitzdGF0aWMgdm9pZCB0cmVvNjgwX2xjZF9wb3dlcihpbnQgb24sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqaW5mbykKK3sKKwlncGlvX3NldF92YWx1ZShHUElPX05SX1RSRU82ODBfQkxfUE9XRVIsIG9uKTsKK30KKwogc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gdHJlbzY4MF9sY2Rfc2NyZWVuID0gewogCS5tb2RlcwkJPSB0cmVvNjgwX2xjZF9tb2RlcywKIAkubnVtX21vZGVzCT0gQVJSQVlfU0laRSh0cmVvNjgwX2xjZF9tb2RlcyksCkBAIC01ODUsMTEgKzQ3MSwzMiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHRyZW82ODBfbGNkX3Bvd2VyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfVFJFTzY4MF9MQ0RfUE9XRVIsICJMQ0QgUE9XRVIiKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVHJlbzY4MDogTENEIHBvd2VyIEdQSU8gcmVxdWVzdCBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1RSRU82ODBfTENEX1BPV0VSLCAwKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVHJlbzY4MDogc2V0dGluZyBMQ0QgcG93ZXIgR1BJTyBkaXJlY3Rpb24gZmFpbGVkIVxuIik7CisJCWdwaW9fZnJlZShHUElPX05SX1RSRU82ODBfTENEX1BPV0VSKTsKKwkJcmV0dXJuOworCX0KKworCXRyZW82ODBfbGNkX3NjcmVlbi5weGFmYl9sY2RfcG93ZXIgPSB0cmVvNjgwX2xjZF9wb3dlcjsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IHRyZW82ODBfaW5pdCh2b2lkKQogewogCXRyZW82ODBfcG1faW5pdCgpOwogCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKHRyZW82ODBfcGluX2NvbmZpZykpOwogCXB4YV9zZXRfa2V5cGFkX2luZm8oJnRyZW82ODBfa2V5cGFkX3BsYXRmb3JtX2RhdGEpOworCXRyZW82ODBfbGNkX3Bvd2VyX2luaXQoKTsKIAlzZXRfcHhhX2ZiX2luZm8oJnRyZW82ODBfbGNkX3NjcmVlbik7CiAJcHhhX3NldF9tY2lfaW5mbygmdHJlbzY4MF9tY2lfcGxhdGZvcm1fZGF0YSk7CiAJdHJlbzY4MF91ZGNfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMKaW5kZXggODI1ZjU0MC4uMzk4MWUwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS90cml6ZXBzNC5jCkBAIC0zNjcsNiArMzY3LDkgQEAKIAkuZXhpdAkJPSB0cml6ZXBzNF9tY2lfZXhpdCwKIAkuZ2V0X3JvCQk9IE5VTEwsCS8qIHdyaXRlLXByb3RlY3Rpb24gbm90IHN1cHBvcnRlZCAqLwogCS5zZXRwb3dlciAJPSBOVUxMLAkvKiBwb3dlci1zd2l0Y2hpbmcgbm90IHN1cHBvcnRlZCAqLworCS5ncGlvX2NhcmRfZGV0ZWN0ID0gLTEsCisJLmdwaW9fY2FyZF9ybwk9IC0xLAorCS5ncGlvX3Bvd2VyCT0gLTEsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDEyLDYgKzQxNSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIHRyaXplcHM0X2ZpY3BfcGxhdGZvcm1fZGF0YSA9IHsKKwkuZ3Bpb19wd2Rvd24JCT0gLTEsCiAJLnRyYW5zY2VpdmVyX2NhcAk9IElSX1NJUk1PREUgfCBJUl9GSVJNT0RFIHwgSVJfT0ZGLAogCS50cmFuc2NlaXZlcl9tb2RlCT0gdHJpemVwczRfaXJkYV90cmFuc2NlaXZlcl9tb2RlLAogCS5zdGFydHVwCQk9IHRyaXplcHM0X2lyZGFfc3RhcnR1cCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQ3OWNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jCkBAIC0wLDAgKzEsMTg3IEBACisvKiAgbGludXgvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jCisgKgorICogIFN1cHBvcnQgZm9yIHRoZSBJc2tyYXRlbCBFbGVjdHJvbmljcyBYQ0VQIHBsYXRmb3JtIGFzIHVzZWQgaW4KKyAqICB0aGUgTGliZXJhIGluc3RydW1lbnRzIGZyb20gSW5zdHJ1bWVudGF0aW9uIFRlY2hub2xvZ2llcy4KKyAqCisgKiAgQXV0aG9yOiAgICAgQWxlcyBCYXJkb3JmZXIgPGFsZXNAaS10ZWNoLnNpPgorICogIENvbnRyaWJ1dGlvbnMgYnk6IEFiYm90dCwgTUcgKE1pY2hhZWwpIDxtaWNoYWVsLmFiYm90dEBkaWFtb25kLmFjLnVrPgorICogIENvbnRyaWJ1dGlvbnMgYnk6IE1hdGVqIEtlbmRhIDxtYXRlai5rZW5kYUBpLXRlY2guc2k+CisgKiAgQ3JlYXRlZDogICAgSnVuZSAyMDA2CisgKiAgQ29weXJpZ2h0OiAgKEMpIDIwMDYtMjAwOSBJbnN0cnVtZW50YXRpb24gVGVjaG5vbG9naWVzCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8cGxhdC9pMmMuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKyNkZWZpbmUgWENFUF9FVEhfUEhZUwkJKFBYQV9DUzNfUEhZUyArIDB4MDAwMDAzMDApCisjZGVmaW5lIFhDRVBfRVRIX1BIWVNfRU5ECShQWEFfQ1MzX1BIWVMgKyAweDAwMGZmZmZmKQorI2RlZmluZSBYQ0VQX0VUSF9BVFRSCQkoUFhBX0NTM19QSFlTICsgMHgwMjAwMDAwMCkKKyNkZWZpbmUgWENFUF9FVEhfQVRUUl9FTkQJKFBYQV9DUzNfUEhZUyArIDB4MDIwZmZmZmYpCisjZGVmaW5lIFhDRVBfRVRIX0lSUQkJSVJRX0dQSU8wCisKKy8qICBYQ0VQIENQTEQgYmFzZSAqLworI2RlZmluZSBYQ0VQX0NQTERfQkFTRQkJMHhmMDAwMDAwMAorCisKKy8qIEZsYXNoIHBhcnRpdGlvbnMuICovCisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiB4Y2VwX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lID0JCSJCb290bG9hZGVyIiwKKwkJLnNpemUgPQkJMHgwMDA0MDAwMCwKKwkJLm9mZnNldCA9CTAsCisJCS5tYXNrX2ZsYWdzID0JTVREX1dSSVRFQUJMRQorCX0sIHsKKwkJLm5hbWUgPQkJIkJvb3Rsb2FkZXIgRU5WIiwKKwkJLnNpemUgPQkJMHgwMDA0MDAwMCwKKwkJLm9mZnNldCA9CTB4MDAwNDAwMDAsCisJCS5tYXNrX2ZsYWdzID0JTVREX1dSSVRFQUJMRQorCX0sIHsKKwkJLm5hbWUgPQkJIktlcm5lbCIsCisJCS5zaXplID0JCTB4MDAxMDAwMDAsCisJCS5vZmZzZXQgPQkweDAwMDgwMDAwLAorCX0sIHsKKwkJLm5hbWUgPQkJIlJlc2N1ZSBmcyIsCisJCS5zaXplID0JCTB4MDAyODAwMDAsCisJCS5vZmZzZXQgPQkweDAwMTgwMDAwLAorCX0sIHsKKwkJLm5hbWUgPQkJIkZpbGVzeXN0ZW0iLAorCQkuc2l6ZSA9CQlNVERQQVJUX1NJWl9GVUxMLAorCQkub2Zmc2V0ID0JMHgwMDQwMDAwMAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHhjZXBfZmxhc2hfZGF0YVtdID0geworCXsKKwkJLndpZHRoCQk9IDQsCQkvKiBiYW5rd2lkdGggaW4gYnl0ZXMgKi8KKwkJLnBhcnRzCQk9IHhjZXBfcGFydGl0aW9ucywKKwkJLm5yX3BhcnRzCT0gQVJSQVlfU0laRSh4Y2VwX3BhcnRpdGlvbnMpCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSBQWEFfQ1MwX1BIWVMsCisJLmVuZAk9IFBYQV9DUzBfUEhZUyArIFNaXzMyTSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCT0gMCwKKwkuZGV2IAk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSB4Y2VwX2ZsYXNoX2RhdGEsCisJfSwKKwkucmVzb3VyY2UgPSAmZmxhc2hfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorfTsKKworCisKKy8qIFNNQyBMQU45MUMxMTEgbmV0d29yayBjb250cm9sbGVyLiAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gInNtYzkxeC1yZWdzIiwKKwkJLnN0YXJ0CT0gWENFUF9FVEhfUEhZUywKKwkJLmVuZAk9IFhDRVBfRVRIX1BIWVNfRU5ELAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gWENFUF9FVEhfSVJRLAorCQkuZW5kCT0gWENFUF9FVEhfSVJRLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLm5hbWUJPSAic21jOTF4LWF0dHJpYiIsCisJCS5zdGFydAk9IFhDRVBfRVRIX0FUVFIsCisJCS5lbmQJPSBYQ0VQX0VUSF9BVFRSX0VORCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHhjZXBfc21jOTF4X2luZm8gPSB7CisJLmZsYWdzCT0gU01DOTFYX1VTRV8zMkJJVCB8IFNNQzkxWF9OT1dBSVQgfCBTTUM5MVhfVVNFX0RNQSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZ4Y2VwX3NtYzkxeF9pbmZvLAorCX0sCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZmxhc2hfZGV2aWNlLAorCSZzbWM5MXhfZGV2aWNlLAorfTsKKworCisvKiBXZSBoYXZlIHRvIHN0YXRlIHRoYXQgdGhlcmUgYXJlIEhXTU9OIGRldmljZXMgb24gdGhlIEkyQyBidXMgb24gWENFUC4KKyAqIERyaXZlcnMgZm9yIEhXTU9OIHZlcmlmeSBjYXBhYmlsaXRpZXMgb2YgdGhlIGFkYXB0ZXIgd2hlbiBsb2FkaW5nIGFuZAorICogcmVmdXNlIHRvIGF0dGFjaCBpZiB0aGUgYWRhcHRlciBkb2Vzbid0IHN1cHBvcnQgSFdNT04gY2xhc3Mgb2YgZGV2aWNlcy4KKyAqIFNlZSBhbHNvIERvY3VtZW50YXRpb24vaTJjL3BvcnRpbmctY2xpZW50cy4gKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX3B4YV9wbGF0Zm9ybV9kYXRhIHhjZXBfaTJjX3BsYXRmb3JtX2RhdGEgID0geworCS5jbGFzcyA9IEkyQ19DTEFTU19IV01PTgorfTsKKworCitzdGF0aWMgbWZwX2NmZ190IHhjZXBfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJR1BJTzc5X25DU18zLAkvKiBTTUMgOTFDMTExIGNoaXAgc2VsZWN0LiAqLworCUdQSU84MF9uQ1NfNCwJLyogQ1BMRCBjaGlwIHNlbGVjdC4gKi8KKwkvKiBTU1AgY29tbXVuaWNhdGlvbiB0byBNU1A0MzAgKi8KKwlHUElPMjNfU1NQMV9TQ0xLLAorCUdQSU8yNF9TU1AxX1NGUk0sCisJR1BJTzI1X1NTUDFfVFhELAorCUdQSU8yNl9TU1AxX1JYRCwKKwlHUElPMjdfU1NQMV9FWFRDTEsKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4Y2VwX2luaXQodm9pZCkKK3sKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRSh4Y2VwX3Bpbl9jb25maWcpKTsKKworCS8qIFNlZSBJbnRlbCBYU2NhbGUgRGV2ZWxvcGVyJ3MgR3VpZGUgZm9yIGRldGFpbHMgKi8KKwkvKiBTZXQgUkRGIGFuZCBSRE4gdG8gYXBwcm9wcmlhdGUgdmFsdWVzIChjaGlwIHNlbGVjdCAzIChzbWM5MXgpKSAqLworCU1TQzEgPSAoTVNDMSAmIDB4ZmZmZikgfCAweEQ1NTQwMDAwOworCS8qIFNldCBSREYgYW5kIFJETiB0byBhcHByb3ByaWF0ZSB2YWx1ZXMgKGNoaXAgc2VsZWN0IDUgKGZwZ2EpKSAqLworCU1TQzIgPSAoTVNDMiAmIDB4ZmZmZikgfCAweDcyQTAwMDAwOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoQVJSQVlfQU5EX1NJWkUoZGV2aWNlcykpOworCXB4YV9zZXRfaTJjX2luZm8oJnhjZXBfaTJjX3BsYXRmb3JtX2RhdGEpOworfQorCitNQUNISU5FX1NUQVJUKFhDRVAsICJJc2tyYXRlbCBYQ0VQIikKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0geGNlcF9pbml0LAorCS5tYXBfaW8JCT0gcHhhX21hcF9pbywKKwkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGUuYwppbmRleCAyMThkMjAwLi4wOTc4NGQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlLmMKQEAgLTI5MCw2ICsyOTAsOSBAQAogCS5pbml0IAkJPSB6eWxvbml0ZV9tY2lfaW5pdCwKIAkuZXhpdAkJPSB6eWxvbml0ZV9tY2lfZXhpdCwKIAkuZ2V0X3JvCQk9IHp5bG9uaXRlX21jaV9ybywKKwkuZ3Bpb19jYXJkX2RldGVjdCA9IC0xLAorCS5ncGlvX2NhcmRfcm8JPSAtMSwKKwkuZ3Bpb19wb3dlcgk9IC0xLAogfTsKIAogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSB6eWxvbml0ZV9tY2kyX3BsYXRmb3JtX2RhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCmluZGV4IGRjMzUxOWMuLmEyMDgzYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YV9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgogCiAjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTQ0LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21tYy5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgogCkBAIC0yMzcsMTQgKzIzNywxNCBAQAogCXJldHVybiByZWFkbChSRUFMVklFV19TWVNNQ0kpICYgbWFzazsKIH0KIAotc3RydWN0IG1tY19wbGF0Zm9ybV9kYXRhIHJlYWx2aWV3X21tYzBfcGxhdF9kYXRhID0geworc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMwX3BsYXRfZGF0YSA9IHsKIAkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCiAJLnN0YXR1cwkJPSByZWFsdmlld19tbWNfc3RhdHVzLAogCS5ncGlvX3dwCT0gMTcsCiAJLmdwaW9fY2QJPSAxNiwKIH07CiAKLXN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMxX3BsYXRfZGF0YSA9IHsKK3N0cnVjdCBtbWNpX3BsYXRmb3JtX2RhdGEgcmVhbHZpZXdfbW1jMV9wbGF0X2RhdGEgPSB7CiAJLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAogCS5zdGF0dXMJCT0gcmVhbHZpZXdfbW1jX3N0YXR1cywKIAkuZ3Bpb193cAk9IDE5LApAQCAtMjk2LDMxICsyOTYsMzEgQEAKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAl7CS8qIFVBUlQwICovCi0JCS5kZXZfaWQJCT0gImRldjpmMSIsCisJCS5kZXZfaWQJCT0gImRldjp1YXJ0MCIsCiAJCS5jbGsJCT0gJnJlZjI0X2NsaywKIAl9LCB7CS8qIFVBUlQxICovCi0JCS5kZXZfaWQJCT0gImRldjpmMiIsCisJCS5kZXZfaWQJCT0gImRldjp1YXJ0MSIsCiAJCS5jbGsJCT0gJnJlZjI0X2NsaywKIAl9LCB7CS8qIFVBUlQyICovCi0JCS5kZXZfaWQJCT0gImRldjpmMyIsCisJCS5kZXZfaWQJCT0gImRldjp1YXJ0MiIsCiAJCS5jbGsJCT0gJnJlZjI0X2NsaywKIAl9LCB7CS8qIFVBUlQzICovCi0JCS5kZXZfaWQJCT0gImZwZ2E6MDkiLAorCQkuZGV2X2lkCQk9ICJmcGdhOnVhcnQzIiwKIAkJLmNsawkJPSAmcmVmMjRfY2xrLAogCX0sIHsJLyogS01JMCAqLwotCQkuZGV2X2lkCQk9ICJmcGdhOjA2IiwKKwkJLmRldl9pZAkJPSAiZnBnYTprbWkwIiwKIAkJLmNsawkJPSAmcmVmMjRfY2xrLAogCX0sIHsJLyogS01JMSAqLwotCQkuZGV2X2lkCQk9ICJmcGdhOjA3IiwKKwkJLmRldl9pZAkJPSAiZnBnYTprbWkxIiwKIAkJLmNsawkJPSAmcmVmMjRfY2xrLAogCX0sIHsJLyogTU1DMCAqLwotCQkuZGV2X2lkCQk9ICJmcGdhOjA1IiwKKwkJLmRldl9pZAkJPSAiZnBnYTptbWMwIiwKIAkJLmNsawkJPSAmcmVmMjRfY2xrLAogCX0sIHsJLyogRUI6Q0xDRCAqLwotCQkuZGV2X2lkCQk9ICJkZXY6MjAiLAorCQkuZGV2X2lkCQk9ICJkZXY6Y2xjZCIsCiAJCS5jbGsJCT0gJm9zY3Zjb19jbGssCiAJfSwgewkvKiBQQjpDTENEICovCi0JCS5kZXZfaWQJCT0gImlzc3A6MjAiLAorCQkuZGV2X2lkCQk9ICJpc3NwOmNsY2QiLAogCQkuY2xrCQk9ICZvc2N2Y29fY2xrLAogCX0KIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCmluZGV4IDU5YTMzN2IuLjY5OTY3MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCkBAIC00Nyw4ICs0Nyw4IEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19mbGFzaF9kZXZpY2U7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19jZl9kZXZpY2U7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19pMmNfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMwX3BsYXRfZGF0YTsKLWV4dGVybiBzdHJ1Y3QgbW1jX3BsYXRmb3JtX2RhdGEgcmVhbHZpZXdfbW1jMV9wbGF0X2RhdGE7CitleHRlcm4gc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMwX3BsYXRfZGF0YTsKK2V4dGVybiBzdHJ1Y3QgbW1jaV9wbGF0Zm9ybV9kYXRhIHJlYWx2aWV3X21tYzFfcGxhdF9kYXRhOwogZXh0ZXJuIHN0cnVjdCBjbGNkX2JvYXJkIGNsY2RfcGxhdF9kYXRhOwogZXh0ZXJuIHZvaWQgX19pb21lbSAqZ2ljX2NwdV9iYXNlX2FkZHI7CiBleHRlcm4gdm9pZCBfX2lvbWVtICp0aW1lcjBfdmFfYmFzZTsKQEAgLTYxLDUgKzYxLDUgQEAKIGV4dGVybiBpbnQgcmVhbHZpZXdfZmxhc2hfcmVnaXN0ZXIoc3RydWN0IHJlc291cmNlICpyZXMsIHUzMiBudW0pOwogZXh0ZXJuIGludCByZWFsdmlld19ldGhfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc291cmNlICpyZXMpOwogZXh0ZXJuIGludCByZWFsdmlld191c2JfcmVnaXN0ZXIoc3RydWN0IHJlc291cmNlICpyZXMpOwotCitleHRlcm4gdm9pZCAoKnJlYWx2aWV3X3Jlc2V0KShjaGFyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvYm9hcmQtcGIxMTc2LmggYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ib2FyZC1wYjExNzYuaAppbmRleCA5OGY4ZTdlLi4zNGI4MGI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ib2FyZC1wYjExNzYuaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ib2FyZC1wYjExNzYuaApAQCAtNzMsNCArNzMsOSBAQAogI2RlZmluZSBSRUFMVklFV19QQjExNzZfR0lDX0RJU1RfQkFTRQkJMHgxMDA0MTAwMCAvKiBHSUMgZGlzdHJpYnV0b3IsIG9uIEZQR0EgKi8KICNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X0wyMjBfQkFTRQkJMHgxMDExMDAwMCAvKiBMMjIwIHJlZ2lzdGVycyAqLwogCisvKgorICogQ29udHJvbCByZWdpc3RlciBTWVNfUkVTRVRDVEwgaXMgc2V0IHRvIDEgdG8gZm9yY2UgYSBzb2Z0IHJlc2V0CisgKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1NZU19MT0NLVkFMX1JTVENUTCAgICAweDAxMDAKKwogI2VuZGlmCS8qIF9fQVNNX0FSQ0hfQk9BUkRfUEIxMTc2X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2JvYXJkLXBiMTFtcC5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvYm9hcmQtcGIxMW1wLmgKaW5kZXggZjBkNjhlMC4uN2FiZjkxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvYm9hcmQtcGIxMW1wLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvYm9hcmQtcGIxMW1wLmgKQEAgLTgxLDQgKzgxLDE2IEBACiAjZGVmaW5lIFJFQUxWSUVXX1RDMTFNUF9HSUNfRElTVF9CQVNFCQkweDFGMDAxMDAwCS8qIFRlc3QgY2hpcCBpbnRlcnJ1cHQgY29udHJvbGxlciBkaXN0cmlidXRvciAqLwogI2RlZmluZSBSRUFMVklFV19UQzExTVBfTDIyMF9CQVNFCQkweDFGMDAyMDAwCS8qIEwyMjAgcmVnaXN0ZXJzICovCiAKKyAvKgorICogVmFsdWVzIGZvciBSRUFMVklFV19TWVNfUkVTRVRfQ1RSTAorICovCisjZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9TWVNfQ1RSTF9SRVNFVF9DT05GSUdDTFIgICAgMHgwMQorI2RlZmluZSBSRUFMVklFV19QQjExTVBfU1lTX0NUUkxfUkVTRVRfQ09ORklHSU5JVCAgIDB4MDIKKyNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NZU19DVFJMX1JFU0VUX0RMTFJFU0VUICAgICAweDAzCisjZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9TWVNfQ1RSTF9SRVNFVF9QTExSRVNFVCAgICAgMHgwNAorI2RlZmluZSBSRUFMVklFV19QQjExTVBfU1lTX0NUUkxfUkVTRVRfUE9SICAgICAgICAgIDB4MDUKKyNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NZU19DVFJMX1JFU0VUX0RvQyAgICAgICAgICAweDA2CisKKyNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NZU19DVFJMX0xFRCAgICAgICAgICgxIDw8IDApCisKICNlbmRpZgkvKiBfX0FTTV9BUkNIX0JPQVJEX1BCMTFNUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvcGxhdGZvcm0uaAppbmRleCBjOGY1MDgzLi40ZjQ2YmY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKQEAgLTExOSwxOSArMTE5LDYgQEAKICNkZWZpbmUgUkVBTFZJRVdfU1lTX1RFU1RfT1NDMyAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19URVNUX09TQzNfT0ZGU0VUKQogI2RlZmluZSBSRUFMVklFV19TWVNfVEVTVF9PU0M0ICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX1RFU1RfT1NDNF9PRkZTRVQpCiAKLS8qIAotICogVmFsdWVzIGZvciBSRUFMVklFV19TWVNfUkVTRVRfQ1RSTAotICovCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19DVFJMX1JFU0VUX0NPTkZJR0NMUiAgICAweDAxCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19DVFJMX1JFU0VUX0NPTkZJR0lOSVQgICAweDAyCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19DVFJMX1JFU0VUX0RMTFJFU0VUICAgICAweDAzCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19DVFJMX1JFU0VUX1BMTFJFU0VUICAgICAweDA0Ci0jZGVmaW5lIFJFQUxWSUVXX1NZU19DVFJMX1JFU0VUX1BPUiAgICAgICAgICAweDA1Ci0jZGVmaW5lIFJFQUxWSUVXX1NZU19DVFJMX1JFU0VUX0RvQyAgICAgICAgICAweDA2Ci0KLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0NUUkxfTEVEICAgICAgICAgKDEgPDwgMCkKLQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBSZWFsVmlldyBjb250cm9sIHJlZ2lzdGVycwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNTMsNyArMTQwLDcgQEAKICAqICAgICBTWVNfQ0xELCBTWVNfQk9PVENTCiAgKi8KICNkZWZpbmUgUkVBTFZJRVdfU1lTX0xPQ0tfTE9DS0VEICAgICgxIDw8IDE2KQotI2RlZmluZSBSRUFMVklFV19TWVNfTE9DS1ZBTF9NQVNLCTB4RkZGRgkJLyogd3JpdGUgMHhBMDVGIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgUkVBTFZJRVdfU1lTX0xPQ0tWQUxfTUFTSwkweEEwNUYJICAgICAgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgKi8KIAogLyoKICAqIFJFQUxWSUVXX1NZU19GTEFTSApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCAxYTE1YTQ0Li5hMzBmMmUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CiAKK3ZvaWQgKCpyZWFsdmlld19yZXNldCkoY2hhciBtb2RlKTsKKwogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQogewogCS8qCkBAIC0zNiwxNiArMzgsMTIgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfcmVzZXQoY2hhciBtb2RlLCBjb25zdCBjaGFyICpjbWQpCiB7Ci0Jdm9pZCBfX2lvbWVtICpoZHJfY3RybCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfQkFTRSkgKyBSRUFMVklFV19TWVNfUkVTRVRDVExfT0ZGU0VUOwotCXVuc2lnbmVkIGludCB2YWw7Ci0KIAkvKgogCSAqIFRvIHJlc2V0LCB3ZSBoaXQgdGhlIG9uLWJvYXJkIHJlc2V0IHJlZ2lzdGVyCiAJICogaW4gdGhlIHN5c3RlbSBGUEdBCiAJICovCi0JdmFsID0gX19yYXdfcmVhZGwoaGRyX2N0cmwpOwotCXZhbCB8PSBSRUFMVklFV19TWVNfQ1RSTF9SRVNFVF9DT05GSUdDTFI7Ci0JX19yYXdfd3JpdGVsKHZhbCwgaGRyX2N0cmwpOworCWlmIChyZWFsdmlld19yZXNldCkKKwkJcmVhbHZpZXdfcmVzZXQobW9kZSk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCmluZGV4IGFiZDEzYjQuLjFkNjVlNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwNjEuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL21tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMzcsNyArMzgsNiBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21tYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQtZWIuaD4KQEAgLTE5MywyNyArMTkzLDI3IEBACiAjZGVmaW5lIEVCX1NTUF9ETUEJeyA5LCA4IH0KIAogLyogRlBHQSBQcmltZWNlbGxzICovCi1BTUJBX0RFVklDRShhYWNpLCAgImZwZ2E6MDQiLCBBQUNJLCAgICAgTlVMTCk7Ci1BTUJBX0RFVklDRShtbWMwLCAgImZwZ2E6MDUiLCBNTUNJMCwgICAgJnJlYWx2aWV3X21tYzBfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKGttaTAsICAiZnBnYTowNiIsIEtNSTAsICAgICBOVUxMKTsKLUFNQkFfREVWSUNFKGttaTEsICAiZnBnYTowNyIsIEtNSTEsICAgICBOVUxMKTsKLUFNQkFfREVWSUNFKHVhcnQzLCAiZnBnYTowOSIsIEVCX1VBUlQzLCBOVUxMKTsKK0FNQkFfREVWSUNFKGFhY2ksICAiZnBnYTphYWNpIiwgIEFBQ0ksICAgICBOVUxMKTsKK0FNQkFfREVWSUNFKG1tYzAsICAiZnBnYTptbWMwIiwgIE1NQ0kwLCAgICAmcmVhbHZpZXdfbW1jMF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0Uoa21pMCwgICJmcGdhOmttaTAiLCAgS01JMCwgICAgIE5VTEwpOworQU1CQV9ERVZJQ0Uoa21pMSwgICJmcGdhOmttaTEiLCAgS01JMSwgICAgIE5VTEwpOworQU1CQV9ERVZJQ0UodWFydDMsICJmcGdhOnVhcnQzIiwgRUJfVUFSVDMsIE5VTEwpOwogCiAvKiBEZXZDaGlwIFByaW1lY2VsbHMgKi8KLUFNQkFfREVWSUNFKHNtYywgICAiZGV2OjAwIiwgIEVCX1NNQywgICBOVUxMKTsKLUFNQkFfREVWSUNFKGNsY2QsICAiZGV2OjIwIiwgIEVCX0NMQ0QsICAmY2xjZF9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0UoZG1hYywgICJkZXY6MzAiLCAgRE1BQywgICAgIE5VTEwpOwotQU1CQV9ERVZJQ0Uoc2N0bCwgICJkZXY6ZTAiLCAgU0NUTCwgICAgIE5VTEwpOwotQU1CQV9ERVZJQ0Uod2RvZywgICJkZXY6ZTEiLCAgRUJfV0FUQ0hET0csIE5VTEwpOwotQU1CQV9ERVZJQ0UoZ3BpbzAsICJkZXY6ZTQiLCAgRUJfR1BJTzAsICZncGlvMF9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0UoZ3BpbzEsICJkZXY6ZTUiLCAgR1BJTzEsICAgICZncGlvMV9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0UoZ3BpbzIsICJkZXY6ZTYiLCAgR1BJTzIsICAgICZncGlvMl9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0UocnRjLCAgICJkZXY6ZTgiLCAgRUJfUlRDLCAgIE5VTEwpOwotQU1CQV9ERVZJQ0Uoc2NpMCwgICJkZXY6ZjAiLCAgU0NJLCAgICAgIE5VTEwpOwotQU1CQV9ERVZJQ0UodWFydDAsICJkZXY6ZjEiLCAgRUJfVUFSVDAsIE5VTEwpOwotQU1CQV9ERVZJQ0UodWFydDEsICJkZXY6ZjIiLCAgRUJfVUFSVDEsIE5VTEwpOwotQU1CQV9ERVZJQ0UodWFydDIsICJkZXY6ZjMiLCAgRUJfVUFSVDIsIE5VTEwpOwotQU1CQV9ERVZJQ0Uoc3NwMCwgICJkZXY6ZjQiLCAgRUJfU1NQLCAgIE5VTEwpOworQU1CQV9ERVZJQ0Uoc21jLCAgICJkZXY6c21jIiwgICBFQl9TTUMsICAgTlVMTCk7CitBTUJBX0RFVklDRShjbGNkLCAgImRldjpjbGNkIiwgIEVCX0NMQ0QsICAmY2xjZF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UoZG1hYywgICJkZXY6ZG1hYyIsICBETUFDLCAgICAgTlVMTCk7CitBTUJBX0RFVklDRShzY3RsLCAgImRldjpzY3RsIiwgIFNDVEwsICAgICBOVUxMKTsKK0FNQkFfREVWSUNFKHdkb2csICAiZGV2Ondkb2ciLCAgRUJfV0FUQ0hET0csIE5VTEwpOworQU1CQV9ERVZJQ0UoZ3BpbzAsICJkZXY6Z3BpbzAiLCBFQl9HUElPMCwgJmdwaW8wX3BsYXRfZGF0YSk7CitBTUJBX0RFVklDRShncGlvMSwgImRldjpncGlvMSIsIEdQSU8xLCAgICAmZ3BpbzFfcGxhdF9kYXRhKTsKK0FNQkFfREVWSUNFKGdwaW8yLCAiZGV2OmdwaW8yIiwgR1BJTzIsICAgICZncGlvMl9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UocnRjLCAgICJkZXY6cnRjIiwgICBFQl9SVEMsICAgTlVMTCk7CitBTUJBX0RFVklDRShzY2kwLCAgImRldjpzY2kwIiwgIFNDSSwgICAgICBOVUxMKTsKK0FNQkFfREVWSUNFKHVhcnQwLCAiZGV2OnVhcnQwIiwgRUJfVUFSVDAsIE5VTEwpOworQU1CQV9ERVZJQ0UodWFydDEsICJkZXY6dWFydDEiLCBFQl9VQVJUMSwgTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MiwgImRldjp1YXJ0MiIsIEVCX1VBUlQyLCBOVUxMKTsKK0FNQkFfREVWSUNFKHNzcDAsICAiZGV2OnNzcDAiLCAgRUJfU1NQLCAgIE5VTEwpOwogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlICphbWJhX2RldnNbXSBfX2luaXRkYXRhID0gewogCSZkbWFjX2RldmljZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCmluZGV4IDE3ZmJiMGUuLmE2YmExNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9wbDA2MS5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0zNyw3ICszOCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1wYjExNzYuaD4KQEAgLTE3MCwyOSArMTcwLDI5IEBACiAjZGVmaW5lIFBCMTE3Nl9TU1BfRE1BCQl7IDksIDggfQogCiAvKiBGUEdBIFByaW1lY2VsbHMgKi8KLUFNQkFfREVWSUNFKGFhY2ksCSJmcGdhOjA0IiwJQUFDSSwJCU5VTEwpOwotQU1CQV9ERVZJQ0UobW1jMCwJImZwZ2E6MDUiLAlNTUNJMCwJCSZyZWFsdmlld19tbWMwX3BsYXRfZGF0YSk7Ci1BTUJBX0RFVklDRShrbWkwLAkiZnBnYTowNiIsCUtNSTAsCQlOVUxMKTsKLUFNQkFfREVWSUNFKGttaTEsCSJmcGdhOjA3IiwJS01JMSwJCU5VTEwpOwotQU1CQV9ERVZJQ0UodWFydDMsCSJmcGdhOjA5IiwJUEIxMTc2X1VBUlQzLAlOVUxMKTsKK0FNQkFfREVWSUNFKGFhY2ksCSJmcGdhOmFhY2kiLAlBQUNJLAkJTlVMTCk7CitBTUJBX0RFVklDRShtbWMwLAkiZnBnYTptbWMwIiwJTU1DSTAsCQkmcmVhbHZpZXdfbW1jMF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0Uoa21pMCwJImZwZ2E6a21pMCIsCUtNSTAsCQlOVUxMKTsKK0FNQkFfREVWSUNFKGttaTEsCSJmcGdhOmttaTEiLAlLTUkxLAkJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MywJImZwZ2E6dWFydDMiLAlQQjExNzZfVUFSVDMsCU5VTEwpOwogCiAvKiBEZXZDaGlwIFByaW1lY2VsbHMgKi8KLUFNQkFfREVWSUNFKHNtYywJImRldjowMCIsCVBCMTE3Nl9TTUMsCU5VTEwpOwotQU1CQV9ERVZJQ0Uoc2N0bCwJImRldjplMCIsCVNDVEwsCQlOVUxMKTsKLUFNQkFfREVWSUNFKHdkb2csCSJkZXY6ZTEiLAlQQjExNzZfV0FUQ0hET0csCU5VTEwpOwotQU1CQV9ERVZJQ0UoZ3BpbzAsCSJkZXY6ZTQiLAlQQjExNzZfR1BJTzAsCSZncGlvMF9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0UoZ3BpbzEsCSJkZXY6ZTUiLAlHUElPMSwJCSZncGlvMV9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0UoZ3BpbzIsCSJkZXY6ZTYiLAlHUElPMiwJCSZncGlvMl9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0UocnRjLAkiZGV2OmU4IiwJUEIxMTc2X1JUQywJTlVMTCk7Ci1BTUJBX0RFVklDRShzY2kwLAkiZGV2OmYwIiwJU0NJLAkJTlVMTCk7Ci1BTUJBX0RFVklDRSh1YXJ0MCwJImRldjpmMSIsCVBCMTE3Nl9VQVJUMCwJTlVMTCk7Ci1BTUJBX0RFVklDRSh1YXJ0MSwJImRldjpmMiIsCVBCMTE3Nl9VQVJUMSwJTlVMTCk7Ci1BTUJBX0RFVklDRSh1YXJ0MiwJImRldjpmMyIsCVBCMTE3Nl9VQVJUMiwJTlVMTCk7Ci1BTUJBX0RFVklDRShzc3AwLAkiZGV2OmY0IiwJUEIxMTc2X1NTUCwJTlVMTCk7CitBTUJBX0RFVklDRShzbWMsCSJkZXY6c21jIiwJUEIxMTc2X1NNQywJTlVMTCk7CitBTUJBX0RFVklDRShzY3RsLAkiZGV2OnNjdGwiLAlTQ1RMLAkJTlVMTCk7CitBTUJBX0RFVklDRSh3ZG9nLAkiZGV2Ondkb2ciLAlQQjExNzZfV0FUQ0hET0csCU5VTEwpOworQU1CQV9ERVZJQ0UoZ3BpbzAsCSJkZXY6Z3BpbzAiLAlQQjExNzZfR1BJTzAsCSZncGlvMF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UoZ3BpbzEsCSJkZXY6Z3BpbzEiLAlHUElPMSwJCSZncGlvMV9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UoZ3BpbzIsCSJkZXY6Z3BpbzIiLAlHUElPMiwJCSZncGlvMl9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UocnRjLAkiZGV2OnJ0YyIsCVBCMTE3Nl9SVEMsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc2NpMCwJImRldjpzY2kwIiwJU0NJLAkJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MCwJImRldjp1YXJ0MCIsCVBCMTE3Nl9VQVJUMCwJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MSwJImRldjp1YXJ0MSIsCVBCMTE3Nl9VQVJUMSwJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MiwJImRldjp1YXJ0MiIsCVBCMTE3Nl9VQVJUMiwJTlVMTCk7CitBTUJBX0RFVklDRShzc3AwLAkiZGV2OnNzcDAiLAlQQjExNzZfU1NQLAlOVUxMKTsKIAogLyogUHJpbWVjZWxscyBvbiB0aGUgTkVDIElTU1AgY2hpcCAqLwotQU1CQV9ERVZJQ0UoY2xjZCwJImlzc3A6MjAiLAlQQjExNzZfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKLS8vQU1CQV9ERVZJQ0UoZG1hYywJImlzc3A6MzAiLAlQQjExNzZfRE1BQywJTlVMTCk7CitBTUJBX0RFVklDRShjbGNkLAkiaXNzcDpjbGNkIiwJUEIxMTc2X0NMQ0QsCSZjbGNkX3BsYXRfZGF0YSk7CisvL0FNQkFfREVWSUNFKGRtYWMsCSJpc3NwOmRtYWMiLAlQQjExNzZfRE1BQywJTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFtYmFfZGV2c1tdIF9faW5pdGRhdGEgPSB7CiAvLwkmZG1hY19kZXZpY2UsCkBAIC0yOTAsNiArMjkwLDE2IEBACiAJLmluaXQJCT0gcmVhbHZpZXdfcGIxMTc2X3RpbWVyX2luaXQsCiB9OwogCitzdGF0aWMgdm9pZCByZWFsdmlld19wYjExNzZfcmVzZXQoY2hhciBtb2RlKQoreworCXZvaWQgX19pb21lbSAqaGRyX2N0cmwgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpICsKKwkJUkVBTFZJRVdfU1lTX1JFU0VUQ1RMX09GRlNFVDsKKwl2b2lkIF9faW9tZW0gKnJzdF9oZHJfY3RybCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfQkFTRSkgKworCQlSRUFMVklFV19TWVNfTE9DS19PRkZTRVQ7CisJX19yYXdfd3JpdGVsKFJFQUxWSUVXX1NZU19MT0NLVkFMX01BU0ssIHJzdF9oZHJfY3RybCk7CisJX19yYXdfd3JpdGVsKFJFQUxWSUVXX1BCMTE3Nl9TWVNfTE9DS1ZBTF9SU1RDVEwsIGhkcl9jdHJsKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3BiMTE3Nl9pbml0KHZvaWQpCiB7CiAJaW50IGk7CkBAIC0zMTMsNiArMzIzLDcgQEAKICNpZmRlZiBDT05GSUdfTEVEUwogCWxlZHNfZXZlbnQgPSByZWFsdmlld19sZWRzX2V2ZW50OwogI2VuZGlmCisJcmVhbHZpZXdfcmVzZXQgPSByZWFsdmlld19wYjExNzZfcmVzZXQ7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoUkVBTFZJRVdfUEIxMTc2LCAiQVJNLVJlYWxWaWV3IFBCMTE3NiIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYwppbmRleCBmZGQwNDJiLi4wNzBkMjg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwNjEuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL21tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMzgsNyArMzksNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21tYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQtcGIxMW1wLmg+CkBAIC0xNzIsMjkgKzE3MiwyOSBAQAogI2RlZmluZSBQQjExTVBfU1NQX0RNQQkJeyA5LCA4IH0KIAogLyogRlBHQSBQcmltZWNlbGxzICovCi1BTUJBX0RFVklDRShhYWNpLAkiZnBnYTowNCIsCUFBQ0ksCQlOVUxMKTsKLUFNQkFfREVWSUNFKG1tYzAsCSJmcGdhOjA1IiwJTU1DSTAsCQkmcmVhbHZpZXdfbW1jMF9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0Uoa21pMCwJImZwZ2E6MDYiLAlLTUkwLAkJTlVMTCk7Ci1BTUJBX0RFVklDRShrbWkxLAkiZnBnYTowNyIsCUtNSTEsCQlOVUxMKTsKLUFNQkFfREVWSUNFKHVhcnQzLAkiZnBnYTowOSIsCVBCMTFNUF9VQVJUMywJTlVMTCk7CitBTUJBX0RFVklDRShhYWNpLAkiZnBnYTphYWNpIiwJQUFDSSwJCU5VTEwpOworQU1CQV9ERVZJQ0UobW1jMCwJImZwZ2E6bW1jMCIsCU1NQ0kwLAkJJnJlYWx2aWV3X21tYzBfcGxhdF9kYXRhKTsKK0FNQkFfREVWSUNFKGttaTAsCSJmcGdhOmttaTAiLAlLTUkwLAkJTlVMTCk7CitBTUJBX0RFVklDRShrbWkxLAkiZnBnYTprbWkxIiwJS01JMSwJCU5VTEwpOworQU1CQV9ERVZJQ0UodWFydDMsCSJmcGdhOnVhcnQzIiwJUEIxMU1QX1VBUlQzLAlOVUxMKTsKIAogLyogRGV2Q2hpcCBQcmltZWNlbGxzICovCi1BTUJBX0RFVklDRShzbWMsCSJkZXY6MDAiLAlQQjExTVBfU01DLAlOVUxMKTsKLUFNQkFfREVWSUNFKHNjdGwsCSJkZXY6ZTAiLAlTQ1RMLAkJTlVMTCk7Ci1BTUJBX0RFVklDRSh3ZG9nLAkiZGV2OmUxIiwJUEIxMU1QX1dBVENIRE9HLCBOVUxMKTsKLUFNQkFfREVWSUNFKGdwaW8wLAkiZGV2OmU0IiwJUEIxMU1QX0dQSU8wLAkmZ3BpbzBfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKGdwaW8xLAkiZGV2OmU1IiwJR1BJTzEsCQkmZ3BpbzFfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKGdwaW8yLAkiZGV2OmU2IiwJR1BJTzIsCQkmZ3BpbzJfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKHJ0YywJImRldjplOCIsCVBCMTFNUF9SVEMsCU5VTEwpOwotQU1CQV9ERVZJQ0Uoc2NpMCwJImRldjpmMCIsCVNDSSwJCU5VTEwpOwotQU1CQV9ERVZJQ0UodWFydDAsCSJkZXY6ZjEiLAlQQjExTVBfVUFSVDAsCU5VTEwpOwotQU1CQV9ERVZJQ0UodWFydDEsCSJkZXY6ZjIiLAlQQjExTVBfVUFSVDEsCU5VTEwpOwotQU1CQV9ERVZJQ0UodWFydDIsCSJkZXY6ZjMiLAlQQjExTVBfVUFSVDIsCU5VTEwpOwotQU1CQV9ERVZJQ0Uoc3NwMCwJImRldjpmNCIsCVBCMTFNUF9TU1AsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc21jLAkiZGV2OnNtYyIsCVBCMTFNUF9TTUMsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc2N0bCwJImRldjpzY3RsIiwJU0NUTCwJCU5VTEwpOworQU1CQV9ERVZJQ0Uod2RvZywJImRldjp3ZG9nIiwJUEIxMU1QX1dBVENIRE9HLCBOVUxMKTsKK0FNQkFfREVWSUNFKGdwaW8wLAkiZGV2OmdwaW8wIiwJUEIxMU1QX0dQSU8wLAkmZ3BpbzBfcGxhdF9kYXRhKTsKK0FNQkFfREVWSUNFKGdwaW8xLAkiZGV2OmdwaW8xIiwJR1BJTzEsCQkmZ3BpbzFfcGxhdF9kYXRhKTsKK0FNQkFfREVWSUNFKGdwaW8yLAkiZGV2OmdwaW8yIiwJR1BJTzIsCQkmZ3BpbzJfcGxhdF9kYXRhKTsKK0FNQkFfREVWSUNFKHJ0YywJImRldjpydGMiLAlQQjExTVBfUlRDLAlOVUxMKTsKK0FNQkFfREVWSUNFKHNjaTAsCSJkZXY6c2NpMCIsCVNDSSwJCU5VTEwpOworQU1CQV9ERVZJQ0UodWFydDAsCSJkZXY6dWFydDAiLAlQQjExTVBfVUFSVDAsCU5VTEwpOworQU1CQV9ERVZJQ0UodWFydDEsCSJkZXY6dWFydDEiLAlQQjExTVBfVUFSVDEsCU5VTEwpOworQU1CQV9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQjExTVBfVUFSVDIsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc3NwMCwJImRldjpzc3AwIiwJUEIxMU1QX1NTUCwJTlVMTCk7CiAKIC8qIFByaW1lY2VsbHMgb24gdGhlIE5FQyBJU1NQIGNoaXAgKi8KLUFNQkFfREVWSUNFKGNsY2QsCSJpc3NwOjIwIiwJUEIxMU1QX0NMQ0QsCSZjbGNkX3BsYXRfZGF0YSk7Ci1BTUJBX0RFVklDRShkbWFjLAkiaXNzcDozMCIsCURNQUMsCQlOVUxMKTsKK0FNQkFfREVWSUNFKGNsY2QsCSJpc3NwOmNsY2QiLAlQQjExTVBfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKK0FNQkFfREVWSUNFKGRtYWMsCSJpc3NwOmRtYWMiLAlETUFDLAkJTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFtYmFfZGV2c1tdIF9faW5pdGRhdGEgPSB7CiAJJmRtYWNfZGV2aWNlLApAQCAtMjk5LDYgKzI5OSwyMSBAQAogCS5pbml0CQk9IHJlYWx2aWV3X3BiMTFtcF90aW1lcl9pbml0LAogfTsKIAorc3RhdGljIHZvaWQgcmVhbHZpZXdfcGIxMW1wX3Jlc2V0KGNoYXIgbW9kZSkKK3sKKwl2b2lkIF9faW9tZW0gKmhkcl9jdHJsID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19CQVNFKSArCisJCVJFQUxWSUVXX1NZU19SRVNFVENUTF9PRkZTRVQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCS8qCisJICogVG8gcmVzZXQsIHdlIGhpdCB0aGUgb24tYm9hcmQgcmVzZXQgcmVnaXN0ZXIKKwkgKiBpbiB0aGUgc3lzdGVtIEZQR0EKKwkgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChoZHJfY3RybCk7CisJdmFsIHw9IFJFQUxWSUVXX1BCMTFNUF9TWVNfQ1RSTF9SRVNFVF9DT05GSUdDTFI7CisJX19yYXdfd3JpdGVsKHZhbCwgaGRyX2N0cmwpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgcmVhbHZpZXdfcGIxMW1wX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKQEAgLTMyNCw2ICszMzksNyBAQAogI2lmZGVmIENPTkZJR19MRURTCiAJbGVkc19ldmVudCA9IHJlYWx2aWV3X2xlZHNfZXZlbnQ7CiAjZW5kaWYKKwlyZWFsdmlld19yZXNldCA9IHJlYWx2aWV3X3BiMTFtcF9yZXNldDsKIH0KIAogTUFDSElORV9TVEFSVChSRUFMVklFV19QQjExTVAsICJBUk0tUmVhbFZpZXcgUEIxMU1QQ29yZSIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCmluZGV4IDcwYmJhOTkuLjk0MWJlYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTM0LDcgKzM1LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tbWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0xNjIsMjkgKzE2MiwyOSBAQAogI2RlZmluZSBQQkE4X1NTUF9ETUEJCXsgOSwgOCB9CiAKIC8qIEZQR0EgUHJpbWVjZWxscyAqLwotQU1CQV9ERVZJQ0UoYWFjaSwJImZwZ2E6MDQiLAlBQUNJLAkJTlVMTCk7Ci1BTUJBX0RFVklDRShtbWMwLAkiZnBnYTowNSIsCU1NQ0kwLAkJJnJlYWx2aWV3X21tYzBfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKGttaTAsCSJmcGdhOjA2IiwJS01JMCwJCU5VTEwpOwotQU1CQV9ERVZJQ0Uoa21pMSwJImZwZ2E6MDciLAlLTUkxLAkJTlVMTCk7Ci1BTUJBX0RFVklDRSh1YXJ0MywJImZwZ2E6MDkiLAlQQkE4X1VBUlQzLAlOVUxMKTsKK0FNQkFfREVWSUNFKGFhY2ksCSJmcGdhOmFhY2kiLAlBQUNJLAkJTlVMTCk7CitBTUJBX0RFVklDRShtbWMwLAkiZnBnYTptbWMwIiwJTU1DSTAsCQkmcmVhbHZpZXdfbW1jMF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0Uoa21pMCwJImZwZ2E6a21pMCIsCUtNSTAsCQlOVUxMKTsKK0FNQkFfREVWSUNFKGttaTEsCSJmcGdhOmttaTEiLAlLTUkxLAkJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MywJImZwZ2E6dWFydDMiLAlQQkE4X1VBUlQzLAlOVUxMKTsKIAogLyogRGV2Q2hpcCBQcmltZWNlbGxzICovCi1BTUJBX0RFVklDRShzbWMsCSJkZXY6MDAiLAlQQkE4X1NNQywJTlVMTCk7Ci1BTUJBX0RFVklDRShzY3RsLAkiZGV2OmUwIiwJU0NUTCwJCU5VTEwpOwotQU1CQV9ERVZJQ0Uod2RvZywJImRldjplMSIsCVBCQThfV0FUQ0hET0csIE5VTEwpOwotQU1CQV9ERVZJQ0UoZ3BpbzAsCSJkZXY6ZTQiLAlQQkE4X0dQSU8wLAkmZ3BpbzBfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKGdwaW8xLAkiZGV2OmU1IiwJR1BJTzEsCQkmZ3BpbzFfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKGdwaW8yLAkiZGV2OmU2IiwJR1BJTzIsCQkmZ3BpbzJfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKHJ0YywJImRldjplOCIsCVBCQThfUlRDLAlOVUxMKTsKLUFNQkFfREVWSUNFKHNjaTAsCSJkZXY6ZjAiLAlTQ0ksCQlOVUxMKTsKLUFNQkFfREVWSUNFKHVhcnQwLAkiZGV2OmYxIiwJUEJBOF9VQVJUMCwJTlVMTCk7Ci1BTUJBX0RFVklDRSh1YXJ0MSwJImRldjpmMiIsCVBCQThfVUFSVDEsCU5VTEwpOwotQU1CQV9ERVZJQ0UodWFydDIsCSJkZXY6ZjMiLAlQQkE4X1VBUlQyLAlOVUxMKTsKLUFNQkFfREVWSUNFKHNzcDAsCSJkZXY6ZjQiLAlQQkE4X1NTUCwJTlVMTCk7CitBTUJBX0RFVklDRShzbWMsCSJkZXY6c21jIiwJUEJBOF9TTUMsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc2N0bCwJImRldjpzY3RsIiwJU0NUTCwJCU5VTEwpOworQU1CQV9ERVZJQ0Uod2RvZywJImRldjp3ZG9nIiwJUEJBOF9XQVRDSERPRywgTlVMTCk7CitBTUJBX0RFVklDRShncGlvMCwJImRldjpncGlvMCIsCVBCQThfR1BJTzAsCSZncGlvMF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UoZ3BpbzEsCSJkZXY6Z3BpbzEiLAlHUElPMSwJCSZncGlvMV9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UoZ3BpbzIsCSJkZXY6Z3BpbzIiLAlHUElPMiwJCSZncGlvMl9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UocnRjLAkiZGV2OnJ0YyIsCVBCQThfUlRDLAlOVUxMKTsKK0FNQkFfREVWSUNFKHNjaTAsCSJkZXY6c2NpMCIsCVNDSSwJCU5VTEwpOworQU1CQV9ERVZJQ0UodWFydDAsCSJkZXY6dWFydDAiLAlQQkE4X1VBUlQwLAlOVUxMKTsKK0FNQkFfREVWSUNFKHVhcnQxLAkiZGV2OnVhcnQxIiwJUEJBOF9VQVJUMSwJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MiwJImRldjp1YXJ0MiIsCVBCQThfVUFSVDIsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc3NwMCwJImRldjpzc3AwIiwJUEJBOF9TU1AsCU5VTEwpOwogCiAvKiBQcmltZWNlbGxzIG9uIHRoZSBORUMgSVNTUCBjaGlwICovCi1BTUJBX0RFVklDRShjbGNkLAkiaXNzcDoyMCIsCVBCQThfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKGRtYWMsCSJpc3NwOjMwIiwJRE1BQywJCU5VTEwpOworQU1CQV9ERVZJQ0UoY2xjZCwJImlzc3A6Y2xjZCIsCVBCQThfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKK0FNQkFfREVWSUNFKGRtYWMsCSJpc3NwOmRtYWMiLAlETUFDLAkJTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFtYmFfZGV2c1tdIF9faW5pdGRhdGEgPSB7CiAJJmRtYWNfZGV2aWNlLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJ4LmMKaW5kZXggY2U2YzVkMi4uN2U0YmM2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BieC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTM0LDcgKzM1LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tbWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0xODIsMjkgKzE4MiwyOSBAQAogI2RlZmluZSBQQlhfU1NQX0RNQQkJeyA5LCA4IH0KIAogLyogRlBHQSBQcmltZWNlbGxzICovCi1BTUJBX0RFVklDRShhYWNpLAkiZnBnYTowNCIsCUFBQ0ksCQlOVUxMKTsKLUFNQkFfREVWSUNFKG1tYzAsCSJmcGdhOjA1IiwJTU1DSTAsCQkmcmVhbHZpZXdfbW1jMF9wbGF0X2RhdGEpOwotQU1CQV9ERVZJQ0Uoa21pMCwJImZwZ2E6MDYiLAlLTUkwLAkJTlVMTCk7Ci1BTUJBX0RFVklDRShrbWkxLAkiZnBnYTowNyIsCUtNSTEsCQlOVUxMKTsKLUFNQkFfREVWSUNFKHVhcnQzLAkiZnBnYTowOSIsCVBCWF9VQVJUMywJTlVMTCk7CitBTUJBX0RFVklDRShhYWNpLAkiZnBnYTphYWNpIiwJQUFDSSwJCU5VTEwpOworQU1CQV9ERVZJQ0UobW1jMCwJImZwZ2E6bW1jMCIsCU1NQ0kwLAkJJnJlYWx2aWV3X21tYzBfcGxhdF9kYXRhKTsKK0FNQkFfREVWSUNFKGttaTAsCSJmcGdhOmttaTAiLAlLTUkwLAkJTlVMTCk7CitBTUJBX0RFVklDRShrbWkxLAkiZnBnYTprbWkxIiwJS01JMSwJCU5VTEwpOworQU1CQV9ERVZJQ0UodWFydDMsCSJmcGdhOnVhcnQzIiwJUEJYX1VBUlQzLAlOVUxMKTsKIAogLyogRGV2Q2hpcCBQcmltZWNlbGxzICovCi1BTUJBX0RFVklDRShzbWMsCSJkZXY6MDAiLAlQQlhfU01DLAlOVUxMKTsKLUFNQkFfREVWSUNFKHNjdGwsCSJkZXY6ZTAiLAlTQ1RMLAkJTlVMTCk7Ci1BTUJBX0RFVklDRSh3ZG9nLAkiZGV2OmUxIiwJUEJYX1dBVENIRE9HLCAJTlVMTCk7Ci1BTUJBX0RFVklDRShncGlvMCwJImRldjplNCIsCVBCWF9HUElPMCwJJmdwaW8wX3BsYXRfZGF0YSk7Ci1BTUJBX0RFVklDRShncGlvMSwJImRldjplNSIsCUdQSU8xLAkJJmdwaW8xX3BsYXRfZGF0YSk7Ci1BTUJBX0RFVklDRShncGlvMiwJImRldjplNiIsCUdQSU8yLAkJJmdwaW8yX3BsYXRfZGF0YSk7Ci1BTUJBX0RFVklDRShydGMsCSJkZXY6ZTgiLAlQQlhfUlRDLAlOVUxMKTsKLUFNQkFfREVWSUNFKHNjaTAsCSJkZXY6ZjAiLAlTQ0ksCQlOVUxMKTsKLUFNQkFfREVWSUNFKHVhcnQwLAkiZGV2OmYxIiwJUEJYX1VBUlQwLAlOVUxMKTsKLUFNQkFfREVWSUNFKHVhcnQxLAkiZGV2OmYyIiwJUEJYX1VBUlQxLAlOVUxMKTsKLUFNQkFfREVWSUNFKHVhcnQyLAkiZGV2OmYzIiwJUEJYX1VBUlQyLAlOVUxMKTsKLUFNQkFfREVWSUNFKHNzcDAsCSJkZXY6ZjQiLAlQQlhfU1NQLAlOVUxMKTsKK0FNQkFfREVWSUNFKHNtYywJImRldjpzbWMiLAlQQlhfU01DLAlOVUxMKTsKK0FNQkFfREVWSUNFKHNjdGwsCSJkZXY6c2N0bCIsCVNDVEwsCQlOVUxMKTsKK0FNQkFfREVWSUNFKHdkb2csCSJkZXY6d2RvZyIsCVBCWF9XQVRDSERPRywgCU5VTEwpOworQU1CQV9ERVZJQ0UoZ3BpbzAsCSJkZXY6Z3BpbzAiLAlQQlhfR1BJTzAsCSZncGlvMF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UoZ3BpbzEsCSJkZXY6Z3BpbzEiLAlHUElPMSwJCSZncGlvMV9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UoZ3BpbzIsCSJkZXY6Z3BpbzIiLAlHUElPMiwJCSZncGlvMl9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UocnRjLAkiZGV2OnJ0YyIsCVBCWF9SVEMsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc2NpMCwJImRldjpzY2kwIiwJU0NJLAkJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MCwJImRldjp1YXJ0MCIsCVBCWF9VQVJUMCwJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MSwJImRldjp1YXJ0MSIsCVBCWF9VQVJUMSwJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MiwJImRldjp1YXJ0MiIsCVBCWF9VQVJUMiwJTlVMTCk7CitBTUJBX0RFVklDRShzc3AwLAkiZGV2OnNzcDAiLAlQQlhfU1NQLAlOVUxMKTsKIAogLyogUHJpbWVjZWxscyBvbiB0aGUgTkVDIElTU1AgY2hpcCAqLwotQU1CQV9ERVZJQ0UoY2xjZCwJImlzc3A6MjAiLAlQQlhfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKLUFNQkFfREVWSUNFKGRtYWMsCSJpc3NwOjMwIiwJRE1BQywJCU5VTEwpOworQU1CQV9ERVZJQ0UoY2xjZCwJImlzc3A6Y2xjZCIsCVBCWF9DTENELAkmY2xjZF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0UoZG1hYywJImlzc3A6ZG1hYyIsCURNQUMsCQlOVUxMKTsKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKIAkmZG1hY19kZXZpY2UsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCmluZGV4IGQ4YzAyM2QuLjNkNGU5ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnCkBAIC03Nyw2ICs3Nyw3IEBACiAJc2VsZWN0IENQVV9TM0MyNDEwCiAJc2VsZWN0IFBNX0gxOTQwIGlmIFBNCiAJc2VsZWN0IFMzQ19ERVZfVVNCX0hPU1QKKwlzZWxlY3QgUzNDX0RFVl9OQU5ECiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBIUCBJUEFRIEgxOTQwCiAKQEAgLTg5LDYgKzkwLDcgQEAKIAlib29sICJBY2VyIE4zMCBmYW1pbHkiCiAJc2VsZWN0IENQVV9TM0MyNDEwCiAJc2VsZWN0IFMzQ19ERVZfVVNCX0hPU1QKKwlzZWxlY3QgUzNDX0RFVl9OQU5ECiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwdCBmb3IgdGhlIEFjZXIgTjMwLCBBY2VyIE4zNSwKIAkgIE5hdm1hbiBQaU41NzAsIFlha3VtbyBBbHBoYVggb3IgQWlyaXMgTkMwNSBQREFzLgpAQCAtMTAzLDYgKzEwNSw3IEBACiAJc2VsZWN0IFMzQzI0WFhfRENMSwogCXNlbGVjdCBJU0EKIAlzZWxlY3QgUzNDX0RFVl9VU0JfSE9TVAorCXNlbGVjdCBTM0NfREVWX05BTkQKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIFNpbXRlYyBFbGVjdHJvbmljcyBFQjI0MTBJVFgKIAkgIGRldmVsb3BtZW50IGJvYXJkIChhbHNvIGtub3duIGFzIEJBU1QpCkBAIC0xMTEsNiArMTE0LDcgQEAKICAJYm9vbCAiTmV4VmlzaW9uIE9UT00gQm9hcmQiCiAgCXNlbGVjdCBDUFVfUzNDMjQxMAogCXNlbGVjdCBTM0NfREVWX1VTQl9IT1NUCisJc2VsZWN0IFMzQ19ERVZfTkFORAogCWhlbHAKICAJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIE5leCBWaXNpb24gT1RPTSBib2FyZAogCkBAIC0xNTQsNiArMTU4LDcgQEAKIAlib29sICJRVDI0MTAiCiAJc2VsZWN0IENQVV9TM0MyNDEwCiAJc2VsZWN0IFMzQ19ERVZfVVNCX0hPU1QKKwlzZWxlY3QgUzNDX0RFVl9OQU5ECiAJaGVscAogCSAgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgQXJtem9uZSBRVDI0MTAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9ncGlvLmMKaW5kZXggNzk3NGFmYy4uOTY2NGUwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZ3Bpby5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZm5zLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IGMzYTI2MjkuLjkyZTI2ODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMTEwLDYgKzExMCw4IEBACiAJCQkJCSAgICAqIHdhaXRpbmcgZm9yIHJlbG9hZHMgKi8KICNkZWZpbmUgUzNDMjQxMF9ETUFGX0FVVE9TVEFSVCAgICAoMTw8MSkgICAvKiBhdXRvLXN0YXJ0IGlmIGJ1ZmZlciBxdWV1ZWQgKi8KIAorI2RlZmluZSBTM0MyNDEwX0RNQUZfQ0lSQ1VMQVIJKDEgPDwgMikJLyogbm8gY2lyY3VsYXIgZG1hIHN1cHBvcnQgKi8KKwogLyogZG1hIGJ1ZmZlciAqLwogCiBzdHJ1Y3QgczNjMjQxMF9kbWFfYnVmOwpAQCAtMTk0LDQgKzE5Niw5IEBACiAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBkbWFfZGV2aWNlX3Q7CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBzM2NfZG1hX2hhc19jaXJjdWxhcih2b2lkKQoreworCXJldHVybiBmYWxzZTsKK30KKwogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKaW5kZXggMzVjMWJkZS4uYzJiZGM0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKQEAgLTQ4LDYgKzQ4LDcgQEAKIAlib29sICJMb2dpdGVjaCBKaXZlIgogCXNlbGVjdCBDUFVfUzNDMjQxMgogCXNlbGVjdCBTM0NfREVWX1VTQl9IT1NUCisJc2VsZWN0IFMzQ19ERVZfTkFORAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgTG9naXRlY2ggSml2ZS4KIApAQCAtNjEsNiArNjIsNyBAQAogCXNlbGVjdCBNQUNIX1MzQzI0MTMKIAlzZWxlY3QgTUFDSF9TTURLCiAJc2VsZWN0IFMzQ19ERVZfVVNCX0hPU1QKKwlzZWxlY3QgUzNDX0RFVl9OQU5ECiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIGFuIFNNREsyNDEzCiAKQEAgLTg0LDYgKzg2LDcgQEAKIAlib29sICJWTVNUTVMiCiAJc2VsZWN0IENQVV9TM0MyNDEyCiAJc2VsZWN0IFMzQ19ERVZfVVNCX0hPU1QKKwlzZWxlY3QgUzNDX0RFVl9OQU5ECiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIGFuIFZTVE1TIGJvYXJkCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKaW5kZXggOGFlMWIyOC4uYThiNjlkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKQEAgLTQ4LDYgKzQ4LDcgQEAKIAlzZWxlY3QgUzNDMjQ0MF9YVEFMXzEyMDAwMDAwCiAJc2VsZWN0IFMzQzI0MTBfSU9USU1JTkcgaWYgUzNDMjQ0MF9DUFVGUkVRCiAJc2VsZWN0IFMzQ19ERVZfVVNCX0hPU1QKKwlzZWxlY3QgUzNDX0RFVl9OQU5ECiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBTaW10ZWMgSU0yNDQwRDIwIG1vZHVsZSwgYWxzbwogCSAga25vd24gYXMgdGhlIE9zaXJpcy4KQEAgLTU3LDYgKzU4LDcgQEAKIAlzZWxlY3QgQ1BVX1MzQzI0NDAKIAlzZWxlY3QgUzNDMjQ0MF9YVEFMXzE2OTM0NDAwCiAJc2VsZWN0IFBNX0gxOTQwIGlmIFBNCisJc2VsZWN0IFMzQ19ERVZfTkFORAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgSFAgaVBBUSByeDM3MTUuCiAKQEAgLTY2LDYgKzY4LDcgQEAKIAlzZWxlY3QgUzNDMjQ0MF9YVEFMXzE2OTM0NDAwCiAJc2VsZWN0IE1BQ0hfU01ESwogCXNlbGVjdCBTM0NfREVWX1VTQl9IT1NUCisJc2VsZWN0IFMzQ19ERVZfTkFORAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgU01ESzI0NDAuCiAKQEAgLTc0LDYgKzc3LDcgQEAKICAJc2VsZWN0IENQVV9TM0MyNDQwCiAJc2VsZWN0IFMzQzI0NDBfWFRBTF8xMjAwMDAwMAogCXNlbGVjdCBTM0NfREVWX1VTQl9IT1NUCisJc2VsZWN0IFMzQ19ERVZfTkFORAogCWhlbHAKICAJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIE5leCBWaXNpb24gTkVYQ09ERVIgMjQ0MCBMaWdodCBCb2FyZAogCkBAIC04OCw2ICs5Miw3IEBACiAJYm9vbCAiQXZhbnRlY2ggQVQyNDQwRVZCIGRldmVsb3BtZW50IGJvYXJkIgogCXNlbGVjdCBDUFVfUzNDMjQ0MAogCXNlbGVjdCBTM0NfREVWX1VTQl9IT1NUCisJc2VsZWN0IFMzQ19ERVZfTkFORAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgQVQyNDQwRVZCIGRldmVsb3BtZW50IGJvYXJkCiAKQEAgLTk3LDYgKzEwMiw4IEBACiAJc2VsZWN0IEVFUFJPTV9BVDI0CiAJc2VsZWN0IExFRFNfVFJJR0dFUl9CQUNLTElHSFQKIAlzZWxlY3QgU05EX1MzQzI0WFhfU09DX1MzQzI0WFhfVURBMTM0WAorCXNlbGVjdCBTM0NfREVWX05BTkQKKwlzZWxlY3QgUzNDX0RFVl9VU0JfSE9TVAogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc2VsZWN0IHN1cHBvcnQgZm9yIHRoZSBNSU5JMjQ0MC4gSXMgYSAxMGNtIHggMTBjbSBib2FyZAogCSAgYXZhaWxhYmxlIHZpYSB2YXJpb3VzIHNvdXJjZXMuIEl0IGNhbiBjb21lIHdpdGggYSAzLjUiIG9yIDciIHRvdWNoIExDRC4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1taW5pMjQ0MC5jCmluZGV4IGVjNzFhNjkuLjFjMzM4MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbWluaTI0NDAuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJLnR5cGUJCT0gKFMzQzI0MTBfTENEQ09OMV9URlQxNkJQUCB8XAogCQkJICAgUzNDMjQxMF9MQ0RDT04xX1RGVCkKIAotc3RydWN0IHMzYzI0MTBmYl9kaXNwbGF5IG1pbmkyNDQwX2xjZF9jZmdbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzM2MyNDEwZmJfZGlzcGxheSBtaW5pMjQ0MF9sY2RfY2ZnW10gX19pbml0ZGF0YSA9IHsKIAlbMF0gPSB7CS8qIG1pbmkyNDQwICsgMy41IiBURlQgKyB0b3VjaHNjcmVlbiAqLwogCQlfTENEX0RFQ0xBUkUoCiAJCQk3LAkJCS8qIFRoZSAzLjUgaXMgcXVpdGUgZmFzdCAqLwpAQCAtMTkxLDcgKzE5MSw3IEBACiAjZGVmaW5lIFMzQzI0MTBfR1BDQ09OX01BU0soeCkJKDMgPDwgKCh4KSAqIDIpKQogI2RlZmluZSBTM0MyNDEwX0dQRENPTl9NQVNLKHgpCSgzIDw8ICgoeCkgKiAyKSkKIAotc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gbWluaTI0NDBfZmJfaW5mbyBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvIG1pbmkyNDQwX2ZiX2luZm8gX19pbml0ZGF0YSA9IHsKIAkuZGlzcGxheXMJID0gJm1pbmkyNDQwX2xjZF9jZmdbMF0sIC8qIG5vdCBjb25zdGFudCEgc2VlIGluaXQgKi8KIAkubnVtX2Rpc3BsYXlzCSA9IDEsCiAJLmRlZmF1bHRfZGlzcGxheSA9IDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9LY29uZmlnCmluZGV4IGY1YWYyMTIuLjc3MGI3MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9LY29uZmlnCkBAIC0yNiw2ICsyNiw3IEBACiAgICAgICAgYm9vbCAiU01ESzY0MDAiCiAJc2VsZWN0IENQVV9TM0M2NDAwCiAJc2VsZWN0IFMzQ19ERVZfSFNNTUMKKwlzZWxlY3QgUzNDX0RFVl9OQU5ECiAJc2VsZWN0IFMzQzY0MDBfU0VUVVBfU0RIQ0kKIAloZWxwCiAJICBNYWNoaW5lIHN1cHBvcnQgZm9yIHRoZSBTYW1zdW5nIFNNREs2NDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCAxMDY3NjE5Li4wMDRlZGFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTY4LDYgKzY4LDExIEBACiAKICNkZWZpbmUgUzNDMjQxMF9ETUFGX0NJUkNVTEFSCQkoMSA8PCAwKQogCitzdGF0aWMgaW5saW5lIGJvb2wgczNjX2RtYV9oYXNfY2lyY3VsYXIodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKICNpbmNsdWRlIDxwbGF0L2RtYS5oPgogCiAjZW5kaWYgLyogX19BU01fQVJDSF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzY0MTAvS2NvbmZpZwppbmRleCBmOWQwZjA5Li41M2ZjM2ZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0MTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MTAvS2NvbmZpZwpAQCAtMTAyLDYgKzEwMiw3IEBACiAJYm9vbCAiQWlyZ29vIEhNVCIKIAlzZWxlY3QgQ1BVX1MzQzY0MTAKIAlzZWxlY3QgUzNDX0RFVl9GQgorCXNlbGVjdCBTM0NfREVWX05BTkQKIAlzZWxlY3QgUzNDX0RFVl9VU0JfSE9TVAogCXNlbGVjdCBTM0M2NFhYX1NFVFVQX0ZCXzI0QlBQCiAJc2VsZWN0IEhBVkVfUFdNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvS2NvbmZpZwppbmRleCA4MWZmZmY3Li40ZTVjMDdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL0tjb25maWcKQEAgLTcxLDExICs3MSw2IEBACiAJICA8aHR0cDovL3d3dy5oYW5kaGVsZHMub3JnL0NvbXBhcS9pbmRleC5odG1sI2lQQVFfSDM2MDA+CiAJICA8aHR0cDovL3d3dy5jb21wYXEuY29tL3Byb2R1Y3RzL2hhbmRoZWxkcy9wb2NrZXRwYy8+CiAKLWNvbmZpZyBTQTExMDBfSDNYWFgKLQlib29sCi0JZGVwZW5kcyBvbiBTQTExMDBfSDMxMDAgfHwgU0ExMTAwX0gzNjAwCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBTQTExMDBfQkFER0U0CiAJYm9vbCAiSFAgTGFicyBCYWRnZVBBRCA0IgogCXNlbGVjdCBTQTExMTEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUKaW5kZXggOGE1NTQ2ZS4uYmI3YjgxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUKQEAgLTI1LDYgKzI1LDcgQEAKIAogb2JqLSQoQ09ORklHX1NBMTEwMF9DT0xMSUUpCQkrPSBjb2xsaWUubwogCitvYmotJChDT05GSUdfU0ExMTAwX0gzMTAwKQkJKz0gaDM2MDAubwogb2JqLSQoQ09ORklHX1NBMTEwMF9IMzYwMCkJCSs9IGgzNjAwLm8KIAogb2JqLSQoQ09ORklHX1NBMTEwMF9IQUNLS0lUKQkJKz0gaGFja2tpdC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2RtYS5jCmluZGV4IDk1ZjljNWEuLmNiNDUyMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2RtYS5jCkBAIC0zOSw3ICszOSw3IEBACiAKIHN0YXRpYyBzYTExMDBfZG1hX3QgZG1hX2NoYW5bU0ExMTAwX0RNQV9DSEFOTkVMU107CiAKLXN0YXRpYyBzcGlubG9ja190IGRtYV9saXN0X2xvY2s7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRtYV9saXN0X2xvY2spOwogCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvdGltZS5jCmluZGV4IDk1ZDkyZTguLmI5Y2JiNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkuc2V0X21vZGUJPSBzYTExMDBfb3NtcjBfc2V0X21vZGUsCiB9OwogCi1zdGF0aWMgY3ljbGVfdCBzYTExMDBfcmVhZF9vc2NyKHZvaWQpCitzdGF0aWMgY3ljbGVfdCBzYTExMDBfcmVhZF9vc2NyKHN0cnVjdCBjbG9ja3NvdXJjZSAqcykKIHsKIAlyZXR1cm4gT1NDUjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC11MzAwL0tjb25maWcKaW5kZXggMzM3YjlhYS4uODAxYjIxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL0tjb25maWcKQEAgLTgxLDYgKzgxLDE4IEBACiAJCU1lbW9yeSBJbnRlcmZhY2UpIGZyb20gYm90aCBmcm9tIGFjY2VzcyBhbmQgYXBwbGljYXRpb24KIAkJc2lkZS4KIAorY29uZmlnIE1BQ0hfVTMwMF9TUElEVU1NWQorCWJvb2wgIlNTUC9TUEkgZHVtbXkgY2hpcCIKKwlzZWxlY3QgU1BJCisJc2VsZWN0IFNQSV9NQVNURVIKKwlzZWxlY3QgU1BJX1BMMDIyCisJaGVscAorCQlUaGlzIGNyZWF0ZXMgYSBzbWFsbCBrZXJuZWwgbW9kdWxlIHRoYXQgY3JlYXRlcyBhIGR1bW15CisJCVNQSSBkZXZpY2UgdG8gYmUgdXNlZCBmb3IgbG9vcGJhY2sgdGVzdHMuIFJlZ3VsYXJseSB1c2VkCisJCXRvIHRlc3QgcmVmZXJlbmNlIGRlc2lnbnMuIElmIHlvdSdyZSBub3QgdGVzdGluZyBTUEksCisJCXlvdSBkb24ndCBuZWVkIGl0LiBTZWxlY3RpbmcgdGhpcyB3aWxsIGFjdGl2YXRlIHRoZQorCQlTUEkgZnJhbWV3b3JrIGFuZCBBUk0gUEwwMjIgc3VwcG9ydC4KKwogY29tbWVudCAiQWxsIHRoZSBzZXR0aW5ncyBiZWxvdyBtdXN0IG1hdGNoIHRoZSBib290bG9hZGVyJ3Mgc2V0dGluZ3MiCiAKIGNvbmZpZyBNQUNIX1UzMDBfQUNDRVNTX01FTV9TSVpFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXUzMDAvTWFrZWZpbGUKaW5kZXggMjQ5NTBlMC4uODg1YjVjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9NYWtlZmlsZQpAQCAtOSwzICs5LDYgQEAKIAogb2JqLSQoQ09ORklHX0FSQ0hfVTMwMCkJICAgICAgICAgICs9IHUzMDAubwogb2JqLSQoQ09ORklHX01NQykgICAgICAgICAgICAgICAgICs9IG1tYy5vCitvYmotJChDT05GSUdfU1BJX1BMMDIyKSAgICAgICAgICAgKz0gc3BpLm8KK29iai0kKENPTkZJR19NQUNIX1UzMDBfU1BJRFVNTVkpICArPSBkdW1teXNwaWNoaXAubworb2JqLSQoQ09ORklHX0kyQ19TVFUzMDApICAgICAgICAgICs9IGkyYy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC11MzAwL2NvcmUuYwppbmRleCAyZTliOGNjLi5iZTYwZDZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9jb3JlLmMKQEAgLTMyLDYgKzMyLDggQEAKIAogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAibW1jLmgiCisjaW5jbHVkZSAic3BpLmgiCisjaW5jbHVkZSAiaTJjLmgiCiAKIC8qCiAgKiBTdGF0aWMgSS9PIG1hcHBpbmdzIHRoYXQgYXJlIG5lZWRlZCBmb3IgYm9vdGluZyB0aGUgVTMwMCBwbGF0Zm9ybXMuIFRoZQpAQCAtMzc4LDE0ICszODAsMTQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyYzBfZGV2aWNlID0gewotCS5uYW1lID0gInN0ZGRjaTJjIiwKKwkubmFtZSA9ICJzdHUzMDAiLAogCS5pZCA9IDAsCiAJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGkyYzBfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UgPSBpMmMwX3Jlc291cmNlcywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyYzFfZGV2aWNlID0gewotCS5uYW1lID0gInN0ZGRjaTJjIiwKKwkubmFtZSA9ICJzdHUzMDAiLAogCS5pZCA9IDEsCiAJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGkyYzFfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UgPSBpMmMxX3Jlc291cmNlcywKQEAgLTYxMSw2ICs2MTMsOCBAQAogCS8qIFdhaXQgZm9yIHRoZSBQTEwyMDggdG8gbG9jayBpZiBub3QgbG9ja2VkIGluIHlldCAqLwogCXdoaWxlICghKHJlYWR3KFUzMDBfU1lTQ09OX1ZCQVNFICsgVTMwMF9TWVNDT05fQ1NSKSAmCiAJCSBVMzAwX1NZU0NPTl9DU1JfUExMMjA4X0xPQ0tfSU5EKSk7CisJLyogSW5pdGlhbGl6ZSBTUEkgZGV2aWNlIHdpdGggc29tZSBib2FyZCBzcGVjaWZpY3MgKi8KKwl1MzAwX3NwaV9pbml0KCZwbDAyMl9kZXZpY2UpOwogCiAJLyogUmVnaXN0ZXIgdGhlIEFNQkEgZGV2aWNlcyBpbiB0aGUgQU1CQSBidXMgYWJzdHJhY3Rpb24gbGF5ZXIgKi8KIAl1MzAwX2Nsb2NrX3ByaW1lY2VsbHMoKTsKQEAgLTYyMiw2ICs2MjYsMTIgQEAKIAogCXUzMDBfYXNzaWduX3BoeXNtZW0oKTsKIAorCS8qIFJlZ2lzdGVyIHN1YmRldmljZXMgb24gdGhlIEkyQyBidXNlcyAqLworCXUzMDBfaTJjX3JlZ2lzdGVyX2JvYXJkX2RldmljZXMoKTsKKworCS8qIFJlZ2lzdGVyIHN1YmRldmljZXMgb24gdGhlIFNQSSBidXMgKi8KKwl1MzAwX3NwaV9yZWdpc3Rlcl9ib2FyZF9kZXZpY2VzKCk7CisKIAkvKiBSZWdpc3RlciB0aGUgcGxhdGZvcm0gZGV2aWNlcyAqLwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBsYXRmb3JtX2RldnMsIEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2cykpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvZHVtbXlzcGljaGlwLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvZHVtbXlzcGljaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyZjlkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9kdW1teXNwaWNoaXAuYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdTMwMC9kdW1teXNwaWNoaXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFNULUVyaWNzc29uIEFCCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqIFRoaXMgaXMgYSBkdW1teSBsb29wYmFjayBTUEkgImNoaXAiIHVzZWQgZm9yIHRlc3RpbmcgU1BJLgorICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKy8qCisgKiBXQVJOSU5HISBEbyBub3QgaW5jbHVkZSB0aGlzIHBsMDIyLXNwZWNpZmljIGNvbnRyb2xsZXIgaGVhZGVyCisgKiBmb3IgYW55IGdlbmVyaWMgZHJpdmVyLiBJdCBpcyBvbmx5IGRvbmUgaW4gdGhpcyBkdW1teSBjaGlwCisgKiBiZWNhdXNlIHdlIGFsdGVyIHRoZSBjaGlwIGNvbmZpZ3VyYXRpb24gaW4gb3JkZXIgdG8gdGVzdCBzb21lCisgKiBkaWZmZXJlbnQgc2V0dGluZ3Mgb24gdGhlIGxvb3BiYWNrIGRldmljZS4gTm9ybWFsIGNoaXAgY29uZmlncworICogc2hhbGwgYmUgU1RBVElDIGFuZCBub3QgYWx0ZXJlZCBieSB0aGUgZHJpdmVyIQorICovCisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgorCitzdHJ1Y3QgZHVtbXkgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKKyNkZWZpbmUgRE1BX1RFU1RfU0laRSAyMDQ4CisKKy8qIFdoZW4gd2UgY2F0IC9zeXMvYnVzL3NwaS9kZXZpY2VzL3NwaTAuMC9sb29wdGVzdCB0aGlzIHdpbGwgYmUgdHJpZ2dlcmVkICovCitzdGF0aWMgc3NpemVfdCBkdW1teV9sb29wdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZHVtbXkgKnBfZHVtbXkgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCS8qCisJICogV0FSTklORyEgRG8gbm90IGRlcmVmZXJlbmNlIHRoZSBjaGlwLXNwZWNpZmljIGRhdGEgaW4gYW55IG5vcm1hbAorCSAqIGRyaXZlciBmb3IgYSBjaGlwLiBJdCBpcyB1c3VhbGx5IFNUQVRJQyBhbmQgc2hhbGwgbm90IGJlIHJlYWQKKwkgKiBvciB3cml0dGVuIHRvLiBZb3VyIGNoaXAgZHJpdmVyIHNob3VsZCBOT1QgZGVwZW5kIG9uIGZpZWxkcyBpbiB0aGlzCisJICogc3RydWN0LCB0aGlzIGlzIGp1c3QgdXNlZCBoZXJlIHRvIGFsdGVyIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGNoaXAKKwkgKiBpbiBvcmRlciB0byBwZXJmb3JtIHRlc3RzLgorCSAqLworCXN0cnVjdCBwbDAyMl9jb25maWdfY2hpcCAqY2hpcF9pbmZvID0gc3BpLT5jb250cm9sbGVyX2RhdGE7CisJaW50IHN0YXR1czsKKwl1OCB0eGJ1ZlsxNF0gPSB7MHhERSwgMHhBRCwgMHhCRSwgMHhFRiwgMHgyQiwgMHhBRCwKKwkJCTB4Q0EsIDB4RkUsIDB4QkEsIDB4QkUsIDB4QjEsIDB4MDUsCisJCQkweEYwLCAweDBEfTsKKwl1OCByeGJ1ZlsxNF07CisJdTggKmJpZ3R4YnVmX3ZpcnR1YWw7CisJdTggKmJpZ3J4YnVmX3ZpcnR1YWw7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwX2R1bW15LT5sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWJpZ3R4YnVmX3ZpcnR1YWwgPSBrbWFsbG9jKERNQV9URVNUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChiaWd0eGJ1Zl92aXJ0dWFsID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWJpZ3J4YnVmX3ZpcnR1YWwgPSBrbWFsbG9jKERNQV9URVNUX1NJWkUsIEdGUF9LRVJORUwpOworCisJLyogRmlsbCBUWEJVRiB3aXRoIHNvbWUgaGFwcHkgcGF0dGVybiAqLworCW1lbXNldChiaWd0eGJ1Zl92aXJ0dWFsLCAweEFBLCBETUFfVEVTVF9TSVpFKTsKKworCS8qCisJICogRm9yY2UgY2hpcCB0byA4IGJpdCBtb2RlCisJICogV0FSTklORzogTkVWRVIgRE8gVEhJUyBJTiBSRUFMIERSSVZFUiBDT0RFLCBUSElTIFNIT1VMRCBCRSBTVEFUSUMhCisJICovCisJY2hpcF9pbmZvLT5kYXRhX3NpemUgPSBTU1BfREFUQV9CSVRTXzg7CisJLyogWW91IHNob3VsZCBOT1QgRE8gVEhJUyBFSVRIRVIgKi8KKwlzcGktPm1hc3Rlci0+c2V0dXAoc3BpKTsKKworCS8qIE5vdyBydW4gdGhlIHRlc3RzIGZvciA4Yml0IG1vZGUgKi8KKwlwcl9pbmZvKCJTaW1wbGUgdGVzdCAxOiB3cml0ZSAweEFBIGJ5dGUsIHJlYWQgYmFjayBnYXJiYWdlIGJ5dGUgIgorCQkiaW4gOGJpdCBtb2RlXG4iKTsKKwlzdGF0dXMgPSBzcGlfdzhyOChzcGksIDB4QUEpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcl93YXJuaW5nKCJTaXBsZSB0ZXN0IDE6IEZBSUxVUkU6IHNwaV93cml0ZV90aGVuX3JlYWQgIgorCQkJICAgImZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDE6IFNVQ0NFU1MhXG4iKTsKKworCXByX2luZm8oIlNpbXBsZSB0ZXN0IDI6IHdyaXRlIDggYnl0ZXMsIHJlYWQgYmFjayA4IGJ5dGVzIGdhcmJhZ2UgIgorCQkiaW4gOGJpdCBtb2RlIChmdWxsIEZJRk8pXG4iKTsKKwlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJnR4YnVmWzBdLCA4LCAmcnhidWZbMF0sIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcl93YXJuaW5nKCJTaW1wbGUgdGVzdCAyOiBGQUlMVVJFOiBzcGlfd3JpdGVfdGhlbl9yZWFkKCkgIgorCQkJICAgImZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDI6IFNVQ0NFU1MhXG4iKTsKKworCXByX2luZm8oIlNpbXBsZSB0ZXN0IDM6IHdyaXRlIDE0IGJ5dGVzLCByZWFkIGJhY2sgMTQgYnl0ZXMgZ2FyYmFnZSAiCisJCSJpbiA4Yml0IG1vZGUgKHNlZSBpZiB3ZSBvdmVyZmxvdyBGSUZPKVxuIik7CisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZ0eGJ1ZlswXSwgMTQsICZyeGJ1ZlswXSwgMTQpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcl93YXJuaW5nKCJTaW1wbGUgdGVzdCAzOiBGQUlMVVJFOiBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgIgorCQkJICAgIihwcm9iYWJseSBGSUZPIG92ZXJydW4pXG4iLCBzdGF0dXMpOworCWVsc2UKKwkJcHJfaW5mbygiU2ltcGxlIHRlc3QgMzogU1VDQ0VTUyFcbiIpOworCisJcHJfaW5mbygiU2ltcGxlIHRlc3QgNDogd3JpdGUgOCBieXRlcyB3aXRoIHNwaV93cml0ZSgpLCByZWFkIDggIgorCQkiYnl0ZXMgZ2FyYmFnZSB3aXRoIHNwaV9yZWFkKCkgaW4gOGJpdCBtb2RlXG4iKTsKKwlzdGF0dXMgPSBzcGlfd3JpdGUoc3BpLCAmdHhidWZbMF0sIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcl93YXJuaW5nKCJTaW1wbGUgdGVzdCA0IHN0ZXAgMTogRkFJTFVSRTogc3BpX3dyaXRlKCkgIgorCQkJICAgImZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDQgc3RlcCAxOiBTVUNDRVNTIVxuIik7CisJc3RhdHVzID0gc3BpX3JlYWQoc3BpLCAmcnhidWZbMF0sIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcl93YXJuaW5nKCJTaW1wbGUgdGVzdCA0IHN0ZXAgMjogRkFJTFVSRTogc3BpX3JlYWQoKSAiCisJCQkgICAiZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCWVsc2UKKwkJcHJfaW5mbygiU2ltcGxlIHRlc3QgNCBzdGVwIDI6IFNVQ0NFU1MhXG4iKTsKKworCXByX2luZm8oIlNpbXBsZSB0ZXN0IDU6IHdyaXRlIDE0IGJ5dGVzIHdpdGggc3BpX3dyaXRlKCksIHJlYWQgIgorCQkiMTQgYnl0ZXMgZ2FyYmFnZSB3aXRoIHNwaV9yZWFkKCkgaW4gOGJpdCBtb2RlXG4iKTsKKwlzdGF0dXMgPSBzcGlfd3JpdGUoc3BpLCAmdHhidWZbMF0sIDE0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJfd2FybmluZygiU2ltcGxlIHRlc3QgNSBzdGVwIDE6IEZBSUxVUkU6IHNwaV93cml0ZSgpICIKKwkJCSAgICJmYWlsZWQgd2l0aCBzdGF0dXMgJWQgKHByb2JhYmx5IEZJRk8gb3ZlcnJ1bilcbiIsCisJCQkgICBzdGF0dXMpOworCWVsc2UKKwkJcHJfaW5mbygiU2ltcGxlIHRlc3QgNSBzdGVwIDE6IFNVQ0NFU1MhXG4iKTsKKwlzdGF0dXMgPSBzcGlfcmVhZChzcGksICZyeGJ1ZlswXSwgMTQpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcl93YXJuaW5nKCJTaW1wbGUgdGVzdCA1IHN0ZXAgMjogRkFJTFVSRTogc3BpX3JlYWQoKSAiCisJCQkgICAiZmFpbGVkIHdpdGggc3RhdHVzICVkIChwcm9iYWJseSBGSUZPIG92ZXJydW4pXG4iLAorCQkJICAgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDU6IFNVQ0NFU1MhXG4iKTsKKworCXByX2luZm8oIlNpbXBsZSB0ZXN0IDY6IHdyaXRlICVkIGJ5dGVzIHdpdGggc3BpX3dyaXRlKCksICIKKwkJInJlYWQgJWQgYnl0ZXMgZ2FyYmFnZSB3aXRoIHNwaV9yZWFkKCkgaW4gOGJpdCBtb2RlXG4iLAorCQlETUFfVEVTVF9TSVpFLCBETUFfVEVTVF9TSVpFKTsKKwlzdGF0dXMgPSBzcGlfd3JpdGUoc3BpLCAmYmlndHhidWZfdmlydHVhbFswXSwgRE1BX1RFU1RfU0laRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByX3dhcm5pbmcoIlNpbXBsZSB0ZXN0IDYgc3RlcCAxOiBGQUlMVVJFOiBzcGlfd3JpdGUoKSAiCisJCQkgICAiZmFpbGVkIHdpdGggc3RhdHVzICVkIChwcm9iYWJseSBGSUZPIG92ZXJydW4pXG4iLAorCQkJICAgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDYgc3RlcCAxOiBTVUNDRVNTIVxuIik7CisJc3RhdHVzID0gc3BpX3JlYWQoc3BpLCAmYmlncnhidWZfdmlydHVhbFswXSwgRE1BX1RFU1RfU0laRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByX3dhcm5pbmcoIlNpbXBsZSB0ZXN0IDYgc3RlcCAyOiBGQUlMVVJFOiBzcGlfcmVhZCgpICIKKwkJCSAgICJmYWlsZWQgd2l0aCBzdGF0dXMgJWQgKHByb2JhYmx5IEZJRk8gb3ZlcnJ1bilcbiIsCisJCQkgICBzdGF0dXMpOworCWVsc2UKKwkJcHJfaW5mbygiU2ltcGxlIHRlc3QgNjogU1VDQ0VTUyFcbiIpOworCisKKwkvKgorCSAqIEZvcmNlIGNoaXAgdG8gMTYgYml0IG1vZGUKKwkgKiBXQVJOSU5HOiBORVZFUiBETyBUSElTIElOIFJFQUwgRFJJVkVSIENPREUsIFRISVMgU0hPVUxEIEJFIFNUQVRJQyEKKwkgKi8KKwljaGlwX2luZm8tPmRhdGFfc2l6ZSA9IFNTUF9EQVRBX0JJVFNfMTY7CisJLyogWW91IHNob3VsZCBOT1QgRE8gVEhJUyBFSVRIRVIgKi8KKwlzcGktPm1hc3Rlci0+c2V0dXAoc3BpKTsKKworCXByX2luZm8oIlNpbXBsZSB0ZXN0IDc6IHdyaXRlIDB4QUEgYnl0ZSwgcmVhZCBiYWNrIGdhcmJhZ2UgYnl0ZSAiCisJCSJpbiAxNmJpdCBidXMgbW9kZVxuIik7CisJc3RhdHVzID0gc3BpX3c4cjgoc3BpLCAweEFBKTsKKwlpZiAoc3RhdHVzID09IC1FSU8pCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDc6IFNVQ0NFU1MhIChleHBlY3RlZCBmYWlsdXJlIHdpdGggIgorCQkJInN0YXR1cyBFSU8pXG4iKTsKKwllbHNlIGlmIChzdGF0dXMgPCAwKQorCQlwcl93YXJuaW5nKCJTaXBsZSB0ZXN0IDc6IEZBSUxVUkU6IHNwaV93cml0ZV90aGVuX3JlYWQgIgorCQkJICAgImZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKwllbHNlCisJCXByX3dhcm5pbmcoIlNpcGxlIHRlc3QgNzogRkFJTFVSRTogc3BpX3dyaXRlX3RoZW5fcmVhZCAiCisJCQkgICAic3VjY2VlZGVkIGJ1dCBpdCB3YXMgZXhwZWN0ZWQgdG8gZmFpbCFcbiIpOworCisJcHJfaW5mbygiU2ltcGxlIHRlc3QgODogd3JpdGUgOCBieXRlcywgcmVhZCBiYWNrIDggYnl0ZXMgZ2FyYmFnZSAiCisJCSJpbiAxNmJpdCBtb2RlIChmdWxsIEZJRk8pXG4iKTsKKwlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJnR4YnVmWzBdLCA4LCAmcnhidWZbMF0sIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcl93YXJuaW5nKCJTaW1wbGUgdGVzdCA4OiBGQUlMVVJFOiBzcGlfd3JpdGVfdGhlbl9yZWFkKCkgIgorCQkJICAgImZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDg6IFNVQ0NFU1MhXG4iKTsKKworCXByX2luZm8oIlNpbXBsZSB0ZXN0IDk6IHdyaXRlIDE0IGJ5dGVzLCByZWFkIGJhY2sgMTQgYnl0ZXMgZ2FyYmFnZSAiCisJCSJpbiAxNmJpdCBtb2RlIChzZWUgaWYgd2Ugb3ZlcmZsb3cgRklGTylcbiIpOworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmdHhidWZbMF0sIDE0LCAmcnhidWZbMF0sIDE0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJfd2FybmluZygiU2ltcGxlIHRlc3QgOTogRkFJTFVSRTogZmFpbGVkIHdpdGggc3RhdHVzICVkICIKKwkJCSAgICIocHJvYmFibHkgRklGTyBvdmVycnVuKVxuIiwgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDk6IFNVQ0NFU1MhXG4iKTsKKworCXByX2luZm8oIlNpbXBsZSB0ZXN0IDEwOiB3cml0ZSAlZCBieXRlcyB3aXRoIHNwaV93cml0ZSgpLCAiCisJICAgICAgICJyZWFkICVkIGJ5dGVzIGdhcmJhZ2Ugd2l0aCBzcGlfcmVhZCgpIGluIDE2Yml0IG1vZGVcbiIsCisJICAgICAgIERNQV9URVNUX1NJWkUsIERNQV9URVNUX1NJWkUpOworCXN0YXR1cyA9IHNwaV93cml0ZShzcGksICZiaWd0eGJ1Zl92aXJ0dWFsWzBdLCBETUFfVEVTVF9TSVpFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJfd2FybmluZygiU2ltcGxlIHRlc3QgMTAgc3RlcCAxOiBGQUlMVVJFOiBzcGlfd3JpdGUoKSAiCisJCQkgICAiZmFpbGVkIHdpdGggc3RhdHVzICVkIChwcm9iYWJseSBGSUZPIG92ZXJydW4pXG4iLAorCQkJICAgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDEwIHN0ZXAgMTogU1VDQ0VTUyFcbiIpOworCisJc3RhdHVzID0gc3BpX3JlYWQoc3BpLCAmYmlncnhidWZfdmlydHVhbFswXSwgRE1BX1RFU1RfU0laRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByX3dhcm5pbmcoIlNpbXBsZSB0ZXN0IDEwIHN0ZXAgMjogRkFJTFVSRTogc3BpX3JlYWQoKSAiCisJCQkgICAiZmFpbGVkIHdpdGggc3RhdHVzICVkIChwcm9iYWJseSBGSUZPIG92ZXJydW4pXG4iLAorCQkJICAgc3RhdHVzKTsKKwllbHNlCisJCXByX2luZm8oIlNpbXBsZSB0ZXN0IDEwOiBTVUNDRVNTIVxuIik7CisKKwlzdGF0dXMgPSBzcHJpbnRmKGJ1ZiwgImxvb3AgdGVzdCBjb21wbGV0ZVxuIik7CisJa2ZyZWUoYmlncnhidWZfdmlydHVhbCk7CisJa2ZyZWUoYmlndHhidWZfdmlydHVhbCk7Cisgb3V0OgorCW11dGV4X3VubG9jaygmcF9kdW1teS0+bG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGxvb3B0ZXN0LCBTX0lSVUdPLCBkdW1teV9sb29wdGVzdCwgTlVMTCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBsMDIyX2R1bW15X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGR1bW15ICpwX2R1bW15OworCWludCBzdGF0dXM7CisKKwlkZXZfaW5mbygmc3BpLT5kZXYsICJwcm9iaW5nIGR1bW15IFNQSSBkZXZpY2VcbiIpOworCisJcF9kdW1teSA9IGt6YWxsb2Moc2l6ZW9mICpwX2R1bW15LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfZHVtbXkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgcF9kdW1teSk7CisJbXV0ZXhfaW5pdCgmcF9kdW1teS0+bG9jayk7CisKKwkvKiBzeXNmcyBob29rICovCisJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX2xvb3B0ZXN0KTsKKwlpZiAoc3RhdHVzKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiZGV2aWNlX2NyZWF0ZV9maWxlIGxvb3B0ZXN0IGZhaWx1cmUuXG4iKTsKKwkJZ290byBvdXRfZGV2X2NyZWF0ZV9sb29wdGVzdF9mYWlsZWQ7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9kZXZfY3JlYXRlX2xvb3B0ZXN0X2ZhaWxlZDoKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBOVUxMKTsKKwlrZnJlZShwX2R1bW15KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwbDAyMl9kdW1teV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgZHVtbXkgKnBfZHVtbXkgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWRldl9pbmZvKCZzcGktPmRldiwgInJlbW92aW5nIGR1bW15IFNQSSBkZXZpY2VcbiIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9sb29wdGVzdCk7CisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CisJa2ZyZWUocF9kdW1teSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHBsMDIyX2R1bW15X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJzcGktZHVtbXkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IHBsMDIyX2R1bW15X3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChwbDAyMl9kdW1teV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGwwMjJfaW5pdF9kdW1teSh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZwbDAyMl9kdW1teV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGwwMjJfZXhpdF9kdW1teSh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmcGwwMjJfZHVtbXlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGwwMjJfaW5pdF9kdW1teSk7Cittb2R1bGVfZXhpdChwbDAyMl9leGl0X2R1bW15KTsKKworTU9EVUxFX0FVVEhPUigiTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUEwwMjIgU1NQL1NQSSBEVU1NWSBMaW51eCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvZ3Bpby5jCmluZGV4IDMwOGNkYjEuLjBiMzU4MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2dwaW8uYwpAQCAtMjUsMTEgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKLS8qIE5lZWQgYWNjZXNzIHRvIFNZU0NPTiByZWdpc3RlcnMgZm9yIFBBRG11eGluZyAqLwotI2luY2x1ZGUgPG1hY2gvc3lzY29uLmg+Ci0KLSNpbmNsdWRlICJwYWRtdXguaCIKLQogLyogUmVmZXJlbmNlIHRvIEdQSU8gYmxvY2sgY2xvY2sgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGs7CiAKQEAgLTI4Niw2ICsyODEsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZ3Bpb191bnJlZ2lzdGVyX2NhbGxiYWNrKTsKIAorLyogTm9uLXplcm8gbWVhbnMgdmFsaWQgKi8KK2ludCBncGlvX2lzX3ZhbGlkKGludCBudW1iZXIpCit7CisJaWYgKG51bWJlciA+PSAwICYmCisJICAgIG51bWJlciA8IChVMzAwX0dQSU9fTlVNX1BPUlRTICogVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb19pc192YWxpZCk7CisKIGludCBncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpCiB7CiAJaWYgKGdwaW9fcGluW2dwaW9dLnVzZXJzKQpAQCAtNjA2LDE0ICs2MTEsNiBAQAogCXdyaXRlbChVMzAwX0dQSU9fQ1JfQkxPQ0tfQ0xLUlFfRU5BQkxFLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19DUik7CiAjZW5kaWYKIAotCS8qIFNldCB1cCBzb21lIHBhZG11eGluZyBoZXJlICovCi0jaWZkZWYgQ09ORklHX01NQwotCXBteF9zZXRfbWlzc2lvbl9tb2RlX21tYygpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NQSV9QTDAyMgotCXBteF9zZXRfbWlzc2lvbl9tb2RlX3NwaSgpOwotI2VuZGlmCi0KIAlncGlvX3NldF9pbml0aWFsX3ZhbHVlcygpOwogCiAJZm9yIChudW1faXJxcyA9IDAgOyBudW1faXJxcyA8IFUzMDBfR1BJT19OVU1fUE9SVFM7IG51bV9pcnFzKyspIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9pMmMuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGJlMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2kyYy5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLXUzMDAvaTJjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU1QtRXJpY3Nzb24gQUIKKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICoKKyAqIFJlZ2lzdGVyIGJvYXJkIGkyYyBkZXZpY2VzCisgKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGJ1czBfaTJjX2JvYXJkX2luZm9bXSA9IHsKKwl7CisJCS50eXBlID0gImFiMzEwMCIsCisJCS5hZGRyID0gMHg0OCwKKwkJLmlycSA9IElSUV9VMzAwX0lSUTBfRVhULAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgYnVzMV9pMmNfYm9hcmRfaW5mb1tdID0geworI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMzMzUKKwl7CisJCS50eXBlID0gImZ3Y2FtIiwKKwkJLmFkZHIgPSAweDEwLAorCX0sCisJeworCQkudHlwZSA9ICJmd2NhbSIsCisJCS5hZGRyID0gMHg1ZCwKKwl9LAorI2Vsc2UKKwl7IH0sCisjZW5kaWYKK307CisKK3ZvaWQgX19pbml0IHUzMDBfaTJjX3JlZ2lzdGVyX2JvYXJkX2RldmljZXModm9pZCkKK3sKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBidXMwX2kyY19ib2FyZF9pbmZvLAorCQkJCUFSUkFZX1NJWkUoYnVzMF9pMmNfYm9hcmRfaW5mbykpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGJ1czFfaTJjX2JvYXJkX2luZm8sCisJCQkJQVJSQVlfU0laRShidXMxX2kyY19ib2FyZF9pbmZvKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaTJjLmggYi9hcmNoL2FybS9tYWNoLXUzMDAvaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1YzAyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pMmMuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogYXJjaC9hcm0vbWFjaC11MzAwL2kyYy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNULUVyaWNzc29uIEFCCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqCisgKiBSZWdpc3RlciBib2FyZCBpMmMgZGV2aWNlcworICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgorICovCisKKyNpZm5kZWYgTUFDSF9VMzAwX0kyQ19ICisjZGVmaW5lIE1BQ0hfVTMwMF9JMkNfSAorCisjaWZkZWYgQ09ORklHX0kyQ19TVFUzMDAKK3ZvaWQgX19pbml0IHUzMDBfaTJjX3JlZ2lzdGVyX2JvYXJkX2RldmljZXModm9pZCk7CisjZWxzZQorLyogQ29tcGlsZSBvdXQgdGhpcyBzdHVmZiBpZiBubyBJMkMgYWRhcHRlciBpcyBhdmFpbGFibGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgdTMwMF9pMmNfcmVnaXN0ZXJfYm9hcmRfZGV2aWNlcyh2b2lkKQoreworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBjODE3NDEyLi43YjFmYzk4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMjU4LDYgKzI1OCw3IEBACiAjZGVmaW5lIFBJTl9UT19QT1JUKHZhbCkgKHZhbCA+PiAzKQogCiAvKiBUaGVzZSBjYW4gYmUgZm91bmQgaW4gYXJjaC9hcm0vbWFjaC11MzAwL2dwaW8uYyAqLworZXh0ZXJuIGludCBncGlvX2lzX3ZhbGlkKGludCBudW1iZXIpOwogZXh0ZXJuIGludCBncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpOwogZXh0ZXJuIHZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pOwogZXh0ZXJuIGludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGJmMTM0YmMuLmFiMDAwZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMzUsNiArMzUsMTQgQEAKICNlbmRpZgogCiAvKgorICogVENNIG1lbW9yeSB3aGVyZWFib3V0cworICovCisjZGVmaW5lIElUQ01fT0ZGU0VUCTB4ZmZmZjIwMDAKKyNkZWZpbmUgSVRDTV9FTkQJMHhmZmZmM2ZmZgorI2RlZmluZSBEVENNX09GRlNFVAkweGZmZmY0MDAwCisjZGVmaW5lIERUQ01fRU5ECTB4ZmZmZjVmZmYKKworLyoKICAqIFdlIGVuYWJsZSBhIHJlYWwgYmlnIERNQSBidWZmZXIgaWYgbmVlZCBiZS4KICAqLwogI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFIFNaXzRNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL3N5c2Nvbi5oIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9zeXNjb24uaAppbmRleCAxYzkwZDFiLi43NDQ0ZjVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL3N5c2Nvbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvc3lzY29uLmgKQEAgLTI0MCw4ICsyNDAsMTMgQEAKICNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMUxSX0NESV9NQVNLCQkJCSgweEMwMDApCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzFMUl9DRElfQ0RJCQkJCSgweDAwMDApCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzFMUl9DRElfRU1JRgkJCQkoMHg0MDAwKQorI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMzMzUKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMUxSX0NESV9DREkyCQkJCSgweDgwMDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzFMUl9DRElfV0NETUFfQVBQX0dQSU8JCQkoMHhDMDAwKQorI2VsaWYgQ09ORklHX01BQ0hfVTMwMF9CUzM2NQogI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMxTFJfQ0RJX0dQSU8JCQkJKDB4ODAwMCkKICNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMUxSX0NESV9XQ0RNQQkJCQkoMHhDMDAwKQorI2VuZGlmCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzFMUl9QRElfTUFTSwkJCQkoMHgzMDAwKQogI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMxTFJfUERJX1BESQkJCQkoMHgwMDAwKQogI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMxTFJfUERJX0VHRwkJCQkoMHgxMDAwKQpAQCAtMzQ1LDE5ICszNTAsNjkgQEAKICNkZWZpbmUgVTMwMF9TWVNDT05fTU1DUl9NQVNLCQkJCQkoMHgwMDAzKQogI2RlZmluZSBVMzAwX1NZU0NPTl9NTUNSX01NQ19GQl9DTEtfU0VMX0VOQUJMRQkJCSgweDAwMDIpCiAjZGVmaW5lIFUzMDBfU1lTQ09OX01NQ1JfTVNQUk9fRlJFUVNFTF9FTkFCTEUJCQkoMHgwMDAxKQotCisvKiBQdWxsIHVwL2Rvd24gY29udHJvbCAoUi9XKSAqLworI2RlZmluZSBVMzAwX1NZU0NPTl9QVUNSCQkJCQkoMHgxMDQpCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BVQ1JfRU1JRl8xX1dBSVRfTl9QVV9FTkFCTEUJCSgweDAyMDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BVQ1JfRU1JRl8xX05GSUZfUkVBRFlfUFVfRU5BQkxFCQkoMHgwMTAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QVUNSX0VNSUZfMV8xNkJJVF9QVV9FTkFCTEUJCQkoMHgwMDgwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QVUNSX0VNSUZfMV84QklUX1BVX0VOQUJMRQkJCSgweDAwNDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BVQ1JfS0VZX0lOX1BVX0VOX01BU0sJCQkoMHgwMDNGKQorLyogUGFkbXV4IDIgY29udHJvbCAqLworI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUgkJCQkJKDB4MTAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18wX01BU0sJCQkoMHgwMEMwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18wX0FQUF9HUElPCQkJKDB4MDAwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfMF9FTUlGX1NEUkFNCQkJKDB4MDA0MCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfMF9NTUMJCQkoMHgwMDgwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18wX0NESTIJCQkoMHgwMEMwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18xX01BU0sJCQkoMHgwMzAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18xX0FQUF9HUElPCQkJKDB4MDAwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfMV9FTUlGX1NEUkFNCQkJKDB4MDEwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfMV9NTUMJCQkoMHgwMjAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18xX0NESTIJCQkoMHgwMzAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18yX01BU0sJCQkoMHgwQzAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18yX0FQUF9HUElPCQkJKDB4MDAwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfMl9FTUlGX1NEUkFNCQkJKDB4MDQwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfMl9NTUMJCQkoMHgwODAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18yX0NESTIJCQkoMHgwQzAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18zX01BU0sJCQkoMHgzMDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18zX0FQUF9HUElPCQkJKDB4MDAwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfM19FTUlGX1NEUkFNCQkJKDB4MTAwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfM19NTUMJCQkoMHgyMDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ18zX0NESTIJCQkoMHgzMDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ180X01BU0sJCQkoMHhDMDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ180X0FQUF9HUElPCQkJKDB4MDAwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfNF9FTUlGX1NEUkFNCQkJKDB4NDAwMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DMlJfQVBQX01JU0NfNF9NTUMJCQkoMHg4MDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMyUl9BUFBfTUlTQ180X0FDQ19HUElPCQkJKDB4QzAwMCkKIC8qIFRPRE86IE1vcmUgU1lTQ09OIHJlZ2lzdGVycyBtaXNzaW5nICovCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzNSCQkJCQkoMHgxMGMpCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzNSX0FQUF9NSVNDXzExX01BU0sJCQkoMHhjMDAwKQogI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMzUl9BUFBfTUlTQ18xMV9TUEkJCQkoMHg0MDAwKQogI2RlZmluZSBVMzAwX1NZU0NPTl9QTUMzUl9BUFBfTUlTQ18xMF9NQVNLCQkJKDB4MzAwMCkKICNkZWZpbmUgVTMwMF9TWVNDT05fUE1DM1JfQVBQX01JU0NfMTBfU1BJCQkJKDB4MTAwMCkKLS8qIFRPRE86IE1pc3Npbmcgb3RoZXIgY29uZmlncywgSSBqdXN0IGFkZGVkIHRoZSBTUEkgc3R1ZmYgKi8KLQorLyogVE9ETzogTWlzc2luZyBvdGhlciBjb25maWdzICovCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzRSCQkJCQkoMHgxNjgpCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzRSX0FQUF9NSVNDXzEyX01BU0sJCQkoMHgwMDAzKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xMl9BUFBfR1BJTwkJCSgweDAwMDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzRSX0FQUF9NSVNDXzEzX01BU0sJCQkoMHgwMDBDKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xM19DREkJCQkoMHgwMDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xM19TTUlBCQkJKDB4MDAwNCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DNFJfQVBQX01JU0NfMTNfU01JQTIJCQkoMHgwMDA4KQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xM19BUFBfR1BJTwkJCSgweDAwMEMpCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzRSX0FQUF9NSVNDXzE0X01BU0sJCQkoMHgwMDMwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xNF9DREkJCQkoMHgwMDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xNF9TTUlBCQkJKDB4MDAxMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DNFJfQVBQX01JU0NfMTRfQ0RJMgkJCSgweDAwMjApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzRSX0FQUF9NSVNDXzE0X0FQUF9HUElPCQkJKDB4MDAzMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUE1DNFJfQVBQX01JU0NfMTZfTUFTSwkJCSgweDAzMDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BNQzRSX0FQUF9NSVNDXzE2X0FQUF9HUElPXzEzCQkoMHgwMDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xNl9BUFBfVUFSVDFfQ1RTCQkoMHgwMTAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xNl9FTUlGXzFfU1RBVElDX0NTNV9OCSgweDAyMDApCiAvKiBTWVNfMF9DTEtfQ09OVFJPTCBmaXJzdCBjbG9jayBjb250cm9sIDE2Yml0IChSL1cpICovCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1MwQ0NSCQkJCQkoMHgxMjApCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1MwQ0NSX0ZJRUxEX01BU0sJCQkJKDB4NDNGRikKICNkZWZpbmUgVTMwMF9TWVNDT05fUzBDQ1JfQ0xPQ0tfUkVRCQkJCSgweDQwMDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1MwQ0NSX0NMT0NLX1JFUV9NT05JVE9SCQkJKDB4MjAwMCkKICNkZWZpbmUgVTMwMF9TWVNDT05fUzBDQ1JfQ0xPQ0tfSU5WCQkJCSgweDAyMDApCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1MwQ0NSX0NMT0NLX0ZSRVFfTUFTSwkJCSgweDAxRTApCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1MwQ0NSX0NMT0NLX1NFTEVDVF9NQVNLCQkJKDB4MDAxRSkKQEAgLTM3NSw2ICs0MzAsNyBAQAogI2RlZmluZSBVMzAwX1NZU0NPTl9TMUNDUgkJCQkJKDB4MTI0KQogI2RlZmluZSBVMzAwX1NZU0NPTl9TMUNDUl9GSUVMRF9NQVNLCQkJCSgweDQzRkYpCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1MxQ0NSX0NMT0NLX1JFUQkJCQkoMHg0MDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9TMUNDUl9DTE9DS19SRVFfTU9OSVRPUgkJCSgweDIwMDApCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1MxQ0NSX0NMT0NLX0lOVgkJCQkoMHgwMjAwKQogI2RlZmluZSBVMzAwX1NZU0NPTl9TMUNDUl9DTE9DS19GUkVRX01BU0sJCQkoMHgwMUUwKQogI2RlZmluZSBVMzAwX1NZU0NPTl9TMUNDUl9DTE9DS19TRUxFQ1RfTUFTSwkJCSgweDAwMUUpCkBAIC0zOTMsNiArNDQ5LDcgQEAKICNkZWZpbmUgVTMwMF9TWVNDT05fUzJDQ1JfRklFTERfTUFTSwkJCQkoMHhDM0ZGKQogI2RlZmluZSBVMzAwX1NZU0NPTl9TMkNDUl9DTEtfU1RFQUwJCQkJKDB4ODAwMCkKICNkZWZpbmUgVTMwMF9TWVNDT05fUzJDQ1JfQ0xPQ0tfUkVRCQkJCSgweDQwMDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1MyQ0NSX0NMT0NLX1JFUV9NT05JVE9SCQkJKDB4MjAwMCkKICNkZWZpbmUgVTMwMF9TWVNDT05fUzJDQ1JfQ0xPQ0tfSU5WCQkJCSgweDAyMDApCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1MyQ0NSX0NMT0NLX0ZSRVFfTUFTSwkJCSgweDAxRTApCiAjZGVmaW5lIFUzMDBfU1lTQ09OX1MyQ0NSX0NMT0NLX1NFTEVDVF9NQVNLCQkJKDB4MDAxRSkKQEAgLTQyNSw2ICs0ODIsNDQgQEAKICNkZWZpbmUgVTMwMF9TWVNDT05fTUNSX1BNR0VOX0NSXzBfRU1JRl8wX1NEUkFNCQkJKDB4MDAwQykKICNkZWZpbmUgVTMwMF9TWVNDT05fTUNSX1BNMUdfTU9ERV9FTkFCTEUJCQkoMHgwMDAyKQogI2RlZmluZSBVMzAwX1NZU0NPTl9NQ1JfUE1URzVfTU9ERV9FTkFCTEUJCQkoMHgwMDAxKQorLyogU0NfUExMX0lSUV9DT05UUk9MIDE2Yml0IChSL1cpICovCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BJQ1IJCQkJCSgweDAxMzApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BJQ1JfTUFTSwkJCQkJKDB4MDBGRikKKyNkZWZpbmUgVTMwMF9TWVNDT05fUElDUl9GT1JDRV9QTEwyMDhfTE9DS19MT1dfRU5BQkxFCQkoMHgwMDgwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QSUNSX0ZPUkNFX1BMTDIwOF9MT0NLX0hJR0hfRU5BQkxFCQkoMHgwMDQwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QSUNSX0ZPUkNFX1BMTDEzX0xPQ0tfTE9XX0VOQUJMRQkJKDB4MDAyMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUElDUl9GT1JDRV9QTEwxM19MT0NLX0hJR0hfRU5BQkxFCQkoMHgwMDEwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QSUNSX0lSUU1BU0tfUExMMTNfVU5MT0NLX0VOQUJMRQkJKDB4MDAwOCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUElDUl9JUlFNQVNLX1BMTDEzX0xPQ0tfRU5BQkxFCQkoMHgwMDA0KQorI2RlZmluZSBVMzAwX1NZU0NPTl9QSUNSX0lSUU1BU0tfUExMMjA4X1VOTE9DS19FTkFCTEUJCSgweDAwMDIpCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BJQ1JfSVJRTUFTS19QTEwyMDhfTE9DS19FTkFCTEUJCSgweDAwMDEpCisvKiBTQ19QTExfSVJRX1NUQVRVUyAxNiBiaXQgKFIvLSkgKi8KKyNkZWZpbmUgVTMwMF9TWVNDT05fUElTUgkJCQkJKDB4MDEzNCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUElTUl9NQVNLCQkJCQkoMHgwMDBGKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QSVNSX1BMTDEzX1VOTE9DS19JTkQJCQkoMHgwMDA4KQorI2RlZmluZSBVMzAwX1NZU0NPTl9QSVNSX1BMTDEzX0xPQ0tfSU5ECQkJCSgweDAwMDQpCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BJU1JfUExMMjA4X1VOTE9DS19JTkQJCQkoMHgwMDAyKQorI2RlZmluZSBVMzAwX1NZU0NPTl9QSVNSX1BMTDIwOF9MT0NLX0lORAkJCSgweDAwMDEpCisvKiBTQ19QTExfSVJRX0NMRUFSIDE2IGJpdCAoLS9XKSAqLworI2RlZmluZSBVMzAwX1NZU0NPTl9QSUNMUgkJCQkJKDB4MDEzOCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUElDTFJfTUFTSwkJCQkJKDB4MDAwRikKKyNkZWZpbmUgVTMwMF9TWVNDT05fUElDTFJfUldNQVNLCQkJCSgweDAwMDApCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BJQ0xSX1BMTDEzX1VOTE9DS19TQwkJCSgweDAwMDgpCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BJQ0xSX1BMTDEzX0xPQ0tfU0MJCQkJKDB4MDAwNCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fUElDTFJfUExMMjA4X1VOTE9DS19TQwkJCSgweDAwMDIpCisjZGVmaW5lIFUzMDBfU1lTQ09OX1BJQ0xSX1BMTDIwOF9MT0NLX1NDCQkJKDB4MDAwMSkKKy8qIENBTUlGX0NPTlRST0wgMTYgYml0ICgtL1cpICovCisjZGVmaW5lIFUzMDBfU1lTQ09OX0NJQ1IJCQkJCSgweDAxM0MpCisjZGVmaW5lIFUzMDBfU1lTQ09OX0NJQ1JfTUFTSwkJCQkJKDB4MEZGRikKKyNkZWZpbmUgVTMwMF9TWVNDT05fQ0lDUl9BUFBfU1VCTFZEU19URVNUTU9ERV9NQVNLCQkoMHgwRjAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9DSUNSX0FQUF9TVUJMVkRTX1RFU1RNT0RFX1BPUlQxCQkoMHgwQzAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9DSUNSX0FQUF9TVUJMVkRTX1RFU1RNT0RFX1BPUlQwCQkoMHgwMzAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9DSUNSX0FQUF9TVUJMVkRTX1JFU0NPTl9NQVNLCQkoMHgwMEYwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9DSUNSX0FQUF9TVUJMVkRTX1JFU0NPTl9QT1JUMQkJKDB4MDBDMCkKKyNkZWZpbmUgVTMwMF9TWVNDT05fQ0lDUl9BUFBfU1VCTFZEU19SRVNDT05fUE9SVDAJCSgweDAwMzApCisjZGVmaW5lIFUzMDBfU1lTQ09OX0NJQ1JfQVBQX1NVQkxWRFNfUFdSX0RXTl9OX01BU0sJCSgweDAwMEYpCisjZGVmaW5lIFUzMDBfU1lTQ09OX0NJQ1JfQVBQX1NVQkxWRFNfUFdSX0RXTl9OX1BPUlQxCQkoMHgwMDBDKQorI2RlZmluZSBVMzAwX1NZU0NPTl9DSUNSX0FQUF9TVUJMVkRTX1BXUl9EV05fTl9QT1JUMAkJKDB4MDAwMykKIC8qIENsb2NrIGFjdGl2aXR5IG9ic2VydmFiaWxpdHkgcmVnaXN0ZXIgMCAqLwogI2RlZmluZSBVMzAwX1NZU0NPTl9DME9BUgkJCQkJKDB4MTQwKQogI2RlZmluZSBVMzAwX1NZU0NPTl9DME9BUl9NQVNLCQkJCQkoMHhGRkZGKQpAQCAtNTEzLDcgKzYwOCw3IEBACiAvKioKICAqIENQVSBtZWRpdW0gZnJlcXVlbmN5IGluIE1IegogICovCi0jZGVmaW5lIFNZU0NPTl9DUFVfQ0xPQ0tfTUVESVVNICAxMDQKKyNkZWZpbmUgU1lTQ09OX0NQVV9DTE9DS19NRURJVU0gICA1MgogLyoqCiAgKiBDUFUgbG93IGZyZXF1ZW5jeSBpbiBNSHoKICAqLwpAQCAtNTI3LDcgKzYyMiw3IEBACiAvKioKICAqIEVNSUYgbWVkaXVtIGZyZXF1ZW5jeSBpbiBNSHoKICAqLwotI2RlZmluZSBTWVNDT05fRU1JRl9DTE9DS19NRURJVU0gMTA0CisjZGVmaW5lIFNZU0NPTl9FTUlGX0NMT0NLX01FRElVTSAgNTIKIC8qKgogICogRU1JRiBsb3cgZnJlcXVlbmN5IGluIE1IegogICovCkBAIC01NDEsNyArNjM2LDcgQEAKIC8qKgogICogQUhCIG1lZGl1bSBmcmVxdWVuY3kgaW4gTUh6CiAgKi8KLSNkZWZpbmUgU1lTQ09OX0FIQl9DTE9DS19NRURJVU0gICA1MgorI2RlZmluZSBTWVNDT05fQUhCX0NMT0NLX01FRElVTSAgIDI2CiAvKioKICAqIEFIQiBsb3cgZnJlcXVlbmN5IGluIE1IegogICovCkBAIC01NTMsNiArNjQ4LDE1IEBACiAgIFNZU0NPTl9CTV9WSURFT19FTkMKIH07CiAKKy8qIFNlbGVjdHIgYSByZXNpc3RvciBvciBhIHNldCBvZiByZXNpc3RvcnMgKi8KK2VudW0gc3lzY29uX3B1bGxfdXBfZG93biB7CisgIFNZU0NPTl9QVV9LRVlfSU5fRU4sCisgIFNZU0NPTl9QVV9FTUlGXzFfOF9CSVRfRU4sCisgIFNZU0NPTl9QVV9FTUlGXzFfMTZfQklUX0VOLAorICBTWVNDT05fUFVfRU1JRl8xX05GSUZfUkVBRFlfRU4sCisgIFNZU0NPTl9QVV9FTUlGXzFfTkZJRl9XQUlUX05fRU4sCit9OworCiAvKgogICogTm90ZSB0aGF0IHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlIGFycmF5ICJjbGtfcmVnIgogICogaW4gc3lzY29uLmMKQEAgLTU3NSw2ICs2NzksNyBAQAogICBTWVNDT05fQ0xLQ09OVFJPTF9TUEksCiAgIFNZU0NPTl9DTEtDT05UUk9MX0kyUzBfQ09SRSwKICAgU1lTQ09OX0NMS0NPTlRST0xfSTJTMV9DT1JFLAorICBTWVNDT05fQ0xLQ09OVFJPTF9VQVJUMSwKICAgU1lTQ09OX0NMS0NPTlRST0xfQUFJRiwKICAgU1lTQ09OX0NMS0NPTlRST0xfQUhCLAogICBTWVNDT05fQ0xLQ09OVFJPTF9BUEVYLApAQCAtNjA0LDcgKzcwOSw4IEBACiAKIGVudW0gc3lzY29uX3N5c2Nsa19yZXEgewogICBTWVNDT05fU1lTQ0xLUkVRX0RJU0FCTEVELAotICBTWVNDT05fU1lTQ0xLUkVRX0FDVElWRV9MT1cKKyAgU1lTQ09OX1NZU0NMS1JFUV9BQ1RJVkVfTE9XLAorICBTWVNDT05fU1lTQ0xLUkVRX01PTklUT1IKIH07CiAKIGVudW0gc3lzY29uX2Nsa19tb2RlIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9tbWMuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC9tbWMuYwppbmRleCA1ODVjYzAxLi43YjZiMDE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvbW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL21tYy5jCkBAIC0xOSwxNSArMTksMTYgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL21tY2kuaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoL21tYy5oPgogI2luY2x1ZGUgIm1tYy5oIgorI2luY2x1ZGUgInBhZG11eC5oIgogCiBzdHJ1Y3QgbW1jaV9jYXJkX2V2ZW50IHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICptbWNfaW5wdXQ7CiAJaW50IG1tY19pbnNlcnRlZDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya3E7Ci0Jc3RydWN0IG1tY19wbGF0Zm9ybV9kYXRhIG1tYzBfcGxhdF9kYXRhOworCXN0cnVjdCBtbWNpX3BsYXRmb3JtX2RhdGEgbW1jMF9wbGF0X2RhdGE7CiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1tY19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMTQ2LDYgKzE0Nyw3IEBACiB7CiAJc3RydWN0IG1tY2lfY2FyZF9ldmVudCAqbW1jaV9jYXJkOwogCXN0cnVjdCBkZXZpY2UgKm1tY3NkX2RldmljZSA9ICZhZGV2LT5kZXY7CisJc3RydWN0IHBteCAqcG14OwogCWludCByZXQgPSAwOwogCiAJbW1jaV9jYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1tY2lfY2FyZF9ldmVudCksIEdGUF9LRVJORUwpOwpAQCAtMTU4LDYgKzE2MCw4IEBACiAJbW1jaV9jYXJkLT5tbWMwX3BsYXRfZGF0YS5zdGF0dXMgPSBtbWNfc3RhdHVzOwogCW1tY2lfY2FyZC0+bW1jMF9wbGF0X2RhdGEuZ3Bpb193cCA9IC0xOwogCW1tY2lfY2FyZC0+bW1jMF9wbGF0X2RhdGEuZ3Bpb19jZCA9IC0xOworCW1tY2lfY2FyZC0+bW1jMF9wbGF0X2RhdGEuY2FwYWJpbGl0aWVzID0gTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwKKwkJTU1DX0NBUF9TRF9ISUdIU1BFRUQgfCBNTUNfQ0FQXzRfQklUX0RBVEE7CiAKIAltbWNzZF9kZXZpY2UtPnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSAmbW1jaV9jYXJkLT5tbWMwX3BsYXRfZGF0YTsKIApAQCAtMjA3LDYgKzIxMSwyMCBAQAogCiAJaW5wdXRfc2V0X2RydmRhdGEobW1jaV9jYXJkLT5tbWNfaW5wdXQsIG1tY2lfY2FyZCk7CiAKKwkvKgorCSAqIFNldHVwIHBhZG11eGluZyBmb3IgTU1DLiBTaW5jZSB0aGlzIG11c3QgYWx3YXlzIGJlCisJICogY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBwbXggaXMgbmV2ZXIgcmVsZWFzZWQuCisJICovCisJcG14ID0gcG14X2dldChtbWNzZF9kZXZpY2UsIFUzMDBfQVBQX1BNWF9NTUNfU0VUVElORyk7CisKKwlpZiAoSVNfRVJSKHBteCkpCisJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBnZXQgcGFkbXV4IGhhbmRsZVxuIik7CisJZWxzZSB7CisJCXJldCA9IHBteF9hY3RpdmF0ZShtbWNzZF9kZXZpY2UsIHBteCk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBhY3RpdmF0ZSBwYWRtdXhpbmdcbiIpOworCX0KKwogCXJldCA9IGdwaW9fcmVnaXN0ZXJfY2FsbGJhY2soVTMwMF9HUElPX1BJTl9NTUNfQ0QsIG1tY2lfY2FsbGJhY2ssCiAJCQkJICAgICBtbWNpX2NhcmQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvcGFkbXV4LmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvcGFkbXV4LmMKaW5kZXggZjM2NjQ1Ni4uNGM5M2M2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL3BhZG11eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9wYWRtdXguYwpAQCAtNiw1MyArNiwzNjIgQEAKICAqIENvcHlyaWdodCAoQykgMjAwOSBTVC1Fcmljc3NvbiBBQgogICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCiAgKiBVMzAwIFBBRE1VWCBmdW5jdGlvbnMKLSAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KLSAqCisgKiBBdXRob3I6IE1hcnRpbiBQZXJzc29uIDxtYXJ0aW4ucGVyc3NvbkBzdGVyaWNzc29uLmNvbT4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxtYWNoL3UzMDAtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvc3lzY29uLmg+Ci0KICNpbmNsdWRlICJwYWRtdXguaCIKIAotLyogU2V0IHRoZSBQQUQgTVVYIHRvIHJvdXRlIHRoZSBNTUMgcmVhZGVyIGNvcnJlY3RseSB0byBHUElPMC4gKi8KLXZvaWQgcG14X3NldF9taXNzaW9uX21vZGVfbW1jKHZvaWQpCi17Ci0JdTE2IHZhbDsKK3N0YXRpYyBERUZJTkVfTVVURVgocG14X211dGV4KTsKIAotCXZhbCA9IHJlYWR3KFUzMDBfU1lTQ09OX1ZCQVNFICsgVTMwMF9TWVNDT05fUE1DMUxSKTsKLQl2YWwgJj0gflUzMDBfU1lTQ09OX1BNQzFMUl9NTUNTRF9NQVNLOwotCXdyaXRldyh2YWwsIFUzMDBfU1lTQ09OX1ZCQVNFICsgVTMwMF9TWVNDT05fUE1DMUxSKTsKLQl2YWwgPSByZWFkdyhVMzAwX1NZU0NPTl9WQkFTRSArIFUzMDBfU1lTQ09OX1BNQzFIUik7Ci0JdmFsICY9IH5VMzAwX1NZU0NPTl9QTUMxSFJfQVBQX0dQSU9fMV9NQVNLOwotCXZhbCB8PSBVMzAwX1NZU0NPTl9QTUMxSFJfQVBQX0dQSU9fMV9NTUM7Ci0Jd3JpdGV3KHZhbCwgVTMwMF9TWVNDT05fVkJBU0UgKyBVMzAwX1NZU0NPTl9QTUMxSFIpOworY29uc3QgdTMyIHBteF9yZWdpc3RlcnNbXSA9IHsKKwkoVTMwMF9TWVNDT05fVkJBU0UgKyBVMzAwX1NZU0NPTl9QTUMxTFIpLAorCShVMzAwX1NZU0NPTl9WQkFTRSArIFUzMDBfU1lTQ09OX1BNQzFIUiksCisJKFUzMDBfU1lTQ09OX1ZCQVNFICsgVTMwMF9TWVNDT05fUE1DMlIpLAorCShVMzAwX1NZU0NPTl9WQkFTRSArIFUzMDBfU1lTQ09OX1BNQzNSKSwKKwkoVTMwMF9TWVNDT05fVkJBU0UgKyBVMzAwX1NZU0NPTl9QTUM0UikKK307CisKKy8qIEhpZ2ggbGV2ZWwgZnVuY3Rpb25hbGl0eSAqLworCisvKiBMYXp5IGRvZzoKKyAqIG9ubWFzayA9IHsKKyAqICAgeyJQTUMxTFIiIG1hc2ssICJQTUMxTFIiIHZhbHVlfSwKKyAqICAgeyJQTUMxSFIiIG1hc2ssICJQTUMxSFIiIHZhbHVlfSwKKyAqICAgeyJQTUMyUiIgIG1hc2ssICJQTUMyUiIgIHZhbHVlfSwKKyAqICAgeyJQTUMzUiIgIG1hc2ssICJQTUMzUiIgIHZhbHVlfSwKKyAqICAgeyJQTUM0UiIgIG1hc2ssICJQTUM0UiIgIHZhbHVlfQorICogfQorICovCitzdGF0aWMgc3RydWN0IHBteCBtbWNfc2V0dGluZyA9IHsKKwkuc2V0dGluZyA9IFUzMDBfQVBQX1BNWF9NTUNfU0VUVElORywKKwkuZGVmYXVsdF9vbiA9IGZhbHNlLAorCS5hY3RpdmF0ZWQgPSBmYWxzZSwKKwkubmFtZSA9ICJNTUMiLAorCS5vbm1hc2sgPSB7CisJCSAgIHtVMzAwX1NZU0NPTl9QTUMxTFJfTU1DU0RfTUFTSywKKwkJICAgIFUzMDBfU1lTQ09OX1BNQzFMUl9NTUNTRF9NTUNTRH0sCisJCSAgIHswLCAwfSwKKwkJICAgezAsIDB9LAorCQkgICB7MCwgMH0sCisJCSAgIHtVMzAwX1NZU0NPTl9QTUM0Ul9BUFBfTUlTQ18xMl9NQVNLLAorCQkgICAgVTMwMF9TWVNDT05fUE1DNFJfQVBQX01JU0NfMTJfQVBQX0dQSU99CisJCSAgIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBteCBzcGlfc2V0dGluZyA9IHsKKwkuc2V0dGluZyA9IFUzMDBfQVBQX1BNWF9TUElfU0VUVElORywKKwkuZGVmYXVsdF9vbiA9IGZhbHNlLAorCS5hY3RpdmF0ZWQgPSBmYWxzZSwKKwkubmFtZSA9ICJTUEkiLAorCS5vbm1hc2sgPSB7ezAsIDB9LAorCQkgICB7VTMwMF9TWVNDT05fUE1DMUhSX0FQUF9TUElfMl9NQVNLIHwKKwkJICAgIFUzMDBfU1lTQ09OX1BNQzFIUl9BUFBfU1BJX0NTXzFfTUFTSyB8CisJCSAgICBVMzAwX1NZU0NPTl9QTUMxSFJfQVBQX1NQSV9DU18yX01BU0ssCisJCSAgICBVMzAwX1NZU0NPTl9QTUMxSFJfQVBQX1NQSV8yX1NQSSB8CisJCSAgICBVMzAwX1NZU0NPTl9QTUMxSFJfQVBQX1NQSV9DU18xX1NQSSB8CisJCSAgICBVMzAwX1NZU0NPTl9QTUMxSFJfQVBQX1NQSV9DU18yX1NQSX0sCisJCSAgIHswLCAwfSwKKwkJICAgezAsIDB9LAorCQkgICB7MCwgMH0KKwkJICAgfSwKK307CisKKy8qIEF2YWlsYWJsZSBwYWRtdXggc2V0dGluZ3MgKi8KK3N0YXRpYyBzdHJ1Y3QgcG14ICpwbXhfc2V0dGluZ3NbXSA9IHsKKwkmbW1jX3NldHRpbmcsCisJJnNwaV9zZXR0aW5nLAorfTsKKworc3RhdGljIHZvaWQgdXBkYXRlX3JlZ2lzdGVycyhzdHJ1Y3QgcG14ICpwbXgsIGJvb2wgYWN0aXZhdGUpCit7CisJdTE2IHJlZ3ZhbCwgdmFsLCBtYXNrOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG14X3JlZ2lzdGVycyk7IGkrKykgeworCQlpZiAoYWN0aXZhdGUpCisJCQl2YWwgPSBwbXgtPm9ubWFza1tpXS52YWw7CisJCWVsc2UKKwkJCXZhbCA9IDA7CisKKwkJbWFzayA9IHBteC0+b25tYXNrW2ldLm1hc2s7CisJCWlmIChtYXNrICE9IDApIHsKKwkJCXJlZ3ZhbCA9IHJlYWR3KHBteF9yZWdpc3RlcnNbaV0pOworCQkJcmVndmFsICY9IH5tYXNrOworCQkJcmVndmFsIHw9IHZhbDsKKwkJCXdyaXRldyhyZWd2YWwsIHBteF9yZWdpc3RlcnNbaV0pOworCQl9CisJfQogfQogCi12b2lkIHBteF9zZXRfbWlzc2lvbl9tb2RlX3NwaSh2b2lkKQorc3RydWN0IHBteCAqcG14X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gcG14X3NldHRpbmdzIHNldHRpbmcpCiB7Ci0JdTE2IHZhbDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcG14ICpwbXggPSBFUlJfUFRSKC1FTk9FTlQpOwogCi0JLyogU2V0IHVwIHBhZG11eGluZyBzbyB0aGUgU1BJIHBvcnQgYW5kIGl0cyBjaGlwc2VsZWN0cyBhcmUgYWN0aXZlICovCi0JdmFsID0gcmVhZHcoVTMwMF9TWVNDT05fVkJBU0UgKyBVMzAwX1NZU0NPTl9QTUMxSFIpOwotCS8qCi0JICogQWN0aXZhdGUgdGhlIFNQSSBwb3J0IChkaXNhYmxlIHRoZSB1c2Ugb2YgdGhlc2UgcGlucyBmb3IgZ2VuZXJpYwotCSAqIEdQSU8sIERTUCwgQUFJRgotCSAqLwotCXZhbCAmPSB+VTMwMF9TWVNDT05fUE1DMUhSX0FQUF9TUElfMl9NQVNLOwotCXZhbCB8PSBVMzAwX1NZU0NPTl9QTUMxSFJfQVBQX1NQSV8yX1NQSTsKLQkvKgotCSAqIFVzZSBHUElPIHBpbiBTUEkgQ1MxIGZvciBDUzEgYWN0dWFsbHkgKGl0IGNhbiBiZSB1c2VkIGZvciBvdGhlcgotCSAqIHRoaW5ncyBhbHNvKQotCSAqLwotCXZhbCAmPSB+VTMwMF9TWVNDT05fUE1DMUhSX0FQUF9TUElfQ1NfMV9NQVNLOwotCXZhbCB8PSBVMzAwX1NZU0NPTl9QTUMxSFJfQVBQX1NQSV9DU18xX1NQSTsKLQkvKgotCSAqIFVzZSBHUElPIHBpbiBTUEkgQ1MyIGZvciBDUzIgYWN0dWFsbHkgKGl0IGNhbiBiZSB1c2VkIGZvciBvdGhlcgotCSAqIHRoaW5ncyBhbHNvKQotCSAqLwotCXZhbCAmPSB+VTMwMF9TWVNDT05fUE1DMUhSX0FQUF9TUElfQ1NfMl9NQVNLOwotCXZhbCB8PSBVMzAwX1NZU0NPTl9QTUMxSFJfQVBQX1NQSV9DU18yX1NQSTsKLQl3cml0ZXcodmFsLCBVMzAwX1NZU0NPTl9WQkFTRSArIFUzMDBfU1lTQ09OX1BNQzFIUik7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCW11dGV4X2xvY2soJnBteF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG14X3NldHRpbmdzKTsgaSsrKSB7CisKKwkJaWYgKHNldHRpbmcgPT0gcG14X3NldHRpbmdzW2ldLT5zZXR0aW5nKSB7CisKKwkJCWlmIChwbXhfc2V0dGluZ3NbaV0tPmRldiAhPSBOVUxMKSB7CisJCQkJV0FSTigxLCAicGFkbXV4OiByZXF1aXJlZCBzZXR0aW5nICIKKwkJCQkgICAgICJpbiB1c2UgYnkgYW5vdGhlciBjb25zdW1lclxuIik7CisJCQl9IGVsc2UgeworCQkJCXBteCA9IHBteF9zZXR0aW5nc1tpXTsKKwkJCQlwbXgtPmRldiA9IGRldjsKKwkJCQlkZXZfZGJnKGRldiwgInBhZG11eDogc2V0dGluZyBuciAlZCBpcyBub3cgIgorCQkJCQkiYm91bmQgdG8gJXMgYW5kIHJlYWR5IHRvIHVzZVxuIiwKKwkJCQkJc2V0dGluZywgZGV2X25hbWUoZGV2KSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZwbXhfbXV0ZXgpOworCisJcmV0dXJuIHBteDsKIH0KK0VYUE9SVF9TWU1CT0wocG14X2dldCk7CisKK2ludCBwbXhfcHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBteCAqcG14KQoreworCWludCBpOworCWludCByZXQgPSAtRU5PRU5UOworCisJaWYgKHBteCA9PSBOVUxMIHx8IGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnBteF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG14X3NldHRpbmdzKTsgaSsrKSB7CisKKwkJaWYgKHBteC0+c2V0dGluZyA9PSBwbXhfc2V0dGluZ3NbaV0tPnNldHRpbmcpIHsKKworCQkJaWYgKGRldiAhPSBwbXgtPmRldikgeworCQkJCVdBUk4oMSwgInBhZG11eDogY2Fubm90IHJlbGVhc2UgaGFuZGxlIGFzICIKKwkJCQkJIml0IGlzIGJvdW5kIHRvIGFub3RoZXIgY29uc3VtZXJcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXBteF9zZXR0aW5nc1tpXS0+ZGV2ID0gTlVMTDsKKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmcG14X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHBteF9wdXQpOworCitpbnQgcG14X2FjdGl2YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBteCAqcG14KQoreworCWludCBpLCBqLCByZXQ7CisJcmV0ID0gMDsKKworCWlmIChwbXggPT0gTlVMTCB8fCBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZwbXhfbXV0ZXgpOworCisJLyogTWFrZSBzdXJlIHRoZSByZXF1aXJlZCBiaXRzIGFyZSBub3QgdXNlZCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBteF9zZXR0aW5ncyk7IGkrKykgeworCisJCWlmIChwbXhfc2V0dGluZ3NbaV0tPmRldiA9PSBOVUxMIHx8IHBteF9zZXR0aW5nc1tpXSA9PSBwbXgpCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShwbXhfcmVnaXN0ZXJzKTsgaisrKSB7CisKKwkJCWlmIChwbXhfc2V0dGluZ3NbaV0tPm9ubWFza1tqXS5tYXNrICYgcG14LT4KKwkJCQlvbm1hc2tbal0ubWFzaykgeworCQkJCS8qIE1vcmUgdGhhbiBvbmUgZW50cnkgb24gdGhlIHNhbWUgYml0cyAqLworCQkJCVdBUk4oMSwgInBhZG11eDogY2Fubm90IGFjdGl2YXRlICIKKwkJCQkJInNldHRpbmcuIEJpdCBjb25mbGljdCB3aXRoICIKKwkJCQkJImFuIGFjdGl2ZSBzZXR0aW5nXG4iKTsKKworCQkJCXJldCA9IC1FVVNFUlM7CisJCQkJZ290byBleGl0OworCQkJfQorCQl9CisJfQorCXVwZGF0ZV9yZWdpc3RlcnMocG14LCB0cnVlKTsKKwlwbXgtPmFjdGl2YXRlZCA9IHRydWU7CisJZGV2X2RiZyhkZXYsICJwYWRtdXg6IHNldHRpbmcgbnIgJWQgaXMgYWN0aXZhdGVkXG4iLAorCQlwbXgtPnNldHRpbmcpOworCitleGl0OgorCW11dGV4X3VubG9jaygmcG14X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChwbXhfYWN0aXZhdGUpOworCitpbnQgcG14X2RlYWN0aXZhdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcG14ICpwbXgpCit7CisJaW50IGk7CisJaW50IHJldCA9IC1FTk9FTlQ7CisKKwlpZiAocG14ID09IE5VTEwgfHwgZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmcG14X211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbXhfc2V0dGluZ3MpOyBpKyspIHsKKworCQlpZiAocG14X3NldHRpbmdzW2ldLT5kZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwbXgtPnNldHRpbmcgPT0gcG14X3NldHRpbmdzW2ldLT5zZXR0aW5nKSB7CisKKwkJCWlmIChkZXYgIT0gcG14LT5kZXYpIHsKKwkJCQlXQVJOKDEsICJwYWRtdXg6IGNhbm5vdCBkZWFjdGl2YXRlICIKKwkJCQkgICAgICJwbXggc2V0dGluZyBhcyBpdCB3YXMgYWN0aXZhdGVkICIKKwkJCQkgICAgICJieSBhbm90aGVyIGNvbnN1bWVyXG4iKTsKKworCQkJCXJldCA9IC1FQlVTWTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJdXBkYXRlX3JlZ2lzdGVycyhwbXgsIGZhbHNlKTsKKwkJCQlwbXhfc2V0dGluZ3NbaV0tPmRldiA9IE5VTEw7CisJCQkJcG14LT5hY3RpdmF0ZWQgPSBmYWxzZTsKKwkJCQlyZXQgPSAwOworCQkJCWRldl9kYmcoZGV2LCAicGFkbXV4OiBzZXR0aW5nIG5yICVkIGlzIGRlYWN0aXZhdGVkIiwKKwkJCQkJcG14LT5zZXR0aW5nKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwltdXRleF91bmxvY2soJnBteF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChwbXhfZGVhY3RpdmF0ZSk7CisKKy8qCisgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIElmIGl0IGlzIHRvIGJlIGV4cG9ydGVkLAorICogaXQgc2hvdWxkIGJlIHJlZW50cmFudC4gTm90aWNlIHRoYXQgcG14X2FjdGl2YXRlCisgKiAoaS5lLiBydW50aW1lIHNldHRpbmdzKSBhbHdheXMgb3ZlcnJpZGUgZGVmYXVsdCBzZXR0aW5ncy4KKyAqLworc3RhdGljIGludCBwbXhfc2V0X2RlZmF1bHQodm9pZCkKK3sKKwkvKiBVc2VkIHRvIGlkZW50aWZ5IHNldmVyYWwgZW50cmllcyBvbiB0aGUgc2FtZSBiaXRzICovCisJdTE2IG1vZGJpdHNbQVJSQVlfU0laRShwbXhfcmVnaXN0ZXJzKV07CisKKwlpbnQgaSwgajsKKworCW1lbXNldChtb2RiaXRzLCAwLCBBUlJBWV9TSVpFKHBteF9yZWdpc3RlcnMpICogc2l6ZW9mKHUxNikpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG14X3NldHRpbmdzKTsgaSsrKSB7CisKKwkJaWYgKCFwbXhfc2V0dGluZ3NbaV0tPmRlZmF1bHRfb24pCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShwbXhfcmVnaXN0ZXJzKTsgaisrKSB7CisKKwkJCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBlbnRyeSBvbiB0aGUgc2FtZSBiaXRzICovCisJCQlpZiAobW9kYml0c1tqXSAmIHBteF9zZXR0aW5nc1tpXS0+b25tYXNrW2pdLm1hc2spIHsKKwkJCQlCVUcoKTsKKwkJCQlyZXR1cm4gLUVVU0VSUzsKKwkJCX0KKwkJCW1vZGJpdHNbal0gfD0gcG14X3NldHRpbmdzW2ldLT5vbm1hc2tbal0ubWFzazsKKwkJfQorCQl1cGRhdGVfcmVnaXN0ZXJzKHBteF9zZXR0aW5nc1tpXSwgdHJ1ZSk7CisJfQorCXJldHVybiAwOworfQorCisjaWYgKGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19VMzAwX0RFQlVHKSkKK3N0YXRpYyBpbnQgcG14X3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpkYXRhKQoreworCWludCBpOworCXNlcV9wcmludGYocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXNlcV9wcmludGYocywgIlNFVFRJTkcgICAgIEJPVU5EIFRPIERFVklDRSAgICAgICAgICAgICAgIFNUQVRFXG4iKTsKKwlzZXFfcHJpbnRmKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwltdXRleF9sb2NrKCZwbXhfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBteF9zZXR0aW5ncyk7IGkrKykgeworCQkvKiBGb3JtYXQgcG14IGFuZCBkZXZpY2UgbmFtZSBuaWNlbHkgKi8KKwkJY2hhciBjZHBbMzNdOworCQlpbnQgY2hhcnM7CisKKwkJY2hhcnMgPSBzbnByaW50ZigmY2RwWzBdLCAxNywgIiVzIiwgcG14X3NldHRpbmdzW2ldLT5uYW1lKTsKKwkJd2hpbGUgKGNoYXJzIDwgMTYpIHsKKwkJCWNkcFtjaGFyc10gPSAnICc7CisJCQljaGFycysrOworCQl9CisJCWNoYXJzID0gc25wcmludGYoJmNkcFsxNl0sIDE3LCAiJXMiLCBwbXhfc2V0dGluZ3NbaV0tPmRldiA/CisJCQkJZGV2X25hbWUocG14X3NldHRpbmdzW2ldLT5kZXYpIDogIk4vQSIpOworCQl3aGlsZSAoY2hhcnMgPCAxNikgeworCQkJY2RwW2NoYXJzKzE2XSA9ICcgJzsKKwkJCWNoYXJzKys7CisJCX0KKwkJY2RwWzMyXSA9ICdcMCc7CisKKwkJc2VxX3ByaW50ZihzLAorCQkJIiVzXHQlc1xuIiwKKwkJCSZjZHBbMF0sCisJCQlwbXhfc2V0dGluZ3NbaV0tPmFjdGl2YXRlZCA/CisJCQkiQUNUSVZBVEVEIiA6ICJERUFDVElWQVRFRCIKKwkJCSk7CisKKwl9CisJbXV0ZXhfdW5sb2NrKCZwbXhfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBteF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwbXhfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBteF9vcGVyYXRpb25zID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwbXhfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9wbXhfcmVhZF9kZWJ1Z2ZzKHZvaWQpCit7CisJLyogRXhwb3NlIGEgc2ltcGxlIGRlYnVnZnMgaW50ZXJmYWNlIHRvIHZpZXcgcG14IHNldHRpbmdzICovCisJKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoInBhZG11eCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIE5VTEwsIE5VTEwsCisJCQkJICAgJnBteF9vcGVyYXRpb25zKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgbmVlZHMgdG8gY29tZSBpbiBhZnRlciB0aGUgY29yZV9pbml0Y2FsbCgpLAorICogYmVjYXVzZSBkZWJ1Z2ZzIGlzIG5vdCBhdmFpbGFibGUgdW50aWwKKyAqIHRoZSBzdWJzeXN0ZW1zIGNvbWUgdXAuCisgKi8KK21vZHVsZV9pbml0KGluaXRfcG14X3JlYWRfZGVidWdmcyk7CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgcG14X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcG14X3NldF9kZWZhdWx0KCk7CisKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCXByX2NyaXQoInBhZG11eDogZGVmYXVsdCBzZXR0aW5ncyBjb3VsZCBub3QgYmUgc2V0XG4iKTsKKworCXJldHVybiAwOworfQorCisvKiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNvbnN1bWVycyAqLworY29yZV9pbml0Y2FsbChwbXhfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvcGFkbXV4LmggYi9hcmNoL2FybS9tYWNoLXUzMDAvcGFkbXV4LmgKaW5kZXggOGMyMDk5YS4uNmU4Yjg2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL3BhZG11eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9wYWRtdXguaApAQCAtNiwxNCArNiwzNCBAQAogICogQ29weXJpZ2h0IChDKSAyMDA5IFNULUVyaWNzc29uIEFCCiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKICAqIFUzMDAgUEFETVVYIEFQSQotICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgotICoKKyAqIEF1dGhvcjogTWFydGluIFBlcnNzb24gPG1hcnRpbi5wZXJzc29uQHN0ZXJpY3Nzb24uY29tPgogICovCiAKICNpZm5kZWYgX19NQUNIX1UzMDBfUEFETVVYX0gKICNkZWZpbmUgX19NQUNIX1UzMDBfUEFETVVYX0gKIAotdm9pZCBwbXhfc2V0X21pc3Npb25fbW9kZV9tbWModm9pZCk7Ci12b2lkIHBteF9zZXRfbWlzc2lvbl9tb2RlX3NwaSh2b2lkKTsKK2VudW0gcG14X3NldHRpbmdzIHsKKwlVMzAwX0FQUF9QTVhfTU1DX1NFVFRJTkcsCisJVTMwMF9BUFBfUE1YX1NQSV9TRVRUSU5HCit9OworCitzdHJ1Y3QgcG14X29ubWFzayB7CisJdTE2IG1hc2s7CQkvKiBNYXNrIGJpdHMgKi8KKwl1MTYgdmFsOwkJLyogVmFsdWUgd2hlbiBhY3RpdmUgKi8KK307CisKK3N0cnVjdCBwbXggeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwllbnVtIHBteF9zZXR0aW5ncyBzZXR0aW5nOworCWNoYXIgKm5hbWU7CisJYm9vbCBhY3RpdmF0ZWQ7CisJYm9vbCBkZWZhdWx0X29uOworCXN0cnVjdCBwbXhfb25tYXNrIG9ubWFza1tdOworfTsKKworc3RydWN0IHBteCAqcG14X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gcG14X3NldHRpbmdzIHNldHRpbmcpOworaW50IHBteF9wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcG14ICpwbXgpOworaW50IHBteF9hY3RpdmF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwbXggKnBteCk7CitpbnQgcG14X2RlYWN0aXZhdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcG14ICpwbXgpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9zcGkuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGU4ODdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL3NwaS5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogYXJjaC9hcm0vbWFjaC11MzAwL3NwaS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNULUVyaWNzc29uIEFCCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqCisgKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDIyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSAicGFkbXV4LmgiCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIGZvciB0aGUgYWN0dWFsIGRldmljZXMgb24gdGhlIFNTUC9TUEkgYnVzCisgKi8KKyNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX1NQSURVTU1ZCitzdGF0aWMgdm9pZCBzZWxlY3RfZHVtbXlfY2hpcCh1MzIgY2hpcHNlbGVjdCkKK3sKKwlwcl9kZWJ1ZygiQ09SRTogJXMgY2FsbGVkIHdpdGggQ1M9MHgleCAoJXMpXG4iLAorCQkgX19mdW5jX18sCisJCSBjaGlwc2VsZWN0LAorCQkgY2hpcHNlbGVjdCA/ICJ1bnNlbGVjdCBjaGlwIiA6ICJzZWxlY3QgY2hpcCIpOworCS8qCisJICogSGVyZSB5b3Ugd291bGQgd3JpdGUgdGhlIGNoaXAgc2VsZWN0IHZhbHVlIHRvIHRoZSBHUElPIHBpbnMgaWYKKwkgKiB0aGlzIHdhcyBhIHJlYWwgY2hpcCAoYnV0IHRoaXMgaXMgYSBsb29wYmFjayBkdW1teSkuCisJICovCit9CisKK3N0cnVjdCBwbDAyMl9jb25maWdfY2hpcCBkdW1teV9jaGlwX2luZm8gPSB7CisJLyogTm9taW5hbGx5IHRoaXMgaXMgTE9PUEJBQ0tfRElTQUJMRUQsIGJ1dCB0aGlzIGlzIG91ciBkdW1teSBjaGlwISAqLworCS5sYm0gPSBMT09QQkFDS19FTkFCTEVELAorCS8qCisJICogYXZhaWxhYmxlIFBPTExJTkdfVFJBTlNGRVIgYW5kIElOVEVSUlVQVF9UUkFOU0ZFUiwKKwkgKiBETUFfVFJBTlNGRVIgZG9lcyBub3Qgd29yaworCSAqLworCS5jb21fbW9kZSA9IElOVEVSUlVQVF9UUkFOU0ZFUiwKKwkuaWZhY2UgPSBTU1BfSU5URVJGQUNFX01PVE9ST0xBX1NQSSwKKwkvKiBXZSBjYW4gb25seSBhY3QgYXMgbWFzdGVyIGJ1dCBTU1BfU0xBVkUgaXMgcG9zc2libGUgaW4gdGhlb3J5ICovCisJLmhpZXJhcmNoeSA9IFNTUF9NQVNURVIsCisJLyogMCA9IGRyaXZlIFRYIGV2ZW4gYXMgc2xhdmUsIDEgPSBkbyBub3QgZHJpdmUgVFggYXMgc2xhdmUgKi8KKwkuc2xhdmVfdHhfZGlzYWJsZSA9IDAsCisJLyogTFNCIGZpcnN0ICovCisJLmVuZGlhbl90eCA9IFNTUF9UWF9MU0IsCisJLmVuZGlhbl9yeCA9IFNTUF9SWF9MU0IsCisJLmRhdGFfc2l6ZSA9IFNTUF9EQVRBX0JJVFNfOCwgLyogdXNlZCB0byBiZSAxMiBpbiBzb21lIGRlZmF1bHQgKi8KKwkucnhfbGV2X3RyaWcgPSBTU1BfUlhfMV9PUl9NT1JFX0VMRU0sCisJLnR4X2xldl90cmlnID0gU1NQX1RYXzFfT1JfTU9SRV9FTVBUWV9MT0MsCisJLmNsa19waGFzZSA9IFNTUF9DTEtfU0VDT05EX0VER0UsCisJLmNsa19wb2wgPSBTU1BfQ0xLX1BPTF9JRExFX0xPVywKKwkuY3RybF9sZW4gPSBTU1BfQklUU18xMiwKKwkud2FpdF9zdGF0ZSA9IFNTUF9NV0lSRV9XQUlUX1pFUk8sCisJLmR1cGxleCA9IFNTUF9NSUNST1dJUkVfQ0hBTk5FTF9GVUxMX0RVUExFWCwKKwkvKgorCSAqIFRoaXMgaXMgd2hlcmUgeW91IGluc2VydCBhIGNhbGwgdG8gYSBmdW5jdGlvbiB0byBlbmFibGUgQ1MKKwkgKiAodXN1YWxseSBHUElPKSBmb3IgYSBjZXJ0YWluIGNoaXAuCisJICovCisJLmNzX2NvbnRyb2wgPSBzZWxlY3RfZHVtbXlfY2hpcCwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyB1MzAwX3NwaV9kZXZpY2VzW10gPSB7CisjaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9TUElEVU1NWQorCXsKKwkJLyogQSBkdW1teSBjaGlwIHVzZWQgZm9yIGxvb3BiYWNrIHRlc3RzICovCisJCS5tb2RhbGlhcyAgICAgICA9ICJzcGktZHVtbXkiLAorCQkvKiBSZWFsbHkgZHVtbXksIHBhc3MgaW4gYWRkaXRpb25hbCBjaGlwIGNvbmZpZyBoZXJlICovCisJCS5wbGF0Zm9ybV9kYXRhICA9IE5VTEwsCisJCS8qIFRoaXMgZGVmaW5lcyBob3cgdGhlIGNvbnRyb2xsZXIgc2hhbGwgaGFuZGxlIHRoZSBkZXZpY2UgKi8KKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZkdW1teV9jaGlwX2luZm8sCisJCS8qIC5pcnEgLSBubyBleHRlcm5hbCBJUlEgcm91dGVkIGZyb20gdGhpcyBkZXZpY2UgKi8KKwkJLm1heF9zcGVlZF9oeiAgID0gMTAwMDAwMCwKKwkJLmJ1c19udW0gICAgICAgID0gMCwgLyogT25seSBvbmUgYnVzIG9uIHRoaXMgY2hpcCAqLworCQkuY2hpcF9zZWxlY3QgICAgPSAwLAorCQkvKiBNZWFucyBTUElfQ1NfSElHSCwgY2hhbmdlIGlmIGUuZyBsb3cgQ1MgKi8KKwkJLm1vZGUgICAgICAgICAgID0gMCwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsMDIyX3NzcF9jb250cm9sbGVyIHNzcF9wbGF0Zm9ybV9kYXRhID0geworCS8qIElmIHlvdSBoYXZlIHNldmVyYWwgU1BJIGJ1c2VzIHRoaXMgdmFyaWVzLCB3ZSBoYXZlIG9ubHkgYnVzIDAgKi8KKwkuYnVzX2lkID0gMCwKKwkvKiBTZXQgdGhpcyB0byAxIHdoZW4gd2UgdGhpbmsgd2UgZ290IERNQSB3b3JraW5nICovCisJLmVuYWJsZV9kbWEgPSAwLAorCS8qCisJICogT24gdGhlIEFQUCBDUFUgR1BJTyA0LCA1IGFuZCA2IGFyZSBjb25uZWN0ZWQgYXMgZ2VuZXJpYworCSAqIGNoaXAgc2VsZWN0cyBmb3IgU1BJLiAoU2FtZSBvbiBVMzMwLCBVMzM1IGFuZCBVMzY1LikKKwkgKiBUT0RPOiBtYWtlIHN1cmUgdGhlIEdQSU8gZHJpdmVyIGNhbiBzZWxlY3QgdGhlc2UgcHJvcGVybHkKKwkgKiBhbmQgZG8gcGFkbXV4aW5nIGFjY29yZGluZ2x5IHRvby4KKwkgKi8KKwkubnVtX2NoaXBzZWxlY3QgPSAzLAorfTsKKworCit2b2lkIF9faW5pdCB1MzAwX3NwaV9pbml0KHN0cnVjdCBhbWJhX2RldmljZSAqYWRldikKK3sKKwlzdHJ1Y3QgcG14ICpwbXg7CisKKwlhZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICZzc3BfcGxhdGZvcm1fZGF0YTsKKwkvKgorCSAqIFNldHVwIHBhZG11eGluZyBmb3IgU1BJLiBTaW5jZSB0aGlzIG11c3QgYWx3YXlzIGJlCisJICogY29tcGlsZWQgaW50byB0aGUga2VybmVsLCBwbXggaXMgbmV2ZXIgcmVsZWFzZWQuCisJICovCisJcG14ID0gcG14X2dldCgmYWRldi0+ZGV2LCBVMzAwX0FQUF9QTVhfU1BJX1NFVFRJTkcpOworCisJaWYgKElTX0VSUihwbXgpKQorCQlkZXZfd2FybigmYWRldi0+ZGV2LCAiQ291bGQgbm90IGdldCBwYWRtdXggaGFuZGxlXG4iKTsKKwllbHNlIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBwbXhfYWN0aXZhdGUoJmFkZXYtPmRldiwgcG14KTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQkJZGV2X3dhcm4oJmFkZXYtPmRldiwgIkNvdWxkIG5vdCBhY3RpdmF0ZSBwYWRtdXhpbmdcbiIpOworCX0KKworfQordm9pZCBfX2luaXQgdTMwMF9zcGlfcmVnaXN0ZXJfYm9hcmRfZGV2aWNlcyh2b2lkKQoreworCS8qIFJlZ2lzdGVyIGFueSBTUEkgZGV2aWNlcyAqLworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHUzMDBfc3BpX2RldmljZXMsIEFSUkFZX1NJWkUodTMwMF9zcGlfZGV2aWNlcykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL3NwaS5oIGIvYXJjaC9hcm0vbWFjaC11MzAwL3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2Q4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvc3BpLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdTMwMC9zcGkuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTVC1Fcmljc3NvbiBBQgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKgorICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgorICovCisjaWZuZGVmIFNQSV9ICisjZGVmaW5lIFNQSV9ICisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKworI2lmZGVmIENPTkZJR19TUElfUEwwMjIKK3ZvaWQgX19pbml0IHUzMDBfc3BpX2luaXQoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2KTsKK3ZvaWQgX19pbml0IHUzMDBfc3BpX3JlZ2lzdGVyX2JvYXJkX2RldmljZXModm9pZCk7CisjZWxzZQorLyogQ29tcGlsZSBvdXQgU1BJIHN1cHBvcnQgaWYgUEwwMjIgaXMgbm90IHNlbGVjdGVkICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHUzMDBfc3BpX2luaXQoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCB1MzAwX3NwaV9yZWdpc3Rlcl9ib2FyZF9kZXZpY2VzKHZvaWQpCit7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCmluZGV4IGNjZTUzMjAuLjI2ZDI2ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCkBAIC0zNDYsNiArMzQ2LDIxIEBACiAJLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCisvKgorICogT3ZlcnJpZGUgdGhlIGdsb2JhbCB3ZWFrIHNjaGVkX2Nsb2NrIHN5bWJvbCB3aXRoIHRoaXMKKyAqIGxvY2FsIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZXMgdGhlIGNsb2Nrc291cmNlIHRvIGdldCBzb21lCisgKiBiZXR0ZXIgcmVzb2x1dGlvbiB3aGVuIHNjaGVkdWxpbmcgdGhlIGtlcm5lbC4gV2UgYWNjZXB0IHRoYXQKKyAqIHRoaXMgd3JhcHMgYXJvdW5kIGZvciBub3csIHNpbmNlIGl0IGlzIGp1c3QgYSByZWxhdGl2ZSB0aW1lCisgKiBzdGFtcC4gKEluc3BpcmVkIGJ5IE9NQVAgaW1wbGVtZW50YXRpb24uKQorICovCit1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKQoreworCXJldHVybiBjbG9ja3NvdXJjZV9jeWMybnMoY2xvY2tzb3VyY2VfdTMwMF8xbWh6LnJlYWQoCisJCQkJICAmY2xvY2tzb3VyY2VfdTMwMF8xbWh6KSwKKwkJCQkgIGNsb2Nrc291cmNlX3UzMDBfMW1oei5tdWx0LAorCQkJCSAgY2xvY2tzb3VyY2VfdTMwMF8xbWh6LnNoaWZ0KTsKK30KKwogCiAvKgogICogVGhpcyBzZXRzIHVwIHRoZSBzeXN0ZW0gdGltZXJzLCBjbG9jayBzb3VyY2UgYW5kIGNsb2NrIGV2ZW50LgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCmluZGV4IDk3NWVhZTQuLmUxM2JlN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvY2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwNjEuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL21tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9jbnQzMl90b182My5oPgpAQCAtNDcsNyArNDgsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tbWMuaD4KIAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJjbG9jay5oIgpAQCAtMzY5LDcgKzM2OSw3IEBACiAJcmV0dXJuIHJlYWRsKFZFUlNBVElMRV9TWVNNQ0kpICYgbWFzazsKIH0KIAotc3RhdGljIHN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSBtbWMwX3BsYXRfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbW1jaV9wbGF0Zm9ybV9kYXRhIG1tYzBfcGxhdF9kYXRhID0gewogCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKIAkuc3RhdHVzCQk9IG1tY19zdGF0dXMsCiAJLmdwaW9fd3AJPSAtMSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKaW5kZXggOWFmOGQ4MS4uMjM5Y2QzMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwNjEuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL21tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMzEsNyArMzIsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CiAKICNpbmNsdWRlICJjb3JlLmgiCiAKQEAgLTQxLDcgKzQxLDcgQEAKICNkZWZpbmUgSVJRX01NQ0kxQQlJUlFfU0lDX01NQ0kxQQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgbW1jX3BsYXRmb3JtX2RhdGEgbW1jMV9wbGF0X2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSBtbWMxX3BsYXRfZGF0YSA9IHsKIAkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCiAJLnN0YXR1cwkJPSBtbWNfc3RhdHVzLAogCS5ncGlvX3dwCT0gLTEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9LY29uZmlnIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwppbmRleCA1ZmU1OTVhLi45MjY0ZDgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTE3LDcgKzE3LDcgQEAKIAlzZWxlY3QgQ1BVX0NQMTVfTU1VCiAJc2VsZWN0IENQVV9DT1BZX1YzIGlmIE1NVQogCXNlbGVjdCBDUFVfVExCX1YzIGlmIE1NVQotCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCisJc2VsZWN0IENQVV9QQUJSVF9MRUdBQ1kKIAloZWxwCiAJICBUaGUgQVJNNjEwIGlzIHRoZSBzdWNjZXNzb3IgdG8gdGhlIEFSTTMgcHJvY2Vzc29yCiAJICBhbmQgd2FzIHByb2R1Y2VkIGJ5IFZMU0kgVGVjaG5vbG9neSBJbmMuCkBAIC0zMSw3ICszMSw3IEBACiAJZGVwZW5kcyBvbiAhTU1VCiAJc2VsZWN0IENQVV8zMnY0VAogCXNlbGVjdCBDUFVfQUJSVF9MVjRUCi0Jc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKKwlzZWxlY3QgQ1BVX1BBQlJUX0xFR0FDWQogCXNlbGVjdCBDUFVfQ0FDSEVfVjQKIAloZWxwCiAJICBBIDMyLWJpdCBSSVNDIG1pY3JvcHJvY2Vzc29yIGJhc2VkIG9uIHRoZSBBUk03IHByb2Nlc3NvciBjb3JlCkBAIC00OSw3ICs0OSw3IEBACiAJc2VsZWN0IENQVV9DUDE1X01NVQogCXNlbGVjdCBDUFVfQ09QWV9WMyBpZiBNTVUKIAlzZWxlY3QgQ1BVX1RMQl9WMyBpZiBNTVUKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJaGVscAogCSAgQSAzMi1iaXQgUklTQyBtaWNyb3Byb2Nlc3NvciBiYXNlZCBvbiB0aGUgQVJNNyBwcm9jZXNzb3IgY29yZQogCSAgZGVzaWduZWQgYnkgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuIFRoZSBBUk03MTAgaXMgdGhlCkBAIC02NCw3ICs2NCw3IEBACiAJYm9vbCAiU3VwcG9ydCBBUk03MjBUIHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SCiAJc2VsZWN0IENQVV8zMnY0VAogCXNlbGVjdCBDUFVfQUJSVF9MVjRUCi0Jc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKKwlzZWxlY3QgQ1BVX1BBQlJUX0xFR0FDWQogCXNlbGVjdCBDUFVfQ0FDSEVfVjQKIAlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKIAlzZWxlY3QgQ1BVX0NQMTVfTU1VCkBAIC04Myw3ICs4Myw3IEBACiAJZGVwZW5kcyBvbiAhTU1VCiAJc2VsZWN0IENQVV8zMnY0VAogCXNlbGVjdCBDUFVfQUJSVF9MVjRUCi0Jc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKKwlzZWxlY3QgQ1BVX1BBQlJUX0xFR0FDWQogCXNlbGVjdCBDUFVfQ0FDSEVfVjMJIyBhbHRob3VnaCB0aGUgY29yZSBpcyB2NHQKIAlzZWxlY3QgQ1BVX0NQMTVfTVBVCiAJaGVscApAQCAtMTAwLDcgKzEwMCw3IEBACiAJZGVwZW5kcyBvbiAhTU1VCiAJc2VsZWN0IENQVV8zMnY0VAogCXNlbGVjdCBDUFVfQUJSVF9OT01NVQotCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCisJc2VsZWN0IENQVV9QQUJSVF9MRUdBQ1kKIAlzZWxlY3QgQ1BVX0NBQ0hFX1Y0CiAJaGVscAogCSAgQSAzMi1iaXQgUklTQyBtaWNyb3Byb2Nlc3NvciBiYXNlZCBvbiB0aGUgQVJNOSBwcm9jZXNzb3IgY29yZQpAQCAtMTE0LDcgKzExNCw3IEBACiAJYm9vbCAiU3VwcG9ydCBBUk05MjBUIHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SCiAJc2VsZWN0IENQVV8zMnY0VAogCXNlbGVjdCBDUFVfQUJSVF9FVjRUCi0Jc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKKwlzZWxlY3QgQ1BVX1BBQlJUX0xFR0FDWQogCXNlbGVjdCBDUFVfQ0FDSEVfVjRXVAogCXNlbGVjdCBDUFVfQ0FDSEVfVklWVAogCXNlbGVjdCBDUFVfQ1AxNV9NTVUKQEAgLTEyMiwxMCArMTIyLDcgQEAKIAlzZWxlY3QgQ1BVX1RMQl9WNFdCSSBpZiBNTVUKIAloZWxwCiAJICBUaGUgQVJNOTIwVCBpcyBsaWNlbnNlZCB0byBiZSBwcm9kdWNlZCBieSBudW1lcm91cyB2ZW5kb3JzLAotCSAgYW5kIGlzIHVzZWQgaW4gdGhlIE1hdmVyaWNrIEVQOTMxMiBhbmQgdGhlIFNhbXN1bmcgUzNDMjQxMC4KLQotCSAgTW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgTWF2ZXJpY2sgRVA5MzEyIGF0Ci0JICA8aHR0cDovL2xpbnV4ZGV2aWNlcy5jb20vcHJvZHVjdHMvUEQyMzgyODY2MDY4Lmh0bWw+LgorCSAgYW5kIGlzIHVzZWQgaW4gdGhlIENpcnJ1cyBFUDkzeHggYW5kIHRoZSBTYW1zdW5nIFMzQzI0MTAuCiAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBBUk05MjBUIHByb2Nlc3Nvci4KIAkgIE90aGVyd2lzZSwgc2F5IE4uCkBAIC0xMzUsNyArMTMyLDcgQEAKIAlib29sICJTdXBwb3J0IEFSTTkyMlQgcHJvY2Vzc29yIiBpZiBBUkNIX0lOVEVHUkFUT1IKIAlzZWxlY3QgQ1BVXzMydjRUCiAJc2VsZWN0IENQVV9BQlJUX0VWNFQKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9DQUNIRV9WNFdUCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCiAJc2VsZWN0IENQVV9DUDE1X01NVQpAQCAtMTU0LDcgKzE1MSw3IEBACiAgCWJvb2wgIlN1cHBvcnQgQVJNOTI1VCBwcm9jZXNzb3IiIGlmIEFSQ0hfT01BUDEKIAlzZWxlY3QgQ1BVXzMydjRUCiAJc2VsZWN0IENQVV9BQlJUX0VWNFQKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9DQUNIRV9WNFdUCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCiAJc2VsZWN0IENQVV9DUDE1X01NVQpAQCAtMTczLDcgKzE3MCw3IEBACiAJYm9vbCAiU3VwcG9ydCBBUk05MjZUIHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SIHx8IE1BQ0hfUkVBTFZJRVdfRUIKIAlzZWxlY3QgQ1BVXzMydjUKIAlzZWxlY3QgQ1BVX0FCUlRfRVY1VEoKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCiAJc2VsZWN0IENQVV9DUDE1X01NVQogCXNlbGVjdCBDUFVfQ09QWV9WNFdCIGlmIE1NVQpAQCAtMTkxLDcgKzE4OCw3IEBACiAJYm9vbAogCXNlbGVjdCBDUFVfMzJ2NAogCXNlbGVjdCBDUFVfQUJSVF9FVjQKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCiAJc2VsZWN0IENQVV9DUDE1X01NVQogCXNlbGVjdCBDUFVfQ0FDSEVfRkEKQEAgLTIxMCw3ICsyMDcsNyBAQAogCWRlcGVuZHMgb24gIU1NVQogCXNlbGVjdCBDUFVfMzJ2NFQKIAlzZWxlY3QgQ1BVX0FCUlRfTk9NTVUKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCiAJc2VsZWN0IENQVV9DUDE1X01QVQogCWhlbHAKQEAgLTIyOCw3ICsyMjUsNyBAQAogCWRlcGVuZHMgb24gIU1NVQogCXNlbGVjdCBDUFVfMzJ2NQogCXNlbGVjdCBDUFVfQUJSVF9OT01NVQotCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCisJc2VsZWN0IENQVV9QQUJSVF9MRUdBQ1kKIAlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKIAlzZWxlY3QgQ1BVX0NQMTVfTVBVCiAJaGVscApAQCAtMjQ0LDcgKzI0MSw3IEBACiAJYm9vbCAiU3VwcG9ydCBBUk0xMDIwVCAocmV2IDApIHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SCiAJc2VsZWN0IENQVV8zMnY1CiAJc2VsZWN0IENQVV9BQlJUX0VWNFQKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9DQUNIRV9WNFdUCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCiAJc2VsZWN0IENQVV9DUDE1X01NVQpAQCAtMjYyLDcgKzI1OSw3IEBACiAJYm9vbCAiU3VwcG9ydCBBUk0xMDIwRSBwcm9jZXNzb3IiIGlmIEFSQ0hfSU5URUdSQVRPUgogCXNlbGVjdCBDUFVfMzJ2NQogCXNlbGVjdCBDUFVfQUJSVF9FVjRUCi0Jc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKKwlzZWxlY3QgQ1BVX1BBQlJUX0xFR0FDWQogCXNlbGVjdCBDUFVfQ0FDSEVfVjRXVAogCXNlbGVjdCBDUFVfQ0FDSEVfVklWVAogCXNlbGVjdCBDUFVfQ1AxNV9NTVUKQEAgLTI3NSw3ICsyNzIsNyBAQAogCWJvb2wgIlN1cHBvcnQgQVJNMTAyMkUgcHJvY2Vzc29yIiBpZiBBUkNIX0lOVEVHUkFUT1IKIAlzZWxlY3QgQ1BVXzMydjUKIAlzZWxlY3QgQ1BVX0FCUlRfRVY0VAotCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCisJc2VsZWN0IENQVV9QQUJSVF9MRUdBQ1kKIAlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKIAlzZWxlY3QgQ1BVX0NQMTVfTU1VCiAJc2VsZWN0IENQVV9DT1BZX1Y0V0IgaWYgTU1VICMgY2FuIHByb2JhYmx5IGRvIGJldHRlcgpAQCAtMjkzLDcgKzI5MCw3IEBACiAJYm9vbCAiU3VwcG9ydCBBUk0xMDI2RUotUyBwcm9jZXNzb3IiIGlmIEFSQ0hfSU5URUdSQVRPUgogCXNlbGVjdCBDUFVfMzJ2NQogCXNlbGVjdCBDUFVfQUJSVF9FVjVUICMgQnV0IG5lZWQgSmF6ZWxsZSwgYnV0IEVWNVRKIGlnbm9yZXMgYml0IDEwCi0Jc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKKwlzZWxlY3QgQ1BVX1BBQlJUX0xFR0FDWQogCXNlbGVjdCBDUFVfQ0FDSEVfVklWVAogCXNlbGVjdCBDUFVfQ1AxNV9NTVUKIAlzZWxlY3QgQ1BVX0NPUFlfVjRXQiBpZiBNTVUgIyBjYW4gcHJvYmFibHkgZG8gYmV0dGVyCkBAIC0zMTEsNyArMzA4LDcgQEAKIAlzZWxlY3QgQ1BVXzMydjMgaWYgQVJDSF9SUEMKIAlzZWxlY3QgQ1BVXzMydjQgaWYgIUFSQ0hfUlBDCiAJc2VsZWN0IENQVV9BQlJUX0VWNAotCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCisJc2VsZWN0IENQVV9QQUJSVF9MRUdBQ1kKIAlzZWxlY3QgQ1BVX0NBQ0hFX1Y0V0IKIAlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKIAlzZWxlY3QgQ1BVX0NQMTVfTU1VCkBAIC0zMzEsNyArMzI4LDcgQEAKIAlib29sCiAJc2VsZWN0IENQVV8zMnY0CiAJc2VsZWN0IENQVV9BQlJUX0VWNAotCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCisJc2VsZWN0IENQVV9QQUJSVF9MRUdBQ1kKIAlzZWxlY3QgQ1BVX0NBQ0hFX1Y0V0IKIAlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKIAlzZWxlY3QgQ1BVX0NQMTVfTU1VCkBAIC0zNDIsNyArMzM5LDcgQEAKIAlib29sCiAJc2VsZWN0IENQVV8zMnY1CiAJc2VsZWN0IENQVV9BQlJUX0VWNVQKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCiAJc2VsZWN0IENQVV9DUDE1X01NVQogCXNlbGVjdCBDUFVfVExCX1Y0V0JJIGlmIE1NVQpAQCAtMzUyLDcgKzM0OSw3IEBACiAJYm9vbAogCXNlbGVjdCBDUFVfMzJ2NQogCXNlbGVjdCBDUFVfQUJSVF9FVjVUCi0Jc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKKwlzZWxlY3QgQ1BVX1BBQlJUX0xFR0FDWQogCXNlbGVjdCBDUFVfQ0FDSEVfVklWVAogCXNlbGVjdCBDUFVfQ1AxNV9NTVUKIAlzZWxlY3QgQ1BVX1RMQl9WNFdCSSBpZiBNTVUKQEAgLTM2Myw3ICszNjAsNyBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVXzMydjUKIAlzZWxlY3QgQ1BVX0FCUlRfRVY1VAotCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCisJc2VsZWN0IENQVV9QQUJSVF9MRUdBQ1kKIAlzZWxlY3QgQ1BVX0NBQ0hFX1ZJVlQKIAlzZWxlY3QgQ1BVX0NQMTVfTU1VCiAJc2VsZWN0IENQVV9UTEJfVjRXQkkgaWYgTU1VCkBAIC0zNzQsNyArMzcxLDcgQEAKIAlib29sCiAJc2VsZWN0IENQVV8zMnY1CiAJc2VsZWN0IENQVV9BQlJUX0VWNVQKLQlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgorCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCiAJc2VsZWN0IENQVV9DUDE1X01NVQogCXNlbGVjdCBDUFVfQ09QWV9GRVJPQ0VPTiBpZiBNTVUKQEAgLTM5NCw3ICszOTEsNyBAQAogCWJvb2wgIlN1cHBvcnQgQVJNIFY2IHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SIHx8IE1BQ0hfUkVBTFZJRVdfRUIgfHwgTUFDSF9SRUFMVklFV19QQlgKIAlzZWxlY3QgQ1BVXzMydjYKIAlzZWxlY3QgQ1BVX0FCUlRfRVY2Ci0Jc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKKwlzZWxlY3QgQ1BVX1BBQlJUX1Y2CiAJc2VsZWN0IENQVV9DQUNIRV9WNgogCXNlbGVjdCBDUFVfQ0FDSEVfVklQVAogCXNlbGVjdCBDUFVfQ1AxNV9NTVUKQEAgLTQyMCw3ICs0MTcsNyBAQAogCXNlbGVjdCBDUFVfMzJ2NksKIAlzZWxlY3QgQ1BVXzMydjcKIAlzZWxlY3QgQ1BVX0FCUlRfRVY3Ci0Jc2VsZWN0IENQVV9QQUJSVF9JRkFSCisJc2VsZWN0IENQVV9QQUJSVF9WNwogCXNlbGVjdCBDUFVfQ0FDSEVfVjcKIAlzZWxlY3QgQ1BVX0NBQ0hFX1ZJUFQKIAlzZWxlY3QgQ1BVX0NQMTVfTU1VCkBAIC00ODIsMTAgKzQ3OSwxMyBAQAogY29uZmlnIENQVV9BQlJUX0VWNwogCWJvb2wKIAotY29uZmlnIENQVV9QQUJSVF9JRkFSCitjb25maWcgQ1BVX1BBQlJUX0xFR0FDWQogCWJvb2wKIAotY29uZmlnIENQVV9QQUJSVF9OT0lGQVIKK2NvbmZpZyBDUFVfUEFCUlRfVjYKKwlib29sCisKK2NvbmZpZyBDUFVfUEFCUlRfVjcKIAlib29sCiAKICMgVGhlIGNhY2hlIG1vZGVsCkBAIC03NzEsMyArNzcxLDggQEAKIAlzZWxlY3QgT1VURVJfQ0FDSEUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBMMiBjYWNoZSBvbiBYU2NhbGUzLgorCitjb25maWcgQVJNX0wxX0NBQ0hFX1NISUZUCisJaW50CisJZGVmYXVsdCA2IGlmIEFSQ0hfT01BUDMKKwlkZWZhdWx0IDUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL01ha2VmaWxlIGIvYXJjaC9hcm0vbW0vTWFrZWZpbGUKaW5kZXggNjNlM2Y2ZC4uMDU1Y2IyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbW0vTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDEwIEBACiBvYmotJChDT05GSUdfQ1BVX0FCUlRfRVY2KQkrPSBhYm9ydC1ldjYubwogb2JqLSQoQ09ORklHX0NQVV9BQlJUX0VWNykJKz0gYWJvcnQtZXY3Lm8KIAorb2JqLSQoQ09ORklHX0NQVV9QQUJSVF9MRUdBQ1kpCSs9IHBhYm9ydC1sZWdhY3kubworb2JqLSQoQ09ORklHX0NQVV9QQUJSVF9WNikJKz0gcGFib3J0LXY2Lm8KK29iai0kKENPTkZJR19DUFVfUEFCUlRfVjcpCSs9IHBhYm9ydC12Ny5vCisKIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfVjMpCSs9IGNhY2hlLXYzLm8KIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfVjQpCSs9IGNhY2hlLXY0Lm8KIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfVjRXVCkJKz0gY2FjaGUtdjR3dC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12Ni5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjYuUwppbmRleCA4ZjVjMTNmLi4yOTVlMjVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jYWNoZS12Ni5TCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY2LlMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAKICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgogCkBAIC0xMjEsMTEgKzEyMiwxMyBAQAogICoJLSB0aGUgSWNhY2hlIGRvZXMgbm90IHJlYWQgZGF0YSBmcm9tIHRoZSB3cml0ZSBidWZmZXIKICAqLwogRU5UUlkodjZfY29oZXJlbnRfdXNlcl9yYW5nZSkKLQorIFVOV0lORCguZm5zdGFydAkJKQogI2lmZGVmIEhBUlZBUkRfQ0FDSEUKIAliaWMJcjAsIHIwLCAjQ0FDSEVfTElORV9TSVpFIC0gMQotMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBsaW5lCisxOgorIFVTRVIoCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCSkJQCBjbGVhbiBEIGxpbmUKIAlhZGQJcjAsIHIwLCAjQ0FDSEVfTElORV9TSVpFCisyOgogCWNtcAlyMCwgcjEKIAlibG8JMWIKICNlbmRpZgpAQCAtMTQzLDYgKzE0NiwxOSBAQAogCW1vdglwYywgbHIKIAogLyoKKyAqIEZhdWx0IGhhbmRsaW5nIGZvciB0aGUgY2FjaGUgb3BlcmF0aW9uIGFib3ZlLiBJZiB0aGUgdmlydHVhbCBhZGRyZXNzIGluIHIwCisgKiBpc24ndCBtYXBwZWQsIGp1c3QgdHJ5IHRoZSBuZXh0IHBhZ2UuCisgKi8KKzkwMDE6CisJbW92CXIwLCByMCwgbHNyICMxMgorCW1vdglyMCwgcjAsIGxzbCAjMTIKKwlhZGQJcjAsIHIwLCAjNDA5NgorCWIJMmIKKyBVTldJTkQoLmZuZW5kCQkpCitFTkRQUk9DKHY2X2NvaGVyZW50X3VzZXJfcmFuZ2UpCitFTkRQUk9DKHY2X2NvaGVyZW50X2tlcm5fcmFuZ2UpCisKKy8qCiAgKgl2Nl9mbHVzaF9rZXJuX2RjYWNoZV9wYWdlKGthZGRyKQogICoKICAqCUVuc3VyZSB0aGF0IHRoZSBkYXRhIGhlbGQgaW4gdGhlIHBhZ2Uga2FkZHIgaXMgd3JpdHRlbiBiYWNrCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12Ny5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUwppbmRleCBiZGEwZWMzLi5lMWJkOTc1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jYWNoZS12Ny5TCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAKICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgogCkBAIC0xNTMsMTMgKzE1NCwxNiBAQAogICoJLSB0aGUgSWNhY2hlIGRvZXMgbm90IHJlYWQgZGF0YSBmcm9tIHRoZSB3cml0ZSBidWZmZXIKICAqLwogRU5UUlkodjdfY29oZXJlbnRfdXNlcl9yYW5nZSkKKyBVTldJTkQoLmZuc3RhcnQJCSkKIAlkY2FjaGVfbGluZV9zaXplIHIyLCByMwogCXN1YglyMywgcjIsICMxCiAJYmljCXIwLCByMCwgcjMKLTE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzExLCAxCQlAIGNsZWFuIEQgbGluZSB0byB0aGUgcG9pbnQgb2YgdW5pZmljYXRpb24KKzE6CisgVVNFUigJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTEsIDEJKQlAIGNsZWFuIEQgbGluZSB0byB0aGUgcG9pbnQgb2YgdW5pZmljYXRpb24KIAlkc2IKLQltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxCQlAIGludmFsaWRhdGUgSSBsaW5lCisgVVNFUigJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMQkpCUAgaW52YWxpZGF0ZSBJIGxpbmUKIAlhZGQJcjAsIHIwLCByMgorMjoKIAljbXAJcjAsIHIxCiAJYmxvCTFiCiAJbW92CXIwLCAjMApAQCAtMTY3LDYgKzE3MSwxNyBAQAogCWRzYgogCWlzYgogCW1vdglwYywgbHIKKworLyoKKyAqIEZhdWx0IGhhbmRsaW5nIGZvciB0aGUgY2FjaGUgb3BlcmF0aW9uIGFib3ZlLiBJZiB0aGUgdmlydHVhbCBhZGRyZXNzIGluIHIwCisgKiBpc24ndCBtYXBwZWQsIGp1c3QgdHJ5IHRoZSBuZXh0IHBhZ2UuCisgKi8KKzkwMDE6CisJbW92CXIwLCByMCwgbHNyICMxMgorCW1vdglyMCwgcjAsIGxzbCAjMTIKKwlhZGQJcjAsIHIwLCAjNDA5NgorCWIJMmIKKyBVTldJTkQoLmZuZW5kCQkpCiBFTkRQUk9DKHY3X2NvaGVyZW50X2tlcm5fcmFuZ2UpCiBFTkRQUk9DKHY3X2NvaGVyZW50X3VzZXJfcmFuZ2UpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvbnRleHQuYyBiL2FyY2gvYXJtL21tL2NvbnRleHQuYwppbmRleCBmYzg0ZmNjLi5hOWUyMmUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb250ZXh0LmMKKysrIGIvYXJjaC9hcm0vbW0vY29udGV4dC5jCkBAIC01MCwxNSArNTAsMTIgQEAKIAkJaXNiKCk7CiAJCWZsdXNoX3RsYl9hbGwoKTsKIAkJaWYgKGljYWNoZV9pc192aXZ0X2FzaWRfdGFnZ2VkKCkpIHsKLQkJCWFzbSgibWNyCXAxNSwgMCwgJTAsIGM3LCBjNSwgMAlAIGludmFsaWRhdGUgSS1jYWNoZVxuIgotCQkJICAgICJtY3IJcDE1LCAwLCAlMCwgYzcsIGM1LCA2CUAgZmx1c2ggQlRBQy9CVEJcbiIKLQkJCSAgICA6Ci0JCQkgICAgOiAiciIgKDApKTsKKwkJCV9fZmx1c2hfaWNhY2hlX2FsbCgpOwogCQkJZHNiKCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2soJmNwdV9hc2lkX2xvY2spOwogCi0JbW0tPmNwdV92bV9tYXNrID0gY3B1bWFza19vZl9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwljcHVtYXNrX2NvcHkobW1fY3B1bWFzayhtbSksIGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CiAJbW0tPmNvbnRleHQuaWQgPSBhc2lkOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKaW5kZXggYjMwOTI1Zi4uYjk1OTBhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAogCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOwogCi0JaWYgKG1hc2sgIT0gMHhmZmZmZmZmZikKKwlpZiAobWFzayA8IDB4ZmZmZmZmZmZVTEwpCiAJCWdmcCB8PSBHRlBfRE1BOwogCiAJcGFnZSA9IGFsbG9jX3BhZ2VzKGdmcCwgb3JkZXIpOwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJaWYgKCFtYXNrKQogCQlnb3RvIGVycm9yOwogCi0JaWYgKG1hc2sgIT0gMHhmZmZmZmZmZikKKwlpZiAobWFzayA8IDB4ZmZmZmZmZmZVTEwpCiAJCWdmcCB8PSBHRlBfRE1BOwogCXZpcnQgPSBrbWFsbG9jKHNpemUsIGdmcCk7CiAJaWYgKCF2aXJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jIGIvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jCmluZGV4IGJjMDA5OWQuLmQwZDE3YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2ZhdWx0LWFybXYuYworKysgYi9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMKQEAgLTE1MywxNCArMTUzLDExIEBACiAKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKIAltYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwotCWlmIChtYXBwaW5nKSB7CiAjaWZuZGVmIENPTkZJR19TTVAKLQkJaW50IGRpcnR5ID0gdGVzdF9hbmRfY2xlYXJfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJnBhZ2UtPmZsYWdzKTsKLQotCQlpZiAoZGlydHkpCi0JCQlfX2ZsdXNoX2RjYWNoZV9wYWdlKG1hcHBpbmcsIHBhZ2UpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUEdfZGNhY2hlX2RpcnR5LCAmcGFnZS0+ZmxhZ3MpKQorCQlfX2ZsdXNoX2RjYWNoZV9wYWdlKG1hcHBpbmcsIHBhZ2UpOwogI2VuZGlmCi0KKwlpZiAobWFwcGluZykgewogCQlpZiAoY2FjaGVfaXNfdml2dCgpKQogCQkJbWFrZV9jb2hlcmVudChtYXBwaW5nLCB2bWEsIGFkZHIsIHBmbik7CiAJCWVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQuYyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKaW5kZXggY2M4ODI5ZC4uMTBlMDY4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQuYworKysgYi9hcmNoL2FybS9tbS9mYXVsdC5jCkBAIC0yNSw2ICsyNSwxOSBAQAogCiAjaW5jbHVkZSAiZmF1bHQuaCIKIAorLyoKKyAqIEZhdWx0IHN0YXR1cyByZWdpc3RlciBlbmNvZGluZ3MuICBXZSBzdGVhbCBiaXQgMzEgZm9yIG91ciBvd24gcHVycG9zZXMuCisgKi8KKyNkZWZpbmUgRlNSX0xOWF9QRgkJKDEgPDwgMzEpCisjZGVmaW5lIEZTUl9XUklURQkJKDEgPDwgMTEpCisjZGVmaW5lIEZTUl9GUzQJCQkoMSA8PCAxMCkKKyNkZWZpbmUgRlNSX0ZTM18wCQkoMTUpCisKK3N0YXRpYyBpbmxpbmUgaW50IGZzcl9mcyh1bnNpZ25lZCBpbnQgZnNyKQoreworCXJldHVybiAoZnNyICYgRlNSX0ZTM18wKSB8IChmc3IgJiBGU1JfRlM0KSA+PiA2OworfQorCiAjaWZkZWYgQ09ORklHX01NVQogCiAjaWZkZWYgQ09ORklHX0tQUk9CRVMKQEAgLTE4MiwxOCArMTk1LDM1IEBACiAjZGVmaW5lIFZNX0ZBVUxUX0JBRE1BUAkJMHgwMTAwMDAKICNkZWZpbmUgVk1fRkFVTFRfQkFEQUNDRVNTCTB4MDIwMDAwCiAKLXN0YXRpYyBpbnQKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgVk1BIGFsbG93IGZvciB0aGUgZmF1bHQgd2hpY2ggb2NjdXJyZWQuCisgKiBJZiB3ZSBlbmNvdW50ZXJlZCBhIHdyaXRlIGZhdWx0LCB3ZSBtdXN0IGhhdmUgd3JpdGUgcGVybWlzc2lvbiwgb3RoZXJ3aXNlCisgKiB3ZSBhbGxvdyBhbnkgcGVybWlzc2lvbi4KKyAqLworc3RhdGljIGlubGluZSBib29sIGFjY2Vzc19lcnJvcih1bnNpZ25lZCBpbnQgZnNyLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUM7CisKKwlpZiAoZnNyICYgRlNSX1dSSVRFKQorCQltYXNrID0gVk1fV1JJVEU7CisJaWYgKGZzciAmIEZTUl9MTlhfUEYpCisJCW1hc2sgPSBWTV9FWEVDOworCisJcmV0dXJuIHZtYS0+dm1fZmxhZ3MgJiBtYXNrID8gZmFsc2UgOiB0cnVlOworfQorCitzdGF0aWMgaW50IF9fa3Byb2JlcwogX19kb19wYWdlX2ZhdWx0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsCiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCWludCBmYXVsdCwgbWFzazsKKwlpbnQgZmF1bHQ7CiAKIAl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CiAJZmF1bHQgPSBWTV9GQVVMVF9CQURNQVA7Ci0JaWYgKCF2bWEpCisJaWYgKHVubGlrZWx5KCF2bWEpKQogCQlnb3RvIG91dDsKLQlpZiAodm1hLT52bV9zdGFydCA+IGFkZHIpCisJaWYgKHVubGlrZWx5KHZtYS0+dm1fc3RhcnQgPiBhZGRyKSkKIAkJZ290byBjaGVja19zdGFjazsKIAogCS8qCkBAIC0yMDEsNDcgKzIzMSwyNCBAQAogCSAqIG1lbW9yeSBhY2Nlc3MsIHNvIHdlIGNhbiBoYW5kbGUgaXQuCiAJICovCiBnb29kX2FyZWE6Ci0JaWYgKGZzciAmICgxIDw8IDExKSkgLyogd3JpdGU/ICovCi0JCW1hc2sgPSBWTV9XUklURTsKLQllbHNlCi0JCW1hc2sgPSBWTV9SRUFEfFZNX0VYRUN8Vk1fV1JJVEU7Ci0KLQlmYXVsdCA9IFZNX0ZBVUxUX0JBREFDQ0VTUzsKLQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgbWFzaykpCisJaWYgKGFjY2Vzc19lcnJvcihmc3IsIHZtYSkpIHsKKwkJZmF1bHQgPSBWTV9GQVVMVF9CQURBQ0NFU1M7CiAJCWdvdG8gb3V0OworCX0KIAogCS8qCi0JICogSWYgZm9yIGFueSByZWFzb24gYXQgYWxsIHdlIGNvdWxkbid0IGhhbmRsZQotCSAqIHRoZSBmYXVsdCwgbWFrZSBzdXJlIHdlIGV4aXQgZ3JhY2VmdWxseSByYXRoZXIKLQkgKiB0aGFuIGVuZGxlc3NseSByZWRvIHRoZSBmYXVsdC4KKwkgKiBJZiBmb3IgYW55IHJlYXNvbiBhdCBhbGwgd2UgY291bGRuJ3QgaGFuZGxlIHRoZSBmYXVsdCwgbWFrZQorCSAqIHN1cmUgd2UgZXhpdCBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGVuZGxlc3NseSByZWRvIHRoZSBmYXVsdC4KIAkgKi8KLXN1cnZpdmU6Ci0JZmF1bHQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkciAmIFBBR0VfTUFTSywgKGZzciAmICgxIDw8IDExKSkgPyBGQVVMVF9GTEFHX1dSSVRFIDogMCk7Ci0JaWYgKHVubGlrZWx5KGZhdWx0ICYgVk1fRkFVTFRfRVJST1IpKSB7Ci0JCWlmIChmYXVsdCAmIFZNX0ZBVUxUX09PTSkKLQkJCWdvdG8gb3V0X29mX21lbW9yeTsKLQkJZWxzZSBpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpCi0JCQlyZXR1cm4gZmF1bHQ7Ci0JCUJVRygpOwotCX0KKwlmYXVsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyICYgUEFHRV9NQVNLLCAoZnNyICYgRlNSX1dSSVRFKSA/IEZBVUxUX0ZMQUdfV1JJVEUgOiAwKTsKKwlpZiAodW5saWtlbHkoZmF1bHQgJiBWTV9GQVVMVF9FUlJPUikpCisJCXJldHVybiBmYXVsdDsKIAlpZiAoZmF1bHQgJiBWTV9GQVVMVF9NQUpPUikKIAkJdHNrLT5tYWpfZmx0Kys7CiAJZWxzZQogCQl0c2stPm1pbl9mbHQrKzsKIAlyZXR1cm4gZmF1bHQ7CiAKLW91dF9vZl9tZW1vcnk6Ci0JaWYgKCFpc19nbG9iYWxfaW5pdCh0c2spKQotCQlnb3RvIG91dDsKLQotCS8qCi0JICogSWYgd2UgYXJlIG91dCBvZiBtZW1vcnkgZm9yIHBpZDEsIHNsZWVwIGZvciBhIHdoaWxlIGFuZCByZXRyeQotCSAqLwotCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JeWllbGQoKTsKLQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JZ290byBzdXJ2aXZlOwotCiBjaGVja19zdGFjazoKIAlpZiAodm1hLT52bV9mbGFncyAmIFZNX0dST1dTRE9XTiAmJiAhZXhwYW5kX3N0YWNrKHZtYSwgYWRkcikpCiAJCWdvdG8gZ29vZF9hcmVhOwpAQCAtMjc4LDYgKzI4NSwxOCBAQAogCQlpZiAoIXVzZXJfbW9kZShyZWdzKSAmJiAhc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+QVJNX3BjKSkKIAkJCWdvdG8gbm9fY29udGV4dDsKIAkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBhYm92ZSBkb3duX3JlYWRfdHJ5bG9jaygpIG1pZ2h0IGhhdmUgc3VjY2VlZGVkIGluCisJCSAqIHdoaWNoIGNhc2UsIHdlJ2xsIGhhdmUgbWlzc2VkIHRoZSBtaWdodF9zbGVlcCgpIGZyb20KKwkJICogZG93bl9yZWFkKCkKKwkJICovCisJCW1pZ2h0X3NsZWVwKCk7CisjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCisJCWlmICghdXNlcl9tb2RlKHJlZ3MpICYmCisJCSAgICAhc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+QVJNX3BjKSkKKwkJCWdvdG8gbm9fY29udGV4dDsKKyNlbmRpZgogCX0KIAogCWZhdWx0ID0gX19kb19wYWdlX2ZhdWx0KG1tLCBhZGRyLCBmc3IsIHRzayk7CkBAIC0yODksNiArMzA4LDE2IEBACiAJaWYgKGxpa2VseSghKGZhdWx0ICYgKFZNX0ZBVUxUX0VSUk9SIHwgVk1fRkFVTFRfQkFETUFQIHwgVk1fRkFVTFRfQkFEQUNDRVNTKSkpKQogCQlyZXR1cm4gMDsKIAorCWlmIChmYXVsdCAmIFZNX0ZBVUxUX09PTSkgeworCQkvKgorCQkgKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgY2FsbCB0aGUgT09NIGtpbGxlciwgYW5kIHJldHVybiB0bworCQkgKiB1c2Vyc3BhY2UgKHdoaWNoIHdpbGwgcmV0cnkgdGhlIGZhdWx0LCBvciBraWxsIHVzIGlmIHdlCisJCSAqIGdvdCBvb20ta2lsbGVkKQorCQkgKi8KKwkJcGFnZWZhdWx0X291dF9vZl9tZW1vcnkoKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyoKIAkgKiBJZiB3ZSBhcmUgaW4ga2VybmVsIG1vZGUgYXQgdGhpcyBwb2ludCwgd2UKIAkgKiBoYXZlIG5vIGNvbnRleHQgdG8gaGFuZGxlIHRoaXMgZmF1bHQgd2l0aC4KQEAgLTI5NiwxNiArMzI1LDYgQEAKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJZ290byBub19jb250ZXh0OwogCi0JaWYgKGZhdWx0ICYgVk1fRkFVTFRfT09NKSB7Ci0JCS8qCi0JCSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBvciBzb21lIG90aGVyIHRoaW5nCi0JCSAqIGhhcHBlbmVkIHRvIHVzIHRoYXQgbWFkZSB1cyB1bmFibGUgdG8gaGFuZGxlCi0JCSAqIHRoZSBwYWdlIGZhdWx0IGdyYWNlZnVsbHkuCi0JCSAqLwotCQlwcmludGsoIlZNOiBraWxsaW5nIHByb2Nlc3MgJXNcbiIsIHRzay0+Y29tbSk7Ci0JCWRvX2dyb3VwX2V4aXQoU0lHS0lMTCk7Ci0JCXJldHVybiAwOwotCX0KIAlpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpIHsKIAkJLyoKIAkJICogV2UgaGFkIHNvbWUgbWVtb3J5LCBidXQgd2VyZSB1bmFibGUgdG8KQEAgLTQ4OSwxMCArNTA4LDEwIEBACiBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb24KIGRvX0RhdGFBYm9ydCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWNvbnN0IHN0cnVjdCBmc3JfaW5mbyAqaW5mID0gZnNyX2luZm8gKyAoZnNyICYgMTUpICsgKChmc3IgJiAoMSA8PCAxMCkpID4+IDYpOworCWNvbnN0IHN0cnVjdCBmc3JfaW5mbyAqaW5mID0gZnNyX2luZm8gKyBmc3JfZnMoZnNyKTsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCi0JaWYgKCFpbmYtPmZuKGFkZHIsIGZzciwgcmVncykpCisJaWYgKCFpbmYtPmZuKGFkZHIsIGZzciAmIH5GU1JfTE5YX1BGLCByZWdzKSkKIAkJcmV0dXJuOwogCiAJcHJpbnRrKEtFUk5fQUxFUlQgIlVuaGFuZGxlZCBmYXVsdDogJXMgKDB4JTAzeCkgYXQgMHglMDhseFxuIiwKQEAgLTUwNSw5ICs1MjQsNTggQEAKIAlhcm1fbm90aWZ5X2RpZSgiIiwgcmVncywgJmluZm8sIGZzciwgMCk7CiB9CiAKKworc3RhdGljIHN0cnVjdCBmc3JfaW5mbyBpZnNyX2luZm9bXSA9IHsKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAwIgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMSIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJkZWJ1ZyBldmVudCIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJzZWN0aW9uIGFjY2VzcyBmbGFnIGZhdWx0IgkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDQiCQkJICAgfSwKKwl7IGRvX3RyYW5zbGF0aW9uX2ZhdWx0LAlTSUdTRUdWLCBTRUdWX01BUEVSUiwJInNlY3Rpb24gdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCisJeyBkb19iYWQsCQlTSUdTRUdWLCBTRUdWX0FDQ0VSUiwJInBhZ2UgYWNjZXNzIGZsYWcgZmF1bHQiCSAgIH0sCisJeyBkb19wYWdlX2ZhdWx0LAlTSUdTRUdWLCBTRUdWX01BUEVSUiwJInBhZ2UgdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giICB9LAorCXsgZG9fYmFkLAkJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJzZWN0aW9uIGRvbWFpbiBmYXVsdCIJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMTAiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR1NFR1YsIFNFR1ZfQUNDRVJSLAkicGFnZSBkb21haW4gZmF1bHQiCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLAkgMCwJCSJleHRlcm5hbCBhYm9ydCBvbiB0cmFuc2xhdGlvbiIJICAgfSwKKwl7IGRvX3NlY3RfZmF1bHQsCVNJR1NFR1YsIFNFR1ZfQUNDRVJSLAkic2VjdGlvbiBwZXJtaXNzaW9uIGZhdWx0IgkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLAkgMCwJCSJleHRlcm5hbCBhYm9ydCBvbiB0cmFuc2xhdGlvbiIJICAgfSwKKwl7IGRvX3BhZ2VfZmF1bHQsCVNJR1NFR1YsIFNFR1ZfQUNDRVJSLAkicGFnZSBwZXJtaXNzaW9uIGZhdWx0IgkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAxNiIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDE3IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMTgiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAxOSIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDIwIgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMjEiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAyMiIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDIzIgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMjQiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAyNSIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDI2IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMjciCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAyOCIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDI5IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMzAiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAzMSIJCQkgICB9LAorfTsKKwogYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uCi1kb19QcmVmZXRjaEFib3J0KHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitkb19QcmVmZXRjaEFib3J0KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IGlmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWRvX3RyYW5zbGF0aW9uX2ZhdWx0KGFkZHIsIDAsIHJlZ3MpOworCWNvbnN0IHN0cnVjdCBmc3JfaW5mbyAqaW5mID0gaWZzcl9pbmZvICsgZnNyX2ZzKGlmc3IpOworCXN0cnVjdCBzaWdpbmZvIGluZm87CisKKwlpZiAoIWluZi0+Zm4oYWRkciwgaWZzciB8IEZTUl9MTlhfUEYsIHJlZ3MpKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9BTEVSVCAiVW5oYW5kbGVkIHByZWZldGNoIGFib3J0OiAlcyAoMHglMDN4KSBhdCAweCUwOGx4XG4iLAorCQlpbmYtPm5hbWUsIGlmc3IsIGFkZHIpOworCisJaW5mby5zaV9zaWdubyA9IGluZi0+c2lnOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSAgPSBpbmYtPmNvZGU7CisJaW5mby5zaV9hZGRyICA9ICh2b2lkIF9fdXNlciAqKWFkZHI7CisJYXJtX25vdGlmeV9kaWUoIiIsIHJlZ3MsICZpbmZvLCBpZnNyLCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmx1c2guYyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKaW5kZXggNTc1ZjNhZC4uN2YyOTRmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmx1c2guYworKysgYi9hcmNoL2FybS9tbS9mbHVzaC5jCkBAIC0xOCwxMCArMTgsNiBAQAogCiAjaW5jbHVkZSAibW0uaCIKIAotI2lmZGVmIENPTkZJR19BUk1fRVJSQVRBXzQxMTkyMAotZXh0ZXJuIHZvaWQgdjZfaWNhY2hlX2ludmFsX2FsbCh2b2lkKTsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0NQVV9DQUNIRV9WSVBUCiAKICNkZWZpbmUgQUxJQVNfRkxVU0hfU1RBUlQJMHhmZmZmNDAwMApAQCAtMzUsNDUgKzMxLDM1IEBACiAJZmx1c2hfdGxiX2tlcm5lbF9wYWdlKHRvKTsKIAogCWFzbSgJIm1jcnIJcDE1LCAwLCAlMSwgJTAsIGMxNFxuIgotCSIJbWNyCXAxNSwgMCwgJTIsIGM3LCBjMTAsIDRcbiIKLSNpZm5kZWYgQ09ORklHX0FSTV9FUlJBVEFfNDExOTIwCi0JIgltY3IJcDE1LCAwLCAlMiwgYzcsIGM1LCAwXG4iCi0jZW5kaWYKKwkiCW1jcglwMTUsIDAsICUyLCBjNywgYzEwLCA0IgogCSAgICA6CiAJICAgIDogInIiICh0byksICJyIiAodG8gKyBQQUdFX1NJWkUgLSBMMV9DQUNIRV9CWVRFUyksICJyIiAoemVybykKIAkgICAgOiAiY2MiKTsKLSNpZmRlZiBDT05GSUdfQVJNX0VSUkFUQV80MTE5MjAKLQl2Nl9pY2FjaGVfaW52YWxfYWxsKCk7Ci0jZW5kaWYKKwlfX2ZsdXNoX2ljYWNoZV9hbGwoKTsKIH0KIAogdm9pZCBmbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlpZiAoY2FjaGVfaXNfdml2dCgpKSB7Ci0JCWlmIChjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbS0+Y3B1X3ZtX21hc2spKQorCQlpZiAoY3B1bWFza190ZXN0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG1tX2NwdW1hc2sobW0pKSkKIAkJCV9fY3B1Y19mbHVzaF91c2VyX2FsbCgpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSkgewogCQlhc20oCSJtY3IJcDE1LCAwLCAlMCwgYzcsIGMxNCwgMFxuIgotCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzEwLCA0XG4iCi0jaWZuZGVmIENPTkZJR19BUk1fRVJSQVRBXzQxMTkyMAotCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzUsIDBcbiIKLSNlbmRpZgorCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzEwLCA0IgogCQkgICAgOgogCQkgICAgOiAiciIgKDApCiAJCSAgICA6ICJjYyIpOwotI2lmZGVmIENPTkZJR19BUk1fRVJSQVRBXzQxMTkyMAotCQl2Nl9pY2FjaGVfaW52YWxfYWxsKCk7Ci0jZW5kaWYKKwkJX19mbHVzaF9pY2FjaGVfYWxsKCk7CiAJfQogfQogCiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlpZiAoY2FjaGVfaXNfdml2dCgpKSB7Ci0JCWlmIChjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCB2bWEtPnZtX21tLT5jcHVfdm1fbWFzaykpCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW1fY3B1bWFzayh2bWEtPnZtX21tKSkpCiAJCQlfX2NwdWNfZmx1c2hfdXNlcl9yYW5nZShzdGFydCAmIFBBR0VfTUFTSywgUEFHRV9BTElHTihlbmQpLAogCQkJCQkJdm1hLT52bV9mbGFncyk7CiAJCXJldHVybjsKQEAgLTgxLDIzICs2NywxOCBAQAogCiAJaWYgKGNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSkgewogCQlhc20oCSJtY3IJcDE1LCAwLCAlMCwgYzcsIGMxNCwgMFxuIgotCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzEwLCA0XG4iCi0jaWZuZGVmIENPTkZJR19BUk1fRVJSQVRBXzQxMTkyMAotCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzUsIDBcbiIKLSNlbmRpZgorCQkiCW1jcglwMTUsIDAsICUwLCBjNywgYzEwLCA0IgogCQkgICAgOgogCQkgICAgOiAiciIgKDApCiAJCSAgICA6ICJjYyIpOwotI2lmZGVmIENPTkZJR19BUk1fRVJSQVRBXzQxMTkyMAotCQl2Nl9pY2FjaGVfaW52YWxfYWxsKCk7Ci0jZW5kaWYKKwkJX19mbHVzaF9pY2FjaGVfYWxsKCk7CiAJfQogfQogCiB2b2lkIGZsdXNoX2NhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyLCB1bnNpZ25lZCBsb25nIHBmbikKIHsKIAlpZiAoY2FjaGVfaXNfdml2dCgpKSB7Ci0JCWlmIChjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCB2bWEtPnZtX21tLT5jcHVfdm1fbWFzaykpIHsKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbV9jcHVtYXNrKHZtYS0+dm1fbW0pKSkgewogCQkJdW5zaWduZWQgbG9uZyBhZGRyID0gdXNlcl9hZGRyICYgUEFHRV9NQVNLOwogCQkJX19jcHVjX2ZsdXNoX3VzZXJfcmFuZ2UoYWRkciwgYWRkciArIFBBR0VfU0laRSwgdm1hLT52bV9mbGFncyk7CiAJCX0KQEAgLTExMyw3ICs5NCw3IEBACiAJCQkgdW5zaWduZWQgbG9uZyBsZW4sIGludCB3cml0ZSkKIHsKIAlpZiAoY2FjaGVfaXNfdml2dCgpKSB7Ci0JCWlmIChjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCB2bWEtPnZtX21tLT5jcHVfdm1fbWFzaykpIHsKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbV9jcHVtYXNrKHZtYS0+dm1fbW0pKSkgewogCQkJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpa2FkZHI7CiAJCQlfX2NwdWNfY29oZXJlbnRfa2Vybl9yYW5nZShhZGRyLCBhZGRyICsgbGVuKTsKIAkJfQpAQCAtMTI2LDcgKzEwNyw3IEBACiAJfQogCiAJLyogVklQVCBub24tYWxpYXNpbmcgY2FjaGUgKi8KLQlpZiAoY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgdm1hLT52bV9tbS0+Y3B1X3ZtX21hc2spICYmCisJaWYgKGNwdW1hc2tfdGVzdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbV9jcHVtYXNrKHZtYS0+dm1fbW0pKSAmJgogCSAgICB2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykgewogCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylrYWRkcjsKIAkJLyogb25seSBmbHVzaGluZyB0aGUga2VybmVsIG1hcHBpbmcgb24gbm9uLWFsaWFzaW5nIFZJUFQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2hpZ2htZW0uYyBiL2FyY2gvYXJtL21tL2hpZ2htZW0uYwppbmRleCA3M2NhZTU3Li4zMGY4MmZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9oaWdobWVtLmMKKysrIGIvYXJjaC9hcm0vbW0vaGlnaG1lbS5jCkBAIC00Niw2ICs0Niw4IEBACiAJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKIAkJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKIAorCWRlYnVnX2ttYXBfYXRvbWljKHR5cGUpOworCiAJa21hcCA9IGttYXBfaGlnaF9nZXQocGFnZSk7CiAJaWYgKGttYXApCiAJCXJldHVybiBrbWFwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vaW5pdC5jIGIvYXJjaC9hcm0vbW0vaW5pdC5jCmluZGV4IGY5ODI2MDYuLjUyYzQwZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2luaXQuYworKysgYi9hcmNoL2FybS9tbS9pbml0LmMKQEAgLTI3Myw3ICsyNzMsNiBAQAogCQlzdHJ1Y3QgbWVtYmFuayAqYmFuayA9ICZtaS0+YmFua1tpXTsKIAkJaWYgKCFiYW5rLT5oaWdobWVtKQogCQkJZnJlZV9ib290bWVtX25vZGUocGdkYXQsIGJhbmtfcGh5c19zdGFydChiYW5rKSwgYmFua19waHlzX3NpemUoYmFuaykpOwotCQltZW1vcnlfcHJlc2VudChub2RlLCBiYW5rX3Bmbl9zdGFydChiYW5rKSwgYmFua19wZm5fZW5kKGJhbmspKTsKIAl9CiAKIAkvKgpAQCAtMzcwLDYgKzM2OSwxOSBAQAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChwZm5fdmFsaWQpOworCitzdGF0aWMgdm9pZCBhcm1fbWVtb3J5X3ByZXNlbnQoc3RydWN0IG1lbWluZm8gKm1pLCBpbnQgbm9kZSkKK3sKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBhcm1fbWVtb3J5X3ByZXNlbnQoc3RydWN0IG1lbWluZm8gKm1pLCBpbnQgbm9kZSkKK3sKKwlpbnQgaTsKKwlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkgeworCQlzdHJ1Y3QgbWVtYmFuayAqYmFuayA9ICZtaS0+YmFua1tpXTsKKwkJbWVtb3J5X3ByZXNlbnQobm9kZSwgYmFua19wZm5fc3RhcnQoYmFuayksIGJhbmtfcGZuX2VuZChiYW5rKSk7CisJfQorfQogI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19pbml0IG1lbWluZm9fY21wKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKQEAgLTQyNyw2ICs0MzksMTIgQEAKIAkJICovCiAJCWlmIChub2RlID09IGluaXRyZF9ub2RlKQogCQkJYm9vdG1lbV9yZXNlcnZlX2luaXRyZChub2RlKTsKKworCQkvKgorCQkgKiBTcGFyc2VtZW0gdHJpZXMgdG8gYWxsb2NhdGUgYm9vdG1lbSBpbiBtZW1vcnlfcHJlc2VudCgpLAorCQkgKiBzbyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpeGVkIHJlc2VydmF0aW9ucworCQkgKi8KKwkJYXJtX21lbW9yeV9wcmVzZW50KG1pLCBub2RlKTsKIAl9CiAKIAkvKgpAQCAtNDgzLDcgKzUwMSw3IEBACiAJLyoKIAkgKiBDb252ZXJ0IHN0YXJ0X3Bmbi9lbmRfcGZuIHRvIGEgc3RydWN0IHBhZ2UgcG9pbnRlci4KIAkgKi8KLQlzdGFydF9wZyA9IHBmbl90b19wYWdlKHN0YXJ0X3Bmbik7CisJc3RhcnRfcGcgPSBwZm5fdG9fcGFnZShzdGFydF9wZm4gLSAxKSArIDE7CiAJZW5kX3BnID0gcGZuX3RvX3BhZ2UoZW5kX3Bmbik7CiAKIAkvKgpAQCAtNjEzLDYgKzYzMSwxNCBAQAogCiB2b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQogeworI2lmZGVmIENPTkZJR19IQVZFX1RDTQorCWV4dGVybiBjaGFyICpfX3RjbV9zdGFydCwgKl9fdGNtX2VuZDsKKworCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYXJlYShfX3BoeXNfdG9fcGZuKF9fcGEoX190Y21fc3RhcnQpKSwKKwkJCQkgICAgX19waHlzX3RvX3BmbihfX3BhKF9fdGNtX2VuZCkpLAorCQkJCSAgICAiVENNIGxpbmsiKTsKKyNlbmRpZgorCiAJaWYgKCFtYWNoaW5lX2lzX2ludGVncmF0b3IoKSAmJiAhbWFjaGluZV9pc19jaW50ZWdyYXRvcigpKQogCQl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FyZWEoX19waHlzX3RvX3BmbihfX3BhKF9faW5pdF9iZWdpbikpLAogCQkJCQkgICAgX19waHlzX3RvX3BmbihfX3BhKF9faW5pdF9lbmQpKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tYXAuYyBiL2FyY2gvYXJtL21tL21tYXAuYwppbmRleCBmNzQ1N2ZlLi4yYjc5OTY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbWFwLmMKKysrIGIvYXJjaC9hcm0vbW0vbW1hcC5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIHsKIAlpZiAoYWRkciA8IFBIWVNfT0ZGU0VUKQogCQlyZXR1cm4gMDsKLQlpZiAoYWRkciArIHNpemUgPj0gX19wYShoaWdoX21lbW9yeSAtIDEpKQorCWlmIChhZGRyICsgc2l6ZSA+IF9fcGEoaGlnaF9tZW1vcnkgLSAxKSArIDEpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IDQ0MjZlZTYuLmVhNjdiZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hldHlwZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPGFzbS9zbXBfcGxhdC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vaGlnaG1lbS5oPgogCkBAIC0xMTYsNiArMTE3LDEzIEBACiAJfQogCWlmIChpID09IEFSUkFZX1NJWkUoY2FjaGVfcG9saWNpZXMpKQogCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiB1bmtub3duIG9yIHVuc3VwcG9ydGVkIGNhY2hlIHBvbGljeVxuIik7CisJLyoKKwkgKiBUaGlzIHJlc3RyaWN0aW9uIGlzIHBhcnRseSB0byBkbyB3aXRoIHRoZSB3YXkgd2UgYm9vdDsgaXQgaXMKKwkgKiB1bnByZWRpY3RhYmxlIHRvIGhhdmUgbWVtb3J5IG1hcHBlZCB1c2luZyB0d28gZGlmZmVyZW50IHNldHMgb2YKKwkgKiBtZW1vcnkgYXR0cmlidXRlcyAoc2hhcmVkLCB0eXBlLCBhbmQgY2FjaGUgYXR0cmlicykuICBXZSBjYW4gbm90CisJICogY2hhbmdlIHRoZXNlIGF0dHJpYnV0ZXMgb25jZSB0aGUgaW5pdGlhbCBhc3NlbWJseSBoYXMgc2V0dXAgdGhlCisJICogcGFnZSB0YWJsZXMuCisJICovCiAJaWYgKGNwdV9hcmNoaXRlY3R1cmUoKSA+PSBDUFVfQVJDSF9BUk12NikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJPbmx5IGNhY2hlcG9saWN5PXdyaXRlYmFjayBzdXBwb3J0ZWQgb24gQVJNdjYgYW5kIGxhdGVyXG4iKTsKIAkJY2FjaGVwb2xpY3kgPSBDUE9MSUNZX1dSSVRFQkFDSzsKQEAgLTcwOSwxMCArNzE3LDYgQEAKIAkJCWlmIChtZW1pbmZvLm5yX2JhbmtzID49IE5SX0JBTktTKSB7CiAJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiTlJfQkFOS1MgdG9vIGxvdywgIgogCQkJCQkJICJpZ25vcmluZyBoaWdoIG1lbW9yeVxuIik7Ci0JCQl9IGVsc2UgaWYgKGNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSkgewotCQkJCXByaW50ayhLRVJOX0NSSVQgIkhJR0hNRU0gaXMgbm90IHlldCBzdXBwb3J0ZWQgIgotCQkJCQkJICJ3aXRoIFZJUFQgYWxpYXNpbmcgY2FjaGUsICIKLQkJCQkJCSAiaWdub3JpbmcgaGlnaCBtZW1vcnlcbiIpOwogCQkJfSBlbHNlIHsKIAkJCQltZW1tb3ZlKGJhbmsgKyAxLCBiYW5rLAogCQkJCQkobWVtaW5mby5ucl9iYW5rcyAtIGkpICogc2l6ZW9mKCpiYW5rKSk7CkBAIC03MjYsNiArNzMwLDggQEAKIAkJCWJhbmstPnNpemUgPSBWTUFMTE9DX01JTiAtIF9fdmEoYmFuay0+c3RhcnQpOwogCQl9CiAjZWxzZQorCQliYW5rLT5oaWdobWVtID0gaGlnaG1lbTsKKwogCQkvKgogCQkgKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVtb3J5IGJhbmsgd291bGQgZW50aXJlbHkgb3ZlcmxhcAogCQkgKiB0aGUgdm1hbGxvYyBhcmVhLgpAQCAtNzU0LDYgKzc2MCwzOCBAQAogI2VuZGlmCiAJCWorKzsKIAl9CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwlpZiAoaGlnaG1lbSkgeworCQljb25zdCBjaGFyICpyZWFzb24gPSBOVUxMOworCisJCWlmIChjYWNoZV9pc192aXB0X2FsaWFzaW5nKCkpIHsKKwkJCS8qCisJCQkgKiBJbnRlcmFjdGlvbnMgYmV0d2VlbiBrbWFwIGFuZCBvdGhlciBtYXBwaW5ncworCQkJICogbWFrZSBoaWdobWVtIHN1cHBvcnQgd2l0aCBhbGlhc2luZyBWSVBUIGNhY2hlcworCQkJICogcmF0aGVyIGRpZmZpY3VsdC4KKwkJCSAqLworCQkJcmVhc29uID0gIndpdGggVklQVCBhbGlhc2luZyBjYWNoZSI7CisjaWZkZWYgQ09ORklHX1NNUAorCQl9IGVsc2UgaWYgKHRsYl9vcHNfbmVlZF9icm9hZGNhc3QoKSkgeworCQkJLyoKKwkJCSAqIGttYXBfaGlnaCBuZWVkcyB0byBvY2Nhc2lvbmFsbHkgZmx1c2ggVExCIGVudHJpZXMsCisJCQkgKiBob3dldmVyLCBpZiB0aGUgVExCIGVudHJpZXMgbmVlZCB0byBiZSBicm9hZGNhc3QKKwkJCSAqIHdlIG1heSBkZWFkbG9jazoKKwkJCSAqICBrbWFwX2hpZ2goaXJxcyBvZmYpLT5mbHVzaF9hbGxfemVyb19wa21hcHMtPgorCQkJICogIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UtPnNtcF9jYWxsX2Z1bmN0aW9uX21hbnkKKwkJCSAqICAgKG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGlycXMgb2ZmKQorCQkJICovCisJCQlyZWFzb24gPSAid2l0aG91dCBoYXJkd2FyZSBUTEIgb3BzIGJyb2FkY2FzdGluZyI7CisjZW5kaWYKKwkJfQorCQlpZiAocmVhc29uKSB7CisJCQlwcmludGsoS0VSTl9DUklUICJISUdITUVNIGlzIG5vdCBzdXBwb3J0ZWQgJXMsIGlnbm9yaW5nIGhpZ2ggbWVtb3J5XG4iLAorCQkJCXJlYXNvbik7CisJCQl3aGlsZSAoaiA+IDAgJiYgbWVtaW5mby5iYW5rW2ogLSAxXS5oaWdobWVtKQorCQkJCWotLTsKKwkJfQorCX0KKyNlbmRpZgogCW1lbWluZm8ubnJfYmFua3MgPSBqOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wYWJvcnQtbGVnYWN5LlMgYi9hcmNoL2FybS9tbS9wYWJvcnQtbGVnYWN5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5NzBlYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL3BhYm9ydC1sZWdhY3kuUwpAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworLyoKKyAqIEZ1bmN0aW9uOiBsZWdhY3lfcGFib3J0CisgKgorICogUGFyYW1zICA6IHIwID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCisgKgorICogUmV0dXJucyA6IHIwID0gYWRkcmVzcyBvZiBhYm9ydAorICoJICAgOiByMSA9IFNpbXVsYXRlZCBJRlNSIHdpdGggc2VjdGlvbiB0cmFuc2xhdGlvbiBmYXVsdCBzdGF0dXMKKyAqCisgKiBQdXJwb3NlIDogb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgcHJlZmV0Y2ggYWJvcnQuCisgKi8KKworCS5hbGlnbgk1CitFTlRSWShsZWdhY3lfcGFib3J0KQorCW1vdglyMSwgIzUKKwltb3YJcGMsIGxyCitFTkRQUk9DKGxlZ2FjeV9wYWJvcnQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wYWJvcnQtdjYuUyBiL2FyY2gvYXJtL21tL3BhYm9ydC12Ni5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTNkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wYWJvcnQtdjYuUwpAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworLyoKKyAqIEZ1bmN0aW9uOiB2Nl9wYWJvcnQKKyAqCisgKiBQYXJhbXMgIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24KKyAqCisgKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0CisgKgkgICA6IHIxID0gSUZTUgorICoKKyAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwcmVmZXRjaCBhYm9ydC4KKyAqLworCisJLmFsaWduCTUKK0VOVFJZKHY2X3BhYm9ydCkKKwltcmMJcDE1LCAwLCByMSwgYzUsIGMwLCAxCQlAIGdldCBJRlNSCisJbW92CXBjLCBscgorRU5EUFJPQyh2Nl9wYWJvcnQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wYWJvcnQtdjcuUyBiL2FyY2gvYXJtL21tL3BhYm9ydC12Ny5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YjNiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9wYWJvcnQtdjcuUwpAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworLyoKKyAqIEZ1bmN0aW9uOiB2Nl9wYWJvcnQKKyAqCisgKiBQYXJhbXMgIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24KKyAqCisgKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0CisgKgkgICA6IHIxID0gSUZTUgorICoKKyAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwcmVmZXRjaCBhYm9ydC4KKyAqLworCisJLmFsaWduCTUKK0VOVFJZKHY3X3BhYm9ydCkKKwltcmMJcDE1LCAwLCByMCwgYzYsIGMwLCAyCQlAIGdldCBJRkFSCisJbXJjCXAxNSwgMCwgcjEsIGM1LCBjMCwgMQkJQCBnZXQgSUZTUgorCW1vdglwYywgbHIKK0VORFBST0ModjdfcGFib3J0KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwppbmRleCBiNTU1MWJmLi5kOWZiNGI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJLnR5cGUJYXJtMTAyMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBhcm0xMDIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CiAJLndvcmQJdjR0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJcGFib3J0X25vaWZhcgorCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkud29yZAljcHVfYXJtMTAyMF9wcm9jX2luaXQKIAkud29yZAljcHVfYXJtMTAyMF9wcm9jX2ZpbgogCS53b3JkCWNwdV9hcm0xMDIwX3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKaW5kZXggOGJjNjc0MC4uNzQ1M2I3NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUwpAQCAtNDMwLDcgKzQzMCw3IEBACiAJLnR5cGUJYXJtMTAyMGVfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAogYXJtMTAyMGVfcHJvY2Vzc29yX2Z1bmN0aW9uczoKIAkud29yZAl2NHRfZWFybHlfYWJvcnQKLQkud29yZAlwYWJvcnRfbm9pZmFyCisJLndvcmQJbGVnYWN5X3BhYm9ydAogCS53b3JkCWNwdV9hcm0xMDIwZV9wcm9jX2luaXQKIAkud29yZAljcHVfYXJtMTAyMGVfcHJvY19maW4KIAkud29yZAljcHVfYXJtMTAyMGVfcmVzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKaW5kZXggMmNkMDNlNi4uOGViNzJkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKQEAgLTQxMyw3ICs0MTMsNyBAQAogCS50eXBlCWFybTEwMjJfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAogYXJtMTAyMl9wcm9jZXNzb3JfZnVuY3Rpb25zOgogCS53b3JkCXY0dF9lYXJseV9hYm9ydAotCS53b3JkCXBhYm9ydF9ub2lmYXIKKwkud29yZAlsZWdhY3lfcGFib3J0CiAJLndvcmQJY3B1X2FybTEwMjJfcHJvY19pbml0CiAJLndvcmQJY3B1X2FybTEwMjJfcHJvY19maW4KIAkud29yZAljcHVfYXJtMTAyMl9yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwppbmRleCBhZDk2MWE4Li4zYjU5ZjBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJLnR5cGUJYXJtMTAyNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBhcm0xMDI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CiAJLndvcmQJdjV0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJcGFib3J0X25vaWZhcgorCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkud29yZAljcHVfYXJtMTAyNl9wcm9jX2luaXQKIAkud29yZAljcHVfYXJtMTAyNl9wcm9jX2ZpbgogCS53b3JkCWNwdV9hcm0xMDI2X3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm02XzcuUwppbmRleCA4MGQ2ZTFkLi4zZjljZDNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMKQEAgLTI3OCw3ICsyNzgsNyBAQAogCQkudHlwZQlhcm02X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKIEVOVFJZKGFybTZfcHJvY2Vzc29yX2Z1bmN0aW9ucykKIAkJLndvcmQJY3B1X2FybTZfZGF0YV9hYm9ydAotCQkud29yZAlwYWJvcnRfbm9pZmFyCisJCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkJLndvcmQJY3B1X2FybTZfcHJvY19pbml0CiAJCS53b3JkCWNwdV9hcm02X3Byb2NfZmluCiAJCS53b3JkCWNwdV9hcm02X3Jlc2V0CkBAIC0yOTUsNyArMjk1LDcgQEAKIAkJLnR5cGUJYXJtN19wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBFTlRSWShhcm03X3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCiAJCS53b3JkCWNwdV9hcm03X2RhdGFfYWJvcnQKLQkJLndvcmQJcGFib3J0X25vaWZhcgorCQkud29yZAlsZWdhY3lfcGFib3J0CiAJCS53b3JkCWNwdV9hcm03X3Byb2NfaW5pdAogCQkud29yZAljcHVfYXJtN19wcm9jX2ZpbgogCQkud29yZAljcHVfYXJtN19yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKaW5kZXggODVhZTE4Ni4uMGI2MmRlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TCkBAIC0xODEsNyArMTgxLDcgQEAKIAkJLnR5cGUJYXJtNzIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKIEVOVFJZKGFybTcyMF9wcm9jZXNzb3JfZnVuY3Rpb25zKQogCQkud29yZAl2NHRfbGF0ZV9hYm9ydAotCQkud29yZAlwYWJvcnRfbm9pZmFyCisJCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkJLndvcmQJY3B1X2FybTcyMF9wcm9jX2luaXQKIAkJLndvcmQJY3B1X2FybTcyMF9wcm9jX2ZpbgogCQkud29yZAljcHVfYXJtNzIwX3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTc0MC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUwppbmRleCA0Zjk1YmVlLi4wMTg2MGNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTc0MC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzQwLlMKQEAgLTEyNiw3ICsxMjYsNyBAQAogCS50eXBlCWFybTc0MF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBFTlRSWShhcm03NDBfcHJvY2Vzc29yX2Z1bmN0aW9ucykKIAkud29yZAl2NHRfbGF0ZV9hYm9ydAotCS53b3JkCXBhYm9ydF9ub2lmYXIKKwkud29yZAlsZWdhY3lfcGFib3J0CiAJLndvcmQJY3B1X2FybTc0MF9wcm9jX2luaXQKIAkud29yZAljcHVfYXJtNzQwX3Byb2NfZmluCiAJLndvcmQJY3B1X2FybTc0MF9yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TCmluZGV4IDkzZTA1ZmEuLjEyMDFiOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMKQEAgLTY0LDcgKzY0LDcgQEAKIAkJLnR5cGUJYXJtN3RkbWlfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAogRU5UUlkoYXJtN3RkbWlfcHJvY2Vzc29yX2Z1bmN0aW9ucykKIAkJLndvcmQJdjR0X2xhdGVfYWJvcnQKLQkJLndvcmQJcGFib3J0X25vaWZhcgorCQkud29yZAlsZWdhY3lfcGFib3J0CiAJCS53b3JkCWNwdV9hcm03dGRtaV9wcm9jX2luaXQKIAkJLndvcmQJY3B1X2FybTd0ZG1pX3Byb2NfZmluCiAJCS53b3JkCWNwdV9hcm03dGRtaV9yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMKaW5kZXggOTE0ZDY4OC4uMmI3YzE5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TCkBAIC0zOTUsNyArMzk1LDcgQEAKIAkudHlwZQlhcm05MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAogYXJtOTIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CiAJLndvcmQJdjR0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJcGFib3J0X25vaWZhcgorCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkud29yZAljcHVfYXJtOTIwX3Byb2NfaW5pdAogCS53b3JkCWNwdV9hcm05MjBfcHJvY19maW4KIAkud29yZAljcHVfYXJtOTIwX3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUwppbmRleCA1MWM5Yzk4Li4wNmExYWE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMKQEAgLTM5OSw3ICszOTksNyBAQAogCS50eXBlCWFybTkyMl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBhcm05MjJfcHJvY2Vzc29yX2Z1bmN0aW9uczoKIAkud29yZAl2NHRfZWFybHlfYWJvcnQKLQkud29yZAlwYWJvcnRfbm9pZmFyCisJLndvcmQJbGVnYWN5X3BhYm9ydAogCS53b3JkCWNwdV9hcm05MjJfcHJvY19pbml0CiAJLndvcmQJY3B1X2FybTkyMl9wcm9jX2ZpbgogCS53b3JkCWNwdV9hcm05MjJfcmVzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TCmluZGV4IDI3MjQ1MjYuLmNiNTM0MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUwpAQCAtNDYyLDcgKzQ2Miw3IEBACiAJLnR5cGUJYXJtOTI1X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKIGFybTkyNV9wcm9jZXNzb3JfZnVuY3Rpb25zOgogCS53b3JkCXY0dF9lYXJseV9hYm9ydAotCS53b3JkCXBhYm9ydF9ub2lmYXIKKwkud29yZAlsZWdhY3lfcGFib3J0CiAJLndvcmQJY3B1X2FybTkyNV9wcm9jX2luaXQKIAkud29yZAljcHVfYXJtOTI1X3Byb2NfZmluCiAJLndvcmQJY3B1X2FybTkyNV9yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKaW5kZXggNTQ0NjY5My4uMWM0ODQ4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCkBAIC00MTUsNyArNDE1LDcgQEAKIAkudHlwZQlhcm05MjZfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAogYXJtOTI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CiAJLndvcmQJdjV0al9lYXJseV9hYm9ydAotCS53b3JkCXBhYm9ydF9ub2lmYXIKKwkud29yZAlsZWdhY3lfcGFib3J0CiAJLndvcmQJY3B1X2FybTkyNl9wcm9jX2luaXQKIAkud29yZAljcHVfYXJtOTI2X3Byb2NfZmluCiAJLndvcmQJY3B1X2FybTkyNl9yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQwLlMKaW5kZXggZjU5NTExNy4uNWIwZjg0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTk0MC5TCkBAIC0zMjIsNyArMzIyLDcgQEAKIAkudHlwZQlhcm05NDBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAogRU5UUlkoYXJtOTQwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCiAJLndvcmQJbm9tbXVfZWFybHlfYWJvcnQKLQkud29yZAlwYWJvcnRfbm9pZmFyCisJLndvcmQJbGVnYWN5X3BhYm9ydAogCS53b3JkCWNwdV9hcm05NDBfcHJvY19pbml0CiAJLndvcmQJY3B1X2FybTk0MF9wcm9jX2ZpbgogCS53b3JkCWNwdV9hcm05NDBfcmVzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQ2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTk0Ni5TCmluZGV4IGUwM2Y2ZmYuLjQwYzA0NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQ2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJLnR5cGUJYXJtOTQ2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKIEVOVFJZKGFybTk0Nl9wcm9jZXNzb3JfZnVuY3Rpb25zKQogCS53b3JkCW5vbW11X2Vhcmx5X2Fib3J0Ci0JLndvcmQJcGFib3J0X25vaWZhcgorCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkud29yZAljcHVfYXJtOTQ2X3Byb2NfaW5pdAogCS53b3JkCWNwdV9hcm05NDZfcHJvY19maW4KIAkud29yZAljcHVfYXJtOTQ2X3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMKaW5kZXggYmU2YzExZC4uMjg1NDVjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUwpAQCAtNjQsNyArNjQsNyBAQAogCQkudHlwZQlhcm05dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBFTlRSWShhcm05dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zKQogCQkud29yZAlub21tdV9lYXJseV9hYm9ydAotCQkud29yZAlwYWJvcnRfbm9pZmFyCisJCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkJLndvcmQJY3B1X2FybTl0ZG1pX3Byb2NfaW5pdAogCQkud29yZAljcHVfYXJtOXRkbWlfcHJvY19maW4KIAkJLndvcmQJY3B1X2FybTl0ZG1pX3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWZhNTI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWZhNTI2LlMKaW5kZXggMDhiOGE5NS4uMDhmNWFjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1mYTUyNi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtZmE1MjYuUwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJLnR5cGUJZmE1MjZfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAogZmE1MjZfcHJvY2Vzc29yX2Z1bmN0aW9uczoKIAkud29yZAl2NF9lYXJseV9hYm9ydAotCS53b3JkCXBhYm9ydF9ub2lmYXIKKwkud29yZAlsZWdhY3lfcGFib3J0CiAJLndvcmQJY3B1X2ZhNTI2X3Byb2NfaW5pdAogCS53b3JkCWNwdV9mYTUyNl9wcm9jX2ZpbgogCS53b3JkCWNwdV9mYTUyNl9yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TCmluZGV4IDBmZTFmOGYuLmQwZDc3OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtZmVyb2Nlb24uUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWZlcm9jZW9uLlMKQEAgLTQ5OSw3ICs0OTksNyBAQAogCS50eXBlCWZlcm9jZW9uX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKIGZlcm9jZW9uX3Byb2Nlc3Nvcl9mdW5jdGlvbnM6CiAJLndvcmQJdjV0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJcGFib3J0X25vaWZhcgorCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkud29yZAljcHVfZmVyb2Nlb25fcHJvY19pbml0CiAJLndvcmQJY3B1X2Zlcm9jZW9uX3Byb2NfZmluCiAJLndvcmQJY3B1X2Zlcm9jZW9uX3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLW1vaGF3ay5TIGIvYXJjaC9hcm0vbW0vcHJvYy1tb2hhd2suUwppbmRleCA1NDBmNTA3Li41MmI1ZmQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLW1vaGF3ay5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtbW9oYXdrLlMKQEAgLTM1OSw3ICszNTksNyBAQAogCS50eXBlCW1vaGF3a19wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBtb2hhd2tfcHJvY2Vzc29yX2Z1bmN0aW9uczoKIAkud29yZAl2NXRfZWFybHlfYWJvcnQKLQkud29yZAlwYWJvcnRfbm9pZmFyCisJLndvcmQJbGVnYWN5X3BhYm9ydAogCS53b3JkCWNwdV9tb2hhd2tfcHJvY19pbml0CiAJLndvcmQJY3B1X21vaGF3a19wcm9jX2ZpbgogCS53b3JkCWNwdV9tb2hhd2tfcmVzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUwppbmRleCA5MGE3ZTUyLi43YjcwNmIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TCkBAIC0xOTksNyArMTk5LDcgQEAKIAkudHlwZQlzYTExMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBFTlRSWShzYTExMF9wcm9jZXNzb3JfZnVuY3Rpb25zKQogCS53b3JkCXY0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJcGFib3J0X25vaWZhcgorCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkud29yZAljcHVfc2ExMTBfcHJvY19pbml0CiAJLndvcmQJY3B1X3NhMTEwX3Byb2NfZmluCiAJLndvcmQJY3B1X3NhMTEwX3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwppbmRleCA0NTFlMmQ5Li5lZTc3MDAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCS50eXBlCXNhMTEwMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBFTlRSWShzYTExMDBfcHJvY2Vzc29yX2Z1bmN0aW9ucykKIAkud29yZAl2NF9lYXJseV9hYm9ydAotCS53b3JkCXBhYm9ydF9ub2lmYXIKKwkud29yZAlsZWdhY3lfcGFib3J0CiAJLndvcmQJY3B1X3NhMTEwMF9wcm9jX2luaXQKIAkud29yZAljcHVfc2ExMTAwX3Byb2NfZmluCiAJLndvcmQJY3B1X3NhMTEwMF9yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCmluZGV4IDUyNGRkYWUuLjcwZjc1ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKQEAgLTMyLDggKzMyLDEwIEBACiAKICNpZm5kZWYgQ09ORklHX1NNUAogI2RlZmluZSBUVEJfRkxBR1MJVFRCX1JHTl9XQldBCisjZGVmaW5lIFBNRF9GTEFHUwlQTURfU0VDVF9XQgogI2Vsc2UKICNkZWZpbmUgVFRCX0ZMQUdTCVRUQl9SR05fV0JXQXxUVEJfUworI2RlZmluZSBQTURfRkxBR1MJUE1EX1NFQ1RfV0JXQXxQTURfU0VDVF9TCiAjZW5kaWYKIAogRU5UUlkoY3B1X3Y2X3Byb2NfaW5pdCkKQEAgLTE5MSw3ICsxOTMsNyBAQAogCS50eXBlCXY2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKIEVOVFJZKHY2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCiAJLndvcmQJdjZfZWFybHlfYWJvcnQKLQkud29yZAlwYWJvcnRfbm9pZmFyCisJLndvcmQJdjZfcGFib3J0CiAJLndvcmQJY3B1X3Y2X3Byb2NfaW5pdAogCS53b3JkCWNwdV92Nl9wcm9jX2ZpbgogCS53b3JkCWNwdV92Nl9yZXNldApAQCAtMjIyLDEwICsyMjQsOSBAQAogCS5sb25nCTB4MDAwN2IwMDAKIAkubG9uZwkweDAwMDdmMDAwCiAJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECisJCVBNRF9TRUNUX0FQX1JFQUQgfCBcCisJCVBNRF9GTEFHUwogCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKIAkJUE1EX1NFQ1RfWE4gfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ny5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCmluZGV4IGYzZmExYzMuLmVlZWVkMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY3LlMKQEAgLTMzLDkgKzMzLDExIEBACiAjaWZuZGVmIENPTkZJR19TTVAKIC8qIFBUV3MgY2FjaGVhYmxlLCBpbm5lciBXQiBub3Qgc2hhcmVhYmxlLCBvdXRlciBXQiBub3Qgc2hhcmVhYmxlICovCiAjZGVmaW5lIFRUQl9GTEFHUwlUVEJfSVJHTl9XQnxUVEJfUkdOX09DX1dCCisjZGVmaW5lIFBNRF9GTEFHUwlQTURfU0VDVF9XQgogI2Vsc2UKIC8qIFBUV3MgY2FjaGVhYmxlLCBpbm5lciBXQldBIHNoYXJlYWJsZSwgb3V0ZXIgV0JXQSBub3Qgc2hhcmVhYmxlICovCiAjZGVmaW5lIFRUQl9GTEFHUwlUVEJfSVJHTl9XQldBfFRUQl9TfFRUQl9OT1N8VFRCX1JHTl9PQ19XQldBCisjZGVmaW5lIFBNRF9GTEFHUwlQTURfU0VDVF9XQldBfFBNRF9TRUNUX1MKICNlbmRpZgogCiBFTlRSWShjcHVfdjdfcHJvY19pbml0KQpAQCAtMjk1LDcgKzI5Nyw3IEBACiAJLnR5cGUJdjdfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAogRU5UUlkodjdfcHJvY2Vzc29yX2Z1bmN0aW9ucykKIAkud29yZAl2N19lYXJseV9hYm9ydAotCS53b3JkCXBhYm9ydF9pZmFyCisJLndvcmQJdjdfcGFib3J0CiAJLndvcmQJY3B1X3Y3X3Byb2NfaW5pdAogCS53b3JkCWNwdV92N19wcm9jX2ZpbgogCS53b3JkCWNwdV92N19yZXNldApAQCAtMzI2LDEwICszMjgsOSBAQAogCS5sb25nCTB4MDAwZjAwMDAJCUAgUmVxdWlyZWQgSUQgdmFsdWUKIAkubG9uZwkweDAwMGYwMDAwCQlAIE1hc2sgZm9yIElECiAJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECisJCVBNRF9TRUNUX0FQX1JFQUQgfCBcCisJCVBNRF9GTEFHUwogCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKIAkJUE1EX1NFQ1RfWE4gfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMgYi9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUwppbmRleCAzMzUxNWMyLi4yMDI4ZjM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUwpAQCAtNDI4LDcgKzQyOCw3IEBACiAJLnR5cGUJeHNjM19wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBFTlRSWSh4c2MzX3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCiAJLndvcmQJdjV0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJcGFib3J0X25vaWZhcgorCS53b3JkCWxlZ2FjeV9wYWJvcnQKIAkud29yZAljcHVfeHNjM19wcm9jX2luaXQKIAkud29yZAljcHVfeHNjM19wcm9jX2ZpbgogCS53b3JkCWNwdV94c2MzX3Jlc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TIGIvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUwppbmRleCA0MjMzOTQyLi5mMDU2YzI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKQEAgLTUxMSw3ICs1MTEsNyBAQAogCS50eXBlCXhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0CiBFTlRSWSh4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucykKIAkud29yZAl2NXRfZWFybHlfYWJvcnQKLQkud29yZAlwYWJvcnRfbm9pZmFyCisJLndvcmQJbGVnYWN5X3BhYm9ydAogCS53b3JkCWNwdV94c2NhbGVfcHJvY19pbml0CiAJLndvcmQJY3B1X3hzY2FsZV9wcm9jX2ZpbgogCS53b3JkCWNwdV94c2NhbGVfcmVzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3Y2LmMgYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF92Ni5jCmluZGV4IGZlNTgxMzguLmY3ZDJlYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3Y2LmMKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfbW9kZWxfdjYuYwpAQCAtMzMsNiArMzMsOSBAQAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAyCiAJMywKICNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX0JDTVJJTkcKKwlJUlFfUE1VSVJRLCAvKiBmb3IgQkNNUklORywgQVJNIFBNVSBpbnRlcnJ1cHQgaXMgNDMgKi8KKyNlbmRpZgogfTsKIAogc3RhdGljIHZvaWQgYXJtdjZfcG11X3N0b3Aodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtaW9wL2FkbWEuYyBiL2FyY2gvYXJtL3BsYXQtaW9wL2FkbWEuYwppbmRleCAzYzEyN2FhLi4xZmY2YTM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LWlvcC9hZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1pb3AvYWRtYS5jCkBAIC0xNzksNyArMTc5LDYgQEAKIAlkbWFfY2FwX3NldChETUFfSU5URVJSVVBULCBpb3AzeHhfZG1hXzBfZGF0YS5jYXBfbWFzayk7CiAJI2Vsc2UKIAlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBpb3AzeHhfZG1hXzBfZGF0YS5jYXBfbWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX01FTUNQWV9DUkMzMkMsIGlvcDN4eF9kbWFfMF9kYXRhLmNhcF9tYXNrKTsKIAlkbWFfY2FwX3NldChETUFfSU5URVJSVVBULCBpb3AzeHhfZG1hXzBfZGF0YS5jYXBfbWFzayk7CiAJI2VuZGlmCiAKQEAgLTE4OCw3ICsxODcsNiBAQAogCWRtYV9jYXBfc2V0KERNQV9JTlRFUlJVUFQsIGlvcDN4eF9kbWFfMV9kYXRhLmNhcF9tYXNrKTsKIAkjZWxzZQogCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGlvcDN4eF9kbWFfMV9kYXRhLmNhcF9tYXNrKTsKLQlkbWFfY2FwX3NldChETUFfTUVNQ1BZX0NSQzMyQywgaW9wM3h4X2RtYV8xX2RhdGEuY2FwX21hc2spOwogCWRtYV9jYXBfc2V0KERNQV9JTlRFUlJVUFQsIGlvcDN4eF9kbWFfMV9kYXRhLmNhcF9tYXNrKTsKIAkjZW5kaWYKIApAQCAtMTk4LDcgKzE5Niw3IEBACiAJZG1hX2NhcF9zZXQoRE1BX0lOVEVSUlVQVCwgaW9wM3h4X2FhdV9kYXRhLmNhcF9tYXNrKTsKIAkjZWxzZQogCWRtYV9jYXBfc2V0KERNQV9YT1IsIGlvcDN4eF9hYXVfZGF0YS5jYXBfbWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX1pFUk9fU1VNLCBpb3AzeHhfYWF1X2RhdGEuY2FwX21hc2spOworCWRtYV9jYXBfc2V0KERNQV9YT1JfVkFMLCBpb3AzeHhfYWF1X2RhdGEuY2FwX21hc2spOwogCWRtYV9jYXBfc2V0KERNQV9NRU1TRVQsIGlvcDN4eF9hYXVfZGF0YS5jYXBfbWFzayk7CiAJZG1hX2NhcF9zZXQoRE1BX0lOVEVSUlVQVCwgaW9wM3h4X2FhdV9kYXRhLmNhcF9tYXNrKTsKIAkjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtaW9wL3BjaS5jIGIvYXJjaC9hcm0vcGxhdC1pb3AvcGNpLmMKaW5kZXggNzdmYTdjYy4uY2UzMWYzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1pb3AvcGNpLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1pb3AvcGNpLmMKQEAgLTI1Nyw3ICsyNTcsOCBAQAogCSpJT1AzWFhfT1VNV1RWUjAgPSAwOwogCiAJLyogT3V0Ym91bmQgd2luZG93IDEgKi8KLQkqSU9QM1hYX09NV1RWUjEgPSBJT1AzWFhfUENJX0xPV0VSX01FTV9CQSArIElPUDNYWF9QQ0lfTUVNX1dJTkRPV19TSVpFOworCSpJT1AzWFhfT01XVFZSMSA9IElPUDNYWF9QQ0lfTE9XRVJfTUVNX0JBICsKKwkJCSAgSU9QM1hYX1BDSV9NRU1fV0lORE9XX1NJWkUgLyAyOwogCSpJT1AzWFhfT1VNV1RWUjEgPSAwOwogCiAJLyogQkFSIDMgKCBEaXNhYmxlZCApICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWlvcC90aW1lLmMgYi9hcmNoL2FybS9wbGF0LWlvcC90aW1lLmMKaW5kZXggMzY5NWJiZS4uOGRhOTVkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1pb3AvdGltZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtaW9wL3RpbWUuYwpAQCAtODUsNyArODUsNyBAQAogewogCXUzMiB0aW1lcl9jdGw7CiAKLQl0aWNrc19wZXJfamlmZnkgPSAodGlja19yYXRlICsgSFovMikgLyBIWjsKKwl0aWNrc19wZXJfamlmZnkgPSBESVZfUk9VTkRfQ0xPU0VTVCh0aWNrX3JhdGUsIEhaKTsKIAl0aWNrc19wZXJfdXNlYyA9IHRpY2tfcmF0ZSAvIDEwMDAwMDA7CiAJbmV4dF9qaWZmeV90aW1lID0gMHhmZmZmZmZmZjsKIAlpb3BfdGlja19yYXRlID0gdGlja19yYXRlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCmluZGV4IGZkMzE1NGEuLmI1MzEyNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKQEAgLTgyOSwxMCArODI5LDEwIEBACiAgKgogICogQHBhcmFtIGFyYl9yYXRlCiAgKiBAcGFyYW0gbWF4X2ZpZm9fZGVwdGgKLSAqIEBwYXJhbSB0cGFyYW1zIC0gTnVtYmVyIG9mIHRoZXJlYWRzIHRvIHJlc2VydmUgOiBETUFfVEhSRUFEX1JFU0VSVkVfTk9STQotICogCQkJCQkJICAgIERNQV9USFJFQURfUkVTRVJWRV9PTkVUCi0gKiAJCQkJCQkgICAgRE1BX1RIUkVBRF9SRVNFUlZFX1RXT1QKLSAqIAkJCQkJCSAgICBETUFfVEhSRUFEX1JFU0VSVkVfVEhSRUVUCisgKiBAcGFyYW0gdHBhcmFtcyAtIE51bWJlciBvZiB0aHJlYWRzIHRvIHJlc2VydmUgOiBETUFfVEhSRUFEX1JFU0VSVkVfTk9STQorICogCQkJCQkJICAgRE1BX1RIUkVBRF9SRVNFUlZFX09ORVQKKyAqIAkJCQkJCSAgIERNQV9USFJFQURfUkVTRVJWRV9UV09UCisgKiAJCQkJCQkgICBETUFfVEhSRUFEX1JFU0VSVkVfVEhSRUVUCiAgKi8KIHZvaWQKIG9tYXBfZG1hX3NldF9nbG9iYWxfcGFyYW1zKGludCBhcmJfcmF0ZSwgaW50IG1heF9maWZvX2RlcHRoLCBpbnQgdHBhcmFtcykKQEAgLTg0NCwxMSArODQ0LDE0IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAobWF4X2ZpZm9fZGVwdGggPT0gMCkKKwkJbWF4X2ZpZm9fZGVwdGggPSAxOwogCWlmIChhcmJfcmF0ZSA9PSAwKQogCQlhcmJfcmF0ZSA9IDE7CiAKLQlyZWcgPSAoYXJiX3JhdGUgJiAweGZmKSA8PCAxNjsKLQlyZWcgfD0gKDB4ZmYgJiBtYXhfZmlmb19kZXB0aCk7CisJcmVnID0gMHhmZiAmIG1heF9maWZvX2RlcHRoOworCXJlZyB8PSAoMHgzICYgdHBhcmFtcykgPDwgMTI7CisJcmVnIHw9IChhcmJfcmF0ZSAmIDB4ZmYpIDw8IDE2OwogCiAJZG1hX3dyaXRlKHJlZywgR0NSKTsKIH0KQEAgLTk3NSw2ICs5NzgsMTQgQEAKIHsKIAl1MzIgbDsKIAorCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgb24gdGhlIGNoYW5uZWwgKi8KKwlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpCisJCWRtYV93cml0ZSgwLCBDSUNSKGxjaCkpOworCisJbCA9IGRtYV9yZWFkKENDUihsY2gpKTsKKwlsICY9IH5PTUFQX0RNQV9DQ1JfRU47CisJZG1hX3dyaXRlKGwsIENDUihsY2gpKTsKKwogCWlmICghb21hcF9kbWFfaW5fMTUxMF9tb2RlKCkgJiYgZG1hX2NoYW5bbGNoXS5uZXh0X2xjaCAhPSAtMSkgewogCQlpbnQgbmV4dF9sY2gsIGN1cl9sY2ggPSBsY2g7CiAJCWNoYXIgZG1hX2NoYW5fbGlua19tYXBbT01BUF9ETUE0X0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKQEAgLTk5MiwxOCArMTAwMyw4IEBACiAJCQluZXh0X2xjaCA9IGRtYV9jaGFuW2N1cl9sY2hdLm5leHRfbGNoOwogCQkJY3VyX2xjaCA9IG5leHRfbGNoOwogCQl9IHdoaWxlIChuZXh0X2xjaCAhPSAtMSk7Ci0KLQkJcmV0dXJuOwogCX0KIAotCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgb24gdGhlIGNoYW5uZWwgKi8KLQlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpCi0JCWRtYV93cml0ZSgwLCBDSUNSKGxjaCkpOwotCi0JbCA9IGRtYV9yZWFkKENDUihsY2gpKTsKLQlsICY9IH5PTUFQX0RNQV9DQ1JfRU47Ci0JZG1hX3dyaXRlKGwsIENDUihsY2gpKTsKLQogCWRtYV9jaGFuW2xjaF0uZmxhZ3MgJj0gfk9NQVBfRE1BX0FDVElWRTsKIH0KIEVYUE9SVF9TWU1CT0wob21hcF9zdG9wX2RtYSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwppbmRleCA2OTM4MzljLi43MWViZDdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDg1MAogc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzg1MFs3XSA9IHsKLQl7IE9NQVAxX01QVUlPX0JBU0UsICAgICBJTlRfODUwX01QVUlPLAkgICAgSUhfTVBVSU9fQkFTRSwJTUVUSE9EX01QVUlPIH0sCisJeyBPTUFQMV9NUFVJT19WQkFTRSwgICAgIElOVF84NTBfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLAlNRVRIT0RfTVBVSU8gfSwKIAl7IE9NQVA4NTBfR1BJTzFfQkFTRSwgIElOVF84NTBfR1BJT19CQU5LMSwgIElIX0dQSU9fQkFTRSwJTUVUSE9EX0dQSU9fODUwIH0sCiAJeyBPTUFQODUwX0dQSU8yX0JBU0UsICBJTlRfODUwX0dQSU9fQkFOSzIsICBJSF9HUElPX0JBU0UgKyAzMiwJTUVUSE9EX0dQSU9fODUwIH0sCiAJeyBPTUFQODUwX0dQSU8zX0JBU0UsICBJTlRfODUwX0dQSU9fQkFOSzMsICBJSF9HUElPX0JBU0UgKyA2NCwJTUVUSE9EX0dQSU9fODUwIH0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NwdS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jcHUuaAppbmRleCAxMWU3M2Q5Li5mMTI5ZWZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NwdS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvY3B1LmgKQEAgLTMwMywzMiArMzAzLDIxIEBACiAjZGVmaW5lIGNwdV9pc19vbWFwMjQzMCgpCQkwCiAjZGVmaW5lIGNwdV9pc19vbWFwMzQzMCgpCQkwCiAKLSNpZiBkZWZpbmVkKE1VTFRJX09NQVAxKQotIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApCi0jICB1bmRlZiAgY3B1X2lzX29tYXA3MzAKLSMgIGRlZmluZSBjcHVfaXNfb21hcDczMCgpCQlpc19vbWFwNzMwKCkKLSMgZW5kaWYKLSMgaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQODUwKQotIyAgdW5kZWYgIGNwdV9pc19vbWFwODUwCi0jICBkZWZpbmUgY3B1X2lzX29tYXA4NTAoKQkJaXNfb21hcDg1MCgpCi0jIGVuZGlmCi0jZWxzZQotIyBpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApCi0jICB1bmRlZiAgY3B1X2lzX29tYXA3MzAKLSMgIGRlZmluZSBjcHVfaXNfb21hcDczMCgpCQkxCi0jIGVuZGlmCi0jZW5kaWYKLSNlbHNlCi0jIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDg1MCkKLSMgIHVuZGVmICBjcHVfaXNfb21hcDg1MAotIyAgZGVmaW5lIGNwdV9pc19vbWFwODUwKCkJCTEKLSMgZW5kaWYKLSNlbmRpZgotCiAvKgogICogV2hldGhlciB3ZSBoYXZlIE1VTFRJX09NQVAxIG9yIG5vdCwgd2Ugc3RpbGwgbmVlZCB0byBkaXN0aW5ndWlzaAotICogYmV0d2VlbiAzMzAgdnMuIDE1MTAgYW5kIDE2MTFCLzU5MTIgdnMuIDE3MTAuCisgKiBiZXR3ZWVuIDczMCB2cyA4NTAsIDMzMCB2cy4gMTUxMCBhbmQgMTYxMUIvNTkxMiB2cy4gMTcxMC4KICAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKQorIyB1bmRlZiAgY3B1X2lzX29tYXA3MzAKKyMgZGVmaW5lIGNwdV9pc19vbWFwNzMwKCkJCWlzX29tYXA3MzAoKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA4NTApCisjIHVuZGVmICBjcHVfaXNfb21hcDg1MAorIyBkZWZpbmUgY3B1X2lzX29tYXA4NTAoKQkJaXNfb21hcDg1MCgpCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1WFgpCiAjIHVuZGVmICBjcHVfaXNfb21hcDMxMAogIyB1bmRlZiAgY3B1X2lzX29tYXAxNTEwCkBAIC00MzMsMyArNDIyLDUgQEAKIAogaW50IG9tYXBfY2hpcF9pcyhzdHJ1Y3Qgb21hcF9jaGlwX2lkIG9jaSk7CiB2b2lkIG9tYXAyX2NoZWNrX3JldmlzaW9uKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gva2V5cGFkLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2tleXBhZC5oCmluZGV4IDQ1ZWEzYWUuLjNhZTUyY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gva2V5cGFkLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9rZXlwYWQuaApAQCAtMTAsNiArMTAsOCBAQAogI2lmbmRlZiBBU01BUk1fQVJDSF9LRVlQQURfSAogI2RlZmluZSBBU01BUk1fQVJDSF9LRVlQQURfSAogCisjd2FybmluZzogUGxlYXNlIHVwZGF0ZSB0aGUgYm9hcmQgdG8gdXNlIG1hdHJpeF9rZXlwYWQuaCBpbnN0ZWFkCisKIHN0cnVjdCBvbWFwX2twX3BsYXRmb3JtX2RhdGEgewogCWludCByb3dzOwogCWludCBjb2xzOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tdXguaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbXV4LmgKaW5kZXggOThkZmFiNi4uMGY0OWQyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tdXguaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL211eC5oCkBAIC04NDAsMTIgKzg0MCwxNCBAQAogCSAqLwogCUFGMjZfMzRYWF9HUElPMCwKIAlBRjIyXzM0WFhfR1BJTzksCisJQUc5XzM0WFhfR1BJTzIzLAogCUFIOF8zNFhYX0dQSU8yOSwKIAlVOF8zNFhYX0dQSU81NF9PVVQsCiAJVThfMzRYWF9HUElPNTRfRE9XTiwKIAlMOF8zNFhYX0dQSU82MywKIAlHMjVfMzRYWF9HUElPODZfT1VULAogCUFHNF8zNFhYX0dQSU8xMzRfT1VULAorCUFGNF8zNFhYX0dQSU8xMzVfT1VULAogCUFFNF8zNFhYX0dQSU8xMzZfT1VULAogCUFGNl8zNFhYX0dQSU8xNDBfVVAsCiAJQUU2XzM0WFhfR1BJTzE0MSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvcG93ZXJkb21haW4uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvcG93ZXJkb21haW4uaAppbmRleCA2MjcxZDg1Li5mYTY0NjE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL3Bvd2VyZG9tYWluLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9wb3dlcmRvbWFpbi5oCkBAIC0xMzUsNiArMTM1LDggQEAKIAogaW50IHB3cmRtX2Zvcl9lYWNoKGludCAoKmZuKShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLCB2b2lkICp1c2VyKSwKIAkJCXZvaWQgKnVzZXIpOworaW50IHB3cmRtX2Zvcl9lYWNoX25vbG9jayhpbnQgKCpmbikoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgdm9pZCAqdXNlciksCisJCQl2b2lkICp1c2VyKTsKIAogaW50IHB3cmRtX2FkZF9jbGtkbShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLCBzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKTsKIGludCBwd3JkbV9kZWxfY2xrZG0oc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW9tbXUuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pb21tdS5jCmluZGV4IDRiNjAxMjcuLjk0NTg0ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pb21tdS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pb21tdS5jCkBAIC02NjQsNyArNjY0LDcgQEAKIAkJbmVudCA9IDE7IC8qIGZvciB0aGUgbmV4dCBMMSBlbnRyeSAqLwogCX0gZWxzZSB7CiAJCWJ5dGVzID0gSU9QR0RfU0laRTsKLQkJaWYgKCppb3BnZCAmIElPUEdEX1NVUEVSKSB7CisJCWlmICgoKmlvcGdkICYgSU9QR0RfU1VQRVIpID09IElPUEdEX1NVUEVSKSB7CiAJCQluZW50ICo9IDE2OwogCQkJLyogcmV3aW5kIHRvIHRoZSAxc3QgZW50cnkgKi8KIAkJCWlvcGdkID0gKHUzMiAqKSgodTMyKWlvcGdkICYgSU9TVVBFUl9NQVNLKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pb3ZtbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2lvdm1tLmMKaW5kZXggNmZjNTJmYy4uZGMzZmFjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvdm1tLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2lvdm1tLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqCSd2YSc6CW1wdSB2aXJ0dWFsIGFkZHJlc3MKICAqCiAgKgknYyc6CWNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEKLSAqCSdkJzoJZGljb250aWd1b3VzIG1lbW9yeSBhcmVhCisgKgknZCc6CWRpc2NvbnRpZ3VvdXMgbWVtb3J5IGFyZWEKICAqCSdhJzoJYW5vbnltb3VzIG1lbW9yeSBhbGxvY2F0aW9uCiAgKgknKCknOglvcHRpb25hbCBmZWF0dXJlCiAgKgpAQCAtMTk5LDcgKzE5OSw4IEBACiAJCXZhICs9IGJ5dGVzOwogCX0KIAotCWZsdXNoX2NhY2hlX3ZtYXAobmV3LT5hZGRyLCBuZXctPmFkZHIgKyB0b3RhbCk7CisJZmx1c2hfY2FjaGVfdm1hcCgodW5zaWduZWQgbG9uZyluZXctPmFkZHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKG5ldy0+YWRkciArIHRvdGFsKSk7CiAJcmV0dXJuIG5ldy0+YWRkcjsKIAogZXJyX291dDoKQEAgLTM2Miw4ICszNjMsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAJdmEgPSBhcmVhLT52YTsKLQltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKIG91dDoKKwltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKKwogCXJldHVybiB2YTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRhX3RvX3ZhKTsKQEAgLTM5MCwxNCArMzkyLDE0IEBACiAJfQogCiAJdmFfZW5kID0gX3ZhICsgUEFHRV9TSVpFICogaTsKLQlmbHVzaF9jYWNoZV92bWFwKF92YSwgdmFfZW5kKTsKKwlmbHVzaF9jYWNoZV92bWFwKCh1bnNpZ25lZCBsb25nKV92YSwgKHVuc2lnbmVkIGxvbmcpdmFfZW5kKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNndGFibGVfZHJhaW5fdm1hbGxvYyhzdHJ1Y3Qgc2dfdGFibGUgKnNndCkKIHsKIAkvKgogCSAqIEFjdHVhbGx5IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhdCBhbGwsIGp1c3QgZXhpc3RzIGZvcgotCSAqIGNvbnNpc3RlbmN5IG9mIHRoZSBjb2RlIHJlYWRpYmlsaXR5LgorCSAqIGNvbnNpc3RlbmN5IG9mIHRoZSBjb2RlIHJlYWRhYmlsaXR5LgogCSAqLwogCUJVR19PTighc2d0KTsKIH0KQEAgLTQzMyw3ICs0MzUsNyBAQAogewogCS8qCiAJICogQWN0dWFsbHkgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGF0IGFsbCwganVzdCBleGlzdHMgZm9yCi0JICogY29uc2lzdGVuY3kgb2YgdGhlIGNvZGUgcmVhZGliaWxpdHkKKwkgKiBjb25zaXN0ZW5jeSBvZiB0aGUgY29kZSByZWFkYWJpbGl0eQogCSAqLwogCUJVR19PTighc2d0KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKaW5kZXggODhhYzk3Ni4uZTY2NGI5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKQEAgLTU5NSw3ICs1OTUsNyBAQAogCXJ4ICY9IDE7CiAJaWYgKGNwdV9pc19vbWFwMjQzMCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKSB7CiAJCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgUkNDUik7Ci0JCXcgfD0gKHR4ID8gUkRJU0FCTEUgOiAwKTsKKwkJdyB8PSAocnggPyBSRElTQUJMRSA6IDApOwogCQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFJDQ1IsIHcpOwogCX0KIAl3ID0gT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFNQQ1IxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCmluZGV4IDkyNWY2NDcuLjc1ZDFmMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwpAQCAtMjcwLDcgKzI3MCw4IEBACiAJb21hcF9zcmFtX2NlaWwgLT0gc2l6ZTsKIAlvbWFwX3NyYW1fY2VpbCA9IFJPVU5EX0RPV04ob21hcF9zcmFtX2NlaWwsIHNpemVvZih2b2lkICopKTsKIAltZW1jcHkoKHZvaWQgKilvbWFwX3NyYW1fY2VpbCwgc3RhcnQsIHNpemUpOwotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcpKHN0YXJ0ICsgc2l6ZSkpOworCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylvbWFwX3NyYW1fY2VpbCwKKwkJKHVuc2lnbmVkIGxvbmcpKG9tYXBfc3JhbV9jZWlsICsgc2l6ZSkpOwogCiAJcmV0dXJuICh2b2lkICopb21hcF9zcmFtX2NlaWw7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXB4YS9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtcHhhL2RtYS5jCmluZGV4IDcwYWVlZTQuLjI5NzU3OTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtcHhhL2RtYS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtcHhhL2RtYS5jCkBAIC0xNywyMiArMTcsMjY2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAKKyNkZWZpbmUgRE1BX0RFQlVHX05BTUUJCSJweGFfZG1hIgorI2RlZmluZSBETUFfTUFYX1JFUVVFU1RFUlMJNjQKKwogc3RydWN0IGRtYV9jaGFubmVsIHsKIAljaGFyICpuYW1lOwogCXB4YV9kbWFfcHJpbyBwcmlvOwogCXZvaWQgKCppcnFfaGFuZGxlcikoaW50LCB2b2lkICopOwogCXZvaWQgKmRhdGE7CisJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAogc3RhdGljIHN0cnVjdCBkbWFfY2hhbm5lbCAqZG1hX2NoYW5uZWxzOwogc3RhdGljIGludCBudW1fZG1hX2NoYW5uZWxzOwogCisvKgorICogRGVidWcgZnMKKyAqLworI2lmZGVmIENPTkZJR19ERUJVR19GUworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRiZ2ZzX3Jvb3QsICpkYmdmc19zdGF0ZSwgKipkYmdmc19jaGFuOworCitzdGF0aWMgaW50IGRiZ19zaG93X3JlcXVlc3Rlcl9jaGFuKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKK3sKKwlpbnQgcG9zID0gMDsKKwlpbnQgY2hhbiA9IChpbnQpcy0+cHJpdmF0ZTsKKwlpbnQgaTsKKwl1MzIgZHJjbXI7CisKKwlwb3MgKz0gc2VxX3ByaW50ZihzLCAiRE1BIGNoYW5uZWwgJWQgcmVxdWVzdGVycyBsaXN0IDpcbiIsIGNoYW4pOworCWZvciAoaSA9IDA7IGkgPCBETUFfTUFYX1JFUVVFU1RFUlM7IGkrKykgeworCQlkcmNtciA9IERSQ01SKGkpOworCQlpZiAoKGRyY21yICYgRFJDTVJfQ0hMTlVNKSA9PSBjaGFuKQorCQkJcG9zICs9IHNlcV9wcmludGYocywgIlx0UmVxdWVzdGVyICVkIChNQVBWTEQ9JWQpXG4iLCBpLAorCQkJCQkgICEhKGRyY21yICYgRFJDTVJfTUFQVkxEKSk7CisJfQorCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19idXJzdF9mcm9tX2RjbWQodTMyIGRjbWQpCit7CisJaW50IGJ1cnN0ID0gKGRjbWQgPj4gMTYpICYgMHgzOworCisJcmV0dXJuIGJ1cnN0ID8gNCA8PCBidXJzdCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfcGh5c192YWxpZCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIHBmbl92YWxpZChfX3BoeXNfdG9fcGZuKGFkZHIpKTsKK30KKworI2RlZmluZSBEQ1NSX1NUUihmbGFnKSAoZGNzciAmIERDU1JfIyNmbGFnID8gI2ZsYWciICIgOiAiIikKKyNkZWZpbmUgRENNRF9TVFIoZmxhZykgKGRjbWQgJiBEQ01EXyMjZmxhZyA/ICNmbGFnIiAiIDogIiIpCisKK3N0YXRpYyBpbnQgZGJnX3Nob3dfZGVzY3JpcHRvcnMoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQoreworCWludCBwb3MgPSAwOworCWludCBjaGFuID0gKGludClzLT5wcml2YXRlOworCWludCBpLCBtYXhfc2hvdyA9IDIwLCBidXJzdCwgd2lkdGg7CisJdTMyIGRjbWQ7CisJdW5zaWduZWQgbG9uZyBwaHlzX2Rlc2M7CisJc3RydWN0IHB4YV9kbWFfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYV9jaGFubmVsc1tjaGFuXS5sb2NrLCBmbGFncyk7CisJcGh5c19kZXNjID0gRERBRFIoY2hhbik7CisKKwlwb3MgKz0gc2VxX3ByaW50ZihzLCAiRE1BIGNoYW5uZWwgJWQgZGVzY3JpcHRvcnMgOlxuIiwgY2hhbik7CisJcG9zICs9IHNlcV9wcmludGYocywgIlslMDNkXSBGaXJzdCBkZXNjcmlwdG9yIHVua25vd25cbiIsIDApOworCWZvciAoaSA9IDE7IGkgPCBtYXhfc2hvdyAmJiBpc19waHlzX3ZhbGlkKHBoeXNfZGVzYyk7IGkrKykgeworCQlkZXNjID0gcGh5c190b192aXJ0KHBoeXNfZGVzYyk7CisJCWRjbWQgPSBkZXNjLT5kY21kOworCQlidXJzdCA9IGRiZ19idXJzdF9mcm9tX2RjbWQoZGNtZCk7CisJCXdpZHRoID0gKDEgPDwgKChkY21kID4+IDE0KSAmIDB4MykpID4+IDE7CisKKwkJcG9zICs9IHNlcV9wcmludGYocywgIlslMDNkXSBEZXNjIGF0ICUwOGx4KHZpcnQgJXApXG4iLAorCQkJCSAgaSwgcGh5c19kZXNjLCBkZXNjKTsKKwkJcG9zICs9IHNlcV9wcmludGYocywgIlx0RERBRFIgPSAlMDh4XG4iLCBkZXNjLT5kZGFkcik7CisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdERTQURSID0gJTA4eFxuIiwgZGVzYy0+ZHNhZHIpOworCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHREVEFEUiA9ICUwOHhcbiIsIGRlc2MtPmR0YWRyKTsKKwkJcG9zICs9IHNlcV9wcmludGYocywgIlx0RENNRCAgPSAlMDh4ICglcyVzJXMlcyVzJXMlc2J1cnN0PSVkIgorCQkJCSAgIiB3aWR0aD0lZCBsZW49JWQpXG4iLAorCQkJCSAgZGNtZCwKKwkJCQkgIERDTURfU1RSKElOQ1NSQ0FERFIpLCBEQ01EX1NUUihJTkNUUkdBRERSKSwKKwkJCQkgIERDTURfU1RSKEZMT1dTUkMpLCBEQ01EX1NUUihGTE9XVFJHKSwKKwkJCQkgIERDTURfU1RSKFNUQVJUSVJRRU4pLCBEQ01EX1NUUihFTkRJUlFFTiksCisJCQkJICBEQ01EX1NUUihFTkRJQU4pLCBidXJzdCwgd2lkdGgsCisJCQkJICBkY21kICYgRENNRF9MRU5HVEgpOworCQlwaHlzX2Rlc2MgPSBkZXNjLT5kZGFkcjsKKwl9CisJaWYgKGkgPT0gbWF4X3Nob3cpCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJbJTAzZF0gRGVzYyBhdCAlMDhseCAuLi4gbWF4IGRpc3BsYXkgcmVhY2hlZFxuIiwKKwkJCQkgIGksIHBoeXNfZGVzYyk7CisJZWxzZQorCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiWyUwM2RdIERlc2MgYXQgJTA4bHggaXMgJXNcbiIsCisJCQkJICBpLCBwaHlzX2Rlc2MsIHBoeXNfZGVzYyA9PSBEREFEUl9TVE9QID8KKwkJCQkgICJEREFEUl9TVE9QIiA6ICJpbnZhbGlkIik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfY2hhbm5lbHNbY2hhbl0ubG9jaywgZmxhZ3MpOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBpbnQgZGJnX3Nob3dfY2hhbl9zdGF0ZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCit7CisJaW50IHBvcyA9IDA7CisJaW50IGNoYW4gPSAoaW50KXMtPnByaXZhdGU7CisJdTMyIGRjc3IsIGRjbWQ7CisJaW50IGJ1cnN0LCB3aWR0aDsKKwlzdGF0aWMgY2hhciAqc3RyX3ByaW9bXSA9IHsgImhpZ2giLCAibm9ybWFsIiwgImxvdyIgfTsKKworCWRjc3IgPSBEQ1NSKGNoYW4pOworCWRjbWQgPSBEQ01EKGNoYW4pOworCWJ1cnN0ID0gZGJnX2J1cnN0X2Zyb21fZGNtZChkY21kKTsKKwl3aWR0aCA9ICgxIDw8ICgoZGNtZCA+PiAxNCkgJiAweDMpKSA+PiAxOworCisJcG9zICs9IHNlcV9wcmludGYocywgIkRNQSBjaGFubmVsICVkXG4iLCBjaGFuKTsKKwlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHRQcmlvcml0eSA6ICVzXG4iLAorCQkJICBzdHJfcHJpb1tkbWFfY2hhbm5lbHNbY2hhbl0ucHJpb10pOworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdFVuYWxpZ25lZCB0cmFuc2ZlciBiaXQ6ICVzXG4iLAorCQkJICBEQUxHTiAmICgxIDw8IGNoYW4pID8gInllcyIgOiAibm8iKTsKKwlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHREQ1NSICA9ICUwOHggKCVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcylcbiIsCisJCQkgIGRjc3IsIERDU1JfU1RSKFJVTiksIERDU1JfU1RSKE5PREVTQyksCisJCQkgIERDU1JfU1RSKFNUT1BJUlFFTiksIERDU1JfU1RSKEVPUklSUUVOKSwKKwkJCSAgRENTUl9TVFIoRU9SSk1QRU4pLCBEQ1NSX1NUUihFT1JTVE9QRU4pLAorCQkJICBEQ1NSX1NUUihTRVRDTVBTVCksIERDU1JfU1RSKENMUkNNUFNUKSwKKwkJCSAgRENTUl9TVFIoQ01QU1QpLCBEQ1NSX1NUUihFT1JJTlRSKSwgRENTUl9TVFIoUkVRUEVORCksCisJCQkgIERDU1JfU1RSKFNUT1BTVEFURSksIERDU1JfU1RSKEVORElOVFIpLAorCQkJICBEQ1NSX1NUUihTVEFSVElOVFIpLCBEQ1NSX1NUUihCVVNFUlIpKTsKKworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdERDTUQgID0gJTA4eCAoJXMlcyVzJXMlcyVzJXNidXJzdD0lZCB3aWR0aD0lZCIKKwkJCSAgIiBsZW49JWQpXG4iLAorCQkJICBkY21kLAorCQkJICBEQ01EX1NUUihJTkNTUkNBRERSKSwgRENNRF9TVFIoSU5DVFJHQUREUiksCisJCQkgIERDTURfU1RSKEZMT1dTUkMpLCBEQ01EX1NUUihGTE9XVFJHKSwKKwkJCSAgRENNRF9TVFIoU1RBUlRJUlFFTiksIERDTURfU1RSKEVORElSUUVOKSwKKwkJCSAgRENNRF9TVFIoRU5ESUFOKSwgYnVyc3QsIHdpZHRoLCBkY21kICYgRENNRF9MRU5HVEgpOworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdERTQURSID0gJTA4eFxuIiwgRFNBRFIoY2hhbikpOworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdERUQURSID0gJTA4eFxuIiwgRFRBRFIoY2hhbikpOworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdEREQURSID0gJTA4eFxuIiwgRERBRFIoY2hhbikpOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBpbnQgZGJnX3Nob3dfc3RhdGUoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQoreworCWludCBwb3MgPSAwOworCisJLyogYmFzaWMgZGV2aWNlIHN0YXR1cyAqLworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJETUEgZW5naW5lIHN0YXR1c1xuIik7CisJcG9zICs9IHNlcV9wcmludGYocywgIlx0Q2hhbm5lbCBudW1iZXI6ICVkXG4iLCBudW1fZG1hX2NoYW5uZWxzKTsKKworCXJldHVybiBwb3M7Cit9CisKKyNkZWZpbmUgREJHRlNfRlVOQ19ERUNMKG5hbWUpIFwKK3N0YXRpYyBpbnQgZGJnX29wZW5fIyNuYW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKSBcCit7IFwKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGJnX3Nob3dfIyNuYW1lLCBpbm9kZS0+aV9wcml2YXRlKTsgXAorfSBcCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkYmdfZm9wc18jI25hbWUgPSB7IFwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsIFwKKwkub3BlbgkJPSBkYmdfb3Blbl8jI25hbWUsIFwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywgXAorCS5yZWFkCQk9IHNlcV9yZWFkLCBcCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwgXAorfQorCitEQkdGU19GVU5DX0RFQ0woc3RhdGUpOworREJHRlNfRlVOQ19ERUNMKGNoYW5fc3RhdGUpOworREJHRlNfRlVOQ19ERUNMKGRlc2NyaXB0b3JzKTsKK0RCR0ZTX0ZVTkNfREVDTChyZXF1ZXN0ZXJfY2hhbik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpweGFfZG1hX2RiZ19hbGxvY19jaGFuKGludCBjaCwgc3RydWN0IGRlbnRyeSAqY2hhbmRpcikKK3sKKwljaGFyIGNoYW5fbmFtZVsxMV07CisJc3RydWN0IGRlbnRyeSAqY2hhbiwgKmNoYW5fc3RhdGUgPSBOVUxMLCAqY2hhbl9kZXNjciA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqY2hhbl9yZXFzID0gTlVMTDsKKwl2b2lkICpkdDsKKworCXNjbnByaW50ZihjaGFuX25hbWUsIHNpemVvZihjaGFuX25hbWUpLCAiJWQiLCBjaCk7CisJY2hhbiA9IGRlYnVnZnNfY3JlYXRlX2RpcihjaGFuX25hbWUsIGNoYW5kaXIpOworCWR0ID0gKHZvaWQgKiljaDsKKworCWlmIChjaGFuKQorCQljaGFuX3N0YXRlID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3RhdGUiLCAwNDAwLCBjaGFuLCBkdCwKKwkJCQkJCSAmZGJnX2ZvcHNfY2hhbl9zdGF0ZSk7CisJaWYgKGNoYW5fc3RhdGUpCisJCWNoYW5fZGVzY3IgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkZXNjcmlwdG9ycyIsIDA0MDAsIGNoYW4sIGR0LAorCQkJCQkJICZkYmdfZm9wc19kZXNjcmlwdG9ycyk7CisJaWYgKGNoYW5fZGVzY3IpCisJCWNoYW5fcmVxcyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlcXVlc3RlcnMiLCAwNDAwLCBjaGFuLCBkdCwKKwkJCQkJCSZkYmdfZm9wc19yZXF1ZXN0ZXJfY2hhbik7CisJaWYgKCFjaGFuX3JlcXMpCisJCWdvdG8gZXJyX3N0YXRlOworCisJcmV0dXJuIGNoYW47CisKK2Vycl9zdGF0ZToKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoY2hhbik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV9kbWFfaW5pdF9kZWJ1Z2ZzKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGRlbnRyeSAqY2hhbmRpcjsKKworCWRiZ2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoRE1BX0RFQlVHX05BTUUsIE5VTEwpOworCWlmIChJU19FUlIoZGJnZnNfcm9vdCkgfHwgIWRiZ2ZzX3Jvb3QpCisJCWdvdG8gZXJyX3Jvb3Q7CisKKwlkYmdmc19zdGF0ZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN0YXRlIiwgMDQwMCwgZGJnZnNfcm9vdCwgTlVMTCwKKwkJCQkJICAmZGJnX2ZvcHNfc3RhdGUpOworCWlmICghZGJnZnNfc3RhdGUpCisJCWdvdG8gZXJyX3N0YXRlOworCisJZGJnZnNfY2hhbiA9IGttYWxsb2Moc2l6ZW9mKCpkYmdmc19zdGF0ZSkgKiBudW1fZG1hX2NoYW5uZWxzLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRiZ2ZzX3N0YXRlKQorCQlnb3RvIGVycl9hbGxvYzsKKworCWNoYW5kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImNoYW5uZWxzIiwgZGJnZnNfcm9vdCk7CisJaWYgKCFjaGFuZGlyKQorCQlnb3RvIGVycl9jaGFuZGlyOworCisJZm9yIChpID0gMDsgaSA8IG51bV9kbWFfY2hhbm5lbHM7IGkrKykgeworCQlkYmdmc19jaGFuW2ldID0gcHhhX2RtYV9kYmdfYWxsb2NfY2hhbihpLCBjaGFuZGlyKTsKKwkJaWYgKCFkYmdmc19jaGFuW2ldKQorCQkJZ290byBlcnJfY2hhbnM7CisJfQorCisJcmV0dXJuOworZXJyX2NoYW5zOgorZXJyX2NoYW5kaXI6CisJa2ZyZWUoZGJnZnNfY2hhbik7CitlcnJfYWxsb2M6CitlcnJfc3RhdGU6CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRiZ2ZzX3Jvb3QpOworZXJyX3Jvb3Q6CisJcHJfZXJyKCJweGFfZG1hOiBkZWJ1Z2ZzIGlzIG5vdCBhdmFpbGFibGVcbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHhhX2RtYV9jbGVhbnVwX2RlYnVnZnModm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGJnZnNfcm9vdCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHB4YV9kbWFfaW5pdF9kZWJ1Z2ZzKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcHhhX2RtYV9jbGVhbnVwX2RlYnVnZnModm9pZCkge30KKyNlbmRpZgorCiBpbnQgcHhhX3JlcXVlc3RfZG1hIChjaGFyICpuYW1lLCBweGFfZG1hX3ByaW8gcHJpbywKIAkJCXZvaWQgKCppcnFfaGFuZGxlcikoaW50LCB2b2lkICopLAogCQkJdm9pZCAqZGF0YSkKQEAgLTcxLDYgKzMxNSw3IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiBpOwogfQorRVhQT1JUX1NZTUJPTChweGFfcmVxdWVzdF9kbWEpOwogCiB2b2lkIHB4YV9mcmVlX2RtYSAoaW50IGRtYV9jaCkKIHsKQEAgLTg4LDI0ICszMzMsMjYgQEAKIAlkbWFfY2hhbm5lbHNbZG1hX2NoXS5uYW1lID0gTlVMTDsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKHB4YV9mcmVlX2RtYSk7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCWludCBpLCBkaW50ID0gRElOVDsKKwlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RtYV9jaGFubmVsczsgaSsrKSB7Ci0JCWlmIChkaW50ICYgKDEgPDwgaSkpIHsKLQkJCXN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbm5lbCA9ICZkbWFfY2hhbm5lbHNbaV07Ci0JCQlpZiAoY2hhbm5lbC0+bmFtZSAmJiBjaGFubmVsLT5pcnFfaGFuZGxlcikgewotCQkJCWNoYW5uZWwtPmlycV9oYW5kbGVyKGksIGNoYW5uZWwtPmRhdGEpOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIElSUSBmb3IgYW4gdW5yZWdpc3RlcmVkIERNQSBjaGFubmVsOgotCQkJCSAqIGxldCdzIGNsZWFyIHRoZSBpbnRlcnJ1cHRzIGFuZCBkaXNhYmxlIGl0LgotCQkJCSAqLwotCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJzcHVyaW91cyBJUlEgZm9yIERNQSBjaGFubmVsICVkXG4iLCBpKTsKLQkJCQlEQ1NSKGkpID0gRENTUl9TVEFSVElOVFJ8RENTUl9FTkRJTlRSfERDU1JfQlVTRVJSOwotCQkJfQorCXdoaWxlIChkaW50KSB7CisJCWkgPSBfX2ZmcyhkaW50KTsKKwkJZGludCAmPSAoZGludCAtIDEpOworCQljaGFubmVsID0gJmRtYV9jaGFubmVsc1tpXTsKKwkJaWYgKGNoYW5uZWwtPm5hbWUgJiYgY2hhbm5lbC0+aXJxX2hhbmRsZXIpIHsKKwkJCWNoYW5uZWwtPmlycV9oYW5kbGVyKGksIGNoYW5uZWwtPmRhdGEpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElSUSBmb3IgYW4gdW5yZWdpc3RlcmVkIERNQSBjaGFubmVsOgorCQkJICogbGV0J3MgY2xlYXIgdGhlIGludGVycnVwdHMgYW5kIGRpc2FibGUgaXQuCisJCQkgKi8KKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJzcHVyaW91cyBJUlEgZm9yIERNQSBjaGFubmVsICVkXG4iLCBpKTsKKwkJCURDU1IoaSkgPSBEQ1NSX1NUQVJUSU5UUnxEQ1NSX0VORElOVFJ8RENTUl9CVVNFUlI7CiAJCX0KIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTI3LDYgKzM3NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9jaDsgaSsrKSB7CiAJCURDU1IoaSkgPSAwOwogCQlkbWFfY2hhbm5lbHNbaV0ucHJpbyA9IG1pbigoaSAmIDB4ZikgPj4gMiwgRE1BX1BSSU9fTE9XKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmRtYV9jaGFubmVsc1tpXS5sb2NrKTsKIAl9CiAKIAlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGRtYV9pcnFfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwgIkRNQSIsIE5VTEwpOwpAQCAtMTM1LDEwICszODMsOSBAQAogCQlrZnJlZShkbWFfY2hhbm5lbHMpOwogCQlyZXR1cm4gcmV0OwogCX0KLQogCW51bV9kbWFfY2hhbm5lbHMgPSBudW1fY2g7CisKKwlweGFfZG1hX2luaXRfZGVidWdmcygpOworCiAJcmV0dXJuIDA7CiB9Ci0KLUVYUE9SVF9TWU1CT0wocHhhX3JlcXVlc3RfZG1hKTsKLUVYUE9SVF9TWU1CT0wocHhhX2ZyZWVfZG1hKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9tZnAuaCBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9tZnAuaAppbmRleCA2NDAxOTQ2Li4yMjA4NmU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvbWZwLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L21mcC5oCkBAIC0xNTAsNiArMTUwLDc0IEBACiAJTUZQX1BJTl9HUElPMTI1LAogCU1GUF9QSU5fR1BJTzEyNiwKIAlNRlBfUElOX0dQSU8xMjcsCisKKwlNRlBfUElOX0dQSU8xMjgsCisJTUZQX1BJTl9HUElPMTI5LAorCU1GUF9QSU5fR1BJTzEzMCwKKwlNRlBfUElOX0dQSU8xMzEsCisJTUZQX1BJTl9HUElPMTMyLAorCU1GUF9QSU5fR1BJTzEzMywKKwlNRlBfUElOX0dQSU8xMzQsCisJTUZQX1BJTl9HUElPMTM1LAorCU1GUF9QSU5fR1BJTzEzNiwKKwlNRlBfUElOX0dQSU8xMzcsCisJTUZQX1BJTl9HUElPMTM4LAorCU1GUF9QSU5fR1BJTzEzOSwKKwlNRlBfUElOX0dQSU8xNDAsCisJTUZQX1BJTl9HUElPMTQxLAorCU1GUF9QSU5fR1BJTzE0MiwKKwlNRlBfUElOX0dQSU8xNDMsCisJTUZQX1BJTl9HUElPMTQ0LAorCU1GUF9QSU5fR1BJTzE0NSwKKwlNRlBfUElOX0dQSU8xNDYsCisJTUZQX1BJTl9HUElPMTQ3LAorCU1GUF9QSU5fR1BJTzE0OCwKKwlNRlBfUElOX0dQSU8xNDksCisJTUZQX1BJTl9HUElPMTUwLAorCU1GUF9QSU5fR1BJTzE1MSwKKwlNRlBfUElOX0dQSU8xNTIsCisJTUZQX1BJTl9HUElPMTUzLAorCU1GUF9QSU5fR1BJTzE1NCwKKwlNRlBfUElOX0dQSU8xNTUsCisJTUZQX1BJTl9HUElPMTU2LAorCU1GUF9QSU5fR1BJTzE1NywKKwlNRlBfUElOX0dQSU8xNTgsCisJTUZQX1BJTl9HUElPMTU5LAorCU1GUF9QSU5fR1BJTzE2MCwKKwlNRlBfUElOX0dQSU8xNjEsCisJTUZQX1BJTl9HUElPMTYyLAorCU1GUF9QSU5fR1BJTzE2MywKKwlNRlBfUElOX0dQSU8xNjQsCisJTUZQX1BJTl9HUElPMTY1LAorCU1GUF9QSU5fR1BJTzE2NiwKKwlNRlBfUElOX0dQSU8xNjcsCisJTUZQX1BJTl9HUElPMTY4LAorCU1GUF9QSU5fR1BJTzE2OSwKKwlNRlBfUElOX0dQSU8xNzAsCisJTUZQX1BJTl9HUElPMTcxLAorCU1GUF9QSU5fR1BJTzE3MiwKKwlNRlBfUElOX0dQSU8xNzMsCisJTUZQX1BJTl9HUElPMTc0LAorCU1GUF9QSU5fR1BJTzE3NSwKKwlNRlBfUElOX0dQSU8xNzYsCisJTUZQX1BJTl9HUElPMTc3LAorCU1GUF9QSU5fR1BJTzE3OCwKKwlNRlBfUElOX0dQSU8xNzksCisJTUZQX1BJTl9HUElPMTgwLAorCU1GUF9QSU5fR1BJTzE4MSwKKwlNRlBfUElOX0dQSU8xODIsCisJTUZQX1BJTl9HUElPMTgzLAorCU1GUF9QSU5fR1BJTzE4NCwKKwlNRlBfUElOX0dQSU8xODUsCisJTUZQX1BJTl9HUElPMTg2LAorCU1GUF9QSU5fR1BJTzE4NywKKwlNRlBfUElOX0dQSU8xODgsCisJTUZQX1BJTl9HUElPMTg5LAorCU1GUF9QSU5fR1BJTzE5MCwKKwlNRlBfUElOX0dQSU8xOTEsCisKKwlNRlBfUElOX0dQSU8yNTUgPSAyNTUsCisKIAlNRlBfUElOX0dQSU8wXzIsCiAJTUZQX1BJTl9HUElPMV8yLAogCU1GUF9QSU5fR1BJTzJfMiwKQEAgLTMyNSw4ICszOTMsOSBAQAogI2RlZmluZSBNRlBfUFVMTF9MT1cJCSgweDEgPDwgMjEpCiAjZGVmaW5lIE1GUF9QVUxMX0hJR0gJCSgweDIgPDwgMjEpCiAjZGVmaW5lIE1GUF9QVUxMX0JPVEgJCSgweDMgPDwgMjEpCi0jZGVmaW5lIE1GUF9QVUxMX01BU0sJCSgweDMgPDwgMjEpCi0jZGVmaW5lIE1GUF9QVUxMKHgpCQkoKCh4KSA+PiAyMSkgJiAweDMpCisjZGVmaW5lIE1GUF9QVUxMX0ZMT0FUCQkoMHg0IDw8IDIxKQorI2RlZmluZSBNRlBfUFVMTF9NQVNLCQkoMHg3IDw8IDIxKQorI2RlZmluZSBNRlBfUFVMTCh4KQkJKCgoeCkgPj4gMjEpICYgMHg3KQogCiAjZGVmaW5lIE1GUF9DRkdfREVGQVVMVAkJKE1GUF9BRjAgfCBNRlBfRFMwM1ggfCBNRlBfTFBNX0RFRkFVTFQgfFwKIAkJCQkgTUZQX0xQTV9FREdFX05PTkUgfCBNRlBfUFVMTF9OT05FKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEvbWZwLmMgYi9hcmNoL2FybS9wbGF0LXB4YS9tZnAuYwppbmRleCBlNzE2YzYyLi45NDA1ZDAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9tZnAuYworKysgYi9hcmNoL2FybS9wbGF0LXB4YS9tZnAuYwpAQCAtNzcsMTEgKzc3LDEzIEBACiAgKiBNRlBSX1BVTExfTE9XICAgICAgICAxICAgICAgICAgMCAgICAgICAgMQogICogTUZQUl9QVUxMX0hJR0ggICAgICAgMSAgICAgICAgIDEgICAgICAgIDAKICAqIE1GUFJfUFVMTF9CT1RIICAgICAgIDEgICAgICAgICAxICAgICAgICAxCisgKiBNRlBSX1BVTExfRkxPQVQJMSAgICAgICAgIDAgICAgICAgIDAKICAqLwogI2RlZmluZSBNRlBSX1BVTExfTk9ORQkJKDApCiAjZGVmaW5lIE1GUFJfUFVMTF9MT1cJCShNRlBSX1BVTExfU0VMIHwgTUZQUl9QVUxMRE9XTl9FTikKICNkZWZpbmUgTUZQUl9QVUxMX0JPVEgJCShNRlBSX1BVTExfTE9XIHwgTUZQUl9QVUxMVVBfRU4pCiAjZGVmaW5lIE1GUFJfUFVMTF9ISUdICQkoTUZQUl9QVUxMX1NFTCB8IE1GUFJfUFVMTFVQX0VOKQorI2RlZmluZSBNRlBSX1BVTExfRkxPQVQJCShNRlBSX1BVTExfU0VMKQogCiAvKiBtZnBfc3Bpbl9sb2NrIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgTUZQIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KICAqIChtb3N0IGxpa2VseSBhIHJlYWQtbW9kaWZ5LXdyaXRlIG9wZXJhdGlvbikgaXMgYXRvbWljLCBhbmQgdGhhdApAQCAtMTE2LDYgKzExOCw3IEBACiAJTUZQUl9QVUxMX0xPVywKIAlNRlBSX1BVTExfSElHSCwKIAlNRlBSX1BVTExfQk9USCwKKwlNRlBSX1BVTExfRkxPQVQsCiB9OwogCiAvKiBtYXBwaW5nIG9mIE1GUF9MUE1fRURHRV8qIGRlZmluaXRpb25zIHRvIE1GUFJfRURHRV8qIHJlZ2lzdGVyIGJpdHMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtczNjL2dwaW8uYwppbmRleCAyNjBmZGM2Li41ZmYyNGUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvZ3Bpby5jCkBAIC0yOCw3ICsyOCw3IEBACiAKIAlncG4gPSBjaGlwLT5jaGlwLmJhc2U7CiAJZm9yIChpID0gMDsgaSA8IGNoaXAtPmNoaXAubmdwaW87IGkrKywgZ3BuKyspIHsKLQkJQlVHX09OKGdwbiA+IEFSUkFZX1NJWkUoczNjX2dwaW9zKSk7CisJCUJVR19PTihncG4gPj0gQVJSQVlfU0laRShzM2NfZ3Bpb3MpKTsKIAkJczNjX2dwaW9zW2dwbl0gPSBjaGlwOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9hZGMuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9hZGMuYwppbmRleCAxMTExN2E3Li5kZjQ3MzIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvYWRjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2FkYy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CkBAIC0xODgsNyArMTg5LDcgQEAKIGVycjoKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwoczNjX2FkY19jb252ZXJ0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHMzY19hZGNfcmVhZCk7CiAKIHN0YXRpYyB2b2lkIHMzY19hZGNfZGVmYXVsdF9zZWxlY3Qoc3RydWN0IHMzY19hZGNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgdW5zaWduZWQgc2VsZWN0KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jCmluZGV4IDU0NDdlNjAuLjRhZjlkZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LmMKQEAgLTYxLDYgKzYxLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQxMltdICA9ICJTM0MyNDEyIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQ0MFtdICA9ICJTM0MyNDQwIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQ0MltdICA9ICJTM0MyNDQyIjsKK3N0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQ0MmJbXSAgPSAiUzNDMjQ0MkIiOwogc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9zM2MyNDQzW10gID0gIlMzQzI0NDMiOwogc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9zM2MyNDEwYVtdID0gIlMzQzI0MTBBIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQ0MGFbXSA9ICJTM0MyNDQwQSI7CkBAIC0xMTIsNiArMTEzLDE1IEBACiAJCS5uYW1lCQk9IG5hbWVfczNjMjQ0MgogCX0sCiAJeworCQkuaWRjb2RlCQk9IDB4MzI0NDBhYWIsCisJCS5pZG1hc2sJCT0gMHhmZmZmZmZmZiwKKwkJLm1hcF9pbwkJPSBzM2MyNDR4X21hcF9pbywKKwkJLmluaXRfY2xvY2tzCT0gczNjMjQ0eF9pbml0X2Nsb2NrcywKKwkJLmluaXRfdWFydHMJPSBzM2MyNDR4X2luaXRfdWFydHMsCisJCS5pbml0CQk9IHMzYzI0NDJfaW5pdCwKKwkJLm5hbWUJCT0gbmFtZV9zM2MyNDQyYgorCX0sCisJewogCQkuaWRjb2RlCQk9IDB4MzI0MTIwMDEsCiAJCS5pZG1hc2sJCT0gMHhmZmZmZmZmZiwKIAkJLm1hcF9pbwkJPSBzM2MyNDEyX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYwppbmRleCAxOTZiMTkxLi5mMDQ2ZjhjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCkBAIC0yMDgsMTQgKzIwOCwxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgcmVsb2FkOwogCi0JcHJfZGVidWcoInMzYzI0MTBfY2hhbl9sb2FkYnVmZmVyOiBsb2FkaW5nIGJ1ZmYgJXAgKDB4JTA4bHgsMHglMDZ4KVxuIiwKLQkJIGJ1ZiwgKHVuc2lnbmVkIGxvbmcpYnVmLT5kYXRhLCBidWYtPnNpemUpOwotCiAJaWYgKGJ1ZiA9PSBOVUxMKSB7CiAJCWRtYXdhcm4oImJ1ZmZlciBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJcHJfZGVidWcoInMzYzI0MTBfY2hhbl9sb2FkYnVmZmVyOiBsb2FkaW5nIGJ1ZmYgJXAgKDB4JTA4bHgsMHglMDZ4KVxuIiwKKwkJIGJ1ZiwgKHVuc2lnbmVkIGxvbmcpYnVmLT5kYXRhLCBidWYtPnNpemUpOworCiAJLyogY2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBjaGFubmVsIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyAqLwogCiAJaWYgKGNoYW4tPmxvYWRfc3RhdGUgPT0gUzNDMjQxMF9ETUFMT0FEXzFMT0FERUQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpby5jCmluZGV4IDk1ZGYwNTkuLjU0Njc0NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW8uYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWZucy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLWNvcmUuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCmluZGV4IGVmZWIwMjUuLmM3NzYxMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCkBAIC0yMjIsNyArMjIyLDkgQEAKIC8qIFMzQzI0MTAgYW5kIGNvbXBhdGlibGUgZXhwb3J0ZWQgZnVuY3Rpb25zICovCiAKIGV4dGVybiB2b2lkIHMzYzI0MTBfY3B1ZnJlcV9zZXRyZWZyZXNoKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7CitleHRlcm4gdm9pZCBzM2MyNDEwX3NldF9mdmNvKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7CiAKKyNpZmRlZiBDT05GSUdfUzNDMjQxMF9JT1RJTUlORwogZXh0ZXJuIGludCBzM2MyNDEwX2lvdGltaW5nX2NhbGMoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAogCQkJCSBzdHJ1Y3QgczNjX2lvdGltaW5ncyAqaW90KTsKIApAQCAtMjMxLDggKzIzMywxMSBAQAogCiBleHRlcm4gdm9pZCBzM2MyNDEwX2lvdGltaW5nX3NldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCiAJCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOwotCi1leHRlcm4gdm9pZCBzM2MyNDEwX3NldF9mdmNvKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7CisjZWxzZQorI2RlZmluZSBzM2MyNDEwX2lvdGltaW5nX2NhbGMgTlVMTAorI2RlZmluZSBzM2MyNDEwX2lvdGltaW5nX2dldCBOVUxMCisjZGVmaW5lIHMzYzI0MTBfaW90aW1pbmdfc2V0IE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUzNDMjQxMF9JT1RJTUlORyAqLwogCiAvKiBTM0MyNDEyIGNvbXBhdGlibGUgcm91dGluZXMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tY2kuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvbWNpLmgKaW5kZXggMmQwODUyYS4uYzJjZWY2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tY2kuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L21jaS5oCkBAIC0yLDggKzIsMTEgQEAKICNkZWZpbmUgX0FSQ0hfTUNJX0gKIAogc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhIHsKKwl1bnNpZ25lZCBpbnQJbm9fd3Byb3RlY3QgOiAxOworCXVuc2lnbmVkIGludAlub19kZXRlY3QgOiAxOwogCXVuc2lnbmVkIGludAl3cHJvdGVjdF9pbnZlcnQgOiAxOwogCXVuc2lnbmVkIGludAlkZXRlY3RfaW52ZXJ0IDogMTsgICAvKiBzZXQgPT4gZGV0ZWN0IGFjdGl2ZSBoaWdoLiAqLworCXVuc2lnbmVkIGludAl1c2VfZG1hIDogMTsKIAogCXVuc2lnbmVkIGludAlncGlvX2RldGVjdDsKIAl1bnNpZ25lZCBpbnQJZ3Bpb193cHJvdGVjdDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQxMC5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEwLmgKaW5kZXggYjZkZWVlZi4uODJhYjRhYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQxMC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQxMC5oCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIHMzYzI0MTBfaW5pdF91YXJ0cyBOVUxMCiAjZGVmaW5lIHMzYzI0MTBfbWFwX2lvIE5VTEwKICNkZWZpbmUgczNjMjQxMF9pbml0IE5VTEwKKyNkZWZpbmUgczNjMjQxMGFfaW5pdCBOVUxMCiAjZW5kaWYKIAogZXh0ZXJuIGludCBzM2MyNDEwX2Jhc2VjbGtfYWRkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2RtYS5jCmluZGV4IDY3YWE5M2QuLjI2NmExMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvZG1hLmMKQEAgLTM0NSwxMyArMzQ1LDEzIEBACiAJaWYgKCFjaGFuKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWJ1ZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgczNjNjR4eF9kbWFfYnVmZiksIEdGUF9LRVJORUwpOworCWJ1ZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgczNjNjR4eF9kbWFfYnVmZiksIEdGUF9BVE9NSUMpOwogCWlmICghYnVmZikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIGJ1ZmZlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlsbGkgPSBkbWFfcG9vbF9hbGxvYyhkbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJmJ1ZmYtPmxsaV9kbWEpOworCWxsaSA9IGRtYV9wb29sX2FsbG9jKGRtYV9wb29sLCBHRlBfQVRPTUlDLCAmYnVmZi0+bGxpX2RtYSk7CiAJaWYgKCFsbGkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBsbGlcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlZ2lzdGVyaW5nIERNQSBjaGFubmVsc1xuIiwgX19mdW5jX18pOwogCi0JZG1hX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUoIkRNQS1MTEkiLCBOVUxMLCAzMiwgMTYsIDApOworCWRtYV9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJETUEtTExJIiwgTlVMTCwgc2l6ZW9mKHN0cnVjdCBwbDA4MHNfbGxpKSwgMTYsIDApOwogCWlmICghZG1hX3Bvb2wpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGNyZWF0ZSBwb29sXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9kbWEtcGxhdC5oIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9kbWEtcGxhdC5oCmluZGV4IDBjMzBkZDkuLjhmNzZhMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZG1hLXBsYXQuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2RtYS1wbGF0LmgKQEAgLTI2LDcgKzI2LDcgQEAKIAlzdHJ1Y3QgczNjNjR4eF9kbWFfYnVmZiAqbmV4dDsKIAogCXZvaWQJCQkqcHc7Ci0Jc3RydWN0IHBsMDgwX2xsaQkqbGxpOworCXN0cnVjdCBwbDA4MHNfbGxpCSpsbGk7CiAJZG1hX2FkZHJfdAkJIGxsaV9kbWE7CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2lycXMuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvaXJxcy5oCmluZGV4IDc0M2E3MDAuLjc5NTZmZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvaXJxcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvaXJxcy5oCkBAIC0xOTQsOSArMTk0LDE3IEBACiAKICNkZWZpbmUgSVJRX0VJTlRfR1JPVVAoZ3JvdXAsIG5vKQkoSVJRX0VJTlRfR1JPVVAjI2dyb3VwIyNfQkFTRSArIChubykpCiAKKy8qIERlZmluZSBhIGdyb3VwIG9mIGludGVycnVwdHMgZm9yIGJvYXJkLXNwZWNpZmljIHVzZSAoZWcsIGZvciBNRkQKKyAqIGludGVycnVwdCBjb250cm9sbGVycykuICovCisjZGVmaW5lIElSUV9CT0FSRF9TVEFSVCAoSVJRX0VJTlRfR1JPVVA5X0JBU0UgKyBJUlFfRUlOVF9HUk9VUDlfTlIgKyAxKQorCisjZGVmaW5lIElSUV9CT0FSRF9OUiAxNgorCisjZGVmaW5lIElSUV9CT0FSRF9FTkQgKElSUV9CT0FSRF9TVEFSVCArIElSUV9CT0FSRF9OUikKKwogLyogU2V0IHRoZSBkZWZhdWx0IE5SX0lSUVMgKi8KIAotI2RlZmluZSBOUl9JUlFTCShJUlFfRUlOVF9HUk9VUDlfQkFTRSArIElSUV9FSU5UX0dST1VQOV9OUiArIDEpCisjZGVmaW5lIE5SX0lSUVMJKElSUV9CT0FSRF9FTkQgKyAxKQogCiAjZW5kaWYgLyogX19BU01fUExBVF9TM0M2NFhYX0lSUVNfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3JlZ3MtY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1jbG9jay5oCmluZGV4IGE4Nzc3YTcuLmZmNDZlN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1jbG9jay5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1jbG9jay5oCkBAIC01MSw4ICs1MSw4IEBACiAjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9IQ0xLX1NISUZUCSg4KQogI2RlZmluZSBTM0M2NDAwX0NMS0RJVjBfTVBMTF9NQVNLCSgweDEgPDwgNCkKICNkZWZpbmUgUzNDNjQwMF9DTEtESVYwX01QTExfU0hJRlQJKDQpCi0jZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9BUk1fTUFTSwkoMHgzIDw8IDApCi0jZGVmaW5lIFMzQzY0MTBfQ0xLRElWMF9BUk1fTUFTSwkoMHg3IDw8IDApCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9BUk1fTUFTSwkoMHg3IDw8IDApCisjZGVmaW5lIFMzQzY0MTBfQ0xLRElWMF9BUk1fTUFTSwkoMHhmIDw8IDApCiAjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9BUk1fU0hJRlQJKDApCiAKIC8qIENMS0RJVjEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9zM2M2NDAwLWNsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvczNjNjQwMC1jbG9jay5jCmluZGV4IGZlYmFjMTkuLjZmZmEyMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9zM2M2NDAwLWNsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3MzYzY0MDAtY2xvY2suYwpAQCAtMzAyLDggKzMwMiw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdmFsID0gX19yYXdfcmVhZGwocmVnKTsKLQl2YWwgJj0gfigweGYgPDwgc2Nsay0+c2hpZnQpOwotCXZhbCB8PSAoZGl2IC0gMSkgPDwgc2Nsay0+c2hpZnQ7CisJdmFsICY9IH4oMHhmIDw8IHNjbGstPmRpdmlkZXJfc2hpZnQpOworCXZhbCB8PSAoZGl2IC0gMSkgPDwgc2Nsay0+ZGl2aWRlcl9zaGlmdDsKIAlfX3Jhd193cml0ZWwodmFsLCByZWcpOwogCiAJcmV0dXJuIDA7CkBAIC0zMjgsNiArMzI4LDggQEAKIAkJY2xrc3JjIHw9IHNyY19uciA8PCBzY2xrLT5zaGlmdDsKIAogCQlfX3Jhd193cml0ZWwoY2xrc3JjLCBTM0NfQ0xLX1NSQyk7CisKKwkJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzQzLDcgKzM0NSw3IEBACiAJaWYgKHJhdGUgPiBwYXJlbnRfcmF0ZSkKIAkJcmF0ZSA9IHBhcmVudF9yYXRlOwogCWVsc2UgewotCQlkaXYgPSByYXRlIC8gcGFyZW50X3JhdGU7CisJCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKIAogCQlpZiAoZGl2ID09IDApCiAJCQlkaXYgPSAxOwpAQCAtNjc1LDYgKzY3Nyw5IEBACiAKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHh0YWwgaXMgJWxkXG4iLCBfX2Z1bmNfXywgeHRhbCk7CiAKKwkvKiBGb3Igbm93IGFzc3VtZSB0aGUgbXV4IGFsd2F5cyBzZWxlY3RzIHRoZSBjcnlzdGFsICovCisJY2xrX2V4dF94dGFsX211eC5wYXJlbnQgPSB4dGFsX2NsazsKKwogCWVwbGwgPSBzM2M2NDAwX2dldF9lcGxsKHh0YWwpOwogCW1wbGwgPSBzM2M2NDAwX2dldF9wbGwoeHRhbCwgX19yYXdfcmVhZGwoUzNDX01QTExfQ09OKSk7CiAJYXBsbCA9IHMzYzY0MDBfZ2V0X3BsbCh4dGFsLCBfX3Jhd19yZWFkbChTM0NfQVBMTF9DT04pKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc3RtcDN4eHgvZG1hLmMgYi9hcmNoL2FybS9wbGF0LXN0bXAzeHh4L2RtYS5jCmluZGV4IGQyZjQ5NzcuLmVmODhmMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc3RtcDN4eHgvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zdG1wM3h4eC9kbWEuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJCQkJCXN0bXAzeHh4X2RtYV9mcmVlX2NvbW1hbmQoY2gsCiAJCQkJCQkJCSAgJmRlc2NyaXB0b3JzCiAJCQkJCQkJCSAgW2ldKTsKLQkJCQl9IHdoaWxlIChpLS0gPj0gMCk7CisJCQkJfSB3aGlsZSAoaS0tID4gMCk7CiAJCQl9CiAJCQlyZXR1cm4gZXJyOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzIGIvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcwppbmRleCBjOGM1NWI0Li45NGJlN2JiIDEwMDY0NAotLS0gYS9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCisrKyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTEyLDcgKzEyLDcgQEAKICMKICMgICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZGV2ZWxvcGVyL21hY2hpbmVzLz9hY3Rpb249bmV3CiAjCi0jIExhc3QgdXBkYXRlOiBTYXQgU2VwIDEyIDEyOjAwOjE2IDIwMDkKKyMgTGFzdCB1cGRhdGU6IEZyaSBTZXAgMTggMjE6NDI6MDAgMjAwOQogIwogIyBtYWNoaW5lX2lzX3h4eAlDT05GSUdfeHh4eAkJTUFDSF9UWVBFX3h4eAkJbnVtYmVyCiAjCkBAIC0xNjM4LDcgKzE2MzgsNyBAQAogYW1sX204MDUwCQlNQUNIX0FNTF9NODA1MAkJQU1MX004MDUwCQkxNjQ0CiBteDM1XzNkcwkJTUFDSF9NWDM1XzNEUwkJTVgzNV8zRFMJCTE2NDUKIG1hcnMJCQlNQUNIX01BUlMJCU1BUlMJCQkxNjQ2Ci1udG9zZF82NDR4YQkJTUFDSF9OVE9TRF82NDRYQQlOVE9TRF82NDRYQQkJMTY0NworbmV1cm9zX29zZDIJCU1BQ0hfTkVVUk9TX09TRDIJTkVVUk9TX09TRDIJCTE2NDcKIGJhZGdlcgkJCU1BQ0hfQkFER0VSCQlCQURHRVIJCQkxNjQ4CiB0cml6ZXBzNHdsCQlNQUNIX1RSSVpFUFM0V0wJCVRSSVpFUFM0V0wJCTE2NDkKIHRyaXplcHM1CQlNQUNIX1RSSVpFUFM1CQlUUklaRVBTNQkJMTY1MApAQCAtMTY1NCw3ICsxNjU0LDcgQEAKIHpvcmFuNDN4eAkJTUFDSF9aT1JBTjQzWFgJCVpPUkFONDNYWAkJMTY2MAogc29uaXg5MjYJCU1BQ0hfU09OSVg5MjYJCVNPTklYOTI2CQkxNjYxCiBjZWxlc3RpYWxzZW1pCQlNQUNIX0NFTEVTVElBTFNFTUkJQ0VMRVNUSUFMU0VNSQkJMTY2MgotY2M5bTI0NDMJCU1BQ0hfQ0M5TTI0NDMJCUNDOU0yNDQzCQkxNjYzCitjYzltMjQ0M2pzCQlNQUNIX0NDOU0yNDQzSlMJCUNDOU0yNDQzSlMJCTE2NjMKIHR3NTMzNAkJCU1BQ0hfVFc1MzM0CQlUVzUzMzQJCQkxNjY0CiBvbWFwX2h0Y2FydGVtaXMJCU1BQ0hfSFRDQVJURU1JUwkJSFRDQVJURU1JUwkJMTY2NQogbmFsX2hsaXRlCQlNQUNIX05BTF9ITElURQkJTkFMX0hMSVRFCQkxNjY2CkBAIC0xODAyLDcgKzE4MDIsNyBAQAogcmQ4OGY1MTgxbF9nZQkJTUFDSF9SRDg4RjUxODFMX0dFCVJEODhGNTE4MUxfR0UJCTE4MTIKIHNpZm1haW4JCQlNQUNIX1NJRk1BSU4JCVNJRk1BSU4JCQkxODEzCiBzYW05X2w5MjYxCQlNQUNIX1NBTTlfTDkyNjEJCVNBTTlfTDkyNjEJCTE4MTQKLWNjOW0yNDQzanMJCU1BQ0hfQ0M5TTI0NDNKUwkJQ0M5TTI0NDNKUwkJMTgxNQorY2M5bTI0NDMJCU1BQ0hfQ0M5TTI0NDMJCUNDOU0yNDQzCQkxODE1CiB4YXJpYTMwMAkJTUFDSF9YQVJJQTMwMAkJWEFSSUEzMDAJCTE4MTYKIGl0OTIwMAkJCU1BQ0hfSVQ5MjAwCQlJVDkyMDAJCQkxODE3CiByZDg4ZjUxODFsX2Z4bwkJTUFDSF9SRDg4RjUxODFMX0ZYTwlSRDg4RjUxODFMX0ZYTwkJMTgxOApAQCAtMjQwOSwzICsyNDA5LDE1IEBACiBwc3MyCQkJTUFDSF9QU1MyCQlQU1MyCQkJMjQyMwogZGF2aW5jaV9hcG0xNTAJCU1BQ0hfREFWSU5DSV9BUE0xNTAJREFWSU5DSV9BUE0xNTAJCTI0MjQKIHN0cjkxMDAJCQlNQUNIX1NUUjkxMDAJCVNUUjkxMDAJCQkyNDI1CituZXQ1YmlnCQkJTUFDSF9ORVQ1QklHCQlORVQ1QklHCQkJMjQyNgorc2VhYmVkOTI2MwkJTUFDSF9TRUFCRUQ5MjYzCQlTRUFCRUQ5MjYzCQkyNDI3CitteDUxX20yaWQJCU1BQ0hfTVg1MV9NMklECQlNWDUxX00ySUQJCTI0MjgKK29jdHZvY3BsdXNfZWIJCU1BQ0hfT0NUVk9DUExVU19FQglPQ1RWT0NQTFVTX0VCCQkyNDI5CitrbGtfZmlyZWZveAkJTUFDSF9LTEtfRklSRUZPWAlLTEtfRklSRUZPWAkJMjQzMAora2xrX3dpcm1hX21vZHVsZQlNQUNIX0tMS19XSVJNQV9NT0RVTEUJS0xLX1dJUk1BX01PRFVMRQkyNDMxCitrbGtfd2lybWFfbW1pCQlNQUNIX0tMS19XSVJNQV9NTUkJS0xLX1dJUk1BX01NSQkJMjQzMgorc3VwZXJzb25pYwkJTUFDSF9TVVBFUlNPTklDCQlTVVBFUlNPTklDCQkyNDMzCitsaWJlcnR5CQkJTUFDSF9MSUJFUlRZCQlMSUJFUlRZCQkJMjQzNAorbWgzNTUJCQlNQUNIX01IMzU1CQlNSDM1NQkJCTI0MzUKK3BjNzgwMgkJCU1BQ0hfUEM3ODAyCQlQQzc4MDIJCQkyNDM2CitnbmV0X3NnYwkJTUFDSF9HTkVUX1NHQwkJR05FVF9TR0MJCTI0MzcKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggNTdlYzlmMi4uNmIyMzQzZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTE4LDkgKzE4LDggQEAKIC8qCiAgKiBJbml0aWFsIHRocmVhZCBzdHJ1Y3R1cmUuIE11c3QgYmUgYWxpZ25lZCBvbiBhbiA4MTkyLWJ5dGUgYm91bmRhcnkuCiAgKi8KLXVuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbgotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KLQkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KKwl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwogCiAvKgogICogSW5pdGlhbCB0YXNrIHN0cnVjdHVyZS4KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2NwdS5oIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvY3B1LmgKaW5kZXggNDRkMGJmYS4uOWM5NmExMyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvY3B1LmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvY3B1LmgKQEAgLTMxLDUgKzMxLDggQEAKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYzKCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXJsKCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxY2FwOSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTAoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NWVzKCkJKDApCiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0NQVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21tL2luaXQuYyBiL2FyY2gvYXZyMzIvbW0vaW5pdC5jCmluZGV4IDM3NmYxOGMuLjk0OTI1NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXZyMzIvbW0vaW5pdC5jCkBAIC0yNCwxMSArMjQsOSBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCi0jZGVmaW5lIF9fcGFnZV9hbGlnbmVkCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5kYXRhLnBhZ2VfYWxpZ25lZCIpKSkKLQogREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKIAotcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXSBfX3BhZ2VfYWxpZ25lZDsKK3BnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF0gX19wYWdlX2FsaWduZWRfZGF0YTsKIAogc3RydWN0IHBhZ2UgKmVtcHR5X3plcm9fcGFnZTsKIEVYUE9SVF9TWU1CT0woZW1wdHlfemVyb19wYWdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vQURJX0JTRC50eHQgYi9hcmNoL2JsYWNrZmluL0FESV9CU0QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMWQwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL0FESV9CU0QudHh0CkBAIC0wLDAgKzEsNDEgQEAKK1RoaXMgQlNELVN0eWxlIExpY2Vuc2UgYXBwbGllcyB0byBhIGZldyBmaWxlcyBpbiAuL2FyY2gvYmxhY2tmaW4gZGlyZWN0b3J5LAorYW5kIGlzIGluY2x1ZGVkIGhlcmUsIHNvIHBlb3BsZSB1bmRlcnN0YW5kIHdoaWNoIGNvZGUgdGhleSBjYW4gdXNlIG91dHNpZGUKK3RoZSBMaW51eCBrZXJuZWwsIGluIG5vbi1HUEwgYmFzZWQgcHJvamVjdHMuCisKK1VzaW5nIHRoZSBmaWxlcyByZWxlYXNlZCB1bmRlciB0aGUgIkFESSBCU0QiIGxpY2Vuc2UsIG11c3QgY29tcGx5IHdpdGgKK3RoZXNlIGxpY2Vuc2UgdGVybXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvcHlyaWdodCBBbmFsb2cgRGV2aWNlcywgSW5jLgorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKyAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgICBkaXN0cmlidXRpb24uCisgIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBBbmFsb2cgRGV2aWNlcywgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgLSBUaGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgbWF5IG9yIG1heSBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCByaWdodHMKKyAgICBvZiBvbmUgb3IgbW9yZSBwYXRlbnQgaG9sZGVycy4gIFRoaXMgbGljZW5zZSBkb2VzIG5vdCByZWxlYXNlIHlvdQorICAgIGZyb20gdGhlIHJlcXVpcmVtZW50IHRoYXQgeW91IG9idGFpbiBzZXBhcmF0ZSBsaWNlbnNlcyBmcm9tIHRoZXNlCisgICAgcGF0ZW50IGhvbGRlcnMgdG8gdXNlIHRoaXMgc29mdHdhcmUuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQU5BTE9HIERFVklDRVMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgQU5BTE9HIERFVklDRVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCitCVVQgTk9UIExJTUlURUQgVE8sIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMsIFBST0NVUkVNRU5UIE9GCitTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKK0JVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKK0FEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL0tjb25maWcKaW5kZXggOWEwMWQ0NC4uYWU2YTYwZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZwpAQCAtNDcsNiArNDcsOSBAQAogY29uZmlnIEdFTkVSSUNfSVJRX1BST0JFCiAJZGVmX2Jvb2wgeQogCitjb25maWcgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCisJZGVmX2Jvb2wgeQorCiBjb25maWcgR0VORVJJQ19HUElPCiAJZGVmX2Jvb2wgeQogCkBAIC0yMjksNyArMjMyLDcgQEAKIAogY29uZmlnIFNNUAogCWRlcGVuZHMgb24gQkY1NjEKLQlzZWxlY3QgR0VORVJJQ19USU1FCisJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUsCkBAIC02MTMsMTIgKzYxNiwxMCBAQAogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKIGNvbmZpZyBHRU5FUklDX1RJTUUKLQlib29sICJHZW5lcmljIHRpbWUiCi0JZGVmYXVsdCB5CisJZGVmX2Jvb2wgeQogCiBjb25maWcgR0VORVJJQ19DTE9DS0VWRU5UUwogCWJvb2wgIkdlbmVyaWMgY2xvY2sgZXZlbnRzIgotCWRlcGVuZHMgb24gR0VORVJJQ19USU1FCiAJZGVmYXVsdCB5CiAKIGNob2ljZQpAQCAtNjUzLDYgKzY1NCwxMCBAQAogCWRlcGVuZHMgb24gR0VORVJJQ19DTE9DS0VWRU5UUwogCWRlcGVuZHMgb24gIVRJQ0tTT1VSQ0VfR1BUTVIwCiAKK2NvbmZpZyBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAorCWRlcGVuZHMgb24gIUdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlkZWZfYm9vbCB5CisKIHNvdXJjZSBrZXJuZWwvdGltZS9LY29uZmlnCiAKIGNvbW1lbnQgIk1pc2MiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQppbmRleCA2Zjk1MzNjLi5mMDYzYjc3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKQEAgLTE1NSw3ICsxNTUsNyBAQAogICBlY2hvICAnKiB2bUltYWdlLmd6ICAgICAgLSBLZXJuZWwtb25seSBpbWFnZSBmb3IgVS1Cb290IChhcmNoLyQoQVJDSCkvYm9vdC92bUltYWdlLmd6KScKICAgZWNobyAgJyAgdm1JbWFnZS5sem1hICAgIC0gS2VybmVsLW9ubHkgaW1hZ2UgZm9yIFUtQm9vdCAoYXJjaC8kKEFSQ0gpL2Jvb3Qvdm1JbWFnZS5sem1hKScKICAgZWNobyAgJyAgaW5zdGFsbCAgICAgICAgIC0gSW5zdGFsbCBrZXJuZWwgdXNpbmcnCi0gIGVjaG8gICcgICAgICAgICAgICAgICAgICAgICAoeW91cikgfi9iaW4vJChDUk9TU19DT01QSUxFKWluc3RhbGxrZXJuZWwgb3InCi0gIGVjaG8gICcgICAgICAgICAgICAgICAgICAgICAoZGlzdHJpYnV0aW9uKSBQQVRIOiAkKENST1NTX0NPTVBJTEUpaW5zdGFsbGtlcm5lbCBvcicKKyAgZWNobyAgJyAgICAgICAgICAgICAgICAgICAgICh5b3VyKSB+L2Jpbi8kKElOU1RBTExLRVJORUwpIG9yJworICBlY2hvICAnICAgICAgICAgICAgICAgICAgICAgKGRpc3RyaWJ1dGlvbikgUEFUSDogJChJTlNUQUxMS0VSTkVMKSBvcicKICAgZWNobyAgJyAgICAgICAgICAgICAgICAgICAgIGluc3RhbGwgdG8gJCQoSU5TVEFMTF9QQVRIKScKIGVuZGVmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gvYmxhY2tmaW4vYm9vdC9pbnN0YWxsLnNoCmluZGV4IDk1NjBhNmIuLmUyYzZlNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vYm9vdC9pbnN0YWxsLnNoCisrKyBiL2FyY2gvYmxhY2tmaW4vYm9vdC9pbnN0YWxsLnNoCkBAIC0zNiw5ICszNiw5IEBACiAKICMgVXNlciBtYXkgaGF2ZSBhIGN1c3RvbSBpbnN0YWxsIHNjcmlwdAogCi1pZiBbIC14IH4vYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyB+L2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCAiJEAiOyBmaQotaWYgd2hpY2ggJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JZXhlYyAke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCAiJEAiCitpZiBbIC14IH4vYmluLyR7SU5TVEFMTEtFUk5FTH0gXTsgdGhlbiBleGVjIH4vYmluLyR7SU5TVEFMTEtFUk5FTH0gIiRAIjsgZmkKK2lmIHdoaWNoICR7SU5TVEFMTEtFUk5FTH0gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJZXhlYyAke0lOU1RBTExLRVJORUx9ICIkQCIKIGZpCiAKICMgRGVmYXVsdCBpbnN0YWxsIC0gc2FtZSBhcyBtYWtlIHpsaWxvCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA4OGYzNmQ1Li5kMjdjNjI3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTEsMyArMSw5IEBACisvKgorwqAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorwqAqCivCoCogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorwqAqLworCiAjaWZuZGVmIF9fQVJDSF9CTEFDS0ZJTl9BVE9NSUNfXwogI2RlZmluZSBfX0FSQ0hfQkxBQ0tGSU5fQVRPTUlDX18KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oCmluZGV4IGFlZjA1OTQuLjEwMDY0ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbi1nbG9iYWwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW4tZ2xvYmFsLmgKQEAgLTEsMjkgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vYmZpbi1nbG9iYWwuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIEdsb2JhbCBleHRlcm4gZGVmaW5lcyBmb3IgYmxhY2tmaW4KKyAqIEdsb2JhbCBleHRlcm4gZGVmaW5lcyBmb3IgYmxhY2tmaW4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9CRklOX0dMT0JBTF9IXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluNXh4X3NwaS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluNXh4X3NwaS5oCmluZGV4IGMyODFjNjMuLmVkNGY4YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbjV4eF9zcGkuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW41eHhfc3BpLmgKQEAgLTMsOCArMyw2IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9yb3RhcnkuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9yb3RhcnkuaAppbmRleCA0MjVlY2U2Li5hYmRiMmFmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fcm90YXJ5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3JvdGFyeS5oCkBAIC0xLDYgKzEsMTAgQEAKIC8qCiAgKiBib2FyZCBpbml0aWFsaXphdGlvbiBzaG91bGQgcHV0IG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGludG8gcGxhdGZvcm1fZGF0YQogICogYW5kIHBsYWNlIHRoZSBiZmluLXJvdGFyeSBvbnRvIHBsYXRmb3JtX2J1cyBuYW1lZCAiYmZpbi1yb3RhcnkiLgorICoKKyAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQkZJTl9ST1RBUllfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3NpbXBsZV90aW1lci5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3NpbXBsZV90aW1lci5oCmluZGV4IGZjY2JiNTkuLjUyNDhjMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zaW1wbGVfdGltZXIuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc2ltcGxlX3RpbWVyLmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDYtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKICNpZm5kZWYgX2JmaW5fc2ltcGxlX3RpbWVyX2hfCiAjZGVmaW5lIF9iZmluX3NpbXBsZV90aW1lcl9oXwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCBkYWZmYTcxLi5hMmZmM2ZiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKICNpZm5kZWYgX0JMQUNLRklOX0JJVE9QU19ICiAjZGVmaW5lIF9CTEFDS0ZJTl9CSVRPUFNfSAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JsYWNrZmluLmgKaW5kZXggNGQ0NDM5NS4uZWI3YzE0NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmxhY2tmaW4uaApAQCAtMSw2ICsxLDkgQEAKIC8qCi0gKiBDb21tb24gaGVhZGVyIGZpbGUgZm9yIGJsYWNrZmluIGZhbWlseSBvZiBwcm9jZXNzb3JzLgorICogQ29tbW9uIGhlYWRlciBmaWxlIGZvciBCbGFja2ZpbiBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KICAqCivCoCogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCivCoCoKK8KgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQkxBQ0tGSU5fSF8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnVnLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2J1Zy5oCmluZGV4IDY1NWU0OTUuLjZmNDU0OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnVnLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9idWcuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfQkxBQ0tGSU5fQlVHX0gKICNkZWZpbmUgX0JMQUNLRklOX0JVR19ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDNlNjkxMDYuLjk1NTg0MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw2ICsxIEBACi0jaWZuZGVmIF9CTEFDS0ZJTl9CWVRFT1JERVJfSAotI2RlZmluZSBfQkxBQ0tGSU5fQllURU9SREVSX0gKLQogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+Ci0KLSNlbmRpZgkJCQkvKiBfQkxBQ0tGSU5fQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGUuaAppbmRleCA0NzcwNTBhLi44NTQyYmMzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oCkBAIC0xLDYgKzEsOSBAQAogLyoKLSAqIGluY2x1ZGUvYXNtLWJsYWNrZmluL2NhY2hlLmgKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLworCiAjaWZuZGVmIF9fQVJDSF9CTEFDS0ZJTl9DQUNIRV9ICiAjZGVmaW5lIF9fQVJDSF9CTEFDS0ZJTl9DQUNIRV9ICiAKQEAgLTM1LDEwICszOCwxMCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBcCiAgICAgIWRlZmluZWQoQ09ORklHX0JGSU5fQ0FDSEVfQ09IRVJFTlQpCi0jIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFQUJMRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9MMl9JQ0FDSEVBQkxFKQorIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX0VYVE1FTV9JQ0FDSEVBQkxFKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0wyX0lDQUNIRUFCTEUpCiAjIGRlZmluZSBfX0FSQ0hfU1lOQ19DT1JFX0lDQUNIRQogIyBlbmRpZgotIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRUFCTEUpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fTDJfRENBQ0hFQUJMRSkKKyMgaWYgZGVmaW5lZChDT05GSUdfQkZJTl9FWFRNRU1fRENBQ0hFQUJMRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9MMl9EQ0FDSEVBQkxFKQogIyBkZWZpbmUgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKICMgZW5kaWYKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDdlNTU1NDllLi5hZjAzYTM2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9jYWNoZWZsdXNoLmgKLSAqIEJhc2VkIG9uOgkgaW5jbHVkZS9hc20tbTY4a25vbW11L2NhY2hlZmx1c2guaAotICogQXV0aG9yOiAgICAgICBMRyBTb2Z0IEluZGlhCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKiBDcmVhdGVkOiAgICAgIFR1ZSBTZXAgMjEgMjAwNAotICogRGVzY3JpcHRpb246ICBCbGFja2ZpbiBsb3ctbGV2ZWwgY2FjaGUgcm91dGluZXMgYWRhcHRlZCBmcm9tIHRoZSBpMzg2Ci0gKiAJCSBhbmQgUFBDIHZlcnNpb25zIGJ5IEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCisgKiBCbGFja2ZpbiBsb3ctbGV2ZWwgY2FjaGUgcm91dGluZXMKICAqCi0gKiBNb2RpZmllZDoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX0JMQUNLRklOX0NBQ0hFRkxVU0hfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jZGVmX0xQQmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2RlZl9MUEJsYWNrZmluLmgKaW5kZXggMzVmODQxYi4uODc3OGUwZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jZGVmX0xQQmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NkZWZfTFBCbGFja2Zpbi5oCkBAIC0xLDMwICsxLDggQEAKLSAvKgotICAqIEZpbGU6ICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWNvbW1vbi9jZGVmX0xQQmxhY2tmaW4uaAotICAqIEJhc2VkIG9uOgotICAqIEF1dGhvcjogICAgICB1bmtub3duCi0gICogICAgICAgICAgICAgIENPUFlSSUdIVCAyMDA1IEFuYWxvZyBEZXZpY2VzCi0gICogQ3JlYXRlZDogICAgID8KLSAgKiBEZXNjcmlwdGlvbjoKLSAgKgotICAqIE1vZGlmaWVkOgotICAqCi0gICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICogYW55IGxhdGVyIHZlcnNpb24uCi0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAqCi0gICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gICovCisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCiAKICNpZm5kZWYgX0NERUZfTFBCTEFDS0ZJTl9ICiAjZGVmaW5lIF9DREVGX0xQQkxBQ0tGSU5fSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCmluZGV4IDc5MzU4MWYuLmEyMzQxNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKQEAgLTEsOSArMSwxNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICAgICAgICBha2Jhci5odXNzYWluQGxpbmVvLmNvbQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCiAjaWZuZGVmIF9CRklOX0NIRUNLU1VNX0gKICNkZWZpbmUgX0JGSU5fQ0hFQ0tTVU1fSAogCiAvKgotICogTU9ESUZJRUQgRk9SIEJGSU4gQXByaWwgMzAsIDIwMDEgYWtiYXIuaHVzc2FpbkBsaW5lby5jb20KLSAqCiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgYSBtZW1vcnkgYmxvY2sgYXQgYnVmZiwgbGVuZ3RoIGxlbiwKICAqIGFuZCBhZGRzIGluICJzdW0iICgzMi1iaXQpCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jbG9ja3MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2xvY2tzLmgKaW5kZXggMDMzYmJhOS4uZjgwZGFkNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jbG9ja3MuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2Nsb2Nrcy5oCkBAIC0xLDMwICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtY29tbW9uL2Nsb2Nrcy5oCi0gKiBCYXNlZCBvbjogICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvYmY1MzcuaAotICogQXV0aG9yOgkgUm9iaW4gR2V0eiA8cmdldHpAYmxhY2tmaW4udWNsaW51eC5vcmc+CisgKiBDb21tb24gQ2xvY2sgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMga2VybmVsIGZpbGVzCiAgKgotICogQ3JlYXRlZDogICAgICAyNUp1bDA3Ci0gKiBEZXNjcmlwdGlvbjogIENvbW1vbiBDbG9jayBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBrZXJuZWwgZmlsZXMKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9CRklOX0NMT0NLU19ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NvbnRleHQuUyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCmluZGV4IGY4YTY2NGYuLjVkZmZhZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2NvbnRleHQuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oCmluZGV4IGQxOGQxNjguLmZkYTk2MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL2NwbGIuaAotICogQmFzZWQgb246ICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2JmNTM3LmgKLSAqIEF1dGhvcjogICAgICAgUm9iaW4gR2V0eiA8cmdldHpAYmxhY2tmaW4udWNsaW51eC5vcmc+CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOiAgICAgIDIwMDAKLSAqIERlc2NyaXB0aW9uOiAgQ29tbW9uIENQTEIgZGVmaW5pdGlvbnMgZm9yIENQTEIgaW5pdAotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9DUExCX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYmluaXQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYmluaXQuaAppbmRleCAwNWIxNGE2Li5mMzE1YzgzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGJpbml0LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiaW5pdC5oCkBAIC0xLDMwICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL2NwbGJpbml0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29tbW9uIENQTEIgZGVmaW5pdGlvbnMgZm9yIENQTEIgaW5pdAogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9fQVNNX0NQTEJJTklUX0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3B1LmgKaW5kZXggZmFkZmE4Mi4uYjE5MWRjNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdS5oCkBAIC0xLDIzICsxLDggQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3B1LmguCi0gKiBBdXRob3I6ICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CiAgKgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX19BU01fQkxBQ0tGSU5fQ1BVX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZGVmX0xQQmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZGVmX0xQQmxhY2tmaW4uaAppbmRleCA2MzQxZWViLi4yNTkwNjQ2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RlZl9MUEJsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kZWZfTFBCbGFja2Zpbi5oCkBAIC0xLDMyICsxLDEwIEBACi0gLyoKLSAgKiBGaWxlOiAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1jb21tb24vZGVmX0xQQmxhY2tmaW4uaAotICAqIEJhc2VkIG9uOgotICAqIEF1dGhvcjogICAgICB1bmtub3duCi0gICogICAgICAgICAgICAgIENPUFlSSUdIVCAyMDA1IEFuYWxvZyBEZXZpY2VzCi0gICogQ3JlYXRlZDogICAgID8KLSAgKiBEZXNjcmlwdGlvbjoKLSAgKgotICAqIE1vZGlmaWVkOgotICAqCi0gICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICogYW55IGxhdGVyIHZlcnNpb24uCi0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAqCi0gICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gICovCi0KLS8qIExQIEJsYWNrZmluIENPUkUgUkVHSVNURVIgQklUICYgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUzMi8zMyAqLworLyoKKyAqIEJsYWNrZmluIGNvcmUgcmVnaXN0ZXIgYml0ICYgYWRkcmVzcyBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgR1BMLTIgKG9yIGxhdGVyKS4KKyAqLwogCiAjaWZuZGVmIF9ERUZfTFBCTEFDS0ZJTl9ICiAjZGVmaW5lIF9ERUZfTFBCTEFDS0ZJTl9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKaW5kZXggZWQ2YjFmMy4uN2EyM2Q4MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfQkxBQ0tGSU5fRE1BX01BUFBJTkdfSAogI2RlZmluZSBfQkxBQ0tGSU5fRE1BX01BUFBJTkdfSAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RwbWMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCmluZGV4IDk2ZTgyMDguLjkyNWU2NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCkBAIC0xLDkgKzEsMTEgQEAKIC8qCi0gKiBpbmNsdWRlL2FzbS1ibGFja2Zpbi9kcG1jLmggLSAgTWlzY2VsbGFuZW91cyBJT0NUTCBjb21tYW5kcyBmb3IgRHluYW1pYyBQb3dlcgotICogICAJCQkgCU1hbmFnZW1lbnQgQ29udHJvbGxlciBEcml2ZXIuCisgKiBNaXNjZWxsYW5lb3VzIElPQ1RMIGNvbW1hbmRzIGZvciBEeW5hbWljIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbGxlciBEcml2ZXIKKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlIEluYy4KICAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIKICAqLworCiAjaWZuZGVmIF9CTEFDS0ZJTl9EUE1DX0hfCiAjZGVmaW5lIF9CTEFDS0ZJTl9EUE1DX0hfCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZWFybHlfcHJpbnRrLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2Vhcmx5X3ByaW50ay5oCmluZGV4IDUzYTc2MmIuLjY4YTkxMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZWFybHlfcHJpbnRrLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lYXJseV9wcmludGsuaApAQCAtMSwyNyArMSwxMSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vZWFybHlfcHJpbnRrLmgKLSAqIEF1dGhvcjogICAgICAgUm9iaW4gR2V0eiA8cmdldHpAYmxhY2tmaW4udWNsaW51eC5vcmcKKyAqIGZ1bmN0aW9uIHByb3RvdHB5ZXMgZm9yIGVhcmx5IHByaW50awogICoKLSAqIENyZWF0ZWQ6ICAgICAgMTRBdWcyMDA3Ci0gKiBEZXNjcmlwdGlvbjogIGZ1bmN0aW9uIHByb3RvdHB5ZXMgZm9yIGVhcmx5IHByaW50aworICogQ29weXJpZ2h0IDIwMDctMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLQogI2lmbmRlZiBfX0FTTV9FQVJMWV9QUklOVEtfSF9fCiAjZGVmaW5lIF9fQVNNX0VBUkxZX1BSSU5US19IX18KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggYzgyM2U4ZS4uOGUwNzY0YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0xLDQgKzEsOCBAQAotLyogQ2hhbmdlcyBtYWRlIGJ5ICBMRyBTb2Z0IE9jdCAyMDA0Ki8KKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KIAogI2lmbmRlZiBfX0FTTUJGSU5fRUxGX0gKICNkZWZpbmUgX19BU01CRklOX0VMRl9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2VudHJ5LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2VudHJ5LmgKaW5kZXggNTViODA4Zi4uYTY4ODZmNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lbnRyeS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZW50cnkuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfX0JGSU5fRU5UUllfSAogI2RlZmluZSBfX0JGSU5fRU5UUllfSAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZjbnRsLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZjbnRsLmgKaW5kZXggOWM0MDM3MS4uODcyN2IyYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9mY250bC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZmNudGwuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfQkZJTl9GQ05UTF9ICiAjZGVmaW5lIF9CRklOX0ZDTlRMX0gKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9maXhlZF9jb2RlLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZpeGVkX2NvZGUuaAppbmRleCAzMmM0ZDQ5Li43M2ZlNTNlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZpeGVkX2NvZGUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZpeGVkX2NvZGUuaApAQCAtMSw1ICsxLDExIEBACi0vKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZml4ZWQgYWRkcmVzc2VzIHdoZXJlIHVzZXJzcGFjZSBwcm9ncmFtcyBjYW4gZmluZAotICAgYXRvbWljIGNvZGUgc2VxdWVuY2VzLiAgKi8KKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZml4ZWQgYWRkcmVzc2VzIHdoZXJlIHVzZXJzcGFjZSBwcm9ncmFtcworICogY2FuIGZpbmQgYXRvbWljIGNvZGUgc2VxdWVuY2VzLgorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLwogCiAjaWZuZGVmIF9fQkZJTl9BU01fRklYRURfQ09ERV9IX18KICNkZWZpbmUgX19CRklOX0FTTV9GSVhFRF9DT0RFX0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9mbGF0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZsYXQuaAppbmRleCA3MzNhMTc4Li5jMTMxNGM1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZsYXQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZsYXQuaApAQCAtMSw4ICsxLDkgQEAKIC8qCi0gKiBpbmNsdWRlL2FzbS1ibGFja2Zpbi9mbGF0LmggLS0gdUNsaW51eCBmbGF0LWZvcm1hdCBleGVjdXRhYmxlcworICogdUNsaW51eCBmbGF0LWZvcm1hdCBleGVjdXRhYmxlcwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMywKKyAqIENvcHlyaWdodCAyMDAzLTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMgogICovCiAKICNpZm5kZWYgX19CTEFDS0ZJTl9GTEFUX0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ncGlvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAppbmRleCBmZTEzOTYxLi41YjQ0ZDA1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaApAQCAtMSwzMCArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2dwaW8uaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CSBNaWNoYWVsIEhlbm5lcmljaCAoaGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnKQorICogQ29weXJpZ2h0IDIwMDYtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9fQVJDSF9CTEFDS0ZJTl9HUElPX0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9oYXJkaXJxLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCAwYjc4Yjg3Li5jMDc4ZGQ3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2hhcmRpcnEuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfX0JGSU5fSEFSRElSUV9ICiAjZGVmaW5lIF9fQkZJTl9IQVJESVJRX0gKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oCmluZGV4IDM3MDUzZWMuLmQxZjUwMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKICNpZm5kZWYgX0JGSU5fSU9fSAogI2RlZmluZSBfQkZJTl9JT19ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IDQyYTE1ZjUuLmU3YzA2MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaApAQCAtMSwxNyArMSwxMCBAQAogLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICAgMjAwMyBIdVRhbworICogICAgICAgICAgICAgICAgMjAwMiBBcmN0dXJ1cyBOZXR3b3JrcyBJbmMuICh3d3cuYXJjdHVydXNuZXR3b3Jrcy5jb20KKyAqICAgICAgICAgICAgICAgICAgICAgICBUZWQgTWEgPG1hdGVkQHN5bXBhdGljby5jYT4KICAqCi0gKiBDaGFuZ2VkIGJ5IEh1VGFvIEFwcjE4LCAyMDAzCi0gKgotICogQ29weXJpZ2h0IHdhcyBtaXNzaW5nIHdoZW4gSSBnb3QgdGhlIGNvZGUgc28gdG9vayBmcm9tIE1JUFMgYXJjaCAuLi5NYVRlZC0tLQotICogQ29weXJpZ2h0IChDKSAxOTk0IGJ5IFdhbGRvcmYgR01CSCwgd3JpdHRlbiBieSBSYWxmIEJhZWNobGUKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAsIDIwMDEgYnkgUmFsZiBCYWVjaGxlCi0gKgotICogQWRhcHRlZCBmb3IgQmxhY2tGaW4gKEFESSkgYnkgVGVkIE1hIDxtYXRlZEBzeW1wYXRpY28uY2E+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgQXJjdHVydXMgTmV0d29ya3MgSW5jLiAod3d3LmFyY3R1cnVzbmV0d29ya3MuY29tKQotICogQ29weXJpZ2h0IChjKSAyMDAyIExpbmVvLCBJbmMuIDxtYXR0d0BsaW5lby5jb20+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIKICAqLwogCiAjaWZuZGVmIF9CRklOX0lSUV9IXwpAQCAtMTksNiArMTIsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KIAorI2luY2x1ZGUgPG1hY2gvYW5vbWFseS5oPgorCiAvKiBTWVNfSVJRUyBhbmQgTlJfSVJRUyBhcmUgZGVmaW5lZCBpbiA8bWFjaC1iZjV4eC9pcnEuaD4gKi8KICNpbmNsdWRlIDxtYWNoL2lycS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycV9oYW5kbGVyLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycV9oYW5kbGVyLmgKaW5kZXggN2Q5ZTJkMy4uN2ZiZTQyMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnFfaGFuZGxlci5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxX2hhbmRsZXIuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfSVJRX0hBTkRMRVJfSAogI2RlZmluZSBfSVJRX0hBTkRMRVJfSAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmgKaW5kZXggNzlkYmVmYS4uYzg3ZTY4NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9sMWxheW91dC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbDFsYXlvdXQuaApAQCAtMSw2ICsxLDkgQEAKIC8qCi0gKiBsMWxheW91dC5oCiAgKiBEZWZpbmVzIGEgbGF5b3V0IG9mIEwxIHNjcmF0Y2hwYWQgbWVtb3J5IHRoYXQgdXNlcnNwYWNlIGNhbiByZWx5IG9uLgorICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9MMUxBWU9VVF9IXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9saW5rYWdlLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2xpbmthZ2UuaAppbmRleCA1YTgyMmJiLi5mN2Q2ZDQ3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2xpbmthZ2UuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2xpbmthZ2UuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfX0FTTV9MSU5LQUdFX0gKICNkZWZpbmUgX19BU01fTElOS0FHRV9ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdS5oCmluZGV4IGRiZmQ2ODYuLjI2ZjZiNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbXUuaApAQCAtMSw4ICsxLDEzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgICAyMDAyIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKICNpZm5kZWYgX19NTVVfSAogI2RlZmluZSBfX01NVV9ICiAKLS8qIENvcHlyaWdodCAoQykgMjAwMiwgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4gKi8KLQogc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QgewogCXN0cnVjdCBzcmFtX2xpc3Rfc3RydWN0ICpuZXh0OwogCXZvaWQgKmFkZHI7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggMDQwNDEwYi4uNGEzYmUzNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMSwzMCArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tbXVfY29udGV4dC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfX0JMQUNLRklOX01NVV9DT05URVhUX0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5kZXggZTMxMjhkZi4uOWMxY2ZmZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tb2R1bGUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC0xLDMgKzEsOSBAQAorLyoKK8KgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KK8KgKgorwqAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KK8KgKi8KKwogI2lmbmRlZiBfQVNNX0JGSU5fTU9EVUxFX0gKICNkZWZpbmUgX0FTTV9CRklOX01PRFVMRV9ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXguaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXguaAppbmRleCA1Y2M2NDFjLi5mNzI2ZTNhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC5oCkBAIC00LDYgKzQsMTAgQEAKICAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYwogICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYwogICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9BU01fTVVURVhfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9uYW5kLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL25hbmQuaAppbmRleCBhZmJhYWZhLi4zYWU4YjU2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL25hbmQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL25hbmQuaApAQCAtMSwxMyArMSw5IEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1ibGFja2Zpbi9uYW5kLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQW5hbG9nIERldmljZXMsIEluYy4KLSAqCUJyeWFuIFd1IDxicnlhbi53dUBhbmFsb2cuY29tPgotICoKKy8qCiAgKiBCRjVYWCAtIE5BTkQgZmxhc2ggY29udHJvbGxlciBwbGF0ZnJvbV9kZXZpY2UgaW5mbwogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yCiAgKi8KIAogLyogc3RydWN0IGJmNXh4X25hbmRfcGxhdGZvcm0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggMjlkY2Y3NS4uOTQ0YTA3YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTEsMyArMSw5IEBACisvKgorwqAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorwqAqCivCoCogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorwqAqLworCiAjaWZuZGVmIF9CTEFDS0ZJTl9QQUdFX0gKICNkZWZpbmUgX0JMQUNLRklOX1BBR0VfSAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BhZ2Vfb2Zmc2V0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BhZ2Vfb2Zmc2V0LmgKaW5kZXggY2JhZmYyNC4uZDA2YTg5YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGFnZV9vZmZzZXQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BhZ2Vfb2Zmc2V0LmgKQEAgLTEsNSArMSwxMCBAQAotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIG1lbW9yeSBtYXAuLiAqLworLyoKKyAqIFRoaXMgaGFuZGxlcyB0aGUgbWVtb3J5IG1hcAorICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLwogCiAjaWZkZWYgQ09ORklHX0JMQUNLRklOCiAjZGVmaW5lIFBBR0VfT0ZGU0VUX1JBVwkJMHgwMDAwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZGEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGRhLmgKaW5kZXggYTZmOTU2OS4uZDQ5YmIyNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZGEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BkYS5oCkBAIC0xLDIzICsxLDggQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGRhLmgKLSAqIEF1dGhvcjogICAgICAgUGhpbGlwcGUgR2VydW0gPHJwbUB4ZW5vbWFpLm9yZz4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICAgICAgICAgICAgUGhpbGlwcGUgR2VydW0gPHJwbUB4ZW5vbWFpLm9yZz4KICAqCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQVNNX0JMQUNLRklOX1BEQV9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IDc4M2M4ZjcuLjgyMWM2OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCiAjaWZuZGVmIF9CTEFDS0ZJTl9QR1RBQkxFX0gKICNkZWZpbmUgX0JMQUNLRklOX1BHVEFCTEVfSAogCkBAIC05Miw2ICs5OCwxMiBAQAogI2RlZmluZQlWTUFMTE9DX1NUQVJUCTAKICNkZWZpbmUJVk1BTExPQ19FTkQJMHhmZmZmZmZmZgogCisvKiBwcm92aWRlIGEgc3BlY2lhbCBnZXRfdW5tYXBwZWRfYXJlYSBmb3IgZnJhbWVidWZmZXIgbW1hcHMgb2Ygbm9tbXUgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGdldF9mYl91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJCQkJCSAgdW5zaWduZWQgbG9uZyk7CisjZGVmaW5lIEhBVkVfQVJDSF9GQl9VTk1BUFBFRF9BUkVBCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CiAKICNlbmRpZgkJCQkvKiBfQkxBQ0tGSU5fUEdUQUJMRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BvbGwuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcG9sbC5oCmluZGV4IGEwNTU2NjcuLjA3MmQ4OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcG9sbC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcG9sbC5oCkBAIC0xLDMgKzEsMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKgorICovCisKICNpZm5kZWYgX19CRklOX1BPTExfSAogI2RlZmluZSBfX0JGSU5fUE9MTF9ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcG9ydG11eC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wb3J0bXV4LmgKaW5kZXggODhlYjVjMC4uZWRkOGVmMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wb3J0bXV4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wb3J0bXV4LmgKQEAgLTEsNiArMSw5IEBACiAvKgotICogQ29tbW9uIGhlYWRlciBmaWxlIGZvciBibGFja2ZpbiBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KKyAqIENvbW1vbiBoZWFkZXIgZmlsZSBmb3IgQmxhY2tmaW4gZmFtaWx5IG9mIHByb2Nlc3NvcnMKICAqCivCoCogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCivCoCoKK8KgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfUE9SVE1VWF9IXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCmluZGV4IDgwYzlkNjQuLjQxYmMxODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKICNpZm5kZWYgX19BUkNIX0JGSU5fUE9TSVhfVFlQRVNfSAogI2RlZmluZSBfX0FSQ0hfQkZJTl9QT1NJWF9UWVBFU19ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IGEzNmFkOGQuLmFlYTg4MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfX0FTTV9CRklOX1BST0NFU1NPUl9ICiAjZGVmaW5lIF9fQVNNX0JGSU5fUFJPQ0VTU09SX0gKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggZTNmMDg2ZC4uMjcyOTBjOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCiAjaWZuZGVmIF9CRklOX1BUUkFDRV9ICiAjZGVmaW5lIF9CRklOX1BUUkFDRV9ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VjdGlvbnMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VjdGlvbnMuaAppbmRleCBhZTRkYWUxLi4xZjUzODFmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCkBAIC0xLDMgKzEsOSBAQAorLyoKK8KgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KK8KgKgorwqAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KK8KgKi8KKwogI2lmbmRlZiBfQkxBQ0tGSU5fU0VDVElPTlNfSAogI2RlZmluZSBfQkxBQ0tGSU5fU0VDVElPTlNfSAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlZ21lbnQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VnbWVudC5oCmluZGV4IDAyY2ZkMDkuLmY4ZTE5ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VnbWVudC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VnbWVudC5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCiAjaWZuZGVmIF9CRklOX1NFR01FTlRfSAogI2RlZmluZSBfQkZJTl9TRUdNRU5UX0gKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaAppbmRleCBjZTAwYjAzLi5jZTQwODFhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApAQCAtMSwzICsxLDkgQEAKKy8qCivCoCogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCivCoCoKK8KgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCivCoCovCisKICNpZm5kZWYgX0FTTV9CTEFDS0ZJTl9TSUdDT05URVhUX0gKICNkZWZpbmUgX0FTTV9CTEFDS0ZJTl9TSUdDT05URVhUX0gKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zaWdpbmZvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NpZ2luZm8uaAppbmRleCBlY2E0NTY1Li4zZTgxMzA2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NpZ2luZm8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NpZ2luZm8uaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfQkZJTl9TSUdJTkZPX0gKICNkZWZpbmUgX0JGSU5fU0lHSU5GT19ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IDExOGRlZWUuLjZhMGZlOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMSwyMyArMSw4IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NtcC5oCi0gKiBBdXRob3I6ICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgogICoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9fQVNNX0JMQUNLRklOX1NNUF9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggZDZmZjRiNS4uYjBjN2YwZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaApAQCAtMSwzICsxLDkgQEAKKy8qCivCoCogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCivCoCoKK8KgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCivCoCovCisKICNpZm5kZWYgX19CRklOX1NQSU5MT0NLX0gKICNkZWZpbmUgX19CRklOX1NQSU5MT0NLX0gKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCmluZGV4IGIxZTNjNGMuLmJlNzU3NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCiAjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKICNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N0YXQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3RhdC5oCmluZGV4IGQyYjZmMTEuLjJlMjc2NjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3RhdC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3RhdC5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCiAjaWZuZGVmIF9CRklOX1NUQVRfSAogI2RlZmluZSBfQkZJTl9TVEFUX0gKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zdHJpbmcuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3RyaW5nLmgKaW5kZXggMzIxZjRkOS4uZDdmMGNjYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zdHJpbmcuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N0cmluZy5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCiAjaWZuZGVmIF9CTEFDS0ZJTl9TVFJJTkdfSF8KICNkZWZpbmUgX0JMQUNLRklOX1NUUklOR19IXwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3dhYi5oCmluZGV4IGQ0NDIxMTMuLjg5ZGU2NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3dhYi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfQkxBQ0tGSU5fU1dBQl9ICiAjZGVmaW5lIF9CTEFDS0ZJTl9TV0FCX0gKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3lzdGVtLmgKaW5kZXggODVlOGYxNi4uZGRlMTliMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0xLDM0ICsxLDggQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgaW5jbHVkZS9hc20vc3lzdGVtLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgIFRvbnkgS291ICh0b255a29AbGluZW8uY2EpCi0gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyIEFyY3R1cnVzIE5ldHdvcmtzIEluYy4KLSAqICAgICAgICAgICAgICAgICAgICAod3d3LmFyY3R1cnVzbmV0d29ya3MuY29tKQotICogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMyBNZXRyb3dlcmtzICh3d3cubWV0cm93ZXJrcy5jb20pCi0gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IEFuYWxvZyBEZXZpY2UgSW5jLgotICogQ3JlYXRlZDogICAgIDI1SmFuMjAwMSAtIFRvbnkgS291Ci0gKiBEZXNjcmlwdGlvbjogc3lzdGVtLmggaW5jbHVkZSBmaWxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAgICAgVG9ueSBLb3UgKHRvbnlrb0BsaW5lby5jYSkKICAqCi0gKiBNb2RpZmllZDogICAgIDIyU2VwMjAwNiAtIFJvYmluIEdldHoKLSAqICAgICAgICAgICAgICAgIC0gbW92ZSBpbmNsdWRlIGJsYWNrZmluLmggZG93biwgc28gSSBjYW4gZ2V0IGFjY2VzcyB0bwotICogICAgICAgICAgICAgICAgICAgaXJxIGZ1bmN0aW9ucyBpbiBvdGhlciBpbmNsdWRlIGZpbGVzLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2lmbmRlZiBfQkxBQ0tGSU5fU1lTVEVNX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCAyYmJmZGQ5Li5hZmIzYTg2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xLDI3ICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL3RocmVhZF9pbmZvLmgKLSAqIEJhc2VkIG9uOiAgICAgaW5jbHVkZS9hc20tbTY4a25vbW11L3RocmVhZF9pbmZvLmgKLSAqIEF1dGhvcjogICAgICAgTEcgU29mdCBJbmRpYQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKiBDcmVhdGVkOiAgICAgIFR1ZSBTZXAgMjEgMjAwNAotICogRGVzY3JpcHRpb246ICBCbGFja2ZpbiBsb3ctbGV2ZWwgdGhyZWFkIGluZm9ybWF0aW9uCi0gKiBNb2RpZmllZDoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQVNNX1RIUkVBRF9JTkZPX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGxiLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RsYi5oCmluZGV4IDg5YTEyZWUuLmE3NGFlMDggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGxiLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90bGIuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfQkxBQ0tGSU5fVExCX0gKICNkZWZpbmUgX0JMQUNLRklOX1RMQl9ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdHJhY2UuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdHJhY2UuaAppbmRleCAzMTJiNTk2Li42MDlhZDNjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RyYWNlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90cmFjZS5oCkBAIC0xLDYgKzEsOSBAQAogLyoKLSAqIENvbW1vbiBoZWFkZXIgZmlsZSBmb3IgYmxhY2tmaW4gZmFtaWx5IG9mIHByb2Nlc3NvcnMuCisgKiBoZWFkZXIgZmlsZSBmb3IgaGFyZHdhcmUgdHJhY2UgZnVuY3Rpb25zCiAgKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX0JMQUNLRklOX1RSQUNFXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90cmFwcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90cmFwcy5oCmluZGV4IDNjZGM0NTQuLjlmZTBkYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdHJhcHMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTEsMTMgKzEsMTAgQEAKIC8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20vdHJhcHMuaAorICogIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICAgIDIwMDEgTGluZW8sIEluYworICogICAgICAgICAgICAgICAgICAgICAgICBUb255IEtvdQorICogICAgICAgICAgICAgICAgIDE5OTMgSGFtaXNoIE1hY2RvbmFsZAogICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTMgICAgICAgIEhhbWlzaCBNYWNkb25hbGQKLSAqCi0gKiAgTGluZW8sIEluYyAgICBKdWwgMjAwMSAgICBUb255IEtvdQotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMgogICovCiAKICNpZm5kZWYgX0JGSU5fVFJBUFNfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAyZjQ2OWExLi5jMDNiODUzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMSw0ICsxLDcgQEAKLS8qIENoYW5nZXMgbWFkZSBieSBMaW5lbyBJbmMuICAgIE1heSAyMDAxCisvKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICoKICAqIEJhc2VkIG9uOiBpbmNsdWRlL2FzbS1tNjhrbm9tbXUvdWFjY2Vzcy5oCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDAyYjE1MjkuLjc3OWJlMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKwogI2lmbmRlZiBfX0FTTV9CRklOX1VOSVNURF9ICiAjZGVmaW5lIF9fQVNNX0JGSU5fVU5JU1REX0gKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCBmMDVkMWI5Li5iZDMyYzA5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTEsMzAgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBnZW5lcmF0ZSBkZWZpbml0aW9ucyBuZWVkZWQgYnkgYXNzZW1ibHkgbGFuZ3VhZ2UgbW9kdWxlcwogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIGdlbmVyYXRlIGRlZmluaXRpb25zIG5lZWRlZCBieSBhc3NlbWJseSBsYW5ndWFnZSBtb2R1bGVzLgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2RtYV81eHguYwppbmRleCAzODQ4NjhkLi4xZjE3MDIxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2RtYV81eHguYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2RtYV81eHguYwpAQCAtMiw2ICsyLDcgQEAKICAqIGJmaW5fZG1hXzV4eC5jIC0gQmxhY2tmaW4gRE1BIGltcGxlbWVudGF0aW9uCiAgKgogICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKaW5kZXggZmM0NjgxYy4uMjI3MDVlZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKQEAgLTEsMzAgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBNaWNoYWVsIEhlbm5lcmljaCAoaGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnKQorICogR1BJTyBBYnN0cmFjdGlvbiBMYXllcgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIEdQSU8gQWJzdHJhY3Rpb24gTGF5ZXIKKyAqIENvcHlyaWdodCAyMDA2LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbml0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5pdC5jCmluZGV4IDM2MTkzZWUuLmY3YjljZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbml0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYwpAQCAtMSwyNSArMSwxMSBAQAogLyoKICAqIEJsYWNrZmluIENQTEIgaW5pdGlhbGl6YXRpb24KICAqCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxibWdyLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxibWdyLmMKaW5kZXggOGUxZTllOS4uNjllMGU1MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYm1nci5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJtZ3IuYwpAQCAtMSwyMiArMSwxMSBAQAogLyoKLSAqICAgICAgICAgICAgICAgQmxhY2tmaW4gQ1BMQiBleGNlcHRpb24gaGFuZGxpbmcuCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICogQmxhY2tmaW4gQ1BMQiBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHdoZW4gTVBVIGluIG9uCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYwppbmRleCA1ZDhhZDUwLi5mZDlhMmYzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5pdC5jCkBAIC0xLDI0ICsxLDkgQEAKIC8qCiAgKiBCbGFja2ZpbiBDUExCIGluaXRpYWxpemF0aW9uCiAgKgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLmMKaW5kZXggZDllYTQ2Yy4uNWI4ODg2MSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLmMKQEAgLTEsMjYgKzEsMTQgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUtYy9jcGxibWdyLmMKICAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYm1nci5jCiAgKiBBdXRob3I6ICAgICAgIE1pY2hhZWwgTWNUZXJuYW4gPG1tY3Rlcm5hbkBhaXJ2YW5hLmNvbT4KICAqCi0gKiBDcmVhdGVkOiAgICAgIDAxTm92MjAwOAogICogRGVzY3JpcHRpb246ICBDUExCIG1pc3MgaGFuZGxlci4KICAqCiAgKiBNb2RpZmllZDoKICAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDggQWlydmFuYSBJbmMuCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGJpbmZvLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiaW5mby5jCmluZGV4IDY0ZDc4MzAuLjBiZGFhNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGJpbmZvLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYmluZm8uYwpAQCAtMiw2ICsyLDcgQEAKICAqIGFyY2gvYmxhY2tmaW4va2VybmVsL2NwbGJpbmZvLmMgLSBkaXNwbGF5IENQTEIgc3RhdHVzCiAgKgogICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKQEAgLTExMSwyNCArMTEyLDIxIEBACiAJLnNob3cgID0gY3BsYmluZm9fc2hvdywKIH07CiAKKyNkZWZpbmUgQ1BMQklORk9fRENQTEJfRkxBRyAweDgwMDAwMDAwCisKIHN0YXRpYyBpbnQgY3BsYmluZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQljaGFyIGJ1ZlsyNTZdLCAqcGF0aCwgKnA7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJY2hhciBjcGxiX3R5cGU7CiAJdW5zaWduZWQgaW50IGNwdTsKLQljaGFyICpzX2NwdSwgKnNfY3BsYjsKIAlpbnQgcmV0OwogCXN0cnVjdCBzZXFfZmlsZSAqbTsKIAlzdHJ1Y3QgY3BsYmluZm9fZGF0YSAqY2RhdGE7CiAKLQlwYXRoID0gZF9wYXRoKCZmaWxlLT5mX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChJU19FUlIocGF0aCkpCi0JCXJldHVybiBQVFJfRVJSKHBhdGgpOwotCXNfY3B1ID0gc3Ryc3RyKHBhdGgsICIvY3B1Iik7Ci0Jc19jcGxiID0gc3RycmNocihwYXRoLCAnLycpOwotCWlmICghc19jcHUgfHwgIXNfY3BsYikKLQkJcmV0dXJuIC1FSU5WQUw7CisJY3B1ID0gKHVuc2lnbmVkIGludClwZGUtPmRhdGE7CisJY3BsYl90eXBlID0gY3B1ICYgQ1BMQklORk9fRENQTEJfRkxBRyA/ICdEJyA6ICdJJzsKKwljcHUgJj0gfkNQTEJJTkZPX0RDUExCX0ZMQUc7CiAKLQljcHUgPSBzaW1wbGVfc3RydG91bChzX2NwdSArIDQsICZwLCAxMCk7CiAJaWYgKCFjcHVfb25saW5lKGNwdSkpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xMzksNyArMTM3LDcgQEAKIAljZGF0YSA9IG0tPnByaXZhdGU7CiAKIAljZGF0YS0+cG9zID0gMDsKLQljZGF0YS0+Y3BsYl90eXBlID0gdG91cHBlcihzX2NwbGJbMV0pOworCWNkYXRhLT5jcGxiX3R5cGUgPSBjcGxiX3R5cGU7CiAJY3BsYmluZm9fc2VxX2luaXQoY2RhdGEsIGNwdSk7CiAKIAlyZXR1cm4gMDsKQEAgLTE2OCw4ICsxNjYsMTAgQEAKIAkJaWYgKCFjcHVfZGlyKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJcHJvY19jcmVhdGUoImljcGxiIiwgU19JUlVHTywgY3B1X2RpciwgJmNwbGJpbmZvX2ZvcHMpOwotCQlwcm9jX2NyZWF0ZSgiZGNwbGIiLCBTX0lSVUdPLCBjcHVfZGlyLCAmY3BsYmluZm9fZm9wcyk7CisJCXByb2NfY3JlYXRlX2RhdGEoImljcGxiIiwgU19JUlVHTywgY3B1X2RpciwgJmNwbGJpbmZvX2ZvcHMsCisJCQkodm9pZCAqKWNwdSk7CisJCXByb2NfY3JlYXRlX2RhdGEoImRjcGxiIiwgU19JUlVHTywgY3B1X2RpciwgJmNwbGJpbmZvX2ZvcHMsCisJCQkodm9pZCAqKShjcHUgfCBDUExCSU5GT19EQ1BMQl9GTEFHKSk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9kbWEtbWFwcGluZy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZG1hLW1hcHBpbmcuYwppbmRleCAyZjYyYTlmLi5lNzRlNzRkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9kbWEtbWFwcGluZy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2RtYS1tYXBwaW5nLmMKQEAgLTEsMzAgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvZG1hLW1hcHBpbmcuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBEeW5hbWljIERNQSBtYXBwaW5nIHN1cHBvcnQKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBEeW5hbWljIERNQSBtYXBwaW5nIHN1cHBvcnQuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZWFybHlfcHJpbnRrLmMKaW5kZXggOTMxYzc4Yi4uODRlZDgzNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZWFybHlfcHJpbnRrLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZWFybHlfcHJpbnRrLmMKQEAgLTEsMjUgKzEsMTAgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCi0gKiBCYXNlZCBvbjogICAgIGFyY2gveDg2XzY0L2tlcm5lbC9lYXJseV9wcmludGsuYwotICogQXV0aG9yOiAgICAgICBSb2JpbiBHZXR6IDxyZ2V0ekBibGFja2Zpbi51Y2xpbnV4Lm9yZworICogYWxsb3cgYSBjb25zb2xlIHRvIGJlIHVzZWQgZm9yIGVhcmx5IHByaW50aworICogZGVyaXZlZCBmcm9tIGFyY2gveDg2L2tlcm5lbC9lYXJseV9wcmludGsuYwogICoKLSAqIENyZWF0ZWQ6ICAgICAgMTRBdWcyMDA3Ci0gKiBEZXNjcmlwdGlvbjogIGFsbG93IGEgY29uc29sZSB0byBiZSB1c2VkIGZvciBlYXJseSBwcmludGsKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2VudHJ5LlMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9lbnRyeS5TCmluZGV4IDNmODc2OWIuLmYyN2RjMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZW50cnkuUwpAQCAtMSwzMCArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9lbnRyeS5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZml4ZWRfY29kZS5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZml4ZWRfY29kZS5TCmluZGV4IDBkMmQ5ZTAuLjA1NjU5MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2ZpeGVkX2NvZGUuUworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9maXhlZF9jb2RlLlMKQEAgLTYsNyArNiwxMiBAQAogICogVGhlc2UgYXJlIGFsaWduZWQgdG8gMTYgYnl0ZXMsIHNvIHRoYXQgd2UgaGF2ZSBzb21lIHNwYWNlIHRvIHJlcGxhY2UKICAqIHRoZXNlIHNlcXVlbmNlcyB3aXRoIHNvbWV0aGluZyBlbHNlIChlLmcuIGtlcm5lbCB0cmFwcyBpZiB3ZSBldmVyIGRvCiAgKiBCRjU2MSBTTVApLgorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLworCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2ZsYXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2ZsYXQuYwppbmRleCBkMTg4YjI0Li5hODhkYWRkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9mbGF0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZmxhdC5jCkBAIC0xLDIxICsxLDcgQEAKIC8qCi0gKiAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvZmxhdC5jCisgKiBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNyBBbmFsb2cgRGV2aWNlcywgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2luaXRfdGFzay5jCmluZGV4IGMyNmMzNGQuLjExOGM1YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2luaXRfdGFzay5jCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2luaXRfdGFzay5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2lycWNoaXAuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2lycWNoaXAuYwppbmRleCA0YjVmZDM2Li5kYjlmOWM5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcnFjaGlwLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaXJxY2hpcC5jCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2lycWNoaXAuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jCmluZGV4IDY3ZmM3YTUuLmE2ZGZhNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjZGVmaW5lIHByX2ZtdChmbXQpICJtb2R1bGUgJXM6ICIgZm10CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZjViMjg2MS4uNDMwYWUzOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQmxhY2tmaW4gYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwcm9jZXNzIGhhbmRsaW5nCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgQmxhY2tmaW4gYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwcm9jZXNzIGhhbmRsaW5nLgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYwppbmRleCAzMGY0ODI4Li4wOTgyYjVkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYwpAQCAtMSwzMCArMSw4IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYwotICogQmFzZWQgb246ICAgICBUYWtlbiBmcm9tIGxpbnV4L2tlcm5lbC9wdHJhY2UuYwotICogQXV0aG9yOiAgICAgICBsaW51eC9rZXJuZWwvcHRyYWNlLmMgaXMgYnkgUm9zcyBCaXJvIDEvMjMvOTIsIGVkaXRlZCBieSBMaW51cyBUb3J2YWxkcworICogbGludXgva2VybmVsL3B0cmFjZS5jIGlzIGJ5IFJvc3MgQmlybyAxLzIzLzkyLCBlZGl0ZWQgYnkgTGludXMgVG9ydmFsZHMKKyAqIHRoZXNlIG1vZGlmaWNhdGlvbnMgYXJlIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6ICAgICAgMS8yMy85MgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKaW5kZXggMzY5NTM1Yi4uYzIwMmE0NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCkBAIC0xLDkgKzEsNSBAQAogLyoKLSAqIGFyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2hhZG93X2NvbnNvbGUuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3NoYWRvd19jb25zb2xlLmMKaW5kZXggOGI4YzcxMC4uNTU3ZTlmZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2hhZG93X2NvbnNvbGUuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zaGFkb3dfY29uc29sZS5jCkBAIC00LDggKzQsNiBAQAogICoKICAqIENvcHlyaWdodCAyMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zaWduYWwuYwppbmRleCBkYmMzYmJmLi45ZDkwYzE4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zaWduYWwuYwpAQCAtMSwzMCArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9zaWduYWwuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc3lzX2JmaW4uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3N5c19iZmluLmMKaW5kZXggM2RhNjBmYi4uYWZjZWYxMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc3lzX2JmaW4uYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zeXNfYmZpbi5jCkBAIC0xLDMyICsxLDEwIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9zeXNfYmZpbi5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIGNvbnRhaW5zIHZhcmlvdXMgcmFuZG9tIHN5c3RlbSBjYWxscyB0aGF0IGhhdmUgYSBub24tc3RhbmRhcmQKKyAqIGNhbGxpbmcgc2VxdWVuY2Ugb24gdGhlIExpbnV4L0JsYWNrZmluIHBsYXRmb3JtLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB2YXJpb3VzIHJhbmRvbSBzeXN0ZW0gY2FsbHMgdGhhdAotICogICAgICAgICAgICAgICBoYXZlIGEgbm9uLXN0YW5kYXJkIGNhbGxpbmcgc2VxdWVuY2Ugb24gdGhlIExpbnV4L2JmaW4KLSAqICAgICAgICAgICAgICAgcGxhdGZvcm0uCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTkxLDMgKzY5LDE0IEBACiB7CiAJcmV0dXJuIHNhZmVfZG1hX21lbWNweShkZXN0LCBzcmMsIGxlbik7CiB9CisKKyNpZiBkZWZpbmVkKENPTkZJR19GQikgfHwgZGVmaW5lZChDT05GSUdfRkJfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Cit1bnNpZ25lZCBsb25nIGdldF9mYl91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIG9yaWdfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwZ29mZiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpaW5mby0+c2NyZWVuX2Jhc2U7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9mYl91bm1hcHBlZF9hcmVhKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS10cy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS10cy5jCmluZGV4IGY5NzE1NzYuLjM1OWNmYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUtdHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLXRzLmMKQEAgLTEsMTMgKzEsMTMgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2tlcm5lbC90aW1lLXRzLmMKLSAqCiAgKiBCYXNlZCBvbiBhcm0gY2xvY2tldmVudHMgaW1wbGVtZW50YXRpb24gYW5kIG9sZCBiZmluIHRpbWUgdGljay4KICAqCi0gKiBDb3B5cmlnaHQoQykgMjAwOCwgR2VvVGVjaG5vbG9naWVzLCBWaXRqYSBNYWthcm92CisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY3MgSW5jLgorICogICAgICAgICAgICAgICAgMjAwOCBHZW9UZWNobm9sb2dpZXMKKyAqICAgICAgICAgICAgICAgICAgICAgVml0amEgTWFrYXJvdgogICoKLSAqIFRoaXMgY29kZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgR1BMIHZlcnNpb24gMi4gRm9yIGRldGFpbHMgc2VlCi0gKiBrZXJuZWwtYmFzZS9DT1BZSU5HLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUuYwppbmRleCBhZGI1NGFhLi5iZDNiNTNkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CkBAIC04MSwxMSArODIsMTEgQEAKICNlbmRpZgogfQogCisjaWZkZWYgQ09ORklHX0FSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCiAvKgogICogU2hvdWxkIHJldHVybiB1c2Vjb25kcyBzaW5jZSBsYXN0IHRpbWVyIHRpY2sKICAqLwotI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2Zmc2V0KHZvaWQpCit1MzIgYXJjaF9nZXR0aW1lb2Zmc2V0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBjbG9ja3NfcGVyX2ppZmZ5OwpAQCAtMTg0LDY1ICsxODUsNiBAQAogCXRpbWVfc2NoZWRfaW5pdCh0aW1lcl9pbnRlcnJ1cHQpOwogfQogCi0jaWZuZGVmIENPTkZJR19HRU5FUklDX1RJTUUKLXZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgc2VxOwotCXVuc2lnbmVkIGxvbmcgdXNlYywgc2VjOwotCi0JZG8gewotCQlzZXEgPSByZWFkX3NlcWJlZ2luX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKLQkJdXNlYyA9IGdldHRpbWVvZmZzZXQoKTsKLQkJc2VjID0geHRpbWUudHZfc2VjOwotCQl1c2VjICs9ICh4dGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQyk7Ci0JfQotCXdoaWxlIChyZWFkX3NlcXJldHJ5X2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIHNlcSwgZmxhZ3MpKTsKLQotCXdoaWxlICh1c2VjID49IFVTRUNfUEVSX1NFQykgewotCQl1c2VjIC09IFVTRUNfUEVSX1NFQzsKLQkJc2VjKys7Ci0JfQotCi0JdHYtPnR2X3NlYyA9IHNlYzsKLQl0di0+dHZfdXNlYyA9IHVzZWM7Ci19Ci1FWFBPUlRfU1lNQk9MKGRvX2dldHRpbWVvZmRheSk7Ci0KLWludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKLXsKLQl0aW1lX3Qgd3RtX3NlYywgc2VjID0gdHYtPnR2X3NlYzsKLQlsb25nIHd0bV9uc2VjLCBuc2VjID0gdHYtPnR2X25zZWM7Ci0KLQlpZiAoKHVuc2lnbmVkIGxvbmcpdHYtPnR2X25zZWMgPj0gTlNFQ19QRVJfU0VDKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKLQkvKgotCSAqIFRoaXMgaXMgcmV2b2x0aW5nLiBXZSBuZWVkIHRvIHNldCB0aGUgeHRpbWUudHZfdXNlYwotCSAqIGNvcnJlY3RseS4gSG93ZXZlciwgdGhlIHZhbHVlIGluIHRoaXMgbG9jYXRpb24gaXMKLQkgKiBpcyB2YWx1ZSBhdCB0aGUgbGFzdCB0aWNrLgotCSAqIERpc2NvdmVyIHdoYXQgY29ycmVjdGlvbiBnZXR0aW1lb2ZkYXkKLQkgKiB3b3VsZCBoYXZlIGRvbmUsIGFuZCB0aGVuIHVuZG8gaXQhCi0JICovCi0JbnNlYyAtPSAoZ2V0dGltZW9mZnNldCgpICogTlNFQ19QRVJfVVNFQyk7Ci0KLQl3dG1fc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfc2VjICsgKHh0aW1lLnR2X3NlYyAtIHNlYyk7Ci0Jd3RtX25zZWMgPSB3YWxsX3RvX21vbm90b25pYy50dl9uc2VjICsgKHh0aW1lLnR2X25zZWMgLSBuc2VjKTsKLQotCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKLQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKLQotCW50cF9jbGVhcigpOwotCi0Jd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7Ci0JY2xvY2tfd2FzX3NldCgpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGRvX3NldHRpbWVvZmRheSk7Ci0jZW5kaWYgLyogIUNPTkZJR19HRU5FUklDX1RJTUUgKi8KLQogLyoKICAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW1lIGluIG5hbm9zZWMgdW5pdHMuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCmluZGV4IDU2NDY0Y2IuLjZiNzMyNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYwpAQCAtMSwzMCArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgSGFtaXNoIE1hY2RvbmFsZAorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgdXNlcyBTL1cgaW50ZXJydXB0IDE1IGZvciB0aGUgc3lzdGVtIGNhbGxzCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggMjFhYzdjMi4uMTBlMTI1MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMKLSAqIEJhc2VkIG9uOiAgICAgbm9uZSAtIG9yaWdpbmFsIHdvcmsKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6ICAgICAgVHVlIFNlcCAyMSAyMDA0Ci0gKiBEZXNjcmlwdGlvbjogIE1hc3RlciBsaW5rZXIgc2NyaXB0IGZvciBibGFja2ZpbiBhcmNoaXRlY3R1cmUKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjZGVmaW5lIFZNTElOVVhfU1lNQk9MKF9zeW1fKSBfIyNfc3ltXwpAQCAtOTYsOCArNzMsNyBAQAogCXsKIAkJX19zZGF0YSA9IC47CiAJCS8qIFRoaXMgZ2V0cyBkb25lIGZpcnN0LCBzbyB0aGUgZ2xvYiBkb2Vzbid0IHN1Y2sgaXQgaW4gKi8KLQkJLiA9IEFMSUdOKDMyKTsKLQkJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKKwkJQ0FDSEVMSU5FX0FMSUdORURfREFUQSgzMikKIAogI2lmICFMMV9EQVRBX0FfTEVOR1RICiAJCS4gPSBBTElHTigzMik7CkBAIC0xMTYsMTIgKzkyLDcgQEAKIAkJREFUQV9EQVRBCiAJCUNPTlNUUlVDVE9SUwogCi0JCS8qIG1ha2Ugc3VyZSB0aGUgaW5pdF90YXNrIGlzIGFsaWduZWQgdG8gdGhlCi0JCSAqIGtlcm5lbCB0aHJlYWQgc2l6ZSBzbyB3ZSBjYW4gbG9jYXRlIHRoZSBrZXJuZWwKLQkJICogc3RhY2sgcHJvcGVybHkgYW5kIHF1aWNrbHkuCi0JCSAqLwotCQkuID0gQUxJR04oVEhSRUFEX1NJWkUpOwotCQkqKC5pbml0X3Rhc2suZGF0YSkKKwkJSU5JVF9UQVNLX0RBVEEoVEhSRUFEX1NJWkUpCiAKIAkJX19lZGF0YSA9IC47CiAJfQpAQCAtMTM0LDM5ICsxMDUsMTAgQEAKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfX19pbml0X2JlZ2luID0gLjsKIAotCS5pbml0LnRleHQgOgotCXsKLQkJLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JCV9fc2luaXR0ZXh0ID0gLjsKLQkJSU5JVF9URVhUCi0JCV9fZWluaXR0ZXh0ID0gLjsKLQl9Ci0JLmluaXQuZGF0YSA6Ci0JewotCQkuID0gQUxJR04oMTYpOwotCQlJTklUX0RBVEEKLQl9Ci0JLmluaXQuc2V0dXAgOgotCXsKLQkJLiA9IEFMSUdOKDE2KTsKLQkJX19fc2V0dXBfc3RhcnQgPSAuOwotCQkqKC5pbml0LnNldHVwKQotCQlfX19zZXR1cF9lbmQgPSAuOwotCX0KLQkuaW5pdGNhbGwuaW5pdCA6Ci0JewotCQlfX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JCUlOSVRDQUxMUwotCQlfX19pbml0Y2FsbF9lbmQgPSAuOwotCX0KLQkuY29uX2luaXRjYWxsLmluaXQgOgotCXsKLQkJX19fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJKiguY29uX2luaXRjYWxsLmluaXQpCi0JCV9fX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwotCX0KKwlJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCisJLiA9IEFMSUdOKDE2KTsKKwlJTklUX0RBVEFfU0VDVElPTigxNikKIAlQRVJDUFUoNCkKLQlTRUNVUklUWV9JTklUCiAKIAkvKiB3ZSBoYXZlIHRvIGRpc2NhcmQgZXhpdCB0ZXh0IGFuZCBzdWNoIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvCiAJICogaGFuZGxlIGVtYmVkZGVkIGNyb3NzLXNlY3Rpb24gcmVmZXJlbmNlcyAoYWx0IGluc3RydWN0aW9ucywgYnVnCkBAIC0xODEsMTggKzEyMyw5IEBACiAJCUVYSVRfREFUQQogCX0KIAotCS5pbml0LnJhbWZzIDoKLQl7Ci0JCS4gPSBBTElHTig0KTsKLQkJX19faW5pdHJhbWZzX3N0YXJ0ID0gLjsKLQkJKiguaW5pdC5yYW1mcykKLQkJLiA9IEFMSUdOKDQpOwotCQlfX19pbml0cmFtZnNfZW5kID0gLjsKLQl9Ci0KIAlfX2wxX2xtYV9zdGFydCA9IC47CiAKLQkudGV4dF9sMSBMMV9DT0RFX1NUQVJUIDogQVQoTE9BREFERFIoLmluaXQucmFtZnMpICsgU0laRU9GKC5pbml0LnJhbWZzKSkKKwkudGV4dF9sMSBMMV9DT0RFX1NUQVJUIDogQVQoTE9BREFERFIoLmV4aXQuZGF0YSkgKyBTSVpFT0YoLmV4aXQuZGF0YSkpCiAJewogCQkuID0gQUxJR04oNCk7CiAJCV9fc3RleHRfbDEgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvYXNobGRpMy5jIGIvYXJjaC9ibGFja2Zpbi9saWIvYXNobGRpMy5jCmluZGV4IGE4YzI3OWUuLmFiNjlkODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL2FzaGxkaTMuYworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9hc2hsZGkzLmMKQEAgLTEsMzAgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvYXNobGRpMy5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgImdjY2xpYi5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvYXNocmRpMy5jIGIvYXJjaC9ibGFja2Zpbi9saWIvYXNocmRpMy5jCmluZGV4IGEwZDM0MTkuLmI1YjM1MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL2FzaHJkaTMuYworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9hc2hyZGkzLmMKQEAgLTEsMzAgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvYXNocmRpMy5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgImdjY2xpYi5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvY2hlY2tzdW0uYyBiL2FyY2gvYmxhY2tmaW4vbGliL2NoZWNrc3VtLmMKaW5kZXggY2Q2MDVlNy4uYzYyOTY5ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9jaGVja3N1bS5jCkBAIC0xLDMyICsxLDEyIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2xpYi9jaGVja3N1bS5jCi0gKiBCYXNlZCBvbjogICAgIG5vbmUgLSBvcmlnaW5hbCB3b3JrCi0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKLSAqICAgICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0Ci0gKiAgICAgICAgICAgICAgIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWCBvcGVyYXRpbmcKKyAqIHN5c3RlbS4gSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgQlNEIFNvY2tldCBpbnRlcmZhY2UgYXMgdGhlCisgKiBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCiAgKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvZGl2c2kzLlMgYi9hcmNoL2JsYWNrZmluL2xpYi9kaXZzaTMuUwppbmRleCAyYWM1OWM3Li5mODljNWE0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi9kaXZzaTMuUworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9kaXZzaTMuUwpAQCAtMSwxMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2xpYi9kaXZzaTMuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICAxNiAvIDMyIGJpdCBzaWduZWQgZGl2aXNpb24uCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCisgKgorICogMTYgLyAzMiBiaXQgc2lnbmVkIGRpdmlzaW9uLgogICogICAgICAgICAgICAgICAgIFNwZWNpYWwgY2FzZXMgOgogICogICAgICAgICAgICAgICAgICAgICAgMSkgIElmKG51bWVyYXRvciA9PSAwKQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCkBAIC0yMiwyNSArMjEsNiBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIwIC0gUXVvdGllbnQgICAgKG8pCiAgKiAgICAgICAgICAgICAgICAgUmVnaXN0ZXJzIFVzZWQgOiBSMi1SNyxQMC1QMgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogCiAuZ2xvYmFsICAgX19fZGl2c2kzOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvZ2NjbGliLmggYi9hcmNoL2JsYWNrZmluL2xpYi9nY2NsaWIuaAppbmRleCA5Y2NkMzlhLi43MjRmMDdmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi9nY2NsaWIuaAorKysgYi9hcmNoL2JsYWNrZmluL2xpYi9nY2NsaWIuaApAQCAtMSwzMCArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2xpYi9nY2NsaWIuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNkZWZpbmUgQklUU19QRVJfVU5JVCAgOApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvbHNocmRpMy5jIGIvYXJjaC9ibGFja2Zpbi9saWIvbHNocmRpMy5jCmluZGV4IGU1N2JmNmYuLjUzZjE3NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL2xzaHJkaTMuYworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9sc2hyZGkzLmMKQEAgLTEsMzAgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvbHNocmRpMy5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgImdjY2xpYi5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvbWVtY2hyLlMgYi9hcmNoL2JsYWNrZmluL2xpYi9tZW1jaHIuUwppbmRleCA1ZGE0MjgxLi41NDJlNDBmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi9tZW1jaHIuUworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9tZW1jaHIuUwpAQCAtMSwzMCArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2xpYi9tZW1jaHIuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9tZW1jbXAuUyBiL2FyY2gvYmxhY2tmaW4vbGliL21lbWNtcC5TCmluZGV4IDIxOWZhMjguLmNlNWI5ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL21lbWNtcC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbGliL21lbWNtcC5TCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbGliL21lbWNtcC5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL21lbWNweS5TIGIvYXJjaC9ibGFja2Zpbi9saWIvbWVtY3B5LlMKaW5kZXggZTY1NGExOC4uYzMxYmYyMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvbWVtY3B5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9saWIvbWVtY3B5LlMKQEAgLTEsMzYgKzEsMTMgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbGliL21lbWNweS5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIGludGVybmFsIHZlcnNpb24gb2YgbWVtY3B5KCksIGlzc3VlZCBieSB0aGUgY29tcGlsZXIgdG8gY29weSBibG9ja3Mgb2YKKyAqIGRhdGEgYXJvdW5kLiBUaGlzIGlzIHJlYWxseSBtZW1tb3ZlKCkgLSBpdCBoYXMgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGgKKyAqIHBvc3NpYmxlIG92ZXJsYXBzLCBiZWNhdXNlIHRoYXQgYW1iaWd1aXR5IGlzIHdoZW4gdGhlIGNvbXBpbGVyIGdpdmVzIHVwCisgKiBhbmQgY2FsbHMgYSBmdW5jdGlvbi4gV2UgaGF2ZSBvdXIgb3duLCBpbnRlcm5hbCB2ZXJzaW9uIHNvIHRoYXQgd2UgZ2V0CisgKiBzb21ldGhpbmcgd2UgdHJ1c3QsIGV2ZW4gaWYgdGhlIHVzZXIgaGFzIHJlZGVmaW5lZCB0aGUgbm9ybWFsIHN5bWJvbC4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBpbnRlcm5hbCB2ZXJzaW9uIG9mIG1lbWNweSgpLCBpc3N1ZWQgYnkgdGhlIGNvbXBpbGVyCi0gKiAgICAgICAgICAgICAgIHRvIGNvcHkgYmxvY2tzIG9mIGRhdGEgYXJvdW5kLgotICogICAgICAgICAgICAgICBUaGlzIGlzIHJlYWxseSBtZW1tb3ZlKCkgLSBpdCBoYXMgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGgKLSAqICAgICAgICAgICAgICAgcG9zc2libGUgb3ZlcmxhcHMsIGJlY2F1c2UgdGhhdCBhbWJpZ3VpdHkgaXMgd2hlbiB0aGUgY29tcGlsZXIKLSAqICAgICAgICAgICAgICAgZ2l2ZXMgdXAgYW5kIGNhbGxzIGEgZnVuY3Rpb24uIFdlIGhhdmUgb3VyIG93biwgaW50ZXJuYWwgdmVyc2lvbgotICogICAgICAgICAgICAgICBzbyB0aGF0IHdlIGdldCBzb21ldGhpbmcgd2UgdHJ1c3QsIGV2ZW4gaWYgdGhlIHVzZXIgaGFzIHJlZGVmaW5lZAotICogICAgICAgICAgICAgICB0aGUgbm9ybWFsIHN5bWJvbC4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvbWVtbW92ZS5TIGIvYXJjaC9ibGFja2Zpbi9saWIvbWVtbW92ZS5TCmluZGV4IDMzZjg2NTMuLjgwYzI0MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL21lbW1vdmUuUworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9tZW1tb3ZlLlMKQEAgLTEsMzAgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvbWVtbW92ZS5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL21lbXNldC5TIGIvYXJjaC9ibGFja2Zpbi9saWIvbWVtc2V0LlMKaW5kZXggODE1OTEzNi4uYzMwZDk5YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvbWVtc2V0LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9saWIvbWVtc2V0LlMKQEAgLTEsMzAgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvbWVtc2V0LlMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvbW9kc2kzLlMgYi9hcmNoL2JsYWNrZmluL2xpYi9tb2RzaTMuUwppbmRleCBjYTFkZDM5Li44YjBjN2Q0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi9tb2RzaTMuUworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9tb2RzaTMuUwpAQCAtMSwzNiArMSwxMiBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvbW9kc2kzLlMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogVGhpcyBwcm9ncmFtIGNvbXB1dGVzIDMyIGJpdCBzaWduZWQgcmVtYWluZGVyLiBJdCBjYWxscyBkaXYzMiBmdW5jdGlvbgorICogZm9yIHF1b3RpZW50IGVzdGltYXRpb24uCisgKiAgIFJlZ2lzdGVycyBpbjogIFIwLCBSMSA9IE51bWVyYXRvci8gRGVub21pbmF0b3IKKyAqICAgUmVnaXN0ZXJzIG91dDogUjAgICAgID0gUmVtYWluZGVyCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgVGhpcyBwcm9ncmFtIGNvbXB1dGVzIDMyIGJpdCBzaWduZWQgcmVtYWluZGVyLiBJdCBjYWxscyBkaXYzMiBmdW5jdGlvbgotICogICAgICAgICAgICAgICBmb3IgcXVvdGllbnQgZXN0aW1hdGlvbi4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqICAgICAgICAgICAgICAgUmVnaXN0ZXJzIHVzZWQgOgotICogICAgICAgICAgICAgICBOdW1lcmF0b3IvIERlbm9taW5hdG9yIGluICBSMCwgUjEKLSAqICAgICAgICAgICAgICAgICBSMCAgLSAgcmV0dXJucyByZW1haW5kZXIuCi0gKiAgICAgICAgICAgICAgICAgUjItUjcKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogLmdsb2JhbCBfX19tb2RzaTM7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9tdWxkaTMuUyBiL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5TCmluZGV4IGFiZGUxMjAuLjk1M2EzOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5TCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCisgKi8KKwogLmFsaWduIDIKIC5nbG9iYWwgX19fbXVsZGkzOwogLnR5cGUgX19fbXVsZGkzLCBTVFRfRlVOQzsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL291dHMuUyBiL2FyY2gvYmxhY2tmaW4vbGliL291dHMuUwppbmRleCA0Njg1YjdhLi4yNTBmNGQ0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi9vdXRzLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9saWIvb3V0cy5TCkBAIC0xLDMwICsxLDExIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2xpYi9vdXRzLlMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBCYXMgVmVybWV1bGVuIDxiYXNAYnV5d2F5cy5ubD4KKyAqIEltcGxlbWVudGF0aW9uIG9mIG91dHN7YndsfSBmb3IgQmxhY2tGaW4gcHJvY2Vzc29ycyB1c2luZyB6ZXJvIG92ZXJoZWFkIGxvb3BzLgogICoKLSAqIENyZWF0ZWQ6ICAgICAgVHVlIE1hciAyMiAxNToyNzoyNCBDRVNUIDIwMDUKLSAqIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gb2Ygb3V0c3tid2x9IGZvciBCbGFja0ZpbiBwcm9jZXNzb3JzIHVzaW5nIHplcm8gb3ZlcmhlYWQgbG9vcHMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAgICAgIDIwMDUgQnV5V2F5cyBCVgorICogICAgICAgICAgICAgICAgICAgICAgQmFzIFZlcm1ldWxlbiA8YmFzQGJ1eXdheXMubmw+CiAgKgotICogTW9kaWZpZWQ6ICAgICBDb3B5cmlnaHQgKEMpIDIwMDUgQmFzIFZlcm1ldWxlbiwgQnV5V2F5cyBCViA8YmFzQGJ1eXdheXMubmw+Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9zbXVsc2kzX2hpZ2hwYXJ0LlMgYi9hcmNoL2JsYWNrZmluL2xpYi9zbXVsc2kzX2hpZ2hwYXJ0LlMKaW5kZXggZTM4M2NkMy4uOTllZThjNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvc211bHNpM19oaWdocGFydC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbGliL3NtdWxzaTNfaGlnaHBhcnQuUwpAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQorICovCisKIC5hbGlnbiAyCiAuZ2xvYmFsIF9fX3NtdWxzaTNfaGlnaHBhcnQ7CiAudHlwZSBfX19zbXVsc2kzX2hpZ2hwYXJ0LCBTVFRfRlVOQzsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL3VkaXZzaTMuUyBiL2FyY2gvYmxhY2tmaW4vbGliL3VkaXZzaTMuUwppbmRleCA1OGZkOTZkLi45N2U5MDQzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi91ZGl2c2kzLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9saWIvdWRpdnNpMy5TCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbGliL3VkaXZzaTMuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi91bW9kc2kzLlMgYi9hcmNoL2JsYWNrZmluL2xpYi91bW9kc2kzLlMKaW5kZXggNGYyYjc2ZS4uMTY4ZWJhNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvdW1vZHNpMy5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbGliL3Vtb2RzaTMuUwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2xpYi91bW9kc2kzLlMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogbGliZ2NjMSByb3V0aW5lcyBmb3IgQmxhY2tmaW4gNXh4CiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgbGliZ2NjMSByb3V0aW5lcyBmb3IgQmxhY2tmaW4gNXh4CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogI2lmZGVmIENPTkZJR19BUklUSE1FVElDX09QU19MMQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvdW11bHNpM19oaWdocGFydC5TIGIvYXJjaC9ibGFja2Zpbi9saWIvdW11bHNpM19oaWdocGFydC5TCmluZGV4IDY3Yjc5OTMuLjA1MTgyNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL3VtdWxzaTNfaGlnaHBhcnQuUworKysgYi9hcmNoL2JsYWNrZmluL2xpYi91bXVsc2kzX2hpZ2hwYXJ0LlMKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKKyAqLworCiAuYWxpZ24gMgogLmdsb2JhbCBfX191bXVsc2kzX2hpZ2hwYXJ0OwogLnR5cGUgX19fdW11bHNpM19oaWdocGFydCwgU1RUX0ZVTkM7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKaW5kZXggMDNlNGE5OS4uMDE5NzVjMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYwpAQCAtMSwzMSArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCi0gKiBBdXRob3I6ICAgICAgIEJyeWFuIFd1IDxjb29sb25leUBrZXJuZWwub3JnPgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgICAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC01NzEsMTkgKzU0OSw2IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7Ci0JLnN0YXJ0ID0gMCwKLQkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAotCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic2ltcGxlLWdwaW8iLAotCS5pZCA9IC0xLAotCS5udW1fcmVzb3VyY2VzID0gMSwKLQkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCi19OwotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNjbGtfdmxldl9kYXRhc2hlZXRbXSA9CiB7CiAJVlJQQUlSKFZMRVZfMTAwLCA0MDAwMDAwMDApLApAQCAtNjYwLDggKzYyNSw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKIAkmZXpicmRfZmxhc2hfZGV2aWNlLAogI2VuZGlmCi0KLQkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlemJyZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvZG1hLmMKaW5kZXggNjk4ZTg4Yy4uNzhiNDM2MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9kbWEuYwpAQCAtMSwzMSArMSwxMSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgQnJ5YW4gV3UgPGNvb2xvbmV5QGtlcm5lbC5vcmc+CisgKiB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCisgKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZjUxOC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZjUxOC5oCmluZGV4IDc4ZGExYTAuLjg1NmIzMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmY1MTguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmNTE4LmgKQEAgLTEsMzAgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9iZjUxOC5oCi0gKiBCYXNlZCBvbjoJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9iZjUyNy5oCi0gKiBBdXRob3I6CU1pY2hhZWwgSGVubmVyaWNoIChtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tKQorICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIFNZU1RFTSBNTVIgUkVHSVNURVIgQU5EIE1FTU9SWSBNQVAgRk9SIEFEU1AtQkY1MTgKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfX01BQ0hfQkY1MThfSF9fCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCBkYmFkZTkzLi45NzBkMzEwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTEsMzIgKzEsNyBAQAogLyoKLSAqIGZpbGU6ICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2JmaW5fc2VyaWFsXzV4eC5oCi0gKiBiYXNlZCBvbjoKLSAqIGF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIGNyZWF0ZWQ6Ci0gKiBkZXNjcmlwdGlvbjoKLSAqCWJsYWNrZmluIHNlcmlhbCBkcml2ZXIgaGVhZCBmaWxlCi0gKiByZXY6Ci0gKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IDgzNDIxZDMuLjZjZmIyNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTEsMzIgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9ibGFja2Zpbi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9CTEFDS0ZJTl9IXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTEyLmgKaW5kZXggODIwYzEzYy4uNDkzMDIwZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxMi5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvY2RlZmJmNTEyLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgc3lzdGVtIG1tciByZWdpc3RlciBtYXAKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpZm5kZWYgX0NERUZfQkY1MTJfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE0LmgKaW5kZXggZGZlNDkyZC4uZTFkOTk5MSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTQuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNC5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvY2RlZmJmNTE0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgc3lzdGVtIG1tciByZWdpc3RlciBtYXAKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2lmbmRlZiBfQ0RFRl9CRjUxNF9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTYuaAppbmRleCAxNGRmNDNkLi42YjM2NGVkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE2LmgKQEAgLTEsMzIgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9jZGVmYmY1MTYuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTE2X0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxOC5oCmluZGV4IGJhZmIzNzAuLjkyOWI5MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTguaApAQCAtMSwzMiArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2NkZWZiZjUxOC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIHN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCi0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1MThfSApAQCAtMjExLDYgKzE4Niw0NyBAQAogI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQUJPUlQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQUJPUlQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQUJPUlQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0FCT1JULCB2YWwpCiAKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX0NUTCgpICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEVNQUNfUFRQX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1BUUF9DVEwodmFsKSAgICAgICAgICAgIGJmaW5fd3JpdGUxNihFTUFDX1BUUF9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX0lFKCkgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEVNQUNfUFRQX0lFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUFRQX0lFKHZhbCkgICAgICAgICAgICAgYmZpbl93cml0ZTE2KEVNQUNfUFRQX0lFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1BUUF9JU1RBVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihFTUFDX1BUUF9JU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1BUUF9JU1RBVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihFTUFDX1BUUF9JU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19QVFBfRk9GRigpICAgICAgICAgICAgICAgYmZpbl9yZWFkMzIoRU1BQ19QVFBfRk9GRikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1BUUF9GT0ZGKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUzMihFTUFDX1BUUF9GT0ZGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1BUUF9GVjEoKSAgICAgICAgICAgICAgICBiZmluX3JlYWQzMihFTUFDX1BUUF9GVjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19QVFBfRlYxKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMzIoRU1BQ19QVFBfRlYxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1BUUF9GVjIoKSAgICAgICAgICAgICAgICBiZmluX3JlYWQzMihFTUFDX1BUUF9GVjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19QVFBfRlYyKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMzIoRU1BQ19QVFBfRlYyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1BUUF9GVjMoKSAgICAgICAgICAgICAgICBiZmluX3JlYWQzMihFTUFDX1BUUF9GVjMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19QVFBfRlYzKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMzIoRU1BQ19QVFBfRlYzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1BUUF9BRERFTkQoKSAgICAgICAgICAgICBiZmluX3JlYWQzMihFTUFDX1BUUF9BRERFTkQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19QVFBfQURERU5EKHZhbCkgICAgICAgICBiZmluX3dyaXRlMzIoRU1BQ19QVFBfQURERU5ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1BUUF9BQ0NSKCkgICAgICAgICAgICAgICBiZmluX3JlYWQzMihFTUFDX1BUUF9BQ0NSKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUFRQX0FDQ1IodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTMyKEVNQUNfUFRQX0FDQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX09GRlNFVCgpICAgICAgICAgICAgIGJmaW5fcmVhZDMyKEVNQUNfUFRQX09GRlNFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1BUUF9PRkZTRVQodmFsKSAgICAgICAgIGJmaW5fd3JpdGUzMihFTUFDX1BUUF9PRkZTRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX1RJTUVMTygpICAgICAgICAgICAgIGJmaW5fcmVhZDMyKEVNQUNfUFRQX1RJTUVMTykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1BUUF9USU1FTE8odmFsKSAgICAgICAgIGJmaW5fd3JpdGUzMihFTUFDX1BUUF9USU1FTE8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX1RJTUVISSgpICAgICAgICAgICAgIGJmaW5fcmVhZDMyKEVNQUNfUFRQX1RJTUVISSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1BUUF9USU1FSEkodmFsKSAgICAgICAgIGJmaW5fd3JpdGUzMihFTUFDX1BUUF9USU1FSEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX1JYU05BUExPKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKEVNQUNfUFRQX1JYU05BUExPKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19QVFBfUlhTTkFQSEkoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoRU1BQ19QVFBfUlhTTkFQSEkpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1BUUF9UWFNOQVBMTygpICAgICAgICAgICBiZmluX3JlYWQzMihFTUFDX1BUUF9UWFNOQVBMTykKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX1RYU05BUEhJKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKEVNQUNfUFRQX1RYU05BUEhJKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19QVFBfQUxBUk1MTygpICAgICAgICAgICAgYmZpbl9yZWFkMzIoRU1BQ19QVFBfQUxBUk1MTykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1BUUF9BTEFSTUxPKHZhbCkgICAgICAgIGJmaW5fd3JpdGUzMihFTUFDX1BUUF9BTEFSTUxPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1BUUF9BTEFSTUhJKCkgICAgICAgICAgICBiZmluX3JlYWQzMihFTUFDX1BUUF9BTEFSTUhJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUFRQX0FMQVJNSEkodmFsKSAgICAgICAgYmZpbl93cml0ZTMyKEVNQUNfUFRQX0FMQVJNSEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX0lEX09GRigpICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEVNQUNfUFRQX0lEX09GRikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1BUUF9JRF9PRkYodmFsKSAgICAgICAgIGJmaW5fd3JpdGUxNihFTUFDX1BUUF9JRF9PRkYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX0lEX1NOQVAoKSAgICAgICAgICAgIGJmaW5fcmVhZDMyKEVNQUNfUFRQX0lEX1NOQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19QVFBfSURfU05BUCh2YWwpICAgICAgICBiZmluX3dyaXRlMzIoRU1BQ19QVFBfSURfU05BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19QVFBfUFBTX1NUQVJUSEkoKSAgICAgICAgYmZpbl9yZWFkMzIoRU1BQ19QVFBfUFBTX1NUQVJUSEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19QVFBfUFBTX1NUQVJUSEkodmFsKSAgICBiZmluX3dyaXRlMzIoRU1BQ19QVFBfUFBTX1NUQVJUSEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUFRQX1BQU19QRVJJT0QoKSAgICAgICAgIGJmaW5fcmVhZDMyKEVNQUNfUFRQX1BQU19QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19QVFBfUFBTX1BFUklPRCh2YWwpICAgICBiZmluX3dyaXRlMzIoRU1BQ19QVFBfUFBTX1BFUklPRCwgdmFsKQorCiAvKiBSZW1vdmFibGUgU3RvcmFnZSBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCiAKICNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QV1JfQ1RMKCkgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QV1JfQ09OVFJPTCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTF4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTF4X2Jhc2UuaAppbmRleCBlZTNkNDczLi4xZDk3MGRmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxeF9iYXNlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MXhfYmFzZS5oCkBAIC0xLDMxICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvY2RlZkJGNTF4X2Jhc2UuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1MlhfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxMi5oCmluZGV4IGE5NmNhOTAuLjliNTA1YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTEyLmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9kZWZCRjUxMi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpZm5kZWYgX0RFRl9CRjUxMl9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE0LmgKaW5kZXggNTZlZTVhNy4uYjVhZGNhMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTQuaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2RlZkJGNTE0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaWZuZGVmIF9ERUZfQkY1MTRfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNi5oCmluZGV4IGRmYzkzODQuLjdlYjE4NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTYuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE2LmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9kZWZCRjUxNi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogI2lmbmRlZiBfREVGX0JGNTE2X0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTguaAppbmRleCA2ZTk4MmFiLi43OTRjZjA2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxOC5oCkBAIC0xLDMxICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvZGVmQkY1MTguaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpZm5kZWYgX0RFRl9CRjUxOF9ICkBAIC02NDgsNCArNjI0LDMyIEBACiAKICNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFJXUiAgMHgxICAgICAgICAvKiBSZWFkIFdhaXQgUmVxdWVzdCAqLwogCisvKiBCaXQgbWFza3MgZm9yIEVNQUNfUFRQX0NUTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBQVFBfRU4gIDB4MSAgICAgICAgLyogRW5hYmxlIHRoZSBQVFBfVFNZTkMgbW9kdWxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgVEwgIDB4MiAgICAgICAgLyogVGltZXN0YW1wIGxvY2sgY29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBBU0VOICAweDEwICAgICAgIC8qIEF1eGlsaWFyeSBzbmFwc2hvdCBjb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgUFBTRU4gIDB4ODAgICAgICAgLyogUHVsc2UtcGVyLXNlY29uZCAoUFBTKSBjb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ0tPRU4gIDB4MjAwMCAgICAgLyogQ2xvY2sgb3V0cHV0IGNvbnRyb2wgKi8KKworLyogQml0IG1hc2tzIGZvciBFTUFDX1BUUF9JRSAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEFMSUUgIDB4MSAgICAgICAgLyogQWxhcm0gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFJYRUlFICAweDIgICAgICAgIC8qIFJlY2VpdmUgZXZlbnQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFJYR0lFICAweDQgICAgICAgIC8qIFJlY2VpdmUgZ2VuZXJhbCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFRYSUUgIDB4OCAgICAgICAgLyogVHJhbnNtaXQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFJYT1ZFICAweDEwICAgICAgIC8qIFJlY2VpdmUgb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgVFhPVkUgIDB4MjAgICAgICAgLyogVHJhbnNtaXQgb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEFTSUUgIDB4NDAgICAgICAgLyogQXV4aWxpYXJ5IHNuYXBzaG90IGludGVycnVwdCBlbmFibGUgKi8KKworLyogQml0IG1hc2tzIGZvciBFTUFDX1BUUF9JU1RBVCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBBTFMgIDB4MSAgICAgICAgLyogQWxhcm0gc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFJYRUwgIDB4MiAgICAgICAgLyogUmVjZWl2ZSBldmVudCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFJYR0wgIDB4NCAgICAgICAgLyogUmVjZWl2ZSBnZW5lcmFsIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgVFhUTCAgMHg4ICAgICAgICAvKiBUcmFuc21pdCBzbmFwc2hvdCBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgUlhPViAgMHgxMCAgICAgICAvKiBSZWNlaXZlIHNuYXBzaG90IG92ZXJydW4gc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFRYT1YgIDB4MjAgICAgICAgLyogVHJhbnNtaXQgc25hcHNob3Qgb3ZlcnJ1biBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEFTTCAgMHg0MCAgICAgICAvKiBBdXhpbGlhcnkgc25hcHNob3QgaW50ZXJydXB0IHN0YXR1cyAqLworCiAjZW5kaWYgLyogX0RFRl9CRjUxOF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTF4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oCmluZGV4IDFiZWM4ZDEuLmUwNmY0MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oCkBAIC0xLDMxICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvZGVmQkY1MXhfYmFzZS5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpZm5kZWYgX0RFRl9CRjUxWF9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDk3NTc2ODMuLmJiYWIyZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDcgKzEsNCBAQAogLyoKLSAqIEZpbGU6IGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oCi0gKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9pcnEuaAppbmRleCAzZmYwZjA5Li4xNGU1MmVjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2lycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvaXJxLmgKQEAgLTEsMzIgKzEsNyBAQAogLyoKLSAqIGZpbGU6CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvaXJxLmgKLSAqIGJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2lycS5oCi0gKiBhdXRob3I6CU1pY2hhZWwgSGVubmVyaWNoIChtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tKQorICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIGNyZWF0ZWQ6Ci0gKiBkZXNjcmlwdGlvbjoKLSAqCXN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCi0gKiByZXY6Ci0gKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2lmbmRlZiBfQkY1MThfSVJRX0hfCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCmluZGV4IGEwZmM3N2YuLmUzNTI5MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgorICovCisKICNpZm5kZWYgX01BQ0hfUE9SVE1VWF9IXwogI2RlZmluZSBfTUFDSF9QT1JUTVVYX0hfCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW50cy1wcmlvcml0eS5jCmluZGV4IDMxNTFmZDUuLmJiMDViZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2ludHMtcHJpb3JpdHkuYwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW50cy1wcmlvcml0eS5jCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbnRzLXByaW9yaXR5LmMKLSAqIEF1dGhvcjogICAgICAgQnJ5YW4gV3UgPGNvb2xvbmV5QGtlcm5lbC5vcmc+CisgKiBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcworICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKaW5kZXggMDhhM2YwMS4uZjE5OTZiMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYwpAQCAtMSwzMSArMSwxMCBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbS1iZjUyNy5jCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYwotICogQXV0aG9yOiAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgMjAwOC0yMDA5IEJsdWV0ZWNobml4CisgKiAgICAgICAgICAgICAgICAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC02MTYsMTIgKzU5NSw2IEBACiB9OwogI2VuZGlmICAvKiBzcGkgbWFzdGVyIGFuZCBkZXZpY2VzICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fNzM5M19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2ZiX2FkdjczOTNfZGV2aWNlID0gewotCS5uYW1lID0gImJmaW4tYWR2NzM5MyIsCi19OwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjbV9wYXJ0aXRpb25zW10gPSB7CiAJewpAQCAtNzg2LDYgKzc1OSwxMSBAQAogCQkuaXJxID0gSVJRX1BGOCwKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTNfTU9EVUxFKQorCXsKKwkJSTJDX0JPQVJEX0lORk8oImJmaW4tYWR2NzM5MyIsIDB4MkIpLAorCX0sCisjZW5kaWYKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQpAQCAtODIxLDE5ICs3OTksNiBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0gewotCS5zdGFydCA9IDAsCi0JLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKLQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0gewotCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKLQkuaWQgPSAtMSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi0JLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAotfTsKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjY2xrX3ZsZXZfZGF0YXNoZWV0W10gPQogewogCVZSUEFJUihWTEVWXzEwMCwgNDAwMDAwMDAwKSwKQEAgLTkwOSwxMCArODc0LDYgQEAKIAkmYmZpbl9zcGkwX2RldmljZSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTNfTU9EVUxFKQotCSZiZmluX2ZiX2FkdjczOTNfZGV2aWNlLAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQogCSZiZmluX3VhcnRfZGV2aWNlLAogI2VuZGlmCkBAIC05NDIsOCArOTAzLDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIAkmY21fZmxhc2hfZGV2aWNlLAogI2VuZGlmCi0KLQkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKaW5kZXggNjhiNGM4MC4uY2FkMjNiMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYwpAQCAtMSwzMSArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCi0gKiBBdXRob3I6ICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAgICAgIDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCisgKiAgICAgICAgICAgICAgICAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTYxMSwxOSArNTg5LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKLQkuc3RhcnQgPSAwLAotCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKLQkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCi0JLmlkID0gLTEsCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKLX07Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2Nsa192bGV2X2RhdGFzaGVldFtdID0KIHsKIAlWUlBBSVIoVkxFVl8xMDAsIDQwMDAwMDAwMCksCkBAIC03MzIsOCArNjk3LDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUCkgfHwgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVBfTU9EVUxFKQogCSZlemJyZF9mbGFzaF9kZXZpY2UsCiAjZW5kaWYKLQotCSZiZmluX2dwaW9zX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGV6YnJkX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwppbmRleCAyODQ5YjA5Li5mMDk2NjVmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCkBAIC0xLDMxICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKLSAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtNzE2LDEyICs2OTQsNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTNfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9mYl9hZHY3MzkzX2RldmljZSA9IHsKLQkubmFtZSA9ICJiZmluLWFkdjczOTMiLAotfTsKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl91YXJ0X3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMApAQCAtODM3LDYgKzgwOSwxMSBAQAogCQkuaXJxID0gSVJRX1BGOCwKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTNfTU9EVUxFKQorCXsKKwkJSTJDX0JPQVJEX0lORk8oImJmaW4tYWR2NzM5MyIsIDB4MkIpLAorCX0sCisjZW5kaWYKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQpAQCAtOTA1LDE5ICs4ODIsNiBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0gewotCS5zdGFydCA9IDAsCi0JLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKLQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0gewotCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKLQkuaWQgPSAtMSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi0JLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAotfTsKLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjY2xrX3ZsZXZfZGF0YXNoZWV0W10gPQogewogCVZSUEFJUihWTEVWXzEwMCwgNDAwMDAwMDAwKSwKQEAgLTEwMDEsMTAgKzk2NSw2IEBACiAJJmJmNTJ4X3QzNTBtY3FiX2RldmljZSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTNfTU9EVUxFKQotCSZiZmluX2ZiX2FkdjczOTNfZGV2aWNlLAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQogCSZiZmluX3VhcnRfZGV2aWNlLAogI2VuZGlmCkBAIC0xMDM4LDggKzk5OCw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKIAkmZXpraXRfZmxhc2hfZGV2aWNlLAogI2VuZGlmCi0KLQkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlemtpdF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMKaW5kZXggMjMxODc3NS4uN2JjNzU3NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuYwpAQCAtMSwzMSArMSwxMSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmNTI3LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmNTI3LmgKaW5kZXggMzgzMmFhYi4uZmY2OGM4OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZjUyNy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmY1MjcuaApAQCAtMSwzMCArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2JmNTI3LmgKLSAqIEJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2JmNTM3LmgKLSAqIEF1dGhvcjoJTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBTWVNURU0gTU1SIFJFR0lTVEVSIEFORCBNRU1PUlkgTUFQIEZPUiBBRFNQLUJGNTI3Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX19NQUNIX0JGNTI3X0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggZWJkNmNlYi4uYzFkNTViOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBmaWxlOiAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9iZmluX3NlcmlhbF81eHguaAotICogYmFzZWQgb246Ci0gKiBhdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBjcmVhdGVkOgotICogZGVzY3JpcHRpb246Ci0gKglibGFja2ZpbiBzZXJpYWwgZHJpdmVyIGhlYWQgZmlsZQotICogcmV2OgotICoKLSAqIG1vZGlmaWVkOgotICoKLSAqCi0gKiBidWdzOiAgICAgICAgIGVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgd2l0aG91dCBhbnkgd2FycmFudHk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgc2VlIHRoZQotICogZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBjb3B5aW5nLgotICogaWYgbm90LCB3cml0ZSB0byB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uLAotICogNTkgdGVtcGxlIHBsYWNlIC0gc3VpdGUgMzMwLCBib3N0b24sIG1hIDAyMTExLTEzMDcsIHVzYS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCBlYTljYjBmLi5lN2Q2MDM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MjcvYmxhY2tmaW4uaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpZm5kZWYgX01BQ0hfQkxBQ0tGSU5fSF8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTIyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyMi5oCmluZGV4IDY2M2MyYmIuLjEwNzlhZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTIyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjIuaApAQCAtMSwzMiArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2NkZWZiZjUyMi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIHN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCi0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1MjJfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjUuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTI1LmgKaW5kZXggMDAzNzdlYi4uZGMzMTE5ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTI1LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjUuaApAQCAtMSwzMiArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2NkZWZiZjUyNS5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIHN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCi0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1MjVfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTI3LmgKaW5kZXggZmNhOGRiNy4uZDY1Nzk0NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTI3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjcuaApAQCAtMSwzMiArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2NkZWZiZjUyNy5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIHN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCi0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1MjdfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MnhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MnhfYmFzZS5oCmluZGV4IDFmZTc2ZDguLjcwMTRkZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyeF9iYXNlLmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9jZGVmQkY1MnhfYmFzZS5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTJYX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjIuaAppbmRleCAwYThjZGNkLi5jYjEzOWEyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTIyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyMi5oCkBAIC0xLDMxICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MjcvZGVmQkY1MjIuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpZm5kZWYgX0RFRl9CRjUyMl9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTI1LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTI1LmgKaW5kZXggNWNkNzU3Ni4uODJhYmVmYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjUuaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2RlZkJGNTI1LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaWZuZGVmIF9ERUZfQkY1MjVfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNy5oCmluZGV4IGYwNDBmMzYuLjU3MGExMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTI3LmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9kZWZCRjUyNy5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogI2lmbmRlZiBfREVGX0JGNTI3X0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MnhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyeF9iYXNlLmgKaW5kZXggNjhiNTVkMC4uZjgyMTcwMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyeF9iYXNlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyeF9iYXNlLmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9kZWZCRjUyeF9iYXNlLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaWZuZGVmIF9ERUZfQkY1MlhfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAwNmI2ZWViLi4xMDRiZmY4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSw3ICsxLDQgQEAKIC8qCi0gKiBGaWxlOiBhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaAotICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgogICogQ29weXJpZ2h0IChDKSAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvaXJxLmgKaW5kZXggOGVhNjYwZC4uYWE2NTc5YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBmaWxlOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2lycS5oCi0gKiBiYXNlZCBvbjoJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzNy9pcnEuaAotICogYXV0aG9yOglNaWNoYWVsIEhlbm5lcmljaCAobWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbSkKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIGNyZWF0ZWQ6Ci0gKiBkZXNjcmlwdGlvbjoKLSAqCXN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCi0gKiByZXY6Ci0gKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2lmbmRlZiBfQkY1MjdfSVJRX0hfCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL3BvcnRtdXguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvcG9ydG11eC5oCmluZGV4IDcyYjE2NTIuLmQ0NTE4YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvcG9ydG11eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvcG9ydG11eC5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgorICovCisKICNpZm5kZWYgX01BQ0hfUE9SVE1VWF9IXwogI2RlZmluZSBfTUFDSF9QT1JUTVVYX0hfCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW50cy1wcmlvcml0eS5jCmluZGV4IGY4YzhhY2QuLjQ0Y2EyMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2ludHMtcHJpb3JpdHkuYwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW50cy1wcmlvcml0eS5jCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbnRzLXByaW9yaXR5LmMKLSAqIEF1dGhvcjogICAgICAgTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisgKiBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcworICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYwppbmRleCA2YzJiNDdmLi40M2Y0M2EwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCkBAIC0xLDMyICsxLDExIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvSDg2MDYuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvc3RhbXAuYwotICogQXV0aG9yOiAgICAgICBKYXZpZXIgSGVycmVybyA8amhlcnJlcm9AaHZzaXN0ZW1hcy5lcz4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgIDIwMDctMjAwOCBIViBTaXN0ZW1hcyBTLkwuCisgKiAgICAgICAgICAgICAgICAgICAgICBKYXZpZXIgSGVycmVybyA8amhlcnJlcm9AaHZzaXN0ZW1hcy5lcz4KKyAqICAgICAgICAgICAgICAgIDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCisgKiAgICAgICAgICAgICAgICAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgogICoKLSAqIENyZWF0ZWQ6ICAgICAgMjAwNwotICogRGVzY3JpcHRpb246ICBCb2FyZCBJbmZvIEZpbGUgZm9yIHRoZSBIViBTaXN0ZW1hcyBIODYwNiBib2FyZAotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMKLSAqCQkgQ29weXJpZ2h0IDIwMDcsMjAwOCBIViBTaXN0ZW1hcyBTLkwuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYwppbmRleCA4MjA4ZDY3Li5iNTgwODg0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYwpAQCAtMSwxNiArMSwxMCBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JsYWNrc3RhbXAuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvc3RhbXAuYwotICogQXV0aG9yOiAgICAgICBCZW5qYW1pbiBNYXR0aGV3cyA8Ym1hdEBsbGUucm9jaGVzdGVyLmVkdT4KLSAqICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqIEJvYXJkIEluZm8gRmlsZSBmb3IgdGhlIEJsYWNrU3RhbXAKICAqCi0gKiBDcmVhdGVkOiAgICAgIDIwMDgKLSAqIERlc2NyaXB0aW9uOiAgQm9hcmQgSW5mbyBGaWxlIGZvciB0aGUgQmxhY2tTdGFtcAotICoKLSAqIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQogICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKiAgICAgICAgICAgICAgICAyMDA4IEJlbmphbWluIE1hdHRoZXdzIDxibWF0QGxsZS5yb2NoZXN0ZXIuZWR1PgorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgogICogTW9yZSBpbmZvIGFib3V0IHRoZSBCbGFja1N0YW1wIGF0OgogICogCWh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy9nZi9wcm9qZWN0L2JsYWNrc3RhbXAvCkBAIC0yODEsMTkgKzI3NSw2IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7Ci0JLnN0YXJ0ID0gMCwKLQkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAotCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic2ltcGxlLWdwaW8iLAotCS5pZCA9IC0xLAotCS5udW1fcmVzb3VyY2VzID0gMSwKLQkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCi19OwotCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0kyQ19HUElPX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogCkBAIC0zODQsOCArMzY1LDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfSTJDX0dQSU9fTU9EVUxFKQogCSZpMmNfZ3Bpb19kZXZpY2UsCiAjZW5kaWYKLQotCSZiZmluX2dwaW9zX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGJsYWNrc3RhbXBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCmluZGV4IDc0NDNiMjYuLjdmYzNiODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKQEAgLTEsMzAgKzEsMTAgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKLSAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4gQ29weXJpZ2h0IDIwMDUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgIDIwMDgtMjAwOSBCbHVldGVjaG5peAorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgotICogQ3JlYXRlZDogICAgICAyMDA1Ci0gKiBEZXNjcmlwdGlvbjogIEJvYXJkIGRlc2NyaXB0aW9uIGZpbGUKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMjYxLDE5ICsyNDEsNiBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0gewotCS5zdGFydCA9IDAsCi0JLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKLQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0gewotCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKLQkuaWQgPSAtMSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi0JLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAotfTsKLQogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdWFydF9yZXNvdXJjZXNbXSA9IHsKIAl7CkBAIC01MDYsOCArNDczLDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUCkgfHwgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVBfTU9EVUxFKQogCSZwYXJhX2ZsYXNoX2RldmljZSwKICNlbmRpZgotCi0JJmJmaW5fZ3Bpb3NfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY21fYmY1MzNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCmluZGV4IGZkNTE4ZTMuLmQ0Njg5ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKQEAgLTEsMzEgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2V6a2l0LmMKLSAqIEJhc2VkIG9uOiAgICAgT3JpZ2luYWwgV29yawotICogQXV0aG9yOiAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgICAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KICAqCi0gKiBDcmVhdGVkOiAgICAgIDIwMDUKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOiAgICAgUm9iaW4gR2V0eiA8cmdldHpAYmxhY2tmaW4udWNsaW51eC5vcmc+IC0gTmFtZWQgdGhlIGJvYXJkcwotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMzMsMTIgKzExLDE0IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BsYXQtcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxMzYyLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KQEAgLTU2LDEyICszNiw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fNzM5M19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2ZiX2FkdjczOTNfZGV2aWNlID0gewotCS5uYW1lID0gImJmaW4tYWR2NzM5MyIsCi19OwotI2VuZGlmCi0KIC8qCiAgKiAgVVNCLUxBTiBFekV4dGVuZGVyIGJvYXJkCiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KQEAgLTk4LDU0ICs3Miw2OSBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX1BTRDQyNTZHKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUFNENDI1NkdfTU9EVUxFKQotc3RhdGljIGNvbnN0IGNoYXIgKm1hcF9wcm9iZXNbXSA9IHsKLQkic3RtX2ZsYXNoIiwKLQlOVUxMLAorI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZXpraXRfcGFydGl0aW9uc19hW10gPSB7CisJeworCQkubmFtZSAgICAgICA9ICJib290bG9hZGVyKG5vciBhKSIsCisJCS5zaXplICAgICAgID0gMHg0MDAwMCwKKwkJLm9mZnNldCAgICAgPSAwLAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAibGludXgga2VybmVsKG5vciBhKSIsCisJCS5zaXplICAgICAgID0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldCAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbSBzdG1fcHJpX2RhdGFfYSA9IHsKLQkubWFwbmFtZSAgICA9ICJGbGFzaCBBIFByaW1hcnkiLAotCS5tYXBfcHJvYmVzID0gbWFwX3Byb2JlcywKLQkuYmFua3dpZHRoICA9IDIsCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBlemtpdF9mbGFzaF9kYXRhX2EgPSB7CisJLndpZHRoICAgICAgPSAyLAorCS5wYXJ0cyAgICAgID0gZXpraXRfcGFydGl0aW9uc19hLAorCS5ucl9wYXJ0cyAgID0gQVJSQVlfU0laRShlemtpdF9wYXJ0aXRpb25zX2EpLAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzdG1fcHJpX3Jlc291cmNlX2EgPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIGV6a2l0X2ZsYXNoX3Jlc291cmNlX2EgPSB7CiAJLnN0YXJ0ID0gMHgyMDAwMDAwMCwKIAkuZW5kICAgPSAweDIwMGZmZmZmLAogCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3RtX3ByaV9kZXZpY2VfYSA9IHsKLQkubmFtZSAgICAgICAgICA9ICJtdGQtcmFtIiwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV6a2l0X2ZsYXNoX2RldmljZV9hID0geworCS5uYW1lICAgICAgICAgID0gInBoeXNtYXAtZmxhc2giLAogCS5pZCAgICAgICAgICAgID0gMCwKIAkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZzdG1fcHJpX2RhdGFfYSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXpraXRfZmxhc2hfZGF0YV9hLAogCX0sCiAJLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSAgICAgID0gJnN0bV9wcmlfcmVzb3VyY2VfYSwKKwkucmVzb3VyY2UgICAgICA9ICZlemtpdF9mbGFzaF9yZXNvdXJjZV9hLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0ZGF0YV9tdGRfcmFtIHN0bV9wcmlfZGF0YV9iID0gewotCS5tYXBuYW1lICAgID0gIkZsYXNoIEIgUHJpbWFyeSIsCi0JLm1hcF9wcm9iZXMgPSBtYXBfcHJvYmVzLAotCS5iYW5rd2lkdGggID0gMiwKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBlemtpdF9wYXJ0aXRpb25zX2JbXSA9IHsKKwl7CisJCS5uYW1lICAgPSAiZmlsZSBzeXN0ZW0obm9yIGIpIiwKKwkJLnNpemUgICA9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3RtX3ByaV9yZXNvdXJjZV9iID0geworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZXpraXRfZmxhc2hfZGF0YV9iID0geworCS53aWR0aCAgICAgID0gMiwKKwkucGFydHMgICAgICA9IGV6a2l0X3BhcnRpdGlvbnNfYiwKKwkubnJfcGFydHMgICA9IEFSUkFZX1NJWkUoZXpraXRfcGFydGl0aW9uc19iKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXpraXRfZmxhc2hfcmVzb3VyY2VfYiA9IHsKIAkuc3RhcnQgPSAweDIwMTAwMDAwLAogCS5lbmQgICA9IDB4MjAxZmZmZmYsCiAJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzdG1fcHJpX2RldmljZV9iID0gewotCS5uYW1lICAgICAgICAgID0gIm10ZC1yYW0iLAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXpraXRfZmxhc2hfZGV2aWNlX2IgPSB7CisJLm5hbWUgICAgICAgICAgPSAicGh5c21hcC1mbGFzaCIsCiAJLmlkICAgICAgICAgICAgPSA0LAogCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJnN0bV9wcmlfZGF0YV9iLAorCQkucGxhdGZvcm1fZGF0YSA9ICZlemtpdF9mbGFzaF9kYXRhX2IsCiAJfSwKIAkubnVtX3Jlc291cmNlcyA9IDEsCi0JLnJlc291cmNlICAgICAgPSAmc3RtX3ByaV9yZXNvdXJjZV9iLAorCS5yZXNvdXJjZSAgICAgID0gJmV6a2l0X2ZsYXNoX3Jlc291cmNlX2IsCiB9OwogI2VuZGlmCiAKQEAgLTQwMCwxOSArMzg5LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKLQkuc3RhcnQgPSAwLAotCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKLQkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCi0JLmlkID0gLTEsCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKLX07Ci0KICNpZiBkZWZpbmVkKENPTkZJR19JMkNfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfSTJDX0dQSU9fTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAKQEAgLTQ2MCwxMyArNDM2LDIxIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBiZmluX2kyY19ib2FyZF9pbmZvW10gPSB7CisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTNfTU9EVUxFKQorCXsKKwkJSTJDX0JPQVJEX0lORk8oImJmaW4tYWR2NzM5MyIsIDB4MkIpLAorCX0sCisjZW5kaWYKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICplemtpdF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAogCSZiZmluX2RwbWMsCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NVERfUFNENDI1NkcpIHx8IGRlZmluZWQoQ09ORklHX01URF9QU0Q0MjU2R19NT0RVTEUpCi0JJnN0bV9wcmlfZGV2aWNlX2EsCi0JJnN0bV9wcmlfZGV2aWNlX2IsCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKKwkmZXpraXRfZmxhc2hfZGV2aWNlX2EsCisJJmV6a2l0X2ZsYXNoX2RldmljZV9iLAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfUExBVFJBTSkgfHwgZGVmaW5lZChDT05GSUdfTVREX1BMQVRSQU1fTU9EVUxFKQpAQCAtNDgyLDEwICs0NjYsNiBAQAogCSZiZmluX3NwaTBfZGV2aWNlLAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fNzM5M19NT0RVTEUpCi0JJmJmaW5fZmJfYWR2NzM5M19kZXZpY2UsCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKIAkmcnRjX2RldmljZSwKICNlbmRpZgpAQCAtNTA3LDggKzQ4Nyw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0kyQ19HUElPX01PRFVMRSkKIAkmaTJjX2dwaW9fZGV2aWNlLAogI2VuZGlmCi0KLQkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlemtpdF9pbml0KHZvaWQpCkBAIC01MTYsNiArNDk0LDggQEAKIAlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZXpraXRfZGV2aWNlcywgQVJSQVlfU0laRShlemtpdF9kZXZpY2VzKSk7CiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYmZpbl9zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgYmZpbl9pMmNfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKGJmaW5faTJjX2JvYXJkX2luZm8pKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYwppbmRleCBmMTliNjMzLi42NDRiZTVlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYwpAQCAtMSwzNCArMSwxMiBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2lwMHguYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYmYxLmMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL3N0YW1wLmMKLSAqIEF1dGhvcjogICAgICAgSXZhbiBEYW5vdiA8aWRhbm92QGdtYWlsLmNvbT4KLSAqICAgICAgICAgICAgICAgTW9kaWZpZWQgZm9yIElQMFggRGF2aWQgUm93ZQorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgICAyMDA3IERhdmlkIFJvd2UKKyAqICAgICAgICAgICAgICAgIDIwMDYgSW50cmF0cmFkZSBMdGQuCisgKiAgICAgICAgICAgICAgICAgICAgIEl2YW4gRGFub3YgPGlkYW5vdkBnbWFpbC5jb20+CisgKiAgICAgICAgICAgICAgICAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgogICoKLSAqIENyZWF0ZWQ6ICAgICAgMjAwNwotICogRGVzY3JpcHRpb246ICBCb2FyZCBpbmZvIGZpbGUgZm9yIHRoZSBJUDA0L0lQMDggYm9hcmRzLCB3aGljaAotICogICAgICAgICAgICAgICBhcmUgZGVyaXZlZCBmcm9tIHRoZSBCbGFja2Zpbk9uZSBWMi4wIGJvYXJkcy4KLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ09weXJpZ2h0IDIwMDcgRGF2aWQgUm93ZQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNiBJbnRyYXRyYWRlIEx0ZC4KLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xNDUsNyArMTIzLDYgQEAKIAkuY3RsX3JlZyA9IDB4MTAwMCwJCS8qIENQT0w9MCxDUEhBPTAsU2FuZGlzayAxRyB3b3JrICovCiAJLmVuYWJsZV9kbWEgPSAwLAkJLyogaWYgMSAtIGJsb2NrISEhICovCiAJLmJpdHNfcGVyX3dvcmQgPSA4LAotCS5jc19jaGFuZ2VfcGVyX3dvcmQgPSAwLAogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKaW5kZXggNzI5ZmQ3Yy4uODJmNzBlZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwpAQCAtMSwzMSArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvc3RhbXAuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZXpraXQuYwotICogQXV0aG9yOiAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgICAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KICAqCi0gKiBDcmVhdGVkOiAgICAgIDIwMDUKLSAqIERlc2NyaXB0aW9uOiAgQm9hcmQgSW5mbyBGaWxlIGZvciB0aGUgQkY1MzMtU1RBTVAKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTk1LDEyICs3Myw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fNzM5M19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2ZiX2FkdjczOTNfZGV2aWNlID0gewotCS5uYW1lID0gImJmaW4tYWR2NzM5MyIsCi19OwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3MikgfHwgZGVmaW5lZChDT05GSUdfVVNCX05FVDIyNzJfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBuZXQyMjcyX2JmaW5fcmVzb3VyY2VzW10gPSB7CiAJewpAQCAtNDM2LDE5ICs0MDgsNiBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0gewotCS5zdGFydCA9IDAsCi0JLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKLQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0gewotCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKLQkuaWQgPSAtMSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi0JLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAotfTsKLQogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19HUElPKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfR1BJT19NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KIApAQCAtNDg3LDYgKzQ0NiwxMSBAQAogCQkuaXJxID0gMzksCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fNzM5MykgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJiZmluLWFkdjczOTMiLCAweDJCKSwKKwl9LAorI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNjbGtfdmxldl9kYXRhc2hlZXRbXSA9CkBAIC01MjgsMTAgKzQ5Miw2IEBACiAJJnNtYzkxeF9kZXZpY2UsCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fNzM5MykgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzX01PRFVMRSkKLQkmYmZpbl9mYl9hZHY3MzkzX2RldmljZSwKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX05FVDIyNzIpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9ORVQyMjcyX01PRFVMRSkKIAkmbmV0MjI3Ml9iZmluX2RldmljZSwKICNlbmRpZgpAQCAtNTYzLDggKzUyMyw2IEBACiAJJmkyY19ncGlvX2RldmljZSwKICNlbmRpZgogCi0JJmJmaW5fZ3Bpb3NfZGV2aWNlLAotCiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0JGSU5fQVNZTkMpIHx8IGRlZmluZWQoQ09ORklHX01URF9CRklOX0FTWU5DX01PRFVMRSkKIAkmc3RhbXBfZmxhc2hfZGV2aWNlLAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMKaW5kZXggN2E0NDNjMy4uNGExNGE0NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9kbWEuYwpAQCAtMSwzMSArMSwxMSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzaW1wbGUgRE1BIEltcGxlbWVudGF0aW9uIGZvciBCbGFja2ZpbgorICogQ29weXJpZ2h0IDIwMDctMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZjUzMy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZjUzMy5oCmluZGV4IGNmNDQyN2MuLmUzZTA1ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmY1MzMuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmNTMzLmgKQEAgLTEsMzAgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzMy9iZjUzMy5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIFNZU1RFTSBNTVIgUkVHSVNURVIgQU5EIE1FTU9SWSBNQVAgRk9SIEFEU1AtQkY1NjEKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBTWVNURU0gTU1SIFJFR0lTVEVSIEFORCBNRU1PUlkgTUFQIEZPUiBBRFNQLUJGNTYxCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfX01BQ0hfQkY1MzNfSF9fCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCA2OTY1YjQwLi45ZTFmM2RlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTEsMzIgKzEsNyBAQAogLyoKLSAqIGZpbGU6ICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTMzL2JmaW5fc2VyaWFsXzV4eC5oCi0gKiBiYXNlZCBvbjoKLSAqIGF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIGNyZWF0ZWQ6Ci0gKiBkZXNjcmlwdGlvbjoKLSAqCWJsYWNrZmluIHNlcmlhbCBkcml2ZXIgaGVhZCBmaWxlCi0gKiByZXY6Ci0gKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IDQ5OWU4OTcuLmY0YmQ2ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzMy9ibGFja2Zpbi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaWZuZGVmIF9NQUNIX0JMQUNLRklOX0hfCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9jZGVmQkY1MzIuaAppbmRleCBiYmMzYzgzLi5mZWIyMzkyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvY2RlZkJGNTMyLmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzMy9jZGVmQkY1MzIuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2lmbmRlZiBfQ0RFRl9CRjUzMl9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RlZkJGNTMyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RlZkJGNTMyLmgKaW5kZXggN2Y0NjMzMi4uMDJiMzI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9kZWZCRjUzMi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZGVmQkY1MzIuaApAQCAtMSw0OCArMSwxMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIFB1YmxpYwotICogTGljZW5zZS4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIE5vbi1HUEwgTGljZW5zZSBhbHNvIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIFZpc3VhbERTUCsrCi0gKiBodHRwOi8vd3d3LmFuYWxvZy5jb20vcHJvY2Vzc29ycy9yZXNvdXJjZXMvY3Jvc3Njb3JlL3Zpc3VhbERzcERldlNvZnR3YXJlLmh0bWwKLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDEtMjAwNSBBbmFsb2cgRGV2aWNlcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKgotICogVGhpcyBmaWxlIHVuZGVyIHNvdXJjZSBjb2RlIGNvbnRyb2wsIHBsZWFzZSBzZW5kIGJ1Z3Mgb3IgY2hhbmdlcyB0bzoKLSAqIGRzcHRvb2xzLnN1cHBvcnRAYW5hbG9nLmNvbQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTMzL2RlZkJGNTMyLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogU3lzdGVtICYgTU1SIGJpdCBhbmQgQWRkcmVzcyBkZWZpbml0aW9ucyBmb3IgQURTUC1CRjUzMgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwotLyogU1lTVEVNICYgTU0gUkVHSVNURVIgQklUICYgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUzMiAqLwogCiAjaWZuZGVmIF9ERUZfQkY1MzJfSAogI2RlZmluZSBfREVGX0JGNTMyX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggZTQ1YzE3MC4uMmFmMTlkNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEsNyArMSw0IEBACiAvKgotICogRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKLSAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKICAqIENvcHlyaWdodCAoQykgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2lycS5oCmluZGV4IGRiMWUzNDYuLmMzMTQ5OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTMzL2RlZkJGNTMyLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNpZm5kZWYgX0JGNTMzX0lSUV9IXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9wb3J0bXV4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL3BvcnRtdXguaAppbmRleCAyZjU5Y2UwLi4wNzVkYWUxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL3BvcnRtdXguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL3BvcnRtdXguaApAQCAtMSwzICsxLDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKKyAqLworCiAjaWZuZGVmIF9NQUNIX1BPUlRNVVhfSF8KICNkZWZpbmUgX01BQ0hfUE9SVE1VWF9IXwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2ludHMtcHJpb3JpdHkuYwppbmRleCBmNTE5OTRiLi44ZjcxNGNmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW50cy1wcmlvcml0eS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbnRzLXByaW9yaXR5LmMKQEAgLTEsMzAgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2ludHMtcHJpb3JpdHkuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIE1pY2hhZWwgSGVubmVyaWNoCisgKiBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCiAgKgotICogQ3JlYXRlZDogICAgICA/Ci0gKiBEZXNjcmlwdGlvbjogIFNldCB1cCB0aGUgaW50ZXJydXB0IHByaW9yaXRpZXMKKyAqIENvcHlyaWdodCAyMDA1LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN2UuYwppbmRleCA4N2FjYjdkLi5jODVmNGQ3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzdlLmMKQEAgLTEsMzEgKzEsMTAgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzcuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKLSAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgIDIwMDgtMjAwOSBCbHVldGVjaG5peAorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgotICogQ3JlYXRlZDogICAgICAyMDA1Ci0gKiBEZXNjcmlwdGlvbjogIEJvYXJkIGRlc2NyaXB0aW9uIGZpbGUKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTI5NywxOSArMjc2LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKLQkuc3RhcnQgPSAwLAotCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKLQkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCi0JLmlkID0gLTEsCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKLX07Ci0KICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjbV9wYXJ0aXRpb25zW10gPSB7CiAJewpAQCAtNjk5LDggKzY2NSw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUikgfHwgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUl9NT0RVTEUpCiAJJmNtX2ZsYXNoX2RldmljZSwKICNlbmRpZgotCi0JJmJmaW5fZ3Bpb3NfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY21fYmY1MzdlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3dS5jCmluZGV4IDgyMTlkYzMuLmVhMTFhYTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYwpAQCAtMSwzMSArMSwxMCBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKLSAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgIDIwMDgtMjAwOSBCbHVldGVjaG5peAorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgotICogQ3JlYXRlZDogICAgICAyMDA1Ci0gKiBEZXNjcmlwdGlvbjogIEJvYXJkIGRlc2NyaXB0aW9uIGZpbGUKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTI5OCwxOSArMjc3LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKLQkuc3RhcnQgPSAwLAotCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKLQkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCi0JLmlkID0gLTEsCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKLX07Ci0KICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjbV9wYXJ0aXRpb25zW10gPSB7CiAJewpAQCAtNjA1LDggKzU3MSw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUikgfHwgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUl9NT0RVTEUpCiAJJmNtX2ZsYXNoX2RldmljZSwKICNlbmRpZgotCi0JJmJmaW5fZ3Bpb3NfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY21fYmY1Mzd1X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYwppbmRleCAzOTlmODFkLi4wZGE5MjcyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCkBAIC0xLDQgKzEsMTAgQEAKIC8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAyMDA4LTIwMDkgQ2FtYnJpZGdlIFNpZ25hbCBQcm9jZXNzaW5nCisgKiAgICAgICAgICAgICAgICAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKaW5kZXggMTBiMzViOC4uOWJhMjkwNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCkBAIC0xLDMxICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKLSAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMzAyLDcgKzI4MCw2IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzcpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3N19NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7Ci0JLmNzX2NoYW5nZV9wZXJfd29yZCA9IDAsCiAJLmVuYWJsZV9kbWEgPSAwLAogCS5iaXRzX3Blcl93b3JkID0gMTYsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCmluZGV4IDlkYjZiNDAuLmM0NmJhYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKQEAgLTEsMzEgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYwotICogQXV0aG9yOiAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgICAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xMjEsMTkgKzk5LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKLQkuc3RhcnQgPSAwLAotCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKLQkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCi0JLmlkID0gLTEsCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKLX07Ci0KICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0NGUENNQ0lBKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0NGUENNQ0lBX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9wY21jaWFfY2ZfcmVzb3VyY2VzW10gPSB7CiAJewpAQCAtMTA3OCwxMiArMTA0Myw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fNzM5M19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2ZiX2FkdjczOTNfZGV2aWNlID0gewotCS5uYW1lID0gImJmaW4tYWR2NzM5MyIsCi19OwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMV9NT0RVTEUpCiAjaW5jbHVkZSA8YXNtL2JmaW4tbHEwMzVxMS5oPgogCkBAIC0xNDk4LDYgKzE0NTcsMTEgQEAKIAkJLnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSZhZHA1NTg4X2dwaW9fZGF0YSwKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTNfTU9EVUxFKQorCXsKKwkJSTJDX0JPQVJEX0lORk8oImJmaW4tYWR2NzM5MyIsIDB4MkIpLAorCX0sCisjZW5kaWYKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQpAQCAtMTY2OCwxMCArMTYzMiw2IEBACiAJJmJmaW5fbHEwMzVxMV9kZXZpY2UsCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fNzM5MykgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzX01PRFVMRSkKLQkmYmZpbl9mYl9hZHY3MzkzX2RldmljZSwKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKIAkmYmZpbl91YXJ0X2RldmljZSwKICNlbmRpZgpAQCAtMTcwMiw4ICsxNjYyLDYgQEAKIAkmYmZpbl9kZXZpY2VfZ3Bpb2tleXMsCiAjZW5kaWYKIAotCSZiZmluX2dwaW9zX2RldmljZSwKLQogI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX1BMQVRGT1JNKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9QTEFURk9STV9NT0RVTEUpCiAJJmJmaW5fYXN5bmNfbmFuZF9kZXZpY2UsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCmluZGV4IDYxMzUzZjcuLjU3MTYzYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYwpAQCAtMSwzMSArMSwxMCBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTM3LmMKLSAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgIDIwMDgtMjAwOSBCbHVldGVjaG5peAorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgotICogQ3JlYXRlZDogICAgICAyMDA1Ci0gKiBEZXNjcmlwdGlvbjogIEJvYXJkIGRlc2NyaXB0aW9uIGZpbGUKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTI5OCwxOSArMjc3LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKLQkuc3RhcnQgPSAwLAotCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKLQkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCi0JLmlkID0gLTEsCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKLX07Ci0KICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjbV9wYXJ0aXRpb25zW10gPSB7CiAJewpAQCAtNjA3LDggKzU3Myw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUikgfHwgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUl9NT0RVTEUpCiAJJmNtX2ZsYXNoX2RldmljZSwKICNlbmRpZgotCi0JJmJmaW5fZ3Bpb3NfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdGNtX2JmNTM3X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuYwppbmRleCBkMjNmYzBlLi41YzhjNGVkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5jCkBAIC0xLDMxICsxLDExIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzaW1wbGUgRE1BIEltcGxlbWVudGF0aW9uIGZvciBCbGFja2ZpbgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KICAqLworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmY1MzcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmY1MzcuaAppbmRleCBmMTk0YTg0Li4xN2ZhYjQ0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmNTM3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZjUzNy5oCkBAIC0xLDMwICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvYmY1MzcuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIGFuZCBtZW1vcnkgbWFwIGZvciBBRFNQLUJGNTM3CiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgU1lTVEVNIE1NUiBSRUdJU1RFUiBBTkQgTUVNT1JZIE1BUCBGT1IgQURTUC1CRjUzNworICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX19NQUNIX0JGNTM3X0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggZTk1ZDU0Zi4uNjM1YzkxYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBmaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvYmZpbl9zZXJpYWxfNXh4LmgKLSAqIGJhc2VkIG9uOgotICogYXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDYtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogY3JlYXRlZDoKLSAqIGRlc2NyaXB0aW9uOgotICoJYmxhY2tmaW4gc2VyaWFsIGRyaXZlciBoZWFkZXIgZmlsZXMKLSAqIHJldjoKLSAqCi0gKiBtb2RpZmllZDoKLSAqCi0gKgotICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKLSAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KLSAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKLSAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggOWVlODgzNC4uZWFiMDA2ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMSwzMiArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2JsYWNrZmluLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDUtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaWZuZGVmIF9NQUNIX0JMQUNLRklOX0hfCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzQuaAppbmRleCA1ZjhiNWY4Li45MTgyNWM5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM0LmgKQEAgLTEsMzIgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzNy9jZGVmYmY1MzQuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTM0X0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM3LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNy5oCmluZGV4IGI4ZmM5NDkuLjkzNjNjMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzcuaApAQCAtMSwzMiArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2NkZWZCRjUzNy5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCVN5c3RlbSBNTVIgUmVnaXN0ZXIgTWFwCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAogI2lmbmRlZiBfQ0RFRl9CRjUzN19ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM0LmgKaW5kZXggYTMyMjdmOS4uY2ViYjE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzQuaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2NkZWZCRjUzNy5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogI2lmbmRlZiBfREVGX0JGNTM0X0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzcuaAppbmRleCAzZDZjODNlLi44Y2I1ZDVjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNy5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBmaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvZGVmYmY1MzcuaAotICogYmFzZWQgb246Ci0gKiBhdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBjcmVhdGVkOgotICogZGVzY3JpcHRpb246Ci0gKglzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAotICogcmV2OgotICoKLSAqIG1vZGlmaWVkOgotICoKLSAqCi0gKiBidWdzOiAgICAgICAgIGVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgd2l0aG91dCBhbnkgd2FycmFudHk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgc2VlIHRoZQotICogZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBjb3B5aW5nLgotICogaWYgbm90LCB3cml0ZSB0byB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uLAotICogNTkgdGVtcGxlIHBsYWNlIC0gc3VpdGUgMzMwLCBib3N0b24sIG1hIDAyMTExLTEzMDcsIHVzYS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaWZuZGVmIF9ERUZfQkY1MzdfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBkNzdhMzFlLi4xMDRiZmY4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSw3ICsxLDQgQEAKIC8qCi0gKiBGaWxlOiBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaAotICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgogICogQ29weXJpZ2h0IChDKSAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvaXJxLmgKaW5kZXggYjJhNzFkNS4uMGRlZmE5NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBmaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvaXJxLmgKLSAqIGJhc2VkIG9uOgotICogYXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogY3JlYXRlZDoKLSAqIGRlc2NyaXB0aW9uOgotICoJc3lzdGVtIG1tciByZWdpc3RlciBtYXAKLSAqIHJldjoKLSAqCi0gKiBtb2RpZmllZDoKLSAqCi0gKgotICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKLSAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KLSAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKLSAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCiAjaWZuZGVmIF9CRjUzN19JUlFfSF8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvcG9ydG11eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKaW5kZXggODcyODVlNy4uZGE5NzYwMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDctMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCisgKi8KKwogI2lmbmRlZiBfTUFDSF9QT1JUTVVYX0hfCiAjZGVmaW5lIF9NQUNIX1BPUlRNVVhfSF8KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2ludHMtcHJpb3JpdHkuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbnRzLXByaW9yaXR5LmMKaW5kZXggNTFjNDgwOC4uZjY1MDA2MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2ludHMtcHJpb3JpdHkuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW50cy1wcmlvcml0eS5jCkBAIC0xLDMwICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbnRzLXByaW9yaXR5LmMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2ludHMtcHJpb3JpdHkuYwotICogQXV0aG9yOiAgICAgICBNaWNoYWVsIEhlbm5lcmljaAorICogQ29weXJpZ2h0IDIwMDUtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcworICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIFNldCB1cCB0aGUgaW50ZXJydXB0IHByaW9yaXRpZXMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKaW5kZXggZjJhYzNiMC4uMTRhZjVjMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYwpAQCAtMSwzMSArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9lemtpdC5jCi0gKiBBdXRob3I6ICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAgICAgIDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCisgKiAgICAgICAgICAgICAgICAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMjM3LDcgKzIxNSw2IEBACiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCiAJLmJpdHNfcGVyX3dvcmQgPSA4LAotCS5jc19jaGFuZ2VfcGVyX3dvcmQgPSAwLAogfTsKICNlbmRpZgogCkBAIC01MDYsMTkgKzQ4Myw2IEBACiAjZW5kaWYKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0gewotCS5zdGFydCA9IDAsCi0JLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKLQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0gewotCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKLQkuaWQgPSAtMSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi0JLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAotfTsKLQogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogCkBAIC02NTgsOCArNjIyLDYgQEAKIAkmYmZpbl9kZXZpY2VfZ3Bpb2tleXMsCiAjZW5kaWYKIAotCSZiZmluX2dwaW9zX2RldmljZSwKLQogI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCiAJJmV6a2l0X2ZsYXNoX2RldmljZSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2RtYS5jCmluZGV4IGQ2ODM3ZmIuLjVkYzAyMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMKQEAgLTEsMzEgKzEsMTEgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9kbWEuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCisgKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmY1MzguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmY1MzguaAppbmRleCA5YzhhYmIzLi4wY2Y1YmY4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmNTM4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZjUzOC5oCkBAIC0xLDMwICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvYmY1MzguaAotICogQmFzZWQgb246CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvYmY1MzcuaAotICogQXV0aG9yOglNaWNoYWVsIEhlbm5lcmljaCAobWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbSkKKyAqIFNZU1RFTSBNTVIgUkVHSVNURVIgQU5EIE1FTU9SWSBNQVAgRk9SIEFEU1AtQkY1MzgKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBTWVNURU0gTU1SIFJFR0lTVEVSIEFORCBNRU1PUlkgTUFQIEZPUiBBRFNQLUJGNTI3CisgKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX19NQUNIX0JGNTM4X0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggOTk5ZjIzOS4uNWMxNDgxNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBmaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvYmZpbl9zZXJpYWxfNXh4LmgKLSAqIGJhc2VkIG9uOgotICogYXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogY3JlYXRlZDoKLSAqIGRlc2NyaXB0aW9uOgotICoJYmxhY2tmaW4gc2VyaWFsIGRyaXZlciBoZWFkZXIgZmlsZXMKLSAqIHJldjoKLSAqCi0gKiBtb2RpZmllZDoKLSAqCi0gKgotICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKLSAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KLSAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKLSAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IDVlY2VlMTYuLjI3OGU4OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTEsMzIgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzOC9ibGFja2Zpbi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX01BQ0hfQkxBQ0tGSU5fSF8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2NkZWZCRjUzOC5oCmluZGV4IDFkZTY3NTEuLjQwMWViZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzguaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2NkZWZCRjUzOC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQ0RFRl9CRjUzOF9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmgKaW5kZXggMWM1ODkxNC4uNWY2YzM0ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZGVmQkY1MzkuaApAQCAtMSw0NyArMSw5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgUHVibGljCi0gKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogTm9uLUdQTCBMaWNlbnNlIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgVmlzdWFsRFNQKysKLSAqIGh0dHA6Ly93d3cuYW5hbG9nLmNvbS9wcm9jZXNzb3JzL3Jlc291cmNlcy9jcm9zc2NvcmUvdmlzdWFsRHNwRGV2U29mdHdhcmUuaHRtbAotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMS0yMDA1IEFuYWxvZyBEZXZpY2VzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiBUaGlzIGZpbGUgdW5kZXIgc291cmNlIGNvZGUgY29udHJvbCwgcGxlYXNlIHNlbmQgYnVncyBvciBjaGFuZ2VzIHRvOgotICogZHNwdG9vbHMuc3VwcG9ydEBhbmFsb2cuY29tCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvZGVmQkY1MzkuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCisKIC8qIFNZU1RFTSAmIE1NIFJFR0lTVEVSIEJJVCAmIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MzgvOSAqLwogCiAjaWZuZGVmIF9ERUZfQkY1MzlfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAzMGY0ZjcyLi4yOTVjNzhhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSw3ICsxLDQgQEAKIC8qCi0gKiBGaWxlOiBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaAotICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgogICogQ29weXJpZ2h0IChDKSAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvaXJxLmgKaW5kZXggZmRjODdmZS4uYTRiN2ZjYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBmaWxlOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2lycS5oCi0gKiBiYXNlZCBvbjoJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzNy9pcnEuaAotICogYXV0aG9yOglNaWNoYWVsIEhlbm5lcmljaCAobWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbSkKKyAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBjcmVhdGVkOgotICogZGVzY3JpcHRpb246Ci0gKglzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAotICogcmV2OgotICoKLSAqIG1vZGlmaWVkOgotICoKLSAqCi0gKiBidWdzOiAgICAgICAgIGVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgd2l0aG91dCBhbnkgd2FycmFudHk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgc2VlIHRoZQotICogZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBjb3B5aW5nLgotICogaWYgbm90LCB3cml0ZSB0byB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uLAotICogNTkgdGVtcGxlIHBsYWNlIC0gc3VpdGUgMzMwLCBib3N0b24sIG1hIDAyMTExLTEzMDcsIHVzYS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9CRjUzOF9JUlFfSF8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKaW5kZXggYzhkYjI2NC4uNjEyMWNmOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKICNpZm5kZWYgX01BQ0hfUE9SVE1VWF9IXwogI2RlZmluZSBfTUFDSF9QT1JUTVVYX0hfCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW50cy1wcmlvcml0eS5jCmluZGV4IDcwZDE3ZTUuLjFmYTc5M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2ludHMtcHJpb3JpdHkuYwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW50cy1wcmlvcml0eS5jCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbnRzLXByaW9yaXR5LmMKLSAqIEF1dGhvcjogICAgICAgTWljaGFlbCBIZW5uZXJpY2gKKyAqIFNldCB1cCB0aGUgaW50ZXJydXB0IHByaW9yaXRpZXMKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCisgKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKaW5kZXggZTU2NWFhZS4uY2NkY2Q2ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYwpAQCAtMSwzMSArMSwxMCBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZXpraXQuYwotICogQXV0aG9yOiAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgMjAwOC0yMDA5IEJsdWV0ZWNobml4CisgKiAgICAgICAgICAgICAgICAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0zODAsMTkgKzM1OSw2IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7Ci0JLnN0YXJ0ID0gMCwKLQkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAotCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic2ltcGxlLWdwaW8iLAotCS5pZCA9IC0xLAotCS5udW1fcmVzb3VyY2VzID0gMSwKLQkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCi19OwotCiAjaWYgZGVmaW5lZChDT05GSUdfUEFUQV9CRjU0WCkgfHwgZGVmaW5lZChDT05GSUdfUEFUQV9CRjU0WF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fYXRhcGlfcmVzb3VyY2VzW10gPSB7CiAJewpAQCAtNTQ2LDEzICs1MTIsMTEgQEAKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KIAkuYml0c19wZXJfd29yZCA9IDgsCi0JLmNzX2NoYW5nZV9wZXJfd29yZCA9IDAsCiB9OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzcpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3N19NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7Ci0JLmNzX2NoYW5nZV9wZXJfd29yZCA9IDAsCiAJLmVuYWJsZV9kbWEgPSAwLAogCS5iaXRzX3Blcl93b3JkID0gMTYsCiB9OwpAQCAtODUzLDggKzgxNyw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKIAkmcGFyYV9mbGFzaF9kZXZpY2UsCiAjZW5kaWYKLQotCSZiZmluX2dwaW9zX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtX2JmNTQ4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwppbmRleCBjNjZmMzgwLi4xYTUyODZiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCkBAIC0xLDMxICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2V6a2l0LmMKLSAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMjA4LDcgKzE4Niw2IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX0FEWEwzNFgpIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX0FEWEwzNFhfTU9EVUxFKQotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2FkeGwzNHguaD4KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWR4bDM0eF9wbGF0Zm9ybV9kYXRhIGFkeGwzNHhfaW5mbyA9IHsKIAkueF9heGlzX29mZnNldCA9IDAsCkBAIC02MzYsNyArNjEzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KIAkuYml0c19wZXJfd29yZCA9IDgsCi0JLmNzX2NoYW5nZV9wZXJfd29yZCA9IDAsCiB9OwogI2VuZGlmCiAKQEAgLTY1MCw3ICs2MjYsNiBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3KSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzdfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZDc4NzdfY2hpcF9pbmZvID0gewotCS5jc19jaGFuZ2VfcGVyX3dvcmQgPSAwLAogCS5lbmFibGVfZG1hID0gMCwKIAkuYml0c19wZXJfd29yZCA9IDE2LAogfTsKQEAgLTY4MSw3ICs2NTYsNiBAQAogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZHhsMzR4X2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCiAJLmJpdHNfcGVyX3dvcmQgPSA4LAotCS5jc19jaGFuZ2VfcGVyX3dvcmQgPSAwLAogfTsKICNlbmRpZgogCkBAIC05MDgsMTkgKzg4Miw2IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7Ci0JLnN0YXJ0ID0gMCwKLQkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAotCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic2ltcGxlLWdwaW8iLAotCS5pZCA9IC0xLAotCS5udW1fcmVzb3VyY2VzID0gMSwKLQkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCi19OwotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNjbGtfdmxldl9kYXRhc2hlZXRbXSA9CiB7CiAvKgpAQCAtMTAyOCw4ICs5ODksNiBAQAogCSZiZmluX2RldmljZV9ncGlva2V5cywKICNlbmRpZgogCi0JJmJmaW5fZ3Bpb3NfZGV2aWNlLAotCiAjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKIAkmZXpraXRfZmxhc2hfZGV2aWNlLAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMKaW5kZXggZDkyMzliYy4uMDM5YTZkOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuYwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzaW1wbGUgRE1BIEltcGxlbWVudGF0aW9uIGZvciBCbGFja2ZpbgorICogQ29weXJpZ2h0IDIwMDctMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NDguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NDguaAppbmRleCBjZDMxZjcyLi43YmVhZDVjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmNTQ4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0OC5oCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvYmY1NDguaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBTeXN0ZW0gTU1SIHJlZ2lzdGVyIGFuZCBtZW1vcnkgbWFwIGZvciBBRFNQLUJGNTQ4Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX19NQUNIX0JGNTQ4X0hfXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0eC1scTA0My5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0eC1scTA0My5oCmluZGV4IDljN2NhNjIuLjg4MjFlZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NHgtbHEwNDMuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmNTR4LWxxMDQzLmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKICNpZm5kZWYgQkY1NFhfTFEwNDNfSAogI2RlZmluZSBCRjU0WF9MUTA0M19ICiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NHhfa2V5cy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0eF9rZXlzLmgKaW5kZXggMWZiNGVjNy4uNDkzMzhhZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0eF9rZXlzLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0eF9rZXlzLmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKICNpZm5kZWYgX0JGSU5fS1BBRF9ICiAjZGVmaW5lIF9CRklOX0tQQURfSAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCAyZDFiNWZhLi5kZDQ0YWE3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTEsMzIgKzEsNyBAQAogLyoKLSAqIGZpbGU6ICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2JmaW5fc2VyaWFsXzV4eC5oCi0gKiBiYXNlZCBvbjoKLSAqIGF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIGNyZWF0ZWQ6Ci0gKiBkZXNjcmlwdGlvbjoKLSAqCWJsYWNrZmluIHNlcmlhbCBkcml2ZXIgaGVhZCBmaWxlCi0gKiByZXY6Ci0gKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCAzMTg2NjdiLi4xMzMwMmI2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvYmxhY2tmaW4uaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9NQUNIX0JMQUNLRklOX0hfCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Mi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDIuaAppbmRleCAwN2FlZmI5Li40MmY0YTk0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Mi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQyLmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9jZGVmQkY1NDIuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1NDJfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ0LmgKaW5kZXggNDMxYTY5Mi4uMjIwNzc5OSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDQuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0NC5oCkBAIC0xLDMxICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvY2RlZkJGNTQ0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTQ0X0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ3LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Ny5oCmluZGV4IDkzMzc2ZTkuLjQyMzQyMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDcuaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2NkZWZCRjU0Ny5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1NDhfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ4LmgKaW5kZXggOWNkNzQzOC4uZGY4NDE4MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0OC5oCkBAIC0xLDMxICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvY2RlZkJGNTQ4LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTQ4X0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0OS5oCmluZGV4IGVhZDM2MGIuLjM0Yzg0YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDkuaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ5L2NkZWZCRjU0OS5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQ0RFRl9CRjU0OV9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmgKaW5kZXggNmU2MzZjNC4uYTJlOWQ5OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NHhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTR4X2Jhc2UuaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2NkZWZCRjU0eF9iYXNlLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTRYX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDIuaAppbmRleCBiMTMxNjU0Li5kM2JjNmQxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Mi5oCkBAIC0xLDMxICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvZGVmQkY1NDIuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpZm5kZWYgX0RFRl9CRjU0Ml9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ0LmgKaW5kZXggYzJjNzg1Yi4uZGQ0MTRhZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0NC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDQuaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2RlZkJGNTQ0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaWZuZGVmIF9ERUZfQkY1NDRfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Ny5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Ny5oCmluZGV4IDY2MWYwZDguLjVhOWRiYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ3LmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9kZWZCRjU0Ny5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpZm5kZWYgX0RFRl9CRjU0OF9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ4LmgKaW5kZXggODVkNGJhZC4uODJjZDU5MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDguaApAQCAtMSwzMSArMSw3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2RlZkJGNTQ4LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaWZuZGVmIF9ERUZfQkY1NDhfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OS5oCmluZGV4IDA5NjczNDUuLjZmYzZlMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ5LmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9kZWZCRjU0OS5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogI2lmbmRlZiBfREVGX0JGNTQ5X0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NHhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0eF9iYXNlLmgKaW5kZXggZTAyMmU4OS4uODU5MGM4YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0eF9iYXNlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0eF9iYXNlLmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9kZWZCRjU0eF9iYXNlLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaWZuZGVmIF9ERUZfQkY1NFhfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAzYTIwNTE3Li44NTBlMzlkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSwzNCArMSw4IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2dwaW8uaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CSBNaWNoYWVsIEhlbm5lcmljaCAoaGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnKQotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCi0KLQogI2RlZmluZSBHUElPX1BBMAkwCiAjZGVmaW5lIEdQSU9fUEExCTEKICNkZWZpbmUgR1BJT19QQTIJMgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmgKaW5kZXggZjE5NDYyNS4uMTA2ZGIwNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC0xLDMyICsxLDcgQEAKIC8qCi0gKiBmaWxlOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2lycS5oCi0gKiBiYXNlZCBvbjoJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzNy9pcnEuaAotICogYXV0aG9yOglSb3kgSHVhbmcgKHJveS5odWFuZ0BhbmFsb2cuY29tKQorICogQ29weXJpZ2h0IDIwMDctMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogY3JlYXRlZDoKLSAqIGRlc2NyaXB0aW9uOgotICoJc3lzdGVtIG1tciByZWdpc3RlciBtYXAKLSAqIHJldjoKLSAqCi0gKiBtb2RpZmllZDoKLSAqCi0gKgotICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKLSAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KLSAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKLSAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQkY1NDhfSVJRX0hfCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCmluZGV4IGNlMzcyYmEuLjg5YWQ2YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCiAjaWZuZGVmIF9NQUNIX1BPUlRNVVhfSF8KICNkZWZpbmUgX01BQ0hfUE9SVE1VWF9IXwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2ludHMtcHJpb3JpdHkuYwppbmRleCA5ZGQwZmEzLi40OGRkM2E0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW50cy1wcmlvcml0eS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbnRzLXByaW9yaXR5LmMKQEAgLTEsMzAgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2ludHMtcHJpb3JpdHkuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW50cy1wcmlvcml0eS5jCi0gKiBBdXRob3I6ICAgICAgIE1pY2hhZWwgSGVubmVyaWNoCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcwogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUwppbmRleCA5NDM5YmM2Li4wMjYxYTVlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYXRvbWljLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TCkBAIC0xLDIzICsxLDggQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUwotICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgUGhpbGlwcGUgR2VydW0gPHJwbUB4ZW5vbWFpLm9yZz4KICAqCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwppbmRleCA2NTc3ZWNmLi5kZmM4ZDViIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCkBAIC0xLDMwICsxLDEwIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTYxLmMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCi0gKiBBdXRob3I6ICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+IENvcHlyaWdodCAyMDA1CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAgICAgMjAwOC0yMDA5IEJsdWV0ZWNobml4CisgKiAgICAgICAgICAgICAgIDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCisgKiAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KICAqCi0gKiBDcmVhdGVkOiAgICAgIDIwMDYKLSAqIERlc2NyaXB0aW9uOiAgQm9hcmQgZGVzY3JpcHRpb24gZmlsZQotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0yODUsMTkgKzI2NSw2IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7Ci0JLnN0YXJ0ID0gMCwKLQkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAotCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic2ltcGxlLWdwaW8iLAotCS5pZCA9IC0xLAotCS5udW1fcmVzb3VyY2VzID0gMSwKLQkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCi19OwotCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpc3AxMzYyX2hjZF9yZXNvdXJjZXNbXSA9IHsKIAl7CkBAIC01MzIsOCArNDk5LDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUCkgfHwgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVBfTU9EVUxFKQogCSZwYXJhX2ZsYXNoX2RldmljZSwKICNlbmRpZgotCi0JJmJmaW5fZ3Bpb3NfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY21fYmY1NjFfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCmluZGV4IGNhZWQ5NmIuLjllMmQ4Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKQEAgLTEsMzAgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2V6a2l0LmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgIDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCisgKiAgICAgICAgICAgICAgICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTM4NywxOSArMzY2LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKLQkuc3RhcnQgPSAwLAotCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKLQkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCi0JLmlkID0gLTEsCi0JLm51bV9yZXNvdXJjZXMgPSAxLAotCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKLX07Ci0KICNpZiBkZWZpbmVkKENPTkZJR19JMkNfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfSTJDX0dQSU9fTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAKQEAgLTQ5Myw4ICs0NTksNiBAQAogCSZpc3AxMzYyX2hjZF9kZXZpY2UsCiAjZW5kaWYKIAotCSZiZmluX2dwaW9zX2RldmljZSwKLQogI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCiAJJmV6a2l0X2ZsYXNoX2RldmljZSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jCmluZGV4IDZmNzdkYmUuLjhiYTcyNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMKQEAgLTEsMTUgKzEsMTMgQEAKIC8qCi0gKiAgRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3RlcGxhLmMKKyAqIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICAgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CiAgKgotICogIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICogIE9ubHkgU01TQzkxQzExMTEgd2FzIHJlZ2lzdGVyZWQsIG1heSBkbyBtb3JlIGxhdGVyLgorICogVGhhbmtzIHRvIEphbWV5IEhpY2tzLgogICoKLSAqICBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSksIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+Ci0gKiAgVGhhbmtzIHRvIEphbWV5IEhpY2tzLgorICogT25seSBTTVNDOTFDMTExMSB3YXMgcmVnaXN0ZXJlZCwgbWF5IGRvIG1vcmUgbGF0ZXIuCiAgKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9jb3JlYi5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2NvcmViLmMKaW5kZXggOTM2MzVhNy4uMWU2MGE5MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2NvcmViLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2NvcmViLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb3JlYl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29yZWJfZm9wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAogCS5pb2N0bCAgID0gY29yZWJfaW9jdGwsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jCmluZGV4IDQyYjAwMzcuLmM5MzhjM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvZG1hLmMKQEAgLTEsMzEgKzEsMTEgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmNTYxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmNTYxLmgKaW5kZXggOTk2ODM2Mi4uOWY5YTM2NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZjU2MS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmY1NjEuaApAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTYxL2JmNTYxLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogU1lTVEVNIE1NUiBSRUdJU1RFUiBBTkQgTUVNT1JZIE1BUCBGT1IgQURTUC1CRjU2MQogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIFNZU1RFTSBNTVIgUkVHSVNURVIgQU5EIE1FTU9SWSBNQVAgRk9SIEFEU1AtQkY1NjEKKyAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9fTUFDSF9CRjU2MV9IX18KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCmluZGV4IGZkNWU4ODcuLmUzM2UxNTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaApAQCAtMSwzMiArMSw3IEBACiAvKgotICogZmlsZTogICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NjEvYmZpbl9zZXJpYWxfNXh4LmgKLSAqIGJhc2VkIG9uOgotICogYXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDYtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogY3JlYXRlZDoKLSAqIGRlc2NyaXB0aW9uOgotICoJYmxhY2tmaW4gc2VyaWFsIGRyaXZlciBoZWFkIGZpbGUKLSAqIHJldjoKLSAqCi0gKiBtb2RpZmllZDoKLSAqCi0gKgotICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKLSAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KLSAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKLSAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IDhiZTMxMzUuLjY3ZDZiZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTEsMzEgKzEsNyBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU2MS9ibGFja2Zpbi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9CTEFDS0ZJTl9IXwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvY2RlZkJGNTYxLmgKaW5kZXggOWQ5ODU4Yy4uODFlY2RiNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2NkZWZCRjU2MS5oCkBAIC0xLDMxICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NjEvY2RlZkJGNTYxLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDUtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgQyBQT0lOVEVSUyBUTyBTWVNURU0gTU1SIFJFR0lTVEVSIEFORCBNRU1PUlkgTUFQIEZPUiBBRFNQLUJGNTYxCi0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1NjFfSApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oCmluZGV4IDVmYzBmMDUuLmEzMWU1MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZGVmQkY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RlZkJGNTYxLmgKQEAgLTEsMzIgKzEsNyBAQAotCiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTYxL2RlZkJGNTYxLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQ29weXJpZ2h0IDIwMDUtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICogU1lTVEVNIE1NUiBSRUdJU1RFUiBBTkQgTUVNT1JZIE1BUCBGT1IgQURTUC1CRjU2MQotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKICNpZm5kZWYgX0RFRl9CRjU2MV9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDc4ODJmNzkuLmE2NTFhOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDcgKzEsNCBAQAogLyoKLSAqIEZpbGU6IGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCi0gKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9pcnEuaAppbmRleCA2Njk4Mzg5Li43YjIwOGRiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2lycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvaXJxLmgKQEAgLTEsMzIgKzEsNyBAQAotCiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTYxL2lycS5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQkY1NjFfSVJRX0hfCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3BvcnRtdXguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvcG9ydG11eC5oCmluZGV4IDJlNWFkNjMuLjNhN2I0NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvcG9ydG11eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvcG9ydG11eC5oCkBAIC0xLDMgKzEsOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCiAjaWZuZGVmIF9NQUNIX1BPUlRNVVhfSF8KICNkZWZpbmUgX01BQ0hfUE9SVE1VWF9IXwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9zbXAuaAppbmRleCBmOWU2NWViLi4zOTBjN2Y0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvc21wLmgKQEAgLTEsMyArMSw5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKICNpZm5kZWYgX01BQ0hfQkY1NjFfU01QCiAjZGVmaW5lIF9NQUNIX0JGNTYxX1NNUAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2ludHMtcHJpb3JpdHkuYwppbmRleCA5ZDJmMjMzLi5iNDQyNDE3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW50cy1wcmlvcml0eS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbnRzLXByaW9yaXR5LmMKQEAgLTEsMzAgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2ludHMtcHJpb3JpdHkuYwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW50cy1wcmlvcml0eS5jCi0gKiBBdXRob3I6ICAgICAgIE1pY2hhZWwgSGVubmVyaWNoCisgKiBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcworICogQ29weXJpZ2h0IDIwMDUtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zZWNvbmRhcnkuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zZWNvbmRhcnkuUwppbmRleCBmNzJhNmFmLi44ZTYwNTAzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc2Vjb25kYXJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NlY29uZGFyeS5TCkBAIC0xLDI2ICsxLDEwIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc2Vjb25kYXJ5LlMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUwotICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICogQkY1NjEgY29yZUIgYm9vdHN0cmFwIGZpbGUKICAqCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgogICoKLSAqIERlc2NyaXB0aW9uOiAgQkY1NjEgY29yZUIgYm9vdHN0cmFwIGZpbGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYwppbmRleCA4YzEwNzAxLi41MTBmNTc2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc21wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NtcC5jCkBAIC0xLDIzICsxLDggQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYwotICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICogQ29weXJpZ2h0IDIwMDctMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CiAgKgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2FyY2hfY2hlY2tzLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2FyY2hfY2hlY2tzLmMKaW5kZXggNTk5OGQ4Ni4uOWRiYWZjZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9hcmNoX2NoZWNrcy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vYXJjaF9jaGVja3MuYwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2FyY2hfY2hlY2tzLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgkgUm9iaW4gR2V0eiA8cmdldHpAYmxhY2tmaW4udWNsaW51eC5vcmc+CisgKiBEbyBzb21lIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIE9LCiAgKgotICogQ3JlYXRlZDogICAgICAyNUp1bDA3Ci0gKiBEZXNjcmlwdGlvbjogIERvIHNvbWUgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoaW5ncyBhcmUgT0sKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8YXNtL2ZpeGVkX2NvZGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUtYy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMKaW5kZXggNGViYmQ3OC4uYTYwYTI0ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMKQEAgLTMsOCArMyw2IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUwppbmRleCBkOTY2NmZlLi5lYTU0MDMxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS5TCkBAIC0zLDggKzMsNiBAQAogICoKICAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCmluZGV4IDg1YzY1ODAuLjAxNTA2NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCkBAIC0xLDMwICsxLDkgQEAKIC8qCi0gKiBGaWxlOgkgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcHVmcmVxLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogQmxhY2tmaW4gY29yZSBjbG9jayBzY2FsaW5nCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgkgQmxhY2tmaW4gY29yZSBjbG9jayBzY2FsaW5nCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqCQkgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczoJIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCTAyMTEwLTEzMDEJVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCmluZGV4IDFlN2NhYzIuLjk0YTAzNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKQEAgLTEsMzIgKzEsMTEgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIExpbnVzIFRvcnZhbGRzCisgKiBDb250YWlucyB0aGUgc3lzdGVtLWNhbGwgYW5kIGZhdWx0IGxvdy1sZXZlbCBoYW5kbGluZyByb3V0aW5lcy4KKyAqIFRoaXMgYWxzbyBjb250YWlucyB0aGUgdGltZXItaW50ZXJydXB0IGhhbmRsZXIsIGFzIHdlbGwgYXMgYWxsCisgKiBpbnRlcnJ1cHRzIGFuZCBmYXVsdHMgdGhhdCBjYW4gcmVzdWx0IGluIGEgdGFzay1zd2l0Y2guCiAgKgotICogQ3JlYXRlZDogICAgICA/Ci0gKiBEZXNjcmlwdGlvbjogIGNvbnRhaW5zIHRoZSBzeXN0ZW0tY2FsbCBhbmQgZmF1bHQgbG93LWxldmVsIGhhbmRsaW5nIHJvdXRpbmVzLgotICogICAgICAgICAgICAgICBUaGlzIGFsc28gY29udGFpbnMgdGhlIHRpbWVyLWludGVycnVwdCBoYW5kbGVyLCBhcyB3ZWxsIGFzIGFsbAotICogICAgICAgICAgICAgICBpbnRlcnJ1cHRzIGFuZCBmYXVsdHMgdGhhdCBjYW4gcmVzdWx0IGluIGEgdGFzay1zd2l0Y2guCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogLyogTk9URTogVGhpcyBjb2RlIGhhbmRsZXMgc2lnbmFsLXJlY29nbml0aW9uLCB3aGljaCBoYXBwZW5zIGV2ZXJ5IHRpbWUKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKaW5kZXggOWM3OWRmZS4uY2FiMGEwMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKQEAgLTMsOCArMyw2IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50ZXJydXB0LlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludGVycnVwdC5TCmluZGV4IDgyZDQxN2UuLjgwODVmZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50ZXJydXB0LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRlcnJ1cHQuUwpAQCAtMSwzMSArMSwxMSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRlcnJ1cHQuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIEQuIEplZmYgRGlvbm5lIDxqZWZmQHJ5ZWhhbS5lZS5yeWVyc29uLmNhPgorICogSW50ZXJydXB0IEVudHJpZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqICAgICAgICAgICAgICAgRC4gSmVmZiBEaW9ubmUgPGplZmZAcnllaGFtLmVlLnJ5ZXJzb24uY2E+CiAgKiAgICAgICAgICAgICAgIEtlbm5ldGggQWxiYW5vd3NraSA8a2phaGRzQGtqYWhkcy5jb20+CiAgKgotICogQ3JlYXRlZDogICAgICA/Ci0gKiBEZXNjcmlwdGlvbjogIEludGVycnVwdCBFbnRyaWVzCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKaW5kZXggNmZmZGE3OC4uNjYwZWExYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKQEAgLTEsMzMgKzEsMTQgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCisgKiBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCiAgKgotICogRGVzY3JpcHRpb246ICBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCisgKiBDb3B5cmlnaHQgIDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgICAgMjAwMyBCYXMgVmVybWV1bGVuIDxiYXNAYnV5d2F5cy5ubD4KKyAqICAgICAgICAgICAgICAgICAyMDAyIEFyY3R1cnVzIE5ldHdvcmtzIEluYy4gTWFUZWQgPG1hdGVkQHN5bXBhdGljby5jYT4KKyAqICAgICAgICAgICAgMjAwMC0yMDAxIExpbmVvLCBJbmMuIEQuIEplZmZmIERpb25uZSA8amVmZkBsaW5lby5jYT4KKyAqICAgICAgICAgICAgICAgICAxOTk5IEQuIEplZmYgRGlvbm5lIDxqZWZmQHVjbGludXgub3JnPgorICogICAgICAgICAgICAgICAgIDE5OTYgUm9tYW4gWmlwcGVsCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIDE5OTYgUm9tYW4gWmlwcGVsCi0gKiAgICAgICAgICAgICAgIDE5OTkgRC4gSmVmZiBEaW9ubmUgPGplZmZAdWNsaW51eC5vcmc+Ci0gKiAgICAgICAgICAgICAgIDIwMDAtMjAwMSBMaW5lbywgSW5jLiBELiBKZWZmZiBEaW9ubmUgPGplZmZAbGluZW8uY2E+Ci0gKiAgICAgICAgICAgICAgIDIwMDIgQXJjdHVydXMgTmV0d29ya3MgSW5jLiBNYVRlZCA8bWF0ZWRAc3ltcGF0aWNvLmNhPgotICogICAgICAgICAgICAgICAyMDAzIE1ldHJvd2Vya3MvTW90b3JvbGEKLSAqICAgICAgICAgICAgICAgMjAwMyBCYXMgVmVybWV1bGVuIDxiYXNAYnV5d2F5cy5ubD4KLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2lycXBhbmljLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2lycXBhbmljLmMKaW5kZXggODgzZTMyNC4uYzY0OTYyNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pcnFwYW5pYy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaXJxcGFuaWMuYwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2lycXBhbmljLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorICogcGFuaWMga2VybmVsIHdpdGggZHVtcCBpbmZvcm1hdGlvbgogICoKLSAqIENyZWF0ZWQ6ICAgICAgPwotICogRGVzY3JpcHRpb246ICBwYW5pYyBrZXJuZWwgd2l0aCBkdW1wIGluZm9ybWF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDogICAgIHJnZXR6IC0gYWRkZWQgY2FjaGUgY2hlY2tpbmcgY29kZSAxNEZlYjA2Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYwppbmRleCAwZTNkNGZmLi44ODM3YmU0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9wbS5jCkBAIC0xLDM1ICsxLDExIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMKLSAqIEJhc2VkIG9uOiAgICAgYXJtL21hY2gtb21hcC9wbS5jCi0gKiBBdXRob3I6ICAgICAgIENsaWZmIEJyYWtlIDxjYnJha2VAYWNjZWxlbnQuY29tPiBDb3B5cmlnaHQgKGMpIDIwMDEKKyAqIEJsYWNrZmluIHBvd2VyIG1hbmFnZW1lbnQKICAqCi0gKiBDcmVhdGVkOiAgICAgIDIwMDEKLSAqIERlc2NyaXB0aW9uOiAgQmxhY2tmaW4gcG93ZXIgbWFuYWdlbWVudAorICogQ29weXJpZ2h0IDIwMDYtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6ICAgICBOaWNvbGFzIFBpdHJlIC0gUFhBMjUwIHN1cHBvcnQKLSAqICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogICAgICAgICAgICAgICBEYXZpZCBTaW5nbGV0b24gLSBPTUFQMTUxMAotICogICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyIE1vbnRhIFZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiAgICAgICAgICAgICAgIERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPiAtIE9NQVAxNTEwLzE2MTAKLSAqICAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yCisgKiBiYXNlZCBvbiBhcm0vbWFjaC1vbWFwL3BtLmMKKyAqICAgIENvcHlyaWdodCAyMDAxLCBDbGlmZiBCcmFrZSA8Y2JyYWtlQGFjY2VsZW50LmNvbT4gYW5kIG90aGVycwogICovCiAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYwppbmRleCAzNDllZTNmLi5kOTg1ODVmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKQEAgLTEsMjQgKzEsMTAgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL3NtcC5jCi0gKiBBdXRob3I6ICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+Ci0gKiBJUEkgbWFuYWdlbWVudCBiYXNlZCBvbiBhcmNoL2FybS9rZXJuZWwvc21wLmMuCisgKiBJUEkgbWFuYWdlbWVudCBiYXNlZCBvbiBhcmNoL2FybS9rZXJuZWwvc21wLmMgKENvcHlyaWdodCAyMDAyIEFSTSBMaW1pdGVkKQogICoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21tL2JsYWNrZmluX3NyYW0uaCBiL2FyY2gvYmxhY2tmaW4vbW0vYmxhY2tmaW5fc3JhbS5oCmluZGV4IGJjMDA2MjguLmZiMGIxNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbW0vYmxhY2tmaW5fc3JhbS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbW0vYmxhY2tmaW5fc3JhbS5oCkBAIC0xLDMwICsxLDkgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbW0vYmxhY2tmaW5fc3JhbS5oCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbW0vYmxhY2tmaW5fc3JhbS5jCi0gKiBBdXRob3I6ICAgICAgIE1pa2UgRnJ5c2luZ2VyCisgKiBMb2NhbCBwcm90b3R5cGVzIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seQogICoKLSAqIENyZWF0ZWQ6ICAgICAgQXVnIDIwMDYKLSAqIERlc2NyaXB0aW9uOiAgTG9jYWwgcHJvdG90eXBlcyBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkKKyAqIENvcHlyaWdodCAyMDA2LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfX0JMQUNLRklOX1NSQU1fSF9fCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21tL2luaXQuYyBiL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCmluZGV4IGI4OGNlN2YuLmJiOWM5OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCkBAIC0xLDMwICsxLDcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbW0vaXNyYW0tZHJpdmVyLmMgYi9hcmNoL2JsYWNrZmluL21tL2lzcmFtLWRyaXZlci5jCmluZGV4IGJlYjFhNjAuLjg0Y2RjNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbW0vaXNyYW0tZHJpdmVyLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tbS9pc3JhbS1kcml2ZXIuYwpAQCAtMSwxOSArMSw5IEBACiAvKgotICogRGVzY3JpcHRpb246IEluc3RydWN0aW9uIFNSQU0gYWNjZXNzb3IgZnVuY3Rpb25zIGZvciB0aGUgQmxhY2tmaW4KKyAqIEluc3RydWN0aW9uIFNSQU0gYWNjZXNzb3IgZnVuY3Rpb25zIGZvciB0aGUgQmxhY2tmaW4KICAqCiAgKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKICNkZWZpbmUgcHJfZm10KGZtdCkgImlzcmFtOiAiIGZtdApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMgYi9hcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYwppbmRleCBlYjYzYWIzLi5mMDY4YzExIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYworKysgYi9hcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYwpAQCAtMSwzMCArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBTUkFNIGFsbG9jYXRvciBmb3IgQmxhY2tmaW4gb24tY2hpcCBtZW1vcnkKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBTUkFNIGFsbG9jYXRvciBmb3IgQmxhY2tmaW4gTDEgYW5kIEwyIG1lbW9yeQorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9NYWtlZmlsZSBiL2FyY2gvY3Jpcy9NYWtlZmlsZQppbmRleCA3MWUxN2QzLi4yOWMyY2ViIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvTWFrZWZpbGUKKysrIGIvYXJjaC9jcmlzL01ha2VmaWxlCkBAIC00Miw4ICs0Miw2IEBACiAKIE9CSkNPUFlGTEFHUyA6PSAtTyBiaW5hcnkgLVIgLm5vdGUgLVIgLmNvbW1lbnQgLVMKIAotQ1BQRkxBR1Nfdm1saW51eC5sZHMgPSAtRERSQU1fVklSVFVBTF9CQVNFPTB4JChDT05GSUdfRVRSQVhfRFJBTV9WSVJUVUFMX0JBU0UpCi0KIEtCVUlMRF9BRkxBR1MgKz0gLW1saW51eCAtbWFyY2g9JChhcmNoLXkpICQoaW5jKQogS0JVSUxEX0NGTEFHUyArPSAtbWxpbnV4IC1tYXJjaD0kKGFyY2gteSkgLXBpcGUgJChpbmMpCiBLQlVJTERfQ1BQRkxBR1MgKz0gJChpbmMpCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9zeW5jX3NlcmlhbC5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvc3luY19zZXJpYWwuYwppbmRleCA2Y2MxYTAzLi41NjJiOWE3IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9zeW5jX3NlcmlhbC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3N5bmNfc2VyaWFsLmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogCiAjZGVmaW5lIE5VTUJFUl9PRl9QT1JUUyAyCiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5bmNfc2VyaWFsX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeW5jX3NlcmlhbF9mb3BzID0gewogCS5vd25lciAgID0gVEhJU19NT0RVTEUsCiAJLndyaXRlICAgPSBzeW5jX3NlcmlhbF93cml0ZSwKIAkucmVhZCAgICA9IHN5bmNfc2VyaWFsX3JlYWQsCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3RpbWUuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvdGltZS5jCmluZGV4IDJiNzNjN2EuLjMxY2ExNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvdGltZS5jCkBAIC0yOCw3ICsyOCw2IEBACiAKIGV4dGVybiB2b2lkIHVwZGF0ZV94dGltZV9mcm9tX2Ntb3Modm9pZCk7CiBleHRlcm4gaW50IHNldF9ydGNfbW1zcyh1bnNpZ25lZCBsb25nIG5vd3RpbWUpOwotZXh0ZXJuIGludCBzZXR1cF9pcnEoaW50LCBzdHJ1Y3QgaXJxYWN0aW9uICopOwogZXh0ZXJuIGludCBoYXZlX3J0YzsKIAogdW5zaWduZWQgbG9uZyBnZXRfbnNfaW5famlmZmllKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWZzL2dwaW8uYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvZ3Bpby5jCmluZGV4IGZlMWZkZTguLmQ4OWFiODAgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvZ3Bpby5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvZ3Bpby5jCkBAIC04NTUsNyArODU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBncGlvX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBncGlvX2ZvcHMgPSB7CiAJLm93bmVyICAgICAgID0gVEhJU19NT0RVTEUsCiAJLnBvbGwgICAgICAgID0gZ3Bpb19wb2xsLAogCS5pb2N0bCAgICAgICA9IGdwaW9faW9jdGwsCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NtcC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zbXAuYwppbmRleCBkMmEzZmY4Li4wNThhZGRkIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMKQEAgLTUyLDggKzUyLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QqIGZsdXNoX3ZtYTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZsdXNoX2FkZHI7CiAKLWV4dGVybiBpbnQgc2V0dXBfaXJxKGludCwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogLyogTW9kZSByZWdpc3RlcnMgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlycV9yZWdzW05SX0NQVVNdID0gewogICByZWdpX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvdGltZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC90aW1lLmMKaW5kZXggNjU2MzNkMC4uYjE5MjBkOCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC90aW1lLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKIAogZXh0ZXJuIHZvaWQgdXBkYXRlX3h0aW1lX2Zyb21fY21vcyh2b2lkKTsKIGV4dGVybiBpbnQgc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcgbm93dGltZSk7Ci1leHRlcm4gaW50IHNldHVwX2lycShpbnQsIHN0cnVjdCBpcnFhY3Rpb24gKik7CiBleHRlcm4gaW50IGhhdmVfcnRjOwogCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9pby5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvaW8uYwppbmRleCBjMjJmNjdlLi4wOTBjZWI5IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9pby5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2lvLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAl9LAogfTsKIAotI2RlZmluZSBOQlJfT0ZfUE9SVFMgc2l6ZW9mKGNyaXN2MzJfaW9wb3J0cykvc2l6ZW9mKHN0cnVjdCBjcmlzdjMyX2lvcG9ydCkKKyNkZWZpbmUgTkJSX09GX1BPUlRTIEFSUkFZX1NJWkUoY3Jpc3YzMl9pb3BvcnRzKQogCiBzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZF9uZXQwX2dyZWVuOwogc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc3YzMl9sZWRfbmV0MF9yZWQ7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9pby5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvaW8uYwppbmRleCBjYjYzMjdiLi5hNjk1ODY2IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9pby5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2lvLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAl9CiB9OwogCi0jZGVmaW5lIE5CUl9PRl9QT1JUUyBzaXplb2YoY3Jpc3YzMl9pb3BvcnRzKS9zaXplb2Yoc3RydWN0IGNyaXN2MzJfaW9wb3J0KQorI2RlZmluZSBOQlJfT0ZfUE9SVFMgQVJSQVlfU0laRShjcmlzdjMyX2lvcG9ydHMpCiAKIHN0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkX25ldDBfZ3JlZW47CiBzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZF9uZXQwX3JlZDsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjEwL2FyY2gvbW11LmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hcmNoLXYxMC9hcmNoL21tdS5oCmluZGV4IGRmODRmMTcuLmU4MjllNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjEwL2FyY2gvbW11LmgKKysrIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXJjaC12MTAvYXJjaC9tbXUuaApAQCAtMzMsMTAgKzMzLDEwIEBACiAKIC8qIENSSVMgUFRFIGJpdHMgKHNlZSBSX1RMQl9MTyBpbiB0aGUgcmVnaXN0ZXIgZGVzY3JpcHRpb24pCiAgKgotICogICBCaXQ6ICAzMS0xMyAxMi0tLS0tLS00ICAgIDMgICAgICAgIDIgICAgICAgMSAgICAgICAwICAKLSAqICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gKiAgICAgICAgfCBwZm4gfCByZXNlcnZlZCB8IGdsb2JhbCB8IHZhbGlkIHwga2VybmVsIHwgd2UgIHwKLSAqICAgICAgICB8X19fX198X19fX19fX19fX3xfX19fX19fX3xfX19fX19ffF9fX19fX19ffF9fX19ffAorICogICBCaXQ6ICAzMSAgICAgMzAtMTMgMTItLS0tLS0tNCAgICAzICAgICAgICAyICAgICAgIDEgICAgICAgMAorICogICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiAgICAgICAgfCBjYWNoZSB8cGZuIHwgcmVzZXJ2ZWQgfCBnbG9iYWwgfCB2YWxpZCB8IGtlcm5lbCB8IHdlICB8CisgKiAgICAgICAgfF9fX19fX198X19fX3xfX19fX19fX19ffF9fX19fX19ffF9fX19fX198X19fX19fX198X19fX198CiAgKgogICogKHBmbiA9IHBoeXNpY2FsIGZyYW1lIG51bWJlcikKICAqLwpAQCAtNTMsNiArNTMsNyBAQAogI2RlZmluZSBfUEFHRV9WQUxJRAkgICAoMTw8MikgLyogcGFnZSBpcyB2YWxpZCAqLwogI2RlZmluZSBfUEFHRV9TSUxFTlRfUkVBRCAgKDE8PDIpIC8qIHN5bm9ueW0gKi8KICNkZWZpbmUgX1BBR0VfR0xPQkFMICAgICAgICgxPDwzKSAvKiBnbG9iYWwgcGFnZSAtIGNvbnRleHQgaXMgaWdub3JlZCAqLworI2RlZmluZSBfUEFHRV9OT19DQUNIRQkgICAoMTw8MzEpIC8qIHBhcnQgb2YgdGhlIHVuY2FjaGVkIG1lbW9yeSBtYXAgKi8KIAogLyogQml0cyB0aGUgSFcgZG9lc24ndCBjYXJlIGFib3V0IGJ1dCB0aGUga2VybmVsIHVzZXMgdGhlbSBpbiBTVyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvaW5jbHVkZS9hcmNoLXYzMi9hcmNoL21tdS5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXJjaC12MzIvYXJjaC9tbXUuaAppbmRleCA2YmNkYzNmLi5jMWExM2UwIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hcmNoLXYzMi9hcmNoL21tdS5oCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjMyL2FyY2gvbW11LmgKQEAgLTI4LDEwICsyOCwxMCBAQAogLyoKICAqIENSSVN2MzIgUFRFIGJpdHM6CiAgKgotICogIEJpdDogIDMxLTEzICAxMi01ICAgICA0ICAgICAgICAzICAgICAgIDIgICAgICAgIDEgICAgICAgIDAKLSAqICAgICAgICstLS0tLSstLS0tLS0rLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSsKLSAqICAgICAgIHwgcGZuIHwgemVybyB8IGdsb2JhbCB8IHZhbGlkIHwga2VybmVsIHwgd3JpdGUgfCBleGVjdXRlIHwKLSAqICAgICAgICstLS0tLSstLS0tLS0rLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSsKKyAqICBCaXQ6ICAgMzEgICAgIDMwLTEzICAxMi01ICAgICA0ICAgICAgICAzICAgICAgIDIgICAgICAgIDEgICAgICAgIDAKKyAqICAgICAgICstLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tKworICogICAgICAgfCBjYWNoZSB8IHBmbiB8IHplcm8gfCBnbG9iYWwgfCB2YWxpZCB8IGtlcm5lbCB8IHdyaXRlIHwgZXhlY3V0ZSB8CisgKiAgICAgICArLS0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSsKICAqLwogCiAvKgpAQCAtNDUsNiArNDUsOCBAQAogI2RlZmluZSBfUEFHRV9WQUxJRCAgICAgICAgICgxIDw8IDMpCS8qIFBhZ2UgaXMgdmFsaWQuICovCiAjZGVmaW5lIF9QQUdFX1NJTEVOVF9SRUFEICAgKDEgPDwgMykJLyogU2FtZSBhcyBhYm92ZS4gKi8KICNkZWZpbmUgX1BBR0VfR0xPQkFMICAgICAgICAoMSA8PCA0KQkvKiBHbG9iYWwgcGFnZS4gKi8KKyNkZWZpbmUgX1BBR0VfTk9fQ0FDSEUJICAgICgxIDw8IDMxKQkvKiBwYXJ0IG9mIHRoZSB1bmNhY2hlZCBtZW1vcnkgbWFwICovCisKIAogLyoKICAqIFRoZSBoYXJkd2FyZSBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlc2UgYml0cywgYnV0IHRoZSBrZXJuZWwgdXNlcyB0aGVtIGluCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vaGFyZGlycS5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCA3NDE3OGFkLi4xN2JiMTJkIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vaGFyZGlycS5oCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKQEAgLTIsMTYgKzIsNiBAQAogI2RlZmluZSBfX0FTTV9IQVJESVJRX0gKIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludCBfX3NvZnRpcnFfcGVuZGluZzsKLX0gX19fX2NhY2hlbGluZV9hbGlnbmVkIGlycV9jcHVzdGF0X3Q7Ci0KLSNpbmNsdWRlIDxsaW51eC9pcnFfY3B1c3RhdC5oPiAvKiBTdGFuZGFyZCBtYXBwaW5ncyBmb3IgaXJxX2NwdXN0YXRfdCBhYm92ZSAqLwotCi12b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCiAjZGVmaW5lIEhBUkRJUlFfQklUUwk4CiAKQEAgLTI0LDQgKzE0LDYgQEAKICMgZXJyb3IgSEFSRElSUV9CSVRTIGlzIHRvbyBsb3chCiAjZW5kaWYKIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2hhcmRpcnEuaD4KKwogI2VuZGlmIC8qIF9fQVNNX0hBUkRJUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggNTBhYTk3NC4uMWZjY2UwMCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0xOTcsNiArMTk3LDggQEAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21vZGlmeShwdGVfdCBwdGUsIHBncHJvdF90IG5ld3Byb3QpCiB7IHB0ZV92YWwocHRlKSA9IChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9DSEdfTUFTSykgfCBwZ3Byb3RfdmFsKG5ld3Byb3QpOyByZXR1cm4gcHRlOyB9CiAKKyNkZWZpbmUgcGdwcm90X25vbmNhY2hlZChwcm90KSBfX3BncHJvdCgocGdwcm90X3ZhbChwcm90KSB8IF9QQUdFX05PX0NBQ0hFKSkKKwogCiAvKiBwdGVfdmFsIHJlZmVycyB0byBhIHBhZ2UgaW4gdGhlIDB4NHh4eHh4eHggcGh5c2ljYWwgRFJBTSBpbnRlcnZhbAogICogX19wdGVfcGFnZShwdGVfdmFsKSByZWZlcnMgdG8gdGhlICJ2aXJ0dWFsIiBEUkFNIGludGVydmFsCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9jcmlzL2tlcm5lbC9NYWtlZmlsZQppbmRleCBlZTdiY2Q0Li5iNDU2NDBiIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvY3Jpcy9rZXJuZWwvTWFrZWZpbGUKQEAgLTMsNiArMyw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgogIwogCitDUFBGTEFHU192bWxpbnV4LmxkcyA6PSAtRERSQU1fVklSVFVBTF9CQVNFPTB4JChDT05GSUdfRVRSQVhfRFJBTV9WSVJUVUFMX0JBU0UpCiBleHRyYS15CTo9IHZtbGludXgubGRzCiAKIG9iai15ICAgOj0gcHJvY2Vzcy5vIHRyYXBzLm8gaXJxLm8gcHRyYWNlLm8gc2V0dXAubyB0aW1lLm8gc3lzX2NyaXMubwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2tlcm5lbC9pcnEuYyBiL2FyY2gvY3Jpcy9rZXJuZWwvaXJxLmMKaW5kZXggN2Y2NDJmYy4uMGNhN2Q5OCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2NyaXMva2VybmVsL2lycS5jCkBAIC0zOCwxMSArMzgsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLXZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlwcmludGsoInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7Ci19Ci0KIGludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQogewogCWludCBpID0gKihsb2ZmX3QgKikgdiwgajsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9jcmlzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNTFkY2QwNC4uYzk5YWVhYiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9jcmlzL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTQ1LDkgKzQ1LDggQEAKICAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IGhhdmluZyBhIHNwZWNpYWwKICAqICJpbml0X3Rhc2siIGxpbmtlciBtYXAgZW50cnkuLgogICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPQotCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPQorCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CiAKIC8qCiAgKiBJbml0aWFsIHRhc2sgc3RydWN0dXJlLgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9jcmlzL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDZjODE4MzYuLmJiZmRhNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2NyaXMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTUxLDEwICs1MSw3IEBACiAJX2V0ZXh0ID0gLiA7CQkJLyogRW5kIG9mIHRleHQgc2VjdGlvbi4gKi8KIAlfX2V0ZXh0ID0gLjsKIAotCS4gPSBBTElHTig0KTsJCQkvKiBFeGNlcHRpb24gdGFibGUuICovCi0JX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLQlfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLQlfX3N0b3BfX19leF90YWJsZSA9IC47CisJRVhDRVBUSU9OX1RBQkxFKDQpCiAKIAlST0RBVEEKIApAQCAtNjcsMzYgKzY0LDI0IEBACiAJX19lZGF0YSA9IC4gOwkJCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24uICovCiAJX2VkYXRhID0gLiA7CiAKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsJLyogaW5pdF90YXNrIGFuZCBzdGFjaywgbXVzdCBiZSBhbGlnbmVkLiAqLwotCS5kYXRhLmluaXRfdGFzayA6IHsgKiguZGF0YS5pbml0X3Rhc2spIH0KKwlJTklUX1RBU0tfREFUQV9TRUNUSU9OKFBBR0VfU0laRSkKIAogCS4gPSBBTElHTihQQUdFX1NJWkUpOwkJLyogSW5pdCBjb2RlIGFuZCBkYXRhLiAqLwogCV9faW5pdF9iZWdpbiA9IC47Ci0JLmluaXQudGV4dCA6IHsKLQkJICAgX3Npbml0dGV4dCA9IC47Ci0JCSAgIElOSVRfVEVYVAotCQkgICBfZWluaXR0ZXh0ID0gLjsKLQl9CisJSU5JVF9URVhUX1NFQ1RJT04oUEFHRV9TSVpFKQogCS5pbml0LmRhdGEgOiB7IElOSVRfREFUQSB9Ci0JLiA9IEFMSUdOKDE2KTsKLQlfX3NldHVwX3N0YXJ0ID0gLjsKLQkuaW5pdC5zZXR1cCA6IHsgKiguaW5pdC5zZXR1cCkgfQotCV9fc2V0dXBfZW5kID0gLjsKKwkuaW5pdC5zZXR1cCA6IHsgSU5JVF9TRVRVUCgxNikgfQogI2lmZGVmIENPTkZJR19FVFJBWF9BUkNIX1YzMgogCV9fc3RhcnRfX19wYXJhbSA9IC47CiAJX19wYXJhbSA6IHsgKihfX3BhcmFtKSB9CiAJX19zdG9wX19fcGFyYW0gPSAuOwogI2VuZGlmCiAJLmluaXRjYWxsLmluaXQgOiB7Ci0JCV9faW5pdGNhbGxfc3RhcnQgPSAuOwotCQlJTklUQ0FMTFMKLQkJX19pbml0Y2FsbF9lbmQgPSAuOworCQlJTklUX0NBTExTCiAJfQogCiAJLmNvbl9pbml0Y2FsbC5pbml0IDogewotCQlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47Ci0JCSooLmNvbl9pbml0Y2FsbC5pbml0KQotCQlfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOworCQlDT05fSU5JVENBTEwKIAl9CiAJU0VDVVJJVFlfSU5JVAogCkBAIC0xMTQsOSArOTksNyBAQAogCVBFUkNQVShQQUdFX1NJWkUpCiAKIAkuaW5pdC5yYW1mcyA6IHsKLQkJX19pbml0cmFtZnNfc3RhcnQgPSAuOwotCQkqKC5pbml0LnJhbWZzKQotCQlfX2luaXRyYW1mc19lbmQgPSAuOworCQlJTklUX1JBTV9GUwogCX0KICNlbmRpZgogCkBAIC0xMzAsMTEgKzExMyw3IEBACiAJX19pbml0X2VuZCA9IC47CiAKIAlfX2RhdGFfZW5kID0gLiA7CQkvKiBNb3ZlIHRvIF9lZGF0YSA/ICovCi0JX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTLiAqLwotCS5ic3MgOiB7Ci0JCSooQ09NTU9OKQotCQkqKC5ic3MpCi0JfQorCUJTU19TRUNUSU9OKDAsIDAsIDApCiAKIAkuID0gIEFMSUdOICgweDIwKTsKIAlfZW5kID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCBmYzQ3NTE1Li41ZmM4YjZmIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKKysrIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC0xMiwyNCArMTIsMTUgQEAKICNpZm5kZWYgX19BU01fSEFSRElSUV9ICiAjZGVmaW5lIF9fQVNNX0hBUkRJUlFfSAogCi0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50IF9fc29mdGlycV9wZW5kaW5nOwotCXVuc2lnbmVkIGxvbmcgaWRsZV90aW1lc3RhbXA7Ci19IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcnFfY3B1c3RhdF90OwotCi0jaW5jbHVkZSA8bGludXgvaXJxX2NwdXN0YXQuaD4JLyogU3RhbmRhcmQgbWFwcGluZ3MgZm9yIGlycV9jcHVzdGF0X3QgYWJvdmUgKi8KLQotI2lmZGVmIENPTkZJR19TTVAKLSNlcnJvciBTTVAgbm90IGF2YWlsYWJsZSBvbiBGUi1WCi0jZW5kaWYgLyogQ09ORklHX1NNUCAqLworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogZXh0ZXJuIGF0b21pY190IGlycV9lcnJfY291bnQ7CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNrX2JhZF9pcnEoaW50IGlycSkKIHsKIAlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKIH0KKyNkZWZpbmUgYWNrX2JhZF9pcnEgYWNrX2JhZF9pcnEKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2hhcmRpcnEuaD4KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL2Zydi9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggMWQzZGYxZC4uM2MzZTBiMyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMTksOSArMTksOCBAQAogICogd2F5IHByb2Nlc3Mgc3RhY2tzIGFyZSBoYW5kbGVkLiBUaGlzIGlzIGRvbmUgYnkgaGF2aW5nIGEgc3BlY2lhbAogICogImluaXRfdGFzayIgbGlua2VyIG1hcCBlbnRyeS4uCiAgKi8KLXVuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbgotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KLQkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KKwl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwogCiAvKgogICogSW5pdGlhbCB0YXNrIHN0cnVjdHVyZS4KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9wbS5jIGIvYXJjaC9mcnYva2VybmVsL3BtLmMKaW5kZXggYmU3MjJmYy4uMGQ0ZDNlMyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3BtLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3BtLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogLyoKICAqIFNlbmQgdXMgdG8gc2xlZXAuCiAgKi8KLXN0YXRpYyBpbnQgc3lzY3RsX3BtX2RvX3N1c3BlbmQoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IHN5c2N0bF9wbV9kb19zdXNwZW5kKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCiAJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKmZwb3MpCiB7CiAJaW50IHJldHZhbCwgbW9kZTsKQEAgLTE5OCwxMyArMTk4LDEzIEBACiB9CiAKIAotc3RhdGljIGludCBjbW9kZV9wcm9jY3RsKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBjbW9kZV9wcm9jY3RsKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCiAJCQkgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKmZwb3MpCiB7CiAJaW50IG5ld19jbW9kZTsKIAogCWlmICghd3JpdGUpCi0JCXJldHVybiBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgZnBvcyk7CisJCXJldHVybiBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgZnBvcyk7CiAKIAluZXdfY21vZGUgPSB1c2VyX2F0b2koYnVmZmVyLCAqbGVucCk7CiAKQEAgLTMwMSwxMyArMzAxLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcDBfcHJvY2N0bChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgcDBfcHJvY2N0bChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAogCQkgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqZnBvcykKIHsKIAlpbnQgbmV3X3AwOwogCiAJaWYgKCF3cml0ZSkKLQkJcmV0dXJuIHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBmcG9zKTsKKwkJcmV0dXJuIHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBmcG9zKTsKIAogCW5ld19wMCA9IHVzZXJfYXRvaShidWZmZXIsICpsZW5wKTsKIApAQCAtMzQ1LDEzICszNDUsMTMgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBjbV9wcm9jY3RsKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBjbV9wcm9jY3RsKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCiAJCSAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpmcG9zKQogewogCWludCBuZXdfY207CiAKIAlpZiAoIXdyaXRlKQotCQlyZXR1cm4gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIGZwb3MpOworCQlyZXR1cm4gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIGZwb3MpOwogCiAJbmV3X2NtID0gdXNlcl9hdG9pKGJ1ZmZlciwgKmxlbnApOwogCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9mcnYva2VybmVsL3Byb2Nlc3MuYwppbmRleCAwZGU1MGRmLi45MDQyNTU5IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTgzLDEzICs4Myw5IEBACiAgKi8KIHZvaWQgY3B1X2lkbGUodm9pZCkKIHsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgewogCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlpcnFfc3RhdFtjcHVdLmlkbGVfdGltZXN0YW1wID0gamlmZmllczsKLQogCQkJY2hlY2tfcGd0X2NhY2hlKCk7CiAKIAkJCWlmICghZnJ2X2RtYV9pbnByb2dyZXNzICYmIGlkbGUpCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNmIwYTJiNi4uMDk3NGMwZSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYwpAQCAtNTI3LDcgKzUyNyw3IEBACiAKIG5vX3NpZ25hbDoKIAkvKiBEaWQgd2UgY29tZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCi0JaWYgKF9fZnJhbWUtPnN5c2NhbGxubyA+PSAwKSB7CisJaWYgKF9fZnJhbWUtPnN5c2NhbGxubyAhPSAtMSkgewogCQkvKiBSZXN0YXJ0IHRoZSBzeXN0ZW0gY2FsbCAtIG5vIGhhbmRsZXJzIHByZXNlbnQgKi8KIAkJc3dpdGNoIChfX2ZyYW1lLT5ncjgpIHsKIAkJY2FzZSAtRVJFU1RBUlROT0hBTkQ6CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvc3lzX2Zydi5jIGIvYXJjaC9mcnYva2VybmVsL3N5c19mcnYuYwppbmRleCBiYWFkYzk3Li4yYjZiNTI4IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc3lzX2Zydi5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9zeXNfZnJ2LmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL01ha2VmaWxlIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL01ha2VmaWxlCmluZGV4IDc2NTk1ZTguLmI3M2I1NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9NYWtlZmlsZQorKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvTWFrZWZpbGUKQEAgLTExLDMgKzExLDUgQEAKIG9iai15ICs9IHBjaS1kbWEtbm9tbXUubwogZW5kaWYKIGVuZGlmCisKK29iai0kKENPTkZJR19NVEQpICs9IGZsYXNoLm8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9mbGFzaC5jIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBlMzcwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9mbGFzaC5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qIEZsYXNoIG1hcHBpbmdzIGZvciB0aGUgTUI5MzA5MC1NQjAwIG1vdGhlcmJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorCisjZGVmaW5lIE1COTMwOTBfQk9PVFJPTV9BRERSCTB4RkYwMDAwMDAJLyogQm9vdCBST00gKi8KKyNkZWZpbmUgTUI5MzA5MF9CT09UUk9NX1NJWkUJKDIgKiAxMDI0ICogMTAyNCkKKyNkZWZpbmUgTUI5MzA5MF9VU0VSUk9NX0FERFIJMHhGRjIwMDAwMAkvKiBVc2VyIFJPTSAqLworI2RlZmluZSBNQjkzMDkwX1VTRVJST01fU0laRQkoMiAqIDEwMjQgKiAxMDI0KQorCisvKgorICogZGVmYXVsdCBNVEQgcGFydGl0aW9uIHRhYmxlIGZvciBib3RoIG1haW4gZmxhc2ggZGV2aWNlcywgZXhwZWN0ZWQgdG8gYmUKKyAqIG92ZXJyaWRkZW4gYnkgUmVkQm9vdAorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gbWI5MzA5MF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZQkJPSAiRmlsZXN5c3RlbSIsCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQJCT0gMCwKKwl9Cit9OworCisvKgorICogRGVmaW5pdGlvbiBvZiB0aGUgTUI5MzA5MCBCb290IFJPTSAob24gdGhlIENQVSBjYXJkKQorICovCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBtYjkzMDkwX2Jvb3Ryb21fZGF0YSA9IHsKKwkud2lkdGgJCT0gMiwKKwkubnJfcGFydHMJPSAyLAorCS5wYXJ0cwkJPSBtYjkzMDkwX3BhcnRpdGlvbnMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1iOTMwOTBfYm9vdHJvbV9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gTUI5MzA5MF9CT09UUk9NX0FERFIsCisJLmVuZAkJPSBNQjkzMDkwX0JPT1RST01fQUREUiArIE1COTMwOTBfQk9PVFJPTV9TSVpFIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtYjkzMDkwX2Jvb3Ryb20gPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZtYjkzMDkwX2Jvb3Ryb21fZGF0YSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJm1iOTMwOTBfYm9vdHJvbV9yZXNvdXJjZSwKK307CisKKy8qCisgKiBEZWZpbml0aW9uIG9mIHRoZSBNQjkzMDkwIFVzZXIgUk9NIGRlZmluaXRpb24gKG9uIHRoZSBtb3RoZXJib2FyZCkKKyAqLworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgbWI5MzA5MF91c2Vycm9tX2RhdGEgPSB7CisJLndpZHRoCQk9IDIsCisJLm5yX3BhcnRzCT0gMiwKKwkucGFydHMJCT0gbWI5MzA5MF9wYXJ0aXRpb25zLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtYjkzMDkwX3VzZXJyb21fcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IE1COTMwOTBfVVNFUlJPTV9BRERSLAorCS5lbmQJCT0gTUI5MzA5MF9VU0VSUk9NX0FERFIgKyBNQjkzMDkwX1VTRVJST01fU0laRSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWI5MzA5MF91c2Vycm9tID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gMSwKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmbWI5MzA5MF91c2Vycm9tX2RhdGEsCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZtYjkzMDkwX3VzZXJyb21fcmVzb3VyY2UsCit9OworCisvKgorICogcmVnaXN0ZXIgdGhlIE1COTMwOTAgZmxhc2hlcworICovCitzdGF0aWMgaW50IF9faW5pdCBtYjkzMDkwX210ZF9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtYjkzMDkwX2Jvb3Ryb20pOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbWI5MzA5MF91c2Vycm9tKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQobWI5MzA5MF9tdGRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvaDgzMDAva2VybmVsL2luaXRfdGFzay5jCmluZGV4IDA4OWM2NWUuLjU0YzEwNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL2luaXRfdGFzay5jCkBAIC0zMSw3ICszMSw2IEBACiAgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCiAgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KICAqLwotdW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPQotCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPQorCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3N5c19oODMwMC5jIGIvYXJjaC9oODMwMC9rZXJuZWwvc3lzX2g4MzAwLmMKaW5kZXggMjc0NTY1Ni4uOGNiNWQ3MyAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvc3lzX2g4MzAwLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc3lzX2g4MzAwLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaXBjLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2g4MzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDY2MmIwMmUuLmI5ZTI0OTA3IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTEsNSArMSw2IEBACiAjZGVmaW5lIFZNTElOVVhfU1lNQk9MKF9zeW1fKSBfIyNfc3ltXwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogLyogdGFyZ2V0IG1lbW9yeSBtYXAgKi8KICNpZmRlZiBDT05GSUdfSDgzMDBIX0dFTkVSSUMKQEAgLTc5LDExICs4MCw4IEBACiAJU0NIRURfVEVYVAogCUxPQ0tfVEVYVAogCV9fZXRleHQgPSAuIDsKLQkuID0gQUxJR04oMTYpOyAgICAgICAgICAvKiBFeGNlcHRpb24gdGFibGUgICAgICAgICAgICAgICovCi0JX19fc3RhcnRfX19leF90YWJsZSA9IC47Ci0JCSooX19leF90YWJsZSkKLQlfX19zdG9wX19fZXhfdGFibGUgPSAuOwogCX0KKwlFWENFUFRJT05fVEFCTEUoMTYpCiAKIAlST0RBVEEKICNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCkBAIC0xMDAsOCArOTgsNyBAQAogCV9fc2RhdGEgPSAuIDsKIAlfX19kYXRhX3N0YXJ0ID0gLiA7CiAKLQkuID0gQUxJR04oMHgyMDAwKSA7Ci0JCSooLmRhdGEuaW5pdF90YXNrKQorCUlOSVRfVEFTS19EQVRBKDB4MjAwMCkKIAkuID0gQUxJR04oMHg0KSA7CiAJCURBVEFfREFUQQogCS4gPSBBTElHTigweDQpIDsKQEAgLTExNCwyNCArMTExLDE2IEBACiAJX19laW5pdHRleHQgPSAuOyAKIAkJSU5JVF9EQVRBCiAJLiA9IEFMSUdOKDB4NCkgOworCUlOSVRfU0VUVVAoMHg0KQogCV9fX3NldHVwX3N0YXJ0ID0gLjsKIAkJKiguaW5pdC5zZXR1cCkKIAkuID0gQUxJR04oMHg0KSA7CiAJX19fc2V0dXBfZW5kID0gLjsKLQlfX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JCUlOSVRDQUxMUwotCV9fX2luaXRjYWxsX2VuZCA9IC47Ci0JX19fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJKiguY29uX2luaXRjYWxsLmluaXQpCi0JX19fY29uX2luaXRjYWxsX2VuZCA9IC47CisJSU5JVF9DQUxMUworCUNPTl9JTklUQ0FMTAogCQlFWElUX1RFWFQKIAkJRVhJVF9EQVRBCi0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTklUUkQpCi0JCS4gPSBBTElHTig0KTsKLQlfX19pbml0cmFtZnNfc3RhcnQgPSAuOwotICAJCSooLmluaXQucmFtZnMpCi0gIAlfX19pbml0cmFtZnNfZW5kID0gLjsKLSNlbmRpZgorCUlOSVRfUkFNX0ZTCiAJLiA9IEFMSUdOKDB4NCkgOwogCV9fX2luaXRfZW5kID0gLjsKIAlfX2VkYXRhID0gLiA7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IDY4NTFlNTIuLjFlZTU5NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC02MCw5ICs2MCw3IEBACiAgICAgICAgYm9vbAogCiBjb25maWcgR0VORVJJQ19MT0NLQlJFQUsKLQlib29sCi0JZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBTTVAgJiYgUFJFRU1QVAorCWRlZl9ib29sIG4KIAogY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMgYi9hcmNoL2lhNjQvaWEzMi9iaW5mbXRfZWxmMzIuYwppbmRleCBmOTJiZGFhLi5jNjk1NTJiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9iaW5mbXRfZWxmMzIuYworKysgYi9hcmNoL2lhNjQvaWEzMi9iaW5mbXRfZWxmMzIuYwpAQCAtNjksMTEgKzY5LDExIEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBpYTMyX3NoYXJlZF9wYWdlX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgaWEzMl9zaGFyZWRfcGFnZV92bV9vcHMgPSB7CiAJLmZhdWx0ID0gaWEzMl9pbnN0YWxsX3NoYXJlZF9wYWdlCiB9OwogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGlhMzJfZ2F0ZV9wYWdlX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgaWEzMl9nYXRlX3BhZ2Vfdm1fb3BzID0gewogCS5mYXVsdCA9IGlhMzJfaW5zdGFsbF9nYXRlX3BhZ2UKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hY3BpLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYWNwaS5oCmluZGV4IDBmODJjYzIuLjkxZGY5NjggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hY3BpLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2FjcGkuaApAQCAtODksMTAgKzg5LDEyIEBACiAjZGVmaW5lIEFDUElfUkVMRUFTRV9HTE9CQUxfTE9DSyhmYWNzLCBBY3EpCQkJCVwKIAkoKEFjcSkgPSBpYTY0X2FjcGlfcmVsZWFzZV9nbG9iYWxfbG9jaygmZmFjcy0+Z2xvYmFsX2xvY2spKQogCisjaWZkZWYJQ09ORklHX0FDUEkKICNkZWZpbmUgYWNwaV9kaXNhYmxlZCAwCS8qIEFDUEkgYWx3YXlzIGVuYWJsZWQgb24gSUE2NCAqLwogI2RlZmluZSBhY3BpX25vaXJxIDAJLyogQUNQSSBhbHdheXMgZW5hYmxlZCBvbiBJQTY0ICovCiAjZGVmaW5lIGFjcGlfcGNpX2Rpc2FibGVkIDAgLyogQUNQSSBQQ0kgYWx3YXlzIGVuYWJsZWQgb24gSUE2NCAqLwogI2RlZmluZSBhY3BpX3N0cmljdCAxCS8qIG5vIEFDUEkgc3BlYyB3b3JrYXJvdW5kcyBvbiBJQTY0ICovCisjZW5kaWYKICNkZWZpbmUgYWNwaV9wcm9jZXNzb3JfY3N0YXRlX2NoZWNrKHgpICh4KSAvKiBubyBpZGxlIGxpbWl0cyBvbiBJQTY0IDopICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9hY3BpKHZvaWQpIHsgfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggZDIxN2QxZC4uMGIzYjM5OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMTI3LDcgKzEyNyw2IEBACiAKIGV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSk7CiBleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7Ci0jZGVmaW5lIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrCiAKICNlbHNlIC8qIENPTkZJR19TTVAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCAxM2FiNzE1Li4yMzllY2RjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3BpbmxvY2suaApAQCAtMTksMTAzICsxOSwxMjYgQEAKIAogI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfaW5pdCh4KQkJCSgoeCktPmxvY2sgPSAwKQogCi0jaWZkZWYgQVNNX1NVUFBPUlRFRAogLyoKLSAqIFRyeSB0byBnZXQgdGhlIGxvY2suICBJZiB3ZSBmYWlsIHRvIGdldCB0aGUgbG9jaywgbWFrZSBhIG5vbi1zdGFuZGFyZCBjYWxsIHRvCi0gKiBpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb24oKS4gIFdlIGRvIG5vdCB1c2UgYSBub3JtYWwgY2FsbCBiZWNhdXNlIHRoYXQgd291bGQgZm9yY2UgYWxsCi0gKiBjYWxsZXJzIG9mIF9fcmF3X3NwaW5fbG9jaygpIHRvIGJlIG5vbi1sZWFmIHJvdXRpbmVzLiAgSW5zdGVhZCwgaWE2NF9zcGlubG9ja19jb250ZW50aW9uKCkgaXMKLSAqIGNhcmVmdWxseSBjb2RlZCB0byB0b3VjaCBvbmx5IHRob3NlIHJlZ2lzdGVycyB0aGF0IF9fcmF3X3NwaW5fbG9jaygpIG1hcmtzICJjbG9iYmVyZWQiLgorICogVGlja2V0IGxvY2tzIGFyZSBjb25jZXB0dWFsbHkgdHdvIHBhcnRzLCBvbmUgaW5kaWNhdGluZyB0aGUgY3VycmVudCBoZWFkIG9mCisgKiB0aGUgcXVldWUsIGFuZCB0aGUgb3RoZXIgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0YWlsLiBUaGUgbG9jayBpcyBhY3F1aXJlZAorICogYnkgYXRvbWljYWxseSBub3RpbmcgdGhlIHRhaWwgYW5kIGluY3JlbWVudGluZyBpdCBieSBvbmUgKHRodXMgYWRkaW5nCisgKiBvdXJzZWxmIHRvIHRoZSBxdWV1ZSBhbmQgbm90aW5nIG91ciBwb3NpdGlvbiksIHRoZW4gd2FpdGluZyB1bnRpbCB0aGUgaGVhZAorICogYmVjb21lcyBlcXVhbCB0byB0aGUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHRhaWwuCisgKiBUaGUgcGFkIGJpdHMgaW4gdGhlIG1pZGRsZSBhcmUgdXNlZCB0byBwcmV2ZW50IHRoZSBuZXh0X3RpY2tldCBudW1iZXIKKyAqIG92ZXJmbG93aW5nIGludG8gdGhlIG5vd19zZXJ2aW5nIG51bWJlci4KKyAqCisgKiAgIDMxICAgICAgICAgICAgIDE3ICAxNiAgICAxNSAgMTQgICAgICAgICAgICAgICAgICAgIDAKKyAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICB8ICBub3dfc2VydmluZyAgICAgfCBwYWRkaW5nIHwgICBuZXh0X3RpY2tldCAgICAgICAgIHwKKyAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAqLwogCi0jZGVmaW5lIElBNjRfU1BJTkxPQ0tfQ0xPQkJFUlMgImFyLmNjdiIsICJhci5wZnMiLCAicDE0IiwgInAxNSIsICJyMjciLCAicjI4IiwgInIyOSIsICJyMzAiLCAiYjYiLCAibWVtb3J5IgorI2RlZmluZSBUSUNLRVRfU0hJRlQJMTcKKyNkZWZpbmUgVElDS0VUX0JJVFMJMTUKKyNkZWZpbmUJVElDS0VUX01BU0sJKCgxIDw8IFRJQ0tFVF9CSVRTKSAtIDEpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19yYXdfc3Bpbl9sb2NrX2ZsYWdzIChyYXdfc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3RpY2tldF9zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0JcmVnaXN0ZXIgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpwdHIgYXNtICgicjMxIikgPSAmbG9jay0+bG9jazsKKwlpbnQJKnAgPSAoaW50ICopJmxvY2stPmxvY2ssIHRpY2tldCwgc2VydmU7CiAKLSNpZiAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8IDMpCi0jIGlmZGVmIENPTkZJR19JVEFOSVVNCi0JLyogZG9uJ3QgdXNlIGJybCBvbiBJdGFuaXVtLi4uICovCi0JYXNtIHZvbGF0aWxlICgie1xuXHQiCi0JCSAgICAgICIgIG1vdiBhci5jY3YgPSByMFxuXHQiCi0JCSAgICAgICIgIG1vdiByMjggPSBpcFxuXHQiCi0JCSAgICAgICIgIG1vdiByMzAgPSAxOztcblx0IgotCQkgICAgICAifVxuXHQiCi0JCSAgICAgICJjbXB4Y2hnNC5hY3EgcjMwID0gWyUxXSwgcjMwLCBhci5jY3Zcblx0IgotCQkgICAgICAibW92bCByMjkgPSBpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb25fcHJlM180Oztcblx0IgotCQkgICAgICAiY21wNC5uZSBwMTQsIHAwID0gcjMwLCByMFxuXHQiCi0JCSAgICAgICJtb3YgYjYgPSByMjk7O1xuXHQiCi0JCSAgICAgICJtb3YgcjI3PSUyXG5cdCIKLQkJICAgICAgIihwMTQpIGJyLmNvbmQuc3BudC5tYW55IGI2IgotCQkgICAgICA6ICI9ciIocHRyKSA6ICJyIihwdHIpLCAiciIgKGZsYWdzKSA6IElBNjRfU1BJTkxPQ0tfQ0xPQkJFUlMpOwotIyBlbHNlCi0JYXNtIHZvbGF0aWxlICgie1xuXHQiCi0JCSAgICAgICIgIG1vdiBhci5jY3YgPSByMFxuXHQiCi0JCSAgICAgICIgIG1vdiByMjggPSBpcFxuXHQiCi0JCSAgICAgICIgIG1vdiByMzAgPSAxOztcblx0IgotCQkgICAgICAifVxuXHQiCi0JCSAgICAgICJjbXB4Y2hnNC5hY3EgcjMwID0gWyUxXSwgcjMwLCBhci5jY3Y7O1xuXHQiCi0JCSAgICAgICJjbXA0Lm5lIHAxNCwgcDAgPSByMzAsIHIwXG5cdCIKLQkJICAgICAgIm1vdiByMjc9JTJcblx0IgotCQkgICAgICAiKHAxNCkgYnJsLmNvbmQuc3BudC5tYW55IGlhNjRfc3BpbmxvY2tfY29udGVudGlvbl9wcmUzXzQ7OyIKLQkJICAgICAgOiAiPXIiKHB0cikgOiAiciIocHRyKSwgInIiIChmbGFncykgOiBJQTY0X1NQSU5MT0NLX0NMT0JCRVJTKTsKLSMgZW5kaWYgLyogQ09ORklHX01DS0lOTEVZICovCi0jZWxzZQotIyBpZmRlZiBDT05GSUdfSVRBTklVTQotCS8qIGRvbid0IHVzZSBicmwgb24gSXRhbml1bS4uLiAqLwotCS8qIG1pcy1kZWNsYXJlLCBzbyB3ZSBnZXQgdGhlIGVudHJ5LXBvaW50LCBub3QgaXQncyBmdW5jdGlvbiBkZXNjcmlwdG9yOiAqLwotCWFzbSB2b2xhdGlsZSAoIm1vdiByMzAgPSAxXG5cdCIKLQkJICAgICAgIm1vdiByMjc9JTJcblx0IgotCQkgICAgICAibW92IGFyLmNjdiA9IHIwOztcblx0IgotCQkgICAgICAiY21weGNoZzQuYWNxIHIzMCA9IFslMF0sIHIzMCwgYXIuY2N2XG5cdCIKLQkJICAgICAgIm1vdmwgcjI5ID0gaWE2NF9zcGlubG9ja19jb250ZW50aW9uOztcblx0IgotCQkgICAgICAiY21wNC5uZSBwMTQsIHAwID0gcjMwLCByMFxuXHQiCi0JCSAgICAgICJtb3YgYjYgPSByMjk7O1xuXHQiCi0JCSAgICAgICIocDE0KSBici5jYWxsLnNwbnQubWFueSBiNiA9IGI2IgotCQkgICAgICA6ICI9ciIocHRyKSA6ICJyIihwdHIpLCAiciIgKGZsYWdzKSA6IElBNjRfU1BJTkxPQ0tfQ0xPQkJFUlMpOwotIyBlbHNlCi0JYXNtIHZvbGF0aWxlICgibW92IHIzMCA9IDFcblx0IgotCQkgICAgICAibW92IHIyNz0lMlxuXHQiCi0JCSAgICAgICJtb3YgYXIuY2N2ID0gcjA7O1xuXHQiCi0JCSAgICAgICJjbXB4Y2hnNC5hY3EgcjMwID0gWyUwXSwgcjMwLCBhci5jY3Y7O1xuXHQiCi0JCSAgICAgICJjbXA0Lm5lIHAxNCwgcDAgPSByMzAsIHIwXG5cdCIKLQkJICAgICAgIihwMTQpIGJybC5jYWxsLnNwbnQubWFueSBiNj1pYTY0X3NwaW5sb2NrX2NvbnRlbnRpb247OyIKLQkJICAgICAgOiAiPXIiKHB0cikgOiAiciIocHRyKSwgInIiIChmbGFncykgOiBJQTY0X1NQSU5MT0NLX0NMT0JCRVJTKTsKLSMgZW5kaWYgLyogQ09ORklHX01DS0lOTEVZICovCi0jZW5kaWYKKwl0aWNrZXQgPSBpYTY0X2ZldGNoYWRkKDEsIHAsIGFjcSk7CisKKwlpZiAoISgoKHRpY2tldCA+PiBUSUNLRVRfU0hJRlQpIF4gdGlja2V0KSAmIFRJQ0tFVF9NQVNLKSkKKwkJcmV0dXJuOworCisJaWE2NF9pbnZhbGEoKTsKKworCWZvciAoOzspIHsKKwkJYXNtIHZvbGF0aWxlICgibGQ0LmMubmMgJTA9WyUxXSIgOiAiPXIiKHNlcnZlKSA6ICJyIihwKSA6ICJtZW1vcnkiKTsKKworCQlpZiAoISgoKHNlcnZlID4+IFRJQ0tFVF9TSElGVCkgXiB0aWNrZXQpICYgVElDS0VUX01BU0spKQorCQkJcmV0dXJuOworCQljcHVfcmVsYXgoKTsKKwl9CiB9CiAKLSNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrKGxvY2spIF9fcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCAwKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX190aWNrZXRfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCWludCB0bXAgPSBBQ0NFU1NfT05DRShsb2NrLT5sb2NrKTsKIAotLyogVW5sb2NrIGJ5IGRvaW5nIGFuIG9yZGVyZWQgc3RvcmUgYW5kIHJlbGVhc2luZyB0aGUgY2FjaGVsaW5lIHdpdGggbnRhICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKngpIHsKLQliYXJyaWVyKCk7Ci0JYXNtIHZvbGF0aWxlICgic3Q0LnJlbC5udGEgWyUwXSA9IHIwXG5cdCIgOjogInIiKHgpKTsKKwlpZiAoISgoKHRtcCA+PiBUSUNLRVRfU0hJRlQpIF4gdG1wKSAmIFRJQ0tFVF9NQVNLKSkKKwkJcmV0dXJuIGlhNjRfY21weGNoZyhhY3EsICZsb2NrLT5sb2NrLCB0bXAsIHRtcCArIDEsIHNpemVvZiAodG1wKSkgPT0gdG1wOworCXJldHVybiAwOwogfQogCi0jZWxzZSAvKiAhQVNNX1NVUFBPUlRFRCAqLwotI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQotIyBkZWZpbmUgX19yYXdfc3Bpbl9sb2NrKHgpCQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJCQlcCi0JX191MzIgKmlhNjRfc3BpbmxvY2tfcHRyID0gKF9fdTMyICopICh4KTsJCQkJCVwKLQlfX3U2NCBpYTY0X3NwaW5sb2NrX3ZhbDsJCQkJCQkJXAotCWlhNjRfc3BpbmxvY2tfdmFsID0gaWE2NF9jbXB4Y2hnNF9hY3EoaWE2NF9zcGlubG9ja19wdHIsIDEsIDApOwkJCVwKLQlpZiAodW5saWtlbHkoaWE2NF9zcGlubG9ja192YWwpKSB7CQkJCQkJXAotCQlkbyB7CQkJCQkJCQkJXAotCQkJd2hpbGUgKCppYTY0X3NwaW5sb2NrX3B0cikJCQkJCVwKLQkJCQlpYTY0X2JhcnJpZXIoKTsJCQkJCQlcCi0JCQlpYTY0X3NwaW5sb2NrX3ZhbCA9IGlhNjRfY21weGNoZzRfYWNxKGlhNjRfc3BpbmxvY2tfcHRyLCAxLCAwKTsJXAotCQl9IHdoaWxlIChpYTY0X3NwaW5sb2NrX3ZhbCk7CQkJCQkJXAotCX0JCQkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLSNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2soeCkJZG8geyBiYXJyaWVyKCk7ICgocmF3X3NwaW5sb2NrX3QgKikgeCktPmxvY2sgPSAwOyB9IHdoaWxlICgwKQotI2VuZGlmIC8qICFBU01fU1VQUE9SVEVEICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJdW5zaWduZWQgc2hvcnQJKnAgPSAodW5zaWduZWQgc2hvcnQgKikmbG9jay0+bG9jayArIDEsIHRtcDsKIAotI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KQkJKCh4KS0+bG9jayAhPSAwKQotI2RlZmluZSBfX3Jhd19zcGluX3RyeWxvY2soeCkJCShjbXB4Y2hnX2FjcSgmKHgpLT5sb2NrLCAwLCAxKSA9PSAwKQotI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KGxvY2spIFwKLQlkbyB7IHdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKSkgY3B1X3JlbGF4KCk7IH0gd2hpbGUgKDApCisJYXNtIHZvbGF0aWxlICgibGQyLmJpYXMgJTA9WyUxXSIgOiAiPXIiKHRtcCkgOiAiciIocCkpOworCUFDQ0VTU19PTkNFKCpwKSA9ICh0bXAgKyAyKSAmIH4xOworfQorCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl91bmxvY2tfd2FpdChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpbnQJKnAgPSAoaW50ICopJmxvY2stPmxvY2ssIHRpY2tldDsKKworCWlhNjRfaW52YWxhKCk7CisKKwlmb3IgKDs7KSB7CisJCWFzbSB2b2xhdGlsZSAoImxkNC5jLm5jICUwPVslMV0iIDogIj1yIih0aWNrZXQpIDogInIiKHApIDogIm1lbW9yeSIpOworCQlpZiAoISgoKHRpY2tldCA+PiBUSUNLRVRfU0hJRlQpIF4gdGlja2V0KSAmIFRJQ0tFVF9NQVNLKSkKKwkJCXJldHVybjsKKwkJY3B1X3JlbGF4KCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX3RpY2tldF9zcGluX2lzX2xvY2tlZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlsb25nIHRtcCA9IEFDQ0VTU19PTkNFKGxvY2stPmxvY2spOworCisJcmV0dXJuICEhKCgodG1wID4+IFRJQ0tFVF9TSElGVCkgXiB0bXApICYgVElDS0VUX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3RpY2tldF9zcGluX2lzX2NvbnRlbmRlZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlsb25nIHRtcCA9IEFDQ0VTU19PTkNFKGxvY2stPmxvY2spOworCisJcmV0dXJuICgodG1wIC0gKHRtcCA+PiBUSUNLRVRfU0hJRlQpKSAmIFRJQ0tFVF9NQVNLKSA+IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5faXNfbG9ja2VkKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCXJldHVybiBfX3RpY2tldF9zcGluX2lzX2xvY2tlZChsb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl9pc19jb250ZW5kZWQocmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJcmV0dXJuIF9fdGlja2V0X3NwaW5faXNfY29udGVuZGVkKGxvY2spOworfQorI2RlZmluZSBfX3Jhd19zcGluX2lzX2NvbnRlbmRlZAlfX3Jhd19zcGluX2lzX2NvbnRlbmRlZAorCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCV9fdGlja2V0X3NwaW5fbG9jayhsb2NrKTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCXJldHVybiBfX3RpY2tldF9zcGluX3RyeWxvY2sobG9jayk7Cit9CisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlfX3RpY2tldF9zcGluX3VubG9jayhsb2NrKTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9ja19mbGFncyhyYXdfc3BpbmxvY2tfdCAqbG9jaywKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlfX3Jhd19zcGluX2xvY2sobG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9ja193YWl0KHJhd19zcGlubG9ja190ICpsb2NrKQoreworCV9fdGlja2V0X3NwaW5fdW5sb2NrX3dhaXQobG9jayk7Cit9CiAKICNkZWZpbmUgX19yYXdfcmVhZF9jYW5fbG9jayhydykJCSgqKHZvbGF0aWxlIGludCAqKShydykgPj0gMCkKICNkZWZpbmUgX19yYXdfd3JpdGVfY2FuX2xvY2socncpCSgqKHZvbGF0aWxlIGludCAqKShydykgPT0gMCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggZDAxNDFmYi4uM2RkYjRlNyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTMzLDcgKzMzLDYgQEAKIC8qCiAgKiBSZXR1cm5zIGEgYml0bWFzayBvZiBDUFVzIG9uIE5vZGUgJ25vZGUnLgogICovCi0jZGVmaW5lIG5vZGVfdG9fY3B1bWFzayhub2RlKSAobm9kZV90b19jcHVfbWFza1tub2RlXSkKICNkZWZpbmUgY3B1bWFza19vZl9ub2RlKG5vZGUpICgmbm9kZV90b19jcHVfbWFza1tub2RlXSkKIAogLyoKQEAgLTEwNCw4ICsxMDMsNiBAQAogI2lmZGVmIENPTkZJR19TTVAKICNkZWZpbmUgdG9wb2xvZ3lfcGh5c2ljYWxfcGFja2FnZV9pZChjcHUpCShjcHVfZGF0YShjcHUpLT5zb2NrZXRfaWQpCiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfaWQoY3B1KQkJCShjcHVfZGF0YShjcHUpLT5jb3JlX2lkKQotI2RlZmluZSB0b3BvbG9neV9jb3JlX3NpYmxpbmdzKGNwdSkJCShjcHVfY29yZV9tYXBbY3B1XSkKLSNkZWZpbmUgdG9wb2xvZ3lfdGhyZWFkX3NpYmxpbmdzKGNwdSkJCShwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSkKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9jcHVtYXNrKGNwdSkJCSgmY3B1X2NvcmVfbWFwW2NwdV0pCiAjZGVmaW5lIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSkJCSgmcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGNwdSkpCiAjZGVmaW5lIHNtdF9jYXBhYmxlKCkgCQkJCShzbXBfbnVtX3NpYmxpbmdzID4gMSkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbnN0YWxsLnNoIGIvYXJjaC9pYTY0L2luc3RhbGwuc2gKaW5kZXggOTI5ZTc4MC4uMGU5MzJmNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luc3RhbGwuc2gKKysrIGIvYXJjaC9pYTY0L2luc3RhbGwuc2gKQEAgLTIxLDggKzIxLDggQEAKIAogIyBVc2VyIG1heSBoYXZlIGEgY3VzdG9tIGluc3RhbGwgc2NyaXB0CiAKLWlmIFsgLXggfi9iaW4vaW5zdGFsbGtlcm5lbCBdOyB0aGVuIGV4ZWMgfi9iaW4vaW5zdGFsbGtlcm5lbCAiJEAiOyBmaQotaWYgWyAteCAvc2Jpbi9pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyAvc2Jpbi9pbnN0YWxsa2VybmVsICIkQCI7IGZpCitpZiBbIC14IH4vYmluLyR7SU5TVEFMTEtFUk5FTH0gXTsgdGhlbiBleGVjIH4vYmluLyR7SU5TVEFMTEtFUk5FTH0gIiRAIjsgZmkKK2lmIFsgLXggL3NiaW4vJHtJTlNUQUxMS0VSTkVMfSBdOyB0aGVuIGV4ZWMgL3NiaW4vJHtJTlNUQUxMS0VSTkVMfSAiJEAiOyBmaQogCiAjIERlZmF1bHQgaW5zdGFsbCAtIHNhbWUgYXMgbWFrZSB6bGlsbwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlLmdhdGUgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlLmdhdGUKaW5kZXggMWQ4N2Y4NC4uYWI5YjAzYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZS5nYXRlCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUuZ2F0ZQpAQCAtMTAsNyArMTAsNyBAQAogICAgICAgY21kX2dhdGUgPSAkKENDKSAtbm9zdGRsaWIgJChHQVRFQ0ZMQUdTXyQoQEYpKSAtV2wsLVQsJChmaWx0ZXItb3V0IEZPUkNFLCReKSAtbyAkQAogCiBHQVRFQ0ZMQUdTX2dhdGUuc28gPSAtc2hhcmVkIC1zIC1XbCwtc29uYW1lPWxpbnV4LWdhdGUuc28uMSBcCi0JCSAgICAgJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKKwkJICAgICAkKGNhbGwgY2MtbGRvcHRpb24sIC1XbCQoY29tbWEpLS1oYXNoLXN0eWxlPXN5c3YpCiAkKG9iaikvZ2F0ZS5zbzogJChvYmopL2dhdGUubGRzICQob2JqKS9nYXRlLm8gRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxnYXRlKQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCmluZGV4IDFhNmU0NDUuLjY5NmVmZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCkBAIC0xMTMwLDk1ICsxMTMwLDYgQEAKICNlbmRpZiAvKiBDT05GSUdfSUE2NF9CUkxfRU1VICovCiAKICNpZmRlZiBDT05GSUdfU01QCi0JLyoKLQkgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBzcGlubG9jayBjb250ZW50aW9uLiAgSXQgdXNlcyBhIG5vbi1zdGFuZGFyZCBjYWxsaW5nCi0JICogY29udmVudGlvbiB0byBhdm9pZCBjb252ZXJ0aW5nIGxlYWYgcm91dGluZXMgaW50byBpbnRlcmlvciByb3V0aW5lcy4gIEJlY2F1c2UKLQkgKiBvZiB0aGlzIHNwZWNpYWwgY29udmVudGlvbiwgdGhlcmUgYXJlIHNldmVyYWwgcmVzdHJpY3Rpb25zOgotCSAqCi0JICogLSBkbyBub3QgdXNlIGdwIHJlbGF0aXZlIHZhcmlhYmxlcywgdGhpcyBjb2RlIGlzIGNhbGxlZCBmcm9tIHRoZSBrZXJuZWwKLQkgKiAgIGFuZCBmcm9tIG1vZHVsZXMsIHIxIGlzIHVuZGVmaW5lZC4KLQkgKiAtIGRvIG5vdCB1c2Ugc3RhY2tlZCByZWdpc3RlcnMsIHRoZSBjYWxsZXIgb3ducyB0aGVtLgotCSAqIC0gZG8gbm90IHVzZSB0aGUgc2NyYXRjaCBzdGFjayBzcGFjZSwgdGhlIGNhbGxlciBvd25zIGl0LgotCSAqIC0gZG8gbm90IHVzZSBhbnkgcmVnaXN0ZXJzIG90aGVyIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGJlbG93Ci0JICoKLQkgKiBJbnB1dHM6Ci0JICogICBhci5wZnMgLSBzYXZlZCBDRk0gb2YgY2FsbGVyCi0JICogICBhci5jY3YgLSAwIChhbmQgYXZhaWxhYmxlIGZvciB1c2UpCi0JICogICByMjcgICAgLSBmbGFncyBmcm9tIHNwaW5fbG9ja19pcnFzYXZlIG9yIDAuICBNdXN0IGJlIHByZXNlcnZlZC4KLQkgKiAgIHIyOCAgICAtIGF2YWlsYWJsZSBmb3IgdXNlLgotCSAqICAgcjI5ICAgIC0gYXZhaWxhYmxlIGZvciB1c2UuCi0JICogICByMzAgICAgLSBhdmFpbGFibGUgZm9yIHVzZS4KLQkgKiAgIHIzMSAgICAtIGFkZHJlc3Mgb2YgbG9jaywgYXZhaWxhYmxlIGZvciB1c2UuCi0JICogICBiNiAgICAgLSByZXR1cm4gYWRkcmVzcwotCSAqICAgcDE0ICAgIC0gYXZhaWxhYmxlIGZvciB1c2UuCi0JICogICBwMTUgICAgLSB1c2VkIHRvIHRyYWNrIGZsYWcgc3RhdHVzLgotCSAqCi0JICogSWYgeW91IHBhdGNoIHRoaXMgY29kZSB0byB1c2UgbW9yZSByZWdpc3RlcnMsIGRvIG5vdCBmb3JnZXQgdG8gdXBkYXRlCi0JICogdGhlIGNsb2JiZXIgbGlzdHMgZm9yIHNwaW5fbG9jaygpIGluIGFyY2gvaWE2NC9pbmNsdWRlL2FzbS9zcGlubG9jay5oLgotCSAqLwotCi0jaWYgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPCAzKQotCi1HTE9CQUxfRU5UUlkoaWE2NF9zcGlubG9ja19jb250ZW50aW9uX3ByZTNfNCkKLQkucHJvbG9ndWUKLQkuc2F2ZSBhci5wZnMsIHIwCS8vIHRoaXMgY29kZSBlZmZlY3RpdmVseSBoYXMgYSB6ZXJvIGZyYW1lIHNpemUKLQkuc2F2ZSBycCwgcjI4Ci0JLmJvZHkKLQlub3AgMAotCXRiaXQubnogcDE1LHAwPXIyNyxJQTY0X1BTUl9JX0JJVAotCS5yZXN0b3JlIHNwCQkvLyBwb3AgZXhpc3RpbmcgcHJvbG9ndWUgYWZ0ZXIgbmV4dCBpbnNuCi0JbW92IGI2ID0gcjI4Ci0JLnByb2xvZ3VlCi0JLnNhdmUgYXIucGZzLCByMAotCS5hbHRycCBiNgotCS5ib2R5Ci0JOzsKLShwMTUpCXNzbSBwc3IuaQkJLy8gcmVlbmFibGUgaW50ZXJydXB0cyBpZiB0aGV5IHdlcmUgb24KLQkJCQkvLyBEYXZpZE0gc2F5cyB0aGF0IHNybHouZCBpcyBzbG93IGFuZCBpcyBub3QgcmVxdWlyZWQgaW4gdGhpcyBjYXNlCi0ud2FpdDoKLQkvLyBleHBvbmVudGlhbCBiYWNrb2ZmLCBrZGIsIGxvY2ttZXRlciBldGMuIGdvIGluIGhlcmUKLQloaW50IEBwYXVzZQotCWxkNCByMzA9W3IzMV0JCS8vIGRvbid0IHVzZSBsZDQuYmlhczsgaWYgaXQncyBjb250ZW5kZWQsIHdlIHdvbid0IHdyaXRlIHRoZSB3b3JkCi0Jbm9wIDAKLQk7OwotCWNtcDQubmUgcDE0LHAwPXIzMCxyMAotKHAxNCkJYnIuY29uZC5zcHRrLmZldyAud2FpdAotKHAxNSkJcnNtIHBzci5pCQkvLyBkaXNhYmxlIGludGVycnVwdHMgaWYgd2UgcmVlbmFibGVkIHRoZW0KLQlici5jb25kLnNwdGsuZmV3IGI2CS8vIGxvY2sgaXMgbm93IGZyZWUsIHRyeSB0byBhY3F1aXJlCi0JLmdsb2JhbCBpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb25fcHJlM180X2VuZAkvLyBmb3Iga2VybnByb2YKLWlhNjRfc3BpbmxvY2tfY29udGVudGlvbl9wcmUzXzRfZW5kOgotRU5EKGlhNjRfc3BpbmxvY2tfY29udGVudGlvbl9wcmUzXzQpCi0KLSNlbHNlCi0KLUdMT0JBTF9FTlRSWShpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb24pCi0JLnByb2xvZ3VlCi0JLmFsdHJwIGI2Ci0JLmJvZHkKLQl0Yml0Lm56IHAxNSxwMD1yMjcsSUE2NF9QU1JfSV9CSVQKLQk7OwotLndhaXQ6Ci0ocDE1KQlzc20gcHNyLmkJCS8vIHJlZW5hYmxlIGludGVycnVwdHMgaWYgdGhleSB3ZXJlIG9uCi0JCQkJLy8gRGF2aWRNIHNheXMgdGhhdCBzcmx6LmQgaXMgc2xvdyBhbmQgaXMgbm90IHJlcXVpcmVkIGluIHRoaXMgY2FzZQotLndhaXQyOgotCS8vIGV4cG9uZW50aWFsIGJhY2tvZmYsIGtkYiwgbG9ja21ldGVyIGV0Yy4gZ28gaW4gaGVyZQotCWhpbnQgQHBhdXNlCi0JbGQ0IHIzMD1bcjMxXQkJLy8gZG9uJ3QgdXNlIGxkNC5iaWFzOyBpZiBpdCdzIGNvbnRlbmRlZCwgd2Ugd29uJ3Qgd3JpdGUgdGhlIHdvcmQKLQk7OwotCWNtcDQubmUgcDE0LHAwPXIzMCxyMAotCW1vdiByMzAgPSAxCi0ocDE0KQlici5jb25kLnNwdGsuZmV3IC53YWl0MgotKHAxNSkJcnNtIHBzci5pCQkvLyBkaXNhYmxlIGludGVycnVwdHMgaWYgd2UgcmVlbmFibGVkIHRoZW0KLQk7OwotCWNtcHhjaGc0LmFjcSByMzA9W3IzMV0sIHIzMCwgYXIuY2N2Ci0JOzsKLQljbXA0Lm5lIHAxNCxwMD1yMCxyMzAKLShwMTQpCWJyLmNvbmQuc3B0ay5mZXcgLndhaXQKLQotCWJyLnJldC5zcHRrLm1hbnkgYjYJLy8gbG9jayBpcyBub3cgdGFrZW4KLUVORChpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb24pCi0KLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBHTE9CQUxfRU5UUlkoaWE2NF9qdW1wX3RvX3NhbCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMKaW5kZXggOGViY2NiNS4uMTRkMzllMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMKQEAgLTg0LDI2ICs4NCw2IEBACiAjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogRVhQT1JUX1NZTUJPTCh1bndfaW5pdF9ydW5uaW5nKTsKIAotI2lmZGVmIEFTTV9TVVBQT1JURUQKLSMgaWZkZWYgQ09ORklHX1NNUAotIyAgaWYgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPCAzKQotLyoKLSAqIFRoaXMgaXMgbm90IGEgbm9ybWFsIHJvdXRpbmUgYW5kIHdlIGRvbid0IHdhbnQgYSBmdW5jdGlvbiBkZXNjcmlwdG9yIGZvciBpdCwgc28gd2UgdXNlCi0gKiBhIGZha2UgZGVjbGFyYXRpb24gaGVyZS4KLSAqLwotZXh0ZXJuIGNoYXIgaWE2NF9zcGlubG9ja19jb250ZW50aW9uX3ByZTNfNDsKLUVYUE9SVF9TWU1CT0woaWE2NF9zcGlubG9ja19jb250ZW50aW9uX3ByZTNfNCk7Ci0jICBlbHNlCi0vKgotICogVGhpcyBpcyBub3QgYSBub3JtYWwgcm91dGluZSBhbmQgd2UgZG9uJ3Qgd2FudCBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgZm9yIGl0LCBzbyB3ZSB1c2UKLSAqIGEgZmFrZSBkZWNsYXJhdGlvbiBoZXJlLgotICovCi1leHRlcm4gY2hhciBpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb247Ci1FWFBPUlRfU1lNQk9MKGlhNjRfc3BpbmxvY2tfY29udGVudGlvbik7Ci0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0VTSSkgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9FU0lfTU9EVUxFKQogZXh0ZXJuIHZvaWQgZXNpX2NhbGxfcGh5cyAodm9pZCk7CiBFWFBPUlRfU1lNQk9MX0dQTChlc2lfY2FsbF9waHlzKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL2lhNjQva2VybmVsL2luaXRfdGFzay5jCmluZGV4IGM0NzVmYzIuLmUyNTNhYjggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMzMsNyArMzMsOCBAQAogCQlzdHJ1Y3QgdGhyZWFkX2luZm8gdGhyZWFkX2luZm87CiAJfSBzOwogCXVuc2lnbmVkIGxvbmcgc3RhY2tbS0VSTkVMX1NUQUNLX1NJWkUvc2l6ZW9mICh1bnNpZ25lZCBsb25nKV07Ci19IGluaXRfdGFza19tZW0gYXNtICgiaW5pdF90YXNrIikgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmRhdGEuaW5pdF90YXNrIikpKSA9IHt7Cit9IGluaXRfdGFza19tZW0gYXNtICgiaW5pdF90YXNrIikgX19pbml0X3Rhc2tfZGF0YSA9CisJe3sKIAkudGFzayA9CQlJTklUX1RBU0soaW5pdF90YXNrX21lbS5zLnRhc2spLAogCS50aHJlYWRfaW5mbyA9CUlOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrX21lbS5zLnRhc2spCiB9fTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IGQyODc3YTcuLjQ5NmFjN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtODg3LDYgKzg4Nyw2MCBAQAogCW1lbWNweShjdXJyZW50LT5jb21tLCBjb21tLCBzaXplb2YoY3VycmVudC0+Y29tbSkpOwogfQogCitzdGF0aWMgdm9pZAorZmluaXNoX3B0X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGNvbnN0IHBhbF9taW5fc3RhdGVfYXJlYV90ICptcywKKwkJdW5zaWduZWQgbG9uZyAqbmF0KQoreworCWNvbnN0IHU2NCAqYmFuazsKKworCS8qIElmIGlwc3IuaWMgdGhlbiB1c2UgcG1zYV97aWlwLGlwc3IsaWZzfSwgZWxzZSB1c2UKKwkgKiBwbXNhX3t4aXAseHBzcix4ZnN9CisJICovCisJaWYgKGlhNjRfcHNyKHJlZ3MpLT5pYykgeworCQlyZWdzLT5jcl9paXAgPSBtcy0+cG1zYV9paXA7CisJCXJlZ3MtPmNyX2lwc3IgPSBtcy0+cG1zYV9pcHNyOworCQlyZWdzLT5jcl9pZnMgPSBtcy0+cG1zYV9pZnM7CisJfSBlbHNlIHsKKwkJcmVncy0+Y3JfaWlwID0gbXMtPnBtc2FfeGlwOworCQlyZWdzLT5jcl9pcHNyID0gbXMtPnBtc2FfeHBzcjsKKwkJcmVncy0+Y3JfaWZzID0gbXMtPnBtc2FfeGZzOworCX0KKwlyZWdzLT5wciA9IG1zLT5wbXNhX3ByOworCXJlZ3MtPmIwID0gbXMtPnBtc2FfYnIwOworCXJlZ3MtPmFyX3JzYyA9IG1zLT5wbXNhX3JzYzsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMS0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMSwgbmF0KTsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMi0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMiwgbmF0KTsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMy0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMywgbmF0KTsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbOC0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yOCwgbmF0KTsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbOS0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yOSwgbmF0KTsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMTAtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmcmVncy0+cjEwLCBuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsxMS0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMTEsIG5hdCk7CisJY29weV9yZWcoJm1zLT5wbXNhX2dyWzEyLTFdLCBtcy0+cG1zYV9uYXRfYml0cywgJnJlZ3MtPnIxMiwgbmF0KTsKKwljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMTMtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmcmVncy0+cjEzLCBuYXQpOworCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsxNC0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMTQsIG5hdCk7CisJY29weV9yZWcoJm1zLT5wbXNhX2dyWzE1LTFdLCBtcy0+cG1zYV9uYXRfYml0cywgJnJlZ3MtPnIxNSwgbmF0KTsKKwlpZiAoaWE2NF9wc3IocmVncyktPmJuKQorCQliYW5rID0gbXMtPnBtc2FfYmFuazFfZ3I7CisJZWxzZQorCQliYW5rID0gbXMtPnBtc2FfYmFuazBfZ3I7CisJY29weV9yZWcoJmJhbmtbMTYtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJnJlZ3MtPnIxNiwgbmF0KTsKKwljb3B5X3JlZygmYmFua1sxNy0xNl0sIG1zLT5wbXNhX25hdF9iaXRzLCAmcmVncy0+cjE3LCBuYXQpOworCWNvcHlfcmVnKCZiYW5rWzE4LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMTgsIG5hdCk7CisJY29weV9yZWcoJmJhbmtbMTktMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJnJlZ3MtPnIxOSwgbmF0KTsKKwljb3B5X3JlZygmYmFua1syMC0xNl0sIG1zLT5wbXNhX25hdF9iaXRzLCAmcmVncy0+cjIwLCBuYXQpOworCWNvcHlfcmVnKCZiYW5rWzIxLTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMjEsIG5hdCk7CisJY29weV9yZWcoJmJhbmtbMjItMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJnJlZ3MtPnIyMiwgbmF0KTsKKwljb3B5X3JlZygmYmFua1syMy0xNl0sIG1zLT5wbXNhX25hdF9iaXRzLCAmcmVncy0+cjIzLCBuYXQpOworCWNvcHlfcmVnKCZiYW5rWzI0LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMjQsIG5hdCk7CisJY29weV9yZWcoJmJhbmtbMjUtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJnJlZ3MtPnIyNSwgbmF0KTsKKwljb3B5X3JlZygmYmFua1syNi0xNl0sIG1zLT5wbXNhX25hdF9iaXRzLCAmcmVncy0+cjI2LCBuYXQpOworCWNvcHlfcmVnKCZiYW5rWzI3LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMjcsIG5hdCk7CisJY29weV9yZWcoJmJhbmtbMjgtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJnJlZ3MtPnIyOCwgbmF0KTsKKwljb3B5X3JlZygmYmFua1syOS0xNl0sIG1zLT5wbXNhX25hdF9iaXRzLCAmcmVncy0+cjI5LCBuYXQpOworCWNvcHlfcmVnKCZiYW5rWzMwLTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZyZWdzLT5yMzAsIG5hdCk7CisJY29weV9yZWcoJmJhbmtbMzEtMTZdLCBtcy0+cG1zYV9uYXRfYml0cywgJnJlZ3MtPnIzMSwgbmF0KTsKK30KKwogLyogT24gZW50cnkgdG8gdGhpcyByb3V0aW5lLCB3ZSBhcmUgcnVubmluZyBvbiB0aGUgcGVyIGNwdSBzdGFjaywgc2VlCiAgKiBtY2FfYXNtLmguICBUaGUgb3JpZ2luYWwgc3RhY2sgaGFzIG5vdCBiZWVuIHRvdWNoZWQgYnkgdGhpcyBldmVudC4gIFNvbWUgb2YKICAqIHRoZSBvcmlnaW5hbCBzdGFjaydzIHJlZ2lzdGVycyB3aWxsIGJlIGluIHRoZSBSQlMgb24gdGhpcyBzdGFjay4gIFRoaXMgc3RhY2sKQEAgLTkyMSw3ICs5NzUsNiBAQAogCXU2NCByMTIgPSBtcy0+cG1zYV9nclsxMi0xXSwgcjEzID0gbXMtPnBtc2FfZ3JbMTMtMV07CiAJdTY0IGFyX2JzcHN0b3JlID0gcmVncy0+YXJfYnNwc3RvcmU7CiAJdTY0IGFyX2JzcCA9IHJlZ3MtPmFyX2JzcHN0b3JlICsgKGxvYWRycyA+PiAxNik7Ci0JY29uc3QgdTY0ICpiYW5rOwogCWNvbnN0IGNoYXIgKm1zZzsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCkBAIC0xMDI0LDU0ICsxMDc3LDkgQEAKIAlwID0gKGNoYXIgKilyMTIgLSBzaXplb2YoKnJlZ3MpOwogCW9sZF9yZWdzID0gKHN0cnVjdCBwdF9yZWdzICopcDsKIAltZW1jcHkob2xkX3JlZ3MsIHJlZ3MsIHNpemVvZigqcmVncykpOwotCS8qIElmIGlwc3IuaWMgdGhlbiB1c2UgcG1zYV97aWlwLGlwc3IsaWZzfSwgZWxzZSB1c2UKLQkgKiBwbXNhX3t4aXAseHBzcix4ZnN9Ci0JICovCi0JaWYgKGlhNjRfcHNyKHJlZ3MpLT5pYykgewotCQlvbGRfcmVncy0+Y3JfaWlwID0gbXMtPnBtc2FfaWlwOwotCQlvbGRfcmVncy0+Y3JfaXBzciA9IG1zLT5wbXNhX2lwc3I7Ci0JCW9sZF9yZWdzLT5jcl9pZnMgPSBtcy0+cG1zYV9pZnM7Ci0JfSBlbHNlIHsKLQkJb2xkX3JlZ3MtPmNyX2lpcCA9IG1zLT5wbXNhX3hpcDsKLQkJb2xkX3JlZ3MtPmNyX2lwc3IgPSBtcy0+cG1zYV94cHNyOwotCQlvbGRfcmVncy0+Y3JfaWZzID0gbXMtPnBtc2FfeGZzOwotCX0KLQlvbGRfcmVncy0+cHIgPSBtcy0+cG1zYV9wcjsKLQlvbGRfcmVncy0+YjAgPSBtcy0+cG1zYV9icjA7CiAJb2xkX3JlZ3MtPmxvYWRycyA9IGxvYWRyczsKLQlvbGRfcmVncy0+YXJfcnNjID0gbXMtPnBtc2FfcnNjOwogCW9sZF91bmF0ID0gb2xkX3JlZ3MtPmFyX3VuYXQ7Ci0JY29weV9yZWcoJm1zLT5wbXNhX2dyWzEtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnIxLCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZtcy0+cG1zYV9nclsyLTFdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yMiwgJm9sZF91bmF0KTsKLQljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMy0xXSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjMsICZvbGRfdW5hdCk7Ci0JY29weV9yZWcoJm1zLT5wbXNhX2dyWzgtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnI4LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZtcy0+cG1zYV9ncls5LTFdLCBtcy0+cG1zYV9uYXRfYml0cywgJm9sZF9yZWdzLT5yOSwgJm9sZF91bmF0KTsKLQljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMTAtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnIxMCwgJm9sZF91bmF0KTsKLQljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMTEtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnIxMSwgJm9sZF91bmF0KTsKLQljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMTItMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnIxMiwgJm9sZF91bmF0KTsKLQljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMTMtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnIxMywgJm9sZF91bmF0KTsKLQljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMTQtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnIxNCwgJm9sZF91bmF0KTsKLQljb3B5X3JlZygmbXMtPnBtc2FfZ3JbMTUtMV0sIG1zLT5wbXNhX25hdF9iaXRzLCAmb2xkX3JlZ3MtPnIxNSwgJm9sZF91bmF0KTsKLQlpZiAoaWE2NF9wc3Iob2xkX3JlZ3MpLT5ibikKLQkJYmFuayA9IG1zLT5wbXNhX2JhbmsxX2dyOwotCWVsc2UKLQkJYmFuayA9IG1zLT5wbXNhX2JhbmswX2dyOwotCWNvcHlfcmVnKCZiYW5rWzE2LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjE2LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzE3LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjE3LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzE4LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjE4LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzE5LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjE5LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzIwLTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjIwLCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzIxLTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjIxLCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzIyLTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjIyLCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzIzLTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjIzLCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzI0LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjI0LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzI1LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjI1LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzI2LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjI2LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzI3LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjI3LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzI4LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjI4LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzI5LTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjI5LCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzMwLTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjMwLCAmb2xkX3VuYXQpOwotCWNvcHlfcmVnKCZiYW5rWzMxLTE2XSwgbXMtPnBtc2FfbmF0X2JpdHMsICZvbGRfcmVncy0+cjMxLCAmb2xkX3VuYXQpOworCWZpbmlzaF9wdF9yZWdzKG9sZF9yZWdzLCBtcywgJm9sZF91bmF0KTsKIAogCS8qIE5leHQgc3RhY2sgYSBzdHJ1Y3Qgc3dpdGNoX3N0YWNrLiAgbWNhX2FzbS5TIGJ1aWx0IGEgcGFydGlhbAogCSAqIHN3aXRjaF9zdGFjaywgY29weSBpdCBhbmQgZmlsbCBpbiB0aGUgYmxhbmtzIHVzaW5nIHB0X3JlZ3MgYW5kCkBAIC0xMTQxLDYgKzExNDksOCBAQAogbm9fbW9kOgogCW1wcmludGsoS0VSTl9JTkZPICJjcHUgJWQsICVzICVzLCBvcmlnaW5hbCBzdGFjayBub3QgbW9kaWZpZWRcbiIsCiAJCQlzbXBfcHJvY2Vzc29yX2lkKCksIHR5cGUsIG1zZyk7CisJb2xkX3VuYXQgPSByZWdzLT5hcl91bmF0OworCWZpbmlzaF9wdF9yZWdzKHJlZ3MsIG1zLCAmb2xkX3VuYXQpOwogCXJldHVybiBwcmV2aW91c19jdXJyZW50OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NtcC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYwppbmRleCA5M2ViZmVhLi5kYWJlZWZlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKQEAgLTMwMiw3ICszMDIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc21wX2NhbGxfZnVuY3Rpb25fbWFzayhtbS0+Y3B1X3ZtX21hc2ssCisJc21wX2NhbGxfZnVuY3Rpb25fbWFueShtbV9jcHVtYXNrKG1tKSwKIAkJKHZvaWQgKCopKHZvaWQgKikpbG9jYWxfZmluaXNoX2ZsdXNoX3RsYl9tbSwgbW0sIDEpOwogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJbG9jYWxfZmluaXNoX2ZsdXNoX3RsYl9tbShtbSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3VuYWxpZ25lZC5jIGIvYXJjaC9pYTY0L2tlcm5lbC91bmFsaWduZWQuYwppbmRleCA2ZGIwODU5Li43NzZkZDQwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3VuYWxpZ25lZC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdW5hbGlnbmVkLmMKQEAgLTYwLDcgKzYwLDYgQEAKICAqLwogaW50IG5vX3VuYWxpZ25lZF93YXJuaW5nOwogaW50IHVuYWxpZ25lZF9kdW1wX3N0YWNrOwotc3RhdGljIGludCBub3ByaW50X3dhcm5pbmc7CiAKIC8qCiAgKiBGb3IgTS11bml0OgpAQCAtMTM1Nyw5ICsxMzU2LDggQEAKIAkJCS8qIHdhdGNoIGZvciBjb21tYW5kIG5hbWVzIGNvbnRhaW5pbmcgJXMgKi8KIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIiwgYnVmKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChub191bmFsaWduZWRfd2FybmluZyAmJiAhbm9wcmludF93YXJuaW5nKSB7Ci0JCQkJbm9wcmludF93YXJuaW5nID0gMTsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyglZCkgZW5jb3VudGVyZWQgYW4gIgorCQkJaWYgKG5vX3VuYWxpZ25lZF93YXJuaW5nKSB7CisJCQkJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HICIlcyglZCkgZW5jb3VudGVyZWQgYW4gIgogCQkJCSAgICAgICAidW5hbGlnbmVkIGV4Y2VwdGlvbiB3aGljaCByZXF1aXJlZFxuIgogCQkJCSAgICAgICAia2VybmVsIGFzc2lzdGFuY2UsIHdoaWNoIGRlZ3JhZGVzICIKIAkJCQkgICAgICAgInRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgYXBwbGljYXRpb24uXG4iCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vdGxiLmMgYi9hcmNoL2lhNjQvbW0vdGxiLmMKaW5kZXggZjQyNmRjNy4uZWUwOWQyNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL3RsYi5jCisrKyBiL2FyY2gvaWE2NC9tbS90bGIuYwpAQCAtMTAwLDI0ICsxMDAsMzYgQEAKICAqIHRoaXMgcHJpbWl0aXZlIGl0IGNhbiBiZSBtb3ZlZCB1cCB0byBhIHNwaW5hcGhvcmUuaCBoZWFkZXIuCiAgKi8KIHN0cnVjdCBzcGluYXBob3JlIHsKLQlhdG9taWNfdAljdXI7CisJdW5zaWduZWQgbG9uZwl0aWNrZXQ7CisJdW5zaWduZWQgbG9uZwlzZXJ2ZTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGluYXBob3JlX2luaXQoc3RydWN0IHNwaW5hcGhvcmUgKnNzLCBpbnQgdmFsKQogewotCWF0b21pY19zZXQoJnNzLT5jdXIsIHZhbCk7CisJc3MtPnRpY2tldCA9IDA7CisJc3MtPnNlcnZlID0gdmFsOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG93bl9zcGluKHN0cnVjdCBzcGluYXBob3JlICpzcykKIHsKLQl3aGlsZSAodW5saWtlbHkoIWF0b21pY19hZGRfdW5sZXNzKCZzcy0+Y3VyLCAtMSwgMCkpKQotCQl3aGlsZSAoYXRvbWljX3JlYWQoJnNzLT5jdXIpID09IDApCi0JCQljcHVfcmVsYXgoKTsKKwl1bnNpZ25lZCBsb25nIHQgPSBpYTY0X2ZldGNoYWRkKDEsICZzcy0+dGlja2V0LCBhY3EpLCBzZXJ2ZTsKKworCWlmICh0aW1lX2JlZm9yZSh0LCBzcy0+c2VydmUpKQorCQlyZXR1cm47CisKKwlpYTY0X2ludmFsYSgpOworCisJZm9yICg7OykgeworCQlhc20gdm9sYXRpbGUgKCJsZDQuYy5uYyAlMD1bJTFdIiA6ICI9ciIoc2VydmUpIDogInIiKCZzcy0+c2VydmUpIDogIm1lbW9yeSIpOworCQlpZiAodGltZV9iZWZvcmUodCwgc2VydmUpKQorCQkJcmV0dXJuOworCQljcHVfcmVsYXgoKTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cF9zcGluKHN0cnVjdCBzcGluYXBob3JlICpzcykKIHsKLQlhdG9taWNfYWRkKDEsICZzcy0+Y3VyKTsKKwlpYTY0X2ZldGNoYWRkKDEsICZzcy0+c2VydmUsIHJlbCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpbmFwaG9yZSBwdGNnX3NlbTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9vcHJvZmlsZS9iYWNrdHJhY2UuYyBiL2FyY2gvaWE2NC9vcHJvZmlsZS9iYWNrdHJhY2UuYwppbmRleCBhZGIwMTU2Li41Y2RkN2U0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvb3Byb2ZpbGUvYmFja3RyYWNlLmMKKysrIGIvYXJjaC9pYTY0L29wcm9maWxlL2JhY2t0cmFjZS5jCkBAIC0zMiwyNCArMzIsNiBAQAogCXU2NCAqcHJldl9wZnNfbG9jOwkvKiBzdGF0ZSBmb3IgV0FSIGZvciBvbGQgc3BpbmxvY2sgb29sIGNvZGUgKi8KIH0gaWE2NF9iYWNrdHJhY2VfdDsKIAotI2lmIChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDwgMykKLS8qCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBQQyBpcyBpbiB0aGUgc3BpbmxvY2sgY29udGVudGlvbiBvdXQtb2YtbGluZSBjb2RlCi0gKiB3aXRoIG5vbi1zdGFuZGFyZCBjYWxsaW5nIHNlcXVlbmNlIChvbiBvbGRlciBjb21waWxlcnMpLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5fb2xkX29vbF9zcGlubG9ja19jb2RlKHVuc2lnbmVkIGxvbmcgcGMpCi17Ci0JZXh0ZXJuIGNvbnN0IGNoYXIgaWE2NF9zcGlubG9ja19jb250ZW50aW9uX3ByZTNfNFtdIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7Ci0JZXh0ZXJuIGNvbnN0IGNoYXIgaWE2NF9zcGlubG9ja19jb250ZW50aW9uX3ByZTNfNF9lbmRbXSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOwotCXVuc2lnbmVkIGxvbmcgc2Nfc3RhcnQgPSAodW5zaWduZWQgbG9uZylpYTY0X3NwaW5sb2NrX2NvbnRlbnRpb25fcHJlM180OwotCXVuc2lnbmVkIGxvbmcgc2NfZW5kID0gKHVuc2lnbmVkIGxvbmcpaWE2NF9zcGlubG9ja19jb250ZW50aW9uX3ByZTNfNF9lbmQ7Ci0JcmV0dXJuIChzY19zdGFydCAmJiBzY19lbmQgJiYgcGMgPj0gc2Nfc3RhcnQgJiYgcGMgPCBzY19lbmQpOwotfQotI2Vsc2UKLS8qIE5ld2VyIHNwaW5sb2NrIGNvZGUgZG9lcyBhIHByb3BlciBici5jYWxsIGFuZCB3b3JrcyBmaW5lIHdpdGggdGhlIHVud2luZGVyICovCi0jZGVmaW5lIGluX29sZF9vb2xfc3BpbmxvY2tfY29kZShwYykJMAotI2VuZGlmCi0KIC8qIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIFBDIGlzIGluIHRoZSBJbnRlcnJ1cHQgVmVjdG9yIFRhYmxlICovCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5faXZ0X2NvZGUodW5zaWduZWQgbG9uZyBwYykKIHsKQEAgLTgwLDcgKzYyLDcgQEAKIAkgKi8KIAlpZiAoYnQtPnByZXZfcGZzX2xvYyAmJiBidC0+cmVncyAmJiBidC0+ZnJhbWUucGZzX2xvYyA9PSBidC0+cHJldl9wZnNfbG9jKQogCQlidC0+ZnJhbWUucGZzX2xvYyA9ICZidC0+cmVncy0+YXJfcGZzOwotCWJ0LT5wcmV2X3Bmc19sb2MgPSAoaW5fb2xkX29vbF9zcGlubG9ja19jb2RlKGJ0LT5mcmFtZS5pcCkgPyBidC0+ZnJhbWUucGZzX2xvYyA6IE5VTEwpOworCWJ0LT5wcmV2X3Bmc19sb2MgPSBOVUxMOwogCiAJcmV0dXJuIHVud191bndpbmQoJmJ0LT5mcmFtZSkgPT0gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvcGNpLmMgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCmluZGV4IDdkZTc2ZGQuLmMwZmNhMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvcGNpLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwpAQCAtNTYsMTAgKzU2LDEzIEBACiAJaWYgKChzZWcgfCByZWcpIDw9IDI1NSkgewogCQlhZGRyID0gUENJX1NBTF9BRERSRVNTKHNlZywgYnVzLCBkZXZmbiwgcmVnKTsKIAkJbW9kZSA9IDA7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHNhbF9yZXZpc2lvbiA+PSBTQUxfVkVSU0lPTl9DT0RFKDMsMikpIHsKIAkJYWRkciA9IFBDSV9TQUxfRVhUX0FERFJFU1Moc2VnLCBidXMsIGRldmZuLCByZWcpOwogCQltb2RlID0gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKIAlyZXN1bHQgPSBpYTY0X3NhbF9wY2lfY29uZmlnX3JlYWQoYWRkciwgbW9kZSwgbGVuLCAmZGF0YSk7CiAJaWYgKHJlc3VsdCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTgwLDkgKzgzLDExIEBACiAJaWYgKChzZWcgfCByZWcpIDw9IDI1NSkgewogCQlhZGRyID0gUENJX1NBTF9BRERSRVNTKHNlZywgYnVzLCBkZXZmbiwgcmVnKTsKIAkJbW9kZSA9IDA7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHNhbF9yZXZpc2lvbiA+PSBTQUxfVkVSU0lPTl9DT0RFKDMsMikpIHsKIAkJYWRkciA9IFBDSV9TQUxfRVhUX0FERFJFU1Moc2VnLCBidXMsIGRldmZuLCByZWcpOwogCQltb2RlID0gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmVzdWx0ID0gaWE2NF9zYWxfcGNpX2NvbmZpZ193cml0ZShhZGRyLCBtb2RlLCBsZW4sIHZhbHVlKTsKIAlpZiAocmVzdWx0ICE9IDApCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19jb21tb24uYwppbmRleCAyNTgzMWM0Li4zMDhlNjU5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fY29tbW9uLmMKQEAgLTExOSw3ICsxMTksNiBAQAogICogQWRkaXRpb25hbGx5IG5vdGUgdGhhdCB0aGUgc3RydWN0IHNuX2ZsdXNoX2RldmljZV93YXIgYWxzbyBoYXMgdG8gYmUKICAqIHJlbW92ZWQgZnJvbSBhcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaAogICovCi1zdGF0aWMgdTggd2FyX2ltcGxlbWVudGVkID0gMDsKIAogc3RhdGljIHM2NCBzbl9kZXZpY2VfZml4dXBfd2FyKHU2NCBuYXNpZCwgdTY0IHdpZGdldCwgaW50IGRldmljZSwKIAkJCSAgICAgICBzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2NvbW1vbiAqY29tbW9uKQpAQCAtMTI4LDExICsxMjcsOCBAQAogCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfd2FyICpkZXZfZW50cnk7CiAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCBpc3J2ID0gezAsMCwwLDB9OwogCi0JaWYgKCF3YXJfaW1wbGVtZW50ZWQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUFJPTSB2ZXJzaW9uIDwgNC41MCAtLSBpbXBsZW1lbnRpbmcgb2xkICIKLQkJICAgICAgICJQUk9NIGZsdXNoIFdBUlxuIik7Ci0JCXdhcl9pbXBsZW1lbnRlZCA9IDE7Ci0JfQorCXByaW50a19vbmNlKEtFUk5fV0FSTklORworCQkiUFJPTSB2ZXJzaW9uIDwgNC41MCAtLSBpbXBsZW1lbnRpbmcgb2xkIFBST00gZmx1c2ggV0FSXG4iKTsKIAogCXdhcl9saXN0ID0ga3phbGxvYyhERVZfUEVSX1dJREdFVCAqIHNpemVvZigqd2FyX2xpc3QpLCBHRlBfS0VSTkVMKTsKIAlCVUdfT04oIXdhcl9saXN0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKaW5kZXggNGM3ZTc0Ny4uNTVhYzNjNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKQEAgLTc4NiwxNyArNzg2LDE4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTl9IV1BFUkZfR0VUX09CSl9OT0RFOgotCQlpZiAoYS5zeiAhPSBzaXplb2YodTY0KSB8fCBhLmFyZyA8IDApIHsKKwkJaSA9IGEuYXJnOworCQlpZiAoYS5zeiAhPSBzaXplb2YodTY0KSB8fCBpIDwgMCkgewogCQkJciA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJCWlmICgociA9IHNuX2h3cGVyZl9lbnVtX29iamVjdHMoJm5vYmosICZvYmpzKSkgPT0gMCkgewotCQkJaWYgKGEuYXJnID49IG5vYmopIHsKKwkJCWlmIChpID49IG5vYmopIHsKIAkJCQlyID0gLUVJTlZBTDsKIAkJCQl2ZnJlZShvYmpzKTsKIAkJCQlnb3RvIGVycm9yOwogCQkJfQotCQkJaWYgKG9ianNbKGkgPSBhLmFyZyldLmlkICE9IGEuYXJnKSB7CisJCQlpZiAob2Jqc1tpXS5pZCAhPSBhLmFyZykgewogCQkJCWZvciAoaSA9IDA7IGkgPCBub2JqOyBpKyspIHsKIAkJCQkJaWYgKG9ianNbaV0uaWQgPT0gYS5hcmcpCiAJCQkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9LY29uZmlnIGIvYXJjaC9tMzJyL0tjb25maWcKaW5kZXggYzQxMjM0Zi4uM2E5MzE5ZiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL0tjb25maWcKKysrIGIvYXJjaC9tMzJyL0tjb25maWcKQEAgLTExLDYgKzExLDkgQEAKIAlzZWxlY3QgSEFWRV9JREUKIAlzZWxlY3QgSEFWRV9PUFJPRklMRQogCXNlbGVjdCBJTklUX0FMTF9QT1NTSUJMRQorCXNlbGVjdCBIQVZFX0tFUk5FTF9HWklQCisJc2VsZWN0IEhBVkVfS0VSTkVMX0JaSVAyCisJc2VsZWN0IEhBVkVfS0VSTkVMX0xaTUEKIAogY29uZmlnIFNCVVMKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9tMzJyL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCA1NjA0ODRhLi4xMDAzODgwIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvbTMyci9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTQsOCArNCw4IEBACiAjIGNyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eCBpbWFnZSBmcm9tIHRoZSBvcmlnaW5hbCB2bWxpbnV4CiAjCiAKLXRhcmdldHMJCTo9IHZtbGludXggdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogaGVhZC5vIG1pc2MubyBcCi0JCSAgIHBpZ2d5Lm8gdm1saW51eC5sZHMKK3RhcmdldHMJCTo9IHZtbGludXggdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogdm1saW51eC5iaW4uYnoyIFwKKwkJICAgdm1saW51eC5iaW4ubHptYSBoZWFkLm8gbWlzYy5vIHBpZ2d5Lm8gdm1saW51eC5sZHMKIAogT0JKRUNUUyA9ICQob2JqKS9oZWFkLm8gJChvYmopL21pc2MubwogCkBAIC0yNyw2ICsyNywxMiBAQAogJChvYmopL3ZtbGludXguYmluLmd6OiAkKG9iaikvdm1saW51eC5iaW4gRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxnemlwKQogCiskKG9iaikvdm1saW51eC5iaW4uYnoyOiAkKG9iaikvdm1saW51eC5iaW4gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxiemlwMikKKworJChvYmopL3ZtbGludXguYmluLmx6bWE6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGx6bWEpCisKIENGTEFHU19taXNjLm8gKz0gLWZwaWMKIAogaWZkZWYgQ09ORklHX01NVQpAQCAtMzcsNSArNDMsOSBAQAogCiBPQkpDT1BZRkxBR1MgKz0gLVIgLmVtcHR5X3plcm9fcGFnZQogCi0kKG9iaikvcGlnZ3kubzogJChvYmopL3ZtbGludXguc2NyICQob2JqKS92bWxpbnV4LmJpbi5neiBGT1JDRQorc3VmZml4XyQoQ09ORklHX0tFUk5FTF9HWklQKQk9IGd6CitzdWZmaXhfJChDT05GSUdfS0VSTkVMX0JaSVAyKQk9IGJ6Mgorc3VmZml4XyQoQ09ORklHX0tFUk5FTF9MWk1BKQk9IGx6bWEKKworJChvYmopL3BpZ2d5Lm86ICQob2JqKS92bWxpbnV4LnNjciAkKG9iaikvdm1saW51eC5iaW4uJChzdWZmaXhfeSkgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxsZCkKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9ib290L2NvbXByZXNzZWQvaW5zdGFsbC5zaCBiL2FyY2gvbTMyci9ib290L2NvbXByZXNzZWQvaW5zdGFsbC5zaAppbmRleCA2ZDcyZTllLi4xNmU1YTBhIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvYm9vdC9jb21wcmVzc2VkL2luc3RhbGwuc2gKKysrIGIvYXJjaC9tMzJyL2Jvb3QvY29tcHJlc3NlZC9pbnN0YWxsLnNoCkBAIC0yNCw4ICsyNCw4IEBACiAKICMgVXNlciBtYXkgaGF2ZSBhIGN1c3RvbSBpbnN0YWxsIHNjcmlwdAogCi1pZiBbIC14IC9zYmluL2luc3RhbGxrZXJuZWwgXTsgdGhlbgotICBleGVjIC9zYmluL2luc3RhbGxrZXJuZWwgIiRAIgoraWYgWyAteCAvc2Jpbi8ke0lOU1RBTExLRVJORUx9IF07IHRoZW4KKyAgZXhlYyAvc2Jpbi8ke0lOU1RBTExLRVJORUx9ICIkQCIKIGZpCiAKIGlmIFsgIiQyIiA9ICJ6SW1hZ2UiIF07IHRoZW4KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC9tMzJyL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKaW5kZXggZDM5NDI5Mi4uMzcwZDYwOCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKKysrIGIvYXJjaC9tMzJyL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKQEAgLTksMTQwICs5LDQ5IEBACiAgKiBBZGFwdGVkIGZvciBTSCBieSBTdHVhcnQgTWVuZWZ5LCBBdWcgMTk5OQogICoKICAqIDIwMDMtMDItMTI6CVN1cHBvcnQgTTMyUiBieSBUYWtlbyBUYWthaGFzaGkKLSAqIAkJVGhpcyBpcyBiYXNlZCBvbiBhcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotCiAvKgogICogZ3ppcCBkZWNsYXJhdGlvbnMKICAqLwotCi0jZGVmaW5lIE9GKGFyZ3MpICBhcmdzCiAjZGVmaW5lIFNUQVRJQyBzdGF0aWMKIAogI3VuZGVmIG1lbXNldAogI3VuZGVmIG1lbWNweQogI2RlZmluZSBtZW16ZXJvKHMsIG4pICAgICBtZW1zZXQgKChzKSwgMCwgKG4pKQogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNoOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1bGc7Ci0KLSNkZWZpbmUgV1NJWkUgMHg4MDAwCQkvKiBXaW5kb3cgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDMyaywgKi8KLQkJCQkvKiBhbmQgYSBwb3dlciBvZiB0d28gKi8KLQotc3RhdGljIHVjaCAqaW5idWY7CSAgICAgLyogaW5wdXQgYnVmZmVyICovCi1zdGF0aWMgdWNoIHdpbmRvd1tXU0laRV07ICAgIC8qIFNsaWRpbmcgd2luZG93IGJ1ZmZlciAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW5zaXplID0gMDsgIC8qIHZhbGlkIGJ5dGVzIGluIGluYnVmICovCi1zdGF0aWMgdW5zaWduZWQgaW5wdHIgPSAwOyAgIC8qIGluZGV4IG9mIG5leHQgYnl0ZSB0byBiZSBwcm9jZXNzZWQgaW4gaW5idWYgKi8KLXN0YXRpYyB1bnNpZ25lZCBvdXRjbnQgPSAwOyAgLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLwotCi0vKiBnemlwIGZsYWcgYnl0ZSAqLwotI2RlZmluZSBBU0NJSV9GTEFHICAgMHgwMSAvKiBiaXQgMCBzZXQ6IGZpbGUgcHJvYmFibHkgQVNDSUkgdGV4dCAqLwotI2RlZmluZSBDT05USU5VQVRJT04gMHgwMiAvKiBiaXQgMSBzZXQ6IGNvbnRpbnVhdGlvbiBvZiBtdWx0aS1wYXJ0IGd6aXAgZmlsZSAqLwotI2RlZmluZSBFWFRSQV9GSUVMRCAgMHgwNCAvKiBiaXQgMiBzZXQ6IGV4dHJhIGZpZWxkIHByZXNlbnQgKi8KLSNkZWZpbmUgT1JJR19OQU1FICAgIDB4MDggLyogYml0IDMgc2V0OiBvcmlnaW5hbCBmaWxlIG5hbWUgcHJlc2VudCAqLwotI2RlZmluZSBDT01NRU5UICAgICAgMHgxMCAvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCi0jZGVmaW5lIEVOQ1JZUFRFRCAgICAweDIwIC8qIGJpdCA1IHNldDogZmlsZSBpcyBlbmNyeXB0ZWQgKi8KLSNkZWZpbmUgUkVTRVJWRUQgICAgIDB4QzAgLyogYml0IDYsNzogICByZXNlcnZlZCAqLwotCi0jZGVmaW5lIGdldF9ieXRlKCkgIChpbnB0ciA8IGluc2l6ZSA/IGluYnVmW2lucHRyKytdIDogZmlsbF9pbmJ1ZigpKQotCi0vKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLwotI2lmZGVmIERFQlVHCi0jICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgZXJyb3IobXNnKTt9Ci0jICBkZWZpbmUgVHJhY2UoeCkgZnByaW50ZiB4Ci0jICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAodmVyYm9zZSkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHZlcmJvc2U+MSkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh2ZXJib3NlICYmIChjKSkgZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAodmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9Ci0jZWxzZQotIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKLSMgIGRlZmluZSBUcmFjZSh4KQotIyAgZGVmaW5lIFRyYWNldih4KQotIyAgZGVmaW5lIFRyYWNldnYoeCkKLSMgIGRlZmluZSBUcmFjZWMoYyx4KQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgIGZpbGxfaW5idWYodm9pZCk7Ci1zdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCk7CiBzdGF0aWMgdm9pZCBlcnJvcihjaGFyICptKTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlucHV0X2RhdGE7Ci1zdGF0aWMgaW50IGlucHV0X2xlbjsKLQotc3RhdGljIGxvbmcgYnl0ZXNfb3V0ID0gMDsKLXN0YXRpYyB1Y2ggKm91dHB1dF9kYXRhOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3V0cHV0X3B0ciA9IDA7Ci0KICNpbmNsdWRlICJtMzJyX3Npby5jIgogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBmcmVlX21lbV9wdHI7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBmcmVlX21lbV9lbmRfcHRyOwogCi0jZGVmaW5lIEhFQVBfU0laRSAgICAgICAgICAgICAweDEwMDAwCi0KLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9saWIvaW5mbGF0ZS5jIgotCi12b2lkKiBtZW1zZXQodm9pZCogcywgaW50IGMsIHNpemVfdCBuKQorI2lmZGVmIENPTkZJR19LRVJORUxfQlpJUDIKK3N0YXRpYyB2b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQogewotCWludCBpOwotCWNoYXIgKnNzID0gKGNoYXIqKXM7CisJY2hhciAqc3MgPSBzOwogCi0JZm9yIChpPTA7aTxuO2krKykgc3NbaV0gPSBjOworCXdoaWxlIChuLS0pCisJICAgICAgIAkqc3MrKyA9IGM7CiAJcmV0dXJuIHM7CiB9CisjZW5kaWYKIAotdm9pZCogbWVtY3B5KHZvaWQqIF9fZGVzdCwgX19jb25zdCB2b2lkKiBfX3NyYywKLQkJCSAgICBzaXplX3QgX19uKQotewotCWludCBpOwotCWNoYXIgKmQgPSAoY2hhciAqKV9fZGVzdCwgKnMgPSAoY2hhciAqKV9fc3JjOworI2lmZGVmIENPTkZJR19LRVJORUxfR1pJUAorI2RlZmluZSBCT09UX0hFQVBfU0laRSAgICAgICAgICAgICAweDEwMDAwCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vbGliL2RlY29tcHJlc3NfaW5mbGF0ZS5jIgorI2VuZGlmCiAKLQlmb3IgKGk9MDtpPF9fbjtpKyspIGRbaV0gPSBzW2ldOwotCXJldHVybiBfX2Rlc3Q7Ci19CisjaWZkZWYgQ09ORklHX0tFUk5FTF9CWklQMgorI2RlZmluZSBCT09UX0hFQVBfU0laRSAgICAgICAgICAgICAweDQwMDAwMAorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2xpYi9kZWNvbXByZXNzX2J1bnppcDIuYyIKKyNlbmRpZgogCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZpbGwgdGhlIGlucHV0IGJ1ZmZlci4gVGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZW1wdHkKLSAqIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyByZWFsbHkgbmVlZGVkLgotICovCi1zdGF0aWMgaW50IGZpbGxfaW5idWYodm9pZCkKLXsKLQlpZiAoaW5zaXplICE9IDApIHsKLQkJZXJyb3IoInJhbiBvdXQgb2YgaW5wdXQgZGF0YSIpOwotCX0KLQotCWluYnVmID0gaW5wdXRfZGF0YTsKLQlpbnNpemUgPSBpbnB1dF9sZW47Ci0JaW5wdHIgPSAxOwotCXJldHVybiBpbmJ1ZlswXTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBXcml0ZSB0aGUgb3V0cHV0IHdpbmRvdyB3aW5kb3dbMC4ub3V0Y250LTFdIGFuZCB1cGRhdGUgY3JjIGFuZCBieXRlc19vdXQuCi0gKiAoVXNlZCBmb3IgdGhlIGRlY29tcHJlc3NlZCBkYXRhIG9ubHkuKQotICovCi1zdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCkKLXsKLSAgICB1bGcgYyA9IGNyYzsgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KLSAgICB1bnNpZ25lZCBuOwotICAgIHVjaCAqaW4sICpvdXQsIGNoOwotCi0gICAgaW4gPSB3aW5kb3c7Ci0gICAgb3V0ID0gJm91dHB1dF9kYXRhW291dHB1dF9wdHJdOwotICAgIGZvciAobiA9IDA7IG4gPCBvdXRjbnQ7IG4rKykgewotCSAgICBjaCA9ICpvdXQrKyA9ICppbisrOwotCSAgICBjID0gY3JjXzMyX3RhYlsoKGludCljIF4gY2gpICYgMHhmZl0gXiAoYyA+PiA4KTsKLSAgICB9Ci0gICAgY3JjID0gYzsKLSAgICBieXRlc19vdXQgKz0gKHVsZylvdXRjbnQ7Ci0gICAgb3V0cHV0X3B0ciArPSAodWxnKW91dGNudDsKLSAgICBvdXRjbnQgPSAwOwotfQorI2lmZGVmIENPTkZJR19LRVJORUxfTFpNQQorI2RlZmluZSBCT09UX0hFQVBfU0laRSAgICAgICAgICAgICAweDEwMDAwCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vbGliL2RlY29tcHJlc3NfdW5sem1hLmMiCisjZW5kaWYKIAogc3RhdGljIHZvaWQgZXJyb3IoY2hhciAqeCkKIHsKQEAgLTE1MywyMCArNjIsMjAgQEAKIAl3aGlsZSgxKTsJLyogSGFsdCAqLwogfQogCi0vKiByZXR1cm4gZGVjb21wcmVzc2VkIHNpemUgKi8KIHZvaWQKIGRlY29tcHJlc3Nfa2VybmVsKGludCBtbXVfb24sIHVuc2lnbmVkIGNoYXIgKnppbWFnZV9kYXRhLAogCQkgIHVuc2lnbmVkIGludCB6aW1hZ2VfbGVuLCB1bnNpZ25lZCBsb25nIGhlYXApCiB7CisJdW5zaWduZWQgY2hhciAqaW5wdXRfZGF0YSA9IHppbWFnZV9kYXRhOworCWludCBpbnB1dF9sZW4gPSB6aW1hZ2VfbGVuOworCXVuc2lnbmVkIGNoYXIgKm91dHB1dF9kYXRhOworCiAJb3V0cHV0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKUNPTkZJR19NRU1PUllfU1RBUlQgKyAweDIwMDAKIAkJKyAobW11X29uID8gMHg4MDAwMDAwMCA6IDApOwogCWZyZWVfbWVtX3B0ciA9IGhlYXA7Ci0JZnJlZV9tZW1fZW5kX3B0ciA9IGZyZWVfbWVtX3B0ciArIEhFQVBfU0laRTsKLQlpbnB1dF9kYXRhID0gemltYWdlX2RhdGE7Ci0JaW5wdXRfbGVuID0gemltYWdlX2xlbjsKKwlmcmVlX21lbV9lbmRfcHRyID0gZnJlZV9tZW1fcHRyICsgQk9PVF9IRUFQX1NJWkU7CiAKLQltYWtlY3JjKCk7Ci0JcHV0cygiVW5jb21wcmVzc2luZyBMaW51eC4uLiAiKTsKLQlndW56aXAoKTsKLQlwdXRzKCJPaywgYm9vdGluZyB0aGUga2VybmVsLlxuIik7CisJcHV0cygiXG5EZWNvbXByZXNzaW5nIExpbnV4Li4uICIpOworCWRlY29tcHJlc3MoaW5wdXRfZGF0YSwgaW5wdXRfbGVuLCBOVUxMLCBOVUxMLCBvdXRwdXRfZGF0YSwgTlVMTCwgZXJyb3IpOworCXB1dHMoImRvbmUuXG5Cb290aW5nIHRoZSBrZXJuZWwuXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggZDA2OTMzYi4uNDAxMGYxZiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTE2Miw2ICsxNjIsMTMgQEAKICNkZWZpbmUgX19yYXdfd3JpdGV3IHdyaXRldwogI2RlZmluZSBfX3Jhd193cml0ZWwgd3JpdGVsCiAKKyNkZWZpbmUgaW9yZWFkOCByZWFkCisjZGVmaW5lIGlvcmVhZDE2IHJlYWR3CisjZGVmaW5lIGlvcmVhZDMyIHJlYWRsCisjZGVmaW5lIGlvd3JpdGU4IHdyaXRlYgorI2RlZmluZSBpb3dyaXRlMTYgd3JpdGV3CisjZGVmaW5lIGlvd3JpdGUzMiB3cml0ZWwKKwogI2RlZmluZSBtbWlvd2IoKQogCiAjZGVmaW5lIGZsdXNoX3dyaXRlX2J1ZmZlcnMoKSBkbyB7IH0gd2hpbGUgKDApICAvKiBNMzJSX0ZJWE1FICovCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IDkxOTA5ZTUuLmE3MGEzZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogCWlmIChwcmV2ICE9IG5leHQpIHsKICNpZmRlZiBDT05GSUdfU01QCi0JCWNwdV9zZXQoY3B1LCBuZXh0LT5jcHVfdm1fbWFzayk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1tX2NwdW1hc2sobmV4dCkpOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAkJLyogU2V0IE1QVEIgPSBuZXh0LT5wZ2QgKi8KIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopTVBUQiA9ICh1bnNpZ25lZCBsb25nKW5leHQtPnBnZDsKQEAgLTEzNSw3ICsxMzUsNyBAQAogCX0KICNpZmRlZiBDT05GSUdfU01QCiAJZWxzZQotCQlpZiAoIWNwdV90ZXN0X2FuZF9zZXQoY3B1LCBuZXh0LT5jcHVfdm1fbWFzaykpCisJCWlmICghY3B1bWFza190ZXN0X2FuZF9zZXRfY3B1KGNwdSwgbW1fY3B1bWFzayhuZXh0KSkpCiAJCQlhY3RpdmF0ZV9jb250ZXh0KG5leHQpOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IDExNzc3ZjcuLjcyNWVkZTggMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMSw5ICsxLDExIEBACiAjaWZuZGVmIF9BU01fTTMyUl9QQUdFX0gKICNkZWZpbmUgX0FTTV9NMzJSX1BBR0VfSAogCisjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KKwogLyogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUgKi8KICNkZWZpbmUgUEFHRV9TSElGVAkxMgotI2RlZmluZSBQQUdFX1NJWkUJKDFVTCA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQQUdFX1NJWkUJKF9BQygxLCBVTCkgPDwgUEFHRV9TSElGVCkKICNkZWZpbmUgUEFHRV9NQVNLCSh+KFBBR0VfU0laRS0xKSkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAxYTk5N2ZjLi44Mzk3YzI0IDEwMDY0NAotLS0gYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0xNDAsOCArMTQwLDYgQEAKICNkZWZpbmUgS1NUS19FSVAodHNrKSAgKCh0c2spLT50aHJlYWQubHIpCiAjZGVmaW5lIEtTVEtfRVNQKHRzaykgICgodHNrKS0+dGhyZWFkLnNwKQogCi0jZGVmaW5lIFRIUkVBRF9TSVpFICgyKlBBR0VfU0laRSkKLQogI2RlZmluZSBjcHVfcmVsYXgoKQliYXJyaWVyKCkKIAogI2VuZGlmIC8qIF9BU01fTTMyUl9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IGI5NmE2ZDIuLmU2N2RlZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vc21wLmgKQEAgLTg4LDcgKzg4LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNlbmRfSVBJX21hc2tfcGh5cyhjcHVtYXNrX3QsIGludCwgaW50KTsKIAogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KTsKLWV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaShjcHVtYXNrX3QgbWFzayk7CitleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CiAKICNlbmRpZgkvKiBub3QgX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggNzE1NzgxNS4uZWQyNDBiNiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTU1LDYgKzU1LDggQEAKIAogI2RlZmluZSBQUkVFTVBUX0FDVElWRQkJMHgxMDAwMDAwMAogCisjZGVmaW5lIFRIUkVBRF9TSVpFIChQQUdFX1NJWkUgPDwgMSkKKwogLyoKICAqIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlCiAgKi8KQEAgLTc2LDggKzc4LDYgQEAKICNkZWZpbmUgaW5pdF90aHJlYWRfaW5mbwkoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCiAjZGVmaW5lIGluaXRfc3RhY2sJCShpbml0X3RocmVhZF91bmlvbi5zdGFjaykKIAotI2RlZmluZSBUSFJFQURfU0laRSAoMipQQUdFX1NJWkUpCi0KIC8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBDICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQogewpAQCAtMTI1LDE3ICsxMjUsNiBAQAogCXJldHVybiB0aS0+ZmxhZ3MgPj4gVElfRkxBR19GQVVMVF9DT0RFX1NISUZUOwogfQogCi0jZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCi0KLSNkZWZpbmUgVEhSRUFEX1NJWkUJODE5MgotCi0vKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQVNNICovCi0jZGVmaW5lIEdFVF9USFJFQURfSU5GTyhyZWcpCUdFVF9USFJFQURfSU5GTyByZWcKLQkubWFjcm8gR0VUX1RIUkVBRF9JTkZPIHJlZwotCWxkaQlccmVnLCAjLVRIUkVBRF9TSVpFCi0JYW5kCVxyZWcsIHNwCi0JLmVuZG0KLQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL2VudHJ5LlMgYi9hcmNoL20zMnIva2VybmVsL2VudHJ5LlMKaW5kZXggNjEyZDM1Yi4uNDAzODY5OCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvZW50cnkuUwpAQCAtMTE4LDYgKzExOCwxMyBAQAogI2RlZmluZSByZXN1bWVfa2VybmVsCQlyZXN0b3JlX2FsbAogI2VuZGlmCiAKKy8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBBU00gKi8KKyNkZWZpbmUgR0VUX1RIUkVBRF9JTkZPKHJlZykJR0VUX1RIUkVBRF9JTkZPIHJlZworCS5tYWNybyBHRVRfVEhSRUFEX0lORk8gcmVnCisJbGRpCVxyZWcsICMtVEhSRUFEX1NJWkUKKwlhbmQJXHJlZywgc3AKKwkuZW5kbQorCiBFTlRSWShyZXRfZnJvbV9mb3JrKQogCXBvcAlyMAogCWJsCXNjaGVkdWxlX3RhaWwKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvaGVhZC5TIGIvYXJjaC9tMzJyL2tlcm5lbC9oZWFkLlMKaW5kZXggMGE3MTk0NC4uYTQ2NjUyZCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9oZWFkLlMKQEAgLTI2OCwxMyArMjY4LDEzIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogU3RhY2sgYXJlYQogICovCi0JLnNlY3Rpb24gLnNwaQorCS5zZWN0aW9uIC5pbml0LmRhdGEsICJhdyIKIAlBTElHTgogCS5nbG9iYWwgc3BpX3N0YWNrX3RvcAogCS56ZXJvCTEwMjQKIHNwaV9zdGFja190b3A6CiAKLQkuc2VjdGlvbiAuc3B1CisJLnNlY3Rpb24gLmluaXQuZGF0YSwgImF3IgogCUFMSUdOCiAJLmdsb2JhbCBzcHVfc3RhY2tfdG9wCiAJLnplcm8JMTAyNApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvbTMyci9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggZmNlNTdlNS4uNmM0MmQ1ZiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL20zMnIva2VybmVsL2luaXRfdGFzay5jCkBAIC0yMCw5ICsyMCw4IEBACiAgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCiAgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KICAqLwotdW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPQotCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPQorCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CiAKIC8qCiAgKiBJbml0aWFsIHRhc2sgc3RydWN0dXJlLgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9tMzJyX2tzeW1zLmMgYi9hcmNoL20zMnIva2VybmVsL20zMnJfa3N5bXMuYwppbmRleCAyMjYyNGI1Li43MDA1NzA3IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL20zMnJfa3N5bXMuYworKysgYi9hcmNoL20zMnIva2VybmVsL20zMnJfa3N5bXMuYwpAQCAtMjMsMTIgKzIzLDYgQEAKIEVYUE9SVF9TWU1CT0woaW91bm1hcCk7CiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwogCi0vKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLS8qIERlbGF5IGxvb3BzICovCi1FWFBPUlRfU1lNQk9MKF9fdWRlbGF5KTsKLUVYUE9SVF9TWU1CT0woX19kZWxheSk7Ci1FWFBPUlRfU1lNQk9MKF9fY29uc3RfdWRlbGF5KTsKLQogRVhQT1JUX1NZTUJPTChzdHJuY3B5X2Zyb21fdXNlcik7CiBFWFBPUlRfU1lNQk9MKF9fc3RybmNweV9mcm9tX3VzZXIpOwogRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc21wLmMgYi9hcmNoL20zMnIva2VybmVsL3NtcC5jCmluZGV4IDkyOWU1YzlkLi4zMWNlZjIwIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc21wLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtODUsNyArODYsNyBAQAogdm9pZCBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHZvaWQpOwogCiBzdGF0aWMgdm9pZCBzZW5kX0lQSV9hbGxidXRzZWxmKGludCwgaW50KTsKLXN0YXRpYyB2b2lkIHNlbmRfSVBJX21hc2soY3B1bWFza190LCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBzZW5kX0lQSV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICosIGludCwgaW50KTsKIHVuc2lnbmVkIGxvbmcgc2VuZF9JUElfbWFza19waHlzKGNwdW1hc2tfdCwgaW50LCBpbnQpOwogCiAvKj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSo9Kj0qPSovCkBAIC0xMTMsNyArMTE0LDcgQEAKIHZvaWQgc21wX3NlbmRfcmVzY2hlZHVsZShpbnQgY3B1X2lkKQogewogCVdBUk5fT04oY3B1X2lzX29mZmxpbmUoY3B1X2lkKSk7Ci0Jc2VuZF9JUElfbWFzayhjcHVtYXNrX29mX2NwdShjcHVfaWQpLCBSRVNDSEVEVUxFX0lQSSwgMSk7CisJc2VuZF9JUElfbWFzayhjcHVtYXNrX29mKGNwdV9pZCksIFJFU0NIRURVTEVfSVBJLCAxKTsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoKQEAgLTE2OCw3ICsxNjksNyBAQAogCXNwaW5fbG9jaygmZmx1c2hjYWNoZV9sb2NrKTsKIAltYXNrPWNwdXNfYWRkcihjcHVtYXNrKTsKIAlhdG9taWNfc2V0X21hc2soKm1hc2ssIChhdG9taWNfdCAqKSZmbHVzaGNhY2hlX2NwdW1hc2spOwotCXNlbmRfSVBJX21hc2soY3B1bWFzaywgSU5WQUxJREFURV9DQUNIRV9JUEksIDApOworCXNlbmRfSVBJX21hc2soJmNwdW1hc2ssIElOVkFMSURBVEVfQ0FDSEVfSVBJLCAwKTsKIAlfZmx1c2hfY2FjaGVfY29weWJhY2tfYWxsKCk7CiAJd2hpbGUgKGZsdXNoY2FjaGVfY3B1bWFzaykKIAkJbWIoKTsKQEAgLTI2NCw3ICsyNjUsNyBAQAogCXByZWVtcHRfZGlzYWJsZSgpOwogCWNwdV9pZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAltbWMgPSAmbW0tPmNvbnRleHRbY3B1X2lkXTsKLQljcHVfbWFzayA9IG1tLT5jcHVfdm1fbWFzazsKKwljcHVfbWFzayA9ICptbV9jcHVtYXNrKG1tKTsKIAljcHVfY2xlYXIoY3B1X2lkLCBjcHVfbWFzayk7CiAKIAlpZiAoKm1tYyAhPSBOT19DT05URVhUKSB7CkBAIC0yNzMsNyArMjc0LDcgQEAKIAkJaWYgKG1tID09IGN1cnJlbnQtPm1tKQogCQkJYWN0aXZhdGVfY29udGV4dChtbSk7CiAJCWVsc2UKLQkJCWNwdV9jbGVhcihjcHVfaWQsIG1tLT5jcHVfdm1fbWFzayk7CisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHVfaWQsIG1tX2NwdW1hc2sobW0pKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAlpZiAoIWNwdXNfZW1wdHkoY3B1X21hc2spKQpAQCAtMzM0LDcgKzMzNSw3IEBACiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJY3B1X2lkID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCW1tYyA9ICZtbS0+Y29udGV4dFtjcHVfaWRdOwotCWNwdV9tYXNrID0gbW0tPmNwdV92bV9tYXNrOworCWNwdV9tYXNrID0gKm1tX2NwdW1hc2sobW0pOwogCWNwdV9jbGVhcihjcHVfaWQsIGNwdV9tYXNrKTsKIAogI2lmZGVmIERFQlVHX1NNUApAQCAtNDI0LDcgKzQyNSw3IEBACiAJICogV2UgaGF2ZSB0byBzZW5kIHRoZSBJUEkgb25seSB0bwogCSAqIENQVXMgYWZmZWN0ZWQuCiAJICovCi0Jc2VuZF9JUElfbWFzayhjcHVtYXNrLCBJTlZBTElEQVRFX1RMQl9JUEksIDApOworCXNlbmRfSVBJX21hc2soJmNwdW1hc2ssIElOVkFMSURBVEVfVExCX0lQSSwgMCk7CiAKIAl3aGlsZSAoIWNwdXNfZW1wdHkoZmx1c2hfY3B1bWFzaykpIHsKIAkJLyogbm90aGluZy4gbG9ja3VwIGRldGVjdGlvbiBkb2VzIG5vdCBiZWxvbmcgaGVyZSAqLwpAQCAtNDY5LDcgKzQ3MCw3IEBACiAJCWlmIChmbHVzaF9tbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pCiAJCQlhY3RpdmF0ZV9jb250ZXh0KGZsdXNoX21tKTsKIAkJZWxzZQotCQkJY3B1X2NsZWFyKGNwdV9pZCwgZmx1c2hfbW0tPmNwdV92bV9tYXNrKTsKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdV9pZCwgbW1fY3B1bWFzayhmbHVzaF9tbSkpOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGxvbmcgdmEgPSBmbHVzaF92YTsKIApAQCAtNTQ2LDE0ICs1NDcsMTQgQEAKIAlmb3IgKCA7IDsgKTsKIH0KIAotdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGkoY3B1bWFza190IG1hc2spCit2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXNlbmRfSVBJX21hc2sobWFzaywgQ0FMTF9GVU5DVElPTl9JUEksIDApOwogfQogCiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSkKIHsKLQlzZW5kX0lQSV9tYXNrKGNwdW1hc2tfb2ZfY3B1KGNwdSksIENBTExfRlVOQ19TSU5HTEVfSVBJLCAwKTsKKwlzZW5kX0lQSV9tYXNrKGNwdW1hc2tfb2YoY3B1KSwgQ0FMTF9GVU5DX1NJTkdMRV9JUEksIDApOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgpAQCAtNzI5LDcgKzczMCw3IEBACiAJY3B1bWFzayA9IGNwdV9vbmxpbmVfbWFwOwogCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNwdW1hc2spOwogCi0Jc2VuZF9JUElfbWFzayhjcHVtYXNrLCBpcGlfbnVtLCB0cnkpOworCXNlbmRfSVBJX21hc2soJmNwdW1hc2ssIGlwaV9udW0sIHRyeSk7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qCkBAIC03NTIsNyArNzUzLDcgQEAKICAqIC0tLS0tLS0tLS0gLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgdm9pZCBzZW5kX0lQSV9tYXNrKGNwdW1hc2tfdCBjcHVtYXNrLCBpbnQgaXBpX251bSwgaW50IHRyeSkKK3N0YXRpYyB2b2lkIHNlbmRfSVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssIGludCBpcGlfbnVtLCBpbnQgdHJ5KQogewogCWNwdW1hc2tfdCBwaHlzaWRfbWFzaywgdG1wOwogCWludCBjcHVfaWQsIHBoeXNfaWQ7CkBAIC03NjEsMTEgKzc2MiwxMSBAQAogCWlmIChudW1fY3B1cyA8PSAxKQkvKiBOTyBNUCAqLwogCQlyZXR1cm47CiAKLQljcHVzX2FuZCh0bXAsIGNwdW1hc2ssIGNwdV9vbmxpbmVfbWFwKTsKLQlCVUdfT04oIWNwdXNfZXF1YWwoY3B1bWFzaywgdG1wKSk7CisJY3B1bWFza19hbmQoJnRtcCwgY3B1bWFzaywgY3B1X29ubGluZV9tYXNrKTsKKwlCVUdfT04oIWNwdW1hc2tfZXF1YWwoY3B1bWFzaywgJnRtcCkpOwogCiAJcGh5c2lkX21hc2sgPSBDUFVfTUFTS19OT05FOwotCWZvcl9lYWNoX2NwdV9tYXNrKGNwdV9pZCwgY3B1bWFzayl7CisJZm9yX2VhY2hfY3B1KGNwdV9pZCwgY3B1bWFzaykgewogCQlpZiAoKHBoeXNfaWQgPSBjcHVfdG9fcGh5c2lkKGNwdV9pZCkpICE9IC0xKQogCQkJY3B1X3NldChwaHlzX2lkLCBwaHlzaWRfbWFzayk7CiAJfQpAQCAtODA1LDcgKzgwNiw3IEBACiAKIAlpZiAobWFzayAmIH5waHlzaWRzX2NvZXJjZShwaHlzX2NwdV9wcmVzZW50X21hcCkpCiAJCUJVRygpOwotCWlmIChpcGlfbnVtID49IE5SX0lQSVMpCisJaWYgKGlwaV9udW0gPj0gTlJfSVBJUyB8fCBpcGlfbnVtIDwgMCkKIAkJQlVHKCk7CiAKIAltYXNrIDw8PSBJUElfU0hJRlQ7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDY1NWVhMWMuLmUwMzQ4NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAlmb3IgKHBoeXNfaWQgPSAwIDsgcGh5c19pZCA8IG5yX2NwdSA7IHBoeXNfaWQrKykKIAkJcGh5c2lkX3NldChwaHlzX2lkLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CiAjaWZuZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNwdV9wcmVzZW50X21hcCA9IGNwdV9wb3NzaWJsZV9tYXA7CisJaW5pdF9jcHVfcHJlc2VudCgmY3B1X3Bvc3NpYmxlX21hcCk7CiAjZW5kaWYKIAogCXNob3dfbXBfaW5mbyhucl9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMgYi9hcmNoL20zMnIva2VybmVsL3RpbWUuYwppbmRleCBiYTYxYzRjLi45Y2VkY2VmIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3RpbWUuYworKysgYi9hcmNoL20zMnIva2VybmVsL3RpbWUuYwpAQCAtMzMsNiArMzMsMTUgQEAKIAogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQ01PUykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9DTU9TX01PRFVMRSkKKy8qIHRoaXMgbmVlZHMgYSBiZXR0ZXIgaG9tZSAqLworREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKKworI2lmZGVmIENPTkZJR19SVENfRFJWX0NNT1NfTU9EVUxFCitFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKKyNlbmRpZgorI2VuZGlmICAvKiBwYy1zdHlsZSAnQ01PUycgUlRDIHN1cHBvcnQgKi8KKwogI2lmZGVmIENPTkZJR19TTVAKIGV4dGVybiB2b2lkIHNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQodm9pZCk7CiAjZW5kaWYKQEAgLTY2LDcgKzc1LDcgQEAKIAkJY291bnQgPSAwOwogCiAJY291bnQgPSAobGF0Y2ggLSBjb3VudCkgKiBUSUNLX1NJWkU7Ci0JZWxhcHNlZF90aW1lID0gKGNvdW50ICsgbGF0Y2ggLyAyKSAvIGxhdGNoOworCWVsYXBzZWRfdGltZSA9IERJVl9ST1VORF9DTE9TRVNUKGNvdW50LCBsYXRjaCk7CiAJLyogTk9URTogTEFUQ0ggaXMgZXF1YWwgdG8gdGhlICJpbnRlcnZhbCIgdmFsdWUgKD0gcmVsb2FkIGNvdW50KS4gKi8KIAogI2Vsc2UgLyogQ09ORklHX1NNUCAqLwpAQCAtODQsNyArOTMsNyBAQAogCXBfY291bnQgPSBjb3VudDsKIAogCWNvdW50ID0gKGxhdGNoIC0gY291bnQpICogVElDS19TSVpFOwotCWVsYXBzZWRfdGltZSA9IChjb3VudCArIGxhdGNoIC8gMikgLyBsYXRjaDsKKwllbGFwc2VkX3RpbWUgPSBESVZfUk9VTkRfQ0xPU0VTVChjb3VudCwgbGF0Y2gpOwogCS8qIE5PVEU6IExBVENIIGlzIGVxdWFsIHRvIHRoZSAiaW50ZXJ2YWwiIHZhbHVlICg9IHJlbG9hZCBjb3VudCkuICovCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ0hJUF9NMzIzMTApCkBAIC0yMDIsNyArMjExLDcgQEAKIAogCQlidXNfY2xvY2sgPSBib290X2NwdV9kYXRhLmJ1c19jbG9jazsKIAkJZGl2aWRlID0gYm9vdF9jcHVfZGF0YS50aW1lcl9kaXZpZGU7Ci0JCWxhdGNoID0gKGJ1c19jbG9jay9kaXZpZGUgKyBIWiAvIDIpIC8gSFo7CisJCWxhdGNoID0gRElWX1JPVU5EX0NMT1NFU1QoYnVzX2Nsb2NrL2RpdmlkZSwgSFopOwogCiAJCXByaW50aygiVGltZXIgc3RhcnQgOiBsYXRjaCA9ICVsZFxuIiwgbGF0Y2gpOwogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3RyYXBzLmMgYi9hcmNoL20zMnIva2VybmVsL3RyYXBzLmMKaW5kZXggMDNiMTRlNS4uZmJkMTA5MCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvdHJhcHMuYwpAQCAtMTA0LDggKzEwNCw4IEBACiAJZWl0X3ZlY3RvclsxODZdID0gKHVuc2lnbmVkIGxvbmcpc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0OwogCWVpdF92ZWN0b3JbMTg3XSA9ICh1bnNpZ25lZCBsb25nKXNtcF9pcGlfdGltZXJfaW50ZXJydXB0OwogCWVpdF92ZWN0b3JbMTg4XSA9ICh1bnNpZ25lZCBsb25nKXNtcF9mbHVzaF9jYWNoZV9hbGxfaW50ZXJydXB0OwotCWVpdF92ZWN0b3JbMTg5XSA9ICh1bnNpZ25lZCBsb25nKXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQ7Ci0JZWl0X3ZlY3RvclsxOTBdID0gMDsKKwllaXRfdmVjdG9yWzE4OV0gPSAwOwkvKiBDUFVfQk9PVF9JUEkgKi8KKwllaXRfdmVjdG9yWzE5MF0gPSAodW5zaWduZWQgbG9uZylzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaW50ZXJydXB0OwogCWVpdF92ZWN0b3JbMTkxXSA9IDA7CiAjZW5kaWYKIAlfZmx1c2hfY2FjaGVfY29weWJhY2tfYWxsKCk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL20zMnIva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZGU1ZTIxYy4uN2RhOTRlYSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCiBPVVRQVVRfQVJDSChtMzJyKQogI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCkBAIC00MCw4MyArNDEsMjQgQEAKICNlbmRpZgogICBfZXRleHQgPSAuOwkJCS8qIEVuZCBvZiB0ZXh0IHNlY3Rpb24gKi8KIAotICAuID0gQUxJR04oMTYpOwkJLyogRXhjZXB0aW9uIHRhYmxlICovCi0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47CisgIEVYQ0VQVElPTl9UQUJMRSgxNikKKyAgTk9URVMKIAogICBST0RBVEEKLQotICAvKiB3cml0ZWFibGUgKi8KLSAgLmRhdGEgOiB7CQkJLyogRGF0YSAqLwotCSooLnNwdSkKLQkqKC5zcGkpCi0JREFUQV9EQVRBCi0JQ09OU1RSVUNUT1JTCi0JfQotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19ub3NhdmVfYmVnaW4gPSAuOwotICAuZGF0YV9ub3NhdmUgOiB7ICooLmRhdGEubm9zYXZlKSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19ub3NhdmVfZW5kID0gLjsKLQotICAuID0gQUxJR04oMzIpOwotICAuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsgKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgfQotCisgIFJXX0RBVEFfU0VDVElPTigzMiwgUEFHRV9TSVpFLCBUSFJFQURfU0laRSkKICAgX2VkYXRhID0gLjsJCQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCiAKLSAgLiA9IEFMSUdOKDgxOTIpOwkJLyogaW5pdF90YXNrICovCi0gIC5kYXRhLmluaXRfdGFzayA6IHsgKiguZGF0YS5pbml0X3Rhc2spIH0KLQogICAvKiB3aWxsIGJlIGZyZWVkIGFmdGVyIGluaXQgKi8KLSAgLiA9IEFMSUdOKDQwOTYpOwkJLyogSW5pdCBjb2RlIGFuZCBkYXRhICovCisgIC4gPSBBTElHTihQQUdFX1NJWkUpOwkJLyogSW5pdCBjb2RlIGFuZCBkYXRhICovCiAgIF9faW5pdF9iZWdpbiA9IC47Ci0gIC5pbml0LnRleHQgOiB7Ci0JX3Npbml0dGV4dCA9IC47Ci0JSU5JVF9URVhUCi0JX2Vpbml0dGV4dCA9IC47Ci0gIH0KLSAgLmluaXQuZGF0YSA6IHsgSU5JVF9EQVRBIH0KLSAgLiA9IEFMSUdOKDE2KTsKLSAgX19zZXR1cF9zdGFydCA9IC47Ci0gIC5pbml0LnNldHVwIDogeyAqKC5pbml0LnNldHVwKSB9Ci0gIF9fc2V0dXBfZW5kID0gLjsKLSAgX19pbml0Y2FsbF9zdGFydCA9IC47Ci0gIC5pbml0Y2FsbC5pbml0IDogewotCUlOSVRDQUxMUwotICB9Ci0gIF9faW5pdGNhbGxfZW5kID0gLjsKLSAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotICAuY29uX2luaXRjYWxsLmluaXQgOiB7ICooLmNvbl9pbml0Y2FsbC5pbml0KSB9Ci0gIF9fY29uX2luaXRjYWxsX2VuZCA9IC47Ci0gIFNFQ1VSSVRZX0lOSVQKLSAgLiA9IEFMSUdOKDQpOwotICBfX2FsdF9pbnN0cnVjdGlvbnMgPSAuOwotICAuYWx0aW5zdHJ1Y3Rpb25zIDogeyAqKC5hbHRpbnN0cnVjdGlvbnMpIH0KLSAgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCA9IC47Ci0gIC5hbHRpbnN0cl9yZXBsYWNlbWVudCA6IHsgKiguYWx0aW5zdHJfcmVwbGFjZW1lbnQpIH0KLSAgLyogLmV4aXQudGV4dCBpcyBkaXNjYXJkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aCByZWZlcmVuY2VzCi0gICAgIGZyb20gLmFsdGluc3RydWN0aW9ucyBhbmQgLmVoX2ZyYW1lICovCi0gIC5leGl0LnRleHQgOiB7IEVYSVRfVEVYVCB9Ci0gIC5leGl0LmRhdGEgOiB7IEVYSVRfREFUQSB9Ci0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRyYW1mc19zdGFydCA9IC47Ci0gIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LnJhbWZzKSB9Ci0gIF9faW5pdHJhbWZzX2VuZCA9IC47Ci0jZW5kaWYKLQotICBQRVJDUFUoNDA5NikKLSAgLiA9IEFMSUdOKDQwOTYpOworICBJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCisgIElOSVRfREFUQV9TRUNUSU9OKDE2KQorICBQRVJDUFUoUEFHRV9TSVpFKQorICAuID0gQUxJR04oUEFHRV9TSVpFKTsKICAgX19pbml0X2VuZCA9IC47CiAgIC8qIGZyZWVkIGFmdGVyIGluaXQgZW5kcyBoZXJlICovCiAKLSAgX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTICovCi0gIC5ic3MgOiB7ICooLmJzcykgfQotICAuID0gQUxJR04oNCk7Ci0gIF9fYnNzX3N0b3AgPSAuOworICBCU1NfU0VDVElPTigwLCAwLCA0KQogCiAgIF9lbmQgPSAuIDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2xpYi9kZWxheS5jIGIvYXJjaC9tMzJyL2xpYi9kZWxheS5jCmluZGV4IGNlZDU0OWIuLjk0MGY0ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9saWIvZGVsYXkuYworKysgYi9hcmNoL20zMnIvbGliL2RlbGF5LmMKQEAgLTEyMiw0ICsxMjIsOCBAQAogewogCV9fY29uc3RfdWRlbGF5KG5zZWNzICogMHgwMDAwNSk7ICAvKiAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCiB9CisKK0VYUE9SVF9TWU1CT0woX19kZWxheSk7CitFWFBPUlRfU1lNQk9MKF9fY29uc3RfdWRlbGF5KTsKK0VYUE9SVF9TWU1CT0woX191ZGVsYXkpOwogRVhQT1JUX1NZTUJPTChfX25kZWxheSk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvbW0vZGlzY29udGlnLmMgYi9hcmNoL20zMnIvbW0vZGlzY29udGlnLmMKaW5kZXggYjdhNzhhZC4uNWQyODU4ZiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvbTMyci9tbS9kaXNjb250aWcuYwpAQCAtMzIsNiArMzIsOSBAQAogfSBtZW1fcHJvZl90Owogc3RhdGljIG1lbV9wcm9mX3QgbWVtX3Byb2ZbTUFYX05VTU5PREVTXTsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3N0YXJ0OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtb3J5X2VuZDsKKwogc3RhdGljIHZvaWQgX19pbml0IG1lbV9wcm9mX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgaG9sZXMsIGZyZWVfcGZuOwpAQCAtNDIsNyArNDUsNyBAQAogCS8qIE5vZGUjMCBTRFJBTSAqLwogCW1wID0gJm1lbV9wcm9mWzBdOwogCW1wLT5zdGFydF9wZm4gPSBQRk5fVVAoQ09ORklHX01FTU9SWV9TVEFSVCk7Ci0JbXAtPnBhZ2VzID0gUEZOX0RPV04oQ09ORklHX01FTU9SWV9TSVpFKTsKKwltcC0+cGFnZXMgPSBQRk5fRE9XTihtZW1vcnlfZW5kIC0gbWVtb3J5X3N0YXJ0KTsKIAltcC0+aG9sZXMgPSAwOwogCW1wLT5mcmVlX3BmbiA9IFBGTl9VUChfX3BhKF9lbmQpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL21tL21tdS5TIGIvYXJjaC9tMzJyL21tL21tdS5TCmluZGV4IDQ5YTZkMTYuLmU5NDkxYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9tbS9tbXUuUworKysgYi9hcmNoL20zMnIvbW0vbW11LlMKQEAgLTE1MCw5ICsxNTAsMTMgQEAKIAogCTsgcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHJlc3MpOwogCWxkCXIzLCBAcjMJCQk7IHIzOiBwbWQgZGF0YQotCWxkaQlyMiwgIy00MDk2CiAJYmVxeglyMywgM2YJCQk7IHBtZF9ub25lKCpwbWQpID8KIAorCWFuZDMJcjIsIHIzLCAjMHhmZmYKKwlhZGQzCXIyLCByMiwgIy0zNTUJCTsgX0tFUk5QR19UQUJMRSg9MHgxNjMpCisJYm5leglyMiwgM2YJCQk7IHBtZF9iYWQoKnBtZCkgPworCWxkaQlyMiwgIy00MDk2CisKIAk7IHB0ZSA9IHB0ZV9vZmZzZXQocG1kLCBhZGRyZXNzKTsKIAlhbmQJcjIsIHIzCQkJOyByMjogcHRlIGJhc2UgYWRkcgogCXNybDMJcjMsIHIwLCAjMTAKQEAgLTI2Myw5ICsyNjcsOSBAQAogCWxkCXIxLCBAcjMJCQk7IHIxOiBwbWQKIAliZXF6CXIxLCAzZgkJCTsgcG1kX25vbmUoKnBtZCkgPwogOwotCWFuZDMJcjEsIHIxLCAjMHhlZmYKLQlsZGkJcjQsICM2MTEJCTsgX0tFUk5QR19UQUJMRSg9NjExKQotCWJuZQlyMSwgcjQsIDNmCQk7ICFwbWRfYmFkKCpwbWQpID8KKwlhbmQzCXIxLCByMSwgIzB4M2ZmCisJbGRpCXI0LCAjMHgxNjMJCTsgX0tFUk5QR19UQUJMRSg9MHgxNjMpCisJYm5lCXIxLCByNCwgM2YJCTsgcG1kX2JhZCgqcG1kKSA/CiAKIAkuZmlsbGluc24KIDQ6CmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDI5ZGQ4NDguLmVjZGMxOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC01NjEsNyArNTYxLDcgQEAKIAogY29uZmlnIE1WTUUxNDdfU0NDCiAJYm9vbCAiU0NDIHN1cHBvcnQgZm9yIE1WTUUxNDcgc2VyaWFsIHBvcnRzIgotCWRlcGVuZHMgb24gTVZNRTE0NworCWRlcGVuZHMgb24gTVZNRTE0NyAmJiBCUk9LRU4KIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBzZXJpYWwgcG9ydHMgb24gdGhlIE1vdG9yb2xhIE1WTUUxNDcKIAkgIGJvYXJkcy4gIEV2ZXJ5b25lIHVzaW5nIG9uZSBvZiB0aGVzZSBib2FyZHMgc2hvdWxkIHNheSBZIGhlcmUuCkBAIC01NzYsMTQgKzU3NiwxNCBAQAogCiBjb25maWcgTVZNRTE2Ml9TQ0MKIAlib29sICJTQ0Mgc3VwcG9ydCBmb3IgTVZNRTE2MiBzZXJpYWwgcG9ydHMiCi0JZGVwZW5kcyBvbiBNVk1FMTZ4CisJZGVwZW5kcyBvbiBNVk1FMTZ4ICYmIEJST0tFTgogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIHNlcmlhbCBwb3J0cyBvbiB0aGUgTW90b3JvbGEgTVZNRTE2MiBhbmQKIAkgIDE3MiBib2FyZHMuICBFdmVyeW9uZSB1c2luZyBvbmUgb2YgdGhlc2UgYm9hcmRzIHNob3VsZCBzYXkgWSBoZXJlLgogCiBjb25maWcgQlZNRTYwMDBfU0NDCiAJYm9vbCAiU0NDIHN1cHBvcnQgZm9yIEJWTUU2MDAwIHNlcmlhbCBwb3J0cyIKLQlkZXBlbmRzIG9uIEJWTUU2MDAwCisJZGVwZW5kcyBvbiBCVk1FNjAwMCAmJiBCUk9LRU4KIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBzZXJpYWwgcG9ydHMgb24gdGhlIEJWTUU0MDAwIGFuZCBCVk1FNjAwMAogCSAgYm9hcmRzIGZyb20gQlZNIEx0ZC4gIEV2ZXJ5b25lIHVzaW5nIG9uZSBvZiB0aGVzZSBib2FyZHMgc2hvdWxkIHNheQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2hhcmRpcnFfbW0uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9oYXJkaXJxX21tLmgKaW5kZXggNTU0ZjY1Yi4uMzk0ZWU5NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2hhcmRpcnFfbW0uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaGFyZGlycV9tbS5oCkBAIC0xLDggKzEsMTYgQEAKICNpZm5kZWYgX19NNjhLX0hBUkRJUlFfSAogI2RlZmluZSBfX002OEtfSEFSRElSUV9ICiAKLSNkZWZpbmUgSEFSRElSUV9CSVRTCTgKKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2hhcmRpcnEuaD4KKy8qIGVudHJ5LlMgaXMgc2Vuc2l0aXZlIHRvIHRoZSBvZmZzZXRzIG9mIHRoZXNlIGZpZWxkcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBfX3NvZnRpcnFfcGVuZGluZzsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkIGlycV9jcHVzdGF0X3Q7CisKKyNpbmNsdWRlIDxsaW51eC9pcnFfY3B1c3RhdC5oPgkvKiBTdGFuZGFyZCBtYXBwaW5ncyBmb3IgaXJxX2NwdXN0YXRfdCBhYm92ZSAqLworCisjZGVmaW5lIEhBUkRJUlFfQklUUwk4CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luc3RhbGwuc2ggYi9hcmNoL202OGsvaW5zdGFsbC5zaAppbmRleCA5YzZiYWU2Li41N2Q2NDBkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5zdGFsbC5zaAorKysgYi9hcmNoL202OGsvaW5zdGFsbC5zaApAQCAtMzMsOCArMzMsOCBAQAogCiAjIFVzZXIgbWF5IGhhdmUgYSBjdXN0b20gaW5zdGFsbCBzY3JpcHQKIAotaWYgWyAteCB+L2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCBdOyB0aGVuIGV4ZWMgfi9iaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgIiRAIjsgZmkKLWlmIFsgLXggL3NiaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIC9zYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsICIkQCI7IGZpCitpZiBbIC14IH4vYmluLyR7SU5TVEFMTEtFUk5FTH0gXTsgdGhlbiBleGVjIH4vYmluLyR7SU5TVEFMTEtFUk5FTH0gIiRAIjsgZmkKK2lmIFsgLXggL3NiaW4vJHtJTlNUQUxMS0VSTkVMfSBdOyB0aGVuIGV4ZWMgL3NiaW4vJHtJTlNUQUxMS0VSTkVMfSAiJEAiOyBmaQogCiAjIERlZmF1bHQgaW5zdGFsbCAtIHNhbWUgYXMgbWFrZSB6bGlsbwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDcyYmFkNjUuLjQxMjMwYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCkBAIC00Miw5ICs0Miw5IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCBpbml0X3NpZ25hbHMgPSBJTklUX1NJR05BTFMoaW5pdF9zaWduYWxzKTsKIHN0YXRpYyBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgaW5pdF9zaWdoYW5kID0gSU5JVF9TSUdIQU5EKGluaXRfc2lnaGFuZCk7Ci11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5kYXRhLmluaXRfdGFzayIpLCBhbGlnbmVkKFRIUkVBRF9TSVpFKSkpCi0gICAgICAgPSB7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEKKwlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKFRIUkVBRF9TSVpFKSkpID0KKwkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKIAogLyogaW5pdGlhbCB0YXNrIHN0cnVjdHVyZSAqLwogc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzayA9IElOSVRfVEFTSyhpbml0X3Rhc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zeXNfbTY4ay5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zeXNfbTY4ay5jCmluZGV4IDdmNTRlZmEuLjdkZWI0MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYworKysgYi9hcmNoL202OGsva2VybmVsL3N5c19tNjhrLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDU5NGVlMGUuLjlhODg3NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC00NSwyNSArNDUsMjUgQEAKIAlERUZJTkUoVEhSRUFEX0ZQU1RBVEUsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBmcHN0YXRlKSk7CiAKIAkvKiBvZmZzZXRzIGludG8gdGhlIHB0X3JlZ3MgKi8KLQlERUZJTkUoUFRfRDAsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBkMCkpOwotCURFRklORShQVF9PUklHX0QwLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgb3JpZ19kMCkpOwotCURFRklORShQVF9EMSwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGQxKSk7Ci0JREVGSU5FKFBUX0QyLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZDIpKTsKLQlERUZJTkUoUFRfRDMsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBkMykpOwotCURFRklORShQVF9ENCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGQ0KSk7Ci0JREVGSU5FKFBUX0Q1LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZDUpKTsKLQlERUZJTkUoUFRfQTAsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBhMCkpOwotCURFRklORShQVF9BMSwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGExKSk7Ci0JREVGSU5FKFBUX0EyLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYTIpKTsKLQlERUZJTkUoUFRfUEMsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBwYykpOwotCURFRklORShQVF9TUiwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHNyKSk7CisJREVGSU5FKFBUX09GRl9EMCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGQwKSk7CisJREVGSU5FKFBUX09GRl9PUklHX0QwLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgb3JpZ19kMCkpOworCURFRklORShQVF9PRkZfRDEsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBkMSkpOworCURFRklORShQVF9PRkZfRDIsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBkMikpOworCURFRklORShQVF9PRkZfRDMsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBkMykpOworCURFRklORShQVF9PRkZfRDQsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBkNCkpOworCURFRklORShQVF9PRkZfRDUsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBkNSkpOworCURFRklORShQVF9PRkZfQTAsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBhMCkpOworCURFRklORShQVF9PRkZfQTEsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBhMSkpOworCURFRklORShQVF9PRkZfQTIsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBhMikpOworCURFRklORShQVF9PRkZfUEMsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBwYykpOworCURFRklORShQVF9PRkZfU1IsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBzcikpOwogCiAjaWZkZWYgQ09ORklHX0NPTERGSVJFCiAJLyogYml0ZmllbGRzIGFyZSBhIGJpdCBkaWZmaWN1bHQgKi8KLQlERUZJTkUoUFRfRk9STUFUVkVDLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc3IpIC0gMik7CisJREVGSU5FKFBUX09GRl9GT1JNQVRWRUMsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBzcikgLSAyKTsKICNlbHNlCiAJLyogYml0ZmllbGRzIGFyZSBhIGJpdCBkaWZmaWN1bHQgKi8KLQlERUZJTkUoUFRfVkVDVE9SLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcGMpICsgNCk7CisJREVGSU5FKFBUX09GRl9WRUNUT1IsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBwYykgKyA0KTsKICNlbmRpZgogCiAJLyogc2lnbmFsIGRlZmluZXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL2VudHJ5LlMKaW5kZXggZjU2ZmFhNS4uNTYwNDNhZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL2VudHJ5LlMKQEAgLTQ2LDcgKzQ2LDcgQEAKIEVOVFJZKGJ1c2VycikKIAlTQVZFX0FMTAogCW1vdmVxCSMtMSwlZDAKLQltb3ZlbAklZDAsJXNwQChQVF9PUklHX0QwKQorCW1vdmVsCSVkMCwlc3BAKFBUX09GRl9PUklHX0QwKQogCW1vdmVsCSVzcCwlc3BALSAJCS8qIHN0YWNrIGZyYW1lIHBvaW50ZXIgYXJndW1lbnQgKi8KIAlqc3IJYnVzZXJyX2MKIAlhZGRxbAkjNCwlc3AKQEAgLTU1LDcgKzU1LDcgQEAKIEVOVFJZKHRyYXApCiAJU0FWRV9BTEwKIAltb3ZlcQkjLTEsJWQwCi0JbW92ZWwJJWQwLCVzcEAoUFRfT1JJR19EMCkKKwltb3ZlbAklZDAsJXNwQChQVF9PRkZfT1JJR19EMCkKIAltb3ZlbAklc3AsJXNwQC0gCQkvKiBzdGFjayBmcmFtZSBwb2ludGVyIGFyZ3VtZW50ICovCiAJanNyCXRyYXBfYwogCWFkZHFsCSM0LCVzcApAQCAtNjcsNyArNjcsNyBAQAogRU5UUlkoZGJnaW50ZXJydXB0KQogCVNBVkVfQUxMCiAJbW92ZXEJIy0xLCVkMAotCW1vdmVsCSVkMCwlc3BAKFBUX09SSUdfRDApCisJbW92ZWwJJWQwLCVzcEAoUFRfT0ZGX09SSUdfRDApCiAJbW92ZWwJJXNwLCVzcEAtIAkJLyogc3RhY2sgZnJhbWUgcG9pbnRlciBhcmd1bWVudCAqLwogCWpzcglkYmdpbnRlcnJ1cHRfYwogCWFkZHFsCSM0LCVzcApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL2luaXRfdGFzay5jCmluZGV4IDQ1ZTk3YTIuLmNiZjlkYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTMxLDcgKzMxLDYgQEAKICAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IGhhdmluZyBhIHNwZWNpYWwKICAqICJpbml0X3Rhc2siIGxpbmtlciBtYXAgZW50cnkuLgogICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIikpKSA9Ci0JCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07Cit1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gX19pbml0X3Rhc2tfZGF0YSA9CisJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c19tNjhrLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzX202OGsuYwppbmRleCA3MDAyODE2Li5lZmRkMDkwIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzX202OGsuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzX202OGsuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaXBjLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvbW0vaW5pdC5jIGIvYXJjaC9tNjhrbm9tbXUvbW0vaW5pdC5jCmluZGV4IGIxNzAzYzYuLmYzMjM2ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L21tL2luaXQuYworKysgYi9hcmNoL202OGtub21tdS9tbS9pbml0LmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCQl0b3RhbHJhbV9wYWdlcysrOwogCQlwYWdlcysrOwogCX0KLQlwcmludGsgKEtFUk5fTk9USUNFICJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVkayBmcmVlZFxuIiwgcGFnZXMpOworCXByaW50ayAoS0VSTl9OT1RJQ0UgIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWRrIGZyZWVkXG4iLCBwYWdlcyAqIChQQUdFX1NJWkUgLyAxMDI0KSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIwNmUvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjA2ZS9jb25maWcuYwppbmRleCAwZjQxYmE4Li45NDIzOTc5IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjA2ZS9jb25maWcuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjA2ZS9jb25maWcuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGFzbS9tY2ZzaW0uaD4KICNpbmNsdWRlIDxhc20vbWNmdWFydC5oPgogI2luY2x1ZGUgPGFzbS9tY2ZkbWEuaD4KLSNpbmNsdWRlIDxhc20vbWNmdWFydC5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvZW50cnkuUwppbmRleCBiMWFlZjcyLi45ZDgwZDJjIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2VudHJ5LlMKQEAgLTM5LDE3ICszOSwxNyBAQAogLmdsb2JsIGludGhhbmRsZXI3CiAKIGJhZHN5czoKLQltb3ZlbAkjLUVOT1NZUywlc3BAKFBUX0QwKQorCW1vdmVsCSMtRU5PU1lTLCVzcEAoUFRfT0ZGX0QwKQogCWpyYQlyZXRfZnJvbV9leGNlcHRpb24KIAogZG9fdHJhY2U6Ci0JbW92ZWwJIy1FTk9TWVMsJXNwQChQVF9EMCkJLyogbmVlZGVkIGZvciBzdHJhY2UqLworCW1vdmVsCSMtRU5PU1lTLCVzcEAoUFRfT0ZGX0QwKQkvKiBuZWVkZWQgZm9yIHN0cmFjZSovCiAJc3VicWwJIzQsJXNwCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlqYnNyCXN5c2NhbGxfdHJhY2UKIAlSRVNUT1JFX1NXSVRDSF9TVEFDSwogCWFkZHFsCSM0LCVzcAotCW1vdmVsCSVzcEAoUFRfT1JJR19EMCksJWQxCisJbW92ZWwJJXNwQChQVF9PRkZfT1JJR19EMCksJWQxCiAJbW92ZWwJIy1FTk9TWVMsJWQwCiAJY21wbAkjTlJfc3lzY2FsbHMsJWQxCiAJamNjCTFmCkBAIC01Nyw3ICs1Nyw3IEBACiAJbGVhCXN5c19jYWxsX3RhYmxlLCAlYTAKIAlqYnNyCSVhMEAoJWQxKQogCi0xOgltb3ZlbAklZDAsJXNwQChQVF9EMCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLworMToJbW92ZWwJJWQwLCVzcEAoUFRfT0ZGX0QwKQkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlICovCiAJc3VicWwJIzQsJXNwCQkJLyogZHVtbXkgcmV0dXJuIGFkZHJlc3MgKi8KIAlTQVZFX1NXSVRDSF9TVEFDSwogCWpic3IJc3lzY2FsbF90cmFjZQpAQCAtNzUsNyArNzUsNyBAQAogCWpic3IgICAgc2V0X2VzcDAKIAlhZGRxbCAgICM0LCVzcAogCi0JbW92ZWwJJXNwQChQVF9PUklHX0QwKSwlZDAKKwltb3ZlbAklc3BAKFBUX09GRl9PUklHX0QwKSwlZDAKIAogCW1vdmVsCSVzcCwlZDEJCQkvKiBnZXQgdGhyZWFkX2luZm8gcG9pbnRlciAqLwogCWFuZGwJIy1USFJFQURfU0laRSwlZDEKQEAgLTg4LDEwICs4OCwxMCBAQAogCWxlYQlzeXNfY2FsbF90YWJsZSwlYTAKIAltb3ZlbAklYTBAKCVkMCksICVhMAogCWpic3IJJWEwQAotCW1vdmVsCSVkMCwlc3BAKFBUX0QwKQkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlKi8KKwltb3ZlbAklZDAsJXNwQChQVF9PRkZfRDApCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUqLwogCiByZXRfZnJvbV9leGNlcHRpb246Ci0JYnRzdAkjNSwlc3BAKFBUX1NSKQkJLyogY2hlY2sgaWYgcmV0dXJuaW5nIHRvIGtlcm5lbCovCisJYnRzdAkjNSwlc3BAKFBUX09GRl9TUikJCS8qIGNoZWNrIGlmIHJldHVybmluZyB0byBrZXJuZWwqLwogCWplcQlMdXNlcl9yZXR1cm4JCS8qIGlmIHNvLCBza2lwIHJlc2NoZWQsIHNpZ25hbHMqLwogCiBMa2VybmVsX3JldHVybjoKQEAgLTEzMyw3ICsxMzMsNyBAQAogICovCiBpbnRoYW5kbGVyMToKIAlTQVZFX0FMTAotCW1vdmV3CSVzcEAoUFRfVkVDVE9SKSwgJWQwCisJbW92ZXcJJXNwQChQVF9PRkZfVkVDVE9SKSwgJWQwCiAJYW5kCSMweDNmZiwgJWQwCiAKIAltb3ZlbAklc3AsJXNwQC0KQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBpbnRoYW5kbGVyMjoKIAlTQVZFX0FMTAotCW1vdmV3CSVzcEAoUFRfVkVDVE9SKSwgJWQwCisJbW92ZXcJJXNwQChQVF9PRkZfVkVDVE9SKSwgJWQwCiAJYW5kCSMweDNmZiwgJWQwCiAKIAltb3ZlbAklc3AsJXNwQC0KQEAgLTE1NSw3ICsxNTUsNyBAQAogCiBpbnRoYW5kbGVyMzoKIAlTQVZFX0FMTAotCW1vdmV3CSVzcEAoUFRfVkVDVE9SKSwgJWQwCisJbW92ZXcJJXNwQChQVF9PRkZfVkVDVE9SKSwgJWQwCiAJYW5kCSMweDNmZiwgJWQwCiAKIAltb3ZlbAklc3AsJXNwQC0KQEAgLTE2Niw3ICsxNjYsNyBAQAogCiBpbnRoYW5kbGVyNDoKIAlTQVZFX0FMTAotCW1vdmV3CSVzcEAoUFRfVkVDVE9SKSwgJWQwCisJbW92ZXcJJXNwQChQVF9PRkZfVkVDVE9SKSwgJWQwCiAJYW5kCSMweDNmZiwgJWQwCiAKIAltb3ZlbAklc3AsJXNwQC0KQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBpbnRoYW5kbGVyNToKIAlTQVZFX0FMTAotCW1vdmV3CSVzcEAoUFRfVkVDVE9SKSwgJWQwCisJbW92ZXcJJXNwQChQVF9PRkZfVkVDVE9SKSwgJWQwCiAJYW5kCSMweDNmZiwgJWQwCiAKIAltb3ZlbAklc3AsJXNwQC0KQEAgLTE4OCw3ICsxODgsNyBAQAogCiBpbnRoYW5kbGVyNjoKIAlTQVZFX0FMTAotCW1vdmV3CSVzcEAoUFRfVkVDVE9SKSwgJWQwCisJbW92ZXcJJXNwQChQVF9PRkZfVkVDVE9SKSwgJWQwCiAJYW5kCSMweDNmZiwgJWQwCiAKIAltb3ZlbAklc3AsJXNwQC0KQEAgLTE5OSw3ICsxOTksNyBAQAogCiBpbnRoYW5kbGVyNzoKIAlTQVZFX0FMTAotCW1vdmV3CSVzcEAoUFRfVkVDVE9SKSwgJWQwCisJbW92ZXcJJXNwQChQVF9PRkZfVkVDVE9SKSwgJWQwCiAJYW5kCSMweDNmZiwgJWQwCiAKIAltb3ZlbAklc3AsJXNwQC0KQEAgLTIxMCw3ICsyMTAsNyBAQAogCiBpbnRoYW5kbGVyOgogCVNBVkVfQUxMCi0JbW92ZXcJJXNwQChQVF9WRUNUT1IpLCAlZDAKKwltb3Zldwklc3BAKFBUX09GRl9WRUNUT1IpLCAlZDAKIAlhbmQJIzB4M2ZmLCAlZDAKIAogCW1vdmVsCSVzcCwlc3BALQpAQCAtMjI0LDcgKzIyNCw3IEBACiAyOgogCVJFU1RPUkVfQUxMCiAxOgotCW1vdmViCSVzcEAoUFRfU1IpLCAlZDAKKwltb3ZlYgklc3BAKFBUX09GRl9TUiksICVkMAogCWFuZAkjNywgJWQwCiAJamhpCTJiCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9lbnRyeS5TCmluZGV4IDU1ZGZlZmUuLjZkMzQ2MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvZW50cnkuUwpAQCAtMzUsMTcgKzM1LDE3IEBACiAuZ2xvYmwgaW50aGFuZGxlcgogCiBiYWRzeXM6Ci0JbW92ZWwJIy1FTk9TWVMsJXNwQChQVF9EMCkKKwltb3ZlbAkjLUVOT1NZUywlc3BAKFBUX09GRl9EMCkKIAlqcmEJcmV0X2Zyb21fZXhjZXB0aW9uCiAKIGRvX3RyYWNlOgotCW1vdmVsCSMtRU5PU1lTLCVzcEAoUFRfRDApCS8qIG5lZWRlZCBmb3Igc3RyYWNlKi8KKwltb3ZlbAkjLUVOT1NZUywlc3BAKFBUX09GRl9EMCkgLyogbmVlZGVkIGZvciBzdHJhY2UqLwogCXN1YnFsCSM0LCVzcAogCVNBVkVfU1dJVENIX1NUQUNLCiAJamJzcglzeXNjYWxsX3RyYWNlCiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlhZGRxbAkjNCwlc3AKLQltb3ZlbAklc3BAKFBUX09SSUdfRDApLCVkMQorCW1vdmVsCSVzcEAoUFRfT0ZGX09SSUdfRDApLCVkMQogCW1vdmVsCSMtRU5PU1lTLCVkMAogCWNtcGwJI05SX3N5c2NhbGxzLCVkMQogCWpjYwkxZgpAQCAtNTMsNyArNTMsNyBAQAogCWxlYQlzeXNfY2FsbF90YWJsZSwgJWEwCiAJamJzcgklYTBAKCVkMSkKIAotMToJbW92ZWwJJWQwLCVzcEAoUFRfRDApCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KKzE6CW1vdmVsCSVkMCwlc3BAKFBUX09GRl9EMCkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlICovCiAJc3VicWwJIzQsJXNwCQkJLyogZHVtbXkgcmV0dXJuIGFkZHJlc3MgKi8KIAlTQVZFX1NXSVRDSF9TVEFDSwogCWpic3IJc3lzY2FsbF90cmFjZQpAQCAtNzksMTAgKzc5LDEwIEBACiAJbGVhCXN5c19jYWxsX3RhYmxlLCVhMAogCW1vdmVsCSVhMEAoJWQwKSwgJWEwCiAJamJzcgklYTBACi0JbW92ZWwJJWQwLCVzcEAoUFRfRDApCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUqLworCW1vdmVsCSVkMCwlc3BAKFBUX09GRl9EMCkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlKi8KIAogcmV0X2Zyb21fZXhjZXB0aW9uOgotCWJ0c3QJIzUsJXNwQChQVF9TUikJCS8qIGNoZWNrIGlmIHJldHVybmluZyB0byBrZXJuZWwqLworCWJ0c3QJIzUsJXNwQChQVF9PRkZfU1IpCS8qIGNoZWNrIGlmIHJldHVybmluZyB0byBrZXJuZWwqLwogCWplcQlMdXNlcl9yZXR1cm4JCS8qIGlmIHNvLCBza2lwIHJlc2NoZWQsIHNpZ25hbHMqLwogCiBMa2VybmVsX3JldHVybjoKQEAgLTEyNCw3ICsxMjQsNyBAQAogICovCiBpbnRoYW5kbGVyOgogCVNBVkVfQUxMCi0JbW92ZXcJJXNwQChQVF9WRUNUT1IpLCAlZDAKKwltb3Zldwklc3BAKFBUX09GRl9WRUNUT1IpLCAlZDAKIAlhbmQubAkjMHgzZmYsICVkMAogCWxzci5sICAgIzB4MDIsICAlZDAKIApAQCAtMTM5LDcgKzEzOSw3IEBACiAyOgogCVJFU1RPUkVfQUxMCiAxOgotCW1vdmViCSVzcEAoUFRfU1IpLCAlZDAKKwltb3ZlYgklc3BAKFBUX09GRl9TUiksICVkMAogCWFuZAkjNywgJWQwCiAJamhpCTJiCiAJLyogY2hlY2sgaWYgd2UgbmVlZCB0byBkbyBzb2Z0d2FyZSBpbnRlcnJ1cHRzICovCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUwppbmRleCAzYjQ3MWMwLi5kZDdkNTkxIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtL2NvbGRmaXJlL2VudHJ5LlMKQEAgLTgxLDExICs4MSwxMSBAQAogCiAJbW92ZWwJJWQzLCVhMAogCWpic3IJJWEwQAotCW1vdmVsCSVkMCwlc3BAKFBUX0QwKQkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlICovCisJbW92ZWwJJWQwLCVzcEAoUFRfT0ZGX0QwKQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KIAlqcmEJcmV0X2Zyb21fZXhjZXB0aW9uCiAxOgotCW1vdmVsCSMtRU5PU1lTLCVkMgkJLyogc3RyYWNlIG5lZWRzIC1FTk9TWVMgaW4gUFRfRDAgKi8KLQltb3ZlbAklZDIsUFRfRDAoJXNwKQkJLyogb24gc3lzY2FsbCBlbnRyeSAqLworCW1vdmVsCSMtRU5PU1lTLCVkMgkJLyogc3RyYWNlIG5lZWRzIC1FTk9TWVMgaW4gUFRfT0ZGX0QwICovCisJbW92ZWwJJWQyLFBUX09GRl9EMCglc3ApCS8qIG9uIHN5c2NhbGwgZW50cnkgKi8KIAlzdWJxbAkjNCwlc3AKIAlTQVZFX1NXSVRDSF9TVEFDSwogCWpic3IJc3lzY2FsbF90cmFjZQpAQCAtOTMsNyArOTMsNyBAQAogCWFkZHFsCSM0LCVzcAogCW1vdmVsCSVkMywlYTAKIAlqYnNyCSVhMEAKLQltb3ZlbAklZDAsJXNwQChQVF9EMCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLworCW1vdmVsCSVkMCwlc3BAKFBUX09GRl9EMCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwogCXN1YnFsCSM0LCVzcAkJCS8qIGR1bW15IHJldHVybiBhZGRyZXNzICovCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlqYnNyCXN5c2NhbGxfdHJhY2UKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiByZXRfZnJvbV9leGNlcHRpb246CiAJbW92ZQkjMHgyNzAwLCVzcgkJLyogZGlzYWJsZSBpbnRycyAqLwotCWJ0c3QJIzUsJXNwQChQVF9TUikJCS8qIGNoZWNrIGlmIHJldHVybmluZyB0byBrZXJuZWwgKi8KKwlidHN0CSM1LCVzcEAoUFRfT0ZGX1NSKQkvKiBjaGVjayBpZiByZXR1cm5pbmcgdG8ga2VybmVsICovCiAJamVxCUx1c2VyX3JldHVybgkJLyogaWYgc28sIHNraXAgcmVzY2hlZCwgc2lnbmFscyAqLwogCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKQEAgLTE0Miw4ICsxNDIsOCBAQAogTHJldHVybjoKIAltb3ZlCSMweDI3MDAsJXNyCQkvKiBkaXNhYmxlIGludHJzICovCiAJbW92ZWwJc3dfdXNwLCVhMAkJLyogZ2V0IHVzcCAqLwotCW1vdmVsCSVzcEAoUFRfUEMpLCVhMEAtCS8qIGNvcHkgZXhjZXB0aW9uIHByb2dyYW0gY291bnRlciAqLwotCW1vdmVsCSVzcEAoUFRfRk9STUFUVkVDKSwlYTBALS8qIGNvcHkgZXhjZXB0aW9uIGZvcm1hdC92ZWN0b3Ivc3IgKi8KKwltb3ZlbAklc3BAKFBUX09GRl9QQyksJWEwQC0JLyogY29weSBleGNlcHRpb24gcHJvZ3JhbSBjb3VudGVyICovCisJbW92ZWwJJXNwQChQVF9PRkZfRk9STUFUVkVDKSwlYTBALSAvKiBjb3B5IGV4Y2VwdGlvbiBmb3JtYXQvdmVjdG9yL3NyICovCiAJbW92ZW1sCSVzcEAsJWQxLSVkNS8lYTAtJWEyCiAJbGVhCSVzcEAoMzIpLCVzcAkJLyogc3BhY2UgZm9yIDggcmVncyAqLwogCW1vdmVsCSVzcEArLCVkMApAQCAtMTgxLDkgKzE4MSw5IEBACiBFTlRSWShpbnRoYW5kbGVyKQogCVNBVkVfQUxMCiAJbW92ZXEJIy0xLCVkMAotCW1vdmVsCSVkMCwlc3BAKFBUX09SSUdfRDApCisJbW92ZWwJJWQwLCVzcEAoUFRfT0ZGX09SSUdfRDApCiAKLQltb3Zldwklc3BAKFBUX0ZPUk1BVFZFQyksJWQwCS8qIHB1dCBleGNlcHRpb24gIyBpbiBkMCAqLworCW1vdmV3CSVzcEAoUFRfT0ZGX0ZPUk1BVFZFQyksJWQwIC8qIHB1dCBleGNlcHRpb24gIyBpbiBkMCAqLwogCWFuZGwJIzB4MDNmYywlZDAJCS8qIG1hc2sgb3V0IHZlY3RvciBvbmx5ICovCiAKIAltb3ZlbAklc3AsJXNwQC0JCS8qIHB1c2ggcmVncyBhcmcgKi8KQEAgLTIwMyw3ICsyMDMsNyBAQAogRU5UUlkoZmFzdGhhbmRsZXIpCiAJU0FWRV9MT0NBTAogCi0JbW92ZXcJJXNwQChQVF9GT1JNQVRWRUMpLCVkMAorCW1vdmV3CSVzcEAoUFRfT0ZGX0ZPUk1BVFZFQyksJWQwCiAJYW5kbAkjMHgwM2ZjLCVkMAkJLyogbWFzayBvdXQgdmVjdG9yIG9ubHkgKi8KIAogCW1vdmVsCSVzcCwlc3BALQkJLyogcHVzaCByZWdzIGFyZyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL0tjb25maWcgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZwppbmRleCAyZGI3MjJkLi5iYmQ4MzI3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZworKysgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZwpAQCAtNiw2ICs2LDcgQEAKIGNvbmZpZyBNSUNST0JMQVpFCiAJZGVmX2Jvb2wgeQogCXNlbGVjdCBIQVZFX0xNQgorCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCiBjb25maWcgU1dBUApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL01ha2VmaWxlIGIvYXJjaC9taWNyb2JsYXplL01ha2VmaWxlCmluZGV4IDg0Mzk1OTguLjM0MTg3MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9NYWtlZmlsZQorKysgYi9hcmNoL21pY3JvYmxhemUvTWFrZWZpbGUKQEAgLTM3LDEyICszNywxMiBAQAogQ1BVRkxBR1MtMSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tY3B1PXYkKENQVV9WRVIpKQogCiAjIHIzMSBob2xkcyBjdXJyZW50IHdoZW4gaW4ga2VybmVsIG1vZGUKLUtCVUlMRF9LRVJORUwgKz0gLWZmaXhlZC1yMzEgJChDUFVGTEFHUy0xKSAkKENQVUZMQUdTLTIpCitLQlVJTERfQ0ZMQUdTICs9IC1mZml4ZWQtcjMxICQoQ1BVRkxBR1MtMSkgJChDUFVGTEFHUy0yKQogCiBMREZMQUdTCQk6PQogTERGTEFHU192bWxpbnV4CTo9CiAKLUxJQkdDQyA6PSAkKHNoZWxsICQoQ0MpICQoS0JVSUxEX0tFUk5FTCkgLXByaW50LWxpYmdjYy1maWxlLW5hbWUpCitMSUJHQ0MgOj0gJChzaGVsbCAkKENDKSAkKEtCVUlMRF9DRkxBR1MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lKQogCiBoZWFkLXkgOj0gYXJjaC9taWNyb2JsYXplL2tlcm5lbC9oZWFkLm8KIGxpYnMteSArPSBhcmNoL21pY3JvYmxhemUvbGliLwpAQCAtNTMsMjIgKzUzLDQxIEBACiAKIGJvb3QgOj0gYXJjaC9taWNyb2JsYXplL2Jvb3QKIAorIyBBcmUgd2UgbWFraW5nIGEgc2ltcGxlSW1hZ2UuPGJvYXJkbmFtZT4gdGFyZ2V0PyBJZiBzbywgY3JhY2sgb3V0IHRoZSBib2FyZG5hbWUKK0RUQjo9JChzdWJzdCBzaW1wbGVJbWFnZS4sLCQoZmlsdGVyIHNpbXBsZUltYWdlLiUsICQoTUFLRUNNREdPQUxTKSkpCisKK2lmbmVxICgkKERUQiksKQorCWNvcmUteQkrPSAkKGJvb3QpLworZW5kaWYKKwogIyBkZWZpbmVzIGZpbGVuYW1lIGV4dGVuc2lvbiBkZXBlbmRpbmcgbWVtb3J5IG1hbmFnZW1lbnQgdHlwZQogaWZlcSAoJChDT05GSUdfTU1VKSwpCiBNTVUgOj0gLW5vbW11CiBlbmRpZgogCi1leHBvcnQgTU1VCitleHBvcnQgTU1VIERUQgogCiBhbGw6IGxpbnV4LmJpbgogCitCT09UX1RBUkdFVFMgPSBsaW51eC5iaW4gbGludXguYmluLmd6IHNpbXBsZUltYWdlLiUKKwogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotbGludXguYmluIGxpbnV4LmJpbi5nejogdm1saW51eAorJChCT09UX1RBUkdFVFMpOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkKGJvb3QpLyRACiAKIGRlZmluZSBhcmNoaGVscAotICBlY2hvICAnKiBsaW51eC5iaW4gICAgLSBDcmVhdGUgcmF3IGJpbmFyeScKLSAgZWNobyAgJyAgbGludXguYmluLmd6IC0gQ3JlYXRlIGNvbXByZXNzZWQgcmF3IGJpbmFyeScKKyAgZWNobyAnKiBsaW51eC5iaW4gICAgLSBDcmVhdGUgcmF3IGJpbmFyeScKKyAgZWNobyAnICBsaW51eC5iaW4uZ3ogLSBDcmVhdGUgY29tcHJlc3NlZCByYXcgYmluYXJ5JworICBlY2hvICcgIHNpbXBsZUltYWdlLjxkdD4gLSBFTEYgaW1hZ2Ugd2l0aCAkKGFyY2gpL2Jvb3QvZHRzLzxkdD4uZHRzIGxpbmtlZCBpbicKKyAgZWNobyAnICAgICAgICAgICAgICAgICAgIC0gc3RyaXBwZWQgZWxmIHdpdGggZmR0IGJsb2IKKyAgZWNobyAnICBzaW1wbGVJbWFnZS48ZHQ+LnVuc3RyaXAgLSBmdWxsIEVMRiBpbWFnZSB3aXRoIGZkdCBibG9iJworICBlY2hvICcgICpfZGVmY29uZmlnICAgICAgLSBTZWxlY3QgZGVmYXVsdCBjb25maWcgZnJvbSBhcmNoL21pY3JvYmxhemUvY29uZmlncycKKyAgZWNobyAnJworICBlY2hvICcgIFRhcmdldHMgd2l0aCA8ZHQ+IGVtYmVkIGEgZGV2aWNlIHRyZWUgYmxvYiBpbnNpZGUgdGhlIGltYWdlJworICBlY2hvICcgIFRoZXNlIHRhcmdldHMgc3VwcG9ydCBib2FyZCB3aXRoIGZpcm13YXJlIHRoYXQgZG9lcyBub3QnCisgIGVjaG8gJyAgc3VwcG9ydCBwYXNzaW5nIGEgZGV2aWNlIHRyZWUgZGlyZWN0bHkuIFJlcGxhY2UgPGR0PiB3aXRoIHRoZScKKyAgZWNobyAnICBuYW1lIG9mIGEgZHRzIGZpbGUgZnJvbSB0aGUgYXJjaC9taWNyb2JsYXplL2Jvb3QvZHRzLyBkaXJlY3RvcnknCisgIGVjaG8gJyAgKG1pbnVzIHRoZSAuZHRzIGV4dGVuc2lvbikuJwogZW5kZWYKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9ib290L01ha2VmaWxlIGIvYXJjaC9taWNyb2JsYXplL2Jvb3QvTWFrZWZpbGUKaW5kZXggYzJiYjA0My4uMjFmMTMzMiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9taWNyb2JsYXplL2Jvb3QvTWFrZWZpbGUKQEAgLTIsMTAgKzIsMjQgQEAKICMgYXJjaC9taWNyb2JsYXplL2Jvb3QvTWFrZWZpbGUKICMKIAotdGFyZ2V0cyA6PSBsaW51eC5iaW4gbGludXguYmluLmd6CitvYmoteSArPSBsaW5rZWRfZHRiLm8KKwordGFyZ2V0cyA6PSBsaW51eC5iaW4gbGludXguYmluLmd6IHNpbXBsZUltYWdlLiUKIAogT0JKQ09QWUZMQUdTX2xpbnV4LmJpbiAgOj0gLU8gYmluYXJ5CiAKKyMgV2hlcmUgdGhlIERUUyBmaWxlcyBsaXZlCitkdHN0cmVlICAgICAgICAgOj0gJChzcmN0cmVlKS8kKHNyYykvZHRzCisKKyMgRW5zdXJlIHN5c3RlbS5kdGIgZXhpc3RzCiskKG9iaikvbGlua2VkX2R0Yi5vOiAkKG9iaikvc3lzdGVtLmR0YgorCisjIEdlbmVyYXRlIHN5c3RlbS5kdGIgZnJvbSAkKERUQikuZHRiCitpZm5lcSAoJChEVEIpLHN5c3RlbSkKKyQob2JqKS9zeXN0ZW0uZHRiOiAkKG9iaikvJChEVEIpLmR0YgorCSQoY2FsbCBpZl9jaGFuZ2VkLGNwKQorZW5kaWYKKwogJChvYmopL2xpbnV4LmJpbjogdm1saW51eCBGT1JDRQogCVsgLW4gJChDT05GSUdfSU5JVFJBTUZTX1NPVVJDRSkgXSAmJiBbICEgLWUgJChDT05GSUdfSU5JVFJBTUZTX1NPVVJDRSkgXSAmJiBcCiAJdG91Y2ggJChDT05GSUdfSU5JVFJBTUZTX1NPVVJDRSkgfHwgZWNobyAiTm8gQ1BJTyBpbWFnZSIKQEAgLTE2LDQgKzMwLDI3IEBACiAJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKIAlAZWNobyAnS2VybmVsOiAkQCBpcyByZWFkeScgJyAoIydgY2F0IC52ZXJzaW9uYCcpJwogCi1jbGVhbi1rZXJuZWwgKz0gbGludXguYmluIGxpbnV4LmJpbi5negorcXVpZXRfY21kX2NwID0gQ1AgICAgICAkPCAkQCQyCisJY21kX2NwID0gY2F0ICQ8ID4kQCQyIHx8IChybSAtZiAkQCAmJiBlY2hvIGZhbHNlKQorCitxdWlldF9jbWRfc3RyaXAgPSBTVFJJUCAgICRACisgICAgICBjbWRfc3RyaXAgPSAkKFNUUklQKSAtSyBfc3RhcnQgLUsgX2VuZCAtSyBfX2xvZ19idWYgLUsgX2ZkdF9zdGFydCB2bWxpbnV4IC1vICRACisKKyQob2JqKS9zaW1wbGVJbWFnZS4lOiB2bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsY3AsLnVuc3RyaXApCisJJChjYWxsIGlmX2NoYW5nZWQsc3RyaXApCisJQGVjaG8gJ0tlcm5lbDogJEAgaXMgcmVhZHknICcgKCMnYGNhdCAudmVyc2lvbmAnKScKKworIyBSdWxlIHRvIGJ1aWxkIGRldmljZSB0cmVlIGJsb2JzCitEVEMgPSAkKG9ianRyZWUpL3NjcmlwdHMvZHRjL2R0YworCisjIFJ1bGUgdG8gYnVpbGQgZGV2aWNlIHRyZWUgYmxvYnMKK3F1aWV0X2NtZF9kdGMgPSBEVEMgICAgICRACisJY21kX2R0YyA9ICQoRFRDKSAtTyBkdGIgLW8gJChvYmopLyQqLmR0YiAtYiAwIC1wIDEwMjQgJChkdHN0cmVlKS8kKi5kdHMKKworJChvYmopLyUuZHRiOiAkKGR0c3RyZWUpLyUuZHRzIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsZHRjKQorCitjbGVhbi1rZXJuZWwgKz0gbGludXguYmluIGxpbnV4LmJpbi5neiBzaW1wbGVJbWFnZS4qCisKK2NsZWFuLWZpbGVzICs9ICouZHRiCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvYm9vdC9kdHMvc3lzdGVtLmR0cyBiL2FyY2gvbWljcm9ibGF6ZS9ib290L2R0cy9zeXN0ZW0uZHRzCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdjYjY1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9kdHMvc3lzdGVtLmR0cwpAQCAtMCwwICsxIEBACisuLi8uLi9wbGF0Zm9ybS9nZW5lcmljL3N5c3RlbS5kdHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvYm9vdC9saW5rZWRfZHRiLlMgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9saW5rZWRfZHRiLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyYjUzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9ib290L2xpbmtlZF9kdGIuUwpAQCAtMCwwICsxLDMgQEAKKy5zZWN0aW9uIF9fZmR0X2Jsb2IsImEiCisuaW5jYmluICJhcmNoL21pY3JvYmxhemUvYm9vdC9zeXN0ZW0uZHRiIgorCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvY29uZmlncy9tbXVfZGVmY29uZmlnIGIvYXJjaC9taWNyb2JsYXplL2NvbmZpZ3MvbW11X2RlZmNvbmZpZwppbmRleCAwOWMzMjk2Li5iYjdjMzc0IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvY29uZmlncy9tbXVfZGVmY29uZmlnCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9jb25maWdzL21tdV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEtcmM2Ci0jIFR1ZSBBdWcgMTggMTE6MDA6MDIgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTA6Mjg6NTAgMjAwOQogIwogQ09ORklHX01JQ1JPQkxBWkU9eQogIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CkBAIC00MiwxMSArNDIsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKQEAgLTI2MCw2ICsyNjEsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTM1NywxMiArMzU5LDEwIEBACiAjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CitDT05GSUdfWElMSU5YX0VNQUNMSVRFPXkKIENPTkZJR19ORVRERVZfMTAwMD15CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTQ2MCw2ICs0NjAsNyBAQAogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldApAQCAtNDg4LDYgKzQ4OSw3IEBACiAjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTU0Niw3ICs1NDgsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC02NzEsMTggKzY3MiwyMCBAQAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1BPSVNPTklORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0tNRU1DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKLUNPTkZJR19IRUFSVF9CRUFUPXkKKyMgQ09ORklHX0hFQVJUX0JFQVQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JPT1RNRU09eQogCiAjCkBAIC02OTcsNyArNzAwLDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKQEAgLTcyOSwxMSArNzMxLDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9jb25maWdzL25vbW11X2RlZmNvbmZpZyBiL2FyY2gvbWljcm9ibGF6ZS9jb25maWdzL25vbW11X2RlZmNvbmZpZwppbmRleCA4YjYzODYxLi5hZGI4MzliIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvY29uZmlncy9ub21tdV9kZWZjb25maWcKKysrIGIvYXJjaC9taWNyb2JsYXplL2NvbmZpZ3Mvbm9tbXVfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxLXJjNgotIyBUdWUgQXVnIDE4IDEwOjM1OjMwIDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDEwOjI5OjQzIDIwMDkKICMKIENPTkZJR19NSUNST0JMQVpFPXkKICMgQ09ORklHX1NXQVAgaXMgbm90IHNldApAQCAtNDQsMTEgKzQ0LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE3CkBAIC0yNDMsNiArMjQ0LDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0yNzIsNiArMjc0LDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKQEAgLTI3OSw3ICsyODIsNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC0zMDQsNiArMzA2LDcgQEAKICMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX09GX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCkBAIC0zNDksNiArMzUyLDcgQEAKICMKICMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQX09GIGlzIG5vdCBzZXQKIENPTkZJR19NVERfVUNMSU5VWD15CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTQyOSwxMiArNDMzLDEwIEBACiAjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19YSUxJTlhfRU1BQ0xJVEUgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKIENPTkZJR19ORVRERVZfMTAwMDA9eQotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNTM1LDcgKzUzNyw3IEBACiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKICMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldApAQCAtNTc5LDYgKzU4MSw3IEBACiAjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTYzOSw3ICs2NDIsNiBAQAogQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtNzEwLDE4ICs3MTIsMjAgQEAKIENPTkZJR19ERUJVR19MSVNUPXkKIENPTkZJR19ERUJVR19TRz15CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19FQVJMWV9QUklOVEs9eQotQ09ORklHX0hFQVJUX0JFQVQ9eQorIyBDT05GSUdfSEVBUlRfQkVBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKIAogIwpAQCAtNzM2LDcgKzc0MCw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CkBAIC03NjgsMTEgKzc3MSwxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vYXNtLWNvbXBhdC5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2FzbS1jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JjOWRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2FzbS1jb21wYXQuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9BU01fTUlDUk9CTEFaRV9BU01fQ09NUEFUX0gKKyNkZWZpbmUgX0FTTV9NSUNST0JMQVpFX0FTTV9DT01QQVRfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX0FTU0VNQkxZX18KKyMgIGRlZmluZSBzdHJpbmdpZnlfaW5fYyguLi4pCV9fVkFfQVJHU19fCisjICBkZWZpbmUgQVNNX0NPTlNUKHgpCQl4CisjZWxzZQorLyogVGhpcyB2ZXJzaW9uIG9mIHN0cmluZ2lmeSB3aWxsIGRlYWwgd2l0aCBjb21tYXMuLi4gKi8KKyMgIGRlZmluZSBfX3N0cmluZ2lmeV9pbl9jKC4uLikJI19fVkFfQVJHU19fCisjICBkZWZpbmUgc3RyaW5naWZ5X2luX2MoLi4uKQlfX3N0cmluZ2lmeV9pbl9jKF9fVkFfQVJHU19fKSAiICIKKyMgIGRlZmluZSBfX0FTTV9DT05TVCh4KQl4IyNVTAorIyAgZGVmaW5lIEFTTV9DT05TVCh4KQkJX19BU01fQ09OU1QoeCkKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX0FTTV9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vaW8uaAppbmRleCA3YzNlYzEzLi5mYzk5OTdiIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vaW8uaApAQCAtMjEwLDYgKzIxMCw5IEBACiAjZGVmaW5lIGluX2JlMzIoYSkgX19yYXdfcmVhZGwoKGNvbnN0IHZvaWQgX19pb21lbSBfX2ZvcmNlICopKGEpKQogI2RlZmluZSBpbl9iZTE2KGEpIF9fcmF3X3JlYWR3KGEpCiAKKyNkZWZpbmUgd3JpdGVsX2JlKHYsIGEpCW91dF9iZTMyKChfX2ZvcmNlIHVuc2lnbmVkICopYSwgdikKKyNkZWZpbmUgcmVhZGxfYmUoYSkJaW5fYmUzMigoX19mb3JjZSB1bnNpZ25lZCAqKWEpCisKIC8qCiAgKiBMaXR0bGUgZW5kaWFuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9pcGMuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9pcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2ZTNkOS4uMDAwMDAwMAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vaXBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaXBjLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCA3MmFjZWFlLi44ODBjOTg4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGFnZS5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9hc20tY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTI2LDYgKzI3LDggQEAKICNkZWZpbmUgUEFHRV9TSVpFCShfQUMoMSwgVUwpIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIFBBR0VfTUFTSwkofihQQUdFX1NJWkUtMSkpCiAKKyNkZWZpbmUgTE9BRF9PRkZTRVQJQVNNX0NPTlNUKChDT05GSUdfS0VSTkVMX1NUQVJULUNPTkZJR19LRVJORUxfQkFTRV9BRERSKSkKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2RlZmluZSBQQUdFX1VQKGFkZHIpCSgoKGFkZHIpKygoUEFHRV9TSVpFKS0xKSkmKH4oKFBBR0VfU0laRSktMSkpKQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCAyN2Y4ZGFmLi5lZDY3YzllIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc2V0dXAuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMzgsNyArMzgsNyBAQAogdm9pZCB0aW1lX2luaXQodm9pZCk7CiB2b2lkIGluaXRfSVJRKHZvaWQpOwogdm9pZCBtYWNoaW5lX2Vhcmx5X2luaXQoY29uc3QgY2hhciAqY21kbGluZSwgdW5zaWduZWQgaW50IHJhbSwKLQkJCQkJCXVuc2lnbmVkIGludCBmZHQpOworCQkJdW5zaWduZWQgaW50IGZkdCwgdW5zaWduZWQgaW50IG1zcik7CiAKIHZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCk7CiB2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc3lzY2FsbC5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDhkZmNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtMCwwICsxLDk5IEBACisjaWZuZGVmIF9fQVNNX01JQ1JPQkxBWkVfU1lTQ0FMTF9ICisjZGVmaW5lIF9fQVNNX01JQ1JPQkxBWkVfU1lTQ0FMTF9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworLyogVGhlIHN5c3RlbSBjYWxsIG51bWJlciBpcyBnaXZlbiBieSB0aGUgdXNlciBpbiBSMTIgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBzeXNjYWxsX2dldF9ucihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gcmVncy0+cjEyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9yb2xsYmFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIFRPRE8uICAqLworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfZXJyb3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIElTX0VSUl9WQUxVRShyZWdzLT5yMykgPyByZWdzLT5yMyA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzeXNjYWxsX2dldF9yZXR1cm5fdmFsdWUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIHJlZ3MtPnIzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9zZXRfcmV0dXJuX3ZhbHVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgICAgaW50IGVycm9yLCBsb25nIHZhbCkKK3sKKwlpZiAoZXJyb3IpCisJCXJlZ3MtPnIzID0gLWVycm9yOworCWVsc2UKKwkJcmVncy0+cjMgPSB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgbWljcm9ibGF6ZV9yZWdfdCBtaWNyb2JsYXplX2dldF9zeXNjYWxsX2FyZyhzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJCQkgIHVuc2lnbmVkIGludCBuKQoreworCXN3aXRjaCAobikgeworCWNhc2UgNTogcmV0dXJuIHJlZ3MtPnIxMDsKKwljYXNlIDQ6IHJldHVybiByZWdzLT5yOTsKKwljYXNlIDM6IHJldHVybiByZWdzLT5yODsKKwljYXNlIDI6IHJldHVybiByZWdzLT5yNzsKKwljYXNlIDE6IHJldHVybiByZWdzLT5yNjsKKwljYXNlIDA6IHJldHVybiByZWdzLT5yNTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIH4wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWljcm9ibGF6ZV9zZXRfc3lzY2FsbF9hcmcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBuLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlzd2l0Y2ggKG4pIHsKKwljYXNlIDU6CisJCXJlZ3MtPnIxMCA9IHZhbDsKKwljYXNlIDQ6CisJCXJlZ3MtPnI5ID0gdmFsOworCWNhc2UgMzoKKwkJcmVncy0+cjggPSB2YWw7CisJY2FzZSAyOgorCQlyZWdzLT5yNyA9IHZhbDsKKwljYXNlIDE6CisJCXJlZ3MtPnI2ID0gdmFsOworCWNhc2UgMDoKKwkJcmVncy0+cjUgPSB2YWw7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9nZXRfYXJndW1lbnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgdW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBuLAorCQkJCQkgdW5zaWduZWQgbG9uZyAqYXJncykKK3sKKwl3aGlsZSAobi0tKQorCQkqYXJncysrID0gbWljcm9ibGF6ZV9nZXRfc3lzY2FsbF9hcmcocmVncywgaSsrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfc2V0X2FyZ3VtZW50cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJIHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbiwKKwkJCQkJIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFyZ3MpCit7CisJd2hpbGUgKG4tLSkKKwkJbWljcm9ibGF6ZV9zZXRfc3lzY2FsbF9hcmcocmVncywgaSsrLCAqYXJncysrKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX01JQ1JPQkxBWkVfU1lTQ0FMTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLmMKaW5kZXggYzQxMWM2Ny4uMzUzOWJhYiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8uYwpAQCAtMjgsNiArMjgsNyBAQAogCXsiNy4xMC5kIiwgMHgwYn0sCiAJeyI3LjIwLmEiLCAweDBjfSwKIAl7IjcuMjAuYiIsIDB4MGR9LAorCXsiNy4yMC5jIiwgMHgwZX0sCiAJLyogRklYTUUgVGhlcmUgaXMgbm8ga2V5Y29kZSBkZWZpbmVkIGluIE1CViBmb3IgdGhlc2UgdmVyc2lvbnMgKi8KIAl7IjIuMTAuYSIsIDB4MTB9LAogCXsiMy4wMC5hIiwgMHgyMH0sCkBAIC00OSw2ICs1MCw4IEBACiAJeyJzcGFydGFuM2EiLCAweGF9LAogCXsic3BhcnRhbjNhbiIsIDB4Yn0sCiAJeyJzcGFydGFuM2Fkc3AiLCAweGN9LAorCXsic3BhcnRhbjYiLCAweGR9LAorCXsidmlydGV4NiIsIDB4ZX0sCiAJLyogRklYTUUgVGhlcmUgaXMgbm8ga2V5IGNvZGUgZGVmaW5lZCBmb3Igc3BhcnRhbjIgKi8KIAl7InNwYXJ0YW4yIiwgMHhmMH0sCiAJe05VTEwsIDB9LApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS5TCmluZGV4IGM3MzUzZTcuLmUzZWNiMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2VudHJ5LlMKQEAgLTMwOCwzOCArMzA4LDY5IEBACiAJc3dpCXIxMiwgcjEsIFBUTytQVF9SMDsKIAl0b3ZpcnQocjEscjEpCiAKLQlsYQlyMTUsIHIwLCByZXRfZnJvbV90cmFwLTgKIC8qIHdoZXJlIHRoZSB0cmFwIHNob3VsZCByZXR1cm4gbmVlZCAtOCB0byBhZGp1c3QgZm9yIHJ0c2QgcjE1LCA4Ki8KIC8qIEp1bXAgdG8gdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIGZvciB0aGUgc3lzdGVtIGNhbGwgbnVtYmVyIGluIHIxMgogICogKHIxMiBpcyBub3QgcHJlc2VydmVkKSwgb3IgcmV0dXJuIGFuIGVycm9yIGlmIHIxMiBpcyBub3QgdmFsaWQuIFRoZSBMUAogICogcmVnaXN0ZXIgc2hvdWxkIHBvaW50IHRvIHRoZSBsb2NhdGlvbiB3aGVyZQogICogdGhlIGNhbGxlZCBmdW5jdGlvbiBzaG91bGQgcmV0dXJuLiAgW25vdGUgdGhhdCBNQUtFX1NZU19DQUxMIHVzZXMgbGFiZWwgMV0gKi8KLQkvKiBTZWUgaWYgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpcyB2YWxpZC4gICovCisKKwkjIFN0ZXAgaW50byB2aXJ0dWFsIG1vZGUuCisJc2V0X3ZtczsKKwlhZGRpawlyMTEsIHIwLCAzZgorCXJ0aWQJcjExLCAwCisJbm9wCiszOgorCWFkZAlyMTEsIHIwLCBDVVJSRU5UX1RBU0sJIC8qIEdldCBjdXJyZW50IHRhc2sgcHRyIGludG8gcjExICovCisJbHdpCXIxMSwgcjExLCBUU19USFJFQURfSU5GTyAvKiBnZXQgdGhyZWFkIGluZm8gKi8KKwlsd2kJcjExLCByMTEsIFRJX0ZMQUdTCSAvKiBnZXQgZmxhZ3MgaW4gdGhyZWFkIGluZm8gKi8KKwlhbmRpCXIxMSwgcjExLCBfVElGX1dPUktfU1lTQ0FMTF9NQVNLCisJYmVxaQlyMTEsIDRmCisKKwlhZGRpawlyMywgcjAsIC1FTk9TWVMKKwlzd2kJcjMsIHIxLCBQVE8gKyBQVF9SMworCWJybGlkCXIxNSwgZG9fc3lzY2FsbF90cmFjZV9lbnRlcgorCWFkZGlrCXI1LCByMSwgUFRPICsgUFRfUjAKKworCSMgZG9fc3lzY2FsbF90cmFjZV9lbnRlciByZXR1cm5zIHRoZSBuZXcgc3lzY2FsbCBuci4KKwlhZGRrCXIxMiwgcjAsIHIzCisJbHdpCXI1LCByMSwgUFRPK1BUX1I1OworCWx3aQlyNiwgcjEsIFBUTytQVF9SNjsKKwlsd2kJcjcsIHIxLCBQVE8rUFRfUjc7CisJbHdpCXI4LCByMSwgUFRPK1BUX1I4OworCWx3aQlyOSwgcjEsIFBUTytQVF9SOTsKKwlsd2kJcjEwLCByMSwgUFRPK1BUX1IxMDsKKzQ6CisvKiBKdW1wIHRvIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiBmb3IgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpbiByMTIKKyAqIChyMTIgaXMgbm90IHByZXNlcnZlZCksIG9yIHJldHVybiBhbiBlcnJvciBpZiByMTIgaXMgbm90IHZhbGlkLgorICogVGhlIExQIHJlZ2lzdGVyIHNob3VsZCBwb2ludCB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGNhbGxlZCBmdW5jdGlvbgorICogc2hvdWxkIHJldHVybi4gIFtub3RlIHRoYXQgTUFLRV9TWVNfQ0FMTCB1c2VzIGxhYmVsIDFdICovCisJLyogU2VlIGlmIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXIgaXMgdmFsaWQgKi8KIAlhZGRpCXIxMSwgcjEyLCAtX19OUl9zeXNjYWxsczsKLQliZ2VpCXIxMSwxZjsKKwliZ2VpCXIxMSw1ZjsKIAkvKiBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhpcyBzeXN0ZW0gY2FsbC4gICovCiAJLyogTm90ZSBNaWNyb2JsYXplIGJhcnJlbCBzaGlmdCBpcyBvcHRpb25hbCwgc28gZG9uJ3QgcmVseSBvbiBpdCAqLwogCWFkZAlyMTIsIHIxMiwgcjEyOwkJCS8qIGNvbnZlcnQgbnVtIC0+IHB0ciAqLwogCWFkZAlyMTIsIHIxMiwgcjEyOwogCiAJLyogVHJhYyBzeXNjYWxscyBhbmQgc3RvcmVkIHRoZW0gdG8gcjBfcmFtICovCi0JbHdpCXIzLCByMTIsIDB4NDAwICsgVE9QSFlTKHIwX3JhbSkKKwlsd2kJcjMsIHIxMiwgMHg0MDAgKyByMF9yYW0KIAlhZGRpCXIzLCByMywgMQotCXN3aQlyMywgcjEyLCAweDQwMCArIFRPUEhZUyhyMF9yYW0pCisJc3dpCXIzLCByMTIsIDB4NDAwICsgcjBfcmFtCiAKLQlsd2kJcjEyLCByMTIsIFRPUEhZUyhzeXNfY2FsbF90YWJsZSk7IC8qIEZ1bmN0aW9uIHB0ciAqLwotCS8qIE1ha2UgdGhlIHN5c3RlbSBjYWxsLiAgdG8gcjEyKi8KLQlzZXRfdm1zOwotCXJ0aWQJcjEyLCAwOwotCW5vcDsKKwkjIEZpbmQgYW5kIGp1bXAgaW50byB0aGUgc3lzY2FsbCBoYW5kbGVyLgorCWx3aQlyMTIsIHIxMiwgc3lzX2NhbGxfdGFibGUKKwkvKiB3aGVyZSB0aGUgdHJhcCBzaG91bGQgcmV0dXJuIG5lZWQgLTggdG8gYWRqdXN0IGZvciBydHNkIHIxNSwgOCAqLworCWxhCXIxNSwgcjAsIHJldF9mcm9tX3RyYXAtOAorCWJyYQlyMTIKKwogCS8qIFRoZSBzeXNjYWxsIG51bWJlciBpcyBpbnZhbGlkLCByZXR1cm4gYW4gZXJyb3IuICAqLwotMToJVk1fT047CS8qIFJFVFVSTigpIGV4cGVjdHMgdmlydHVhbCBtb2RlKi8KKzU6CiAJYWRkaQlyMywgcjAsIC1FTk9TWVM7CiAJcnRzZAlyMTUsODsJCS8qIGxvb2tzIGxpa2UgYSBub3JtYWwgc3Vicm91dGluZSByZXR1cm4gKi8KIAlvciAJcjAsIHIwLCByMAogCiAKLS8qIEVudHJ5IHBvaW50IHVzZWQgdG8gcmV0dXJuIGZyb20gYSBzeXNjYWxsL3RyYXAuICAqLworLyogRW50cnkgcG9pbnQgdXNlZCB0byByZXR1cm4gZnJvbSBhIHN5c2NhbGwvdHJhcCAqLwogLyogV2UgcmUtZW5hYmxlIEJJUCBiaXQgYmVmb3JlIHN0YXRlIHJlc3RvcmUgKi8KIENfRU5UUlkocmV0X2Zyb21fdHJhcCk6CiAJc2V0X2JpcDsJCQkvKiAgSW50cyBtYXNrZWQgZm9yIHN0YXRlIHJlc3RvcmUqLwpAQCAtMzQ5LDYgKzM4MCwyMyBAQAogCiAJLyogV2UncmUgcmV0dXJuaW5nIHRvIHVzZXIgbW9kZSwgc28gY2hlY2sgZm9yIHZhcmlvdXMgY29uZGl0aW9ucyB0aGF0CiAJICogdHJpZ2dlciByZXNjaGVkdWxpbmcuICovCisJIyBGSVhNRTogUmVzdHJ1Y3R1cmUgYWxsIHRoZXNlIGZsYWcgY2hlY2tzLgorCWFkZAlyMTEsIHIwLCBDVVJSRU5UX1RBU0s7CS8qIEdldCBjdXJyZW50IHRhc2sgcHRyIGludG8gcjExICovCisJbHdpCXIxMSwgcjExLCBUU19USFJFQURfSU5GTzsJLyogZ2V0IHRocmVhZCBpbmZvICovCisJbHdpCXIxMSwgcjExLCBUSV9GTEFHUzsJCS8qIGdldCBmbGFncyBpbiB0aHJlYWQgaW5mbyAqLworCWFuZGkJcjExLCByMTEsIF9USUZfV09SS19TWVNDQUxMX01BU0sKKwliZXFpCXIxMSwgMWYKKworCXN3aQlyMywgcjEsIFBUTyArIFBUX1IzCisJc3dpCXI0LCByMSwgUFRPICsgUFRfUjQKKwlicmxpZAlyMTUsIGRvX3N5c2NhbGxfdHJhY2VfbGVhdmUKKwlhZGRpawlyNSwgcjEsIFBUTyArIFBUX1IwCisJbHdpCXIzLCByMSwgUFRPICsgUFRfUjMKKwlsd2kJcjQsIHIxLCBQVE8gKyBQVF9SNAorMToKKworCS8qIFdlJ3JlIHJldHVybmluZyB0byB1c2VyIG1vZGUsIHNvIGNoZWNrIGZvciB2YXJpb3VzIGNvbmRpdGlvbnMgdGhhdAorCSAqIHRyaWdnZXIgcmVzY2hlZHVsaW5nLiAqLwogCS8qIEdldCBjdXJyZW50IHRhc2sgcHRyIGludG8gcjExICovCiAJYWRkCXIxMSwgcjAsIENVUlJFTlRfVEFTSzsJLyogR2V0IGN1cnJlbnQgdGFzayBwdHIgaW50byByMTEgKi8KIAlsd2kJcjExLCByMTEsIFRTX1RIUkVBRF9JTkZPOwkvKiBnZXQgdGhyZWFkIGluZm8gKi8KQEAgLTU0NCw2ICs1OTIsOCBAQAogCW5vcAogCW1mcwlyNywgcmZzcjsJCS8qIHNhdmUgRlNSICovCiAJbm9wCisJbXRzCXJmc3IsIHIwOwkvKiBDbGVhciBzdGlja3kgZnNyICovCisJbm9wCiAJbGEJcjEyLCByMCwgZnVsbF9leGNlcHRpb24KIAlzZXRfdm1zOwogCXJ0YmQJcjEyLCAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2V4Y2VwdGlvbnMuYwppbmRleCAwY2I2NGEzLi5kOWY3MGY4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2V4Y2VwdGlvbnMuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2V4Y2VwdGlvbnMuYwpAQCAtNzIsNyArNzIsOCBAQAogI2VuZGlmCiAKICNpZiAwCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiRXhjZXB0aW9uICUwMnggaW4gJXMgbW9kZSwgRlNSPSUwOHggUEM9JTA4eCBFU1I9JTA4eFxuIiwKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFeGNlcHRpb24gJTAyeCBpbiAlcyBtb2RlLCBGU1I9JTA4eCBQQz0lMDh4ICIgXAorCQkJCQkJCSJFU1I9JTA4eFxuIiwKIAkJCXR5cGUsIHVzZXJfbW9kZShyZWdzKSA/ICJ1c2VyIiA6ICJrZXJuZWwiLCBmc3IsCiAJCQkodW5zaWduZWQgaW50KSByZWdzLT5wYywgKHVuc2lnbmVkIGludCkgcmVncy0+ZXNyKTsKICNlbmRpZgpAQCAtODAsNDIgKzgxLDUwIEBACiAJc3dpdGNoICh0eXBlICYgMHgxRikgewogCWNhc2UgTUlDUk9CTEFaRV9JTExfT1BDT0RFX0VYQ0VQVElPTjoKIAkJaWYgKHVzZXJfbW9kZShyZWdzKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSWxsZWdhbCBvcGNvZGUgZXhjZXB0aW9uIGluIHVzZXIgbW9kZS5cbiIpOworCQkJcHJfZGVidWcoS0VSTl9XQVJOSU5HICJJbGxlZ2FsIG9wY29kZSBleGNlcHRpb24gIiBcCisJCQkJCQkJImluIHVzZXIgbW9kZS5cbiIpOwogCQkJX2V4Y2VwdGlvbihTSUdJTEwsIHJlZ3MsIElMTF9JTExPUEMsIGFkZHIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIklsbGVnYWwgb3Bjb2RlIGV4Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZS5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbGxlZ2FsIG9wY29kZSBleGNlcHRpb24gIiBcCisJCQkJCQkJImluIGtlcm5lbCBtb2RlLlxuIik7CiAJCWRpZSgib3Bjb2RlIGV4Y2VwdGlvbiIsIHJlZ3MsIFNJR0JVUyk7CiAJCWJyZWFrOwogCWNhc2UgTUlDUk9CTEFaRV9JQlVTX0VYQ0VQVElPTjoKIAkJaWYgKHVzZXJfbW9kZShyZWdzKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW5zdHJ1Y3Rpb24gYnVzIGVycm9yIGV4Y2VwdGlvbiBpbiB1c2VyIG1vZGUuXG4iKTsKKwkJCXByX2RlYnVnKEtFUk5fV0FSTklORyAiSW5zdHJ1Y3Rpb24gYnVzIGVycm9yICIgXAorCQkJCQkJImV4Y2VwdGlvbiBpbiB1c2VyIG1vZGUuXG4iKTsKIAkJCV9leGNlcHRpb24oU0lHQlVTLCByZWdzLCBCVVNfQURSRVJSLCBhZGRyKTsKIAkJCXJldHVybjsKIAkJfQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnN0cnVjdGlvbiBidXMgZXJyb3IgZXhjZXB0aW9uIGluIGtlcm5lbCBtb2RlLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkluc3RydWN0aW9uIGJ1cyBlcnJvciBleGNlcHRpb24gIiBcCisJCQkJCQkJImluIGtlcm5lbCBtb2RlLlxuIik7CiAJCWRpZSgiYnVzIGV4Y2VwdGlvbiIsIHJlZ3MsIFNJR0JVUyk7CiAJCWJyZWFrOwogCWNhc2UgTUlDUk9CTEFaRV9EQlVTX0VYQ0VQVElPTjoKIAkJaWYgKHVzZXJfbW9kZShyZWdzKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBidXMgZXJyb3IgZXhjZXB0aW9uIGluIHVzZXIgbW9kZS5cbiIpOworCQkJcHJfZGVidWcoS0VSTl9XQVJOSU5HICJEYXRhIGJ1cyBlcnJvciBleGNlcHRpb24gIiBcCisJCQkJCQkJImluIHVzZXIgbW9kZS5cbiIpOwogCQkJX2V4Y2VwdGlvbihTSUdCVVMsIHJlZ3MsIEJVU19BRFJFUlIsIGFkZHIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkRhdGEgYnVzIGVycm9yIGV4Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZS5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJEYXRhIGJ1cyBlcnJvciBleGNlcHRpb24gIiBcCisJCQkJCQkJImluIGtlcm5lbCBtb2RlLlxuIik7CiAJCWRpZSgiYnVzIGV4Y2VwdGlvbiIsIHJlZ3MsIFNJR0JVUyk7CiAJCWJyZWFrOwogCWNhc2UgTUlDUk9CTEFaRV9ESVZfWkVST19FWENFUFRJT046CiAJCWlmICh1c2VyX21vZGUocmVncykpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpdmlkZSBieSB6ZXJvIGV4Y2VwdGlvbiBpbiB1c2VyIG1vZGVcbiIpOwotCQkJX2V4Y2VwdGlvbihTSUdJTEwsIHJlZ3MsIElMTF9JTExPUEMsIGFkZHIpOworCQkJcHJfZGVidWcoS0VSTl9XQVJOSU5HICJEaXZpZGUgYnkgemVybyBleGNlcHRpb24gIiBcCisJCQkJCQkJImluIHVzZXIgbW9kZVxuIik7CisJCQlfZXhjZXB0aW9uKFNJR0lMTCwgcmVncywgRlBFX0lOVERJViwgYWRkcik7CiAJCQlyZXR1cm47CiAJCX0KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGl2aWRlIGJ5IHplcm8gZXhjZXB0aW9uIGluIGtlcm5lbCBtb2RlLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpdmlkZSBieSB6ZXJvIGV4Y2VwdGlvbiAiIFwKKwkJCQkJCQkiaW4ga2VybmVsIG1vZGUuXG4iKTsKIAkJZGllKCJEaXZpZGUgYnkgZXhjZXB0aW9uIiwgcmVncywgU0lHQlVTKTsKIAkJYnJlYWs7CiAJY2FzZSBNSUNST0JMQVpFX0ZQVV9FWENFUFRJT046Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkZQVSBleGNlcHRpb25cbiIpOworCQlwcl9kZWJ1ZyhLRVJOX1dBUk5JTkcgIkZQVSBleGNlcHRpb25cbiIpOwogCQkvKiBJRUVFIEZQIGV4Y2VwdGlvbiAqLwogCQkvKiBJIHJlbW92ZWQgZnNyIHZhcmlhYmxlIGFuZCB1c2UgY29kZSB2YXIgZm9yIHN0b3JpbmcgZnNyICovCiAJCWlmIChmc3IgJiBGU1JfSU8pCkBAIC0xMzMsNyArMTQyLDcgQEAKIAogI2lmZGVmIENPTkZJR19NTVUKIAljYXNlIE1JQ1JPQkxBWkVfUFJJVklMRUdFRF9FWENFUFRJT046Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlByaXZpbGVnZWQgZXhjZXB0aW9uXG4iKTsKKwkJcHJfZGVidWcoS0VSTl9XQVJOSU5HICJQcml2aWxlZ2VkIGV4Y2VwdGlvblxuIik7CiAJCS8qICJicmsgcjAscjAiIC0gdXNlZCBhcyBkZWJ1ZyBicmVha3BvaW50ICovCiAJCWlmIChnZXRfdXNlcihjb2RlLCAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnBjKSA9PSAwCiAJCQkmJiBjb2RlID09IDB4OTgwYzAwMDApIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaGVhZC5TIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9oZWFkLlMKaW5kZXggZTQxYzZjZS4uNjk3Y2UzMCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9oZWFkLlMKQEAgLTU0LDYgKzU0LDE2IEBACiAJbWZzCXIxLCBybXNyCiAJYW5kaQlyMSwgcjEsIH4yCiAJbXRzCXJtc3IsIHIxCisvKgorICogSGVyZSBpcyBjaGVja2luZyBtZWNoYW5pc20gd2hpY2ggY2hlY2sgaWYgTWljcm9ibGF6ZSBoYXMgbXNyIGluc3RydWN0aW9ucworICogV2UgbG9hZCBtc3IgYW5kIGNvbXBhcmUgaXQgd2l0aCBwcmV2aW91cyByMSB2YWx1ZSAtIGlmIGlzIHRoZSBzYW1lLAorICogbXNyIGluc3RydWN0aW9ucyB3b3JrcyBpZiBub3QgLSBjcHUgZG9uJ3QgaGF2ZSB0aGVtLgorICovCisJLyogcjg9MCAtIEkgaGF2ZSBtc3IgaW5zdHIsIDEgLSBJIGRvbid0IGhhdmUgdGhlbSAqLworCXJzdWJpCXIwLCByMCwgMQkvKiBzZXQgdGhlIGNhcnJ5IGJpdCAqLworCW1zcmNscglyMCwgMHg0CQkvKiB0cnkgdG8gY2xlYXIgaXQgKi8KKwkvKiByZWFkIHRoZSBjYXJyeSBiaXQsIHI4IHdpbGwgYmUgJzAnIGlmIG1zcmNsciBleGlzdHMgKi8KKwlhZGRpawlyOCwgcjAsIDAKIAogLyogcjcgbWF5IHBvaW50IHRvIGFuIEZEVCwgb3IgdGhlcmUgbWF5IGJlIG9uZSBsaW5rZWQgaW4uCiAgICBpZiBpdCdzIGluIHI3LCB3ZSd2ZSBnb3QgdG8gc2F2ZSBpdCBhd2F5IEFTQVAuCkBAIC0yMDksOCArMjE5LDggQEAKIAkgKiBQbGVhc2Ugc2VlICQoQVJDSCkvbWFjaC0kKFNVQkFSQ0gpL3NldHVwLmMgZm9yCiAJICogdGhlIGZ1bmN0aW9uLgogCSAqLwotCWxhCXI4LCByMCwgbWFjaGluZV9lYXJseV9pbml0Ci0JYnJhbGQJcjE1LCByOAorCWxhCXI5LCByMCwgbWFjaGluZV9lYXJseV9pbml0CisJYnJhbGQJcjE1LCByOQogCW5vcAogCiAjaWZuZGVmIENPTkZJR19NTVUKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaHdfZXhjZXB0aW9uX2hhbmRsZXIuUyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaHdfZXhjZXB0aW9uX2hhbmRsZXIuUwppbmRleCAzMjg4Yzk3Li4yYjg2YzAzIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2h3X2V4Y2VwdGlvbl9oYW5kbGVyLlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9od19leGNlcHRpb25faGFuZGxlci5TCkBAIC04NCw5ICs4NCwxMCBAQAogI2RlZmluZSBOVU1fVE9fUkVHKG51bSkJCXIgIyMgbnVtCiAKICNpZmRlZiBDT05GSUdfTU1VCi0vKiBGSVhNRSB5b3UgY2FuJ3QgY2hhbmdlIGZpcnN0IGxvYWQgb2YgTVNSIGJlY2F1c2UgdGhlcmUgaXMKLSAqIGhhcmRjb2RlZCBqdW1wIGJyaSA0ICovCiAJI2RlZmluZSBSRVNUT1JFX1NUQVRFCQkJXAorCQlsd2kJcjUsIHIxLCAwOwkJXAorCQltdHMJcm1zciwgcjU7CQlcCisJCW5vcDsJCQkJXAogCQlsd2kJcjMsIHIxLCBQVF9SMzsJCVwKIAkJbHdpCXI0LCByMSwgUFRfUjQ7CQlcCiAJCWx3aQlyNSwgcjEsIFBUX1I1OwkJXApAQCAtMzA5LDYgKzMxMCw5IEBACiAJbHdpCXIzMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKENVUlJFTlRfU0FWRSkpIC8qIGdldCBzYXZlZCBjdXJyZW50ICovCiAjZW5kaWYKIAorCW1mcwlyNSwgcm1zcjsKKwlub3AKKwlzd2kJcjUsIHIxLCAwOwogCW1mcwlyMywgcmVzcgogCW5vcAogCW1mcwlyNCwgcmVhcjsKQEAgLTM4MCw2ICszODQsOCBAQAogCWFkZGsJcjgsIHIxNywgcjA7IC8qIExvYWQgZXhjZXB0aW9uIGFkZHJlc3MgKi8KIAlicmFsaWQJcjE1LCBmdWxsX2V4Y2VwdGlvbjsgLyogQnJhbmNoIHRvIHRoZSBoYW5kbGVyICovCiAJbm9wOworCW10cwlyZnNyLCByMDsJLyogQ2xlYXIgc3RpY2t5IGZzciAqLworCW5vcAogCiAJLyoKIAkgKiBUcmlnZ2VyIGV4ZWN1dGlvbiBvZiB0aGUgc2lnbmFsIGhhbmRsZXIgYnkgZW5hYmxpbmcKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2luaXRfdGFzay5jCmluZGV4IDY3ZGEyMjUuLmI1ZDcxMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMTksOSArMTksOCBAQAogc3RhdGljIHN0cnVjdCBzaWduYWxfc3RydWN0IGluaXRfc2lnbmFscyA9IElOSVRfU0lHTkFMUyhpbml0X3NpZ25hbHMpOwogc3RhdGljIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCBpbml0X3NpZ2hhbmQgPSBJTklUX1NJR0hBTkQoaW5pdF9zaWdoYW5kKTsKIAotdW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPQoteyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KKwl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwogCiBzdHJ1Y3QgdGFza19zdHJ1Y3QgaW5pdF90YXNrID0gSU5JVF9UQVNLKGluaXRfdGFzayk7CiBFWFBPUlRfU1lNQk9MKGluaXRfdGFzayk7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDAwYjEyYzYuLmM1OTJkNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMzUsNiArMjM1LDkgQEAKIAlyZWdzLT5wYyA9IHBjOwogCXJlZ3MtPnIxID0gdXNwOwogCXJlZ3MtPnB0X21vZGUgPSAwOworI2lmZGVmIENPTkZJR19NTVUKKwlyZWdzLT5tc3IgfD0gTVNSX1VNUzsKKyNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX01NVQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNTNmZjM5YS4uNGIzYWMzMiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3B0cmFjZS5jCkBAIC0yOSw2ICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vob29rLmg+CiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTE3NCw2ICsxNzgsNjQgQEAKIAlyZXR1cm4gcnZhbDsKIH0KIAorYXNtbGlua2FnZSBsb25nIGRvX3N5c2NhbGxfdHJhY2VfZW50ZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJbG9uZyByZXQgPSAwOworCisJc2VjdXJlX2NvbXB1dGluZyhyZWdzLT5yMTIpOworCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpICYmCisJICAgIHRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9lbnRyeShyZWdzKSkKKwkJLyoKKwkJICogVHJhY2luZyBkZWNpZGVkIHRoaXMgc3lzY2FsbCBzaG91bGQgbm90IGhhcHBlbi4KKwkJICogV2UnbGwgcmV0dXJuIGEgYm9ndXMgY2FsbCBudW1iZXIgdG8gZ2V0IGFuIEVOT1NZUworCQkgKiBlcnJvciwgYnV0IGxlYXZlIHRoZSBvcmlnaW5hbCBudW1iZXIgaW4gcmVncy0+cmVnc1swXS4KKwkJICovCisJCXJldCA9IC0xTDsKKworCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkKKwkJYXVkaXRfc3lzY2FsbF9lbnRyeShFTV9YSUxJTlhfTUlDUk9CTEFaRSwgcmVncy0+cjEyLAorCQkJCSAgICByZWdzLT5yNSwgcmVncy0+cjYsCisJCQkJICAgIHJlZ3MtPnI3LCByZWdzLT5yOCk7CisKKwlyZXR1cm4gcmV0ID86IHJlZ3MtPnIxMjsKK30KKworYXNtbGlua2FnZSB2b2lkIGRvX3N5c2NhbGxfdHJhY2VfbGVhdmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHN0ZXA7CisKKwlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkpCisJCWF1ZGl0X3N5c2NhbGxfZXhpdChBVURJVFNDX1JFU1VMVChyZWdzLT5yMyksIHJlZ3MtPnIzKTsKKworCXN0ZXAgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKTsKKwlpZiAoc3RlcCB8fCB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKKwkJdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2V4aXQocmVncywgc3RlcCk7Cit9CisKKyNpZiAwCitzdGF0aWMgYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uodm9pZCkKK3sKKwlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorCQlyZXR1cm47CisJaWYgKCEoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCisJCXJldHVybjsKKwkvKiBUaGUgMHg4MCBwcm92aWRlcyBhIHdheSBmb3IgdGhlIHRyYWNpbmcgcGFyZW50IHRvIGRpc3Rpbmd1aXNoCisJIGJldHdlZW4gYSBzeXNjYWxsIHN0b3AgYW5kIFNJR1RSQVAgZGVsaXZlcnkgKi8KKwlwdHJhY2Vfbm90aWZ5KFNJR1RSQVAgfCAoKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFU1lTR09PRCkKKwkJCQk/IDB4ODAgOiAwKSk7CisJLyoKKwkgKiB0aGlzIGlzbid0IHRoZSBzYW1lIGFzIGNvbnRpbnVpbmcgd2l0aCBhIHNpZ25hbCwgYnV0IGl0IHdpbGwgZG8KKwkgKiBmb3Igbm9ybWFsIHVzZS4gc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCisJICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAtYnJsCisJICovCisJaWYgKGN1cnJlbnQtPmV4aXRfY29kZSkgeworCQlzZW5kX3NpZyhjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOworCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOworCX0KK30KKyNlbmRpZgorCiB2b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7CiAJLyogbm90aGluZyB0byBkbyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zZXR1cC5jCmluZGV4IDJhOTdiZjUuLjhjMWUwZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3NldHVwLmMKQEAgLTk0LDcgKzk0LDcgQEAKICNlbmRpZgkvKiBDT05GSUdfTVREX1VDTElOVVhfRUJTUyAqLwogCiB2b2lkIF9faW5pdCBtYWNoaW5lX2Vhcmx5X2luaXQoY29uc3QgY2hhciAqY21kbGluZSwgdW5zaWduZWQgaW50IHJhbSwKLQkJdW5zaWduZWQgaW50IGZkdCkKKwkJdW5zaWduZWQgaW50IGZkdCwgdW5zaWduZWQgaW50IG1zcikKIHsKIAl1bnNpZ25lZCBsb25nICpzcmMsICpkc3QgPSAodW5zaWduZWQgbG9uZyAqKTB4MDsKIApAQCAtMTU3LDYgKzE1NywxNiBAQAogCWVhcmx5X3ByaW50aygiTmV3IGtsaW1pdDogMHglMDh4XG4iLCAodW5zaWduZWQpa2xpbWl0KTsKICNlbmRpZgogCisjaWYgQ09ORklHX1hJTElOWF9NSUNST0JMQVpFMF9VU0VfTVNSX0lOU1RSCisJaWYgKG1zcikKKwkJZWFybHlfcHJpbnRrKCIhISFZb3VyIGtlcm5lbCBoYXMgc2V0dXAgTVNSIGluc3RydWN0aW9uIGJ1dCAiCisJCQkJIkNQVSBkb24ndCBoYXZlIGl0ICVkXG4iLCBtc3IpOworI2Vsc2UKKwlpZiAoIW1zcikKKwkJZWFybHlfcHJpbnRrKCIhISFZb3VyIGtlcm5lbCBub3Qgc2V0dXAgTVNSIGluc3RydWN0aW9uIGJ1dCAiCisJCQkJIkNQVSBoYXZlIGl0ICVkXG4iLCBtc3IpOworI2VuZGlmCisKIAlmb3IgKHNyYyA9IF9faXZ0X3N0YXJ0OyBzcmMgPCBfX2l2dF9lbmQ7IHNyYysrLCBkc3QrKykKIAkJKmRzdCA9ICpzcmM7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3lzX21pY3JvYmxhemUuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3lzX21pY3JvYmxhemUuYwppbmRleCBiOTZmMTY4Li4wN2NhYmVkIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3N5c19taWNyb2JsYXplLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zeXNfbWljcm9ibGF6ZS5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZWM1ZmE5MS4uZTcwNDE4OCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTIsMTMgKzEyLDE2IEBACiBPVVRQVVRfQVJDSChtaWNyb2JsYXplKQogRU5UUlkoX3N0YXJ0KQogCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCiBqaWZmaWVzID0gamlmZmllc182NCArIDQ7CiAKIFNFQ1RJT05TIHsKIAkuID0gQ09ORklHX0tFUk5FTF9TVEFSVDsKLQkudGV4dCA6IHsKKwlfc3RhcnQgPSBDT05GSUdfS0VSTkVMX0JBU0VfQUREUjsKKwkudGV4dCA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKIAkJX3RleHQgPSAuIDsKIAkJX3N0ZXh0ID0gLiA7CiAJCSooLnRleHQgLnRleHQuKikKQEAgLTMzLDI0ICszNiwyMiBAQAogCX0KIAogCS4gPSBBTElHTiAoNCkgOwotCV9mZHRfc3RhcnQgPSAuIDsgLyogcGxhY2UgZm9yIGZkdCBibG9iICovCi0JLiA9IC4gKyAweDQwMDA7Ci0JX2ZkdF9lbmQgPSAuIDsKKwlfX2ZkdF9ibG9iIDogQVQoQUREUihfX2ZkdF9ibG9iKSAtIExPQURfT0ZGU0VUKSB7CisJCV9mZHRfc3RhcnQgPSAuIDsJCS8qIHBsYWNlIGZvciBmZHQgYmxvYiAqLworCQkqKF9fZmR0X2Jsb2IpIDsJCQkvKiBBbnkgbGluay1wbGFjZWQgRFRCICovCisJICAgICAgICAuID0gX2ZkdF9zdGFydCArIDB4NDAwMDsJLyogUGFkIHVwIHRvIDE2a2J5dGUgKi8KKwkJX2ZkdF9lbmQgPSAuIDsKKwl9CiAKIAkuID0gQUxJR04oMTYpOwogCVJPREFUQQotCS4gPSBBTElHTigxNik7Ci0JX19leF90YWJsZSA6IHsKLQkJX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLQkJKihfX2V4X3RhYmxlKQotCQlfX3N0b3BfX19leF90YWJsZSA9IC47Ci0JfQorCUVYQ0VQVElPTl9UQUJMRSgxNikKIAogCS8qCiAJICogc2RhdGEyIHNlY3Rpb24gY2FuIGdvIGFueXdoZXJlLCBidXQgbXVzdCBiZSB3b3JkIGFsaWduZWQKIAkgKiBhbmQgU0RBMl9CQVNFIG11c3QgcG9pbnQgdG8gdGhlIG1pZGRsZSBvZiBpdAogCSAqLwotCS5zZGF0YTIgOiB7CisJLnNkYXRhMiA6IEFUKEFERFIoLnNkYXRhMikgLSBMT0FEX09GRlNFVCkgewogCQlfc3NydyA9IC47CiAJCS4gPSBBTElHTig0MDk2KTsgLyogcGFnZSBhbGlnbmVkIHdoZW4gTU1VIHVzZWQgLSBvcmlnaW4gMHg4ICovCiAJCSooLnNkYXRhMikKQEAgLTYxLDEyICs2Miw3IEBACiAJfQogCiAJX3NkYXRhID0gLiA7Ci0JLmRhdGEgQUxJR04gKDQwOTYpIDogeyAvKiBwYWdlIGFsaWduZWQgd2hlbiBNTVUgdXNlZCAtIG9yaWdpbiAweDQgKi8KLQkJREFUQV9EQVRBCi0JCUNPTlNUUlVDVE9SUwotCX0KLQkuID0gQUxJR04oMzIpOwotCS5kYXRhLmNhY2hlbGluZV9hbGlnbmVkIDogeyAqKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSB9CisJUldfREFUQV9TRUNUSU9OKDMyLCBQQUdFX1NJWkUsIFRIUkVBRF9TSVpFKQogCV9lZGF0YSA9IC4gOwogCiAJLyogUmVzZXJ2ZSBzb21lIGxvdyBSQU0gZm9yIHIwIGJhc2VkIG1lbW9yeSByZWZlcmVuY2VzICovCkBAIC03NCwxOCArNzAsMTQgQEAKIAlyMF9yYW0gPSAuIDsKIAkuID0gLiArICA0MDk2OwkvKiBhIHBhZ2Ugc2hvdWxkIGJlIGVub3VnaCAqLwogCi0JLyogVGhlIGluaXRpYWwgdGFzayAqLwotCS4gPSBBTElHTig4MTkyKTsKLQkuZGF0YS5pbml0X3Rhc2sgOiB7ICooLmRhdGEuaW5pdF90YXNrKSB9Ci0KIAkvKiBVbmRlciB0aGUgbWljcm9ibGF6ZSBBQkksIC5zZGF0YSBhbmQgLnNic3MgbXVzdCBiZSBjb250aWd1b3VzICovCiAJLiA9IEFMSUdOKDgpOwotCS5zZGF0YSA6IHsKKwkuc2RhdGEgOiBBVChBRERSKC5zZGF0YSkgLSBMT0FEX09GRlNFVCkgewogCQlfc3NybyA9IC47CiAJCSooLnNkYXRhKQogCX0KIAotCS5zYnNzIDoJeworCS5zYnNzIDoJQVQoQUREUiguc2JzcykgLSBMT0FEX09GRlNFVCkgewogCQlfc3Nic3MgPSAuOwogCQkqKC5zYnNzKQogCQlfZXNic3MgPSAuOwpAQCAtOTYsNDcgKzg4LDM2IEBACiAKIAlfX2luaXRfYmVnaW4gPSAuOwogCi0JLiA9IEFMSUdOKDQwOTYpOwotCS5pbml0LnRleHQgOiB7Ci0JCV9zaW5pdHRleHQgPSAuIDsKLQkJSU5JVF9URVhUCi0JCV9laW5pdHRleHQgPSAuOwotCX0KKwlJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCiAKLQkuaW5pdC5kYXRhIDogeworCS5pbml0LmRhdGEgOiBBVChBRERSKC5pbml0LmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsKIAkJSU5JVF9EQVRBCiAJfQogCiAJLiA9IEFMSUdOKDQpOwotCS5pbml0Lml2dCA6IHsKKwkuaW5pdC5pdnQgOiBBVChBRERSKC5pbml0Lml2dCkgLSBMT0FEX09GRlNFVCkgewogCQlfX2l2dF9zdGFydCA9IC47CiAJCSooLmluaXQuaXZ0KQogCQlfX2l2dF9lbmQgPSAuOwogCX0KIAotCS5pbml0LnNldHVwIDogewotCQlfX3NldHVwX3N0YXJ0ID0gLjsKLQkJKiguaW5pdC5zZXR1cCkKLQkJX19zZXR1cF9lbmQgPSAuOworCS5pbml0LnNldHVwIDogQVQoQUREUiguaW5pdC5zZXR1cCkgLSBMT0FEX09GRlNFVCkgeworCQlJTklUX1NFVFVQKDApCiAJfQogCi0JLmluaXRjYWxsLmluaXQgOiB7Ci0JCV9faW5pdGNhbGxfc3RhcnQgPSAuOwotCQlJTklUQ0FMTFMKLQkJX19pbml0Y2FsbF9lbmQgPSAuOworCS5pbml0Y2FsbC5pbml0IDogQVQoQUREUiguaW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCApIHsKKwkJSU5JVF9DQUxMUwogCX0KIAotCS5jb25faW5pdGNhbGwuaW5pdCA6IHsKLQkJX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotCQkqKC5jb25faW5pdGNhbGwuaW5pdCkKLQkJX19jb25faW5pdGNhbGxfZW5kID0gLjsKKwkuY29uX2luaXRjYWxsLmluaXQgOiBBVChBRERSKC5jb25faW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlDT05fSU5JVENBTEwKIAl9CiAKIAlTRUNVUklUWV9JTklUCiAKIAlfX2luaXRfZW5kX2JlZm9yZV9pbml0cmFtZnMgPSAuOwogCi0JLmluaXQucmFtZnMgQUxJR04oNDA5NikgOiB7CisJLmluaXQucmFtZnMgQUxJR04oNDA5NikgOiBBVChBRERSKC5pbml0LnJhbWZzKSAtIExPQURfT0ZGU0VUKSB7CiAJCV9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKIAkJKiguaW5pdC5yYW1mcykKIAkJX19pbml0cmFtZnNfZW5kID0gLjsKQEAgLTE1Miw3ICsxMzMsOCBAQAogCX0KIAlfX2luaXRfZW5kID0gLjsKIAotCS5ic3MgQUxJR04gKDQwOTYpIDogeyAvKiBwYWdlIGFsaWduZWQgd2hlbiBNTVUgdXNlZCAqLworCS5ic3MgQUxJR04gKDQwOTYpIDogQVQoQUREUiguYnNzKSAtIExPQURfT0ZGU0VUKSB7CisJCS8qIHBhZ2UgYWxpZ25lZCB3aGVuIE1NVSB1c2VkICovCiAJCV9fYnNzX3N0YXJ0ID0gLiA7CiAJCQkqKC5ic3MqKQogCQkJKihDT01NT04pCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvbW0vaW5pdC5jIGIvYXJjaC9taWNyb2JsYXplL21tL2luaXQuYwppbmRleCAxMTEwNzg0Li5hNDQ4OTJlIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvbW0vaW5pdC5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9tbS9pbml0LmMKQEAgLTE4MCw3ICsxODAsOCBAQAogCQl0b3RhbHJhbV9wYWdlcysrOwogCQlwYWdlcysrOwogCX0KLQlwcmludGsoS0VSTl9OT1RJQ0UgIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWRrIGZyZWVkXG4iLCBwYWdlcyk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVkayBmcmVlZFxuIiwKKwkJCQkJKGludCkocGFnZXMgKiAoUEFHRV9TSVpFIC8gMTAyNCkpKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDcwNWE3YTkuLjAzYmQ1NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0xMDEyLDkgKzEwMTIsOSBAQAogCiBjb25maWcgTUlQU19MMV9DQUNIRV9TSElGVAogCWludAotCWRlZmF1bHQgIjQiIGlmIE1BQ0hfREVDU1RBVElPTiB8fCBNSUtST1RJS19SQjUzMgorCWRlZmF1bHQgIjQiIGlmIE1BQ0hfREVDU1RBVElPTiB8fCBNSUtST1RJS19SQjUzMiB8fCBQTUNfTVNQNDIwMF9FVkFMCisJZGVmYXVsdCAiNiIgaWYgTUlQU19DUFVfU0NBQ0hFCiAJZGVmYXVsdCAiNyIgaWYgU0dJX0lQMjIgfHwgU0dJX0lQMjcgfHwgU0dJX0lQMjggfHwgU05JX1JNIHx8IENQVV9DQVZJVU1fT0NURU9OCi0JZGVmYXVsdCAiNCIgaWYgUE1DX01TUDQyMDBfRVZBTAogCWRlZmF1bHQgIjUiCiAKIGNvbmZpZyBIQVZFX1NURF9QQ19TRVJJQUxfUE9SVApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IGM4MjViMTQuLjc3ZjUwMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTYyNywxNiArNjI3LDYgQEAKIGNmbGFncy15CQkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMKIGRyaXZlcnMtJChDT05GSUdfUENJKQkJKz0gYXJjaC9taXBzL3BjaS8KIAotaWZkZWYgQ09ORklHXzMyQklUCi1pZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KLUpJRkZJRVMJCQk9IGppZmZpZXNfNjQKLWVsc2UKLUpJRkZJRVMJCQk9IGppZmZpZXNfNjQgKyA0Ci1lbmRpZgotZWxzZQotSklGRklFUwkJCT0gamlmZmllc182NAotZW5kaWYKLQogIwogIyBBdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgYnVpbGQgZm9ybWF0LiBCeSBkZWZhdWx0IHdlIGNob29zZQogIyB0aGUgZWxmIGZvcm1hdCBhY2NvcmRpbmcgdG8gdGhlIGxvYWQgYWRkcmVzcy4KQEAgLTY2MCw4ICs2NTAsOSBAQAogZW5kaWYKIAogS0JVSUxEX0FGTEFHUwkrPSAkKGNmbGFncy15KQotS0JVSUxEX0NGTEFHUwkrPSAkKGNmbGFncy15KSBcCi0JCQktRCJWTUxJTlVYX0xPQURfQUREUkVTUz0kKGxvYWQteSkiCitLQlVJTERfQ0ZMQUdTCSs9ICQoY2ZsYWdzLXkpCitLQlVJTERfQ1BQRkxBR1MgKz0gLUQiVk1MSU5VWF9MT0FEX0FERFJFU1M9JChsb2FkLXkpIgorS0JVSUxEX0NQUEZMQUdTICs9IC1EIkRBVEFPRkZTRVQ9JChpZiAkKGRhdGFvZmZzZXQteSksJChkYXRhb2Zmc2V0LXkpLDApIgogCiBMREZMQUdTCQkJKz0gLW0gJChsZC1lbXVsKQogCkBAIC02NzYsMTggKzY2Nyw2IEBACiAKIE9CSkNPUFlGTEFHUwkJKz0gLS1yZW1vdmUtc2VjdGlvbj0ucmVnaW5mbwogCi0jCi0jIENob29zaW5nIGluY29tcGF0aWJsZSBtYWNoaW5lcyBkdXJpbmdzIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4KLSMgZXJyb3IgbWVzc2FnZXMgZHVyaW5nIGxpbmtpbmcuICBTZWxlY3QgYSBkZWZhdWx0IGxpbmtzY3JpcHQgaWYKLSMgbm9uZSBoYXMgYmVlbiBjaG9vc2VuIGFib3ZlLgotIwotCi1DUFBGTEFHU192bWxpbnV4LmxkcyA6PSBcCi0JJChLQlVJTERfQ0ZMQUdTKSBcCi0JLUQiTE9BREFERFI9JChsb2FkLXkpIiBcCi0JLUQiSklGRklFUz0kKEpJRkZJRVMpIiBcCi0JLUQiREFUQU9GRlNFVD0kKGlmICQoZGF0YW9mZnNldC15KSwkKGRhdGFvZmZzZXQteSksMCkiCi0KIGhlYWQteSA6PSBhcmNoL21pcHMva2VybmVsL2hlYWQubyBhcmNoL21pcHMva2VybmVsL2luaXRfdGFzay5vCiAKIGxpYnMteQkJCSs9IGFyY2gvbWlwcy9saWIvCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCmluZGV4IDNhYjZkODAuLjE5YzFjODIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCkBAIC0xNzUsNyArMTc1LDcgQEAKICNkZWZpbmUgREJERVZfVEFCX1NJWkUJQVJSQVlfU0laRShkYmRldl90YWIpCiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyB1MzIgYXUxeHh4X2RiZG1hX3BtX3JlZ3NbTlVNX0RCRE1BX0NIQU5TICsgMV1bOF07CitzdGF0aWMgdTMyIGF1MXh4eF9kYmRtYV9wbV9yZWdzW05VTV9EQkRNQV9DSEFOUyArIDFdWzZdOwogI2VuZGlmCiAKIApAQCAtOTkzLDE0ICs5OTMsMTMgQEAKIAlhdTF4eHhfZGJkbWFfcG1fcmVnc1swXVszXSA9IGF1X3JlYWRsKGFkZHIgKyAweDBjKTsKIAogCS8qIHNhdmUgY2hhbm5lbCBjb25maWd1cmF0aW9ucyAqLwotCWZvciAoaSA9IDEsIGFkZHIgPSBERE1BX0NIQU5ORUxfQkFTRTsgaSA8IE5VTV9EQkRNQV9DSEFOUzsgaSsrKSB7CisJZm9yIChpID0gMSwgYWRkciA9IERETUFfQ0hBTk5FTF9CQVNFOyBpIDw9IE5VTV9EQkRNQV9DSEFOUzsgaSsrKSB7CiAJCWF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzBdID0gYXVfcmVhZGwoYWRkciArIDB4MDApOwogCQlhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVsxXSA9IGF1X3JlYWRsKGFkZHIgKyAweDA0KTsKIAkJYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bMl0gPSBhdV9yZWFkbChhZGRyICsgMHgwOCk7CiAJCWF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzNdID0gYXVfcmVhZGwoYWRkciArIDB4MGMpOwogCQlhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVs0XSA9IGF1X3JlYWRsKGFkZHIgKyAweDEwKTsKIAkJYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bNV0gPSBhdV9yZWFkbChhZGRyICsgMHgxNCk7Ci0JCWF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzZdID0gYXVfcmVhZGwoYWRkciArIDB4MTgpOwogCiAJCS8qIGhhbHQgY2hhbm5lbCAqLwogCQlhdV93cml0ZWwoYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bMF0gJiB+MSwgYWRkciArIDB4MDApOwpAQCAtMTAyNywxNCArMTAyNiwxMyBAQAogCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1swXVszXSwgYWRkciArIDB4MGMpOwogCiAJLyogcmVzdG9yZSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zICovCi0JZm9yIChpID0gMSwgYWRkciA9IERETUFfQ0hBTk5FTF9CQVNFOyBpIDwgTlVNX0RCRE1BX0NIQU5TOyBpKyspIHsKKwlmb3IgKGkgPSAxLCBhZGRyID0gRERNQV9DSEFOTkVMX0JBU0U7IGkgPD0gTlVNX0RCRE1BX0NIQU5TOyBpKyspIHsKIAkJYXVfd3JpdGVsKGF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzBdLCBhZGRyICsgMHgwMCk7CiAJCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVsxXSwgYWRkciArIDB4MDQpOwogCQlhdV93cml0ZWwoYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bMl0sIGFkZHIgKyAweDA4KTsKIAkJYXVfd3JpdGVsKGF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzNdLCBhZGRyICsgMHgwYyk7CiAJCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVs0XSwgYWRkciArIDB4MTApOwogCQlhdV93cml0ZWwoYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bNV0sIGFkZHIgKyAweDE0KTsKLQkJYXVfd3JpdGVsKGF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzZdLCBhZGRyICsgMHgxOCk7CiAJCWF1X3N5bmMoKTsKIAkJYWRkciArPSAweDEwMDsJLyogbmV4dCBjaGFubmVsIGJhc2UgKi8KIAl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vaXJxLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vaXJxLmMKaW5kZXggYzg4YzgyMS4uZDY3MDkyOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2lycS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9pcnEuYwpAQCAtMzU0LDYgKzM1NCwyOCBAQAogCWF1X3N5bmMoKTsKIH0KIAorc3RhdGljIHZvaWQgYXUxeF9pYzBfbWFza2Fjayh1bnNpZ25lZCBpbnQgaXJxX25yKQoreworCXVuc2lnbmVkIGludCBiaXQgPSBpcnFfbnIgLSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7CisKKwlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9XQUtFQ0xSKTsKKwlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9NQVNLQ0xSKTsKKwlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9SSVNJTkdDTFIpOworCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0ZBTExJTkdDTFIpOworCWF1X3N5bmMoKTsKK30KKworc3RhdGljIHZvaWQgYXUxeF9pYzFfbWFza2Fjayh1bnNpZ25lZCBpbnQgaXJxX25yKQoreworCXVuc2lnbmVkIGludCBiaXQgPSBpcnFfbnIgLSBBVTEwMDBfSU5UQzFfSU5UX0JBU0U7CisKKwlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9XQUtFQ0xSKTsKKwlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9NQVNLQ0xSKTsKKwlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9SSVNJTkdDTFIpOworCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMxX0ZBTExJTkdDTFIpOworCWF1X3N5bmMoKTsKK30KKwogc3RhdGljIGludCBhdTF4X2ljMV9zZXR3YWtlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBvbikKIHsKIAl1bnNpZ25lZCBpbnQgYml0ID0gaXJxIC0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOwpAQCAtMzc5LDI1ICs0MDEsMjEgQEAKIC8qCiAgKiBpcnFfY2hpcHMgZm9yIGJvdGggSUNzOyB0aGlzIHdheSB0aGUgbWFzayBoYW5kbGVycyBjYW4gYmUKICAqIGFzIHNob3J0IGFzIHBvc3NpYmxlLgotICoKLSAqIE5PVEU6IHRoZSAtPmFjaygpIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGhhbmRsZV9lZGdlX2lycQotICoJIGZsb3doYW5kbGVyIG9ubHksIHRoZSAtPm1hc2tfYWNrKCkgb25lIGJ5IGhhbmRsZV9sZXZlbF9pcnEsCi0gKgkgc28gbm8gbmVlZCBmb3IgYW4gaXJxX2NoaXAgZm9yIGVhY2ggdHlwZSBvZiBpcnEgKGxldmVsL2VkZ2UpLgogICovCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGF1MXhfaWMwX2NoaXAgPSB7CiAJLm5hbWUJCT0gIkFsY2hlbXktSUMwIiwKLQkuYWNrCQk9IGF1MXhfaWMwX2FjaywJCS8qIGVkZ2UgKi8KKwkuYWNrCQk9IGF1MXhfaWMwX2FjaywKIAkubWFzawkJPSBhdTF4X2ljMF9tYXNrLAotCS5tYXNrX2Fjawk9IGF1MXhfaWMwX21hc2ssCS8qIGxldmVsICovCisJLm1hc2tfYWNrCT0gYXUxeF9pYzBfbWFza2FjaywKIAkudW5tYXNrCQk9IGF1MXhfaWMwX3VubWFzaywKIAkuc2V0X3R5cGUJPSBhdTF4X2ljX3NldHR5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGF1MXhfaWMxX2NoaXAgPSB7CiAJLm5hbWUJCT0gIkFsY2hlbXktSUMxIiwKLQkuYWNrCQk9IGF1MXhfaWMxX2FjaywJCS8qIGVkZ2UgKi8KKwkuYWNrCQk9IGF1MXhfaWMxX2FjaywKIAkubWFzawkJPSBhdTF4X2ljMV9tYXNrLAotCS5tYXNrX2Fjawk9IGF1MXhfaWMxX21hc2ssCS8qIGxldmVsICovCisJLm1hc2tfYWNrCT0gYXUxeF9pYzFfbWFza2FjaywKIAkudW5tYXNrCQk9IGF1MXhfaWMxX3VubWFzaywKIAkuc2V0X3R5cGUJPSBhdTF4X2ljX3NldHR5cGUsCiAJLnNldF93YWtlCT0gYXUxeF9pYzFfc2V0d2FrZSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi90aW1lLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vdGltZS5jCmluZGV4IGYzNGZmODYuLjM3OWE2NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi90aW1lLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3RpbWUuYwpAQCAtODgsNyArODgsNyBAQAogCS5pcnEJCT0gQVUxMDAwX1JUQ19NQVRDSDJfSU5ULAogCS5zZXRfbmV4dF9ldmVudAk9IGF1MXhfcnRjbWF0Y2gyX3NldF9uZXh0X2V2ZW50LAogCS5zZXRfbW9kZQk9IGF1MXhfcnRjbWF0Y2gyX3NldF9tb2RlLAotCS5jcHVtYXNrCT0gQ1BVX01BU0tfQUxMX1BUUiwKKwkuY3B1bWFzawk9IGNwdV9hbGxfbWFzaywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGF1MXhfcnRjbWF0Y2gyX2lycWFjdGlvbiA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jCmluZGV4IGNjMzJjNjkuLjQ1YjYxYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvYm9hcmRfc2V0dXAuYwpAQCAtNjksNiArNjksNyBAQAogI2Vsc2UKIAlhdV93cml0ZWwoMHhmLCBBdTE1MDBfUENJX0NGRyk7CiAjZW5kaWYKKwlib2FyZF9wY2lfaWRzZWwgPSBtdHgxX3BjaV9pZHNlbDsKICNlbmRpZgogCiAJLyogSW5pdGlhbGl6ZSBzeXNfcGluZnVuYyAqLwpAQCAtODUsOCArODYsNiBAQAogCWFsY2hlbXlfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDIxMSwgMSk7CS8qIGdyZWVuIG9uICovCiAJYWxjaGVteV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoMjEyLCAwKTsJLyogcmVkIG9mZiAqLwogCi0JYm9hcmRfcGNpX2lkc2VsID0gbXR4MV9wY2lfaWRzZWw7Ci0KIAlwcmludGsoS0VSTl9JTkZPICI0RyBTeXN0ZW1zIE1UWC0xIEJvYXJkXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FyNy9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FyNy9wbGF0Zm9ybS5jCmluZGV4IGUyMjc4YzAuLjgzNWYzZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hcjcvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvYXI3L3BsYXRmb3JtLmMKQEAgLTUwMyw2ICs1MDMsNyBAQAogewogCXUxNiBjaGlwX2lkOwogCWludCByZXM7CisJdTMyICpib290Y3IsIHZhbDsKICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKIAlzdGF0aWMgc3RydWN0IHVhcnRfcG9ydCB1YXJ0X3BvcnRbMl07CiAKQEAgLTU5NSw3ICs1OTYsMTMgQEAKIAogCWFyN193ZHRfcmVzLmVuZCA9IGFyN193ZHRfcmVzLnN0YXJ0ICsgMHgyMDsKIAotCXJlcyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXI3X3dkdCk7CisJYm9vdGNyID0gKHUzMiAqKWlvcmVtYXBfbm9jYWNoZShBUjdfUkVHU19EQ0wsIDQpOworCXZhbCA9ICpib290Y3I7CisJaW91bm1hcChib290Y3IpOworCisJLyogUmVnaXN0ZXIgd2F0Y2hkb2cgb25seSBpZiBlbmFibGVkIGluIGhhcmR3YXJlICovCisJaWYgKHZhbCAmIEFSN19XRFRfSFdfRU5BKQorCQlyZXMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmFyN193ZHQpOwogCiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9pb2Rldi5jIGIvYXJjaC9taXBzL2Jhc2xlci9leGNpdGUvZXhjaXRlX2lvZGV2LmMKaW5kZXggZGZiZmQ3ZS4uOTM4YjFkMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Jhc2xlci9leGNpdGUvZXhjaXRlX2lvZGV2LmMKKysrIGIvYXJjaC9taXBzL2Jhc2xlci9leGNpdGUvZXhjaXRlX2lvZGV2LmMKQEAgLTExMiwxMCArMTEyLDggQEAKIHsKIAlpbnQgcmV0OwogCi0JbG9ja19rZXJuZWwoKTsKIAlyZXQgPSByZXF1ZXN0X2lycShpb2Rldl9pcnEsIGlvZGV2X2lycWhkbCwgSVJRRl9ESVNBQkxFRCwKIAkJCSAgIGlvZGV2X25hbWUsICZtaXNjZGV2KTsKLQl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvTWFrZWZpbGUgYi9hcmNoL21pcHMvYmNtNjN4eC9NYWtlZmlsZQppbmRleCBhYWE1ODVjLi4wMDA2NGI2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNjN4eC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvYmNtNjN4eC9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIG9iai15CQkrPSBjbGsubyBjcHUubyBjcy5vIGdwaW8ubyBpcnEubyBwcm9tLm8gc2V0dXAubyB0aW1lci5vIFwKLQkJICAgZGV2LWRzcC5vIGRldi1lbmV0Lm8KKwkJICAgZGV2LWRzcC5vIGRldi1lbmV0Lm8gZGV2LXBjbWNpYS5vIGRldi11YXJ0Lm8gZGV2LXdkdC5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogCiBvYmoteQkJKz0gYm9hcmRzLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvYm9hcmRzL2JvYXJkX2JjbTk2M3h4LmMgYi9hcmNoL21pcHMvYmNtNjN4eC9ib2FyZHMvYm9hcmRfYmNtOTYzeHguYwppbmRleCBmZDc3ZjU0Li4wNWEzNWNmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNjN4eC9ib2FyZHMvYm9hcmRfYmNtOTYzeHguYworKysgYi9hcmNoL21pcHMvYmNtNjN4eC9ib2FyZHMvYm9hcmRfYmNtOTYzeHguYwpAQCAtMjAsMTAgKzIwLDEwIEBACiAjaW5jbHVkZSA8YmNtNjN4eF9jcHUuaD4KICNpbmNsdWRlIDxiY202M3h4X3JlZ3MuaD4KICNpbmNsdWRlIDxiY202M3h4X2lvLmg+Ci0jaW5jbHVkZSA8YmNtNjN4eF9ib2FyZC5oPgogI2luY2x1ZGUgPGJjbTYzeHhfZGV2X3BjaS5oPgogI2luY2x1ZGUgPGJjbTYzeHhfZGV2X2VuZXQuaD4KICNpbmNsdWRlIDxiY202M3h4X2Rldl9kc3AuaD4KKyNpbmNsdWRlIDxiY202M3h4X2Rldl9wY21jaWEuaD4KICNpbmNsdWRlIDxib2FyZF9iY205NjN4eC5oPgogCiAjZGVmaW5lIFBGWAkiYm9hcmRfYmNtOTYzeHg6ICIKQEAgLTc5Myw2ICs3OTMsOSBAQAogewogCXUzMiB2YWw7CiAKKwlpZiAoYm9hcmQuaGFzX3BjY2FyZCkKKwkJYmNtNjN4eF9wY21jaWFfcmVnaXN0ZXIoKTsKKwogCWlmIChib2FyZC5oYXNfZW5ldDAgJiYKIAkgICAgIWJvYXJkX2dldF9tYWNfYWRkcmVzcyhib2FyZC5lbmV0MC5tYWNfYWRkcikpCiAJCWJjbTYzeHhfZW5ldF9yZWdpc3RlcigwLCAmYm9hcmQuZW5ldDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTYzeHgvY3B1LmMgYi9hcmNoL21pcHMvYmNtNjN4eC9jcHUuYwppbmRleCA2ZGM0M2YwLi43MDM3OGJiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNjN4eC9jcHUuYworKysgYi9hcmNoL21pcHMvYmNtNjN4eC9jcHUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGFzbS9jcHUtaW5mby5oPgogI2luY2x1ZGUgPGJjbTYzeHhfY3B1Lmg+CiAjaW5jbHVkZSA8YmNtNjN4eF9yZWdzLmg+CiAjaW5jbHVkZSA8YmNtNjN4eF9pby5oPgpAQCAtMjg0LDYgKzI4NSw3IEBACiB7CiAJdW5zaWduZWQgaW50IHRtcCwgZXhwZWN0ZWRfY3B1X2lkOwogCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJLyogc29jIHJlZ2lzdGVycyBsb2NhdGlvbiBkZXBlbmRzIG9uIGNwdSB0eXBlICovCiAJZXhwZWN0ZWRfY3B1X2lkID0gMDsKQEAgLTI5Myw2ICsyOTUsNyBAQAogCSAqIEJDTTYzMzggYXMgdGhlIHNhbWUgUHJJZCBhcyBCQ00zMzAyIHNlZSBhcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCiAJICovCiAJY2FzZSBDUFVfQkNNMzMwMjoKKwkJX19jcHVfbmFtZVtjcHVdID0gIkJyb2FkY29tIEJDTTYzMzgiOwogCQlleHBlY3RlZF9jcHVfaWQgPSBCQ002MzM4X0NQVV9JRDsKIAkJYmNtNjN4eF9yZWdzX2Jhc2UgPSBiY205NjMzOF9yZWdzX2Jhc2U7CiAJCWJjbTYzeHhfaXJxcyA9IGJjbTk2MzM4X2lycXM7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNjN4eC9kZXYtcGNtY2lhLmMgYi9hcmNoL21pcHMvYmNtNjN4eC9kZXYtcGNtY2lhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZDkxNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9iY202M3h4L2Rldi1wY21jaWEuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXhpbWUgQml6b24gPG1iaXpvbkBmcmVlYm94LmZyPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YmNtNjN4eF9jcy5oPgorI2luY2x1ZGUgPGJjbTYzeHhfY3B1Lmg+CisjaW5jbHVkZSA8YmNtNjN4eF9kZXZfcGNtY2lhLmg+CisjaW5jbHVkZSA8YmNtNjN4eF9pby5oPgorI2luY2x1ZGUgPGJjbTYzeHhfcmVncy5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBjbWNpYV9yZXNvdXJjZXNbXSA9IHsKKwkvKiBwY21jaWEgcmVnaXN0ZXJzICovCisJeworCQkvKiBzdGFydCAmIGVuZCBmaWxsZWQgYXQgcnVudGltZSAqLworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKworCS8qIHBjbWNpYSBtZW1vcnkgem9uZSByZXNvdXJjZXMgKi8KKwl7CisJCS5zdGFydAkJPSBCQ01fUENNQ0lBX0NPTU1PTl9CQVNFX1BBLAorCQkuZW5kCQk9IEJDTV9QQ01DSUFfQ09NTU9OX0VORF9QQSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJCT0gQkNNX1BDTUNJQV9BVFRSX0JBU0VfUEEsCisJCS5lbmQJCT0gQkNNX1BDTUNJQV9BVFRSX0VORF9QQSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJCT0gQkNNX1BDTUNJQV9JT19CQVNFX1BBLAorCQkuZW5kCQk9IEJDTV9QQ01DSUFfSU9fRU5EX1BBLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKworCS8qIFBDTUNJQSBpcnEgKi8KKwl7CisJCS8qIHN0YXJ0IGZpbGxlZCBhdCBydW50aW1lICovCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCisJLyogZGVjbGFyZSBQQ01DSUEgSU8gcmVzb3VyY2UgYWxzbyAqLworCXsKKwkJLnN0YXJ0CQk9IEJDTV9QQ01DSUFfSU9fQkFTRV9QQSwKKwkJLmVuZAkJPSBCQ01fUENNQ0lBX0lPX0VORF9QQSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSU8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmNtNjN4eF9wY21jaWFfcGxhdGZvcm1fZGF0YSBwZDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmNtNjN4eF9wY21jaWFfZGV2aWNlID0geworCS5uYW1lCQk9ICJiY202M3h4X3BjbWNpYSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHBjbWNpYV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHBjbWNpYV9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnBkLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjb25maWdfcGNtY2lhX2NzKHVuc2lnbmVkIGludCBjcywKKwkJCQkgICB1MzIgYmFzZSwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IHJldDsKKworCXJldCA9IGJjbTYzeHhfc2V0X2NzX3N0YXR1cyhjcywgMCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGJjbTYzeHhfc2V0X2NzX2Jhc2UoY3MsIGJhc2UsIHNpemUpOworCWlmICghcmV0KQorCQlyZXQgPSBiY202M3h4X3NldF9jc19zdGF0dXMoY3MsIDEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBfX2luaXRkYXRhIHN0cnVjdCB7CisJdW5zaWduZWQgaW50CWNzOworCXVuc2lnbmVkIGludAliYXNlOworCXVuc2lnbmVkIGludAlzaXplOworfSBwY21jaWFfY3NbM10gPSB7CisJeworCQkuY3MJPSBNUElfQ1NfUENNQ0lBX0NPTU1PTiwKKwkJLmJhc2UJPSBCQ01fUENNQ0lBX0NPTU1PTl9CQVNFX1BBLAorCQkuc2l6ZQk9IEJDTV9QQ01DSUFfQ09NTU9OX1NJWkUKKwl9LAorCXsKKwkJLmNzCT0gTVBJX0NTX1BDTUNJQV9BVFRSLAorCQkuYmFzZQk9IEJDTV9QQ01DSUFfQVRUUl9CQVNFX1BBLAorCQkuc2l6ZQk9IEJDTV9QQ01DSUFfQVRUUl9TSVpFCisJfSwKKwl7CisJCS5jcwk9IE1QSV9DU19QQ01DSUFfSU8sCisJCS5iYXNlCT0gQkNNX1BDTUNJQV9JT19CQVNFX1BBLAorCQkuc2l6ZQk9IEJDTV9QQ01DSUFfSU9fU0laRQorCX0sCit9OworCitpbnQgX19pbml0IGJjbTYzeHhfcGNtY2lhX3JlZ2lzdGVyKHZvaWQpCit7CisJaW50IHJldCwgaTsKKworCWlmICghQkNNQ1BVX0lTXzYzNDgoKSAmJiAhQkNNQ1BVX0lTXzYzNTgoKSkKKwkJcmV0dXJuIDA7CisKKwkvKiB1c2UgY29ycmVjdCBwY21jaWEgcmVhZHkgZ3BpbyBkZXBlbmRpbmcgb24gcHJvY2Vzc29yICovCisJc3dpdGNoIChiY202M3h4X2dldF9jcHVfaWQoKSkgeworCWNhc2UgQkNNNjM0OF9DUFVfSUQ6CisJCXBkLnJlYWR5X2dwaW8gPSAyMjsKKwkJYnJlYWs7CisKKwljYXNlIEJDTTYzNThfQ1BVX0lEOgorCQlwZC5yZWFkeV9ncGlvID0gMTg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNtY2lhX3Jlc291cmNlc1swXS5zdGFydCA9IGJjbTYzeHhfcmVnc2V0X2FkZHJlc3MoUlNFVF9QQ01DSUEpOworCXBjbWNpYV9yZXNvdXJjZXNbMF0uZW5kID0gcGNtY2lhX3Jlc291cmNlc1swXS5zdGFydCArCisJCVJTRVRfUENNQ0lBX1NJWkUgLSAxOworCXBjbWNpYV9yZXNvdXJjZXNbNF0uc3RhcnQgPSBiY202M3h4X2dldF9pcnFfbnVtYmVyKElSUV9QQ01DSUEpOworCisJLyogY29uZmlndXJlIHBjbWNpYSBjaGlwIHNlbGVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJldCA9IGNvbmZpZ19wY21jaWFfY3MocGNtY2lhX2NzW2ldLmNzLAorCQkJCSAgICAgICBwY21jaWFfY3NbaV0uYmFzZSwKKwkJCQkgICAgICAgcGNtY2lhX2NzW2ldLnNpemUpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCX0KKworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmJjbTYzeHhfcGNtY2lhX2RldmljZSk7CisKK291dF9lcnI6CisJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gc2V0IHBjbWNpYSBjaGlwIHNlbGVjdFxuIik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY202M3h4L2Rldi11YXJ0LmMgYi9hcmNoL21pcHMvYmNtNjN4eC9kZXYtdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTE5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvYmNtNjN4eC9kZXYtdWFydC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWF4aW1lIEJpem9uIDxtYml6b25AZnJlZWJveC5mcj4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGJjbTYzeHhfY3B1Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSAtMSwgLyogZmlsbGVkIGF0IHJ1bnRpbWUgKi8KKwkJLmVuZAkJPSAtMSwgLyogZmlsbGVkIGF0IHJ1bnRpbWUgKi8KKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJCT0gLTEsIC8qIGZpbGxlZCBhdCBydW50aW1lICovCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmNtNjN4eF91YXJ0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiYmNtNjN4eF91YXJ0IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVhcnRfcmVzb3VyY2VzLAorfTsKKworaW50IF9faW5pdCBiY202M3h4X3VhcnRfcmVnaXN0ZXIodm9pZCkKK3sKKwl1YXJ0X3Jlc291cmNlc1swXS5zdGFydCA9IGJjbTYzeHhfcmVnc2V0X2FkZHJlc3MoUlNFVF9VQVJUMCk7CisJdWFydF9yZXNvdXJjZXNbMF0uZW5kID0gdWFydF9yZXNvdXJjZXNbMF0uc3RhcnQ7CisJdWFydF9yZXNvdXJjZXNbMF0uZW5kICs9IFJTRVRfVUFSVF9TSVpFIC0gMTsKKwl1YXJ0X3Jlc291cmNlc1sxXS5zdGFydCA9IGJjbTYzeHhfZ2V0X2lycV9udW1iZXIoSVJRX1VBUlQwKTsKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZiY202M3h4X3VhcnRfZGV2aWNlKTsKK30KK2FyY2hfaW5pdGNhbGwoYmNtNjN4eF91YXJ0X3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY202M3h4L2Rldi13ZHQuYyBiL2FyY2gvbWlwcy9iY202M3h4L2Rldi13ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTZjNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2JjbTYzeHgvZGV2LXdkdC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRmxvcmlhbiBGYWluZWxsaSA8ZmxvcmlhbkBvcGVud3J0Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGJjbTYzeHhfY3B1Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugd2R0X3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IC0xLCAvKiBmaWxsZWQgYXQgcnVudGltZSAqLworCQkuZW5kCQk9IC0xLCAvKiBmaWxsZWQgYXQgcnVudGltZSAqLworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJjbTYzeHhfd2R0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiYmNtNjN4eC13ZHQiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh3ZHRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB3ZHRfcmVzb3VyY2VzLAorfTsKKworaW50IF9faW5pdCBiY202M3h4X3dkdF9yZWdpc3Rlcih2b2lkKQoreworCXdkdF9yZXNvdXJjZXNbMF0uc3RhcnQgPSBiY202M3h4X3JlZ3NldF9hZGRyZXNzKFJTRVRfV0RUKTsKKwl3ZHRfcmVzb3VyY2VzWzBdLmVuZCA9IHdkdF9yZXNvdXJjZXNbMF0uc3RhcnQ7CisJd2R0X3Jlc291cmNlc1swXS5lbmQgKz0gUlNFVF9XRFRfU0laRSAtIDE7CisKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZiY202M3h4X3dkdF9kZXZpY2UpOworfQorYXJjaF9pbml0Y2FsbChiY202M3h4X3dkdF9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNjN4eC9zZXR1cC5jIGIvYXJjaC9taXBzL2JjbTYzeHgvc2V0dXAuYwppbmRleCBiMThhMGNhLi5kMDA1NjU5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNjN4eC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9iY202M3h4L3NldHVwLmMKQEAgLTc1LDcgKzc1LDkgQEAKIAkJYmNtNjM0OF9hMV9yZWJvb3QoKTsKIAogCXByaW50ayhLRVJOX0lORk8gInRyaWdnZXJpbmcgd2F0Y2hkb2cgc29mdC1yZXNldC4uLlxuIik7Ci0JYmNtX3BlcmZfd3JpdGVsKFNZU19QTExfU09GVF9SRVNFVCwgUEVSRl9TWVNfUExMX0NUTF9SRUcpOworCXJlZyA9IGJjbV9wZXJmX3JlYWRsKFBFUkZfU1lTX1BMTF9DVExfUkVHKTsKKwlyZWcgfD0gU1lTX1BMTF9TT0ZUX1JFU0VUOworCWJjbV9wZXJmX3dyaXRlbChyZWcsIFBFUkZfU1lTX1BMTF9DVExfUkVHKTsKIAl3aGlsZSAoMSkKIAkJOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCmluZGV4IDM4NGYxODQuLjZmMmFjZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKQEAgLTE3LDYgKzE3LDE1IEBACiBERUZJTkVfUldMT0NLKG9jdGVvbl9pcnFfY2l1MV9yd2xvY2spOwogREVGSU5FX1NQSU5MT0NLKG9jdGVvbl9pcnFfbXNpX2xvY2spOwogCitzdGF0aWMgaW50IG9jdGVvbl9jb3JlaWRfZm9yX2NwdShpbnQgY3B1KQoreworI2lmZGVmIENPTkZJR19TTVAKKwlyZXR1cm4gY3B1X2xvZ2ljYWxfbWFwKGNwdSk7CisjZWxzZQorCXJldHVybiBjdm14X2dldF9jb3JlX251bSgpOworI2VuZGlmCit9CisKIHN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY29yZV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9TVzA7CkBAIC0xNTIsMTEgKzE2MSwxMCBAQAogCWludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1dPUktRMDsJLyogQml0IDAtNjMgb2YgRU4wICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1aW50NjRfdCBlbjA7Ci0jaWZkZWYgQ09ORklHX1NNUAogCWludCBjcHU7CiAJd3JpdGVfbG9ja19pcnFzYXZlKCZvY3Rlb25faXJxX2NpdTBfcndsb2NrLCBmbGFncyk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaW50IGNvcmVpZCA9IGNwdV9sb2dpY2FsX21hcChjcHUpOworCQlpbnQgY29yZWlkID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSk7CiAJCWVuMCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoY29yZWlkICogMikpOwogCQllbjAgJj0gfigxdWxsIDw8IGJpdCk7CiAJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpLCBlbjApOwpAQCAtMTY3LDI2ICsxNzUsNTcgQEAKIAkgKi8KIAljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyKSk7CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm9jdGVvbl9pcnFfY2l1MF9yd2xvY2ssIGZsYWdzKTsKLSNlbHNlCi0JaW50IGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWVuMCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoY29yZWlkICogMikpOwotCWVuMCAmPSB+KDF1bGwgPDwgYml0KTsKLQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjb3JlaWQgKiAyKSwgZW4wKTsKLQljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0jZW5kaWYKK30KKworLyoKKyAqIEVuYWJsZSB0aGUgaXJxIG9uIHRoZSBjdXJyZW50IGNvcmUgZm9yIGNoaXBzIHRoYXQgaGF2ZSB0aGUgRU4qX1cxe1MsQ30KKyAqIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jaXUwX2VuYWJsZV92Mih1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBpbmRleCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyOworCXU2NCBtYXNrID0gMXVsbCA8PCAoaXJxIC0gT0NURU9OX0lSUV9XT1JLUTApOworCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjBfVzFTKGluZGV4KSwgbWFzayk7Cit9CisKKy8qCisgKiBEaXNhYmxlIHRoZSBpcnEgb24gdGhlIGN1cnJlbnQgY29yZSBmb3IgY2hpcHMgdGhhdCBoYXZlIHRoZSBFTipfVzF7UyxDfQorICogcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfZGlzYWJsZV92Mih1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBpbmRleCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyOworCXU2NCBtYXNrID0gMXVsbCA8PCAoaXJxIC0gT0NURU9OX0lSUV9XT1JLUTApOworCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjBfVzFDKGluZGV4KSwgbWFzayk7Cit9CisKKy8qCisgKiBEaXNhYmxlIHRoZSBpcnEgb24gdGhlIGFsbCBjb3JlcyBmb3IgY2hpcHMgdGhhdCBoYXZlIHRoZSBFTipfVzF7UyxDfQorICogcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfZGlzYWJsZV9hbGxfdjIodW5zaWduZWQgaW50IGlycSkKK3sKKwl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV09SS1EwKTsKKwlpbnQgaW5kZXg7CisJaW50IGNwdTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpbmRleCA9IG9jdGVvbl9jb3JlaWRfZm9yX2NwdShjcHUpICogMjsKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjBfVzFDKGluZGV4KSwgbWFzayk7CisJfQogfQogCiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIGludCBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQogewogCWludCBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9XT1JLUTA7CS8qIEJpdCAwLTYzIG9mIEVOMCAqLwogCi0Jd3JpdGVfbG9jaygmb2N0ZW9uX2lycV9jaXUwX3J3bG9jayk7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZvY3Rlb25faXJxX2NpdTBfcndsb2NrLCBmbGFncyk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaW50IGNvcmVpZCA9IGNwdV9sb2dpY2FsX21hcChjcHUpOworCQlpbnQgY29yZWlkID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSk7CiAJCXVpbnQ2NF90IGVuMCA9CiAJCQljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpKTsKIAkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBkZXN0KSkKQEAgLTIwMCwxMiArMjM5LDQ2IEBACiAJICogb2YgdGhlbSBhcmUgZG9uZS4KIAkgKi8KIAljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyKSk7Ci0Jd3JpdGVfdW5sb2NrKCZvY3Rlb25faXJxX2NpdTBfcndsb2NrKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmb2N0ZW9uX2lycV9jaXUwX3J3bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CisKKy8qCisgKiBTZXQgYWZmaW5pdHkgZm9yIHRoZSBpcnEgZm9yIGNoaXBzIHRoYXQgaGF2ZSB0aGUgRU4qX1cxe1MsQ30KKyAqIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5X3YyKHVuc2lnbmVkIGludCBpcnEsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQoreworCWludCBjcHU7CisJaW50IGluZGV4OworCXU2NCBtYXNrID0gMXVsbCA8PCAoaXJxIC0gT0NURU9OX0lSUV9XT1JLUTApOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWluZGV4ID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSkgKiAyOworCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIGRlc3QpKQorCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjBfVzFTKGluZGV4KSwgbWFzayk7CisJCWVsc2UKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wX1cxQyhpbmRleCksIG1hc2spOworCX0KKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCisvKgorICogTmV3ZXIgb2N0ZW9uIGNoaXBzIGhhdmUgc3VwcG9ydCBmb3IgbG9ja2xlc3MgQ0lVIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBvY3Rlb25faXJxX2NoaXBfY2l1MF92MiA9IHsKKwkubmFtZSA9ICJDSVUwIiwKKwkuZW5hYmxlID0gb2N0ZW9uX2lycV9jaXUwX2VuYWJsZV92MiwKKwkuZGlzYWJsZSA9IG9jdGVvbl9pcnFfY2l1MF9kaXNhYmxlX2FsbF92MiwKKwkuYWNrID0gb2N0ZW9uX2lycV9jaXUwX2Rpc2FibGVfdjIsCisJLmVvaSA9IG9jdGVvbl9pcnFfY2l1MF9lbmFibGVfdjIsCisjaWZkZWYgQ09ORklHX1NNUAorCS5zZXRfYWZmaW5pdHkgPSBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5X3YyLAorI2VuZGlmCit9OworCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIG9jdGVvbl9pcnFfY2hpcF9jaXUwID0gewogCS5uYW1lID0gIkNJVTAiLAogCS5lbmFibGUgPSBvY3Rlb25faXJxX2NpdTBfZW5hYmxlLApAQCAtMjY5LDExICszNDIsMTAgQEAKIAlpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9XRE9HMDsJLyogQml0IDAtNjMgb2YgRU4xICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1aW50NjRfdCBlbjE7Ci0jaWZkZWYgQ09ORklHX1NNUAogCWludCBjcHU7CiAJd3JpdGVfbG9ja19pcnFzYXZlKCZvY3Rlb25faXJxX2NpdTFfcndsb2NrLCBmbGFncyk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaW50IGNvcmVpZCA9IGNwdV9sb2dpY2FsX21hcChjcHUpOworCQlpbnQgY29yZWlkID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSk7CiAJCWVuMSA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpKTsKIAkJZW4xICY9IH4oMXVsbCA8PCBiaXQpOwogCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMShjb3JlaWQgKiAyICsgMSksIGVuMSk7CkBAIC0yODQsMjYgKzM1Niw1OCBAQAogCSAqLwogCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY3ZteF9nZXRfY29yZV9udW0oKSAqIDIgKyAxKSk7CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm9jdGVvbl9pcnFfY2l1MV9yd2xvY2ssIGZsYWdzKTsKLSNlbHNlCi0JaW50IGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWVuMSA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpKTsKLQllbjEgJj0gfigxdWxsIDw8IGJpdCk7Ci0JY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpLCBlbjEpOwotCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0jZW5kaWYKK30KKworLyoKKyAqIEVuYWJsZSB0aGUgaXJxIG9uIHRoZSBjdXJyZW50IGNvcmUgZm9yIGNoaXBzIHRoYXQgaGF2ZSB0aGUgRU4qX1cxe1MsQ30KKyAqIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jaXUxX2VuYWJsZV92Mih1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBpbmRleCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyICsgMTsKKwl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV0RPRzApOworCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjFfVzFTKGluZGV4KSwgbWFzayk7Cit9CisKKy8qCisgKiBEaXNhYmxlIHRoZSBpcnEgb24gdGhlIGN1cnJlbnQgY29yZSBmb3IgY2hpcHMgdGhhdCBoYXZlIHRoZSBFTipfVzF7UyxDfQorICogcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfZGlzYWJsZV92Mih1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBpbmRleCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyICsgMTsKKwl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV0RPRzApOworCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjFfVzFDKGluZGV4KSwgbWFzayk7Cit9CisKKy8qCisgKiBEaXNhYmxlIHRoZSBpcnEgb24gdGhlIGFsbCBjb3JlcyBmb3IgY2hpcHMgdGhhdCBoYXZlIHRoZSBFTipfVzF7UyxDfQorICogcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfZGlzYWJsZV9hbGxfdjIodW5zaWduZWQgaW50IGlycSkKK3sKKwl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV0RPRzApOworCWludCBpbmRleDsKKwlpbnQgY3B1OworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWluZGV4ID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSkgKiAyICsgMTsKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjFfVzFDKGluZGV4KSwgbWFzayk7CisJfQogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIGludCBvY3Rlb25faXJxX2NpdTFfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQorc3RhdGljIGludCBvY3Rlb25faXJxX2NpdTFfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsCisJCQkJCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQogewogCWludCBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9XRE9HMDsJLyogQml0IDAtNjMgb2YgRU4xICovCiAKLQl3cml0ZV9sb2NrKCZvY3Rlb25faXJxX2NpdTFfcndsb2NrKTsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJm9jdGVvbl9pcnFfY2l1MV9yd2xvY2ssIGZsYWdzKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlpbnQgY29yZWlkID0gY3B1X2xvZ2ljYWxfbWFwKGNwdSk7CisJCWludCBjb3JlaWQgPSBvY3Rlb25fY29yZWlkX2Zvcl9jcHUoY3B1KTsKIAkJdWludDY0X3QgZW4xID0KIAkJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEKIAkJCQkoY29yZWlkICogMiArIDEpKTsKQEAgLTMxOCwxMiArNDIyLDQ2IEBACiAJICogb2YgdGhlbSBhcmUgZG9uZS4KIAkgKi8KIAljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4xKGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyICsgMSkpOwotCXdyaXRlX3VubG9jaygmb2N0ZW9uX2lycV9jaXUxX3J3bG9jayk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm9jdGVvbl9pcnFfY2l1MV9yd2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQorCisvKgorICogU2V0IGFmZmluaXR5IGZvciB0aGUgaXJxIGZvciBjaGlwcyB0aGF0IGhhdmUgdGhlIEVOKl9XMXtTLEN9CisgKiByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgb2N0ZW9uX2lycV9jaXUxX3NldF9hZmZpbml0eV92Mih1bnNpZ25lZCBpbnQgaXJxLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCkKK3sKKwlpbnQgY3B1OworCWludCBpbmRleDsKKwl1NjQgbWFzayA9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfV0RPRzApOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWluZGV4ID0gb2N0ZW9uX2NvcmVpZF9mb3JfY3B1KGNwdSkgKiAyICsgMTsKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBkZXN0KSkKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4xX1cxUyhpbmRleCksIG1hc2spOworCQllbHNlCisJCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMV9XMUMoaW5kZXgpLCBtYXNrKTsKKwl9CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAorLyoKKyAqIE5ld2VyIG9jdGVvbiBjaGlwcyBoYXZlIHN1cHBvcnQgZm9yIGxvY2tsZXNzIENJVSBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgb2N0ZW9uX2lycV9jaGlwX2NpdTFfdjIgPSB7CisJLm5hbWUgPSAiQ0lVMCIsCisJLmVuYWJsZSA9IG9jdGVvbl9pcnFfY2l1MV9lbmFibGVfdjIsCisJLmRpc2FibGUgPSBvY3Rlb25faXJxX2NpdTFfZGlzYWJsZV9hbGxfdjIsCisJLmFjayA9IG9jdGVvbl9pcnFfY2l1MV9kaXNhYmxlX3YyLAorCS5lb2kgPSBvY3Rlb25faXJxX2NpdTFfZW5hYmxlX3YyLAorI2lmZGVmIENPTkZJR19TTVAKKwkuc2V0X2FmZmluaXR5ID0gb2N0ZW9uX2lycV9jaXUxX3NldF9hZmZpbml0eV92MiwKKyNlbmRpZgorfTsKKwogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBvY3Rlb25faXJxX2NoaXBfY2l1MSA9IHsKIAkubmFtZSA9ICJDSVUxIiwKIAkuZW5hYmxlID0gb2N0ZW9uX2lycV9jaXUxX2VuYWJsZSwKQEAgLTQyMCw2ICs1NTgsOCBAQAogdm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQogewogCWludCBpcnE7CisJc3RydWN0IGlycV9jaGlwICpjaGlwMDsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAxOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIFNldCB0aGUgZGVmYXVsdCBhZmZpbml0eSB0byB0aGUgYm9vdCBjcHUuICovCkBAIC00MzAsNiArNTcwLDE2IEBACiAJaWYgKE5SX0lSUVMgPCBPQ1RFT05fSVJRX0xBU1QpCiAJCXByX2Vycigib2N0ZW9uX2lycV9pbml0OiBOUl9JUlFTIGlzIHNldCB0b28gbG93XG4iKTsKIAorCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONThYWF9QQVNTMl9YKSB8fAorCSAgICBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONTZYWF9QQVNTMl9YKSB8fAorCSAgICBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONTJYWF9QQVNTMl9YKSkgeworCQljaGlwMCA9ICZvY3Rlb25faXJxX2NoaXBfY2l1MF92MjsKKwkJY2hpcDEgPSAmb2N0ZW9uX2lycV9jaGlwX2NpdTFfdjI7CisJfSBlbHNlIHsKKwkJY2hpcDAgPSAmb2N0ZW9uX2lycV9jaGlwX2NpdTA7CisJCWNoaXAxID0gJm9jdGVvbl9pcnFfY2hpcF9jaXUxOworCX0KKwogCS8qIDAgLSAxNSByZXNlcnZlZCBmb3IgaTgyNTkgbWFzdGVyIGFuZCBzbGF2ZSBjb250cm9sbGVyLiAqLwogCiAJLyogMTcgLSAyMyBNaXBzIGludGVybmFsICovCkBAIC00NDAsMTQgKzU5MCwxMiBAQAogCiAJLyogMjQgLSA4NyBDSVVfSU5UX1NVTTAgKi8KIAlmb3IgKGlycSA9IE9DVEVPTl9JUlFfV09SS1EwOyBpcnEgPD0gT0NURU9OX0lSUV9CT09URE1BOyBpcnErKykgewotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmb2N0ZW9uX2lycV9jaGlwX2NpdTAsCi0JCQkJCSBoYW5kbGVfcGVyY3B1X2lycSk7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsIGNoaXAwLCBoYW5kbGVfcGVyY3B1X2lycSk7CiAJfQogCiAJLyogODggLSAxNTEgQ0lVX0lOVF9TVU0xICovCiAJZm9yIChpcnEgPSBPQ1RFT05fSVJRX1dET0cwOyBpcnEgPD0gT0NURU9OX0lSUV9SRVNFUlZFRDE1MTsgaXJxKyspIHsKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJm9jdGVvbl9pcnFfY2hpcF9jaXUxLAotCQkJCQkgaGFuZGxlX3BlcmNwdV9pcnEpOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBjaGlwMSwgaGFuZGxlX3BlcmNwdV9pcnEpOwogCX0KIAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCkBAIC01MDUsMTQgKzY1MywxMCBAQAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIGludCBpc19pcnFfZW5hYmxlZF9vbl9jcHUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNwdSkKIHsKLSAgICAgICB1bnNpZ25lZCBpbnQgaXNzZXQ7Ci0jaWZkZWYgQ09ORklHX1NNUAotICAgICAgIGludCBjb3JlaWQgPSBjcHVfbG9naWNhbF9tYXAoY3B1KTsKLSNlbHNlCi0JaW50IGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7Ci0jZW5kaWYKKwl1bnNpZ25lZCBpbnQgaXNzZXQ7CisJaW50IGNvcmVpZCA9IG9jdGVvbl9jb3JlaWRfZm9yX2NwdShjcHUpOwogCWludCBiaXQgPSAoaXJxIDwgT0NURU9OX0lSUV9XRE9HMCkgPwotCQlpcnEgLSBPQ1RFT05fSVJRX1dPUktRMCA6IGlycSAtIE9DVEVPTl9JUlFfV0RPRzA7CisJCSAgIGlycSAtIE9DVEVPTl9JUlFfV09SS1EwIDogaXJxIC0gT0NURU9OX0lSUV9XRE9HMDsKICAgICAgICBpZiAoaXJxIDwgNjQpIHsKIAkJaXNzZXQgPSAoY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjb3JlaWQgKiAyKSkgJgogCQkJKDF1bGwgPDwgYml0KSkgPj4gYml0OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc21wLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYwppbmRleCAzMmQ1MWEzLi5jMTk4ZWZkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYwpAQCAtNjUsMTEgKzY1LDEyIEBACiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfTUJPWF9TRVRYKGNvcmVpZCksIGFjdGlvbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBvY3Rlb25fc2VuZF9pcGlfbWFzayhjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBvY3Rlb25fc2VuZF9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywKKwkJCQkJdW5zaWduZWQgaW50IGFjdGlvbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvcl9lYWNoX2NwdV9tYXNrKGksIG1hc2spCisJZm9yX2VhY2hfY3B1X21hc2soaSwgKm1hc2spCiAJCW9jdGVvbl9zZW5kX2lwaV9zaW5nbGUoaSwgYWN0aW9uKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZpeG1hcC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmluZGV4IGVmZWRkYzguLjBiODliODMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9maXhtYXAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZml4bWFwLmgKQEAgLTQ4LDkgKzQ4LDkgQEAKICNkZWZpbmUgRklYX05fQ09MT1VSUyA4CiAJRklYX0NNQVBfQkVHSU4sCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCUZJWF9DTUFQX0VORCA9IEZJWF9DTUFQX0JFR0lOICsgKEZJWF9OX0NPTE9VUlMgKiBOUl9DUFVTKSwKKwlGSVhfQ01BUF9FTkQgPSBGSVhfQ01BUF9CRUdJTiArIChGSVhfTl9DT0xPVVJTICogTlJfQ1BVUyAqIDIpLAogI2Vsc2UKLQlGSVhfQ01BUF9FTkQgPSBGSVhfQ01BUF9CRUdJTiArIEZJWF9OX0NPTE9VUlMsCisJRklYX0NNQVBfRU5EID0gRklYX0NNQVBfQkVHSU4gKyAoRklYX05fQ09MT1VSUyAqIDIpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAkvKiByZXNlcnZlZCBwdGUncyBmb3IgdGVtcG9yYXJ5IGtlcm5lbCBtYXBwaW5ncyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2djbXByZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2NtcHJlZ3MuaAppbmRleCAzNmZkOTY5Li5jMGNmNzZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2NtcHJlZ3MuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2NtcHJlZ3MuaApAQCAtMTksMTUgKzE5LDIwIEBACiAjZGVmaW5lIEdDTVBfR0RCX09GUwkJMHg4MDAwIC8qIEdsb2JhbCBEZWJ1ZyBCbG9jayAqLwogCiAvKiBPZmZzZXRzIHRvIGluZGl2aWR1YWwgR0NNUCByZWdpc3RlcnMgZnJvbSBHQ01QIGJhc2UgKi8KLSNkZWZpbmUgR0NNUE9GUyhibG9jaywgdGFnLCByZWcpCShHQ01QXyMjYmxvY2sjI19PRlMgKyBHQ01QXyMjdGFnIyNfIyNyZWcjI19PRlMpCisjZGVmaW5lIEdDTVBPRlMoYmxvY2ssIHRhZywgcmVnKQlcCisJKEdDTVBfIyNibG9jayMjX09GUyArIEdDTVBfIyN0YWcjI18jI3JlZyMjX09GUykKKyNkZWZpbmUgR0NNUE9GU24oYmxvY2ssIHRhZywgcmVnLCBuKSBcCisJKEdDTVBfIyNibG9jayMjX09GUyArIEdDTVBfIyN0YWcjI18jI3JlZyMjX09GUyhuKSkKIAogI2RlZmluZSBHQ01QR0NCT0ZTKHJlZykJCUdDTVBPRlMoR0NCLCBHQ0IsIHJlZykKKyNkZWZpbmUgR0NNUEdDQk9GU24ocmVnLCBuKQlHQ01QT0ZTbihHQ0IsIEdDQiwgcmVnLCBuKQogI2RlZmluZSBHQ01QQ0xDQk9GUyhyZWcpCUdDTVBPRlMoQ0xDQiwgQ0NCLCByZWcpCiAjZGVmaW5lIEdDTVBDT0NCT0ZTKHJlZykJR0NNUE9GUyhDT0NCLCBDQ0IsIHJlZykKICNkZWZpbmUgR0NNUEdEQk9GUyhyZWcpCQlHQ01QT0ZTKEdEQiwgR0RCLCByZWcpCiAKIC8qIEdDTVAgcmVnaXN0ZXIgYWNjZXNzICovCiAjZGVmaW5lIEdDTVBHQ0IocmVnKQkJCVJFR1AoX2djbXBfYmFzZSwgR0NNUEdDQk9GUyhyZWcpKQorI2RlZmluZSBHQ01QR0NCbihyZWcsIG4pICAgICAgICAgICAgICAgUkVHUChfZ2NtcF9iYXNlLCBHQ01QR0NCT0ZTbihyZWcsIG4pKQogI2RlZmluZSBHQ01QQ0xDQihyZWcpCQkJUkVHUChfZ2NtcF9iYXNlLCBHQ01QQ0xDQk9GUyhyZWcpKQogI2RlZmluZSBHQ01QQ09DQihyZWcpCQkJUkVHUChfZ2NtcF9iYXNlLCBHQ01QQ09DQk9GUyhyZWcpKQogI2RlZmluZSBHQ01QR0RCKHJlZykJCQlSRUdQKF9nY21wX2Jhc2UsIEdDTVBHREJPRlMocmVnKSkKQEAgLTQ5LDEwICs1NCwxMCBAQAogI2RlZmluZSAgR0NNUF9HQ0JfR0NNUEJfR0NNUEJBU0VfTVNLCUdDTVBHQ0JNU0soR0NNUEJfR0NNUEJBU0UsIDE3KQogI2RlZmluZSAgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfU0hGCTAKICNkZWZpbmUgIEdDTVBfR0NCX0dDTVBCX0NNREVGVEdUX01TSwlHQ01QR0NCTVNLKEdDTVBCX0NNREVGVEdULCAyKQotI2RlZmluZSAgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfTUVNCTAKLSNkZWZpbmUgIEdDTVBfR0NCX0dDTVBCX0NNREVGVEdUX01FTTEJMQotI2RlZmluZSAgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfSU9DVTEgMgotI2RlZmluZSAgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfSU9DVTIgMworI2RlZmluZSAgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfRElTQUJMRUQJMAorI2RlZmluZSAgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfTUVNCQkxCisjZGVmaW5lICBHQ01QX0dDQl9HQ01QQl9DTURFRlRHVF9JT0NVMQkJMgorI2RlZmluZSAgR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfSU9DVTIJCTMKICNkZWZpbmUgR0NNUF9HQ0JfQ0NNQ19PRlMJCTB4MDAxMAkvKiBHbG9iYWwgQ00gQ29udHJvbCAqLwogI2RlZmluZSBHQ01QX0dDQl9HQ1NSQVBfT0ZTCQkweDAwMjAJLyogR2xvYmFsIENTUiBBY2Nlc3MgUHJpdmlsZWdlICovCiAjZGVmaW5lICBHQ01QX0dDQl9HQ1NSQVBfQ01BQ0NFU1NfU0hGCTAKQEAgLTExNSw1ICsxMjAsNiBAQAogI2RlZmluZSBHQ01QX0NDQl9EQkdHUk9VUF9PRlMJCTB4MDEwMAkJLyogRGVidWdCcmVhayBHcm91cCAqLwogCiBleHRlcm4gaW50IF9faW5pdCBnY21wX3Byb2JlKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotCitleHRlcm4gaW50IF9faW5pdCBnY21wX25pb2N1KHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IGdjbXBfc2V0cmVnaW9uKGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KTsKICNlbmRpZiAvKiBfQVNNX0dDTVBSRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9naWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9naWMuaAppbmRleCBhOGY1NzM0Li45Yjk0MzZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2ljLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2dpYy5oCkBAIC0xMiw3ICsxMiw2IEBACiAjZGVmaW5lIF9BU01fR0lDUkVHU19ICiAKICN1bmRlZglHSUNJU0JZVEVMSVRUTEVFTkRJQU4KLSNkZWZpbmUgR0lDSVNXT1JETElUVExFRU5ESUFOCiAKIC8qIENvbnN0YW50cyAqLwogI2RlZmluZSBHSUNfUE9MX1BPUwkJCTEKQEAgLTIwLDExICsxOSw3IEBACiAjZGVmaW5lIEdJQ19UUklHX0VER0UJCQkxCiAjZGVmaW5lIEdJQ19UUklHX0xFVkVMCQkJMAogCi0jaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBHSUNfTlVNX0lOVFJTCQkJKDI0ICsgTlJfQ1BVUyAqIDIpCi0jZWxzZQotI2RlZmluZSBHSUNfTlVNX0lOVFJTCQkJMzIKLSNlbmRpZgogCiAjZGVmaW5lIE1TSyhuKSAoKDEgPDwgKG4pKSAtIDEpCiAjZGVmaW5lIFJFRzMyKGFkZHIpCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKGFkZHIpKQpAQCAtNzAsMTMgKzY1LDEzIEBACiAjZGVmaW5lIFVTTV9WSVNJQkxFX1NFQ1RJT05fU0laRQkweDEwMDAwCiAKIC8qIFJlZ2lzdGVyIE1hcCBmb3IgU2hhcmVkIFNlY3Rpb24gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfTElUVExFX0VORElBTikgfHwgZGVmaW5lZChHSUNJU1dPUkRMSVRUTEVFTkRJQU4pCiAKICNkZWZpbmUJR0lDX1NIX0NPTkZJR19PRlMJCTB4MDAwMAogCiAvKiBTaGFyZWQgR2xvYmFsIENvdW50ZXIgKi8KICNkZWZpbmUgR0lDX1NIX0NPVU5URVJfMzFfMDBfT0ZTCTB4MDAxMAogI2RlZmluZSBHSUNfU0hfQ09VTlRFUl82M18zMl9PRlMJMHgwMDE0CisjZGVmaW5lIEdJQ19TSF9SRVZJU0lPTklEX09GUwkJMHgwMDIwCiAKIC8qIEludGVycnVwdCBQb2xhcml0eSAqLwogI2RlZmluZSBHSUNfU0hfUE9MXzMxXzBfT0ZTCQkweDAxMDAKQEAgLTE2NCwyNCArMTU5LDMxIEBACiAJKEdJQ19TSF9JTlRSX01BUF9UT19WUEVfQkFTRV9PRlMgKyAoMzIgKiAoaW50cikpICsgKCgodnBlKSAvIDMyKSAqIDQpKQogI2RlZmluZSBHSUNfU0hfTUFQX1RPX1ZQRV9SRUdfQklUKHZwZSkJKDEgPDwgKCh2cGUpICUgMzIpKQogCisvKiBDb252ZXJ0IGFuIGludGVycnVwdCBudW1iZXIgdG8gYSBieXRlIG9mZnNldC9iaXQgZm9yIG11bHRpLXdvcmQgcmVnaXN0ZXJzICovCisjZGVmaW5lIEdJQ19JTlRSX09GUyhpbnRyKSAoKChpbnRyKSAvIDMyKSo0KQorI2RlZmluZSBHSUNfSU5UUl9CSVQoaW50cikgKChpbnRyKSAlIDMyKQorCiAvKiBQb2xhcml0eSA6IFJlc2V0IFZhbHVlIGlzIGFsd2F5cyAwICovCiAjZGVmaW5lIEdJQ19TSF9TRVRfUE9MQVJJVFlfT0ZTCQkweDAxMDAKICNkZWZpbmUgR0lDX1NFVF9QT0xBUklUWShpbnRyLCBwb2wpIFwKLQlHSUNCSVMoR0lDX1JFR19BRERSKFNIQVJFRCwgR0lDX1NIX1NFVF9QT0xBUklUWV9PRlMgKyAoKChpbnRyKSAvIDMyKSAqIDQpKSwgKHBvbCkgPDwgKChpbnRyKSAlIDMyKSkKKwlHSUNCSVMoR0lDX1JFR19BRERSKFNIQVJFRCwgR0lDX1NIX1NFVF9QT0xBUklUWV9PRlMgKyBcCisJCUdJQ19JTlRSX09GUyhpbnRyKSksIChwb2wpIDw8IEdJQ19JTlRSX0JJVChpbnRyKSkKIAogLyogVHJpZ2dlcmluZyA6IFJlc2V0IFZhbHVlIGlzIGFsd2F5cyAwICovCiAjZGVmaW5lIEdJQ19TSF9TRVRfVFJJR0dFUl9PRlMJCTB4MDE4MAogI2RlZmluZSBHSUNfU0VUX1RSSUdHRVIoaW50ciwgdHJpZykgXAotCUdJQ0JJUyhHSUNfUkVHX0FERFIoU0hBUkVELCBHSUNfU0hfU0VUX1RSSUdHRVJfT0ZTICsgKCgoaW50cikgLyAzMikgKiA0KSksICh0cmlnKSA8PCAoKGludHIpICUgMzIpKQorCUdJQ0JJUyhHSUNfUkVHX0FERFIoU0hBUkVELCBHSUNfU0hfU0VUX1RSSUdHRVJfT0ZTICsgXAorCQlHSUNfSU5UUl9PRlMoaW50cikpLCAodHJpZykgPDwgR0lDX0lOVFJfQklUKGludHIpKQogCiAvKiBNYXNrIG1hbmlwdWxhdGlvbiAqLwogI2RlZmluZSBHSUNfU0hfU01BU0tfT0ZTCQkweDAzODAKLSNkZWZpbmUgR0lDX1NFVF9JTlRSX01BU0soaW50ciwgdmFsKSBcCi0JR0lDV1JJVEUoR0lDX1JFR19BRERSKFNIQVJFRCwgR0lDX1NIX1NNQVNLX09GUyArICgoKGludHIpIC8gMzIpICogNCkpLCAoKHZhbCkgPDwgKChpbnRyKSAlIDMyKSkpCi0KKyNkZWZpbmUgR0lDX1NFVF9JTlRSX01BU0soaW50cikgXAorCUdJQ1dSSVRFKEdJQ19SRUdfQUREUihTSEFSRUQsIEdJQ19TSF9TTUFTS19PRlMgKyBcCisJCUdJQ19JTlRSX09GUyhpbnRyKSksIDEgPDwgR0lDX0lOVFJfQklUKGludHIpKQogI2RlZmluZSBHSUNfU0hfUk1BU0tfT0ZTCQkweDAzMDAKLSNkZWZpbmUgR0lDX0NMUl9JTlRSX01BU0soaW50ciwgdmFsKSBcCi0JR0lDV1JJVEUoR0lDX1JFR19BRERSKFNIQVJFRCwgR0lDX1NIX1JNQVNLX09GUyArICgoKGludHIpIC8gMzIpICogNCkpLCAoKHZhbCkgPDwgKChpbnRyKSAlIDMyKSkpCisjZGVmaW5lIEdJQ19DTFJfSU5UUl9NQVNLKGludHIpIFwKKwlHSUNXUklURShHSUNfUkVHX0FERFIoU0hBUkVELCBHSUNfU0hfUk1BU0tfT0ZTICsgXAorCQlHSUNfSU5UUl9PRlMoaW50cikpLCAxIDw8IEdJQ19JTlRSX0JJVChpbnRyKSkKIAogLyogUmVnaXN0ZXIgTWFwIGZvciBMb2NhbCBTZWN0aW9uICovCiAjZGVmaW5lIEdJQ19WUEVfQ1RMX09GUwkJCTB4MDAwMApAQCAtMjE5LDE2MSArMjIxLDYgQEAKICNkZWZpbmUgR0lDX1VNVl9TSF9DT1VOVEVSXzMxXzAwX09GUwkweDAwMDAKICNkZWZpbmUgR0lDX1VNVl9TSF9DT1VOVEVSXzYzXzMyX09GUwkweDAwMDQKIAotI2Vsc2UgLyogQ09ORklHX0NQVV9CSUdfRU5ESUFOICovCi0KLSNkZWZpbmUJR0lDX1NIX0NPTkZJR19PRlMJCTB4MDAwMAotCi0vKiBTaGFyZWQgR2xvYmFsIENvdW50ZXIgKi8KLSNkZWZpbmUgR0lDX1NIX0NPVU5URVJfMzFfMDBfT0ZTCTB4MDAxNAotI2RlZmluZSBHSUNfU0hfQ09VTlRFUl82M18zMl9PRlMJMHgwMDEwCi0KLS8qIEludGVycnVwdCBQb2xhcml0eSAqLwotI2RlZmluZSBHSUNfU0hfUE9MXzMxXzBfT0ZTCQkweDAxMDQKLSNkZWZpbmUgR0lDX1NIX1BPTF82M18zMl9PRlMJCTB4MDEwMAotI2RlZmluZSBHSUNfU0hfUE9MXzk1XzY0X09GUwkJMHgwMTBjCi0jZGVmaW5lIEdJQ19TSF9QT0xfMTI3Xzk2X09GUwkJMHgwMTA4Ci0jZGVmaW5lIEdJQ19TSF9QT0xfMTU5XzEyOF9PRlMJCTB4MDExNAotI2RlZmluZSBHSUNfU0hfUE9MXzE5MV8xNjBfT0ZTCQkweDAxMTAKLSNkZWZpbmUgR0lDX1NIX1BPTF8yMjNfMTkyX09GUwkJMHgwMTFjCi0jZGVmaW5lIEdJQ19TSF9QT0xfMjU1XzIyNF9PRlMJCTB4MDExOAotCi0vKiBFZGdlL0xldmVsIFRyaWdnZXJpbmcgKi8KLSNkZWZpbmUgR0lDX1NIX1RSSUdfMzFfMF9PRlMJCTB4MDE4NAotI2RlZmluZSBHSUNfU0hfVFJJR182M18zMl9PRlMJCTB4MDE4MAotI2RlZmluZSBHSUNfU0hfVFJJR185NV82NF9PRlMJCTB4MDE4YwotI2RlZmluZSBHSUNfU0hfVFJJR18xMjdfOTZfT0ZTCQkweDAxODgKLSNkZWZpbmUgR0lDX1NIX1RSSUdfMTU5XzEyOF9PRlMJCTB4MDE5NAotI2RlZmluZSBHSUNfU0hfVFJJR18xOTFfMTYwX09GUwkJMHgwMTkwCi0jZGVmaW5lIEdJQ19TSF9UUklHXzIyM18xOTJfT0ZTCQkweDAxOWMKLSNkZWZpbmUgR0lDX1NIX1RSSUdfMjU1XzIyNF9PRlMJCTB4MDE5OAotCi0vKiBEdWFsIEVkZ2UgVHJpZ2dlcmluZyAqLwotI2RlZmluZSBHSUNfU0hfRFVBTF8zMV8wX09GUwkJMHgwMjA0Ci0jZGVmaW5lIEdJQ19TSF9EVUFMXzYzXzMyX09GUwkJMHgwMjAwCi0jZGVmaW5lIEdJQ19TSF9EVUFMXzk1XzY0X09GUwkJMHgwMjBjCi0jZGVmaW5lIEdJQ19TSF9EVUFMXzEyN185Nl9PRlMJCTB4MDIwOAotI2RlZmluZSBHSUNfU0hfRFVBTF8xNTlfMTI4X09GUwkJMHgwMjE0Ci0jZGVmaW5lIEdJQ19TSF9EVUFMXzE5MV8xNjBfT0ZTCQkweDAyMTAKLSNkZWZpbmUgR0lDX1NIX0RVQUxfMjIzXzE5Ml9PRlMJCTB4MDIxYwotI2RlZmluZSBHSUNfU0hfRFVBTF8yNTVfMjI0X09GUwkJMHgwMjE4Ci0KLS8qIFNldC9DbGVhciBjb3JyZXNwb25kaW5nIGJpdCBpbiBFZGdlIERldGVjdCBSZWdpc3RlciAqLwotI2RlZmluZSBHSUNfU0hfV0VER0VfT0ZTCQkweDAyODAKLQotLyogUmVzZXQgTWFzayAtIERpc2FibGVzIEludGVycnVwdCAqLwotI2RlZmluZSBHSUNfU0hfUk1BU0tfMzFfMF9PRlMJCTB4MDMwNAotI2RlZmluZSBHSUNfU0hfUk1BU0tfNjNfMzJfT0ZTCQkweDAzMDAKLSNkZWZpbmUgR0lDX1NIX1JNQVNLXzk1XzY0X09GUwkJMHgwMzBjCi0jZGVmaW5lIEdJQ19TSF9STUFTS18xMjdfOTZfT0ZTCQkweDAzMDgKLSNkZWZpbmUgR0lDX1NIX1JNQVNLXzE1OV8xMjhfT0ZTCTB4MDMxNAotI2RlZmluZSBHSUNfU0hfUk1BU0tfMTkxXzE2MF9PRlMJMHgwMzEwCi0jZGVmaW5lIEdJQ19TSF9STUFTS18yMjNfMTkyX09GUwkweDAzMWMKLSNkZWZpbmUgR0lDX1NIX1JNQVNLXzI1NV8yMjRfT0ZTCTB4MDMxOAotCi0vKiBTZXQgTWFzayAoV08pIC0gRW5hYmxlcyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgR0lDX1NIX1NNQVNLXzMxXzBfT0ZTCQkweDAzODQKLSNkZWZpbmUgR0lDX1NIX1NNQVNLXzYzXzMyX09GUwkJMHgwMzgwCi0jZGVmaW5lIEdJQ19TSF9TTUFTS185NV82NF9PRlMJCTB4MDM4YwotI2RlZmluZSBHSUNfU0hfU01BU0tfMTI3Xzk2X09GUwkJMHgwMzg4Ci0jZGVmaW5lIEdJQ19TSF9TTUFTS18xNTlfMTI4X09GUwkweDAzOTQKLSNkZWZpbmUgR0lDX1NIX1NNQVNLXzE5MV8xNjBfT0ZTCTB4MDM5MAotI2RlZmluZSBHSUNfU0hfU01BU0tfMjIzXzE5Ml9PRlMJMHgwMzljCi0jZGVmaW5lIEdJQ19TSF9TTUFTS18yNTVfMjI0X09GUwkweDAzOTgKLQotLyogR2xvYmFsIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIChSTykgLSBCaXQgU2V0ID09IEludGVycnVwdCBlbmFibGVkICovCi0jZGVmaW5lIEdJQ19TSF9NQVNLXzMxXzBfT0ZTCQkweDA0MDQKLSNkZWZpbmUgR0lDX1NIX01BU0tfNjNfMzJfT0ZTCQkweDA0MDAKLSNkZWZpbmUgR0lDX1NIX01BU0tfOTVfNjRfT0ZTCQkweDA0MGMKLSNkZWZpbmUgR0lDX1NIX01BU0tfMTI3Xzk2X09GUwkJMHgwNDA4Ci0jZGVmaW5lIEdJQ19TSF9NQVNLXzE1OV8xMjhfT0ZTCQkweDA0MTQKLSNkZWZpbmUgR0lDX1NIX01BU0tfMTkxXzE2MF9PRlMJCTB4MDQxMAotI2RlZmluZSBHSUNfU0hfTUFTS18yMjNfMTkyX09GUwkJMHgwNDFjCi0jZGVmaW5lIEdJQ19TSF9NQVNLXzI1NV8yMjRfT0ZTCQkweDA0MTgKLQotLyogUGVuZGluZyBHbG9iYWwgSW50ZXJydXB0cyAoUk8pICovCi0jZGVmaW5lIEdJQ19TSF9QRU5EXzMxXzBfT0ZTCQkweDA0ODQKLSNkZWZpbmUgR0lDX1NIX1BFTkRfNjNfMzJfT0ZTCQkweDA0ODAKLSNkZWZpbmUgR0lDX1NIX1BFTkRfOTVfNjRfT0ZTCQkweDA0OGMKLSNkZWZpbmUgR0lDX1NIX1BFTkRfMTI3Xzk2X09GUwkJMHgwNDg4Ci0jZGVmaW5lIEdJQ19TSF9QRU5EXzE1OV8xMjhfT0ZTCQkweDA0OTQKLSNkZWZpbmUgR0lDX1NIX1BFTkRfMTkxXzE2MF9PRlMJCTB4MDQ5MAotI2RlZmluZSBHSUNfU0hfUEVORF8yMjNfMTkyX09GUwkJMHgwNDljCi0jZGVmaW5lIEdJQ19TSF9QRU5EXzI1NV8yMjRfT0ZTCQkweDA0OTgKLQotI2RlZmluZSBHSUNfU0hfSU5UUl9NQVBfVE9fUElOX0JBU0VfT0ZTCTB4MDUwMAotCi0vKiBNYXBzIEludGVycnVwdCBYIHRvIGEgUGluICovCi0jZGVmaW5lIEdJQ19TSF9NQVBfVE9fUElOKGludHIpIFwKLQkoR0lDX1NIX0lOVFJfTUFQX1RPX1BJTl9CQVNFX09GUyArICg0ICogaW50cikpCi0KLSNkZWZpbmUgR0lDX1NIX0lOVFJfTUFQX1RPX1ZQRV9CQVNFX09GUwkweDIwMDQKLQotLyoKLSAqIE1hcHMgSW50ZXJydXB0IFggdG8gYSBWUEUuICBUaGlzIGlzIG1vcmUgY29tcGxleCB0aGFuIHRoZSBMRSBjYXNlLCBhcwotICogb2RkIGFuZCBldmVuIHJlZ2lzdGVycyBuZWVkIHRvIGJlIHRyYW5zcG9zZWQuICBJdCBkb2VzIHdvcmsgLSB0cnVzdCBtZSEKLSAqLwotI2RlZmluZSBHSUNfU0hfTUFQX1RPX1ZQRV9SRUdfT0ZGKGludHIsIHZwZSkgXAotCShHSUNfU0hfSU5UUl9NQVBfVE9fVlBFX0JBU0VfT0ZTICsgKDMyICogKGludHIpKSArIFwKLQkoKCgoKHZwZSkgLyAzMikgXiAxKSAtIDEpICogNCkpCi0jZGVmaW5lIEdJQ19TSF9NQVBfVE9fVlBFX1JFR19CSVQodnBlKQkoMSA8PCAoKHZwZSkgJSAzMikpCi0KLS8qIFBvbGFyaXR5ICovCi0jZGVmaW5lIEdJQ19TSF9TRVRfUE9MQVJJVFlfT0ZTCQkweDAxMDAKLSNkZWZpbmUgR0lDX1NFVF9QT0xBUklUWShpbnRyLCBwb2wpIFwKLQlHSUNCSVMoR0lDX1JFR19BRERSKFNIQVJFRCwgR0lDX1NIX1NFVF9QT0xBUklUWV9PRlMgKyA0ICsgKCgoKChpbnRyKSAvIDMyKSBeIDEpIC0gMSkgKiA0KSksIChwb2wpIDw8ICgoaW50cikgJSAzMikpCi0KLS8qIFRyaWdnZXJpbmcgKi8KLSNkZWZpbmUgR0lDX1NIX1NFVF9UUklHR0VSX09GUwkJMHgwMTgwCi0jZGVmaW5lIEdJQ19TRVRfVFJJR0dFUihpbnRyLCB0cmlnKSBcCi0JR0lDQklTKEdJQ19SRUdfQUREUihTSEFSRUQsIEdJQ19TSF9TRVRfVFJJR0dFUl9PRlMgKyA0ICsgKCgoKChpbnRyKSAvIDMyKSBeIDEpIC0gMSkgKiA0KSksICh0cmlnKSA8PCAoKGludHIpICUgMzIpKQotCi0vKiBNYXNrIG1hbmlwdWxhdGlvbiAqLwotI2RlZmluZSBHSUNfU0hfU01BU0tfT0ZTCQkweDAzODAKLSNkZWZpbmUgR0lDX1NFVF9JTlRSX01BU0soaW50ciwgdmFsKSBcCi0JR0lDV1JJVEUoR0lDX1JFR19BRERSKFNIQVJFRCwgR0lDX1NIX1NNQVNLX09GUyArIDQgKyAoKCgoKGludHIpIC8gMzIpIF4gMSkgLSAxKSAqIDQpKSwgKCh2YWwpIDw8ICgoaW50cikgJSAzMikpKQotCi0jZGVmaW5lIEdJQ19TSF9STUFTS19PRlMJCTB4MDMwMAotI2RlZmluZSBHSUNfQ0xSX0lOVFJfTUFTSyhpbnRyLCB2YWwpIFwKLQlHSUNXUklURShHSUNfUkVHX0FERFIoU0hBUkVELCBHSUNfU0hfUk1BU0tfT0ZTICsgNCArICgoKCgoaW50cikgLyAzMikgXiAxKSAtIDEpICogNCkpLCAoKHZhbCkgPDwgKChpbnRyKSAlIDMyKSkpCi0KLS8qIFJlZ2lzdGVyIE1hcCBmb3IgTG9jYWwgU2VjdGlvbiAqLwotI2RlZmluZSBHSUNfVlBFX0NUTF9PRlMJCQkweDAwMDAKLSNkZWZpbmUgR0lDX1ZQRV9QRU5EX09GUwkJMHgwMDA0Ci0jZGVmaW5lIEdJQ19WUEVfTUFTS19PRlMJCTB4MDAwOAotI2RlZmluZSBHSUNfVlBFX1JNQVNLX09GUwkJMHgwMDBjCi0jZGVmaW5lIEdJQ19WUEVfU01BU0tfT0ZTCQkweDAwMTAKLSNkZWZpbmUgR0lDX1ZQRV9XRF9NQVBfT0ZTCQkweDAwNDAKLSNkZWZpbmUgR0lDX1ZQRV9DT01QQVJFX01BUF9PRlMJCTB4MDA0NAotI2RlZmluZSBHSUNfVlBFX1RJTUVSX01BUF9PRlMJCTB4MDA0OAotI2RlZmluZSBHSUNfVlBFX1BFUkZDVFJfTUFQX09GUwkJMHgwMDUwCi0jZGVmaW5lIEdJQ19WUEVfU1dJTlQwX01BUF9PRlMJCTB4MDA1NAotI2RlZmluZSBHSUNfVlBFX1NXSU5UMV9NQVBfT0ZTCQkweDAwNTgKLSNkZWZpbmUgR0lDX1ZQRV9PVEhFUl9BRERSX09GUwkJMHgwMDgwCi0jZGVmaW5lIEdJQ19WUEVfV0RfQ09ORklHMF9PRlMJCTB4MDA5MAotI2RlZmluZSBHSUNfVlBFX1dEX0NPVU5UMF9PRlMJCTB4MDA5NAotI2RlZmluZSBHSUNfVlBFX1dEX0lOSVRJQUwwX09GUwkJMHgwMDk4Ci0jZGVmaW5lIEdJQ19WUEVfQ09NUEFSRV9MT19PRlMJCTB4MDBhNAotI2RlZmluZSBHSUNfVlBFX0NPTVBBUkVfSElfT0ZTCQkweDAwYTAKLQotI2RlZmluZSBHSUNfVlBFX0VJQ19TSEFET1dfU0VUX0JBU0UJMHgwMTAwCi0jZGVmaW5lIEdJQ19WUEVfRUlDX1NTKGludHIpIFwKLQkoR0lDX0VJQ19TSEFET1dfU0VUX0JBU0UgKyAoNCAqIGludHIpKQotCi0jZGVmaW5lIEdJQ19WUEVfRUlDX1ZFQ19CQVNFCQkweDA4MDAKLSNkZWZpbmUgR0lDX1ZQRV9FSUNfVkVDKGludHIpIFwKLQkoR0lDX1ZQRV9FSUNfVkVDX0JBU0UgKyAoNCAqIGludHIpKQotCi0jZGVmaW5lIEdJQ19WUEVfVEVOQUJMRV9OTUlfT0ZTCQkweDEwMDAKLSNkZWZpbmUgR0lDX1ZQRV9URU5BQkxFX1lRX09GUwkJMHgxMDA0Ci0jZGVmaW5lIEdJQ19WUEVfVEVOQUJMRV9JTlRfMzFfMF9PRlMJMHgxMDgwCi0jZGVmaW5lIEdJQ19WUEVfVEVOQUJMRV9JTlRfNjNfMzJfT0ZTCTB4MTA4NAotCi0vKiBVc2VyIE1vZGUgVmlzaWJsZSBTZWN0aW9uIFJlZ2lzdGVyIE1hcCAqLwotI2RlZmluZSBHSUNfVU1WX1NIX0NPVU5URVJfMzFfMDBfT0ZTCTB4MDAwNAotI2RlZmluZSBHSUNfVU1WX1NIX0NPVU5URVJfNjNfMzJfT0ZTCTB4MDAwMAotCi0jZW5kaWYgLyogIUxFICovCi0KIC8qIE1hc2tzICovCiAjZGVmaW5lIEdJQ19TSF9DT05GSUdfQ09VTlRTVE9QX1NIRgkyOAogI2RlZmluZSBHSUNfU0hfQ09ORklHX0NPVU5UU1RPUF9NU0sJKE1TSygxKSA8PCBHSUNfU0hfQ09ORklHX0NPVU5UU1RPUF9TSEYpCkBAIC00NzMsMTIgKzMyMCwxMyBAQAogICogaW4gYnVpbGRpbmcgaXBpX21hcC4KICAqLwogc3RydWN0IGdpY19pbnRyX21hcCB7Ci0JdW5zaWduZWQgaW50IGludHJudW07IAkvKiBFeHQgSW50ciBOdW0gCSovCiAJdW5zaWduZWQgaW50IGNwdW51bTsJLyogRGlyZWN0ZWQgdG8gdGhpcyBDUFUgKi8KIAl1bnNpZ25lZCBpbnQgcGluOwkvKiBEaXJlY3RlZCB0byB0aGlzIFBpbiAqLwogCXVuc2lnbmVkIGludCBwb2xhcml0eTsJLyogUG9sYXJpdHkgOiArLy0JKi8KIAl1bnNpZ25lZCBpbnQgdHJpZ3R5cGU7CS8qIFRyaWdnZXIgIDogRWRnZS9MZXZsICovCi0JdW5zaWduZWQgaW50IGlwaWZsYWc7CS8qIElzIHVzZWQgZm9yIElQSSA/CSovCisJdW5zaWduZWQgaW50IGZsYWdzOwkvKiBNaXNjIGZsYWdzCSovCisjZGVmaW5lIEdJQ19GTEFHX0lQSSAgICAgICAgICAgMHgwMQorI2RlZmluZSBHSUNfRkxBR19UUkFOU1BBUkVOVCAgIDB4MDIKIH07CiAKIGV4dGVybiB2b2lkIGdpY19pbml0KHVuc2lnbmVkIGxvbmcgZ2ljX2Jhc2VfYWRkciwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWFyNy9hcjcuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWFyNy9hcjcuaAppbmRleCBkZTcxNjk0Li4yMWNiYmM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hcjcvYXI3LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXI3L2FyNy5oCkBAIC03OCw2ICs3OCw5IEBACiAjZGVmaW5lIEFSN19SRUZfQ0xPQ0sJMjUwMDAwMDAKICNkZWZpbmUgQVI3X1hUQUxfQ0xPQ0sJMjQwMDAwMDAKIAorLyogRENMICovCisjZGVmaW5lIEFSN19XRFRfSFdfRU5BCTB4MTAKKwogc3RydWN0IHBsYXRfY3BtYWNfZGF0YSB7CiAJaW50IHJlc2V0X2JpdDsKIAlpbnQgcG93ZXJfYml0OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby1hdTEwMDAuaAppbmRleCBmZWVhMDAxLi45MTU5NWZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby1hdTEwMDAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby1hdTEwMDAuaApAQCAtMTA0LDYgKzEwNCw4IEBACiAKIAlpZiAoKGdwaW8gPj0gOCkgJiYgKGdwaW8gPD0gMTUpKQogCQlyZXR1cm4gTUFLRV9JUlEoMCwgMjkpOwkJLyogc2hhcmVkIEdQSU8yMDhfMjE1ICovCisKKwlyZXR1cm4gLUVOWElPOwogfQogCiAjaWZkZWYgQ09ORklHX1NPQ19BVTExMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTYzeHgvYmNtNjN4eF9kZXZfcGNtY2lhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY202M3h4L2JjbTYzeHhfZGV2X3BjbWNpYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWIzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY202M3h4L2JjbTYzeHhfZGV2X3BjbWNpYS5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgQkNNNjNYWF9ERVZfUENNQ0lBX0hfCisjZGVmaW5lIEJDTTYzWFhfREVWX1BDTUNJQV9IXworCisvKgorICogUENNQ0lBIGRyaXZlciBwbGF0Zm9ybSBkYXRhCisgKi8KK3N0cnVjdCBiY202M3h4X3BjbWNpYV9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgcmVhZHlfZ3BpbzsKK307CisKK2ludCBiY202M3h4X3BjbWNpYV9yZWdpc3Rlcih2b2lkKTsKKworI2VuZGlmIC8qIEJDTTYzWFhfREVWX1BDTUNJQV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyNy90b3BvbG9neS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyNy90b3BvbG9neS5oCmluZGV4IDIzMDU5MTcuLjA5YTU5YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvdG9wb2xvZ3kuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L3RvcG9sb2d5LmgKQEAgLTI0LDEyICsyNCwxMCBAQAogCiAjZGVmaW5lIGNwdV90b19ub2RlKGNwdSkJKHNuX2NwdV9pbmZvWyhjcHUpXS5wX25vZGVpZCkKICNkZWZpbmUgcGFyZW50X25vZGUobm9kZSkJKG5vZGUpCi0jZGVmaW5lIG5vZGVfdG9fY3B1bWFzayhub2RlKQkoaHViX2RhdGEobm9kZSktPmhfY3B1cykKICNkZWZpbmUgY3B1bWFza19vZl9ub2RlKG5vZGUpCSgmaHViX2RhdGEobm9kZSktPmhfY3B1cykKIHN0cnVjdCBwY2lfYnVzOwogZXh0ZXJuIGludCBwY2lidXNfdG9fbm9kZShzdHJ1Y3QgcGNpX2J1cyAqKTsKIAotI2RlZmluZSBwY2lidXNfdG9fY3B1bWFzayhidXMpCShjcHVfb25saW5lX21hcCkKICNkZWZpbmUgY3B1bWFza19vZl9wY2lidXMoYnVzKQkoY3B1X29ubGluZV9tYXNrKQogCiBleHRlcm4gdW5zaWduZWQgY2hhciBfX25vZGVfZGlzdGFuY2VzW01BWF9DT01QQUNUX05PREVTXVtNQVhfQ09NUEFDVF9OT0RFU107CkBAIC00Niw4ICs0NCw4IEBACiAJLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAogCS5jYWNoZV9uaWNlX3RyaWVzCT0gMSwJCQlcCi0JLmZsYWdzCQkJPSBTRF9MT0FEX0JBTEFOQ0UJXAotCQkJCXwgU0RfQkFMQU5DRV9FWEVDCVwKKwkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRSB8CVwKKwkJCQkgIFNEX0JBTEFOQ0VfRVhFQywJXAogCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCVwKIAkuYmFsYW5jZV9pbnRlcnZhbAk9IDEsCQkJXAogCS5ucl9iYWxhbmNlX2ZhaWxlZAk9IDAsCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sb29uZ3Nvbi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAppbmRleCBjZTViNmUyNy4uOTk0N2U1NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbG9vbmdzb24vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgY3B1X2hhc19jYWNoZV9jZGV4X3AJMAogI2RlZmluZSBjcHVfaGFzX2NhY2hlX2NkZXhfcwkwCiAjZGVmaW5lIGNwdV9oYXNfY291bnRlcgkJMQotI2RlZmluZSBjcHVfaGFzX2RjX2FsaWFzZXMJMQorI2RlZmluZSBjcHVfaGFzX2RjX2FsaWFzZXMJKFBBR0VfU0laRSA8IDB4NDAwMCkKICNkZWZpbmUgY3B1X2hhc19kaXZlYwkJMAogI2RlZmluZSBjcHVfaGFzX2RzcAkJMAogI2RlZmluZSBjcHVfaGFzX2VqdGFnCQkwCkBAIC01NCw2ICs1NCw1IEBACiAjZGVmaW5lIGNwdV9oYXNfdmNlCQkwCiAjZGVmaW5lIGNwdV9oYXNfdnRhZ19pY2FjaGUJMAogI2RlZmluZSBjcHVfaGFzX3dhdGNoCQkxCi0jZGVmaW5lIGNwdV9pY2FjaGVfc25vb3BzX3JlbW90ZV9zdG9yZQkxCiAKICNlbmRpZiAvKiBfX0FTTV9NQUNIX0xPT05HU09OX0NQVV9GRUFUVVJFX09WRVJSSURFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IGQzYmVhODguLjYwODNkYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2hhemFyZHMuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCiAjaW5jbHVkZSA8YXNtL21pcHNtdHJlZ3MuaD4KQEAgLTM2LDExICszNywxMyBAQAogI2lmZGVmIENPTkZJR18zMkJJVAogI2RlZmluZSBUTEJNSVNTX0hBTkRMRVJfU0VUVVAoKQkJCQkJCVwKIAl3cml0ZV9jMF9jb250ZXh0KCh1bnNpZ25lZCBsb25nKSBzbXBfcHJvY2Vzc29yX2lkKCkgPDwgMjUpOwlcCisJYmFja190b19iYWNrX2MwX2hhemFyZCgpOwkJCQkJXAogCVRMQk1JU1NfSEFORExFUl9TRVRVUF9QR0Qoc3dhcHBlcl9wZ19kaXIpCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfNjRCSVQKICNkZWZpbmUgVExCTUlTU19IQU5ETEVSX1NFVFVQKCkJCQkJCQlcCiAJd3JpdGVfYzBfY29udGV4dCgodW5zaWduZWQgbG9uZykgc21wX3Byb2Nlc3Nvcl9pZCgpIDw8IDI2KTsJXAorCWJhY2tfdG9fYmFja19jMF9oYXphcmQoKTsJCQkJCVwKIAlUTEJNSVNTX0hBTkRMRVJfU0VUVVBfUEdEKHN3YXBwZXJfcGdfZGlyKQogI2VuZGlmCiAKQEAgLTE2NSwxMiArMTY4LDEyIEBACiAJICogaGF2aW5nIEFTSURfTUFTSyBzbWFsbGVyIHRoYW4gdGhlIGhhcmR3YXJlIG1heGltdW0sCiAJICogbWFrZSBzdXJlIG5vICJzb2Z0IiBiaXRzIGJlY29tZSAiaGFyZCIuLi4KIAkgKi8KLQl3cml0ZV9jMF9lbnRyeWhpKChyZWFkX2MwX2VudHJ5aGkoKSAmIH5IV19BU0lEX01BU0spCi0JCQl8IChjcHVfY29udGV4dChjcHUsIG5leHQpICYgQVNJRF9NQVNLKSk7CisJd3JpdGVfYzBfZW50cnloaSgocmVhZF9jMF9lbnRyeWhpKCkgJiB+SFdfQVNJRF9NQVNLKSB8CisJCQkgY3B1X2FzaWQoY3B1LCBuZXh0KSk7CiAJZWhiKCk7IC8qIE1ha2Ugc3VyZSBpdCBwcm9wYWdhdGVzIHRvIFRDU3RhdHVzICovCiAJZXZwZShtdGZsYWdzKTsKICNlbHNlCi0Jd3JpdGVfYzBfZW50cnloaShjcHVfY29udGV4dChjcHUsIG5leHQpKTsKKwl3cml0ZV9jMF9lbnRyeWhpKGNwdV9hc2lkKGNwdSwgbmV4dCkpOwogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KIAlUTEJNSVNTX0hBTkRMRVJfU0VUVVBfUEdEKG5leHQtPnBnZCk7CiAKQEAgLTE3OCw4ICsxODEsOCBAQAogCSAqIE1hcmsgY3VycmVudC0+YWN0aXZlX21tIGFzIG5vdCAiYWN0aXZlIiBhbnltb3JlLgogCSAqIFdlIGRvbid0IHdhbnQgdG8gbWlzbGVhZCBwb3NzaWJsZSBJUEkgdGxiIGZsdXNoIHJvdXRpbmVzLgogCSAqLwotCWNwdV9jbGVhcihjcHUsIHByZXYtPmNwdV92bV9tYXNrKTsKLQljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOworCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbW1fY3B1bWFzayhwcmV2KSk7CisJY3B1bWFza19zZXRfY3B1KGNwdSwgbW1fY3B1bWFzayhuZXh0KSk7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CkBAIC0yMjYsMTcgKzIyOSwxNyBAQAogCX0KIAkvKiBTZWUgY29tbWVudHMgZm9yIHNpbWlsYXIgY29kZSBhYm92ZSAqLwogCXdyaXRlX2MwX2VudHJ5aGkoKHJlYWRfYzBfZW50cnloaSgpICYgfkhXX0FTSURfTUFTSykgfAotCSAgICAgICAgICAgICAgICAgKGNwdV9jb250ZXh0KGNwdSwgbmV4dCkgJiBBU0lEX01BU0spKTsKKwkgICAgICAgICAgICAgICAgIGNwdV9hc2lkKGNwdSwgbmV4dCkpOwogCWVoYigpOyAvKiBNYWtlIHN1cmUgaXQgcHJvcGFnYXRlcyB0byBUQ1N0YXR1cyAqLwogCWV2cGUobXRmbGFncyk7CiAjZWxzZQotCXdyaXRlX2MwX2VudHJ5aGkoY3B1X2NvbnRleHQoY3B1LCBuZXh0KSk7CisJd3JpdGVfYzBfZW50cnloaShjcHVfYXNpZChjcHUsIG5leHQpKTsKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAJVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChuZXh0LT5wZ2QpOwogCiAJLyogbWFyayBtbXUgb3duZXJzaGlwIGNoYW5nZSAqLwotCWNwdV9jbGVhcihjcHUsIHByZXYtPmNwdV92bV9tYXNrKTsKLQljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOworCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbW1fY3B1bWFzayhwcmV2KSk7CisJY3B1bWFza19zZXRfY3B1KGNwdSwgbW1fY3B1bWFzayhuZXh0KSk7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CkBAIC0yNTgsNyArMjYxLDcgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCWlmIChjcHVfaXNzZXQoY3B1LCBtbS0+Y3B1X3ZtX21hc2spKSAgeworCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgbW1fY3B1bWFzayhtbSkpKSAgewogCQlnZXRfbmV3X21tdV9jb250ZXh0KG1tLCBjcHUpOwogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKIAkJLyogU2VlIGNvbW1lbnRzIGZvciBzaW1pbGFyIGNvZGUgYWJvdmUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZXR1cC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NldHVwLmgKaW5kZXggZTYwMGNlZC4uNTA1MTFhYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9NSVBTX1NFVFVQX0gKICNkZWZpbmUgX01JUFNfU0VUVVBfSAogCi0jZGVmaW5lIENPTU1BTkRfTElORV9TSVpFCTI1NgorI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRQk0MDk2CiAKICNpZmRlZiAgX19LRVJORUxfXwogZXh0ZXJuIHZvaWQgc2V0dXBfZWFybHlfcHJpbnRrKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1vcHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAtb3BzLmgKaW5kZXggZmQ1NDU1NC4uOWUwOWFmMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1vcHMuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLW9wcy5oCkBAIC0xOSw3ICsxOSw3IEBACiAKIHN0cnVjdCBwbGF0X3NtcF9vcHMgewogCXZvaWQgKCpzZW5kX2lwaV9zaW5nbGUpKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pOwotCXZvaWQgKCpzZW5kX2lwaV9tYXNrKShjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbik7CisJdm9pZCAoKnNlbmRfaXBpX21hc2spKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKTsKIAl2b2lkICgqaW5pdF9zZWNvbmRhcnkpKHZvaWQpOwogCXZvaWQgKCpzbXBfZmluaXNoKSh2b2lkKTsKIAl2b2lkICgqY3B1c19kb25lKSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCBhYWEyZDRhLi5hZjQyMzg1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC5oCkBAIC03Nyw3ICs3NywxOCBAQAogCiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIHNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCh2b2lkKTsKIAotZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KTsKLWV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaShjcHVtYXNrX3QgbWFzayk7CitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KQoreworCWV4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzICptcF9vcHM7ICAgICAvKiBwcml2YXRlICovCisKKwltcF9vcHMtPnNlbmRfaXBpX21hc2soJmNwdW1hc2tfb2ZfY3B1KGNwdSksIFNNUF9DQUxMX0ZVTkNUSU9OKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQoreworCWV4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzICptcF9vcHM7ICAgICAvKiBwcml2YXRlICovCisKKwltcF9vcHMtPnNlbmRfaXBpX21hc2sobWFzaywgU01QX0NBTExfRlVOQ1RJT04pOworfQogCiAjZW5kaWYgLyogX19BU01fU01QX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXRjX2lwaS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtdGNfaXBpLmgKaW5kZXggOGNlNTE3NS4uMTUyNzhkYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtdGNfaXBpLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtdGNfaXBpLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IHNtdGNfaXBpICp0YWlsOwogCWludCBkZXB0aDsKKwlpbnQgcmVzY2hlZF9mbGFnOwkvKiByZXNjaGVkdWxlIGFscmVhZHkgcXVldWVkICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc210Y19pcGlfbnEoc3RydWN0IHNtdGNfaXBpX3EgKnEsIHN0cnVjdCBzbXRjX2lwaSAqcCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zcHJhbS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NwcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4OTAwNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zcHJhbS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX01JUFNfU1BSQU1fSAorI2RlZmluZSBfTUlQU19TUFJBTV9ICisKKyNpZmRlZiBDT05GSUdfQ1BVX01JUFNSMgorZXh0ZXJuIF9faW5pdCB2b2lkIHNwcmFtX2NvbmZpZyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc3ByYW1fY29uZmlnKHZvaWQpIHsgfTsKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX01JUFNSMiAqLworCisjZW5kaWYgLyogX01JUFNfU1BSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCAwMWNjMTYzLi44NDVkYTIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtODYsMTQgKzg2LDcgQEAKICNkZWZpbmUgX19IQVZFX0FSQ0hfVEhSRUFEX0lORk9fQUxMT0NBVE9SCiAKICNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKLSNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKQkJCQkJXAotKHsJCQkJCQkJCVwKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnJldDsJCQkJXAotCQkJCQkJCQlcCi0JcmV0ID0ga3phbGxvYyhUSFJFQURfU0laRSwgR0ZQX0tFUk5FTCk7CQkJXAotCQkJCQkJCQlcCi0JcmV0OwkJCQkJCQlcCi19KQorI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIGt6YWxsb2MoVEhSRUFEX1NJWkUsIEdGUF9LRVJORUwpCiAjZWxzZQogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIGttYWxsb2MoVEhSRUFEX1NJWkUsIEdGUF9LRVJORUwpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91bmFsaWduZWQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91bmFsaWduZWQuaAppbmRleCA3OTI0MDQ5Li40MmY2NmMzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdW5hbGlnbmVkLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oCkBAIC0xMiwxNyArMTIsMTcgQEAKICNpZiBkZWZpbmVkKF9fTUlQU0VCX18pCiAjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9iZV9zdHJ1Y3QuaD4KICMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2xlX2J5dGVzaGlmdC5oPgotIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvZ2VuZXJpYy5oPgogIyBkZWZpbmUgZ2V0X3VuYWxpZ25lZAlfX2dldF91bmFsaWduZWRfYmUKICMgZGVmaW5lIHB1dF91bmFsaWduZWQJX19wdXRfdW5hbGlnbmVkX2JlCiAjZWxpZiBkZWZpbmVkKF9fTUlQU0VMX18pCiAjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9sZV9zdHJ1Y3QuaD4KICMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2JlX2J5dGVzaGlmdC5oPgotIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvZ2VuZXJpYy5oPgogIyBkZWZpbmUgZ2V0X3VuYWxpZ25lZAlfX2dldF91bmFsaWduZWRfbGUKICMgZGVmaW5lIHB1dF91bmFsaWduZWQJX19wdXRfdW5hbGlnbmVkX2xlCiAjZWxzZQogIyAgZXJyb3IgIk1JUFMsIGJ1dCBuZWl0aGVyIF9fTUlQU0VCX18sIG5vciBfX01JUFNFTF9fPz8/IgogI2VuZGlmCiAKKyMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2dlbmVyaWMuaD4KKwogI2VuZGlmIC8qIF9BU01fTUlQU19VTkFMSUdORURfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2phenovaXJxLmMgYi9hcmNoL21pcHMvamF6ei9pcnEuYwppbmRleCA3ZmQxNzBkLi43YmQzMmQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvamF6ei9pcnEuYworKysgYi9hcmNoL21pcHMvamF6ei9pcnEuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHI0MDMwX3RpbWVyX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlcgk9IHI0MDMwX3RpbWVyX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCiAJLm5hbWUJCT0gIlI0MDMwIHRpbWVyIiwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCmluZGV4IGU5NjEyMjEuLmVlY2QyYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQpAQCAtMiw2ICsyLDggQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eC9NSVBTIGtlcm5lbC4KICMKIAorQ1BQRkxBR1Nfdm1saW51eC5sZHMgOj0gJChLQlVJTERfQ0ZMQUdTKQorCiBleHRyYS15CQk6PSBoZWFkLm8gaW5pdF90YXNrLm8gdm1saW51eC5sZHMKIAogb2JqLXkJCSs9IGNwdS1wcm9iZS5vIGJyYW5jaC5vIGVudHJ5Lm8gZ2VuZXgubyBpcnEubyBwcm9jZXNzLm8gXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LWJjbTE0ODAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1iY20xNDgwLmMKaW5kZXggZTAyZjc5Yi4uYmZlYTMyNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LWJjbTE0ODAuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NldnQtYmNtMTQ4MC5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAliY20xNDgwX3VubWFza19pcnEoY3B1LCBpcnEpOwogCiAJYWN0aW9uLT5oYW5kbGVyCT0gc2lieXRlX2NvdW50ZXJfaGFuZGxlcjsKLQlhY3Rpb24tPmZsYWdzCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVOworCWFjdGlvbi0+ZmxhZ3MJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUgfCBJUlFGX1RJTUVSOwogCWFjdGlvbi0+bmFtZQk9IG5hbWU7CiAJYWN0aW9uLT5kZXZfaWQJPSBjZDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LWRzMTI4Ny5jIGIvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LWRzMTI4Ny5jCmluZGV4IDY5OTZkYTQuLjAwYTRkYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1kczEyODcuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NldnQtZHMxMjg3LmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBkczEyODdfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyCT0gZHMxMjg3X2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUgfCBJUlFGX1RJTUVSLAogCS5uYW1lCQk9ICJkczEyODciLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LWd0NjQxeHguYyBiL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1ndDY0MXh4LmMKaW5kZXggOTIzNTFlMC4uZjVkMjY1ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LWd0NjQxeHguYworKysgYi9hcmNoL21pcHMva2VybmVsL2NldnQtZ3Q2NDF4eC5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gZ3Q2NDF4eF90aW1lcjBfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyCT0gZ3Q2NDF4eF90aW1lcjBfaW50ZXJydXB0LAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUsCisJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1BFUkNQVSB8IElSUUZfVElNRVIsCiAJLm5hbWUJCT0gImd0NjQxeHhfdGltZXIwIiwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1yNGsuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1yNGsuYwppbmRleCAyNjUyMzYyLi5iNDY5YWQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NldnQtcjRrLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXI0ay5jCkBAIC04Myw3ICs4Myw3IEBACiAKIHN0cnVjdCBpcnFhY3Rpb24gYzBfY29tcGFyZV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPSBjMF9jb21wYXJlX2ludGVycnVwdCwKLQkuZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUsCisJLmZsYWdzID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVIHwgSVJRRl9USU1FUiwKIAkubmFtZSA9ICJ0aW1lciIsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NldnQtc2IxMjUwLmMgYi9hcmNoL21pcHMva2VybmVsL2NldnQtc2IxMjUwLmMKaW5kZXggYWM1OTAzZC4uZGE3OGVlYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXNiMTI1MC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1zYjEyNTAuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJc2IxMjUwX3VubWFza19pcnEoY3B1LCBpcnEpOwogCiAJYWN0aW9uLT5oYW5kbGVyCT0gc2lieXRlX2NvdW50ZXJfaGFuZGxlcjsKLQlhY3Rpb24tPmZsYWdzCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVOworCWFjdGlvbi0+ZmxhZ3MJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUgfCBJUlFGX1RJTUVSOwogCWFjdGlvbi0+bmFtZQk9IG5hbWU7CiAJYWN0aW9uLT5kZXZfaWQJPSBjZDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXR4eDkuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC10eHg5LmMKaW5kZXggMDAzN2YyMS4uMjE4ZWU2YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXR4eDkuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NldnQtdHh4OS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdHh4OXRtcl9pcnEgPSB7CiAJLmhhbmRsZXIJPSB0eHg5dG1yX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUgfCBJUlFGX1RJTUVSLAogCS5uYW1lCQk9ICJ0eHg5dG1yIiwKIAkuZGV2X2lkCQk9ICZ0eHg5X2Nsb2NrX2V2ZW50X2RldmljZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwppbmRleCBmNzA5NjU3Li43YTUxODY2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3dhdGNoLmg+Ci0KKyNpbmNsdWRlIDxhc20vc3ByYW0uaD4KIC8qCiAgKiBOb3QgYWxsIG9mIHRoZSBNSVBTIENQVXMgaGF2ZSB0aGUgIndhaXQiIGluc3RydWN0aW9uIGF2YWlsYWJsZS4gTW9yZW92ZXIsCiAgKiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICJ3YWl0IiBmZWF0dXJlIGRpZmZlcnMgYmV0d2VlbiBDUFUgZmFtaWxpZXMuIFRoaXMKQEAgLTcxMSwxMiArNzExLDYgQEAKIAltaXBzX3Byb2JlX3dhdGNoX3JlZ2lzdGVycyhjKTsKIH0KIAotI2lmZGVmIENPTkZJR19DUFVfTUlQU1IyCi1leHRlcm4gdm9pZCBzcHJhbV9jb25maWcodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHNwcmFtX2NvbmZpZyh2b2lkKSB7fQotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcHJvYmVfbWlwcyhzdHJ1Y3QgY3B1aW5mb19taXBzICpjLCB1bnNpZ25lZCBpbnQgY3B1KQogewogCWRlY29kZV9jb25maWdzKGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMgYi9hcmNoL21pcHMva2VybmVsL2hlYWQuUwppbmRleCA1MzFjZTdiLi5lYTY5NWQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2hlYWQuUworKysgYi9hcmNoL21pcHMva2VybmVsL2hlYWQuUwpAQCAtMTkxLDYgKzE5MSw3IEBACiAJLyogU2V0IHRoZSBTUCBhZnRlciBhbiBlbXB0eSBwdF9yZWdzLiAgKi8KIAlQVFJfTEkJCXNwLCBfVEhSRUFEX1NJWkUgLSAzMiAtIFBUX1NJWkUKIAlQVFJfQUREVQlzcCwgJDI4CisJYmFja190b19iYWNrX2MwX2hhemFyZAogCXNldF9zYXZlZF9zcAlzcCwgdDAsIHQxCiAJUFRSX1NVQlUJc3AsIDQgKiBTWlJFRwkJIyBpbml0IHN0YWNrIHBvaW50ZXIKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pODI1My5jIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1My5jCmluZGV4IGY3ZDhkNWQuLmVkNWM0NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYworKysgYi9hcmNoL21pcHMva2VybmVsL2k4MjUzLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMCAgPSB7CiAJLmhhbmRsZXIgPSB0aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCisJLmZsYWdzID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcgfCBJUlFGX1RJTUVSLAogCS5uYW1lID0gInRpbWVyIgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvbWlwcy9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggNWI0NTdhNC4uNmQ2Y2E1MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL21pcHMva2VybmVsL2luaXRfdGFzay5jCkBAIC0yMSw5ICsyMSw4IEBACiAgKgogICogVGhlIHRoaW5ncyB3ZSBkbyBmb3IgcGVyZm9ybWFuY2UuLgogICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIiksCi0JICAgICAgICAgICAgICAgX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSkgPQordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEKKwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKSA9CiAJCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lycS1naWMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLWdpYy5jCmluZGV4IGQyMDcyY2QuLmIxODFmMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLWdpYy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLWdpYy5jCkBAIC0xNCwzOCArMTQsMjMgQEAKIAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfZ2ljX2Jhc2U7Ci1zdGF0aWMgdW5zaWduZWQgaW50IF9pcnFiYXNlLCBfbWFwc2l6ZSwgbnVtdnBlcywgbnVtaW50cnM7Ci1zdGF0aWMgc3RydWN0IGdpY19pbnRyX21hcCAqX2ludHJtYXA7CitzdGF0aWMgdW5zaWduZWQgaW50IF9pcnFiYXNlOworc3RhdGljIHVuc2lnbmVkIGludCBnaWNfaXJxX2ZsYWdzW0dJQ19OVU1fSU5UUlNdOworI2RlZmluZSBHSUNfSVJRX0ZMQUdfRURHRSAgICAgIDB4MDAwMQogCi1zdGF0aWMgc3RydWN0IGdpY19wY3B1X21hc2sgcGNwdV9tYXNrc1tOUl9DUFVTXTsKK3N0cnVjdCBnaWNfcGNwdV9tYXNrIHBjcHVfbWFza3NbTlJfQ1BVU107CiBzdGF0aWMgc3RydWN0IGdpY19wZW5kaW5nX3JlZ3MgcGVuZGluZ19yZWdzW05SX0NQVVNdOwogc3RhdGljIHN0cnVjdCBnaWNfaW50cm1hc2tfcmVncyBpbnRybWFza19yZWdzW05SX0NQVVNdOwogCi0jZGVmaW5lIGdpY193ZWRnZWIyYm9rIDAJLyoKLQkJCQkgKiBDYW4gR0lDIGhhbmRsZSBiMmIgd3JpdGVzIHRvIHdlZGdlIHJlZ2lzdGVyPwotCQkJCSAqLwotI2lmIGdpY193ZWRnZWIyYm9rID09IDAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2ljX3dlZGdlYjJiX2xvY2spOwotI2VuZGlmCi0KIHZvaWQgZ2ljX3NlbmRfaXBpKHVuc2lnbmVkIGludCBpbnRyKQogewotI2lmIGdpY193ZWRnZWIyYm9rID09IDAKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2VuZGlmCiAJcHJfZGVidWcoIkNQVSVkOiAlcyBzdGF0dXMgJTA4eFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBfX2Z1bmNfXywKIAkJIHJlYWRfYzBfc3RhdHVzKCkpOwotCWlmICghZ2ljX3dlZGdlYjJib2spCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZnaWNfd2VkZ2ViMmJfbG9jaywgZmxhZ3MpOwogCUdJQ1dSSVRFKEdJQ19SRUcoU0hBUkVELCBHSUNfU0hfV0VER0UpLCAweDgwMDAwMDAwIHwgaW50cik7Ci0JaWYgKCFnaWNfd2VkZ2ViMmJvaykgewotCQkodm9pZCkgR0lDX1JFRyhTSEFSRUQsIEdJQ19TSF9DT05GSUcpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnaWNfd2VkZ2ViMmJfbG9jaywgZmxhZ3MpOwotCX0KIH0KIAogLyogVGhpcyBpcyBNYWx0YSBzcGVjaWZpYyBhbmQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQgKi8KLXN0YXRpYyB2b2lkIHZwZV9sb2NhbF9zZXR1cCh1bnNpZ25lZCBpbnQgbnVtdnBlcykKK3N0YXRpYyB2b2lkIF9faW5pdCB2cGVfbG9jYWxfc2V0dXAodW5zaWduZWQgaW50IG51bXZwZXMpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyB0aW1lcl9pbnRlcnJ1cHQgPSA1LCBwZXJmX2ludGVycnVwdCA9IDU7CkBAIC0xMDUsNDQgKzkwLDM0IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2ljX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcHJfZGVidWcoIkNQVSVkOiAlczogaXJxJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgX19mdW5jX18sIGlycSk7CiAJaXJxIC09IF9pcnFiYXNlOwotCUdJQ19TRVRfSU5UUl9NQVNLKGlycSwgMSk7CisJcHJfZGVidWcoIkNQVSVkOiAlczogaXJxJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgX19mdW5jX18sIGlycSk7CisJR0lDX1NFVF9JTlRSX01BU0soaXJxKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZ2ljX2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKLSNpZiBnaWNfd2VkZ2ViMmJvayA9PSAwCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSNlbmRpZgotCXByX2RlYnVnKCJDUFUlZDogJXM6IGlycSVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIF9fZnVuY19fLCBpcnEpOwogCWlycSAtPSBfaXJxYmFzZTsKLQlHSUNfQ0xSX0lOVFJfTUFTSyhpcnEsIDEpOworCXByX2RlYnVnKCJDUFUlZDogJXM6IGlycSVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIF9fZnVuY19fLCBpcnEpOworCUdJQ19DTFJfSU5UUl9NQVNLKGlycSk7CiAKLQlpZiAoX2ludHJtYXBbaXJxXS50cmlndHlwZSA9PSBHSUNfVFJJR19FREdFKSB7Ci0JCWlmICghZ2ljX3dlZGdlYjJib2spCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2ljX3dlZGdlYjJiX2xvY2ssIGZsYWdzKTsKKwlpZiAoZ2ljX2lycV9mbGFnc1tpcnFdICYgR0lDX0lSUV9GTEFHX0VER0UpCiAJCUdJQ1dSSVRFKEdJQ19SRUcoU0hBUkVELCBHSUNfU0hfV0VER0UpLCBpcnEpOwotCQlpZiAoIWdpY193ZWRnZWIyYm9rKSB7Ci0JCQkodm9pZCkgR0lDX1JFRyhTSEFSRUQsIEdJQ19TSF9DT05GSUcpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2ljX3dlZGdlYjJiX2xvY2ssIGZsYWdzKTsKLQkJfQotCX0KIH0KIAogc3RhdGljIHZvaWQgZ2ljX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcHJfZGVidWcoIkNQVSVkOiAlczogaXJxJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgX19mdW5jX18sIGlycSk7CiAJaXJxIC09IF9pcnFiYXNlOwotCUdJQ19DTFJfSU5UUl9NQVNLKGlycSwgMSk7CisJcHJfZGVidWcoIkNQVSVkOiAlczogaXJxJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgX19mdW5jX18sIGlycSk7CisJR0lDX0NMUl9JTlRSX01BU0soaXJxKTsKIH0KIAogc3RhdGljIHZvaWQgZ2ljX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlwcl9kZWJ1ZygiQ1BVJWQ6ICVzOiBpcnElZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBfX2Z1bmNfXywgaXJxKTsKIAlpcnEgLT0gX2lycWJhc2U7Ci0JR0lDX1NFVF9JTlRSX01BU0soaXJxLCAxKTsKKwlwcl9kZWJ1ZygiQ1BVJWQ6ICVzOiBpcnElZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBfX2Z1bmNfXywgaXJxKTsKKwlHSUNfU0VUX0lOVFJfTUFTSyhpcnEpOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMTU1LDkgKzEzMCw4IEBACiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAlpbnQJCWk7CiAKLQlwcl9kZWJ1ZyhLRVJOX0RFQlVHICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAlpcnEgLT0gX2lycWJhc2U7Ci0KKwlwcl9kZWJ1ZyhLRVJOX0RFQlVHICIlcyglZCkgY2FsbGVkXG4iLCBfX2Z1bmNfXywgaXJxKTsKIAljcHVtYXNrX2FuZCgmdG1wLCBjcHVtYXNrLCBjcHVfb25saW5lX21hc2spOwogCWlmIChjcHVzX2VtcHR5KHRtcCkpCiAJCXJldHVybiAtMTsKQEAgLTE2OCwxMyArMTQyLDYgQEAKIAkJLyogUmUtcm91dGUgdGhpcyBJUlEgKi8KIAkJR0lDX1NIX01BUF9UT19WUEVfU01BU0soaXJxLCBmaXJzdF9jcHUodG1wKSk7CiAKLQkJLyoKLQkJICogRklYTUU6IGFzc3VtcHRpb24gdGhhdCBfaW50cm1hcCBpcyBvcmRlcmVkIGFuZCBoYXMgbm8gaG9sZXMKLQkJICovCi0KLQkJLyogVXBkYXRlIHRoZSBpbnRyX21hcCAqLwotCQlfaW50cm1hcFtpcnFdLmNwdW51bSA9IGZpcnN0X2NwdSh0bXApOwotCiAJCS8qIFVwZGF0ZSB0aGUgcGNwdV9tYXNrcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQogCQkJY2xlYXJfYml0KGlycSwgcGNwdV9tYXNrc1tpXS5wY3B1X21hc2spOwpAQCAtMjAxLDggKzE2OCw5IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9pbnRyKHVuc2lnbmVkIGludCBpbnRyLCB1bnNpZ25lZCBpbnQgY3B1LAotCXVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBwb2xhcml0eSwgdW5zaWduZWQgaW50IHRyaWd0eXBlKQorc3RhdGljIHZvaWQgX19pbml0IGdpY19zZXR1cF9pbnRyKHVuc2lnbmVkIGludCBpbnRyLCB1bnNpZ25lZCBpbnQgY3B1LAorCXVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBwb2xhcml0eSwgdW5zaWduZWQgaW50IHRyaWd0eXBlLAorCXVuc2lnbmVkIGludCBmbGFncykKIHsKIAkvKiBTZXR1cCBJbnRyIHRvIFBpbiBtYXBwaW5nICovCiAJaWYgKHBpbiAmIEdJQ19NQVBfVE9fTk1JX01TSykgewpAQCAtMjI3LDM4ICsxOTUsNDMgQEAKIAlHSUNfU0VUX1RSSUdHRVIoaW50ciwgdHJpZ3R5cGUpOwogCiAJLyogSW5pdCBJbnRyIE1hc2tzICovCi0JR0lDX1NFVF9JTlRSX01BU0soaW50ciwgMCk7CisJR0lDX0NMUl9JTlRSX01BU0soaW50cik7CisJLyogSW5pdGlhbGlzZSBwZXItY3B1IEludGVycnVwdCBzb2Z0d2FyZSBtYXNrcyAqLworCWlmIChmbGFncyAmIEdJQ19GTEFHX0lQSSkKKwkJc2V0X2JpdChpbnRyLCBwY3B1X21hc2tzW2NwdV0ucGNwdV9tYXNrKTsKKwlpZiAoZmxhZ3MgJiBHSUNfRkxBR19UUkFOU1BBUkVOVCkKKwkJR0lDX1NFVF9JTlRSX01BU0soaW50cik7CisJaWYgKHRyaWd0eXBlID09IEdJQ19UUklHX0VER0UpCisJCWdpY19pcnFfZmxhZ3NbaW50cl0gfD0gR0lDX0lSUV9GTEFHX0VER0U7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnaWNfYmFzaWNfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGdpY19iYXNpY19pbml0KGludCBudW1pbnRycywgaW50IG51bXZwZXMsCisJCQlzdHJ1Y3QgZ2ljX2ludHJfbWFwICppbnRybWFwLCBpbnQgbWFwc2l6ZSkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgY3B1OwogCiAJLyogU2V0dXAgZGVmYXVsdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgR0lDX05VTV9JTlRSUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG51bWludHJzOyBpKyspIHsKIAkJR0lDX1NFVF9QT0xBUklUWShpLCBHSUNfUE9MX1BPUyk7CiAJCUdJQ19TRVRfVFJJR0dFUihpLCBHSUNfVFJJR19MRVZFTCk7Ci0JCUdJQ19TRVRfSU5UUl9NQVNLKGksIDApOworCQlHSUNfQ0xSX0lOVFJfTUFTSyhpKTsKKwkJaWYgKGkgPCBHSUNfTlVNX0lOVFJTKQorCQkJZ2ljX2lycV9mbGFnc1tpXSA9IDA7CiAJfQogCiAJLyogU2V0dXAgc3BlY2lmaWNzICovCi0JZm9yIChpID0gMDsgaSA8IF9tYXBzaXplOyBpKyspIHsKLQkJY3B1ID0gX2ludHJtYXBbaV0uY3B1bnVtOworCWZvciAoaSA9IDA7IGkgPCBtYXBzaXplOyBpKyspIHsKKwkJY3B1ID0gaW50cm1hcFtpXS5jcHVudW07CiAJCWlmIChjcHUgPT0gWCkKIAkJCWNvbnRpbnVlOwotCi0JCWlmIChjcHUgPT0gMCAmJiBpICE9IDAgJiYgX2ludHJtYXBbaV0uaW50cm51bSA9PSAwICYmCi0JCQkJCV9pbnRybWFwW2ldLmlwaWZsYWcgPT0gMCkKKwkJaWYgKGNwdSA9PSAwICYmIGkgIT0gMCAmJiBpbnRybWFwW2ldLmZsYWdzID09IDApCiAJCQljb250aW51ZTsKLQotCQlzZXR1cF9pbnRyKF9pbnRybWFwW2ldLmludHJudW0sCi0JCQkJX2ludHJtYXBbaV0uY3B1bnVtLAotCQkJCV9pbnRybWFwW2ldLnBpbiwKLQkJCQlfaW50cm1hcFtpXS5wb2xhcml0eSwKLQkJCQlfaW50cm1hcFtpXS50cmlndHlwZSk7Ci0JCS8qIEluaXRpYWxpc2UgcGVyLWNwdSBJbnRlcnJ1cHQgc29mdHdhcmUgbWFza3MgKi8KLQkJaWYgKF9pbnRybWFwW2ldLmlwaWZsYWcpCi0JCQlzZXRfYml0KF9pbnRybWFwW2ldLmludHJudW0sIHBjcHVfbWFza3NbY3B1XS5wY3B1X21hc2spOworCQlnaWNfc2V0dXBfaW50cihpLAorCQkJaW50cm1hcFtpXS5jcHVudW0sCisJCQlpbnRybWFwW2ldLnBpbiwKKwkJCWludHJtYXBbaV0ucG9sYXJpdHksCisJCQlpbnRybWFwW2ldLnRyaWd0eXBlLAorCQkJaW50cm1hcFtpXS5mbGFncyk7CiAJfQogCiAJdnBlX2xvY2FsX3NldHVwKG51bXZwZXMpOwpAQCAtMjczLDEyICsyNDYsMTEgQEAKIAkJICAgICB1bnNpZ25lZCBpbnQgaXJxYmFzZSkKIHsKIAl1bnNpZ25lZCBpbnQgZ2ljY29uZmlnOworCWludCBudW12cGVzLCBudW1pbnRyczsKIAogCV9naWNfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwX25vY2FjaGUoZ2ljX2Jhc2VfYWRkciwKIAkJCQkJCSAgICBnaWNfYWRkcnNwYWNlX3NpemUpOwogCV9pcnFiYXNlID0gaXJxYmFzZTsKLQlfaW50cm1hcCA9IGludHJfbWFwOwotCV9tYXBzaXplID0gaW50cl9tYXBfc2l6ZTsKIAogCUdJQ1JFQUQoR0lDX1JFRyhTSEFSRUQsIEdJQ19TSF9DT05GSUcpLCBnaWNjb25maWcpOwogCW51bWludHJzID0gKGdpY2NvbmZpZyAmIEdJQ19TSF9DT05GSUdfTlVNSU5UUlNfTVNLKSA+PgpAQCAtMjkwLDUgKzI2Miw1IEBACiAKIAlwcl9kZWJ1ZygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKLQlnaWNfYmFzaWNfaW5pdCgpOworCWdpY19iYXNpY19pbml0KG51bWludHJzLCBudW12cGVzLCBpbnRyX21hcCwgaW50cl9tYXBfc2l6ZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2tzcGQuYyBiL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCmluZGV4IGYyMzk3ZjAuLmFkNGUwMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCkBAIC0xNzIsMTMgKzE3MiwyMCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHNwX3NldGZzdWlkZ2lkKCB1aWRfdCB1aWQsIGdpZF90IGdpZCkKK3N0YXRpYyBpbnQgc3Bfc2V0ZnN1aWRnaWQodWlkX3QgdWlkLCBnaWRfdCBnaWQpCiB7Ci0JY3VycmVudC0+Y3JlZC0+ZnN1aWQgPSB1aWQ7Ci0JY3VycmVudC0+Y3JlZC0+ZnNnaWQgPSBnaWQ7CisJc3RydWN0IGNyZWQgKm5ldzsKIAotCWtleV9mc3VpZF9jaGFuZ2VkKGN1cnJlbnQpOwotCWtleV9mc2dpZF9jaGFuZ2VkKGN1cnJlbnQpOworCW5ldyA9IHByZXBhcmVfY3JlZHMoKTsKKwlpZiAoIW5ldykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXctPmZzdWlkID0gdWlkOworCW5ldy0+ZnNnaWQgPSBnaWQ7CisKKwljb21taXRfY3JlZHMobmV3KTsKKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTk2LDcgKzIwMyw3IEBACiAJbW1fc2VnbWVudF90IG9sZF9mczsKIAlzdHJ1Y3QgdGltZXZhbCB0djsKIAlzdHJ1Y3QgdGltZXpvbmUgdHo7Ci0JaW50IGNtZDsKKwlpbnQgZXJyLCBjbWQ7CiAKIAljaGFyICp2Y3dkOwogCWludCBzaXplOwpAQCAtMjI1LDggKzIzMiwxMSBAQAogCS8qIFJ1biB0aGUgc3lzY2FsbCBhdCB0aGUgcHJpdmlsZWdlIG9mIHRoZSB1c2VyIHdobyBsb2FkZWQgdGhlCiAJICAgU1AgcHJvZ3JhbSAqLwogCi0JaWYgKHZwZV9nZXR1aWQodGNsaW1pdCkpCi0JCXNwX3NldGZzdWlkZ2lkKHZwZV9nZXR1aWQodGNsaW1pdCksIHZwZV9nZXRnaWQodGNsaW1pdCkpOworCWlmICh2cGVfZ2V0dWlkKHRjbGltaXQpKSB7CisJCWVyciA9IHNwX3NldGZzdWlkZ2lkKHZwZV9nZXR1aWQodGNsaW1pdCksIHZwZV9nZXRnaWQodGNsaW1pdCkpOworCQlpZiAoIWVycikKKwkJCXByX2VycigiQ2hhbmdlIG9mIGNyZWRzIGZhaWxlZFxuIik7CisJfQogCiAJc3dpdGNoIChzYy5jbWQpIHsKIAkvKiBuZWVkcyB0aGUgZmxhZ3MgYXJndW1lbnQgdHJhbnNsYXRpbmcgZnJvbSBTREUga2l0IHRvCkBAIC0yODMsOCArMjkzLDExIEBACiAJCWJyZWFrOwogIAl9IC8qIHN3aXRjaCAqLwogCi0JaWYgKHZwZV9nZXR1aWQodGNsaW1pdCkpCi0JCXNwX3NldGZzdWlkZ2lkKCAwLCAwKTsKKwlpZiAodnBlX2dldHVpZCh0Y2xpbWl0KSkgeworCQllcnIgPSBzcF9zZXRmc3VpZGdpZCgwLCAwKTsKKwkJaWYgKCFlcnIpCisJCQlwcl9lcnIoInJlc3RvcmluZyBvbGQgY3JlZHMgZmFpbGVkXG4iKTsKKwl9CiAKIAlvbGRfZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoS0VSTkVMX0RTKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKaW5kZXggNjI0MmJjNi4uYjc3ZmVmYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKQEAgLTQyOCwzICs0MjgsOSBAQAogCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLCBuZXdzcCwgJnJlZ3MsIDAsCiAJICAgICAgICAgICAgICAgcGFyZW50X3RpZHB0ciwgY2hpbGRfdGlkcHRyKTsKIH0KKworYXNtbGlua2FnZSBsb25nIHN5czMyX2xvb2t1cF9kY29va2llKHUzMiBhMCwgdTMyIGExLCBjaGFyIF9fdXNlciAqYnVmLAorCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIHN5c19sb29rdXBfZGNvb2tpZShtZXJnZV82NChhMCwgYTEpLCBidWYsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3J0bHguYyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCmluZGV4IGExMGViZmQuLjM2NGYwNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCkBAIC03Miw4ICs3Miw5IEBACiAqLwogc3RhdGljIGlycXJldHVybl90IHJ0bHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgdnBlZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHZwZWZsYWdzOwogCiAJLyogT3VnaHQgbm90IHRvIGJlIHN0cmljdGx5IG5lY2Vzc2FyeSBmb3IgU01UQyBidWlsZHMgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CkBAIC0zOTIsMjAgKzM5MywxMiBAQAogCiBzdGF0aWMgaW50IGZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWludCBlcnI7Ci0KLQlsb2NrX2tlcm5lbCgpOwotCWVyciA9IHJ0bHhfb3BlbihtaW5vciwgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSA/IDAgOiAxKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gcnRseF9vcGVuKGltaW5vcihpbm9kZSksIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPyAwIDogMSk7CiB9CiAKIHN0YXRpYyBpbnQgZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0KLQlyZXR1cm4gcnRseF9yZWxlYXNlKG1pbm9yKTsKKwlyZXR1cm4gcnRseF9yZWxlYXNlKGltaW5vcihpbm9kZSkpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGZpbGVfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKaW5kZXggOWJiZjk3Ny4uMTRkZGU0YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUwpAQCAtNDUwLDcgKzQ1MCw3IEBACiAJUFRSCXN5c19pb19zdWJtaXQKIAlQVFIJc3lzX2lvX2NhbmNlbAkJCS8qIDQyNDUgKi8KIAlQVFIJc3lzX2V4aXRfZ3JvdXAKLQlQVFIJc3lzX2xvb2t1cF9kY29va2llCisJUFRSCXN5czMyX2xvb2t1cF9kY29va2llCiAJUFRSCXN5c19lcG9sbF9jcmVhdGUKIAlQVFIJc3lzX2Vwb2xsX2N0bAogCVBUUglzeXNfZXBvbGxfd2FpdAkJCS8qIDQyNTAgKi8KQEAgLTUwNSw3ICs1MDUsNyBAQAogCVBUUglzeXNfZmNobW9kYXQKIAlQVFIJc3lzX2ZhY2Nlc3NhdAkJCS8qIDQzMDAgKi8KIAlQVFIJY29tcGF0X3N5c19wc2VsZWN0NgotCVBUUglzeXNfcHBvbGwKKwlQVFIJY29tcGF0X3N5c19wcG9sbAogCVBUUglzeXNfdW5zaGFyZQogCVBUUglzeXNfc3BsaWNlCiAJUFRSCXN5czMyX3N5bmNfZmlsZV9yYW5nZQkJLyogNDMwNSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtY21wLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1jbXAuYwppbmRleCBhZDBmZjVkLi5jYzgxNzcxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC1jbXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtcC1jbXAuYwpAQCAtODAsMTEgKzgwLDExIEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBjbXBfc2VuZF9pcGlfbWFzayhjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3N0YXRpYyB2b2lkIGNtcF9zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKQogewogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgbWFzaykKKwlmb3JfZWFjaF9jcHUoaSwgbWFzaykKIAkJY21wX3NlbmRfaXBpX3NpbmdsZShpLCBhY3Rpb24pOwogfQogCkBAIC0xNzEsNyArMTcxLDcgQEAKIAogCWZvciAoaSA9IDE7IGkgPCBOUl9DUFVTOyBpKyspIHsKIAkJaWYgKGFtb25fY3B1X2F2YWlsKGkpKSB7Ci0JCQljcHVfc2V0KGksIGNwdV9wb3NzaWJsZV9tYXApOworCQkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKIAkJCV9fY3B1X251bWJlcl9tYXBbaV0JPSArK25jcHU7CiAJCQlfX2NwdV9sb2dpY2FsX21hcFtuY3B1XQk9IGk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCmluZGV4IDZmN2VlNWEuLjQzZTdjZGM1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKQEAgLTcwLDcgKzcwLDcgQEAKIAkJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHRtcCk7CiAKIAkJLyogUmVjb3JkIHRoaXMgYXMgYXZhaWxhYmxlIENQVSAqLwotCQljcHVfc2V0KHRjLCBjcHVfcG9zc2libGVfbWFwKTsKKwkJc2V0X2NwdV9wb3NzaWJsZSh0YywgdHJ1ZSk7CiAJCV9fY3B1X251bWJlcl9tYXBbdGNdCT0gKytuY3B1OwogCQlfX2NwdV9sb2dpY2FsX21hcFtuY3B1XQk9IHRjOwogCX0KQEAgLTE0MSwxMSArMTQxLDExIEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCB2c21wX3NlbmRfaXBpX21hc2soY3B1bWFza190IG1hc2ssIHVuc2lnbmVkIGludCBhY3Rpb24pCitzdGF0aWMgdm9pZCB2c21wX3NlbmRfaXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBhY3Rpb24pCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhpLCBtYXNrKQorCWZvcl9lYWNoX2NwdShpLCBtYXNrKQogCQl2c21wX3NlbmRfaXBpX3NpbmdsZShpLCBhY3Rpb24pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtcC11cC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtdXAuYwppbmRleCAyNTA4ZDU1Li4wMDUwMGZlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC11cC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLXVwLmMKQEAgLTE4LDcgKzE4LDggQEAKIAlwYW5pYyhLRVJOX0VSUiAiJXMgY2FsbGVkIiwgX19mdW5jX18pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBfc2VuZF9pcGlfbWFzayhjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cF9zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgYWN0aW9uKQogewogCXBhbmljKEtFUk5fRVJSICIlcyBjYWxsZWQiLCBfX2Z1bmNfXyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtcC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAuYwppbmRleCA2NDY2OGE5Li5lNzJlNjg0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgpAQCAtMTI4LDE5ICsxMjcsNiBAQAogCWNwdV9pZGxlKCk7CiB9CiAKLXZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpKGNwdW1hc2tfdCBtYXNrKQotewotCW1wX29wcy0+c2VuZF9pcGlfbWFzayhtYXNrLCBTTVBfQ0FMTF9GVU5DVElPTik7Ci19Ci0KLS8qCi0gKiBXZSByZXVzZSB0aGUgc2FtZSB2ZWN0b3IgZm9yIHRoZSBzaW5nbGUgSVBJCi0gKi8KLXZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KQotewotCW1wX29wcy0+c2VuZF9pcGlfbWFzayhjcHVtYXNrX29mX2NwdShjcHUpLCBTTVBfQ0FMTF9GVU5DVElPTik7Ci19Ci0KIC8qCiAgKiBDYWxsIGludG8gYm90aCBpbnRlcnJ1cHQgaGFuZGxlcnMsIGFzIHdlIHNoYXJlIHRoZSBJUEkgZm9yIHRoZW0KICAqLwpAQCAtMTgzLDE1ICsxNjksMTUgQEAKIAltcF9vcHMtPnByZXBhcmVfY3B1cyhtYXhfY3B1cyk7CiAJc2V0X2NwdV9zaWJsaW5nX21hcCgwKTsKICNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JY3B1X3ByZXNlbnRfbWFwID0gY3B1X3Bvc3NpYmxlX21hcDsKKwlpbml0X2NwdV9wcmVzZW50KCZjcHVfcG9zc2libGVfbWFwKTsKICNlbmRpZgogfQogCiAvKiBwcmVsb2FkIFNNUCBzdGF0ZSBmb3IgYm9vdCBjcHUgKi8KIHZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCiB7Ci0JY3B1X3NldCgwLCBjcHVfcG9zc2libGVfbWFwKTsKLQljcHVfc2V0KDAsIGNwdV9vbmxpbmVfbWFwKTsKKwlzZXRfY3B1X3Bvc3NpYmxlKDAsIHRydWUpOworCXNldF9jcHVfb25saW5lKDAsIHRydWUpOwogCWNwdV9zZXQoMCwgY3B1X2NhbGxpbl9tYXApOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtdGMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCmluZGV4IDFhNDY2YmEuLjI0NjMwZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCkBAIC03NSw3ICs3NSw2IEBACiAKIGFzaWR1c2Ugc210Y19saXZlX2FzaWRbTUFYX1NNVENfVExCU11bTUFYX1NNVENfQVNJRFNdOwogCi0KIC8qCiAgKiBOdW1iZXIgb2YgSW50ZXJQcm9jZXNzb3IgSW50ZXJydXB0IChJUEkpIG1lc3NhZ2UgYnVmZmVycyB0byBhbGxvY2F0ZQogICovCkBAIC0zMDUsNyArMzA0LDcgQEAKIAkgKi8KIAludGNzID0gKChyZWFkX2MwX212cGNvbmYwKCkgJiBNVlBDT05GMF9QVEMpID4+IE1WUENPTkYwX1BUQ19TSElGVCkgKyAxOwogCWZvciAoaT1zdGFydF9jcHVfc2xvdDsgaTxOUl9DUFVTICYmIGk8bnRjczsgaSsrKSB7Ci0JCWNwdV9zZXQoaSwgY3B1X3Bvc3NpYmxlX21hcCk7CisJCXNldF9jcHVfcG9zc2libGUoaSwgdHJ1ZSk7CiAJCV9fY3B1X251bWJlcl9tYXBbaV0gPSBpOwogCQlfX2NwdV9sb2dpY2FsX21hcFtpXSA9IGk7CiAJfQpAQCAtMzg4LDYgKzM4Nyw3IEBACiAJCUlQSVFbaV0uaGVhZCA9IElQSVFbaV0udGFpbCA9IE5VTEw7CiAJCXNwaW5fbG9ja19pbml0KCZJUElRW2ldLmxvY2spOwogCQlJUElRW2ldLmRlcHRoID0gMDsKKwkJSVBJUVtpXS5yZXNjaGVkX2ZsYWcgPSAwOyAvKiBObyByZXNjaGVkdWxlcyBxdWV1ZWQgaW5pdGlhbGx5ICovCiAJfQogCiAJLyogY3B1X2RhdGEgaW5kZXggc3RhcnRzIGF0IHplcm8gKi8KQEAgLTUyNSw4ICs1MjUsOCBAQAogCSAqIFB1bGwgYW55IHBoeXNpY2FsbHkgcHJlc2VudCBidXQgdW51c2VkIFRDcyBvdXQgb2YgY2lyY3VsYXRpb24uCiAJICovCiAJd2hpbGUgKHRjIDwgKCgodmFsICYgTVZQQ09ORjBfUFRDKSA+PiBNVlBDT05GMF9QVENfU0hJRlQpICsgMSkpIHsKLQkJY3B1X2NsZWFyKHRjLCBjcHVfcG9zc2libGVfbWFwKTsKLQkJY3B1X2NsZWFyKHRjLCBjcHVfcHJlc2VudF9tYXApOworCQlzZXRfY3B1X3Bvc3NpYmxlKHRjLCBmYWxzZSk7CisJCXNldF9jcHVfcHJlc2VudCh0YywgZmFsc2UpOwogCQl0YysrOwogCX0KIApAQCAtNzQxLDExICs3NDEsMjQgQEAKIHN0YXRpYyB2b2lkIHNtdGNfaXBpX3FkdW1wKHZvaWQpCiB7CiAJaW50IGk7CisJc3RydWN0IHNtdGNfaXBpICp0ZW1wOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX0NQVVMgO2krKykgewotCQlwcmludGsoIklQSVFbJWRdOiBoZWFkID0gMHgleCwgdGFpbCA9IDB4JXgsIGRlcHRoID0gJWRcbiIsCisJCXByX2luZm8oIklQSVFbJWRdOiBoZWFkID0gMHgleCwgdGFpbCA9IDB4JXgsIGRlcHRoID0gJWRcbiIsCiAJCQlpLCAodW5zaWduZWQpSVBJUVtpXS5oZWFkLCAodW5zaWduZWQpSVBJUVtpXS50YWlsLAogCQkJSVBJUVtpXS5kZXB0aCk7CisJCXRlbXAgPSBJUElRW2ldLmhlYWQ7CisKKwkJd2hpbGUgKHRlbXAgIT0gSVBJUVtpXS50YWlsKSB7CisJCQlwcl9kZWJ1ZygiJWQgJWQgJWQ6ICIsIHRlbXAtPnR5cGUsIHRlbXAtPmRlc3QsCisJCQkgICAgICAgKGludCl0ZW1wLT5hcmcpOworI2lmZGVmCVNNVENfSVBJX0RFQlVHCisJCSAgICBwcl9kZWJ1ZygiJXUgJWx1XG4iLCB0ZW1wLT5zZW5kZXIsIHRlbXAtPnN0YW1wKTsKKyNlbHNlCisJCSAgICBwcl9kZWJ1ZygiXG4iKTsKKyNlbmRpZgorCQkgICAgdGVtcCA9IHRlbXAtPmZsaW5rOworCQl9CiAJfQogfQogCkBAIC03ODQsMTEgKzc5NywxNiBAQAogCWludCBtdGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgdGNyZXN0YXJ0OwogCWV4dGVybiB2b2lkIHI0a193YWl0X2lycW9mZih2b2lkKSwgX19wYXN0d2FpdCh2b2lkKTsKKwlpbnQgc2V0X3Jlc2NoZWRfZmxhZyA9ICh0eXBlID09IExJTlVYX1NNUF9JUEkgJiYKKwkJCQlhY3Rpb24gPT0gU01QX1JFU0NIRURVTEVfWU9VUlNFTEYpOwogCiAJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKIAkJcHJpbnRrKCJDYW5ub3QgU2VuZCBJUEkgdG8gc2VsZiFcbiIpOwogCQlyZXR1cm47CiAJfQorCWlmIChzZXRfcmVzY2hlZF9mbGFnICYmIElQSVFbY3B1XS5yZXNjaGVkX2ZsYWcgIT0gMCkKKwkJcmV0dXJuOyAvKiBUaGVyZSBpcyBhIHJlc2NoZWR1bGUgcXVldWVkIGFscmVhZHkgKi8KKwogCS8qIFNldCB1cCBhIGRlc2NyaXB0b3IsIHRvIGJlIGRlbGl2ZXJlZCBlaXRoZXIgcHJvbXB0bHkgb3IgcXVldWVkICovCiAJcGlwaSA9IHNtdGNfaXBpX2RxKCZmcmVlSVBJcSk7CiAJaWYgKHBpcGkgPT0gTlVMTCkgewpAQCAtODAxLDYgKzgxOSw3IEBACiAJcGlwaS0+ZGVzdCA9IGNwdTsKIAlpZiAoY3B1X2RhdGFbY3B1XS52cGVfaWQgIT0gY3B1X2RhdGFbc21wX3Byb2Nlc3Nvcl9pZCgpXS52cGVfaWQpIHsKIAkJLyogSWYgbm90IG9uIHNhbWUgVlBFLCBlbnF1ZXVlIGFuZCBzZW5kIGNyb3NzLVZQRSBpbnRlcnJ1cHQgKi8KKwkJSVBJUVtjcHVdLnJlc2NoZWRfZmxhZyB8PSBzZXRfcmVzY2hlZF9mbGFnOwogCQlzbXRjX2lwaV9ucSgmSVBJUVtjcHVdLCBwaXBpKTsKIAkJTE9DS19DT1JFX1BSQSgpOwogCQlzZXR0YyhjcHVfZGF0YVtjcHVdLnRjX2lkKTsKQEAgLTg0Nyw2ICs4NjYsNyBAQAogCQkJICovCiAJCQl3cml0ZV90Y19jMF90Y2hhbHQoMCk7CiAJCQlVTkxPQ0tfQ09SRV9QUkEoKTsKKwkJCUlQSVFbY3B1XS5yZXNjaGVkX2ZsYWcgfD0gc2V0X3Jlc2NoZWRfZmxhZzsKIAkJCXNtdGNfaXBpX25xKCZJUElRW2NwdV0sIHBpcGkpOwogCQl9IGVsc2UgewogcG9zdGRpcmVjdDoKQEAgLTk5NiwxMiArMTAxNiwxNSBAQAogCQkgKiBhbHJlYWR5IGVuYWJsZWQuCiAJCSAqLwogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KIAkJc3Bpbl9sb2NrKCZxLT5sb2NrKTsKIAkJcGlwaSA9IF9fc210Y19pcGlfZHEocSk7CiAJCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKLQkJaWYgKHBpcGkgIT0gTlVMTCkKKwkJaWYgKHBpcGkgIT0gTlVMTCkgeworCQkJaWYgKHBpcGktPnR5cGUgPT0gTElOVVhfU01QX0lQSSAmJgorCQkJICAgIChpbnQpcGlwaS0+YXJnID09IFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGKQorCQkJCUlQSVFbY3B1XS5yZXNjaGVkX2ZsYWcgPSAwOwogCQkJaXBpX2RlY29kZShwaXBpKTsKKwkJfQogCQkvKgogCQkgKiBUaGUgdXNlIG9mIHRoZSBfX3Jhd19sb2NhbCByZXN0b3JlIGlzbid0CiAJCSAqIGFzIG9idmlvdXNseSBuZWNlc3NhcnkgaGVyZSBhcyBpbiBzbXRjX2lwaV9yZXBsYXkoKSwKQEAgLTEwODIsNiArMTEwNSw5IEBACiAJCQkJICogd2l0aCBpbnRlcnJ1cHRzIG9mZgogCQkJCSAqLwogCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQlpZiAocGlwaS0+dHlwZSA9PSBMSU5VWF9TTVBfSVBJICYmCisJCQkJICAgIChpbnQpcGlwaS0+YXJnID09IFNNUF9SRVNDSEVEVUxFX1lPVVJTRUxGKQorCQkJCQlJUElRW2NwdV0ucmVzY2hlZF9mbGFnID0gMDsKIAkJCQlpcGlfZGVjb2RlKHBpcGkpOwogCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJCX0KQEAgLTEwOTgsOSArMTEyNCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycV9pcGkgPSB7CiAJLmhhbmRsZXIJPSBpcGlfaW50ZXJydXB0LAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVELAotCS5uYW1lCQk9ICJTTVRDX0lQSSIsCi0JLmZsYWdzCQk9IElSUUZfUEVSQ1BVCisJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1BFUkNQVSwKKwkubmFtZQkJPSAiU01UQ19JUEkiCiB9OwogCiBzdGF0aWMgdm9pZCBzZXR1cF9jcm9zc192cGVfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgbnZwZSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3ByYW0uYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3ByYW0uYwppbmRleCA2ZGRiNTA3Li4xODIxZDEyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NwcmFtLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zcHJhbS5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAKLSNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2ZwdS5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTE5OCw4ICsxOTcsNyBAQAogCQlvZmZzZXQgKz0gMiAqIFNQUkFNX1RBR19TVFJJREU7CiAJfQogfQotCi1fX2NwdWluaXQgdm9pZCBzcHJhbV9jb25maWcodm9pZCkKK3ZvaWQgX19jcHVpbml0IHNwcmFtX2NvbmZpZyh2b2lkKQogewogCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgY29uZmlnMDsKQEAgLTIwOCw2ICsyMDYsNyBAQAogCWNhc2UgQ1BVXzI0SzoKIAljYXNlIENQVV8zNEs6CiAJY2FzZSBDUFVfNzRLOgorCWNhc2UgQ1BVXzEwMDRLOgogCQljb25maWcwID0gcmVhZF9jMF9jb25maWcoKTsKIAkJLyogRklYTUU6IGFkZHJlc3NlcyBhcmUgTWFsdGEgc3BlY2lmaWMgKi8KIAkJaWYgKGNvbmZpZzAgJiAoMTw8MjQpKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggMjc2OWJlZC4uMTYyYjI5OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTAsNyArMTAsMTYgQEAKIAl0ZXh0IFBUX0xPQUQgRkxBR1MoNyk7CS8qIFJXWCAqLwogCW5vdGUgUFRfTk9URSBGTEFHUyg0KTsJLyogUl9fICovCiB9Ci1qaWZmaWVzID0gSklGRklFUzsKKworI2lmZGVmIENPTkZJR18zMkJJVAorCSNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKwkJamlmZmllcyAgPSBqaWZmaWVzXzY0OworCSNlbHNlCisJCWppZmZpZXMgID0gamlmZmllc182NCArIDQ7CisJI2VuZGlmCisjZWxzZQorCWppZmZpZXMgID0gamlmZmllc182NDsKKyNlbmRpZgogCiBTRUNUSU9OUwogewpAQCAtMjksNyArMzgsNyBAQAogCS8qIC4gPSAweGE4MDAwMDAwMDAzMDAwMDA7ICovCiAJLiA9IDB4ZmZmZmZmZmY4MDMwMDAwMDsKICNlbmRpZgotCS4gPSBMT0FEQUREUjsKKwkuID0gVk1MSU5VWF9MT0FEX0FERFJFU1M7CiAJLyogcmVhZC1vbmx5ICovCiAJX3RleHQgPSAuOwkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YSAqLwogCS50ZXh0IDogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKaW5kZXggZWI2YzRjNS4uNjA0Nzc1MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3ZwZS5jCkBAIC0xNDQsMTQgKzE0NCwxNSBAQAogfTsKIAogc3RydWN0IHsKLQkvKiBWaXJ0dWFsIHByb2Nlc3NpbmcgZWxlbWVudHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHZwZV9saXN0OwotCi0JLyogVGhyZWFkIGNvbnRleHRzICovCi0Jc3RydWN0IGxpc3RfaGVhZCB0Y19saXN0OworCXNwaW5sb2NrX3QgdnBlX2xpc3RfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZwZV9saXN0OwkvKiBWaXJ0dWFsIHByb2Nlc3NpbmcgZWxlbWVudHMgKi8KKwlzcGlubG9ja190IHRjX2xpc3RfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRjX2xpc3Q7CS8qIFRocmVhZCBjb250ZXh0cyAqLwogfSB2cGVjb250cm9sID0gewotCS52cGVfbGlzdCA9IExJU1RfSEVBRF9JTklUKHZwZWNvbnRyb2wudnBlX2xpc3QpLAotCS50Y19saXN0ID0gTElTVF9IRUFEX0lOSVQodnBlY29udHJvbC50Y19saXN0KQorCS52cGVfbGlzdF9sb2NrCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS52cGVfbGlzdAk9IExJU1RfSEVBRF9JTklUKHZwZWNvbnRyb2wudnBlX2xpc3QpLAorCS50Y19saXN0X2xvY2sJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnRjX2xpc3QJPSBMSVNUX0hFQURfSU5JVCh2cGVjb250cm9sLnRjX2xpc3QpCiB9OwogCiBzdGF0aWMgdm9pZCByZWxlYXNlX3Byb2dtZW0odm9pZCAqcHRyKTsKQEAgLTE1OSwyOCArMTYwLDM4IEBACiAvKiBnZXQgdGhlIHZwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtaW5vciAqLwogc3RhdGljIHN0cnVjdCB2cGUgKmdldF92cGUoaW50IG1pbm9yKQogewotCXN0cnVjdCB2cGUgKnY7CisJc3RydWN0IHZwZSAqcmVzLCAqdjsKIAogCWlmICghY3B1X2hhc19taXBzbXQpCiAJCXJldHVybiBOVUxMOwogCisJcmVzID0gTlVMTDsKKwlzcGluX2xvY2soJnZwZWNvbnRyb2wudnBlX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCAmdnBlY29udHJvbC52cGVfbGlzdCwgbGlzdCkgewotCQlpZiAodi0+bWlub3IgPT0gbWlub3IpCi0JCQlyZXR1cm4gdjsKKwkJaWYgKHYtPm1pbm9yID09IG1pbm9yKSB7CisJCQlyZXMgPSB2OworCQkJYnJlYWs7CisJCX0KIAl9CisJc3Bpbl91bmxvY2soJnZwZWNvbnRyb2wudnBlX2xpc3RfbG9jayk7CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmVzOwogfQogCiAvKiBnZXQgdGhlIHZwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtaW5vciAqLwogc3RhdGljIHN0cnVjdCB0YyAqZ2V0X3RjKGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgdGMgKnQ7CisJc3RydWN0IHRjICpyZXMsICp0OwogCisJcmVzID0gTlVMTDsKKwlzcGluX2xvY2soJnZwZWNvbnRyb2wudGNfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ2cGVjb250cm9sLnRjX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHQtPmluZGV4ID09IGluZGV4KQotCQkJcmV0dXJuIHQ7CisJCWlmICh0LT5pbmRleCA9PSBpbmRleCkgeworCQkJcmVzID0gdDsKKwkJCWJyZWFrOworCQl9CiAJfQorCXNwaW5fdW5sb2NrKCZ2cGVjb250cm9sLnRjX2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE5MCwxNSArMjAxLDE3IEBACiB7CiAJc3RydWN0IHZwZSAqdjsKIAotCWlmICgodiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGUpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCWlmICgodiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGUpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJSU5JVF9MSVNUX0hFQUQoJnYtPnRjKTsKKwlzcGluX2xvY2soJnZwZWNvbnRyb2wudnBlX2xpc3RfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmdi0+bGlzdCwgJnZwZWNvbnRyb2wudnBlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZ2cGVjb250cm9sLnZwZV9saXN0X2xvY2spOwogCiAJSU5JVF9MSVNUX0hFQUQoJnYtPm5vdGlmeSk7CiAJdi0+bWlub3IgPSBtaW5vcjsKKwogCXJldHVybiB2OwogfQogCkBAIC0yMTIsNyArMjI1LDEwIEBACiAKIAlJTklUX0xJU1RfSEVBRCgmdGMtPnRjKTsKIAl0Yy0+aW5kZXggPSBpbmRleDsKKworCXNwaW5fbG9jaygmdnBlY29udHJvbC50Y19saXN0X2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJnRjLT5saXN0LCAmdnBlY29udHJvbC50Y19saXN0KTsKKwlzcGluX3VubG9jaygmdnBlY29udHJvbC50Y19saXN0X2xvY2spOwogCiBvdXQ6CiAJcmV0dXJuIHRjOwpAQCAtMjI3LDcgKzI0Myw3IEBACiAJa2ZyZWUodik7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBfbXRyZWdzKHZvaWQpCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBkdW1wX210cmVncyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwogCkBAIC0xMDQ4LDIwICsxMDY0LDE5IEBACiAJZW51bSB2cGVfc3RhdGUgc3RhdGU7CiAJc3RydWN0IHZwZV9ub3RpZmljYXRpb25zICpub3Q7CiAJc3RydWN0IHZwZSAqdjsKLQlpbnQgcmV0LCBlcnIgPSAwOworCWludCByZXQ7CiAKLQlsb2NrX2tlcm5lbCgpOwogCWlmIChtaW5vciAhPSBpbWlub3IoaW5vZGUpKSB7CiAJCS8qIGFzc3VtZSBvbmx5IDEgZGV2aWNlIGF0IHRoZSBtb21lbnQuICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlZQRSBsb2FkZXI6IG9ubHkgdnBlMSBpcyBzdXBwb3J0ZWRcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIG91dDsKKwkJcHJfd2FybmluZygiVlBFIGxvYWRlcjogb25seSB2cGUxIGlzIHN1cHBvcnRlZFxuIik7CisKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKCh2ID0gZ2V0X3ZwZSh0Y2xpbWl0KSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJWUEUgbG9hZGVyOiB1bmFibGUgdG8gZ2V0IHZwZVxuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0OworCQlwcl93YXJuaW5nKCJWUEUgbG9hZGVyOiB1bmFibGUgdG8gZ2V0IHZwZVxuIik7CisKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJc3RhdGUgPSB4Y2hnKCZ2LT5zdGF0ZSwgVlBFX1NUQVRFX0lOVVNFKTsKQEAgLTExMDEsOCArMTExNiw2IEBACiAJdi0+c2hhcmVkX3B0ciA9IE5VTEw7CiAJdi0+X19zdGFydCA9IDA7CiAKLW91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OTQsMTQgKzE2MDcsMTQgQEAKIHsKIAlzdHJ1Y3QgdnBlICp2LCAqbjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2LCBuLCAmdnBlY29udHJvbC52cGVfbGlzdCwgbGlzdCkgewotCQlpZiAodi0+c3RhdGUgIT0gVlBFX1NUQVRFX1VOVVNFRCkgewotCQkJcmVsZWFzZV92cGUodik7Ci0JCX0KLQl9Ci0KIAlkZXZpY2VfZGVsKCZ2cGVfZGV2aWNlKTsKIAl1bnJlZ2lzdGVyX2NocmRldihtYWpvciwgbW9kdWxlX25hbWUpOworCisJLyogTm8gbG9ja2luZyBuZWVkZWQgaGVyZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2LCBuLCAmdnBlY29udHJvbC52cGVfbGlzdCwgbGlzdCkgeworCQlpZiAodi0+c3RhdGUgIT0gVlBFX1NUQVRFX1VOVVNFRCkKKwkJCXJlbGVhc2VfdnBlKHYpOworCX0KIH0KIAogbW9kdWxlX2luaXQodnBlX21vZHVsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9zeXNjdGwuYyBiL2FyY2gvbWlwcy9sYXNhdC9zeXNjdGwuYwppbmRleCAzZjA0ZDRjLi5iM2RlZWQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvc3lzY3RsLmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L3N5c2N0bC5jCkBAIC01NiwxMiArNTYsMTIgQEAKIAogCiAvKiBBbmQgdGhlIHNhbWUgZm9yIHByb2MgKi8KLWludCBwcm9jX2RvbGFzYXRzdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2ludCBwcm9jX2RvbGFzYXRzdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgcjsKIAotCXIgPSBwcm9jX2Rvc3RyaW5nKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyID0gcHJvY19kb3N0cmluZyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJaWYgKCghd3JpdGUpIHx8IHIpCiAJCXJldHVybiByOwogCkBAIC03MSwxMiArNzEsMTIgQEAKIH0KIAogLyogcHJvYyBmdW5jdGlvbiB0byB3cml0ZSBFRVBST00gYWZ0ZXIgY2hhbmdpbmcgaW50IGVudHJ5ICovCi1pbnQgcHJvY19kb2xhc2F0aW50KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19kb2xhc2F0aW50KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IHI7CiAKLQlyID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJciA9IHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWlmICgoIXdyaXRlKSB8fCByKQogCQlyZXR1cm4gcjsKIApAQCAtODksNyArODksNyBAQAogc3RhdGljIGludCBydGN0bXA7CiAKIC8qIHByb2MgZnVuY3Rpb24gdG8gcmVhZC93cml0ZSBSZWFsVGltZSBDbG9jayAqLwotaW50IHByb2NfZG9sYXNhdHJ0YyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAoraW50IHByb2NfZG9sYXNhdHJ0YyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB0aW1lc3BlYyB0czsKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQlpZiAocnRjdG1wIDwgMCkKIAkJCXJ0Y3RtcCA9IDA7CiAJfQotCXIgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCkBAIC0xNTQsNyArMTU0LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0lORVQKLWludCBwcm9jX2xhc2F0X2lwKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19sYXNhdF9pcChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXVuc2lnbmVkIGludCBpcDsKQEAgLTIzMSwxMiArMjMxLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBwcm9jX2xhc2F0X3ByaWQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2ludCBwcm9jX2xhc2F0X3ByaWQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgcjsKIAotCXIgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJaWYgKHIgPCAwKQogCQlyZXR1cm4gcjsKIAlpZiAod3JpdGUpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vaXJxLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL2lycS5jCmluZGV4IGYzNjhjNzMuLmIzMmI0YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vaXJxLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9pcnEuYwpAQCAtNTUsNyArNTUsNiBAQAogCSAqIGludC1oYW5kbGVyIGlzIG5vdCBvbiBib290c3RyYXAKIAkgKi8KIAljbGVhcl9jMF9zdGF0dXMoU1QwX0lNIHwgU1QwX0JFVik7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAogCS8qIHNldHRpbmcgaXJxIHRyaWdnZXIgbW9kZSAqLwogCXNldF9pcnFfdHJpZ2dlcl9tb2RlKCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWF0aC1lbXUvZHBfc2ltcGxlLmMgYi9hcmNoL21pcHMvbWF0aC1lbXUvZHBfc2ltcGxlLmMKaW5kZXggMWM1NTVlNi4uZDlhZTFkYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21hdGgtZW11L2RwX3NpbXBsZS5jCisrKyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF9zaW1wbGUuYwpAQCAtNjIsOCArNjIsNiBAQAogCQlyZXR1cm4gaWVlZTc1NGRwX25hbnhjcHQoeSwgIm5lZyIpOwogCX0KIAotCWlmIChpZWVlNzU0ZHBfaXNuYW4oeCkpCS8qIGJ1dCBub3QgaW5maW5pdHkgKi8KLQkJcmV0dXJuIGllZWU3NTRkcF9uYW54Y3B0KHgsICJuZWciLCB4KTsKIAlyZXR1cm4geDsKIH0KIApAQCAtNzYsMTUgKzc0LDEyIEBACiAJQ0xFQVJDWDsKIAlGTFVTSFhEUDsKIAorCS8qIENsZWFyIHNpZ24gQUxXQVlTLCBpcnJlc3BlY3RpdmUgb2YgTmFOICovCisJRFBTSUdOKHgpID0gMDsKKwogCWlmICh4YyA9PSBJRUVFNzU0X0NMQVNTX1NOQU4pIHsKLQkJU0VUQ1goSUVFRTc1NF9JTlZBTElEX09QRVJBVElPTik7Ci0JCXJldHVybiBpZWVlNzU0ZHBfbmFueGNwdChpZWVlNzU0ZHBfaW5kZWYoKSwgIm5lZyIpOworCQlyZXR1cm4gaWVlZTc1NGRwX25hbnhjcHQoaWVlZTc1NGRwX2luZGVmKCksICJhYnMiKTsKIAl9CiAKLQlpZiAoaWVlZTc1NGRwX2lzbmFuKHgpKQkvKiBidXQgbm90IGluZmluaXR5ICovCi0JCXJldHVybiBpZWVlNzU0ZHBfbmFueGNwdCh4LCAiYWJzIiwgeCk7Ci0KLQkvKiBxdWljayBmaXggdXAgKi8KLQlEUFNJR04oeCkgPSAwOwogCXJldHVybiB4OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21hdGgtZW11L3NwX3NpbXBsZS5jIGIvYXJjaC9taXBzL21hdGgtZW11L3NwX3NpbXBsZS5jCmluZGV4IDc3MGYwZjQuLjMxNzU0NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF9zaW1wbGUuYworKysgYi9hcmNoL21pcHMvbWF0aC1lbXUvc3Bfc2ltcGxlLmMKQEAgLTYyLDggKzYyLDYgQEAKIAkJcmV0dXJuIGllZWU3NTRzcF9uYW54Y3B0KHksICJuZWciKTsKIAl9CiAKLQlpZiAoaWVlZTc1NHNwX2lzbmFuKHgpKQkvKiBidXQgbm90IGluZmluaXR5ICovCi0JCXJldHVybiBpZWVlNzU0c3BfbmFueGNwdCh4LCAibmVnIiwgeCk7CiAJcmV0dXJuIHg7CiB9CiAKQEAgLTc2LDE1ICs3NCwxMiBAQAogCUNMRUFSQ1g7CiAJRkxVU0hYU1A7CiAKKwkvKiBDbGVhciBzaWduIEFMV0FZUywgaXJyZXNwZWN0aXZlIG9mIE5hTiAqLworCVNQU0lHTih4KSA9IDA7CisKIAlpZiAoeGMgPT0gSUVFRTc1NF9DTEFTU19TTkFOKSB7Ci0JCVNFVENYKElFRUU3NTRfSU5WQUxJRF9PUEVSQVRJT04pOwogCQlyZXR1cm4gaWVlZTc1NHNwX25hbnhjcHQoaWVlZTc1NHNwX2luZGVmKCksICJhYnMiKTsKIAl9CiAKLQlpZiAoaWVlZTc1NHNwX2lzbmFuKHgpKQkvKiBidXQgbm90IGluZmluaXR5ICovCi0JCXJldHVybiBpZWVlNzU0c3BfbmFueGNwdCh4LCAiYWJzIiwgeCk7Ci0KLQkvKiBxdWljayBmaXggdXAgKi8KLQlTUFNJR04oeCkgPSAwOwogCXJldHVybiB4OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHNzaW0vc2ltX3NtdGMuYyBiL2FyY2gvbWlwcy9taXBzc2ltL3NpbV9zbXRjLmMKaW5kZXggZDZlNGY2NS4uNWRhMzBiNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHNzaW0vc2ltX3NtdGMuYworKysgYi9hcmNoL21pcHMvbWlwc3NpbS9zaW1fc210Yy5jCkBAIC00MywxMSArNDMsMTIgQEAKIAkvKiAiQ1BVIiBtYXkgYmUgVEMgb2Ygc2FtZSBWUEUsIFZQRSBvZiBzYW1lIENQVSwgb3IgZGlmZmVyZW50IENQVSAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3NtdGNfc2VuZF9pcGlfbWFzayhjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBzc210Y19zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYWN0aW9uKQogewogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgbWFzaykKKwlmb3JfZWFjaF9jcHUoaSwgbWFzaykKIAkJc3NtdGNfc2VuZF9pcGlfc2luZ2xlKGksIGFjdGlvbik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLW9jdGVvbi5jIGIvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKaW5kZXggMTBhYjY5Zi4uOTRlMDVlNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKKysrIGIvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkgKiBjb3JlcyBpdCBoYXMgYmVlbiB1c2VkIG9uCiAJICovCiAJaWYgKHZtYSkKLQkJbWFzayA9IHZtYS0+dm1fbW0tPmNwdV92bV9tYXNrOworCQltYXNrID0gKm1tX2NwdW1hc2sodm1hLT52bV9tbSk7CiAJZWxzZQogCQltYXNrID0gY3B1X29ubGluZV9tYXA7CiAJY3B1X2NsZWFyKGNwdSwgbWFzayk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vaW5pdC5jIGIvYXJjaC9taXBzL21tL2luaXQuYwppbmRleCAxNWFhMTkwLi44ZDFmNGYzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgpAQCAtMTMyLDcgKzEzMywxMCBAQAogCWluY19wcmVlbXB0X2NvdW50KCk7CiAJaWR4ID0gKGFkZHIgPj4gUEFHRV9TSElGVCkgJiAoRklYX05fQ09MT1VSUyAtIDEpOwogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQlpZHggKz0gRklYX05fQ09MT1VSUyAqIHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZHggKz0gRklYX05fQ09MT1VSUyAqIHNtcF9wcm9jZXNzb3JfaWQoKSArCisJCShpbl9pbnRlcnJ1cHQoKSA/IChGSVhfTl9DT0xPVVJTICogTlJfQ1BVUykgOiAwKTsKKyNlbHNlCisJaWR4ICs9IGluX2ludGVycnVwdCgpID8gRklYX05fQ09MT1VSUyA6IDA7CiAjZW5kaWYKIAl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0NNQVBfRU5EIC0gaWR4KTsKIAlwdGUgPSBta19wdGUocGFnZSwgUEFHRV9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3NjLW1pcHMuYyBiL2FyY2gvbWlwcy9tbS9zYy1taXBzLmMKaW5kZXggYjU1YzJkMS4uNWFiNWZhOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3NjLW1pcHMuYworKysgYi9hcmNoL21pcHMvbW0vc2MtbWlwcy5jCkBAIC0zMiw2ICszMiwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBtaXBzX3NjX2ludih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKKwl1bnNpZ25lZCBsb25nIGxzaXplID0gY3B1X3NjYWNoZV9saW5lX3NpemUoKTsKKwl1bnNpZ25lZCBsb25nIGFsbWFzayA9IH4obHNpemUgLSAxKTsKKworCWNhY2hlX29wKEhpdF9Xcml0ZWJhY2tfSW52X1NELCBhZGRyICYgYWxtYXNrKTsKKwljYWNoZV9vcChIaXRfV3JpdGViYWNrX0ludl9TRCwgKGFkZHIgKyBzaXplIC0gMSkgJiBhbG1hc2spOwogCWJsYXN0X2ludl9zY2FjaGVfcmFuZ2UoYWRkciwgYWRkciArIHNpemUpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWFtb24uYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtYW1vbi5jCmluZGV4IGRmOWU1MjYuLjQ2OWQ5YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtYW1vbi5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtYW1vbi5jCkBAIC03MCwxMSArNzAsMTIgQEAKIAlsYXVuY2gtPnNwID0gc3A7CiAJbGF1bmNoLT5hMCA9IGEwOwogCi0JLyogTWFrZSBzdXJlIHRhcmdldCBzZWVzIHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBnbyBiaXQgKi8KLQlzbXBfbWIoKTsKLQorCXNtcF93bWIoKTsgICAgICAgICAgICAgIC8qIFRhcmdldCBtdXN0IHNlZSBwYXJhbWV0ZXJzIGJlZm9yZSBnbyAqLwogCWxhdW5jaC0+ZmxhZ3MgfD0gTEFVTkNIX0ZHTzsKKwlzbXBfd21iKCk7ICAgICAgICAgICAgICAvKiBUYXJnZXQgbXVzdCBzZWUgZ28gYmVmb3JlIHdlIHBvbGwgICovCisKIAl3aGlsZSAoKGxhdW5jaC0+ZmxhZ3MgJiBMQVVOQ0hfRkdPTkUpID09IDApCiAJCTsKKwlzbXBfcm1iKCk7ICAgICAgLyogVGFyZ2V0IHdpbGwgYmUgdXBkYXRpbmcgZmxhZ3Mgc29vbiAqLwogCXByX2RlYnVnKCJsYXVuY2g6IGNwdSVkIGdvbmUhXG4iLCBjcHUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbnQuYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtaW50LmMKaW5kZXggM2UwYTliMy4uNGMzZmNhMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1pbnQuYworKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLWludC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJCWR1bW15ID0gQk9OSVRPX1BDSU1BUF9DRkc7CiAJCWlvYigpOyAgICAvKiBzeW5jICovCiAKLQkJaXJxID0gcmVhZGwoKHUzMiAqKV9wY2ljdHJsX2Jvbml0b19wY2ljZmcpOworCQlpcnEgPSBfX3Jhd19yZWFkbCgodTMyICopX3BjaWN0cmxfYm9uaXRvX3BjaWNmZyk7CiAJCWlvYigpOyAgICAvKiBzeW5jICovCiAJCWlycSAmPSAweGZmOwogCQlCT05JVE9fUENJTUFQX0NGRyA9IDA7CkBAIC0zNzksMzggKzM3OSw0MyBAQAogCiBzdGF0aWMgaW50IF9faW5pdGRhdGEgbXNjX25yX2VpY2lycXMgPSBBUlJBWV9TSVpFKG1zY19laWNpcnFtYXApOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVApCiAvKgogICogVGhpcyBHSUMgc3BlY2lmaWMgdGFidWxhciBhcnJheSBkZWZpbmVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIEV4dGVybmFsCiAgKiBJbnRlcnJ1cHRzIGFuZCBDUFVzL0NvcmUgSW50ZXJydXB0cy4gVGhlIG5hdHVyZSBvZiB0aGUgRXh0ZXJuYWwKICAqIEludGVycnVwdHMgaXMgYWxzbyBkZWZpbmVkIGhlcmUgLSBwb2xhcml0eS90cmlnZ2VyLgogICovCisKKyNkZWZpbmUgR0lDX0NQVV9OTUkgR0lDX01BUF9UT19OTUlfTVNLCiBzdGF0aWMgc3RydWN0IGdpY19pbnRyX21hcCBnaWNfaW50cl9tYXBbR0lDX05VTV9JTlRSU10gPSB7Ci0JeyBHSUNfRVhUX0lOVFIoMCksIAlYLAlYLAkJWCwgCQlYLAkJMCB9LAotCXsgR0lDX0VYVF9JTlRSKDEpLCAJWCwJWCwJCVgsIAkJWCwJCTAgfSwKLQl7IEdJQ19FWFRfSU5UUigyKSwgCVgsCVgsCQlYLCAJCVgsCQkwIH0sCi0JeyBHSUNfRVhUX0lOVFIoMyksIAkwLAlHSUNfQ1BVX0lOVDAsCUdJQ19QT0xfUE9TLCAJR0lDX1RSSUdfTEVWRUwsCTAgfSwKLQl7IEdJQ19FWFRfSU5UUig0KSwgCTAsCUdJQ19DUFVfSU5UMSwJR0lDX1BPTF9QT1MsIAlHSUNfVFJJR19MRVZFTCwJMCB9LAotCXsgR0lDX0VYVF9JTlRSKDUpLCAJMCwJR0lDX0NQVV9JTlQyLAlHSUNfUE9MX1BPUywgCUdJQ19UUklHX0xFVkVMLAkwIH0sCi0JeyBHSUNfRVhUX0lOVFIoNiksIAkwLAlHSUNfQ1BVX0lOVDMsCUdJQ19QT0xfUE9TLCAJR0lDX1RSSUdfTEVWRUwsCTAgfSwKLQl7IEdJQ19FWFRfSU5UUig3KSwgCTAsCUdJQ19DUFVfSU5UNCwJR0lDX1BPTF9QT1MsIAlHSUNfVFJJR19MRVZFTCwJMCB9LAotCXsgR0lDX0VYVF9JTlRSKDgpLCAJMCwJR0lDX0NQVV9JTlQzLAlHSUNfUE9MX1BPUywgCUdJQ19UUklHX0xFVkVMLAkwIH0sCi0JeyBHSUNfRVhUX0lOVFIoOSksIAkwLAlHSUNfQ1BVX0lOVDMsCUdJQ19QT0xfUE9TLCAJR0lDX1RSSUdfTEVWRUwsCTAgfSwKLQl7IEdJQ19FWFRfSU5UUigxMCksIAlYLAlYLAkJWCwgCQlYLAkJMCB9LAotCXsgR0lDX0VYVF9JTlRSKDExKSwgCVgsCVgsCQlYLCAJCVgsCQkwIH0sCi0JeyBHSUNfRVhUX0lOVFIoMTIpLCAJMCwJR0lDX0NQVV9JTlQzLAlHSUNfUE9MX1BPUywgCUdJQ19UUklHX0xFVkVMLAkwIH0sCi0JeyBHSUNfRVhUX0lOVFIoMTMpLCAJMCwJR0lDX01BUF9UT19OTUlfTVNLLAlHSUNfUE9MX1BPUywgR0lDX1RSSUdfTEVWRUwsCTAgfSwKLQl7IEdJQ19FWFRfSU5UUigxNCksIAkwLAlHSUNfTUFQX1RPX05NSV9NU0ssCUdJQ19QT0xfUE9TLCBHSUNfVFJJR19MRVZFTCwJMCB9LAotCXsgR0lDX0VYVF9JTlRSKDE1KSwgCVgsCVgsCQlYLCAJCVgsCQkwIH0sCi0vKiBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGdlbmVyYWwgaW50ZXJydXB0cyBub3cgd2UgZG8gSVBJIG9uZXMgKi8KKwl7IFgsIFgsCQkgICBYLAkJWCwJCTAgfSwKKwl7IFgsIFgsCQkgICBYLAkgCVgsCQkwIH0sCisJeyBYLCBYLAkJICAgWCwJCVgsCQkwIH0sCisJeyAwLCBHSUNfQ1BVX0lOVDAsIEdJQ19QT0xfUE9TLCBHSUNfVFJJR19MRVZFTCwgR0lDX0ZMQUdfVFJBTlNQQVJFTlQgfSwKKwl7IDAsIEdJQ19DUFVfSU5UMSwgR0lDX1BPTF9QT1MsIEdJQ19UUklHX0xFVkVMLCBHSUNfRkxBR19UUkFOU1BBUkVOVCB9LAorCXsgMCwgR0lDX0NQVV9JTlQyLCBHSUNfUE9MX1BPUywgR0lDX1RSSUdfTEVWRUwsIEdJQ19GTEFHX1RSQU5TUEFSRU5UIH0sCisJeyAwLCBHSUNfQ1BVX0lOVDMsIEdJQ19QT0xfUE9TLCBHSUNfVFJJR19MRVZFTCwgR0lDX0ZMQUdfVFJBTlNQQVJFTlQgfSwKKwl7IDAsIEdJQ19DUFVfSU5UNCwgR0lDX1BPTF9QT1MsIEdJQ19UUklHX0xFVkVMLCBHSUNfRkxBR19UUkFOU1BBUkVOVCB9LAorCXsgMCwgR0lDX0NQVV9JTlQzLCBHSUNfUE9MX1BPUywgR0lDX1RSSUdfTEVWRUwsIEdJQ19GTEFHX1RSQU5TUEFSRU5UIH0sCisJeyAwLCBHSUNfQ1BVX0lOVDMsIEdJQ19QT0xfUE9TLCBHSUNfVFJJR19MRVZFTCwgR0lDX0ZMQUdfVFJBTlNQQVJFTlQgfSwKKwl7IFgsIFgsCQkgICBYLAkJWCwJCTAgfSwKKwl7IFgsIFgsCQkgICBYLAkJWCwJCTAgfSwKKwl7IDAsIEdJQ19DUFVfSU5UMywgR0lDX1BPTF9QT1MsIEdJQ19UUklHX0xFVkVMLCBHSUNfRkxBR19UUkFOU1BBUkVOVCB9LAorCXsgMCwgR0lDX0NQVV9OTUksICBHSUNfUE9MX1BPUywgR0lDX1RSSUdfTEVWRUwsIEdJQ19GTEFHX1RSQU5TUEFSRU5UIH0sCisJeyAwLCBHSUNfQ1BVX05NSSwgIEdJQ19QT0xfUE9TLCBHSUNfVFJJR19MRVZFTCwgR0lDX0ZMQUdfVFJBTlNQQVJFTlQgfSwKKwl7IFgsIFgsCQkgICBYLAkJWCwJICAgICAgICAwIH0sCisJLyogVGhlIHJlbWFpbmRlciBvZiB0aGlzIHRhYmxlIGlzIGluaXRpYWxpc2VkIGJ5IGZpbGxfaXBpX21hcCAqLwogfTsKLSNlbmRpZgogCiAvKgogICogR0NNUCBuZWVkcyB0byBiZSBkZXRlY3RlZCBiZWZvcmUgYW55IFNNUCBpbml0aWFsaXNhdGlvbgogICovCiBpbnQgX19pbml0IGdjbXBfcHJvYmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CisJaWYgKG1pcHNfcmV2aXNpb25fc2NvbmlkICE9IE1JUFNfUkVWSVNJT05fU0NPTl9ST0NJVCkgeworCQlnY21wX3ByZXNlbnQgPSAwOworCQlyZXR1cm4gZ2NtcF9wcmVzZW50OworCX0KKwogCWlmIChnY21wX3ByZXNlbnQgPj0gMCkKIAkJcmV0dXJuIGdjbXBfcHJlc2VudDsKIApAQCAtNDE5LDIwICs0MjQsMzUgQEAKIAlnY21wX3ByZXNlbnQgPSAoR0NNUEdDQihHQ01QQikgJiBHQ01QX0dDQl9HQ01QQl9HQ01QQkFTRV9NU0spID09IEdDTVBfQkFTRV9BRERSOwogCiAJaWYgKGdjbXBfcHJlc2VudCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkdDTVAgcHJlc2VudFxuIik7CisJCXByX2RlYnVnKCJHQ01QIHByZXNlbnRcbiIpOwogCXJldHVybiBnY21wX3ByZXNlbnQ7CiB9CiAKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIElPQ1UncyBwcmVzZW50ICovCitpbnQgX19pbml0IGdjbXBfbmlvY3Uodm9pZCkKK3sKKyAgcmV0dXJuIGdjbXBfcHJlc2VudCA/CisgICAgKEdDTVBHQ0IoR0MpICYgR0NNUF9HQ0JfR0NfTlVNSU9DVV9NU0spID4+IEdDTVBfR0NCX0dDX05VTUlPQ1VfU0hGIDoKKyAgICAwOworfQorCisvKiBTZXQgR0NNUCByZWdpb24gYXR0cmlidXRlcyAqLwordm9pZCBfX2luaXQgZ2NtcF9zZXRyZWdpb24oaW50IHJlZ2lvbiwgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJICAgdW5zaWduZWQgbG9uZyBtYXNrLCBpbnQgdHlwZSkKK3sKKwlHQ01QR0NCbihDTXhCQVNFLCByZWdpb24pID0gYmFzZTsKKwlHQ01QR0NCbihDTXhNQVNLLCByZWdpb24pID0gbWFzayB8IHR5cGU7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNUCkKIHN0YXRpYyB2b2lkIF9faW5pdCBmaWxsX2lwaV9tYXAxKGludCBiYXNlaW50ciwgaW50IGNwdSwgaW50IGNwdXBpbikKIHsKIAlpbnQgaW50ciA9IGJhc2VpbnRyICsgY3B1OwotCWdpY19pbnRyX21hcFtpbnRyXS5pbnRybnVtID0gR0lDX0VYVF9JTlRSKGludHIpOwogCWdpY19pbnRyX21hcFtpbnRyXS5jcHVudW0gPSBjcHU7CiAJZ2ljX2ludHJfbWFwW2ludHJdLnBpbiA9IGNwdXBpbjsKIAlnaWNfaW50cl9tYXBbaW50cl0ucG9sYXJpdHkgPSBHSUNfUE9MX1BPUzsKIAlnaWNfaW50cl9tYXBbaW50cl0udHJpZ3R5cGUgPSBHSUNfVFJJR19FREdFOwotCWdpY19pbnRyX21hcFtpbnRyXS5pcGlmbGFnID0gMTsKKwlnaWNfaW50cl9tYXBbaW50cl0uZmxhZ3MgPSBHSUNfRkxBR19JUEk7CiAJaXBpX21hcFtjcHVdIHw9ICgxIDw8IChjcHVwaW4gKyAyKSk7CiB9CiAKQEAgLTQ0Nyw2ICs0NjcsMTIgQEAKIH0KICNlbmRpZgogCit2b2lkIF9faW5pdCBhcmNoX2luaXRfaXBpaXJxKGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKK3sKKwlzZXR1cF9pcnEoaXJxLCBhY3Rpb24pOworCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKK30KKwogdm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQogewogCWluaXRfaTgyNTlfaXJxcygpOwpAQCAtNDU4LDEyICs0ODQsMTcgQEAKIAkJR0NNUEdDQihHSUNCQSkgPSBHSUNfQkFTRV9BRERSIHwgR0NNUF9HQ0JfR0lDQkFfRU5fTVNLOwogCQlnaWNfcHJlc2VudCA9IDE7CiAJfSBlbHNlIHsKLQkJX21zYzAxX2JpdV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXBfbm9jYWNoZShNU0MwMV9CSVVfUkVHX0JBU0UsIE1TQzAxX0JJVV9BRERSU1BBQ0VfU1opOwotCQlnaWNfcHJlc2VudCA9IChSRUcoX21zYzAxX2JpdV9iYXNlLCBNU0MwMV9TQ19DRkcpICYKLQkJTVNDMDFfU0NfQ0ZHX0dJQ1BSRVNfTVNLKSA+PiBNU0MwMV9TQ19DRkdfR0lDUFJFU19TSEY7CisJCWlmIChtaXBzX3JldmlzaW9uX3Njb25pZCA9PSBNSVBTX1JFVklTSU9OX1NDT05fUk9DSVQpIHsKKwkJCV9tc2MwMV9iaXVfYmFzZSA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQlpb3JlbWFwX25vY2FjaGUoTVNDMDFfQklVX1JFR19CQVNFLAorCQkJCQkJTVNDMDFfQklVX0FERFJTUEFDRV9TWik7CisJCQlnaWNfcHJlc2VudCA9IChSRUcoX21zYzAxX2JpdV9iYXNlLCBNU0MwMV9TQ19DRkcpICYKKwkJCQkJTVNDMDFfU0NfQ0ZHX0dJQ1BSRVNfTVNLKSA+PgorCQkJCQlNU0MwMV9TQ19DRkdfR0lDUFJFU19TSEY7CisJCX0KIAl9CiAJaWYgKGdpY19wcmVzZW50KQotCQlwcmludGsoS0VSTl9ERUJVRyAiR0lDIHByZXNlbnRcbiIpOworCQlwcl9kZWJ1ZygiR0lDIHByZXNlbnRcbiIpOwogCiAJc3dpdGNoIChtaXBzX3JldmlzaW9uX3Njb25pZCkgewogCWNhc2UgTUlQU19SRVZJU0lPTl9TQ09OX1NPQ0lUOgpAQCAtNTI2LDE2ICs1NTcsMTYgQEAKIAkJCQkJCSZjb3JlaGlfaXJxYWN0aW9uKTsKIAl9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNUCkKIAlpZiAoZ2ljX3ByZXNlbnQpIHsKIAkJLyogRklYTUUgKi8KIAkJaW50IGk7Ci0KKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNUCkKIAkJZ2ljX2NhbGxfaW50X2Jhc2UgPSBHSUNfTlVNX0lOVFJTIC0gTlJfQ1BVUzsKIAkJZ2ljX3Jlc2NoZWRfaW50X2Jhc2UgPSBnaWNfY2FsbF9pbnRfYmFzZSAtIE5SX0NQVVM7Ci0KIAkJZmlsbF9pcGlfbWFwKCk7Ci0JCWdpY19pbml0KEdJQ19CQVNFX0FERFIsIEdJQ19BRERSU1BBQ0VfU1osIGdpY19pbnRyX21hcCwgQVJSQVlfU0laRShnaWNfaW50cl9tYXApLCBNSVBTX0dJQ19JUlFfQkFTRSk7CisjZW5kaWYKKwkJZ2ljX2luaXQoR0lDX0JBU0VfQUREUiwgR0lDX0FERFJTUEFDRV9TWiwgZ2ljX2ludHJfbWFwLAorCQkJCUFSUkFZX1NJWkUoZ2ljX2ludHJfbWFwKSwgTUlQU19HSUNfSVJRX0JBU0UpOwogCQlpZiAoIWdjbXBfcHJlc2VudCkgewogCQkJLyogRW5hYmxlIHRoZSBHSUMgKi8KIAkJCWkgPSBSRUcoX21zYzAxX2JpdV9iYXNlLCBNU0MwMV9TQ19DRkcpOwpAQCAtNTQzLDcgKzU3NCw3IEBACiAJCQkJKGkgfCAoMHgxIDw8IE1TQzAxX1NDX0NGR19HSUNFTkFfU0hGKSk7CiAJCQlwcl9kZWJ1ZygiR0lDIEVuYWJsZWRcbiIpOwogCQl9Ci0KKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNUCkKIAkJLyogc2V0IHVwIGlwaSBpbnRlcnJ1cHRzICovCiAJCWlmIChjcHVfaGFzX3ZpbnQpIHsKIAkJCXNldF92aV9oYW5kbGVyKE1JUFNDUFVfSU5UX0lQSTAsIG1hbHRhX2lwaV9pcnFkaXNwYXRjaCk7CkBAIC01NTYsMTYgKzU4NywxNCBAQAogCQl3cml0ZV9jMF9zdGF0dXMoMHgxMTAwZGMwMCk7CiAJCXByaW50aygiQ1BVJWQ6IHN0YXR1cyByZWdpc3RlciBmcmMgJTA4eFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWFkX2MwX3N0YXR1cygpKTsKIAkJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQkJc2V0dXBfaXJxKE1JUFNfR0lDX0lSUV9CQVNFICsKLQkJCQkJR0lDX1JFU0NIRURfSU5UKGkpLCAmaXJxX3Jlc2NoZWQpOwotCQkJc2V0dXBfaXJxKE1JUFNfR0lDX0lSUV9CQVNFICsKLQkJCQkJR0lDX0NBTExfSU5UKGkpLCAmaXJxX2NhbGwpOwotCQkJc2V0X2lycV9oYW5kbGVyKE1JUFNfR0lDX0lSUV9CQVNFICsKLQkJCQkJR0lDX1JFU0NIRURfSU5UKGkpLCBoYW5kbGVfcGVyY3B1X2lycSk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoTUlQU19HSUNfSVJRX0JBU0UgKwotCQkJCQlHSUNfQ0FMTF9JTlQoaSksIGhhbmRsZV9wZXJjcHVfaXJxKTsKKwkJCWFyY2hfaW5pdF9pcGlpcnEoTUlQU19HSUNfSVJRX0JBU0UgKworCQkJCQkgR0lDX1JFU0NIRURfSU5UKGkpLCAmaXJxX3Jlc2NoZWQpOworCQkJYXJjaF9pbml0X2lwaWlycShNSVBTX0dJQ19JUlFfQkFTRSArCisJCQkJCSBHSUNfQ0FMTF9JTlQoaSksICZpcnFfY2FsbCk7CiAJCX0KKyNlbmRpZgogCX0gZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVApCiAJCS8qIHNldCB1cCBpcGkgaW50ZXJydXB0cyAqLwogCQlpZiAoY3B1X2hhc192ZWljKSB7CiAJCQlzZXRfdmlfaGFuZGxlciAoTVNDMDFFX0lOVF9TVzAsIGlwaV9yZXNjaGVkX2Rpc3BhdGNoKTsKQEAgLTU4MCwxNCArNjA5LDEwIEBACiAJCQljcHVfaXBpX3Jlc2NoZWRfaXJxID0gTUlQU19DUFVfSVJRX0JBU0UgKyBNSVBTX0NQVV9JUElfUkVTQ0hFRF9JUlE7CiAJCQljcHVfaXBpX2NhbGxfaXJxID0gTUlQU19DUFVfSVJRX0JBU0UgKyBNSVBTX0NQVV9JUElfQ0FMTF9JUlE7CiAJCX0KLQotCQlzZXR1cF9pcnEoY3B1X2lwaV9yZXNjaGVkX2lycSwgJmlycV9yZXNjaGVkKTsKLQkJc2V0dXBfaXJxKGNwdV9pcGlfY2FsbF9pcnEsICZpcnFfY2FsbCk7Ci0KLQkJc2V0X2lycV9oYW5kbGVyKGNwdV9pcGlfcmVzY2hlZF9pcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKLQkJc2V0X2lycV9oYW5kbGVyKGNwdV9pcGlfY2FsbF9pcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKLQl9CisJCWFyY2hfaW5pdF9pcGlpcnEoY3B1X2lwaV9yZXNjaGVkX2lycSwgJmlycV9yZXNjaGVkKTsKKwkJYXJjaF9pbml0X2lwaWlycShjcHVfaXBpX2NhbGxfaXJxLCAmaXJxX2NhbGwpOwogI2VuZGlmCisJfQogfQogCiB2b2lkIG1hbHRhX2JlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtcGNpLmMgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXBjaS5jCmluZGV4IGI5NzQzMTkuLjJmYmZhMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtcGNpLmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1wY2kuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9ndDY0MTIwLmg+Ci0KKyNpbmNsdWRlIDxhc20vZ2NtcHJlZ3MuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9ib25pdG82NC5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9tc2MwMV9wY2kuaD4KQEAgLTIwMSw3ICsyMDEsMTEgQEAKIAkJbXNjX21lbV9yZXNvdXJjZS5zdGFydCA9IHN0YXJ0ICYgbWFzazsKIAkJbXNjX21lbV9yZXNvdXJjZS5lbmQgPSAoc3RhcnQgJiBtYXNrKSB8IH5tYXNrOwogCQltc2NfY29udHJvbGxlci5tZW1fb2Zmc2V0ID0gKHN0YXJ0ICYgbWFzaykgLSAobWFwICYgbWFzayk7Ci0KKyNpZmRlZiBDT05GSUdfTUlQU19DTVAKKwkJaWYgKGdjbXBfbmlvY3UoKSkKKwkJCWdjbXBfc2V0cmVnaW9uKDAsIHN0YXJ0LCBtYXNrLAorCQkJCUdDTVBfR0NCX0dDTVBCX0NNREVGVEdUX0lPQ1UxKTsKKyNlbmRpZgogCQlNU0NfUkVBRChNU0MwMV9QQ0lfU0MyUElPQkFTTCwgc3RhcnQpOwogCQlNU0NfUkVBRChNU0MwMV9QQ0lfU0MyUElPTVNLTCwgbWFzayk7CiAJCU1TQ19SRUFEKE1TQzAxX1BDSV9TQzJQSU9NQVBMLCBtYXApOwpAQCAtMjA5LDcgKzIxMywxMSBAQAogCQltc2NfaW9fcmVzb3VyY2UuZW5kID0gKG1hcCAmIG1hc2spIHwgfm1hc2s7CiAJCW1zY19jb250cm9sbGVyLmlvX29mZnNldCA9IDA7CiAJCWlvcG9ydF9yZXNvdXJjZS5lbmQgPSB+bWFzazsKLQorI2lmZGVmIENPTkZJR19NSVBTX0NNUAorCQlpZiAoZ2NtcF9uaW9jdSgpKQorCQkJZ2NtcF9zZXRyZWdpb24oMSwgc3RhcnQsIG1hc2ssCisJCQkJR0NNUF9HQ0JfR0NNUEJfQ01ERUZUR1RfSU9DVTEpOworI2VuZGlmCiAJCS8qIElmIHJhbmdlcyBvdmVybGFwIEkvTyB0YWtlcyBwcmVjZWRlbmNlLiAgKi8KIAkJc3RhcnQgPSBzdGFydCAmIG1hc2s7CiAJCWVuZCA9IHN0YXJ0IHwgfm1hc2s7CkBAIC0yNDEsMyArMjQ5LDE2IEBACiAKIAlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcihjb250cm9sbGVyKTsKIH0KKworLyogRW5hYmxlIFBDSSAyLjEgY29tcGF0aWJpbGl0eSBpbiBQSUlYNCAqLworc3RhdGljIHZvaWQgX19pbml0IHF1aXJrX2RsY3NldHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTggb2RsYywgbmRsYzsKKwkodm9pZCkgcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDgyLCAmb2RsYyk7CisJLyogRW5hYmxlIHBhc3NpdmUgcmVsZWFzZXMgYW5kIGRlbGF5ZWQgdHJhbnNhY3Rpb24gKi8KKwluZGxjID0gb2RsYyB8IDc7CisJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODIsIG5kbGMpOworfQorCitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMCwKKwlxdWlya19kbGNzZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXNtdGMuYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc210Yy5jCmluZGV4IDQ5OWZmZTUuLjE5MmNmZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc210Yy5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc210Yy5jCkBAIC0yMSwxMSArMjEsMTEgQEAKIAlzbXRjX3NlbmRfaXBpKGNwdSwgTElOVVhfU01QX0lQSSwgYWN0aW9uKTsKIH0KIAotc3RhdGljIHZvaWQgbXNtdGNfc2VuZF9pcGlfbWFzayhjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3N0YXRpYyB2b2lkIG1zbXRjX3NlbmRfaXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBhY3Rpb24pCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhpLCBtYXNrKQorCWZvcl9lYWNoX2NwdShpLCBtYXNrKQogCQltc210Y19zZW5kX2lwaV9zaW5nbGUoaSwgYWN0aW9uKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi9pbnQuYyBiL2FyY2gvbWlwcy9ueHAvcG54ODU1MC9jb21tb24vaW50LmMKaW5kZXggZjA4MGYxMS4uN2FjYTdkNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi9pbnQuYworKysgYi9hcmNoL21pcHMvbnhwL3BueDg1NTAvY29tbW9uL2ludC5jCkBAIC0xNzIsNyArMTcyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdGltZXJfYWN0aW9uID0gewogCS5oYW5kbGVyID0Jbm9fYWN0aW9uLAotCS5mbGFncyA9CUlSUUZfRElTQUJMRUQsCisJLmZsYWdzID0JSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCiAJLm5hbWUgPQkJIlRpbWVyIiwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ueHAvcG54ODU1MC9jb21tb24vdGltZS5jIGIvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi90aW1lLmMKaW5kZXggMThiMTkyNy4uODgzNmM2MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi90aW1lLmMKKysrIGIvYXJjaC9taXBzL254cC9wbng4NTUwL2NvbW1vbi90aW1lLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcG54OHh4eF90aW1lcl9pcnEgPSB7CiAJLmhhbmRsZXIJPSBwbng4eHh4X3RpbWVyX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUgfCBJUlFGX1RJTUVSLAogCS5uYW1lCQk9ICJwbng4eHh4X3RpbWVyIiwKIH07CiAKQEAgLTcyLDcgKzcyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbW9ub3RvbmljX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9IG1vbm90b25pY19pbnRlcnJ1cHQsCi0JLmZsYWdzID0gSVJRRl9ESVNBQkxFRCwKKwkuZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiwKIAkubmFtZSA9ICJNb25vdG9uaWMgdGltZXIiLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX2xvb25nc29uMi5jIGIvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX2xvb25nc29uMi5jCmluZGV4IDY1NWNiOGQuLjU3NWNkMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9sb29uZ3NvbjIuYworKysgYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbG9vbmdzb24yLmMKQEAgLTIyLDcgKzIyLDcgQEAKICAqIG90aGVyd2lzZSwgdGhlIG9wcm9maWxlIHRvb2wgd2lsbCBub3QgcmVjb2duaXplIHRoaXMgYW5kIGNvbXBsYWluIGFib3V0CiAgKiAiY3B1X3R5cGUgJ3Vuc2V0JyBpcyBub3QgdmFsaWQiLgogICovCi0jZGVmaW5lIExPT05HU09OMl9DUFVfVFlQRQkibWlwcy9nb2Rzb24yIgorI2RlZmluZSBMT09OR1NPTjJfQ1BVX1RZUEUJIm1pcHMvbG9vbmdzb24yIgogCiAjZGVmaW5lIExPT05HU09OMl9DT1VOVEVSMV9FVkVOVChldmVudCkJKChldmVudCAmIDB4MGYpIDw8IDUpCiAjZGVmaW5lIExPT05HU09OMl9DT1VOVEVSMl9FVkVOVChldmVudCkJKChldmVudCAmIDB4MGYpIDw8IDkpCkBAIC00NCw3ICs0NCw3IEBACiAJdW5zaWduZWQgaW50IGN0cmw7CiAJdW5zaWduZWQgbG9uZyBsb25nIHJlc2V0X2NvdW50ZXIxOwogCXVuc2lnbmVkIGxvbmcgbG9uZyByZXNldF9jb3VudGVyMjsKLQlpbnQgY250MV9lbmFsYmVkLCBjbnQyX2VuYWxiZWQ7CisJaW50IGNudDFfZW5hYmxlZCwgY250Ml9lbmFibGVkOwogfSByZWc7CiAKIERFRklORV9TUElOTE9DSyhzYW1wbGVfbG9jayk7CkBAIC04MSw4ICs4MSw4IEBACiAKIAlyZWcuY3RybCA9IGN0cmw7CiAKLQlyZWcuY250MV9lbmFsYmVkID0gY2ZnWzBdLmVuYWJsZWQ7Ci0JcmVnLmNudDJfZW5hbGJlZCA9IGNmZ1sxXS5lbmFibGVkOworCXJlZy5jbnQxX2VuYWJsZWQgPSBjZmdbMF0uZW5hYmxlZDsKKwlyZWcuY250Ml9lbmFibGVkID0gY2ZnWzFdLmVuYWJsZWQ7CiAKIH0KIApAQCAtOTksNyArOTksNyBAQAogc3RhdGljIHZvaWQgbG9vbmdzb24yX2NwdV9zdGFydCh2b2lkICphcmdzKQogewogCS8qIFN0YXJ0IGFsbCBjb3VudGVycyBvbiBjdXJyZW50IENQVSAqLwotCWlmIChyZWcuY250MV9lbmFsYmVkIHx8IHJlZy5jbnQyX2VuYWxiZWQpCisJaWYgKHJlZy5jbnQxX2VuYWJsZWQgfHwgcmVnLmNudDJfZW5hYmxlZCkKIAkJd3JpdGVfYzBfcGVyZmN0cmwocmVnLmN0cmwpOwogfQogCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkgKi8KIAogCS8qIENoZWNrIHdoZXRoZXIgdGhlIGlycSBiZWxvbmdzIHRvIG1lICovCi0JZW5hYmxlZCA9IHJlZy5jbnQxX2VuYWxiZWQgfCByZWcuY250Ml9lbmFsYmVkOworCWVuYWJsZWQgPSByZWcuY250MV9lbmFibGVkIHwgcmVnLmNudDJfZW5hYmxlZDsKIAlpZiAoIWVuYWJsZWQpCiAJCXJldHVybiBJUlFfTk9ORTsKIApAQCAtMTM2LDEyICsxMzYsMTIgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2FtcGxlX2xvY2ssIGZsYWdzKTsKIAogCWlmIChjb3VudGVyMSAmIExPT05HU09OMl9QRVJGQ05UX09WRVJGTE9XKSB7Ci0JCWlmIChyZWcuY250MV9lbmFsYmVkKQorCQlpZiAocmVnLmNudDFfZW5hYmxlZCkKIAkJCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgMCk7CiAJCWNvdW50ZXIxID0gcmVnLnJlc2V0X2NvdW50ZXIxOwogCX0KIAlpZiAoY291bnRlcjIgJiBMT09OR1NPTjJfUEVSRkNOVF9PVkVSRkxPVykgewotCQlpZiAocmVnLmNudDJfZW5hbGJlZCkKKwkJaWYgKHJlZy5jbnQyX2VuYWJsZWQpCiAJCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIDEpOwogCQljb3VudGVyMiA9IHJlZy5yZXNldF9jb3VudGVyMjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy1wbWNtc3AuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLXBtY21zcC5jCmluZGV4IDEwOWM5NWMuLjMyNTQ4YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLXBtY21zcC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLXBtY21zcC5jCkBAIC0zODUsNiArMzg1LDcgQEAKIAl1bnNpZ25lZCBsb25nIGludHI7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAlzdGF0aWMgY2hhciBwY2lpcnFmbGFnOworCWludCByZXQ7CiAjaWYgZGVmaW5lZChDT05GSUdfUE1DX01TUDcxMjBfR1cpIHx8IGRlZmluZWQoQ09ORklHX1BNQ19NU1A3MTIwX0VWQUwpCiAJdW5zaWduZWQgaW50CXZwZV9zdGF0dXM7CiAjZW5kaWYKQEAgLTQwMiwxMSArNDAzLDEzIEBACiAJICogYWxsb2NhdGlvbiBhc3NpZ25zIGFuIGludGVycnVwdCBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQuCiAJICovCiAJaWYgKHBjaWlycWZsYWcgPT0gMCkgewotCQlyZXF1ZXN0X2lycShNU1BfSU5UX1BDSSwvKiBIYXJkY29kZWQgaW50ZXJuYWwgTVNQNzEyMCB3aXJpbmcgKi8KKwkJcmV0ID0gcmVxdWVzdF9pcnEoTVNQX0lOVF9QQ0ksLyogSGFyZGNvZGVkIGludGVybmFsIE1TUDcxMjAgd2lyaW5nICovCiAJCQkJYnBjaV9pbnRlcnJ1cHQsCiAJCQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELAogCQkJCSJQTUMgTVNQIFBDSSBIb3N0IiwKIAkJCQlwcmVnKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAkJcGNpaXJxZmxhZyA9IH4wOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9zbXAuYwppbmRleCA4YWNlMjc3Li4zMjZmZTdhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9zbXAuYworKysgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9zbXAuYwpAQCAtOTcsMTEgKzk3LDExIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB5b3Nfc2VuZF9pcGlfbWFzayhjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3N0YXRpYyB2b2lkIHlvc19zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKQogewogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgbWFzaykKKwlmb3JfZWFjaF9jcHUoaSwgbWFzaykKIAkJeW9zX3NlbmRfaXBpX3NpbmdsZShpLCBhY3Rpb24pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1tZW1vcnkuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LW1lbW9yeS5jCmluZGV4IDA2MGQ4NTMuLmY2MWMxNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LW1lbW9yeS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LW1lbW9yeS5jCkBAIC00MjEsNyArNDIxLDcgQEAKIAogLyoKICAqIEEgbm9kZSB3aXRoIG5vdGhpbmcuICBXZSB1c2UgaXQgdG8gYXZvaWQgYW55IHNwZWNpYWwgY2FzaW5nIGluCi0gKiBub2RlX3RvX2NwdW1hc2sKKyAqIGNwdW1hc2tfb2Zfbm9kZQogICovCiBzdGF0aWMgc3RydWN0IG5vZGVfZGF0YSBudWxsX25vZGUgPSB7CiAJLmh1YiA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXNtcC5jIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctc21wLmMKaW5kZXggY2JjZDdlYi4uYzY4NTFkZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctc21wLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctc21wLmMKQEAgLTE2NSwxMSArMTY1LDExIEBACiAJUkVNT1RFX0hVQl9TRU5EX0lOVFIoQ09NUEFDVF9UT19OQVNJRF9OT0RFSUQoY3B1X3RvX25vZGUoZGVzdGlkKSksIGlycSk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwMjdfc2VuZF9pcGlfbWFzayhjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKK3N0YXRpYyB2b2lkIGlwMjdfc2VuZF9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGFjdGlvbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvcl9lYWNoX2NwdV9tYXNrKGksIG1hc2spCisJZm9yX2VhY2hfY3B1KGksIG1hc2spCiAJCWlwMjdfc2VuZF9pcGlfc2luZ2xlKGksIGFjdGlvbik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jCmluZGV4IDZkMGU1OWYuLmQ2ODAyZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAKIHN0cnVjdCBpcnFhY3Rpb24gaHViX3J0X2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlcgk9IGh1Yl9ydF9jb3VudGVyX2hhbmRsZXIsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1BFUkNQVSwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVIHwgSVJRRl9USU1FUiwKIAkubmFtZQkJPSAiaHViLXJ0IiwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYwppbmRleCBiYTU5ODM5Li40MDcwMjY4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCkBAIC0xMTcsMTAgKzExNyw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaXJxX2RpcnR5OwogCi0JaWYgKGNwdW1hc2tfd2VpZ2h0KG1hc2spICE9IDEpIHsKLQkJcHJpbnRrKCJhdHRlbXB0ZWQgdG8gc2V0IGlycSBhZmZpbml0eSBmb3IgaXJxICVkIHRvIG11bHRpcGxlIENQVXNcbiIsIGlycSk7Ci0JCXJldHVybiAtMTsKLQl9CiAJaSA9IGNwdW1hc2tfZmlyc3QobWFzayk7CiAKIAkvKiBDb252ZXJ0IGxvZ2ljYWwgQ1BVIHRvIHBoeXNpY2FsIENQVSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NtcC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NtcC5jCmluZGV4IDMxNDY5MTYuLjQ3YjM0N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zbXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc21wLmMKQEAgLTgyLDExICs4MiwxMiBAQAogCV9fcmF3X3dyaXRlcSgoKCh1NjQpYWN0aW9uKTw8IDQ4KSwgbWFpbGJveF8wX3NldF9yZWdzW2NwdV0pOwogfQogCi1zdGF0aWMgdm9pZCBiY20xNDgwX3NlbmRfaXBpX21hc2soY3B1bWFza190IG1hc2ssIHVuc2lnbmVkIGludCBhY3Rpb24pCitzdGF0aWMgdm9pZCBiY20xNDgwX3NlbmRfaXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCisJCQkJICB1bnNpZ25lZCBpbnQgYWN0aW9uKQogewogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgbWFzaykKKwlmb3JfZWFjaF9jcHUoaSwgbWFzaykKIAkJYmNtMTQ4MF9zZW5kX2lwaV9zaW5nbGUoaSwgYWN0aW9uKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vc2JfdGJwcm9mLmMgYi9hcmNoL21pcHMvc2lieXRlL2NvbW1vbi9zYl90YnByb2YuYwppbmRleCA2MzdhMTk0Li4xNWVhNzc4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL2NvbW1vbi9zYl90YnByb2YuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2NvbW1vbi9zYl90YnByb2YuYwpAQCAtNDAzLDM2ICs0MDMsMzEgQEAKIHN0YXRpYyBpbnQgc2Jwcm9mX3RiX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaW50IG1pbm9yOwotCWludCBlcnIgPSAwOwogCi0JbG9ja19rZXJuZWwoKTsKIAltaW5vciA9IGltaW5vcihpbm9kZSk7Ci0JaWYgKG1pbm9yICE9IDApIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChtaW5vciAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICh4Y2hnKCZzYnAub3BlbiwgU0JfT1BFTklORykgIT0gU0JfQ0xPU0VEKSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICh4Y2hnKCZzYnAub3BlbiwgU0JfT1BFTklORykgIT0gU0JfQ0xPU0VEKQorCQlyZXR1cm4gLUVCVVNZOwogCiAJbWVtc2V0KCZzYnAsIDAsIHNpemVvZihzdHJ1Y3Qgc2Jwcm9mX3RiKSk7CiAJc2JwLnNicHJvZl90YmJ1ZiA9IHZtYWxsb2MoTUFYX1RCU0FNUExFX0JZVEVTKTsKIAlpZiAoIXNicC5zYnByb2ZfdGJidWYpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCXNicC5vcGVuID0gU0JfQ0xPU0VEOworCQl3bWIoKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQorCiAJbWVtc2V0KHNicC5zYnByb2ZfdGJidWYsIDAsIE1BWF9UQlNBTVBMRV9CWVRFUyk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2JwLnRiX3N5bmMpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNicC50Yl9yZWFkKTsKIAltdXRleF9pbml0KCZzYnAubG9jayk7CiAKIAlzYnAub3BlbiA9IFNCX09QRU47CisJd21iKCk7CiAKLSAgb3V0OgotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNicHJvZl90Yl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQpAQCAtNDQwLDcgKzQzNSw3IEBACiAJaW50IG1pbm9yOwogCiAJbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWlmIChtaW5vciAhPSAwIHx8ICFzYnAub3BlbikKKwlpZiAobWlub3IgIT0gMCB8fCBzYnAub3BlbiAhPSBTQl9DTE9TRUQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJbXV0ZXhfbG9jaygmc2JwLmxvY2spOwpAQCAtNDQ5LDcgKzQ0NCw4IEBACiAJCXNicHJvZl96YnByb2Zfc3RvcCgpOwogCiAJdmZyZWUoc2JwLnNicHJvZl90YmJ1Zik7Ci0Jc2JwLm9wZW4gPSAwOworCXNicC5vcGVuID0gU0JfQ0xPU0VEOworCXdtYigpOwogCiAJbXV0ZXhfdW5sb2NrKCZzYnAubG9jayk7CiAKQEAgLTU4Myw3ICs1NzksOCBAQAogCX0KIAl0Yl9kZXYgPSBkZXY7CiAKLQlzYnAub3BlbiA9IDA7CisJc2JwLm9wZW4gPSBTQl9DTE9TRUQ7CisJd21iKCk7CiAJdGJfcGVyaW9kID0gemJidXNfbWh6ICogMTAwMDBMTDsKIAlwcl9pbmZvKERFVk5BTUUgIjogaW5pdGlhbGl6ZWQgLSB0Yl9wZXJpb2QgPSAlbGxkXG4iLAogCQkobG9uZyBsb25nKSB0Yl9wZXJpb2QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvc21wLmMgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYwppbmRleCBjYWQxNDAwLi5jMDBhNWNiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zbXAuYwpAQCAtNzAsMTEgKzcwLDEyIEBACiAJX19yYXdfd3JpdGVxKCgoKHU2NClhY3Rpb24pIDw8IDQ4KSwgbWFpbGJveF9zZXRfcmVnc1tjcHVdKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNiMTI1MF9zZW5kX2lwaV9tYXNrKGNwdW1hc2tfdCBtYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKQorc3RhdGljIGlubGluZSB2b2lkIHNiMTI1MF9zZW5kX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLAorCQkJCQl1bnNpZ25lZCBpbnQgYWN0aW9uKQogewogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgbWFzaykKKwlmb3JfZWFjaF9jcHUoaSwgbWFzaykKIAkJc2IxMjUwX3NlbmRfaXBpX3NpbmdsZShpLCBhY3Rpb24pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3N3YXJtL3NldHVwLmMgYi9hcmNoL21pcHMvc2lieXRlL3N3YXJtL3NldHVwLmMKaW5kZXggNjIzZmZjOS4uNTI3N2FhYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vc2V0dXAuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCWJyZWFrOwogCX0KIAl0cy0+dHZfc2VjID0gc2VjOwotCXR2LT50dl9uc2VjID0gMDsKKwl0cy0+dHZfbnNlYyA9IDA7CiB9CiAKIGludCBydGNfbWlwc19zZXRfdGltZSh1bnNpZ25lZCBsb25nIHNlYykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zbmkvdGltZS5jIGIvYXJjaC9taXBzL3NuaS90aW1lLmMKaW5kZXggNjJkZjZhNS4uZjNiNjBlNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NuaS90aW1lLmMKKysrIGIvYXJjaC9taXBzL3NuaS90aW1lLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gYTIwcl9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIJPSBhMjByX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUgfCBJUlFGX1RJTUVSLAogCS5uYW1lCQk9ICJhMjByLXRpbWVyIiwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXAuYyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXAuYwppbmRleCBjODYwODEwLi5lMTAxODRjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zZXR1cC5jCkBAIC04NSw3ICs4NSw3IEBACiBzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCiB7CiAJaWYgKCFzdHJjbXAoaWQsICJzcGktYmFzZWNsayIpKQotCQlyZXR1cm4gKHN0cnVjdCBjbGsgKikoKHVuc2lnbmVkIGxvbmcpdHh4OV9nYnVzX2Nsb2NrIC8gMiAvIDQpOworCQlyZXR1cm4gKHN0cnVjdCBjbGsgKikoKHVuc2lnbmVkIGxvbmcpdHh4OV9nYnVzX2Nsb2NrIC8gMiAvIDIpOwogCWlmICghc3RyY21wKGlkLCAiaW1idXNfY2xrIikpCiAJCXJldHVybiAoc3RydWN0IGNsayAqKSgodW5zaWduZWQgbG9uZyl0eHg5X2didXNfY2xvY2sgLyAyKTsKIAlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKQEAgLTgxNyw3ICs4MTcsOCBAQAogb3V0X3BkZXY6CiAJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKIG91dF9ncGlvOgotCWdwaW9fcmVtb3ZlKCZpb2NsZWQtPmNoaXApOworCWlmIChncGlvY2hpcF9yZW1vdmUoJmlvY2xlZC0+Y2hpcCkpCisJCXJldHVybjsKIG91dF91bm1hcDoKIAlpb3VubWFwKGlvY2xlZC0+bW1pb2FkZHIpOwogb3V0X2ZyZWU6CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IGE5ZTJlMzQuLmNiMjk0YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0zOCwxMyArMzgsMTMgQEAKICNkZWZpbmUgZW50ZXJfbGF6eV90bGIobW0sIHRzaykJZG8ge30gd2hpbGUgKDApCiAKICNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIGNwdV9yYW5fdm0oY3B1LCB0YXNrKSBcCi0JY3B1X3NldCgoY3B1KSwgKHRhc2spLT5jcHVfdm1fbWFzaykKLSNkZWZpbmUgY3B1X21heWJlX3Jhbl92bShjcHUsIHRhc2spIFwKLQljcHVfdGVzdF9hbmRfc2V0KChjcHUpLCAodGFzayktPmNwdV92bV9tYXNrKQorI2RlZmluZSBjcHVfcmFuX3ZtKGNwdSwgbW0pIFwKKwljcHVtYXNrX3NldF9jcHUoKGNwdSksIG1tX2NwdW1hc2sobW0pKQorI2RlZmluZSBjcHVfbWF5YmVfcmFuX3ZtKGNwdSwgbW0pIFwKKwljcHVtYXNrX3Rlc3RfYW5kX3NldF9jcHUoKGNwdSksIG1tX2NwdW1hc2sobW0pKQogI2Vsc2UKLSNkZWZpbmUgY3B1X3Jhbl92bShjcHUsIHRhc2spCQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgY3B1X21heWJlX3Jhbl92bShjcHUsIHRhc2spCXRydWUKKyNkZWZpbmUgY3B1X3Jhbl92bShjcHUsIG1tKQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNwdV9tYXliZV9yYW5fdm0oY3B1LCBtbSkJdHJ1ZQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDhhM2E0ZGQuLjE2N2UxMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTI5LDQyICsxMjksNDcgQEAKIHN0cnVjdCBfX2xhcmdlX3N0cnVjdCB7IHVuc2lnbmVkIGxvbmcgYnVmWzEwMF07IH07CiAjZGVmaW5lIF9fbSh4KSAoKihzdHJ1Y3QgX19sYXJnZV9zdHJ1Y3QgKikoeCkpCiAKLSNkZWZpbmUgX19nZXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJXAotKHsJCQkJCQlcCi0JX190eXBlb2YoKihwdHIpKSBfX2d1X3ZhbDsJCVwKLQl1bnNpZ25lZCBsb25nIF9fZ3VfYWRkcjsJCVwKLQlpbnQgX19ndV9lcnI7CQkJCVwKLQlfX2d1X2FkZHIgPSAodW5zaWduZWQgbG9uZykgKHB0cik7CVwKLQlzd2l0Y2ggKHNpemUpIHsJCQkJXAotCWNhc2UgMTogIF9fZ2V0X3VzZXJfYXNtKCJidSIpOyBicmVhazsJXAotCWNhc2UgMjogIF9fZ2V0X3VzZXJfYXNtKCJodSIpOyBicmVhazsJXAotCWNhc2UgNDogIF9fZ2V0X3VzZXJfYXNtKCIiICApOyBicmVhazsJXAotCWRlZmF1bHQ6IF9fZ2V0X3VzZXJfdW5rbm93bigpOyBicmVhazsJXAotCX0JCQkJCVwKLQl4ID0gKF9fdHlwZW9mX18oKihwdHIpKSkgX19ndV92YWw7CVwKLQlfX2d1X2VycjsJCQkJXAorI2RlZmluZSBfX2dldF91c2VyX25vY2hlY2soeCwgcHRyLCBzaXplKQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fZ3VfYWRkcjsJCQkJCVwKKwlpbnQgX19ndV9lcnI7CQkJCQkJCVwKKwlfX2d1X2FkZHIgPSAodW5zaWduZWQgbG9uZykgKHB0cik7CQkJCVwKKwlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAorCWNhc2UgMTogewkJCQkJCQlcCisJCXVuc2lnbmVkIGNoYXIgX19ndV92YWw7CQkJCQlcCisJCV9fZ2V0X3VzZXJfYXNtKCJidSIpOwkJCQkJXAorCQkoeCkgPSAqKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpKikgJl9fZ3VfdmFsOwkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwljYXNlIDI6IHsJCQkJCQkJXAorCQl1bnNpZ25lZCBzaG9ydCBfX2d1X3ZhbDsJCQkJXAorCQlfX2dldF91c2VyX2FzbSgiaHUiKTsJCQkJCVwKKwkJKHgpID0gKihfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSopICZfX2d1X3ZhbDsJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJY2FzZSA0OiB7CQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fZ3VfdmFsOwkJCQkJXAorCQlfX2dldF91c2VyX2FzbSgiIik7CQkJCQlcCisJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkqKSAmX19ndV92YWw7CQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWRlZmF1bHQ6CQkJCQkJCVwKKwkJX19nZXRfdXNlcl91bmtub3duKCk7CQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCV9fZ3VfZXJyOwkJCQkJCQlcCiB9KQogCi0jZGVmaW5lIF9fZ2V0X3VzZXJfY2hlY2soeCwgcHRyLCBzaXplKQkJCVwKLSh7CQkJCQkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgX19ndV92YWw7CQkJXAotCXVuc2lnbmVkIGxvbmcgX19ndV9hZGRyOwkJCVwKLQlpbnQgX19ndV9lcnI7CQkJCQlcCi0JX19ndV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIChwdHIpOwkJXAotCWlmIChsaWtlbHkoX19hY2Nlc3Nfb2soX19ndV9hZGRyLHNpemUpKSkgewlcCi0JCXN3aXRjaCAoc2l6ZSkgewkJCQlcCi0JCWNhc2UgMTogIF9fZ2V0X3VzZXJfYXNtKCJidSIpOyBicmVhazsJXAotCQljYXNlIDI6ICBfX2dldF91c2VyX2FzbSgiaHUiKTsgYnJlYWs7CVwKLQkJY2FzZSA0OiAgX19nZXRfdXNlcl9hc20oIiIgICk7IGJyZWFrOwlcCi0JCWRlZmF1bHQ6IF9fZ2V0X3VzZXJfdW5rbm93bigpOyBicmVhazsJXAotCQl9CQkJCQlcCi0JfQkJCQkJCVwKLQllbHNlIHsJCQkJCQlcCi0JCV9fZ3VfZXJyID0gLUVGQVVMVDsJCQlcCi0JCV9fZ3VfdmFsID0gMDsJCQkJXAotCX0JCQkJCQlcCi0JeCA9IChfX3R5cGVvZl9fKCoocHRyKSkpIF9fZ3VfdmFsOwkJXAotCV9fZ3VfZXJyOwkJCQkJXAorI2RlZmluZSBfX2dldF91c2VyX2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWludCBfZTsJCQkJCQkJCVwKKwlpZiAobGlrZWx5KF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKSAocHRyKSwgKHNpemUpKSkpCQlcCisJCV9lID0gX19nZXRfdXNlcl9ub2NoZWNrKCh4KSwgKHB0ciksIChzaXplKSk7CQlcCisJZWxzZSB7CQkJCQkJCQlcCisJCV9lID0gLUVGQVVMVDsJCQkJCQlcCisJCSh4KSA9IChfX3R5cGVvZl9fKHgpKTA7CQkJCQlcCisJfQkJCQkJCQkJXAorCV9lOwkJCQkJCQkJXAogfSkKIAogI2RlZmluZSBfX2dldF91c2VyX2FzbShJTlNOKQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDgyYjQwMDcuLjAyZGM3ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAlPRkZTRVQoX19yeF9idWZmZXIsCQltbjEwMzAwX3NlcmlhbF9wb3J0LCByeF9idWZmZXIpOwogCU9GRlNFVChfX3J4X2lucCwJCW1uMTAzMDBfc2VyaWFsX3BvcnQsIHJ4X2lucCk7CiAJT0ZGU0VUKF9fcnhfb3V0cCwJCW1uMTAzMDBfc2VyaWFsX3BvcnQsIHJ4X291dHApOwotCU9GRlNFVChfX3R4X2luZm9fYnVmZmVyLAltbjEwMzAwX3NlcmlhbF9wb3J0LCB1YXJ0LmluZm8pOworCU9GRlNFVChfX3VhcnRfc3RhdGUsCQltbjEwMzAwX3NlcmlhbF9wb3J0LCB1YXJ0LnN0YXRlKTsKIAlPRkZTRVQoX190eF94Y2hhciwJCW1uMTAzMDBfc2VyaWFsX3BvcnQsIHR4X3hjaGFyKTsKIAlPRkZTRVQoX190eF9icmVhaywJCW1uMTAzMDBfc2VyaWFsX3BvcnQsIHR4X2JyZWFrKTsKIAlPRkZTRVQoX19pbnRyX2ZsYWdzLAkJbW4xMDMwMF9zZXJpYWxfcG9ydCwgaW50cl9mbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCA4MGQ0MjNiLi5hNDgxYjA0IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTI3LDkgKzI3LDggQEAKICAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IGhhdmluZyBhIHNwZWNpYWwKICAqICJpbml0X3Rhc2siIGxpbmtlciBtYXAgZW50cnkuLgogICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIikpKSA9Ci0JCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07Cit1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gX19pbml0X3Rhc2tfZGF0YSA9CisJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKIAogLyoKICAqIEluaXRpYWwgdGFzayBzdHJ1Y3R1cmUuCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLWxvdy5TIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXNlcmlhbC1sb3cuUwppbmRleCAyMjQ0ODUzLi42NjcwMmQyIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLWxvdy5TCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwtbG93LlMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCW9yCWQyLGQyCiAJYm5lCW1uc2NfdmRtYV90eF94Y2hhcgogCi0JbW92CShfX3R4X2luZm9fYnVmZmVyLGEzKSxhMiAjIGdldCB0aGUgdWFydF9pbmZvIHN0cnVjdCBmb3IgVHgKKwltb3YJKF9fdWFydF9zdGF0ZSxhMyksYTIJIyBzZWUgaWYgdGhlIFRUWSBUeCBxdWV1ZSBoYXMgYW55dGhpbmcgaW4gaXQKIAltb3YJKF9feG1pdF90YWlsLGEyKSxkMwogCW1vdgkoX194bWl0X2hlYWQsYTIpLGQyCiAJY21wCWQzLGQyCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmMKaW5kZXggMmZkNTk2Ni4uMjI5YjcxMCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXNlcmlhbC5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwuYwpAQCAtMzkxLDcgKzM5MSw3IEBACiBzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF9yZWNlaXZlX2ludGVycnVwdChzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9pY291bnQgKmljb3VudCA9ICZwb3J0LT51YXJ0Lmljb3VudDsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dWFydC5pbmZvLT5wb3J0LnR0eTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dWFydC5zdGF0ZS0+cG9ydC50dHk7CiAJdW5zaWduZWQgaXg7CiAJaW50IGNvdW50OwogCXU4IHN0LCBjaCwgcHVzaCwgc3RhdHVzLCBvdmVycnVuOwpAQCAtNTY2LDE2ICs1NjYsMTYgQEAKIHsKIAlfZW50ZXIoIiVzIiwgcG9ydC0+bmFtZSk7CiAKLQlpZiAoIXBvcnQtPnVhcnQuaW5mbyB8fCAhcG9ydC0+dWFydC5pbmZvLT5wb3J0LnR0eSkgeworCWlmICghcG9ydC0+dWFydC5zdGF0ZSB8fCAhcG9ydC0+dWFydC5zdGF0ZS0+cG9ydC50dHkpIHsKIAkJbW4xMDMwMF9zZXJpYWxfZGlzX3R4X2ludHIocG9ydCk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAodWFydF90eF9zdG9wcGVkKCZwb3J0LT51YXJ0KSB8fAotCSAgICB1YXJ0X2NpcmNfZW1wdHkoJnBvcnQtPnVhcnQuaW5mby0+eG1pdCkpCisJICAgIHVhcnRfY2lyY19lbXB0eSgmcG9ydC0+dWFydC5zdGF0ZS0+eG1pdCkpCiAJCW1uMTAzMDBfc2VyaWFsX2Rpc190eF9pbnRyKHBvcnQpOwogCi0JaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKCZwb3J0LT51YXJ0LmluZm8tPnhtaXQpIDwgV0FLRVVQX0NIQVJTKQorCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZygmcG9ydC0+dWFydC5zdGF0ZS0+eG1pdCkgPCBXQUtFVVBfQ0hBUlMpCiAJCXVhcnRfd3JpdGVfd2FrZXVwKCZwb3J0LT51YXJ0KTsKIH0KIApAQCAtNTk2LDcgKzU5Niw3IEBACiAJKnBvcnQtPl9jb250cm9sID0gY3RyOwogCiAJdWFydF9oYW5kbGVfY3RzX2NoYW5nZSgmcG9ydC0+dWFydCwgc3QgJiBTQzJTVFJfQ1RTKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPnVhcnQuaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+dWFydC5zdGF0ZS0+cG9ydC5kZWx0YV9tc3Jfd2FpdCk7CiB9CiAKIC8qCkBAIC03MDUsOCArNzA1LDggQEAKIAogCV9lbnRlcigiJXN7JWx1fSIsCiAJICAgICAgIHBvcnQtPm5hbWUsCi0JICAgICAgIENJUkNfQ05UKCZwb3J0LT51YXJ0LmluZm8tPnhtaXQuaGVhZCwKLQkJCSZwb3J0LT51YXJ0LmluZm8tPnhtaXQudGFpbCwKKwkgICAgICAgQ0lSQ19DTlQoJnBvcnQtPnVhcnQuc3RhdGUtPnhtaXQuaGVhZCwKKwkJCSZwb3J0LT51YXJ0LnN0YXRlLT54bWl0LnRhaWwsCiAJCQlVQVJUX1hNSVRfU0laRSkpOwogCiAJLyoga2ljayB0aGUgdmlydHVhbCBETUEgY29udHJvbGxlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9zeXNfbW4xMDMwMC5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9zeXNfbW4xMDMwMC5jCmluZGV4IDNlNTJhMTAuLjhjYTVhZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvc3lzX21uMTAzMDAuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL3N5c19tbjEwMzAwLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDc2ZjQxYmQuLjEwNTQ5ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ0LDI0ICs0NCw4IEBACiAgIFJPX0RBVEEoUEFHRV9TSVpFKQogCiAgIC8qIHdyaXRlYWJsZSAqLwotICAuZGF0YSA6IHsJCQkvKiBEYXRhICovCi0JREFUQV9EQVRBCi0JQ09OU1RSVUNUT1JTCi0JfQotCi0gIC5kYXRhX25vc2F2ZSA6IHsgTk9TQVZFX0RBVEE7IH0KLQotICAuZGF0YS5wYWdlX2FsaWduZWQgOiB7IFBBR0VfQUxJR05FRF9EQVRBKFBBR0VfU0laRSk7IH0KLSAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7IENBQ0hFTElORV9BTElHTkVEX0RBVEEoMzIpOyB9Ci0KLSAgLyogcmFyZWx5IGNoYW5nZWQgZGF0YSBsaWtlIGNwdSBtYXBzICovCi0gIC4gPSBBTElHTigzMik7Ci0gIC5kYXRhLnJlYWRfbW9zdGx5IDogQVQoQUREUiguZGF0YS5yZWFkX21vc3RseSkpIHsKLQlSRUFEX01PU1RMWV9EQVRBKDMyKTsKLQlfZWRhdGEgPSAuOwkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwotICB9Ci0KLSAgLmRhdGEuaW5pdF90YXNrIDogeyBJTklUX1RBU0tfREFUQShUSFJFQURfU0laRSk7IH0KKyAgUldfREFUQV9TRUNUSU9OKDMyLCBQQUdFX1NJWkUsIFRIUkVBRF9TSVpFKQorICBfZWRhdGEgPSAuOwogCiAgIC8qIG1pZ2h0IGdldCBmcmVlZCBhZnRlciBpbml0ICovCiAgIC4gPSBBTElHTihQQUdFX1NJWkUpOwpAQCAtNzQsMjIgKzU4LDggQEAKICAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0ICovCiAgIC4gPSBBTElHTihQQUdFX1NJWkUpOwkJLyogSW5pdCBjb2RlIGFuZCBkYXRhICovCiAgIF9faW5pdF9iZWdpbiA9IC47Ci0gIC5pbml0LnRleHQgOiB7Ci0JX3Npbml0dGV4dCA9IC47Ci0JSU5JVF9URVhUOwotCV9laW5pdHRleHQgPSAuOwotICB9Ci0gIC5pbml0LmRhdGEgOiB7IElOSVRfREFUQTsgfQotICAuc2V0dXAuaW5pdCA6IHsgSU5JVF9TRVRVUCgxNik7IH0KLQotICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLSAgLmluaXRjYWxsLmluaXQgOiB7Ci0JSU5JVENBTExTCi0gIH0KLSAgX19pbml0Y2FsbF9lbmQgPSAuOwotICAuY29uX2luaXRjYWxsLmluaXQgOiB7IENPTl9JTklUQ0FMTDsgfQotCi0gIFNFQ1VSSVRZX0lOSVQKKyAgSU5JVF9URVhUX1NFQ1RJT04oUEFHRV9TSVpFKQorICBJTklUX0RBVEFfU0VDVElPTigxNikKICAgLiA9IEFMSUdOKDQpOwogICBfX2FsdF9pbnN0cnVjdGlvbnMgPSAuOwogICAuYWx0aW5zdHJ1Y3Rpb25zIDogeyAqKC5hbHRpbnN0cnVjdGlvbnMpIH0KQEAgLTEwMCw4ICs3MCw2IEBACiAJLmV4aXQudGV4dCA6IHsgRVhJVF9URVhUOyB9CiAJLmV4aXQuZGF0YSA6IHsgRVhJVF9EQVRBOyB9CiAKLSAgLmluaXQucmFtZnMgOiB7IElOSVRfUkFNX0ZTOyB9Ci0KICAgUEVSQ1BVKDMyKQogICAuID0gQUxJR04oUEFHRV9TSVpFKTsKICAgX19pbml0X2VuZCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL2luY2x1ZGUvdW5pdC9jbG9jay5oIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwMy9pbmNsdWRlL3VuaXQvY2xvY2suaAppbmRleCA4YjQ1MGU5Li4yYTBiZjc5IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL2luY2x1ZGUvdW5pdC9jbG9jay5oCisrKyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDMvaW5jbHVkZS91bml0L2Nsb2NrLmgKQEAgLTIwLDkgKzIwLDkgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1uMTAzMDBfaW9iY2xrOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW4xMDMwMF90c2NfcGVyX0haOwogCi0jZGVmaW5lIE1OMTAzMDBfSU9DTEsJCSgodW5zaWduZWQgbG9uZyltbjEwMzAwX2lvY2xrKQorI2RlZmluZSBNTjEwMzAwX0lPQ0xLCQltbjEwMzAwX2lvY2xrCiAvKiBJZiB0aGlzIHByb2Nlc3NvcnMgaGFzIGEgYW5vdGhlciBjbG9jaywgdW5jb21tZW50IHRoZSBiZWxvdy4gKi8KLS8qICNkZWZpbmUgTU4xMDMwMF9JT0JDTEsJKCh1bnNpZ25lZCBsb25nKW1uMTAzMDBfaW9iY2xrKSAqLworLyogI2RlZmluZSBNTjEwMzAwX0lPQkNMSwltbjEwMzAwX2lvYmNsayAqLwogCiAjZWxzZSAvKiAhQ09ORklHX01OMTAzMDBfUlRDICovCiAKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgTU4xMDMwMF9UU0NDTEsJCU1OMTAzMDBfSU9DTEsKIAogI2lmZGVmIENPTkZJR19NTjEwMzAwX1JUQwotI2RlZmluZSBNTjEwMzAwX1RTQ19QRVJfSFoJKCh1bnNpZ25lZCBsb25nKW1uMTAzMDBfdHNjX3Blcl9IWikKKyNkZWZpbmUgTU4xMDMwMF9UU0NfUEVSX0haCW1uMTAzMDBfdHNjX3Blcl9IWgogI2Vsc2UgLyogIUNPTkZJR19NTjEwMzAwX1JUQyAqLwogI2RlZmluZSBNTjEwMzAwX1RTQ19QRVJfSFoJKE1OMTAzMDBfVFNDQ0xLL0haKQogI2VuZGlmIC8qICFDT05GSUdfTU4xMDMwMF9SVEMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvaW5jbHVkZS91bml0L2Nsb2NrLmggYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L2luY2x1ZGUvdW5pdC9jbG9jay5oCmluZGV4IDdkNTE0ODQuLjY3YmUzZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvaW5jbHVkZS91bml0L2Nsb2NrLmgKKysrIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9pbmNsdWRlL3VuaXQvY2xvY2suaApAQCAtMjAsOSArMjAsOSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW4xMDMwMF9pb2JjbGs7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtbjEwMzAwX3RzY19wZXJfSFo7CiAKLSNkZWZpbmUgTU4xMDMwMF9JT0NMSwkJKCh1bnNpZ25lZCBsb25nKW1uMTAzMDBfaW9jbGspCisjZGVmaW5lIE1OMTAzMDBfSU9DTEsJCW1uMTAzMDBfaW9jbGsKIC8qIElmIHRoaXMgcHJvY2Vzc29ycyBoYXMgYSBhbm90aGVyIGNsb2NrLCB1bmNvbW1lbnQgdGhlIGJlbG93LiAqLwotLyogI2RlZmluZSBNTjEwMzAwX0lPQkNMSwkoKHVuc2lnbmVkIGxvbmcpbW4xMDMwMF9pb2JjbGspICovCisvKiAjZGVmaW5lIE1OMTAzMDBfSU9CQ0xLCW1uMTAzMDBfaW9iY2xrICovCiAKICNlbHNlIC8qICFDT05GSUdfTU4xMDMwMF9SVEMgKi8KIApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBNTjEwMzAwX1RTQ0NMSwkJTU4xMDMwMF9JT0NMSwogCiAjaWZkZWYgQ09ORklHX01OMTAzMDBfUlRDCi0jZGVmaW5lIE1OMTAzMDBfVFNDX1BFUl9IWgkoKHVuc2lnbmVkIGxvbmcpbW4xMDMwMF90c2NfcGVyX0haKQorI2RlZmluZSBNTjEwMzAwX1RTQ19QRVJfSFoJbW4xMDMwMF90c2NfcGVyX0haCiAjZWxzZSAvKiAhQ09ORklHX01OMTAzMDBfUlRDICovCiAjZGVmaW5lIE1OMTAzMDBfVFNDX1BFUl9IWgkoTU4xMDMwMF9UU0NDTEsvSFopCiAjZW5kaWYgLyogIUNPTkZJR19NTjEwMzAwX1JUQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvS2NvbmZpZyBiL2FyY2gvcGFyaXNjL0tjb25maWcKaW5kZXggZjM4OGRjNi4uNTI0ZDkzNSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvS2NvbmZpZworKysgYi9hcmNoL3BhcmlzYy9LY29uZmlnCkBAIC0xOCw2ICsxOCw3IEBACiAJc2VsZWN0IEJVRwogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCiAJc2VsZWN0IEdFTkVSSUNfQVRPTUlDNjQgaWYgITY0QklUCisJc2VsZWN0IEhBVkVfQVJDSF9UUkFDRUhPT0sKIAloZWxwCiAJICBUaGUgUEEtUklTQyBtaWNyb3Byb2Nlc3NvciBpcyBkZXNpZ25lZCBieSBIZXdsZXR0LVBhY2thcmQgYW5kIHVzZWQKIAkgIGluIG1hbnkgb2YgdGhlaXIgd29ya3N0YXRpb25zICYgc2VydmVycyAoSFA5MDAwIDcwMCBhbmQgODAwIHNlcmllcywKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL01ha2VmaWxlIGIvYXJjaC9wYXJpc2MvTWFrZWZpbGUKaW5kZXggZGE2ZjY2OS4uNTVjY2ExZCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvTWFrZWZpbGUKKysrIGIvYXJjaC9wYXJpc2MvTWFrZWZpbGUKQEAgLTExOCw4ICsxMTgsOCBAQAogCUBlY2hvICAnKiB2bWxpbnV4CS0gVW5jb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoLi92bWxpbnV4KScKIAlAZWNobyAgJyAgcGFsbwkJLSBCb290YWJsZSBpbWFnZSAoLi9saWZpbWFnZSknCiAJQGVjaG8gICcgIGluc3RhbGwJLSBJbnN0YWxsIGtlcm5lbCB1c2luZycKLQlAZWNobyAgJwkJICAoeW91cikgfi9iaW4vaW5zdGFsbGtlcm5lbCBvcicKLQlAZWNobyAgJwkJICAoZGlzdHJpYnV0aW9uKSAvc2Jpbi9pbnN0YWxsa2VybmVsIG9yJworCUBlY2hvICAnCQkgICh5b3VyKSB+L2Jpbi8kKElOU1RBTExLRVJORUwpIG9yJworCUBlY2hvICAnCQkgIChkaXN0cmlidXRpb24pIC9zYmluLyQoSU5TVEFMTEtFUk5FTCkgb3InCiAJQGVjaG8gICcJCSAgY29weSB0byAkJChJTlNUQUxMX1BBVEgpJwogZW5kZWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZmNudGwuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2ZjbnRsLmgKaW5kZXggMWUxYzgyNC4uNWYzOWQ1NSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZmNudGwuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9mY250bC5oCkBAIC0yOCw2ICsyOCw4IEBACiAjZGVmaW5lIEZfU0VUT1dOCTEyCS8qICBmb3Igc29ja2V0cy4gKi8KICNkZWZpbmUgRl9TRVRTSUcJMTMJLyogIGZvciBzb2NrZXRzLiAqLwogI2RlZmluZSBGX0dFVFNJRwkxNAkvKiAgZm9yIHNvY2tldHMuICovCisjZGVmaW5lIEZfR0VUT1dOX0VYCTE1CisjZGVmaW5lIEZfU0VUT1dOX0VYCTE2CiAKIC8qIGZvciBwb3NpeCBmY250bCgpIGFuZCBsb2NrZigpICovCiAjZGVmaW5lIEZfUkRMQ0sJCTAxCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9maXhtYXAuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmluZGV4IGRlM2ZlM2EuLjZmZWM0ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCkBAIC0yMSw5ICsyMSw5IEBACiAjZGVmaW5lIEtFUk5FTF9NQVBfRU5ECQkoVE1QQUxJQVNfTUFQX1NUQVJUKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwotZXh0ZXJuIHZvaWQgKnZtYWxsb2Nfc3RhcnQ7CitleHRlcm4gdm9pZCAqcGFyaXNjX3ZtYWxsb2Nfc3RhcnQ7CiAjZGVmaW5lIFBDWExfRE1BX01BUF9TSVpFCSg4KjEwMjQqMTAyNCkKLSNkZWZpbmUgVk1BTExPQ19TVEFSVAkJKCh1bnNpZ25lZCBsb25nKXZtYWxsb2Nfc3RhcnQpCisjZGVmaW5lIFZNQUxMT0NfU1RBUlQJCSgodW5zaWduZWQgbG9uZylwYXJpc2Nfdm1hbGxvY19zdGFydCkKICNkZWZpbmUgVk1BTExPQ19FTkQJCShLRVJORUxfTUFQX0VORCkKICNlbmRpZiAvKl9fQVNTRU1CTFlfXyovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCBjZTkzMTMzLi4wZDY4MTg0YSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vaGFyZGlycS5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2hhcmRpcnEuaApAQCAtMSwyOSArMSwxMSBAQAogLyogaGFyZGlycS5oOiBQQS1SSVNDIGhhcmQgSVJRIHN1cHBvcnQuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxIE1hdHRoZXcgV2lsY294IDxtYXR0aGV3QHdpbC5jeD4KLSAqCi0gKiBUaGUgbG9ja2luZyBpcyByZWFsbHkgcXVpdGUgaW50ZXJlc3RpbmcuICBUaGVyZSdzIGEgY3B1LWxvY2FsCi0gKiBjb3VudCBvZiBob3cgbWFueSBpbnRlcnJ1cHRzIGFyZSBiZWluZyBoYW5kbGVkLCBhbmQgYSBnbG9iYWwKLSAqIGxvY2suICBBbiBpbnRlcnJ1cHQgY2FuIG9ubHkgYmUgc2VydmljZWQgaWYgdGhlIGdsb2JhbCBsb2NrCi0gKiBpcyBmcmVlLiAgWW91IGNhbid0IGJlIHN1cmUgbm8gbW9yZSBpbnRlcnJ1cHRzIGFyZSBiZWluZwotICogc2VydmljZWQgdW50aWwgeW91J3ZlIGFjcXVpcmVkIHRoZSBsb2NrIGFuZCB0aGVuIGNoZWNrZWQKLSAqIGFsbCB0aGUgcGVyLWNwdSBpbnRlcnJ1cHQgY291bnRzIGFyZSBhbGwgemVyby4gIEl0J3MgYSBzcGVjaWFsaXNlZAotICogYnJfbG9jaywgYW5kIHRoYXQncyBleGFjdGx5IGhvdyBTcGFyYyBkb2VzIGl0LiAgV2UgZG9uJ3QgYmVjYXVzZQotICogaXQncyBtb3JlIGxvY2tpbmcgZm9yIHVzLiAgVGhpcyB3YXkgaXMgbG9jay1mcmVlIGluIHRoZSBpbnRlcnJ1cHQgcGF0aC4KICAqLwogCiAjaWZuZGVmIF9QQVJJU0NfSEFSRElSUV9ICiAjZGVmaW5lIF9QQVJJU0NfSEFSRElSUV9ICiAKLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIF9fc29mdGlycV9wZW5kaW5nOyAvKiBzZXRfYml0IGlzIHVzZWQgb24gdGhpcyAqLwotfSBfX19fY2FjaGVsaW5lX2FsaWduZWQgaXJxX2NwdXN0YXRfdDsKLQotI2luY2x1ZGUgPGxpbnV4L2lycV9jcHVzdGF0Lmg+CS8qIFN0YW5kYXJkIG1hcHBpbmdzIGZvciBpcnFfY3B1c3RhdF90IGFib3ZlICovCi0KLXZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSk7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGFyZGlycS5oPgogCiAjZW5kaWYgLyogX1BBUklTQ19IQVJESVJRX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggMzAyZjY4ZC4uYWVhZDQwYiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTU5LDggKzU5LDExIEBACiAjZGVmaW5lIHVzZXJfbW9kZShyZWdzKQkJCSgoKHJlZ3MpLT5pYW9xWzBdICYgMykgPyAxIDogMCkKICNkZWZpbmUgdXNlcl9zcGFjZShyZWdzKQkJKCgocmVncyktPmlhc3FbMV0gIT0gMCkgPyAxIDogMCkKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQkoKHJlZ3MpLT5pYW9xWzBdICYgfjMpCisjZGVmaW5lIHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKQkoKHJlZ3MpLT5nclszMF0pCiB1bnNpZ25lZCBsb25nIHByb2ZpbGVfcGMoc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7Ci0jZW5kaWYKKworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggMjFlYjQ1YS4uMmU3MzYyMyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc21wLmgKQEAgLTMwLDcgKzMwLDYgQEAKIAogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KTsKIGV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKTsKLSNkZWZpbmUgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2sgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2sKIAogI2VuZGlmIC8qICFBU1NFTUJMWSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zeXNjYWxsLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkZmQyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtMCwwICsxLDQwIEBACisvKiBzeXNjYWxsLmggKi8KKworI2lmbmRlZiBfQVNNX1BBUklTQ19TWVNDQUxMX0hfCisjZGVmaW5lIF9BU01fUEFSSVNDX1NZU0NBTExfSF8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworc3RhdGljIGlubGluZSBsb25nIHN5c2NhbGxfZ2V0X25yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIHJlZ3MtPmdyWzIwXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfZ2V0X2FyZ3VtZW50cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgaSwKKwkJCQkJIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBsb25nICphcmdzKQoreworCUJVR19PTihpKTsKKworCXN3aXRjaCAobikgeworCWNhc2UgNjoKKwkJYXJnc1s1XSA9IHJlZ3MtPmdyWzIxXTsKKwljYXNlIDU6CisJCWFyZ3NbNF0gPSByZWdzLT5nclsyMl07CisJY2FzZSA0OgorCQlhcmdzWzNdID0gcmVncy0+Z3JbMjNdOworCWNhc2UgMzoKKwkJYXJnc1syXSA9IHJlZ3MtPmdyWzI0XTsKKwljYXNlIDI6CisJCWFyZ3NbMV0gPSByZWdzLT5nclsyNV07CisJY2FzZSAxOgorCQlhcmdzWzBdID0gcmVncy0+Z3JbMjZdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKKyNlbmRpZiAvKl9BU01fUEFSSVNDX1NZU0NBTExfSF8qLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggYWM3NzVhNy4uN2VjYzEwMyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0zMiw2ICszMiwxMSBAQAogI2RlZmluZSBpbml0X3RocmVhZF9pbmZvICAgICAgICAoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCiAjZGVmaW5lIGluaXRfc3RhY2sgICAgICAgICAgICAgIChpbml0X3RocmVhZF91bmlvbi5zdGFjaykKIAorLyogaG93IHRvIGdldCB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdCBmcm9tIEMgKi8KKyNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpCSgoc3RydWN0IHRocmVhZF9pbmZvICopbWZjdGwoMzApKQorCisjZW5kaWYgLyogIV9fQVNTRU1CTFkgKi8KKwogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KIAogI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUiAgICAgICAgICAgIDIKQEAgLTQwLDExICs0NSw2IEBACiAjZGVmaW5lIFRIUkVBRF9TSVpFICAgICAgICAgICAgIChQQUdFX1NJWkUgPDwgVEhSRUFEX1NJWkVfT1JERVIpCiAjZGVmaW5lIFRIUkVBRF9TSElGVCAgICAgICAgICAgIChQQUdFX1NISUZUICsgVEhSRUFEX1NJWkVfT1JERVIpCiAKLS8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBDICovCi0jZGVmaW5lIGN1cnJlbnRfdGhyZWFkX2luZm8oKQkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKW1mY3RsKDMwKSkKLQotI2VuZGlmIC8qICFfX0FTU0VNQkxZICovCi0KICNkZWZpbmUgUFJFRU1QVF9BQ1RJVkVfQklUCTI4CiAjZGVmaW5lIFBSRUVNUFRfQUNUSVZFCQkoMSA8PCBQUkVFTVBUX0FDVElWRV9CSVQpCiAKQEAgLTYwLDYgKzYwLDggQEAKICNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk2CS8qIHJlc3RvcmUgc2F2ZWQgc2lnbmFsIG1hc2sgKi8KICNkZWZpbmUgVElGX0ZSRUVaRQkJNwkvKiBpcyBmcmVlemluZyBmb3Igc3VzcGVuZCAqLwogI2RlZmluZSBUSUZfTk9USUZZX1JFU1VNRQk4CS8qIGNhbGxiYWNrIGJlZm9yZSByZXR1cm5pbmcgdG8gdXNlciAqLworI2RlZmluZSBUSUZfU0lOR0xFU1RFUAkJOQkvKiBzaW5nbGUgc3RlcHBpbmc/ICovCisjZGVmaW5lIFRJRl9CTE9DS1NURVAJCTEwCS8qIGJyYW5jaCBzdGVwcGluZz8gKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDEgPDwgVElGX1NJR1BFTkRJTkcpCkBAIC02OSw2ICs3MSw4IEBACiAjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxIDw8IFRJRl9SRVNUT1JFX1NJR01BU0spCiAjZGVmaW5lIF9USUZfRlJFRVpFCQkoMSA8PCBUSUZfRlJFRVpFKQogI2RlZmluZSBfVElGX05PVElGWV9SRVNVTUUJKDEgPDwgVElGX05PVElGWV9SRVNVTUUpCisjZGVmaW5lIF9USUZfU0lOR0xFU1RFUAkJKDEgPDwgVElGX1NJTkdMRVNURVApCisjZGVmaW5lIF9USUZfQkxPQ0tTVEVQCQkoMSA8PCBUSUZfQkxPQ0tTVEVQKQogCiAjZGVmaW5lIF9USUZfVVNFUl9XT1JLX01BU0sgICAgIChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05PVElGWV9SRVNVTUUgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGX05FRURfUkVTQ0hFRCB8IF9USUZfUkVTVE9SRV9TSUdNQVNLKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5zdGFsbC5zaCBiL2FyY2gvcGFyaXNjL2luc3RhbGwuc2gKaW5kZXggOTYzMmIzZS4uZTU5M2ZjOCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5zdGFsbC5zaAorKysgYi9hcmNoL3BhcmlzYy9pbnN0YWxsLnNoCkBAIC0yMSw4ICsyMSw4IEBACiAKICMgVXNlciBtYXkgaGF2ZSBhIGN1c3RvbSBpbnN0YWxsIHNjcmlwdAogCi1pZiBbIC14IH4vYmluL2luc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIH4vYmluL2luc3RhbGxrZXJuZWwgIiRAIjsgZmkKLWlmIFsgLXggL3NiaW4vaW5zdGFsbGtlcm5lbCBdOyB0aGVuIGV4ZWMgL3NiaW4vaW5zdGFsbGtlcm5lbCAiJEAiOyBmaQoraWYgWyAteCB+L2Jpbi8ke0lOU1RBTExLRVJORUx9IF07IHRoZW4gZXhlYyB+L2Jpbi8ke0lOU1RBTExLRVJORUx9ICIkQCI7IGZpCitpZiBbIC14IC9zYmluLyR7SU5TVEFMTEtFUk5FTH0gXTsgdGhlbiBleGVjIC9zYmluLyR7SU5TVEFMTEtFUk5FTH0gIiRAIjsgZmkKIAogIyBEZWZhdWx0IGluc3RhbGwKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCA2OTljZjhlLi5mY2QzYzcwIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjcwLDggKzI3MCw4IEBACiAJREVGSU5FKERUTEJfT0ZGX0NPVU5ULCBvZmZzZXRvZihzdHJ1Y3QgcGRjX2NhY2hlX2luZm8sIGR0X29mZl9jb3VudCkpOwogCURFRklORShEVExCX0xPT1AsIG9mZnNldG9mKHN0cnVjdCBwZGNfY2FjaGVfaW5mbywgZHRfbG9vcCkpOwogCUJMQU5LKCk7Ci0JREVGSU5FKFBBX0JMT0NLU1RFUF9CSVQsIDMxLVBUX0JMT0NLU1RFUF9CSVQpOwotCURFRklORShQQV9TSU5HTEVTVEVQX0JJVCwgMzEtUFRfU0lOR0xFU1RFUF9CSVQpOworCURFRklORShUSUZfQkxPQ0tTVEVQX1BBX0JJVCwgMzEtVElGX0JMT0NLU1RFUCk7CisJREVGSU5FKFRJRl9TSU5HTEVTVEVQX1BBX0JJVCwgMzEtVElGX1NJTkdMRVNURVApOwogCUJMQU5LKCk7CiAJREVGSU5FKEFTTV9QTURfU0hJRlQsIFBNRF9TSElGVCk7CiAJREVGSU5FKEFTTV9QR0RJUl9TSElGVCwgUEdESVJfU0hJRlQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2VudHJ5LlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUwppbmRleCA4YzQ3MTJiLi4zYTQ0ZjdmIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUwpAQCAtMjA0NywxMiArMjA0NywxMyBAQAogCWIsbiAgICAgc3lzY2FsbF9jaGVja19zaWcKIAogc3lzY2FsbF9yZXN0b3JlOgotCS8qIEFyZSB3ZSBiZWluZyBwdHJhY2VkPyAqLwogCUxEUkVHCVRJX1RBU0stVEhSRUFEX1NaX0FMR04tRlJBTUVfU0laRSglcjMwKSwlcjEKIAotCWxkdwlUQVNLX1BUUkFDRSglcjEpLCAlcjE5Ci0JYmIsPAklcjE5LDMxLHN5c2NhbGxfcmVzdG9yZV9yZmkKLQlub3AKKwkvKiBBcmUgd2UgYmVpbmcgcHRyYWNlZD8gKi8KKwlsZHcJVEFTS19GTEFHUyglcjEpLCVyMTkKKwlsZGkJKF9USUZfU0lOR0xFU1RFUHxfVElGX0JMT0NLU1RFUCksJXIyCisJYW5kLENPTkQoPSkJJXIxOSwlcjIsJXIwCisJYixuCXN5c2NhbGxfcmVzdG9yZV9yZmkKIAogCWxkbwlUQVNLX1BUX0ZSMzEoJXIxKSwlcjE5CQkgICAvKiByZWxvYWQgZnByZWdzICovCiAJcmVzdF9mcAklcjE5CkBAIC0yMTEzLDE2ICsyMTE0LDE2IEBACiAJbGRpCTB4MGIsJXIyMAkJCSAgIC8qIENyZWF0ZSBuZXcgUFNXICovCiAJZGVwaQktMSwxMywxLCVyMjAJCQkgICAvKiBDLCBRLCBELCBhbmQgSSBiaXRzICovCiAKLQkvKiBUaGUgdmFsdWVzIG9mIFBBX1NJTkdMRVNURVBfQklUIGFuZCBQQV9CTE9DS1NURVBfQklUIGFyZQotCSAqIHNldCBpbiBpbmNsdWRlL2xpbnV4L3B0cmFjZS5oIGFuZCBjb252ZXJ0ZWQgdG8gUEEgYml0bWFwCisJLyogVGhlIHZhbHVlcyBvZiBTSU5HTEVTVEVQX0JJVCBhbmQgQkxPQ0tTVEVQX0JJVCBhcmUKKwkgKiBzZXQgaW4gdGhyZWFkX2luZm8uaCBhbmQgY29udmVydGVkIHRvIFBBIGJpdG1hcAogCSAqIG51bWJlcnMgaW4gYXNtLW9mZnNldHMuYyAqLwogCi0JLyogaWYgKCglcjE5LlBBX1NJTkdMRVNURVBfQklUKSkgeyAlcjIwLjI3PTF9ICovCi0JZXh0cnUsPQklcjE5LFBBX1NJTkdMRVNURVBfQklULDEsJXIwCisJLyogaWYgKCglcjE5LlNJTkdMRVNURVBfQklUKSkgeyAlcjIwLjI3PTF9ICovCisJZXh0cnUsPQklcjE5LFRJRl9TSU5HTEVTVEVQX1BBX0JJVCwxLCVyMAogCWRlcGkJLTEsMjcsMSwlcjIwCQkJICAgLyogUiBiaXQgKi8KIAotCS8qIGlmICgoJXIxOS5QQV9CTE9DS1NURVBfQklUKSkgeyAlcjIwLjc9MX0gKi8KLQlleHRydSw9ICVyMTksUEFfQkxPQ0tTVEVQX0JJVCwxLCVyMAorCS8qIGlmICgoJXIxOS5CTE9DS1NURVBfQklUKSkgeyAlcjIwLjc9MX0gKi8KKwlleHRydSw9ICVyMTksVElGX0JMT0NLU1RFUF9QQV9CSVQsMSwlcjAKIAlkZXBpCS0xLDcsMSwlcjIwCQkJICAgLyogVCBiaXQgKi8KIAogCVNUUkVHCSVyMjAsVEFTS19QVF9QU1coJXIxKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2luaXRfdGFzay5jCmluZGV4IDgyOTc0YjIuLmQwMjBlYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTQzLDggKzQzLDggQEAKICAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IGhhdmluZyBhIHNwZWNpYWwKICAqICJpbml0X3Rhc2siIGxpbmtlciBtYXAgZW50cnkuLgogICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDEyOCkpKSBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIikpKSA9Cit1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gX19pbml0X3Rhc2tfZGF0YQorCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMTI4KSkpID0KIAkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKIAogI2lmIFBUX05MRVZFTFMgPT0gMwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jCmluZGV4IDMzMGY1MzYuLjJlNzYxMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMKQEAgLTQyMyw4ICs0MjMsMyBAQAogICAgICAgICBzZXRfZWllbShjcHVfZWllbSk7CS8qIEVJRU0gOiBlbmFibGUgYWxsIGV4dGVybmFsIGludHIgKi8KIAogfQotCi12b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAidW5leHBlY3RlZCBJUlEgJWRcbiIsIGlycSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvbW9kdWxlLmMKaW5kZXggNjFlZTBlZS4uMjEyMDc0NiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9tb2R1bGUuYwpAQCAtODkzLDcgKzg5Myw3IEBACiAJICogb3Vyc2VsdmVzICovCiAJZm9yIChpID0gMTsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKSB7CiAJCWlmKHNlY2hkcnNbaV0uc2hfdHlwZSA9PSBTSFRfU1lNVEFCCi0JCSAgICYmIChzZWNoZHJzW2ldLnNoX3R5cGUgJiBTSEZfQUxMT0MpKSB7CisJCSAgICYmIChzZWNoZHJzW2ldLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkgewogCQkJaW50IHN0cmluZGV4ID0gc2VjaGRyc1tpXS5zaF9saW5rOwogCQkJLyogRklYTUU6IEFXRlVMIEhBQ0sKIAkJCSAqIFRoZSBjYXN0IGlzIHRvIGRyb3AgdGhlIGNvbnN0IGZyb20KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYwppbmRleCA5MjdkYjM2Li5jNGY0OWU0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpAQCAtMzUsNyArMzYsOCBAQAogICovCiB2b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQl0YXNrLT5wdHJhY2UgJj0gfihQVF9TSU5HTEVTVEVQfFBUX0JMT0NLU1RFUCk7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0JMT0NLU1RFUCk7CiAKIAkvKiBtYWtlIHN1cmUgdGhlIHRyYXAgYml0cyBhcmUgbm90IHNldCAqLwogCXBhX3Bzdyh0YXNrKS0+ciA9IDA7CkBAIC01NSw4ICs1Nyw4IEBACiAKIHZvaWQgdXNlcl9lbmFibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXRhc2stPnB0cmFjZSAmPSB+UFRfQkxPQ0tTVEVQOwotCXRhc2stPnB0cmFjZSB8PSBQVF9TSU5HTEVTVEVQOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfQkxPQ0tTVEVQKTsKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKIAogCWlmIChwYV9wc3codGFzayktPm4pIHsKIAkJc3RydWN0IHNpZ2luZm8gc2k7CkBAIC05OCw4ICsxMDAsOCBAQAogCiB2b2lkIHVzZXJfZW5hYmxlX2Jsb2NrX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXRhc2stPnB0cmFjZSAmPSB+UFRfU0lOR0xFU1RFUDsKLQl0YXNrLT5wdHJhY2UgfD0gUFRfQkxPQ0tTVEVQOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFU1RFUCk7CisJc2V0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfQkxPQ0tTVEVQKTsKIAogCS8qIEVuYWJsZSB0YWtlbiBicmFuY2ggdHJhcC4gKi8KIAlwYV9wc3codGFzayktPnIgPSAwOwpAQCAtMjYzLDIyICsyNjUsMjAgQEAKIH0KICNlbmRpZgogCi0KLXZvaWQgc3lzY2FsbF90cmFjZSh2b2lkKQorbG9uZyBkb19zeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCi0JCXJldHVybjsKLQlpZiAoIShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKLQkJcmV0dXJuOwotCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKQotCQkJCSA/IDB4ODAgOiAwKSk7Ci0JLyoKLQkgKiB0aGlzIGlzbid0IHRoZSBzYW1lIGFzIGNvbnRpbnVpbmcgd2l0aCBhIHNpZ25hbCwgYnV0IGl0IHdpbGwgZG8KLQkgKiBmb3Igbm9ybWFsIHVzZS4gIHN0cmFjZSBvbmx5IGNvbnRpbnVlcyB3aXRoIGEgc2lnbmFsIGlmIHRoZQotCSAqIHN0b3BwaW5nIHNpZ25hbCBpcyBub3QgU0lHVFJBUC4gIC1icmwKLQkgKi8KLQlpZiAoY3VycmVudC0+ZXhpdF9jb2RlKSB7Ci0JCXNlbmRfc2lnKGN1cnJlbnQtPmV4aXRfY29kZSwgY3VycmVudCwgMSk7Ci0JCWN1cnJlbnQtPmV4aXRfY29kZSA9IDA7Ci0JfQorCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSAmJgorCSAgICB0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZW50cnkocmVncykpCisJCXJldHVybiAtMUw7CisKKwlyZXR1cm4gcmVncy0+Z3JbMjBdOworfQorCit2b2lkIGRvX3N5c2NhbGxfdHJhY2VfZXhpdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgc3RlcHBpbmcgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSB8fAorCQl0ZXN0X3RocmVhZF9mbGFnKFRJRl9CTE9DS1NURVApOworCisJaWYgKHN0ZXBwaW5nIHx8IHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorCQl0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZXhpdChyZWdzLCBzdGVwcGluZyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc2lnbmFsLmMKaW5kZXggOGViM2M2My4uZTg0NjdlNCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zaWduYWwuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgpAQCAtMzQsNyArMzUsNiBAQAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgInNpZ25hbDMyLmgiCiAjZW5kaWYKIApAQCAtNDY4LDYgKzQ2OCw5IEBACiAJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCxzaWcpOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCXRyYWNlaG9va19zaWduYWxfaGFuZGxlcihzaWcsIGluZm8sIGthLCByZWdzLCAwKTsKKwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYzMyLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYzMyLmMKaW5kZXggOTJhMGFjYS4uNTYxMzg4YiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c19wYXJpc2MzMi5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNfcGFyaXNjMzIuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbC5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGwuUwppbmRleCA1OWZjMWE0Li5mNWY5NjAyIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbC5TCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsLlMKQEAgLTI4OCwxOCArMjg4LDIzIEBACiAJU1RSRUcJJXIxOCxQVF9HUjE4KCVyMikKIAkvKiBGaW5pc2hlZCBzYXZpbmcgdGhpbmdzIGZvciB0aGUgZGVidWdnZXIgKi8KIAotCWxkaWwJTCVzeXNjYWxsX3RyYWNlLCVyMQorCWNvcHkJJXIyLCVyMjYKKwlsZGlsCUwlZG9fc3lzY2FsbF90cmFjZV9lbnRlciwlcjEKIAlsZGlsCUwldHJhY2VzeXNfbmV4dCwlcjIKLQliZQlSJXN5c2NhbGxfdHJhY2UoJXNyNywlcjEpCisJYmUJUiVkb19zeXNjYWxsX3RyYWNlX2VudGVyKCVzcjcsJXIxKQogCWxkbwlSJXRyYWNlc3lzX25leHQoJXIyKSwlcjIKIAkKLXRyYWNlc3lzX25leHQ6CQordHJhY2VzeXNfbmV4dDoKKwkvKiBkb19zeXNjYWxsX3RyYWNlX2VudGVyIGVpdGhlciByZXR1cm5lZCB0aGUgc3lzY2FsbG5vLCBvciAtMUwsCisJICogIHNvIHdlIHNraXAgcmVzdG9yaW5nIHRoZSBQVF9HUjIwIGJlbG93LCBzaW5jZSB3ZSBwdWxsZWQgaXQgZnJvbQorCSAqICB0YXNrLT50aHJlYWQucmVncy5nclsyMF0gYWJvdmUuCisJICovCisJY29weQklcmV0MCwlcjIwCiAJbGRpbAlMJXN5c19jYWxsX3RhYmxlLCVyMQogCWxkbyAgICAgUiVzeXNfY2FsbF90YWJsZSglcjEpLCAlcjE5CiAKIAlsZG8gICAgIC1USFJFQURfU1pfQUxHTi1GUkFNRV9TSVpFKCVyMzApLCVyMSAgICAgIC8qIGdldCB0YXNrIHB0ciAqLwogCUxEUkVHCVRJX1RBU0soJXIxKSwgJXIxCi0JTERSRUcgICBUQVNLX1BUX0dSMjAoJXIxKSwgJXIyMAogCUxEUkVHICAgVEFTS19QVF9HUjI2KCVyMSksICVyMjYJCS8qIFJlc3RvcmUgdGhlIHVzZXJzIGFyZ3MgKi8KIAlMRFJFRyAgIFRBU0tfUFRfR1IyNSglcjEpLCAlcjI1CiAJTERSRUcgICBUQVNLX1BUX0dSMjQoJXIxKSwgJXIyNApAQCAtMzM2LDcgKzM0MSw4IEBACiAjaWZkZWYgQ09ORklHXzY0QklUCiAJbGRvCS0xNiglcjMwKSwlcjI5CQkJLyogUmVmZXJlbmNlIHBhcmFtIHNhdmUgYXJlYSAqLwogI2VuZGlmCi0JYmwJc3lzY2FsbF90cmFjZSwgJXIyCisJbGRvCVRBU0tfUkVHUyglcjEpLCVyMjYKKwlibAlkb19zeXNjYWxsX3RyYWNlX2V4aXQsJXIyCiAJU1RSRUcgICAlcjI4LFRBU0tfUFRfR1IyOCglcjEpICAgICAgICAgIC8qIHNhdmUgcmV0dXJuIHZhbHVlIG5vdyAqLwogCWxkbyAgICAgLVRIUkVBRF9TWl9BTEdOLUZSQU1FX1NJWkUoJXIzMCksJXIxICAgICAgLyogZ2V0IHRhc2sgcHRyICovCiAJTERSRUcJVElfVEFTSyglcjEpLCAlcjEKQEAgLTM1MywxMiArMzU5LDEyIEBACiAKIHRyYWNlc3lzX3NpZ2V4aXQ6CiAJbGRvICAgICAtVEhSRUFEX1NaX0FMR04tRlJBTUVfU0laRSglcjMwKSwlcjEgICAgICAvKiBnZXQgdGFzayBwdHIgKi8KLQlMRFJFRwkwKCVyMSksICVyMQorCUxEUkVHCVRJX1RBU0soJXIxKSwgJXIxCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJbGRvCS0xNiglcjMwKSwlcjI5CQkJLyogUmVmZXJlbmNlIHBhcmFtIHNhdmUgYXJlYSAqLwogI2VuZGlmCi0JYmwJc3lzY2FsbF90cmFjZSwgJXIyCi0Jbm9wCisJYmwJZG9fc3lzY2FsbF90cmFjZV9leGl0LCVyMgorCWxkbwlUQVNLX1JFR1MoJXIxKSwlcjI2CiAKIAlsZGlsCUwlc3lzY2FsbF9leGl0X3JmaSwlcjEKIAliZSxuCVIlc3lzY2FsbF9leGl0X3JmaSglc3I3LCVyMSkKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYWVhMTc4NC4uZmRhNGJhYSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCQogLyogbGQgc2NyaXB0IHRvIG1ha2UgaHBwYSBMaW51eCBrZXJuZWwgKi8KICNpZm5kZWYgQ09ORklHXzY0QklUCkBAIC03NywxMyArNzgsNyBAQAogCSAqLwogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCWRhdGFfc3RhcnQgPSAuOwotCS4gPSBBTElHTigxNik7Ci0JLyogRXhjZXB0aW9uIHRhYmxlICovCi0JX19leF90YWJsZSA6IHsKLQkJX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLQkJKihfX2V4X3RhYmxlKQotCQlfX3N0b3BfX19leF90YWJsZSA9IC47Ci0JfQorCUVYQ0VQVElPTl9UQUJMRSgxNikKIAogCU5PVEVTCiAKQEAgLTk0LDIzICs4OSw4IEBACiAJCV9fc3RvcF9fX3Vud2luZCA9IC47CiAJfQogCi0JLyogcmFyZWx5IGNoYW5nZWQgZGF0YSBsaWtlIGNwdSBtYXBzICovCi0JLiA9IEFMSUdOKDE2KTsKLQkuZGF0YS5yZWFkX21vc3RseSA6IHsKLQkJKiguZGF0YS5yZWFkX21vc3RseSkKLQl9Ci0KLQkuID0gQUxJR04oTDFfQ0FDSEVfQllURVMpOwogCS8qIERhdGEgKi8KLQkuZGF0YSA6IHsKLQkJREFUQV9EQVRBCi0JCUNPTlNUUlVDVE9SUwotCX0KLQotCS4gPSBBTElHTihMMV9DQUNIRV9CWVRFUyk7Ci0JLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7Ci0JCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0JfQorCVJXX0RBVEFfU0VDVElPTihMMV9DQUNIRV9CWVRFUywgUEFHRV9TSVpFLCBUSFJFQURfU0laRSkKIAogCS8qIFBBLVJJU0MgbG9ja3MgcmVxdWlyZXMgMTYtYnl0ZSBhbGlnbm1lbnQgKi8KIAkuID0gQUxJR04oMTYpOwpAQCAtMTE4LDE3ICs5OCw2IEBACiAJCSooLmRhdGEubG9ja19hbGlnbmVkKQogCX0KIAotCS8qIG5vc2F2ZSBkYXRhIGlzIHJlYWxseSBvbmx5IHVzZWQgZm9yIHNvZnR3YXJlIHN1c3BlbmQuLi5pdCdzIGhlcmUKLQkgKiBqdXN0IGluIGNhc2Ugd2UgZXZlciBpbXBsZW1lbnQgaXQKLQkgKi8KLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX25vc2F2ZV9iZWdpbiA9IC47Ci0JLmRhdGFfbm9zYXZlIDogewotCQkqKC5kYXRhLm5vc2F2ZSkKLQl9Ci0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JX19ub3NhdmVfZW5kID0gLjsKLQogCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KIAlfZWRhdGEgPSAuOwogCkBAIC0xNDcsMTQgKzExNiw2IEBACiAJfQogCV9fYnNzX3N0b3AgPSAuOwogCi0KLQkvKiBhc3NlbWJsZXIgY29kZSBleHBlY3RzIGluaXRfdGFzayB0byBiZSAxNmsgYWxpZ25lZCAqLwotCS4gPSBBTElHTigxNjM4NCk7Ci0JLyogaW5pdF90YXNrICovCi0JLmRhdGEuaW5pdF90YXNrIDogewotCQkqKC5kYXRhLmluaXRfdGFzaykKLQl9Ci0KICNpZmRlZiBDT05GSUdfNjRCSVQKIAkuID0gQUxJR04oMTYpOwogCS8qIExpbmthZ2UgdGFibGVzICovCkBAIC0xNzIsNjQgKzEzMywxNyBAQAogCS8qIHJlc2VydmUgc3BhY2UgZm9yIGludGVycnVwdCBzdGFjayBieSBhbGlnbmluZyBfX2luaXQqIHRvIDE2ayAqLwogCS4gPSBBTElHTigxNjM4NCk7CiAJX19pbml0X2JlZ2luID0gLjsKLQkuaW5pdC50ZXh0IDogeyAKLQkJX3Npbml0dGV4dCA9IC47Ci0JCUlOSVRfVEVYVAotCQlfZWluaXR0ZXh0ID0gLjsKLQl9Ci0JLmluaXQuZGF0YSA6IHsKLQkJSU5JVF9EQVRBCi0JfQotCS4gPSBBTElHTigxNik7Ci0JLmluaXQuc2V0dXAgOiB7Ci0JCV9fc2V0dXBfc3RhcnQgPSAuOwotCQkqKC5pbml0LnNldHVwKQotCQlfX3NldHVwX2VuZCA9IC47Ci0JfQotCS5pbml0Y2FsbC5pbml0IDogewotCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJSU5JVENBTExTCi0JCV9faW5pdGNhbGxfZW5kID0gLjsKLQl9Ci0JLmNvbl9pbml0Y2FsbC5pbml0IDogewotCQlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47Ci0JCSooLmNvbl9pbml0Y2FsbC5pbml0KQotCQlfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwotCX0KLQlTRUNVUklUWV9JTklUCi0KLQkvKiBhbHRlcm5hdGUgaW5zdHJ1Y3Rpb24gcmVwbGFjZW1lbnQuICBUaGlzIGlzIGEgbWVjaGFuaXNtIHg4NiB1c2VzCi0JICogdG8gZGV0ZWN0IHRoZSBDUFUgdHlwZSBhbmQgcmVwbGFjZSBnZW5lcmljIGluc3RydWN0aW9uIHNlcXVlbmNlcwotCSAqIHdpdGggQ1BVIHNwZWNpZmljIG9uZXMuICBXZSBkb24ndCBjdXJyZW50bHkgZG8gdGhpcyBpbiBQQSwgYnV0Ci0JICogaXQgc2VlbXMgbGlrZSBhIGdvb2QgaWRlYS4uLgotCSAqLwotCS4gPSBBTElHTig0KTsKLQkuYWx0aW5zdHJ1Y3Rpb25zIDogewotCQlfX2FsdF9pbnN0cnVjdGlvbnMgPSAuOwotCQkqKC5hbHRpbnN0cnVjdGlvbnMpCi0JCV9fYWx0X2luc3RydWN0aW9uc19lbmQgPSAuOyAKLQl9IAotCS5hbHRpbnN0cl9yZXBsYWNlbWVudCA6IHsKLQkJKiguYWx0aW5zdHJfcmVwbGFjZW1lbnQpCi0JfSAKLQotCS8qIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcwotCSAqICBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZQotCSAqLwotCS5leGl0LnRleHQgOiB7CisJSU5JVF9URVhUX1NFQ1RJT04oMTYzODQpCisJSU5JVF9EQVRBX1NFQ1RJT04oMTYpCisJLyogd2UgaGF2ZSB0byBkaXNjYXJkIGV4aXQgdGV4dCBhbmQgc3VjaCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lICovCisJLmV4aXQudGV4dCA6CisJewogCQlFWElUX1RFWFQKIAl9Ci0JLmV4aXQuZGF0YSA6IHsKKwkuZXhpdC5kYXRhIDoKKwl7CiAJCUVYSVRfREFUQQogCX0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQkuaW5pdC5yYW1mcyA6IHsKLQkJX19pbml0cmFtZnNfc3RhcnQgPSAuOwotCQkqKC5pbml0LnJhbWZzKQotCQlfX2luaXRyYW1mc19lbmQgPSAuOwotCX0KLSNlbmRpZgogCiAJUEVSQ1BVKFBBR0VfU0laRSkKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL21tL2luaXQuYyBiL2FyY2gvcGFyaXNjL21tL2luaXQuYwppbmRleCBkNWFjYTMxLi4xM2I2ZTNlIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9tbS9pbml0LmMKKysrIGIvYXJjaC9wYXJpc2MvbW0vaW5pdC5jCkBAIC00MzQsOCArNDM0LDggQEAKICNkZWZpbmUgU0VUX01BUF9PRkZTRVQoeCkgKCh2b2lkICopKCgodW5zaWduZWQgbG9uZykoeCkgKyBWTV9NQVBfT0ZGU0VUKSBcCiAJCQkJICAgICAmIH4oVk1fTUFQX09GRlNFVC0xKSkpCiAKLXZvaWQgKnZtYWxsb2Nfc3RhcnQgX19yZWFkX21vc3RseTsKLUVYUE9SVF9TWU1CT0wodm1hbGxvY19zdGFydCk7Cit2b2lkICpwYXJpc2Nfdm1hbGxvY19zdGFydCBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChwYXJpc2Nfdm1hbGxvY19zdGFydCk7CiAKICNpZmRlZiBDT05GSUdfUEExMQogdW5zaWduZWQgbG9uZyBwY3hsX2RtYV9zdGFydCBfX3JlYWRfbW9zdGx5OwpAQCAtNDk2LDEzICs0OTYsMTQgQEAKICNpZmRlZiBDT05GSUdfUEExMQogCWlmIChocHBhX2RtYV9vcHMgPT0gJnBjeGxfZG1hX29wcykgewogCQlwY3hsX2RtYV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKVNFVF9NQVBfT0ZGU0VUKE1BUF9TVEFSVCk7Ci0JCXZtYWxsb2Nfc3RhcnQgPSBTRVRfTUFQX09GRlNFVChwY3hsX2RtYV9zdGFydCArIFBDWExfRE1BX01BUF9TSVpFKTsKKwkJcGFyaXNjX3ZtYWxsb2Nfc3RhcnQgPSBTRVRfTUFQX09GRlNFVChwY3hsX2RtYV9zdGFydAorCQkJCQkJKyBQQ1hMX0RNQV9NQVBfU0laRSk7CiAJfSBlbHNlIHsKIAkJcGN4bF9kbWFfc3RhcnQgPSAwOwotCQl2bWFsbG9jX3N0YXJ0ID0gU0VUX01BUF9PRkZTRVQoTUFQX1NUQVJUKTsKKwkJcGFyaXNjX3ZtYWxsb2Nfc3RhcnQgPSBTRVRfTUFQX09GRlNFVChNQVBfU1RBUlQpOwogCX0KICNlbHNlCi0Jdm1hbGxvY19zdGFydCA9IFNFVF9NQVBfT0ZGU0VUKE1BUF9TVEFSVCk7CisJcGFyaXNjX3ZtYWxsb2Nfc3RhcnQgPSBTRVRfTUFQX09GRlNFVChNQVBfU1RBUlQpOwogI2VuZGlmCiAKIAlwcmludGsoS0VSTl9JTkZPICJNZW1vcnk6ICVsdWsvJWx1ayBhdmFpbGFibGUgKCVkayBrZXJuZWwgY29kZSwgJWRrIHJlc2VydmVkLCAlZGsgZGF0YSwgJWRrIGluaXQpXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCA0ZmQ0NzkwLi4yYmExNGU3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtMzg1LDkgKzM4NSwxNSBAQAogCiBjb25maWcgTk9ERVNfU0hJRlQKIAlpbnQKKwlkZWZhdWx0ICI4IiBpZiBQUEM2NAogCWRlZmF1bHQgIjQiCiAJZGVwZW5kcyBvbiBORUVEX01VTFRJUExFX05PREVTCiAKK2NvbmZpZyBNQVhfQUNUSVZFX1JFR0lPTlMKKwlpbnQKKwlkZWZhdWx0ICIyNTYiIGlmIFBQQzY0CisJZGVmYXVsdCAiMzIiCisKIGNvbmZpZyBBUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBQUEM2NApAQCAtNDA4LDYgKzQxNCwxMCBAQAogY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCiAJZGVmX2Jvb2wgeQogCitjb25maWcgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUworICAgICAgIGRlZl9ib29sIHkKKyAgICAgICBkZXBlbmRzIG9uIFBQQ19CT09LM1NfNjQKKwogc291cmNlICJtbS9LY29uZmlnIgogCiBjb25maWcgQVJDSF9NRU1PUllfUFJPQkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQppbmRleCA5NTJhMzk2Li4xYTU0YTNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCkBAIC0xNTgsMTQgKzE1OCwyMyBAQAogIyBEZWZhdWx0IHRvIHpJbWFnZSwgb3ZlcnJpZGUgd2hlbiBuZWVkZWQKIGFsbDogekltYWdlCiAKLUNQUEZMQUdTX3ZtbGludXgubGRzCTo9IC1VcG93ZXJwYwotCiBCT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB1SW1hZ2UgekltYWdlJSBkdGJJbWFnZSUgdHJlZUltYWdlLiUgY3VJbWFnZS4lIHNpbXBsZUltYWdlLiUKIAogUEhPTlkgKz0gJChCT09UX1RBUkdFVFMpCiAKIGJvb3QgOj0gYXJjaC8kKEFSQ0gpL2Jvb3QKIAoraWZlcSAoJChDT05GSUdfUkVMT0NBVEFCTEUpLHkpCitxdWlldF9jbWRfcmVsb2NzX2NoZWNrID0gQ0FMTCAgICAkPAorICAgICAgY21kX3JlbG9jc19jaGVjayA9IHBlcmwgJDwgIiQoT0JKRFVNUCkiICIkKG9iaikvdm1saW51eCIKKworUEhPTlkgKz0gcmVsb2NzX2NoZWNrCityZWxvY3NfY2hlY2s6IGFyY2gvcG93ZXJwYy9yZWxvY3NfY2hlY2sucGwgdm1saW51eAorCSQoY2FsbCBjbWQscmVsb2NzX2NoZWNrKQorCit6SW1hZ2U6IHJlbG9jc19jaGVjaworZW5kaWYKKwogJChCT09UX1RBUkdFVFMpOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgQVJDSD1wcGM2NCAkKGJ1aWxkKT0kKGJvb3QpICQocGF0c3Vic3QgJSwkKGJvb3QpLyUsJEApCiAKQEAgLTE4Miw4ICsxOTEsOCBAQAogICBAZWNobyAnICBzaW1wbGVJbWFnZS48ZHQ+IC0gRmlybXdhcmUgaW5kZXBlbmRlbnQgaW1hZ2UuJwogICBAZWNobyAnICB0cmVlSW1hZ2UuPGR0PiAgLSBTdXBwb3J0IGZvciBvbGRlciBJQk0gNHh4IGZpcm13YXJlIChub3QgVS1Cb290KScKICAgQGVjaG8gJyAgaW5zdGFsbCAgICAgICAgIC0gSW5zdGFsbCBrZXJuZWwgdXNpbmcnCi0gIEBlY2hvICcgICAgICAgICAgICAgICAgICAgICh5b3VyKSB+L2Jpbi9pbnN0YWxsa2VybmVsIG9yJwotICBAZWNobyAnICAgICAgICAgICAgICAgICAgICAoZGlzdHJpYnV0aW9uKSAvc2Jpbi9pbnN0YWxsa2VybmVsIG9yJworICBAZWNobyAnICAgICAgICAgICAgICAgICAgICAoeW91cikgfi9iaW4vJChJTlNUQUxMS0VSTkVMKSBvcicKKyAgQGVjaG8gJyAgICAgICAgICAgICAgICAgICAgKGRpc3RyaWJ1dGlvbikgL3NiaW4vJChJTlNUQUxMS0VSTkVMKSBvcicKICAgQGVjaG8gJyAgICAgICAgICAgICAgICAgICAgaW5zdGFsbCB0byAkJChJTlNUQUxMX1BBVEgpIGFuZCBydW4gbGlsbycKICAgQGVjaG8gJyAgKl9kZWZjb25maWcgICAgIC0gU2VsZWN0IGRlZmF1bHQgY29uZmlnIGZyb20gYXJjaC8kKEFSQ0gpL2NvbmZpZ3MnCiAgIEBlY2hvICcnCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY201MjAwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jbTUyMDAuZHRzCmluZGV4IGNlZTgwODAuLmRkMzg2MDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jbTUyMDAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jbTUyMDAuZHRzCkBAIC0yMTAsNyArMjEwLDYgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwogCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKIAkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKLQkJCWZzbDUyMDAtY2xvY2tpbmc7CiAJCX07CiAKIAkJc3JhbUA4MDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9kaWdzeV9tdGMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2RpZ3N5X210Yy5kdHMKaW5kZXggNGMzNjE4Ni4uOGU5YmU2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2RpZ3N5X210Yy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2RpZ3N5X210Yy5kdHMKQEAgLTE5OSw3ICsxOTksNiBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MHgzZDAwIDB4NDA+OwogCQkJaW50ZXJydXB0cyA9IDwyIDE1IDA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAogCQkJcnRjQDUwIHsKIAkJCQljb21wYXRpYmxlID0gImF0LDI0YzA4IjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDAuZHRzCmluZGV4IGRlMzBiM2YuLjgyZmYyYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwLmR0cwpAQCAtMjQ3LDcgKzI0Nyw2IEBACiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwogCQkJcmVnID0gPDB4M2QwMCAweDQwPjsKIAkJCWludGVycnVwdHMgPSA8MiAxNSAwPjsKLQkJCWZzbDUyMDAtY2xvY2tpbmc7CiAJCX07CiAKIAkJaTJjQDNkNDAgewpAQCAtMjU2LDcgKzI1NSw2IEBACiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwogCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKIAkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKLQkJCWZzbDUyMDAtY2xvY2tpbmc7CiAJCX07CiAJCXNyYW1AODAwMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLXNyYW0iOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDBiLmR0cwppbmRleCBkMTNjYjExLi5lNDVhNjNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDBiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDBiLmR0cwpAQCAtMjUxLDcgKzI1MSw2IEBACiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKIAkJCXJlZyA9IDwweDNkMDAgMHg0MD47CiAJCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0JCQlmc2w1MjAwLWNsb2NraW5nOwogCQl9OwogCiAJCWkyY0AzZDQwIHsKQEAgLTI2MCw3ICsyNTksNiBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwogCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAkJfTsKIAogCQlzcmFtQDgwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21lZGlhNTIwMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWVkaWE1MjAwLmR0cwppbmRleCBlMjk3ZDhiLi4wYzM5MDJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWVkaWE1MjAwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWVkaWE1MjAwLmR0cwpAQCAtMjIzLDcgKzIyMyw2IEBACiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKIAkJCXJlZyA9IDwweDNkMDAgMHg0MD47CiAJCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0JCQlmc2w1MjAwLWNsb2NraW5nOwogCQl9OwogCiAJCWkyY0AzZDQwIHsKQEAgLTIzMiw3ICsyMzEsNiBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwogCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAkJfTsKIAogCQlzcmFtQDgwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21vdGlvbnByby5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cwppbmRleCA3YmU4Y2EwLi42Y2E0ZmMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cwpAQCAtMjIyLDcgKzIyMiw2IEBACiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKIAkJCXJlZyA9IDwweDNkNDAgMHg0MD47CiAJCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47Ci0JCQlmc2w1MjAwLWNsb2NraW5nOwogCiAJCQlydGNANjggewogCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzOSI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTEyMWFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTEyMWFkcy5kdHMKaW5kZXggYzJiOGRiZi4uYzM1M2RhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUxMjFhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MTIxYWRzLmR0cwpAQCAtMjA5LDcgKzIwOSw2IEBACiAJCQlyZWcgPSA8MHgxNzAwIDB4MjA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmaXBpYyA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAkJfTsKIAogCQlpMmNAMTcyMCB7CkBAIC0yMjAsNyArMjE5LDYgQEAKIAkJCXJlZyA9IDwweDE3MjAgMHgyMD47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDB4OD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmaXBpYyA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAkJfTsKIAogCQlpMmNAMTc0MCB7CkBAIC0yMzEsNyArMjI5LDYgQEAKIAkJCXJlZyA9IDwweDE3NDAgMHgyMD47CiAJCQlpbnRlcnJ1cHRzID0gPDExIDB4OD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmaXBpYyA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAkJfTsKIAogCQlpMmNjb250cm9sQDE3NjAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL211Y21jNTIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL211Y21jNTIuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MmE3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXVjbWM1Mi5kdHMKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBNYW5yb2xhbmQgbXVjbWM1MiBib2FyZCBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyBHbWJICisgKiBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KKyAqIENvcHlyaWdodCAyMDA2LTIwMDcgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2R0cy12MS87CisKKy8geworCW1vZGVsID0gIm1hbnJvbGFuZCxtdWNtYzUyIjsKKwljb21wYXRpYmxlID0gIm1hbnJvbGFuZCxtdWNtYzUyIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsNTIwMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SworCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCisJCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4MDAwMDAwMDAgMHgwNDAwMDAwMD47CS8vIDY0TUIKKwl9OworCisJc29jNTIwMEBmMDAwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaW1tciI7CisJCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47CisJCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OworCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKworCQljZG1AMjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7CisJCQlyZWcgPSA8MHgyMDAgMHgzOD47CisJCX07CisKKwkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7CisJCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKKwkJCXJlZyA9IDwweDUwMCAweDgwPjsKKwkJfTsKKworCQlncHQwOiB0aW1lckA2MDAgewkvLyBHUFQgMCBpbiBHUElPIG1vZGUKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2MDAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwdDE6IHRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2MTAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlncHQyOiB0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjIwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJZ3B0MzogdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDYzMCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7CisJCQlyZWcgPSA8MHhiMDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW9fd2t1cDogZ3Bpb0BjMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKKwkJCXJlZyA9IDwweGMwMCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKKwkJCXJlZyA9IDwweDEyMDAgMHg4MD47CisJCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCisJCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCisJCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKKwkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKKwkJfTsKKworCQl4bGJAMWYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOworCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCX07CisKKwkJc2VyaWFsQDIwMDAgeyAvKiBQU0MxIGluIFVBUlQgbW9kZSAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxIDA+OworCQl9OworCisJCXNlcmlhbEAyMjAwIHsgLyogUFNDMiBpbiBVQVJUIG1vZGUgKi8KKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOworCQkJcmVnID0gPDB4MjIwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKKwkJfTsKKworCQlzZXJpYWxAMmMwMCB7IC8qIFBTQzYgaW4gVUFSVCBtb2RlICovCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKKwkJCXJlZyA9IDwweDJjMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDQgMD47CisJCX07CisKKwkJZXRoZXJuZXRAMzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOworCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MiA1IDA+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisJCX07CisKKwkJbWRpb0AzMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7CisJCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsgCS8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cworCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47IAkvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KKworCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgeworCQkJCWNvbXBhdGlibGUgPSAiaW50ZWwsbHh0OTcxIjsKKwkJCQlyZWcgPSA8MD47CisJCQl9OworCQl9OworCisJCWF0YUAzYTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7CisJCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiA3IDA+OworCQl9OworCisJCWkyY0AzZDQwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDNkNDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47CisJCQlod21vbkAyYyB7CisJCQkJY29tcGF0aWJsZSA9ICJhZCxhZG05MjQwIjsKKwkJCQlyZWcgPSA8MHgyYz47CisJCQl9OworCQkJcnRjQDUxIHsKKwkJCQljb21wYXRpYmxlID0gIm54cCxwY2Y4NTYzIjsKKwkJCQlyZWcgPSA8MHg1MT47CisJCQl9OworCQl9OworCisJCXNyYW1AODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7CisJCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47CisJCX07CisJfTsKKworCXBjaUBmMDAwMGQwMCB7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGNpIiwiZnNsLG1wYzUyMDAtcGNpIjsKKwkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDEwICovCisJCQkJMHg4MDAwIDAgMCAxICZtcGM1MjAwX3BpYyAwIDMgMworCQkJCTB4ODAwMCAwIDAgMiAmbXBjNTIwMF9waWMgMCAzIDMKKwkJCQkweDgwMDAgMCAwIDMgJm1wYzUyMDBfcGljIDAgMiAzCisJCQkJMHg4MDAwIDAgMCA0ICZtcGM1MjAwX3BpYyAwIDEgMworCQkJCT47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRnJvbSBib290IGxvYWRlcgorCQlpbnRlcnJ1cHRzID0gPDIgOCAwIDIgOSAwIDIgMTAgMD47CisJCWJ1cy1yYW5nZSA9IDwwIDA+OworCQlyYW5nZXMgPSA8MHg0MjAwMDAwMCAwIDB4NjAwMDAwMDAgMHg2MDAwMDAwMCAwIDB4MTAwMDAwMDAKKwkJCSAgMHgwMjAwMDAwMCAwIDB4OTAwMDAwMDAgMHg5MDAwMDAwMCAwIDB4MTAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhhMDAwMDAwMCAwIDB4MDEwMDAwMDA+OworCX07CisKKwlsb2NhbGJ1cyB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsImZzbCxtcGM1MjAwLWxwYiIsInNpbXBsZS1idXMiOworCisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlyYW5nZXMgPSA8MCAwIDB4ZmY4MDAwMDAgMHgwMDgwMDAwMAorCQkJICAxIDAgMHg4MDAwMDAwMCAweDAwODAwMDAwCisJCQkgIDMgMCAweDgwMDAwMDAwIDB4MDA4MDAwMDA+OworCisJCWZsYXNoQDAsMCB7CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MCAwIDB4MDA4MDAwMDA+OworCQkJYmFuay13aWR0aCA9IDw0PjsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQlwYXJ0aXRpb25AMCB7CisJCQkJbGFiZWwgPSAiRFRTIjsKKwkJCQlyZWcgPSA8MHgwIDB4MDAxMDAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkAxMDAwMDAgeworCQkJCWxhYmVsID0gIktlcm5lbCI7CisJCQkJcmVnID0gPDB4MTAwMDAwIDB4MDAyMDAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkAzMDAwMDAgeworCQkJCWxhYmVsID0gIlJvb3RGUyI7CisJCQkJcmVnID0gPDB4MDAzMDAwMDAgMHgwMDIwMDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQDUwMDAwMCB7CisJCQkJbGFiZWwgPSAidXNlciI7CisJCQkJcmVnID0gPDB4MDA1MDAwMDAgMHgwMDIwMDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQDcwMDAwMCB7CisJCQkJbGFiZWwgPSAiVS1Cb290IjsKKwkJCQlyZWcgPSA8MHgwMDcwMDAwMCAweDAwMDQwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25ANzQwMDAwIHsKKwkJCQlsYWJlbCA9ICJFbnYiOworCQkJCXJlZyA9IDwweDAwNzQwMDAwIDB4MDAwMjAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkA3NjAwMDAgeworCQkJCWxhYmVsID0gInJlZC4gRW52IjsKKwkJCQlyZWcgPSA8MHgwMDc2MDAwMCAweDAwMDIwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25ANzgwMDAwIHsKKwkJCQlsYWJlbCA9ICJyZXNlcnZlIjsKKwkJCQlyZWcgPSA8MHgwMDc4MDAwMCAweDAwMDgwMDAwPjsKKwkJCX07CisJCX07CisKKwkJc2ltcGxlMTAwOiBncGlvLWNvbnRyb2xsZXItMTAwQDMsNjAwMTAwIHsKKwkJCWNvbXBhdGlibGUgPSAibWFucm9sYW5kLG11Y21jNTItYXV4LWdwaW8iOworCQkJcmVnID0gPDMgMHgwMDYwMDEwMCAweDE+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisJCXNpbXBsZTEwNDogZ3Bpby1jb250cm9sbGVyLTEwNEAzLDYwMDEwNCB7CisJCQljb21wYXRpYmxlID0gIm1hbnJvbGFuZCxtdWNtYzUyLWF1eC1ncGlvIjsKKwkJCXJlZyA9IDwzIDB4MDA2MDAxMDQgMHgxPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCQlzaW1wbGUyMDA6IGdwaW8tY29udHJvbGxlci0yMDBAMyw2MDAyMDAgeworCQkJY29tcGF0aWJsZSA9ICJtYW5yb2xhbmQsbXVjbWM1Mi1hdXgtZ3BpbyI7CisJCQlyZWcgPSA8MyAweDAwNjAwMjAwIDB4MT47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJfTsKKwkJc2ltcGxlMjAxOiBncGlvLWNvbnRyb2xsZXItMjAxQDMsNjAwMjAxIHsKKwkJCWNvbXBhdGlibGUgPSAibWFucm9sYW5kLG11Y21jNTItYXV4LWdwaW8iOworCQkJcmVnID0gPDMgMHgwMDYwMDIwMSAweDE+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisJCXNpbXBsZTIwMjogZ3Bpby1jb250cm9sbGVyLTIwMkAzLDYwMDIwMiB7CisJCQljb21wYXRpYmxlID0gIm1hbnJvbGFuZCxtdWNtYzUyLWF1eC1ncGlvIjsKKwkJCXJlZyA9IDwzIDB4MDA2MDAyMDIgMHgxPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCQlzaW1wbGUyMDM6IGdwaW8tY29udHJvbGxlci0yMDNAMyw2MDAyMDMgeworCQkJY29tcGF0aWJsZSA9ICJtYW5yb2xhbmQsbXVjbWM1Mi1hdXgtZ3BpbyI7CisJCQlyZWcgPSA8MyAweDAwNjAwMjAzIDB4MT47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJfTsKKwkJc2ltcGxlMjA0OiBncGlvLWNvbnRyb2xsZXItMjA0QDMsNjAwMjA0IHsKKwkJCWNvbXBhdGlibGUgPSAibWFucm9sYW5kLG11Y21jNTItYXV4LWdwaW8iOworCQkJcmVnID0gPDMgMHgwMDYwMDIwNCAweDE+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisJCXNpbXBsZTIwNjogZ3Bpby1jb250cm9sbGVyLTIwNkAzLDYwMDIwNiB7CisJCQljb21wYXRpYmxlID0gIm1hbnJvbGFuZCxtdWNtYzUyLWF1eC1ncGlvIjsKKwkJCXJlZyA9IDwzIDB4MDA2MDAyMDYgMHgxPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCQlzaW1wbGUyMDc6IGdwaW8tY29udHJvbGxlci0yMDdAMyw2MDAyMDcgeworCQkJY29tcGF0aWJsZSA9ICJtYW5yb2xhbmQsbXVjbWM1Mi1hdXgtZ3BpbyI7CisJCQlyZWcgPSA8MyAweDAwNjAwMjA3IDB4MT47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJfTsKKwkJc2ltcGxlMjBmOiBncGlvLWNvbnRyb2xsZXItMjBmQDMsNjAwMjBmIHsKKwkJCWNvbXBhdGlibGUgPSAibWFucm9sYW5kLG11Y21jNTItYXV4LWdwaW8iOworCQkJcmVnID0gPDMgMHgwMDYwMDIwZiAweDE+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKaW5kZXggMzBiZmRjMC4uOGE0ZWMzMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKQEAgLTI0NCw3ICsyNDQsNiBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MHgzZDAwIDB4NDA+OwogCQkJaW50ZXJydXB0cyA9IDwyIDE1IDA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAkJfTsKIAogCQlpMmNAM2Q0MCB7CkBAIC0yNTMsNyArMjUyLDYgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwogCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKIAkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKLQkJCWZzbDUyMDAtY2xvY2tpbmc7CiAJCQlydGNANTEgewogCQkJCWNvbXBhdGlibGUgPSAibnhwLHBjZjg1NjMiOwogCQkJCXJlZyA9IDwweDUxPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMi5kdHMKaW5kZXggMDMwMDQyNi4uODVkODU3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMi5kdHMKQEAgLTI0NCw3ICsyNDQsNiBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MHgzZDAwIDB4NDA+OwogCQkJaW50ZXJydXB0cyA9IDwyIDE1IDA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAkJfTsKIAogCQlpMmNAM2Q0MCB7CkBAIC0yNTMsNyArMjUyLDYgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwogCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKIAkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKLQkJCWZzbDUyMDAtY2xvY2tpbmc7CiAJCQlydGNANTEgewogCQkJCWNvbXBhdGlibGUgPSAibnhwLHBjZjg1NjMiOwogCQkJCXJlZyA9IDwweDUxPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW01MjAwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW01MjAwLmR0cwppbmRleCBjOTU5MGI1Li4xZGIwN2Y2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtNTIwMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTUyMDAuZHRzCkBAIC0xNjAsNyArMTYwLDYgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwogCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwotCQkJZnNsNTIwMC1jbG9ja2luZzsKIAogCQkJIHJ0Y0A2OCB7CiAJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzA3IjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy91YzEwMS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdWMxMDEuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTI2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdWMxMDEuZHRzCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogTWFucm9sYW5kIHVjMTAxIGJvYXJkIERldmljZSBUcmVlIFNvdXJjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIEdtYkgKKyAqIEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorICogQ29weXJpZ2h0IDIwMDYtMjAwNyBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvZHRzLXYxLzsKKworLyB7CisJbW9kZWwgPSAibWFucm9sYW5kLHVjMTAxIjsKKwljb21wYXRpYmxlID0gIm1hbnJvbGFuZCx1YzEwMSI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlQb3dlclBDLDUyMDBAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKKwkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCisJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgorCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDQwMDAwMDA+OwkvLyA2NE1CCisJfTsKKworCXNvYzUyMDBAZjAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOworCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OworCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisKKwkJY2RtQDIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOworCQkJcmVnID0gPDB4MjAwIDB4Mzg+OworCQl9OworCisJCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgeworCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7CisJCQlyZWcgPSA8MHg1MDAgMHg4MD47CisJCX07CisKKwkJZ3B0MDogdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDYwMCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSA5IDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJZ3B0MTogdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDYxMCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwdDI6IHRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2MjAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlncHQzOiB0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjMwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJZ3B0NDogdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDY0MCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwdDU6IHRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2NTAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlncHQ2OiB0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjYwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJZ3B0NzogdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDY3MCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7CisJCQlyZWcgPSA8MHhiMDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW9fd2t1cDogZ3Bpb0BjMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKKwkJCXJlZyA9IDwweGMwMCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKKwkJCXJlZyA9IDwweDEyMDAgMHg4MD47CisJCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCisJCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCisJCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKKwkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKKwkJfTsKKworCQl4bGJAMWYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOworCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCX07CisKKwkJc2VyaWFsQDIwMDAgeyAvKiBQU0MxIGluIFVBUlQgbW9kZSAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxIDA+OworCQl9OworCisJCXNlcmlhbEAyMjAwIHsgLyogUFNDMiBpbiBVQVJUIG1vZGUgKi8KKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOworCQkJcmVnID0gPDB4MjIwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKKwkJfTsKKworCQlzZXJpYWxAMmMwMCB7CQkvKiBQU0M2IGluIFVBUlQgbW9kZSAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7CisJCQlyZWcgPSA8MHgyYzAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiA0IDA+OworCQl9OworCisJCWV0aGVybmV0QDMwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKKwkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKKwkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCQl9OworCisJCW1kaW9AMzAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOworCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CS8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cworCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CS8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgorCisJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJpbnRlbCxseHQ5NzEiOworCQkJCXJlZyA9IDwwPjsKKwkJCX07CisJCX07CisKKwkJYXRhQDNhMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKKwkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47CisJCX07CisKKwkJaTJjQDNkNDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOworCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKKwkJCWZzbCxwcmVzZXJ2ZS1jbG9ja2luZzsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDA+OworCisJCQlod21vbkAyYyB7CisJCQkJY29tcGF0aWJsZSA9ICJhZCxhZG05MjQwIjsKKwkJCQlyZWcgPSA8MHgyYz47CisJCQl9OworCQkJcnRjQDUxIHsKKwkJCQljb21wYXRpYmxlID0gIm54cCxwY2Y4NTYzIjsKKwkJCQlyZWcgPSA8MHg1MT47CisJCQl9OworCQl9OworCisJCXNyYW1AODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7CisJCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47CisJCX07CisJfTsKKworCWxvY2FsYnVzIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwiZnNsLG1wYzUyMDAtbHBiIiwic2ltcGxlLWJ1cyI7CisKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCisJCXJhbmdlcyA9IDwwIDAgMHhmZjgwMDAwMCAweDAwODAwMDAwCisJCQkgIDEgMCAweDgwMDAwMDAwIDB4MDA4MDAwMDAKKwkJCSAgMyAwIDB4ODAwMDAwMDAgMHgwMDgwMDAwMD47CisKKwkJZmxhc2hAMCwwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJCXJlZyA9IDwwIDAgMHgwMDgwMDAwMD47CisJCQliYW5rLXdpZHRoID0gPDI+OworCQkJZGV2aWNlLXdpZHRoID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKworCQkJcGFydGl0aW9uQDAgeworCQkJCWxhYmVsID0gIkRUUyI7CisJCQkJcmVnID0gPDB4MCAweDAwMTAwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AMTAwMDAwIHsKKwkJCQlsYWJlbCA9ICJLZXJuZWwiOworCQkJCXJlZyA9IDwweDEwMDAwMCAweDAwMjAwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AMzAwMDAwIHsKKwkJCQlsYWJlbCA9ICJSb290RlMiOworCQkJCXJlZyA9IDwweDAwMzAwMDAwIDB4MDAyMDAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkA1MDAwMDAgeworCQkJCWxhYmVsID0gInVzZXIiOworCQkJCXJlZyA9IDwweDAwNTAwMDAwIDB4MDAyMDAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkA3MDAwMDAgeworCQkJCWxhYmVsID0gIlUtQm9vdCI7CisJCQkJcmVnID0gPDB4MDA3MDAwMDAgMHgwMDA0MDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQDc0MDAwMCB7CisJCQkJbGFiZWwgPSAiRW52IjsKKwkJCQlyZWcgPSA8MHgwMDc0MDAwMCAweDAwMDEwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25ANzUwMDAwIHsKKwkJCQlsYWJlbCA9ICJyZWQuIEVudiI7CisJCQkJcmVnID0gPDB4MDA3NTAwMDAgMHgwMDAxMDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQDc2MDAwMCB7CisJCQkJbGFiZWwgPSAicmVzZXJ2ZSI7CisJCQkJcmVnID0gPDB4MDA3NjAwMDAgMHgwMDBhMDAwMD47CisJCQl9OworCQl9OworCisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9pbnN0YWxsLnNoIGIvYXJjaC9wb3dlcnBjL2Jvb3QvaW5zdGFsbC5zaAppbmRleCA5ODMxMmQxLi5iNmEyNTZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9pbnN0YWxsLnNoCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2luc3RhbGwuc2gKQEAgLTIzLDggKzIzLDggQEAKIAogIyBVc2VyIG1heSBoYXZlIGEgY3VzdG9tIGluc3RhbGwgc2NyaXB0CiAKLWlmIFsgLXggfi9iaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIH4vYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsICIkQCI7IGZpCi1pZiBbIC14IC9zYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyAvc2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCAiJEAiOyBmaQoraWYgWyAteCB+L2Jpbi8ke0lOU1RBTExLRVJORUx9IF07IHRoZW4gZXhlYyB+L2Jpbi8ke0lOU1RBTExLRVJORUx9ICIkQCI7IGZpCitpZiBbIC14IC9zYmluLyR7SU5TVEFMTEtFUk5FTH0gXTsgdGhlbiBleGVjIC9zYmluLyR7SU5TVEFMTEtFUk5FTH0gIiRAIjsgZmkKIAogIyBEZWZhdWx0IGluc3RhbGwKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9jbTUyMDBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9jbTUyMDBfZGVmY29uZmlnCmluZGV4IDM4MzhiNzcuLjAzOTZjZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvY201MjAwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L2NtNTIwMF9kZWZjb25maWcKQEAgLTEsMjUgKzEsMjcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzIKLSMgU2F0IEFwciAxOCAwMDo0Nzo0NCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzItcmM0CisjIFRodSBPY3QgMTUgMTA6MzM6MjIgMjAwOQogIwogIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBzdXBwb3J0CiAjCi1DT05GSUdfNnh4PXkKK0NPTkZJR19QUENfQk9PSzNTXzMyPXkKICMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAogIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKICMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CiAjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKIENPTkZJR19QUENfQk9PSzNTPXkKK0NPTkZJR182eHg9eQogQ09ORklHX1BQQ19GUFU9eQogIyBDT05GSUdfQUxUSVZFQyBpcyBub3Qgc2V0CiBDT05GSUdfUFBDX1NURF9NTVU9eQogQ09ORklHX1BQQ19TVERfTU1VXzMyPXkKICMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorQ09ORklHX1BQQ19IQVZFX1BNVV9TVVBQT1JUPXkKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDMzI9eQogQ09ORklHX1dPUkRfU0laRT0zMgpAQCAtMzAsMTUgKzMyLDE3IEBACiBDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogIyBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LIGlzIG5vdCBzZXQKIENPTkZJR19JUlFfUEVSX0NQVT15CiBDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKIENPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CiBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogIyBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUyBpcyBub3Qgc2V0CiBDT05GSUdfUFBDPXkKQEAgLTUyLDExICs1NiwxMyBAQAogIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19EVEM9eQogQ09ORklHX0RFRkFVTFRfVUlNQUdFPXkKICMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9TVVBQT1JUU19ERUJVR19QQUdFQUxMT0M9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTc3LDExICs4MywxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfR1JPVVBfU0NIRUQ9eQpAQCAtMTA1LDcgKzExMiw2IEBACiBDT05GSUdfRU1CRURERUQ9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTExOCw2ICsxMjQsMTMgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKKworIworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycworIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMVUJfREVCVUc9eQogQ09ORklHX0NPTVBBVF9CUks9eQpAQCAtMTI1LDE0ICsxMzgsMTkgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CitDT05GSUdfSEFWRV9ETUFfQVRUUlM9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIwogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTE0MCw3ICsxNTgsNyBAQAogQ09ORklHX0JBU0VfU01BTEw9MAogIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTIxOSwxMSArMjM3LDEzIEBACiAjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXSU9UTEIgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19BUkNIX0hBU19XQUxLX01FTU9SWT15CiBDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRT15CiAjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MzIKIENPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yMzksOSArMjU5LDEwIEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfQk9VTkNFPXkKIENPTkZJR19WSVJUX1RPX0JVUz15Ci1DT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogQ09ORklHX1BQQ180S19QQUdFUz15CiAjIENPTkZJR19QUENfMTZLX1BBR0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ182NEtfUEFHRVMgaXMgbm90IHNldApAQCAtMjUyLDYgKzI3Myw3IEBACiBDT05GSUdfRVhUUkFfVEFSR0VUUz0iIgogQ09ORklHX1BNPXkKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAogQ09ORklHX1NFQ0NPTVA9eQogQ09ORklHX0lTQV9ETUFfQVBJPXkKIApAQCAtMzI4LDYgKzM1MCw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtMzQyLDYgKzM2NSw3IEBACiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjE1NCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAogIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKIApAQCAtMzY3LDYgKzM5MSw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldApAQCAtNDU3LDYgKzQ4Miw3IEBACiAjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKIENPTkZJR19PRl9ERVZJQ0U9eQogQ09ORklHX09GX0kyQz15CitDT05GSUdfT0ZfTURJTz15CiAjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWPXkKICMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldApAQCAtNDk1LDEwICs1MjEsNiBAQAogIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CiBDT05GSUdfQ0hSX0RFVl9TRz15CiAjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCi0jCiAjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldApAQCAtNTE5LDcgKzU0MSw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfQ09NUEFUX05FVF9ERVZfT1BTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC01NTgsMTQgKzU3OSwxNCBAQAogIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tTODg1MV9NTEwgaXMgbm90IHNldAogQ09ORklHX0ZFQ19NUEM1Mnh4PXkKIENPTkZJR19GRUNfTVBDNTJ4eF9NRElPPXkKKyMgQ09ORklHX1hJTElOWF9FTUFDTElURSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNjM2LDYgKzY1Nyw3IEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DT01QQVQ9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC02NDYsNiArNjY4LDcgQEAKICMKICMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCiAjCisjIENPTkZJR19JMkNfREVTSUdOV0FSRSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX01QQz15CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldApAQCAtNjY2LDIzICs2ODksMjMgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKICMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC03MTMsMjUgKzczNiwxMiBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZHJpdmVycwotIwotIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKQEAgLTc3NSwxMSArNzg1LDEyIEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogQ09ORklHX1VTQl9PSENJX0hDRF9QUENfU09DPXkKLUNPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GPXkKIENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GX0JFPXkKICMgQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfTEUgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0Y9eQogQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQz15CiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPPXkKICMgQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldApAQCAtODY2LDYgKzg3NywxMCBAQAogIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgVEkgVkxZTlEKKyMKICMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCkBAIC04ODUsMTAgKzkwMCwxMyBAQAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKK0NPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKQEAgLTk1OSwxMiArOTc3LDEyIEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfVjRfMSBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQpAQCAtMTA2NCw2ICsxMDgyLDcgQEAKIENPTkZJR19IQVNfRE1BPXkKIENPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKK0NPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtMTA3Myw2ICsxMDkyLDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTEwOTAsMTAgKzExMTAsMTQgQEAKICMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAogIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tNRU1MRUFLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAogIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CkBAIC0xMTA1LDExICsxMTI5LDEyIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKQEAgLTExMTgsMjMgKzExNDMsMjUgQEAKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQotCi0jCi0jIFRyYWNlcnMKLSMKK0NPTkZJR19GVFJBQ0U9eQogIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CisjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FMTF9CUkFOQ0hFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RJU0FCTEVfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfV0VSUk9SPXkKIENPTkZJR19QUklOVF9TVEFDS19ERVBUSD02NAogIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CkBAIC0xMTU5LDcgKzExODYsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQyPXkKQEAgLTEyMDAsMTEgKzEyMjYsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19NRDU9eQogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvbGl0ZTUyMDBiX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvbGl0ZTUyMDBiX2RlZmNvbmZpZwppbmRleCAyOWIwZjM0Li5mNWMwN2ZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L2xpdGU1MjAwYl9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9saXRlNTIwMGJfZGVmY29uZmlnCkBAIC0xLDI1ICsxLDI3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMyCi0jIFNhdCBBcHIgMTggMDA6NDg6MDQgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMyLXJjNAorIyBUaHUgT2N0IDE1IDEwOjMzOjI0IDIwMDkKICMKICMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3Igc3VwcG9ydAogIwotQ09ORklHXzZ4eD15CitDT05GSUdfUFBDX0JPT0szU18zMj15CiAjIENPTkZJR19QUENfODV4eCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfOHh4IGlzIG5vdCBzZXQKICMgQ09ORklHXzQweCBpcyBub3Qgc2V0CiAjIENPTkZJR180NHggaXMgbm90IHNldAogIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDX0JPT0szUz15CitDT05GSUdfNnh4PXkKIENPTkZJR19QUENfRlBVPXkKICMgQ09ORklHX0FMVElWRUMgaXMgbm90IHNldAogQ09ORklHX1BQQ19TVERfTU1VPXkKIENPTkZJR19QUENfU1REX01NVV8zMj15CiAjIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSEFWRV9QTVVfU1VQUE9SVD15CiAjIENPTkZJR19TTVAgaXMgbm90IHNldAogQ09ORklHX1BQQzMyPXkKIENPTkZJR19XT1JEX1NJWkU9MzIKQEAgLTMwLDE1ICszMiwxNyBAQAogQ09ORklHX0dFTkVSSUNfVElNRV9WU1lTQ0FMTD15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKICMgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FRURfUEVSX0NQVV9FTUJFRF9GSVJTVF9DSFVOSyBpcyBub3Qgc2V0CiBDT05GSUdfSVJRX1BFUl9DUFU9eQogQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQogQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMj15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKICMgQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVMgaXMgbm90IHNldAogQ09ORklHX1BQQz15CkBAIC01MiwxMiArNTYsMTQgQEAKICMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKIENPTkZJR19BVURJVF9BUkNIPXkKIENPTkZJR19HRU5FUklDX0JVRz15CitDT05GSUdfRFRDPXkKIENPTkZJR19ERUZBVUxUX1VJTUFHRT15CiBDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKICMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9TVVBQT1JUU19ERUJVR19QQUdFQUxMT0M9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTc4LDExICs4NCwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfR1JPVVBfU0NIRUQ9eQpAQCAtMTA2LDcgKzExMyw2IEBACiBDT05GSUdfRU1CRURERUQ9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTExOSw2ICsxMjUsMTMgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKKworIworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycworIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1BDSV9RVUlSS1M9eQogQ09ORklHX1NMVUJfREVCVUc9eQpAQCAtMTI3LDE0ICsxNDAsMTkgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CitDT05GSUdfSEFWRV9ETUFfQVRUUlM9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIwogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTE0Nyw3ICsxNjUsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMjI4LDExICsyNDYsMTMgQEAKICMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JT01NVV9IRUxQRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1dJT1RMQiBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQogQ09ORklHX0FSQ0hfSEFTX1dBTEtfTUVNT1JZPXkKIENPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUkVNT1ZFPXkKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorQ09ORklHX01BWF9BQ1RJVkVfUkVHSU9OUz0zMgogQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI0OCw5ICsyNjgsMTAgQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19CT1VOQ0U9eQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKLUNPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiBDT05GSUdfUFBDXzRLX1BBR0VTPXkKICMgQ09ORklHX1BQQ18xNktfUEFHRVMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzY0S19QQUdFUyBpcyBub3Qgc2V0CkBAIC0yNjQsNiArMjg1LDcgQEAKIENPTkZJR19QTV9TTEVFUD15CiBDT05GSUdfU1VTUEVORD15CiBDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAogQ09ORklHX1NFQ0NPTVA9eQogQ09ORklHX0lTQV9ETUFfQVBJPXkKIApAQCAtMzQ4LDYgKzM3MCw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtMzYyLDYgKzM4NSw3IEBACiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjE1NCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAogIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKIApAQCAtMzg3LDYgKzQxMSw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldApAQCAtMzk3LDYgKzQyMiw3IEBACiAjIENPTkZJR19NVEQgaXMgbm90IHNldAogQ09ORklHX09GX0RFVklDRT15CiBDT05GSUdfT0ZfSTJDPXkKK0NPTkZJR19PRl9NRElPPXkKICMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVY9eQogIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CkBAIC00MzEsNyArNDU3LDkgQEAKICMKICMgQ09ORklHX0VFUFJPTV9BVDI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0VFUFJPTV9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NCNzEwX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKQEAgLTQ1NCwxMCArNDgyLDYgQEAKICMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAogIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCi0jCiAjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldApAQCAtNDc1LDYgKzQ5OSw4IEBACiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9DWEdCM19JU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JOWDJfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfQkUySVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldApAQCAtNDgzLDYgKzUwOSw3IEBACiAjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9NVlNBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BRFZBTlNZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CkBAIC01MDIsNyArNTI5LDYgQEAKICMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKQEAgLTUxNCwxMSArNTQwLDE0IEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QTUNSQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQkZBX0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldApAQCAtNTQwLDYgKzU2OSw3IEBACiAjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRQODY3WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldApAQCAtNTY4LDYgKzU5OCw3IEBACiAjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKQEAgLTU4NiwxNCArNjE3LDE3IEBACiAjCiAKICMKLSMgRW5hYmxlIG9ubHkgb25lIG9mIHRoZSB0d28gc3RhY2tzLCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nCisjIFlvdSBjYW4gZW5hYmxlIG9uZSBvciBib3RoIEZpcmVXaXJlIGRyaXZlciBzdGFja3MuCisjCisKKyMKKyMgU2VlIHRoZSBoZWxwIHRleHRzIGZvciBtb3JlIGluZm9ybWF0aW9uLgogIwogIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTY0MCw5ICs2NzQsMTIgQEAKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODUxX01MTCBpcyBub3Qgc2V0CiBDT05GSUdfRkVDX01QQzUyeHg9eQogQ09ORklHX0ZFQ19NUEM1Mnh4X01ESU89eQogIyBDT05GSUdfQVRMMiBpcyBub3Qgc2V0CisjIENPTkZJR19YSUxJTlhfRU1BQ0xJVEUgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKICMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKQEAgLTY2MSw2ICs2OTgsOCBAQAogIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NOSUMgaXMgbm90IHNldAorIyBDT05GSUdfTVY2NDNYWF9FVEggaXMgbm90IHNldAogIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKQEAgLTY4NiwxMCArNzI1LDcgQEAKICMgQ09ORklHX1NGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRTJORVQgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNzU5LDYgKzc5NSw3IEBACiBDT05GSUdfREVWUE9SVD15CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIApAQCAtNzg3LDYgKzgyNCw3IEBACiAjCiAjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQogIworIyBDT05GSUdfSTJDX0RFU0lHTldBUkUgaXMgbm90IHNldAogQ09ORklHX0kyQ19NUEM9eQogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKQEAgLTgxMiwyMyArODUwLDIzIEBACiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CiAjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTg0NywzMCArODg1LDE4IEBACiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkcml2ZXJzCi0jCi0jIENPTkZJR19EQUIgaXMgbm90IHNldAorIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwogIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKK0NPTkZJR19WR0FfQVJCPXkKICMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9bQpAQCAtOTEzLDYgKzkzOSwxMCBAQAogIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgVEkgVkxZTlEKKyMKICMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCkBAIC05MzIsMTAgKzk2MiwxMyBAQAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKK0NPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKQEAgLTk5MiwxMiArMTAyNSwxMiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX1Y0XzEgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX0xPQ0tEPXkKQEAgLTEwNDEsNiArMTA3NCw3IEBACiBDT05GSUdfSEFTX0RNQT15CiBDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CitDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTEwNTAsNiArMTA4NCw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMDY3LDEwICsxMTAyLDE0IEBACiAjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAogIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldApAQCAtMTA4MiwxMSArMTEyMSwxMiBAQAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAotIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CkBAIC0xMDk1LDIzICsxMTM1LDI1IEBACiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKLQotIwotIyBUcmFjZXJzCi0jCitDT05GSUdfRlRSQUNFPXkKICMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQorIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19ESVNBQkxFX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfUFBDX1dFUlJPUj15CiBDT05GSUdfUFJJTlRfU1RBQ0tfREVQVEg9NjQKICMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldApAQCAtMTEzNiw3ICsxMTc4LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC0xMTc4LDExICsxMjE5LDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fTUQ1PXkKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L21vdGlvbnByb19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L21vdGlvbnByb19kZWZjb25maWcKaW5kZXggMDdiNmIyNi4uNGY3N2ExYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9tb3Rpb25wcm9fZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvbW90aW9ucHJvX2RlZmNvbmZpZwpAQCAtMSwyNSArMSwyNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMgotIyBTYXQgQXByIDE4IDAwOjQ4OjIyIDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMi1yYzQKKyMgVGh1IE9jdCAxNSAxMDozMzoyMiAyMDA5CiAjCiAjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIHN1cHBvcnQKICMKLUNPTkZJR182eHg9eQorQ09ORklHX1BQQ19CT09LM1NfMzI9eQogIyBDT05GSUdfUFBDXzg1eHggaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzh4eCBpcyBub3Qgc2V0CiAjIENPTkZJR180MHggaXMgbm90IHNldAogIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKICMgQ09ORklHX0UyMDAgaXMgbm90IHNldAogQ09ORklHX1BQQ19CT09LM1M9eQorQ09ORklHXzZ4eD15CiBDT05GSUdfUFBDX0ZQVT15CiAjIENPTkZJR19BTFRJVkVDIGlzIG5vdCBzZXQKIENPTkZJR19QUENfU1REX01NVT15CiBDT05GSUdfUFBDX1NURF9NTVVfMzI9eQogIyBDT05GSUdfUFBDX01NX1NMSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0hBVkVfUE1VX1NVUFBPUlQ9eQogIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKIENPTkZJR19QUEMzMj15CiBDT05GSUdfV09SRF9TSVpFPTMyCkBAIC0zMCwxNSArMzIsMTcgQEAKIENPTkZJR19HRU5FUklDX1RJTUVfVlNZU0NBTEw9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiAjIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORUVEX1BFUl9DUFVfRU1CRURfRklSU1RfQ0hVTksgaXMgbm90IHNldAogQ09ORklHX0lSUV9QRVJfQ1BVPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKIENPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzI9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15Ci1DT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiAjIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTIGlzIG5vdCBzZXQKIENPTkZJR19QUEM9eQpAQCAtNTIsMTEgKzU2LDEzIEBACiAjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CiBDT05GSUdfQVVESVRfQVJDSD15CiBDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0RUQz15CiBDT05GSUdfREVGQVVMVF9VSU1BR0U9eQogIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQz15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtNzcsMTEgKzgzLDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19HUk9VUF9TQ0hFRD15CkBAIC0xMDUsNyArMTEyLDYgQEAKIENPTkZJR19FTUJFRERFRD15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtMTE4LDYgKzEyNCwxMyBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQorCisjCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCisjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xVQl9ERUJVRz15CiBDT05GSUdfQ09NUEFUX0JSSz15CkBAIC0xMjUsMTQgKzEzOCwxOSBAQAogQ09ORklHX1NMVUI9eQogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUz15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKK0NPTkZJR19IQVZFX0RNQV9BVFRSUz15CiBDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTQwLDcgKzE1OCw3IEBACiBDT05GSUdfQkFTRV9TTUFMTD0wCiAjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMjIwLDExICsyMzgsMTMgQEAKICMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JT01NVV9IRUxQRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1dJT1RMQiBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQogQ09ORklHX0FSQ0hfSEFTX1dBTEtfTUVNT1JZPXkKIENPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUkVNT1ZFPXkKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorQ09ORklHX01BWF9BQ1RJVkVfUkVHSU9OUz0zMgogQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI0MCw5ICsyNjAsMTAgQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19CT1VOQ0U9eQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKLUNPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiBDT05GSUdfUFBDXzRLX1BBR0VTPXkKICMgQ09ORklHX1BQQ18xNktfUEFHRVMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzY0S19QQUdFUyBpcyBub3Qgc2V0CkBAIC0yNTMsNiArMjc0LDcgQEAKIENPTkZJR19FWFRSQV9UQVJHRVRTPSIiCiBDT05GSUdfUE09eQogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUE1fUlVOVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfU0VDQ09NUD15CiBDT05GSUdfSVNBX0RNQV9BUEk9eQogCkBAIC0zMjksNiArMzUxLDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNDMsNiArMzY2LDcgQEAKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19EQ0IgaXMgbm90IHNldAogCkBAIC0zNjgsNiArMzkyLDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CkBAIC00NTgsNiArNDgzLDcgQEAKICMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogQ09ORklHX09GX0RFVklDRT15CiBDT05GSUdfT0ZfSTJDPXkKK0NPTkZJR19PRl9NRElPPXkKICMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVY9eQogIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CkBAIC00ODMsNiArNTA5LDcgQEAKICMKICMgQ09ORklHX0VFUFJPTV9BVDI0IGlzIG5vdCBzZXQKIENPTkZJR19FRVBST01fTEVHQUNZPXkKKyMgQ09ORklHX0VFUFJPTV9NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKQEAgLTUwNiwxMCArNTMzLDYgQEAKICMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAogQ09ORklHX0NIUl9ERVZfU0c9eQogIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAotCi0jCi0jIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwotIwogIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKQEAgLTUzMiw2ICs1NTUsNyBAQAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogQ09ORklHX0FUQV9TRkY9eQogIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CkBAIC01NDAsNyArNTY0LDYgQEAKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTU3OSwxNCArNjAyLDE0IEBACiAjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODUxX01MTCBpcyBub3Qgc2V0CiBDT05GSUdfRkVDX01QQzUyeHg9eQogQ09ORklHX0ZFQ19NUEM1Mnh4X01ESU89eQorIyBDT05GSUdfWElMSU5YX0VNQUNMSVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC02NDcsNiArNjcwLDcgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NPTVBBVD15CiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKQEAgLTY1Nyw2ICs2ODEsNyBAQAogIwogIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKICMKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfTVBDPXkKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CkBAIC02NzYsMjIgKzcwMSwyOCBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQogIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgZHJpdmVycworIwogIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKQEAgLTczOCw2ICs3NjksOCBAQAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RNUDQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RNUDQyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKQEAgLTc0Nyw5ICs3ODAsNyBAQAogIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC03NzUsMjUgKzgwNiwxMiBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZHJpdmVycwotIwotQ09ORklHX0RBQj15CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CkBAIC04MTcsNyArODM1LDcgQEAKICMKICMgTEVEIGRyaXZlcnMKICMKLSMgQ09ORklHX0xFRFNfTFA1NTIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfTFAzOTQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0xFRFNfUENBOTU1WCBpcyBub3Qgc2V0CiAjIENPTkZJR19MRURTX0JEMjgwMiBpcyBub3Qgc2V0CiAKQEAgLTg2Niw2ICs4ODQsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4MDI1IGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTg5Myw2ICs5MTIsMTAgQEAKICMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIFRJIFZMWU5RCisjCiAjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtOTEyLDEwICs5MzUsMTMgQEAKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CitDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CkBAIC05ODYsMTIgKzEwMTIsMTIgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19WNF8xIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD15CkBAIC0xMDkxLDYgKzExMTcsNyBAQAogQ09ORklHX0hBU19ETUE9eQogQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQorQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQogCiAjCiAjIEtlcm5lbCBoYWNraW5nCkBAIC0xMTAwLDYgKzExMjcsNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTExNywxMCArMTE0NSwxNCBAQAogIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTFVCX0RFQlVHX09OIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMVUJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS01FTUxFQUsgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKQEAgLTExMzIsMTEgKzExNjQsMTIgQEAKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldApAQCAtMTE0NSwyMyArMTE3OCwyNSBAQAogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15Ci0KLSMKLSMgVHJhY2VycwotIworQ09ORklHX0ZUUkFDRT15CiAjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX0RFRkFVTFRfVFJBQ0VSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19CUkFOQ0hfUFJPRklMRV9OT05FPXkKKyMgQ09ORklHX1BST0ZJTEVfQU5OT1RBVEVEX0JSQU5DSEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTEVfQUxMX0JSQU5DSEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRElTQUJMRV9XRVJST1IgaXMgbm90IHNldAorQ09ORklHX1BQQ19XRVJST1I9eQogQ09ORklHX1BSSU5UX1NUQUNLX0RFUFRIPTY0CiAjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKQEAgLTExODYsNyArMTIyMSw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEk9eQogQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKIENPTkZJR19DUllQVE9fQUVBRDI9eQpAQCAtMTIyNywxMSArMTI2MSwxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnCmluZGV4IGFmYjFhM2QuLmY5MTY4YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvcGNtMDMwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3BjbTAzMF9kZWZjb25maWcKQEAgLTEsMjUgKzEsMjcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzIKLSMgU2F0IEFwciAxOCAwMDo0ODo0MiAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzItcmM0CisjIFRodSBPY3QgMTUgMTA6MzM6MjUgMjAwOQogIwogIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBzdXBwb3J0CiAjCi1DT05GSUdfNnh4PXkKK0NPTkZJR19QUENfQk9PSzNTXzMyPXkKICMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAogIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKICMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CiAjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKIENPTkZJR19QUENfQk9PSzNTPXkKK0NPTkZJR182eHg9eQogQ09ORklHX1BQQ19GUFU9eQogIyBDT05GSUdfQUxUSVZFQyBpcyBub3Qgc2V0CiBDT05GSUdfUFBDX1NURF9NTVU9eQogQ09ORklHX1BQQ19TVERfTU1VXzMyPXkKICMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorQ09ORklHX1BQQ19IQVZFX1BNVV9TVVBQT1JUPXkKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDMzI9eQogQ09ORklHX1dPUkRfU0laRT0zMgpAQCAtMzAsMTUgKzMyLDE3IEBACiBDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogIyBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LIGlzIG5vdCBzZXQKIENPTkZJR19JUlFfUEVSX0NQVT15CiBDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKIENPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CiBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogIyBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUyBpcyBub3Qgc2V0CiBDT05GSUdfUFBDPXkKQEAgLTUyLDExICs1NiwxMyBAQAogIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19EVEM9eQogQ09ORklHX0RFRkFVTFRfVUlNQUdFPXkKICMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9TVVBQT1JUU19ERUJVR19QQUdFQUxMT0M9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTc5LDExICs4NSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNApAQCAtMTA1LDcgKzExMiw2IEBACiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtMTE4LDYgKzEyNCwxMyBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQorCisjCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCisjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19QQ0lfUVVJUktTPXkKIENPTkZJR19DT01QQVRfQlJLPXkKQEAgLTEyNSw3ICsxMzgsNiBAQAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eQpAQCAtMTMzLDcgKzE0NSwxMyBAQAogQ09ORklHX0hBVkVfS1BST0JFUz15CiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKK0NPTkZJR19IQVZFX0RNQV9BVFRSUz15CiBDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTQ2LDcgKzE2NCw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0yMjcsMTEgKzI0NSwxMyBAQAogIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPTU1VX0hFTFBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TV0lPVExCIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CiBDT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQogQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTMyCiBDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMjQ3LDkgKzI2NywxMCBAQAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0JPVU5DRT15CiBDT05GSUdfVklSVF9UT19CVVM9eQotQ09ORklHX1VORVZJQ1RBQkxFX0xSVT15CiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIENPTkZJR19QUENfNEtfUEFHRVM9eQogIyBDT05GSUdfUFBDXzE2S19QQUdFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfNjRLX1BBR0VTIGlzIG5vdCBzZXQKQEAgLTMzNiw2ICszNTcsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTM1MCw2ICszNzIsNyBAQAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAogIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxNTQgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0RDQiBpcyBub3Qgc2V0CiAKQEAgLTM3NSw2ICszOTgsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKQEAgLTM4Miw5ICs0MDYsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKICMgQ09ORklHX01URF9PRl9QQVJUUyBpcyBub3Qgc2V0CkBAIC00NjcsNiArNDkxLDcgQEAKICMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogQ09ORklHX09GX0RFVklDRT15CiBDT05GSUdfT0ZfSTJDPXkKK0NPTkZJR19PRl9NRElPPXkKICMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldApAQCAtNDkyLDEwICs1MTcsNiBAQAogIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKICMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CkBAIC01MTUsNiArNTM2LDcgQEAKICMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPW0KICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQogQ09ORklHX1NBVEFfUE1QPXkKICMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKQEAgLTUzNiw2ICs1NTgsNyBAQAogIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FUUDg2N1ggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NDBfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKQEAgLTU2NCw2ICs1ODcsNyBAQAogIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SREMgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CkBAIC01ODIsMTQgKzYwNiwxNyBAQAogIwogCiAjCi0jIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIyBZb3UgY2FuIGVuYWJsZSBvbmUgb3IgYm90aCBGaXJlV2lyZSBkcml2ZXIgc3RhY2tzLgorIworCisjCisjIFNlZSB0aGUgaGVscCB0ZXh0cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICMKICMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfQ09NUEFUX05FVF9ERVZfT1BTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC02MzYsMTYgKzY2MywxNiBAQAogIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTFfTUxMIGlzIG5vdCBzZXQKIENPTkZJR19GRUNfTVBDNTJ4eD15CiBDT05GSUdfRkVDX01QQzUyeHhfTURJTz15CiAjIENPTkZJR19BVEwyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hJTElOWF9FTUFDTElURSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNzIyLDYgKzc0OSw3IEBACiBDT05GSUdfREVWUE9SVD15CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIApAQCAtNzUwLDYgKzc3OCw3IEBACiAjCiAjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQogIworIyBDT05GSUdfSTJDX0RFU0lHTldBUkUgaXMgbm90IHNldAogQ09ORklHX0kyQ19NUEM9eQogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKQEAgLTc3NiwyMyArODA1LDIzIEBACiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CiAjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTgxMSwzMCArODQwLDE4IEBACiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkcml2ZXJzCi0jCi0jIENPTkZJR19EQUIgaXMgbm90IHNldAorIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwogIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKK0NPTkZJR19WR0FfQVJCPXkKICMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CkBAIC04NzEsMTUgKzg4OCwxNyBAQAogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKICMKICMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YSENJX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRUhDSV9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPW0KICMgQ09ORklHX1VTQl9PSENJX0hDRF9QUENfU09DIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GPXkKIENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GX0JFPXkKICMgQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfTEUgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0Y9eQogIyBDT05GSUdfVVNCX09IQ0lfSENEX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDPXkKIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU89eQpAQCAtOTk1LDYgKzEwMTQsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4MDI1IGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTEwMjIsNiArMTA0MiwxMCBAQAogIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgVEkgVkxZTlEKKyMKICMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCkBAIC0xMDQxLDEyICsxMDY1LDE2IEBACiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLUNPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorQ09ORklHX0ZTTk9USUZZPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKQEAgLTExMTQsNyArMTE0Miw2IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTEyMDEsNiArMTIyOCw3IEBACiBDT05GSUdfSEFTX0RNQT15CiBDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CitDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTEyMTAsNiArMTIzOCw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMjIzLDIzICsxMjUyLDEyIEBACiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKLQotIwotIyBUcmFjZXJzCi0jCi0jIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19QUENfRElTQUJMRV9XRVJST1IgaXMgbm90IHNldAorQ09ORklHX1BQQ19XRVJST1I9eQogQ09ORklHX1BSSU5UX1NUQUNLX0RFUFRIPTY0CiAjIENPTkZJR19JUlFTVEFDS1MgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3RxbTUyMDBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC90cW01MjAwX2RlZmNvbmZpZwppbmRleCA4NTg1YzdjLi43NWM4MzVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3RxbTUyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvdHFtNTIwMF9kZWZjb25maWcKQEAgLTEsMjUgKzEsMjcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzIKLSMgU2F0IEFwciAxOCAwMDo0ODo1NyAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzItcmM0CisjIFRodSBPY3QgMTUgMTA6MzM6MjMgMjAwOQogIwogIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBzdXBwb3J0CiAjCi1DT05GSUdfNnh4PXkKK0NPTkZJR19QUENfQk9PSzNTXzMyPXkKICMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAogIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKICMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CiAjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKIENPTkZJR19QUENfQk9PSzNTPXkKK0NPTkZJR182eHg9eQogQ09ORklHX1BQQ19GUFU9eQogIyBDT05GSUdfQUxUSVZFQyBpcyBub3Qgc2V0CiBDT05GSUdfUFBDX1NURF9NTVU9eQogQ09ORklHX1BQQ19TVERfTU1VXzMyPXkKICMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorQ09ORklHX1BQQ19IQVZFX1BNVV9TVVBQT1JUPXkKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDMzI9eQogQ09ORklHX1dPUkRfU0laRT0zMgpAQCAtMzAsMTUgKzMyLDE3IEBACiBDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogIyBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LIGlzIG5vdCBzZXQKIENPTkZJR19JUlFfUEVSX0NQVT15CiBDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKIENPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CiBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogIyBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUyBpcyBub3Qgc2V0CiBDT05GSUdfUFBDPXkKQEAgLTUyLDExICs1NiwxMyBAQAogIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19EVEM9eQogQ09ORklHX0RFRkFVTFRfVUlNQUdFPXkKICMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9TVVBQT1JUU19ERUJVR19QQUdFQUxMT0M9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTc3LDExICs4MywxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfR1JPVVBfU0NIRUQ9eQpAQCAtMTA1LDcgKzExMiw2IEBACiBDT05GSUdfRU1CRURERUQ9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTExOCw2ICsxMjQsMTMgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKKworIworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycworIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMVUJfREVCVUc9eQogQ09ORklHX0NPTVBBVF9CUks9eQpAQCAtMTI1LDE0ICsxMzgsMTkgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CitDT05GSUdfSEFWRV9ETUFfQVRUUlM9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIwogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTE0NSw3ICsxNjMsNyBAQAogQ09ORklHX01PRFZFUlNJT05TPXkKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTIyNSwxMSArMjQzLDEzIEBACiAjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXSU9UTEIgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19BUkNIX0hBU19XQUxLX01FTU9SWT15CiBDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRT15CiAjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MzIKIENPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yNDUsOSArMjY1LDEwIEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfQk9VTkNFPXkKIENPTkZJR19WSVJUX1RPX0JVUz15Ci1DT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogQ09ORklHX1BQQ180S19QQUdFUz15CiAjIENPTkZJR19QUENfMTZLX1BBR0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ182NEtfUEFHRVMgaXMgbm90IHNldApAQCAtMjU4LDYgKzI3OSw3IEBACiBDT05GSUdfRVhUUkFfVEFSR0VUUz0iIgogQ09ORklHX1BNPXkKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAogQ09ORklHX1NFQ0NPTVA9eQogQ09ORklHX0lTQV9ETUFfQVBJPXkKIApAQCAtMzM0LDYgKzM1Niw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtMzQ4LDYgKzM3MSw3IEBACiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjE1NCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAogIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKIApAQCAtMzczLDYgKzM5Nyw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldApAQCAtMzgyLDkgKzQwNyw5IEBACiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKIENPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKICMgQ09ORklHX01URF9PRl9QQVJUUyBpcyBub3Qgc2V0CkBAIC00NjQsNiArNDg5LDcgQEAKICMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogQ09ORklHX09GX0RFVklDRT15CiBDT05GSUdfT0ZfSTJDPXkKK0NPTkZJR19PRl9NRElPPXkKICMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVY9eQogIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CkBAIC01MDIsMTAgKzUyOCw2IEBACiAjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKIENPTkZJR19DSFJfREVWX1NHPXkKICMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKICMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CkBAIC01MjksNiArNTUxLDcgQEAKICMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQogQ09ORklHX1NBVEFfUE1QPXkKIENPTkZJR19BVEFfU0ZGPXkKICMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldApAQCAtNTM4LDcgKzU2MSw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfQ09NUEFUX05FVF9ERVZfT1BTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC01NzcsMTQgKzU5OSwxNCBAQAogIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tTODg1MV9NTEwgaXMgbm90IHNldAogQ09ORklHX0ZFQ19NUEM1Mnh4PXkKIENPTkZJR19GRUNfTVBDNTJ4eF9NRElPPXkKKyMgQ09ORklHX1hJTElOWF9FTUFDTElURSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNjU0LDYgKzY3Niw3IEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DT01QQVQ9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC02NjQsNiArNjg3LDcgQEAKICMKICMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCiAjCisjIENPTkZJR19JMkNfREVTSUdOV0FSRSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX01QQz15CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldApAQCAtNjg1LDIyICs3MDksMjggQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKICMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CkBAIC03NDcsNiArNzc3LDggQEAKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UTVA0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UTVA0MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CkBAIC03NTYsOSArNzg4LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtNzg5LDI1ICs4MTksMTIgQEAKICMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODMxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAorIyBDT05GSUdfQUIzMTAwX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRyaXZlcnMKLSMKLSMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CkBAIC04NTEsMTEgKzg2OCwxMiBAQAogIyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPXkKIENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX1NPQz15Ci1DT05GSUdfVVNCX09IQ0lfSENEX1BQQ19PRj15CiBDT05GSUdfVVNCX09IQ0lfSENEX1BQQ19PRl9CRT15CiAjIENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GX0xFIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GPXkKIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0M9eQogQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTz15CiAjIENPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKQEAgLTk2OSw2ICs5ODcsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4MDI1IGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTk5Niw2ICsxMDE1LDEwIEBACiAjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBUSSBWTFlOUQorIwogIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKQEAgLTEwMTUsMTAgKzEwMzgsMTMgQEAKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CitDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CkBAIC0xMDg5LDEyICsxMTE1LDEyIEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfVjRfMSBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQpAQCAtMTE5NCw2ICsxMjIwLDcgQEAKIENPTkZJR19IQVNfRE1BPXkKIENPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKK0NPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtMTIwMyw2ICsxMjMwLDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTEyMjAsMTAgKzEyNDgsMTQgQEAKICMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAogIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tNRU1MRUFLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAogIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CkBAIC0xMjM1LDExICsxMjY3LDEyIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKQEAgLTEyNDgsMjMgKzEyODEsMjUgQEAKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQotCi0jCi0jIFRyYWNlcnMKLSMKK0NPTkZJR19GVFJBQ0U9eQogIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CisjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FMTF9CUkFOQ0hFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RJU0FCTEVfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfV0VSUk9SPXkKIENPTkZJR19QUklOVF9TVEFDS19ERVBUSD02NAogIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CkBAIC0xMjg5LDcgKzEzMjQsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQyPXkKQEAgLTEzMzEsMTEgKzEzNjUsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19NRDU9eQogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUyMDBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTIwMF9kZWZjb25maWcKaW5kZXggYWFhNDQxNi4uNTIzZDVmZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTIwMF9kZWZjb25maWcKQEAgLTEsMjUgKzEsMjcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzIKLSMgTW9uIEFwciAyMCAxMTowNjoyNSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzItcmM0CisjIFRodSBPY3QgMTUgMTA6MzM6MjEgMjAwOQogIwogIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBzdXBwb3J0CiAjCi1DT05GSUdfNnh4PXkKK0NPTkZJR19QUENfQk9PSzNTXzMyPXkKICMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAogIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKICMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CiAjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKIENPTkZJR19QUENfQk9PSzNTPXkKK0NPTkZJR182eHg9eQogQ09ORklHX1BQQ19GUFU9eQogIyBDT05GSUdfQUxUSVZFQyBpcyBub3Qgc2V0CiBDT05GSUdfUFBDX1NURF9NTVU9eQogQ09ORklHX1BQQ19TVERfTU1VXzMyPXkKICMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorQ09ORklHX1BQQ19IQVZFX1BNVV9TVVBQT1JUPXkKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDMzI9eQogQ09ORklHX1dPUkRfU0laRT0zMgpAQCAtMzAsMTUgKzMyLDE3IEBACiBDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogIyBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LIGlzIG5vdCBzZXQKIENPTkZJR19JUlFfUEVSX0NQVT15CiBDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKIENPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CiBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfR1BJTz15CiAjIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTIGlzIG5vdCBzZXQKQEAgLTUzLDEyICs1NywxNCBAQAogIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19EVEM9eQogQ09ORklHX0RFRkFVTFRfVUlNQUdFPXkKIENPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQz15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtNzksMTEgKzg1LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKQEAgLTEwMyw3ICsxMTAsNiBAQAogQ09ORklHX0VNQkVEREVEPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC0xMTYsNiArMTIyLDEzIEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CisKKyMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKKyMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKIENPTkZJR19TTFVCX0RFQlVHPXkKQEAgLTEyNCwxNCArMTM3LDE5IEBACiBDT05GSUdfU0xVQj15CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorQ09ORklHX0hBVkVfRE1BX0FUVFJTPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xNDQsNyArMTYyLDcgQEAKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTIwNSw3ICsyMjMsNyBAQAogQ09ORklHX1BQQ19CRVNUQ09NTT15CiBDT05GSUdfUFBDX0JFU1RDT01NX0FUQT15CiBDT05GSUdfUFBDX0JFU1RDT01NX0ZFQz15Ci0jIENPTkZJR19TSU1QTEVfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfU0lNUExFX0dQSU89eQogCiAjCiAjIEtlcm5lbCBvcHRpb25zCkBAIC0yMjksMTEgKzI0NywxMyBAQAogIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPTU1VX0hFTFBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TV0lPVExCIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CiBDT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQogQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTMyCiBDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMjQ5LDkgKzI2OSwxMCBAQAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0JPVU5DRT15CiBDT05GSUdfVklSVF9UT19CVVM9eQotQ09ORklHX1VORVZJQ1RBQkxFX0xSVT15CiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIENPTkZJR19QUENfNEtfUEFHRVM9eQogIyBDT05GSUdfUFBDXzE2S19QQUdFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfNjRLX1BBR0VTIGlzIG5vdCBzZXQKQEAgLTI2NSw2ICsyODYsNyBAQAogQ09ORklHX1BNX1NMRUVQPXkKIENPTkZJR19TVVNQRU5EPXkKIENPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorIyBDT05GSUdfUE1fUlVOVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfU0VDQ09NUD15CiBDT05GSUdfSVNBX0RNQV9BUEk9eQogCkBAIC0zNDksNiArMzcxLDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNjMsNiArMzg2LDcgQEAKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19EQ0IgaXMgbm90IHNldAogCkBAIC0zODgsNiArNDEyLDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CkBAIC0zOTcsOSArNDIyLDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9PRl9QQVJUUz15CkBAIC00NTgsNiArNDgzLDcgQEAKICMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TU1QyNUwgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKQEAgLTQ5Myw2ICs1MTksNyBAQAogQ09ORklHX09GX0dQSU89eQogQ09ORklHX09GX0kyQz15CiBDT05GSUdfT0ZfU1BJPXkKK0NPTkZJR19PRl9NRElPPXkKICMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVY9eQogIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CkBAIC01MjksNyArNTU2LDkgQEAKIENPTkZJR19FRVBST01fQVQyND15CiAjIENPTkZJR19FRVBST01fQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19FRVBST01fTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPTV9NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19DQjcxMF9DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCkBAIC01NTIsMTAgKzU4MSw2IEBACiAjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKIENPTkZJR19DSFJfREVWX1NHPXkKICMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKICMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CkBAIC01NzIsNiArNTk3LDggQEAKICMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JOWDJfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfQkUySVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldApAQCAtNTgwLDYgKzYwNyw3IEBACiAjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9NVlNBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BRFZBTlNZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CkBAIC01OTksNyArNjI3LDYgQEAKICMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKQEAgLTYxMSwxMSArNjM4LDE0IEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QTUNSQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQkZBX0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldApAQCAtNjM3LDYgKzY2Nyw3IEBACiAjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRQODY3WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldApAQCAtNjY1LDYgKzY5Niw3IEBACiAjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKQEAgLTY4NCwxNCArNzE2LDE3IEBACiAjCiAKICMKLSMgRW5hYmxlIG9ubHkgb25lIG9mIHRoZSB0d28gc3RhY2tzLCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nCisjIFlvdSBjYW4gZW5hYmxlIG9uZSBvciBib3RoIEZpcmVXaXJlIGRyaXZlciBzdGFja3MuCisjCisKKyMKKyMgU2VlIHRoZSBoZWxwIHRleHRzIGZvciBtb3JlIGluZm9ybWF0aW9uLgogIwogIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTczOSwxNiArNzc0LDE3IEBACiAjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tTODg1MSBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTFfTUxMIGlzIG5vdCBzZXQKIENPTkZJR19GRUNfTVBDNTJ4eD15CiBDT05GSUdfRkVDX01QQzUyeHhfTURJTz15CiAjIENPTkZJR19BVEwyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hJTElOWF9FTUFDTElURSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtODU0LDYgKzg5MCw3IEBACiBDT05GSUdfREVWUE9SVD15CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIENPTkZJR19JMkNfQUxHT0JJVD15CkBAIC04ODMsNiArOTIwLDcgQEAKICMKICMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCiAjCisjIENPTkZJR19JMkNfREVTSUdOV0FSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX01QQz15CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKQEAgLTkxMCwxMCArOTQ4LDYgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldApAQCAtOTM1LDYgKzk2OSwxMSBAQAogIwogQ09ORklHX1NQSV9TUElERVY9bQogIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKIENPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CiBDT05GSUdfR1BJT0xJQj15CkBAIC05NTcsMTYgKzk5NiwyNyBAQAogIyBQQ0kgR1BJTyBleHBhbmRlcnM6CiAjCiAjIENPTkZJR19HUElPX0JUOFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fTEFOR1dFTEwgaXMgbm90IHNldAogCiAjCiAjIFNQSSBHUElPIGV4cGFuZGVyczoKICMKICMgQ09ORklHX0dQSU9fTUFYNzMwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19HUElPX01DUDIzUzA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fTUMzMzg4MCBpcyBub3Qgc2V0CisKKyMKKyMgQUM5NyBHUElPIGV4cGFuZGVyczoKKyMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBkcml2ZXJzCisjCiAjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKQEAgLTEwMTksNiArMTA2OSw4IEBACiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVE1QNDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVE1QNDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CkBAIC0xMDMxLDkgKzEwODMsNyBAQAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xJUzNfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTEwNzMsMzEgKzExMjMsMjAgQEAKICMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODMxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX01DMTM3ODMgaXMgbm90IHNldAorIyBDT05GSUdfQUIzMTAwX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfRVpYX1BDQVAgaXMgbm90IHNldAogIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRyaXZlcnMKLSMKLUNPTkZJR19EQUI9eQotIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCiAjIENPTkZJR19BR1AgaXMgbm90IHNldAorQ09ORklHX1ZHQV9BUkI9eQogQ09ORklHX0RSTT15CiAjIENPTkZJR19EUk1fVERGWCBpcyBub3Qgc2V0CiAjIENPTkZJR19EUk1fUjEyOCBpcyBub3Qgc2V0CkBAIC0xMTY3LDYgKzEyMDYsNyBAQAogIyBDT05GSUdfRkJfQlJPQURTSEVFVCBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKIENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPW0KKyMgQ09ORklHX0xDRF9MTVMyODNHRjA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0xDRF9MVFYzNTBRViBpcyBub3Qgc2V0CiAjIENPTkZJR19MQ0RfSUxJOTMyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19MQ0RfVERPMjRNIGlzIG5vdCBzZXQKQEAgLTExOTgsNyArMTIzOCw2IEBACiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15Ci0jIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKIAogIwpAQCAtMTIxNywxMCArMTI1NiwxMSBAQAogQ09ORklHX0hJRF9DSEVSUlk9eQogIyBDT05GSUdfSElEX0NISUNPTlkgaXMgbm90IHNldAogQ09ORklHX0hJRF9DWVBSRVNTPXkKLSMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0RSQUdPTlJJU0UgaXMgbm90IHNldAogQ09ORklHX0hJRF9FWktFWT15CiAjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9HWVJBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfTE9HSVRFQ0ggaXMgbm90IHNldAogIyBDT05GSUdfSElEX01JQ1JPU09GVCBpcyBub3Qgc2V0CkBAIC0xMjMxLDEwICsxMjcxLDExIEBACiAjIENPTkZJR19ISURfU0FNU1VORyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfU09OWSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfU1VOUExVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUkVFTkFTSUFfRkYgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0dSRUVOQVNJQSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU01BUlRKT1lQTFVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9UT1BTRUVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIUlVTVE1BU1RFUl9GRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19aRVJPUExVU19GRiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfVEhSVVNUTUFTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9aRVJPUExVUyBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKQEAgLTEyNjEsMTUgKzEzMDIsMTcgQEAKICMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCiAjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWEhDSV9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VIQ0lfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD15CiBDT05GSUdfVVNCX09IQ0lfSENEX1BQQ19TT0M9eQotQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0Y9eQogQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfQkU9eQogIyBDT05GSUdfVVNCX09IQ0lfSENEX1BQQ19PRl9MRSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEX1BQQ19PRj15CiBDT05GSUdfVVNCX09IQ0lfSENEX1BDST15CiBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDPXkKIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU89eQpAQCAtMTQwMCw2ICsxNDQzLDcgQEAKICMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODAyNSBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCkBAIC0xNDExLDYgKzE0NTUsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0YyMTIzIGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwpAQCAtMTQzNCw2ICsxNDc5LDEwIEBACiAjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBUSSBWTFlOUQorIwogIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKQEAgLTE0NTMsMTAgKzE1MDIsMTMgQEAKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CitDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CkBAIC0xNTMzLDEyICsxNTg1LDEyIEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfVjRfMSBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQpAQCAtMTYyNCw2ICsxNjc2LDcgQEAKIENPTkZJR19IQVNfRE1BPXkKIENPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKK0NPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtMTYzMyw2ICsxNjg2LDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTE2NTAsMTAgKzE3MDQsMTQgQEAKICMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAogIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tNRU1MRUFLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAogIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CkBAIC0xNjY1LDExICsxNzIzLDEyIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKQEAgLTE2NzgsMjMgKzE3MzcsMjUgQEAKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQotCi0jCi0jIFRyYWNlcnMKLSMKK0NPTkZJR19GVFJBQ0U9eQogIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CisjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FMTF9CUkFOQ0hFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RJU0FCTEVfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfV0VSUk9SPXkKIENPTkZJR19QUklOVF9TVEFDS19ERVBUSD02NAogIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CkBAIC0xNzE5LDcgKzE3ODAsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQyPXkKQEAgLTE3NjEsMTEgKzE4MjEsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19NRDU9eQogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0ZV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NGVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWY0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NGVfZGVmY29uZmlnCkBAIC0wLDAgKzEsMjE5OSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMyLXJjNQorIyBGcmkgT2N0IDE2IDExOjM3OjE1IDIwMDkKKyMKK0NPTkZJR19QUEM2ND15CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQQ19CT09LM1NfNjQgaXMgbm90IHNldAorQ09ORklHX1BQQ19CT09LM0VfNjQ9eQorQ09ORklHX1BQQ19CT09LM0U9eQorQ09ORklHX1BQQ19GUFU9eQorQ09ORklHX0JPT0tFPXkKK0NPTkZJR19QUENfTU1VX05PSEFTSD15CitDT05GSUdfUFBDX01NVV9OT0hBU0hfNjQ9eQorQ09ORklHX1BQQ19CT09LM0VfTU1VPXkKKyMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkc9eQorQ09ORklHX1BQQ19IQVZFX1BNVV9TVVBQT1JUPXkKK0NPTkZJR19QUENfUEVSRl9DVFJTPXkKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9MzIKK0NPTkZJR182NEJJVD15CitDT05GSUdfV09SRF9TSVpFPTY0CitDT05GSUdfQVJDSF9QSFlTX0FERFJfVF82NEJJVD15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfVElNRV9WU1lTQ0FMTD15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKK0NPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQT15CitDT05GSUdfTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKK0NPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKK0NPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19QUEM9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfQ09NUEFUPXkKK0NPTkZJR19TWVNWSVBDX0NPTVBBVD15CitDT05GSUdfU0NIRURfT01JVF9GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfUFBDX09GPXkKK0NPTkZJR19PRj15CisjIENPTkZJR19QUENfVURCR18xNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfQVVESVRfQVJDSD15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0RUQz15CisjIENPTkZJR19ERUZBVUxUX1VJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfUFBDX09GX1BMQVRGT1JNX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVBQT1JUU19ERUJVR19QQUdFQUxMT0M9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19UQVNLU1RBVFM9eQorQ09ORklHX1RBU0tfREVMQVlfQUNDVD15CisjIENPTkZJR19UQVNLX1hBQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9NjQKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfQ0dST1VQUz15CisjIENPTkZJR19DR1JPVVBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUF9GUkVFWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUF9ERVZJQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVVNFVFM9eQorQ09ORklHX1BST0NfUElEX0NQVVNFVD15CisjIENPTkZJR19DR1JPVVBfQ1BVQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19SRVNPVVJDRV9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CitDT05GSUdfUkVMQVk9eQorQ09ORklHX05BTUVTUEFDRVM9eQorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfTlMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfUkRfR1pJUD15CitDT05GSUdfUkRfQlpJUDI9eQorQ09ORklHX1JEX0xaTUE9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FOT05fSU5PREVTPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CisKKyMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKKyMKK0NPTkZJR19QRVJGX0VWRU5UUz15CitDT05GSUdfRVZFTlRfUFJPRklMRT15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFUkZfVVNFX1ZNQUxMT0MgaXMgbm90IHNldAorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19QQ0lfUVVJUktTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CitDT05GSUdfU0xVQj15CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX1RSQUNFUE9JTlRTPXkKK0NPTkZJR19PUFJPRklMRT15CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfV1JBUFBFUlM9eQorQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CitDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CitDT05GSUdfSEFWRV9ETUFfQVRUUlM9eQorQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX1NMT1dfV09SSz15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RWRVJTSU9OUz15CitDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKK0NPTkZJR19TVE9QX01BQ0hJTkU9eQorQ09ORklHX0JMT0NLPXkKK0NPTkZJR19CTEtfREVWX0JTRz15CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CitDT05GSUdfQkxPQ0tfQ09NUEFUPXkKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0CisjCisjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFEyQURTIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfT0ZfQk9PVF9UUkFNUE9MSU5FPXkKKyMgQ09ORklHX0lQSUMgaXMgbm90IHNldAorIyBDT05GSUdfTVBJQyBpcyBub3Qgc2V0CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CisjIENPTkZJR19VM19EQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19SVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfOTcwX05BUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSU5ESVJFQ1RfSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19JT01BUCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9TVEFUPXkKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9DT05TRVJWQVRJVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRSBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBkcml2ZXJzCisjCisjIENPTkZJR19GU0xfVUxJMTU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TSU1QTEVfR1BJTyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIG9wdGlvbnMKKyMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0NPTVBBVF9CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX01JU0M9bQorQ09ORklHX0lPTU1VX1ZNRVJHRT15CitDT05GSUdfSU9NTVVfSEVMUEVSPXkKKyMgQ09ORklHX1NXSU9UTEIgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKK0NPTkZJR19BUkNIX0hBU19XQUxLX01FTU9SWT15CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRT15CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFfQUxMX0NQVVM9eQorIyBDT05GSUdfTlVNQSBpcyBub3Qgc2V0CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTI1NgorQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CisjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19TUEFSU0VNRU1fTUFOVUFMPXkKK0NPTkZJR19TUEFSU0VNRU09eQorQ09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlQ9eQorQ09ORklHX1NQQVJTRU1FTV9FWFRSRU1FPXkKK0NPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEU9eQorQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQPXkKKyMgQ09ORklHX01FTU9SWV9IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKK0NPTkZJR19NSUdSQVRJT049eQorQ09ORklHX1BIWVNfQUREUl9UXzY0QklUPXkKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX0hBVkVfTUxPQ0s9eQorQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CisjIENPTkZJR19QUENfSEFTX0hBU0hfNjRLIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfNEtfUEFHRVM9eQorIyBDT05GSUdfUFBDXzE2S19QQUdFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfNjRLX1BBR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ18yNTZLX1BBR0VTIGlzIG5vdCBzZXQKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTEzCisjIENPTkZJR19TQ0hFRF9TTVQgaXMgbm90IHNldAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0VYVFJBX1RBUkdFVFM9IiIKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kgaXMgbm90IHNldAorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorQ09ORklHX1BDSV9TWVNDQUxMPXkKKyMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVUFBPUlRTX01TST15CitDT05GSUdfUENJX01TST15CisjIENPTkZJR19QQ0lfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfSU9WIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0NBUkQ9eQorIyBDT05GSUdfUENNQ0lBX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUE9eQorQ09ORklHX1BDTUNJQV9MT0FEX0NJUz15CitDT05GSUdfUENNQ0lBX0lPQ1RMPXkKK0NPTkZJR19DQVJEQlVTPXkKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKKyMgQ09ORklHX1lFTlRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BENjcyOSBpcyBub3Qgc2V0CisjIENPTkZJR19JODIwOTIgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUdfUENJPW0KKyMgQ09ORklHX0hPVFBMVUdfUENJX0ZBS0UgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0lfQ1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSV9TSFBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBU19SQVBJRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTE9DQVRBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX09GRlNFVD0weGMwMDAwMDAwMDAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMDAwMDAwMDAwCitDT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgwMDAwMDAwMAorQ09ORklHX05FVD15CitDT05GSUdfQ09NUEFUX05FVExJTktfTUVTU0FHRVM9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPW0KKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX0lQQ09NUD1tCitDT05GSUdfTkVUX0tFWT1tCisjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorQ09ORklHX05FVF9JUElQPXkKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorQ09ORklHX0lORVRfQUg9bQorQ09ORklHX0lORVRfRVNQPW0KK0NPTkZJR19JTkVUX0lQQ09NUD1tCitDT05GSUdfSU5FVF9YRlJNX1RVTk5FTD1tCitDT05GSUdfSU5FVF9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKK0NPTkZJR19JTkVUX0xSTz15CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfQURWQU5DRUQ9eQorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19ORVRGSUxURVJfTkVUTElOSz1tCitDT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUU9bQorQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRz1tCitDT05GSUdfTkZfQ09OTlRSQUNLPW0KK0NPTkZJR19ORl9DVF9BQ0NUPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfTUFSSz15CitDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15CisjIENPTkZJR19ORl9DVF9QUk9UT19EQ0NQIGlzIG5vdCBzZXQKK0NPTkZJR19ORl9DVF9QUk9UT19HUkU9bQorQ09ORklHX05GX0NUX1BST1RPX1NDVFA9bQorIyBDT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURSBpcyBub3Qgc2V0CitDT05GSUdfTkZfQ09OTlRSQUNLX0FNQU5EQT1tCitDT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD1tCitDT05GSUdfTkZfQ09OTlRSQUNLX0gzMjM9bQorQ09ORklHX05GX0NPTk5UUkFDS19JUkM9bQorQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfUFBUUD1tCisjIENPTkZJR19ORl9DT05OVFJBQ0tfU0FORSBpcyBub3Qgc2V0CitDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQorQ09ORklHX05GX0NUX05FVExJTks9bQorQ09ORklHX05FVEZJTFRFUl9UUFJPWFk9bQorQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSEw9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05PVFJBQ0s9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfUkFURUVTVD1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUFJPWFk9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0U9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DTFVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ITD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PV05FUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1Q9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQ0VOVD1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UX1BST0NfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NPQ0tFVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PU0YgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX05GX0RFRlJBR19JUFY0PW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUPXkKK0NPTkZJR19JUF9ORl9RVUVVRT1tCitDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9BSD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQorQ09ORklHX0lQX05GX0ZJTFRFUj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0xPRz1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQorQ09ORklHX05GX05BVD1tCitDT05GSUdfTkZfTkFUX05FRURFRD15CitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD1tCitDT05GSUdfTkZfTkFUX1NOTVBfQkFTSUM9bQorQ09ORklHX05GX05BVF9QUk9UT19HUkU9bQorQ09ORklHX05GX05BVF9QUk9UT19TQ1RQPW0KK0NPTkZJR19ORl9OQVRfRlRQPW0KK0NPTkZJR19ORl9OQVRfSVJDPW0KK0NPTkZJR19ORl9OQVRfVEZUUD1tCitDT05GSUdfTkZfTkFUX0FNQU5EQT1tCitDT05GSUdfTkZfTkFUX1BQVFA9bQorQ09ORklHX05GX05BVF9IMzIzPW0KK0NPTkZJR19ORl9OQVRfU0lQPW0KK0NPTkZJR19JUF9ORl9NQU5HTEU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQorQ09ORklHX0lQX05GX1RBUkdFVF9UVEw9bQorQ09ORklHX0lQX05GX1JBVz1tCitDT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9BUlBGSUxURVI9bQorQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfTExDPXkKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0NMU19ST1VURT15CisjIENPTkZJR19EQ0IgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFJPUF9NT05JVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQorQ09ORklHX1dJUkVMRVNTX0VYVD15CitDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTPXkKKyMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKKworIworIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQorIworIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKK0NPTkZJR19PRl9ERVZJQ0U9eQorQ09ORklHX09GX0kyQz15CitDT05GSUdfT0ZfTURJTz15CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKK0NPTkZJR19CTEtfREVWX0ZEPXkKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX05CRD1tCisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTY1NTM2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTTDI5MDAzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRUVQUk9NIHN1cHBvcnQKKyMKKyMgQ09ORklHX0VFUFJPTV9BVDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPTV9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NCNzEwX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKK0NPTkZJR19JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUvaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKK0NPTkZJR19JREVfWEZFUl9NT0RFPXkKK0NPTkZJR19JREVfVElNSU5HUz15CitDT05GSUdfSURFX0FUQVBJPXkKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0lERV9HRD15CitDT05GSUdfSURFX0dEX0FUQT15CisjIENPTkZJR19JREVfR0RfQVRBUEkgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RFTEtJTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVDRD15CitDT05GSUdfQkxLX0RFVl9JREVDRF9WRVJCT1NFX0VSUk9SUz15CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorQ09ORklHX0lERV9QUk9DX0ZTPXkKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCisjIENPTkZJR19CTEtfREVWX1BMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9TRkY9eQorCisjCisjIFBDSSBJREUgY2hpcHNldHMgc3VwcG9ydAorIworQ09ORklHX0JMS19ERVZfSURFUENJPXkKK0NPTkZJR19JREVQQ0lfUENJQlVTX09SREVSPXkKKyMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfR0VORVJJQz15CisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0FNRDc0WFg9eQorIyBDT05GSUdfQkxLX0RFVl9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgxNzIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgyMTMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0w4MkMxMDUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RDODZDMDAxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQT15CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ETUE9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorQ09ORklHX1NDU0lfTkVUTElOSz15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0NIUl9ERVZfU1Q9eQorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NSPXkKK0NPTkZJR19CTEtfREVWX1NSX1ZFTkRPUj15CitDT05GSUdfQ0hSX0RFVl9TRz15CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKK0NPTkZJR19TQ1NJX1NQSV9BVFRSUz15CitDT05GSUdfU0NTSV9GQ19BVFRSUz15CitDT05GSUdfU0NTSV9JU0NTSV9BVFRSUz1tCisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfU1JQX0FUVFJTPXkKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NYR0IzX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQk5YMl9JU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19CRTJJU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTVBUMlNBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZDT0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0VBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1NZTTUzQzhYWF8yPXkKK0NPTkZJR19TQ1NJX1NZTTUzQzhYWF9ETUFfQUREUkVTU0lOR19NT0RFPTAKK0NPTkZJR19TQ1NJX1NZTTUzQzhYWF9ERUZBVUxUX1RBR1M9MTYKK0NPTkZJR19TQ1NJX1NZTTUzQzhYWF9NQVhfVEFHUz02NAorQ09ORklHX1NDU0lfU1lNNTNDOFhYX01NSU89eQorQ09ORklHX1NDU0lfSVBSPXkKK0NPTkZJR19TQ1NJX0lQUl9UUkFDRT15CitDT05GSUdfU0NTSV9JUFJfRFVNUD15CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xQRkM9bQorIyBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0RFQlVHPW0KKyMgQ09ORklHX1NDU0lfUE1DUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JGQV9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPV0xFVkVMX1BDTUNJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQorQ09ORklHX1NBVEFfUE1QPXkKKyMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9TSUwyND15CitDT05GSUdfQVRBX1NGRj15CitDT05GSUdfU0FUQV9TVlc9eQorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVFA4NjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OSU5KQTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTUgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BDTUNJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0CitDT05GSUdfTUQ9eQorQ09ORklHX0JMS19ERVZfTUQ9eQorQ09ORklHX01EX0FVVE9ERVRFQ1Q9eQorQ09ORklHX01EX0xJTkVBUj15CitDT05GSUdfTURfUkFJRDA9eQorQ09ORklHX01EX1JBSUQxPXkKK0NPTkZJR19NRF9SQUlEMTA9eQorQ09ORklHX01EX1JBSUQ0NTY9eQorIyBDT05GSUdfTVVMVElDT1JFX1JBSUQ0NTYgaXMgbm90IHNldAorQ09ORklHX01EX1JBSUQ2X1BRPXkKKyMgQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1QgaXMgbm90IHNldAorQ09ORklHX01EX01VTFRJUEFUSD1tCitDT05GSUdfTURfRkFVTFRZPW0KK0NPTkZJR19CTEtfREVWX0RNPXkKKyMgQ09ORklHX0RNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ETV9DUllQVD1tCitDT05GSUdfRE1fU05BUFNIT1Q9bQorQ09ORklHX0RNX01JUlJPUj1tCisjIENPTkZJR19ETV9MT0dfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19ETV9aRVJPPW0KK0NPTkZJR19ETV9NVUxUSVBBVEg9bQorIyBDT05GSUdfRE1fTVVMVElQQVRIX1FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX01VTFRJUEFUSF9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9VRVZFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjCisjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CitDT05GSUdfSUVFRTEzOTQ9eQorQ09ORklHX0lFRUUxMzk0X09IQ0kxMzk0PXkKKyMgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlggaXMgbm90IHNldAorQ09ORklHX0lFRUUxMzk0X1NCUDI9bQorQ09ORklHX0lFRUUxMzk0X0VUSDEzOTRfUk9NX0VOVFJZPXkKK0NPTkZJR19JRUVFMTM5NF9FVEgxMzk0PW0KK0NPTkZJR19JRUVFMTM5NF9SQVdJTz15CitDT05GSUdfSUVFRTEzOTRfVklERU8xMzk0PW0KK0NPTkZJR19JRUVFMTM5NF9EVjEzOTQ9bQorIyBDT05GSUdfSUVFRTEzOTRfVkVSQk9TRURFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CitDT05GSUdfTUFDSU5UT1NIX0RSSVZFUlM9eQorIyBDT05GSUdfTUFDX0VNVU1PVVNFQlROIGlzIG5vdCBzZXQKK0NPTkZJR19XSU5ERkFSTT15CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9bQorQ09ORklHX0JPTkRJTkc9bQorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorQ09ORklHX1RVTj1tCisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfTUFSVkVMTF9QSFk9eQorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfQlJPQURDT01fUEhZPW0KKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTkFUSU9OQUxfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NURTEwWFAgaXMgbm90IHNldAorIyBDT05GSUdfTFNJX0VUMTAxMUNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CitDT05GSUdfU1VOR0VNPXkKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorQ09ORklHX05FVF9WRU5ET1JfM0NPTT15CitDT05GSUdfVk9SVEVYPXkKKyMgQ09ORklHX1RZUEhPT04gaXMgbm90IHNldAorIyBDT05GSUdfRVRIT0MgaXMgbm90IHNldAorIyBDT05GSUdfRE5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfUENORVQzMj15CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorQ09ORklHX0UxMDA9eQorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAorIyBDT05GSUdfUjYwNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU01TQzk0MjAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODUxX01MTCBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwyIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMD15CitDT05GSUdfQUNFTklDPXkKK0NPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JPXkKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorQ09ORklHX0UxMDAwPXkKKyMgQ09ORklHX0UxMDAwRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfSUdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQlZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorQ09ORklHX1RJR09OMz15CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NOSUMgaXMgbm90IHNldAorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pNRSBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWXzEwMDAwPXkKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorQ09ORklHX0NIRUxTSU9fVDNfREVQRU5EUz15CisjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAorQ09ORklHX0lYR0I9bQorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAorIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKKyMgQ09ORklHX01MWDRfRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFSFVUSSBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyWCBpcyBub3Qgc2V0CisjIENPTkZJR19RTEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NGQyBpcyBub3Qgc2V0CisjIENPTkZJR19CRTJORVQgaXMgbm90IHNldAorQ09ORklHX1RSPXkKK0NPTkZJR19JQk1PTD15CisjIENPTkZJR18zQzM1OSBpcyBub3Qgc2V0CisjIENPTkZJR19UTVMzODBUUiBpcyBub3Qgc2V0CitDT05GSUdfV0xBTj15CisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorCisjCisjIEVuYWJsZSBXaU1BWCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ01DSUEgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorQ09ORklHX1BQUD1tCisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorQ09ORklHX1BQUF9BU1lOQz1tCitDT05GSUdfUFBQX1NZTkNfVFRZPW0KK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorIyBDT05GSUdfUFBQX01QUEUgaXMgbm90IHNldAorQ09ORklHX1BQUE9FPW0KKyMgQ09ORklHX1BQUE9MMlRQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorQ09ORklHX1NMSEM9bQorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRDT05TT0xFPXkKKyMgQ09ORklHX05FVENPTlNPTEVfRFlOQU1JQyBpcyBub3Qgc2V0CitDT05GSUdfTkVUUE9MTD15CitDT05GSUdfTkVUUE9MTF9UUkFQPXkKK0NPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSPXkKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9bQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorQ09ORklHX01PVVNFX1BTMl9BTFBTPXkKK0NPTkZJR19NT1VTRV9QUzJfTE9HSVBTMlBQPXkKK0NPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKK0NPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CisjIENPTkZJR19NT1VTRV9QUzJfRUxBTlRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUFMyX1NFTlRFTElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9CQ001OTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfU1lOQVBUSUNTX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9DTTEwOSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19JODA0Mj15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19YSUxJTlhfWFBTX1BTMiBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfQ1MgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVMgaXMgbm90IHNldAorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorIyBDT05GSUdfSFZDX1VEQkcgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ0FSRE1BTl80MDQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX1JBV19EUklWRVI9eQorQ09ORklHX01BWF9SQVdfREVWUz0yNTYKKyMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZQT1JUPXkKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DT01QQVQ9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQorQ09ORklHX0kyQ19BTEdPQklUPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBQQyBTTUJ1cyBob3N0IGNvbnRyb2xsZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0FNRDgxMTE9eQorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0lTQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBhZGFwdGVyIEkyQy9EREMgY2hhbm5lbCBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXTDQwMzBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorQ09ORklHX1ZHQV9BUkI9eQorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCitDT05GSUdfRkI9eQorQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQorQ09ORklHX0ZCX0REQz15CisjIENPTkZJR19GQl9CT09UX1ZFU0FfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfQ0ZCX1JFVl9QSVhFTFNfSU5fQllURSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CitDT05GSUdfRkJfTUFDTU9ERVM9eQorQ09ORklHX0ZCX0JBQ0tMSUdIVD15CitDT05GSUdfRkJfTU9ERV9IRUxQRVJTPXkKK0NPTkZJR19GQl9USUxFQkxJVFRJTkc9eQorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9DSVJSVVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUE0yIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NZQkVSMjAwMCBpcyBub3Qgc2V0CitDT05GSUdfRkJfT0Y9eQorIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVkdBMTYgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAorQ09ORklHX0ZCX01BVFJPWD15CitDT05GSUdfRkJfTUFUUk9YX01JTExFTklVTT15CitDT05GSUdfRkJfTUFUUk9YX01ZU1RJUVVFPXkKK0NPTkZJR19GQl9NQVRST1hfRz15CitDT05GSUdfRkJfTUFUUk9YX0kyQz1tCitDT05GSUdfRkJfTUFUUk9YX01BVkVOPW0KK0NPTkZJR19GQl9SQURFT049eQorQ09ORklHX0ZCX1JBREVPTl9JMkM9eQorQ09ORklHX0ZCX1JBREVPTl9CQUNLTElHSFQ9eQorIyBDT05GSUdfRkJfUkFERU9OX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0FUWTEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUzMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DQVJNSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9JQk1fR1hUNDUwMD15CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQjg2MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JST0FEU0hFRVQgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CitDT05GSUdfTENEX0NMQVNTX0RFVklDRT15CisjIENPTkZJR19MQ0RfSUxJOTMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQorQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDPXkKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfRElTUExBWV9TVVBQT1JUPXkKKworIworIyBEaXNwbGF5IGhhcmR3YXJlIGRyaXZlcnMKKyMKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CitDT05GSUdfTE9HTz15CitDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKK0NPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKK0NPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQorQ09ORklHX1NPVU5EPW0KK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CitDT05GSUdfU09VTkRfT1NTX0NPUkVfUFJFQ0xBSU09eQorQ09ORklHX1NORD1tCitDT05GSUdfU05EX1RJTUVSPW0KK0NPTkZJR19TTkRfUENNPW0KK0NPTkZJR19TTkRfU0VRVUVOQ0VSPW0KK0NPTkZJR19TTkRfU0VRX0RVTU1ZPW0KK0NPTkZJR19TTkRfT1NTRU1VTD15CitDT05GSUdfU05EX01JWEVSX09TUz1tCitDT05GSUdfU05EX1BDTV9PU1M9bQorQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQorQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKKyMgQ09ORklHX1NORF9IUlRJTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JBV01JRElfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUEwzX0xJQl9TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX09QTDRfTElCX1NFUSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0JBV0VfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTVUxMEsxX1NFUSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0RSSVZFUlM9eQorIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJNSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfUENJPXkKKyMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMUzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUxTNDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUxJNTQ1MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVElJWFBfTU9ERU0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FXMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVpUMzMyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQlQ4N1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ01JUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PWFlHRU4gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NUWEZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9EQVJMQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9HSU5BMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0xBWUxBMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RBUkxBMjQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dJTkEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTEFZTEEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTU9OQSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTUlBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FQ0hPM0cgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPSU8gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHT0RKIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09JT1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHT0RKWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9GTTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERBX0lOVEVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IRFNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IRFNQTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSElGSUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JQ0UxNzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JQ0UxNzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFTDhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTFg2NDY0RVMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01BRVNUUk8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX05NMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QQ1hIUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUklQVElERSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJUVU9TTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1lNRlBDSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1BQQz15CitDT05GSUdfU05EX1VTQj15CisjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfVVNYMlkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQl9DQUlBUSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1BDTUNJQT15CisjIENPTkZJR19TTkRfVlhQT0NLRVQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BEQVVESU9DRiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPXkKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9ISURERVY9eQorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKK0NPTkZJR19ISURfQTRURUNIPXkKK0NPTkZJR19ISURfQVBQTEU9eQorQ09ORklHX0hJRF9CRUxLSU49eQorQ09ORklHX0hJRF9DSEVSUlk9eQorQ09ORklHX0hJRF9DSElDT05ZPXkKK0NPTkZJR19ISURfQ1lQUkVTUz15CitDT05GSUdfSElEX0RSQUdPTlJJU0U9eQorIyBDT05GSUdfRFJBR09OUklTRV9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX0VaS0VZPXkKK0NPTkZJR19ISURfS1lFPXkKK0NPTkZJR19ISURfR1lSQVRJT049eQorQ09ORklHX0hJRF9UV0lOSEFOPXkKK0NPTkZJR19ISURfS0VOU0lOR1RPTj15CitDT05GSUdfSElEX0xPR0lURUNIPXkKKyMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfTUlDUk9TT0ZUPXkKK0NPTkZJR19ISURfTU9OVEVSRVk9eQorQ09ORklHX0hJRF9OVFJJRz15CitDT05GSUdfSElEX1BBTlRIRVJMT1JEPXkKKyMgQ09ORklHX1BBTlRIRVJMT1JEX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfUEVUQUxZTlg9eQorQ09ORklHX0hJRF9TQU1TVU5HPXkKK0NPTkZJR19ISURfU09OWT15CitDT05GSUdfSElEX1NVTlBMVVM9eQorQ09ORklHX0hJRF9HUkVFTkFTSUE9eQorIyBDT05GSUdfR1JFRU5BU0lBX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU01BUlRKT1lQTFVTPXkKKyMgQ09ORklHX1NNQVJUSk9ZUExVU19GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX1RPUFNFRUQ9eQorQ09ORklHX0hJRF9USFJVU1RNQVNURVI9eQorIyBDT05GSUdfVEhSVVNUTUFTVEVSX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfWkVST1BMVVM9eQorIyBDT05GSUdfWkVST1BMVVNfRkYgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKK0NPTkZJR19VU0JfREVWSUNFX0NMQVNTPXkKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NT04gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dVU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dVU0JfQ0JBRiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWEhDSV9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9FSENJX0hDRD15CisjIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQ9eQorIyBDT05GSUdfVVNCX0VIQ0lfSENEX1BQQ19PRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorIyBDT05GSUdfVVNCX09IQ0lfSENEX1BQQ19PRl9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GX0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0YgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElBTj15CisjIENPTkZJR19VU0JfVUhDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQorIworCisjCisjIGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvCisjCitDT05GSUdfVVNCX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0FQUExFRElTUExBWT1tCisjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBPVEcgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUKKyMKKyMgQ09ORklHX05PUF9VU0JfWENFSVYgaXMgbm90IHNldAorIyBDT05GSUdfVVdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkZJTklCQU5EPW0KKyMgQ09ORklHX0lORklOSUJBTkRfVVNFUl9NQUQgaXMgbm90IHNldAorIyBDT05GSUdfSU5GSU5JQkFORF9VU0VSX0FDQ0VTUyBpcyBub3Qgc2V0CitDT05GSUdfSU5GSU5JQkFORF9BRERSX1RSQU5TPXkKK0NPTkZJR19JTkZJTklCQU5EX01USENBPW0KK0NPTkZJR19JTkZJTklCQU5EX01USENBX0RFQlVHPXkKKyMgQ09ORklHX0lORklOSUJBTkRfSVBBVEggaXMgbm90IHNldAorIyBDT05GSUdfSU5GSU5JQkFORF9BTVNPMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NTFg0X0lORklOSUJBTkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5GSU5JQkFORF9ORVMgaXMgbm90IHNldAorQ09ORklHX0lORklOSUJBTkRfSVBPSUI9bQorIyBDT05GSUdfSU5GSU5JQkFORF9JUE9JQl9DTSBpcyBub3Qgc2V0CitDT05GSUdfSU5GSU5JQkFORF9JUE9JQl9ERUJVRz15CisjIENPTkZJR19JTkZJTklCQU5EX0lQT0lCX0RFQlVHX0RBVEEgaXMgbm90IHNldAorIyBDT05GSUdfSU5GSU5JQkFORF9TUlAgaXMgbm90IHNldAorQ09ORklHX0lORklOSUJBTkRfSVNFUj1tCitDT05GSUdfRURBQz15CisKKyMKKyMgUmVwb3J0aW5nIHN1YnN5c3RlbXMKKyMKKyMgQ09ORklHX0VEQUNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0VEQUNfTU1fRURBQz15CisjIENPTkZJR19FREFDX0NQQzkyNSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9EUzEzMDc9eQorIyBDT05GSUdfUlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE2NzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODAyNSBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfQ01PUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIFRJIFZMWU5RCisjCisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUMl9GU19TRUNVUklUWT15CitDT05GSUdfRVhUMl9GU19YSVA9eQorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUM19GU19TRUNVUklUWT15CitDT05GSUdfRVhUNF9GUz15CitDT05GSUdfRVhUNF9GU19YQVRUUj15CitDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDRfRlNfU0VDVVJJVFk9eQorIyBDT05GSUdfRVhUNF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfWElQPXkKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQyPXkKKyMgQ09ORklHX0pCRDJfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorQ09ORklHX1JFSVNFUkZTX0ZTPXkKKyMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFI9eQorQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFk9eQorQ09ORklHX0pGU19GUz15CitDT05GSUdfSkZTX1BPU0lYX0FDTD15CitDT05GSUdfSkZTX1NFQ1VSSVRZPXkKKyMgQ09ORklHX0pGU19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19YRlNfRlM9bQorIyBDT05GSUdfWEZTX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19YRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CitDT05GSUdfRlNOT1RJRlk9eQorQ09ORklHX0ROT1RJRlk9eQorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9bQorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfSVNPOTY2MF9GUz15CisjIENPTkZJR19KT0xJRVQgaXMgbm90IHNldAorIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX1VERl9OTFM9eQorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorQ09ORklHX01TRE9TX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSEZTX0ZTPW0KK0NPTkZJR19IRlNQTFVTX0ZTPW0KKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPXkKKyMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WM19BQ0w9eQorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfVjRfMSBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX05GU0Q9bQorQ09ORklHX05GU0RfVjJfQUNMPXkKK0NPTkZJR19ORlNEX1YzPXkKK0NPTkZJR19ORlNEX1YzX0FDTD15CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz1tCitDT05GSUdfTkZTX0FDTF9TVVBQT1JUPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorQ09ORklHX1NVTlJQQ19YUFJUX1JETUE9bQorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CitDT05GSUdfUlBDU0VDX0dTU19TUEtNMz1tCisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorQ09ORklHX0NJRlM9bQorIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCBpcyBub3Qgc2V0CitDT05GSUdfQ0lGU19YQVRUUj15CitDT05GSUdfQ0lGU19QT1NJWD15CisjIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNfUEFSVElUSU9OPXkKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfNzM3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfNzc1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODU1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODU3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYxPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYzPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY0PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY2PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY5PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTM2PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTQ5PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODc0PW0KK0NPTkZJR19OTFNfSVNPODg1OV84PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQorQ09ORklHX05MU19BU0NJST1tCitDT05GSUdfTkxTX0lTTzg4NTlfMT15CitDT05GSUdfTkxTX0lTTzg4NTlfMj1tCitDT05GSUdfTkxTX0lTTzg4NTlfMz1tCitDT05GSUdfTkxTX0lTTzg4NTlfND1tCitDT05GSUdfTkxTX0lTTzg4NTlfNT1tCitDT05GSUdfTkxTX0lTTzg4NTlfNj1tCitDT05GSUdfTkxTX0lTTzg4NTlfNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfOT1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTM9bQorQ09ORklHX05MU19JU084ODU5XzE0PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCitDT05GSUdfTkxTX0tPSThfUj1tCitDT05GSUdfTkxTX0tPSThfVT1tCitDT05GSUdfTkxTX1VURjg9bQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CitDT05GSUdfR0VORVJJQ19GSU5EX0xBU1RfQklUPXkKK0NPTkZJR19DUkNfQ0NJVFQ9bQorQ09ORklHX0NSQzE2PXkKK0NPTkZJR19DUkNfVDEwRElGPXkKK0NPTkZJR19DUkNfSVRVX1Q9bQorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorQ09ORklHX0xJQkNSQzMyQz1tCitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9bQorQ09ORklHX0xaT19DT01QUkVTUz1tCitDT05GSUdfTFpPX0RFQ09NUFJFU1M9bQorQ09ORklHX0RFQ09NUFJFU1NfR1pJUD15CitDT05GSUdfREVDT01QUkVTU19CWklQMj15CitDT05GSUdfREVDT01QUkVTU19MWk1BPXkKK0NPTkZJR19URVhUU0VBUkNIPXkKK0NPTkZJR19URVhUU0VBUkNIX0tNUD1tCitDT05GSUdfVEVYVFNFQVJDSF9CTT1tCitDT05GSUdfVEVYVFNFQVJDSF9GU009bQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQorQ09ORklHX05MQVRUUj15CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0yMDQ4CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKK0NPTkZJR19TQ0hFRFNUQVRTPXkKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tNRU1MRUFLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NVVRFWEVTPXkKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAorQ09ORklHX1RSQUNFX0lSUUZMQUdTPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRT15CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTEFURU5DWVRPUD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKK0NPTkZJR19OT1BfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0U9eQorQ09ORklHX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19FVkVOVF9UUkFDSU5HPXkKK0NPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQorQ09ORklHX1JJTkdfQlVGRkVSX0FMTE9XX1NXQVA9eQorQ09ORklHX1RSQUNJTkc9eQorQ09ORklHX0dFTkVSSUNfVFJBQ0VSPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQorQ09ORklHX0ZUUkFDRT15CisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0lSUVNPRkZfVFJBQ0VSPXkKK0NPTkZJR19TQ0hFRF9UUkFDRVI9eQorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQorIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUklOR19CVUZGRVJfQkVOQ0hNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19ESVNBQkxFX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfUFBDX1dFUlJPUj15CitDT05GSUdfUFJJTlRfU1RBQ0tfREVQVEg9NjQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKK0NPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CisjIENPTkZJR19QUENfRU1VTEFURURfU1RBVFMgaXMgbm90IHNldAorQ09ORklHX0NPREVfUEFUQ0hJTkdfU0VMRlRFU1Q9eQorQ09ORklHX0ZUUl9GSVhVUF9TRUxGVEVTVD15CitDT05GSUdfTVNJX0JJVE1BUF9TRUxGVEVTVD15CitDT05GSUdfWE1PTj15CisjIENPTkZJR19YTU9OX0RFRkFVTFQgaXMgbm90IHNldAorQ09ORklHX1hNT05fRElTQVNTRU1CTFk9eQorQ09ORklHX0RFQlVHR0VSPXkKK0NPTkZJR19JUlFTVEFDS1M9eQorIyBDT05GSUdfVklSUV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfWE9SX0JMT0NLUz15CitDT05GSUdfQVNZTkNfQ09SRT15CitDT05GSUdfQVNZTkNfTUVNQ1BZPXkKK0NPTkZJR19BU1lOQ19YT1I9eQorQ09ORklHX0FTWU5DX1BRPXkKK0NPTkZJR19BU1lOQ19SQUlENl9SRUNPVj15CitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKK0NPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJMj15CitDT05GSUdfQ1JZUFRPX0FFQUQ9bQorQ09ORklHX0NSWVBUT19BRUFEMj15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9eQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fSEFTSDI9eQorQ09ORklHX0NSWVBUT19STkc9bQorQ09ORklHX0NSWVBUT19STkcyPXkKK0NPTkZJR19DUllQVE9fUENPTVA9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUjI9eQorQ09ORklHX0NSWVBUT19HRjEyOE1VTD1tCitDT05GSUdfQ1JZUFRPX05VTEw9bQorQ09ORklHX0NSWVBUT19XT1JLUVVFVUU9eQorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0FVVEhFTkM9bQorQ09ORklHX0NSWVBUT19URVNUPW0KKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKK0NPTkZJR19DUllQVE9fQ0NNPW0KK0NPTkZJR19DUllQVE9fR0NNPW0KK0NPTkZJR19DUllQVE9fU0VRSVY9bQorCisjCisjIEJsb2NrIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0NCQz15CitDT05GSUdfQ1JZUFRPX0NUUj1tCisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19QQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCitDT05GSUdfQ1JZUFRPX0NSQzMyQz1tCitDT05GSUdfQ1JZUFRPX0dIQVNIPW0KK0NPTkZJR19DUllQVE9fTUQ0PW0KK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9bQorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NIQTE9bQorQ09ORklHX0NSWVBUT19TSEEyNTY9bQorQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19XUDUxMj1tCisKKyMKKyMgQ2lwaGVycworIworQ09ORklHX0NSWVBUT19BRVM9bQorQ09ORklHX0NSWVBUT19BTlVCSVM9bQorQ09ORklHX0NSWVBUT19BUkM0PW0KK0NPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQ0FTVDU9bQorQ09ORklHX0NSWVBUT19DQVNUNj1tCitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fS0hBWkFEPW0KK0NPTkZJR19DUllQVE9fU0FMU0EyMD1tCisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NFUlBFTlQ9bQorQ09ORklHX0NSWVBUT19URUE9bQorQ09ORklHX0NSWVBUT19UV09GSVNIPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSF9DT01NT049bQorCisjCisjIENvbXByZXNzaW9uCisjCitDT05GSUdfQ1JZUFRPX0RFRkxBVEU9bQorIyBDT05GSUdfQ1JZUFRPX1pMSUIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19MWk89bQorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19WSVJUVUFMSVpBVElPTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmgKaW5kZXggOWRhZGUxNS4uNmQ5NGQyNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kZXZpY2UuaApAQCAtMTUsNyArMTUsMTYgQEAKIAogCS8qIERNQSBvcGVyYXRpb25zIG9uIHRoYXQgZGV2aWNlICovCiAJc3RydWN0IGRtYV9tYXBfb3BzCSpkbWFfb3BzOwotCXZvaWQJCQkqZG1hX2RhdGE7CisKKwkvKgorCSAqIFdoZW4gYW4gaW9tbXUgaXMgaW4gdXNlLCBkbWFfZGF0YSBpcyB1c2VkIGFzIGEgcHRyIHRvIHRoZSBiYXNlIG9mIHRoZQorCSAqIGlvbW11X3RhYmxlLiAgT3RoZXJ3aXNlLCBpdCBpcyBhIHNpbXBsZSBudW1lcmljYWwgb2Zmc2V0LgorCSAqLworCXVuaW9uIHsKKwkJZG1hX2FkZHJfdAlkbWFfb2Zmc2V0OworCQl2b2lkCQkqaW9tbXVfdGFibGVfYmFzZTsKKwl9IGRtYV9kYXRhOworCiAjaWZkZWYgQ09ORklHX1NXSU9UTEIKIAlkbWFfYWRkcl90CQltYXhfZGlyZWN0X2RtYV9hZGRyOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmluZGV4IGNiMmNhNDEuLmUyODFkYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCkBAIC0yNiw3ICsyNiw2IEBACiBleHRlcm4gdm9pZCBkbWFfZGlyZWN0X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCQkgICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2KTsKIAogI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKIC8qCkBAIC05MCw2ICs4OSwyOCBAQAogCWRldi0+YXJjaGRhdGEuZG1hX29wcyA9IG9wczsKIH0KIAorLyoKKyAqIGdldF9kbWFfb2Zmc2V0KCkKKyAqCisgKiBHZXQgdGhlIGRtYSBvZmZzZXQgb24gY29uZmlndXJhdGlvbnMgd2hlcmUgdGhlIGRtYSBhZGRyZXNzIGNhbiBiZSBkZXRlcm1pbmVkCisgKiBmcm9tIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGJ5IGxvb2tpbmcgYXQgYSBzaW1wbGUgb2Zmc2V0LiAgRGlyZWN0IGRtYSBhbmQKKyAqIHN3aW90bGIgdXNlIHRoaXMgZnVuY3Rpb24sIGJ1dCBpdCBpcyB0eXBpY2FsbHkgbm90IHVzZWQgYnkgaW1wbGVtZW50YXRpb25zCisgKiB3aXRoIGFuIGlvbW11LgorICovCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZ2V0X2RtYV9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChkZXYpCisJCXJldHVybiBkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLmRtYV9vZmZzZXQ7CisKKwlyZXR1cm4gUENJX0RSQU1fT0ZGU0VUOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IG9mZikKK3sKKwlpZiAoZGV2KQorCQlkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLmRtYV9vZmZzZXQgPSBvZmY7Cit9CisKIC8qIHRoaXMgd2lsbCBiZSByZW1vdmVkIHNvb24gKi8KICNkZWZpbmUgZmx1c2hfd3JpdGVfYnVmZmVycygpCiAKQEAgLTE4MSwxMiArMjAyLDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBwaHlzX3RvX2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IHBhZGRyKQogewotCXJldHVybiBwYWRkciArIGdldF9kbWFfZGlyZWN0X29mZnNldChkZXYpOworCXJldHVybiBwYWRkciArIGdldF9kbWFfb2Zmc2V0KGRldik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3QgZG1hX3RvX3BoeXMoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRhZGRyKQogewotCXJldHVybiBkYWRkciAtIGdldF9kbWFfZGlyZWN0X29mZnNldChkZXYpOworCXJldHVybiBkYWRkciAtIGdldF9kbWFfb2Zmc2V0KGRldik7CiB9CiAKICNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Zpcm13YXJlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmlybXdhcmUuaAppbmRleCAzYTE3OTgyLi4yMDc3OGE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmlybXdhcmUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmlybXdhcmUuaApAQCAtMzcsNyArMzcsNyBAQAogI2RlZmluZSBGV19GRUFUVVJFX1ZJTwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwNDAwMCkKICNkZWZpbmUgRldfRkVBVFVSRV9SRE1BCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDA4MDAwKQogI2RlZmluZSBGV19GRUFUVVJFX0xMQU4JCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMTAwMDApCi0jZGVmaW5lIEZXX0ZFQVRVUkVfQlVMSwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAyMDAwMCkKKyNkZWZpbmUgRldfRkVBVFVSRV9CVUxLX1JFTU9WRQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDIwMDAwKQogI2RlZmluZSBGV19GRUFUVVJFX1hEQUJSCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwNDAwMDApCiAjZGVmaW5lIEZXX0ZFQVRVUkVfTVVMVElUQ0UJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDA4MDAwMCkKICNkZWZpbmUgRldfRkVBVFVSRV9TUExQQVIJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDEwMDAwMCkKQEAgLTQ1LDggKzQ1LDcgQEAKICNkZWZpbmUgRldfRkVBVFVSRV9MUEFSCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwNDAwMDAwKQogI2RlZmluZSBGV19GRUFUVVJFX1BTM19MVjEJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDgwMDAwMCkKICNkZWZpbmUgRldfRkVBVFVSRV9CRUFUCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAxMDAwMDAwKQotI2RlZmluZSBGV19GRUFUVVJFX0JVTEtfUkVNT1ZFCUFTTV9DT05TVCgweDAwMDAwMDAwMDIwMDAwMDApCi0jZGVmaW5lIEZXX0ZFQVRVUkVfQ01PCQlBU01fQ09OU1QoMHgwMDAwMDAwMDA0MDAwMDAwKQorI2RlZmluZSBGV19GRUFUVVJFX0NNTwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMjAwMDAwMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtNTgsOCArNTcsOSBAQAogCQlGV19GRUFUVVJFX1BFUkYgfCBGV19GRUFUVVJFX0RVTVAgfCBGV19GRUFUVVJFX0lOVEVSUlVQVCB8CiAJCUZXX0ZFQVRVUkVfTUlHUkFURSB8IEZXX0ZFQVRVUkVfUEVSRk1PTiB8IEZXX0ZFQVRVUkVfQ1JRIHwKIAkJRldfRkVBVFVSRV9WSU8gfCBGV19GRUFUVVJFX1JETUEgfCBGV19GRUFUVVJFX0xMQU4gfAotCQlGV19GRUFUVVJFX0JVTEsgfCBGV19GRUFUVVJFX1hEQUJSIHwgRldfRkVBVFVSRV9NVUxUSVRDRSB8Ci0JCUZXX0ZFQVRVUkVfU1BMUEFSIHwgRldfRkVBVFVSRV9MUEFSIHwgRldfRkVBVFVSRV9DTU8sCisJCUZXX0ZFQVRVUkVfQlVMS19SRU1PVkUgfCBGV19GRUFUVVJFX1hEQUJSIHwKKwkJRldfRkVBVFVSRV9NVUxUSVRDRSB8IEZXX0ZFQVRVUkVfU1BMUEFSIHwgRldfRkVBVFVSRV9MUEFSIHwKKwkJRldfRkVBVFVSRV9DTU8sCiAJRldfRkVBVFVSRV9QU0VSSUVTX0FMV0FZUyA9IDAsCiAJRldfRkVBVFVSRV9JU0VSSUVTX1BPU1NJQkxFID0gRldfRkVBVFVSRV9JU0VSSUVTIHwgRldfRkVBVFVSRV9MUEFSLAogCUZXX0ZFQVRVUkVfSVNFUklFU19BTFdBWVMgPSBGV19GRUFUVVJFX0lTRVJJRVMgfCBGV19GRUFUVVJFX0xQQVIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsZG1hLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3YWVlZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9mc2xkbWEuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIEZyZWVzY2FsZSBNUEM4M1hYIC8gTVBDODVYWCBETUEgQ29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJcmEgVy4gU255ZGVyIDxpd3NAb3Zyby5jYWx0ZWNoLmVkdT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX19BUkNIX1BPV0VSUENfQVNNX0ZTTERNQV9IX18KKyNkZWZpbmUgX19BUkNIX1BPV0VSUENfQVNNX0ZTTERNQV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBGcmVlc2NhbGUgRE1BIGNvbnRyb2xsZXIncyBETUFfU0xBVkUgaW1wbGVtZW50aW9uCisgKgorICogVGhlIEZyZWVzY2FsZSBETUFfU0xBVkUgaW1wbGVtZW50YXRpb24gd2FzIGRlc2lnbmVkIHRvIGhhbmRsZSBtYW55LXRvLW1hbnkKKyAqIHRyYW5zZmVycy4gQW4gZXhhbXBsZSB1c2FnZSB3b3VsZCBiZSBhbiBhY2NlbGVyYXRlZCBjb3B5IGJldHdlZW4gdHdvCisgKiBzY2F0dGVybGlzdHMuIEFub3RoZXIgZXhhbXBsZSB1c2Ugd291bGQgYmUgYW4gYWNjZWxlcmF0ZWQgY29weSBmcm9tCisgKiBtdWx0aXBsZSBub24tY29udGlndW91cyBkZXZpY2UgYnVmZmVycyBpbnRvIGEgc2luZ2xlIHNjYXR0ZXJsaXN0LgorICoKKyAqIEEgRE1BX1NMQVZFIHRyYW5zYWN0aW9uIGlzIGRlZmluZWQgYnkgYSBzdHJ1Y3QgZnNsX2RtYV9zbGF2ZS4gVGhpcworICogc3RydWN0dXJlIGNvbnRhaW5zIGEgbGlzdCBvZiBoYXJkd2FyZSBhZGRyZXNzZXMgdGhhdCBzaG91bGQgYmUgY29waWVkCisgKiB0by9mcm9tIHRoZSBzY2F0dGVybGlzdCBwYXNzZWQgaW50byBkZXZpY2VfcHJlcF9zbGF2ZV9zZygpLiBUaGUgc3RydWN0dXJlCisgKiBhbHNvIGhhcyBzb21lIGZpZWxkcyB0byBlbmFibGUgaGFyZHdhcmUtc3BlY2lmaWMgZmVhdHVyZXMuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZnNsX2RtYV9od19hZGRyCisgKiBAZW50cnk6IGxpbmtlZCBsaXN0IGVudHJ5CisgKiBAYWRkcmVzczogdGhlIGhhcmR3YXJlIGFkZHJlc3MKKyAqIEBsZW5ndGg6IGxlbmd0aCB0byB0cmFuc2ZlcgorICoKKyAqIEhvbGRzIGEgc2luZ2xlIHBoeXNpY2FsIGhhcmR3YXJlIGFkZHJlc3MgLyBsZW5ndGggcGFpciBmb3IgdXNlCisgKiB3aXRoIHRoZSBETUFFbmdpbmUgRE1BX1NMQVZFIEFQSS4KKyAqLworc3RydWN0IGZzbF9kbWFfaHdfYWRkciB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKworCWRtYV9hZGRyX3QgYWRkcmVzczsKKwlzaXplX3QgbGVuZ3RoOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX2RtYV9zbGF2ZQorICogQGFkZHJlc3NlczogYSBsaW5rZWQgbGlzdCBvZiBzdHJ1Y3QgZnNsX2RtYV9od19hZGRyIHN0cnVjdHVyZXMKKyAqIEByZXF1ZXN0X2NvdW50OiB2YWx1ZSBmb3IgRE1BIHJlcXVlc3QgY291bnQKKyAqIEBzcmNfbG9vcF9zaXplOiBzZXR1cCBhbmQgZW5hYmxlIGNvbnN0YW50IHNvdXJjZS1hZGRyZXNzIERNQSB0cmFuc2ZlcnMKKyAqIEBkc3RfbG9vcF9zaXplOiBzZXR1cCBhbmQgZW5hYmxlIGNvbnN0YW50IGRlc3RpbmF0aW9uIGFkZHJlc3MgRE1BIHRyYW5zZmVycworICogQGV4dGVybmFsX3N0YXJ0OiBlbmFibGUgZXh0ZXJuYWxseSBzdGFydGVkIERNQSB0cmFuc2ZlcnMKKyAqIEBleHRlcm5hbF9wYXVzZTogZW5hYmxlIGV4dGVybmFsbHkgcGF1c2VkIERNQSB0cmFuc2ZlcnMKKyAqCisgKiBIb2xkcyBhIGxpc3Qgb2YgYWRkcmVzcyAvIGxlbmd0aCBwYWlycyBmb3IgdXNlIHdpdGggdGhlIERNQUVuZ2luZQorICogRE1BX1NMQVZFIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEZyZWVzY2FsZSBETUEgY29udHJvbGxlci4KKyAqLworc3RydWN0IGZzbF9kbWFfc2xhdmUgeworCisJLyogTGlzdCBvZiBoYXJkd2FyZSBhZGRyZXNzL2xlbmd0aCBwYWlycyAqLworCXN0cnVjdCBsaXN0X2hlYWQgYWRkcmVzc2VzOworCisJLyogU3VwcG9ydCBmb3IgZXh0cmEgY29udHJvbGxlciBmZWF0dXJlcyAqLworCXVuc2lnbmVkIGludCByZXF1ZXN0X2NvdW50OworCXVuc2lnbmVkIGludCBzcmNfbG9vcF9zaXplOworCXVuc2lnbmVkIGludCBkc3RfbG9vcF9zaXplOworCWJvb2wgZXh0ZXJuYWxfc3RhcnQ7CisJYm9vbCBleHRlcm5hbF9wYXVzZTsKK307CisKKy8qKgorICogZnNsX2RtYV9zbGF2ZV9hcHBlbmQgLSBhZGQgYW4gYWRkcmVzcy9sZW5ndGggcGFpciB0byBhIHN0cnVjdCBmc2xfZG1hX3NsYXZlCisgKiBAc2xhdmU6IHRoZSAmc3RydWN0IGZzbF9kbWFfc2xhdmUgdG8gYWRkIHRvCisgKiBAYWRkcmVzczogdGhlIGhhcmR3YXJlIGFkZHJlc3MgdG8gYWRkCisgKiBAbGVuZ3RoOiB0aGUgbGVuZ3RoIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIGZyb20gQGFkZHJlc3MKKyAqCisgKiBBZGQgYSBoYXJkd2FyZSBhZGRyZXNzL2xlbmd0aCBwYWlyIHRvIGEgc3RydWN0IGZzbF9kbWFfc2xhdmUuIFJldHVybnMgMCBvbgorICogc3VjY2VzcywgLUVSUk5PIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZnNsX2RtYV9zbGF2ZV9hcHBlbmQoc3RydWN0IGZzbF9kbWFfc2xhdmUgKnNsYXZlLAorCQkJCSAgICAgICBkbWFfYWRkcl90IGFkZHJlc3MsIHNpemVfdCBsZW5ndGgpCit7CisJc3RydWN0IGZzbF9kbWFfaHdfYWRkciAqYWRkcjsKKworCWFkZHIgPSBremFsbG9jKHNpemVvZigqYWRkciksIEdGUF9BVE9NSUMpOworCWlmICghYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmYWRkci0+ZW50cnkpOworCWFkZHItPmFkZHJlc3MgPSBhZGRyZXNzOworCWFkZHItPmxlbmd0aCA9IGxlbmd0aDsKKworCWxpc3RfYWRkX3RhaWwoJmFkZHItPmVudHJ5LCAmc2xhdmUtPmFkZHJlc3Nlcyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZnNsX2RtYV9zbGF2ZV9mcmVlIC0gZnJlZSBhIHN0cnVjdCBmc2xfZG1hX3NsYXZlCisgKiBAc2xhdmU6IHRoZSBzdHJ1Y3QgZnNsX2RtYV9zbGF2ZSB0byBmcmVlCisgKgorICogRnJlZSBhIHN0cnVjdCBmc2xfZG1hX3NsYXZlIGFuZCBhbGwgYXNzb2NpYXRlZCBhZGRyZXNzL2xlbmd0aCBwYWlycworICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNsX2RtYV9zbGF2ZV9mcmVlKHN0cnVjdCBmc2xfZG1hX3NsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgZnNsX2RtYV9od19hZGRyICphZGRyLCAqdG1wOworCisJaWYgKHNsYXZlKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhZGRyLCB0bXAsICZzbGF2ZS0+YWRkcmVzc2VzLCBlbnRyeSkgeworCQkJbGlzdF9kZWwoJmFkZHItPmVudHJ5KTsKKwkJCWtmcmVlKGFkZHIpOworCQl9CisKKwkJa2ZyZWUoc2xhdmUpOworCX0KK30KKworLyoqCisgKiBmc2xfZG1hX3NsYXZlX2FsbG9jIC0gYWxsb2NhdGUgYSBzdHJ1Y3QgZnNsX2RtYV9zbGF2ZQorICogQGdmcDogdGhlIGZsYWdzIHRvIHBhc3MgdG8ga21hbGxvYyB3aGVuIGFsbG9jYXRpbmcgdGhpcyBzdHJ1Y3R1cmUKKyAqCisgKiBBbGxvY2F0ZSBhIHN0cnVjdCBmc2xfZG1hX3NsYXZlIGZvciB1c2UgYnkgdGhlIERNQV9TTEFWRSBBUEkuIFJldHVybnMgYSBuZXcKKyAqIHN0cnVjdCBmc2xfZG1hX3NsYXZlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZnNsX2RtYV9zbGF2ZSAqZnNsX2RtYV9zbGF2ZV9hbGxvYyhnZnBfdCBnZnApCit7CisJc3RydWN0IGZzbF9kbWFfc2xhdmUgKnNsYXZlOworCisJc2xhdmUgPSBremFsbG9jKHNpemVvZigqc2xhdmUpLCBnZnApOworCWlmICghc2xhdmUpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJnNsYXZlLT5hZGRyZXNzZXMpOworCXJldHVybiBzbGF2ZTsKK30KKworI2VuZGlmIC8qIF9fQVJDSF9QT1dFUlBDX0FTTV9GU0xETUFfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW9tbXUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pb21tdS5oCmluZGV4IDc0NjRjMGQuLmVkZmM5ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pb21tdS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pb21tdS5oCkBAIC03MCw2ICs3MCwxNiBAQAogCiBzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaW9tbXVfdGFibGVfYmFzZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmJhc2UpCit7CisJZGV2LT5hcmNoZGF0YS5kbWFfZGF0YS5pb21tdV90YWJsZV9iYXNlID0gYmFzZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpnZXRfaW9tbXVfdGFibGVfYmFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+YXJjaGRhdGEuZG1hX2RhdGEuaW9tbXVfdGFibGVfYmFzZTsKK30KKwogLyogRnJlZXMgdGFibGUgZm9yIGFuIGluZGl2aWR1YWwgZGV2aWNlIG5vZGUgKi8KIGV4dGVybiB2b2lkIGlvbW11X2ZyZWVfdGFibGUoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGNvbnN0IGNoYXIgKm5vZGVfbmFtZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wbWMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wbWMuaAppbmRleCBjY2M2OGI1Li41YTllZGU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcG1jLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BtYy5oCkBAIC0yOSw3ICsyOSw3IEBACiB2b2lkIHJlbGVhc2VfcG1jX2hhcmR3YXJlKHZvaWQpOwogdm9pZCBwcGNfZW5hYmxlX3BtY3Modm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAogI2luY2x1ZGUgPGFzbS9scHBhY2EuaD4KIAogc3RhdGljIGlubGluZSB2b2lkIHBwY19zZXRfcG11X2ludXNlKGludCBpbnVzZSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtNDB4LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHRlLTQweC5oCmluZGV4IDZjM2UxZjQuLmVjMGIwYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtNDB4LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS00MHguaApAQCAtNDMsNiArNDMsNyBAQAogI2RlZmluZQlfUEFHRV9OT19DQUNIRQkweDAwNAkvKiBJOiBjYWNoaW5nIGlzIGluaGliaXRlZCAqLwogI2RlZmluZQlfUEFHRV9XUklURVRIUlUJMHgwMDgJLyogVzogY2FjaGluZyBpcyB3cml0ZS10aHJvdWdoICovCiAjZGVmaW5lCV9QQUdFX1VTRVIJMHgwMTAJLyogbWF0Y2hlcyBvbmUgb2YgdGhlIHpvbmUgcGVybWlzc2lvbiBiaXRzICovCisjZGVmaW5lCV9QQUdFX1NQRUNJQUwJMHgwMjAJLyogc29mdHdhcmU6IFNwZWNpYWwgcGFnZSAqLwogI2RlZmluZQlfUEFHRV9SVwkweDA0MAkvKiBzb2Z0d2FyZTogV3JpdGVzIHBlcm1pdHRlZCAqLwogI2RlZmluZQlfUEFHRV9ESVJUWQkweDA4MAkvKiBzb2Z0d2FyZTogZGlydHkgcGFnZSAqLwogI2RlZmluZSBfUEFHRV9IV1dSSVRFCTB4MTAwCS8qIGhhcmR3YXJlOiBEaXJ0eSAmIFJXLCBzZXQgaW4gZXhjZXB0aW9uICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHRlLTh4eC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS04eHguaAppbmRleCA5NGU5Nzk3Li5kZDVlYTk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHRlLTh4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtOHh4LmgKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgX1BBR0VfRklMRQkweDAwMDIJLyogd2hlbiAhcHJlc2VudDogbm9ubGluZWFyIGZpbGUgbWFwcGluZyAqLwogI2RlZmluZSBfUEFHRV9OT19DQUNIRQkweDAwMDIJLyogSTogY2FjaGUgaW5oaWJpdCAqLwogI2RlZmluZSBfUEFHRV9TSEFSRUQJMHgwMDA0CS8qIE5vIEFTSUQgKGNvbnRleHQpIGNvbXBhcmUgKi8KKyNkZWZpbmUgX1BBR0VfU1BFQ0lBTAkweDAwMDgJLyogU1cgZW50cnksIGZvcmNlZCB0byAwIGJ5IHRoZSBUTEIgbWlzcyAqLwogCiAvKiBUaGVzZSBmaXZlIHNvZnR3YXJlIGJpdHMgbXVzdCBiZSBtYXNrZWQgb3V0IHdoZW4gdGhlIGVudHJ5IGlzIGxvYWRlZAogICogaW50byB0aGUgVExCLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS1jb21tb24uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtY29tbW9uLmgKaW5kZXggYzNiNjUwNy4uZjJiMzcwMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS1jb21tb24uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHRlLWNvbW1vbi5oCkBAIC0yNSw5ICsyNSw2IEBACiAjaWZuZGVmIF9QQUdFX1dSSVRFVEhSVQogI2RlZmluZSBfUEFHRV9XUklURVRIUlUJMAogI2VuZGlmCi0jaWZuZGVmIF9QQUdFX1NQRUNJQUwKLSNkZWZpbmUgX1BBR0VfU1BFQ0lBTAkwCi0jZW5kaWYKICNpZm5kZWYgX1BBR0VfNEtfUEZOCiAjZGVmaW5lIF9QQUdFXzRLX1BGTgkJMAogI2VuZGlmCkBAIC0xNzksNyArMTc2LDUgQEAKICNkZWZpbmUgSEFWRV9QQUdFX0FHUAogCiAvKiBBZHZlcnRpc2Ugc3VwcG9ydCBmb3IgX1BBR0VfU1BFQ0lBTCAqLwotI2lmZGVmIF9QQUdFX1NQRUNJQUwKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NQRUNJQUwKLSNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggYzBkM2I4YS4uZDllYThkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMTQ2LDcgKzE0Niw3IEBACiBleHRlcm4gc3RydWN0IHNtcF9vcHNfdCAqc21wX29wczsKIAogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KTsKLWV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaShjcHVtYXNrX3QgbWFzayk7CitleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CiAKIC8qIERlZmluaXRpb25zIHJlbGF0aXZlIHRvIHRoZSBzZWNvbmRhcnkgQ1BVIHNwaW4gbG9vcAogICogYW5kIGVudHJ5IHBvaW50LiBOb3QgYWxsIG9mIHRoZW0gZXhpc3Qgb24gYm90aCAzMiBhbmQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggMzk0ZWRjYi4uMjJmNzM4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTE3LDExICsxNyw2IEBACiAKICNkZWZpbmUgcGFyZW50X25vZGUobm9kZSkJKG5vZGUpCiAKLXN0YXRpYyBpbmxpbmUgY3B1bWFza190IG5vZGVfdG9fY3B1bWFzayhpbnQgbm9kZSkKLXsKLQlyZXR1cm4gbnVtYV9jcHVtYXNrX2xvb2t1cF90YWJsZVtub2RlXTsKLX0KLQogI2RlZmluZSBjcHVtYXNrX29mX25vZGUobm9kZSkgKCZudW1hX2NwdW1hc2tfbG9va3VwX3RhYmxlW25vZGVdKQogCiBpbnQgb2Zfbm9kZV90b19uaWQoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UpOwpAQCAtMzYsMTEgKzMxLDYgQEAKIH0KICNlbmRpZgogCi0jZGVmaW5lIHBjaWJ1c190b19jcHVtYXNrKGJ1cykJKHBjaWJ1c190b19ub2RlKGJ1cykgPT0gLTEgPyBcCi0JCQkJCUNQVV9NQVNLX0FMTCA6IFwKLQkJCQkJbm9kZV90b19jcHVtYXNrKHBjaWJ1c190b19ub2RlKGJ1cykpIFwKLQkJCQkpCi0KICNkZWZpbmUgY3B1bWFza19vZl9wY2lidXMoYnVzKQkocGNpYnVzX3RvX25vZGUoYnVzKSA9PSAtMSA/CQlcCiAJCQkJIGNwdV9hbGxfbWFzayA6CQkJCVwKIAkJCQkgY3B1bWFza19vZl9ub2RlKHBjaWJ1c190b19ub2RlKGJ1cykpKQpAQCAtMTA0LDggKzk0LDYgQEAKICNpZmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxhc20vc21wLmg+CiAKLSNkZWZpbmUgdG9wb2xvZ3lfdGhyZWFkX3NpYmxpbmdzKGNwdSkJKHBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBjcHUpKQotI2RlZmluZSB0b3BvbG9neV9jb3JlX3NpYmxpbmdzKGNwdSkJKHBlcl9jcHUoY3B1X2NvcmVfbWFwLCBjcHUpKQogI2RlZmluZSB0b3BvbG9neV90aHJlYWRfY3B1bWFzayhjcHUpCSgmcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGNwdSkpCiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfY3B1bWFzayhjcHUpCSgmcGVyX2NwdShjcHVfY29yZV9tYXAsIGNwdSkpCiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfaWQoY3B1KQkJKGNwdV90b19jb3JlX2lkKGNwdSkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggMGI5YzkxMy4uMDNjODYyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtNzExLDYgKzcxMSw4IEBACiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAogCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrX2dlbmVyaWMsCiAJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKKwkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc1MCIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKIAl9LAogCXsJLyogNzQ1Lzc1NSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZjAwMCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jCmluZGV4IDg3ZGRiM2YuLjM3NzcxYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtaW9tbXUuYwpAQCAtMTgsNyArMTgsNyBAQAogc3RhdGljIHZvaWQgKmRtYV9pb21tdV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAogCQkJCSAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCiB7Ci0JcmV0dXJuIGlvbW11X2FsbG9jX2NvaGVyZW50KGRldiwgZGV2LT5hcmNoZGF0YS5kbWFfZGF0YSwgc2l6ZSwKKwlyZXR1cm4gaW9tbXVfYWxsb2NfY29oZXJlbnQoZGV2LCBnZXRfaW9tbXVfdGFibGVfYmFzZShkZXYpLCBzaXplLAogCQkJCSAgICBkbWFfaGFuZGxlLCBkZXZpY2VfdG9fbWFzayhkZXYpLCBmbGFnLAogCQkJCSAgICBkZXZfdG9fbm9kZShkZXYpKTsKIH0KQEAgLTI2LDcgKzI2LDcgQEAKIHN0YXRpYyB2b2lkIGRtYV9pb21tdV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCiAJCQkJICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCiB7Ci0JaW9tbXVfZnJlZV9jb2hlcmVudChkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7CisJaW9tbXVfZnJlZV9jb2hlcmVudChnZXRfaW9tbXVfdGFibGVfYmFzZShkZXYpLCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7CiB9CiAKIC8qIENyZWF0ZXMgVENFcyBmb3IgYSB1c2VyIHByb3ZpZGVkIGJ1ZmZlci4gIFRoZSB1c2VyIGJ1ZmZlciBtdXN0IGJlCkBAIC0zOSw4ICszOSw4IEBACiAJCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCiAJCQkJICAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKIHsKLQlyZXR1cm4gaW9tbXVfbWFwX3BhZ2UoZGV2LCBkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBwYWdlLCBvZmZzZXQsIHNpemUsCi0JCQkgICAgICBkZXZpY2VfdG9fbWFzayhkZXYpLCBkaXJlY3Rpb24sIGF0dHJzKTsKKwlyZXR1cm4gaW9tbXVfbWFwX3BhZ2UoZGV2LCBnZXRfaW9tbXVfdGFibGVfYmFzZShkZXYpLCBwYWdlLCBvZmZzZXQsCisJCQkgICAgICBzaXplLCBkZXZpY2VfdG9fbWFzayhkZXYpLCBkaXJlY3Rpb24sIGF0dHJzKTsKIH0KIAogCkBAIC00OCw3ICs0OCw3IEBACiAJCQkJIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCiAJCQkJIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQogewotCWlvbW11X3VubWFwX3BhZ2UoZGV2LT5hcmNoZGF0YS5kbWFfZGF0YSwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyZWN0aW9uLAorCWlvbW11X3VubWFwX3BhZ2UoZ2V0X2lvbW11X3RhYmxlX2Jhc2UoZGV2KSwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyZWN0aW9uLAogCQkJIGF0dHJzKTsKIH0KIApAQCAtNTcsNyArNTcsNyBAQAogCQkJICAgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKIAkJCSAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKIHsKLQlyZXR1cm4gaW9tbXVfbWFwX3NnKGRldiwgZGV2LT5hcmNoZGF0YS5kbWFfZGF0YSwgc2dsaXN0LCBuZWxlbXMsCisJcmV0dXJuIGlvbW11X21hcF9zZyhkZXYsIGdldF9pb21tdV90YWJsZV9iYXNlKGRldiksIHNnbGlzdCwgbmVsZW1zLAogCQkJICAgIGRldmljZV90b19tYXNrKGRldiksIGRpcmVjdGlvbiwgYXR0cnMpOwogfQogCkBAIC02NSwxNCArNjUsMTQgQEAKIAkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAogCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKIHsKLQlpb21tdV91bm1hcF9zZyhkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzZ2xpc3QsIG5lbGVtcywgZGlyZWN0aW9uLAorCWlvbW11X3VubWFwX3NnKGdldF9pb21tdV90YWJsZV9iYXNlKGRldiksIHNnbGlzdCwgbmVsZW1zLCBkaXJlY3Rpb24sCiAJCSAgICAgICBhdHRycyk7CiB9CiAKIC8qIFdlIHN1cHBvcnQgRE1BIHRvL2Zyb20gYW55IG1lbW9yeSBwYWdlIHZpYSB0aGUgaW9tbXUgKi8KIHN0YXRpYyBpbnQgZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKIHsKLQlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRldi0+YXJjaGRhdGEuZG1hX2RhdGE7CisJc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBnZXRfaW9tbXVfdGFibGVfYmFzZShkZXYpOwogCiAJaWYgKCF0YmwgfHwgdGJsLT5pdF9vZmZzZXQgPiBtYXNrKSB7CiAJCXByaW50ayhLRVJOX0lORk8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS5jCmluZGV4IDIxYjc4NGQuLjYyMTUwNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEuYwpAQCAtMjEsMTMgKzIxLDYgQEAKICAqIGRlZmF1bHQgdGhlIG9mZnNldCBpcyBQQ0lfRFJBTV9PRkZTRVQuCiAgKi8KIAotdW5zaWduZWQgbG9uZyBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWlmIChkZXYpCi0JCXJldHVybiAodW5zaWduZWQgbG9uZylkZXYtPmFyY2hkYXRhLmRtYV9kYXRhOwotCi0JcmV0dXJuIFBDSV9EUkFNX09GRlNFVDsKLX0KIAogdm9pZCAqZG1hX2RpcmVjdF9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAogCQkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCkBAIC0zNyw3ICszMCw3IEBACiAJcmV0ID0gX19kbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBmbGFnKTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCSpkbWFfaGFuZGxlICs9IGdldF9kbWFfZGlyZWN0X29mZnNldChkZXYpOworCSpkbWFfaGFuZGxlICs9IGdldF9kbWFfb2Zmc2V0KGRldik7CiAJcmV0dXJuIHJldDsKICNlbHNlCiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC01MSw3ICs0NCw3IEBACiAJCXJldHVybiBOVUxMOwogCXJldCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKIAltZW1zZXQocmV0LCAwLCBzaXplKTsKLQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fYWJzKHJldCkgKyBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoZGV2KTsKKwkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fYWJzKHJldCkgKyBnZXRfZG1hX29mZnNldChkZXYpOwogCiAJcmV0dXJuIHJldDsKICNlbmRpZgpAQCAtNzUsNyArNjgsNyBAQAogCWludCBpOwogCiAJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVudHMsIGkpIHsKLQkJc2ctPmRtYV9hZGRyZXNzID0gc2dfcGh5cyhzZykgKyBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoZGV2KTsKKwkJc2ctPmRtYV9hZGRyZXNzID0gc2dfcGh5cyhzZykgKyBnZXRfZG1hX29mZnNldChkZXYpOwogCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7CiAJCV9fZG1hX3N5bmNfcGFnZShzZ19wYWdlKHNnKSwgc2ctPm9mZnNldCwgc2ctPmxlbmd0aCwgZGlyZWN0aW9uKTsKIAl9CkBAIC0xMTAsNyArMTAzLDcgQEAKIHsKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAlfX2RtYV9zeW5jX3BhZ2UocGFnZSwgb2Zmc2V0LCBzaXplLCBkaXIpOwotCXJldHVybiBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQgKyBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoZGV2KTsKKwlyZXR1cm4gcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0ICsgZ2V0X2RtYV9vZmZzZXQoZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRtYV9kaXJlY3RfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggOTAwZTBlZS4uOTc2MzI2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwpAQCAtNjU4LDQyICs2NTgsNDMgQEAKIAljbXBkaQlyMCwwCiAJY3JhbmRjCWVxLGNyMSo0K2VxLGVxCiAJYm5lCXJlc3RvcmUKLQkvKiBoZXJlIHdlIGFyZSBwcmVlbXB0aW5nIHRoZSBjdXJyZW50IHRhc2sgKi8KLTE6Ci0jaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCi0JYmwJLnRyYWNlX2hhcmRpcnFzX29uCi0JLyogTm90ZTogd2UganVzdCBjbG9iYmVyZWQgcjEwIHdoaWNoIHVzZWQgdG8gY29udGFpbiB0aGUgcHJldmlvdXMKLQkgKiBNU1IgYmVmb3JlIHRoZSBoYXJkLWRpc2FibGluZyBkb25lIGJ5IHRoZSBjYWxsZXIgb2YgZG9fd29yay4KLQkgKiBXZSBkb24ndCBoYXZlIHRoYXQgdmFsdWUgYW55bW9yZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGFzCi0JICogd2Ugd2lsbCBoYXJkLWVuYWJsZSB1bmNvbmRpdGlvbmFsbHksIHdlIGNhbiBqdXN0IHJlbG9hZCB0aGUKLQkgKiBjdXJyZW50IE1TUiBpbnRvIHIxMAorCisJLyogSGVyZSB3ZSBhcmUgcHJlZW1wdGluZyB0aGUgY3VycmVudCB0YXNrLgorCSAqCisJICogRW5zdXJlIGludGVycnVwdHMgYXJlIHNvZnQtZGlzYWJsZWQuIFdlIGFsc28gcHJvcGVybHkgbWFyaworCSAqIHRoZSBQQUNBIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGV5IGFyZSBoYXJkLWRpc2FibGVkCisJICogYW5kIHRyYWNlIHRoZSBjaGFuZ2UKIAkgKi8KLQltZm1zcglyMTAKLSNlbmRpZiAvKiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MgKi8KLQlsaQlyMCwxCisJbGkJcjAsMAogCXN0YglyMCxQQUNBU09GVElSUUVOKHIxMykKIAlzdGIJcjAsUEFDQUhBUkRJUlFFTihyMTMpCisJVFJBQ0VfRElTQUJMRV9JTlRTCisKKwkvKiBDYWxsIHRoZSBzY2hlZHVsZXIgd2l0aCBzb2Z0IElSUXMgb2ZmICovCisxOglibAkucHJlZW1wdF9zY2hlZHVsZV9pcnEKKworCS8qIEhhcmQtZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIChhbmQgdXBkYXRlIFBBQ0EpICovCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKLQl3cnRlZWkJMQotCWJsCS5wcmVlbXB0X3NjaGVkdWxlCiAJd3J0ZWVpCTAKICNlbHNlCi0Jb3JpCXIxMCxyMTAsTVNSX0VFCi0JbXRtc3JkCXIxMCwxCQkvKiByZWVuYWJsZSBpbnRlcnJ1cHRzICovCi0JYmwJLnByZWVtcHRfc2NoZWR1bGUKIAltZm1zcglyMTAKLQljbHJyZGkJcjkscjEsVEhSRUFEX1NISUZUCi0JcmxkaWNsCXIxMCxyMTAsNDgsMQkvKiBkaXNhYmxlIGludGVycnVwdHMgYWdhaW4gKi8KKwlybGRpY2wJcjEwLHIxMCw0OCwxCiAJcm90bGRpCXIxMCxyMTAsMTYKIAltdG1zcmQJcjEwLDEKICNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szRSAqLworCWxpCXIwLDAKKwlzdGIJcjAsUEFDQUhBUkRJUlFFTihyMTMpCisKKwkvKiBSZS10ZXN0IGZsYWdzIGFuZCBldmVudHVhbGx5IGxvb3AgKi8KKwljbHJyZGkJcjkscjEsVEhSRUFEX1NISUZUCiAJbGQJcjQsVElfRkxBR1MocjkpCiAJYW5kaS4JcjAscjQsX1RJRl9ORUVEX1JFU0NIRUQKIAlibmUJMWIKIAliCXJlc3RvcmUKIAogdXNlcl93b3JrOgotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1BSRUVNUFQgKi8KKwogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKIAl3cnRlZWkJMQpAQCAtMTAzOCw4ICsxMDM5LDcgQEAKIAkgKiBXZSBhcmUgaW4gYSBtb2R1bGUgdXNpbmcgdGhlIG1vZHVsZSdzIFRPQy4KIAkgKiBTd2l0Y2ggdG8gb3VyIFRPQyB0byBydW4gaW5zaWRlIHRoZSBjb3JlIGtlcm5lbC4KIAkgKi8KLQlMT0FEX1JFR19JTU1FRElBVEUocjQsZnRyYWNlX3JldHVybl90b19oYW5kbGVyKQotCWxkCXIyLCA4KHI0KQorCWxkCXIyLCBQQUNBVE9DKHIxMykKIAogCWJsCS5mdHJhY2VfcmV0dXJuX3RvX2hhbmRsZXIKIAlub3AKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NGUuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NGUuUwppbmRleCA5MDQ4Zjk2Li4yNGRjYzBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRlLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0ZS5TCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL3JlZy5oPgogI2luY2x1ZGUgPGFzbS9leGNlcHRpb24tNjRlLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggZmZjNDI1My4uMjM3NWI3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2luaXRfdGFzay5jCkBAIC0xNiw5ICsxNiw4IEBACiAgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCiAgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KICAqLwotdW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIAotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KLQkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KKwl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwogCiAvKgogICogSW5pdGlhbCB0YXNrIHN0cnVjdHVyZS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva2dkYi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rZ2RiLmMKaW5kZXggZmU4ZjcxZC4uNjQxYzc0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rZ2RiLmMKQEAgLTI4MiwxMiArMjgyLDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nICpwdHIgPSBnZGJfcmVnczsKIAlpbnQgcmVnOwotI2lmZGVmIENPTkZJR19TUEUKLQl1bmlvbiB7Ci0JCXUzMiB2MzJbMl07Ci0JCXU2NCB2NjQ7Ci0JfSBhY2M7Ci0jZW5kaWYKIAogCWZvciAocmVnID0gMDsgcmVnIDwgMzI7IHJlZysrKQogCQlVTlBBQ0s2NChyZWdzLT5ncHJbcmVnXSwgcHRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKaW5kZXggNDllNzA1Zi4uMDQwYmQxZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0yNDksOCArMjUwLDggQEAKICAqIFdlIGNvdWxkIHVzZSBhIHNtYWxsZXIgc3RhY2sgaWYgd2UgZG9uJ3QgY2FyZSBhYm91dCBhbnl0aGluZyB1c2luZwogICogY3VycmVudCwgYnV0IHRoYXQgYXVkaXQgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZC4KICAqLwotc3RhdGljIHVuaW9uIHRocmVhZF91bmlvbiBrZXhlY19zdGFjawotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0geyB9Oworc3RhdGljIHVuaW9uIHRocmVhZF91bmlvbiBrZXhlY19zdGFjayBfX2luaXRfdGFza19kYXRhID0KKwl7IH07CiAKIC8qIE91ciBhc3NlbWJseSBoZWxwZXIsIGluIGtleGVjX3N0dWIuUyAqLwogZXh0ZXJuIE5PUkVUX1RZUEUgdm9pZCBrZXhlY19zZXF1ZW5jZSh2b2lkICpuZXdzdGFjaywgdW5zaWduZWQgbG9uZyBzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKaW5kZXggZTlmNDg0MC4uZThkZmRiZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTExMTcsNyArMTExNyw3IEBACiAKIAkJLyogSG9vayB1cCBkZWZhdWx0IERNQSBvcHMgKi8KIAkJc2QtPmRtYV9vcHMgPSBwY2lfZG1hX29wczsKLQkJc2QtPmRtYV9kYXRhID0gKHZvaWQgKilQQ0lfRFJBTV9PRkZTRVQ7CisJCXNldF9kbWFfb2Zmc2V0KCZkZXYtPmRldiwgUENJX0RSQU1fT0ZGU0VUKTsKIAogCQkvKiBBZGRpdGlvbmFsIHBsYXRmb3JtIERNQS9pb21tdSBzZXR1cCAqLwogCQlpZiAocHBjX21kLnBjaV9kbWFfZGV2X3NldHVwKQpAQCAtMTE5MCw3ICsxMTkwLDcgQEAKICAqIFJlcGFyZW50IHJlc291cmNlIGNoaWxkcmVuIG9mIHByIHRoYXQgY29uZmxpY3Qgd2l0aCByZXMKICAqIHVuZGVyIHJlcywgYW5kIG1ha2UgcmVzIHJlcGxhY2UgdGhvc2UgY2hpbGRyZW4uCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHJlcGFyZW50X3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwKK3N0YXRpYyBpbnQgcmVwYXJlbnRfcmVzb3VyY2VzKHN0cnVjdCByZXNvdXJjZSAqcGFyZW50LAogCQkJCSAgICAgc3RydWN0IHJlc291cmNlICpyZXMpCiB7CiAJc3RydWN0IHJlc291cmNlICpwLCAqKnBwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggYmE5NDlhMi4uY2NmNTZhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC05Nyw3ICs5Nyw5IEBACiAJICogdG8gZG8gYW4gYXBwcm9wcmlhdGUgVExCIGZsdXNoIGhlcmUgdG9vCiAJICovCiAJaWYgKGJ1cy0+c2VsZikgeworI2lmZGVmIENPTkZJR19QUENfU1REX01NVV82NAogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGJ1cy0+cmVzb3VyY2VbMF07CisjZW5kaWYKIAogCQlwcl9kZWJ1ZygiSU8gdW5tYXBwaW5nIGZvciBQQ0ktUENJIGJyaWRnZSAlc1xuIiwKIAkJCSBwY2lfbmFtZShidXMtPnNlbGYpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggYmJjYmFlMS4uODdmMTY2MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTExNiwyMCArMTE2LDIzIEBACiBzdGF0aWMgaW5saW5lIHUzMiBwZXJmX2dldF9taXNjX2ZsYWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgbW1jcmEgPSByZWdzLT5kc2lzcjsKKwl1bnNpZ25lZCBsb25nIHNpaHYgPSBNTUNSQV9TSUhWOworCXVuc2lnbmVkIGxvbmcgc2lwciA9IE1NQ1JBX1NJUFI7CiAKIAlpZiAoVFJBUChyZWdzKSAhPSAweGYwMCkKIAkJcmV0dXJuIDA7CS8qIG5vdCBhIFBNVSBpbnRlcnJ1cHQgKi8KIAogCWlmIChwcG11LT5mbGFncyAmIFBQTVVfQUxUX1NJUFIpIHsKLQkJaWYgKG1tY3JhICYgUE9XRVI2X01NQ1JBX1NJSFYpCi0JCQlyZXR1cm4gUEVSRl9SRUNPUkRfTUlTQ19IWVBFUlZJU09SOwotCQlyZXR1cm4gKG1tY3JhICYgUE9XRVI2X01NQ1JBX1NJUFIpID8KLQkJCVBFUkZfUkVDT1JEX01JU0NfVVNFUiA6IFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMOworCQlzaWh2ID0gUE9XRVI2X01NQ1JBX1NJSFY7CisJCXNpcHIgPSBQT1dFUjZfTU1DUkFfU0lQUjsKIAl9Ci0JaWYgKG1tY3JhICYgTU1DUkFfU0lIVikKKworCS8qIFBSIGhhcyBwcmlvcml0eSBvdmVyIEhWLCBzbyBvcmRlciBiZWxvdyBpcyBpbXBvcnRhbnQgKi8KKwlpZiAobW1jcmEgJiBzaXByKQorCQlyZXR1cm4gUEVSRl9SRUNPUkRfTUlTQ19VU0VSOworCWlmICgobW1jcmEgJiBzaWh2KSAmJiAoZnJlZXplX2V2ZW50c19rZXJuZWwgIT0gTU1DUjBfRkNIVikpCiAJCXJldHVybiBQRVJGX1JFQ09SRF9NSVNDX0hZUEVSVklTT1I7Ci0JcmV0dXJuIChtbWNyYSAmIE1NQ1JBX1NJUFIpID8gUEVSRl9SRUNPUkRfTUlTQ19VU0VSIDoKLQkJUEVSRl9SRUNPUkRfTUlTQ19LRVJORUw7CisJcmV0dXJuIFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwppbmRleCAwYTMyMTY0Li5jOTMwYWMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTAxNiw5ICsxMDE2LDEzIEBACiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgogCWludCBjdXJyX2ZyYW1lID0gY3VycmVudC0+Y3Vycl9yZXRfc3RhY2s7CiAJZXh0ZXJuIHZvaWQgcmV0dXJuX3RvX2hhbmRsZXIodm9pZCk7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcmV0dXJuX3RvX2hhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBydGggPSAodW5zaWduZWQgbG9uZylyZXR1cm5fdG9faGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nIG1ydGggPSAtMTsKICNpZmRlZiBDT05GSUdfUFBDNjQKLQlhZGRyID0gKih1bnNpZ25lZCBsb25nKilhZGRyOworCWV4dGVybiB2b2lkIG1vZF9yZXR1cm5fdG9faGFuZGxlcih2b2lkKTsKKwlydGggPSAqKHVuc2lnbmVkIGxvbmcgKilydGg7CisJbXJ0aCA9ICh1bnNpZ25lZCBsb25nKW1vZF9yZXR1cm5fdG9faGFuZGxlcjsKKwltcnRoID0gKih1bnNpZ25lZCBsb25nICopbXJ0aDsKICNlbmRpZgogI2VuZGlmCiAKQEAgLTEwNDQsNyArMTA0OCw3IEBACiAJCWlmICghZmlyc3RmcmFtZSB8fCBpcCAhPSBscikgewogCQkJcHJpbnRrKCJbIlJFRyJdIFsiUkVHIl0gJXBTIiwgc3AsIGlwLCAodm9pZCAqKWlwKTsKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCi0JCQlpZiAoaXAgPT0gYWRkciAmJiBjdXJyX2ZyYW1lID49IDApIHsKKwkJCWlmICgoaXAgPT0gcnRoIHx8IGlwID09IG1ydGgpICYmIGN1cnJfZnJhbWUgPj0gMCkgewogCQkJCXByaW50aygiICglcFMpIiwKIAkJCQkgICAgICAgKHZvaWQgKiljdXJyZW50LT5yZXRfc3RhY2tbY3Vycl9mcmFtZV0ucmV0KTsKIAkJCQljdXJyX2ZyYW1lLS07CkBAIC0xMTY1LDcgKzExNjksMjIgQEAKIAogdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JdW5zaWduZWQgbG9uZyByZXQgPSBQQUdFX0FMSUdOKG1tLT5icmsgKyBicmtfcm5kKCkpOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IG1tLT5icms7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKyNpZmRlZiBDT05GSUdfUFBDX1NURF9NTVVfNjQKKwkvKgorCSAqIElmIHdlIGFyZSB1c2luZyAxVEIgc2VnbWVudHMgYW5kIHdlIGFyZSBhbGxvd2VkIHRvIHJhbmRvbWlzZQorCSAqIHRoZSBoZWFwLCB3ZSBjYW4gcHV0IGl0IGFib3ZlIDFUQiBzbyBpdCBpcyBiYWNrZWQgYnkgYSAxVEIKKwkgKiBzZWdtZW50LiBPdGhlcndpc2UgdGhlIGhlYXAgd2lsbCBiZSBpbiB0aGUgYm90dG9tIDFUQgorCSAqIHdoaWNoIGFsd2F5cyB1c2VzIDI1Nk1CIHNlZ21lbnRzIGFuZCB0aGlzIG1heSByZXN1bHQgaW4gYQorCSAqIHBlcmZvcm1hbmNlIHBlbmFsdHkuCisJICovCisJaWYgKCFpc18zMmJpdF90YXNrKCkgJiYgKG1tdV9oaWdodXNlcl9zc2l6ZSA9PSBNTVVfU0VHU0laRV8xVCkpCisJCWJhc2UgPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBtbS0+YnJrLCAxVUwgPDwgU0lEX1NISUZUXzFUKTsKKyNlbmRpZgorCisJcmV0ID0gUEFHRV9BTElHTihiYXNlICsgYnJrX3JuZCgpKTsKIAogCWlmIChyZXQgPCBtbS0+YnJrKQogCQlyZXR1cm4gbW0tPmJyazsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCmluZGV4IDg2NDMzNGIuLmJhZmFjMmU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKQEAgLTgwMCw3ICs4MDAsNyBAQAogCXJvb3QgPSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCBBRERSKCIvIikpOwogCWlmIChyb290ICE9IDApIHsKIAkJLyogdHJ5IGNhbGxpbmcgdGhlIGlibSxjbGllbnQtYXJjaGl0ZWN0dXJlLXN1cHBvcnQgbWV0aG9kICovCi0JCXByb21fcHJpbnRmKCJDYWxsaW5nIGlibSxjbGllbnQtYXJjaGl0ZWN0dXJlLi4uIik7CisJCXByb21fcHJpbnRmKCJDYWxsaW5nIGlibSxjbGllbnQtYXJjaGl0ZWN0dXJlLXN1cHBvcnQuLi4iKTsKIAkJaWYgKGNhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgMywgMiwgJnJldCwKIAkJCQkgIEFERFIoImlibSxjbGllbnQtYXJjaGl0ZWN0dXJlLXN1cHBvcnQiKSwKIAkJCQkgIHJvb3QsCkBAIC04MTQsNiArODE0LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCQljYWxsX3Byb20oImNsb3NlIiwgMSwgMCwgcm9vdCk7CisJCXByb21fcHJpbnRmKCIgbm90IGltcGxlbWVudGVkXG4iKTsKIAl9CiAKIAkvKiBubyBpYm0sY2xpZW50LWFyY2hpdGVjdHVyZS1zdXBwb3J0IGNhbGwsIHRyeSB0aGUgb2xkIHdheSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKaW5kZXggMWQ1NTcwYS4uNDI3MWY3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgpAQCAtNDMyLDkgKzQzMSw5IEBACiAJCWZvciAoaiA9IDA7IGogPCBudGhyZWFkcyAmJiBjcHUgPCBOUl9DUFVTOyBqKyspIHsKIAkJCURCRygiICAgIHRocmVhZCAlZCAtPiBjcHUgJWQgKGhhcmQgaWQgJWQpXG4iLAogCQkJICAgIGosIGNwdSwgaW50c2VydltqXSk7Ci0JCQljcHVfc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwkJCXNldF9jcHVfcHJlc2VudChjcHUsIHRydWUpOwogCQkJc2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUsIGludHNlcnZbal0pOwotCQkJY3B1X3NldChjcHUsIGNwdV9wb3NzaWJsZV9tYXApOworCQkJc2V0X2NwdV9wb3NzaWJsZShjcHUsIHRydWUpOwogCQkJY3B1Kys7CiAJCX0KIAl9CkBAIC00ODAsNyArNDc5LDcgQEAKIAkJCSAgICAgICBtYXhjcHVzKTsKIAogCQlmb3IgKGNwdSA9IDA7IGNwdSA8IG1heGNwdXM7IGNwdSsrKQotCQkJY3B1X3NldChjcHUsIGNwdV9wb3NzaWJsZV9tYXApOworCQkJc2V0X2NwdV9wb3NzaWJsZShjcHUsIHRydWUpOwogCW91dDoKIAkJb2Zfbm9kZV9wdXQoZG4pOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCA3OTdlYTk1Li4wNGY2MzhkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC01Nyw3ICs1Nyw2IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL21tdS1oYXNoNjQuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwppbmRleCBkMzg3YjM5Li45Yjg2YTc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKQEAgLTE4OSwxMSArMTg5LDExIEBACiAJc21wX29wcy0+bWVzc2FnZV9wYXNzKGNwdSwgUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFKTsKIH0KIAotdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGkoY3B1bWFza190IG1hc2spCit2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXVuc2lnbmVkIGludCBjcHU7CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIG1hc2spCisJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykKIAkJc21wX29wcy0+bWVzc2FnZV9wYXNzKGNwdSwgUFBDX01TR19DQUxMX0ZVTkNUSU9OKTsKIH0KIApAQCAtMjg3LDcgKzI4Nyw3IEBACiB7CiAJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBib290X2NwdWlkKTsKIAotCWNwdV9zZXQoYm9vdF9jcHVpZCwgY3B1X29ubGluZV9tYXApOworCXNldF9jcHVfb25saW5lKGJvb3RfY3B1aWQsIHRydWUpOwogCWNwdV9zZXQoYm9vdF9jcHVpZCwgcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGJvb3RfY3B1aWQpKTsKIAljcHVfc2V0KGJvb3RfY3B1aWQsIHBlcl9jcHUoY3B1X2NvcmVfbWFwLCBib290X2NwdWlkKSk7CiAjaWZkZWYgQ09ORklHX1BQQzY0CkBAIC0zMDcsNyArMzA3LDcgQEAKIAlpZiAoY3B1ID09IGJvb3RfY3B1aWQpCiAJCXJldHVybiAtRUJVU1k7CiAKLQljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CisJc2V0X2NwdV9vbmxpbmUoY3B1LCBmYWxzZSk7CiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJdmRzb19kYXRhLT5wcm9jZXNzb3JDb3VudC0tOwogCWZpeHVwX2lycXMoY3B1X29ubGluZV9tYXApOwpAQCAtMzYxLDcgKzM2MSw3IEBACiAJc21wX3dtYigpOwogCXdoaWxlIChfX2dldF9jcHVfdmFyKGNwdV9zdGF0ZSkgIT0gQ1BVX1VQX1BSRVBBUkUpCiAJCWNwdV9yZWxheCgpOwotCWNwdV9zZXQoY3B1LCBjcHVfb25saW5lX21hcCk7CisJc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAjZW5kaWYKQEAgLTUwOCw3ICs1MDgsNyBAQAogCiAJaXBpX2NhbGxfbG9jaygpOwogCW5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1KTsKLQljcHVfc2V0KGNwdSwgY3B1X29ubGluZV9tYXApOworCXNldF9jcHVfb25saW5lKGNwdSwgdHJ1ZSk7CiAJLyogVXBkYXRlIHNpYmxpbmcgbWFwcyAqLwogCWJhc2UgPSBjcHVfZmlyc3RfdGhyZWFkX2luX2NvcmUoY3B1KTsKIAlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkc19wZXJfY29yZTsgaSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYwppbmRleCAxY2M1ZTllLi5iOTdjMmQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzX3BwYzMyLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IDkyZGM4NDQuLmExMzZhMTFjNDkwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwpAQCAtNzc3LDcgKzc3Nyw3IEBACiAJcmV0dXJuIHBwY19tZC5zZXRfcnRjX3RpbWUoJnRtKTsKIH0KIAotdm9pZCByZWFkX3BlcnNpc3RlbnRfY2xvY2soc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyB2b2lkIF9fcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHN0cnVjdCB0aW1lc3BlYyAqdHMpCiB7CiAJc3RydWN0IHJ0Y190aW1lIHRtOwogCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwpAQCAtODAwLDEwICs4MDAsMjMgQEAKIAkJcmV0dXJuOwogCX0KIAlwcGNfbWQuZ2V0X3J0Y190aW1lKCZ0bSk7CisKIAl0cy0+dHZfc2VjID0gbWt0aW1lKHRtLnRtX3llYXIrMTkwMCwgdG0udG1fbW9uKzEsIHRtLnRtX21kYXksCiAJCQkgICAgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOwogfQogCit2b2lkIHJlYWRfcGVyc2lzdGVudF9jbG9jayhzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCV9fcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHRzKTsKKworCS8qIFNhbml0aXplIGl0IGluIGNhc2UgcmVhbCB0aW1lIGNsb2NrIGlzIHNldCBiZWxvdyBFUE9DSCAqLworCWlmICh0cy0+dHZfc2VjIDwgMCkgeworCQl0cy0+dHZfc2VjID0gMDsKKwkJdHMtPnR2X25zZWMgPSAwOworCX0KKwkJCit9CisKIC8qIGNsb2Nrc291cmNlIGNvZGUgKi8KIHN0YXRpYyBjeWNsZV90IHJ0Y19yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCmluZGV4IGEwYWJjZTIuLjEzN2RjMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCkBAIC0xLDMgKzEsNCBAQAorCiAvKgogICogICAgQ29weXJpZ2h0IChDKSAyMDA0IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgogICoJCQkgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KQEAgLTQ5LDYgKzUwLDkgQEAKIC8qIE1heCBzdXBwb3J0ZWQgc2l6ZSBmb3Igc3ltYm9sIG5hbWVzICovCiAjZGVmaW5lIE1BWF9TWU1OQU1FCTY0CiAKKy8qIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHZEU08gKi8KKyNkZWZpbmUgVkRTT19BTElHTk1FTlQJKDEgPDwgMTYpCisKIGV4dGVybiBjaGFyIHZkc28zMl9zdGFydCwgdmRzbzMyX2VuZDsKIHN0YXRpYyB2b2lkICp2ZHNvMzJfa2Jhc2UgPSAmdmRzbzMyX3N0YXJ0Owogc3RhdGljIHVuc2lnbmVkIGludCB2ZHNvMzJfcGFnZXM7CkBAIC03NCw3ICs3OCw3IEBACiBzdGF0aWMgdW5pb24gewogCXN0cnVjdCB2ZHNvX2RhdGEJZGF0YTsKIAl1OAkJCXBhZ2VbUEFHRV9TSVpFXTsKLX0gdmRzb19kYXRhX3N0b3JlIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5wYWdlX2FsaWduZWQiKSkpOworfSB2ZHNvX2RhdGFfc3RvcmUgX19wYWdlX2FsaWduZWRfZGF0YTsKIHN0cnVjdCB2ZHNvX2RhdGEgKnZkc29fZGF0YSA9ICZ2ZHNvX2RhdGFfc3RvcmUuZGF0YTsKIAogLyogRm9ybWF0IG9mIHRoZSBwYXRjaCB0YWJsZSAqLwpAQCAtMjMwLDE1ICsyMzQsMjggQEAKIAkgKiBwaWNrIGEgYmFzZSBhZGRyZXNzIGZvciB0aGUgdkRTTyBpbiBwcm9jZXNzIHNwYWNlLiBXZSB0cnkgdG8gcHV0IGl0CiAJICogYXQgdmRzb19iYXNlIHdoaWNoIGlzIHRoZSAibmF0dXJhbCIgYmFzZSBmb3IgaXQsIGJ1dCB3ZSBtaWdodCBmYWlsCiAJICogYW5kIGVuZCB1cCBwdXR0aW5nIGl0IGVsc2V3aGVyZS4KKwkgKiBBZGQgZW5vdWdoIHRvIHRoZSBzaXplIHNvIHRoYXQgdGhlIHJlc3VsdCBjYW4gYmUgYWxpZ25lZC4KIAkgKi8KIAlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXZkc29fYmFzZSA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIHZkc29fYmFzZSwKLQkJCQkgICAgICB2ZHNvX3BhZ2VzIDw8IFBBR0VfU0hJRlQsIDAsIDApOworCQkJCSAgICAgICh2ZHNvX3BhZ2VzIDw8IFBBR0VfU0hJRlQpICsKKwkJCQkgICAgICAoKFZEU09fQUxJR05NRU5UIC0gMSkgJiBQQUdFX01BU0spLAorCQkJCSAgICAgIDAsIDApOwogCWlmIChJU19FUlJfVkFMVUUodmRzb19iYXNlKSkgewogCQlyYyA9IHZkc29fYmFzZTsKIAkJZ290byBmYWlsX21tYXBzZW07CiAJfQogCisJLyogQWRkIHJlcXVpcmVkIGFsaWdubWVudC4gKi8KKwl2ZHNvX2Jhc2UgPSBBTElHTih2ZHNvX2Jhc2UsIFZEU09fQUxJR05NRU5UKTsKKworCS8qCisJICogUHV0IHZEU08gYmFzZSBpbnRvIG1tIHN0cnVjdC4gV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSBjYWxsaW5nCisJICogaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcgb3IgdGhlIHBlcmYgY291bnRlciBtbWFwIHRyYWNraW5nIGNvZGUKKwkgKiB3aWxsIGZhaWwgdG8gcmVjb2duaXNlIGl0IGFzIGEgdkRTTyAoc2luY2UgYXJjaF92bWFfbmFtZSBmYWlscykuCisJICovCisJY3VycmVudC0+bW0tPmNvbnRleHQudmRzb19iYXNlID0gdmRzb19iYXNlOworCiAJLyoKIAkgKiBvdXIgdm1hIGZsYWdzIGRvbid0IGhhdmUgVk1fV1JJVEUgc28gYnkgZGVmYXVsdCwgdGhlIHByb2Nlc3MgaXNuJ3QKIAkgKiBhbGxvd2VkIHRvIHdyaXRlIHRob3NlIHBhZ2VzLgpAQCAtMjU5LDExICsyNzYsMTAgQEAKIAkJCQkgICAgIFZNX01BWVJFQUR8Vk1fTUFZV1JJVEV8Vk1fTUFZRVhFQ3wKIAkJCQkgICAgIFZNX0FMV0FZU0RVTVAsCiAJCQkJICAgICB2ZHNvX3BhZ2VsaXN0KTsKLQlpZiAocmMpCisJaWYgKHJjKSB7CisJCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSA9IDA7CiAJCWdvdG8gZmFpbF9tbWFwc2VtOwotCi0JLyogUHV0IHZEU08gYmFzZSBpbnRvIG1tIHN0cnVjdCAqLwotCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSA9IHZkc29fYmFzZTsKKwl9CiAKIAl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKaW5kZXggYjU0YjgxNi4uNTFlYWQ1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKQEAgLTE2LDcgKzE2LDcgQEAKIAogRVhUUkFfQ0ZMQUdTIDo9IC1zaGFyZWQgLWZuby1jb21tb24gLWZuby1idWlsdGluCiBFWFRSQV9DRkxBR1MgKz0gLW5vc3RkbGliIC1XbCwtc29uYW1lPWxpbnV4LXZkc28zMi5zby4xIFwKLQkJJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKKwkJJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1zeXN2KQogRVhUUkFfQUZMQUdTIDo9IC1EX19WRFNPMzJfXyAtcwogCiBvYmoteSArPSB2ZHNvMzJfd3JhcHBlci5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi92ZHNvMzIubGRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi92ZHNvMzIubGRzLlMKaW5kZXggOTA0ZWYxMy4uMDU0NmJjZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvdmRzbzMyLmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL3Zkc28zMi5sZHMuUwpAQCAtMjUsNyArMjUsNyBAQAogCS4gPSBBTElHTigxNik7CiAJLnRleHQJCTogewogCQkqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiogX19mdHJfYWx0XyopCi0JfQorCX0JCSAgICAgIAkgICAgICAJCQk6dGV4dAogCVBST1ZJREUoX19ldGV4dCA9IC4pOwogCVBST1ZJREUoX2V0ZXh0ID0gLik7CiAJUFJPVklERShldGV4dCA9IC4pOwpAQCAtNTYsNyArNTYsNyBAQAogCS5maXh1cAkJOiB7ICooLmZpeHVwKSB9CiAKIAkuZHluYW1pYwk6IHsgKiguZHluYW1pYykgfQkJOnRleHQJOmR5bmFtaWMKLQkuZ290CQk6IHsgKiguZ290KSB9CisJLmdvdAkJOiB7ICooLmdvdCkgfQkJCTp0ZXh0CiAJLnBsdAkJOiB7ICooLnBsdCkgfQogCiAJX2VuZCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi92ZHNvMzJfd3JhcHBlci5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvdmRzbzMyX3dyYXBwZXIuUwppbmRleCA1NTZmMGNhLi42ZThmNTA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi92ZHNvMzJfd3JhcHBlci5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL3Zkc28zMl93cmFwcGVyLlMKQEAgLTEsNyArMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi0JLnNlY3Rpb24gIi5kYXRhLnBhZ2VfYWxpZ25lZCIKKwlfX1BBR0VfQUxJR05FRF9EQVRBCiAKIAkuZ2xvYmwgdmRzbzMyX3N0YXJ0LCB2ZHNvMzJfZW5kCiAJLmJhbGlnbiBQQUdFX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUKaW5kZXggZGQwYzhlOS4uNzlkYTY1ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUKQEAgLTExLDcgKzExLDcgQEAKIAogRVhUUkFfQ0ZMQUdTIDo9IC1zaGFyZWQgLWZuby1jb21tb24gLWZuby1idWlsdGluCiBFWFRSQV9DRkxBR1MgKz0gLW5vc3RkbGliIC1XbCwtc29uYW1lPWxpbnV4LXZkc282NC5zby4xIFwKLQkJJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKKwkJJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1zeXN2KQogRVhUUkFfQUZMQUdTIDo9IC1EX19WRFNPNjRfXyAtcwogCiBvYmoteSArPSB2ZHNvNjRfd3JhcHBlci5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC92ZHNvNjRfd3JhcHBlci5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvdmRzbzY0X3dyYXBwZXIuUwppbmRleCAwNTI5Y2I5Li5iODU1M2Q2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC92ZHNvNjRfd3JhcHBlci5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L3Zkc282NF93cmFwcGVyLlMKQEAgLTEsNyArMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi0JLnNlY3Rpb24gIi5kYXRhLnBhZ2VfYWxpZ25lZCIKKwlfX1BBR0VfQUxJR05FRF9EQVRBCiAKIAkuZ2xvYmwgdmRzbzY0X3N0YXJ0LCB2ZHNvNjRfZW5kCiAJLmJhbGlnbiBQQUdFX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCmluZGV4IGJjN2I0MWUuLjc3ZjY0MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwpAQCAtMTA1NCw2ICsxMDU0LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAl0YmwgPSBrbWFsbG9jKHNpemVvZigqdGJsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRibCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKIAogCW9mX3BhcnNlX2RtYV93aW5kb3coZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSwgZG1hX3dpbmRvdywKIAkJCSAgICAmdGJsLT5pdF9pbmRleCwgJm9mZnNldCwgJnNpemUpOwpAQCAtMTIzMyw3ICsxMjM1LDcgQEAKIAkJdmlvX2Ntb19zZXRfZG1hX29wcyh2aW9kZXYpOwogCWVsc2UKIAkJdmlvZGV2LT5kZXYuYXJjaGRhdGEuZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOwotCXZpb2Rldi0+ZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0gdmlvX2J1aWxkX2lvbW11X3RhYmxlKHZpb2Rldik7CisJc2V0X2lvbW11X3RhYmxlX2Jhc2UoJnZpb2Rldi0+ZGV2LCB2aW9fYnVpbGRfaW9tbXVfdGFibGUodmlvZGV2KSk7CiAJc2V0X2Rldl9ub2RlKCZ2aW9kZXYtPmRldiwgb2Zfbm9kZV90b19uaWQob2Zfbm9kZSkpOwogCiAJLyogaW5pdCBnZW5lcmljICdzdHJ1Y3QgZGV2aWNlJyBmaWVsZHM6ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNThkYTQwNy4uMjc3MzVhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAKIEVOVFJZKF9zdGV4dCkKIApAQCAtNzEsMTIgKzcyLDcgQEAKIAkvKiBSZWFkLW9ubHkgZGF0YSAqLwogCVJPREFUQQogCi0JLyogRXhjZXB0aW9uICYgYnVnIHRhYmxlcyAqLwotCV9fZXhfdGFibGUgOiBBVChBRERSKF9fZXhfdGFibGUpIC0gTE9BRF9PRkZTRVQpIHsKLQkJX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLQkJKihfX2V4X3RhYmxlKQotCQlfX3N0b3BfX19leF90YWJsZSA9IC47Ci0JfQorCUVYQ0VQVElPTl9UQUJMRSgwKQogCiAJTk9URVMgOmtlcm5lbCA6bm90ZXMKIApAQCAtOTMsMTIgKzg5LDcgQEAKICAqLwogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCV9faW5pdF9iZWdpbiA9IC47Ci0KLQkuaW5pdC50ZXh0IDogQVQoQUREUiguaW5pdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0JCV9zaW5pdHRleHQgPSAuOwotCQlJTklUX1RFWFQKLQkJX2Vpbml0dGV4dCA9IC47Ci0JfSA6a2VybmVsCisJSU5JVF9URVhUX1NFQ1RJT04oUEFHRV9TSVpFKSA6a2VybmVsCiAKIAkvKiAuZXhpdC50ZXh0IGlzIGRpc2NhcmRlZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLAogCSAqIHRvIGRlYWwgd2l0aCByZWZlcmVuY2VzIGZyb20gX19idWdfdGFibGUKQEAgLTEyMiwyMyArMTEzLDE2IEBACiAjZW5kaWYKIAl9CiAKLQkuID0gQUxJR04oMTYpOwogCS5pbml0LnNldHVwIDogQVQoQUREUiguaW5pdC5zZXR1cCkgLSBMT0FEX09GRlNFVCkgewotCQlfX3NldHVwX3N0YXJ0ID0gLjsKLQkJKiguaW5pdC5zZXR1cCkKLQkJX19zZXR1cF9lbmQgPSAuOworCQlJTklUX1NFVFVQKDE2KQogCX0KIAogCS5pbml0Y2FsbC5pbml0IDogQVQoQUREUiguaW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgewotCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJSU5JVENBTExTCi0JCV9faW5pdGNhbGxfZW5kID0gLjsKLQkJfQorCQlJTklUX0NBTExTCisJfQogCiAJLmNvbl9pbml0Y2FsbC5pbml0IDogQVQoQUREUiguY29uX2luaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpIHsKLQkJX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotCQkqKC5jb25faW5pdGNhbGwuaW5pdCkKLQkJX19jb25faW5pdGNhbGxfZW5kID0gLjsKKwkJQ09OX0lOSVRDQUxMCiAJfQogCiAJU0VDVVJJVFlfSU5JVApAQCAtMTY5LDE0ICsxNTMsMTAgQEAKIAkJX19zdG9wX19fZndfZnRyX2ZpeHVwID0gLjsKIAl9CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAkuaW5pdC5yYW1mcyA6IEFUKEFERFIoLmluaXQucmFtZnMpIC0gTE9BRF9PRkZTRVQpIHsKLQkJX19pbml0cmFtZnNfc3RhcnQgPSAuOwotCQkqKC5pbml0LnJhbWZzKQotCQlfX2luaXRyYW1mc19lbmQgPSAuOworCQlJTklUX1JBTV9GUwogCX0KLSNlbmRpZgorCiAJUEVSQ1BVKFBBR0VfU0laRSkKIAogCS4gPSBBTElHTig4KTsKQEAgLTI0MCwzNiArMjIwLDI1IEBACiAjZW5kaWYKIAogCS8qIFRoZSBpbml0aWFsIHRhc2sgYW5kIGtlcm5lbCBzdGFjayAqLwotI2lmZGVmIENPTkZJR19QUEMzMgotCS4gPSBBTElHTig4MTkyKTsKLSNlbHNlCi0JLiA9IEFMSUdOKDE2Mzg0KTsKLSNlbmRpZgogCS5kYXRhLmluaXRfdGFzayA6IEFUKEFERFIoLmRhdGEuaW5pdF90YXNrKSAtIExPQURfT0ZGU0VUKSB7Ci0JCSooLmRhdGEuaW5pdF90YXNrKQorCQlJTklUX1RBU0tfREFUQShUSFJFQURfU0laRSkKIAl9CiAKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAkuZGF0YS5wYWdlX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLnBhZ2VfYWxpZ25lZCkgLSBMT0FEX09GRlNFVCkgewotCQkqKC5kYXRhLnBhZ2VfYWxpZ25lZCkKKwkJUEFHRV9BTElHTkVEX0RBVEEoUEFHRV9TSVpFKQogCX0KIAotCS4gPSBBTElHTihMMV9DQUNIRV9CWVRFUyk7CiAJLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7Ci0JCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCisJCUNBQ0hFTElORV9BTElHTkVEX0RBVEEoTDFfQ0FDSEVfQllURVMpCiAJfQogCi0JLiA9IEFMSUdOKEwxX0NBQ0hFX0JZVEVTKTsKIAkuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsKLQkJKiguZGF0YS5yZWFkX21vc3RseSkKKwkJUkVBRF9NT1NUTFlfREFUQShMMV9DQUNIRV9CWVRFUykKIAl9CiAKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAkuZGF0YV9ub3NhdmUgOiBBVChBRERSKC5kYXRhX25vc2F2ZSkgLSBMT0FEX09GRlNFVCkgewotCQlfX25vc2F2ZV9iZWdpbiA9IC47Ci0JCSooLmRhdGEubm9zYXZlKQotCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQkJX19ub3NhdmVfZW5kID0gLjsKKwkJTk9TQVZFX0RBVEEKIAl9CiAKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKQEAgLTI4MCwxNCArMjQ5LDcgQEAKICAqIEFuZCBmaW5hbGx5IHRoZSBic3MKICAqLwogCi0JLmJzcyA6IEFUKEFERFIoLmJzcykgLSBMT0FEX09GRlNFVCkgewotCQlfX2Jzc19zdGFydCA9IC47Ci0JCSooLnNic3MpICooLnNjb21tb24pCi0JCSooLmR5bmJzcykKLQkJKiguYnNzKQotCQkqKENPTU1PTikKLQkJX19ic3Nfc3RvcCA9IC47Ci0JfQorCUJTU19TRUNUSU9OKDAsIDAsIDApCiAKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfZW5kID0gLiA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL3RpbWluZy5jIGIvYXJjaC9wb3dlcnBjL2t2bS90aW1pbmcuYwppbmRleCA0N2VlNjAzLi4yYWEzNzFlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL3RpbWluZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vdGltaW5nLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBrdm1wcGNfZXhpdF90aW1pbmdfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGt2bXBwY19leGl0X3RpbWluZ19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga3ZtcHBjX2V4aXRfdGltaW5nX2ZvcHMgPSB7CiAJLm93bmVyICAgPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICA9IGt2bXBwY19leGl0X3RpbWluZ19vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL3RpbWluZy5oIGIvYXJjaC9wb3dlcnBjL2t2bS90aW1pbmcuaAppbmRleCBiYjEzYjFmLi44MDZlZjY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL3RpbWluZy5oCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vdGltaW5nLmgKQEAgLTQ4LDcgKzQ4LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX2FjY291bnRfZXhpdF9zdGF0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHR5cGUpCiB7CiAJLyogdHlwZSBoYXMgdG8gYmUga25vd24gYXQgYnVpbGQgdGltZSBmb3Igb3B0aW1pemF0aW9uICovCisKKwkvKiBUaGUgQlVJTERfQlVHX09OIGJlbG93IGJyZWFrcyBpbiBmdW5ueSB3YXlzLCBjb21tZW50ZWQgb3V0CisJICogZm9yIG5vdyAuLi4gLUJlbkgKIAlCVUlMRF9CVUdfT04oX19idWlsdGluX2NvbnN0YW50X3AodHlwZSkpOworCSovCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBFWFRfSU5UUl9FWElUUzoKIAkJdmNwdS0+c3RhdC5leHRfaW50cl9leGl0cysrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jCmluZGV4IGMyZjkzZGMuLmJlNGYzNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMKQEAgLTI1LDggKzI1LDggQEAKICAqICAgICBhbHNvIGNsZWFyIG1tLT5jcHVfdm1fbWFzayBiaXRzIHdoZW4gcHJvY2Vzc2VzIGFyZSBtaWdyYXRlZAogICovCiAKLSNkZWZpbmUgREVCVUdfTUFQX0NPTlNJU1RFTkNZCi0jZGVmaW5lIERFQlVHX0NMQU1QX0xBU1RfQ09OVEVYVCAgIDMxCisvLyNkZWZpbmUgREVCVUdfTUFQX0NPTlNJU1RFTkNZCisvLyNkZWZpbmUgREVCVUdfQ0xBTVBfTEFTVF9DT05URVhUICAgMzEKIC8vI2RlZmluZSBERUJVR19IQVJERVIKIAogLyogV2UgZG9uJ3QgdXNlIERFQlVHIGJlY2F1c2UgaXQgdGVuZHMgdG8gYmUgY29tcGlsZWQgaW4gYWx3YXlzIG5vd2FkYXlzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYwppbmRleCA4M2YxNTUxLi41MzA0MDkzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLmMKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CiAKKyNpbmNsdWRlICJtbXVfZGVjbC5oIgorCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOwogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMTY2LDcgKzE2OCw3IEBACiAgKiBzdXBwb3J0IGZhbGxzIGludG8gdGhlIHNhbWUgY2F0ZWdvcnkuCiAgKi8KIAotc3RhdGljIHB0ZV90IHNldF9wdGVfZmlsdGVyKHB0ZV90IHB0ZSkKK3N0YXRpYyBwdGVfdCBzZXRfcHRlX2ZpbHRlcihwdGVfdCBwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlwdGUgPSBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfSFBURUZMQUdTKTsKIAlpZiAocHRlX2xvb2tzX25vcm1hbChwdGUpICYmICEoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKSB8fApAQCAtMTc1LDYgKzE3NywxNyBAQAogCQlpZiAoIXBnKQogCQkJcmV0dXJuIHB0ZTsKIAkJaWYgKCF0ZXN0X2JpdChQR19hcmNoXzEsICZwZy0+ZmxhZ3MpKSB7CisjaWZkZWYgQ09ORklHXzh4eAorCQkJLyogT24gOHh4LCBjYWNoZSBjb250cm9sIGluc3RydWN0aW9ucyAocGFydGljdWxhcmx5CisJCQkgKiAiZGNic3QiIGZyb20gZmx1c2hfZGNhY2hlX2ljYWNoZSkgZmF1bHQgYXMgd3JpdGUKKwkJCSAqIG9wZXJhdGlvbiBpZiB0aGVyZSBpcyBhbiB1bnBvcHVsYXRlZCBUTEIgZW50cnkKKwkJCSAqIGZvciB0aGUgYWRkcmVzcyBpbiBxdWVzdGlvbi4gVG8gd29ya2Fyb3VuZCB0aGF0LAorCQkJICogd2UgaW52YWxpZGF0ZSB0aGUgVExCIGhlcmUsIHRodXMgYXZvaWRpbmcgZGNic3QKKwkJCSAqIG1pc2JlaGF2aW91ci4KKwkJCSAqLworCQkJLyogOHh4IGRvZXNuJ3QgY2FyZSBhYm91dCBQSUQsIHNpemUgb3IgaW5kIGFyZ3MgKi8KKwkJCV90bGJpbF92YShhZGRyLCAwLCAwLCAwKTsKKyNlbmRpZiAvKiBDT05GSUdfOHh4ICovCiAJCQlmbHVzaF9kY2FjaGVfaWNhY2hlX3BhZ2UocGcpOwogCQkJc2V0X2JpdChQR19hcmNoXzEsICZwZy0+ZmxhZ3MpOwogCQl9CkBAIC0xOTQsNyArMjA3LDcgQEAKICAqIGFzIHdlIGRvbid0IGhhdmUgdHdvIGJpdHMgdG8gc3BhcmUgZm9yIF9QQUdFX0VYRUMgYW5kIF9QQUdFX0hXRVhFQyBzbwogICogaW5zdGVhZCB3ZSAiZmlsdGVyIG91dCIgdGhlIGV4ZWMgcGVybWlzc2lvbiBmb3Igbm9uIGNsZWFuIHBhZ2VzLgogICovCi1zdGF0aWMgcHRlX3Qgc2V0X3B0ZV9maWx0ZXIocHRlX3QgcHRlKQorc3RhdGljIHB0ZV90IHNldF9wdGVfZmlsdGVyKHB0ZV90IHB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCBwYWdlICpwZzsKIApAQCAtMjc2LDcgKzI4OSw3IEBACiAJICogdGhpcyBjb250ZXh0IG1pZ2h0IG5vdCBoYXZlIGJlZW4gYWN0aXZhdGVkIHlldCB3aGVuIHRoaXMKIAkgKiBpcyBjYWxsZWQuCiAJICovCi0JcHRlID0gc2V0X3B0ZV9maWx0ZXIocHRlKTsKKwlwdGUgPSBzZXRfcHRlX2ZpbHRlcihwdGUsIGFkZHIpOwogCiAJLyogUGVyZm9ybSB0aGUgc2V0dGluZyBvZiB0aGUgUFRFICovCiAJX19zZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGVwLCBwdGUsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3NsYl9sb3cuUyBiL2FyY2gvcG93ZXJwYy9tbS9zbGJfbG93LlMKaW5kZXggYmM0NGRjNC4uOTVjZTM1NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3NsYl9sb3cuUworKysgYi9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TCkBAIC03MiwxOSArNzIsMTcgQEAKIDE6CiAjZW5kaWYgLyogQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQICovCiAKLQkvKiB2bWFsbG9jL2lvcmVtYXAgbWFwcGluZyBlbmNvZGluZyBiaXRzLCB0aGUgImxpIiBpbnN0cnVjdGlvbnMgYmVsb3cKLQkgKiB3aWxsIGJlIHBhdGNoZWQgYnkgdGhlIGtlcm5lbCBhdCBib290CisJLyogdm1hbGxvYyBtYXBwaW5nIGdldHMgdGhlIGVuY29kaW5nIGZyb20gdGhlIFBBQ0EgYXMgdGhlIG1hcHBpbmcKKwkgKiBjYW4gYmUgZGVtb3RlZCBmcm9tIDY0SyAtPiA0SyBkeW5hbWljYWxseSBvbiBzb21lIG1hY2hpbmVzCiAJICovCi1CRUdJTl9GVFJfU0VDVElPTgotCS8qIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBpbiB2bWFsbG9jIG9yIGlvcmVtYXAgc3BhY2UgKi8KIAljbHJsZGkJcjExLHIxMCw0OAogCWNtcGxkaQlyMTEsKFZNQUxMT0NfU0laRSA+PiAyOCkgLSAxCiAJYmd0CTVmCiAJbGh6CXIxMSxQQUNBVk1BTExPQ1NMTFAocjEzKQogCWIJNmYKIDU6Ci1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFKQotX0dMT0JBTChzbGJfbWlzc19rZXJuZWxfbG9hZF9pbykKKwkvKiBJTyBtYXBwaW5nICovCisJX0dMT0JBTChzbGJfbWlzc19rZXJuZWxfbG9hZF9pbykKIAlsaQlyMTEsMAogNjoKIEJFR0lOX0ZUUl9TRUNUSU9OCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCmluZGV4IGVmMWNjY2YuLmYyODgyNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi02NGUuaD4KICNpbmNsdWRlIDxhc20vcHBjLW9wY29kZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCmluZGV4IGMzMWU1YjUuLmQ0NWJlNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCkBAIC01MSw2ICs1MSw4IEBACiAvKiBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgYm9hcmRzICovCiBzdGF0aWMgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0gewogCSJpbnRlcmNvbnRyb2wsZGlnc3ktbXRjIiwKKwkibWFucm9sYW5kLG11Y21jNTIiLAorCSJtYW5yb2xhbmQsdWMxMDEiLAogCSJwaHl0ZWMscGNtMDMwIiwKIAkicGh5dGVjLHBjbTAzMiIsCiAJInByb21lc3MsbW90aW9ucHJvIiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2F4b25fbXNpLmMKaW5kZXggYWNhNTc0MS4uYTg2YzM0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2F4b25fbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2F4b25fbXNpLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJheG9uX21zaTogY291bGRuJ3QgcGFyc2UgZGNyIHByb3BlcnRpZXMgb24gJXNcbiIsCiAJCQlkbi0+ZnVsbF9uYW1lKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2ZyZWVfbXNpYzsKIAl9CiAKIAltc2ljLT5kY3JfaG9zdCA9IGRjcl9tYXAoZG4sIGRjcl9iYXNlLCBkY3JfbGVuKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9pb21tdS5jCmluZGV4IDkzYjBlZmQuLjM5ZDM2MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW9tbXUuYwpAQCAtNzcsNyArNzcsNyBAQAogc3RhdGljIHZvaWQgY2VsbGViX2RtYV9kZXZfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQogewogCWRldi0+YXJjaGRhdGEuZG1hX29wcyA9IGdldF9wY2lfZG1hX29wcygpOwotCWRldi0+YXJjaGRhdGEuZG1hX2RhdGEgPSAodm9pZCAqKWNlbGxlYl9kbWFfZGlyZWN0X29mZnNldDsKKwlzZXRfZG1hX29mZnNldChkZXYsIGNlbGxlYl9kbWFfZGlyZWN0X29mZnNldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNlbGxlYl9wY2lfZG1hX2Rldl9zZXR1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKaW5kZXggNDE2ZGIxNy4uY2E1YmZkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKQEAgLTY1NywxNSArNjU3LDEzIEBACiAKIHN0YXRpYyB2b2lkIGNlbGxfZG1hX2Rldl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRldl9hcmNoZGF0YSAqYXJjaGRhdGEgPSAmZGV2LT5hcmNoZGF0YTsKLQogCS8qIE9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCB0aGVzZSBhcmUgbm90IG11dHVhbGx5IGV4Y2x1c2l2ZSAqLwogCWlmIChnZXRfZG1hX29wcyhkZXYpID09ICZkbWFfaW9tbXVfZml4ZWRfb3BzKQogCQljZWxsX2RtYV9kZXZfc2V0dXBfZml4ZWQoZGV2KTsKIAllbHNlIGlmIChnZXRfcGNpX2RtYV9vcHMoKSA9PSAmZG1hX2lvbW11X29wcykKLQkJYXJjaGRhdGEtPmRtYV9kYXRhID0gY2VsbF9nZXRfaW9tbXVfdGFibGUoZGV2KTsKKwkJc2V0X2lvbW11X3RhYmxlX2Jhc2UoZGV2LCBjZWxsX2dldF9pb21tdV90YWJsZShkZXYpKTsKIAllbHNlIGlmIChnZXRfcGNpX2RtYV9vcHMoKSA9PSAmZG1hX2RpcmVjdF9vcHMpCi0JCWFyY2hkYXRhLT5kbWFfZGF0YSA9ICh2b2lkICopY2VsbF9kbWFfZGlyZWN0X29mZnNldDsKKwkJc2V0X2RtYV9vZmZzZXQoZGV2LCBjZWxsX2RtYV9kaXJlY3Rfb2Zmc2V0KTsKIAllbHNlCiAJCUJVRygpOwogfQpAQCAtOTczLDExICs5NzEsMTAgQEAKIAogc3RhdGljIHZvaWQgY2VsbF9kbWFfZGV2X3NldHVwX2ZpeGVkKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZGV2X2FyY2hkYXRhICphcmNoZGF0YSA9ICZkZXYtPmFyY2hkYXRhOwogCXU2NCBhZGRyOwogCiAJYWRkciA9IGNlbGxfaW9tbXVfZ2V0X2ZpeGVkX2FkZHJlc3MoZGV2KSArIGRtYV9pb21tdV9maXhlZF9iYXNlOwotCWFyY2hkYXRhLT5kbWFfZGF0YSA9ICh2b2lkICopYWRkcjsKKwlzZXRfZG1hX29mZnNldChkZXYsIGFkZHIpOwogCiAJZGV2X2RiZyhkZXYsICJpb21tdTogZml4ZWQgYWRkciA9ICVsbHhcbiIsIGFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKaW5kZXggOGYwNzliOC4uODg0ZThiYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAlfX3NpbXBsZV9hdHRyX2NoZWNrX2Zvcm1hdChfX2ZtdCwgMHVsbCk7CQkJXAogCXJldHVybiBzcHVmc19hdHRyX29wZW4oaW5vZGUsIGZpbGUsIF9fZ2V0LCBfX3NldCwgX19mbXQpOwlcCiB9CQkJCQkJCQkJXAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgX19mb3BzID0gewkJCQlcCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBfX2ZvcHMgPSB7CQkJCVwKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCQkJCQkJXAogCS5vcGVuCSA9IF9fZm9wcyAjIyBfb3BlbiwJCQkJCVwKIAkucmVsZWFzZSA9IHNwdWZzX2F0dHJfcmVsZWFzZSwJCQkJCVwKQEAgLTMwOSw3ICszMDksNyBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3B1ZnNfbWVtX21tYXBfdm1vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNwdWZzX21lbV9tbWFwX3Ztb3BzID0gewogCS5mYXVsdCA9IHNwdWZzX21lbV9tbWFwX2ZhdWx0LAogCS5hY2Nlc3MgPSBzcHVmc19tZW1fbW1hcF9hY2Nlc3MsCiB9OwpAQCAtNDM2LDcgKzQzNiw3IEBACiAJcmV0dXJuIHNwdWZzX3BzX2ZhdWx0KHZtYSwgdm1mLCAweDQwMDAsIFNQVUZTX0NOVExfTUFQX1NJWkUpOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNwdWZzX2NudGxfbW1hcF92bW9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3B1ZnNfY250bF9tbWFwX3Ztb3BzID0gewogCS5mYXVsdCA9IHNwdWZzX2NudGxfbW1hcF9mYXVsdCwKIH07CiAKQEAgLTExNDMsNyArMTE0Myw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzcHVmc19zaWduYWwxX21tYXBfdm1vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNwdWZzX3NpZ25hbDFfbW1hcF92bW9wcyA9IHsKIAkuZmF1bHQgPSBzcHVmc19zaWduYWwxX21tYXBfZmF1bHQsCiB9OwogCkBAIC0xMjc5LDcgKzEyNzksNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3B1ZnNfc2lnbmFsMl9tbWFwX3Ztb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzcHVmc19zaWduYWwyX21tYXBfdm1vcHMgPSB7CiAJLmZhdWx0ID0gc3B1ZnNfc2lnbmFsMl9tbWFwX2ZhdWx0LAogfTsKIApAQCAtMTM5Nyw3ICsxMzk3LDcgQEAKIAlyZXR1cm4gc3B1ZnNfcHNfZmF1bHQodm1hLCB2bWYsIDB4MDAwMCwgU1BVRlNfTVNTX01BUF9TSVpFKTsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzcHVmc19tc3NfbW1hcF92bW9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3B1ZnNfbXNzX21tYXBfdm1vcHMgPSB7CiAJLmZhdWx0ID0gc3B1ZnNfbXNzX21tYXBfZmF1bHQsCiB9OwogCkBAIC0xNDU4LDcgKzE0NTgsNyBAQAogCXJldHVybiBzcHVmc19wc19mYXVsdCh2bWEsIHZtZiwgMHgwMDAwLCBTUFVGU19QU19NQVBfU0laRSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3B1ZnNfcHNtYXBfbW1hcF92bW9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3B1ZnNfcHNtYXBfbW1hcF92bW9wcyA9IHsKIAkuZmF1bHQgPSBzcHVmc19wc21hcF9tbWFwX2ZhdWx0LAogfTsKIApAQCAtMTUxNyw3ICsxNTE3LDcgQEAKIAlyZXR1cm4gc3B1ZnNfcHNfZmF1bHQodm1hLCB2bWYsIDB4MzAwMCwgU1BVRlNfTUZDX01BUF9TSVpFKTsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzcHVmc19tZmNfbW1hcF92bW9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3B1ZnNfbWZjX21tYXBfdm1vcHMgPSB7CiAJLmZhdWx0ID0gc3B1ZnNfbWZjX21tYXBfZmF1bHQsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvTWFrZWZpbGUKaW5kZXggY2M3MTYxZi4uY2UwMTQ5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9NYWtlZmlsZQpAQCAtMSwxOCArMSw5IEBACiBFWFRSQV9DRkxBR1MJKz0gLW1uby1taW5pbWFsLXRvYwogCi1leHRyYS15ICs9IGR0Lm8KLQogb2JqLXkgKz0gZXhjZXB0aW9uLm8KLW9iai15ICs9IGh2bG9nLm8gaHZscGNvbmZpZy5vIGxwYXJkYXRhLm8gc2V0dXAubyBkdF9tb2QubyBtZi5vIGxwZXZlbnRzLm8gXAorb2JqLXkgKz0gaHZsb2cubyBodmxwY29uZmlnLm8gbHBhcmRhdGEubyBzZXR1cC5vIGR0Lm8gbWYubyBscGV2ZW50cy5vIFwKIAlodmNhbGwubyBwcm9jLm8gaHRhYi5vIGlvbW11Lm8gbWlzYy5vIGlycS5vCiBvYmotJChDT05GSUdfUENJKSArPSBwY2kubwogb2JqLSQoQ09ORklHX1NNUCkgKz0gc21wLm8KIG9iai0kKENPTkZJR19WSU9QQVRIKSArPSB2aW9wYXRoLm8gdmlvLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBrc3ltcy5vCi0KLXF1aWV0X2NtZF9kdF9zdHJpbmdzID0gRFRfU1RSICAkQAotICAgICAgY21kX2R0X3N0cmluZ3MgPSAkKE9CSkNPUFkpIC0tcmVuYW1lLXNlY3Rpb24gLnJvZGF0YS5zdHIxLjg9LmR0X3N0cmluZ3MgXAotCQkJCSQ8ICRACi0KLSQob2JqKS9kdF9tb2QubzoJJChvYmopL2R0Lm8KLQkkKGNhbGwgaWZfY2hhbmdlZCxkdF9zdHJpbmdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2R0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZHQuYwppbmRleCBjNWE4N2E3Li43ZjQ1YTUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZHQuYwpAQCAtNTEsMTEgKzUxLDE2IEBACiAKIC8qCiAgKiBUaGVzZSBhcmUgY3JlYXRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCBhdCB0aGUgc3RhcnQgYW5kIGVuZAotICogb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZyBhbGwgdGhlIHN0cmluZ3MgZnJvbSB0aGlzIGZpbGUuCisgKiBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nIGFsbCB0aGUgc3RyaW5ncyBtYXJrZWQgd2l0aCB0aGUgRFMgbWFjcm8uCiAgKi8KIGV4dGVybiBjaGFyIF9fZHRfc3RyaW5nc19zdGFydFtdOwogZXh0ZXJuIGNoYXIgX19kdF9zdHJpbmdzX2VuZFtdOwogCisjZGVmaW5lIERTKHMpCSh7CVwKKwlzdGF0aWMgY29uc3QgY2hhciBfX3NbXSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuZHRfc3RyaW5ncyIpKSkgPSBzOyBcCisJX19zOwkJXAorfSkKKwogc3RydWN0IGlzZXJpZXNfZmxhdF9kdCB7CiAJc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyIGhlYWRlcjsKIAl1NjQgcmVzZXJ2ZV9tYXBbMl07CkBAIC02NCw5ICs2OSw4IEBACiBzdGF0aWMgdm9pZCAqIF9faW5pdGRhdGEgZHRfZGF0YTsKIAogLyoKLSAqIFB1dHRpbmcgdGhlc2Ugc3RyaW5ncyBoZXJlIGtlZXBzIHRoZW0gb3V0IG9mIHRoZSBzZWN0aW9uCi0gKiB0aGF0IHdlIHJlbmFtZSB0byAuZHRfc3RyaW5ncyB1c2luZyBvYmpjb3B5IGFuZCBjYXB0dXJlCi0gKiBmb3IgdGhlIHN0cmluZ3MgYmxvYiBvZiB0aGUgZmxhdHRlbmVkIGRldmljZSB0cmVlLgorICogUHV0dGluZyB0aGVzZSBzdHJpbmdzIGhlcmUga2VlcHMgdGhlbSBvdXQgb2YgdGhlIC5kdF9zdHJpbmdzIHNlY3Rpb24KKyAqIHRoYXQgd2UgY2FwdHVyZSBmb3IgdGhlIHN0cmluZ3MgYmxvYiBvZiB0aGUgZmxhdHRlbmVkIGRldmljZSB0cmVlLgogICovCiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIGRldmljZV90eXBlX2NwdVtdID0gImNwdSI7CiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIGRldmljZV90eXBlX21lbW9yeVtdID0gIm1lbW9yeSI7CkBAIC0xNzMsNyArMTc3LDcgQEAKIAogI2RlZmluZSBkdF9lbmRfbm9kZShkdCkgZHRfcHVzaF91MzIoZHQsIE9GX0RUX0VORF9OT0RFKQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZHRfcHJvcChzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgY29uc3QgY2hhciAqbmFtZSwKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2R0X3Byb3Aoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CkBAIC0xOTEsNDQgKzE5NSwzMiBAQAogCS8qIFRoZSBhY3R1YWwgZGF0YS4gKi8KIAlkdF9wdXNoX2J5dGVzKGR0LCBkYXRhLCBsZW4pOwogfQorI2RlZmluZSBkdF9wcm9wKGR0LCBuYW1lLCBkYXRhLCBsZW4pCV9fZHRfcHJvcCgoZHQpLCBEUyhuYW1lKSwgKGRhdGEpLCAobGVuKSkKIAotc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3Bfc3RyKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCBjb25zdCBjaGFyICpuYW1lLAotCQljb25zdCBjaGFyICpkYXRhKQotewotCWR0X3Byb3AoZHQsIG5hbWUsIGRhdGEsIHN0cmxlbihkYXRhKSArIDEpOyAvKiArIDEgZm9yIE5VTEwgKi8KLX0KKyNkZWZpbmUgZHRfcHJvcF9zdHIoZHQsIG5hbWUsIGRhdGEpCVwKKwlkdF9wcm9wKChkdCksIG5hbWUsIChkYXRhKSwgc3RybGVuKChkYXRhKSkgKyAxKTsgLyogKyAxIGZvciBOVUxMICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBkdF9wcm9wX3UzMihzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgY29uc3QgY2hhciAqbmFtZSwKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2R0X3Byb3BfdTMyKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCBjb25zdCBjaGFyICpuYW1lLAogCQl1MzIgZGF0YSkKIHsKLQlkdF9wcm9wKGR0LCBuYW1lLCAmZGF0YSwgc2l6ZW9mKHUzMikpOworCV9fZHRfcHJvcChkdCwgbmFtZSwgJmRhdGEsIHNpemVvZih1MzIpKTsKIH0KKyNkZWZpbmUgZHRfcHJvcF91MzIoZHQsIG5hbWUsIGRhdGEpCV9fZHRfcHJvcF91MzIoKGR0KSwgRFMobmFtZSksIChkYXRhKSkKIAotc3RhdGljIHZvaWQgX19pbml0IF9fbWF5YmVfdW51c2VkIGR0X3Byb3BfdTY0KHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LAotCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQl1NjQgZGF0YSkKK3N0YXRpYyB2b2lkIF9faW5pdCBfX21heWJlX3VudXNlZCBfX2R0X3Byb3BfdTY0KHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LAorCQljb25zdCBjaGFyICpuYW1lLCB1NjQgZGF0YSkKIHsKLQlkdF9wcm9wKGR0LCBuYW1lLCAmZGF0YSwgc2l6ZW9mKHU2NCkpOworCV9fZHRfcHJvcChkdCwgbmFtZSwgJmRhdGEsIHNpemVvZih1NjQpKTsKIH0KKyNkZWZpbmUgZHRfcHJvcF91NjQoZHQsIG5hbWUsIGRhdGEpCV9fZHRfcHJvcF91NjQoKGR0KSwgRFMobmFtZSksIChkYXRhKSkKIAotc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfdTY0X2xpc3Qoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsCi0JCWNvbnN0IGNoYXIgKm5hbWUsIHU2NCAqZGF0YSwgaW50IG4pCi17Ci0JZHRfcHJvcChkdCwgbmFtZSwgZGF0YSwgc2l6ZW9mKHU2NCkgKiBuKTsKLX0KKyNkZWZpbmUgZHRfcHJvcF91NjRfbGlzdChkdCwgbmFtZSwgZGF0YSwgbikJXAorCWR0X3Byb3AoKGR0KSwgbmFtZSwgKGRhdGEpLCBzaXplb2YodTY0KSAqIChuKSkKIAotc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfdTMyX2xpc3Qoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsCi0JCWNvbnN0IGNoYXIgKm5hbWUsIHUzMiAqZGF0YSwgaW50IG4pCi17Ci0JZHRfcHJvcChkdCwgbmFtZSwgZGF0YSwgc2l6ZW9mKHUzMikgKiBuKTsKLX0KKyNkZWZpbmUgZHRfcHJvcF91MzJfbGlzdChkdCwgbmFtZSwgZGF0YSwgbikJXAorCWR0X3Byb3AoKGR0KSwgbmFtZSwgKGRhdGEpLCBzaXplb2YodTMyKSAqIChuKSkKIAotI2lmZGVmIG5vdHlldAotc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfZW1wdHkoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JZHRfcHJvcChkdCwgbmFtZSwgTlVMTCwgMCk7Ci19Ci0jZW5kaWYKKyNkZWZpbmUgZHRfcHJvcF9lbXB0eShkdCwgbmFtZSkJCWR0X3Byb3AoKGR0KSwgbmFtZSwgTlVMTCwgMCkKIAogc3RhdGljIHZvaWQgX19pbml0IGR0X2NwdXMoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCmluZGV4IDZjMWUxMDEuLjlkNTNjYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJcGRuLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsLCAtMSk7CiAJZWxzZQogCQlrZnJlZSh0YmwpOwotCXBkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9IHBkbi0+aW9tbXVfdGFibGU7CisJc2V0X2lvbW11X3RhYmxlX2Jhc2UoJnBkZXYtPmRldiwgcGRuLT5pb21tdV90YWJsZSk7CiB9CiAjZWxzZQogI2RlZmluZSBwY2lfZG1hX2Rldl9zZXR1cF9pc2VyaWVzCU5VTEwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pb21tdS5jCmluZGV4IGEwZmYwM2EuLjdiMWQ2MDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvaW9tbXUuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJfQogI2VuZGlmCiAKLQlkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9ICZpb21tdV90YWJsZV9pb2JtYXA7CisJc2V0X2lvbW11X3RhYmxlX2Jhc2UoJmRldi0+ZGV2LCAmaW9tbXVfdGFibGVfaW9ibWFwKTsKIH0KIAogc3RhdGljIHZvaWQgcGNpX2RtYV9idXNfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2J1cyAqYikgeyB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCmluZGV4IDIxMjI2YjcuLjQxNGNhOTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCkBAIC01NDAsOCArNTQwLDExIEBACiAJLyogTWFrZSBzdXJlIElSUSBpcyBkaXNhYmxlZCAqLwogCWt3X3dyaXRlX3JlZyhyZWdfaWVyLCAwKTsKIAotCS8qIFJlcXVlc3QgY2hpcCBpbnRlcnJ1cHQgKi8KLQlpZiAocmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBrd19pMmNfaXJxLCAwLCAia2V5d2VzdCBpMmMiLCBob3N0KSkKKwkvKiBSZXF1ZXN0IGNoaXAgaW50ZXJydXB0LiBXZSBzZXQgSVJRRl9USU1FUiBiZWNhdXNlIHdlIGRvbid0CisJICogd2FudCB0aGF0IGludGVycnVwdCBkaXNhYmxlZCBiZXR3ZWVuIHRoZSAyIHBhc3NlcyBvZiBkcml2ZXIKKwkgKiBzdXNwZW5kIG9yIHdlJ2xsIGhhdmUgaXNzdWVzIHJ1bm5pbmcgdGhlIHBmdW5jcworCSAqLworCWlmIChyZXF1ZXN0X2lycShob3N0LT5pcnEsIGt3X2kyY19pcnEsIElSUUZfVElNRVIsICJrZXl3ZXN0IGkyYyIsIGhvc3QpKQogCQlob3N0LT5pcnEgPSBOT19JUlE7CiAKIAlwcmludGsoS0VSTl9JTkZPICJLZXlXZXN0IGkyYyBAMHglMDh4IGlycSAlZCAlc1xuIiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCmluZGV4IDkzN2EzOGUuLmI0MGMyMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAJaWYgKG5jcHVzID4gTlJfQ1BVUykKIAkJbmNwdXMgPSBOUl9DUFVTOwogCWZvciAoaSA9IDE7IGkgPCBuY3B1cyA7ICsraSkKLQkJY3B1X3NldChpLCBjcHVfcHJlc2VudF9tYXApOworCQlzZXRfY3B1X3ByZXNlbnQoaSwgdHJ1ZSk7CiAKIAlpZiAocHBjX21kLnByb2dyZXNzKSBwcGNfbWQucHJvZ3Jlc3MoInNtcF9wc3VyZ2VfcHJvYmUgLSBkb25lIiwgMHgzNTIpOwogCkBAIC04NjcsNyArODY3LDcgQEAKIAogaW50IHNtcF9jb3JlOTlfY3B1X2Rpc2FibGUodm9pZCkKIHsKLQljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisJc2V0X2NwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBmYWxzZSk7CiAKIAkvKiBYWFggcmVzZXQgY3B1IGFmZmluaXR5IGhlcmUgKi8KIAltcGljX2NwdV9zZXRfcHJpb3JpdHkoMHhmKTsKQEAgLTk1Miw3ICs5NTIsNyBAQAogCQlpbnQgY3B1OwogCiAJCWZvciAoY3B1ID0gMTsgY3B1IDwgNCAmJiBjcHUgPCBOUl9DUFVTOyArK2NwdSkKLQkJCWNwdV9zZXQoY3B1LCBjcHVfcG9zc2libGVfbWFwKTsKKwkJCXNldF9jcHVfcG9zc2libGUoY3B1LCB0cnVlKTsKIAkJc21wX29wcyA9ICZwc3VyZ2Vfc21wX29wczsKIAl9CiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZHRsLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZHRsLmMKaW5kZXggYWI2OTkyNS4uOTM3YTU0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2R0bC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kdGwuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJcmV0dXJuIG5fcmVhZCAqIHNpemVvZihzdHJ1Y3QgZHRsX2VudHJ5KTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHRsX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkdGxfZm9wcyA9IHsKIAkub3BlbgkJPSBkdGxfZmlsZV9vcGVuLAogCS5yZWxlYXNlCT0gZHRsX2ZpbGVfcmVsZWFzZSwKIAkucmVhZAkJPSBkdGxfZmlsZV9yZWFkLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2Zpcm13YXJlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYwppbmRleCA1YTcwN2RhLi4wYTE0ZDhjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYwpAQCAtNTEsMTEgKzUxLDEwIEBACiAJe0ZXX0ZFQVRVUkVfVklPLAkJImhjYWxsLXZpbyJ9LAogCXtGV19GRUFUVVJFX1JETUEsCQkiaGNhbGwtcmRtYSJ9LAogCXtGV19GRUFUVVJFX0xMQU4sCQkiaGNhbGwtbExBTiJ9LAotCXtGV19GRUFUVVJFX0JVTEssCQkiaGNhbGwtYnVsayJ9LAorCXtGV19GRUFUVVJFX0JVTEtfUkVNT1ZFLAkiaGNhbGwtYnVsayJ9LAogCXtGV19GRUFUVVJFX1hEQUJSLAkJImhjYWxsLXhkYWJyIn0sCiAJe0ZXX0ZFQVRVUkVfTVVMVElUQ0UsCQkiaGNhbGwtbXVsdGktdGNlIn0sCiAJe0ZXX0ZFQVRVUkVfU1BMUEFSLAkJImhjYWxsLXNwbHBhciJ9LAotCXtGV19GRUFUVVJFX0JVTEtfUkVNT1ZFLAkiaGNhbGwtYnVsayJ9LAogfTsKIAogLyogQnVpbGQgdXAgdGhlIGZpcm13YXJlIGZlYXR1cmVzIGJpdG1hc2sgdXNpbmcgdGhlIGNvbnRlbnRzIG9mCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jCmluZGV4IGEyMGVhZDguLmViZmY2ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jCkBAIC05NCw3ICs5NCw3IEBACiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWNwdV9jbGVhcihjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKwlzZXRfY3B1X29ubGluZShjcHUsIGZhbHNlKTsKIAl2ZHNvX2RhdGEtPnByb2Nlc3NvckNvdW50LS07CiAKIAkvKmZpeCBib290X2NwdWlkIGhlcmUqLwpAQCAtMTg1LDcgKzE4NSw3IEBACiAKIAlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIHRtcCkgewogCQlCVUdfT04oY3B1X2lzc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKSk7Ci0JCWNwdV9zZXQoY3B1LCBjcHVfcHJlc2VudF9tYXApOworCQlzZXRfY3B1X3ByZXNlbnQoY3B1LCB0cnVlKTsKIAkJc2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUsICppbnRzZXJ2KyspOwogCX0KIAllcnIgPSAwOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCQlpZiAoZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpICE9IGludHNlcnZbaV0pCiAJCQkJY29udGludWU7CiAJCQlCVUdfT04oY3B1X29ubGluZShjcHUpKTsKLQkJCWNwdV9jbGVhcihjcHUsIGNwdV9wcmVzZW50X21hcCk7CisJCQlzZXRfY3B1X3ByZXNlbnQoY3B1LCBmYWxzZSk7CiAJCQlzZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSwgLTEpOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKaW5kZXggNjYxYzhlMC4uMWEwMDAwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKQEAgLTQ4Miw3ICs0ODIsNyBAQAogCQkJCSAgIHBoYi0+bm9kZSk7CiAJCWlvbW11X3RhYmxlX3NldHBhcm1zKHBoYiwgZG4sIHRibCk7CiAJCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwsIHBoYi0+bm9kZSk7Ci0JCWRldi0+ZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0gUENJX0ROKGRuKS0+aW9tbXVfdGFibGU7CisJCXNldF9pb21tdV90YWJsZV9iYXNlKCZkZXYtPmRldiwgUENJX0ROKGRuKS0+aW9tbXVfdGFibGUpOwogCQlyZXR1cm47CiAJfQogCkBAIC00OTQsNyArNDk0LDcgQEAKIAkJZG4gPSBkbi0+cGFyZW50OwogCiAJaWYgKGRuICYmIFBDSV9ETihkbikpCi0JCWRldi0+ZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0gUENJX0ROKGRuKS0+aW9tbXVfdGFibGU7CisJCXNldF9pb21tdV90YWJsZV9iYXNlKCZkZXYtPmRldiwgUENJX0ROKGRuKS0+aW9tbXVfdGFibGUpOwogCWVsc2UKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW9tbXU6IERldmljZSAlcyBoYXMgbm8gaW9tbXUgdGFibGVcbiIsCiAJCSAgICAgICBwY2lfbmFtZShkZXYpKTsKQEAgLTUzOCw3ICs1MzgsNyBAQAogCSAqLwogCWlmIChkbWFfd2luZG93ID09IE5VTEwgfHwgcGRuLT5wYXJlbnQgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygiICBubyBkbWEgd2luZG93IGZvciBkZXZpY2UsIGxpbmtpbmcgdG8gcGFyZW50XG4iKTsKLQkJZGV2LT5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPSBQQ0lfRE4ocGRuKS0+aW9tbXVfdGFibGU7CisJCXNldF9pb21tdV90YWJsZV9iYXNlKCZkZXYtPmRldiwgUENJX0ROKHBkbiktPmlvbW11X3RhYmxlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTU0LDcgKzU1NCw3IEBACiAJCXByX2RlYnVnKCIgIGZvdW5kIERNQSB3aW5kb3csIHRhYmxlOiAlcFxuIiwgcGNpLT5pb21tdV90YWJsZSk7CiAJfQogCi0JZGV2LT5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPSBwY2ktPmlvbW11X3RhYmxlOworCXNldF9pb21tdV90YWJsZV9iYXNlKCZkZXYtPmRldiwgcGNpLT5pb21tdV90YWJsZSk7CiB9CiAjZWxzZSAgLyogQ09ORklHX1BDSSAqLwogI2RlZmluZSBwY2lfZG1hX2J1c19zZXR1cF9wU2VyaWVzCU5VTEwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tc2kuYwppbmRleCBiZjJlMWFjLi4xMTY0YzM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21zaS5jCkBAIC00MzIsOCArNDMyLDYgQEAKIAkJLyogUmVhZCBjb25maWcgc3BhY2UgYmFjayBzbyB3ZSBjYW4gcmVzdG9yZSBhZnRlciByZXNldCAqLwogCQlyZWFkX21zaV9tc2codmlycSwgJm1zZyk7CiAJCWVudHJ5LT5tc2cgPSBtc2c7Ci0KLQkJdW5tYXNrX21zaV9pcnEodmlycSk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwppbmRleCA0MTlmOGE2Li5iOWJmMGVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L21zaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KQEAgLTIxOSw2ICsyMjAsMTQgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCB4aWNzX3N0YXJ0dXAodW5zaWduZWQgaW50IHZpcnEpCiB7CisJLyoKKwkgKiBUaGUgZ2VuZXJpYyBNU0kgY29kZSByZXR1cm5zIHdpdGggdGhlIGludGVycnVwdCBkaXNhYmxlZCBvbiB0aGUKKwkgKiBjYXJkLCB1c2luZyB0aGUgTVNJIG1hc2sgYml0cy4gRmlybXdhcmUgZG9lc24ndCBhcHBlYXIgdG8gdW5tYXNrCisJICogYXQgdGhhdCBsZXZlbCwgc28gd2UgZG8gaXQgaGVyZSBieSBoYW5kLgorCSAqLworCWlmIChpcnFfdG9fZGVzYyh2aXJxKS0+bXNpX2Rlc2MpCisJCXVubWFza19tc2lfaXJxKHZpcnEpOworCiAJLyogdW5tYXNrIGl0ICovCiAJeGljc191bm1hc2tfaXJxKHZpcnEpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3JlbG9jc19jaGVjay5wbCBiL2FyY2gvcG93ZXJwYy9yZWxvY3NfY2hlY2sucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDI1NzEwOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9yZWxvY3NfY2hlY2sucGwKQEAgLTAsMCArMSw1NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMgQ29weXJpZ2h0IMKpIDIwMDkgSUJNIENvcnBvcmF0aW9uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyMgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHNjcmlwdCBjaGVja3MgdGhlIHJlbGNvYXRpb25zIG9mIGEgdm1saW51eCBmb3IgInN1c3BpY2lvdXMiCisjIHJlbG9jYXRpb25zLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitpZiAoJCNBUkdWICE9IDEpIHsKKwlkaWUgIiQwIFtwYXRoIHRvIG9iamR1bXBdIFtwYXRoIHRvIHZtbGludXhdXG4iOworfQorCisjIEhhdmUgS2J1aWxkIHN1cHBseSB0aGUgcGF0aCB0byBvYmpkdW1wIHNvIHdlIGhhbmRsZSBjcm9zcyBjb21waWxhdGlvbi4KK215ICRvYmpkdW1wID0gc2hpZnQ7CitteSAkdm1saW51eCA9IHNoaWZ0OworbXkgJGJhZF9yZWxvY3NfY291bnQgPSAwOworbXkgJGJhZF9yZWxvY3MgPSAiIjsKK215ICRvbGRfYmludXRpbHMgPSAwOworCitvcGVuKEZELCAiJG9iamR1bXAgLVIgJHZtbGludXh8Iikgb3IgZGllOword2hpbGUgKDxGRD4pIHsKKwlzdHVkeSAkXzsKKworCSMgT25seSBsb29rIGF0IHJlbGNvYXRpb24gbGluZXMuCisJbmV4dCBpZiAoIS9ccytSXy8pOworCisJIyBUaGVzZSByZWxvY2F0aW9ucyBhcmUgb2theQorCW5leHQgaWYgKC9SX1BQQzY0X1JFTEFUSVZFLyBvciAvUl9QUEM2NF9OT05FLyBvcgorCSAgICAgICAgIC9SX1BQQzY0X0FERFI2NFxzK21hY2hfLyk7CisKKwkjIElmIHdlIHNlZSB0aGlzIHR5cGUgb2YgcmVsY29hdGlvbiBpdCdzIGFuIGlkaWNhdGlvbiB0aGF0CisJIyB3ZSAvbWF5LyBiZSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBiaW51dGlscy4KKwlpZiAoL1JfUFBDNjRfVUFERFI2NC8pIHsKKwkJJG9sZF9iaW51dGlscysrOworCX0KKworCSRiYWRfcmVsb2NzX2NvdW50Kys7CisJJGJhZF9yZWxvY3MgLj0gJF87Cit9CisKK2lmICgkYmFkX3JlbG9jc19jb3VudCkgeworCXByaW50ICJXQVJOSU5HOiAkYmFkX3JlbG9jc19jb3VudCBiYWQgcmVsb2NhdGlvbnNcbiI7CisJcHJpbnQgJGJhZF9yZWxvY3M7Cit9CisKK2lmICgkb2xkX2JpbnV0aWxzKSB7CisJcHJpbnQgIldBUk5JTkc6IFlvdSBuZWVkIGF0IGJpbnV0aWxzID49IDIuMTkgdG8gYnVpbGQgYSAiLgorCSAgICAgICJDT05GSUdfUkVMQ09BVEFCTEUga2VybmVsXG4iOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwppbmRleCA4OTYzOWVjLi5hZTNjNGRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJLyogV2Ugb25seSBoYXZlIG9uZSBpb21tdSB0YWJsZSBvbiB0aGUgbWFjIGZvciBub3csIHdoaWNoIG1ha2VzCiAJICogdGhpbmdzIHNpbXBsZS4gU2V0dXAgYWxsIFBDSSBkZXZpY2VzIHRvIHBvaW50IHRvIHRoaXMgdGFibGUKIAkgKi8KLQlkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9ICZpb21tdV90YWJsZV9kYXJ0OworCXNldF9pb21tdV90YWJsZV9iYXNlKCZkZXYtPmRldiwgJmlvbW11X3RhYmxlX2RhcnQpOwogfQogCiBzdGF0aWMgdm9pZCBwY2lfZG1hX2J1c19zZXR1cF9kYXJ0KHN0cnVjdCBwY2lfYnVzICpidXMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKaW5kZXggMGUwOWE0NS4uYmRiZTk2YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwpAQCAtMzM1LDYgKzMzNSwxNiBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgaW50IHVucmVjb3ZlcmFibGVfZXhjcChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZmRlZiBDT05GSUdfNHh4CisJLyogV2UgaGF2ZSBubyBNU1JfUkkgYml0IG9uIDR4eCwgc28gd2Ugc2ltcGx5IHJldHVybiBmYWxzZSAqLworCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gKChyZWdzLT5tc3IgJiBNU1JfUkkpID09IDApOworI2VuZGlmCit9CisKIHN0YXRpYyBpbnQgeG1vbl9jb3JlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZnJvbWlwaSkKIHsKIAlpbnQgY21kID0gMDsKQEAgLTM4OCw3ICszOTgsNyBAQAogCWJwID0gTlVMTDsKIAlpZiAoKHJlZ3MtPm1zciAmIChNU1JfSVJ8TVNSX1BSfE1TUl9TRikpID09IChNU1JfSVJ8TVNSX1NGKSkKIAkJYnAgPSBhdF9icmVha3BvaW50KHJlZ3MtPm5pcCk7Ci0JaWYgKGJwIHx8IChyZWdzLT5tc3IgJiBNU1JfUkkpID09IDApCisJaWYgKGJwIHx8IHVucmVjb3ZlcmFibGVfZXhjcChyZWdzKSkKIAkJZnJvbWlwaSA9IDA7CiAKIAlpZiAoIWZyb21pcGkpIHsKQEAgLTM5OSw3ICs0MDksNyBAQAogCQkJICAgICAgIGNwdSwgQlBfTlVNKGJwKSk7CiAJCQl4bW9uX3ByaW50X3N5bWJvbChyZWdzLT5uaXAsICIgIiwgIilcbiIpOwogCQl9Ci0JCWlmICgocmVncy0+bXNyICYgTVNSX1JJKSA9PSAwKQorCQlpZiAodW5yZWNvdmVyYWJsZV9leGNwKHJlZ3MpKQogCQkJcHJpbnRmKCJXQVJOSU5HOiBleGNlcHRpb24gaXMgbm90IHJlY292ZXJhYmxlLCAiCiAJCQkgICAgICAgImNhbid0IGNvbnRpbnVlXG4iKTsKIAkJcmVsZWFzZV9vdXRwdXRfbG9jaygpOwpAQCAtNDkwLDcgKzUwMCw3IEBACiAJCQlwcmludGYoIlN0b3BwZWQgYXQgYnJlYWtwb2ludCAleCAoIiwgQlBfTlVNKGJwKSk7CiAJCQl4bW9uX3ByaW50X3N5bWJvbChyZWdzLT5uaXAsICIgIiwgIilcbiIpOwogCQl9Ci0JCWlmICgocmVncy0+bXNyICYgTVNSX1JJKSA9PSAwKQorCQlpZiAodW5yZWNvdmVyYWJsZV9leGNwKHJlZ3MpKQogCQkJcHJpbnRmKCJXQVJOSU5HOiBleGNlcHRpb24gaXMgbm90IHJlY292ZXJhYmxlLCAiCiAJCQkgICAgICAgImNhbid0IGNvbnRpbnVlXG4iKTsKIAkJcmVtb3ZlX2JwdHMoKTsKQEAgLTUwNyw2ICs1MTcsMTUgQEAKIAlpbl94bW9uID0gMDsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0JPT0tFCisJaWYgKHJlZ3MtPm1zciAmIE1TUl9ERSkgeworCQlicCA9IGF0X2JyZWFrcG9pbnQocmVncy0+bmlwKTsKKwkJaWYgKGJwICE9IE5VTEwpIHsKKwkJCXJlZ3MtPm5pcCA9ICh1bnNpZ25lZCBsb25nKSAmYnAtPmluc3RyWzBdOworCQkJYXRvbWljX2luYygmYnAtPnJlZl9jb3VudCk7CisJCX0KKwl9CisjZWxzZQogCWlmICgocmVncy0+bXNyICYgKE1TUl9JUnxNU1JfUFJ8TVNSX1NGKSkgPT0gKE1TUl9JUnxNU1JfU0YpKSB7CiAJCWJwID0gYXRfYnJlYWtwb2ludChyZWdzLT5uaXApOwogCQlpZiAoYnAgIT0gTlVMTCkgewpAQCAtNTIwLDcgKzUzOSw3IEBACiAJCQl9CiAJCX0KIAl9Ci0KKyNlbmRpZgogCWluc2VydF9jcHVfYnB0cygpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtODg0LDYgKzkwMywxNCBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19CT09LRQorc3RhdGljIGludCBkb19zdGVwKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ3MtPm1zciB8PSBNU1JfREU7CisJbXRzcHIoU1BSTl9EQkNSMCwgbWZzcHIoU1BSTl9EQkNSMCkgfCBEQkNSMF9JQyB8IERCQ1IwX0lETSk7CisJcmV0dXJuIDE7Cit9CisjZWxzZQogLyoKICAqIFN0ZXAgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCiAgKiBTb21lIGluc3RydWN0aW9ucyB3ZSBlbXVsYXRlLCBvdGhlcnMgd2UgZXhlY3V0ZSB3aXRoIE1TUl9TRSBzZXQuCkBAIC05MTQsNiArOTQxLDcgQEAKIAlyZWdzLT5tc3IgfD0gTVNSX1NFOwogCXJldHVybiAxOwogfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGJvb3RjbWRzKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYwppbmRleCAyNjQ1MjhlLi5iNTVmZDdlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCisrKyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKQEAgLTUwLDEwICs1MCw5IEBACiAgKiAvcHJvYyBlbnRyaWVzIChzeXNjdGwpCiAgKi8KIHN0YXRpYyBjb25zdCBjaGFyIGFwcGxkYXRhX3Byb2NfbmFtZVtBUFBMREFUQV9QUk9DX05BTUVfTEVOR1RIXSA9ICJhcHBsZGF0YSI7Ci1zdGF0aWMgaW50IGFwcGxkYXRhX3RpbWVyX2hhbmRsZXIoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IGFwcGxkYXRhX3RpbWVyX2hhbmRsZXIoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKIHN0YXRpYyBpbnQgYXBwbGRhdGFfaW50ZXJ2YWxfaGFuZGxlcihjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAotCQkJCQkgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCQkgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOwogCkBAIC0yNDcsNyArMjQ2LDcgQEAKICAqIFN0YXJ0L1N0b3AgdGltZXIsIHNob3cgc3RhdHVzIG9mIHRpbWVyICgwID0gbm90IGFjdGl2ZSwgMSA9IGFjdGl2ZSkKICAqLwogc3RhdGljIGludAotYXBwbGRhdGFfdGltZXJfaGFuZGxlcihjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2FwcGxkYXRhX3RpbWVyX2hhbmRsZXIoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWludCBsZW47CkBAIC0yODksNyArMjg4LDcgQEAKICAqIGN1cnJlbnQgdGltZXIgaW50ZXJ2YWwuCiAgKi8KIHN0YXRpYyBpbnQKLWFwcGxkYXRhX2ludGVydmFsX2hhbmRsZXIoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCithcHBsZGF0YV9pbnRlcnZhbF9oYW5kbGVyKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCiAJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgbGVuLCBpbnRlcnZhbDsKQEAgLTMzNSw3ICszMzQsNyBAQAogICogbW9uaXRvcmluZyAoMCA9IG5vdCBpbiBwcm9jZXNzLCAxID0gaW4gcHJvY2VzcykKICAqLwogc3RhdGljIGludAotYXBwbGRhdGFfZ2VuZXJpY19oYW5kbGVyKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorYXBwbGRhdGFfZ2VuZXJpY19oYW5kbGVyKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCiAJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgYXBwbGRhdGFfb3BzICpvcHMgPSBOVUxMLCAqdG1wX29wczsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9ib290L2luc3RhbGwuc2ggYi9hcmNoL3MzOTAvYm9vdC9pbnN0YWxsLnNoCmluZGV4IGQ0MDI2ZjYuLmFlZDMwNjk2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYm9vdC9pbnN0YWxsLnNoCisrKyBiL2FyY2gvczM5MC9ib290L2luc3RhbGwuc2gKQEAgLTIxLDggKzIxLDggQEAKIAogIyBVc2VyIG1heSBoYXZlIGEgY3VzdG9tIGluc3RhbGwgc2NyaXB0CiAKLWlmIFsgLXggfi9iaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIH4vYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsICIkQCI7IGZpCi1pZiBbIC14IC9zYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyAvc2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCAiJEAiOyBmaQoraWYgWyAteCB+L2Jpbi8ke0lOU1RBTExLRVJORUx9IF07IHRoZW4gZXhlYyB+L2Jpbi8ke0lOU1RBTExLRVJORUx9ICIkQCI7IGZpCitpZiBbIC14IC9zYmluLyR7SU5TVEFMTEtFUk5FTH0gXTsgdGhlbiBleGVjIC9zYmluLyR7SU5TVEFMTEtFUk5FTH0gIiRAIjsgZmkKIAogIyBEZWZhdWx0IGluc3RhbGwgLSBzYW1lIGFzIG1ha2UgemxpbG8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2h5cGZzL2h5cGZzX2RpYWcuYyBiL2FyY2gvczM5MC9oeXBmcy9oeXBmc19kaWFnLmMKaW5kZXggNzA0ZGQzOS4uNzdkZjcyNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2h5cGZzL2h5cGZzX2RpYWcuYworKysgYi9hcmNoL3MzOTAvaHlwZnMvaHlwZnNfZGlhZy5jCkBAIC00MzgsNyArNDM4LDcgQEAKIAkJfQogCQlpZiAoZGlhZzIwNCgodW5zaWduZWQgbG9uZylTVUJDX1NUSUI2IHwKIAkJCSAgICAodW5zaWduZWQgbG9uZylJTkZPX0VYVCwgcGFnZXMsIGJ1ZikgPj0gMCkgewotCQkJZGlhZzIwNF9zdG9yZV9zYyA9IFNVQkNfU1RJQjc7CisJCQlkaWFnMjA0X3N0b3JlX3NjID0gU1VCQ19TVElCNjsKIAkJCWRpYWcyMDRfaW5mb190eXBlID0gSU5GT19FWFQ7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKaW5kZXggMjRiMTI0NC4uZjIzOTYxYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY3B1dGltZS5oCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAogY3B1dGltZV90b19tc2Vjcyhjb25zdCBjcHV0aW1lX3QgY3B1dGltZSkKIHsKLQlyZXR1cm4gX19kaXYoY3B1dGltZSwgNDA5NjAwMCk7CisJcmV0dXJuIGNwdXRpbWVfZGl2KGNwdXRpbWUsIDQwOTYwMDApOwogfQogCiBzdGF0aWMgaW5saW5lIGNwdXRpbWVfdApAQCAtMTYwLDcgKzE2MCw3IEBACiBzdGF0aWMgaW5saW5lIGNsb2NrX3QKIGNwdXRpbWVfdG9fY2xvY2tfdChjcHV0aW1lX3QgY3B1dGltZSkKIHsKLQlyZXR1cm4gX19kaXYoY3B1dGltZSwgNDA5NjAwMDAwMFVMTCAvIFVTRVJfSFopOworCXJldHVybiBjcHV0aW1lX2RpdihjcHV0aW1lLCA0MDk2MDAwMDAwVUxMIC8gVVNFUl9IWik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgY3B1dGltZV90CkBAIC0xNzUsNyArMTc1LDcgQEAKIHN0YXRpYyBpbmxpbmUgY2xvY2tfdAogY3B1dGltZTY0X3RvX2Nsb2NrX3QoY3B1dGltZTY0X3QgY3B1dGltZSkKIHsKLSAgICAgICByZXR1cm4gX19kaXYoY3B1dGltZSwgNDA5NjAwMDAwMFVMTCAvIFVTRVJfSFopOworICAgICAgIHJldHVybiBjcHV0aW1lX2RpdihjcHV0aW1lLCA0MDk2MDAwMDAwVUxMIC8gVVNFUl9IWik7CiB9CiAKIHN0cnVjdCBzMzkwX2lkbGVfZGF0YSB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZGVsYXkuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9kZWxheS5oCmluZGV4IGEzNTZjOTUuLjhhMDk2YjggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9kZWxheS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9kZWxheS5oCkBAIC0xNCwxMCArMTQsMTEgQEAKICNpZm5kZWYgX1MzOTBfREVMQVlfSAogI2RlZmluZSBfUzM5MF9ERUxBWV9ICiAKLWV4dGVybiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpOwotZXh0ZXJuIHZvaWQgdWRlbGF5X3NpbXBsZSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKK2V4dGVybiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgbG9uZyB1c2Vjcyk7CitleHRlcm4gdm9pZCB1ZGVsYXlfc2ltcGxlKHVuc2lnbmVkIGxvbmcgbG9uZyB1c2Vjcyk7CiBleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOwogCi0jZGVmaW5lIHVkZWxheShuKSBfX3VkZWxheShuKQorI2RlZmluZSB1ZGVsYXkobikgX191ZGVsYXkoKHVuc2lnbmVkIGxvbmcgbG9uZykgKG4pKQorI2RlZmluZSBtZGVsYXkobikgX191ZGVsYXkoKHVuc2lnbmVkIGxvbmcgbG9uZykgKG4pICogMTAwMCkKIAogI2VuZGlmIC8qIGRlZmluZWQoX1MzOTBfREVMQVlfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCA3NGQwYmJiLi5lODg1NDQyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC05Miw2ICs5MiwxOCBAQAogLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KICNkZWZpbmUgUl8zOTBfTlVNCTYxCiAKKy8qIEJpdHMgcHJlc2VudCBpbiBBVF9IV0NBUC4gKi8KKyNkZWZpbmUgSFdDQVBfUzM5MF9FU0FOMwkxCisjZGVmaW5lIEhXQ0FQX1MzOTBfWkFSQ0gJMgorI2RlZmluZSBIV0NBUF9TMzkwX1NURkxFCTQKKyNkZWZpbmUgSFdDQVBfUzM5MF9NU0EJCTgKKyNkZWZpbmUgSFdDQVBfUzM5MF9MRElTUAkxNgorI2RlZmluZSBIV0NBUF9TMzkwX0VJTU0JCTMyCisjZGVmaW5lIEhXQ0FQX1MzOTBfREZQCQk2NAorI2RlZmluZSBIV0NBUF9TMzkwX0hQQUdFCTEyOAorI2RlZmluZSBIV0NBUF9TMzkwX0VURjNFSAkyNTYKKyNkZWZpbmUgSFdDQVBfUzM5MF9ISUdIX0dQUlMJNTEyCisKIC8qCiAgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcy4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDUzOTI2M2YuLjk1ZGNmMTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTMxMSw2ICszMTEsMTAgQEAKIAlfX3UzMgkJb3JpZ19ncHIyOwogfSBzMzkwX2NvbXBhdF9yZWdzOwogCit0eXBlZGVmIHN0cnVjdAoreworCV9fdTMyCQlncHJzX2hpZ2hbTlVNX0dQUlNdOworfSBzMzkwX2NvbXBhdF9yZWdzX2hpZ2g7CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCBjOTkxZmU2Li5hODY4YjI3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NtcC5oCkBAIC02Miw3ICs2Miw3IEBACiBleHRlcm4gaW50IHNtcF9jcHVfcG9sYXJpemF0aW9uW107CiAKIGV4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSk7Ci1leHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGkoY3B1bWFza190IG1hc2spOworZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCA1ZTBhZDYxLi42ZTcyMTFhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtOSw3ICs5LDYgQEAKIAogZXh0ZXJuIGNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU107CiAKLSNkZWZpbmUgdG9wb2xvZ3lfY29yZV9zaWJsaW5ncyhjcHUpCShjcHVfY29yZV9tYXBbY3B1XSkKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9jcHVtYXNrKGNwdSkJKCZjcHVfY29yZV9tYXBbY3B1XSkKIAogaW50IHRvcG9sb2d5X3NldF9jcHVfbWFuYWdlbWVudChpbnQgZmMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Vjb250ZXh0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWNvbnRleHQuaAppbmRleCBkNjliZWMwLi5jZmI4NzRlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWNvbnRleHQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWNvbnRleHQuaApAQCAtOSw2ICs5LDIxIEBACiAjaWZuZGVmIF9BU01fUzM5MF9VQ09OVEVYVF9ICiAjZGVmaW5lIF9BU01fUzM5MF9VQ09OVEVYVF9ICiAKKyNkZWZpbmUgVUNfRVhURU5ERUQJMHgwMDAwMDAwMQorCisjaWZuZGVmIF9fczM5MHhfXworCitzdHJ1Y3QgdWNvbnRleHRfZXh0ZW5kZWQgeworCXVuc2lnbmVkIGxvbmcJICB1Y19mbGFnczsKKwlzdHJ1Y3QgdWNvbnRleHQgICp1Y19saW5rOworCXN0YWNrX3QJCSAgdWNfc3RhY2s7CisJX3NpZ3JlZ3MJICB1Y19tY29udGV4dDsKKwl1bnNpZ25lZCBsb25nCSAgdWNfc2lnbWFza1syXTsKKwl1bnNpZ25lZCBsb25nCSAgdWNfZ3Byc19oaWdoWzE2XTsKK307CisKKyNlbmRpZgorCiBzdHJ1Y3QgdWNvbnRleHQgewogCXVuc2lnbmVkIGxvbmcJICB1Y19mbGFnczsKIAlzdHJ1Y3QgdWNvbnRleHQgICp1Y19saW5rOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKaW5kZXggNTUxOWNiNy4uMGRlYmNlYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwppbmRleCBiNTM3Y2IwLi5lZWU5OTk4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwpAQCAtMzksNiArMzksNyBAQAogCXN0cnVjdCBzaWdjb250ZXh0MzIgc2M7CiAJX3NpZ3JlZ3MzMiBzcmVnczsKIAlpbnQgc2lnbm87CisJX191MzIgZ3Byc19oaWdoW05VTV9HUFJTXTsKIAlfX3U4IHJldGNvZGVbUzM5MF9TWVNDQUxMX1NJWkVdOwogfSBzaWdmcmFtZTMyOwogCkBAIC00OCw2ICs0OSw3IEBACiAJX191OCByZXRjb2RlW1MzOTBfU1lTQ0FMTF9TSVpFXTsKIAljb21wYXRfc2lnaW5mb190IGluZm87CiAJc3RydWN0IHVjb250ZXh0MzIgdWM7CisJX191MzIgZ3Byc19oaWdoW05VTV9HUFJTXTsKIH0gcnRfc2lnZnJhbWUzMjsKIAogaW50IGNvcHlfc2lnaW5mb190b191c2VyMzIoY29tcGF0X3NpZ2luZm9fdCBfX3VzZXIgKnRvLCBzaWdpbmZvX3QgKmZyb20pCkBAIC0zNDQsNiArMzQ2LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2F2ZV9zaWdyZWdzX2dwcnNfaGlnaChzdHJ1Y3QgcHRfcmVncyAqcmVncywgX191MzIgX191c2VyICp1cmVncykKK3sKKwlfX3UzMiBncHJzX2hpZ2hbTlVNX0dQUlNdOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9HUFJTOyBpKyspCisJCWdwcnNfaGlnaFtpXSA9IHJlZ3MtPmdwcnNbaV0gPj4gMzI7CisKKwlyZXR1cm4gX19jb3B5X3RvX3VzZXIodXJlZ3MsICZncHJzX2hpZ2gsIHNpemVvZihncHJzX2hpZ2gpKTsKK30KKworc3RhdGljIGludCByZXN0b3JlX3NpZ3JlZ3NfZ3Byc19oaWdoKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBfX3UzMiBfX3VzZXIgKnVyZWdzKQoreworCV9fdTMyIGdwcnNfaGlnaFtOVU1fR1BSU107CisJaW50IGVyciwgaTsKKworCWVyciA9IF9fY29weV9mcm9tX3VzZXIoJmdwcnNfaGlnaCwgdXJlZ3MsIHNpemVvZihncHJzX2hpZ2gpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWZvciAoaSA9IDA7IGkgPCBOVU1fR1BSUzsgaSsrKQorCQkqKF9fdTMyICopJnJlZ3MtPmdwcnNbaV0gPSBncHJzX2hpZ2hbaV07CisJcmV0dXJuIDA7Cit9CisKIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zaWdyZXR1cm4odm9pZCkKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKQEAgLTM2Myw2ICszODksOCBAQAogCiAJaWYgKHJlc3RvcmVfc2lncmVnczMyKHJlZ3MsICZmcmFtZS0+c3JlZ3MpKQogCQlnb3RvIGJhZGZyYW1lOworCWlmIChyZXN0b3JlX3NpZ3JlZ3NfZ3Byc19oaWdoKHJlZ3MsIGZyYW1lLT5ncHJzX2hpZ2gpKQorCQlnb3RvIGJhZGZyYW1lOwogCiAJcmV0dXJuIHJlZ3MtPmdwcnNbMl07CiAKQEAgLTM5NCw2ICs0MjIsOCBAQAogCiAJaWYgKHJlc3RvcmVfc2lncmVnczMyKHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQpKQogCQlnb3RvIGJhZGZyYW1lOworCWlmIChyZXN0b3JlX3NpZ3JlZ3NfZ3Byc19oaWdoKHJlZ3MsIGZyYW1lLT5ncHJzX2hpZ2gpKQorCQlnb3RvIGJhZGZyYW1lOwogCiAJZXJyID0gX19nZXRfdXNlcihzc19zcCwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCk7CiAJc3Quc3Nfc3AgPSBjb21wYXRfcHRyKHNzX3NwKTsKQEAgLTQ3NCw2ICs1MDQsOCBAQAogCiAJaWYgKHNhdmVfc2lncmVnczMyKHJlZ3MsICZmcmFtZS0+c3JlZ3MpKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKKwlpZiAoc2F2ZV9zaWdyZWdzX2dwcnNfaGlnaChyZWdzLCBmcmFtZS0+Z3Byc19oaWdoKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CiAJaWYgKF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+c3JlZ3MsICZmcmFtZS0+c2Muc3JlZ3MpKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKIApAQCAtNTI5LDEzICs1NjEsMTQgQEAKIAkJZ290byBnaXZlX3NpZ3NlZ3Y7CiAKIAkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KLQllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcihVQ19FWFRFTkRFRCwgJmZyYW1lLT51Yy51Y19mbGFncyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKTsKIAllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc3AsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc3ApOwogCWVyciB8PSBfX3B1dF91c2VyKHNhc19zc19mbGFncyhyZWdzLT5ncHJzWzE1XSksCiAJICAgICAgICAgICAgICAgICAgJmZyYW1lLT51Yy51Y19zdGFjay5zc19mbGFncyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSk7CiAJZXJyIHw9IHNhdmVfc2lncmVnczMyKHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQpOworCWVyciB8PSBzYXZlX3NpZ3JlZ3NfZ3Byc19oaWdoKHJlZ3MsIGZyYW1lLT5ncHJzX2hpZ2gpOwogCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKIAlpZiAoZXJyKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwppbmRleCA2ODJmYjY5Li5jYmQ5OTAxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCkBAIC00MDksNyArNDA5LDcgQEAKIAkuZ2xvYmwJc3lzMzJfdHJ1bmNhdGVfd3JhcHBlcgogc3lzMzJfdHJ1bmNhdGVfd3JhcHBlcjoKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKLQlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCisJbGdmcgklcjMsJXIzCQkJIyBsb25nCiAJamcJc3lzX3RydW5jYXRlCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCiAJLmdsb2JsCXN5czMyX2Z0cnVuY2F0ZV93cmFwcGVyCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2RlYnVnLmMgYi9hcmNoL3MzOTAva2VybmVsL2RlYnVnLmMKaW5kZXggNGM1MTI1Ni4uMjBmMjgyYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZGVidWcuYwpAQCAtODgxLDExICs4ODEsMTEgQEAKICAqIGlmIGRlYnVnX2FjdGl2ZSBpcyBhbHJlYWR5IG9mZgogICovCiBzdGF0aWMgaW50Ci1zMzkwZGJmX3Byb2NhY3RpdmUoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3MzOTBkYmZfcHJvY2FjdGl2ZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpZiAoIXdyaXRlIHx8IGRlYnVnX3N0b3BwYWJsZSB8fCAhZGVidWdfYWN0aXZlKQotCQlyZXR1cm4gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCXJldHVybiBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAllbHNlCiAJCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvZnRyYWNlLmMKaW5kZXggNTdiZGNiMS4uZjVmZTM0ZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2Z0cmFjZS5jCkBAIC0xODUsOSArMTg1LDYgQEAKIHsKIAlzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudCB0cmFjZTsKIAotCS8qIE5taSdzIGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuICovCi0JaWYgKHVubGlrZWx5KGluX25taSgpKSkKLQkJZ290byBvdXQ7CiAJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZjdXJyZW50LT50cmFjaW5nX2dyYXBoX3BhdXNlKSkpCiAJCWdvdG8gb3V0OwogCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UocGFyZW50LCBpcCwgJnRyYWNlLmRlcHRoLCAwKSA9PSAtRUJVU1kpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9zMzkwL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCBmZTc4N2Y5Li40ZDFjOWZiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTI1LDkgKzI1LDggQEAKICAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IGhhdmluZyBhIHNwZWNpYWwKICAqICJpbml0X3Rhc2siIGxpbmtlciBtYXAgZW50cnkuLgogICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPQotCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPQorCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CiAKIC8qCiAgKiBJbml0aWFsIHRhc2sgc3RydWN0dXJlLgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYyBiL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKaW5kZXggZWU1N2E0Mi4uNDg5MGFjNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2lwbC5jCkBAIC0xNTk1LDEwICsxNTk1LDkgQEAKIHsKIAlpZiAoc3RyY21wKHRyaWdnZXItPm5hbWUsIE9OX1BBTklDX1NUUikgPT0gMCkKIAkJZGlzYWJsZWRfd2FpdCgodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQllbHNlIHsKLQkJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcCk7Ci0JCWZvciAoOzspOwotCX0KKwl3aGlsZSAoc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcCkgPT0gc2lncF9idXN5KQorCQljcHVfcmVsYXgoKTsKKwlmb3IgKDs7KTsKIH0KIAogc3RhdGljIHN0cnVjdCBzaHV0ZG93bl9hY3Rpb24gc3RvcF9hY3Rpb24gPSB7U0hVVERPV05fQUNUSU9OX1NUT1BfU1RSLApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMKaW5kZXggYWIyZTNlZC4uNjM5MzgwYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL21vZHVsZS5jCkBAIC01NSw2ICs1NSw4IEBACiAvKiBGcmVlIG1lbW9yeSByZXR1cm5lZCBmcm9tIG1vZHVsZV9hbGxvYyAqLwogdm9pZCBtb2R1bGVfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIHZvaWQgKm1vZHVsZV9yZWdpb24pCiB7CisJdmZyZWUobW9kLT5hcmNoLnN5bWluZm8pOworCW1vZC0+YXJjaC5zeW1pbmZvID0gTlVMTDsKIAl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKIH0KIApAQCAtNDAyLDYgKzQwNCw3IEBACiAJCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKIHsKIAl2ZnJlZShtZS0+YXJjaC5zeW1pbmZvKTsKKwltZS0+YXJjaC5zeW1pbmZvID0gTlVMTDsKIAlyZXR1cm4gbW9kdWxlX2J1Z19maW5hbGl6ZShoZHIsIHNlY2hkcnMsIG1lKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwppbmRleCA1OWZlNmVjLi41NDE3ZWI1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3Nvci5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzb3IuYwppbmRleCA4MDJjOGFiLi4wNzI5ZjM2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3Nvci5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzc29yLmMKQEAgLTMxLDkgKzMxLDkgQEAKIAogc3RhdGljIGludCBzaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0YXRpYyBjb25zdCBjaGFyICpod2NhcF9zdHJbOV0gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKmh3Y2FwX3N0clsxMF0gPSB7CiAJCSJlc2FuMyIsICJ6YXJjaCIsICJzdGZsZSIsICJtc2EiLCAibGRpc3AiLCAiZWltbSIsICJkZnAiLAotCQkiZWRhdCIsICJldGYzZWgiCisJCSJlZGF0IiwgImV0ZjNlaCIsICJoaWdoZ3BycyIKIAl9OwogCXN0cnVjdCBfbG93Y29yZSAqbGM7CiAJdW5zaWduZWQgbG9uZyBuID0gKHVuc2lnbmVkIGxvbmcpIHYgLSAxOwpAQCAtNDgsNyArNDgsNyBAQAogCQkJICAgbnVtX29ubGluZV9jcHVzKCksIGxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKIAkJCSAgIChsb29wc19wZXJfamlmZnkvKDUwMDAvSFopKSUxMDApOwogCQlzZXFfcHV0cyhtLCAiZmVhdHVyZXNcdDogIik7Ci0JCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQogCQkJaWYgKGh3Y2FwX3N0cltpXSAmJiAoZWxmX2h3Y2FwICYgKDFVTCA8PCBpKSkpCiAJCQkJc2VxX3ByaW50ZihtLCAiJXMgIiwgaHdjYXBfc3RyW2ldKTsKIAkJc2VxX3B1dHMobSwgIlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhODczODY3Li42NTNjNmExIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTU3LDYgKzU3LDcgQEAKIGVudW0gczM5MF9yZWdzZXQgewogCVJFR1NFVF9HRU5FUkFMLAogCVJFR1NFVF9GUCwKKwlSRUdTRVRfR0VORVJBTF9FWFRFTkRFRCwKIH07CiAKIHN0YXRpYyB2b2lkCkBAIC04NzksNiArODgwLDY3IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IHMzOTBfY29tcGF0X3JlZ3NfaGlnaF9nZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJCQkgICAgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQoreworCWNvbXBhdF91bG9uZ190ICpncHJzX2hpZ2g7CisKKwlncHJzX2hpZ2ggPSAoY29tcGF0X3Vsb25nX3QgKikKKwkJJnRhc2tfcHRfcmVncyh0YXJnZXQpLT5ncHJzW3BvcyAvIHNpemVvZihjb21wYXRfdWxvbmdfdCldOworCWlmIChrYnVmKSB7CisJCWNvbXBhdF91bG9uZ190ICprID0ga2J1ZjsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJKmsrKyA9ICpncHJzX2hpZ2g7CisJCQlncHJzX2hpZ2ggKz0gMjsKKwkJCWNvdW50IC09IHNpemVvZigqayk7CisJCX0KKwl9IGVsc2UgeworCQljb21wYXRfdWxvbmdfdCBfX3VzZXIgKnUgPSB1YnVmOworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQlpZiAoX19wdXRfdXNlcigqZ3Byc19oaWdoLCB1KyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZ3Byc19oaWdoICs9IDI7CisJCQljb3VudCAtPSBzaXplb2YoKnUpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzOTBfY29tcGF0X3JlZ3NfaGlnaF9zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJCQkgICAgIGNvbnN0IHZvaWQgKmtidWYsIGNvbnN0IHZvaWQgX191c2VyICp1YnVmKQoreworCWNvbXBhdF91bG9uZ190ICpncHJzX2hpZ2g7CisJaW50IHJjID0gMDsKKworCWdwcnNfaGlnaCA9IChjb21wYXRfdWxvbmdfdCAqKQorCQkmdGFza19wdF9yZWdzKHRhcmdldCktPmdwcnNbcG9zIC8gc2l6ZW9mKGNvbXBhdF91bG9uZ190KV07CisJaWYgKGtidWYpIHsKKwkJY29uc3QgY29tcGF0X3Vsb25nX3QgKmsgPSBrYnVmOworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQkqZ3Byc19oaWdoID0gKmsrKzsKKwkJCSpncHJzX2hpZ2ggKz0gMjsKKwkJCWNvdW50IC09IHNpemVvZigqayk7CisJCX0KKwl9IGVsc2UgeworCQljb25zdCBjb21wYXRfdWxvbmdfdCAgX191c2VyICp1ID0gdWJ1ZjsKKwkJd2hpbGUgKGNvdW50ID4gMCAmJiAhcmMpIHsKKwkJCXVuc2lnbmVkIGxvbmcgd29yZDsKKwkJCXJjID0gX19nZXRfdXNlcih3b3JkLCB1KyspOworCQkJaWYgKHJjKQorCQkJCWJyZWFrOworCQkJKmdwcnNfaGlnaCA9IHdvcmQ7CisJCQkqZ3Byc19oaWdoICs9IDI7CisJCQljb3VudCAtPSBzaXplb2YoKnUpOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0IHMzOTBfY29tcGF0X3JlZ3NldHNbXSA9IHsKIAlbUkVHU0VUX0dFTkVSQUxdID0gewogCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUlNUQVRVUywKQEAgLTg5Niw2ICs5NTgsMTQgQEAKIAkJLmdldCA9IHMzOTBfZnByZWdzX2dldCwKIAkJLnNldCA9IHMzOTBfZnByZWdzX3NldCwKIAl9LAorCVtSRUdTRVRfR0VORVJBTF9FWFRFTkRFRF0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSWFNUQVRVUywKKwkJLm4gPSBzaXplb2YoczM5MF9jb21wYXRfcmVnc19oaWdoKSAvIHNpemVvZihjb21wYXRfbG9uZ190KSwKKwkJLnNpemUgPSBzaXplb2YoY29tcGF0X2xvbmdfdCksCisJCS5hbGlnbiA9IHNpemVvZihjb21wYXRfbG9uZ190KSwKKwkJLmdldCA9IHMzOTBfY29tcGF0X3JlZ3NfaGlnaF9nZXQsCisJCS5zZXQgPSBzMzkwX2NvbXBhdF9yZWdzX2hpZ2hfc2V0LAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgdXNlcl9zMzkwX2NvbXBhdF92aWV3ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IDllZDEzYTEuLjA2MTQ3OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKQEAgLTcyOSw3ICs3MjksNyBAQAogCiAJaWYgKChmYWNpbGl0eV9saXN0ICYgKDFVTCA8PCAoMzEgLSAyMikpKQogCSAgICAmJiAoZmFjaWxpdHlfbGlzdCAmICgxVUwgPDwgKDMxIC0gMzApKSkpCi0JCWVsZl9od2NhcCB8PSAxVUwgPDwgODsKKwkJZWxmX2h3Y2FwIHw9IEhXQ0FQX1MzOTBfRVRGM0VIOwogCiAJLyoKIAkgKiBDaGVjayBmb3IgYWRkaXRpb25hbCBmYWNpbGl0aWVzIHdpdGggc3RvcmUtZmFjaWxpdHktbGlzdC1leHRlbmRlZC4KQEAgLTc0OCwxMSArNzQ4LDIwIEBACiAJICAgIF9fc3RmbGUoJmZhY2lsaXR5X2xpc3RfZXh0ZW5kZWQsIDEpID4gMCkgewogCQlpZiAoKGZhY2lsaXR5X2xpc3RfZXh0ZW5kZWQgJiAoMVVMTCA8PCAoNjMgLSA0MikpKQogCQkgICAgJiYgKGZhY2lsaXR5X2xpc3RfZXh0ZW5kZWQgJiAoMVVMTCA8PCAoNjMgLSA0NCkpKSkKLQkJCWVsZl9od2NhcCB8PSAxVUwgPDwgNjsKKwkJCWVsZl9od2NhcCB8PSBIV0NBUF9TMzkwX0RGUDsKIAl9CiAKKwkvKgorCSAqIEh1Z2UgcGFnZSBzdXBwb3J0IEhXQ0FQX1MzOTBfSFBBR0UgaXMgYml0IDcuCisJICovCiAJaWYgKE1BQ0hJTkVfSEFTX0hQQUdFKQotCQllbGZfaHdjYXAgfD0gMVVMIDw8IDc7CisJCWVsZl9od2NhcCB8PSBIV0NBUF9TMzkwX0hQQUdFOworCisJLyoKKwkgKiA2NC1iaXQgcmVnaXN0ZXIgc3VwcG9ydCBmb3IgMzEtYml0IHByb2Nlc3NlcworCSAqIEhXQ0FQX1MzOTBfSElHSF9HUFJTIGlzIGJpdCA5LgorCSAqLworCWVsZl9od2NhcCB8PSBIV0NBUF9TMzkwX0hJR0hfR1BSUzsKIAogCXN3aXRjaCAoUzM5MF9sb3djb3JlLmNwdV9pZC5tYWNoaW5lKSB7CiAJY2FzZSAweDk2NzI6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCBiNGI2Mzk2Li45M2U1MjAzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKQEAgLTc2LDcgKzc2LDYgQEAKIAlfX3UzMiBzdGF0dXM7CiAKIAlzd2l0Y2ggKHNpZ25hbF9wcm9jZXNzb3JfcHMoJnN0YXR1cywgMCwgY3B1LCBzaWdwX3NlbnNlKSkgewotCWNhc2Ugc2lncF9vcmRlcl9jb2RlX2FjY2VwdGVkOgogCWNhc2Ugc2lncF9zdGF0dXNfc3RvcmVkOgogCQkvKiBDaGVjayBmb3Igc3RvcHBlZCBhbmQgY2hlY2sgc3RvcCBzdGF0ZSAqLwogCQlpZiAoc3RhdHVzICYgMHg1MCkKQEAgLTE0NywxMSArMTQ2LDExIEBACiAJCXVkZWxheSgxMCk7CiB9CiAKLXZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpKGNwdW1hc2tfdCBtYXNrKQordm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlpbnQgY3B1OwogCi0JZm9yX2VhY2hfY3B1X21hc2soY3B1LCBtYXNrKQorCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spCiAJCXNtcF9leHRfYml0Y2FsbChjcHUsIGVjX2NhbGxfZnVuY3Rpb24pOwogfQogCkBAIC02MzgsNiArNjM3LDggQEAKIAkvKiBXYWl0IHVudGlsIHRhcmdldCBjcHUgaXMgZG93biAqLwogCXdoaWxlICghY3B1X3N0b3BwZWQoY3B1KSkKIAkJY3B1X3JlbGF4KCk7CisJd2hpbGUgKHNpZ25hbF9wcm9jZXNzb3JfcCgwLCBjcHUsIHNpZ3Bfc2V0X3ByZWZpeCkgPT0gc2lncF9idXN5KQorCQl1ZGVsYXkoMTApOwogCXNtcF9mcmVlX2xvd2NvcmUoY3B1KTsKIAlwcl9pbmZvKCJQcm9jZXNzb3IgJWQgc3RvcHBlZFxuIiwgY3B1KTsKIH0KQEAgLTY0NSw4ICs2NDYsOCBAQAogdm9pZCBjcHVfZGllKHZvaWQpCiB7CiAJaWRsZV90YXNrX2V4aXQoKTsKLQlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wKTsKLQlCVUcoKTsKKwl3aGlsZSAoc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcCkgPT0gc2lncF9idXN5KQorCQljcHVfcmVsYXgoKTsKIAlmb3IgKDs7KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zd3N1c3BfYXNtNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvc3dzdXNwX2FzbTY0LlMKaW5kZXggZmU5MjdkMC4uMGMyNmNjMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zd3N1c3BfYXNtNjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3N3c3VzcF9hc202NC5TCkBAIC00Myw3ICs0Myw3IEBACiAJbGdoaQklcjEsMHgxMDAwCiAKIAkvKiBTYXZlIENQVSBhZGRyZXNzICovCi0Jc3RhcAlfX0xDX0NQVV9BRERSRVNTKCVyMSkKKwlzdGFwCV9fTENfQ1BVX0FERFJFU1MoJXIwKQogCiAJLyogU3RvcmUgcmVnaXN0ZXJzICovCiAJbXZjCTB4MzE4KDQsJXIxKSxfX1NGX0VNUFRZKCVyMTUpCS8qIG1vdmUgcHJlZml4IHRvIGxvd2NvcmUgKi8KQEAgLTY5LDggKzY5LDIxIEBACiAJc3RtZwklcjAsJXIxNSwweDI4MCglcjEpCQkvKiBzdG9yZSBnZW5lcmFsIHJlZ2lzdGVycyAqLwogCiAJc3RwdAkweDMyOCglcjEpCQkJLyogc3RvcmUgdGltZXIgKi8KKwlzdGNrCV9fU0ZfRU1QVFkoJXIxNSkJCS8qIHN0b3JlIGNsb2NrICovCiAJc3Rja2MJMHgzMzAoJXIxKQkJCS8qIHN0b3JlIGNsb2NrIGNvbXBhcmF0b3IgKi8KIAorCS8qIFVwZGF0ZSBjcHV0aW1lIGFjY291bnRpbmcgYmVmb3JlIGdvaW5nIHRvIHNsZWVwICovCisJbGcJJXIwLF9fTENfTEFTVF9VUERBVEVfVElNRVIKKwlzbGcJJXIwLDB4MzI4KCVyMSkKKwlhbGcJJXIwLF9fTENfU1lTVEVNX1RJTUVSCisJc3RnCSVyMCxfX0xDX1NZU1RFTV9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLDB4MzI4KCVyMSkKKwlsZwklcjAsX19MQ19MQVNUX1VQREFURV9DTE9DSworCXNsZwklcjAsX19TRl9FTVBUWSglcjE1KQorCWFsZwklcjAsX19MQ19TVEVBTF9USU1FUgorCXN0ZwklcjAsX19MQ19TVEVBTF9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX0NMT0NLKDgpLF9fU0ZfRU1QVFkoJXIxNSkKKwogCS8qIEFjdGl2YXRlIERBVCAqLwogCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwNAogCkBAIC0xNTksOCArMTcyLDcgQEAKIAlsYXJsCSVyMSwuTHJlc3VtZV9jcHUJCS8qIFJlc3VtZSBDUFUgYWRkcmVzczogcjIgKi8KIAlzdGFwCTAoJXIxKQogCWxsZ2gJJXIyLDAoJXIxKQotCWxnaGkJJXIzLDB4MTAwMAotCWxsZ2gJJXIxLF9fTENfQ1BVX0FERFJFU1MoJXIzKQkvKiBTdXNwZW5kIENQVSBhZGRyZXNzOiByMSAqLworCWxsZ2gJJXIxLF9fTENfQ1BVX0FERFJFU1MoJXIwKQkvKiBTdXNwZW5kIENQVSBhZGRyZXNzOiByMSAqLwogCWNncgklcjEsJXIyCiAJamUJcmVzdG9yZV9yZWdpc3RlcnMJCS8qIHIxID0gcjIgLT4gbm90aGluZyB0byBkbyAqLwogCWxhcmwJJXI0LC5McmVzdGFydF9zdXNwZW5kX3BzdwkvKiBTZXQgbmV3IHJlc3RhcnQgUFNXICovCkBAIC0xODcsNiArMTk5LDcgQEAKIAlicmMJMiw0YgkJCS8qIGJ1c3ksIHRyeSBhZ2FpbiAqLwogNToKIAlzaWdwCSVyOSwlcjIsX19TSUdQX1NUT1AJLyogc3RvcCByZXN1bWUgKGN1cnJlbnQpIENQVSAqLworCWJyYwkyLDViCQkJLyogYnVzeSwgdHJ5IGFnYWluICovCiA2OglqCTZiCiAKIHJlc3RhcnRfc3VzcGVuZDoKQEAgLTE5NCwxNCArMjA3LDE4IEBACiAJbGxnaAklcjIsMCglcjEpCiA3OgogCXNpZ3AJJXI5LCVyMixfX1NJR1BfU0VOU0UJLyogV2FpdCBmb3IgcmVzdW1lIENQVSAqLworCWJyYwk4LDdiCQkJLyogYWNjZXB0ZWQsIHN0YXR1cyAwLCBzdGlsbCBydW5uaW5nICovCiAJYnJjCTIsN2IJCQkvKiBidXN5LCB0cnkgYWdhaW4gKi8KIAl0bWxsCSVyOSwweDQwCQkvKiBUZXN0IGlmIHJlc3VtZSBDUFUgaXMgc3RvcHBlZCAqLwogCWp6CTdiCiAKIHJlc3RvcmVfcmVnaXN0ZXJzOgogCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCi0JbGdoaQklcjEzLDB4MTAwMAkJLyogJXIxID0gcG9pbnRlciB0byBzYXZlIGFyYWUgKi8KKwlsZ2hpCSVyMTMsMHgxMDAwCQkvKiAlcjEgPSBwb2ludGVyIHRvIHNhdmUgYXJlYSAqLwogCisJLyogSWdub3JlIHRpbWUgc3BlbnQgaW4gc3VzcGVuZGVkIHN0YXRlLiAqLworCWxsZ2YJJXIxLDB4MzE4KCVyMTMpCisJc3RjawlfX0xDX0xBU1RfVVBEQVRFX0NMT0NLKCVyMSkKIAlzcHQJMHgzMjgoJXIxMykJCS8qIHJlcHJvZ3JhbSB0aW1lciAqLwogCS8vc2NrYwkweDMzMCglcjEzKQkJLyogc2V0IGNsb2NrIGNvbXBhcmF0b3IgKi8KIApAQCAtMjI5LDkgKzI0Niw2IEBACiAJLyogTG9hZCBvbGQgc3RhY2sgKi8KIAlsZwklcjE1LDB4MmY4KCVyMTMpCiAKLQkvKiBQb2ludGVyIHRvIHNhdmUgYXJlYSAqLwotCWxnaGkJJXIxMywweDEwMDAKLQogCS8qIFJlc3RvcmUgcHJlZml4IHJlZ2lzdGVyICovCiAJc3B4CTB4MzE4KCVyMTMpCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdmRzby5jIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKaW5kZXggNDVlMTcwOC4uYWRmYjMyYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKQEAgLTc1LDcgKzc1LDcgQEAKIHN0YXRpYyB1bmlvbiB7CiAJc3RydWN0IHZkc29fZGF0YQlkYXRhOwogCXU4CQkJcGFnZVtQQUdFX1NJWkVdOwotfSB2ZHNvX2RhdGFfc3RvcmUgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLnBhZ2VfYWxpZ25lZCIpKSk7Cit9IHZkc29fZGF0YV9zdG9yZSBfX3BhZ2VfYWxpZ25lZF9kYXRhOwogc3RydWN0IHZkc29fZGF0YSAqdmRzb19kYXRhID0gJnZkc29fZGF0YV9zdG9yZS5kYXRhOwogCiAvKgpAQCAtMjQ3LDYgKzI0NywxMyBAQAogCX0KIAogCS8qCisJICogUHV0IHZEU08gYmFzZSBpbnRvIG1tIHN0cnVjdC4gV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSBjYWxsaW5nCisJICogaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcgb3IgdGhlIHBlcmYgY291bnRlciBtbWFwIHRyYWNraW5nIGNvZGUKKwkgKiB3aWxsIGZhaWwgdG8gcmVjb2duaXNlIGl0IGFzIGEgdkRTTyAoc2luY2UgYXJjaF92bWFfbmFtZSBmYWlscykuCisJICovCisJY3VycmVudC0+bW0tPmNvbnRleHQudmRzb19iYXNlID0gdmRzb19iYXNlOworCisJLyoKIAkgKiBvdXIgdm1hIGZsYWdzIGRvbid0IGhhdmUgVk1fV1JJVEUgc28gYnkgZGVmYXVsdCwgdGhlIHByb2Nlc3MKIAkgKiBpc24ndCBhbGxvd2VkIHRvIHdyaXRlIHRob3NlIHBhZ2VzLgogCSAqIGdkYiBjYW4gYnJlYWsgdGhhdCB3aXRoIHB0cmFjZSBpbnRlcmZhY2UsIGFuZCB0aHVzIHRyaWdnZXIgQ09XCkBAIC0yNjcsMTQgKzI3NCw3IEBACiAJCQkJICAgICBWTV9BTFdBWVNEVU1QLAogCQkJCSAgICAgdmRzb19wYWdlbGlzdCk7CiAJaWYgKHJjKQotCQlnb3RvIG91dF91cDsKLQotCS8qIFB1dCB2RFNPIGJhc2UgaW50byBtbSBzdHJ1Y3QgKi8KLQljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgPSB2ZHNvX2Jhc2U7Ci0KLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQlyZXR1cm4gMDsKLQorCQljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgPSAwOwogb3V0X3VwOgogCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL01ha2VmaWxlIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKaW5kZXggY2E3OGFkNi4uZDEzZTg3NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDcgQEAKIEtCVUlMRF9DRkxBR1NfMzEgOj0gJChmaWx0ZXItb3V0IC1tNjQsJChLQlVJTERfQ0ZMQUdTKSkKIEtCVUlMRF9DRkxBR1NfMzEgKz0gLW0zMSAtZlBJQyAtc2hhcmVkIC1mbm8tY29tbW9uIC1mbm8tYnVpbHRpbgogS0JVSUxEX0NGTEFHU18zMSArPSAtbm9zdGRsaWIgLVdsLC1zb25hbWU9bGludXgtdmRzbzMyLnNvLjEgXAotCQkJJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKKwkJCSQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKIAogJCh0YXJnZXRzOiU9JChvYmopLyUuZGJnKTogS0JVSUxEX0NGTEFHUyA9ICQoS0JVSUxEX0NGTEFHU18zMSkKICQodGFyZ2V0czolPSQob2JqKS8lLmRiZyk6IEtCVUlMRF9BRkxBR1MgPSAkKEtCVUlMRF9BRkxBR1NfMzEpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Zkc28zMi92ZHNvMzJfd3JhcHBlci5TIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvMzIvdmRzbzMyX3dyYXBwZXIuUwppbmRleCA2MTYzOWE4Li5hZTQyZjhjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Zkc28zMi92ZHNvMzJfd3JhcHBlci5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL3Zkc28zMl93cmFwcGVyLlMKQEAgLTEsNyArMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi0JLnNlY3Rpb24gIi5kYXRhLnBhZ2VfYWxpZ25lZCIKKwlfX1BBR0VfQUxJR05FRF9EQVRBCiAKIAkuZ2xvYmwgdmRzbzMyX3N0YXJ0LCB2ZHNvMzJfZW5kCiAJLmJhbGlnbiBQQUdFX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdmRzbzY0L01ha2VmaWxlIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUKaW5kZXggNmZjOGU4Mi4uNDQ5MzUyZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDcgQEAKIEtCVUlMRF9DRkxBR1NfNjQgOj0gJChmaWx0ZXItb3V0IC1tNjQsJChLQlVJTERfQ0ZMQUdTKSkKIEtCVUlMRF9DRkxBR1NfNjQgKz0gLW02NCAtZlBJQyAtc2hhcmVkIC1mbm8tY29tbW9uIC1mbm8tYnVpbHRpbgogS0JVSUxEX0NGTEFHU182NCArPSAtbm9zdGRsaWIgLVdsLC1zb25hbWU9bGludXgtdmRzbzY0LnNvLjEgXAotCQkJJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKKwkJCSQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKIAogJCh0YXJnZXRzOiU9JChvYmopLyUuZGJnKTogS0JVSUxEX0NGTEFHUyA9ICQoS0JVSUxEX0NGTEFHU182NCkKICQodGFyZ2V0czolPSQob2JqKS8lLmRiZyk6IEtCVUlMRF9BRkxBR1MgPSAkKEtCVUlMRF9BRkxBR1NfNjQpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Zkc282NC92ZHNvNjRfd3JhcHBlci5TIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvNjQvdmRzbzY0X3dyYXBwZXIuUwppbmRleCBkOGUyYWMxLi5jMjQ1ODQyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Zkc282NC92ZHNvNjRfd3JhcHBlci5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzY0L3Zkc282NF93cmFwcGVyLlMKQEAgLTEsNyArMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi0JLnNlY3Rpb24gIi5kYXRhLnBhZ2VfYWxpZ25lZCIKKwlfX1BBR0VfQUxJR05FRF9EQVRBCiAKIAkuZ2xvYmwgdmRzbzY0X3N0YXJ0LCB2ZHNvNjRfZW5kCiAJLmJhbGlnbiBQQUdFX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBiYzE1ZWY5Li5hNjhhYzEwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC01MSw2ICs1MSw3IEBACiAKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfZXNoYXJlZCA9IC47CQkvKiBFbmQgb2Ygc2hhcmVhYmxlIGRhdGEgKi8KKwlfc2RhdGEgPSAuOwkJLyogU3RhcnQgb2YgZGF0YSBzZWN0aW9uICovCiAKIAlFWENFUFRJT05fVEFCTEUoMTYpIDpkYXRhCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaCBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaAppbmRleCBlYzVlZWU3Li4wNmNjZTgyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCkBAIC01OCw3ICs1OCw3IEBACiBpbnQga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTE2IGNvZGUpOwogaW50IGt2bV9zMzkwX2luamVjdF9zaWdwX3N0b3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgYWN0aW9uKTsKIAotc3RhdGljIGlubGluZSBpbnQga3ZtX3MzOTBfdmNwdV9nZXRfbWVtc2l6ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW5saW5lIGxvbmcga3ZtX3MzOTBfdmNwdV9nZXRfbWVtc2l6ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nbXNsbQogCQktIHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nbXNvcgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi9kZWxheS5jIGIvYXJjaC9zMzkwL2xpYi9kZWxheS5jCmluZGV4IDk3YzFlY2EuLjc1MmIzNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvZGVsYXkuYworKysgYi9hcmNoL3MzOTAvbGliL2RlbGF5LmMKQEAgLTI1LDEzICsyNSwxMyBAQAogCWFzbSB2b2xhdGlsZSgiMDogYnJjdCAlMCwwYiIgOiA6ICJkIiAoKGxvb3BzLzIpICsgMSkpOwogfQogCi1zdGF0aWMgdm9pZCBfX3VkZWxheV9kaXNhYmxlZCh1bnNpZ25lZCBsb25nIHVzZWNzKQorc3RhdGljIHZvaWQgX191ZGVsYXlfZGlzYWJsZWQodW5zaWduZWQgbG9uZyBsb25nIHVzZWNzKQogewogCXVuc2lnbmVkIGxvbmcgbWFzaywgY3IwLCBjcjBfc2F2ZWQ7CiAJdTY0IGNsb2NrX3NhdmVkOwogCiAJY2xvY2tfc2F2ZWQgPSBsb2NhbF90aWNrX2Rpc2FibGUoKTsKLQlzZXRfY2xvY2tfY29tcGFyYXRvcihnZXRfY2xvY2soKSArICgodTY0KSB1c2VjcyA8PCAxMikpOworCXNldF9jbG9ja19jb21wYXJhdG9yKGdldF9jbG9jaygpICsgKHVzZWNzIDw8IDEyKSk7CiAJX19jdGxfc3RvcmUoY3IwX3NhdmVkLCAwLCAwKTsKIAljcjAgPSAoY3IwX3NhdmVkICYgMHhmZmZmMDBlMCkgfCAweDAwMDAwODAwOwogCV9fY3RsX2xvYWQoY3IwICwgMCwgMCk7CkBAIC00NiwyMCArNDYsMjUgQEAKIAlzZXRfY2xvY2tfY29tcGFyYXRvcihTMzkwX2xvd2NvcmUuY2xvY2tfY29tcGFyYXRvcik7CiB9CiAKLXN0YXRpYyB2b2lkIF9fdWRlbGF5X2VuYWJsZWQodW5zaWduZWQgbG9uZyB1c2VjcykKK3N0YXRpYyB2b2lkIF9fdWRlbGF5X2VuYWJsZWQodW5zaWduZWQgbG9uZyBsb25nIHVzZWNzKQogewogCXVuc2lnbmVkIGxvbmcgbWFzazsKLQl1NjQgZW5kLCB0aW1lOworCXU2NCBjbG9ja19zYXZlZDsKKwl1NjQgZW5kOwogCiAJbWFzayA9IHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX1dBSVQgfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19JTzsKLQllbmQgPSBnZXRfY2xvY2soKSArICgodTY0KSB1c2VjcyA8PCAxMik7CisJZW5kID0gZ2V0X2Nsb2NrKCkgKyAodXNlY3MgPDwgMTIpOwogCWRvIHsKLQkJdGltZSA9IGVuZCA8IFMzOTBfbG93Y29yZS5jbG9ja19jb21wYXJhdG9yID8KLQkJCWVuZCA6IFMzOTBfbG93Y29yZS5jbG9ja19jb21wYXJhdG9yOwotCQlzZXRfY2xvY2tfY29tcGFyYXRvcih0aW1lKTsKKwkJY2xvY2tfc2F2ZWQgPSAwOworCQlpZiAoZW5kIDwgUzM5MF9sb3djb3JlLmNsb2NrX2NvbXBhcmF0b3IpIHsKKwkJCWNsb2NrX3NhdmVkID0gbG9jYWxfdGlja19kaXNhYmxlKCk7CisJCQlzZXRfY2xvY2tfY29tcGFyYXRvcihlbmQpOworCQl9CiAJCXRyYWNlX2hhcmRpcnFzX29uKCk7CiAJCV9fbG9hZF9wc3dfbWFzayhtYXNrKTsKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJaWYgKGNsb2NrX3NhdmVkKQorCQkJbG9jYWxfdGlja19lbmFibGUoY2xvY2tfc2F2ZWQpOwogCX0gd2hpbGUgKGdldF9jbG9jaygpIDwgZW5kKTsKIAlzZXRfY2xvY2tfY29tcGFyYXRvcihTMzkwX2xvd2NvcmUuY2xvY2tfY29tcGFyYXRvcik7CiB9CkBAIC02Nyw3ICs3Miw3IEBACiAvKgogICogV2FpdHMgZm9yICd1c2VjcycgbWljcm9zZWNvbmRzIHVzaW5nIHRoZSBUT0QgY2xvY2sgY29tcGFyYXRvci4KICAqLwotdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQordm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIGxvbmcgdXNlY3MpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTAxLDExICsxMDYsMTEgQEAKICAqIFNpbXBsZSB1ZGVsYXkgdmFyaWFudC4gVG8gYmUgdXNlZCBvbiBzdGFydHVwIGFuZCByZWJvb3QKICAqIHdoZW4gdGhlIGludGVycnVwdCBoYW5kbGVyIGlzbid0IHdvcmtpbmcuCiAgKi8KLXZvaWQgdWRlbGF5X3NpbXBsZSh1bnNpZ25lZCBsb25nIHVzZWNzKQordm9pZCB1ZGVsYXlfc2ltcGxlKHVuc2lnbmVkIGxvbmcgbG9uZyB1c2VjcykKIHsKIAl1NjQgZW5kOwogCi0JZW5kID0gZ2V0X2Nsb2NrKCkgKyAoKHU2NCkgdXNlY3MgPDwgMTIpOworCWVuZCA9IGdldF9jbG9jaygpICsgKHVzZWNzIDw8IDEyKTsKIAl3aGlsZSAoZ2V0X2Nsb2NrKCkgPCBlbmQpCiAJCWNwdV9yZWxheCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX212Y29zLmMgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwppbmRleCAzZjE1YWFmLi41OGRhM2Y0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwpAQCAtMzYsNyArMzYsNyBAQAogCXRtcDEgPSAtNDA5NlVMOwogCWFzbSB2b2xhdGlsZSgKIAkJIjA6IC5pbnNuIHNzLDB4YzgwMDAwMDAwMDAwLDAoJTAsJTIpLDAoJTEpLDBcbiIKLQkJIiAgIGp6ICAgIDdmXG4iCisJCSI5OiBqeiAgICA3ZlxuIgogCQkiMToiQUxSIiAgJTAsJTNcbiIKIAkJIiAgIlNMUiIgICUxLCUzXG4iCiAJCSIgICJTTFIiICAlMiwlM1xuIgpAQCAtNDcsNyArNDcsNyBAQAogCQkiICAiQ0xSIiAgJTAsJTRcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KIAkJIiAgIGpuaCAgIDRmXG4iCiAJCSIzOiAuaW5zbiBzcywweGM4MDAwMDAwMDAwMCwwKCU0LCUyKSwwKCUxKSwwXG4iCi0JCSIgICJTTFIiICAlMCwlNFxuIgorCQkiMTA6IlNMUiIgICUwLCU0XG4iCiAJCSIgICJBTFIiICAlMiwlNFxuIgogCQkiNDoiTEhJIiAgJTQsLTFcbiIKIAkJIiAgIkFMUiIgICU0LCUwXG4iCS8qIGNvcHkgcmVtYWluaW5nIHNpemUsIHN1YnRyYWN0IDEgKi8KQEAgLTYxLDcgKzYxLDcgQEAKIAkJIiAgIGogICAgIDhmXG4iCiAJCSI3OiJTTFIiICAlMCwlMFxuIgogCQkiODogXG4iCi0JCUVYX1RBQkxFKDBiLDJiKSBFWF9UQUJMRSgzYiw0YikKKwkJRVhfVEFCTEUoMGIsMmIpIEVYX1RBQkxFKDNiLDRiKSBFWF9UQUJMRSg5YiwyYikgRVhfVEFCTEUoMTBiLDRiKQogCQk6ICIrYSIgKHNpemUpLCAiK2EiIChwdHIpLCAiK2EiICh4KSwgIithIiAodG1wMSksICI9YSIgKHRtcDIpCiAJCTogImQiIChyZWcwKSA6ICJjYyIsICJtZW1vcnkiKTsKIAlyZXR1cm4gc2l6ZTsKQEAgLTgyLDcgKzgyLDcgQEAKIAl0bXAxID0gLTQwOTZVTDsKIAlhc20gdm9sYXRpbGUoCiAJCSIwOiAuaW5zbiBzcywweGM4MDAwMDAwMDAwMCwwKCUwLCUxKSwwKCUyKSwwXG4iCi0JCSIgICBqeiAgICA0ZlxuIgorCQkiNjoganogICAgNGZcbiIKIAkJIjE6IkFMUiIgICUwLCUzXG4iCiAJCSIgICJTTFIiICAlMSwlM1xuIgogCQkiICAiU0xSIiAgJTIsJTNcbiIKQEAgLTkzLDExICs5MywxMSBAQAogCQkiICAiQ0xSIiAgJTAsJTRcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KIAkJIiAgIGpuaCAgIDVmXG4iCiAJCSIzOiAuaW5zbiBzcywweGM4MDAwMDAwMDAwMCwwKCU0LCUxKSwwKCUyKSwwXG4iCi0JCSIgICJTTFIiICAlMCwlNFxuIgorCQkiNzoiU0xSIiAgJTAsJTRcbiIKIAkJIiAgIGogICAgIDVmXG4iCiAJCSI0OiJTTFIiICAlMCwlMFxuIgogCQkiNTogXG4iCi0JCUVYX1RBQkxFKDBiLDJiKSBFWF9UQUJMRSgzYiw1YikKKwkJRVhfVEFCTEUoMGIsMmIpIEVYX1RBQkxFKDNiLDViKSBFWF9UQUJMRSg2YiwyYikgRVhfVEFCTEUoN2IsNWIpCiAJCTogIithIiAoc2l6ZSksICIrYSIgKHB0ciksICIrYSIgKHgpLCAiK2EiICh0bXAxKSwgIj1hIiAodG1wMikKIAkJOiAiZCIgKHJlZzApIDogImNjIiwgIm1lbW9yeSIpOwogCXJldHVybiBzaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3N0ZC5jIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3N0ZC5jCmluZGV4IGQyZmZiYWQuLjA3ZGVhZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvdWFjY2Vzc19zdGQuYworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3Nfc3RkLmMKQEAgLTM2LDEyICszNiwxMiBAQAogCXRtcDEgPSAtMjU2VUw7CiAJYXNtIHZvbGF0aWxlKAogCQkiMDogbXZjcCAgMCglMCwlMiksMCglMSksJTNcbiIKLQkJIiAgIGp6ICAgIDhmXG4iCisJCSIxMDpqeiAgICA4ZlxuIgogCQkiMToiQUxSIiAgJTAsJTNcbiIKIAkJIiAgIGxhICAgICUxLDI1NiglMSlcbiIKIAkJIiAgIGxhICAgICUyLDI1NiglMilcbiIKIAkJIjI6IG12Y3AgIDAoJTAsJTIpLDAoJTEpLCUzXG4iCi0JCSIgICBqbnogICAxYlxuIgorCQkiMTE6am56ICAgMWJcbiIKIAkJIiAgIGogICAgIDhmXG4iCiAJCSIzOiBsYSAgICAlNCwyNTUoJTEpXG4iCS8qICU0ID0gcHRyICsgMjU1ICovCiAJCSIgICJMSEkiICAlMywtNDA5NlxuIgpAQCAtNTAsNyArNTAsNyBAQAogCQkiICAiQ0xSIiAgJTAsJTRcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KIAkJIiAgIGpuaCAgIDVmXG4iCiAJCSI0OiBtdmNwICAwKCU0LCUyKSwwKCUxKSwlM1xuIgotCQkiICAiU0xSIiAgJTAsJTRcbiIKKwkJIjEyOiJTTFIiICAlMCwlNFxuIgogCQkiICAiQUxSIiAgJTIsJTRcbiIKIAkJIjU6IkxISSIgICU0LC0xXG4iCiAJCSIgICJBTFIiICAlNCwlMFxuIgkvKiBjb3B5IHJlbWFpbmluZyBzaXplLCBzdWJ0cmFjdCAxICovCkBAIC02NSw2ICs2NSw3IEBACiAJCSI4OiJTTFIiICAlMCwlMFxuIgogCQkiOTogXG4iCiAJCUVYX1RBQkxFKDBiLDNiKSBFWF9UQUJMRSgyYiwzYikgRVhfVEFCTEUoNGIsNWIpCisJCUVYX1RBQkxFKDEwYiwzYikgRVhfVEFCTEUoMTFiLDNiKSBFWF9UQUJMRSgxMmIsNWIpCiAJCTogIithIiAoc2l6ZSksICIrYSIgKHB0ciksICIrYSIgKHgpLCAiK2EiICh0bXAxKSwgIj1hIiAodG1wMikKIAkJOiA6ICJjYyIsICJtZW1vcnkiKTsKIAlyZXR1cm4gc2l6ZTsKQEAgLTg1LDEyICs4NiwxMiBAQAogCXRtcDEgPSAtMjU2VUw7CiAJYXNtIHZvbGF0aWxlKAogCQkiMDogbXZjcyAgMCglMCwlMSksMCglMiksJTNcbiIKLQkJIiAgIGp6ICAgIDVmXG4iCisJCSI3OiBqeiAgICA1ZlxuIgogCQkiMToiQUxSIiAgJTAsJTNcbiIKIAkJIiAgIGxhICAgICUxLDI1NiglMSlcbiIKIAkJIiAgIGxhICAgICUyLDI1NiglMilcbiIKIAkJIjI6IG12Y3MgIDAoJTAsJTEpLDAoJTIpLCUzXG4iCi0JCSIgICBqbnogICAxYlxuIgorCQkiODogam56ICAgMWJcbiIKIAkJIiAgIGogICAgIDVmXG4iCiAJCSIzOiBsYSAgICAlNCwyNTUoJTEpXG4iIC8qICU0ID0gcHRyICsgMjU1ICovCiAJCSIgICJMSEkiICAlMywtNDA5NlxuIgpAQCAtOTksMTEgKzEwMCwxMiBAQAogCQkiICAiQ0xSIiAgJTAsJTRcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KIAkJIiAgIGpuaCAgIDZmXG4iCiAJCSI0OiBtdmNzICAwKCU0LCUxKSwwKCUyKSwlM1xuIgotCQkiICAiU0xSIiAgJTAsJTRcbiIKKwkJIjk6IlNMUiIgICUwLCU0XG4iCiAJCSIgICBqICAgICA2ZlxuIgogCQkiNToiU0xSIiAgJTAsJTBcbiIKIAkJIjY6IFxuIgogCQlFWF9UQUJMRSgwYiwzYikgRVhfVEFCTEUoMmIsM2IpIEVYX1RBQkxFKDRiLDZiKQorCQlFWF9UQUJMRSg3YiwzYikgRVhfVEFCTEUoOGIsM2IpIEVYX1RBQkxFKDliLDZiKQogCQk6ICIrYSIgKHNpemUpLCAiK2EiIChwdHIpLCAiK2EiICh4KSwgIithIiAodG1wMSksICI9YSIgKHRtcDIpCiAJCTogOiAiY2MiLCAibWVtb3J5Iik7CiAJcmV0dXJuIHNpemU7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vY21tLmMgYi9hcmNoL3MzOTAvbW0vY21tLmMKaW5kZXggNDEzYzI0MC4uYjIwMTEzNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2NtbS5jCisrKyBiL2FyY2gvczM5MC9tbS9jbW0uYwpAQCAtMjYyLDcgKzI2Miw3IEBACiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBjbW1fdGFibGVbXTsKIAogc3RhdGljIGludAotY21tX3BhZ2VzX2hhbmRsZXIoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitjbW1fcGFnZXNfaGFuZGxlcihjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAogCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWNoYXIgYnVmWzE2XSwgKnA7CkBAIC0zMDMsNyArMzAzLDcgQEAKIH0KIAogc3RhdGljIGludAotY21tX3RpbWVvdXRfaGFuZGxlcihjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2NtbV90aW1lb3V0X2hhbmRsZXIoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWNoYXIgYnVmWzY0XSwgKnA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwppbmRleCBjNjBiZmIzLi4yNzU3YzU2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKQEAgLTI3OSw3ICsyNzksMTAgQEAKIAkvKiBsZXRzIGNoZWNrIGlmIHdlIGFyZSBhbGxvd2VkIHRvIHJlcGxhY2UgdGhlIG1tICovCiAJdGFza19sb2NrKHRzayk7CiAJaWYgKCF0c2stPm1tIHx8IGF0b21pY19yZWFkKCZ0c2stPm1tLT5tbV91c2VycykgPiAxIHx8Ci0JICAgIHRzay0+bW0gIT0gdHNrLT5hY3RpdmVfbW0gfHwgIWhsaXN0X2VtcHR5KCZ0c2stPm1tLT5pb2N0eF9saXN0KSkgeworI2lmZGVmIENPTkZJR19BSU8KKwkgICAgIWhsaXN0X2VtcHR5KCZ0c2stPm1tLT5pb2N0eF9saXN0KSB8fAorI2VuZGlmCisJICAgIHRzay0+bW0gIT0gdHNrLT5hY3RpdmVfbW0pIHsKIAkJdGFza191bmxvY2sodHNrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjk1LDcgKzI5OCwxMCBAQAogCS8qIE5vdyBsZXRzIGNoZWNrIGFnYWluIGlmIHNvbWV0aGluZyBoYXBwZW5lZCAqLwogCXRhc2tfbG9jayh0c2spOwogCWlmICghdHNrLT5tbSB8fCBhdG9taWNfcmVhZCgmdHNrLT5tbS0+bW1fdXNlcnMpID4gMSB8fAotCSAgICB0c2stPm1tICE9IHRzay0+YWN0aXZlX21tIHx8ICFobGlzdF9lbXB0eSgmdHNrLT5tbS0+aW9jdHhfbGlzdCkpIHsKKyNpZmRlZiBDT05GSUdfQUlPCisJICAgICFobGlzdF9lbXB0eSgmdHNrLT5tbS0+aW9jdHhfbGlzdCkgfHwKKyNlbmRpZgorCSAgICB0c2stPm1tICE9IHRzay0+YWN0aXZlX21tKSB7CiAJCW1tcHV0KG1tKTsKIAkJdGFza191bmxvY2sodHNrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvc2NvcmUva2VybmVsL2luaXRfdGFzay5jCmluZGV4IGZmOTUyZjYuLmJhYTAzZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2NvcmUva2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvc2NvcmUva2VybmVsL2luaXRfdGFzay5jCkBAIC0zNCw5ICszNCw4IEBACiAgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCiAgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KICAqLwotdW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpLCBfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKSA9Ci0JCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07Cit1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gX19pbml0X3Rhc2tfZGF0YSA9CisJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKIAogLyoKICAqIEluaXRpYWwgdGFzayBzdHJ1Y3R1cmUuCmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggYjk0MDQyNC4uODhjZGViOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMzcsNyArMzcsNiBAQAogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVAotCXNlbGVjdCBIQVZFX0ZUUkFDRV9TWVNDQUxMUwogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgogCXNlbGVjdCBIQVZFX0FSQ0hfS0dEQgogCXNlbGVjdCBBUkNIX0hJQkVSTkFUSU9OX1BPU1NJQkxFIGlmIE1NVQpAQCAtMTIyLDYgKzEyMSw5IEBACiAJYm9vbAogCXNlbGVjdCBBUkNIX1NVU1BFTkRfUE9TU0lCTEUKIAorY29uZmlnIFNZU19TVVBQT1JUU19IVUdFVExCRlMKKwlib29sCisKIGNvbmZpZyBTWVNfU1VQUE9SVFNfU01QCiAJYm9vbAogCkBAIC0xOTYsNiArMTk4LDcgQEAKIAlzZWxlY3QgQ1BVX0hBU19TUl9SQgogCXNlbGVjdCBDUFVfSEFTX0ZQVSBpZiAhQ1BVX1NINEFMX0RTUAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfVE1VCisJc2VsZWN0IFNZU19TVVBQT1JUU19IVUdFVExCRlMgaWYgTU1VCiAKIGNvbmZpZyBDUFVfU0g0QQogCWJvb2wKQEAgLTIxMCw2ICsyMTMsNyBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19GUFUKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX1RNVQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfSFVHRVRMQkZTIGlmIE1NVQogCiBjb25maWcgQ1BVX1NIWDIKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL3NoL01ha2VmaWxlIGIvYXJjaC9zaC9NYWtlZmlsZQppbmRleCBmYzUxYTkxLi42NmU0MGFhIDEwMDY0NAotLS0gYS9hcmNoL3NoL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvTWFrZWZpbGUKQEAgLTE5OSw3ICsxOTksNyBAQAogbGlicy0kKENPTkZJR19TVVBFUkgzMikJCTo9IGFyY2gvc2gvbGliLwkkKGxpYnMteSkKIGxpYnMtJChDT05GSUdfU1VQRVJINjQpCQk6PSBhcmNoL3NoL2xpYjY0LyAkKGxpYnMteSkKIAotQk9PVF9UQVJHRVRTID0gdUltYWdlIHVJbWFnZS5iejIgdUltYWdlLmd6IHVJbWFnZS5sem1hIHVJbWFnZS5zcmVjIFwKK0JPT1RfVEFSR0VUUyA9IHVJbWFnZSB1SW1hZ2UuYnoyIHVJbWFnZS5neiB1SW1hZ2UubHptYSB1SW1hZ2Uuc3JlYyB1SW1hZ2UuYmluIFwKIAkgICAgICAgekltYWdlIHZtbGludXguc3JlYyByb21JbWFnZQogUEhPTlkgKz0gbWFrZXRvb2xzICQoQk9PVF9UQVJHRVRTKSBGT1JDRQogCkBAIC0yMjUsNiArMjI1LDcgQEAKIAlAZWNobyAnICB2bWxpbnV4LnNyZWMJICAgICAgICAgICAtIENyZWF0ZSBhbiBFTEYgUy1yZWNvcmQnCiAJQGVjaG8gJyogdUltYWdlICAJICAgICAgICAgICAtIEFsaWFzIHRvIGJvb3RhYmxlIFUtQm9vdCBpbWFnZScKIAlAZWNobyAnICB1SW1hZ2Uuc3JlYwkgICAgICAgICAgIC0gQ3JlYXRlIGFuIFMtcmVjb3JkIGZvciBVLUJvb3QnCisJQGVjaG8gJyAgdUltYWdlLmJpbgkgICAgICAgICAgIC0gS2VybmVsLW9ubHkgaW1hZ2UgZm9yIFUtQm9vdCAoYmluKScKIAlAZWNobyAnKiB1SW1hZ2UuZ3oJICAgICAgICAgICAtIEtlcm5lbC1vbmx5IGltYWdlIGZvciBVLUJvb3QgKGd6aXApJwogCUBlY2hvICcgIHVJbWFnZS5iejIJICAgICAgICAgICAtIEtlcm5lbC1vbmx5IGltYWdlIGZvciBVLUJvb3QgKGJ6aXAyKScKIAlAZWNobyAnICB1SW1hZ2UubHptYQkgICAgICAgICAgIC0gS2VybmVsLW9ubHkgaW1hZ2UgZm9yIFUtQm9vdCAobHptYSknCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1tYWdpY3BhbmVscjIuYyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLW1hZ2ljcGFuZWxyMi5jCmluZGV4IDBhMzdjOGIuLjk5ZmZjNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLW1hZ2ljcGFuZWxyMi5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLW1hZ2ljcGFuZWxyMi5jCkBAIC0yMDUsOCArMjA1LDYgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG1wcjJfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKIHsKLQlfX3NldF9pb19wb3J0X2Jhc2UoMHhhMDAwMDAwMCk7Ci0KIAkvKiBzZXQgUGluIFNlbGVjdCBSZWdpc3RlciBBOgogCSAqIC9QQ0NfQ0QxLCAvUENDX0NEMiwgIFBDQ19CVkQxLCBQQ0NfQlZEMiwKIAkgKiAvSU9JUzE2LCAgSVJRNCwJSVJRNSwJICBVU0IxZF9TVVNQRU5ECmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWRyZWFtY2FzdC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1kcmVhbWNhc3Qvc2V0dXAuYwppbmRleCBlYmU5OTIyLi5hNGI3NDAyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWRyZWFtY2FzdC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZHJlYW1jYXN0L3NldHVwLmMKQEAgLTQyLDggKzQyLDYgQEAKIAkvKiBBY2tub3dsZWRnZSBhbnkgcHJldmlvdXMgZXZlbnRzICovCiAJLyogWFhYICovCiAKLQlfX3NldF9pb19wb3J0X2Jhc2UoMHhhMDAwMDAwMCk7Ci0KIAkvKiBBc3NpZ24gYWxsIHZpcnR1YWwgSVJRcyB0byB0aGUgU3lzdGVtIEFTSUMgaW50LiBoYW5kbGVyICovCiAJZm9yIChpID0gSFdfRVZFTlRfSVJRX0JBU0U7IGkgPCBIV19FVkVOVF9JUlFfTUFYOyBpKyspCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmc3lzdGVtYXNpY19pbnQsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKaW5kZXggOTZiYzE2OS4uM2IxY2ViNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3I4YTY2NTk3Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3RzYzIwMDcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NldS5oPgpAQCAtMzgsNiArMzksMjAgQEAKICAqICAweDE4MDBfMDAwMCAgTUZJICAgICAgICAgICAgICAxNmJpdAogICovCiAKKy8qIFNXSVRDSAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERTMlsxXSA9IEZsYXNoUk9NIHdyaXRlIHByb3RlY3QgIE9OICAgICA6IHdyaXRlIHByb3RlY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRiAgICA6IE5vIHdyaXRlIHByb3RlY3QKKyAqIERTMlsyXSA9IFJNSUkgLyBUUywgU0NJRiAgICAgICAgIE9OICAgICA6IFJNSUkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRiAgICA6IFRTLCBTQ0lGMworICogRFMyWzNdID0gQ2FtZXJhIC8gVmlkZW8gICAgICAgICAgT04gICAgIDogQ2FtZXJhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkYgICAgOiBOVFNDL1BBTCAoSU4pCisgKiBEUzJbNV0gPSBOVFNDX09VVCBDbG9jayAgICAgICAgICBPTiAgICAgOiBPbiBib2FyZCBPU0MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRiAgICA6IFNINzcyNCBEVl9DTEsKKyAqIERTMls2LTddID0gTU1DIC8gU0QgICAgICAgICAgICAgIE9OLU9GRiA6IFNECisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkYtT04gOiBNTUMKKyAqLworCiAvKiBIZWFydGJlYXQgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGxlZF9wb3NbXSA9IHsgMCwgMSwgMiwgMyB9Owogc3RhdGljIHN0cnVjdCBoZWFydGJlYXRfZGF0YSBoZWFydGJlYXRfZGF0YSA9IHsKQEAgLTcwLDcgKzg1LDcgQEAKIAkJLm5hbWUgPSAiYm9vdCBsb2FkZXIiLAogCQkub2Zmc2V0ID0gMCwKIAkJLnNpemUgPSAoNSAqIDEwMjQgKiAxMDI0KSwKLQkJLm1hc2tfZmxhZ3MgPSBNVERfQ0FQX1JPTSwKKwkJLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFLCAgLyogZm9yY2UgcmVhZC1vbmx5ICovCiAJfSwgewogCQkubmFtZSA9ICJmcmVlLWFyZWEiLAogCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELApAQCAtMTIxLDYgKzEzNiw3IEBACiBzdHJ1Y3Qgc2hfZXRoX3BsYXRfZGF0YSBzaF9ldGhfcGxhdCA9IHsKIAkucGh5ID0gMHgxZiwgLyogU01TQyBMQU44NzAwICovCiAJLmVkbWFjX2VuZGlhbiA9IEVETUFDX0xJVFRMRV9FTkRJQU4sCisJLmV0aGVyX2xpbmtfYWN0aXZlX2xvdyA9IDEKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNoX2V0aF9kZXZpY2UgPSB7CkBAIC0zNzUsNiArMzkxLDQzIEBACiAJfSwKIH07CiAKKy8qIFRvdWNoU2NyZWVuICovCisjZGVmaW5lIElSUTAgMzIKK3N0YXRpYyBpbnQgdHNfZ2V0X3BlbmRvd25fc3RhdGUodm9pZCkKK3sKKwlpbnQgdmFsID0gMDsKKwlncGlvX2ZyZWUoR1BJT19GTl9JTlRDX0lSUTApOworCWdwaW9fcmVxdWVzdChHUElPX1BUWjAsIE5VTEwpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fUFRaMCk7CisKKwl2YWwgPSBncGlvX2dldF92YWx1ZShHUElPX1BUWjApOworCisJZ3Bpb19mcmVlKEdQSU9fUFRaMCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fSU5UQ19JUlEwLCBOVUxMKTsKKworCXJldHVybiB2YWwgPyAwIDogMTsKK30KKworc3RhdGljIGludCB0c19pbml0KHZvaWQpCit7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fSU5UQ19JUlEwLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHRzYzIwMDdfcGxhdGZvcm1fZGF0YSB0c2MyMDA3X2luZm8gPSB7CisJLm1vZGVsCQkJPSAyMDA3LAorCS54X3BsYXRlX29obXMJCT0gMTgwLAorCS5nZXRfcGVuZG93bl9zdGF0ZQk9IHRzX2dldF9wZW5kb3duX3N0YXRlLAorCS5pbml0X3BsYXRmb3JtX2h3CT0gdHNfaW5pdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gdHNfaTJjX2NsaWVudHMgPSB7CisJSTJDX0JPQVJEX0lORk8oInRzYzIwMDciLCAweDQ4KSwKKwkudHlwZQkJPSAidHNjMjAwNyIsCisJLnBsYXRmb3JtX2RhdGEJPSAmdHNjMjAwN19pbmZvLAorCS5pcnEJCT0gSVJRMCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICplY292ZWNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmhlYXJ0YmVhdF9kZXZpY2UsCiAJJm5vcl9mbGFzaF9kZXZpY2UsCkBAIC00NTksNiArNTEyLDExIEBACiAjZGVmaW5lIElPRFJJVkVBICAweEE0MDUwMThBCiBzdGF0aWMgaW50IF9faW5pdCBhcmNoX3NldHVwKHZvaWQpCiB7CisJLyogZW5hYmxlIFNUQVRVUzAsIFNUQVRVUzIgYW5kIFBEU1RBVFVTICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU1RBVFVTMCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU1RBVFVTMiwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fUERTVEFUVVMsIE5VTEwpOworCiAJLyogZW5hYmxlIFNDSUZBMCAqLwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUYwX1RYRCwgTlVMTCk7CiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRjBfUlhELCBOVUxMKTsKQEAgLTU4OSw2ICs2NDcsMTAgQEAKIAkJICovCiAJCWdwaW9fcmVxdWVzdChHUElPX1BURjQsIE5VTEwpOwogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QVEY0LCAxKTsKKworCQkvKiBlbmFibGUgVG91Y2hTY3JlZW4gKi8KKwkJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgJnRzX2kyY19jbGllbnRzLCAxKTsKKwkJc2V0X2lycV90eXBlKElSUTAsIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJfQogCiAJLyogZW5hYmxlIENFVTAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtbGFuZGlzay9naW8uYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtbGFuZGlzay9naW8uYwppbmRleCAyNWNkZjczLi41MjgwMTMxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWxhbmRpc2svZ2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1sYW5kaXNrL2dpby5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTM1LDcgKzM0LDcgQEAKIAlpbnQgbWlub3I7CiAJaW50IHJldCA9IC1FTk9FTlQ7CiAKLQlsb2NrX2tlcm5lbCgpOworCXByZWVtcHRfZGlzYWJsZSgpOwogCW1pbm9yID0gTUlOT1IoaW5vZGUtPmlfcmRldik7CiAJaWYgKG1pbm9yIDwgREVWQ09VTlQpIHsKIAkJaWYgKG9wZW5DbnQgPiAwKSB7CkBAIC00NSw3ICs0NCw3IEBACiAJCQlyZXQgPSAwOwogCQl9CiAJfQotCXVubG9ja19rZXJuZWwoKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYwLDggKzU5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgZ2lvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAl1bnNpZ25lZCBpbnQgZGF0YTsKIAlzdGF0aWMgdW5zaWduZWQgaW50IGFkZHIgPSAwOwpAQCAtMTI5LDcgKzEyNyw3IEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm9wZW4gPSBnaW9fb3BlbiwJLyogb3BlbiAqLwogCS5yZWxlYXNlID0gZ2lvX2Nsb3NlLAkvKiByZWxlYXNlICovCi0JLmlvY3RsID0gZ2lvX2lvY3RsLAkvKiBpb2N0bCAqLworCS51bmxvY2tlZF9pb2N0bCA9IGdpb19pb2N0bCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdpb19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXJzay9kZXZpY2VzLXJzazcyMDMuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtcnNrL2RldmljZXMtcnNrNzIwMy5jCmluZGV4IDRhZjNhNzcuLmMzNzYxN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtcnNrL2RldmljZXMtcnNrNzIwMy5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtcnNrL2RldmljZXMtcnNrNzIwMy5jCkBAIC0xMSwxMCArMTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1yc2svc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtcnNrL3NldHVwLmMKaW5kZXggYWY2NGQwMy4uYTVjMGRmNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1yc2svc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXJzay9zZXR1cC5jCkBAIC0xNSwxNCArMTUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2lmZGVmIENPTkZJR19NVEQKICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjZW5kaWYKICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1zdGF0aWMgY29uc3QgY2hhciAqcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJzZWRfcGFydGl0aW9uczsKLQogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHJza19wYXJ0aXRpb25zW10gPSB7CiAJewogCQkubmFtZQkJPSAiQm9vdGxvYWRlciIsCkBAIC00MSw2ICszOSw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBmbGFzaF9kYXRhID0geworCS5wYXJ0cwkJPSByc2tfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKHJza19wYXJ0aXRpb25zKSwKIAkud2lkdGgJCT0gMiwKIH07CiAKQEAgLTYwLDcgKzYwLDggQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqZmxhc2hfbXRkOworI2lmZGVmIENPTkZJR19NVEQKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwogCiBzdGF0aWMgc3RydWN0IG1hcF9pbmZvIHJza19mbGFzaF9tYXAgPSB7CiAJLm5hbWUJCT0gIlJTSysgRmxhc2giLApAQCAtNjgsNiArNjksMTAgQEAKIAkuYmFua3dpZHRoCT0gMiwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKmZsYXNoX210ZDsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJzZWRfcGFydGl0aW9uczsKKwogc3RhdGljIHZvaWQgX19pbml0IHNldF9tdGRfcGFydGl0aW9ucyh2b2lkKQogewogCWludCBucl9wYXJ0cyA9IDA7CkBAIC03NywxNCArODIsMTQgQEAKIAlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGZsYXNoX210ZCwgcHJvYmVzLAogCQkJCQkmcGFyc2VkX3BhcnRpdGlvbnMsIDApOwogCS8qIElmIHRoZXJlIGlzIG5vIHBhcnRpdGlvbiB0YWJsZSwgdXNlZCB0aGUgaGFyZCBjb2RlZCB0YWJsZSAqLwotCWlmIChucl9wYXJ0cyA8PSAwKSB7Ci0JCWZsYXNoX2RhdGEucGFydHMgPSByc2tfcGFydGl0aW9uczsKLQkJZmxhc2hfZGF0YS5ucl9wYXJ0cyA9IEFSUkFZX1NJWkUocnNrX3BhcnRpdGlvbnMpOwotCX0gZWxzZSB7CisJaWYgKG5yX3BhcnRzID4gMCkgewogCQlmbGFzaF9kYXRhLm5yX3BhcnRzID0gbnJfcGFydHM7CiAJCWZsYXNoX2RhdGEucGFydHMgPSBwYXJzZWRfcGFydGl0aW9uczsKIAl9CiB9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNldF9tdGRfcGFydGl0aW9ucyh2b2lkKSB7fQorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpyc2tfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmZsYXNoX2RldmljZSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKaW5kZXggMDA5NzNlMC4uZTc4YzNiZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvcjhhNjY1OTcuaD4KICNpbmNsdWRlIDx2aWRlby9zaF9tb2JpbGVfbGNkYy5oPgogI2luY2x1ZGUgPG1lZGlhL3NoX21vYmlsZV9jZXUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zaF9mc2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaGVhcnRiZWF0Lmg+CiAjaW5jbHVkZSA8YXNtL3NoX2V0aC5oPgpAQCAtMjU1LDYgKzI1Niw2NSBAQAogCX0sCiB9OwogCisvKiBGU0kgKi8KKy8qCisgKiBGU0ktQSB1c2UgZXh0ZXJuYWwgY2xvY2sgd2hpY2ggY2FtZSBmcm9tIGFrNDY0eC4KKyAqIFNvLCB3ZSBzaG91bGQgY2hhbmdlIHBhcmVudCBvZiBmc2kKKyAqLworI2RlZmluZSBGQ0xLQUNSCQkweGE0MTUwMDA4CitzdGF0aWMgdm9pZCBmc2ltY2tfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHN0YXR1cyA9IGN0cmxfaW5sKGNsay0+ZW5hYmxlX3JlZyk7CisKKwkvKiB1c2UgZXh0ZXJuYWwgY2xvY2sgKi8KKwlzdGF0dXMgJj0gfjB4MDAwMDAwZmY7CisJc3RhdHVzIHw9IDB4MDAwMDAwODA7CisJY3RybF9vdXRsKHN0YXR1cywgY2xrLT5lbmFibGVfcmVnKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIGZzaW1ja19jbGtfb3BzID0geworCS5pbml0ID0gZnNpbWNrX2luaXQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBmc2ltY2thX2NsayA9IHsKKwkubmFtZQkJPSAiZnNpbWNrYV9jbGsiLAorCS5pZAkJPSAtMSwKKwkub3BzCQk9ICZmc2ltY2tfY2xrX29wcywKKwkuZW5hYmxlX3JlZwk9ICh2b2lkIF9faW9tZW0gKilGQ0xLQUNSLAorCS5yYXRlCQk9IDAsIC8qIHVua25vd24gKi8KK307CisKK3N0cnVjdCBzaF9mc2lfcGxhdGZvcm1faW5mbyBmc2lfaW5mbyA9IHsKKwkucG9ydGFfZmxhZ3MgPSBTSF9GU0lfQlJTX0lOViB8CisJCSAgICAgICBTSF9GU0lfT1VUX1NMQVZFX01PREUgfAorCQkgICAgICAgU0hfRlNJX0lOX1NMQVZFX01PREUgfAorCQkgICAgICAgU0hfRlNJX09GTVQoUENNKSB8CisJCSAgICAgICBTSF9GU0lfSUZNVChQQ00pLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmc2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJGU0kiLAorCQkuc3RhcnQJPSAweEZFM0MwMDAwLAorCQkuZW5kCT0gMHhGRTNDMDIxZCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAxMDgsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZnNpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfZnNpIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZnNpX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gZnNpX3Jlc291cmNlcywKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZmc2lfaW5mbywKKwl9LAorfTsKKwogLyogS0VZU0MgaW4gU29DIChOZWVkcyBTVzMzLTIgc2V0IHRvIE9OKSAqLwogc3RhdGljIHN0cnVjdCBzaF9rZXlzY19pbmZvIGtleXNjX2luZm8gPSB7CiAJLm1vZGUgPSBTSF9LRVlTQ19NT0RFXzEsCkBAIC0zOTksNiArNDU5LDcgQEAKIAkmc2hfZXRoX2RldmljZSwKIAkmc2g3NzI0X3VzYjBfaG9zdF9kZXZpY2UsCiAJJnNoNzcyNF91c2IxX2dhZGdldF9kZXZpY2UsCisJJmZzaV9kZXZpY2UsCiB9OwogCiAjZGVmaW5lIEVFUFJPTV9PUCAgIDB4QkEyMDYwMDAKQEAgLTQ2NiwxMSArNTI3LDEzIEBACiBzdGF0aWMgaW50IF9faW5pdCBkZXZpY2VzX3NldHVwKHZvaWQpCiB7CiAJdTE2IHN3ID0gY3RybF9pbncoU1c0MTQwKTsgLyogc2VsZWN0IGNhbWVyYSwgbW9uaXRvciAqLworCXN0cnVjdCBjbGsgKmZzaWFfY2xrOwogCiAJLyogUmVzZXQgUmVsZWFzZSAqLwogCWN0cmxfb3V0dyhjdHJsX2ludyhGUEdBX09VVCkgJgogCQkgIH4oKDEgPDwgMSkgIHwgLyogTEFOICovCiAJCSAgICAoMSA8PCA2KSAgfCAvKiBWSURFTyBEQUMgKi8KKwkJICAgICgxIDw8IDcpICB8IC8qIEFLNDY0MyAqLwogCQkgICAgKDEgPDwgMTIpIHwgLyogVVNCMCAqLwogCQkgICAgKDEgPDwgMTQpKSwgLyogUk1JSSAqLwogCQkgIEZQR0FfT1VUKTsKQEAgLTYwOSw2ICs2NzIsMzIgQEAKIAlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlPVVQxLCAgICAgTlVMTCk7CiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZT1VUMCwgICAgIE5VTEwpOwogCisJLyogZW5hYmxlIEZTSSAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSU1DS0IsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSU1DS0EsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSU9BU0QsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSUlBQkNLLCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSUlBTFJDSywgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSU9BQkNLLCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSU9BTFJDSywgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0NMS0FVRElPQU8sIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSUlCU0QsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSU9CU0QsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSUlCQkNLLCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSUlCTFJDSywgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSU9CQkNLLCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSU9CTFJDSywgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0NMS0FVRElPQk8sIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0ZTSUlBU0QsICAgIE5VTEwpOworCisJLyogY2hhbmdlIHBhcmVudCBvZiBGU0kgQSAqLworCWZzaWFfY2xrID0gY2xrX2dldChOVUxMLCAiZnNpYV9jbGsiKTsKKwljbGtfcmVnaXN0ZXIoJmZzaW1ja2FfY2xrKTsKKwljbGtfc2V0X3BhcmVudChmc2lhX2NsaywgJmZzaW1ja2FfY2xrKTsKKwljbGtfc2V0X3JhdGUoZnNpYV9jbGssIDExMDAwKTsKKwljbGtfc2V0X3JhdGUoJmZzaW1ja2FfY2xrLCAxMTAwMCk7CisJY2xrX3B1dChmc2lhX2Nsayk7CisKIAkvKgogCSAqIGVuYWJsZSBTSC1FdGgKIAkgKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L01ha2VmaWxlIGIvYXJjaC9zaC9ib290L01ha2VmaWxlCmluZGV4IGExMzE2ODcuLmNiOGNmNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2Jvb3QvTWFrZWZpbGUKQEAgLTIwLDExICsyMCwxMiBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQJPz0gMHgwMDAwMTAwMAogQ09ORklHX0VOVFJZX09GRlNFVAk/PSAweDAwMDAxMDAwCiAKK3N1ZmZpeC15IDo9IGJpbgogc3VmZml4LSQoQ09ORklHX0tFUk5FTF9HWklQKSAgOj0gZ3oKIHN1ZmZpeC0kKENPTkZJR19LRVJORUxfQlpJUDIpIDo9IGJ6Mgogc3VmZml4LSQoQ09ORklHX0tFUk5FTF9MWk1BKSAgOj0gbHptYQogCi10YXJnZXRzIDo9IHpJbWFnZSB2bWxpbnV4LnNyZWMgcm9tSW1hZ2UgdUltYWdlIHVJbWFnZS5zcmVjIHVJbWFnZS5neiB1SW1hZ2UuYnoyIHVJbWFnZS5sem1hCit0YXJnZXRzIDo9IHpJbWFnZSB2bWxpbnV4LnNyZWMgcm9tSW1hZ2UgdUltYWdlIHVJbWFnZS5zcmVjIHVJbWFnZS5neiB1SW1hZ2UuYnoyIHVJbWFnZS5sem1hIHVJbWFnZS5iaW4KIGV4dHJhLXkgKz0gdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogdm1saW51eC5iaW4uYnoyIHZtbGludXguYmluLmx6bWEKIHN1YmRpci0gOj0gY29tcHJlc3NlZCByb21pbWFnZQogCkBAIC04OCw2ICs4OSw5IEBACiAkKG9iaikvdUltYWdlLmx6bWE6ICQob2JqKS92bWxpbnV4LmJpbi5sem1hCiAJJChjYWxsIGlmX2NoYW5nZWQsdWltYWdlLGx6bWEpCiAKKyQob2JqKS91SW1hZ2UuYmluOiAkKG9iaikvdm1saW51eC5iaW4KKwkkKGNhbGwgaWZfY2hhbmdlZCx1aW1hZ2Usbm9uZSkKKwogT0JKQ09QWUZMQUdTX3ZtbGludXguc3JlYyA6PSAtSSBiaW5hcnkgLU8gc3JlYwogJChvYmopL3ZtbGludXguc3JlYzogJChvYmopL2NvbXByZXNzZWQvdm1saW51eAogCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9pbnN0YWxsLnNoIGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvaW5zdGFsbC5zaAppbmRleCA5MDU4OWYwLi5mOWY0MTgxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9pbnN0YWxsLnNoCisrKyBiL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL2luc3RhbGwuc2gKQEAgLTIzLDggKzIzLDggQEAKIAogIyBVc2VyIG1heSBoYXZlIGEgY3VzdG9tIGluc3RhbGwgc2NyaXB0CiAKLWlmIFsgLXggL3NiaW4vaW5zdGFsbGtlcm5lbCBdOyB0aGVuCi0gIGV4ZWMgL3NiaW4vaW5zdGFsbGtlcm5lbCAiJEAiCitpZiBbIC14IC9zYmluLyR7SU5TVEFMTEtFUk5FTH0gXTsgdGhlbgorICBleGVjIC9zYmluLyR7SU5TVEFMTEtFUk5FTH0gIiRAIgogZmkKIAogaWYgWyAiJDIiID0gInpJbWFnZSIgXTsgdGhlbgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2FwMzI1cnhhX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9hcDMyNXJ4YV9kZWZjb25maWcKaW5kZXggNmMzOGE0My4uMmY3OGQwMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2FwMzI1cnhhX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvYXAzMjVyeGFfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTY6MDQ6MTEgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIEZyaSBTZXAgMjUgMTE6MjI6NTAgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKIENPTkZJR19HRU5FUklDX0dQSU89eQogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CkBAIC0yOCw3ICsyOSw5IEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzksNiArNDIsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01MSwxMSArNjAsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0dST1VQX1NDSEVEPXkKQEAgLTg4LDE4ICs5OCwxOSBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQpAQCAtMTA3LDYgKzExOCwxMCBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIwogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xMTksNyArMTM0LDcgQEAKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTEzNSw3ICsxNTAsNyBAQAogQ09ORklHX0RFRkFVTFRfQ0ZRPXkKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCi0jIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKK0NPTkZJR19GUkVFWkVSPXkKIAogIwogIyBTeXN0ZW0gdHlwZQpAQCAtMTY5LDYgKzE4NCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjM9eQogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMTUsNiArMjMxLDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMjk2LDcgKzMxMyw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eTEgY29uc29sZT10dHlTQzUsMzg0MDAgcm9vdD0vZGV2L25mcyBpcD1kaGNwIgogCiAjCkBAIC0zMTYsNyArMzM0LDEzIEBACiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQogIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QTV9TTEVFUD15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKKyMgQ09ORklHX0hJQkVSTkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19QTV9SVU5USU1FPXkKICMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKIENPTkZJR19ORVQ9eQogCkBAIC0zNjQsNiArMzg4LDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zOTMsNiArNDE4LDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtNDAwLDcgKzQyNiw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQxMyw2ICs0MzgsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CkBAIC00MjIsOSArNDQ4LDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC00ODAsNiArNTA2LDcgQEAKICMKICMgQ09ORklHX01URF9EQVRBRkxBU0ggaXMgbm90IHNldAogIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU1NUMjVMIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CkBAIC01ODMsNyArNjEwLDYgQEAKICMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0JOWDJfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTYzNywxMiArNjYzLDEwIEBACiAjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTEgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTcyNiw2ICs3NTAsNyBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIApAQCAtNzM2LDYgKzc2MSw3IEBACiAjCiAjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQogIworIyBDT05GSUdfSTJDX0RFU0lHTldBUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX1NIX01PQklMRT15CkBAIC03NTcsOSArNzgzLDYgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CkBAIC03ODAsNiArODAzLDExIEBACiAjCiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CiBDT05GSUdfR1BJT0xJQj15CiAjIENPTkZJR19HUElPX1NZU0ZTIGlzIG5vdCBzZXQKQEAgLTgwNCwxMSArODMyLDE1IEBACiAjCiAjIENPTkZJR19HUElPX01BWDczMDEgaXMgbm90IHNldAogIyBDT05GSUdfR1BJT19NQ1AyM1MwOCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX01DMzM4ODAgaXMgbm90IHNldAorCisjCisjIEFDOTcgR1BJTyBleHBhbmRlcnM6CisjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC04MjgsOCArODYwLDEyIEBACiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQzEzNzgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VaWF9QQ0FQIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfTUVESUFfU1VQUE9SVD15CiAKQEAgLTk1Nyw2ICs5OTMsOCBAQAogIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwogIwogIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19BVE1FTE1DSSBpcyBub3Qgc2V0CiBDT05GSUdfTU1DX1NQST15CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CkBAIC05OTIsNiArMTAzMCw3IEBACiAjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SWDg1ODEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDgwMjUgaXMgbm90IHNldAogCiAjCiAjIFNQSSBSVEMgZHJpdmVycwpAQCAtMTAwMyw2ICsxMDQyLDcgQEAKICMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGMjEyMyBpcyBub3Qgc2V0CiAKICMKICMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKQEAgLTEwNTYsOCArMTA5NiwxMCBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTExMjIsNyArMTE2NCw2IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTEyMDIsNiArMTI0Myw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTEyMTIsOCArMTI1NCwxMSBAQAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldApAQCAtMTIyMSw2ICsxMjY2LDcgQEAKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtMTIzNCw3ICsxMjgwLDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC0xMjc1LDExICsxMzIwLDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTEzNDEsNSArMTM4OCw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2RyZWFtY2FzdF9kZWZjb25maWcKaW5kZXggOTU3MTdhMC4uYWVkYmQ0ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2RyZWFtY2FzdF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2RyZWFtY2FzdF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjoyNDo0OCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxNzo1NjowNyAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjksNyArMzAsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTQwLDYgKzQzLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTUyLDExICs2MSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CkBAIC04NiwxOSArOTYsMjAgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogIyBDT05GSUdfT1BST0ZJTEUgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMDgsNiArMTE5LDEwIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTEyMCw3ICsxMzUsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY3LDYgKzE4Miw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIxOCw2ICsyMzQsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMjIsNyArMzM5LDggQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAogIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzEsMTE1MjAwIHBhbmljPTMiCiAKICMKQEAgLTM5NSw2ICs0MTMsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQyNCw2ICs0NDMsNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CkBAIC00MzEsNyArNDUxLDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDQ0LDYgKzQ2Myw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CkBAIC00OTYsNyArNTE2LDExIEBACiAjCiAKICMKLSMgRW5hYmxlIG9ubHkgb25lIG9mIHRoZSB0d28gc3RhY2tzLCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nCisjIFlvdSBjYW4gZW5hYmxlIG9uZSBvciBib3RoIEZpcmVXaXJlIGRyaXZlciBzdGFja3MuCisjCisKKyMKKyMgU2VlIHRoZSBoZWxwIHRleHRzIGZvciBtb3JlIGluZm9ybWF0aW9uLgogIwogIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldApAQCAtNTYxLDEwICs1ODUsNyBAQAogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTYwNSwxMyArNjI2LDE0IEBACiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQogIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiBDT05GSUdfS0VZQk9BUkRfTUFQTEU9eQorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU0hfS0VZU0MgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogQ09ORklHX0lOUFVUX01PVVNFPXkKICMgQ09ORklHX01PVVNFX1BTMiBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldApAQCAtNjc1LDExICs2OTcsMTUgQEAKIENPTkZJR19ERVZQT1JUPXkKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC03MTYsNiArNzQyLDcgQEAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworQ09ORklHX1ZHQV9BUkI9eQogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCkBAIC04MDcsNyArODM0LDYgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAKQEAgLTg2MSw4ICs4ODcsMTAgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApAQCAtOTIyLDcgKzk1MCw2IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogIyBDT05GSUdfTkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldApAQCAtOTQ5LDYgKzk3Niw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC05NTgsOCArOTg2LDExIEBACiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldApAQCAtOTY3LDYgKzk5OCw3IEBACiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTk4MCw3ICsxMDEyLDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKQEAgLTEwMTIsMTEgKzEwNDMsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTA3OSw1ICsxMTEyLDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2Vjb3ZlYzI0LXJvbWltYWdlX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9lY292ZWMyNC1yb21pbWFnZV9kZWZjb25maWcKaW5kZXggOWEyMmM2NC4uMDc3NDkyNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2Vjb3ZlYzI0LXJvbWltYWdlX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvZWNvdmVjMjQtcm9taW1hZ2VfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxLXJjNwotIyBUdWUgU2VwICA4IDEzOjU2OjE4IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE3OjU2OjQxIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTU5LDExICs1OSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNApAQCAtNzksMTUgKzgwLDkgQEAKICMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi1DT05GSUdfSU5JVFJBTUZTX1JPT1RfVUlEPTAKLUNPTkZJR19JTklUUkFNRlNfUk9PVF9HSUQ9MAogQ09ORklHX1JEX0daSVA9eQogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkU9eQotIyBDT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX0daSVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX0JaSVAyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOSVRSQU1GU19DT01QUkVTU0lPTl9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC0xMDcsMjAgKzEwMiwxOSBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQotQ09ORklHX0hBVkVfUEVSRl9DT1VOVEVSUz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CkBAIC0yMzcsNiArMjMxLDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMzE5LDcgKzMxNCw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAiCiAKICMKQEAgLTM4Miw2ICszNzgsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQyMiw2ICs0MTksNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CkBAIC01MzAsMTAgKzUyOCw3IEBACiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTYyNSw2ICs2MjAsNyBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKICMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC02NTcsOSArNjUzLDYgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CkBAIC02OTMsMTEgKzY4NiwxNCBAQAogIwogIyBTUEkgR1BJTyBleHBhbmRlcnM6CiAjCisKKyMKKyMgQUM5NyBHUElPIGV4cGFuZGVyczoKKyMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTcxNyw2ICs3MTMsNyBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CkBAIC03NzEsNiArNzY4LDcgQEAKICMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRD15CiAjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CkBAIC04NzUsNiArODczLDcgQEAKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19GU05PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTk3NSw2ICs5NzQsNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtOTg5LDcgKzk4OSw3IEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15Ci1DT05GSUdfSEFWRV9GVFJBQ0VfU1lTQ0FMTFM9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9lY292ZWMyNF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvZWNvdmVjMjRfZGVmY29uZmlnCmluZGV4IDIwNTBhNzYuLmFjNjQ2OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9lY292ZWMyNF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2Vjb3ZlYzI0X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMS1yYzcKLSMgV2VkIEF1ZyAyNiAwOTowOTowNyAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxNzo0NTozOSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC02MCwxMSArNjAsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0dST1VQX1NDSEVEPXkKQEAgLTk3LDIwICs5OCwxOSBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQotQ09ORklHX0hBVkVfUEVSRl9DT1VOVEVSUz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CkBAIC0yMzIsNiArMjMyLDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMzE0LDcgKzMxNSw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eTAsIGNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvbmZzIGlwPWRoY3AgbWVtPTEyME0gbWVtY2h1bmsudnB1PTRtIgogCiAjCkBAIC0zODgsNiArMzkwLDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC00MTcsNiArNDIwLDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtNDI0LDcgKzQyOCw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQzNyw2ICs0NDAsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CkBAIC00NDYsOSArNDUwLDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC01MDQsNiArNTA4LDcgQEAKICMKICMgQ09ORklHX01URF9EQVRBRkxBU0ggaXMgbm90IHNldAogIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU1NUMjVMIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CkBAIC02NjYsMTAgKzY3MSw3IEBACiAjIENPTkZJR19LUzg4NTEgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTcxMywxMSArNzE1LDE1IEBACiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19RVDIxNjAgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9NQVRSSVggaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTUFYNzM1OSBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CiBDT05GSUdfS0VZQk9BUkRfU0hfS0VZU0M9eQpAQCAtNzcxLDYgKzc3Nyw3IEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DT01QQVQ9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC04MDQsOSArODExLDYgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CkBAIC04NTYsMTEgKzg2MCwxNSBAQAogIwogIyBDT05GSUdfR1BJT19NQVg3MzAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0dQSU9fTUNQMjNTMDggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19NQzMzODgwIGlzIG5vdCBzZXQKKworIworIyBBQzk3IEdQSU8gZXhwYW5kZXJzOgorIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtODgwLDggKzg4OCwxMCBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUMxMzc4MyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19FWlhfUENBUCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldApAQCAtOTM2LDggKzk0NiwxMCBAQAogQ09ORklHX1ZJREVPX1NIX01PQklMRV9DRVU9eQogIyBDT05GSUdfVjRMX1VTQl9EUklWRVJTIGlzIG5vdCBzZXQKIENPTkZJR19SQURJT19BREFQVEVSUz15CisjIENPTkZJR19JMkNfU0k0NzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1NJNDcxMyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRFNCUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0k0NzBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1NJNDcwWCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTVI4MDAgaXMgbm90IHNldAogIyBDT05GSUdfUkFESU9fVEVBNTc2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19EQUIgaXMgbm90IHNldApAQCAtMTAwMyw3ICsxMDE1LDYgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogCiAjCkBAIC0xMDI2LDYgKzEwMzcsNyBAQAogIyBDT05GSUdfSElEX0VaS0VZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogIyBDT05GSUdfSElEX0dZUkFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9UV0lOSEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9LRU5TSU5HVE9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9MT0dJVEVDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfTUlDUk9TT0ZUIGlzIG5vdCBzZXQKQEAgLTEwNzAsNiArMTA4Miw3IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9SOEE2NjU5N19IQ0Q9eQogIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldApAQCAtMTE2MSw2ICsxMTc0LDggQEAKICMgTU1DL1NEL1NESU8gSG9zdCBDb250cm9sbGVyIERyaXZlcnMKICMKICMgQ09ORklHX01NQ19TREhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfQVRNRUxNQ0kgaXMgbm90IHNldAogQ09ORklHX01NQ19TUEk9eQogIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldApAQCAtMTIwOCw2ICsxMjIzLDcgQEAKICMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGMjEyMyBpcyBub3Qgc2V0CiAKICMKICMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKQEAgLTEyNjUsNiArMTI4MSw3IEBACiAjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CkBAIC0xMzI5LDcgKzEzNDYsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC0xNDA5LDYgKzE0MjUsNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTQyMyw3ICsxNDQwLDcgQEAKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKLUNPTkZJR19IQVZFX0ZUUkFDRV9TWVNDQUxMUz15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldApAQCAtMTQ0Niw3ICsxNDYzLDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC0xNDg3LDExICsxNTAzLDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9lZG9zazc3MDVfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2Vkb3NrNzcwNV9kZWZjb25maWcKaW5kZXggNDk3NDE0Yy4uODZjOWJjMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2Vkb3NrNzcwNV9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2Vkb3NrNzcwNV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjoyNTozNSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxNzo1NzoxMyAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xMyw2ICsxMyw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjYsNyArMjcsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM2LDE3ICszOSwyNCBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVklQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKIAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE3CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKQEAgLTcwLDE4ICs4MCwxOSBAQAogIyBDT05GSUdfRVZFTlRGRCBpcyBub3Qgc2V0CiBDT05GSUdfU0hNRU09eQogIyBDT05GSUdfQUlPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMQUIgaXMgbm90IHNldAogQ09ORklHX1NMVUI9eQogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CkBAIC04OSw2ICsxMDAsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfQkFTRV9TTUFMTD0xCkBAIC0xMjUsNiArMTQwLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTY1LDcgKzE4MSw2IEBACiBDT05GSUdfU1BBUlNFTUVNPXkKIENPTkZJR19IQVZFX01FTU9SWV9QUkVTRU5UPXkKIENPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKLUNPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIENPTkZJR19NSUdSQVRJT049eQogIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldApAQCAtMTczLDYgKzE4OCw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI1MCw3ICsyNjYsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9PVkVSV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCkBAIC0zMjEsMTEgKzMzOCwxNCBAQAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTQwOSw2ICs0MjksNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldApAQCAtNDE2LDggKzQzNywxMSBAQAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTQyNSw2ICs0NDksNyBAQAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC00NDksNCArNDc0LDUgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9lZG9zazc3NjBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2Vkb3NrNzc2MF9kZWZjb25maWcKaW5kZXggNzc2ODRlZC4uNGMwZjgyYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2Vkb3NrNzc2MF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2Vkb3NrNzc2MF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjoyNTo1NSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxNzo1NzozMCAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjcsNyArMjgsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM4LDYgKzQxLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSJfZWRvc2s3NzYwIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01MSwxMSArNjAsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKQEAgLTkxLDE5ICsxMDEsMjAgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMVUJfREVCVUc9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xVQj15CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKQEAgLTExMiw2ICsxMjMsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTI0LDcgKzEzOSw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNzEsNiArMTg2LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjE2LDYgKzIzMiw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTMwNCw3ICszMjEsOCBAQAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMjAwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCiAjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJtZW09NjRNIGNvbnNvbGU9dHR5U0MyLDExNTIwMCByb290PS9kZXYvbmZzIHJ3IG5mc3Jvb3Q9MTkyLjE2OC4wLjM6L3NjcmlwdHMvZmlsZXN5cyBpcD0xOTIuMTY4LjAuNCIKIAogIwpAQCAtMzY3LDYgKzM4NSw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtMzk2LDYgKzQxNSw3IEBACiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKQEAgLTQwMyw3ICs0MjMsNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC00MTYsNiArNDM1LDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CkBAIC00MjYsOSArNDQ2LDkgQEAKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9ERUJVRz15CiBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0U9MAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKIENPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKICMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldApAQCAtNTYzLDEwICs1ODMsNyBAQAogIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC02NDksNiArNjY2LDcgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NPTVBBVD15CiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKQEAgLTY1OSw2ICs2NzcsNyBAQAogIwogIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKICMKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogQ09ORklHX0kyQ19TSDc3NjA9eQogIyBDT05GSUdfSTJDX1NIX01PQklMRSBpcyBub3Qgc2V0CkBAIC02ODAsMjAgKzY5OSwyMSBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfREVCVUdfQ09SRT15CiBDT05GSUdfSTJDX0RFQlVHX0FMR089eQogQ09ORklHX0kyQ19ERUJVR19CVVM9eQogQ09ORklHX0kyQ19ERUJVR19DSElQPXkKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC03MTIsOCArNzMyLDEwIEBACiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIApAQCAtODM3LDggKzg1OSwxMCBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTkwMCw3ICs5MjQsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTk3NCw2ICs5OTcsNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19VTlVTRURfU1lNQk9MUz15CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTEwMTAsMTggKzEwMzQsMjMgQEAKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiAjIENPTkZJR19QQUdFX1BPSVNPTklORyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiBDT05GSUdfRlRSQUNFPXkKICMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CkBAIC0xMDI5LDYgKzEwNTgsNyBAQAogIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRlRSQUNFX1NZU0NBTExTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKIENPTkZJR19CUkFOQ0hfUFJPRklMRV9OT05FPXkKICMgQ09ORklHX1BST0ZJTEVfQU5OT1RBVEVEX0JSQU5DSEVTIGlzIG5vdCBzZXQKQEAgLTEwNDUsMTEgKzEwNzUsMTEgQEAKIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEU9eQogQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRV9QT1JUPTB4ZmZlODAwMDAKIENPTkZJR19FQVJMWV9QUklOVEs9eQotIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CisjIENPTkZJR19TVEFDS19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CiBDT05GSUdfRFVNUF9DT0RFPXkKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX05PX0JTU19JTklUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA2NCw3ICsxMDk0LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19IQVNIPXkKQEAgLTExMDAsMTEgKzExMjksMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19NRDU9eQogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTExNjgsNSArMTE5OSw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9lc3B0X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9lc3B0X2RlZmNvbmZpZwppbmRleCA4ODExMjhlLi45Yjc4NTUxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvZXNwdF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2VzcHRfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6Mjc6MjEgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTc6NTg6MTggMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI3LDcgKzI4LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zNyw2ICs0MCwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC00OCwxMSArNTcsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTkyLDE5ICsxMDIsMjEgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19FVkVOVF9QUk9GSUxFPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19UUkFDRVBPSU5UUz15Ci1DT05GSUdfTUFSS0VSUz15CiBDT05GSUdfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMTQsNiArMTI2LDExIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTEyNSw3ICsxNDIsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTczLDYgKzE5MCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjM9eQogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMTQsNyArMjMyLDYgQEAKIENPTkZJR19IQVZFX01FTU9SWV9QUkVTRU5UPXkKIENPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKICMgQ09ORklHX01FTU9SWV9IT1RQTFVHIGlzIG5vdCBzZXQKLUNPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIENPTkZJR19NSUdSQVRJT049eQogIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldApAQCAtMjIyLDYgKzIzOSw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTMwMyw3ICszMjEsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAiCiAKICMKQEAgLTM3MSw2ICszOTAsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQxMiw2ICs0MzIsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CkBAIC00MjEsOSArNDQyLDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTQ3Nyw2ICs0OTgsNyBAQAogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKIENPTkZJR19NVERfUEhZU01BUD15CiAjIENPTkZJR19NVERfUEhZU01BUF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKICMKQEAgLTU1NCw3ICs1NzYsNiBAQAogIyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQk5YMl9JU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldApAQCAtNjEwLDEwICs2MzEsNyBAQAogIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC03MDUsMTEgKzcyMywxNSBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTgxOSw2ICs4NDEsNyBAQAogIyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPXkKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldApAQCAtODg4LDYgKzkxMSw3IEBACiAjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CkBAIC05MzAsOCArOTU0LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX1BPU0lYX0FDTD15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQpAQCAtOTk3LDcgKzEwMjMsNiBAQAogQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKICMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CkBAIC0xMDcxLDYgKzEwOTYsNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTA4MiwxMSArMTEwOCwxNSBAQAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfTk9QX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19FVkVOVF9UUkFDSU5HPXkKIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQorQ09ORklHX1JJTkdfQlVGRkVSX0FMTE9XX1NXQVA9eQogQ09ORklHX1RSQUNJTkc9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldApAQCAtMTA5Niw2ICsxMTI2LDcgQEAKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtMTEwOSw3ICsxMTQwLDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKQEAgLTExNDEsMTEgKzExNzEsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTIwOCw1ICsxMjQwLDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2hwNnh4X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9ocDZ4eF9kZWZjb25maWcKaW5kZXggMzI0OWQ0Ni4uZjU5YmU0NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2hwNnh4X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvaHA2eHhfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6Mjg6MTIgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTc6NTk6NDUgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDcgKzI5LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOCw2ICs0MSwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKICMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAogQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQpAQCAtNDYsMTEgKzU1LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC04MSwxOCArOTEsMTkgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKQEAgLTEwMCw2ICsxMTEsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTA3LDcgKzEyMiw3IEBACiBDT05GSUdfQkFTRV9TTUFMTD0wCiAjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTU0LDYgKzE2OSw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE5OSw2ICsyMTUsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0yODgsNyArMzA1LDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMzIyLDYgKzM0MCw3IEBACiBDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKICMgQ09ORklHX0hJQkVSTkFUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19BUE1fRU1VTEFUSU9OPXkKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKIApAQCAtMzkwLDcgKzQwOSw2IEBACiAjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQotIyBDT05GSUdfU0NTSV9CTlgyX0lTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CkBAIC0zOTksNiArNDE3LDcgQEAKICMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQogQ09ORklHX1NBVEFfUE1QPXkKIENPTkZJR19BVEFfU0ZGPXkKICMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldApAQCAtNDI4LDEzICs0NDcsMTQgQEAKICMKIENPTkZJR19JTlBVVF9LRVlCT0FSRD15CiAjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIENPTkZJR19LRVlCT0FSRF9IUDZYWD15CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TSF9LRVlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldApAQCAtNDUyLDYgKzQ3Miw3IEBACiAjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVzkwWDkwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIAogIwpAQCAtNTA3LDExICs1MjgsMTUgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC02NjMsNyArNjg4LDkgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTcyNSw3ICs3NTIsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTc4Miw2ICs4MDgsNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtNzkxLDggKzgxOCwxMSBAQAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTgwMCw2ICs4MzAsNyBAQAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC04MTMsNyArODQ0LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC04NTQsMTEgKzg4NCwxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtOTIwLDQgKzk1Miw1IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mva2ZyMnIwOS1yb21pbWFnZV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mva2ZyMnIwOS1yb21pbWFnZV9kZWZjb25maWcKaW5kZXggYzBmOTI2My4uMDI1OTBlMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2tmcjJyMDktcm9taW1hZ2VfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9rZnIycjA5LXJvbWltYWdlX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMS1yYzYKLSMgVGh1IEF1ZyAyMCAxNTowOToxNiAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODowMTo0OCAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC01OCwxMSArNTgsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTc4LDE1ICs3OSw5IEBACiAjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotQ09ORklHX0lOSVRSQU1GU19ST09UX1VJRD0wCi1DT05GSUdfSU5JVFJBTUZTX1JPT1RfR0lEPTAKIENPTkZJR19SRF9HWklQPXkKICMgQ09ORklHX1JEX0JaSVAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JEX0xaTUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkUgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19DT01QUkVTU0lPTl9HWklQPXkKLSMgQ09ORklHX0lOSVRSQU1GU19DT01QUkVTU0lPTl9CWklQMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTklUUkFNRlNfQ09NUFJFU1NJT05fTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMTA2LDIwICsxMDEsMTkgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKLUNPTkZJR19IQVZFX1BFUkZfQ09VTlRFUlM9eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQpAQCAtMTczLDYgKzE2Nyw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0PXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMTksNiArMjE0LDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMzAxLDcgKzI5Nyw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMSwxMTUyMDAgcXVpZXQiCiAKICMKQEAgLTMyNCw2ICszMjEsNyBAQAogQ09ORklHX1BNPXkKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NVU1BFTkQgaXMgbm90IHNldAorQ09ORklHX1BNX1JVTlRJTUU9eQogIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAogQ09ORklHX05FVD15CiAKQEAgLTM2Miw2ICszNjAsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQwMiw2ICs0MDEsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CkBAIC00ODksNiArNDg5LDcgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NPTVBBVD15CiAjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIApAQCAtNTIwLDkgKzUyMSw2IEBACiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldApAQCAtNTU2LDExICs1NTQsMTQgQEAKICMKICMgU1BJIEdQSU8gZXhwYW5kZXJzOgogIworCisjCisjIEFDOTcgR1BJTyBleHBhbmRlcnM6CisjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC01ODAsNiArNTgxLDcgQEAKICMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODMxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAogIyBDT05GSUdfQUIzMTAwX0NPUkUgaXMgbm90IHNldApAQCAtNzE4LDYgKzcyMCw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC03MzIsNyArNzM1LDcgQEAKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKLUNPTkZJR19IQVZFX0ZUUkFDRV9TWVNDQUxMUz15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2tmcjJyMDlfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2tmcjJyMDlfZGVmY29uZmlnCmluZGV4IGNlZjYxMzEuLjhhZTY1ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9rZnIycjA5X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mva2ZyMnIwOV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEtcmM2Ci0jIFRodSBBdWcgMjAgMjE6NTg6NTIgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIEZyaSBTZXAgMjUgMTE6NTQ6MjIgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtNjAsMTEgKzYwLDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC0xMDIsMjAgKzEwMywxOSBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQotQ09ORklHX0hBVkVfUEVSRl9DT1VOVEVSUz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CkBAIC0xOTAsNiArMTkwLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQ9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIzNiw2ICsyMzcsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMTksNyArMzIxLDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORV9PVkVSV1JJVEU9eQorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5MCBjb25zb2xlPXR0eVNDMSwxMTUyMDAiCiAKICMKQEAgLTM0Myw2ICszNDYsNyBAQAogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU1VTUEVORCBpcyBub3Qgc2V0CiAjIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0CitDT05GSUdfUE1fUlVOVElNRT15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0NQVV9JRExFX0dPVl9MQURERVI9eQogQ09ORklHX0NQVV9JRExFX0dPVl9NRU5VPXkKQEAgLTM4Myw2ICszODcsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQyMyw2ICs0MjgsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CkBAIC00MzIsOSArNDM4LDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC01MDAsNyArNTA2LDEyIEBACiAjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorQ09ORklHX01URF9PTkVOQU5EPXkKKyMgQ09ORklHX01URF9PTkVOQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0CitDT05GSUdfTVREX09ORU5BTkRfR0VORVJJQz15CisjIENPTkZJR19NVERfT05FTkFORF9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkRfMlhfUFJPR1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORF9TSU0gaXMgbm90IHNldAogCiAjCiAjIExQRERSIGZsYXNoIG1lbW9yeSBkcml2ZXJzCkBAIC01NjQsMTEgKzU3NSwxNSBAQAogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKKyMgQ09ORklHX0tFWUJPQVJEX0FEUDU1ODggaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTUFUUklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogQ09ORklHX0tFWUJPQVJEX1NIX0tFWVNDPXkKQEAgLTYyMSw2ICs2MzYsNyBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKICMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC02NTMsOSArNjY5LDYgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CkBAIC02ODksMTEgKzcwMiwxNCBAQAogIwogIyBTUEkgR1BJTyBleHBhbmRlcnM6CiAjCisKKyMKKyMgQUM5NyBHUElPIGV4cGFuZGVyczoKKyMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTcxMyw2ICs3MjksNyBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CkBAIC04NTYsNiArODczLDggQEAKICMgTU1DL1NEL1NESU8gSG9zdCBDb250cm9sbGVyIERyaXZlcnMKICMKICMgQ09ORklHX01NQ19TREhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfQVRNRUxNQ0kgaXMgbm90IHNldAogIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CkBAIC05NDEsNiArOTYwLDcgQEAKICMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTEwMDIsNiArMTAyMiw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMDE2LDcgKzEwMzcsNyBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQotQ09ORklHX0hBVkVfRlRSQUNFX1NZU0NBTExTPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvbGFuZGlza19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvbGFuZGlza19kZWZjb25maWcKaW5kZXggYmEwNTczOS4uYzJhOWEzOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2xhbmRpc2tfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9sYW5kaXNrX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMAotIyBUaHUgSnVuIDE4IDEyOjI4OjQ1IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE4OjA1OjQ5IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTE0LDYgKzE0LDcgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CiAjIENPTkZJR19HRU5FUklDX0dQSU8gaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CkBAIC0yOCw3ICsyOSw5IEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzgsNiArNDEsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpAQCAtNDksMTEgKzU4LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKQEAgLTgzLDE5ICs5MywyMCBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfUENJX1FVSVJLUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtMTA0LDYgKzExNSwxMCBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIwogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xMTYsNyArMTMxLDcgQEAKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE2Myw2ICsxNzgsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMDgsNiArMjI0LDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMjk1LDcgKzMxMiw4IEBACiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKICMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtNDExLDYgKzQyOSw3IEBACiAjIENPTkZJR19JUF9ORl9BUlBUQUJMRVMgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDQyLDYgKzQ2MSw3IEBACiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKQEAgLTQ0OSw3ICs0NjksNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC00NjIsNiArNDgxLDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKIENPTkZJR19GV19MT0FERVI9eQpAQCAtNjMxLDYgKzY1MSw3IEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QTUNSQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9XTEVWRUxfUENNQ0lBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldApAQCAtNjUzLDcgKzY3NCwxMSBAQAogIwogCiAjCi0jIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIyBZb3UgY2FuIGVuYWJsZSBvbmUgb3IgYm90aCBGaXJlV2lyZSBkcml2ZXIgc3RhY2tzLgorIworCisjCisjIFNlZSB0aGUgaGVscCB0ZXh0cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICMKICMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKQEAgLTcyOSw2ICs3NTQsNyBAQAogIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NOSUMgaXMgbm90IHNldAogIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKQEAgLTc1NCwxMCArNzgwLDcgQEAKICMgQ09ORklHX1NGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRTJORVQgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtODY4LDEwICs4OTEsMjAgQEAKIENPTkZJR19ERVZQT1JUPXkKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKICMgQ09ORklHX1NFTlNPUlNfSTVLX0FNQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CkBAIC04ODYsOSArOTE5LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTkxMCw2ICs5NDEsNyBAQAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCitDT05GSUdfVkdBX0FSQj15CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldApAQCAtOTI4LDExICs5NjAsMTEgQEAKIENPTkZJR19GT05UXzh4MTY9eQogQ09ORklHX1NPVU5EPW0KIENPTkZJR19TT1VORF9PU1NfQ09SRT15CitDT05GSUdfU09VTkRfT1NTX0NPUkVfUFJFQ0xBSU09eQogIyBDT05GSUdfU05EIGlzIG5vdCBzZXQKIENPTkZJR19TT1VORF9QUklNRT1tCiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15Ci0jIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKIAogIwpAQCAtOTYxLDYgKzk5Myw3IEBACiBDT05GSUdfSElEX0VaS0VZPW0KICMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9HWVJBVElPTj1tCisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0xPR0lURUNIPW0KICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKQEAgLTEwMTEsNiArMTA0NCw3IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0CkBAIC0xMTc3LDggKzEyMTEsMTAgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTEyNTEsNyArMTI4Nyw2IEBACiBDT05GSUdfVUZTX0ZTPW0KICMgQ09ORklHX1VGU19GU19XUklURSBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9bQogQ09ORklHX05GU19WMz15CkBAIC0xMzMxLDYgKzEzNjYsNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTM0MCw4ICsxMzc2LDExIEBACiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldApAQCAtMTM1MCw2ICsxMzg5LDcgQEAKIENPTkZJR19TSF9TVEFOREFSRF9CSU9TPXkKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTEzNjMsNyArMTQwMyw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CkBAIC0xMzk1LDExICsxNDM0LDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTE0NjIsNSArMTUwMyw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9sYm94cmUyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9sYm94cmUyX2RlZmNvbmZpZwppbmRleCBjMGJjMmZkLi5lYzBjMGI0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvbGJveHJlMl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2xib3hyZTJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6Mjk6NTAgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTg6MDk6NTkgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDcgKzI5LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOCw2ICs0MSwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC00OSwxMSArNTgsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldApAQCAtODMsMTkgKzkzLDIwIEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC0xMDQsNiArMTE1LDEwIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTExNiw3ICsxMzEsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTYzLDYgKzE3OCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIwOCw2ICsyMjQsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0yOTUsNyArMzEyLDggQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAogIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzEsMTE1MjAwIHJvb3Q9L2Rldi9zZGExIgogCiAjCkBAIC00MTEsNiArNDI5LDcgQEAKICMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC00NDAsNiArNDU5LDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtNDQ3LDcgKzQ2Nyw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQ2MCw2ICs0NzksNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CkBAIC01NzIsMTIgKzU5MiwxNCBAQAogIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUE1DUkFJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPV0xFVkVMX1BDTUNJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQogQ09ORklHX1NBVEFfUE1QPXkKICMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKQEAgLTU5OSw2ICs2MjEsNyBAQAogIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FUUDg2N1ggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NDBfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKQEAgLTYyNyw2ICs2NTAsNyBAQAogIyBDT05GSUdfUEFUQV9QQ01DSUEgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKQEAgLTY0NSw3ICs2NjksMTEgQEAKICMKIAogIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CkBAIC03MjUsNiArNzUzLDcgQEAKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19DTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CkBAIC03NTAsMTAgKzc3OSw3IEBACiAjIENPTkZJR19TRkMgaXMgbm90IHNldAogIyBDT05GSUdfQkUyTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTg2MywxMCArODg5LDIwIEBACiBDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBkcml2ZXJzCisjCiAjIENPTkZJR19TRU5TT1JTX0k1S19BTUIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldApAQCAtODgxLDkgKzkxNyw3IEBACiAjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC05MDUsNiArOTM5LDcgQEAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworQ09ORklHX1ZHQV9BUkI9eQogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKQEAgLTkyMyw3ICs5NTgsNiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKIApAQCAtMTAyMSw4ICsxMDU1LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CkBAIC0xMDg5LDcgKzExMjUsNiBAQAogQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CkBAIC0xMTU1LDYgKzExOTAsNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTE2NCw4ICsxMjAwLDExIEBACiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldApAQCAtMTE3NCw2ICsxMjEzLDcgQEAKIENPTkZJR19TSF9TVEFOREFSRF9CSU9TPXkKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTExODcsNyArMTIyNyw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CkBAIC0xMjE5LDExICsxMjU4LDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTEyODYsNSArMTMyNyw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9tYWdpY3BhbmVscjJfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL21hZ2ljcGFuZWxyMl9kZWZjb25maWcKaW5kZXggYzU4NTllOC4uNzkwOTFlMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL21hZ2ljcGFuZWxyMl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL21hZ2ljcGFuZWxyMl9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjozMDozMSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODoxMDo0OSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogQ09ORklHX0dFTkVSSUNfR1BJTz15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDcgKzI5LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOCw2ICs0MSwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTUyLDExICs2MSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE3CiAjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CkBAIC05MSwxOCArMTAxLDE5IEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC0xMTEsNiArMTIyLDEwIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTEyMyw3ICsxMzgsNyBAQAogQ09ORklHX01PRFZFUlNJT05TPXkKIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNzAsNiArMTg1LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjE1LDYgKzIzMSw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTMwNiw3ICszMjMsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9PVkVSV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCkBAIC0zNjgsNiArMzg2LDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zOTcsNiArNDE2LDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtNDA0LDcgKzQyNCw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQxNyw2ICs0MzYsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKIENPTkZJR19GV19MT0FERVI9eQpAQCAtNDI4LDkgKzQ0OCw5IEBACiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQogQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQgaXMgbm90IHNldApAQCAtNTg5LDEwICs2MDksNyBAQAogIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC02MzEsMTMgKzY0OCwxNSBAQAogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKIENPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTUFUUklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NIX0tFWVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NT1VTRT15CiAjIENPTkZJR19NT1VTRV9QUzIgaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKQEAgLTcwMSw2ICs3MjAsMTEgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9SRVFVSVJFX0dQSU9MSUI9eQogQ09ORklHX0dQSU9MSUI9eQogIyBDT05GSUdfREVCVUdfR1BJTyBpcyBub3Qgc2V0CkBAIC03MjEsMTEgKzc0NSwxNCBAQAogIwogIyBTUEkgR1BJTyBleHBhbmRlcnM6CiAjCisKKyMKKyMgQUM5NyBHUElPIGV4cGFuZGVyczoKKyMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTgyOSw4ICs4NTYsMTAgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApAQCAtOTAwLDcgKzkyOSw2IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTk3Niw2ICsxMDA0LDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiBDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMDA2LDI0ICsxMDM1LDMwIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQogIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC0xMDM2LDE2ICsxMDcxLDE1IEBACiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tNRU1DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEU9eQogQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRV9QT1JUPTB4YTQ0MzAwMDAKIENPTkZJR19FQVJMWV9QUklOVEs9eQotIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKICMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKIENPTkZJR19EVU1QX0NPREU9eQorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfTk9fQlNTX0lOSVQgaXMgbm90IHNldAogCiAjCkBAIC0xMDc3LDUgKzExMTEsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvbWljcm9kZXZfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL21pY3JvZGV2X2RlZmNvbmZpZwppbmRleCBlNWEyMWUxLi42YmI1OTc2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvbWljcm9kZXZfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9taWNyb2Rldl9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjozMTo1NiAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODoxNDozNSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjcsNyArMjgsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM4LDYgKzQxLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogIyBDT05GSUdfU1lTVklQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldApAQCAtNDksMTEgKzU4LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKQEAgLTg3LDE4ICs5NywxOSBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQpAQCAtMTA2LDYgKzExNywxMCBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIwogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xMTMsNyArMTI4LDcgQEAKIENPTkZJR19CQVNFX1NNQUxMPTAKICMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjAsNiArMTc1LDcgQEAKIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyPXkKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIxMSw2ICsyMjcsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0yOTYsNyArMzEzLDggQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAogIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9oZGExIgogCiAjCkBAIC0zNjQsNiArMzgyLDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zOTMsNiArNDEyLDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtNDAwLDcgKzQyMCw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQxMyw2ICs0MzIsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKQEAgLTQ5OSwxMCArNTE5LDcgQEAKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogQ09ORklHX05FVERFVl8xMDAwMD15Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC01NjEsMTAgKzU3OCwyMCBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBkcml2ZXJzCisjCiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldApAQCAtNTc1LDkgKzYwMiw3IEBACiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC02NjIsOCArNjg3LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CkBAIC03MjYsMTIgKzc1MywxMiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX1Y0XzEgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX0xPQ0tEPXkKQEAgLTgwMyw2ICs4MzAsNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtODEyLDggKzg0MCwxMSBAQAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTgyMSw2ICs4NTIsNyBAQAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC04MzQsNyArODY2LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC04NzUsMTEgKzkwNiwxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtOTQzLDUgKzk3Niw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9taWdvcl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvbWlnb3JfZGVmY29uZmlnCmluZGV4IGIxOGNmZDMuLjY1MDE4MjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9taWdvcl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL21pZ29yX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMAotIyBUaHUgSnVuIDE4IDE2OjA2OjQ4IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE4OjE3OjQxIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTE0LDYgKzE0LDcgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CiBDT05GSUdfR0VORVJJQ19HUElPPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjksNyArMzAsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM5LDYgKzQyLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTUwLDExICs1OSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNApAQCAtODksMTkgKzk5LDIxIEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKK0NPTkZJR19QRVJGX0VWRU5UUz15CitDT05GSUdfRVZFTlRfUFJPRklMRT15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfVFJBQ0VQT0lOVFM9eQotQ09ORklHX01BUktFUlM9eQogQ09ORklHX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldApAQCAtMTExLDYgKzEyMywxMSBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xMjIsNyArMTM5LDcgQEAKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTEzOCw3ICsxNTUsNyBAQAogIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAogIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKLSMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAorQ09ORklHX0ZSRUVaRVI9eQogCiAjCiAjIFN5c3RlbSB0eXBlCkBAIC0xNzMsNiArMTkwLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjI0LDYgKzI0Miw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTMwOCw3ICszMjcsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHkwIGNvbnNvbGU9dHR5U0MwLDExNTIwMCBlYXJseXByaW50az1zZXJpYWwgaXA9b24gcm9vdD0vZGV2L25mcyBpcD1kaGNwIgogCiAjCkBAIC0zMjgsNyArMzQ4LDEzIEBACiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQogIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QTV9TTEVFUD15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKKyMgQ09ORklHX0hJQkVSTkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19QTV9SVU5USU1FPXkKICMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKIENPTkZJR19ORVQ9eQogCkBAIC0zNzYsNiArNDAyLDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC00MDYsNiArNDMzLDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlM9eQpAQCAtNDE0LDcgKzQ0Miw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQyNyw2ICs0NTQsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj1tCkBAIC00MzYsOSArNDY0LDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC01ODUsNyArNjEzLDYgQEAKICMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0JOWDJfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTYyMSwxMCArNjQ4LDcgQEAKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNjU5LDE0ICs2ODMsMTkgQEAKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKIENPTkZJR19JTlBVVF9LRVlCT0FSRD15CisjIENPTkZJR19LRVlCT0FSRF9BRFA1NTg4IGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19RVDIxNjAgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTUFUUklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogQ09ORklHX0tFWUJPQVJEX1NIX0tFWVNDPXkKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CkBAIC03MTUsNiArNzQ0LDcgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NPTVBBVD15CiAjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIApAQCAtNzI1LDYgKzc1NSw3IEBACiAjCiAjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQogIworIyBDT05GSUdfSTJDX0RFU0lHTldBUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX1NIX01PQklMRT15CkBAIC03NDYsMTUgKzc3NywxNyBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CiBDT05GSUdfR1BJT0xJQj15CiAjIENPTkZJR19HUElPX1NZU0ZTIGlzIG5vdCBzZXQKQEAgLTc3NywxMSArODEwLDE0IEBACiAjCiAjIFNQSSBHUElPIGV4cGFuZGVyczoKICMKKworIworIyBBQzk3IEdQSU8gZXhwYW5kZXJzOgorIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtODAxLDggKzgzNywxMCBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogQ09ORklHX01FRElBX1NVUFBPUlQ9eQogCkBAIC05MjIsNyArOTYwLDYgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAKQEAgLTk1MiwxMyArOTg5LDEzIEBACiAjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUjhBNjY1OTcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyN1ggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9TM0NfSFNPVEcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9TM0MyNDEwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0dBREdFVF9NNjY1OTI9eQogQ09ORklHX1VTQl9NNjY1OTI9eQotQ09ORklHX1NVUEVSSF9CVUlMVF9JTl9NNjY1OTI9eQogIyBDT05GSUdfVVNCX0dBREdFVF9BTUQ1NTM2VURDIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfRlNMX1FFIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfQ0kxM1hYWCBpcyBub3Qgc2V0CkBAIC0xMDE3LDYgKzEwNTQsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4MDI1IGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTEwNjQsOCArMTEwMiwxMCBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CkBAIC0xMTI2LDcgKzExNjYsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTExNjEsNiArMTIwMCw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTE3MiwxMSArMTIxMiwxNSBAQAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfTk9QX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19FVkVOVF9UUkFDSU5HPXkKIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQorQ09ORklHX1JJTkdfQlVGRkVSX0FMTE9XX1NXQVA9eQogQ09ORklHX1RSQUNJTkc9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldApAQCAtMTE4OCw2ICsxMjMyLDcgQEAKIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEU9eQogQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRV9QT1JUPTB4ZmZlMDAwMDAKIENPTkZJR19FQVJMWV9QUklOVEs9eQorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTEyMDEsNyArMTI0Niw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKIENPTkZJR19DUllQVE9fQUVBRDI9eQogQ09ORklHX0NSWVBUT19CTEtDSVBIRVIyPXkKQEAgLTEyNDAsMTEgKzEyODQsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTMwOCw1ICsxMzU0LDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3BvbGFyaXNfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3BvbGFyaXNfZGVmY29uZmlnCmluZGV4IDY3ZWRkM2YuLjdmYzE5NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9wb2xhcmlzX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvcG9sYXJpc19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjozMzoyOCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODoyMDo1MyAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjcsNyArMjgsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM4LDYgKzQxLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiAjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01MiwxMSArNjEsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0dST1VQX1NDSEVEPXkKQEAgLTkxLDE4ICsxMDEsMTkgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKQEAgLTExMSw2ICsxMjIsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTIzLDcgKzEzOCw3IEBACiBDT05GSUdfTU9EVkVSU0lPTlM9eQogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTcwLDYgKzE4NSw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIxNSw2ICsyMzEsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMDIsNyArMzE5LDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORV9PVkVSV1JJVEU9eQorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MxLDExNTIwMCByb290PS9kZXYvbXRkYmxvY2syIHJvb3Rmc3R5cGU9amZmczIgbWVtPTYzTSBtdGRwYXJ0cz1waHlzbWFwLWZsYXNoLjA6MHgwMDEwMDAwMChib290bG9hZGVyKXJvLDB4MDA1MDAwMDAoS2VybmVsKXJvLDB4MDBBMDAwMDAoRmlsZXN5c3RlbSkiCiAKICMKQEAgLTM2Myw2ICszODEsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQwMyw2ICs0MjIsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CkBAIC00MTQsOSArNDM0LDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTU3NywxMCArNTk3LDcgQEAKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNjY2LDExICs2ODMsMTUgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC03NzAsOCArNzkxLDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTg0MSw3ICs4NjQsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC04NzcsNiArODk5LDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTkxNiwxOCArOTM5LDIzIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19TRz15CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiAjIENPTkZJR19QQUdFX1BPSVNPTklORyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiBDT05GSUdfRlRSQUNFPXkKICMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CkBAIC05MzUsNiArOTYzLDcgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC05NDcsMTYgKzk3NiwxNSBAQAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LTUVNQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFPXkKLUNPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEVfUE9SVD0weDAwMDAwMDAwCitDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFX1BPUlQ9MHhhNDAwMDE1MAogQ09ORklHX0VBUkxZX1BSSU5USz15Ci0jIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAogIyBDT05GSUdfNEtTVEFDS1MgaXMgbm90IHNldAogQ09ORklHX0RVTVBfQ09ERT15CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9OT19CU1NfSU5JVCBpcyBub3Qgc2V0CiAKICMKQEAgLTk4Nyw1ICsxMDE1LDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnCmluZGV4IDEwN2E4ZTMuLjkwM2IwMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9yNzc4MG1wX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBtcF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjozNDo0NCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODoyNDozMSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjgsOCArMjksMTAgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19JT19UUkFQUEVEPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC00MCw2ICs0MywxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01MiwxMSArNjEsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTkyLDIwICsxMDIsMjIgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19FVkVOVF9QUk9GSUxFPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19UUkFDRVBPSU5UUz15Ci1DT05GSUdfTUFSS0VSUz15CiBDT05GSUdfT1BST0ZJTEU9bQogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMTUsNiArMTI3LDExIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTEyNiw3ICsxNDMsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTc0LDYgKzE5MSw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MD15CkBAIC0yMjksNiArMjQ3LDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMzE1LDcgKzMzNCw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAgcm9vdD0vZGV2L3NkYTEiCiAKICMKQEAgLTM5Niw2ICs0MTYsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogQ09ORklHX1NUUD1tCkBAIC00MjgsNiArNDQ5LDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlM9eQpAQCAtNDM2LDcgKzQ1OCw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQ0OSw2ICs0NzAsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj1tCkBAIC00NjAsOSArNDgyLDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldApAQCAtNTEzLDYgKzUzNSw3IEBACiBDT05GSUdfTVREX1BIWVNNQVA9eQogIyBDT05GSUdfTVREX1BIWVNNQVBfQ09NUEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfSU5URUxfVlJfTk9SIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIApAQCAtNjUxLDExICs2NzQsMTMgQEAKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BNQ1JBSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorQ09ORklHX0FUQV9WRVJCT1NFX0VSUk9SPXkKIENPTkZJR19TQVRBX1BNUD15CiAjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAogIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CkBAIC02NzcsNiArNzAyLDcgQEAKICMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVFA4NjdYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CkBAIC03MDQsNiArNzMwLDcgQEAKICMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldApAQCAtNzIyLDcgKzc0OSwxMSBAQAogIwogCiAjCi0jIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIyBZb3UgY2FuIGVuYWJsZSBvbmUgb3IgYm90aCBGaXJlV2lyZSBkcml2ZXIgc3RhY2tzLgorIworCisjCisjIFNlZSB0aGUgaGVscCB0ZXh0cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICMKICMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKQEAgLTgwNCw2ICs4MzUsNyBAQAogIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NOSUMgaXMgbm90IHNldAogIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKQEAgLTgyOSwxMCArODYxLDcgQEAKICMgQ09ORklHX1NGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRTJORVQgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtODczLDEzICs5MDIsMTcgQEAKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKIENPTkZJR19JTlBVVF9LRVlCT0FSRD15CisjIENPTkZJR19LRVlCT0FSRF9BRFA1NTg4IGlzIG5vdCBzZXQKIENPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU0hfS0VZU0MgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKQEAgLTkzMyw2ICs5NjYsNyBAQAogQ09ORklHX0RFVlBPUlQ9eQogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NPTVBBVD15CiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKQEAgLTk2MSw2ICs5OTUsNyBAQAogIwogIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKICMKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfSElHSExBTkRFUj15CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSF9NT0JJTEUgaXMgbm90IHNldApAQCAtOTg3LDE5ICsxMDIyLDI2IEBACiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CkBAIC0xMDQ5LDYgKzEwOTEsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVE1QNDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVE1QNDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CkBAIC0xMDYwLDcgKzExMDMsNiBAQAogIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIENPTkZJR19USEVSTUFMPXkKICMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldApAQCAtMTA4MSwxNCArMTEyMywxNyBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworQ09ORklHX1ZHQV9BUkI9eQogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKQEAgLTExMDEsMTEgKzExNDYsMTEgQEAKICMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfU09VTkQ9bQogQ09ORklHX1NPVU5EX09TU19DT1JFPXkKK0NPTkZJR19TT1VORF9PU1NfQ09SRV9QUkVDTEFJTT15CiAjIENPTkZJR19TTkQgaXMgbm90IHNldAogQ09ORklHX1NPVU5EX1BSSU1FPW0KIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAKQEAgLTExNjksNiArMTIxNCw3IEBACiAjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SWDg1ODEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDgwMjUgaXMgbm90IHNldAogCiAjCiAjIFNQSSBSVEMgZHJpdmVycwpAQCAtMTIyMSw4ICsxMjY3LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX1BPU0lYX0FDTD15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQpAQCAtMTI4OSwxMiArMTMzNywxMiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX1Y0XzEgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPXkKIENPTkZJR19ORlNEX1YzPXkKQEAgLTEzNzAsNiArMTQxOCw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTE0MDQsMjEgKzE0NTMsMjcgQEAKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfUklOR19CVUZGRVI9eQogQ09ORklHX0VWRU5UX1RSQUNJTkc9eQogQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfUklOR19CVUZGRVJfQUxMT1dfU1dBUD15CiBDT05GSUdfVFJBQ0lORz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQpAQCAtMTQyNyw2ICsxNDgyLDcgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC0xNDQ1LDExICsxNTAxLDExIEBACiBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFPXkKIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEVfUE9SVD0weGZmZTAwMDAwCiAjIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CisjIENPTkZJR19TVEFDS19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CiBDT05GSUdfRFVNUF9DT0RFPXkKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX05PX0JTU19JTklUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTQ2NCw3ICsxNTIwLDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC0xNTA2LDExICsxNTYxLDEzIEBACiAjCiBDT05GSUdfQ1JZUFRPX0hNQUM9eQogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTU3Myw1ICsxNjMwLDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnCmluZGV4IDhhM2RjMzAuLjI3ZmY0NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODVycF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjozNzoyMCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODoyOToyMyAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogQ09ORklHX0dFTkVSSUNfR1BJTz15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI5LDggKzMwLDEwIEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CiBDT05GSUdfSU9fVFJBUFBFRD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtNDEsNiArNDQsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpAQCAtNTYsMTIgKzY1LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLSMgQ09ORklHX0NMQVNTSUNfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLUNPTkZJR19QUkVFTVBUX1JDVT15CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CiBDT05GSUdfUkNVX1RSQUNFPXkKLSMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLUNPTkZJR19QUkVFTVBUX1JDVV9UUkFDRT15CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1VfVFJBQ0U9eQogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC05MywyMCArMTAyLDIyIEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKK0NPTkZJR19QRVJGX0VWRU5UUz15CitDT05GSUdfRVZFTlRfUFJPRklMRT15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfUENJX1FVSVJLUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfVFJBQ0VQT0lOVFM9eQotQ09ORklHX01BUktFUlM9eQogQ09ORklHX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19LUFJPQkVTPXkKQEAgLTExNyw2ICsxMjgsMTEgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTI5LDcgKzE0NSw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNzgsNiArMTk0LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjMxLDcgKzI0OCw2IEBACiBDT05GSUdfSEFWRV9NRU1PUllfUFJFU0VOVD15CiBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiAjIENPTkZJR19NRU1PUllfSE9UUExVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiBDT05GSUdfTUlHUkFUSU9OPXkKICMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKQEAgLTIzOSw2ICsyNTUsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMzgsNyArMzU1LDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORV9PVkVSV1JJVEU9eQorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvc2RhMSIKIAogIwpAQCAtNDE5LDYgKzQzNyw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiBDT05GSUdfU1RQPW0KQEAgLTQ1Miw2ICs0NzEsNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQogQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CkBAIC00NjAsNyArNDgwLDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDczLDYgKzQ5Miw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPW0KQEAgLTU5MSwxMSArNjExLDEzIEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QTUNSQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldApAQCAtNjE3LDYgKzYzOSw3IEBACiAjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRQODY3WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldApAQCAtNjQ0LDYgKzY2Nyw3IEBACiAjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKQEAgLTY2Miw3ICs2ODYsMTEgQEAKICMKIAogIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CkBAIC03MjEsNiArNzQ5LDcgQEAKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19DTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CkBAIC03NDYsMTAgKzc3NSw3IEBACiAjIENPTkZJR19TRkMgaXMgbm90IHNldAogIyBDT05GSUdfQkUyTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTc5MCwxNCArODE2LDE5IEBACiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CiBDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FUMjE2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVRSSVggaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTUFYNzM1OSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TSF9LRVlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldApAQCAtODUxLDYgKzg4Miw3IEBACiBDT05GSUdfREVWUE9SVD15CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIApAQCAtODc5LDYgKzkxMSw3IEBACiAjCiAjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQogIworIyBDT05GSUdfSTJDX0RFU0lHTldBUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogQ09ORklHX0kyQ19ISUdITEFOREVSPXkKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldApAQCAtOTA2LDE1ICs5MzksMTcgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9SRVFVSVJFX0dQSU9MSUI9eQogQ09ORklHX0dQSU9MSUI9eQogIyBDT05GSUdfREVCVUdfR1BJTyBpcyBub3Qgc2V0CkBAIC05MzUsMTQgKzk3MCwyNCBAQAogIyBQQ0kgR1BJTyBleHBhbmRlcnM6CiAjCiAjIENPTkZJR19HUElPX0JUOFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fTEFOR1dFTEwgaXMgbm90IHNldAogCiAjCiAjIFNQSSBHUElPIGV4cGFuZGVyczoKICMKKworIworIyBBQzk3IEdQSU8gZXhwYW5kZXJzOgorIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CkBAIC05OTMsNiArMTAzOCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UTVA0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UTVA0MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKQEAgLTEwMDQsOSArMTA1MCw3IEBACiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC0xMDI2LDE0ICsxMDcwLDE3IEBACiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCitDT05GSUdfVkdBX0FSQj15CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldApAQCAtMTA5OSwxMSArMTE0NiwxMSBAQAogIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CiBDT05GSUdfU09VTkQ9bQogQ09ORklHX1NPVU5EX09TU19DT1JFPXkKK0NPTkZJR19TT1VORF9PU1NfQ09SRV9QUkVDTEFJTT15CiAjIENPTkZJR19TTkQgaXMgbm90IHNldAogQ09ORklHX1NPVU5EX1BSSU1FPW0KIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAKQEAgLTExNjcsNiArMTIxNCw3IEBACiAjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SWDg1ODEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDgwMjUgaXMgbm90IHNldAogCiAjCiAjIFNQSSBSVEMgZHJpdmVycwpAQCAtMTIxOSw4ICsxMjY3LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX1BPU0lYX0FDTD15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQpAQCAtMTI4NiwxMiArMTMzNiwxMiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX1Y0XzEgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPXkKIENPTkZJR19ORlNEX1YzPXkKQEAgLTEzNjcsNiArMTQxNyw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTE0MDEsMjIgKzE0NTIsMjkgQEAKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19LUFJPQkVTX1NBTklUWV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfUklOR19CVUZGRVI9eQogQ09ORklHX0VWRU5UX1RSQUNJTkc9eQogQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfUklOR19CVUZGRVJfQUxMT1dfU1dBUD15CiBDT05GSUdfVFJBQ0lORz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQpAQCAtMTQyNSw2ICsxNDgzLDcgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC0xNDQyLDExICsxNTAxLDExIEBACiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0VBUkxZX1BSSU5USz15Ci0jIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKKyMgQ09ORklHX1NUQUNLX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CiBDT05GSUdfNEtTVEFDS1M9eQogQ09ORklHX0RVTVBfQ09ERT15CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9OT19CU1NfSU5JVCBpcyBub3Qgc2V0CiAKICMKQEAgLTE0NjEsNyArMTUyMCw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEk9eQogQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKIENPTkZJR19DUllQVE9fQUVBRDI9eQpAQCAtMTUwMywxMSArMTU2MSwxMyBAQAogIwogQ09ORklHX0NSWVBUT19ITUFDPXkKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19NRDU9eQogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTE1NzEsNSArMTYzMSw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9yc2s3MjAxX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9yc2s3MjAxX2RlZmNvbmZpZwppbmRleCA1NWMzNjU2Li5jNDBkYjEyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvcnNrNzIwMV9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3JzazcyMDFfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6Mzk6NTQgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTg6MzQ6MjkgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI3LDcgKzI4LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zNyw2ICs0MCwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKQEAgLTQ1LDExICs1NCwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiAjIENPTkZJR19JS0NPTkZJR19QUk9DIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC04NiwxOSArOTYsMjEgQEAKIENPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKICMgQ09ORklHX0FJTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKK0NPTkZJR19QRVJGX0VWRU5UUz15CitDT05GSUdfRVZFTlRfUFJPRklMRT15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiAjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogQ09ORklHX1NMT0I9eQogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfVFJBQ0VQT0lOVFM9eQotQ09ORklHX01BUktFUlM9eQogQ09ORklHX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldApAQCAtMTA3LDYgKzExOSwxMSBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTExNyw3ICsxMzQsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY1LDYgKzE4Miw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTI4NSw3ICszMDMsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzAsMTE1MjAwIGVhcmx5cHJpbnRrPXNlcmlhbCBpZ25vcmVfbG9nbGV2ZWwiCiAKICMKQEAgLTMwOSw2ICszMjgsNyBAQAogIwogQ09ORklHX1BNPXkKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAogQ09ORklHX0NQVV9JRExFPXkKIENPTkZJR19DUFVfSURMRV9HT1ZfTEFEREVSPXkKICMgQ09ORklHX05FVCBpcyBub3Qgc2V0CkBAIC0zMjcsOSArMzQ3LDkgQEAKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CiBDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRCBpcyBub3Qgc2V0CkBAIC00OTgsNiArNTE4LDExIEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKQEAgLTU5Nyw3ICs2MjIsOSBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRklMRV9MT0NLSU5HIGlzIG5vdCBzZXQKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTYzMiw3ICs2NTksNiBAQAogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfU1lTQ1RMPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAogQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQpAQCAtNjY4LDcgKzY5NCw2IEBACiBDT05GSUdfUk9NRlNfT05fQkxPQ0s9eQogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTY4Niw2ICs3MTEsNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTY5OCwxMSArNzI0LDE1IEBACiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX05PUF9UUkFDRVI9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19SSU5HX0JVRkZFUj15CiBDT05GSUdfRVZFTlRfVFJBQ0lORz15CiBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSPXkKK0NPTkZJR19SSU5HX0JVRkZFUl9BTExPV19TV0FQPXkKIENPTkZJR19UUkFDSU5HPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKQEAgLTcxMiw2ICs3NDIsNyBAQAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC03NDEsNCArNzcyLDUgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9yc2s3MjAzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9yc2s3MjAzX2RlZmNvbmZpZwppbmRleCA2OWU2MTk5Li41Y2FiZGIzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvcnNrNzIwM19kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3JzazcyMDNfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6NDA6NDQgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTg6MzU6MDQgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKIENPTkZJR19HRU5FUklDX0dQSU89eQogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CkBAIC0yOCw3ICsyOSw5IEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzgsNiArNDEsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKQEAgLTUwLDExICs1OSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiAjIENPTkZJR19JS0NPTkZJR19QUk9DIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC05MywxOSArMTAzLDIxIEBACiBDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19FVkVOVF9QUk9GSUxFPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKICMgQ09ORklHX1NMQUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xPQj15CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19UUkFDRVBPSU5UUz15Ci1DT05GSUdfTUFSS0VSUz15CiBDT05GSUdfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMTQsNiArMTI2LDExIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTI0LDcgKzE0MSw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNzIsNiArMTg5LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMzA4LDcgKzMyNiw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAgZWFybHlwcmludGs9c2VyaWFsIGlnbm9yZV9sb2dsZXZlbCIKIAogIwpAQCAtMzMyLDYgKzM1MSw3IEBACiAjCiBDT05GSUdfUE09eQogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUE1fUlVOVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0NQVV9JRExFX0dPVl9MQURERVI9eQogQ09ORklHX05FVD15CkBAIC0zNzMsNiArMzkzLDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC00MDMsNiArNDI0LDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtNDEwLDcgKzQzMiw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQzMiw5ICs0NTMsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CiBDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRCBpcyBub3Qgc2V0CkBAIC01OTEsMTAgKzYxMiw3IEBACiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTY3OSw2ICs2OTcsMTEgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9SRVFVSVJFX0dQSU9MSUI9eQogQ09ORklHX0dQSU9MSUI9eQogIyBDT05GSUdfREVCVUdfR1BJTyBpcyBub3Qgc2V0CkBAIC02OTksNiArNzIyLDEwIEBACiAjCiAjIFNQSSBHUElPIGV4cGFuZGVyczoKICMKKworIworIyBBQzk3IEdQSU8gZXhwYW5kZXJzOgorIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKQEAgLTc0MSw3ICs3NjgsNiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTc2NCw2ICs3OTAsNyBAQAogQ09ORklHX0hJRF9FWktFWT15CiAjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX1RXSU5IQU4gaXMgbm90IHNldAogIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CkBAIC04MTEsNiArODM4LDcgQEAKICMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRD15CiAjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CkBAIC05NTQsOCArOTgyLDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTk5MCw3ICsxMDIwLDYgQEAKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKQEAgLTEwMTYsNyArMTA0NSw2IEBACiBDT05GSUdfUk9NRlNfT05fQkxPQ0s9eQogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTEwOTAsNiArMTExOCw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiBDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTEyOSwyMiArMTE1OCwyOCBAQAogQ09ORklHX0RFQlVHX0xJU1Q9eQogQ09ORklHX0RFQlVHX1NHPXkKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfUklOR19CVUZGRVI9eQogQ09ORklHX0VWRU5UX1RSQUNJTkc9eQogQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfUklOR19CVUZGRVJfQUxMT1dfU1dBUD15CiBDT05GSUdfVFJBQ0lORz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQpAQCAtMTE1Miw2ICsxMTg3LDcgQEAKICMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC0xMTcwLDEwICsxMjA2LDEwIEBACiBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFPXkKIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEVfUE9SVD0weGZmZmU4MDAwCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKLUNPTkZJR19ERUJVR19CT09UTUVNPXkKLUNPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKKyMgQ09ORklHX1NUQUNLX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CiBDT05GSUdfRFVNUF9DT0RFPXkKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX05PX0JTU19JTklUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTIwMyw1ICsxMjM5LDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3J0czc3NTFyMmQxX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9ydHM3NzUxcjJkMV9kZWZjb25maWcKaW5kZXggYzZlOWIxYy4uZjUyMWU4MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3J0czc3NTFyMmQxX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZDFfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6NDI6MjYgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTg6MzY6MjUgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDggKzI5LDEwIEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CiBDT05GSUdfSU9fVFJBUFBFRD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzksNiArNDIsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpAQCAtNTAsMTEgKzU5LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKQEAgLTg0LDIwICs5NCwyMiBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCitDT05GSUdfUEVSRl9FVkVOVFM9eQorQ09ORklHX0VWRU5UX1BST0ZJTEU9eQorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1BDSV9RVUlSS1M9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQogQ09ORklHX1RSQUNFUE9JTlRTPXkKLUNPTkZJR19NQVJLRVJTPXkKIENPTkZJR19PUFJPRklMRT15CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKQEAgLTEwNyw2ICsxMTksMTEgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTE4LDcgKzEzNSw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjUsNiArMTgyLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjEwLDYgKzIyOCw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTMwMyw3ICszMjIsOCBAQAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCiAjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eTAgY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9zZGExIGVhcmx5cHJpbnRrPXNlcmlhbCIKIAogIwpAQCAtMzc4LDYgKzM5OCw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDA4LDYgKzQyOSw3IEBACiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTX0VYVD15CiBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTPXkKQEAgLTQxNiw3ICs0MzgsNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC00MjksNiArNDUwLDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKIENPTkZJR19GV19MT0FERVI9bQpAQCAtNTQyLDExICs1NjQsMTMgQEAKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BNQ1JBSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorQ09ORklHX0FUQV9WRVJCT1NFX0VSUk9SPXkKIENPTkZJR19TQVRBX1BNUD15CiAjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAogIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CkBAIC01NjgsNiArNTkyLDcgQEAKICMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVFA4NjdYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CkBAIC01OTUsNiArNjIwLDcgQEAKICMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldApAQCAtNjEzLDcgKzYzOSwxMSBAQAogIwogCiAjCi0jIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIyBZb3UgY2FuIGVuYWJsZSBvbmUgb3IgYm90aCBGaXJlV2lyZSBkcml2ZXIgc3RhY2tzLgorIworCisjCisjIFNlZSB0aGUgaGVscCB0ZXh0cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICMKICMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKQEAgLTY3Myw2ICs3MDMsNyBAQAogIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAogIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODUxIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQzkyMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDIgaXMgbm90IHNldApAQCAtNjk0LDYgKzcyNSw3IEBACiAjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKICMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorIyBDT05GSUdfQ05JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDEgaXMgbm90IHNldAogIyBDT05GSUdfQVRMMUUgaXMgbm90IHNldApAQCAtNzE5LDEwICs3NTEsNyBAQAogIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX0JFMk5FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC04NDAsMTAgKzg2OSwyMCBAQAogIwogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgZHJpdmVycworIwogIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0k1S19BTUIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKQEAgLTg2Miw5ICs5MDEsNyBAQAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xJUzNfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC04ODAsMTIgKzkxNywxNSBAQAogQ09ORklHX01GRF9TTTUwMT15CiAjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQzEzNzgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VaWF9QQ0FQIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCitDT05GSUdfVkdBX0FSQj15CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MPW0KQEAgLTk2OSw2ICsxMDA5LDcgQEAKIENPTkZJR19MT0dPX1NVUEVSSF9DTFVUMjI0PXkKIENPTkZJR19TT1VORD15CiBDT05GSUdfU09VTkRfT1NTX0NPUkU9eQorQ09ORklHX1NPVU5EX09TU19DT1JFX1BSRUNMQUlNPXkKIENPTkZJR19TTkQ9bQogQ09ORklHX1NORF9USU1FUj1tCiBDT05GSUdfU05EX1BDTT1tCkBAIC0xMDcxLDcgKzExMTIsNiBAQAogQ09ORklHX0FDOTdfQlVTPW0KIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogCiAjCkBAIC0xMDk0LDYgKzExMzQsNyBAQAogQ09ORklHX0hJRF9FWktFWT15CiAjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX1RXSU5IQU4gaXMgbm90IHNldAogIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CkBAIC0xMTQyLDYgKzExODMsNyBAQAogIyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPXkKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldApAQCAtMTIxMyw2ICsxMjU1LDcgQEAKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKQEAgLTEyNTIsNiArMTI5NSw3IEBACiBDT05GSUdfUlRDX0RSVl9SOTcwMT15CiAjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0YyMTIzIGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwpAQCAtMTI5Myw4ICsxMzM3LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CkBAIC0xMzU3LDcgKzE0MDMsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKQEAgLTE0MjMsNiArMTQ2OCw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTQzNCwxMSArMTQ4MCwxNSBAQAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfTk9QX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19FVkVOVF9UUkFDSU5HPXkKIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQorQ09ORklHX1JJTkdfQlVGRkVSX0FMTE9XX1NXQVA9eQogQ09ORklHX1RSQUNJTkc9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldApAQCAtMTQ1MCw2ICsxNTAwLDcgQEAKIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEU9eQogQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRV9QT1JUPTB4ZmZlODAwMDAKIENPTkZJR19FQVJMWV9QUklOVEs9eQorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTE0NjMsNyArMTUxNCw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CkBAIC0xNDk1LDExICsxNTQ1LDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTE1NjIsNSArMTYxNCw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9ydHM3NzUxcjJkcGx1c19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZHBsdXNfZGVmY29uZmlnCmluZGV4IGJjMTA0NjkuLmExNTZjZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9ydHM3NzUxcjJkcGx1c19kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3J0czc3NTFyMmRwbHVzX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMAotIyBUaHUgSnVuIDE4IDEyOjQzOjE5IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE4OjM5OjQ4IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTE0LDYgKzE0LDcgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CiAjIENPTkZJR19HRU5FUklDX0dQSU8gaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CkBAIC0yOCw4ICsyOSwxMCBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0lPX1RSQVBQRUQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM5LDYgKzQyLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTUwLDExICs1OSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CkBAIC04NCwyMCArOTQsMjIgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19FVkVOVF9QUk9GSUxFPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19UUkFDRVBPSU5UUz15Ci1DT05GSUdfTUFSS0VSUz15CiBDT05GSUdfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMDcsNiArMTE5LDExIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTExOCw3ICsxMzUsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY1LDYgKzE4Miw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIxMCw2ICsyMjgsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMDMsNyArMzIyLDggQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAogIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHkwIGNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvc2RhMSBlYXJseXByaW50az1zZXJpYWwiCiAKICMKQEAgLTM3OCw2ICszOTgsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQwOCw2ICs0MjksNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQogQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CkBAIC00MTYsNyArNDM4LDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDI5LDYgKzQ1MCw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPW0KQEAgLTQzOCw5ICs0NjAsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTQ5OSw2ICs1MjEsNyBAQAogIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NTVDI1TCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldApAQCAtNjI3LDExICs2NTAsMTMgQEAKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BNQ1JBSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorQ09ORklHX0FUQV9WRVJCT1NFX0VSUk9SPXkKIENPTkZJR19TQVRBX1BNUD15CiAjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAogIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CkBAIC02NTMsNiArNjc4LDcgQEAKICMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVFA4NjdYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CkBAIC02ODAsNiArNzA2LDcgQEAKICMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldApAQCAtNjk4LDcgKzcyNSwxMSBAQAogIwogCiAjCi0jIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIyBZb3UgY2FuIGVuYWJsZSBvbmUgb3IgYm90aCBGaXJlV2lyZSBkcml2ZXIgc3RhY2tzLgorIworCisjCisjIFNlZSB0aGUgaGVscCB0ZXh0cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICMKICMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKQEAgLTc1OCw2ICs3ODksNyBAQAogIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAogIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODUxIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQzkyMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDIgaXMgbm90IHNldApAQCAtNzc5LDYgKzgxMSw3IEBACiAjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKICMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorIyBDT05GSUdfQ05JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDEgaXMgbm90IHNldAogIyBDT05GSUdfQVRMMUUgaXMgbm90IHNldApAQCAtODA0LDEwICs4MzcsNyBAQAogIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX0JFMk5FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC05MjUsMTAgKzk1NSwyMCBAQAogIwogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgZHJpdmVycworIwogIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0k1S19BTUIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKQEAgLTk0Nyw5ICs5ODcsNyBAQAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xJUzNfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC05NjUsMTIgKzEwMDMsMTUgQEAKIENPTkZJR19NRkRfU001MDE9eQogIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUMxMzc4MyBpcyBub3Qgc2V0CisjIENPTkZJR19FWlhfUENBUCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworQ09ORklHX1ZHQV9BUkI9eQogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCkBAIC0xMDU0LDYgKzEwOTUsNyBAQAogQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQ9eQogQ09ORklHX1NPVU5EPXkKIENPTkZJR19TT1VORF9PU1NfQ09SRT15CitDT05GSUdfU09VTkRfT1NTX0NPUkVfUFJFQ0xBSU09eQogQ09ORklHX1NORD1tCiBDT05GSUdfU05EX1RJTUVSPW0KIENPTkZJR19TTkRfUENNPW0KQEAgLTExNTYsNyArMTE5OCw2IEBACiBDT05GSUdfQUM5N19CVVM9bQogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTExNzksNiArMTIyMCw3IEBACiBDT05GSUdfSElEX0VaS0VZPXkKICMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9HWVJBVElPTj15CisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0xPR0lURUNIPXkKICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKQEAgLTEyMjcsNiArMTI2OSw3IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0CkBAIC0xMjk4LDYgKzEzNDEsNyBAQAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldApAQCAtMTMzNyw2ICsxMzgxLDcgQEAKIENPTkZJR19SVENfRFJWX1I5NzAxPXkKICMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjIxMjMgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCkBAIC0xMzc4LDggKzE0MjMsMTAgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTE0NDMsNyArMTQ5MCw2IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogIyBDT05GSUdfTkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldApAQCAtMTUwOSw2ICsxNTU1LDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xNTIwLDExICsxNTY3LDE1IEBACiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfUklOR19CVUZGRVI9eQogQ09ORklHX0VWRU5UX1RSQUNJTkc9eQogQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfUklOR19CVUZGRVJfQUxMT1dfU1dBUD15CiBDT05GSUdfVFJBQ0lORz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CkBAIC0xNTM2LDYgKzE1ODcsNyBAQAogQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRT15CiBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFX1BPUlQ9MHhmZmU4MDAwMAogQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtMTU0OSw3ICsxNjAxLDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKQEAgLTE1ODEsMTEgKzE2MzIsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTY0OCw1ICsxNzAxLDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3Nkazc3ODBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3Nkazc3ODBfZGVmY29uZmlnCmluZGV4IDc1M2ZiMjcuLjA1NTUzNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZGs3NzgwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2RrNzc4MF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjo0Mzo1NCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODo0MDoyNSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjgsNyArMjksOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM5LDYgKzQyLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSJfU0RLNzc4MCIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpAQCAtNTIsMTEgKzYxLDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE4CkBAIC04OCwyMCArOTgsMjEgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1BDSV9RVUlSS1M9eQogQ09ORklHX1NMVUJfREVCVUc9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xVQj15CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKQEAgLTExMCw2ICsxMjEsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTIyLDcgKzEzNyw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLUNPTkZJR19MQkQ9eQorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTcwLDYgKzE4NSw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MD15CkBAIC0yMjUsNiArMjQxLDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMzE0LDcgKzMzMSw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAxODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJtZW09MTI4TSBjb25zb2xlPXR0eTAgY29uc29sZT10dHlTQzAsMTE1MjAwIGlwPWJvb3RwIHJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xOTIuMTY4LjAuMTovaG9tZS9yb290ZnMiCiAKICMKQEAgLTQzNSw2ICs0NTMsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQ5Niw2ICs1MTUsNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CkBAIC01MDMsNyArNTIzLDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNTE2LDYgKzUzNSw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPXkKQEAgLTY3NywxMiArNjk3LDE0IEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QTUNSQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9XTEVWRUxfUENNQ0lBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldApAQCAtNzA0LDYgKzcyNiw3IEBACiAjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRQODY3WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldApAQCAtNzMyLDYgKzc1NSw3IEBACiAjIENPTkZJR19QQVRBX1BDTUNJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldApAQCAtNzYwLDcgKzc4NCwxMSBAQAogIwogCiAjCi0jIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIyBZb3UgY2FuIGVuYWJsZSBvbmUgb3IgYm90aCBGaXJlV2lyZSBkcml2ZXIgc3RhY2tzLgorIworCisjCisjIFNlZSB0aGUgaGVscCB0ZXh0cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICMKICMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKQEAgLTgwNCwxMCArODMyLDcgQEAKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC04NjIsMTIgKzg4NywxMyBAQAogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKIENPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU0hfS0VZU0MgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogQ09ORklHX0lOUFVUX01PVVNFPXkKIENPTkZJR19NT1VTRV9QUzI9eQogQ09ORklHX01PVVNFX1BTMl9BTFBTPXkKQEAgLTg3NSw2ICs5MDEsNyBAQAogQ09ORklHX01PVVNFX1BTMl9TWU5BUFRJQ1M9eQogQ09ORklHX01PVVNFX1BTMl9UUkFDS1BPSU5UPXkKICMgQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QUzJfU0VOVEVMSUMgaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKICMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKQEAgLTk0Nyw2ICs5NzQsMTEgQEAKIENPTkZJR19ERVZQT1JUPXkKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogQ09ORklHX1BPV0VSX1NVUFBMWT15CiAjIENPTkZJR19QT1dFUl9TVVBQTFlfREVCVUcgaXMgbm90IHNldApAQCAtOTU0LDcgKzk4Niw2IEBACiAjIENPTkZJR19CQVRURVJZX0RTMjc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTk4Niw2ICsxMDE3LDcgQEAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworQ09ORklHX1ZHQV9BUkI9eQogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKQEAgLTEwNzIsMTEgKzExMDQsMTEgQEAKIENPTkZJR19MT0dPX1NVUEVSSF9DTFVUMjI0PXkKIENPTkZJR19TT1VORD15CiBDT05GSUdfU09VTkRfT1NTX0NPUkU9eQorQ09ORklHX1NPVU5EX09TU19DT1JFX1BSRUNMQUlNPXkKICMgQ09ORklHX1NORCBpcyBub3Qgc2V0CiBDT05GSUdfU09VTkRfUFJJTUU9eQogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTEwOTksNiArMTEzMSw3IEBACiBDT05GSUdfSElEX0VaS0VZPXkKICMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9HWVJBVElPTj15CisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0xPR0lURUNIPXkKICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKQEAgLTExNDksNiArMTE4Miw3IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVUhDSV9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CkBAIC0xMjc4LDYgKzEzMTIsNyBAQAogIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQpAQCAtMTM0NSw3ICsxMzgwLDYgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMTQyNSw2ICsxNDU5LDcgQEAKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKIENPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfVU5VU0VEX1NZTUJPTFM9eQogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xNDYxLDE4ICsxNDk2LDIzIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogQ09ORklHX0ZUUkFDRT15CiAjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldApAQCAtMTQ4MCw2ICsxNTIwLDcgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC0xNDk1LDExICsxNTM2LDExIEBACiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfUFJJTlRLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0JPT1RNRU0gaXMgbm90IHNldAotQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQorIyBDT05GSUdfU1RBQ0tfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAogIyBDT05GSUdfNEtTVEFDS1MgaXMgbm90IHNldAogQ09ORklHX0RVTVBfQ09ERT15CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9OT19CU1NfSU5JVCBpcyBub3Qgc2V0CiAKICMKQEAgLTE1MTQsNyArMTU1NSw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEk9eQogQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKIENPTkZJR19DUllQVE9fSEFTSD15CkBAIC0xNTUwLDExICsxNTkwLDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fTUQ1PXkKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CkBAIC0xNjE3LDUgKzE2NTksNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTcyMDZfZGVmY29uZmlnCmluZGV4IDhkZDJmMTMuLjFjZDE3NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTcyMDZfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTcyMDZfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6NDY6MTUgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTg6NDU6MjggMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDcgKzI5LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOSw2ICs0MiwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKQEAgLTUzLDEyICs2MiwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi0jIENPTkZJR19DTEFTU0lDX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci1DT05GSUdfUFJFRU1QVF9SQ1U9eQorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAogQ09ORklHX1JDVV9UUkFDRT15Ci0jIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci1DT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0U9eQorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVX1RSQUNFPXkKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CkBAIC0xMDUsMTkgKzExNCwyMSBAQAogQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKK0NPTkZJR19QRVJGX0VWRU5UUz15CitDT05GSUdfRVZFTlRfUFJPRklMRT15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMQUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xPQj15CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19UUkFDRVBPSU5UUz15Ci1DT05GSUdfTUFSS0VSUz15CiBDT05GSUdfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMjYsNiArMTM3LDExIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTM3LDcgKzE1Myw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xODUsNiArMjAxLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMzE5LDcgKzMzNiw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMywxMTUyMDAgaWdub3JlX2xvZ2xldmVsIGVhcmx5cHJpbnRrPXNlcmlhbCIKIAogIwpAQCAtMzg5LDYgKzQwNyw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDE5LDYgKzQzOCw3IEBACiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKQEAgLTQyNiw3ICs0NDYsNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC00NDgsOSArNDY3LDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTU4OCwxMCArNjA3LDcgQEAKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNjQ3LDExICs2NjMsMTUgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC03NDYsOCArNzY2LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTc4Miw4ICs4MDQsNiBAQAogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfU1lTQ1RMPXkKIENPTkZJR19TWVNGUz15Ci1DT05GSUdfVE1QRlM9eQotIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfQ09ORklHRlNfRlM9eQogQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQpAQCAtODA5LDcgKzgyOSw2IEBACiBDT05GSUdfUk9NRlNfT05fQkxPQ0s9eQogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC04NDYsNiArODY1LDcgQEAKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTg4MiwyMCArOTAyLDI3IEBACiBDT05GSUdfREVCVUdfTElTVD15CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfUklOR19CVUZGRVI9eQogQ09ORklHX0VWRU5UX1RSQUNJTkc9eQogQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfUklOR19CVUZGRVJfQUxMT1dfU1dBUD15CiBDT05GSUdfVFJBQ0lORz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQpAQCAtOTA0LDYgKzkzMSw3IEBACiAjIENPTkZJR19QUkVFTVBUX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfRU5BQkxFX0RFRkFVTFRfVFJBQ0VSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0VfU1lTQ0FMTFMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQogIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldApAQCAtOTIwLDEwICs5NDgsMTAgQEAKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CisjIENPTkZJR19TVEFDS19ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0U9eQogQ09ORklHX0RVTVBfQ09ERT15CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9OT19CU1NfSU5JVCBpcyBub3Qgc2V0CiAKICMKQEAgLTkzOCw3ICs5NjYsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0hBU0g9eQpAQCAtOTc0LDExICsxMDAxLDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiBDT05GSUdfQ1JZUFRPX0NSQzMyQz15CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CkBAIC0xMDQ2LDUgKzEwNzUsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3MzQzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTczNDNfZGVmY29uZmlnCmluZGV4IDE4ZjQ2ZGUuLjU1MzE0NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTczNDNfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTczNDNfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6NDc6MDcgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTg6NDY6NTUgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDcgKzI5LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOCw2ICs0MSwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKICMgQ09ORklHX1NXQVAgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTUwLDExICs1OSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfR1JPVVBfU0NIRUQ9eQpAQCAtODgsMTggKzk4LDE5IEBACiBDT05GSUdfRVZFTlRGRD15CiAjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKQEAgLTEwOCw2ICsxMTksMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTE5LDcgKzEzNCw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xMzUsNyArMTUwLDcgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJkZWFkbGluZSIKLSMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAorQ09ORklHX0ZSRUVaRVI9eQogCiAjCiAjIFN5c3RlbSB0eXBlCkBAIC0xNjksNiArMTg0LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjE0LDYgKzIzMCw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI5Niw3ICszMTMsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzAsMTE1MjAwIgogCiAjCkBAIC0zMTYsNyArMzM0LDEyIEBACiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQogIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QTV9TTEVFUD15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKK0NPTkZJR19QTV9SVU5USU1FPXkKICMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKIENPTkZJR19ORVQ9eQogCkBAIC0zNjAsNiArMzgzLDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zODksNiArNDEzLDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtMzk2LDcgKzQyMSw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQxOCw5ICs0NDIsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldApAQCAtNTYwLDEwICs1ODQsNyBAQAogQ09ORklHX01JST15CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNjcxLDYgKzY5Miw3IEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DT01QQVQ9eQogIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAogQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKQEAgLTY4MSw2ICs3MDMsNyBAQAogIwogIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKICMKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogQ09ORklHX0kyQ19TSF9NT0JJTEU9eQogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CkBAIC03MDIsMjAgKzcyNSwyMSBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTczNCw4ICs3NTgsMTAgQEAKICMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODMxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAorIyBDT05GSUdfQUIzMTAwX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAogCkBAIC03ODgsNiArODE0LDcgQEAKICMgQ09ORklHX0xPR08gaXMgbm90IHNldAogQ09ORklHX1NPVU5EPXkKIENPTkZJR19TT1VORF9PU1NfQ09SRT15CitDT05GSUdfU09VTkRfT1NTX0NPUkVfUFJFQ0xBSU09eQogQ09ORklHX1NORD15CiBDT05GSUdfU05EX1RJTUVSPXkKIENPTkZJR19TTkRfUENNPXkKQEAgLTgyMiw3ICs4NDksNiBAQAogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTg0NSw2ICs4NzEsNyBAQAogQ09ORklHX0hJRF9FWktFWT15CiAjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX1RXSU5IQU4gaXMgbm90IHNldAogIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CkBAIC04NzcsNiArOTA0LDcgQEAKIENPTkZJR19VU0JfREVWSUNFRlM9eQogQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1M9eQogIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQKQEAgLTg5MSw2ICs5MTksNyBAQAogIyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0lTUDExNlhfSENEPXkKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKQEAgLTk5MCw4ICsxMDE5LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTEwMjgsOCArMTA1OSw2IEBACiBDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKIENPTkZJR19TWVNGUz15Ci1DT05GSUdfVE1QRlM9eQotIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApAQCAtMTA2Miw3ICsxMDkxLDYgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMTE0MCw2ICsxMTY4LDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTExNDksOCArMTE3OCwxMSBAQAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTExNjAsNiArMTE5Miw3IEBACiBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFPXkKIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEVfUE9SVD0weGZmZTAwMDAwCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC0xMTczLDcgKzEyMDYsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldApAQCAtMTIwNSwxMSArMTIzNywxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CkBAIC0xMjczLDUgKzEzMDcsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc2MTlfZGVmY29uZmlnCmluZGV4IDcyNGJiNzcuLjY5MjFiMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc2MTlfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc2MTlfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6NDc6NTYgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTg6NTA6MDUgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI3LDcgKzI4LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zNywxNyArNDAsMjQgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldApAQCAtNzMsMzEgKzgzLDM2IEBACiBDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX0JBU0VfU01BTEw9MQogIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE0NCw2ICsxNTksNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yNjIsNyArMjc4LDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtNDY5LDExICs0ODYsMTUgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC01MDcsNyArNTI4LDYgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAKQEAgLTU1OSw3ICs1NzksOSBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CkBAIC01OTQsNyArNjE2LDYgQEAKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX1NZU0NUTD15CiAjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQogIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CkBAIC02MTksNyArNjQwLDYgQEAKIENPTkZJR19ST01GU19PTl9CTE9DSz15CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtNjM3LDYgKzY1Nyw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CkBAIC02NDUsOCArNjY2LDExIEBACiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldApAQCAtNjU0LDYgKzY3OCw3IEBACiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTY4MCw0ICs3MDUsNSBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzcwNV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzA1X2RlZmNvbmZpZwppbmRleCA2Y2E2YTJmLi4zYWJiMDY4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzA1X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzA1X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMAotIyBUaHUgSnVuIDE4IDEyOjQ4OjE4IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE4OjUwOjUyIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTE0LDYgKzE0LDcgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CiAjIENPTkZJR19HRU5FUklDX0dQSU8gaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CkBAIC0yNyw3ICsyOCw5IEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzgsNiArNDEsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKQEAgLTQ4LDExICs1NywxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CkBAIC04MywxOCArOTMsMTkgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKQEAgLTEwMiw2ICsxMTMsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTEzLDcgKzEyOCw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjAsNiArMTc1LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjA1LDYgKzIyMSw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI4OSw3ICszMDYsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9PVkVSV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCkBAIC0zNTUsNiArMzczLDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zODQsNiArNDAzLDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtMzkxLDcgKzQxMSw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQwOSw5ICs0MjgsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC01NDcsMTAgKzU2Niw3IEBACiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKIENPTkZJR19ORVRERVZfMTAwMDA9eQotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNjQyLDEwICs2NTgsMjAgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgZHJpdmVycworIwogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKQEAgLTY1Niw5ICs2ODIsNyBAQAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtNjkyLDcgKzcxNiw2IEBACiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15Ci0jIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAogCkBAIC03NDYsNyArNzY5LDkgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTgxNSw3ICs4NDAsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTg0OSw2ICs4NzMsNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKQEAgLTg1Nyw4ICs4ODIsMTEgQEAKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CkBAIC04NjYsNiArODk0LDcgQEAKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtODc4LDcgKzkwNyw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CkBAIC05MTAsMTEgKzkzOCwxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CkBAIC05NzksNSArMTAwOSw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTc3MTJfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzcxMl9kZWZjb25maWcKaW5kZXggYjhhYWUxMS4uMWE0M2NmZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NlNzcxMl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzcxMl9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjo0OTowMCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODo1MzozMiAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xMyw2ICsxMyw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjYsNyArMjcsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM2LDYgKzM5LDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiAjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC00OSwxMSArNTgsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldApAQCAtODQsMTggKzk0LDE5IEBACiBDT05GSUdfRVZFTlRGRD15CiAjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKQEAgLTEwNCw2ICsxMTUsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTE1LDcgKzEzMCw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjIsNiArMTc3LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjA3LDYgKzIyMyw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI5MSw3ICszMDgsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9zZGExIgogCiAjCkBAIC0zNjgsNiArMzg2LDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC00MzMsNiArNDUyLDcgQEAKIENPTkZJR19GSUJfUlVMRVM9eQogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CkBAIC00NDAsNyArNDYwLDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDY0LDkgKzQ4Myw5IEBACiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKIENPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC01OTcsNyArNjE2LDYgQEAKICMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0JOWDJfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTYwNSw2ICs2MjMsNyBAQAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogQ09ORklHX0FUQV9TRkY9eQogIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CkBAIC02NTgsMTAgKzY3Nyw3IEBACiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKIENPTkZJR19ORVRERVZfMTAwMDA9eQotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNzE5LDExICs3MzUsMTUgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC04MjgsOCArODQ4LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX1BPU0lYX0FDTD15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CkBAIC04NjYsOCArODg4LDYgQEAKIENPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQogQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CkBAIC05MDAsNyArOTIwLDYgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKICMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CkBAIC05MzUsNiArOTU0LDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTk2NCwyNCArOTg0LDMwIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQogIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC05OTQsMTQgKzEwMjAsMTMgQEAKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAotIyBDT05GSUdfS01FTUNIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0JPT1RNRU0gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1QX0NPREUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfTk9fQlNTX0lOSVQgaXMgbm90IHNldAogCiAjCkBAIC0xMDE2LDcgKzEwNDEsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQ9eQpAQCAtMTA1OSwxMSArMTA4MywxMyBAQAogIwogQ09ORklHX0NSWVBUT19ITUFDPXkKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19NRDU9eQogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTExMjcsNSArMTE1Myw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjFfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzcyMV9kZWZjb25maWcKaW5kZXggMzA2ZTIxYy4uYjhhM2M4YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NlNzcyMV9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzcyMV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMjo1MDo0OSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODo1NzoxMSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xMyw2ICsxMyw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjcsNyArMjgsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM3LDYgKzQwLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiAjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01MCwxMSArNTksMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0dST1VQX1NDSEVEPXkKQEAgLTg5LDE4ICs5OSwxOSBAQAogQ09ORklHX0VWRU5URkQ9eQogIyBDT05GSUdfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC0xMDksNiArMTIwLDEwIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTEyMCw3ICsxMzUsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY3LDYgKzE4Miw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIxMiw2ICsyMjgsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0yOTYsNyArMzEzLDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORV9PVkVSV1JJVEU9eQorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvc2RhMiIKIAogIwpAQCAtMzczLDYgKzM5MSw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDM4LDYgKzQ1Nyw3IEBACiBDT05GSUdfRklCX1JVTEVTPXkKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtNDQ1LDcgKzQ2NSw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQ2OSw5ICs0ODgsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldApAQCAtNjA2LDYgKzYyNSw3IEBACiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorQ09ORklHX0FUQV9WRVJCT1NFX0VSUk9SPXkKIENPTkZJR19TQVRBX1BNUD15CiBDT05GSUdfQVRBX1NGRj15CiAjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKQEAgLTYyMSwxMCArNjQxLDcgQEAKICMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogQ09ORklHX05FVERFVl8xMDAwMD15Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC02NzIsMTIgKzY4OSwxMyBAQAogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKICMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TSF9LRVlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTU9VU0U9eQogIyBDT05GSUdfTU9VU0VfUFMyIGlzIG5vdCBzZXQKICMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CkBAIC03MjUsNiArNzQzLDExIEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKQEAgLTc2Miw3ICs3ODUsNiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTc4NSw2ICs4MDcsNyBAQAogQ09ORklHX0hJRF9FWktFWT15CiAjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX1RXSU5IQU4gaXMgbm90IHNldAogIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CkBAIC04MzEsNiArODU0LDcgQEAKICMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD15CiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPIGlzIG5vdCBzZXQKQEAgLTkwMCw2ICs5MjQsNyBAQAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldApAQCAtOTYxLDggKzk4NiwxMCBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApAQCAtMTAwMiw4ICsxMDI5LDYgQEAKIENPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQogQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CkBAIC0xMDM2LDcgKzEwNjEsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVMgaXMgbm90IHNldAogCiAjCkBAIC0xMDk1LDYgKzExMTksNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTEyNCwyNCArMTE0OSwzMCBAQAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQogIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC0xMTU0LDE0ICsxMTg1LDEzIEBACiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tNRU1DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAogIyBDT05GSUdfNEtTVEFDS1MgaXMgbm90IHNldAogIyBDT05GSUdfRFVNUF9DT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX05PX0JTU19JTklUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTE3Niw3ICsxMjA2LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEPXkKQEAgLTEyMTksMTEgKzEyNDgsMTMgQEAKICMKIENPTkZJR19DUllQVE9fSE1BQz15CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fTUQ1PXkKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CkBAIC0xMjg3LDUgKzEzMTgsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCmluZGV4IDYxOTQzODIuLmQ3MDliN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTI6NTQ6MjQgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTg6NTc6NDEgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI5LDcgKzMwLDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC00MCw2ICs0MywxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01MiwxMSArNjEsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTkxLDE5ICsxMDEsMjAgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTFVCX0RFQlVHPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKICMgQ09ORklHX1NMQUIgaXMgbm90IHNldAogQ09ORklHX1NMVUI9eQogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogIyBDT05GSUdfT1BST0ZJTEUgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMTMsNiArMTI0LDExIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTEyNSw3ICsxNDEsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTQxLDcgKzE1Nyw3IEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9OT09QPXkKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCi0jIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKK0NPTkZJR19GUkVFWkVSPXkKIAogIwogIyBTeXN0ZW0gdHlwZQpAQCAtMTc2LDYgKzE5Miw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIzMyw2ICsyNTAsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMTcsNyArMzM1LDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMzM2LDcgKzM1NSwxMyBAQAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKICMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19QTT15CisjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUE1fU0xFRVA9eQorQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CisjIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0CitDT05GSUdfUE1fUlVOVElNRT15CiAjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUPXkKIApAQCAtMzgxLDYgKzQwNiw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDEwLDYgKzQzNiw3IEBACiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKQEAgLTQxNyw3ICs0NDQsNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC00MzAsNiArNDU2LDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CkBAIC00OTQsNyArNTIxLDYgQEAKICMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0JOWDJfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTUwMiw2ICs1MjgsNyBAQAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogQ09ORklHX0FUQV9TRkY9eQogIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CkBAIC01MzUsMTAgKzU2Miw3IEBACiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKIENPTkZJR19ORVRERVZfMTAwMDA9eQotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNTc3LDEyICs2MDEsMTMgQEAKICMKIENPTkZJR19JTlBVVF9LRVlCT0FSRD15CiBDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NIX0tFWVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CkBAIC02MzEsMTAgKzY1NiwyMCBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBkcml2ZXJzCisjCiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldApAQCAtNjQ1LDkgKzY4MCw3IEBACiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC02ODEsNyArNzE0LDYgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAKQEAgLTc3OCw4ICs4MTAsMTAgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTgzOSw3ICs4NzMsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKQEAgLTg2Niw2ICs4OTksNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTg3OCw4ICs5MTIsMTEgQEAKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldApAQCAtODg5LDYgKzkyNiw3IEBACiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC05MDIsNyArOTQwLDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKQEAgLTkzNCwxMSArOTcxLDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTEwMDIsNSArMTA0MSw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjRfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzcyNF9kZWZjb25maWcKaW5kZXggM2VlNzgzYTAuLjU2YjBiOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjRfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjRfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIE1vbiBKdW4gMjkgMTY6Mjg6NDMgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIEZyaSBTZXAgMjUgMTE6NTA6NTkgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtNDIsNiArNDIsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01NCwxMSArNjAsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0dST1VQX1NDSEVEPXkKQEAgLTkxLDIwICs5OCwxOSBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQotQ09ORklHX0hBVkVfUEVSRl9DT1VOVEVSUz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CkBAIC0xNDQsNyArMTUwLDcgQEAKIENPTkZJR19ERUZBVUxUX0NGUT15CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgotIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CitDT05GSUdfRlJFRVpFUj15CiAKICMKICMgU3lzdGVtIHR5cGUKQEAgLTE3OCw2ICsxODQsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyND15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjI0LDYgKzIzMSw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI0OSw2ICsyNTcsOCBAQAogIwogQ09ORklHX1NPTFVUSU9OX0VOR0lORT15CiBDT05GSUdfU0hfNzcyNF9TT0xVVElPTl9FTkdJTkU9eQorIyBDT05GSUdfU0hfS0ZSMlIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9FQ09WRUMgaXMgbm90IHNldAogCiAjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCkBAIC0yNjksNyArMjc5LDEwIEBACiAjCiAjIERNQSBzdXBwb3J0CiAjCi0jIENPTkZJR19TSF9ETUEgaXMgbm90IHNldAorQ09ORklHX1NIX0RNQV9BUEk9eQorQ09ORklHX1NIX0RNQT15CitDT05GSUdfTlJfT05DSElQX0RNQV9DSEFOTkVMUz0xMgorIyBDT05GSUdfTlJfRE1BX0NIQU5ORUxTX0JPT0wgaXMgbm90IHNldAogCiAjCiAjIENvbXBhbmlvbiBDaGlwcwpAQCAtMzA1LDcgKzMxOCw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eTEgY29uc29sZT10dHlTQzMsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgaXA9ZGhjcCBtZW1jaHVuay52cHU9NG0iCiAKICMKQEAgLTMyNSw3ICszMzksMTMgQEAKICMKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCiAjCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfUE09eQorIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BNX1NMRUVQPXkKK0NPTkZJR19TVVNQRU5EPXkKK0NPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorIyBDT05GSUdfSElCRVJOQVRJT04gaXMgbm90IHNldAorQ09ORklHX1BNX1JVTlRJTUU9eQogIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAogQ09ORklHX05FVD15CiAKQEAgLTM3Myw2ICszOTMsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQwMiw2ICs0MjMsNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CkBAIC00MDksNyArNDMxLDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDIyLDYgKzQ0Myw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPXkKQEAgLTQzMSw5ICs0NTMsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTQ4OSw2ICs1MTEsNyBAQAogIwogIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TU1QyNUwgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKQEAgLTY0OCwxMiArNjcxLDEwIEBACiAjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTEgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTY5NywxNCArNzE4LDE5IEBACiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BVFJJWCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKIENPTkZJR19LRVlCT0FSRF9TSF9LRVlTQz15CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldApAQCAtNzU0LDYgKzc4MCw3IEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DT01QQVQ9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC03NjQsNiArNzkxLDcgQEAKICMKICMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCiAjCisjIENPTkZJR19JMkNfREVTSUdOV0FSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfU0hfTU9CSUxFPXkKQEAgLTc4Niw5ICs4MTQsNiBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKQEAgLTgzOCwxMSArODYzLDE1IEBACiAjCiAjIENPTkZJR19HUElPX01BWDczMDEgaXMgbm90IHNldAogIyBDT05GSUdfR1BJT19NQ1AyM1MwOCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX01DMzM4ODAgaXMgbm90IHNldAorCisjCisjIEFDOTcgR1BJTyBleHBhbmRlcnM6CisjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC04NjIsOCArODkxLDEwIEBACiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQzEzNzgzIGlzIG5vdCBzZXQKICMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0VaWF9QQ0FQIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CkBAIC04NzYsMjQgKzkwNywyNCBAQAogQ09ORklHX1ZJREVPX1Y0TDJfQ09NTU9OPXkKICMgQ09ORklHX1ZJREVPX0FMTE9XX1Y0TDEgaXMgbm90IHNldAogQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUPXkKLSMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19NRURJQT15CitDT05GSUdfRFZCX0NPUkU9bQorQ09ORklHX1ZJREVPX01FRElBPW0KIAogIwogIyBNdWx0aW1lZGlhIGRyaXZlcnMKICMKICMgQ09ORklHX01FRElBX0FUVEFDSCBpcyBub3Qgc2V0Ci1DT05GSUdfTUVESUFfVFVORVI9eQorQ09ORklHX01FRElBX1RVTkVSPW0KICMgQ09ORklHX01FRElBX1RVTkVSX0NVU1RPTUlTRSBpcyBub3Qgc2V0Ci1DT05GSUdfTUVESUFfVFVORVJfU0lNUExFPXkKLUNPTkZJR19NRURJQV9UVU5FUl9UREE4MjkwPXkKLUNPTkZJR19NRURJQV9UVU5FUl9UREE5ODg3PXkKLUNPTkZJR19NRURJQV9UVU5FUl9URUE1NzYxPXkKLUNPTkZJR19NRURJQV9UVU5FUl9URUE1NzY3PXkKLUNPTkZJR19NRURJQV9UVU5FUl9NVDIwWFg9eQotQ09ORklHX01FRElBX1RVTkVSX1hDMjAyOD15Ci1DT05GSUdfTUVESUFfVFVORVJfWEM1MDAwPXkKLUNPTkZJR19NRURJQV9UVU5FUl9NQzQ0UzgwMz15CitDT05GSUdfTUVESUFfVFVORVJfU0lNUExFPW0KK0NPTkZJR19NRURJQV9UVU5FUl9UREE4MjkwPW0KK0NPTkZJR19NRURJQV9UVU5FUl9UREE5ODg3PW0KK0NPTkZJR19NRURJQV9UVU5FUl9URUE1NzYxPW0KK0NPTkZJR19NRURJQV9UVU5FUl9URUE1NzY3PW0KK0NPTkZJR19NRURJQV9UVU5FUl9NVDIwWFg9bQorQ09ORklHX01FRElBX1RVTkVSX1hDMjAyOD1tCitDT05GSUdfTUVESUFfVFVORVJfWEM1MDAwPW0KK0NPTkZJR19NRURJQV9UVU5FUl9NQzQ0UzgwMz1tCiBDT05GSUdfVklERU9fVjRMMj15CiBDT05GSUdfVklERU9CVUZfR0VOPXkKIENPTkZJR19WSURFT0JVRl9ETUFfQ09OVElHPXkKQEAgLTkwNCw2ICs5MzUsNyBAQAogIyBDT05GSUdfVklERU9fVklWSSBpcyBub3Qgc2V0CiAjIENPTkZJR19WSURFT19TQUE1MjQ2QSBpcyBub3Qgc2V0CiAjIENPTkZJR19WSURFT19TQUE1MjQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0FVMDgyOCBpcyBub3Qgc2V0CiBDT05GSUdfU09DX0NBTUVSQT15CiAjIENPTkZJR19TT0NfQ0FNRVJBX01UOU0wMDEgaXMgbm90IHNldAogIyBDT05GSUdfU09DX0NBTUVSQV9NVDlNMTExIGlzIG5vdCBzZXQKQEAgLTkxOSwxNSArOTUxLDE4IEBACiBDT05GSUdfVVNCX0dTUENBPW0KICMgQ09ORklHX1VTQl9NNTYwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RWMDZYWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0w4NjAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dTUENBX0NPTkVYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HU1BDQV9FVE9NUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR1NQQ0FfRklORVBJWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR1NQQ0FfSkVJTElOSiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR1NQQ0FfTUFSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR1NQQ0FfTVI5NzMxMEEgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dTUENBX09WNTE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HU1BDQV9PVjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR1NQQ0FfUEFDMjA3IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HU1BDQV9QQUM3MzExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TTjlDMjBYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HU1BDQV9TT05JWEIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dTUENBX1NPTklYSiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR1NQQ0FfU1BDQTUwMCBpcyBub3Qgc2V0CkBAIC05NTcsNiArOTkyLDI2IEBACiAjIENPTkZJR19VU0JfU1RLV0VCQ0FNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TMjI1NSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQURJT19BREFQVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfRFZCX01BWF9BREFQVEVSUz04CisjIENPTkZJR19EVkJfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorQ09ORklHX0RWQl9DQVBUVVJFX0RSSVZFUlM9eQorIyBDT05GSUdfVFRQQ0lfRUVQUk9NIGlzIG5vdCBzZXQKKworIworIyBTdXBwb3J0ZWQgVVNCIEFkYXB0ZXJzCisjCisjIENPTkZJR19EVkJfVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNU19TSUFOT19NRFRWIGlzIG5vdCBzZXQKKworIworIyBTdXBwb3J0ZWQgRmxleENvcElJIChCMkMyKSBBZGFwdGVycworIworIyBDT05GSUdfRFZCX0IyQzJfRkxFWENPUCBpcyBub3Qgc2V0CisKKyMKKyMgU3VwcG9ydGVkIERWQiBGcm9udGVuZHMKKyMKKyMgQ09ORklHX0RWQl9GRV9DVVNUT01JU0UgaXMgbm90IHNldAogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtMTAxNywxMCArMTA3Miw4MCBAQAogIyBDT05GSUdfTE9HT19TVVBFUkhfTU9OTyBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPX1NVUEVSSF9WR0ExNiBpcyBub3Qgc2V0CiBDT05GSUdfTE9HT19TVVBFUkhfQ0xVVDIyND15Ci0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkQ9eQorIyBDT05GSUdfU09VTkRfT1NTX0NPUkUgaXMgbm90IHNldAorQ09ORklHX1NORD1tCitDT05GSUdfU05EX1RJTUVSPW0KK0NPTkZJR19TTkRfUENNPW0KK0NPTkZJR19TTkRfSkFDSz15CisjIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSVhFUl9PU1MgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BDTV9PU1MgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAorQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CisjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9SQVdNSURJX1NFUSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BMM19MSUJfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUEw0X0xJQl9TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NCQVdFX1NFUSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMV9TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RSSVZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1VQRVJIIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfVVNCPXkKKyMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQl9DQUlBUSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NPQz1tCisKKyMKKyMgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFN1cGVySAorIworQ09ORklHX1NORF9TT0NfU0g0X0ZTST1tCitDT05GSUdfU05EX0ZTSV9BSzQ2NDI9eQorQ09ORklHX1NORF9TT0NfSTJDX0FORF9TUEk9bQorQ09ORklHX1NORF9TT0NfQUxMX0NPREVDUz1tCitDT05GSUdfU05EX1NPQ19XTV9IVUJTPW0KK0NPTkZJR19TTkRfU09DX0FEMTgzNj1tCitDT05GSUdfU05EX1NPQ19BRDE5Mzg9bQorQ09ORklHX1NORF9TT0NfQUQ3MzMxMT1tCitDT05GSUdfU05EX1NPQ19BSzQxMDQ9bQorQ09ORklHX1NORF9TT0NfQUs0NTM1PW0KK0NPTkZJR19TTkRfU09DX0FLNDY0Mj1tCitDT05GSUdfU05EX1NPQ19DUzQyNzA9bQorQ09ORklHX1NORF9TT0NfTDM9bQorQ09ORklHX1NORF9TT0NfUENNMzAwOD1tCitDT05GSUdfU05EX1NPQ19TUERJRj1tCitDT05GSUdfU05EX1NPQ19TU00yNjAyPW0KK0NPTkZJR19TTkRfU09DX1RMVjMyMEFJQzIzPW0KK0NPTkZJR19TTkRfU09DX1RMVjMyMEFJQzI2PW0KK0NPTkZJR19TTkRfU09DX1RMVjMyMEFJQzNYPW0KK0NPTkZJR19TTkRfU09DX1VEQTEzNFg9bQorQ09ORklHX1NORF9TT0NfVURBMTM4MD1tCitDT05GSUdfU05EX1NPQ19XTTg1MTA9bQorQ09ORklHX1NORF9TT0NfV004NTIzPW0KK0NPTkZJR19TTkRfU09DX1dNODU4MD1tCitDT05GSUdfU05EX1NPQ19XTTg3Mjg9bQorQ09ORklHX1NORF9TT0NfV004NzMxPW0KK0NPTkZJR19TTkRfU09DX1dNODc1MD1tCitDT05GSUdfU05EX1NPQ19XTTg3NTM9bQorQ09ORklHX1NORF9TT0NfV004Nzc2PW0KK0NPTkZJR19TTkRfU09DX1dNODkwMD1tCitDT05GSUdfU05EX1NPQ19XTTg5MDM9bQorQ09ORklHX1NORF9TT0NfV004OTQwPW0KK0NPTkZJR19TTkRfU09DX1dNODk2MD1tCitDT05GSUdfU05EX1NPQ19XTTg5NjE9bQorQ09ORklHX1NORF9TT0NfV004OTcxPW0KK0NPTkZJR19TTkRfU09DX1dNODk3ND1tCitDT05GSUdfU05EX1NPQ19XTTg5ODg9bQorQ09ORklHX1NORF9TT0NfV004OTkwPW0KK0NPTkZJR19TTkRfU09DX1dNODk5Mz1tCitDT05GSUdfU05EX1NPQ19XTTkwODE9bQorQ09ORklHX1NORF9TT0NfTUFYOTg3Nz1tCisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15Ci0jIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA0Myw2ICsxMTY4LDcgQEAKICMgQ09ORklHX0hJRF9FWktFWSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9HWVJBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfTE9HSVRFQ0ggaXMgbm90IHNldAogIyBDT05GSUdfSElEX01JQ1JPU09GVCBpcyBub3Qgc2V0CkBAIC0xMDcyLDYgKzExOTgsNyBAQAogIyBDT05GSUdfVVNCX0RFVklDRUZTIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfREVWSUNFX0NMQVNTPXkKICMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VTUEVORCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CkBAIC0xMDg2LDkgKzEyMTMsMTEgQEAKICMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRD15CiAjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCkBAIC0xMTUxLDkgKzEyODAsNDYgQEAKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfVkJVU19EUkFXPTIKK0NPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfVVNCMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1I4QTY2NTk3PXkKK0NPTkZJR19VU0JfUjhBNjY1OTc9eQorIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyN1ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9TM0NfSFNPVEcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTTY2NTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfQU1ENTUzNlVEQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0ZTTF9RRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0NJMTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xBTkdXRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRD15CisjIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVESU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9FVEg9bQorQ09ORklHX1VTQl9FVEhfUk5ESVM9eQorIyBDT05GSUdfVVNCX0VUSF9FRU0gaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRGUz1tCitDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfRklMRV9TVE9SQUdFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX1VTQl9HX1NFUklBTD1tCisjIENPTkZJR19VU0JfTUlESV9HQURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dfUFJJTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ0RDX0NPTVBPU0lURSBpcyBub3Qgc2V0CiAKICMKICMgT1RHIGFuZCByZWxhdGVkIGluZnJhc3RydWN0dXJlCkBAIC0xMTc2LDYgKzEzNDIsOCBAQAogIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwogIwogIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19BVE1FTE1DSSBpcyBub3Qgc2V0CiBDT05GSUdfTU1DX1NQST15CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CkBAIC0xMjIzLDYgKzEzOTEsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0YyMTIzIGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwpAQCAtMTI3OSw2ICsxNDQ4LDcgQEAKICMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTEzNDMsNyArMTUxMyw2IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTE0MjMsNiArMTU5Miw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTE0MzMsOCArMTYwMywxMSBAQAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldApAQCAtMTQ0Miw2ICsxNjE1LDcgQEAKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtMTQ1NSw3ICsxNjI5LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC0xNDk2LDExICsxNjY5LDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTE1NjIsNSArMTczNyw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTc3NTBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzc1MF9kZWZjb25maWcKaW5kZXggNTY0YmY3Yi4uN2JjOTI2YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NlNzc1MF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzc1MF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMzowMDowMSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxODo1ODo1OCAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjcsNyArMjgsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM3LDYgKzQwLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpAQCAtNDksMTEgKzU4LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC04NCwxOCArOTQsMTkgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKQEAgLTEwNCw2ICsxMTUsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTE1LDcgKzEzMCw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjIsNiArMTc3LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjA3LDYgKzIyMyw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI5MSw3ICszMDgsOCBAQAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCiAjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX09WRVJXUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTM1OCw2ICszNzYsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTM4Nyw2ICs0MDYsNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CkBAIC0zOTQsNyArNDE0LDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDEyLDkgKzQzMSw5IEBACiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTU2Myw3ICs1ODIsNiBAQAogIyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQk5YMl9JU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldApAQCAtNTk5LDEwICs2MTcsNyBAQAogIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTY2NSwxMCArNjgwLDIwIEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CkBAIC02NzksOSArNzA0LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtNzY2LDggKzc4OSwxMCBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQpAQCAtODM4LDcgKzg2Myw2IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiAjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldApAQCAtODg1LDYgKzkwOSw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTg5NCw4ICs5MTksMTEgQEAKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CkBAIC05MDMsNiArOTMxLDcgQEAKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtOTE2LDcgKzk0NSw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CkBAIC05NDgsMTEgKzk3NiwxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CkBAIC0xMDE2LDUgKzEwNDYsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUxX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3NTFfZGVmY29uZmlnCmluZGV4IGViNDMxYzQuLmMyMGFlNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3NTFfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3NTFfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTM6MDI6MjYgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTk6MDE6NDEgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI3LDcgKzI4LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zNyw2ICs0MCwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC00OSwxMSArNTgsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldApAQCAtODcsMTggKzk3LDE5IEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC0xMDcsNiArMTE4LDEwIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTExOCw3ICsxMzMsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY1LDYgKzE4MCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIxMCw2ICsyMjYsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0yOTUsNyArMzEyLDggQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAogIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzEsMzg0MDAiCiAKICMKQEAgLTM4Miw2ICs0MDAsNyBAQAogIyBDT05GSUdfSVBfTkZfQVJQVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQxMSw2ICs0MzAsNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CkBAIC00MTgsNyArNDM4LDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDM2LDkgKzQ1NSw5IEBACiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTU3NCwxMCArNTkzLDcgQEAKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogQ09ORklHX05FVERFVl8xMDAwMD15Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC02MzIsMTAgKzY0OCwyMCBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBkcml2ZXJzCisjCiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldApAQCAtNjQ2LDkgKzY3Miw3IEBACiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTczNCw4ICs3NTgsMTAgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTgwNiw3ICs4MzIsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKQEAgLTgzMyw2ICs4NTgsNyBAQAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtODQyLDggKzg2OCwxMSBAQAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTg1MSw2ICs4ODAsNyBAQAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC04NjQsNyArODk0LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKQEAgLTg5NiwxMSArOTI1LDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTk2NSw1ICs5OTYsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzgwX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3ODBfZGVmY29uZmlnCmluZGV4IDc1NmJlZWMuLjgyYmFlZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3ODBfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3ODBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTM6MDM6NTYgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTk6MDM6NTkgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDcgKzI5LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOCw2ICs0MSwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKICMgQ09ORklHX1NXQVAgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTQ4LDExICs1NywxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNApAQCAtODEsMTkgKzkxLDIwIEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKKyMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CkBAIC0xMDEsNiArMTEyLDExIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTExMiw3ICsxMjgsOCBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKK0NPTkZJR19CTEtfREVWX0JTRz15CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKQEAgLTE1OSw2ICsxNzYsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODA9eQpAQCAtMTk5LDcgKzIxNyw2IEBACiBDT05GSUdfU1BBUlNFTUVNPXkKIENPTkZJR19IQVZFX01FTU9SWV9QUkVTRU5UPXkKIENPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKLUNPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIENPTkZJR19NSUdSQVRJT049eQogIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldApAQCAtMjA3LDYgKzIyNCw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI4Nyw4ICszMDUsOSBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgxMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi1DT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMC4xMTUyMDAgcm9vdD0vZGV2L3NkYTEiCitDT05GSUdfQ01ETElORV9PVkVSV1JJVEU9eQorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvc2RhMSIKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMzgyLDYgKzQwMSw3IEBACiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKQEAgLTM4OSw3ICs0MDksNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKIApAQCAtNDA2LDkgKzQyNSw5IEBACiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTU0OSw2ICs1NjgsNyBAQAogIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CkBAIC01ODcsMTEgKzYwNywxMyBAQAogIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUE1DUkFJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQogQ09ORklHX1NBVEFfUE1QPXkKICMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKQEAgLTYxMiw2ICs2MzQsNyBAQAogIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FUUDg2N1ggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldApAQCAtNjMwLDYgKzY1Myw3IEBACiAjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9OUzg3NDE1IGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKQEAgLTY0OCw4ICs2NzIsMTMgQEAKICMKIAogIwotIyBBIG5ldyBhbHRlcm5hdGl2ZSBGaXJlV2lyZSBzdGFjayBpcyBhdmFpbGFibGUgd2l0aCBFWFBFUklNRU5UQUw9eQorIyBZb3UgY2FuIGVuYWJsZSBvbmUgb3IgYm90aCBGaXJlV2lyZSBkcml2ZXIgc3RhY2tzLgogIworCisjCisjIFNlZSB0aGUgaGVscCB0ZXh0cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15CkBAIC03MjQsMTAgKzc1Myw3IEBACiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtODIxLDEwICs4NDcsMTkgQEAKIENPTkZJR19ERVZQT1JUPXkKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgZHJpdmVycworIwogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldApAQCAtODMzLDcgKzg2OCw2IEBACiAjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogQ09ORklHX1RIRVJNQUw9eQogIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CkBAIC04NTcsNiArODkxLDcgQEAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworQ09ORklHX1ZHQV9BUkI9eQogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKQEAgLTkzNywxMSArOTcyLDExIEBACiBDT05GSUdfTE9HT19TVVBFUkhfQ0xVVDIyND15CiBDT05GSUdfU09VTkQ9eQogQ09ORklHX1NPVU5EX09TU19DT1JFPXkKK0NPTkZJR19TT1VORF9PU1NfQ09SRV9QUkVDTEFJTT15CiAjIENPTkZJR19TTkQgaXMgbm90IHNldAogQ09ORklHX1NPVU5EX1BSSU1FPXkKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogCiAjCkBAIC05NjQsNiArOTk5LDcgQEAKIENPTkZJR19ISURfRVpLRVk9eQogIyBDT05GSUdfSElEX0tZRSBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0dZUkFUSU9OPXkKKyMgQ09ORklHX0hJRF9UV0lOSEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9LRU5TSU5HVE9OIGlzIG5vdCBzZXQKIENPTkZJR19ISURfTE9HSVRFQ0g9eQogIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldApAQCAtMTAwOSw2ICsxMDQ1LDcgQEAKICMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPXkKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldApAQCAtMTI0Myw2ICsxMjgwLDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMjUzLDggKzEyOTEsMTEgQEAKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldApAQCAtMTI2Myw2ICsxMzA0LDcgQEAKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtMTI3Niw3ICsxMzE4LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldApAQCAtMTMwOSw2ICsxMzUwLDcgQEAKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTEzNzEsNSArMTQxMyw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaDAzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaDAzX2RlZmNvbmZpZwppbmRleCA3ZmVkYWFlLi5kZDBlODkwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2gwM19kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoMDNfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTM6MDQ6NDEgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTk6MDc6MTQgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI5LDcgKzMwLDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC00MCw2ICs0MywxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01MywxMSArNjIsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldApAQCAtOTEsMjAgKzEwMSwyMiBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCitDT05GSUdfUEVSRl9FVkVOVFM9eQorQ09ORklHX0VWRU5UX1BST0ZJTEU9eQorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1BDSV9RVUlSS1M9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQogQ09ORklHX1RSQUNFUE9JTlRTPXkKLUNPTkZJR19NQVJLRVJTPXkKIENPTkZJR19PUFJPRklMRT1tCiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKQEAgLTExNCw2ICsxMjYsMTEgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTI2LDcgKzE0Myw3IEBACiBDT05GSUdfTU9EVkVSU0lPTlM9eQogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTczLDYgKzE5MCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIxOCw2ICsyMzYsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMDIsNyArMzIxLDggQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAogIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0Ci1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzEsMTE1MjAwIG1lbT02NE0gcm9vdD0vZGV2L25mcyIKIAogIwpAQCAtMzgyLDYgKzQwMiw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDEyLDYgKzQzMyw3IEBACiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKQEAgLTQxOSw3ICs0NDEsNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC00MzIsNiArNDUzLDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAogIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldApAQCAtNTkxLDYgKzYxMyw3IEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QTUNSQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKQEAgLTYwMyw3ICs2MjYsMTEgQEAKICMKIAogIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CkBAIC02NzksNiArNzA2LDcgQEAKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19DTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CkBAIC03MDQsMTAgKzczMiw3IEBACiAjIENPTkZJR19TRkMgaXMgbm90IHNldAogIyBDT05GSUdfQkUyTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTgwNCwxMCArODI5LDIwIEBACiBDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBkcml2ZXJzCisjCiAjIENPTkZJR19TRU5TT1JTX0k1S19BTUIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldApAQCAtODIyLDkgKzg1Nyw3IEBACiAjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTg2MSw2ICs4OTQsNyBAQAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCitDT05GSUdfVkdBX0FSQj15CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldApAQCAtODc5LDcgKzkxMyw2IEBACiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15Ci0jIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAogCkBAIC05NDQsOCArOTc3LDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX1BPU0lYX0FDTD15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQpAQCAtMTAxMSwxMiArMTA0NiwxMiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX1Y0XzEgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPXkKIENPTkZJR19ORlNEX1YzPXkKQEAgLTExMDgsNiArMTE0Myw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTExOSwxMSArMTE1NSwxNSBAQAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfTk9QX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19FVkVOVF9UUkFDSU5HPXkKIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQorQ09ORklHX1JJTkdfQlVGRkVSX0FMTE9XX1NXQVA9eQogQ09ORklHX1RSQUNJTkc9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldApAQCAtMTEzNCw2ICsxMTc0LDcgQEAKIENPTkZJR19TSF9TVEFOREFSRF9CSU9TPXkKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTExNDcsNyArMTE4OCw2IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEk9eQogQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKIENPTkZJR19DUllQVE9fQUVBRDI9eQpAQCAtMTE4OSwxMSArMTIyOSwxMyBAQAogIwogQ09ORklHX0NSWVBUT19ITUFDPXkKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19NRDU9eQogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKQEAgLTEyNTksNSArMTMwMSw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaDc3MTB2b2lwZ3dfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NoNzcxMHZvaXBnd19kZWZjb25maWcKaW5kZXggYzI5NmNhNS4uNjYyMTU2ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NoNzcxMHZvaXBnd19kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoNzcxMHZvaXBnd19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMzowNjoxMyAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxOToxMTo0OSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjcsNyArMjgsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM3LDYgKzQwLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpAQCAtNDksMTEgKzU4LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19HUk9VUF9TQ0hFRD15CkBAIC04NywxOCArOTcsMTkgQEAKIENPTkZJR19FVkVOVEZEPXkKICMgQ09ORklHX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtMTA3LDYgKzExOCwxMSBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xMTgsNyArMTM0LDcgQEAKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE2NSw2ICsxODEsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMTAsNiArMjI3LDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMjkyLDcgKzMxMCw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLSMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX09WRVJXUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTM3NCw2ICszOTMsNyBAQAogIyBDT05GSUdfSVBfTkZfQVJQVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQ0MCw2ICs0NjAsNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CkBAIC00NDcsNyArNDY4LDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDY5LDkgKzQ4OSw5IEBACiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTYwNSwxMCArNjI1LDcgQEAKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogQ09ORklHX05FVERFVl8xMDAwMD15Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC02ODYsNiArNzAzLDExIEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKQEAgLTcyMyw3ICs3NDUsNiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKIApAQCAtNzc1LDggKzc5NiwxMCBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CkBAIC04MTMsOCArODM2LDYgQEAKIENPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQogQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CkBAIC04NDcsNyArODY4LDYgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CkBAIC04NzQsNiArODk0LDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC04ODMsOCArOTA0LDExIEBACiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldApAQCAtODkzLDYgKzkxNyw3IEBACiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTkwNiw3ICs5MzEsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldApAQCAtOTM4LDExICs5NjIsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTAwNiw1ICsxMDMyLDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NoNzcyNF9nZW5lcmljX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaDc3MjRfZ2VuZXJpY19kZWZjb25maWcKaW5kZXggYmEyNmJlMS4uZTA2NzE5YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NoNzcyNF9nZW5lcmljX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzI0X2dlbmVyaWNfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTM6MDY6NDggMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTk6MTQ6MDAgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDcgKzI5LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOCw2ICs0MSwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTQ2LDE0ICs1NSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi0jIENPTkZJR19DTEFTU0lDX1JDVSBpcyBub3Qgc2V0CiBDT05GSUdfVFJFRV9SQ1U9eQotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX1JDVV9GQU5PVVQ9MzIKICMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKIENPTkZJR19HUk9VUF9TQ0hFRD15CkBAIC05MiwxOSArOTksMjEgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19FVkVOVF9QUk9GSUxFPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xVQj15CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQogQ09ORklHX1RSQUNFUE9JTlRTPXkKLUNPTkZJR19NQVJLRVJTPXkKIENPTkZJR19PUFJPRklMRT15CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtMTEzLDEzICsxMjIsMTggQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfQkFTRV9TTUFMTD0wCiAjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY5LDYgKzE4Myw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0PXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMTQsNyArMjI5LDYgQEAKICMKICMgTWVtb3J5IGhvdHBsdWcgaXMgY3VycmVudGx5IGluY29tcGF0aWJsZSB3aXRoIFNvZnR3YXJlIFN1c3BlbmQKICMKLUNPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIENPTkZJR19NSUdSQVRJT049eQogIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldApAQCAtMjIyLDYgKzIzNiw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI0Niw2ICsyNjEsOCBAQAogIyBCb2FyZCBzdXBwb3J0CiAjCiAjIENPTkZJR19TSF83NzI0X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9LRlIyUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0VDT1ZFQyBpcyBub3Qgc2V0CiAKICMKICMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KQEAgLTMxOCw3ICszMzUsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9PVkVSV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCkBAIC0zNDUsNiArMzYzLDcgQEAKIENPTkZJR19ISUJFUk5BVElPTl9OVlM9eQogQ09ORklHX0hJQkVSTkFUSU9OPXkKIENPTkZJR19QTV9TVERfUEFSVElUSU9OPSIiCitDT05GSUdfUE1fUlVOVElNRT15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0NQVV9JRExFX0dPVl9MQURERVI9eQogQ09ORklHX0NQVV9JRExFX0dPVl9NRU5VPXkKQEAgLTQyNyw2ICs0NDYsNyBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIApAQCAtNDM3LDYgKzQ1Nyw3IEBACiAjCiAjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQogIworIyBDT05GSUdfSTJDX0RFU0lHTldBUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX1NIX01PQklMRT15CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKQEAgLTQ1NiwyMCArNDc3LDIxIEBACiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtNDg4LDggKzUxMCwxMCBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKQEAgLTU0MCw2ICs1NjQsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4MDI1IGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTU4Nyw3ICs2MTIsOSBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CkBAIC02NDIsNiArNjY5LDcgQEAKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTY1NCwxMSArNjgyLDE1IEBACiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfTk9QX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19FVkVOVF9UUkFDSU5HPXkKIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQorQ09ORklHX1JJTkdfQlVGRkVSX0FMTE9XX1NXQVA9eQogQ09ORklHX1RSQUNJTkc9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldApAQCAtNjY4LDYgKzcwMCw3IEBACiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTY5Miw0ICs3MjUsNSBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NoNzc2M3JkcF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzYzcmRwX2RlZmNvbmZpZwppbmRleCBiMWQ5YjIzLi4xOTRmZjcwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzYzcmRwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzYzcmRwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMAotIyBUaHUgSnVuIDE4IDEzOjA3OjE1IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE5OjE1OjM3IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTE0LDYgKzE0LDcgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CiAjIENPTkZJR19HRU5FUklDX0dQSU8gaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CkBAIC0yNyw3ICsyOCw5IEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzcsNiArNDAsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpAQCAtNDgsMTEgKzU3LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC05MiwxOSArMTAyLDIxIEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKK0NPTkZJR19QRVJGX0VWRU5UUz15CitDT05GSUdfRVZFTlRfUFJPRklMRT15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfVFJBQ0VQT0lOVFM9eQotQ09ORklHX01BUktFUlM9eQogQ09ORklHX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldApAQCAtMTE0LDYgKzEyNiwxMSBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xMjUsNyArMTQyLDcgQEAKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE3Myw2ICsxOTAsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzPXkKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjE0LDcgKzIzMiw2IEBACiBDT05GSUdfSEFWRV9NRU1PUllfUFJFU0VOVD15CiBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiAjIENPTkZJR19NRU1PUllfSE9UUExVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiBDT05GSUdfTUlHUkFUSU9OPXkKICMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKQEAgLTIyMiw2ICsyMzksNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMDMsNyArMzIxLDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORV9PVkVSV1JJVEU9eQorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MyLDExNTIwMCByb290PS9kZXYvc2RhMSByb290ZGVsYXk9MTAiCiAKICMKQEAgLTM3MSw2ICszOTAsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQwMSw2ICs0MjEsNyBAQAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQogQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CkBAIC00MDksNyArNDMwLDYgQEAKICMKICMgQ0ZHODAyMTEgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgTUFDODAyMTEKICMKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTAKICMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldApAQCAtNDIyLDYgKzQ0Miw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPXkKQEAgLTQzMSw5ICs0NTIsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKICMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldApAQCAtNDg4LDYgKzUwOSw3IEBACiBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQogQ09ORklHX01URF9QSFlTTUFQPXkKICMgQ09ORklHX01URF9QSFlTTUFQX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfR1BJT19BRERSIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIAogIwpAQCAtNTY1LDcgKzU4Nyw2IEBACiAjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9CTlgyX0lTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CkBAIC02MjEsMTAgKzY0Miw3IEBACiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTcxNiwxMSArNzM0LDE1IEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtODMwLDYgKzg1Miw3IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0CkBAIC04OTksNiArOTIyLDcgQEAKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKQEAgLTkyMyw2ICs5NDcsOCBAQAogIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwogIwogIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19BVE1FTE1DSSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKQEAgLTk1Niw4ICs5ODIsMTAgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CkBAIC0xMDIyLDcgKzEwNTAsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTEwOTYsNiArMTEyMyw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMTA3LDExICsxMTM1LDE1IEBACiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfUklOR19CVUZGRVI9eQogQ09ORklHX0VWRU5UX1RSQUNJTkc9eQogQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfUklOR19CVUZGRVJfQUxMT1dfU1dBUD15CiBDT05GSUdfVFJBQ0lORz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CkBAIC0xMTIxLDYgKzExNTMsNyBAQAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC0xMTM0LDcgKzExNjcsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldApAQCAtMTE2NiwxMSArMTE5OCwxMyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CkBAIC0xMjMyLDUgKzEyNjYsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzcwX2dlbmVyaWNfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NoNzc3MF9nZW5lcmljX2RlZmNvbmZpZwppbmRleCA0MjZhODhmLi4zNGJlZDU1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzcwX2dlbmVyaWNfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zaDc3NzBfZ2VuZXJpY19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMzowODowNSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxOToxNzoxNiAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjcsNyArMjgsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM3LDYgKzQwLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiAjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpAQCAtNDUsMTQgKzU0LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLSMgQ09ORklHX0NMQVNTSUNfUkNVIGlzIG5vdCBzZXQKIENPTkZJR19UUkVFX1JDVT15Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfUkNVX0ZBTk9VVD0zMgogIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNwogQ09ORklHX0dST1VQX1NDSEVEPXkKQEAgLTkxLDE5ICs5OCwyMSBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCitDT05GSUdfUEVSRl9FVkVOVFM9eQorQ09ORklHX0VWRU5UX1BST0ZJTEU9eQorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfVFJBQ0VQT0lOVFM9eQotQ09ORklHX01BUktFUlM9eQogQ09ORklHX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC0xMTIsMTMgKzEyMSwxOCBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworIyBDT05GSUdfR0NPVl9LRVJORUwgaXMgbm90IHNldAogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKICMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjYsNiArMTgwLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzA9eQogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIxMCw3ICsyMjUsNiBAQAogIwogIyBNZW1vcnkgaG90cGx1ZyBpcyBjdXJyZW50bHkgaW5jb21wYXRpYmxlIHdpdGggU29mdHdhcmUgU3VzcGVuZAogIwotQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogQ09ORklHX01JR1JBVElPTj15CiAjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CkBAIC0yMTgsNiArMjMyLDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMzEzLDcgKzMyOCw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLSMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX09WRVJXUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTMzOCw2ICszNTQsNyBAQAogQ09ORklHX0hJQkVSTkFUSU9OX05WUz15CiBDT05GSUdfSElCRVJOQVRJT049eQogQ09ORklHX1BNX1NURF9QQVJUSVRJT049IiIKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAogQ09ORklHX0NQVV9JRExFPXkKIENPTkZJR19DUFVfSURMRV9HT1ZfTEFEREVSPXkKIENPTkZJR19DUFVfSURMRV9HT1ZfTUVOVT15CkBAIC00MjAsNiArNDM3LDcgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NPTVBBVD15CiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKQEAgLTQzMCw2ICs0NDgsNyBAQAogIwogIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKICMKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogQ09ORklHX0kyQ19TSF9NT0JJTEU9eQogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CkBAIC00NDksMjAgKzQ2OCwyMSBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTQ4MSw4ICs1MDEsMTAgQEAKICMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODMxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAorIyBDT05GSUdfQUIzMTAwX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAogCkBAIC01MzMsNiArNTU1LDcgQEAKICMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODAyNSBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCkBAIC01ODAsNyArNjAzLDkgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApAQCAtNjM1LDYgKzY2MCw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC02NDcsMTEgKzY3MywxNSBAQAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX05PUF9UUkFDRVI9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19SSU5HX0JVRkZFUj15CiBDT05GSUdfRVZFTlRfVFJBQ0lORz15CiBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSPXkKK0NPTkZJR19SSU5HX0JVRkZFUl9BTExPV19TV0FQPXkKIENPTkZJR19UUkFDSU5HPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKQEAgLTY2MSw2ICs2OTEsNyBAQAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC02ODUsNCArNzE2LDUgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaDc3ODVsY3JfMzJiaXRfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NoNzc4NWxjcl8zMmJpdF9kZWZjb25maWcKaW5kZXggZWQzMTZmNi4uNTFjYmFlZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NoNzc4NWxjcl8zMmJpdF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoNzc4NWxjcl8zMmJpdF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMzowODoyOSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgRnJpIFNlcCAyNSAxMTozOToyMCAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjksOCArMzAsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQotQ09ORklHX0lPX1RSQVBQRUQ9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTQxLDEwICs0MywxNyBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CkBAIC01MywxMSArNjIsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTY3LDggKzc3LDcgQEAKIENPTkZJR19VU0VSX1NDSEVEPXkKICMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CkBAIC03OSw3ICs4OCw3IEBACiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQpAQCAtOTMsMjggKzEwMiwzNyBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCitDT05GSUdfUEVSRl9FVkVOVFM9eQorQ09ORklHX0VWRU5UX1BST0ZJTEU9eQorQ09ORklHX1BFUkZfQ09VTlRFUlM9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAotIyBDT05GSUdfT1BST0ZJTEUgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUE9JTlRTPXkKK0NPTkZJR19PUFJPRklMRT15CiBDT05GSUdfSEFWRV9PUFJPRklMRT15Ci0jIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19LUFJPQkVTPXkKK0NPTkZJR19LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIworQ09ORklHX0dDT1ZfS0VSTkVMPXkKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTI3LDcgKzE0NSw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE3Niw2ICsxOTQsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMTUsNiArMjM0LDEyIEBACiAjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKK0NPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NEs9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMjU2SyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8xTUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNE1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0TUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNTEyTUIgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogIyBDT05GSUdfRkxBVE1FTV9NQU5VQUwgaXMgbm90IHNldAogIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CkBAIC0yMjMsNyArMjQ4LDYgQEAKIENPTkZJR19IQVZFX01FTU9SWV9QUkVTRU5UPXkKIENPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKICMgQ09ORklHX01FTU9SWV9IT1RQTFVHIGlzIG5vdCBzZXQKLUNPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIENPTkZJR19NSUdSQVRJT049eQogIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldApAQCAtMjMxLDYgKzI1NSw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTI1Niw2ICsyODEsNyBAQAogIwogIyBDT05GSUdfU0hfSElHSExBTkRFUiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfU0g3Nzg1TENSPXkKKyMgQ09ORklHX1NIX1NINzc4NUxDUl9QVCBpcyBub3Qgc2V0CiAKICMKICMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KQEAgLTI2NCwxNCArMjkwLDI5IEBACiBDT05GSUdfU0hfUENMS19GUkVRPTUwMDAwMDAwCiBDT05GSUdfU0hfQ0xLX0NQRz15CiBDT05GSUdfVElDS19PTkVTSE9UPXkKLSMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKK0NPTkZJR19OT19IWj15CiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQorQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUz15CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QRVJGT1JNQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QT1dFUlNBVkUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORD15CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9DT05TRVJWQVRJVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORD15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9DUFVfRlJFUT15CiAKICMKICMgRE1BIHN1cHBvcnQKQEAgLTI5OSwxMiArMzQwLDEyIEBACiBDT05GSUdfU0NIRURfSFJUSUNLPXkKIENPTkZJR19LRVhFQz15CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUPXkKIENPTkZJR19HVVNBPXkKLSMgQ09ORklHX1NQQVJTRV9JUlEgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRV9JUlE9eQogCiAjCiAjIEJvb3Qgb3B0aW9ucwpAQCAtMzEyLDcgKzM1Myw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLSMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX09WRVJXUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTMyMSw4ICszNjMsNyBAQAogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0Ci1DT05GSUdfUENJX0xFR0FDWT15Ci0jIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0lfU1RVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0lfSU9WIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CkBAIC0zMzksOCArMzgwLDEzIEBACiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQogIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAorQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJQkVSTkFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAorQ09ORklHX0NQVV9JRExFPXkKK0NPTkZJR19DUFVfSURMRV9HT1ZfTEFEREVSPXkKK0NPTkZJR19DUFVfSURMRV9HT1ZfTUVOVT15CiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMzkyLDYgKzQzOCw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDE0LDYgKzQ2MSw4IEBACiAjIE5ldHdvcmsgdGVzdGluZwogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVENQUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RST1BfTU9OSVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19DQU4gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CkBAIC00MjEsNiArNDcwLDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlM9eQpAQCAtNDI5LDcgKzQ3OSw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQ0MiwxOCArNDkxLDE3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKIENPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CkBAIC01MzgsNyArNTg2LDggQEAKICMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKQEAgLTU2MSw3ICs2MTAsNyBAQAogQ09ORklHX1NDU0lfRE1BPXkKICMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKKyMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKQEAgLTU5MSw2ICs2NDAsNyBAQAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldApAQCAtNjEyLDYgKzY2Miw3IEBACiAjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRQODY3WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldApAQCAtNjM5LDYgKzY5MCw3IEBACiAjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKQEAgLTY1Nyw3ICs3MDksMTEgQEAKICMKIAogIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CkBAIC02OTAsNiArNzQ2LDcgQEAKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19DTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CkBAIC02OTcsMTIgKzc1NCw3IEBACiAjIENPTkZJR19KTUUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKLSMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKIAogIwogIyBFbmFibGUgV2lNQVggKE5ldHdvcmtpbmcgb3B0aW9ucykgdG8gc2VlIHRoZSBXaU1BWCBkcml2ZXJzCkBAIC03MzksMjUgKzc5MSw0MiBAQAogIyBVc2VybGFuZCBpbnRlcmZhY2VzCiAjCiBDT05GSUdfSU5QVVRfTU9VU0VERVY9eQotIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKIENPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CiBDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CiAjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKK0NPTkZJR19JTlBVVF9FVkJVRz1tCiAKICMKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKIENPTkZJR19JTlBVVF9LRVlCT0FSRD15Ci0jIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU0hfS0VZU0MgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorQ09ORklHX01PVVNFX1BTMl9BTFBTPXkKK0NPTkZJR19NT1VTRV9QUzJfTE9HSVBTMlBQPXkKK0NPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKK0NPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CisjIENPTkZJR19NT1VTRV9QUzJfRUxBTlRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUFMyX1NFTlRFTElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9CQ001OTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfU1lOQVBUSUNTX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldApAQCAtNzY2LDcgKzgzNSwxMiBAQAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKICMKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fSTgwNDI9eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKIAogIwpAQCAtNzc3LDcgKzg1MSw3IEBACiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CiBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKLUNPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0CiAKQEAgLTc5NiwxMiArODcwLDEwIEBACiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CiAjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKIENPTkZJR19VTklYOThfUFRZUz15Ci0jIENPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKLUNPTkZJR19MRUdBQ1lfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKK0NPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0hXX1JBTkRPTV9USU1FUklPTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKQEAgLTgwOSw2ICs4ODEsNyBAQAogQ09ORklHX0RFVlBPUlQ9eQogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NPTVBBVD15CiAjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIENPTkZJR19JMkNfQUxHT1BDQT15CkBAIC04MzgsNiArOTExLDcgQEAKICMKICMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCiAjCisjIENPTkZJR19JMkNfREVTSUdOV0FSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSF9NT0JJTEUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CkBAIC04NjQsMjEgKzkzOCw0MiBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19BTElNNzEwMV9XRFQgaXMgbm90IHNldAorQ09ORklHX1NIX1dEVD15CisjIENPTkZJR19TSF9XRFRfTU1BUCBpcyBub3Qgc2V0CisKKyMKKyMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCiAjCkBAIC04OTYsMTQgKzk5MSwxNyBAQAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworIyBDT05GSUdfVkdBX0FSQiBpcyBub3Qgc2V0CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldApAQCAtOTE1LDEyICsxMDEzLDExIEBACiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKICMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAotQ09ORklHX0ZCX1NZU19GSUxMUkVDVD1tCi1DT05GSUdfRkJfU1lTX0NPUFlBUkVBPW0KLUNPTkZJR19GQl9TWVNfSU1BR0VCTElUPW0KKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfU1lTX0ZPUFM9bQotQ09ORklHX0ZCX0RFRkVSUkVEX0lPPXkKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKQEAgLTk1NSw3ICsxMDUyLDcgQEAKICMgQ09ORklHX0ZCX0FSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9QTTMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0FSTUlORSBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfU0hfTU9CSUxFX0xDREM9bQorIyBDT05GSUdfRkJfU0hfTU9CSUxFX0xDREMgaXMgbm90IHNldAogQ09ORklHX0ZCX1NNNTAxPXkKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKQEAgLTk4MSwxNCArMTA3OCwxMTIgQEAKIENPTkZJR19MT0dPPXkKICMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKLUNPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQotIyBDT05GSUdfTE9HT19TVVBFUkhfTU9OTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT0dPX1NVUEVSSF9WR0ExNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT0dPX1NVUEVSSF9DTFVUMjI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyNCBpcyBub3Qgc2V0CitDT05GSUdfTE9HT19TVVBFUkhfTU9OTz15CitDT05GSUdfTE9HT19TVVBFUkhfVkdBMTY9eQorQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQ9eQorQ09ORklHX1NPVU5EPXkKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CitDT05GSUdfU09VTkRfT1NTX0NPUkVfUFJFQ0xBSU09eQorQ09ORklHX1NORD15CitDT05GSUdfU05EX1RJTUVSPXkKK0NPTkZJR19TTkRfUENNPXkKK0NPTkZJR19TTkRfSFdERVA9eQorQ09ORklHX1NORF9SQVdNSURJPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSPXkKKyMgQ09ORklHX1NORF9TRVFfRFVNTVkgaXMgbm90IHNldAorQ09ORklHX1NORF9PU1NFTVVMPXkKK0NPTkZJR19TTkRfTUlYRVJfT1NTPXkKK0NPTkZJR19TTkRfUENNX09TUz15CitDT05GSUdfU05EX1BDTV9PU1NfUExVR0lOUz15CitDT05GSUdfU05EX1NFUVVFTkNFUl9PU1M9eQorQ09ORklHX1NORF9IUlRJTUVSPXkKK0NPTkZJR19TTkRfU0VRX0hSVElNRVJfREVGQVVMVD15CitDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTPXkKKyMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NORF9SQVdNSURJX1NFUT15CitDT05GSUdfU05EX09QTDNfTElCX1NFUT15CisjIENPTkZJR19TTkRfT1BMNF9MSUJfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TQkFXRV9TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VNVTEwSzFfU0VRIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfTVBVNDAxX1VBUlQ9eQorQ09ORklHX1NORF9PUEwzX0xJQj15CisjIENPTkZJR19TTkRfRFJJVkVSUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1BDST15CisjIENPTkZJR19TTkRfQUQxODg5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BTFMzMDAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMSTU0NTEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVRJSVhQX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FaVDMzMjggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0JUODdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DQTAxMDYgaXMgbm90IHNldAorQ09ORklHX1NORF9DTUlQQ0k9eQorIyBDT05GSUdfU05EX09YWUdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0MjgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQ2WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NUWEZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9EQVJMQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9HSU5BMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0xBWUxBMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RBUkxBMjQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dJTkEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTEFZTEEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTU9OQSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTUlBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FQ0hPM0cgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPSU8gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHT0RKIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09JT1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHT0RKWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9GTTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERBX0lOVEVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IRFNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IRFNQTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSElGSUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JQ0UxNzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JQ0UxNzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFTDhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTFg2NDY0RVMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01BRVNUUk8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX05NMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QQ1hIUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUklQVElERSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJUVU9TTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1lNRlBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1VQRVJIIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfVVNCPXkKKyMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQl9DQUlBUSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogCiAjCkBAIC0xMDAxLDM0ICsxMTk2LDM5IEBACiAjCiAjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKLUNPTkZJR19ISURfQTRURUNIPXkKLUNPTkZJR19ISURfQVBQTEU9eQotQ09ORklHX0hJRF9CRUxLSU49eQotQ09ORklHX0hJRF9DSEVSUlk9eQotQ09ORklHX0hJRF9DSElDT05ZPXkKLUNPTkZJR19ISURfQ1lQUkVTUz15Ci0jIENPTkZJR19ISURfRFJBR09OUklTRSBpcyBub3Qgc2V0Ci1DT05GSUdfSElEX0VaS0VZPXkKLSMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAotQ09ORklHX0hJRF9HWVJBVElPTj15Ci0jIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSElEX0xPR0lURUNIPXkKK0NPTkZJR19ISURfQTRURUNIPW0KK0NPTkZJR19ISURfQVBQTEU9bQorQ09ORklHX0hJRF9CRUxLSU49bQorQ09ORklHX0hJRF9DSEVSUlk9bQorQ09ORklHX0hJRF9DSElDT05ZPW0KK0NPTkZJR19ISURfQ1lQUkVTUz1tCitDT05GSUdfSElEX0RSQUdPTlJJU0U9bQorIyBDT05GSUdfRFJBR09OUklTRV9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX0VaS0VZPW0KK0NPTkZJR19ISURfS1lFPW0KK0NPTkZJR19ISURfR1lSQVRJT049bQorQ09ORklHX0hJRF9UV0lOSEFOPW0KK0NPTkZJR19ISURfS0VOU0lOR1RPTj1tCitDT05GSUdfSElEX0xPR0lURUNIPW0KICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKLUNPTkZJR19ISURfTUlDUk9TT0ZUPXkKLUNPTkZJR19ISURfTU9OVEVSRVk9eQotIyBDT05GSUdfSElEX05UUklHIGlzIG5vdCBzZXQKLUNPTkZJR19ISURfUEFOVEhFUkxPUkQ9eQorQ09ORklHX0hJRF9NSUNST1NPRlQ9bQorQ09ORklHX0hJRF9NT05URVJFWT1tCitDT05GSUdfSElEX05UUklHPW0KK0NPTkZJR19ISURfUEFOVEhFUkxPUkQ9bQogIyBDT05GSUdfUEFOVEhFUkxPUkRfRkYgaXMgbm90IHNldAotQ09ORklHX0hJRF9QRVRBTFlOWD15Ci1DT05GSUdfSElEX1NBTVNVTkc9eQotQ09ORklHX0hJRF9TT05ZPXkKLUNPTkZJR19ISURfU1VOUExVUz15Ci0jIENPTkZJR19ISURfR1JFRU5BU0lBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9TTUFSVEpPWVBMVVMgaXMgbm90IHNldAotIyBDT05GSUdfSElEX1RPUFNFRUQgaXMgbm90IHNldAorQ09ORklHX0hJRF9QRVRBTFlOWD1tCitDT05GSUdfSElEX1NBTVNVTkc9bQorQ09ORklHX0hJRF9TT05ZPW0KK0NPTkZJR19ISURfU1VOUExVUz1tCitDT05GSUdfSElEX0dSRUVOQVNJQT1tCisjIENPTkZJR19HUkVFTkFTSUFfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9TTUFSVEpPWVBMVVM9bQorIyBDT05GSUdfU01BUlRKT1lQTFVTX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfVE9QU0VFRD1tCiAjIENPTkZJR19ISURfVEhSVVNUTUFTVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9aRVJPUExVUyBpcyBub3Qgc2V0CitDT05GSUdfSElEX1pFUk9QTFVTPW0KKyMgQ09ORklHX1pFUk9QTFVTX0ZGIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQpAQCAtMTA0MCwxMyArMTI0MCwxNCBAQAogIwogIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCiAjCi1DT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0RFVklDRV9DTEFTUz15CiAjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVU1BFTkQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAotQ09ORklHX1VTQl9NT049eQorIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKIApAQCAtMTA2MSwxMCArMTI2Miw4IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAotQ09ORklHX1VTQl9PSENJX0hDRD1tCi0jIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9SOEE2NjU5N19IQ0Q9eQpAQCAtMTEzMyw3ICsxMzMyLDcgQEAKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1RFU1Q9bQorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CkBAIC0xMTQzLDcgKzEzNDIsMjkgQEAKICMKICMgQ09ORklHX05PUF9VU0JfWENFSVYgaXMgbm90IHNldAogIyBDT05GSUdfVVdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0CitDT05GSUdfTU1DPXkKKyMgQ09ORklHX01NQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVU5TQUZFX1JFU1VNRSBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEL1NESU8gQ2FyZCBEcml2ZXJzCisjCitDT05GSUdfTU1DX0JMT0NLPXkKK0NPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKKyMgQ09ORklHX1NESU9fVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEL1NESU8gSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfU0RIQ0k9bQorIyBDT05GSUdfTU1DX1NESENJX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfTU1DX1NESENJX1BMVEZNPW0KKyMgQ09ORklHX01NQ19BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19BVE1FTE1DSSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVElGTV9TRCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfQ0I3MTAgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1ZJQV9TRE1NQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKQEAgLTExNzksNiArMTQwMCw3IEBACiAjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SWDg1ODEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDgwMjUgaXMgbm90IHNldAogCiAjCiAjIFNQSSBSVEMgZHJpdmVycwpAQCAtMTIwMyw5ICsxNDI1LDIwIEBACiAjCiAjIENPTkZJR19SVENfRFJWX1NIIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19ETUFERVZJQ0VTPXkKKworIworIyBETUEgRGV2aWNlcworIwogIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VSU8gaXMgbm90IHNldAorQ09ORklHX1VJTz1tCisjIENPTkZJR19VSU9fQ0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJT19QRFJWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJT19QRFJWX0dFTklSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VSU9fU01YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJT19BRUMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPX1NFUkNPUzMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPX1BDSV9HRU5FUklDIGlzIG5vdCBzZXQKIAogIwogIyBUSSBWTFlOUQpAQCAtMTIyNSwxMyArMTQ1OCwxNSBAQAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTEyNzUsOSArMTUxMCw5IEBACiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19IVUdFVExCRlM9eQorQ09ORklHX0hVR0VUTEJfUEFHRT15CitDT05GSUdfQ09ORklHRlNfRlM9eQogQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQogIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKQEAgLTEyOTcsMjAgKzE1MzIsMjAgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19WNF8xIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkZTRD15CitDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15CiAjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRF9WND15CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD15CiBDT05GSUdfTE9DS0RfVjQ9eQotQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19FWFBPUlRGUz1tCiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKQEAgLTEzNzMsODUgKzE2MDgsNjkgQEAKICMgS2VybmVsIGhhY2tpbmcKICMKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAorQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9XQVJOPTEwMjQKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15Ci0jIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0Ci1DT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAotQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQotIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0Ci1DT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX1NDSEVEX0RFQlVHPXkKLSMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19QUkVFTVBUPXkKLSMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAotIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfU0NIRURTVEFUUz15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1M9eQorQ09ORklHX1NUQUNLVFJBQ0U9eQogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAotIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAotIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfTEFURU5DWVRPUD15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQotIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAorQ09ORklHX05PUF9UUkFDRVI9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKK0NPTkZJR19UUkFDRVJfTUFYX1RSQUNFPXkKK0NPTkZJR19SSU5HX0JVRkZFUj15CitDT05GSUdfRVZFTlRfVFJBQ0lORz15CitDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSPXkKK0NPTkZJR19SSU5HX0JVRkZFUl9BTExPV19TV0FQPXkKK0NPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19HRU5FUklDX1RSQUNFUj15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQotIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSVJRU09GRl9UUkFDRVI9eQogIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAorQ09ORklHX1NDSEVEX1RSQUNFUj15CisjIENPTkZJR19GVFJBQ0VfU1lTQ0FMTFMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQogIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAotIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFDS19UUkFDRVI9eQorQ09ORklHX0tNRU1UUkFDRT15CitDT05GSUdfV09SS1FVRVVFX1RSQUNFUj15CiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19EWU5BTUlDX0ZUUkFDRT15CisjIENPTkZJR19GVU5DVElPTl9QUk9GSUxFUiBpcyBub3Qgc2V0CitDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorIyBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SSU5HX0JVRkZFUl9CRU5DSE1BUksgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTVBfQ09ERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9OT19CU1NfSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfRFdBUkZfVU5XSU5ERVI9eQorQ09ORklHX01DT1VOVD15CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtMTQ2NSw3ICsxNjg0LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC0xNTA3LDExICsxNzI1LDEzIEBACiAjCiBDT05GSUdfQ1JZUFRPX0hNQUM9eQogIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAogCiAjCiAjIERpZ2VzdAogIwogIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTU1Niw3ICsxNzc2LDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xNTczLDUgKzE3OTMsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3Nzg1bGNyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaDc3ODVsY3JfZGVmY29uZmlnCmluZGV4IDAwNGU2ZjUuLjhjMmM0N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zaDc3ODVsY3JfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zaDc3ODVsY3JfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTM6MDk6MzQgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTk6MjM6MTggMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI5LDggKzMwLDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKLUNPTkZJR19JT19UUkFQUEVEPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC00MSw2ICs0MywxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01MywxMSArNjEsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTkzLDE5ICsxMDIsMjAgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogIyBDT05GSUdfT1BST0ZJTEUgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMTUsNiArMTI1LDEwIEBACiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKQEAgLTEyNyw3ICsxNDEsNyBAQAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTc2LDYgKzE5MCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIyNCw2ICsyMzksNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMDYsNyArMzIyLDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMzg2LDYgKzQwMyw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDE1LDYgKzQzMyw3IEBACiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTX0VYVD15CiBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTPXkKQEAgLTQyMyw3ICs0NDIsNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC00MzYsNiArNDU0LDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CkBAIC00NDUsOSArNDY0LDkgQEAKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKQEAgLTU4NSw2ICs2MDQsNyBAQAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19BVEFfVkVSQk9TRV9FUlJPUj15CiBDT05GSUdfU0FUQV9QTVA9eQogIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldApAQCAtNjA2LDYgKzYyNiw3IEBACiAjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRQODY3WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldApAQCAtNjMzLDYgKzY1NCw3IEBACiAjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKQEAgLTY1MSw3ICs2NzMsMTEgQEAKICMKIAogIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CkBAIC02ODQsNiArNzEwLDcgQEAKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19DTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CkBAIC02OTEsMTAgKzcxOCw3IEBACiAjIENPTkZJR19KTUUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTc0NCwxMyArNzY4LDE3IEBACiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU0hfS0VZU0MgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKQEAgLTgwMyw2ICs4MzEsNyBAQAogQ09ORklHX0RFVlBPUlQ9eQogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NPTVBBVD15CiAjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIENPTkZJR19JMkNfQUxHT1BDQT15CkBAIC04MzIsNiArODYxLDcgQEAKICMKICMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCiAjCisjIENPTkZJR19JMkNfREVTSUdOV0FSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSF9NT0JJTEUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CkBAIC04NTgsMjAgKzg4OCwyMSBAQAogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTg5MCwxNCArOTIxLDE3IEBACiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCitDT05GSUdfVkdBX0FSQj15CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldApAQCAtOTgyLDcgKzEwMTYsNiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTEwMDUsNiArMTAzOCw3IEBACiBDT05GSUdfSElEX0VaS0VZPXkKICMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9HWVJBVElPTj15CisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0xPR0lURUNIPXkKICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKQEAgLTEwNTUsNiArMTA4OSw3IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9bQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0CkBAIC0xMTczLDYgKzEyMDgsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4MDI1IGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTEyMjQsOCArMTI2MCwxMCBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTEyOTEsMTIgKzEzMjksMTIgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19WNF8xIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTkZTRD15CiBDT05GSUdfTkZTRF9WMz15CkBAIC0xMzcyLDYgKzE0MTAsNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xNDA3LDE4ICsxNDQ2LDIzIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogQ09ORklHX0ZUUkFDRT15CiAjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldApAQCAtMTQyNiw2ICsxNDcwLDcgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC0xNDQwLDExICsxNDg1LDExIEBACiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0JPT1RNRU0gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1QX0NPREUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfTk9fQlNTX0lOSVQgaXMgbm90IHNldAogCiAjCkBAIC0xNDU5LDcgKzE1MDQsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQyPXkKQEAgLTE1MDEsMTEgKzE1NDUsMTMgQEAKICMKIENPTkZJR19DUllQVE9fSE1BQz15CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fTUQ1PXkKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CkBAIC0xNTY3LDUgKzE2MTMsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2htaW5fZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NobWluX2RlZmNvbmZpZwppbmRleCBhZDdkNjA5Li45MjExNWU2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2htaW5fZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zaG1pbl9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMzoxMDozMyAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxOToyNzoxNyAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xMyw2ICsxMyw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjYsNyArMjcsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM2LDYgKzM5LDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CkBAIC00NiwxMSArNTUsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotQ09ORklHX0NMQVNTSUNfUkNVPXkKLSMgQ09ORklHX1RSRUVfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0ZBTk9VVD0zMgorIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldApAQCAtNzcsMTggKzg3LDE5IEBACiBDT05GSUdfRVZFTlRGRD15CiAjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworIyBDT05GSUdfUEVSRl9FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKIENPTkZJR19TTE9CPXkKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKQEAgLTk2LDEyICsxMDcsMTYgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfQkFTRV9TTUFMTD0xCiAjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15Ci0jIENPTkZJR19MQkQgaXMgbm90IHNldAorQ09ORklHX0xCREFGPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTQ4LDYgKzE2Myw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE5Myw2ICsyMDksNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0yNzQsNyArMjkxLDggQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDAyMTAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAotQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORV9PVkVSV1JJVEU9eQorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MxLDExNTIwMCByb290PTFmMDEgbXRkcGFydHM9cGh5c19tYXBwZWRfZmxhc2g6NjRrKGZpcm0pcm8sLShzeXMpIG5ldGRldj0zNCwweDMwMCxldGgwICIKIAogIwpAQCAtMzM5LDYgKzM1Nyw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtMzY4LDYgKzM4Nyw3IEBACiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX0NGRzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQjgwMjExIGlzIG5vdCBzZXQKQEAgLTM3NSw3ICszOTUsNiBAQAogIwogIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQogIwotQ09ORklHX01BQzgwMjExX0RFRkFVTFRfUFNfVkFMVUU9MAogIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CkBAIC01MjksMTAgKzU0OCw3IEBACiAjIENPTkZJR19LUzg4NDIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKIENPTkZJR19ORVRERVZfMTAwMDA9eQotCi0jCi0jIFdpcmVsZXNzIExBTgotIworQ09ORklHX1dMQU49eQogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIApAQCAtNTkxLDExICs2MDcsMTUgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19TU0JfUE9TU0lCTEU9eQogCkBAIC02NzIsNyArNjkyLDkgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApAQCAtNzA5LDggKzczMSw2IEBACiBDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKICMgQ09ORklHX1NZU0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CkBAIC03MzIsNyArNzUyLDYgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtNzY4LDYgKzc4Nyw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldApAQCAtNzc1LDggKzc5NSwxMSBAQAogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTc4NSw2ICs4MDgsNyBAQAogQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19FQVJMWV9QUklOVEs9eQorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTc5Nyw3ICs4MjEsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NQU5BR0VSMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldApAQCAtODI4LDExICs4NTEsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtODk1LDUgKzkyMCw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZwppbmRleCAyMDdiMGM5Li5lMzg1OGQ3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTM6MTE6MDMgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTk6Mjk6MjYgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTMwLDcgKzMxLDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC00MCw2ICs0MywxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01NSwxMiArNjQsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotIyBDT05GSUdfQ0xBU1NJQ19SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotQ09ORklHX1BSRUVNUFRfUkNVPXkKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKIENPTkZJR19SQ1VfVFJBQ0U9eQotIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFPXkKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVV9UUkFDRT15CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTExMSwxOSArMTIwLDIxIEBACiBDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0FJTz15CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CiAKICMKLSMgUGVyZm9ybWFuY2UgQ291bnRlcnMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKICMKK0NPTkZJR19QRVJGX0VWRU5UUz15CitDT05GSUdfRVZFTlRfUFJPRklMRT15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiAjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogQ09ORklHX1NMT0I9eQogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfVFJBQ0VQT0lOVFM9eQotQ09ORklHX01BUktFUlM9eQogQ09ORklHX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19LUFJPQkVTPXkKQEAgLTEzNSw2ICsxNDYsMTEgQEAKIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15CiBDT05GSUdfSEFWRV9DTEs9eQogQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTQ3LDcgKzE2Myw3IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX1NUT1BfTUFDSElORT15CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE5Niw2ICsyMTIsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yNTYsNiArMjczLDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMzUzLDcgKzM3MSw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDEwMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMTAwMDAKLUNPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFPXkKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAgZWFybHlwcmludGs9YmlvcyBpZ25vcmVfbG9nbGV2ZWwiCiAKICMKQEAgLTQzOCw2ICs0NTcsNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQ4OSw2ICs1MDksNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKQEAgLTU2Miw3ICs1ODMsNiBAQAogIyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQk5YMl9JU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldApAQCAtNTcwLDYgKzU5MCw3IEBACiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorQ09ORklHX0FUQV9WRVJCT1NFX0VSUk9SPXkKIENPTkZJR19TQVRBX1BNUD15CiBDT05GSUdfQVRBX1NGRj15CiAjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKQEAgLTYwMiwxMiArNjIzLDEwIEBACiAjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTEgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTY3NSw2ICs2OTQsNyBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPW0KIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKICMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCkBAIC02ODUsNiArNzA1LDcgQEAKICMKICMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCiAjCisjIENPTkZJR19JMkNfREVTSUdOV0FSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSF9NT0JJTEUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CkBAIC03MDYsOSArNzI3LDYgQEAKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CkBAIC03MjksMTEgKzc0NywxNSBAQAogIwogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTc2Miw4ICs3ODQsMTIgQEAKICMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUMxMzc4MyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19FWlhfUENBUCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CiAKQEAgLTgwOCw2ICs4MzQsNyBAQAogIyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfUjhBNjY1OTdfSENEPW0KICMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKQEAgLTg2Miw2ICs4ODksNyBAQAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfR0FER0VUPXkKQEAgLTg3NiwxMCArOTA0LDExIEBACiAjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUjhBNjY1OTcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyN1ggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9TM0NfSFNPVEcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9TM0MyNDEwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0dBREdFVF9NNjY1OTI9eQogQ09ORklHX1VTQl9NNjY1OTI9eQogIyBDT05GSUdfVVNCX0dBREdFVF9BTUQ1NTM2VURDIGlzIG5vdCBzZXQKQEAgLTkzOSw2ICs5NjgsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4MDI1IGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTk1MCw2ICs5ODAsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0YyMTIzIGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwpAQCAtMTAwMiw4ICsxMDMzLDEwIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CkBAIC0xMDYzLDcgKzEwOTYsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKQEAgLTExMjksNiArMTE2MSw3IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiBDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTE2NCwyMiArMTE5NywyOSBAQAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0tQUk9CRVNfU0FOSVRZX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CiBDT05GSUdfUklOR19CVUZGRVI9eQogQ09ORklHX0VWRU5UX1RSQUNJTkc9eQogQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfUklOR19CVUZGRVJfQUxMT1dfU1dBUD15CiBDT05GSUdfVFJBQ0lORz15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIENPTkZJR19GVFJBQ0U9eQpAQCAtMTE4OCw2ICsxMjI4LDcgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfREVGQVVMVF9UUkFDRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CiAjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CkBAIC0xMjA1LDEwICsxMjQ2LDEwIEBACiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0VBUkxZX1BSSU5USz15Ci0jIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKKyMgQ09ORklHX1NUQUNLX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CiBDT05GSUdfRFVNUF9DT0RFPXkKKyMgQ09ORklHX0RXQVJGX1VOV0lOREVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX05PX0JTU19JTklUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTIyMyw3ICsxMjY0LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKQEAgLTEyNTUsMTEgKzEyOTUsMTMgQEAKICMKICMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dIQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTMyMiw1ICsxMzY0LDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NuYXBnZWFyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zbmFwZ2Vhcl9kZWZjb25maWcKaW5kZXggMmJlMmQ3NS4uY2I5MTlhMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NuYXBnZWFyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc25hcGdlYXJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxLXJjNgotIyBUaHUgQXVnIDIwIDE1OjAzOjA0IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE5OjMzOjAwIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTU3LDExICs1NywxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CkBAIC05NSwyMSArOTYsMjAgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKLUNPTkZJR19IQVZFX1BFUkZfQ09VTlRFUlM9eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfUENJX1FVSVJLUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQpAQCAtMTc1LDYgKzE3NSw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTIyMCw2ICsyMjEsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMTIsNyArMzE0LDggQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAogIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9PVkVSV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCkBAIC0zNzQsNiArMzc3LDcgQEAKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC00MDMsNiArNDA3LDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldApAQCAtNDEwLDcgKzQxNSw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTYxOCwxMCArNjIyLDcgQEAKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCkBAIC03MTQsNyArNzE1LDYgQEAKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTczNiw2ICs3MzYsNyBAQAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCitDT05GSUdfVkdBX0FSQj15CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldApAQCAtODE4LDYgKzgxOSw3IEBACiAjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKQEAgLTg4Miw3ICs4ODQsNiBAQAogQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CkBAIC05MDksNiArOTEwLDcgQEAKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTkyMiw3ICs5MjQsNyBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQotQ09ORklHX0hBVkVfRlRSQUNFX1NZU0NBTExTPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc3lzdGVtaF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc3lzdGVtaF9kZWZjb25maWcKaW5kZXggNWQ5NzAyNi4uYjlmZTk2MCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3N5c3RlbWhfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zeXN0ZW1oX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMAotIyBUaHUgSnVuIDE4IDEzOjEyOjI4IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE5OjM1OjAzIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTE0LDYgKzE0LDcgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CiAjIENPTkZJR19HRU5FUklDX0dQSU8gaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CkBAIC0yNyw3ICsyOCw5IEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzgsNiArNDEsMTIgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiAjIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldApAQCAtNDUsMTEgKzU0LDEyIEBACiAjCiAjIFJDVSBTdWJzeXN0ZW0KICMKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0jIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKQEAgLTgzLDE4ICs5MywxOSBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtMTAzLDYgKzExNCwxMCBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIwogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xMTUsNyArMTMwLDcgQEAKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE2Miw2ICsxNzcsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMDcsNiArMjIzLDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMjk0LDcgKzMxMSw4IEBACiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKICMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfT1ZFUldSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfRVhURU5EIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtNDAyLDEwICs0MjAsMjAgQEAKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgZHJpdmVycworIwogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKQEAgLTQxNiw5ICs0NDQsNyBAQAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtNDk1LDcgKzUyMSw5IEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRklMRV9MT0NLSU5HPXkKIENPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CkBAIC01NTksNyArNTg3LDYgQEAKIENPTkZJR19ST01GU19PTl9CTE9DSz15CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtNTc3LDYgKzYwNCw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC01ODYsOCArNjE0LDExIEBACiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldApAQCAtNTk1LDYgKzYyNiw3IEBACiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTYyMyw0ICs2NTUsNSBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKaW5kZXggN2FkMDgwZS4uMmNhNzllZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwCi0jIFRodSBKdW4gMTggMTM6MTI6NTQgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMxCisjIFRodSBTZXAgMjQgMTk6MzY6MzYgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMTQsNiArMTQsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKICMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKQEAgLTI4LDcgKzI5LDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOCw2ICs0MSwxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTUwLDExICs1OSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNgpAQCAtOTAsMTkgKzEwMCwyMCBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCisjIENPTkZJR19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfUENJX1FVSVJLUz15Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtMTExLDYgKzEyMiwxMCBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKIENPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorCisjCisjIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZworIwogIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CkBAIC0xMjMsNyArMTM4LDcgQEAKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkRBRj15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE3MCw2ICsxODUsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1NyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0yMTUsNiArMjMxLDcgQEAKIENPTkZJR19OUl9RVUlDSz0yCiBDT05GSUdfSEFWRV9NTE9DSz15CiBDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKIAogIwpAQCAtMzA3LDcgKzMyNCw4IEBACiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwOWUwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKICMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAotQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORV9PVkVSV1JJVEU9eQorIyBDT05GSUdfQ01ETElORV9FWFRFTkQgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MxLDM4NDAwTjgxIHJvb3Q9L2Rldi9uZnMgaXA9Ojo6OjpldGgxOmF1dG9jb25mIHJ3IgogCiAjCkBAIC01MDksNiArNTI3LDcgQEAKICMgQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKIENPTkZJR19TVFA9eQpAQCAtNTk1LDYgKzYxNCw3IEBACiBDT05GSUdfRklCX1JVTEVTPXkKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlM9eQpAQCAtNjAzLDcgKzYyMyw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTYxNiw2ICs2MzUsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj1tCkBAIC02MjgsOSArNjQ4LDkgQEAKIENPTkZJR19NVEQ9bQogQ09ORklHX01URF9ERUJVRz15CiBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0U9MAorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BBUlRJVElPTlMgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtODIwLDYgKzg0MCw3IEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QTUNSQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKQEAgLTgzMiw3ICs4NTMsMTEgQEAKICMKIAogIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CkBAIC05MzEsNiArOTU2LDcgQEAKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19DTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CkBAIC05NTYsMTAgKzk4Miw3IEBACiAjIENPTkZJR19TRkMgaXMgbm90IHNldAogIyBDT05GSUdfQkUyTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTEwODcsMTAgKzExMTAsMjAgQEAKIENPTkZJR19ERVZQT1JUPXkKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKICMgQ09ORklHX1NFTlNPUlNfSTVLX0FNQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CkBAIC0xMTA1LDkgKzExMzgsNyBAQAogIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC0xMTQ5LDYgKzExODAsNyBAQAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCitDT05GSUdfVkdBX0FSQj15CiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldApAQCAtMTE2Nyw3ICsxMTk5LDYgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAogCiAjCkBAIC0xMjE3LDYgKzEyNDgsNyBAQAogIyBDT05GSUdfVVNCX09YVTIxMEhQX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPXkKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldApAQCAtMTQxNiw4ICsxNDQ4LDEwIEBACiAjIENPTkZJR19YRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQpAQCAtMTQ4OSw3ICsxNTIzLDYgQEAKIENPTkZJR19ST01GU19PTl9CTE9DSz15CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTE1OTEsNiArMTYyNCw3IEBACiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTYyMSwyMyArMTY1NSwyOSBAQAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogQ09ORklHX0ZUUkFDRT15CiAjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRlRSQUNFX1NZU0NBTExTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKIENPTkZJR19CUkFOQ0hfUFJPRklMRV9OT05FPXkKICMgQ09ORklHX1BST0ZJTEVfQU5OT1RBVEVEX0JSQU5DSEVTIGlzIG5vdCBzZXQKQEAgLTE2NTAsMTQgKzE2OTAsMTMgQEAKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAotIyBDT05GSUdfS01FTUNIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0JPT1RNRU0gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1QX0NPREUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfTk9fQlNTX0lOSVQgaXMgbm90IHNldAogCiAjCkBAIC0xNjcyLDcgKzE3MTEsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQ9eQpAQCAtMTcxNSwxMSArMTc1MywxMyBAQAogIwogQ09ORklHX0NSWVBUT19ITUFDPXkKICMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19WTUFDIGlzIG5vdCBzZXQKIAogIwogIyBEaWdlc3QKICMKIENPTkZJR19DUllQVE9fQ1JDMzJDPW0KKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01END1tCiBDT05GSUdfQ1JZUFRPX01ENT15CiBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPXkKQEAgLTE3OTAsNSArMTgzMCw2IEBACiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CiBDT05GSUdfTkxBVFRSPXkKIENPTkZJR19HRU5FUklDX0FUT01JQzY0PXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy91bDJfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3VsMl9kZWZjb25maWcKaW5kZXggNjA4ZmU1Ni4uYjAxMmNhNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3VsMl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3VsMl9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAKLSMgVGh1IEp1biAxOCAxMzoxNDozNiAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzEKKyMgVGh1IFNlcCAyNCAxOTo0MjozMyAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CkBAIC0xNCw2ICsxNCw3IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfSVJRX1BFUl9DUFU9eQogIyBDT05GSUdfR0VORVJJQ19HUElPIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQpAQCAtMjksNyArMzAsOSBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQ9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTQwLDYgKzQzLDEyIEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKQEAgLTUyLDExICs2MSwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNApAQCAtOTEsMTkgKzEwMSwyMCBAQAogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19BSU89eQorQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQogCiAjCi0jIFBlcmZvcm1hbmNlIENvdW50ZXJzCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiAjCitDT05GSUdfUEVSRl9FVkVOVFM9eQorIyBDT05GSUdfUEVSRl9DT1VOVEVSUyBpcyBub3Qgc2V0CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMVUJfREVCVUc9eQotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xVQj15CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKQEAgLTExMyw2ICsxMjQsMTAgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTI1LDcgKzE0MCw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNDEsNyArMTU2LDcgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX05PT1A9eQogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKLSMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAorQ09ORklHX0ZSRUVaRVI9eQogCiAjCiAjIFN5c3RlbSB0eXBlCkBAIC0xNzYsNiArMTkxLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjMzLDYgKzI0OSw3IEBACiBDT05GSUdfTlJfUVVJQ0s9MgogQ09ORklHX0hBVkVfTUxPQ0s9eQogQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAKICMKQEAgLTMxNCw3ICszMzEsOCBAQAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAogQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCi1DT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FX09WRVJXUklURT15CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgaXA9ZGhjcCIKIAogIwpAQCAtMzM0LDcgKzM1MiwxMyBAQAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKICMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19QTT15CisjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUE1fU0xFRVA9eQorQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CisjIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0CitDT05GSUdfUE1fUlVOVElNRT15CiAjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUPXkKIApAQCAtMzgyLDYgKzQwNiw3IEBACiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDExLDE5ICs0MzYsMTcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiBDT05GSUdfQ0ZHODAyMTE9eQorIyBDT05GSUdfTkw4MDIxMV9URVNUTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19DRkc4MDIxMV9ERVZFTE9QRVJfV0FSTklOR1MgaXMgbm90IHNldAogIyBDT05GSUdfQ0ZHODAyMTFfUkVHX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTPXkKK0NPTkZJR19DRkc4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTEKICMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQogQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CiBDT05GSUdfTElCODAyMTE9bQogIyBDT05GSUdfTElCODAyMTFfREVCVUcgaXMgbm90IHNldAogQ09ORklHX01BQzgwMjExPXkKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTPXkKLUNPTkZJR19NQUM4MDIxMV9ERUZBVUxUX1BTX1ZBTFVFPTEKLQotIwotIyBSYXRlIGNvbnRyb2wgYWxnb3JpdGhtIHNlbGVjdGlvbgotIwogQ09ORklHX01BQzgwMjExX1JDX1BJRD15CiAjIENPTkZJR19NQUM4MDIxMV9SQ19NSU5TVFJFTCBpcyBub3Qgc2V0CiBDT05GSUdfTUFDODAyMTFfUkNfREVGQVVMVF9QSUQ9eQpAQCAtNDQ0LDYgKzQ2Nyw3IEBACiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPXkKQEAgLTQ1Myw5ICs0NzcsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldApAQCAtNTkwLDcgKzYxNCw2IEBACiAjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9CTlgyX0lTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CkBAIC01OTgsNiArNjIxLDcgQEAKICMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQogQ09ORklHX1NBVEFfUE1QPXkKIENPTkZJR19BVEFfU0ZGPXkKICMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldApAQCAtNjMxLDEwICs2NTUsNyBAQAogIyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCitDT05GSUdfV0xBTj15CiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XTEFOXzgwMjExPXkKIENPTkZJR19MSUJFUlRBUz1tCkBAIC02NDgsMTIgKzY2OSwxMyBAQAogIyBDT05GSUdfUlRMODE4NyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMV9IV1NJTSBpcyBub3Qgc2V0CiAjIENPTkZJR19QNTRfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSOTE3MF9VU0IgaXMgbm90IHNldAorIyBDT05GSUdfQVRIX0NPTU1PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IT1NUQVAgaXMgbm90IHNldAogIyBDT05GSUdfQjQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0M0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19aRDEyMTFSVyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVDJYMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0wxMlhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lXTSBpcyBub3Qgc2V0CiAKICMKQEAgLTc1MCwxMCArNzcyLDIwIEBACiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CkBAIC03NjQsOSArNzk2LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKQEAgLTgxMyw2ICs4NDMsNyBAQAogIyBDT05GSUdfVVNCX0RFVklDRUZTIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfREVWSUNFX0NMQVNTPXkKICMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VTUEVORCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CkBAIC04MjcsOSArODU4LDkgQEAKICMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRD15Ci0jIENPTkZJR19TVVBFUkhfT05fQ0hJUF9SOEE2NjU5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CiAKICMKQEAgLTg5Myw2ICs5MjQsNyBAQAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldApAQCAtOTE3LDYgKzk0OSw4IEBACiAjIE1NQy9TRC9TRElPIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCiAjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX0FUTUVMTUNJIGlzIG5vdCBzZXQKICMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldApAQCAtOTQ5LDggKzk4MywxMCBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ZJTEVfTE9DS0lORz15CiBDT05GSUdfRlNOT1RJRlk9eQogQ09ORklHX0ROT1RJRlk9eQpAQCAtMTAxNCw3ICsxMDUwLDYgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKICMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CkBAIC0xMDkxLDYgKzExMjYsNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMTAzLDggKzExMzksMTEgQEAKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTPXkKIENPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldApAQCAtMTExMiw2ICsxMTUxLDcgQEAKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19EV0FSRl9VTldJTkRFUiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtMTEyNSw3ICsxMTY1LDYgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCi0jIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEMj15CkBAIC0xMTY3LDExICsxMjA2LDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz15CkBAIC0xMjM1LDUgKzEyNzYsNiBAQAogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQogQ09ORklHX05MQVRUUj15CiBDT05GSUdfR0VORVJJQ19BVE9NSUM2ND15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvdXJxdWVsbF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvdXJxdWVsbF9kZWZjb25maWcKaW5kZXggZWUxOTg3ZS4uOWY4YWVlNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3VycXVlbGxfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy91cnF1ZWxsX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMAotIyBUaHUgSnVuIDE4IDEzOjE1OjI4IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMQorIyBUaHUgU2VwIDI0IDE5OjQ2OjEzIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKQEAgLTE0LDExICsxNCwxMyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKIENPTkZJR19HRU5FUklDX0dQSU89eQogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiAjIENPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEUgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEU9eQorQ09ORklHX1NZU19TVVBQT1JUU19TTVA9eQogQ09ORklHX1NZU19TVVBQT1JUU19OVU1BPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfUENJPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfVE1VPXkKQEAgLTI5LDcgKzMxLDkgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUz15CiBDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfQ09OU1RSVUNUT1JTPXkKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC0zOSw2ICs0MywxMiBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CkBAIC01NCwxNCArNjQsMTIgQEAKICMKICMgUkNVIFN1YnN5c3RlbQogIwotIyBDT05GSUdfQ0xBU1NJQ19SQ1UgaXMgbm90IHNldAogQ09ORklHX1RSRUVfUkNVPXkKLSMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19SQ1VfRkFOT1VUPTMyCiAjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNApAQCAtMTExLDIwICsxMTksMjAgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKIAogIwotIyBQZXJmb3JtYW5jZSBDb3VudGVycworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwogIworQ09ORklHX1BFUkZfRVZFTlRTPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKLSMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKLUNPTkZJR19UUkFDRVBPSU5UUz15Ci1DT05GSUdfTUFSS0VSUz15CiAjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKQEAgLTEzNCw2ICsxNDIsMTEgQEAKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CiBDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTQ2LDcgKzE1OSw3IEBACiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xOTUsNiArMjA4LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMjQ0LDcgKzI1OCw2IEBACiBDT05GSUdfSEFWRV9NRU1PUllfUFJFU0VOVD15CiBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiAjIENPTkZJR19NRU1PUllfSE9UUExVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiBDT05GSUdfTUlHUkFUSU9OPXkKICMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKQEAgLTI1Miw2ICsyNjUsNyBAQAogQ09ORklHX05SX1FVSUNLPTIKIENPTkZJR19IQVZFX01MT0NLPXkKIENPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgogCiAjCkBAIC0zMjIsNiArMzM2LDcgQEAKIENPTkZJR19LRVhFQz15CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKIENPTkZJR19TRUNDT01QPXkKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9OT05FPXkKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldApAQCAtMzM0LDcgKzM0OSw4IEBACiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiBDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKLSMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX09WRVJXUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0VYVEVORCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTM0Myw2ICszNTksOCBAQAogIyBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19QQ0lFUE9SVEJVUz15CiBDT05GSUdfUENJRUFFUj15CisjIENPTkZJR19QQ0lFX0VDUkMgaXMgbm90IHNldAorIyBDT05GSUdfUENJRUFFUl9JTkpFQ1QgaXMgbm90IHNldAogQ09ORklHX1BDSUVBU1BNPXkKIENPTkZJR19QQ0lFQVNQTV9ERUJVRz15CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CkBAIC0zNjcsNiArMzg1LDcgQEAKIENPTkZJR19QTT15CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9SVU5USU1FIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfSURMRT15CiBDT05GSUdfQ1BVX0lETEVfR09WX0xBRERFUj15CiBDT05GSUdfTkVUPXkKQEAgLTQyMCw2ICs0MzksNyBAQAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRFMgaXMgbm90IHNldAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQ0Miw3ICs0NjIsNiBAQAogIyBOZXR3b3JrIHRlc3RpbmcKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RST1BfTU9OSVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19DQU4gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CkBAIC00NTAsNiArNDY5LDcgQEAKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlM9eQpAQCAtNDU4LDcgKzQ3OCw2IEBACiAjCiAjIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCiAjCi1DT05GSUdfTUFDODAyMTFfREVGQVVMVF9QU19WQUxVRT0wCiAjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKQEAgLTQ3MSw2ICs0OTAsNyBAQAogIyBHZW5lcmljIERyaXZlciBPcHRpb25zCiAjCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKQEAgLTQ4MCw5ICs1MDAsOSBAQAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQotIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldApAQCAtNjIwLDYgKzY0MCw3IEBACiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorQ09ORklHX0FUQV9WRVJCT1NFX0VSUk9SPXkKIENPTkZJR19TQVRBX1BNUD15CiAjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAogQ09ORklHX1NBVEFfU0lMMjQ9eQpAQCAtNjQxLDYgKzY2Miw3IEBACiAjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRQODY3WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldApAQCAtNjY4LDYgKzY5MCw3IEBACiAjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKQEAgLTY4Niw3ICs3MDksMTEgQEAKICMKIAogIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMgWW91IGNhbiBlbmFibGUgb25lIG9yIGJvdGggRmlyZVdpcmUgZHJpdmVyIHN0YWNrcy4KKyMKKworIworIyBTZWUgdGhlIGhlbHAgdGV4dHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CkBAIC03ODIsNiArODA5LDcgQEAKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19DTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CkBAIC03ODksMTAgKzgxNyw3IEBACiAjIENPTkZJR19KTUUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKK0NPTkZJR19XTEFOPXkKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKQEAgLTg0MiwxNCArODY3LDE5IEBACiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfUVQyMTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BVFJJWCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NIX0tFWVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CkBAIC05MDIsNiArOTMyLDcgQEAKIENPTkZJR19ERVZQT1JUPXkKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DT01QQVQ9eQogIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAogQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiBDT05GSUdfSTJDX0FMR09QQ0E9eQpAQCAtOTMxLDYgKzk2Miw3IEBACiAjCiAjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQogIworIyBDT05GSUdfSTJDX0RFU0lHTldBUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0hfTU9CSUxFIGlzIG5vdCBzZXQKQEAgLTk1OCwxNSArOTkwLDE3IEBACiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEkgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKIENPTkZJR19HUElPTElCPXkKICMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldApAQCAtOTg3LDE0ICsxMDIxLDI0IEBACiAjIFBDSSBHUElPIGV4cGFuZGVyczoKICMKICMgQ09ORklHX0dQSU9fQlQ4WFggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19MQU5HV0VMTCBpcyBub3Qgc2V0CiAKICMKICMgU1BJIEdQSU8gZXhwYW5kZXJzOgogIworCisjCisjIEFDOTcgR1BJTyBleHBhbmRlcnM6CisjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgZHJpdmVycworIwogIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKQEAgLTEwNDUsNiArMTA4OSw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UTVA0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UTVA0MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKQEAgLTEwNTYsOSArMTEwMSw3IEBACiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci1DT05GSUdfVEhFUk1BTF9IV01PTj15CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtMTA3OSw4ICsxMTIyLDEwIEBACiAjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfTUVESUFfU1VQUE9SVD15CiAKQEAgLTEwOTksNiArMTE0NCw3IEBACiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKK0NPTkZJR19WR0FfQVJCPXkKICMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CkBAIC0xMTgzLDcgKzEyMjksNiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CiAKICMKQEAgLTEyMDYsNiArMTI1MSw3IEBACiBDT05GSUdfSElEX0VaS0VZPXkKICMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9HWVJBVElPTj15CisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0xPR0lURUNIPXkKICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKQEAgLTEyNTUsNiArMTMwMSw3IEBACiAjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0CkBAIC0xMzczLDYgKzE0MjAsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4MDI1IGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTE0MjIsNiArMTQ3MCw3IEBACiBDT05GSUdfRVhUNF9GU19YQVRUUj15CiAjIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0pCRDI9eQpAQCAtMTQzMSw5ICsxNDgwLDExIEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19CVFJGU19GUz15CiAjIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX0ZTTk9USUZZPXkKIENPTkZJR19ETk9USUZZPXkKQEAgLTE0OTksMTIgKzE1NTAsMTIgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19WNF8xIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD15CkBAIC0xNTc2LDYgKzE2MjcsNyBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldApAQCAtMTYxMCwxOCArMTY2MiwyMyBAQAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiAjIENPTkZJR19QQUdFX1BPSVNPTklORyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQogQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CkBAIC0xNjMzLDExICsxNjkwLDExIEBACiBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFPXkKIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEVfUE9SVD0weGZmZWIwMDAwCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKLSMgQ09ORklHX0RFQlVHX0JPT1RNRU0gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1QX0NPREUgaXMgbm90IHNldAorIyBDT05GSUdfRFdBUkZfVU5XSU5ERVIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfTk9fQlNTX0lOSVQgaXMgbm90IHNldAogCiAjCkBAIC0xNjUyLDcgKzE3MDksNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQyPXkKQEAgLTE2OTQsMTEgKzE3NTAsMTMgQEAKICMKIENPTkZJR19DUllQVE9fSE1BQz15CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiBDT05GSUdfQ1JZUFRPX0NSQzMyQz15CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApAQCAtMTc2NCw1ICsxODIyLDYgQEAKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKIENPTkZJR19OTEFUVFI9eQogQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IGI5MWZhOGQuLjRkNThlYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTEsMTIgKzEsOSBAQAogbWVudSAiRE1BIHN1cHBvcnQiCiAKLWNvbmZpZyBTSF9ETUFfQVBJCi0JYm9vbAogCiBjb25maWcgU0hfRE1BCiAJYm9vbCAiU3VwZXJIIG9uLWNoaXAgRE1BIGNvbnRyb2xsZXIgKERNQUMpIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDUFVfU0gzIHx8IENQVV9TSDQKLQlzZWxlY3QgU0hfRE1BX0FQSQogCWRlZmF1bHQgbgogCiBjb25maWcgU0hfRE1BX0lSUV9NVUxUSQpAQCAtMTksNiArMTYsMTUgQEAKIAkJICAgICBDUFVfU1VCVFlQRV9TSDc3ODAgIHx8IENQVV9TVUJUWVBFX1NINzc4NSAgfHwgXAogCQkgICAgIENQVV9TVUJUWVBFX1NINzc2MAogCitjb25maWcgU0hfRE1BX0FQSQorCWRlcGVuZHMgb24gU0hfRE1BCisJYm9vbCAiU3VwZXJIIERNQSBBUEkgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTSF9ETUFfQVBJIGFsd2F5cyBlbmFibGVkIERNQSBBUEkgb2YgdXNlZCBTdXBlckguCisJICBJZiB5b3Ugd2FudCB0byB1c2UgRE1BIEVOR0lORSwgeW91IG11c3Qgbm90IGVuYWJsZSB0aGlzLgorCSAgUGxlYXNlIGVuYWJsZSBETUFfRU5HSU5FIGFuZCBTSF9ETUFFLgorCiBjb25maWcgTlJfT05DSElQX0RNQV9DSEFOTkVMUwogCWludAogCWRlcGVuZHMgb24gU0hfRE1BCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL01ha2VmaWxlIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9NYWtlZmlsZQppbmRleCBjNjA2ODEzLi5kODhjOTQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvTWFrZWZpbGUKQEAgLTIsOCArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgU3VwZXJIIERNQSBzcGVjaWZpYyBrZXJuZWwgaW50ZXJmYWNlIHJvdXRpbmVzIHVuZGVyIExpbnV4LgogIwogCi1vYmotJChDT05GSUdfU0hfRE1BX0FQSSkJKz0gZG1hLWFwaS5vIGRtYS1zeXNmcy5vCi1vYmotJChDT05GSUdfU0hfRE1BKQkJKz0gZG1hLXNoLm8KK29iai0kKENPTkZJR19TSF9ETUFfQVBJKQkrPSBkbWEtc2gubyBkbWEtYXBpLm8gZG1hLXN5c2ZzLm8KIG9iai0kKENPTkZJR19QVlIyX0RNQSkJCSs9IGRtYS1wdnIyLm8KIG9iai0kKENPTkZJR19HMl9ETUEpCQkrPSBkbWEtZzIubwogb2JqLSQoQ09ORklHX1NIX0RNQUJSRykJCSs9IGRtYWJyZy5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2RtYS1zaC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9kbWEtc2guaAppbmRleCA2OGE1ZjRjLi43OGVlZDNlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2RtYS1zaC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZG1hLXNoLmgKQEAgLTExNiw0ICsxMTYsMTcgQEAKICNkZWZpbmUgQ0hDUiAgICAweDBDCiAjZGVmaW5lIERNQU9SCTB4NDAKIAorLyoKKyAqIGZvciBkbWEgZW5naW5lCisgKgorICogU3VwZXJIIERNQSBtb2RlCisgKi8KKyNkZWZpbmUgU0hETUFfTUlYX0lSUQkoMSA8PCAxKQorI2RlZmluZSBTSERNQV9ETUFPUjEJKDEgPDwgMikKKyNkZWZpbmUgU0hETUFfRE1BRTEJCSgxIDw8IDMpCisKK3N0cnVjdCBzaF9kbWFlX3BkYXRhIHsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKK307CisKICNlbmRpZiAvKiBfX0RNQV9TSF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCBjYTY0ZjQzLi41M2VmMjZjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc21wLmgKQEAgLTQ0LDcgKzQ0LDYgQEAKIAogdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwotI2RlZmluZSBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzawogCiAjZWxzZQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggZjhjNDBjYy4uNjVlN2JkMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtMzEsNyArMzEsNiBAQAogI2RlZmluZSBjcHVfdG9fbm9kZShjcHUpCSgodm9pZCkoY3B1KSwwKQogI2RlZmluZSBwYXJlbnRfbm9kZShub2RlKQkoKHZvaWQpKG5vZGUpLDApCiAKLSNkZWZpbmUgbm9kZV90b19jcHVtYXNrKG5vZGUpCSgodm9pZClub2RlLCBjcHVfb25saW5lX21hcCkKICNkZWZpbmUgY3B1bWFza19vZl9ub2RlKG5vZGUpCSgodm9pZClub2RlLCBjcHVfb25saW5lX21hc2spCiAKICNkZWZpbmUgcGNpYnVzX3RvX25vZGUoYnVzKQkoKHZvaWQpKGJ1cyksIC0xKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCmluZGV4IDAxNTE5MzMuLmJiNDA3ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKQEAgLTE1Miw4ICsxNTIsNiBAQAogCW1vdi5sCTFmLCByMAogCW1vdi5sCUByMCwgcjYKIAotCXN0aQotCiAJbW92LmwJM2YsIHIwCiAJbW92LmwJNGYsIHIxCiAJbW92CXIxNSwgcjQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKaW5kZXggMzUwOTc3NS4uNTQ5MWIwOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KKyNpbmNsdWRlIDxhc20vZG1hLXNoLmg+CiAjaW5jbHVkZSA8Y3B1L3NoNzcyMi5oPgogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKQEAgLTM3Myw2ICszNzQsMTggQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF9kbWFlX3BkYXRhIGRtYV9wbGF0Zm9ybV9kYXRhID0geworCS5tb2RlID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRtYV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLWRtYS1lbmdpbmUiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZG1hX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MjJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmNtdF9kZXZpY2UsCiAJJnRtdTBfZGV2aWNlLApAQCAtMzg1LDYgKzM5OCw3IEBACiAJJnZwdV9kZXZpY2UsCiAJJnZldV9kZXZpY2UsCiAJJmpwdV9kZXZpY2UsCisJJmRtYV9kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3MjJfZGV2aWNlc19zZXR1cCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYwppbmRleCAyYzkwMWY0Li4xMmZmNTZmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2RtYS1zaC5oPgogCiBzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm5hbWUgPSAiVE1VMCIsCkBAIC0yNDAsNiArMjQxLDE4IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfZG1hZV9wZGF0YSBkbWFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubW9kZSA9IChTSERNQV9NSVhfSVJRIHwgU0hETUFfRE1BT1IxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRtYV9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gInNoLWRtYS1lbmdpbmUiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5kZXYgICAgICAgICAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJmRtYV9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzgwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZ0bXUwX2RldmljZSwKIAkmdG11MV9kZXZpY2UsCkBAIC0yNDksNiArMjYyLDcgQEAKIAkmdG11NV9kZXZpY2UsCiAJJnJ0Y19kZXZpY2UsCiAJJnNjaV9kZXZpY2UsCisJJmRtYV9kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3ODBfZGV2aWNlc19zZXR1cCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvZHdhcmYuYyBiL2FyY2gvc2gva2VybmVsL2R3YXJmLmMKaW5kZXggYmM0ZDhkNy4uMmQwNzA4NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvZHdhcmYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9kd2FyZi5jCkBAIC0yMCwxMSArMjAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2R3YXJmLmg+CiAjaW5jbHVkZSA8YXNtL3Vud2luZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotI2luY2x1ZGUgPGFzbS9kd2FyZi5oPgogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAKIC8qIFJlc2VydmUgZW5vdWdoIG1lbW9yeSBmb3IgdHdvIHN0YWNrIGZyYW1lcyAqLwpAQCAtNTU4LDYgKzU1OCwyNyBAQAogCWlmICghcGMgJiYgIXByZXYpCiAJCXBjID0gKHVuc2lnbmVkIGxvbmcpY3VycmVudF90ZXh0X2FkZHIoKTsKIAorI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKKwkvKgorCSAqIElmIG91ciBzdGFjayBoYXMgYmVlbiBwYXRjaGVkIGJ5IHRoZSBmdW5jdGlvbiBncmFwaCB0cmFjZXIKKwkgKiB0aGVuIHdlIG1pZ2h0IHNlZSB0aGUgYWRkcmVzcyBvZiByZXR1cm5fdG9faGFuZGxlcigpIHdoZXJlIHdlCisJICogZXhwZWN0ZWQgdG8gZmluZCB0aGUgcmVhbCByZXR1cm4gYWRkcmVzcy4KKwkgKi8KKwlpZiAocGMgPT0gKHVuc2lnbmVkIGxvbmcpJnJldHVybl90b19oYW5kbGVyKSB7CisJCWludCBpbmRleCA9IGN1cnJlbnQtPmN1cnJfcmV0X3N0YWNrOworCisJCS8qCisJCSAqIFdlIGN1cnJlbnRseSBoYXZlIG5vIHdheSBvZiB0cmFja2luZyBob3cgbWFueQorCQkgKiByZXR1cm5fdG9faGFuZGxlcigpJ3Mgd2UndmUgc2Vlbi4gSWYgdGhlcmUgaXMgbW9yZQorCQkgKiB0aGFuIG9uZSBwYXRjaGVkIHJldHVybiBhZGRyZXNzIG9uIG91ciBzdGFjaywKKwkJICogY29tcGxhaW4gbG91ZGx5LgorCQkgKi8KKwkJV0FSTl9PTihpbmRleCA+IDApOworCisJCXBjID0gY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5yZXQ7CisJfQorI2VuZGlmCisKIAlmcmFtZSA9IG1lbXBvb2xfYWxsb2MoZHdhcmZfZnJhbWVfcG9vbCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFmcmFtZSkgewogCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBhIGR3YXJmIGZyYW1lXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2VudHJ5LWNvbW1vbi5TIGIvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggNjhkOTIyMy4uM2ViODQ5MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMKQEAgLTEyMSw3ICsxMjEsNyBAQAogRU5UUlkocmVzdW1lX3VzZXJzcGFjZSkKIAkhIHI4OiBjdXJyZW50X3RocmVhZF9pbmZvCiAJY2xpCi0JVFJBQ0VfSVJRU19PZkYKKwlUUkFDRV9JUlFTX09GRgogCW1vdi5sCUAoVElfRkxBR1MscjgpLCByMAkJISBjdXJyZW50X3RocmVhZF9pbmZvLT5mbGFncwogCXRzdAkjKF9USUZfV09SS19NQVNLICYgMHhmZiksIHIwCiAJYnQvcwlfX3Jlc3RvcmVfYWxsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCmluZGV4IGEzZGNjNmQuLjJjNDhlMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCkBAIC0yOTEsMzEgKzI5MSw0OCBAQAogCXJldHVybiBzeXNjYWxsc19tZXRhZGF0YVtucl07CiB9CiAKLXZvaWQgYXJjaF9pbml0X2Z0cmFjZV9zeXNjYWxscyh2b2lkKQoraW50IHN5c2NhbGxfbmFtZV90b19ucihjaGFyICpuYW1lKQoreworCWludCBpOworCisJaWYgKCFzeXNjYWxsc19tZXRhZGF0YSkKKwkJcmV0dXJuIC0xOworCWZvciAoaSA9IDA7IGkgPCBOUl9zeXNjYWxsczsgaSsrKQorCQlpZiAoc3lzY2FsbHNfbWV0YWRhdGFbaV0pCisJCQlpZiAoIXN0cmNtcChzeXNjYWxsc19tZXRhZGF0YVtpXS0+bmFtZSwgbmFtZSkpCisJCQkJcmV0dXJuIGk7CisJcmV0dXJuIC0xOworfQorCit2b2lkIHNldF9zeXNjYWxsX2VudGVyX2lkKGludCBudW0sIGludCBpZCkKK3sKKwlzeXNjYWxsc19tZXRhZGF0YVtudW1dLT5lbnRlcl9pZCA9IGlkOworfQorCit2b2lkIHNldF9zeXNjYWxsX2V4aXRfaWQoaW50IG51bSwgaW50IGlkKQoreworCXN5c2NhbGxzX21ldGFkYXRhW251bV0tPmV4aXRfaWQgPSBpZDsKK30KKworc3RhdGljIGludCBfX2luaXQgYXJjaF9pbml0X2Z0cmFjZV9zeXNjYWxscyh2b2lkKQogewogCWludCBpOwogCXN0cnVjdCBzeXNjYWxsX21ldGFkYXRhICptZXRhOwogCXVuc2lnbmVkIGxvbmcgKipwc3lzX3N5c2NhbGxfdGFibGUgPSAmc3lzX2NhbGxfdGFibGU7Ci0Jc3RhdGljIGF0b21pY190IHJlZnM7Ci0KLQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnJlZnMpICE9IDEpCi0JCWdvdG8gZW5kOwogCiAJc3lzY2FsbHNfbWV0YWRhdGEgPSBremFsbG9jKHNpemVvZigqc3lzY2FsbHNfbWV0YWRhdGEpICoKIAkJCQkJRlRSQUNFX1NZU0NBTExfTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN5c2NhbGxzX21ldGFkYXRhKSB7CiAJCVdBUk5fT04oMSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEZUUkFDRV9TWVNDQUxMX01BWDsgaSsrKSB7CiAJCW1ldGEgPSBmaW5kX3N5c2NhbGxfbWV0YShwc3lzX3N5c2NhbGxfdGFibGVbaV0pOwogCQlzeXNjYWxsc19tZXRhZGF0YVtpXSA9IG1ldGE7CiAJfQotCXJldHVybjsKIAotCS8qIFBhcmFub2lkOiBhdm9pZCBvdmVyZmxvdyAqLwotZW5kOgotCWF0b21pY19kZWMoJnJlZnMpOworCXJldHVybiAwOwogfQorYXJjaF9pbml0Y2FsbChhcmNoX2luaXRfZnRyYWNlX3N5c2NhbGxzKTsKICNlbmRpZiAvKiBDT05GSUdfRlRSQUNFX1NZU0NBTExTICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvc2gva2VybmVsL2luaXRfdGFzay5jCmluZGV4IDE3MTk5NTcuLjExZjJlYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvc2gva2VybmVsL2luaXRfdGFzay5jCkBAIC0xNyw5ICsxNyw4IEBACiAgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCiAgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KICAqLwotdW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPQotCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPQorCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CiAKIC8qCiAgKiBJbml0aWFsIHRhc2sgc3RydWN0dXJlLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jIGIvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jCmluZGV4IDRmZjUwNzIuLmI4ZmE2NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lvX2dlbmVyaWMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pb19nZW5lcmljLmMKQEAgLTE0Nyw2ICsxNDcsOSBAQAogCiB2b2lkIF9faW9tZW0gKmdlbmVyaWNfaW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBzaXplKQogeworCWlmIChQWFNFRyhhZGRyKSA+PSBQMVNFRykKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilhZGRyOworCiAJcmV0dXJuICh2b2lkIF9faW9tZW0gKikoYWRkciArIGdlbmVyaWNfaW9fYmFzZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2lycS5jIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKaW5kZXggNjBmOGFmNC4uZWFjN2RhNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTEwNiw3ICsxMDcsNyBAQAogc3RhdGljIHVuaW9uIGlycV9jdHggKnNvZnRpcnFfY3R4W05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CiAjZW5kaWYKIAotYXNtbGlua2FnZSBpbnQgZG9fSVJRKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSBfX2lycV9lbnRyeSBpbnQgZG9fSVJRKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKICNpZmRlZiBDT05GSUdfSVJRU1RBQ0tTCkBAIC0xNjUsMTEgKzE2Niw5IEBACiB9CiAKICNpZmRlZiBDT05GSUdfSVJRU1RBQ0tTCi1zdGF0aWMgY2hhciBzb2Z0aXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KLQkJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikpKTsKK3N0YXRpYyBjaGFyIHNvZnRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXSBfX3BhZ2VfYWxpZ25lZF9ic3M7CiAKLXN0YXRpYyBjaGFyIGhhcmRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXQotCQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmJzcy5wYWdlX2FsaWduZWQiKSkpOworc3RhdGljIGNoYXIgaGFyZGlycV9zdGFja1tOUl9DUFVTICogVEhSRUFEX1NJWkVdIF9fcGFnZV9hbGlnbmVkX2JzczsKIAogLyoKICAqIGFsbG9jYXRlIHBlci1jcHUgc3RhY2tzIGZvciBoYXJkaXJxIGFuZCBmb3Igc29mdGlycSBwcm9jZXNzaW5nCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKaW5kZXggNTQ4ZjY2MC4uY2JjZTYzOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvbWFjaHZlYy5jCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2h2ZWMuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTEzMyw0ICsxMzQsNiBAQAogCiAJaWYgKCFzaF9tdi5tdl9ucl9pcnFzKQogCQlzaF9tdi5tdl9ucl9pcnFzID0gTlJfSVJRUzsKKworCV9fc2V0X2lvX3BvcnRfYmFzZShQMlNFRyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwppbmRleCBmOWQ0NGY4Li45OWI0ZmI1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKQEAgLTU0OSw2ICs1NDksOCBAQAogCiAJaWYgKGNwdSA9PSAwKQogCQlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogJXNcbiIsIGdldF9zeXN0ZW1fdHlwZSgpKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgIlxuIik7CiAKIAlzZXFfcHJpbnRmKG0sICJwcm9jZXNzb3JcdDogJWRcbiIsIGNwdSk7CiAJc2VxX3ByaW50ZihtLCAiY3B1IGZhbWlseVx0OiAlc1xuIiwgaW5pdF91dHNuYW1lKCktPm1hY2hpbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXNfMzIuYyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zXzMyLmMKaW5kZXggOGRiZTI2Yi4uNDQ0Y2NlMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXNfMzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltc18zMi5jCkBAIC04NCw2ICs4NCwyMSBAQAogREVDTEFSRV9FWFBPUlQoX19tb3ZzdHJfaTRfZXZlbik7CiBERUNMQVJFX0VYUE9SVChfX21vdnN0cl9pNF9vZGQpOwogREVDTEFSRV9FWFBPUlQoX19tb3ZzdHJTSTEyX2k0KTsKK0RFQ0xBUkVfRVhQT1JUKF9fbW92bWVtKTsKK0RFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0k4KTsKK0RFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0kxMik7CitERUNMQVJFX0VYUE9SVChfX21vdm1lbVNJMTYpOworREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1TSTIwKTsKK0RFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0kyNCk7CitERUNMQVJFX0VYUE9SVChfX21vdm1lbVNJMjgpOworREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1TSTMyKTsKK0RFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0kzNik7CitERUNMQVJFX0VYUE9SVChfX21vdm1lbVNJNDApOworREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1TSTQ0KTsKK0RFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0k0OCk7CitERUNMQVJFX0VYUE9SVChfX21vdm1lbVNJNTIpOworREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1TSTU2KTsKK0RFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0k2MCk7CiBERUNMQVJFX0VYUE9SVChfX21vdm1lbV9pNF9ldmVuKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtX2k0X29kZCk7CiBERUNMQVJFX0VYUE9SVChfX21vdm1lbVNJMTJfaTQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2lnbmFsXzMyLmMgYi9hcmNoL3NoL2tlcm5lbC9zaWduYWxfMzIuYwppbmRleCA2NzI5NzAzLi4zZGIzNzQyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zaWduYWxfMzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zaWduYWxfMzIuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCi0JaWYgKCEoY3VycmVudF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfRlBVKSkKKwlpZiAoIShib290X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19GUFUpKQogCQlyZXR1cm4gMDsKIAogCXNldF91c2VkX21hdGgoKTsKQEAgLTE1OCw3ICsxNTgsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAotCWlmICghKGN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX0ZQVSkpCisJaWYgKCEoYm9vdF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfRlBVKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIXVzZWRfbWF0aCgpKSB7CkBAIC0xOTksNyArMTk5LDcgQEAKICN1bmRlZiBDT1BZCiAKICNpZmRlZiBDT05GSUdfU0hfRlBVCi0JaWYgKGN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX0ZQVSkgeworCWlmIChib290X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19GUFUpIHsKIAkJaW50IG93bmVkX2ZwOwogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKQEAgLTQ3Miw2ICs0NzIsNyBAQAogCQllcnIgfD0gX19wdXRfdXNlcihPUl9SMF9SMCwgJmZyYW1lLT5yZXRjb2RlWzZdKTsKIAkJZXJyIHw9IF9fcHV0X3VzZXIoKF9fTlJfcnRfc2lncmV0dXJuKSwgJmZyYW1lLT5yZXRjb2RlWzddKTsKIAkJcmVncy0+cHIgPSAodW5zaWduZWQgbG9uZykgZnJhbWUtPnJldGNvZGU7CisJCWZsdXNoX2ljYWNoZV9yYW5nZShyZWdzLT5wciwgcmVncy0+cHIgKyBzaXplb2YoZnJhbWUtPnJldGNvZGUpKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtNDk3LDggKzQ5OCw2IEBACiAJcHJfZGVidWcoIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSUwOGx4IHByPSUwOGx4XG4iLAogCQkgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksIGZyYW1lLCByZWdzLT5wYywgcmVncy0+cHIpOwogCi0JZmx1c2hfaWNhY2hlX3JhbmdlKHJlZ3MtPnByLCByZWdzLT5wciArIHNpemVvZihmcmFtZS0+cmV0Y29kZSkpOwotCiAJcmV0dXJuIDA7CiAKIGdpdmVfc2lnc2VndjoKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NtcC5jIGIvYXJjaC9zaC9rZXJuZWwvc21wLmMKaW5kZXggNDQyZDhkNC4uMTYwZGIxMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc21wLmMKQEAgLTM1LDYgKzM1LDggQEAKIHsKIAlzdHJ1Y3Qgc2hfY3B1aW5mbyAqYyA9IGNwdV9kYXRhICsgY3B1OwogCisJbWVtY3B5KGMsICZib290X2NwdV9kYXRhLCBzaXplb2Yoc3RydWN0IHNoX2NwdWluZm8pKTsKKwogCWMtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3lzX3NoMzIuYyBiL2FyY2gvc2gva2VybmVsL3N5c19zaDMyLmMKaW5kZXggNjNiYTEyOC4uZWI2OGJmZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc3lzX3NoMzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNfc2gzMi5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3N5c19zaDY0LmMgYi9hcmNoL3NoL2tlcm5lbC9zeXNfc2g2NC5jCmluZGV4IDkxZmI4NDQuLjI4NzIzNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3N5c19zaDY0LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc3lzX3NoNjQuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCA2YWJhOWFmLi43YTJlZTNhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9mcHUuaD4KQEAgLTU0LDggKzU1LDggQEAKIC8qIGJpdGZpZWxkOiAxOiB3YXJuIDI6IGZpeHVwIDQ6IHNpZ25hbCAtPiBjb21iaW5hdGlvbnMgMnw0ICYmIDF8Mnw0IGFyZSBub3QKICAgIHZhbGlkISAqLwogc3RhdGljIGludCBzZV91c2VybW9kZSA9IDM7Ci0vKiAwOiBubyB3YXJuaW5nIDE6IHByaW50IGEgd2FybmluZyBtZXNzYWdlICovCi1zdGF0aWMgaW50IHNlX2tlcm5tb2RlX3dhcm4gPSAxOworLyogMDogbm8gd2FybmluZyAxOiBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSwgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLworc3RhdGljIGludCBzZV9rZXJubW9kZV93YXJuOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyBjb25zdCBjaGFyICpzZV91c2VybW9kZV9hY3Rpb25bXSA9IHsKQEAgLTE1OSwxMiArMTYwLDEyIEBACiAKIAlvb3BzX2VudGVyKCk7CiAKLQljb25zb2xlX3ZlcmJvc2UoKTsKIAlzcGluX2xvY2tfaXJxKCZkaWVfbG9jayk7CisJY29uc29sZV92ZXJib3NlKCk7CiAJYnVzdF9zcGlubG9ja3MoMSk7CiAKIAlwcmludGsoIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOwotCisJc3lzZnNfcHJpbnRrX2xhc3RfZmlsZSgpOwogCXByaW50X21vZHVsZXMoKTsKIAlzaG93X3JlZ3MocmVncyk7CiAKQEAgLTE4MCw2ICsxODEsNyBAQAogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOworCW9vcHNfZXhpdCgpOwogCiAJaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSkKIAkJY3Jhc2hfa2V4ZWMocmVncyk7CkBAIC0xOTAsNyArMTkyLDYgQEAKIAlpZiAocGFuaWNfb25fb29wcykKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiIpOwogCi0Jb29wc19leGl0KCk7CiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIApAQCAtNDUyLDYgKzQ1MywxMiBAQAogCXVfaW50IHJtOwogCWludCByZXQsIGluZGV4OwogCisJLyoKKwkgKiBYWFg6IFdlIGNhbid0IGhhbmRsZSBtaXhlZCAxNi8zMi1iaXQgaW5zdHJ1Y3Rpb25zIHlldAorCSAqLworCWlmIChpbnN0cnVjdGlvbl9zaXplKGluc3RydWN0aW9uKSAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWluZGV4ID0gKGluc3RydWN0aW9uPj44KSYxNTsJLyogMHgwRjAwICovCiAJcm0gPSByZWdzLT5yZWdzW2luZGV4XTsKIApAQCAtNjE5LDkgKzYyNiw5IEBACiAKIAkJc2VfdXNlciArPSAxOwogCi0jaWZuZGVmIENPTkZJR19DUFVfU0gyQQogCQlzZXRfZnMoVVNFUl9EUyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zdHJ1Y3Rpb24sICh1MTYgKikocmVncy0+cGMgJiB+MSksIDIpKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zdHJ1Y3Rpb24sIChpbnNuX3NpemVfdCAqKShyZWdzLT5wYyAmIH4xKSwKKwkJCQkgICBzaXplb2YoaW5zdHJ1Y3Rpb24pKSkgewogCQkJc2V0X2ZzKG9sZGZzKTsKIAkJCWdvdG8gdXNwYWNlX3NlZ3Y7CiAJCX0KQEAgLTYzMyw3ICs2NDAsNiBAQAogCQkJICAgICAgICJpbiBcIiVzXCIgcGlkPSVkIHBjPTB4JXAgaW5zPTB4JTA0aHhcbiIsCiAJCQkgICAgICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAodm9pZCAqKXJlZ3MtPnBjLAogCQkJICAgICAgIGluc3RydWN0aW9uKTsKLSNlbmRpZgogCiAJCWlmIChzZV91c2VybW9kZSAmIDIpCiAJCQlnb3RvIGZpeHVwOwpAQCAtNjczLDEyICs2NzksNiBAQAogCX0gZWxzZSB7CiAJCXNlX3N5cyArPSAxOwogCi0JCWlmIChzZV9rZXJubW9kZV93YXJuKQotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJVbmFsaWduZWQga2VybmVsIGFjY2VzcyAiCi0JCQkgICAgICAgIm9uIGJlaGFsZiBvZiBcIiVzXCIgcGlkPSVkIHBjPTB4JXAgaW5zPTB4JTA0aHhcbiIsCi0JCQkgICAgICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAodm9pZCAqKXJlZ3MtPnBjLAotCQkJICAgICAgIGluc3RydWN0aW9uKTsKLQogCQlpZiAocmVncy0+cGMgJiAxKQogCQkJZGllKCJ1bmFsaWduZWQgcHJvZ3JhbSBjb3VudGVyIiwgcmVncywgZXJyb3JfY29kZSk7CiAKQEAgLTY5Miw2ICs2OTIsMTIgQEAKIAkJCWRpZSgiaW5zbiBmYXVsdGluZyBpbiBkb19hZGRyZXNzX2Vycm9yIiwgcmVncywgMCk7CiAJCX0KIAorCQlpZiAoc2Vfa2Vybm1vZGVfd2FybikKKwkJCXByaW50ayhLRVJOX05PVElDRSAiVW5hbGlnbmVkIGtlcm5lbCBhY2Nlc3MgIgorCQkJICAgICAgICJvbiBiZWhhbGYgb2YgXCIlc1wiIHBpZD0lZCBwYz0weCVwIGlucz0weCUwNGh4XG4iLAorCQkJICAgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgKHZvaWQgKilyZWdzLT5wYywKKwkJCSAgICAgICBpbnN0cnVjdGlvbik7CisKIAkJaGFuZGxlX3VuYWxpZ25lZF9hY2Nlc3MoaW5zdHJ1Y3Rpb24sIHJlZ3MsCiAJCQkJCSZ1c2VyX21lbV9hY2Nlc3MsIDApOwogCQlzZXRfZnMob2xkZnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdnN5c2NhbGwvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC9NYWtlZmlsZQppbmRleCA0YmJjZTFjLi44ZjBlYTVmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC9NYWtlZmlsZQpAQCAtMTUsNyArMTUsNyBAQAogZXhwb3J0IENQUEZMQUdTX3ZzeXNjYWxsLmxkcyArPSAtUCAtQyAtVXNoCiAKIHZzeXNjYWxsLWZsYWdzID0gLXNoYXJlZCAtcyAtV2wsLXNvbmFtZT1saW51eC1nYXRlLnNvLjEgXAotCQkkKGNhbGwgbGQtb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1zeXN2KQorCQkkKGNhbGwgY2MtbGRvcHRpb24sIC1XbCQoY29tbWEpLS1oYXNoLXN0eWxlPXN5c3YpCiAKIFNZU0NGTEFHU192c3lzY2FsbC10cmFwYS5zbwk9ICQodnN5c2NhbGwtZmxhZ3MpCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vS2NvbmZpZyBiL2FyY2gvc2gvbW0vS2NvbmZpZwppbmRleCA2NGRjMWFkLi43ZjdiNTJmIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL0tjb25maWcKKysrIGIvYXJjaC9zaC9tbS9LY29uZmlnCkBAIC0yMjcsNyArMjI3LDcgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJIdWdlVExCIHBhZ2Ugc2l6ZSIKLQlkZXBlbmRzIG9uIEhVR0VUTEJfUEFHRSAmJiAoQ1BVX1NINCB8fCBDUFVfU0g1KSAmJiBNTVUKKwlkZXBlbmRzIG9uIEhVR0VUTEJfUEFHRQogCWRlZmF1bHQgSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlmIFBBR0VfU0laRV82NEtCCiAJZGVmYXVsdCBIVUdFVExCX1BBR0VfU0laRV82NEsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g0LmMKaW5kZXggYjI0NTNiYi4uNTE5ZTJkMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLXNoNC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjZGVmaW5lIE1BWF9EQ0FDSEVfUEFHRVMJNjQJLyogWFhYOiBUdW5lIGZvciB3YXlzICovCiAjZGVmaW5lIE1BWF9JQ0FDSEVfUEFHRVMJMzIKIAotc3RhdGljIHZvaWQgX19mbHVzaF9jYWNoZV80MDk2KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaHlzLAorc3RhdGljIHZvaWQgX19mbHVzaF9jYWNoZV9vbmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBoeXMsCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBleGVjX29mZnNldCk7CiAKIC8qCkBAIC00Myw3ICs0Myw3IEBACiAgKiBDYWxsZWQgZnJvbSBrZXJuZWwvbW9kdWxlLmM6c3lzX2luaXRfbW9kdWxlIGFuZCByb3V0aW5lIGZvciBhLm91dCBmb3JtYXQsCiAgKiBzaWduYWwgaGFuZGxlciBjb2RlIGFuZCBrcHJvYmVzIGNvZGUKICAqLwotc3RhdGljIHZvaWQgc2g0X2ZsdXNoX2ljYWNoZV9yYW5nZSh2b2lkICphcmdzKQorc3RhdGljIHZvaWQgX191c2VzX2p1bXBfdG9fdW5jYWNoZWQgc2g0X2ZsdXNoX2ljYWNoZV9yYW5nZSh2b2lkICphcmdzKQogewogCXN0cnVjdCBmbHVzaGVyX2RhdGEgKmRhdGEgPSBhcmdzOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKQEAgLTg5LDggKzg5LDcgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9jYWNoZV80MDk2KHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgcGh5cykKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9jYWNoZV9vbmUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBwaHlzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGV4ZWNfb2Zmc2V0ID0gMDsKIApAQCAtMTAzLDggKzEwMiw3IEBACiAJCWV4ZWNfb2Zmc2V0ID0gMHgyMDAwMDAwMDsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlfX2ZsdXNoX2NhY2hlXzQwOTYoc3RhcnQgfCBTSF9DQUNIRV9BU1NPQywKLQkJCSAgIFAxU0VHQUREUihwaHlzKSwgZXhlY19vZmZzZXQpOworCV9fZmx1c2hfY2FjaGVfb25lKHN0YXJ0IHwgU0hfQ0FDSEVfQVNTT0MsIFAxU0VHQUREUihwaHlzKSwgZXhlY19vZmZzZXQpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIApAQCAtMTI5LDggKzEyNyw4IEBACiAKIAkJLyogTG9vcCBhbGwgdGhlIEQtY2FjaGUgKi8KIAkJbiA9IGJvb3RfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlczsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKywgYWRkciArPSA0MDk2KQotCQkJZmx1c2hfY2FjaGVfNDA5NihhZGRyLCBwaHlzKTsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKywgYWRkciArPSBQQUdFX1NJWkUpCisJCQlmbHVzaF9jYWNoZV9vbmUoYWRkciwgcGh5cyk7CiAJfQogCiAJd21iKCk7CkBAIC0zMTgsMTEgKzMxNiwxMSBAQAogCS8qIFdlIG9ubHkgbmVlZCB0byBmbHVzaCBELWNhY2hlIHdoZW4gd2UgaGF2ZSBhbGlhcyAqLwogCWlmICgoYWRkcmVzc15waHlzKSAmIGFsaWFzX21hc2spIHsKIAkJLyogTG9vcCA0SyBvZiB0aGUgRC1jYWNoZSAqLwotCQlmbHVzaF9jYWNoZV80MDk2KAorCQlmbHVzaF9jYWNoZV9vbmUoCiAJCQlDQUNIRV9PQ19BRERSRVNTX0FSUkFZIHwgKGFkZHJlc3MgJiBhbGlhc19tYXNrKSwKIAkJCXBoeXMpOwogCQkvKiBMb29wIGFub3RoZXIgNEsgb2YgdGhlIEQtY2FjaGUgKi8KLQkJZmx1c2hfY2FjaGVfNDA5NigKKwkJZmx1c2hfY2FjaGVfb25lKAogCQkJQ0FDSEVfT0NfQUREUkVTU19BUlJBWSB8IChwaHlzICYgYWxpYXNfbWFzayksCiAJCQlwaHlzKTsKIAl9CkBAIC0zMzcsNyArMzM1LDcgQEAKIAkJICoga2VybmVsIGhhcyBuZXZlciBleGVjdXRlZCB0aGUgY29kZSB0aHJvdWdoIGl0cyBpZGVudGl0eQogCQkgKiB0cmFuc2xhdGlvbi4KIAkJICovCi0JCWZsdXNoX2NhY2hlXzQwOTYoCisJCWZsdXNoX2NhY2hlX29uZSgKIAkJCUNBQ0hFX0lDX0FERFJFU1NfQVJSQVkgfCAoYWRkcmVzcyAmIGFsaWFzX21hc2spLAogCQkJcGh5cyk7CiAJfQpAQCAtMzkzLDcgKzM5MSw3IEBACiB9CiAKIC8qKgotICogX19mbHVzaF9jYWNoZV80MDk2CisgKiBfX2ZsdXNoX2NhY2hlX29uZQogICoKICAqIEBhZGRyOiAgYWRkcmVzcyBpbiBtZW1vcnkgbWFwcGVkIGNhY2hlIGFycmF5CiAgKiBAcGh5czogIFAxIGFkZHJlc3MgdG8gZmx1c2ggKGhhcyB0byBtYXRjaCB0YWdzIGlmIGFkZHIgaGFzICdBJyBiaXQKQEAgLTQwNiw3ICs0MDQsNyBAQAogICogb3BlcmF0aW9uIChwdXJnZS93cml0ZS1iYWNrKSBpcyBzZWxlY3RlZCBieSB0aGUgbG93ZXIgMiBiaXRzIG9mCiAgKiAncGh5cycuCiAgKi8KLXN0YXRpYyB2b2lkIF9fZmx1c2hfY2FjaGVfNDA5Nih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGh5cywKK3N0YXRpYyB2b2lkIF9fZmx1c2hfY2FjaGVfb25lKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaHlzLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXhlY19vZmZzZXQpCiB7CiAJaW50IHdheV9jb3VudDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtc2g3NzA1LmMgYi9hcmNoL3NoL21tL2NhY2hlLXNoNzcwNS5jCmluZGV4IDJjYWRlZTIuLjI2MDE5MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUtc2g3NzA1LmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDc3MDUuYwpAQCAtNzgsNyArNzgsNyBAQAogLyoKICAqIFdyaXRlYmFjayZJbnZhbGlkYXRlIHRoZSBELWNhY2hlIG9mIHRoZSBwYWdlCiAgKi8KLXN0YXRpYyB2b2lkIF9fZmx1c2hfZGNhY2hlX3BhZ2UodW5zaWduZWQgbG9uZyBwaHlzKQorc3RhdGljIHZvaWQgX191c2VzX2p1bXBfdG9fdW5jYWNoZWQgX19mbHVzaF9kY2FjaGVfcGFnZSh1bnNpZ25lZCBsb25nIHBoeXMpCiB7CiAJdW5zaWduZWQgbG9uZyB3YXlzLCB3YXlzaXplLCBhZGRyc3RhcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQlfX2ZsdXNoX2RjYWNoZV9wYWdlKFBIWVNBRERSKHBhZ2VfYWRkcmVzcyhwYWdlKSkpOwogfQogCi1zdGF0aWMgdm9pZCBzaDc3MDVfZmx1c2hfY2FjaGVfYWxsKHZvaWQgKmFyZ3MpCitzdGF0aWMgdm9pZCBfX3VzZXNfanVtcF90b191bmNhY2hlZCBzaDc3MDVfZmx1c2hfY2FjaGVfYWxsKHZvaWQgKmFyZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS5jIGIvYXJjaC9zaC9tbS9jYWNoZS5jCmluZGV4IDM1YzM3YjcuLmEyZGM3ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQlyZXR1cm47CiAKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQlpZiAocGZuX3ZhbGlkKHBmbikgJiYgcGFnZV9tYXBwaW5nKHBhZ2UpKSB7CisJaWYgKHBmbl92YWxpZChwZm4pKSB7CiAJCWludCBkaXJ0eSA9IHRlc3RfYW5kX2NsZWFyX2JpdChQR19kY2FjaGVfZGlydHksICZwYWdlLT5mbGFncyk7CiAJCWlmIChkaXJ0eSkgewogCQkJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOwpAQCAtMjY1LDYgKzI2NSw4IEBACiAKIHZvaWQgX19pbml0IGNwdV9jYWNoZV9pbml0KHZvaWQpCiB7CisJdW5zaWduZWQgaW50IGNhY2hlX2Rpc2FibGVkID0gIShfX3Jhd19yZWFkbChDQ1IpICYgQ0NSX0NBQ0hFX0VOQUJMRSk7CisKIAljb21wdXRlX2FsaWFzKCZib290X2NwdV9kYXRhLmljYWNoZSk7CiAJY29tcHV0ZV9hbGlhcygmYm9vdF9jcHVfZGF0YS5kY2FjaGUpOwogCWNvbXB1dGVfYWxpYXMoJmJvb3RfY3B1X2RhdGEuc2NhY2hlKTsKQEAgLTI3Myw2ICsyNzUsMTMgQEAKIAlfX2ZsdXNoX3B1cmdlX3JlZ2lvbgkJPSBub29wX19mbHVzaF9yZWdpb247CiAJX19mbHVzaF9pbnZhbGlkYXRlX3JlZ2lvbgk9IG5vb3BfX2ZsdXNoX3JlZ2lvbjsKIAorCS8qCisJICogTm8gZmx1c2hpbmcgaXMgbmVjZXNzYXJ5IGluIHRoZSBkaXNhYmxlZCBjYWNoZSBjYXNlIHNvIHdlIGNhbgorCSAqIGp1c3Qga2VlcCB0aGUgbm9vcCBmdW5jdGlvbnMgaW4gbG9jYWxfZmx1c2hfLi4oKSBhbmQgX19mbHVzaF8uLigpCisJICovCisJaWYgKHVubGlrZWx5KGNhY2hlX2Rpc2FibGVkKSkKKwkJZ290byBza2lwOworCiAJaWYgKGJvb3RfY3B1X2RhdGEuZmFtaWx5ID09IENQVV9GQU1JTFlfU0gyKSB7CiAJCWV4dGVybiB2b2lkIF9fd2VhayBzaDJfY2FjaGVfaW5pdCh2b2lkKTsKIApAQCAtMzEyLDUgKzMyMSw2IEBACiAJCXNoNV9jYWNoZV9pbml0KCk7CiAJfQogCitza2lwOgogCWVtaXRfY2FjaGVfcGFyYW1zKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2lvcmVtYXBfMzIuYyBiL2FyY2gvc2gvbW0vaW9yZW1hcF8zMi5jCmluZGV4IGMzMjUwNjEuLmE4NmVhYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vaW9yZW1hcF8zMi5jCisrKyBiL2FyY2gvc2gvbW0vaW9yZW1hcF8zMi5jCkBAIC04Myw3ICs4Myw3IEBACiAJICoKIAkgKiBQTUIgZW50cmllcyBhcmUgYWxsIHByZS1mYXVsdGVkLgogCSAqLwotCWlmICh1bmxpa2VseShzaXplID49IDB4MTAwMDAwMCkpIHsKKwlpZiAodW5saWtlbHkocGh5c19hZGRyID49IFAxU0VHKSkgewogCQl1bnNpZ25lZCBsb25nIG1hcHBlZCA9IHBtYl9yZW1hcChhZGRyLCBwaHlzX2FkZHIsIHNpemUsIGZsYWdzKTsKIAogCQlpZiAobGlrZWx5KG1hcHBlZCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcG1iLmMgYi9hcmNoL3NoL21tL3BtYi5jCmluZGV4IGIxYTcxNGEuLmFhZGUzMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vcG1iLmMKKysrIGIvYXJjaC9zaC9tbS9wbWIuYwpAQCAtMzMsNiArMzMsOCBAQAogCiAjZGVmaW5lIE5SX1BNQl9FTlRSSUVTCTE2CiAKK3N0YXRpYyB2b2lkIF9fcG1iX3VubWFwKHN0cnVjdCBwbWJfZW50cnkgKik7CisKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcG1iX2NhY2hlOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcG1iX21hcDsKIApAQCAtMjE4LDkgKzIyMCwxMCBAQAogbG9uZyBwbWJfcmVtYXAodW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwaHlzLAogCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Jc3RydWN0IHBtYl9lbnRyeSAqcG1icDsKKwlzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJwLCAqcG1iZTsKIAl1bnNpZ25lZCBsb25nIHdhbnRlZDsKIAlpbnQgcG1iX2ZsYWdzLCBpOworCWxvbmcgZXJyOwogCiAJLyogQ29udmVydCB0eXBpY2FsIHBncHJvdCB2YWx1ZSB0byB0aGUgUE1CIGVxdWl2YWxlbnQgKi8KIAlpZiAoZmxhZ3MgJiBfUEFHRV9DQUNIQUJMRSkgewpAQCAtMjM2LDIwICsyMzksMjIgQEAKIAogYWdhaW46CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG1iX3NpemVzKTsgaSsrKSB7Ci0JCXN0cnVjdCBwbWJfZW50cnkgKnBtYmU7CiAJCWludCByZXQ7CiAKIAkJaWYgKHNpemUgPCBwbWJfc2l6ZXNbaV0uc2l6ZSkKIAkJCWNvbnRpbnVlOwogCiAJCXBtYmUgPSBwbWJfYWxsb2ModmFkZHIsIHBoeXMsIHBtYl9mbGFncyB8IHBtYl9zaXplc1tpXS5mbGFnKTsKLQkJaWYgKElTX0VSUihwbWJlKSkKLQkJCXJldHVybiBQVFJfRVJSKHBtYmUpOworCQlpZiAoSVNfRVJSKHBtYmUpKSB7CisJCQllcnIgPSBQVFJfRVJSKHBtYmUpOworCQkJZ290byBvdXQ7CisJCX0KIAogCQlyZXQgPSBzZXRfcG1iX2VudHJ5KHBtYmUpOwogCQlpZiAocmV0ICE9IDApIHsKIAkJCXBtYl9mcmVlKHBtYmUpOwotCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJcGh5cwkrPSBwbWJfc2l6ZXNbaV0uc2l6ZTsKQEAgLTI2NCwxMiArMjY5LDI1IEBACiAJCQlwbWJwLT5saW5rID0gcG1iZTsKIAogCQlwbWJwID0gcG1iZTsKKworCQkvKgorCQkgKiBJbnN0ZWFkIG9mIHRyeWluZyBzbWFsbGVyIHNpemVzIG9uIGV2ZXJ5IGl0ZXJhdGlvbgorCQkgKiAoZXZlbiBpZiB3ZSBzdWNjZWVkIGluIGFsbG9jYXRpbmcgc3BhY2UpLCB0cnkgdXNpbmcKKwkJICogcG1iX3NpemVzW2ldLnNpemUgYWdhaW4uCisJCSAqLworCQlpLS07CiAJfQogCiAJaWYgKHNpemUgPj0gMHgxMDAwMDAwKQogCQlnb3RvIGFnYWluOwogCiAJcmV0dXJuIHdhbnRlZCAtIHNpemU7CisKK291dDoKKwlpZiAocG1icCkKKwkJX19wbWJfdW5tYXAocG1icCk7CisKKwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIHBtYl91bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIpCkBAIC0yODMsMTIgKzMwMSwxOSBAQAogCWlmICh1bmxpa2VseSghcG1iZSkpCiAJCXJldHVybjsKIAorCV9fcG1iX3VubWFwKHBtYmUpOworfQorCitzdGF0aWMgdm9pZCBfX3BtYl91bm1hcChzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKQorewogCVdBUk5fT04oIXRlc3RfYml0KHBtYmUtPmVudHJ5LCAmcG1iX21hcCkpOwogCiAJZG8gewogCQlzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJsaW5rID0gcG1iZTsKIAotCQljbGVhcl9wbWJfZW50cnkocG1iZSk7CisJCWlmIChwbWJlLT5lbnRyeSAhPSBQTUJfTk9fRU5UUlkpCisJCQljbGVhcl9wbWJfZW50cnkocG1iZSk7CisKIAkJcG1iZSA9IHBtYmxpbmstPmxpbms7CiAKIAkJcG1iX2ZyZWUocG1ibGluayk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggOTdmY2E0Ni4uMDVlZjUzOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjYsNiArMjYsNyBAQAogCXNlbGVjdCBSVENfQ0xBU1MKIAlzZWxlY3QgUlRDX0RSVl9NNDhUNTkKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUworCXNlbGVjdCBQRVJGX1VTRV9WTUFMTE9DCiAJc2VsZWN0IEhBVkVfRE1BX0FUVFJTCiAJc2VsZWN0IEhBVkVfRE1BX0FQSV9ERUJVRwogCkBAIC00OCw2ICs0OSw3IEBACiAJc2VsZWN0IFJUQ19EUlZfU1VONFYKIAlzZWxlY3QgUlRDX0RSVl9TVEFSRklSRQogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCisJc2VsZWN0IFBFUkZfVVNFX1ZNQUxMT0MKIAogY29uZmlnIEFSQ0hfREVGQ09ORklHCiAJc3RyaW5nCkBAIC0xMDIsNiArMTA0LDkgQEAKIGNvbmZpZyBORUVEX1BFUl9DUFVfRU1CRURfRklSU1RfQ0hVTksKIAlkZWZfYm9vbCB5IGlmIFNQQVJDNjQKIAorY29uZmlnIE5FRURfUEVSX0NQVV9QQUdFX0ZJUlNUX0NIVU5LCisJZGVmX2Jvb2wgeSBpZiBTUEFSQzY0CisKIGNvbmZpZyBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKIAlib29sCiAJZGVmX2Jvb2wgeSBpZiBTUEFSQzY0CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9NYWtlZmlsZQppbmRleCA0NjcyMjFkLi5kZmUyNzJkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmMvTWFrZWZpbGUKQEAgLTMxLDcgKzMxLDYgQEAKICNLQlVJTERfQ0ZMQUdTICs9IC1nIC1waXBlIC1mY2FsbC11c2VkLWc1IC1mY2FsbC11c2VkLWc3CiBLQlVJTERfQ0ZMQUdTICs9IC1tMzIgLXBpcGUgLW1uby1mcHUgLWZjYWxsLXVzZWQtZzUgLWZjYWxsLXVzZWQtZzcKIEtCVUlMRF9BRkxBR1MgKz0gLW0zMgotQ1BQRkxBR1Nfdm1saW51eC5sZHMgKz0gLW0zMgogCiAjTERGTEFHU192bWxpbnV4ID0gLU4gLVR0ZXh0IDB4ZjAwMDQwMDAKICMgIFNpbmNlIDIuNS40MCwgdGhlIGZpcnN0IHN0YWdlIGlzIGxlZnQgbm90IGJ0Zml4LWVkLgpAQCAtNDUsOSArNDQsNiBAQAogCiBDSEVDS0ZMQUdTICAgICAgKz0gLURfX3NwYXJjX18gLURfX3NwYXJjX3Y5X18gLURfX2FyY2g2NF9fIC1tNjQKIAotIyBVbmRlZmluZSBzcGFyYyB3aGVuIHByb2Nlc3Npbmcgdm1saW51eC5sZHMgLSBpdCBpcyB1c2VkCi0jIEFuZCB0ZWFjaCBDUFAgd2UgYXJlIGRvaW5nIDY0IGJpdCBidWlsZHMgKGZvciB0aGlzIGNhc2UpCi1DUFBGTEFHU192bWxpbnV4LmxkcyArPSAtbTY0IC1Vc3BhcmMKIExERkxBR1MgICAgICAgICAgICAgIDo9IC1tIGVsZjY0X3NwYXJjCiBleHBvcnQgQklUUyAgICAgICAgICA6PSA2NAogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2hhcmRpcnFfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaGFyZGlycV8zMi5oCmluZGV4IDRmNjNlZDguLjE2MjAwNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaGFyZGlycV8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaGFyZGlycV8zMi5oCkBAIC03LDE3ICs3LDcgQEAKICNpZm5kZWYgX19TUEFSQ19IQVJESVJRX0gKICNkZWZpbmUgX19TUEFSQ19IQVJESVJRX0gKIAotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+Ci0KLS8qIGVudHJ5LlMgaXMgc2Vuc2l0aXZlIHRvIHRoZSBvZmZzZXRzIG9mIHRoZXNlIGZpZWxkcyAqLyAvKiBYWFggUDMgSXMgaXQ/ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50IF9fc29mdGlycV9wZW5kaW5nOwotfSBfX19fY2FjaGVsaW5lX2FsaWduZWQgaXJxX2NwdXN0YXRfdDsKLQotI2luY2x1ZGUgPGxpbnV4L2lycV9jcHVzdGF0Lmg+CS8qIFN0YW5kYXJkIG1hcHBpbmdzIGZvciBpcnFfY3B1c3RhdF90IGFib3ZlICovCi0KICNkZWZpbmUgSEFSRElSUV9CSVRTICAgIDgKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oYXJkaXJxLmg+CiAKICNlbmRpZiAvKiBfX1NQQVJDX0hBUkRJUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxXzMyLmgKaW5kZXggZWE0MzA1Ny4uY2JmNDgwMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycV8zMi5oCkBAIC02LDEwICs2LDEwIEBACiAjaWZuZGVmIF9TUEFSQ19JUlFfSAogI2RlZmluZSBfU1BBUkNfSVJRX0gKIAotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCiAjZGVmaW5lIE5SX0lSUVMgICAgMTYKIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCiAjZGVmaW5lIGlycV9jYW5vbmljYWxpemUoaXJxKQkoaXJxKQogCiBleHRlcm4gdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCmluZGV4IDBmZjkyZmEuLmYzY2I3OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCkBAIC00MSw4ICs0MSw4IEBACiAjZGVmaW5lIExPV19PQlBfQUREUkVTUwkJX0FDKDB4MDAwMDAwMDBmMDAwMDAwMCxVTCkKICNkZWZpbmUgSElfT0JQX0FERFJFU1MJCV9BQygweDAwMDAwMDAxMDAwMDAwMDAsVUwpCiAjZGVmaW5lIFZNQUxMT0NfU1RBUlQJCV9BQygweDAwMDAwMDAxMDAwMDAwMDAsVUwpCi0jZGVmaW5lIFZNQUxMT0NfRU5ECQlfQUMoMHgwMDAwMDAwMjAwMDAwMDAwLFVMKQotI2RlZmluZSBWTUVNTUFQX0JBU0UJCV9BQygweDAwMDAwMDAyMDAwMDAwMDAsVUwpCisjZGVmaW5lIFZNQUxMT0NfRU5ECQlfQUMoMHgwMDAwMDEwMDAwMDAwMDAwLFVMKQorI2RlZmluZSBWTUVNTUFQX0JBU0UJCV9BQygweDAwMDAwMTAwMDAwMDAwMDAsVUwpCiAKICNkZWZpbmUgdm1lbW1hcAkJCSgoc3RydWN0IHBhZ2UgKilWTUVNTUFQX0JBU0UpCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF82NC5oCmluZGV4IGJlY2I2YmYuLmY0OWUxMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfNjQuaApAQCAtMzYsNyArMzYsNiBAQAogCiBleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwotI2RlZmluZSBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzawogCiAvKgogICoJR2VuZXJhbCBmdW5jdGlvbnMgdGhhdCBlYWNoIGhvc3Qgc3lzdGVtIG11c3QgcHJvdmlkZS4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdG9wb2xvZ3lfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdG9wb2xvZ3lfNjQuaAppbmRleCAyNmNkMjVjLi42MDBhNzkwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RvcG9sb2d5XzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90b3BvbG9neV82NC5oCkBAIC0xMiwyMiArMTIsOCBAQAogCiAjZGVmaW5lIHBhcmVudF9ub2RlKG5vZGUpCShub2RlKQogCi1zdGF0aWMgaW5saW5lIGNwdW1hc2tfdCBub2RlX3RvX2NwdW1hc2soaW50IG5vZGUpCi17Ci0JcmV0dXJuIG51bWFfY3B1bWFza19sb29rdXBfdGFibGVbbm9kZV07Ci19CiAjZGVmaW5lIGNwdW1hc2tfb2Zfbm9kZShub2RlKSAoJm51bWFfY3B1bWFza19sb29rdXBfdGFibGVbbm9kZV0pCiAKLS8qCi0gKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3B1bWFzayBvZiBDUFVzIG9uIE5vZGUgJ25vZGUnLgotICogRGVwcmVjYXRlZDogdXNlICJjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayA9IGNwdW1hc2tfb2Zfbm9kZShub2RlKSIKLSAqLwotI2RlZmluZSBub2RlX3RvX2NwdW1hc2tfcHRyKHYsIG5vZGUpCQlcCi0JCWNwdW1hc2tfdCAqdiA9ICYobnVtYV9jcHVtYXNrX2xvb2t1cF90YWJsZVtub2RlXSkKLQotI2RlZmluZSBub2RlX3RvX2NwdW1hc2tfcHRyX25leHQodiwgbm9kZSkJXAotCQkJICAgdiA9ICYobnVtYV9jcHVtYXNrX2xvb2t1cF90YWJsZVtub2RlXSkKLQogc3RydWN0IHBjaV9idXM7CiAjaWZkZWYgQ09ORklHX1BDSQogZXh0ZXJuIGludCBwY2lidXNfdG9fbm9kZShzdHJ1Y3QgcGNpX2J1cyAqcGJ1cyk7CkBAIC03MSw4ICs1Nyw2IEBACiAjaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGNwdSkJKGNwdV9kYXRhKGNwdSkucHJvY19pZCkKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9pZChjcHUpCQkJKGNwdV9kYXRhKGNwdSkuY29yZV9pZCkKLSNkZWZpbmUgdG9wb2xvZ3lfY29yZV9zaWJsaW5ncyhjcHUpCQkoY3B1X2NvcmVfbWFwW2NwdV0pCi0jZGVmaW5lIHRvcG9sb2d5X3RocmVhZF9zaWJsaW5ncyhjcHUpCQkocGVyX2NwdShjcHVfc2libGluZ19tYXAsIGNwdSkpCiAjZGVmaW5lIHRvcG9sb2d5X2NvcmVfY3B1bWFzayhjcHUpCQkoJmNwdV9jb3JlX21hcFtjcHVdKQogI2RlZmluZSB0b3BvbG9neV90aHJlYWRfY3B1bWFzayhjcHUpCQkoJnBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBjcHUpKQogI2RlZmluZSBtY19jYXBhYmxlKCkJCQkJKHNwYXJjNjRfbXVsdGlfY29yZSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdmlvLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Zpby5oCmluZGV4IDZjZGJmN2UuLjlkODNkM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdmlvLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS92aW8uaApAQCAtMjU4LDggKzI1OCw2IEBACiBzdGF0aWMgaW5saW5lIHUzMiB2aW9fZHJpbmdfYXZhaWwoc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCiAJCQkJICB1bnNpZ25lZCBpbnQgcmluZ19zaXplKQogewotCU1BWUJFX0JVSUxEX0JVR19PTighaXNfcG93ZXJfb2ZfMihyaW5nX3NpemUpKTsKLQogCXJldHVybiAoZHItPnBlbmRpbmcgLQogCQkoKGRyLT5wcm9kIC0gZHItPmNvbnMpICYgKHJpbmdfc2l6ZSAtIDEpKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCmluZGV4IDNhMDQ4ZmEuLjViNDdmYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCkBAIC03LDcgKzcsMTEgQEAKIAogZXh0cmEteSAgICAgOj0gaGVhZF8kKEJJVFMpLm8KIGV4dHJhLXkgICAgICs9IGluaXRfdGFzay5vCi1leHRyYS15ICAgICArPSB2bWxpbnV4LmxkcworCisjIFVuZGVmaW5lIHNwYXJjIHdoZW4gcHJvY2Vzc2luZyB2bWxpbnV4LmxkcyAtIGl0IGlzIHVzZWQKKyMgQW5kIHRlYWNoIENQUCB3ZSBhcmUgZG9pbmcgJChCSVRTKSBidWlsZHMgKGZvciB0aGlzIGNhc2UpCitDUFBGTEFHU192bWxpbnV4LmxkcyA6PSAtVXNwYXJjIC1tJChCSVRTKQorZXh0cmEteSAgICAgICAgICAgICAgKz0gdm1saW51eC5sZHMKIAogb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgKz0gZW50cnkubyB3b2YubyB3dWYubwogb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgKz0gZXRyYXBfMzIubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCAyODEyNWM1Li41ZmUzZDY1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMTgsNiArMTgsNSBAQAogICogSWYgdGhpcyBpcyBub3QgYWxpZ25lZCBvbiBhIDhrIGJvdW5kcnksIHRoZW4geW91IHNob3VsZCBjaGFuZ2UgY29kZQogICogaW4gZXRyYXAuUyB3aGljaCBhc3N1bWVzIGl0LgogICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uICgiLmRhdGEuaW5pdF90YXNrIikpKQotCT0geyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KKwl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwva3RsYi5TIGIvYXJjaC9zcGFyYy9rZXJuZWwva3RsYi5TCmluZGV4IDNlYTZlOGMuLjFkMzYxNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2t0bGIuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9rdGxiLlMKQEAgLTI4MCw4ICsyODAsOCBAQAogCiAjaWZkZWYgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQCiAJLyogRG8gbm90IHVzZSB0aGUgVFNCIGZvciB2bWVtbWFwLiAgKi8KLQltb3YJCShWTUVNTUFQX0JBU0UgPj4gMjQpLCAlZzUKLQlzbGx4CQklZzUsIDI0LCAlZzUKKwltb3YJCShWTUVNTUFQX0JBU0UgPj4gNDApLCAlZzUKKwlzbGx4CQklZzUsIDQwLCAlZzUKIAljbXAJCSVnNCwlZzUKIAliZ2V1LHBuCQkleGNjLCBrdm1hcF92bWVtbWFwCiAJIG5vcApAQCAtMjkzLDggKzI5Myw4IEBACiAJc2V0aGkJCSVoaShNT0RVTEVTX1ZBRERSKSwgJWc1CiAJY21wCQklZzQsICVnNQogCWJsdSxwbgkJJXhjYywga3ZtYXBfZHRsYl9sb25ncGF0aAotCSBtb3YJCShWTUFMTE9DX0VORCA+PiAyNCksICVnNQotCXNsbHgJCSVnNSwgMjQsICVnNQorCSBtb3YJCShWTUFMTE9DX0VORCA+PiA0MCksICVnNQorCXNsbHgJCSVnNSwgNDAsICVnNQogCWNtcAkJJWc0LCAlZzUKIAliZ2V1LHBuCQkleGNjLCBrdm1hcF9kdGxiX2xvbmdwYXRoCiAJIG5vcApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGRjLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYwppbmRleCBhZGY1ZjI3Li5jYjNjNzJjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYwpAQCAtMTI0MiwxMyArMTI0MiwxMyBAQAogCXNucHJpbnRmKGxwLT50eF9pcnFfbmFtZSwgTERDX0lSUV9OQU1FX01BWCwgIiVzIFRYIiwgbmFtZSk7CiAKIAllcnIgPSByZXF1ZXN0X2lycShscC0+Y2ZnLnJ4X2lycSwgbGRjX3J4LAotCQkJICBJUlFGX1NBTVBMRV9SQU5ET00gfCBJUlFGX1NIQVJFRCwKKwkJCSAgSVJRRl9TQU1QTEVfUkFORE9NIHwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAogCQkJICBscC0+cnhfaXJxX25hbWUsIGxwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gcmVxdWVzdF9pcnEobHAtPmNmZy50eF9pcnEsIGxkY190eCwKLQkJCSAgSVJRRl9TQU1QTEVfUkFORE9NIHwgSVJRRl9TSEFSRUQsCisJCQkgIElSUUZfU0FNUExFX1JBTkRPTSB8IElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKIAkJCSAgbHAtPnR4X2lycV9uYW1lLCBscCk7CiAJaWYgKGVycikgewogCQlmcmVlX2lycShscC0+Y2ZnLnJ4X2lycSwgbHApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDJkNmExYjEuLmZhNTkzNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTU2LDcgKzU2LDggQEAKIAlzdHJ1Y3QgcGVyZl9ldmVudAkqZXZlbnRzW01BWF9IV0VWRU5UU107CiAJdW5zaWduZWQgbG9uZwkJdXNlZF9tYXNrW0JJVFNfVE9fTE9OR1MoTUFYX0hXRVZFTlRTKV07CiAJdW5zaWduZWQgbG9uZwkJYWN0aXZlX21hc2tbQklUU19UT19MT05HUyhNQVhfSFdFVkVOVFMpXTsKLQlpbnQgZW5hYmxlZDsKKwl1NjQJCQlwY3I7CisJaW50CQkJZW5hYmxlZDsKIH07CiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X2h3X2V2ZW50cywgY3B1X2h3X2V2ZW50cykgPSB7IC5lbmFibGVkID0gMSwgfTsKIApAQCAtNjgsOCArNjksMzAgQEAKICNkZWZpbmUgUElDX0xPV0VSCTB4MDIKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmZfZXZlbnRfZW5jb2RlKGNvbnN0IHN0cnVjdCBwZXJmX2V2ZW50X21hcCAqcG1hcCkKK3sKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKSBwbWFwLT5lbmNvZGluZyA8PCAxNikgfCBwbWFwLT5waWNfbWFzazsKK30KKworc3RhdGljIHZvaWQgcGVyZl9ldmVudF9kZWNvZGUodW5zaWduZWQgbG9uZyB2YWwsIHUxNiAqZW5jLCB1OCAqbXNrKQoreworCSptc2sgPSB2YWwgJiAweGZmOworCSplbmMgPSB2YWwgPj4gMTY7Cit9CisKKyNkZWZpbmUgQyh4KSBQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjeAorCisjZGVmaW5lIENBQ0hFX09QX1VOU1VQUE9SVEVECTB4ZmZmZQorI2RlZmluZSBDQUNIRV9PUF9OT05TRU5TRQkweGZmZmYKKwordHlwZWRlZiBzdHJ1Y3QgcGVyZl9ldmVudF9tYXAgY2FjaGVfbWFwX3QKKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdOworCiBzdHJ1Y3Qgc3BhcmNfcG11IHsKIAljb25zdCBzdHJ1Y3QgcGVyZl9ldmVudF9tYXAJKigqZXZlbnRfbWFwKShpbnQpOworCWNvbnN0IGNhY2hlX21hcF90CQkqY2FjaGVfbWFwOwogCWludAkJCQltYXhfZXZlbnRzOwogCWludAkJCQl1cHBlcl9zaGlmdDsKIAlpbnQJCQkJbG93ZXJfc2hpZnQ7CkBAIC04MCwyMSArMTAzLDEwOSBAQAogCWludAkJCQlsb3dlcl9ub3A7CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBlcmZfZXZlbnRfbWFwIHVsdHJhM2lfcGVyZm1vbl9ldmVudF9tYXBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGVyZl9ldmVudF9tYXAgdWx0cmEzX3BlcmZtb25fZXZlbnRfbWFwW10gPSB7CiAJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10gPSB7IDB4MDAwMCwgUElDX1VQUEVSIHwgUElDX0xPV0VSIH0sCiAJW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXSA9IHsgMHgwMDAxLCBQSUNfVVBQRVIgfCBQSUNfTE9XRVIgfSwKIAlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXSA9IHsgMHgwMDA5LCBQSUNfTE9XRVIgfSwKIAlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdID0geyAweDAwMDksIFBJQ19VUFBFUiB9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwZXJmX2V2ZW50X21hcCAqdWx0cmEzaV9ldmVudF9tYXAoaW50IGV2ZW50X2lkKQorc3RhdGljIGNvbnN0IHN0cnVjdCBwZXJmX2V2ZW50X21hcCAqdWx0cmEzX2V2ZW50X21hcChpbnQgZXZlbnRfaWQpCiB7Ci0JcmV0dXJuICZ1bHRyYTNpX3BlcmZtb25fZXZlbnRfbWFwW2V2ZW50X2lkXTsKKwlyZXR1cm4gJnVsdHJhM19wZXJmbW9uX2V2ZW50X21hcFtldmVudF9pZF07CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfcG11IHVsdHJhM2lfcG11ID0gewotCS5ldmVudF9tYXAJPSB1bHRyYTNpX2V2ZW50X21hcCwKLQkubWF4X2V2ZW50cwk9IEFSUkFZX1NJWkUodWx0cmEzaV9wZXJmbW9uX2V2ZW50X21hcCksCitzdGF0aWMgY29uc3QgY2FjaGVfbWFwX3QgdWx0cmEzX2NhY2hlX21hcCA9IHsKK1tDKEwxRCldID0geworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyAweDA5LCBQSUNfTE9XRVIsIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MDksIFBJQ19VUFBFUiwgfSwKKwl9LAorCVtDKE9QX1dSSVRFKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgMHgwYSwgUElDX0xPV0VSIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MGEsIFBJQ19VUFBFUiB9LAorCX0sCisJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCit9LAorW0MoTDFJKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IDB4MDksIFBJQ19MT1dFUiwgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgMHgwOSwgUElDX1VQUEVSLCB9LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfTk9OU0VOU0UgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX05PTlNFTlNFIH0sCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorfSwKK1tDKExMKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IDB4MGMsIFBJQ19MT1dFUiwgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgMHgwYywgUElDX1VQUEVSLCB9LAorCX0sCisJW0MoT1BfV1JJVEUpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyAweDBjLCBQSUNfTE9XRVIgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgMHgwYywgUElDX1VQUEVSIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKK30sCitbQyhEVExCKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MTIsIFBJQ19VUFBFUiwgfSwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKK30sCitbQyhJVExCKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MTEsIFBJQ19VUFBFUiwgfSwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKK30sCitbQyhCUFUpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKK30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJjX3BtdSB1bHRyYTNfcG11ID0geworCS5ldmVudF9tYXAJPSB1bHRyYTNfZXZlbnRfbWFwLAorCS5jYWNoZV9tYXAJPSAmdWx0cmEzX2NhY2hlX21hcCwKKwkubWF4X2V2ZW50cwk9IEFSUkFZX1NJWkUodWx0cmEzX3BlcmZtb25fZXZlbnRfbWFwKSwKIAkudXBwZXJfc2hpZnQJPSAxMSwKIAkubG93ZXJfc2hpZnQJPSA0LAogCS5ldmVudF9tYXNrCT0gMHgzZiwKQEAgLTEwMiw2ICsyMTMsMTIxIEBACiAJLmxvd2VyX25vcAk9IDB4MTQsCiB9OwogCisvKiBOaWFnYXJhMSBpcyB2ZXJ5IGxpbWl0ZWQuICBUaGUgdXBwZXIgUElDIGlzIGhhcmQtbG9ja2VkIHRvIGNvdW50CisgKiBvbmx5IGluc3RydWN0aW9ucywgc28gaXQgaXMgZnJlZSBydW5uaW5nIHdoaWNoIGNyZWF0ZXMgYWxsIGtpbmRzIG9mCisgKiBwcm9ibGVtcy4gIFNvbWUgaGFyZHdhcmUgZGVzaWducyBtYWtlIG9uZSB3b25kZXIgaWYgdGhlIGNyZWF0b3IKKyAqIGV2ZW4gbG9va2VkIGF0IGhvdyB0aGlzIHN0dWZmIGdldHMgdXNlZCBieSBzb2Z0d2FyZS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwZXJmX2V2ZW50X21hcCBuaWFnYXJhMV9wZXJmbW9uX2V2ZW50X21hcFtdID0geworCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdID0geyAweDAwLCBQSUNfVVBQRVIgfSwKKwlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdID0geyAweDAwLCBQSUNfVVBQRVIgfSwKKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXSA9IHsgMCwgUElDX05PTkUgfSwKKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdID0geyAweDAzLCBQSUNfTE9XRVIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGVyZl9ldmVudF9tYXAgKm5pYWdhcmExX2V2ZW50X21hcChpbnQgZXZlbnRfaWQpCit7CisJcmV0dXJuICZuaWFnYXJhMV9wZXJmbW9uX2V2ZW50X21hcFtldmVudF9pZF07Cit9CisKK3N0YXRpYyBjb25zdCBjYWNoZV9tYXBfdCBuaWFnYXJhMV9jYWNoZV9tYXAgPSB7CitbQyhMMUQpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgMHgwMywgUElDX0xPV0VSLCB9LAorCX0sCisJW0MoT1BfV1JJVEUpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldID0geyAweDAzLCBQSUNfTE9XRVIsIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKK30sCitbQyhMMUkpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgMHgwMCwgUElDX1VQUEVSIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MDIsIFBJQ19MT1dFUiwgfSwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSB7IENBQ0hFX09QX05PTlNFTlNFIH0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9OT05TRU5TRSB9LAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKK30sCitbQyhMTCldID0geworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldID0geyAweDA3LCBQSUNfTE9XRVIsIH0sCisJfSwKKwlbQyhPUF9XUklURSldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MDcsIFBJQ19MT1dFUiwgfSwKKwl9LAorCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorfSwKK1tDKERUTEIpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgMHgwNSwgUElDX0xPV0VSLCB9LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorfSwKK1tDKElUTEIpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgMHgwNCwgUElDX0xPV0VSLCB9LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorfSwKK1tDKEJQVSldID0geworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfcG11IG5pYWdhcmExX3BtdSA9IHsKKwkuZXZlbnRfbWFwCT0gbmlhZ2FyYTFfZXZlbnRfbWFwLAorCS5jYWNoZV9tYXAJPSAmbmlhZ2FyYTFfY2FjaGVfbWFwLAorCS5tYXhfZXZlbnRzCT0gQVJSQVlfU0laRShuaWFnYXJhMV9wZXJmbW9uX2V2ZW50X21hcCksCisJLnVwcGVyX3NoaWZ0CT0gMCwKKwkubG93ZXJfc2hpZnQJPSA0LAorCS5ldmVudF9tYXNrCT0gMHg3LAorCS51cHBlcl9ub3AJPSAweDAsCisJLmxvd2VyX25vcAk9IDB4MCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGVyZl9ldmVudF9tYXAgbmlhZ2FyYTJfcGVyZm1vbl9ldmVudF9tYXBbXSA9IHsKIAlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXSA9IHsgMHgwMmZmLCBQSUNfVVBQRVIgfCBQSUNfTE9XRVIgfSwKIAlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdID0geyAweDAyZmYsIFBJQ19VUFBFUiB8IFBJQ19MT1dFUiB9LApAQCAtMTE2LDE0ICszNDIsMTAyIEBACiAJcmV0dXJuICZuaWFnYXJhMl9wZXJmbW9uX2V2ZW50X21hcFtldmVudF9pZF07CiB9CiAKK3N0YXRpYyBjb25zdCBjYWNoZV9tYXBfdCBuaWFnYXJhMl9jYWNoZV9tYXAgPSB7CitbQyhMMUQpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgMHgwMjA4LCBQSUNfVVBQRVIgfCBQSUNfTE9XRVIsIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MDMwMiwgUElDX1VQUEVSIHwgUElDX0xPV0VSLCB9LAorCX0sCisJW0MoT1BfV1JJVEUpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyAweDAyMTAsIFBJQ19VUFBFUiB8IFBJQ19MT1dFUiwgfSwKKwkJW0MoUkVTVUxUX01JU1MpXSA9IHsgMHgwMzAyLCBQSUNfVVBQRVIgfCBQSUNfTE9XRVIsIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKK30sCitbQyhMMUkpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgMHgwMmZmLCBQSUNfVVBQRVIgfCBQSUNfTE9XRVIsIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MDMwMSwgUElDX1VQUEVSIHwgUElDX0xPV0VSLCB9LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfTk9OU0VOU0UgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX05PTlNFTlNFIH0sCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorfSwKK1tDKExMKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IDB4MDIwOCwgUElDX1VQUEVSIHwgUElDX0xPV0VSLCB9LAorCQlbQyhSRVNVTFRfTUlTUyldID0geyAweDAzMzAsIFBJQ19VUFBFUiB8IFBJQ19MT1dFUiwgfSwKKwl9LAorCVtDKE9QX1dSSVRFKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgMHgwMjEwLCBQSUNfVVBQRVIgfCBQSUNfTE9XRVIsIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4MDMyMCwgUElDX1VQUEVSIHwgUElDX0xPV0VSLCB9LAorCX0sCisJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCit9LAorW0MoRFRMQildID0geworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldID0geyAweDBiMDgsIFBJQ19VUFBFUiB8IFBJQ19MT1dFUiwgfSwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKK30sCitbQyhJVExCKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IDB4YjA0LCBQSUNfVVBQRVIgfCBQSUNfTE9XRVIsIH0sCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCit9LAorW0MoQlBVKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCit9LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyY19wbXUgbmlhZ2FyYTJfcG11ID0gewogCS5ldmVudF9tYXAJPSBuaWFnYXJhMl9ldmVudF9tYXAsCisJLmNhY2hlX21hcAk9ICZuaWFnYXJhMl9jYWNoZV9tYXAsCiAJLm1heF9ldmVudHMJPSBBUlJBWV9TSVpFKG5pYWdhcmEyX3BlcmZtb25fZXZlbnRfbWFwKSwKIAkudXBwZXJfc2hpZnQJPSAxOSwKIAkubG93ZXJfc2hpZnQJPSA2LAogCS5ldmVudF9tYXNrCT0gMHhmZmYsCiAJLmh2X2JpdAkJPSAweDgsCi0JLmlycV9iaXQJPSAweDAzLAorCS5pcnFfYml0CT0gMHgzMCwKIAkudXBwZXJfbm9wCT0gMHgyMjAsCiAJLmxvd2VyX25vcAk9IDB4MjIwLAogfTsKQEAgLTE1MSwyMyArNDY1LDMwIEBACiAJCQkgICAgICBzcGFyY19wbXUtPmxvd2VyX25vcCwgaWR4KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNwYXJjX3BtdV9lbmFibGVfZXZlbnQoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywKLQkJCQkJICAgIGludCBpZHgpCitzdGF0aWMgaW5saW5lIHZvaWQgc3BhcmNfcG11X2VuYWJsZV9ldmVudChzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1Yywgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywgaW50IGlkeCkKIHsKIAl1NjQgdmFsLCBtYXNrID0gbWFza19mb3JfaW5kZXgoaWR4KTsKIAotCXZhbCA9IHBjcl9vcHMtPnJlYWQoKTsKLQlwY3Jfb3BzLT53cml0ZSgodmFsICYgfm1hc2spIHwgaHdjLT5jb25maWcpOworCXZhbCA9IGNwdWMtPnBjcjsKKwl2YWwgJj0gfm1hc2s7CisJdmFsIHw9IGh3Yy0+Y29uZmlnOworCWNwdWMtPnBjciA9IHZhbDsKKworCXBjcl9vcHMtPndyaXRlKGNwdWMtPnBjcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGFyY19wbXVfZGlzYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAotCQkJCQkgICAgIGludCBpZHgpCitzdGF0aWMgaW5saW5lIHZvaWQgc3BhcmNfcG11X2Rpc2FibGVfZXZlbnQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCiB7CiAJdTY0IG1hc2sgPSBtYXNrX2Zvcl9pbmRleChpZHgpOwogCXU2NCBub3AgPSBub3BfZm9yX2luZGV4KGlkeCk7Ci0JdTY0IHZhbCA9IHBjcl9vcHMtPnJlYWQoKTsKKwl1NjQgdmFsOwogCi0JcGNyX29wcy0+d3JpdGUoKHZhbCAmIH5tYXNrKSB8IG5vcCk7CisJdmFsID0gY3B1Yy0+cGNyOworCXZhbCAmPSB+bWFzazsKKwl2YWwgfD0gbm9wOworCWNwdWMtPnBjciA9IHZhbDsKKworCXBjcl9vcHMtPndyaXRlKGNwdWMtPnBjcik7CiB9CiAKIHZvaWQgaHdfcGVyZl9lbmFibGUodm9pZCkKQEAgLTE4Miw3ICs1MDMsNyBAQAogCWNwdWMtPmVuYWJsZWQgPSAxOwogCWJhcnJpZXIoKTsKIAotCXZhbCA9IHBjcl9vcHMtPnJlYWQoKTsKKwl2YWwgPSBjcHVjLT5wY3I7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXRVZFTlRTOyBpKyspIHsKIAkJc3RydWN0IHBlcmZfZXZlbnQgKmNwID0gY3B1Yy0+ZXZlbnRzW2ldOwpAQCAtMTk0LDcgKzUxNSw5IEBACiAJCXZhbCB8PSBod2MtPmNvbmZpZ19iYXNlOwogCX0KIAotCXBjcl9vcHMtPndyaXRlKHZhbCk7CisJY3B1Yy0+cGNyID0gdmFsOworCisJcGNyX29wcy0+d3JpdGUoY3B1Yy0+cGNyKTsKIH0KIAogdm9pZCBod19wZXJmX2Rpc2FibGUodm9pZCkKQEAgLTIwNywxMCArNTMwLDEyIEBACiAKIAljcHVjLT5lbmFibGVkID0gMDsKIAotCXZhbCA9IHBjcl9vcHMtPnJlYWQoKTsKKwl2YWwgPSBjcHVjLT5wY3I7CiAJdmFsICY9IH4oUENSX1VUUkFDRSB8IFBDUl9TVFJBQ0UgfAogCQkgc3BhcmNfcG11LT5odl9iaXQgfCBzcGFyY19wbXUtPmlycV9iaXQpOwotCXBjcl9vcHMtPndyaXRlKHZhbCk7CisJY3B1Yy0+cGNyID0gdmFsOworCisJcGNyX29wcy0+d3JpdGUoY3B1Yy0+cGNyKTsKIH0KIAogc3RhdGljIHUzMiByZWFkX3BtYyhpbnQgaWR4KQpAQCAtMjQyLDcgKzU2Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgc3BhcmNfcGVyZl9ldmVudF9zZXRfcGVyaW9kKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKLQkJCQkJIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCisJCQkJICAgICAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCiB7CiAJczY0IGxlZnQgPSBhdG9taWM2NF9yZWFkKCZod2MtPnBlcmlvZF9sZWZ0KTsKIAlzNjQgcGVyaW9kID0gaHdjLT5zYW1wbGVfcGVyaW9kOwpAQCAtMjgyLDE5ICs2MDcsMTkgQEAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzaykpCiAJCXJldHVybiAtRUFHQUlOOwogCi0Jc3BhcmNfcG11X2Rpc2FibGVfZXZlbnQoaHdjLCBpZHgpOworCXNwYXJjX3BtdV9kaXNhYmxlX2V2ZW50KGNwdWMsIGh3YywgaWR4KTsKIAogCWNwdWMtPmV2ZW50c1tpZHhdID0gZXZlbnQ7CiAJc2V0X2JpdChpZHgsIGNwdWMtPmFjdGl2ZV9tYXNrKTsKIAogCXNwYXJjX3BlcmZfZXZlbnRfc2V0X3BlcmlvZChldmVudCwgaHdjLCBpZHgpOwotCXNwYXJjX3BtdV9lbmFibGVfZXZlbnQoaHdjLCBpZHgpOworCXNwYXJjX3BtdV9lbmFibGVfZXZlbnQoY3B1YywgaHdjLCBpZHgpOwogCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHU2NCBzcGFyY19wZXJmX2V2ZW50X3VwZGF0ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkJICAgICBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLCBpbnQgaWR4KQorCQkJCSAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCiB7CiAJaW50IHNoaWZ0ID0gNjQgLSAzMjsKIAl1NjQgcHJldl9yYXdfY291bnQsIG5ld19yYXdfY291bnQ7CkBAIC0zMjQsNyArNjQ5LDcgQEAKIAlpbnQgaWR4ID0gaHdjLT5pZHg7CiAKIAljbGVhcl9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzayk7Ci0Jc3BhcmNfcG11X2Rpc2FibGVfZXZlbnQoaHdjLCBpZHgpOworCXNwYXJjX3BtdV9kaXNhYmxlX2V2ZW50KGNwdWMsIGh3YywgaWR4KTsKIAogCWJhcnJpZXIoKTsKIApAQCAtMzM4LDE4ICs2NjMsMjkgQEAKIHN0YXRpYyB2b2lkIHNwYXJjX3BtdV9yZWFkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwogCXNwYXJjX3BlcmZfZXZlbnRfdXBkYXRlKGV2ZW50LCBod2MsIGh3Yy0+aWR4KTsKIH0KIAogc3RhdGljIHZvaWQgc3BhcmNfcG11X3VudGhyb3R0bGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0Jc3BhcmNfcG11X2VuYWJsZV9ldmVudChod2MsIGh3Yy0+aWR4KTsKKworCXNwYXJjX3BtdV9lbmFibGVfZXZlbnQoY3B1YywgaHdjLCBod2MtPmlkeCk7CiB9CiAKIHN0YXRpYyBhdG9taWNfdCBhY3RpdmVfZXZlbnRzID0gQVRPTUlDX0lOSVQoMCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHBtY19ncmFiX211dGV4KTsKIAorc3RhdGljIHZvaWQgcGVyZl9zdG9wX25taV93YXRjaGRvZyh2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKKworCXN0b3Bfbm1pX3dhdGNoZG9nKE5VTEwpOworCWNwdWMtPnBjciA9IHBjcl9vcHMtPnJlYWQoKTsKK30KKwogdm9pZCBwZXJmX2V2ZW50X2dyYWJfcG1jKHZvaWQpCiB7CiAJaWYgKGF0b21pY19pbmNfbm90X3plcm8oJmFjdGl2ZV9ldmVudHMpKQpAQCAtMzU4LDcgKzY5NCw3IEBACiAJbXV0ZXhfbG9jaygmcG1jX2dyYWJfbXV0ZXgpOwogCWlmIChhdG9taWNfcmVhZCgmYWN0aXZlX2V2ZW50cykgPT0gMCkgewogCQlpZiAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpID4gMCkgewotCQkJb25fZWFjaF9jcHUoc3RvcF9ubWlfd2F0Y2hkb2csIE5VTEwsIDEpOworCQkJb25fZWFjaF9jcHUocGVyZl9zdG9wX25taV93YXRjaGRvZywgTlVMTCwgMSk7CiAJCQlCVUdfT04oYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpICE9IDApOwogCQl9CiAJCWF0b21pY19pbmMoJmFjdGl2ZV9ldmVudHMpOwpAQCAtMzc1LDMwICs3MTEsMTYwIEBACiAJfQogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBlcmZfZXZlbnRfbWFwICpzcGFyY19tYXBfY2FjaGVfZXZlbnQodTY0IGNvbmZpZykKK3sKKwl1bnNpZ25lZCBpbnQgY2FjaGVfdHlwZSwgY2FjaGVfb3AsIGNhY2hlX3Jlc3VsdDsKKwljb25zdCBzdHJ1Y3QgcGVyZl9ldmVudF9tYXAgKnBtYXA7CisKKwlpZiAoIXNwYXJjX3BtdS0+Y2FjaGVfbWFwKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCWNhY2hlX3R5cGUgPSAoY29uZmlnID4+ICAwKSAmIDB4ZmY7CisJaWYgKGNhY2hlX3R5cGUgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9NQVgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJY2FjaGVfb3AgPSAoY29uZmlnID4+ICA4KSAmIDB4ZmY7CisJaWYgKGNhY2hlX29wID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWNhY2hlX3Jlc3VsdCA9IChjb25maWcgPj4gMTYpICYgMHhmZjsKKwlpZiAoY2FjaGVfcmVzdWx0ID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlwbWFwID0gJigoKnNwYXJjX3BtdS0+Y2FjaGVfbWFwKVtjYWNoZV90eXBlXVtjYWNoZV9vcF1bY2FjaGVfcmVzdWx0XSk7CisKKwlpZiAocG1hcC0+ZW5jb2RpbmcgPT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJaWYgKHBtYXAtPmVuY29kaW5nID09IENBQ0hFX09QX05PTlNFTlNFKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXJldHVybiBwbWFwOworfQorCiBzdGF0aWMgdm9pZCBod19wZXJmX2V2ZW50X2Rlc3Ryb3koc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXBlcmZfZXZlbnRfcmVsZWFzZV9wbWMoKTsKIH0KIAorLyogTWFrZSBzdXJlIGFsbCBldmVudHMgY2FuIGJlIHNjaGVkdWxlZCBpbnRvIHRoZSBoYXJkd2FyZSBhdAorICogdGhlIHNhbWUgdGltZS4gIFRoaXMgaXMgc2ltcGxpZmllZCBieSB0aGUgZmFjdCB0aGF0IHdlIG9ubHkKKyAqIG5lZWQgdG8gc3VwcG9ydCAyIHNpbXVsdGFuZW91cyBIVyBldmVudHMuCisgKi8KK3N0YXRpYyBpbnQgc3BhcmNfY2hlY2tfY29uc3RyYWludHModW5zaWduZWQgbG9uZyAqZXZlbnRzLCBpbnQgbl9ldikKK3sKKwlpZiAobl9ldiA8PSBwZXJmX21heF9ldmVudHMpIHsKKwkJdTggbXNrMSwgbXNrMjsKKwkJdTE2IGR1bW15OworCisJCWlmIChuX2V2ID09IDEpCisJCQlyZXR1cm4gMDsKKwkJQlVHX09OKG5fZXYgIT0gMik7CisJCXBlcmZfZXZlbnRfZGVjb2RlKGV2ZW50c1swXSwgJmR1bW15LCAmbXNrMSk7CisJCXBlcmZfZXZlbnRfZGVjb2RlKGV2ZW50c1sxXSwgJmR1bW15LCAmbXNrMik7CisKKwkJLyogSWYgYm90aCBldmVudHMgY2FuIGdvIG9uIGFueSBjb3VudGVyLCBPSy4gICovCisJCWlmIChtc2sxID09IChQSUNfVVBQRVIgfCBQSUNfTE9XRVIpICYmCisJCSAgICBtc2syID09IChQSUNfVVBQRVIgfCBQSUNfTE9XRVIpKQorCQkJcmV0dXJuIDA7CisKKwkJLyogSWYgb25lIGV2ZW50IGlzIGxpbWl0ZWQgdG8gYSBzcGVjaWZpYyBjb3VudGVyLAorCQkgKiBhbmQgdGhlIG90aGVyIGNhbiBnbyBvbiBib3RoLCBPSy4KKwkJICovCisJCWlmICgobXNrMSA9PSBQSUNfVVBQRVIgfHwgbXNrMSA9PSBQSUNfTE9XRVIpICYmCisJCSAgICBtc2syID09IChQSUNfVVBQRVIgfCBQSUNfTE9XRVIpKQorCQkJcmV0dXJuIDA7CisJCWlmICgobXNrMiA9PSBQSUNfVVBQRVIgfHwgbXNrMiA9PSBQSUNfTE9XRVIpICYmCisJCSAgICBtc2sxID09IChQSUNfVVBQRVIgfCBQSUNfTE9XRVIpKQorCQkJcmV0dXJuIDA7CisKKwkJLyogSWYgdGhlIGV2ZW50cyBhcmUgZml4ZWQgdG8gZGlmZmVyZW50IGNvdW50ZXJzLCBPSy4gICovCisJCWlmICgobXNrMSA9PSBQSUNfVVBQRVIgJiYgbXNrMiA9PSBQSUNfTE9XRVIpIHx8CisJCSAgICAobXNrMSA9PSBQSUNfTE9XRVIgJiYgbXNrMiA9PSBQSUNfVVBQRVIpKQorCQkJcmV0dXJuIDA7CisKKwkJLyogT3RoZXJ3aXNlLCB0aGVyZSBpcyBhIGNvbmZsaWN0LiAgKi8KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZXhjbHVkZXMoc3RydWN0IHBlcmZfZXZlbnQgKipldnRzLCBpbnQgbl9wcmV2LCBpbnQgbl9uZXcpCit7CisJaW50IGV1ID0gMCwgZWsgPSAwLCBlaCA9IDA7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OworCWludCBpLCBuLCBmaXJzdDsKKworCW4gPSBuX3ByZXYgKyBuX25ldzsKKwlpZiAobiA8PSAxKQorCQlyZXR1cm4gMDsKKworCWZpcnN0ID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWV2ZW50ID0gZXZ0c1tpXTsKKwkJaWYgKGZpcnN0KSB7CisJCQlldSA9IGV2ZW50LT5hdHRyLmV4Y2x1ZGVfdXNlcjsKKwkJCWVrID0gZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWw7CisJCQllaCA9IGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaHY7CisJCQlmaXJzdCA9IDA7CisJCX0gZWxzZSBpZiAoZXZlbnQtPmF0dHIuZXhjbHVkZV91c2VyICE9IGV1IHx8CisJCQkgICBldmVudC0+YXR0ci5leGNsdWRlX2tlcm5lbCAhPSBlayB8fAorCQkJICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9odiAhPSBlaCkgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2xsZWN0X2V2ZW50cyhzdHJ1Y3QgcGVyZl9ldmVudCAqZ3JvdXAsIGludCBtYXhfY291bnQsCisJCQkgIHN0cnVjdCBwZXJmX2V2ZW50ICpldnRzW10sIHVuc2lnbmVkIGxvbmcgKmV2ZW50cykKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQ7CisJaW50IG4gPSAwOworCisJaWYgKCFpc19zb2Z0d2FyZV9ldmVudChncm91cCkpIHsKKwkJaWYgKG4gPj0gbWF4X2NvdW50KQorCQkJcmV0dXJuIC0xOworCQlldnRzW25dID0gZ3JvdXA7CisJCWV2ZW50c1tuKytdID0gZ3JvdXAtPmh3LmV2ZW50X2Jhc2U7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZncm91cC0+c2libGluZ19saXN0LCBncm91cF9lbnRyeSkgeworCQlpZiAoIWlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSAmJgorCQkgICAgZXZlbnQtPnN0YXRlICE9IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKSB7CisJCQlpZiAobiA+PSBtYXhfY291bnQpCisJCQkJcmV0dXJuIC0xOworCQkJZXZ0c1tuXSA9IGV2ZW50OworCQkJZXZlbnRzW24rK10gPSBldmVudC0+aHcuZXZlbnRfYmFzZTsKKwkJfQorCX0KKwlyZXR1cm4gbjsKK30KKwogc3RhdGljIGludCBfX2h3X3BlcmZfZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZldmVudC0+YXR0cjsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZ0c1tNQVhfSFdFVkVOVFNdOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCXVuc2lnbmVkIGxvbmcgZXZlbnRzW01BWF9IV0VWRU5UU107CiAJY29uc3Qgc3RydWN0IHBlcmZfZXZlbnRfbWFwICpwbWFwOwogCXU2NCBlbmM7CisJaW50IG47CiAKIAlpZiAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpIDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoYXR0ci0+dHlwZSAhPSBQRVJGX1RZUEVfSEFSRFdBUkUpCisJaWYgKGF0dHItPnR5cGUgPT0gUEVSRl9UWVBFX0hBUkRXQVJFKSB7CisJCWlmIChhdHRyLT5jb25maWcgPj0gc3BhcmNfcG11LT5tYXhfZXZlbnRzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXBtYXAgPSBzcGFyY19wbXUtPmV2ZW50X21hcChhdHRyLT5jb25maWcpOworCX0gZWxzZSBpZiAoYXR0ci0+dHlwZSA9PSBQRVJGX1RZUEVfSFdfQ0FDSEUpIHsKKwkJcG1hcCA9IHNwYXJjX21hcF9jYWNoZV9ldmVudChhdHRyLT5jb25maWcpOworCQlpZiAoSVNfRVJSKHBtYXApKQorCQkJcmV0dXJuIFBUUl9FUlIocG1hcCk7CisJfSBlbHNlCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmIChhdHRyLT5jb25maWcgPj0gc3BhcmNfcG11LT5tYXhfZXZlbnRzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBlcmZfZXZlbnRfZ3JhYl9wbWMoKTsKLQlldmVudC0+ZGVzdHJveSA9IGh3X3BlcmZfZXZlbnRfZGVzdHJveTsKLQogCS8qIFdlIHNhdmUgdGhlIGVuYWJsZSBiaXRzIGluIHRoZSBjb25maWdfYmFzZS4gIFNvIHRvCiAJICogdHVybiBvZmYgc2FtcGxpbmcganVzdCB3cml0ZSAnY29uZmlnJywgYW5kIHRvIGVuYWJsZQogCSAqIHRoaW5ncyB3cml0ZSAnY29uZmlnIHwgY29uZmlnX2Jhc2UnLgpAQCAtNDExLDE1ICs4NzcsMzkgQEAKIAlpZiAoIWF0dHItPmV4Y2x1ZGVfaHYpCiAJCWh3Yy0+Y29uZmlnX2Jhc2UgfD0gc3BhcmNfcG11LT5odl9iaXQ7CiAKKwlod2MtPmV2ZW50X2Jhc2UgPSBwZXJmX2V2ZW50X2VuY29kZShwbWFwKTsKKworCWVuYyA9IHBtYXAtPmVuY29kaW5nOworCisJbiA9IDA7CisJaWYgKGV2ZW50LT5ncm91cF9sZWFkZXIgIT0gZXZlbnQpIHsKKwkJbiA9IGNvbGxlY3RfZXZlbnRzKGV2ZW50LT5ncm91cF9sZWFkZXIsCisJCQkJICAgcGVyZl9tYXhfZXZlbnRzIC0gMSwKKwkJCQkgICBldnRzLCBldmVudHMpOworCQlpZiAobiA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXZlbnRzW25dID0gaHdjLT5ldmVudF9iYXNlOworCWV2dHNbbl0gPSBldmVudDsKKworCWlmIChjaGVja19leGNsdWRlcyhldnRzLCBuLCAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3BhcmNfY2hlY2tfY29uc3RyYWludHMoZXZlbnRzLCBuICsgMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVHJ5IHRvIGRvIGFsbCBlcnJvciBjaGVja2luZyBiZWZvcmUgdGhpcyBwb2ludCwgYXMgdW53aW5kaW5nCisJICogc3RhdGUgYWZ0ZXIgZ3JhYmJpbmcgdGhlIFBNQyBpcyBkaWZmaWN1bHQuCisJICovCisJcGVyZl9ldmVudF9ncmFiX3BtYygpOworCWV2ZW50LT5kZXN0cm95ID0gaHdfcGVyZl9ldmVudF9kZXN0cm95OworCiAJaWYgKCFod2MtPnNhbXBsZV9wZXJpb2QpIHsKIAkJaHdjLT5zYW1wbGVfcGVyaW9kID0gTUFYX1BFUklPRDsKIAkJaHdjLT5sYXN0X3BlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKIAkJYXRvbWljNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBod2MtPnNhbXBsZV9wZXJpb2QpOwogCX0KIAotCXBtYXAgPSBzcGFyY19wbXUtPmV2ZW50X21hcChhdHRyLT5jb25maWcpOwotCi0JZW5jID0gcG1hcC0+ZW5jb2Rpbmc7CiAJaWYgKHBtYXAtPnBpY19tYXNrICYgUElDX1VQUEVSKSB7CiAJCWh3Yy0+aWR4ID0gUElDX1VQUEVSX0lOREVYOwogCQllbmMgPDw9IHNwYXJjX3BtdS0+dXBwZXJfc2hpZnQ7CkBAIC00NzIsNyArOTYyLDcgQEAKIH0KIAogc3RhdGljIGludCBfX2twcm9iZXMgcGVyZl9ldmVudF9ubWlfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICpfX2FyZ3MpCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqX19hcmdzKQogewogCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IF9fYXJnczsKIAlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBkYXRhOwpAQCAtNTEzLDcgKzEwMDMsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDEsICZkYXRhLCByZWdzKSkKLQkJCXNwYXJjX3BtdV9kaXNhYmxlX2V2ZW50KGh3YywgaWR4KTsKKwkJCXNwYXJjX3BtdV9kaXNhYmxlX2V2ZW50KGNwdWMsIGh3YywgaWR4KTsKIAl9CiAKIAlyZXR1cm4gTk9USUZZX1NUT1A7CkBAIC01MjUsOCArMTAxNSwxNSBAQAogCiBzdGF0aWMgYm9vbCBfX2luaXQgc3VwcG9ydGVkX3BtdSh2b2lkKQogewotCWlmICghc3RyY21wKHNwYXJjX3BtdV90eXBlLCAidWx0cmEzaSIpKSB7Ci0JCXNwYXJjX3BtdSA9ICZ1bHRyYTNpX3BtdTsKKwlpZiAoIXN0cmNtcChzcGFyY19wbXVfdHlwZSwgInVsdHJhMyIpIHx8CisJICAgICFzdHJjbXAoc3BhcmNfcG11X3R5cGUsICJ1bHRyYTMrIikgfHwKKwkgICAgIXN0cmNtcChzcGFyY19wbXVfdHlwZSwgInVsdHJhM2kiKSB8fAorCSAgICAhc3RyY21wKHNwYXJjX3BtdV90eXBlLCAidWx0cmE0KyIpKSB7CisJCXNwYXJjX3BtdSA9ICZ1bHRyYTNfcG11OworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKCFzdHJjbXAoc3BhcmNfcG11X3R5cGUsICJuaWFnYXJhIikpIHsKKwkJc3BhcmNfcG11ID0gJm5pYWdhcmExX3BtdTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCWlmICghc3RyY21wKHNwYXJjX3BtdV90eXBlLCAibmlhZ2FyYTIiKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwppbmRleCBmZjY4MzczLi5hYTM2MjIzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwpAQCAtMTQyMCw3ICsxNDIwLDcgQEAKIAlmcmVlX2Jvb3RtZW0oX19wYShwdHIpLCBzaXplKTsKIH0KIAotc3RhdGljIGludCBwY3B1X2NwdV9kaXN0YW5jZSh1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IHRvKQorc3RhdGljIGludCBfX2luaXQgcGNwdV9jcHVfZGlzdGFuY2UodW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCB0bykKIHsKIAlpZiAoY3B1X3RvX25vZGUoZnJvbSkgPT0gY3B1X3RvX25vZGUodG8pKQogCQlyZXR1cm4gTE9DQUxfRElTVEFOQ0U7CkBAIC0xNDI4LDE4ICsxNDI4LDUzIEBACiAJCXJldHVybiBSRU1PVEVfRElTVEFOQ0U7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwY3B1X3BvcHVsYXRlX3B0ZSh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CisJaWYgKHB1ZF9ub25lKCpwdWQpKSB7CisJCXBtZF90ICpuZXc7CisKKwkJbmV3ID0gX19hbGxvY19ib290bWVtKFBBR0VfU0laRSwgUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworCQlwdWRfcG9wdWxhdGUoJmluaXRfbW0sIHB1ZCwgbmV3KTsKKwl9CisKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSkgeworCQlwdGVfdCAqbmV3OworCisJCW5ldyA9IF9fYWxsb2NfYm9vdG1lbShQQUdFX1NJWkUsIFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwkJcG1kX3BvcHVsYXRlX2tlcm5lbCgmaW5pdF9tbSwgcG1kLCBuZXcpOworCX0KK30KKwogdm9pZCBfX2luaXQgc2V0dXBfcGVyX2NwdV9hcmVhcyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZGVsdGE7CiAJdW5zaWduZWQgaW50IGNwdTsKLQlpbnQgcmM7CisJaW50IHJjID0gLUVJTlZBTDsKIAotCXJjID0gcGNwdV9lbWJlZF9maXJzdF9jaHVuayhQRVJDUFVfTU9EVUxFX1JFU0VSVkUsCi0JCQkJICAgIFBFUkNQVV9EWU5BTUlDX1JFU0VSVkUsIDQgPDwgMjAsCi0JCQkJICAgIHBjcHVfY3B1X2Rpc3RhbmNlLCBwY3B1X2FsbG9jX2Jvb3RtZW0sCi0JCQkJICAgIHBjcHVfZnJlZV9ib290bWVtKTsKLQlpZiAocmMpCi0JCXBhbmljKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBmaXJzdCBjaHVuayAoJWQpIiwgcmMpOworCWlmIChwY3B1X2Nob3Nlbl9mYyAhPSBQQ1BVX0ZDX1BBR0UpIHsKKwkJcmMgPSBwY3B1X2VtYmVkX2ZpcnN0X2NodW5rKFBFUkNQVV9NT0RVTEVfUkVTRVJWRSwKKwkJCQkJICAgIFBFUkNQVV9EWU5BTUlDX1JFU0VSVkUsIDQgPDwgMjAsCisJCQkJCSAgICBwY3B1X2NwdV9kaXN0YW5jZSwKKwkJCQkJICAgIHBjcHVfYWxsb2NfYm9vdG1lbSwKKwkJCQkJICAgIHBjcHVfZnJlZV9ib290bWVtKTsKKwkJaWYgKHJjKQorCQkJcHJfd2FybmluZygiUEVSQ1BVOiAlcyBhbGxvY2F0b3IgZmFpbGVkICglZCksICIKKwkJCQkgICAiZmFsbGluZyBiYWNrIHRvIHBhZ2Ugc2l6ZVxuIiwKKwkJCQkgICBwY3B1X2ZjX25hbWVzW3BjcHVfY2hvc2VuX2ZjXSwgcmMpOworCX0KKwlpZiAocmMgPCAwKQorCQlyYyA9IHBjcHVfcGFnZV9maXJzdF9jaHVuayhQRVJDUFVfTU9EVUxFX1JFU0VSVkUsCisJCQkJCSAgIHBjcHVfYWxsb2NfYm9vdG1lbSwKKwkJCQkJICAgcGNwdV9mcmVlX2Jvb3RtZW0sCisJCQkJCSAgIHBjcHVfcG9wdWxhdGVfcHRlKTsKKwlpZiAocmMgPCAwKQorCQlwYW5pYygiY2Fubm90IGluaXRpYWxpemUgcGVyY3B1IGFyZWEgKGVycj0lZCkiLCByYyk7CiAKIAlkZWx0YSA9ICh1bnNpZ25lZCBsb25nKXBjcHVfYmFzZV9hZGRyIC0gKHVuc2lnbmVkIGxvbmcpX19wZXJfY3B1X3N0YXJ0OwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYwppbmRleCBmNTAwMGE0Li4wNGUyOGIyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYzMyLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLmggYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLmgKaW5kZXggMTVjMmQ3NTIuLmE2M2M1ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuaAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLmgKQEAgLTMsMTAgKzMsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGFzbS91dHJhcC5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KIAorc3RydWN0IG5ld191dHNuYW1lOworCiBleHRlcm4gYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c19nZXRwYWdlc2l6ZSh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3BhcmNfYnJrKHVuc2lnbmVkIGxvbmcgYnJrKTsKIGV4dGVybiBhc21saW5rYWdlIGxvbmcgc3BhcmNfcGlwZShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2luaXRfNjQuYyBiL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCmluZGV4IGE3MGE1ZTEuLjE4ODZkMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwotCWlmIChwYWdlICYmIHBhZ2VfbWFwcGluZyhwYWdlKSkgeworCWlmIChwYWdlKSB7CiAJCXVuc2lnbmVkIGxvbmcgcGdfZmxhZ3M7CiAKIAkJcGdfZmxhZ3MgPSBwYWdlLT5mbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvb3Byb2ZpbGUvaW5pdC5jIGIvYXJjaC9zcGFyYy9vcHJvZmlsZS9pbml0LmMKaW5kZXggZjk3Y2I4Yi4uZjkwMjRiYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9vcHJvZmlsZS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYy9vcHJvZmlsZS9pbml0LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CS8qIGZvciBIWiAqLwogIAogI2lmZGVmIENPTkZJR19TUEFSQzY0CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUgYi9hcmNoL3VtL01ha2VmaWxlCmluZGV4IDA3MjhkZWYuLmZjNjMzZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vTWFrZWZpbGUKKysrIGIvYXJjaC91bS9NYWtlZmlsZQpAQCAtOTYsMTEgKzk2LDEwIEBACiAJJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3IsKSBcCiAJJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3ItYWxsLCkKIAotQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUiA/PSAyCi1TVEFDS19TSVpFIDo9ICQoc2hlbGwgZWNobyAkJFsgNDA5NiAqICgxIDw8ICQoQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikpIF0gKQotCi1DUFBGTEFHU192bWxpbnV4LmxkcyA9IC1VJChTVUJBUkNIKSAtRFNUQVJUPSQoU1RBUlQpIC1ERUxGX0FSQ0g9JChFTEZfQVJDSCkgXAotCS1ERUxGX0ZPUk1BVD0iJChFTEZfRk9STUFUKSIgLURLRVJORUxfU1RBQ0tfU0laRT0kKFNUQUNLX1NJWkUpCisjIE9wdGlvbnMgdXNlZCBieSBsaW5rZXIgc2NyaXB0CitleHBvcnQgTERTX1NUQVJUICAgICAgOj0gJChTVEFSVCkKK2V4cG9ydCBMRFNfRUxGX0FSQ0ggICA6PSAkKEVMRl9BUkNIKQorZXhwb3J0IExEU19FTEZfRk9STUFUIDo9ICQoRUxGX0ZPUk1BVCkKIAogIyBUaGUgd3JhcHBlcnMgd2lsbCBzZWxlY3Qgd2hldGhlciB1c2luZyAibWFsbG9jIiBvciB0aGUga2VybmVsIGFsbG9jYXRvci4KIExJTktfV1JBUFMgPSAtV2wsLS13cmFwLG1hbGxvYyAtV2wsLS13cmFwLGZyZWUgLVdsLC0td3JhcCxjYWxsb2MKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9saW5lLmMgYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCmluZGV4IDE0YTEwMmUuLmNmOGE5N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwpAQCAtNSw2ICs1LDcgQEAKIAogI2luY2x1ZGUgImxpbnV4L2lycXJldHVybi5oIgogI2luY2x1ZGUgImxpbnV4L2tkLmgiCisjaW5jbHVkZSAibGludXgvc2NoZWQuaCIKICNpbmNsdWRlICJjaGFuX2tlcm4uaCIKICNpbmNsdWRlICJpcnFfa2Vybi5oIgogI2luY2x1ZGUgImlycV91c2VyLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvcG9ydF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvcG9ydF9rZXJuLmMKaW5kZXggMTk5MzAwOC4uNGViYzhhMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3BvcnRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9wb3J0X2tlcm4uYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJsaW51eC9pbnRlcnJ1cHQuaCIKICNpbmNsdWRlICJsaW51eC9saXN0LmgiCiAjaW5jbHVkZSAibGludXgvbXV0ZXguaCIKKyNpbmNsdWRlICJsaW51eC93b3JrcXVldWUuaCIKICNpbmNsdWRlICJhc20vYXRvbWljLmgiCiAjaW5jbHVkZSAiaW5pdC5oIgogI2luY2x1ZGUgImlycV9rZXJuLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2NvbW1vbi5sZHMuUyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vY29tbW9uLmxkcy5TCmluZGV4IDM3ZWNjNTUuLmFjNTViOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vY29tbW9uLmxkcy5TCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vY29tbW9uLmxkcy5TCkBAIC0xNiwxMSArMTYsNyBAQAogCiAgIC4gPSBBTElHTig0MDk2KTsKICAgLm5vdGUgOiB7ICooLm5vdGUuKikgfQotICBfX2V4X3RhYmxlIDogewotCV9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0JKihfX2V4X3RhYmxlKQotCV9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLSAgfQorICBFWENFUFRJT05fVEFCTEUoMCkKIAogICBCVUdfVEFCTEUKIApAQCAtNDMsMjggKzM5LDE3IEBACiAgIH0KIAkKICAgLmluaXQuc2V0dXAgOiB7Ci0JX19zZXR1cF9zdGFydCA9IC47Ci0JKiguaW5pdC5zZXR1cCkKLQlfX3NldHVwX2VuZCA9IC47CisJSU5JVF9TRVRVUCgwKQogICB9CiAKLSAgLiA9IEFMSUdOKDMyKTsKLSAgLmRhdGEucGVyY3B1IDogewotCV9fcGVyX2NwdV9zdGFydCA9IC4gOwotCSooLmRhdGEucGVyY3B1KQotCV9fcGVyX2NwdV9lbmQgPSAuIDsKLSAgfQorICBQRVJDUFUoMzIpCiAJCiAgIC5pbml0Y2FsbC5pbml0IDogewotCV9faW5pdGNhbGxfc3RhcnQgPSAuOwotCUlOSVRDQUxMUwotCV9faW5pdGNhbGxfZW5kID0gLjsKKwlJTklUX0NBTExTCiAgIH0KIAogICAuY29uX2luaXRjYWxsLmluaXQgOiB7Ci0JX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotCSooLmNvbl9pbml0Y2FsbC5pbml0KQotCV9fY29uX2luaXRjYWxsX2VuZCA9IC47CisJQ09OX0lOSVRDQUxMCiAgIH0KIAogICAudW1sLmluaXRjYWxsLmluaXQgOiB7CkBAIC0xMTgsOCArMTAzLDYgQEAKIAogICAgLiA9IEFMSUdOKDQwOTYpOwogICAuaW5pdC5yYW1mcyA6IHsKLQlfX2luaXRyYW1mc19zdGFydCA9IC47Ci0JKiguaW5pdC5yYW1mcykKLQlfX2luaXRyYW1mc19lbmQgPSAuOworCUlOSVRfUkFNX0ZTCiAgIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IDU0ZjQyZTguLjM0ZDgxMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTM1LDggKzM1LDggQEAKIAl1bnNpZ25lZCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlpZihwcmV2ICE9IG5leHQpewotCQljcHVfY2xlYXIoY3B1LCBwcmV2LT5jcHVfdm1fbWFzayk7Ci0JCWNwdV9zZXQoY3B1LCBuZXh0LT5jcHVfdm1fbWFzayk7CisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbW1fY3B1bWFzayhwcmV2KSk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1tX2NwdW1hc2sobmV4dCkpOwogCQlpZihuZXh0ICE9ICZpbml0X21tKQogCQkJX19zd2l0Y2hfbW0oJm5leHQtPmNvbnRleHQuaWQpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL01ha2VmaWxlIGIvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMzg4ZWMwYS4uMTExOTIzMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKQEAgLTMsNiArMyw5IEBACiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICMKIAorQ1BQRkxBR1Nfdm1saW51eC5sZHMgOj0gLVUkKFNVQkFSQ0gpIC1EU1RBUlQ9JChMRFNfU1RBUlQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1ERUxGX0FSQ0g9JChMRFNfRUxGX0FSQ0gpICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAtREVMRl9GT1JNQVQ9JChMRFNfRUxGX0ZPUk1BVCkKIGV4dHJhLXkgOj0gdm1saW51eC5sZHMKIGNsZWFuLWZpbGVzIDo9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUyBiL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUwppbmRleCA3MTVhMTg4Li43ZmNhZDU4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKKysrIGIvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCkBAIC0xNiwxMSArMTYsNyBAQAogICBfdGV4dCA9IC47CiAgIF9zdGV4dCA9IC47CiAgIF9faW5pdF9iZWdpbiA9IC47Ci0gIC5pbml0LnRleHQgOiB7Ci0JX3Npbml0dGV4dCA9IC47Ci0JSU5JVF9URVhUCi0JX2Vpbml0dGV4dCA9IC47Ci0gIH0KKyAgSU5JVF9URVhUX1NFQ1RJT04oUEFHRV9TSVpFKQogCiAgIC4gPSBBTElHTihQQUdFX1NJWkUpOwogCkBAIC05Niw4ICs5Miw3IEBACiAgIC5pbml0X2FycmF5ICAgICA6IHsgKiguaW5pdF9hcnJheSkgfQogICAuZmluaV9hcnJheSAgICAgOiB7ICooLmZpbmlfYXJyYXkpIH0KICAgLmRhdGEgICAgICAgICAgIDogewotICAgIC4gPSBBTElHTihLRVJORUxfU1RBQ0tfU0laRSk7CQkvKiBpbml0X3Rhc2sgKi8KLSAgICAqKC5kYXRhLmluaXRfdGFzaykKKyAgICBJTklUX1RBU0tfREFUQShLRVJORUxfU1RBQ0tfU0laRSkKICAgICAuID0gQUxJR04oS0VSTkVMX1NUQUNLX1NJWkUpOwogICAgICooLmRhdGEuaW5pdF9pcnFzdGFjaykKICAgICBEQVRBX0RBVEEKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC91bS9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggYjI1MTIxYi4uOGFhNzdiNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTMwLDkgKzMwLDggQEAKICAqICJpbml0X3Rhc2siIGxpbmtlciBtYXAgZW50cnkuLgogICovCiAKLXVuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbgotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KLQkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KKwl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwogCiB1bmlvbiB0aHJlYWRfdW5pb24gY3B1MF9pcnFzdGFjawogCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X2lycXN0YWNrIikpKSA9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9pcnEuYyBiL2FyY2gvdW0va2VybmVsL2lycS5jCmluZGV4IDQ1NGNkYjQuLjAzOTI3MGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvdW0va2VybmVsL2lycS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSAibGludXgvaW50ZXJydXB0LmgiCiAjaW5jbHVkZSAibGludXgva2VybmVsX3N0YXQuaCIKICNpbmNsdWRlICJsaW51eC9tb2R1bGUuaCIKKyNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgogI2luY2x1ZGUgImxpbnV4L3NlcV9maWxlLmgiCiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9zbXAuYyBiL2FyY2gvdW0va2VybmVsL3NtcC5jCmluZGV4IDk4MzUxYzcuLjEwNmJmMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NtcC5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBuY3B1czsgKytpKQotCQljcHVfc2V0KGksIGNwdV9wb3NzaWJsZV9tYXApOworCQlzZXRfY3B1X3Bvc3NpYmxlKGksIHRydWUpOwogCiAJY3B1X2NsZWFyKG1lLCBjcHVfb25saW5lX21hcCk7CiAJY3B1X3NldChtZSwgY3B1X29ubGluZV9tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCmluZGV4IDJlYmQzOTcuLmU3YTZjY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKQEAgLTIyLDExICsyMiw3IEBACiAgIF90ZXh0ID0gLjsKICAgX3N0ZXh0ID0gLjsKICAgX19pbml0X2JlZ2luID0gLjsKLSAgLmluaXQudGV4dCA6IHsKLQlfc2luaXR0ZXh0ID0gLjsKLQlJTklUX1RFWFQKLQlfZWluaXR0ZXh0ID0gLjsKLSAgfQorICBJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCiAgIC4gPSBBTElHTihQQUdFX1NJWkUpOwogCiAgIC50ZXh0ICAgICAgOgpAQCAtNTIsOCArNDgsNyBAQAogICBpbml0LmRhdGEgOiB7IElOSVRfREFUQSB9CiAgIC5kYXRhICAgIDoKICAgewotICAgIC4gPSBBTElHTihLRVJORUxfU1RBQ0tfU0laRSk7CQkvKiBpbml0X3Rhc2sgKi8KLSAgICAqKC5kYXRhLmluaXRfdGFzaykKKyAgICBJTklUX1RBU0tfREFUQShLRVJORUxfU1RBQ0tfU0laRSkKICAgICAuID0gQUxJR04oS0VSTkVMX1NUQUNLX1NJWkUpOwogICAgICooLmRhdGEuaW5pdF9pcnFzdGFjaykKICAgICBEQVRBX0RBVEEKQEAgLTgxLDE5ICs3NiwxMCBAQAogICBfZWRhdGEgID0gIC47CiAgIFBST1ZJREUgKGVkYXRhID0gLik7CiAgIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuc2JzcyAgICAgIDoKLSAgewotICAgX19ic3Nfc3RhcnQgPSAuOwotICAgUFJPVklERShfYnNzX3N0YXJ0ID0gLik7Ci0gICAqKC5zYnNzKQotICAgKiguc2NvbW1vbikKLSAgfQotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KKyAgX19ic3Nfc3RhcnQgPSAuOworICBQUk9WSURFKF9ic3Nfc3RhcnQgPSAuKTsKKyAgU0JTUygwKQorICBCU1MoMCkKICAgX2VuZCA9IC47CiAgIFBST1ZJREUgKGVuZCA9IC4pOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBmOGFlYjQ0Li4xNmU0OWJmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvdW0va2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTEsMyArMSw2IEBACisKK0tFUk5FTF9TVEFDS19TSVpFID0gNDA5NiAqICgxIDw8IENPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpOworCiAjaWZkZWYgQ09ORklHX0xEX1NDUklQVF9TVEFUSUMKICNpbmNsdWRlICJ1bWwubGRzLlMiCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggOTM2OTg3OS4uNzJhY2U5NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC04NiwxMCArODYsNiBAQAogY29uZmlnIEhBVkVfTEFURU5DWVRPUF9TVVBQT1JUCiAJZGVmX2Jvb2wgeQogCi1jb25maWcgRkFTVF9DTVBYQ0hHX0xPQ0FMCi0JYm9vbAotCWRlZmF1bHQgeQotCiBjb25maWcgTU1VCiAJZGVmX2Jvb2wgeQogCkBAIC00MzIsNiArNDI4LDE3IEBACiAJICBvZiBGbGF0IExvZ2ljYWwuICBZb3Ugd2lsbCBuZWVkIGEgbmV3IGx5bnhlci5lbGYgZmlsZSB0byBmbGFzaCB5b3VyCiAJICBmaXJtd2FyZSB3aXRoIC0gc2VuZCBlbWFpbCB0byA8TWFydGluLkJsaWdoQHVzLmlibS5jb20+LgogCitjb25maWcgWDg2X1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFCisJYm9vbAorCSMgTUNFIGNvZGUgY2FsbHMgbWVtb3J5X2ZhaWx1cmUoKToKKwlkZXBlbmRzIG9uIFg4Nl9NQ0UKKwkjIE9uIDMyLWJpdCB0aGlzIGFkZHMgdG9vIGJpZyBvZiBOT0RFU19TSElGVCBhbmQgd2UgcnVuIG91dCBvZiBwYWdlIGZsYWdzOgorCWRlcGVuZHMgb24gIVg4Nl9OVU1BUQorCSMgT24gMzItYml0IFNQQVJTRU1FTSBhZGRzIHRvbyBiaWcgb2YgU0VDVElPTlNfV0lEVEg6CisJZGVwZW5kcyBvbiBYODZfNjQgfHwgIVNQQVJTRU1FTQorCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFCisJZGVmYXVsdCB5CisKIGNvbmZpZyBYODZfVklTV1MKIAlib29sICJTR0kgMzIwLzU0MCAoVmlzdWFsIFdvcmtzdGF0aW9uKSIKIAlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBQQ0kgJiYgWDg2X01QUEFSU0UgJiYgUENJX0dPRElSRUNUCkBAIC00ODQsNyArNDkxLDcgQEAKIHNvdXJjZSAiYXJjaC94ODYveGVuL0tjb25maWciCiAKIGNvbmZpZyBWTUkKLQlib29sICJWTUkgR3Vlc3Qgc3VwcG9ydCIKKwlib29sICJWTUkgR3Vlc3Qgc3VwcG9ydCAoREVQUkVDQVRFRCkiCiAJc2VsZWN0IFBBUkFWSVJUCiAJZGVwZW5kcyBvbiBYODZfMzIKIAktLS1oZWxwLS0tCkBAIC00OTMsNiArNTAwLDE1IEBACiAJICBhdCB0aGUgbW9tZW50KSwgYnkgbGlua2luZyB0aGUga2VybmVsIHRvIGEgR1BMLWVkIFJPTSBtb2R1bGUKIAkgIHByb3ZpZGVkIGJ5IHRoZSBoeXBlcnZpc29yLgogCisJICBBcyBvZiBTZXB0ZW1iZXIgMjAwOSwgVk13YXJlIGhhcyBzdGFydGVkIGEgcGhhc2VkIHJldGlyZW1lbnQKKwkgIG9mIHRoaXMgZmVhdHVyZSBmcm9tIFZNd2FyZSdzIHByb2R1Y3RzLiBQbGVhc2Ugc2VlCisJICBmZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGZvciBkZXRhaWxzLiAgSWYgeW91IGFyZQorCSAgcGxhbm5pbmcgdG8gZW5hYmxlIHRoaXMgb3B0aW9uLCBwbGVhc2Ugbm90ZSB0aGF0IHlvdSBjYW5ub3QKKwkgIGxpdmUgbWlncmF0ZSBhIFZNSSBlbmFibGVkIFZNIHRvIGEgZnV0dXJlIFZNd2FyZSBwcm9kdWN0LAorCSAgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFZNSS4gU28gaWYgeW91IGV4cGVjdCB5b3VyIGtlcm5lbCB0bworCSAgc2VhbWxlc3NseSBtaWdyYXRlIHRvIG5ld2VyIFZNd2FyZSBwcm9kdWN0cywga2VlcCB0aGlzCisJICBkaXNhYmxlZC4KKwogY29uZmlnIEtWTV9DTE9DSwogCWJvb2wgIktWTSBwYXJhdmlydHVhbGl6ZWQgY2xvY2siCiAJc2VsZWN0IFBBUkFWSVJUCkBAIC0xNDI3LDEyICsxNDQzLDggQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4gT25seSBlbWJlZGRlZCBzaG91bGQgc2F5IE4gaGVyZS4KIAotY29uZmlnIENDX1NUQUNLUFJPVEVDVE9SX0FMTAotCWJvb2wKLQogY29uZmlnIENDX1NUQUNLUFJPVEVDVE9SCiAJYm9vbCAiRW5hYmxlIC1mc3RhY2stcHJvdGVjdG9yIGJ1ZmZlciBvdmVyZmxvdyBkZXRlY3Rpb24gKEVYUEVSSU1FTlRBTCkiCi0Jc2VsZWN0IENDX1NUQUNLUFJPVEVDVE9SX0FMTAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIHR1cm5zIG9uIHRoZSAtZnN0YWNrLXByb3RlY3RvciBHQ0MgZmVhdHVyZS4gVGhpcwogCSAgZmVhdHVyZSBwdXRzLCBhdCB0aGUgYmVnaW5uaW5nIG9mIGZ1bmN0aW9ucywgYSBjYW5hcnkgdmFsdWUgb24KZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcuY3B1IGIvYXJjaC94ODYvS2NvbmZpZy5jcHUKaW5kZXggNTI3NTE5Yi4uMjY0OTg0MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5jcHUKKysrIGIvYXJjaC94ODYvS2NvbmZpZy5jcHUKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiBjb25maWcgWDg2X0NNUFhDSEc2NAogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFg4Nl9QQUUgfHwgWDg2XzY0CisJZGVwZW5kcyBvbiAhTTM4NiAmJiAhTTQ4NgogCiAjIHRoaXMgc2hvdWxkIGJlIHNldCBmb3IgYWxsIC1tYXJjaD0uLiBvcHRpb25zIHdoZXJlIHRoZSBjb21waWxlcgogIyBnZW5lcmF0ZXMgY21vdi4KQEAgLTQxMiw2ICs0MTIsNyBAQAogCWludAogCWRlZmF1bHQgIjY0IiBpZiBYODZfNjQKIAlkZWZhdWx0ICI2IiBpZiBYODZfMzIgJiYgWDg2X1A2X05PUAorCWRlZmF1bHQgIjUiIGlmIFg4Nl8zMiAmJiBYODZfQ01QWENIRzY0CiAJZGVmYXVsdCAiNCIgaWYgWDg2XzMyICYmIChYODZfWEFERCB8fCBYODZfQ01QWENIRyB8fCBYODZfQlNXQVAgfHwgWDg2X1dQX1dPUktTX09LKQogCWRlZmF1bHQgIjMiCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L01ha2VmaWxlIGIvYXJjaC94ODYvTWFrZWZpbGUKaW5kZXggNzk4M2M0Mi4uZDJkMjRjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvTWFrZWZpbGUKQEAgLTc2LDcgKzc2LDYgQEAKIAljY19oYXNfc3AgOj0gJChzcmN0cmVlKS9zY3JpcHRzL2djYy14ODZfJChCSVRTKS1oYXMtc3RhY2stcHJvdGVjdG9yLnNoCiAgICAgICAgIGlmZXEgKCQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoY2NfaGFzX3NwKSAkKENDKSAkKGJpYXJjaCkpLHkpCiAgICAgICAgICAgICAgICAgc3RhY2twLXkgOj0gLWZzdGFjay1wcm90ZWN0b3IKLSAgICAgICAgICAgICAgICBzdGFja3AtJChDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1JfQUxMKSArPSAtZnN0YWNrLXByb3RlY3Rvci1hbGwKICAgICAgICAgICAgICAgICBLQlVJTERfQ0ZMQUdTICs9ICQoc3RhY2twLXkpCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAkKHdhcm5pbmcgc3RhY2sgcHJvdGVjdG9yIGVuYWJsZWQgYnV0IG5vIGNvbXBpbGVyIHN1cHBvcnQpCkBAIC0xNzksOCArMTc4LDggQEAKIGRlZmluZSBhcmNoaGVscAogICBlY2hvICAnKiBiekltYWdlICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC94ODYvYm9vdC9iekltYWdlKScKICAgZWNobyAgJyAgaW5zdGFsbCAgICAgIC0gSW5zdGFsbCBrZXJuZWwgdXNpbmcnCi0gIGVjaG8gICcgICAgICAgICAgICAgICAgICAoeW91cikgfi9iaW4vaW5zdGFsbGtlcm5lbCBvcicKLSAgZWNobyAgJyAgICAgICAgICAgICAgICAgIChkaXN0cmlidXRpb24pIC9zYmluL2luc3RhbGxrZXJuZWwgb3InCisgIGVjaG8gICcgICAgICAgICAgICAgICAgICAoeW91cikgfi9iaW4vJChJTlNUQUxMS0VSTkVMKSBvcicKKyAgZWNobyAgJyAgICAgICAgICAgICAgICAgIChkaXN0cmlidXRpb24pIC9zYmluLyQoSU5TVEFMTEtFUk5FTCkgb3InCiAgIGVjaG8gICcgICAgICAgICAgICAgICAgICBpbnN0YWxsIHRvICQkKElOU1RBTExfUEFUSCkgYW5kIHJ1biBsaWxvJwogICBlY2hvICAnICBmZGltYWdlICAgICAgLSBDcmVhdGUgMS40TUIgYm9vdCBmbG9wcHkgaW1hZ2UgKGFyY2gveDg2L2Jvb3QvZmRpbWFnZSknCiAgIGVjaG8gICcgIGZkaW1hZ2UxNDQgICAtIENyZWF0ZSAxLjRNQiBib290IGZsb3BweSBpbWFnZSAoYXJjaC94ODYvYm9vdC9mZGltYWdlKScKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCmluZGV4IDc1ZTRmMDAuLmY1NDNiNzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUwpAQCAtMjMsMTMgKzIzLDE0IEBACiAgKi8KIAkudGV4dAogCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3QuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAotCS5zZWN0aW9uICIudGV4dC5oZWFkIiwiYXgiLEBwcm9nYml0cworCV9fSEVBRAogRU5UUlkoc3RhcnR1cF8zMikKIAljbGQKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKaW5kZXggZjYyYzI4NC4uMDc3ZTFiNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCkBAIC0yNCw2ICsyNCw3IEBACiAJLmNvZGUzMgogCS50ZXh0CiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGVfdHlwZXMuaD4KQEAgLTMzLDcgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKLQkuc2VjdGlvbiAiLnRleHQuaGVhZCIKKwlfX0hFQUQKIAkuY29kZTMyCiBFTlRSWShzdGFydHVwXzMyKQogCWNsZApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuUwppbmRleCBjYzM1M2UxLi5mNDE5M2JiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuUwpAQCAtMSwzICsxLDUgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgorCiBPVVRQVVRfRk9STUFUKENPTkZJR19PVVRQVVRfRk9STUFULCBDT05GSUdfT1VUUFVUX0ZPUk1BVCwgQ09ORklHX09VVFBVVF9GT1JNQVQpCiAKICN1bmRlZiBpMzg2CkBAIC0xOCw5ICsyMCw5IEBACiAJICogYWRkcmVzcyAwLgogCSAqLwogCS4gPSAwOwotCS50ZXh0LmhlYWQgOiB7CisJLmhlYWQudGV4dCA6IHsKIAkJX2hlYWQgPSAuIDsKLQkJKigudGV4dC5oZWFkKQorCQlIRUFEX1RFWFQKIAkJX2VoZWFkID0gLiA7CiAJfQogCS5yb2RhdGEuY29tcHJlc3NlZCA6IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gveDg2L2Jvb3QvaW5zdGFsbC5zaAppbmRleCA4ZDYwZWUxLi5kMTNlYzFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2luc3RhbGwuc2gKKysrIGIvYXJjaC94ODYvYm9vdC9pbnN0YWxsLnNoCkBAIC0zMyw4ICszMyw4IEBACiAKICMgVXNlciBtYXkgaGF2ZSBhIGN1c3RvbSBpbnN0YWxsIHNjcmlwdAogCi1pZiBbIC14IH4vYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyB+L2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCAiJEAiOyBmaQotaWYgWyAteCAvc2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCBdOyB0aGVuIGV4ZWMgL3NiaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgIiRAIjsgZmkKK2lmIFsgLXggfi9iaW4vJHtJTlNUQUxMS0VSTkVMfSBdOyB0aGVuIGV4ZWMgfi9iaW4vJHtJTlNUQUxMS0VSTkVMfSAiJEAiOyBmaQoraWYgWyAteCAvc2Jpbi8ke0lOU1RBTExLRVJORUx9IF07IHRoZW4gZXhlYyAvc2Jpbi8ke0lOU1RBTExLRVJORUx9ICIkQCI7IGZpCiAKICMgRGVmYXVsdCBpbnN0YWxsIC0gc2FtZSBhcyBtYWtlIHpsaWxvCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3Qvc2V0dXAubGQgYi9hcmNoL3g4Ni9ib290L3NldHVwLmxkCmluZGV4IDBmNmVjNDU1Li4wM2MwNjgzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3NldHVwLmxkCisrKyBiL2FyY2gveDg2L2Jvb3Qvc2V0dXAubGQKQEAgLTUzLDYgKzUzLDkgQEAKIAogCS9ESVNDQVJELyA6IHsgKigubm90ZSopIH0KIAorCS8qCisJICogVGhlIEFTU0VSVCgpIHNpbmsgdG8gLiBpcyBpbnRlbnRpb25hbCwgZm9yIGJpbnV0aWxzIDIuMTQgY29tcGF0aWJpbGl0eToKKwkgKi8KIAkuID0gQVNTRVJUKF9lbmQgPD0gMHg4MDAwLCAiU2V0dXAgdG9vIGJpZyEiKTsKIAkuID0gQVNTRVJUKGhkciA9PSAweDFmMSwgIlRoZSBzZXR1cCBoZWFkZXIgaGFzIHRoZSB3cm9uZyBvZmZzZXQhIik7CiAJLyogTmVjZXNzYXJ5IGZvciB0aGUgdmVyeS1vbGQtbG9hZGVyIGNoZWNrIHRvIHdvcmsuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9nbHVlLmMgYi9hcmNoL3g4Ni9jcnlwdG8vYWVzbmktaW50ZWxfZ2x1ZS5jCmluZGV4IDU4NWVkZWIuLjQ5YzU1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2dsdWUuYwpAQCAtODIsNyArODIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoaXJxX2ZwdV91c2FibGUoKSkKKwlpZiAoIWlycV9mcHVfdXNhYmxlKCkpCiAJCWVyciA9IGNyeXB0b19hZXNfZXhwYW5kX2tleShjdHgsIGluX2tleSwga2V5X2xlbik7CiAJZWxzZSB7CiAJCWtlcm5lbF9mcHVfYmVnaW4oKTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogewogCXN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKIAotCWlmIChpcnFfZnB1X3VzYWJsZSgpKQorCWlmICghaXJxX2ZwdV91c2FibGUoKSkKIAkJY3J5cHRvX2Flc19lbmNyeXB0X3g4NihjdHgsIGRzdCwgc3JjKTsKIAllbHNlIHsKIAkJa2VybmVsX2ZwdV9iZWdpbigpOwpAQCAtMTE2LDcgKzExNiw3IEBACiB7CiAJc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHggPSBhZXNfY3R4KGNyeXB0b190Zm1fY3R4KHRmbSkpOwogCi0JaWYgKGlycV9mcHVfdXNhYmxlKCkpCisJaWYgKCFpcnFfZnB1X3VzYWJsZSgpKQogCQljcnlwdG9fYWVzX2RlY3J5cHRfeDg2KGN0eCwgZHN0LCBzcmMpOwogCWVsc2UgewogCQlrZXJuZWxfZnB1X2JlZ2luKCk7CkBAIC0zNDIsNyArMzQyLDcgQEAKIAlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbShyZXEpOwogCXN0cnVjdCBhc3luY19hZXNfY3R4ICpjdHggPSBjcnlwdG9fYWJsa2NpcGhlcl9jdHgodGZtKTsKIAotCWlmIChpcnFfZnB1X3VzYWJsZSgpKSB7CisJaWYgKCFpcnFfZnB1X3VzYWJsZSgpKSB7CiAJCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKmNyeXB0ZF9yZXEgPQogCQkJYWJsa2NpcGhlcl9yZXF1ZXN0X2N0eChyZXEpOwogCQltZW1jcHkoY3J5cHRkX3JlcSwgcmVxLCBzaXplb2YoKnJlcSkpOwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm0gPSBjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0ocmVxKTsKIAlzdHJ1Y3QgYXN5bmNfYWVzX2N0eCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KHRmbSk7CiAKLQlpZiAoaXJxX2ZwdV91c2FibGUoKSkgeworCWlmICghaXJxX2ZwdV91c2FibGUoKSkgewogCQlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpjcnlwdGRfcmVxID0KIAkJCWFibGtjaXBoZXJfcmVxdWVzdF9jdHgocmVxKTsKIAkJbWVtY3B5KGNyeXB0ZF9yZXEsIHJlcSwgc2l6ZW9mKCpyZXEpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMgYi9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCmluZGV4IDc0NjE5YzQuLjU4MWIwNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKKysrIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwpAQCAtMjEsOCArMjEsOCBAQAogI2RlZmluZSBfX0FVRElUX0FSQ0hfTEUJICAgMHg0MDAwMDAwMAogCiAjaWZuZGVmIENPTkZJR19BVURJVFNZU0NBTEwKLSNkZWZpbmUgc3lzZXhpdF9hdWRpdCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKLSNkZWZpbmUgc3lzcmV0bF9hdWRpdCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKKyNkZWZpbmUgc3lzZXhpdF9hdWRpdCBpYTMyX3JldF9mcm9tX3N5c19jYWxsCisjZGVmaW5lIHN5c3JldGxfYXVkaXQgaWEzMl9yZXRfZnJvbV9zeXNfY2FsbAogI2VuZGlmCiAKICNkZWZpbmUgSUEzMl9OUl9zeXNjYWxscyAoKGlhMzJfc3lzY2FsbF9lbmQgLSBpYTMyX3N5c19jYWxsX3RhYmxlKS84KQpAQCAtMzksMTIgKzM5LDEyIEBACiAJLmVuZG0gCiAKIAkvKiBjbG9iYmVycyAlZWF4ICovCQotCS5tYWNybyAgQ0xFQVJfUlJFR1MgX3I5PXJheAorCS5tYWNybyAgQ0xFQVJfUlJFR1Mgb2Zmc2V0PTAsIF9yOT1yYXgKIAl4b3JsIAklZWF4LCVlYXgKLQltb3ZxCSVyYXgsUjExKCVyc3ApCi0JbW92cQklcmF4LFIxMCglcnNwKQotCW1vdnEJJVxfcjksUjkoJXJzcCkKLQltb3ZxCSVyYXgsUjgoJXJzcCkKKwltb3ZxCSVyYXgsXG9mZnNldCtSMTEoJXJzcCkKKwltb3ZxCSVyYXgsXG9mZnNldCtSMTAoJXJzcCkKKwltb3ZxCSVcX3I5LFxvZmZzZXQrUjkoJXJzcCkKKwltb3ZxCSVyYXgsXG9mZnNldCtSOCglcnNwKQogCS5lbmRtCiAKIAkvKgpAQCAtMTcyLDYgKzE3MiwxMCBAQAogCW1vdmwJUklQLVIxMSglcnNwKSwlZWR4CQkvKiBVc2VyICVlaXAgKi8KIAlDRklfUkVHSVNURVIgcmlwLHJkeAogCVJFU1RPUkVfQVJHUyAxLDI0LDEsMSwxLDEKKwl4b3JxCSVyOCwlcjgKKwl4b3JxCSVyOSwlcjkKKwl4b3JxCSVyMTAsJXIxMAorCXhvcnEJJXIxMSwlcjExCiAJcG9wZnEKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTgKIAkvKkNGSV9SRVNUT1JFIHJmbGFncyovCkBAIC0yMDAsOSArMjA0LDkgQEAKIAltb3ZsIFJESS1BUkdPRkZTRVQoJXJzcCksJXI4ZAkvKiByZWxvYWQgNXRoIHN5c2NhbGwgYXJnICovCiAJLmVuZG0KIAotCS5tYWNybyBhdWRpdHN5c19leGl0IGV4aXQsZWJwc2F2ZT1SQlAKKwkubWFjcm8gYXVkaXRzeXNfZXhpdCBleGl0CiAJdGVzdGwgJChfVElGX0FMTFdPUktfTUFTSyAmIH5fVElGX1NZU0NBTExfQVVESVQpLFRJX2ZsYWdzKCVyMTApCi0Jam56IGludF9yZXRfZnJvbV9zeXNfY2FsbAorCWpueiBpYTMyX3JldF9mcm9tX3N5c19jYWxsCiAJVFJBQ0VfSVJRU19PTgogCXN0aQogCW1vdmwgJWVheCwlZXNpCQkvKiBzZWNvbmQgYXJnLCBzeXNjYWxsIHJldHVybiB2YWx1ZSAqLwpAQCAtMjEzLDEzICsyMTcsMTMgQEAKIAljYWxsIGF1ZGl0X3N5c2NhbGxfZXhpdAogCUdFVF9USFJFQURfSU5GTyglcjEwKQogCW1vdmwgUkFYLUFSR09GRlNFVCglcnNwKSwlZWF4CS8qIHJlbG9hZCBzeXNjYWxsIHJldHVybiB2YWx1ZSAqLwotCW1vdmwgXGVicHNhdmUtQVJHT0ZGU0VUKCVyc3ApLCVlYnAgLyogcmVsb2FkIHVzZXIgcmVnaXN0ZXIgdmFsdWUgKi8KIAltb3ZsICQoX1RJRl9BTExXT1JLX01BU0sgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSwlZWRpCiAJY2xpCiAJVFJBQ0VfSVJRU19PRkYKIAl0ZXN0bCAlZWRpLFRJX2ZsYWdzKCVyMTApCi0Jam56IGludF93aXRoX2NoZWNrCi0Jam1wIFxleGl0CisJanogXGV4aXQKKwlDTEVBUl9SUkVHUyAtQVJHT0ZGU0VUCisJam1wIGludF93aXRoX2NoZWNrCiAJLmVuZG0KIAogc3lzZW50ZXJfYXVkaXRzeXM6CkBAIC0zMjksNiArMzMzLDkgQEAKIAlDRklfUkVHSVNURVIgcmlwLHJjeAogCW1vdmwgRUZMQUdTLUFSR09GRlNFVCglcnNwKSwlcjExZAkKIAkvKkNGSV9SRUdJU1RFUiByZmxhZ3MscjExKi8KKwl4b3JxCSVyMTAsJXIxMAorCXhvcnEJJXI5LCVyOQorCXhvcnEJJXI4LCVyOAogCVRSQUNFX0lSUVNfT04KIAltb3ZsIFJTUC1BUkdPRkZTRVQoJXJzcCksJWVzcAogCUNGSV9SRVNUT1JFIHJzcApAQCAtMzQzLDcgKzM1MCw3IEBACiAJam1wIGNzdGFyX2Rpc3BhdGNoCiAKIHN5c3JldGxfYXVkaXQ6Ci0JYXVkaXRzeXNfZXhpdCBzeXNyZXRsX2Zyb21fc3lzX2NhbGwsIFJDWCAvKiB1c2VyICVlYnAgaW4gUkNYIHNsb3QgKi8KKwlhdWRpdHN5c19leGl0IHN5c3JldGxfZnJvbV9zeXNfY2FsbAogI2VuZGlmCiAKIGNzdGFyX3RyYWNlc3lzOgpAQCAtMzUzLDcgKzM2MCw3IEBACiAjZW5kaWYKIAl4Y2hnbCAlcjlkLCVlYnAKIAlTQVZFX1JFU1QKLQlDTEVBUl9SUkVHUyByOQorCUNMRUFSX1JSRUdTIDAsIHI5CiAJbW92cSAkLUVOT1NZUyxSQVgoJXJzcCkJLyogcHRyYWNlIGNhbiBjaGFuZ2UgdGhpcyBmb3IgYSBiYWQgc3lzY2FsbCAqLwogCW1vdnEgJXJzcCwlcmRpICAgICAgICAvKiAmcHRfcmVncyAtPiBhcmcxICovCiAJY2FsbCBzeXNjYWxsX3RyYWNlX2VudGVyCkBAIC00MjUsNiArNDMyLDggQEAKIAljYWxsICppYTMyX3N5c19jYWxsX3RhYmxlKCwlcmF4LDgpICMgeHh4OiByaXAgcmVsYXRpdmUKIGlhMzJfc3lzcmV0OgogCW1vdnEgJXJheCxSQVgtQVJHT0ZGU0VUKCVyc3ApCitpYTMyX3JldF9mcm9tX3N5c19jYWxsOgorCUNMRUFSX1JSRUdTIC1BUkdPRkZTRVQKIAlqbXAgaW50X3JldF9mcm9tX3N5c19jYWxsIAogCiBpYTMyX3RyYWNlc3lzOgkJCSAKQEAgLTQ0Miw4ICs0NTEsOCBAQAogCiBpYTMyX2JhZHN5czoKIAltb3ZxICQwLE9SSUdfUkFYLUFSR09GRlNFVCglcnNwKQotCW1vdnEgJC1FTk9TWVMsUkFYLUFSR09GRlNFVCglcnNwKQotCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKKwltb3ZxICQtRU5PU1lTLCVyYXgKKwlqbXAgaWEzMl9zeXNyZXQKIAogcXVpZXRfbmlfc3lzY2FsbDoKIAltb3ZxICQtRU5PU1lTLCVyYXgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11LmgKaW5kZXggYWM5NTk5NS4uNGIxODA4OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11LmgKQEAgLTMxLDYgKzMxLDcgQEAKIGV4dGVybiB2b2lkIGFtZF9pb21tdV9mbHVzaF9hbGxfZG9tYWlucyh2b2lkKTsKIGV4dGVybiB2b2lkIGFtZF9pb21tdV9mbHVzaF9hbGxfZGV2aWNlcyh2b2lkKTsKIGV4dGVybiB2b2lkIGFtZF9pb21tdV9zaHV0ZG93bih2b2lkKTsKK2V4dGVybiB2b2lkIGFtZF9pb21tdV9hcHBseV9lcnJhdHVtXzYzKHUxNiBkZXZpZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgYW1kX2lvbW11X2luaXQodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQogc3RhdGljIGlubGluZSB2b2lkIGFtZF9pb21tdV9kZXRlY3Qodm9pZCkgeyB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jYWNoZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY2FjaGUuaAppbmRleCA1ZDM2N2NhLi41NDk4NjBkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jYWNoZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NhY2hlLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9BU01fWDg2X0NBQ0hFX0gKICNkZWZpbmUgX0FTTV9YODZfQ0FDSEVfSAogCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCiAvKiBMMSBjYWNoZSBsaW5lIHNpemUgKi8KICNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJKENPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQpCiAjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCSgxIDw8IEwxX0NBQ0hFX1NISUZUKQpAQCAtMTMsNyArMTUsNyBAQAogI2lmZGVmIENPTkZJR19TTVAKICNkZWZpbmUgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAJCQkJCVwKIAlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxIDw8IChJTlRFUk5PREVfQ0FDSEVfU0hJRlQpKSkpCVwKLQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEucGFnZV9hbGlnbmVkIikpKQorCV9fcGFnZV9hbGlnbmVkX2RhdGEKICNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NoZWNrc3VtXzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jaGVja3N1bV8zMi5oCmluZGV4IDdjNWVmOGIuLjQ2ZmM0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NoZWNrc3VtXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY2hlY2tzdW1fMzIuaApAQCAtMTYxLDcgKzE2MSw4IEBACiAJICAgICJhZGNsICQwLCAlMAk7XG4iCiAJICAgIDogIj0mciIgKHN1bSkKIAkgICAgOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCi0JICAgICAgInIiIChodG9ubChsZW4pKSwgInIiIChodG9ubChwcm90bykpLCAiMCIgKHN1bSkpOworCSAgICAgICJyIiAoaHRvbmwobGVuKSksICJyIiAoaHRvbmwocHJvdG8pKSwgIjAiIChzdW0pCisJICAgIDogIm1lbW9yeSIpOwogCiAJcmV0dXJuIGNzdW1fZm9sZChzdW0pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oCmluZGV4IDgyY2ViNzguLmVlMTkzMWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzMyLmgKQEAgLTMxMiwxOSArMzEyLDIzIEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgY21weGNoZ180ODZfdTY0KHZvbGF0aWxlIHZvaWQgKiwgdTY0LCB1NjQpOwogCi0jZGVmaW5lIGNtcHhjaGc2NChwdHIsIG8sIG4pCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fcmV0OwkJCQkJXAotCWlmIChsaWtlbHkoYm9vdF9jcHVfZGF0YS54ODYgPiA0KSkJCQkJXAotCQlfX3JldCA9IChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnNjQoKHB0ciksCQlcCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykobyksCQlcCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykobikpOwkJXAotCWVsc2UJCQkJCQkJCVwKLQkJX19yZXQgPSAoX190eXBlb2ZfXygqKHB0cikpKWNtcHhjaGdfNDg2X3U2NCgocHRyKSwJXAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKG8pLAkJXAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKG4pKTsJCVwKLQlfX3JldDsJCQkJCQkJCVwKLX0pCisjZGVmaW5lIGNtcHhjaGc2NChwdHIsIG8sIG4pCQkJCQlcCisoewkJCQkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX3JldDsJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX29sZCA9IChvKTsJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldyA9IChuKTsJCQkJXAorCWFsdGVybmF0aXZlX2lvKCJjYWxsIGNtcHhjaGc4Yl9lbXUiLAkJCVwKKwkJCSJsb2NrOyBjbXB4Y2hnOGIgKCUlZXNpKSIgLAkJXAorCQkgICAgICAgWDg2X0ZFQVRVUkVfQ1g4LAkJCQlcCisJCSAgICAgICAiPUEiIChfX3JldCksCQkJCVwKKwkJICAgICAgICJTIiAoKHB0cikpLCAiMCIgKF9fb2xkKSwJCVwKKwkJICAgICAgICJiIiAoKHVuc2lnbmVkIGludClfX25ldyksCQlcCisJCSAgICAgICAiYyIgKCh1bnNpZ25lZCBpbnQpKF9fbmV3Pj4zMikpCQlcCisJCSAgICAgICA6ICJtZW1vcnkiKTsJCQkJXAorCV9fcmV0OyB9KQorCisKKwogI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKQkJCQkJXAogKHsJCQkJCQkJCQlcCiAJX190eXBlb2ZfXygqKHB0cikpIF9fcmV0OwkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZGVzYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZGVzYy5oCmluZGV4IGU4ZGUyZjYuLjYxN2JkNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Rlc2MuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjLmgKQEAgLTI4OCw3ICsyODgsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2Rlc2NfYmFzZShjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmRlc2MpCiB7Ci0JcmV0dXJuIGRlc2MtPmJhc2UwIHwgKChkZXNjLT5iYXNlMSkgPDwgMTYpIHwgKChkZXNjLT5iYXNlMikgPDwgMjQpOworCXJldHVybiAodW5zaWduZWQpKGRlc2MtPmJhc2UwIHwgKChkZXNjLT5iYXNlMSkgPDwgMTYpIHwgKChkZXNjLT5iYXNlMikgPDwgMjQpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9kZXNjX2Jhc2Uoc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjLCB1bnNpZ25lZCBsb25nIGJhc2UpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCAzYmUwMDA0Li5kODM4OTIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTc5Niw2ICs3OTYsNyBAQAogI2RlZmluZSBLVk1fQVJDSF9XQU5UX01NVV9OT1RJRklFUgogaW50IGt2bV91bm1hcF9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSk7CiBpbnQga3ZtX2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSk7Cit2b2lkIGt2bV9zZXRfc3B0ZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSwgcHRlX3QgcHRlKTsKIGludCBjcHVpZF9tYXhwaHlhZGRyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBpbnQga3ZtX2NwdV9oYXNfaW50ZXJydXB0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBpbnQga3ZtX2FyY2hfaW50ZXJydXB0X2FsbG93ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKaW5kZXggYjYwOGE2NC4uZjEzNjNiNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKQEAgLTEzMyw2ICsxMzMsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9wNV9tY2Uodm9pZCkge30KICNlbmRpZgogCitleHRlcm4gdm9pZCAoKng4Nl9tY2VfZGVjb2RlX2NhbGxiYWNrKShzdHJ1Y3QgbWNlICptKTsKKwogdm9pZCBtY2Vfc2V0dXAoc3RydWN0IG1jZSAqbSk7CiB2b2lkIG1jZV9sb2coc3RydWN0IG1jZSAqbSk7CiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IHN5c19kZXZpY2UsIG1jZV9kZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggZjkyMzIwMy4uNGEyZDRlMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0zNywxMiArMzcsMTIgQEAKIAogCWlmIChsaWtlbHkocHJldiAhPSBuZXh0KSkgewogCQkvKiBzdG9wIGZsdXNoIGlwaXMgZm9yIHRoZSBwcmV2aW91cyBtbSAqLwotCQljcHVfY2xlYXIoY3B1LCBwcmV2LT5jcHVfdm1fbWFzayk7CisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbW1fY3B1bWFzayhwcmV2KSk7CiAjaWZkZWYgQ09ORklHX1NNUAogCQlwZXJjcHVfd3JpdGUoY3B1X3RsYnN0YXRlLnN0YXRlLCBUTEJTVEFURV9PSyk7CiAJCXBlcmNwdV93cml0ZShjcHVfdGxic3RhdGUuYWN0aXZlX21tLCBuZXh0KTsKICNlbmRpZgotCQljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOworCQljcHVtYXNrX3NldF9jcHUoY3B1LCBtbV9jcHVtYXNrKG5leHQpKTsKIAogCQkvKiBSZS1sb2FkIHBhZ2UgdGFibGVzICovCiAJCWxvYWRfY3IzKG5leHQtPnBnZCk7CkBAIC01OCw3ICs1OCw3IEBACiAJCXBlcmNwdV93cml0ZShjcHVfdGxic3RhdGUuc3RhdGUsIFRMQlNUQVRFX09LKTsKIAkJQlVHX09OKHBlcmNwdV9yZWFkKGNwdV90bGJzdGF0ZS5hY3RpdmVfbW0pICE9IG5leHQpOwogCi0JCWlmICghY3B1X3Rlc3RfYW5kX3NldChjcHUsIG5leHQtPmNwdV92bV9tYXNrKSkgeworCQlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfc2V0X2NwdShjcHUsIG1tX2NwdW1hc2sobmV4dCkpKSB7CiAJCQkvKiBXZSB3ZXJlIGluIGxhenkgdGxiIG1vZGUgYW5kIGxlYXZlX21tIGRpc2FibGVkCiAJCQkgKiB0bGIgZmx1c2ggSVBJIGRlbGl2ZXJ5LiBXZSBtdXN0IHJlbG9hZCBDUjMKIAkJCSAqIHRvIG1ha2Ugc3VyZSB0byB1c2Ugbm8gZnJlZWQgcGFnZSB0YWJsZXMuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCmluZGV4IGU2M2NmN2QuLjEzOWQ0YzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oCkBAIC00MCw4ICs0MCw3IEBACiAjZGVmaW5lIE5NSV9JTlZBTElECTMKIAogc3RydWN0IGN0bF90YWJsZTsKLXN0cnVjdCBmaWxlOwotZXh0ZXJuIGludCBwcm9jX25taV9lbmFibGVkKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50ICwgc3RydWN0IGZpbGUgKiwKK2V4dGVybiBpbnQgcHJvY19ubWlfZW5hYmxlZChzdHJ1Y3QgY3RsX3RhYmxlICosIGludCAsCiAJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogZXh0ZXJuIGludCB1bmtub3duX25taV9wYW5pYzsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKaW5kZXggOGFlYmNjNC4uZWZiMzg5OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCkBAIC04NDAsNDIgKzg0MCwyMiBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yYXdfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZjsKLQotCWFzbSB2b2xhdGlsZShwYXJhdmlydF9hbHQoUEFSQVZJUlRfQ0FMTCkKLQkJICAgICA6ICI9YSIoZikKLQkJICAgICA6IHBhcmF2aXJ0X3R5cGUocHZfaXJxX29wcy5zYXZlX2ZsKSwKLQkJICAgICAgIHBhcmF2aXJ0X2Nsb2JiZXIoQ0xCUl9FQVgpCi0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7Ci0JcmV0dXJuIGY7CisJcmV0dXJuIFBWT1BfQ0FMTEVFMCh1bnNpZ25lZCBsb25nLCBwdl9pcnFfb3BzLnNhdmVfZmwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZikKIHsKLQlhc20gdm9sYXRpbGUocGFyYXZpcnRfYWx0KFBBUkFWSVJUX0NBTEwpCi0JCSAgICAgOiAiPWEiKGYpCi0JCSAgICAgOiBQVl9GTEFHU19BUkcoZiksCi0JCSAgICAgICBwYXJhdmlydF90eXBlKHB2X2lycV9vcHMucmVzdG9yZV9mbCksCi0JCSAgICAgICBwYXJhdmlydF9jbG9iYmVyKENMQlJfRUFYKQotCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOworCVBWT1BfVkNBTExFRTEocHZfaXJxX29wcy5yZXN0b3JlX2ZsLCBmKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJhd19sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQogewotCWFzbSB2b2xhdGlsZShwYXJhdmlydF9hbHQoUEFSQVZJUlRfQ0FMTCkKLQkJICAgICA6Ci0JCSAgICAgOiBwYXJhdmlydF90eXBlKHB2X2lycV9vcHMuaXJxX2Rpc2FibGUpLAotCQkgICAgICAgcGFyYXZpcnRfY2xvYmJlcihDTEJSX0VBWCkKLQkJICAgICA6ICJtZW1vcnkiLCAiZWF4IiwgImNjIik7CisJUFZPUF9WQ0FMTEVFMChwdl9pcnFfb3BzLmlycV9kaXNhYmxlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJhd19sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCiB7Ci0JYXNtIHZvbGF0aWxlKHBhcmF2aXJ0X2FsdChQQVJBVklSVF9DQUxMKQotCQkgICAgIDoKLQkJICAgICA6IHBhcmF2aXJ0X3R5cGUocHZfaXJxX29wcy5pcnFfZW5hYmxlKSwKLQkJICAgICAgIHBhcmF2aXJ0X2Nsb2JiZXIoQ0xCUl9FQVgpCi0JCSAgICAgOiAibWVtb3J5IiwgImVheCIsICJjYyIpOworCVBWT1BfVkNBTExFRTAocHZfaXJxX29wcy5pcnFfZW5hYmxlKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X2xvY2FsX2lycV9zYXZlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaAppbmRleCBkZDBmNWIzLi45MzU3NDczIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKQEAgLTQ5NCwxMCArNDk0LDExIEBACiAjZGVmaW5lIEVYVFJBX0NMT0JCRVJTCiAjZGVmaW5lIFZFWFRSQV9DTE9CQkVSUwogI2Vsc2UgIC8qIENPTkZJR19YODZfNjQgKi8KKy8qIFtyZV1heCBpc24ndCBhbiBhcmcsIGJ1dCB0aGUgcmV0dXJuIHZhbCAqLwogI2RlZmluZSBQVk9QX1ZDQUxMX0FSR1MJCQkJCVwKIAl1bnNpZ25lZCBsb25nIF9fZWRpID0gX19lZGksIF9fZXNpID0gX19lc2ksCVwKLQkJX19lZHggPSBfX2VkeCwgX19lY3ggPSBfX2VjeAotI2RlZmluZSBQVk9QX0NBTExfQVJHUwkJUFZPUF9WQ0FMTF9BUkdTLCBfX2VheAorCQlfX2VkeCA9IF9fZWR4LCBfX2VjeCA9IF9fZWN4LCBfX2VheCA9IF9fZWF4CisjZGVmaW5lIFBWT1BfQ0FMTF9BUkdTCQlQVk9QX1ZDQUxMX0FSR1MKIAogI2RlZmluZSBQVk9QX0NBTExfQVJHMSh4KQkJIkQiICgodW5zaWduZWQgbG9uZykoeCkpCiAjZGVmaW5lIFBWT1BfQ0FMTF9BUkcyKHgpCQkiUyIgKCh1bnNpZ25lZCBsb25nKSh4KSkKQEAgLTUwOSw2ICs1MTAsNyBAQAogCQkJCSI9YyIgKF9fZWN4KQogI2RlZmluZSBQVk9QX0NBTExfQ0xPQkJFUlMJUFZPUF9WQ0FMTF9DTE9CQkVSUywgIj1hIiAoX19lYXgpCiAKKy8qIHZvaWQgZnVuY3Rpb25zIGFyZSBzdGlsbCBhbGxvd2VkIFtyZV1heCBmb3Igc2NyYXRjaCAqLwogI2RlZmluZSBQVk9QX1ZDQUxMRUVfQ0xPQkJFUlMJIj1hIiAoX19lYXgpCiAjZGVmaW5lIFBWT1BfQ0FMTEVFX0NMT0JCRVJTCVBWT1BfVkNBTExFRV9DTE9CQkVSUwogCkBAIC01ODMsOCArNTg1LDggQEAKIAkJICAgICAgIFZFWFRSQV9DTE9CQkVSUywJCQkJCVwKIAkJICAgICAgIHByZSwgcG9zdCwgIyNfX1ZBX0FSR1NfXykKIAotI2RlZmluZSBfX1BWT1BfVkNBTExFRVNBVkUocmV0dHlwZSwgb3AsIHByZSwgcG9zdCwgLi4uKQkJCVwKLQlfX19fUFZPUF9DQUxMKHJldHR5cGUsIG9wLmZ1bmMsIENMQlJfUkVUX1JFRywJCQlcCisjZGVmaW5lIF9fUFZPUF9WQ0FMTEVFU0FWRShvcCwgcHJlLCBwb3N0LCAuLi4pCQkJCVwKKwlfX19fUFZPUF9WQ0FMTChvcC5mdW5jLCBDTEJSX1JFVF9SRUcsCQkJCVwKIAkJICAgICAgUFZPUF9WQ0FMTEVFX0NMT0JCRVJTLCAsCQkJCVwKIAkJICAgICAgcHJlLCBwb3N0LCAjI19fVkFfQVJHU19fKQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCmluZGV4IGY3NmExNjIuLmFkYThjMjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0xNDMsNyArMTQzLDExIEBACiBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBjcHVtYXNrICoKIGNwdW1hc2tfb2ZfcGNpYnVzKGNvbnN0IHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0JcmV0dXJuIGNwdW1hc2tfb2Zfbm9kZShfX3BjaWJ1c190b19ub2RlKGJ1cykpOworCWludCBub2RlOworCisJbm9kZSA9IF9fcGNpYnVzX3RvX25vZGUoYnVzKTsKKwlyZXR1cm4gKG5vZGUgPT0gLTEpID8gY3B1X29ubGluZV9tYXNrIDoKKwkJCSAgICAgIGNwdW1hc2tfb2Zfbm9kZShub2RlKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKaW5kZXggN2I0NjdiZi4uZDFmNGE3NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaApAQCAtMjc3LDYgKzI3Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CiAKIGV4dGVybiBwdGV2YWxfdCBfX3N1cHBvcnRlZF9wdGVfbWFzazsKK2V4dGVybiB2b2lkIHNldF9ueCh2b2lkKTsKIGV4dGVybiBpbnQgbnhfZW5hYmxlZDsKIAogI2RlZmluZSBwZ3Byb3Rfd3JpdGVjb21iaW5lCXBncHJvdF93cml0ZWNvbWJpbmUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggYzM0MjllOC4uYzk3ODY0OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAjZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0KQkoKih1bnNpZ25lZCBsb25nICopKCh0KS0+dGhyZWFkLnNwIC0gOCkpCiAKICNkZWZpbmUgdGFza19wdF9yZWdzKHRzaykJKChzdHJ1Y3QgcHRfcmVncyAqKSh0c2spLT50aHJlYWQuc3AwIC0gMSkKLSNkZWZpbmUgS1NUS19FU1AodHNrKQkJLTEgLyogc29ycnkuIGRvZXNuJ3Qgd29yayBmb3Igc3lzY2FsbC4gKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIEtTVEtfRVNQKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAjZW5kaWYgLyogQ09ORklHX1g4Nl82NCAqLwogCiBleHRlcm4gdm9pZCBzdGFydF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2lwLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCA2YTg0ZWQxLi4xZTc5Njc4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMTIxLDcgKzEyMSw2IEBACiAJc21wX29wcy5zZW5kX2NhbGxfZnVuY19zaW5nbGVfaXBpKGNwdSk7CiB9CiAKLSNkZWZpbmUgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2sgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2sKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzbXBfb3BzLnNlbmRfY2FsbF9mdW5jX2lwaShtYXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IDZmMDY5NWQuLjQwZTM3YjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtMTQzLDYgKzE0Myw3IEBACiAJCQkJfCAxKlNEX0JBTEFOQ0VfRk9SSwkJCVwKIAkJCQl8IDAqU0RfQkFMQU5DRV9XQUtFCQkJXAogCQkJCXwgMSpTRF9XQUtFX0FGRklORQkJCVwKKwkJCQl8IDAqU0RfUFJFRkVSX0xPQ0FMCQkJXAogCQkJCXwgMCpTRF9TSEFSRV9DUFVQT1dFUgkJCVwKIAkJCQl8IDAqU0RfUE9XRVJTQVZJTkdTX0JBTEFOQ0UJCVwKIAkJCQl8IDAqU0RfU0hBUkVfUEtHX1JFU09VUkNFUwkJXApAQCAtMTY1LDIxICsxNjYsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3B1X3RvX25vZGUoaW50IGNwdSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgZWFybHlfY3B1X3RvX25vZGUoaW50IGNwdSkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFza19vZl9ub2RlKGludCBub2RlKQotewotCXJldHVybiBjcHVfb25saW5lX21hc2s7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9ub2RlX3RvX2NwdW1hc2tfbWFwKHZvaWQpIHsgfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2h1Yi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKaW5kZXggMDRlYjZjOS4uZDE0MTRhZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3V2L3V2X21tcnMuaD4KKyNpbmNsdWRlIDxhc20vaXJxX3ZlY3RvcnMuaD4KKyNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgogCiAKIC8qCkBAIC0xMTQsNyArMTE2LDcgQEAKIC8qCiAgKiBUaGUgbGFyZ2VzdCBwb3NzaWJsZSBOQVNJRCBvZiBhIEMgb3IgTSBicmljayAoKyAyKQogICovCi0jZGVmaW5lIFVWX01BWF9OQVNJRF9WQUxVRQkoVVZfTUFYX05VTUFMSU5LX05PREVTICogMikKKyNkZWZpbmUgVVZfTUFYX05BU0lEX1ZBTFVFCShVVl9NQVhfTlVNQUxJTktfQkxBREVTICogMikKIAogc3RydWN0IHV2X3NjaXJfcyB7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CkBAIC0yMzAsNiArMjMyLDIwIEBACiAJcmV0dXJuIHV2X3NvY19waHlzX3JhbV90b19ncGEoX19wYSh2KSk7CiB9CiAKKy8qIGdub2RlIC0+IHBub2RlICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdXZfZ3BhX3RvX2dub2RlKHVuc2lnbmVkIGxvbmcgZ3BhKQoreworCXJldHVybiBncGEgPj4gdXZfaHViX2luZm8tPm1fdmFsOworfQorCisvKiBncGEgLT4gcG5vZGUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHV2X2dwYV90b19wbm9kZSh1bnNpZ25lZCBsb25nIGdwYSkKK3sKKwl1bnNpZ25lZCBsb25nIG5fbWFzayA9ICgxVUwgPDwgdXZfaHViX2luZm8tPm5fdmFsKSAtIDE7CisKKwlyZXR1cm4gdXZfZ3BhX3RvX2dub2RlKGdwYSkgJiBuX21hc2s7Cit9CisKIC8qIHBub2RlLCBvZmZzZXQgLS0+IHNvY2tldCB2aXJ0dWFsICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKnV2X3Bub2RlX29mZnNldF90b192YWRkcihpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewpAQCAtNDIxLDkgKzQzNywxNCBAQAogc3RhdGljIGlubGluZSB2b2lkIHV2X2h1Yl9zZW5kX2lwaShpbnQgcG5vZGUsIGludCBhcGljaWQsIGludCB2ZWN0b3IpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CisJdW5zaWduZWQgbG9uZyBkbW9kZSA9IGRlc3RfRml4ZWQ7CisKKwlpZiAodmVjdG9yID09IE5NSV9WRUNUT1IpCisJCWRtb2RlID0gZGVzdF9OTUk7CiAKIAl2YWwgPSAoMVVMIDw8IFVWSF9JUElfSU5UX1NFTkRfU0hGVCkgfAogCQkJKChhcGljaWQpIDw8IFVWSF9JUElfSU5UX0FQSUNfSURfU0hGVCkgfAorCQkJKGRtb2RlIDw8IFVWSF9JUElfSU5UX0RFTElWRVJZX01PREVfU0hGVCkgfAogCQkJKHZlY3RvciA8PCBVVkhfSVBJX0lOVF9WRUNUT1JfU0hGVCk7CiAJdXZfd3JpdGVfZ2xvYmFsX21tcjY0KHBub2RlLCBVVkhfSVBJX0lOVCwgdmFsKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvY3N0YXRlLmMKaW5kZXggOGM0NGMyMy4uNTljZGZhNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvY3N0YXRlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvY3N0YXRlLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkgKiBQNCwgQ29yZSBhbmQgYmV5b25kIENQVXMKIAkgKi8KIAlpZiAoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMICYmCi0JICAgIChjLT54ODYgPiAweDYgfHwgKGMtPng4NiA9PSA2ICYmIGMtPng4Nl9tb2RlbCA+PSAxNCkpKQorCSAgICAoYy0+eDg2ID4gMHhmIHx8IChjLT54ODYgPT0gNiAmJiBjLT54ODZfbW9kZWwgPj0gMTQpKSkKIAkJCWZsYWdzLT5ibV9jb250cm9sID0gMDsKIH0KIEVYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjayk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAubGRzLlMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAubGRzLlMKaW5kZXggN2RhMDBiNy4uMDYwZmZmOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLmxkcy5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5sZHMuUwpAQCAtNTcsNSArNTcsOCBAQAogCQkqKC5ub3RlKikKIAl9CiAKKwkvKgorCSAqIFRoZSBBU1NFUlQoKSBzaW5rIHRvIC4gaXMgaW50ZW50aW9uYWwsIGZvciBiaW51dGlscyAyLjE0IGNvbXBhdGliaWxpdHk6CisJICovCiAJLiA9IEFTU0VSVChfZW5kIDw9IFdBS0VVUF9TSVpFLCAiV2FrZXVwIHRvbyBiaWchIik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKaW5kZXggOThmMjMwZi4uMDI4NTUyMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwpAQCAtMTIyMCw2ICsxMjIwLDggQEAKIAlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzFdID0gMDsKIAlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzJdID0gMDsKIAorCWFtZF9pb21tdV9hcHBseV9lcnJhdHVtXzYzKGRldmlkKTsKKwogCS8qIGRlY3JlYXNlIHJlZmVyZW5jZSBjb3VudGVyICovCiAJZG9tYWluLT5kZXZfY250IC09IDE7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKaW5kZXggYjRiNjFkNC4uYzIwMDAxZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKQEAgLTI0MCw3ICsyNDAsNyBAQAogCXdyaXRlbChjdHJsLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19DT05UUk9MX09GRlNFVCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpb21tdV9mZWF0dXJlX2Rpc2FibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHU4IGJpdCkKK3N0YXRpYyB2b2lkIGlvbW11X2ZlYXR1cmVfZGlzYWJsZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTggYml0KQogewogCXUzMiBjdHJsOwogCkBAIC01MTksNiArNTE5LDI2IEBACiAJYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVtpXSB8PSAoMSA8PCBfYml0KTsKIH0KIAorc3RhdGljIGludCBnZXRfZGV2X2VudHJ5X2JpdCh1MTYgZGV2aWQsIHU4IGJpdCkKK3sKKwlpbnQgaSA9IChiaXQgPj4gNSkgJiAweDA3OworCWludCBfYml0ID0gYml0ICYgMHgxZjsKKworCXJldHVybiAoYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVtpXSAmICgxIDw8IF9iaXQpKSA+PiBfYml0OworfQorCisKK3ZvaWQgYW1kX2lvbW11X2FwcGx5X2VycmF0dW1fNjModTE2IGRldmlkKQoreworCWludCBzeXNtZ3Q7CisKKwlzeXNtZ3QgPSBnZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX1NZU01HVDEpIHwKKwkJIChnZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX1NZU01HVDIpIDw8IDEpOworCisJaWYgKHN5c21ndCA9PSAweDAxKQorCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX0lXKTsKK30KKwogLyogV3JpdGVzIHRoZSBzcGVjaWZpYyBJT01NVSBmb3IgYSBkZXZpY2UgaW50byB0aGUgcmxvb2t1cCB0YWJsZSAqLwogc3RhdGljIHZvaWQgX19pbml0IHNldF9pb21tdV9mb3JfZGV2aWNlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1MTYgZGV2aWQpCiB7CkBAIC01NDcsNiArNTY3LDggQEAKIAlpZiAoZmxhZ3MgJiBBQ1BJX0RFVkZMQUdfTElOVDEpCiAJCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfTElOVDFfUEFTUyk7CiAKKwlhbWRfaW9tbXVfYXBwbHlfZXJyYXR1bV82MyhkZXZpZCk7CisKIAlzZXRfaW9tbXVfZm9yX2RldmljZShpb21tdSwgZGV2aWQpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKaW5kZXggNjQ5NzBiOS4uZGM2OWYyOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwpAQCAtMjI3LDE3ICsyMjcsMTQgQEAKIAogCWNmZyA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmNmZyksIEdGUF9BVE9NSUMsIG5vZGUpOwogCWlmIChjZmcpIHsKLQkJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcl9ub2RlKCZjZmctPmRvbWFpbiwgR0ZQX0FUT01JQywgbm9kZSkpIHsKKwkJaWYgKCF6YWxsb2NfY3B1bWFza192YXJfbm9kZSgmY2ZnLT5kb21haW4sIEdGUF9BVE9NSUMsIG5vZGUpKSB7CiAJCQlrZnJlZShjZmcpOwogCQkJY2ZnID0gTlVMTDsKLQkJfSBlbHNlIGlmICghYWxsb2NfY3B1bWFza192YXJfbm9kZSgmY2ZnLT5vbGRfZG9tYWluLAorCQl9IGVsc2UgaWYgKCF6YWxsb2NfY3B1bWFza192YXJfbm9kZSgmY2ZnLT5vbGRfZG9tYWluLAogCQkJCQkJCSAgR0ZQX0FUT01JQywgbm9kZSkpIHsKIAkJCWZyZWVfY3B1bWFza192YXIoY2ZnLT5kb21haW4pOwogCQkJa2ZyZWUoY2ZnKTsKIAkJCWNmZyA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQljcHVtYXNrX2NsZWFyKGNmZy0+ZG9tYWluKTsKLQkJCWNwdW1hc2tfY2xlYXIoY2ZnLT5vbGRfZG9tYWluKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9ubWkuYwppbmRleCBjYjY2YTIyLi43ZmY2MWQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9ubWkuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9ubWkuYwpAQCAtNTA4LDE0ICs1MDgsMTQgQEAKIC8qCiAgKiBwcm9jIGhhbmRsZXIgZm9yIC9wcm9jL3N5cy9rZXJuZWwvbm1pCiAgKi8KLWludCBwcm9jX25taV9lbmFibGVkKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxlLAoraW50IHByb2Nfbm1pX2VuYWJsZWQoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IG9sZF9zdGF0ZTsKIAogCW5taV93YXRjaGRvZ19lbmFibGVkID0gKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSA+IDApID8gMSA6IDA7CiAJb2xkX3N0YXRlID0gbm1pX3dhdGNoZG9nX2VuYWJsZWQ7Ci0JcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCWlmICghIW9sZF9zdGF0ZSA9PSAhIW5taV93YXRjaGRvZ19lbmFibGVkKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKaW5kZXggZjVmNTg4Ni4uMzI2YzI1NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCkBAIC0zNTIsMTQgKzM1MiwxNCBAQAogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVkaXJfYWRkcnMpOyBpKyspIHsKIAkJYWxpYXMudiA9IHV2X3JlYWRfbG9jYWxfbW1yKHJlZGlyX2FkZHJzW2ldLmFsaWFzKTsKLQkJaWYgKGFsaWFzLnMuYmFzZSA9PSAwKSB7CisJCWlmIChhbGlhcy5zLmVuYWJsZSAmJiBhbGlhcy5zLmJhc2UgPT0gMCkgewogCQkJKnNpemUgPSAoMVVMIDw8IGFsaWFzLnMubV9hbGlhcyk7CiAJCQlyZWRpcmVjdC52ID0gdXZfcmVhZF9sb2NhbF9tbXIocmVkaXJfYWRkcnNbaV0ucmVkaXJlY3QpOwogCQkJKmJhc2UgPSAodW5zaWduZWQgbG9uZylyZWRpcmVjdC5zLmRlc3RfYmFzZSA8PCBERVNUX1NISUZUOwogCQkJcmV0dXJuOwogCQl9CiAJfQotCUJVRygpOworCSpiYXNlID0gKnNpemUgPSAwOwogfQogCiBlbnVtIG1hcF90eXBlIHttYXBfd2IsIG1hcF91Y307CkBAIC02MTksMTIgKzYxOSwxMiBAQAogCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+bG93bWVtX3JlbWFwX2Jhc2UgPSBsb3dtZW1fcmVkaXJfYmFzZTsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmxvd21lbV9yZW1hcF90b3AgPSBsb3dtZW1fcmVkaXJfc2l6ZTsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPm1fdmFsID0gbV92YWw7Ci0JCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5uX3ZhbCA9IG1fdmFsOworCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+bl92YWwgPSBuX3ZhbDsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPm51bWFfYmxhZGVfaWQgPSBibGFkZTsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmJsYWRlX3Byb2Nlc3Nvcl9pZCA9IGxjcHU7CiAJCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5wbm9kZSA9IHBub2RlOwogCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+cG5vZGVfbWFzayA9IHBub2RlX21hc2s7Ci0JCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5ncGFfbWFzayA9ICgxIDw8IChtX3ZhbCArIG5fdmFsKSkgLSAxOworCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+Z3BhX21hc2sgPSAoMVVMIDw8IChtX3ZhbCArIG5fdmFsKSkgLSAxOwogCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+Z25vZGVfdXBwZXIgPSBnbm9kZV91cHBlcjsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmdub2RlX2V4dHJhID0gZ25vZGVfZXh0cmE7CiAJCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5nbG9iYWxfbW1yX2Jhc2UgPSBtbXJfYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbmplY3QuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbmplY3QuYwppbmRleCA3MDI5ZjBlLi40NzI3NjNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UtaW5qZWN0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWluamVjdC5jCkBAIC05OCw4ICs5OCw5IEBACiB9OwogCiAvKiBJbmplY3QgbWNlIG9uIGN1cnJlbnQgQ1BVICovCi1zdGF0aWMgaW50IHJhaXNlX2xvY2FsKHN0cnVjdCBtY2UgKm0pCitzdGF0aWMgaW50IHJhaXNlX2xvY2FsKHZvaWQpCiB7CisJc3RydWN0IG1jZSAqbSA9ICZfX2dldF9jcHVfdmFyKGluamVjdG0pOwogCWludCBjb250ZXh0ID0gTUNKX0NUWChtLT5pbmplY3RfZmxhZ3MpOwogCWludCByZXQgPSAwOwogCWludCBjcHUgPSBtLT5leHRjcHU7CkBAIC0xNjcsMTIgKzE2OCwxMiBAQAogCQkJfQogCQkJY3B1X3JlbGF4KCk7CiAJCX0KLQkJcmFpc2VfbG9jYWwobSk7CisJCXJhaXNlX2xvY2FsKCk7CiAJCXB1dF9jcHUoKTsKIAkJcHV0X29ubGluZV9jcHVzKCk7CiAJfSBlbHNlCiAjZW5kaWYKLQkJcmFpc2VfbG9jYWwobSk7CisJCXJhaXNlX2xvY2FsKCk7CiB9CiAKIC8qIEVycm9yIGluamVjdGlvbiBpbnRlcmZhY2UgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKaW5kZXggMmY1YWFiMi4uNzIxYTc3YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKQEAgLTg1LDYgKzg1LDE4IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IG1jZSwgbWNlc19zZWVuKTsKIHN0YXRpYyBpbnQJCQljcHVfbWlzc2luZzsKIAorc3RhdGljIHZvaWQgZGVmYXVsdF9kZWNvZGVfbWNlKHN0cnVjdCBtY2UgKm0pCit7CisJcHJfZW1lcmcoIk5vIGh1bWFuIHJlYWRhYmxlIE1DRSBkZWNvZGluZyBzdXBwb3J0IG9uIHRoaXMgQ1BVIHR5cGUuXG4iKTsKKwlwcl9lbWVyZygiUnVuIHRoZSBtZXNzYWdlIHRocm91Z2ggJ21jZWxvZyAtLWFzY2lpJyB0byBkZWNvZGUuXG4iKTsKK30KKworLyoKKyAqIENQVS9jaGlwc2V0IHNwZWNpZmljIEVEQUMgY29kZSBjYW4gcmVnaXN0ZXIgYSBjYWxsYmFjayBoZXJlIHRvIHByaW50CisgKiBNQ0UgZXJyb3JzIGluIGEgaHVtYW4tcmVhZGFibGUgZm9ybToKKyAqLwordm9pZCAoKng4Nl9tY2VfZGVjb2RlX2NhbGxiYWNrKShzdHJ1Y3QgbWNlICptKSA9IGRlZmF1bHRfZGVjb2RlX21jZTsKK0VYUE9SVF9TWU1CT0woeDg2X21jZV9kZWNvZGVfY2FsbGJhY2spOwogCiAvKiBNQ0EgYmFua3MgcG9sbGVkIGJ5IHRoZSBwZXJpb2QgcG9sbGluZyB0aW1lciBmb3IgY29ycmVjdGVkIGV2ZW50cyAqLwogREVGSU5FX1BFUl9DUFUobWNlX2JhbmtzX3QsIG1jZV9wb2xsX2JhbmtzKSA9IHsKQEAgLTE2NSw0OSArMTc3LDQ2IEBACiAJc2V0X2JpdCgwLCAmbWNlX25lZWRfbm90aWZ5KTsKIH0KIAotdm9pZCBfX3dlYWsgZGVjb2RlX21jZShzdHJ1Y3QgbWNlICptKQotewotCXJldHVybjsKLX0KLQogc3RhdGljIHZvaWQgcHJpbnRfbWNlKHN0cnVjdCBtY2UgKm0pCiB7Ci0JcHJpbnRrKEtFUk5fRU1FUkcKLQkgICAgICAgIkNQVSAlZDogTWFjaGluZSBDaGVjayBFeGNlcHRpb246ICUxNkx4IEJhbmsgJWQ6ICUwMTZMeFxuIiwKKwlwcl9lbWVyZygiQ1BVICVkOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbjogJTE2THggQmFuayAlZDogJTAxNkx4XG4iLAogCSAgICAgICBtLT5leHRjcHUsIG0tPm1jZ3N0YXR1cywgbS0+YmFuaywgbS0+c3RhdHVzKTsKKwogCWlmIChtLT5pcCkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiUklQJXMgJTAyeDo8JTAxNkx4PiAiLAotCQkgICAgICAgIShtLT5tY2dzdGF0dXMgJiBNQ0dfU1RBVFVTX0VJUFYpID8gIiAhSU5FWEFDVCEiIDogIiIsCi0JCSAgICAgICBtLT5jcywgbS0+aXApOworCQlwcl9lbWVyZygiUklQJXMgJTAyeDo8JTAxNkx4PiAiLAorCQkJIShtLT5tY2dzdGF0dXMgJiBNQ0dfU1RBVFVTX0VJUFYpID8gIiAhSU5FWEFDVCEiIDogIiIsCisJCQkJbS0+Y3MsIG0tPmlwKTsKKwogCQlpZiAobS0+Y3MgPT0gX19LRVJORUxfQ1MpCiAJCQlwcmludF9zeW1ib2woInslc30iLCBtLT5pcCk7Ci0JCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJCXByX2NvbnQoIlxuIik7CiAJfQotCXByaW50ayhLRVJOX0VNRVJHICJUU0MgJWxseCAiLCBtLT50c2MpOwotCWlmIChtLT5hZGRyKQotCQlwcmludGsoS0VSTl9DT05UICJBRERSICVsbHggIiwgbS0+YWRkcik7Ci0JaWYgKG0tPm1pc2MpCi0JCXByaW50ayhLRVJOX0NPTlQgIk1JU0MgJWxseCAiLCBtLT5taXNjKTsKLQlwcmludGsoS0VSTl9DT05UICJcbiIpOwotCXByaW50ayhLRVJOX0VNRVJHICJQUk9DRVNTT1IgJXU6JXggVElNRSAlbGx1IFNPQ0tFVCAldSBBUElDICV4XG4iLAotCQkJbS0+Y3B1dmVuZG9yLCBtLT5jcHVpZCwgbS0+dGltZSwgbS0+c29ja2V0aWQsCi0JCQltLT5hcGljaWQpOwogCi0JZGVjb2RlX21jZShtKTsKKwlwcl9lbWVyZygiVFNDICVsbHggIiwgbS0+dHNjKTsKKwlpZiAobS0+YWRkcikKKwkJcHJfY29udCgiQUREUiAlbGx4ICIsIG0tPmFkZHIpOworCWlmIChtLT5taXNjKQorCQlwcl9jb250KCJNSVNDICVsbHggIiwgbS0+bWlzYyk7CisKKwlwcl9jb250KCJcbiIpOworCXByX2VtZXJnKCJQUk9DRVNTT1IgJXU6JXggVElNRSAlbGx1IFNPQ0tFVCAldSBBUElDICV4XG4iLAorCQltLT5jcHV2ZW5kb3IsIG0tPmNwdWlkLCBtLT50aW1lLCBtLT5zb2NrZXRpZCwgbS0+YXBpY2lkKTsKKworCS8qCisJICogUHJpbnQgb3V0IGh1bWFuLXJlYWRhYmxlIGRldGFpbHMgYWJvdXQgdGhlIE1DRSBlcnJvciwKKwkgKiAoaWYgdGhlIENQVSBoYXMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoYXQpOgorCSAqLworCXg4Nl9tY2VfZGVjb2RlX2NhbGxiYWNrKG0pOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF9tY2VfaGVhZCh2b2lkKQogewotCXByaW50ayhLRVJOX0VNRVJHICJcbkhBUkRXQVJFIEVSUk9SXG4iKTsKKwlwcl9lbWVyZygiXG5IQVJEV0FSRSBFUlJPUlxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X21jZV90YWlsKHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIlRoaXMgaXMgbm90IGEgc29mdHdhcmUgcHJvYmxlbSFcbiIKLSNpZiAoIWRlZmluZWQoQ09ORklHX0VEQUMpIHx8ICFkZWZpbmVkKENPTkZJR19DUFVfU1VQX0FNRCkpCi0JICAgICAgICJSdW4gdGhyb3VnaCBtY2Vsb2cgLS1hc2NpaSB0byBkZWNvZGUgYW5kIGNvbnRhY3QgeW91ciBoYXJkd2FyZSB2ZW5kb3JcbiIKLSNlbmRpZgotCSAgICAgICApOworCXByX2VtZXJnKCJUaGlzIGlzIG5vdCBhIHNvZnR3YXJlIHByb2JsZW0hXG4iKTsKIH0KIAogI2RlZmluZSBQQU5JQ19USU1FT1VUIDUgLyogNSBzZWNvbmRzICovCkBAIC0yMjEsNiArMjMwLDcgQEAKIHN0YXRpYyB2b2lkIHdhaXRfZm9yX3BhbmljKHZvaWQpCiB7CiAJbG9uZyB0aW1lb3V0ID0gUEFOSUNfVElNRU9VVCpVU0VDX1BFUl9TRUM7CisKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJd2hpbGUgKHRpbWVvdXQtLSA+IDApCkBAIC0yODgsNiArMjk4LDcgQEAKIHN0YXRpYyBpbnQgbXNyX3RvX29mZnNldCh1MzIgbXNyKQogewogCXVuc2lnbmVkIGJhbmsgPSBfX2dldF9jcHVfdmFyKGluamVjdG0uYmFuayk7CisKIAlpZiAobXNyID09IHJpcF9tc3IpCiAJCXJldHVybiBvZmZzZXRvZihzdHJ1Y3QgbWNlLCBpcCk7CiAJaWYgKG1zciA9PSBNU1JfSUEzMl9NQ3hfU1RBVFVTKGJhbmspKQpAQCAtMzA1LDEzICszMTYsMjUgQEAKIHN0YXRpYyB1NjQgbWNlX3JkbXNybCh1MzIgbXNyKQogewogCXU2NCB2OworCiAJaWYgKF9fZ2V0X2NwdV92YXIoaW5qZWN0bSkuZmluaXNoZWQpIHsKIAkJaW50IG9mZnNldCA9IG1zcl90b19vZmZzZXQobXNyKTsKKwogCQlpZiAob2Zmc2V0IDwgMCkKIAkJCXJldHVybiAwOwogCQlyZXR1cm4gKih1NjQgKikoKGNoYXIgKikmX19nZXRfY3B1X3ZhcihpbmplY3RtKSArIG9mZnNldCk7CiAJfQotCXJkbXNybChtc3IsIHYpOworCisJaWYgKHJkbXNybF9zYWZlKG1zciwgJnYpKSB7CisJCVdBUk5fT05DRSgxLCAibWNlOiBVbmFibGUgdG8gcmVhZCBtc3IgJWQhXG4iLCBtc3IpOworCQkvKgorCQkgKiBSZXR1cm4gemVybyBpbiBjYXNlIHRoZSBhY2Nlc3MgZmF1bHRlZC4gVGhpcyBzaG91bGQKKwkJICogbm90IGhhcHBlbiBub3JtYWxseSBidXQgY2FuIGhhcHBlbiBpZiB0aGUgQ1BVIGRvZXMKKwkJICogc29tZXRoaW5nIHdlaXJkLCBvciBpZiB0aGUgY29kZSBpcyBidWdneS4KKwkJICovCisJCXYgPSAwOworCX0KKwogCXJldHVybiB2OwogfQogCkBAIC0zMTksNiArMzQyLDcgQEAKIHsKIAlpZiAoX19nZXRfY3B1X3ZhcihpbmplY3RtKS5maW5pc2hlZCkgewogCQlpbnQgb2Zmc2V0ID0gbXNyX3RvX29mZnNldChtc3IpOworCiAJCWlmIChvZmZzZXQgPj0gMCkKIAkJCSoodTY0ICopKChjaGFyICopJl9fZ2V0X2NwdV92YXIoaW5qZWN0bSkgKyBvZmZzZXQpID0gdjsKIAkJcmV0dXJuOwpAQCAtNDE1LDcgKzQzOSw3IEBACiAJCW0tPmlwID0gbWNlX3JkbXNybChyaXBfbXNyKTsKIH0KIAotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQyAKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIC8qCiAgKiBDYWxsZWQgYWZ0ZXIgaW50ZXJydXB0cyBoYXZlIGJlZW4gcmVlbmFibGVkIGFnYWluCiAgKiB3aGVuIGEgTUNFIGhhcHBlbmVkIGR1cmluZyBhbiBpbnRlcnJ1cHRzIG9mZiByZWdpb24KQEAgLTExNzIsNiArMTE5Niw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCWZvciAoaSA9IDA7IGkgPCBiYW5rczsgaSsrKSB7CiAJCXN0cnVjdCBtY2VfYmFuayAqYiA9ICZtY2VfYmFua3NbaV07CisKIAkJYi0+Y3RsID0gLTFVTEw7CiAJCWItPmluaXQgPSAxOwogCX0KQEAgLTExODksNyArMTIxNCw4IEBACiAJcmRtc3JsKE1TUl9JQTMyX01DR19DQVAsIGNhcCk7CiAKIAliID0gY2FwICYgTUNHX0JBTktDTlRfTUFTSzsKLQlwcmludGsoS0VSTl9JTkZPICJtY2U6IENQVSBzdXBwb3J0cyAlZCBNQ0UgYmFua3NcbiIsIGIpOworCWlmICghYmFua3MpCisJCXByaW50ayhLRVJOX0lORk8gIm1jZTogQ1BVIHN1cHBvcnRzICVkIE1DRSBiYW5rc1xuIiwgYik7CiAKIAlpZiAoYiA+IE1BWF9OUl9CQU5LUykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCkBAIC0xMjAzLDYgKzEyMjksNyBAQAogCWJhbmtzID0gYjsKIAlpZiAoIW1jZV9iYW5rcykgewogCQlpbnQgZXJyID0gbWNlX2JhbmtzX2luaXQoKTsKKwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0xMjM3LDYgKzEyNjQsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGJhbmtzOyBpKyspIHsKIAkJc3RydWN0IG1jZV9iYW5rICpiID0gJm1jZV9iYW5rc1tpXTsKKwogCQlpZiAoIWItPmluaXQpCiAJCQljb250aW51ZTsKIAkJd3Jtc3JsKE1TUl9JQTMyX01DeF9DVEwoaSksIGItPmN0bCk7CkBAIC0xNjI2LDYgKzE2NTQsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGJhbmtzOyBpKyspIHsKIAkJc3RydWN0IG1jZV9iYW5rICpiID0gJm1jZV9iYW5rc1tpXTsKKwogCQlpZiAoYi0+aW5pdCkKIAkJCXdybXNybChNU1JfSUEzMl9NQ3hfQ1RMKGkpLCAwKTsKIAl9CkBAIC0xOTExLDYgKzE5NDAsNyBAQAogCQljbWNpX2NsZWFyKCk7CiAJZm9yIChpID0gMDsgaSA8IGJhbmtzOyBpKyspIHsKIAkJc3RydWN0IG1jZV9iYW5rICpiID0gJm1jZV9iYW5rc1tpXTsKKwogCQlpZiAoYi0+aW5pdCkKIAkJCXdybXNybChNU1JfSUEzMl9NQ3hfQ1RMKGkpLCAwKTsKIAl9CkBAIC0xOTI4LDYgKzE5NTgsNyBAQAogCQljbWNpX3JlZW5hYmxlKCk7CiAJZm9yIChpID0gMDsgaSA8IGJhbmtzOyBpKyspIHsKIAkJc3RydWN0IG1jZV9iYW5rICpiID0gJm1jZV9iYW5rc1tpXTsKKwogCQlpZiAoYi0+aW5pdCkKIAkJCXdybXNybChNU1JfSUEzMl9NQ3hfQ1RMKGkpLCBiLT5jdGwpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2ludGVsLmMKaW5kZXggODg5ZjY2NS4uN2M3ODU2MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2ludGVsLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKaW5kZXggNjNhNTZkMS4uYjNhMWRiYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jCkBAIC0zNCwyMCArMzQsMzEgQEAKIC8qIEhvdyBsb25nIHRvIHdhaXQgYmV0d2VlbiByZXBvcnRpbmcgdGhlcm1hbCBldmVudHMgKi8KICNkZWZpbmUgQ0hFQ0tfSU5URVJWQUwJCSgzMDAgKiBIWikKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKF9fdTY0LCBuZXh0X2NoZWNrKSA9IElOSVRJQUxfSklGRklFUzsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB0aGVybWFsX3Rocm90dGxlX2NvdW50KTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCB0aGVybWFsX3Rocm90dGxlX2FjdGl2ZSk7CisvKgorICogQ3VycmVudCB0aGVybWFsIHRocm90dGxpbmcgc3RhdGU6CisgKi8KK3N0cnVjdCB0aGVybWFsX3N0YXRlIHsKKwlib29sCQkJaXNfdGhyb3R0bGVkOwogCi1zdGF0aWMgYXRvbWljX3QgdGhlcm1fdGhyb3RfZW4JCT0gQVRPTUlDX0lOSVQoMCk7CisJdTY0CQkJbmV4dF9jaGVjazsKKwl1bnNpZ25lZCBsb25nCQl0aHJvdHRsZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nCQlsYXN0X3Rocm90dGxlX2NvdW50OworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0aGVybWFsX3N0YXRlLCB0aGVybWFsX3N0YXRlKTsKKworc3RhdGljIGF0b21pY190IHRoZXJtX3Rocm90X2VuCT0gQVRPTUlDX0lOSVQoMCk7CiAKICNpZmRlZiBDT05GSUdfU1lTRlMKICNkZWZpbmUgZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9vbmVfcm8oX25hbWUpCQkJCVwKIAlzdGF0aWMgU1lTREVWX0FUVFIoX25hbWUsIDA0NDQsIHRoZXJtX3Rocm90X3N5c2Rldl9zaG93XyMjX25hbWUsIE5VTEwpCiAKICNkZWZpbmUgZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9zaG93X2Z1bmMobmFtZSkJCQlcCi1zdGF0aWMgc3NpemVfdCB0aGVybV90aHJvdF9zeXNkZXZfc2hvd18jI25hbWUoc3RydWN0IHN5c19kZXZpY2UgKmRldiwJXAotCQkJCQlzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJCQkgICAgICBjaGFyICpidWYpCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCB0aGVybV90aHJvdF9zeXNkZXZfc2hvd18jI25hbWUoCQkJCVwKKwkJCXN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCQkJCVwKKwkJCXN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLAkJCVwKKwkJCWNoYXIgKmJ1ZikJCQkJCVwKIHsJCQkJCQkJCQlcCiAJdW5zaWduZWQgaW50IGNwdSA9IGRldi0+aWQ7CQkJCQlcCiAJc3NpemVfdCByZXQ7CQkJCQkJCVwKQEAgLTU1LDcgKzY2LDcgQEAKIAlwcmVlbXB0X2Rpc2FibGUoKTsJLyogQ1BVIGhvdHBsdWcgKi8JCQlcCiAJaWYgKGNwdV9vbmxpbmUoY3B1KSkJCQkJCQlcCiAJCXJldCA9IHNwcmludGYoYnVmLCAiJWx1XG4iLAkJCQlcCi0JCQkgICAgICBwZXJfY3B1KHRoZXJtYWxfdGhyb3R0bGVfIyNuYW1lLCBjcHUpKTsJXAorCQkJICAgICAgcGVyX2NwdSh0aGVybWFsX3N0YXRlLCBjcHUpLm5hbWUpOwlcCiAJZWxzZQkJCQkJCQkJXAogCQlyZXQgPSAwOwkJCQkJCVwKIAlwcmVlbXB0X2VuYWJsZSgpOwkJCQkJCVwKQEAgLTYzLDExICs3NCwxMSBAQAogCXJldHVybiByZXQ7CQkJCQkJCVwKIH0KIAotZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9zaG93X2Z1bmMoY291bnQpOwotZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9vbmVfcm8oY291bnQpOworZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9zaG93X2Z1bmModGhyb3R0bGVfY291bnQpOworZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9vbmVfcm8odGhyb3R0bGVfY291bnQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdGhlcm1hbF90aHJvdHRsZV9hdHRyc1tdID0gewotCSZhdHRyX2NvdW50LmF0dHIsCisJJmF0dHJfdGhyb3R0bGVfY291bnQuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC05MywzMyArMTA0LDM5IEBACiAgKiAgICAgICAgICAxIDogRXZlbnQgc2hvdWxkIGJlIGxvZ2dlZCBmdXJ0aGVyLCBhbmQgYSBtZXNzYWdlIGhhcyBiZWVuCiAgKiAgICAgICAgICAgICAgcHJpbnRlZCB0byB0aGUgc3lzbG9nLgogICovCi1zdGF0aWMgaW50IHRoZXJtX3Rocm90X3Byb2Nlc3MoaW50IGN1cnIpCitzdGF0aWMgaW50IHRoZXJtX3Rocm90X3Byb2Nlc3MoYm9vbCBpc190aHJvdHRsZWQpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlfX3U2NCB0bXBfamlmZnMgPSBnZXRfamlmZmllc182NCgpOwotCWJvb2wgd2FzX3Rocm90dGxlZCA9IF9fZ2V0X2NwdV92YXIodGhlcm1hbF90aHJvdHRsZV9hY3RpdmUpOwotCWJvb2wgaXNfdGhyb3R0bGVkID0gX19nZXRfY3B1X3Zhcih0aGVybWFsX3Rocm90dGxlX2FjdGl2ZSkgPSBjdXJyOworCXN0cnVjdCB0aGVybWFsX3N0YXRlICpzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgdGhpc19jcHU7CisJYm9vbCB3YXNfdGhyb3R0bGVkOworCXU2NCBub3c7CisKKwl0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlub3cgPSBnZXRfamlmZmllc182NCgpOworCXN0YXRlID0gJnBlcl9jcHUodGhlcm1hbF9zdGF0ZSwgdGhpc19jcHUpOworCisJd2FzX3Rocm90dGxlZCA9IHN0YXRlLT5pc190aHJvdHRsZWQ7CisJc3RhdGUtPmlzX3Rocm90dGxlZCA9IGlzX3Rocm90dGxlZDsKIAogCWlmIChpc190aHJvdHRsZWQpCi0JCV9fZ2V0X2NwdV92YXIodGhlcm1hbF90aHJvdHRsZV9jb3VudCkrKzsKKwkJc3RhdGUtPnRocm90dGxlX2NvdW50Kys7CiAKLQlpZiAoISh3YXNfdGhyb3R0bGVkIF4gaXNfdGhyb3R0bGVkKSAmJgotCSAgICB0aW1lX2JlZm9yZTY0KHRtcF9qaWZmcywgX19nZXRfY3B1X3ZhcihuZXh0X2NoZWNrKSkpCisJaWYgKHRpbWVfYmVmb3JlNjQobm93LCBzdGF0ZS0+bmV4dF9jaGVjaykgJiYKKwkJCXN0YXRlLT50aHJvdHRsZV9jb3VudCAhPSBzdGF0ZS0+bGFzdF90aHJvdHRsZV9jb3VudCkKIAkJcmV0dXJuIDA7CiAKLQlfX2dldF9jcHVfdmFyKG5leHRfY2hlY2spID0gdG1wX2ppZmZzICsgQ0hFQ0tfSU5URVJWQUw7CisJc3RhdGUtPm5leHRfY2hlY2sgPSBub3cgKyBDSEVDS19JTlRFUlZBTDsKKwlzdGF0ZS0+bGFzdF90aHJvdHRsZV9jb3VudCA9IHN0YXRlLT50aHJvdHRsZV9jb3VudDsKIAogCS8qIGlmIHdlIGp1c3QgZW50ZXJlZCB0aGUgdGhlcm1hbCBldmVudCAqLwogCWlmIChpc190aHJvdHRsZWQpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJWQ6IFRlbXBlcmF0dXJlIGFib3ZlIHRocmVzaG9sZCwgIgotCQkgICAgICAgImNwdSBjbG9jayB0aHJvdHRsZWQgKHRvdGFsIGV2ZW50cyA9ICVsdSlcbiIsCi0JCSAgICAgICBjcHUsIF9fZ2V0X2NwdV92YXIodGhlcm1hbF90aHJvdHRsZV9jb3VudCkpOworCQlwcmludGsoS0VSTl9DUklUICJDUFUlZDogVGVtcGVyYXR1cmUgYWJvdmUgdGhyZXNob2xkLCBjcHUgY2xvY2sgdGhyb3R0bGVkICh0b3RhbCBldmVudHMgPSAlbHUpXG4iLCB0aGlzX2NwdSwgc3RhdGUtPnRocm90dGxlX2NvdW50KTsKIAogCQlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7CiAJCXJldHVybiAxOwogCX0KIAlpZiAod2FzX3Rocm90dGxlZCkgewotCQlwcmludGsoS0VSTl9JTkZPICJDUFUlZDogVGVtcGVyYXR1cmUvc3BlZWQgbm9ybWFsXG4iLCBjcHUpOworCQlwcmludGsoS0VSTl9JTkZPICJDUFUlZDogVGVtcGVyYXR1cmUvc3BlZWQgbm9ybWFsXG4iLCB0aGlzX2NwdSk7CiAJCXJldHVybiAxOwogCX0KIApAQCAtMjEzLDcgKzIzMCw3IEBACiAJX191NjQgbXNyX3ZhbDsKIAogCXJkbXNybChNU1JfSUEzMl9USEVSTV9TVEFUVVMsIG1zcl92YWwpOwotCWlmICh0aGVybV90aHJvdF9wcm9jZXNzKG1zcl92YWwgJiBUSEVSTV9TVEFUVVNfUFJPQ0hPVCkpCisJaWYgKHRoZXJtX3Rocm90X3Byb2Nlc3MoKG1zcl92YWwgJiBUSEVSTV9TVEFUVVNfUFJPQ0hPVCkgIT0gMCkpCiAJCW1jZV9sb2dfdGhlcm1fdGhyb3RfZXZlbnQobXNyX3ZhbCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9jbGVhbnVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvY2xlYW51cC5jCmluZGV4IDMxNTczOGMuLjczYzg2ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9jbGVhbnVwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2NsZWFudXAuYwpAQCAtODQ2LDcgKzg0Niw3IEBACiAJc29ydChyYW5nZSwgbnJfcmFuZ2UsIHNpemVvZihzdHJ1Y3QgcmVzX3JhbmdlKSwgY21wX3JhbmdlLCBOVUxMKTsKIAogCXJhbmdlX3N1bXMgPSBzdW1fcmFuZ2VzKHJhbmdlLCBucl9yYW5nZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAidG90YWwgUkFNIGNvdmVycmVkOiAlbGRNXG4iLAorCXByaW50ayhLRVJOX0lORk8gInRvdGFsIFJBTSBjb3ZlcmVkOiAlbGRNXG4iLAogCSAgICAgICByYW5nZV9zdW1zID4+ICgyMCAtIFBBR0VfU0hJRlQpKTsKIAogCWlmIChtdHJyX2NodW5rX3NpemUgJiYgbXRycl9ncmFuX3NpemUpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9pZi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2lmLmMKaW5kZXggZjA0ZTcyNS4uM2MxYjEyZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2lmLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2lmLmMKQEAgLTk2LDE3ICs5NiwyNCBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBiYXNlLCBzaXplOwogCWNoYXIgKnB0cjsKIAljaGFyIGxpbmVbTElORV9TSVpFXTsKKwlpbnQgbGVuZ3RoOwogCXNpemVfdCBsaW5lbGVuOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwotCWlmICghbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbXNldChsaW5lLCAwLCBMSU5FX1NJWkUpOwotCWlmIChsZW4gPiBMSU5FX1NJWkUpCi0JCWxlbiA9IExJTkVfU0laRTsKLQlpZiAoY29weV9mcm9tX3VzZXIobGluZSwgYnVmLCBsZW4gLSAxKSkKKworCWxlbmd0aCA9IGxlbjsKKwlsZW5ndGgtLTsKKworCWlmIChsZW5ndGggPiBMSU5FX1NJWkUgLSAxKQorCQlsZW5ndGggPSBMSU5FX1NJWkUgLSAxOworCisJaWYgKGxlbmd0aCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGxpbmUsIGJ1ZiwgbGVuZ3RoKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlsaW5lbGVuID0gc3RybGVuKGxpbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwppbmRleCBhM2M3YWRiLi5iNTgwMWMzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwpAQCAtMTc5MCw2ICsxNzkwLDkgQEAKIHZvaWQgc2V0X3BlcmZfZXZlbnRfcGVuZGluZyh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCWlmICgheDg2X3BtdS5hcGljIHx8ICF4ODZfcG11X2luaXRpYWxpemVkKCkpCisJCXJldHVybjsKKwogCWFwaWMtPnNlbmRfSVBJX3NlbGYoTE9DQUxfUEVORElOR19WRUNUT1IpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3Jhc2hfZHVtcF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2NyYXNoX2R1bXBfMzIuYwppbmRleCBmN2NkYjNiLi5jZDk3Y2UxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3Jhc2hfZHVtcF8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcmFzaF9kdW1wXzMyLmMKQEAgLTE2LDYgKzE2LDIyIEBACiAvKiBTdG9yZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZWxmIGhlYWRlciBvZiBjcmFzaCBpbWFnZS4gKi8KIHVuc2lnbmVkIGxvbmcgbG9uZyBlbGZjb3JlaGRyX2FkZHIgPSBFTEZDT1JFX0FERFJfTUFYOwogCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3Jhc2hlZF9wZm5fdmFsaWQodW5zaWduZWQgbG9uZyBwZm4pCit7CisjaWZuZGVmIENPTkZJR19YODZfUEFFCisJLyoKKwkgKiBub24tUEFFIGtkdW1wIGtlcm5lbCBleGVjdXRlZCBmcm9tIGEgUEFFIG9uZSB3aWxsIGNyb3AgaGlnaCBwdGUKKwkgKiBiaXRzIGFuZCBwb2tlIHVud2FudGVkIHNwYWNlIGNvdW50aW5nIGFnYWluIGZyb20gYWRkcmVzcyAwLCB3ZQorCSAqIGRvbid0IHdhbnQgdGhhdC4gcHRlIG11c3QgZml0IGludG8gdW5zaWduZWQgbG9uZy4gSW4gZmFjdCB0aGUKKwkgKiB0ZXN0IGNoZWNrcyBoaWdoIDEyIGJpdHMgZm9yIGJlaW5nIHplcm8gKHBmbiB3aWxsIGJlIHNoaWZ0ZWQgbGVmdAorCSAqIGJ5IFBBR0VfU0hJRlQpLgorCSAqLworCXJldHVybiBwdGVfcGZuKHBmbl9wdGUocGZuLCBfX3BncHJvdCgwKSkpID09IHBmbjsKKyNlbHNlCisJcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKwogLyoqCiAgKiBjb3B5X29sZG1lbV9wYWdlIC0gY29weSBvbmUgcGFnZSBmcm9tICJvbGRtZW0iCiAgKiBAcGZuOiBwYWdlIGZyYW1lIG51bWJlciB0byBiZSBjb3BpZWQKQEAgLTQxLDYgKzU3LDkgQEAKIAlpZiAoIWNzaXplKQogCQlyZXR1cm4gMDsKIAorCWlmICghaXNfY3Jhc2hlZF9wZm5fdmFsaWQocGZuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKIAl2YWRkciA9IGttYXBfYXRvbWljX3BmbihwZm4sIEtNX1BURTApOwogCiAJaWYgKCF1c2VyYnVmKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKaW5kZXggYmNhNWZiYS4uZjdkZDJhNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwpAQCAtNSw3ICs1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYwppbmRleCA1NGIwYTMyLi5hMDcxZTZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2U4MjAuYyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKaW5kZXggODU0MTliYi4uZDE3ZDQ4MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2U4MjAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCkBAIC0xMzc4LDggKzEzNzgsOCBAQAogCWlmIChtYiA8IDE2KQogCQlyZXR1cm4gMTAyNCoxMDI0OwogCi0JLyogVG8gMzJNQiBmb3IgYW55dGhpbmcgYWJvdmUgdGhhdCAqLwotCXJldHVybiAzMioxMDI0KjEwMjQ7CisJLyogVG8gNjRNQiBmb3IgYW55dGhpbmcgYWJvdmUgdGhhdCAqLworCXJldHVybiA2NCoxMDI0KjEwMjQ7CiB9CiAKICNkZWZpbmUgTUFYX1JFU09VUkNFX1NJWkUgKChyZXNvdXJjZV9zaXplX3QpLTEpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHlfcHJpbnRrLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZWFybHlfcHJpbnRrLmMKaW5kZXggMmFjZmQzZi4uYjljODMwYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseV9wcmludGsuYwpAQCAtMTc4LDYgKzE3OCwxMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZWFybHlfY29uc29sZV9yZWdpc3RlcihzdHJ1Y3QgY29uc29sZSAqY29uLCBpbnQga2VlcF9lYXJseSkKIHsKKwlpZiAoZWFybHlfY29uc29sZS0+aW5kZXggIT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRVJST1I6IGVhcmx5cHJpbnRrPSAlcyBhbHJlYWR5IHVzZWRcbiIsCisJCSAgICAgICBjb24tPm5hbWUpOworCQlyZXR1cm47CisJfQogCWVhcmx5X2NvbnNvbGUgPSBjb247CiAJaWYgKGtlZXBfZWFybHkpCiAJCWVhcmx5X2NvbnNvbGUtPmZsYWdzICY9IH5DT05fQk9PVDsKQEAgLTIwMSw4ICsyMDYsMTEgQEAKIAogCXdoaWxlICgqYnVmICE9ICdcMCcpIHsKIAkJaWYgKCFzdHJuY21wKGJ1ZiwgInNlcmlhbCIsIDYpKSB7Ci0JCQllYXJseV9zZXJpYWxfaW5pdChidWYgKyA2KTsKKwkJCWJ1ZiArPSA2OworCQkJZWFybHlfc2VyaWFsX2luaXQoYnVmKTsKIAkJCWVhcmx5X2NvbnNvbGVfcmVnaXN0ZXIoJmVhcmx5X3NlcmlhbF9jb25zb2xlLCBrZWVwKTsKKwkJCWlmICghc3RybmNtcChidWYsICIsdHR5UyIsIDUpKQorCQkJCWJ1ZiArPSA1OwogCQl9CiAJCWlmICghc3RybmNtcChidWYsICJ0dHlTIiwgNCkpIHsKIAkJCWVhcmx5X3NlcmlhbF9pbml0KGJ1ZiArIDQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VmaS5jIGIvYXJjaC94ODYva2VybmVsL2VmaS5jCmluZGV4IGFkNWJkOTguLmNkY2ZiMTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lZmkuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZWZpLmMKQEAgLTQ1NCw4ICs0NTQsMTAgQEAKIAlpZiAoYWRkX2VmaV9tZW1tYXApCiAJCWRvX2FkZF9lZmlfbWVtbWFwKCk7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzMyCiAJeDg2X3BsYXRmb3JtLmdldF93YWxsY2xvY2sgPSBlZmlfZ2V0X3RpbWU7CiAJeDg2X3BsYXRmb3JtLnNldF93YWxsY2xvY2sgPSBlZmlfc2V0X3J0Y19tbXNzOworI2VuZGlmCiAKIAkvKiBTZXR1cCBmb3IgRUZJIHJ1bnRpbWUgc2VydmljZSAqLwogCXJlYm9vdF90eXBlID0gQk9PVF9FRkk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCmluZGV4IDY4MWMzZmQuLmI1YzA2MWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TCkBAIC01MzYsMjAgKzUzNiwxMyBAQAogCWJ0ICRUSUZfU1lTQ0FMTF9BVURJVCwlZWR4CiAJamMgc3lzcmV0X2F1ZGl0CiAjZW5kaWYKLQkvKiBlZHg6CXdvcmsgZmxhZ3MgKGFyZzMpICovCi0JbGVhcSAtQVJHT0ZGU0VUKCVyc3ApLCVyZGkgIyAmcHRfcmVncyAtPiBhcmcxCi0JeG9ybCAlZXNpLCVlc2kgIyBvbGRzZXQgLT4gYXJnMgotCVNBVkVfUkVTVAotCUZJWFVQX1RPUF9PRl9TVEFDSyAlcjExCi0JY2FsbCBkb19ub3RpZnlfcmVzdW1lCi0JUkVTVE9SRV9UT1BfT0ZfU1RBQ0sgJXIxMQotCVJFU1RPUkVfUkVTVAotCW1vdmwgJF9USUZfV09SS19NQVNLLCVlZGkKLQkvKiBVc2UgSVJFVCBiZWNhdXNlIHVzZXIgY291bGQgaGF2ZSBjaGFuZ2VkIGZyYW1lLiBUaGlzCi0JICAgd29ya3MgYmVjYXVzZSBwdHJlZ3NjYWxsX2NvbW1vbiBoYXMgY2FsbGVkIEZJWFVQX1RPUF9PRl9TVEFDSy4gKi8KLQlESVNBQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQotCVRSQUNFX0lSUVNfT0ZGCi0Jam1wIGludF93aXRoX2NoZWNrCisJLyoKKwkgKiBXZSBoYXZlIGEgc2lnbmFsLCBvciBleGl0IHRyYWNpbmcgb3Igc2luZ2xlLXN0ZXAuCisJICogVGhlc2UgYWxsIHdpbmQgdXAgd2l0aCB0aGUgaXJldCByZXR1cm4gcGF0aCBhbnl3YXksCisJICogc28ganVzdCBqb2luIHRoYXQgcGF0aCByaWdodCBub3cuCisJICovCisJRklYVVBfVE9QX09GX1NUQUNLICVyMTEsIC1BUkdPRkZTRVQKKwlqbXAgaW50X2NoZWNrX3N5c2NhbGxfZXhpdF93b3JrCiAKIGJhZHN5czoKIAltb3ZxICQtRU5PU1lTLFJBWC1BUkdPRkZTRVQoJXJzcCkKQEAgLTY1NCw2ICs2NDcsNyBAQAogaW50X3ZlcnlfY2FyZWZ1bDoKIAlUUkFDRV9JUlFTX09OCiAJRU5BQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQoraW50X2NoZWNrX3N5c2NhbGxfZXhpdF93b3JrOgogCVNBVkVfUkVTVAogCS8qIENoZWNrIGZvciBzeXNjYWxsIGV4aXQgdHJhY2UgKi8KIAl0ZXN0bCAkX1RJRl9XT1JLX1NZU0NBTExfRVhJVCwlZWR4CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUwppbmRleCBiNzY2ZThjLi4wNTBjMjc4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKQEAgLTc5LDcgKzc5LDcgQEAKICAqIGFueSBwYXJ0aWN1bGFyIEdEVCBsYXlvdXQsIGJlY2F1c2Ugd2UgbG9hZCBvdXIgb3duIGFzIHNvb24gYXMgd2UKICAqIGNhbi4KICAqLwotLnNlY3Rpb24gLnRleHQuaGVhZCwiYXgiLEBwcm9nYml0cworX19IRUFECiBFTlRSWShzdGFydHVwXzMyKQogCS8qIHRlc3QgS0VFUF9TRUdNRU5UUyBmbGFnIHRvIHNlZSBpZiB0aGUgYm9vdGxvYWRlciBpcyBhc2tpbmcKIAkJdXMgdG8gbm90IHJlbG9hZCBzZWdtZW50cyAqLwpAQCAtNjA4LDcgKzYwOCw3IEBACiAvKgogICogQlNTIHNlY3Rpb24KICAqLwotLnNlY3Rpb24gIi5ic3MucGFnZV9hbGlnbmVkIiwid2EiCitfX1BBR0VfQUxJR05FRF9CU1MKIAkuYWxpZ24gUEFHRV9TSVpFX2FzbQogI2lmZGVmIENPTkZJR19YODZfUEFFCiBzd2FwcGVyX3BnX3BtZDoKQEAgLTYyNiw3ICs2MjYsNyBAQAogICogVGhpcyBzdGFydHMgdGhlIGRhdGEgc2VjdGlvbi4KICAqLwogI2lmZGVmIENPTkZJR19YODZfUEFFCi0uc2VjdGlvbiAiLmRhdGEucGFnZV9hbGlnbmVkIiwid2EiCitfX1BBR0VfQUxJR05FRF9EQVRBCiAJLyogUGFnZS1hbGlnbmVkIGZvciB0aGUgYmVuZWZpdCBvZiBwYXJhdmlydD8gKi8KIAkuYWxpZ24gUEFHRV9TSVpFX2FzbQogRU5UUlkoc3dhcHBlcl9wZ19kaXIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUwppbmRleCBmYTU0Zjc4Li43ODBjZDkyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMKQEAgLTQwLDcgKzQwLDcgQEAKIEwzX1NUQVJUX0tFUk5FTCA9IHB1ZF9pbmRleChfX1NUQVJUX0tFUk5FTF9tYXApCiAKIAkudGV4dAotCS5zZWN0aW9uIC50ZXh0LmhlYWQKKwlfX0hFQUQKIAkuY29kZTY0CiAJLmdsb2JsIHN0YXJ0dXBfNjQKIHN0YXJ0dXBfNjQ6CkBAIC00MTgsNyArNDE4LDcgQEAKIEVOVFJZKGlkdF90YWJsZSkKIAkuc2tpcCBJRFRfRU5UUklFUyAqIDE2CiAKLQkuc2VjdGlvbiAuYnNzLnBhZ2VfYWxpZ25lZCwgImF3IiwgQG5vYml0cworCV9fUEFHRV9BTElHTkVEX0JTUwogCS5hbGlnbiBQQUdFX1NJWkUKIEVOVFJZKGVtcHR5X3plcm9fcGFnZSkKIAkuc2tpcCBQQUdFX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pMzg2X2tzeW1zXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaTM4Nl9rc3ltc18zMi5jCmluZGV4IDQzY2VjNmIuLjljM2JkNGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pMzg2X2tzeW1zXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2kzODZfa3N5bXNfMzIuYwpAQCAtMTAsNiArMTAsMTYgQEAKIEVYUE9SVF9TWU1CT0wobWNvdW50KTsKICNlbmRpZgogCisvKgorICogTm90ZSwgdGhpcyBpcyBhIHByb3RvdHlwZSB0byBnZXQgYXQgdGhlIHN5bWJvbCBmb3IKKyAqIHRoZSBleHBvcnQsIGJ1dCBkb250IHVzZSBpdCBmcm9tIEMgY29kZSwgaXQgaXMgdXNlZAorICogYnkgYXNzZW1ibHkgY29kZSBhbmQgaXMgbm90IHVzaW5nIEMgY2FsbGluZyBjb252ZW50aW9uIQorICovCisjaWZuZGVmIENPTkZJR19YODZfQ01QWENIRzY0CitleHRlcm4gdm9pZCBjbXB4Y2hnOGJfZW11KHZvaWQpOworRVhQT1JUX1NZTUJPTChjbXB4Y2hnOGJfZW11KTsKKyNlbmRpZgorCiAvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gveDg2L2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCAyNzBmZjgzLi4zYTU0ZGNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2luaXRfdGFzay5jCkBAIC0yMCw5ICsyMCw4IEBACiAgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCiAgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KICAqLwotdW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPQotCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPQorCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CiAKIC8qCiAgKiBJbml0aWFsIHRhc2sgc3RydWN0dXJlLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycS5jIGIvYXJjaC94ODYva2VybmVsL2lycS5jCmluZGV4IDc0NjU2ZDEuLjA0YmJkNTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKQEAgLTYzLDEwICs2MywxMCBAQAogCWZvcl9lYWNoX29ubGluZV9jcHUoaikKIAkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBpcnFfc3RhdHMoaiktPmlycV9zcHVyaW91c19jb3VudCk7CiAJc2VxX3ByaW50ZihwLCAiICBTcHVyaW91cyBpbnRlcnJ1cHRzXG4iKTsKLQlzZXFfcHJpbnRmKHAsICIlKnM6ICIsIHByZWMsICJDTlQiKTsKKwlzZXFfcHJpbnRmKHAsICIlKnM6ICIsIHByZWMsICJQTUkiKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCiAJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgaXJxX3N0YXRzKGopLT5hcGljX3BlcmZfaXJxcyk7Ci0Jc2VxX3ByaW50ZihwLCAiICBQZXJmb3JtYW5jZSBjb3VudGVyIGludGVycnVwdHNcbiIpOworCXNlcV9wcmludGYocCwgIiAgUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBpbnRlcnJ1cHRzXG4iKTsKIAlzZXFfcHJpbnRmKHAsICIlKnM6ICIsIHByZWMsICJQTkQiKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCiAJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgaXJxX3N0YXRzKGopLT5hcGljX3BlbmRpbmdfaXJxcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbGR0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvbGR0LmMKaW5kZXggNzFmMWQ5OS4uZWM2ZWY2MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2xkdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9sZHQuYwpAQCAtNjcsOCArNjcsOCBAQAogI2lmZGVmIENPTkZJR19TTVAKIAkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCWxvYWRfTERUKHBjKTsKLQkJaWYgKCFjcHVzX2VxdWFsKGN1cnJlbnQtPm1tLT5jcHVfdm1fbWFzaywKLQkJCQljcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpKSkKKwkJaWYgKCFjcHVtYXNrX2VxdWFsKG1tX2NwdW1hc2soY3VycmVudC0+bW0pLAorCQkJCSAgIGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKSkpCiAJCQlzbXBfY2FsbF9mdW5jdGlvbihmbHVzaF9sZHQsIGN1cnJlbnQtPm1tLCAxKTsKIAkJcHJlZW1wdF9lbmFibGUoKTsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYwppbmRleCA2NGI4MzhlLi5iMmE3MWRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogLyoKICAqIFRoaXMgdmFyaWFibGUgYmVjb21lcyAxIGlmIGlvbW11PXB0IGlzIHBhc3NlZCBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KLSAqIElmIHRoaXMgdmFyaWFibGUgaXMgMSwgSU9NTVUgaW1wbGVtZW50YXRpb25zIGRvIG5vIERNQSByYW5zbGF0aW9uIGZvcgorICogSWYgdGhpcyB2YXJpYWJsZSBpcyAxLCBJT01NVSBpbXBsZW1lbnRhdGlvbnMgZG8gbm8gRE1BIHRyYW5zbGF0aW9uIGZvcgogICogZGV2aWNlcyBhbmQgYWxsb3cgZXZlcnkgZGV2aWNlIHRvIGFjY2VzcyB0byB3aG9sZSBwaHlzaWNhbCBtZW1vcnkuIFRoaXMgaXMKICAqIHVzZWZ1bCBpZiBhIHVzZXIgd2FudCB0byB1c2UgYW4gSU9NTVUgb25seSBmb3IgS1ZNIGRldmljZSBhc3NpZ25tZW50IHRvCiAgKiBndWVzdHMgYW5kIG5vdCBmb3IgZHJpdmVyIGRtYSB0cmFuc2xhdGlvbi4KQEAgLTMxMSw3ICszMTEsNyBAQAogCWFtZF9pb21tdV9zaHV0ZG93bigpOwogfQogLyogTXVzdCBleGVjdXRlIGFmdGVyIFBDSSBzdWJzeXN0ZW0gKi8KLWZzX2luaXRjYWxsKHBjaV9pb21tdV9pbml0KTsKK3Jvb3Rmc19pbml0Y2FsbChwY2lfaW9tbXVfaW5pdCk7CiAKICNpZmRlZiBDT05GSUdfUENJCiAvKiBNYW55IFZJQSBicmlkZ2VzIHNlZW0gdG8gY29ycnVwdCBkYXRhIGZvciBEQUMuIERpc2FibGUgaXQgaGVyZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1nYXJ0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYwppbmRleCA5OGE4MjdlLi5hN2YxYjY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggODQ3YWI0MS4uNTI4NGNkMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCkBAIC01NTUsMTAgKzU1NSw4IEBACiB2b2lkIF9faW5pdCBpbml0X2MxZV9tYXNrKHZvaWQpCiB7CiAJLyogSWYgd2UncmUgdXNpbmcgYzFlX2lkbGUsIHdlIG5lZWQgdG8gYWxsb2NhdGUgYzFlX21hc2suICovCi0JaWYgKHBtX2lkbGUgPT0gYzFlX2lkbGUpIHsKLQkJYWxsb2NfY3B1bWFza192YXIoJmMxZV9tYXNrLCBHRlBfS0VSTkVMKTsKLQkJY3B1bWFza19jbGVhcihjMWVfbWFzayk7Ci0JfQorCWlmIChwbV9pZGxlID09IGMxZV9pZGxlKQorCQl6YWxsb2NfY3B1bWFza192YXIoJmMxZV9tYXNrLCBHRlBfS0VSTkVMKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaWRsZV9zZXR1cChjaGFyICpzdHIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCBhZDUzNWI2Li5lYjYyY2JjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTY2NCwzICs2NjQsOCBAQAogCXJldHVybiBkb19hcmNoX3ByY3RsKGN1cnJlbnQsIGNvZGUsIGFkZHIpOwogfQogCit1bnNpZ25lZCBsb25nIEtTVEtfRVNQKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9JQTMyKSkgPworCQkJKHRhc2tfcHRfcmVncyh0YXNrKS0+c3ApIDogKCh0YXNrKS0+dGhyZWFkLnVzZXJzcCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggMjczNDlmOS4uZjkzMDc4NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGJvb3QuaD4KICNpbmNsdWRlIDxhY3BpL3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDM1LDYgKzQzNiwxNCBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvNSIpLAogCQl9LAogCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gQXBwbGUgTWFjbWluaTMsMSAqLworCQkuY2FsbGJhY2sgPSBzZXRfcGNpX3JlYm9vdCwKKwkJLmlkZW50ID0gIkFwcGxlIE1hY21pbmkzLDEiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFwcGxlIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjbWluaTMsMSIpLAorCQl9LAorCX0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwppbmRleCAwOWM1ZTA3Li41NjVlYmM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTEwNTksMTIgKzEwNTksOSBAQAogI2VuZGlmCiAJY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUgPSAwOyAgLyogbmVlZGVkPyAqLwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCWFsbG9jX2NwdW1hc2tfdmFyKCZwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgaSksIEdGUF9LRVJORUwpOwotCQlhbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfY29yZV9tYXAsIGkpLCBHRlBfS0VSTkVMKTsKLQkJYWxsb2NfY3B1bWFza192YXIoJmNwdV9kYXRhKGkpLmxsY19zaGFyZWRfbWFwLCBHRlBfS0VSTkVMKTsKLQkJY3B1bWFza19jbGVhcihwZXJfY3B1KGNwdV9jb3JlX21hcCwgaSkpOwotCQljcHVtYXNrX2NsZWFyKHBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBpKSk7Ci0JCWNwdW1hc2tfY2xlYXIoY3B1X2RhdGEoaSkubGxjX3NoYXJlZF9tYXApOworCQl6YWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7CisJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfY29yZV9tYXAsIGkpLCBHRlBfS0VSTkVMKTsKKwkJemFsbG9jX2NwdW1hc2tfdmFyKCZjcHVfZGF0YShpKS5sbGNfc2hhcmVkX21hcCwgR0ZQX0tFUk5FTCk7CiAJfQogCXNldF9jcHVfc2libGluZ19tYXAoMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jCmluZGV4IGUyOTNhYzUuLmJlMjU3MzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RpbWUuYwpAQCAtMzgsNyArMzgsOCBAQAogI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCiAJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKikocmVncy0+YnAgKyBzaXplb2YobG9uZykpOwogI2Vsc2UKLQkJdW5zaWduZWQgbG9uZyAqc3AgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnNwOworCQl1bnNpZ25lZCBsb25nICpzcCA9CisJCQkodW5zaWduZWQgbG9uZyAqKWtlcm5lbF9zdGFja19wb2ludGVyKHJlZ3MpOwogCQkvKgogCQkgKiBSZXR1cm4gYWRkcmVzcyBpcyBlaXRoZXIgZGlyZWN0bHkgYXQgc3RhY2sgcG9pbnRlcgogCQkgKiBvciBhYm92ZSBhIHNhdmVkIGZsYWdzLiBFZmxhZ3MgaGFzIGJpdHMgMjItMzEgemVybywKQEAgLTkzLDcgKzk0LDYgQEAKIAogdm9pZCBfX2luaXQgc2V0dXBfZGVmYXVsdF90aW1lcl9pcnEodm9pZCkKIHsKLQlpcnEwLm1hc2sgPSBjcHVtYXNrX29mX2NwdSgwKTsKIAlzZXR1cF9pcnEoMCwgJmlycTApOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdGxiX3V2LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGxiX3V2LmMKaW5kZXggNTAzYzFmMi4uMTc0MGM4NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RsYl91di5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90bGJfdXYuYwpAQCAtMjMsOCArMjMsNiBAQAogc3RhdGljIHN0cnVjdCBiYXVfY29udHJvbAkqKnV2X2JhdV90YWJsZV9iYXNlcyBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGludAkJCXV2X2JhdV9yZXRyeV9saW1pdCBfX3JlYWRfbW9zdGx5OwogCi0vKiBwb3NpdGlvbiBvZiBwbm9kZSAod2hpY2ggaXMgbmFzaWQ+PjEpOiAqLwotc3RhdGljIGludAkJCXV2X25zaGlmdCBfX3JlYWRfbW9zdGx5OwogLyogYmFzZSBwbm9kZSBpbiB0aGlzIHBhcnRpdGlvbiAqLwogc3RhdGljIGludAkJCXV2X3BhcnRpdGlvbl9iYXNlX3Bub2RlIF9fcmVhZF9tb3N0bHk7CiAKQEAgLTcyMyw3ICs3MjEsNyBAQAogCUJVR19PTighYWRwKTsKIAogCXBhID0gdXZfZ3BhKGFkcCk7IC8qIG5lZWQgdGhlIHJlYWwgbmFzaWQqLwotCW4gPSBwYSA+PiB1dl9uc2hpZnQ7CisJbiA9IHV2X2dwYV90b19wbm9kZShwYSk7CiAJbSA9IHBhICYgdXZfbW1hc2s7CiAKIAl1dl93cml0ZV9nbG9iYWxfbW1yNjQocG5vZGUsIFVWSF9MQl9CQVVfU0JfREVTQ1JJUFRPUl9CQVNFLApAQCAtNzc4LDcgKzc3Niw3IEBACiAJICogbmVlZCB0aGUgcG5vZGUgb2Ygd2hlcmUgdGhlIG1lbW9yeSB3YXMgcmVhbGx5IGFsbG9jYXRlZAogCSAqLwogCXBhID0gdXZfZ3BhKHBxcCk7Ci0JcG4gPSBwYSA+PiB1dl9uc2hpZnQ7CisJcG4gPSB1dl9ncGFfdG9fcG5vZGUocGEpOwogCXV2X3dyaXRlX2dsb2JhbF9tbXI2NChwbm9kZSwKIAkJCSAgICAgIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0ZJUlNULAogCQkJICAgICAgKCh1bnNpZ25lZCBsb25nKXBuIDw8IFVWX1BBWUxPQURRX1BOT0RFX1NISUZUKSB8CkBAIC04NDMsOCArODQxLDcgQEAKIAkJCQkgICAgICAgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3VyX2NwdSkpOwogCiAJdXZfYmF1X3JldHJ5X2xpbWl0ID0gMTsKLQl1dl9uc2hpZnQgPSB1dl9odWJfaW5mby0+bl92YWw7Ci0JdXZfbW1hc2sgPSAoMVVMIDw8IHV2X2h1Yl9pbmZvLT5uX3ZhbCkgLSAxOworCXV2X21tYXNrID0gKDFVTCA8PCB1dl9odWJfaW5mby0+bV92YWwpIC0gMTsKIAluYmxhZGVzID0gdXZfbnVtX3Bvc3NpYmxlX2JsYWRlcygpOwogCiAJdXZfYmF1X3RhYmxlX2Jhc2VzID0gKHN0cnVjdCBiYXVfY29udHJvbCAqKikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFtcG9saW5lLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhbXBvbGluZS5jCmluZGV4IDY5OWY3ZWUuLmNkMDIyMTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90cmFtcG9saW5lLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYW1wb2xpbmUuYwpAQCAtMyw4ICszLDE2IEBACiAjaW5jbHVkZSA8YXNtL3RyYW1wb2xpbmUuaD4KICNpbmNsdWRlIDxhc20vZTgyMC5oPgogCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSAmJiBkZWZpbmVkKENPTkZJR19BQ1BJX1NMRUVQKQorI2RlZmluZSBfX3RyYW1waW5pdAorI2RlZmluZSBfX3RyYW1waW5pdGRhdGEKKyNlbHNlCisjZGVmaW5lIF9fdHJhbXBpbml0IF9fY3B1aW5pdAorI2RlZmluZSBfX3RyYW1waW5pdGRhdGEgX19jcHVpbml0ZGF0YQorI2VuZGlmCisKIC8qIHJlYWR5IGZvciB4ODZfNjQgYW5kIHg4NiAqLwotdW5zaWduZWQgY2hhciAqX19jcHVpbml0ZGF0YSB0cmFtcG9saW5lX2Jhc2UgPSBfX3ZhKFRSQU1QT0xJTkVfQkFTRSk7Cit1bnNpZ25lZCBjaGFyICpfX3RyYW1waW5pdGRhdGEgdHJhbXBvbGluZV9iYXNlID0gX192YShUUkFNUE9MSU5FX0JBU0UpOwogCiB2b2lkIF9faW5pdCByZXNlcnZlX3RyYW1wb2xpbmVfbWVtb3J5KHZvaWQpCiB7CkBAIC0yNiw3ICszNCw3IEBACiAgKiBib290c3RyYXAgaW50byB0aGUgcGFnZSBjb25jZXJuZWQuIFRoZSBjYWxsZXIKICAqIGhhcyBtYWRlIHN1cmUgaXQncyBzdWl0YWJseSBhbGlnbmVkLgogICovCi11bnNpZ25lZCBsb25nIF9fY3B1aW5pdCBzZXR1cF90cmFtcG9saW5lKHZvaWQpCit1bnNpZ25lZCBsb25nIF9fdHJhbXBpbml0IHNldHVwX3RyYW1wb2xpbmUodm9pZCkKIHsKIAltZW1jcHkodHJhbXBvbGluZV9iYXNlLCB0cmFtcG9saW5lX2RhdGEsIFRSQU1QT0xJTkVfU0laRSk7CiAJcmV0dXJuIHZpcnRfdG9fcGh5cyh0cmFtcG9saW5lX2Jhc2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RyYW1wb2xpbmVfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC90cmFtcG9saW5lXzY0LlMKaW5kZXggNTk2ZDU0Yy4uM2FmMmRmZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYW1wb2xpbmVfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhbXBvbGluZV82NC5TCkBAIC0zMiw4ICszMiwxMiBAQAogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgogCisjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKKy5zZWN0aW9uIC5yb2RhdGEsICJhIiwgQHByb2diaXRzCisjZWxzZQogLyogV2UgY2FuIGZyZWUgdXAgdGhlIHRyYW1wb2xpbmUgYWZ0ZXIgYm9vdHVwIGlmIGNwdSBob3RwbHVnIGlzIG5vdCBzdXBwb3J0ZWQuICovCiBfX0NQVUlOSVRST0RBVEEKKyNlbmRpZgogLmNvZGUxNgogCiBFTlRSWSh0cmFtcG9saW5lX2RhdGEpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCmluZGV4IDkzNDZlMTAuLjdlMzdkY2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTczLDExICs3Miw5IEBACiAKIC8qCiAgKiBUaGUgSURUIGhhcyB0byBiZSBwYWdlLWFsaWduZWQgdG8gc2ltcGxpZnkgdGhlIFBlbnRpdW0KLSAqIEYwIDBGIGJ1ZyB3b3JrYXJvdW5kLi4gV2UgaGF2ZSBhIHNwZWNpYWwgbGluayBzZWdtZW50Ci0gKiBmb3IgdGhpcy4KKyAqIEYwIDBGIGJ1ZyB3b3JrYXJvdW5kLgogICovCi1nYXRlX2Rlc2MgaWR0X3RhYmxlW05SX1ZFQ1RPUlNdCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmlkdCIpKSkgPSB7IHsgeyB7IDAsIDAgfSB9IH0sIH07CitnYXRlX2Rlc2MgaWR0X3RhYmxlW05SX1ZFQ1RPUlNdIF9fcGFnZV9hbGlnbmVkX2RhdGEgPSB7IHsgeyB7IDAsIDAgfSB9IH0sIH07CiAjZW5kaWYKIAogREVDTEFSRV9CSVRNQVAodXNlZF92ZWN0b3JzLCBOUl9WRUNUT1JTKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2Nfc3luYy5jIGIvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKaW5kZXggMDI3YjViNC4uZjM3OTMwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1RTQ19SRUxJQUJMRSkpIHsKLQkJcHJfaW5mbygiU2tpcHBpbmcgc3luY2hyb25pemF0aW9uIGNoZWNrcyBhcyBUU0MgaXMgcmVsaWFibGUuXG4iKTsKKwkJcHJpbnRrX29uY2UoS0VSTl9JTkZPICJTa2lwcGluZyBzeW5jaHJvbml6YXRpb24gY2hlY2tzIGFzIFRTQyBpcyByZWxpYWJsZS5cbiIpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMKaW5kZXggMzFlNmY2Yy4uZDQzMGU0YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZtaV8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC92bWlfMzIuYwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAKIAlwdl9pbmZvLnBhcmF2aXJ0X2VuYWJsZWQgPSAxOwogCXB2X2luZm8ua2VybmVsX3JwbCA9IGtlcm5lbF9jcyAmIFNFR01FTlRfUlBMX01BU0s7Ci0JcHZfaW5mby5uYW1lID0gInZtaSI7CisJcHZfaW5mby5uYW1lID0gInZtaSBbZGVwcmVjYXRlZF0iOwogCiAJcHZfaW5pdF9vcHMucGF0Y2ggPSB2bWlfcGF0Y2g7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYTQ2YWNjYy4uM2M2OGZlMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTY1LDE3ICs2NSwxMSBAQAogI2VuZGlmCiAKIAkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YSAqLwotCi0JLyogYm9vdHN0cmFwcGluZyBjb2RlICovCi0JLnRleHQuaGVhZCA6IEFUKEFERFIoLnRleHQuaGVhZCkgLSBMT0FEX09GRlNFVCkgewotCQlfdGV4dCA9IC47Ci0JCSooLnRleHQuaGVhZCkKLQl9IDp0ZXh0ID0gMHg5MDkwCi0KLQkvKiBUaGUgcmVzdCBvZiB0aGUgdGV4dCAqLwogCS50ZXh0IDogIEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX3RleHQgPSAuOworCQkvKiBib290c3RyYXBwaW5nIGNvZGUgKi8KKwkJSEVBRF9URVhUCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgotCQkvKiBub3QgcmVhbGx5IG5lZWRlZCwgYWxyZWFkeSBwYWdlIGFsaWduZWQgKi8KIAkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJCSooLnRleHQucGFnZV9hbGlnbmVkKQogI2VuZGlmCkBAIC05NCwxMyArODgsNyBAQAogCiAJTk9URVMgOnRleHQgOm5vdGUKIAotCS8qIEV4Y2VwdGlvbiB0YWJsZSAqLwotCS4gPSBBTElHTigxNik7Ci0JX19leF90YWJsZSA6IEFUKEFERFIoX19leF90YWJsZSkgLSBMT0FEX09GRlNFVCkgewotCQlfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotCQkqKF9fZXhfdGFibGUpCi0JCV9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQl9IDp0ZXh0ID0gMHg5MDkwCisJRVhDRVBUSU9OX1RBQkxFKDE2KSA6dGV4dCA9IDB4OTA5MAogCiAJUk9fREFUQShQQUdFX1NJWkUpCiAKQEAgLTExOCw3ICsxMDYsNiBAQAogI2VuZGlmCiAKIAkJUEFHRV9BTElHTkVEX0RBVEEoUEFHRV9TSVpFKQotCQkqKC5kYXRhLmlkdCkKIAogCQlDQUNIRUxJTkVfQUxJR05FRF9EQVRBKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpCiAKQEAgLTEzNSwyNCArMTIyLDIxIEBACiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCiAjZGVmaW5lIFZTWVNDQUxMX0FERFIgKC0xMCoxMDI0KjEwMjQpCi0jZGVmaW5lIFZTWVNDQUxMX1BIWVNfQUREUiAoKExPQURBRERSKC5kYXRhKSArIFNJWkVPRiguZGF0YSkgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFIC0gMSkgJiB+KFBBR0VfU0laRSAtIDEpKQotI2RlZmluZSBWU1lTQ0FMTF9WSVJUX0FERFIgKChBRERSKC5kYXRhKSArIFNJWkVPRiguZGF0YSkgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFIC0gMSkgJiB+KFBBR0VfU0laRSAtIDEpKQogCi0jZGVmaW5lIFZMT0FEX09GRlNFVCAoVlNZU0NBTExfQUREUiAtIFZTWVNDQUxMX1BIWVNfQUREUikKKyNkZWZpbmUgVkxPQURfT0ZGU0VUIChWU1lTQ0FMTF9BRERSIC0gX192c3lzY2FsbF8wICsgTE9BRF9PRkZTRVQpCiAjZGVmaW5lIFZMT0FEKHgpIChBRERSKHgpIC0gVkxPQURfT0ZGU0VUKQogCi0jZGVmaW5lIFZWSVJUX09GRlNFVCAoVlNZU0NBTExfQUREUiAtIFZTWVNDQUxMX1ZJUlRfQUREUikKKyNkZWZpbmUgVlZJUlRfT0ZGU0VUIChWU1lTQ0FMTF9BRERSIC0gX192c3lzY2FsbF8wKQogI2RlZmluZSBWVklSVCh4KSAoQUREUih4KSAtIFZWSVJUX09GRlNFVCkKIAorCS4gPSBBTElHTig0MDk2KTsKKwlfX3ZzeXNjYWxsXzAgPSAuOworCiAJLiA9IFZTWVNDQUxMX0FERFI7Ci0JLnZzeXNjYWxsXzAgOiBBVChWU1lTQ0FMTF9QSFlTX0FERFIpIHsKKwkudnN5c2NhbGxfMCA6IEFUKFZMT0FEKC52c3lzY2FsbF8wKSkgewogCQkqKC52c3lzY2FsbF8wKQogCX0gOnVzZXIKIAotCV9fdnN5c2NhbGxfMCA9IFZTWVNDQUxMX1ZJUlRfQUREUjsKLQogCS4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKIAkudnN5c2NhbGxfZm4gOiBBVChWTE9BRCgudnN5c2NhbGxfZm4pKSB7CiAJCSooLnZzeXNjYWxsX2ZuKQpAQCAtMTkyLDExICsxNzYsOSBAQAogCQkqKC52c3lzY2FsbF8zKQogCX0KIAotCS4gPSBWU1lTQ0FMTF9WSVJUX0FERFIgKyBQQUdFX1NJWkU7CisJLiA9IF9fdnN5c2NhbGxfMCArIFBBR0VfU0laRTsKIAogI3VuZGVmIFZTWVNDQUxMX0FERFIKLSN1bmRlZiBWU1lTQ0FMTF9QSFlTX0FERFIKLSN1bmRlZiBWU1lTQ0FMTF9WSVJUX0FERFIKICN1bmRlZiBWTE9BRF9PRkZTRVQKICN1bmRlZiBWTE9BRAogI3VuZGVmIFZWSVJUX09GRlNFVApAQCAtMjE5LDM2ICsyMDEsMTIgQEAKIAlQRVJDUFVfVkFERFIoMCwgOnBlcmNwdSkKICNlbmRpZgogCi0JLmluaXQudGV4dCA6IEFUKEFERFIoLmluaXQudGV4dCkgLSBMT0FEX09GRlNFVCkgewotCQlfc2luaXR0ZXh0ID0gLjsKLQkJSU5JVF9URVhUCi0JCV9laW5pdHRleHQgPSAuOwotCX0KKwlJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCTppbml0CiAjZW5kaWYKIAotCS5pbml0LmRhdGEgOiBBVChBRERSKC5pbml0LmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsKLQkJSU5JVF9EQVRBCi0JfQotCi0JLiA9IEFMSUdOKDE2KTsKLQkuaW5pdC5zZXR1cCA6IEFUKEFERFIoLmluaXQuc2V0dXApIC0gTE9BRF9PRkZTRVQpIHsKLQkJX19zZXR1cF9zdGFydCA9IC47Ci0JCSooLmluaXQuc2V0dXApCi0JCV9fc2V0dXBfZW5kID0gLjsKLQl9Ci0JLmluaXRjYWxsLmluaXQgOiBBVChBRERSKC5pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JCV9faW5pdGNhbGxfc3RhcnQgPSAuOwotCQlJTklUQ0FMTFMKLQkJX19pbml0Y2FsbF9lbmQgPSAuOwotCX0KLQotCS5jb25faW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmNvbl9pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JCV9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJKiguY29uX2luaXRjYWxsLmluaXQpCi0JCV9fY29uX2luaXRjYWxsX2VuZCA9IC47Ci0JfQorCUlOSVRfREFUQV9TRUNUSU9OKDE2KQogCiAJLng4Nl9jcHVfZGV2LmluaXQgOiBBVChBRERSKC54ODZfY3B1X2Rldi5pbml0KSAtIExPQURfT0ZGU0VUKSB7CiAJCV9feDg2X2NwdV9kZXZfc3RhcnQgPSAuOwpAQCAtMjU2LDggKzIxNCw2IEBACiAJCV9feDg2X2NwdV9kZXZfZW5kID0gLjsKIAl9CiAKLQlTRUNVUklUWV9JTklUCi0KIAkuID0gQUxJR04oOCk7CiAJLnBhcmFpbnN0cnVjdGlvbnMgOiBBVChBRERSKC5wYXJhaW5zdHJ1Y3Rpb25zKSAtIExPQURfT0ZGU0VUKSB7CiAJCV9fcGFyYWluc3RydWN0aW9ucyA9IC47CkBAIC0yODgsMTUgKzI0NCw2IEBACiAJCUVYSVRfREFUQQogCX0KIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCS5pbml0LnJhbWZzIDogQVQoQUREUiguaW5pdC5yYW1mcykgLSBMT0FEX09GRlNFVCkgewotCQlfX2luaXRyYW1mc19zdGFydCA9IC47Ci0JCSooLmluaXQucmFtZnMpCi0JCV9faW5pdHJhbWZzX2VuZCA9IC47Ci0JfQotI2VuZGlmCi0KICNpZiAhZGVmaW5lZChDT05GSUdfWDg2XzY0KSB8fCAhZGVmaW5lZChDT05GSUdfU01QKQogCVBFUkNQVShQQUdFX1NJWkUpCiAjZW5kaWYKQEAgLTM1OCw2ICszMDUsOSBAQAogCiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCisvKgorICogVGhlIEFTU0VSVCgpIHNpbmsgdG8gLiBpcyBpbnRlbnRpb25hbCwgZm9yIGJpbnV0aWxzIDIuMTQgY29tcGF0aWJpbGl0eToKKyAqLwogLiA9IEFTU0VSVCgoX2VuZCAtIExPQURfT0ZGU0VUIDw9IEtFUk5FTF9JTUFHRV9TSVpFKSwKIAkgICAia2VybmVsIGltYWdlIGJpZ2dlciB0aGFuIEtFUk5FTF9JTUFHRV9TSVpFIik7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwppbmRleCBjZjUzYTc4Li44Y2I0OTc0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwpAQCAtMjI4LDE5ICsyMjgsMTEgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TWVNDVEwKLQotc3RhdGljIGludAotdnN5c2NhbGxfc3lzY3RsX2NoYW5nZShjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCi0JCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOwotfQotCiBzdGF0aWMgY3RsX3RhYmxlIGtlcm5lbF90YWJsZTJbXSA9IHsKIAl7IC5wcm9jbmFtZSA9ICJ2c3lzY2FsbDY0IiwKIAkgIC5kYXRhID0gJnZzeXNjYWxsX2d0b2RfZGF0YS5zeXNjdGxfZW5hYmxlZCwgLm1heGxlbiA9IHNpemVvZihpbnQpLAogCSAgLm1vZGUgPSAwNjQ0LAotCSAgLnByb2NfaGFuZGxlciA9IHZzeXNjYWxsX3N5c2N0bF9jaGFuZ2UgfSwKKwkgIC5wcm9jX2hhbmRsZXIgPSBwcm9jX2RvaW50dmVjIH0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9pODI1NC5jIGIvYXJjaC94ODYva3ZtL2k4MjU0LmMKaW5kZXggODJhZDUyMy4uMTQ0ZTdmNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2k4MjU0LmMKKysrIGIvYXJjaC94ODYva3ZtL2k4MjU0LmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCSAqIGl0c2VsZiB3aXRoIHRoZSBpbml0aWFsIGNvdW50IGFuZCBjb250aW51ZXMgY291bnRpbmcKIAkgKiBmcm9tIHRoZXJlLgogCSAqLwotCXJlbWFpbmluZyA9IGhydGltZXJfZXhwaXJlc19yZW1haW5pbmcoJnBzLT5waXRfdGltZXIudGltZXIpOworCXJlbWFpbmluZyA9IGhydGltZXJfZ2V0X3JlbWFpbmluZygmcHMtPnBpdF90aW1lci50aW1lcik7CiAJZWxhcHNlZCA9IHBzLT5waXRfdGltZXIucGVyaW9kIC0ga3RpbWVfdG9fbnMocmVtYWluaW5nKTsKIAllbGFwc2VkID0gbW9kXzY0KGVsYXBzZWQsIHBzLT5waXRfdGltZXIucGVyaW9kKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2xhcGljLmMgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuYwppbmRleCAxYWU1Y2ViLi4yM2MyMTc2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbGFwaWMuYworKysgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuYwpAQCAtNTIxLDcgKzUyMSw3IEBACiAJaWYgKGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1RNSUNUKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXJlbWFpbmluZyA9IGhydGltZXJfZXhwaXJlc19yZW1haW5pbmcoJmFwaWMtPmxhcGljX3RpbWVyLnRpbWVyKTsKKwlyZW1haW5pbmcgPSBocnRpbWVyX2dldF9yZW1haW5pbmcoJmFwaWMtPmxhcGljX3RpbWVyLnRpbWVyKTsKIAlpZiAoa3RpbWVfdG9fbnMocmVtYWluaW5nKSA8IDApCiAJCXJlbWFpbmluZyA9IGt0aW1lX3NldCgwLCAwKTsKIApAQCAtNjY0LDcgKzY2NCw3IEBACiB7CiAJa3RpbWVfdCBub3cgPSBhcGljLT5sYXBpY190aW1lci50aW1lci5iYXNlLT5nZXRfdGltZSgpOwogCi0JYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kID0gYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfVE1JQ1QpICoKKwlhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPSAodTY0KWFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1RNSUNUKSAqCiAJCSAgICBBUElDX0JVU19DWUNMRV9OUyAqIGFwaWMtPmRpdmlkZV9jb3VudDsKIAlhdG9taWNfc2V0KCZhcGljLT5sYXBpY190aW1lci5wZW5kaW5nLCAwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5jIGIvYXJjaC94ODYva3ZtL21tdS5jCmluZGV4IGVjYTQxYWUuLjgxOGI5MmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11LmMKQEAgLTE1Niw2ICsxNTYsOCBAQAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAibW11dHJhY2UuaCIKIAorI2RlZmluZSBTUFRFX0hPU1RfV1JJVEVBQkxFICgxVUxMIDw8IFBUX0ZJUlNUX0FWQUlMX0JJVFNfU0hJRlQpCisKICNkZWZpbmUgU0hBRE9XX1BUX0lOREVYKGFkZHIsIGxldmVsKSBQVDY0X0lOREVYKGFkZHIsIGxldmVsKQogCiBzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyB7CkBAIC02MzQsOSArNjM2LDcgQEAKIAlpZiAoKnNwdGUgJiBzaGFkb3dfYWNjZXNzZWRfbWFzaykKIAkJa3ZtX3NldF9wZm5fYWNjZXNzZWQocGZuKTsKIAlpZiAoaXNfd3JpdGVibGVfcHRlKCpzcHRlKSkKLQkJa3ZtX3JlbGVhc2VfcGZuX2RpcnR5KHBmbik7Ci0JZWxzZQotCQlrdm1fcmVsZWFzZV9wZm5fY2xlYW4ocGZuKTsKKwkJa3ZtX3NldF9wZm5fZGlydHkocGZuKTsKIAlybWFwcCA9IGdmbl90b19ybWFwKGt2bSwgc3AtPmdmbnNbc3B0ZSAtIHNwLT5zcHRdLCBzcC0+cm9sZS5sZXZlbCk7CiAJaWYgKCEqcm1hcHApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJybWFwX3JlbW92ZTogJXAgJWxseCAwLT5CVUdcbiIsIHNwdGUsICpzcHRlKTsKQEAgLTc0OCw3ICs3NDgsOCBAQAogCXJldHVybiB3cml0ZV9wcm90ZWN0ZWQ7CiB9CiAKLXN0YXRpYyBpbnQga3ZtX3VubWFwX3JtYXBwKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyAqcm1hcHApCitzdGF0aWMgaW50IGt2bV91bm1hcF9ybWFwcChzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgKnJtYXBwLAorCQkJICAgdW5zaWduZWQgbG9uZyBkYXRhKQogewogCXU2NCAqc3B0ZTsKIAlpbnQgbmVlZF90bGJfZmx1c2ggPSAwOwpAQCAtNzYzLDggKzc2NCw0NyBAQAogCXJldHVybiBuZWVkX3RsYl9mbHVzaDsKIH0KIAorc3RhdGljIGludCBrdm1fc2V0X3B0ZV9ybWFwcChzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgKnJtYXBwLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaW50IG5lZWRfZmx1c2ggPSAwOworCXU2NCAqc3B0ZSwgbmV3X3NwdGU7CisJcHRlX3QgKnB0ZXAgPSAocHRlX3QgKilkYXRhOworCXBmbl90IG5ld19wZm47CisKKwlXQVJOX09OKHB0ZV9odWdlKCpwdGVwKSk7CisJbmV3X3BmbiA9IHB0ZV9wZm4oKnB0ZXApOworCXNwdGUgPSBybWFwX25leHQoa3ZtLCBybWFwcCwgTlVMTCk7CisJd2hpbGUgKHNwdGUpIHsKKwkJQlVHX09OKCFpc19zaGFkb3dfcHJlc2VudF9wdGUoKnNwdGUpKTsKKwkJcm1hcF9wcmludGsoImt2bV9zZXRfcHRlX3JtYXBwOiBzcHRlICVwICVsbHhcbiIsIHNwdGUsICpzcHRlKTsKKwkJbmVlZF9mbHVzaCA9IDE7CisJCWlmIChwdGVfd3JpdGUoKnB0ZXApKSB7CisJCQlybWFwX3JlbW92ZShrdm0sIHNwdGUpOworCQkJX19zZXRfc3B0ZShzcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCQlzcHRlID0gcm1hcF9uZXh0KGt2bSwgcm1hcHAsIE5VTEwpOworCQl9IGVsc2UgeworCQkJbmV3X3NwdGUgPSAqc3B0ZSAmfiAoUFQ2NF9CQVNFX0FERFJfTUFTSyk7CisJCQluZXdfc3B0ZSB8PSAodTY0KW5ld19wZm4gPDwgUEFHRV9TSElGVDsKKworCQkJbmV3X3NwdGUgJj0gflBUX1dSSVRBQkxFX01BU0s7CisJCQluZXdfc3B0ZSAmPSB+U1BURV9IT1NUX1dSSVRFQUJMRTsKKwkJCWlmIChpc193cml0ZWJsZV9wdGUoKnNwdGUpKQorCQkJCWt2bV9zZXRfcGZuX2RpcnR5KHNwdGVfdG9fcGZuKCpzcHRlKSk7CisJCQlfX3NldF9zcHRlKHNwdGUsIG5ld19zcHRlKTsKKwkJCXNwdGUgPSBybWFwX25leHQoa3ZtLCBybWFwcCwgc3B0ZSk7CisJCX0KKwl9CisJaWYgKG5lZWRfZmx1c2gpCisJCWt2bV9mbHVzaF9yZW1vdGVfdGxicyhrdm0pOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQga3ZtX2hhbmRsZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSwKLQkJCSAgaW50ICgqaGFuZGxlcikoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nICpybWFwcCkpCisJCQkgIHVuc2lnbmVkIGxvbmcgZGF0YSwKKwkJCSAgaW50ICgqaGFuZGxlcikoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nICpybWFwcCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSkpCiB7CiAJaW50IGksIGo7CiAJaW50IHJldHZhbCA9IDA7CkBAIC03ODYsMTMgKzgyNiwxNSBAQAogCQlpZiAoaHZhID49IHN0YXJ0ICYmIGh2YSA8IGVuZCkgewogCQkJZ2ZuX3QgZ2ZuX29mZnNldCA9IChodmEgLSBzdGFydCkgPj4gUEFHRV9TSElGVDsKIAotCQkJcmV0dmFsIHw9IGhhbmRsZXIoa3ZtLCAmbWVtc2xvdC0+cm1hcFtnZm5fb2Zmc2V0XSk7CisJCQlyZXR2YWwgfD0gaGFuZGxlcihrdm0sICZtZW1zbG90LT5ybWFwW2dmbl9vZmZzZXRdLAorCQkJCQkgIGRhdGEpOwogCiAJCQlmb3IgKGogPSAwOyBqIDwgS1ZNX05SX1BBR0VfU0laRVMgLSAxOyArK2opIHsKIAkJCQlpbnQgaWR4ID0gZ2ZuX29mZnNldDsKIAkJCQlpZHggLz0gS1ZNX1BBR0VTX1BFUl9IUEFHRShQVF9ESVJFQ1RPUllfTEVWRUwgKyBqKTsKIAkJCQlyZXR2YWwgfD0gaGFuZGxlcihrdm0sCi0JCQkJCSZtZW1zbG90LT5scGFnZV9pbmZvW2pdW2lkeF0ucm1hcF9wZGUpOworCQkJCQkmbWVtc2xvdC0+bHBhZ2VfaW5mb1tqXVtpZHhdLnJtYXBfcGRlLAorCQkJCQlkYXRhKTsKIAkJCX0KIAkJfQogCX0KQEAgLTgwMiwxMCArODQ0LDE2IEBACiAKIGludCBrdm1fdW5tYXBfaHZhKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyBodmEpCiB7Ci0JcmV0dXJuIGt2bV9oYW5kbGVfaHZhKGt2bSwgaHZhLCBrdm1fdW5tYXBfcm1hcHApOworCXJldHVybiBrdm1faGFuZGxlX2h2YShrdm0sIGh2YSwgMCwga3ZtX3VubWFwX3JtYXBwKTsKIH0KIAotc3RhdGljIGludCBrdm1fYWdlX3JtYXBwKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyAqcm1hcHApCit2b2lkIGt2bV9zZXRfc3B0ZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSwgcHRlX3QgcHRlKQoreworCWt2bV9oYW5kbGVfaHZhKGt2bSwgaHZhLCAodW5zaWduZWQgbG9uZykmcHRlLCBrdm1fc2V0X3B0ZV9ybWFwcCk7Cit9CisKK3N0YXRpYyBpbnQga3ZtX2FnZV9ybWFwcChzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgKnJtYXBwLAorCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAl1NjQgKnNwdGU7CiAJaW50IHlvdW5nID0gMDsKQEAgLTg0MSwxMyArODg5LDEzIEBACiAJZ2ZuID0gdW5hbGlhc19nZm4odmNwdS0+a3ZtLCBnZm4pOwogCXJtYXBwID0gZ2ZuX3RvX3JtYXAodmNwdS0+a3ZtLCBnZm4sIHNwLT5yb2xlLmxldmVsKTsKIAotCWt2bV91bm1hcF9ybWFwcCh2Y3B1LT5rdm0sIHJtYXBwKTsKKwlrdm1fdW5tYXBfcm1hcHAodmNwdS0+a3ZtLCBybWFwcCwgMCk7CiAJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKHZjcHUtPmt2bSk7CiB9CiAKIGludCBrdm1fYWdlX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaHZhKQogewotCXJldHVybiBrdm1faGFuZGxlX2h2YShrdm0sIGh2YSwga3ZtX2FnZV9ybWFwcCk7CisJcmV0dXJuIGt2bV9oYW5kbGVfaHZhKGt2bSwgaHZhLCAwLCBrdm1fYWdlX3JtYXBwKTsKIH0KIAogI2lmZGVmIE1NVV9ERUJVRwpAQCAtMTc1Niw3ICsxODA0LDcgQEAKIAkJICAgIHVuc2lnbmVkIHB0ZV9hY2Nlc3MsIGludCB1c2VyX2ZhdWx0LAogCQkgICAgaW50IHdyaXRlX2ZhdWx0LCBpbnQgZGlydHksIGludCBsZXZlbCwKIAkJICAgIGdmbl90IGdmbiwgcGZuX3QgcGZuLCBib29sIHNwZWN1bGF0aXZlLAotCQkgICAgYm9vbCBjYW5fdW5zeW5jKQorCQkgICAgYm9vbCBjYW5fdW5zeW5jLCBib29sIHJlc2V0X2hvc3RfcHJvdGVjdGlvbikKIHsKIAl1NjQgc3B0ZTsKIAlpbnQgcmV0ID0gMDsKQEAgLTE3ODMsNiArMTgzMSw5IEBACiAJCXNwdGUgfD0ga3ZtX3g4Nl9vcHMtPmdldF9tdF9tYXNrKHZjcHUsIGdmbiwKIAkJCWt2bV9pc19tbWlvX3BmbihwZm4pKTsKIAorCWlmIChyZXNldF9ob3N0X3Byb3RlY3Rpb24pCisJCXNwdGUgfD0gU1BURV9IT1NUX1dSSVRFQUJMRTsKKwogCXNwdGUgfD0gKHU2NClwZm4gPDwgUEFHRV9TSElGVDsKIAogCWlmICgocHRlX2FjY2VzcyAmIEFDQ19XUklURV9NQVNLKQpAQCAtMTgyOCw3ICsxODc5LDggQEAKIAkJCSB1bnNpZ25lZCBwdF9hY2Nlc3MsIHVuc2lnbmVkIHB0ZV9hY2Nlc3MsCiAJCQkgaW50IHVzZXJfZmF1bHQsIGludCB3cml0ZV9mYXVsdCwgaW50IGRpcnR5LAogCQkJIGludCAqcHR3cml0ZSwgaW50IGxldmVsLCBnZm5fdCBnZm4sCi0JCQkgcGZuX3QgcGZuLCBib29sIHNwZWN1bGF0aXZlKQorCQkJIHBmbl90IHBmbiwgYm9vbCBzcGVjdWxhdGl2ZSwKKwkJCSBib29sIHJlc2V0X2hvc3RfcHJvdGVjdGlvbikKIHsKIAlpbnQgd2FzX3JtYXBwZWQgPSAwOwogCWludCB3YXNfd3JpdGVibGUgPSBpc193cml0ZWJsZV9wdGUoKnNwdGVwKTsKQEAgLTE4NjAsNyArMTkxMiw4IEBACiAJfQogCiAJaWYgKHNldF9zcHRlKHZjcHUsIHNwdGVwLCBwdGVfYWNjZXNzLCB1c2VyX2ZhdWx0LCB3cml0ZV9mYXVsdCwKLQkJICAgICAgZGlydHksIGxldmVsLCBnZm4sIHBmbiwgc3BlY3VsYXRpdmUsIHRydWUpKSB7CisJCSAgICAgIGRpcnR5LCBsZXZlbCwgZ2ZuLCBwZm4sIHNwZWN1bGF0aXZlLCB0cnVlLAorCQkgICAgICByZXNldF9ob3N0X3Byb3RlY3Rpb24pKSB7CiAJCWlmICh3cml0ZV9mYXVsdCkKIAkJCSpwdHdyaXRlID0gMTsKIAkJa3ZtX3g4Nl9vcHMtPnRsYl9mbHVzaCh2Y3B1KTsKQEAgLTE4NzcsOCArMTkzMCw3IEBACiAJcGFnZV9oZWFkZXJfdXBkYXRlX3Nsb3QodmNwdS0+a3ZtLCBzcHRlcCwgZ2ZuKTsKIAlpZiAoIXdhc19ybWFwcGVkKSB7CiAJCXJtYXBfY291bnQgPSBybWFwX2FkZCh2Y3B1LCBzcHRlcCwgZ2ZuKTsKLQkJaWYgKCFpc19ybWFwX3NwdGUoKnNwdGVwKSkKLQkJCWt2bV9yZWxlYXNlX3Bmbl9jbGVhbihwZm4pOworCQlrdm1fcmVsZWFzZV9wZm5fY2xlYW4ocGZuKTsKIAkJaWYgKHJtYXBfY291bnQgPiBSTUFQX1JFQ1lDTEVfVEhSRVNIT0xEKQogCQkJcm1hcF9yZWN5Y2xlKHZjcHUsIHNwdGVwLCBnZm4pOwogCX0gZWxzZSB7CkBAIC0xOTA5LDcgKzE5NjEsNyBAQAogCQlpZiAoaXRlcmF0b3IubGV2ZWwgPT0gbGV2ZWwpIHsKIAkJCW1tdV9zZXRfc3B0ZSh2Y3B1LCBpdGVyYXRvci5zcHRlcCwgQUNDX0FMTCwgQUNDX0FMTCwKIAkJCQkgICAgIDAsIHdyaXRlLCAxLCAmcHRfd3JpdGUsCi0JCQkJICAgICBsZXZlbCwgZ2ZuLCBwZm4sIGZhbHNlKTsKKwkJCQkgICAgIGxldmVsLCBnZm4sIHBmbiwgZmFsc2UsIHRydWUpOwogCQkJKyt2Y3B1LT5zdGF0LnBmX2ZpeGVkOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKaW5kZXggZDJmZWM5Yy4uNzI1NThmOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKKysrIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKQEAgLTI3Myw5ICsyNzMsMTMgQEAKIAlpZiAobW11X25vdGlmaWVyX3JldHJ5KHZjcHUsIHZjcHUtPmFyY2gudXBkYXRlX3B0ZS5tbXVfc2VxKSkKIAkJcmV0dXJuOwogCWt2bV9nZXRfcGZuKHBmbik7CisJLyoKKwkgKiB3ZSBjYWxsIG1tdV9zZXRfc3B0ZSgpIHdpdGggcmVzZXRfaG9zdF9wcm90ZWN0aW9uID0gdHJ1ZSBiZWFjdXNlIHRoYXQKKwkgKiB2Y3B1LT5hcmNoLnVwZGF0ZV9wdGUucGZuIHdhcyBmZXRjaGVkIGZyb20gZ2V0X3VzZXJfcGFnZXMod3JpdGUgPSAxKS4KKwkgKi8KIAltbXVfc2V0X3NwdGUodmNwdSwgc3B0ZSwgcGFnZS0+cm9sZS5hY2Nlc3MsIHB0ZV9hY2Nlc3MsIDAsIDAsCiAJCSAgICAgZ3B0ZSAmIFBUX0RJUlRZX01BU0ssIE5VTEwsIFBUX1BBR0VfVEFCTEVfTEVWRUwsCi0JCSAgICAgZ3B0ZV90b19nZm4oZ3B0ZSksIHBmbiwgdHJ1ZSk7CisJCSAgICAgZ3B0ZV90b19nZm4oZ3B0ZSksIHBmbiwgdHJ1ZSwgdHJ1ZSk7CiB9CiAKIC8qCkBAIC0zMDgsNyArMzEyLDcgQEAKIAkJCQkgICAgIHVzZXJfZmF1bHQsIHdyaXRlX2ZhdWx0LAogCQkJCSAgICAgZ3ctPnB0ZXNbZ3ctPmxldmVsLTFdICYgUFRfRElSVFlfTUFTSywKIAkJCQkgICAgIHB0d3JpdGUsIGxldmVsLAotCQkJCSAgICAgZ3ctPmdmbiwgcGZuLCBmYWxzZSk7CisJCQkJICAgICBndy0+Z2ZuLCBwZm4sIGZhbHNlLCB0cnVlKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTU1OCw2ICs1NjIsNyBAQAogc3RhdGljIGludCBGTkFNRShzeW5jX3BhZ2UpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCiB7CiAJaW50IGksIG9mZnNldCwgbnJfcHJlc2VudDsKKwlib29sIHJlc2V0X2hvc3RfcHJvdGVjdGlvbjsKIAogCW9mZnNldCA9IG5yX3ByZXNlbnQgPSAwOwogCkBAIC01OTUsOSArNjAwLDE2IEBACiAKIAkJbnJfcHJlc2VudCsrOwogCQlwdGVfYWNjZXNzID0gc3AtPnJvbGUuYWNjZXNzICYgRk5BTUUoZ3B0ZV9hY2Nlc3MpKHZjcHUsIGdwdGUpOworCQlpZiAoIShzcC0+c3B0W2ldICYgU1BURV9IT1NUX1dSSVRFQUJMRSkpIHsKKwkJCXB0ZV9hY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOworCQkJcmVzZXRfaG9zdF9wcm90ZWN0aW9uID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJlc2V0X2hvc3RfcHJvdGVjdGlvbiA9IDE7CisJCX0KIAkJc2V0X3NwdGUodmNwdSwgJnNwLT5zcHRbaV0sIHB0ZV9hY2Nlc3MsIDAsIDAsCiAJCQkgaXNfZGlydHlfZ3B0ZShncHRlKSwgUFRfUEFHRV9UQUJMRV9MRVZFTCwgZ2ZuLAotCQkJIHNwdGVfdG9fcGZuKHNwLT5zcHRbaV0pLCB0cnVlLCBmYWxzZSk7CisJCQkgc3B0ZV90b19wZm4oc3AtPnNwdFtpXSksIHRydWUsIGZhbHNlLAorCQkJIHJlc2V0X2hvc3RfcHJvdGVjdGlvbik7CiAJfQogCiAJcmV0dXJuICFucl9wcmVzZW50OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3N2bS5jIGIvYXJjaC94ODYva3ZtL3N2bS5jCmluZGV4IDk0NGNjOWMuLmMxNzQwNGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9zdm0uYworKysgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKQEAgLTc2Nyw2ICs3NjcsOCBAQAogCQlyZHRzY2xsKHRzY190aGlzKTsKIAkJZGVsdGEgPSB2Y3B1LT5hcmNoLmhvc3RfdHNjIC0gdHNjX3RoaXM7CiAJCXN2bS0+dm1jYi0+Y29udHJvbC50c2Nfb2Zmc2V0ICs9IGRlbHRhOworCQlpZiAoaXNfbmVzdGVkKHN2bSkpCisJCQlzdm0tPm5lc3RlZC5oc2F2ZS0+Y29udHJvbC50c2Nfb2Zmc2V0ICs9IGRlbHRhOwogCQl2Y3B1LT5jcHUgPSBjcHU7CiAJCWt2bV9taWdyYXRlX3RpbWVycyh2Y3B1KTsKIAkJc3ZtLT5hc2lkX2dlbmVyYXRpb24gPSAwOwpAQCAtMjA1NywxMCArMjA1OSwxNCBAQAogCiAJc3dpdGNoIChlY3gpIHsKIAljYXNlIE1TUl9JQTMyX1RTQzogewotCQl1NjQgdHNjOworCQl1NjQgdHNjX29mZnNldDsKIAotCQlyZHRzY2xsKHRzYyk7Ci0JCSpkYXRhID0gc3ZtLT52bWNiLT5jb250cm9sLnRzY19vZmZzZXQgKyB0c2M7CisJCWlmIChpc19uZXN0ZWQoc3ZtKSkKKwkJCXRzY19vZmZzZXQgPSBzdm0tPm5lc3RlZC5oc2F2ZS0+Y29udHJvbC50c2Nfb2Zmc2V0OworCQllbHNlCisJCQl0c2Nfb2Zmc2V0ID0gc3ZtLT52bWNiLT5jb250cm9sLnRzY19vZmZzZXQ7CisKKwkJKmRhdGEgPSB0c2Nfb2Zmc2V0ICsgbmF0aXZlX3JlYWRfdHNjKCk7CiAJCWJyZWFrOwogCX0KIAljYXNlIE1TUl9LNl9TVEFSOgpAQCAtMjE0NiwxMCArMjE1MiwxNyBAQAogCiAJc3dpdGNoIChlY3gpIHsKIAljYXNlIE1TUl9JQTMyX1RTQzogewotCQl1NjQgdHNjOworCQl1NjQgdHNjX29mZnNldCA9IGRhdGEgLSBuYXRpdmVfcmVhZF90c2MoKTsKKwkJdTY0IGdfdHNjX29mZnNldCA9IDA7CiAKLQkJcmR0c2NsbCh0c2MpOwotCQlzdm0tPnZtY2ItPmNvbnRyb2wudHNjX29mZnNldCA9IGRhdGEgLSB0c2M7CisJCWlmIChpc19uZXN0ZWQoc3ZtKSkgeworCQkJZ190c2Nfb2Zmc2V0ID0gc3ZtLT52bWNiLT5jb250cm9sLnRzY19vZmZzZXQgLQorCQkJCSAgICAgICBzdm0tPm5lc3RlZC5oc2F2ZS0+Y29udHJvbC50c2Nfb2Zmc2V0OworCQkJc3ZtLT5uZXN0ZWQuaHNhdmUtPmNvbnRyb2wudHNjX29mZnNldCA9IHRzY19vZmZzZXQ7CisJCX0KKworCQlzdm0tPnZtY2ItPmNvbnRyb2wudHNjX29mZnNldCA9IHRzY19vZmZzZXQgKyBnX3RzY19vZmZzZXQ7CisKIAkJYnJlYWs7CiAJfQogCWNhc2UgTVNSX0s2X1NUQVI6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdm14LmMgYi9hcmNoL3g4Ni9rdm0vdm14LmMKaW5kZXggZjM4MTIwMS4uZWQ1M2I0MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3ZteC5jCisrKyBiL2FyY2gveDg2L2t2bS92bXguYwpAQCAtNzA5LDcgKzcwOSw3IEBACiAJaWYgKHZjcHUtPmNwdSAhPSBjcHUpIHsKIAkJdmNwdV9jbGVhcih2bXgpOwogCQlrdm1fbWlncmF0ZV90aW1lcnModmNwdSk7Ci0JCXZwaWRfc3luY192Y3B1X2FsbCh2bXgpOworCQlzZXRfYml0KEtWTV9SRVFfVExCX0ZMVVNILCAmdmNwdS0+cmVxdWVzdHMpOwogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQlsaXN0X2FkZCgmdm14LT5sb2NhbF92Y3B1c19saW5rLAogCQkJICZwZXJfY3B1KHZjcHVzX29uX2NwdSwgY3B1KSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0veDg2LmMgYi9hcmNoL3g4Ni9rdm0veDg2LmMKaW5kZXggYmU0NTFlZS4uOWI5Njk1MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3g4Ni5jCisrKyBiL2FyY2gveDg2L2t2bS94ODYuYwpAQCAtMTU5MSw2ICsxNTkxLDggQEAKIAogCWlmIChjcHVpZC0+bmVudCA8IDEpCiAJCWdvdG8gb3V0OworCWlmIChjcHVpZC0+bmVudCA+IEtWTV9NQVhfQ1BVSURfRU5UUklFUykKKwkJY3B1aWQtPm5lbnQgPSBLVk1fTUFYX0NQVUlEX0VOVFJJRVM7CiAJciA9IC1FTk9NRU07CiAJY3B1aWRfZW50cmllcyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fY3B1aWRfZW50cnkyKSAqIGNwdWlkLT5uZW50KTsKIAlpZiAoIWNwdWlkX2VudHJpZXMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvTWFrZWZpbGUgYi9hcmNoL3g4Ni9saWIvTWFrZWZpbGUKaW5kZXggOWU2MDkyMC4uODVmNWRiOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2xpYi9NYWtlZmlsZQpAQCAtMTYsNyArMTYsOSBAQAogICAgICAgICBsaWIteSArPSBjaGVja3N1bV8zMi5vCiAgICAgICAgIGxpYi15ICs9IHN0cnN0cl8zMi5vCiAgICAgICAgIGxpYi15ICs9IHNlbWFwaG9yZV8zMi5vIHN0cmluZ18zMi5vCi0KK2lmbmVxICgkKENPTkZJR19YODZfQ01QWENIRzY0KSx5KQorICAgICAgICBsaWIteSArPSBjbXB4Y2hnOGJfZW11Lm8KK2VuZGlmCiAgICAgICAgIGxpYi0kKENPTkZJR19YODZfVVNFXzNETk9XKSArPSBtbXhfMzIubwogZWxzZQogICAgICAgICBvYmoteSArPSBpb182NC5vIGlvbWFwX2NvcHlfNjQubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL2NtcHhjaGc4Yl9lbXUuUyBiL2FyY2gveDg2L2xpYi9jbXB4Y2hnOGJfZW11LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4Y2I3MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2xpYi9jbXB4Y2hnOGJfZW11LlMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCisgKglvZiB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUtYXNtLmg+CisjaW5jbHVkZSA8YXNtL2ZyYW1lLmg+CisjaW5jbHVkZSA8YXNtL2R3YXJmMi5oPgorCisKKy50ZXh0CisKKy8qCisgKiBJbnB1dHM6CisgKiAlZXNpIDogbWVtb3J5IGxvY2F0aW9uIHRvIGNvbXBhcmUKKyAqICVlYXggOiBsb3cgMzIgYml0cyBvZiBvbGQgdmFsdWUKKyAqICVlZHggOiBoaWdoIDMyIGJpdHMgb2Ygb2xkIHZhbHVlCisgKiAlZWJ4IDogbG93IDMyIGJpdHMgb2YgbmV3IHZhbHVlCisgKiAlZWN4IDogaGlnaCAzMiBiaXRzIG9mIG5ldyB2YWx1ZQorICovCitFTlRSWShjbXB4Y2hnOGJfZW11KQorQ0ZJX1NUQVJUUFJPQworCisjCisjIEVtdWxhdGUgJ2NtcHhjaGc4YiAoJWVzaSknIG9uIFVQIGV4Y2VwdCB3ZSBkb24ndAorIyBzZXQgdGhlIHdob2xlIFpGIHRoaW5nIChjYWxsZXIgd2lsbCBqdXN0IGNvbXBhcmUKKyMgZWF4OmVkeCB3aXRoIHRoZSBleHBlY3RlZCB2YWx1ZSkKKyMKK2NtcHhjaGc4Yl9lbXU6CisJcHVzaGZsCisJY2xpCisKKwljbXBsICAoJWVzaSksICVlYXgKKwlqbmUgbm90X3NhbWUKKwljbXBsIDQoJWVzaSksICVlZHgKKwlqbmUgaGFsZl9zYW1lCisKKwltb3ZsICVlYngsICAoJWVzaSkKKwltb3ZsICVlY3gsIDQoJWVzaSkKKworCXBvcGZsCisJcmV0CisKKyBub3Rfc2FtZToKKwltb3ZsICAoJWVzaSksICVlYXgKKyBoYWxmX3NhbWU6CisJbW92bCA0KCVlc2kpLCAlZWR4CisKKwlwb3BmbAorCXJldAorCitDRklfRU5EUFJPQworRU5EUFJPQyhjbXB4Y2hnOGJfZW11KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9tbS9NYWtlZmlsZQppbmRleCA5YjVhOWY1Li4wNjYzMGQyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9tbS9NYWtlZmlsZQpAQCAtMSw5ICsxLDEwIEBACiBvYmoteQk6PSAgaW5pdC5vIGluaXRfJChCSVRTKS5vIGZhdWx0Lm8gaW9yZW1hcC5vIGV4dGFibGUubyBwYWdlYXR0ci5vIG1tYXAubyBcCi0JICAgIHBhdC5vIHBndGFibGUubyBwaHlzYWRkci5vIGd1cC5vCisJICAgIHBhdC5vIHBndGFibGUubyBwaHlzYWRkci5vIGd1cC5vIHNldHVwX254Lm8KIAogIyBNYWtlIHN1cmUgX19waHlzX2FkZHIgaGFzIG5vIHN0YWNrcHJvdGVjdG9yCiBub3N0YWNrcCA6PSAkKGNhbGwgY2Mtb3B0aW9uLCAtZm5vLXN0YWNrLXByb3RlY3RvcikKIENGTEFHU19waHlzYWRkci5vCQk6PSAkKG5vc3RhY2twKQorQ0ZMQUdTX3NldHVwX254Lm8JCTo9ICQobm9zdGFja3ApCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSB0bGIubwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9mYXVsdC5jIGIvYXJjaC94ODYvbW0vZmF1bHQuYwppbmRleCA4MjcyOGYyLi5mNGNlZTkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKQEAgLTE2Nyw2ICsxNjcsNyBAQAogCWluZm8uc2lfZXJybm8JPSAwOwogCWluZm8uc2lfY29kZQk9IHNpX2NvZGU7CiAJaW5mby5zaV9hZGRyCT0gKHZvaWQgX191c2VyICopYWRkcmVzczsKKwlpbmZvLnNpX2FkZHJfbHNiID0gc2lfY29kZSA9PSBCVVNfTUNFRVJSX0FSID8gUEFHRV9TSElGVCA6IDA7CiAKIAlmb3JjZV9zaWdfaW5mbyhzaV9zaWdubywgJmluZm8sIHRzayk7CiB9CkBAIC03OTAsMTAgKzc5MSwxMiBAQAogfQogCiBzdGF0aWMgdm9pZAotZG9fc2lnYnVzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK2RvX3NpZ2J1cyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJICB1bnNpZ25lZCBpbnQgZmF1bHQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdHNrLT5tbTsKKwlpbnQgY29kZSA9IEJVU19BRFJFUlI7CiAKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCkBAIC04MDksNyArODEyLDE1IEBACiAJdHNrLT50aHJlYWQuZXJyb3JfY29kZQk9IGVycm9yX2NvZGU7CiAJdHNrLT50aHJlYWQudHJhcF9ubwk9IDE0OwogCi0JZm9yY2Vfc2lnX2luZm9fZmF1bHQoU0lHQlVTLCBCVVNfQURSRVJSLCBhZGRyZXNzLCB0c2spOworI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQorCWlmIChmYXVsdCAmIFZNX0ZBVUxUX0hXUE9JU09OKSB7CisJCXByaW50ayhLRVJOX0VSUgorCSJNQ0U6IEtpbGxpbmcgJXM6JWQgZHVlIHRvIGhhcmR3YXJlIG1lbW9yeSBjb3JydXB0aW9uIGZhdWx0IGF0ICVseFxuIiwKKwkJCXRzay0+Y29tbSwgdHNrLT5waWQsIGFkZHJlc3MpOworCQljb2RlID0gQlVTX01DRUVSUl9BUjsKKwl9CisjZW5kaWYKKwlmb3JjZV9zaWdfaW5mb19mYXVsdChTSUdCVVMsIGNvZGUsIGFkZHJlc3MsIHRzayk7CiB9CiAKIHN0YXRpYyBub2lubGluZSB2b2lkCkBAIC04MTksOCArODMwLDggQEAKIAlpZiAoZmF1bHQgJiBWTV9GQVVMVF9PT00pIHsKIAkJb3V0X29mX21lbW9yeShyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKIAl9IGVsc2UgewotCQlpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpCi0JCQlkb19zaWdidXMocmVncywgZXJyb3JfY29kZSwgYWRkcmVzcyk7CisJCWlmIChmYXVsdCAmIChWTV9GQVVMVF9TSUdCVVN8Vk1fRkFVTFRfSFdQT0lTT04pKQorCQkJZG9fc2lnYnVzKHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MsIGZhdWx0KTsKIAkJZWxzZQogCQkJQlVHKCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdC5jIGIvYXJjaC94ODYvbW0vaW5pdC5jCmluZGV4IDA2MDcxMTkuLjczZmZkNTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0LmMKQEAgLTI4LDY5ICsyOCw2IEBACiAjZW5kaWYKIDsKIAotaW50IG54X2VuYWJsZWQ7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9QQUUpCi1zdGF0aWMgaW50IGRpc2FibGVfbnggX19jcHVpbml0ZGF0YTsKLQotLyoKLSAqIG5vZXhlYyA9IG9ufG9mZgotICoKLSAqIENvbnRyb2wgbm9uLWV4ZWN1dGFibGUgbWFwcGluZ3MgZm9yIHByb2Nlc3Nlcy4KLSAqCi0gKiBvbiAgICAgIEVuYWJsZQotICogb2ZmICAgICBEaXNhYmxlCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG5vZXhlY19zZXR1cChjaGFyICpzdHIpCi17Ci0JaWYgKCFzdHIpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICghc3RybmNtcChzdHIsICJvbiIsIDIpKSB7Ci0JCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOwotCQlkaXNhYmxlX254ID0gMDsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgIm9mZiIsIDMpKSB7Ci0JCWRpc2FibGVfbnggPSAxOwotCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7Ci0JfQotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oIm5vZXhlYyIsIG5vZXhlY19zZXR1cCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19YODZfUEFFCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0X254KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHZbNF0sIGwsIGg7Ci0KLQlpZiAoY3B1X2hhc19wYWUgJiYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+IDB4ODAwMDAwMDEpKSB7Ci0JCWNwdWlkKDB4ODAwMDAwMDEsICZ2WzBdLCAmdlsxXSwgJnZbMl0sICZ2WzNdKTsKLQotCQlpZiAoKHZbM10gJiAoMSA8PCAyMCkpICYmICFkaXNhYmxlX254KSB7Ci0JCQlyZG1zcihNU1JfRUZFUiwgbCwgaCk7Ci0JCQlsIHw9IEVGRVJfTlg7Ci0JCQl3cm1zcihNU1JfRUZFUiwgbCwgaCk7Ci0JCQlueF9lbmFibGVkID0gMTsKLQkJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOwotCQl9Ci0JfQotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbngodm9pZCkKLXsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotdm9pZCBfX2NwdWluaXQgY2hlY2tfZWZlcih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZWZlcjsKLQotCXJkbXNybChNU1JfRUZFUiwgZWZlcik7Ci0JaWYgKCEoZWZlciAmIEVGRVJfTlgpIHx8IGRpc2FibGVfbngpCi0JCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9OWDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBfX2luaXQgZmluZF9lYXJseV90YWJsZV9zcGFjZSh1bnNpZ25lZCBsb25nIGVuZCwgaW50IHVzZV9wc2UsCiAJCQkJCSAgaW50IHVzZV9nYnBhZ2VzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKaW5kZXggMjQ5NTJmZC4uZGQzOGJmYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCkBAIC0xNDQsNiArMTQ0LDcgQEAKIAogCW1iKCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjbGZsdXNoX2NhY2hlX3JhbmdlKTsKIAogc3RhdGljIHZvaWQgX19jcGFfZmx1c2hfYWxsKHZvaWQgKmFyZykKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhdC5jIGIvYXJjaC94ODYvbW0vcGF0LmMKaW5kZXggNzI1N2NmMy4uZTc4Y2QwZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGF0LmMKKysrIGIvYXJjaC94ODYvbW0vcGF0LmMKQEAgLTgxLDYgKzgxLDcgQEAKIHZvaWQgcGF0X2luaXQodm9pZCkKIHsKIAl1NjQgcGF0OworCWJvb2wgYm9vdF9jcHUgPSAhYm9vdF9wYXRfc3RhdGU7CiAKIAlpZiAoIXBhdF9lbmFibGVkKQogCQlyZXR1cm47CkBAIC0xMjIsOCArMTIzLDEwIEBACiAJCXJkbXNybChNU1JfSUEzMl9DUl9QQVQsIGJvb3RfcGF0X3N0YXRlKTsKIAogCXdybXNybChNU1JfSUEzMl9DUl9QQVQsIHBhdCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAieDg2IFBBVCBlbmFibGVkOiBjcHUgJWQsIG9sZCAweCVMeCwgbmV3IDB4JUx4XG4iLAotCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksIGJvb3RfcGF0X3N0YXRlLCBwYXQpOworCisJaWYgKGJvb3RfY3B1KQorCQlwcmludGsoS0VSTl9JTkZPICJ4ODYgUEFUIGVuYWJsZWQ6IGNwdSAlZCwgb2xkIDB4JUx4LCBuZXcgMHglTHhcbiIsCisJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksIGJvb3RfcGF0X3N0YXRlLCBwYXQpOwogfQogCiAjdW5kZWYgUEFUCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9zZXR1cF9ueC5jIGIvYXJjaC94ODYvbW0vc2V0dXBfbnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTNkOGVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvbW0vc2V0dXBfbnguYwpAQCAtMCwwICsxLDY5IEBACisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKK2ludCBueF9lbmFibGVkOworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSB8fCBkZWZpbmVkKENPTkZJR19YODZfUEFFKQorc3RhdGljIGludCBkaXNhYmxlX254IF9fY3B1aW5pdGRhdGE7CisKKy8qCisgKiBub2V4ZWMgPSBvbnxvZmYKKyAqCisgKiBDb250cm9sIG5vbi1leGVjdXRhYmxlIG1hcHBpbmdzIGZvciBwcm9jZXNzZXMuCisgKgorICogb24gICAgICBFbmFibGUKKyAqIG9mZiAgICAgRGlzYWJsZQorICovCitzdGF0aWMgaW50IF9faW5pdCBub2V4ZWNfc2V0dXAoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXN0cm5jbXAoc3RyLCAib24iLCAyKSkgeworCQlfX3N1cHBvcnRlZF9wdGVfbWFzayB8PSBfUEFHRV9OWDsKKwkJZGlzYWJsZV9ueCA9IDA7CisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJvZmYiLCAzKSkgeworCQlkaXNhYmxlX254ID0gMTsKKwkJX19zdXBwb3J0ZWRfcHRlX21hc2sgJj0gfl9QQUdFX05YOworCX0KKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub2V4ZWMiLCBub2V4ZWNfc2V0dXApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQordm9pZCBfX2luaXQgc2V0X254KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHZbNF0sIGwsIGg7CisKKwlpZiAoY3B1X2hhc19wYWUgJiYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+IDB4ODAwMDAwMDEpKSB7CisJCWNwdWlkKDB4ODAwMDAwMDEsICZ2WzBdLCAmdlsxXSwgJnZbMl0sICZ2WzNdKTsKKworCQlpZiAoKHZbM10gJiAoMSA8PCAyMCkpICYmICFkaXNhYmxlX254KSB7CisJCQlyZG1zcihNU1JfRUZFUiwgbCwgaCk7CisJCQlsIHw9IEVGRVJfTlg7CisJCQl3cm1zcihNU1JfRUZFUiwgbCwgaCk7CisJCQlueF9lbmFibGVkID0gMTsKKwkJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOworCQl9CisJfQorfQorI2Vsc2UKK3ZvaWQgc2V0X254KHZvaWQpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfNjQKK3ZvaWQgX19jcHVpbml0IGNoZWNrX2VmZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGVmZXI7CisKKwlyZG1zcmwoTVNSX0VGRVIsIGVmZXIpOworCWlmICghKGVmZXIgJiBFRkVSX05YKSB8fCBkaXNhYmxlX254KQorCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vdGxiLmMgYi9hcmNoL3g4Ni9tbS90bGIuYwppbmRleCBjODE0ZTE0Li4zNmZlMDhlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS90bGIuYworKysgYi9hcmNoL3g4Ni9tbS90bGIuYwpAQCAtNTksNyArNTksOCBAQAogewogCWlmIChwZXJjcHVfcmVhZChjcHVfdGxic3RhdGUuc3RhdGUpID09IFRMQlNUQVRFX09LKQogCQlCVUcoKTsKLQljcHVfY2xlYXIoY3B1LCBwZXJjcHVfcmVhZChjcHVfdGxic3RhdGUuYWN0aXZlX21tKS0+Y3B1X3ZtX21hc2spOworCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwKKwkJCSAgbW1fY3B1bWFzayhwZXJjcHVfcmVhZChjcHVfdGxic3RhdGUuYWN0aXZlX21tKSkpOwogCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxlYXZlX21tKTsKQEAgLTIzNCw4ICsyMzUsOCBAQAogCXByZWVtcHRfZGlzYWJsZSgpOwogCiAJbG9jYWxfZmx1c2hfdGxiKCk7Ci0JaWYgKGNwdW1hc2tfYW55X2J1dCgmbW0tPmNwdV92bV9tYXNrLCBzbXBfcHJvY2Vzc29yX2lkKCkpIDwgbnJfY3B1X2lkcykKLQkJZmx1c2hfdGxiX290aGVycygmbW0tPmNwdV92bV9tYXNrLCBtbSwgVExCX0ZMVVNIX0FMTCk7CisJaWYgKGNwdW1hc2tfYW55X2J1dChtbV9jcHVtYXNrKG1tKSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA8IG5yX2NwdV9pZHMpCisJCWZsdXNoX3RsYl9vdGhlcnMobW1fY3B1bWFzayhtbSksIG1tLCBUTEJfRkxVU0hfQUxMKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCkBAIC0yNDksOCArMjUwLDggQEAKIAkJZWxzZQogCQkJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAl9Ci0JaWYgKGNwdW1hc2tfYW55X2J1dCgmbW0tPmNwdV92bV9tYXNrLCBzbXBfcHJvY2Vzc29yX2lkKCkpIDwgbnJfY3B1X2lkcykKLQkJZmx1c2hfdGxiX290aGVycygmbW0tPmNwdV92bV9tYXNrLCBtbSwgVExCX0ZMVVNIX0FMTCk7CisJaWYgKGNwdW1hc2tfYW55X2J1dChtbV9jcHVtYXNrKG1tKSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA8IG5yX2NwdV9pZHMpCisJCWZsdXNoX3RsYl9vdGhlcnMobW1fY3B1bWFzayhtbSksIG1tLCBUTEJfRkxVU0hfQUxMKTsKIAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CkBAIC0yNjgsOCArMjY5LDggQEAKIAkJCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJfQogCi0JaWYgKGNwdW1hc2tfYW55X2J1dCgmbW0tPmNwdV92bV9tYXNrLCBzbXBfcHJvY2Vzc29yX2lkKCkpIDwgbnJfY3B1X2lkcykKLQkJZmx1c2hfdGxiX290aGVycygmbW0tPmNwdV92bV9tYXNrLCBtbSwgdmEpOworCWlmIChjcHVtYXNrX2FueV9idXQobW1fY3B1bWFzayhtbSksIHNtcF9wcm9jZXNzb3JfaWQoKSkgPCBucl9jcHVfaWRzKQorCQlmbHVzaF90bGJfb3RoZXJzKG1tX2NwdW1hc2sobW0pLCBtbSwgdmEpOwogCiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9jb21tb24uYyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwppbmRleCA1ZGI5NmQ0My4uMTMzMWZjZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwpAQCAtNjQ2LDcgKzY0Niw3IEBACiAKICNlbHNlIC8qIENPTkZJR19YODZfMzIgKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgbXBfYnVzX3RvX25vZGVbQlVTX05SXSA9IHsKK3N0YXRpYyBpbnQgbXBfYnVzX3RvX25vZGVbQlVTX05SXSA9IHsKIAlbMCAuLi4gQlVTX05SIC0gMV0gPSAtMQogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2kzODYuYyBiL2FyY2gveDg2L3BjaS9pMzg2LmMKaW5kZXggNTJlNjJlNS4uYjIyZDEzYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2kzODYuYworKysgYi9hcmNoL3g4Ni9wY2kvaTM4Ni5jCkBAIC0yNjYsNyArMjY2LDcgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgbGF0KTsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBwY2lfbW1hcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHBjaV9tbWFwX29wcyA9IHsKIAkuYWNjZXNzID0gZ2VuZXJpY19hY2Nlc3NfcGh5cywKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUgYi9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlCmluZGV4IDg4MTEyYjQ5Li42YjRmZmVkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQkgICAgICAgJChWRFNPX0xERkxBR1MpICQoVkRTT19MREZMQUdTXyQoZmlsdGVyICUubGRzLCQoXkYpKSkgXAogCQkgICAgICAgLVdsLC1ULCQoZmlsdGVyICUubGRzLCReKSAkKGZpbHRlciAlLm8sJF4pCiAKLVZEU09fTERGTEFHUyA9IC1mUElDIC1zaGFyZWQgJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKK1ZEU09fTERGTEFHUyA9IC1mUElDIC1zaGFyZWQgJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1zeXN2KQogR0NPVl9QUk9GSUxFIDo9IG4KIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2RlYnVnZnMuYyBiL2FyY2gveDg2L3hlbi9kZWJ1Z2ZzLmMKaW5kZXggYjUzMjI1ZC4uZTEzM2NlMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2RlYnVnZnMuYworKysgYi9hcmNoL3g4Ni94ZW4vZGVidWdmcy5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdTMyX2FycmF5X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1MzJfYXJyYXlfZm9wcyA9IHsKIAkub3duZXIJPSBUSElTX01PRFVMRSwKIAkub3Blbgk9IHUzMl9hcnJheV9vcGVuLAogCS5yZWxlYXNlPSB4ZW5fYXJyYXlfcmVsZWFzZSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCA1NDRlYjc0OS4uZGZiZjcwZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCisrKyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpAQCAtMTc4LDYgKzE3OCw3IEBACiBzdGF0aWMgdm9pZCB4ZW5fY3B1aWQodW5zaWduZWQgaW50ICpheCwgdW5zaWduZWQgaW50ICpieCwKIAkJICAgICAgdW5zaWduZWQgaW50ICpjeCwgdW5zaWduZWQgaW50ICpkeCkKIHsKKwl1bnNpZ25lZCBtYXNrZWJ4ID0gfjA7CiAJdW5zaWduZWQgbWFza2VjeCA9IH4wOwogCXVuc2lnbmVkIG1hc2tlZHggPSB+MDsKIApAQCAtMTg1LDkgKzE4NiwxNiBAQAogCSAqIE1hc2sgb3V0IGluY29udmVuaWVudCBmZWF0dXJlcywgdG8gdHJ5IGFuZCBkaXNhYmxlIGFzIG1hbnkKIAkgKiB1bnN1cHBvcnRlZCBrZXJuZWwgc3Vic3lzdGVtcyBhcyBwb3NzaWJsZS4KIAkgKi8KLQlpZiAoKmF4ID09IDEpIHsKKwlzd2l0Y2ggKCpheCkgeworCWNhc2UgMToKIAkJbWFza2VjeCA9IGNwdWlkX2xlYWYxX2VjeF9tYXNrOwogCQltYXNrZWR4ID0gY3B1aWRfbGVhZjFfZWR4X21hc2s7CisJCWJyZWFrOworCisJY2FzZSAweGI6CisJCS8qIFN1cHByZXNzIGV4dGVuZGVkIHRvcG9sb2d5IHN0dWZmICovCisJCW1hc2tlYnggPSAwOworCQlicmVhazsKIAl9CiAKIAlhc20oWEVOX0VNVUxBVEVfUFJFRklYICJjcHVpZCIKQEAgLTE5Nyw2ICsyMDUsNyBAQAogCQkgICI9ZCIgKCpkeCkKIAkJOiAiMCIgKCpheCksICIyIiAoKmN4KSk7CiAKKwkqYnggJj0gbWFza2VieDsKIAkqY3ggJj0gbWFza2VjeDsKIAkqZHggJj0gbWFza2VkeDsKIH0KQEAgLTEwNzUsNiArMTA4NCw4IEBACiAJICogU2V0IHVwIHNvbWUgcGFnZXRhYmxlIHN0YXRlIGJlZm9yZSBzdGFydGluZyB0byBzZXQgYW55IHB0ZXMuCiAJICovCiAKKwl4ZW5faW5pdF9tbXVfb3BzKCk7CisKIAkvKiBQcmV2ZW50IHVud2FudGVkIGJpdHMgZnJvbSBiZWluZyBzZXQgaW4gUFRFcy4gKi8KIAlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfR0xPQkFMOwogCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpCkBAIC0xMDgyLDYgKzEwOTMsMTEgQEAKIAogCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX0lPTUFQOwogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS8qIFdvcmsgb3V0IGlmIHdlIHN1cHBvcnQgTlggKi8KKwljaGVja19lZmVyKCk7CisjZW5kaWYKKwogCXhlbl9zZXR1cF9mZWF0dXJlcygpOwogCiAJLyogR2V0IG1mbiBsaXN0ICovCkBAIC0xMDk0LDcgKzExMTAsNiBAQAogCSAqLwogCXhlbl9zZXR1cF9zdGFja3Byb3RlY3RvcigpOwogCi0JeGVuX2luaXRfbW11X29wcygpOwogCXhlbl9pbml0X2lycV9vcHMoKTsKIAl4ZW5faW5pdF9jcHVpZF9tYXNrKCk7CiAKQEAgLTExMjMsMTEgKzExMzgsNiBAQAogCiAJcGdkID0gKHBnZF90ICopeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2U7CiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JLyogV29yayBvdXQgaWYgd2Ugc3VwcG9ydCBOWCAqLwotCWNoZWNrX2VmZXIoKTsKLSNlbmRpZgotCiAJLyogRG9uJ3QgZG8gdGhlIGZ1bGwgdmNwdV9pbmZvIHBsYWNlbWVudCBzdHVmZiB1bnRpbCB3ZSBoYXZlIGEKIAkgICBwb3NzaWJsZSBtYXAgYW5kIGEgbm9uLWR1bW15IHNoYXJlZF9pbmZvLiAqLwogCXBlcl9jcHUoeGVuX3ZjcHUsIDApID0gJkhZUEVSVklTT1Jfc2hhcmVkX2luZm8tPnZjcHVfaW5mb1swXTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tbXUuYyBiL2FyY2gveDg2L3hlbi9tbXUuYwppbmRleCAwOTNkZDU5Li4zYmY3YjFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vbW11LmMKKysrIGIvYXJjaC94ODYveGVuL21tdS5jCkBAIC0xMTY1LDE0ICsxMTY1LDE0IEBACiAJLyogR2V0IHRoZSAib2ZmaWNpYWwiIHNldCBvZiBjcHVzIHJlZmVycmluZyB0byBvdXIgcGFnZXRhYmxlLiAqLwogCWlmICghYWxsb2NfY3B1bWFza192YXIoJm1hc2ssIEdGUF9BVE9NSUMpKSB7CiAJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmbW0tPmNwdV92bV9tYXNrKQorCQkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgbW1fY3B1bWFzayhtbSkpCiAJCQkgICAgJiYgcGVyX2NwdSh4ZW5fY3VycmVudF9jcjMsIGNwdSkgIT0gX19wYShtbS0+cGdkKSkKIAkJCQljb250aW51ZTsKIAkJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGRyb3Bfb3RoZXJfbW1fcmVmLCBtbSwgMSk7CiAJCX0KIAkJcmV0dXJuOwogCX0KLQljcHVtYXNrX2NvcHkobWFzaywgJm1tLT5jcHVfdm1fbWFzayk7CisJY3B1bWFza19jb3B5KG1hc2ssIG1tX2NwdW1hc2sobW0pKTsKIAogCS8qIEl0J3MgcG9zc2libGUgdGhhdCBhIHZjcHUgbWF5IGhhdmUgYSBzdGFsZSByZWZlcmVuY2UgdG8gb3VyCiAJICAgY3IzLCBiZWNhdXNlIGl0cyBpbiBsYXp5IG1vZGUsIGFuZCBpdCBoYXNuJ3QgeWV0IGZsdXNoZWQKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL2tlcm5lbC9NYWtlZmlsZQppbmRleCBmZTMxODZkZS4uNmY1NmQ5NSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjcsNyArMjcsOCBAQAogCS1lICdzLyhcKFwudGV4dFwuW2Etel0qXCkpLyhcMS5saXRlcmFsIFwxKS9nJwogCiBxdWlldF9jbWRfX2NwcF9sZHNfUyA9IExEUyAgICAgJEAKLSAgICAgIGNtZF9fY3BwX2xkc19TID0gJChDUFApICQoY3BwX2ZsYWdzKSAtRF9fQVNTRU1CTFlfXyAkPCB8IHNlZCAkKHNlZC15KSA+JEAKKyAgICAgIGNtZF9fY3BwX2xkc19TID0gJChDUFApICQoY3BwX2ZsYWdzKSAtUCAtQyAtVXh0ZW5zYSAtRF9fQVNTRU1CTFlfXyAkPCBcCisgICAgICAgICAgICAgICAgICAgICAgIHwgc2VkICQoc2VkLXkpID4kQAogCiAkKG9iaikvdm1saW51eC5sZHM6ICQoc3JjKS92bWxpbnV4Lmxkcy5TIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWRfZGVwLF9jcHBfbGRzX1MpCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TIGIvYXJjaC94dGVuc2Eva2VybmVsL2hlYWQuUwppbmRleCBkOWRkYzFiLi5kMjE1YWRjIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9oZWFkLlMKQEAgLTIzNSw3ICsyMzUsNyBAQAogICogQlNTIHNlY3Rpb24KICAqLwogCQotLnNlY3Rpb24gIi5ic3MucGFnZV9hbGlnbmVkIiwgInciCitfX1BBR0VfQUxJR05FRF9CU1MKICNpZmRlZiBDT05GSUdfTU1VCiBFTlRSWShzd2FwcGVyX3BnX2RpcikKIAkuZmlsbAlQQUdFX1NJWkUsIDEsIDAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCBjNDMwMmYwLi5jZDEyMmZiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL2luaXRfdGFzay5jCkBAIC0yMyw5ICsyMyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCBpbml0X3NpZ25hbHMgPSBJTklUX1NJR05BTFMoaW5pdF9zaWduYWxzKTsKIHN0YXRpYyBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgaW5pdF9zaWdoYW5kID0gSU5JVF9TSUdIQU5EKGluaXRfc2lnaGFuZCk7Ci11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIikpKSA9Ci17IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPQorCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CiAKIHN0cnVjdCB0YXNrX3N0cnVjdCBpbml0X3Rhc2sgPSBJTklUX1RBU0soaW5pdF90YXNrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKaW5kZXggMTkwODVmZi4uMTlmN2RmMyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggOTIxYjZmZi4uOWI1MjYxNSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE1LDYgKzE1LDggQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCiAjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdGZvcm0vaGFyZHdhcmUuaD4KQEAgLTEwNyw0MSArMTA5LDE4IEBACiAKICAgLmZpeHVwICAgOiB7ICooLmZpeHVwKSB9CiAKLSAgLiA9IEFMSUdOKDE2KTsKLQotICBfX2V4X3RhYmxlIDogewotICAgIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gICAgKihfX2V4X3RhYmxlKQotICAgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLSAgfQotCisgIEVYQ0VQVElPTl9UQUJMRSgxNikKICAgLyogRGF0YSBzZWN0aW9uICovCiAKLSAgLiA9IEFMSUdOKFhDSEFMX0lDQUNIRV9MSU5FU0laRSk7CiAgIF9mZGF0YSA9IC47Ci0gIC5kYXRhIDoKLSAgewotICAgIERBVEFfREFUQQotICAgIENPTlNUUlVDVE9SUwotICAgIC4gPSBBTElHTihYQ0hBTF9JQ0FDSEVfTElORVNJWkUpOwotICAgICooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0gIH0KLQorICBSV19EQVRBX1NFQ1RJT04oWENIQUxfSUNBQ0hFX0xJTkVTSVpFLCBQQUdFX1NJWkUsIFRIUkVBRF9TSVpFKQogICBfZWRhdGEgPSAuOwogCi0gIC8qIFRoZSBpbml0aWFsIHRhc2sgKi8KLSAgLiA9IEFMSUdOKDgxOTIpOwotICAuZGF0YS5pbml0X3Rhc2sgOiB7ICooLmRhdGEuaW5pdF90YXNrKSB9Ci0KICAgLyogSW5pdGlhbGl6YXRpb24gY29kZSBhbmQgZGF0YTogKi8KIAotICAuID0gQUxJR04oMSA8PCAxMik7CisgIC4gPSBBTElHTihQQUdFX1NJWkUpOwogICBfX2luaXRfYmVnaW4gPSAuOwotICAuaW5pdC50ZXh0IDogewotICAJX3Npbml0dGV4dCA9IC47Ci0JSU5JVF9URVhUCi0JX2Vpbml0dGV4dCA9IC47Ci0gIH0KKyAgSU5JVF9URVhUX1NFQ1RJT04oUEFHRV9TSVpFKQogCiAgIC5pbml0LmRhdGEgOgogICB7CkBAIC0xNjgsMzYgKzE0NywxNSBAQAogCQkgICAuRGVidWdJbnRlcnJ1cHRWZWN0b3IudGV4dCk7CiAgIAogICAgIF9fYm9vdF9yZWxvY190YWJsZV9lbmQgPSBBQlNPTFVURSguKSA7CisKKyAgICBJTklUX1NFVFVQKFhDSEFMX0lDQUNIRV9MSU5FU0laRSkKKyAgICBJTklUX0NBTExTCisgICAgQ09OX0lOSVRDQUxMCisgICAgU0VDVVJJVFlfSU5JVENBTEwKKyAgICBJTklUX1JBTV9GUwogICB9CiAKLSAgLiA9IEFMSUdOKFhDSEFMX0lDQUNIRV9MSU5FU0laRSk7Ci0KLSAgX19zZXR1cF9zdGFydCA9IC47Ci0gIC5pbml0LnNldHVwIDogeyAqKC5pbml0LnNldHVwKSB9Ci0gIF9fc2V0dXBfZW5kID0gLjsKLQotICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLSAgLmluaXRjYWxsLmluaXQgOiB7Ci0JSU5JVENBTExTCi0gIH0KLSAgX19pbml0Y2FsbF9lbmQgPSAuOwotCi0gIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKLSAgLmNvbl9pbml0Y2FsbC5pbml0IDogeyAqKC5jb25faW5pdGNhbGwuaW5pdCkgfQotICBfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwotCi0gIFNFQ1VSSVRZX0lOSVQKLQotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0cmFtZnNfc3RhcnQgPS47Ci0gIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LnJhbWZzKSB9Ci0gIF9faW5pdHJhbWZzX2VuZCA9IC47Ci0jZW5kaWYKLQotICBQRVJDUFUoNDA5NikKLQorICBQRVJDUFUoUEFHRV9TSVpFKQogCiAgIC8qIFdlIG5lZWQgdGhpcyBkdW1teSBzZWdtZW50IGhlcmUgKi8KIApAQCAtMjUyLDE2ICsyMTAsMTEgQEAKIAkJICAuRG91YmxlRXhjZXB0aW9uVmVjdG9yLmxpdGVyYWwpCiAKICAgLiA9IChMT0FEQUREUiggLkRvdWJsZUV4Y2VwdGlvblZlY3Rvci50ZXh0ICkgKyBTSVpFT0YoIC5Eb3VibGVFeGNlcHRpb25WZWN0b3IudGV4dCApICsgMykgJiB+IDM7Ci0gIC4gPSBBTElHTigxIDw8IDEyKTsKKyAgLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAKICAgX19pbml0X2VuZCA9IC47CiAKLSAgLiA9IEFMSUdOKDgxOTIpOwotCi0gIC8qIEJTUyBzZWN0aW9uICovCi0gIF9ic3Nfc3RhcnQgPSAuOwotICAuYnNzIDogeyAqKC5ic3MucGFnZV9hbGlnbmVkKSAqKC5ic3MpIH0KLSAgX2Jzc19lbmQgPSAuOworICBCU1NfU0VDVElPTigwLCA4MTkyLCAwKQogCiAgIF9lbmQgPSAuOwogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstYmFycmllci5jIGIvYmxvY2svYmxrLWJhcnJpZXIuYwppbmRleCA2NTkzYWIzLi44ODczYjliIDEwMDY0NAotLS0gYS9ibG9jay9ibGstYmFycmllci5jCisrKyBiL2Jsb2NrL2Jsay1iYXJyaWVyLmMKQEAgLTM1MCw2ICszNTAsNyBAQAogCiAJaWYgKGJpby0+YmlfcHJpdmF0ZSkKIAkJY29tcGxldGUoYmlvLT5iaV9wcml2YXRlKTsKKwlfX2ZyZWVfcGFnZShiaW9fcGFnZShiaW8pKTsKIAogCWJpb19wdXQoYmlvKTsKIH0KQEAgLTM3MiwzMCArMzczLDUwIEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKIAlpbnQgdHlwZSA9IGZsYWdzICYgRElTQ0FSRF9GTF9CQVJSSUVSID8KIAkJRElTQ0FSRF9CQVJSSUVSIDogRElTQ0FSRF9OT0JBUlJJRVI7CisJc3RydWN0IGJpbyAqYmlvOworCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFxKQogCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKCFxLT5wcmVwYXJlX2Rpc2NhcmRfZm4pCisJaWYgKCFibGtfcXVldWVfZGlzY2FyZChxKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJd2hpbGUgKG5yX3NlY3RzICYmICFyZXQpIHsKLQkJc3RydWN0IGJpbyAqYmlvID0gYmlvX2FsbG9jKGdmcF9tYXNrLCAwKTsKLQkJaWYgKCFiaW8pCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJdW5zaWduZWQgaW50IHNlY3Rvcl9zaXplID0gcS0+bGltaXRzLmxvZ2ljYWxfYmxvY2tfc2l6ZTsKKwkJdW5zaWduZWQgaW50IG1heF9kaXNjYXJkX3NlY3RvcnMgPQorCQkJbWluKHEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzLCBVSU5UX01BWCA+PiA5KTsKIAorCQliaW8gPSBiaW9fYWxsb2MoZ2ZwX21hc2ssIDEpOworCQlpZiAoIWJpbykKKwkJCWdvdG8gb3V0OworCQliaW8tPmJpX3NlY3RvciA9IHNlY3RvcjsKIAkJYmlvLT5iaV9lbmRfaW8gPSBibGtkZXZfZGlzY2FyZF9lbmRfaW87CiAJCWJpby0+YmlfYmRldiA9IGJkZXY7CiAJCWlmIChmbGFncyAmIERJU0NBUkRfRkxfV0FJVCkKIAkJCWJpby0+YmlfcHJpdmF0ZSA9ICZ3YWl0OwogCi0JCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCQkvKgorCQkgKiBBZGQgYSB6ZXJvZWQgb25lLXNlY3RvciBwYXlsb2FkIGFzIHRoYXQncyB3aGF0CisJCSAqIG91ciBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBuZWVkLiAgSWYgd2UnbGwgZXZlciBuZWVkCisJCSAqIG1vcmUgdGhlIGludGVyZmFjZSB3aWxsIG5lZWQgcmV2aXNpdGluZy4KKwkJICovCisJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBvdXRfZnJlZV9iaW87CisJCWlmIChiaW9fYWRkX3BjX3BhZ2UocSwgYmlvLCBwYWdlLCBzZWN0b3Jfc2l6ZSwgMCkgPCBzZWN0b3Jfc2l6ZSkKKwkJCWdvdG8gb3V0X2ZyZWVfcGFnZTsKIAotCQlpZiAobnJfc2VjdHMgPiBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSkgewotCQkJYmlvLT5iaV9zaXplID0gcXVldWVfbWF4X2h3X3NlY3RvcnMocSkgPDwgOTsKLQkJCW5yX3NlY3RzIC09IHF1ZXVlX21heF9od19zZWN0b3JzKHEpOwotCQkJc2VjdG9yICs9IHF1ZXVlX21heF9od19zZWN0b3JzKHEpOworCQkvKgorCQkgKiBBbmQgb3ZlcnJpZGUgdGhlIGJpbyBzaXplIC0gdGhlIHdheSBkaXNjYXJkIHdvcmtzIHdlCisJCSAqIHRvdWNoIG1hbnkgbW9yZSBibG9ja3Mgb24gZGlzayB0aGFuIHRoZSBhY3R1YWwgcGF5bG9hZAorCQkgKiBsZW5ndGguCisJCSAqLworCQlpZiAobnJfc2VjdHMgPiBtYXhfZGlzY2FyZF9zZWN0b3JzKSB7CisJCQliaW8tPmJpX3NpemUgPSBtYXhfZGlzY2FyZF9zZWN0b3JzIDw8IDk7CisJCQlucl9zZWN0cyAtPSBtYXhfZGlzY2FyZF9zZWN0b3JzOworCQkJc2VjdG9yICs9IG1heF9kaXNjYXJkX3NlY3RvcnM7CiAJCX0gZWxzZSB7CiAJCQliaW8tPmJpX3NpemUgPSBucl9zZWN0cyA8PCA5OwogCQkJbnJfc2VjdHMgPSAwOwpAQCAtNDE0LDUgKzQzNSwxMSBAQAogCQliaW9fcHV0KGJpbyk7CiAJfQogCXJldHVybiByZXQ7CitvdXRfZnJlZV9wYWdlOgorCV9fZnJlZV9wYWdlKHBhZ2UpOworb3V0X2ZyZWVfYmlvOgorCWJpb19wdXQoYmlvKTsKK291dDoKKwlyZXR1cm4gLUVOT01FTTsKIH0KIEVYUE9SVF9TWU1CT0woYmxrZGV2X2lzc3VlX2Rpc2NhcmQpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNvcmUuYyBiL2Jsb2NrL2Jsay1jb3JlLmMKaW5kZXggODEzNTIyOC4uNzFkYTUxMSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNvcmUuYworKysgYi9ibG9jay9ibGstY29yZS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiYmxrLmgiCiAKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmxvY2tfcmVtYXApOworRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChibG9ja19ycV9yZW1hcCk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJsb2NrX2Jpb19jb21wbGV0ZSk7CiAKIHN0YXRpYyBpbnQgX19tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CkBAIC0xMDI5LDcgKzEwMzAsNyBAQAogCWlmIChub3cgPT0gcGFydC0+c3RhbXApCiAJCXJldHVybjsKIAotCWlmIChwYXJ0LT5pbl9mbGlnaHQpIHsKKwlpZiAocGFydF9pbl9mbGlnaHQocGFydCkpIHsKIAkJX19wYXJ0X3N0YXRfYWRkKGNwdSwgcGFydCwgdGltZV9pbl9xdWV1ZSwKIAkJCQlwYXJ0X2luX2ZsaWdodChwYXJ0KSAqIChub3cgLSBwYXJ0LT5zdGFtcCkpOwogCQlfX3BhcnRfc3RhdF9hZGQoY3B1LCBwYXJ0LCBpb190aWNrcywgKG5vdyAtIHBhcnQtPnN0YW1wKSk7CkBAIC0xMTI0LDcgKzExMjUsNiBAQAogCQlyZXEtPmNtZF9mbGFncyB8PSBSRVFfRElTQ0FSRDsKIAkJaWYgKGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX0JBUlJJRVIpKQogCQkJcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX1NPRlRCQVJSSUVSOwotCQlyZXEtPnEtPnByZXBhcmVfZGlzY2FyZF9mbihyZXEtPnEsIHJlcSk7CiAJfSBlbHNlIGlmICh1bmxpa2VseShiaW9fcndfZmxhZ2dlZChiaW8sIEJJT19SV19CQVJSSUVSKSkpCiAJCXJlcS0+Y21kX2ZsYWdzIHw9IFJFUV9IQVJEQkFSUklFUjsKIApAQCAtMTE2MSw3ICsxMTYxLDcgQEAKIAljb25zdCB1bnNpZ25lZCBpbnQgZmYgPSBiaW8tPmJpX3J3ICYgUkVRX0ZBSUxGQVNUX01BU0s7CiAJaW50IHJ3X2ZsYWdzOwogCi0JaWYgKGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX0JBUlJJRVIpICYmIGJpb19oYXNfZGF0YShiaW8pICYmCisJaWYgKGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX0JBUlJJRVIpICYmCiAJICAgIChxLT5uZXh0X29yZGVyZWQgPT0gUVVFVUVfT1JERVJFRF9OT05FKSkgewogCQliaW9fZW5kaW8oYmlvLCAtRU9QTk9UU1VQUCk7CiAJCXJldHVybiAwOwpAQCAtMTQzNyw3ICsxNDM3LDggQEAKIAkJCWdvdG8gZW5kX2lvOwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KG5yX3NlY3RvcnMgPiBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSkpIHsKKwkJaWYgKHVubGlrZWx5KCFiaW9fcndfZmxhZ2dlZChiaW8sIEJJT19SV19ESVNDQVJEKSAmJgorCQkJICAgICBucl9zZWN0b3JzID4gcXVldWVfbWF4X2h3X3NlY3RvcnMocSkpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImJpbyB0b28gYmlnIGRldmljZSAlcyAoJXUgPiAldSlcbiIsCiAJCQkgICAgICAgYmRldm5hbWUoYmlvLT5iaV9iZGV2LCBiKSwKIAkJCSAgICAgICBiaW9fc2VjdG9ycyhiaW8pLApAQCAtMTQ3MCw3ICsxNDcxLDcgQEAKIAkJCWdvdG8gZW5kX2lvOwogCiAJCWlmIChiaW9fcndfZmxhZ2dlZChiaW8sIEJJT19SV19ESVNDQVJEKSAmJgotCQkgICAgIXEtPnByZXBhcmVfZGlzY2FyZF9mbikgeworCQkgICAgIWJsa19xdWV1ZV9kaXNjYXJkKHEpKSB7CiAJCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJCWdvdG8gZW5kX2lvOwogCQl9CmRpZmYgLS1naXQgYS9ibG9jay9ibGstc2V0dGluZ3MuYyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCmluZGV4IDgzNDEzZmYuLjY2ZDRhYTggMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCisrKyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCkBAIC0zNCwyMyArMzQsNiBAQAogRVhQT1JUX1NZTUJPTChibGtfcXVldWVfcHJlcF9ycSk7CiAKIC8qKgotICogYmxrX3F1ZXVlX3NldF9kaXNjYXJkIC0gc2V0IGEgZGlzY2FyZF9zZWN0b3JzIGZ1bmN0aW9uIGZvciBxdWV1ZQotICogQHE6CQlxdWV1ZQotICogQGRmbjoJcHJlcGFyZV9kaXNjYXJkIGZ1bmN0aW9uCi0gKgotICogSXQncyBwb3NzaWJsZSBmb3IgYSBxdWV1ZSB0byByZWdpc3RlciBhIGRpc2NhcmQgY2FsbGJhY2sgd2hpY2ggaXMgdXNlZAotICogdG8gdHJhbnNmb3JtIGEgZGlzY2FyZCByZXF1ZXN0IGludG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZQotICogaGFyZHdhcmUuIElmIG5vbmUgaXMgcmVnaXN0ZXJlZCwgdGhlbiBkaXNjYXJkIHJlcXVlc3RzIGFyZSBmYWlsZWQKLSAqIHdpdGggJUVPUE5PVFNVUFAuCi0gKgotICovCi12b2lkIGJsa19xdWV1ZV9zZXRfZGlzY2FyZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgcHJlcGFyZV9kaXNjYXJkX2ZuICpkZm4pCi17Ci0JcS0+cHJlcGFyZV9kaXNjYXJkX2ZuID0gZGZuOwotfQotRVhQT1JUX1NZTUJPTChibGtfcXVldWVfc2V0X2Rpc2NhcmQpOwotCi0vKioKICAqIGJsa19xdWV1ZV9tZXJnZV9idmVjIC0gc2V0IGEgbWVyZ2VfYnZlYyBmdW5jdGlvbiBmb3IgcXVldWUKICAqIEBxOgkJcXVldWUKICAqIEBtYmZuOgltZXJnZV9idmVjX2ZuCkBAIC0xMTEsNyArOTQsOSBAQAogCWxpbS0+bWF4X2h3X3NlZ21lbnRzID0gTUFYX0hXX1NFR01FTlRTOwogCWxpbS0+c2VnX2JvdW5kYXJ5X21hc2sgPSBCTEtfU0VHX0JPVU5EQVJZX01BU0s7CiAJbGltLT5tYXhfc2VnbWVudF9zaXplID0gTUFYX1NFR01FTlRfU0laRTsKLQlsaW0tPm1heF9zZWN0b3JzID0gbGltLT5tYXhfaHdfc2VjdG9ycyA9IFNBRkVfTUFYX1NFQ1RPUlM7CisJbGltLT5tYXhfc2VjdG9ycyA9IEJMS19ERUZfTUFYX1NFQ1RPUlM7CisJbGltLT5tYXhfaHdfc2VjdG9ycyA9IElOVF9NQVg7CisJbGltLT5tYXhfZGlzY2FyZF9zZWN0b3JzID0gU0FGRV9NQVhfU0VDVE9SUzsKIAlsaW0tPmxvZ2ljYWxfYmxvY2tfc2l6ZSA9IGxpbS0+cGh5c2ljYWxfYmxvY2tfc2l6ZSA9IGxpbS0+aW9fbWluID0gNTEyOwogCWxpbS0+Ym91bmNlX3BmbiA9ICh1bnNpZ25lZCBsb25nKShCTEtfQk9VTkNFX0FOWSA+PiBQQUdFX1NISUZUKTsKIAlsaW0tPmFsaWdubWVudF9vZmZzZXQgPSAwOwpAQCAtMTY0LDYgKzE0OSw3IEBACiAJcS0+dW5wbHVnX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylxOwogCiAJYmxrX3NldF9kZWZhdWx0X2xpbWl0cygmcS0+bGltaXRzKTsKKwlibGtfcXVldWVfbWF4X3NlY3RvcnMocSwgU0FGRV9NQVhfU0VDVE9SUyk7CiAKIAkvKgogCSAqIElmIHRoZSBjYWxsZXIgZGlkbid0IHN1cHBseSBhIGxvY2ssIGZhbGwgYmFjayB0byBvdXIgZW1iZWRkZWQKQEAgLTI1NCw2ICsyNDAsMTggQEAKIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX21heF9od19zZWN0b3JzKTsKIAogLyoqCisgKiBibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyAtIHNldCBtYXggc2VjdG9ycyBmb3IgYSBzaW5nbGUgZGlzY2FyZAorICogQHE6ICB0aGUgcmVxdWVzdCBxdWV1ZSBmb3IgdGhlIGRldmljZQorICogQG1heF9kaXNjYXJkX3NlY3RvcnM6IG1heGltdW0gbnVtYmVyIG9mIHNlY3RvcnMgdG8gZGlzY2FyZAorICoqLwordm9pZCBibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJdW5zaWduZWQgaW50IG1heF9kaXNjYXJkX3NlY3RvcnMpCit7CisJcS0+bGltaXRzLm1heF9kaXNjYXJkX3NlY3RvcnMgPSBtYXhfZGlzY2FyZF9zZWN0b3JzOworfQorRVhQT1JUX1NZTUJPTChibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyk7CisKKy8qKgogICogYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzIC0gc2V0IG1heCBwaHlzIHNlZ21lbnRzIGZvciBhIHJlcXVlc3QgZm9yIHRoaXMgcXVldWUKICAqIEBxOiAgdGhlIHJlcXVlc3QgcXVldWUgZm9yIHRoZSBkZXZpY2UKICAqIEBtYXhfc2VnbWVudHM6ICBtYXggbnVtYmVyIG9mIHNlZ21lbnRzCmRpZmYgLS1naXQgYS9ibG9jay9ibGstc3lzZnMuYyBiL2Jsb2NrL2Jsay1zeXNmcy5jCmluZGV4IGI3OGM5YzMuLjhhNmQ4MWEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zeXNmcy5jCisrKyBiL2Jsb2NrL2Jsay1zeXNmcy5jCkBAIC00NTIsNiArNDUyLDcgQEAKIAlpZiAocmV0KSB7CiAJCWtvYmplY3RfdWV2ZW50KCZxLT5rb2JqLCBLT0JKX1JFTU9WRSk7CiAJCWtvYmplY3RfZGVsKCZxLT5rb2JqKTsKKwkJYmxrX3RyYWNlX3JlbW92ZV9zeXNmcyhkaXNrX3RvX2RldihkaXNrKSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC00NjUsMTEgKzQ2NiwxMSBAQAogCWlmIChXQVJOX09OKCFxKSkKIAkJcmV0dXJuOwogCi0JaWYgKHEtPnJlcXVlc3RfZm4pIHsKKwlpZiAocS0+cmVxdWVzdF9mbikKIAkJZWx2X3VucmVnaXN0ZXJfcXVldWUocSk7CiAKLQkJa29iamVjdF91ZXZlbnQoJnEtPmtvYmosIEtPQkpfUkVNT1ZFKTsKLQkJa29iamVjdF9kZWwoJnEtPmtvYmopOwotCQlrb2JqZWN0X3B1dCgmZGlza190b19kZXYoZGlzayktPmtvYmopOwotCX0KKwlrb2JqZWN0X3VldmVudCgmcS0+a29iaiwgS09CSl9SRU1PVkUpOworCWtvYmplY3RfZGVsKCZxLT5rb2JqKTsKKwlibGtfdHJhY2VfcmVtb3ZlX3N5c2ZzKGRpc2tfdG9fZGV2KGRpc2spKTsKKwlrb2JqZWN0X3B1dCgmZGlza190b19kZXYoZGlzayktPmtvYmopOwogfQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRhZy5jIGIvYmxvY2svYmxrLXRhZy5jCmluZGV4IDJlNWNmZWIuLjZiMGY1MmMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10YWcuYworKysgYi9ibG9jay9ibGstdGFnLmMKQEAgLTM1OSw3ICszNTksNyBAQAogCQltYXhfZGVwdGggLT0gMjsKIAkJaWYgKCFtYXhfZGVwdGgpCiAJCQltYXhfZGVwdGggPSAxOwotCQlpZiAocS0+aW5fZmxpZ2h0WzBdID4gbWF4X2RlcHRoKQorCQlpZiAocS0+aW5fZmxpZ2h0W0JMS19SV19BU1lOQ10gPiBtYXhfZGVwdGgpCiAJCQlyZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IDFjYTgxM2IuLmFhMWU5NTMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMTczLDYgKzE3Myw3IEBACiAJdW5zaWduZWQgaW50IGNmcV9zbGljZVsyXTsKIAl1bnNpZ25lZCBpbnQgY2ZxX3NsaWNlX2FzeW5jX3JxOwogCXVuc2lnbmVkIGludCBjZnFfc2xpY2VfaWRsZTsKKwl1bnNpZ25lZCBpbnQgY2ZxX2xhdGVuY3k7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNpY19saXN0OwogCkBAIC0xODAsNiArMTgxLDggQEAKIAkgKiBGYWxsYmFjayBkdW1teSBjZnFxIGZvciBleHRyZW1lIE9PTSBjb25kaXRpb25zCiAJICovCiAJc3RydWN0IGNmcV9xdWV1ZSBvb21fY2ZxcTsKKworCXVuc2lnbmVkIGxvbmcgbGFzdF9lbmRfc3luY19ycTsKIH07CiAKIGVudW0gY2ZxcV9zdGF0ZV9mbGFncyB7CkBAIC0xOTMsNiArMTk2LDcgQEAKIAlDRlFfQ0ZRUV9GTEFHX3NsaWNlX25ldywJLyogbm8gcmVxdWVzdHMgZGlzcGF0Y2hlZCBpbiBzbGljZSAqLwogCUNGUV9DRlFRX0ZMQUdfc3luYywJCS8qIHN5bmNocm9ub3VzIHF1ZXVlICovCiAJQ0ZRX0NGUVFfRkxBR19jb29wLAkJLyogaGFzIGRvbmUgYSBjb29wIGp1bXAgb2YgdGhlIHF1ZXVlICovCisJQ0ZRX0NGUVFfRkxBR19jb29wX3ByZWVtcHQsCS8qIGNvb3AgcHJlZW1wdCAqLwogfTsKIAogI2RlZmluZSBDRlFfQ0ZRUV9GTlMobmFtZSkJCQkJCQlcCkBAIC0yMTksNiArMjIzLDcgQEAKIENGUV9DRlFRX0ZOUyhzbGljZV9uZXcpOwogQ0ZRX0NGUVFfRk5TKHN5bmMpOwogQ0ZRX0NGUVFfRk5TKGNvb3ApOworQ0ZRX0NGUVFfRk5TKGNvb3BfcHJlZW1wdCk7CiAjdW5kZWYgQ0ZRX0NGUVFfRk5TCiAKICNkZWZpbmUgY2ZxX2xvZ19jZnFxKGNmcWQsIGNmcXEsIGZtdCwgYXJncy4uLikJXApAQCAtMjI3LDcgKzIzMiw3IEBACiAJYmxrX2FkZF90cmFjZV9tc2coKGNmcWQpLT5xdWV1ZSwgImNmcSAiIGZtdCwgIyNhcmdzKQogCiBzdGF0aWMgdm9pZCBjZnFfZGlzcGF0Y2hfaW5zZXJ0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwotc3RhdGljIHN0cnVjdCBjZnFfcXVldWUgKmNmcV9nZXRfcXVldWUoc3RydWN0IGNmcV9kYXRhICosIGludCwKK3N0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFfZ2V0X3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqLCBib29sLAogCQkJCSAgICAgICBzdHJ1Y3QgaW9fY29udGV4dCAqLCBnZnBfdCk7CiBzdGF0aWMgc3RydWN0IGNmcV9pb19jb250ZXh0ICpjZnFfY2ljX2xvb2t1cChzdHJ1Y3QgY2ZxX2RhdGEgKiwKIAkJCQkJCXN0cnVjdCBpb19jb250ZXh0ICopOwpAQCAtMjM4LDI3ICsyNDMsMjQgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY2ZxX3F1ZXVlICpjaWNfdG9fY2ZxcShzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYywKLQkJCQkJICAgIGludCBpc19zeW5jKQorCQkJCQkgICAgYm9vbCBpc19zeW5jKQogewotCXJldHVybiBjaWMtPmNmcXFbISFpc19zeW5jXTsKKwlyZXR1cm4gY2ljLT5jZnFxW2lzX3N5bmNdOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2ljX3NldF9jZnFxKHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljLAotCQkJCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEsIGludCBpc19zeW5jKQorCQkJCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEsIGJvb2wgaXNfc3luYykKIHsKLQljaWMtPmNmcXFbISFpc19zeW5jXSA9IGNmcXE7CisJY2ljLT5jZnFxW2lzX3N5bmNdID0gY2ZxcTsKIH0KIAogLyoKICAqIFdlIHJlZ2FyZCBhIHJlcXVlc3QgYXMgU1lOQywgaWYgaXQncyBlaXRoZXIgYSByZWFkIG9yIGhhcyB0aGUgU1lOQyBiaXQKICAqIHNldCAoaW4gd2hpY2ggY2FzZSBpdCBjb3VsZCBhbHNvIGJlIGRpcmVjdCBXUklURSkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNmcV9iaW9fc3luYyhzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW5saW5lIGJvb2wgY2ZxX2Jpb19zeW5jKHN0cnVjdCBiaW8gKmJpbykKIHsKLQlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCB8fCBiaW9fcndfZmxhZ2dlZChiaW8sIEJJT19SV19TWU5DSU8pKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOworCXJldHVybiBiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEIHx8IGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX1NZTkNJTyk7CiB9CiAKIC8qCkBAIC0yODUsNyArMjg3LDcgQEAKICAqIGlmIGEgcXVldWUgaXMgbWFya2VkIHN5bmMgYW5kIGhhcyBzeW5jIGlvIHF1ZXVlZC4gQSBzeW5jIHF1ZXVlIHdpdGggYXN5bmMKICAqIGlvIG9ubHksIHNob3VsZCBub3QgZ2V0IGZ1bGwgc3luYyBzbGljZSBsZW5ndGguCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNmcV9wcmlvX3NsaWNlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgaW50IHN5bmMsCitzdGF0aWMgaW5saW5lIGludCBjZnFfcHJpb19zbGljZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGJvb2wgc3luYywKIAkJCQkgdW5zaWduZWQgc2hvcnQgcHJpbykKIHsKIAljb25zdCBpbnQgYmFzZV9zbGljZSA9IGNmcWQtPmNmcV9zbGljZVtzeW5jXTsKQEAgLTMxMyw3ICszMTUsNyBAQAogICogaXNuJ3QgdmFsaWQgdW50aWwgdGhlIGZpcnN0IHJlcXVlc3QgZnJvbSB0aGUgZGlzcGF0Y2ggaXMgYWN0aXZhdGVkCiAgKiBhbmQgdGhlIHNsaWNlIHRpbWUgc2V0LgogICovCi1zdGF0aWMgaW5saW5lIGludCBjZnFfc2xpY2VfdXNlZChzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQorc3RhdGljIGlubGluZSBib29sIGNmcV9zbGljZV91c2VkKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7CiAJaWYgKGNmcV9jZnFxX3NsaWNlX25ldyhjZnFxKSkKIAkJcmV0dXJuIDA7CkBAIC00ODgsNyArNDkwLDcgQEAKICAqIHdlIHdpbGwgc2VydmljZSB0aGUgcXVldWVzLgogICovCiBzdGF0aWMgdm9pZCBjZnFfc2VydmljZV90cmVlX2FkZChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsCi0JCQkJIGludCBhZGRfZnJvbnQpCisJCQkJIGJvb2wgYWRkX2Zyb250KQogewogCXN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudDsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpfX2NmcXE7CkBAIC01MDQsMTEgKzUwNiwyMCBAQAogCQl9IGVsc2UKIAkJCXJiX2tleSArPSBqaWZmaWVzOwogCX0gZWxzZSBpZiAoIWFkZF9mcm9udCkgeworCQkvKgorCQkgKiBHZXQgb3VyIHJiIGtleSBvZmZzZXQuIFN1YnRyYWN0IGFueSByZXNpZHVhbCBzbGljZQorCQkgKiB2YWx1ZSBjYXJyaWVkIGZyb20gbGFzdCBzZXJ2aWNlLiBBIG5lZ2F0aXZlIHJlc2lkCisJCSAqIGNvdW50IGluZGljYXRlcyBzbGljZSBvdmVycnVuLCBhbmQgdGhpcyBzaG91bGQgcG9zaXRpb24KKwkJICogdGhlIG5leHQgc2VydmljZSB0aW1lIGZ1cnRoZXIgYXdheSBpbiB0aGUgdHJlZS4KKwkJICovCiAJCXJiX2tleSA9IGNmcV9zbGljZV9vZmZzZXQoY2ZxZCwgY2ZxcSkgKyBqaWZmaWVzOwotCQlyYl9rZXkgKz0gY2ZxcS0+c2xpY2VfcmVzaWQ7CisJCXJiX2tleSAtPSBjZnFxLT5zbGljZV9yZXNpZDsKIAkJY2ZxcS0+c2xpY2VfcmVzaWQgPSAwOwotCX0gZWxzZQotCQlyYl9rZXkgPSAwOworCX0gZWxzZSB7CisJCXJiX2tleSA9IC1IWjsKKwkJX19jZnFxID0gY2ZxX3JiX2ZpcnN0KCZjZnFkLT5zZXJ2aWNlX3RyZWUpOworCQlyYl9rZXkgKz0gX19jZnFxID8gX19jZnFxLT5yYl9rZXkgOiBqaWZmaWVzOworCX0KIAogCWlmICghUkJfRU1QVFlfTk9ERSgmY2ZxcS0+cmJfbm9kZSkpIHsKIAkJLyoKQEAgLTU0Miw3ICs1NTMsNyBAQAogCQkJbiA9ICYoKnApLT5yYl9sZWZ0OwogCQllbHNlIGlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSA+IGNmcV9jbGFzc19pZGxlKF9fY2ZxcSkpCiAJCQluID0gJigqcCktPnJiX3JpZ2h0OwotCQllbHNlIGlmIChyYl9rZXkgPCBfX2NmcXEtPnJiX2tleSkKKwkJZWxzZSBpZiAodGltZV9iZWZvcmUocmJfa2V5LCBfX2NmcXEtPnJiX2tleSkpCiAJCQluID0gJigqcCktPnJiX2xlZnQ7CiAJCWVsc2UKIAkJCW4gPSAmKCpwKS0+cmJfcmlnaHQ7CkBAIC04MjIsOCArODMzLDEwIEBACiAJICogcmVwb3NpdGlvbiBpbiBmaWZvIGlmIG5leHQgaXMgb2xkZXIgdGhhbiBycQogCSAqLwogCWlmICghbGlzdF9lbXB0eSgmcnEtPnF1ZXVlbGlzdCkgJiYgIWxpc3RfZW1wdHkoJm5leHQtPnF1ZXVlbGlzdCkgJiYKLQkgICAgdGltZV9iZWZvcmUobmV4dC0+c3RhcnRfdGltZSwgcnEtPnN0YXJ0X3RpbWUpKQorCSAgICB0aW1lX2JlZm9yZShycV9maWZvX3RpbWUobmV4dCksIHJxX2ZpZm9fdGltZShycSkpKSB7CiAJCWxpc3RfbW92ZSgmcnEtPnF1ZXVlbGlzdCwgJm5leHQtPnF1ZXVlbGlzdCk7CisJCXJxX3NldF9maWZvX3RpbWUocnEsIHJxX2ZpZm9fdGltZShuZXh0KSk7CisJfQogCiAJY2ZxX3JlbW92ZV9yZXF1ZXN0KG5leHQpOwogfQpAQCAtODM5LDcgKzg1Miw3IEBACiAJICogRGlzYWxsb3cgbWVyZ2Ugb2YgYSBzeW5jIGJpbyBpbnRvIGFuIGFzeW5jIHJlcXVlc3QuCiAJICovCiAJaWYgKGNmcV9iaW9fc3luYyhiaW8pICYmICFycV9pc19zeW5jKHJxKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAogCS8qCiAJICogTG9va3VwIHRoZSBjZnFxIHRoYXQgdGhpcyBiaW8gd2lsbCBiZSBxdWV1ZWQgd2l0aC4gQWxsb3cKQEAgLTg0NywxMyArODYwLDEwIEBACiAJICovCiAJY2ljID0gY2ZxX2NpY19sb29rdXAoY2ZxZCwgY3VycmVudC0+aW9fY29udGV4dCk7CiAJaWYgKCFjaWMpCi0JCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CiAKIAljZnFxID0gY2ljX3RvX2NmcXEoY2ljLCBjZnFfYmlvX3N5bmMoYmlvKSk7Ci0JaWYgKGNmcXEgPT0gUlFfQ0ZRUShycSkpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGNmcXEgPT0gUlFfQ0ZRUShycSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY2ZxX3NldF9hY3RpdmVfcXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLApAQCAtODgxLDcgKzg5MSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkCiBfX2NmcV9zbGljZV9leHBpcmVkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwKLQkJICAgIGludCB0aW1lZF9vdXQpCisJCSAgICBib29sIHRpbWVkX291dCkKIHsKIAljZnFfbG9nX2NmcXEoY2ZxZCwgY2ZxcSwgInNsaWNlIGV4cGlyZWQgdD0lZCIsIHRpbWVkX291dCk7CiAKQEAgLTkwOSw3ICs5MTksNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNmcV9zbGljZV9leHBpcmVkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgaW50IHRpbWVkX291dCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZnFfc2xpY2VfZXhwaXJlZChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGJvb2wgdGltZWRfb3V0KQogewogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjZnFkLT5hY3RpdmVfcXVldWU7CiAKQEAgLTkzNywxMCArOTQ3LDEzIEBACiB7CiAJaWYgKCFjZnFxKSB7CiAJCWNmcXEgPSBjZnFfZ2V0X25leHRfcXVldWUoY2ZxZCk7Ci0JCWlmIChjZnFxKQorCQlpZiAoY2ZxcSAmJiAhY2ZxX2NmcXFfY29vcF9wcmVlbXB0KGNmcXEpKQogCQkJY2ZxX2NsZWFyX2NmcXFfY29vcChjZnFxKTsKIAl9CiAKKwlpZiAoY2ZxcSkKKwkJY2ZxX2NsZWFyX2NmcXFfY29vcF9wcmVlbXB0KGNmcXEpOworCiAJX19jZnFfc2V0X2FjdGl2ZV9xdWV1ZShjZnFkLCBjZnFxKTsKIAlyZXR1cm4gY2ZxcTsKIH0KQEAgLTEwMjEsNyArMTAzNCw3IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFfY2xvc2VfY29vcGVyYXRvcihzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsCiAJCQkJCSAgICAgIHN0cnVjdCBjZnFfcXVldWUgKmN1cl9jZnFxLAotCQkJCQkgICAgICBpbnQgcHJvYmUpCisJCQkJCSAgICAgIGJvb2wgcHJvYmUpCiB7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKIApAQCAtMTA4NSw2ICsxMDk4LDE1IEBACiAJaWYgKCFjaWMgfHwgIWF0b21pY19yZWFkKCZjaWMtPmlvYy0+bnJfdGFza3MpKQogCQlyZXR1cm47CiAKKwkvKgorCSAqIElmIG91ciBhdmVyYWdlIHRoaW5rIHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlbWFpbmluZyB0aW1lCisJICogc2xpY2UsIHRoZW4gZG9uJ3QgaWRsZS4gVGhpcyBhdm9pZHMgb3ZlcnJ1bm5pbmcgdGhlIGFsbG90dGVkCisJICogdGltZSBzbGljZS4KKwkgKi8KKwlpZiAoc2FtcGxlX3ZhbGlkKGNpYy0+dHRpbWVfc2FtcGxlcykgJiYKKwkgICAgKGNmcXEtPnNsaWNlX2VuZCAtIGppZmZpZXMgPCBjaWMtPnR0aW1lX21lYW4pKQorCQlyZXR1cm47CisKIAljZnFfbWFya19jZnFxX3dhaXRfcmVxdWVzdChjZnFxKTsKIAogCS8qCkBAIC0xMTI0LDkgKzExNDYsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmNmcV9jaGVja19maWZvKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7Ci0Jc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ZxcS0+Y2ZxZDsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0JaW50IGZpZm87CisJc3RydWN0IHJlcXVlc3QgKnJxID0gTlVMTDsKIAogCWlmIChjZnFfY2ZxcV9maWZvX2V4cGlyZShjZnFxKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMTM2LDEzICsxMTU2LDExIEBACiAJaWYgKGxpc3RfZW1wdHkoJmNmcXEtPmZpZm8pKQogCQlyZXR1cm4gTlVMTDsKIAotCWZpZm8gPSBjZnFfY2ZxcV9zeW5jKGNmcXEpOwogCXJxID0gcnFfZW50cnlfZmlmbyhjZnFxLT5maWZvLm5leHQpOwotCi0JaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHJxLT5zdGFydF90aW1lICsgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlW2ZpZm9dKSkKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcnFfZmlmb190aW1lKHJxKSkpCiAJCXJxID0gTlVMTDsKIAotCWNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCAiZmlmbz0lcCIsIHJxKTsKKwljZnFfbG9nX2NmcXEoY2ZxcS0+Y2ZxZCwgY2ZxcSwgImZpZm89JXAiLCBycSk7CiAJcmV0dXJuIHJxOwogfQogCkBAIC0xMjQzLDE2ICsxMjYxLDgzIEBACiAJcmV0dXJuIGRpc3BhdGNoZWQ7CiB9CiAKK3N0YXRpYyBib29sIGNmcV9tYXlfZGlzcGF0Y2goc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQoreworCXVuc2lnbmVkIGludCBtYXhfZGlzcGF0Y2g7CisKKwkvKgorCSAqIERyYWluIGFzeW5jIHJlcXVlc3RzIGJlZm9yZSB3ZSBzdGFydCBzeW5jIElPCisJICovCisJaWYgKGNmcV9jZnFxX2lkbGVfd2luZG93KGNmcXEpICYmIGNmcWQtPnJxX2luX2RyaXZlcltCTEtfUldfQVNZTkNdKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYW4gYXN5bmMgcXVldWUgYW5kIHdlIGhhdmUgc3luYyBJTyBpbiBmbGlnaHQsIGxldCBpdCB3YWl0CisJICovCisJaWYgKGNmcWQtPnN5bmNfZmxpZ2h0ICYmICFjZnFfY2ZxcV9zeW5jKGNmcXEpKQorCQlyZXR1cm4gZmFsc2U7CisKKwltYXhfZGlzcGF0Y2ggPSBjZnFkLT5jZnFfcXVhbnR1bTsKKwlpZiAoY2ZxX2NsYXNzX2lkbGUoY2ZxcSkpCisJCW1heF9kaXNwYXRjaCA9IDE7CisKKwkvKgorCSAqIERvZXMgdGhpcyBjZnFxIGFscmVhZHkgaGF2ZSB0b28gbXVjaCBJTyBpbiBmbGlnaHQ/CisJICovCisJaWYgKGNmcXEtPmRpc3BhdGNoZWQgPj0gbWF4X2Rpc3BhdGNoKSB7CisJCS8qCisJCSAqIGlkbGUgcXVldWUgbXVzdCBhbHdheXMgb25seSBoYXZlIGEgc2luZ2xlIElPIGluIGZsaWdodAorCQkgKi8KKwkJaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8qCisJCSAqIFdlIGhhdmUgb3RoZXIgcXVldWVzLCBkb24ndCBhbGxvdyBtb3JlIElPIGZyb20gdGhpcyBvbmUKKwkJICovCisJCWlmIChjZnFkLT5idXN5X3F1ZXVlcyA+IDEpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyoKKwkJICogU29sZSBxdWV1ZSB1c2VyLCBhbGxvdyBiaWdnZXIgc2xpY2UKKwkJICovCisJCW1heF9kaXNwYXRjaCAqPSA0OworCX0KKworCS8qCisJICogQXN5bmMgcXVldWVzIG11c3Qgd2FpdCBhIGJpdCBiZWZvcmUgYmVpbmcgYWxsb3dlZCBkaXNwYXRjaC4KKwkgKiBXZSBhbHNvIHJhbXAgdXAgdGhlIGRpc3BhdGNoIGRlcHRoIGdyYWR1YWxseSBmb3IgYXN5bmMgSU8sCisJICogYmFzZWQgb24gdGhlIGxhc3Qgc3luYyBJTyB3ZSBzZXJ2aWNlZAorCSAqLworCWlmICghY2ZxX2NmcXFfc3luYyhjZnFxKSAmJiBjZnFkLT5jZnFfbGF0ZW5jeSkgeworCQl1bnNpZ25lZCBsb25nIGxhc3Rfc3luYyA9IGppZmZpZXMgLSBjZnFkLT5sYXN0X2VuZF9zeW5jX3JxOworCQl1bnNpZ25lZCBpbnQgZGVwdGg7CisKKwkJZGVwdGggPSBsYXN0X3N5bmMgLyBjZnFkLT5jZnFfc2xpY2VbMV07CisJCWlmICghZGVwdGggJiYgIWNmcXEtPmRpc3BhdGNoZWQpCisJCQlkZXB0aCA9IDE7CisJCWlmIChkZXB0aCA8IG1heF9kaXNwYXRjaCkKKwkJCW1heF9kaXNwYXRjaCA9IGRlcHRoOworCX0KKworCS8qCisJICogSWYgd2UncmUgYmVsb3cgdGhlIGN1cnJlbnQgbWF4LCBhbGxvdyBhIGRpc3BhdGNoCisJICovCisJcmV0dXJuIGNmcXEtPmRpc3BhdGNoZWQgPCBtYXhfZGlzcGF0Y2g7Cit9CisKIC8qCiAgKiBEaXNwYXRjaCBhIHJlcXVlc3QgZnJvbSBjZnFxLCBtb3ZpbmcgdGhlbSB0byB0aGUgcmVxdWVzdCBxdWV1ZQogICogZGlzcGF0Y2ggbGlzdC4KICAqLwotc3RhdGljIHZvaWQgY2ZxX2Rpc3BhdGNoX3JlcXVlc3Qoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQorc3RhdGljIGJvb2wgY2ZxX2Rpc3BhdGNoX3JlcXVlc3Qoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogewogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAogCUJVR19PTihSQl9FTVBUWV9ST09UKCZjZnFxLT5zb3J0X2xpc3QpKTsKIAorCWlmICghY2ZxX21heV9kaXNwYXRjaChjZnFkLCBjZnFxKSkKKwkJcmV0dXJuIGZhbHNlOworCiAJLyoKIAkgKiBmb2xsb3cgZXhwaXJlZCBwYXRoLCBlbHNlIGdldCBmaXJzdCBuZXh0IGF2YWlsYWJsZQogCSAqLwpAQCAtMTI3MSw2ICsxMzU2LDggQEAKIAkJYXRvbWljX2xvbmdfaW5jKCZjaWMtPmlvYy0+cmVmY291bnQpOwogCQljZnFkLT5hY3RpdmVfY2ljID0gY2ljOwogCX0KKworCXJldHVybiB0cnVlOwogfQogCiAvKgpAQCAtMTI4MSw3ICsxMzY4LDYgQEAKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOwotCXVuc2lnbmVkIGludCBtYXhfZGlzcGF0Y2g7CiAKIAlpZiAoIWNmcWQtPmJ1c3lfcXVldWVzKQogCQlyZXR1cm4gMDsKQEAgLTEyOTQsNDggKzEzODAsMTEgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKgotCSAqIERyYWluIGFzeW5jIHJlcXVlc3RzIGJlZm9yZSB3ZSBzdGFydCBzeW5jIElPCisJICogRGlzcGF0Y2ggYSByZXF1ZXN0IGZyb20gdGhpcyBjZnFxLCBpZiBpdCBpcyBhbGxvd2VkCiAJICovCi0JaWYgKGNmcV9jZnFxX2lkbGVfd2luZG93KGNmcXEpICYmIGNmcWQtPnJxX2luX2RyaXZlcltCTEtfUldfQVNZTkNdKQorCWlmICghY2ZxX2Rpc3BhdGNoX3JlcXVlc3QoY2ZxZCwgY2ZxcSkpCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiBJZiB0aGlzIGlzIGFuIGFzeW5jIHF1ZXVlIGFuZCB3ZSBoYXZlIHN5bmMgSU8gaW4gZmxpZ2h0LCBsZXQgaXQgd2FpdAotCSAqLwotCWlmIChjZnFkLT5zeW5jX2ZsaWdodCAmJiAhY2ZxX2NmcXFfc3luYyhjZnFxKSkKLQkJcmV0dXJuIDA7Ci0KLQltYXhfZGlzcGF0Y2ggPSBjZnFkLT5jZnFfcXVhbnR1bTsKLQlpZiAoY2ZxX2NsYXNzX2lkbGUoY2ZxcSkpCi0JCW1heF9kaXNwYXRjaCA9IDE7Ci0KLQkvKgotCSAqIERvZXMgdGhpcyBjZnFxIGFscmVhZHkgaGF2ZSB0b28gbXVjaCBJTyBpbiBmbGlnaHQ/Ci0JICovCi0JaWYgKGNmcXEtPmRpc3BhdGNoZWQgPj0gbWF4X2Rpc3BhdGNoKSB7Ci0JCS8qCi0JCSAqIGlkbGUgcXVldWUgbXVzdCBhbHdheXMgb25seSBoYXZlIGEgc2luZ2xlIElPIGluIGZsaWdodAotCQkgKi8KLQkJaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyoKLQkJICogV2UgaGF2ZSBvdGhlciBxdWV1ZXMsIGRvbid0IGFsbG93IG1vcmUgSU8gZnJvbSB0aGlzIG9uZQotCQkgKi8KLQkJaWYgKGNmcWQtPmJ1c3lfcXVldWVzID4gMSkKLQkJCXJldHVybiAwOwotCi0JCS8qCi0JCSAqIHdlIGFyZSB0aGUgb25seSBxdWV1ZSwgYWxsb3cgdXAgdG8gNCB0aW1lcyBvZiAncXVhbnR1bScKLQkJICovCi0JCWlmIChjZnFxLT5kaXNwYXRjaGVkID49IDQgKiBtYXhfZGlzcGF0Y2gpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIERpc3BhdGNoIGEgcmVxdWVzdCBmcm9tIHRoaXMgY2ZxcQotCSAqLwotCWNmcV9kaXNwYXRjaF9yZXF1ZXN0KGNmcWQsIGNmcXEpOwogCWNmcXEtPnNsaWNlX2Rpc3BhdGNoKys7CiAJY2ZxX2NsZWFyX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKIApAQCAtMTYzNSw3ICsxNjg0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgY2ZxX2luaXRfY2ZxcShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsCi0JCQkgIHBpZF90IHBpZCwgaW50IGlzX3N5bmMpCisJCQkgIHBpZF90IHBpZCwgYm9vbCBpc19zeW5jKQogewogCVJCX0NMRUFSX05PREUoJmNmcXEtPnJiX25vZGUpOwogCVJCX0NMRUFSX05PREUoJmNmcXEtPnBfbm9kZSk7CkBAIC0xNjU1LDcgKzE3MDQsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqCi1jZnFfZmluZF9hbGxvY19xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGludCBpc19zeW5jLAorY2ZxX2ZpbmRfYWxsb2NfcXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBib29sIGlzX3N5bmMsCiAJCSAgICAgc3RydWN0IGlvX2NvbnRleHQgKmlvYywgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgKm5ld19jZnFxID0gTlVMTDsKQEAgLTE3MTksNyArMTc2OCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICoKLWNmcV9nZXRfcXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBpbnQgaXNfc3luYywgc3RydWN0IGlvX2NvbnRleHQgKmlvYywKK2NmcV9nZXRfcXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBib29sIGlzX3N5bmMsIHN0cnVjdCBpb19jb250ZXh0ICppb2MsCiAJICAgICAgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJY29uc3QgaW50IGlvcHJpbyA9IHRhc2tfaW9wcmlvKGlvYyk7CkBAIC0xOTUxLDEwICsyMDAwLDEzIEBACiAJZW5hYmxlX2lkbGUgPSBvbGRfaWRsZSA9IGNmcV9jZnFxX2lkbGVfd2luZG93KGNmcXEpOwogCiAJaWYgKCFhdG9taWNfcmVhZCgmY2ljLT5pb2MtPm5yX3Rhc2tzKSB8fCAhY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUgfHwKLQkgICAgKGNmcWQtPmh3X3RhZyAmJiBDSUNfU0VFS1koY2ljKSkpCisJICAgICghY2ZxZC0+Y2ZxX2xhdGVuY3kgJiYgY2ZxZC0+aHdfdGFnICYmIENJQ19TRUVLWShjaWMpKSkKIAkJZW5hYmxlX2lkbGUgPSAwOwogCWVsc2UgaWYgKHNhbXBsZV92YWxpZChjaWMtPnR0aW1lX3NhbXBsZXMpKSB7Ci0JCWlmIChjaWMtPnR0aW1lX21lYW4gPiBjZnFkLT5jZnFfc2xpY2VfaWRsZSkKKwkJdW5zaWduZWQgaW50IHNsaWNlX2lkbGUgPSBjZnFkLT5jZnFfc2xpY2VfaWRsZTsKKwkJaWYgKHNhbXBsZV92YWxpZChjaWMtPnNlZWtfc2FtcGxlcykgJiYgQ0lDX1NFRUtZKGNpYykpCisJCQlzbGljZV9pZGxlID0gbXNlY3NfdG9famlmZmllcyhDRlFfTUlOX1RUKTsKKwkJaWYgKGNpYy0+dHRpbWVfbWVhbiA+IHNsaWNlX2lkbGUpCiAJCQllbmFibGVfaWRsZSA9IDA7CiAJCWVsc2UKIAkJCWVuYWJsZV9pZGxlID0gMTsKQEAgLTE5NzMsNyArMjAyNSw3IEBACiAgKiBDaGVjayBpZiBuZXdfY2ZxcSBzaG91bGQgcHJlZW1wdCB0aGUgY3VycmVudGx5IGFjdGl2ZSBxdWV1ZS4gUmV0dXJuIDAgZm9yCiAgKiBubyBvciBpZiB3ZSBhcmVuJ3Qgc3VyZSwgYSAxIHdpbGwgY2F1c2UgYSBwcmVlbXB0LgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgYm9vbAogY2ZxX3Nob3VsZF9wcmVlbXB0KHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqbmV3X2NmcXEsCiAJCSAgIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKQEAgLTE5ODEsNDggKzIwMzMsNTYgQEAKIAogCWNmcXEgPSBjZnFkLT5hY3RpdmVfcXVldWU7CiAJaWYgKCFjZnFxKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGNmcV9zbGljZV91c2VkKGNmcXEpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAKIAlpZiAoY2ZxX2NsYXNzX2lkbGUobmV3X2NmcXEpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAKIAkvKgogCSAqIGlmIHRoZSBuZXcgcmVxdWVzdCBpcyBzeW5jLCBidXQgdGhlIGN1cnJlbnRseSBydW5uaW5nIHF1ZXVlIGlzCiAJICogbm90LCBsZXQgdGhlIHN5bmMgcmVxdWVzdCBoYXZlIHByaW9yaXR5LgogCSAqLwogCWlmIChycV9pc19zeW5jKHJxKSAmJiAhY2ZxX2NmcXFfc3luYyhjZnFxKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCiAJLyoKIAkgKiBTbyBib3RoIHF1ZXVlcyBhcmUgc3luYy4gTGV0IHRoZSBuZXcgcmVxdWVzdCBnZXQgZGlzayB0aW1lIGlmCiAJICogaXQncyBhIG1ldGFkYXRhIHJlcXVlc3QgYW5kIHRoZSBjdXJyZW50IHF1ZXVlIGlzIGRvaW5nIHJlZ3VsYXIgSU8uCiAJICovCiAJaWYgKHJxX2lzX21ldGEocnEpICYmICFjZnFxLT5tZXRhX3BlbmRpbmcpCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAogCS8qCiAJICogQWxsb3cgYW4gUlQgcmVxdWVzdCB0byBwcmUtZW1wdCBhbiBvbmdvaW5nIG5vbi1SVCBjZnFxIHRpbWVzbGljZS4KIAkgKi8KIAlpZiAoY2ZxX2NsYXNzX3J0KG5ld19jZnFxKSAmJiAhY2ZxX2NsYXNzX3J0KGNmcXEpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAKIAlpZiAoIWNmcWQtPmFjdGl2ZV9jaWMgfHwgIWNmcV9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAogCS8qCiAJICogaWYgdGhpcyByZXF1ZXN0IGlzIGFzLWdvb2QgYXMgb25lIHdlIHdvdWxkIGV4cGVjdCBmcm9tIHRoZQogCSAqIGN1cnJlbnQgY2ZxcSwgbGV0IGl0IHByZWVtcHQKIAkgKi8KLQlpZiAoY2ZxX3JxX2Nsb3NlKGNmcWQsIHJxKSkKLQkJcmV0dXJuIDE7CisJaWYgKGNmcV9ycV9jbG9zZShjZnFkLCBycSkgJiYgKCFjZnFfY2ZxcV9jb29wKG5ld19jZnFxKSB8fAorCSAgICBjZnFkLT5idXN5X3F1ZXVlcyA9PSAxKSkgeworCQkvKgorCQkgKiBNYXJrIG5ldyBxdWV1ZSBjb29wX3ByZWVtcHQsIHNvIGl0cyBjb29wIGZsYWcgd2lsbCBub3QgYmUKKwkJICogY2xlYXJlZCB3aGVuIG5ldyBxdWV1ZSBnZXRzIHNjaGVkdWxlZCBhdCB0aGUgdmVyeSBmaXJzdCB0aW1lCisJCSAqLworCQljZnFfbWFya19jZnFxX2Nvb3BfcHJlZW1wdChuZXdfY2ZxcSk7CisJCWNmcV9tYXJrX2NmcXFfY29vcChuZXdfY2ZxcSk7CisJCXJldHVybiB0cnVlOworCX0KIAotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KIAogLyoKQEAgLTIxMDcsNiArMjE2Nyw3IEBACiAKIAljZnFfYWRkX3JxX3JiKHJxKTsKIAorCXJxX3NldF9maWZvX3RpbWUocnEsIGppZmZpZXMgKyBjZnFkLT5jZnFfZmlmb19leHBpcmVbcnFfaXNfc3luYyhycSldKTsKIAlsaXN0X2FkZF90YWlsKCZycS0+cXVldWVsaXN0LCAmY2ZxcS0+Zmlmbyk7CiAKIAljZnFfcnFfZW5xdWV1ZWQoY2ZxZCwgY2ZxcSwgcnEpOwpAQCAtMjE1Nyw4ICsyMjE4LDEwIEBACiAJaWYgKGNmcV9jZnFxX3N5bmMoY2ZxcSkpCiAJCWNmcWQtPnN5bmNfZmxpZ2h0LS07CiAKLQlpZiAoc3luYykKKwlpZiAoc3luYykgewogCQlSUV9DSUMocnEpLT5sYXN0X2VuZF9yZXF1ZXN0ID0gbm93OworCQljZnFkLT5sYXN0X2VuZF9zeW5jX3JxID0gbm93OworCX0KIAogCS8qCiAJICogSWYgdGhpcyBpcyB0aGUgYWN0aXZlIHF1ZXVlLCBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSBleHBpcmVkLApAQCAtMjI4NCw3ICsyMzQ3LDcgQEAKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAljb25zdCBpbnQgcncgPSBycV9kYXRhX2RpcihycSk7Ci0JY29uc3QgaW50IGlzX3N5bmMgPSBycV9pc19zeW5jKHJxKTsKKwljb25zdCBib29sIGlzX3N5bmMgPSBycV9pc19zeW5jKHJxKTsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTI0ODAsOCArMjU0Myw5IEBACiAJY2ZxZC0+Y2ZxX3NsaWNlWzFdID0gY2ZxX3NsaWNlX3N5bmM7CiAJY2ZxZC0+Y2ZxX3NsaWNlX2FzeW5jX3JxID0gY2ZxX3NsaWNlX2FzeW5jX3JxOwogCWNmcWQtPmNmcV9zbGljZV9pZGxlID0gY2ZxX3NsaWNlX2lkbGU7CisJY2ZxZC0+Y2ZxX2xhdGVuY3kgPSAxOwogCWNmcWQtPmh3X3RhZyA9IDE7Ci0KKwljZnFkLT5sYXN0X2VuZF9zeW5jX3JxID0gamlmZmllczsKIAlyZXR1cm4gY2ZxZDsKIH0KIApAQCAtMjU0OSw2ICsyNjEzLDcgQEAKIFNIT1dfRlVOQ1RJT04oY2ZxX3NsaWNlX3N5bmNfc2hvdywgY2ZxZC0+Y2ZxX3NsaWNlWzFdLCAxKTsKIFNIT1dfRlVOQ1RJT04oY2ZxX3NsaWNlX2FzeW5jX3Nob3csIGNmcWQtPmNmcV9zbGljZVswXSwgMSk7CiBTSE9XX0ZVTkNUSU9OKGNmcV9zbGljZV9hc3luY19ycV9zaG93LCBjZnFkLT5jZnFfc2xpY2VfYXN5bmNfcnEsIDApOworU0hPV19GVU5DVElPTihjZnFfbG93X2xhdGVuY3lfc2hvdywgY2ZxZC0+Y2ZxX2xhdGVuY3ksIDApOwogI3VuZGVmIFNIT1dfRlVOQ1RJT04KIAogI2RlZmluZSBTVE9SRV9GVU5DVElPTihfX0ZVTkMsIF9fUFRSLCBNSU4sIE1BWCwgX19DT05WKQkJCVwKQEAgLTI1ODAsNiArMjY0NSw3IEBACiBTVE9SRV9GVU5DVElPTihjZnFfc2xpY2VfYXN5bmNfc3RvcmUsICZjZnFkLT5jZnFfc2xpY2VbMF0sIDEsIFVJTlRfTUFYLCAxKTsKIFNUT1JFX0ZVTkNUSU9OKGNmcV9zbGljZV9hc3luY19ycV9zdG9yZSwgJmNmcWQtPmNmcV9zbGljZV9hc3luY19ycSwgMSwKIAkJVUlOVF9NQVgsIDApOworU1RPUkVfRlVOQ1RJT04oY2ZxX2xvd19sYXRlbmN5X3N0b3JlLCAmY2ZxZC0+Y2ZxX2xhdGVuY3ksIDAsIDEsIDApOwogI3VuZGVmIFNUT1JFX0ZVTkNUSU9OCiAKICNkZWZpbmUgQ0ZRX0FUVFIobmFtZSkgXApAQCAtMjU5NSw2ICsyNjYxLDcgQEAKIAlDRlFfQVRUUihzbGljZV9hc3luYyksCiAJQ0ZRX0FUVFIoc2xpY2VfYXN5bmNfcnEpLAogCUNGUV9BVFRSKHNsaWNlX2lkbGUpLAorCUNGUV9BVFRSKGxvd19sYXRlbmN5KSwKIAlfX0FUVFJfTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvYmxvY2svY29tcGF0X2lvY3RsLmMgYi9ibG9jay9jb21wYXRfaW9jdGwuYwppbmRleCA3ODY1YTM0Li45YmQwODZjIDEwMDY0NAotLS0gYS9ibG9jay9jb21wYXRfaW9jdGwuYworKysgYi9ibG9jay9jb21wYXRfaW9jdGwuYwpAQCAtMjEsNiArMjEsMTEgQEAKIAlyZXR1cm4gcHV0X3VzZXIodmFsLCAoY29tcGF0X2ludF90IF9fdXNlciAqKWNvbXBhdF9wdHIoYXJnKSk7CiB9CiAKK3N0YXRpYyBpbnQgY29tcGF0X3B1dF91aW50KHVuc2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXJldHVybiBwdXRfdXNlcih2YWwsIChjb21wYXRfdWludF90IF9fdXNlciAqKWNvbXBhdF9wdHIoYXJnKSk7Cit9CisKIHN0YXRpYyBpbnQgY29tcGF0X3B1dF9sb25nKHVuc2lnbmVkIGxvbmcgYXJnLCBsb25nIHZhbCkKIHsKIAlyZXR1cm4gcHV0X3VzZXIodmFsLCAoY29tcGF0X2xvbmdfdCBfX3VzZXIgKiljb21wYXRfcHRyKGFyZykpOwpAQCAtNzM0LDYgKzczOSwxNCBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBIRElPX0dFVEdFTzoKIAkJcmV0dXJuIGNvbXBhdF9oZGlvX2dldGdlbyhkaXNrLCBiZGV2LCBjb21wYXRfcHRyKGFyZykpOworCWNhc2UgQkxLUEJTWkdFVDoKKwkJcmV0dXJuIGNvbXBhdF9wdXRfdWludChhcmcsIGJkZXZfcGh5c2ljYWxfYmxvY2tfc2l6ZShiZGV2KSk7CisJY2FzZSBCTEtJT01JTjoKKwkJcmV0dXJuIGNvbXBhdF9wdXRfdWludChhcmcsIGJkZXZfaW9fbWluKGJkZXYpKTsKKwljYXNlIEJMS0lPT1BUOgorCQlyZXR1cm4gY29tcGF0X3B1dF91aW50KGFyZywgYmRldl9pb19vcHQoYmRldikpOworCWNhc2UgQkxLQUxJR05PRkY6CisJCXJldHVybiBjb21wYXRfcHV0X2ludChhcmcsIGJkZXZfYWxpZ25tZW50X29mZnNldChiZGV2KSk7CiAJY2FzZSBCTEtGTFNCVUY6CiAJY2FzZSBCTEtST1NFVDoKIAljYXNlIEJMS0RJU0NBUkQ6CmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCAxOTc1YjYxLi5hODQ3MDQ2IDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTEwNTksOSArMTA1OSw3IEBACiAJCXJldHVybiBjb3VudDsKIAogCXN0cmxjcHkoZWxldmF0b3JfbmFtZSwgbmFtZSwgc2l6ZW9mKGVsZXZhdG9yX25hbWUpKTsKLQlzdHJzdHJpcChlbGV2YXRvcl9uYW1lKTsKLQotCWUgPSBlbGV2YXRvcl9nZXQoZWxldmF0b3JfbmFtZSk7CisJZSA9IGVsZXZhdG9yX2dldChzdHJzdHJpcChlbGV2YXRvcl9uYW1lKSk7CiAJaWYgKCFlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZWxldmF0b3I6IHR5cGUgJXMgbm90IGZvdW5kXG4iLCBlbGV2YXRvcl9uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9ibG9jay9pb2N0bC5jIGIvYmxvY2svaW9jdGwuYwppbmRleCBkM2U2YjU4Li4xZjRkMWRlIDEwMDY0NAotLS0gYS9ibG9jay9pb2N0bC5jCisrKyBiL2Jsb2NrL2lvY3RsLmMKQEAgLTEzOCw2ICsxMzgsMTEgQEAKIAlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZyk7CiB9CiAKK3N0YXRpYyBpbnQgcHV0X3VpbnQodW5zaWduZWQgbG9uZyBhcmcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJcmV0dXJuIHB1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOworfQorCiBzdGF0aWMgaW50IHB1dF9sb25nKHVuc2lnbmVkIGxvbmcgYXJnLCBsb25nIHZhbCkKIHsKIAlyZXR1cm4gcHV0X3VzZXIodmFsLCAobG9uZyBfX3VzZXIgKilhcmcpOwpAQCAtMjYzLDEwICsyNjgsMTggQEAKIAkJcmV0dXJuIHB1dF9sb25nKGFyZywgKGJkaS0+cmFfcGFnZXMgKiBQQUdFX0NBQ0hFX1NJWkUpIC8gNTEyKTsKIAljYXNlIEJMS1JPR0VUOgogCQlyZXR1cm4gcHV0X2ludChhcmcsIGJkZXZfcmVhZF9vbmx5KGJkZXYpICE9IDApOwotCWNhc2UgQkxLQlNaR0VUOiAvKiBnZXQgdGhlIGxvZ2ljYWwgYmxvY2sgc2l6ZSAoY2YuIEJMS1NTWkdFVCkgKi8KKwljYXNlIEJMS0JTWkdFVDogLyogZ2V0IGJsb2NrIGRldmljZSBzb2Z0IGJsb2NrIHNpemUgKGNmLiBCTEtTU1pHRVQpICovCiAJCXJldHVybiBwdXRfaW50KGFyZywgYmxvY2tfc2l6ZShiZGV2KSk7Ci0JY2FzZSBCTEtTU1pHRVQ6IC8qIGdldCBibG9jayBkZXZpY2UgaGFyZHdhcmUgc2VjdG9yIHNpemUgKi8KKwljYXNlIEJMS1NTWkdFVDogLyogZ2V0IGJsb2NrIGRldmljZSBsb2dpY2FsIGJsb2NrIHNpemUgKi8KIAkJcmV0dXJuIHB1dF9pbnQoYXJnLCBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KSk7CisJY2FzZSBCTEtQQlNaR0VUOiAvKiBnZXQgYmxvY2sgZGV2aWNlIHBoeXNpY2FsIGJsb2NrIHNpemUgKi8KKwkJcmV0dXJuIHB1dF91aW50KGFyZywgYmRldl9waHlzaWNhbF9ibG9ja19zaXplKGJkZXYpKTsKKwljYXNlIEJMS0lPTUlOOgorCQlyZXR1cm4gcHV0X3VpbnQoYXJnLCBiZGV2X2lvX21pbihiZGV2KSk7CisJY2FzZSBCTEtJT09QVDoKKwkJcmV0dXJuIHB1dF91aW50KGFyZywgYmRldl9pb19vcHQoYmRldikpOworCWNhc2UgQkxLQUxJR05PRkY6CisJCXJldHVybiBwdXRfaW50KGFyZywgYmRldl9hbGlnbm1lbnRfb2Zmc2V0KGJkZXYpKTsKIAljYXNlIEJMS1NFQ1RHRVQ6CiAJCXJldHVybiBwdXRfdXNob3J0KGFyZywgcXVldWVfbWF4X3NlY3RvcnMoYmRldl9nZXRfcXVldWUoYmRldikpKTsKIAljYXNlIEJMS1JBU0VUOgpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FlYWQuYyBiL2NyeXB0by9hZWFkLmMKaW5kZXggZDlhYTczMy4uMGE1NWRhNyAxMDA2NDQKLS0tIGEvY3J5cHRvL2FlYWQuYworKysgYi9jcnlwdG8vYWVhZC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzeW5jX3R4L0tjb25maWcgYi9jcnlwdG8vYXN5bmNfdHgvS2NvbmZpZwppbmRleCBkOGZiMzkxNC4uZTVhZWIyYiAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L0tjb25maWcKKysrIGIvY3J5cHRvL2FzeW5jX3R4L0tjb25maWcKQEAgLTE0LDMgKzE0LDEyIEBACiAJdHJpc3RhdGUKIAlzZWxlY3QgQVNZTkNfQ09SRQogCitjb25maWcgQVNZTkNfUFEKKwl0cmlzdGF0ZQorCXNlbGVjdCBBU1lOQ19DT1JFCisKK2NvbmZpZyBBU1lOQ19SQUlENl9SRUNPVgorCXRyaXN0YXRlCisJc2VsZWN0IEFTWU5DX0NPUkUKKwlzZWxlY3QgQVNZTkNfUFEKKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzeW5jX3R4L01ha2VmaWxlIGIvY3J5cHRvL2FzeW5jX3R4L01ha2VmaWxlCmluZGV4IDI3YmFhN2QuLmQxZTBlNmYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hc3luY190eC9NYWtlZmlsZQorKysgYi9jcnlwdG8vYXN5bmNfdHgvTWFrZWZpbGUKQEAgLTIsMyArMiw2IEBACiBvYmotJChDT05GSUdfQVNZTkNfTUVNQ1BZKSArPSBhc3luY19tZW1jcHkubwogb2JqLSQoQ09ORklHX0FTWU5DX01FTVNFVCkgKz0gYXN5bmNfbWVtc2V0Lm8KIG9iai0kKENPTkZJR19BU1lOQ19YT1IpICs9IGFzeW5jX3hvci5vCitvYmotJChDT05GSUdfQVNZTkNfUFEpICs9IGFzeW5jX3BxLm8KK29iai0kKENPTkZJR19BU1lOQ19SQUlENl9SRUNPVikgKz0gYXN5bmNfcmFpZDZfcmVjb3Yubworb2JqLSQoQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1QpICs9IHJhaWQ2dGVzdC5vCmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfbWVtY3B5LmMgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfbWVtY3B5LmMKaW5kZXggZGRjY2ZiMC4uMGVjMWZiNiAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX21lbWNweS5jCisrKyBiL2NyeXB0by9hc3luY190eC9hc3luY19tZW1jcHkuYwpAQCAtMzMsMjggKzMzLDMxIEBACiAgKiBhc3luY19tZW1jcHkgLSBhdHRlbXB0IHRvIGNvcHkgbWVtb3J5IHdpdGggYSBkbWEgZW5naW5lLgogICogQGRlc3Q6IGRlc3RpbmF0aW9uIHBhZ2UKICAqIEBzcmM6IHNyYyBwYWdlCi0gKiBAb2Zmc2V0OiBvZmZzZXQgaW4gcGFnZXMgdG8gc3RhcnQgdHJhbnNhY3Rpb24KKyAqIEBkZXN0X29mZnNldDogb2Zmc2V0IGludG8gJ2Rlc3QnIHRvIHN0YXJ0IHRyYW5zYWN0aW9uCisgKiBAc3JjX29mZnNldDogb2Zmc2V0IGludG8gJ3NyYycgdG8gc3RhcnQgdHJhbnNhY3Rpb24KICAqIEBsZW46IGxlbmd0aCBpbiBieXRlcwotICogQGZsYWdzOiBBU1lOQ19UWF9BQ0ssIEFTWU5DX1RYX0RFUF9BQ0ssCi0gKiBAZGVwZW5kX3R4OiBtZW1jcHkgZGVwZW5kcyBvbiB0aGUgcmVzdWx0IG9mIHRoaXMgdHJhbnNhY3Rpb24KLSAqIEBjYl9mbjogZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBtZW1jcHkgY29tcGxldGVzCi0gKiBAY2JfcGFyYW06IHBhcmFtZXRlciB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lCisgKiBAc3VibWl0OiBzdWJtaXNzaW9uIC8gY29tcGxldGlvbiBtb2RpZmllcnMKKyAqCisgKiBob25vcmVkIGZsYWdzOiBBU1lOQ19UWF9BQ0sKICAqLwogc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKIGFzeW5jX21lbWNweShzdHJ1Y3QgcGFnZSAqZGVzdCwgc3RydWN0IHBhZ2UgKnNyYywgdW5zaWduZWQgaW50IGRlc3Rfb2Zmc2V0LAotCXVuc2lnbmVkIGludCBzcmNfb2Zmc2V0LCBzaXplX3QgbGVuLCBlbnVtIGFzeW5jX3R4X2ZsYWdzIGZsYWdzLAotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwZW5kX3R4LAotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiwgdm9pZCAqY2JfcGFyYW0pCisJICAgICB1bnNpZ25lZCBpbnQgc3JjX29mZnNldCwgc2l6ZV90IGxlbiwKKwkgICAgIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCiB7Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuID0gYXN5bmNfdHhfZmluZF9jaGFubmVsKGRlcGVuZF90eCwgRE1BX01FTUNQWSwKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBhc3luY190eF9maW5kX2NoYW5uZWwoc3VibWl0LCBETUFfTUVNQ1BZLAogCQkJCQkJICAgICAgJmRlc3QsIDEsICZzcmMsIDEsIGxlbik7CiAJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZSA9IGNoYW4gPyBjaGFuLT5kZXZpY2UgOiBOVUxMOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHggPSBOVUxMOwogCi0JaWYgKGRldmljZSkgeworCWlmIChkZXZpY2UgJiYgaXNfZG1hX2NvcHlfYWxpZ25lZChkZXZpY2UsIHNyY19vZmZzZXQsIGRlc3Rfb2Zmc2V0LCBsZW4pKSB7CiAJCWRtYV9hZGRyX3QgZG1hX2Rlc3QsIGRtYV9zcmM7Ci0JCXVuc2lnbmVkIGxvbmcgZG1hX3ByZXBfZmxhZ3MgPSBjYl9mbiA/IERNQV9QUkVQX0lOVEVSUlVQVCA6IDA7CisJCXVuc2lnbmVkIGxvbmcgZG1hX3ByZXBfZmxhZ3MgPSAwOwogCisJCWlmIChzdWJtaXQtPmNiX2ZuKQorCQkJZG1hX3ByZXBfZmxhZ3MgfD0gRE1BX1BSRVBfSU5URVJSVVBUOworCQlpZiAoc3VibWl0LT5mbGFncyAmIEFTWU5DX1RYX0ZFTkNFKQorCQkJZG1hX3ByZXBfZmxhZ3MgfD0gRE1BX1BSRVBfRkVOQ0U7CiAJCWRtYV9kZXN0ID0gZG1hX21hcF9wYWdlKGRldmljZS0+ZGV2LCBkZXN0LCBkZXN0X29mZnNldCwgbGVuLAogCQkJCQlETUFfRlJPTV9ERVZJQ0UpOwogCkBAIC02NywxMyArNzAsMTMgQEAKIAogCWlmICh0eCkgewogCQlwcl9kZWJ1ZygiJXM6IChhc3luYykgbGVuOiAlenVcbiIsIF9fZnVuY19fLCBsZW4pOwotCQlhc3luY190eF9zdWJtaXQoY2hhbiwgdHgsIGZsYWdzLCBkZXBlbmRfdHgsIGNiX2ZuLCBjYl9wYXJhbSk7CisJCWFzeW5jX3R4X3N1Ym1pdChjaGFuLCB0eCwgc3VibWl0KTsKIAl9IGVsc2UgewogCQl2b2lkICpkZXN0X2J1ZiwgKnNyY19idWY7CiAJCXByX2RlYnVnKCIlczogKHN5bmMpIGxlbjogJXp1XG4iLCBfX2Z1bmNfXywgbGVuKTsKIAogCQkvKiB3YWl0IGZvciBhbnkgcHJlcmVxdWlzaXRlIG9wZXJhdGlvbnMgKi8KLQkJYXN5bmNfdHhfcXVpZXNjZSgmZGVwZW5kX3R4KTsKKwkJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOwogCiAJCWRlc3RfYnVmID0ga21hcF9hdG9taWMoZGVzdCwgS01fVVNFUjApICsgZGVzdF9vZmZzZXQ7CiAJCXNyY19idWYgPSBrbWFwX2F0b21pYyhzcmMsIEtNX1VTRVIxKSArIHNyY19vZmZzZXQ7CkBAIC04MywyNiArODYsMTMgQEAKIAkJa3VubWFwX2F0b21pYyhkZXN0X2J1ZiwgS01fVVNFUjApOwogCQlrdW5tYXBfYXRvbWljKHNyY19idWYsIEtNX1VTRVIxKTsKIAotCQlhc3luY190eF9zeW5jX2VwaWxvZyhjYl9mbiwgY2JfcGFyYW0pOworCQlhc3luY190eF9zeW5jX2VwaWxvZyhzdWJtaXQpOwogCX0KIAogCXJldHVybiB0eDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX21lbWNweSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGFzeW5jX21lbWNweV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhc3luY19tZW1jcHlfZXhpdCh2b2lkKQotewotCWRvIHsgfSB3aGlsZSAoMCk7Ci19Ci0KLW1vZHVsZV9pbml0KGFzeW5jX21lbWNweV9pbml0KTsKLW1vZHVsZV9leGl0KGFzeW5jX21lbWNweV9leGl0KTsKLQogTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiYXN5bmNocm9ub3VzIG1lbWNweSBhcGkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9hc3luY190eC9hc3luY19tZW1zZXQuYyBiL2NyeXB0by9hc3luY190eC9hc3luY19tZW1zZXQuYwppbmRleCA1YjVlYjk5Li41OGU0YTg3IDEwMDY0NAotLS0gYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfbWVtc2V0LmMKKysrIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX21lbXNldC5jCkBAIC0zNSwyNiArMzUsMjYgQEAKICAqIEB2YWw6IGZpbGwgdmFsdWUKICAqIEBvZmZzZXQ6IG9mZnNldCBpbiBwYWdlcyB0byBzdGFydCB0cmFuc2FjdGlvbgogICogQGxlbjogbGVuZ3RoIGluIGJ5dGVzCi0gKiBAZmxhZ3M6IEFTWU5DX1RYX0FDSywgQVNZTkNfVFhfREVQX0FDSwotICogQGRlcGVuZF90eDogbWVtc2V0IGRlcGVuZHMgb24gdGhlIHJlc3VsdCBvZiB0aGlzIHRyYW5zYWN0aW9uCi0gKiBAY2JfZm46IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbWVtY3B5IGNvbXBsZXRlcwotICogQGNiX3BhcmFtOiBwYXJhbWV0ZXIgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgcm91dGluZQorICoKKyAqIGhvbm9yZWQgZmxhZ3M6IEFTWU5DX1RYX0FDSwogICovCiBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgotYXN5bmNfbWVtc2V0KHN0cnVjdCBwYWdlICpkZXN0LCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCXNpemVfdCBsZW4sIGVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3MsCi0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXBlbmRfdHgsCi0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNiX2ZuLCB2b2lkICpjYl9wYXJhbSkKK2FzeW5jX21lbXNldChzdHJ1Y3QgcGFnZSAqZGVzdCwgaW50IHZhbCwgdW5zaWduZWQgaW50IG9mZnNldCwgc2l6ZV90IGxlbiwKKwkgICAgIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCiB7Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuID0gYXN5bmNfdHhfZmluZF9jaGFubmVsKGRlcGVuZF90eCwgRE1BX01FTVNFVCwKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBhc3luY190eF9maW5kX2NoYW5uZWwoc3VibWl0LCBETUFfTUVNU0VULAogCQkJCQkJICAgICAgJmRlc3QsIDEsIE5VTEwsIDAsIGxlbik7CiAJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZSA9IGNoYW4gPyBjaGFuLT5kZXZpY2UgOiBOVUxMOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHggPSBOVUxMOwogCi0JaWYgKGRldmljZSkgeworCWlmIChkZXZpY2UgJiYgaXNfZG1hX2ZpbGxfYWxpZ25lZChkZXZpY2UsIG9mZnNldCwgMCwgbGVuKSkgewogCQlkbWFfYWRkcl90IGRtYV9kZXN0OwotCQl1bnNpZ25lZCBsb25nIGRtYV9wcmVwX2ZsYWdzID0gY2JfZm4gPyBETUFfUFJFUF9JTlRFUlJVUFQgOiAwOworCQl1bnNpZ25lZCBsb25nIGRtYV9wcmVwX2ZsYWdzID0gMDsKIAorCQlpZiAoc3VibWl0LT5jYl9mbikKKwkJCWRtYV9wcmVwX2ZsYWdzIHw9IERNQV9QUkVQX0lOVEVSUlVQVDsKKwkJaWYgKHN1Ym1pdC0+ZmxhZ3MgJiBBU1lOQ19UWF9GRU5DRSkKKwkJCWRtYV9wcmVwX2ZsYWdzIHw9IERNQV9QUkVQX0ZFTkNFOwogCQlkbWFfZGVzdCA9IGRtYV9tYXBfcGFnZShkZXZpY2UtPmRldiwgZGVzdCwgb2Zmc2V0LCBsZW4sCiAJCQkJCURNQV9GUk9NX0RFVklDRSk7CiAKQEAgLTY0LDM4ICs2NCwyNSBAQAogCiAJaWYgKHR4KSB7CiAJCXByX2RlYnVnKCIlczogKGFzeW5jKSBsZW46ICV6dVxuIiwgX19mdW5jX18sIGxlbik7Ci0JCWFzeW5jX3R4X3N1Ym1pdChjaGFuLCB0eCwgZmxhZ3MsIGRlcGVuZF90eCwgY2JfZm4sIGNiX3BhcmFtKTsKKwkJYXN5bmNfdHhfc3VibWl0KGNoYW4sIHR4LCBzdWJtaXQpOwogCX0gZWxzZSB7IC8qIHJ1biB0aGUgbWVtc2V0IHN5bmNocm9ub3VzbHkgKi8KIAkJdm9pZCAqZGVzdF9idWY7CiAJCXByX2RlYnVnKCIlczogKHN5bmMpIGxlbjogJXp1XG4iLCBfX2Z1bmNfXywgbGVuKTsKIAotCQlkZXN0X2J1ZiA9ICh2b2lkICopICgoKGNoYXIgKikgcGFnZV9hZGRyZXNzKGRlc3QpKSArIG9mZnNldCk7CisJCWRlc3RfYnVmID0gcGFnZV9hZGRyZXNzKGRlc3QpICsgb2Zmc2V0OwogCiAJCS8qIHdhaXQgZm9yIGFueSBwcmVyZXF1aXNpdGUgb3BlcmF0aW9ucyAqLwotCQlhc3luY190eF9xdWllc2NlKCZkZXBlbmRfdHgpOworCQlhc3luY190eF9xdWllc2NlKCZzdWJtaXQtPmRlcGVuZF90eCk7CiAKIAkJbWVtc2V0KGRlc3RfYnVmLCB2YWwsIGxlbik7CiAKLQkJYXN5bmNfdHhfc3luY19lcGlsb2coY2JfZm4sIGNiX3BhcmFtKTsKKwkJYXN5bmNfdHhfc3luY19lcGlsb2coc3VibWl0KTsKIAl9CiAKIAlyZXR1cm4gdHg7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhc3luY19tZW1zZXQpOwogCi1zdGF0aWMgaW50IF9faW5pdCBhc3luY19tZW1zZXRfaW5pdCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXN5bmNfbWVtc2V0X2V4aXQodm9pZCkKLXsKLQlkbyB7IH0gd2hpbGUgKDApOwotfQotCi1tb2R1bGVfaW5pdChhc3luY19tZW1zZXRfaW5pdCk7Ci1tb2R1bGVfZXhpdChhc3luY19tZW1zZXRfZXhpdCk7Ci0KIE1PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImFzeW5jaHJvbm91cyBtZW1zZXQgYXBpIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYyBiL2NyeXB0by9hc3luY190eC9hc3luY19wcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNWNjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IFl1cmkgVGlraG9ub3YgPHl1ckBlbWNyYWZ0LmNvbT4KKyAqIENvcHlyaWdodChjKSAyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KKworLyoqCisgKiBwcV9zY3JpYmJsZV9wYWdlIC0gc3BhY2UgdG8gaG9sZCB0aHJvd2F3YXkgUCBvciBRIGJ1ZmZlciBmb3IKKyAqIHN5bmNocm9ub3VzIGdlbl9zeW5kcm9tZQorICovCitzdGF0aWMgc3RydWN0IHBhZ2UgKnBxX3NjcmliYmxlX3BhZ2U7CisKKy8qIHRoZSBzdHJ1Y3QgcGFnZSAqYmxvY2tzW10gcGFyYW1ldGVyIHBhc3NlZCB0byBhc3luY19nZW5fc3luZHJvbWUoKQorICogYW5kIGFzeW5jX3N5bmRyb21lX3ZhbCgpIGNvbnRhaW5zIHRoZSAnUCcgZGVzdGluYXRpb24gYWRkcmVzcyBhdAorICogYmxvY2tzW2Rpc2tzLTJdIGFuZCB0aGUgJ1EnIGRlc3RpbmF0aW9uIGFkZHJlc3MgYXQgYmxvY2tzW2Rpc2tzLTFdCisgKgorICogbm90ZTogdGhlc2UgYXJlIG1hY3JvcyBhcyB0aGV5IGFyZSB1c2VkIGFzIGx2YWx1ZXMKKyAqLworI2RlZmluZSBQKGIsIGQpIChiW2QtMl0pCisjZGVmaW5lIFEoYiwgZCkgKGJbZC0xXSkKKworLyoqCisgKiBkb19hc3luY19nZW5fc3luZHJvbWUgLSBhc3luY2hyb25vdXNseSBjYWxjdWxhdGUgUCBhbmQvb3IgUQorICovCitzdGF0aWMgX19hc3luY19pbmxpbmUgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2RvX2FzeW5jX2dlbl9zeW5kcm9tZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHN0cnVjdCBwYWdlICoqYmxvY2tzLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzY2ZzLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgZGlza3MsCisJCSAgICAgIHNpemVfdCBsZW4sIGRtYV9hZGRyX3QgKmRtYV9zcmMsCisJCSAgICAgIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCit7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9IE5VTEw7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRtYSA9IGNoYW4tPmRldmljZTsKKwllbnVtIGRtYV9jdHJsX2ZsYWdzIGRtYV9mbGFncyA9IDA7CisJZW51bSBhc3luY190eF9mbGFncyBmbGFnc19vcmlnID0gc3VibWl0LT5mbGFnczsKKwlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm5fb3JpZyA9IHN1Ym1pdC0+Y2JfZm47CisJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNiX3BhcmFtX29yaWcgPSBzdWJtaXQtPmNiX3BhcmFtOworCWludCBzcmNfY250ID0gZGlza3MgLSAyOworCXVuc2lnbmVkIGNoYXIgY29lZnNbc3JjX2NudF07CisJdW5zaWduZWQgc2hvcnQgcHFfc3JjX2NudDsKKwlkbWFfYWRkcl90IGRtYV9kZXN0WzJdOworCWludCBzcmNfb2ZmID0gMDsKKwlpbnQgaWR4OworCWludCBpOworCisJLyogRE1BcyB1c2UgZGVzdGluYXRpb25zIGFzIHNvdXJjZXMsIHNvIHVzZSBCSURJUkVDVElPTkFMIG1hcHBpbmcgKi8KKwlpZiAoUChibG9ja3MsIGRpc2tzKSkKKwkJZG1hX2Rlc3RbMF0gPSBkbWFfbWFwX3BhZ2UoZG1hLT5kZXYsIFAoYmxvY2tzLCBkaXNrcyksIG9mZnNldCwKKwkJCQkJICAgbGVuLCBETUFfQklESVJFQ1RJT05BTCk7CisJZWxzZQorCQlkbWFfZmxhZ3MgfD0gRE1BX1BSRVBfUFFfRElTQUJMRV9QOworCWlmIChRKGJsb2NrcywgZGlza3MpKQorCQlkbWFfZGVzdFsxXSA9IGRtYV9tYXBfcGFnZShkbWEtPmRldiwgUShibG9ja3MsIGRpc2tzKSwgb2Zmc2V0LAorCQkJCQkgICBsZW4sIERNQV9CSURJUkVDVElPTkFMKTsKKwllbHNlCisJCWRtYV9mbGFncyB8PSBETUFfUFJFUF9QUV9ESVNBQkxFX1E7CisKKwkvKiBjb252ZXJ0IHNvdXJjZSBhZGRyZXNzZXMgYmVpbmcgY2FyZWZ1bCB0byBjb2xsYXBzZSAnZW1wdHknCisJICogc291cmNlcyBhbmQgdXBkYXRlIHRoZSBjb2VmZmljaWVudHMgYWNjb3JkaW5nbHkKKwkgKi8KKwlmb3IgKGkgPSAwLCBpZHggPSAwOyBpIDwgc3JjX2NudDsgaSsrKSB7CisJCWlmIChibG9ja3NbaV0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlkbWFfc3JjW2lkeF0gPSBkbWFfbWFwX3BhZ2UoZG1hLT5kZXYsIGJsb2Nrc1tpXSwgb2Zmc2V0LCBsZW4sCisJCQkJCSAgICBETUFfVE9fREVWSUNFKTsKKwkJY29lZnNbaWR4XSA9IHNjZnNbaV07CisJCWlkeCsrOworCX0KKwlzcmNfY250ID0gaWR4OworCisJd2hpbGUgKHNyY19jbnQgPiAwKSB7CisJCXN1Ym1pdC0+ZmxhZ3MgPSBmbGFnc19vcmlnOworCQlwcV9zcmNfY250ID0gbWluKHNyY19jbnQsIGRtYV9tYXhwcShkbWEsIGRtYV9mbGFncykpOworCQkvKiBpZiB3ZSBhcmUgc3VibWl0dGluZyBhZGRpdGlvbmFsIHBxcywgbGVhdmUgdGhlIGNoYWluIG9wZW4sCisJCSAqIGNsZWFyIHRoZSBjYWxsYmFjayBwYXJhbWV0ZXJzLCBhbmQgbGVhdmUgdGhlIGRlc3RpbmF0aW9uCisJCSAqIGJ1ZmZlcnMgbWFwcGVkCisJCSAqLworCQlpZiAoc3JjX2NudCA+IHBxX3NyY19jbnQpIHsKKwkJCXN1Ym1pdC0+ZmxhZ3MgJj0gfkFTWU5DX1RYX0FDSzsKKwkJCXN1Ym1pdC0+ZmxhZ3MgfD0gQVNZTkNfVFhfRkVOQ0U7CisJCQlkbWFfZmxhZ3MgfD0gRE1BX0NPTVBMX1NLSVBfREVTVF9VTk1BUDsKKwkJCXN1Ym1pdC0+Y2JfZm4gPSBOVUxMOworCQkJc3VibWl0LT5jYl9wYXJhbSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlkbWFfZmxhZ3MgJj0gfkRNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVA7CisJCQlzdWJtaXQtPmNiX2ZuID0gY2JfZm5fb3JpZzsKKwkJCXN1Ym1pdC0+Y2JfcGFyYW0gPSBjYl9wYXJhbV9vcmlnOworCQkJaWYgKGNiX2ZuX29yaWcpCisJCQkJZG1hX2ZsYWdzIHw9IERNQV9QUkVQX0lOVEVSUlVQVDsKKwkJfQorCQlpZiAoc3VibWl0LT5mbGFncyAmIEFTWU5DX1RYX0ZFTkNFKQorCQkJZG1hX2ZsYWdzIHw9IERNQV9QUkVQX0ZFTkNFOworCisJCS8qIFNpbmNlIHdlIGhhdmUgY2xvYmJlcmVkIHRoZSBzcmNfbGlzdCB3ZSBhcmUgY29tbWl0dGVkCisJCSAqIHRvIGRvaW5nIHRoaXMgYXN5bmNocm9ub3VzbHkuICBEcml2ZXJzIGZvcmNlIGZvcndhcmQKKwkJICogcHJvZ3Jlc3MgaW4gY2FzZSB0aGV5IGNhbiBub3QgcHJvdmlkZSBhIGRlc2NyaXB0b3IKKwkJICovCisJCWZvciAoOzspIHsKKwkJCXR4ID0gZG1hLT5kZXZpY2VfcHJlcF9kbWFfcHEoY2hhbiwgZG1hX2Rlc3QsCisJCQkJCQkgICAgICZkbWFfc3JjW3NyY19vZmZdLAorCQkJCQkJICAgICBwcV9zcmNfY250LAorCQkJCQkJICAgICAmY29lZnNbc3JjX29mZl0sIGxlbiwKKwkJCQkJCSAgICAgZG1hX2ZsYWdzKTsKKwkJCWlmIChsaWtlbHkodHgpKQorCQkJCWJyZWFrOworCQkJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOworCQkJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoY2hhbik7CisJCX0KKworCQlhc3luY190eF9zdWJtaXQoY2hhbiwgdHgsIHN1Ym1pdCk7CisJCXN1Ym1pdC0+ZGVwZW5kX3R4ID0gdHg7CisKKwkJLyogZHJvcCBjb21wbGV0ZWQgc291cmNlcyAqLworCQlzcmNfY250IC09IHBxX3NyY19jbnQ7CisJCXNyY19vZmYgKz0gcHFfc3JjX2NudDsKKworCQlkbWFfZmxhZ3MgfD0gRE1BX1BSRVBfQ09OVElOVUU7CisJfQorCisJcmV0dXJuIHR4OworfQorCisvKioKKyAqIGRvX3N5bmNfZ2VuX3N5bmRyb21lIC0gc3luY2hyb25vdXNseSBjYWxjdWxhdGUgYSByYWlkNiBzeW5kcm9tZQorICovCitzdGF0aWMgdm9pZAorZG9fc3luY19nZW5fc3luZHJvbWUoc3RydWN0IHBhZ2UgKipibG9ja3MsIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCBkaXNrcywKKwkJICAgICBzaXplX3QgbGVuLCBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KQoreworCXZvaWQgKipzcmNzOworCWludCBpOworCisJaWYgKHN1Ym1pdC0+c2NyaWJibGUpCisJCXNyY3MgPSBzdWJtaXQtPnNjcmliYmxlOworCWVsc2UKKwkJc3JjcyA9ICh2b2lkICoqKSBibG9ja3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlza3M7IGkrKykgeworCQlpZiAoYmxvY2tzW2ldID09IE5VTEwpIHsKKwkJCUJVR19PTihpID4gZGlza3MgLSAzKTsgLyogUCBvciBRIGNhbid0IGJlIHplcm8gKi8KKwkJCXNyY3NbaV0gPSAodm9pZCopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCQl9IGVsc2UKKwkJCXNyY3NbaV0gPSBwYWdlX2FkZHJlc3MoYmxvY2tzW2ldKSArIG9mZnNldDsKKwl9CisJcmFpZDZfY2FsbC5nZW5fc3luZHJvbWUoZGlza3MsIGxlbiwgc3Jjcyk7CisJYXN5bmNfdHhfc3luY19lcGlsb2coc3VibWl0KTsKK30KKworLyoqCisgKiBhc3luY19nZW5fc3luZHJvbWUgLSBhc3luY2hyb25vdXNseSBjYWxjdWxhdGUgYSByYWlkNiBzeW5kcm9tZQorICogQGJsb2Nrczogc291cmNlIGJsb2NrcyBmcm9tIGlkeCAwLi5kaXNrcy0zLCBQIEAgZGlza3MtMiBhbmQgUSBAIGRpc2tzLTEKKyAqIEBvZmZzZXQ6IGNvbW1vbiBvZmZzZXQgaW50byBlYWNoIGJsb2NrIChzcmMgYW5kIGRlc3QpIHRvIHN0YXJ0IHRyYW5zYWN0aW9uCisgKiBAZGlza3M6IG51bWJlciBvZiBibG9ja3MgKGluY2x1ZGluZyBtaXNzaW5nIFAgb3IgUSwgc2VlIGJlbG93KQorICogQGxlbjogbGVuZ3RoIG9mIG9wZXJhdGlvbiBpbiBieXRlcworICogQHN1Ym1pdDogc3VibWlzc2lvbi9jb21wbGV0aW9uIG1vZGlmaWVycworICoKKyAqIEdlbmVyYWwgbm90ZTogVGhpcyByb3V0aW5lIGFzc3VtZXMgYSBmaWVsZCBvZiBHRigyXjgpIHdpdGggYQorICogcHJpbWl0aXZlIHBvbHlub21pYWwgb2YgMHgxMWQgYW5kIGEgZ2VuZXJhdG9yIG9mIHswMn0uCisgKgorICogJ2Rpc2tzJyBub3RlOiBjYWxsZXJzIGNhbiBvcHRpb25hbGx5IG9taXQgZWl0aGVyIFAgb3IgUSAoYnV0IG5vdAorICogYm90aCkgZnJvbSB0aGUgY2FsY3VsYXRpb24gYnkgc2V0dGluZyBibG9ja3NbZGlza3MtMl0gb3IKKyAqIGJsb2Nrc1tkaXNrcy0xXSB0byBOVUxMLiAgV2hlbiBQIG9yIFEgaXMgb21pdHRlZCAnbGVuJyBtdXN0IGJlIDw9CisgKiBQQUdFX1NJWkUgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIHRoaXMgc2l6ZSBpcyB1c2VkIGluIHRoZQorICogc3luY2hyb25vdXMgcGF0aC4gICdkaXNrcycgYWx3YXlzIGFjY291bnRzIGZvciBib3RoIGRlc3RpbmF0aW9uCisgKiBidWZmZXJzLiAgSWYgYW55IHNvdXJjZSBidWZmZXJzIChibG9ja3NbaV0gd2hlcmUgaSA8IGRpc2tzIC0gMikgYXJlCisgKiBzZXQgdG8gTlVMTCB0aG9zZSBidWZmZXJzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgcmFpZDZfemVyb19wYWdlCisgKiBpbiB0aGUgc3luY2hyb25vdXMgcGF0aCBhbmQgb21pdHRlZCBpbiB0aGUgaGFyZHdhcmUtYXN5bmNocm9ub3VzCisgKiBwYXRoLgorICoKKyAqICdibG9ja3MnIG5vdGU6IGlmIHN1Ym1pdC0+c2NyaWJibGUgaXMgTlVMTCB0aGVuIHRoZSBjb250ZW50cyBvZgorICogJ2Jsb2NrcycgbWF5IGJlIG92ZXJ3cml0dGVuIHRvIHBlcmZvcm0gYWRkcmVzcyBjb252ZXJzaW9ucworICogKGRtYV9tYXBfcGFnZSgpIG9yIHBhZ2VfYWRkcmVzcygpKS4KKyAqLworc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2FzeW5jX2dlbl9zeW5kcm9tZShzdHJ1Y3QgcGFnZSAqKmJsb2NrcywgdW5zaWduZWQgaW50IG9mZnNldCwgaW50IGRpc2tzLAorCQkgICBzaXplX3QgbGVuLCBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KQoreworCWludCBzcmNfY250ID0gZGlza3MgLSAyOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGFzeW5jX3R4X2ZpbmRfY2hhbm5lbChzdWJtaXQsIERNQV9QUSwKKwkJCQkJCSAgICAgICZQKGJsb2NrcywgZGlza3MpLCAyLAorCQkJCQkJICAgICAgYmxvY2tzLCBzcmNfY250LCBsZW4pOworCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UgPSBjaGFuID8gY2hhbi0+ZGV2aWNlIDogTlVMTDsKKwlkbWFfYWRkcl90ICpkbWFfc3JjID0gTlVMTDsKKworCUJVR19PTihkaXNrcyA+IDI1NSB8fCAhKFAoYmxvY2tzLCBkaXNrcykgfHwgUShibG9ja3MsIGRpc2tzKSkpOworCisJaWYgKHN1Ym1pdC0+c2NyaWJibGUpCisJCWRtYV9zcmMgPSBzdWJtaXQtPnNjcmliYmxlOworCWVsc2UgaWYgKHNpemVvZihkbWFfYWRkcl90KSA8PSBzaXplb2Yoc3RydWN0IHBhZ2UgKikpCisJCWRtYV9zcmMgPSAoZG1hX2FkZHJfdCAqKSBibG9ja3M7CisKKwlpZiAoZG1hX3NyYyAmJiBkZXZpY2UgJiYKKwkgICAgKHNyY19jbnQgPD0gZG1hX21heHBxKGRldmljZSwgMCkgfHwKKwkgICAgIGRtYV9tYXhwcShkZXZpY2UsIERNQV9QUkVQX0NPTlRJTlVFKSA+IDApICYmCisJICAgIGlzX2RtYV9wcV9hbGlnbmVkKGRldmljZSwgb2Zmc2V0LCAwLCBsZW4pKSB7CisJCS8qIHJ1biB0aGUgcCtxIGFzeW5jaHJvbm91c2x5ICovCisJCXByX2RlYnVnKCIlczogKGFzeW5jKSBkaXNrczogJWQgbGVuOiAlenVcbiIsCisJCQkgX19mdW5jX18sIGRpc2tzLCBsZW4pOworCQlyZXR1cm4gZG9fYXN5bmNfZ2VuX3N5bmRyb21lKGNoYW4sIGJsb2NrcywgcmFpZDZfZ2ZleHAsIG9mZnNldCwKKwkJCQkJICAgICBkaXNrcywgbGVuLCBkbWFfc3JjLCBzdWJtaXQpOworCX0KKworCS8qIHJ1biB0aGUgcHEgc3luY2hyb25vdXNseSAqLworCXByX2RlYnVnKCIlczogKHN5bmMpIGRpc2tzOiAlZCBsZW46ICV6dVxuIiwgX19mdW5jX18sIGRpc2tzLCBsZW4pOworCisJLyogd2FpdCBmb3IgYW55IHByZXJlcXVpc2l0ZSBvcGVyYXRpb25zICovCisJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOworCisJaWYgKCFQKGJsb2NrcywgZGlza3MpKSB7CisJCVAoYmxvY2tzLCBkaXNrcykgPSBwcV9zY3JpYmJsZV9wYWdlOworCQlCVUdfT04obGVuICsgb2Zmc2V0ID4gUEFHRV9TSVpFKTsKKwl9CisJaWYgKCFRKGJsb2NrcywgZGlza3MpKSB7CisJCVEoYmxvY2tzLCBkaXNrcykgPSBwcV9zY3JpYmJsZV9wYWdlOworCQlCVUdfT04obGVuICsgb2Zmc2V0ID4gUEFHRV9TSVpFKTsKKwl9CisJZG9fc3luY19nZW5fc3luZHJvbWUoYmxvY2tzLCBvZmZzZXQsIGRpc2tzLCBsZW4sIHN1Ym1pdCk7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX2dlbl9zeW5kcm9tZSk7CisKKy8qKgorICogYXN5bmNfc3luZHJvbWVfdmFsIC0gYXN5bmNocm9ub3VzbHkgdmFsaWRhdGUgYSByYWlkNiBzeW5kcm9tZQorICogQGJsb2Nrczogc291cmNlIGJsb2NrcyBmcm9tIGlkeCAwLi5kaXNrcy0zLCBQIEAgZGlza3MtMiBhbmQgUSBAIGRpc2tzLTEKKyAqIEBvZmZzZXQ6IGNvbW1vbiBvZmZzZXQgaW50byBlYWNoIGJsb2NrIChzcmMgYW5kIGRlc3QpIHRvIHN0YXJ0IHRyYW5zYWN0aW9uCisgKiBAZGlza3M6IG51bWJlciBvZiBibG9ja3MgKGluY2x1ZGluZyBtaXNzaW5nIFAgb3IgUSwgc2VlIGJlbG93KQorICogQGxlbjogbGVuZ3RoIG9mIG9wZXJhdGlvbiBpbiBieXRlcworICogQHBxcmVzOiBvbiB2YWwgZmFpbHVyZSBTVU1fQ0hFQ0tfUF9SRVNVTFQgYW5kL29yIFNVTV9DSEVDS19RX1JFU1VMVCBhcmUgc2V0CisgKiBAc3BhcmU6IHRlbXBvcmFyeSByZXN1bHQgYnVmZmVyIGZvciB0aGUgc3luY2hyb25vdXMgY2FzZQorICogQHN1Ym1pdDogc3VibWlzc2lvbiAvIGNvbXBsZXRpb24gbW9kaWZpZXJzCisgKgorICogVGhlIHNhbWUgbm90ZXMgZnJvbSBhc3luY19nZW5fc3luZHJvbWUgYXBwbHkgdG8gdGhlICdibG9ja3MnLAorICogYW5kICdkaXNrcycgcGFyYW1ldGVycyBvZiB0aGlzIHJvdXRpbmUuICBUaGUgc3luY2hyb25vdXMgcGF0aAorICogcmVxdWlyZXMgYSB0ZW1wb3JhcnkgcmVzdWx0IGJ1ZmZlciBhbmQgc3VibWl0LT5zY3JpYmJsZSB0byBiZQorICogc3BlY2lmaWVkLgorICovCitzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorYXN5bmNfc3luZHJvbWVfdmFsKHN0cnVjdCBwYWdlICoqYmxvY2tzLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgZGlza3MsCisJCSAgIHNpemVfdCBsZW4sIGVudW0gc3VtX2NoZWNrX2ZsYWdzICpwcXJlcywgc3RydWN0IHBhZ2UgKnNwYXJlLAorCQkgICBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KQoreworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGFzeW5jX3R4X2ZpbmRfY2hhbm5lbChzdWJtaXQsIERNQV9QUV9WQUwsCisJCQkJCQkgICAgICBOVUxMLCAwLCAgYmxvY2tzLCBkaXNrcywKKwkJCQkJCSAgICAgIGxlbik7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZSA9IGNoYW4gPyBjaGFuLT5kZXZpY2UgOiBOVUxMOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisJdW5zaWduZWQgY2hhciBjb2Vmc1tkaXNrcy0yXTsKKwllbnVtIGRtYV9jdHJsX2ZsYWdzIGRtYV9mbGFncyA9IHN1Ym1pdC0+Y2JfZm4gPyBETUFfUFJFUF9JTlRFUlJVUFQgOiAwOworCWRtYV9hZGRyX3QgKmRtYV9zcmMgPSBOVUxMOworCWludCBzcmNfY250ID0gMDsKKworCUJVR19PTihkaXNrcyA8IDQpOworCisJaWYgKHN1Ym1pdC0+c2NyaWJibGUpCisJCWRtYV9zcmMgPSBzdWJtaXQtPnNjcmliYmxlOworCWVsc2UgaWYgKHNpemVvZihkbWFfYWRkcl90KSA8PSBzaXplb2Yoc3RydWN0IHBhZ2UgKikpCisJCWRtYV9zcmMgPSAoZG1hX2FkZHJfdCAqKSBibG9ja3M7CisKKwlpZiAoZG1hX3NyYyAmJiBkZXZpY2UgJiYgZGlza3MgPD0gZG1hX21heHBxKGRldmljZSwgMCkgJiYKKwkgICAgaXNfZG1hX3BxX2FsaWduZWQoZGV2aWNlLCBvZmZzZXQsIDAsIGxlbikpIHsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0gZGV2aWNlLT5kZXY7CisJCWRtYV9hZGRyX3QgKnBxID0gJmRtYV9zcmNbZGlza3MtMl07CisJCWludCBpOworCisJCXByX2RlYnVnKCIlczogKGFzeW5jKSBkaXNrczogJWQgbGVuOiAlenVcbiIsCisJCQkgX19mdW5jX18sIGRpc2tzLCBsZW4pOworCQlpZiAoIVAoYmxvY2tzLCBkaXNrcykpCisJCQlkbWFfZmxhZ3MgfD0gRE1BX1BSRVBfUFFfRElTQUJMRV9QOworCQllbHNlCisJCQlwcVswXSA9IGRtYV9tYXBfcGFnZShkZXYsIFAoYmxvY2tzLCBkaXNrcyksCisJCQkJCSAgICAgb2Zmc2V0LCBsZW4sCisJCQkJCSAgICAgRE1BX1RPX0RFVklDRSk7CisJCWlmICghUShibG9ja3MsIGRpc2tzKSkKKwkJCWRtYV9mbGFncyB8PSBETUFfUFJFUF9QUV9ESVNBQkxFX1E7CisJCWVsc2UKKwkJCXBxWzFdID0gZG1hX21hcF9wYWdlKGRldiwgUShibG9ja3MsIGRpc2tzKSwKKwkJCQkJICAgICBvZmZzZXQsIGxlbiwKKwkJCQkJICAgICBETUFfVE9fREVWSUNFKTsKKworCQlpZiAoc3VibWl0LT5mbGFncyAmIEFTWU5DX1RYX0ZFTkNFKQorCQkJZG1hX2ZsYWdzIHw9IERNQV9QUkVQX0ZFTkNFOworCQlmb3IgKGkgPSAwOyBpIDwgZGlza3MtMjsgaSsrKQorCQkJaWYgKGxpa2VseShibG9ja3NbaV0pKSB7CisJCQkJZG1hX3NyY1tzcmNfY250XSA9IGRtYV9tYXBfcGFnZShkZXYsIGJsb2Nrc1tpXSwKKwkJCQkJCQkJb2Zmc2V0LCBsZW4sCisJCQkJCQkJCURNQV9UT19ERVZJQ0UpOworCQkJCWNvZWZzW3NyY19jbnRdID0gcmFpZDZfZ2ZleHBbaV07CisJCQkJc3JjX2NudCsrOworCQkJfQorCisJCWZvciAoOzspIHsKKwkJCXR4ID0gZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfcHFfdmFsKGNoYW4sIHBxLCBkbWFfc3JjLAorCQkJCQkJCSAgICBzcmNfY250LAorCQkJCQkJCSAgICBjb2VmcywKKwkJCQkJCQkgICAgbGVuLCBwcXJlcywKKwkJCQkJCQkgICAgZG1hX2ZsYWdzKTsKKwkJCWlmIChsaWtlbHkodHgpKQorCQkJCWJyZWFrOworCQkJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOworCQkJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoY2hhbik7CisJCX0KKwkJYXN5bmNfdHhfc3VibWl0KGNoYW4sIHR4LCBzdWJtaXQpOworCisJCXJldHVybiB0eDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcGFnZSAqcF9zcmMgPSBQKGJsb2NrcywgZGlza3MpOworCQlzdHJ1Y3QgcGFnZSAqcV9zcmMgPSBRKGJsb2NrcywgZGlza3MpOworCQllbnVtIGFzeW5jX3R4X2ZsYWdzIGZsYWdzX29yaWcgPSBzdWJtaXQtPmZsYWdzOworCQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm5fb3JpZyA9IHN1Ym1pdC0+Y2JfZm47CisJCXZvaWQgKnNjcmliYmxlID0gc3VibWl0LT5zY3JpYmJsZTsKKwkJdm9pZCAqY2JfcGFyYW1fb3JpZyA9IHN1Ym1pdC0+Y2JfcGFyYW07CisJCXZvaWQgKnAsICpxLCAqczsKKworCQlwcl9kZWJ1ZygiJXM6IChzeW5jKSBkaXNrczogJWQgbGVuOiAlenVcbiIsCisJCQkgX19mdW5jX18sIGRpc2tzLCBsZW4pOworCisJCS8qIGNhbGxlciBtdXN0IHByb3ZpZGUgYSB0ZW1wb3JhcnkgcmVzdWx0IGJ1ZmZlciBhbmQKKwkJICogYWxsb3cgdGhlIGlucHV0IHBhcmFtZXRlcnMgdG8gYmUgcHJlc2VydmVkCisJCSAqLworCQlCVUdfT04oIXNwYXJlIHx8ICFzY3JpYmJsZSk7CisKKwkJLyogd2FpdCBmb3IgYW55IHByZXJlcXVpc2l0ZSBvcGVyYXRpb25zICovCisJCWFzeW5jX3R4X3F1aWVzY2UoJnN1Ym1pdC0+ZGVwZW5kX3R4KTsKKworCQkvKiByZWNvbXB1dGUgcCBhbmQvb3IgcSBpbnRvIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCB0aGVuCisJCSAqIGNoZWNrIHRvIHNlZSB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGN1cnJlbnQgdmFsdWUKKwkJICovCisJCXR4ID0gTlVMTDsKKwkJKnBxcmVzID0gMDsKKwkJaWYgKHBfc3JjKSB7CisJCQlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIEFTWU5DX1RYX1hPUl9aRVJPX0RTVCwgTlVMTCwKKwkJCQkJICBOVUxMLCBOVUxMLCBzY3JpYmJsZSk7CisJCQl0eCA9IGFzeW5jX3hvcihzcGFyZSwgYmxvY2tzLCBvZmZzZXQsIGRpc2tzLTIsIGxlbiwgc3VibWl0KTsKKwkJCWFzeW5jX3R4X3F1aWVzY2UoJnR4KTsKKwkJCXAgPSBwYWdlX2FkZHJlc3MocF9zcmMpICsgb2Zmc2V0OworCQkJcyA9IHBhZ2VfYWRkcmVzcyhzcGFyZSkgKyBvZmZzZXQ7CisJCQkqcHFyZXMgfD0gISFtZW1jbXAocCwgcywgbGVuKSA8PCBTVU1fQ0hFQ0tfUDsKKwkJfQorCisJCWlmIChxX3NyYykgeworCQkJUChibG9ja3MsIGRpc2tzKSA9IE5VTEw7CisJCQlRKGJsb2NrcywgZGlza3MpID0gc3BhcmU7CisJCQlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIHNjcmliYmxlKTsKKwkJCXR4ID0gYXN5bmNfZ2VuX3N5bmRyb21lKGJsb2Nrcywgb2Zmc2V0LCBkaXNrcywgbGVuLCBzdWJtaXQpOworCQkJYXN5bmNfdHhfcXVpZXNjZSgmdHgpOworCQkJcSA9IHBhZ2VfYWRkcmVzcyhxX3NyYykgKyBvZmZzZXQ7CisJCQlzID0gcGFnZV9hZGRyZXNzKHNwYXJlKSArIG9mZnNldDsKKwkJCSpwcXJlcyB8PSAhIW1lbWNtcChxLCBzLCBsZW4pIDw8IFNVTV9DSEVDS19ROworCQl9CisKKwkJLyogcmVzdG9yZSBQLCBRIGFuZCBzdWJtaXQgKi8KKwkJUChibG9ja3MsIGRpc2tzKSA9IHBfc3JjOworCQlRKGJsb2NrcywgZGlza3MpID0gcV9zcmM7CisKKwkJc3VibWl0LT5jYl9mbiA9IGNiX2ZuX29yaWc7CisJCXN1Ym1pdC0+Y2JfcGFyYW0gPSBjYl9wYXJhbV9vcmlnOworCQlzdWJtaXQtPmZsYWdzID0gZmxhZ3Nfb3JpZzsKKwkJYXN5bmNfdHhfc3luY19lcGlsb2coc3VibWl0KTsKKworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc3luY19zeW5kcm9tZV92YWwpOworCitzdGF0aWMgaW50IF9faW5pdCBhc3luY19wcV9pbml0KHZvaWQpCit7CisJcHFfc2NyaWJibGVfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisKKwlpZiAocHFfc2NyaWJibGVfcGFnZSkKKwkJcmV0dXJuIDA7CisKKwlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgc3BhcmUgcGFnZVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhc3luY19wcV9leGl0KHZvaWQpCit7CisJcHV0X3BhZ2UocHFfc2NyaWJibGVfcGFnZSk7Cit9CisKK21vZHVsZV9pbml0KGFzeW5jX3BxX2luaXQpOworbW9kdWxlX2V4aXQoYXN5bmNfcHFfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiYXN5bmNocm9ub3VzIHJhaWQ2IHN5bmRyb21lIGdlbmVyYXRpb24vdmFsaWRhdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3JhaWQ2X3JlY292LmMgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcmFpZDZfcmVjb3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDNmMmFiCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3JhaWQ2X3JlY292LmMKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisgKiBBc3luY2hyb25vdXMgUkFJRC02IHJlY292ZXJ5IGNhbGN1bGF0aW9ucyBBU1lOQ19UWCBBUEkuCisgKiBDb3B5cmlnaHQoYykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIGJhc2VkIG9uIHJhaWQ2cmVjb3YuYzoKKyAqICAgQ29weXJpZ2h0IDIwMDIgSC4gUGV0ZXIgQW52aW4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxCisgKiBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jX3R4Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorYXN5bmNfc3VtX3Byb2R1Y3Qoc3RydWN0IHBhZ2UgKmRlc3QsIHN0cnVjdCBwYWdlICoqc3JjcywgdW5zaWduZWQgY2hhciAqY29lZiwKKwkJICBzaXplX3QgbGVuLCBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KQoreworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGFzeW5jX3R4X2ZpbmRfY2hhbm5lbChzdWJtaXQsIERNQV9QUSwKKwkJCQkJCSAgICAgICZkZXN0LCAxLCBzcmNzLCAyLCBsZW4pOworCXN0cnVjdCBkbWFfZGV2aWNlICpkbWEgPSBjaGFuID8gY2hhbi0+ZGV2aWNlIDogTlVMTDsKKwljb25zdCB1OCAqYW11bCwgKmJtdWw7CisJdTggYXgsIGJ4OworCXU4ICphLCAqYiwgKmM7CisKKwlpZiAoZG1hKSB7CisJCWRtYV9hZGRyX3QgZG1hX2Rlc3RbMl07CisJCWRtYV9hZGRyX3QgZG1hX3NyY1syXTsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0gZG1hLT5kZXY7CisJCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisJCWVudW0gZG1hX2N0cmxfZmxhZ3MgZG1hX2ZsYWdzID0gRE1BX1BSRVBfUFFfRElTQUJMRV9QOworCisJCWlmIChzdWJtaXQtPmZsYWdzICYgQVNZTkNfVFhfRkVOQ0UpCisJCQlkbWFfZmxhZ3MgfD0gRE1BX1BSRVBfRkVOQ0U7CisJCWRtYV9kZXN0WzFdID0gZG1hX21hcF9wYWdlKGRldiwgZGVzdCwgMCwgbGVuLCBETUFfQklESVJFQ1RJT05BTCk7CisJCWRtYV9zcmNbMF0gPSBkbWFfbWFwX3BhZ2UoZGV2LCBzcmNzWzBdLCAwLCBsZW4sIERNQV9UT19ERVZJQ0UpOworCQlkbWFfc3JjWzFdID0gZG1hX21hcF9wYWdlKGRldiwgc3Jjc1sxXSwgMCwgbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJdHggPSBkbWEtPmRldmljZV9wcmVwX2RtYV9wcShjaGFuLCBkbWFfZGVzdCwgZG1hX3NyYywgMiwgY29lZiwKKwkJCQkJICAgICBsZW4sIGRtYV9mbGFncyk7CisJCWlmICh0eCkgeworCQkJYXN5bmNfdHhfc3VibWl0KGNoYW4sIHR4LCBzdWJtaXQpOworCQkJcmV0dXJuIHR4OworCQl9CisKKwkJLyogY291bGQgbm90IGdldCBhIGRlc2NyaXB0b3IsIHVubWFwIGFuZCBmYWxsIHRocm91Z2ggdG8KKwkJICogdGhlIHN5bmNocm9ub3VzIHBhdGgKKwkJICovCisJCWRtYV91bm1hcF9wYWdlKGRldiwgZG1hX2Rlc3RbMV0sIGxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOworCQlkbWFfdW5tYXBfcGFnZShkZXYsIGRtYV9zcmNbMF0sIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJCWRtYV91bm1hcF9wYWdlKGRldiwgZG1hX3NyY1sxXSwgbGVuLCBETUFfVE9fREVWSUNFKTsKKwl9CisKKwkvKiBydW4gdGhlIG9wZXJhdGlvbiBzeW5jaHJvbm91c2x5ICovCisJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOworCWFtdWwgPSByYWlkNl9nZm11bFtjb2VmWzBdXTsKKwlibXVsID0gcmFpZDZfZ2ZtdWxbY29lZlsxXV07CisJYSA9IHBhZ2VfYWRkcmVzcyhzcmNzWzBdKTsKKwliID0gcGFnZV9hZGRyZXNzKHNyY3NbMV0pOworCWMgPSBwYWdlX2FkZHJlc3MoZGVzdCk7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJYXggICAgPSBhbXVsWyphKytdOworCQlieCAgICA9IGJtdWxbKmIrK107CisJCSpjKysgPSBheCBeIGJ4OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2FzeW5jX211bHQoc3RydWN0IHBhZ2UgKmRlc3QsIHN0cnVjdCBwYWdlICpzcmMsIHU4IGNvZWYsIHNpemVfdCBsZW4sCisJICAgc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCkKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBhc3luY190eF9maW5kX2NoYW5uZWwoc3VibWl0LCBETUFfUFEsCisJCQkJCQkgICAgICAmZGVzdCwgMSwgJnNyYywgMSwgbGVuKTsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hID0gY2hhbiA/IGNoYW4tPmRldmljZSA6IE5VTEw7CisJY29uc3QgdTggKnFtdWw7IC8qIFEgbXVsdGlwbGllciB0YWJsZSAqLworCXU4ICpkLCAqczsKKworCWlmIChkbWEpIHsKKwkJZG1hX2FkZHJfdCBkbWFfZGVzdFsyXTsKKwkJZG1hX2FkZHJfdCBkbWFfc3JjWzFdOworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkbWEtPmRldjsKKwkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKwkJZW51bSBkbWFfY3RybF9mbGFncyBkbWFfZmxhZ3MgPSBETUFfUFJFUF9QUV9ESVNBQkxFX1A7CisKKwkJaWYgKHN1Ym1pdC0+ZmxhZ3MgJiBBU1lOQ19UWF9GRU5DRSkKKwkJCWRtYV9mbGFncyB8PSBETUFfUFJFUF9GRU5DRTsKKwkJZG1hX2Rlc3RbMV0gPSBkbWFfbWFwX3BhZ2UoZGV2LCBkZXN0LCAwLCBsZW4sIERNQV9CSURJUkVDVElPTkFMKTsKKwkJZG1hX3NyY1swXSA9IGRtYV9tYXBfcGFnZShkZXYsIHNyYywgMCwgbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJdHggPSBkbWEtPmRldmljZV9wcmVwX2RtYV9wcShjaGFuLCBkbWFfZGVzdCwgZG1hX3NyYywgMSwgJmNvZWYsCisJCQkJCSAgICAgbGVuLCBkbWFfZmxhZ3MpOworCQlpZiAodHgpIHsKKwkJCWFzeW5jX3R4X3N1Ym1pdChjaGFuLCB0eCwgc3VibWl0KTsKKwkJCXJldHVybiB0eDsKKwkJfQorCisJCS8qIGNvdWxkIG5vdCBnZXQgYSBkZXNjcmlwdG9yLCB1bm1hcCBhbmQgZmFsbCB0aHJvdWdoIHRvCisJCSAqIHRoZSBzeW5jaHJvbm91cyBwYXRoCisJCSAqLworCQlkbWFfdW5tYXBfcGFnZShkZXYsIGRtYV9kZXN0WzFdLCBsZW4sIERNQV9CSURJUkVDVElPTkFMKTsKKwkJZG1hX3VubWFwX3BhZ2UoZGV2LCBkbWFfc3JjWzBdLCBsZW4sIERNQV9UT19ERVZJQ0UpOworCX0KKworCS8qIG5vIGNoYW5uZWwgYXZhaWxhYmxlLCBvciBmYWlsZWQgdG8gYWxsb2NhdGUgYSBkZXNjcmlwdG9yLCBzbworCSAqIHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBzeW5jaHJvbm91c2x5CisJICovCisJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOworCXFtdWwgID0gcmFpZDZfZ2ZtdWxbY29lZl07CisJZCA9IHBhZ2VfYWRkcmVzcyhkZXN0KTsKKwlzID0gcGFnZV9hZGRyZXNzKHNyYyk7CisKKwl3aGlsZSAobGVuLS0pCisJCSpkKysgPSBxbXVsWypzKytdOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorX18yZGF0YV9yZWNvdl80KGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCBpbnQgZmFpbGEsIGludCBmYWlsYiwKKwkJc3RydWN0IHBhZ2UgKipibG9ja3MsIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCit7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKnAsICpxLCAqYSwgKmI7CisJc3RydWN0IHBhZ2UgKnNyY3NbMl07CisJdW5zaWduZWQgY2hhciBjb2VmWzJdOworCWVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3MgPSBzdWJtaXQtPmZsYWdzOworCWRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiA9IHN1Ym1pdC0+Y2JfZm47CisJdm9pZCAqY2JfcGFyYW0gPSBzdWJtaXQtPmNiX3BhcmFtOworCXZvaWQgKnNjcmliYmxlID0gc3VibWl0LT5zY3JpYmJsZTsKKworCXAgPSBibG9ja3NbZGlza3MtMl07CisJcSA9IGJsb2Nrc1tkaXNrcy0xXTsKKworCWEgPSBibG9ja3NbZmFpbGFdOworCWIgPSBibG9ja3NbZmFpbGJdOworCisJLyogaW4gdGhlIDQgZGlzayBjYXNlIFAgKyBQeHkgPT0gUCBhbmQgUSArIFF4eSA9PSBRICovCisJLyogRHggPSBBKihQK1B4eSkgKyBCKihRK1F4eSkgKi8KKwlzcmNzWzBdID0gcDsKKwlzcmNzWzFdID0gcTsKKwljb2VmWzBdID0gcmFpZDZfZ2ZleGlbZmFpbGItZmFpbGFdOworCWNvZWZbMV0gPSByYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV1ecmFpZDZfZ2ZleHBbZmFpbGJdXTsKKwlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFLCB0eCwgTlVMTCwgTlVMTCwgc2NyaWJibGUpOworCXR4ID0gYXN5bmNfc3VtX3Byb2R1Y3QoYiwgc3JjcywgY29lZiwgYnl0ZXMsIHN1Ym1pdCk7CisKKwkvKiBEeSA9IFArUHh5K0R4ICovCisJc3Jjc1swXSA9IHA7CisJc3Jjc1sxXSA9IGI7CisJaW5pdF9hc3luY19zdWJtaXQoc3VibWl0LCBmbGFncyB8IEFTWU5DX1RYX1hPUl9aRVJPX0RTVCwgdHgsIGNiX2ZuLAorCQkJICBjYl9wYXJhbSwgc2NyaWJibGUpOworCXR4ID0gYXN5bmNfeG9yKGEsIHNyY3MsIDAsIDIsIGJ5dGVzLCBzdWJtaXQpOworCisJcmV0dXJuIHR4OworCit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorX18yZGF0YV9yZWNvdl81KGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCBpbnQgZmFpbGEsIGludCBmYWlsYiwKKwkJc3RydWN0IHBhZ2UgKipibG9ja3MsIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCit7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKnAsICpxLCAqZywgKmRwLCAqZHE7CisJc3RydWN0IHBhZ2UgKnNyY3NbMl07CisJdW5zaWduZWQgY2hhciBjb2VmWzJdOworCWVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3MgPSBzdWJtaXQtPmZsYWdzOworCWRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiA9IHN1Ym1pdC0+Y2JfZm47CisJdm9pZCAqY2JfcGFyYW0gPSBzdWJtaXQtPmNiX3BhcmFtOworCXZvaWQgKnNjcmliYmxlID0gc3VibWl0LT5zY3JpYmJsZTsKKwlpbnQgZ29vZF9zcmNzLCBnb29kLCBpOworCisJZ29vZF9zcmNzID0gMDsKKwlnb29kID0gLTE7CisJZm9yIChpID0gMDsgaSA8IGRpc2tzLTI7IGkrKykgeworCQlpZiAoYmxvY2tzW2ldID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKGkgPT0gZmFpbGEgfHwgaSA9PSBmYWlsYikKKwkJCWNvbnRpbnVlOworCQlnb29kID0gaTsKKwkJZ29vZF9zcmNzKys7CisJfQorCUJVR19PTihnb29kX3NyY3MgPiAxKTsKKworCXAgPSBibG9ja3NbZGlza3MtMl07CisJcSA9IGJsb2Nrc1tkaXNrcy0xXTsKKwlnID0gYmxvY2tzW2dvb2RdOworCisJLyogQ29tcHV0ZSBzeW5kcm9tZSB3aXRoIHplcm8gZm9yIHRoZSBtaXNzaW5nIGRhdGEgcGFnZXMKKwkgKiBVc2UgdGhlIGRlYWQgZGF0YSBwYWdlcyBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZGVsdGEgcCBhbmQKKwkgKiBkZWx0YSBxCisJICovCisJZHAgPSBibG9ja3NbZmFpbGFdOworCWRxID0gYmxvY2tzW2ZhaWxiXTsKKworCWluaXRfYXN5bmNfc3VibWl0KHN1Ym1pdCwgQVNZTkNfVFhfRkVOQ0UsIHR4LCBOVUxMLCBOVUxMLCBzY3JpYmJsZSk7CisJdHggPSBhc3luY19tZW1jcHkoZHAsIGcsIDAsIDAsIGJ5dGVzLCBzdWJtaXQpOworCWluaXRfYXN5bmNfc3VibWl0KHN1Ym1pdCwgQVNZTkNfVFhfRkVOQ0UsIHR4LCBOVUxMLCBOVUxMLCBzY3JpYmJsZSk7CisJdHggPSBhc3luY19tdWx0KGRxLCBnLCByYWlkNl9nZmV4cFtnb29kXSwgYnl0ZXMsIHN1Ym1pdCk7CisKKwkvKiBjb21wdXRlIFAgKyBQeHkgKi8KKwlzcmNzWzBdID0gZHA7CisJc3Jjc1sxXSA9IHA7CisJaW5pdF9hc3luY19zdWJtaXQoc3VibWl0LCBBU1lOQ19UWF9GRU5DRXxBU1lOQ19UWF9YT1JfRFJPUF9EU1QsIHR4LAorCQkJICBOVUxMLCBOVUxMLCBzY3JpYmJsZSk7CisJdHggPSBhc3luY194b3IoZHAsIHNyY3MsIDAsIDIsIGJ5dGVzLCBzdWJtaXQpOworCisJLyogY29tcHV0ZSBRICsgUXh5ICovCisJc3Jjc1swXSA9IGRxOworCXNyY3NbMV0gPSBxOworCWluaXRfYXN5bmNfc3VibWl0KHN1Ym1pdCwgQVNZTkNfVFhfRkVOQ0V8QVNZTkNfVFhfWE9SX0RST1BfRFNULCB0eCwKKwkJCSAgTlVMTCwgTlVMTCwgc2NyaWJibGUpOworCXR4ID0gYXN5bmNfeG9yKGRxLCBzcmNzLCAwLCAyLCBieXRlcywgc3VibWl0KTsKKworCS8qIER4ID0gQSooUCtQeHkpICsgQiooUStReHkpICovCisJc3Jjc1swXSA9IGRwOworCXNyY3NbMV0gPSBkcTsKKwljb2VmWzBdID0gcmFpZDZfZ2ZleGlbZmFpbGItZmFpbGFdOworCWNvZWZbMV0gPSByYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV1ecmFpZDZfZ2ZleHBbZmFpbGJdXTsKKwlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFLCB0eCwgTlVMTCwgTlVMTCwgc2NyaWJibGUpOworCXR4ID0gYXN5bmNfc3VtX3Byb2R1Y3QoZHEsIHNyY3MsIGNvZWYsIGJ5dGVzLCBzdWJtaXQpOworCisJLyogRHkgPSBQK1B4eStEeCAqLworCXNyY3NbMF0gPSBkcDsKKwlzcmNzWzFdID0gZHE7CisJaW5pdF9hc3luY19zdWJtaXQoc3VibWl0LCBmbGFncyB8IEFTWU5DX1RYX1hPUl9EUk9QX0RTVCwgdHgsIGNiX2ZuLAorCQkJICBjYl9wYXJhbSwgc2NyaWJibGUpOworCXR4ID0gYXN5bmNfeG9yKGRwLCBzcmNzLCAwLCAyLCBieXRlcywgc3VibWl0KTsKKworCXJldHVybiB0eDsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitfXzJkYXRhX3JlY292X24oaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwgaW50IGZhaWxiLAorCSAgICAgIHN0cnVjdCBwYWdlICoqYmxvY2tzLCBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KQoreworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHggPSBOVUxMOworCXN0cnVjdCBwYWdlICpwLCAqcSwgKmRwLCAqZHE7CisJc3RydWN0IHBhZ2UgKnNyY3NbMl07CisJdW5zaWduZWQgY2hhciBjb2VmWzJdOworCWVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3MgPSBzdWJtaXQtPmZsYWdzOworCWRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiA9IHN1Ym1pdC0+Y2JfZm47CisJdm9pZCAqY2JfcGFyYW0gPSBzdWJtaXQtPmNiX3BhcmFtOworCXZvaWQgKnNjcmliYmxlID0gc3VibWl0LT5zY3JpYmJsZTsKKworCXAgPSBibG9ja3NbZGlza3MtMl07CisJcSA9IGJsb2Nrc1tkaXNrcy0xXTsKKworCS8qIENvbXB1dGUgc3luZHJvbWUgd2l0aCB6ZXJvIGZvciB0aGUgbWlzc2luZyBkYXRhIHBhZ2VzCisJICogVXNlIHRoZSBkZWFkIGRhdGEgcGFnZXMgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yCisJICogZGVsdGEgcCBhbmQgZGVsdGEgcQorCSAqLworCWRwID0gYmxvY2tzW2ZhaWxhXTsKKwlibG9ja3NbZmFpbGFdID0gTlVMTDsKKwlibG9ja3NbZGlza3MtMl0gPSBkcDsKKwlkcSA9IGJsb2Nrc1tmYWlsYl07CisJYmxvY2tzW2ZhaWxiXSA9IE5VTEw7CisJYmxvY2tzW2Rpc2tzLTFdID0gZHE7CisKKwlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFLCB0eCwgTlVMTCwgTlVMTCwgc2NyaWJibGUpOworCXR4ID0gYXN5bmNfZ2VuX3N5bmRyb21lKGJsb2NrcywgMCwgZGlza3MsIGJ5dGVzLCBzdWJtaXQpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJYmxvY2tzW2ZhaWxhXSAgID0gZHA7CisJYmxvY2tzW2ZhaWxiXSAgID0gZHE7CisJYmxvY2tzW2Rpc2tzLTJdID0gcDsKKwlibG9ja3NbZGlza3MtMV0gPSBxOworCisJLyogY29tcHV0ZSBQICsgUHh5ICovCisJc3Jjc1swXSA9IGRwOworCXNyY3NbMV0gPSBwOworCWluaXRfYXN5bmNfc3VibWl0KHN1Ym1pdCwgQVNZTkNfVFhfRkVOQ0V8QVNZTkNfVFhfWE9SX0RST1BfRFNULCB0eCwKKwkJCSAgTlVMTCwgTlVMTCwgc2NyaWJibGUpOworCXR4ID0gYXN5bmNfeG9yKGRwLCBzcmNzLCAwLCAyLCBieXRlcywgc3VibWl0KTsKKworCS8qIGNvbXB1dGUgUSArIFF4eSAqLworCXNyY3NbMF0gPSBkcTsKKwlzcmNzWzFdID0gcTsKKwlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFfEFTWU5DX1RYX1hPUl9EUk9QX0RTVCwgdHgsCisJCQkgIE5VTEwsIE5VTEwsIHNjcmliYmxlKTsKKwl0eCA9IGFzeW5jX3hvcihkcSwgc3JjcywgMCwgMiwgYnl0ZXMsIHN1Ym1pdCk7CisKKwkvKiBEeCA9IEEqKFArUHh5KSArIEIqKFErUXh5KSAqLworCXNyY3NbMF0gPSBkcDsKKwlzcmNzWzFdID0gZHE7CisJY29lZlswXSA9IHJhaWQ2X2dmZXhpW2ZhaWxiLWZhaWxhXTsKKwljb2VmWzFdID0gcmFpZDZfZ2ZpbnZbcmFpZDZfZ2ZleHBbZmFpbGFdXnJhaWQ2X2dmZXhwW2ZhaWxiXV07CisJaW5pdF9hc3luY19zdWJtaXQoc3VibWl0LCBBU1lOQ19UWF9GRU5DRSwgdHgsIE5VTEwsIE5VTEwsIHNjcmliYmxlKTsKKwl0eCA9IGFzeW5jX3N1bV9wcm9kdWN0KGRxLCBzcmNzLCBjb2VmLCBieXRlcywgc3VibWl0KTsKKworCS8qIER5ID0gUCtQeHkrRHggKi8KKwlzcmNzWzBdID0gZHA7CisJc3Jjc1sxXSA9IGRxOworCWluaXRfYXN5bmNfc3VibWl0KHN1Ym1pdCwgZmxhZ3MgfCBBU1lOQ19UWF9YT1JfRFJPUF9EU1QsIHR4LCBjYl9mbiwKKwkJCSAgY2JfcGFyYW0sIHNjcmliYmxlKTsKKwl0eCA9IGFzeW5jX3hvcihkcCwgc3JjcywgMCwgMiwgYnl0ZXMsIHN1Ym1pdCk7CisKKwlyZXR1cm4gdHg7Cit9CisKKy8qKgorICogYXN5bmNfcmFpZDZfMmRhdGFfcmVjb3YgLSBhc3luY2hyb25vdXNseSBjYWxjdWxhdGUgdHdvIG1pc3NpbmcgZGF0YSBibG9ja3MKKyAqIEBkaXNrczogbnVtYmVyIG9mIGRpc2tzIGluIHRoZSBSQUlELTYgYXJyYXkKKyAqIEBieXRlczogYmxvY2sgc2l6ZQorICogQGZhaWxhOiBmaXJzdCBmYWlsZWQgZHJpdmUgaW5kZXgKKyAqIEBmYWlsYjogc2Vjb25kIGZhaWxlZCBkcml2ZSBpbmRleAorICogQGJsb2NrczogYXJyYXkgb2Ygc291cmNlIHBvaW50ZXJzIHdoZXJlIHRoZSBsYXN0IHR3byBlbnRyaWVzIGFyZSBwIGFuZCBxCisgKiBAc3VibWl0OiBzdWJtaXNzaW9uL2NvbXBsZXRpb24gbW9kaWZpZXJzCisgKi8KK3N0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCithc3luY19yYWlkNl8yZGF0YV9yZWNvdihpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLCBpbnQgZmFpbGIsCisJCQlzdHJ1Y3QgcGFnZSAqKmJsb2Nrcywgc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCkKK3sKKwlpbnQgbm9uX3plcm9fc3JjcywgaTsKKworCUJVR19PTihmYWlsYSA9PSBmYWlsYik7CisJaWYgKGZhaWxiIDwgZmFpbGEpCisJCXN3YXAoZmFpbGEsIGZhaWxiKTsKKworCXByX2RlYnVnKCIlczogZGlza3M6ICVkIGxlbjogJXp1XG4iLCBfX2Z1bmNfXywgZGlza3MsIGJ5dGVzKTsKKworCS8qIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGNvbnRlbnRzIG9mICdibG9ja3MnIGZvciB0aGUgYXN5bmMKKwkgKiBjYXNlLCBzbyBwdW50IHRvIHN5bmNocm9ub3VzIGlmIGEgc2NyaWJibGUgYnVmZmVyIGlzIG5vdCBhdmFpbGFibGUKKwkgKi8KKwlpZiAoIXN1Ym1pdC0+c2NyaWJibGUpIHsKKwkJdm9pZCAqKnB0cnMgPSAodm9pZCAqKikgYmxvY2tzOworCisJCWFzeW5jX3R4X3F1aWVzY2UoJnN1Ym1pdC0+ZGVwZW5kX3R4KTsKKwkJZm9yIChpID0gMDsgaSA8IGRpc2tzOyBpKyspCisJCQlpZiAoYmxvY2tzW2ldID09IE5VTEwpCisJCQkJcHRyc1tpXSA9ICh2b2lkICopIHJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwkJCWVsc2UKKwkJCQlwdHJzW2ldID0gcGFnZV9hZGRyZXNzKGJsb2Nrc1tpXSk7CisKKwkJcmFpZDZfMmRhdGFfcmVjb3YoZGlza3MsIGJ5dGVzLCBmYWlsYSwgZmFpbGIsIHB0cnMpOworCisJCWFzeW5jX3R4X3N5bmNfZXBpbG9nKHN1Ym1pdCk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbm9uX3plcm9fc3JjcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGRpc2tzLTIgJiYgbm9uX3plcm9fc3JjcyA8IDQ7IGkrKykKKwkJaWYgKGJsb2Nrc1tpXSkKKwkJCW5vbl96ZXJvX3NyY3MrKzsKKwlzd2l0Y2ggKG5vbl96ZXJvX3NyY3MpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCQkvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IDIgc291cmNlcyAtIHRoZSBmYWlsZWQgZGV2aWNlcy4gKi8KKwkJQlVHKCk7CisKKwljYXNlIDI6CisJCS8qIGRtYSBkZXZpY2VzIGRvIG5vdCB1bmlmb3JtbHkgdW5kZXJzdGFuZCBhIHplcm8gc291cmNlIHBxCisJCSAqIG9wZXJhdGlvbiAoaW4gY29udHJhc3QgdG8gdGhlIHN5bmNocm9ub3VzIGNhc2UpLCBzbworCQkgKiBleHBsaWNpdGx5IGhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgNCBkaXNrIGFycmF5IHdpdGgKKwkJICogYm90aCBkYXRhIGRpc2tzIG1pc3NpbmcuCisJCSAqLworCQlyZXR1cm4gX18yZGF0YV9yZWNvdl80KGRpc2tzLCBieXRlcywgZmFpbGEsIGZhaWxiLCBibG9ja3MsIHN1Ym1pdCk7CisJY2FzZSAzOgorCQkvKiBkbWEgZGV2aWNlcyBkbyBub3QgdW5pZm9ybWx5IHVuZGVyc3RhbmQgYSBzaW5nbGUKKwkJICogc291cmNlIHBxIG9wZXJhdGlvbiAoaW4gY29udHJhc3QgdG8gdGhlIHN5bmNocm9ub3VzCisJCSAqIGNhc2UpLCBzbyBleHBsaWNpdGx5IGhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgNSBkaXNrCisJCSAqIGFycmF5IHdpdGggMiBvZiAzIGRhdGEgZGlza3MgbWlzc2luZy4KKwkJICovCisJCXJldHVybiBfXzJkYXRhX3JlY292XzUoZGlza3MsIGJ5dGVzLCBmYWlsYSwgZmFpbGIsIGJsb2Nrcywgc3VibWl0KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gX18yZGF0YV9yZWNvdl9uKGRpc2tzLCBieXRlcywgZmFpbGEsIGZhaWxiLCBibG9ja3MsIHN1Ym1pdCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfcmFpZDZfMmRhdGFfcmVjb3YpOworCisvKioKKyAqIGFzeW5jX3JhaWQ2X2RhdGFwX3JlY292IC0gYXN5bmNocm9ub3VzbHkgY2FsY3VsYXRlIGEgZGF0YSBhbmQgdGhlICdwJyBibG9jaworICogQGRpc2tzOiBudW1iZXIgb2YgZGlza3MgaW4gdGhlIFJBSUQtNiBhcnJheQorICogQGJ5dGVzOiBibG9jayBzaXplCisgKiBAZmFpbGE6IGZhaWxlZCBkcml2ZSBpbmRleAorICogQGJsb2NrczogYXJyYXkgb2Ygc291cmNlIHBvaW50ZXJzIHdoZXJlIHRoZSBsYXN0IHR3byBlbnRyaWVzIGFyZSBwIGFuZCBxCisgKiBAc3VibWl0OiBzdWJtaXNzaW9uL2NvbXBsZXRpb24gbW9kaWZpZXJzCisgKi8KK3N0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCithc3luY19yYWlkNl9kYXRhcF9yZWNvdihpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQkJc3RydWN0IHBhZ2UgKipibG9ja3MsIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCit7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKnAsICpxLCAqZHE7CisJdTggY29lZjsKKwllbnVtIGFzeW5jX3R4X2ZsYWdzIGZsYWdzID0gc3VibWl0LT5mbGFnczsKKwlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm4gPSBzdWJtaXQtPmNiX2ZuOworCXZvaWQgKmNiX3BhcmFtID0gc3VibWl0LT5jYl9wYXJhbTsKKwl2b2lkICpzY3JpYmJsZSA9IHN1Ym1pdC0+c2NyaWJibGU7CisJaW50IGdvb2Rfc3JjcywgZ29vZCwgaTsKKwlzdHJ1Y3QgcGFnZSAqc3Jjc1syXTsKKworCXByX2RlYnVnKCIlczogZGlza3M6ICVkIGxlbjogJXp1XG4iLCBfX2Z1bmNfXywgZGlza3MsIGJ5dGVzKTsKKworCS8qIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGNvbnRlbnRzIG9mICdibG9ja3MnIGZvciB0aGUgYXN5bmMKKwkgKiBjYXNlLCBzbyBwdW50IHRvIHN5bmNocm9ub3VzIGlmIGEgc2NyaWJibGUgYnVmZmVyIGlzIG5vdCBhdmFpbGFibGUKKwkgKi8KKwlpZiAoIXNjcmliYmxlKSB7CisJCXZvaWQgKipwdHJzID0gKHZvaWQgKiopIGJsb2NrczsKKworCQlhc3luY190eF9xdWllc2NlKCZzdWJtaXQtPmRlcGVuZF90eCk7CisJCWZvciAoaSA9IDA7IGkgPCBkaXNrczsgaSsrKQorCQkJaWYgKGJsb2Nrc1tpXSA9PSBOVUxMKQorCQkJCXB0cnNbaV0gPSAodm9pZCopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCQkJZWxzZQorCQkJCXB0cnNbaV0gPSBwYWdlX2FkZHJlc3MoYmxvY2tzW2ldKTsKKworCQlyYWlkNl9kYXRhcF9yZWNvdihkaXNrcywgYnl0ZXMsIGZhaWxhLCBwdHJzKTsKKworCQlhc3luY190eF9zeW5jX2VwaWxvZyhzdWJtaXQpOworCisJCXJldHVybiBOVUxMOworCX0KKworCWdvb2Rfc3JjcyA9IDA7CisJZ29vZCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBkaXNrcy0yOyBpKyspIHsKKwkJaWYgKGkgPT0gZmFpbGEpCisJCQljb250aW51ZTsKKwkJaWYgKGJsb2Nrc1tpXSkgeworCQkJZ29vZCA9IGk7CisJCQlnb29kX3NyY3MrKzsKKwkJCWlmIChnb29kX3NyY3MgPiAxKQorCQkJCWJyZWFrOworCQl9CisJfQorCUJVR19PTihnb29kX3NyY3MgPT0gMCk7CisKKwlwID0gYmxvY2tzW2Rpc2tzLTJdOworCXEgPSBibG9ja3NbZGlza3MtMV07CisKKwkvKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlCisJICogVXNlIHRoZSBkZWFkIGRhdGEgcGFnZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZGVsdGEgcQorCSAqLworCWRxID0gYmxvY2tzW2ZhaWxhXTsKKwlibG9ja3NbZmFpbGFdID0gTlVMTDsKKwlibG9ja3NbZGlza3MtMV0gPSBkcTsKKworCS8qIGluIHRoZSA0LWRpc2sgY2FzZSB3ZSBvbmx5IG5lZWQgdG8gcGVyZm9ybSBhIHNpbmdsZSBzb3VyY2UKKwkgKiBtdWx0aXBsaWNhdGlvbiB3aXRoIHRoZSBvbmUgZ29vZCBkYXRhIGJsb2NrLgorCSAqLworCWlmIChnb29kX3NyY3MgPT0gMSkgeworCQlzdHJ1Y3QgcGFnZSAqZyA9IGJsb2Nrc1tnb29kXTsKKworCQlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFLCB0eCwgTlVMTCwgTlVMTCwKKwkJCQkgIHNjcmliYmxlKTsKKwkJdHggPSBhc3luY19tZW1jcHkocCwgZywgMCwgMCwgYnl0ZXMsIHN1Ym1pdCk7CisKKwkJaW5pdF9hc3luY19zdWJtaXQoc3VibWl0LCBBU1lOQ19UWF9GRU5DRSwgdHgsIE5VTEwsIE5VTEwsCisJCQkJICBzY3JpYmJsZSk7CisJCXR4ID0gYXN5bmNfbXVsdChkcSwgZywgcmFpZDZfZ2ZleHBbZ29vZF0sIGJ5dGVzLCBzdWJtaXQpOworCX0gZWxzZSB7CisJCWluaXRfYXN5bmNfc3VibWl0KHN1Ym1pdCwgQVNZTkNfVFhfRkVOQ0UsIHR4LCBOVUxMLCBOVUxMLAorCQkJCSAgc2NyaWJibGUpOworCQl0eCA9IGFzeW5jX2dlbl9zeW5kcm9tZShibG9ja3MsIDAsIGRpc2tzLCBieXRlcywgc3VibWl0KTsKKwl9CisKKwkvKiBSZXN0b3JlIHBvaW50ZXIgdGFibGUgKi8KKwlibG9ja3NbZmFpbGFdICAgPSBkcTsKKwlibG9ja3NbZGlza3MtMV0gPSBxOworCisJLyogY2FsY3VsYXRlIGdeey1mYWlsYX0gKi8KKwljb2VmID0gcmFpZDZfZ2ZpbnZbcmFpZDZfZ2ZleHBbZmFpbGFdXTsKKworCXNyY3NbMF0gPSBkcTsKKwlzcmNzWzFdID0gcTsKKwlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFfEFTWU5DX1RYX1hPUl9EUk9QX0RTVCwgdHgsCisJCQkgIE5VTEwsIE5VTEwsIHNjcmliYmxlKTsKKwl0eCA9IGFzeW5jX3hvcihkcSwgc3JjcywgMCwgMiwgYnl0ZXMsIHN1Ym1pdCk7CisKKwlpbml0X2FzeW5jX3N1Ym1pdChzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFLCB0eCwgTlVMTCwgTlVMTCwgc2NyaWJibGUpOworCXR4ID0gYXN5bmNfbXVsdChkcSwgZHEsIGNvZWYsIGJ5dGVzLCBzdWJtaXQpOworCisJc3Jjc1swXSA9IHA7CisJc3Jjc1sxXSA9IGRxOworCWluaXRfYXN5bmNfc3VibWl0KHN1Ym1pdCwgZmxhZ3MgfCBBU1lOQ19UWF9YT1JfRFJPUF9EU1QsIHR4LCBjYl9mbiwKKwkJCSAgY2JfcGFyYW0sIHNjcmliYmxlKTsKKwl0eCA9IGFzeW5jX3hvcihwLCBzcmNzLCAwLCAyLCBieXRlcywgc3VibWl0KTsKKworCXJldHVybiB0eDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3JhaWQ2X2RhdGFwX3JlY292KTsKKworTU9EVUxFX0FVVEhPUigiRGFuIFdpbGxpYW1zIDxkYW4uai53aWxsaWFtc0BpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImFzeW5jaHJvbm91cyBSQUlELTYgcmVjb3ZlcnkgYXBpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfdHguYyBiL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCmluZGV4IDA2ZWI2Y2MuLmY5Y2RmMDQgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCisrKyBiL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCkBAIC00MiwxNiArNDIsMjEgQEAKIAlhc3luY19kbWFlbmdpbmVfcHV0KCk7CiB9CiAKK21vZHVsZV9pbml0KGFzeW5jX3R4X2luaXQpOworbW9kdWxlX2V4aXQoYXN5bmNfdHhfZXhpdCk7CisKIC8qKgogICogX19hc3luY190eF9maW5kX2NoYW5uZWwgLSBmaW5kIGEgY2hhbm5lbCB0byBjYXJyeSBvdXQgdGhlIG9wZXJhdGlvbiBvciBsZXQKICAqCXRoZSB0cmFuc2FjdGlvbiBleGVjdXRlIHN5bmNocm9ub3VzbHkKLSAqIEBkZXBlbmRfdHg6IHRyYW5zYWN0aW9uIGRlcGVuZGVuY3kKKyAqIEBzdWJtaXQ6IHRyYW5zYWN0aW9uIGRlcGVuZGVuY3kgYW5kIHN1Ym1pc3Npb24gbW9kaWZpZXJzCiAgKiBAdHhfdHlwZTogdHJhbnNhY3Rpb24gdHlwZQogICovCiBzdHJ1Y3QgZG1hX2NoYW4gKgotX19hc3luY190eF9maW5kX2NoYW5uZWwoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXBlbmRfdHgsCi0JZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSB0eF90eXBlKQorX19hc3luY190eF9maW5kX2NoYW5uZWwoc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCwKKwkJCWVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgdHhfdHlwZSkKIHsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCA9IHN1Ym1pdC0+ZGVwZW5kX3R4OworCiAJLyogc2VlIGlmIHdlIGNhbiBrZWVwIHRoZSBjaGFpbiBvbiBvbmUgY2hhbm5lbCAqLwogCWlmIChkZXBlbmRfdHggJiYKIAkgICAgZG1hX2hhc19jYXAodHhfdHlwZSwgZGVwZW5kX3R4LT5jaGFuLT5kZXZpY2UtPmNhcF9tYXNrKSkKQEAgLTU5LDE3ICs2NCw2IEBACiAJcmV0dXJuIGFzeW5jX2RtYV9maW5kX2NoYW5uZWwodHhfdHlwZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2FzeW5jX3R4X2ZpbmRfY2hhbm5lbCk7Ci0jZWxzZQotc3RhdGljIGludCBfX2luaXQgYXN5bmNfdHhfaW5pdCh2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gImFzeW5jX3R4OiBhcGkgaW5pdGlhbGl6ZWQgKHN5bmMtb25seSlcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXN5bmNfdHhfZXhpdCh2b2lkKQotewotCWRvIHsgfSB3aGlsZSAoMCk7Ci19CiAjZW5kaWYKIAogCkBAIC04MywxMCArNzcsMTQgQEAKIGFzeW5jX3R4X2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwZW5kX3R4LAogCQkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKIHsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47Ci0Jc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBkZXBlbmRfdHgtPmNoYW47CisJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZSA9IGNoYW4tPmRldmljZTsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmludHJfdHggPSAodm9pZCAqKSB+MDsKIAorCSNpZmRlZiBDT05GSUdfQVNZTkNfVFhfRElTQUJMRV9DSEFOTkVMX1NXSVRDSAorCUJVRygpOworCSNlbmRpZgorCiAJLyogZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBzdGlsbCBhcHBlbmQgdG8gZGVwZW5kX3R4ICovCiAJc3Bpbl9sb2NrX2JoKCZkZXBlbmRfdHgtPmxvY2spOwogCWlmIChkZXBlbmRfdHgtPnBhcmVudCAmJiBkZXBlbmRfdHgtPmNoYW4gPT0gdHgtPmNoYW4pIHsKQEAgLTk2LDExICs5NCwxMSBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmZGVwZW5kX3R4LT5sb2NrKTsKIAotCWlmICghaW50cl90eCkKKwkvKiBhdHRhY2hlZCBkZXBlbmRlbmN5LCBmbHVzaCB0aGUgcGFyZW50IGNoYW5uZWwgKi8KKwlpZiAoIWludHJfdHgpIHsKKwkJZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyhjaGFuKTsKIAkJcmV0dXJuOwotCi0JY2hhbiA9IGRlcGVuZF90eC0+Y2hhbjsKLQlkZXZpY2UgPSBjaGFuLT5kZXZpY2U7CisJfQogCiAJLyogc2VlIGlmIHdlIGNhbiBzY2hlZHVsZSBhbiBpbnRlcnJ1cHQKIAkgKiBvdGhlcndpc2UgcG9sbCBmb3IgY29tcGxldGlvbgpAQCAtMTM0LDYgKzEzMiw3IEBACiAJCQlpbnRyX3R4LT50eF9zdWJtaXQoaW50cl90eCk7CiAJCQlhc3luY190eF9hY2soaW50cl90eCk7CiAJCX0KKwkJZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyhjaGFuKTsKIAl9IGVsc2UgewogCQlpZiAoZG1hX3dhaXRfZm9yX2FzeW5jX3R4KGRlcGVuZF90eCkgPT0gRE1BX0VSUk9SKQogCQkJcGFuaWMoIiVzOiBETUFfRVJST1Igd2FpdGluZyBmb3IgZGVwZW5kX3R4XG4iLApAQCAtMTQ0LDEzICsxNDMsMTQgQEAKIAogCiAvKioKLSAqIHN1Ym1pdF9kaXNwb3NpdGlvbiAtIHdoaWxlIGhvbGRpbmcgZGVwZW5kX3R4LT5sb2NrIHdlIG11c3QgYXZvaWQgc3VibWl0dGluZwotICogCW5ldyBvcGVyYXRpb25zIHRvIHByZXZlbnQgYSBjaXJjdWxhciBsb2NraW5nIGRlcGVuZGVuY3kgd2l0aAotICogCWRyaXZlcnMgdGhhdCBhbHJlYWR5IGhvbGQgYSBjaGFubmVsIGxvY2sgd2hlbiBjYWxsaW5nCi0gKiAJYXN5bmNfdHhfcnVuX2RlcGVuZGVuY2llcy4KKyAqIHN1Ym1pdF9kaXNwb3NpdGlvbiAtIGZsYWdzIGZvciByb3V0aW5nIGFuIGluY29taW5nIG9wZXJhdGlvbgogICogQEFTWU5DX1RYX1NVQk1JVFRFRDogd2Ugd2VyZSBhYmxlIHRvIGFwcGVuZCB0aGUgbmV3IG9wZXJhdGlvbiB1bmRlciB0aGUgbG9jawogICogQEFTWU5DX1RYX0NIQU5ORUxfU1dJVENIOiB3aGVuIHRoZSBsb2NrIGlzIGRyb3BwZWQgc2NoZWR1bGUgYSBjaGFubmVsIHN3aXRjaAogICogQEFTWU5DX1RYX0RJUkVDVF9TVUJNSVQ6IHdoZW4gdGhlIGxvY2sgaXMgZHJvcHBlZCBzdWJtaXQgZGlyZWN0bHkKKyAqCisgKiB3aGlsZSBob2xkaW5nIGRlcGVuZF90eC0+bG9jayB3ZSBtdXN0IGF2b2lkIHN1Ym1pdHRpbmcgbmV3IG9wZXJhdGlvbnMKKyAqIHRvIHByZXZlbnQgYSBjaXJjdWxhciBsb2NraW5nIGRlcGVuZGVuY3kgd2l0aCBkcml2ZXJzIHRoYXQgYWxyZWFkeQorICogaG9sZCBhIGNoYW5uZWwgbG9jayB3aGVuIGNhbGxpbmcgYXN5bmNfdHhfcnVuX2RlcGVuZGVuY2llcy4KICAqLwogZW51bSBzdWJtaXRfZGlzcG9zaXRpb24gewogCUFTWU5DX1RYX1NVQk1JVFRFRCwKQEAgLTE2MCwxMSArMTYwLDEyIEBACiAKIHZvaWQKIGFzeW5jX3R4X3N1Ym1pdChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgsCi0JZW51bSBhc3luY190eF9mbGFncyBmbGFncywgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXBlbmRfdHgsCi0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNiX2ZuLCB2b2lkICpjYl9wYXJhbSkKKwkJc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCkKIHsKLQl0eC0+Y2FsbGJhY2sgPSBjYl9mbjsKLQl0eC0+Y2FsbGJhY2tfcGFyYW0gPSBjYl9wYXJhbTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCA9IHN1Ym1pdC0+ZGVwZW5kX3R4OworCisJdHgtPmNhbGxiYWNrID0gc3VibWl0LT5jYl9mbjsKKwl0eC0+Y2FsbGJhY2tfcGFyYW0gPSBzdWJtaXQtPmNiX3BhcmFtOwogCiAJaWYgKGRlcGVuZF90eCkgewogCQllbnVtIHN1Ym1pdF9kaXNwb3NpdGlvbiBzOwpAQCAtMjIwLDMwICsyMjEsMjkgQEAKIAkJdHgtPnR4X3N1Ym1pdCh0eCk7CiAJfQogCi0JaWYgKGZsYWdzICYgQVNZTkNfVFhfQUNLKQorCWlmIChzdWJtaXQtPmZsYWdzICYgQVNZTkNfVFhfQUNLKQogCQlhc3luY190eF9hY2sodHgpOwogCi0JaWYgKGRlcGVuZF90eCAmJiAoZmxhZ3MgJiBBU1lOQ19UWF9ERVBfQUNLKSkKKwlpZiAoZGVwZW5kX3R4KQogCQlhc3luY190eF9hY2soZGVwZW5kX3R4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3R4X3N1Ym1pdCk7CiAKIC8qKgotICogYXN5bmNfdHJpZ2dlcl9jYWxsYmFjayAtIHNjaGVkdWxlcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgcnVuIGFmdGVyCi0gKiBhbnkgZGVwZW5kZW50IG9wZXJhdGlvbnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KLSAqIEBmbGFnczogQVNZTkNfVFhfQUNLLCBBU1lOQ19UWF9ERVBfQUNLCi0gKiBAZGVwZW5kX3R4OiAnY2FsbGJhY2snIHJlcXVpcmVzIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgdHJhbnNhY3Rpb24KLSAqIEBjYl9mbjogZnVuY3Rpb24gdG8gY2FsbCBhZnRlciBkZXBlbmRfdHggY29tcGxldGVzCi0gKiBAY2JfcGFyYW06IHBhcmFtZXRlciB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lCisgKiBhc3luY190cmlnZ2VyX2NhbGxiYWNrIC0gc2NoZWR1bGVzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBydW4KKyAqIEBzdWJtaXQ6IHN1Ym1pc3Npb24gYW5kIGNvbXBsZXRpb24gcGFyYW1ldGVycworICoKKyAqIGhvbm9yZWQgZmxhZ3M6IEFTWU5DX1RYX0FDSworICoKKyAqIFRoZSBjYWxsYmFjayBpcyBydW4gYWZ0ZXIgYW55IGRlcGVuZGVudCBvcGVyYXRpb25zIGhhdmUgY29tcGxldGVkLgogICovCiBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgotYXN5bmNfdHJpZ2dlcl9jYWxsYmFjayhlbnVtIGFzeW5jX3R4X2ZsYWdzIGZsYWdzLAotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwZW5kX3R4LAotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiwgdm9pZCAqY2JfcGFyYW0pCithc3luY190cmlnZ2VyX2NhbGxiYWNrKHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCiB7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuOwogCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCA9IHN1Ym1pdC0+ZGVwZW5kX3R4OwogCiAJaWYgKGRlcGVuZF90eCkgewogCQljaGFuID0gZGVwZW5kX3R4LT5jaGFuOwpAQCAtMjYyLDE0ICsyNjIsMTQgQEAKIAlpZiAodHgpIHsKIAkJcHJfZGVidWcoIiVzOiAoYXN5bmMpXG4iLCBfX2Z1bmNfXyk7CiAKLQkJYXN5bmNfdHhfc3VibWl0KGNoYW4sIHR4LCBmbGFncywgZGVwZW5kX3R4LCBjYl9mbiwgY2JfcGFyYW0pOworCQlhc3luY190eF9zdWJtaXQoY2hhbiwgdHgsIHN1Ym1pdCk7CiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoIiVzOiAoc3luYylcbiIsIF9fZnVuY19fKTsKIAogCQkvKiB3YWl0IGZvciBhbnkgcHJlcmVxdWlzaXRlIG9wZXJhdGlvbnMgKi8KLQkJYXN5bmNfdHhfcXVpZXNjZSgmZGVwZW5kX3R4KTsKKwkJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOwogCi0JCWFzeW5jX3R4X3N5bmNfZXBpbG9nKGNiX2ZuLCBjYl9wYXJhbSk7CisJCWFzeW5jX3R4X3N5bmNfZXBpbG9nKHN1Ym1pdCk7CiAJfQogCiAJcmV0dXJuIHR4OwpAQCAtMjk1LDkgKzI5NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhc3luY190eF9xdWllc2NlKTsKIAotbW9kdWxlX2luaXQoYXN5bmNfdHhfaW5pdCk7Ci1tb2R1bGVfZXhpdChhc3luY190eF9leGl0KTsKLQogTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQXN5bmNocm9ub3VzIEJ1bGsgTWVtb3J5IFRyYW5zYWN0aW9ucyBBUEkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9hc3luY190eC9hc3luY194b3IuYyBiL2NyeXB0by9hc3luY190eC9hc3luY194b3IuYwppbmRleCA5MGRkM2Y4Li43OTE4MmRjIDEwMDY0NAotLS0gYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfeG9yLmMKKysrIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3hvci5jCkBAIC0zMyw1NSArMzMsNTcgQEAKIC8qIGRvX2FzeW5jX3hvciAtIGRtYSBtYXAgdGhlIHBhZ2VzIGFuZCBwZXJmb3JtIHRoZSB4b3Igd2l0aCBhbiBlbmdpbmUgKi8KIHN0YXRpYyBfX2FzeW5jX2lubGluZSBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgogZG9fYXN5bmNfeG9yKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgc3RydWN0IHBhZ2UgKmRlc3QsIHN0cnVjdCBwYWdlICoqc3JjX2xpc3QsCi0JICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwKLQkgICAgIGVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3MsCi0JICAgICBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKLQkgICAgIGRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiwgdm9pZCAqY2JfcGFyYW0pCisJICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgZG1hX2FkZHJfdCAqZG1hX3NyYywKKwkgICAgIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCiB7CiAJc3RydWN0IGRtYV9kZXZpY2UgKmRtYSA9IGNoYW4tPmRldmljZTsKLQlkbWFfYWRkcl90ICpkbWFfc3JjID0gKGRtYV9hZGRyX3QgKikgc3JjX2xpc3Q7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9IE5VTEw7CiAJaW50IHNyY19vZmYgPSAwOwogCWludCBpOwotCWRtYV9hc3luY190eF9jYWxsYmFjayBfY2JfZm47Ci0Jdm9pZCAqX2NiX3BhcmFtOwotCWVudW0gYXN5bmNfdHhfZmxhZ3MgYXN5bmNfZmxhZ3M7CisJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNiX2ZuX29yaWcgPSBzdWJtaXQtPmNiX2ZuOworCXZvaWQgKmNiX3BhcmFtX29yaWcgPSBzdWJtaXQtPmNiX3BhcmFtOworCWVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3Nfb3JpZyA9IHN1Ym1pdC0+ZmxhZ3M7CiAJZW51bSBkbWFfY3RybF9mbGFncyBkbWFfZmxhZ3M7Ci0JaW50IHhvcl9zcmNfY250OworCWludCB4b3Jfc3JjX2NudCA9IDA7CiAJZG1hX2FkZHJfdCBkbWFfZGVzdDsKIAogCS8qIG1hcCB0aGUgZGVzdCBiaWRyZWN0aW9uYWwgaW4gY2FzZSBpdCBpcyByZS11c2VkIGFzIGEgc291cmNlICovCiAJZG1hX2Rlc3QgPSBkbWFfbWFwX3BhZ2UoZG1hLT5kZXYsIGRlc3QsIG9mZnNldCwgbGVuLCBETUFfQklESVJFQ1RJT05BTCk7CiAJZm9yIChpID0gMDsgaSA8IHNyY19jbnQ7IGkrKykgewogCQkvKiBvbmx5IG1hcCB0aGUgZGVzdCBvbmNlICovCisJCWlmICghc3JjX2xpc3RbaV0pCisJCQljb250aW51ZTsKIAkJaWYgKHVubGlrZWx5KHNyY19saXN0W2ldID09IGRlc3QpKSB7Ci0JCQlkbWFfc3JjW2ldID0gZG1hX2Rlc3Q7CisJCQlkbWFfc3JjW3hvcl9zcmNfY250KytdID0gZG1hX2Rlc3Q7CiAJCQljb250aW51ZTsKIAkJfQotCQlkbWFfc3JjW2ldID0gZG1hX21hcF9wYWdlKGRtYS0+ZGV2LCBzcmNfbGlzdFtpXSwgb2Zmc2V0LAotCQkJCQkgIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJCWRtYV9zcmNbeG9yX3NyY19jbnQrK10gPSBkbWFfbWFwX3BhZ2UoZG1hLT5kZXYsIHNyY19saXN0W2ldLCBvZmZzZXQsCisJCQkJCQkgICAgICBsZW4sIERNQV9UT19ERVZJQ0UpOwogCX0KKwlzcmNfY250ID0geG9yX3NyY19jbnQ7CiAKIAl3aGlsZSAoc3JjX2NudCkgewotCQlhc3luY19mbGFncyA9IGZsYWdzOworCQlzdWJtaXQtPmZsYWdzID0gZmxhZ3Nfb3JpZzsKIAkJZG1hX2ZsYWdzID0gMDsKLQkJeG9yX3NyY19jbnQgPSBtaW4oc3JjX2NudCwgZG1hLT5tYXhfeG9yKTsKKwkJeG9yX3NyY19jbnQgPSBtaW4oc3JjX2NudCwgKGludClkbWEtPm1heF94b3IpOwogCQkvKiBpZiB3ZSBhcmUgc3VibWl0dGluZyBhZGRpdGlvbmFsIHhvcnMsIGxlYXZlIHRoZSBjaGFpbiBvcGVuLAogCQkgKiBjbGVhciB0aGUgY2FsbGJhY2sgcGFyYW1ldGVycywgYW5kIGxlYXZlIHRoZSBkZXN0aW5hdGlvbgogCQkgKiBidWZmZXIgbWFwcGVkCiAJCSAqLwogCQlpZiAoc3JjX2NudCA+IHhvcl9zcmNfY250KSB7Ci0JCQlhc3luY19mbGFncyAmPSB+QVNZTkNfVFhfQUNLOworCQkJc3VibWl0LT5mbGFncyAmPSB+QVNZTkNfVFhfQUNLOworCQkJc3VibWl0LT5mbGFncyB8PSBBU1lOQ19UWF9GRU5DRTsKIAkJCWRtYV9mbGFncyA9IERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVA7Ci0JCQlfY2JfZm4gPSBOVUxMOwotCQkJX2NiX3BhcmFtID0gTlVMTDsKKwkJCXN1Ym1pdC0+Y2JfZm4gPSBOVUxMOworCQkJc3VibWl0LT5jYl9wYXJhbSA9IE5VTEw7CiAJCX0gZWxzZSB7Ci0JCQlfY2JfZm4gPSBjYl9mbjsKLQkJCV9jYl9wYXJhbSA9IGNiX3BhcmFtOworCQkJc3VibWl0LT5jYl9mbiA9IGNiX2ZuX29yaWc7CisJCQlzdWJtaXQtPmNiX3BhcmFtID0gY2JfcGFyYW1fb3JpZzsKIAkJfQotCQlpZiAoX2NiX2ZuKQorCQlpZiAoc3VibWl0LT5jYl9mbikKIAkJCWRtYV9mbGFncyB8PSBETUFfUFJFUF9JTlRFUlJVUFQ7Ci0KKwkJaWYgKHN1Ym1pdC0+ZmxhZ3MgJiBBU1lOQ19UWF9GRU5DRSkKKwkJCWRtYV9mbGFncyB8PSBETUFfUFJFUF9GRU5DRTsKIAkJLyogU2luY2Ugd2UgaGF2ZSBjbG9iYmVyZWQgdGhlIHNyY19saXN0IHdlIGFyZSBjb21taXR0ZWQKIAkJICogdG8gZG9pbmcgdGhpcyBhc3luY2hyb25vdXNseS4gIERyaXZlcnMgZm9yY2UgZm9yd2FyZCBwcm9ncmVzcwogCQkgKiBpbiBjYXNlIHRoZXkgY2FuIG5vdCBwcm92aWRlIGEgZGVzY3JpcHRvcgpAQCAtOTAsNyArOTIsNyBAQAogCQkJCQkgICAgICB4b3Jfc3JjX2NudCwgbGVuLCBkbWFfZmxhZ3MpOwogCiAJCWlmICh1bmxpa2VseSghdHgpKQotCQkJYXN5bmNfdHhfcXVpZXNjZSgmZGVwZW5kX3R4KTsKKwkJCWFzeW5jX3R4X3F1aWVzY2UoJnN1Ym1pdC0+ZGVwZW5kX3R4KTsKIAogCQkvKiBzcGluIHdhaXQgZm9yIHRoZSBwcmVjZWVkaW5nIHRyYW5zYWN0aW9ucyB0byBjb21wbGV0ZSAqLwogCQl3aGlsZSAodW5saWtlbHkoIXR4KSkgewpAQCAtMTAxLDExICsxMDMsOCBAQAogCQkJCQkJICAgICAgZG1hX2ZsYWdzKTsKIAkJfQogCi0JCWFzeW5jX3R4X3N1Ym1pdChjaGFuLCB0eCwgYXN5bmNfZmxhZ3MsIGRlcGVuZF90eCwgX2NiX2ZuLAotCQkJCV9jYl9wYXJhbSk7Ci0KLQkJZGVwZW5kX3R4ID0gdHg7Ci0JCWZsYWdzIHw9IEFTWU5DX1RYX0RFUF9BQ0s7CisJCWFzeW5jX3R4X3N1Ym1pdChjaGFuLCB0eCwgc3VibWl0KTsKKwkJc3VibWl0LT5kZXBlbmRfdHggPSB0eDsKIAogCQlpZiAoc3JjX2NudCA+IHhvcl9zcmNfY250KSB7CiAJCQkvKiBkcm9wIGNvbXBsZXRlZCBzb3VyY2VzICovCkBAIC0xMjQsMjMgKzEyMywyOCBAQAogCiBzdGF0aWMgdm9pZAogZG9fc3luY194b3Ioc3RydWN0IHBhZ2UgKmRlc3QsIHN0cnVjdCBwYWdlICoqc3JjX2xpc3QsIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JICAgIGludCBzcmNfY250LCBzaXplX3QgbGVuLCBlbnVtIGFzeW5jX3R4X2ZsYWdzIGZsYWdzLAotCSAgICBkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm4sIHZvaWQgKmNiX3BhcmFtKQorCSAgICBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCkKIHsKIAlpbnQgaTsKLQlpbnQgeG9yX3NyY19jbnQ7CisJaW50IHhvcl9zcmNfY250ID0gMDsKIAlpbnQgc3JjX29mZiA9IDA7CiAJdm9pZCAqZGVzdF9idWY7Ci0Jdm9pZCAqKnNyY3MgPSAodm9pZCAqKikgc3JjX2xpc3Q7CisJdm9pZCAqKnNyY3M7CiAKLQkvKiByZXVzZSB0aGUgJ3NyY19saXN0JyBhcnJheSB0byBjb252ZXJ0IHRvIGJ1ZmZlciBwb2ludGVycyAqLworCWlmIChzdWJtaXQtPnNjcmliYmxlKQorCQlzcmNzID0gc3VibWl0LT5zY3JpYmJsZTsKKwllbHNlCisJCXNyY3MgPSAodm9pZCAqKikgc3JjX2xpc3Q7CisKKwkvKiBjb252ZXJ0IHRvIGJ1ZmZlciBwb2ludGVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBzcmNfY250OyBpKyspCi0JCXNyY3NbaV0gPSBwYWdlX2FkZHJlc3Moc3JjX2xpc3RbaV0pICsgb2Zmc2V0OwotCisJCWlmIChzcmNfbGlzdFtpXSkKKwkJCXNyY3NbeG9yX3NyY19jbnQrK10gPSBwYWdlX2FkZHJlc3Moc3JjX2xpc3RbaV0pICsgb2Zmc2V0OworCXNyY19jbnQgPSB4b3Jfc3JjX2NudDsKIAkvKiBzZXQgZGVzdGluYXRpb24gYWRkcmVzcyAqLwogCWRlc3RfYnVmID0gcGFnZV9hZGRyZXNzKGRlc3QpICsgb2Zmc2V0OwogCi0JaWYgKGZsYWdzICYgQVNZTkNfVFhfWE9SX1pFUk9fRFNUKQorCWlmIChzdWJtaXQtPmZsYWdzICYgQVNZTkNfVFhfWE9SX1pFUk9fRFNUKQogCQltZW1zZXQoZGVzdF9idWYsIDAsIGxlbik7CiAKIAl3aGlsZSAoc3JjX2NudCA+IDApIHsKQEAgLTE1Myw2MSArMTU3LDcwIEBACiAJCXNyY19vZmYgKz0geG9yX3NyY19jbnQ7CiAJfQogCi0JYXN5bmNfdHhfc3luY19lcGlsb2coY2JfZm4sIGNiX3BhcmFtKTsKKwlhc3luY190eF9zeW5jX2VwaWxvZyhzdWJtaXQpOwogfQogCiAvKioKICAqIGFzeW5jX3hvciAtIGF0dGVtcHQgdG8geG9yIGEgc2V0IG9mIGJsb2NrcyB3aXRoIGEgZG1hIGVuZ2luZS4KLSAqCXhvcl9ibG9ja3MgYWx3YXlzIHVzZXMgdGhlIGRlc3QgYXMgYSBzb3VyY2Ugc28gdGhlIEFTWU5DX1RYX1hPUl9aRVJPX0RTVAotICoJZmxhZyBtdXN0IGJlIHNldCB0byBub3QgaW5jbHVkZSBkZXN0IGRhdGEgaW4gdGhlIGNhbGN1bGF0aW9uLiAgVGhlCi0gKglhc3N1bXB0aW9uIHdpdGggZG1hIGVuaW5nZXMgaXMgdGhhdCB0aGV5IG9ubHkgdXNlIHRoZSBkZXN0aW5hdGlvbgotICoJYnVmZmVyIGFzIGEgc291cmNlIHdoZW4gaXQgaXMgZXhwbGljaXR5IHNwZWNpZmllZCBpbiB0aGUgc291cmNlIGxpc3QuCiAgKiBAZGVzdDogZGVzdGluYXRpb24gcGFnZQotICogQHNyY19saXN0OiBhcnJheSBvZiBzb3VyY2UgcGFnZXMgKGlmIHRoZSBkZXN0IGlzIGFsc28gYSBzb3VyY2UgaXQgbXVzdCBiZQotICoJYXQgaW5kZXggemVybykuICBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBtYXkgYmUgb3ZlcndyaXR0ZW4uCi0gKiBAb2Zmc2V0OiBvZmZzZXQgaW4gcGFnZXMgdG8gc3RhcnQgdHJhbnNhY3Rpb24KKyAqIEBzcmNfbGlzdDogYXJyYXkgb2Ygc291cmNlIHBhZ2VzCisgKiBAb2Zmc2V0OiBjb21tb24gc3JjL2RzdCBvZmZzZXQgdG8gc3RhcnQgdHJhbnNhY3Rpb24KICAqIEBzcmNfY250OiBudW1iZXIgb2Ygc291cmNlIHBhZ2VzCiAgKiBAbGVuOiBsZW5ndGggaW4gYnl0ZXMKLSAqIEBmbGFnczogQVNZTkNfVFhfWE9SX1pFUk9fRFNULCBBU1lOQ19UWF9YT1JfRFJPUF9ERVNULAotICoJQVNZTkNfVFhfQUNLLCBBU1lOQ19UWF9ERVBfQUNLCi0gKiBAZGVwZW5kX3R4OiB4b3IgZGVwZW5kcyBvbiB0aGUgcmVzdWx0IG9mIHRoaXMgdHJhbnNhY3Rpb24uCi0gKiBAY2JfZm46IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgeG9yIGNvbXBsZXRlcwotICogQGNiX3BhcmFtOiBwYXJhbWV0ZXIgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgcm91dGluZQorICogQHN1Ym1pdDogc3VibWlzc2lvbiAvIGNvbXBsZXRpb24gbW9kaWZpZXJzCisgKgorICogaG9ub3JlZCBmbGFnczogQVNZTkNfVFhfQUNLLCBBU1lOQ19UWF9YT1JfWkVST19EU1QsIEFTWU5DX1RYX1hPUl9EUk9QX0RTVAorICoKKyAqIHhvcl9ibG9ja3MgYWx3YXlzIHVzZXMgdGhlIGRlc3QgYXMgYSBzb3VyY2Ugc28gdGhlCisgKiBBU1lOQ19UWF9YT1JfWkVST19EU1QgZmxhZyBtdXN0IGJlIHNldCB0byBub3QgaW5jbHVkZSBkZXN0IGRhdGEgaW4KKyAqIHRoZSBjYWxjdWxhdGlvbi4gIFRoZSBhc3N1bXB0aW9uIHdpdGggZG1hIGVuaW5nZXMgaXMgdGhhdCB0aGV5IG9ubHkKKyAqIHVzZSB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGFzIGEgc291cmNlIHdoZW4gaXQgaXMgZXhwbGljaXR5IHNwZWNpZmllZAorICogaW4gdGhlIHNvdXJjZSBsaXN0LgorICoKKyAqIHNyY19saXN0IG5vdGU6IGlmIHRoZSBkZXN0IGlzIGFsc28gYSBzb3VyY2UgaXQgbXVzdCBiZSBhdCBpbmRleCB6ZXJvLgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBvdmVyd3JpdHRlbiBpZiBhIHNjcmliYmxlIHJlZ2lvbgorICogaXMgbm90IHNwZWNpZmllZC4KICAqLwogc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKIGFzeW5jX3hvcihzdHJ1Y3QgcGFnZSAqZGVzdCwgc3RydWN0IHBhZ2UgKipzcmNfbGlzdCwgdW5zaWduZWQgaW50IG9mZnNldCwKLQlpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgZW51bSBhc3luY190eF9mbGFncyBmbGFncywKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm4sIHZvaWQgKmNiX3BhcmFtKQorCSAgaW50IHNyY19jbnQsIHNpemVfdCBsZW4sIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpCiB7Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuID0gYXN5bmNfdHhfZmluZF9jaGFubmVsKGRlcGVuZF90eCwgRE1BX1hPUiwKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBhc3luY190eF9maW5kX2NoYW5uZWwoc3VibWl0LCBETUFfWE9SLAogCQkJCQkJICAgICAgJmRlc3QsIDEsIHNyY19saXN0LAogCQkJCQkJICAgICAgc3JjX2NudCwgbGVuKTsKKwlkbWFfYWRkcl90ICpkbWFfc3JjID0gTlVMTDsKKwogCUJVR19PTihzcmNfY250IDw9IDEpOwogCi0JaWYgKGNoYW4pIHsKKwlpZiAoc3VibWl0LT5zY3JpYmJsZSkKKwkJZG1hX3NyYyA9IHN1Ym1pdC0+c2NyaWJibGU7CisJZWxzZSBpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpIDw9IHNpemVvZihzdHJ1Y3QgcGFnZSAqKSkKKwkJZG1hX3NyYyA9IChkbWFfYWRkcl90ICopIHNyY19saXN0OworCisJaWYgKGRtYV9zcmMgJiYgY2hhbiAmJiBpc19kbWFfeG9yX2FsaWduZWQoY2hhbi0+ZGV2aWNlLCBvZmZzZXQsIDAsIGxlbikpIHsKIAkJLyogcnVuIHRoZSB4b3IgYXN5bmNocm9ub3VzbHkgKi8KIAkJcHJfZGVidWcoIiVzIChhc3luYyk6IGxlbjogJXp1XG4iLCBfX2Z1bmNfXywgbGVuKTsKIAogCQlyZXR1cm4gZG9fYXN5bmNfeG9yKGNoYW4sIGRlc3QsIHNyY19saXN0LCBvZmZzZXQsIHNyY19jbnQsIGxlbiwKLQkJCQkgICAgZmxhZ3MsIGRlcGVuZF90eCwgY2JfZm4sIGNiX3BhcmFtKTsKKwkJCQkgICAgZG1hX3NyYywgc3VibWl0KTsKIAl9IGVsc2UgewogCQkvKiBydW4gdGhlIHhvciBzeW5jaHJvbm91c2x5ICovCiAJCXByX2RlYnVnKCIlcyAoc3luYyk6IGxlbjogJXp1XG4iLCBfX2Z1bmNfXywgbGVuKTsKKwkJV0FSTl9PTkNFKGNoYW4sICIlczogbm8gc3BhY2UgZm9yIGRtYSBhZGRyZXNzIGNvbnZlcnNpb25cbiIsCisJCQkgIF9fZnVuY19fKTsKIAogCQkvKiBpbiB0aGUgc3luYyBjYXNlIHRoZSBkZXN0IGlzIGFuIGltcGxpZWQgc291cmNlCiAJCSAqIChhc3N1bWVzIHRoZSBkZXN0IGlzIHRoZSBmaXJzdCBzb3VyY2UpCiAJCSAqLwotCQlpZiAoZmxhZ3MgJiBBU1lOQ19UWF9YT1JfRFJPUF9EU1QpIHsKKwkJaWYgKHN1Ym1pdC0+ZmxhZ3MgJiBBU1lOQ19UWF9YT1JfRFJPUF9EU1QpIHsKIAkJCXNyY19jbnQtLTsKIAkJCXNyY19saXN0Kys7CiAJCX0KIAogCQkvKiB3YWl0IGZvciBhbnkgcHJlcmVxdWlzaXRlIG9wZXJhdGlvbnMgKi8KLQkJYXN5bmNfdHhfcXVpZXNjZSgmZGVwZW5kX3R4KTsKKwkJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOwogCi0JCWRvX3N5bmNfeG9yKGRlc3QsIHNyY19saXN0LCBvZmZzZXQsIHNyY19jbnQsIGxlbiwKLQkJCSAgICBmbGFncywgY2JfZm4sIGNiX3BhcmFtKTsKKwkJZG9fc3luY194b3IoZGVzdCwgc3JjX2xpc3QsIG9mZnNldCwgc3JjX2NudCwgbGVuLCBzdWJtaXQpOwogCiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTIyMiwxMDQgKzIzNSw5NCBAQAogfQogCiAvKioKLSAqIGFzeW5jX3hvcl96ZXJvX3N1bSAtIGF0dGVtcHQgYSB4b3IgcGFyaXR5IGNoZWNrIHdpdGggYSBkbWEgZW5naW5lLgorICogYXN5bmNfeG9yX3ZhbCAtIGF0dGVtcHQgYSB4b3IgcGFyaXR5IGNoZWNrIHdpdGggYSBkbWEgZW5naW5lLgogICogQGRlc3Q6IGRlc3RpbmF0aW9uIHBhZ2UgdXNlZCBpZiB0aGUgeG9yIGlzIHBlcmZvcm1lZCBzeW5jaHJvbm91c2x5Ci0gKiBAc3JjX2xpc3Q6IGFycmF5IG9mIHNvdXJjZSBwYWdlcy4gIFRoZSBkZXN0IHBhZ2UgbXVzdCBiZSBsaXN0ZWQgYXMgYSBzb3VyY2UKLSAqIAlhdCBpbmRleCB6ZXJvLiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgbWF5IGJlIG92ZXJ3cml0dGVuLgorICogQHNyY19saXN0OiBhcnJheSBvZiBzb3VyY2UgcGFnZXMKICAqIEBvZmZzZXQ6IG9mZnNldCBpbiBwYWdlcyB0byBzdGFydCB0cmFuc2FjdGlvbgogICogQHNyY19jbnQ6IG51bWJlciBvZiBzb3VyY2UgcGFnZXMKICAqIEBsZW46IGxlbmd0aCBpbiBieXRlcwogICogQHJlc3VsdDogMCBpZiBzdW0gPT0gMCBlbHNlIG5vbi16ZXJvCi0gKiBAZmxhZ3M6IEFTWU5DX1RYX0FDSywgQVNZTkNfVFhfREVQX0FDSwotICogQGRlcGVuZF90eDogeG9yIGRlcGVuZHMgb24gdGhlIHJlc3VsdCBvZiB0aGlzIHRyYW5zYWN0aW9uLgotICogQGNiX2ZuOiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHhvciBjb21wbGV0ZXMKLSAqIEBjYl9wYXJhbTogcGFyYW1ldGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmUKKyAqIEBzdWJtaXQ6IHN1Ym1pc3Npb24gLyBjb21wbGV0aW9uIG1vZGlmaWVycworICoKKyAqIGhvbm9yZWQgZmxhZ3M6IEFTWU5DX1RYX0FDSworICoKKyAqIHNyY19saXN0IG5vdGU6IGlmIHRoZSBkZXN0IGlzIGFsc28gYSBzb3VyY2UgaXQgbXVzdCBiZSBhdCBpbmRleCB6ZXJvLgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBvdmVyd3JpdHRlbiBpZiBhIHNjcmliYmxlIHJlZ2lvbgorICogaXMgbm90IHNwZWNpZmllZC4KICAqLwogc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKLWFzeW5jX3hvcl96ZXJvX3N1bShzdHJ1Y3QgcGFnZSAqZGVzdCwgc3RydWN0IHBhZ2UgKipzcmNfbGlzdCwKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwKLQl1MzIgKnJlc3VsdCwgZW51bSBhc3luY190eF9mbGFncyBmbGFncywKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm4sIHZvaWQgKmNiX3BhcmFtKQorYXN5bmNfeG9yX3ZhbChzdHJ1Y3QgcGFnZSAqZGVzdCwgc3RydWN0IHBhZ2UgKipzcmNfbGlzdCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkgICAgICBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgZW51bSBzdW1fY2hlY2tfZmxhZ3MgKnJlc3VsdCwKKwkgICAgICBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KQogewotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGFzeW5jX3R4X2ZpbmRfY2hhbm5lbChkZXBlbmRfdHgsIERNQV9aRVJPX1NVTSwKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBhc3luY190eF9maW5kX2NoYW5uZWwoc3VibWl0LCBETUFfWE9SX1ZBTCwKIAkJCQkJCSAgICAgICZkZXN0LCAxLCBzcmNfbGlzdCwKIAkJCQkJCSAgICAgIHNyY19jbnQsIGxlbik7CiAJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZSA9IGNoYW4gPyBjaGFuLT5kZXZpY2UgOiBOVUxMOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHggPSBOVUxMOworCWRtYV9hZGRyX3QgKmRtYV9zcmMgPSBOVUxMOwogCiAJQlVHX09OKHNyY19jbnQgPD0gMSk7CiAKLQlpZiAoZGV2aWNlICYmIHNyY19jbnQgPD0gZGV2aWNlLT5tYXhfeG9yKSB7Ci0JCWRtYV9hZGRyX3QgKmRtYV9zcmMgPSAoZG1hX2FkZHJfdCAqKSBzcmNfbGlzdDsKLQkJdW5zaWduZWQgbG9uZyBkbWFfcHJlcF9mbGFncyA9IGNiX2ZuID8gRE1BX1BSRVBfSU5URVJSVVBUIDogMDsKKwlpZiAoc3VibWl0LT5zY3JpYmJsZSkKKwkJZG1hX3NyYyA9IHN1Ym1pdC0+c2NyaWJibGU7CisJZWxzZSBpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpIDw9IHNpemVvZihzdHJ1Y3QgcGFnZSAqKSkKKwkJZG1hX3NyYyA9IChkbWFfYWRkcl90ICopIHNyY19saXN0OworCisJaWYgKGRtYV9zcmMgJiYgZGV2aWNlICYmIHNyY19jbnQgPD0gZGV2aWNlLT5tYXhfeG9yICYmCisJICAgIGlzX2RtYV94b3JfYWxpZ25lZChkZXZpY2UsIG9mZnNldCwgMCwgbGVuKSkgeworCQl1bnNpZ25lZCBsb25nIGRtYV9wcmVwX2ZsYWdzID0gMDsKIAkJaW50IGk7CiAKIAkJcHJfZGVidWcoIiVzOiAoYXN5bmMpIGxlbjogJXp1XG4iLCBfX2Z1bmNfXywgbGVuKTsKIAorCQlpZiAoc3VibWl0LT5jYl9mbikKKwkJCWRtYV9wcmVwX2ZsYWdzIHw9IERNQV9QUkVQX0lOVEVSUlVQVDsKKwkJaWYgKHN1Ym1pdC0+ZmxhZ3MgJiBBU1lOQ19UWF9GRU5DRSkKKwkJCWRtYV9wcmVwX2ZsYWdzIHw9IERNQV9QUkVQX0ZFTkNFOwogCQlmb3IgKGkgPSAwOyBpIDwgc3JjX2NudDsgaSsrKQogCQkJZG1hX3NyY1tpXSA9IGRtYV9tYXBfcGFnZShkZXZpY2UtPmRldiwgc3JjX2xpc3RbaV0sCiAJCQkJCQkgIG9mZnNldCwgbGVuLCBETUFfVE9fREVWSUNFKTsKIAotCQl0eCA9IGRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX3plcm9fc3VtKGNoYW4sIGRtYV9zcmMsIHNyY19jbnQsCi0JCQkJCQkgICAgICBsZW4sIHJlc3VsdCwKLQkJCQkJCSAgICAgIGRtYV9wcmVwX2ZsYWdzKTsKKwkJdHggPSBkZXZpY2UtPmRldmljZV9wcmVwX2RtYV94b3JfdmFsKGNoYW4sIGRtYV9zcmMsIHNyY19jbnQsCisJCQkJCQkgICAgIGxlbiwgcmVzdWx0LAorCQkJCQkJICAgICBkbWFfcHJlcF9mbGFncyk7CiAJCWlmICh1bmxpa2VseSghdHgpKSB7Ci0JCQlhc3luY190eF9xdWllc2NlKCZkZXBlbmRfdHgpOworCQkJYXN5bmNfdHhfcXVpZXNjZSgmc3VibWl0LT5kZXBlbmRfdHgpOwogCiAJCQl3aGlsZSAoIXR4KSB7CiAJCQkJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoY2hhbik7Ci0JCQkJdHggPSBkZXZpY2UtPmRldmljZV9wcmVwX2RtYV96ZXJvX3N1bShjaGFuLAorCQkJCXR4ID0gZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfeG9yX3ZhbChjaGFuLAogCQkJCQlkbWFfc3JjLCBzcmNfY250LCBsZW4sIHJlc3VsdCwKIAkJCQkJZG1hX3ByZXBfZmxhZ3MpOwogCQkJfQogCQl9CiAKLQkJYXN5bmNfdHhfc3VibWl0KGNoYW4sIHR4LCBmbGFncywgZGVwZW5kX3R4LCBjYl9mbiwgY2JfcGFyYW0pOworCQlhc3luY190eF9zdWJtaXQoY2hhbiwgdHgsIHN1Ym1pdCk7CiAJfSBlbHNlIHsKLQkJdW5zaWduZWQgbG9uZyB4b3JfZmxhZ3MgPSBmbGFnczsKKwkJZW51bSBhc3luY190eF9mbGFncyBmbGFnc19vcmlnID0gc3VibWl0LT5mbGFnczsKIAogCQlwcl9kZWJ1ZygiJXM6IChzeW5jKSBsZW46ICV6dVxuIiwgX19mdW5jX18sIGxlbik7CisJCVdBUk5fT05DRShkZXZpY2UgJiYgc3JjX2NudCA8PSBkZXZpY2UtPm1heF94b3IsCisJCQkgICIlczogbm8gc3BhY2UgZm9yIGRtYSBhZGRyZXNzIGNvbnZlcnNpb25cbiIsCisJCQkgIF9fZnVuY19fKTsKIAotCQl4b3JfZmxhZ3MgfD0gQVNZTkNfVFhfWE9SX0RST1BfRFNUOwotCQl4b3JfZmxhZ3MgJj0gfkFTWU5DX1RYX0FDSzsKKwkJc3VibWl0LT5mbGFncyB8PSBBU1lOQ19UWF9YT1JfRFJPUF9EU1Q7CisJCXN1Ym1pdC0+ZmxhZ3MgJj0gfkFTWU5DX1RYX0FDSzsKIAotCQl0eCA9IGFzeW5jX3hvcihkZXN0LCBzcmNfbGlzdCwgb2Zmc2V0LCBzcmNfY250LCBsZW4sIHhvcl9mbGFncywKLQkJCWRlcGVuZF90eCwgTlVMTCwgTlVMTCk7CisJCXR4ID0gYXN5bmNfeG9yKGRlc3QsIHNyY19saXN0LCBvZmZzZXQsIHNyY19jbnQsIGxlbiwgc3VibWl0KTsKIAogCQlhc3luY190eF9xdWllc2NlKCZ0eCk7CiAKLQkJKnJlc3VsdCA9IHBhZ2VfaXNfemVybyhkZXN0LCBvZmZzZXQsIGxlbikgPyAwIDogMTsKKwkJKnJlc3VsdCA9ICFwYWdlX2lzX3plcm8oZGVzdCwgb2Zmc2V0LCBsZW4pIDw8IFNVTV9DSEVDS19QOwogCi0JCWFzeW5jX3R4X3N5bmNfZXBpbG9nKGNiX2ZuLCBjYl9wYXJhbSk7CisJCWFzeW5jX3R4X3N5bmNfZXBpbG9nKHN1Ym1pdCk7CisJCXN1Ym1pdC0+ZmxhZ3MgPSBmbGFnc19vcmlnOwogCX0KIAogCXJldHVybiB0eDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3hvcl96ZXJvX3N1bSk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFzeW5jX3hvcl9pbml0KHZvaWQpCi17Ci0JI2lmZGVmIENPTkZJR19BU1lOQ19UWF9ETUEKLQkvKiBUbyBjb25zZXJ2ZSBzdGFjayBzcGFjZSB0aGUgaW5wdXQgc3JjX2xpc3QgKGFycmF5IG9mIHBhZ2UgcG9pbnRlcnMpCi0JICogaXMgcmV1c2VkIHRvIGhvbGQgdGhlIGFycmF5IG9mIGRtYSBhZGRyZXNzZXMgcGFzc2VkIHRvIHRoZSBkcml2ZXIuCi0JICogVGhpcyBjb252ZXJzaW9uIGlzIG9ubHkgcG9zc2libGUgd2hlbiBkbWFfYWRkcl90IGlzIGxlc3MgdGhhbiB0aGUKLQkgKiB0aGUgc2l6ZSBvZiBhIHBvaW50ZXIuICBISUdITUVNNjRHIGlzIGtub3duIHRvIHZpb2xhdGUgdGhpcwotCSAqIGFzc3VtcHRpb24uCi0JICovCi0JQlVJTERfQlVHX09OKHNpemVvZihkbWFfYWRkcl90KSA+IHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7Ci0JI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFzeW5jX3hvcl9leGl0KHZvaWQpCi17Ci0JZG8geyB9IHdoaWxlICgwKTsKLX0KLQotbW9kdWxlX2luaXQoYXN5bmNfeG9yX2luaXQpOwotbW9kdWxlX2V4aXQoYXN5bmNfeG9yX2V4aXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfeG9yX3ZhbCk7CiAKIE1PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImFzeW5jaHJvbm91cyB4b3IveG9yLXplcm8tc3VtIGFwaSIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzeW5jX3R4L3JhaWQ2dGVzdC5jIGIvY3J5cHRvL2FzeW5jX3R4L3JhaWQ2dGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzI3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYXN5bmNfdHgvcmFpZDZ0ZXN0LmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBhc3luY2hyb25vdXMgcmFpZDYgcmVjb3Zlcnkgc2VsZiB0ZXN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIGJhc2VkIG9uIGRyaXZlcnMvbWQvcmFpZDZ0ZXN0L3Rlc3QuYzoKKyAqIAlDb3B5cmlnaHQgMjAwMi0yMDA3IEguIFBldGVyIEFudmluCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9hc3luY190eC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorCisjdW5kZWYgcHIKKyNkZWZpbmUgcHIoZm10LCBhcmdzLi4uKSBwcl9pbmZvKCJyYWlkNnRlc3Q6ICIgZm10LCAjI2FyZ3MpCisKKyNkZWZpbmUgTkRJU0tTIDE2IC8qIEluY2x1ZGluZyBQIGFuZCBRICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqZGF0YXB0cnNbTkRJU0tTXTsKK3N0YXRpYyBhZGRyX2NvbnZfdCBhZGRyX2NvbnZbTkRJU0tTXTsKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqZGF0YVtORElTS1MrM107CitzdGF0aWMgc3RydWN0IHBhZ2UgKnNwYXJlOworc3RhdGljIHN0cnVjdCBwYWdlICpyZWNvdmk7CitzdGF0aWMgc3RydWN0IHBhZ2UgKnJlY292ajsKKworc3RhdGljIHZvaWQgY2FsbGJhY2sodm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGNvbXBsZXRpb24gKmNtcCA9IHBhcmFtOworCisJY29tcGxldGUoY21wKTsKK30KKworc3RhdGljIHZvaWQgbWFrZWRhdGEoaW50IGRpc2tzKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGRpc2tzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRS9zaXplb2YodTMyKTsgaiArPSBzaXplb2YodTMyKSkgeworCQkJdTMyICpwID0gcGFnZV9hZGRyZXNzKGRhdGFbaV0pICsgajsKKworCQkJKnAgPSByYW5kb20zMigpOworCQl9CisKKwkJZGF0YXB0cnNbaV0gPSBkYXRhW2ldOworCX0KK30KKworc3RhdGljIGNoYXIgZGlza190eXBlKGludCBkLCBpbnQgZGlza3MpCit7CisJaWYgKGQgPT0gZGlza3MgLSAyKQorCQlyZXR1cm4gJ1AnOworCWVsc2UgaWYgKGQgPT0gZGlza3MgLSAxKQorCQlyZXR1cm4gJ1EnOworCWVsc2UKKwkJcmV0dXJuICdEJzsKK30KKworLyogUmVjb3ZlciB0d28gZmFpbGVkIGJsb2Nrcy4gKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X2R1YWxfcmVjb3YoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwgaW50IGZhaWxiLCBzdHJ1Y3QgcGFnZSAqKnB0cnMpCit7CisJc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgc3VibWl0OworCXN0cnVjdCBjb21wbGV0aW9uIGNtcDsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ID0gTlVMTDsKKwllbnVtIHN1bV9jaGVja19mbGFncyByZXN1bHQgPSB+MDsKKworCWlmIChmYWlsYSA+IGZhaWxiKQorCQlzd2FwKGZhaWxhLCBmYWlsYik7CisKKwlpZiAoZmFpbGIgPT0gZGlza3MtMSkgeworCQlpZiAoZmFpbGEgPT0gZGlza3MtMikgeworCQkJLyogUCtRIGZhaWx1cmUuICBKdXN0IHJlYnVpbGQgdGhlIHN5bmRyb21lLiAqLworCQkJaW5pdF9hc3luY19zdWJtaXQoJnN1Ym1pdCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgYWRkcl9jb252KTsKKwkJCXR4ID0gYXN5bmNfZ2VuX3N5bmRyb21lKHB0cnMsIDAsIGRpc2tzLCBieXRlcywgJnN1Ym1pdCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgcGFnZSAqYmxvY2tzW2Rpc2tzXTsKKwkJCXN0cnVjdCBwYWdlICpkZXN0OworCQkJaW50IGNvdW50ID0gMDsKKwkJCWludCBpOworCisJCQkvKiBkYXRhK1EgZmFpbHVyZS4gIFJlY29uc3RydWN0IGRhdGEgZnJvbSBQLAorCQkJICogdGhlbiByZWJ1aWxkIHN5bmRyb21lCisJCQkgKi8KKwkJCWZvciAoaSA9IGRpc2tzOyBpLS0gOyApIHsKKwkJCQlpZiAoaSA9PSBmYWlsYSB8fCBpID09IGZhaWxiKQorCQkJCQljb250aW51ZTsKKwkJCQlibG9ja3NbY291bnQrK10gPSBwdHJzW2ldOworCQkJfQorCQkJZGVzdCA9IHB0cnNbZmFpbGFdOworCQkJaW5pdF9hc3luY19zdWJtaXQoJnN1Ym1pdCwgQVNZTkNfVFhfWE9SX1pFUk9fRFNULCBOVUxMLAorCQkJCQkgIE5VTEwsIE5VTEwsIGFkZHJfY29udik7CisJCQl0eCA9IGFzeW5jX3hvcihkZXN0LCBibG9ja3MsIDAsIGNvdW50LCBieXRlcywgJnN1Ym1pdCk7CisKKwkJCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIDAsIHR4LCBOVUxMLCBOVUxMLCBhZGRyX2NvbnYpOworCQkJdHggPSBhc3luY19nZW5fc3luZHJvbWUocHRycywgMCwgZGlza3MsIGJ5dGVzLCAmc3VibWl0KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChmYWlsYiA9PSBkaXNrcy0yKSB7CisJCQkvKiBkYXRhK1AgZmFpbHVyZS4gKi8KKwkJCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIGFkZHJfY29udik7CisJCQl0eCA9IGFzeW5jX3JhaWQ2X2RhdGFwX3JlY292KGRpc2tzLCBieXRlcywgZmFpbGEsIHB0cnMsICZzdWJtaXQpOworCQl9IGVsc2UgeworCQkJLyogZGF0YStkYXRhIGZhaWx1cmUuICovCisJCQlpbml0X2FzeW5jX3N1Ym1pdCgmc3VibWl0LCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBhZGRyX2NvbnYpOworCQkJdHggPSBhc3luY19yYWlkNl8yZGF0YV9yZWNvdihkaXNrcywgYnl0ZXMsIGZhaWxhLCBmYWlsYiwgcHRycywgJnN1Ym1pdCk7CisJCX0KKwl9CisJaW5pdF9jb21wbGV0aW9uKCZjbXApOworCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIEFTWU5DX1RYX0FDSywgdHgsIGNhbGxiYWNrLCAmY21wLCBhZGRyX2NvbnYpOworCXR4ID0gYXN5bmNfc3luZHJvbWVfdmFsKHB0cnMsIDAsIGRpc2tzLCBieXRlcywgJnJlc3VsdCwgc3BhcmUsICZzdWJtaXQpOworCWFzeW5jX3R4X2lzc3VlX3BlbmRpbmcodHgpOworCisJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY21wLCBtc2Vjc190b19qaWZmaWVzKDMwMDApKSA9PSAwKQorCQlwcigiJXM6IHRpbWVvdXQhIChmYWlsYTogJWQgZmFpbGI6ICVkIGRpc2tzOiAlZClcbiIsCisJCSAgIF9fZnVuY19fLCBmYWlsYSwgZmFpbGIsIGRpc2tzKTsKKworCWlmIChyZXN1bHQgIT0gMCkKKwkJcHIoIiVzOiB2YWxpZGF0aW9uIGZhaWx1cmUhIGZhaWxhOiAlZCBmYWlsYjogJWQgc3VtX2NoZWNrX2ZsYWdzOiAleFxuIiwKKwkJICAgX19mdW5jX18sIGZhaWxhLCBmYWlsYiwgcmVzdWx0KTsKK30KKworc3RhdGljIGludCB0ZXN0X2Rpc2tzKGludCBpLCBpbnQgaiwgaW50IGRpc2tzKQoreworCWludCBlcnJhLCBlcnJiOworCisJbWVtc2V0KHBhZ2VfYWRkcmVzcyhyZWNvdmkpLCAweGYwLCBQQUdFX1NJWkUpOworCW1lbXNldChwYWdlX2FkZHJlc3MocmVjb3ZqKSwgMHhiYSwgUEFHRV9TSVpFKTsKKworCWRhdGFwdHJzW2ldID0gcmVjb3ZpOworCWRhdGFwdHJzW2pdID0gcmVjb3ZqOworCisJcmFpZDZfZHVhbF9yZWNvdihkaXNrcywgUEFHRV9TSVpFLCBpLCBqLCBkYXRhcHRycyk7CisKKwllcnJhID0gbWVtY21wKHBhZ2VfYWRkcmVzcyhkYXRhW2ldKSwgcGFnZV9hZGRyZXNzKHJlY292aSksIFBBR0VfU0laRSk7CisJZXJyYiA9IG1lbWNtcChwYWdlX2FkZHJlc3MoZGF0YVtqXSksIHBhZ2VfYWRkcmVzcyhyZWNvdmopLCBQQUdFX1NJWkUpOworCisJcHIoIiVzKCVkLCAlZCk6IGZhaWxhPSUzZCglYykgIGZhaWxiPSUzZCglYykgICVzXG4iLAorCSAgIF9fZnVuY19fLCBpLCBqLCBpLCBkaXNrX3R5cGUoaSwgZGlza3MpLCBqLCBkaXNrX3R5cGUoaiwgZGlza3MpLAorCSAgICghZXJyYSAmJiAhZXJyYikgPyAiT0siIDogIWVycmEgPyAiRVJSQiIgOiAhZXJyYiA/ICJFUlJBIiA6ICJFUlJBQiIpOworCisJZGF0YXB0cnNbaV0gPSBkYXRhW2ldOworCWRhdGFwdHJzW2pdID0gZGF0YVtqXTsKKworCXJldHVybiBlcnJhIHx8IGVycmI7Cit9CisKK3N0YXRpYyBpbnQgdGVzdChpbnQgZGlza3MsIGludCAqdGVzdHMpCit7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKwlzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCBzdWJtaXQ7CisJc3RydWN0IGNvbXBsZXRpb24gY21wOworCWludCBlcnIgPSAwOworCWludCBpLCBqOworCisJcmVjb3ZpID0gZGF0YVtkaXNrc107CisJcmVjb3ZqID0gZGF0YVtkaXNrcysxXTsKKwlzcGFyZSAgPSBkYXRhW2Rpc2tzKzJdOworCisJbWFrZWRhdGEoZGlza3MpOworCisJLyogTnVrZSBzeW5kcm9tZXMgKi8KKwltZW1zZXQocGFnZV9hZGRyZXNzKGRhdGFbZGlza3MtMl0pLCAweGVlLCBQQUdFX1NJWkUpOworCW1lbXNldChwYWdlX2FkZHJlc3MoZGF0YVtkaXNrcy0xXSksIDB4ZWUsIFBBR0VfU0laRSk7CisKKwkvKiBHZW5lcmF0ZSBhc3N1bWVkIGdvb2Qgc3luZHJvbWUgKi8KKwlpbml0X2NvbXBsZXRpb24oJmNtcCk7CisJaW5pdF9hc3luY19zdWJtaXQoJnN1Ym1pdCwgQVNZTkNfVFhfQUNLLCBOVUxMLCBjYWxsYmFjaywgJmNtcCwgYWRkcl9jb252KTsKKwl0eCA9IGFzeW5jX2dlbl9zeW5kcm9tZShkYXRhcHRycywgMCwgZGlza3MsIFBBR0VfU0laRSwgJnN1Ym1pdCk7CisJYXN5bmNfdHhfaXNzdWVfcGVuZGluZyh0eCk7CisKKwlpZiAod2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjbXAsIG1zZWNzX3RvX2ppZmZpZXMoMzAwMCkpID09IDApIHsKKwkJcHIoImVycm9yOiBpbml0aWFsIGdlbl9zeW5kcm9tZSglZCkgdGltZWQgb3V0XG4iLCBkaXNrcyk7CisJCXJldHVybiAxOworCX0KKworCXByKCJ0ZXN0aW5nIHRoZSAlZC1kaXNrIGNhc2UuLi5cbiIsIGRpc2tzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlza3MtMTsgaSsrKQorCQlmb3IgKGogPSBpKzE7IGogPCBkaXNrczsgaisrKSB7CisJCQkoKnRlc3RzKSsrOworCQkJZXJyICs9IHRlc3RfZGlza3MoaSwgaiwgZGlza3MpOworCQl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgcmFpZDZfdGVzdCh2b2lkKQoreworCWludCBlcnIgPSAwOworCWludCB0ZXN0cyA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTkRJU0tTKzM7IGkrKykgeworCQlkYXRhW2ldID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFkYXRhW2ldKSB7CisJCQl3aGlsZSAoaS0tKQorCQkJCXB1dF9wYWdlKGRhdGFbaV0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwkvKiB0aGUgNC1kaXNrIGFuZCA1LWRpc2sgY2FzZXMgYXJlIHNwZWNpYWwgZm9yIHRoZSByZWNvdmVyeSBjb2RlICovCisJaWYgKE5ESVNLUyA+IDQpCisJCWVyciArPSB0ZXN0KDQsICZ0ZXN0cyk7CisJaWYgKE5ESVNLUyA+IDUpCisJCWVyciArPSB0ZXN0KDUsICZ0ZXN0cyk7CisJZXJyICs9IHRlc3QoTkRJU0tTLCAmdGVzdHMpOworCisJcHIoIlxuIik7CisJcHIoImNvbXBsZXRlICglZCB0ZXN0cywgJWQgZmFpbHVyZSVzKVxuIiwKKwkgICB0ZXN0cywgZXJyLCBlcnIgPT0gMSA/ICIiIDogInMiKTsKKworCWZvciAoaSA9IDA7IGkgPCBORElTS1MrMzsgaSsrKQorCQlwdXRfcGFnZShkYXRhW2ldKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByYWlkNl90ZXN0X2V4aXQodm9pZCkKK3sKK30KKworLyogd2hlbiBjb21waWxlZC1pbiB3YWl0IGZvciBkcml2ZXJzIHRvIGxvYWQgZmlyc3QgKGFzc3VtZXMgZG1hIGRyaXZlcnMKKyAqIGFyZSBhbHNvIGNvbXBsaWxlZC1pbikKKyAqLworbGF0ZV9pbml0Y2FsbChyYWlkNl90ZXN0KTsKK21vZHVsZV9leGl0KHJhaWQ2X3Rlc3RfZXhpdCk7CitNT0RVTEVfQVVUSE9SKCJEYW4gV2lsbGlhbXMgPGRhbi5qLndpbGxpYW1zQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiYXN5bmNocm9ub3VzIFJBSUQtNiByZWNvdmVyeSBzZWxmIHRlc3RzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCmluZGV4IGRkODcyOWQuLjkzZDJjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCkBAIC0yMTEsNiArMjExLDE4IEBACiAJc2VsZWN0IEFDUElfQ09OVEFJTkVSCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SCisJdHJpc3RhdGUgIlByb2Nlc3NvciBBZ2dyZWdhdG9yIgorCWRlcGVuZHMgb24gQUNQSV9QUk9DRVNTT1IKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gWDg2CisJaGVscAorCSAgQUNQSSA0LjAgZGVmaW5lcyBwcm9jZXNzb3IgQWdncmVnYXRvciwgd2hpY2ggZW5hYmxlcyBPUyB0byBwZXJmb3JtCisJICBzcGVjaWZpYyBwcm9jZXNzb3IgY29uZmlndXJhdGlvbiBhbmQgY29udHJvbCB0aGF0IGFwcGxpZXMgdG8gYWxsCisJICBwcm9jZXNzb3JzIGluIHRoZSBwbGF0Zm9ybS4gQ3VycmVudGx5IG9ubHkgbG9naWNhbCBwcm9jZXNzb3IgaWRsaW5nCisJICBpcyBkZWZpbmVkLCB3aGljaCBpcyB0byByZWR1Y2UgcG93ZXIgY29uc3VtcHRpb24uIFRoaXMgZHJpdmVyCisJICBzdXBwb3J0cyB0aGUgbmV3IGRldmljZS4KKwogY29uZmlnIEFDUElfVEhFUk1BTAogCXRyaXN0YXRlICJUaGVybWFsIFpvbmUiCiAJZGVwZW5kcyBvbiBBQ1BJX1BST0NFU1NPUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCmluZGV4IDgyY2Q0OWQuLjc3MDIxMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKQEAgLTYyLDMgKzYyLDUgQEAKIHByb2Nlc3Nvci15CQkJOj0gcHJvY2Vzc29yX2NvcmUubyBwcm9jZXNzb3JfdGhyb3R0bGluZy5vCiBwcm9jZXNzb3IteQkJCSs9IHByb2Nlc3Nvcl9pZGxlLm8gcHJvY2Vzc29yX3RoZXJtYWwubwogcHJvY2Vzc29yLSQoQ09ORklHX0NQVV9GUkVRKQkrPSBwcm9jZXNzb3JfcGVyZmxpYi5vCisKK29iai0kKENPTkZJR19BQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SKSArPSBhY3BpX3BhZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWMuYyBiL2RyaXZlcnMvYWNwaS9hYy5jCmluZGV4IDk4Yjk2OTAuLmI2ZWQ2MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hYy5jCkBAIC0yNDUsNiArMjQ1LDcgQEAKIAkJYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudChkZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCiAJCQkJCQkgIGRldl9uYW1lKCZkZXZpY2UtPmRldiksIGV2ZW50LAogCQkJCQkJICAodTMyKSBhYy0+c3RhdGUpOworCQlhY3BpX25vdGlmaWVyX2NhbGxfY2hhaW4oZGV2aWNlLCBldmVudCwgKHUzMikgYWMtPnN0YXRlKTsKICNpZmRlZiBDT05GSUdfQUNQSV9TWVNGU19QT1dFUgogCQlrb2JqZWN0X3VldmVudCgmYWMtPmNoYXJnZXIuZGV2LT5rb2JqLCBLT0JKX0NIQU5HRSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX3BhZC5jIGIvZHJpdmVycy9hY3BpL2FjcGlfcGFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyY2RiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX3BhZC5jCkBAIC0wLDAgKzEsNTE0IEBACisvKgorICogYWNwaV9wYWQuYyBBQ1BJIFByb2Nlc3NvciBBZ2dyZWdhdG9yIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKworI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SX0NMQVNTCSJwcm9jZXNzb3JfYWdncmVnYXRvciIKKyNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQUdHUkVHQVRPUl9ERVZJQ0VfTkFNRSAiUHJvY2Vzc29yIEFnZ3JlZ2F0b3IiCisjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0FHR1JFR0FUT1JfTk9USUZZIDB4ODAKK3N0YXRpYyBERUZJTkVfTVVURVgoaXNvbGF0ZWRfY3B1c19sb2NrKTsKKworI2RlZmluZSBNV0FJVF9TVUJTVEFURV9NQVNLCSgweGYpCisjZGVmaW5lIE1XQUlUX0NTVEFURV9NQVNLCSgweGYpCisjZGVmaW5lIE1XQUlUX1NVQlNUQVRFX1NJWkUJKDQpCisjZGVmaW5lIENQVUlEX01XQUlUX0xFQUYgKDUpCisjZGVmaW5lIENQVUlENV9FQ1hfRVhURU5TSU9OU19TVVBQT1JURUQgKDB4MSkKKyNkZWZpbmUgQ1BVSUQ1X0VDWF9JTlRFUlJVUFRfQlJFQUsJKDB4MikKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VyX3NhdmluZ19td2FpdF9lYXg7CitzdGF0aWMgdm9pZCBwb3dlcl9zYXZpbmdfbXdhaXRfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBlYXgsIGVieCwgZWN4LCBlZHg7CisJdW5zaWduZWQgaW50IGhpZ2hlc3RfY3N0YXRlID0gMDsKKwl1bnNpZ25lZCBpbnQgaGlnaGVzdF9zdWJjc3RhdGUgPSAwOworCWludCBpOworCisJaWYgKCFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTVdBSVQpKQorCQlyZXR1cm47CisJaWYgKGJvb3RfY3B1X2RhdGEuY3B1aWRfbGV2ZWwgPCBDUFVJRF9NV0FJVF9MRUFGKQorCQlyZXR1cm47CisKKwljcHVpZChDUFVJRF9NV0FJVF9MRUFGLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworCWlmICghKGVjeCAmIENQVUlENV9FQ1hfRVhURU5TSU9OU19TVVBQT1JURUQpIHx8CisJICAgICEoZWN4ICYgQ1BVSUQ1X0VDWF9JTlRFUlJVUFRfQlJFQUspKQorCQlyZXR1cm47CisKKwllZHggPj49IE1XQUlUX1NVQlNUQVRFX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IDcgJiYgZWR4OyBpKyssIGVkeCA+Pj0gTVdBSVRfU1VCU1RBVEVfU0laRSkgeworCQlpZiAoZWR4ICYgTVdBSVRfU1VCU1RBVEVfTUFTSykgeworCQkJaGlnaGVzdF9jc3RhdGUgPSBpOworCQkJaGlnaGVzdF9zdWJjc3RhdGUgPSBlZHggJiBNV0FJVF9TVUJTVEFURV9NQVNLOworCQl9CisJfQorCXBvd2VyX3NhdmluZ19td2FpdF9lYXggPSAoaGlnaGVzdF9jc3RhdGUgPDwgTVdBSVRfU1VCU1RBVEVfU0laRSkgfAorCQkoaGlnaGVzdF9zdWJjc3RhdGUgLSAxKTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKKwkJY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OLCAmaSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19HRU5FUklDX1RJTUUpICYmIGRlZmluZWQoQ09ORklHX1g4NikKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQkvKgorCQkgKiBBTUQgRmFtMTBoIFRTQyB3aWxsIHRpY2sgaW4gYWxsCisJCSAqIEMvUC9TMC9TMSBzdGF0ZXMgd2hlbiB0aGlzIGJpdCBpcyBzZXQuCisJCSAqLworCQlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX05PTlNUT1BfVFNDKSkKKwkJCXJldHVybjsKKworCQkvKkZBTEwgVEhST1VHSCovCisJZGVmYXVsdDoKKwkJLyogVFNDIGNvdWxkIGhhbHQgaW4gaWRsZSwgc28gbm90aWZ5IHVzZXJzICovCisJCW1hcmtfdHNjX3Vuc3RhYmxlKCJUU0MgaGFsdHMgaW4gaWRsZSIpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfd2VpZ2h0W05SX0NQVVNdOworc3RhdGljIGludCB0c2tfaW5fY3B1W05SX0NQVVNdID0ge1swIC4uLiBOUl9DUFVTLTFdID0gLTF9Oworc3RhdGljIERFQ0xBUkVfQklUTUFQKHBhZF9idXN5X2NwdXNfYml0cywgTlJfQ1BVUyk7CitzdGF0aWMgdm9pZCByb3VuZF9yb2Jpbl9jcHUodW5zaWduZWQgaW50IHRza19pbmRleCkKK3sKKwlzdHJ1Y3QgY3B1bWFzayAqcGFkX2J1c3lfY3B1cyA9IHRvX2NwdW1hc2socGFkX2J1c3lfY3B1c19iaXRzKTsKKwljcHVtYXNrX3Zhcl90IHRtcDsKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgbWluX3dlaWdodCA9IC0xLCBwcmVmZXJyZWRfY3B1OworCisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmdG1wLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmaXNvbGF0ZWRfY3B1c19sb2NrKTsKKwljcHVtYXNrX2NsZWFyKHRtcCk7CisJZm9yX2VhY2hfY3B1KGNwdSwgcGFkX2J1c3lfY3B1cykKKwkJY3B1bWFza19vcih0bXAsIHRtcCwgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soY3B1KSk7CisJY3B1bWFza19hbmRub3QodG1wLCBjcHVfb25saW5lX21hc2ssIHRtcCk7CisJLyogYXZvaWQgSFQgc2liaWxpbmdzIGlmIHBvc3NpYmxlICovCisJaWYgKGNwdW1hc2tfZW1wdHkodG1wKSkKKwkJY3B1bWFza19hbmRub3QodG1wLCBjcHVfb25saW5lX21hc2ssIHBhZF9idXN5X2NwdXMpOworCWlmIChjcHVtYXNrX2VtcHR5KHRtcCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpc29sYXRlZF9jcHVzX2xvY2spOworCQlyZXR1cm47CisJfQorCWZvcl9lYWNoX2NwdShjcHUsIHRtcCkgeworCQlpZiAoY3B1X3dlaWdodFtjcHVdIDwgbWluX3dlaWdodCkgeworCQkJbWluX3dlaWdodCA9IGNwdV93ZWlnaHRbY3B1XTsKKwkJCXByZWZlcnJlZF9jcHUgPSBjcHU7CisJCX0KKwl9CisKKwlpZiAodHNrX2luX2NwdVt0c2tfaW5kZXhdICE9IC0xKQorCQljcHVtYXNrX2NsZWFyX2NwdSh0c2tfaW5fY3B1W3Rza19pbmRleF0sIHBhZF9idXN5X2NwdXMpOworCXRza19pbl9jcHVbdHNrX2luZGV4XSA9IHByZWZlcnJlZF9jcHU7CisJY3B1bWFza19zZXRfY3B1KHByZWZlcnJlZF9jcHUsIHBhZF9idXN5X2NwdXMpOworCWNwdV93ZWlnaHRbcHJlZmVycmVkX2NwdV0rKzsKKwltdXRleF91bmxvY2soJmlzb2xhdGVkX2NwdXNfbG9jayk7CisKKwlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKHByZWZlcnJlZF9jcHUpKTsKK30KKworc3RhdGljIHZvaWQgZXhpdF9yb3VuZF9yb2Jpbih1bnNpZ25lZCBpbnQgdHNrX2luZGV4KQoreworCXN0cnVjdCBjcHVtYXNrICpwYWRfYnVzeV9jcHVzID0gdG9fY3B1bWFzayhwYWRfYnVzeV9jcHVzX2JpdHMpOworCWNwdW1hc2tfY2xlYXJfY3B1KHRza19pbl9jcHVbdHNrX2luZGV4XSwgcGFkX2J1c3lfY3B1cyk7CisJdHNrX2luX2NwdVt0c2tfaW5kZXhdID0gLTE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWRsZV9wY3QgPSA1OyAvKiBwZXJjZW50YWdlICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJvdW5kX3JvYmluX3RpbWUgPSAxMDsgLyogc2Vjb25kICovCitzdGF0aWMgaW50IHBvd2VyX3NhdmluZ190aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7LnNjaGVkX3ByaW9yaXR5ID0gMX07CisJaW50IGRvX3NsZWVwOworCXVuc2lnbmVkIGludCB0c2tfaW5kZXggPSAodW5zaWduZWQgbG9uZylkYXRhOworCXU2NCBsYXN0X2ppZmZpZXMgPSAwOworCisJc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX1JSLCAmcGFyYW0pOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJaW50IGNwdTsKKwkJdTY0IGV4cGlyZV90aW1lOworCisJCXRyeV90b19mcmVlemUoKTsKKworCQkvKiByb3VuZCByb2JpbiB0byBjcHVzICovCisJCWlmIChsYXN0X2ppZmZpZXMgKyByb3VuZF9yb2Jpbl90aW1lICogSFogPCBqaWZmaWVzKSB7CisJCQlsYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCQkJcm91bmRfcm9iaW5fY3B1KHRza19pbmRleCk7CisJCX0KKworCQlkb19zbGVlcCA9IDA7CisKKwkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJj0gflRTX1BPTExJTkc7CisJCS8qCisJCSAqIFRTX1BPTExJTkctY2xlYXJlZCBzdGF0ZSBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHdlIHRlc3QKKwkJICogTkVFRF9SRVNDSEVEOgorCQkgKi8KKwkJc21wX21iKCk7CisKKwkJZXhwaXJlX3RpbWUgPSBqaWZmaWVzICsgSFogKiAoMTAwIC0gaWRsZV9wY3QpIC8gMTAwOworCisJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsCisJCQkJJmNwdSk7CisJCQlzdG9wX2NyaXRpY2FsX3RpbWluZ3MoKTsKKworCQkJX19tb25pdG9yKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIDAsIDApOworCQkJc21wX21iKCk7CisJCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJCV9fbXdhaXQocG93ZXJfc2F2aW5nX213YWl0X2VheCwgMSk7CisKKwkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKKwkJCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULAorCQkJCSZjcHUpOworCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJCQlpZiAoamlmZmllcyA+IGV4cGlyZV90aW1lKSB7CisJCQkJZG9fc2xlZXAgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfUE9MTElORzsKKworCQkvKgorCQkgKiBjdXJyZW50IHNjaGVkX3J0IGhhcyB0aHJlc2hvbGQgZm9yIHJ0IHRhc2sgcnVubmluZyB0aW1lLgorCQkgKiBXaGVuIGEgcnQgdGFzayB1c2VzIDk1JSBDUFUgdGltZSwgdGhlIHJ0IHRocmVhZCB3aWxsIGJlCisJCSAqIHNjaGVkdWxlZCBvdXQgZm9yIDUlIENQVSB0aW1lIHRvIG5vdCBzdGFydmUgb3RoZXIgdGFza3MuIEJ1dAorCQkgKiB0aGUgbWVjaGFuaXNtIG9ubHkgd29ya3Mgd2hlbiBhbGwgQ1BVcyBoYXZlIFJUIHRhc2sgcnVubmluZywKKwkJICogYXMgaWYgb25lIENQVSBoYXNuJ3QgUlQgdGFzaywgUlQgdGFzayBmcm9tIG90aGVyIENQVXMgd2lsbAorCQkgKiBib3Jyb3cgQ1BVIHRpbWUgZnJvbSB0aGlzIENQVSBhbmQgY2F1c2UgUlQgdGFzayB1c2UgPiA5NSUKKwkJICogQ1BVIHRpbWUuIFRvIG1ha2UgJ2F2b2lkIHN0YXJhdGlvbicgd29yaywgdGFrZXMgYSBuYXAgaGVyZS4KKwkJICovCisJCWlmIChkb19zbGVlcCkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfa2lsbGFibGUoSFogKiBpZGxlX3BjdCAvIDEwMCk7CisJfQorCisJZXhpdF9yb3VuZF9yb2Jpbih0c2tfaW5kZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwc190c2tzW05SX0NQVVNdOworc3RhdGljIHVuc2lnbmVkIGludCBwc190c2tfbnVtOworc3RhdGljIGludCBjcmVhdGVfcG93ZXJfc2F2aW5nX3Rhc2sodm9pZCkKK3sKKwlwc190c2tzW3BzX3Rza19udW1dID0ga3RocmVhZF9ydW4ocG93ZXJfc2F2aW5nX3RocmVhZCwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylwc190c2tfbnVtLAorCQkicG93ZXJfc2F2aW5nLyVkIiwgcHNfdHNrX251bSk7CisJaWYgKHBzX3Rza3NbcHNfdHNrX251bV0pIHsKKwkJcHNfdHNrX251bSsrOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfcG93ZXJfc2F2aW5nX3Rhc2sodm9pZCkKK3sKKwlpZiAocHNfdHNrX251bSA+IDApIHsKKwkJcHNfdHNrX251bS0tOworCQlrdGhyZWFkX3N0b3AocHNfdHNrc1twc190c2tfbnVtXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfcG93ZXJfc2F2aW5nX3Rhc2tfbnVtKHVuc2lnbmVkIGludCBudW0pCit7CisJaWYgKG51bSA+IHBzX3Rza19udW0pIHsKKwkJd2hpbGUgKHBzX3Rza19udW0gPCBudW0pIHsKKwkJCWlmIChjcmVhdGVfcG93ZXJfc2F2aW5nX3Rhc2soKSkKKwkJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKG51bSA8IHBzX3Rza19udW0pIHsKKwkJd2hpbGUgKHBzX3Rza19udW0gPiBudW0pCisJCQlkZXN0cm95X3Bvd2VyX3NhdmluZ190YXNrKCk7CisJfQorfQorCitzdGF0aWMgaW50IGFjcGlfcGFkX2lkbGVfY3B1cyh1bnNpZ25lZCBpbnQgbnVtX2NwdXMpCit7CisJZ2V0X29ubGluZV9jcHVzKCk7CisKKwludW1fY3B1cyA9IG1pbl90KHVuc2lnbmVkIGludCwgbnVtX2NwdXMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwlzZXRfcG93ZXJfc2F2aW5nX3Rhc2tfbnVtKG51bV9jcHVzKTsKKworCXB1dF9vbmxpbmVfY3B1cygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgYWNwaV9wYWRfaWRsZV9jcHVzX251bSh2b2lkKQoreworCXJldHVybiBwc190c2tfbnVtOworfQorCitzdGF0aWMgc3NpemVfdCBhY3BpX3BhZF9ycnRpbWVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIG51bTsKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmbnVtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG51bSA8IDEgfHwgbnVtID49IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmaXNvbGF0ZWRfY3B1c19sb2NrKTsKKwlyb3VuZF9yb2Jpbl90aW1lID0gbnVtOworCW11dGV4X3VubG9jaygmaXNvbGF0ZWRfY3B1c19sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFjcGlfcGFkX3JydGltZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZCIsIHJvdW5kX3JvYmluX3RpbWUpOworfQorc3RhdGljIERFVklDRV9BVFRSKHJydGltZSwgU19JUlVHT3xTX0lXVVNSLAorCWFjcGlfcGFkX3JydGltZV9zaG93LAorCWFjcGlfcGFkX3JydGltZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFjcGlfcGFkX2lkbGVwY3Rfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIG51bTsKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmbnVtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG51bSA8IDEgfHwgbnVtID49IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmaXNvbGF0ZWRfY3B1c19sb2NrKTsKKwlpZGxlX3BjdCA9IG51bTsKKwltdXRleF91bmxvY2soJmlzb2xhdGVkX2NwdXNfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBhY3BpX3BhZF9pZGxlcGN0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkIiwgaWRsZV9wY3QpOworfQorc3RhdGljIERFVklDRV9BVFRSKGlkbGVwY3QsIFNfSVJVR098U19JV1VTUiwKKwlhY3BpX3BhZF9pZGxlcGN0X3Nob3csCisJYWNwaV9wYWRfaWRsZXBjdF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFjcGlfcGFkX2lkbGVjcHVzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBudW07CisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJm51bSkpCisJCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJmlzb2xhdGVkX2NwdXNfbG9jayk7CisJYWNwaV9wYWRfaWRsZV9jcHVzKG51bSk7CisJbXV0ZXhfdW5sb2NrKCZpc29sYXRlZF9jcHVzX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgYWNwaV9wYWRfaWRsZWNwdXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gY3B1bWFza19zY25wcmludGYoYnVmLCBQQUdFX1NJWkUsCisJCXRvX2NwdW1hc2socGFkX2J1c3lfY3B1c19iaXRzKSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoaWRsZWNwdXMsIFNfSVJVR098U19JV1VTUiwKKwlhY3BpX3BhZF9pZGxlY3B1c19zaG93LAorCWFjcGlfcGFkX2lkbGVjcHVzX3N0b3JlKTsKKworc3RhdGljIGludCBhY3BpX3BhZF9hZGRfc3lzZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9pZGxlY3B1cyk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmVzdWx0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2lkbGVwY3QpOworCWlmIChyZXN1bHQpIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2lkbGVjcHVzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9ycnRpbWUpOworCWlmIChyZXN1bHQpIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2lkbGVjcHVzKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2lkbGVwY3QpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcGFkX3JlbW92ZV9zeXNmcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfaWRsZWNwdXMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9pZGxlcGN0KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfcnJ0aW1lKTsKK30KKworLyogUXVlcnkgZmlybXdhcmUgaG93IG1hbnkgQ1BVcyBzaG91bGQgYmUgaWRsZSAqLworc3RhdGljIGludCBhY3BpX3BhZF9wdXIoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKm51bV9jcHVzKQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqcGFja2FnZTsKKwlpbnQgcmV2LCBudW0sIHJldCA9IC1FSU5WQUw7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsICJfUFVSIiwgTlVMTCwgJmJ1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwYWNrYWdlID0gYnVmZmVyLnBvaW50ZXI7CisJaWYgKHBhY2thZ2UtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UgfHwgcGFja2FnZS0+cGFja2FnZS5jb3VudCAhPSAyKQorCQlnb3RvIG91dDsKKwlyZXYgPSBwYWNrYWdlLT5wYWNrYWdlLmVsZW1lbnRzWzBdLmludGVnZXIudmFsdWU7CisJbnVtID0gcGFja2FnZS0+cGFja2FnZS5lbGVtZW50c1sxXS5pbnRlZ2VyLnZhbHVlOworCWlmIChyZXYgIT0gMSkKKwkJZ290byBvdXQ7CisJKm51bV9jcHVzID0gbnVtOworCXJldCA9IDA7CitvdXQ6CisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vdGlmeSBmaXJtd2FyZSBob3cgbWFueSBDUFVzIGFyZSBpZGxlICovCitzdGF0aWMgdm9pZCBhY3BpX3BhZF9vc3QoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgc3RhdCwKKwl1aW50MzJfdCBpZGxlX2NwdXMpCit7CisJdW5pb24gYWNwaV9vYmplY3QgcGFyYW1zWzNdID0geworCQl7LnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUix9LAorCQl7LnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUix9LAorCQl7LnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSLH0sCisJfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdCA9IHszLCBwYXJhbXN9OworCisJcGFyYW1zWzBdLmludGVnZXIudmFsdWUgPSBBQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SX05PVElGWTsKKwlwYXJhbXNbMV0uaW50ZWdlci52YWx1ZSA9ICBzdGF0OworCXBhcmFtc1syXS5idWZmZXIubGVuZ3RoID0gNDsKKwlwYXJhbXNbMl0uYnVmZmVyLnBvaW50ZXIgPSAodm9pZCAqKSZpZGxlX2NwdXM7CisJYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX09TVCIsICZhcmdfbGlzdCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcGFkX2hhbmRsZV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWludCBudW1fY3B1cywgcmV0OworCXVpbnQzMl90IGlkbGVfY3B1czsKKworCW11dGV4X2xvY2soJmlzb2xhdGVkX2NwdXNfbG9jayk7CisJaWYgKGFjcGlfcGFkX3B1cihoYW5kbGUsICZudW1fY3B1cykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpc29sYXRlZF9jcHVzX2xvY2spOworCQlyZXR1cm47CisJfQorCXJldCA9IGFjcGlfcGFkX2lkbGVfY3B1cyhudW1fY3B1cyk7CisJaWRsZV9jcHVzID0gYWNwaV9wYWRfaWRsZV9jcHVzX251bSgpOworCWlmICghcmV0KQorCQlhY3BpX3BhZF9vc3QoaGFuZGxlLCAwLCBpZGxlX2NwdXMpOworCWVsc2UKKwkJYWNwaV9wYWRfb3N0KGhhbmRsZSwgMSwgMCk7CisJbXV0ZXhfdW5sb2NrKCZpc29sYXRlZF9jcHVzX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBhY3BpX3BhZF9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsCisJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IGRhdGE7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBBQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SX05PVElGWToKKwkJYWNwaV9wYWRfaGFuZGxlX25vdGlmeShoYW5kbGUpOworCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGRldmljZSwgZXZlbnQsIDApOworCQlhY3BpX2J1c19nZW5lcmF0ZV9uZXRsaW5rX2V2ZW50KGRldmljZS0+cG5wLmRldmljZV9jbGFzcywKKwkJCWRldl9uYW1lKCZkZXZpY2UtPmRldiksIGV2ZW50LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyJVbnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGFjcGlfcGFkX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SX0RFVklDRV9OQU1FKTsKKwlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9QUk9DRVNTT1JfQUdHUkVHQVRPUl9DTEFTUyk7CisKKwlpZiAoYWNwaV9wYWRfYWRkX3N5c2ZzKGRldmljZSkpCisJCXJldHVybiAtRU5PREVWOworCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGRldmljZS0+aGFuZGxlLAorCQlBQ1BJX0RFVklDRV9OT1RJRlksIGFjcGlfcGFkX25vdGlmeSwgZGV2aWNlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9wYWRfcmVtb3ZlX3N5c2ZzKGRldmljZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfcGFkX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwlpbnQgdHlwZSkKK3sKKwltdXRleF9sb2NrKCZpc29sYXRlZF9jcHVzX2xvY2spOworCWFjcGlfcGFkX2lkbGVfY3B1cygwKTsKKwltdXRleF91bmxvY2soJmlzb2xhdGVkX2NwdXNfbG9jayk7CisKKwlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihkZXZpY2UtPmhhbmRsZSwKKwkJQUNQSV9ERVZJQ0VfTk9USUZZLCBhY3BpX3BhZF9ub3RpZnkpOworCWFjcGlfcGFkX3JlbW92ZV9zeXNmcyhkZXZpY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHBhZF9kZXZpY2VfaWRzW10gPSB7CisJeyJBQ1BJMDAwQyIsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBwYWRfZGV2aWNlX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wYWRfZHJpdmVyID0geworCS5uYW1lID0gInByb2Nlc3Nvcl9hZ2dyZWdhdG9yIiwKKwkuY2xhc3MgPSBBQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SX0NMQVNTLAorCS5pZHMgPSBwYWRfZGV2aWNlX2lkcywKKwkub3BzID0geworCQkuYWRkID0gYWNwaV9wYWRfYWRkLAorCQkucmVtb3ZlID0gYWNwaV9wYWRfcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhZF9pbml0KHZvaWQpCit7CisJcG93ZXJfc2F2aW5nX213YWl0X2luaXQoKTsKKwlpZiAocG93ZXJfc2F2aW5nX213YWl0X2VheCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfcGFkX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX3BhZF9leGl0KHZvaWQpCit7CisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfcGFkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFjcGlfcGFkX2luaXQpOworbW9kdWxlX2V4aXQoYWNwaV9wYWRfZXhpdCk7CitNT0RVTEVfQVVUSE9SKCJTaGFvaHVhIExpPHNoYW9odWEubGlAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIFByb2Nlc3NvciBBZ2dyZWdhdG9yIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IDEzNWZiZmUuLjc0MTE5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTk0LDM2ICs5NCwzMyBAQAogCiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2dldF9kZXZpY2UpOwogCithY3BpX3N0YXR1cyBhY3BpX2J1c19nZXRfc3RhdHVzX2hhbmRsZShhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqc3RhKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfU1RBIiwgTlVMTCwgc3RhKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiBBRV9PSzsKKworCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CisJCSpzdGEgPSBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCB8IEFDUElfU1RBX0RFVklDRV9FTkFCTEVEIHwKKwkJICAgICAgIEFDUElfU1RBX0RFVklDRV9VSSAgICAgIHwgQUNQSV9TVEFfREVWSUNFX0ZVTkNUSU9OSU5HOworCQlyZXR1cm4gQUVfT0s7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKIGludCBhY3BpX2J1c19nZXRfc3RhdHVzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGEgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhOwogCisJc3RhdHVzID0gYWNwaV9idXNfZ2V0X3N0YXR1c19oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICZzdGEpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIWRldmljZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKgotCSAqIEV2YWx1YXRlIF9TVEEgaWYgcHJlc2VudC4KLQkgKi8KLQlpZiAoZGV2aWNlLT5mbGFncy5keW5hbWljX3N0YXR1cykgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJU1RSVUNUX1RPX0lOVChkZXZpY2UtPnN0YXR1cykgPSAoaW50KXN0YTsKLQl9Ci0KLQkvKgotCSAqIEFjY29yZGluZyB0byBBQ1BJIHNwZWMgc29tZSBkZXZpY2UgY2FuIGJlIHByZXNlbnQgYW5kIGZ1bmN0aW9uYWwKLQkgKiBldmVuIGlmIHRoZSBwYXJlbnQgaXMgbm90IHByZXNlbnQgYnV0IGZ1bmN0aW9uYWwuCi0JICogSW4gc3VjaCBjb25kaXRpb25zIHRoZSBjaGlsZCBkZXZpY2Ugc2hvdWxkIG5vdCBpbmhlcml0IHRoZSBzdGF0dXMKLQkgKiBmcm9tIHRoZSBwYXJlbnQuCi0JICovCi0JZWxzZQotCQlTVFJVQ1RfVE9fSU5UKGRldmljZS0+c3RhdHVzKSA9Ci0JCSAgICBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCB8IEFDUElfU1RBX0RFVklDRV9FTkFCTEVEIHwKLQkJICAgIEFDUElfU1RBX0RFVklDRV9VSSAgICAgIHwgQUNQSV9TVEFfREVWSUNFX0ZVTkNUSU9OSU5HOworCVNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpID0gKGludCkgc3RhOwogCiAJaWYgKGRldmljZS0+c3RhdHVzLmZ1bmN0aW9uYWwgJiYgIWRldmljZS0+c3RhdHVzLnByZXNlbnQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIFslc10gc3RhdHVzIFslMDh4XTogIgpAQCAtMTM1LDEwICsxMzIsOCBAQAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBbJXNdIHN0YXR1cyBbJTA4eF1cbiIsCiAJCQkgIGRldmljZS0+cG5wLmJ1c19pZCwKIAkJCSAgKHUzMikgU1RSVUNUX1RPX0lOVChkZXZpY2UtPnN0YXR1cykpKTsKLQogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2dldF9zdGF0dXMpOwogCiB2b2lkIGFjcGlfYnVzX3ByaXZhdGVfZGF0YV9oYW5kbGVyKGFjcGlfaGFuZGxlIGhhbmRsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXR0b24uYyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwppbmRleCBkMjk1YmRjLi4wYzljNmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCkBAIC0xMTUsNiArMTE1LDkgQEAKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAorc3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQoYWNwaV9saWRfbm90aWZpZXIpOworc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqbGlkX2RldmljZTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjMxLDExICsyMzQsNDEgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBJbnRlcmZhY2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitpbnQgYWNwaV9saWRfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmFjcGlfbGlkX25vdGlmaWVyLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfbGlkX25vdGlmaWVyX3JlZ2lzdGVyKTsKKworaW50IGFjcGlfbGlkX25vdGlmaWVyX3VucmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmYWNwaV9saWRfbm90aWZpZXIsIG5iKTsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9saWRfbm90aWZpZXJfdW5yZWdpc3Rlcik7CisKK2ludCBhY3BpX2xpZF9vcGVuKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGF0ZTsKKworCWlmICghbGlkX2RldmljZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIobGlkX2RldmljZS0+aGFuZGxlLCAiX0xJRCIsIE5VTEwsCisJCQkJICAgICAgICZzdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAhIXN0YXRlOworfQorRVhQT1JUX1NZTUJPTChhY3BpX2xpZF9vcGVuKTsKKwogc3RhdGljIGludCBhY3BpX2xpZF9zZW5kX3N0YXRlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGF0ZTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IHJldDsKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9MSUQiLCBOVUxMLCAmc3RhdGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKQEAgLTI0NCw3ICsyNzcsMTIgQEAKIAkvKiBpbnB1dCBsYXllciBjaGVja3MgaWYgZXZlbnQgaXMgcmVkdW5kYW50ICovCiAJaW5wdXRfcmVwb3J0X3N3aXRjaChidXR0b24tPmlucHV0LCBTV19MSUQsICFzdGF0ZSk7CiAJaW5wdXRfc3luYyhidXR0b24tPmlucHV0KTsKLQlyZXR1cm4gMDsKKworCXJldCA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmFjcGlfbGlkX25vdGlmaWVyLCBzdGF0ZSwgZGV2aWNlKTsKKwlpZiAocmV0ID09IE5PVElGWV9ET05FKQorCQlyZXQgPSBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZhY3BpX2xpZF9ub3RpZmllciwgc3RhdGUsCisJCQkJCQkgICBkZXZpY2UpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFjcGlfYnV0dG9uX25vdGlmeShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgdTMyIGV2ZW50KQpAQCAtMzY2LDggKzQwNCwxNCBAQAogCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyX3JlbW92ZV9mczsKLQlpZiAoYnV0dG9uLT50eXBlID09IEFDUElfQlVUVE9OX1RZUEVfTElEKQorCWlmIChidXR0b24tPnR5cGUgPT0gQUNQSV9CVVRUT05fVFlQRV9MSUQpIHsKIAkJYWNwaV9saWRfc2VuZF9zdGF0ZShkZXZpY2UpOworCQkvKgorCQkgKiBUaGlzIGFzc3VtZXMgdGhlcmUncyBvbmx5IG9uZSBsaWQgZGV2aWNlLCBvciBpZiB0aGVyZSBhcmUKKwkJICogbW9yZSB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGxhc3Qgb25lLi4uCisJCSAqLworCQlsaWRfZGV2aWNlID0gZGV2aWNlOworCX0KIAogCWlmIChkZXZpY2UtPndha2V1cC5mbGFncy52YWxpZCkgewogCQkvKiBCdXR0b24ncyBHUEUgaXMgcnVuLXdha2UgR1BFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZG9jay5jIGIvZHJpdmVycy9hY3BpL2RvY2suYwppbmRleCAzYTJjZmVmLi43MzM4YjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZG9jay5jCisrKyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRlcGVuZGVudF9kZXZpY2VzOwogCXN0cnVjdCBsaXN0X2hlYWQgaG90cGx1Z19kZXZpY2VzOwogCi0Jc3RydWN0IGxpc3RfaGVhZCBzaWJpbGluZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNpYmxpbmc7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG9ja19kZXZpY2U7CiB9Owogc3RhdGljIExJU1RfSEVBRChkb2NrX3N0YXRpb25zKTsKQEAgLTI3NSw3ICsyNzUsNyBAQAogCiAJaWYgKGlzX2RvY2soaGFuZGxlKSkKIAkJcmV0dXJuIDE7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkb2NrX3N0YXRpb24sICZkb2NrX3N0YXRpb25zLCBzaWJpbGluZykgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoZG9ja19zdGF0aW9uLCAmZG9ja19zdGF0aW9ucywgc2libGluZykgewogCQlpZiAoZmluZF9kb2NrX2RlcGVuZGVudF9kZXZpY2UoZG9ja19zdGF0aW9uLCBoYW5kbGUpKQogCQkJcmV0dXJuIDE7CiAJfQpAQCAtNjE5LDcgKzYxOSw3IEBACiAJICogbWFrZSBzdXJlIHRoaXMgaGFuZGxlIGlzIGZvciBhIGRldmljZSBkZXBlbmRlbnQgb24gdGhlIGRvY2ssCiAJICogdGhpcyB3b3VsZCBpbmNsdWRlIHRoZSBkb2NrIHN0YXRpb24gaXRzZWxmCiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkb2NrX3N0YXRpb24sICZkb2NrX3N0YXRpb25zLCBzaWJpbGluZykgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoZG9ja19zdGF0aW9uLCAmZG9ja19zdGF0aW9ucywgc2libGluZykgewogCQkvKgogCQkgKiBBbiBBVEEgYmF5IGNhbiBiZSBpbiBhIGRvY2sgYW5kIGl0c2VsZiBjYW4gYmUgZWplY3RlZAogCQkgKiBzZXBlcmF0ZWx5LCBzbyB0aGVyZSBhcmUgdHdvICdkb2NrIHN0YXRpb25zJyB3aGljaCBuZWVkIHRoZQpAQCAtNjUxLDcgKzY1MSw3IEBACiAJaWYgKCFkb2NrX3N0YXRpb25fY291bnQpCiAJCXJldHVybjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZG9ja19zdGF0aW9uLCAmZG9ja19zdGF0aW9ucywgc2liaWxpbmcpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRvY2tfc3RhdGlvbiwgJmRvY2tfc3RhdGlvbnMsIHNpYmxpbmcpIHsKIAkJZGQgPSBmaW5kX2RvY2tfZGVwZW5kZW50X2RldmljZShkb2NrX3N0YXRpb24sIGhhbmRsZSk7CiAJCWlmIChkZCkKIAkJCWRvY2tfZGVsX2hvdHBsdWdfZGV2aWNlKGRvY2tfc3RhdGlvbiwgZGQpOwpAQCAtNzg3LDcgKzc4Nyw3IEBACiAJaWYgKGV2ZW50ICE9IEFDUElfTk9USUZZX0JVU19DSEVDSyAmJiBldmVudCAhPSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0sKIAkgICAmJiBldmVudCAhPSBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUKQogCQlyZXR1cm4gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRvY2tfc3RhdGlvbiwgJmRvY2tfc3RhdGlvbnMsIHNpYmlsaW5nKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkb2NrX3N0YXRpb24sICZkb2NrX3N0YXRpb25zLCBzaWJsaW5nKSB7CiAJCWlmIChkb2NrX3N0YXRpb24tPmhhbmRsZSA9PSBoYW5kbGUpIHsKIAkJCXN0cnVjdCBkb2NrX2RhdGEgKmRvY2tfZGF0YTsKIApAQCAtOTU4LDcgKzk1OCw3IEBACiAJZG9ja19zdGF0aW9uLT5sYXN0X2RvY2tfdGltZSA9IGppZmZpZXMgLSBIWjsKIAlJTklUX0xJU1RfSEVBRCgmZG9ja19zdGF0aW9uLT5kZXBlbmRlbnRfZGV2aWNlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmRvY2tfc3RhdGlvbi0+aG90cGx1Z19kZXZpY2VzKTsKLQlJTklUX0xJU1RfSEVBRCgmZG9ja19zdGF0aW9uLT5zaWJpbGluZyk7CisJSU5JVF9MSVNUX0hFQUQoJmRvY2tfc3RhdGlvbi0+c2libGluZyk7CiAJc3Bpbl9sb2NrX2luaXQoJmRvY2tfc3RhdGlvbi0+ZGRfbG9jayk7CiAJbXV0ZXhfaW5pdCgmZG9ja19zdGF0aW9uLT5ocF9sb2NrKTsKIAlBVE9NSUNfSU5JVF9OT1RJRklFUl9IRUFEKCZkb2NrX25vdGlmaWVyX2xpc3QpOwpAQCAtMTA0NCw3ICsxMDQ0LDcgQEAKIAlhZGRfZG9ja19kZXBlbmRlbnRfZGV2aWNlKGRvY2tfc3RhdGlvbiwgZGQpOwogCiAJZG9ja19zdGF0aW9uX2NvdW50Kys7Ci0JbGlzdF9hZGQoJmRvY2tfc3RhdGlvbi0+c2liaWxpbmcsICZkb2NrX3N0YXRpb25zKTsKKwlsaXN0X2FkZCgmZG9ja19zdGF0aW9uLT5zaWJsaW5nLCAmZG9ja19zdGF0aW9ucyk7CiAJcmV0dXJuIDA7CiAKIGRvY2tfYWRkX2Vycl91bnJlZ2lzdGVyOgpAQCAtMTE0OSw3ICsxMTQ5LDcgQEAKIAlzdHJ1Y3QgZG9ja19zdGF0aW9uICp0bXA7CiAKIAl1bnJlZ2lzdGVyX2FjcGlfYnVzX25vdGlmaWVyKCZkb2NrX2FjcGlfbm90aWZpZXIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkb2NrX3N0YXRpb24sIHRtcCwgJmRvY2tfc3RhdGlvbnMsIHNpYmlsaW5nKQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkb2NrX3N0YXRpb24sIHRtcCwgJmRvY2tfc3RhdGlvbnMsIHNpYmxpbmcpCiAJCWRvY2tfcmVtb3ZlKGRvY2tfc3RhdGlvbik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggZjcwNzk2MC4uYmFlZjI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTExOSw2ICsxMTksOCBAQAogfSAqYm9vdF9lYywgKmZpcnN0X2VjOwogCiBzdGF0aWMgaW50IEVDX0ZMQUdTX01TSTsgLyogT3V0LW9mLXNwZWMgTVNJIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBpbnQgRUNfRkxBR1NfVkFMSURBVEVfRUNEVDsgLyogQVNVU3RlYyBFQ0RUcyBuZWVkIHRvIGJlIHZhbGlkYXRlZCAqLworc3RhdGljIGludCBFQ19GTEFHU19TS0lQX0RTRFRfU0NBTjsgLyogTm90IGFsbCBCSU9TIHN1cnZpdmUgZWFybHkgRFNEVCBzY2FuICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uIE1hbmFnZW1lbnQKQEAgLTIzMiwxMCArMjM0LDggQEAKIAkJCX0KIAkJCWFkdmFuY2VfdHJhbnNhY3Rpb24oZWMsIGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpKTsKIAkJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZGVsYXkpKTsKLQkJaWYgKCFlYy0+Y3Vyci0+aXJxX2NvdW50IHx8Ci0JCSAgICAoYWNwaV9lY19yZWFkX3N0YXR1cyhlYykgJiBBQ1BJX0VDX0ZMQUdfSUJGKSkKKwkJaWYgKGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX0lCRikKIAkJCWJyZWFrOwotCQkvKiB0cnkgcmVzdGFydCBjb21tYW5kIGlmIHdlIGdldCBhbnkgZmFsc2UgaW50ZXJydXB0cyAqLwogCQlwcl9kZWJ1ZyhQUkVGSVggImNvbnRyb2xsZXIgcmVzZXQsIHJlc3RhcnQgdHJhbnNhY3Rpb25cbiIpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmN1cnJfbG9jaywgZmxhZ3MpOwogCQlzdGFydF90cmFuc2FjdGlvbihlYyk7CkBAIC04OTksNiArODk5LDQ0IEBACiAJeyIiLCAwfSwKIH07CiAKKy8qIFNvbWUgQklPUyBkbyBub3Qgc3Vydml2ZSBlYXJseSBEU0RUIHNjYW4sIHNraXAgaXQgKi8KK3N0YXRpYyBpbnQgZWNfc2tpcF9kc2R0X3NjYW4oY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCUVDX0ZMQUdTX1NLSVBfRFNEVF9TQ0FOID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyogQVNVU3RlayBvZnRlbiBzdXBwbGllcyB1cyB3aXRoIGJyb2tlbiBFQ0RULCB2YWxpZGF0ZSBpdCAqLworc3RhdGljIGludCBlY192YWxpZGF0ZV9lY2R0KGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlFQ19GTEFHU19WQUxJREFURV9FQ0RUID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyogTVNJIEVDIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LCBlbmFibGUgaXQgKi8KK3N0YXRpYyBpbnQgZWNfZmxhZ19tc2koY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCUVDX0ZMQUdTX01TSSA9IDE7CisJRUNfRkxBR1NfVkFMSURBVEVfRUNEVCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGVjX2RtaV90YWJsZVtdID0geworCXsKKwllY19za2lwX2RzZHRfc2NhbiwgIkNvbXBhbCBKRkw5MiIsIHsKKwlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQ09NUEFMIiksCisJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiSkZMOTIiKSB9LCBOVUxMfSwKKwl7CisJZWNfZmxhZ19tc2ksICJNU0kgaGFyZHdhcmUiLCB7CisJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIk1pY3JvLVN0YXIiKSwKKwlETUlfTUFUQ0goRE1JX0NIQVNTSVNfVkVORE9SLCAiTUlDUk8tU3RhciIpIH0sIE5VTEx9LAorCXsKKwllY192YWxpZGF0ZV9lY2R0LCAiQVNVUyBoYXJkd2FyZSIsIHsKKwlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQVNVUyIpIH0sIE5VTEx9LAorCXt9LAorfTsKKworCiBpbnQgX19pbml0IGFjcGlfZWNfZWNkdF9wcm9iZSh2b2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTkxMSwxMSArOTQ5LDcgQEAKIAkvKgogCSAqIEdlbmVyYXRlIGEgYm9vdCBlYyBjb250ZXh0CiAJICovCi0JaWYgKGRtaV9uYW1lX2luX3ZlbmRvcnMoIk1pY3JvLVN0YXIiKSB8fAotCSAgICBkbWlfbmFtZV9pbl92ZW5kb3JzKCJOb3RlYm9vayIpKSB7Ci0JCXByX2luZm8oUFJFRklYICJFbmFibGluZyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgRUMgZnJvbSBNU0kuXG4iKTsKLQkJRUNfRkxBR1NfTVNJID0gMTsKLQl9CisJZG1pX2NoZWNrX3N5c3RlbShlY19kbWlfdGFibGUpOwogCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0VDRFQsIDEsCiAJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikmZWNkdF9wdHIpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewpAQCAtOTI2LDcgKzk2MCw3IEBACiAJCWJvb3RfZWMtPmhhbmRsZSA9IEFDUElfUk9PVF9PQkpFQ1Q7CiAJCWFjcGlfZ2V0X2hhbmRsZShBQ1BJX1JPT1RfT0JKRUNULCBlY2R0X3B0ci0+aWQsICZib290X2VjLT5oYW5kbGUpOwogCQkvKiBEb24ndCB0cnVzdCBFQ0RULCB3aGljaCBjb21lcyBmcm9tIEFTVVNUZWsgKi8KLQkJaWYgKCFkbWlfbmFtZV9pbl92ZW5kb3JzKCJBU1VTIikgJiYgRUNfRkxBR1NfTVNJID09IDApCisJCWlmICghRUNfRkxBR1NfVkFMSURBVEVfRUNEVCkKIAkJCWdvdG8gaW5zdGFsbDsKIAkJc2F2ZWRfZWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9lYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXNhdmVkX2VjKQpAQCAtOTM0LDYgKzk2OCwxMCBAQAogCQltZW1jcHkoc2F2ZWRfZWMsIGJvb3RfZWMsIHNpemVvZihzdHJ1Y3QgYWNwaV9lYykpOwogCS8qIGZhbGwgdGhyb3VnaCAqLwogCX0KKworCWlmIChFQ19GTEFHU19TS0lQX0RTRFRfU0NBTikKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAkvKiBUaGlzIHdvcmthcm91bmQgaXMgbmVlZGVkIG9ubHkgb24gc29tZSBicm9rZW4gbWFjaGluZXMsCiAJICogd2hpY2ggcmVxdWlyZSBlYXJseSBFQywgYnV0IGZhaWwgdG8gcHJvdmlkZSBFQ0RUICovCiAJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJMb29rIHVwIEVDIGluIERTRFRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IDU2MDcxYjYuLjdjMWM1OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCiBzdGF0aWMgdm9pZCBiaW5kX3RvX2NwdTAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoMCkpOworCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2tfb2YoMCkpOwogCWtmcmVlKHdvcmspOwogfQogCkBAIC0xMTYxLDcgKzExNjEsMTMgQEAKIAkJCSAgICAgICByZXNfbGlzdF9lbGVtLT5uYW1lLAogCQkJICAgICAgIChsb25nIGxvbmcpIHJlc19saXN0X2VsZW0tPnN0YXJ0LAogCQkJICAgICAgIChsb25nIGxvbmcpIHJlc19saXN0X2VsZW0tPmVuZCk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJBQ1BJOiBEZXZpY2UgbmVlZHMgYW4gQUNQSSBkcml2ZXJcbiIpOworCQkJaWYgKGFjcGlfZW5mb3JjZV9yZXNvdXJjZXMgPT0gRU5GT1JDRV9SRVNPVVJDRVNfTEFYKQorCQkJCXByaW50ayhLRVJOX05PVElDRSAiQUNQSTogVGhpcyBjb25mbGljdCBtYXkiCisJCQkJICAgICAgICIgY2F1c2UgcmFuZG9tIHByb2JsZW1zIGFuZCBzeXN0ZW0iCisJCQkJICAgICAgICIgaW5zdGFiaWxpdHlcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQUNQSTogSWYgYW4gQUNQSSBkcml2ZXIgaXMgYXZhaWxhYmxlIgorCQkJICAgICAgICIgZm9yIHRoaXMgZGV2aWNlLCB5b3Ugc2hvdWxkIHVzZSBpdCBpbnN0ZWFkIG9mIgorCQkJICAgICAgICIgdGhlIG5hdGl2ZSBkcml2ZXJcbiIpOwogCQl9CiAJCWlmIChhY3BpX2VuZm9yY2VfcmVzb3VyY2VzID09IEVORk9SQ0VfUkVTT1VSQ0VTX1NUUklDVCkKIAkJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCmluZGV4IDMxMTIyMjEuLjFhZjgwODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCkBAIC0zODksNiArMzg5LDE3IEBACiAKIAkJcGJ1cyA9IHBkZXYtPnN1Ym9yZGluYXRlOwogCQlwY2lfZGV2X3B1dChwZGV2KTsKKworCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZm9yIGEgbm9uLVBDSSBkZXZpY2UgdGhhdCBoYXMgYQorCQkgKiBQQ0kgcGFyZW50IChlZy4gYSBkaXNrIHVuZGVyIGEgUENJIFNBVEEgY29udHJvbGxlcikuICBJbiB0aGF0CisJCSAqIGNhc2UgcGRldi0+c3Vib3JkaW5hdGUgd2lsbCBiZSBOVUxMIGZvciB0aGUgcGFyZW50LgorCQkgKi8KKwkJaWYgKCFwYnVzKSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJOb3QgYSBQQ0ktdG8tUENJIGJyaWRnZVxuIik7CisJCQlwZGV2ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CiAJfQogb3V0OgogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCB0bXAsICZkZXZpY2VfbGlzdCwgbm9kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvcHJvYy5jCmluZGV4IGQwZDU1MGQuLmY4YjZmNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2MuYwpAQCAtMzk4LDYgKzM5OCw4IEBACiAKIAlpZiAobGVuID4gNCkKIAkJbGVuID0gNDsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoc3RyYnVmLCBidWZmZXIsIGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCBjMmQ0ZDZlLi5jNTY3YjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtODYzLDEzICs4NjMsNiBAQAogCQlnb3RvIGVycl9yZW1vdmVfc3lzZnM7CiAJfQogCi0JaWYgKHByLT5mbGFncy50aHJvdHRsaW5nKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdIChzdXBwb3J0cyIsCi0JCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKTsKLQkJcHJpbnRrKCIgJWQgdGhyb3R0bGluZyBzdGF0ZXMiLCBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCk7Ci0JCXByaW50aygiKVxuIik7Ci0JfQotCiAJcmV0dXJuIDA7CiAKIGVycl9yZW1vdmVfc3lzZnM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IGNjNjFhNjIuLmJiZDA2NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC0xMTY2LDcgKzExNjYsNiBAQAogI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGUwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOwogI2VuZGlmCi0JdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSkKIAkJcmV0dXJuIDA7CkBAIC0xMjE0LDEzICsxMjEzLDYgQEAKIAkJYWNwaV9wcm9jZXNzb3Jfc2V0dXBfY3B1aWRsZShwcik7CiAJCWlmIChjcHVpZGxlX3JlZ2lzdGVyX2RldmljZSgmcHItPnBvd2VyLmRldikpCiAJCQlyZXR1cm4gLUVJTzsKLQotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiQ1BVJWQgKHBvd2VyIHN0YXRlczoiLCBwci0+aWQpOwotCQlmb3IgKGkgPSAxOyBpIDw9IHByLT5wb3dlci5jb3VudDsgaSsrKQotCQkJaWYgKHByLT5wb3dlci5zdGF0ZXNbaV0udmFsaWQpCi0JCQkJcHJpbnRrKCIgQyVkW0MlZF0iLCBpLAotCQkJCSAgICAgICBwci0+cG93ZXIuc3RhdGVzW2ldLnR5cGUpOwotCQlwcmludGsoIilcbiIpOwogCX0KICNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlMKIAkvKiAncG93ZXInIFtSXSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwppbmRleCAxMTA4OGNmLi44YmEwZWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwpAQCAtNTExLDcgKzUxMSw3IEBACiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICptYXRjaF9wcjsKIAlzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSAqbWF0Y2hfcGRvbWFpbjsKIAotCWlmICghYWxsb2NfY3B1bWFza192YXIoJmNvdmVyZWRfY3B1cywgR0ZQX0tFUk5FTCkpCisJaWYgKCF6YWxsb2NfY3B1bWFza192YXIoJmNvdmVyZWRfY3B1cywgR0ZQX0tFUk5FTCkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbXV0ZXhfbG9jaygmcGVyZm9ybWFuY2VfbXV0ZXgpOwpAQCAtNTU4LDcgKzU1OCw2IEBACiAJICogTm93IHRoYXQgd2UgaGF2ZSBfUFNEIGRhdGEgZnJvbSBhbGwgQ1BVcywgbGV0cyBzZXR1cCBQLXN0YXRlIAogCSAqIGRvbWFpbiBpbmZvLgogCSAqLwotCWNwdW1hc2tfY2xlYXIoY292ZXJlZF9jcHVzKTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlwciA9IHBlcl9jcHUocHJvY2Vzc29ycywgaSk7CiAJCWlmICghcHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCmluZGV4IGNlN2NmM2IuLjRjNmMxNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJc3RydWN0IGFjcGlfdHNkX3BhY2thZ2UgKnBkb21haW4sICptYXRjaF9wZG9tYWluOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nICpwdGhyb3R0bGluZywgKm1hdGNoX3B0aHJvdHRsaW5nOwogCi0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY292ZXJlZF9jcHVzLCBHRlBfS0VSTkVMKSkKKwlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmY292ZXJlZF9jcHVzLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKgpAQCAtMTA1LDcgKzEwNSw2IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJfcmV0OwogCi0JY3B1bWFza19jbGVhcihjb3ZlcmVkX2NwdXMpOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXByID0gcGVyX2NwdShwcm9jZXNzb3JzLCBpKTsKIAkJaWYgKCFwcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IDQwOGViZGUuLjE0YTc0ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtMjIsNiArMjIsOCBAQAogI2RlZmluZSBBQ1BJX0JVU19ISUQJCQkiTE5YU1lCVVMiCiAjZGVmaW5lIEFDUElfQlVTX0RFVklDRV9OQU1FCQkiU3lzdGVtIEJ1cyIKIAorI2RlZmluZSBBQ1BJX0lTX1JPT1RfREVWSUNFKGRldmljZSkgICAgKCEoZGV2aWNlKS0+cGFyZW50KQorCiBzdGF0aWMgTElTVF9IRUFEKGFjcGlfZGV2aWNlX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChhY3BpX2J1c19pZF9saXN0KTsKIERFRklORV9NVVRFWChhY3BpX2RldmljZV9sb2NrKTsKQEAgLTQzLDQwICs0NSwxOSBAQAogewogCWludCBsZW47CiAJaW50IGNvdW50OwotCi0JaWYgKCFhY3BpX2Rldi0+ZmxhZ3MuaGFyZHdhcmVfaWQgJiYgIWFjcGlfZGV2LT5mbGFncy5jb21wYXRpYmxlX2lkcykKLQkJcmV0dXJuIC1FTk9ERVY7CisJc3RydWN0IGFjcGlfaGFyZHdhcmVfaWQgKmlkOwogCiAJbGVuID0gc25wcmludGYobW9kYWxpYXMsIHNpemUsICJhY3BpOiIpOwogCXNpemUgLT0gbGVuOwogCi0JaWYgKGFjcGlfZGV2LT5mbGFncy5oYXJkd2FyZV9pZCkgewotCQljb3VudCA9IHNucHJpbnRmKCZtb2RhbGlhc1tsZW5dLCBzaXplLCAiJXM6IiwKLQkJCQkgYWNwaV9kZXYtPnBucC5oYXJkd2FyZV9pZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpZCwgJmFjcGlfZGV2LT5wbnAuaWRzLCBsaXN0KSB7CisJCWNvdW50ID0gc25wcmludGYoJm1vZGFsaWFzW2xlbl0sIHNpemUsICIlczoiLCBpZC0+aWQpOwogCQlpZiAoY291bnQgPCAwIHx8IGNvdW50ID49IHNpemUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbGVuICs9IGNvdW50OwogCQlzaXplIC09IGNvdW50OwogCX0KIAotCWlmIChhY3BpX2Rldi0+ZmxhZ3MuY29tcGF0aWJsZV9pZHMpIHsKLQkJc3RydWN0IGFjcGljYV9kZXZpY2VfaWRfbGlzdCAqY2lkX2xpc3Q7Ci0JCWludCBpOwotCi0JCWNpZF9saXN0ID0gYWNwaV9kZXYtPnBucC5jaWRfbGlzdDsKLQkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKSB7Ci0JCQljb3VudCA9IHNucHJpbnRmKCZtb2RhbGlhc1tsZW5dLCBzaXplLCAiJXM6IiwKLQkJCQkJIGNpZF9saXN0LT5pZHNbaV0uc3RyaW5nKTsKLQkJCWlmIChjb3VudCA8IDAgfHwgY291bnQgPj0gc2l6ZSkgewotCQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIiVzIGNpZFslaV0gZXhjZWVkcyBldmVudCBidWZmZXIgc2l6ZSIsCi0JCQkJICAgICAgIGFjcGlfZGV2LT5wbnAuZGV2aWNlX25hbWUsIGkpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbGVuICs9IGNvdW50OwotCQkJc2l6ZSAtPSBjb3VudDsKLQkJfQotCX0KLQogCW1vZGFsaWFzW2xlbl0gPSAnXDAnOwogCXJldHVybiBsZW47CiB9CkBAIC0xODMsNyArMTY0LDcgQEAKIGFjcGlfZGV2aWNlX2hpZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgewogCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSB0b19hY3BpX2RldmljZShkZXYpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGFjcGlfZGV2LT5wbnAuaGFyZHdhcmVfaWQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBhY3BpX2RldmljZV9oaWQoYWNwaV9kZXYpKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihoaWQsIDA0NDQsIGFjcGlfZGV2aWNlX2hpZF9zaG93LCBOVUxMKTsKIApAQCAtMjE5LDE3ICsyMDAsMTMgQEAKIAkJCWdvdG8gZW5kOwogCX0KIAotCWlmIChkZXYtPmZsYWdzLmhhcmR3YXJlX2lkKSB7Ci0JCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9oaWQpOwotCQlpZiAocmVzdWx0KQotCQkJZ290byBlbmQ7Ci0JfQorCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9oaWQpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZW5kOwogCi0JaWYgKGRldi0+ZmxhZ3MuaGFyZHdhcmVfaWQgfHwgZGV2LT5mbGFncy5jb21wYXRpYmxlX2lkcykgewotCQlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfbW9kYWxpYXMpOwotCQlpZiAocmVzdWx0KQotCQkJZ290byBlbmQ7Ci0JfQorCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RhbGlhcyk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBlbmQ7CiAKICAgICAgICAgLyoKICAgICAgICAgICogSWYgZGV2aWNlIGhhcyBfRUowLCAnZWplY3QnIGZpbGUgaXMgY3JlYXRlZCB0aGF0IGlzIHVzZWQgdG8gdHJpZ2dlcgpAQCAtMjU1LDExICsyMzIsOCBAQAogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2VqZWN0KTsKIAotCWlmIChkZXYtPmZsYWdzLmhhcmR3YXJlX2lkIHx8IGRldi0+ZmxhZ3MuY29tcGF0aWJsZV9pZHMpCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RhbGlhcyk7Ci0KLQlpZiAoZGV2LT5mbGFncy5oYXJkd2FyZV9pZCkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2hpZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX21vZGFsaWFzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaGlkKTsKIAlpZiAoZGV2LT5oYW5kbGUpCiAJCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9wYXRoKTsKIH0KQEAgLTI3MSw2ICsyNDUsNyBAQAogCQkJICBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkcykKIHsKIAljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkOworCXN0cnVjdCBhY3BpX2hhcmR3YXJlX2lkICpod2lkOwogCiAJLyoKIAkgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBwcmVzZW50LCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBsb2FkIGRldmljZQpAQCAtMjc5LDQwICsyNTQsMzAgQEAKIAlpZiAoIWRldmljZS0+c3RhdHVzLnByZXNlbnQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGRldmljZS0+ZmxhZ3MuaGFyZHdhcmVfaWQpIHsKLQkJZm9yIChpZCA9IGlkczsgaWQtPmlkWzBdOyBpZCsrKSB7Ci0JCQlpZiAoIXN0cmNtcCgoY2hhciopaWQtPmlkLCBkZXZpY2UtPnBucC5oYXJkd2FyZV9pZCkpCisJZm9yIChpZCA9IGlkczsgaWQtPmlkWzBdOyBpZCsrKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh3aWQsICZkZXZpY2UtPnBucC5pZHMsIGxpc3QpCisJCQlpZiAoIXN0cmNtcCgoY2hhciAqKSBpZC0+aWQsIGh3aWQtPmlkKSkKIAkJCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCWlmIChkZXZpY2UtPmZsYWdzLmNvbXBhdGlibGVfaWRzKSB7Ci0JCXN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkX2xpc3QgKmNpZF9saXN0ID0gZGV2aWNlLT5wbnAuY2lkX2xpc3Q7Ci0JCWludCBpOwotCi0JCWZvciAoaWQgPSBpZHM7IGlkLT5pZFswXTsgaWQrKykgewotCQkJLyogY29tcGFyZSBtdWx0aXBsZSBfQ0lEIGVudHJpZXMgYWdhaW5zdCBkcml2ZXIgaWRzICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgY2lkX2xpc3QtPmNvdW50OyBpKyspIHsKLQkJCQlpZiAoIXN0cmNtcCgoY2hhciopaWQtPmlkLAotCQkJCQkgICAgY2lkX2xpc3QtPmlkc1tpXS5zdHJpbmcpKQotCQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KIAogCXJldHVybiAtRU5PRU5UOwogfQogRVhQT1JUX1NZTUJPTChhY3BpX21hdGNoX2RldmljZV9pZHMpOwogCitzdGF0aWMgdm9pZCBhY3BpX2ZyZWVfaWRzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBhY3BpX2hhcmR3YXJlX2lkICppZCwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpZCwgdG1wLCAmZGV2aWNlLT5wbnAuaWRzLCBsaXN0KSB7CisJCWtmcmVlKGlkLT5pZCk7CisJCWtmcmVlKGlkKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSB0b19hY3BpX2RldmljZShkZXYpOwogCi0Ja2ZyZWUoYWNwaV9kZXYtPnBucC5jaWRfbGlzdCk7Ci0JaWYgKGFjcGlfZGV2LT5mbGFncy5oYXJkd2FyZV9pZCkKLQkJa2ZyZWUoYWNwaV9kZXYtPnBucC5oYXJkd2FyZV9pZCk7Ci0JaWYgKGFjcGlfZGV2LT5mbGFncy51bmlxdWVfaWQpCi0JCWtmcmVlKGFjcGlfZGV2LT5wbnAudW5pcXVlX2lkKTsKKwlhY3BpX2ZyZWVfaWRzKGFjcGlfZGV2KTsKIAlrZnJlZShhY3BpX2Rldik7CiB9CiAKQEAgLTM3OCwxNSArMzQzLDEzIEBACiBzdGF0aWMgaW50IGFjcGlfZGV2aWNlX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCWNoYXIgKmhpZDsKIAotCWhpZCA9IGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpOwotCWlmICghc3RyY21wKGhpZCwgQUNQSV9CVVRUT05fSElEX1BPV0VSRikpCisJaWYgKGRldmljZS0+ZGV2aWNlX3R5cGUgPT0gQUNQSV9CVVNfVFlQRV9QT1dFUl9CVVRUT04pCiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiwKIAkJCQkJCSAgICAgYWNwaV9kZXZpY2Vfbm90aWZ5X2ZpeGVkLAogCQkJCQkJICAgICBkZXZpY2UpOwotCWVsc2UgaWYgKCFzdHJjbXAoaGlkLCBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGKSkKKwllbHNlIGlmIChkZXZpY2UtPmRldmljZV90eXBlID09IEFDUElfQlVTX1RZUEVfU0xFRVBfQlVUVE9OKQogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9TTEVFUF9CVVRUT04sCiAJCQkJCQkgICAgIGFjcGlfZGV2aWNlX25vdGlmeV9maXhlZCwKQEAgLTQwNCwxMCArMzY3LDEwIEBACiAKIHN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpZiAoIXN0cmNtcChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgQUNQSV9CVVRUT05fSElEX1BPV0VSRikpCisJaWYgKGRldmljZS0+ZGV2aWNlX3R5cGUgPT0gQUNQSV9CVVNfVFlQRV9QT1dFUl9CVVRUT04pCiAJCWFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04sCiAJCQkJCQlhY3BpX2RldmljZV9ub3RpZnlfZml4ZWQpOwotCWVsc2UgaWYgKCFzdHJjbXAoYWNwaV9kZXZpY2VfaGlkKGRldmljZSksIEFDUElfQlVUVE9OX0hJRF9TTEVFUEYpKQorCWVsc2UgaWYgKGRldmljZS0+ZGV2aWNlX3R5cGUgPT0gQUNQSV9CVVNfVFlQRV9TTEVFUF9CVVRUT04pCiAJCWFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9TTEVFUF9CVVRUT04sCiAJCQkJCQlhY3BpX2RldmljZV9ub3RpZnlfZml4ZWQpOwogCWVsc2UKQEAgLTQ3NCwxMiArNDM3LDEyIEBACiAJLnVldmVudAkJPSBhY3BpX2RldmljZV91ZXZlbnQsCiB9OwogCi1zdGF0aWMgaW50IGFjcGlfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAotCQkJCSBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCkKK3N0YXRpYyBpbnQgYWNwaV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2VfYnVzX2lkICphY3BpX2RldmljZV9idXNfaWQsICpuZXdfYnVzX2lkOwogCWludCBmb3VuZCA9IDA7CisKIAkvKgogCSAqIExpbmthZ2UKIAkgKiAtLS0tLS0tCkBAIC01MDEsOCArNDY0LDkgQEAKIAkgKiBJZiBmYWlsZWQsIGNyZWF0ZSBvbmUgYW5kIGxpbmsgaXQgaW50byBhY3BpX2J1c19pZF9saXN0CiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhY3BpX2RldmljZV9idXNfaWQsICZhY3BpX2J1c19pZF9saXN0LCBub2RlKSB7Ci0JCWlmKCFzdHJjbXAoYWNwaV9kZXZpY2VfYnVzX2lkLT5idXNfaWQsIGRldmljZS0+ZmxhZ3MuaGFyZHdhcmVfaWQ/IGRldmljZS0+cG5wLmhhcmR3YXJlX2lkIDogImRldmljZSIpKSB7Ci0JCQlhY3BpX2RldmljZV9idXNfaWQtPmluc3RhbmNlX25vICsrOworCQlpZiAoIXN0cmNtcChhY3BpX2RldmljZV9idXNfaWQtPmJ1c19pZCwKKwkJCSAgICBhY3BpX2RldmljZV9oaWQoZGV2aWNlKSkpIHsKKwkJCWFjcGlfZGV2aWNlX2J1c19pZC0+aW5zdGFuY2Vfbm8rKzsKIAkJCWZvdW5kID0gMTsKIAkJCWtmcmVlKG5ld19idXNfaWQpOwogCQkJYnJlYWs7CkBAIC01MTAsNyArNDc0LDcgQEAKIAl9CiAJaWYgKCFmb3VuZCkgewogCQlhY3BpX2RldmljZV9idXNfaWQgPSBuZXdfYnVzX2lkOwotCQlzdHJjcHkoYWNwaV9kZXZpY2VfYnVzX2lkLT5idXNfaWQsIGRldmljZS0+ZmxhZ3MuaGFyZHdhcmVfaWQgPyBkZXZpY2UtPnBucC5oYXJkd2FyZV9pZCA6ICJkZXZpY2UiKTsKKwkJc3RyY3B5KGFjcGlfZGV2aWNlX2J1c19pZC0+YnVzX2lkLCBhY3BpX2RldmljZV9oaWQoZGV2aWNlKSk7CiAJCWFjcGlfZGV2aWNlX2J1c19pZC0+aW5zdGFuY2Vfbm8gPSAwOwogCQlsaXN0X2FkZF90YWlsKCZhY3BpX2RldmljZV9idXNfaWQtPm5vZGUsICZhY3BpX2J1c19pZF9saXN0KTsKIAl9CkBAIC01MjQsNyArNDg4LDcgQEAKIAltdXRleF91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCiAJaWYgKGRldmljZS0+cGFyZW50KQotCQlkZXZpY2UtPmRldi5wYXJlbnQgPSAmcGFyZW50LT5kZXY7CisJCWRldmljZS0+ZGV2LnBhcmVudCA9ICZkZXZpY2UtPnBhcmVudC0+ZGV2OwogCWRldmljZS0+ZGV2LmJ1cyA9ICZhY3BpX2J1c190eXBlOwogCWRldmljZS0+ZGV2LnJlbGVhc2UgPSAmYWNwaV9kZXZpY2VfcmVsZWFzZTsKIAlyZXN1bHQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldmljZS0+ZGV2KTsKQEAgLTY2NCw2ICs2MjgsMzMgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgRW51bWVyYXRpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2J1c19nZXRfcGFyZW50KGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKKworCS8qCisJICogRml4ZWQgaGFyZHdhcmUgZGV2aWNlcyBkbyBub3QgYXBwZWFyIGluIHRoZSBuYW1lc3BhY2UgYW5kIGRvIG5vdAorCSAqIGhhdmUgaGFuZGxlcywgYnV0IHdlIGZhYnJpY2F0ZSBhY3BpX2RldmljZXMgZm9yIHRoZW0sIHNvIHdlIGhhdmUKKwkgKiB0byBkZWFsIHdpdGggdGhlbSBzcGVjaWFsbHkuCisJICovCisJaWYgKGhhbmRsZSA9PSBOVUxMKQorCQlyZXR1cm4gYWNwaV9yb290OworCisJZG8geworCQlzdGF0dXMgPSBhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmaGFuZGxlKTsKKwkJaWYgKHN0YXR1cyA9PSBBRV9OVUxMX0VOVFJZKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCXJldHVybiBhY3BpX3Jvb3Q7CisKKwkJcmV0ID0gYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpOworCQlpZiAocmV0ID09IDApCisJCQlyZXR1cm4gZGV2aWNlOworCX0gd2hpbGUgKDEpOworfQorCiBhY3BpX3N0YXR1cwogYWNwaV9idXNfZ2V0X2VqZChhY3BpX2hhbmRsZSBoYW5kbGUsIGFjcGlfaGFuZGxlICplamQpCiB7CkBAIC04NzYsMTEgKzg2Nyw2IEBACiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlkZXZpY2UtPmZsYWdzLmR5bmFtaWNfc3RhdHVzID0gMTsKIAotCS8qIFByZXNlbmNlIG9mIF9DSUQgaW5kaWNhdGVzICdjb21wYXRpYmxlX2lkcycgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfQ0lEIiwgJnRlbXApOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKLQkJZGV2aWNlLT5mbGFncy5jb21wYXRpYmxlX2lkcyA9IDE7Ci0KIAkvKiBQcmVzZW5jZSBvZiBfUk1WIGluZGljYXRlcyAncmVtb3ZhYmxlJyAqLwogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9STVYiLCAmdGVtcCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQpAQCAtOTE4LDggKzkwNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX2dldF9idXNpZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKLQkJCQkgIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpCitzdGF0aWMgdm9pZCBhY3BpX2RldmljZV9nZXRfYnVzaWQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJY2hhciBidXNfaWRbNV0gPSB7ICc/JywgMCB9OwogCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IHNpemVvZihidXNfaWQpLCBidXNfaWQgfTsKQEAgLTkzMSwxMCArOTE2LDEyIEBACiAJICogVGhlIGRldmljZSdzIEJ1cyBJRCBpcyBzaW1wbHkgdGhlIG9iamVjdCBuYW1lLgogCSAqIFRCRDogU2hvdWxkbid0IHRoaXMgdmFsdWUgYmUgdW5pcXVlICh3aXRoaW4gdGhlIEFDUEkgbmFtZXNwYWNlKT8KIAkgKi8KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFDUElfQlVTX1RZUEVfU1lTVEVNOgorCWlmIChBQ1BJX0lTX1JPT1RfREVWSUNFKGRldmljZSkpIHsKIAkJc3RyY3B5KGRldmljZS0+cG5wLmJ1c19pZCwgIkFDUEkiKTsKLQkJYnJlYWs7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGRldmljZS0+ZGV2aWNlX3R5cGUpIHsKIAljYXNlIEFDUElfQlVTX1RZUEVfUE9XRVJfQlVUVE9OOgogCQlzdHJjcHkoZGV2aWNlLT5wbnAuYnVzX2lkLCAiUFdSRiIpOwogCQlicmVhazsKQEAgLTk0Miw3ICs5MjksNyBAQAogCQlzdHJjcHkoZGV2aWNlLT5wbnAuYnVzX2lkLCAiU0xQRiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9TSU5HTEVfTkFNRSwgJmJ1ZmZlcik7CisJCWFjcGlfZ2V0X25hbWUoZGV2aWNlLT5oYW5kbGUsIEFDUElfU0lOR0xFX05BTUUsICZidWZmZXIpOwogCQkvKiBDbGVhbiB1cCB0cmFpbGluZyB1bmRlcnNjb3JlcyAoaWYgYW55KSAqLwogCQlmb3IgKGkgPSAzOyBpID4gMTsgaS0tKSB7CiAJCQlpZiAoYnVzX2lkW2ldID09ICdfJykKQEAgLTEwMDAsMjA0ICs5ODcsMTM0IEBACiAJcmV0dXJuIGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9EQ0siLCAmdG1wKTsKIH0KIAotc3RhdGljIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkX2xpc3QqCi1hY3BpX2FkZF9jaWQoCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gICAgICAgICAqaW5mbywKLQlzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZCAgICAgICAgICpuZXdfY2lkKQorY2hhciAqYWNwaV9kZXZpY2VfaGlkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkX2xpc3QgICAgKmNpZDsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0X2lkX3N0cmluZzsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGNpZF9sZW5ndGg7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBuZXdfY2lkX2xlbmd0aDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisJc3RydWN0IGFjcGlfaGFyZHdhcmVfaWQgKmhpZDsKIAorCWhpZCA9IGxpc3RfZmlyc3RfZW50cnkoJmRldmljZS0+cG5wLmlkcywgc3RydWN0IGFjcGlfaGFyZHdhcmVfaWQsIGxpc3QpOworCXJldHVybiBoaWQtPmlkOworfQorRVhQT1JUX1NZTUJPTChhY3BpX2RldmljZV9oaWQpOwogCi0JLyogQWxsb2NhdGUgbmV3IENJRCBsaXN0IHdpdGggcm9vbSBmb3IgdGhlIG5ldyBDSUQgKi8KK3N0YXRpYyB2b2lkIGFjcGlfYWRkX2lkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpkZXZfaWQpCit7CisJc3RydWN0IGFjcGlfaGFyZHdhcmVfaWQgKmlkOwogCi0JaWYgKCFuZXdfY2lkKQotCQluZXdfY2lkX2xlbmd0aCA9IGluZm8tPmNvbXBhdGlibGVfaWRfbGlzdC5saXN0X3NpemU7Ci0JZWxzZSBpZiAoaW5mby0+Y29tcGF0aWJsZV9pZF9saXN0Lmxpc3Rfc2l6ZSkKLQkJbmV3X2NpZF9sZW5ndGggPSBpbmZvLT5jb21wYXRpYmxlX2lkX2xpc3QubGlzdF9zaXplICsKLQkJCW5ld19jaWQtPmxlbmd0aCArIHNpemVvZihzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZCk7Ci0JZWxzZQotCQluZXdfY2lkX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZF9saXN0KSArIG5ld19jaWQtPmxlbmd0aDsKKwlpZCA9IGttYWxsb2Moc2l6ZW9mKCppZCksIEdGUF9LRVJORUwpOworCWlmICghaWQpCisJCXJldHVybjsKIAotCWNpZCA9IEFDUElfQUxMT0NBVEVfWkVST0VEKG5ld19jaWRfbGVuZ3RoKTsKLQlpZiAoIWNpZCkgewotCQlyZXR1cm4gTlVMTDsKKwlpZC0+aWQgPSBrbWFsbG9jKHN0cmxlbihkZXZfaWQpICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZC0+aWQpIHsKKwkJa2ZyZWUoaWQpOworCQlyZXR1cm47CiAJfQogCi0JY2lkLT5saXN0X3NpemUgPSBuZXdfY2lkX2xlbmd0aDsKLQljaWQtPmNvdW50ID0gaW5mby0+Y29tcGF0aWJsZV9pZF9saXN0LmNvdW50OwotCWlmIChuZXdfY2lkKQotCQljaWQtPmNvdW50Kys7Ci0JbmV4dF9pZF9zdHJpbmcgPSAoY2hhciAqKSBjaWQtPmlkcyArIChjaWQtPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkKSk7Ci0KLQkvKiBDb3B5IGFsbCBleGlzdGluZyBDSURzICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+Y29tcGF0aWJsZV9pZF9saXN0LmNvdW50OyBpKyspIHsKLQkJY2lkX2xlbmd0aCA9IGluZm8tPmNvbXBhdGlibGVfaWRfbGlzdC5pZHNbaV0ubGVuZ3RoOwotCQljaWQtPmlkc1tpXS5zdHJpbmcgPSBuZXh0X2lkX3N0cmluZzsKLQkJY2lkLT5pZHNbaV0ubGVuZ3RoID0gY2lkX2xlbmd0aDsKLQotCQlBQ1BJX01FTUNQWShuZXh0X2lkX3N0cmluZywgaW5mby0+Y29tcGF0aWJsZV9pZF9saXN0Lmlkc1tpXS5zdHJpbmcsCi0JCQljaWRfbGVuZ3RoKTsKLQotCQluZXh0X2lkX3N0cmluZyArPSBjaWRfbGVuZ3RoOwotCX0KLQotCS8qIEFwcGVuZCB0aGUgbmV3IENJRCAqLwotCi0JaWYgKG5ld19jaWQpIHsKLQkJY2lkLT5pZHNbaV0uc3RyaW5nID0gbmV4dF9pZF9zdHJpbmc7Ci0JCWNpZC0+aWRzW2ldLmxlbmd0aCA9IG5ld19jaWQtPmxlbmd0aDsKLQotCQlBQ1BJX01FTUNQWShuZXh0X2lkX3N0cmluZywgbmV3X2NpZC0+c3RyaW5nLCBuZXdfY2lkLT5sZW5ndGgpOwotCX0KLQotCXJldHVybiBjaWQ7CisJc3RyY3B5KGlkLT5pZCwgZGV2X2lkKTsKKwlsaXN0X2FkZF90YWlsKCZpZC0+bGlzdCwgJmRldmljZS0+cG5wLmlkcyk7CiB9CiAKLXN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3NldF9pZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKLQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwgYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJICAgICAgIGludCB0eXBlKQorc3RhdGljIHZvaWQgYWNwaV9kZXZpY2Vfc2V0X2lkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvID0gTlVMTDsKLQljaGFyICpoaWQgPSBOVUxMOwotCWNoYXIgKnVpZCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGljYV9kZXZpY2VfaWRfbGlzdCAqY2lkX2xpc3QgPSBOVUxMOwotCWNoYXIgKmNpZF9hZGQgPSBOVUxMOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZF9saXN0ICpjaWRfbGlzdDsKKwlpbnQgaTsKIAotCXN3aXRjaCAodHlwZSkgeworCXN3aXRjaCAoZGV2aWNlLT5kZXZpY2VfdHlwZSkgewogCWNhc2UgQUNQSV9CVVNfVFlQRV9ERVZJQ0U6Ci0JCXN0YXR1cyA9IGFjcGlfZ2V0X29iamVjdF9pbmZvKGhhbmRsZSwgJmluZm8pOworCQlpZiAoQUNQSV9JU19ST09UX0RFVklDRShkZXZpY2UpKSB7CisJCQlhY3BpX2FkZF9pZChkZXZpY2UsIEFDUElfU1lTVEVNX0hJRCk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChBQ1BJX0lTX1JPT1RfREVWSUNFKGRldmljZS0+cGFyZW50KSkgeworCQkJLyogXF9TQl8sIHRoZSBvbmx5IHJvb3QtbGV2ZWwgbmFtZXNwYWNlIGRldmljZSAqLworCQkJYWNwaV9hZGRfaWQoZGV2aWNlLCBBQ1BJX0JVU19ISUQpOworCQkJc3RyY3B5KGRldmljZS0+cG5wLmRldmljZV9uYW1lLCBBQ1BJX0JVU19ERVZJQ0VfTkFNRSk7CisJCQlzdHJjcHkoZGV2aWNlLT5wbnAuZGV2aWNlX2NsYXNzLCBBQ1BJX0JVU19DTEFTUyk7CisJCQlicmVhazsKKwkJfQorCisJCXN0YXR1cyA9IGFjcGlfZ2V0X29iamVjdF9pbmZvKGRldmljZS0+aGFuZGxlLCAmaW5mbyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiJXM6IEVycm9yIHJlYWRpbmcgZGV2aWNlIGluZm9cbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCiAJCWlmIChpbmZvLT52YWxpZCAmIEFDUElfVkFMSURfSElEKQotCQkJaGlkID0gaW5mby0+aGFyZHdhcmVfaWQuc3RyaW5nOwotCQlpZiAoaW5mby0+dmFsaWQgJiBBQ1BJX1ZBTElEX1VJRCkKLQkJCXVpZCA9IGluZm8tPnVuaXF1ZV9pZC5zdHJpbmc7Ci0JCWlmIChpbmZvLT52YWxpZCAmIEFDUElfVkFMSURfQ0lEKQorCQkJYWNwaV9hZGRfaWQoZGV2aWNlLCBpbmZvLT5oYXJkd2FyZV9pZC5zdHJpbmcpOworCQlpZiAoaW5mby0+dmFsaWQgJiBBQ1BJX1ZBTElEX0NJRCkgewogCQkJY2lkX2xpc3QgPSAmaW5mby0+Y29tcGF0aWJsZV9pZF9saXN0OworCQkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKQorCQkJCWFjcGlfYWRkX2lkKGRldmljZSwgY2lkX2xpc3QtPmlkc1tpXS5zdHJpbmcpOworCQl9CiAJCWlmIChpbmZvLT52YWxpZCAmIEFDUElfVkFMSURfQURSKSB7CiAJCQlkZXZpY2UtPnBucC5idXNfYWRkcmVzcyA9IGluZm8tPmFkZHJlc3M7CiAJCQlkZXZpY2UtPmZsYWdzLmJ1c19hZGRyZXNzID0gMTsKIAkJfQogCi0JCS8qIElmIHdlIGhhdmUgYSB2aWRlby9iYXkvZG9jayBkZXZpY2UsIGFkZCBvdXIgc2VsZmRlZmluZWQKLQkJICAgSElEIHRvIHRoZSBDSUQgbGlzdC4gTGlrZSB0aGF0IHRoZSB2aWRlby9iYXkvZG9jayBkcml2ZXJzCi0JCSAgIHdpbGwgZ2V0IGF1dG9sb2FkZWQgYW5kIHRoZSBkZXZpY2UgbWlnaHQgc3RpbGwgbWF0Y2gKLQkJICAgYWdhaW5zdCBhbm90aGVyIGRyaXZlci4KLQkJKi8KKwkJa2ZyZWUoaW5mbyk7CisKKwkJLyoKKwkJICogU29tZSBkZXZpY2VzIGRvbid0IHJlbGlhYmx5IGhhdmUgX0hJRHMgJiBfQ0lEcywgc28gYWRkCisJCSAqIHN5bnRoZXRpYyBISURzIHRvIG1ha2Ugc3VyZSBkcml2ZXJzIGNhbiBmaW5kIHRoZW0uCisJCSAqLwogCQlpZiAoYWNwaV9pc192aWRlb19kZXZpY2UoZGV2aWNlKSkKLQkJCWNpZF9hZGQgPSBBQ1BJX1ZJREVPX0hJRDsKKwkJCWFjcGlfYWRkX2lkKGRldmljZSwgQUNQSV9WSURFT19ISUQpOwogCQllbHNlIGlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9iYXlfbWF0Y2goZGV2aWNlKSkpCi0JCQljaWRfYWRkID0gQUNQSV9CQVlfSElEOworCQkJYWNwaV9hZGRfaWQoZGV2aWNlLCBBQ1BJX0JBWV9ISUQpOwogCQllbHNlIGlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9kb2NrX21hdGNoKGRldmljZSkpKQotCQkJY2lkX2FkZCA9IEFDUElfRE9DS19ISUQ7CisJCQlhY3BpX2FkZF9pZChkZXZpY2UsIEFDUElfRE9DS19ISUQpOwogCiAJCWJyZWFrOwogCWNhc2UgQUNQSV9CVVNfVFlQRV9QT1dFUjoKLQkJaGlkID0gQUNQSV9QT1dFUl9ISUQ7CisJCWFjcGlfYWRkX2lkKGRldmljZSwgQUNQSV9QT1dFUl9ISUQpOwogCQlicmVhazsKIAljYXNlIEFDUElfQlVTX1RZUEVfUFJPQ0VTU09SOgotCQloaWQgPSBBQ1BJX1BST0NFU1NPUl9PQkpFQ1RfSElEOwotCQlicmVhazsKLQljYXNlIEFDUElfQlVTX1RZUEVfU1lTVEVNOgotCQloaWQgPSBBQ1BJX1NZU1RFTV9ISUQ7CisJCWFjcGlfYWRkX2lkKGRldmljZSwgQUNQSV9QUk9DRVNTT1JfT0JKRUNUX0hJRCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9CVVNfVFlQRV9USEVSTUFMOgotCQloaWQgPSBBQ1BJX1RIRVJNQUxfSElEOworCQlhY3BpX2FkZF9pZChkZXZpY2UsIEFDUElfVEhFUk1BTF9ISUQpOwogCQlicmVhazsKIAljYXNlIEFDUElfQlVTX1RZUEVfUE9XRVJfQlVUVE9OOgotCQloaWQgPSBBQ1BJX0JVVFRPTl9ISURfUE9XRVJGOworCQlhY3BpX2FkZF9pZChkZXZpY2UsIEFDUElfQlVUVE9OX0hJRF9QT1dFUkYpOwogCQlicmVhazsKIAljYXNlIEFDUElfQlVTX1RZUEVfU0xFRVBfQlVUVE9OOgotCQloaWQgPSBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGOworCQlhY3BpX2FkZF9pZChkZXZpY2UsIEFDUElfQlVUVE9OX0hJRF9TTEVFUEYpOwogCQlicmVhazsKIAl9CiAKIAkvKgotCSAqIFxfU0IKLQkgKiAtLS0tCi0JICogRml4IGZvciB0aGUgc3lzdGVtIHJvb3QgYnVzIGRldmljZSAtLSB0aGUgb25seSByb290LWxldmVsIGRldmljZS4KKwkgKiBXZSBidWlsZCBhY3BpX2RldmljZXMgZm9yIHNvbWUgb2JqZWN0cyB0aGF0IGRvbid0IGhhdmUgX0hJRCBvciBfQ0lELAorCSAqIGUuZy4sIFBDSSBicmlkZ2VzIGFuZCBzbG90cy4gIERyaXZlcnMgY2FuJ3QgYmluZCB0byB0aGVzZSBvYmplY3RzLAorCSAqIGJ1dCB3ZSBkbyB1c2UgdGhlbSBpbmRpcmVjdGx5IGJ5IHRyYXZlcnNpbmcgdGhlIGFjcGlfZGV2aWNlIHRyZWUuCisJICogVGhpcyBnZW5lcmljIElEIGlzbid0IHVzZWZ1bCBmb3IgZHJpdmVyIGJpbmRpbmcsIGJ1dCBpdCBwcm92aWRlcworCSAqIHRoZSB1c2VmdWwgcHJvcGVydHkgdGhhdCAiZXZlcnkgYWNwaV9kZXZpY2UgaGFzIGFuIElELiIKIAkgKi8KLQlpZiAoKChhY3BpX2hhbmRsZSlwYXJlbnQgPT0gQUNQSV9ST09UX09CSkVDVCkgJiYgKHR5cGUgPT0gQUNQSV9CVVNfVFlQRV9ERVZJQ0UpKSB7Ci0JCWhpZCA9IEFDUElfQlVTX0hJRDsKLQkJc3RyY3B5KGRldmljZS0+cG5wLmRldmljZV9uYW1lLCBBQ1BJX0JVU19ERVZJQ0VfTkFNRSk7Ci0JCXN0cmNweShkZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsIEFDUElfQlVTX0NMQVNTKTsKLQl9Ci0KLQlpZiAoaGlkKSB7Ci0JCWRldmljZS0+cG5wLmhhcmR3YXJlX2lkID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc3RybGVuIChoaWQpICsgMSk7Ci0JCWlmIChkZXZpY2UtPnBucC5oYXJkd2FyZV9pZCkgewotCQkJc3RyY3B5KGRldmljZS0+cG5wLmhhcmR3YXJlX2lkLCBoaWQpOwotCQkJZGV2aWNlLT5mbGFncy5oYXJkd2FyZV9pZCA9IDE7Ci0JCX0KLQl9Ci0JaWYgKCFkZXZpY2UtPmZsYWdzLmhhcmR3YXJlX2lkKQotCQlkZXZpY2UtPnBucC5oYXJkd2FyZV9pZCA9ICIiOwotCi0JaWYgKHVpZCkgewotCQlkZXZpY2UtPnBucC51bmlxdWVfaWQgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzdHJsZW4gKHVpZCkgKyAxKTsKLQkJaWYgKGRldmljZS0+cG5wLnVuaXF1ZV9pZCkgewotCQkJc3RyY3B5KGRldmljZS0+cG5wLnVuaXF1ZV9pZCwgdWlkKTsKLQkJCWRldmljZS0+ZmxhZ3MudW5pcXVlX2lkID0gMTsKLQkJfQotCX0KLQlpZiAoIWRldmljZS0+ZmxhZ3MudW5pcXVlX2lkKQotCQlkZXZpY2UtPnBucC51bmlxdWVfaWQgPSAiIjsKLQotCWlmIChjaWRfbGlzdCB8fCBjaWRfYWRkKSB7Ci0JCXN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkX2xpc3QgKmxpc3Q7Ci0KLQkJaWYgKGNpZF9hZGQpIHsKLQkJCXN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkIGNpZDsKLQkJCWNpZC5sZW5ndGggPSBzdHJsZW4gKGNpZF9hZGQpICsgMTsKLQkJCWNpZC5zdHJpbmcgPSBjaWRfYWRkOwotCi0JCQlsaXN0ID0gYWNwaV9hZGRfY2lkKGluZm8sICZjaWQpOwotCQl9IGVsc2UgewotCQkJbGlzdCA9IGFjcGlfYWRkX2NpZChpbmZvLCBOVUxMKTsKLQkJfQotCi0JCWlmIChsaXN0KSB7Ci0JCQlkZXZpY2UtPnBucC5jaWRfbGlzdCA9IGxpc3Q7Ci0JCQlpZiAoY2lkX2FkZCkKLQkJCQlkZXZpY2UtPmZsYWdzLmNvbXBhdGlibGVfaWRzID0gMTsKLQkJfQotCX0KLQotCWtmcmVlKGluZm8pOworCWlmIChsaXN0X2VtcHR5KCZkZXZpY2UtPnBucC5pZHMpKQorCQlhY3BpX2FkZF9pZChkZXZpY2UsICJkZXZpY2UiKTsKIH0KIAotc3RhdGljIGludCBhY3BpX2RldmljZV9zZXRfY29udGV4dChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCitzdGF0aWMgaW50IGFjcGlfZGV2aWNlX3NldF9jb250ZXh0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwogCS8qCiAJICogQ29udGV4dAogCSAqIC0tLS0tLS0KIAkgKiBBdHRhY2ggdGhpcyAnc3RydWN0IGFjcGlfZGV2aWNlJyB0byB0aGUgQUNQSSBvYmplY3QuICBUaGlzIG1ha2VzCi0JICogcmVzb2x1dGlvbnMgZnJvbSBoYW5kbGUtPmRldmljZSB2ZXJ5IGVmZmljaWVudC4gIE5vdGUgdGhhdCB3ZSBuZWVkCi0JICogdG8gYmUgY2FyZWZ1bCB3aXRoIGZpeGVkLWZlYXR1cmUgZGV2aWNlcyBhcyB0aGV5IGFsbCBhdHRhY2ggdG8gdGhlCi0JICogcm9vdCBvYmplY3QuCisJICogcmVzb2x1dGlvbnMgZnJvbSBoYW5kbGUtPmRldmljZSB2ZXJ5IGVmZmljaWVudC4gIEZpeGVkIGhhcmR3YXJlCisJICogZGV2aWNlcyBoYXZlIG5vIGhhbmRsZXMsIHNvIHdlIHNraXAgdGhlbS4KIAkgKi8KLQlpZiAodHlwZSAhPSBBQ1BJX0JVU19UWVBFX1BPV0VSX0JVVFRPTiAmJgotCSAgICB0eXBlICE9IEFDUElfQlVTX1RZUEVfU0xFRVBfQlVUVE9OKSB7Ci0JCXN0YXR1cyA9IGFjcGlfYXR0YWNoX2RhdGEoZGV2aWNlLT5oYW5kbGUsCi0JCQkJCSAgYWNwaV9idXNfZGF0YV9oYW5kbGVyLCBkZXZpY2UpOworCWlmICghZGV2aWNlLT5oYW5kbGUpCisJCXJldHVybiAwOwogCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgYXR0YWNoaW5nIGRldmljZSBkYXRhXG4iKTsKLQkJCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKwlzdGF0dXMgPSBhY3BpX2F0dGFjaF9kYXRhKGRldmljZS0+aGFuZGxlLAorCQkJCSAgYWNwaV9idXNfZGF0YV9oYW5kbGVyLCBkZXZpY2UpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBhdHRhY2hpbmcgZGV2aWNlIGRhdGFcbiIpOworCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgaW50IGFjcGlfYnVzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiwgaW50IHJtZGV2aWNlKQpAQCAtMTIyMywxNyArMTE0MCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2FkZF9zaW5nbGVfb2JqZWN0KHN0cnVjdCBhY3BpX2RldmljZSAqKmNoaWxkLAotCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQsIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUsCi0JCQlzdHJ1Y3QgYWNwaV9idXNfb3BzICpvcHMpCitzdGF0aWMgaW50IGFjcGlfYWRkX3NpbmdsZV9vYmplY3Qoc3RydWN0IGFjcGlfZGV2aWNlICoqY2hpbGQsCisJCQkJICBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsb25nIHN0YSwKKwkJCQkgIHN0cnVjdCBhY3BpX2J1c19vcHMgKm9wcykKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7Ci0KLQotCWlmICghY2hpbGQpCi0JCXJldHVybiAtRUlOVkFMOworCWludCByZXN1bHQ7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAogCWRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghZGV2aWNlKSB7CkBAIC0xMjQxLDc1ICsxMTU1LDMxIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnBucC5pZHMpOworCWRldmljZS0+ZGV2aWNlX3R5cGUgPSB0eXBlOwogCWRldmljZS0+aGFuZGxlID0gaGFuZGxlOwotCWRldmljZS0+cGFyZW50ID0gcGFyZW50OworCWRldmljZS0+cGFyZW50ID0gYWNwaV9idXNfZ2V0X3BhcmVudChoYW5kbGUpOwogCWRldmljZS0+YnVzX29wcyA9ICpvcHM7IC8qIHdvcmtyb3VuZCBmb3Igbm90IGNhbGwgLnN0YXJ0ICovCisJU1RSVUNUX1RPX0lOVChkZXZpY2UtPnN0YXR1cykgPSBzdGE7CiAKLQotCWFjcGlfZGV2aWNlX2dldF9idXNpZChkZXZpY2UsIGhhbmRsZSwgdHlwZSk7CisJYWNwaV9kZXZpY2VfZ2V0X2J1c2lkKGRldmljZSk7CiAKIAkvKgogCSAqIEZsYWdzCiAJICogLS0tLS0KLQkgKiBHZXQgcHJpb3IgdG8gY2FsbGluZyBhY3BpX2J1c19nZXRfc3RhdHVzKCkgc28gd2Uga25vdyB3aGV0aGVyCi0JICogb3Igbm90IF9TVEEgaXMgcHJlc2VudC4gIE5vdGUgdGhhdCB3ZSBvbmx5IGxvb2sgZm9yIG9iamVjdAotCSAqIGhhbmRsZXMgLS0gY2Fubm90IGV2YWx1YXRlIG9iamVjdHMgdW50aWwgd2Uga25vdyB0aGUgZGV2aWNlIGlzCi0JICogcHJlc2VudCBhbmQgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisJICogTm90ZSB0aGF0IHdlIG9ubHkgbG9vayBmb3Igb2JqZWN0IGhhbmRsZXMgLS0gY2Fubm90IGV2YWx1YXRlIG9iamVjdHMKKwkgKiB1bnRpbCB3ZSBrbm93IHRoZSBkZXZpY2UgaXMgcHJlc2VudCBhbmQgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCiAJICovCiAJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X2ZsYWdzKGRldmljZSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CiAKIAkvKgotCSAqIFN0YXR1cwotCSAqIC0tLS0tLQotCSAqIFNlZSBpZiB0aGUgZGV2aWNlIGlzIHByZXNlbnQuICBXZSBhbHdheXMgYXNzdW1lIHRoYXQgbm9uLURldmljZQotCSAqIGFuZCBub24tUHJvY2Vzc29yIG9iamVjdHMgKGUuZy4gdGhlcm1hbCB6b25lcywgcG93ZXIgcmVzb3VyY2VzLAotCSAqIGV0Yy4pIGFyZSBwcmVzZW50LCBmdW5jdGlvbmluZywgZXRjLiAoYXQgbGVhc3Qgd2hlbiBwYXJlbnQgb2JqZWN0Ci0JICogaXMgcHJlc2VudCkuICBOb3RlIHRoYXQgX1NUQSBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3Igc29tZQotCSAqIG9iamVjdHMgKGUuZy4gcG93ZXIgcmVzb3VyY2VzKSBzbyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgaG93IHdlIHVzZQotCSAqIGl0LgotCSAqLwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNQSV9CVVNfVFlQRV9QUk9DRVNTT1I6Ci0JY2FzZSBBQ1BJX0JVU19UWVBFX0RFVklDRToKLQkJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3N0YXR1cyhkZXZpY2UpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHJlc3VsdCkpIHsKLQkJCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQkvKgotCQkgKiBXaGVuIHRoZSBkZXZpY2UgaXMgbmVpdGhlciBwcmVzZW50IG5vciBmdW5jdGlvbmFsLCB0aGUKLQkJICogZGV2aWNlIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gTGludXggQUNQSSBkZXZpY2UgdHJlZS4KLQkJICogV2hlbiB0aGUgc3RhdHVzIG9mIHRoZSBkZXZpY2UgaXMgbm90IHByZXNlbnQgYnV0IGZ1bmN0aW5hbCwKLQkJICogaXQgc2hvdWxkIGJlIGFkZGVkIHRvIExpbnV4IEFDUEkgdHJlZS4gRm9yIGV4YW1wbGUgOiBiYXkKLQkJICogZGV2aWNlICwgZG9jayBkZXZpY2UuCi0JCSAqIEluIHN1Y2ggY29uZGl0aW9ucyBpdCBpcyB1bm5jZXNzYXJ5IHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMKLQkJICogYmF5IGRldmljZSBvciBkb2NrIGRldmljZS4KLQkJICovCi0JCWlmICghZGV2aWNlLT5zdGF0dXMucHJlc2VudCAmJiAhZGV2aWNlLT5zdGF0dXMuZnVuY3Rpb25hbCkgewotCQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpID0KLQkJICAgIEFDUElfU1RBX0RFVklDRV9QUkVTRU5UIHwgQUNQSV9TVEFfREVWSUNFX0VOQUJMRUQgfAotCQkgICAgQUNQSV9TVEFfREVWSUNFX1VJICAgICAgfCBBQ1BJX1NUQV9ERVZJQ0VfRlVOQ1RJT05JTkc7Ci0JCWJyZWFrOwotCX0KLQotCS8qCiAJICogSW5pdGlhbGl6ZSBEZXZpY2UKIAkgKiAtLS0tLS0tLS0tLS0tLS0tLQogCSAqIFRCRDogU3luY2ggd2l0aCBDb3JlJ3MgZW51bWVyYXRpb24vaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4KIAkgKi8KLQotCS8qCi0JICogSGFyZHdhcmUgSUQsIFVuaXF1ZSBJRCwgJiBCdXMgQWRkcmVzcwotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlhY3BpX2RldmljZV9zZXRfaWQoZGV2aWNlLCBwYXJlbnQsIGhhbmRsZSwgdHlwZSk7CisJYWNwaV9kZXZpY2Vfc2V0X2lkKGRldmljZSk7CiAKIAkvKgogCSAqIFBvd2VyIE1hbmFnZW1lbnQKQEAgLTEzNDEsMTAgKzEyMTEsMTAgQEAKIAkJCWdvdG8gZW5kOwogCX0KIAotCWlmICgocmVzdWx0ID0gYWNwaV9kZXZpY2Vfc2V0X2NvbnRleHQoZGV2aWNlLCB0eXBlKSkpCisJaWYgKChyZXN1bHQgPSBhY3BpX2RldmljZV9zZXRfY29udGV4dChkZXZpY2UpKSkKIAkJZ290byBlbmQ7CiAKLQlyZXN1bHQgPSBhY3BpX2RldmljZV9yZWdpc3RlcihkZXZpY2UsIHBhcmVudCk7CisJcmVzdWx0ID0gYWNwaV9kZXZpY2VfcmVnaXN0ZXIoZGV2aWNlKTsKIAogCS8qCiAJICogQmluZCBfQURSLUJhc2VkIERldmljZXMgd2hlbiBob3QgYWRkCkBAIC0xMzU1LDE2NSArMTIyNSwxNDMgQEAKIAl9CiAKIGVuZDoKLQlpZiAoIXJlc3VsdCkKKwlpZiAoIXJlc3VsdCkgeworCQlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJIkFkZGluZyAlcyBbJXNdIHBhcmVudCAlc1xuIiwgZGV2X25hbWUoJmRldmljZS0+ZGV2KSwKKwkJCSAoY2hhciAqKSBidWZmZXIucG9pbnRlciwKKwkJCSBkZXZpY2UtPnBhcmVudCA/IGRldl9uYW1lKCZkZXZpY2UtPnBhcmVudC0+ZGV2KSA6CisJCQkJCSAgIihudWxsKSIpKTsKKwkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCQkqY2hpbGQgPSBkZXZpY2U7Ci0JZWxzZQorCX0gZWxzZQogCQlhY3BpX2RldmljZV9yZWxlYXNlKCZkZXZpY2UtPmRldik7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IGFjcGlfYnVzX3NjYW4oc3RydWN0IGFjcGlfZGV2aWNlICpzdGFydCwgc3RydWN0IGFjcGlfYnVzX29wcyAqb3BzKQorI2RlZmluZSBBQ1BJX1NUQV9ERUZBVUxUIChBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCB8IEFDUElfU1RBX0RFVklDRV9FTkFCTEVEIHwgXAorCQkJICBBQ1BJX1NUQV9ERVZJQ0VfVUkgICAgICB8IEFDUElfU1RBX0RFVklDRV9GVU5DVElPTklORykKKworc3RhdGljIGludCBhY3BpX2J1c190eXBlX2FuZF9zdGF0dXMoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnR5cGUsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqc3RhKQogewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmNoaWxkID0gTlVMTDsKLQlhY3BpX2hhbmRsZSBwaGFuZGxlID0gTlVMTDsKLQlhY3BpX2hhbmRsZSBjaGFuZGxlID0gTlVMTDsKLQlhY3BpX29iamVjdF90eXBlIHR5cGUgPSAwOwotCXUzMiBsZXZlbCA9IDE7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfb2JqZWN0X3R5cGUgYWNwaV90eXBlOwogCisJc3RhdHVzID0gYWNwaV9nZXRfdHlwZShoYW5kbGUsICZhY3BpX3R5cGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIXN0YXJ0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcmVudCA9IHN0YXJ0OwotCXBoYW5kbGUgPSBzdGFydC0+aGFuZGxlOwotCi0JLyoKLQkgKiBQYXJzZSB0aHJvdWdoIHRoZSBBQ1BJIG5hbWVzcGFjZSwgaWRlbnRpZnkgYWxsICdkZXZpY2VzJywgYW5kCi0JICogY3JlYXRlIGEgbmV3ICdzdHJ1Y3QgYWNwaV9kZXZpY2UnIGZvciBlYWNoLgotCSAqLwotCXdoaWxlICgobGV2ZWwgPiAwKSAmJiBwYXJlbnQpIHsKLQotCQlzdGF0dXMgPSBhY3BpX2dldF9uZXh0X29iamVjdChBQ1BJX1RZUEVfQU5ZLCBwaGFuZGxlLAotCQkJCQkgICAgICBjaGFuZGxlLCAmY2hhbmRsZSk7Ci0KLQkJLyoKLQkJICogSWYgdGhpcyBzY29wZSBpcyBleGhhdXN0ZWQgdGhlbiBtb3ZlIG91ciB3YXkgYmFjayB1cC4KLQkJICovCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJbGV2ZWwtLTsKLQkJCWNoYW5kbGUgPSBwaGFuZGxlOwotCQkJYWNwaV9nZXRfcGFyZW50KHBoYW5kbGUsICZwaGFuZGxlKTsKLQkJCWlmIChwYXJlbnQtPnBhcmVudCkKLQkJCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3RhdHVzID0gYWNwaV9nZXRfdHlwZShjaGFuZGxlLCAmdHlwZSk7CisJc3dpdGNoIChhY3BpX3R5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9BTlk6CQkvKiBmb3IgQUNQSV9ST09UX09CSkVDVCAqLworCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKKwkJKnR5cGUgPSBBQ1BJX0JVU19UWVBFX0RFVklDRTsKKwkJc3RhdHVzID0gYWNwaV9idXNfZ2V0X3N0YXR1c19oYW5kbGUoaGFuZGxlLCBzdGEpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBJZiB0aGlzIGlzIGEgc2NvcGUgb2JqZWN0IHRoZW4gcGFyc2UgaXQgKGRlcHRoLWZpcnN0KS4KLQkJICovCi0JCWlmICh0eXBlID09IEFDUElfVFlQRV9MT0NBTF9TQ09QRSkgewotCQkJbGV2ZWwrKzsKLQkJCXBoYW5kbGUgPSBjaGFuZGxlOwotCQkJY2hhbmRsZSA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBvYmplY3RzIHRoYXQgd2UgY29uc2lkZXIgJ2RldmljZXMnLgotCQkgKi8KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKLQkJCXR5cGUgPSBBQ1BJX0JVU19UWVBFX0RFVklDRTsKLQkJCWJyZWFrOwotCQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6Ci0JCQl0eXBlID0gQUNQSV9CVVNfVFlQRV9QUk9DRVNTT1I7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKLQkJCXR5cGUgPSBBQ1BJX0JVU19UWVBFX1RIRVJNQUw7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6Ci0JCQl0eXBlID0gQUNQSV9CVVNfVFlQRV9QT1dFUjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAob3BzLT5hY3BpX29wX2FkZCkKLQkJCXN0YXR1cyA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmNoaWxkLCBwYXJlbnQsCi0JCQkJY2hhbmRsZSwgdHlwZSwgb3BzKTsKLQkJZWxzZQotCQkJc3RhdHVzID0gYWNwaV9idXNfZ2V0X2RldmljZShjaGFuZGxlLCAmY2hpbGQpOwotCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgorCQkqdHlwZSA9IEFDUElfQlVTX1RZUEVfUFJPQ0VTU09SOworCQlzdGF0dXMgPSBhY3BpX2J1c19nZXRfc3RhdHVzX2hhbmRsZShoYW5kbGUsIHN0YSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChvcHMtPmFjcGlfb3Bfc3RhcnQgJiYgIShvcHMtPmFjcGlfb3BfYWRkKSkgewotCQkJc3RhdHVzID0gYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0KGNoaWxkKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoZSBkZXZpY2UgaXMgcHJlc2VudCwgZW5hYmxlZCwgYW5kIGZ1bmN0aW9uaW5nIHRoZW4KLQkJICogcGFyc2UgaXRzIHNjb3BlIChkZXB0aC1maXJzdCkuICBOb3RlIHRoYXQgd2UgbmVlZCB0bwotCQkgKiByZXByZXNlbnQgYWJzZW50IGRldmljZXMgdG8gZmFjaWxpdGF0ZSBQblAgbm90aWZpY2F0aW9ucwotCQkgKiAtLSBidXQgb25seSB0aGUgc3VidHJlZSBoZWFkIChub3QgYWxsIG9mIGl0cyBjaGlsZHJlbiwKLQkJICogd2hpY2ggd2lsbCBiZSBlbnVtZXJhdGVkIHdoZW4gdGhlIHBhcmVudCBpcyBpbnNlcnRlZCkuCi0JCSAqCi0JCSAqIFRCRDogTmVlZCBub3RpZmljYXRpb25zIGFuZCBvdGhlciBkZXRlY3Rpb24gbWVjaGFuaXNtcwotCQkgKiAgICAgIGluIHBsYWNlIGJlZm9yZSB3ZSBjYW4gZnVsbHkgaW1wbGVtZW50IHRoaXMuCi0JCSAqLwotCQkgLyoKLQkJICogV2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBwcmVzZW50IGJ1dCBmdW5jdGlvbmFsLCBpdCBpcyBhbHNvCi0JCSAqIG5lY2Vzc2FyeSB0byBzY2FuIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGRldmljZS4KLQkJICovCi0JCWlmIChjaGlsZC0+c3RhdHVzLnByZXNlbnQgfHwgKCFjaGlsZC0+c3RhdHVzLnByZXNlbnQgJiYKLQkJCQkJY2hpbGQtPnN0YXR1cy5mdW5jdGlvbmFsKSkgewotCQkJc3RhdHVzID0gYWNwaV9nZXRfbmV4dF9vYmplY3QoQUNQSV9UWVBFX0FOWSwgY2hhbmRsZSwKLQkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOwotCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQkJbGV2ZWwrKzsKLQkJCQlwaGFuZGxlID0gY2hhbmRsZTsKLQkJCQljaGFuZGxlID0gTlVMTDsKLQkJCQlwYXJlbnQgPSBjaGlsZDsKLQkJCX0KLQkJfQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6CisJCSp0eXBlID0gQUNQSV9CVVNfVFlQRV9USEVSTUFMOworCQkqc3RhID0gQUNQSV9TVEFfREVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CisJCSp0eXBlID0gQUNQSV9CVVNfVFlQRV9QT1dFUjsKKwkJKnN0YSA9IEFDUElfU1RBX0RFRkFVTFQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9idXNfY2hlY2tfYWRkKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwKKwkJCQkgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX2J1c19vcHMgKm9wcyA9IGNvbnRleHQ7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGFjcGlfYnVzX3R5cGVfYW5kX3N0YXR1cyhoYW5kbGUsICZ0eXBlLCAmc3RhKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gQUVfT0s7CisKKwlpZiAoIShzdGEgJiBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCkgJiYKKwkgICAgIShzdGEgJiBBQ1BJX1NUQV9ERVZJQ0VfRlVOQ1RJT05JTkcpKQorCQlyZXR1cm4gQUVfQ1RSTF9ERVBUSDsKKworCS8qCisJICogV2UgbWF5IGFscmVhZHkgaGF2ZSBhbiBhY3BpX2RldmljZSBmcm9tIGEgcHJldmlvdXMgZW51bWVyYXRpb24uICBJZgorCSAqIHNvLCB3ZSBuZWVkbid0IGFkZCBpdCBhZ2FpbiwgYnV0IHdlIG1heSBzdGlsbCBoYXZlIHRvIHN0YXJ0IGl0LgorCSAqLworCWRldmljZSA9IE5VTEw7CisJYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpOworCWlmIChvcHMtPmFjcGlfb3BfYWRkICYmICFkZXZpY2UpCisJCWFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmRldmljZSwgaGFuZGxlLCB0eXBlLCBzdGEsIG9wcyk7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIEFFX0NUUkxfREVQVEg7CisKKwlpZiAob3BzLT5hY3BpX29wX3N0YXJ0ICYmICEob3BzLT5hY3BpX29wX2FkZCkpIHsKKwkJc3RhdHVzID0gYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0KGRldmljZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCXJldHVybiBBRV9DVFJMX0RFUFRIOworCX0KKworCWlmICghKnJldHVybl92YWx1ZSkKKwkJKnJldHVybl92YWx1ZSA9IGRldmljZTsKKwlyZXR1cm4gQUVfT0s7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9idXNfc2NhbihhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1c19vcHMgKm9wcywKKwkJCSBzdHJ1Y3QgYWNwaV9kZXZpY2UgKipjaGlsZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdm9pZCAqZGV2aWNlID0gTlVMTDsKKworCXN0YXR1cyA9IGFjcGlfYnVzX2NoZWNrX2FkZChoYW5kbGUsIDAsIG9wcywgJmRldmljZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQorCQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIGhhbmRsZSwgQUNQSV9VSU5UMzJfTUFYLAorCQkJCSAgICBhY3BpX2J1c19jaGVja19hZGQsIG9wcywgJmRldmljZSk7CisKKwlpZiAoY2hpbGQpCisJCSpjaGlsZCA9IGRldmljZTsKKwlyZXR1cm4gMDsKK30KKwogaW50CiBhY3BpX2J1c19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICoqY2hpbGQsCiAJICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSkKIHsKLQlpbnQgcmVzdWx0OwogCXN0cnVjdCBhY3BpX2J1c19vcHMgb3BzOwogCiAJbWVtc2V0KCZvcHMsIDAsIHNpemVvZihvcHMpKTsKIAlvcHMuYWNwaV9vcF9hZGQgPSAxOwogCi0JcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdChjaGlsZCwgcGFyZW50LCBoYW5kbGUsIHR5cGUsICZvcHMpOwotCWlmICghcmVzdWx0KQotCQlyZXN1bHQgPSBhY3BpX2J1c19zY2FuKCpjaGlsZCwgJm9wcyk7Ci0KLQlyZXR1cm4gcmVzdWx0OworCWFjcGlfYnVzX3NjYW4oaGFuZGxlLCAmb3BzLCBjaGlsZCk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX2FkZCk7CiAKIGludCBhY3BpX2J1c19zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQgcmVzdWx0OwogCXN0cnVjdCBhY3BpX2J1c19vcHMgb3BzOwogCisJbWVtc2V0KCZvcHMsIDAsIHNpemVvZihvcHMpKTsKKwlvcHMuYWNwaV9vcF9zdGFydCA9IDE7CiAKLQlpZiAoIWRldmljZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXN1bHQgPSBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoZGV2aWNlKTsKLQlpZiAoIXJlc3VsdCkgewotCQltZW1zZXQoJm9wcywgMCwgc2l6ZW9mKG9wcykpOwotCQlvcHMuYWNwaV9vcF9zdGFydCA9IDE7Ci0JCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW4oZGV2aWNlLCAmb3BzKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKwlhY3BpX2J1c19zY2FuKGRldmljZS0+aGFuZGxlLCAmb3BzLCBOVUxMKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woYWNwaV9idXNfc3RhcnQpOwogCkBAIC0xNTcyLDE1ICsxNDIwLDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY3BpX2J1c190cmltKTsKIAotc3RhdGljIGludCBhY3BpX2J1c19zY2FuX2ZpeGVkKHN0cnVjdCBhY3BpX2RldmljZSAqcm9vdCkKK3N0YXRpYyBpbnQgYWNwaV9idXNfc2Nhbl9maXhlZCh2b2lkKQogewogCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9idXNfb3BzIG9wczsKIAotCWlmICghcm9vdCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAltZW1zZXQoJm9wcywgMCwgc2l6ZW9mKG9wcykpOwogCW9wcy5hY3BpX29wX2FkZCA9IDE7CiAJb3BzLmFjcGlfb3Bfc3RhcnQgPSAxOwpAQCAtMTU4OSwxNiArMTQzNCwxNiBAQAogCSAqIEVudW1lcmF0ZSBhbGwgZml4ZWQtZmVhdHVyZSBkZXZpY2VzLgogCSAqLwogCWlmICgoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9QT1dFUl9CVVRUT04pID09IDApIHsKLQkJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmZGV2aWNlLCBhY3BpX3Jvb3QsCi0JCQkJCQlOVUxMLAorCQlyZXN1bHQgPSBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KCZkZXZpY2UsIE5VTEwsCiAJCQkJCQlBQ1BJX0JVU19UWVBFX1BPV0VSX0JVVFRPTiwKKwkJCQkJCUFDUElfU1RBX0RFRkFVTFQsCiAJCQkJCQkmb3BzKTsKIAl9CiAKIAlpZiAoKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfU0xFRVBfQlVUVE9OKSA9PSAwKSB7Ci0JCXJlc3VsdCA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmRldmljZSwgYWNwaV9yb290LAotCQkJCQkJTlVMTCwKKwkJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmZGV2aWNlLCBOVUxMLAogCQkJCQkJQUNQSV9CVVNfVFlQRV9TTEVFUF9CVVRUT04sCisJCQkJCQlBQ1BJX1NUQV9ERUZBVUxULAogCQkJCQkJJm9wcyk7CiAJfQogCkBAIC0xNjIxLDI0ICsxNDY2LDE1IEBACiAJfQogCiAJLyoKLQkgKiBDcmVhdGUgdGhlIHJvb3QgZGV2aWNlIGluIHRoZSBidXMncyBkZXZpY2UgdHJlZQotCSAqLwotCXJlc3VsdCA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmFjcGlfcm9vdCwgTlVMTCwgQUNQSV9ST09UX09CSkVDVCwKLQkJCQkJQUNQSV9CVVNfVFlQRV9TWVNURU0sICZvcHMpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gRG9uZTsKLQotCS8qCiAJICogRW51bWVyYXRlIGRldmljZXMgaW4gdGhlIEFDUEkgbmFtZXNwYWNlLgogCSAqLwotCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW5fZml4ZWQoYWNwaV9yb290KTsKKwlyZXN1bHQgPSBhY3BpX2J1c19zY2FuKEFDUElfUk9PVF9PQkpFQ1QsICZvcHMsICZhY3BpX3Jvb3QpOwogCiAJaWYgKCFyZXN1bHQpCi0JCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW4oYWNwaV9yb290LCAmb3BzKTsKKwkJcmVzdWx0ID0gYWNwaV9idXNfc2Nhbl9maXhlZCgpOwogCiAJaWYgKHJlc3VsdCkKIAkJYWNwaV9kZXZpY2VfdW5yZWdpc3RlcihhY3BpX3Jvb3QsIEFDUElfQlVTX1JFTU9WQUxfTk9STUFMKTsKIAotRG9uZToKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCA5NGIxYTRjLi42NGUzYzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtMjg1LDcgKzI4NSw3IEBACiAJCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3NpemVfdCBhY3BpX3ZpZGVvX2RldmljZV93cml0ZV9icmlnaHRuZXNzKHN0cnVjdCBmaWxlICpmaWxlLAogCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpkYXRhKTsKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3NfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3NfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3Nfb3Blbl9mcywKIAkucmVhZCA9IHNlcV9yZWFkLApAQCAtMTEwOSw3ICsxMTA5LDEyIEBACiAJICovCiAKIAkvKiBEb2VzIHRoaXMgZGV2aWNlIHN1cHBvcnQgdmlkZW8gc3dpdGNoaW5nPyAqLwotCWlmICh2aWRlby0+Y2FwLl9ET1MpIHsKKwlpZiAodmlkZW8tPmNhcC5fRE9TIHx8IHZpZGVvLT5jYXAuX0RPRCkgeworCQlpZiAoIXZpZGVvLT5jYXAuX0RPUykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBGV19CVUcKKwkJCQkiQUNQSSglcykgZGVmaW5lcyBfRE9EIGJ1dCBub3QgX0RPU1xuIiwKKwkJCQlhY3BpX2RldmljZV9iaWQodmlkZW8tPmRldmljZSkpOworCQl9CiAJCXZpZGVvLT5mbGFncy5tdWx0aWhlYWQgPSAxOwogCQlzdGF0dXMgPSAwOwogCX0KQEAgLTE5ODYsNiArMTk5MSwxMCBAQAogCiAJcmVzdWx0ID0gYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbChkZXZpY2UsIGxldmVsX25leHQpOwogCisJaWYgKCFyZXN1bHQpCisJCWJhY2tsaWdodF9mb3JjZV91cGRhdGUoZGV2aWNlLT5iYWNrbGlnaHQsCisJCQkJICAgICAgIEJBQ0tMSUdIVF9VUERBVEVfSE9US0VZKTsKKwogb3V0OgogCWlmIChyZXN1bHQpCiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkZhaWxlZCB0byBzd2l0Y2ggdGhlIGJyaWdodG5lc3NcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCmluZGV4IDcwMzJmMjUuLjU3NTU5M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKQEAgLTg0LDcgKzg0LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBEb2VzIHRoaXMgZGV2aWNlIGFibGUgdG8gc3VwcG9ydCB2aWRlbyBzd2l0Y2hpbmcgPyAqLwotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0RPRCIsICZoX2R1bW15KSkgJiYKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9ET0QiLCAmaF9kdW1teSkpIHx8CiAJICAgIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfRE9TIiwgJmhfZHVtbXkpKSkKIAkJdmlkZW9fY2FwcyB8PSBBQ1BJX1ZJREVPX09VVFBVVF9TV0lUQ0hJTkc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2kuYyBiL2RyaXZlcnMvYXRhL2FoY2kuYwppbmRleCBhY2QxMTYyLi5hMzI0MWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaS5jCkBAIC0xMjIsNiArMTIyLDcgQEAKIAlIT1NUX1ZFUlNJT04JCT0gMHgxMCwgLyogQUhDSSBzcGVjLiB2ZXJzaW9uIGNvbXBsaWFuY3kgKi8KIAlIT1NUX0VNX0xPQwkJPSAweDFjLCAvKiBFbmNsb3N1cmUgTWFuYWdlbWVudCBsb2NhdGlvbiAqLwogCUhPU1RfRU1fQ1RMCQk9IDB4MjAsIC8qIEVuY2xvc3VyZSBNYW5hZ2VtZW50IENvbnRyb2wgKi8KKwlIT1NUX0NBUDIJCT0gMHgyNCwgLyogaG9zdCBjYXBhYmlsaXRpZXMsIGV4dGVuZGVkICovCiAKIAkvKiBIT1NUX0NUTCBiaXRzICovCiAJSE9TVF9SRVNFVAkJPSAoMSA8PCAwKSwgIC8qIHJlc2V0IGNvbnRyb2xsZXI7IHNlbGYtY2xlYXIgKi8KQEAgLTEyOSwxNiArMTMwLDI5IEBACiAJSE9TVF9BSENJX0VOCQk9ICgxIDw8IDMxKSwgLyogQUhDSSBlbmFibGVkICovCiAKIAkvKiBIT1NUX0NBUCBiaXRzICovCisJSE9TVF9DQVBfU1hTCQk9ICgxIDw8IDUpLCAgLyogU3VwcG9ydHMgRXh0ZXJuYWwgU0FUQSAqLwogCUhPU1RfQ0FQX0VNUwkJPSAoMSA8PCA2KSwgIC8qIEVuY2xvc3VyZSBNYW5hZ2VtZW50IHN1cHBvcnQgKi8KLQlIT1NUX0NBUF9TU0MJCT0gKDEgPDwgMTQpLCAvKiBTbHVtYmVyIGNhcGFibGUgKi8KKwlIT1NUX0NBUF9DQ0MJCT0gKDEgPDwgNyksICAvKiBDb21tYW5kIENvbXBsZXRpb24gQ29hbGVzY2luZyAqLworCUhPU1RfQ0FQX1BBUlQJCT0gKDEgPDwgMTMpLCAvKiBQYXJ0aWFsIHN0YXRlIGNhcGFibGUgKi8KKwlIT1NUX0NBUF9TU0MJCT0gKDEgPDwgMTQpLCAvKiBTbHVtYmVyIHN0YXRlIGNhcGFibGUgKi8KKwlIT1NUX0NBUF9QSU9fTVVMVEkJPSAoMSA8PCAxNSksIC8qIFBJTyBtdWx0aXBsZSBEUlEgc3VwcG9ydCAqLworCUhPU1RfQ0FQX0ZCUwkJPSAoMSA8PCAxNiksIC8qIEZJUy1iYXNlZCBzd2l0Y2hpbmcgc3VwcG9ydCAqLwogCUhPU1RfQ0FQX1BNUAkJPSAoMSA8PCAxNyksIC8qIFBvcnQgTXVsdGlwbGllciBzdXBwb3J0ICovCisJSE9TVF9DQVBfT05MWQkJPSAoMSA8PCAxOCksIC8qIFN1cHBvcnRzIEFIQ0kgbW9kZSBvbmx5ICovCiAJSE9TVF9DQVBfQ0xPCQk9ICgxIDw8IDI0KSwgLyogQ29tbWFuZCBMaXN0IE92ZXJyaWRlIHN1cHBvcnQgKi8KKwlIT1NUX0NBUF9MRUQJCT0gKDEgPDwgMjUpLCAvKiBTdXBwb3J0cyBhY3Rpdml0eSBMRUQgKi8KIAlIT1NUX0NBUF9BTFBNCQk9ICgxIDw8IDI2KSwgLyogQWdncmVzc2l2ZSBMaW5rIFBNIHN1cHBvcnQgKi8KIAlIT1NUX0NBUF9TU1MJCT0gKDEgPDwgMjcpLCAvKiBTdGFnZ2VyZWQgU3Bpbi11cCAqLworCUhPU1RfQ0FQX01QUwkJPSAoMSA8PCAyOCksIC8qIE1lY2hhbmljYWwgcHJlc2VuY2Ugc3dpdGNoICovCiAJSE9TVF9DQVBfU05URgkJPSAoMSA8PCAyOSksIC8qIFNOb3RpZmljYXRpb24gcmVnaXN0ZXIgKi8KIAlIT1NUX0NBUF9OQ1EJCT0gKDEgPDwgMzApLCAvKiBOYXRpdmUgQ29tbWFuZCBRdWV1ZWluZyAqLwogCUhPU1RfQ0FQXzY0CQk9ICgxIDw8IDMxKSwgLyogUENJIERBQyAoNjQtYml0IERNQSkgc3VwcG9ydCAqLwogCisJLyogSE9TVF9DQVAyIGJpdHMgKi8KKwlIT1NUX0NBUDJfQk9ICQk9ICgxIDw8IDApLCAgLyogQklPUy9PUyBoYW5kb2ZmIHN1cHBvcnRlZCAqLworCUhPU1RfQ0FQMl9OVk1IQ0kJPSAoMSA8PCAxKSwgIC8qIE5WTUhDSSBzdXBwb3J0ZWQgKi8KKwlIT1NUX0NBUDJfQVBTVAkJPSAoMSA8PCAyKSwgIC8qIEF1dG9tYXRpYyBwYXJ0aWFsIHRvIHNsdW1iZXIgKi8KKwogCS8qIHJlZ2lzdGVycyBmb3IgZWFjaCBTQVRBIHBvcnQgKi8KIAlQT1JUX0xTVF9BRERSCQk9IDB4MDAsIC8qIGNvbW1hbmQgbGlzdCBETUEgYWRkciAqLwogCVBPUlRfTFNUX0FERFJfSEkJPSAweDA0LCAvKiBjb21tYW5kIGxpc3QgRE1BIGFkZHIgaGkgKi8KQEAgLTI2Nyw4ICsyODEsMTAgQEAKIHN0cnVjdCBhaGNpX2hvc3RfcHJpdiB7CiAJdW5zaWduZWQgaW50CQlmbGFnczsJCS8qIEFIQ0lfSEZMQUdfKiAqLwogCXUzMgkJCWNhcDsJCS8qIGNhcCB0byB1c2UgKi8KKwl1MzIJCQljYXAyOwkJLyogY2FwMiB0byB1c2UgKi8KIAl1MzIJCQlwb3J0X21hcDsJLyogcG9ydCBtYXAgdG8gdXNlICovCiAJdTMyCQkJc2F2ZWRfY2FwOwkvKiBzYXZlZCBpbml0aWFsIGNhcCAqLworCXUzMgkJCXNhdmVkX2NhcDI7CS8qIHNhdmVkIGluaXRpYWwgY2FwMiAqLwogCXUzMgkJCXNhdmVkX3BvcnRfbWFwOwkvKiBzYXZlZCBpbml0aWFsIHBvcnRfbWFwICovCiAJdTMyIAkJCWVtX2xvYzsgLyogZW5jbG9zdXJlIG1hbmFnZW1lbnQgbG9jYXRpb24gKi8KIH07CkBAIC0zMzEsMTIgKzM0NywxNSBAQAogCiBzdGF0aWMgc3NpemVfdCBhaGNpX3Nob3dfaG9zdF9jYXBzKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IGFoY2lfc2hvd19ob3N0X2NhcDIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwogc3RhdGljIHNzaXplX3QgYWhjaV9zaG93X2hvc3RfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBhaGNpX3Nob3dfcG9ydF9jbWQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CiAKIERFVklDRV9BVFRSKGFoY2lfaG9zdF9jYXBzLCBTX0lSVUdPLCBhaGNpX3Nob3dfaG9zdF9jYXBzLCBOVUxMKTsKK0RFVklDRV9BVFRSKGFoY2lfaG9zdF9jYXAyLCBTX0lSVUdPLCBhaGNpX3Nob3dfaG9zdF9jYXAyLCBOVUxMKTsKIERFVklDRV9BVFRSKGFoY2lfaG9zdF92ZXJzaW9uLCBTX0lSVUdPLCBhaGNpX3Nob3dfaG9zdF92ZXJzaW9uLCBOVUxMKTsKIERFVklDRV9BVFRSKGFoY2lfcG9ydF9jbWQsIFNfSVJVR08sIGFoY2lfc2hvd19wb3J0X2NtZCwgTlVMTCk7CiAKQEAgLTM0NSw2ICszNjQsNyBAQAogCSZkZXZfYXR0cl9lbV9tZXNzYWdlX3R5cGUsCiAJJmRldl9hdHRyX2VtX21lc3NhZ2UsCiAJJmRldl9hdHRyX2FoY2lfaG9zdF9jYXBzLAorCSZkZXZfYXR0cl9haGNpX2hvc3RfY2FwMiwKIAkmZGV2X2F0dHJfYWhjaV9ob3N0X3ZlcnNpb24sCiAJJmRldl9hdHRyX2FoY2lfcG9ydF9jbWQsCiAJTlVMTApAQCAtNDQ3LDcgKzQ2Nyw4IEBACiAJW2JvYXJkX2FoY2lfc2I2MDBdID0KIAl7CiAJCUFIQ0lfSEZMQUdTCShBSENJX0hGTEFHX0lHTl9TRVJSX0lOVEVSTkFMIHwKLQkJCQkgQUhDSV9IRkxBR19OT19NU0kgfCBBSENJX0hGTEFHX1NFQ1QyNTUpLAorCQkJCSBBSENJX0hGTEFHX05PX01TSSB8IEFIQ0lfSEZMQUdfU0VDVDI1NSB8CisJCQkJIEFIQ0lfSEZMQUdfMzJCSVRfT05MWSksCiAJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAogCQkucGlvX21hc2sJPSBBVEFfUElPNCwKIAkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKQEAgLTU1NCw3ICs1NzUsNyBAQAogCXsgUENJX1ZERVZJQ0UoQVRJLCAweDQzOTUpLCBib2FyZF9haGNpX3NiNzAwIH0sIC8qIEFUSSBTQjcwMC84MDAgKi8KIAogCS8qIEFNRCAqLwotCXsgUENJX1ZERVZJQ0UoQU1ELCAweDc4MDApLCBib2FyZF9haGNpIH0sIC8qIEFNRCBTQjkwMCAqLworCXsgUENJX1ZERVZJQ0UoQU1ELCAweDc4MDApLCBib2FyZF9haGNpIH0sIC8qIEFNRCBIdWRzb24tMiAqLwogCS8qIEFNRCBpcyB1c2luZyBSQUlEIGNsYXNzIG9ubHkgZm9yIGFoY2kgY29udHJvbGxlcnMgKi8KIAl7IFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAogCSAgUENJX0NMQVNTX1NUT1JBR0VfUkFJRCA8PCA4LCAweGZmZmZmZiwgYm9hcmRfYWhjaSB9LApAQCAtNTg0LDYgKzYwNSw3IEBACiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1OSksIGJvYXJkX2FoY2lfeWVzbmNxIH0sCS8qIE1DUDY3ICovCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1YSksIGJvYXJkX2FoY2lfeWVzbmNxIH0sCS8qIE1DUDY3ICovCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1YiksIGJvYXJkX2FoY2lfeWVzbmNxIH0sCS8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU4MCksIGJvYXJkX2FoY2lfeWVzbmNxIH0sCS8qIExpbnV4IElEICovCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDdmMCksIGJvYXJkX2FoY2lfeWVzbmNxIH0sCS8qIE1DUDczICovCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDdmMSksIGJvYXJkX2FoY2lfeWVzbmNxIH0sCS8qIE1DUDczICovCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDdmMiksIGJvYXJkX2FoY2lfeWVzbmNxIH0sCS8qIE1DUDczICovCkBAIC03MzIsNiArNzU0LDE2IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIGhwcml2LT5jYXApOwogfQogCitzdGF0aWMgc3NpemVfdCBhaGNpX3Nob3dfaG9zdF9jYXAyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2hvc3QpOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIGhwcml2LT5jYXAyKTsKK30KKwogc3RhdGljIHNzaXplX3QgYWhjaV9zaG93X2hvc3RfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTc3MSw3ICs4MDMsNyBAQAogCQkJCSAgICAgc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKIHsKIAl2b2lkIF9faW9tZW0gKm1taW8gPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpW0FIQ0lfUENJX0JBUl07Ci0JdTMyIGNhcCwgcG9ydF9tYXA7CisJdTMyIGNhcCwgY2FwMiwgdmVycywgcG9ydF9tYXA7CiAJaW50IGk7CiAJaW50IG12OwogCkBAIC03ODQsNiArODE2LDE0IEBACiAJaHByaXYtPnNhdmVkX2NhcCA9IGNhcCA9IHJlYWRsKG1taW8gKyBIT1NUX0NBUCk7CiAJaHByaXYtPnNhdmVkX3BvcnRfbWFwID0gcG9ydF9tYXAgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKIAorCS8qIENBUDIgcmVnaXN0ZXIgaXMgb25seSBkZWZpbmVkIGZvciBBSENJIDEuMiBhbmQgbGF0ZXIgKi8KKwl2ZXJzID0gcmVhZGwobW1pbyArIEhPU1RfVkVSU0lPTik7CisJaWYgKCh2ZXJzID4+IDE2KSA+IDEgfHwKKwkgICAoKHZlcnMgPj4gMTYpID09IDEgJiYgKHZlcnMgJiAweEZGRkYpID49IDB4MjAwKSkKKwkJaHByaXYtPnNhdmVkX2NhcDIgPSBjYXAyID0gcmVhZGwobW1pbyArIEhPU1RfQ0FQMik7CisJZWxzZQorCQlocHJpdi0+c2F2ZWRfY2FwMiA9IGNhcDIgPSAwOworCiAJLyogc29tZSBjaGlwcyBoYXZlIGVycmF0YSBwcmV2ZW50aW5nIDY0Yml0IHVzZSAqLwogCWlmICgoY2FwICYgSE9TVF9DQVBfNjQpICYmIChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHXzMyQklUX09OTFkpKSB7CiAJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LApAQCAtODY5LDYgKzkwOSw3IEBACiAKIAkvKiByZWNvcmQgdmFsdWVzIHRvIHVzZSBkdXJpbmcgb3BlcmF0aW9uICovCiAJaHByaXYtPmNhcCA9IGNhcDsKKwlocHJpdi0+Y2FwMiA9IGNhcDI7CiAJaHByaXYtPnBvcnRfbWFwID0gcG9ydF9tYXA7CiB9CiAKQEAgLTg4Nyw2ICs5MjgsOCBAQAogCXZvaWQgX19pb21lbSAqbW1pbyA9IGhvc3QtPmlvbWFwW0FIQ0lfUENJX0JBUl07CiAKIAl3cml0ZWwoaHByaXYtPnNhdmVkX2NhcCwgbW1pbyArIEhPU1RfQ0FQKTsKKwlpZiAoaHByaXYtPnNhdmVkX2NhcDIpCisJCXdyaXRlbChocHJpdi0+c2F2ZWRfY2FwMiwgbW1pbyArIEhPU1RfQ0FQMik7CiAJd3JpdGVsKGhwcml2LT5zYXZlZF9wb3J0X21hcCwgbW1pbyArIEhPU1RfUE9SVFNfSU1QTCk7CiAJKHZvaWQpIHJlYWRsKG1taW8gKyBIT1NUX1BPUlRTX0lNUEwpOwkvKiBmbHVzaCAqLwogfQpAQCAtMjUzNCwxMyArMjU3NywxNCBAQAogCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGhvc3QtPmRldik7CiAJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdC0+aW9tYXBbQUhDSV9QQ0lfQkFSXTsKLQl1MzIgdmVycywgY2FwLCBpbXBsLCBzcGVlZDsKKwl1MzIgdmVycywgY2FwLCBjYXAyLCBpbXBsLCBzcGVlZDsKIAljb25zdCBjaGFyICpzcGVlZF9zOwogCXUxNiBjYzsKIAljb25zdCBjaGFyICpzY2NfczsKIAogCXZlcnMgPSByZWFkbChtbWlvICsgSE9TVF9WRVJTSU9OKTsKIAljYXAgPSBocHJpdi0+Y2FwOworCWNhcDIgPSBocHJpdi0+Y2FwMjsKIAlpbXBsID0gaHByaXYtPnBvcnRfbWFwOwogCiAJc3BlZWQgPSAoY2FwID4+IDIwKSAmIDB4ZjsKQEAgLTI1ODMsMjUgKzI2MjcsMjkgQEAKIAkJImZsYWdzOiAiCiAJCSIlcyVzJXMlcyVzJXMlcyIKIAkJIiVzJXMlcyVzJXMlcyVzIgotCQkiJXNcbiIKKwkJIiVzJXMlcyVzJXMlc1xuIgogCQksCiAKLQkJY2FwICYgKDEgPDwgMzEpID8gIjY0Yml0ICIgOiAiIiwKLQkJY2FwICYgKDEgPDwgMzApID8gIm5jcSAiIDogIiIsCi0JCWNhcCAmICgxIDw8IDI5KSA/ICJzbnRmICIgOiAiIiwKLQkJY2FwICYgKDEgPDwgMjgpID8gImlsY2sgIiA6ICIiLAotCQljYXAgJiAoMSA8PCAyNykgPyAic3RhZyAiIDogIiIsCi0JCWNhcCAmICgxIDw8IDI2KSA/ICJwbSAiIDogIiIsCi0JCWNhcCAmICgxIDw8IDI1KSA/ICJsZWQgIiA6ICIiLAotCi0JCWNhcCAmICgxIDw8IDI0KSA/ICJjbG8gIiA6ICIiLAotCQljYXAgJiAoMSA8PCAxOSkgPyAibnogIiA6ICIiLAotCQljYXAgJiAoMSA8PCAxOCkgPyAib25seSAiIDogIiIsCi0JCWNhcCAmICgxIDw8IDE3KSA/ICJwbXAgIiA6ICIiLAotCQljYXAgJiAoMSA8PCAxNSkgPyAicGlvICIgOiAiIiwKLQkJY2FwICYgKDEgPDwgMTQpID8gInNsdW0gIiA6ICIiLAotCQljYXAgJiAoMSA8PCAxMykgPyAicGFydCAiIDogIiIsCi0JCWNhcCAmICgxIDw8IDYpID8gImVtcyAiOiAiIgorCQljYXAgJiBIT1NUX0NBUF82NCA/ICI2NGJpdCAiIDogIiIsCisJCWNhcCAmIEhPU1RfQ0FQX05DUSA/ICJuY3EgIiA6ICIiLAorCQljYXAgJiBIT1NUX0NBUF9TTlRGID8gInNudGYgIiA6ICIiLAorCQljYXAgJiBIT1NUX0NBUF9NUFMgPyAiaWxjayAiIDogIiIsCisJCWNhcCAmIEhPU1RfQ0FQX1NTUyA/ICJzdGFnICIgOiAiIiwKKwkJY2FwICYgSE9TVF9DQVBfQUxQTSA/ICJwbSAiIDogIiIsCisJCWNhcCAmIEhPU1RfQ0FQX0xFRCA/ICJsZWQgIiA6ICIiLAorCQljYXAgJiBIT1NUX0NBUF9DTE8gPyAiY2xvICIgOiAiIiwKKwkJY2FwICYgSE9TVF9DQVBfT05MWSA/ICJvbmx5ICIgOiAiIiwKKwkJY2FwICYgSE9TVF9DQVBfUE1QID8gInBtcCAiIDogIiIsCisJCWNhcCAmIEhPU1RfQ0FQX0ZCUyA/ICJmYnMgIiA6ICIiLAorCQljYXAgJiBIT1NUX0NBUF9QSU9fTVVMVEkgPyAicGlvICIgOiAiIiwKKwkJY2FwICYgSE9TVF9DQVBfU1NDID8gInNsdW0gIiA6ICIiLAorCQljYXAgJiBIT1NUX0NBUF9QQVJUID8gInBhcnQgIiA6ICIiLAorCQljYXAgJiBIT1NUX0NBUF9DQ0MgPyAiY2NjICIgOiAiIiwKKwkJY2FwICYgSE9TVF9DQVBfRU1TID8gImVtcyAiIDogIiIsCisJCWNhcCAmIEhPU1RfQ0FQX1NYUyA/ICJzeHMgIiA6ICIiLAorCQljYXAyICYgSE9TVF9DQVAyX0FQU1QgPyAiYXBzdCAiIDogIiIsCisJCWNhcDIgJiBIT1NUX0NBUDJfTlZNSENJID8gIm52bXAgIiA6ICIiLAorCQljYXAyICYgSE9TVF9DQVAyX0JPSCA/ICJib2ggIiA6ICIiCiAJCSk7CiB9CiAKQEAgLTI2NTAsMTcgKzI2OTgsMTUgQEAKIAl9CiB9CiAKLS8qCi0gKiBTQjYwMCBhaGNpIGNvbnRyb2xsZXIgb24gY2VydGFpbiBib2FyZHMgY2FuJ3QgZG8gNjRiaXQgRE1BIHdpdGgKLSAqIG9sZGVyIEJJT1MuCi0gKi8KLXN0YXRpYyBib29sIGFoY2lfc2I2MDBfMzJiaXRfb25seShzdHJ1Y3QgcGNpX2RldiAqcGRldikKKy8qIG9ubHkgc29tZSBTQjYwMCBhaGNpIGNvbnRyb2xsZXJzIGNhbiBkbyA2NGJpdCBETUEgKi8KK3N0YXRpYyBib29sIGFoY2lfc2I2MDBfZW5hYmxlXzY0Yml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBzeXNpZHNbXSA9IHsKIAkJLyoKIAkJICogVGhlIG9sZGVzdCB2ZXJzaW9uIGtub3duIHRvIGJlIGJyb2tlbiBpcyAwOTAxIGFuZAogCQkgKiB3b3JraW5nIGlzIDE1MDEgd2hpY2ggd2FzIHJlbGVhc2VkIG9uIDIwMDctMTAtMjYuCi0JCSAqIEZvcmNlIDMyYml0IERNQSBvbiBhbnl0aGluZyBvbGRlciB0aGFuIDE1MDEuCisJCSAqIEVuYWJsZSA2NGJpdCBETUEgb24gMTUwMSBhbmQgYW55dGhpbmcgbmV3ZXIuCisJCSAqCiAJCSAqIFBsZWFzZSByZWFkIGJrbyM5NDEyIGZvciBtb3JlIGluZm8uCiAJCSAqLwogCQl7CkBAIC0yNjczLDQ2ICsyNzE5LDU3IEBACiAJCQkuZHJpdmVyX2RhdGEgPSAiMjAwNzEwMjYiLAkvKiB5eXl5bW1kZCAqLwogCQl9LAogCQkvKgotCQkgKiBJdCdzIHlldCB1bmtub3duIHdoZXRoZXIgbW9yZSByZWNlbnQgQklPUyBmaXhlcyB0aGUKLQkJICogcHJvYmxlbS4gIEJsYWNrbGlzdCB0aGUgd2hvbGUgYm9hcmQgZm9yIHRoZSB0aW1lCi0JCSAqIGJlaW5nLiAgUGxlYXNlIHJlYWQgdGhlIGZvbGxvd2luZyB0aHJlYWQgZm9yIG1vcmUKLQkJICogaW5mby4KKwkJICogQWxsIEJJT1MgdmVyc2lvbnMgZm9yIHRoZSBNU0kgSzlBMiBQbGF0aW51bSAoTVMtNzM3NikKKwkJICogc3VwcG9ydCA2NGJpdCBETUEuCiAJCSAqCi0JCSAqIGh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmxpbnV4LmlkZS80MjMyNgorCQkgKiBCSU9TIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjUgaGFkIHRoZSBNYW51ZmFjdHVyZXIgRE1JCisJCSAqIGZpZWxkcyBhcyAiTUlDUk8tU1RBUiBJTlRFUkFOVElPTkFMIENPLixMVEQiLgorCQkgKiBUaGlzIHNwZWxsaW5nIG1pc3Rha2Ugd2FzIGZpeGVkIGluIEJJT1MgdmVyc2lvbiAxLjUsIHNvCisJCSAqIDEuNSBhbmQgbGF0ZXIgaGF2ZSB0aGUgTWFudWZhY3R1cmVyIGFzCisJCSAqICJNSUNSTy1TVEFSIElOVEVSTkFUSU9OQUwgQ08uLExURCIuCisJCSAqIFNvIHRyeSB0byBtYXRjaCBvbiBETUlfQk9BUkRfVkVORE9SIG9mICJNSUNSTy1TVEFSIElOVEVSIi4KKwkJICoKKwkJICogQklPUyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMS45IGhhZCBhIEJvYXJkIFByb2R1Y3QgTmFtZQorCQkgKiBETUkgZmllbGQgb2YgIk1TLTczNzYiLiBUaGlzIHdhcyBjaGFuZ2VkIHRvIGJlCisJCSAqICJLOUEyIFBsYXRpbnVtIChNUy03Mzc2KSIgaW4gdmVyc2lvbiAxLjksIGJ1dCB3ZSBjYW4gc3RpbGwKKwkJICogbWF0Y2ggb24gRE1JX0JPQVJEX05BTUUgb2YgIk1TLTczNzYiLgogCQkgKi8KIAkJewotCQkJLmlkZW50ID0gIkdpZ2FieXRlIEdBLU1BNjlWTS1TMiIsCisJCQkuaWRlbnQgPSAiTVNJIEs5QTIgUGxhdGludW0iLAogCQkJLm1hdGNoZXMgPSB7CiAJCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsCi0JCQkJCSAgIkdpZ2FieXRlIFRlY2hub2xvZ3kgQ28uLCBMdGQuIiksCi0JCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiR0EtTUE2OVZNLVMyIiksCisJCQkJCSAgIk1JQ1JPLVNUQVIgSU5URVIiKSwKKwkJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJNUy03Mzc2IiksCiAJCQl9LAogCQl9LAogCQl7IH0KIAl9OwogCWNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICptYXRjaDsKKwlpbnQgeWVhciwgbW9udGgsIGRhdGU7CisJY2hhciBidWZbOV07CiAKIAltYXRjaCA9IGRtaV9maXJzdF9tYXRjaChzeXNpZHMpOwogCWlmIChwZGV2LT5idXMtPm51bWJlciAhPSAwIHx8IHBkZXYtPmRldmZuICE9IFBDSV9ERVZGTigweDEyLCAwKSB8fAogCSAgICAhbWF0Y2gpCiAJCXJldHVybiBmYWxzZTsKIAotCWlmIChtYXRjaC0+ZHJpdmVyX2RhdGEpIHsKLQkJaW50IHllYXIsIG1vbnRoLCBkYXRlOwotCQljaGFyIGJ1Zls5XTsKKwlpZiAoIW1hdGNoLT5kcml2ZXJfZGF0YSkKKwkJZ290byBlbmFibGVfNjRiaXQ7CiAKLQkJZG1pX2dldF9kYXRlKERNSV9CSU9TX0RBVEUsICZ5ZWFyLCAmbW9udGgsICZkYXRlKTsKLQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUwNGQlMDJkJTAyZCIsIHllYXIsIG1vbnRoLCBkYXRlKTsKKwlkbWlfZ2V0X2RhdGUoRE1JX0JJT1NfREFURSwgJnllYXIsICZtb250aCwgJmRhdGUpOworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlMDRkJTAyZCUwMmQiLCB5ZWFyLCBtb250aCwgZGF0ZSk7CiAKLQkJaWYgKHN0cmNtcChidWYsIG1hdGNoLT5kcml2ZXJfZGF0YSkgPj0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQorCWlmIChzdHJjbXAoYnVmLCBtYXRjaC0+ZHJpdmVyX2RhdGEpID49IDApCisJCWdvdG8gZW5hYmxlXzY0Yml0OworCWVsc2UgewogCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnBkZXYtPmRldiwgIiVzOiBCSU9TIHRvbyBvbGQsICIKIAkJCSAgICJmb3JjaW5nIDMyYml0IERNQSwgdXBkYXRlIEJJT1NcbiIsIG1hdGNoLT5pZGVudCk7Ci0JfSBlbHNlCi0JCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcGRldi0+ZGV2LCAiJXM6IHRoaXMgYm9hcmQgY2FuJ3QgIgotCQkJICAgImRvIDY0Yml0IERNQSwgZm9yY2luZyAzMmJpdFxuIiwgbWF0Y2gtPmlkZW50KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAorZW5hYmxlXzY0Yml0OgorCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcGRldi0+ZGV2LCAiJXM6IGVuYWJsaW5nIDY0Yml0IERNQVxuIiwKKwkJICAgbWF0Y2gtPmlkZW50KTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjg1OCw2ICsyOTE1LDU1IEBACiAJcmV0dXJuIHBkZXYtPmJ1cy0+bnVtYmVyID09ICh2YWwgPj4gOCkgJiYgcGRldi0+ZGV2Zm4gPT0gKHZhbCAmIDB4ZmYpOwogfQogCisjaWZkZWYgQ09ORklHX0FUQV9BQ1BJCitzdGF0aWMgdm9pZCBhaGNpX2d0Zl9maWx0ZXJfd29ya2Fyb3VuZChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIHN5c2lkc1tdID0geworCQkvKgorCQkgKiBBc3BpcmUgMzgxMFQgaXNzdWVzIGEgYnVuY2ggb2YgU0FUQSBlbmFibGUgY29tbWFuZHMKKwkJICogdmlhIF9HVEYgaW5jbHVkaW5nIGFuIGludmFsaWQgb25lIGFuZCBvbmUgd2hpY2ggaXMKKwkJICogcmVqZWN0ZWQgYnkgdGhlIGRldmljZS4gIEFtb25nIHRoZSBzdWNjZXNzZnVsIG9uZXMKKwkJICogaXMgRlBETUEgbm9uLXplcm8gb2Zmc2V0IGVuYWJsZSB3aGljaCB3aGVuIGVuYWJsZWQKKwkJICogb25seSBvbiB0aGUgZHJpdmUgc2lkZSBsZWFkcyB0byBOQ1EgY29tbWFuZAorCQkgKiBmYWlsdXJlcy4gIEZpbHRlciBpdCBvdXQuCisJCSAqLworCQl7CisJCQkuaWRlbnQgPSAiQXNwaXJlIDM4MTBUIiwKKwkJCS5tYXRjaGVzID0geworCQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSAzODEwVCIpLAorCQkJfSwKKwkJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopQVRBX0FDUElfRklMVEVSX0ZQRE1BX09GRlNFVCwKKwkJfSwKKwkJeyB9CisJfTsKKwljb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZG1pID0gZG1pX2ZpcnN0X21hdGNoKHN5c2lkcyk7CisJdW5zaWduZWQgaW50IGZpbHRlcjsKKwlpbnQgaTsKKworCWlmICghZG1pKQorCQlyZXR1cm47CisKKwlmaWx0ZXIgPSAodW5zaWduZWQgbG9uZylkbWktPmRyaXZlcl9kYXRhOworCWRldl9wcmludGsoS0VSTl9JTkZPLCBob3N0LT5kZXYsCisJCSAgICJhcHBseWluZyBleHRyYSBBQ1BJIF9HVEYgZmlsdGVyIDB4JXggZm9yICVzXG4iLAorCQkgICBmaWx0ZXIsIGRtaS0+aWRlbnQpOworCisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdC0+cG9ydHNbaV07CisJCXN0cnVjdCBhdGFfbGluayAqbGluazsKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKworCQlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgRURHRSkKKwkJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBBTEwpCisJCQkJZGV2LT5ndGZfZmlsdGVyIHw9IGZpbHRlcjsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGFoY2lfZ3RmX2ZpbHRlcl93b3JrYXJvdW5kKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKK3t9CisjZW5kaWYKKwogc3RhdGljIGludCBhaGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwpAQCAtMjkyNiw5ICszMDMyLDkgQEAKIAlpZiAoYm9hcmRfaWQgPT0gYm9hcmRfYWhjaV9zYjcwMCAmJiBwZGV2LT5yZXZpc2lvbiA+PSAweDQwKQogCQlocHJpdi0+ZmxhZ3MgJj0gfkFIQ0lfSEZMQUdfSUdOX1NFUlJfSU5URVJOQUw7CiAKLQkvKiBhcHBseSBzYjYwMCAzMmJpdCBvbmx5IHF1aXJrICovCi0JaWYgKGFoY2lfc2I2MDBfMzJiaXRfb25seShwZGV2KSkKLQkJaHByaXYtPmZsYWdzIHw9IEFIQ0lfSEZMQUdfMzJCSVRfT05MWTsKKwkvKiBvbmx5IHNvbWUgU0I2MDBzIGNhbiBkbyA2NGJpdCBETUEgKi8KKwlpZiAoYWhjaV9zYjYwMF9lbmFibGVfNjRiaXQocGRldikpCisJCWhwcml2LT5mbGFncyAmPSB+QUhDSV9IRkxBR18zMkJJVF9PTkxZOwogCiAJaWYgKChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX05PX01TSSkgfHwgcGNpX2VuYWJsZV9tc2kocGRldikpCiAJCXBjaV9pbnR4KHBkZXYsIDEpOwpAQCAtMzAyMyw2ICszMTI5LDkgQEAKIAkvKiBhcHBseSB3b3JrYXJvdW5kIGZvciBBU1VTIFA1VyBESCBEZWx1eGUgbWFpbmJvYXJkICovCiAJYWhjaV9wNXdkaF93b3JrYXJvdW5kKGhvc3QpOwogCisJLyogYXBwbHkgZ3RmIGZpbHRlciBxdWlyayAqLworCWFoY2lfZ3RmX2ZpbHRlcl93b3JrYXJvdW5kKGhvc3QpOworCiAJLyogaW5pdGlhbGl6ZSBhZGFwdGVyICovCiAJcmMgPSBhaGNpX2NvbmZpZ3VyZV9kbWFfbWFza3MocGRldiwgaHByaXYtPmNhcCAmIEhPU1RfQ0FQXzY0KTsKIAlpZiAocmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYwppbmRleCAwMTk2NGI2Li5iMDg4MmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKQEAgLTIwLDE5ICsyMCw5IEBACiAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAKLWVudW0gewotCUFUQV9BQ1BJX0ZJTFRFUl9TRVRYRkVSCT0gMSA8PCAwLAotCUFUQV9BQ1BJX0ZJTFRFUl9MT0NLCT0gMSA8PCAxLAotCUFUQV9BQ1BJX0ZJTFRFUl9ESVBNCT0gMSA8PCAyLAotCi0JQVRBX0FDUElfRklMVEVSX0RFRkFVTFQJPSBBVEFfQUNQSV9GSUxURVJfU0VUWEZFUiB8Ci0JCQkJICBBVEFfQUNQSV9GSUxURVJfTE9DSyB8Ci0JCQkJICBBVEFfQUNQSV9GSUxURVJfRElQTSwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2FjcGlfZ3RmX2ZpbHRlciA9IEFUQV9BQ1BJX0ZJTFRFUl9ERUZBVUxUOwordW5zaWduZWQgaW50IGF0YV9hY3BpX2d0Zl9maWx0ZXIgPSBBVEFfQUNQSV9GSUxURVJfREVGQVVMVDsKIG1vZHVsZV9wYXJhbV9uYW1lZChhY3BpX2d0Zl9maWx0ZXIsIGF0YV9hY3BpX2d0Zl9maWx0ZXIsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGFjcGlfZ3RmX2ZpbHRlciwgImZpbHRlciBtYXNrIGZvciBBQ1BJIF9HVEYgY29tbWFuZHMsIHNldCB0byBmaWx0ZXIgb3V0ICgweDE9c2V0IHhmZXJtb2RlLCAweDI9bG9jay9mcmVlemUgbG9jaywgMHg0PURJUE0pIik7CitNT0RVTEVfUEFSTV9ERVNDKGFjcGlfZ3RmX2ZpbHRlciwgImZpbHRlciBtYXNrIGZvciBBQ1BJIF9HVEYgY29tbWFuZHMsIHNldCB0byBmaWx0ZXIgb3V0ICgweDE9c2V0IHhmZXJtb2RlLCAweDI9bG9jay9mcmVlemUgbG9jaywgMHg0PURJUE0sIDB4OD1GUERNQSBub24temVybyBvZmZzZXQsIDB4MTA9RlBETUEgRE1BIFNldHVwIEZJUyBhdXRvLWFjdGl2YXRlKSIpOwogCiAjZGVmaW5lIE5PX1BPUlRfTVVMVAkJMHhmZmZmCiAjZGVmaW5lIFNBVEFfQURSKHJvb3QsIHBtcCkJKCgocm9vdCkgPDwgMTYpIHwgKHBtcCkpCkBAIC02MTMsMTAgKzYwMywxMSBAQAogCXRmLT5jb21tYW5kID0gZ3RmLT50Zls2XTsJLyogMHgxZjcgKi8KIH0KIAotc3RhdGljIGludCBhdGFfYWNwaV9maWx0ZXJfdGYoY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsCitzdGF0aWMgaW50IGF0YV9hY3BpX2ZpbHRlcl90ZihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICpwdGYpCiB7Ci0JaWYgKGF0YV9hY3BpX2d0Zl9maWx0ZXIgJiBBVEFfQUNQSV9GSUxURVJfU0VUWEZFUikgeworCWlmIChkZXYtPmd0Zl9maWx0ZXIgJiBBVEFfQUNQSV9GSUxURVJfU0VUWEZFUikgewogCQkvKiBsaWJhdGEgZG9lc24ndCB1c2UgQUNQSSB0byBjb25maWd1cmUgdHJhbnNmZXIgbW9kZS4KIAkJICogSXQgd2lsbCBvbmx5IGNvbmZ1c2UgZGV2aWNlIGNvbmZpZ3VyYXRpb24uICBTa2lwLgogCQkgKi8KQEAgLTYyNSw3ICs2MTYsNyBAQAogCQkJcmV0dXJuIDE7CiAJfQogCi0JaWYgKGF0YV9hY3BpX2d0Zl9maWx0ZXIgJiBBVEFfQUNQSV9GSUxURVJfTE9DSykgeworCWlmIChkZXYtPmd0Zl9maWx0ZXIgJiBBVEFfQUNQSV9GSUxURVJfTE9DSykgewogCQkvKiBCSU9TIHdyaXRlcnMsIHNvcnJ5IGJ1dCB3ZSBkb24ndCB3YW5uYSBsb2NrCiAJCSAqIGZlYXR1cmVzIHVubGVzcyB0aGUgdXNlciBleHBsaWNpdGx5IHNhaWQgc28uCiAJCSAqLwpAQCAtNjQ3LDEyICs2MzgsMjMgQEAKIAkJCXJldHVybiAxOwogCX0KIAotCWlmIChhdGFfYWNwaV9ndGZfZmlsdGVyICYgQVRBX0FDUElfRklMVEVSX0RJUE0pIHsKKwlpZiAodGYtPmNvbW1hbmQgPT0gQVRBX0NNRF9TRVRfRkVBVFVSRVMgJiYKKwkgICAgdGYtPmZlYXR1cmUgPT0gU0VURkVBVFVSRVNfU0FUQV9FTkFCTEUpIHsKIAkJLyogaW5oaWJpdCBlbmFibGluZyBESVBNICovCi0JCWlmICh0Zi0+Y29tbWFuZCA9PSBBVEFfQ01EX1NFVF9GRUFUVVJFUyAmJgotCQkgICAgdGYtPmZlYXR1cmUgPT0gU0VURkVBVFVSRVNfU0FUQV9FTkFCTEUgJiYKKwkJaWYgKGRldi0+Z3RmX2ZpbHRlciAmIEFUQV9BQ1BJX0ZJTFRFUl9ESVBNICYmCiAJCSAgICB0Zi0+bnNlY3QgPT0gU0FUQV9ESVBNKQogCQkJcmV0dXJuIDE7CisKKwkJLyogaW5oaWJpdCBGUERNQSBub24temVybyBvZmZzZXQgKi8KKwkJaWYgKGRldi0+Z3RmX2ZpbHRlciAmIEFUQV9BQ1BJX0ZJTFRFUl9GUERNQV9PRkZTRVQgJiYKKwkJICAgICh0Zi0+bnNlY3QgPT0gU0FUQV9GUERNQV9PRkZTRVQgfHwKKwkJICAgICB0Zi0+bnNlY3QgPT0gU0FUQV9GUERNQV9JTl9PUkRFUikpCisJCQlyZXR1cm4gMTsKKworCQkvKiBpbmhpYml0IEZQRE1BIGF1dG8gYWN0aXZhdGlvbiAqLworCQlpZiAoZGV2LT5ndGZfZmlsdGVyICYgQVRBX0FDUElfRklMVEVSX0ZQRE1BX0FBICYmCisJCSAgICB0Zi0+bnNlY3QgPT0gU0FUQV9GUERNQV9BQSkKKwkJCXJldHVybiAxOwogCX0KIAogCXJldHVybiAwOwpAQCAtNzA0LDcgKzcwNiw3IEBACiAJCXBwdGYgPSAmcHRmOwogCX0KIAotCWlmICghYXRhX2FjcGlfZmlsdGVyX3RmKCZ0ZiwgcHB0ZikpIHsKKwlpZiAoIWF0YV9hY3BpX2ZpbHRlcl90ZihkZXYsICZ0ZiwgcHB0ZikpIHsKIAkJcnRmID0gdGY7CiAJCWVycl9tYXNrID0gYXRhX2V4ZWNfaW50ZXJuYWwoZGV2LCAmcnRmLCBOVUxMLAogCQkJCQkgICAgIERNQV9OT05FLCBOVUxMLCAwLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCmluZGV4IDBkZGFmNDMuLmRjNzI2OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwpAQCAtNDkxOSwxMCArNDkxOSwxMSBAQAogICovCiB2b2lkIGF0YV9xY19mcmVlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXVuc2lnbmVkIGludCB0YWc7CiAKIAlXQVJOX09OX09OQ0UocWMgPT0gTlVMTCk7IC8qIGF0YV9xY19mcm9tX3RhZyBfbWlnaHRfIHJldHVybiBOVUxMICovCisJYXAgPSBxYy0+YXA7CiAKIAlxYy0+ZmxhZ3MgPSAwOwogCXRhZyA9IHFjLT50YWc7CkBAIC00OTM0LDExICs0OTM1LDEzIEBACiAKIHZvaWQgX19hdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwotCXN0cnVjdCBhdGFfbGluayAqbGluayA9IHFjLT5kZXYtPmxpbms7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwlzdHJ1Y3QgYXRhX2xpbmsgKmxpbms7CiAKIAlXQVJOX09OX09OQ0UocWMgPT0gTlVMTCk7IC8qIGF0YV9xY19mcm9tX3RhZyBfbWlnaHRfIHJldHVybiBOVUxMICovCiAJV0FSTl9PTl9PTkNFKCEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19BQ1RJVkUpKTsKKwlhcCA9IHFjLT5hcDsKKwlsaW5rID0gcWMtPmRldi0+bGluazsKIAogCWlmIChsaWtlbHkocWMtPmZsYWdzICYgQVRBX1FDRkxBR19ETUFNQVApKQogCQlhdGFfc2dfY2xlYW4ocWMpOwpAQCAtNTAyOCwxMiArNTAzMSwxNCBAQAogCQkJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfRkFJTEVEOwogCiAJCWlmICh1bmxpa2VseShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkpIHsKLQkJCWlmICghYXRhX3RhZ19pbnRlcm5hbChxYy0+dGFnKSkgewotCQkJCS8qIGFsd2F5cyBmaWxsIHJlc3VsdCBURiBmb3IgZmFpbGVkIHFjICovCi0JCQkJZmlsbF9yZXN1bHRfdGYocWMpOworCQkJLyogYWx3YXlzIGZpbGwgcmVzdWx0IFRGIGZvciBmYWlsZWQgcWMgKi8KKwkJCWZpbGxfcmVzdWx0X3RmKHFjKTsKKworCQkJaWYgKCFhdGFfdGFnX2ludGVybmFsKHFjLT50YWcpKQogCQkJCWF0YV9xY19zY2hlZHVsZV9laChxYyk7Ci0JCQkJcmV0dXJuOwotCQkJfQorCQkJZWxzZQorCQkJCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwkJCXJldHVybjsKIAkJfQogCiAJCVdBUk5fT05fT05DRShhcC0+cGZsYWdzICYgQVRBX1BGTEFHX0ZST1pFTik7CkBAIC01NTkxLDYgKzU1OTYsOSBAQAogCiAJCWRldi0+bGluayA9IGxpbms7CiAJCWRldi0+ZGV2bm8gPSBkZXYgLSBsaW5rLT5kZXZpY2U7CisjaWZkZWYgQ09ORklHX0FUQV9BQ1BJCisJCWRldi0+Z3RmX2ZpbHRlciA9IGF0YV9hY3BpX2d0Zl9maWx0ZXI7CisjZW5kaWYKIAkJYXRhX2Rldl9pbml0KGRldik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCBhMDQ0ODhmLi5iYmEyYWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtMjY2NywxNCArMjY2NywxNCBAQAogCQlkZXYtPnBpb19tb2RlID0gWEZFUl9QSU9fMDsKIAkJZGV2LT5mbGFncyAmPSB+QVRBX0RGTEFHX1NMRUVQSU5HOwogCi0JCWlmICghYXRhX3BoeXNfbGlua19vZmZsaW5lKGF0YV9kZXZfcGh5c19saW5rKGRldikpKSB7Ci0JCQkvKiBhcHBseSBjbGFzcyBvdmVycmlkZSAqLwotCQkJaWYgKGxmbGFncyAmIEFUQV9MRkxBR19BU1NVTUVfQVRBKQotCQkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX0FUQTsKLQkJCWVsc2UgaWYgKGxmbGFncyAmIEFUQV9MRkxBR19BU1NVTUVfU0VNQikKLQkJCQljbGFzc2VzW2Rldi0+ZGV2bm9dID0gQVRBX0RFVl9TRU1CX1VOU1VQOwotCQl9IGVsc2UKLQkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX05PTkU7CisJCWlmIChhdGFfcGh5c19saW5rX29mZmxpbmUoYXRhX2Rldl9waHlzX2xpbmsoZGV2KSkpCisJCQljb250aW51ZTsKKworCQkvKiBhcHBseSBjbGFzcyBvdmVycmlkZSAqLworCQlpZiAobGZsYWdzICYgQVRBX0xGTEFHX0FTU1VNRV9BVEEpCisJCQljbGFzc2VzW2Rldi0+ZGV2bm9dID0gQVRBX0RFVl9BVEE7CisJCWVsc2UgaWYgKGxmbGFncyAmIEFUQV9MRkxBR19BU1NVTUVfU0VNQikKKwkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX1NFTUJfVU5TVVA7CiAJfQogCiAJLyogcmVjb3JkIGN1cnJlbnQgbGluayBzcGVlZCAqLwpAQCAtMjcxMywzNCArMjcxMyw0OCBAQAogCWFwLT5wZmxhZ3MgJj0gfkFUQV9QRkxBR19FSF9QRU5ESU5HOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobGluay0+YXAtPmxvY2ssIGZsYWdzKTsKIAotCS8qIE1ha2Ugc3VyZSBvbmxpbmVuZXNzIGFuZCBjbGFzc2lmaWNhdGlvbiByZXN1bHQgY29ycmVzcG9uZC4KKwkvKgorCSAqIE1ha2Ugc3VyZSBvbmxpbmVuZXNzIGFuZCBjbGFzc2lmaWNhdGlvbiByZXN1bHQgY29ycmVzcG9uZC4KIAkgKiBIb3RwbHVnIGNvdWxkIGhhdmUgaGFwcGVuZWQgZHVyaW5nIHJlc2V0IGFuZCBzb21lCiAJICogY29udHJvbGxlcnMgZmFpbCB0byB3YWl0IHdoaWxlIGEgZHJpdmUgaXMgc3Bpbm5pbmcgdXAgYWZ0ZXIKIAkgKiBiZWluZyBob3RwbHVnZ2VkIGNhdXNpbmcgbWlzZGV0ZWN0aW9uLiAgQnkgY3Jvc3MgY2hlY2tpbmcKLQkgKiBsaW5rIG9ubGluZW5lc3MgYW5kIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCwgdGhvc2UgY29uZGl0aW9ucwotCSAqIGNhbiBiZSByZWxpYWJseSBkZXRlY3RlZCBhbmQgcmV0cmllZC4KKwkgKiBsaW5rIG9uL29mZmxpbmVuZXNzIGFuZCBjbGFzc2lmaWNhdGlvbiByZXN1bHQsIHRob3NlCisJICogY29uZGl0aW9ucyBjYW4gYmUgcmVsaWFibHkgZGV0ZWN0ZWQgYW5kIHJldHJpZWQuCiAJICovCiAJbnJfdW5rbm93biA9IDA7CiAJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEFMTCkgewotCQkvKiBjb252ZXJ0IGFsbCBBVEFfREVWX1VOS05PV04gdG8gQVRBX0RFVl9OT05FICovCi0JCWlmIChjbGFzc2VzW2Rldi0+ZGV2bm9dID09IEFUQV9ERVZfVU5LTk9XTikgewotCQkJY2xhc3Nlc1tkZXYtPmRldm5vXSA9IEFUQV9ERVZfTk9ORTsKLQkJCWlmIChhdGFfcGh5c19saW5rX29ubGluZShhdGFfZGV2X3BoeXNfbGluayhkZXYpKSkKKwkJaWYgKGF0YV9waHlzX2xpbmtfb25saW5lKGF0YV9kZXZfcGh5c19saW5rKGRldikpKSB7CisJCQlpZiAoY2xhc3Nlc1tkZXYtPmRldm5vXSA9PSBBVEFfREVWX1VOS05PV04pIHsKKwkJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsICJsaW5rIG9ubGluZSAiCisJCQkJCSAgICAgICAiYnV0IGRldmljZSBtaXNjbGFzc2lmZWRcbiIpOworCQkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX05PTkU7CiAJCQkJbnJfdW5rbm93bisrOworCQkJfQorCQl9IGVsc2UgaWYgKGF0YV9waHlzX2xpbmtfb2ZmbGluZShhdGFfZGV2X3BoeXNfbGluayhkZXYpKSkgeworCQkJaWYgKGF0YV9jbGFzc19lbmFibGVkKGNsYXNzZXNbZGV2LT5kZXZub10pKQorCQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgImxpbmsgb2ZmbGluZSwgIgorCQkJCQkgICAgICAgImNsZWFyaW5nIGNsYXNzICVkIHRvIE5PTkVcbiIsCisJCQkJCSAgICAgICBjbGFzc2VzW2Rldi0+ZGV2bm9dKTsKKwkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX05PTkU7CisJCX0gZWxzZSBpZiAoY2xhc3Nlc1tkZXYtPmRldm5vXSA9PSBBVEFfREVWX1VOS05PV04pIHsKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgImxpbmsgc3RhdHVzIHVua25vd24sICIKKwkJCQkgICAgICAgImNsZWFyaW5nIFVOS05PV04gdG8gTk9ORVxuIik7CisJCQljbGFzc2VzW2Rldi0+ZGV2bm9dID0gQVRBX0RFVl9OT05FOwogCQl9CiAJfQogCiAJaWYgKGNsYXNzaWZ5ICYmIG5yX3Vua25vd24pIHsKIAkJaWYgKHRyeSA8IG1heF90cmllcykgewogCQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywgImxpbmsgb25saW5lIGJ1dCAiCi0JCQkJICAgICAgICJkZXZpY2UgbWlzY2xhc3NpZmllZCwgcmV0cnlpbmdcbiIpOworCQkJCQkiJWQgZGV2aWNlcyBtaXNjbGFzc2lmaWVkLCByZXRyeWluZ1xuIiwKKwkJCQkJbnJfdW5rbm93bik7CiAJCQlmYWlsZWRfbGluayA9IGxpbms7CiAJCQlyYyA9IC1FQUdBSU47CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywKLQkJCSAgICAgICAibGluayBvbmxpbmUgYnV0IGRldmljZSBtaXNjbGFzc2lmaWVkLCAiCi0JCQkgICAgICAgImRldmljZSBkZXRlY3Rpb24gbWlnaHQgZmFpbFxuIik7CisJCQkJImxpbmsgb25saW5lIGJ1dCAlZCBkZXZpY2VzIG1pc2NsYXNzaWZpZWQsICIKKwkJCQkiZGV2aWNlIGRldGVjdGlvbiBtaWdodCBmYWlsXG4iLCBucl91bmtub3duKTsKIAl9CiAKIAkvKiByZXNldCBzdWNjZXNzZnVsLCBzY2hlZHVsZSByZXZhbGlkYXRpb24gKi8KQEAgLTI5NjcsMTIgKzI5ODEsMTQgQEAKIAkgKiBkZXZpY2UgZGV0ZWN0aW9uIG1lc3NhZ2VzIGJhY2t3YXJkcy4KIAkgKi8KIAlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKSB7Ci0JCWlmICghKG5ld19tYXNrICYgKDEgPDwgZGV2LT5kZXZubykpIHx8Ci0JCSAgICBkZXYtPmNsYXNzID09IEFUQV9ERVZfUE1QKQorCQlpZiAoIShuZXdfbWFzayAmICgxIDw8IGRldi0+ZGV2bm8pKSkKIAkJCWNvbnRpbnVlOwogCiAJCWRldi0+Y2xhc3MgPSBlaGMtPmNsYXNzZXNbZGV2LT5kZXZub107CiAKKwkJaWYgKGRldi0+Y2xhc3MgPT0gQVRBX0RFVl9QTVApCisJCQljb250aW51ZTsKKwogCQllaGMtPmkuZmxhZ3MgfD0gQVRBX0VISV9QUklOVElORk87CiAJCXJjID0gYXRhX2Rldl9jb25maWd1cmUoZGV2KTsKIAkJZWhjLT5pLmZsYWdzICY9IH5BVEFfRUhJX1BSSU5USU5GTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS5oIGIvZHJpdmVycy9hdGEvbGliYXRhLmgKaW5kZXggYmU4ZTI2Mi4uODIzZTYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLmgKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLmgKQEAgLTExOCw2ICsxMTgsOCBAQAogCiAvKiBsaWJhdGEtYWNwaS5jICovCiAjaWZkZWYgQ09ORklHX0FUQV9BQ1BJCitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9hY3BpX2d0Zl9maWx0ZXI7CisKIGV4dGVybiB2b2lkIGF0YV9hY3BpX2Fzc29jaWF0ZV9zYXRhX3BvcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfYWNwaV9hc3NvY2lhdGUoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKIGV4dGVybiB2b2lkIGF0YV9hY3BpX2Rpc3NvY2lhdGUoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCmluZGV4IGZjOWM1ZDYuLjE0MzJkYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAKIAlpZiAocHJpbnRfaW5mbyAmJiBhZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJICYmICFhbGlfYXRhcGlfZG1hKSB7CiAJCWF0YV9kZXZfcHJpbnRrKGFkZXYsIEtFUk5fV0FSTklORywKLQkJCSAgICAgICAiV0FSTklORzogQVRBUEkgRE1BIGRpc2FibGVkIGZvciByZWxpYWJsaXR5IGlzc3Vlcy4gIEl0IGNhbiBiZSBlbmFibGVkXG4iKTsKKwkJCSAgICAgICAiV0FSTklORzogQVRBUEkgRE1BIGRpc2FibGVkIGZvciByZWxpYWJpbGl0eSBpc3N1ZXMuICBJdCBjYW4gYmUgZW5hYmxlZFxuIik7CiAJCWF0YV9kZXZfcHJpbnRrKGFkZXYsIEtFUk5fV0FSTklORywKIAkJCSAgICAgICAiV0FSTklORzogdmlhIHBhdGFfYWxpLmF0YXBpX2RtYSBtb2RwYXJhbSBvciBjb3JyZXNwb25kaW5nIHN5c2ZzIG5vZGUuXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYwppbmRleCBhYTRiM2Y2Li5hZTQ0NTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKQEAgLTI0Niw3ICsyNDYsNyBAQAogCXsgUENJX1ZERVZJQ0UoQVRJLCBQQ0lfREVWSUNFX0lEX0FUSV9JWFA0MDBfSURFKSwgfSwKIAl7IFBDSV9WREVWSUNFKEFUSSwgUENJX0RFVklDRV9JRF9BVElfSVhQNjAwX0lERSksIH0sCiAJeyBQQ0lfVkRFVklDRShBVEksIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDcwMF9JREUpLCB9LAotCXsgUENJX1ZERVZJQ0UoQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9TQjkwMF9JREUpLCB9LAorCXsgUENJX1ZERVZJQ0UoQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9IVURTT04yX0lERSksIH0sCiAKIAl7IH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdHA4Njd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYwppbmRleCA3OTkwZGU5Li42ZmU3ZGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYwpAQCAtMTE4LDIwICsxMTgsMTMgQEAKIAlpbnQJCXBjaTY2bWh6OwogfTsKIAotc3RhdGljIGlubGluZSB1OCBhdHA4Njd4X3NwZWVkX3RvX21vZGUodTggc3BlZWQpCi17Ci0JcmV0dXJuIHNwZWVkIC0gWEZFUl9VRE1BXzAgKyAxOwotfQotCiBzdGF0aWMgdm9pZCBhdHA4Njd4X3NldF9kbWFtb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAlzdHJ1Y3QgYXRwODY3eF9wcml2ICpkcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJdTggc3BlZWQgPSBhZGV2LT5kbWFfbW9kZTsKIAl1OCBiOwotCXU4IG1vZGU7Ci0KLQltb2RlID0gYXRwODY3eF9zcGVlZF90b19tb2RlKHNwZWVkKTsKKwl1OCBtb2RlID0gc3BlZWQgLSBYRkVSX1VETUFfMCArIDE7CiAKIAkvKgogCSAqIERvYyA2LjYuOTogZGVjcmVhc2UgdGhlIHVkbWEgbW9kZSB2YWx1ZSBieSAxIGZvciBzYWZlciBVRE1BIHNwZWVkCkBAIC0xNTYsMjUgKzE0OSwzOCBAQAogCWlvd3JpdGU4KGIsIGRwLT5kbWFfbW9kZSk7CiB9CiAKLXN0YXRpYyBpbnQgYXRwODY3eF9nZXRfYWN0aXZlX2Nsb2Nrc19zaGlmdGVkKHVuc2lnbmVkIGludCBjbGspCitzdGF0aWMgaW50IGF0cDg2N3hfZ2V0X2FjdGl2ZV9jbG9ja3Nfc2hpZnRlZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCXVuc2lnbmVkIGludCBjbGspCiB7CisJc3RydWN0IGF0cDg2N3hfcHJpdiAqZHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGNoYXIgY2xvY2tzID0gY2xrOwogCisJLyoKKwkgKiBEb2MgNi42Ljk6IGluY3JlYXNlIHRoZSBjbG9jayB2YWx1ZSBieSAxIGZvciBzYWZlciBQSU8gc3BlZWQKKwkgKiBvbiA2Nk1IeiBidXMKKwkgKi8KKwlpZiAoZHAtPnBjaTY2bWh6KQorCQljbG9ja3MrKzsKKwogCXN3aXRjaCAoY2xvY2tzKSB7CiAJY2FzZSAwOgogCQljbG9ja3MgPSAxOwogCQlicmVhazsKLQljYXNlIDEgLi4uIDc6Ci0JCWJyZWFrOwotCWNhc2UgOCAuLi4gMTI6Ci0JCWNsb2NrcyA9IDc7CisJY2FzZSAxIC4uLiA2OgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9XQVJOSU5HICJBVFA4NjdYOiBhY3RpdmUgJWRjbGsgaXMgaW52YWxpZC4gIgotCQkJIlVzaW5nIGRlZmF1bHQgOGNsay5cbiIsIGNsayk7Ci0JCWNsb2NrcyA9IDA7CS8qIDggY2xrICovCisJCQkiVXNpbmcgMTJjbGsuXG4iLCBjbGspOworCWNhc2UgOSAuLi4gMTI6CisJCWNsb2NrcyA9IDc7CS8qIDEyIGNsayAqLwogCQlicmVhazsKKwljYXNlIDc6CisJY2FzZSA4OgkvKiBkZWZhdWx0IDggY2xrICovCisJCWNsb2NrcyA9IDA7CisJCWdvdG8gYWN0aXZlX2Nsb2NrX3NoaWZ0X2RvbmU7CiAJfQorCithY3RpdmVfY2xvY2tfc2hpZnRfZG9uZToKIAlyZXR1cm4gY2xvY2tzIDw8IEFUUDg2N1hfSU9fUElPU1BEX0FDVElWRV9TSElGVDsKIH0KIApAQCAtMTg4LDIwICsxOTQsMjAgQEAKIAkJYnJlYWs7CiAJY2FzZSAxIC4uLiAxMToKIAkJYnJlYWs7Ci0JY2FzZSAxMjoKLQkJY2xvY2tzID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxMzogY2FzZSAxNDoKLQkJLS1jbG9ja3M7CisJY2FzZSAxMzoKKwljYXNlIDE0OgorCQktLWNsb2NrczsJLyogYnkgdGhlIHNwZWMgKi8KIAkJYnJlYWs7CiAJY2FzZSAxNToKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVRQODY3WDogcmVjb3ZlciAlZGNsayBpcyBpbnZhbGlkLiAiCi0JCQkiVXNpbmcgZGVmYXVsdCAxNWNsay5cbiIsIGNsayk7Ci0JCWNsb2NrcyA9IDA7CS8qIDEyIGNsayAqLworCQkJIlVzaW5nIGRlZmF1bHQgMTJjbGsuXG4iLCBjbGspOworCWNhc2UgMTI6CS8qIGRlZmF1bHQgMTIgY2xrICovCisJCWNsb2NrcyA9IDA7CiAJCWJyZWFrOwogCX0KKwogCXJldHVybiBjbG9ja3MgPDwgQVRQODY3WF9JT19QSU9TUERfUkVDT1ZFUl9TSElGVDsKIH0KIApAQCAtMjMwLDI1ICsyMzYsMzggQEAKIAkJYiA9IChiICYgfkFUUDg2N1hfSU9fRE1BTU9ERV9NU1RSX01BU0spOwogCWlvd3JpdGU4KGIsIGRwLT5kbWFfbW9kZSk7CiAKLQliID0gYXRwODY3eF9nZXRfYWN0aXZlX2Nsb2Nrc19zaGlmdGVkKHQuYWN0aXZlKSB8Ci0JCWF0cDg2N3hfZ2V0X3JlY292ZXJfY2xvY2tzX3NoaWZ0ZWQodC5yZWNvdmVyKTsKLQlpZiAoZHAtPnBjaTY2bWh6KQotCQliICs9IDB4MTA7CisJYiA9IGF0cDg2N3hfZ2V0X2FjdGl2ZV9jbG9ja3Nfc2hpZnRlZChhcCwgdC5hY3RpdmUpIHwKKwkgICAgYXRwODY3eF9nZXRfcmVjb3Zlcl9jbG9ja3Nfc2hpZnRlZCh0LnJlY292ZXIpOwogCiAJaWYgKGFkZXYtPmRldm5vICYgMSkKIAkJaW93cml0ZTgoYiwgZHAtPnNsYXZlX3Bpb3NwZCk7CiAJZWxzZQogCQlpb3dyaXRlOChiLCBkcC0+bXN0cl9waW9zcGQpOwogCi0JLyoKLQkgKiB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIGNvbWFuZCB0aW1pbmcgYXMgZm9yIFBJTyB0aW1pbWcKLQkgKi8KKwliID0gYXRwODY3eF9nZXRfYWN0aXZlX2Nsb2Nrc19zaGlmdGVkKGFwLCB0LmFjdDhiKSB8CisJICAgIGF0cDg2N3hfZ2V0X3JlY292ZXJfY2xvY2tzX3NoaWZ0ZWQodC5yZWM4Yik7CisKIAlpb3dyaXRlOChiLCBkcC0+ZWlnaHRiX3Bpb3NwZCk7CiB9CiAKK3N0YXRpYyBpbnQgYXRwODY3eF9jYWJsZV9vdmVycmlkZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAocGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FSVE9QICYmCisJCShwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODY3QSB8fAorCQkgcGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2N0IpKSB7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhdHA4Njd4X2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXJldHVybiBBVEFfQ0JMX1BBVEE0MF9TSE9SVDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisKKwlpZiAoYXRwODY3eF9jYWJsZV9vdmVycmlkZShwZGV2KSkKKwkJcmV0dXJuIEFUQV9DQkxfUEFUQTQwX1NIT1JUOworCisJcmV0dXJuIEFUQV9DQkxfUEFUQV9VTks7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGF0cDg2N3hfc2h0ID0gewpAQCAtNDcxLDcgKzQ5MCw2IEBACiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fODY3eCA9IHsKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LAotCQkubXdkbWFfbWFzawk9IEFUQV9NV0RNQTIsCiAJCS51ZG1hX21hc2sgCT0gQVRBX1VETUE2LAogCQkucG9ydF9vcHMJPSAmYXRwODY3eF9vcHMsCiAJfTsKQEAgLTUxNSw2ICs1MzMsMjMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXRwODY3eF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgcmM7CisKKwlyYyA9IGF0YV9wY2lfZGV2aWNlX2RvX3Jlc3VtZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWF0cDg2N3hfZml4dXAoaG9zdCk7CisKKwlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGF0cDg2N3hfcGNpX3RibFtdID0gewogCXsgUENJX1ZERVZJQ0UoQVJUT1AsIFBDSV9ERVZJQ0VfSURfQVJUT1BfQVRQODY3QSksCTAgfSwKIAl7IFBDSV9WREVWSUNFKEFSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2N0IpLAkwIH0sCkBAIC01MjYsNiArNTYxLDEwIEBACiAJLmlkX3RhYmxlIAk9IGF0cDg2N3hfcGNpX3RibCwKIAkucHJvYmUgCQk9IGF0cDg2N3hfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRwODY3eF9yZWluaXRfb25lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhdHA4Njd4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCmluZGV4IGY0OTgxNGQuLjNiYmVkODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYwpAQCAtMjM1LDggKzIzNSw3IEBACiAJCS51ZG1hX21hc2sgPSBBVEFfVURNQTIsCiAJCS5wb3J0X29wcyA9ICZzYzEyMDBfcG9ydF9vcHMKIAl9OwotCS8qIENhbid0IGVuYWJsZSBwb3J0IDIgeWV0LCBzZWUgdG9wIGNvbW1lbnRzICovCi0JY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07CiAKIAlyZXR1cm4gYXRhX3BjaV9zZmZfaW5pdF9vbmUoZGV2LCBwcGksICZzYzEyMDBfc2h0LCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCmluZGV4IDQ1NjU3Y2EuLjg4OTg0YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV92aWEuYwpAQCAtMTExLDcgKzExMSw3IEBACiAJeyAidnQ4MjUxIiwJUENJX0RFVklDRV9JRF9WSUFfODI1MSwgICAgIDB4MDAsIDB4MmYsIFZJQV9VRE1BXzEzMyB8IFZJQV9CQURfQVNUIH0sCiAJeyAiY3g3MDAiLAlQQ0lfREVWSUNFX0lEX1ZJQV9DWDcwMCwgICAgMHgwMCwgMHgyZiwgVklBX1VETUFfMTMzIHwgVklBX0JBRF9BU1QgfCBWSUFfU0FUQV9QQVRBIH0sCiAJeyAidnQ2NDEwIiwJUENJX0RFVklDRV9JRF9WSUFfNjQxMCwgICAgIDB4MDAsIDB4MmYsIFZJQV9VRE1BXzEzMyB8IFZJQV9CQURfQVNUIHwgVklBX05PX0VOQUJMRVMgfSwKLQl7ICJ2dDY0MTUiLAlQQ0lfREVWSUNFX0lEX1ZJQV82NDE1LCAgICAgMHgwMCwgMHgyZiwgVklBX1VETUFfMTMzIHwgVklBX0JBRF9BU1QgfCBWSUFfTk9fRU5BQkxFUyB9LAorCXsgInZ0NjQxNSIsCVBDSV9ERVZJQ0VfSURfVklBXzY0MTUsICAgICAweDAwLCAweGZmLCBWSUFfVURNQV8xMzMgfCBWSUFfQkFEX0FTVCB8IFZJQV9OT19FTkFCTEVTIH0sCiAJeyAidnQ4MjM3YSIsCVBDSV9ERVZJQ0VfSURfVklBXzgyMzdBLCAgICAweDAwLCAweDJmLCBWSUFfVURNQV8xMzMgfCBWSUFfQkFEX0FTVCB9LAogCXsgInZ0ODIzNyIsCVBDSV9ERVZJQ0VfSURfVklBXzgyMzcsICAgICAweDAwLCAweDJmLCBWSUFfVURNQV8xMzMgfCBWSUFfQkFEX0FTVCB9LAogCXsgInZ0ODIzNSIsCVBDSV9ERVZJQ0VfSURfVklBXzgyMzUsICAgICAweDAwLCAweDJmLCBWSUFfVURNQV8xMzMgfCBWSUFfQkFEX0FTVCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9tdi5jIGIvZHJpdmVycy9hdGEvc2F0YV9tdi5jCmluZGV4IDE3ZjlmZjkuLjZmNTA5M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbXYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX212LmMKQEAgLTEzODIsNiArMTM4MiwyNSBAQAogCSAqLwogCWlmIChwcC0+cHBfZmxhZ3MgJiBNVl9QUF9GTEFHX0RFTEFZRURfRUgpCiAJCXJldHVybiBBVEFfREVGRVJfUE9SVDsKKworCS8qIFBJTyBjb21tYW5kcyBuZWVkIGV4Y2x1c2l2ZSBsaW5rOiBubyBvdGhlciBjb21tYW5kcyBbRE1BIG9yIFBJT10KKwkgKiBjYW4gcnVuIGNvbmN1cnJlbnRseS4KKwkgKiBzZXQgZXhjbF9saW5rIHdoZW4gd2Ugd2FudCB0byBzZW5kIGEgUElPIGNvbW1hbmQgaW4gRE1BIG1vZGUKKwkgKiBvciBhIG5vbi1OQ1EgY29tbWFuZCBpbiBOQ1EgbW9kZS4KKwkgKiBXaGVuIHdlIHJlY2VpdmUgYSBjb21tYW5kIGZyb20gdGhhdCBsaW5rLCBhbmQgdGhlcmUgYXJlIG5vCisJICogb3V0c3RhbmRpbmcgY29tbWFuZHMsIG1hcmsgYSBmbGFnIHRvIGNsZWFyIGV4Y2xfbGluayBhbmQgbGV0CisJICogdGhlIGNvbW1hbmQgZ28gdGhyb3VnaC4KKwkgKi8KKwlpZiAodW5saWtlbHkoYXAtPmV4Y2xfbGluaykpIHsKKwkJaWYgKGxpbmsgPT0gYXAtPmV4Y2xfbGluaykgeworCQkJaWYgKGFwLT5ucl9hY3RpdmVfbGlua3MpCisJCQkJcmV0dXJuIEFUQV9ERUZFUl9QT1JUOworCQkJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfQ0xFQVJfRVhDTDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXJldHVybiBBVEFfREVGRVJfUE9SVDsKKwl9CisKIAkvKgogCSAqIElmIHRoZSBwb3J0IGlzIGNvbXBsZXRlbHkgaWRsZSwgdGhlbiBhbGxvdyB0aGUgbmV3IHFjLgogCSAqLwpAQCAtMTM5NSw4ICsxNDE0LDE0IEBACiAJICogZG9lc24ndCBhbGxvdyBpdC4KIAkgKi8KIAlpZiAoKHBwLT5wcF9mbGFncyAmIE1WX1BQX0ZMQUdfRURNQV9FTikgJiYKLQkgICAgKHBwLT5wcF9mbGFncyAmIE1WX1BQX0ZMQUdfTkNRX0VOKSAmJiBhdGFfaXNfbmNxKHFjLT50Zi5wcm90b2NvbCkpCi0JCXJldHVybiAwOworCSAgICAocHAtPnBwX2ZsYWdzICYgTVZfUFBfRkxBR19OQ1FfRU4pKSB7CisJCWlmIChhdGFfaXNfbmNxKHFjLT50Zi5wcm90b2NvbCkpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQlhcC0+ZXhjbF9saW5rID0gbGluazsKKwkJCXJldHVybiBBVEFfREVGRVJfUE9SVDsKKwkJfQorCX0KIAogCXJldHVybiBBVEFfREVGRVJfUE9SVDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwppbmRleCA4NmE0MDU4Li4xZWI0ZTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCkBAIC0xNTk0LDkgKzE1OTQsMjEgQEAKIAkgICAgIWF0YV9kZXZfZW5hYmxlZChsaW5rLT5kZXZpY2UpKQogCQlzYXRhX2xpbmtfaGFyZHJlc2V0KGxpbmssIHNhdGFfZGViX3RpbWluZ19ob3RwbHVnLCBkZWFkbGluZSwKIAkJCQkgICAgTlVMTCwgTlVMTCk7Ci0JZWxzZSBpZiAoIShlaGMtPmkuZmxhZ3MgJiBBVEFfRUhJX1FVSUVUKSkKLQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fSU5GTywKLQkJCQkibnY6IHNraXBwaW5nIGhhcmRyZXNldCBvbiBvY2N1cGllZCBwb3J0XG4iKTsKKwllbHNlIHsKKwkJY29uc3QgdW5zaWduZWQgbG9uZyAqdGltaW5nID0gc2F0YV9laGNfZGViX3RpbWluZyhlaGMpOworCQlpbnQgcmM7CisKKwkJaWYgKCEoZWhjLT5pLmZsYWdzICYgQVRBX0VISV9RVUlFVCkpCisJCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9JTkZPLCAibnY6IHNraXBwaW5nICIKKwkJCQkJImhhcmRyZXNldCBvbiBvY2N1cGllZCBwb3J0XG4iKTsKKworCQkvKiBtYWtlIHN1cmUgdGhlIGxpbmsgaXMgb25saW5lICovCisJCXJjID0gc2F0YV9saW5rX3Jlc3VtZShsaW5rLCB0aW1pbmcsIGRlYWRsaW5lKTsKKwkJLyogd2hpbmUgYWJvdXQgcGh5IHJlc3VtZSBmYWlsdXJlIGJ1dCBwcm9jZWVkICovCisJCWlmIChyYyAmJiByYyAhPSAtRU9QTk9UU1VQUCkKKwkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX1dBUk5JTkcsICJmYWlsZWQgdG8gcmVzdW1lICIKKwkJCQkJImxpbmsgKGVycm5vPSVkKVxuIiwgcmMpOworCX0KIAogCS8qIGRldmljZSBzaWduYXR1cmUgYWNxdWlzaXRpb24gaXMgdW5yZWxpYWJsZSAqLwogCXJldHVybiAtRUFHQUlOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV92aWEuYyBiL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKaW5kZXggYmRkNDNjNy4uMDJlZmQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV92aWEuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCkBAIC05Myw3ICs5Myw2IEBACiAJeyBQQ0lfVkRFVklDRShWSUEsIDB4NzM3MiksIHZ0NjQyMCB9LAogCXsgUENJX1ZERVZJQ0UoVklBLCAweDUyODcpLCB2dDgyNTEgfSwgLyogMiBzYXRhIGNobmxzIChNYXN0ZXIvU2xhdmUpICovCiAJeyBQQ0lfVkRFVklDRShWSUEsIDB4OTAwMCksIHZ0ODI1MSB9LAotCXsgUENJX1ZERVZJQ0UoVklBLCAweDkwNDApLCB2dDgyNTEgfSwKIAogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYyBiL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYwppbmRleCA3MDMzNjRiLi42NmUxODEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKKysrIGIvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCkBAIC0xMzA2LDE0ICsxMzA2LDYgQEAKICAgcmV0dXJuOwogfQogCi0vKioqKioqKioqKiBTZXQgc29ja2V0IG9wdGlvbnMgZm9yIGEgVkMgKioqKioqKioqKi8KLQotLy8gaW50IGFtYl9nZXRzb2Nrb3B0IChzdHJ1Y3QgYXRtX3ZjYyAqIGF0bV92Y2MsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIHZvaWQgKiBvcHR2YWwsIGludCBvcHRsZW4pOwotCi0vKioqKioqKioqKiBTZXQgc29ja2V0IG9wdGlvbnMgZm9yIGEgVkMgKioqKioqKioqKi8KLQotLy8gaW50IGFtYl9zZXRzb2Nrb3B0IChzdHJ1Y3QgYXRtX3ZjYyAqIGF0bV92Y2MsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIHZvaWQgKiBvcHR2YWwsIGludCBvcHRsZW4pOwotCiAvKioqKioqKioqKiBTZW5kICoqKioqKioqKiovCiAKIHN0YXRpYyBpbnQgYW1iX3NlbmQgKHN0cnVjdCBhdG1fdmNjICogYXRtX3ZjYywgc3RydWN0IHNrX2J1ZmYgKiBza2IpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2VuaS5jIGIvZHJpdmVycy9hdG0vZW5pLmMKaW5kZXggNTUwM2JmYy4uMGMzMDI2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZW5pLmMKKysrIGIvZHJpdmVycy9hdG0vZW5pLmMKQEAgLTIwMzEsNyArMjAzMSw3IEBACiAKIAogc3RhdGljIGludCBlbmlfc2V0c29ja29wdChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLGludCBsZXZlbCxpbnQgb3B0bmFtZSwKLSAgICB2b2lkIF9fdXNlciAqb3B0dmFsLGludCBvcHRsZW4pCisgICAgdm9pZCBfX3VzZXIgKm9wdHZhbCx1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jIGIvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jCmluZGV4IGIxMTk2NDAuLmNkNTA0OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYworKysgYi9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMKQEAgLTEyNDQsNyArMTI0NCw3IEBACiAKIAogc3RhdGljIGludCBmc19zZXRzb2Nrb3B0KHN0cnVjdCBhdG1fdmNjICp2Y2MsaW50IGxldmVsLGludCBvcHRuYW1lLAotCQkJIHZvaWQgX191c2VyICpvcHR2YWwsaW50IG9wdGxlbikKKwkJCSB2b2lkIF9fdXNlciAqb3B0dmFsLHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJZnVuY19lbnRlciAoKTsKIAlmdW5jX2V4aXQgKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jIGIvZHJpdmVycy9hdG0vZm9yZTIwMGUuYwppbmRleCAxMGYwMDBkLi5mNzY2Y2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCisrKyBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKQEAgLTE3OTUsNyArMTc5NSw3IEBACiAKIAogc3RhdGljIGludAotZm9yZTIwMGVfc2V0c29ja29wdChzdHJ1Y3QgYXRtX3ZjYyogdmNjLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCB2b2lkIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorZm9yZTIwMGVfc2V0c29ja29wdChzdHJ1Y3QgYXRtX3ZjYyogdmNjLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCB2b2lkIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogICAgIC8qIHN0cnVjdCBmb3JlMjAwZSogZm9yZTIwMGUgPSBGT1JFMjAwRV9ERVYodmNjLT5kZXYpOyAqLwogICAgIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaGUuYyBiL2RyaXZlcnMvYXRtL2hlLmMKaW5kZXggMmRlNjQwNi4uNzA2NjcwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaGUuYworKysgYi9kcml2ZXJzL2F0bS9oZS5jCkBAIC03OTAsMTEgKzc5MCwxNSBAQAogCWhlX2Rldi0+cmJwc19iYXNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGVfZGV2LT5wY2lfZGV2LAogCQlDT05GSUdfUkJQU19TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV9yYnApLCAmaGVfZGV2LT5yYnBzX3BoeXMpOwogCWlmIChoZV9kZXYtPnJicHNfYmFzZSA9PSBOVUxMKSB7Ci0JCWhwcmludGsoImZhaWxlZCB0byBhbGxvYyByYnBzXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWhwcmludGsoImZhaWxlZCB0byBhbGxvYyByYnBzX2Jhc2VcbiIpOworCQlnb3RvIG91dF9kZXN0cm95X3JicHNfcG9vbDsKIAl9CiAJbWVtc2V0KGhlX2Rldi0+cmJwc19iYXNlLCAwLCBDT05GSUdfUkJQU19TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV9yYnApKTsKIAloZV9kZXYtPnJicHNfdmlydCA9IGttYWxsb2MoQ09ORklHX1JCUFNfU0laRSAqIHNpemVvZihzdHJ1Y3QgaGVfdmlydCksIEdGUF9LRVJORUwpOworCWlmIChoZV9kZXYtPnJicHNfdmlydCA9PSBOVUxMKSB7CisJCWhwcmludGsoImZhaWxlZCB0byBhbGxvYyByYnBzX3ZpcnRcbiIpOworCQlnb3RvIG91dF9mcmVlX3JicHNfYmFzZTsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX1JCUFNfU0laRTsgKytpKSB7CiAJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKQEAgLTgwMiw3ICs4MDYsNyBAQAogCiAJCWNwdWFkZHIgPSBwY2lfcG9vbF9hbGxvYyhoZV9kZXYtPnJicHNfcG9vbCwgR0ZQX0tFUk5FTHxHRlBfRE1BLCAmZG1hX2hhbmRsZSk7CiAJCWlmIChjcHVhZGRyID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfcmJwc192aXJ0OwogCiAJCWhlX2Rldi0+cmJwc192aXJ0W2ldLnZpcnQgPSBjcHVhZGRyOwogCQloZV9kZXYtPnJicHNfYmFzZVtpXS5zdGF0dXMgPSBSQlBfTE9BTkVEIHwgUkJQX1NNQUxMQlVGIHwgKGkgPDwgUkJQX0lOREVYX09GRik7CkBAIC04MjcsMTcgKzgzMSwyMSBAQAogCQkJQ09ORklHX1JCUExfQlVGU0laRSwgOCwgMCk7CiAJaWYgKGhlX2Rldi0+cmJwbF9wb29sID09IE5VTEwpIHsKIAkJaHByaW50aygidW5hYmxlIHRvIGNyZWF0ZSByYnBsIHBvb2xcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9yYnBzX3ZpcnQ7CiAJfQogCiAJaGVfZGV2LT5yYnBsX2Jhc2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoZV9kZXYtPnBjaV9kZXYsCiAJCUNPTkZJR19SQlBMX1NJWkUgKiBzaXplb2Yoc3RydWN0IGhlX3JicCksICZoZV9kZXYtPnJicGxfcGh5cyk7CiAJaWYgKGhlX2Rldi0+cmJwbF9iYXNlID09IE5VTEwpIHsKLQkJaHByaW50aygiZmFpbGVkIHRvIGFsbG9jIHJicGxcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJaHByaW50aygiZmFpbGVkIHRvIGFsbG9jIHJicGxfYmFzZVxuIik7CisJCWdvdG8gb3V0X2Rlc3Ryb3lfcmJwbF9wb29sOwogCX0KIAltZW1zZXQoaGVfZGV2LT5yYnBsX2Jhc2UsIDAsIENPTkZJR19SQlBMX1NJWkUgKiBzaXplb2Yoc3RydWN0IGhlX3JicCkpOwogCWhlX2Rldi0+cmJwbF92aXJ0ID0ga21hbGxvYyhDT05GSUdfUkJQTF9TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV92aXJ0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhlX2Rldi0+cmJwbF92aXJ0ID09IE5VTEwpIHsKKwkJaHByaW50aygiZmFpbGVkIHRvIGFsbG9jIHJicGxfdmlydFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfcmJwbF9iYXNlOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfUkJQTF9TSVpFOyArK2kpIHsKIAkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwpAQCAtODQ1LDcgKzg1Myw3IEBACiAKIAkJY3B1YWRkciA9IHBjaV9wb29sX2FsbG9jKGhlX2Rldi0+cmJwbF9wb29sLCBHRlBfS0VSTkVMfEdGUF9ETUEsICZkbWFfaGFuZGxlKTsKIAkJaWYgKGNwdWFkZHIgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOworCQkJZ290byBvdXRfZnJlZV9yYnBsX3ZpcnQ7CiAKIAkJaGVfZGV2LT5yYnBsX3ZpcnRbaV0udmlydCA9IGNwdWFkZHI7CiAJCWhlX2Rldi0+cmJwbF9iYXNlW2ldLnN0YXR1cyA9IFJCUF9MT0FORUQgfCAoaSA8PCBSQlBfSU5ERVhfT0ZGKTsKQEAgLTg3MCw3ICs4NzgsNyBAQAogCQlDT05GSUdfUkJSUV9TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV9yYnJxKSwgJmhlX2Rldi0+cmJycV9waHlzKTsKIAlpZiAoaGVfZGV2LT5yYnJxX2Jhc2UgPT0gTlVMTCkgewogCQlocHJpbnRrKCJmYWlsZWQgdG8gYWxsb2NhdGUgcmJycVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX3JicGxfdmlydDsKIAl9CiAJbWVtc2V0KGhlX2Rldi0+cmJycV9iYXNlLCAwLCBDT05GSUdfUkJSUV9TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV9yYnJxKSk7CiAKQEAgLTg5NCw3ICs5MDIsNyBAQAogCQlDT05GSUdfVEJSUV9TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV90YnJxKSwgJmhlX2Rldi0+dGJycV9waHlzKTsKIAlpZiAoaGVfZGV2LT50YnJxX2Jhc2UgPT0gTlVMTCkgewogCQlocHJpbnRrKCJmYWlsZWQgdG8gYWxsb2NhdGUgdGJycVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX3JicHFfYmFzZTsKIAl9CiAJbWVtc2V0KGhlX2Rldi0+dGJycV9iYXNlLCAwLCBDT05GSUdfVEJSUV9TSVpFICogc2l6ZW9mKHN0cnVjdCBoZV90YnJxKSk7CiAKQEAgLTkwNiw2ICs5MTQsMzkgQEAKIAloZV93cml0ZWwoaGVfZGV2LCBDT05GSUdfVEJSUV9USFJFU0gsIEcwX1RCUlFfVEhSRVNIICsgKGdyb3VwICogMTYpKTsKIAogCXJldHVybiAwOworCitvdXRfZnJlZV9yYnBxX2Jhc2U6CisJcGNpX2ZyZWVfY29uc2lzdGVudChoZV9kZXYtPnBjaV9kZXYsIENPTkZJR19SQlJRX1NJWkUgKgorCQkJc2l6ZW9mKHN0cnVjdCBoZV9yYnJxKSwgaGVfZGV2LT5yYnJxX2Jhc2UsCisJCQloZV9kZXYtPnJicnFfcGh5cyk7CisJaSA9IENPTkZJR19SQlBMX1NJWkU7CitvdXRfZnJlZV9yYnBsX3ZpcnQ6CisJd2hpbGUgKGktLSkKKwkJcGNpX3Bvb2xfZnJlZShoZV9kZXYtPnJicGxfcG9vbCwgaGVfZGV2LT5yYnBsX3ZpcnRbaV0udmlydCwKKwkJCQloZV9kZXYtPnJicGxfYmFzZVtpXS5waHlzKTsKKwlrZnJlZShoZV9kZXYtPnJicGxfdmlydCk7CisKK291dF9mcmVlX3JicGxfYmFzZToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGhlX2Rldi0+cGNpX2RldiwgQ09ORklHX1JCUExfU0laRSAqCisJCQlzaXplb2Yoc3RydWN0IGhlX3JicCksIGhlX2Rldi0+cmJwbF9iYXNlLAorCQkJaGVfZGV2LT5yYnBsX3BoeXMpOworb3V0X2Rlc3Ryb3lfcmJwbF9wb29sOgorCXBjaV9wb29sX2Rlc3Ryb3koaGVfZGV2LT5yYnBsX3Bvb2wpOworCisJaSA9IENPTkZJR19SQlBTX1NJWkU7CitvdXRfZnJlZV9yYnBzX3ZpcnQ6CisJd2hpbGUgKGktLSkKKwkJcGNpX3Bvb2xfZnJlZShoZV9kZXYtPnJicHNfcG9vbCwgaGVfZGV2LT5yYnBzX3ZpcnRbaV0udmlydCwKKwkJCQloZV9kZXYtPnJicHNfYmFzZVtpXS5waHlzKTsKKwlrZnJlZShoZV9kZXYtPnJicHNfdmlydCk7CisKK291dF9mcmVlX3JicHNfYmFzZToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGhlX2Rldi0+cGNpX2RldiwgQ09ORklHX1JCUFNfU0laRSAqCisJCQlzaXplb2Yoc3RydWN0IGhlX3JicCksIGhlX2Rldi0+cmJwc19iYXNlLAorCQkJaGVfZGV2LT5yYnBzX3BoeXMpOworb3V0X2Rlc3Ryb3lfcmJwc19wb29sOgorCXBjaV9wb29sX2Rlc3Ryb3koaGVfZGV2LT5yYnBzX3Bvb2wpOworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaG9yaXpvbi5jIGIvZHJpdmVycy9hdG0vaG9yaXpvbi5jCmluZGV4IDAxY2UyNDEuLjRlNDkwMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2hvcml6b24uYworKysgYi9kcml2ZXJzL2F0bS9ob3Jpem9uLmMKQEAgLTI1OTAsNyArMjU5MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaHJ6X3NldHNvY2tvcHQgKHN0cnVjdCBhdG1fdmNjICogYXRtX3ZjYywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgIHZvaWQgKm9wdHZhbCwgaW50IG9wdGxlbikgeworCQkJICAgdm9pZCAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKSB7CiAgIGhyel9kZXYgKiBkZXYgPSBIUlpfREVWKGF0bV92Y2MtPmRldik7CiAgIFBSSU5URCAoREJHX0ZMT1d8REJHX1ZDQywgImhyel9zZXRzb2Nrb3B0Iik7CiAgIHN3aXRjaCAobGV2ZWwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKaW5kZXggNzhjOTczNi4uYjJjMWIzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaXBoYXNlLmMKKysrIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKQEAgLTI4NjIsNyArMjg2Miw3IEBACiB9ICAKICAgCiBzdGF0aWMgaW50IGlhX3NldHNvY2tvcHQoc3RydWN0IGF0bV92Y2MgKnZjYywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgICAKLQl2b2lkIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKSAgCisJdm9pZCBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikgIAogeyAgCiAJSUZfRVZFTlQocHJpbnRrKCI+aWFfc2V0c29ja29wdFxuIik7KSAgCiAJcmV0dXJuIC1FSU5WQUw7ICAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL3NvbG9zLWF0dHJsaXN0LmMgYi9kcml2ZXJzL2F0bS9zb2xvcy1hdHRybGlzdC5jCmluZGV4IGVmYTI4MDguLjFhOTMzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL3NvbG9zLWF0dHJsaXN0LmMKKysrIGIvZHJpdmVycy9hdG0vc29sb3MtYXR0cmxpc3QuYwpAQCAtMjUsNiArMjUsMTAgQEAKIFNPTE9TX0FUVFJfUk8oUlNVbkNvcnJlY3RlZEVycm9yc1VwKQogU09MT1NfQVRUUl9STyhJbnRlcmxlYXZlUkRuKQogU09MT1NfQVRUUl9STyhJbnRlcmxlYXZlUlVwKQorU09MT1NfQVRUUl9STyhCaXNSRG4pCitTT0xPU19BVFRSX1JPKEJpc1JVcCkKK1NPTE9TX0FUVFJfUk8oSU5QZG93bikKK1NPTE9TX0FUVFJfUk8oSU5QdXApCiBTT0xPU19BVFRSX1JPKFNob3d0aW1lU3RhcnQpCiBTT0xPU19BVFRSX1JPKEFUVVJWZW5kb3IpCiBTT0xPU19BVFRSX1JPKEFUVUNDb3VudHJ5KQpAQCAtNjIsNiArNjYsMTMgQEAKIFNPTE9TX0FUVFJfUlcoTGluZU1vZGUpCiBTT0xPU19BVFRSX1JXKFByb2ZpbGUpCiBTT0xPU19BVFRSX1JXKERldGVjdE5vaXNlKQorU09MT1NfQVRUUl9SVyhCaXNBRm9yY2VTTlJNYXJnaW5EbikKK1NPTE9TX0FUVFJfUlcoQmlzTUZvcmNlU05STWFyZ2luRG4pCitTT0xPU19BVFRSX1JXKEJpc0FNYXhNYXJnaW4pCitTT0xPU19BVFRSX1JXKEJpc01NYXhNYXJnaW4pCitTT0xPU19BVFRSX1JXKEFubmV4QUZvcmNlU05STWFyZ2luRG4pCitTT0xPU19BVFRSX1JXKEFubmV4QU1heE1hcmdpbikKK1NPTE9TX0FUVFJfUlcoQW5uZXhNTWF4TWFyZ2luKQogU09MT1NfQVRUUl9STyhTdXBwb3J0ZWRBbm5leGVzKQogU09MT1NfQVRUUl9STyhTdGF0dXMpCiBTT0xPU19BVFRSX1JPKFRvdGFsU3RhcnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9zb2xvcy1wY2kuYyBiL2RyaXZlcnMvYXRtL3NvbG9zLXBjaS5jCmluZGV4IDMwNzMyMWIuLmM1ZjUxODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL3NvbG9zLXBjaS5jCisrKyBiL2RyaXZlcnMvYXRtL3NvbG9zLXBjaS5jCkBAIC01OSwyMSArNTksMjkgQEAKICNkZWZpbmUgUlhfRE1BX0FERFIocG9ydCkJKDB4MzAgKyAoNCAqIChwb3J0KSkpCiAKICNkZWZpbmUgREFUQV9SQU1fU0laRQkzMjc2OAotI2RlZmluZSBCVUZfU0laRQk0MDk2CisjZGVmaW5lIEJVRl9TSVpFCTIwNDgKKyNkZWZpbmUgT0xEX0JVRl9TSVpFCTQwOTYgLyogRm9yIEZQR0EgdmVyc2lvbnMgPD0gMiovCiAjZGVmaW5lIEZQR0FfUEFHRQk1MjggLyogRlBHQSBmbGFzaCBwYWdlIHNpemUqLwogI2RlZmluZSBTT0xPU19QQUdFCTUxMiAvKiBTb2xvcyBmbGFzaCBwYWdlIHNpemUqLwogI2RlZmluZSBGUEdBX0JMT0NLCShGUEdBX1BBR0UgKiA4KSAvKiBGUEdBIGZsYXNoIGJsb2NrIHNpemUqLwogI2RlZmluZSBTT0xPU19CTE9DSwkoU09MT1NfUEFHRSAqIDgpIC8qIFNvbG9zIGZsYXNoIGJsb2NrIHNpemUqLwogCi0jZGVmaW5lIFJYX0JVRihjYXJkLCBucikgKChjYXJkLT5idWZmZXJzKSArIChucikqQlVGX1NJWkUqMikKLSNkZWZpbmUgVFhfQlVGKGNhcmQsIG5yKSAoKGNhcmQtPmJ1ZmZlcnMpICsgKG5yKSpCVUZfU0laRSoyICsgQlVGX1NJWkUpCisjZGVmaW5lIFJYX0JVRihjYXJkLCBucikgKChjYXJkLT5idWZmZXJzKSArIChucikqKGNhcmQtPmJ1ZmZlcl9zaXplKSoyKQorI2RlZmluZSBUWF9CVUYoY2FyZCwgbnIpICgoY2FyZC0+YnVmZmVycykgKyAobnIpKihjYXJkLT5idWZmZXJfc2l6ZSkqMiArIChjYXJkLT5idWZmZXJfc2l6ZSkpCisjZGVmaW5lIEZMQVNIX0JVRiAoKGNhcmQtPmJ1ZmZlcnMpICsgNCooY2FyZC0+YnVmZmVyX3NpemUpKjIpCiAKICNkZWZpbmUgUlhfRE1BX1NJWkUJMjA0OAogCisjZGVmaW5lIEZQR0FfVkVSU0lPTihhLGIpICgoKGEpIDw8IDgpICsgKGIpKQorI2RlZmluZSBMRUdBQ1lfQlVGRkVSUwkyCisjZGVmaW5lIERNQV9TVVBQT1JURUQJNAorCiBzdGF0aWMgaW50IHJlc2V0ID0gMDsKIHN0YXRpYyBpbnQgYXRtZGVidWcgPSAwOwogc3RhdGljIGludCBmaXJtd2FyZV91cGdyYWRlID0gMDsKIHN0YXRpYyBpbnQgZnBnYV91cGdyYWRlID0gMDsKK3N0YXRpYyBpbnQgZGJfZmlybXdhcmVfdXBncmFkZSA9IDA7CitzdGF0aWMgaW50IGRiX2ZwZ2FfdXBncmFkZSA9IDA7CiAKIHN0cnVjdCBwa3RfaGRyIHsKIAlfX2xlMTYgc2l6ZTsKQEAgLTExNiw2ICsxMjQsOCBAQAogCXdhaXRfcXVldWVfaGVhZF90IHBhcmFtX3dxOwogCXdhaXRfcXVldWVfaGVhZF90IGZ3X3dxOwogCWludCB1c2luZ19kbWE7CisJaW50IGZwZ2FfdmVyc2lvbjsKKwlpbnQgYnVmZmVyX3NpemU7CiB9OwogCiAKQEAgLTEzNiwxMCArMTQ2LDE0IEBACiBNT0RVTEVfUEFSTV9ERVNDKGF0bWRlYnVnLCAiUHJpbnQgQVRNIGRhdGEiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmlybXdhcmVfdXBncmFkZSwgIkluaXRpYXRlIFNvbG9zIGZpcm13YXJlIHVwZ3JhZGUiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZnBnYV91cGdyYWRlLCAiSW5pdGlhdGUgRlBHQSB1cGdyYWRlIik7CitNT0RVTEVfUEFSTV9ERVNDKGRiX2Zpcm13YXJlX3VwZ3JhZGUsICJJbml0aWF0ZSBkYXVnaHRlciBib2FyZCBTb2xvcyBmaXJtd2FyZSB1cGdyYWRlIik7CitNT0RVTEVfUEFSTV9ERVNDKGRiX2ZwZ2FfdXBncmFkZSwgIkluaXRpYXRlIGRhdWdodGVyIGJvYXJkIEZQR0EgdXBncmFkZSIpOwogbW9kdWxlX3BhcmFtKHJlc2V0LCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGF0bWRlYnVnLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGZpcm13YXJlX3VwZ3JhZGUsIGludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0oZnBnYV91cGdyYWRlLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGRiX2Zpcm13YXJlX3VwZ3JhZGUsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZGJfZnBnYV91cGdyYWRlLCBpbnQsIDA0NDQpOwogCiBzdGF0aWMgdm9pZCBmcGdhX3F1ZXVlKHN0cnVjdCBzb2xvc19jYXJkICpjYXJkLCBpbnQgcG9ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICAgIHN0cnVjdCBhdG1fdmNjICp2Y2MpOwpAQCAtNTE3LDEwICs1MzEsMzIgQEAKIAlpZiAoY2hpcCA9PSAwKSB7CiAJCWZ3X25hbWUgPSAic29sb3MtRlBHQS5iaW4iOwogCQlibG9ja3NpemUgPSBGUEdBX0JMT0NLOwotCX0gZWxzZSB7CisJfSAKKwkKKwlpZiAoY2hpcCA9PSAxKSB7CiAJCWZ3X25hbWUgPSAic29sb3MtRmlybXdhcmUuYmluIjsKIAkJYmxvY2tzaXplID0gU09MT1NfQkxPQ0s7CiAJfQorCQorCWlmIChjaGlwID09IDIpeworCQlpZiAoY2FyZC0+ZnBnYV92ZXJzaW9uID4gTEVHQUNZX0JVRkZFUlMpeworCQkJZndfbmFtZSA9ICJzb2xvcy1kYi1GUEdBLmJpbiI7CisJCQlibG9ja3NpemUgPSBGUEdBX0JMT0NLOworCQl9IGVsc2UgeworCQkJZGV2X2luZm8oJmNhcmQtPmRldi0+ZGV2LCAiRlBHQSB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBkYXVnaHRlciBib2FyZCB1cGdyYWRlc1xuIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJfQorCQorCWlmIChjaGlwID09IDMpeworCQlpZiAoY2FyZC0+ZnBnYV92ZXJzaW9uID4gTEVHQUNZX0JVRkZFUlMpeworCQkJZndfbmFtZSA9ICJzb2xvcy1GaXJtd2FyZS5iaW4iOworCQkJYmxvY2tzaXplID0gU09MT1NfQkxPQ0s7CisJCX0gZWxzZSB7CisJCWRldl9pbmZvKCZjYXJkLT5kZXYtPmRldiwgIkZQR0EgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgZGF1Z2h0ZXIgYm9hcmQgdXBncmFkZXNcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCQl9CisJfQogCiAJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCAmY2FyZC0+ZGV2LT5kZXYpKQogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTUzNiw4ICs1NzIsMTAgQEAKIAlkYXRhMzIgPSBpb3JlYWQzMihjYXJkLT5jb25maWdfcmVncyArIEZQR0FfTU9ERSk7IAogCiAJLyogU2V0IG1vZGUgdG8gQ2hpcCBFcmFzZSAqLwotCWRldl9pbmZvKCZjYXJkLT5kZXYtPmRldiwgIlNldCBGUEdBIEZsYXNoIG1vZGUgdG8gJXMgQ2hpcCBFcmFzZVxuIiwKLQkJIGNoaXA/IlNvbG9zIjoiRlBHQSIpOworCWlmKGNoaXAgPT0gMCB8fCBjaGlwID09IDIpCisJCWRldl9pbmZvKCZjYXJkLT5kZXYtPmRldiwgIlNldCBGUEdBIEZsYXNoIG1vZGUgdG8gRlBHQSBDaGlwIEVyYXNlXG4iKTsKKwlpZihjaGlwID09IDEgfHwgY2hpcCA9PSAzKQorCQlkZXZfaW5mbygmY2FyZC0+ZGV2LT5kZXYsICJTZXQgRlBHQSBGbGFzaCBtb2RlIHRvIFNvbG9zIENoaXAgRXJhc2VcbiIpOwogCWlvd3JpdGUzMigoY2hpcCAqIDIpLCBjYXJkLT5jb25maWdfcmVncyArIEZMQVNIX01PREUpOwogCiAKQEAgLTU1Nyw3ICs1OTUsMTAgQEAKIAkJLyogQ29weSBibG9jayB0byBidWZmZXIsIHN3YXBwaW5nIGVhY2ggMTYgYml0cyAqLwogCQlmb3IoaSA9IDA7IGkgPCBibG9ja3NpemU7IGkgKz0gNCkgewogCQkJdWludDMyX3Qgd29yZCA9IHN3YWhiMzJwKCh1aW50MzJfdCAqKShmdy0+ZGF0YSArIG9mZnNldCArIGkpKTsKLQkJCWlvd3JpdGUzMih3b3JkLCBSWF9CVUYoY2FyZCwgMykgKyBpKTsKKwkJCWlmKGNhcmQtPmZwZ2FfdmVyc2lvbiA+IExFR0FDWV9CVUZGRVJTKQorCQkJCWlvd3JpdGUzMih3b3JkLCBGTEFTSF9CVUYgKyBpKTsKKwkJCWVsc2UKKwkJCQlpb3dyaXRlMzIod29yZCwgUlhfQlVGKGNhcmQsIDMpICsgaSk7CiAJCX0KIAogCQkvKiBTcGVjaWZ5IGJsb2NrIG51bWJlciBhbmQgdGhlbiB0cmlnZ2VyIGZsYXNoIHdyaXRlICovCkBAIC02MzAsNiArNjcxLDEwIEBACiAJCQkJbWVtY3B5X2Zyb21pbyhoZWFkZXIsIFJYX0JVRihjYXJkLCBwb3J0KSwgc2l6ZW9mKCpoZWFkZXIpKTsKIAogCQkJCXNpemUgPSBsZTE2X3RvX2NwdShoZWFkZXItPnNpemUpOworCQkJCWlmIChzaXplID4gKGNhcmQtPmJ1ZmZlcl9zaXplIC0gc2l6ZW9mKCpoZWFkZXIpKSl7CisJCQkJCWRldl93YXJuKCZjYXJkLT5kZXYtPmRldiwgIkludmFsaWQgYnVmZmVyIHNpemVcbiIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CiAKIAkJCQlza2IgPSBhbGxvY19za2Ioc2l6ZSArIDEsIEdGUF9BVE9NSUMpOwogCQkJCWlmICghc2tiKSB7CkBAIC0xMDk0LDEyICsxMTM5LDE4IEBACiAJZnBnYV92ZXIgPSAoZGF0YTMyICYgMHgwMDAwRkZGRik7CiAJbWFqb3JfdmVyID0gKChkYXRhMzIgJiAweEZGMDAwMDAwKSA+PiAyNCk7CiAJbWlub3JfdmVyID0gKChkYXRhMzIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJY2FyZC0+ZnBnYV92ZXJzaW9uID0gRlBHQV9WRVJTSU9OKG1ham9yX3ZlcixtaW5vcl92ZXIpOworCWlmIChjYXJkLT5mcGdhX3ZlcnNpb24gPiBMRUdBQ1lfQlVGRkVSUykKKwkJY2FyZC0+YnVmZmVyX3NpemUgPSBCVUZfU0laRTsKKwllbHNlCisJCWNhcmQtPmJ1ZmZlcl9zaXplID0gT0xEX0JVRl9TSVpFOwogCWRldl9pbmZvKCZkZXYtPmRldiwgIlNvbG9zIEZQR0EgVmVyc2lvbiAlZC4lMDJkIHN2bi0lZFxuIiwKIAkJIG1ham9yX3ZlciwgbWlub3JfdmVyLCBmcGdhX3Zlcik7CiAKLQlpZiAoMCAmJiBmcGdhX3ZlciA+IDI3KQorCWlmIChjYXJkLT5mcGdhX3ZlcnNpb24gPj0gRE1BX1NVUFBPUlRFRCl7CiAJCWNhcmQtPnVzaW5nX2RtYSA9IDE7Ci0JZWxzZSB7CisJfSBlbHNlIHsKKwkJY2FyZC0+dXNpbmdfZG1hID0gMDsKIAkJLyogU2V0IFJYIGVtcHR5IGZsYWcgZm9yIGFsbCBwb3J0cyAqLwogCQlpb3dyaXRlMzIoMHhGMCwgY2FyZC0+Y29uZmlnX3JlZ3MgKyBGTEFHU19BRERSKTsKIAl9CkBAIC0xMTMxLDYgKzExODIsMTIgQEAKIAlpZiAoZmlybXdhcmVfdXBncmFkZSkKIAkJZmxhc2hfdXBncmFkZShjYXJkLCAxKTsKIAorCWlmIChkYl9mcGdhX3VwZ3JhZGUpCisJCWZsYXNoX3VwZ3JhZGUoY2FyZCwgMik7CisKKwlpZiAoZGJfZmlybXdhcmVfdXBncmFkZSkKKwkJZmxhc2hfdXBncmFkZShjYXJkLCAzKTsKKwogCWVyciA9IGF0bV9pbml0KGNhcmQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWVfaXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vemF0bS5jIGIvZHJpdmVycy9hdG0vemF0bS5jCmluZGV4IDc1MmIxYmEuLjJlOTYzNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL3phdG0uYworKysgYi9kcml2ZXJzL2F0bS96YXRtLmMKQEAgLTE1MTcsNyArMTUxNyw3IEBACiAKIAogc3RhdGljIGludCB6YXRtX3NldHNvY2tvcHQoc3RydWN0IGF0bV92Y2MgKnZjYyxpbnQgbGV2ZWwsaW50IG9wdG5hbWUsCi0gICAgdm9pZCBfX3VzZXIgKm9wdHZhbCxpbnQgb3B0bGVuKQorICAgIHZvaWQgX191c2VyICpvcHR2YWwsdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCA5NzNiZjJhLi42M2MxNDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC02ODksMTUgKzY4OSwxOSBAQAogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZXJfYWRkX2F0dHJzKCVzKSBmYWlsZWRcbiIsCiAJCQlfX2Z1bmNfXywgZHJ2LT5uYW1lKTsKIAl9Ci0JZXJyb3IgPSBhZGRfYmluZF9maWxlcyhkcnYpOwotCWlmIChlcnJvcikgewotCQkvKiBEaXR0byAqLwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhZGRfYmluZF9maWxlcyglcykgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIGRydi0+bmFtZSk7CisKKwlpZiAoIWRydi0+c3VwcHJlc3NfYmluZF9hdHRycykgeworCQllcnJvciA9IGFkZF9iaW5kX2ZpbGVzKGRydik7CisJCWlmIChlcnJvcikgeworCQkJLyogRGl0dG8gKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFkZF9iaW5kX2ZpbGVzKCVzKSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIGRydi0+bmFtZSk7CisJCX0KIAl9CiAKIAlrb2JqZWN0X3VldmVudCgmcHJpdi0+a29iaiwgS09CSl9BREQpOwogCXJldHVybiAwOworCiBvdXRfdW5yZWdpc3RlcjoKIAlrZnJlZShkcnYtPnApOwogCWRydi0+cCA9IE5VTEw7CkBAIC03MjAsNyArNzI0LDggQEAKIAlpZiAoIWRydi0+YnVzKQogCQlyZXR1cm47CiAKLQlyZW1vdmVfYmluZF9maWxlcyhkcnYpOworCWlmICghZHJ2LT5zdXBwcmVzc19iaW5kX2F0dHJzKQorCQlyZW1vdmVfYmluZF9maWxlcyhkcnYpOwogCWRyaXZlcl9yZW1vdmVfYXR0cnMoZHJ2LT5idXMsIGRydik7CiAJZHJpdmVyX3JlbW92ZV9maWxlKGRydiwgJmRyaXZlcl9hdHRyX3VldmVudCk7CiAJa2xpc3RfcmVtb3ZlKCZkcnYtPnAtPmtub2RlX2J1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKaW5kZXggZWQyZWJkMy4uZjM2Nzg4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJCXB1dF9kcml2ZXIob3RoZXIpOwogCQlwcmludGsoS0VSTl9FUlIgIkVycm9yOiBEcml2ZXIgJyVzJyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQsICIKIAkJCSJhYm9ydGluZy4uLlxuIiwgZHJ2LT5uYW1lKTsKLQkJcmV0dXJuIC1FRVhJU1Q7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJcmV0ID0gYnVzX2FkZF9kcml2ZXIoZHJ2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggZWQxNTZhMTMuLjRmYTk1NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC01MjEsMTEgKzUyMSwxNSBAQAogewogCWludCByZXR2YWwsIGNvZGU7CiAKKwkvKiBtYWtlIHN1cmUgZHJpdmVyIHdvbid0IGhhdmUgYmluZC91bmJpbmQgYXR0cmlidXRlcyAqLworCWRydi0+ZHJpdmVyLnN1cHByZXNzX2JpbmRfYXR0cnMgPSB0cnVlOworCiAJLyogdGVtcG9yYXJ5IHNlY3Rpb24gdmlvbGF0aW9uIGR1cmluZyBwcm9iZSgpICovCiAJZHJ2LT5wcm9iZSA9IHByb2JlOwogCXJldHZhbCA9IGNvZGUgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoZHJ2KTsKIAotCS8qIEZpeHVwIHRoYXQgc2VjdGlvbiB2aW9sYXRpb24sIGJlaW5nIHBhcmFub2lkIGFib3V0IGNvZGUgc2Nhbm5pbmcKKwkvKgorCSAqIEZpeHVwIHRoYXQgc2VjdGlvbiB2aW9sYXRpb24sIGJlaW5nIHBhcmFub2lkIGFib3V0IGNvZGUgc2Nhbm5pbmcKIAkgKiB0aGUgbGlzdCBvZiBkcml2ZXJzIGluIG9yZGVyIHRvIHByb2JlIG5ldyBkZXZpY2VzLiAgQ2hlY2sgdG8gc2VlCiAJICogaWYgdGhlIHByb2JlIHdhcyBzdWNjZXNzZnVsLCBhbmQgbWFrZSBzdXJlIGFueSBmb3JjZWQgcHJvYmVzIG9mCiAJICogbmV3IGRldmljZXMgZmFpbC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCmluZGV4IGUwZGM0MDcuLjhhYTI0NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwpAQCAtNTExLDYgKzUxMSw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKKwl0cmFuc2l0aW9uX3N0YXJ0ZWQgPSBmYWxzZTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9saXN0KSkgewogCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX2xpc3QucHJldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCmluZGV4IDM4NTU2ZjYuLmE3NzA0OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYwpAQCAtNTEsOCArNTEsNiBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JZGV2X2RiZyhkZXYsICJfX3BtX3J1bnRpbWVfaWRsZSgpIVxuIik7Ci0KIAlpZiAoZGV2LT5wb3dlci5ydW50aW1lX2Vycm9yKQogCQlyZXR2YWwgPSAtRUlOVkFMOwogCWVsc2UgaWYgKGRldi0+cG93ZXIuaWRsZV9ub3RpZmljYXRpb24pCkBAIC05Myw4ICs5MSw2IEBACiAJd2FrZV91cF9hbGwoJmRldi0+cG93ZXIud2FpdF9xdWV1ZSk7CiAKICBvdXQ6Ci0JZGV2X2RiZyhkZXYsICJfX3BtX3J1bnRpbWVfaWRsZSgpIHJldHVybnMgJWQhXG4iLCByZXR2YWwpOwotCiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9EQUM5NjAuYyBiL2RyaXZlcnMvYmxvY2svREFDOTYwLmMKaW5kZXggNmZhN2IwZi4uZWI0ZmExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9EQUM5NjAuYworKysgYi9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgpAQCAtNjQyMiwxNiArNjQyMywxMCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotCi0vKgotICBEQUM5NjBfUHJvY1JlYWRTdGF0dXMgaW1wbGVtZW50cyByZWFkaW5nIC9wcm9jL3JkL3N0YXR1cy4KLSovCi0KLXN0YXRpYyBpbnQgREFDOTYwX1Byb2NSZWFkU3RhdHVzKGNoYXIgKlBhZ2UsIGNoYXIgKipTdGFydCwgb2ZmX3QgT2Zmc2V0LAotCQkJCSBpbnQgQ291bnQsIGludCAqRU9GLCB2b2lkICpEYXRhKQorc3RhdGljIGludCBkYWM5NjBfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKICAgdW5zaWduZWQgY2hhciAqU3RhdHVzTWVzc2FnZSA9ICJPS1xuIjsKLSAgaW50IENvbnRyb2xsZXJOdW1iZXIsIEJ5dGVzQXZhaWxhYmxlOworICBpbnQgQ29udHJvbGxlck51bWJlcjsKICAgZm9yIChDb250cm9sbGVyTnVtYmVyID0gMDsKICAgICAgICBDb250cm9sbGVyTnVtYmVyIDwgREFDOTYwX0NvbnRyb2xsZXJDb3VudDsKICAgICAgICBDb250cm9sbGVyTnVtYmVyKyspCkBAIC02NDQ0LDUyICs2NDM5LDQ5IEBACiAJICBicmVhazsKIAl9CiAgICAgfQotICBCeXRlc0F2YWlsYWJsZSA9IHN0cmxlbihTdGF0dXNNZXNzYWdlKSAtIE9mZnNldDsKLSAgaWYgKENvdW50ID49IEJ5dGVzQXZhaWxhYmxlKQotICAgIHsKLSAgICAgIENvdW50ID0gQnl0ZXNBdmFpbGFibGU7Ci0gICAgICAqRU9GID0gdHJ1ZTsKLSAgICB9Ci0gIGlmIChDb3VudCA8PSAwKSByZXR1cm4gMDsKLSAgKlN0YXJ0ID0gUGFnZTsKLSAgbWVtY3B5KFBhZ2UsICZTdGF0dXNNZXNzYWdlW09mZnNldF0sIENvdW50KTsKLSAgcmV0dXJuIENvdW50OworICBzZXFfcHV0cyhtLCBTdGF0dXNNZXNzYWdlKTsKKyAgcmV0dXJuIDA7CiB9CiAKLQotLyoKLSAgREFDOTYwX1Byb2NSZWFkSW5pdGlhbFN0YXR1cyBpbXBsZW1lbnRzIHJlYWRpbmcgL3Byb2MvcmQvY04vaW5pdGlhbF9zdGF0dXMuCi0qLwotCi1zdGF0aWMgaW50IERBQzk2MF9Qcm9jUmVhZEluaXRpYWxTdGF0dXMoY2hhciAqUGFnZSwgY2hhciAqKlN0YXJ0LCBvZmZfdCBPZmZzZXQsCi0JCQkJCWludCBDb3VudCwgaW50ICpFT0YsIHZvaWQgKkRhdGEpCitzdGF0aWMgaW50IGRhYzk2MF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0gIERBQzk2MF9Db250cm9sbGVyX1QgKkNvbnRyb2xsZXIgPSAoREFDOTYwX0NvbnRyb2xsZXJfVCAqKSBEYXRhOwotICBpbnQgQnl0ZXNBdmFpbGFibGUgPSBDb250cm9sbGVyLT5Jbml0aWFsU3RhdHVzTGVuZ3RoIC0gT2Zmc2V0OwotICBpZiAoQ291bnQgPj0gQnl0ZXNBdmFpbGFibGUpCi0gICAgewotICAgICAgQ291bnQgPSBCeXRlc0F2YWlsYWJsZTsKLSAgICAgICpFT0YgPSB0cnVlOwotICAgIH0KLSAgaWYgKENvdW50IDw9IDApIHJldHVybiAwOwotICAqU3RhcnQgPSBQYWdlOwotICBtZW1jcHkoUGFnZSwgJkNvbnRyb2xsZXItPkNvbWJpbmVkU3RhdHVzQnVmZmVyW09mZnNldF0sIENvdW50KTsKLSAgcmV0dXJuIENvdW50OworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkYWM5NjBfcHJvY19zaG93LCBOVUxMKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGFjOTYwX3Byb2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZGFjOTYwX3Byb2Nfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKIAotLyoKLSAgREFDOTYwX1Byb2NSZWFkQ3VycmVudFN0YXR1cyBpbXBsZW1lbnRzIHJlYWRpbmcgL3Byb2MvcmQvY04vY3VycmVudF9zdGF0dXMuCi0qLwotCi1zdGF0aWMgaW50IERBQzk2MF9Qcm9jUmVhZEN1cnJlbnRTdGF0dXMoY2hhciAqUGFnZSwgY2hhciAqKlN0YXJ0LCBvZmZfdCBPZmZzZXQsCi0JCQkJCWludCBDb3VudCwgaW50ICpFT0YsIHZvaWQgKkRhdGEpCitzdGF0aWMgaW50IGRhYzk2MF9pbml0aWFsX3N0YXR1c19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotICBEQUM5NjBfQ29udHJvbGxlcl9UICpDb250cm9sbGVyID0gKERBQzk2MF9Db250cm9sbGVyX1QgKikgRGF0YTsKKwlEQUM5NjBfQ29udHJvbGxlcl9UICpDb250cm9sbGVyID0gKERBQzk2MF9Db250cm9sbGVyX1QgKiltLT5wcml2YXRlOworCXNlcV9wcmludGYobSwgIiUuKnMiLCBDb250cm9sbGVyLT5Jbml0aWFsU3RhdHVzTGVuZ3RoLCBDb250cm9sbGVyLT5Db21iaW5lZFN0YXR1c0J1ZmZlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFjOTYwX2luaXRpYWxfc3RhdHVzX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGFjOTYwX2luaXRpYWxfc3RhdHVzX3Byb2Nfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRhYzk2MF9pbml0aWFsX3N0YXR1c19wcm9jX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRhYzk2MF9pbml0aWFsX3N0YXR1c19wcm9jX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgZGFjOTYwX2N1cnJlbnRfc3RhdHVzX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisgIERBQzk2MF9Db250cm9sbGVyX1QgKkNvbnRyb2xsZXIgPSAoREFDOTYwX0NvbnRyb2xsZXJfVCAqKSBtLT5wcml2YXRlOwogICB1bnNpZ25lZCBjaGFyICpTdGF0dXNNZXNzYWdlID0KICAgICAiTm8gUmVidWlsZCBvciBDb25zaXN0ZW5jeSBDaGVjayBpbiBQcm9ncmVzc1xuIjsKICAgaW50IFByb2dyZXNzTWVzc2FnZUxlbmd0aCA9IHN0cmxlbihTdGF0dXNNZXNzYWdlKTsKLSAgaW50IEJ5dGVzQXZhaWxhYmxlOwogICBpZiAoamlmZmllcyAhPSBDb250cm9sbGVyLT5MYXN0Q3VycmVudFN0YXR1c1RpbWUpCiAgICAgewogICAgICAgQ29udHJvbGxlci0+Q3VycmVudFN0YXR1c0xlbmd0aCA9IDA7CkBAIC02NTEzLDQ5ICs2NTA1LDQxIEBACiAJfQogICAgICAgQ29udHJvbGxlci0+TGFzdEN1cnJlbnRTdGF0dXNUaW1lID0gamlmZmllczsKICAgICB9Ci0gIEJ5dGVzQXZhaWxhYmxlID0gQ29udHJvbGxlci0+Q3VycmVudFN0YXR1c0xlbmd0aCAtIE9mZnNldDsKLSAgaWYgKENvdW50ID49IEJ5dGVzQXZhaWxhYmxlKQotICAgIHsKLSAgICAgIENvdW50ID0gQnl0ZXNBdmFpbGFibGU7Ci0gICAgICAqRU9GID0gdHJ1ZTsKLSAgICB9Ci0gIGlmIChDb3VudCA8PSAwKSByZXR1cm4gMDsKLSAgKlN0YXJ0ID0gUGFnZTsKLSAgbWVtY3B5KFBhZ2UsICZDb250cm9sbGVyLT5DdXJyZW50U3RhdHVzQnVmZmVyW09mZnNldF0sIENvdW50KTsKLSAgcmV0dXJuIENvdW50OworCXNlcV9wcmludGYobSwgIiUuKnMiLCBDb250cm9sbGVyLT5DdXJyZW50U3RhdHVzTGVuZ3RoLCBDb250cm9sbGVyLT5DdXJyZW50U3RhdHVzQnVmZmVyKTsKKwlyZXR1cm4gMDsKIH0KIAotCi0vKgotICBEQUM5NjBfUHJvY1JlYWRVc2VyQ29tbWFuZCBpbXBsZW1lbnRzIHJlYWRpbmcgL3Byb2MvcmQvY04vdXNlcl9jb21tYW5kLgotKi8KLQotc3RhdGljIGludCBEQUM5NjBfUHJvY1JlYWRVc2VyQ29tbWFuZChjaGFyICpQYWdlLCBjaGFyICoqU3RhcnQsIG9mZl90IE9mZnNldCwKLQkJCQkgICAgICBpbnQgQ291bnQsIGludCAqRU9GLCB2b2lkICpEYXRhKQorc3RhdGljIGludCBkYWM5NjBfY3VycmVudF9zdGF0dXNfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotICBEQUM5NjBfQ29udHJvbGxlcl9UICpDb250cm9sbGVyID0gKERBQzk2MF9Db250cm9sbGVyX1QgKikgRGF0YTsKLSAgaW50IEJ5dGVzQXZhaWxhYmxlID0gQ29udHJvbGxlci0+VXNlclN0YXR1c0xlbmd0aCAtIE9mZnNldDsKLSAgaWYgKENvdW50ID49IEJ5dGVzQXZhaWxhYmxlKQotICAgIHsKLSAgICAgIENvdW50ID0gQnl0ZXNBdmFpbGFibGU7Ci0gICAgICAqRU9GID0gdHJ1ZTsKLSAgICB9Ci0gIGlmIChDb3VudCA8PSAwKSByZXR1cm4gMDsKLSAgKlN0YXJ0ID0gUGFnZTsKLSAgbWVtY3B5KFBhZ2UsICZDb250cm9sbGVyLT5Vc2VyU3RhdHVzQnVmZmVyW09mZnNldF0sIENvdW50KTsKLSAgcmV0dXJuIENvdW50OworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkYWM5NjBfY3VycmVudF9zdGF0dXNfcHJvY19zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGFjOTYwX2N1cnJlbnRfc3RhdHVzX3Byb2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZGFjOTYwX2N1cnJlbnRfc3RhdHVzX3Byb2Nfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKIAotLyoKLSAgREFDOTYwX1Byb2NXcml0ZVVzZXJDb21tYW5kIGltcGxlbWVudHMgd3JpdGluZyAvcHJvYy9yZC9jTi91c2VyX2NvbW1hbmQuCi0qLworc3RhdGljIGludCBkYWM5NjBfdXNlcl9jb21tYW5kX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJREFDOTYwX0NvbnRyb2xsZXJfVCAqQ29udHJvbGxlciA9IChEQUM5NjBfQ29udHJvbGxlcl9UICopbS0+cHJpdmF0ZTsKIAotc3RhdGljIGludCBEQUM5NjBfUHJvY1dyaXRlVXNlckNvbW1hbmQoc3RydWN0IGZpbGUgKmZpbGUsCisJc2VxX3ByaW50ZihtLCAiJS4qcyIsIENvbnRyb2xsZXItPlVzZXJTdGF0dXNMZW5ndGgsIENvbnRyb2xsZXItPlVzZXJTdGF0dXNCdWZmZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhYzk2MF91c2VyX2NvbW1hbmRfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkYWM5NjBfdXNlcl9jb21tYW5kX3Byb2Nfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRhYzk2MF91c2VyX2NvbW1hbmRfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKkJ1ZmZlciwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBDb3VudCwgdm9pZCAqRGF0YSkKKwkJCQkgICAgICAgc2l6ZV90IENvdW50LCBsb2ZmX3QgKnBvcykKIHsKLSAgREFDOTYwX0NvbnRyb2xsZXJfVCAqQ29udHJvbGxlciA9IChEQUM5NjBfQ29udHJvbGxlcl9UICopIERhdGE7CisgIERBQzk2MF9Db250cm9sbGVyX1QgKkNvbnRyb2xsZXIgPSAoREFDOTYwX0NvbnRyb2xsZXJfVCAqKSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAgIHVuc2lnbmVkIGNoYXIgQ29tbWFuZEJ1ZmZlcls4MF07CiAgIGludCBMZW5ndGg7CiAgIGlmIChDb3VudCA+IHNpemVvZihDb21tYW5kQnVmZmVyKS0xKSByZXR1cm4gLUVJTlZBTDsKQEAgLTY1NzIsNiArNjU1NiwxNCBAQAogCSAgICA/IENvdW50IDogLUVCVVNZKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGFjOTYwX3VzZXJfY29tbWFuZF9wcm9jX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRhYzk2MF91c2VyX2NvbW1hbmRfcHJvY19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLndyaXRlCQk9IGRhYzk2MF91c2VyX2NvbW1hbmRfcHJvY193cml0ZSwKK307CiAKIC8qCiAgIERBQzk2MF9DcmVhdGVQcm9jRW50cmllcyBjcmVhdGVzIHRoZSAvcHJvYy9yZC8uLi4gZW50cmllcyBmb3IgdGhlCkBAIC02NTg2LDIzICs2NTc4LDE3IEBACiAKIAlpZiAoREFDOTYwX1Byb2NEaXJlY3RvcnlFbnRyeSA9PSBOVUxMKSB7CiAgIAkJREFDOTYwX1Byb2NEaXJlY3RvcnlFbnRyeSA9IHByb2NfbWtkaXIoInJkIiwgTlVMTCk7Ci0gIAkJU3RhdHVzUHJvY0VudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHVzIiwgMCwKKyAgCQlTdGF0dXNQcm9jRW50cnkgPSBwcm9jX2NyZWF0ZSgic3RhdHVzIiwgMCwKIAkJCQkJICAgREFDOTYwX1Byb2NEaXJlY3RvcnlFbnRyeSwKLQkJCQkJICAgREFDOTYwX1Byb2NSZWFkU3RhdHVzLCBOVUxMKTsKKwkJCQkJICAgJmRhYzk2MF9wcm9jX2ZvcHMpOwogCX0KIAogICAgICAgc3ByaW50ZihDb250cm9sbGVyLT5Db250cm9sbGVyTmFtZSwgImMlZCIsIENvbnRyb2xsZXItPkNvbnRyb2xsZXJOdW1iZXIpOwogICAgICAgQ29udHJvbGxlclByb2NFbnRyeSA9IHByb2NfbWtkaXIoQ29udHJvbGxlci0+Q29udHJvbGxlck5hbWUsCiAJCQkJICAgICAgIERBQzk2MF9Qcm9jRGlyZWN0b3J5RW50cnkpOwotICAgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiaW5pdGlhbF9zdGF0dXMiLCAwLCBDb250cm9sbGVyUHJvY0VudHJ5LAotCQkJICAgICBEQUM5NjBfUHJvY1JlYWRJbml0aWFsU3RhdHVzLCBDb250cm9sbGVyKTsKLSAgICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImN1cnJlbnRfc3RhdHVzIiwgMCwgQ29udHJvbGxlclByb2NFbnRyeSwKLQkJCSAgICAgREFDOTYwX1Byb2NSZWFkQ3VycmVudFN0YXR1cywgQ29udHJvbGxlcik7Ci0gICAgICBVc2VyQ29tbWFuZFByb2NFbnRyeSA9Ci0JY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidXNlcl9jb21tYW5kIiwgU19JV1VTUiB8IFNfSVJVU1IsCi0JCQkgICAgICAgQ29udHJvbGxlclByb2NFbnRyeSwgREFDOTYwX1Byb2NSZWFkVXNlckNvbW1hbmQsCi0JCQkgICAgICAgQ29udHJvbGxlcik7Ci0gICAgICBVc2VyQ29tbWFuZFByb2NFbnRyeS0+d3JpdGVfcHJvYyA9IERBQzk2MF9Qcm9jV3JpdGVVc2VyQ29tbWFuZDsKKyAgICAgIHByb2NfY3JlYXRlX2RhdGEoImluaXRpYWxfc3RhdHVzIiwgMCwgQ29udHJvbGxlclByb2NFbnRyeSwgJmRhYzk2MF9pbml0aWFsX3N0YXR1c19wcm9jX2ZvcHMsIENvbnRyb2xsZXIpOworICAgICAgcHJvY19jcmVhdGVfZGF0YSgiY3VycmVudF9zdGF0dXMiLCAwLCBDb250cm9sbGVyUHJvY0VudHJ5LCAmZGFjOTYwX2N1cnJlbnRfc3RhdHVzX3Byb2NfZm9wcywgQ29udHJvbGxlcik7CisgICAgICBVc2VyQ29tbWFuZFByb2NFbnRyeSA9IHByb2NfY3JlYXRlX2RhdGEoInVzZXJfY29tbWFuZCIsIFNfSVdVU1IgfCBTX0lSVVNSLCBDb250cm9sbGVyUHJvY0VudHJ5LCAmZGFjOTYwX3VzZXJfY29tbWFuZF9wcm9jX2ZvcHMsIENvbnRyb2xsZXIpOwogICAgICAgQ29udHJvbGxlci0+Q29udHJvbGxlclByb2NFbnRyeSA9IENvbnRyb2xsZXJQcm9jRW50cnk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwppbmRleCAyNGMzZTIxLi42Mzk5ZTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCkBAIC0zNiw5ICszNiwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtNjYsNiArNjgsMTIgQEAKIE1PRFVMRV9WRVJTSU9OKCIzLjYuMjAiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAorc3RhdGljIGludCBjY2lzc19hbGxvd19ocHNhOworbW9kdWxlX3BhcmFtKGNjaXNzX2FsbG93X2hwc2EsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoY2Npc3NfYWxsb3dfaHBzYSwKKwkiUHJldmVudCBjY2lzcyBkcml2ZXIgZnJvbSBhY2Nlc3NpbmcgaGFyZHdhcmUga25vd24gdG8gYmUgIgorCSIgc3VwcG9ydGVkIGJ5IHRoZSBocHNhIGRyaXZlciIpOworCiAjaW5jbHVkZSAiY2Npc3NfY21kLmgiCiAjaW5jbHVkZSAiY2Npc3MuaCIKICNpbmNsdWRlIDxsaW51eC9jY2lzc19pb2N0bC5oPgpAQCAtOTksOCArMTA3LDYgQEAKIAl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0UsICAgICAweDEwM0MsIDB4MzI0OX0sCiAJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NFLCAgICAgMHgxMDNDLCAweDMyNEF9LAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTRSwgICAgIDB4MTAzQywgMHgzMjRCfSwKLQl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9BTllfSUQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCVBDSV9DTEFTU19TVE9SQUdFX1JBSUQgPDwgOCwgMHhmZmZmIDw8IDgsIDB9LAogCXswLH0KIH07CiAKQEAgLTEyMSw4ICsxMjcsNiBAQAogCXsweDQwOUQwRTExLCAiU21hcnQgQXJyYXkgNjQwMCBFTSIsICZTQTVfYWNjZXNzfSwKIAl7MHg0MDkxMEUxMSwgIlNtYXJ0IEFycmF5IDZpIiwgJlNBNV9hY2Nlc3N9LAogCXsweDMyMjUxMDNDLCAiU21hcnQgQXJyYXkgUDYwMCIsICZTQTVfYWNjZXNzfSwKLQl7MHgzMjIzMTAzQywgIlNtYXJ0IEFycmF5IFA4MDAiLCAmU0E1X2FjY2Vzc30sCi0JezB4MzIzNDEwM0MsICJTbWFydCBBcnJheSBQNDAwIiwgJlNBNV9hY2Nlc3N9LAogCXsweDMyMzUxMDNDLCAiU21hcnQgQXJyYXkgUDQwMGkiLCAmU0E1X2FjY2Vzc30sCiAJezB4MzIxMTEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzfSwKIAl7MHgzMjEyMTAzQywgIlNtYXJ0IEFycmF5IEUyMDAiLCAmU0E1X2FjY2Vzc30sCkBAIC0xMzAsNiArMTM0LDEwIEBACiAJezB4MzIxNDEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzfSwKIAl7MHgzMjE1MTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAogCXsweDMyMzcxMDNDLCAiU21hcnQgQXJyYXkgRTUwMCIsICZTQTVfYWNjZXNzfSwKKy8qIGNvbnRyb2xsZXJzIGJlbG93IHRoaXMgbGluZSBhcmUgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIGhwc2EgZHJpdmVyLiAqLworI2RlZmluZSBIUFNBX0JPVU5EQVJZIDB4MzIyMzEwM0MKKwl7MHgzMjIzMTAzQywgIlNtYXJ0IEFycmF5IFA4MDAiLCAmU0E1X2FjY2Vzc30sCisJezB4MzIzNDEwM0MsICJTbWFydCBBcnJheSBQNDAwIiwgJlNBNV9hY2Nlc3N9LAogCXsweDMyM0QxMDNDLCAiU21hcnQgQXJyYXkgUDcwMG0iLCAmU0E1X2FjY2Vzc30sCiAJezB4MzI0MTEwM0MsICJTbWFydCBBcnJheSBQMjEyIiwgJlNBNV9hY2Nlc3N9LAogCXsweDMyNDMxMDNDLCAiU21hcnQgQXJyYXkgUDQxMCIsICZTQTVfYWNjZXNzfSwKQEAgLTEzOCw3ICsxNDYsNiBAQAogCXsweDMyNDkxMDNDLCAiU21hcnQgQXJyYXkgUDgxMiIsICZTQTVfYWNjZXNzfSwKIAl7MHgzMjRBMTAzQywgIlNtYXJ0IEFycmF5IFA3MTJtIiwgJlNBNV9hY2Nlc3N9LAogCXsweDMyNEIxMDNDLCAiU21hcnQgQXJyYXkgUDcxMW0iLCAmU0E1X2FjY2Vzc30sCi0JezB4RkZGRjEwM0MsICJVbmtub3duIFNtYXJ0IEFycmF5IiwgJlNBNV9hY2Nlc3N9LAogfTsKIAogLyogSG93IGxvbmcgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgYm9hcmQgdG8gZ28gaW50byBzaW1wbGUgbW9kZSAqLwpAQCAtMTU1LDYgKzE2MiwxMCBAQAogCiBzdGF0aWMgY3Rscl9pbmZvX3QgKmhiYVtNQVhfQ1RMUl07CiAKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNjaXNzX3NjYW5fdGhyZWFkOworc3RhdGljIERFRklORV9NVVRFWChzY2FuX211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQoc2Nhbl9xKTsKKwogc3RhdGljIHZvaWQgZG9fY2Npc3NfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgZG9fY2Npc3NfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIGludCBjY2lzc19vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSk7CkBAIC0xNjQsOSArMTc1LDkgQEAKIHN0YXRpYyBpbnQgY2Npc3NfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKIAogc3RhdGljIGludCBjY2lzc19yZXZhbGlkYXRlKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKLXN0YXRpYyBpbnQgcmVidWlsZF9sdW5fdGFibGUoY3Rscl9pbmZvX3QgKmgsIGludCBmaXJzdF90aW1lKTsKK3N0YXRpYyBpbnQgcmVidWlsZF9sdW5fdGFibGUoY3Rscl9pbmZvX3QgKmgsIGludCBmaXJzdF90aW1lLCBpbnQgdmlhX2lvY3RsKTsKIHN0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKGN0bHJfaW5mb190ICpoLCBpbnQgZHJ2X2luZGV4LAotCQkJICAgaW50IGNsZWFyX2FsbCk7CisJCQkgICBpbnQgY2xlYXJfYWxsLCBpbnQgdmlhX2lvY3RsKTsKIAogc3RhdGljIHZvaWQgY2Npc3NfcmVhZF9jYXBhY2l0eShpbnQgY3RsciwgaW50IGxvZ3ZvbCwgaW50IHdpdGhpcnEsCiAJCQlzZWN0b3JfdCAqdG90YWxfc2l6ZSwgdW5zaWduZWQgaW50ICpibG9ja19zaXplKTsKQEAgLTE4OSw4ICsyMDAsMTMgQEAKIHN0YXRpYyBpbnQgcHJvY2Vzc19zZW5kY21kX2Vycm9yKGN0bHJfaW5mb190ICpoLCBDb21tYW5kTGlzdF9zdHJ1Y3QgKmMpOwogCiBzdGF0aWMgdm9pZCBmYWlsX2FsbF9jbWRzKHVuc2lnbmVkIGxvbmcgY3Rscik7CitzdGF0aWMgaW50IGFkZF90b19zY2FuX2xpc3Qoc3RydWN0IGN0bHJfaW5mbyAqaCk7CiBzdGF0aWMgaW50IHNjYW5fdGhyZWFkKHZvaWQgKmRhdGEpOwogc3RhdGljIGludCBjaGVja19mb3JfdW5pdF9hdHRlbnRpb24oY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqYyk7CitzdGF0aWMgdm9pZCBjY2lzc19oYmFfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgY2Npc3NfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNjaXNzX2ZyZWVfZ2VuZGlzayhjdGxyX2luZm9fdCAqaCwgaW50IGRydl9pbmRleCk7CitzdGF0aWMgdm9pZCBjY2lzc19mcmVlX2RyaXZlX2luZm8oY3Rscl9pbmZvX3QgKmgsIGludCBkcnZfaW5kZXgpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyB2b2lkIGNjaXNzX3Byb2Npbml0KGludCBpKTsKQEAgLTI0NSw3ICsyNjEsMTAgQEAKIAogI2luY2x1ZGUgImNjaXNzX3Njc2kuYyIJCS8qIEZvciBTQ1NJIHRhcGUgc3VwcG9ydCAqLwogCi0jZGVmaW5lIFJBSURfVU5LTk9XTiA2CitzdGF0aWMgY29uc3QgY2hhciAqcmFpZF9sYWJlbFtdID0geyAiMCIsICI0IiwgIjEoMSswKSIsICI1IiwgIjUrMSIsICJBREciLAorCSJVTktOT1dOIgorfTsKKyNkZWZpbmUgUkFJRF9VTktOT1dOIChzaXplb2YocmFpZF9sYWJlbCkgLyBzaXplb2YocmFpZF9sYWJlbFswXSktMSkKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAKQEAgLTI1NSw5ICsyNzQsNiBAQAogI2RlZmluZSBFTkdfR0lHIDEwMDAwMDAwMDAKICNkZWZpbmUgRU5HX0dJR19GQUNUT1IgKEVOR19HSUcvNTEyKQogI2RlZmluZSBFTkdBR0VfU0NTSQkiZW5nYWdlIHNjc2kiCi1zdGF0aWMgY29uc3QgY2hhciAqcmFpZF9sYWJlbFtdID0geyAiMCIsICI0IiwgIjEoMSswKSIsICI1IiwgIjUrMSIsICJBREciLAotCSJVTktOT1dOIgotfTsKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19jY2lzczsKIApAQCAtMzE4LDcgKzMzNCw3IEBACiAJY3Rscl9pbmZvX3QgKmggPSBzZXEtPnByaXZhdGU7CiAJdW5zaWduZWQgY3RsciA9IGgtPmN0bHI7CiAJbG9mZl90ICpwb3MgPSB2OwotCWRyaXZlX2luZm9fc3RydWN0ICpkcnYgPSAmaC0+ZHJ2Wypwb3NdOworCWRyaXZlX2luZm9fc3RydWN0ICpkcnYgPSBoLT5kcnZbKnBvc107CiAKIAlpZiAoKnBvcyA+IGgtPmhpZ2hlc3RfbHVuKQogCQlyZXR1cm4gMDsKQEAgLTMzMSw3ICszNDcsNyBAQAogCXZvbF9zel9mcmFjICo9IDEwMDsKIAlzZWN0b3JfZGl2KHZvbF9zel9mcmFjLCBFTkdfR0lHX0ZBQ1RPUik7CiAKLQlpZiAoZHJ2LT5yYWlkX2xldmVsID4gNSkKKwlpZiAoZHJ2LT5yYWlkX2xldmVsIDwgMCB8fCBkcnYtPnJhaWRfbGV2ZWwgPiBSQUlEX1VOS05PV04pCiAJCWRydi0+cmFpZF9sZXZlbCA9IFJBSURfVU5LTk9XTjsKIAlzZXFfcHJpbnRmKHNlcSwgImNjaXNzL2MlZGQlZDoiCiAJCQkiXHQlNHUuJTAydUdCXHRSQUlEICVzXG4iLApAQCAtNDI2LDcgKzQ0Miw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2Npc3NfcHJvY19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2Npc3NfcHJvY19mb3BzID0gewogCS5vd25lcgkgPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICA9IGNjaXNzX3NlcV9vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCkBAIC00NTQsOSArNDcwLDE5IEBACiAjZGVmaW5lIHRvX2hiYShuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IGN0bHJfaW5mbywgZGV2KQogI2RlZmluZSB0b19kcnYobikgY29udGFpbmVyX29mKG4sIGRyaXZlX2luZm9fc3RydWN0LCBkZXYpCiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX3R5cGUgY2Npc3NfaG9zdF90eXBlID0gewotCS5uYW1lCQk9ICJjY2lzc19ob3N0IiwKLX07CitzdGF0aWMgc3NpemVfdCBob3N0X3N0b3JlX3Jlc2NhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY3Rscl9pbmZvICpoID0gdG9faGJhKGRldik7CisKKwlhZGRfdG9fc2Nhbl9saXN0KGgpOworCXdha2VfdXBfcHJvY2VzcyhjY2lzc19zY2FuX3RocmVhZCk7CisJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZoLT5zY2FuX3dhaXQpOworCisJcmV0dXJuIGNvdW50OworfQorREVWSUNFX0FUVFIocmVzY2FuLCBTX0lXVVNSLCBOVUxMLCBob3N0X3N0b3JlX3Jlc2Nhbik7CiAKIHN0YXRpYyBzc2l6ZV90IGRldl9zaG93X3VuaXF1ZV9pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtNTYwLDExICs1ODYsMTAxIEBACiB9CiBERVZJQ0VfQVRUUihyZXYsIFNfSVJVR08sIGRldl9zaG93X3JldiwgTlVMTCk7CiAKK3N0YXRpYyBzc2l6ZV90IGNjaXNzX3Nob3dfbHVuaWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9IHRvX2RydihkZXYpOworCXN0cnVjdCBjdGxyX2luZm8gKmggPSB0b19oYmEoZHJ2LT5kZXYucGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgbHVuaWRbOF07CisKKwlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CisJaWYgKGgtPmJ1c3lfY29uZmlndXJpbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICghZHJ2LT5oZWFkcykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCW1lbWNweShsdW5pZCwgZHJ2LT5MdW5JRCwgc2l6ZW9mKGx1bmlkKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQlsdW5pZFswXSwgbHVuaWRbMV0sIGx1bmlkWzJdLCBsdW5pZFszXSwKKwkJbHVuaWRbNF0sIGx1bmlkWzVdLCBsdW5pZFs2XSwgbHVuaWRbN10pOworfQorREVWSUNFX0FUVFIobHVuaWQsIFNfSVJVR08sIGNjaXNzX3Nob3dfbHVuaWQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBjY2lzc19zaG93X3JhaWRfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2ID0gdG9fZHJ2KGRldik7CisJc3RydWN0IGN0bHJfaW5mbyAqaCA9IHRvX2hiYShkcnYtPmRldi5wYXJlbnQpOworCWludCByYWlkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CisJaWYgKGgtPmJ1c3lfY29uZmlndXJpbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJhaWQgPSBkcnYtPnJhaWRfbGV2ZWw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CisJaWYgKHJhaWQgPCAwIHx8IHJhaWQgPiBSQUlEX1VOS05PV04pCisJCXJhaWQgPSBSQUlEX1VOS05PV047CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBzdHJsZW4ocmFpZF9sYWJlbFtyYWlkXSkgKyA3LCAiUkFJRCAlc1xuIiwKKwkJCXJhaWRfbGFiZWxbcmFpZF0pOworfQorREVWSUNFX0FUVFIocmFpZF9sZXZlbCwgU19JUlVHTywgY2Npc3Nfc2hvd19yYWlkX2xldmVsLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgY2Npc3Nfc2hvd191c2FnZV9jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2ID0gdG9fZHJ2KGRldik7CisJc3RydWN0IGN0bHJfaW5mbyAqaCA9IHRvX2hiYShkcnYtPmRldi5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50OworCisJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOworCWlmIChoLT5idXN5X2NvbmZpZ3VyaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljb3VudCA9IGRydi0+dXNhZ2VfY291bnQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlZFxuIiwgY291bnQpOworfQorREVWSUNFX0FUVFIodXNhZ2VfY291bnQsIFNfSVJVR08sIGNjaXNzX3Nob3dfdXNhZ2VfY291bnQsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2Npc3NfaG9zdF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9yZXNjYW4uYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjY2lzc19ob3N0X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gY2Npc3NfaG9zdF9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjY2lzc19ob3N0X2F0dHJfZ3JvdXBzW10gPSB7CisJJmNjaXNzX2hvc3RfYXR0cl9ncm91cCwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIGNjaXNzX2hvc3RfdHlwZSA9IHsKKwkubmFtZQkJPSAiY2Npc3NfaG9zdCIsCisJLmdyb3VwcwkJPSBjY2lzc19ob3N0X2F0dHJfZ3JvdXBzLAorCS5yZWxlYXNlCT0gY2Npc3NfaGJhX3JlbGVhc2UsCit9OworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2Npc3NfZGV2X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3VuaXF1ZV9pZC5hdHRyLAogCSZkZXZfYXR0cl9tb2RlbC5hdHRyLAogCSZkZXZfYXR0cl92ZW5kb3IuYXR0ciwKIAkmZGV2X2F0dHJfcmV2LmF0dHIsCisJJmRldl9hdHRyX2x1bmlkLmF0dHIsCisJJmRldl9hdHRyX3JhaWRfbGV2ZWwuYXR0ciwKKwkmZGV2X2F0dHJfdXNhZ2VfY291bnQuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC01ODAsMTIgKzY5NiwyNCBAQAogc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBjY2lzc19kZXZfdHlwZSA9IHsKIAkubmFtZQkJPSAiY2Npc3NfZGV2aWNlIiwKIAkuZ3JvdXBzCQk9IGNjaXNzX2Rldl9hdHRyX2dyb3VwcywKKwkucmVsZWFzZQk9IGNjaXNzX2RldmljZV9yZWxlYXNlLAogfTsKIAogc3RhdGljIHN0cnVjdCBidXNfdHlwZSBjY2lzc19idXNfdHlwZSA9IHsKIAkubmFtZQkJPSAiY2Npc3MiLAogfTsKIAorLyoKKyAqIGNjaXNzX2hiYV9yZWxlYXNlIGlzIGNhbGxlZCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQKKyAqIG9mIGgtPmRldiBnb2VzIHRvIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIGNjaXNzX2hiYV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIG5vdGhpbmcgdG8gZG8sIGJ1dCBuZWVkIHRoaXMgdG8gYXZvaWQgYSB3YXJuaW5nCisJICogYWJvdXQgbm90IGhhdmluZyBhIHJlbGVhc2UgaGFuZGxlciBmcm9tIGxpYi9rcmVmLmMuCisJICovCit9CiAKIC8qCiAgKiBJbml0aWFsaXplIHN5c2ZzIGVudHJ5IGZvciBlYWNoIGNvbnRyb2xsZXIuICBUaGlzIHNldHMgdXAgYW5kIHJlZ2lzdGVycwpAQCAtNjA5LDYgKzczNywxNiBAQAogc3RhdGljIHZvaWQgY2Npc3NfZGVzdHJveV9oYmFfc3lzZnNfZW50cnkoc3RydWN0IGN0bHJfaW5mbyAqaCkKIHsKIAlkZXZpY2VfZGVsKCZoLT5kZXYpOworCXB1dF9kZXZpY2UoJmgtPmRldik7IC8qIGZpbmFsIHB1dC4gKi8KK30KKworLyogY2Npc3NfZGV2aWNlX3JlbGVhc2UgaXMgY2FsbGVkIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudAorICogb2YgaC0+ZHJ2W3hdZGV2IGdvZXMgdG8gemVyby4KKyAqLworc3RhdGljIHZvaWQgY2Npc3NfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWRyaXZlX2luZm9fc3RydWN0ICpkcnYgPSB0b19kcnYoZGV2KTsKKwlrZnJlZShkcnYpOwogfQogCiAvKgpAQCAtNjE3LDI0ICs3NTUsMzkgQEAKICAqIC9zeXMvYnVzL3BjaS9kZXZpY2VzLzxkZXYvY2NpcyMvLiBXZSBhbHNvIGNyZWF0ZSBhIGxpbmsgZnJvbQogICogL3N5cy9ibG9jay9jY2lzcyFjI2QjIHRvIHRoaXMgZW50cnkuCiAgKi8KLXN0YXRpYyBpbnQgY2Npc3NfY3JlYXRlX2xkX3N5c2ZzX2VudHJ5KHN0cnVjdCBjdGxyX2luZm8gKmgsCi0JCQkJICAgICAgIGRyaXZlX2luZm9fc3RydWN0ICpkcnYsCitzdGF0aWMgbG9uZyBjY2lzc19jcmVhdGVfbGRfc3lzZnNfZW50cnkoc3RydWN0IGN0bHJfaW5mbyAqaCwKIAkJCQkgICAgICAgaW50IGRydl9pbmRleCkKIHsKLQlkZXZpY2VfaW5pdGlhbGl6ZSgmZHJ2LT5kZXYpOwotCWRydi0+ZGV2LnR5cGUgPSAmY2Npc3NfZGV2X3R5cGU7Ci0JZHJ2LT5kZXYuYnVzID0gJmNjaXNzX2J1c190eXBlOwotCWRldl9zZXRfbmFtZSgmZHJ2LT5kZXYsICJjJWRkJWQiLCBoLT5jdGxyLCBkcnZfaW5kZXgpOwotCWRydi0+ZGV2LnBhcmVudCA9ICZoLT5kZXY7Ci0JcmV0dXJuIGRldmljZV9hZGQoJmRydi0+ZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlpZiAoaC0+ZHJ2W2Rydl9pbmRleF0tPmRldmljZV9pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisKKwlkZXYgPSAmaC0+ZHJ2W2Rydl9pbmRleF0tPmRldjsKKwlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOworCWRldi0+dHlwZSA9ICZjY2lzc19kZXZfdHlwZTsKKwlkZXYtPmJ1cyA9ICZjY2lzc19idXNfdHlwZTsKKwlkZXZfc2V0X25hbWUoZGV2LCAiYyVkZCVkIiwgaC0+Y3RsciwgZHJ2X2luZGV4KTsKKwlkZXYtPnBhcmVudCA9ICZoLT5kZXY7CisJaC0+ZHJ2W2Rydl9pbmRleF0tPmRldmljZV9pbml0aWFsaXplZCA9IDE7CisJcmV0dXJuIGRldmljZV9hZGQoZGV2KTsKIH0KIAogLyoKICAqIFJlbW92ZSBzeXNmcyBlbnRyaWVzIGZvciBhIGxvZ2ljYWwgZHJpdmUuCiAgKi8KLXN0YXRpYyB2b2lkIGNjaXNzX2Rlc3Ryb3lfbGRfc3lzZnNfZW50cnkoZHJpdmVfaW5mb19zdHJ1Y3QgKmRydikKK3N0YXRpYyB2b2lkIGNjaXNzX2Rlc3Ryb3lfbGRfc3lzZnNfZW50cnkoc3RydWN0IGN0bHJfaW5mbyAqaCwgaW50IGRydl9pbmRleCwKKwlpbnQgY3Rscl9leGl0aW5nKQogewotCWRldmljZV9kZWwoJmRydi0+ZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaC0+ZHJ2W2Rydl9pbmRleF0tPmRldjsKKworCS8qIHNwZWNpYWwgY2FzZSBmb3IgYypkMCwgd2Ugb25seSBkZXN0cm95IGl0IG9uIGNvbnRyb2xsZXIgZXhpdCAqLworCWlmIChkcnZfaW5kZXggPT0gMCAmJiAhY3Rscl9leGl0aW5nKQorCQlyZXR1cm47CisKKwlkZXZpY2VfZGVsKGRldik7CisJcHV0X2RldmljZShkZXYpOyAvKiB0aGUgImZpbmFsIiBwdXQuICovCisJaC0+ZHJ2W2Rydl9pbmRleF0gPSBOVUxMOwogfQogCiAvKgpAQCAtNzUxLDcgKzkwNCw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgImNjaXNzX29wZW4gJXNcbiIsIGJkZXYtPmJkX2Rpc2stPmRpc2tfbmFtZSk7CiAjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAotCWlmIChob3N0LT5idXN5X2luaXRpYWxpemluZyB8fCBkcnYtPmJ1c3lfY29uZmlndXJpbmcpCisJaWYgKGRydi0+YnVzeV9jb25maWd1cmluZykKIAkJcmV0dXJuIC1FQlVTWTsKIAkvKgogCSAqIFJvb3QgaXMgYWxsb3dlZCB0byBvcGVuIHJhdyB2b2x1bWUgemVybyBldmVuIGlmIGl0J3Mgbm90IGNvbmZpZ3VyZWQKQEAgLTc2Nyw3ICs5MjAsOCBAQAogCQkJaWYgKE1JTk9SKGJkZXYtPmJkX2RldikgJiAweDBmKSB7CiAJCQkJcmV0dXJuIC1FTlhJTzsKIAkJCQkvKiBpZiBpdCBpcywgbWFrZSBzdXJlIHdlIGhhdmUgYSBMVU4gSUQgKi8KLQkJCX0gZWxzZSBpZiAoZHJ2LT5MdW5JRCA9PSAwKSB7CisJCQl9IGVsc2UgaWYgKG1lbWNtcChkcnYtPkx1bklELCBDVExSX0xVTklELAorCQkJCXNpemVvZihkcnYtPkx1bklEKSkpIHsKIAkJCQlyZXR1cm4gLUVOWElPOwogCQkJfQogCQl9CkBAIC0xMTMyLDEyICsxMjg2LDEzIEBACiAJY2FzZSBDQ0lTU19ERVJFR0RJU0s6CiAJY2FzZSBDQ0lTU19SRUdORVdEOgogCWNhc2UgQ0NJU1NfUkVWQUxJRFZPTFM6Ci0JCXJldHVybiByZWJ1aWxkX2x1bl90YWJsZShob3N0LCAwKTsKKwkJcmV0dXJuIHJlYnVpbGRfbHVuX3RhYmxlKGhvc3QsIDAsIDEpOwogCiAJY2FzZSBDQ0lTU19HRVRMVU5JTkZPOnsKIAkJCUxvZ3ZvbEluZm9fc3RydWN0IGx1bmluZm87CiAKLQkJCWx1bmluZm8uTHVuSUQgPSBkcnYtPkx1bklEOworCQkJbWVtY3B5KCZsdW5pbmZvLkx1bklELCBkcnYtPkx1bklELAorCQkJCXNpemVvZihsdW5pbmZvLkx1bklEKSk7CiAJCQlsdW5pbmZvLm51bV9vcGVucyA9IGRydi0+dXNhZ2VfY291bnQ7CiAJCQlsdW5pbmZvLm51bV9wYXJ0cyA9IDA7CiAJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZsdW5pbmZvLApAQCAtMTQ3NSw3ICsxNjMwLDEwIEBACiAJCS8qIG1ha2Ugc3VyZSB0aGUgZGlzayBoYXMgYmVlbiBhZGRlZCBhbmQgdGhlIGRyaXZlIGlzIHJlYWwKIAkJICogYmVjYXVzZSB0aGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbWlkZGxlIG9mIGluaXRfb25lLgogCQkgKi8KLQkJaWYgKCEoaC0+ZHJ2W2N1cnJfcXVldWVdLnF1ZXVlKSB8fCAhKGgtPmRydltjdXJyX3F1ZXVlXS5oZWFkcykpCisJCWlmICghaC0+ZHJ2W2N1cnJfcXVldWVdKQorCQkJY29udGludWU7CisJCWlmICghKGgtPmRydltjdXJyX3F1ZXVlXS0+cXVldWUpIHx8CisJCQkhKGgtPmRydltjdXJyX3F1ZXVlXS0+aGVhZHMpKQogCQkJY29udGludWU7CiAJCWJsa19zdGFydF9xdWV1ZShoLT5nZW5kaXNrW2N1cnJfcXVldWVdLT5xdWV1ZSk7CiAKQEAgLTE1MzIsMTMgKzE2OTAsMTEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGxvZ191bml0X3RvX3Njc2kzYWRkcihjdGxyX2luZm9fdCAqaCwgdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbXSwKLQl1aW50MzJfdCBsb2dfdW5pdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2dfdW5pdF90b19zY3NpM2FkZHIoY3Rscl9pbmZvX3QgKmgsCisJdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbXSwgdWludDMyX3QgbG9nX3VuaXQpCiB7Ci0JbG9nX3VuaXQgPSBoLT5kcnZbbG9nX3VuaXRdLkx1bklEICYgMHgwM2ZmZjsKLQltZW1zZXQoJnNjc2kzYWRkcls0XSwgMCwgNCk7Ci0JbWVtY3B5KCZzY3NpM2FkZHJbMF0sICZsb2dfdW5pdCwgNCk7Ci0Jc2NzaTNhZGRyWzNdIHw9IDB4NDA7CisJbWVtY3B5KHNjc2kzYWRkciwgaC0+ZHJ2W2xvZ191bml0XS0+THVuSUQsCisJCXNpemVvZihoLT5kcnZbbG9nX3VuaXRdLT5MdW5JRCkpOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIFNDU0kgdmVuZG9yLCBtb2RlbCwgYW5kIHJldmlzaW9uIG9mIGEgbG9naWNhbCBkcml2ZQpAQCAtMTYxNSwxNiArMTc3MSwyMyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgY2Npc3NfYWRkX2Rpc2soY3Rscl9pbmZvX3QgKmgsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorLyoKKyAqIGNjaXNzX2FkZF9kaXNrIHNldHMgdXAgdGhlIGJsb2NrIGRldmljZSBxdWV1ZSBmb3IgYSBsb2dpY2FsIGRyaXZlCisgKi8KK3N0YXRpYyBpbnQgY2Npc3NfYWRkX2Rpc2soY3Rscl9pbmZvX3QgKmgsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJCWludCBkcnZfaW5kZXgpCiB7CiAJZGlzay0+cXVldWUgPSBibGtfaW5pdF9xdWV1ZShkb19jY2lzc19yZXF1ZXN0LCAmaC0+bG9jayk7CisJaWYgKCFkaXNrLT5xdWV1ZSkKKwkJZ290byBpbml0X3F1ZXVlX2ZhaWx1cmU7CiAJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJjY2lzcy9jJWRkJWQiLCBoLT5jdGxyLCBkcnZfaW5kZXgpOwogCWRpc2stPm1ham9yID0gaC0+bWFqb3I7CiAJZGlzay0+Zmlyc3RfbWlub3IgPSBkcnZfaW5kZXggPDwgTldEX1NISUZUOwogCWRpc2stPmZvcHMgPSAmY2Npc3NfZm9wczsKLQlkaXNrLT5wcml2YXRlX2RhdGEgPSAmaC0+ZHJ2W2Rydl9pbmRleF07Ci0JZGlzay0+ZHJpdmVyZnNfZGV2ID0gJmgtPmRydltkcnZfaW5kZXhdLmRldjsKKwlpZiAoY2Npc3NfY3JlYXRlX2xkX3N5c2ZzX2VudHJ5KGgsIGRydl9pbmRleCkpCisJCWdvdG8gY2xlYW51cF9xdWV1ZTsKKwlkaXNrLT5wcml2YXRlX2RhdGEgPSBoLT5kcnZbZHJ2X2luZGV4XTsKKwlkaXNrLT5kcml2ZXJmc19kZXYgPSAmaC0+ZHJ2W2Rydl9pbmRleF0tPmRldjsKIAogCS8qIFNldCB1cCBxdWV1ZSBpbmZvcm1hdGlvbiAqLwogCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQoZGlzay0+cXVldWUsIGgtPnBkZXYtPmRtYV9tYXNrKTsKQEAgLTE2NDIsMTQgKzE4MDUsMjEgQEAKIAlkaXNrLT5xdWV1ZS0+cXVldWVkYXRhID0gaDsKIAogCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoZGlzay0+cXVldWUsCi0JCQkJICAgICBoLT5kcnZbZHJ2X2luZGV4XS5ibG9ja19zaXplKTsKKwkJCQkgICAgIGgtPmRydltkcnZfaW5kZXhdLT5ibG9ja19zaXplKTsKIAogCS8qIE1ha2Ugc3VyZSBhbGwgcXVldWUgZGF0YSBpcyB3cml0dGVuIG91dCBiZWZvcmUgKi8KLQkvKiBzZXR0aW5nIGgtPmRydltkcnZfaW5kZXhdLnF1ZXVlLCBhcyBzZXR0aW5nIHRoaXMgKi8KKwkvKiBzZXR0aW5nIGgtPmRydltkcnZfaW5kZXhdLT5xdWV1ZSwgYXMgc2V0dGluZyB0aGlzICovCiAJLyogYWxsb3dzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBzdGFydCB0aGUgcXVldWUgKi8KIAl3bWIoKTsKLQloLT5kcnZbZHJ2X2luZGV4XS5xdWV1ZSA9IGRpc2stPnF1ZXVlOworCWgtPmRydltkcnZfaW5kZXhdLT5xdWV1ZSA9IGRpc2stPnF1ZXVlOwogCWFkZF9kaXNrKGRpc2spOworCXJldHVybiAwOworCitjbGVhbnVwX3F1ZXVlOgorCWJsa19jbGVhbnVwX3F1ZXVlKGRpc2stPnF1ZXVlKTsKKwlkaXNrLT5xdWV1ZSA9IE5VTEw7Citpbml0X3F1ZXVlX2ZhaWx1cmU6CisJcmV0dXJuIC0xOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdGhlIHVzYWdlX2NvdW50IG9mIHRoZSBkcml2ZSB0byBiZSB1cGRhdGVkL2FkZGVkLgpAQCAtMTY2Miw3ICsxODMyLDggQEAKICAqIGlzIGFsc28gdGhlIGNvbnRyb2xsZXIgbm9kZS4gIEFueSBjaGFuZ2VzIHRvIGRpc2sgMCB3aWxsIHNob3cgdXAgb24KICAqIHRoZSBuZXh0IHJlYm9vdC4KICAqLwotc3RhdGljIHZvaWQgY2Npc3NfdXBkYXRlX2RyaXZlX2luZm8oaW50IGN0bHIsIGludCBkcnZfaW5kZXgsIGludCBmaXJzdF90aW1lKQorc3RhdGljIHZvaWQgY2Npc3NfdXBkYXRlX2RyaXZlX2luZm8oaW50IGN0bHIsIGludCBkcnZfaW5kZXgsIGludCBmaXJzdF90aW1lLAorCWludCB2aWFfaW9jdGwpCiB7CiAJY3Rscl9pbmZvX3QgKmggPSBoYmFbY3Rscl07CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CkBAIC0xNjcyLDIxICsxODQzLDEzIEBACiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJaW50IHJldCA9IDA7CiAJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydmluZm87Ci0JaW50IHdhc19vbmx5X2NvbnRyb2xsZXJfbm9kZTsKIAogCS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzayBhbmQgbW9kaWZ5IHRoZSBkcml2ZXIgc3RydWN0dXJlICovCiAJaW5xX2J1ZmYgPSBrbWFsbG9jKHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLQlkcnZpbmZvID0ga21hbGxvYyhzaXplb2YoKmRydmluZm8pLCBHRlBfS0VSTkVMKTsKKwlkcnZpbmZvID0ga3phbGxvYyhzaXplb2YoKmRydmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoaW5xX2J1ZmYgPT0gTlVMTCB8fCBkcnZpbmZvID09IE5VTEwpCiAJCWdvdG8gbWVtX21zZzsKIAotCS8qIFNlZSBpZiB3ZSdyZSB0cnlpbmcgdG8gdXBkYXRlIHRoZSAiY29udHJvbGxlciBub2RlIgotCSAqIHRoaXMgd2lsbCBoYXBwZW4gdGhlIHdoZW4gdGhlIGZpcnN0IGxvZ2ljYWwgZHJpdmUgZ2V0cwotCSAqIGNyZWF0ZWQgYnkgQUNVLgotCSAqLwotCXdhc19vbmx5X2NvbnRyb2xsZXJfbm9kZSA9IChkcnZfaW5kZXggPT0gMCAmJgotCQkJCWgtPmRydlswXS5yYWlkX2xldmVsID09IC0xKTsKLQogCS8qIHRlc3RpbmcgdG8gc2VlIGlmIDE2LWJ5dGUgQ0RCcyBhcmUgYWxyZWFkeSBiZWluZyB1c2VkICovCiAJaWYgKGgtPmNjaXNzX3JlYWQgPT0gQ0NJU1NfUkVBRF8xNikgewogCQljY2lzc19yZWFkX2NhcGFjaXR5XzE2KGgtPmN0bHIsIGRydl9pbmRleCwgMSwKQEAgLTE3MTksMTYgKzE4ODIsMTkgQEAKIAkJCQlkcnZpbmZvLT5tb2RlbCwgZHJ2aW5mby0+cmV2KTsKIAljY2lzc19nZXRfc2VyaWFsX25vKGN0bHIsIGRydl9pbmRleCwgMSwgZHJ2aW5mby0+c2VyaWFsX25vLAogCQkJc2l6ZW9mKGRydmluZm8tPnNlcmlhbF9ubykpOworCS8qIFNhdmUgdGhlIGx1bmlkIGluIGNhc2Ugd2UgZGVyZWdpc3RlciB0aGUgZGlzaywgYmVsb3cuICovCisJbWVtY3B5KGRydmluZm8tPkx1bklELCBoLT5kcnZbZHJ2X2luZGV4XS0+THVuSUQsCisJCXNpemVvZihkcnZpbmZvLT5MdW5JRCkpOwogCiAJLyogSXMgaXQgdGhlIHNhbWUgZGlzayB3ZSBhbHJlYWR5IGtub3csIGFuZCBub3RoaW5nJ3MgY2hhbmdlZD8gKi8KLQlpZiAoaC0+ZHJ2W2Rydl9pbmRleF0ucmFpZF9sZXZlbCAhPSAtMSAmJgorCWlmIChoLT5kcnZbZHJ2X2luZGV4XS0+cmFpZF9sZXZlbCAhPSAtMSAmJgogCQkoKG1lbWNtcChkcnZpbmZvLT5zZXJpYWxfbm8sCi0JCQkJaC0+ZHJ2W2Rydl9pbmRleF0uc2VyaWFsX25vLCAxNikgPT0gMCkgJiYKLQkJZHJ2aW5mby0+YmxvY2tfc2l6ZSA9PSBoLT5kcnZbZHJ2X2luZGV4XS5ibG9ja19zaXplICYmCi0JCWRydmluZm8tPm5yX2Jsb2NrcyA9PSBoLT5kcnZbZHJ2X2luZGV4XS5ucl9ibG9ja3MgJiYKLQkJZHJ2aW5mby0+aGVhZHMgPT0gaC0+ZHJ2W2Rydl9pbmRleF0uaGVhZHMgJiYKLQkJZHJ2aW5mby0+c2VjdG9ycyA9PSBoLT5kcnZbZHJ2X2luZGV4XS5zZWN0b3JzICYmCi0JCWRydmluZm8tPmN5bGluZGVycyA9PSBoLT5kcnZbZHJ2X2luZGV4XS5jeWxpbmRlcnMpKQorCQkJCWgtPmRydltkcnZfaW5kZXhdLT5zZXJpYWxfbm8sIDE2KSA9PSAwKSAmJgorCQlkcnZpbmZvLT5ibG9ja19zaXplID09IGgtPmRydltkcnZfaW5kZXhdLT5ibG9ja19zaXplICYmCisJCWRydmluZm8tPm5yX2Jsb2NrcyA9PSBoLT5kcnZbZHJ2X2luZGV4XS0+bnJfYmxvY2tzICYmCisJCWRydmluZm8tPmhlYWRzID09IGgtPmRydltkcnZfaW5kZXhdLT5oZWFkcyAmJgorCQlkcnZpbmZvLT5zZWN0b3JzID09IGgtPmRydltkcnZfaW5kZXhdLT5zZWN0b3JzICYmCisJCWRydmluZm8tPmN5bGluZGVycyA9PSBoLT5kcnZbZHJ2X2luZGV4XS0+Y3lsaW5kZXJzKSkKIAkJCS8qIFRoZSBkaXNrIGlzIHVuY2hhbmdlZCwgbm90aGluZyB0byB1cGRhdGUgKi8KIAkJCWdvdG8gZnJlZXJldDsKIApAQCAtMTczOCwxOCArMTkwNCwxNyBAQAogCSAqIElmIHRoZSBkaXNrIGFscmVhZHkgZXhpc3RzIHRoZW4gZGVyZWdpc3RlciBpdCBiZWZvcmUgcHJvY2VlZGluZwogCSAqICh1bmxlc3MgaXQncyB0aGUgZmlyc3QgZGlzayAoZm9yIHRoZSBjb250cm9sbGVyIG5vZGUpLgogCSAqLwotCWlmIChoLT5kcnZbZHJ2X2luZGV4XS5yYWlkX2xldmVsICE9IC0xICYmIGRydl9pbmRleCAhPSAwKSB7CisJaWYgKGgtPmRydltkcnZfaW5kZXhdLT5yYWlkX2xldmVsICE9IC0xICYmIGRydl9pbmRleCAhPSAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImRpc2sgJWQgaGFzIGNoYW5nZWQuXG4iLCBkcnZfaW5kZXgpOwogCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7Ci0JCWgtPmRydltkcnZfaW5kZXhdLmJ1c3lfY29uZmlndXJpbmcgPSAxOworCQloLT5kcnZbZHJ2X2luZGV4XS0+YnVzeV9jb25maWd1cmluZyA9IDE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOwogCi0JCS8qIGRlcmVnaXN0ZXJfZGlzayBzZXRzIGgtPmRydltkcnZfaW5kZXhdLnF1ZXVlID0gTlVMTAorCQkvKiBkZXJlZ2lzdGVyX2Rpc2sgc2V0cyBoLT5kcnZbZHJ2X2luZGV4XS0+cXVldWUgPSBOVUxMCiAJCSAqIHdoaWNoIGtlZXBzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmcm9tIHN0YXJ0aW5nCiAJCSAqIHRoZSBxdWV1ZS4KIAkJICovCi0JCXJldCA9IGRlcmVnaXN0ZXJfZGlzayhoLCBkcnZfaW5kZXgsIDApOwotCQloLT5kcnZbZHJ2X2luZGV4XS5idXN5X2NvbmZpZ3VyaW5nID0gMDsKKwkJcmV0ID0gZGVyZWdpc3Rlcl9kaXNrKGgsIGRydl9pbmRleCwgMCwgdmlhX2lvY3RsKTsKIAl9CiAKIAkvKiBJZiB0aGUgZGlzayBpcyBpbiB1c2UgcmV0dXJuICovCkBAIC0xNzU3LDIyICsxOTIyLDMxIEBACiAJCWdvdG8gZnJlZXJldDsKIAogCS8qIFNhdmUgdGhlIG5ldyBpbmZvcm1hdGlvbiBmcm9tIGNjaXNzX2dlb21ldHJ5X2lucXVpcnkKLQkgKiBhbmQgc2VyaWFsIG51bWJlciBpbnF1aXJ5LgorCSAqIGFuZCBzZXJpYWwgbnVtYmVyIGlucXVpcnkuICBJZiB0aGUgZGlzayB3YXMgZGVyZWdpc3RlcmVkCisJICogYWJvdmUsIHRoZW4gaC0+ZHJ2W2Rydl9pbmRleF0gd2lsbCBiZSBOVUxMLgogCSAqLwotCWgtPmRydltkcnZfaW5kZXhdLmJsb2NrX3NpemUgPSBkcnZpbmZvLT5ibG9ja19zaXplOwotCWgtPmRydltkcnZfaW5kZXhdLm5yX2Jsb2NrcyA9IGRydmluZm8tPm5yX2Jsb2NrczsKLQloLT5kcnZbZHJ2X2luZGV4XS5oZWFkcyA9IGRydmluZm8tPmhlYWRzOwotCWgtPmRydltkcnZfaW5kZXhdLnNlY3RvcnMgPSBkcnZpbmZvLT5zZWN0b3JzOwotCWgtPmRydltkcnZfaW5kZXhdLmN5bGluZGVycyA9IGRydmluZm8tPmN5bGluZGVyczsKLQloLT5kcnZbZHJ2X2luZGV4XS5yYWlkX2xldmVsID0gZHJ2aW5mby0+cmFpZF9sZXZlbDsKLQltZW1jcHkoaC0+ZHJ2W2Rydl9pbmRleF0uc2VyaWFsX25vLCBkcnZpbmZvLT5zZXJpYWxfbm8sIDE2KTsKLQltZW1jcHkoaC0+ZHJ2W2Rydl9pbmRleF0udmVuZG9yLCBkcnZpbmZvLT52ZW5kb3IsIFZFTkRPUl9MRU4gKyAxKTsKLQltZW1jcHkoaC0+ZHJ2W2Rydl9pbmRleF0ubW9kZWwsIGRydmluZm8tPm1vZGVsLCBNT0RFTF9MRU4gKyAxKTsKLQltZW1jcHkoaC0+ZHJ2W2Rydl9pbmRleF0ucmV2LCBkcnZpbmZvLT5yZXYsIFJFVl9MRU4gKyAxKTsKKwlpZiAoaC0+ZHJ2W2Rydl9pbmRleF0gPT0gTlVMTCkgeworCQlkcnZpbmZvLT5kZXZpY2VfaW5pdGlhbGl6ZWQgPSAwOworCQloLT5kcnZbZHJ2X2luZGV4XSA9IGRydmluZm87CisJCWRydmluZm8gPSBOVUxMOyAvKiBzbyBpdCB3b24ndCBiZSBmcmVlZCBiZWxvdy4gKi8KKwl9IGVsc2UgeworCQkvKiBzcGVjaWFsIGNhc2UgZm9yIGN4ZDAgKi8KKwkJaC0+ZHJ2W2Rydl9pbmRleF0tPmJsb2NrX3NpemUgPSBkcnZpbmZvLT5ibG9ja19zaXplOworCQloLT5kcnZbZHJ2X2luZGV4XS0+bnJfYmxvY2tzID0gZHJ2aW5mby0+bnJfYmxvY2tzOworCQloLT5kcnZbZHJ2X2luZGV4XS0+aGVhZHMgPSBkcnZpbmZvLT5oZWFkczsKKwkJaC0+ZHJ2W2Rydl9pbmRleF0tPnNlY3RvcnMgPSBkcnZpbmZvLT5zZWN0b3JzOworCQloLT5kcnZbZHJ2X2luZGV4XS0+Y3lsaW5kZXJzID0gZHJ2aW5mby0+Y3lsaW5kZXJzOworCQloLT5kcnZbZHJ2X2luZGV4XS0+cmFpZF9sZXZlbCA9IGRydmluZm8tPnJhaWRfbGV2ZWw7CisJCW1lbWNweShoLT5kcnZbZHJ2X2luZGV4XS0+c2VyaWFsX25vLCBkcnZpbmZvLT5zZXJpYWxfbm8sIDE2KTsKKwkJbWVtY3B5KGgtPmRydltkcnZfaW5kZXhdLT52ZW5kb3IsIGRydmluZm8tPnZlbmRvciwKKwkJCVZFTkRPUl9MRU4gKyAxKTsKKwkJbWVtY3B5KGgtPmRydltkcnZfaW5kZXhdLT5tb2RlbCwgZHJ2aW5mby0+bW9kZWwsIE1PREVMX0xFTiArIDEpOworCQltZW1jcHkoaC0+ZHJ2W2Rydl9pbmRleF0tPnJldiwgZHJ2aW5mby0+cmV2LCBSRVZfTEVOICsgMSk7CisJfQogCiAJKytoLT5udW1fbHVuczsKIAlkaXNrID0gaC0+Z2VuZGlza1tkcnZfaW5kZXhdOwotCXNldF9jYXBhY2l0eShkaXNrLCBoLT5kcnZbZHJ2X2luZGV4XS5ucl9ibG9ja3MpOworCXNldF9jYXBhY2l0eShkaXNrLCBoLT5kcnZbZHJ2X2luZGV4XS0+bnJfYmxvY2tzKTsKIAogCS8qIElmIGl0J3Mgbm90IGRpc2sgMCAoZHJ2X2luZGV4ICE9IDApCiAJICogb3IgaWYgaXQgd2FzIGRpc2sgMCwgYnV0IHRoZXJlIHdhcyBwcmV2aW91c2x5CkBAIC0xNzgwLDggKzE5NTQsMTUgQEAKIAkgKiAocmFpZF9sZXZlID09IC0xKSB0aGVuIHdlIHdhbnQgdG8gdXBkYXRlIHRoZQogCSAqIGxvZ2ljYWwgZHJpdmUncyBpbmZvcm1hdGlvbi4KIAkgKi8KLQlpZiAoZHJ2X2luZGV4IHx8IGZpcnN0X3RpbWUpCi0JCWNjaXNzX2FkZF9kaXNrKGgsIGRpc2ssIGRydl9pbmRleCk7CisJaWYgKGRydl9pbmRleCB8fCBmaXJzdF90aW1lKSB7CisJCWlmIChjY2lzc19hZGRfZGlzayhoLCBkaXNrLCBkcnZfaW5kZXgpICE9IDApIHsKKwkJCWNjaXNzX2ZyZWVfZ2VuZGlzayhoLCBkcnZfaW5kZXgpOworCQkJY2Npc3NfZnJlZV9kcml2ZV9pbmZvKGgsIGRydl9pbmRleCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczolZCBjb3VsZCBub3QgdXBkYXRlICIKKwkJCQkiZGlzayAlZFxuIiwgaC0+Y3RsciwgZHJ2X2luZGV4KTsKKwkJCS0taC0+bnVtX2x1bnM7CisJCX0KKwl9CiAKIGZyZWVyZXQ6CiAJa2ZyZWUoaW5xX2J1ZmYpOwpAQCAtMTc5MywyOCArMTk3NCw3MCBAQAogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmluZCB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIGNvbnRyb2xsZXJzIGRyaXZlIGFycmF5Ci0gKiB0aGF0IGhhcyBhIC0xIGZvciB0aGUgcmFpZF9sZXZlbCBhbmQgd2lsbCByZXR1cm4gdGhhdCBpbmRleC4gIFRoaXMgaXMKLSAqIHdoZXJlIG5ldyBkcml2ZXMgd2lsbCBiZSBhZGRlZC4gIElmIHRoZSBpbmRleCB0byBiZSByZXR1cm5lZCBpcyBncmVhdGVyCi0gKiB0aGFuIHRoZSBoaWdoZXN0X2x1biBpbmRleCBmb3IgdGhlIGNvbnRyb2xsZXIgdGhlbiBoaWdoZXN0X2x1biBpcyBzZXQKLSAqIHRvIHRoaXMgbmV3IGluZGV4LiAgSWYgdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBpbmRleGVzIHRoZW4gLTEgaXMgcmV0dXJuZWQuCi0gKiAiY29udHJvbGxlcl9ub2RlIiBpcyB1c2VkIHRvIGtub3cgaWYgdGhpcyBpcyBhIHJlYWwgbG9naWNhbCBkcml2ZSwgb3IganVzdAotICogdGhlIGNvbnRyb2xsZXIgbm9kZSwgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGlzIGNvdW50cyB0b3dhcmRzIGhpZ2hlc3RfbHVuLgorICogdGhhdCBoYXMgYSBudWxsIGRydiBwb2ludGVyIGFuZCBhbGxvY2F0ZSB0aGUgZHJpdmUgaW5mbyBzdHJ1Y3QgYW5kCisgKiB3aWxsIHJldHVybiB0aGF0IGluZGV4ICAgVGhpcyBpcyB3aGVyZSBuZXcgZHJpdmVzIHdpbGwgYmUgYWRkZWQuCisgKiBJZiB0aGUgaW5kZXggdG8gYmUgcmV0dXJuZWQgaXMgZ3JlYXRlciB0aGFuIHRoZSBoaWdoZXN0X2x1biBpbmRleCBmb3IKKyAqIHRoZSBjb250cm9sbGVyIHRoZW4gaGlnaGVzdF9sdW4gaXMgc2V0ICogdG8gdGhpcyBuZXcgaW5kZXguCisgKiBJZiB0aGVyZSBhcmUgbm8gYXZhaWxhYmxlIGluZGV4ZXMgb3IgaWYgdGhhIGFsbG9jYXRpb24gZmFpbHMsIHRoZW4gLTEKKyAqIGlzIHJldHVybmVkLiAgKiAiY29udHJvbGxlcl9ub2RlIiBpcyB1c2VkIHRvIGtub3cgaWYgdGhpcyBpcyBhIHJlYWwKKyAqIGxvZ2ljYWwgZHJpdmUsIG9yIGp1c3QgdGhlIGNvbnRyb2xsZXIgbm9kZSwgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGlzCisgKiBjb3VudHMgdG93YXJkcyBoaWdoZXN0X2x1bi4KICAqLwotc3RhdGljIGludCBjY2lzc19maW5kX2ZyZWVfZHJpdmVfaW5kZXgoaW50IGN0bHIsIGludCBjb250cm9sbGVyX25vZGUpCitzdGF0aWMgaW50IGNjaXNzX2FsbG9jX2RyaXZlX2luZm8oY3Rscl9pbmZvX3QgKmgsIGludCBjb250cm9sbGVyX25vZGUpCiB7CiAJaW50IGk7CisJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydjsKIAorCS8qIFNlYXJjaCBmb3IgYW4gZW1wdHkgc2xvdCBmb3Igb3VyIGRyaXZlIGluZm8gKi8KIAlmb3IgKGkgPSAwOyBpIDwgQ0lTU19NQVhfTFVOOyBpKyspIHsKLQkJaWYgKGhiYVtjdGxyXS0+ZHJ2W2ldLnJhaWRfbGV2ZWwgPT0gLTEpIHsKLQkJCWlmIChpID4gaGJhW2N0bHJdLT5oaWdoZXN0X2x1bikKLQkJCQlpZiAoIWNvbnRyb2xsZXJfbm9kZSkKLQkJCQkJaGJhW2N0bHJdLT5oaWdoZXN0X2x1biA9IGk7CisKKwkJLyogaWYgbm90IGN4ZDAgY2FzZSwgYW5kIGl0J3Mgb2NjdXBpZWQsIHNraXAgaXQuICovCisJCWlmIChoLT5kcnZbaV0gJiYgaSAhPSAwKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIElmIGl0J3MgY3hkMCBjYXNlLCBhbmQgZHJ2IGlzIGFsbG9jJ2VkIGFscmVhZHksIGFuZCBhCisJCSAqIGRpc2sgaXMgY29uZmlndXJlZCB0aGVyZSwgc2tpcCBpdC4KKwkJICovCisJCWlmIChpID09IDAgJiYgaC0+ZHJ2W2ldICYmIGgtPmRydltpXS0+cmFpZF9sZXZlbCAhPSAtMSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdlJ3ZlIGZvdW5kIGFuIGVtcHR5IHNsb3QuICBVcGRhdGUgaGlnaGVzdF9sdW4KKwkJICogcHJvdmlkZWQgdGhpcyBpc24ndCBqdXN0IHRoZSBmYWtlIGN4ZDAgY29udHJvbGxlciBub2RlLgorCQkgKi8KKwkJaWYgKGkgPiBoLT5oaWdoZXN0X2x1biAmJiAhY29udHJvbGxlcl9ub2RlKQorCQkJaC0+aGlnaGVzdF9sdW4gPSBpOworCisJCS8qIElmIGFkZGluZyBhIHJlYWwgZGlzayBhdCBjeGQwLCBhbmQgaXQncyBhbHJlYWR5IGFsbG9jJ2VkICovCisJCWlmIChpID09IDAgJiYgaC0+ZHJ2W2ldICE9IE5VTEwpCiAJCQlyZXR1cm4gaTsKLQkJfQorCisJCS8qCisJCSAqIEZvdW5kIGFuIGVtcHR5IHNsb3QsIG5vdCBhbHJlYWR5IGFsbG9jJ2VkLiAgQWxsb2NhdGUgaXQuCisJCSAqIE1hcmsgaXQgd2l0aCByYWlkX2xldmVsID09IC0xLCBzbyB3ZSBrbm93IGl0J3MgbmV3IGxhdGVyIG9uLgorCQkgKi8KKwkJZHJ2ID0ga3phbGxvYyhzaXplb2YoKmRydiksIEdGUF9LRVJORUwpOworCQlpZiAoIWRydikKKwkJCXJldHVybiAtMTsKKwkJZHJ2LT5yYWlkX2xldmVsID0gLTE7IC8qIHNvIHdlIGtub3cgaXQncyBuZXcgKi8KKwkJaC0+ZHJ2W2ldID0gZHJ2OworCQlyZXR1cm4gaTsKIAl9CiAJcmV0dXJuIC0xOwogfQogCitzdGF0aWMgdm9pZCBjY2lzc19mcmVlX2RyaXZlX2luZm8oY3Rscl9pbmZvX3QgKmgsIGludCBkcnZfaW5kZXgpCit7CisJa2ZyZWUoaC0+ZHJ2W2Rydl9pbmRleF0pOworCWgtPmRydltkcnZfaW5kZXhdID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY2Npc3NfZnJlZV9nZW5kaXNrKGN0bHJfaW5mb190ICpoLCBpbnQgZHJ2X2luZGV4KQoreworCXB1dF9kaXNrKGgtPmdlbmRpc2tbZHJ2X2luZGV4XSk7CisJaC0+Z2VuZGlza1tkcnZfaW5kZXhdID0gTlVMTDsKK30KKwogLyogY2Npc3NfYWRkX2dlbmRpc2sgZmluZHMgYSBmcmVlIGhiYVtdLT5kcnYgc3RydWN0dXJlCiAgKiBhbmQgYWxsb2NhdGVzIGEgZ2VuZGlzayBpZiBuZWVkZWQsIGFuZCBzZXRzIHRoZSBsdW5pZAogICogaW4gdGhlIGRydmluZm8gc3RydWN0dXJlLiAgIEl0IHJldHVybnMgdGhlIGluZGV4IGludG8KQEAgLTE4MjQsMTMgKzIwNDcsMTUgQEAKICAqIGEgbWVhbnMgdG8gdGFsayB0byB0aGUgY29udHJvbGxlciBpbiBjYXNlIG5vIGxvZ2ljYWwKICAqIGRyaXZlcyBoYXZlIHlldCBiZWVuIGNvbmZpZ3VyZWQuCiAgKi8KLXN0YXRpYyBpbnQgY2Npc3NfYWRkX2dlbmRpc2soY3Rscl9pbmZvX3QgKmgsIF9fdTMyIGx1bmlkLCBpbnQgY29udHJvbGxlcl9ub2RlKQorc3RhdGljIGludCBjY2lzc19hZGRfZ2VuZGlzayhjdGxyX2luZm9fdCAqaCwgdW5zaWduZWQgY2hhciBsdW5pZFtdLAorCWludCBjb250cm9sbGVyX25vZGUpCiB7CiAJaW50IGRydl9pbmRleDsKIAotCWRydl9pbmRleCA9IGNjaXNzX2ZpbmRfZnJlZV9kcml2ZV9pbmRleChoLT5jdGxyLCBjb250cm9sbGVyX25vZGUpOworCWRydl9pbmRleCA9IGNjaXNzX2FsbG9jX2RyaXZlX2luZm8oaCwgY29udHJvbGxlcl9ub2RlKTsKIAlpZiAoZHJ2X2luZGV4ID09IC0xKQogCQlyZXR1cm4gLTE7CisKIAkvKkNoZWNrIGlmIHRoZSBnZW5kaXNrIG5lZWRzIHRvIGJlIGFsbG9jYXRlZCAqLwogCWlmICghaC0+Z2VuZGlza1tkcnZfaW5kZXhdKSB7CiAJCWgtPmdlbmRpc2tbZHJ2X2luZGV4XSA9CkBAIC0xODM5LDIzICsyMDY0LDI0IEBACiAJCQlwcmludGsoS0VSTl9FUlIgImNjaXNzJWQ6IGNvdWxkIG5vdCAiCiAJCQkJImFsbG9jYXRlIGEgbmV3IGRpc2sgJWRcbiIsCiAJCQkJaC0+Y3RsciwgZHJ2X2luZGV4KTsKLQkJCXJldHVybiAtMTsKKwkJCWdvdG8gZXJyX2ZyZWVfZHJpdmVfaW5mbzsKIAkJfQogCX0KLQloLT5kcnZbZHJ2X2luZGV4XS5MdW5JRCA9IGx1bmlkOwotCWlmIChjY2lzc19jcmVhdGVfbGRfc3lzZnNfZW50cnkoaCwgJmgtPmRydltkcnZfaW5kZXhdLCBkcnZfaW5kZXgpKQorCW1lbWNweShoLT5kcnZbZHJ2X2luZGV4XS0+THVuSUQsIGx1bmlkLAorCQlzaXplb2YoaC0+ZHJ2W2Rydl9pbmRleF0tPkx1bklEKSk7CisJaWYgKGNjaXNzX2NyZWF0ZV9sZF9zeXNmc19lbnRyeShoLCBkcnZfaW5kZXgpKQogCQlnb3RvIGVycl9mcmVlX2Rpc2s7Ci0KIAkvKiBEb24ndCBuZWVkIHRvIG1hcmsgdGhpcyBidXN5IGJlY2F1c2Ugbm9ib2R5ICovCiAJLyogZWxzZSBrbm93cyBhYm91dCB0aGlzIGRpc2sgeWV0IHRvIGNvbnRlbmQgKi8KIAkvKiBmb3IgYWNjZXNzIHRvIGl0LiAqLwotCWgtPmRydltkcnZfaW5kZXhdLmJ1c3lfY29uZmlndXJpbmcgPSAwOworCWgtPmRydltkcnZfaW5kZXhdLT5idXN5X2NvbmZpZ3VyaW5nID0gMDsKIAl3bWIoKTsKIAlyZXR1cm4gZHJ2X2luZGV4OwogCiBlcnJfZnJlZV9kaXNrOgotCXB1dF9kaXNrKGgtPmdlbmRpc2tbZHJ2X2luZGV4XSk7Ci0JaC0+Z2VuZGlza1tkcnZfaW5kZXhdID0gTlVMTDsKKwljY2lzc19mcmVlX2dlbmRpc2soaCwgZHJ2X2luZGV4KTsKK2Vycl9mcmVlX2RyaXZlX2luZm86CisJY2Npc3NfZnJlZV9kcml2ZV9pbmZvKGgsIGRydl9pbmRleCk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xODcyLDIxICsyMDk4LDI1IEBACiAJaWYgKGgtPmdlbmRpc2tbMF0gIT0gTlVMTCkgLyogYWxyZWFkeSBkaWQgdGhpcz8gVGhlbiBiYWlsLiAqLwogCQlyZXR1cm47CiAKLQlkcnZfaW5kZXggPSBjY2lzc19hZGRfZ2VuZGlzayhoLCAwLCAxKTsKLQlpZiAoZHJ2X2luZGV4ID09IC0xKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IGNvdWxkIG5vdCAiCi0JCQkiYWRkIGRpc2sgMC5cbiIsIGgtPmN0bHIpOwotCQlyZXR1cm47Ci0JfQotCWgtPmRydltkcnZfaW5kZXhdLmJsb2NrX3NpemUgPSA1MTI7Ci0JaC0+ZHJ2W2Rydl9pbmRleF0ubnJfYmxvY2tzID0gMDsKLQloLT5kcnZbZHJ2X2luZGV4XS5oZWFkcyA9IDA7Ci0JaC0+ZHJ2W2Rydl9pbmRleF0uc2VjdG9ycyA9IDA7Ci0JaC0+ZHJ2W2Rydl9pbmRleF0uY3lsaW5kZXJzID0gMDsKLQloLT5kcnZbZHJ2X2luZGV4XS5yYWlkX2xldmVsID0gLTE7Ci0JbWVtc2V0KGgtPmRydltkcnZfaW5kZXhdLnNlcmlhbF9ubywgMCwgMTYpOworCWRydl9pbmRleCA9IGNjaXNzX2FkZF9nZW5kaXNrKGgsIENUTFJfTFVOSUQsIDEpOworCWlmIChkcnZfaW5kZXggPT0gLTEpCisJCWdvdG8gZXJyb3I7CisJaC0+ZHJ2W2Rydl9pbmRleF0tPmJsb2NrX3NpemUgPSA1MTI7CisJaC0+ZHJ2W2Rydl9pbmRleF0tPm5yX2Jsb2NrcyA9IDA7CisJaC0+ZHJ2W2Rydl9pbmRleF0tPmhlYWRzID0gMDsKKwloLT5kcnZbZHJ2X2luZGV4XS0+c2VjdG9ycyA9IDA7CisJaC0+ZHJ2W2Rydl9pbmRleF0tPmN5bGluZGVycyA9IDA7CisJaC0+ZHJ2W2Rydl9pbmRleF0tPnJhaWRfbGV2ZWwgPSAtMTsKKwltZW1zZXQoaC0+ZHJ2W2Rydl9pbmRleF0tPnNlcmlhbF9ubywgMCwgMTYpOwogCWRpc2sgPSBoLT5nZW5kaXNrW2Rydl9pbmRleF07Ci0JY2Npc3NfYWRkX2Rpc2soaCwgZGlzaywgZHJ2X2luZGV4KTsKKwlpZiAoY2Npc3NfYWRkX2Rpc2soaCwgZGlzaywgZHJ2X2luZGV4KSA9PSAwKQorCQlyZXR1cm47CisJY2Npc3NfZnJlZV9nZW5kaXNrKGgsIGRydl9pbmRleCk7CisJY2Npc3NfZnJlZV9kcml2ZV9pbmZvKGgsIGRydl9pbmRleCk7CitlcnJvcjoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiBjb3VsZCBub3QgIgorCQkiYWRkIGRpc2sgMC5cbiIsIGgtPmN0bHIpOworCXJldHVybjsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFkZCBhbmQgcmVtb3ZlIGxvZ2ljYWwgZHJpdmVzIGZyb20gdGhlIExvZ2ljYWwKQEAgLTE4OTcsNyArMjEyNyw4IEBACiAgKiBJTlBVVAogICogaAkJPSBUaGUgY29udHJvbGxlciB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb25zIG9uCiAgKi8KLXN0YXRpYyBpbnQgcmVidWlsZF9sdW5fdGFibGUoY3Rscl9pbmZvX3QgKmgsIGludCBmaXJzdF90aW1lKQorc3RhdGljIGludCByZWJ1aWxkX2x1bl90YWJsZShjdGxyX2luZm9fdCAqaCwgaW50IGZpcnN0X3RpbWUsCisJaW50IHZpYV9pb2N0bCkKIHsKIAlpbnQgY3RsciA9IGgtPmN0bHI7CiAJaW50IG51bV9sdW5zOwpAQCAtMTkwNyw3ICsyMTM4LDcgQEAKIAlpbnQgaTsKIAlpbnQgZHJ2X2ZvdW5kOwogCWludCBkcnZfaW5kZXggPSAwOwotCV9fdTMyIGx1bmlkID0gMDsKKwl1bnNpZ25lZCBjaGFyIGx1bmlkWzhdID0gQ1RMUl9MVU5JRDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQpAQCAtMTk2MCwxMyArMjE5MSwxMyBAQAogCQlkcnZfZm91bmQgPSAwOwogCiAJCS8qIHNraXAgaG9sZXMgaW4gdGhlIGFycmF5IGZyb20gYWxyZWFkeSBkZWxldGVkIGRyaXZlcyAqLwotCQlpZiAoaC0+ZHJ2W2ldLnJhaWRfbGV2ZWwgPT0gLTEpCisJCWlmIChoLT5kcnZbaV0gPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCiAJCWZvciAoaiA9IDA7IGogPCBudW1fbHVuczsgaisrKSB7Ci0JCQltZW1jcHkoJmx1bmlkLCAmbGRfYnVmZi0+TFVOW2pdWzBdLCA0KTsKLQkJCWx1bmlkID0gbGUzMl90b19jcHUobHVuaWQpOwotCQkJaWYgKGgtPmRydltpXS5MdW5JRCA9PSBsdW5pZCkgeworCQkJbWVtY3B5KGx1bmlkLCAmbGRfYnVmZi0+TFVOW2pdWzBdLCBzaXplb2YobHVuaWQpKTsKKwkJCWlmIChtZW1jbXAoaC0+ZHJ2W2ldLT5MdW5JRCwgbHVuaWQsCisJCQkJc2l6ZW9mKGx1bmlkKSkgPT0gMCkgewogCQkJCWRydl9mb3VuZCA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xOTc0LDExICsyMjA1LDExIEBACiAJCWlmICghZHJ2X2ZvdW5kKSB7CiAJCQkvKiBEZXJlZ2lzdGVyIGl0IGZyb20gdGhlIE9TLCBpdCdzIGdvbmUuICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7Ci0JCQloLT5kcnZbaV0uYnVzeV9jb25maWd1cmluZyA9IDE7CisJCQloLT5kcnZbaV0tPmJ1c3lfY29uZmlndXJpbmcgPSAxOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7Ci0JCQlyZXR1cm5fY29kZSA9IGRlcmVnaXN0ZXJfZGlzayhoLCBpLCAxKTsKLQkJCWNjaXNzX2Rlc3Ryb3lfbGRfc3lzZnNfZW50cnkoJmgtPmRydltpXSk7Ci0JCQloLT5kcnZbaV0uYnVzeV9jb25maWd1cmluZyA9IDA7CisJCQlyZXR1cm5fY29kZSA9IGRlcmVnaXN0ZXJfZGlzayhoLCBpLCAxLCB2aWFfaW9jdGwpOworCQkJaWYgKGgtPmRydltpXSAhPSBOVUxMKQorCQkJCWgtPmRydltpXS0+YnVzeV9jb25maWd1cmluZyA9IDA7CiAJCX0KIAl9CiAKQEAgLTE5OTIsMTcgKzIyMjMsMTYgQEAKIAogCQlkcnZfZm91bmQgPSAwOwogCi0JCW1lbWNweSgmbHVuaWQsICZsZF9idWZmLT5MVU5baV1bMF0sIDQpOwotCQlsdW5pZCA9IGxlMzJfdG9fY3B1KGx1bmlkKTsKLQorCQltZW1jcHkobHVuaWQsICZsZF9idWZmLT5MVU5baV1bMF0sIHNpemVvZihsdW5pZCkpOwogCQkvKiBGaW5kIGlmIHRoZSBMVU4gaXMgYWxyZWFkeSBpbiB0aGUgZHJpdmUgYXJyYXkKIAkJICogb2YgdGhlIGRyaXZlci4gIElmIHNvIHRoZW4gdXBkYXRlIGl0cyBpbmZvCiAJCSAqIGlmIG5vdCBpbiB1c2UuICBJZiBpdCBkb2VzIG5vdCBleGlzdCB0aGVuIGZpbmQKIAkJICogdGhlIGZpcnN0IGZyZWUgaW5kZXggYW5kIGFkZCBpdC4KIAkJICovCiAJCWZvciAoaiA9IDA7IGogPD0gaC0+aGlnaGVzdF9sdW47IGorKykgewotCQkJaWYgKGgtPmRydltqXS5yYWlkX2xldmVsICE9IC0xICYmCi0JCQkJaC0+ZHJ2W2pdLkx1bklEID09IGx1bmlkKSB7CisJCQlpZiAoaC0+ZHJ2W2pdICE9IE5VTEwgJiYKKwkJCQltZW1jbXAoaC0+ZHJ2W2pdLT5MdW5JRCwgbHVuaWQsCisJCQkJCXNpemVvZihoLT5kcnZbal0tPkx1bklEKSkgPT0gMCkgewogCQkJCWRydl9pbmRleCA9IGo7CiAJCQkJZHJ2X2ZvdW5kID0gMTsKIAkJCQlicmVhazsKQEAgLTIwMTUsNyArMjI0NSw4IEBACiAJCQlpZiAoZHJ2X2luZGV4ID09IC0xKQogCQkJCWdvdG8gZnJlZXJldDsKIAkJfQotCQljY2lzc191cGRhdGVfZHJpdmVfaW5mbyhjdGxyLCBkcnZfaW5kZXgsIGZpcnN0X3RpbWUpOworCQljY2lzc191cGRhdGVfZHJpdmVfaW5mbyhjdGxyLCBkcnZfaW5kZXgsIGZpcnN0X3RpbWUsCisJCQl2aWFfaW9jdGwpOwogCX0JCS8qIGVuZCBmb3IgKi8KIAogZnJlZXJldDoKQEAgLTIwMzIsNiArMjI2MywyNSBAQAogCWdvdG8gZnJlZXJldDsKIH0KIAorc3RhdGljIHZvaWQgY2Npc3NfY2xlYXJfZHJpdmVfaW5mbyhkcml2ZV9pbmZvX3N0cnVjdCAqZHJpdmVfaW5mbykKK3sKKwkvKiB6ZXJvIG91dCB0aGUgZGlzayBzaXplIGluZm8gKi8KKwlkcml2ZV9pbmZvLT5ucl9ibG9ja3MgPSAwOworCWRyaXZlX2luZm8tPmJsb2NrX3NpemUgPSAwOworCWRyaXZlX2luZm8tPmhlYWRzID0gMDsKKwlkcml2ZV9pbmZvLT5zZWN0b3JzID0gMDsKKwlkcml2ZV9pbmZvLT5jeWxpbmRlcnMgPSAwOworCWRyaXZlX2luZm8tPnJhaWRfbGV2ZWwgPSAtMTsKKwltZW1zZXQoZHJpdmVfaW5mby0+c2VyaWFsX25vLCAwLCBzaXplb2YoZHJpdmVfaW5mby0+c2VyaWFsX25vKSk7CisJbWVtc2V0KGRyaXZlX2luZm8tPm1vZGVsLCAwLCBzaXplb2YoZHJpdmVfaW5mby0+bW9kZWwpKTsKKwltZW1zZXQoZHJpdmVfaW5mby0+cmV2LCAwLCBzaXplb2YoZHJpdmVfaW5mby0+cmV2KSk7CisJbWVtc2V0KGRyaXZlX2luZm8tPnZlbmRvciwgMCwgc2l6ZW9mKGRyaXZlX2luZm8tPnZlbmRvcikpOworCS8qCisJICogZG9uJ3QgY2xlYXIgdGhlIExVTklEIHRob3VnaCwgd2UgbmVlZCB0byByZW1lbWJlciB3aGljaAorCSAqIG9uZSB0aGlzIG9uZSBpcy4KKwkgKi8KK30KKwogLyogVGhpcyBmdW5jdGlvbiB3aWxsIGRlcmVnaXN0ZXIgdGhlIGRpc2sgYW5kIGl0J3MgcXVldWUgZnJvbSB0aGUKICAqIGtlcm5lbC4gIEl0IG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGNvbnRyb2xsZXIgbG9jayBoZWxkIGFuZCB0aGUKICAqIGRydiBzdHJ1Y3R1cmVzIGJ1c3lfY29uZmlndXJpbmcgZmxhZyBzZXQuICBJdCdzIHBhcmFtZXRlcnMgYXJlOgpAQCAtMjA0Niw0MyArMjI5Niw0OCBAQAogICogICAgICAgICAgICAgdGhlIGRpc2sgaW4gcHJlcGFyYXRpb24gZm9yIHJlLWFkZGluZyBpdC4gIEluIHRoaXMgY2FzZQogICogICAgICAgICAgICAgdGhlIGhpZ2hlc3RfbHVuIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZCBhbmQgdGhlIEx1bklECiAgKiAgICAgICAgICAgICBzaG91bGQgbm90IGJlIGNsZWFyZWQuCisgKiB2aWFfaW9jdGwKKyAqICAgIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgd2UndmUgcmVhY2hlZCB0aGlzIHBhdGggdmlhIGlvY3RsLgorICogICAgVGhpcyBhZmZlY3RzIHRoZSBtYXhpbXVtIHVzYWdlIGNvdW50IGFsbG93ZWQgZm9yIGMwZDAgdG8gYmUgbWVzc2VkIHdpdGguCisgKiAgICBJZiB0aGlzIHBhdGggaXMgcmVhY2hlZCB2aWEgaW9jdGwoKSwgdGhlbiB0aGUgbWF4X3VzYWdlX2NvdW50IHdpbGwKKyAqICAgIGJlIDEsIGFzIHRoZSBwcm9jZXNzIGNhbGxpbmcgaW9jdGwoKSBoYXMgZ290IHRvIGhhdmUgdGhlIGRldmljZSBvcGVuLgorICogICAgSWYgd2UgZ2V0IGhlcmUgdmlhIHN5c2ZzLCB0aGVuIHRoZSBtYXggdXNhZ2UgY291bnQgd2lsbCBiZSB6ZXJvLgogKi8KIHN0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKGN0bHJfaW5mb190ICpoLCBpbnQgZHJ2X2luZGV4LAotCQkJICAgaW50IGNsZWFyX2FsbCkKKwkJCSAgIGludCBjbGVhcl9hbGwsIGludCB2aWFfaW9jdGwpCiB7CiAJaW50IGk7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydjsKKwlpbnQgcmVjYWxjdWxhdGVfaGlnaGVzdF9sdW47CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCiAJCXJldHVybiAtRVBFUk07CiAKLQlkcnYgPSAmaC0+ZHJ2W2Rydl9pbmRleF07CisJZHJ2ID0gaC0+ZHJ2W2Rydl9pbmRleF07CiAJZGlzayA9IGgtPmdlbmRpc2tbZHJ2X2luZGV4XTsKIAogCS8qIG1ha2Ugc3VyZSBsb2dpY2FsIHZvbHVtZSBpcyBOT1QgaXMgdXNlICovCiAJaWYgKGNsZWFyX2FsbCB8fCAoaC0+Z2VuZGlza1swXSA9PSBkaXNrKSkgewotCQlpZiAoZHJ2LT51c2FnZV9jb3VudCA+IDEpCisJCWlmIChkcnYtPnVzYWdlX2NvdW50ID4gdmlhX2lvY3RsKQogCQkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UgaWYgKGRydi0+dXNhZ2VfY291bnQgPiAwKQogCQlyZXR1cm4gLUVCVVNZOwogCisJcmVjYWxjdWxhdGVfaGlnaGVzdF9sdW4gPSAoZHJ2ID09IGgtPmRydltoLT5oaWdoZXN0X2x1bl0pOworCiAJLyogaW52YWxpZGF0ZSB0aGUgZGV2aWNlcyBhbmQgZGVyZWdpc3RlciB0aGUgZGlzay4gIElmIGl0IGlzIGRpc2sKIAkgKiB6ZXJvIGRvIG5vdCBkZXJlZ2lzdGVyIGl0IGJ1dCBqdXN0IHplcm8gb3V0IGl0J3MgdmFsdWVzLiAgVGhpcwogCSAqIGFsbG93cyB1cyB0byBkZWxldGUgZGlzayB6ZXJvIGJ1dCBrZWVwIHRoZSBjb250cm9sbGVyIHJlZ2lzdGVyZWQuCiAJICovCiAJaWYgKGgtPmdlbmRpc2tbMF0gIT0gZGlzaykgewogCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRpc2stPnF1ZXVlOwotCQlpZiAoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkKKwkJaWYgKGRpc2stPmZsYWdzICYgR0VOSERfRkxfVVApIHsKKwkJCWNjaXNzX2Rlc3Ryb3lfbGRfc3lzZnNfZW50cnkoaCwgZHJ2X2luZGV4LCAwKTsKIAkJCWRlbF9nZW5kaXNrKGRpc2spOwotCQlpZiAocSkgewotCQkJYmxrX2NsZWFudXBfcXVldWUocSk7Ci0JCQkvKiBTZXQgZHJ2LT5xdWV1ZSB0byBOVUxMIHNvIHRoYXQgd2UgZG8gbm90IHRyeQotCQkJICogdG8gY2FsbCBibGtfc3RhcnRfcXVldWUgb24gdGhpcyBxdWV1ZSBpbiB0aGUKLQkJCSAqIGludGVycnVwdCBoYW5kbGVyCi0JCQkgKi8KLQkJCWRydi0+cXVldWUgPSBOVUxMOwogCQl9CisJCWlmIChxKQorCQkJYmxrX2NsZWFudXBfcXVldWUocSk7CiAJCS8qIElmIGNsZWFyX2FsbCBpcyBzZXQgdGhlbiB3ZSBhcmUgZGVsZXRpbmcgdGhlIGxvZ2ljYWwKIAkJICogZHJpdmUsIG5vdCBqdXN0IHJlZnJlc2hpbmcgaXRzIGluZm8uICBGb3IgZHJpdmVzCiAJCSAqIG90aGVyIHRoYW4gZGlzayAwIHdlIHdpbGwgY2FsbCBwdXRfZGlzay4gIFdlIGRvIG5vdApAQCAtMjEwNSwzNCArMjM2MCwyMCBAQAogCQl9CiAJfSBlbHNlIHsKIAkJc2V0X2NhcGFjaXR5KGRpc2ssIDApOworCQljY2lzc19jbGVhcl9kcml2ZV9pbmZvKGRydik7CiAJfQogCiAJLS1oLT5udW1fbHVuczsKLQkvKiB6ZXJvIG91dCB0aGUgZGlzayBzaXplIGluZm8gKi8KLQlkcnYtPm5yX2Jsb2NrcyA9IDA7Ci0JZHJ2LT5ibG9ja19zaXplID0gMDsKLQlkcnYtPmhlYWRzID0gMDsKLQlkcnYtPnNlY3RvcnMgPSAwOwotCWRydi0+Y3lsaW5kZXJzID0gMDsKLQlkcnYtPnJhaWRfbGV2ZWwgPSAtMTsJLyogVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgdmFyaWFibGUgdG8KLQkJCQkgKiBpbmRpY2F0ZSB0aGF0IHRoaXMgZWxlbWVudCBvZiB0aGUgZHJpdmUKLQkJCQkgKiBhcnJheSBpcyBmcmVlLgotCQkJCSAqLwogCi0JaWYgKGNsZWFyX2FsbCkgewotCQkvKiBjaGVjayB0byBzZWUgaWYgaXQgd2FzIHRoZSBsYXN0IGRpc2sgKi8KLQkJaWYgKGRydiA9PSBoLT5kcnYgKyBoLT5oaWdoZXN0X2x1bikgewotCQkJLyogaWYgc28sIGZpbmQgdGhlIG5ldyBoaWdodGVzdCBsdW4gKi8KLQkJCWludCBpLCBuZXdoaWdoZXN0ID0gLTE7Ci0JCQlmb3IgKGkgPSAwOyBpIDw9IGgtPmhpZ2hlc3RfbHVuOyBpKyspIHsKLQkJCQkvKiBpZiB0aGUgZGlzayBoYXMgc2l6ZSA+IDAsIGl0IGlzIGF2YWlsYWJsZSAqLwotCQkJCWlmIChoLT5kcnZbaV0uaGVhZHMpCi0JCQkJCW5ld2hpZ2hlc3QgPSBpOwotCQkJfQotCQkJaC0+aGlnaGVzdF9sdW4gPSBuZXdoaWdoZXN0OworCS8qIGlmIGl0IHdhcyB0aGUgbGFzdCBkaXNrLCBmaW5kIHRoZSBuZXcgaGlnaHRlc3QgbHVuICovCisJaWYgKGNsZWFyX2FsbCAmJiByZWNhbGN1bGF0ZV9oaWdoZXN0X2x1bikgeworCQlpbnQgaSwgbmV3aGlnaGVzdCA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDw9IGgtPmhpZ2hlc3RfbHVuOyBpKyspIHsKKwkJCS8qIGlmIHRoZSBkaXNrIGhhcyBzaXplID4gMCwgaXQgaXMgYXZhaWxhYmxlICovCisJCQlpZiAoaC0+ZHJ2W2ldICYmIGgtPmRydltpXS0+aGVhZHMpCisJCQkJbmV3aGlnaGVzdCA9IGk7CiAJCX0KLQotCQlkcnYtPkx1bklEID0gMDsKKwkJaC0+aGlnaGVzdF9sdW4gPSBuZXdoaWdoZXN0OwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI0NzksOCArMjcyMCw2IEBACiAJfSBlbHNlIHsJCS8qIEdldCBnZW9tZXRyeSBmYWlsZWQgKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IHJlYWRpbmcgZ2VvbWV0cnkgZmFpbGVkXG4iKTsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgaGVhZHM9JWQsIHNlY3RvcnM9JWQsIGN5bGluZGVycz0lZFxuXG4iLAotCSAgICAgICBkcnYtPmhlYWRzLCBkcnYtPnNlY3RvcnMsIGRydi0+Y3lsaW5kZXJzKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTI1MTQsOSArMjc1Myw2IEBACiAJCSp0b3RhbF9zaXplID0gMDsKIAkJKmJsb2NrX3NpemUgPSBCTE9DS19TSVpFOwogCX0KLQlpZiAoKnRvdGFsX3NpemUgIT0gMCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgYmxvY2tzPSAlbGx1IGJsb2NrX3NpemU9ICVkXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKSp0b3RhbF9zaXplKzEsICpibG9ja19zaXplKTsKIAlrZnJlZShidWYpOwogfQogCkBAIC0yNTY4LDcgKzI4MDQsOCBAQAogCUlucXVpcnlEYXRhX3N0cnVjdCAqaW5xX2J1ZmYgPSBOVUxMOwogCiAJZm9yIChsb2d2b2wgPSAwOyBsb2d2b2wgPCBDSVNTX01BWF9MVU47IGxvZ3ZvbCsrKSB7Ci0JCWlmIChoLT5kcnZbbG9ndm9sXS5MdW5JRCA9PSBkcnYtPkx1bklEKSB7CisJCWlmIChtZW1jbXAoaC0+ZHJ2W2xvZ3ZvbF0tPkx1bklELCBkcnYtPkx1bklELAorCQkJc2l6ZW9mKGRydi0+THVuSUQpKSA9PSAwKSB7CiAJCQlGT1VORCA9IDE7CiAJCQlicmVhazsKIAkJfQpAQCAtMzA1Myw4ICszMjkwLDcgQEAKIAkvKiBUaGUgZmlyc3QgMiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgY29udHJvbGxlciBlcnJvciByZXBvcnRpbmcuICovCiAJYy0+SGVhZGVyLlRhZy5sb3dlciA9IChjLT5jbWRpbmRleCA8PCAzKTsKIAljLT5IZWFkZXIuVGFnLmxvd2VyIHw9IDB4MDQ7CS8qIGZsYWcgZm9yIGRpcmVjdCBsb29rdXAuICovCi0JYy0+SGVhZGVyLkxVTi5Mb2dEZXYuVm9sSWQgPSBkcnYtPkx1bklEOwotCWMtPkhlYWRlci5MVU4uTG9nRGV2Lk1vZGUgPSAxOworCW1lbWNweSgmYy0+SGVhZGVyLkxVTiwgZHJ2LT5MdW5JRCwgc2l6ZW9mKGRydi0+THVuSUQpKTsKIAljLT5SZXF1ZXN0LkNEQkxlbiA9IDEwOwkvLyAxMiBieXRlIGNvbW1hbmRzIG5vdCBpbiBGVyB5ZXQ7CiAJYy0+UmVxdWVzdC5UeXBlLlR5cGUgPSBUWVBFX0NNRDsJLy8gSXQgaXMgYSBjb21tYW5kLgogCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKQEAgLTMyMzIsMjAgKzM0NjgsMTIxIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCisvKioKKyAqIGFkZF90b19zY2FuX2xpc3QoKSAtIGFkZCBjb250cm9sbGVyIHRvIHJlc2NhbiBxdWV1ZQorICogQGg6CQkgICAgICBQb2ludGVyIHRvIHRoZSBjb250cm9sbGVyLgorICoKKyAqIEFkZHMgdGhlIGNvbnRyb2xsZXIgdG8gdGhlIHJlc2NhbiBxdWV1ZSBpZiBub3QgYWxyZWFkeSBvbiB0aGUgcXVldWUuCisgKgorICogcmV0dXJucyAxIGlmIGFkZGVkIHRvIHRoZSBxdWV1ZSwgMCBpZiBza2lwcGVkIChjb3VsZCBiZSBvbiB0aGUKKyAqIHF1ZXVlIGFscmVhZHksIG9yIHRoZSBjb250cm9sbGVyIGNvdWxkIGJlIGluaXRpYWxpemluZyBvciBzaHV0dGluZworICogZG93bikuCisgKiovCitzdGF0aWMgaW50IGFkZF90b19zY2FuX2xpc3Qoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwlzdHJ1Y3QgY3Rscl9pbmZvICp0ZXN0X2g7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChoLT5idXN5X2luaXRpYWxpemluZykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIW11dGV4X3RyeWxvY2soJmgtPmJ1c3lfc2h1dHRpbmdfZG93bikpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmc2Nhbl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZXN0X2gsICZzY2FuX3EsIHNjYW5fbGlzdCkgeworCQlpZiAodGVzdF9oID09IGgpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQgJiYgIWgtPmJ1c3lfc2Nhbm5pbmcpIHsKKwkJSU5JVF9DT01QTEVUSU9OKGgtPnNjYW5fd2FpdCk7CisJCWxpc3RfYWRkX3RhaWwoJmgtPnNjYW5fbGlzdCwgJnNjYW5fcSk7CisJCXJldCA9IDE7CisJfQorCW11dGV4X3VubG9jaygmc2Nhbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZoLT5idXN5X3NodXR0aW5nX2Rvd24pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiByZW1vdmVfZnJvbV9zY2FuX2xpc3QoKSAtIHJlbW92ZSBjb250cm9sbGVyIGZyb20gcmVzY2FuIHF1ZXVlCisgKiBAaDoJCQkgICBQb2ludGVyIHRvIHRoZSBjb250cm9sbGVyLgorICoKKyAqIFJlbW92ZXMgdGhlIGNvbnRyb2xsZXIgZnJvbSB0aGUgcmVzY2FuIHF1ZXVlIGlmIHByZXNlbnQuIEJsb2NrcyBpZgorICogdGhlIGNvbnRyb2xsZXIgaXMgY3VycmVudGx5IGNvbmR1Y3RpbmcgYSByZXNjYW4uCisgKiovCitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV9zY2FuX2xpc3Qoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwlzdHJ1Y3QgY3Rscl9pbmZvICp0ZXN0X2gsICp0bXBfaDsKKwlpbnQgc2Nhbm5pbmcgPSAwOworCisJbXV0ZXhfbG9jaygmc2Nhbl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRlc3RfaCwgdG1wX2gsICZzY2FuX3EsIHNjYW5fbGlzdCkgeworCQlpZiAodGVzdF9oID09IGgpIHsKKwkJCWxpc3RfZGVsKCZoLT5zY2FuX2xpc3QpOworCQkJY29tcGxldGVfYWxsKCZoLT5zY2FuX3dhaXQpOworCQkJbXV0ZXhfdW5sb2NrKCZzY2FuX211dGV4KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoJmgtPmJ1c3lfc2Nhbm5pbmcpCisJCXNjYW5uaW5nID0gMDsKKwltdXRleF91bmxvY2soJnNjYW5fbXV0ZXgpOworCisJaWYgKHNjYW5uaW5nKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZoLT5zY2FuX3dhaXQpOworfQorCisvKioKKyAqIHNjYW5fdGhyZWFkKCkgLSBrZXJuZWwgdGhyZWFkIHVzZWQgdG8gcmVzY2FuIGNvbnRyb2xsZXJzCisgKiBAZGF0YToJIElnbm9yZWQuCisgKgorICogQSBrZXJuZWwgdGhyZWFkIHVzZWQgc2NhbiBmb3IgZHJpdmUgdG9wb2xvZ3kgY2hhbmdlcyBvbgorICogY29udHJvbGxlcnMuIFRoZSB0aHJlYWQgcHJvY2Vzc2VzIG9ubHkgb25lIGNvbnRyb2xsZXIgYXQgYSB0aW1lCisgKiB1c2luZyBhIHF1ZXVlLiAgQ29udHJvbGxlcnMgYXJlIGFkZGVkIHRvIHRoZSBxdWV1ZSB1c2luZworICogYWRkX3RvX3NjYW5fbGlzdCgpIGFuZCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGVpdGhlciBhZnRlciBkb25lCisgKiBwcm9jZXNzaW5nIG9yIHVzaW5nIHJlbW92ZV9mcm9tX3NjYW5fbGlzdCgpLgorICoKKyAqIHJldHVybnMgMC4KKyAqKi8KIHN0YXRpYyBpbnQgc2Nhbl90aHJlYWQodm9pZCAqZGF0YSkKIHsKLQljdGxyX2luZm9fdCAqaCA9IGRhdGE7Ci0JaW50IHJjOwotCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKHdhaXQpOwotCWgtPnJlc2Nhbl93YWl0ID0gJndhaXQ7CisJc3RydWN0IGN0bHJfaW5mbyAqaDsKIAotCWZvciAoOzspIHsKLQkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlKCk7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKLQkJaWYgKCFyYykKLQkJCXJlYnVpbGRfbHVuX3RhYmxlKGgsIDApOworCisJCXdoaWxlICgxKSB7CisJCQltdXRleF9sb2NrKCZzY2FuX211dGV4KTsKKwkJCWlmIChsaXN0X2VtcHR5KCZzY2FuX3EpKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZzY2FuX211dGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaCA9IGxpc3RfZW50cnkoc2Nhbl9xLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBjdGxyX2luZm8sCisJCQkJICAgICAgIHNjYW5fbGlzdCk7CisJCQlsaXN0X2RlbCgmaC0+c2Nhbl9saXN0KTsKKwkJCWgtPmJ1c3lfc2Nhbm5pbmcgPSAxOworCQkJbXV0ZXhfdW5sb2NrKCZzY2FuX211dGV4KTsKKworCQkJaWYgKGgpIHsKKwkJCQlyZWJ1aWxkX2x1bl90YWJsZShoLCAwLCAwKTsKKwkJCQljb21wbGV0ZV9hbGwoJmgtPnNjYW5fd2FpdCk7CisJCQkJbXV0ZXhfbG9jaygmc2Nhbl9tdXRleCk7CisJCQkJaC0+YnVzeV9zY2FubmluZyA9IDA7CisJCQkJbXV0ZXhfdW5sb2NrKCZzY2FuX211dGV4KTsKKwkJCX0KKwkJfQogCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0zMjY4LDggKzM2MDUsOCBAQAogCWNhc2UgUkVQT1JUX0xVTlNfQ0hBTkdFRDoKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogcmVwb3J0IExVTiBkYXRhICIKIAkJCSJjaGFuZ2VkXG4iLCBoLT5jdGxyKTsKLQkJaWYgKGgtPnJlc2Nhbl93YWl0KQotCQkJY29tcGxldGUoaC0+cmVzY2FuX3dhaXQpOworCQlhZGRfdG9fc2Nhbl9saXN0KGgpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2Npc3Nfc2Nhbl90aHJlYWQpOwogCQlyZXR1cm4gMTsKIAlicmVhazsKIAljYXNlIFBPV0VSX09SX1JFU0VUOgpAQCAtMzQyMiw3ICszNzU5LDI3IEBACiAJX191NjQgY2ZnX29mZnNldDsKIAlfX3UzMiBjZmdfYmFzZV9hZGRyOwogCV9fdTY0IGNmZ19iYXNlX2FkZHJfaW5kZXg7Ci0JaW50IGksIGVycjsKKwlpbnQgaSwgcHJvZF9pbmRleCwgZXJyOworCisJc3Vic3lzdGVtX3ZlbmRvcl9pZCA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CisJc3Vic3lzdGVtX2RldmljZV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJYm9hcmRfaWQgPSAoKChfX3UzMikgKHN1YnN5c3RlbV9kZXZpY2VfaWQgPDwgMTYpICYgMHhmZmZmMDAwMCkgfAorCQkgICAgc3Vic3lzdGVtX3ZlbmRvcl9pZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm9kdWN0cyk7IGkrKykgeworCQkvKiBTdGFuZCBhc2lkZSBmb3IgaHBzYSBkcml2ZXIgb24gcmVxdWVzdCAqLworCQlpZiAoY2Npc3NfYWxsb3dfaHBzYSAmJiBwcm9kdWN0c1tpXS5ib2FyZF9pZCA9PSBIUFNBX0JPVU5EQVJZKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmIChib2FyZF9pZCA9PSBwcm9kdWN0c1tpXS5ib2FyZF9pZCkKKwkJCWJyZWFrOworCX0KKwlwcm9kX2luZGV4ID0gaTsKKwlpZiAocHJvZF9pbmRleCA9PSBBUlJBWV9TSVpFKHByb2R1Y3RzKSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJInVucmVjb2duaXplZCBib2FyZCBJRDogMHglMDhseCwgaWdub3JpbmcuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpIGJvYXJkX2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJLyogY2hlY2sgdG8gc2VlIGlmIGNvbnRyb2xsZXIgaGFzIGJlZW4gZGlzYWJsZWQgKi8KIAkvKiBCRUZPUkUgdHJ5aW5nIHRvIGVuYWJsZSBpdCAqLwpAQCAtMzQ0NiwxMSArMzgwMyw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc3Vic3lzdGVtX3ZlbmRvcl9pZCA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7Ci0Jc3Vic3lzdGVtX2RldmljZV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7Ci0JYm9hcmRfaWQgPSAoKChfX3UzMikgKHN1YnN5c3RlbV9kZXZpY2VfaWQgPDwgMTYpICYgMHhmZmZmMDAwMCkgfAotCQkgICAgc3Vic3lzdGVtX3ZlbmRvcl9pZCk7Ci0KICNpZmRlZiBDQ0lTU19ERUJVRwogCXByaW50aygiY29tbWFuZCA9ICV4XG4iLCBjb21tYW5kKTsKIAlwcmludGsoImlycSA9ICV4XG4iLCBwZGV2LT5pcnEpOwpAQCAtMzQ4OSw3ICszODQxLDcgQEAKIAkJaWYgKHNjcmF0Y2hwYWQgPT0gQ0NJU1NfRklSTVdBUkVfUkVBRFkpCiAJCQlicmVhazsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsJLyogd2FpdCAxMDBtcyAqLworCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CS8qIHdhaXQgMTAwbXMgKi8KIAl9CiAJaWYgKHNjcmF0Y2hwYWQgIT0gQ0NJU1NfRklSTVdBUkVfUkVBRFkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IEJvYXJkIG5vdCByZWFkeS4gIFRpbWVkIG91dC5cbiIpOwpAQCAtMzUzNiwxNCArMzg4OCw5IEBACiAJICogbGVhdmUgYSBsaXR0bGUgcm9vbSBmb3IgaW9jdGwgY2FsbHMuCiAJICovCiAJYy0+bWF4X2NvbW1hbmRzID0gcmVhZGwoJihjLT5jZmd0YWJsZS0+Q21kc091dE1heCkpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByb2R1Y3RzKTsgaSsrKSB7Ci0JCWlmIChib2FyZF9pZCA9PSBwcm9kdWN0c1tpXS5ib2FyZF9pZCkgewotCQkJYy0+cHJvZHVjdF9uYW1lID0gcHJvZHVjdHNbaV0ucHJvZHVjdF9uYW1lOwotCQkJYy0+YWNjZXNzID0gKihwcm9kdWN0c1tpXS5hY2Nlc3MpOwotCQkJYy0+bnJfY21kcyA9IGMtPm1heF9jb21tYW5kcyAtIDQ7Ci0JCQlicmVhazsKLQkJfQotCX0KKwljLT5wcm9kdWN0X25hbWUgPSBwcm9kdWN0c1twcm9kX2luZGV4XS5wcm9kdWN0X25hbWU7CisJYy0+YWNjZXNzID0gKihwcm9kdWN0c1twcm9kX2luZGV4XS5hY2Nlc3MpOworCWMtPm5yX2NtZHMgPSBjLT5tYXhfY29tbWFuZHMgLSA0OwogCWlmICgocmVhZGIoJmMtPmNmZ3RhYmxlLT5TaWduYXR1cmVbMF0pICE9ICdDJykgfHwKIAkgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzFdKSAhPSAnSScpIHx8CiAJICAgIChyZWFkYigmYy0+Y2ZndGFibGUtPlNpZ25hdHVyZVsyXSkgIT0gJ1MnKSB8fApAQCAtMzU1MiwyNyArMzg5OSw2IEBACiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9Ci0JLyogV2UgZGlkbid0IGZpbmQgdGhlIGNvbnRyb2xsZXIgaW4gb3VyIGxpc3QuIFdlIGtub3cgdGhlCi0JICogc2lnbmF0dXJlIGlzIHZhbGlkLiBJZiBpdCdzIGFuIEhQIGRldmljZSBsZXQncyB0cnkgdG8KLQkgKiBiaW5kIHRvIHRoZSBkZXZpY2UgYW5kIGZpcmUgaXQgdXAuIE90aGVyd2lzZSB3ZSBiYWlsLgotCSAqLwotCWlmIChpID09IEFSUkFZX1NJWkUocHJvZHVjdHMpKSB7Ci0JCWlmIChzdWJzeXN0ZW1fdmVuZG9yX2lkID09IFBDSV9WRU5ET1JfSURfSFApIHsKLQkJCWMtPnByb2R1Y3RfbmFtZSA9IHByb2R1Y3RzW2ktMV0ucHJvZHVjdF9uYW1lOwotCQkJYy0+YWNjZXNzID0gKihwcm9kdWN0c1tpLTFdLmFjY2Vzcyk7Ci0JCQljLT5ucl9jbWRzID0gYy0+bWF4X2NvbW1hbmRzIC0gNDsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBUaGlzIGlzIGFuIHVua25vd24gIgotCQkJCSJTbWFydCBBcnJheSBjb250cm9sbGVyLlxuIgotCQkJCSJjY2lzczogUGxlYXNlIHVwZGF0ZSB0byB0aGUgbGF0ZXN0IGRyaXZlciAiCi0JCQkJImF2YWlsYWJsZSBmcm9tIHd3dy5ocC5jb20uXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBTb3JyeSwgSSBkb24ndCBrbm93IGhvdyIKLQkJCQkiIHRvIGFjY2VzcyB0aGUgU21hcnQgQXJyYXkgY29udHJvbGxlciAlMDhseFxuIgotCQkJCQksICh1bnNpZ25lZCBsb25nKWJvYXJkX2lkKTsKLQkJCWVyciA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7Ci0JCX0KLQl9CiAjaWZkZWYgQ09ORklHX1g4NgogCXsKIAkJLyogTmVlZCB0byBlbmFibGUgcHJlZmV0Y2ggaW4gdGhlIFNDU0kgY29yZSBmb3IgNjQwMCBpbiB4ODYgKi8KQEAgLTM2MTUsNyArMzk0MSw3IEBACiAJCQlicmVhazsKIAkJLyogZGVsYXkgYW5kIHRyeSBhZ2FpbiAqLwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KDEwKTsKKwkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDEpKTsKIAl9CiAKICNpZmRlZiBDQ0lTU19ERUJVRwpAQCAtMzY2OSwxNSArMzk5NSwxNiBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9oYmEoaW50IGkpCitzdGF0aWMgdm9pZCBmcmVlX2hiYShpbnQgbikKIHsKLQljdGxyX2luZm9fdCAqcCA9IGhiYVtpXTsKLQlpbnQgbjsKKwljdGxyX2luZm9fdCAqaCA9IGhiYVtuXTsKKwlpbnQgaTsKIAotCWhiYVtpXSA9IE5VTEw7Ci0JZm9yIChuID0gMDsgbiA8IENJU1NfTUFYX0xVTjsgbisrKQotCQlwdXRfZGlzayhwLT5nZW5kaXNrW25dKTsKLQlrZnJlZShwKTsKKwloYmFbbl0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBoLT5oaWdoZXN0X2x1biArIDE7IGkrKykKKwkJaWYgKGgtPmdlbmRpc2tbaV0gIT0gTlVMTCkKKwkJCXB1dF9kaXNrKGgtPmdlbmRpc2tbaV0pOworCWtmcmVlKGgpOwogfQogCiAvKiBTZW5kIGEgbWVzc2FnZSBDREIgdG8gdGhlIGZpcm13YXJlLiAqLwpAQCAtMzkxOCwxNCArNDI0NSwxNyBAQAogCWhiYVtpXS0+YnVzeV9pbml0aWFsaXppbmcgPSAxOwogCUlOSVRfSExJU1RfSEVBRCgmaGJhW2ldLT5jbXBRKTsKIAlJTklUX0hMSVNUX0hFQUQoJmhiYVtpXS0+cmVxUSk7CisJbXV0ZXhfaW5pdCgmaGJhW2ldLT5idXN5X3NodXR0aW5nX2Rvd24pOwogCiAJaWYgKGNjaXNzX3BjaV9pbml0KGhiYVtpXSwgcGRldikgIT0gMCkKLQkJZ290byBjbGVhbjA7CisJCWdvdG8gY2xlYW5fbm9fcmVsZWFzZV9yZWdpb25zOwogCiAJc3ByaW50ZihoYmFbaV0tPmRldm5hbWUsICJjY2lzcyVkIiwgaSk7CiAJaGJhW2ldLT5jdGxyID0gaTsKIAloYmFbaV0tPnBkZXYgPSBwZGV2OwogCisJaW5pdF9jb21wbGV0aW9uKCZoYmFbaV0tPnNjYW5fd2FpdCk7CisKIAlpZiAoY2Npc3NfY3JlYXRlX2hiYV9zeXNmc19lbnRyeShoYmFbaV0pKQogCQlnb3RvIGNsZWFuMDsKIApAQCAtNDAwMSw4ICs0MzMxLDcgQEAKIAloYmFbaV0tPm51bV9sdW5zID0gMDsKIAloYmFbaV0tPmhpZ2hlc3RfbHVuID0gLTE7CiAJZm9yIChqID0gMDsgaiA8IENJU1NfTUFYX0xVTjsgaisrKSB7Ci0JCWhiYVtpXS0+ZHJ2W2pdLnJhaWRfbGV2ZWwgPSAtMTsKLQkJaGJhW2ldLT5kcnZbal0ucXVldWUgPSBOVUxMOworCQloYmFbaV0tPmRydltqXSA9IE5VTEw7CiAJCWhiYVtpXS0+Z2VuZGlza1tqXSA9IE5VTEw7CiAJfQogCkBAIC00MDM1LDE0ICs0MzY0LDggQEAKIAogCWhiYVtpXS0+Y2Npc3NfbWF4X3NlY3RvcnMgPSAyMDQ4OwogCisJcmVidWlsZF9sdW5fdGFibGUoaGJhW2ldLCAxLCAwKTsKIAloYmFbaV0tPmJ1c3lfaW5pdGlhbGl6aW5nID0gMDsKLQotCXJlYnVpbGRfbHVuX3RhYmxlKGhiYVtpXSwgMSk7Ci0JaGJhW2ldLT5jY2lzc19zY2FuX3RocmVhZCA9IGt0aHJlYWRfcnVuKHNjYW5fdGhyZWFkLCBoYmFbaV0sCi0JCQkJImNjaXNzX3NjYW4lMDJkIiwgaSk7Ci0JaWYgKElTX0VSUihoYmFbaV0tPmNjaXNzX3NjYW5fdGhyZWFkKSkKLQkJcmV0dXJuIFBUUl9FUlIoaGJhW2ldLT5jY2lzc19zY2FuX3RocmVhZCk7Ci0KIAlyZXR1cm4gMTsKIAogY2xlYW40OgpAQCAtNDA2MiwxOCArNDM4NSwxNCBAQAogY2xlYW4xOgogCWNjaXNzX2Rlc3Ryb3lfaGJhX3N5c2ZzX2VudHJ5KGhiYVtpXSk7CiBjbGVhbjA6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2NsZWFuX25vX3JlbGVhc2VfcmVnaW9uczoKIAloYmFbaV0tPmJ1c3lfaW5pdGlhbGl6aW5nID0gMDsKLQkvKiBjbGVhbnVwIGFueSBxdWV1ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGluaXRpYWxpemVkICovCi0JZm9yIChqPTA7IGogPD0gaGJhW2ldLT5oaWdoZXN0X2x1bjsgaisrKXsKLQkJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9ICYoaGJhW2ldLT5kcnZbal0pOwotCQlpZiAoZHJ2LT5xdWV1ZSkKLQkJCWJsa19jbGVhbnVwX3F1ZXVlKGRydi0+cXVldWUpOwotCX0KKwogCS8qCiAJICogRGVsaWJlcmF0ZWx5IG9taXQgcGNpX2Rpc2FibGVfZGV2aWNlKCk6IGl0IGRvZXMgc29tZXRoaW5nIG5hc3R5IHRvCiAJICogU21hcnQgQXJyYXkgY29udHJvbGxlcnMgdGhhdCBwY2lfZW5hYmxlX2RldmljZSBkb2VzIG5vdCB1bmRvCiAJICovCi0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJZnJlZV9oYmEoaSk7CiAJcmV0dXJuIC0xOwpAQCAtNDEyNSw4ICs0NDQ0LDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCWt0aHJlYWRfc3RvcChoYmFbaV0tPmNjaXNzX3NjYW5fdGhyZWFkKTsKKwltdXRleF9sb2NrKCZoYmFbaV0tPmJ1c3lfc2h1dHRpbmdfZG93bik7CiAKKwlyZW1vdmVfZnJvbV9zY2FuX2xpc3QoaGJhW2ldKTsKIAlyZW1vdmVfcHJvY19lbnRyeShoYmFbaV0tPmRldm5hbWUsIHByb2NfY2Npc3MpOwogCXVucmVnaXN0ZXJfYmxrZGV2KGhiYVtpXS0+bWFqb3IsIGhiYVtpXS0+ZGV2bmFtZSk7CiAKQEAgLTQxMzYsOCArNDQ1NiwxMCBAQAogCQlpZiAoZGlzaykgewogCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkaXNrLT5xdWV1ZTsKIAotCQkJaWYgKGRpc2stPmZsYWdzICYgR0VOSERfRkxfVVApCisJCQlpZiAoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkgeworCQkJCWNjaXNzX2Rlc3Ryb3lfbGRfc3lzZnNfZW50cnkoaGJhW2ldLCBqLCAxKTsKIAkJCQlkZWxfZ2VuZGlzayhkaXNrKTsKKwkJCX0KIAkJCWlmIChxKQogCQkJCWJsa19jbGVhbnVwX3F1ZXVlKHEpOwogCQl9CkBAIC00MTcwLDYgKzQ0OTIsNyBAQAogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWNjaXNzX2Rlc3Ryb3lfaGJhX3N5c2ZzX2VudHJ5KGhiYVtpXSk7CisJbXV0ZXhfdW5sb2NrKCZoYmFbaV0tPmJ1c3lfc2h1dHRpbmdfZG93bik7CiAJZnJlZV9oYmEoaSk7CiB9CiAKQEAgLTQyMDIsMTUgKzQ1MjUsMjUgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCisJLyogU3RhcnQgdGhlIHNjYW4gdGhyZWFkICovCisJY2Npc3Nfc2Nhbl90aHJlYWQgPSBrdGhyZWFkX3J1bihzY2FuX3RocmVhZCwgTlVMTCwgImNjaXNzX3NjYW4iKTsKKwlpZiAoSVNfRVJSKGNjaXNzX3NjYW5fdGhyZWFkKSkgeworCQllcnIgPSBQVFJfRVJSKGNjaXNzX3NjYW5fdGhyZWFkKTsKKwkJZ290byBlcnJfYnVzX3VucmVnaXN0ZXI7CisJfQorCiAJLyogUmVnaXN0ZXIgZm9yIG91ciBQQ0kgZGV2aWNlcyAqLwogCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNjaXNzX3BjaV9kcml2ZXIpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX2J1c19yZWdpc3RlcjsKKwkJZ290byBlcnJfdGhyZWFkX3N0b3A7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogCi1lcnJfYnVzX3JlZ2lzdGVyOgorZXJyX3RocmVhZF9zdG9wOgorCWt0aHJlYWRfc3RvcChjY2lzc19zY2FuX3RocmVhZCk7CitlcnJfYnVzX3VucmVnaXN0ZXI6CiAJYnVzX3VucmVnaXN0ZXIoJmNjaXNzX2J1c190eXBlKTsKKwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTQyMjcsNiArNDU2MCw3IEBACiAJCQljY2lzc19yZW1vdmVfb25lKGhiYVtpXS0+cGRldik7CiAJCX0KIAl9CisJa3RocmVhZF9zdG9wKGNjaXNzX3NjYW5fdGhyZWFkKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL2NjaXNzIiwgTlVMTCk7CiAJYnVzX3VucmVnaXN0ZXIoJmNjaXNzX2J1c190eXBlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuaCBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaAppbmRleCAwNmE1ZGIyLi4zMTUyNGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBDQ0lTU19ICiAKICNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJjY2lzc19jbWQuaCIKIApAQCAtMjksNyArMzAsNyBAQAogfTsKIHR5cGVkZWYgc3RydWN0IF9kcml2ZV9pbmZvX3N0cnVjdAogewotIAlfX3UzMiAgIEx1bklEOwkKKwl1bnNpZ25lZCBjaGFyIEx1bklEWzhdOwogCWludCAJdXNhZ2VfY291bnQ7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOwogCXNlY3Rvcl90IG5yX2Jsb2NrczsKQEAgLTUxLDYgKzUyLDcgQEAKIAljaGFyIHZlbmRvcltWRU5ET1JfTEVOICsgMV07IC8qIFNDU0kgdmVuZG9yIHN0cmluZyAqLwogCWNoYXIgbW9kZWxbTU9ERUxfTEVOICsgMV07ICAgLyogU0NTSSBtb2RlbCBzdHJpbmcgKi8KIAljaGFyIHJldltSRVZfTEVOICsgMV07ICAgICAgIC8qIFNDU0kgcmV2aXNpb24gc3RyaW5nICovCisJY2hhciBkZXZpY2VfaW5pdGlhbGl6ZWQ7ICAgICAvKiBpbmRpY2F0ZXMgd2hldGhlciBkZXYgaXMgaW5pdGlhbGl6ZWQgKi8KIH0gZHJpdmVfaW5mb19zdHJ1Y3Q7CiAKIHN0cnVjdCBjdGxyX2luZm8gCkBAIC04Niw3ICs4OCw3IEBACiAJQllURQljY2lzc19yZWFkX2NhcGFjaXR5OwogCiAJLy8gaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBsb2dpY2FsIHZvbHVtZQotCWRyaXZlX2luZm9fc3RydWN0IGRydltDSVNTX01BWF9MVU5dOworCWRyaXZlX2luZm9fc3RydWN0ICpkcnZbQ0lTU19NQVhfTFVOXTsKIAogCXN0cnVjdCBhY2Nlc3NfbWV0aG9kIGFjY2VzczsKIApAQCAtMTA4LDYgKzExMCw4IEBACiAJaW50CQkJbnJfZnJlZXM7IAogCWludAkJCWJ1c3lfY29uZmlndXJpbmc7CiAJaW50CQkJYnVzeV9pbml0aWFsaXppbmc7CisJaW50CQkJYnVzeV9zY2FubmluZzsKKwlzdHJ1Y3QgbXV0ZXgJCWJ1c3lfc2h1dHRpbmdfZG93bjsKIAogCS8qIFRoaXMgZWxlbWVudCBob2xkcyB0aGUgemVybyBiYXNlZCBxdWV1ZSBudW1iZXIgb2YgdGhlIGxhc3QKIAkgKiBxdWV1ZSB0byBiZSBzdGFydGVkLiAgSXQgaXMgdXNlZCBmb3IgZmFpcm5lc3MuCkBAIC0xMjIsOCArMTI2LDggQEAKIAkvKiBhbmQgc2F2ZWQgZm9yIGxhdGVyIHByb2Nlc3NpbmcgKi8KICNlbmRpZgogCXVuc2lnbmVkIGNoYXIgYWxpdmU7Ci0Jc3RydWN0IGNvbXBsZXRpb24gKnJlc2Nhbl93YWl0OwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2Npc3Nfc2Nhbl90aHJlYWQ7CisJc3RydWN0IGxpc3RfaGVhZCBzY2FuX2xpc3Q7CisJc3RydWN0IGNvbXBsZXRpb24gc2Nhbl93YWl0OwogCXN0cnVjdCBkZXZpY2UgZGV2OwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jIGIvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCmluZGV4IGI4MmQ0MzguLjY0MjI2NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTE3Nyw3ICsxNzgsNiBAQAogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyB2b2lkIGlkYV9wcm9jaW5pdChpbnQgaSk7Ci1zdGF0aWMgaW50IGlkYV9wcm9jX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKICNlbHNlCiBzdGF0aWMgdm9pZCBpZGFfcHJvY2luaXQoaW50IGkpIHt9CiAjZW5kaWYKQEAgLTIwNiw2ICsyMDYsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYXJyYXk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpZGFfcHJvY19mb3BzOwogCiAvKgogICogR2V0IHVzIGEgZmlsZSBpbiAvcHJvYy9hcnJheSB0aGF0IHNheXMgc29tZXRoaW5nIGFib3V0IGVhY2ggY29udHJvbGxlci4KQEAgLTIxOCwxOSArMjE5LDE2IEBACiAJCWlmICghcHJvY19hcnJheSkgcmV0dXJuOwogCX0KIAotCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoaGJhW2ldLT5kZXZuYW1lLCAwLCBwcm9jX2FycmF5LAotCQkJICAgICAgIGlkYV9wcm9jX2dldF9pbmZvLCBoYmFbaV0pOworCXByb2NfY3JlYXRlX2RhdGEoaGJhW2ldLT5kZXZuYW1lLCAwLCBwcm9jX2FycmF5LCAmaWRhX3Byb2NfZm9wcywgaGJhW2ldKTsKIH0KIAogLyoKICAqIFJlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRyb2xsZXIuCiAgKi8KLXN0YXRpYyBpbnQgaWRhX3Byb2NfZ2V0X2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGlkYV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCW9mZl90IHBvcyA9IDA7Ci0Jb2ZmX3QgbGVuID0gMDsKLQlpbnQgc2l6ZSwgaSwgY3RscjsKLQljdGxyX2luZm9fdCAqaCA9IChjdGxyX2luZm9fdCopZGF0YTsKKwlpbnQgaSwgY3RscjsKKwljdGxyX2luZm9fdCAqaCA9IChjdGxyX2luZm9fdCopbS0+cHJpdmF0ZTsKIAlkcnZfaW5mb190ICpkcnY7CiAjaWZkZWYgQ1BRX1BST0NfUFJJTlRfUVVFVUVTCiAJY21kbGlzdF90ICpjOwpAQCAtMjM4LDcgKzIzNiw3IEBACiAjZW5kaWYKIAogCWN0bHIgPSBoLT5jdGxyOwotCXNpemUgPSBzcHJpbnRmKGJ1ZmZlciwgIiVzOiAgQ29tcGFxICVzIENvbnRyb2xsZXJcbiIKKwlzZXFfcHJpbnRmKG0sICIlczogIENvbXBhcSAlcyBDb250cm9sbGVyXG4iCiAJCSIgICAgICAgQm9hcmQgSUQ6IDB4JTA4bHhcbiIKIAkJIiAgICAgICBGaXJtd2FyZSBSZXZpc2lvbjogJWMlYyVjJWNcbiIKIAkJIiAgICAgICBDb250cm9sbGVyIFNpZzogMHglMDhseFxuIgpAQCAtMjU4LDU1ICsyNTYsNTQgQEAKIAkJaC0+bG9nX2RyaXZlcywgaC0+cGh5c19kcml2ZXMsCiAJCWgtPlFkZXB0aCwgaC0+bWF4UXNpbmNlaW5pdCk7CiAKLQlwb3MgKz0gc2l6ZTsgbGVuICs9IHNpemU7Ci0JCi0Jc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwgIkxvZ2ljYWwgRHJpdmUgSW5mbzpcbiIpOwotCXBvcyArPSBzaXplOyBsZW4gKz0gc2l6ZTsKKwlzZXFfcHV0cyhtLCAiTG9naWNhbCBEcml2ZSBJbmZvOlxuIik7CiAKIAlmb3IoaT0wOyBpPGgtPmxvZ19kcml2ZXM7IGkrKykgewogCQlkcnYgPSAmaC0+ZHJ2W2ldOwotCQlzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCAiaWRhL2MlZGQlZDogYmxrc3o9JWQgbnJfYmxrcz0lZFxuIiwKKwkJc2VxX3ByaW50ZihtLCAiaWRhL2MlZGQlZDogYmxrc3o9JWQgbnJfYmxrcz0lZFxuIiwKIAkJCQljdGxyLCBpLCBkcnYtPmJsa19zaXplLCBkcnYtPm5yX2Jsa3MpOwotCQlwb3MgKz0gc2l6ZTsgbGVuICs9IHNpemU7CiAJfQogCiAjaWZkZWYgQ1BRX1BST0NfUFJJTlRfUVVFVUVTCiAJc3Bpbl9sb2NrX2lycXNhdmUoSURBX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsgCi0Jc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwgIlxuQ3VycmVudCBRdWV1ZXM6XG4iKTsKLQlwb3MgKz0gc2l6ZTsgbGVuICs9IHNpemU7CisJc2VxX3B1dHMobSwgIlxuQ3VycmVudCBRdWV1ZXM6XG4iKTsKIAogCWMgPSBoLT5yZXFROwotCXNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJyZXFRID0gJXAiLCBjKTsgcG9zICs9IHNpemU7IGxlbiArPSBzaXplOworCXNlcV9wcmludGYobSwgInJlcVEgPSAlcCIsIGMpOwogCWlmIChjKSBjPWMtPm5leHQ7CiAJd2hpbGUoYyAmJiBjICE9IGgtPnJlcVEpIHsKLQkJc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwgIi0+JXAiLCBjKTsKLQkJcG9zICs9IHNpemU7IGxlbiArPSBzaXplOworCQlzZXFfcHJpbnRmKG0sICItPiVwIiwgYyk7CiAJCWM9Yy0+bmV4dDsKIAl9CiAKIAljID0gaC0+Y21wUTsKLQlzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCAiXG5jbXBRID0gJXAiLCBjKTsgcG9zICs9IHNpemU7IGxlbiArPSBzaXplOworCXNlcV9wcmludGYobSwgIlxuY21wUSA9ICVwIiwgYyk7CiAJaWYgKGMpIGM9Yy0+bmV4dDsKIAl3aGlsZShjICYmIGMgIT0gaC0+Y21wUSkgewotCQlzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCAiLT4lcCIsIGMpOwotCQlwb3MgKz0gc2l6ZTsgbGVuICs9IHNpemU7CisJCXNlcV9wcmludGYobSwgIi0+JXAiLCBjKTsKIAkJYz1jLT5uZXh0OwogCX0KIAotCXNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcbiIpOyBwb3MgKz0gc2l6ZTsgbGVuICs9IHNpemU7CisJc2VxX3B1dGMobSwgJ1xuJyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShJREFfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOyAKICNlbmRpZgotCXNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJucl9hbGxvY3MgPSAlZFxubnJfZnJlZXMgPSAlZFxuIiwKKwlzZXFfcHJpbnRmKG0sICJucl9hbGxvY3MgPSAlZFxubnJfZnJlZXMgPSAlZFxuIiwKIAkJCWgtPm5yX2FsbG9jcywgaC0+bnJfZnJlZXMpOwotCXBvcyArPSBzaXplOyBsZW4gKz0gc2l6ZTsKLQotCSplb2YgPSAxOwotCSpzdGFydCA9IGJ1ZmZlcitvZmZzZXQ7Ci0JbGVuIC09IG9mZnNldDsKLQlpZiAobGVuPmxlbmd0aCkKLQkJbGVuID0gbGVuZ3RoOwotCXJldHVybiBsZW47CisJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgaWRhX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaWRhX3Byb2Nfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlkYV9wcm9jX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGlkYV9wcm9jX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogbW9kdWxlX3BhcmFtX2FycmF5KGVpc2EsIGludCwgTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCmluZGV4IGVkZGE5ZWEuLmJkMTEyYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbG9vcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCkBAIC05NDksNyArOTQ5LDcgQEAKIAlsby0+bG9fc3RhdGUgPSBMb191bmJvdW5kOwogCS8qIFRoaXMgaXMgc2FmZTogb3BlbigpIGlzIHN0aWxsIGhvbGRpbmcgYSByZWZlcmVuY2UuICovCiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JaWYgKG1heF9wYXJ0ID4gMCkKKwlpZiAobWF4X3BhcnQgPiAwICYmIGJkZXYpCiAJCWlvY3RsX2J5X2JkZXYoYmRldiwgQkxLUlJQQVJULCAwKTsKIAltdXRleF91bmxvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCmluZGV4IDQzZjE5MzguLjUxMDQyZjBiYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCkBAIC0zLDcgKzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlydGlvX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19ibGsuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCkBAIC0xODMsMzQgKzE4Miw2IEBACiAJCXZibGstPnZxLT52cV9vcHMtPmtpY2sodmJsay0+dnEpOwogfQogCi0vKiByZXR1cm4gQVRBIGlkZW50aWZ5IGRhdGEKLSAqLwotc3RhdGljIGludCB2aXJ0YmxrX2lkZW50aWZ5KHN0cnVjdCBnZW5kaXNrICpkaXNrLCB2b2lkICphcmdwKQotewotCXN0cnVjdCB2aXJ0aW9fYmxrICp2YmxrID0gZGlzay0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgKm9wYXF1ZTsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCW9wYXF1ZSA9IGttYWxsb2MoVklSVElPX0JMS19JRF9CWVRFUywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvcGFxdWUpCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gdmlydGlvX2NvbmZpZ19idWYodmJsay0+dmRldiwgVklSVElPX0JMS19GX0lERU5USUZZLAotCQlvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX2Jsa19jb25maWcsIGlkZW50aWZ5KSwgb3BhcXVlLAotCQlWSVJUSU9fQkxLX0lEX0JZVEVTKTsKLQotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2tmcmVlOwotCi0JaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBvcGFxdWUsIFZJUlRJT19CTEtfSURfQllURVMpKQotCQllcnIgPSAtRUZBVUxUOwotCi1vdXRfa2ZyZWU6Ci0Ja2ZyZWUob3BhcXVlKTsKLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgdm9pZCB2aXJ0YmxrX3ByZXBhcmVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJcmVxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0xJTlVYX0JMT0NLOwpAQCAtMjIyLDEwICsxOTMsNiBAQAogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKIAlzdHJ1Y3QgdmlydGlvX2JsayAqdmJsayA9IGRpc2stPnByaXZhdGVfZGF0YTsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0KLQlpZiAoY21kID09IEhESU9fR0VUX0lERU5USVRZKQotCQlyZXR1cm4gdmlydGJsa19pZGVudGlmeShkaXNrLCBhcmdwKTsKIAogCS8qCiAJICogT25seSBhbGxvdyB0aGUgZ2VuZXJpYyBTQ1NJIGlvY3RscyBpZiB0aGUgaG9zdCBjYW4gc3VwcG9ydCBpdC4KQEAgLTIzMyw3ICsyMDAsOCBAQAogCWlmICghdmlydGlvX2hhc19mZWF0dXJlKHZibGstPnZkZXYsIFZJUlRJT19CTEtfRl9TQ1NJKSkKIAkJcmV0dXJuIC1FTk9UVFk7CiAKLQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZGlzay0+cXVldWUsIGRpc2ssIG1vZGUsIGNtZCwgYXJncCk7CisJcmV0dXJuIHNjc2lfY21kX2lvY3RsKGRpc2stPnF1ZXVlLCBkaXNrLCBtb2RlLCBjbWQsCisJCQkgICAgICAodm9pZCBfX3VzZXIgKilkYXRhKTsKIH0KIAogLyogV2UgcHJvdmlkZSBnZXRnZW8gb25seSB0byBwbGVhc2Ugc29tZSBvbGQgYm9vdGxvYWRlci9wYXJ0aXRpb25pbmcgdG9vbHMgKi8KQEAgLTMzMiw3ICszMDAsNiBAQAogCX0KIAogCXZibGstPmRpc2stPnF1ZXVlLT5xdWV1ZWRhdGEgPSB2YmxrOwotCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfVklSVCwgdmJsay0+ZGlzay0+cXVldWUpOwogCiAJaWYgKGluZGV4IDwgMjYpIHsKIAkJc3ByaW50Zih2YmxrLT5kaXNrLT5kaXNrX25hbWUsICJ2ZCVjIiwgJ2EnICsgaW5kZXggJSAyNik7CkBAIC00NDUsNyArNDEyLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmVhdHVyZXNbXSA9IHsKIAlWSVJUSU9fQkxLX0ZfQkFSUklFUiwgVklSVElPX0JMS19GX1NFR19NQVgsIFZJUlRJT19CTEtfRl9TSVpFX01BWCwKIAlWSVJUSU9fQkxLX0ZfR0VPTUVUUlksIFZJUlRJT19CTEtfRl9STywgVklSVElPX0JMS19GX0JMS19TSVpFLAotCVZJUlRJT19CTEtfRl9TQ1NJLCBWSVJUSU9fQkxLX0ZfSURFTlRJRlksIFZJUlRJT19CTEtfRl9GTFVTSAorCVZJUlRJT19CTEtfRl9TQ1NJLCBWSVJUSU9fQkxLX0ZfRkxVU0gKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKaW5kZXggNzFkMWI5Yi4uNjE0ZGE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwpAQCAtMzQxMiw3ICszNDEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjZHJvbV9zeXNjdGxfaW5mbyhjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCitzdGF0aWMgaW50IGNkcm9tX3N5c2N0bF9pbmZvKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgcG9zOwpAQCAtMzQ4OSw3ICszNDg5LDcgQEAKIAkJZ290byBkb25lOwogZG9pdDoKIAltdXRleF91bmxvY2soJmNkcm9tX211dGV4KTsKLQlyZXR1cm4gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiBkb25lOgogCXByaW50ayhLRVJOX0lORk8gImNkcm9tOiBpbmZvIGJ1ZmZlciB0b28gc21hbGxcbiIpOwogCWdvdG8gZG9pdDsKQEAgLTM1MjUsMTIgKzM1MjUsMTIgQEAKIAltdXRleF91bmxvY2soJmNkcm9tX211dGV4KTsKIH0KIAotc3RhdGljIGludCBjZHJvbV9zeXNjdGxfaGFuZGxlcihjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCitzdGF0aWMgaW50IGNkcm9tX3N5c2N0bF9oYW5kbGVyKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCiAJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IHJldDsKIAkKLQlyZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJaWYgKHdyaXRlKSB7CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IDZhMDY5MTMuLjZhYWQ5OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC0zMjMsNyArMzIzLDcgQEAKIAogY29uZmlnIFNYCiAJdHJpc3RhdGUgIlNwZWNpYWxpeCBTWCAoYW5kIFNJKSBjYXJkIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgKFBDSSB8fCBFSVNBIHx8IElTQSkKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiAoUENJIHx8IEVJU0EgfHwgSVNBKSAmJiBCUk9LRU4KIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgU1ggYW5kIFNJIG11bHRpcG9ydCBzZXJpYWwgY2FyZHMuCiAJICBQbGVhc2UgcmVhZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NlcmlhbC9zeC50eHQ+IGZvciBkZXRhaWxzLgpAQCAtMzM0LDcgKzMzNCw3IEBACiAKIGNvbmZpZyBSSU8KIAl0cmlzdGF0ZSAiU3BlY2lhbGl4IFJJTyBzeXN0ZW0gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIEJST0tFTgogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBTcGVjaWFsaXggUklPLCBhIHNtYXJ0IHNlcmlhbCBjYXJkIHdoaWNoCiAJICBkcml2ZXMgYW4gb3V0Ym9hcmQgYm94IHRoYXQgY2FuIHN1cHBvcnQgdXAgdG8gMTI4IHBvcnRzLiAgUHJvZHVjdApAQCAtMzk1LDcgKzM5NSw3IEBACiAKIGNvbmZpZyBBMjIzMgogCXRyaXN0YXRlICJDb21tb2RvcmUgQTIyMzIgc2VyaWFsIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgWk9SUk8gJiYgQlJPS0VOX09OX1NNUAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFpPUlJPICYmIEJST0tFTgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIHN1cHBvcnRzIHRoZSAyMjMyIDctcG9ydCBzZXJpYWwgY2FyZCBzaGlwcGVkIHdpdGggdGhlCiAJICBBbWlnYSAyMDAwIGFuZCBvdGhlciBab3Jyby1idXMgbWFjaGluZXMsIGRhdGluZyBmcm9tIDE5ODkuICBBdApAQCAtMTA4Nyw2ICsxMDg3LDE0IEBACiAJICBUaGUgbW10aW1lciBkZXZpY2UgYWxsb3dzIGRpcmVjdCB1c2Vyc3BhY2UgYWNjZXNzIHRvIHRoZQogCSAgQWx0aXggc3lzdGVtIHRpbWVyLgogCitjb25maWcgVVZfTU1USU1FUgorCXRyaXN0YXRlICJVVl9NTVRJTUVSIE1lbW9yeSBtYXBwZWQgUlRDIGZvciBTR0kgVVYiCisJZGVwZW5kcyBvbiBYODZfVVYKKwlkZWZhdWx0IG0KKwloZWxwCisJICBUaGUgdXZfbW10aW1lciBkZXZpY2UgYWxsb3dzIGRpcmVjdCB1c2Vyc3BhY2UgYWNjZXNzIHRvIHRoZQorCSAgVVYgc3lzdGVtIHRpbWVyLgorCiBzb3VyY2UgImRyaXZlcnMvY2hhci90cG0vS2NvbmZpZyIKIAogY29uZmlnIFRFTENMT0NLCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggNjZmNzc5YS4uMTlhNzlkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtNTgsNiArNTgsNyBAQAogb2JqLSQoQ09ORklHX1NHSV9TTlNDKQkJKz0gc25zYy5vIHNuc2NfZXZlbnQubwogb2JqLSQoQ09ORklHX01TUEVDKQkJKz0gbXNwZWMubwogb2JqLSQoQ09ORklHX01NVElNRVIpCQkrPSBtbXRpbWVyLm8KK29iai0kKENPTkZJR19VVl9NTVRJTUVSKQkrPSB1dl9tbXRpbWVyLm8KIG9iai0kKENPTkZJR19WSU9UQVBFKQkJKz0gdmlvdGFwZS5vCiBvYmotJChDT05GSUdfSFZDUykJCSs9IGh2Y3Mubwogb2JqLSQoQ09ORklHX0lCTV9CU1IpCQkrPSBic3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hZ3AuaCBiL2RyaXZlcnMvY2hhci9hZ3AvYWdwLmgKaW5kZXggZDZmMzZjMC4uODcwZjEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hZ3AuaAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FncC5oCkBAIC0xMzEsNyArMTMxLDcgQEAKIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgewogCWNvbnN0IHN0cnVjdCBhZ3BfdmVyc2lvbiAqdmVyc2lvbjsKIAljb25zdCBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgKmRyaXZlcjsKLQlzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wczsKKwljb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wczsKIAl2b2lkICpwcmV2aW91c19zaXplOwogCXZvaWQgKmN1cnJlbnRfc2l6ZTsKIAl2b2lkICpkZXZfcHJpdmF0ZV9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbHBoYS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMKaW5kZXggNWVhNGRhOC4uZGQ4NGFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hbHBoYS1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCkBAIC00MCw3ICs0MCw3IEBACiAJeyAwLCAwLCAwIH0sIC8qIGZpbGxlZCBpbiBieSBhbHBoYV9jb3JlX2FncF9zZXR1cCAqLwogfTsKIAotc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGFscGhhX2NvcmVfYWdwX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgYWxwaGFfY29yZV9hZ3Bfdm1fb3BzID0gewogCS5mYXVsdCA9IGFscGhhX2NvcmVfYWdwX3ZtX2ZhdWx0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKaW5kZXggMTU0MGU2OS4uNDA2ODQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCkBAIC00Niw2ICs0Niw4IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUTM1X0lHICAgICAgICAgIDB4MjlCMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1EzM19IQiAgICAgICAgICAweDI5RDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9RMzNfSUcgICAgICAgICAgMHgyOUQyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQjQzX0hCICAgICAgICAgIDB4MkU0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0I0M19JRyAgICAgICAgICAweDJFNDIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0hCICAgICAgICAgMHgyQTQwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfR000NV9JRyAgICAgICAgIDB4MkE0MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRF9FX0hCICAgICAgICAweDJFMDAKQEAgLTkxLDYgKzkzLDcgQEAKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSEIgfHwgXAogCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0dNNDVfSEIgfHwgXAogCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0MV9IQiB8fCBcCisJCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfQjQzX0hCIHx8IFwKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19EX0hCIHx8IFwKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NX0hCIHx8IFwKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NQV9IQikKQEAgLTgwNCwyMyArODA3LDM5IEBACiAJaWYgKCFpbnRlbF9wcml2YXRlLmk4eHhfcGFnZSkKIAkJcmV0dXJuOwogCi0JLyogbWFrZSBwYWdlIHVuY2FjaGVkICovCi0JbWFwX3BhZ2VfaW50b19hZ3AoaW50ZWxfcHJpdmF0ZS5pOHh4X3BhZ2UpOwotCiAJaW50ZWxfcHJpdmF0ZS5pOHh4X2ZsdXNoX3BhZ2UgPSBrbWFwKGludGVsX3ByaXZhdGUuaTh4eF9wYWdlKTsKIAlpZiAoIWludGVsX3ByaXZhdGUuaTh4eF9mbHVzaF9wYWdlKQogCQlpbnRlbF9pODMwX2ZpbmlfZmx1c2goKTsKIH0KIAorc3RhdGljIHZvaWQKK2RvX3diaW52ZCh2b2lkICpudWxsKQoreworCXdiaW52ZCgpOworfQorCisvKiBUaGUgY2hpcHNldF9mbHVzaCBpbnRlcmZhY2UgbmVlZHMgdG8gZ2V0IGRhdGEgdGhhdCBoYXMgYWxyZWFkeSBiZWVuCisgKiBmbHVzaGVkIG91dCBvZiB0aGUgQ1BVIGFsbCB0aGUgd2F5IG91dCB0byBtYWluIG1lbW9yeSwgYmVjYXVzZSB0aGUgR1BVCisgKiBkb2Vzbid0IHNub29wIHRob3NlIGJ1ZmZlcnMuCisgKgorICogVGhlIDh4eCBzZXJpZXMgZG9lc24ndCBoYXZlIHRoZSBzYW1lIGxvdmVseSBpbnRlcmZhY2UgZm9yIGZsdXNoaW5nIHRoZQorICogY2hpcHNldCB3cml0ZSBidWZmZXJzIHRoYXQgdGhlIGxhdGVyIGNoaXBzIGRvLiBBY2NvcmRpbmcgdG8gdGhlIDg2NQorICogc3BlY3MsIGl0J3MgNjQgb2N0d29yZHMsIG9yIDFLQi4gIFNvLCB0byBnZXQgdGhvc2UgcHJldmlvdXMgdGhpbmdzIGluCisgKiB0aGF0IGJ1ZmZlciBvdXQsIHdlIGp1c3QgZmlsbCAxS0IgYW5kIGNsZmx1c2ggaXQgb3V0LCBvbiB0aGUgYXNzdW1wdGlvbgorICogdGhhdCBpdCdsbCBwdXNoIHdoYXRldmVyIHdhcyBpbiB0aGVyZSBvdXQuICBJdCBhcHBlYXJzIHRvIHdvcmsuCisgKi8KIHN0YXRpYyB2b2lkIGludGVsX2k4MzBfY2hpcHNldF9mbHVzaChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCiB7CiAJdW5zaWduZWQgaW50ICpwZyA9IGludGVsX3ByaXZhdGUuaTh4eF9mbHVzaF9wYWdlOwotCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPSAyKQotCQkqKHBnICsgaSkgPSBpOworCW1lbXNldChwZywgMCwgMTAyNCk7CiAKLQl3bWIoKTsKKwlpZiAoY3B1X2hhc19jbGZsdXNoKSB7CisJCWNsZmx1c2hfY2FjaGVfcmFuZ2UocGcsIDEwMjQpOworCX0gZWxzZSB7CisJCWlmIChvbl9lYWNoX2NwdShkb193YmludmQsIE5VTEwsIDEpICE9IDApCisJCQlwcmludGsoS0VSTl9FUlIgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBjYWNoZSBmbHVzaC5cbiIpOworCX0KIH0KIAogLyogVGhlIGludGVsIGk4MzAgYXV0b21hdGljYWxseSBpbml0aWFsaXplcyB0aGUgYWdwIGFwZXJ0dXJlIGR1cmluZyBQT1NULgpAQCAtMTM0MSw2ICsxMzYwLDcgQEAKIAljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfUTQ1X0hCOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSEI6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0MV9IQjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQjQzX0hCOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19EX0hCOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NX0hCOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NQV9IQjoKQEAgLTIzMzUsNiArMjM1NSw4IEBACiAJICAgICJRNDUvUTQzIiwgTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSUcsIDAsCiAJICAgICJHNDUvRzQzIiwgTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0I0M19IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9CNDNfSUcsIDAsCisJICAgICJCNDMiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfRzQxX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0MV9JRywgMCwKIAkgICAgIkc0MSIsIE5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19EX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX0RfSUcsIDAsCkBAIC0yNTM1LDYgKzI1NTcsNyBAQAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfUTQ1X0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9IQiksCiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9HNDFfSEIpLAorCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfQjQzX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRE5HX0RfSEIpLAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfSUdETkdfTV9IQiksCiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9JR0ROR19NQV9IQiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3BhcmlzYy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCmluZGV4IDYwYWI3NTEuLjFjMTI5MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAkuY29uZmlndXJlCQk9IHBhcmlzY19hZ3BfY29uZmlndXJlLAogCS5mZXRjaF9zaXplCQk9IHBhcmlzY19hZ3BfZmV0Y2hfc2l6ZSwKIAkudGxiX2ZsdXNoCQk9IHBhcmlzY19hZ3BfdGxiZmx1c2gsCi0JLm1hc2tfbWVtb3J5CQk9IHBhcmlzY19hZ3BfcGFnZV9tYXNrX21lbW9yeSwKKwkubWFza19tZW1vcnkJCT0gcGFyaXNjX2FncF9tYXNrX21lbW9yeSwKIAkubWFza3MJCQk9IHBhcmlzY19hZ3BfbWFza3MsCiAJLmFncF9lbmFibGUJCT0gcGFyaXNjX2FncF9lbmFibGUsCiAJLmNhY2hlX2ZsdXNoCQk9IGdsb2JhbF9jYWNoZV9mbHVzaCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMgYi9kcml2ZXJzL2NoYXIvYXBtLWVtdWxhdGlvbi5jCmluZGV4IGFhY2E0MDIuLjRmNTY4Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL2FwbS1lbXVsYXRpb24uYwpAQCAtMzkzLDcgKzM5Myw3IEBACiAJcmV0dXJuIGFzID8gMCA6IC1FTk9NRU07CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFwbV9iaW9zX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhcG1fYmlvc19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkucmVhZAkJPSBhcG1fcmVhZCwKIAkucG9sbAkJPSBhcG1fcG9sbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKaW5kZXggNzNhMDc2NS4uZmUyY2IyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKKysrIGIvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9iZmluLW90cC5jIGIvZHJpdmVycy9jaGFyL2JmaW4tb3RwLmMKaW5kZXggMGEwMTMyOS4uODM2ZDRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2JmaW4tb3RwLmMKKysrIGIvZHJpdmVycy9jaGFyL2JmaW4tb3RwLmMKQEAgLTEsOCArMSw3IEBACiAvKgogICogQmxhY2tmaW4gT24tQ2hpcCBPVFAgTWVtb3J5IEludGVyZmFjZQotICogIFN1cHBvcnRzIEJGNTJ4L0JGNTR4CiAgKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KICAqCkBAIC0xNyw4ICsxNiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxtdGQvbXRkLWFiaS5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2Jmcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2RlZmluZSBzdGFtcChmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKCIlczolaTogIiBmbXQgIlxuIiwgX19mdW5jX18sIF9fTElORV9fLCAjIyBhcmdzKQpAQCAtMzAsMzkgKzMxLDYgQEAKIAogc3RhdGljIERFRklORV9NVVRFWChiZmluX290cF9sb2NrKTsKIAotLyogT1RQIEJvb3QgUk9NIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBfQk9PVFJPTV9PVFBfQ09NTUFORCAgICAgICAgICAgMHhFRjAwMDAxOAotI2RlZmluZSBfQk9PVFJPTV9PVFBfUkVBRCAgICAgICAgICAgICAgMHhFRjAwMDAxQQotI2RlZmluZSBfQk9PVFJPTV9PVFBfV1JJVEUgICAgICAgICAgICAgMHhFRjAwMDAxQwotCi1zdGF0aWMgdTMyICgqIGNvbnN0IG90cF9jb21tYW5kKSh1MzIgY29tbWFuZCwgdTMyIHZhbHVlKSA9ICh2b2lkICopX0JPT1RST01fT1RQX0NPTU1BTkQ7Ci1zdGF0aWMgdTMyICgqIGNvbnN0IG90cF9yZWFkKSh1MzIgcGFnZSwgdTMyIGZsYWdzLCB1NjQgKnBhZ2VfY29udGVudCkgPSAodm9pZCAqKV9CT09UUk9NX09UUF9SRUFEOwotc3RhdGljIHUzMiAoKiBjb25zdCBvdHBfd3JpdGUpKHUzMiBwYWdlLCB1MzIgZmxhZ3MsIHU2NCAqcGFnZV9jb250ZW50KSA9ICh2b2lkICopX0JPT1RST01fT1RQX1dSSVRFOwotCi0vKiBvdHBfY29tbWFuZCgpOiBkZWZpbmVzIGZvciAiY29tbWFuZCIgKi8KLSNkZWZpbmUgT1RQX0lOSVQgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBPVFBfQ0xPU0UgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qIG90cF97cmVhZCx3cml0ZX0oKTogZGVmaW5lcyBmb3IgImZsYWdzIiAqLwotI2RlZmluZSBPVFBfTE9XRVJfSEFMRiAgICAgICAweDAwMDAwMDAwIC8qIHNlbGVjdCB1cHBlci9sb3dlciA2NC1iaXQgaGFsZiAoYml0IDApICovCi0jZGVmaW5lIE9UUF9VUFBFUl9IQUxGICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgT1RQX05PX0VDQyAgICAgICAgICAgMHgwMDAwMDAxMCAvKiBkbyBub3QgdXNlIEVDQyAqLwotI2RlZmluZSBPVFBfTE9DSyAgICAgICAgICAgICAweDAwMDAwMDIwIC8qIHNldHMgcGFnZSBwcm90ZWN0aW9uIGJpdCBmb3IgcGFnZSAqLwotI2RlZmluZSBPVFBfQUNDRVNTX1JFQUQgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIE9UUF9BQ0NFU1NfUkVBRFdSSVRFIDB4MDAwMDIwMDAKLQotLyogUmV0dXJuIHZhbHVlcyBmb3IgYWxsIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBPVFBfU1VDQ0VTUyAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIE9UUF9NQVNURVJfRVJST1IgICAgIDB4MDAxCi0jZGVmaW5lIE9UUF9XUklURV9FUlJPUiAgICAgIDB4MDAzCi0jZGVmaW5lIE9UUF9SRUFEX0VSUk9SICAgICAgIDB4MDA1Ci0jZGVmaW5lIE9UUF9BQ0NfVklPX0VSUk9SICAgIDB4MDA5Ci0jZGVmaW5lIE9UUF9EQVRBX01VTFRfRVJST1IgIDB4MDExCi0jZGVmaW5lIE9UUF9FQ0NfTVVMVF9FUlJPUiAgIDB4MDIxCi0jZGVmaW5lIE9UUF9QUkVWX1dSX0VSUk9SICAgIDB4MDQxCi0jZGVmaW5lIE9UUF9EQVRBX1NCX1dBUk4gICAgIDB4MTAwCi0jZGVmaW5lIE9UUF9FQ0NfU0JfV0FSTiAgICAgIDB4MjAwCi0KIC8qKgogICoJYmZpbl9vdHBfcmVhZCAtIFJlYWQgT1RQIHBhZ2VzCiAgKgpAQCAtODYsOSArNTQsMTEgQEAKIAlwYWdlID0gKnBvcyAvIChzaXplb2YodTY0KSAqIDIpOwogCXdoaWxlIChieXRlc19kb25lIDwgY291bnQpIHsKIAkJZmxhZ3MgPSAoKnBvcyAlIChzaXplb2YodTY0KSAqIDIpID8gT1RQX1VQUEVSX0hBTEYgOiBPVFBfTE9XRVJfSEFMRik7Ci0JCXN0YW1wKCJwcm9jZXNzaW5nIHBhZ2UgJWkgKCVzKSIsIHBhZ2UsIChmbGFncyA9PSBPVFBfVVBQRVJfSEFMRiA/ICJ1cHBlciIgOiAibG93ZXIiKSk7Ci0JCXJldCA9IG90cF9yZWFkKHBhZ2UsIGZsYWdzLCAmY29udGVudCk7CisJCXN0YW1wKCJwcm9jZXNzaW5nIHBhZ2UgJWkgKDB4JXg6JXMpIiwgcGFnZSwgZmxhZ3MsCisJCQkoZmxhZ3MgJiBPVFBfVVBQRVJfSEFMRiA/ICJ1cHBlciIgOiAibG93ZXIiKSk7CisJCXJldCA9IGJmcm9tX090cFJlYWQocGFnZSwgZmxhZ3MsICZjb250ZW50KTsKIAkJaWYgKHJldCAmIE9UUF9NQVNURVJfRVJST1IpIHsKKwkJCXN0YW1wKCJlcnJvciBmcm9tIG90cDogMHgleCIsIHJldCk7CiAJCQlieXRlc19kb25lID0gLUVJTzsKIAkJCWJyZWFrOwogCQl9CkBAIC05Niw3ICs2Niw3IEBACiAJCQlieXRlc19kb25lID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChmbGFncyA9PSBPVFBfVVBQRVJfSEFMRikKKwkJaWYgKGZsYWdzICYgT1RQX1VQUEVSX0hBTEYpCiAJCQkrK3BhZ2U7CiAJCWJ5dGVzX2RvbmUgKz0gc2l6ZW9mKGNvbnRlbnQpOwogCQkqcG9zICs9IHNpemVvZihjb250ZW50KTsKQEAgLTEwOCwxNCArNzgsNTMgQEAKIH0KIAogI2lmZGVmIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUKK3N0YXRpYyBib29sIGFsbG93X3dyaXRlczsKKwogLyoqCi0gKgliZmluX290cF93cml0ZSAtIFdyaXRlIE9UUCBwYWdlcworICoJYmZpbl9vdHBfaW5pdF90aW1pbmcgLSBzZXR1cCBPVFAgdGltaW5nIHBhcmFtZXRlcnMKKyAqCisgKglSZXF1aXJlZCBiZWZvcmUgZG9pbmcgYW55IHdyaXRlIG9wZXJhdGlvbi4gIEFsZ29yaXRobXMgZnJvbSBIUk0uCisgKi8KK3N0YXRpYyB1MzIgYmZpbl9vdHBfaW5pdF90aW1pbmcodm9pZCkKK3sKKwl1MzIgdHAxLCB0cDIsIHRwMywgdGltaW5nOworCisJdHAxID0gZ2V0X3NjbGsoKSAvIDEwMDAwMDA7CisJdHAyID0gKDIgKiBnZXRfc2NsaygpIC8gMTAwMDAwMDApIDw8IDg7CisJdHAzID0gKDB4MTQwMSkgPDwgMTU7CisJdGltaW5nID0gdHAxIHwgdHAyIHwgdHAzOworCWlmIChiZnJvbV9PdHBDb21tYW5kKE9UUF9JTklULCB0aW1pbmcpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0aW1pbmc7Cit9CisKKy8qKgorICoJYmZpbl9vdHBfZGVpbml0X3RpbWluZyAtIHNldCB0aW1pbmdzIHRvIG9ubHkgYWxsb3cgcmVhZHMKKyAqCisgKglTaG91bGQgYmUgY2FsbGVkIGFmdGVyIGFsbCB3cml0ZXMgYXJlIGRvbmUuCisgKi8KK3N0YXRpYyB2b2lkIGJmaW5fb3RwX2RlaW5pdF90aW1pbmcodTMyIHRpbWluZykKK3sKKwkvKiBtYXNrIGJpdHMgWzMxOjE1XSBzbyB0aGF0IGFueSBhdHRlbXB0cyB0byB3cml0ZSBmYWlsICovCisJYmZyb21fT3RwQ29tbWFuZChPVFBfQ0xPU0UsIDApOworCWJmcm9tX090cENvbW1hbmQoT1RQX0lOSVQsIHRpbWluZyAmIH4oLTEgPDwgMTUpKTsKKwliZnJvbV9PdHBDb21tYW5kKE9UUF9DTE9TRSwgMCk7Cit9CisKKy8qKgorICoJYmZpbl9vdHBfd3JpdGUgLSB3cml0ZSBPVFAgcGFnZXMKICAqCiAgKglBbGwgd3JpdGVzIG11c3QgYmUgaW4gaGFsZiBwYWdlIGNodW5rcyAoaGFsZiBwYWdlID09IDY0IGJpdHMpLgogICovCiBzdGF0aWMgc3NpemVfdCBiZmluX290cF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RhbXBpdCgpOworCXNzaXplX3QgYnl0ZXNfZG9uZTsKKwl1MzIgdGltaW5nLCBwYWdlLCBiYXNlX2ZsYWdzLCBmbGFncywgcmV0OworCXU2NCBjb250ZW50OworCisJaWYgKCFhbGxvd193cml0ZXMpCisJCXJldHVybiAtRUFDQ0VTOwogCiAJaWYgKGNvdW50ICUgc2l6ZW9mKHU2NCkpCiAJCXJldHVybiAtRU1TR1NJWkU7CkBAIC0xMjMsMjAgKzEzMiw5NiBAQAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmJmaW5fb3RwX2xvY2spKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JLyogbmVlZCBvdHBfaW5pdCgpIGRvY3VtZW50YXRpb24gYmVmb3JlIHRoaXMgY2FuIGJlIGltcGxlbWVudGVkICovCisJc3RhbXBpdCgpOworCisJdGltaW5nID0gYmZpbl9vdHBfaW5pdF90aW1pbmcoKTsKKwlpZiAodGltaW5nID09IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZiZmluX290cF9sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJYmFzZV9mbGFncyA9IE9UUF9DSEVDS19GT1JfUFJFVl9XUklURTsKKworCWJ5dGVzX2RvbmUgPSAwOworCXBhZ2UgPSAqcG9zIC8gKHNpemVvZih1NjQpICogMik7CisJd2hpbGUgKGJ5dGVzX2RvbmUgPCBjb3VudCkgeworCQlmbGFncyA9IGJhc2VfZmxhZ3MgfCAoKnBvcyAlIChzaXplb2YodTY0KSAqIDIpID8gT1RQX1VQUEVSX0hBTEYgOiBPVFBfTE9XRVJfSEFMRik7CisJCXN0YW1wKCJwcm9jZXNzaW5nIHBhZ2UgJWkgKDB4JXg6JXMpIGZyb20gJXAiLCBwYWdlLCBmbGFncywKKwkJCShmbGFncyAmIE9UUF9VUFBFUl9IQUxGID8gInVwcGVyIiA6ICJsb3dlciIpLCBidWZmICsgYnl0ZXNfZG9uZSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY29udGVudCwgYnVmZiArIGJ5dGVzX2RvbmUsIHNpemVvZihjb250ZW50KSkpIHsKKwkJCWJ5dGVzX2RvbmUgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gYmZyb21fT3RwV3JpdGUocGFnZSwgZmxhZ3MsICZjb250ZW50KTsKKwkJaWYgKHJldCAmIE9UUF9NQVNURVJfRVJST1IpIHsKKwkJCXN0YW1wKCJlcnJvciBmcm9tIG90cDogMHgleCIsIHJldCk7CisJCQlieXRlc19kb25lID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmbGFncyAmIE9UUF9VUFBFUl9IQUxGKQorCQkJKytwYWdlOworCQlieXRlc19kb25lICs9IHNpemVvZihjb250ZW50KTsKKwkJKnBvcyArPSBzaXplb2YoY29udGVudCk7CisJfQorCisJYmZpbl9vdHBfZGVpbml0X3RpbWluZyh0aW1pbmcpOwogCiAJbXV0ZXhfdW5sb2NrKCZiZmluX290cF9sb2NrKTsKIAorCXJldHVybiBieXRlc19kb25lOworfQorCitzdGF0aWMgbG9uZyBiZmluX290cF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdGFtcGl0KCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1RQTE9DSzogeworCQl1MzIgdGltaW5nOworCQlpbnQgcmV0ID0gLUVJTzsKKworCQlpZiAoIWFsbG93X3dyaXRlcykKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmJmaW5fb3RwX2xvY2spKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCQl0aW1pbmcgPSBiZmluX290cF9pbml0X3RpbWluZygpOworCQlpZiAodGltaW5nKSB7CisJCQl1MzIgb3RwX3Jlc3VsdCA9IGJmcm9tX090cFdyaXRlKGFyZywgT1RQX0xPQ0ssIE5VTEwpOworCQkJc3RhbXAoImxvY2tpbmcgcGFnZSAlbHUgcmVzdWx0ZWQgaW4gMHgleCIsIGFyZywgb3RwX3Jlc3VsdCk7CisJCQlpZiAoIShvdHBfcmVzdWx0ICYgT1RQX01BU1RFUl9FUlJPUikpCisJCQkJcmV0ID0gMDsKKworCQkJYmZpbl9vdHBfZGVpbml0X3RpbWluZyh0aW1pbmcpOworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZiZmluX290cF9sb2NrKTsKKworCQlyZXR1cm4gcmV0OworCX0KKworCWNhc2UgTUVNTE9DSzoKKwkJYWxsb3dfd3JpdGVzID0gZmFsc2U7CisJCXJldHVybiAwOworCisJY2FzZSBNRU1VTkxPQ0s6CisJCWFsbG93X3dyaXRlcyA9IHRydWU7CisJCXJldHVybiAwOworCX0KKwogCXJldHVybiAtRUlOVkFMOwogfQogI2Vsc2UKICMgZGVmaW5lIGJmaW5fb3RwX3dyaXRlIE5VTEwKKyMgZGVmaW5lIGJmaW5fb3RwX2lvY3RsIE5VTEwKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiZmluX290cF9mb3BzID0gewotCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAotCS5yZWFkICAgICA9IGJmaW5fb3RwX3JlYWQsCi0JLndyaXRlICAgID0gYmZpbl9vdHBfd3JpdGUsCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiZmluX290cF9mb3BzID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS51bmxvY2tlZF9pb2N0bCA9IGJmaW5fb3RwX2lvY3RsLAorCS5yZWFkICAgICAgICAgICA9IGJmaW5fb3RwX3JlYWQsCisJLndyaXRlICAgICAgICAgID0gYmZpbl9vdHBfd3JpdGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYmZpbl9vdHBfbWlzY19kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCmluZGV4IGRmNTAzOGIuLjQyNTQ0NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCisrKyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCkBAIC0zMzU0LDcgKzMzNTQsNyBAQAogCQkJY29udGludWU7CiAJCX0KICNpZmRlZiBNT0RVTEUKLQkJaWYgKGlzcGFyYW0gJiYgaXJxW2ldKQorCQlpZiAoaXNwYXJhbSAmJiBpIDwgTlJfQ0FSRFMgJiYgaXJxW2ldKQogCQkJY3lfaXNhX2lycSA9IGlycVtpXTsKIAkJZWxzZQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHRsay5jIGIvZHJpdmVycy9jaGFyL2R0bGsuYwppbmRleCA1MmUwNjU4Li4wNDVjOTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHRsay5jCisrKyBiL2RyaXZlcnMvY2hhci9kdGxrLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiBmb3IgLUVCVVNZICovCiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIGZvciByZXF1ZXN0X3JlZ2lvbiAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIGZvciBsb29wc19wZXJfamlmZnkgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CS8qIGN5Y2xlX2tlcm5lbF9sb2NrKCkgKi8KICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIGZvciBpbmJfcCwgb3V0Yl9wLCBpbmIsIG91dGIsIGV0Yy4gKi8KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBmb3IgZ2V0X3VzZXIsIGV0Yy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lcGNhLmMgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCmluZGV4IDlkNTg5ZTMuLmRkZTUxMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9lcGNhLmMKKysrIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwppbmRleCA5ZTRlNTY5Li5kNDAwY2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jIGIvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jCmluZGV4IGFhYzA5ODUuLjMxZTdjOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9nZW5ydGMuYworKysgYi9kcml2ZXJzL2NoYXIvZ2VucnRjLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNkZWZpbmUgUlRDX1ZFUlNJT04JIjEuMDciCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHBldC5jIGIvZHJpdmVycy9jaGFyL2hwZXQuYwppbmRleCA0YTlmMzQ5Li43MGE3NzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHBldC5jCisrKyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKQEAgLTE2Niw5ICsxNjYsOCBAQAogCQl1bnNpZ25lZCBsb25nIG0sIHQ7CiAKIAkJdCA9IGRldnAtPmhkX2lyZXFmcmVxOwotCQltID0gcmVhZF9jb3VudGVyKCZkZXZwLT5oZF9ocGV0LT5ocGV0X21jKTsKLQkJd3JpdGVfY291bnRlcih0ICsgbSArIGRldnAtPmhkX2hwZXRzLT5ocF9kZWx0YSwKLQkJCSAgICAgICZkZXZwLT5oZF90aW1lci0+aHBldF9jb21wYXJlKTsKKwkJbSA9IHJlYWRfY291bnRlcigmZGV2cC0+aGRfdGltZXItPmhwZXRfY29tcGFyZSk7CisJCXdyaXRlX2NvdW50ZXIodCArIG0sICZkZXZwLT5oZF90aW1lci0+aHBldF9jb21wYXJlKTsKIAl9CiAKIAlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX1NIQVJFRF9JUlEpCkBAIC01MDQsMjEgKzUwMywyNSBAQAogCWcgPSB2IHwgVG5fMzJNT0RFX0NORl9NQVNLIHwgVG5fSU5UX0VOQl9DTkZfTUFTSzsKIAogCWlmIChkZXZwLT5oZF9mbGFncyAmIEhQRVRfUEVSSU9ESUMpIHsKLQkJd3JpdGVfY291bnRlcih0LCAmdGltZXItPmhwZXRfY29tcGFyZSk7CiAJCWcgfD0gVG5fVFlQRV9DTkZfTUFTSzsKLQkJdiB8PSBUbl9UWVBFX0NORl9NQVNLOwotCQl3cml0ZXEodiwgJnRpbWVyLT5ocGV0X2NvbmZpZyk7Ci0JCXYgfD0gVG5fVkFMX1NFVF9DTkZfTUFTSzsKKwkJdiB8PSBUbl9UWVBFX0NORl9NQVNLIHwgVG5fVkFMX1NFVF9DTkZfTUFTSzsKIAkJd3JpdGVxKHYsICZ0aW1lci0+aHBldF9jb25maWcpOwogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKLQkJLyogTk9URTogIHdoYXQgd2UgbW9kaWZ5IGhlcmUgaXMgYSBoaWRkZW4gYWNjdW11bGF0b3IKKwkJLyoKKwkJICogTk9URTogRmlyc3Qgd2UgbW9kaWZ5IHRoZSBoaWRkZW4gYWNjdW11bGF0b3IKIAkJICogcmVnaXN0ZXIgc3VwcG9ydGVkIGJ5IHBlcmlvZGljLWNhcGFibGUgY29tcGFyYXRvcnMuCiAJCSAqIFdlIG5ldmVyIHdhbnQgdG8gbW9kaWZ5IHRoZSAoc2luZ2xlKSBjb3VudGVyOyB0aGF0Ci0JCSAqIHdvdWxkIGFmZmVjdCBhbGwgdGhlIGNvbXBhcmF0b3JzLgorCQkgKiB3b3VsZCBhZmZlY3QgYWxsIHRoZSBjb21wYXJhdG9ycy4gVGhlIHZhbHVlIHdyaXR0ZW4KKwkJICogaXMgdGhlIGNvdW50ZXIgdmFsdWUgd2hlbiB0aGUgZmlyc3QgaW50ZXJydXB0IGlzIGR1ZS4KIAkJICovCiAJCW0gPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOwogCQl3cml0ZV9jb3VudGVyKHQgKyBtICsgaHBldHAtPmhwX2RlbHRhLCAmdGltZXItPmhwZXRfY29tcGFyZSk7CisJCS8qCisJCSAqIFRoZW4gd2UgbW9kaWZ5IHRoZSBjb21wYXJhdG9yLCBpbmRpY2F0aW5nIHRoZSBwZXJpb2QKKwkJICogZm9yIHN1YnNlcXVlbnQgaW50ZXJydXB0LgorCQkgKi8KKwkJd3JpdGVfY291bnRlcih0LCAmdGltZXItPmhwZXRfY29tcGFyZSk7CiAJfSBlbHNlIHsKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQltID0gcmVhZF9jb3VudGVyKCZocGV0LT5ocGV0X21jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKaW5kZXggMjVjZTE1Yi4uYTYzMmYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaHZjX3BvbGwpOwogCiAvKioKLSAqIGh2Y19yZXNpemUoKSAtIFVwZGF0ZSB0ZXJtaW5hbCB3aW5kb3cgc2l6ZSBpbmZvcm1hdGlvbi4KKyAqIF9faHZjX3Jlc2l6ZSgpIC0gVXBkYXRlIHRlcm1pbmFsIHdpbmRvdyBzaXplIGluZm9ybWF0aW9uLgogICogQGhwOgkJSFZDIGNvbnNvbGUgcG9pbnRlcgogICogQHdzOgkJVGVybWluYWwgd2luZG93IHNpemUgc3RydWN0dXJlCiAgKgpAQCAtNjg3LDEyICs2ODcsMTIgQEAKICAqCiAgKiBMb2NraW5nOglMb2NraW5nIGZyZWU7IHRoZSBmdW5jdGlvbiBNVVNUIGJlIGNhbGxlZCBob2xkaW5nIGhwLT5sb2NrCiAgKi8KLXZvaWQgaHZjX3Jlc2l6ZShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIHN0cnVjdCB3aW5zaXplIHdzKQordm9pZCBfX2h2Y19yZXNpemUoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLCBzdHJ1Y3Qgd2luc2l6ZSB3cykKIHsKIAlocC0+d3MgPSB3czsKIAlzY2hlZHVsZV93b3JrKCZocC0+dHR5X3Jlc2l6ZSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChodmNfcmVzaXplKTsKK0VYUE9SVF9TWU1CT0xfR1BMKF9faHZjX3Jlc2l6ZSk7CiAKIC8qCiAgKiBUaGlzIGt0aHJlYWQgaXMgZWl0aGVyIHBvbGxpbmcgb3IgaW50ZXJydXB0IGRyaXZlbi4gIFRoaXMgaXMgZGV0ZXJtaW5lZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmggYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuaAppbmRleCAzYzg1ZDc4Li4xMDk1MGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuaAorKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBIVkNfQ09OU09MRV9ICiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBtYXggbnVtYmVyIG9mIGNvbnNvbGUgYWRhcHRlcnMgdGhhdCBjYW4vd2lsbCBiZSBmb3VuZCBhcwpAQCAtODgsNyArODksMTYgQEAKIHZvaWQgaHZjX2tpY2sodm9pZCk7CiAKIC8qIFJlc2l6ZSBodmMgdHR5IHRlcm1pbmFsIHdpbmRvdyAqLwotZXh0ZXJuIHZvaWQgaHZjX3Jlc2l6ZShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIHN0cnVjdCB3aW5zaXplIHdzKTsKK2V4dGVybiB2b2lkIF9faHZjX3Jlc2l6ZShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIHN0cnVjdCB3aW5zaXplIHdzKTsKKworc3RhdGljIGlubGluZSB2b2lkIGh2Y19yZXNpemUoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLCBzdHJ1Y3Qgd2luc2l6ZSB3cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJX19odmNfcmVzaXplKGhwLCB3cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKK30KIAogLyogZGVmYXVsdCBub3RpZmllciBmb3IgaXJxIGJhc2VkIG5vdGlmaWNhdGlvbiAqLwogZXh0ZXJuIGludCBub3RpZmllcl9hZGRfaXJxKHN0cnVjdCBodmNfc3RydWN0ICpocCwgaW50IGRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19pdWN2LmMgYi9kcml2ZXJzL2NoYXIvaHZjX2l1Y3YuYwppbmRleCAwZWNhYzdlLi5iOGE1ZDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2l1Y3YuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2l1Y3YuYwpAQCAtMjczLDcgKzI3Myw5IEBACiAJY2FzZSBNU0dfVFlQRV9XSU5TSVpFOgogCQlpZiAocmItPm1idWYtPmRhdGFsZW4gIT0gc2l6ZW9mKHN0cnVjdCB3aW5zaXplKSkKIAkJCWJyZWFrOwotCQlodmNfcmVzaXplKHByaXYtPmh2YywgKigoc3RydWN0IHdpbnNpemUgKikgcmItPm1idWYtPmRhdGEpKTsKKwkJLyogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBodmMgaXMgbG9ja2VkLCB3aGljaAorCQkgKiBpcyB0aGUgY2FzZSB3aGVuIGNhbGxlZCBmcm9tIGh2Y19pdWN2X2dldF9jaGFycygpICovCisJCV9faHZjX3Jlc2l6ZShwcml2LT5odmMsICooKHN0cnVjdCB3aW5zaXplICopIHJiLT5tYnVmLT5kYXRhKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBNU0dfVFlQRV9FUlJPUjoJLyogaWdub3JlZCAuLi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfeGVuLmMgYi9kcml2ZXJzL2NoYXIvaHZjX3hlbi5jCmluZGV4IGViYTk5OWYuLmE2ZWUzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfeGVuLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y194ZW4uYwpAQCAtNTUsNyArNTUsNyBAQAogCW5vdGlmeV9yZW1vdGVfdmlhX2V2dGNobih4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5kb21VLmV2dGNobik7CiB9CiAKLXN0YXRpYyBpbnQgd3JpdGVfY29uc29sZSh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgbGVuKQorc3RhdGljIGludCBfX3dyaXRlX2NvbnNvbGUoY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgeGVuY29uc19pbnRlcmZhY2UgKmludGYgPSB4ZW5jb25zX2ludGVyZmFjZSgpOwogCVhFTkNPTlNfUklOR19JRFggY29ucywgcHJvZDsKQEAgLTc2LDYgKzc2LDI5IEBACiAJcmV0dXJuIHNlbnQ7CiB9CiAKK3N0YXRpYyBpbnQgd3JpdGVfY29uc29sZSh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCWludCByZXQgPSBsZW47CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgd2hvbGUgYnVmZmVyIGlzIGVtaXR0ZWQsIHBvbGxpbmcgaWYKKwkgKiBuZWNlc3NhcnkuICBXZSBkb24ndCBldmVyIHdhbnQgdG8gcmVseSBvbiB0aGUgaHZjIGRhZW1vbgorCSAqIGJlY2F1c2UgdGhlIG1vc3QgaW50ZXJlc3RpbmcgY29uc29sZSBvdXRwdXQgaXMgd2hlbiB0aGUKKwkgKiBrZXJuZWwgaXMgY3JpcHBsZWQuCisJICovCisJd2hpbGUgKGxlbikgeworCQlpbnQgc2VudCA9IF9fd3JpdGVfY29uc29sZShkYXRhLCBsZW4pOworCQkKKwkJZGF0YSArPSBzZW50OworCQlsZW4gLT0gc2VudDsKKworCQlpZiAodW5saWtlbHkobGVuKSkKKwkJCUhZUEVSVklTT1Jfc2NoZWRfb3AoU0NIRURPUF95aWVsZCwgTlVMTCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCByZWFkX2NvbnNvbGUodWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgbGVuKQogewogCXN0cnVjdCB4ZW5jb25zX2ludGVyZmFjZSAqaW50ZiA9IHhlbmNvbnNfaW50ZXJmYWNlKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29tYXAtcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29tYXAtcm5nLmMKaW5kZXggMDBkZDNkZS4uMDZhYWQwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vbWFwLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vb21hcC1ybmcuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJaWYgKCFyZXMpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsCisJbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKIAkJCQkgcGRldi0+bmFtZSk7CiAJaWYgKG1lbSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FQlVTWTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCX0KIAogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtZW0pOwotCXJuZ19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlybmdfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoIXJuZ19iYXNlKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2lvcmVtYXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3ZpcnRpby1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlydGlvLXJuZy5jCmluZGV4IDk2Mjk2OGYuLjkxNTE1N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlydGlvLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlydGlvLXJuZy5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpby5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fcm5nLmg+CiAKIC8qIFRoZSBob3N0IHdpbGwgZmlsbCBhbnkgYnVmZmVyIHdlIGdpdmUgaXQgd2l0aCBzd2VldCwgc3dlZXQgcmFuZG9tbmVzcy4gIFdlCkBAIC0xMTcsNyArMTE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdmlydHJuZ19yZW1vdmUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdmlydHJuZ19yZW1vdmUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCiB7CiAJdmRldi0+Y29uZmlnLT5yZXNldCh2ZGV2KTsKIAlod3JuZ191bnJlZ2lzdGVyKCZ2aXJ0aW9faHdybmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYwppbmRleCA0MWZjMTFkLi42NTU0NWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwbWkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKaW5kZXggMDkwNTA3OS4uZWM1ZTNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCmluZGV4IGFiMmYzMzQuLjQwMjgzOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKQEAgLTE5LDYgKzE5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWVtLmMgYi9kcml2ZXJzL2NoYXIvbWVtLmMKaW5kZXggMGFlZGUxZC4uYTA3NGZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9tZW0uYwpAQCAtMzAxLDcgKzMwMSw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtbWFwX21lbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG1tYXBfbWVtX29wcyA9IHsKICNpZmRlZiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QKIAkuYWNjZXNzID0gZ2VuZXJpY19hY2Nlc3NfcGh5cwogI2VuZGlmCkBAIC02OTAsNyArNjkwLDcgQEAKIAogCQlpZiAoY2h1bmsgPiBQQUdFX1NJWkUpCiAJCQljaHVuayA9IFBBR0VfU0laRTsJLyogSnVzdCBmb3IgbGF0ZW5jeSByZWFzb25zICovCi0JCXVud3JpdHRlbiA9IGNsZWFyX3VzZXIoYnVmLCBjaHVuayk7CisJCXVud3JpdHRlbiA9IF9fY2xlYXJfdXNlcihidWYsIGNodW5rKTsKIAkJd3JpdHRlbiArPSBjaHVuayAtIHVud3JpdHRlbjsKIAkJaWYgKHVud3JpdHRlbikKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21zcGVjLmMgYi9kcml2ZXJzL2NoYXIvbXNwZWMuYwppbmRleCAzMGYwOTVhLi4xOTk3MjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXNwZWMuYworKysgYi9kcml2ZXJzL2NoYXIvbXNwZWMuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJcmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtc3BlY192bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG1zcGVjX3ZtX29wcyA9IHsKIAkub3BlbiA9IG1zcGVjX29wZW4sCiAJLmNsb3NlID0gbXNwZWNfY2xvc2UsCiAJLmZhdWx0ID0gbXNwZWNfZmF1bHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwppbmRleCA5NGFkMmMzLi5hNGVjNTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKQEAgLTI4MSwxMiArMjgxLDYgQEAKIAkJY2FzZSBJT0NUTF9NV19SRUdJU1RFUl9JUEM6IHsKIAkJCXVuc2lnbmVkIGludCBpcGNudW0gPSAodW5zaWduZWQgaW50KSBpb2FyZzsKIAkKLQkJCVBSSU5US18zKFRSQUNFX01XQVZFLAotCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCBJT0NUTF9NV19SRUdJU1RFUl9JUEMiCi0JCQkJIiBpcGNudW0gJXggZW50cnkgdXNJbnRDb3VudCAleFxuIiwKLQkJCQlpcGNudW0sCi0JCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50KTsKLQkKIAkJCWlmIChpcGNudW0gPj0gQVJSQVlfU0laRShwRHJ2RGF0YS0+SVBDcykpIHsKIAkJCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUKIAkJCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bDoiCkBAIC0yOTUsNiArMjg5LDEyIEBACiAJCQkJCQlpcGNudW0pOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQorCQkJUFJJTlRLXzMoVFJBQ0VfTVdBVkUsCisJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsIElPQ1RMX01XX1JFR0lTVEVSX0lQQyIKKwkJCQkiIGlwY251bSAleCBlbnRyeSB1c0ludENvdW50ICV4XG4iLAorCQkJCWlwY251bSwKKwkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLnVzSW50Q291bnQpOworCiAJCQlsb2NrX2tlcm5lbCgpOwogCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gRkFMU0U7CiAJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPSBUUlVFOwpAQCAtMzEwLDExICszMTAsNiBAQAogCQljYXNlIElPQ1RMX01XX0dFVF9JUEM6IHsKIAkJCXVuc2lnbmVkIGludCBpcGNudW0gPSAodW5zaWduZWQgaW50KSBpb2FyZzsKIAkKLQkJCVBSSU5US18zKFRSQUNFX01XQVZFLAotCQkJCSJtd2F2ZWRkOjptd2F2ZV9pb2N0bCBJT0NUTF9NV19HRVRfSVBDIgotCQkJCSIgaXBjbnVtICV4LCB1c0ludENvdW50ICV4XG4iLAotCQkJCWlwY251bSwKLQkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLnVzSW50Q291bnQpOwogCQkJaWYgKGlwY251bSA+PSBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKSkgewogCQkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQogCQkJCQkJIm13YXZlZGQ6Om13YXZlX2lvY3RsOiIKQEAgLTMyMiw2ICszMTcsMTEgQEAKIAkJCQkJCSIgSW52YWxpZCBpcGNudW0gJXhcbiIsIGlwY251bSk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CisJCQlQUklOVEtfMyhUUkFDRV9NV0FWRSwKKwkJCQkibXdhdmVkZDo6bXdhdmVfaW9jdGwgSU9DVExfTVdfR0VUX0lQQyIKKwkJCQkiIGlwY251bSAleCwgdXNJbnRDb3VudCAleFxuIiwKKwkJCQlpcGNudW0sCisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50KTsKIAkKIAkJCWxvY2tfa2VybmVsKCk7CiAJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IFRSVUUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ub3pvbWkuYyBiL2RyaXZlcnMvY2hhci9ub3pvbWkuYwppbmRleCBlYzU4ZDhjLi5kMzQwMGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbm96b21pLmMKKysrIGIvZHJpdmVycy9jaGFyL25vem9taS5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHR5LmMgYi9kcml2ZXJzL2NoYXIvcHR5LmMKaW5kZXggNTM3NjFjZS4uNjJmMjgyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3B0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9wdHkuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTI2MSw2ICsyNjIsOSBAQAogCXJldHVybiAwOwogfQogCisvKiBUcmFkaXRpb25hbCBCU0QgZGV2aWNlcyAqLworI2lmZGVmIENPTkZJR19MRUdBQ1lfUFRZUworCiBzdGF0aWMgaW50IHB0eV9pbnN0YWxsKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKm9fdHR5OwpAQCAtMzEwLDI0ICszMTQsNiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcHR5X29wcyA9IHsKLQkuaW5zdGFsbCA9IHB0eV9pbnN0YWxsLAotCS5vcGVuID0gcHR5X29wZW4sCi0JLmNsb3NlID0gcHR5X2Nsb3NlLAotCS53cml0ZSA9IHB0eV93cml0ZSwKLQkud3JpdGVfcm9vbSA9IHB0eV93cml0ZV9yb29tLAotCS5mbHVzaF9idWZmZXIgPSBwdHlfZmx1c2hfYnVmZmVyLAotCS5jaGFyc19pbl9idWZmZXIgPSBwdHlfY2hhcnNfaW5fYnVmZmVyLAotCS51bnRocm90dGxlID0gcHR5X3VudGhyb3R0bGUsCi0JLnNldF90ZXJtaW9zID0gcHR5X3NldF90ZXJtaW9zLAotCS5yZXNpemUgPSBwdHlfcmVzaXplCi19OwotCi0vKiBUcmFkaXRpb25hbCBCU0QgZGV2aWNlcyAqLwotI2lmZGVmIENPTkZJR19MRUdBQ1lfUFRZUwotc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpwdHlfZHJpdmVyLCAqcHR5X3NsYXZlX2RyaXZlcjsKLQogc3RhdGljIGludCBwdHlfYnNkX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtMzQxLDcgKzMyNywxMiBAQAogc3RhdGljIGludCBsZWdhY3lfY291bnQgPSBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVDsKIG1vZHVsZV9wYXJhbShsZWdhY3lfY291bnQsIGludCwgMCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcHR5X29wc19ic2QgPSB7CisvKgorICogVGhlIG1hc3RlciBzaWRlIG9mIGEgcHR5IGNhbiBkbyBUSU9DU1BUTENLIGFuZCB0aHVzCisgKiBoYXMgcHR5X2JzZF9pb2N0bC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBtYXN0ZXJfcHR5X29wc19ic2QgPSB7CisJLmluc3RhbGwgPSBwdHlfaW5zdGFsbCwKIAkub3BlbiA9IHB0eV9vcGVuLAogCS5jbG9zZSA9IHB0eV9jbG9zZSwKIAkud3JpdGUgPSBwdHlfd3JpdGUsCkBAIC0zNTQsOCArMzQ1LDIzIEBACiAJLnJlc2l6ZSA9IHB0eV9yZXNpemUKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc2xhdmVfcHR5X29wc19ic2QgPSB7CisJLmluc3RhbGwgPSBwdHlfaW5zdGFsbCwKKwkub3BlbiA9IHB0eV9vcGVuLAorCS5jbG9zZSA9IHB0eV9jbG9zZSwKKwkud3JpdGUgPSBwdHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPSBwdHlfd3JpdGVfcm9vbSwKKwkuZmx1c2hfYnVmZmVyID0gcHR5X2ZsdXNoX2J1ZmZlciwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcHR5X2NoYXJzX2luX2J1ZmZlciwKKwkudW50aHJvdHRsZSA9IHB0eV91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHB0eV9zZXRfdGVybWlvcywKKwkucmVzaXplID0gcHR5X3Jlc2l6ZQorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGxlZ2FjeV9wdHlfaW5pdCh2b2lkKQogeworCXN0cnVjdCB0dHlfZHJpdmVyICpwdHlfZHJpdmVyLCAqcHR5X3NsYXZlX2RyaXZlcjsKKwogCWlmIChsZWdhY3lfY291bnQgPD0gMCkKIAkJcmV0dXJuOwogCkBAIC0zODMsNyArMzg5LDcgQEAKIAlwdHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSAzODQwMDsKIAlwdHlfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUyB8IFRUWV9EUklWRVJfUkVBTF9SQVc7CiAJcHR5X2RyaXZlci0+b3RoZXIgPSBwdHlfc2xhdmVfZHJpdmVyOwotCXR0eV9zZXRfb3BlcmF0aW9ucyhwdHlfZHJpdmVyLCAmcHR5X29wcyk7CisJdHR5X3NldF9vcGVyYXRpb25zKHB0eV9kcml2ZXIsICZtYXN0ZXJfcHR5X29wc19ic2QpOwogCiAJcHR5X3NsYXZlX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlwdHlfc2xhdmVfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJwdHlfc2xhdmUiOwpAQCAtMzk5LDcgKzQwNSw3IEBACiAJcHR5X3NsYXZlX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MgfAogCQkJCQlUVFlfRFJJVkVSX1JFQUxfUkFXOwogCXB0eV9zbGF2ZV9kcml2ZXItPm90aGVyID0gcHR5X2RyaXZlcjsKLQl0dHlfc2V0X29wZXJhdGlvbnMocHR5X3NsYXZlX2RyaXZlciwgJnB0eV9vcHMpOworCXR0eV9zZXRfb3BlcmF0aW9ucyhwdHlfc2xhdmVfZHJpdmVyLCAmc2xhdmVfcHR5X29wc19ic2QpOwogCiAJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIocHR5X2RyaXZlcikpCiAJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBwdHkgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKaW5kZXggZDhhOTI1NS4uMDRiNTA1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtMTIzMSw3ICsxMjMxLDcgQEAKICAqIGFzIGFuIEFTQ0lJIHN0cmluZyBpbiB0aGUgc3RhbmRhcmQgVVVJRCBmb3JtYXQuICBJZiBhY2Nlc3NlcyB2aWEgdGhlCiAgKiBzeXNjdGwgc3lzdGVtIGNhbGwsIGl0IGlzIHJldHVybmVkIGFzIDE2IGJ5dGVzIG9mIGJpbmFyeSBkYXRhLgogICovCi1zdGF0aWMgaW50IHByb2NfZG9fdXVpZChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBwcm9jX2RvX3V1aWQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJY3RsX3RhYmxlIGZha2VfdGFibGU7CkBAIC0xMjU0LDcgKzEyNTQsNyBAQAogCWZha2VfdGFibGUuZGF0YSA9IGJ1ZjsKIAlmYWtlX3RhYmxlLm1heGxlbiA9IHNpemVvZihidWYpOwogCi0JcmV0dXJuIHByb2NfZG9zdHJpbmcoJmZha2VfdGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiBwcm9jX2Rvc3RyaW5nKCZmYWtlX3RhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIH0KIAogc3RhdGljIGludCB1dWlkX3N0cmF0ZWd5KGN0bF90YWJsZSAqdGFibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYwppbmRleCAwMWYyNjU0Li5mMTIxMzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY21kLmMKQEAgLTMyLDYgKzMyLDcgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2N0cmwuYwppbmRleCBlZWNlZTBmLi43ODA1MDYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2N0cmwuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2N0cmwuYwpAQCAtMzEsNiArMzEsNyBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC04NzMsNyArODc0LDcgQEAKIAkJLyoKIAkJICoqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBwcm9kdWN0IGNvZGUgaXMgYW4gdW5zaWduZWQgb2JqZWN0IQogCQkgKi8KLQkJaWYgKERvd25Mb2FkLlByb2R1Y3RDb2RlID4gTUFYX1BST0RVQ1QpIHsKKwkJaWYgKERvd25Mb2FkLlByb2R1Y3RDb2RlID49IE1BWF9QUk9EVUNUKSB7CiAJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19ET1dOTE9BRDogQmFkIHByb2R1Y3QgY29kZSAlZCBwYXNzZWRcbiIsIERvd25Mb2FkLlByb2R1Y3RDb2RlKTsKIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9fU1VDSF9QUk9EVUNUOwogCQkJcmV0dXJuIC1FTlhJTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvdHR5LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3R0eS5jCmluZGV4IDJmYjQ5ZTguLjQ3ZmFiN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvdHR5LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90dHkuYwpAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBfX0VYUExJQ0lUX0RFRl9IX18KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcnRjLmMgYi9kcml2ZXJzL2NoYXIvcnRjLmMKaW5kZXggZTBkMGY4Yi4uYmM0YWIzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3J0Yy5jCisrKyBiL2RyaXZlcnMvY2hhci9ydGMuYwpAQCAtNzQsNiArNzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmMgYi9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmMKaW5kZXggMzNhMmI1My4uOTYxMDg2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jCisrKyBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYwpAQCAtODksNiArODksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jIGIvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCmluZGV4IDU5NDJhOWQuLjQ1MjM3MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYworKysgYi9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMKQEAgLTIyMCw4ICsyMjAsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZiAoKGxvbmcpaW5mbyA8IChsb25nKSgmY3lfcG9ydFswXSkKLQkgICAgfHwgKGxvbmcpKCZjeV9wb3J0W05SX1BPUlRTXSkgPCAobG9uZylpbmZvKSB7CisJaWYgKGluZm8gPCAmY3lfcG9ydFswXSB8fCBpbmZvID49ICZjeV9wb3J0W05SX1BPUlRTXSkgewogCQlwcmludGsoIldhcm5pbmc6IGN5Y2xhZGVzX3BvcnQgb3V0IG9mIHJhbmdlIGZvciAoJXMpIGluICVzXG4iLAogCQkJCW5hbWUsIHJvdXRpbmUpOwogCQlyZXR1cm4gMTsKQEAgLTUyMCwxNSArNTE5LDEzIEBACiAJCXBhbmljKCJUeEludCBvbiBkZWJ1ZyBwb3J0ISEhIik7CiAJfQogI2VuZGlmCi0KLQlpbmZvID0gJmN5X3BvcnRbY2hhbm5lbF07Ci0KIAkvKiB2YWxpZGF0ZSB0aGUgcG9ydCBudW1iZXIgKGFzIGNvbmZpZ3VyZWQgYW5kIG9wZW4pICovCiAJaWYgKChjaGFubmVsIDwgMCkgfHwgKE5SX1BPUlRTIDw9IGNoYW5uZWwpKSB7CiAJCWJhc2VfYWRkcltDeUlFUl0gJj0gfihDeVR4TXB0eSB8IEN5VHhSZHkpOwogCQliYXNlX2FkZHJbQ3lURU9JUl0gPSBDeU5PVFJBTlM7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CisJaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWxdOwogCWluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKIAlpZiAoaW5mby0+dHR5ID09IDApIHsKIAkJYmFzZV9hZGRyW0N5SUVSXSAmPSB+KEN5VHhNcHR5IHwgQ3lUeFJkeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc29ueXBpLmMgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKaW5kZXggZmQzZGNlZC4uOGMyNjJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9zb255cGkuYwpAQCAtMzYsNiArMzYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwppbmRleCA1M2U1MDRmLi5kYjZkY2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwpAQCAtMjcsNiArMjcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGxjbGsuYyBiL2RyaXZlcnMvY2hhci90bGNsay5jCmluZGV4IDhmMjI4NGIuLjgwZWE2YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90bGNsay5jCisrKyBiL2RyaXZlcnMvY2hhci90bGNsay5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpICovCiAjaW5jbHVkZSA8bGludXgvZnMuaD4JCS8qIGV2ZXJ5dGhpbmcuLi4gKi8KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiBlcnJvciBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKaW5kZXggMzJiOTU3ZS4uNDdjMmQyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCkBAIC02OTYsOCArNjk2LDcgQEAKIAogCWNtZC5oZWFkZXIuaW4gPSBwY3JyZWFkX2hlYWRlcjsKIAljbWQucGFyYW1zLnBjcnJlYWRfaW4ucGNyX2lkeCA9IGNwdV90b19iZTMyKHBjcl9pZHgpOwotCUJVR19PTihjbWQuaGVhZGVyLmluLmxlbmd0aCA+IFJFQURfUENSX1JFU1VMVF9TSVpFKTsKLQlyYyA9IHRyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBjbWQuaGVhZGVyLmluLmxlbmd0aCwKKwlyYyA9IHRyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBSRUFEX1BDUl9SRVNVTFRfU0laRSwKIAkJCSAgImF0dGVtcHRpbmcgdG8gcmVhZCBhIHBjciB2YWx1ZSIpOwogCiAJaWYgKHJjID09IDApCkBAIC03NDIsNyArNzQxLDcgQEAKICAqIHRoZSBtb2R1bGUgdXNhZ2UgY291bnQuCiAgKi8KICNkZWZpbmUgVFBNX09SRF9QQ1JfRVhURU5EIGNwdV90b19iZTMyKDIwKQotI2RlZmluZSBFWFRFTkRfUENSX1NJWkUgMzQKKyNkZWZpbmUgRVhURU5EX1BDUl9SRVNVTFRfU0laRSAzNAogc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHBjcmV4dGVuZF9oZWFkZXIgPSB7CiAJLnRhZyA9IFRQTV9UQUdfUlFVX0NPTU1BTkQsCiAJLmxlbmd0aCA9IGNwdV90b19iZTMyKDM0KSwKQEAgLTc2MCwxMCArNzU5LDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAljbWQuaGVhZGVyLmluID0gcGNyZXh0ZW5kX2hlYWRlcjsKLQlCVUdfT04oYmUzMl90b19jcHUoY21kLmhlYWRlci5pbi5sZW5ndGgpID4gRVhURU5EX1BDUl9TSVpFKTsKIAljbWQucGFyYW1zLnBjcmV4dGVuZF9pbi5wY3JfaWR4ID0gY3B1X3RvX2JlMzIocGNyX2lkeCk7CiAJbWVtY3B5KGNtZC5wYXJhbXMucGNyZXh0ZW5kX2luLmhhc2gsIGhhc2gsIFRQTV9ESUdFU1RfU0laRSk7Ci0JcmMgPSB0cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgY21kLmhlYWRlci5pbi5sZW5ndGgsCisJcmMgPSB0cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwKIAkJCSAgImF0dGVtcHRpbmcgZXh0ZW5kIGEgUENSIHZhbHVlIik7CiAKIAltb2R1bGVfcHV0KGNoaXAtPmRldi0+ZHJpdmVyLT5vd25lcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2J1ZmZlci5jIGIvZHJpdmVycy9jaGFyL3R0eV9idWZmZXIuYwppbmRleCAzMTA4OTkxLi42NmZhNGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfYnVmZmVyLmMKQEAgLTQwMiwyOCArNDAyLDI2IEBACiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHR5X3N0cnVjdCwgYnVmLndvcmsud29yayk7CiAJdW5zaWduZWQgbG9uZyAJZmxhZ3M7CiAJc3RydWN0IHR0eV9sZGlzYyAqZGlzYzsKLQlzdHJ1Y3QgdHR5X2J1ZmZlciAqdGJ1ZiwgKmhlYWQ7Ci0JY2hhciAqY2hhcl9idWY7Ci0JdW5zaWduZWQgY2hhciAqZmxhZ19idWY7CiAKIAlkaXNjID0gdHR5X2xkaXNjX3JlZih0dHkpOwogCWlmIChkaXNjID09IE5VTEwpCS8qICAhVFRZX0xESVNDICovCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPmJ1Zi5sb2NrLCBmbGFncyk7Ci0JLyogU28gd2Uga25vdyBhIGZsdXNoIGlzIHJ1bm5pbmcgKi8KLQlzZXRfYml0KFRUWV9GTFVTSElORywgJnR0eS0+ZmxhZ3MpOwotCWhlYWQgPSB0dHktPmJ1Zi5oZWFkOwotCWlmIChoZWFkICE9IE5VTEwpIHsKLQkJdHR5LT5idWYuaGVhZCA9IE5VTEw7Ci0JCWZvciAoOzspIHsKLQkJCWludCBjb3VudCA9IGhlYWQtPmNvbW1pdCAtIGhlYWQtPnJlYWQ7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVFRZX0ZMVVNISU5HLCAmdHR5LT5mbGFncykpIHsKKwkJc3RydWN0IHR0eV9idWZmZXIgKmhlYWQ7CisJCXdoaWxlICgoaGVhZCA9IHR0eS0+YnVmLmhlYWQpICE9IE5VTEwpIHsKKwkJCWludCBjb3VudDsKKwkJCWNoYXIgKmNoYXJfYnVmOworCQkJdW5zaWduZWQgY2hhciAqZmxhZ19idWY7CisKKwkJCWNvdW50ID0gaGVhZC0+Y29tbWl0IC0gaGVhZC0+cmVhZDsKIAkJCWlmICghY291bnQpIHsKIAkJCQlpZiAoaGVhZC0+bmV4dCA9PSBOVUxMKQogCQkJCQlicmVhazsKLQkJCQl0YnVmID0gaGVhZDsKLQkJCQloZWFkID0gaGVhZC0+bmV4dDsKLQkJCQl0dHlfYnVmZmVyX2ZyZWUodHR5LCB0YnVmKTsKKwkJCQl0dHktPmJ1Zi5oZWFkID0gaGVhZC0+bmV4dDsKKwkJCQl0dHlfYnVmZmVyX2ZyZWUodHR5LCBoZWFkKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCS8qIExkaXNjIG9yIHVzZXIgaXMgdHJ5aW5nIHRvIGZsdXNoIHRoZSBidWZmZXJzCkBAIC00NDUsOSArNDQzLDkgQEAKIAkJCQkJCQlmbGFnX2J1ZiwgY291bnQpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKIAkJfQotCQkvKiBSZXN0b3JlIHRoZSBxdWV1ZSBoZWFkICovCi0JCXR0eS0+YnVmLmhlYWQgPSBoZWFkOworCQljbGVhcl9iaXQoVFRZX0ZMVVNISU5HLCAmdHR5LT5mbGFncyk7CiAJfQorCiAJLyogV2UgbWF5IGhhdmUgYSBkZWZlcnJlZCByZXF1ZXN0IHRvIGZsdXNoIHRoZSBpbnB1dCBidWZmZXIsCiAJICAgaWYgc28gcHVsbCB0aGUgY2hhaW4gdW5kZXIgdGhlIGxvY2sgYW5kIGVtcHR5IHRoZSBxdWV1ZSAqLwogCWlmICh0ZXN0X2JpdChUVFlfRkxVU0hQRU5ESU5HLCAmdHR5LT5mbGFncykpIHsKQEAgLTQ1NSw3ICs0NTMsNiBAQAogCQljbGVhcl9iaXQoVFRZX0ZMVVNIUEVORElORywgJnR0eS0+ZmxhZ3MpOwogCQl3YWtlX3VwKCZ0dHktPnJlYWRfd2FpdCk7CiAJfQotCWNsZWFyX2JpdChUVFlfRkxVU0hJTkcsICZ0dHktPmZsYWdzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPmJ1Zi5sb2NrLCBmbGFncyk7CiAKIAl0dHlfbGRpc2NfZGVyZWYoZGlzYyk7CkBAIC00NzEsNyArNDY4LDcgQEAKICAqLwogdm9pZCB0dHlfZmx1c2hfdG9fbGRpc2Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlmbHVzaF90b19sZGlzYygmdHR5LT5idWYud29yay53b3JrKTsKKwlmbHVzaF9kZWxheWVkX3dvcmsoJnR0eS0+YnVmLndvcmspOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW8uYyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwppbmRleCBlYTE4YTEyLi41OTQ5OWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCkBAIC0xMzg5LDcgKzEzODksNyBAQAogICoJb2YgdHR5cyB0aGF0IHRoZSBkcml2ZXIga2VlcHMuCiAgKgogICoJVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgZnJvbSBhIHdvcmsgcXVldWUgc28gdGhhdCB0aGUgZHJpdmVyIHByaXZhdGUKLSAqCXNodXRkb3duIG9wcyBjYW4gc2xlZXAgKG5lZWRlZCBmb3IgVVNCIGF0IGxlYXN0KQorICoJY2xlYW51cCBvcHMgY2FuIHNsZWVwIChuZWVkZWQgZm9yIFVTQiBhdCBsZWFzdCkKICAqLwogc3RhdGljIHZvaWQgcmVsZWFzZV9vbmVfdHR5KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKQEAgLTEzOTcsMTAgKzEzOTcsOSBAQAogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHR0eV9zdHJ1Y3QsIGhhbmd1cF93b3JrKTsKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyID0gdHR5LT5kcml2ZXI7CiAKLQlpZiAodHR5LT5vcHMtPnNodXRkb3duKQotCQl0dHktPm9wcy0+c2h1dGRvd24odHR5KTsKLQllbHNlCi0JCXR0eV9zaHV0ZG93bih0dHkpOworCWlmICh0dHktPm9wcy0+Y2xlYW51cCkKKwkJdHR5LT5vcHMtPmNsZWFudXAodHR5KTsKKwogCXR0eS0+bWFnaWMgPSAwOwogCXR0eV9kcml2ZXJfa3JlZl9wdXQoZHJpdmVyKTsKIAltb2R1bGVfcHV0KGRyaXZlci0+b3duZXIpOwpAQCAtMTQxNSw2ICsxNDE0LDEyIEBACiBzdGF0aWMgdm9pZCBxdWV1ZV9yZWxlYXNlX29uZV90dHkoc3RydWN0IGtyZWYgKmtyZWYpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdHR5X3N0cnVjdCwga3JlZik7CisKKwlpZiAodHR5LT5vcHMtPnNodXRkb3duKQorCQl0dHktPm9wcy0+c2h1dGRvd24odHR5KTsKKwllbHNlCisJCXR0eV9zaHV0ZG93bih0dHkpOworCiAJLyogVGhlIGhhbmd1cCBxdWV1ZSBpcyBub3cgZnJlZSBzbyB3ZSBjYW4gcmV1c2UgaXQgcmF0aGVyIHRoYW4KIAkgICB3YXN0ZSBhIGNodW5rIG9mIG1lbW9yeSBmb3IgZWFjaCBwb3J0ICovCiAJSU5JVF9XT1JLKCZ0dHktPmhhbmd1cF93b3JrLCByZWxlYXNlX29uZV90dHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9sZGlzYy5jIGIvZHJpdmVycy9jaGFyL3R0eV9sZGlzYy5jCmluZGV4IGFhZmRiYWUuLmZlYjU1MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfbGRpc2MuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2xkaXNjLmMKQEAgLTUxOCw3ICs1MTgsNyBAQAogc3RhdGljIGludCB0dHlfbGRpc2NfaGFsdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWNsZWFyX2JpdChUVFlfTERJU0MsICZ0dHktPmZsYWdzKTsKLQlyZXR1cm4gY2FuY2VsX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yayk7CisJcmV0dXJuIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdHR5LT5idWYud29yayk7CiB9CiAKIC8qKgpAQCAtNzU2LDEyICs3NTYsOSBAQAogCSAqIE5fVFRZLgogCSAqLwogCWlmICh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MpIHsKLQkJLyogTWFrZSBzdXJlIHRoZSBvbGQgbGRpc2MgaXMgcXVpZXNjZW50ICovCi0JCXR0eV9sZGlzY19oYWx0KHR0eSk7Ci0JCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0KIAkJLyogQXZvaWQgcmFjaW5nIHNldF9sZGlzYyBvciB0dHlfbGRpc2NfcmVsZWFzZSAqLwogCQltdXRleF9sb2NrKCZ0dHktPmxkaXNjX211dGV4KTsKKwkJdHR5X2xkaXNjX2hhbHQodHR5KTsKIAkJaWYgKHR0eS0+bGRpc2MpIHsJLyogTm90IHlldCBjbG9zZWQgKi8KIAkJCS8qIFN3aXRjaCBiYWNrIHRvIE5fVFRZICovCiAJCQl0dHlfbGRpc2NfcmVpbml0KHR0eSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdXZfbW10aW1lci5jIGIvZHJpdmVycy9jaGFyL3V2X21tdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdiNjdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3V2X21tdGltZXIuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIFRpbWVyIGRldmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgU0dJIFVWIHBsYXRmb3JtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KKyNpbmNsdWRlIDxhc20vdXYvdXZfaHViLmg+CisjaW5jbHVkZSA8YXNtL3V2L2Jpb3MuaD4KKyNpbmNsdWRlIDxhc20vdXYvdXYuaD4KKworTU9EVUxFX0FVVEhPUigiRGltaXRyaSBTaXZhbmljaCA8c2l2YW5pY2hAc2dpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0dJIFVWIE1lbW9yeSBNYXBwZWQgUlRDIFRpbWVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIG5hbWUgb2YgdGhlIGRldmljZSwgdXN1YWxseSBpbiAvZGV2ICovCisjZGVmaW5lIFVWX01NVElNRVJfTkFNRSAibW10aW1lciIKKyNkZWZpbmUgVVZfTU1USU1FUl9ERVNDICJTR0kgVVYgTWVtb3J5IE1hcHBlZCBSVEMgVGltZXIiCisjZGVmaW5lIFVWX01NVElNRVJfVkVSU0lPTiAiMS4wIgorCitzdGF0aWMgbG9uZyB1dl9tbXRpbWVyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB1dl9tbXRpbWVyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworLyoKKyAqIFBlcmlvZCBpbiBmZW10b3NlY29uZHMgKDEwXi0xNSBzKQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB1dl9tbXRpbWVyX2ZlbXRvcGVyaW9kOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1dl9tbXRpbWVyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm1tYXAgPQl1dl9tbXRpbWVyX21tYXAsCisJLnVubG9ja2VkX2lvY3RsID0gdXZfbW10aW1lcl9pb2N0bCwKK307CisKKy8qKgorICogdXZfbW10aW1lcl9pb2N0bCAtIGlvY3RsIGludGVyZmFjZSBmb3IgL2Rldi91dl9tbXRpbWVyCisgKiBAZmlsZTogZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqIEBjbWQ6IGNvbW1hbmQgdG8gZXhlY3V0ZQorICogQGFyZzogb3B0aW9uYWwgYXJndW1lbnQgdG8gY29tbWFuZAorICoKKyAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kIHNwZWNpZmllZCBieSBAY21kLiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCA8IDAgZm9yCisgKiBmYWlsdXJlLgorICoKKyAqIFZhbGlkIGNvbW1hbmRzOgorICoKKyAqICVNTVRJTUVSX0dFVE9GRlNFVCAtIFNob3VsZCByZXR1cm4gdGhlIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0CisgKiBvZiB0aGUgcGFnZSB3aGVyZSB0aGUgcmVnaXN0ZXJzIGFyZSBtYXBwZWQpIGZvciB0aGUgY291bnRlciBpbiBxdWVzdGlvbi4KKyAqCisgKiAlTU1USU1FUl9HRVRSRVMgLSBSZXR1cm5zIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9jayBpbiBmZW10byAoMTBeLTE1KQorICogc2Vjb25kcworICoKKyAqICVNTVRJTUVSX0dFVEZSRVEgLSBDb3BpZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY2xvY2sgaW4gSHogdG8gdGhlIGFkZHJlc3MKKyAqIHNwZWNpZmllZCBieSBAYXJnCisgKgorICogJU1NVElNRVJfR0VUQklUUyAtIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjbG9jaydzIGNvdW50ZXIKKyAqCisgKiAlTU1USU1FUl9NTUFQQVZBSUwgLSBSZXR1cm5zIDEgaWYgcmVnaXN0ZXJzIGNhbiBiZSBtbWFwJ2QgaW50byB1c2Vyc3BhY2UKKyAqCisgKiAlTU1USU1FUl9HRVRDT1VOVEVSIC0gR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgY291bnRlciBhbmQgcGxhY2VzIGl0CisgKiBpbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgYnkgQGFyZy4KKyAqLworc3RhdGljIGxvbmcgdXZfbW10aW1lcl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1NVElNRVJfR0VUT0ZGU0VUOgkvKiBvZmZzZXQgb2YgdGhlIGNvdW50ZXIgKi8KKwkJLyoKKwkJICogVVYgUlRDIHJlZ2lzdGVyIGlzIG9uIGl0cyBvd24gcGFnZQorCQkgKi8KKwkJaWYgKFBBR0VfU0laRSA8PSAoMSA8PCAxNikpCisJCQlyZXQgPSAoKFVWX0xPQ0FMX01NUl9CQVNFIHwgVVZIX1JUQykgJiAoUEFHRV9TSVpFLTEpKQorCQkJCS8gODsKKwkJZWxzZQorCQkJcmV0ID0gLUVOT1NZUzsKKwkJYnJlYWs7CisKKwljYXNlIE1NVElNRVJfR0VUUkVTOiAvKiByZXNvbHV0aW9uIG9mIHRoZSBjbG9jayBpbiAxMF4tMTUgcyAqLworCQlpZiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywKKwkJCQkmdXZfbW10aW1lcl9mZW10b3BlcmlvZCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBNTVRJTUVSX0dFVEZSRVE6IC8qIGZyZXF1ZW5jeSBpbiBIeiAqLworCQlpZiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZywKKwkJCQkmc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kLAorCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgTU1USU1FUl9HRVRCSVRTOiAvKiBudW1iZXIgb2YgYml0cyBpbiB0aGUgY2xvY2sgKi8KKwkJcmV0ID0gaHdlaWdodDY0KFVWSF9SVENfUkVBTF9USU1FX0NMT0NLX01BU0spOworCQlicmVhazsKKworCWNhc2UgTU1USU1FUl9NTUFQQVZBSUw6IC8qIGNhbiB3ZSBtbWFwIHRoZSBjbG9jayBpbnRvIHVzZXJzcGFjZT8gKi8KKwkJcmV0ID0gKFBBR0VfU0laRSA8PSAoMSA8PCAxNikpID8gMSA6IDA7CisJCWJyZWFrOworCisJY2FzZSBNTVRJTUVSX0dFVENPVU5URVI6CisJCWlmIChjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnLAorCQkJCSh1bnNpZ25lZCBsb25nICopdXZfbG9jYWxfbW1yX2FkZHJlc3MoVVZIX1JUQyksCisJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9UVFk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHV2X21tdGltZXJfbW1hcCAtIG1hcHMgdGhlIGNsb2NrJ3MgcmVnaXN0ZXJzIGludG8gdXNlcnNwYWNlCisgKiBAZmlsZTogZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqIEB2bWE6IFZNQSB0byBtYXAgdGhlIHJlZ2lzdGVycyBpbnRvCisgKgorICogQ2FsbHMgcmVtYXBfcGZuX3JhbmdlKCkgdG8gbWFwIHRoZSBjbG9jaydzIHJlZ2lzdGVycyBpbnRvCisgKiB0aGUgY2FsbGluZyBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgaW50IHV2X21tdGltZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgbG9uZyB1dl9tbXRpbWVyX2FkZHI7CisKKwlpZiAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0ICE9IFBBR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKFBBR0VfU0laRSA+ICgxIDw8IDE2KSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworCisJdXZfbW10aW1lcl9hZGRyID0gVVZfTE9DQUxfTU1SX0JBU0UgfCBVVkhfUlRDOworCXV2X21tdGltZXJfYWRkciAmPSB+KFBBR0VfU0laRSAtIDEpOworCXV2X21tdGltZXJfYWRkciAmPSAweGZmZmZmZmZmZmZmZmZmZlVMOworCisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHV2X21tdGltZXJfYWRkciA+PiBQQUdFX1NISUZULAorCQkJCQlQQUdFX1NJWkUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlwcmludGsoS0VSTl9FUlIgInJlbWFwX3Bmbl9yYW5nZSBmYWlsZWQgaW4gdXZfbW10aW1lcl9tbWFwXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB1dl9tbXRpbWVyX21pc2NkZXYgPSB7CisJTUlTQ19EWU5BTUlDX01JTk9SLAorCVVWX01NVElNRVJfTkFNRSwKKwkmdXZfbW10aW1lcl9mb3BzCit9OworCisKKy8qKgorICogdXZfbW10aW1lcl9pbml0IC0gZGV2aWNlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAqCisgKiBEb2VzIGluaXRpYWwgc2V0dXAgZm9yIHRoZSB1dl9tbXRpbWVyIGRldmljZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgdXZfbW10aW1lcl9pbml0KHZvaWQpCit7CisJaWYgKCFpc191dl9zeXN0ZW0oKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXJkd2FyZSB1bnN1cHBvcnRlZFxuIiwgVVZfTU1USU1FUl9OQU1FKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogU2FuaXR5IGNoZWNrIHRoZSBjeWNsZXMvc2VjIHZhcmlhYmxlCisJICovCisJaWYgKHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCA8IDEwMDAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZGV0ZXJtaW5lIGNsb2NrIGZyZXF1ZW5jeVxuIiwKKwkJICAgICAgIFVWX01NVElNRVJfTkFNRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl1dl9tbXRpbWVyX2ZlbXRvcGVyaW9kID0gKCh1bnNpZ25lZCBsb25nKTFFMTUgKworCQkJCXNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCAvIDIpIC8KKwkJCQlzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQ7CisKKwlpZiAobWlzY19yZWdpc3RlcigmdXZfbW10aW1lcl9taXNjZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlXG4iLAorCQkgICAgICAgVVZfTU1USU1FUl9OQU1FKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiB2JXMsICVsZCBNSHpcbiIsIFVWX01NVElNRVJfREVTQywKKwkJVVZfTU1USU1FUl9WRVJTSU9OLAorCQlzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQvKHVuc2lnbmVkIGxvbmcpMUU2KTsKKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdCh1dl9tbXRpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwppbmRleCAwZDMyOGI1Li5hMDM1YWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW8uaD4KLSNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbnNvbGUuaD4KICNpbmNsdWRlICJodmNfY29uc29sZS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnRfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jCmluZGV4IDI5YzY1MWEuLmVkODZkM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jCkBAIC05ODEsOCArOTgxLDEwIEBACiAJCQlnb3RvIGVwZXJtOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdnNhLCAoc3RydWN0IHZ0X3NldGFjdGl2YXRlIF9fdXNlciAqKWFyZywKLQkJCQkJCXNpemVvZihzdHJ1Y3QgdnRfc2V0YWN0aXZhdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlzaXplb2Yoc3RydWN0IHZ0X3NldGFjdGl2YXRlKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQogCQlpZiAodnNhLmNvbnNvbGUgPT0gMCB8fCB2c2EuY29uc29sZSA+IE1BWF9OUl9DT05TT0xFUykKIAkJCXJldCA9IC1FTlhJTzsKIAkJZWxzZSB7CkBAIC0xNTMwLDcgKzE1MzIsNyBAQAogCiAJY2FzZSBQSU9fVU5JTUFQOgogCWNhc2UgR0lPX1VOSU1BUDoKLQkJcmV0ID0gZG9fdW5pbWFwX2lvY3RsKGNtZCwgdXAsIHBlcm0sIHZjKTsKKwkJcmV0ID0gY29tcGF0X3VuaW1hcF9pb2N0bChjbWQsIHVwLCBwZXJtLCB2Yyk7CiAJCWJyZWFrOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL3hpbGlueF9od2ljYXAuYyBiL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL3hpbGlueF9od2ljYXAuYwppbmRleCBmNDBhYjY5Li40ODQ2ZDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC94aWxpbnhfaHdpY2FwLmMKKysrIGIvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAveGlsaW54X2h3aWNhcC5jCkBAIC01NTksNyArNTU5LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBod2ljYXBfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh3aWNhcF9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS53cml0ZSA9IGh3aWNhcF93cml0ZSwKIAkucmVhZCA9IGh3aWNhcF9yZWFkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jIGIvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jCmluZGV4IGFiZjRhMjUuLjYwNjk3OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMKQEAgLTIyNyw3ICsyMjcsOCBAQAogICogY25fcHJvY19tY2FzdF9jdGwKICAqIEBkYXRhOiBtZXNzYWdlIHNlbnQgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBjb25uZWN0b3IKICAqLwotc3RhdGljIHZvaWQgY25fcHJvY19tY2FzdF9jdGwoc3RydWN0IGNuX21zZyAqbXNnKQorc3RhdGljIHZvaWQgY25fcHJvY19tY2FzdF9jdGwoc3RydWN0IGNuX21zZyAqbXNnLAorCQkJICAgICAgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICpuc3ApCiB7CiAJZW51bSBwcm9jX2NuX21jYXN0X29wICptY19vcCA9IE5VTEw7CiAJaW50IGVyciA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9xdWV1ZS5jIGIvZHJpdmVycy9jb25uZWN0b3IvY25fcXVldWUuYwppbmRleCA0YTFkZmUxLi4yMTAzMzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9xdWV1ZS5jCisrKyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3F1ZXVlLmMKQEAgLTc4LDE4ICs3OCwyMCBAQAogCXN0cnVjdCBjbl9jYWxsYmFja19lbnRyeSAqY2JxID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjbl9jYWxsYmFja19lbnRyeSwgd29yayk7CiAJc3RydWN0IGNuX2NhbGxiYWNrX2RhdGEgKmQgPSAmY2JxLT5kYXRhOworCXN0cnVjdCBjbl9tc2cgKm1zZyA9IE5MTVNHX0RBVEEobmxtc2dfaGRyKGQtPnNrYikpOworCXN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqbnNwID0gJk5FVExJTktfQ0IoZC0+c2tiKTsKIAotCWQtPmNhbGxiYWNrKGQtPmNhbGxiYWNrX3ByaXYpOworCWQtPmNhbGxiYWNrKG1zZywgbnNwKTsKIAotCWQtPmRlc3RydWN0X2RhdGEoZC0+ZGRhdGEpOwotCWQtPmRkYXRhID0gTlVMTDsKKwlrZnJlZV9za2IoZC0+c2tiKTsKKwlkLT5za2IgPSBOVUxMOwogCiAJa2ZyZWUoZC0+ZnJlZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY25fY2FsbGJhY2tfZW50cnkgKgogY25fcXVldWVfYWxsb2NfY2FsbGJhY2tfZW50cnkoY2hhciAqbmFtZSwgc3RydWN0IGNiX2lkICppZCwKLQkJCSAgICAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGNuX21zZyAqKSkKKwkJCSAgICAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGNuX21zZyAqLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKikpCiB7CiAJc3RydWN0IGNuX2NhbGxiYWNrX2VudHJ5ICpjYnE7CiAKQEAgLTEyMyw3ICsxMjUsNyBAQAogfQogCiBpbnQgY25fcXVldWVfYWRkX2NhbGxiYWNrKHN0cnVjdCBjbl9xdWV1ZV9kZXYgKmRldiwgY2hhciAqbmFtZSwgc3RydWN0IGNiX2lkICppZCwKLQkJCSAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgY25fbXNnICopKQorCQkJICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBjbl9tc2cgKiwgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICopKQogewogCXN0cnVjdCBjbl9jYWxsYmFja19lbnRyeSAqY2JxLCAqX19jYnE7CiAJaW50IGZvdW5kID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKaW5kZXggNzRmNTJhZi4uZjA2MDI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKQEAgLTEyOSwyMSArMTI5LDE5IEBACiAvKgogICogQ2FsbGJhY2sgaGVscGVyIC0gcXVldWVzIHdvcmsgYW5kIHNldHVwIGRlc3RydWN0b3IgZm9yIGdpdmVuIGRhdGEuCiAgKi8KLXN0YXRpYyBpbnQgY25fY2FsbF9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2csIHZvaWQgKCpkZXN0cnVjdF9kYXRhKSh2b2lkICopLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBjbl9jYWxsX2NhbGxiYWNrKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGNuX2NhbGxiYWNrX2VudHJ5ICpfX2NicSwgKl9fbmV3X2NicTsKIAlzdHJ1Y3QgY25fZGV2ICpkZXYgPSAmY2RldjsKKwlzdHJ1Y3QgY25fbXNnICptc2cgPSBOTE1TR19EQVRBKG5sbXNnX2hkcihza2IpKTsKIAlpbnQgZXJyID0gLUVOT0RFVjsKIAogCXNwaW5fbG9ja19iaCgmZGV2LT5jYmRldi0+cXVldWVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2NicSwgJmRldi0+Y2JkZXYtPnF1ZXVlX2xpc3QsIGNhbGxiYWNrX2VudHJ5KSB7CiAJCWlmIChjbl9jYl9lcXVhbCgmX19jYnEtPmlkLmlkLCAmbXNnLT5pZCkpIHsKIAkJCWlmIChsaWtlbHkoIXdvcmtfcGVuZGluZygmX19jYnEtPndvcmspICYmCi0JCQkJCV9fY2JxLT5kYXRhLmRkYXRhID09IE5VTEwpKSB7Ci0JCQkJX19jYnEtPmRhdGEuY2FsbGJhY2tfcHJpdiA9IG1zZzsKLQotCQkJCV9fY2JxLT5kYXRhLmRkYXRhID0gZGF0YTsKLQkJCQlfX2NicS0+ZGF0YS5kZXN0cnVjdF9kYXRhID0gZGVzdHJ1Y3RfZGF0YTsKKwkJCQkJX19jYnEtPmRhdGEuc2tiID09IE5VTEwpKSB7CisJCQkJX19jYnEtPmRhdGEuc2tiID0gc2tiOwogCiAJCQkJaWYgKHF1ZXVlX2NuX3dvcmsoX19jYnEsICZfX2NicS0+d29yaykpCiAJCQkJCWVyciA9IDA7CkBAIC0xNTYsMTAgKzE1NCw4IEBACiAJCQkJX19uZXdfY2JxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNuX2NhbGxiYWNrX2VudHJ5KSwgR0ZQX0FUT01JQyk7CiAJCQkJaWYgKF9fbmV3X2NicSkgewogCQkJCQlkID0gJl9fbmV3X2NicS0+ZGF0YTsKLQkJCQkJZC0+Y2FsbGJhY2tfcHJpdiA9IG1zZzsKKwkJCQkJZC0+c2tiID0gc2tiOwogCQkJCQlkLT5jYWxsYmFjayA9IF9fY2JxLT5kYXRhLmNhbGxiYWNrOwotCQkJCQlkLT5kZGF0YSA9IGRhdGE7Ci0JCQkJCWQtPmRlc3RydWN0X2RhdGEgPSBkZXN0cnVjdF9kYXRhOwogCQkJCQlkLT5mcmVlID0gX19uZXdfY2JxOwogCiAJCQkJCV9fbmV3X2NicS0+cGRldiA9IF9fY2JxLT5wZGV2OwpAQCAtMTkxLDcgKzE4Nyw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNuX3J4X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqX19za2IpCiB7Ci0Jc3RydWN0IGNuX21zZyAqbXNnOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCWludCBlcnI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTIwOCw4ICsyMDMsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJbXNnID0gTkxNU0dfREFUQShubGgpOwotCQllcnIgPSBjbl9jYWxsX2NhbGxiYWNrKG1zZywgKHZvaWQgKCopKHZvaWQgKikpa2ZyZWVfc2tiLCBza2IpOworCQllcnIgPSBjbl9jYWxsX2NhbGxiYWNrKHNrYik7CiAJCWlmIChlcnIgPCAwKQogCQkJa2ZyZWVfc2tiKHNrYik7CiAJfQpAQCAtMjcwLDcgKzI2NCw3IEBACiAgKiBNYXkgc2xlZXAuCiAgKi8KIGludCBjbl9hZGRfY2FsbGJhY2soc3RydWN0IGNiX2lkICppZCwgY2hhciAqbmFtZSwKLQkJICAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGNuX21zZyAqKSkKKwkJICAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGNuX21zZyAqLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKikpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgY25fZGV2ICpkZXYgPSAmY2RldjsKQEAgLTM1Miw3ICszNDYsNyBAQAogICoKICAqIFVzZWQgZm9yIG5vdGlmaWNhdGlvbiBvZiBhIHJlcXVlc3QncyBwcm9jZXNzaW5nLgogICovCi1zdGF0aWMgdm9pZCBjbl9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2cpCitzdGF0aWMgdm9pZCBjbl9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2csIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqbnNwKQogewogCXN0cnVjdCBjbl9jdGxfbXNnICpjdGw7CiAJc3RydWN0IGNuX2N0bF9lbnRyeSAqZW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKaW5kZXggYWQ0MWYxOS4uMTJmZGQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCkBAIC03Niw4ICs3NiwxMSBAQAogI2VuZGlmCiAJLyogYXNrIHRoZSBnb3Zlcm5vciBmb3IgdGhlIG5leHQgc3RhdGUgKi8KIAluZXh0X3N0YXRlID0gY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5zZWxlY3QoZGV2KTsKLQlpZiAobmVlZF9yZXNjaGVkKCkpCisJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJcmV0dXJuOworCX0KKwogCXRhcmdldF9zdGF0ZSA9ICZkZXYtPnN0YXRlc1tuZXh0X3N0YXRlXTsKIAogCS8qIGVudGVyIHRoZSBzdGF0ZSBhbmQgdXBkYXRlIHN0YXRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLXNoYS5jIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1zaGEuYwppbmRleCA3NmNiNmIzLi4wYWY4MDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLXNoYS5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stc2hhLmMKQEAgLTI0LDYgKzI0LDEyIEBACiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlICJwYWRsb2NrLmgiCiAKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgU1RBQ0tfQUxJR04gMTYKKyNlbHNlCisjZGVmaW5lIFNUQUNLX0FMSUdOIDQKKyNlbmRpZgorCiBzdHJ1Y3QgcGFkbG9ja19zaGFfZGVzYyB7CiAJc3RydWN0IHNoYXNoX2Rlc2MgZmFsbGJhY2s7CiB9OwpAQCAtNjQsNyArNzAsOSBAQAogCS8qIFdlIGNhbid0IHN0b3JlIGRpcmVjdGx5IHRvICpvdXQgYXMgaXQgbWF5IGJlIHVuYWxpZ25lZC4gKi8KIAkvKiBCVFcgRG9uJ3QgcmVkdWNlIHRoZSBidWZmZXIgc2l6ZSBiZWxvdyAxMjggQnl0ZXMhCiAJICogICAgIFBhZExvY2sgbWljcm9jb2RlIG5lZWRzIGl0IHRoYXQgYmlnLiAqLwotCWNoYXIgcmVzdWx0WzEyOF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoUEFETE9DS19BTElHTk1FTlQpKSk7CisJY2hhciBidWZbMTI4ICsgUEFETE9DS19BTElHTk1FTlQgLSBTVEFDS19BTElHTl0gX19hdHRyaWJ1dGVfXworCQkoKGFsaWduZWQoU1RBQ0tfQUxJR04pKSk7CisJY2hhciAqcmVzdWx0ID0gUFRSX0FMSUdOKCZidWZbMF0sIFBBRExPQ0tfQUxJR05NRU5UKTsKIAlzdHJ1Y3QgcGFkbG9ja19zaGFfZGVzYyAqZGN0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwogCXN0cnVjdCBzaGExX3N0YXRlIHN0YXRlOwogCXVuc2lnbmVkIGludCBzcGFjZTsKQEAgLTEyOCw3ICsxMzYsOSBAQAogCS8qIFdlIGNhbid0IHN0b3JlIGRpcmVjdGx5IHRvICpvdXQgYXMgaXQgbWF5IGJlIHVuYWxpZ25lZC4gKi8KIAkvKiBCVFcgRG9uJ3QgcmVkdWNlIHRoZSBidWZmZXIgc2l6ZSBiZWxvdyAxMjggQnl0ZXMhCiAJICogICAgIFBhZExvY2sgbWljcm9jb2RlIG5lZWRzIGl0IHRoYXQgYmlnLiAqLwotCWNoYXIgcmVzdWx0WzEyOF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoUEFETE9DS19BTElHTk1FTlQpKSk7CisJY2hhciBidWZbMTI4ICsgUEFETE9DS19BTElHTk1FTlQgLSBTVEFDS19BTElHTl0gX19hdHRyaWJ1dGVfXworCQkoKGFsaWduZWQoU1RBQ0tfQUxJR04pKSk7CisJY2hhciAqcmVzdWx0ID0gUFRSX0FMSUdOKCZidWZbMF0sIFBBRExPQ0tfQUxJR05NRU5UKTsKIAlzdHJ1Y3QgcGFkbG9ja19zaGFfZGVzYyAqZGN0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwogCXN0cnVjdCBzaGEyNTZfc3RhdGUgc3RhdGU7CiAJdW5zaWduZWQgaW50IHNwYWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kY2EvZGNhLWNvcmUuYyBiL2RyaXZlcnMvZGNhL2RjYS1jb3JlLmMKaW5kZXggMjViNzQzYS4uNTJlNmJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kY2EvZGNhLWNvcmUuYworKysgYi9kcml2ZXJzL2RjYS9kY2EtY29yZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGNhLmg+CiAKLSNkZWZpbmUgRENBX1ZFUlNJT04gIjEuOCIKKyNkZWZpbmUgRENBX1ZFUlNJT04gIjEuMTIuMSIKIAogTU9EVUxFX1ZFUlNJT04oRENBX1ZFUlNJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMzYsMjAgKzM2LDkyIEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGNhX2xvY2spOwogCi1zdGF0aWMgTElTVF9IRUFEKGRjYV9wcm92aWRlcnMpOworc3RhdGljIExJU1RfSEVBRChkY2FfZG9tYWlucyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2J1cyAqZGNhX3BjaV9yY19mcm9tX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHBjaV9idXMgKmJ1cyA9IHBkZXYtPmJ1czsKKworCXdoaWxlIChidXMtPnBhcmVudCkKKwkJYnVzID0gYnVzLT5wYXJlbnQ7CisKKwlyZXR1cm4gYnVzOworfQorCitzdGF0aWMgc3RydWN0IGRjYV9kb21haW4gKmRjYV9hbGxvY2F0ZV9kb21haW4oc3RydWN0IHBjaV9idXMgKnJjKQoreworCXN0cnVjdCBkY2FfZG9tYWluICpkb21haW47CisKKwlkb21haW4gPSBremFsbG9jKHNpemVvZigqZG9tYWluKSwgR0ZQX05PV0FJVCk7CisJaWYgKCFkb21haW4pCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJmRvbWFpbi0+ZGNhX3Byb3ZpZGVycyk7CisJZG9tYWluLT5wY2lfcmMgPSByYzsKKworCXJldHVybiBkb21haW47Cit9CisKK3N0YXRpYyB2b2lkIGRjYV9mcmVlX2RvbWFpbihzdHJ1Y3QgZGNhX2RvbWFpbiAqZG9tYWluKQoreworCWxpc3RfZGVsKCZkb21haW4tPm5vZGUpOworCWtmcmVlKGRvbWFpbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGNhX2RvbWFpbiAqZGNhX2ZpbmRfZG9tYWluKHN0cnVjdCBwY2lfYnVzICpyYykKK3sKKwlzdHJ1Y3QgZGNhX2RvbWFpbiAqZG9tYWluOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkb21haW4sICZkY2FfZG9tYWlucywgbm9kZSkKKwkJaWYgKGRvbWFpbi0+cGNpX3JjID09IHJjKQorCQkJcmV0dXJuIGRvbWFpbjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRjYV9kb21haW4gKmRjYV9nZXRfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcmM7CisJc3RydWN0IGRjYV9kb21haW4gKmRvbWFpbjsKKworCXJjID0gZGNhX3BjaV9yY19mcm9tX2RldihkZXYpOworCWRvbWFpbiA9IGRjYV9maW5kX2RvbWFpbihyYyk7CisKKwlpZiAoIWRvbWFpbikgeworCQlkb21haW4gPSBkY2FfYWxsb2NhdGVfZG9tYWluKHJjKTsKKwkJaWYgKGRvbWFpbikKKwkJCWxpc3RfYWRkKCZkb21haW4tPm5vZGUsICZkY2FfZG9tYWlucyk7CisJfQorCisJcmV0dXJuIGRvbWFpbjsKK30KIAogc3RhdGljIHN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYV9maW5kX3Byb3ZpZGVyX2J5X2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRjYV9wcm92aWRlciAqZGNhLCAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgZGNhX3Byb3ZpZGVyICpkY2E7CisJc3RydWN0IHBjaV9idXMgKnJjOworCXN0cnVjdCBkY2FfZG9tYWluICpkb21haW47CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjYSwgJmRjYV9wcm92aWRlcnMsIG5vZGUpIHsKLQkJaWYgKCghZGV2KSB8fCAoZGNhLT5vcHMtPmRldl9tYW5hZ2VkKGRjYSwgZGV2KSkpIHsKLQkJCXJldCA9IGRjYTsKLQkJCWJyZWFrOwotCQl9CisJaWYgKGRldikgeworCQlyYyA9IGRjYV9wY2lfcmNfZnJvbV9kZXYoZGV2KTsKKwkJZG9tYWluID0gZGNhX2ZpbmRfZG9tYWluKHJjKTsKKwkJaWYgKCFkb21haW4pCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQlpZiAoIWxpc3RfZW1wdHkoJmRjYV9kb21haW5zKSkKKwkJCWRvbWFpbiA9IGxpc3RfZmlyc3RfZW50cnkoJmRjYV9kb21haW5zLAorCQkJCQkJICBzdHJ1Y3QgZGNhX2RvbWFpbiwKKwkJCQkJCSAgbm9kZSk7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOwogCX0KIAotCXJldHVybiByZXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkY2EsICZkb21haW4tPmRjYV9wcm92aWRlcnMsIG5vZGUpCisJCWlmICgoIWRldikgfHwgKGRjYS0+b3BzLT5kZXZfbWFuYWdlZChkY2EsIGRldikpKQorCQkJcmV0dXJuIGRjYTsKKworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTYxLDYgKzEzMyw4IEBACiAJc3RydWN0IGRjYV9wcm92aWRlciAqZGNhOwogCWludCBlcnIsIHNsb3QgPSAtRU5PREVWOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBjaV9idXMgKnBjaV9yYzsKKwlzdHJ1Y3QgZGNhX2RvbWFpbiAqZG9tYWluOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNzQsNyArMTQ4LDE0IEBACiAJCXJldHVybiAtRUVYSVNUOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGNhLCAmZGNhX3Byb3ZpZGVycywgbm9kZSkgeworCXBjaV9yYyA9IGRjYV9wY2lfcmNfZnJvbV9kZXYoZGV2KTsKKwlkb21haW4gPSBkY2FfZmluZF9kb21haW4ocGNpX3JjKTsKKwlpZiAoIWRvbWFpbikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkY2FfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjYSwgJmRvbWFpbi0+ZGNhX3Byb3ZpZGVycywgbm9kZSkgewogCQlzbG90ID0gZGNhLT5vcHMtPmFkZF9yZXF1ZXN0ZXIoZGNhLCBkZXYpOwogCQlpZiAoc2xvdCA+PSAwKQogCQkJYnJlYWs7CkBAIC0yMjIsMTMgKzMwMywxOSBAQAogewogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZGNhX2RvbWFpbiAqZG9tYWluOwogCiAJZXJyID0gZGNhX3N5c2ZzX2FkZF9wcm92aWRlcihkY2EsIGRldik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkY2FfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkKCZkY2EtPm5vZGUsICZkY2FfcHJvdmlkZXJzKTsKKwlkb21haW4gPSBkY2FfZ2V0X2RvbWFpbihkZXYpOworCWlmICghZG9tYWluKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRjYV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlsaXN0X2FkZCgmZGNhLT5ub2RlLCAmZG9tYWluLT5kY2FfcHJvdmlkZXJzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkY2FfbG9jaywgZmxhZ3MpOwogCiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGNhX3Byb3ZpZGVyX2NoYWluLApAQCAtMjQxLDE1ICszMjgsMjQgQEAKICAqIHVucmVnaXN0ZXJfZGNhX3Byb3ZpZGVyIC0gcmVtb3ZlIGEgZGNhIHByb3ZpZGVyCiAgKiBAZGNhIC0gc3RydWN0IGNyZWF0ZWQgYnkgYWxsb2NfZGNhX3Byb3ZpZGVyKCkKICAqLwotdm9pZCB1bnJlZ2lzdGVyX2RjYV9wcm92aWRlcihzdHJ1Y3QgZGNhX3Byb3ZpZGVyICpkY2EpCit2b2lkIHVucmVnaXN0ZXJfZGNhX3Byb3ZpZGVyKHN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYSwgc3RydWN0IGRldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBjaV9idXMgKnBjaV9yYzsKKwlzdHJ1Y3QgZGNhX2RvbWFpbiAqZG9tYWluOwogCiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGNhX3Byb3ZpZGVyX2NoYWluLAogCQkJCSAgICAgRENBX1BST1ZJREVSX1JFTU9WRSwgTlVMTCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGNhX2xvY2ssIGZsYWdzKTsKKwogCWxpc3RfZGVsKCZkY2EtPm5vZGUpOworCisJcGNpX3JjID0gZGNhX3BjaV9yY19mcm9tX2RldihkZXYpOworCWRvbWFpbiA9IGRjYV9maW5kX2RvbWFpbihwY2lfcmMpOworCWlmIChsaXN0X2VtcHR5KCZkb21haW4tPmRjYV9wcm92aWRlcnMpKQorCQlkY2FfZnJlZV9kb21haW4oZG9tYWluKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRjYV9sb2NrLCBmbGFncyk7CiAKIAlkY2Ffc3lzZnNfcmVtb3ZlX3Byb3ZpZGVyKGRjYSk7CkBAIC0yNzYsNyArMzcyLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZGNhX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9FUlIgImRjYSBzZXJ2aWNlIHN0YXJ0ZWQsIHZlcnNpb24gJXNcbiIsIERDQV9WRVJTSU9OKTsKKwlwcl9pbmZvKCJkY2Egc2VydmljZSBzdGFydGVkLCB2ZXJzaW9uICVzXG4iLCBEQ0FfVkVSU0lPTik7CiAJcmV0dXJuIGRjYV9zeXNmc19pbml0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IDgxZTEwMjAuLjU5MDNhODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMTcsMTEgKzE3LDE1IEBACiAKIGNvbW1lbnQgIkRNQSBEZXZpY2VzIgogCitjb25maWcgQVNZTkNfVFhfRElTQUJMRV9DSEFOTkVMX1NXSVRDSAorCWJvb2wKKwogY29uZmlnIElOVEVMX0lPQVRETUEKIAl0cmlzdGF0ZSAiSW50ZWwgSS9PQVQgRE1BIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2CiAJc2VsZWN0IERNQV9FTkdJTkUKIAlzZWxlY3QgRENBCisJc2VsZWN0IEFTWU5DX1RYX0RJU0FCTEVfQ0hBTk5FTF9TV0lUQ0gKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEludGVsKFIpIEkvT0FUIERNQSBlbmdpbmUgcHJlc2VudAogCSAgaW4gcmVjZW50IEludGVsIFhlb24gY2hpcHNldHMuCkBAIC05Nyw2ICsxMDEsMTQgQEAKIAkgIFN1cHBvcnQgdGhlIFRYeDkgU29DIGludGVybmFsIERNQSBjb250cm9sbGVyLiAgVGhpcyBjYW4gYmUKIAkgIGludGVncmF0ZWQgaW4gY2hpcHMgc3VjaCBhcyB0aGUgVG9zaGliYSBUWDQ5MjcvMzgvMzkuCiAKK2NvbmZpZyBTSF9ETUFFCisJdHJpc3RhdGUgIlJlbmVzYXMgU3VwZXJIIERNQUMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNVUEVSSCAmJiBTSF9ETUEKKwlkZXBlbmRzIG9uICFTSF9ETUFfQVBJCisJc2VsZWN0IERNQV9FTkdJTkUKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFJlbmVzYXMgU3VwZXJIIERNQSBjb250cm9sbGVycy4KKwogY29uZmlnIERNQV9FTkdJTkUKIAlib29sCiAKQEAgLTExNiw3ICsxMjgsNyBAQAogCiBjb25maWcgQVNZTkNfVFhfRE1BCiAJYm9vbCAiQXN5bmNfdHg6IE9mZmxvYWQgc3VwcG9ydCBmb3IgdGhlIGFzeW5jX3R4IGFwaSIKLQlkZXBlbmRzIG9uIERNQV9FTkdJTkUgJiYgIUhJR0hNRU02NEcKKwlkZXBlbmRzIG9uIERNQV9FTkdJTkUKIAloZWxwCiAJICBUaGlzIGFsbG93cyB0aGUgYXN5bmNfdHggYXBpIHRvIHRha2UgYWR2YW50YWdlIG9mIG9mZmxvYWQgZW5naW5lcyBmb3IKIAkgIG1lbWNweSwgbWVtc2V0LCB4b3IsIGFuZCByYWlkNiBwK3Egb3BlcmF0aW9ucy4gIElmIHlvdXIgcGxhdGZvcm0gaGFzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9NYWtlZmlsZSBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCmluZGV4IDQwZTFlMDAuLmVjYTcxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCkBAIC0xLDggKzEsNyBAQAogb2JqLSQoQ09ORklHX0RNQV9FTkdJTkUpICs9IGRtYWVuZ2luZS5vCiBvYmotJChDT05GSUdfTkVUX0RNQSkgKz0gaW92bG9jay5vCiBvYmotJChDT05GSUdfRE1BVEVTVCkgKz0gZG1hdGVzdC5vCi1vYmotJChDT05GSUdfSU5URUxfSU9BVERNQSkgKz0gaW9hdGRtYS5vCi1pb2F0ZG1hLW9ianMgOj0gaW9hdC5vIGlvYXRfZG1hLm8gaW9hdF9kY2Eubworb2JqLSQoQ09ORklHX0lOVEVMX0lPQVRETUEpICs9IGlvYXQvCiBvYmotJChDT05GSUdfSU5URUxfSU9QX0FETUEpICs9IGlvcC1hZG1hLm8KIG9iai0kKENPTkZJR19GU0xfRE1BKSArPSBmc2xkbWEubwogb2JqLSQoQ09ORklHX01WX1hPUikgKz0gbXZfeG9yLm8KQEAgLTEwLDMgKzksNCBAQAogb2JqLSQoQ09ORklHX0FUX0hETUFDKSArPSBhdF9oZG1hYy5vCiBvYmotJChDT05GSUdfTVgzX0lQVSkgKz0gaXB1Lwogb2JqLSQoQ09ORklHX1RYWDlfRE1BQykgKz0gdHh4OWRtYWMubworb2JqLSQoQ09ORklHX1NIX0RNQUUpICs9IHNoZG1hLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMgYi9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCmluZGV4IGM4NTIyZTYuLjc1ODVjNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvYXRfaGRtYWMuYwpAQCAtODcsNiArODcsNyBAQAogCWRlc2MgPSBkbWFfcG9vbF9hbGxvYyhhdGRtYS0+ZG1hX2Rlc2NfcG9vbCwgZ2ZwX2ZsYWdzLCAmcGh5cyk7CiAJaWYgKGRlc2MpIHsKIAkJbWVtc2V0KGRlc2MsIDAsIHNpemVvZihzdHJ1Y3QgYXRfZGVzYykpOworCQlJTklUX0xJU1RfSEVBRCgmZGVzYy0+dHhfbGlzdCk7CiAJCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmRlc2MtPnR4ZCwgY2hhbik7CiAJCS8qIHR4ZC5mbGFncyB3aWxsIGJlIG92ZXJ3cml0dGVuIGluIHByZXAgZnVuY3Rpb25zICovCiAJCWRlc2MtPnR4ZC5mbGFncyA9IERNQV9DVFJMX0FDSzsKQEAgLTE1MCwxMSArMTUxLDExIEBACiAJCXN0cnVjdCBhdF9kZXNjICpjaGlsZDsKIAogCQlzcGluX2xvY2tfYmgoJmF0Y2hhbi0+bG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eGQudHhfbGlzdCwgZGVzY19ub2RlKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhfbGlzdCwgZGVzY19ub2RlKQogCQkJZGV2X3ZkYmcoY2hhbjJkZXYoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAogCQkJCQkibW92aW5nIGNoaWxkIGRlc2MgJXAgdG8gZnJlZWxpc3RcbiIsCiAJCQkJCWNoaWxkKTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmZGVzYy0+dHhkLnR4X2xpc3QsICZhdGNoYW4tPmZyZWVfbGlzdCk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmRlc2MtPnR4X2xpc3QsICZhdGNoYW4tPmZyZWVfbGlzdCk7CiAJCWRldl92ZGJnKGNoYW4yZGV2KCZhdGNoYW4tPmNoYW5fY29tbW9uKSwKIAkJCSAibW92aW5nIGRlc2MgJXAgdG8gZnJlZWxpc3RcbiIsIGRlc2MpOwogCQlsaXN0X2FkZCgmZGVzYy0+ZGVzY19ub2RlLCAmYXRjaGFuLT5mcmVlX2xpc3QpOwpAQCAtMjQ3LDMwICsyNDgsMzMgQEAKIAlwYXJhbSA9IHR4ZC0+Y2FsbGJhY2tfcGFyYW07CiAKIAkvKiBtb3ZlIGNoaWxkcmVuIHRvIGZyZWVfbGlzdCAqLwotCWxpc3Rfc3BsaWNlX2luaXQoJnR4ZC0+dHhfbGlzdCwgJmF0Y2hhbi0+ZnJlZV9saXN0KTsKKwlsaXN0X3NwbGljZV9pbml0KCZkZXNjLT50eF9saXN0LCAmYXRjaGFuLT5mcmVlX2xpc3QpOwogCS8qIG1vdmUgbXlzZWxmIHRvIGZyZWVfbGlzdCAqLwogCWxpc3RfbW92ZSgmZGVzYy0+ZGVzY19ub2RlLCAmYXRjaGFuLT5mcmVlX2xpc3QpOwogCiAJLyogdW5tYXAgZG1hIGFkZHJlc3NlcyAqLwotCWlmICghKHR4ZC0+ZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKSkgewotCQlpZiAodHhkLT5mbGFncyAmIERNQV9DT01QTF9ERVNUX1VOTUFQX1NJTkdMRSkKLQkJCWRtYV91bm1hcF9zaW5nbGUoY2hhbjJwYXJlbnQoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAotCQkJCQlkZXNjLT5sbGkuZGFkZHIsCi0JCQkJCWRlc2MtPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKLQkJZWxzZQotCQkJZG1hX3VubWFwX3BhZ2UoY2hhbjJwYXJlbnQoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAotCQkJCQlkZXNjLT5sbGkuZGFkZHIsCi0JCQkJCWRlc2MtPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKLQl9Ci0JaWYgKCEodHhkLT5mbGFncyAmIERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCkpIHsKLQkJaWYgKHR4ZC0+ZmxhZ3MgJiBETUFfQ09NUExfU1JDX1VOTUFQX1NJTkdMRSkKLQkJCWRtYV91bm1hcF9zaW5nbGUoY2hhbjJwYXJlbnQoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAotCQkJCQlkZXNjLT5sbGkuc2FkZHIsCi0JCQkJCWRlc2MtPmxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JCWVsc2UKLQkJCWRtYV91bm1hcF9wYWdlKGNoYW4ycGFyZW50KCZhdGNoYW4tPmNoYW5fY29tbW9uKSwKLQkJCQkJZGVzYy0+bGxpLnNhZGRyLAotCQkJCQlkZXNjLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCWlmICghYXRjaGFuLT5jaGFuX2NvbW1vbi5wcml2YXRlKSB7CisJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGNoYW4ycGFyZW50KCZhdGNoYW4tPmNoYW5fY29tbW9uKTsKKwkJaWYgKCEodHhkLT5mbGFncyAmIERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApKSB7CisJCQlpZiAodHhkLT5mbGFncyAmIERNQV9DT01QTF9ERVNUX1VOTUFQX1NJTkdMRSkKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKHBhcmVudCwKKwkJCQkJCWRlc2MtPmxsaS5kYWRkciwKKwkJCQkJCWRlc2MtPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwkJCWVsc2UKKwkJCQlkbWFfdW5tYXBfcGFnZShwYXJlbnQsCisJCQkJCQlkZXNjLT5sbGkuZGFkZHIsCisJCQkJCQlkZXNjLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7CisJCX0KKwkJaWYgKCEodHhkLT5mbGFncyAmIERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCkpIHsKKwkJCWlmICh0eGQtPmZsYWdzICYgRE1BX0NPTVBMX1NSQ19VTk1BUF9TSU5HTEUpCisJCQkJZG1hX3VubWFwX3NpbmdsZShwYXJlbnQsCisJCQkJCQlkZXNjLT5sbGkuc2FkZHIsCisJCQkJCQlkZXNjLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCQkJZWxzZQorCQkJCWRtYV91bm1hcF9wYWdlKHBhcmVudCwKKwkJCQkJCWRlc2MtPmxsaS5zYWRkciwKKwkJCQkJCWRlc2MtPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCX0KIAl9CiAKIAkvKgpAQCAtMzM0LDcgKzMzOCw3IEBACiAJCQkvKiBUaGlzIG9uZSBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi8KIAkJCXJldHVybjsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhkLnR4X2xpc3QsIGRlc2Nfbm9kZSkKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmRlc2MtPnR4X2xpc3QsIGRlc2Nfbm9kZSkKIAkJCWlmICghKGNoaWxkLT5sbGkuY3RybGEgJiBBVENfRE9ORSkpCiAJCQkJLyogQ3VycmVudGx5IGluIHByb2dyZXNzICovCiAJCQkJcmV0dXJuOwpAQCAtNDA3LDcgKzQxMSw3IEBACiAJZGV2X2NyaXQoY2hhbjJkZXYoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAogCQkJIiAgY29va2llOiAlZFxuIiwgYmFkX2Rlc2MtPnR4ZC5jb29raWUpOwogCWF0Y19kdW1wX2xsaShhdGNoYW4sICZiYWRfZGVzYy0+bGxpKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmYmFkX2Rlc2MtPnR4ZC50eF9saXN0LCBkZXNjX25vZGUpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmJhZF9kZXNjLT50eF9saXN0LCBkZXNjX25vZGUpCiAJCWF0Y19kdW1wX2xsaShhdGNoYW4sICZjaGlsZC0+bGxpKTsKIAogCS8qIFByZXRlbmQgdGhlIGRlc2NyaXB0b3IgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLwpAQCAtNTg3LDcgKzU5MSw3IEBACiAJCQlwcmV2LT5sbGkuZHNjciA9IGRlc2MtPnR4ZC5waHlzOwogCQkJLyogaW5zZXJ0IHRoZSBsaW5rIGRlc2NyaXB0b3IgdG8gdGhlIExEIHJpbmcgKi8KIAkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwKLQkJCQkJJmZpcnN0LT50eGQudHhfbGlzdCk7CisJCQkJCSZmaXJzdC0+dHhfbGlzdCk7CiAJCX0KIAkJcHJldiA9IGRlc2M7CiAJfQpAQCAtNjQ2LDggKzY1MCw2IEBACiAKIAlyZWdfd2lkdGggPSBhdHNsYXZlLT5yZWdfd2lkdGg7CiAKLQlzZ19sZW4gPSBkbWFfbWFwX3NnKGNoYW4ycGFyZW50KGNoYW4pLCBzZ2wsIHNnX2xlbiwgZGlyZWN0aW9uKTsKLQogCWN0cmxhID0gQVRDX0RFRkFVTFRfQ1RSTEEgfCBhdHNsYXZlLT5jdHJsYTsKIAljdHJsYiA9IEFUQ19ERUZBVUxUX0NUUkxCIHwgQVRDX0lFTjsKIApAQCAtNjg3LDcgKzY4OSw3IEBACiAJCQkJcHJldi0+bGxpLmRzY3IgPSBkZXNjLT50eGQucGh5czsKIAkJCQkvKiBpbnNlcnQgdGhlIGxpbmsgZGVzY3JpcHRvciB0byB0aGUgTEQgcmluZyAqLwogCQkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwKLQkJCQkJCSZmaXJzdC0+dHhkLnR4X2xpc3QpOworCQkJCQkJJmZpcnN0LT50eF9saXN0KTsKIAkJCX0KIAkJCXByZXYgPSBkZXNjOwogCQkJdG90YWxfbGVuICs9IGxlbjsKQEAgLTcyOSw3ICs3MzEsNyBAQAogCQkJCXByZXYtPmxsaS5kc2NyID0gZGVzYy0+dHhkLnBoeXM7CiAJCQkJLyogaW5zZXJ0IHRoZSBsaW5rIGRlc2NyaXB0b3IgdG8gdGhlIExEIHJpbmcgKi8KIAkJCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5kZXNjX25vZGUsCi0JCQkJCQkmZmlyc3QtPnR4ZC50eF9saXN0KTsKKwkJCQkJCSZmaXJzdC0+dHhfbGlzdCk7CiAJCQl9CiAJCQlwcmV2ID0gZGVzYzsKIAkJCXRvdGFsX2xlbiArPSBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9hdF9oZG1hY19yZWdzLmggYi9kcml2ZXJzL2RtYS9hdF9oZG1hY19yZWdzLmgKaW5kZXggNGM5NzJhZi4uNDk1NDU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvYXRfaGRtYWNfcmVncy5oCisrKyBiL2RyaXZlcnMvZG1hL2F0X2hkbWFjX3JlZ3MuaApAQCAtMTY1LDYgKzE2NSw3IEBACiAJc3RydWN0IGF0X2xsaQkJCWxsaTsKIAogCS8qIFRIRU4gdmFsdWVzIGZvciBkcml2ZXIgaG91c2VrZWVwaW5nICovCisJc3RydWN0IGxpc3RfaGVhZAkJdHhfbGlzdDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJdHhkOwogCXN0cnVjdCBsaXN0X2hlYWQJCWRlc2Nfbm9kZTsKIAlzaXplX3QJCQkJbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwppbmRleCA1YTg3Mzg0Li5iZDBiMjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYworKysgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwpAQCAtNjA4LDYgKzYwOCw0MCBAQAogfQogRVhQT1JUX1NZTUJPTChkbWFlbmdpbmVfcHV0KTsKIAorc3RhdGljIGJvb2wgZGV2aWNlX2hhc19hbGxfdHhfdHlwZXMoc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZSkKK3sKKwkvKiBBIGRldmljZSB0aGF0IHNhdGlzZmllcyB0aGlzIHRlc3QgaGFzIGNoYW5uZWxzIHRoYXQgd2lsbCBuZXZlciBjYXVzZQorCSAqIGFuIGFzeW5jX3R4IGNoYW5uZWwgc3dpdGNoIGV2ZW50IGFzIGFsbCBwb3NzaWJsZSBvcGVyYXRpb24gdHlwZXMgY2FuCisJICogYmUgaGFuZGxlZC4KKwkgKi8KKwkjaWZkZWYgQ09ORklHX0FTWU5DX1RYX0RNQQorCWlmICghZG1hX2hhc19jYXAoRE1BX0lOVEVSUlVQVCwgZGV2aWNlLT5jYXBfbWFzaykpCisJCXJldHVybiBmYWxzZTsKKwkjZW5kaWYKKworCSNpZiBkZWZpbmVkKENPTkZJR19BU1lOQ19NRU1DUFkpIHx8IGRlZmluZWQoQ09ORklHX0FTWU5DX01FTUNQWV9NT0RVTEUpCisJaWYgKCFkbWFfaGFzX2NhcChETUFfTUVNQ1BZLCBkZXZpY2UtPmNhcF9tYXNrKSkKKwkJcmV0dXJuIGZhbHNlOworCSNlbmRpZgorCisJI2lmIGRlZmluZWQoQ09ORklHX0FTWU5DX01FTVNFVCkgfHwgZGVmaW5lZChDT05GSUdfQVNZTkNfTUVNU0VUX01PRFVMRSkKKwlpZiAoIWRtYV9oYXNfY2FwKERNQV9NRU1TRVQsIGRldmljZS0+Y2FwX21hc2spKQorCQlyZXR1cm4gZmFsc2U7CisJI2VuZGlmCisKKwkjaWYgZGVmaW5lZChDT05GSUdfQVNZTkNfWE9SKSB8fCBkZWZpbmVkKENPTkZJR19BU1lOQ19YT1JfTU9EVUxFKQorCWlmICghZG1hX2hhc19jYXAoRE1BX1hPUiwgZGV2aWNlLT5jYXBfbWFzaykpCisJCXJldHVybiBmYWxzZTsKKwkjZW5kaWYKKworCSNpZiBkZWZpbmVkKENPTkZJR19BU1lOQ19QUSkgfHwgZGVmaW5lZChDT05GSUdfQVNZTkNfUFFfTU9EVUxFKQorCWlmICghZG1hX2hhc19jYXAoRE1BX1BRLCBkZXZpY2UtPmNhcF9tYXNrKSkKKwkJcmV0dXJuIGZhbHNlOworCSNlbmRpZgorCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBpbnQgZ2V0X2RtYV9pZChzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlKQogewogCWludCByYzsKQEAgLTY0NCw4ICs2NzgsMTIgQEAKIAkJIWRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweSk7CiAJQlVHX09OKGRtYV9oYXNfY2FwKERNQV9YT1IsIGRldmljZS0+Y2FwX21hc2spICYmCiAJCSFkZXZpY2UtPmRldmljZV9wcmVwX2RtYV94b3IpOwotCUJVR19PTihkbWFfaGFzX2NhcChETUFfWkVST19TVU0sIGRldmljZS0+Y2FwX21hc2spICYmCi0JCSFkZXZpY2UtPmRldmljZV9wcmVwX2RtYV96ZXJvX3N1bSk7CisJQlVHX09OKGRtYV9oYXNfY2FwKERNQV9YT1JfVkFMLCBkZXZpY2UtPmNhcF9tYXNrKSAmJgorCQkhZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfeG9yX3ZhbCk7CisJQlVHX09OKGRtYV9oYXNfY2FwKERNQV9QUSwgZGV2aWNlLT5jYXBfbWFzaykgJiYKKwkJIWRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX3BxKTsKKwlCVUdfT04oZG1hX2hhc19jYXAoRE1BX1BRX1ZBTCwgZGV2aWNlLT5jYXBfbWFzaykgJiYKKwkJIWRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX3BxX3ZhbCk7CiAJQlVHX09OKGRtYV9oYXNfY2FwKERNQV9NRU1TRVQsIGRldmljZS0+Y2FwX21hc2spICYmCiAJCSFkZXZpY2UtPmRldmljZV9wcmVwX2RtYV9tZW1zZXQpOwogCUJVR19PTihkbWFfaGFzX2NhcChETUFfSU5URVJSVVBULCBkZXZpY2UtPmNhcF9tYXNrKSAmJgpAQCAtNjYxLDYgKzY5OSwxMiBAQAogCUJVR19PTighZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyk7CiAJQlVHX09OKCFkZXZpY2UtPmRldik7CiAKKwkvKiBub3RlOiB0aGlzIG9ubHkgbWF0dGVycyBpbiB0aGUKKwkgKiBDT05GSUdfQVNZTkNfVFhfRElTQUJMRV9DSEFOTkVMX1NXSVRDSD15IGNhc2UKKwkgKi8KKwlpZiAoZGV2aWNlX2hhc19hbGxfdHhfdHlwZXMoZGV2aWNlKSkKKwkJZG1hX2NhcF9zZXQoRE1BX0FTWU5DX1RYLCBkZXZpY2UtPmNhcF9tYXNrKTsKKwogCWlkcl9yZWYgPSBrbWFsbG9jKHNpemVvZigqaWRyX3JlZiksIEdGUF9LRVJORUwpOwogCWlmICghaWRyX3JlZikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC05MzMsNTUgKzk3NywyOSBAQAogewogCXR4LT5jaGFuID0gY2hhbjsKIAlzcGluX2xvY2tfaW5pdCgmdHgtPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZ0eC0+dHhfbGlzdCk7CiB9CiBFWFBPUlRfU1lNQk9MKGRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQpOwogCiAvKiBkbWFfd2FpdF9mb3JfYXN5bmNfdHggLSBzcGluIHdhaXQgZm9yIGEgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUKICAqIEB0eDogaW4tZmxpZ2h0IHRyYW5zYWN0aW9uIHRvIHdhaXQgb24KLSAqCi0gKiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHR4IHdhcyBvYnRhaW5lZCBmcm9tIGEgY2FsbCB0byBhc3luY19tZW1jcHksCi0gKiBhc3luY194b3IsIGFzeW5jX21lbXNldCwgZXRjIHdoaWNoIGVuc3VyZXMgdGhhdCB0eCBpcyAiaW4tZmxpZ2h0IiAocHJlcHBlZAotICogYW5kIHN1Ym1pdHRlZCkuICBXYWxraW5nIHRoZSBwYXJlbnQgY2hhaW4gaXMgb25seSBtZWFudCB0byBjb3ZlciBmb3IgRE1BCi0gKiBkcml2ZXJzIHRoYXQgZG8gbm90IGltcGxlbWVudCB0aGUgRE1BX0lOVEVSUlVQVCBjYXBhYmlsaXR5IGFuZCBtYXkgcmFjZSB3aXRoCi0gKiB0aGUgZHJpdmVyJ3MgZGVzY3JpcHRvciBjbGVhbnVwIHJvdXRpbmUuCiAgKi8KIGVudW0gZG1hX3N0YXR1cwogZG1hX3dhaXRfZm9yX2FzeW5jX3R4KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpCiB7Ci0JZW51bSBkbWFfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKml0ZXI7Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpwYXJlbnQ7CisJdW5zaWduZWQgbG9uZyBkbWFfc3luY193YWl0X3RpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDAwKTsKIAogCWlmICghdHgpCiAJCXJldHVybiBETUFfU1VDQ0VTUzsKIAotCVdBUk5fT05DRSh0eC0+cGFyZW50LCAiJXM6IHNwZWN1bGF0aXZlbHkgd2Fsa2luZyBkZXBlbmRlbmN5IGNoYWluIGZvciIKLQkJICAiICVzXG4iLCBfX2Z1bmNfXywgZG1hX2NoYW5fbmFtZSh0eC0+Y2hhbikpOwotCi0JLyogcG9sbCB0aHJvdWdoIHRoZSBkZXBlbmRlbmN5IGNoYWluLCByZXR1cm4gd2hlbiB0eCBpcyBjb21wbGV0ZSAqLwotCWRvIHsKLQkJaXRlciA9IHR4OwotCi0JCS8qIGZpbmQgdGhlIHJvb3Qgb2YgdGhlIHVuc3VibWl0dGVkIGRlcGVuZGVuY3kgY2hhaW4gKi8KLQkJZG8gewotCQkJcGFyZW50ID0gaXRlci0+cGFyZW50OwotCQkJaWYgKCFwYXJlbnQpCi0JCQkJYnJlYWs7Ci0JCQllbHNlCi0JCQkJaXRlciA9IHBhcmVudDsKLQkJfSB3aGlsZSAocGFyZW50KTsKLQotCQkvKiB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBmb3IgLT5wYXJlbnQgPT0gTlVMTCBhbmQKLQkJICogLT5jb29raWUgPT0gLUVCVVNZCi0JCSAqLwotCQl3aGlsZSAoaXRlci0+Y29va2llID09IC1FQlVTWSkKLQkJCWNwdV9yZWxheCgpOwotCi0JCXN0YXR1cyA9IGRtYV9zeW5jX3dhaXQoaXRlci0+Y2hhbiwgaXRlci0+Y29va2llKTsKLQl9IHdoaWxlIChzdGF0dXMgPT0gRE1BX0lOX1BST0dSRVNTIHx8IChpdGVyICE9IHR4KSk7Ci0KLQlyZXR1cm4gc3RhdHVzOworCXdoaWxlICh0eC0+Y29va2llID09IC1FQlVTWSkgeworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBkbWFfc3luY193YWl0X3RpbWVvdXQpKSB7CisJCQlwcl9lcnIoIiVzIHRpbWVvdXQgd2FpdGluZyBmb3IgZGVzY3JpcHRvciBzdWJtaXNzaW9uXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiBETUFfRVJST1I7CisJCX0KKwkJY3B1X3JlbGF4KCk7CisJfQorCXJldHVybiBkbWFfc3luY193YWl0KHR4LT5jaGFuLCB0eC0+Y29va2llKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRtYV93YWl0X2Zvcl9hc3luY190eCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2RtYXRlc3QuYyBiL2RyaXZlcnMvZG1hL2RtYXRlc3QuYwppbmRleCBkOTMwMTdmLi5hMzJhNGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKKysrIGIvZHJpdmVycy9kbWEvZG1hdGVzdC5jCkBAIC00OCw2ICs0OCwxMSBAQAogTU9EVUxFX1BBUk1fREVTQyh4b3Jfc291cmNlcywKIAkJIk51bWJlciBvZiB4b3Igc291cmNlIGJ1ZmZlcnMgKGRlZmF1bHQ6IDMpIik7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHFfc291cmNlcyA9IDM7Cittb2R1bGVfcGFyYW0ocHFfc291cmNlcywgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHBxX3NvdXJjZXMsCisJCSJOdW1iZXIgb2YgcCtxIHNvdXJjZSBidWZmZXJzIChkZWZhdWx0OiAzKSIpOworCiAvKgogICogSW5pdGlhbGl6YXRpb24gcGF0dGVybnMuIEFsbCBieXRlcyBpbiB0aGUgc291cmNlIGJ1ZmZlciBoYXMgYml0IDcKICAqIHNldCwgYWxsIGJ5dGVzIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaGFzIGJpdCA3IGNsZWFyZWQuCkBAIC0yMzIsNiArMjM3LDcgQEAKIAlkbWFfY29va2llX3QJCWNvb2tpZTsKIAllbnVtIGRtYV9zdGF0dXMJCXN0YXR1czsKIAllbnVtIGRtYV9jdHJsX2ZsYWdzIAlmbGFnczsKKwl1OAkJCXBxX2NvZWZzW3BxX3NvdXJjZXNdOwogCWludAkJCXJldDsKIAlpbnQJCQlzcmNfY250OwogCWludAkJCWRzdF9jbnQ7CkBAIC0yNDgsNiArMjU0LDExIEBACiAJZWxzZSBpZiAodGhyZWFkLT50eXBlID09IERNQV9YT1IpIHsKIAkJc3JjX2NudCA9IHhvcl9zb3VyY2VzIHwgMTsgLyogZm9yY2Ugb2RkIHRvIGVuc3VyZSBkc3QgPSBzcmMgKi8KIAkJZHN0X2NudCA9IDE7CisJfSBlbHNlIGlmICh0aHJlYWQtPnR5cGUgPT0gRE1BX1BRKSB7CisJCXNyY19jbnQgPSBwcV9zb3VyY2VzIHwgMTsgLyogZm9yY2Ugb2RkIHRvIGVuc3VyZSBkc3QgPSBzcmMgKi8KKwkJZHN0X2NudCA9IDI7CisJCWZvciAoaSA9IDA7IGkgPCBwcV9zb3VyY2VzOyBpKyspCisJCQlwcV9jb2Vmc1tpXSA9IDE7CiAJfSBlbHNlCiAJCWdvdG8gZXJyX3NyY3M7CiAKQEAgLTI4Myw2ICsyOTQsNyBAQAogCQlkbWFfYWRkcl90IGRtYV9kc3RzW2RzdF9jbnRdOwogCQlzdHJ1Y3QgY29tcGxldGlvbiBjbXA7CiAJCXVuc2lnbmVkIGxvbmcgdG1vID0gbXNlY3NfdG9famlmZmllcygzMDAwKTsKKwkJdTggYWxpZ24gPSAwOwogCiAJCXRvdGFsX3Rlc3RzKys7CiAKQEAgLTI5MCw2ICszMDIsMTggQEAKIAkJc3JjX29mZiA9IGRtYXRlc3RfcmFuZG9tKCkgJSAodGVzdF9idWZfc2l6ZSAtIGxlbiArIDEpOwogCQlkc3Rfb2ZmID0gZG1hdGVzdF9yYW5kb20oKSAlICh0ZXN0X2J1Zl9zaXplIC0gbGVuICsgMSk7CiAKKwkJLyogaG9ub3IgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyAqLworCQlpZiAodGhyZWFkLT50eXBlID09IERNQV9NRU1DUFkpCisJCQlhbGlnbiA9IGRldi0+Y29weV9hbGlnbjsKKwkJZWxzZSBpZiAodGhyZWFkLT50eXBlID09IERNQV9YT1IpCisJCQlhbGlnbiA9IGRldi0+eG9yX2FsaWduOworCQllbHNlIGlmICh0aHJlYWQtPnR5cGUgPT0gRE1BX1BRKQorCQkJYWxpZ24gPSBkZXYtPnBxX2FsaWduOworCisJCWxlbiA9IChsZW4gPj4gYWxpZ24pIDw8IGFsaWduOworCQlzcmNfb2ZmID0gKHNyY19vZmYgPj4gYWxpZ24pIDw8IGFsaWduOworCQlkc3Rfb2ZmID0gKGRzdF9vZmYgPj4gYWxpZ24pIDw8IGFsaWduOworCiAJCWRtYXRlc3RfaW5pdF9zcmNzKHRocmVhZC0+c3Jjcywgc3JjX29mZiwgbGVuKTsKIAkJZG1hdGVzdF9pbml0X2RzdHModGhyZWFkLT5kc3RzLCBkc3Rfb2ZmLCBsZW4pOwogCkBAIC0zMDYsNiArMzMwLDcgQEAKIAkJCQkJCSAgICAgRE1BX0JJRElSRUNUSU9OQUwpOwogCQl9CiAKKwogCQlpZiAodGhyZWFkLT50eXBlID09IERNQV9NRU1DUFkpCiAJCQl0eCA9IGRldi0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweShjaGFuLAogCQkJCQkJCSBkbWFfZHN0c1swXSArIGRzdF9vZmYsCkBAIC0zMTYsNiArMzQxLDE1IEBACiAJCQkJCQkgICAgICBkbWFfZHN0c1swXSArIGRzdF9vZmYsCiAJCQkJCQkgICAgICBkbWFfc3JjcywgeG9yX3NvdXJjZXMsCiAJCQkJCQkgICAgICBsZW4sIGZsYWdzKTsKKwkJZWxzZSBpZiAodGhyZWFkLT50eXBlID09IERNQV9QUSkgeworCQkJZG1hX2FkZHJfdCBkbWFfcHFbZHN0X2NudF07CisKKwkJCWZvciAoaSA9IDA7IGkgPCBkc3RfY250OyBpKyspCisJCQkJZG1hX3BxW2ldID0gZG1hX2RzdHNbaV0gKyBkc3Rfb2ZmOworCQkJdHggPSBkZXYtPmRldmljZV9wcmVwX2RtYV9wcShjaGFuLCBkbWFfcHEsIGRtYV9zcmNzLAorCQkJCQkJICAgICBwcV9zb3VyY2VzLCBwcV9jb2VmcywKKwkJCQkJCSAgICAgbGVuLCBmbGFncyk7CisJCX0KIAogCQlpZiAoIXR4KSB7CiAJCQlmb3IgKGkgPSAwOyBpIDwgc3JjX2NudDsgaSsrKQpAQCAtNDU5LDYgKzQ5Myw4IEBACiAJCW9wID0gImNvcHkiOwogCWVsc2UgaWYgKHR5cGUgPT0gRE1BX1hPUikKIAkJb3AgPSAieG9yIjsKKwllbHNlIGlmICh0eXBlID09IERNQV9QUSkKKwkJb3AgPSAicHEiOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTUxNCw2ICs1NTAsMTAgQEAKIAkJY250ID0gZG1hdGVzdF9hZGRfdGhyZWFkcyhkdGMsIERNQV9YT1IpOwogCQl0aHJlYWRfY291bnQgKz0gY250ID4gMCA/IGNudCA6IDA7CiAJfQorCWlmIChkbWFfaGFzX2NhcChETUFfUFEsIGRtYV9kZXYtPmNhcF9tYXNrKSkgeworCQljbnQgPSBkbWF0ZXN0X2FkZF90aHJlYWRzKGR0YywgRE1BX1BRKTsKKwkJdGhyZWFkX2NvdW50ICs9IGNudCA+IDAgPzogMDsKKwl9CiAKIAlwcl9pbmZvKCJkbWF0ZXN0OiBTdGFydGVkICV1IHRocmVhZHMgdXNpbmcgJXNcbiIsCiAJCXRocmVhZF9jb3VudCwgZG1hX2NoYW5fbmFtZShjaGFuKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kd19kbWFjLmMgYi9kcml2ZXJzL2RtYS9kd19kbWFjLmMKaW5kZXggOTMzYzE0My4uMmVlYTgyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZHdfZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL2R3X2RtYWMuYwpAQCAtMTE2LDcgKzExNiw3IEBACiB7CiAJc3RydWN0IGR3X2Rlc2MJKmNoaWxkOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmRlc2MtPnR4ZC50eF9saXN0LCBkZXNjX25vZGUpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmRlc2MtPnR4X2xpc3QsIGRlc2Nfbm9kZSkKIAkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoY2hhbjJwYXJlbnQoJmR3Yy0+Y2hhbiksCiAJCQkJY2hpbGQtPnR4ZC5waHlzLCBzaXplb2YoY2hpbGQtPmxsaSksCiAJCQkJRE1BX1RPX0RFVklDRSk7CkBAIC0xMzcsMTEgKzEzNywxMSBAQAogCQlkd2Nfc3luY19kZXNjX2Zvcl9jcHUoZHdjLCBkZXNjKTsKIAogCQlzcGluX2xvY2tfYmgoJmR3Yy0+bG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eGQudHhfbGlzdCwgZGVzY19ub2RlKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhfbGlzdCwgZGVzY19ub2RlKQogCQkJZGV2X3ZkYmcoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksCiAJCQkJCSJtb3ZpbmcgY2hpbGQgZGVzYyAlcCB0byBmcmVlbGlzdFxuIiwKIAkJCQkJY2hpbGQpOwotCQlsaXN0X3NwbGljZV9pbml0KCZkZXNjLT50eGQudHhfbGlzdCwgJmR3Yy0+ZnJlZV9saXN0KTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmZGVzYy0+dHhfbGlzdCwgJmR3Yy0+ZnJlZV9saXN0KTsKIAkJZGV2X3ZkYmcoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksICJtb3ZpbmcgZGVzYyAlcCB0byBmcmVlbGlzdFxuIiwgZGVzYyk7CiAJCWxpc3RfYWRkKCZkZXNjLT5kZXNjX25vZGUsICZkd2MtPmZyZWVfbGlzdCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZkd2MtPmxvY2spOwpAQCAtMjA5LDE5ICsyMDksMjggQEAKIAlwYXJhbSA9IHR4ZC0+Y2FsbGJhY2tfcGFyYW07CiAKIAlkd2Nfc3luY19kZXNjX2Zvcl9jcHUoZHdjLCBkZXNjKTsKLQlsaXN0X3NwbGljZV9pbml0KCZ0eGQtPnR4X2xpc3QsICZkd2MtPmZyZWVfbGlzdCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZGVzYy0+dHhfbGlzdCwgJmR3Yy0+ZnJlZV9saXN0KTsKIAlsaXN0X21vdmUoJmRlc2MtPmRlc2Nfbm9kZSwgJmR3Yy0+ZnJlZV9saXN0KTsKIAotCS8qCi0JICogV2UgdXNlIGRtYV91bm1hcF9wYWdlKCkgcmVnYXJkbGVzcyBvZiBob3cgdGhlIGJ1ZmZlcnMgd2VyZQotCSAqIG1hcHBlZCBiZWZvcmUgdGhleSB3ZXJlIHN1Ym1pdHRlZC4uLgotCSAqLwotCWlmICghKHR4ZC0+ZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKSkKLQkJZG1hX3VubWFwX3BhZ2UoY2hhbjJwYXJlbnQoJmR3Yy0+Y2hhbiksIGRlc2MtPmxsaS5kYXIsCi0JCQkgICAgICAgZGVzYy0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotCWlmICghKHR4ZC0+ZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9TUkNfVU5NQVApKQotCQlkbWFfdW5tYXBfcGFnZShjaGFuMnBhcmVudCgmZHdjLT5jaGFuKSwgZGVzYy0+bGxpLnNhciwKLQkJCSAgICAgICBkZXNjLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCWlmICghZHdjLT5jaGFuLnByaXZhdGUpIHsKKwkJc3RydWN0IGRldmljZSAqcGFyZW50ID0gY2hhbjJwYXJlbnQoJmR3Yy0+Y2hhbik7CisJCWlmICghKHR4ZC0+ZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKSkgeworCQkJaWYgKHR4ZC0+ZmxhZ3MgJiBETUFfQ09NUExfREVTVF9VTk1BUF9TSU5HTEUpCisJCQkJZG1hX3VubWFwX3NpbmdsZShwYXJlbnQsIGRlc2MtPmxsaS5kYXIsCisJCQkJCQlkZXNjLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7CisJCQllbHNlCisJCQkJZG1hX3VubWFwX3BhZ2UocGFyZW50LCBkZXNjLT5sbGkuZGFyLAorCQkJCQkJZGVzYy0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCQl9CisJCWlmICghKHR4ZC0+ZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9TUkNfVU5NQVApKSB7CisJCQlpZiAodHhkLT5mbGFncyAmIERNQV9DT01QTF9TUkNfVU5NQVBfU0lOR0xFKQorCQkJCWRtYV91bm1hcF9zaW5nbGUocGFyZW50LCBkZXNjLT5sbGkuc2FyLAorCQkJCQkJZGVzYy0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCWVsc2UKKwkJCQlkbWFfdW5tYXBfcGFnZShwYXJlbnQsIGRlc2MtPmxsaS5zYXIsCisJCQkJCQlkZXNjLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCQl9CisJfQogCiAJLyoKIAkgKiBUaGUgQVBJIHJlcXVpcmVzIHRoYXQgbm8gc3VibWlzc2lvbnMgYXJlIGRvbmUgZnJvbSBhCkBAIC0yODksNyArMjk4LDcgQEAKIAkJCS8qIFRoaXMgb25lIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAqLwogCQkJcmV0dXJuOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eGQudHhfbGlzdCwgZGVzY19ub2RlKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhfbGlzdCwgZGVzY19ub2RlKQogCQkJaWYgKGNoaWxkLT5sbGkubGxwID09IGxscCkKIAkJCQkvKiBDdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi8KIAkJCQlyZXR1cm47CkBAIC0zNTYsNyArMzY1LDcgQEAKIAlkZXZfcHJpbnRrKEtFUk5fQ1JJVCwgY2hhbjJkZXYoJmR3Yy0+Y2hhbiksCiAJCQkiICBjb29raWU6ICVkXG4iLCBiYWRfZGVzYy0+dHhkLmNvb2tpZSk7CiAJZHdjX2R1bXBfbGxpKGR3YywgJmJhZF9kZXNjLT5sbGkpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZiYWRfZGVzYy0+dHhkLnR4X2xpc3QsIGRlc2Nfbm9kZSkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmYmFkX2Rlc2MtPnR4X2xpc3QsIGRlc2Nfbm9kZSkKIAkJZHdjX2R1bXBfbGxpKGR3YywgJmNoaWxkLT5sbGkpOwogCiAJLyogUHJldGVuZCB0aGUgZGVzY3JpcHRvciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCkBAIC02MDgsNyArNjE3LDcgQEAKIAkJCQkJcHJldi0+dHhkLnBoeXMsIHNpemVvZihwcmV2LT5sbGkpLAogCQkJCQlETUFfVE9fREVWSUNFKTsKIAkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwKLQkJCQkJJmZpcnN0LT50eGQudHhfbGlzdCk7CisJCQkJCSZmaXJzdC0+dHhfbGlzdCk7CiAJCX0KIAkJcHJldiA9IGRlc2M7CiAJfQpAQCAtNjU4LDggKzY2Nyw2IEBACiAJcmVnX3dpZHRoID0gZHdzLT5yZWdfd2lkdGg7CiAJcHJldiA9IGZpcnN0ID0gTlVMTDsKIAotCXNnX2xlbiA9IGRtYV9tYXBfc2coY2hhbjJwYXJlbnQoY2hhbiksIHNnbCwgc2dfbGVuLCBkaXJlY3Rpb24pOwotCiAJc3dpdGNoIChkaXJlY3Rpb24pIHsKIAljYXNlIERNQV9UT19ERVZJQ0U6CiAJCWN0bGxvID0gKERXQ19ERUZBVUxUX0NUTExPCkBAIC03MDAsNyArNzA3LDcgQEAKIAkJCQkJCXNpemVvZihwcmV2LT5sbGkpLAogCQkJCQkJRE1BX1RPX0RFVklDRSk7CiAJCQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+ZGVzY19ub2RlLAotCQkJCQkJJmZpcnN0LT50eGQudHhfbGlzdCk7CisJCQkJCQkmZmlyc3QtPnR4X2xpc3QpOwogCQkJfQogCQkJcHJldiA9IGRlc2M7CiAJCQl0b3RhbF9sZW4gKz0gbGVuOwpAQCAtNzQ2LDcgKzc1Myw3IEBACiAJCQkJCQlzaXplb2YocHJldi0+bGxpKSwKIAkJCQkJCURNQV9UT19ERVZJQ0UpOwogCQkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwKLQkJCQkJCSZmaXJzdC0+dHhkLnR4X2xpc3QpOworCQkJCQkJJmZpcnN0LT50eF9saXN0KTsKIAkJCX0KIAkJCXByZXYgPSBkZXNjOwogCQkJdG90YWxfbGVuICs9IGxlbjsKQEAgLTkwMiw2ICs5MDksNyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQlJTklUX0xJU1RfSEVBRCgmZGVzYy0+dHhfbGlzdCk7CiAJCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmRlc2MtPnR4ZCwgY2hhbik7CiAJCWRlc2MtPnR4ZC50eF9zdWJtaXQgPSBkd2NfdHhfc3VibWl0OwogCQlkZXNjLT50eGQuZmxhZ3MgPSBETUFfQ1RSTF9BQ0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kd19kbWFjX3JlZ3MuaCBiL2RyaXZlcnMvZG1hL2R3X2RtYWNfcmVncy5oCmluZGV4IDEzYTU4MDcuLmQ5YTkzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2R3X2RtYWNfcmVncy5oCisrKyBiL2RyaXZlcnMvZG1hL2R3X2RtYWNfcmVncy5oCkBAIC0yMTcsNiArMjE3LDcgQEAKIAogCS8qIFRIRU4gdmFsdWVzIGZvciBkcml2ZXIgaG91c2VrZWVwaW5nICovCiAJc3RydWN0IGxpc3RfaGVhZAkJZGVzY19ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJCXR4X2xpc3Q7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCXR4ZDsKIAlzaXplX3QJCQkJbGVuOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ZzbGRtYS5jIGIvZHJpdmVycy9kbWEvZnNsZG1hLmMKaW5kZXggZWY4N2E4OS4uMjk2ZjllNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZnNsZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvZnNsZG1hLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAorI2luY2x1ZGUgPGFzbS9mc2xkbWEuaD4KICNpbmNsdWRlICJmc2xkbWEuaCIKIAogc3RhdGljIHZvaWQgZG1hX2luaXQoc3RydWN0IGZzbF9kbWFfY2hhbiAqZnNsX2NoYW4pCkBAIC0yODAsMjggKzI4MSw0MCBAQAogfQogCiAvKioKKyAqIGZzbF9jaGFuX3NldF9yZXF1ZXN0X2NvdW50IC0gU2V0IERNQSBSZXF1ZXN0IENvdW50IGZvciBleHRlcm5hbCBjb250cm9sCisgKiBAZnNsX2NoYW4gOiBGcmVlc2NhbGUgRE1BIGNoYW5uZWwKKyAqIEBzaXplICAgICA6IE51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciBpbiBhIHNpbmdsZSByZXF1ZXN0CisgKgorICogVGhlIEZyZWVzY2FsZSBETUEgY2hhbm5lbCBjYW4gYmUgY29udHJvbGxlZCBieSB0aGUgZXh0ZXJuYWwgc2lnbmFsIERSRVEjLgorICogVGhlIERNQSByZXF1ZXN0IGNvdW50IGlzIGhvdyBtYW55IGJ5dGVzIGFyZSBhbGxvd2VkIHRvIHRyYW5zZmVyIGJlZm9yZQorICogcGF1c2luZyB0aGUgY2hhbm5lbCwgYWZ0ZXIgd2hpY2ggYSBuZXcgYXNzZXJ0aW9uIG9mIERSRVEjIHJlc3VtZXMgY2hhbm5lbAorICogb3BlcmF0aW9uLgorICoKKyAqIEEgc2l6ZSBvZiAwIGRpc2FibGVzIGV4dGVybmFsIHBhdXNlIGNvbnRyb2wuIFRoZSBtYXhpbXVtIHNpemUgaXMgMTAyNC4KKyAqLworc3RhdGljIHZvaWQgZnNsX2NoYW5fc2V0X3JlcXVlc3RfY291bnQoc3RydWN0IGZzbF9kbWFfY2hhbiAqZnNsX2NoYW4sIGludCBzaXplKQoreworCUJVR19PTihzaXplID4gMTAyNCk7CisJRE1BX09VVChmc2xfY2hhbiwgJmZzbF9jaGFuLT5yZWdfYmFzZS0+bXIsCisJCURNQV9JTihmc2xfY2hhbiwgJmZzbF9jaGFuLT5yZWdfYmFzZS0+bXIsIDMyKQorCQkJfCAoKF9faWxvZzIoc2l6ZSkgPDwgMjQpICYgMHgwZjAwMDAwMCksCisJCTMyKTsKK30KKworLyoqCiAgKiBmc2xfY2hhbl90b2dnbGVfZXh0X3BhdXNlIC0gVG9nZ2xlIGNoYW5uZWwgZXh0ZXJuYWwgcGF1c2Ugc3RhdHVzCiAgKiBAZnNsX2NoYW4gOiBGcmVlc2NhbGUgRE1BIGNoYW5uZWwKLSAqIEBzaXplICAgICA6IFBhdXNlIGNvbnRyb2wgc2l6ZSwgMCBmb3IgZGlzYWJsZSBleHRlcm5hbCBwYXVzZSBjb250cm9sLgotICogICAgICAgICAgICAgVGhlIG1heGltdW0gaXMgMTAyNC4KKyAqIEBlbmFibGUgICA6IDAgaXMgZGlzYWJsZWQsIDEgaXMgZW5hYmxlZC4KICAqCi0gKiBUaGUgRnJlZXNjYWxlIERNQSBjaGFubmVsIGNhbiBiZSBjb250cm9sbGVkIGJ5IHRoZSBleHRlcm5hbAotICogc2lnbmFsIERSRVEjLiBUaGUgcGF1c2UgY29udHJvbCBzaXplIGlzIGhvdyBtYW55IGJ5dGVzIGFyZSBhbGxvd2VkCi0gKiB0byB0cmFuc2ZlciBiZWZvcmUgcGF1c2luZyB0aGUgY2hhbm5lbCwgYWZ0ZXIgd2hpY2ggYSBuZXcgYXNzZXJ0aW9uCi0gKiBvZiBEUkVRIyByZXN1bWVzIGNoYW5uZWwgb3BlcmF0aW9uLgorICogVGhlIEZyZWVzY2FsZSBETUEgY2hhbm5lbCBjYW4gYmUgY29udHJvbGxlZCBieSB0aGUgZXh0ZXJuYWwgc2lnbmFsIERSRVEjLgorICogVGhlIERNQSBSZXF1ZXN0IENvdW50IGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gdGhpcyBmZWF0dXJlCisgKiB0byBzZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciBiZWZvcmUgcGF1c2luZyB0aGUgY2hhbm5lbC4KICAqLwotc3RhdGljIHZvaWQgZnNsX2NoYW5fdG9nZ2xlX2V4dF9wYXVzZShzdHJ1Y3QgZnNsX2RtYV9jaGFuICpmc2xfY2hhbiwgaW50IHNpemUpCitzdGF0aWMgdm9pZCBmc2xfY2hhbl90b2dnbGVfZXh0X3BhdXNlKHN0cnVjdCBmc2xfZG1hX2NoYW4gKmZzbF9jaGFuLCBpbnQgZW5hYmxlKQogewotCWlmIChzaXplID4gMTAyNCkKLQkJcmV0dXJuOwotCi0JaWYgKHNpemUpIHsKLQkJRE1BX09VVChmc2xfY2hhbiwgJmZzbF9jaGFuLT5yZWdfYmFzZS0+bXIsCi0JCQlETUFfSU4oZnNsX2NoYW4sICZmc2xfY2hhbi0+cmVnX2Jhc2UtPm1yLCAzMikKLQkJCQl8ICgoX19pbG9nMihzaXplKSA8PCAyNCkgJiAweDBmMDAwMDAwKSwKLQkJCTMyKTsKKwlpZiAoZW5hYmxlKQogCQlmc2xfY2hhbi0+ZmVhdHVyZSB8PSBGU0xfRE1BX0NIQU5fUEFVU0VfRVhUOwotCX0gZWxzZQorCWVsc2UKIAkJZnNsX2NoYW4tPmZlYXR1cmUgJj0gfkZTTF9ETUFfQ0hBTl9QQVVTRV9FWFQ7CiB9CiAKQEAgLTMyNiw3ICszMzksOCBAQAogc3RhdGljIGRtYV9jb29raWVfdCBmc2xfZG1hX3R4X3N1Ym1pdChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQogewogCXN0cnVjdCBmc2xfZG1hX2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX2NoYW4odHgtPmNoYW4pOwotCXN0cnVjdCBmc2xfZGVzY19zdyAqZGVzYzsKKwlzdHJ1Y3QgZnNsX2Rlc2Nfc3cgKmRlc2MgPSB0eF90b19mc2xfZGVzYyh0eCk7CisJc3RydWN0IGZzbF9kZXNjX3N3ICpjaGlsZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWRtYV9jb29raWVfdCBjb29raWU7CiAKQEAgLTMzNCw3ICszNDgsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZmc2xfY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7CiAKIAljb29raWUgPSBmc2xfY2hhbi0+Y29tbW9uLmNvb2tpZTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2MsICZ0eC0+dHhfbGlzdCwgbm9kZSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eF9saXN0LCBub2RlKSB7CiAJCWNvb2tpZSsrOwogCQlpZiAoY29va2llIDwgMCkKIAkJCWNvb2tpZSA9IDE7CkBAIC0zNDMsOCArMzU3LDggQEAKIAl9CiAKIAlmc2xfY2hhbi0+Y29tbW9uLmNvb2tpZSA9IGNvb2tpZTsKLQlhcHBlbmRfbGRfcXVldWUoZnNsX2NoYW4sIHR4X3RvX2ZzbF9kZXNjKHR4KSk7Ci0JbGlzdF9zcGxpY2VfaW5pdCgmdHgtPnR4X2xpc3QsIGZzbF9jaGFuLT5sZF9xdWV1ZS5wcmV2KTsKKwlhcHBlbmRfbGRfcXVldWUoZnNsX2NoYW4sIGRlc2MpOworCWxpc3Rfc3BsaWNlX2luaXQoJmRlc2MtPnR4X2xpc3QsIGZzbF9jaGFuLT5sZF9xdWV1ZS5wcmV2KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzbF9jaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKIApAQCAtMzY2LDYgKzM4MCw3IEBACiAJZGVzY19zdyA9IGRtYV9wb29sX2FsbG9jKGZzbF9jaGFuLT5kZXNjX3Bvb2wsIEdGUF9BVE9NSUMsICZwZGVzYyk7CiAJaWYgKGRlc2Nfc3cpIHsKIAkJbWVtc2V0KGRlc2Nfc3csIDAsIHNpemVvZihzdHJ1Y3QgZnNsX2Rlc2Nfc3cpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRlc2Nfc3ctPnR4X2xpc3QpOwogCQlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KCZkZXNjX3N3LT5hc3luY190eCwKIAkJCQkJCSZmc2xfY2hhbi0+Y29tbW9uKTsKIAkJZGVzY19zdy0+YXN5bmNfdHgudHhfc3VibWl0ID0gZnNsX2RtYV90eF9zdWJtaXQ7CkBAIC00NTUsNyArNDcwLDcgQEAKIAluZXctPmFzeW5jX3R4LmZsYWdzID0gZmxhZ3M7CiAKIAkvKiBJbnNlcnQgdGhlIGxpbmsgZGVzY3JpcHRvciB0byB0aGUgTEQgcmluZyAqLwotCWxpc3RfYWRkX3RhaWwoJm5ldy0+bm9kZSwgJm5ldy0+YXN5bmNfdHgudHhfbGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmbmV3LT5ub2RlLCAmbmV3LT50eF9saXN0KTsKIAogCS8qIFNldCBFbmQtb2YtbGluayB0byB0aGUgbGFzdCBsaW5rIGRlc2NyaXB0b3Igb2YgbmV3IGxpc3QqLwogCXNldF9sZF9lb2woZnNsX2NoYW4sIG5ldyk7CkBAIC01MTMsNyArNTI4LDcgQEAKIAkJZG1hX2Rlc3QgKz0gY29weTsKIAogCQkvKiBJbnNlcnQgdGhlIGxpbmsgZGVzY3JpcHRvciB0byB0aGUgTEQgcmluZyAqLwotCQlsaXN0X2FkZF90YWlsKCZuZXctPm5vZGUsICZmaXJzdC0+YXN5bmNfdHgudHhfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJm5ldy0+bm9kZSwgJmZpcnN0LT50eF9saXN0KTsKIAl9IHdoaWxlIChsZW4pOwogCiAJbmV3LT5hc3luY190eC5mbGFncyA9IGZsYWdzOyAvKiBjbGllbnQgaXMgaW4gY29udHJvbCBvZiB0aGlzIGFjayAqLwpAQCAtNTI4LDcgKzU0Myw3IEBACiAJaWYgKCFmaXJzdCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlsaXN0ID0gJmZpcnN0LT5hc3luY190eC50eF9saXN0OworCWxpc3QgPSAmZmlyc3QtPnR4X2xpc3Q7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UobmV3LCBwcmV2LCBsaXN0LCBub2RlKSB7CiAJCWxpc3RfZGVsKCZuZXctPm5vZGUpOwogCQlkbWFfcG9vbF9mcmVlKGZzbF9jaGFuLT5kZXNjX3Bvb2wsIG5ldywgbmV3LT5hc3luY190eC5waHlzKTsKQEAgLTUzOCw2ICs1NTMsMjI5IEBACiB9CiAKIC8qKgorICogZnNsX2RtYV9wcmVwX3NsYXZlX3NnIC0gcHJlcGFyZSBkZXNjcmlwdG9ycyBmb3IgYSBETUFfU0xBVkUgdHJhbnNhY3Rpb24KKyAqIEBjaGFuOiBETUEgY2hhbm5lbAorICogQHNnbDogc2NhdHRlcmxpc3QgdG8gdHJhbnNmZXIgdG8vZnJvbQorICogQHNnX2xlbjogbnVtYmVyIG9mIGVudHJpZXMgaW4gQHNjYXR0ZXJsaXN0CisgKiBAZGlyZWN0aW9uOiBETUEgZGlyZWN0aW9uCisgKiBAZmxhZ3M6IERNQUVuZ2luZSBmbGFncworICoKKyAqIFByZXBhcmUgYSBzZXQgb2YgZGVzY3JpcHRvcnMgZm9yIGEgRE1BX1NMQVZFIHRyYW5zYWN0aW9uLiBGb2xsb3dpbmcgdGhlCisgKiBETUFfU0xBVkUgQVBJLCB0aGlzIGdldHMgdGhlIGRldmljZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICogY2hhbi0+cHJpdmF0ZSB2YXJpYWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZnNsX2RtYV9wcmVwX3NsYXZlX3NnKAorCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBzZ19sZW4sCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBmc2xfZG1hX2NoYW4gKmZzbF9jaGFuOworCXN0cnVjdCBmc2xfZGVzY19zdyAqZmlyc3QgPSBOVUxMLCAqcHJldiA9IE5VTEwsICpuZXcgPSBOVUxMOworCXN0cnVjdCBmc2xfZG1hX3NsYXZlICpzbGF2ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0eF9saXN0OworCXNpemVfdCBjb3B5OworCisJaW50IGk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzaXplX3Qgc2dfdXNlZDsKKwlzaXplX3QgaHdfdXNlZDsKKwlzdHJ1Y3QgZnNsX2RtYV9od19hZGRyICpodzsKKwlkbWFfYWRkcl90IGRtYV9kc3QsIGRtYV9zcmM7CisKKwlpZiAoIWNoYW4pCisJCXJldHVybiBOVUxMOworCisJaWYgKCFjaGFuLT5wcml2YXRlKQorCQlyZXR1cm4gTlVMTDsKKworCWZzbF9jaGFuID0gdG9fZnNsX2NoYW4oY2hhbik7CisJc2xhdmUgPSBjaGFuLT5wcml2YXRlOworCisJaWYgKGxpc3RfZW1wdHkoJnNsYXZlLT5hZGRyZXNzZXMpKQorCQlyZXR1cm4gTlVMTDsKKworCWh3ID0gbGlzdF9maXJzdF9lbnRyeSgmc2xhdmUtPmFkZHJlc3Nlcywgc3RydWN0IGZzbF9kbWFfaHdfYWRkciwgZW50cnkpOworCWh3X3VzZWQgPSAwOworCisJLyoKKwkgKiBCdWlsZCB0aGUgaGFyZHdhcmUgdHJhbnNhY3Rpb24gdG8gY29weSBmcm9tIHRoZSBzY2F0dGVybGlzdCB0bworCSAqIHRoZSBoYXJkd2FyZSwgb3IgZnJvbSB0aGUgaGFyZHdhcmUgdG8gdGhlIHNjYXR0ZXJsaXN0CisJICoKKwkgKiBJZiB5b3UgYXJlIGNvcHlpbmcgZnJvbSB0aGUgaGFyZHdhcmUgdG8gdGhlIHNjYXR0ZXJsaXN0IGFuZCBpdAorCSAqIHRha2VzIHR3byBoYXJkd2FyZSBlbnRyaWVzIHRvIGZpbGwgYW4gZW50aXJlIHBhZ2UsIHRoZW4gYm90aAorCSAqIGhhcmR3YXJlIGVudHJpZXMgd2lsbCBiZSBjb2FsZXNjZWQgaW50byB0aGUgc2FtZSBwYWdlCisJICoKKwkgKiBJZiB5b3UgYXJlIGNvcHlpbmcgZnJvbSB0aGUgc2NhdHRlcmxpc3QgdG8gdGhlIGhhcmR3YXJlIGFuZCBhCisJICogc2luZ2xlIHBhZ2UgY2FuIGZpbGwgdHdvIGhhcmR3YXJlIGVudHJpZXMsIHRoZW4gdGhlIGRhdGEgd2lsbAorCSAqIGJlIHJlYWQgb3V0IG9mIHRoZSBwYWdlIGludG8gdGhlIGZpcnN0IGhhcmR3YXJlIGVudHJ5LCBhbmQgc28gb24KKwkgKi8KKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzZ19sZW4sIGkpIHsKKwkJc2dfdXNlZCA9IDA7CisKKwkJLyogTG9vcCB1bnRpbCB0aGUgZW50aXJlIHNjYXR0ZXJsaXN0IGVudHJ5IGlzIHVzZWQgKi8KKwkJd2hpbGUgKHNnX3VzZWQgPCBzZ19kbWFfbGVuKHNnKSkgeworCisJCQkvKgorCQkJICogSWYgd2UndmUgdXNlZCB1cCB0aGUgY3VycmVudCBoYXJkd2FyZSBhZGRyZXNzL2xlbmd0aAorCQkJICogcGFpciwgd2UgbmVlZCB0byBsb2FkIGEgbmV3IG9uZQorCQkJICoKKwkJCSAqIFRoaXMgaXMgZG9uZSBpbiBhIHdoaWxlIGxvb3Agc28gdGhhdCBkZXNjcmlwdG9ycyB3aXRoCisJCQkgKiBsZW5ndGggPT0gMCB3aWxsIGJlIHNraXBwZWQKKwkJCSAqLworCQkJd2hpbGUgKGh3X3VzZWQgPj0gaHctPmxlbmd0aCkgeworCisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgY3VycmVudCBoYXJkd2FyZSBlbnRyeSBpcyB0aGUgbGFzdAorCQkJCSAqIGVudHJ5IGluIHRoZSBsaXN0LCB3ZSdyZSBmaW5pc2hlZAorCQkJCSAqLworCQkJCWlmIChsaXN0X2lzX2xhc3QoJmh3LT5lbnRyeSwgJnNsYXZlLT5hZGRyZXNzZXMpKQorCQkJCQlnb3RvIGZpbmlzaGVkOworCisJCQkJLyogR2V0IHRoZSBuZXh0IGhhcmR3YXJlIGFkZHJlc3MvbGVuZ3RoIHBhaXIgKi8KKwkJCQlodyA9IGxpc3RfZW50cnkoaHctPmVudHJ5Lm5leHQsCisJCQkJCQlzdHJ1Y3QgZnNsX2RtYV9od19hZGRyLCBlbnRyeSk7CisJCQkJaHdfdXNlZCA9IDA7CisJCQl9CisKKwkJCS8qIEFsbG9jYXRlIHRoZSBsaW5rIGRlc2NyaXB0b3IgZnJvbSBETUEgcG9vbCAqLworCQkJbmV3ID0gZnNsX2RtYV9hbGxvY19kZXNjcmlwdG9yKGZzbF9jaGFuKTsKKwkJCWlmICghbmV3KSB7CisJCQkJZGV2X2Vycihmc2xfY2hhbi0+ZGV2LCAiTm8gZnJlZSBtZW1vcnkgZm9yICIKKwkJCQkJCSAgICAgICAibGluayBkZXNjcmlwdG9yXG4iKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisjaWZkZWYgRlNMX0RNQV9MRF9ERUJVRworCQkJZGV2X2RiZyhmc2xfY2hhbi0+ZGV2LCAibmV3IGxpbmsgZGVzYyBhbGxvYyAlcFxuIiwgbmV3KTsKKyNlbmRpZgorCisJCQkvKgorCQkJICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciwKKwkJCSAqIG1ha2luZyBzdXJlIGl0IGlzIGxlc3MgdGhhbiB0aGUgRE1BIGNvbnRyb2xsZXIgbGltaXQKKwkJCSAqLworCQkJY29weSA9IG1pbl90KHNpemVfdCwgc2dfZG1hX2xlbihzZykgLSBzZ191c2VkLAorCQkJCQkgICAgIGh3LT5sZW5ndGggLSBod191c2VkKTsKKwkJCWNvcHkgPSBtaW5fdChzaXplX3QsIGNvcHksIEZTTF9ETUFfQkNSX01BWF9DTlQpOworCisJCQkvKgorCQkJICogRE1BX0ZST01fREVWSUNFCisJCQkgKiBmcm9tIHRoZSBoYXJkd2FyZSB0byB0aGUgc2NhdHRlcmxpc3QKKwkJCSAqCisJCQkgKiBETUFfVE9fREVWSUNFCisJCQkgKiBmcm9tIHRoZSBzY2F0dGVybGlzdCB0byB0aGUgaGFyZHdhcmUKKwkJCSAqLworCQkJaWYgKGRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJCQlkbWFfc3JjID0gaHctPmFkZHJlc3MgKyBod191c2VkOworCQkJCWRtYV9kc3QgPSBzZ19kbWFfYWRkcmVzcyhzZykgKyBzZ191c2VkOworCQkJfSBlbHNlIHsKKwkJCQlkbWFfc3JjID0gc2dfZG1hX2FkZHJlc3Moc2cpICsgc2dfdXNlZDsKKwkJCQlkbWFfZHN0ID0gaHctPmFkZHJlc3MgKyBod191c2VkOworCQkJfQorCisJCQkvKiBGaWxsIGluIHRoZSBkZXNjcmlwdG9yICovCisJCQlzZXRfZGVzY19jbnQoZnNsX2NoYW4sICZuZXctPmh3LCBjb3B5KTsKKwkJCXNldF9kZXNjX3NyYyhmc2xfY2hhbiwgJm5ldy0+aHcsIGRtYV9zcmMpOworCQkJc2V0X2Rlc2NfZGVzdChmc2xfY2hhbiwgJm5ldy0+aHcsIGRtYV9kc3QpOworCisJCQkvKgorCQkJICogSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGRlc2NyaXB0b3IsIGNoYWluIHRoZQorCQkJICogY3VycmVudCBkZXNjcmlwdG9yIGFmdGVyIHRoZSBwcmV2aW91cyBkZXNjcmlwdG9yCisJCQkgKi8KKwkJCWlmICghZmlyc3QpIHsKKwkJCQlmaXJzdCA9IG5ldzsKKwkJCX0gZWxzZSB7CisJCQkJc2V0X2Rlc2NfbmV4dChmc2xfY2hhbiwgJnByZXYtPmh3LAorCQkJCQkgICAgICBuZXctPmFzeW5jX3R4LnBoeXMpOworCQkJfQorCisJCQluZXctPmFzeW5jX3R4LmNvb2tpZSA9IDA7CisJCQlhc3luY190eF9hY2soJm5ldy0+YXN5bmNfdHgpOworCisJCQlwcmV2ID0gbmV3OworCQkJc2dfdXNlZCArPSBjb3B5OworCQkJaHdfdXNlZCArPSBjb3B5OworCisJCQkvKiBJbnNlcnQgdGhlIGxpbmsgZGVzY3JpcHRvciBpbnRvIHRoZSBMRCByaW5nICovCisJCQlsaXN0X2FkZF90YWlsKCZuZXctPm5vZGUsICZmaXJzdC0+dHhfbGlzdCk7CisJCX0KKwl9CisKK2ZpbmlzaGVkOgorCisJLyogQWxsIG9mIHRoZSBoYXJkd2FyZSBhZGRyZXNzL2xlbmd0aCBwYWlycyBoYWQgbGVuZ3RoID09IDAgKi8KKwlpZiAoIWZpcnN0IHx8ICFuZXcpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5hc3luY190eC5mbGFncyA9IGZsYWdzOworCW5ldy0+YXN5bmNfdHguY29va2llID0gLUVCVVNZOworCisJLyogU2V0IEVuZC1vZi1saW5rIHRvIHRoZSBsYXN0IGxpbmsgZGVzY3JpcHRvciBvZiBuZXcgbGlzdCAqLworCXNldF9sZF9lb2woZnNsX2NoYW4sIG5ldyk7CisKKwkvKiBFbmFibGUgZXh0cmEgY29udHJvbGxlciBmZWF0dXJlcyAqLworCWlmIChmc2xfY2hhbi0+c2V0X3NyY19sb29wX3NpemUpCisJCWZzbF9jaGFuLT5zZXRfc3JjX2xvb3Bfc2l6ZShmc2xfY2hhbiwgc2xhdmUtPnNyY19sb29wX3NpemUpOworCisJaWYgKGZzbF9jaGFuLT5zZXRfZGVzdF9sb29wX3NpemUpCisJCWZzbF9jaGFuLT5zZXRfZGVzdF9sb29wX3NpemUoZnNsX2NoYW4sIHNsYXZlLT5kc3RfbG9vcF9zaXplKTsKKworCWlmIChmc2xfY2hhbi0+dG9nZ2xlX2V4dF9zdGFydCkKKwkJZnNsX2NoYW4tPnRvZ2dsZV9leHRfc3RhcnQoZnNsX2NoYW4sIHNsYXZlLT5leHRlcm5hbF9zdGFydCk7CisKKwlpZiAoZnNsX2NoYW4tPnRvZ2dsZV9leHRfcGF1c2UpCisJCWZzbF9jaGFuLT50b2dnbGVfZXh0X3BhdXNlKGZzbF9jaGFuLCBzbGF2ZS0+ZXh0ZXJuYWxfcGF1c2UpOworCisJaWYgKGZzbF9jaGFuLT5zZXRfcmVxdWVzdF9jb3VudCkKKwkJZnNsX2NoYW4tPnNldF9yZXF1ZXN0X2NvdW50KGZzbF9jaGFuLCBzbGF2ZS0+cmVxdWVzdF9jb3VudCk7CisKKwlyZXR1cm4gJmZpcnN0LT5hc3luY190eDsKKworZmFpbDoKKwkvKiBJZiBmaXJzdCB3YXMgbm90IHNldCwgdGhlbiB3ZSBmYWlsZWQgdG8gYWxsb2NhdGUgdGhlIHZlcnkgZmlyc3QKKwkgKiBkZXNjcmlwdG9yLCBhbmQgd2UncmUgZG9uZSAqLworCWlmICghZmlyc3QpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBGaXJzdCBpcyBzZXQsIHNvIGFsbCBvZiB0aGUgZGVzY3JpcHRvcnMgd2UgYWxsb2NhdGVkIGhhdmUgYmVlbiBhZGRlZAorCSAqIHRvIGZpcnN0LT50eF9saXN0LCBJTkNMVURJTkcgImZpcnN0IiBpdHNlbGYuIFRoZXJlZm9yZSB3ZQorCSAqIG11c3QgdHJhdmVyc2UgdGhlIGxpc3QgYmFja3dhcmRzIGZyZWVpbmcgZWFjaCBkZXNjcmlwdG9yIGluIHR1cm4KKwkgKgorCSAqIFdlJ3JlIHJlLXVzaW5nIHZhcmlhYmxlcyBmb3IgdGhlIGxvb3AsIG9oIHdlbGwKKwkgKi8KKwl0eF9saXN0ID0gJmZpcnN0LT50eF9saXN0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKG5ldywgcHJldiwgdHhfbGlzdCwgbm9kZSkgeworCQlsaXN0X2RlbF9pbml0KCZuZXctPm5vZGUpOworCQlkbWFfcG9vbF9mcmVlKGZzbF9jaGFuLT5kZXNjX3Bvb2wsIG5ldywgbmV3LT5hc3luY190eC5waHlzKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZnNsX2RtYV9kZXZpY2VfdGVybWluYXRlX2FsbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGZzbF9kbWFfY2hhbiAqZnNsX2NoYW47CisJc3RydWN0IGZzbF9kZXNjX3N3ICpkZXNjLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNoYW4pCisJCXJldHVybjsKKworCWZzbF9jaGFuID0gdG9fZnNsX2NoYW4oY2hhbik7CisKKwkvKiBIYWx0IHRoZSBETUEgZW5naW5lICovCisJZG1hX2hhbHQoZnNsX2NoYW4pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZzbF9jaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKKworCS8qIFJlbW92ZSBhbmQgZnJlZSBhbGwgb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBMRCBxdWV1ZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCB0bXAsICZmc2xfY2hhbi0+bGRfcXVldWUsIG5vZGUpIHsKKwkJbGlzdF9kZWwoJmRlc2MtPm5vZGUpOworCQlkbWFfcG9vbF9mcmVlKGZzbF9jaGFuLT5kZXNjX3Bvb2wsIGRlc2MsIGRlc2MtPmFzeW5jX3R4LnBoeXMpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzbF9jaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCiAgKiBmc2xfZG1hX3VwZGF0ZV9jb21wbGV0ZWRfY29va2llIC0gVXBkYXRlIHRoZSBjb21wbGV0ZWQgY29va2llLgogICogQGZzbF9jaGFuIDogRnJlZXNjYWxlIERNQSBjaGFubmVsCiAgKi8KQEAgLTg4Myw2ICsxMTIxLDcgQEAKIAkJbmV3X2ZzbF9jaGFuLT50b2dnbGVfZXh0X3N0YXJ0ID0gZnNsX2NoYW5fdG9nZ2xlX2V4dF9zdGFydDsKIAkJbmV3X2ZzbF9jaGFuLT5zZXRfc3JjX2xvb3Bfc2l6ZSA9IGZzbF9jaGFuX3NldF9zcmNfbG9vcF9zaXplOwogCQluZXdfZnNsX2NoYW4tPnNldF9kZXN0X2xvb3Bfc2l6ZSA9IGZzbF9jaGFuX3NldF9kZXN0X2xvb3Bfc2l6ZTsKKwkJbmV3X2ZzbF9jaGFuLT5zZXRfcmVxdWVzdF9jb3VudCA9IGZzbF9jaGFuX3NldF9yZXF1ZXN0X2NvdW50OwogCX0KIAogCXNwaW5fbG9ja19pbml0KCZuZXdfZnNsX2NoYW4tPmRlc2NfbG9jayk7CkBAIC05NjIsMTIgKzEyMDEsMTUgQEAKIAogCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGZkZXYtPmNvbW1vbi5jYXBfbWFzayk7CiAJZG1hX2NhcF9zZXQoRE1BX0lOVEVSUlVQVCwgZmRldi0+Y29tbW9uLmNhcF9tYXNrKTsKKwlkbWFfY2FwX3NldChETUFfU0xBVkUsIGZkZXYtPmNvbW1vbi5jYXBfbWFzayk7CiAJZmRldi0+Y29tbW9uLmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyA9IGZzbF9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CiAJZmRldi0+Y29tbW9uLmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0gZnNsX2RtYV9mcmVlX2NoYW5fcmVzb3VyY2VzOwogCWZkZXYtPmNvbW1vbi5kZXZpY2VfcHJlcF9kbWFfaW50ZXJydXB0ID0gZnNsX2RtYV9wcmVwX2ludGVycnVwdDsKIAlmZGV2LT5jb21tb24uZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGZzbF9kbWFfcHJlcF9tZW1jcHk7CiAJZmRldi0+Y29tbW9uLmRldmljZV9pc190eF9jb21wbGV0ZSA9IGZzbF9kbWFfaXNfY29tcGxldGU7CiAJZmRldi0+Y29tbW9uLmRldmljZV9pc3N1ZV9wZW5kaW5nID0gZnNsX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZzsKKwlmZGV2LT5jb21tb24uZGV2aWNlX3ByZXBfc2xhdmVfc2cgPSBmc2xfZG1hX3ByZXBfc2xhdmVfc2c7CisJZmRldi0+Y29tbW9uLmRldmljZV90ZXJtaW5hdGVfYWxsID0gZnNsX2RtYV9kZXZpY2VfdGVybWluYXRlX2FsbDsKIAlmZGV2LT5jb21tb24uZGV2ID0gJmRldi0+ZGV2OwogCiAJZmRldi0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LT5ub2RlLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ZzbGRtYS5oIGIvZHJpdmVycy9kbWEvZnNsZG1hLmgKaW5kZXggZGM3ZjI2OC4uMGRmMTRjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZnNsZG1hLmgKKysrIGIvZHJpdmVycy9kbWEvZnNsZG1hLmgKQEAgLTkwLDYgKzkwLDcgQEAKIHN0cnVjdCBmc2xfZGVzY19zdyB7CiAJc3RydWN0IGZzbF9kbWFfbGRfaHcgaHc7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgdHhfbGlzdDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgYXN5bmNfdHg7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGQ7CiAJdm9pZCAqcHJpdjsKQEAgLTE0MywxMCArMTQ0LDExIEBACiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CiAJdTMyIGZlYXR1cmU7CiAKLQl2b2lkICgqdG9nZ2xlX2V4dF9wYXVzZSkoc3RydWN0IGZzbF9kbWFfY2hhbiAqZnNsX2NoYW4sIGludCBzaXplKTsKKwl2b2lkICgqdG9nZ2xlX2V4dF9wYXVzZSkoc3RydWN0IGZzbF9kbWFfY2hhbiAqZnNsX2NoYW4sIGludCBlbmFibGUpOwogCXZvaWQgKCp0b2dnbGVfZXh0X3N0YXJ0KShzdHJ1Y3QgZnNsX2RtYV9jaGFuICpmc2xfY2hhbiwgaW50IGVuYWJsZSk7CiAJdm9pZCAoKnNldF9zcmNfbG9vcF9zaXplKShzdHJ1Y3QgZnNsX2RtYV9jaGFuICpmc2xfY2hhbiwgaW50IHNpemUpOwogCXZvaWQgKCpzZXRfZGVzdF9sb29wX3NpemUpKHN0cnVjdCBmc2xfZG1hX2NoYW4gKmZzbF9jaGFuLCBpbnQgc2l6ZSk7CisJdm9pZCAoKnNldF9yZXF1ZXN0X2NvdW50KShzdHJ1Y3QgZnNsX2RtYV9jaGFuICpmc2xfY2hhbiwgaW50IHNpemUpOwogfTsKIAogI2RlZmluZSB0b19mc2xfY2hhbihjaGFuKSBjb250YWluZXJfb2YoY2hhbiwgc3RydWN0IGZzbF9kbWFfY2hhbiwgY29tbW9uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC5jIGIvZHJpdmVycy9kbWEvaW9hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjI1YmI2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZG1hL2lvYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogSW50ZWwgSS9PQVQgRE1BIExpbnV4IGRyaXZlcgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgotICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KLSAqCi0gKi8KLQotLyoKLSAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFuIEludGVsIEkvT0FUIERNQSBlbmdpbmUsIHdoaWNoIGRvZXMgYXN5bmNocm9ub3VzCi0gKiBjb3B5IG9wZXJhdGlvbnMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kY2EuaD4KLSNpbmNsdWRlICJpb2F0ZG1hLmgiCi0jaW5jbHVkZSAiaW9hdGRtYV9yZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJpb2F0ZG1hX2h3LmgiCi0KLU1PRFVMRV9WRVJTSU9OKElPQVRfRE1BX1ZFUlNJT04pOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24iKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlvYXRfcGNpX3RibFtdID0gewotCS8qIEkvT0FUIHYxIHBsYXRmb3JtcyAqLwotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVQpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9DTkIpICB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU0NOQikgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9VTklTWVMsIFBDSV9ERVZJQ0VfSURfVU5JU1lTX0RNQV9ESVJFQ1RPUikgfSwKLQotCS8qIEkvT0FUIHYyIHBsYXRmb3JtcyAqLwotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CKSB9LAotCi0JLyogSS9PQVQgdjMgcGxhdGZvcm1zICovCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9UQkcwKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfVEJHMSkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzIpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9UQkczKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfVEJHNCkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzUpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9UQkc2KSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfVEJHNykgfSwKLQl7IDAsIH0KLX07Ci0KLXN0cnVjdCBpb2F0X2RldmljZSB7Ci0Jc3RydWN0IHBjaV9kZXYJCSpwZGV2OwotCXZvaWQgX19pb21lbQkJKmlvYmFzZTsKLQlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UJKmRtYTsKLQlzdHJ1Y3QgZGNhX3Byb3ZpZGVyCSpkY2E7Ci19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBpb2F0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7Ci1zdGF0aWMgdm9pZCBfX2RldmV4aXQgaW9hdF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotCi1zdGF0aWMgaW50IGlvYXRfZGNhX2VuYWJsZWQgPSAxOwotbW9kdWxlX3BhcmFtKGlvYXRfZGNhX2VuYWJsZWQsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlvYXRfZGNhX2VuYWJsZWQsICJjb250cm9sIHN1cHBvcnQgb2YgZGNhIHNlcnZpY2UgKGRlZmF1bHQ6IDEpIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpb2F0X3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gImlvYXRkbWEiLAotCS5pZF90YWJsZQk9IGlvYXRfcGNpX3RibCwKLQkucHJvYmUJCT0gaW9hdF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGlvYXRfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGlvYXRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCXZvaWQgX19pb21lbSAqaW9iYXNlOwotCXN0cnVjdCBpb2F0X2RldmljZSAqZGV2aWNlOwotCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydCwgbW1pb19sZW47Ci0JaW50IGVycjsKLQotCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2VuYWJsZV9kZXZpY2U7Ci0KLQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGlvYXRfcGNpX2RyaXZlci5uYW1lKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yZXF1ZXN0X3JlZ2lvbnM7Ci0KLQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOwotCWlmIChlcnIpCi0JCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfc2V0X2RtYV9tYXNrOwotCi0JZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOwotCWlmIChlcnIpCi0JCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9zZXRfZG1hX21hc2s7Ci0KLQltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKLQlpb2Jhc2UgPSBpb3JlbWFwKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKLQlpZiAoIWlvYmFzZSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9pb3JlbWFwOwotCX0KLQotCWRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCpkZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldmljZSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9remFsbG9jOwotCX0KLQlkZXZpY2UtPnBkZXYgPSBwZGV2OwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXZpY2UpOwotCWRldmljZS0+aW9iYXNlID0gaW9iYXNlOwotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlzd2l0Y2ggKHJlYWRiKGlvYmFzZSArIElPQVRfVkVSX09GRlNFVCkpIHsKLQljYXNlIElPQVRfVkVSXzFfMjoKLQkJZGV2aWNlLT5kbWEgPSBpb2F0X2RtYV9wcm9iZShwZGV2LCBpb2Jhc2UpOwotCQlpZiAoZGV2aWNlLT5kbWEgJiYgaW9hdF9kY2FfZW5hYmxlZCkKLQkJCWRldmljZS0+ZGNhID0gaW9hdF9kY2FfaW5pdChwZGV2LCBpb2Jhc2UpOwotCQlicmVhazsKLQljYXNlIElPQVRfVkVSXzJfMDoKLQkJZGV2aWNlLT5kbWEgPSBpb2F0X2RtYV9wcm9iZShwZGV2LCBpb2Jhc2UpOwotCQlpZiAoZGV2aWNlLT5kbWEgJiYgaW9hdF9kY2FfZW5hYmxlZCkKLQkJCWRldmljZS0+ZGNhID0gaW9hdDJfZGNhX2luaXQocGRldiwgaW9iYXNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBJT0FUX1ZFUl8zXzA6Ci0JCWRldmljZS0+ZG1hID0gaW9hdF9kbWFfcHJvYmUocGRldiwgaW9iYXNlKTsKLQkJaWYgKGRldmljZS0+ZG1hICYmIGlvYXRfZGNhX2VuYWJsZWQpCi0JCQlkZXZpY2UtPmRjYSA9IGlvYXQzX2RjYV9pbml0KHBkZXYsIGlvYmFzZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWJyZWFrOwotCX0KLQlpZiAoIWRldmljZS0+ZG1hKQotCQllcnIgPSAtRU5PREVWOwotCi0JaWYgKGVycikKLQkJZ290byBlcnJfdmVyc2lvbjsKLQotCXJldHVybiAwOwotCi1lcnJfdmVyc2lvbjoKLQlrZnJlZShkZXZpY2UpOwotZXJyX2t6YWxsb2M6Ci0JaW91bm1hcChpb2Jhc2UpOwotZXJyX2lvcmVtYXA6Ci1lcnJfc2V0X2RtYV9tYXNrOgotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotZXJyX3JlcXVlc3RfcmVnaW9uczoKLWVycl9lbmFibGVfZGV2aWNlOgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpb2F0X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgaW9hdF9kZXZpY2UgKmRldmljZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlbW92aW5nIGRtYSBhbmQgZGNhIHNlcnZpY2VzXG4iKTsKLQlpZiAoZGV2aWNlLT5kY2EpIHsKLQkJdW5yZWdpc3Rlcl9kY2FfcHJvdmlkZXIoZGV2aWNlLT5kY2EpOwotCQlmcmVlX2RjYV9wcm92aWRlcihkZXZpY2UtPmRjYSk7Ci0JCWRldmljZS0+ZGNhID0gTlVMTDsKLQl9Ci0KLQlpZiAoZGV2aWNlLT5kbWEpIHsKLQkJaW9hdF9kbWFfcmVtb3ZlKGRldmljZS0+ZG1hKTsKLQkJZGV2aWNlLT5kbWEgPSBOVUxMOwotCX0KLQotCWtmcmVlKGRldmljZSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlvYXRfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaW9hdF9wY2lfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KGlvYXRfaW5pdF9tb2R1bGUpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaW9hdF9leGl0X21vZHVsZSh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaW9hdF9wY2lfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGlvYXRfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC9NYWtlZmlsZSBiL2RyaXZlcnMvZG1hL2lvYXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5N2QzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZG1hL2lvYXQvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfSU5URUxfSU9BVERNQSkgKz0gaW9hdGRtYS5vCitpb2F0ZG1hLW9ianMgOj0gcGNpLm8gZG1hLm8gZG1hX3YyLm8gZG1hX3YzLm8gZGNhLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXRfZGNhLmMgYi9kcml2ZXJzL2RtYS9pb2F0L2RjYS5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGRyaXZlcnMvZG1hL2lvYXRfZGNhLmMKcmVuYW1lIHRvIGRyaXZlcnMvZG1hL2lvYXQvZGNhLmMKaW5kZXggYzAxMmExZS4uNjlkMDI2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9hdF9kY2EuYworKysgYi9kcml2ZXJzL2RtYS9pb2F0L2RjYS5jCkBAIC0zMyw4ICszMyw4IEBACiAjZGVmaW5lIGNwdV9waHlzaWNhbF9pZChjcHUpIChjcHVpZF9lYngoMSkgPj4gMjQpCiAjZW5kaWYKIAotI2luY2x1ZGUgImlvYXRkbWEuaCIKLSNpbmNsdWRlICJpb2F0ZG1hX3JlZ2lzdGVycy5oIgorI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgogCiAvKgogICogQml0IDcgb2YgYSB0YWcgbWFwIGVudHJ5IGlzIHRoZSAidmFsaWQiIGJpdCwgaWYgaXQgaXMgc2V0IHRoZW4gYml0cyAwOjYKQEAgLTI0Miw3ICsyNDIsOCBAQAogfTsKIAogCi1zdHJ1Y3QgZGNhX3Byb3ZpZGVyICppb2F0X2RjYV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKmlvYmFzZSkKK3N0cnVjdCBkY2FfcHJvdmlkZXIgKiBfX2RldmluaXQKK2lvYXRfZGNhX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9iYXNlKQogewogCXN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYTsKIAlzdHJ1Y3QgaW9hdF9kY2FfcHJpdiAqaW9hdGRjYTsKQEAgLTQwNyw3ICs0MDgsOCBAQAogCXJldHVybiBzbG90czsKIH0KIAotc3RydWN0IGRjYV9wcm92aWRlciAqaW9hdDJfZGNhX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9iYXNlKQorc3RydWN0IGRjYV9wcm92aWRlciAqIF9fZGV2aW5pdAoraW9hdDJfZGNhX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9iYXNlKQogewogCXN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYTsKIAlzdHJ1Y3QgaW9hdF9kY2FfcHJpdiAqaW9hdGRjYTsKQEAgLTYwMiw3ICs2MDQsOCBAQAogCXJldHVybiBzbG90czsKIH0KIAotc3RydWN0IGRjYV9wcm92aWRlciAqaW9hdDNfZGNhX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9iYXNlKQorc3RydWN0IGRjYV9wcm92aWRlciAqIF9fZGV2aW5pdAoraW9hdDNfZGNhX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9iYXNlKQogewogCXN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYTsKIAlzdHJ1Y3QgaW9hdF9kY2FfcHJpdiAqaW9hdGRjYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hLmMgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjRkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYS5jCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyAqIEludGVsIEkvT0FUIERNQSBMaW51eCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAyMDA0IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICovCisKKy8qCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbiBJbnRlbCBJL09BVCBETUEgZW5naW5lLCB3aGljaCBkb2VzIGFzeW5jaHJvbm91cworICogY29weSBvcGVyYXRpb25zLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2k3MzAwX2lkbGUuaD4KKyNpbmNsdWRlICJkbWEuaCIKKyNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKyNpbmNsdWRlICJody5oIgorCitpbnQgaW9hdF9wZW5kaW5nX2xldmVsID0gNDsKK21vZHVsZV9wYXJhbShpb2F0X3BlbmRpbmdfbGV2ZWwsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvYXRfcGVuZGluZ19sZXZlbCwKKwkJICJoaWdoLXdhdGVyIG1hcmsgZm9yIHB1c2hpbmcgaW9hdCBkZXNjcmlwdG9ycyAoZGVmYXVsdDogNCkiKTsKKworLyogaW50ZXJuYWwgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBpb2F0MV9jbGVhbnVwKHN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0KTsKK3N0YXRpYyB2b2lkIGlvYXQxX2RtYV9zdGFydF9udWxsX2Rlc2Moc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXQpOworCisvKioKKyAqIGlvYXRfZG1hX2RvX2ludGVycnVwdCAtIGhhbmRsZXIgdXNlZCBmb3Igc2luZ2xlIHZlY3RvciBpbnRlcnJ1cHQgbW9kZQorICogQGlycTogaW50ZXJydXB0IGlkCisgKiBAZGF0YTogaW50ZXJydXB0IGRhdGEKKyAqLworc3RhdGljIGlycXJldHVybl90IGlvYXRfZG1hX2RvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpb2F0ZG1hX2RldmljZSAqaW5zdGFuY2UgPSBkYXRhOworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuOworCXVuc2lnbmVkIGxvbmcgYXR0bnN0YXR1czsKKwlpbnQgYml0OworCXU4IGludHJjdHJsOworCisJaW50cmN0cmwgPSByZWFkYihpbnN0YW5jZS0+cmVnX2Jhc2UgKyBJT0FUX0lOVFJDVFJMX09GRlNFVCk7CisKKwlpZiAoIShpbnRyY3RybCAmIElPQVRfSU5UUkNUUkxfTUFTVEVSX0lOVF9FTikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmICghKGludHJjdHJsICYgSU9BVF9JTlRSQ1RSTF9JTlRfU1RBVFVTKSkgeworCQl3cml0ZWIoaW50cmN0cmwsIGluc3RhbmNlLT5yZWdfYmFzZSArIElPQVRfSU5UUkNUUkxfT0ZGU0VUKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWF0dG5zdGF0dXMgPSByZWFkbChpbnN0YW5jZS0+cmVnX2Jhc2UgKyBJT0FUX0FUVE5TVEFUVVNfT0ZGU0VUKTsKKwlmb3JfZWFjaF9iaXQoYml0LCAmYXR0bnN0YXR1cywgQklUU19QRVJfTE9ORykgeworCQljaGFuID0gaW9hdF9jaGFuX2J5X2luZGV4KGluc3RhbmNlLCBiaXQpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZjaGFuLT5jbGVhbnVwX3Rhc2spOworCX0KKworCXdyaXRlYihpbnRyY3RybCwgaW5zdGFuY2UtPnJlZ19iYXNlICsgSU9BVF9JTlRSQ1RSTF9PRkZTRVQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBpb2F0X2RtYV9kb19pbnRlcnJ1cHRfbXNpeCAtIGhhbmRsZXIgdXNlZCBmb3IgdmVjdG9yLXBlci1jaGFubmVsIGludGVycnVwdCBtb2RlCisgKiBAaXJxOiBpbnRlcnJ1cHQgaWQKKyAqIEBkYXRhOiBpbnRlcnJ1cHQgZGF0YQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW9hdF9kbWFfZG9faW50ZXJydXB0X21zaXgoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9IGRhdGE7CisKKwl0YXNrbGV0X3NjaGVkdWxlKCZjaGFuLT5jbGVhbnVwX3Rhc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBpb2F0MV9jbGVhbnVwX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKKworLyogY29tbW9uIGNoYW5uZWwgaW5pdGlhbGl6YXRpb24gKi8KK3ZvaWQgaW9hdF9pbml0X2NoYW5uZWwoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UsCisJCSAgICAgICBzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiwgaW50IGlkeCwKKwkJICAgICAgIHZvaWQgKCp0aW1lcl9mbikodW5zaWduZWQgbG9uZyksCisJCSAgICAgICB2b2lkICgqdGFza2xldCkodW5zaWduZWQgbG9uZyksCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGlvYXQpCit7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRtYSA9ICZkZXZpY2UtPmNvbW1vbjsKKworCWNoYW4tPmRldmljZSA9IGRldmljZTsKKwljaGFuLT5yZWdfYmFzZSA9IGRldmljZS0+cmVnX2Jhc2UgKyAoMHg4MCAqIChpZHggKyAxKSk7CisJc3Bpbl9sb2NrX2luaXQoJmNoYW4tPmNsZWFudXBfbG9jayk7CisJY2hhbi0+Y29tbW9uLmRldmljZSA9IGRtYTsKKwlsaXN0X2FkZF90YWlsKCZjaGFuLT5jb21tb24uZGV2aWNlX25vZGUsICZkbWEtPmNoYW5uZWxzKTsKKwlkZXZpY2UtPmlkeFtpZHhdID0gY2hhbjsKKwlpbml0X3RpbWVyKCZjaGFuLT50aW1lcik7CisJY2hhbi0+dGltZXIuZnVuY3Rpb24gPSB0aW1lcl9mbjsKKwljaGFuLT50aW1lci5kYXRhID0gaW9hdDsKKwl0YXNrbGV0X2luaXQoJmNoYW4tPmNsZWFudXBfdGFzaywgdGFza2xldCwgaW9hdCk7CisJdGFza2xldF9kaXNhYmxlKCZjaGFuLT5jbGVhbnVwX3Rhc2spOworfQorCitzdGF0aWMgdm9pZCBpb2F0MV90aW1lcl9ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKioKKyAqIGlvYXQxX2RtYV9lbnVtZXJhdGVfY2hhbm5lbHMgLSBmaW5kIGFuZCBpbml0aWFsaXplIHRoZSBkZXZpY2UncyBjaGFubmVscworICogQGRldmljZTogdGhlIGRldmljZSB0byBiZSBlbnVtZXJhdGVkCisgKi8KK3N0YXRpYyBpbnQgaW9hdDFfZW51bWVyYXRlX2NoYW5uZWxzKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKQoreworCXU4IHhmZXJjYXBfc2NhbGU7CisJdTMyIHhmZXJjYXA7CisJaW50IGk7CisJc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRldmljZS0+cGRldi0+ZGV2OworCXN0cnVjdCBkbWFfZGV2aWNlICpkbWEgPSAmZGV2aWNlLT5jb21tb247CisKKwlJTklUX0xJU1RfSEVBRCgmZG1hLT5jaGFubmVscyk7CisJZG1hLT5jaGFuY250ID0gcmVhZGIoZGV2aWNlLT5yZWdfYmFzZSArIElPQVRfQ0hBTkNOVF9PRkZTRVQpOworCWRtYS0+Y2hhbmNudCAmPSAweDFmOyAvKiBiaXRzIFs0OjBdIHZhbGlkICovCisJaWYgKGRtYS0+Y2hhbmNudCA+IEFSUkFZX1NJWkUoZGV2aWNlLT5pZHgpKSB7CisJCWRldl93YXJuKGRldiwgIiglZCkgZXhjZWVkcyBtYXggc3VwcG9ydGVkIGNoYW5uZWxzICglenUpXG4iLAorCQkJIGRtYS0+Y2hhbmNudCwgQVJSQVlfU0laRShkZXZpY2UtPmlkeCkpOworCQlkbWEtPmNoYW5jbnQgPSBBUlJBWV9TSVpFKGRldmljZS0+aWR4KTsKKwl9CisJeGZlcmNhcF9zY2FsZSA9IHJlYWRiKGRldmljZS0+cmVnX2Jhc2UgKyBJT0FUX1hGRVJDQVBfT0ZGU0VUKTsKKwl4ZmVyY2FwX3NjYWxlICY9IDB4MWY7IC8qIGJpdHMgWzQ6MF0gdmFsaWQgKi8KKwl4ZmVyY2FwID0gKHhmZXJjYXBfc2NhbGUgPT0gMCA/IC0xIDogKDFVTCA8PCB4ZmVyY2FwX3NjYWxlKSk7CisJZGV2X2RiZyhkZXYsICIlczogeGZlcmNhcCA9ICVkXG4iLCBfX2Z1bmNfXywgeGZlcmNhcCk7CisKKyNpZmRlZiAgQ09ORklHX0k3MzAwX0lETEVfSU9BVF9DSEFOTkVMCisJaWYgKGk3MzAwX2lkbGVfcGxhdGZvcm1fcHJvYmUoTlVMTCwgTlVMTCwgMSkgPT0gMCkKKwkJZG1hLT5jaGFuY250LS07CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgZG1hLT5jaGFuY250OyBpKyspIHsKKwkJaW9hdCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW9hdCksIEdGUF9LRVJORUwpOworCQlpZiAoIWlvYXQpCisJCQlicmVhazsKKworCQlpb2F0X2luaXRfY2hhbm5lbChkZXZpY2UsICZpb2F0LT5iYXNlLCBpLAorCQkJCSAgaW9hdDFfdGltZXJfZXZlbnQsCisJCQkJICBpb2F0MV9jbGVhbnVwX3Rhc2tsZXQsCisJCQkJICAodW5zaWduZWQgbG9uZykgaW9hdCk7CisJCWlvYXQtPnhmZXJjYXAgPSB4ZmVyY2FwOworCQlzcGluX2xvY2tfaW5pdCgmaW9hdC0+ZGVzY19sb2NrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmlvYXQtPmZyZWVfZGVzYyk7CisJCUlOSVRfTElTVF9IRUFEKCZpb2F0LT51c2VkX2Rlc2MpOworCX0KKwlkbWEtPmNoYW5jbnQgPSBpOworCXJldHVybiBpOworfQorCisvKioKKyAqIGlvYXRfZG1hX21lbWNweV9pc3N1ZV9wZW5kaW5nIC0gcHVzaCBwb3RlbnRpYWxseSB1bnJlY29nbml6ZWQgYXBwZW5kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgdG8gaHcKKyAqIEBjaGFuOiBETUEgY2hhbm5lbCBoYW5kbGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX2lvYXQxX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlID0gaW9hdC0+YmFzZS5yZWdfYmFzZTsKKworCWRldl9kYmcodG9fZGV2KCZpb2F0LT5iYXNlKSwgIiVzOiBwZW5kaW5nOiAlZFxuIiwKKwkJX19mdW5jX18sIGlvYXQtPnBlbmRpbmcpOworCWlvYXQtPnBlbmRpbmcgPSAwOworCXdyaXRlYihJT0FUX0NIQU5DTURfQVBQRU5ELCByZWdfYmFzZSArIElPQVQxX0NIQU5DTURfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgaW9hdDFfZG1hX21lbWNweV9pc3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXRfY2hhbihjaGFuKTsKKworCWlmIChpb2F0LT5wZW5kaW5nID4gMCkgeworCQlzcGluX2xvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisJCV9faW9hdDFfZG1hX21lbWNweV9pc3N1ZV9wZW5kaW5nKGlvYXQpOworCQlzcGluX3VubG9ja19iaCgmaW9hdC0+ZGVzY19sb2NrKTsKKwl9Cit9CisKKy8qKgorICogaW9hdDFfcmVzZXRfY2hhbm5lbCAtIHJlc3RhcnQgYSBjaGFubmVsCisgKiBAaW9hdDogSU9BVCBETUEgY2hhbm5lbCBoYW5kbGUKKyAqLworc3RhdGljIHZvaWQgaW9hdDFfcmVzZXRfY2hhbm5lbChzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCkKK3sKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnX2Jhc2UgPSBjaGFuLT5yZWdfYmFzZTsKKwl1MzIgY2hhbnN0cywgY2hhbmVycjsKKworCWRldl93YXJuKHRvX2RldihjaGFuKSwgInJlc2V0XG4iKTsKKwljaGFuZXJyID0gcmVhZGwocmVnX2Jhc2UgKyBJT0FUX0NIQU5FUlJfT0ZGU0VUKTsKKwljaGFuc3RzID0gKmNoYW4tPmNvbXBsZXRpb24gJiBJT0FUX0NIQU5TVFNfU1RBVFVTOworCWlmIChjaGFuZXJyKSB7CisJCWRldl9lcnIodG9fZGV2KGNoYW4pLAorCQkJImNoYW4lZCwgQ0hBTlNUUyA9IDB4JTA4eCBDSEFORVJSID0gMHglMDR4LCBjbGVhcmluZ1xuIiwKKwkJCWNoYW5fbnVtKGNoYW4pLCBjaGFuc3RzLCBjaGFuZXJyKTsKKwkJd3JpdGVsKGNoYW5lcnIsIHJlZ19iYXNlICsgSU9BVF9DSEFORVJSX09GRlNFVCk7CisJfQorCisJLyoKKwkgKiB3aGFjayBpdCB1cHNpZGUgdGhlIGhlYWQgd2l0aCBhIHJlc2V0CisJICogYW5kIHdhaXQgZm9yIHRoaW5ncyB0byBzZXR0bGUgb3V0LgorCSAqIGZvcmNlIHRoZSBwZW5kaW5nIGNvdW50IHRvIGEgcmVhbGx5IGJpZyBuZWdhdGl2ZQorCSAqIHRvIG1ha2Ugc3VyZSBubyBvbmUgZm9yY2VzIGFuIGlzc3VlX3BlbmRpbmcKKwkgKiB3aGlsZSB3ZSdyZSB3YWl0aW5nLgorCSAqLworCisJaW9hdC0+cGVuZGluZyA9IElOVF9NSU47CisJd3JpdGViKElPQVRfQ0hBTkNNRF9SRVNFVCwKKwkgICAgICAgcmVnX2Jhc2UgKyBJT0FUX0NIQU5DTURfT0ZGU0VUKGNoYW4tPmRldmljZS0+dmVyc2lvbikpOworCXNldF9iaXQoSU9BVF9SRVNFVF9QRU5ESU5HLCAmY2hhbi0+c3RhdGUpOworCW1vZF90aW1lcigmY2hhbi0+dGltZXIsIGppZmZpZXMgKyBSRVNFVF9ERUxBWSk7Cit9CisKK3N0YXRpYyBkbWFfY29va2llX3QgaW9hdDFfdHhfc3VibWl0KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpCit7CisJc3RydWN0IGRtYV9jaGFuICpjID0gdHgtPmNoYW47CisJc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXQgPSB0b19pb2F0X2NoYW4oYyk7CisJc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYyA9IHR4X3RvX2lvYXRfZGVzYyh0eCk7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4gPSAmaW9hdC0+YmFzZTsKKwlzdHJ1Y3QgaW9hdF9kZXNjX3N3ICpmaXJzdDsKKwlzdHJ1Y3QgaW9hdF9kZXNjX3N3ICpjaGFpbl90YWlsOworCWRtYV9jb29raWVfdCBjb29raWU7CisKKwlzcGluX2xvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisJLyogY29va2llIGluY3IgYW5kIGFkZGl0aW9uIHRvIHVzZWRfbGlzdCBtdXN0IGJlIGF0b21pYyAqLworCWNvb2tpZSA9IGMtPmNvb2tpZTsKKwljb29raWUrKzsKKwlpZiAoY29va2llIDwgMCkKKwkJY29va2llID0gMTsKKwljLT5jb29raWUgPSBjb29raWU7CisJdHgtPmNvb2tpZSA9IGNvb2tpZTsKKwlkZXZfZGJnKHRvX2RldigmaW9hdC0+YmFzZSksICIlczogY29va2llOiAlZFxuIiwgX19mdW5jX18sIGNvb2tpZSk7CisKKwkvKiB3cml0ZSBhZGRyZXNzIGludG8gTmV4dERlc2NyaXB0b3IgZmllbGQgb2YgbGFzdCBkZXNjIGluIGNoYWluICovCisJZmlyc3QgPSB0b19pb2F0X2Rlc2MoZGVzYy0+dHhfbGlzdC5uZXh0KTsKKwljaGFpbl90YWlsID0gdG9faW9hdF9kZXNjKGlvYXQtPnVzZWRfZGVzYy5wcmV2KTsKKwkvKiBtYWtlIGRlc2NyaXB0b3IgdXBkYXRlcyBnbG9iYWxseSB2aXNpYmxlIGJlZm9yZSBjaGFpbmluZyAqLworCXdtYigpOworCWNoYWluX3RhaWwtPmh3LT5uZXh0ID0gZmlyc3QtPnR4ZC5waHlzOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmZGVzYy0+dHhfbGlzdCwgJmlvYXQtPnVzZWRfZGVzYyk7CisJZHVtcF9kZXNjX2RiZyhpb2F0LCBjaGFpbl90YWlsKTsKKwlkdW1wX2Rlc2NfZGJnKGlvYXQsIGZpcnN0KTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChJT0FUX0NPTVBMRVRJT05fUEVORElORywgJmNoYW4tPnN0YXRlKSkKKwkJbW9kX3RpbWVyKCZjaGFuLT50aW1lciwgamlmZmllcyArIENPTVBMRVRJT05fVElNRU9VVCk7CisKKwlpb2F0LT5hY3RpdmUgKz0gZGVzYy0+aHctPnR4X2NudDsKKwlpb2F0LT5wZW5kaW5nICs9IGRlc2MtPmh3LT50eF9jbnQ7CisJaWYgKGlvYXQtPnBlbmRpbmcgPj0gaW9hdF9wZW5kaW5nX2xldmVsKQorCQlfX2lvYXQxX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZyhpb2F0KTsKKwlzcGluX3VubG9ja19iaCgmaW9hdC0+ZGVzY19sb2NrKTsKKworCXJldHVybiBjb29raWU7Cit9CisKKy8qKgorICogaW9hdF9kbWFfYWxsb2NfZGVzY3JpcHRvciAtIGFsbG9jYXRlIGFuZCByZXR1cm4gYSBzdyBhbmQgaHcgZGVzY3JpcHRvciBwYWlyCisgKiBAaW9hdDogdGhlIGNoYW5uZWwgc3VwcGx5aW5nIHRoZSBtZW1vcnkgcG9vbCBmb3IgdGhlIGRlc2NyaXB0b3JzCisgKiBAZmxhZ3M6IGFsbG9jYXRpb24gZmxhZ3MKKyAqLworc3RhdGljIHN0cnVjdCBpb2F0X2Rlc2Nfc3cgKgoraW9hdF9kbWFfYWxsb2NfZGVzY3JpcHRvcihzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCwgZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IGlvYXRfZG1hX2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzY19zdzsKKwlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmlvYXRkbWFfZGV2aWNlOworCWRtYV9hZGRyX3QgcGh5czsKKworCWlvYXRkbWFfZGV2aWNlID0gaW9hdC0+YmFzZS5kZXZpY2U7CisJZGVzYyA9IHBjaV9wb29sX2FsbG9jKGlvYXRkbWFfZGV2aWNlLT5kbWFfcG9vbCwgZmxhZ3MsICZwaHlzKTsKKwlpZiAodW5saWtlbHkoIWRlc2MpKQorCQlyZXR1cm4gTlVMTDsKKworCWRlc2Nfc3cgPSBremFsbG9jKHNpemVvZigqZGVzY19zdyksIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoIWRlc2Nfc3cpKSB7CisJCXBjaV9wb29sX2ZyZWUoaW9hdGRtYV9kZXZpY2UtPmRtYV9wb29sLCBkZXNjLCBwaHlzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCisJSU5JVF9MSVNUX0hFQUQoJmRlc2Nfc3ctPnR4X2xpc3QpOworCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmRlc2Nfc3ctPnR4ZCwgJmlvYXQtPmJhc2UuY29tbW9uKTsKKwlkZXNjX3N3LT50eGQudHhfc3VibWl0ID0gaW9hdDFfdHhfc3VibWl0OworCWRlc2Nfc3ctPmh3ID0gZGVzYzsKKwlkZXNjX3N3LT50eGQucGh5cyA9IHBoeXM7CisJc2V0X2Rlc2NfaWQoZGVzY19zdywgLTEpOworCisJcmV0dXJuIGRlc2Nfc3c7Cit9CisKK3N0YXRpYyBpbnQgaW9hdF9pbml0aWFsX2Rlc2NfY291bnQgPSAyNTY7Cittb2R1bGVfcGFyYW0oaW9hdF9pbml0aWFsX2Rlc2NfY291bnQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvYXRfaW5pdGlhbF9kZXNjX2NvdW50LAorCQkgImlvYXQxOiBpbml0aWFsIGRlc2NyaXB0b3JzIHBlciBjaGFubmVsIChkZWZhdWx0OiAyNTYpIik7CisvKioKKyAqIGlvYXQxX2RtYV9hbGxvY19jaGFuX3Jlc291cmNlcyAtIHJldHVybnMgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgZGVzY3JpcHRvcnMKKyAqIEBjaGFuOiB0aGUgY2hhbm5lbCB0byBiZSBmaWxsZWQgb3V0CisgKi8KK3N0YXRpYyBpbnQgaW9hdDFfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqYykKK3sKKwlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXRfY2hhbihjKTsKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmRlc2M7CisJdTMyIGNoYW5lcnI7CisJaW50IGk7CisJTElTVF9IRUFEKHRtcF9saXN0KTsKKworCS8qIGhhdmUgd2UgYWxyZWFkeSBiZWVuIHNldCB1cD8gKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmlvYXQtPmZyZWVfZGVzYykpCisJCXJldHVybiBpb2F0LT5kZXNjY291bnQ7CisKKwkvKiBTZXR1cCByZWdpc3RlciB0byBpbnRlcnJ1cHQgYW5kIHdyaXRlIGNvbXBsZXRpb24gc3RhdHVzIG9uIGVycm9yICovCisJd3JpdGV3KElPQVRfQ0hBTkNUUkxfUlVOLCBjaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkNUUkxfT0ZGU0VUKTsKKworCWNoYW5lcnIgPSByZWFkbChjaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOworCWlmIChjaGFuZXJyKSB7CisJCWRldl9lcnIodG9fZGV2KGNoYW4pLCAiQ0hBTkVSUiA9ICV4LCBjbGVhcmluZ1xuIiwgY2hhbmVycik7CisJCXdyaXRlbChjaGFuZXJyLCBjaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOworCX0KKworCS8qIEFsbG9jYXRlIGRlc2NyaXB0b3JzICovCisJZm9yIChpID0gMDsgaSA8IGlvYXRfaW5pdGlhbF9kZXNjX2NvdW50OyBpKyspIHsKKwkJZGVzYyA9IGlvYXRfZG1hX2FsbG9jX2Rlc2NyaXB0b3IoaW9hdCwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGVzYykgeworCQkJZGV2X2Vycih0b19kZXYoY2hhbiksICJPbmx5ICVkIGluaXRpYWwgZGVzY3JpcHRvcnNcbiIsIGkpOworCQkJYnJlYWs7CisJCX0KKwkJc2V0X2Rlc2NfaWQoZGVzYywgaSk7CisJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPm5vZGUsICZ0bXBfbGlzdCk7CisJfQorCXNwaW5fbG9ja19iaCgmaW9hdC0+ZGVzY19sb2NrKTsKKwlpb2F0LT5kZXNjY291bnQgPSBpOworCWxpc3Rfc3BsaWNlKCZ0bXBfbGlzdCwgJmlvYXQtPmZyZWVfZGVzYyk7CisJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisKKwkvKiBhbGxvY2F0ZSBhIGNvbXBsZXRpb24gd3JpdGViYWNrIGFyZWEgKi8KKwkvKiBkb2luZyAyIDMyYml0IHdyaXRlcyB0byBtbWlvIHNpbmNlIDEgNjRiIHdyaXRlIGRvZXNuJ3Qgd29yayAqLworCWNoYW4tPmNvbXBsZXRpb24gPSBwY2lfcG9vbF9hbGxvYyhjaGFuLT5kZXZpY2UtPmNvbXBsZXRpb25fcG9vbCwKKwkJCQkJICBHRlBfS0VSTkVMLCAmY2hhbi0+Y29tcGxldGlvbl9kbWEpOworCW1lbXNldChjaGFuLT5jb21wbGV0aW9uLCAwLCBzaXplb2YoKmNoYW4tPmNvbXBsZXRpb24pKTsKKwl3cml0ZWwoKCh1NjQpIGNoYW4tPmNvbXBsZXRpb25fZG1hKSAmIDB4MDAwMDAwMDBGRkZGRkZGRiwKKwkgICAgICAgY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5DTVBfT0ZGU0VUX0xPVyk7CisJd3JpdGVsKCgodTY0KSBjaGFuLT5jb21wbGV0aW9uX2RtYSkgPj4gMzIsCisJICAgICAgIGNoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOQ01QX09GRlNFVF9ISUdIKTsKKworCXRhc2tsZXRfZW5hYmxlKCZjaGFuLT5jbGVhbnVwX3Rhc2spOworCWlvYXQxX2RtYV9zdGFydF9udWxsX2Rlc2MoaW9hdCk7ICAvKiBnaXZlIGNoYWluIHRvIGRtYSBkZXZpY2UgKi8KKwlkZXZfZGJnKHRvX2RldihjaGFuKSwgIiVzOiBhbGxvY2F0ZWQgJWQgZGVzY3JpcHRvcnNcbiIsCisJCV9fZnVuY19fLCBpb2F0LT5kZXNjY291bnQpOworCXJldHVybiBpb2F0LT5kZXNjY291bnQ7Cit9CisKKy8qKgorICogaW9hdDFfZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXMgLSByZWxlYXNlIGFsbCB0aGUgZGVzY3JpcHRvcnMKKyAqIEBjaGFuOiB0aGUgY2hhbm5lbCB0byBiZSBjbGVhbmVkCisgKi8KK3N0YXRpYyB2b2lkIGlvYXQxX2RtYV9mcmVlX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqYykKK3sKKwlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXRfY2hhbihjKTsKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCXN0cnVjdCBpb2F0ZG1hX2RldmljZSAqaW9hdGRtYV9kZXZpY2UgPSBjaGFuLT5kZXZpY2U7CisJc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYywgKl9kZXNjOworCWludCBpbl91c2VfZGVzY3MgPSAwOworCisJLyogQmVmb3JlIGZyZWVpbmcgY2hhbm5lbCByZXNvdXJjZXMgZmlyc3QgY2hlY2sKKwkgKiBpZiB0aGV5IGhhdmUgYmVlbiBwcmV2aW91c2x5IGFsbG9jYXRlZCBmb3IgdGhpcyBjaGFubmVsLgorCSAqLworCWlmIChpb2F0LT5kZXNjY291bnQgPT0gMCkKKwkJcmV0dXJuOworCisJdGFza2xldF9kaXNhYmxlKCZjaGFuLT5jbGVhbnVwX3Rhc2spOworCWRlbF90aW1lcl9zeW5jKCZjaGFuLT50aW1lcik7CisJaW9hdDFfY2xlYW51cChpb2F0KTsKKworCS8qIERlbGF5IDEwMG1zIGFmdGVyIHJlc2V0IHRvIGFsbG93IGludGVybmFsIERNQSBsb2dpYyB0byBxdWllc2NlCisJICogYmVmb3JlIHJlbW92aW5nIERNQSBkZXNjcmlwdG9yIHJlc291cmNlcy4KKwkgKi8KKwl3cml0ZWIoSU9BVF9DSEFOQ01EX1JFU0VULAorCSAgICAgICBjaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkNNRF9PRkZTRVQoY2hhbi0+ZGV2aWNlLT52ZXJzaW9uKSk7CisJbWRlbGF5KDEwMCk7CisKKwlzcGluX2xvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmaW9hdC0+dXNlZF9kZXNjLCBub2RlKSB7CisJCWRldl9kYmcodG9fZGV2KGNoYW4pLCAiJXM6IGZyZWVpbmcgJWQgZnJvbSB1c2VkIGxpc3RcbiIsCisJCQlfX2Z1bmNfXywgZGVzY19pZChkZXNjKSk7CisJCWR1bXBfZGVzY19kYmcoaW9hdCwgZGVzYyk7CisJCWluX3VzZV9kZXNjcysrOworCQlsaXN0X2RlbCgmZGVzYy0+bm9kZSk7CisJCXBjaV9wb29sX2ZyZWUoaW9hdGRtYV9kZXZpY2UtPmRtYV9wb29sLCBkZXNjLT5odywKKwkJCSAgICAgIGRlc2MtPnR4ZC5waHlzKTsKKwkJa2ZyZWUoZGVzYyk7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywKKwkJCQkgJmlvYXQtPmZyZWVfZGVzYywgbm9kZSkgeworCQlsaXN0X2RlbCgmZGVzYy0+bm9kZSk7CisJCXBjaV9wb29sX2ZyZWUoaW9hdGRtYV9kZXZpY2UtPmRtYV9wb29sLCBkZXNjLT5odywKKwkJCSAgICAgIGRlc2MtPnR4ZC5waHlzKTsKKwkJa2ZyZWUoZGVzYyk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZpb2F0LT5kZXNjX2xvY2spOworCisJcGNpX3Bvb2xfZnJlZShpb2F0ZG1hX2RldmljZS0+Y29tcGxldGlvbl9wb29sLAorCQkgICAgICBjaGFuLT5jb21wbGV0aW9uLAorCQkgICAgICBjaGFuLT5jb21wbGV0aW9uX2RtYSk7CisKKwkvKiBvbmUgaXMgb2sgc2luY2Ugd2UgbGVmdCBpdCBvbiB0aGVyZSBvbiBwdXJwb3NlICovCisJaWYgKGluX3VzZV9kZXNjcyA+IDEpCisJCWRldl9lcnIodG9fZGV2KGNoYW4pLCAiRnJlZWluZyAlZCBpbiB1c2UgZGVzY3JpcHRvcnMhXG4iLAorCQkJaW5fdXNlX2Rlc2NzIC0gMSk7CisKKwljaGFuLT5sYXN0X2NvbXBsZXRpb24gPSAwOworCWNoYW4tPmNvbXBsZXRpb25fZG1hID0gMDsKKwlpb2F0LT5wZW5kaW5nID0gMDsKKwlpb2F0LT5kZXNjY291bnQgPSAwOworfQorCisvKioKKyAqIGlvYXQxX2RtYV9nZXRfbmV4dF9kZXNjcmlwdG9yIC0gcmV0dXJuIHRoZSBuZXh0IGF2YWlsYWJsZSBkZXNjcmlwdG9yCisgKiBAaW9hdDogSU9BVCBETUEgY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBHZXRzIHRoZSBuZXh0IGRlc2NyaXB0b3IgZnJvbSB0aGUgY2hhaW4sIGFuZCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZQorICogY2hhbm5lbCdzIGRlc2NfbG9jayBoZWxkLiAgQWxsb2NhdGVzIG1vcmUgZGVzY3JpcHRvcnMgaWYgdGhlIGNoYW5uZWwKKyAqIGhhcyBydW4gb3V0LgorICovCitzdGF0aWMgc3RydWN0IGlvYXRfZGVzY19zdyAqCitpb2F0MV9kbWFfZ2V0X25leHRfZGVzY3JpcHRvcihzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCkKK3sKKwlzdHJ1Y3QgaW9hdF9kZXNjX3N3ICpuZXc7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmlvYXQtPmZyZWVfZGVzYykpIHsKKwkJbmV3ID0gdG9faW9hdF9kZXNjKGlvYXQtPmZyZWVfZGVzYy5uZXh0KTsKKwkJbGlzdF9kZWwoJm5ldy0+bm9kZSk7CisJfSBlbHNlIHsKKwkJLyogdHJ5IHRvIGdldCBhbm90aGVyIGRlc2MgKi8KKwkJbmV3ID0gaW9hdF9kbWFfYWxsb2NfZGVzY3JpcHRvcihpb2F0LCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFuZXcpIHsKKwkJCWRldl9lcnIodG9fZGV2KCZpb2F0LT5iYXNlKSwgImFsbG9jIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlkZXZfZGJnKHRvX2RldigmaW9hdC0+YmFzZSksICIlczogYWxsb2NhdGVkOiAlZFxuIiwKKwkJX19mdW5jX18sIGRlc2NfaWQobmV3KSk7CisJcHJlZmV0Y2gobmV3LT5odyk7CisJcmV0dXJuIG5ldzsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitpb2F0MV9kbWFfcHJlcF9tZW1jcHkoc3RydWN0IGRtYV9jaGFuICpjLCBkbWFfYWRkcl90IGRtYV9kZXN0LAorCQkgICAgICBkbWFfYWRkcl90IGRtYV9zcmMsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXQgPSB0b19pb2F0X2NoYW4oYyk7CisJc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYzsKKwlzaXplX3QgY29weTsKKwlMSVNUX0hFQUQoY2hhaW4pOworCWRtYV9hZGRyX3Qgc3JjID0gZG1hX3NyYzsKKwlkbWFfYWRkcl90IGRlc3QgPSBkbWFfZGVzdDsKKwlzaXplX3QgdG90YWxfbGVuID0gbGVuOworCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodyA9IE5VTEw7CisJaW50IHR4X2NudCA9IDA7CisKKwlzcGluX2xvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisJZGVzYyA9IGlvYXQxX2RtYV9nZXRfbmV4dF9kZXNjcmlwdG9yKGlvYXQpOworCWRvIHsKKwkJaWYgKCFkZXNjKQorCQkJYnJlYWs7CisKKwkJdHhfY250Kys7CisJCWNvcHkgPSBtaW5fdChzaXplX3QsIGxlbiwgaW9hdC0+eGZlcmNhcCk7CisKKwkJaHcgPSBkZXNjLT5odzsKKwkJaHctPnNpemUgPSBjb3B5OworCQlody0+Y3RsID0gMDsKKwkJaHctPnNyY19hZGRyID0gc3JjOworCQlody0+ZHN0X2FkZHIgPSBkZXN0OworCisJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPm5vZGUsICZjaGFpbik7CisKKwkJbGVuIC09IGNvcHk7CisJCWRlc3QgKz0gY29weTsKKwkJc3JjICs9IGNvcHk7CisJCWlmIChsZW4pIHsKKwkJCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKm5leHQ7CisKKwkJCWFzeW5jX3R4X2FjaygmZGVzYy0+dHhkKTsKKwkJCW5leHQgPSBpb2F0MV9kbWFfZ2V0X25leHRfZGVzY3JpcHRvcihpb2F0KTsKKwkJCWh3LT5uZXh0ID0gbmV4dCA/IG5leHQtPnR4ZC5waHlzIDogMDsKKwkJCWR1bXBfZGVzY19kYmcoaW9hdCwgZGVzYyk7CisJCQlkZXNjID0gbmV4dDsKKwkJfSBlbHNlCisJCQlody0+bmV4dCA9IDA7CisJfSB3aGlsZSAobGVuKTsKKworCWlmICghZGVzYykgeworCQlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCisJCWRldl9lcnIodG9fZGV2KGNoYW4pLAorCQkJImNoYW4lZCAtIGdldF9uZXh0X2Rlc2MgZmFpbGVkXG4iLCBjaGFuX251bShjaGFuKSk7CisJCWxpc3Rfc3BsaWNlKCZjaGFpbiwgJmlvYXQtPmZyZWVfZGVzYyk7CisJCXNwaW5fdW5sb2NrX2JoKCZpb2F0LT5kZXNjX2xvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisKKwlkZXNjLT50eGQuZmxhZ3MgPSBmbGFnczsKKwlkZXNjLT5sZW4gPSB0b3RhbF9sZW47CisJbGlzdF9zcGxpY2UoJmNoYWluLCAmZGVzYy0+dHhfbGlzdCk7CisJaHctPmN0bF9mLmludF9lbiA9ICEhKGZsYWdzICYgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlody0+Y3RsX2YuY29tcGxfd3JpdGUgPSAxOworCWh3LT50eF9jbnQgPSB0eF9jbnQ7CisJZHVtcF9kZXNjX2RiZyhpb2F0LCBkZXNjKTsKKworCXJldHVybiAmZGVzYy0+dHhkOworfQorCitzdGF0aWMgdm9pZCBpb2F0MV9jbGVhbnVwX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpb2F0X2RtYV9jaGFuICpjaGFuID0gKHZvaWQgKilkYXRhOworCisJaW9hdDFfY2xlYW51cChjaGFuKTsKKwl3cml0ZXcoSU9BVF9DSEFOQ1RSTF9SVU4sIGNoYW4tPmJhc2UucmVnX2Jhc2UgKyBJT0FUX0NIQU5DVFJMX09GRlNFVCk7Cit9CisKK3ZvaWQgaW9hdF9kbWFfdW5tYXAoc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4sIGVudW0gZG1hX2N0cmxfZmxhZ3MgZmxhZ3MsCisJCSAgICBzaXplX3QgbGVuLCBzdHJ1Y3QgaW9hdF9kbWFfZGVzY3JpcHRvciAqaHcpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjaGFuLT5kZXZpY2UtPnBkZXY7CisJc2l6ZV90IG9mZnNldCA9IGxlbiAtIGh3LT5zaXplOworCisJaWYgKCEoZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKSkKKwkJaW9hdF91bm1hcChwZGV2LCBody0+ZHN0X2FkZHIgLSBvZmZzZXQsIGxlbiwKKwkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSwgZmxhZ3MsIDEpOworCisJaWYgKCEoZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9TUkNfVU5NQVApKQorCQlpb2F0X3VubWFwKHBkZXYsIGh3LT5zcmNfYWRkciAtIG9mZnNldCwgbGVuLAorCQkJICAgUENJX0RNQV9UT0RFVklDRSwgZmxhZ3MsIDApOworfQorCit1bnNpZ25lZCBsb25nIGlvYXRfZ2V0X2N1cnJlbnRfY29tcGxldGlvbihzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbikKK3sKKwl1bnNpZ25lZCBsb25nIHBoeXNfY29tcGxldGU7CisJdTY0IGNvbXBsZXRpb247CisKKwljb21wbGV0aW9uID0gKmNoYW4tPmNvbXBsZXRpb247CisJcGh5c19jb21wbGV0ZSA9IGlvYXRfY2hhbnN0c190b19hZGRyKGNvbXBsZXRpb24pOworCisJZGV2X2RiZyh0b19kZXYoY2hhbiksICIlczogcGh5c19jb21wbGV0ZTogJSNsbHhcbiIsIF9fZnVuY19fLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBwaHlzX2NvbXBsZXRlKTsKKworCWlmIChpc19pb2F0X2hhbHRlZChjb21wbGV0aW9uKSkgeworCQl1MzIgY2hhbmVyciA9IHJlYWRsKGNoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFORVJSX09GRlNFVCk7CisJCWRldl9lcnIodG9fZGV2KGNoYW4pLCAiQ2hhbm5lbCBoYWx0ZWQsIGNoYW5lcnIgPSAleFxuIiwKKwkJCWNoYW5lcnIpOworCisJCS8qIFRPRE8gZG8gc29tZXRoaW5nIHRvIHNhbHZhZ2UgdGhlIHNpdHVhdGlvbiAqLworCX0KKworCXJldHVybiBwaHlzX2NvbXBsZXRlOworfQorCitib29sIGlvYXRfY2xlYW51cF9wcmVhbWJsZShzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKnBoeXNfY29tcGxldGUpCit7CisJKnBoeXNfY29tcGxldGUgPSBpb2F0X2dldF9jdXJyZW50X2NvbXBsZXRpb24oY2hhbik7CisJaWYgKCpwaHlzX2NvbXBsZXRlID09IGNoYW4tPmxhc3RfY29tcGxldGlvbikKKwkJcmV0dXJuIGZhbHNlOworCWNsZWFyX2JpdChJT0FUX0NPTVBMRVRJT05fQUNLLCAmY2hhbi0+c3RhdGUpOworCW1vZF90aW1lcigmY2hhbi0+dGltZXIsIGppZmZpZXMgKyBDT01QTEVUSU9OX1RJTUVPVVQpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIF9fY2xlYW51cChzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCwgdW5zaWduZWQgbG9uZyBwaHlzX2NvbXBsZXRlKQoreworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisJc3RydWN0IGxpc3RfaGVhZCAqX2Rlc2MsICpuOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisKKwlkZXZfZGJnKHRvX2RldihjaGFuKSwgIiVzOiBwaHlzX2NvbXBsZXRlOiAlbHhcbiIsCisJCSBfX2Z1bmNfXywgcGh5c19jb21wbGV0ZSk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKF9kZXNjLCBuLCAmaW9hdC0+dXNlZF9kZXNjKSB7CisJCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmRlc2M7CisKKwkJcHJlZmV0Y2gobik7CisJCWRlc2MgPSBsaXN0X2VudHJ5KF9kZXNjLCB0eXBlb2YoKmRlc2MpLCBub2RlKTsKKwkJdHggPSAmZGVzYy0+dHhkOworCQkvKgorCQkgKiBJbmNvbWluZyBETUEgcmVxdWVzdHMgbWF5IHVzZSBtdWx0aXBsZSBkZXNjcmlwdG9ycywKKwkJICogZHVlIHRvIGV4Y2VlZGluZyB4ZmVyY2FwLCBwZXJoYXBzLiBJZiBzbywgb25seSB0aGUKKwkJICogbGFzdCBvbmUgd2lsbCBoYXZlIGEgY29va2llLCBhbmQgcmVxdWlyZSB1bm1hcHBpbmcuCisJCSAqLworCQlkdW1wX2Rlc2NfZGJnKGlvYXQsIGRlc2MpOworCQlpZiAodHgtPmNvb2tpZSkgeworCQkJY2hhbi0+Y29tcGxldGVkX2Nvb2tpZSA9IHR4LT5jb29raWU7CisJCQl0eC0+Y29va2llID0gMDsKKwkJCWlvYXRfZG1hX3VubWFwKGNoYW4sIHR4LT5mbGFncywgZGVzYy0+bGVuLCBkZXNjLT5odyk7CisJCQlpb2F0LT5hY3RpdmUgLT0gZGVzYy0+aHctPnR4X2NudDsKKwkJCWlmICh0eC0+Y2FsbGJhY2spIHsKKwkJCQl0eC0+Y2FsbGJhY2sodHgtPmNhbGxiYWNrX3BhcmFtKTsKKwkJCQl0eC0+Y2FsbGJhY2sgPSBOVUxMOworCQkJfQorCQl9CisKKwkJaWYgKHR4LT5waHlzICE9IHBoeXNfY29tcGxldGUpIHsKKwkJCS8qCisJCQkgKiBhIGNvbXBsZXRlZCBlbnRyeSwgYnV0IG5vdCB0aGUgbGFzdCwgc28gY2xlYW4KKwkJCSAqIHVwIGlmIHRoZSBjbGllbnQgaXMgZG9uZSB3aXRoIHRoZSBkZXNjcmlwdG9yCisJCQkgKi8KKwkJCWlmIChhc3luY190eF90ZXN0X2Fjayh0eCkpCisJCQkJbGlzdF9tb3ZlX3RhaWwoJmRlc2MtPm5vZGUsICZpb2F0LT5mcmVlX2Rlc2MpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGxhc3QgdXNlZCBkZXNjLiBEbyBub3QgcmVtb3ZlLCBzbyB3ZSBjYW4KKwkJCSAqIGFwcGVuZCBmcm9tIGl0LgorCQkJICovCisKKwkJCS8qIGlmIG5vdGhpbmcgZWxzZSBpcyBwZW5kaW5nLCBjYW5jZWwgdGhlCisJCQkgKiBjb21wbGV0aW9uIHRpbWVvdXQKKwkJCSAqLworCQkJaWYgKG4gPT0gJmlvYXQtPnVzZWRfZGVzYykgeworCQkJCWRldl9kYmcodG9fZGV2KGNoYW4pLAorCQkJCQkiJXMgY2FuY2VsIGNvbXBsZXRpb24gdGltZW91dFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCWNsZWFyX2JpdChJT0FUX0NPTVBMRVRJT05fUEVORElORywgJmNoYW4tPnN0YXRlKTsKKwkJCX0KKworCQkJLyogVE9ETyBjaGVjayBzdGF0dXMgYml0cz8gKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJY2hhbi0+bGFzdF9jb21wbGV0aW9uID0gcGh5c19jb21wbGV0ZTsKK30KKworLyoqCisgKiBpb2F0MV9jbGVhbnVwIC0gY2xlYW51cCB1cCBmaW5pc2hlZCBkZXNjcmlwdG9ycworICogQGNoYW46IGlvYXQgY2hhbm5lbCB0byBiZSBjbGVhbmVkIHVwCisgKgorICogVG8gcHJldmVudCBsb2NrIGNvbnRlbnRpb24gd2UgZGVmZXIgY2xlYW51cCB3aGVuIHRoZSBsb2NrcyBhcmUKKyAqIGNvbnRlbmRlZCB3aXRoIGEgdGVybWluYWwgdGltZW91dCB0aGF0IGZvcmNlcyBjbGVhbnVwIGFuZCBjYXRjaGVzCisgKiBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBlcnJvcnMuCisgKi8KK3N0YXRpYyB2b2lkIGlvYXQxX2NsZWFudXAoc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXQpCit7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4gPSAmaW9hdC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfY29tcGxldGU7CisKKwlwcmVmZXRjaChjaGFuLT5jb21wbGV0aW9uKTsKKworCWlmICghc3Bpbl90cnlsb2NrX2JoKCZjaGFuLT5jbGVhbnVwX2xvY2spKQorCQlyZXR1cm47CisKKwlpZiAoIWlvYXRfY2xlYW51cF9wcmVhbWJsZShjaGFuLCAmcGh5c19jb21wbGV0ZSkpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmNoYW4tPmNsZWFudXBfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXNwaW5fdHJ5bG9ja19iaCgmaW9hdC0+ZGVzY19sb2NrKSkgeworCQlzcGluX3VubG9ja19iaCgmY2hhbi0+Y2xlYW51cF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCV9fY2xlYW51cChpb2F0LCBwaHlzX2NvbXBsZXRlKTsKKworCXNwaW5fdW5sb2NrX2JoKCZpb2F0LT5kZXNjX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZjaGFuLT5jbGVhbnVwX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBpb2F0MV90aW1lcl9ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXQgPSAodm9pZCAqKSBkYXRhOworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisKKwlkZXZfZGJnKHRvX2RldihjaGFuKSwgIiVzOiBzdGF0ZTogJWx4XG4iLCBfX2Z1bmNfXywgY2hhbi0+c3RhdGUpOworCisJc3Bpbl9sb2NrX2JoKCZjaGFuLT5jbGVhbnVwX2xvY2spOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSU9BVF9SRVNFVF9QRU5ESU5HLCAmY2hhbi0+c3RhdGUpKSB7CisJCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmRlc2M7CisKKwkJc3Bpbl9sb2NrX2JoKCZpb2F0LT5kZXNjX2xvY2spOworCisJCS8qIHJlc3RhcnQgYWN0aXZlIGRlc2NyaXB0b3JzICovCisJCWRlc2MgPSB0b19pb2F0X2Rlc2MoaW9hdC0+dXNlZF9kZXNjLnByZXYpOworCQlpb2F0X3NldF9jaGFpbmFkZHIoaW9hdCwgZGVzYy0+dHhkLnBoeXMpOworCQlpb2F0X3N0YXJ0KGNoYW4pOworCisJCWlvYXQtPnBlbmRpbmcgPSAwOworCQlzZXRfYml0KElPQVRfQ09NUExFVElPTl9QRU5ESU5HLCAmY2hhbi0+c3RhdGUpOworCQltb2RfdGltZXIoJmNoYW4tPnRpbWVyLCBqaWZmaWVzICsgQ09NUExFVElPTl9USU1FT1VUKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisJfSBlbHNlIGlmICh0ZXN0X2JpdChJT0FUX0NPTVBMRVRJT05fUEVORElORywgJmNoYW4tPnN0YXRlKSkgeworCQl1bnNpZ25lZCBsb25nIHBoeXNfY29tcGxldGU7CisKKwkJc3Bpbl9sb2NrX2JoKCZpb2F0LT5kZXNjX2xvY2spOworCQkvKiBpZiB3ZSBoYXZlbid0IG1hZGUgcHJvZ3Jlc3MgYW5kIHdlIGhhdmUgYWxyZWFkeQorCQkgKiBhY2tub3dsZWRnZWQgYSBwZW5kaW5nIGNvbXBsZXRpb24gb25jZSwgdGhlbiBiZSBtb3JlCisJCSAqIGZvcmNlZnVsIHdpdGggYSByZXN0YXJ0CisJCSAqLworCQlpZiAoaW9hdF9jbGVhbnVwX3ByZWFtYmxlKGNoYW4sICZwaHlzX2NvbXBsZXRlKSkKKwkJCV9fY2xlYW51cChpb2F0LCBwaHlzX2NvbXBsZXRlKTsKKwkJZWxzZSBpZiAodGVzdF9iaXQoSU9BVF9DT01QTEVUSU9OX0FDSywgJmNoYW4tPnN0YXRlKSkKKwkJCWlvYXQxX3Jlc2V0X2NoYW5uZWwoaW9hdCk7CisJCWVsc2UgeworCQkJdTY0IHN0YXR1cyA9IGlvYXRfY2hhbnN0cyhjaGFuKTsKKworCQkJLyogbWFudWFsbHkgdXBkYXRlIHRoZSBsYXN0IGNvbXBsZXRpb24gYWRkcmVzcyAqLworCQkJaWYgKGlvYXRfY2hhbnN0c190b19hZGRyKHN0YXR1cykgIT0gMCkKKwkJCQkqY2hhbi0+Y29tcGxldGlvbiA9IHN0YXR1czsKKworCQkJc2V0X2JpdChJT0FUX0NPTVBMRVRJT05fQUNLLCAmY2hhbi0+c3RhdGUpOworCQkJbW9kX3RpbWVyKCZjaGFuLT50aW1lciwgamlmZmllcyArIENPTVBMRVRJT05fVElNRU9VVCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZjaGFuLT5jbGVhbnVwX2xvY2spOworfQorCitzdGF0aWMgZW51bSBkbWFfc3RhdHVzCitpb2F0MV9kbWFfaXNfY29tcGxldGUoc3RydWN0IGRtYV9jaGFuICpjLCBkbWFfY29va2llX3QgY29va2llLAorCQkgICAgICBkbWFfY29va2llX3QgKmRvbmUsIGRtYV9jb29raWVfdCAqdXNlZCkKK3sKKwlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXRfY2hhbihjKTsKKworCWlmIChpb2F0X2lzX2NvbXBsZXRlKGMsIGNvb2tpZSwgZG9uZSwgdXNlZCkgPT0gRE1BX1NVQ0NFU1MpCisJCXJldHVybiBETUFfU1VDQ0VTUzsKKworCWlvYXQxX2NsZWFudXAoaW9hdCk7CisKKwlyZXR1cm4gaW9hdF9pc19jb21wbGV0ZShjLCBjb29raWUsIGRvbmUsIHVzZWQpOworfQorCitzdGF0aWMgdm9pZCBpb2F0MV9kbWFfc3RhcnRfbnVsbF9kZXNjKHN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0KQoreworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisJc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYzsKKwlzdHJ1Y3QgaW9hdF9kbWFfZGVzY3JpcHRvciAqaHc7CisKKwlzcGluX2xvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisKKwlkZXNjID0gaW9hdDFfZG1hX2dldF9uZXh0X2Rlc2NyaXB0b3IoaW9hdCk7CisKKwlpZiAoIWRlc2MpIHsKKwkJZGV2X2Vycih0b19kZXYoY2hhbiksCisJCQkiVW5hYmxlIHRvIHN0YXJ0IG51bGwgZGVzYyAtIGdldCBuZXh0IGRlc2MgZmFpbGVkXG4iKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPmRlc2NfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlodyA9IGRlc2MtPmh3OworCWh3LT5jdGwgPSAwOworCWh3LT5jdGxfZi5udWxsID0gMTsKKwlody0+Y3RsX2YuaW50X2VuID0gMTsKKwlody0+Y3RsX2YuY29tcGxfd3JpdGUgPSAxOworCS8qIHNldCBzaXplIHRvIG5vbi16ZXJvIHZhbHVlIChjaGFubmVsIHJldHVybnMgZXJyb3Igd2hlbiBzaXplIGlzIDApICovCisJaHctPnNpemUgPSBOVUxMX0RFU0NfQlVGRkVSX1NJWkU7CisJaHctPnNyY19hZGRyID0gMDsKKwlody0+ZHN0X2FkZHIgPSAwOworCWFzeW5jX3R4X2FjaygmZGVzYy0+dHhkKTsKKwlody0+bmV4dCA9IDA7CisJbGlzdF9hZGRfdGFpbCgmZGVzYy0+bm9kZSwgJmlvYXQtPnVzZWRfZGVzYyk7CisJZHVtcF9kZXNjX2RiZyhpb2F0LCBkZXNjKTsKKworCWlvYXRfc2V0X2NoYWluYWRkcihpb2F0LCBkZXNjLT50eGQucGh5cyk7CisJaW9hdF9zdGFydChjaGFuKTsKKwlzcGluX3VubG9ja19iaCgmaW9hdC0+ZGVzY19sb2NrKTsKK30KKworLyoKKyAqIFBlcmZvcm0gYSBJT0FUIHRyYW5zYWN0aW9uIHRvIHZlcmlmeSB0aGUgSFcgd29ya3MuCisgKi8KKyNkZWZpbmUgSU9BVF9URVNUX1NJWkUgMjAwMAorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW9hdF9kbWFfdGVzdF9jYWxsYmFjayh2b2lkICpkbWFfYXN5bmNfcGFyYW0pCit7CisJc3RydWN0IGNvbXBsZXRpb24gKmNtcCA9IGRtYV9hc3luY19wYXJhbTsKKworCWNvbXBsZXRlKGNtcCk7Cit9CisKKy8qKgorICogaW9hdF9kbWFfc2VsZl90ZXN0IC0gUGVyZm9ybSBhIElPQVQgdHJhbnNhY3Rpb24gdG8gdmVyaWZ5IHRoZSBIVyB3b3Jrcy4KKyAqIEBkZXZpY2U6IGRldmljZSB0byBiZSB0ZXN0ZWQKKyAqLworaW50IF9fZGV2aW5pdCBpb2F0X2RtYV9zZWxmX3Rlc3Qoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IGk7CisJdTggKnNyYzsKKwl1OCAqZGVzdDsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hID0gJmRldmljZS0+Y29tbW9uOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPnBkZXYtPmRldjsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisJZG1hX2FkZHJfdCBkbWFfZGVzdCwgZG1hX3NyYzsKKwlkbWFfY29va2llX3QgY29va2llOworCWludCBlcnIgPSAwOworCXN0cnVjdCBjb21wbGV0aW9uIGNtcDsKKwl1bnNpZ25lZCBsb25nIHRtbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3JjID0ga3phbGxvYyhzaXplb2YodTgpICogSU9BVF9URVNUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghc3JjKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkZXN0ID0ga3phbGxvYyhzaXplb2YodTgpICogSU9BVF9URVNUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGVzdCkgeworCQlrZnJlZShzcmMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBGaWxsIGluIHNyYyBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSU9BVF9URVNUX1NJWkU7IGkrKykKKwkJc3JjW2ldID0gKHU4KWk7CisKKwkvKiBTdGFydCBjb3B5LCB1c2luZyBmaXJzdCBETUEgY2hhbm5lbCAqLworCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRtYS0+Y2hhbm5lbHMubmV4dCwgc3RydWN0IGRtYV9jaGFuLAorCQkJCWRldmljZV9ub2RlKTsKKwlpZiAoZG1hLT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pIDwgMSkgeworCQlkZXZfZXJyKGRldiwgInNlbGZ0ZXN0IGNhbm5vdCBhbGxvY2F0ZSBjaGFuIHJlc291cmNlXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJZG1hX3NyYyA9IGRtYV9tYXBfc2luZ2xlKGRldiwgc3JjLCBJT0FUX1RFU1RfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJZG1hX2Rlc3QgPSBkbWFfbWFwX3NpbmdsZShkZXYsIGRlc3QsIElPQVRfVEVTVF9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCWZsYWdzID0gRE1BX0NPTVBMX1NSQ19VTk1BUF9TSU5HTEUgfCBETUFfQ09NUExfREVTVF9VTk1BUF9TSU5HTEUgfAorCQlETUFfUFJFUF9JTlRFUlJVUFQ7CisJdHggPSBkZXZpY2UtPmNvbW1vbi5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5KGRtYV9jaGFuLCBkbWFfZGVzdCwgZG1hX3NyYywKKwkJCQkJCSAgIElPQVRfVEVTVF9TSVpFLCBmbGFncyk7CisJaWYgKCF0eCkgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCBwcmVwIGZhaWxlZCwgZGlzYWJsaW5nXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwlhc3luY190eF9hY2sodHgpOworCWluaXRfY29tcGxldGlvbigmY21wKTsKKwl0eC0+Y2FsbGJhY2sgPSBpb2F0X2RtYV90ZXN0X2NhbGxiYWNrOworCXR4LT5jYWxsYmFja19wYXJhbSA9ICZjbXA7CisJY29va2llID0gdHgtPnR4X3N1Ym1pdCh0eCk7CisJaWYgKGNvb2tpZSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJTZWxmLXRlc3Qgc2V0dXAgZmFpbGVkLCBkaXNhYmxpbmdcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKwlkbWEtPmRldmljZV9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKKworCXRtbyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY21wLCBtc2Vjc190b19qaWZmaWVzKDMwMDApKTsKKworCWlmICh0bW8gPT0gMCB8fAorCSAgICBkbWEtPmRldmljZV9pc190eF9jb21wbGV0ZShkbWFfY2hhbiwgY29va2llLCBOVUxMLCBOVUxMKQorCQkJCQkhPSBETUFfU1VDQ0VTUykgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCBjb3B5IHRpbWVkIG91dCwgZGlzYWJsaW5nXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisJaWYgKG1lbWNtcChzcmMsIGRlc3QsIElPQVRfVEVTVF9TSVpFKSkgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCBjb3B5IGZhaWxlZCBjb21wYXJlLCBkaXNhYmxpbmdcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKworZnJlZV9yZXNvdXJjZXM6CisJZG1hLT5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcyhkbWFfY2hhbik7CitvdXQ6CisJa2ZyZWUoc3JjKTsKKwlrZnJlZShkZXN0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY2hhciBpb2F0X2ludGVycnVwdF9zdHlsZVszMl0gPSAibXNpeCI7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGlvYXRfaW50ZXJydXB0X3N0eWxlLCBpb2F0X2ludGVycnVwdF9zdHlsZSwKKwkJICAgIHNpemVvZihpb2F0X2ludGVycnVwdF9zdHlsZSksIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpb2F0X2ludGVycnVwdF9zdHlsZSwKKwkJICJzZXQgaW9hdCBpbnRlcnJ1cHQgc3R5bGU6IG1zaXggKGRlZmF1bHQpLCAiCisJCSAibXNpeC1zaW5nbGUtdmVjdG9yLCBtc2ksIGludHgpIik7CisKKy8qKgorICogaW9hdF9kbWFfc2V0dXBfaW50ZXJydXB0cyAtIHNldHVwIGludGVycnVwdCBoYW5kbGVyCisgKiBAZGV2aWNlOiBpb2F0IGRldmljZQorICovCitzdGF0aWMgaW50IGlvYXRfZG1hX3NldHVwX2ludGVycnVwdHMoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW47CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZpY2UtPnBkZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeDsKKwlpbnQgaSwgaiwgbXNpeGNudDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwl1OCBpbnRyY3RybCA9IDA7CisKKwlpZiAoIXN0cmNtcChpb2F0X2ludGVycnVwdF9zdHlsZSwgIm1zaXgiKSkKKwkJZ290byBtc2l4OworCWlmICghc3RyY21wKGlvYXRfaW50ZXJydXB0X3N0eWxlLCAibXNpeC1zaW5nbGUtdmVjdG9yIikpCisJCWdvdG8gbXNpeF9zaW5nbGVfdmVjdG9yOworCWlmICghc3RyY21wKGlvYXRfaW50ZXJydXB0X3N0eWxlLCAibXNpIikpCisJCWdvdG8gbXNpOworCWlmICghc3RyY21wKGlvYXRfaW50ZXJydXB0X3N0eWxlLCAiaW50eCIpKQorCQlnb3RvIGludHg7CisJZGV2X2VycihkZXYsICJpbnZhbGlkIGlvYXRfaW50ZXJydXB0X3N0eWxlICVzXG4iLCBpb2F0X2ludGVycnVwdF9zdHlsZSk7CisJZ290byBlcnJfbm9faXJxOworCittc2l4OgorCS8qIFRoZSBudW1iZXIgb2YgTVNJLVggdmVjdG9ycyBzaG91bGQgZXF1YWwgdGhlIG51bWJlciBvZiBjaGFubmVscyAqLworCW1zaXhjbnQgPSBkZXZpY2UtPmNvbW1vbi5jaGFuY250OworCWZvciAoaSA9IDA7IGkgPCBtc2l4Y250OyBpKyspCisJCWRldmljZS0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKKworCWVyciA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCBkZXZpY2UtPm1zaXhfZW50cmllcywgbXNpeGNudCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gbXNpOworCWlmIChlcnIgPiAwKQorCQlnb3RvIG1zaXhfc2luZ2xlX3ZlY3RvcjsKKworCWZvciAoaSA9IDA7IGkgPCBtc2l4Y250OyBpKyspIHsKKwkJbXNpeCA9ICZkZXZpY2UtPm1zaXhfZW50cmllc1tpXTsKKwkJY2hhbiA9IGlvYXRfY2hhbl9ieV9pbmRleChkZXZpY2UsIGkpOworCQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgbXNpeC0+dmVjdG9yLAorCQkJCSAgICAgICBpb2F0X2RtYV9kb19pbnRlcnJ1cHRfbXNpeCwgMCwKKwkJCQkgICAgICAgImlvYXQtbXNpeCIsIGNoYW4pOworCQlpZiAoZXJyKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJbXNpeCA9ICZkZXZpY2UtPm1zaXhfZW50cmllc1tqXTsKKwkJCQljaGFuID0gaW9hdF9jaGFuX2J5X2luZGV4KGRldmljZSwgaik7CisJCQkJZGV2bV9mcmVlX2lycShkZXYsIG1zaXgtPnZlY3RvciwgY2hhbik7CisJCQl9CisJCQlnb3RvIG1zaXhfc2luZ2xlX3ZlY3RvcjsKKwkJfQorCX0KKwlpbnRyY3RybCB8PSBJT0FUX0lOVFJDVFJMX01TSVhfVkVDVE9SX0NPTlRST0w7CisJZ290byBkb25lOworCittc2l4X3NpbmdsZV92ZWN0b3I6CisJbXNpeCA9ICZkZXZpY2UtPm1zaXhfZW50cmllc1swXTsKKwltc2l4LT5lbnRyeSA9IDA7CisJZXJyID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIGRldmljZS0+bXNpeF9lbnRyaWVzLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG1zaTsKKworCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBtc2l4LT52ZWN0b3IsIGlvYXRfZG1hX2RvX2ludGVycnVwdCwgMCwKKwkJCSAgICAgICAiaW9hdC1tc2l4IiwgZGV2aWNlKTsKKwlpZiAoZXJyKSB7CisJCXBjaV9kaXNhYmxlX21zaXgocGRldik7CisJCWdvdG8gbXNpOworCX0KKwlnb3RvIGRvbmU7CisKK21zaToKKwllcnIgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGludHg7CisKKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcGRldi0+aXJxLCBpb2F0X2RtYV9kb19pbnRlcnJ1cHQsIDAsCisJCQkgICAgICAgImlvYXQtbXNpIiwgZGV2aWNlKTsKKwlpZiAoZXJyKSB7CisJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKwkJZ290byBpbnR4OworCX0KKwlnb3RvIGRvbmU7CisKK2ludHg6CisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIHBkZXYtPmlycSwgaW9hdF9kbWFfZG9faW50ZXJydXB0LAorCQkJICAgICAgIElSUUZfU0hBUkVELCAiaW9hdC1pbnR4IiwgZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9ub19pcnE7CisKK2RvbmU6CisJaWYgKGRldmljZS0+aW50cl9xdWlyaykKKwkJZGV2aWNlLT5pbnRyX3F1aXJrKGRldmljZSk7CisJaW50cmN0cmwgfD0gSU9BVF9JTlRSQ1RSTF9NQVNURVJfSU5UX0VOOworCXdyaXRlYihpbnRyY3RybCwgZGV2aWNlLT5yZWdfYmFzZSArIElPQVRfSU5UUkNUUkxfT0ZGU0VUKTsKKwlyZXR1cm4gMDsKKworZXJyX25vX2lycToKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiAqLworCXdyaXRlYigwLCBkZXZpY2UtPnJlZ19iYXNlICsgSU9BVF9JTlRSQ1RSTF9PRkZTRVQpOworCWRldl9lcnIoZGV2LCAibm8gdXNhYmxlIGludGVycnVwdHNcbiIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGlvYXRfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKQoreworCS8qIERpc2FibGUgYWxsIGludGVycnVwdCBnZW5lcmF0aW9uICovCisJd3JpdGViKDAsIGRldmljZS0+cmVnX2Jhc2UgKyBJT0FUX0lOVFJDVFJMX09GRlNFVCk7Cit9CisKK2ludCBfX2RldmluaXQgaW9hdF9wcm9iZShzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hID0gJmRldmljZS0+Y29tbW9uOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2aWNlLT5wZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisKKwkvKiBETUEgY29oZXJlbnQgbWVtb3J5IHBvb2wgZm9yIERNQSBkZXNjcmlwdG9yIGFsbG9jYXRpb25zICovCisJZGV2aWNlLT5kbWFfcG9vbCA9IHBjaV9wb29sX2NyZWF0ZSgiZG1hX2Rlc2NfcG9vbCIsIHBkZXYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW9hdF9kbWFfZGVzY3JpcHRvciksCisJCQkJCSAgIDY0LCAwKTsKKwlpZiAoIWRldmljZS0+ZG1hX3Bvb2wpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZG1hX3Bvb2w7CisJfQorCisJZGV2aWNlLT5jb21wbGV0aW9uX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUoImNvbXBsZXRpb25fcG9vbCIsIHBkZXYsCisJCQkJCQkgIHNpemVvZih1NjQpLCBTTVBfQ0FDSEVfQllURVMsCisJCQkJCQkgIFNNUF9DQUNIRV9CWVRFUyk7CisKKwlpZiAoIWRldmljZS0+Y29tcGxldGlvbl9wb29sKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2NvbXBsZXRpb25fcG9vbDsKKwl9CisKKwlkZXZpY2UtPmVudW1lcmF0ZV9jaGFubmVscyhkZXZpY2UpOworCisJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgZG1hLT5jYXBfbWFzayk7CisJZG1hLT5kZXYgPSAmcGRldi0+ZGV2OworCisJaWYgKCFkbWEtPmNoYW5jbnQpIHsKKwkJZGV2X2VycihkZXYsICJ6ZXJvIGNoYW5uZWxzIGRldGVjdGVkXG4iKTsKKwkJZ290byBlcnJfc2V0dXBfaW50ZXJydXB0czsKKwl9CisKKwllcnIgPSBpb2F0X2RtYV9zZXR1cF9pbnRlcnJ1cHRzKGRldmljZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfc2V0dXBfaW50ZXJydXB0czsKKworCWVyciA9IGRldmljZS0+c2VsZl90ZXN0KGRldmljZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfc2VsZl90ZXN0OworCisJcmV0dXJuIDA7CisKK2Vycl9zZWxmX3Rlc3Q6CisJaW9hdF9kaXNhYmxlX2ludGVycnVwdHMoZGV2aWNlKTsKK2Vycl9zZXR1cF9pbnRlcnJ1cHRzOgorCXBjaV9wb29sX2Rlc3Ryb3koZGV2aWNlLT5jb21wbGV0aW9uX3Bvb2wpOworZXJyX2NvbXBsZXRpb25fcG9vbDoKKwlwY2lfcG9vbF9kZXN0cm95KGRldmljZS0+ZG1hX3Bvb2wpOworZXJyX2RtYV9wb29sOgorCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2RldmluaXQgaW9hdF9yZWdpc3RlcihzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgZXJyID0gZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcigmZGV2aWNlLT5jb21tb24pOworCisJaWYgKGVycikgeworCQlpb2F0X2Rpc2FibGVfaW50ZXJydXB0cyhkZXZpY2UpOworCQlwY2lfcG9vbF9kZXN0cm95KGRldmljZS0+Y29tcGxldGlvbl9wb29sKTsKKwkJcGNpX3Bvb2xfZGVzdHJveShkZXZpY2UtPmRtYV9wb29sKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBpb2F0MV9pbnRyX3F1aXJrIC0gZml4IHVwIGRtYSBjdHJsIHJlZ2lzdGVyIHRvIGVuYWJsZSAvIGRpc2FibGUgbXNpICovCitzdGF0aWMgdm9pZCBpb2F0MV9pbnRyX3F1aXJrKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2aWNlLT5wZGV2OworCXUzMiBkbWFjdHJsOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIElPQVRfUENJX0RNQUNUUkxfT0ZGU0VULCAmZG1hY3RybCk7CisJaWYgKHBkZXYtPm1zaV9lbmFibGVkKQorCQlkbWFjdHJsIHw9IElPQVRfUENJX0RNQUNUUkxfTVNJX0VOOworCWVsc2UKKwkJZG1hY3RybCAmPSB+SU9BVF9QQ0lfRE1BQ1RSTF9NU0lfRU47CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBJT0FUX1BDSV9ETUFDVFJMX09GRlNFVCwgZG1hY3RybCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJpbmdfc2l6ZV9zaG93KHN0cnVjdCBkbWFfY2hhbiAqYywgY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXRfY2hhbihjKTsKKworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgaW9hdC0+ZGVzY2NvdW50KTsKK30KK3N0YXRpYyBzdHJ1Y3QgaW9hdF9zeXNmc19lbnRyeSByaW5nX3NpemVfYXR0ciA9IF9fQVRUUl9STyhyaW5nX3NpemUpOworCitzdGF0aWMgc3NpemVfdCByaW5nX2FjdGl2ZV9zaG93KHN0cnVjdCBkbWFfY2hhbiAqYywgY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXRfY2hhbihjKTsKKworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgaW9hdC0+YWN0aXZlKTsKK30KK3N0YXRpYyBzdHJ1Y3QgaW9hdF9zeXNmc19lbnRyeSByaW5nX2FjdGl2ZV9hdHRyID0gX19BVFRSX1JPKHJpbmdfYWN0aXZlKTsKKworc3RhdGljIHNzaXplX3QgY2FwX3Nob3coc3RydWN0IGRtYV9jaGFuICpjLCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBkbWFfZGV2aWNlICpkbWEgPSBjLT5kZXZpY2U7CisKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiY29weSVzJXMlcyVzJXMlc1xuIiwKKwkJICAgICAgIGRtYV9oYXNfY2FwKERNQV9QUSwgZG1hLT5jYXBfbWFzaykgPyAiIHBxIiA6ICIiLAorCQkgICAgICAgZG1hX2hhc19jYXAoRE1BX1BRX1ZBTCwgZG1hLT5jYXBfbWFzaykgPyAiIHBxX3ZhbCIgOiAiIiwKKwkJICAgICAgIGRtYV9oYXNfY2FwKERNQV9YT1IsIGRtYS0+Y2FwX21hc2spID8gIiB4b3IiIDogIiIsCisJCSAgICAgICBkbWFfaGFzX2NhcChETUFfWE9SX1ZBTCwgZG1hLT5jYXBfbWFzaykgPyAiIHhvcl92YWwiIDogIiIsCisJCSAgICAgICBkbWFfaGFzX2NhcChETUFfTUVNU0VULCBkbWEtPmNhcF9tYXNrKSAgPyAiIGZpbGwiIDogIiIsCisJCSAgICAgICBkbWFfaGFzX2NhcChETUFfSU5URVJSVVBULCBkbWEtPmNhcF9tYXNrKSA/ICIgaW50ciIgOiAiIik7CisKK30KK3N0cnVjdCBpb2F0X3N5c2ZzX2VudHJ5IGlvYXRfY2FwX2F0dHIgPSBfX0FUVFJfUk8oY2FwKTsKKworc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBkbWFfY2hhbiAqYywgY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hID0gYy0+ZGV2aWNlOworCXN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlID0gdG9faW9hdGRtYV9kZXZpY2UoZG1hKTsKKworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZC4lZFxuIiwKKwkJICAgICAgIGRldmljZS0+dmVyc2lvbiA+PiA0LCBkZXZpY2UtPnZlcnNpb24gJiAweGYpOworfQorc3RydWN0IGlvYXRfc3lzZnNfZW50cnkgaW9hdF92ZXJzaW9uX2F0dHIgPSBfX0FUVFJfUk8odmVyc2lvbik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppb2F0MV9hdHRyc1tdID0geworCSZyaW5nX3NpemVfYXR0ci5hdHRyLAorCSZyaW5nX2FjdGl2ZV9hdHRyLmF0dHIsCisJJmlvYXRfY2FwX2F0dHIuYXR0ciwKKwkmaW9hdF92ZXJzaW9uX2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHNzaXplX3QKK2lvYXRfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBpb2F0X3N5c2ZzX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbjsKKworCWVudHJ5ID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBpb2F0X3N5c2ZzX2VudHJ5LCBhdHRyKTsKKwljaGFuID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpb2F0X2NoYW5fY29tbW9uLCBrb2JqKTsKKworCWlmICghZW50cnktPnNob3cpCisJCXJldHVybiAtRUlPOworCXJldHVybiBlbnRyeS0+c2hvdygmY2hhbi0+Y29tbW9uLCBwYWdlKTsKK30KKworc3RydWN0IHN5c2ZzX29wcyBpb2F0X3N5c2ZzX29wcyA9IHsKKwkuc2hvdwk9IGlvYXRfYXR0cl9zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgaW9hdDFfa3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZpb2F0X3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycyA9IGlvYXQxX2F0dHJzLAorfTsKKwordm9pZCBpb2F0X2tvYmplY3RfYWRkKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3Qga29ial90eXBlICp0eXBlKQoreworCXN0cnVjdCBkbWFfZGV2aWNlICpkbWEgPSAmZGV2aWNlLT5jb21tb247CisJc3RydWN0IGRtYV9jaGFuICpjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmZG1hLT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKKwkJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4gPSB0b19jaGFuX2NvbW1vbihjKTsKKwkJc3RydWN0IGtvYmplY3QgKnBhcmVudCA9ICZjLT5kZXYtPmRldmljZS5rb2JqOworCQlpbnQgZXJyOworCisJCWVyciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZjaGFuLT5rb2JqLCB0eXBlLCBwYXJlbnQsICJxdWlja2RhdGEiKTsKKwkJaWYgKGVycikgeworCQkJZGV2X3dhcm4odG9fZGV2KGNoYW4pLAorCQkJCSAic3lzZnMgaW5pdCBlcnJvciAoJWQpLCBjb250aW51aW5nLi4uXG4iLCBlcnIpOworCQkJa29iamVjdF9wdXQoJmNoYW4tPmtvYmopOworCQkJc2V0X2JpdChJT0FUX0tPQkpfSU5JVF9GQUlMLCAmY2hhbi0+c3RhdGUpOworCQl9CisJfQorfQorCit2b2lkIGlvYXRfa29iamVjdF9kZWwoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRtYSA9ICZkZXZpY2UtPmNvbW1vbjsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZkbWEtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkgeworCQlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9IHRvX2NoYW5fY29tbW9uKGMpOworCisJCWlmICghdGVzdF9iaXQoSU9BVF9LT0JKX0lOSVRfRkFJTCwgJmNoYW4tPnN0YXRlKSkgeworCQkJa29iamVjdF9kZWwoJmNoYW4tPmtvYmopOworCQkJa29iamVjdF9wdXQoJmNoYW4tPmtvYmopOworCQl9CisJfQorfQorCitpbnQgX19kZXZpbml0IGlvYXQxX2RtYV9wcm9iZShzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSwgaW50IGRjYSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldmljZS0+cGRldjsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hOworCWludCBlcnI7CisKKwlkZXZpY2UtPmludHJfcXVpcmsgPSBpb2F0MV9pbnRyX3F1aXJrOworCWRldmljZS0+ZW51bWVyYXRlX2NoYW5uZWxzID0gaW9hdDFfZW51bWVyYXRlX2NoYW5uZWxzOworCWRldmljZS0+c2VsZl90ZXN0ID0gaW9hdF9kbWFfc2VsZl90ZXN0OworCWRtYSA9ICZkZXZpY2UtPmNvbW1vbjsKKwlkbWEtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkgPSBpb2F0MV9kbWFfcHJlcF9tZW1jcHk7CisJZG1hLT5kZXZpY2VfaXNzdWVfcGVuZGluZyA9IGlvYXQxX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZzsKKwlkbWEtPmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyA9IGlvYXQxX2RtYV9hbGxvY19jaGFuX3Jlc291cmNlczsKKwlkbWEtPmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0gaW9hdDFfZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXM7CisJZG1hLT5kZXZpY2VfaXNfdHhfY29tcGxldGUgPSBpb2F0MV9kbWFfaXNfY29tcGxldGU7CisKKwllcnIgPSBpb2F0X3Byb2JlKGRldmljZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpb2F0X3NldF90Y3BfY29weV9icmVhayg0MDk2KTsKKwllcnIgPSBpb2F0X3JlZ2lzdGVyKGRldmljZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpb2F0X2tvYmplY3RfYWRkKGRldmljZSwgJmlvYXQxX2t0eXBlKTsKKworCWlmIChkY2EpCisJCWRldmljZS0+ZGNhID0gaW9hdF9kY2FfaW5pdChwZGV2LCBkZXZpY2UtPnJlZ19iYXNlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgX19kZXZleGl0IGlvYXRfZG1hX3JlbW92ZShzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hID0gJmRldmljZS0+Y29tbW9uOworCisJaW9hdF9kaXNhYmxlX2ludGVycnVwdHMoZGV2aWNlKTsKKworCWlvYXRfa29iamVjdF9kZWwoZGV2aWNlKTsKKworCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcihkbWEpOworCisJcGNpX3Bvb2xfZGVzdHJveShkZXZpY2UtPmRtYV9wb29sKTsKKwlwY2lfcG9vbF9kZXN0cm95KGRldmljZS0+Y29tcGxldGlvbl9wb29sKTsKKworCUlOSVRfTElTVF9IRUFEKCZkbWEtPmNoYW5uZWxzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hLmggYi9kcml2ZXJzL2RtYS9pb2F0L2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNGZkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYS5oCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDQgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqLworI2lmbmRlZiBJT0FURE1BX0gKKyNkZWZpbmUgSU9BVERNQV9ICisKKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjZGVmaW5lIElPQVRfRE1BX1ZFUlNJT04gICI0LjAwIgorCisjZGVmaW5lIElPQVRfTE9XX0NPTVBMRVRJT05fTUFTSwkweGZmZmZmZmMwCisjZGVmaW5lIElPQVRfRE1BX0RDQV9BTllfQ1BVCQl+MAorCisjZGVmaW5lIHRvX2lvYXRkbWFfZGV2aWNlKGRldikgY29udGFpbmVyX29mKGRldiwgc3RydWN0IGlvYXRkbWFfZGV2aWNlLCBjb21tb24pCisjZGVmaW5lIHRvX2lvYXRfZGVzYyhsaCkgY29udGFpbmVyX29mKGxoLCBzdHJ1Y3QgaW9hdF9kZXNjX3N3LCBub2RlKQorI2RlZmluZSB0eF90b19pb2F0X2Rlc2ModHgpIGNvbnRhaW5lcl9vZih0eCwgc3RydWN0IGlvYXRfZGVzY19zdywgdHhkKQorI2RlZmluZSB0b19kZXYoaW9hdF9jaGFuKSAoJihpb2F0X2NoYW4pLT5kZXZpY2UtPnBkZXYtPmRldikKKworI2RlZmluZSBjaGFuX251bShjaCkgKChpbnQpKChjaCktPnJlZ19iYXNlIC0gKGNoKS0+ZGV2aWNlLT5yZWdfYmFzZSkgLyAweDgwKQorCisvKgorICogd29ya2Fyb3VuZCBmb3IgSU9BVCB2ZXIuMy4wIG51bGwgZGVzY3JpcHRvciBpc3N1ZQorICogKGNoYW5uZWwgcmV0dXJucyBlcnJvciB3aGVuIHNpemUgaXMgMCkKKyAqLworI2RlZmluZSBOVUxMX0RFU0NfQlVGRkVSX1NJWkUgMQorCisvKioKKyAqIHN0cnVjdCBpb2F0ZG1hX2RldmljZSAtIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgSU9BVCBkZXZpY2UKKyAqIEBwZGV2OiBQQ0ktRXhwcmVzcyBkZXZpY2UKKyAqIEByZWdfYmFzZTogTU1JTyByZWdpc3RlciBzcGFjZSBiYXNlIGFkZHJlc3MKKyAqIEBkbWFfcG9vbDogZm9yIGFsbG9jYXRpbmcgRE1BIGRlc2NyaXB0b3JzCisgKiBAY29tbW9uOiBlbWJlZGRlZCBzdHJ1Y3QgZG1hX2RldmljZQorICogQHZlcnNpb246IHZlcnNpb24gb2YgaW9hdGRtYSBkZXZpY2UKKyAqIEBtc2l4X2VudHJpZXM6IGlycSBoYW5kbGVycworICogQGlkeDogcGVyIGNoYW5uZWwgZGF0YQorICogQGRjYTogZGlyZWN0IGNhY2hlIGFjY2VzcyBjb250ZXh0CisgKiBAaW50cl9xdWlyazogaW50ZXJydXB0IHNldHVwIHF1aXJrIChmb3IgaW9hdF92MSBkZXZpY2VzKQorICogQGVudW1lcmF0ZV9jaGFubmVsczogaHcgdmVyc2lvbiBzcGVjaWZpYyBjaGFubmVsIGVudW1lcmF0aW9uCisgKiBAY2xlYW51cF90YXNrbGV0OiBzZWxlY3QgYmV0d2VlbiB0aGUgdjIgYW5kIHYzIGNsZWFudXAgcm91dGluZXMKKyAqIEB0aW1lcl9mbjogc2VsZWN0IGJldHdlZW4gdGhlIHYyIGFuZCB2MyB0aW1lciB3YXRjaGRvZyByb3V0aW5lcworICogQHNlbGZfdGVzdDogaGFyZHdhcmUgdmVyc2lvbiBzcGVjaWZpYyBzZWxmIHRlc3QgZm9yIGVhY2ggc3VwcG9ydGVkIG9wIHR5cGUKKyAqCisgKiBOb3RlOiB0aGUgdjMgY2xlYW51cCByb3V0aW5lIHN1cHBvcnRzIHJhaWQgb3BlcmF0aW9ucworICovCitzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7CisJc3RydWN0IHBjaV9wb29sICpkbWFfcG9vbDsKKwlzdHJ1Y3QgcGNpX3Bvb2wgKmNvbXBsZXRpb25fcG9vbDsKKwlzdHJ1Y3QgZG1hX2RldmljZSBjb21tb247CisJdTggdmVyc2lvbjsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbNF07CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmlkeFs0XTsKKwlzdHJ1Y3QgZGNhX3Byb3ZpZGVyICpkY2E7CisJdm9pZCAoKmludHJfcXVpcmspKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKTsKKwlpbnQgKCplbnVtZXJhdGVfY2hhbm5lbHMpKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKTsKKwl2b2lkICgqY2xlYW51cF90YXNrbGV0KSh1bnNpZ25lZCBsb25nIGRhdGEpOworCXZvaWQgKCp0aW1lcl9mbikodW5zaWduZWQgbG9uZyBkYXRhKTsKKwlpbnQgKCpzZWxmX3Rlc3QpKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKTsKK307CisKK3N0cnVjdCBpb2F0X2NoYW5fY29tbW9uIHsKKwlzdHJ1Y3QgZG1hX2NoYW4gY29tbW9uOworCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBsYXN0X2NvbXBsZXRpb247CisJc3BpbmxvY2tfdCBjbGVhbnVwX2xvY2s7CisJZG1hX2Nvb2tpZV90IGNvbXBsZXRlZF9jb29raWU7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKwkjZGVmaW5lIElPQVRfQ09NUExFVElPTl9QRU5ESU5HIDAKKwkjZGVmaW5lIElPQVRfQ09NUExFVElPTl9BQ0sgMQorCSNkZWZpbmUgSU9BVF9SRVNFVF9QRU5ESU5HIDIKKwkjZGVmaW5lIElPQVRfS09CSl9JTklUX0ZBSUwgMworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCSNkZWZpbmUgQ09NUExFVElPTl9USU1FT1VUIG1zZWNzX3RvX2ppZmZpZXMoMTAwKQorCSNkZWZpbmUgSURMRV9USU1FT1VUIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkKKwkjZGVmaW5lIFJFU0VUX0RFTEFZIG1zZWNzX3RvX2ppZmZpZXMoMTAwKQorCXN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlOworCWRtYV9hZGRyX3QgY29tcGxldGlvbl9kbWE7CisJdTY0ICpjb21wbGV0aW9uOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBjbGVhbnVwX3Rhc2s7CisJc3RydWN0IGtvYmplY3Qga29iajsKK307CisKK3N0cnVjdCBpb2F0X3N5c2ZzX2VudHJ5IHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBkbWFfY2hhbiAqLCBjaGFyICopOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAtIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgRE1BIGNoYW5uZWwKKyAqLworc3RydWN0IGlvYXRfZG1hX2NoYW4geworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uIGJhc2U7CisKKwlzaXplX3QgeGZlcmNhcDsJLyogWEZFUkNBUCByZWdpc3RlciB2YWx1ZSBleHBhbmRlZCBvdXQgKi8KKworCXNwaW5sb2NrX3QgZGVzY19sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9kZXNjOworCXN0cnVjdCBsaXN0X2hlYWQgdXNlZF9kZXNjOworCisJaW50IHBlbmRpbmc7CisJdTE2IGRlc2Njb3VudDsKKwl1MTYgYWN0aXZlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqdG9fY2hhbl9jb21tb24oc3RydWN0IGRtYV9jaGFuICpjKQoreworCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0IGlvYXRfY2hhbl9jb21tb24sIGNvbW1vbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlvYXRfZG1hX2NoYW4gKnRvX2lvYXRfY2hhbihzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4gPSB0b19jaGFuX2NvbW1vbihjKTsKKworCXJldHVybiBjb250YWluZXJfb2YoY2hhbiwgc3RydWN0IGlvYXRfZG1hX2NoYW4sIGJhc2UpOworfQorCisvKioKKyAqIGlvYXRfaXNfY29tcGxldGUgLSBwb2xsIHRoZSBzdGF0dXMgb2YgYW4gaW9hdCB0cmFuc2FjdGlvbgorICogQGM6IGNoYW5uZWwgaGFuZGxlCisgKiBAY29va2llOiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyCisgKiBAZG9uZTogaWYgc2V0LCB1cGRhdGVkIHdpdGggbGFzdCBjb21wbGV0ZWQgdHJhbnNhY3Rpb24KKyAqIEB1c2VkOiBpZiBzZXQsIHVwZGF0ZWQgd2l0aCBsYXN0IHVzZWQgdHJhbnNhY3Rpb24KKyAqLworc3RhdGljIGlubGluZSBlbnVtIGRtYV9zdGF0dXMKK2lvYXRfaXNfY29tcGxldGUoc3RydWN0IGRtYV9jaGFuICpjLCBkbWFfY29va2llX3QgY29va2llLAorCQkgZG1hX2Nvb2tpZV90ICpkb25lLCBkbWFfY29va2llX3QgKnVzZWQpCit7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4gPSB0b19jaGFuX2NvbW1vbihjKTsKKwlkbWFfY29va2llX3QgbGFzdF91c2VkOworCWRtYV9jb29raWVfdCBsYXN0X2NvbXBsZXRlOworCisJbGFzdF91c2VkID0gYy0+Y29va2llOworCWxhc3RfY29tcGxldGUgPSBjaGFuLT5jb21wbGV0ZWRfY29va2llOworCisJaWYgKGRvbmUpCisJCSpkb25lID0gbGFzdF9jb21wbGV0ZTsKKwlpZiAodXNlZCkKKwkJKnVzZWQgPSBsYXN0X3VzZWQ7CisKKwlyZXR1cm4gZG1hX2FzeW5jX2lzX2NvbXBsZXRlKGNvb2tpZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkKTsKK30KKworLyogd3JhcHBlciBhcm91bmQgaGFyZHdhcmUgZGVzY3JpcHRvciBmb3JtYXQgKyBhZGRpdGlvbmFsIHNvZnR3YXJlIGZpZWxkcyAqLworCisvKioKKyAqIHN0cnVjdCBpb2F0X2Rlc2Nfc3cgLSB3cmFwcGVyIGFyb3VuZCBoYXJkd2FyZSBkZXNjcmlwdG9yCisgKiBAaHc6IGhhcmR3YXJlIERNQSBkZXNjcmlwdG9yIChmb3IgbWVtY3B5KQorICogQG5vZGU6IHRoaXMgZGVzY3JpcHRvciB3aWxsIGVpdGhlciBiZSBvbiB0aGUgZnJlZSBsaXN0LAorICogICAgIG9yIGF0dGFjaGVkIHRvIGEgdHJhbnNhY3Rpb24gbGlzdCAodHhfbGlzdCkKKyAqIEB0eGQ6IHRoZSBnZW5lcmljIHNvZnR3YXJlIGRlc2NyaXB0b3IgZm9yIGFsbCBlbmdpbmVzCisgKiBAaWQ6IGlkZW50aWZpZXIgZm9yIGRlYnVnCisgKi8KK3N0cnVjdCBpb2F0X2Rlc2Nfc3cgeworCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc2l6ZV90IGxlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHR4X2xpc3Q7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yIHR4ZDsKKwkjaWZkZWYgREVCVUcKKwlpbnQgaWQ7CisJI2VuZGlmCit9OworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgc2V0X2Rlc2NfaWQoZGVzYywgaSkgKChkZXNjKS0+aWQgPSAoaSkpCisjZGVmaW5lIGRlc2NfaWQoZGVzYykgKChkZXNjKS0+aWQpCisjZWxzZQorI2RlZmluZSBzZXRfZGVzY19pZChkZXNjLCBpKQorI2RlZmluZSBkZXNjX2lkKGRlc2MpICgwKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19kdW1wX2Rlc2NfZGJnKHN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuLCBzdHJ1Y3QgaW9hdF9kbWFfZGVzY3JpcHRvciAqaHcsCisJCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgsIGludCBpZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoY2hhbik7CisKKwlkZXZfZGJnKGRldiwgImRlc2NbJWRdOiAoJSNsbHgtPiUjbGx4KSBjb29raWU6ICVkIGZsYWdzOiAlI3giCisJCSIgY3RsOiAlI3ggKG9wOiAlZCBpbnRfZW46ICVkIGNvbXBsOiAlZClcbiIsIGlkLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSB0eC0+cGh5cywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaHctPm5leHQsIHR4LT5jb29raWUsIHR4LT5mbGFncywKKwkJaHctPmN0bCwgaHctPmN0bF9mLm9wLCBody0+Y3RsX2YuaW50X2VuLCBody0+Y3RsX2YuY29tcGxfd3JpdGUpOworfQorCisjZGVmaW5lIGR1bXBfZGVzY19kYmcoYywgZCkgXAorCSh7IGlmIChkKSBfX2R1bXBfZGVzY19kYmcoJmMtPmJhc2UsIGQtPmh3LCAmZC0+dHhkLCBkZXNjX2lkKGQpKTsgMDsgfSkKKworc3RhdGljIGlubGluZSB2b2lkIGlvYXRfc2V0X3RjcF9jb3B5X2JyZWFrKHVuc2lnbmVkIGxvbmcgY29weWJyZWFrKQoreworCSNpZmRlZiBDT05GSUdfTkVUX0RNQQorCXN5c2N0bF90Y3BfZG1hX2NvcHlicmVhayA9IGNvcHlicmVhazsKKwkjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqCitpb2F0X2NoYW5fYnlfaW5kZXgoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UsIGludCBpbmRleCkKK3sKKwlyZXR1cm4gZGV2aWNlLT5pZHhbaW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBpb2F0X2NoYW5zdHMoc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4pCit7CisJdTggdmVyID0gY2hhbi0+ZGV2aWNlLT52ZXJzaW9uOworCXU2NCBzdGF0dXM7CisJdTMyIHN0YXR1c19sbzsKKworCS8qIFdlIG5lZWQgdG8gcmVhZCB0aGUgbG93IGFkZHJlc3MgZmlyc3QgYXMgdGhpcyBjYXVzZXMgdGhlCisJICogY2hpcHNldCB0byBsYXRjaCB0aGUgdXBwZXIgYml0cyBmb3IgdGhlIHN1YnNlcXVlbnQgcmVhZAorCSAqLworCXN0YXR1c19sbyA9IHJlYWRsKGNoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOU1RTX09GRlNFVF9MT1codmVyKSk7CisJc3RhdHVzID0gcmVhZGwoY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5TVFNfT0ZGU0VUX0hJR0godmVyKSk7CisJc3RhdHVzIDw8PSAzMjsKKwlzdGF0dXMgfD0gc3RhdHVzX2xvOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvYXRfc3RhcnQoc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4pCit7CisJdTggdmVyID0gY2hhbi0+ZGV2aWNlLT52ZXJzaW9uOworCisJd3JpdGViKElPQVRfQ0hBTkNNRF9TVEFSVCwgY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5DTURfT0ZGU0VUKHZlcikpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBpb2F0X2NoYW5zdHNfdG9fYWRkcih1NjQgc3RhdHVzKQoreworCXJldHVybiBzdGF0dXMgJiBJT0FUX0NIQU5TVFNfQ09NUExFVEVEX0RFU0NSSVBUT1JfQUREUjsKK30KKworc3RhdGljIGlubGluZSB1MzIgaW9hdF9jaGFuZXJyKHN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuKQoreworCXJldHVybiByZWFkbChjaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9hdF9zdXNwZW5kKHN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuKQoreworCXU4IHZlciA9IGNoYW4tPmRldmljZS0+dmVyc2lvbjsKKworCXdyaXRlYihJT0FUX0NIQU5DTURfU1VTUEVORCwgY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5DTURfT0ZGU0VUKHZlcikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9hdF9zZXRfY2hhaW5hZGRyKHN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0LCB1NjQgYWRkcikKK3sKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCisJd3JpdGVsKGFkZHIgJiAweDAwMDAwMDAwRkZGRkZGRkYsCisJICAgICAgIGNoYW4tPnJlZ19iYXNlICsgSU9BVDFfQ0hBSU5BRERSX09GRlNFVF9MT1cpOworCXdyaXRlbChhZGRyID4+IDMyLAorCSAgICAgICBjaGFuLT5yZWdfYmFzZSArIElPQVQxX0NIQUlOQUREUl9PRkZTRVRfSElHSCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19pb2F0X2FjdGl2ZSh1bnNpZ25lZCBsb25nIHN0YXR1cykKK3sKKwlyZXR1cm4gKChzdGF0dXMgJiBJT0FUX0NIQU5TVFNfU1RBVFVTKSA9PSBJT0FUX0NIQU5TVFNfQUNUSVZFKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2lvYXRfaWRsZSh1bnNpZ25lZCBsb25nIHN0YXR1cykKK3sKKwlyZXR1cm4gKChzdGF0dXMgJiBJT0FUX0NIQU5TVFNfU1RBVFVTKSA9PSBJT0FUX0NIQU5TVFNfRE9ORSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19pb2F0X2hhbHRlZCh1bnNpZ25lZCBsb25nIHN0YXR1cykKK3sKKwlyZXR1cm4gKChzdGF0dXMgJiBJT0FUX0NIQU5TVFNfU1RBVFVTKSA9PSBJT0FUX0NIQU5TVFNfSEFMVEVEKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2lvYXRfc3VzcGVuZGVkKHVuc2lnbmVkIGxvbmcgc3RhdHVzKQoreworCXJldHVybiAoKHN0YXR1cyAmIElPQVRfQ0hBTlNUU19TVEFUVVMpID09IElPQVRfQ0hBTlNUU19TVVNQRU5ERUQpOworfQorCisvKiBjaGFubmVsIHdhcyBmYXRhbGx5IHByb2dyYW1tZWQgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19pb2F0X2J1Zyh1bnNpZ25lZCBsb25nIGVycikKK3sKKwlyZXR1cm4gISEoZXJyICYgKElPQVRfQ0hBTkVSUl9TUkNfQUREUl9FUlJ8SU9BVF9DSEFORVJSX0RFU1RfQUREUl9FUlJ8CisJCQkgSU9BVF9DSEFORVJSX05FWFRfQUREUl9FUlJ8SU9BVF9DSEFORVJSX0NPTlRST0xfRVJSfAorCQkJIElPQVRfQ0hBTkVSUl9MRU5HVEhfRVJSKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb2F0X3VubWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBsZW4sCisJCQkgICAgICBpbnQgZGlyZWN0aW9uLCBlbnVtIGRtYV9jdHJsX2ZsYWdzIGZsYWdzLCBib29sIGRzdCkKK3sKKwlpZiAoKGRzdCAmJiAoZmxhZ3MgJiBETUFfQ09NUExfREVTVF9VTk1BUF9TSU5HTEUpKSB8fAorCSAgICAoIWRzdCAmJiAoZmxhZ3MgJiBETUFfQ09NUExfU1JDX1VOTUFQX1NJTkdMRSkpKQorCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIGFkZHIsIGxlbiwgZGlyZWN0aW9uKTsKKwllbHNlCisJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGFkZHIsIGxlbiwgZGlyZWN0aW9uKTsKK30KKworaW50IF9fZGV2aW5pdCBpb2F0X3Byb2JlKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKTsKK2ludCBfX2RldmluaXQgaW9hdF9yZWdpc3RlcihzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSk7CitpbnQgX19kZXZpbml0IGlvYXQxX2RtYV9wcm9iZShzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldiwgaW50IGRjYSk7CitpbnQgX19kZXZpbml0IGlvYXRfZG1hX3NlbGZfdGVzdChzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSk7Cit2b2lkIF9fZGV2ZXhpdCBpb2F0X2RtYV9yZW1vdmUoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpOworc3RydWN0IGRjYV9wcm92aWRlciAqIF9fZGV2aW5pdCBpb2F0X2RjYV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgICAgICB2b2lkIF9faW9tZW0gKmlvYmFzZSk7Cit1bnNpZ25lZCBsb25nIGlvYXRfZ2V0X2N1cnJlbnRfY29tcGxldGlvbihzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbik7Cit2b2lkIGlvYXRfaW5pdF9jaGFubmVsKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlLAorCQkgICAgICAgc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4sIGludCBpZHgsCisJCSAgICAgICB2b2lkICgqdGltZXJfZm4pKHVuc2lnbmVkIGxvbmcpLAorCQkgICAgICAgdm9pZCAoKnRhc2tsZXQpKHVuc2lnbmVkIGxvbmcpLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBpb2F0KTsKK3ZvaWQgaW9hdF9kbWFfdW5tYXAoc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4sIGVudW0gZG1hX2N0cmxfZmxhZ3MgZmxhZ3MsCisJCSAgICBzaXplX3QgbGVuLCBzdHJ1Y3QgaW9hdF9kbWFfZGVzY3JpcHRvciAqaHcpOworYm9vbCBpb2F0X2NsZWFudXBfcHJlYW1ibGUoc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4sCisJCQkgICB1bnNpZ25lZCBsb25nICpwaHlzX2NvbXBsZXRlKTsKK3ZvaWQgaW9hdF9rb2JqZWN0X2FkZChzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGtvYmpfdHlwZSAqdHlwZSk7Cit2b2lkIGlvYXRfa29iamVjdF9kZWwoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIHN0cnVjdCBzeXNmc19vcHMgaW9hdF9zeXNmc19vcHM7CitleHRlcm4gc3RydWN0IGlvYXRfc3lzZnNfZW50cnkgaW9hdF92ZXJzaW9uX2F0dHI7CitleHRlcm4gc3RydWN0IGlvYXRfc3lzZnNfZW50cnkgaW9hdF9jYXBfYXR0cjsKKyNlbmRpZiAvKiBJT0FURE1BX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hX3YyLmMgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYV92Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZmZhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYV92Mi5jCkBAIC0wLDAgKzEsODcxIEBACisvKgorICogSW50ZWwgSS9PQVQgRE1BIExpbnV4IGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDIwMDQgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFuIEludGVsIEkvT0FUIERNQSBlbmdpbmUgKHZlcnNpb25zID49IDIpLCB3aGljaAorICogZG9lcyBhc3luY2hyb25vdXMgZGF0YSBtb3ZlbWVudCBhbmQgY2hlY2tzdW1taW5nIG9wZXJhdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaTczMDBfaWRsZS5oPgorI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgImRtYV92Mi5oIgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgorI2luY2x1ZGUgImh3LmgiCisKK2ludCBpb2F0X3JpbmdfYWxsb2Nfb3JkZXIgPSA4OworbW9kdWxlX3BhcmFtKGlvYXRfcmluZ19hbGxvY19vcmRlciwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW9hdF9yaW5nX2FsbG9jX29yZGVyLAorCQkgImlvYXQyKzogYWxsb2NhdGUgMl5uIGRlc2NyaXB0b3JzIHBlciBjaGFubmVsIgorCQkgIiAoZGVmYXVsdDogOCBtYXg6IDE2KSIpOworc3RhdGljIGludCBpb2F0X3JpbmdfbWF4X2FsbG9jX29yZGVyID0gSU9BVF9NQVhfT1JERVI7Cittb2R1bGVfcGFyYW0oaW9hdF9yaW5nX21heF9hbGxvY19vcmRlciwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW9hdF9yaW5nX21heF9hbGxvY19vcmRlciwKKwkJICJpb2F0Mis6IHVwcGVyIGxpbWl0IGZvciByaW5nIHNpemUgKGRlZmF1bHQ6IDE2KSIpOworCit2b2lkIF9faW9hdDJfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQpCit7CisJdm9pZCAqIF9faW9tZW0gcmVnX2Jhc2UgPSBpb2F0LT5iYXNlLnJlZ19iYXNlOworCisJaW9hdC0+cGVuZGluZyA9IDA7CisJaW9hdC0+ZG1hY291bnQgKz0gaW9hdDJfcmluZ19wZW5kaW5nKGlvYXQpOworCWlvYXQtPmlzc3VlZCA9IGlvYXQtPmhlYWQ7CisJLyogbWFrZSBkZXNjcmlwdG9yIHVwZGF0ZXMgZ2xvYmFsbHkgdmlzaWJsZSBiZWZvcmUgbm90aWZ5aW5nIGNoYW5uZWwgKi8KKwl3bWIoKTsKKwl3cml0ZXcoaW9hdC0+ZG1hY291bnQsIHJlZ19iYXNlICsgSU9BVF9DSEFOX0RNQUNPVU5UX09GRlNFVCk7CisJZGV2X2RiZyh0b19kZXYoJmlvYXQtPmJhc2UpLAorCQkiJXM6IGhlYWQ6ICUjeCB0YWlsOiAlI3ggaXNzdWVkOiAlI3ggY291bnQ6ICUjeFxuIiwKKwkJX19mdW5jX18sIGlvYXQtPmhlYWQsIGlvYXQtPnRhaWwsIGlvYXQtPmlzc3VlZCwgaW9hdC0+ZG1hY291bnQpOworfQorCit2b2lkIGlvYXQyX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXQyX2NoYW4oY2hhbik7CisKKwlzcGluX2xvY2tfYmgoJmlvYXQtPnJpbmdfbG9jayk7CisJaWYgKGlvYXQtPnBlbmRpbmcgPT0gMSkKKwkJX19pb2F0Ml9pc3N1ZV9wZW5kaW5nKGlvYXQpOworCXNwaW5fdW5sb2NrX2JoKCZpb2F0LT5yaW5nX2xvY2spOworfQorCisvKioKKyAqIGlvYXQyX3VwZGF0ZV9wZW5kaW5nIC0gbG9nIHBlbmRpbmcgZGVzY3JpcHRvcnMKKyAqIEBpb2F0OiBpb2F0MisgY2hhbm5lbAorICoKKyAqIHNldCBwZW5kaW5nIHRvICcxJyB1bmxlc3MgcGVuZGluZyBpcyBhbHJlYWR5IHNldCB0byAnMicsIHBlbmRpbmcgPT0gMgorICogaW5kaWNhdGVzIHRoYXQgc3VibWlzc2lvbiBpcyB0ZW1wb3JhcmlseSBibG9ja2VkIGR1ZSB0byBhbiBpbi1mbGlnaHQKKyAqIHJlc2V0LiAgSWYgd2UgYXJlIGFscmVhZHkgYWJvdmUgdGhlIGlvYXRfcGVuZGluZ19sZXZlbCB0aHJlc2hvbGQgdGhlbgorICoganVzdCBpc3N1ZSBwZW5kaW5nLgorICoKKyAqIGNhbGxlZCB3aXRoIHJpbmdfbG9jayBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGlvYXQyX3VwZGF0ZV9wZW5kaW5nKHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCkKK3sKKwlpZiAodW5saWtlbHkoaW9hdC0+cGVuZGluZyA9PSAyKSkKKwkJcmV0dXJuOworCWVsc2UgaWYgKGlvYXQyX3JpbmdfcGVuZGluZyhpb2F0KSA+IGlvYXRfcGVuZGluZ19sZXZlbCkKKwkJX19pb2F0Ml9pc3N1ZV9wZW5kaW5nKGlvYXQpOworCWVsc2UKKwkJaW9hdC0+cGVuZGluZyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9hdDJfc3RhcnRfbnVsbF9kZXNjKHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCkKK3sKKwlzdHJ1Y3QgaW9hdF9yaW5nX2VudCAqZGVzYzsKKwlzdHJ1Y3QgaW9hdF9kbWFfZGVzY3JpcHRvciAqaHc7CisJaW50IGlkeDsKKworCWlmIChpb2F0Ml9yaW5nX3NwYWNlKGlvYXQpIDwgMSkgeworCQlkZXZfZXJyKHRvX2RldigmaW9hdC0+YmFzZSksCisJCQkiVW5hYmxlIHRvIHN0YXJ0IG51bGwgZGVzYyAtIHJpbmcgZnVsbFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXZfZGJnKHRvX2RldigmaW9hdC0+YmFzZSksICIlczogaGVhZDogJSN4IHRhaWw6ICUjeCBpc3N1ZWQ6ICUjeFxuIiwKKwkJX19mdW5jX18sIGlvYXQtPmhlYWQsIGlvYXQtPnRhaWwsIGlvYXQtPmlzc3VlZCk7CisJaWR4ID0gaW9hdDJfZGVzY19hbGxvYyhpb2F0LCAxKTsKKwlkZXNjID0gaW9hdDJfZ2V0X3JpbmdfZW50KGlvYXQsIGlkeCk7CisKKwlodyA9IGRlc2MtPmh3OworCWh3LT5jdGwgPSAwOworCWh3LT5jdGxfZi5udWxsID0gMTsKKwlody0+Y3RsX2YuaW50X2VuID0gMTsKKwlody0+Y3RsX2YuY29tcGxfd3JpdGUgPSAxOworCS8qIHNldCBzaXplIHRvIG5vbi16ZXJvIHZhbHVlIChjaGFubmVsIHJldHVybnMgZXJyb3Igd2hlbiBzaXplIGlzIDApICovCisJaHctPnNpemUgPSBOVUxMX0RFU0NfQlVGRkVSX1NJWkU7CisJaHctPnNyY19hZGRyID0gMDsKKwlody0+ZHN0X2FkZHIgPSAwOworCWFzeW5jX3R4X2FjaygmZGVzYy0+dHhkKTsKKwlpb2F0Ml9zZXRfY2hhaW5hZGRyKGlvYXQsIGRlc2MtPnR4ZC5waHlzKTsKKwlkdW1wX2Rlc2NfZGJnKGlvYXQsIGRlc2MpOworCV9faW9hdDJfaXNzdWVfcGVuZGluZyhpb2F0KTsKK30KKworc3RhdGljIHZvaWQgaW9hdDJfc3RhcnRfbnVsbF9kZXNjKHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCkKK3sKKwlzcGluX2xvY2tfYmgoJmlvYXQtPnJpbmdfbG9jayk7CisJX19pb2F0Ml9zdGFydF9udWxsX2Rlc2MoaW9hdCk7CisJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPnJpbmdfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY2xlYW51cChzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQsIHVuc2lnbmVkIGxvbmcgcGh5c19jb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmRlc2M7CisJYm9vbCBzZWVuX2N1cnJlbnQgPSBmYWxzZTsKKwl1MTYgYWN0aXZlOworCWludCBpOworCisJZGV2X2RiZyh0b19kZXYoY2hhbiksICIlczogaGVhZDogJSN4IHRhaWw6ICUjeCBpc3N1ZWQ6ICUjeFxuIiwKKwkJX19mdW5jX18sIGlvYXQtPmhlYWQsIGlvYXQtPnRhaWwsIGlvYXQtPmlzc3VlZCk7CisKKwlhY3RpdmUgPSBpb2F0Ml9yaW5nX2FjdGl2ZShpb2F0KTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlICYmICFzZWVuX2N1cnJlbnQ7IGkrKykgeworCQlwcmVmZXRjaChpb2F0Ml9nZXRfcmluZ19lbnQoaW9hdCwgaW9hdC0+dGFpbCArIGkgKyAxKSk7CisJCWRlc2MgPSBpb2F0Ml9nZXRfcmluZ19lbnQoaW9hdCwgaW9hdC0+dGFpbCArIGkpOworCQl0eCA9ICZkZXNjLT50eGQ7CisJCWR1bXBfZGVzY19kYmcoaW9hdCwgZGVzYyk7CisJCWlmICh0eC0+Y29va2llKSB7CisJCQlpb2F0X2RtYV91bm1hcChjaGFuLCB0eC0+ZmxhZ3MsIGRlc2MtPmxlbiwgZGVzYy0+aHcpOworCQkJY2hhbi0+Y29tcGxldGVkX2Nvb2tpZSA9IHR4LT5jb29raWU7CisJCQl0eC0+Y29va2llID0gMDsKKwkJCWlmICh0eC0+Y2FsbGJhY2spIHsKKwkJCQl0eC0+Y2FsbGJhY2sodHgtPmNhbGxiYWNrX3BhcmFtKTsKKwkJCQl0eC0+Y2FsbGJhY2sgPSBOVUxMOworCQkJfQorCQl9CisKKwkJaWYgKHR4LT5waHlzID09IHBoeXNfY29tcGxldGUpCisJCQlzZWVuX2N1cnJlbnQgPSB0cnVlOworCX0KKwlpb2F0LT50YWlsICs9IGk7CisJQlVHX09OKCFzZWVuX2N1cnJlbnQpOyAvKiBubyBhY3RpdmUgZGVzY3MgaGF2ZSB3cml0dGVuIGEgY29tcGxldGlvbj8gKi8KKworCWNoYW4tPmxhc3RfY29tcGxldGlvbiA9IHBoeXNfY29tcGxldGU7CisJaWYgKGlvYXQtPmhlYWQgPT0gaW9hdC0+dGFpbCkgeworCQlkZXZfZGJnKHRvX2RldihjaGFuKSwgIiVzOiBjYW5jZWwgY29tcGxldGlvbiB0aW1lb3V0XG4iLAorCQkJX19mdW5jX18pOworCQljbGVhcl9iaXQoSU9BVF9DT01QTEVUSU9OX1BFTkRJTkcsICZjaGFuLT5zdGF0ZSk7CisJCW1vZF90aW1lcigmY2hhbi0+dGltZXIsIGppZmZpZXMgKyBJRExFX1RJTUVPVVQpOworCX0KK30KKworLyoqCisgKiBpb2F0Ml9jbGVhbnVwIC0gY2xlYW4gZmluaXNoZWQgZGVzY3JpcHRvcnMgKGFkdmFuY2UgdGFpbCBwb2ludGVyKQorICogQGNoYW46IGlvYXQgY2hhbm5lbCB0byBiZSBjbGVhbmVkIHVwCisgKi8KK3N0YXRpYyB2b2lkIGlvYXQyX2NsZWFudXAoc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0KQoreworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBwaHlzX2NvbXBsZXRlOworCisJcHJlZmV0Y2goY2hhbi0+Y29tcGxldGlvbik7CisKKwlpZiAoIXNwaW5fdHJ5bG9ja19iaCgmY2hhbi0+Y2xlYW51cF9sb2NrKSkKKwkJcmV0dXJuOworCisJaWYgKCFpb2F0X2NsZWFudXBfcHJlYW1ibGUoY2hhbiwgJnBoeXNfY29tcGxldGUpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZjaGFuLT5jbGVhbnVwX2xvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKCFzcGluX3RyeWxvY2tfYmgoJmlvYXQtPnJpbmdfbG9jaykpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmNoYW4tPmNsZWFudXBfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlfX2NsZWFudXAoaW9hdCwgcGh5c19jb21wbGV0ZSk7CisKKwlzcGluX3VubG9ja19iaCgmaW9hdC0+cmluZ19sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmY2hhbi0+Y2xlYW51cF9sb2NrKTsKK30KKwordm9pZCBpb2F0Ml9jbGVhbnVwX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCA9ICh2b2lkICopIGRhdGE7CisKKwlpb2F0Ml9jbGVhbnVwKGlvYXQpOworCXdyaXRldyhJT0FUX0NIQU5DVFJMX1JVTiwgaW9hdC0+YmFzZS5yZWdfYmFzZSArIElPQVRfQ0hBTkNUUkxfT0ZGU0VUKTsKK30KKwordm9pZCBfX2lvYXQyX3Jlc3RhcnRfY2hhbihzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQpCit7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4gPSAmaW9hdC0+YmFzZTsKKworCS8qIHNldCB0aGUgdGFpbCB0byBiZSByZS1pc3N1ZWQgKi8KKwlpb2F0LT5pc3N1ZWQgPSBpb2F0LT50YWlsOworCWlvYXQtPmRtYWNvdW50ID0gMDsKKwlzZXRfYml0KElPQVRfQ09NUExFVElPTl9QRU5ESU5HLCAmY2hhbi0+c3RhdGUpOworCW1vZF90aW1lcigmY2hhbi0+dGltZXIsIGppZmZpZXMgKyBDT01QTEVUSU9OX1RJTUVPVVQpOworCisJZGV2X2RiZyh0b19kZXYoY2hhbiksCisJCSIlczogaGVhZDogJSN4IHRhaWw6ICUjeCBpc3N1ZWQ6ICUjeCBjb3VudDogJSN4XG4iLAorCQlfX2Z1bmNfXywgaW9hdC0+aGVhZCwgaW9hdC0+dGFpbCwgaW9hdC0+aXNzdWVkLCBpb2F0LT5kbWFjb3VudCk7CisKKwlpZiAoaW9hdDJfcmluZ19wZW5kaW5nKGlvYXQpKSB7CisJCXN0cnVjdCBpb2F0X3JpbmdfZW50ICpkZXNjOworCisJCWRlc2MgPSBpb2F0Ml9nZXRfcmluZ19lbnQoaW9hdCwgaW9hdC0+dGFpbCk7CisJCWlvYXQyX3NldF9jaGFpbmFkZHIoaW9hdCwgZGVzYy0+dHhkLnBoeXMpOworCQlfX2lvYXQyX2lzc3VlX3BlbmRpbmcoaW9hdCk7CisJfSBlbHNlCisJCV9faW9hdDJfc3RhcnRfbnVsbF9kZXNjKGlvYXQpOworfQorCitzdGF0aWMgdm9pZCBpb2F0Ml9yZXN0YXJ0X2NoYW5uZWwoc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0KQoreworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBwaHlzX2NvbXBsZXRlOworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBpb2F0X2NoYW5zdHMoY2hhbik7CisJaWYgKGlzX2lvYXRfYWN0aXZlKHN0YXR1cykgfHwgaXNfaW9hdF9pZGxlKHN0YXR1cykpCisJCWlvYXRfc3VzcGVuZChjaGFuKTsKKwl3aGlsZSAoaXNfaW9hdF9hY3RpdmUoc3RhdHVzKSB8fCBpc19pb2F0X2lkbGUoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBpb2F0X2NoYW5zdHMoY2hhbik7CisJCWNwdV9yZWxheCgpOworCX0KKworCWlmIChpb2F0X2NsZWFudXBfcHJlYW1ibGUoY2hhbiwgJnBoeXNfY29tcGxldGUpKQorCQlfX2NsZWFudXAoaW9hdCwgcGh5c19jb21wbGV0ZSk7CisKKwlfX2lvYXQyX3Jlc3RhcnRfY2hhbihpb2F0KTsKK30KKwordm9pZCBpb2F0Ml90aW1lcl9ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0ID0gKHZvaWQgKikgZGF0YTsKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCisJc3Bpbl9sb2NrX2JoKCZjaGFuLT5jbGVhbnVwX2xvY2spOworCWlmICh0ZXN0X2JpdChJT0FUX0NPTVBMRVRJT05fUEVORElORywgJmNoYW4tPnN0YXRlKSkgeworCQl1bnNpZ25lZCBsb25nIHBoeXNfY29tcGxldGU7CisJCXU2NCBzdGF0dXM7CisKKwkJc3Bpbl9sb2NrX2JoKCZpb2F0LT5yaW5nX2xvY2spOworCQlzdGF0dXMgPSBpb2F0X2NoYW5zdHMoY2hhbik7CisKKwkJLyogd2hlbiBoYWx0ZWQgZHVlIHRvIGVycm9ycyBjaGVjayBmb3IgY2hhbm5lbAorCQkgKiBwcm9ncmFtbWluZyBlcnJvcnMgYmVmb3JlIGFkdmFuY2luZyB0aGUgY29tcGxldGlvbiBzdGF0ZQorCQkgKi8KKwkJaWYgKGlzX2lvYXRfaGFsdGVkKHN0YXR1cykpIHsKKwkJCXUzMiBjaGFuZXJyOworCisJCQljaGFuZXJyID0gcmVhZGwoY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5FUlJfT0ZGU0VUKTsKKwkJCUJVR19PTihpc19pb2F0X2J1ZyhjaGFuZXJyKSk7CisJCX0KKworCQkvKiBpZiB3ZSBoYXZlbid0IG1hZGUgcHJvZ3Jlc3MgYW5kIHdlIGhhdmUgYWxyZWFkeQorCQkgKiBhY2tub3dsZWRnZWQgYSBwZW5kaW5nIGNvbXBsZXRpb24gb25jZSwgdGhlbiBiZSBtb3JlCisJCSAqIGZvcmNlZnVsIHdpdGggYSByZXN0YXJ0CisJCSAqLworCQlpZiAoaW9hdF9jbGVhbnVwX3ByZWFtYmxlKGNoYW4sICZwaHlzX2NvbXBsZXRlKSkKKwkJCV9fY2xlYW51cChpb2F0LCBwaHlzX2NvbXBsZXRlKTsKKwkJZWxzZSBpZiAodGVzdF9iaXQoSU9BVF9DT01QTEVUSU9OX0FDSywgJmNoYW4tPnN0YXRlKSkKKwkJCWlvYXQyX3Jlc3RhcnRfY2hhbm5lbChpb2F0KTsKKwkJZWxzZSB7CisJCQlzZXRfYml0KElPQVRfQ09NUExFVElPTl9BQ0ssICZjaGFuLT5zdGF0ZSk7CisJCQltb2RfdGltZXIoJmNoYW4tPnRpbWVyLCBqaWZmaWVzICsgQ09NUExFVElPTl9USU1FT1VUKTsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmaW9hdC0+cmluZ19sb2NrKTsKKwl9IGVsc2UgeworCQl1MTYgYWN0aXZlOworCisJCS8qIGlmIHRoZSByaW5nIGlzIGlkbGUsIGVtcHR5LCBhbmQgb3ZlcnNpemVkIHRyeSB0byBzdGVwCisJCSAqIGRvd24gdGhlIHNpemUKKwkJICovCisJCXNwaW5fbG9ja19iaCgmaW9hdC0+cmluZ19sb2NrKTsKKwkJYWN0aXZlID0gaW9hdDJfcmluZ19hY3RpdmUoaW9hdCk7CisJCWlmIChhY3RpdmUgPT0gMCAmJiBpb2F0LT5hbGxvY19vcmRlciA+IGlvYXRfZ2V0X2FsbG9jX29yZGVyKCkpCisJCQlyZXNoYXBlX3JpbmcoaW9hdCwgaW9hdC0+YWxsb2Nfb3JkZXItMSk7CisJCXNwaW5fdW5sb2NrX2JoKCZpb2F0LT5yaW5nX2xvY2spOworCisJCS8qIGtlZXAgc2hyaW5raW5nIHVudGlsIHdlIGdldCBiYWNrIHRvIG91ciBtaW5pbXVtCisJCSAqIGRlZmF1bHQgc2l6ZQorCQkgKi8KKwkJaWYgKGlvYXQtPmFsbG9jX29yZGVyID4gaW9hdF9nZXRfYWxsb2Nfb3JkZXIoKSkKKwkJCW1vZF90aW1lcigmY2hhbi0+dGltZXIsIGppZmZpZXMgKyBJRExFX1RJTUVPVVQpOworCX0KKwlzcGluX3VubG9ja19iaCgmY2hhbi0+Y2xlYW51cF9sb2NrKTsKK30KKworLyoqCisgKiBpb2F0Ml9lbnVtZXJhdGVfY2hhbm5lbHMgLSBmaW5kIGFuZCBpbml0aWFsaXplIHRoZSBkZXZpY2UncyBjaGFubmVscworICogQGRldmljZTogdGhlIGRldmljZSB0byBiZSBlbnVtZXJhdGVkCisgKi8KK2ludCBpb2F0Ml9lbnVtZXJhdGVfY2hhbm5lbHMoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPnBkZXYtPmRldjsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hID0gJmRldmljZS0+Y29tbW9uOworCXU4IHhmZXJjYXBfbG9nOworCWludCBpOworCisJSU5JVF9MSVNUX0hFQUQoJmRtYS0+Y2hhbm5lbHMpOworCWRtYS0+Y2hhbmNudCA9IHJlYWRiKGRldmljZS0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5DTlRfT0ZGU0VUKTsKKwlkbWEtPmNoYW5jbnQgJj0gMHgxZjsgLyogYml0cyBbNDowXSB2YWxpZCAqLworCWlmIChkbWEtPmNoYW5jbnQgPiBBUlJBWV9TSVpFKGRldmljZS0+aWR4KSkgeworCQlkZXZfd2FybihkZXYsICIoJWQpIGV4Y2VlZHMgbWF4IHN1cHBvcnRlZCBjaGFubmVscyAoJXp1KVxuIiwKKwkJCSBkbWEtPmNoYW5jbnQsIEFSUkFZX1NJWkUoZGV2aWNlLT5pZHgpKTsKKwkJZG1hLT5jaGFuY250ID0gQVJSQVlfU0laRShkZXZpY2UtPmlkeCk7CisJfQorCXhmZXJjYXBfbG9nID0gcmVhZGIoZGV2aWNlLT5yZWdfYmFzZSArIElPQVRfWEZFUkNBUF9PRkZTRVQpOworCXhmZXJjYXBfbG9nICY9IDB4MWY7IC8qIGJpdHMgWzQ6MF0gdmFsaWQgKi8KKwlpZiAoeGZlcmNhcF9sb2cgPT0gMCkKKwkJcmV0dXJuIDA7CisJZGV2X2RiZyhkZXYsICIlczogeGZlcmNhcCA9ICVkXG4iLCBfX2Z1bmNfXywgMSA8PCB4ZmVyY2FwX2xvZyk7CisKKwkvKiBGSVhNRSB3aGljaCBpL29hdCB2ZXJzaW9uIGlzIGk3MzAwPyAqLworI2lmZGVmIENPTkZJR19JNzMwMF9JRExFX0lPQVRfQ0hBTk5FTAorCWlmIChpNzMwMF9pZGxlX3BsYXRmb3JtX3Byb2JlKE5VTEwsIE5VTEwsIDEpID09IDApCisJCWRtYS0+Y2hhbmNudC0tOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IGRtYS0+Y2hhbmNudDsgaSsrKSB7CisJCWlvYXQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmlvYXQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpb2F0KQorCQkJYnJlYWs7CisKKwkJaW9hdF9pbml0X2NoYW5uZWwoZGV2aWNlLCAmaW9hdC0+YmFzZSwgaSwKKwkJCQkgIGRldmljZS0+dGltZXJfZm4sCisJCQkJICBkZXZpY2UtPmNsZWFudXBfdGFza2xldCwKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBpb2F0KTsKKwkJaW9hdC0+eGZlcmNhcF9sb2cgPSB4ZmVyY2FwX2xvZzsKKwkJc3Bpbl9sb2NrX2luaXQoJmlvYXQtPnJpbmdfbG9jayk7CisJfQorCWRtYS0+Y2hhbmNudCA9IGk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBkbWFfY29va2llX3QgaW9hdDJfdHhfc3VibWl0X3VubG9jayhzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQoreworCXN0cnVjdCBkbWFfY2hhbiAqYyA9IHR4LT5jaGFuOworCXN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXQyX2NoYW4oYyk7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4gPSAmaW9hdC0+YmFzZTsKKwlkbWFfY29va2llX3QgY29va2llID0gYy0+Y29va2llOworCisJY29va2llKys7CisJaWYgKGNvb2tpZSA8IDApCisJCWNvb2tpZSA9IDE7CisJdHgtPmNvb2tpZSA9IGNvb2tpZTsKKwljLT5jb29raWUgPSBjb29raWU7CisJZGV2X2RiZyh0b19kZXYoJmlvYXQtPmJhc2UpLCAiJXM6IGNvb2tpZTogJWRcbiIsIF9fZnVuY19fLCBjb29raWUpOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KElPQVRfQ09NUExFVElPTl9QRU5ESU5HLCAmY2hhbi0+c3RhdGUpKQorCQltb2RfdGltZXIoJmNoYW4tPnRpbWVyLCBqaWZmaWVzICsgQ09NUExFVElPTl9USU1FT1VUKTsKKwlpb2F0Ml91cGRhdGVfcGVuZGluZyhpb2F0KTsKKwlzcGluX3VubG9ja19iaCgmaW9hdC0+cmluZ19sb2NrKTsKKworCXJldHVybiBjb29raWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9hdF9yaW5nX2VudCAqaW9hdDJfYWxsb2NfcmluZ19lbnQoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3QgaW9hdF9kbWFfZGVzY3JpcHRvciAqaHc7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmRlc2M7CisJc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkbWE7CisJZG1hX2FkZHJfdCBwaHlzOworCisJZG1hID0gdG9faW9hdGRtYV9kZXZpY2UoY2hhbi0+ZGV2aWNlKTsKKwlodyA9IHBjaV9wb29sX2FsbG9jKGRtYS0+ZG1hX3Bvb2wsIGZsYWdzLCAmcGh5cyk7CisJaWYgKCFodykKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGh3LCAwLCBzaXplb2YoKmh3KSk7CisKKwlkZXNjID0ga21lbV9jYWNoZV9hbGxvYyhpb2F0Ml9jYWNoZSwgZmxhZ3MpOworCWlmICghZGVzYykgeworCQlwY2lfcG9vbF9mcmVlKGRtYS0+ZG1hX3Bvb2wsIGh3LCBwaHlzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKKworCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmRlc2MtPnR4ZCwgY2hhbik7CisJZGVzYy0+dHhkLnR4X3N1Ym1pdCA9IGlvYXQyX3R4X3N1Ym1pdF91bmxvY2s7CisJZGVzYy0+aHcgPSBodzsKKwlkZXNjLT50eGQucGh5cyA9IHBoeXM7CisJcmV0dXJuIGRlc2M7Cit9CisKK3N0YXRpYyB2b2lkIGlvYXQyX2ZyZWVfcmluZ19lbnQoc3RydWN0IGlvYXRfcmluZ19lbnQgKmRlc2MsIHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRtYTsKKworCWRtYSA9IHRvX2lvYXRkbWFfZGV2aWNlKGNoYW4tPmRldmljZSk7CisJcGNpX3Bvb2xfZnJlZShkbWEtPmRtYV9wb29sLCBkZXNjLT5odywgZGVzYy0+dHhkLnBoeXMpOworCWttZW1fY2FjaGVfZnJlZShpb2F0Ml9jYWNoZSwgZGVzYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9hdF9yaW5nX2VudCAqKmlvYXQyX2FsbG9jX3Jpbmcoc3RydWN0IGRtYV9jaGFuICpjLCBpbnQgb3JkZXIsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBpb2F0X3JpbmdfZW50ICoqcmluZzsKKwlpbnQgZGVzY3MgPSAxIDw8IG9yZGVyOworCWludCBpOworCisJaWYgKG9yZGVyID4gaW9hdF9nZXRfbWF4X2FsbG9jX29yZGVyKCkpCisJCXJldHVybiBOVUxMOworCisJLyogYWxsb2NhdGUgdGhlIGFycmF5IHRvIGhvbGQgdGhlIHNvZnR3YXJlIHJpbmcgKi8KKwlyaW5nID0ga2NhbGxvYyhkZXNjcywgc2l6ZW9mKCpyaW5nKSwgZmxhZ3MpOworCWlmICghcmluZykKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMDsgaSA8IGRlc2NzOyBpKyspIHsKKwkJcmluZ1tpXSA9IGlvYXQyX2FsbG9jX3JpbmdfZW50KGMsIGZsYWdzKTsKKwkJaWYgKCFyaW5nW2ldKSB7CisJCQl3aGlsZSAoaS0tKQorCQkJCWlvYXQyX2ZyZWVfcmluZ19lbnQocmluZ1tpXSwgYyk7CisJCQlrZnJlZShyaW5nKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNldF9kZXNjX2lkKHJpbmdbaV0sIGkpOworCX0KKworCS8qIGxpbmsgZGVzY3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGVzY3MtMTsgaSsrKSB7CisJCXN0cnVjdCBpb2F0X3JpbmdfZW50ICpuZXh0ID0gcmluZ1tpKzFdOworCQlzdHJ1Y3QgaW9hdF9kbWFfZGVzY3JpcHRvciAqaHcgPSByaW5nW2ldLT5odzsKKworCQlody0+bmV4dCA9IG5leHQtPnR4ZC5waHlzOworCX0KKwlyaW5nW2ldLT5ody0+bmV4dCA9IHJpbmdbMF0tPnR4ZC5waHlzOworCisJcmV0dXJuIHJpbmc7Cit9CisKKy8qIGlvYXQyX2FsbG9jX2NoYW5fcmVzb3VyY2VzIC0gYWxsb2NhdGUvaW5pdGlhbGl6ZSBpb2F0MiBkZXNjcmlwdG9yIHJpbmcKKyAqIEBjaGFuOiBjaGFubmVsIHRvIGJlIGluaXRpYWxpemVkCisgKi8KK2ludCBpb2F0Ml9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0ID0gdG9faW9hdDJfY2hhbihjKTsKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCXN0cnVjdCBpb2F0X3JpbmdfZW50ICoqcmluZzsKKwl1MzIgY2hhbmVycjsKKwlpbnQgb3JkZXI7CisKKwkvKiBoYXZlIHdlIGFscmVhZHkgYmVlbiBzZXQgdXA/ICovCisJaWYgKGlvYXQtPnJpbmcpCisJCXJldHVybiAxIDw8IGlvYXQtPmFsbG9jX29yZGVyOworCisJLyogU2V0dXAgcmVnaXN0ZXIgdG8gaW50ZXJydXB0IGFuZCB3cml0ZSBjb21wbGV0aW9uIHN0YXR1cyBvbiBlcnJvciAqLworCXdyaXRldyhJT0FUX0NIQU5DVFJMX1JVTiwgY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5DVFJMX09GRlNFVCk7CisKKwljaGFuZXJyID0gcmVhZGwoY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5FUlJfT0ZGU0VUKTsKKwlpZiAoY2hhbmVycikgeworCQlkZXZfZXJyKHRvX2RldihjaGFuKSwgIkNIQU5FUlIgPSAleCwgY2xlYXJpbmdcbiIsIGNoYW5lcnIpOworCQl3cml0ZWwoY2hhbmVyciwgY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5FUlJfT0ZGU0VUKTsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhIGNvbXBsZXRpb24gd3JpdGViYWNrIGFyZWEgKi8KKwkvKiBkb2luZyAyIDMyYml0IHdyaXRlcyB0byBtbWlvIHNpbmNlIDEgNjRiIHdyaXRlIGRvZXNuJ3Qgd29yayAqLworCWNoYW4tPmNvbXBsZXRpb24gPSBwY2lfcG9vbF9hbGxvYyhjaGFuLT5kZXZpY2UtPmNvbXBsZXRpb25fcG9vbCwKKwkJCQkJICBHRlBfS0VSTkVMLCAmY2hhbi0+Y29tcGxldGlvbl9kbWEpOworCWlmICghY2hhbi0+Y29tcGxldGlvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoY2hhbi0+Y29tcGxldGlvbiwgMCwgc2l6ZW9mKCpjaGFuLT5jb21wbGV0aW9uKSk7CisJd3JpdGVsKCgodTY0KSBjaGFuLT5jb21wbGV0aW9uX2RtYSkgJiAweDAwMDAwMDAwRkZGRkZGRkYsCisJICAgICAgIGNoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOQ01QX09GRlNFVF9MT1cpOworCXdyaXRlbCgoKHU2NCkgY2hhbi0+Y29tcGxldGlvbl9kbWEpID4+IDMyLAorCSAgICAgICBjaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkNNUF9PRkZTRVRfSElHSCk7CisKKwlvcmRlciA9IGlvYXRfZ2V0X2FsbG9jX29yZGVyKCk7CisJcmluZyA9IGlvYXQyX2FsbG9jX3JpbmcoYywgb3JkZXIsIEdGUF9LRVJORUwpOworCWlmICghcmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfYmgoJmlvYXQtPnJpbmdfbG9jayk7CisJaW9hdC0+cmluZyA9IHJpbmc7CisJaW9hdC0+aGVhZCA9IDA7CisJaW9hdC0+aXNzdWVkID0gMDsKKwlpb2F0LT50YWlsID0gMDsKKwlpb2F0LT5wZW5kaW5nID0gMDsKKwlpb2F0LT5hbGxvY19vcmRlciA9IG9yZGVyOworCXNwaW5fdW5sb2NrX2JoKCZpb2F0LT5yaW5nX2xvY2spOworCisJdGFza2xldF9lbmFibGUoJmNoYW4tPmNsZWFudXBfdGFzayk7CisJaW9hdDJfc3RhcnRfbnVsbF9kZXNjKGlvYXQpOworCisJcmV0dXJuIDEgPDwgaW9hdC0+YWxsb2Nfb3JkZXI7Cit9CisKK2Jvb2wgcmVzaGFwZV9yaW5nKHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCwgaW50IG9yZGVyKQoreworCS8qIHJlc2hhcGUgZGlmZmVycyBmcm9tIG5vcm1hbCByaW5nIGFsbG9jYXRpb24gaW4gdGhhdCB3ZSB3YW50CisJICogdG8gYWxsb2NhdGUgYSBuZXcgc29mdHdhcmUgcmluZyB3aGlsZSBvbmx5CisJICogZXh0ZW5kaW5nL3RydW5jYXRpbmcgdGhlIGhhcmR3YXJlIHJpbmcKKwkgKi8KKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCXN0cnVjdCBkbWFfY2hhbiAqYyA9ICZjaGFuLT5jb21tb247CisJY29uc3QgdTE2IGN1cnJfc2l6ZSA9IGlvYXQyX3JpbmdfbWFzayhpb2F0KSArIDE7CisJY29uc3QgdTE2IGFjdGl2ZSA9IGlvYXQyX3JpbmdfYWN0aXZlKGlvYXQpOworCWNvbnN0IHUxNiBuZXdfc2l6ZSA9IDEgPDwgb3JkZXI7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKipyaW5nOworCXUxNiBpOworCisJaWYgKG9yZGVyID4gaW9hdF9nZXRfbWF4X2FsbG9jX29yZGVyKCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIGRvdWJsZSBjaGVjayB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgMSBmcmVlIGRlc2NyaXB0b3IgKi8KKwlpZiAoYWN0aXZlID09IGN1cnJfc2l6ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogd2hlbiBzaHJpbmtpbmcsIHZlcmlmeSB0aGF0IHdlIGNhbiBob2xkIHRoZSBjdXJyZW50IGFjdGl2ZQorCSAqIHNldCBpbiB0aGUgbmV3IHJpbmcKKwkgKi8KKwlpZiAoYWN0aXZlID49IG5ld19zaXplKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBhbGxvY2F0ZSB0aGUgYXJyYXkgdG8gaG9sZCB0aGUgc29mdHdhcmUgcmluZyAqLworCXJpbmcgPSBrY2FsbG9jKG5ld19zaXplLCBzaXplb2YoKnJpbmcpLCBHRlBfTk9XQUlUKTsKKwlpZiAoIXJpbmcpCisJCXJldHVybiBmYWxzZTsKKworCS8qIGFsbG9jYXRlL3RyaW0gZGVzY3JpcHRvcnMgYXMgbmVlZGVkICovCisJaWYgKG5ld19zaXplID4gY3Vycl9zaXplKSB7CisJCS8qIGNvcHkgY3VycmVudCBkZXNjcmlwdG9ycyB0byB0aGUgbmV3IHJpbmcgKi8KKwkJZm9yIChpID0gMDsgaSA8IGN1cnJfc2l6ZTsgaSsrKSB7CisJCQl1MTYgY3Vycl9pZHggPSAoaW9hdC0+dGFpbCtpKSAmIChjdXJyX3NpemUtMSk7CisJCQl1MTYgbmV3X2lkeCA9IChpb2F0LT50YWlsK2kpICYgKG5ld19zaXplLTEpOworCisJCQlyaW5nW25ld19pZHhdID0gaW9hdC0+cmluZ1tjdXJyX2lkeF07CisJCQlzZXRfZGVzY19pZChyaW5nW25ld19pZHhdLCBuZXdfaWR4KTsKKwkJfQorCisJCS8qIGFkZCBuZXcgZGVzY3JpcHRvcnMgdG8gdGhlIHJpbmcgKi8KKwkJZm9yIChpID0gY3Vycl9zaXplOyBpIDwgbmV3X3NpemU7IGkrKykgeworCQkJdTE2IG5ld19pZHggPSAoaW9hdC0+dGFpbCtpKSAmIChuZXdfc2l6ZS0xKTsKKworCQkJcmluZ1tuZXdfaWR4XSA9IGlvYXQyX2FsbG9jX3JpbmdfZW50KGMsIEdGUF9OT1dBSVQpOworCQkJaWYgKCFyaW5nW25ld19pZHhdKSB7CisJCQkJd2hpbGUgKGktLSkgeworCQkJCQl1MTYgbmV3X2lkeCA9IChpb2F0LT50YWlsK2kpICYgKG5ld19zaXplLTEpOworCisJCQkJCWlvYXQyX2ZyZWVfcmluZ19lbnQocmluZ1tuZXdfaWR4XSwgYyk7CisJCQkJfQorCQkJCWtmcmVlKHJpbmcpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXNldF9kZXNjX2lkKHJpbmdbbmV3X2lkeF0sIG5ld19pZHgpOworCQl9CisKKwkJLyogaHcgbGluayBuZXcgZGVzY3JpcHRvcnMgKi8KKwkJZm9yIChpID0gY3Vycl9zaXplLTE7IGkgPCBuZXdfc2l6ZTsgaSsrKSB7CisJCQl1MTYgbmV3X2lkeCA9IChpb2F0LT50YWlsK2kpICYgKG5ld19zaXplLTEpOworCQkJc3RydWN0IGlvYXRfcmluZ19lbnQgKm5leHQgPSByaW5nWyhuZXdfaWR4KzEpICYgKG5ld19zaXplLTEpXTsKKwkJCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodyA9IHJpbmdbbmV3X2lkeF0tPmh3OworCisJCQlody0+bmV4dCA9IG5leHQtPnR4ZC5waHlzOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IGlvYXRfZG1hX2Rlc2NyaXB0b3IgKmh3OworCQlzdHJ1Y3QgaW9hdF9yaW5nX2VudCAqbmV4dDsKKworCQkvKiBjb3B5IGN1cnJlbnQgZGVzY3JpcHRvcnMgdG8gdGhlIG5ldyByaW5nLCBkcm9wcGluZyB0aGUKKwkJICogcmVtb3ZlZCBkZXNjcmlwdG9ycworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG5ld19zaXplOyBpKyspIHsKKwkJCXUxNiBjdXJyX2lkeCA9IChpb2F0LT50YWlsK2kpICYgKGN1cnJfc2l6ZS0xKTsKKwkJCXUxNiBuZXdfaWR4ID0gKGlvYXQtPnRhaWwraSkgJiAobmV3X3NpemUtMSk7CisKKwkJCXJpbmdbbmV3X2lkeF0gPSBpb2F0LT5yaW5nW2N1cnJfaWR4XTsKKwkJCXNldF9kZXNjX2lkKHJpbmdbbmV3X2lkeF0sIG5ld19pZHgpOworCQl9CisKKwkJLyogZnJlZSBkZWxldGVkIGRlc2NyaXB0b3JzICovCisJCWZvciAoaSA9IG5ld19zaXplOyBpIDwgY3Vycl9zaXplOyBpKyspIHsKKwkJCXN0cnVjdCBpb2F0X3JpbmdfZW50ICplbnQ7CisKKwkJCWVudCA9IGlvYXQyX2dldF9yaW5nX2VudChpb2F0LCBpb2F0LT50YWlsK2kpOworCQkJaW9hdDJfZnJlZV9yaW5nX2VudChlbnQsIGMpOworCQl9CisKKwkJLyogZml4IHVwIGhhcmR3YXJlIHJpbmcgKi8KKwkJaHcgPSByaW5nWyhpb2F0LT50YWlsK25ld19zaXplLTEpICYgKG5ld19zaXplLTEpXS0+aHc7CisJCW5leHQgPSByaW5nWyhpb2F0LT50YWlsK25ld19zaXplKSAmIChuZXdfc2l6ZS0xKV07CisJCWh3LT5uZXh0ID0gbmV4dC0+dHhkLnBoeXM7CisJfQorCisJZGV2X2RiZyh0b19kZXYoY2hhbiksICIlczogYWxsb2NhdGVkICVkIGRlc2NyaXB0b3JzXG4iLAorCQlfX2Z1bmNfXywgbmV3X3NpemUpOworCisJa2ZyZWUoaW9hdC0+cmluZyk7CisJaW9hdC0+cmluZyA9IHJpbmc7CisJaW9hdC0+YWxsb2Nfb3JkZXIgPSBvcmRlcjsKKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGlvYXQyX2FsbG9jX2FuZF9sb2NrIC0gY29tbW9uIGRlc2NyaXB0b3IgYWxsb2MgYm9pbGVycGxhdGUgZm9yIGlvYXQyLDMgb3BzCisgKiBAaWR4OiBnZXRzIHN0YXJ0aW5nIGRlc2NyaXB0b3IgaW5kZXggb24gc3VjY2Vzc2Z1bCBhbGxvY2F0aW9uCisgKiBAaW9hdDogaW9hdDIsMyBjaGFubmVsIChyaW5nKSB0byBvcGVyYXRlIG9uCisgKiBAbnVtX2Rlc2NzOiBhbGxvY2F0aW9uIGxlbmd0aAorICovCitpbnQgaW9hdDJfYWxsb2NfYW5kX2xvY2sodTE2ICppZHgsIHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCwgaW50IG51bV9kZXNjcykKK3sKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCisJc3Bpbl9sb2NrX2JoKCZpb2F0LT5yaW5nX2xvY2spOworCS8qIG5ldmVyIGFsbG93IHRoZSBsYXN0IGRlc2NyaXB0b3IgdG8gYmUgY29uc3VtZWQsIHdlIG5lZWQgYXQKKwkgKiBsZWFzdCBvbmUgZnJlZSBhdCBhbGwgdGltZXMgdG8gYWxsb3cgZm9yIG9uLXRoZS1mbHkgcmluZworCSAqIHJlc2l6aW5nLgorCSAqLworCXdoaWxlICh1bmxpa2VseShpb2F0Ml9yaW5nX3NwYWNlKGlvYXQpIDw9IG51bV9kZXNjcykpIHsKKwkJaWYgKHJlc2hhcGVfcmluZyhpb2F0LCBpb2F0LT5hbGxvY19vcmRlciArIDEpICYmCisJCSAgICBpb2F0Ml9yaW5nX3NwYWNlKGlvYXQpID4gbnVtX2Rlc2NzKQorCQkJCWJyZWFrOworCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlkZXZfZGJnKHRvX2RldihjaGFuKSwKKwkJCQkiJXM6IHJpbmcgZnVsbCEgbnVtX2Rlc2NzOiAlZCAoJXg6JXg6JXgpXG4iLAorCQkJCV9fZnVuY19fLCBudW1fZGVzY3MsIGlvYXQtPmhlYWQsIGlvYXQtPnRhaWwsCisJCQkJaW9hdC0+aXNzdWVkKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPnJpbmdfbG9jayk7CisKKwkJLyogcHJvZ3Jlc3MgcmVjbGFpbSBpbiB0aGUgYWxsb2NhdGlvbiBmYWlsdXJlIGNhc2Ugd2UKKwkJICogbWF5IGJlIGNhbGxlZCB1bmRlciBiaF9kaXNhYmxlZCBzbyB3ZSBuZWVkIHRvIHRyaWdnZXIKKwkJICogdGhlIHRpbWVyIGV2ZW50IGRpcmVjdGx5CisJCSAqLworCQlzcGluX2xvY2tfYmgoJmNoYW4tPmNsZWFudXBfbG9jayk7CisJCWlmIChqaWZmaWVzID4gY2hhbi0+dGltZXIuZXhwaXJlcyAmJgorCQkgICAgdGltZXJfcGVuZGluZygmY2hhbi0+dGltZXIpKSB7CisJCQlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSA9IGNoYW4tPmRldmljZTsKKworCQkJbW9kX3RpbWVyKCZjaGFuLT50aW1lciwgamlmZmllcyArIENPTVBMRVRJT05fVElNRU9VVCk7CisJCQlzcGluX3VubG9ja19iaCgmY2hhbi0+Y2xlYW51cF9sb2NrKTsKKwkJCWRldmljZS0+dGltZXJfZm4oKHVuc2lnbmVkIGxvbmcpIGlvYXQpOworCQl9IGVsc2UKKwkJCXNwaW5fdW5sb2NrX2JoKCZjaGFuLT5jbGVhbnVwX2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXZfZGJnKHRvX2RldihjaGFuKSwgIiVzOiBudW1fZGVzY3M6ICVkICgleDoleDoleClcbiIsCisJCV9fZnVuY19fLCBudW1fZGVzY3MsIGlvYXQtPmhlYWQsIGlvYXQtPnRhaWwsIGlvYXQtPmlzc3VlZCk7CisKKwkqaWR4ID0gaW9hdDJfZGVzY19hbGxvYyhpb2F0LCBudW1fZGVzY3MpOworCXJldHVybiAwOyAgLyogd2l0aCBpb2F0LT5yaW5nX2xvY2sgaGVsZCAqLworfQorCitzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgoraW9hdDJfZG1hX3ByZXBfbWVtY3B5X2xvY2soc3RydWN0IGRtYV9jaGFuICpjLCBkbWFfYWRkcl90IGRtYV9kZXN0LAorCQkJICAgZG1hX2FkZHJfdCBkbWFfc3JjLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXQyX2NoYW4oYyk7CisJc3RydWN0IGlvYXRfZG1hX2Rlc2NyaXB0b3IgKmh3OworCXN0cnVjdCBpb2F0X3JpbmdfZW50ICpkZXNjOworCWRtYV9hZGRyX3QgZHN0ID0gZG1hX2Rlc3Q7CisJZG1hX2FkZHJfdCBzcmMgPSBkbWFfc3JjOworCXNpemVfdCB0b3RhbF9sZW4gPSBsZW47CisJaW50IG51bV9kZXNjczsKKwl1MTYgaWR4OworCWludCBpOworCisJbnVtX2Rlc2NzID0gaW9hdDJfeGZlcmxlbl90b19kZXNjcyhpb2F0LCBsZW4pOworCWlmIChsaWtlbHkobnVtX2Rlc2NzKSAmJgorCSAgICBpb2F0Ml9hbGxvY19hbmRfbG9jaygmaWR4LCBpb2F0LCBudW1fZGVzY3MpID09IDApCisJCS8qIHBhc3MgKi87CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKwlpID0gMDsKKwlkbyB7CisJCXNpemVfdCBjb3B5ID0gbWluX3Qoc2l6ZV90LCBsZW4sIDEgPDwgaW9hdC0+eGZlcmNhcF9sb2cpOworCisJCWRlc2MgPSBpb2F0Ml9nZXRfcmluZ19lbnQoaW9hdCwgaWR4ICsgaSk7CisJCWh3ID0gZGVzYy0+aHc7CisKKwkJaHctPnNpemUgPSBjb3B5OworCQlody0+Y3RsID0gMDsKKwkJaHctPnNyY19hZGRyID0gc3JjOworCQlody0+ZHN0X2FkZHIgPSBkc3Q7CisKKwkJbGVuIC09IGNvcHk7CisJCWRzdCArPSBjb3B5OworCQlzcmMgKz0gY29weTsKKwkJZHVtcF9kZXNjX2RiZyhpb2F0LCBkZXNjKTsKKwl9IHdoaWxlICgrK2kgPCBudW1fZGVzY3MpOworCisJZGVzYy0+dHhkLmZsYWdzID0gZmxhZ3M7CisJZGVzYy0+bGVuID0gdG90YWxfbGVuOworCWh3LT5jdGxfZi5pbnRfZW4gPSAhIShmbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVCk7CisJaHctPmN0bF9mLmZlbmNlID0gISEoZmxhZ3MgJiBETUFfUFJFUF9GRU5DRSk7CisJaHctPmN0bF9mLmNvbXBsX3dyaXRlID0gMTsKKwlkdW1wX2Rlc2NfZGJnKGlvYXQsIGRlc2MpOworCS8qIHdlIGxlYXZlIHRoZSBjaGFubmVsIGxvY2tlZCB0byBlbnN1cmUgaW4gb3JkZXIgc3VibWlzc2lvbiAqLworCisJcmV0dXJuICZkZXNjLT50eGQ7Cit9CisKKy8qKgorICogaW9hdDJfZnJlZV9jaGFuX3Jlc291cmNlcyAtIHJlbGVhc2UgYWxsIHRoZSBkZXNjcmlwdG9ycworICogQGNoYW46IHRoZSBjaGFubmVsIHRvIGJlIGNsZWFuZWQKKyAqLwordm9pZCBpb2F0Ml9mcmVlX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqYykKK3sKKwlzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQgPSB0b19pb2F0Ml9jaGFuKGMpOworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisJc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UgPSBjaGFuLT5kZXZpY2U7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmRlc2M7CisJY29uc3QgdTE2IHRvdGFsX2Rlc2NzID0gMSA8PCBpb2F0LT5hbGxvY19vcmRlcjsKKwlpbnQgZGVzY3M7CisJaW50IGk7CisKKwkvKiBCZWZvcmUgZnJlZWluZyBjaGFubmVsIHJlc291cmNlcyBmaXJzdCBjaGVjaworCSAqIGlmIHRoZXkgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYWxsb2NhdGVkIGZvciB0aGlzIGNoYW5uZWwuCisJICovCisJaWYgKCFpb2F0LT5yaW5nKQorCQlyZXR1cm47CisKKwl0YXNrbGV0X2Rpc2FibGUoJmNoYW4tPmNsZWFudXBfdGFzayk7CisJZGVsX3RpbWVyX3N5bmMoJmNoYW4tPnRpbWVyKTsKKwlkZXZpY2UtPmNsZWFudXBfdGFza2xldCgodW5zaWduZWQgbG9uZykgaW9hdCk7CisKKwkvKiBEZWxheSAxMDBtcyBhZnRlciByZXNldCB0byBhbGxvdyBpbnRlcm5hbCBETUEgbG9naWMgdG8gcXVpZXNjZQorCSAqIGJlZm9yZSByZW1vdmluZyBETUEgZGVzY3JpcHRvciByZXNvdXJjZXMuCisJICovCisJd3JpdGViKElPQVRfQ0hBTkNNRF9SRVNFVCwKKwkgICAgICAgY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5DTURfT0ZGU0VUKGNoYW4tPmRldmljZS0+dmVyc2lvbikpOworCW1kZWxheSgxMDApOworCisJc3Bpbl9sb2NrX2JoKCZpb2F0LT5yaW5nX2xvY2spOworCWRlc2NzID0gaW9hdDJfcmluZ19zcGFjZShpb2F0KTsKKwlkZXZfZGJnKHRvX2RldihjaGFuKSwgImZyZWVpbmcgJWQgaWRsZSBkZXNjcmlwdG9yc1xuIiwgZGVzY3MpOworCWZvciAoaSA9IDA7IGkgPCBkZXNjczsgaSsrKSB7CisJCWRlc2MgPSBpb2F0Ml9nZXRfcmluZ19lbnQoaW9hdCwgaW9hdC0+aGVhZCArIGkpOworCQlpb2F0Ml9mcmVlX3JpbmdfZW50KGRlc2MsIGMpOworCX0KKworCWlmIChkZXNjcyA8IHRvdGFsX2Rlc2NzKQorCQlkZXZfZXJyKHRvX2RldihjaGFuKSwgIkZyZWVpbmcgJWQgaW4gdXNlIGRlc2NyaXB0b3JzIVxuIiwKKwkJCXRvdGFsX2Rlc2NzIC0gZGVzY3MpOworCisJZm9yIChpID0gMDsgaSA8IHRvdGFsX2Rlc2NzIC0gZGVzY3M7IGkrKykgeworCQlkZXNjID0gaW9hdDJfZ2V0X3JpbmdfZW50KGlvYXQsIGlvYXQtPnRhaWwgKyBpKTsKKwkJZHVtcF9kZXNjX2RiZyhpb2F0LCBkZXNjKTsKKwkJaW9hdDJfZnJlZV9yaW5nX2VudChkZXNjLCBjKTsKKwl9CisKKwlrZnJlZShpb2F0LT5yaW5nKTsKKwlpb2F0LT5yaW5nID0gTlVMTDsKKwlpb2F0LT5hbGxvY19vcmRlciA9IDA7CisJcGNpX3Bvb2xfZnJlZShkZXZpY2UtPmNvbXBsZXRpb25fcG9vbCwgY2hhbi0+Y29tcGxldGlvbiwKKwkJICAgICAgY2hhbi0+Y29tcGxldGlvbl9kbWEpOworCXNwaW5fdW5sb2NrX2JoKCZpb2F0LT5yaW5nX2xvY2spOworCisJY2hhbi0+bGFzdF9jb21wbGV0aW9uID0gMDsKKwljaGFuLT5jb21wbGV0aW9uX2RtYSA9IDA7CisJaW9hdC0+cGVuZGluZyA9IDA7CisJaW9hdC0+ZG1hY291bnQgPSAwOworfQorCitlbnVtIGRtYV9zdGF0dXMKK2lvYXQyX2lzX2NvbXBsZXRlKHN0cnVjdCBkbWFfY2hhbiAqYywgZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJICAgICBkbWFfY29va2llX3QgKmRvbmUsIGRtYV9jb29raWVfdCAqdXNlZCkKK3sKKwlzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQgPSB0b19pb2F0Ml9jaGFuKGMpOworCXN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlID0gaW9hdC0+YmFzZS5kZXZpY2U7CisKKwlpZiAoaW9hdF9pc19jb21wbGV0ZShjLCBjb29raWUsIGRvbmUsIHVzZWQpID09IERNQV9TVUNDRVNTKQorCQlyZXR1cm4gRE1BX1NVQ0NFU1M7CisKKwlkZXZpY2UtPmNsZWFudXBfdGFza2xldCgodW5zaWduZWQgbG9uZykgaW9hdCk7CisKKwlyZXR1cm4gaW9hdF9pc19jb21wbGV0ZShjLCBjb29raWUsIGRvbmUsIHVzZWQpOworfQorCitzdGF0aWMgc3NpemVfdCByaW5nX3NpemVfc2hvdyhzdHJ1Y3QgZG1hX2NoYW4gKmMsIGNoYXIgKnBhZ2UpCit7CisJc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0ID0gdG9faW9hdDJfY2hhbihjKTsKKworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgKDEgPDwgaW9hdC0+YWxsb2Nfb3JkZXIpICYgfjEpOworfQorc3RhdGljIHN0cnVjdCBpb2F0X3N5c2ZzX2VudHJ5IHJpbmdfc2l6ZV9hdHRyID0gX19BVFRSX1JPKHJpbmdfc2l6ZSk7CisKK3N0YXRpYyBzc2l6ZV90IHJpbmdfYWN0aXZlX3Nob3coc3RydWN0IGRtYV9jaGFuICpjLCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXQyX2NoYW4oYyk7CisKKwkvKiAuLi50YWtlbiBvdXRzaWRlIHRoZSBsb2NrLCBubyBuZWVkIHRvIGJlIHByZWNpc2UgKi8KKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGlvYXQyX3JpbmdfYWN0aXZlKGlvYXQpKTsKK30KK3N0YXRpYyBzdHJ1Y3QgaW9hdF9zeXNmc19lbnRyeSByaW5nX2FjdGl2ZV9hdHRyID0gX19BVFRSX1JPKHJpbmdfYWN0aXZlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlvYXQyX2F0dHJzW10gPSB7CisJJnJpbmdfc2l6ZV9hdHRyLmF0dHIsCisJJnJpbmdfYWN0aXZlX2F0dHIuYXR0ciwKKwkmaW9hdF9jYXBfYXR0ci5hdHRyLAorCSZpb2F0X3ZlcnNpb25fYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdHJ1Y3Qga29ial90eXBlIGlvYXQyX2t0eXBlID0geworCS5zeXNmc19vcHMgPSAmaW9hdF9zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMgPSBpb2F0Ml9hdHRycywKK307CisKK2ludCBfX2RldmluaXQgaW9hdDJfZG1hX3Byb2JlKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlLCBpbnQgZGNhKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2aWNlLT5wZGV2OworCXN0cnVjdCBkbWFfZGV2aWNlICpkbWE7CisJc3RydWN0IGRtYV9jaGFuICpjOworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuOworCWludCBlcnI7CisKKwlkZXZpY2UtPmVudW1lcmF0ZV9jaGFubmVscyA9IGlvYXQyX2VudW1lcmF0ZV9jaGFubmVsczsKKwlkZXZpY2UtPmNsZWFudXBfdGFza2xldCA9IGlvYXQyX2NsZWFudXBfdGFza2xldDsKKwlkZXZpY2UtPnRpbWVyX2ZuID0gaW9hdDJfdGltZXJfZXZlbnQ7CisJZGV2aWNlLT5zZWxmX3Rlc3QgPSBpb2F0X2RtYV9zZWxmX3Rlc3Q7CisJZG1hID0gJmRldmljZS0+Y29tbW9uOworCWRtYS0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGlvYXQyX2RtYV9wcmVwX21lbWNweV9sb2NrOworCWRtYS0+ZGV2aWNlX2lzc3VlX3BlbmRpbmcgPSBpb2F0Ml9pc3N1ZV9wZW5kaW5nOworCWRtYS0+ZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzID0gaW9hdDJfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CisJZG1hLT5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcyA9IGlvYXQyX2ZyZWVfY2hhbl9yZXNvdXJjZXM7CisJZG1hLT5kZXZpY2VfaXNfdHhfY29tcGxldGUgPSBpb2F0Ml9pc19jb21wbGV0ZTsKKworCWVyciA9IGlvYXRfcHJvYmUoZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlvYXRfc2V0X3RjcF9jb3B5X2JyZWFrKDIwNDgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmZG1hLT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKKwkJY2hhbiA9IHRvX2NoYW5fY29tbW9uKGMpOworCQl3cml0ZWwoSU9BVF9EQ0FDVFJMX0NNUExfV1JJVEVfRU5BQkxFIHwgSU9BVF9ETUFfRENBX0FOWV9DUFUsCisJCSAgICAgICBjaGFuLT5yZWdfYmFzZSArIElPQVRfRENBQ1RSTF9PRkZTRVQpOworCX0KKworCWVyciA9IGlvYXRfcmVnaXN0ZXIoZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaW9hdF9rb2JqZWN0X2FkZChkZXZpY2UsICZpb2F0Ml9rdHlwZSk7CisKKwlpZiAoZGNhKQorCQlkZXZpY2UtPmRjYSA9IGlvYXQyX2RjYV9pbml0KHBkZXYsIGRldmljZS0+cmVnX2Jhc2UpOworCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hX3YyLmggYi9kcml2ZXJzL2RtYS9pb2F0L2RtYV92Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODQ5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYV92Mi5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDQgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqLworI2lmbmRlZiBJT0FURE1BX1YyX0gKKyNkZWZpbmUgSU9BVERNQV9WMl9ICisKKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlICJkbWEuaCIKKyNpbmNsdWRlICJody5oIgorCisKK2V4dGVybiBpbnQgaW9hdF9wZW5kaW5nX2xldmVsOworZXh0ZXJuIGludCBpb2F0X3JpbmdfYWxsb2Nfb3JkZXI7CisKKy8qCisgKiB3b3JrYXJvdW5kIGZvciBJT0FUIHZlci4zLjAgbnVsbCBkZXNjcmlwdG9yIGlzc3VlCisgKiAoY2hhbm5lbCByZXR1cm5zIGVycm9yIHdoZW4gc2l6ZSBpcyAwKQorICovCisjZGVmaW5lIE5VTExfREVTQ19CVUZGRVJfU0laRSAxCisKKyNkZWZpbmUgSU9BVF9NQVhfT1JERVIgMTYKKyNkZWZpbmUgaW9hdF9nZXRfYWxsb2Nfb3JkZXIoKSBcCisJKG1pbihpb2F0X3JpbmdfYWxsb2Nfb3JkZXIsIElPQVRfTUFYX09SREVSKSkKKyNkZWZpbmUgaW9hdF9nZXRfbWF4X2FsbG9jX29yZGVyKCkgXAorCShtaW4oaW9hdF9yaW5nX21heF9hbGxvY19vcmRlciwgSU9BVF9NQVhfT1JERVIpKQorCisvKiBzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gLSBpb2F0IHYyIC8gdjMgY2hhbm5lbCBhdHRyaWJ1dGVzCisgKiBAYmFzZTogY29tbW9uIGlvYXQgY2hhbm5lbCBwYXJhbWV0ZXJzCisgKiBAeGZlcmNhcF9sb2c7IGxvZzIgb2YgY2hhbm5lbCBtYXggdHJhbnNmZXIgbGVuZ3RoIChmb3IgZmFzdCBkaXZpc2lvbikKKyAqIEBoZWFkOiBhbGxvY2F0ZWQgaW5kZXgKKyAqIEBpc3N1ZWQ6IGhhcmR3YXJlIG5vdGlmaWNhdGlvbiBwb2ludAorICogQHRhaWw6IGNsZWFudXAgaW5kZXgKKyAqIEBwZW5kaW5nOiBsb2NrIGZyZWUgaW5kaWNhdG9yIGZvciBpc3N1ZWQgIT0gaGVhZAorICogQGRtYWNvdW50OiBpZGVudGljYWwgdG8gJ2hlYWQnIGV4Y2VwdCBmb3Igb2NjYXNpb25hbGx5IHJlc2V0dGluZyB0byB6ZXJvCisgKiBAYWxsb2Nfb3JkZXI6IGxvZzIgb2YgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgZGVzY3JpcHRvcnMKKyAqIEByaW5nOiBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBvZiBoYXJkd2FyZSByaW5nCisgKiBAcmluZ19sb2NrOiBwcm90ZWN0cyByaW5nIGF0dHJpYnV0ZXMKKyAqLworc3RydWN0IGlvYXQyX2RtYV9jaGFuIHsKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiBiYXNlOworCXNpemVfdCB4ZmVyY2FwX2xvZzsKKwl1MTYgaGVhZDsKKwl1MTYgaXNzdWVkOworCXUxNiB0YWlsOworCXUxNiBkbWFjb3VudDsKKwl1MTYgYWxsb2Nfb3JkZXI7CisJaW50IHBlbmRpbmc7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKipyaW5nOworCXNwaW5sb2NrX3QgcmluZ19sb2NrOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKnRvX2lvYXQyX2NoYW4oc3RydWN0IGRtYV9jaGFuICpjKQoreworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gdG9fY2hhbl9jb21tb24oYyk7CisKKwlyZXR1cm4gY29udGFpbmVyX29mKGNoYW4sIHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiwgYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGlvYXQyX3JpbmdfbWFzayhzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQpCit7CisJcmV0dXJuICgxIDw8IGlvYXQtPmFsbG9jX29yZGVyKSAtIDE7Cit9CisKKy8qIGNvdW50IG9mIGRlc2NyaXB0b3JzIGluIGZsaWdodCB3aXRoIHRoZSBlbmdpbmUgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IGlvYXQyX3JpbmdfYWN0aXZlKHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCkKK3sKKwlyZXR1cm4gKGlvYXQtPmhlYWQgLSBpb2F0LT50YWlsKSAmIGlvYXQyX3JpbmdfbWFzayhpb2F0KTsKK30KKworLyogY291bnQgb2YgZGVzY3JpcHRvcnMgcGVuZGluZyBzdWJtaXNzaW9uIHRvIGhhcmR3YXJlICovCitzdGF0aWMgaW5saW5lIHUxNiBpb2F0Ml9yaW5nX3BlbmRpbmcoc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0KQoreworCXJldHVybiAoaW9hdC0+aGVhZCAtIGlvYXQtPmlzc3VlZCkgJiBpb2F0Ml9yaW5nX21hc2soaW9hdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGlvYXQyX3Jpbmdfc3BhY2Uoc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0KQoreworCXUxNiBudW1fZGVzY3MgPSBpb2F0Ml9yaW5nX21hc2soaW9hdCkgKyAxOworCXUxNiBhY3RpdmUgPSBpb2F0Ml9yaW5nX2FjdGl2ZShpb2F0KTsKKworCUJVR19PTihhY3RpdmUgPiBudW1fZGVzY3MpOworCisJcmV0dXJuIG51bV9kZXNjcyAtIGFjdGl2ZTsKK30KKworLyogYXNzdW1lcyBjYWxsZXIgYWxyZWFkeSBjaGVja2VkIHNwYWNlICovCitzdGF0aWMgaW5saW5lIHUxNiBpb2F0Ml9kZXNjX2FsbG9jKHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCwgdTE2IGxlbikKK3sKKwlpb2F0LT5oZWFkICs9IGxlbjsKKwlyZXR1cm4gaW9hdC0+aGVhZCAtIGxlbjsKK30KKworc3RhdGljIGlubGluZSB1MTYgaW9hdDJfeGZlcmxlbl90b19kZXNjcyhzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQsIHNpemVfdCBsZW4pCit7CisJdTE2IG51bV9kZXNjcyA9IGxlbiA+PiBpb2F0LT54ZmVyY2FwX2xvZzsKKworCW51bV9kZXNjcyArPSAhIShsZW4gJiAoKDEgPDwgaW9hdC0+eGZlcmNhcF9sb2cpIC0gMSkpOworCXJldHVybiBudW1fZGVzY3M7Cit9CisKKy8qKgorICogc3RydWN0IGlvYXRfcmluZ19lbnQgLSB3cmFwcGVyIGFyb3VuZCBoYXJkd2FyZSBkZXNjcmlwdG9yCisgKiBAaHc6IGhhcmR3YXJlIERNQSBkZXNjcmlwdG9yIChmb3IgbWVtY3B5KQorICogQGZpbGw6IGhhcmR3YXJlIGZpbGwgZGVzY3JpcHRvcgorICogQHhvcjogaGFyZHdhcmUgeG9yIGRlc2NyaXB0b3IKKyAqIEB4b3JfZXg6IGhhcmR3YXJlIHhvciBleHRlbnNpb24gZGVzY3JpcHRvcgorICogQHBxOiBoYXJkd2FyZSBwcSBkZXNjcmlwdG9yCisgKiBAcHFfZXg6IGhhcmR3YXJlIHBxIGV4dGVuc2lvbiBkZXNjcmlwdG9yCisgKiBAcHF1OiBoYXJkd2FyZSBwcSB1cGRhdGUgZGVzY3JpcHRvcgorICogQHJhdzogaGFyZHdhcmUgcmF3ICh1bi10eXBlZCkgZGVzY3JpcHRvcgorICogQHR4ZDogdGhlIGdlbmVyaWMgc29mdHdhcmUgZGVzY3JpcHRvciBmb3IgYWxsIGVuZ2luZXMKKyAqIEBsZW46IHRvdGFsIHRyYW5zYWN0aW9uIGxlbmd0aCBmb3IgdW5tYXAKKyAqIEByZXN1bHQ6IGFzeW5jaHJvbm91cyByZXN1bHQgb2YgdmFsaWRhdGUgb3BlcmF0aW9ucworICogQGlkOiBpZGVudGlmaWVyIGZvciBkZWJ1ZworICovCisKK3N0cnVjdCBpb2F0X3JpbmdfZW50IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodzsKKwkJc3RydWN0IGlvYXRfZmlsbF9kZXNjcmlwdG9yICpmaWxsOworCQlzdHJ1Y3QgaW9hdF94b3JfZGVzY3JpcHRvciAqeG9yOworCQlzdHJ1Y3QgaW9hdF94b3JfZXh0X2Rlc2NyaXB0b3IgKnhvcl9leDsKKwkJc3RydWN0IGlvYXRfcHFfZGVzY3JpcHRvciAqcHE7CisJCXN0cnVjdCBpb2F0X3BxX2V4dF9kZXNjcmlwdG9yICpwcV9leDsKKwkJc3RydWN0IGlvYXRfcHFfdXBkYXRlX2Rlc2NyaXB0b3IgKnBxdTsKKwkJc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKnJhdzsKKwl9OworCXNpemVfdCBsZW47CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yIHR4ZDsKKwllbnVtIHN1bV9jaGVja19mbGFncyAqcmVzdWx0OworCSNpZmRlZiBERUJVRworCWludCBpZDsKKwkjZW5kaWYKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlvYXRfcmluZ19lbnQgKgoraW9hdDJfZ2V0X3JpbmdfZW50KHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCwgdTE2IGlkeCkKK3sKKwlyZXR1cm4gaW9hdC0+cmluZ1tpZHggJiBpb2F0Ml9yaW5nX21hc2soaW9hdCldOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9hdDJfc2V0X2NoYWluYWRkcihzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQsIHU2NCBhZGRyKQoreworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisKKwl3cml0ZWwoYWRkciAmIDB4MDAwMDAwMDBGRkZGRkZGRiwKKwkgICAgICAgY2hhbi0+cmVnX2Jhc2UgKyBJT0FUMl9DSEFJTkFERFJfT0ZGU0VUX0xPVyk7CisJd3JpdGVsKGFkZHIgPj4gMzIsCisJICAgICAgIGNoYW4tPnJlZ19iYXNlICsgSU9BVDJfQ0hBSU5BRERSX09GRlNFVF9ISUdIKTsKK30KKworaW50IF9fZGV2aW5pdCBpb2F0Ml9kbWFfcHJvYmUoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXYsIGludCBkY2EpOworaW50IF9fZGV2aW5pdCBpb2F0M19kbWFfcHJvYmUoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXYsIGludCBkY2EpOworc3RydWN0IGRjYV9wcm92aWRlciAqIF9fZGV2aW5pdCBpb2F0Ml9kY2FfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICppb2Jhc2UpOworc3RydWN0IGRjYV9wcm92aWRlciAqIF9fZGV2aW5pdCBpb2F0M19kY2FfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICppb2Jhc2UpOworaW50IGlvYXQyX2FsbG9jX2FuZF9sb2NrKHUxNiAqaWR4LCBzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQsIGludCBudW1fZGVzY3MpOworaW50IGlvYXQyX2VudW1lcmF0ZV9jaGFubmVscyhzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSk7CitzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgoraW9hdDJfZG1hX3ByZXBfbWVtY3B5X2xvY2soc3RydWN0IGRtYV9jaGFuICpjLCBkbWFfYWRkcl90IGRtYV9kZXN0LAorCQkJICAgZG1hX2FkZHJfdCBkbWFfc3JjLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3ZvaWQgaW9hdDJfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pOworaW50IGlvYXQyX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqYyk7Cit2b2lkIGlvYXQyX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjKTsKK2VudW0gZG1hX3N0YXR1cyBpb2F0Ml9pc19jb21wbGV0ZShzdHJ1Y3QgZG1hX2NoYW4gKmMsIGRtYV9jb29raWVfdCBjb29raWUsCisJCQkJICBkbWFfY29va2llX3QgKmRvbmUsIGRtYV9jb29raWVfdCAqdXNlZCk7Cit2b2lkIF9faW9hdDJfcmVzdGFydF9jaGFuKHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCk7Citib29sIHJlc2hhcGVfcmluZyhzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQsIGludCBvcmRlcik7Cit2b2lkIF9faW9hdDJfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQpOwordm9pZCBpb2F0Ml9jbGVhbnVwX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgaW9hdDJfdGltZXJfZXZlbnQodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiBzdHJ1Y3Qga29ial90eXBlIGlvYXQyX2t0eXBlOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICppb2F0Ml9jYWNoZTsKKyNlbmRpZiAvKiBJT0FURE1BX1YyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hX3YzLmMgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYV92My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDFlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYV92My5jCkBAIC0wLDAgKzEsMTIyMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA0IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNC0yMDA5IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFN1cHBvcnQgcm91dGluZXMgZm9yIHYzKyBoYXJkd2FyZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgorI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSAiZG1hLmgiCisjaW5jbHVkZSAiZG1hX3YyLmgiCisKKy8qIGlvYXQgaGFyZHdhcmUgYXNzdW1lcyBhdCBsZWFzdCB0d28gc291cmNlcyBmb3IgcmFpZCBvcGVyYXRpb25zICovCisjZGVmaW5lIHNyY19jbnRfdG9fc3coeCkgKCh4KSArIDIpCisjZGVmaW5lIHNyY19jbnRfdG9faHcoeCkgKCh4KSAtIDIpCisKKy8qIHByb3ZpZGUgYSBsb29rdXAgdGFibGUgZm9yIHNldHRpbmcgdGhlIHNvdXJjZSBhZGRyZXNzIGluIHRoZSBiYXNlIG9yCisgKiBleHRlbmRlZCBkZXNjcmlwdG9yIG9mIGFuIHhvciBvciBwcSBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyBjb25zdCB1OCB4b3JfaWR4X3RvX2Rlc2MgX19yZWFkX21vc3RseSA9IDB4ZDA7CitzdGF0aWMgY29uc3QgdTggeG9yX2lkeF90b19maWVsZFtdIF9fcmVhZF9tb3N0bHkgPSB7IDEsIDQsIDUsIDYsIDcsIDAsIDEsIDIgfTsKK3N0YXRpYyBjb25zdCB1OCBwcV9pZHhfdG9fZGVzYyBfX3JlYWRfbW9zdGx5ID0gMHhmODsKK3N0YXRpYyBjb25zdCB1OCBwcV9pZHhfdG9fZmllbGRbXSBfX3JlYWRfbW9zdGx5ID0geyAxLCA0LCA1LCAwLCAxLCAyLCA0LCA1IH07CisKK3N0YXRpYyBkbWFfYWRkcl90IHhvcl9nZXRfc3JjKHN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICpkZXNjc1syXSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgaW9hdF9yYXdfZGVzY3JpcHRvciAqcmF3ID0gZGVzY3NbeG9yX2lkeF90b19kZXNjID4+IGlkeCAmIDFdOworCisJcmV0dXJuIHJhdy0+ZmllbGRbeG9yX2lkeF90b19maWVsZFtpZHhdXTsKK30KKworc3RhdGljIHZvaWQgeG9yX3NldF9zcmMoc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKmRlc2NzWzJdLAorCQkJZG1hX2FkZHJfdCBhZGRyLCB1MzIgb2Zmc2V0LCBpbnQgaWR4KQoreworCXN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICpyYXcgPSBkZXNjc1t4b3JfaWR4X3RvX2Rlc2MgPj4gaWR4ICYgMV07CisKKwlyYXctPmZpZWxkW3hvcl9pZHhfdG9fZmllbGRbaWR4XV0gPSBhZGRyICsgb2Zmc2V0OworfQorCitzdGF0aWMgZG1hX2FkZHJfdCBwcV9nZXRfc3JjKHN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICpkZXNjc1syXSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgaW9hdF9yYXdfZGVzY3JpcHRvciAqcmF3ID0gZGVzY3NbcHFfaWR4X3RvX2Rlc2MgPj4gaWR4ICYgMV07CisKKwlyZXR1cm4gcmF3LT5maWVsZFtwcV9pZHhfdG9fZmllbGRbaWR4XV07Cit9CisKK3N0YXRpYyB2b2lkIHBxX3NldF9zcmMoc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKmRlc2NzWzJdLAorCQkgICAgICAgZG1hX2FkZHJfdCBhZGRyLCB1MzIgb2Zmc2V0LCB1OCBjb2VmLCBpbnQgaWR4KQoreworCXN0cnVjdCBpb2F0X3BxX2Rlc2NyaXB0b3IgKnBxID0gKHN0cnVjdCBpb2F0X3BxX2Rlc2NyaXB0b3IgKikgZGVzY3NbMF07CisJc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKnJhdyA9IGRlc2NzW3BxX2lkeF90b19kZXNjID4+IGlkeCAmIDFdOworCisJcmF3LT5maWVsZFtwcV9pZHhfdG9fZmllbGRbaWR4XV0gPSBhZGRyICsgb2Zmc2V0OworCXBxLT5jb2VmW2lkeF0gPSBjb2VmOworfQorCitzdGF0aWMgdm9pZCBpb2F0M19kbWFfdW5tYXAoc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0LAorCQkJICAgIHN0cnVjdCBpb2F0X3JpbmdfZW50ICpkZXNjLCBpbnQgaWR4KQoreworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjaGFuLT5kZXZpY2UtPnBkZXY7CisJc2l6ZV90IGxlbiA9IGRlc2MtPmxlbjsKKwlzaXplX3Qgb2Zmc2V0ID0gbGVuIC0gZGVzYy0+aHctPnNpemU7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9ICZkZXNjLT50eGQ7CisJZW51bSBkbWFfY3RybF9mbGFncyBmbGFncyA9IHR4LT5mbGFnczsKKworCXN3aXRjaCAoZGVzYy0+aHctPmN0bF9mLm9wKSB7CisJY2FzZSBJT0FUX09QX0NPUFk6CisJCWlmICghZGVzYy0+aHctPmN0bF9mLm51bGwpIC8qIHNraXAgJ2ludGVycnVwdCcgb3BzICovCisJCQlpb2F0X2RtYV91bm1hcChjaGFuLCBmbGFncywgbGVuLCBkZXNjLT5odyk7CisJCWJyZWFrOworCWNhc2UgSU9BVF9PUF9GSUxMOiB7CisJCXN0cnVjdCBpb2F0X2ZpbGxfZGVzY3JpcHRvciAqaHcgPSBkZXNjLT5maWxsOworCisJCWlmICghKGZsYWdzICYgRE1BX0NPTVBMX1NLSVBfREVTVF9VTk1BUCkpCisJCQlpb2F0X3VubWFwKHBkZXYsIGh3LT5kc3RfYWRkciAtIG9mZnNldCwgbGVuLAorCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSwgZmxhZ3MsIDEpOworCQlicmVhazsKKwl9CisJY2FzZSBJT0FUX09QX1hPUl9WQUw6CisJY2FzZSBJT0FUX09QX1hPUjogeworCQlzdHJ1Y3QgaW9hdF94b3JfZGVzY3JpcHRvciAqeG9yID0gZGVzYy0+eG9yOworCQlzdHJ1Y3QgaW9hdF9yaW5nX2VudCAqZXh0OworCQlzdHJ1Y3QgaW9hdF94b3JfZXh0X2Rlc2NyaXB0b3IgKnhvcl9leCA9IE5VTEw7CisJCWludCBzcmNfY250ID0gc3JjX2NudF90b19zdyh4b3ItPmN0bF9mLnNyY19jbnQpOworCQlzdHJ1Y3QgaW9hdF9yYXdfZGVzY3JpcHRvciAqZGVzY3NbMl07CisJCWludCBpOworCisJCWlmIChzcmNfY250ID4gNSkgeworCQkJZXh0ID0gaW9hdDJfZ2V0X3JpbmdfZW50KGlvYXQsIGlkeCArIDEpOworCQkJeG9yX2V4ID0gZXh0LT54b3JfZXg7CisJCX0KKworCQlpZiAoIShmbGFncyAmIERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCkpIHsKKwkJCWRlc2NzWzBdID0gKHN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICopIHhvcjsKKwkJCWRlc2NzWzFdID0gKHN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICopIHhvcl9leDsKKwkJCWZvciAoaSA9IDA7IGkgPCBzcmNfY250OyBpKyspIHsKKwkJCQlkbWFfYWRkcl90IHNyYyA9IHhvcl9nZXRfc3JjKGRlc2NzLCBpKTsKKworCQkJCWlvYXRfdW5tYXAocGRldiwgc3JjIC0gb2Zmc2V0LCBsZW4sCisJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UsIGZsYWdzLCAwKTsKKwkJCX0KKworCQkJLyogZGVzdCBpcyBhIHNvdXJjZSBpbiB4b3IgdmFsaWRhdGUgb3BlcmF0aW9ucyAqLworCQkJaWYgKHhvci0+Y3RsX2Yub3AgPT0gSU9BVF9PUF9YT1JfVkFMKSB7CisJCQkJaW9hdF91bm1hcChwZGV2LCB4b3ItPmRzdF9hZGRyIC0gb2Zmc2V0LCBsZW4sCisJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UsIGZsYWdzLCAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghKGZsYWdzICYgRE1BX0NPTVBMX1NLSVBfREVTVF9VTk1BUCkpCisJCQlpb2F0X3VubWFwKHBkZXYsIHhvci0+ZHN0X2FkZHIgLSBvZmZzZXQsIGxlbiwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UsIGZsYWdzLCAxKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSU9BVF9PUF9QUV9WQUw6CisJY2FzZSBJT0FUX09QX1BROiB7CisJCXN0cnVjdCBpb2F0X3BxX2Rlc2NyaXB0b3IgKnBxID0gZGVzYy0+cHE7CisJCXN0cnVjdCBpb2F0X3JpbmdfZW50ICpleHQ7CisJCXN0cnVjdCBpb2F0X3BxX2V4dF9kZXNjcmlwdG9yICpwcV9leCA9IE5VTEw7CisJCWludCBzcmNfY250ID0gc3JjX2NudF90b19zdyhwcS0+Y3RsX2Yuc3JjX2NudCk7CisJCXN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICpkZXNjc1syXTsKKwkJaW50IGk7CisKKwkJaWYgKHNyY19jbnQgPiAzKSB7CisJCQlleHQgPSBpb2F0Ml9nZXRfcmluZ19lbnQoaW9hdCwgaWR4ICsgMSk7CisJCQlwcV9leCA9IGV4dC0+cHFfZXg7CisJCX0KKworCQkvKiBpbiB0aGUgJ2NvbnRpbnVlJyBjYXNlIGRvbid0IHVubWFwIHRoZSBkZXN0cyBhcyBzb3VyY2VzICovCisJCWlmIChkbWFmX3BfZGlzYWJsZWRfY29udGludWUoZmxhZ3MpKQorCQkJc3JjX2NudC0tOworCQllbHNlIGlmIChkbWFmX2NvbnRpbnVlKGZsYWdzKSkKKwkJCXNyY19jbnQgLT0gMzsKKworCQlpZiAoIShmbGFncyAmIERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCkpIHsKKwkJCWRlc2NzWzBdID0gKHN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICopIHBxOworCQkJZGVzY3NbMV0gPSAoc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKikgcHFfZXg7CisJCQlmb3IgKGkgPSAwOyBpIDwgc3JjX2NudDsgaSsrKSB7CisJCQkJZG1hX2FkZHJfdCBzcmMgPSBwcV9nZXRfc3JjKGRlc2NzLCBpKTsKKworCQkJCWlvYXRfdW5tYXAocGRldiwgc3JjIC0gb2Zmc2V0LCBsZW4sCisJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UsIGZsYWdzLCAwKTsKKwkJCX0KKworCQkJLyogdGhlIGRlc3RzIGFyZSBzb3VyY2VzIGluIHBxIHZhbGlkYXRlIG9wZXJhdGlvbnMgKi8KKwkJCWlmIChwcS0+Y3RsX2Yub3AgPT0gSU9BVF9PUF9YT1JfVkFMKSB7CisJCQkJaWYgKCEoZmxhZ3MgJiBETUFfUFJFUF9QUV9ESVNBQkxFX1ApKQorCQkJCQlpb2F0X3VubWFwKHBkZXYsIHBxLT5wX2FkZHIgLSBvZmZzZXQsCisJCQkJCQkgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UsIGZsYWdzLCAwKTsKKwkJCQlpZiAoIShmbGFncyAmIERNQV9QUkVQX1BRX0RJU0FCTEVfUSkpCisJCQkJCWlvYXRfdW5tYXAocGRldiwgcHEtPnFfYWRkciAtIG9mZnNldCwKKwkJCQkJCSAgIGxlbiwgUENJX0RNQV9UT0RFVklDRSwgZmxhZ3MsIDApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCEoZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKSkgeworCQkJaWYgKCEoZmxhZ3MgJiBETUFfUFJFUF9QUV9ESVNBQkxFX1ApKQorCQkJCWlvYXRfdW5tYXAocGRldiwgcHEtPnBfYWRkciAtIG9mZnNldCwgbGVuLAorCQkJCQkgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwsIGZsYWdzLCAxKTsKKwkJCWlmICghKGZsYWdzICYgRE1BX1BSRVBfUFFfRElTQUJMRV9RKSkKKwkJCQlpb2F0X3VubWFwKHBkZXYsIHBxLT5xX2FkZHIgLSBvZmZzZXQsIGxlbiwKKwkJCQkJICAgUENJX0RNQV9CSURJUkVDVElPTkFMLCBmbGFncywgMSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB1bmtub3duIG9wIHR5cGU6ICUjeFxuIiwKKwkJCV9fZnVuY19fLCBkZXNjLT5ody0+Y3RsX2Yub3ApOworCX0KK30KKworc3RhdGljIGJvb2wgZGVzY19oYXNfZXh0KHN0cnVjdCBpb2F0X3JpbmdfZW50ICpkZXNjKQoreworCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodyA9IGRlc2MtPmh3OworCisJaWYgKGh3LT5jdGxfZi5vcCA9PSBJT0FUX09QX1hPUiB8fAorCSAgICBody0+Y3RsX2Yub3AgPT0gSU9BVF9PUF9YT1JfVkFMKSB7CisJCXN0cnVjdCBpb2F0X3hvcl9kZXNjcmlwdG9yICp4b3IgPSBkZXNjLT54b3I7CisKKwkJaWYgKHNyY19jbnRfdG9fc3coeG9yLT5jdGxfZi5zcmNfY250KSA+IDUpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKGh3LT5jdGxfZi5vcCA9PSBJT0FUX09QX1BRIHx8CisJCSAgIGh3LT5jdGxfZi5vcCA9PSBJT0FUX09QX1BRX1ZBTCkgeworCQlzdHJ1Y3QgaW9hdF9wcV9kZXNjcmlwdG9yICpwcSA9IGRlc2MtPnBxOworCisJCWlmIChzcmNfY250X3RvX3N3KHBxLT5jdGxfZi5zcmNfY250KSA+IDMpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogX19jbGVhbnVwIC0gcmVjbGFpbSB1c2VkIGRlc2NyaXB0b3JzCisgKiBAaW9hdDogY2hhbm5lbCAocmluZykgdG8gY2xlYW4KKyAqCisgKiBUaGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBkbWFfdjIuYyBfX2NsZWFudXAoKSBpcyB0aGF0IHRoaXMgcm91dGluZQorICogaGFuZGxlcyBleHRlbmRlZCBkZXNjcmlwdG9ycyBhbmQgZG1hLXVubWFwcGluZyByYWlkIG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkIF9fY2xlYW51cChzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQsIHVuc2lnbmVkIGxvbmcgcGh5c19jb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCXN0cnVjdCBpb2F0X3JpbmdfZW50ICpkZXNjOworCWJvb2wgc2Vlbl9jdXJyZW50ID0gZmFsc2U7CisJdTE2IGFjdGl2ZTsKKwlpbnQgaTsKKworCWRldl9kYmcodG9fZGV2KGNoYW4pLCAiJXM6IGhlYWQ6ICUjeCB0YWlsOiAlI3ggaXNzdWVkOiAlI3hcbiIsCisJCV9fZnVuY19fLCBpb2F0LT5oZWFkLCBpb2F0LT50YWlsLCBpb2F0LT5pc3N1ZWQpOworCisJYWN0aXZlID0gaW9hdDJfcmluZ19hY3RpdmUoaW9hdCk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZSAmJiAhc2Vlbl9jdXJyZW50OyBpKyspIHsKKwkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKworCQlwcmVmZXRjaChpb2F0Ml9nZXRfcmluZ19lbnQoaW9hdCwgaW9hdC0+dGFpbCArIGkgKyAxKSk7CisJCWRlc2MgPSBpb2F0Ml9nZXRfcmluZ19lbnQoaW9hdCwgaW9hdC0+dGFpbCArIGkpOworCQlkdW1wX2Rlc2NfZGJnKGlvYXQsIGRlc2MpOworCQl0eCA9ICZkZXNjLT50eGQ7CisJCWlmICh0eC0+Y29va2llKSB7CisJCQljaGFuLT5jb21wbGV0ZWRfY29va2llID0gdHgtPmNvb2tpZTsKKwkJCWlvYXQzX2RtYV91bm1hcChpb2F0LCBkZXNjLCBpb2F0LT50YWlsICsgaSk7CisJCQl0eC0+Y29va2llID0gMDsKKwkJCWlmICh0eC0+Y2FsbGJhY2spIHsKKwkJCQl0eC0+Y2FsbGJhY2sodHgtPmNhbGxiYWNrX3BhcmFtKTsKKwkJCQl0eC0+Y2FsbGJhY2sgPSBOVUxMOworCQkJfQorCQl9CisKKwkJaWYgKHR4LT5waHlzID09IHBoeXNfY29tcGxldGUpCisJCQlzZWVuX2N1cnJlbnQgPSB0cnVlOworCisJCS8qIHNraXAgZXh0ZW5kZWQgZGVzY3JpcHRvcnMgKi8KKwkJaWYgKGRlc2NfaGFzX2V4dChkZXNjKSkgeworCQkJQlVHX09OKGkgKyAxID49IGFjdGl2ZSk7CisJCQlpKys7CisJCX0KKwl9CisJaW9hdC0+dGFpbCArPSBpOworCUJVR19PTighc2Vlbl9jdXJyZW50KTsgLyogbm8gYWN0aXZlIGRlc2NzIGhhdmUgd3JpdHRlbiBhIGNvbXBsZXRpb24/ICovCisJY2hhbi0+bGFzdF9jb21wbGV0aW9uID0gcGh5c19jb21wbGV0ZTsKKwlpZiAoaW9hdC0+aGVhZCA9PSBpb2F0LT50YWlsKSB7CisJCWRldl9kYmcodG9fZGV2KGNoYW4pLCAiJXM6IGNhbmNlbCBjb21wbGV0aW9uIHRpbWVvdXRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWNsZWFyX2JpdChJT0FUX0NPTVBMRVRJT05fUEVORElORywgJmNoYW4tPnN0YXRlKTsKKwkJbW9kX3RpbWVyKCZjaGFuLT50aW1lciwgamlmZmllcyArIElETEVfVElNRU9VVCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpb2F0M19jbGVhbnVwKHN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCkKK3sKKwlzdHJ1Y3QgaW9hdF9jaGFuX2NvbW1vbiAqY2hhbiA9ICZpb2F0LT5iYXNlOworCXVuc2lnbmVkIGxvbmcgcGh5c19jb21wbGV0ZTsKKworCXByZWZldGNoKGNoYW4tPmNvbXBsZXRpb24pOworCisJaWYgKCFzcGluX3RyeWxvY2tfYmgoJmNoYW4tPmNsZWFudXBfbG9jaykpCisJCXJldHVybjsKKworCWlmICghaW9hdF9jbGVhbnVwX3ByZWFtYmxlKGNoYW4sICZwaHlzX2NvbXBsZXRlKSkgeworCQlzcGluX3VubG9ja19iaCgmY2hhbi0+Y2xlYW51cF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghc3Bpbl90cnlsb2NrX2JoKCZpb2F0LT5yaW5nX2xvY2spKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZjaGFuLT5jbGVhbnVwX2xvY2spOworCQlyZXR1cm47CisJfQorCisJX19jbGVhbnVwKGlvYXQsIHBoeXNfY29tcGxldGUpOworCisJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPnJpbmdfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmNoYW4tPmNsZWFudXBfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGlvYXQzX2NsZWFudXBfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0ID0gKHZvaWQgKikgZGF0YTsKKworCWlvYXQzX2NsZWFudXAoaW9hdCk7CisJd3JpdGV3KElPQVRfQ0hBTkNUUkxfUlVOIHwgSU9BVDNfQ0hBTkNUUkxfQ09NUExfRENBX0VOLAorCSAgICAgICBpb2F0LT5iYXNlLnJlZ19iYXNlICsgSU9BVF9DSEFOQ1RSTF9PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBpb2F0M19yZXN0YXJ0X2NoYW5uZWwoc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0KQoreworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBwaHlzX2NvbXBsZXRlOworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBpb2F0X2NoYW5zdHMoY2hhbik7CisJaWYgKGlzX2lvYXRfYWN0aXZlKHN0YXR1cykgfHwgaXNfaW9hdF9pZGxlKHN0YXR1cykpCisJCWlvYXRfc3VzcGVuZChjaGFuKTsKKwl3aGlsZSAoaXNfaW9hdF9hY3RpdmUoc3RhdHVzKSB8fCBpc19pb2F0X2lkbGUoc3RhdHVzKSkgeworCQlzdGF0dXMgPSBpb2F0X2NoYW5zdHMoY2hhbik7CisJCWNwdV9yZWxheCgpOworCX0KKworCWlmIChpb2F0X2NsZWFudXBfcHJlYW1ibGUoY2hhbiwgJnBoeXNfY29tcGxldGUpKQorCQlfX2NsZWFudXAoaW9hdCwgcGh5c19jb21wbGV0ZSk7CisKKwlfX2lvYXQyX3Jlc3RhcnRfY2hhbihpb2F0KTsKK30KKworc3RhdGljIHZvaWQgaW9hdDNfdGltZXJfZXZlbnQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCA9ICh2b2lkICopIGRhdGE7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW4gPSAmaW9hdC0+YmFzZTsKKworCXNwaW5fbG9ja19iaCgmY2hhbi0+Y2xlYW51cF9sb2NrKTsKKwlpZiAodGVzdF9iaXQoSU9BVF9DT01QTEVUSU9OX1BFTkRJTkcsICZjaGFuLT5zdGF0ZSkpIHsKKwkJdW5zaWduZWQgbG9uZyBwaHlzX2NvbXBsZXRlOworCQl1NjQgc3RhdHVzOworCisJCXNwaW5fbG9ja19iaCgmaW9hdC0+cmluZ19sb2NrKTsKKwkJc3RhdHVzID0gaW9hdF9jaGFuc3RzKGNoYW4pOworCisJCS8qIHdoZW4gaGFsdGVkIGR1ZSB0byBlcnJvcnMgY2hlY2sgZm9yIGNoYW5uZWwKKwkJICogcHJvZ3JhbW1pbmcgZXJyb3JzIGJlZm9yZSBhZHZhbmNpbmcgdGhlIGNvbXBsZXRpb24gc3RhdGUKKwkJICovCisJCWlmIChpc19pb2F0X2hhbHRlZChzdGF0dXMpKSB7CisJCQl1MzIgY2hhbmVycjsKKworCQkJY2hhbmVyciA9IHJlYWRsKGNoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFORVJSX09GRlNFVCk7CisJCQlCVUdfT04oaXNfaW9hdF9idWcoY2hhbmVycikpOworCQl9CisKKwkJLyogaWYgd2UgaGF2ZW4ndCBtYWRlIHByb2dyZXNzIGFuZCB3ZSBoYXZlIGFscmVhZHkKKwkJICogYWNrbm93bGVkZ2VkIGEgcGVuZGluZyBjb21wbGV0aW9uIG9uY2UsIHRoZW4gYmUgbW9yZQorCQkgKiBmb3JjZWZ1bCB3aXRoIGEgcmVzdGFydAorCQkgKi8KKwkJaWYgKGlvYXRfY2xlYW51cF9wcmVhbWJsZShjaGFuLCAmcGh5c19jb21wbGV0ZSkpCisJCQlfX2NsZWFudXAoaW9hdCwgcGh5c19jb21wbGV0ZSk7CisJCWVsc2UgaWYgKHRlc3RfYml0KElPQVRfQ09NUExFVElPTl9BQ0ssICZjaGFuLT5zdGF0ZSkpCisJCQlpb2F0M19yZXN0YXJ0X2NoYW5uZWwoaW9hdCk7CisJCWVsc2UgeworCQkJc2V0X2JpdChJT0FUX0NPTVBMRVRJT05fQUNLLCAmY2hhbi0+c3RhdGUpOworCQkJbW9kX3RpbWVyKCZjaGFuLT50aW1lciwgamlmZmllcyArIENPTVBMRVRJT05fVElNRU9VVCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmlvYXQtPnJpbmdfbG9jayk7CisJfSBlbHNlIHsKKwkJdTE2IGFjdGl2ZTsKKworCQkvKiBpZiB0aGUgcmluZyBpcyBpZGxlLCBlbXB0eSwgYW5kIG92ZXJzaXplZCB0cnkgdG8gc3RlcAorCQkgKiBkb3duIHRoZSBzaXplCisJCSAqLworCQlzcGluX2xvY2tfYmgoJmlvYXQtPnJpbmdfbG9jayk7CisJCWFjdGl2ZSA9IGlvYXQyX3JpbmdfYWN0aXZlKGlvYXQpOworCQlpZiAoYWN0aXZlID09IDAgJiYgaW9hdC0+YWxsb2Nfb3JkZXIgPiBpb2F0X2dldF9hbGxvY19vcmRlcigpKQorCQkJcmVzaGFwZV9yaW5nKGlvYXQsIGlvYXQtPmFsbG9jX29yZGVyLTEpOworCQlzcGluX3VubG9ja19iaCgmaW9hdC0+cmluZ19sb2NrKTsKKworCQkvKiBrZWVwIHNocmlua2luZyB1bnRpbCB3ZSBnZXQgYmFjayB0byBvdXIgbWluaW11bQorCQkgKiBkZWZhdWx0IHNpemUKKwkJICovCisJCWlmIChpb2F0LT5hbGxvY19vcmRlciA+IGlvYXRfZ2V0X2FsbG9jX29yZGVyKCkpCisJCQltb2RfdGltZXIoJmNoYW4tPnRpbWVyLCBqaWZmaWVzICsgSURMRV9USU1FT1VUKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmNoYW4tPmNsZWFudXBfbG9jayk7Cit9CisKK3N0YXRpYyBlbnVtIGRtYV9zdGF0dXMKK2lvYXQzX2lzX2NvbXBsZXRlKHN0cnVjdCBkbWFfY2hhbiAqYywgZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJICBkbWFfY29va2llX3QgKmRvbmUsIGRtYV9jb29raWVfdCAqdXNlZCkKK3sKKwlzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQgPSB0b19pb2F0Ml9jaGFuKGMpOworCisJaWYgKGlvYXRfaXNfY29tcGxldGUoYywgY29va2llLCBkb25lLCB1c2VkKSA9PSBETUFfU1VDQ0VTUykKKwkJcmV0dXJuIERNQV9TVUNDRVNTOworCisJaW9hdDNfY2xlYW51cChpb2F0KTsKKworCXJldHVybiBpb2F0X2lzX2NvbXBsZXRlKGMsIGNvb2tpZSwgZG9uZSwgdXNlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgoraW9hdDNfcHJlcF9tZW1zZXRfbG9jayhzdHJ1Y3QgZG1hX2NoYW4gKmMsIGRtYV9hZGRyX3QgZGVzdCwgaW50IHZhbHVlLAorCQkgICAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQgPSB0b19pb2F0Ml9jaGFuKGMpOworCXN0cnVjdCBpb2F0X3JpbmdfZW50ICpkZXNjOworCXNpemVfdCB0b3RhbF9sZW4gPSBsZW47CisJc3RydWN0IGlvYXRfZmlsbF9kZXNjcmlwdG9yICpmaWxsOworCWludCBudW1fZGVzY3M7CisJdTY0IHNyY19kYXRhID0gKDB4MDEwMTAxMDEwMTAxMDEwMVVMTCkgKiAodmFsdWUgJiAweGZmKTsKKwl1MTYgaWR4OworCWludCBpOworCisJbnVtX2Rlc2NzID0gaW9hdDJfeGZlcmxlbl90b19kZXNjcyhpb2F0LCBsZW4pOworCWlmIChsaWtlbHkobnVtX2Rlc2NzKSAmJgorCSAgICBpb2F0Ml9hbGxvY19hbmRfbG9jaygmaWR4LCBpb2F0LCBudW1fZGVzY3MpID09IDApCisJCS8qIHBhc3MgKi87CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKwlpID0gMDsKKwlkbyB7CisJCXNpemVfdCB4ZmVyX3NpemUgPSBtaW5fdChzaXplX3QsIGxlbiwgMSA8PCBpb2F0LT54ZmVyY2FwX2xvZyk7CisKKwkJZGVzYyA9IGlvYXQyX2dldF9yaW5nX2VudChpb2F0LCBpZHggKyBpKTsKKwkJZmlsbCA9IGRlc2MtPmZpbGw7CisKKwkJZmlsbC0+c2l6ZSA9IHhmZXJfc2l6ZTsKKwkJZmlsbC0+c3JjX2RhdGEgPSBzcmNfZGF0YTsKKwkJZmlsbC0+ZHN0X2FkZHIgPSBkZXN0OworCQlmaWxsLT5jdGwgPSAwOworCQlmaWxsLT5jdGxfZi5vcCA9IElPQVRfT1BfRklMTDsKKworCQlsZW4gLT0geGZlcl9zaXplOworCQlkZXN0ICs9IHhmZXJfc2l6ZTsKKwkJZHVtcF9kZXNjX2RiZyhpb2F0LCBkZXNjKTsKKwl9IHdoaWxlICgrK2kgPCBudW1fZGVzY3MpOworCisJZGVzYy0+dHhkLmZsYWdzID0gZmxhZ3M7CisJZGVzYy0+bGVuID0gdG90YWxfbGVuOworCWZpbGwtPmN0bF9mLmludF9lbiA9ICEhKGZsYWdzICYgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlmaWxsLT5jdGxfZi5mZW5jZSA9ICEhKGZsYWdzICYgRE1BX1BSRVBfRkVOQ0UpOworCWZpbGwtPmN0bF9mLmNvbXBsX3dyaXRlID0gMTsKKwlkdW1wX2Rlc2NfZGJnKGlvYXQsIGRlc2MpOworCisJLyogd2UgbGVhdmUgdGhlIGNoYW5uZWwgbG9ja2VkIHRvIGVuc3VyZSBpbiBvcmRlciBzdWJtaXNzaW9uICovCisJcmV0dXJuICZkZXNjLT50eGQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorX19pb2F0M19wcmVwX3hvcl9sb2NrKHN0cnVjdCBkbWFfY2hhbiAqYywgZW51bSBzdW1fY2hlY2tfZmxhZ3MgKnJlc3VsdCwKKwkJICAgICAgZG1hX2FkZHJfdCBkZXN0LCBkbWFfYWRkcl90ICpzcmMsIHVuc2lnbmVkIGludCBzcmNfY250LAorCQkgICAgICBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXQyX2NoYW4oYyk7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmNvbXBsX2Rlc2M7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmRlc2M7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmV4dDsKKwlzaXplX3QgdG90YWxfbGVuID0gbGVuOworCXN0cnVjdCBpb2F0X3hvcl9kZXNjcmlwdG9yICp4b3I7CisJc3RydWN0IGlvYXRfeG9yX2V4dF9kZXNjcmlwdG9yICp4b3JfZXggPSBOVUxMOworCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodzsKKwl1MzIgb2Zmc2V0ID0gMDsKKwlpbnQgbnVtX2Rlc2NzOworCWludCB3aXRoX2V4dDsKKwlpbnQgaTsKKwl1MTYgaWR4OworCXU4IG9wID0gcmVzdWx0ID8gSU9BVF9PUF9YT1JfVkFMIDogSU9BVF9PUF9YT1I7CisKKwlCVUdfT04oc3JjX2NudCA8IDIpOworCisJbnVtX2Rlc2NzID0gaW9hdDJfeGZlcmxlbl90b19kZXNjcyhpb2F0LCBsZW4pOworCS8qIHdlIG5lZWQgMnggdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyB0byBjb3ZlciBncmVhdGVyIHRoYW4gNQorCSAqIHNvdXJjZXMKKwkgKi8KKwlpZiAoc3JjX2NudCA+IDUpIHsKKwkJd2l0aF9leHQgPSAxOworCQludW1fZGVzY3MgKj0gMjsKKwl9IGVsc2UKKwkJd2l0aF9leHQgPSAwOworCisJLyogY29tcGxldGlvbiB3cml0ZXMgZnJvbSB0aGUgcmFpZCBlbmdpbmUgbWF5IHBhc3MgY29tcGxldGlvbgorCSAqIHdyaXRlcyBmcm9tIHRoZSBsZWdhY3kgZW5naW5lLCBzbyB3ZSBuZWVkIG9uZSBleHRyYSBudWxsCisJICogKGxlZ2FjeSkgZGVzY3JpcHRvciB0byBlbnN1cmUgYWxsIGNvbXBsZXRpb24gd3JpdGVzIGFycml2ZSBpbgorCSAqIG9yZGVyLgorCSAqLworCWlmIChsaWtlbHkobnVtX2Rlc2NzKSAmJgorCSAgICBpb2F0Ml9hbGxvY19hbmRfbG9jaygmaWR4LCBpb2F0LCBudW1fZGVzY3MrMSkgPT0gMCkKKwkJLyogcGFzcyAqLzsKKwllbHNlCisJCXJldHVybiBOVUxMOworCWkgPSAwOworCWRvIHsKKwkJc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKmRlc2NzWzJdOworCQlzaXplX3QgeGZlcl9zaXplID0gbWluX3Qoc2l6ZV90LCBsZW4sIDEgPDwgaW9hdC0+eGZlcmNhcF9sb2cpOworCQlpbnQgczsKKworCQlkZXNjID0gaW9hdDJfZ2V0X3JpbmdfZW50KGlvYXQsIGlkeCArIGkpOworCQl4b3IgPSBkZXNjLT54b3I7CisKKwkJLyogc2F2ZSBhIGJyYW5jaCBieSB1bmNvbmRpdGlvbmFsbHkgcmV0cmlldmluZyB0aGUKKwkJICogZXh0ZW5kZWQgZGVzY3JpcHRvciB4b3Jfc2V0X3NyYygpIGtub3dzIHRvIG5vdCB3cml0ZQorCQkgKiB0byBpdCBpbiB0aGUgc2luZ2xlIGRlc2NyaXB0b3IgY2FzZQorCQkgKi8KKwkJZXh0ID0gaW9hdDJfZ2V0X3JpbmdfZW50KGlvYXQsIGlkeCArIGkgKyAxKTsKKwkJeG9yX2V4ID0gZXh0LT54b3JfZXg7CisKKwkJZGVzY3NbMF0gPSAoc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKikgeG9yOworCQlkZXNjc1sxXSA9IChzdHJ1Y3QgaW9hdF9yYXdfZGVzY3JpcHRvciAqKSB4b3JfZXg7CisJCWZvciAocyA9IDA7IHMgPCBzcmNfY250OyBzKyspCisJCQl4b3Jfc2V0X3NyYyhkZXNjcywgc3JjW3NdLCBvZmZzZXQsIHMpOworCQl4b3ItPnNpemUgPSB4ZmVyX3NpemU7CisJCXhvci0+ZHN0X2FkZHIgPSBkZXN0ICsgb2Zmc2V0OworCQl4b3ItPmN0bCA9IDA7CisJCXhvci0+Y3RsX2Yub3AgPSBvcDsKKwkJeG9yLT5jdGxfZi5zcmNfY250ID0gc3JjX2NudF90b19odyhzcmNfY250KTsKKworCQlsZW4gLT0geGZlcl9zaXplOworCQlvZmZzZXQgKz0geGZlcl9zaXplOworCQlkdW1wX2Rlc2NfZGJnKGlvYXQsIGRlc2MpOworCX0gd2hpbGUgKChpICs9IDEgKyB3aXRoX2V4dCkgPCBudW1fZGVzY3MpOworCisJLyogbGFzdCB4b3IgZGVzY3JpcHRvciBjYXJyaWVzIHRoZSB1bm1hcCBwYXJhbWV0ZXJzIGFuZCBmZW5jZSBiaXQgKi8KKwlkZXNjLT50eGQuZmxhZ3MgPSBmbGFnczsKKwlkZXNjLT5sZW4gPSB0b3RhbF9sZW47CisJaWYgKHJlc3VsdCkKKwkJZGVzYy0+cmVzdWx0ID0gcmVzdWx0OworCXhvci0+Y3RsX2YuZmVuY2UgPSAhIShmbGFncyAmIERNQV9QUkVQX0ZFTkNFKTsKKworCS8qIGNvbXBsZXRpb24gZGVzY3JpcHRvciBjYXJyaWVzIGludGVycnVwdCBiaXQgKi8KKwljb21wbF9kZXNjID0gaW9hdDJfZ2V0X3JpbmdfZW50KGlvYXQsIGlkeCArIGkpOworCWNvbXBsX2Rlc2MtPnR4ZC5mbGFncyA9IGZsYWdzICYgRE1BX1BSRVBfSU5URVJSVVBUOworCWh3ID0gY29tcGxfZGVzYy0+aHc7CisJaHctPmN0bCA9IDA7CisJaHctPmN0bF9mLm51bGwgPSAxOworCWh3LT5jdGxfZi5pbnRfZW4gPSAhIShmbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVCk7CisJaHctPmN0bF9mLmNvbXBsX3dyaXRlID0gMTsKKwlody0+c2l6ZSA9IE5VTExfREVTQ19CVUZGRVJfU0laRTsKKwlkdW1wX2Rlc2NfZGJnKGlvYXQsIGNvbXBsX2Rlc2MpOworCisJLyogd2UgbGVhdmUgdGhlIGNoYW5uZWwgbG9ja2VkIHRvIGVuc3VyZSBpbiBvcmRlciBzdWJtaXNzaW9uICovCisJcmV0dXJuICZkZXNjLT50eGQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgoraW9hdDNfcHJlcF94b3Ioc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90IGRlc3QsIGRtYV9hZGRyX3QgKnNyYywKKwkgICAgICAgdW5zaWduZWQgaW50IHNyY19jbnQsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIF9faW9hdDNfcHJlcF94b3JfbG9jayhjaGFuLCBOVUxMLCBkZXN0LCBzcmMsIHNyY19jbnQsIGxlbiwgZmxhZ3MpOworfQorCitzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgoraW9hdDNfcHJlcF94b3JfdmFsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCAqc3JjLAorCQkgICAgdW5zaWduZWQgaW50IHNyY19jbnQsIHNpemVfdCBsZW4sCisJCSAgICBlbnVtIHN1bV9jaGVja19mbGFncyAqcmVzdWx0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCS8qIHRoZSBjbGVhbnVwIHJvdXRpbmUgb25seSBzZXRzIGJpdHMgb24gdmFsaWRhdGUgZmFpbHVyZSwgaXQKKwkgKiBkb2VzIG5vdCBjbGVhciBiaXRzIG9uIHZhbGlkYXRlIHN1Y2Nlc3MuLi4gc28gY2xlYXIgaXQgaGVyZQorCSAqLworCSpyZXN1bHQgPSAwOworCisJcmV0dXJuIF9faW9hdDNfcHJlcF94b3JfbG9jayhjaGFuLCByZXN1bHQsIHNyY1swXSwgJnNyY1sxXSwKKwkJCQkgICAgIHNyY19jbnQgLSAxLCBsZW4sIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfcHFfZGVzY19kYmcoc3RydWN0IGlvYXQyX2RtYV9jaGFuICppb2F0LCBzdHJ1Y3QgaW9hdF9yaW5nX2VudCAqZGVzYywgc3RydWN0IGlvYXRfcmluZ19lbnQgKmV4dCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoJmlvYXQtPmJhc2UpOworCXN0cnVjdCBpb2F0X3BxX2Rlc2NyaXB0b3IgKnBxID0gZGVzYy0+cHE7CisJc3RydWN0IGlvYXRfcHFfZXh0X2Rlc2NyaXB0b3IgKnBxX2V4ID0gZXh0ID8gZXh0LT5wcV9leCA6IE5VTEw7CisJc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKmRlc2NzW10gPSB7ICh2b2lkICopIHBxLCAodm9pZCAqKSBwcV9leCB9OworCWludCBzcmNfY250ID0gc3JjX2NudF90b19zdyhwcS0+Y3RsX2Yuc3JjX2NudCk7CisJaW50IGk7CisKKwlkZXZfZGJnKGRldiwgImRlc2NbJWRdOiAoJSNsbHgtPiUjbGx4KSBmbGFnczogJSN4IgorCQkiIHN6OiAlI3ggY3RsOiAlI3ggKG9wOiAlZCBpbnQ6ICVkIGNvbXBsOiAlZCBwcTogJyVzJXMnIHNyY19jbnQ6ICVkKVxuIiwKKwkJZGVzY19pZChkZXNjKSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgZGVzYy0+dHhkLnBoeXMsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIChwcV9leCA/IHBxX2V4LT5uZXh0IDogcHEtPm5leHQpLAorCQlkZXNjLT50eGQuZmxhZ3MsIHBxLT5zaXplLCBwcS0+Y3RsLCBwcS0+Y3RsX2Yub3AsIHBxLT5jdGxfZi5pbnRfZW4sCisJCXBxLT5jdGxfZi5jb21wbF93cml0ZSwKKwkJcHEtPmN0bF9mLnBfZGlzYWJsZSA/ICIiIDogInAiLCBwcS0+Y3RsX2YucV9kaXNhYmxlID8gIiIgOiAicSIsCisJCXBxLT5jdGxfZi5zcmNfY250KTsKKwlmb3IgKGkgPSAwOyBpIDwgc3JjX2NudDsgaSsrKQorCQlkZXZfZGJnKGRldiwgIlx0c3JjWyVkXTogJSNsbHggY29lZjogJSN4XG4iLCBpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcHFfZ2V0X3NyYyhkZXNjcywgaSksIHBxLT5jb2VmW2ldKTsKKwlkZXZfZGJnKGRldiwgIlx0UDogJSNsbHhcbiIsIHBxLT5wX2FkZHIpOworCWRldl9kYmcoZGV2LCAiXHRROiAlI2xseFxuIiwgcHEtPnFfYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorX19pb2F0M19wcmVwX3BxX2xvY2soc3RydWN0IGRtYV9jaGFuICpjLCBlbnVtIHN1bV9jaGVja19mbGFncyAqcmVzdWx0LAorCQkgICAgIGNvbnN0IGRtYV9hZGRyX3QgKmRzdCwgY29uc3QgZG1hX2FkZHJfdCAqc3JjLAorCQkgICAgIHVuc2lnbmVkIGludCBzcmNfY250LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzY2YsCisJCSAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaW9hdDJfZG1hX2NoYW4gKmlvYXQgPSB0b19pb2F0Ml9jaGFuKGMpOworCXN0cnVjdCBpb2F0X2NoYW5fY29tbW9uICpjaGFuID0gJmlvYXQtPmJhc2U7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmNvbXBsX2Rlc2M7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmRlc2M7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmV4dDsKKwlzaXplX3QgdG90YWxfbGVuID0gbGVuOworCXN0cnVjdCBpb2F0X3BxX2Rlc2NyaXB0b3IgKnBxOworCXN0cnVjdCBpb2F0X3BxX2V4dF9kZXNjcmlwdG9yICpwcV9leCA9IE5VTEw7CisJc3RydWN0IGlvYXRfZG1hX2Rlc2NyaXB0b3IgKmh3OworCXUzMiBvZmZzZXQgPSAwOworCWludCBudW1fZGVzY3M7CisJaW50IHdpdGhfZXh0OworCWludCBpLCBzOworCXUxNiBpZHg7CisJdTggb3AgPSByZXN1bHQgPyBJT0FUX09QX1BRX1ZBTCA6IElPQVRfT1BfUFE7CisKKwlkZXZfZGJnKHRvX2RldihjaGFuKSwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJLyogdGhlIGVuZ2luZSByZXF1aXJlcyBhdCBsZWFzdCB0d28gc291cmNlcyAod2UgcHJvdmlkZQorCSAqIGF0IGxlYXN0IDEgaW1wbGllZCBzb3VyY2UgaW4gdGhlIERNQV9QUkVQX0NPTlRJTlVFIGNhc2UpCisJICovCisJQlVHX09OKHNyY19jbnQgKyBkbWFmX2NvbnRpbnVlKGZsYWdzKSA8IDIpOworCisJbnVtX2Rlc2NzID0gaW9hdDJfeGZlcmxlbl90b19kZXNjcyhpb2F0LCBsZW4pOworCS8qIHdlIG5lZWQgMnggdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyB0byBjb3ZlciBncmVhdGVyIHRoYW4gMworCSAqIHNvdXJjZXMKKwkgKi8KKwlpZiAoc3JjX2NudCA+IDMgfHwgZmxhZ3MgJiBETUFfUFJFUF9DT05USU5VRSkgeworCQl3aXRoX2V4dCA9IDE7CisJCW51bV9kZXNjcyAqPSAyOworCX0gZWxzZQorCQl3aXRoX2V4dCA9IDA7CisKKwkvKiBjb21wbGV0aW9uIHdyaXRlcyBmcm9tIHRoZSByYWlkIGVuZ2luZSBtYXkgcGFzcyBjb21wbGV0aW9uCisJICogd3JpdGVzIGZyb20gdGhlIGxlZ2FjeSBlbmdpbmUsIHNvIHdlIG5lZWQgb25lIGV4dHJhIG51bGwKKwkgKiAobGVnYWN5KSBkZXNjcmlwdG9yIHRvIGVuc3VyZSBhbGwgY29tcGxldGlvbiB3cml0ZXMgYXJyaXZlIGluCisJICogb3JkZXIuCisJICovCisJaWYgKGxpa2VseShudW1fZGVzY3MpICYmCisJICAgIGlvYXQyX2FsbG9jX2FuZF9sb2NrKCZpZHgsIGlvYXQsIG51bV9kZXNjcysxKSA9PSAwKQorCQkvKiBwYXNzICovOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7CisJaSA9IDA7CisJZG8geworCQlzdHJ1Y3QgaW9hdF9yYXdfZGVzY3JpcHRvciAqZGVzY3NbMl07CisJCXNpemVfdCB4ZmVyX3NpemUgPSBtaW5fdChzaXplX3QsIGxlbiwgMSA8PCBpb2F0LT54ZmVyY2FwX2xvZyk7CisKKwkJZGVzYyA9IGlvYXQyX2dldF9yaW5nX2VudChpb2F0LCBpZHggKyBpKTsKKwkJcHEgPSBkZXNjLT5wcTsKKworCQkvKiBzYXZlIGEgYnJhbmNoIGJ5IHVuY29uZGl0aW9uYWxseSByZXRyaWV2aW5nIHRoZQorCQkgKiBleHRlbmRlZCBkZXNjcmlwdG9yIHBxX3NldF9zcmMoKSBrbm93cyB0byBub3Qgd3JpdGUKKwkJICogdG8gaXQgaW4gdGhlIHNpbmdsZSBkZXNjcmlwdG9yIGNhc2UKKwkJICovCisJCWV4dCA9IGlvYXQyX2dldF9yaW5nX2VudChpb2F0LCBpZHggKyBpICsgd2l0aF9leHQpOworCQlwcV9leCA9IGV4dC0+cHFfZXg7CisKKwkJZGVzY3NbMF0gPSAoc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKikgcHE7CisJCWRlc2NzWzFdID0gKHN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICopIHBxX2V4OworCisJCWZvciAocyA9IDA7IHMgPCBzcmNfY250OyBzKyspCisJCQlwcV9zZXRfc3JjKGRlc2NzLCBzcmNbc10sIG9mZnNldCwgc2NmW3NdLCBzKTsKKworCQkvKiBzZWUgdGhlIGNvbW1lbnQgZm9yIGRtYV9tYXhwcSBpbiBpbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oICovCisJCWlmIChkbWFmX3BfZGlzYWJsZWRfY29udGludWUoZmxhZ3MpKQorCQkJcHFfc2V0X3NyYyhkZXNjcywgZHN0WzFdLCBvZmZzZXQsIDEsIHMrKyk7CisJCWVsc2UgaWYgKGRtYWZfY29udGludWUoZmxhZ3MpKSB7CisJCQlwcV9zZXRfc3JjKGRlc2NzLCBkc3RbMF0sIG9mZnNldCwgMCwgcysrKTsKKwkJCXBxX3NldF9zcmMoZGVzY3MsIGRzdFsxXSwgb2Zmc2V0LCAxLCBzKyspOworCQkJcHFfc2V0X3NyYyhkZXNjcywgZHN0WzFdLCBvZmZzZXQsIDAsIHMrKyk7CisJCX0KKwkJcHEtPnNpemUgPSB4ZmVyX3NpemU7CisJCXBxLT5wX2FkZHIgPSBkc3RbMF0gKyBvZmZzZXQ7CisJCXBxLT5xX2FkZHIgPSBkc3RbMV0gKyBvZmZzZXQ7CisJCXBxLT5jdGwgPSAwOworCQlwcS0+Y3RsX2Yub3AgPSBvcDsKKwkJcHEtPmN0bF9mLnNyY19jbnQgPSBzcmNfY250X3RvX2h3KHMpOworCQlwcS0+Y3RsX2YucF9kaXNhYmxlID0gISEoZmxhZ3MgJiBETUFfUFJFUF9QUV9ESVNBQkxFX1ApOworCQlwcS0+Y3RsX2YucV9kaXNhYmxlID0gISEoZmxhZ3MgJiBETUFfUFJFUF9QUV9ESVNBQkxFX1EpOworCisJCWxlbiAtPSB4ZmVyX3NpemU7CisJCW9mZnNldCArPSB4ZmVyX3NpemU7CisJfSB3aGlsZSAoKGkgKz0gMSArIHdpdGhfZXh0KSA8IG51bV9kZXNjcyk7CisKKwkvKiBsYXN0IHBxIGRlc2NyaXB0b3IgY2FycmllcyB0aGUgdW5tYXAgcGFyYW1ldGVycyBhbmQgZmVuY2UgYml0ICovCisJZGVzYy0+dHhkLmZsYWdzID0gZmxhZ3M7CisJZGVzYy0+bGVuID0gdG90YWxfbGVuOworCWlmIChyZXN1bHQpCisJCWRlc2MtPnJlc3VsdCA9IHJlc3VsdDsKKwlwcS0+Y3RsX2YuZmVuY2UgPSAhIShmbGFncyAmIERNQV9QUkVQX0ZFTkNFKTsKKwlkdW1wX3BxX2Rlc2NfZGJnKGlvYXQsIGRlc2MsIGV4dCk7CisKKwkvKiBjb21wbGV0aW9uIGRlc2NyaXB0b3IgY2FycmllcyBpbnRlcnJ1cHQgYml0ICovCisJY29tcGxfZGVzYyA9IGlvYXQyX2dldF9yaW5nX2VudChpb2F0LCBpZHggKyBpKTsKKwljb21wbF9kZXNjLT50eGQuZmxhZ3MgPSBmbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVDsKKwlodyA9IGNvbXBsX2Rlc2MtPmh3OworCWh3LT5jdGwgPSAwOworCWh3LT5jdGxfZi5udWxsID0gMTsKKwlody0+Y3RsX2YuaW50X2VuID0gISEoZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQpOworCWh3LT5jdGxfZi5jb21wbF93cml0ZSA9IDE7CisJaHctPnNpemUgPSBOVUxMX0RFU0NfQlVGRkVSX1NJWkU7CisJZHVtcF9kZXNjX2RiZyhpb2F0LCBjb21wbF9kZXNjKTsKKworCS8qIHdlIGxlYXZlIHRoZSBjaGFubmVsIGxvY2tlZCB0byBlbnN1cmUgaW4gb3JkZXIgc3VibWlzc2lvbiAqLworCXJldHVybiAmZGVzYy0+dHhkOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2lvYXQzX3ByZXBfcHEoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90ICpkc3QsIGRtYV9hZGRyX3QgKnNyYywKKwkgICAgICB1bnNpZ25lZCBpbnQgc3JjX2NudCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2NmLCBzaXplX3QgbGVuLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJLyogaGFuZGxlIHRoZSBzaW5nbGUgc291cmNlIG11bHRpcGx5IGNhc2UgZnJvbSB0aGUgcmFpZDYKKwkgKiByZWNvdmVyeSBwYXRoCisJICovCisJaWYgKHVubGlrZWx5KChmbGFncyAmIERNQV9QUkVQX1BRX0RJU0FCTEVfUCkgJiYgc3JjX2NudCA9PSAxKSkgeworCQlkbWFfYWRkcl90IHNpbmdsZV9zb3VyY2VbMl07CisJCXVuc2lnbmVkIGNoYXIgc2luZ2xlX3NvdXJjZV9jb2VmWzJdOworCisJCUJVR19PTihmbGFncyAmIERNQV9QUkVQX1BRX0RJU0FCTEVfUSk7CisJCXNpbmdsZV9zb3VyY2VbMF0gPSBzcmNbMF07CisJCXNpbmdsZV9zb3VyY2VbMV0gPSBzcmNbMF07CisJCXNpbmdsZV9zb3VyY2VfY29lZlswXSA9IHNjZlswXTsKKwkJc2luZ2xlX3NvdXJjZV9jb2VmWzFdID0gMDsKKworCQlyZXR1cm4gX19pb2F0M19wcmVwX3BxX2xvY2soY2hhbiwgTlVMTCwgZHN0LCBzaW5nbGVfc291cmNlLCAyLAorCQkJCQkgICAgc2luZ2xlX3NvdXJjZV9jb2VmLCBsZW4sIGZsYWdzKTsKKwl9IGVsc2UKKwkJcmV0dXJuIF9faW9hdDNfcHJlcF9wcV9sb2NrKGNoYW4sIE5VTEwsIGRzdCwgc3JjLCBzcmNfY250LCBzY2YsCisJCQkJCSAgICBsZW4sIGZsYWdzKTsKK30KKworc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2lvYXQzX3ByZXBfcHFfdmFsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCAqcHEsIGRtYV9hZGRyX3QgKnNyYywKKwkJICB1bnNpZ25lZCBpbnQgc3JjX2NudCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2NmLCBzaXplX3QgbGVuLAorCQkgIGVudW0gc3VtX2NoZWNrX2ZsYWdzICpwcXJlcywgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwkvKiB0aGUgY2xlYW51cCByb3V0aW5lIG9ubHkgc2V0cyBiaXRzIG9uIHZhbGlkYXRlIGZhaWx1cmUsIGl0CisJICogZG9lcyBub3QgY2xlYXIgYml0cyBvbiB2YWxpZGF0ZSBzdWNjZXNzLi4uIHNvIGNsZWFyIGl0IGhlcmUKKwkgKi8KKwkqcHFyZXMgPSAwOworCisJcmV0dXJuIF9faW9hdDNfcHJlcF9wcV9sb2NrKGNoYW4sIHBxcmVzLCBwcSwgc3JjLCBzcmNfY250LCBzY2YsIGxlbiwKKwkJCQkgICAgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2lvYXQzX3ByZXBfcHF4b3Ioc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90IGRzdCwgZG1hX2FkZHJfdCAqc3JjLAorCQkgdW5zaWduZWQgaW50IHNyY19jbnQsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJdW5zaWduZWQgY2hhciBzY2Zbc3JjX2NudF07CisJZG1hX2FkZHJfdCBwcVsyXTsKKworCW1lbXNldChzY2YsIDAsIHNyY19jbnQpOworCWZsYWdzIHw9IERNQV9QUkVQX1BRX0RJU0FCTEVfUTsKKwlwcVswXSA9IGRzdDsKKwlwcVsxXSA9IH4wOworCisJcmV0dXJuIF9faW9hdDNfcHJlcF9wcV9sb2NrKGNoYW4sIE5VTEwsIHBxLCBzcmMsIHNyY19jbnQsIHNjZiwgbGVuLAorCQkJCSAgICBmbGFncyk7Cit9CisKK3N0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitpb2F0M19wcmVwX3BxeG9yX3ZhbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgKnNyYywKKwkJICAgICB1bnNpZ25lZCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwKKwkJICAgICBlbnVtIHN1bV9jaGVja19mbGFncyAqcmVzdWx0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXVuc2lnbmVkIGNoYXIgc2NmW3NyY19jbnRdOworCWRtYV9hZGRyX3QgcHFbMl07CisKKwkvKiB0aGUgY2xlYW51cCByb3V0aW5lIG9ubHkgc2V0cyBiaXRzIG9uIHZhbGlkYXRlIGZhaWx1cmUsIGl0CisJICogZG9lcyBub3QgY2xlYXIgYml0cyBvbiB2YWxpZGF0ZSBzdWNjZXNzLi4uIHNvIGNsZWFyIGl0IGhlcmUKKwkgKi8KKwkqcmVzdWx0ID0gMDsKKworCW1lbXNldChzY2YsIDAsIHNyY19jbnQpOworCWZsYWdzIHw9IERNQV9QUkVQX1BRX0RJU0FCTEVfUTsKKwlwcVswXSA9IHNyY1swXTsKKwlwcVsxXSA9IH4wOworCisJcmV0dXJuIF9faW9hdDNfcHJlcF9wcV9sb2NrKGNoYW4sIHJlc3VsdCwgcHEsICZzcmNbMV0sIHNyY19jbnQgLSAxLCBzY2YsCisJCQkJICAgIGxlbiwgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2lvYXQzX3ByZXBfaW50ZXJydXB0X2xvY2soc3RydWN0IGRtYV9jaGFuICpjLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBpb2F0Ml9kbWFfY2hhbiAqaW9hdCA9IHRvX2lvYXQyX2NoYW4oYyk7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmRlc2M7CisJc3RydWN0IGlvYXRfZG1hX2Rlc2NyaXB0b3IgKmh3OworCXUxNiBpZHg7CisKKwlpZiAoaW9hdDJfYWxsb2NfYW5kX2xvY2soJmlkeCwgaW9hdCwgMSkgPT0gMCkKKwkJZGVzYyA9IGlvYXQyX2dldF9yaW5nX2VudChpb2F0LCBpZHgpOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7CisKKwlodyA9IGRlc2MtPmh3OworCWh3LT5jdGwgPSAwOworCWh3LT5jdGxfZi5udWxsID0gMTsKKwlody0+Y3RsX2YuaW50X2VuID0gMTsKKwlody0+Y3RsX2YuZmVuY2UgPSAhIShmbGFncyAmIERNQV9QUkVQX0ZFTkNFKTsKKwlody0+Y3RsX2YuY29tcGxfd3JpdGUgPSAxOworCWh3LT5zaXplID0gTlVMTF9ERVNDX0JVRkZFUl9TSVpFOworCWh3LT5zcmNfYWRkciA9IDA7CisJaHctPmRzdF9hZGRyID0gMDsKKworCWRlc2MtPnR4ZC5mbGFncyA9IGZsYWdzOworCWRlc2MtPmxlbiA9IDE7CisKKwlkdW1wX2Rlc2NfZGJnKGlvYXQsIGRlc2MpOworCisJLyogd2UgbGVhdmUgdGhlIGNoYW5uZWwgbG9ja2VkIHRvIGVuc3VyZSBpbiBvcmRlciBzdWJtaXNzaW9uICovCisJcmV0dXJuICZkZXNjLT50eGQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpb2F0M19kbWFfdGVzdF9jYWxsYmFjayh2b2lkICpkbWFfYXN5bmNfcGFyYW0pCit7CisJc3RydWN0IGNvbXBsZXRpb24gKmNtcCA9IGRtYV9hc3luY19wYXJhbTsKKworCWNvbXBsZXRlKGNtcCk7Cit9CisKKyNkZWZpbmUgSU9BVF9OVU1fU1JDX1RFU1QgNiAvKiBtdXN0IGJlIDw9IDggKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlvYXRfeG9yX3ZhbF9zZWxmX3Rlc3Qoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IGksIHNyY19pZHg7CisJc3RydWN0IHBhZ2UgKmRlc3Q7CisJc3RydWN0IHBhZ2UgKnhvcl9zcmNzW0lPQVRfTlVNX1NSQ19URVNUXTsKKwlzdHJ1Y3QgcGFnZSAqeG9yX3ZhbF9zcmNzW0lPQVRfTlVNX1NSQ19URVNUICsgMV07CisJZG1hX2FkZHJfdCBkbWFfc3Jjc1tJT0FUX05VTV9TUkNfVEVTVCArIDFdOworCWRtYV9hZGRyX3QgZG1hX2FkZHIsIGRlc3RfZG1hOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisJc3RydWN0IGRtYV9jaGFuICpkbWFfY2hhbjsKKwlkbWFfY29va2llX3QgY29va2llOworCXU4IGNtcF9ieXRlID0gMDsKKwl1MzIgY21wX3dvcmQ7CisJdTMyIHhvcl92YWxfcmVzdWx0OworCWludCBlcnIgPSAwOworCXN0cnVjdCBjb21wbGV0aW9uIGNtcDsKKwl1bnNpZ25lZCBsb25nIHRtbzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGV2aWNlLT5wZGV2LT5kZXY7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRtYSA9ICZkZXZpY2UtPmNvbW1vbjsKKworCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghZG1hX2hhc19jYXAoRE1BX1hPUiwgZG1hLT5jYXBfbWFzaykpCisJCXJldHVybiAwOworCisJZm9yIChzcmNfaWR4ID0gMDsgc3JjX2lkeCA8IElPQVRfTlVNX1NSQ19URVNUOyBzcmNfaWR4KyspIHsKKwkJeG9yX3NyY3Nbc3JjX2lkeF0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXhvcl9zcmNzW3NyY19pZHhdKSB7CisJCQl3aGlsZSAoc3JjX2lkeC0tKQorCQkJCV9fZnJlZV9wYWdlKHhvcl9zcmNzW3NyY19pZHhdKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJZGVzdCA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXN0KSB7CisJCXdoaWxlIChzcmNfaWR4LS0pCisJCQlfX2ZyZWVfcGFnZSh4b3Jfc3Jjc1tzcmNfaWR4XSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEZpbGwgaW4gc3JjIGJ1ZmZlcnMgKi8KKwlmb3IgKHNyY19pZHggPSAwOyBzcmNfaWR4IDwgSU9BVF9OVU1fU1JDX1RFU1Q7IHNyY19pZHgrKykgeworCQl1OCAqcHRyID0gcGFnZV9hZGRyZXNzKHhvcl9zcmNzW3NyY19pZHhdKTsKKwkJZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRTsgaSsrKQorCQkJcHRyW2ldID0gKDEgPDwgc3JjX2lkeCk7CisJfQorCisJZm9yIChzcmNfaWR4ID0gMDsgc3JjX2lkeCA8IElPQVRfTlVNX1NSQ19URVNUOyBzcmNfaWR4KyspCisJCWNtcF9ieXRlIF49ICh1OCkgKDEgPDwgc3JjX2lkeCk7CisKKwljbXBfd29yZCA9IChjbXBfYnl0ZSA8PCAyNCkgfCAoY21wX2J5dGUgPDwgMTYpIHwKKwkJCShjbXBfYnl0ZSA8PCA4KSB8IGNtcF9ieXRlOworCisJbWVtc2V0KHBhZ2VfYWRkcmVzcyhkZXN0KSwgMCwgUEFHRV9TSVpFKTsKKworCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRtYS0+Y2hhbm5lbHMubmV4dCwgc3RydWN0IGRtYV9jaGFuLAorCQkJCWRldmljZV9ub2RlKTsKKwlpZiAoZG1hLT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pIDwgMSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB0ZXN0IHhvciAqLworCWRlc3RfZG1hID0gZG1hX21hcF9wYWdlKGRldiwgZGVzdCwgMCwgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCWZvciAoaSA9IDA7IGkgPCBJT0FUX05VTV9TUkNfVEVTVDsgaSsrKQorCQlkbWFfc3Jjc1tpXSA9IGRtYV9tYXBfcGFnZShkZXYsIHhvcl9zcmNzW2ldLCAwLCBQQUdFX1NJWkUsCisJCQkJCSAgIERNQV9UT19ERVZJQ0UpOworCXR4ID0gZG1hLT5kZXZpY2VfcHJlcF9kbWFfeG9yKGRtYV9jaGFuLCBkZXN0X2RtYSwgZG1hX3NyY3MsCisJCQkJICAgICAgSU9BVF9OVU1fU1JDX1RFU1QsIFBBR0VfU0laRSwKKwkJCQkgICAgICBETUFfUFJFUF9JTlRFUlJVUFQpOworCisJaWYgKCF0eCkgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCB4b3IgcHJlcCBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKworCWFzeW5jX3R4X2Fjayh0eCk7CisJaW5pdF9jb21wbGV0aW9uKCZjbXApOworCXR4LT5jYWxsYmFjayA9IGlvYXQzX2RtYV90ZXN0X2NhbGxiYWNrOworCXR4LT5jYWxsYmFja19wYXJhbSA9ICZjbXA7CisJY29va2llID0gdHgtPnR4X3N1Ym1pdCh0eCk7CisJaWYgKGNvb2tpZSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJTZWxmLXRlc3QgeG9yIHNldHVwIGZhaWxlZFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9yZXNvdXJjZXM7CisJfQorCWRtYS0+ZGV2aWNlX2lzc3VlX3BlbmRpbmcoZG1hX2NoYW4pOworCisJdG1vID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjbXAsIG1zZWNzX3RvX2ppZmZpZXMoMzAwMCkpOworCisJaWYgKGRtYS0+ZGV2aWNlX2lzX3R4X2NvbXBsZXRlKGRtYV9jaGFuLCBjb29raWUsIE5VTEwsIE5VTEwpICE9IERNQV9TVUNDRVNTKSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IHhvciB0aW1lZCBvdXRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldiwgZGVzdF9kbWEsIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlmb3IgKGkgPSAwOyBpIDwgKFBBR0VfU0laRSAvIHNpemVvZih1MzIpKTsgaSsrKSB7CisJCXUzMiAqcHRyID0gcGFnZV9hZGRyZXNzKGRlc3QpOworCQlpZiAocHRyW2ldICE9IGNtcF93b3JkKSB7CisJCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCB4b3IgZmFpbGVkIGNvbXBhcmVcbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZnJlZV9yZXNvdXJjZXM7CisJCX0KKwl9CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBkZXN0X2RtYSwgUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKKworCS8qIHNraXAgdmFsaWRhdGUgaWYgdGhlIGNhcGFiaWxpdHkgaXMgbm90IHByZXNlbnQgKi8KKwlpZiAoIWRtYV9oYXNfY2FwKERNQV9YT1JfVkFMLCBkbWFfY2hhbi0+ZGV2aWNlLT5jYXBfbWFzaykpCisJCWdvdG8gZnJlZV9yZXNvdXJjZXM7CisKKwkvKiB2YWxpZGF0ZSB0aGUgc291cmNlcyB3aXRoIHRoZSBkZXN0aW50YXRpb24gcGFnZSAqLworCWZvciAoaSA9IDA7IGkgPCBJT0FUX05VTV9TUkNfVEVTVDsgaSsrKQorCQl4b3JfdmFsX3NyY3NbaV0gPSB4b3Jfc3Jjc1tpXTsKKwl4b3JfdmFsX3NyY3NbaV0gPSBkZXN0OworCisJeG9yX3ZhbF9yZXN1bHQgPSAxOworCisJZm9yIChpID0gMDsgaSA8IElPQVRfTlVNX1NSQ19URVNUICsgMTsgaSsrKQorCQlkbWFfc3Jjc1tpXSA9IGRtYV9tYXBfcGFnZShkZXYsIHhvcl92YWxfc3Jjc1tpXSwgMCwgUEFHRV9TSVpFLAorCQkJCQkgICBETUFfVE9fREVWSUNFKTsKKwl0eCA9IGRtYS0+ZGV2aWNlX3ByZXBfZG1hX3hvcl92YWwoZG1hX2NoYW4sIGRtYV9zcmNzLAorCQkJCQkgIElPQVRfTlVNX1NSQ19URVNUICsgMSwgUEFHRV9TSVpFLAorCQkJCQkgICZ4b3JfdmFsX3Jlc3VsdCwgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlpZiAoIXR4KSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IHplcm8gcHJlcCBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKworCWFzeW5jX3R4X2Fjayh0eCk7CisJaW5pdF9jb21wbGV0aW9uKCZjbXApOworCXR4LT5jYWxsYmFjayA9IGlvYXQzX2RtYV90ZXN0X2NhbGxiYWNrOworCXR4LT5jYWxsYmFja19wYXJhbSA9ICZjbXA7CisJY29va2llID0gdHgtPnR4X3N1Ym1pdCh0eCk7CisJaWYgKGNvb2tpZSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJTZWxmLXRlc3QgemVybyBzZXR1cCBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKwlkbWEtPmRldmljZV9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKKworCXRtbyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY21wLCBtc2Vjc190b19qaWZmaWVzKDMwMDApKTsKKworCWlmIChkbWEtPmRldmljZV9pc190eF9jb21wbGV0ZShkbWFfY2hhbiwgY29va2llLCBOVUxMLCBOVUxMKSAhPSBETUFfU1VDQ0VTUykgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCB2YWxpZGF0ZSB0aW1lZCBvdXRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKworCWlmICh4b3JfdmFsX3Jlc3VsdCAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IHZhbGlkYXRlIGZhaWxlZCBjb21wYXJlXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwkvKiBza2lwIG1lbXNldCBpZiB0aGUgY2FwYWJpbGl0eSBpcyBub3QgcHJlc2VudCAqLworCWlmICghZG1hX2hhc19jYXAoRE1BX01FTVNFVCwgZG1hX2NoYW4tPmRldmljZS0+Y2FwX21hc2spKQorCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCisJLyogdGVzdCBtZW1zZXQgKi8KKwlkbWFfYWRkciA9IGRtYV9tYXBfcGFnZShkZXYsIGRlc3QsIDAsCisJCQlQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJdHggPSBkbWEtPmRldmljZV9wcmVwX2RtYV9tZW1zZXQoZG1hX2NoYW4sIGRtYV9hZGRyLCAwLCBQQUdFX1NJWkUsCisJCQkJCSBETUFfUFJFUF9JTlRFUlJVUFQpOworCWlmICghdHgpIHsKKwkJZGV2X2VycihkZXYsICJTZWxmLXRlc3QgbWVtc2V0IHByZXAgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwlhc3luY190eF9hY2sodHgpOworCWluaXRfY29tcGxldGlvbigmY21wKTsKKwl0eC0+Y2FsbGJhY2sgPSBpb2F0M19kbWFfdGVzdF9jYWxsYmFjazsKKwl0eC0+Y2FsbGJhY2tfcGFyYW0gPSAmY21wOworCWNvb2tpZSA9IHR4LT50eF9zdWJtaXQodHgpOworCWlmIChjb29raWUgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IG1lbXNldCBzZXR1cCBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKwlkbWEtPmRldmljZV9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKKworCXRtbyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY21wLCBtc2Vjc190b19qaWZmaWVzKDMwMDApKTsKKworCWlmIChkbWEtPmRldmljZV9pc190eF9jb21wbGV0ZShkbWFfY2hhbiwgY29va2llLCBOVUxMLCBOVUxMKSAhPSBETUFfU1VDQ0VTUykgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCBtZW1zZXQgdGltZWQgb3V0XG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFL3NpemVvZih1MzIpOyBpKyspIHsKKwkJdTMyICpwdHIgPSBwYWdlX2FkZHJlc3MoZGVzdCk7CisJCWlmIChwdHJbaV0pIHsKKwkJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IG1lbXNldCBmYWlsZWQgY29tcGFyZVxuIik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBmcmVlX3Jlc291cmNlczsKKwkJfQorCX0KKworCS8qIHRlc3QgZm9yIG5vbi16ZXJvIHBhcml0eSBzdW0gKi8KKwl4b3JfdmFsX3Jlc3VsdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IElPQVRfTlVNX1NSQ19URVNUICsgMTsgaSsrKQorCQlkbWFfc3Jjc1tpXSA9IGRtYV9tYXBfcGFnZShkZXYsIHhvcl92YWxfc3Jjc1tpXSwgMCwgUEFHRV9TSVpFLAorCQkJCQkgICBETUFfVE9fREVWSUNFKTsKKwl0eCA9IGRtYS0+ZGV2aWNlX3ByZXBfZG1hX3hvcl92YWwoZG1hX2NoYW4sIGRtYV9zcmNzLAorCQkJCQkgIElPQVRfTlVNX1NSQ19URVNUICsgMSwgUEFHRV9TSVpFLAorCQkJCQkgICZ4b3JfdmFsX3Jlc3VsdCwgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlpZiAoIXR4KSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IDJuZCB6ZXJvIHByZXAgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwlhc3luY190eF9hY2sodHgpOworCWluaXRfY29tcGxldGlvbigmY21wKTsKKwl0eC0+Y2FsbGJhY2sgPSBpb2F0M19kbWFfdGVzdF9jYWxsYmFjazsKKwl0eC0+Y2FsbGJhY2tfcGFyYW0gPSAmY21wOworCWNvb2tpZSA9IHR4LT50eF9zdWJtaXQodHgpOworCWlmIChjb29raWUgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0ICAybmQgemVybyBzZXR1cCBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKwlkbWEtPmRldmljZV9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKKworCXRtbyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY21wLCBtc2Vjc190b19qaWZmaWVzKDMwMDApKTsKKworCWlmIChkbWEtPmRldmljZV9pc190eF9jb21wbGV0ZShkbWFfY2hhbiwgY29va2llLCBOVUxMLCBOVUxMKSAhPSBETUFfU1VDQ0VTUykgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCAybmQgdmFsaWRhdGUgdGltZWQgb3V0XG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwlpZiAoeG9yX3ZhbF9yZXN1bHQgIT0gU1VNX0NIRUNLX1BfUkVTVUxUKSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IHZhbGlkYXRlIGZhaWxlZCBjb21wYXJlXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKK2ZyZWVfcmVzb3VyY2VzOgorCWRtYS0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pOworb3V0OgorCXNyY19pZHggPSBJT0FUX05VTV9TUkNfVEVTVDsKKwl3aGlsZSAoc3JjX2lkeC0tKQorCQlfX2ZyZWVfcGFnZSh4b3Jfc3Jjc1tzcmNfaWR4XSk7CisJX19mcmVlX3BhZ2UoZGVzdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW9hdDNfZG1hX3NlbGZfdGVzdChzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmMgPSBpb2F0X2RtYV9zZWxmX3Rlc3QoZGV2aWNlKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBpb2F0X3hvcl92YWxfc2VsZl90ZXN0KGRldmljZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9fZGV2aW5pdCBpb2F0M19kbWFfcHJvYmUoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UsIGludCBkY2EpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZpY2UtPnBkZXY7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRtYTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmM7CisJc3RydWN0IGlvYXRfY2hhbl9jb21tb24gKmNoYW47CisJYm9vbCBpc19yYWlkX2RldmljZSA9IGZhbHNlOworCWludCBlcnI7CisJdTE2IGRldl9pZDsKKwl1MzIgY2FwOworCisJZGV2aWNlLT5lbnVtZXJhdGVfY2hhbm5lbHMgPSBpb2F0Ml9lbnVtZXJhdGVfY2hhbm5lbHM7CisJZGV2aWNlLT5zZWxmX3Rlc3QgPSBpb2F0M19kbWFfc2VsZl90ZXN0OworCWRtYSA9ICZkZXZpY2UtPmNvbW1vbjsKKwlkbWEtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkgPSBpb2F0Ml9kbWFfcHJlcF9tZW1jcHlfbG9jazsKKwlkbWEtPmRldmljZV9pc3N1ZV9wZW5kaW5nID0gaW9hdDJfaXNzdWVfcGVuZGluZzsKKwlkbWEtPmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyA9IGlvYXQyX2FsbG9jX2NoYW5fcmVzb3VyY2VzOworCWRtYS0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMgPSBpb2F0Ml9mcmVlX2NoYW5fcmVzb3VyY2VzOworCisJZG1hX2NhcF9zZXQoRE1BX0lOVEVSUlVQVCwgZG1hLT5jYXBfbWFzayk7CisJZG1hLT5kZXZpY2VfcHJlcF9kbWFfaW50ZXJydXB0ID0gaW9hdDNfcHJlcF9pbnRlcnJ1cHRfbG9jazsKKworCWNhcCA9IHJlYWRsKGRldmljZS0+cmVnX2Jhc2UgKyBJT0FUX0RNQV9DQVBfT0ZGU0VUKTsKKwlpZiAoY2FwICYgSU9BVF9DQVBfWE9SKSB7CisJCWlzX3JhaWRfZGV2aWNlID0gdHJ1ZTsKKwkJZG1hLT5tYXhfeG9yID0gODsKKwkJZG1hLT54b3JfYWxpZ24gPSAyOworCisJCWRtYV9jYXBfc2V0KERNQV9YT1IsIGRtYS0+Y2FwX21hc2spOworCQlkbWEtPmRldmljZV9wcmVwX2RtYV94b3IgPSBpb2F0M19wcmVwX3hvcjsKKworCQlkbWFfY2FwX3NldChETUFfWE9SX1ZBTCwgZG1hLT5jYXBfbWFzayk7CisJCWRtYS0+ZGV2aWNlX3ByZXBfZG1hX3hvcl92YWwgPSBpb2F0M19wcmVwX3hvcl92YWw7CisJfQorCWlmIChjYXAgJiBJT0FUX0NBUF9QUSkgeworCQlpc19yYWlkX2RldmljZSA9IHRydWU7CisJCWRtYV9zZXRfbWF4cHEoZG1hLCA4LCAwKTsKKwkJZG1hLT5wcV9hbGlnbiA9IDI7CisKKwkJZG1hX2NhcF9zZXQoRE1BX1BRLCBkbWEtPmNhcF9tYXNrKTsKKwkJZG1hLT5kZXZpY2VfcHJlcF9kbWFfcHEgPSBpb2F0M19wcmVwX3BxOworCisJCWRtYV9jYXBfc2V0KERNQV9QUV9WQUwsIGRtYS0+Y2FwX21hc2spOworCQlkbWEtPmRldmljZV9wcmVwX2RtYV9wcV92YWwgPSBpb2F0M19wcmVwX3BxX3ZhbDsKKworCQlpZiAoIShjYXAgJiBJT0FUX0NBUF9YT1IpKSB7CisJCQlkbWEtPm1heF94b3IgPSA4OworCQkJZG1hLT54b3JfYWxpZ24gPSAyOworCisJCQlkbWFfY2FwX3NldChETUFfWE9SLCBkbWEtPmNhcF9tYXNrKTsKKwkJCWRtYS0+ZGV2aWNlX3ByZXBfZG1hX3hvciA9IGlvYXQzX3ByZXBfcHF4b3I7CisKKwkJCWRtYV9jYXBfc2V0KERNQV9YT1JfVkFMLCBkbWEtPmNhcF9tYXNrKTsKKwkJCWRtYS0+ZGV2aWNlX3ByZXBfZG1hX3hvcl92YWwgPSBpb2F0M19wcmVwX3BxeG9yX3ZhbDsKKwkJfQorCX0KKwlpZiAoaXNfcmFpZF9kZXZpY2UgJiYgKGNhcCAmIElPQVRfQ0FQX0ZJTExfQkxPQ0spKSB7CisJCWRtYV9jYXBfc2V0KERNQV9NRU1TRVQsIGRtYS0+Y2FwX21hc2spOworCQlkbWEtPmRldmljZV9wcmVwX2RtYV9tZW1zZXQgPSBpb2F0M19wcmVwX21lbXNldF9sb2NrOworCX0KKworCisJaWYgKGlzX3JhaWRfZGV2aWNlKSB7CisJCWRtYS0+ZGV2aWNlX2lzX3R4X2NvbXBsZXRlID0gaW9hdDNfaXNfY29tcGxldGU7CisJCWRldmljZS0+Y2xlYW51cF90YXNrbGV0ID0gaW9hdDNfY2xlYW51cF90YXNrbGV0OworCQlkZXZpY2UtPnRpbWVyX2ZuID0gaW9hdDNfdGltZXJfZXZlbnQ7CisJfSBlbHNlIHsKKwkJZG1hLT5kZXZpY2VfaXNfdHhfY29tcGxldGUgPSBpb2F0Ml9pc19jb21wbGV0ZTsKKwkJZGV2aWNlLT5jbGVhbnVwX3Rhc2tsZXQgPSBpb2F0Ml9jbGVhbnVwX3Rhc2tsZXQ7CisJCWRldmljZS0+dGltZXJfZm4gPSBpb2F0Ml90aW1lcl9ldmVudDsKKwl9CisKKwkvKiAtPSBJT0FUIHZlci4zIHdvcmthcm91bmRzID0tICovCisJLyogV3JpdGUgQ0hBTkVSUk1TS19JTlQgd2l0aCAzRTA3aCB0byBtYXNrIG91dCB0aGUgZXJyb3JzCisJICogdGhhdCBjYW4gY2F1c2Ugc3RhYmlsaXR5IGlzc3VlcyBmb3IgSU9BVCB2ZXIuMworCSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgSU9BVF9QQ0lfQ0hBTkVSUk1BU0tfSU5UX09GRlNFVCwgMHgzZTA3KTsKKworCS8qIENsZWFyIERNQVVOQ0VSUlNUUyBDZmctUmVnIFBhcml0eSBFcnJvciBzdGF0dXMgYml0CisJICogKHdvcmthcm91bmQgZm9yIHNwdXJpb3VzIGNvbmZpZyBwYXJpdHkgZXJyb3IgYWZ0ZXIgcmVzdGFydCkKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBJT0FUX1BDSV9ERVZJQ0VfSURfT0ZGU0VULCAmZGV2X2lkKTsKKwlpZiAoZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9UQkcwKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIElPQVRfUENJX0RNQVVOQ0VSUlNUU19PRkZTRVQsIDB4MTApOworCisJZXJyID0gaW9hdF9wcm9iZShkZXZpY2UpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaW9hdF9zZXRfdGNwX2NvcHlfYnJlYWsoMjYyMTQ0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmRtYS0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7CisJCWNoYW4gPSB0b19jaGFuX2NvbW1vbihjKTsKKwkJd3JpdGVsKElPQVRfRE1BX0RDQV9BTllfQ1BVLAorCQkgICAgICAgY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0RDQUNUUkxfT0ZGU0VUKTsKKwl9CisKKwllcnIgPSBpb2F0X3JlZ2lzdGVyKGRldmljZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlvYXRfa29iamVjdF9hZGQoZGV2aWNlLCAmaW9hdDJfa3R5cGUpOworCisJaWYgKGRjYSkKKwkJZGV2aWNlLT5kY2EgPSBpb2F0M19kY2FfaW5pdChwZGV2LCBkZXZpY2UtPnJlZ19iYXNlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC9ody5oIGIvZHJpdmVycy9kbWEvaW9hdC9ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWZiMTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvaW9hdC9ody5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDQgLSAyMDA5IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqLworI2lmbmRlZiBfSU9BVF9IV19IXworI2RlZmluZSBfSU9BVF9IV19IXworCisvKiBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSBWYWx1ZXMgKi8KKyNkZWZpbmUgSU9BVF9QQ0lfVklEICAgICAgICAgICAgMHg4MDg2CisjZGVmaW5lIElPQVRfTU1JT19CQVIJCTAKKworLyogQ0IgZGV2aWNlIElEJ3MgKi8KKyNkZWZpbmUgSU9BVF9QQ0lfRElEXzUwMDAgICAgICAgMHgxQTM4CisjZGVmaW5lIElPQVRfUENJX0RJRF9DTkIgICAgICAgIDB4MzYwQgorI2RlZmluZSBJT0FUX1BDSV9ESURfU0NOQiAgICAgICAweDY1RkYKKyNkZWZpbmUgSU9BVF9QQ0lfRElEX1NOQiAgICAgICAgMHg0MDJGCisKKyNkZWZpbmUgSU9BVF9QQ0lfUklEICAgICAgICAgICAgMHgwMAorI2RlZmluZSBJT0FUX1BDSV9TVklEICAgICAgICAgICAweDgwODYKKyNkZWZpbmUgSU9BVF9QQ0lfU0lEICAgICAgICAgICAgMHg4MDg2CisjZGVmaW5lIElPQVRfVkVSXzFfMiAgICAgICAgICAgIDB4MTIgICAgLyogVmVyc2lvbiAxLjIgKi8KKyNkZWZpbmUgSU9BVF9WRVJfMl8wICAgICAgICAgICAgMHgyMCAgICAvKiBWZXJzaW9uIDIuMCAqLworI2RlZmluZSBJT0FUX1ZFUl8zXzAgICAgICAgICAgICAweDMwICAgIC8qIFZlcnNpb24gMy4wICovCisjZGVmaW5lIElPQVRfVkVSXzNfMiAgICAgICAgICAgIDB4MzIgICAgLyogVmVyc2lvbiAzLjIgKi8KKworc3RydWN0IGlvYXRfZG1hX2Rlc2NyaXB0b3IgeworCXVpbnQzMl90CXNpemU7CisJdW5pb24geworCQl1aW50MzJfdCBjdGw7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBpbnQgaW50X2VuOjE7CisJCQl1bnNpZ25lZCBpbnQgc3JjX3Nub29wX2RpczoxOworCQkJdW5zaWduZWQgaW50IGRlc3Rfc25vb3BfZGlzOjE7CisJCQl1bnNpZ25lZCBpbnQgY29tcGxfd3JpdGU6MTsKKwkJCXVuc2lnbmVkIGludCBmZW5jZToxOworCQkJdW5zaWduZWQgaW50IG51bGw6MTsKKwkJCXVuc2lnbmVkIGludCBzcmNfYnJrOjE7CisJCQl1bnNpZ25lZCBpbnQgZGVzdF9icms6MTsKKwkJCXVuc2lnbmVkIGludCBidW5kbGU6MTsKKwkJCXVuc2lnbmVkIGludCBkZXN0X2RjYToxOworCQkJdW5zaWduZWQgaW50IGhpbnQ6MTsKKwkJCXVuc2lnbmVkIGludCByc3ZkMjoxMzsKKwkJCSNkZWZpbmUgSU9BVF9PUF9DT1BZIDB4MDAKKwkJCXVuc2lnbmVkIGludCBvcDo4OworCQl9IGN0bF9mOworCX07CisJdWludDY0X3QJc3JjX2FkZHI7CisJdWludDY0X3QJZHN0X2FkZHI7CisJdWludDY0X3QJbmV4dDsKKwl1aW50NjRfdAlyc3YxOworCXVpbnQ2NF90CXJzdjI7CisJLyogc3RvcmUgc29tZSBkcml2ZXIgZGF0YSBpbiBhbiB1bnVzZWQgcG9ydGlvbiBvZiB0aGUgZGVzY3JpcHRvciAqLworCXVuaW9uIHsKKwkJdWludDY0X3QJdXNlcjE7CisJCXVpbnQ2NF90CXR4X2NudDsKKwl9OworCXVpbnQ2NF90CXVzZXIyOworfTsKKworc3RydWN0IGlvYXRfZmlsbF9kZXNjcmlwdG9yIHsKKwl1aW50MzJfdAlzaXplOworCXVuaW9uIHsKKwkJdWludDMyX3QgY3RsOworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgaW50IGludF9lbjoxOworCQkJdW5zaWduZWQgaW50IHJzdmQ6MTsKKwkJCXVuc2lnbmVkIGludCBkZXN0X3Nub29wX2RpczoxOworCQkJdW5zaWduZWQgaW50IGNvbXBsX3dyaXRlOjE7CisJCQl1bnNpZ25lZCBpbnQgZmVuY2U6MTsKKwkJCXVuc2lnbmVkIGludCByc3ZkMjoyOworCQkJdW5zaWduZWQgaW50IGRlc3RfYnJrOjE7CisJCQl1bnNpZ25lZCBpbnQgYnVuZGxlOjE7CisJCQl1bnNpZ25lZCBpbnQgcnN2ZDQ6MTU7CisJCQkjZGVmaW5lIElPQVRfT1BfRklMTCAweDAxCisJCQl1bnNpZ25lZCBpbnQgb3A6ODsKKwkJfSBjdGxfZjsKKwl9OworCXVpbnQ2NF90CXNyY19kYXRhOworCXVpbnQ2NF90CWRzdF9hZGRyOworCXVpbnQ2NF90CW5leHQ7CisJdWludDY0X3QJcnN2MTsKKwl1aW50NjRfdAluZXh0X2RzdF9hZGRyOworCXVpbnQ2NF90CXVzZXIxOworCXVpbnQ2NF90CXVzZXIyOworfTsKKworc3RydWN0IGlvYXRfeG9yX2Rlc2NyaXB0b3IgeworCXVpbnQzMl90CXNpemU7CisJdW5pb24geworCQl1aW50MzJfdCBjdGw7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBpbnQgaW50X2VuOjE7CisJCQl1bnNpZ25lZCBpbnQgc3JjX3Nub29wX2RpczoxOworCQkJdW5zaWduZWQgaW50IGRlc3Rfc25vb3BfZGlzOjE7CisJCQl1bnNpZ25lZCBpbnQgY29tcGxfd3JpdGU6MTsKKwkJCXVuc2lnbmVkIGludCBmZW5jZToxOworCQkJdW5zaWduZWQgaW50IHNyY19jbnQ6MzsKKwkJCXVuc2lnbmVkIGludCBidW5kbGU6MTsKKwkJCXVuc2lnbmVkIGludCBkZXN0X2RjYToxOworCQkJdW5zaWduZWQgaW50IGhpbnQ6MTsKKwkJCXVuc2lnbmVkIGludCByc3ZkOjEzOworCQkJI2RlZmluZSBJT0FUX09QX1hPUiAweDg3CisJCQkjZGVmaW5lIElPQVRfT1BfWE9SX1ZBTCAweDg4CisJCQl1bnNpZ25lZCBpbnQgb3A6ODsKKwkJfSBjdGxfZjsKKwl9OworCXVpbnQ2NF90CXNyY19hZGRyOworCXVpbnQ2NF90CWRzdF9hZGRyOworCXVpbnQ2NF90CW5leHQ7CisJdWludDY0X3QJc3JjX2FkZHIyOworCXVpbnQ2NF90CXNyY19hZGRyMzsKKwl1aW50NjRfdAlzcmNfYWRkcjQ7CisJdWludDY0X3QJc3JjX2FkZHI1OworfTsKKworc3RydWN0IGlvYXRfeG9yX2V4dF9kZXNjcmlwdG9yIHsKKwl1aW50NjRfdAlzcmNfYWRkcjY7CisJdWludDY0X3QJc3JjX2FkZHI3OworCXVpbnQ2NF90CXNyY19hZGRyODsKKwl1aW50NjRfdAluZXh0OworCXVpbnQ2NF90CXJzdmRbNF07Cit9OworCitzdHJ1Y3QgaW9hdF9wcV9kZXNjcmlwdG9yIHsKKwl1aW50MzJfdAlzaXplOworCXVuaW9uIHsKKwkJdWludDMyX3QgY3RsOworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgaW50IGludF9lbjoxOworCQkJdW5zaWduZWQgaW50IHNyY19zbm9vcF9kaXM6MTsKKwkJCXVuc2lnbmVkIGludCBkZXN0X3Nub29wX2RpczoxOworCQkJdW5zaWduZWQgaW50IGNvbXBsX3dyaXRlOjE7CisJCQl1bnNpZ25lZCBpbnQgZmVuY2U6MTsKKwkJCXVuc2lnbmVkIGludCBzcmNfY250OjM7CisJCQl1bnNpZ25lZCBpbnQgYnVuZGxlOjE7CisJCQl1bnNpZ25lZCBpbnQgZGVzdF9kY2E6MTsKKwkJCXVuc2lnbmVkIGludCBoaW50OjE7CisJCQl1bnNpZ25lZCBpbnQgcF9kaXNhYmxlOjE7CisJCQl1bnNpZ25lZCBpbnQgcV9kaXNhYmxlOjE7CisJCQl1bnNpZ25lZCBpbnQgcnN2ZDoxMTsKKwkJCSNkZWZpbmUgSU9BVF9PUF9QUSAweDg5CisJCQkjZGVmaW5lIElPQVRfT1BfUFFfVkFMIDB4OGEKKwkJCXVuc2lnbmVkIGludCBvcDo4OworCQl9IGN0bF9mOworCX07CisJdWludDY0X3QJc3JjX2FkZHI7CisJdWludDY0X3QJcF9hZGRyOworCXVpbnQ2NF90CW5leHQ7CisJdWludDY0X3QJc3JjX2FkZHIyOworCXVpbnQ2NF90CXNyY19hZGRyMzsKKwl1aW50OF90CQljb2VmWzhdOworCXVpbnQ2NF90CXFfYWRkcjsKK307CisKK3N0cnVjdCBpb2F0X3BxX2V4dF9kZXNjcmlwdG9yIHsKKwl1aW50NjRfdAlzcmNfYWRkcjQ7CisJdWludDY0X3QJc3JjX2FkZHI1OworCXVpbnQ2NF90CXNyY19hZGRyNjsKKwl1aW50NjRfdAluZXh0OworCXVpbnQ2NF90CXNyY19hZGRyNzsKKwl1aW50NjRfdAlzcmNfYWRkcjg7CisJdWludDY0X3QJcnN2ZFsyXTsKK307CisKK3N0cnVjdCBpb2F0X3BxX3VwZGF0ZV9kZXNjcmlwdG9yIHsKKwl1aW50MzJfdAlzaXplOworCXVuaW9uIHsKKwkJdWludDMyX3QgY3RsOworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgaW50IGludF9lbjoxOworCQkJdW5zaWduZWQgaW50IHNyY19zbm9vcF9kaXM6MTsKKwkJCXVuc2lnbmVkIGludCBkZXN0X3Nub29wX2RpczoxOworCQkJdW5zaWduZWQgaW50IGNvbXBsX3dyaXRlOjE7CisJCQl1bnNpZ25lZCBpbnQgZmVuY2U6MTsKKwkJCXVuc2lnbmVkIGludCBzcmNfY250OjM7CisJCQl1bnNpZ25lZCBpbnQgYnVuZGxlOjE7CisJCQl1bnNpZ25lZCBpbnQgZGVzdF9kY2E6MTsKKwkJCXVuc2lnbmVkIGludCBoaW50OjE7CisJCQl1bnNpZ25lZCBpbnQgcF9kaXNhYmxlOjE7CisJCQl1bnNpZ25lZCBpbnQgcV9kaXNhYmxlOjE7CisJCQl1bnNpZ25lZCBpbnQgcnN2ZDozOworCQkJdW5zaWduZWQgaW50IGNvZWY6ODsKKwkJCSNkZWZpbmUgSU9BVF9PUF9QUV9VUCAweDhiCisJCQl1bnNpZ25lZCBpbnQgb3A6ODsKKwkJfSBjdGxfZjsKKwl9OworCXVpbnQ2NF90CXNyY19hZGRyOworCXVpbnQ2NF90CXBfYWRkcjsKKwl1aW50NjRfdAluZXh0OworCXVpbnQ2NF90CXNyY19hZGRyMjsKKwl1aW50NjRfdAlwX3NyYzsKKwl1aW50NjRfdAlxX3NyYzsKKwl1aW50NjRfdAlxX2FkZHI7Cit9OworCitzdHJ1Y3QgaW9hdF9yYXdfZGVzY3JpcHRvciB7CisJdWludDY0X3QJZmllbGRbOF07Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pb2F0L3BjaS5jIGIvZHJpdmVycy9kbWEvaW9hdC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ1ZmFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvaW9hdC9wY2kuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIEludGVsIEkvT0FUIERNQSBMaW51eCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICovCisKKy8qCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbiBJbnRlbCBJL09BVCBETUEgZW5naW5lLCB3aGljaCBkb2VzIGFzeW5jaHJvbm91cworICogY29weSBvcGVyYXRpb25zLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGNhLmg+CisjaW5jbHVkZSAiZG1hLmgiCisjaW5jbHVkZSAiZG1hX3YyLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAiaHcuaCIKKworTU9EVUxFX1ZFUlNJT04oSU9BVF9ETUFfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW9hdF9wY2lfdGJsW10gPSB7CisJLyogSS9PQVQgdjEgcGxhdGZvcm1zICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9DTkIpICB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TQ05CKSB9LAorCXsgUENJX1ZERVZJQ0UoVU5JU1lTLCBQQ0lfREVWSUNFX0lEX1VOSVNZU19ETUFfRElSRUNUT1IpIH0sCisKKwkvKiBJL09BVCB2MiBwbGF0Zm9ybXMgKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CKSB9LAorCisJLyogSS9PQVQgdjMgcGxhdGZvcm1zICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzApIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzEpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzIpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzMpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzQpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzUpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzYpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1RCRzcpIH0sCisKKwkvKiBJL09BVCB2My4yIHBsYXRmb3JtcyAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0YwKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0YxKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0YyKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0YzKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y0KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y1KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y2KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y3KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y4KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y5KSB9LAorCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlvYXRfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlvYXRfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IGlvYXRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIGludCBpb2F0X2RjYV9lbmFibGVkID0gMTsKK21vZHVsZV9wYXJhbShpb2F0X2RjYV9lbmFibGVkLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpb2F0X2RjYV9lbmFibGVkLCAiY29udHJvbCBzdXBwb3J0IG9mIGRjYSBzZXJ2aWNlIChkZWZhdWx0OiAxKSIpOworCitzdHJ1Y3Qga21lbV9jYWNoZSAqaW9hdDJfY2FjaGU7CisKKyNkZWZpbmUgRFJWX05BTUUgImlvYXRkbWEiCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpb2F0X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gaW9hdF9wY2lfdGJsLAorCS5wcm9iZQkJPSBpb2F0X3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGlvYXRfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKgorYWxsb2NfaW9hdGRtYShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICppb2Jhc2UpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CisJZC0+cGRldiA9IHBkZXY7CisJZC0+cmVnX2Jhc2UgPSBpb2Jhc2U7CisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlvYXRfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJdm9pZCBfX2lvbWVtICogY29uc3QgKmlvbWFwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2U7CisJaW50IGVycjsKKworCWVyciA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDEgPDwgSU9BVF9NTUlPX0JBUiwgRFJWX05BTUUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOworCWlmICghaW9tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwlpZiAoZXJyKQorCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CisJaWYgKGVycikKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkZXZpY2UgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRldmljZSksIEdGUF9LRVJORUwpOworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZGV2aWNlID0gYWxsb2NfaW9hdGRtYShwZGV2LCBpb21hcFtJT0FUX01NSU9fQkFSXSk7CisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXZpY2UpOworCisJZGV2aWNlLT52ZXJzaW9uID0gcmVhZGIoZGV2aWNlLT5yZWdfYmFzZSArIElPQVRfVkVSX09GRlNFVCk7CisJaWYgKGRldmljZS0+dmVyc2lvbiA9PSBJT0FUX1ZFUl8xXzIpCisJCWVyciA9IGlvYXQxX2RtYV9wcm9iZShkZXZpY2UsIGlvYXRfZGNhX2VuYWJsZWQpOworCWVsc2UgaWYgKGRldmljZS0+dmVyc2lvbiA9PSBJT0FUX1ZFUl8yXzApCisJCWVyciA9IGlvYXQyX2RtYV9wcm9iZShkZXZpY2UsIGlvYXRfZGNhX2VuYWJsZWQpOworCWVsc2UgaWYgKGRldmljZS0+dmVyc2lvbiA+PSBJT0FUX1ZFUl8zXzApCisJCWVyciA9IGlvYXQzX2RtYV9wcm9iZShkZXZpY2UsIGlvYXRfZGNhX2VuYWJsZWQpOworCWVsc2UKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiSW50ZWwoUikgSS9PQVQgRE1BIEVuZ2luZSBpbml0IGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaW9hdF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuOworCisJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVtb3ZpbmcgZG1hIGFuZCBkY2Egc2VydmljZXNcbiIpOworCWlmIChkZXZpY2UtPmRjYSkgeworCQl1bnJlZ2lzdGVyX2RjYV9wcm92aWRlcihkZXZpY2UtPmRjYSwgJnBkZXYtPmRldik7CisJCWZyZWVfZGNhX3Byb3ZpZGVyKGRldmljZS0+ZGNhKTsKKwkJZGV2aWNlLT5kY2EgPSBOVUxMOworCX0KKwlpb2F0X2RtYV9yZW1vdmUoZGV2aWNlKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW9hdF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCBlcnI7CisKKwlwcl9pbmZvKCIlczogSW50ZWwoUikgUXVpY2tEYXRhIFRlY2hub2xvZ3kgRHJpdmVyICVzXG4iLAorCQlEUlZfTkFNRSwgSU9BVF9ETUFfVkVSU0lPTik7CisKKwlpb2F0Ml9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJpb2F0MiIsIHNpemVvZihzdHJ1Y3QgaW9hdF9yaW5nX2VudCksCisJCQkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJaWYgKCFpb2F0Ml9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpb2F0X3BjaV9kcml2ZXIpOworCWlmIChlcnIpCisJCWttZW1fY2FjaGVfZGVzdHJveShpb2F0Ml9jYWNoZSk7CisKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQoaW9hdF9pbml0X21vZHVsZSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpb2F0X2V4aXRfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpb2F0X3BjaV9kcml2ZXIpOworCWttZW1fY2FjaGVfZGVzdHJveShpb2F0Ml9jYWNoZSk7Cit9Cittb2R1bGVfZXhpdChpb2F0X2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXRkbWFfcmVnaXN0ZXJzLmggYi9kcml2ZXJzL2RtYS9pb2F0L3JlZ2lzdGVycy5oCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIGRyaXZlcnMvZG1hL2lvYXRkbWFfcmVnaXN0ZXJzLmgKcmVuYW1lIHRvIGRyaXZlcnMvZG1hL2lvYXQvcmVnaXN0ZXJzLmgKaW5kZXggNDliYzI3Ny4uNjMwMzhlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9hdGRtYV9yZWdpc3RlcnMuaAorKysgYi9kcml2ZXJzL2RtYS9pb2F0L3JlZ2lzdGVycy5oCkBAIC02NCwxOCArNjQsMzcgQEAKIAogI2RlZmluZSBJT0FUX0RFVklDRV9TVEFUVVNfT0ZGU0VUCQkweDBFCS8qIDE2LWJpdCAqLwogI2RlZmluZSBJT0FUX0RFVklDRV9TVEFUVVNfREVHUkFERURfTU9ERQkweDAwMDEKKyNkZWZpbmUgSU9BVF9ERVZJQ0VfTU1JT19SRVNUUklDVEVECQkweDAwMDIKKyNkZWZpbmUgSU9BVF9ERVZJQ0VfTUVNT1JZX0JZUEFTUwkJMHgwMDA0CisjZGVmaW5lIElPQVRfREVWSUNFX0FERFJFU1NfUkVNQVBQSU5HCQkweDAwMDgKKworI2RlZmluZSBJT0FUX0RNQV9DQVBfT0ZGU0VUCQkJMHgxMAkvKiAzMi1iaXQgKi8KKyNkZWZpbmUgSU9BVF9DQVBfUEFHRV9CUkVBSwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSU9BVF9DQVBfQ1JDCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgSU9BVF9DQVBfU0tJUF9NQVJLRVIJCQkweDAwMDAwMDA0CisjZGVmaW5lIElPQVRfQ0FQX0RDQQkJCQkweDAwMDAwMDEwCisjZGVmaW5lIElPQVRfQ0FQX0NSQ19NT1ZFCQkJMHgwMDAwMDAyMAorI2RlZmluZSBJT0FUX0NBUF9GSUxMX0JMT0NLCQkJMHgwMDAwMDA0MAorI2RlZmluZSBJT0FUX0NBUF9BUElDCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgSU9BVF9DQVBfWE9SCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgSU9BVF9DQVBfUFEJCQkJMHgwMDAwMDIwMAogCiAjZGVmaW5lIElPQVRfQ0hBTk5FTF9NTUlPX1NJWkUJCQkweDgwCS8qIEVhY2ggQ2hhbm5lbCBNTUlPIHNwYWNlIGlzIHRoaXMgc2l6ZSAqLwogCiAvKiBETUEgQ2hhbm5lbCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgSU9BVF9DSEFOQ1RSTF9PRkZTRVQJCQkweDAwCS8qIDE2LWJpdCBDaGFubmVsIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSU9BVF9DSEFOQ1RSTF9DSEFOTkVMX1BSSU9SSVRZX01BU0sJMHhGMDAwCisjZGVmaW5lIElPQVQzX0NIQU5DVFJMX0NPTVBMX0RDQV9FTgkJMHgwMjAwCiAjZGVmaW5lIElPQVRfQ0hBTkNUUkxfQ0hBTk5FTF9JTl9VU0UJCTB4MDEwMAogI2RlZmluZSBJT0FUX0NIQU5DVFJMX0RFU0NSSVBUT1JfQUREUl9TTk9PUF9DT05UUk9MCTB4MDAyMAogI2RlZmluZSBJT0FUX0NIQU5DVFJMX0VSUl9JTlRfRU4JCTB4MDAxMAogI2RlZmluZSBJT0FUX0NIQU5DVFJMX0FOWV9FUlJfQUJPUlRfRU4JCTB4MDAwOAogI2RlZmluZSBJT0FUX0NIQU5DVFJMX0VSUl9DT01QTEVUSU9OX0VOCQkweDAwMDQKLSNkZWZpbmUgSU9BVF9DSEFOQ1RSTF9JTlRfRElTQUJMRQkJMHgwMDAxCisjZGVmaW5lIElPQVRfQ0hBTkNUUkxfSU5UX1JFQVJNCQkJMHgwMDAxCisjZGVmaW5lIElPQVRfQ0hBTkNUUkxfUlVOCQkJKElPQVRfQ0hBTkNUUkxfSU5UX1JFQVJNIHxcCisJCQkJCQkgSU9BVF9DSEFOQ1RSTF9FUlJfQ09NUExFVElPTl9FTiB8XAorCQkJCQkJIElPQVRfQ0hBTkNUUkxfQU5ZX0VSUl9BQk9SVF9FTiB8XAorCQkJCQkJIElPQVRfQ0hBTkNUUkxfRVJSX0lOVF9FTikKIAogI2RlZmluZSBJT0FUX0RNQV9DT01QX09GRlNFVAkJCTB4MDIJLyogMTYtYml0IERNQSBjaGFubmVsIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgSU9BVF9ETUFfQ09NUF9WMQkJCTB4MDAwMQkvKiBDb21wYXRpYmlsaXR5IHdpdGggRE1BIHZlcnNpb24gMSAqLwpAQCAtOTQsMTQgKzExMywxNCBAQAogI2RlZmluZSBJT0FUMl9DSEFOU1RTX09GRlNFVF9ISUdICTB4MEMKICNkZWZpbmUgSU9BVF9DSEFOU1RTX09GRlNFVF9ISUdIKHZlcikJCSgodmVyKSA8IElPQVRfVkVSXzJfMCBcCiAJCQkJCQk/IElPQVQxX0NIQU5TVFNfT0ZGU0VUX0hJR0ggOiBJT0FUMl9DSEFOU1RTX09GRlNFVF9ISUdIKQotI2RlZmluZSBJT0FUX0NIQU5TVFNfQ09NUExFVEVEX0RFU0NSSVBUT1JfQUREUgl+MHgzRgotI2RlZmluZSBJT0FUX0NIQU5TVFNfU09GVF9FUlIJCQkweDAwMDAwMDAwMDAwMDAwMTAKLSNkZWZpbmUgSU9BVF9DSEFOU1RTX1VOQUZGSUxJQVRFRF9FUlIJCTB4MDAwMDAwMDAwMDAwMDAwOAotI2RlZmluZSBJT0FUX0NIQU5TVFNfRE1BX1RSQU5TRkVSX1NUQVRVUwkweDAwMDAwMDAwMDAwMDAwMDcKLSNkZWZpbmUgSU9BVF9DSEFOU1RTX0RNQV9UUkFOU0ZFUl9TVEFUVVNfQUNUSVZFCTB4MAotI2RlZmluZSBJT0FUX0NIQU5TVFNfRE1BX1RSQU5TRkVSX1NUQVRVU19ET05FCTB4MQotI2RlZmluZSBJT0FUX0NIQU5TVFNfRE1BX1RSQU5TRkVSX1NUQVRVU19TVVNQRU5ERUQJMHgyCi0jZGVmaW5lIElPQVRfQ0hBTlNUU19ETUFfVFJBTlNGRVJfU1RBVFVTX0hBTFRFRAkweDMKKyNkZWZpbmUgSU9BVF9DSEFOU1RTX0NPTVBMRVRFRF9ERVNDUklQVE9SX0FERFIJKH4weDNmVUxMKQorI2RlZmluZSBJT0FUX0NIQU5TVFNfU09GVF9FUlIJCQkweDEwVUxMCisjZGVmaW5lIElPQVRfQ0hBTlNUU19VTkFGRklMSUFURURfRVJSCQkweDhVTEwKKyNkZWZpbmUgSU9BVF9DSEFOU1RTX1NUQVRVUwkweDdVTEwKKyNkZWZpbmUgSU9BVF9DSEFOU1RTX0FDVElWRQkweDAKKyNkZWZpbmUgSU9BVF9DSEFOU1RTX0RPTkUJMHgxCisjZGVmaW5lIElPQVRfQ0hBTlNUU19TVVNQRU5ERUQJMHgyCisjZGVmaW5lIElPQVRfQ0hBTlNUU19IQUxURUQJMHgzCiAKIAogCkBAIC0yMDQsMjIgKzIyMywyNyBAQAogI2RlZmluZSBJT0FUX0NEQVJfT0ZGU0VUX0hJR0gJCQkweDI0CiAKICNkZWZpbmUgSU9BVF9DSEFORVJSX09GRlNFVAkJCTB4MjgJLyogMzItYml0IENoYW5uZWwgRXJyb3IgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSU9BVF9DSEFORVJSX0RNQV9UUkFOU0ZFUl9TUkNfQUREUl9FUlIJMHgwMDAxCi0jZGVmaW5lIElPQVRfQ0hBTkVSUl9ETUFfVFJBTlNGRVJfREVTVF9BRERSX0VSUgkweDAwMDIKLSNkZWZpbmUgSU9BVF9DSEFORVJSX05FWFRfREVTQ1JJUFRPUl9BRERSX0VSUgkweDAwMDQKLSNkZWZpbmUgSU9BVF9DSEFORVJSX05FWFRfREVTQ1JJUFRPUl9BTElHTk1FTlRfRVJSCTB4MDAwOAorI2RlZmluZSBJT0FUX0NIQU5FUlJfU1JDX0FERFJfRVJSCTB4MDAwMQorI2RlZmluZSBJT0FUX0NIQU5FUlJfREVTVF9BRERSX0VSUgkweDAwMDIKKyNkZWZpbmUgSU9BVF9DSEFORVJSX05FWFRfQUREUl9FUlIJMHgwMDA0CisjZGVmaW5lIElPQVRfQ0hBTkVSUl9ORVhUX0RFU0NfQUxJR05fRVJSCTB4MDAwOAogI2RlZmluZSBJT0FUX0NIQU5FUlJfQ0hBSU5fQUREUl9WQUxVRV9FUlIJMHgwMDEwCiAjZGVmaW5lIElPQVRfQ0hBTkVSUl9DSEFOQ01EX0VSUgkJMHgwMDIwCiAjZGVmaW5lIElPQVRfQ0hBTkVSUl9DSElQU0VUX1VOQ09SUkVDVEFCTEVfREFUQV9JTlRFR1JJVFlfRVJSCTB4MDA0MAogI2RlZmluZSBJT0FUX0NIQU5FUlJfRE1BX1VOQ09SUkVDVEFCTEVfREFUQV9JTlRFR1JJVFlfRVJSCTB4MDA4MAogI2RlZmluZSBJT0FUX0NIQU5FUlJfUkVBRF9EQVRBX0VSUgkJMHgwMTAwCiAjZGVmaW5lIElPQVRfQ0hBTkVSUl9XUklURV9EQVRBX0VSUgkJMHgwMjAwCi0jZGVmaW5lIElPQVRfQ0hBTkVSUl9ERVNDUklQVE9SX0NPTlRST0xfRVJSCTB4MDQwMAotI2RlZmluZSBJT0FUX0NIQU5FUlJfREVTQ1JJUFRPUl9MRU5HVEhfRVJSCTB4MDgwMAorI2RlZmluZSBJT0FUX0NIQU5FUlJfQ09OVFJPTF9FUlIJMHgwNDAwCisjZGVmaW5lIElPQVRfQ0hBTkVSUl9MRU5HVEhfRVJSCTB4MDgwMAogI2RlZmluZSBJT0FUX0NIQU5FUlJfQ09NUExFVElPTl9BRERSX0VSUgkweDEwMDAKICNkZWZpbmUgSU9BVF9DSEFORVJSX0lOVF9DT05GSUdVUkFUSU9OX0VSUgkweDIwMDAKICNkZWZpbmUgSU9BVF9DSEFORVJSX1NPRlRfRVJSCQkJMHg0MDAwCiAjZGVmaW5lIElPQVRfQ0hBTkVSUl9VTkFGRklMSUFURURfRVJSCQkweDgwMDAKKyNkZWZpbmUgSU9BVF9DSEFORVJSX1hPUl9QX09SX0NSQ19FUlIJCTB4MTAwMDAKKyNkZWZpbmUgSU9BVF9DSEFORVJSX1hPUl9RX0VSUgkJCTB4MjAwMDAKKyNkZWZpbmUgSU9BVF9DSEFORVJSX0RFU0NSSVBUT1JfQ09VTlRfRVJSCTB4NDAwMDAKKworI2RlZmluZSBJT0FUX0NIQU5FUlJfSEFORExFX01BU0sgKElPQVRfQ0hBTkVSUl9YT1JfUF9PUl9DUkNfRVJSIHwgSU9BVF9DSEFORVJSX1hPUl9RX0VSUikKIAogI2RlZmluZSBJT0FUX0NIQU5FUlJfTUFTS19PRkZTRVQJCTB4MkMJLyogMzItYml0IENoYW5uZWwgRXJyb3IgUmVnaXN0ZXIgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdF9kbWEuYyBiL2RyaXZlcnMvZG1hL2lvYXRfZG1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDBmYzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9kbWEvaW9hdF9kbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NDEgKzAsMCBAQAotLyoKLSAqIEludGVsIEkvT0FUIERNQSBMaW51eCBkcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDA0IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KLSAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCi0gKgotICovCi0KLS8qCi0gKiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbiBJbnRlbCBJL09BVCBETUEgZW5naW5lLCB3aGljaCBkb2VzIGFzeW5jaHJvbm91cwotICogY29weSBvcGVyYXRpb25zLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2k3MzAwX2lkbGUuaD4KLSNpbmNsdWRlICJpb2F0ZG1hLmgiCi0jaW5jbHVkZSAiaW9hdGRtYV9yZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJpb2F0ZG1hX2h3LmgiCi0KLSNkZWZpbmUgdG9faW9hdF9jaGFuKGNoYW4pIGNvbnRhaW5lcl9vZihjaGFuLCBzdHJ1Y3QgaW9hdF9kbWFfY2hhbiwgY29tbW9uKQotI2RlZmluZSB0b19pb2F0ZG1hX2RldmljZShkZXYpIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpb2F0ZG1hX2RldmljZSwgY29tbW9uKQotI2RlZmluZSB0b19pb2F0X2Rlc2MobGgpIGNvbnRhaW5lcl9vZihsaCwgc3RydWN0IGlvYXRfZGVzY19zdywgbm9kZSkKLSNkZWZpbmUgdHhfdG9faW9hdF9kZXNjKHR4KSBjb250YWluZXJfb2YodHgsIHN0cnVjdCBpb2F0X2Rlc2Nfc3csIGFzeW5jX3R4KQotCi0jZGVmaW5lIGNoYW5fbnVtKGNoKSAoKGludCkoKGNoKS0+cmVnX2Jhc2UgLSAoY2gpLT5kZXZpY2UtPnJlZ19iYXNlKSAvIDB4ODApCi1zdGF0aWMgaW50IGlvYXRfcGVuZGluZ19sZXZlbCA9IDQ7Ci1tb2R1bGVfcGFyYW0oaW9hdF9wZW5kaW5nX2xldmVsLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpb2F0X3BlbmRpbmdfbGV2ZWwsCi0JCSAiaGlnaC13YXRlciBtYXJrIGZvciBwdXNoaW5nIGlvYXQgZGVzY3JpcHRvcnMgKGRlZmF1bHQ6IDQpIik7Ci0KLSNkZWZpbmUgUkVTRVRfREVMQVkgIG1zZWNzX3RvX2ppZmZpZXMoMTAwKQotI2RlZmluZSBXQVRDSERPR19ERUxBWSAgcm91bmRfamlmZmllcyhtc2Vjc190b19qaWZmaWVzKDIwMDApKQotc3RhdGljIHZvaWQgaW9hdF9kbWFfY2hhbl9yZXNldF9wYXJ0MihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotc3RhdGljIHZvaWQgaW9hdF9kbWFfY2hhbl93YXRjaGRvZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotCi0vKgotICogd29ya2Fyb3VuZCBmb3IgSU9BVCB2ZXIuMy4wIG51bGwgZGVzY3JpcHRvciBpc3N1ZQotICogKGNoYW5uZWwgcmV0dXJucyBlcnJvciB3aGVuIHNpemUgaXMgMCkKLSAqLwotI2RlZmluZSBOVUxMX0RFU0NfQlVGRkVSX1NJWkUgMQotCi0vKiBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIGlvYXRfZG1hX3N0YXJ0X251bGxfZGVzYyhzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuKTsKLXN0YXRpYyB2b2lkIGlvYXRfZG1hX21lbWNweV9jbGVhbnVwKHN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4pOwotCi1zdGF0aWMgc3RydWN0IGlvYXRfZGVzY19zdyAqCi1pb2F0MV9kbWFfZ2V0X25leHRfZGVzY3JpcHRvcihzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuKTsKLXN0YXRpYyBzdHJ1Y3QgaW9hdF9kZXNjX3N3ICoKLWlvYXQyX2RtYV9nZXRfbmV4dF9kZXNjcmlwdG9yKHN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4pOwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2xvb2t1cF9jaGFuX2J5X2luZGV4KAotCQkJCQkJc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UsCi0JCQkJCQlpbnQgaW5kZXgpCi17Ci0JcmV0dXJuIGRldmljZS0+aWR4W2luZGV4XTsKLX0KLQotLyoqCi0gKiBpb2F0X2RtYV9kb19pbnRlcnJ1cHQgLSBoYW5kbGVyIHVzZWQgZm9yIHNpbmdsZSB2ZWN0b3IgaW50ZXJydXB0IG1vZGUKLSAqIEBpcnE6IGludGVycnVwdCBpZAotICogQGRhdGE6IGludGVycnVwdCBkYXRhCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpb2F0X2RtYV9kb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmluc3RhbmNlID0gZGF0YTsKLQlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuOwotCXVuc2lnbmVkIGxvbmcgYXR0bnN0YXR1czsKLQlpbnQgYml0OwotCXU4IGludHJjdHJsOwotCi0JaW50cmN0cmwgPSByZWFkYihpbnN0YW5jZS0+cmVnX2Jhc2UgKyBJT0FUX0lOVFJDVFJMX09GRlNFVCk7Ci0KLQlpZiAoIShpbnRyY3RybCAmIElPQVRfSU5UUkNUUkxfTUFTVEVSX0lOVF9FTikpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCWlmICghKGludHJjdHJsICYgSU9BVF9JTlRSQ1RSTF9JTlRfU1RBVFVTKSkgewotCQl3cml0ZWIoaW50cmN0cmwsIGluc3RhbmNlLT5yZWdfYmFzZSArIElPQVRfSU5UUkNUUkxfT0ZGU0VUKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCWF0dG5zdGF0dXMgPSByZWFkbChpbnN0YW5jZS0+cmVnX2Jhc2UgKyBJT0FUX0FUVE5TVEFUVVNfT0ZGU0VUKTsKLQlmb3JfZWFjaF9iaXQoYml0LCAmYXR0bnN0YXR1cywgQklUU19QRVJfTE9ORykgewotCQlpb2F0X2NoYW4gPSBpb2F0X2xvb2t1cF9jaGFuX2J5X2luZGV4KGluc3RhbmNlLCBiaXQpOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZpb2F0X2NoYW4tPmNsZWFudXBfdGFzayk7Ci0JfQotCi0Jd3JpdGViKGludHJjdHJsLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyBJT0FUX0lOVFJDVFJMX09GRlNFVCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGlvYXRfZG1hX2RvX2ludGVycnVwdF9tc2l4IC0gaGFuZGxlciB1c2VkIGZvciB2ZWN0b3ItcGVyLWNoYW5uZWwgaW50ZXJydXB0IG1vZGUKLSAqIEBpcnE6IGludGVycnVwdCBpZAotICogQGRhdGE6IGludGVycnVwdCBkYXRhCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpb2F0X2RtYV9kb19pbnRlcnJ1cHRfbXNpeChpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4gPSBkYXRhOwotCi0JdGFza2xldF9zY2hlZHVsZSgmaW9hdF9jaGFuLT5jbGVhbnVwX3Rhc2spOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgdm9pZCBpb2F0X2RtYV9jbGVhbnVwX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotLyoqCi0gKiBpb2F0X2RtYV9lbnVtZXJhdGVfY2hhbm5lbHMgLSBmaW5kIGFuZCBpbml0aWFsaXplIHRoZSBkZXZpY2UncyBjaGFubmVscwotICogQGRldmljZTogdGhlIGRldmljZSB0byBiZSBlbnVtZXJhdGVkCi0gKi8KLXN0YXRpYyBpbnQgaW9hdF9kbWFfZW51bWVyYXRlX2NoYW5uZWxzKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKQotewotCXU4IHhmZXJjYXBfc2NhbGU7Ci0JdTMyIHhmZXJjYXA7Ci0JaW50IGk7Ci0Jc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbjsKLQotCS8qCi0JICogSU9BVCB2ZXIuMyB3b3JrYXJvdW5kcwotCSAqLwotCWlmIChkZXZpY2UtPnZlcnNpb24gPT0gSU9BVF9WRVJfM18wKSB7Ci0JCXUzMiBjaGFuX2Vycl9tYXNrOwotCQl1MTYgZGV2X2lkOwotCQl1MzIgZG1hdW5jZXJyc3RzOwotCi0JCS8qCi0JCSAqIFdyaXRlIENIQU5FUlJNU0tfSU5UIHdpdGggM0UwN2ggdG8gbWFzayBvdXQgdGhlIGVycm9ycwotCQkgKiB0aGF0IGNhbiBjYXVzZSBzdGFiaWxpdHkgaXNzdWVzIGZvciBJT0FUIHZlci4zCi0JCSAqLwotCQljaGFuX2Vycl9tYXNrID0gMHgzRTA3OwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldmljZS0+cGRldiwKLQkJCUlPQVRfUENJX0NIQU5FUlJNQVNLX0lOVF9PRkZTRVQsCi0JCQljaGFuX2Vycl9tYXNrKTsKLQotCQkvKgotCQkgKiBDbGVhciBETUFVTkNFUlJTVFMgQ2ZnLVJlZyBQYXJpdHkgRXJyb3Igc3RhdHVzIGJpdAotCQkgKiAod29ya2Fyb3VuZCBmb3Igc3B1cmlvdXMgY29uZmlnIHBhcml0eSBlcnJvciBhZnRlciByZXN0YXJ0KQotCQkgKi8KLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2aWNlLT5wZGV2LAotCQkJSU9BVF9QQ0lfREVWSUNFX0lEX09GRlNFVCwKLQkJCSZkZXZfaWQpOwotCQlpZiAoZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9UQkcwKSB7Ci0JCQlkbWF1bmNlcnJzdHMgPSAweDEwOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXZpY2UtPnBkZXYsCi0JCQkJSU9BVF9QQ0lfRE1BVU5DRVJSU1RTX09GRlNFVCwKLQkJCQlkbWF1bmNlcnJzdHMpOwotCQl9Ci0JfQotCi0JZGV2aWNlLT5jb21tb24uY2hhbmNudCA9IHJlYWRiKGRldmljZS0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5DTlRfT0ZGU0VUKTsKLQl4ZmVyY2FwX3NjYWxlID0gcmVhZGIoZGV2aWNlLT5yZWdfYmFzZSArIElPQVRfWEZFUkNBUF9PRkZTRVQpOwotCXhmZXJjYXAgPSAoeGZlcmNhcF9zY2FsZSA9PSAwID8gLTEgOiAoMVVMIDw8IHhmZXJjYXBfc2NhbGUpKTsKLQotI2lmZGVmICBDT05GSUdfSTczMDBfSURMRV9JT0FUX0NIQU5ORUwKLQlpZiAoaTczMDBfaWRsZV9wbGF0Zm9ybV9wcm9iZShOVUxMLCBOVUxMLCAxKSA9PSAwKSB7Ci0JCWRldmljZS0+Y29tbW9uLmNoYW5jbnQtLTsKLQl9Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5jb21tb24uY2hhbmNudDsgaSsrKSB7Ci0JCWlvYXRfY2hhbiA9IGt6YWxsb2Moc2l6ZW9mKCppb2F0X2NoYW4pLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFpb2F0X2NoYW4pIHsKLQkJCWRldmljZS0+Y29tbW9uLmNoYW5jbnQgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpb2F0X2NoYW4tPmRldmljZSA9IGRldmljZTsKLQkJaW9hdF9jaGFuLT5yZWdfYmFzZSA9IGRldmljZS0+cmVnX2Jhc2UgKyAoMHg4MCAqIChpICsgMSkpOwotCQlpb2F0X2NoYW4tPnhmZXJjYXAgPSB4ZmVyY2FwOwotCQlpb2F0X2NoYW4tPmRlc2Njb3VudCA9IDA7Ci0JCUlOSVRfREVMQVlFRF9XT1JLKCZpb2F0X2NoYW4tPndvcmssIGlvYXRfZG1hX2NoYW5fcmVzZXRfcGFydDIpOwotCQlpZiAoaW9hdF9jaGFuLT5kZXZpY2UtPnZlcnNpb24gPT0gSU9BVF9WRVJfMl8wKQotCQkJd3JpdGVsKElPQVRfRENBQ1RSTF9DTVBMX1dSSVRFX0VOQUJMRSB8Ci0JCQkgICAgICAgSU9BVF9ETUFfRENBX0FOWV9DUFUsCi0JCQkgICAgICAgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfRENBQ1RSTF9PRkZTRVQpOwotCQllbHNlIGlmIChpb2F0X2NoYW4tPmRldmljZS0+dmVyc2lvbiA9PSBJT0FUX1ZFUl8zXzApCi0JCQl3cml0ZWwoSU9BVF9ETUFfRENBX0FOWV9DUFUsCi0JCQkgICAgICAgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfRENBQ1RSTF9PRkZTRVQpOwotCQlzcGluX2xvY2tfaW5pdCgmaW9hdF9jaGFuLT5jbGVhbnVwX2xvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmaW9hdF9jaGFuLT5mcmVlX2Rlc2MpOwotCQlJTklUX0xJU1RfSEVBRCgmaW9hdF9jaGFuLT51c2VkX2Rlc2MpOwotCQkvKiBUaGlzIHNob3VsZCBiZSBtYWRlIGNvbW1vbiBzb21ld2hlcmUgaW4gZG1hZW5naW5lLmMgKi8KLQkJaW9hdF9jaGFuLT5jb21tb24uZGV2aWNlID0gJmRldmljZS0+Y29tbW9uOwotCQlsaXN0X2FkZF90YWlsKCZpb2F0X2NoYW4tPmNvbW1vbi5kZXZpY2Vfbm9kZSwKLQkJCSAgICAgICZkZXZpY2UtPmNvbW1vbi5jaGFubmVscyk7Ci0JCWRldmljZS0+aWR4W2ldID0gaW9hdF9jaGFuOwotCQl0YXNrbGV0X2luaXQoJmlvYXRfY2hhbi0+Y2xlYW51cF90YXNrLAotCQkJICAgICBpb2F0X2RtYV9jbGVhbnVwX3Rhc2tsZXQsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nKSBpb2F0X2NoYW4pOwotCQl0YXNrbGV0X2Rpc2FibGUoJmlvYXRfY2hhbi0+Y2xlYW51cF90YXNrKTsKLQl9Ci0JcmV0dXJuIGRldmljZS0+Y29tbW9uLmNoYW5jbnQ7Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfbWVtY3B5X2lzc3VlX3BlbmRpbmcgLSBwdXNoIHBvdGVudGlhbGx5IHVucmVjb2duaXplZCBhcHBlbmRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyB0byBodwotICogQGNoYW46IERNQSBjaGFubmVsIGhhbmRsZQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb2F0MV9kbWFfbWVtY3B5X2lzc3VlX3BlbmRpbmcoCi0JCQkJCQlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuKQotewotCWlvYXRfY2hhbi0+cGVuZGluZyA9IDA7Ci0Jd3JpdGViKElPQVRfQ0hBTkNNRF9BUFBFTkQsIGlvYXRfY2hhbi0+cmVnX2Jhc2UgKyBJT0FUMV9DSEFOQ01EX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvYXQxX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCi17Ci0Jc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbiA9IHRvX2lvYXRfY2hhbihjaGFuKTsKLQotCWlmIChpb2F0X2NoYW4tPnBlbmRpbmcgPiAwKSB7Ci0JCXNwaW5fbG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCQlfX2lvYXQxX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZyhpb2F0X2NoYW4pOwotCQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9faW9hdDJfZG1hX21lbWNweV9pc3N1ZV9wZW5kaW5nKAotCQkJCQkJc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbikKLXsKLQlpb2F0X2NoYW4tPnBlbmRpbmcgPSAwOwotCXdyaXRldyhpb2F0X2NoYW4tPmRtYWNvdW50LAotCSAgICAgICBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOX0RNQUNPVU5UX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvYXQyX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCi17Ci0Jc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbiA9IHRvX2lvYXRfY2hhbihjaGFuKTsKLQotCWlmIChpb2F0X2NoYW4tPnBlbmRpbmcgPiAwKSB7Ci0JCXNwaW5fbG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCQlfX2lvYXQyX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZyhpb2F0X2NoYW4pOwotCQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCX0KLX0KLQotCi0vKioKLSAqIGlvYXRfZG1hX2NoYW5fcmVzZXRfcGFydDIgLSByZWluaXQgdGhlIGNoYW5uZWwgYWZ0ZXIgYSByZXNldAotICovCi1zdGF0aWMgdm9pZCBpb2F0X2RtYV9jaGFuX3Jlc2V0X3BhcnQyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpb2F0X2RtYV9jaGFuLCB3b3JrLndvcmspOwotCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmRlc2M7Ci0KLQlzcGluX2xvY2tfYmgoJmlvYXRfY2hhbi0+Y2xlYW51cF9sb2NrKTsKLQlzcGluX2xvY2tfYmgoJmlvYXRfY2hhbi0+ZGVzY19sb2NrKTsKLQotCWlvYXRfY2hhbi0+Y29tcGxldGlvbl92aXJ0LT5sb3cgPSAwOwotCWlvYXRfY2hhbi0+Y29tcGxldGlvbl92aXJ0LT5oaWdoID0gMDsKLQlpb2F0X2NoYW4tPnBlbmRpbmcgPSAwOwotCi0JLyoKLQkgKiBjb3VudCB0aGUgZGVzY3JpcHRvcnMgd2FpdGluZywgYW5kIGJlIHN1cmUgdG8gZG8gaXQKLQkgKiByaWdodCBmb3IgYm90aCB0aGUgQ0IxIGxpbmUgYW5kIHRoZSBDQjIgcmluZwotCSAqLwotCWlvYXRfY2hhbi0+ZG1hY291bnQgPSAwOwotCWlmIChpb2F0X2NoYW4tPnVzZWRfZGVzYy5wcmV2KSB7Ci0JCWRlc2MgPSB0b19pb2F0X2Rlc2MoaW9hdF9jaGFuLT51c2VkX2Rlc2MucHJldik7Ci0JCWRvIHsKLQkJCWlvYXRfY2hhbi0+ZG1hY291bnQrKzsKLQkJCWRlc2MgPSB0b19pb2F0X2Rlc2MoZGVzYy0+bm9kZS5uZXh0KTsKLQkJfSB3aGlsZSAoJmRlc2MtPm5vZGUgIT0gaW9hdF9jaGFuLT51c2VkX2Rlc2MubmV4dCk7Ci0JfQotCi0JLyoKLQkgKiB3cml0ZSB0aGUgbmV3IHN0YXJ0aW5nIGRlc2NyaXB0b3IgYWRkcmVzcwotCSAqIHRoaXMgcHV0cyBjaGFubmVsIGVuZ2luZSBpbnRvIEFSTUVEIHN0YXRlCi0JICovCi0JZGVzYyA9IHRvX2lvYXRfZGVzYyhpb2F0X2NoYW4tPnVzZWRfZGVzYy5wcmV2KTsKLQlzd2l0Y2ggKGlvYXRfY2hhbi0+ZGV2aWNlLT52ZXJzaW9uKSB7Ci0JY2FzZSBJT0FUX1ZFUl8xXzI6Ci0JCXdyaXRlbCgoKHU2NCkgZGVzYy0+YXN5bmNfdHgucGh5cykgJiAweDAwMDAwMDAwRkZGRkZGRkYsCi0JCSAgICAgICBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVDFfQ0hBSU5BRERSX09GRlNFVF9MT1cpOwotCQl3cml0ZWwoKCh1NjQpIGRlc2MtPmFzeW5jX3R4LnBoeXMpID4+IDMyLAotCQkgICAgICAgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVQxX0NIQUlOQUREUl9PRkZTRVRfSElHSCk7Ci0KLQkJd3JpdGViKElPQVRfQ0hBTkNNRF9TVEFSVCwgaW9hdF9jaGFuLT5yZWdfYmFzZQotCQkJKyBJT0FUX0NIQU5DTURfT0ZGU0VUKGlvYXRfY2hhbi0+ZGV2aWNlLT52ZXJzaW9uKSk7Ci0JCWJyZWFrOwotCWNhc2UgSU9BVF9WRVJfMl8wOgotCQl3cml0ZWwoKCh1NjQpIGRlc2MtPmFzeW5jX3R4LnBoeXMpICYgMHgwMDAwMDAwMEZGRkZGRkZGLAotCQkgICAgICAgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVQyX0NIQUlOQUREUl9PRkZTRVRfTE9XKTsKLQkJd3JpdGVsKCgodTY0KSBkZXNjLT5hc3luY190eC5waHlzKSA+PiAzMiwKLQkJICAgICAgIGlvYXRfY2hhbi0+cmVnX2Jhc2UgKyBJT0FUMl9DSEFJTkFERFJfT0ZGU0VUX0hJR0gpOwotCi0JCS8qIHRlbGwgdGhlIGVuZ2luZSB0byBnbyB3aXRoIHdoYXQncyBsZWZ0IHRvIGJlIGRvbmUgKi8KLQkJd3JpdGV3KGlvYXRfY2hhbi0+ZG1hY291bnQsCi0JCSAgICAgICBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOX0RNQUNPVU5UX09GRlNFVCk7Ci0KLQkJYnJlYWs7Ci0JfQotCWRldl9lcnIoJmlvYXRfY2hhbi0+ZGV2aWNlLT5wZGV2LT5kZXYsCi0JCSJjaGFuJWQgcmVzZXQgLSAlZCBkZXNjcyB3YWl0aW5nLCAlZCB0b3RhbCBkZXNjXG4iLAotCQljaGFuX251bShpb2F0X2NoYW4pLCBpb2F0X2NoYW4tPmRtYWNvdW50LCBpb2F0X2NoYW4tPmRlc2Njb3VudCk7Ci0KLQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmNsZWFudXBfbG9jayk7Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfcmVzZXRfY2hhbm5lbCAtIHJlc3RhcnQgYSBjaGFubmVsCi0gKiBAaW9hdF9jaGFuOiBJT0FUIERNQSBjaGFubmVsIGhhbmRsZQotICovCi1zdGF0aWMgdm9pZCBpb2F0X2RtYV9yZXNldF9jaGFubmVsKHN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4pCi17Ci0JdTMyIGNoYW5zdHMsIGNoYW5lcnI7Ci0KLQlpZiAoIWlvYXRfY2hhbi0+dXNlZF9kZXNjLnByZXYpCi0JCXJldHVybjsKLQotCWNoYW5lcnIgPSByZWFkbChpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFORVJSX09GRlNFVCk7Ci0JY2hhbnN0cyA9IChpb2F0X2NoYW4tPmNvbXBsZXRpb25fdmlydC0+bG93Ci0JCQkJCSYgSU9BVF9DSEFOU1RTX0RNQV9UUkFOU0ZFUl9TVEFUVVMpOwotCWlmIChjaGFuZXJyKSB7Ci0JCWRldl9lcnIoJmlvYXRfY2hhbi0+ZGV2aWNlLT5wZGV2LT5kZXYsCi0JCQkiY2hhbiVkLCBDSEFOU1RTID0gMHglMDh4IENIQU5FUlIgPSAweCUwNHgsIGNsZWFyaW5nXG4iLAotCQkJY2hhbl9udW0oaW9hdF9jaGFuKSwgY2hhbnN0cywgY2hhbmVycik7Ci0JCXdyaXRlbChjaGFuZXJyLCBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFORVJSX09GRlNFVCk7Ci0JfQotCi0JLyoKLQkgKiB3aGFjayBpdCB1cHNpZGUgdGhlIGhlYWQgd2l0aCBhIHJlc2V0Ci0JICogYW5kIHdhaXQgZm9yIHRoaW5ncyB0byBzZXR0bGUgb3V0LgotCSAqIGZvcmNlIHRoZSBwZW5kaW5nIGNvdW50IHRvIGEgcmVhbGx5IGJpZyBuZWdhdGl2ZQotCSAqIHRvIG1ha2Ugc3VyZSBubyBvbmUgZm9yY2VzIGFuIGlzc3VlX3BlbmRpbmcKLQkgKiB3aGlsZSB3ZSdyZSB3YWl0aW5nLgotCSAqLwotCi0Jc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0JaW9hdF9jaGFuLT5wZW5kaW5nID0gSU5UX01JTjsKLQl3cml0ZWIoSU9BVF9DSEFOQ01EX1JFU0VULAotCSAgICAgICBpb2F0X2NoYW4tPnJlZ19iYXNlCi0JICAgICAgICsgSU9BVF9DSEFOQ01EX09GRlNFVChpb2F0X2NoYW4tPmRldmljZS0+dmVyc2lvbikpOwotCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0KLQkvKiBzY2hlZHVsZSB0aGUgMm5kIGhhbGYgaW5zdGVhZCBvZiBzbGVlcGluZyBhIGxvbmcgdGltZSAqLwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW9hdF9jaGFuLT53b3JrLCBSRVNFVF9ERUxBWSk7Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfY2hhbl93YXRjaGRvZyAtIHdhdGNoIGZvciBzdHVjayBjaGFubmVscwotICovCi1zdGF0aWMgdm9pZCBpb2F0X2RtYV9jaGFuX3dhdGNoZG9nKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UsIHdvcmsud29yayk7Ci0Jc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbjsKLQlpbnQgaTsKLQotCXVuaW9uIHsKLQkJdTY0IGZ1bGw7Ci0JCXN0cnVjdCB7Ci0JCQl1MzIgbG93OwotCQkJdTMyIGhpZ2g7Ci0JCX07Ci0JfSBjb21wbGV0aW9uX2h3OwotCXVuc2lnbmVkIGxvbmcgY29tcGxfZGVzY19hZGRyX2h3OwotCi0JZm9yIChpID0gMDsgaSA8IGRldmljZS0+Y29tbW9uLmNoYW5jbnQ7IGkrKykgewotCQlpb2F0X2NoYW4gPSBpb2F0X2xvb2t1cF9jaGFuX2J5X2luZGV4KGRldmljZSwgaSk7Ci0KLQkJaWYgKGlvYXRfY2hhbi0+ZGV2aWNlLT52ZXJzaW9uID09IElPQVRfVkVSXzFfMgotCQkJLyogaGF2ZSB3ZSBzdGFydGVkIHByb2Nlc3NpbmcgYW55dGhpbmcgeWV0ICovCi0JCSAgICAmJiBpb2F0X2NoYW4tPmxhc3RfY29tcGxldGlvbgotCQkJLyogaGF2ZSB3ZSBjb21wbGV0ZWQgYW55IHNpbmNlIGxhc3Qgd2F0Y2hkb2cgY3ljbGU/ICovCi0JCSAgICAmJiAoaW9hdF9jaGFuLT5sYXN0X2NvbXBsZXRpb24gPT0KLQkJCQlpb2F0X2NoYW4tPndhdGNoZG9nX2NvbXBsZXRpb24pCi0JCQkvKiBoYXMgVENQIHN0dWNrIG9uIG9uZSBjb29raWUgc2luY2UgbGFzdCB3YXRjaGRvZz8gKi8KLQkJICAgICYmIChpb2F0X2NoYW4tPndhdGNoZG9nX3RjcF9jb29raWUgPT0KLQkJCQlpb2F0X2NoYW4tPndhdGNoZG9nX2xhc3RfdGNwX2Nvb2tpZSkKLQkJICAgICYmIChpb2F0X2NoYW4tPndhdGNoZG9nX3RjcF9jb29raWUgIT0KLQkJCQlpb2F0X2NoYW4tPmNvbXBsZXRlZF9jb29raWUpCi0JCQkvKiBpcyB0aGVyZSBzb21ldGhpbmcgaW4gdGhlIGNoYWluIHRvIGJlIHByb2Nlc3NlZD8gKi8KLQkJCS8qIENCMSBjaGFpbiBhbHdheXMgaGFzIGF0IGxlYXN0IHRoZSBsYXN0IG9uZSBwcm9jZXNzZWQgKi8KLQkJICAgICYmIChpb2F0X2NoYW4tPnVzZWRfZGVzYy5wcmV2ICE9IGlvYXRfY2hhbi0+dXNlZF9kZXNjLm5leHQpCi0JCSAgICAmJiBpb2F0X2NoYW4tPnBlbmRpbmcgPT0gMCkgewotCi0JCQkvKgotCQkJICogY2hlY2sgQ0hBTlNUUyByZWdpc3RlciBmb3IgY29tcGxldGVkCi0JCQkgKiBkZXNjcmlwdG9yIGFkZHJlc3MuCi0JCQkgKiBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiBjb21wbGV0aW9uIHdyaXRlYmFjaywKLQkJCSAqIGl0IGlzIG5vdCB6ZXJvCi0JCQkgKiBhbmQgaXQgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3Qgd2F0Y2hkb2cKLQkJCSAqICAgICB3ZSBjYW4gYXNzdW1lIHRoYXQgY2hhbm5lbAotCQkJICogICAgIGlzIHN0aWxsIHdvcmtpbmcgY29ycmVjdGx5Ci0JCQkgKiAgICAgYW5kIHRoZSBwcm9ibGVtIGlzIGluIGNvbXBsZXRpb24gd3JpdGViYWNrLgotCQkJICogICAgIHVwZGF0ZSBjb21wbGV0aW9uIHdyaXRlYmFjawotCQkJICogICAgIHdpdGggYWN0dWFsIENIQU5TVFMgdmFsdWUKLQkJCSAqIGVsc2UKLQkJCSAqICAgICB0cnkgcmVzZXR0aW5nIHRoZSBjaGFubmVsCi0JCQkgKi8KLQotCQkJY29tcGxldGlvbl9ody5sb3cgPSByZWFkbChpb2F0X2NoYW4tPnJlZ19iYXNlICsKLQkJCQlJT0FUX0NIQU5TVFNfT0ZGU0VUX0xPVyhpb2F0X2NoYW4tPmRldmljZS0+dmVyc2lvbikpOwotCQkJY29tcGxldGlvbl9ody5oaWdoID0gcmVhZGwoaW9hdF9jaGFuLT5yZWdfYmFzZSArCi0JCQkJSU9BVF9DSEFOU1RTX09GRlNFVF9ISUdIKGlvYXRfY2hhbi0+ZGV2aWNlLT52ZXJzaW9uKSk7Ci0jaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCi0JCQljb21wbF9kZXNjX2FkZHJfaHcgPQotCQkJCWNvbXBsZXRpb25faHcuZnVsbAotCQkJCSYgSU9BVF9DSEFOU1RTX0NPTVBMRVRFRF9ERVNDUklQVE9SX0FERFI7Ci0jZWxzZQotCQkJY29tcGxfZGVzY19hZGRyX2h3ID0KLQkJCQljb21wbGV0aW9uX2h3LmxvdyAmIElPQVRfTE9XX0NPTVBMRVRJT05fTUFTSzsKLSNlbmRpZgotCi0JCQlpZiAoKGNvbXBsX2Rlc2NfYWRkcl9odyAhPSAwKQotCQkJICAgJiYgKGNvbXBsX2Rlc2NfYWRkcl9odyAhPSBpb2F0X2NoYW4tPndhdGNoZG9nX2NvbXBsZXRpb24pCi0JCQkgICAmJiAoY29tcGxfZGVzY19hZGRyX2h3ICE9IGlvYXRfY2hhbi0+bGFzdF9jb21wbF9kZXNjX2FkZHJfaHcpKSB7Ci0JCQkJaW9hdF9jaGFuLT5sYXN0X2NvbXBsX2Rlc2NfYWRkcl9odyA9IGNvbXBsX2Rlc2NfYWRkcl9odzsKLQkJCQlpb2F0X2NoYW4tPmNvbXBsZXRpb25fdmlydC0+bG93ID0gY29tcGxldGlvbl9ody5sb3c7Ci0JCQkJaW9hdF9jaGFuLT5jb21wbGV0aW9uX3ZpcnQtPmhpZ2ggPSBjb21wbGV0aW9uX2h3LmhpZ2g7Ci0JCQl9IGVsc2UgewotCQkJCWlvYXRfZG1hX3Jlc2V0X2NoYW5uZWwoaW9hdF9jaGFuKTsKLQkJCQlpb2F0X2NoYW4tPndhdGNoZG9nX2NvbXBsZXRpb24gPSAwOwotCQkJCWlvYXRfY2hhbi0+bGFzdF9jb21wbF9kZXNjX2FkZHJfaHcgPSAwOwotCQkJfQotCi0JCS8qCi0JCSAqIGZvciB2ZXJzaW9uIDIuMCBpZiB0aGVyZSBhcmUgZGVzY3JpcHRvcnMgeWV0IHRvIGJlIHByb2Nlc3NlZAotCQkgKiBhbmQgdGhlIGxhc3QgY29tcGxldGVkIGhhc24ndCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHdhdGNoZG9nCi0JCSAqICAgICAgaWYgdGhleSBoYXZlbid0IGhpdCB0aGUgcGVuZGluZyBsZXZlbAotCQkgKiAgICAgICAgICBpc3N1ZSB0aGUgcGVuZGluZyB0byBwdXNoIHRoZW0gdGhyb3VnaAotCQkgKiAgICAgIGVsc2UKLQkJICogICAgICAgICAgdHJ5IHJlc2V0dGluZyB0aGUgY2hhbm5lbAotCQkgKi8KLQkJfSBlbHNlIGlmIChpb2F0X2NoYW4tPmRldmljZS0+dmVyc2lvbiA9PSBJT0FUX1ZFUl8yXzAKLQkJICAgICYmIGlvYXRfY2hhbi0+dXNlZF9kZXNjLnByZXYKLQkJICAgICYmIGlvYXRfY2hhbi0+bGFzdF9jb21wbGV0aW9uCi0JCSAgICAmJiBpb2F0X2NoYW4tPmxhc3RfY29tcGxldGlvbiA9PSBpb2F0X2NoYW4tPndhdGNoZG9nX2NvbXBsZXRpb24pIHsKLQotCQkJaWYgKGlvYXRfY2hhbi0+cGVuZGluZyA8IGlvYXRfcGVuZGluZ19sZXZlbCkKLQkJCQlpb2F0Ml9kbWFfbWVtY3B5X2lzc3VlX3BlbmRpbmcoJmlvYXRfY2hhbi0+Y29tbW9uKTsKLQkJCWVsc2UgewotCQkJCWlvYXRfZG1hX3Jlc2V0X2NoYW5uZWwoaW9hdF9jaGFuKTsKLQkJCQlpb2F0X2NoYW4tPndhdGNoZG9nX2NvbXBsZXRpb24gPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJaW9hdF9jaGFuLT5sYXN0X2NvbXBsX2Rlc2NfYWRkcl9odyA9IDA7Ci0JCQlpb2F0X2NoYW4tPndhdGNoZG9nX2NvbXBsZXRpb24KLQkJCQkJPSBpb2F0X2NoYW4tPmxhc3RfY29tcGxldGlvbjsKLQkJfQotCi0JCWlvYXRfY2hhbi0+d2F0Y2hkb2dfbGFzdF90Y3BfY29va2llID0KLQkJCWlvYXRfY2hhbi0+d2F0Y2hkb2dfdGNwX2Nvb2tpZTsKLQl9Ci0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldmljZS0+d29yaywgV0FUQ0hET0dfREVMQVkpOwotfQotCi1zdGF0aWMgZG1hX2Nvb2tpZV90IGlvYXQxX3R4X3N1Ym1pdChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQotewotCXN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4gPSB0b19pb2F0X2NoYW4odHgtPmNoYW4pOwotCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmZpcnN0ID0gdHhfdG9faW9hdF9kZXNjKHR4KTsKLQlzdHJ1Y3QgaW9hdF9kZXNjX3N3ICpwcmV2LCAqbmV3OwotCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodzsKLQlkbWFfY29va2llX3QgY29va2llOwotCUxJU1RfSEVBRChuZXdfY2hhaW4pOwotCXUzMiBjb3B5OwotCXNpemVfdCBsZW47Ci0JZG1hX2FkZHJfdCBzcmMsIGRzdDsKLQl1bnNpZ25lZCBsb25nIG9yaWdfZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGRlc2NfY291bnQgPSAwOwotCi0JLyogc3JjIGFuZCBkZXN0IGFuZCBsZW4gYXJlIHN0b3JlZCBpbiB0aGUgaW5pdGlhbCBkZXNjcmlwdG9yICovCi0JbGVuID0gZmlyc3QtPmxlbjsKLQlzcmMgPSBmaXJzdC0+c3JjOwotCWRzdCA9IGZpcnN0LT5kc3Q7Ci0Jb3JpZ19mbGFncyA9IGZpcnN0LT5hc3luY190eC5mbGFnczsKLQluZXcgPSBmaXJzdDsKLQotCXNwaW5fbG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCXByZXYgPSB0b19pb2F0X2Rlc2MoaW9hdF9jaGFuLT51c2VkX2Rlc2MucHJldik7Ci0JcHJlZmV0Y2gocHJldi0+aHcpOwotCWRvIHsKLQkJY29weSA9IG1pbl90KHNpemVfdCwgbGVuLCBpb2F0X2NoYW4tPnhmZXJjYXApOwotCi0JCWFzeW5jX3R4X2FjaygmbmV3LT5hc3luY190eCk7Ci0KLQkJaHcgPSBuZXctPmh3OwotCQlody0+c2l6ZSA9IGNvcHk7Ci0JCWh3LT5jdGwgPSAwOwotCQlody0+c3JjX2FkZHIgPSBzcmM7Ci0JCWh3LT5kc3RfYWRkciA9IGRzdDsKLQkJaHctPm5leHQgPSAwOwotCi0JCS8qIGNoYWluIHRvZ2V0aGVyIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGxpc3QgZm9yIHRoZSBIVyAqLwotCQl3bWIoKTsKLQkJcHJldi0+aHctPm5leHQgPSAodTY0KSBuZXctPmFzeW5jX3R4LnBoeXM7Ci0KLQkJbGVuIC09IGNvcHk7Ci0JCWRzdCArPSBjb3B5OwotCQlzcmMgKz0gY29weTsKLQotCQlsaXN0X2FkZF90YWlsKCZuZXctPm5vZGUsICZuZXdfY2hhaW4pOwotCQlkZXNjX2NvdW50Kys7Ci0JCXByZXYgPSBuZXc7Ci0JfSB3aGlsZSAobGVuICYmIChuZXcgPSBpb2F0MV9kbWFfZ2V0X25leHRfZGVzY3JpcHRvcihpb2F0X2NoYW4pKSk7Ci0KLQlpZiAoIW5ldykgewotCQlkZXZfZXJyKCZpb2F0X2NoYW4tPmRldmljZS0+cGRldi0+ZGV2LAotCQkJInR4IHN1Ym1pdCBmYWlsZWRcbiIpOwotCQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlody0+Y3RsID0gSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfQ1BfU1RTOwotCWlmIChmaXJzdC0+YXN5bmNfdHguY2FsbGJhY2spIHsKLQkJaHctPmN0bCB8PSBJT0FUX0RNQV9ERVNDUklQVE9SX0NUTF9JTlRfR047Ci0JCWlmIChmaXJzdCAhPSBuZXcpIHsKLQkJCS8qIG1vdmUgY2FsbGJhY2sgaW50byB0byBsYXN0IGRlc2MgKi8KLQkJCW5ldy0+YXN5bmNfdHguY2FsbGJhY2sgPSBmaXJzdC0+YXN5bmNfdHguY2FsbGJhY2s7Ci0JCQluZXctPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtCi0JCQkJCT0gZmlyc3QtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtOwotCQkJZmlyc3QtPmFzeW5jX3R4LmNhbGxiYWNrID0gTlVMTDsKLQkJCWZpcnN0LT5hc3luY190eC5jYWxsYmFja19wYXJhbSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQluZXctPnR4X2NudCA9IGRlc2NfY291bnQ7Ci0JbmV3LT5hc3luY190eC5mbGFncyA9IG9yaWdfZmxhZ3M7IC8qIGNsaWVudCBpcyBpbiBjb250cm9sIG9mIHRoaXMgYWNrICovCi0KLQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgdmFsdWVzIGZvciB1c2UgaW4gbGF0ZXIgY2xlYW51cCAqLwotCWlmIChuZXcgIT0gZmlyc3QpIHsKLQkJbmV3LT5zcmMgPSBmaXJzdC0+c3JjOwotCQluZXctPmRzdCA9IGZpcnN0LT5kc3Q7Ci0JCW5ldy0+bGVuID0gZmlyc3QtPmxlbjsKLQl9Ci0KLQkvKiBjb29raWUgaW5jciBhbmQgYWRkaXRpb24gdG8gdXNlZF9saXN0IG11c3QgYmUgYXRvbWljICovCi0JY29va2llID0gaW9hdF9jaGFuLT5jb21tb24uY29va2llOwotCWNvb2tpZSsrOwotCWlmIChjb29raWUgPCAwKQotCQljb29raWUgPSAxOwotCWlvYXRfY2hhbi0+Y29tbW9uLmNvb2tpZSA9IG5ldy0+YXN5bmNfdHguY29va2llID0gY29va2llOwotCi0JLyogd3JpdGUgYWRkcmVzcyBpbnRvIE5leHREZXNjcmlwdG9yIGZpZWxkIG9mIGxhc3QgZGVzYyBpbiBjaGFpbiAqLwotCXRvX2lvYXRfZGVzYyhpb2F0X2NoYW4tPnVzZWRfZGVzYy5wcmV2KS0+aHctPm5leHQgPQotCQkJCQkJCWZpcnN0LT5hc3luY190eC5waHlzOwotCWxpc3Rfc3BsaWNlX3RhaWwoJm5ld19jaGFpbiwgJmlvYXRfY2hhbi0+dXNlZF9kZXNjKTsKLQotCWlvYXRfY2hhbi0+ZG1hY291bnQgKz0gZGVzY19jb3VudDsKLQlpb2F0X2NoYW4tPnBlbmRpbmcgKz0gZGVzY19jb3VudDsKLQlpZiAoaW9hdF9jaGFuLT5wZW5kaW5nID49IGlvYXRfcGVuZGluZ19sZXZlbCkKLQkJX19pb2F0MV9kbWFfbWVtY3B5X2lzc3VlX3BlbmRpbmcoaW9hdF9jaGFuKTsKLQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCi0JcmV0dXJuIGNvb2tpZTsKLX0KLQotc3RhdGljIGRtYV9jb29raWVfdCBpb2F0Ml90eF9zdWJtaXQoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKLXsKLQlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuID0gdG9faW9hdF9jaGFuKHR4LT5jaGFuKTsKLQlzdHJ1Y3QgaW9hdF9kZXNjX3N3ICpmaXJzdCA9IHR4X3RvX2lvYXRfZGVzYyh0eCk7Ci0Jc3RydWN0IGlvYXRfZGVzY19zdyAqbmV3OwotCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodzsKLQlkbWFfY29va2llX3QgY29va2llOwotCXUzMiBjb3B5OwotCXNpemVfdCBsZW47Ci0JZG1hX2FkZHJfdCBzcmMsIGRzdDsKLQl1bnNpZ25lZCBsb25nIG9yaWdfZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGRlc2NfY291bnQgPSAwOwotCi0JLyogc3JjIGFuZCBkZXN0IGFuZCBsZW4gYXJlIHN0b3JlZCBpbiB0aGUgaW5pdGlhbCBkZXNjcmlwdG9yICovCi0JbGVuID0gZmlyc3QtPmxlbjsKLQlzcmMgPSBmaXJzdC0+c3JjOwotCWRzdCA9IGZpcnN0LT5kc3Q7Ci0Jb3JpZ19mbGFncyA9IGZpcnN0LT5hc3luY190eC5mbGFnczsKLQluZXcgPSBmaXJzdDsKLQotCS8qCi0JICogaW9hdF9jaGFuLT5kZXNjX2xvY2sgaXMgc3RpbGwgaW4gZm9yY2UgaW4gdmVyc2lvbiAyIHBhdGgKLQkgKiBpdCBnZXRzIHVubG9ja2VkIGF0IGVuZCBvZiB0aGlzIGZ1bmN0aW9uCi0JICovCi0JZG8gewotCQljb3B5ID0gbWluX3Qoc2l6ZV90LCBsZW4sIGlvYXRfY2hhbi0+eGZlcmNhcCk7Ci0KLQkJYXN5bmNfdHhfYWNrKCZuZXctPmFzeW5jX3R4KTsKLQotCQlodyA9IG5ldy0+aHc7Ci0JCWh3LT5zaXplID0gY29weTsKLQkJaHctPmN0bCA9IDA7Ci0JCWh3LT5zcmNfYWRkciA9IHNyYzsKLQkJaHctPmRzdF9hZGRyID0gZHN0OwotCi0JCWxlbiAtPSBjb3B5OwotCQlkc3QgKz0gY29weTsKLQkJc3JjICs9IGNvcHk7Ci0JCWRlc2NfY291bnQrKzsKLQl9IHdoaWxlIChsZW4gJiYgKG5ldyA9IGlvYXQyX2RtYV9nZXRfbmV4dF9kZXNjcmlwdG9yKGlvYXRfY2hhbikpKTsKLQotCWlmICghbmV3KSB7Ci0JCWRldl9lcnIoJmlvYXRfY2hhbi0+ZGV2aWNlLT5wZGV2LT5kZXYsCi0JCQkidHggc3VibWl0IGZhaWxlZFxuIik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWh3LT5jdGwgfD0gSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfQ1BfU1RTOwotCWlmIChmaXJzdC0+YXN5bmNfdHguY2FsbGJhY2spIHsKLQkJaHctPmN0bCB8PSBJT0FUX0RNQV9ERVNDUklQVE9SX0NUTF9JTlRfR047Ci0JCWlmIChmaXJzdCAhPSBuZXcpIHsKLQkJCS8qIG1vdmUgY2FsbGJhY2sgaW50byB0byBsYXN0IGRlc2MgKi8KLQkJCW5ldy0+YXN5bmNfdHguY2FsbGJhY2sgPSBmaXJzdC0+YXN5bmNfdHguY2FsbGJhY2s7Ci0JCQluZXctPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtCi0JCQkJCT0gZmlyc3QtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtOwotCQkJZmlyc3QtPmFzeW5jX3R4LmNhbGxiYWNrID0gTlVMTDsKLQkJCWZpcnN0LT5hc3luY190eC5jYWxsYmFja19wYXJhbSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQluZXctPnR4X2NudCA9IGRlc2NfY291bnQ7Ci0JbmV3LT5hc3luY190eC5mbGFncyA9IG9yaWdfZmxhZ3M7IC8qIGNsaWVudCBpcyBpbiBjb250cm9sIG9mIHRoaXMgYWNrICovCi0KLQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgdmFsdWVzIGZvciB1c2UgaW4gbGF0ZXIgY2xlYW51cCAqLwotCWlmIChuZXcgIT0gZmlyc3QpIHsKLQkJbmV3LT5zcmMgPSBmaXJzdC0+c3JjOwotCQluZXctPmRzdCA9IGZpcnN0LT5kc3Q7Ci0JCW5ldy0+bGVuID0gZmlyc3QtPmxlbjsKLQl9Ci0KLQkvKiBjb29raWUgaW5jciBhbmQgYWRkaXRpb24gdG8gdXNlZF9saXN0IG11c3QgYmUgYXRvbWljICovCi0JY29va2llID0gaW9hdF9jaGFuLT5jb21tb24uY29va2llOwotCWNvb2tpZSsrOwotCWlmIChjb29raWUgPCAwKQotCQljb29raWUgPSAxOwotCWlvYXRfY2hhbi0+Y29tbW9uLmNvb2tpZSA9IG5ldy0+YXN5bmNfdHguY29va2llID0gY29va2llOwotCi0JaW9hdF9jaGFuLT5kbWFjb3VudCArPSBkZXNjX2NvdW50OwotCWlvYXRfY2hhbi0+cGVuZGluZyArPSBkZXNjX2NvdW50OwotCWlmIChpb2F0X2NoYW4tPnBlbmRpbmcgPj0gaW9hdF9wZW5kaW5nX2xldmVsKQotCQlfX2lvYXQyX2RtYV9tZW1jcHlfaXNzdWVfcGVuZGluZyhpb2F0X2NoYW4pOwotCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0KLQlyZXR1cm4gY29va2llOwotfQotCi0vKioKLSAqIGlvYXRfZG1hX2FsbG9jX2Rlc2NyaXB0b3IgLSBhbGxvY2F0ZSBhbmQgcmV0dXJuIGEgc3cgYW5kIGh3IGRlc2NyaXB0b3IgcGFpcgotICogQGlvYXRfY2hhbjogdGhlIGNoYW5uZWwgc3VwcGx5aW5nIHRoZSBtZW1vcnkgcG9vbCBmb3IgdGhlIGRlc2NyaXB0b3JzCi0gKiBAZmxhZ3M6IGFsbG9jYXRpb24gZmxhZ3MKLSAqLwotc3RhdGljIHN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmlvYXRfZG1hX2FsbG9jX2Rlc2NyaXB0b3IoCi0JCQkJCXN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4sCi0JCQkJCWdmcF90IGZsYWdzKQotewotCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpkZXNjOwotCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmRlc2Nfc3c7Ci0Jc3RydWN0IGlvYXRkbWFfZGV2aWNlICppb2F0ZG1hX2RldmljZTsKLQlkbWFfYWRkcl90IHBoeXM7Ci0KLQlpb2F0ZG1hX2RldmljZSA9IHRvX2lvYXRkbWFfZGV2aWNlKGlvYXRfY2hhbi0+Y29tbW9uLmRldmljZSk7Ci0JZGVzYyA9IHBjaV9wb29sX2FsbG9jKGlvYXRkbWFfZGV2aWNlLT5kbWFfcG9vbCwgZmxhZ3MsICZwaHlzKTsKLQlpZiAodW5saWtlbHkoIWRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQotCWRlc2Nfc3cgPSBremFsbG9jKHNpemVvZigqZGVzY19zdyksIGZsYWdzKTsKLQlpZiAodW5saWtlbHkoIWRlc2Nfc3cpKSB7Ci0JCXBjaV9wb29sX2ZyZWUoaW9hdGRtYV9kZXZpY2UtPmRtYV9wb29sLCBkZXNjLCBwaHlzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOwotCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmRlc2Nfc3ctPmFzeW5jX3R4LCAmaW9hdF9jaGFuLT5jb21tb24pOwotCXN3aXRjaCAoaW9hdF9jaGFuLT5kZXZpY2UtPnZlcnNpb24pIHsKLQljYXNlIElPQVRfVkVSXzFfMjoKLQkJZGVzY19zdy0+YXN5bmNfdHgudHhfc3VibWl0ID0gaW9hdDFfdHhfc3VibWl0OwotCQlicmVhazsKLQljYXNlIElPQVRfVkVSXzJfMDoKLQljYXNlIElPQVRfVkVSXzNfMDoKLQkJZGVzY19zdy0+YXN5bmNfdHgudHhfc3VibWl0ID0gaW9hdDJfdHhfc3VibWl0OwotCQlicmVhazsKLQl9Ci0KLQlkZXNjX3N3LT5odyA9IGRlc2M7Ci0JZGVzY19zdy0+YXN5bmNfdHgucGh5cyA9IHBoeXM7Ci0KLQlyZXR1cm4gZGVzY19zdzsKLX0KLQotc3RhdGljIGludCBpb2F0X2luaXRpYWxfZGVzY19jb3VudCA9IDI1NjsKLW1vZHVsZV9wYXJhbShpb2F0X2luaXRpYWxfZGVzY19jb3VudCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaW9hdF9pbml0aWFsX2Rlc2NfY291bnQsCi0JCSAiaW5pdGlhbCBkZXNjcmlwdG9ycyBwZXIgY2hhbm5lbCAoZGVmYXVsdDogMjU2KSIpOwotCi0vKioKLSAqIGlvYXQyX2RtYV9tYXNzYWdlX2NoYW5fZGVzYyAtIGxpbmsgdGhlIGRlc2NyaXB0b3JzIGludG8gYSBjaXJjbGUKLSAqIEBpb2F0X2NoYW46IHRoZSBjaGFubmVsIHRvIGJlIG1hc3NhZ2VkCi0gKi8KLXN0YXRpYyB2b2lkIGlvYXQyX2RtYV9tYXNzYWdlX2NoYW5fZGVzYyhzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuKQotewotCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmRlc2MsICpfZGVzYzsKLQotCS8qIHNldHVwIHVzZWRfZGVzYyAqLwotCWlvYXRfY2hhbi0+dXNlZF9kZXNjLm5leHQgPSBpb2F0X2NoYW4tPmZyZWVfZGVzYy5uZXh0OwotCWlvYXRfY2hhbi0+dXNlZF9kZXNjLnByZXYgPSBOVUxMOwotCi0JLyogcHVsbCBmcmVlX2Rlc2Mgb3V0IG9mIHRoZSBjaXJjbGUgc28gdGhhdCBldmVyeSBub2RlIGlzIGEgaHcKLQkgKiBkZXNjcmlwdG9yLCBidXQgbGVhdmUgaXQgcG9pbnRpbmcgdG8gdGhlIGxpc3QKLQkgKi8KLQlpb2F0X2NoYW4tPmZyZWVfZGVzYy5wcmV2LT5uZXh0ID0gaW9hdF9jaGFuLT5mcmVlX2Rlc2MubmV4dDsKLQlpb2F0X2NoYW4tPmZyZWVfZGVzYy5uZXh0LT5wcmV2ID0gaW9hdF9jaGFuLT5mcmVlX2Rlc2MucHJldjsKLQotCS8qIGNpcmNsZSBsaW5rIHRoZSBodyBkZXNjcmlwdG9ycyAqLwotCWRlc2MgPSB0b19pb2F0X2Rlc2MoaW9hdF9jaGFuLT5mcmVlX2Rlc2MubmV4dCk7Ci0JZGVzYy0+aHctPm5leHQgPSB0b19pb2F0X2Rlc2MoZGVzYy0+bm9kZS5uZXh0KS0+YXN5bmNfdHgucGh5czsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsIGlvYXRfY2hhbi0+ZnJlZV9kZXNjLm5leHQsIG5vZGUpIHsKLQkJZGVzYy0+aHctPm5leHQgPSB0b19pb2F0X2Rlc2MoZGVzYy0+bm9kZS5uZXh0KS0+YXN5bmNfdHgucGh5czsKLQl9Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMgLSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGRlc2NyaXB0b3JzCi0gKiBAY2hhbjogdGhlIGNoYW5uZWwgdG8gYmUgZmlsbGVkIG91dAotICovCi1zdGF0aWMgaW50IGlvYXRfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKLXsKLQlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuID0gdG9faW9hdF9jaGFuKGNoYW4pOwotCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmRlc2M7Ci0JdTE2IGNoYW5jdHJsOwotCXUzMiBjaGFuZXJyOwotCWludCBpOwotCUxJU1RfSEVBRCh0bXBfbGlzdCk7Ci0KLQkvKiBoYXZlIHdlIGFscmVhZHkgYmVlbiBzZXQgdXA/ICovCi0JaWYgKCFsaXN0X2VtcHR5KCZpb2F0X2NoYW4tPmZyZWVfZGVzYykpCi0JCXJldHVybiBpb2F0X2NoYW4tPmRlc2Njb3VudDsKLQotCS8qIFNldHVwIHJlZ2lzdGVyIHRvIGludGVycnVwdCBhbmQgd3JpdGUgY29tcGxldGlvbiBzdGF0dXMgb24gZXJyb3IgKi8KLQljaGFuY3RybCA9IElPQVRfQ0hBTkNUUkxfRVJSX0lOVF9FTiB8Ci0JCUlPQVRfQ0hBTkNUUkxfQU5ZX0VSUl9BQk9SVF9FTiB8Ci0JCUlPQVRfQ0hBTkNUUkxfRVJSX0NPTVBMRVRJT05fRU47Ci0Jd3JpdGV3KGNoYW5jdHJsLCBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOQ1RSTF9PRkZTRVQpOwotCi0JY2hhbmVyciA9IHJlYWRsKGlvYXRfY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5FUlJfT0ZGU0VUKTsKLQlpZiAoY2hhbmVycikgewotCQlkZXZfZXJyKCZpb2F0X2NoYW4tPmRldmljZS0+cGRldi0+ZGV2LAotCQkJIkNIQU5FUlIgPSAleCwgY2xlYXJpbmdcbiIsIGNoYW5lcnIpOwotCQl3cml0ZWwoY2hhbmVyciwgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOwotCX0KLQotCS8qIEFsbG9jYXRlIGRlc2NyaXB0b3JzICovCi0JZm9yIChpID0gMDsgaSA8IGlvYXRfaW5pdGlhbF9kZXNjX2NvdW50OyBpKyspIHsKLQkJZGVzYyA9IGlvYXRfZG1hX2FsbG9jX2Rlc2NyaXB0b3IoaW9hdF9jaGFuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFkZXNjKSB7Ci0JCQlkZXZfZXJyKCZpb2F0X2NoYW4tPmRldmljZS0+cGRldi0+ZGV2LAotCQkJCSJPbmx5ICVkIGluaXRpYWwgZGVzY3JpcHRvcnNcbiIsIGkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+bm9kZSwgJnRtcF9saXN0KTsKLQl9Ci0Jc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0JaW9hdF9jaGFuLT5kZXNjY291bnQgPSBpOwotCWxpc3Rfc3BsaWNlKCZ0bXBfbGlzdCwgJmlvYXRfY2hhbi0+ZnJlZV9kZXNjKTsKLQlpZiAoaW9hdF9jaGFuLT5kZXZpY2UtPnZlcnNpb24gIT0gSU9BVF9WRVJfMV8yKQotCQlpb2F0Ml9kbWFfbWFzc2FnZV9jaGFuX2Rlc2MoaW9hdF9jaGFuKTsKLQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCi0JLyogYWxsb2NhdGUgYSBjb21wbGV0aW9uIHdyaXRlYmFjayBhcmVhICovCi0JLyogZG9pbmcgMiAzMmJpdCB3cml0ZXMgdG8gbW1pbyBzaW5jZSAxIDY0YiB3cml0ZSBkb2Vzbid0IHdvcmsgKi8KLQlpb2F0X2NoYW4tPmNvbXBsZXRpb25fdmlydCA9Ci0JCXBjaV9wb29sX2FsbG9jKGlvYXRfY2hhbi0+ZGV2aWNlLT5jb21wbGV0aW9uX3Bvb2wsCi0JCQkgICAgICAgR0ZQX0tFUk5FTCwKLQkJCSAgICAgICAmaW9hdF9jaGFuLT5jb21wbGV0aW9uX2FkZHIpOwotCW1lbXNldChpb2F0X2NoYW4tPmNvbXBsZXRpb25fdmlydCwgMCwKLQkgICAgICAgc2l6ZW9mKCppb2F0X2NoYW4tPmNvbXBsZXRpb25fdmlydCkpOwotCXdyaXRlbCgoKHU2NCkgaW9hdF9jaGFuLT5jb21wbGV0aW9uX2FkZHIpICYgMHgwMDAwMDAwMEZGRkZGRkZGLAotCSAgICAgICBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOQ01QX09GRlNFVF9MT1cpOwotCXdyaXRlbCgoKHU2NCkgaW9hdF9jaGFuLT5jb21wbGV0aW9uX2FkZHIpID4+IDMyLAotCSAgICAgICBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOQ01QX09GRlNFVF9ISUdIKTsKLQotCXRhc2tsZXRfZW5hYmxlKCZpb2F0X2NoYW4tPmNsZWFudXBfdGFzayk7Ci0JaW9hdF9kbWFfc3RhcnRfbnVsbF9kZXNjKGlvYXRfY2hhbik7ICAvKiBnaXZlIGNoYWluIHRvIGRtYSBkZXZpY2UgKi8KLQlyZXR1cm4gaW9hdF9jaGFuLT5kZXNjY291bnQ7Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyAtIHJlbGVhc2UgYWxsIHRoZSBkZXNjcmlwdG9ycwotICogQGNoYW46IHRoZSBjaGFubmVsIHRvIGJlIGNsZWFuZWQKLSAqLwotc3RhdGljIHZvaWQgaW9hdF9kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCi17Ci0Jc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbiA9IHRvX2lvYXRfY2hhbihjaGFuKTsKLQlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmlvYXRkbWFfZGV2aWNlID0gdG9faW9hdGRtYV9kZXZpY2UoY2hhbi0+ZGV2aWNlKTsKLQlzdHJ1Y3QgaW9hdF9kZXNjX3N3ICpkZXNjLCAqX2Rlc2M7Ci0JaW50IGluX3VzZV9kZXNjcyA9IDA7Ci0KLQkvKiBCZWZvcmUgZnJlZWluZyBjaGFubmVsIHJlc291cmNlcyBmaXJzdCBjaGVjawotCSAqIGlmIHRoZXkgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYWxsb2NhdGVkIGZvciB0aGlzIGNoYW5uZWwuCi0JICovCi0JaWYgKGlvYXRfY2hhbi0+ZGVzY2NvdW50ID09IDApCi0JCXJldHVybjsKLQotCXRhc2tsZXRfZGlzYWJsZSgmaW9hdF9jaGFuLT5jbGVhbnVwX3Rhc2spOwotCWlvYXRfZG1hX21lbWNweV9jbGVhbnVwKGlvYXRfY2hhbik7Ci0KLQkvKiBEZWxheSAxMDBtcyBhZnRlciByZXNldCB0byBhbGxvdyBpbnRlcm5hbCBETUEgbG9naWMgdG8gcXVpZXNjZQotCSAqIGJlZm9yZSByZW1vdmluZyBETUEgZGVzY3JpcHRvciByZXNvdXJjZXMuCi0JICovCi0Jd3JpdGViKElPQVRfQ0hBTkNNRF9SRVNFVCwKLQkgICAgICAgaW9hdF9jaGFuLT5yZWdfYmFzZQotCQkJKyBJT0FUX0NIQU5DTURfT0ZGU0VUKGlvYXRfY2hhbi0+ZGV2aWNlLT52ZXJzaW9uKSk7Ci0JbWRlbGF5KDEwMCk7Ci0KLQlzcGluX2xvY2tfYmgoJmlvYXRfY2hhbi0+ZGVzY19sb2NrKTsKLQlzd2l0Y2ggKGlvYXRfY2hhbi0+ZGV2aWNlLT52ZXJzaW9uKSB7Ci0JY2FzZSBJT0FUX1ZFUl8xXzI6Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywKLQkJCQkJICZpb2F0X2NoYW4tPnVzZWRfZGVzYywgbm9kZSkgewotCQkJaW5fdXNlX2Rlc2NzKys7Ci0JCQlsaXN0X2RlbCgmZGVzYy0+bm9kZSk7Ci0JCQlwY2lfcG9vbF9mcmVlKGlvYXRkbWFfZGV2aWNlLT5kbWFfcG9vbCwgZGVzYy0+aHcsCi0JCQkJICAgICAgZGVzYy0+YXN5bmNfdHgucGh5cyk7Ci0JCQlrZnJlZShkZXNjKTsKLQkJfQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsCi0JCQkJCSAmaW9hdF9jaGFuLT5mcmVlX2Rlc2MsIG5vZGUpIHsKLQkJCWxpc3RfZGVsKCZkZXNjLT5ub2RlKTsKLQkJCXBjaV9wb29sX2ZyZWUoaW9hdGRtYV9kZXZpY2UtPmRtYV9wb29sLCBkZXNjLT5odywKLQkJCQkgICAgICBkZXNjLT5hc3luY190eC5waHlzKTsKLQkJCWtmcmVlKGRlc2MpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSU9BVF9WRVJfMl8wOgotCWNhc2UgSU9BVF9WRVJfM18wOgotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsCi0JCQkJCSBpb2F0X2NoYW4tPmZyZWVfZGVzYy5uZXh0LCBub2RlKSB7Ci0JCQlsaXN0X2RlbCgmZGVzYy0+bm9kZSk7Ci0JCQlwY2lfcG9vbF9mcmVlKGlvYXRkbWFfZGV2aWNlLT5kbWFfcG9vbCwgZGVzYy0+aHcsCi0JCQkJICAgICAgZGVzYy0+YXN5bmNfdHgucGh5cyk7Ci0JCQlrZnJlZShkZXNjKTsKLQkJfQotCQlkZXNjID0gdG9faW9hdF9kZXNjKGlvYXRfY2hhbi0+ZnJlZV9kZXNjLm5leHQpOwotCQlwY2lfcG9vbF9mcmVlKGlvYXRkbWFfZGV2aWNlLT5kbWFfcG9vbCwgZGVzYy0+aHcsCi0JCQkgICAgICBkZXNjLT5hc3luY190eC5waHlzKTsKLQkJa2ZyZWUoZGVzYyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZpb2F0X2NoYW4tPmZyZWVfZGVzYyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZpb2F0X2NoYW4tPnVzZWRfZGVzYyk7Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCi0JcGNpX3Bvb2xfZnJlZShpb2F0ZG1hX2RldmljZS0+Y29tcGxldGlvbl9wb29sLAotCQkgICAgICBpb2F0X2NoYW4tPmNvbXBsZXRpb25fdmlydCwKLQkJICAgICAgaW9hdF9jaGFuLT5jb21wbGV0aW9uX2FkZHIpOwotCi0JLyogb25lIGlzIG9rIHNpbmNlIHdlIGxlZnQgaXQgb24gdGhlcmUgb24gcHVycG9zZSAqLwotCWlmIChpbl91c2VfZGVzY3MgPiAxKQotCQlkZXZfZXJyKCZpb2F0X2NoYW4tPmRldmljZS0+cGRldi0+ZGV2LAotCQkJIkZyZWVpbmcgJWQgaW4gdXNlIGRlc2NyaXB0b3JzIVxuIiwKLQkJCWluX3VzZV9kZXNjcyAtIDEpOwotCi0JaW9hdF9jaGFuLT5sYXN0X2NvbXBsZXRpb24gPSBpb2F0X2NoYW4tPmNvbXBsZXRpb25fYWRkciA9IDA7Ci0JaW9hdF9jaGFuLT5wZW5kaW5nID0gMDsKLQlpb2F0X2NoYW4tPmRtYWNvdW50ID0gMDsKLQlpb2F0X2NoYW4tPmRlc2Njb3VudCA9IDA7Ci0JaW9hdF9jaGFuLT53YXRjaGRvZ19jb21wbGV0aW9uID0gMDsKLQlpb2F0X2NoYW4tPmxhc3RfY29tcGxfZGVzY19hZGRyX2h3ID0gMDsKLQlpb2F0X2NoYW4tPndhdGNoZG9nX3RjcF9jb29raWUgPQotCQlpb2F0X2NoYW4tPndhdGNoZG9nX2xhc3RfdGNwX2Nvb2tpZSA9IDA7Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfZ2V0X25leHRfZGVzY3JpcHRvciAtIHJldHVybiB0aGUgbmV4dCBhdmFpbGFibGUgZGVzY3JpcHRvcgotICogQGlvYXRfY2hhbjogSU9BVCBETUEgY2hhbm5lbCBoYW5kbGUKLSAqCi0gKiBHZXRzIHRoZSBuZXh0IGRlc2NyaXB0b3IgZnJvbSB0aGUgY2hhaW4sIGFuZCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZQotICogY2hhbm5lbCdzIGRlc2NfbG9jayBoZWxkLiAgQWxsb2NhdGVzIG1vcmUgZGVzY3JpcHRvcnMgaWYgdGhlIGNoYW5uZWwKLSAqIGhhcyBydW4gb3V0LgotICovCi1zdGF0aWMgc3RydWN0IGlvYXRfZGVzY19zdyAqCi1pb2F0MV9kbWFfZ2V0X25leHRfZGVzY3JpcHRvcihzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuKQotewotCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKm5ldzsKLQotCWlmICghbGlzdF9lbXB0eSgmaW9hdF9jaGFuLT5mcmVlX2Rlc2MpKSB7Ci0JCW5ldyA9IHRvX2lvYXRfZGVzYyhpb2F0X2NoYW4tPmZyZWVfZGVzYy5uZXh0KTsKLQkJbGlzdF9kZWwoJm5ldy0+bm9kZSk7Ci0JfSBlbHNlIHsKLQkJLyogdHJ5IHRvIGdldCBhbm90aGVyIGRlc2MgKi8KLQkJbmV3ID0gaW9hdF9kbWFfYWxsb2NfZGVzY3JpcHRvcihpb2F0X2NoYW4sIEdGUF9BVE9NSUMpOwotCQlpZiAoIW5ldykgewotCQkJZGV2X2VycigmaW9hdF9jaGFuLT5kZXZpY2UtPnBkZXYtPmRldiwKLQkJCQkiYWxsb2MgZmFpbGVkXG4iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCi0JcHJlZmV0Y2gobmV3LT5odyk7Ci0JcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHN0cnVjdCBpb2F0X2Rlc2Nfc3cgKgotaW9hdDJfZG1hX2dldF9uZXh0X2Rlc2NyaXB0b3Ioc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbikKLXsKLQlzdHJ1Y3QgaW9hdF9kZXNjX3N3ICpuZXc7Ci0KLQkvKgotCSAqIHVzZWQucHJldiBwb2ludHMgdG8gd2hlcmUgdG8gc3RhcnQgcHJvY2Vzc2luZwotCSAqIHVzZWQubmV4dCBwb2ludHMgdG8gbmV4dCBmcmVlIGRlc2NyaXB0b3IKLQkgKiBpZiB1c2VkLnByZXYgPT0gTlVMTCwgdGhlcmUgYXJlIG5vbmUgd2FpdGluZyB0byBiZSBwcm9jZXNzZWQKLQkgKiBpZiB1c2VkLm5leHQgPT0gdXNlZC5wcmV2LnByZXYsIHRoZXJlIGlzIG9ubHkgb25lIGZyZWUgZGVzY3JpcHRvciwKLQkgKiAgICAgIGFuZCB3ZSBuZWVkIHRvIHVzZSBpdCB0byBhcyBhIG5vb3AgZGVzY3JpcHRvciBiZWZvcmUKLQkgKiAgICAgIGxpbmtpbmcgaW4gYSBuZXcgc2V0IG9mIGRlc2NyaXB0b3JzLCBzaW5jZSB0aGUgZGV2aWNlCi0JICogICAgICBoYXMgcHJvYmFibHkgYWxyZWFkeSByZWFkIHRoZSBwb2ludGVyIHRvIGl0Ci0JICovCi0JaWYgKGlvYXRfY2hhbi0+dXNlZF9kZXNjLnByZXYgJiYKLQkgICAgaW9hdF9jaGFuLT51c2VkX2Rlc2MubmV4dCA9PSBpb2F0X2NoYW4tPnVzZWRfZGVzYy5wcmV2LT5wcmV2KSB7Ci0KLQkJc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYzsKLQkJc3RydWN0IGlvYXRfZGVzY19zdyAqbm9vcF9kZXNjOwotCQlpbnQgaTsKLQotCQkvKiBzZXQgdXAgdGhlIG5vb3AgZGVzY3JpcHRvciAqLwotCQlub29wX2Rlc2MgPSB0b19pb2F0X2Rlc2MoaW9hdF9jaGFuLT51c2VkX2Rlc2MubmV4dCk7Ci0JCS8qIHNldCBzaXplIHRvIG5vbi16ZXJvIHZhbHVlIChjaGFubmVsIHJldHVybnMgZXJyb3Igd2hlbiBzaXplIGlzIDApICovCi0JCW5vb3BfZGVzYy0+aHctPnNpemUgPSBOVUxMX0RFU0NfQlVGRkVSX1NJWkU7Ci0JCW5vb3BfZGVzYy0+aHctPmN0bCA9IElPQVRfRE1BX0RFU0NSSVBUT1JfTlVMOwotCQlub29wX2Rlc2MtPmh3LT5zcmNfYWRkciA9IDA7Ci0JCW5vb3BfZGVzYy0+aHctPmRzdF9hZGRyID0gMDsKLQotCQlpb2F0X2NoYW4tPnVzZWRfZGVzYy5uZXh0ID0gaW9hdF9jaGFuLT51c2VkX2Rlc2MubmV4dC0+bmV4dDsKLQkJaW9hdF9jaGFuLT5wZW5kaW5nKys7Ci0JCWlvYXRfY2hhbi0+ZG1hY291bnQrKzsKLQotCQkvKiB0cnkgdG8gZ2V0IGEgZmV3IG1vcmUgZGVzY3JpcHRvcnMgKi8KLQkJZm9yIChpID0gMTY7IGk7IGktLSkgewotCQkJZGVzYyA9IGlvYXRfZG1hX2FsbG9jX2Rlc2NyaXB0b3IoaW9hdF9jaGFuLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghZGVzYykgewotCQkJCWRldl9lcnIoJmlvYXRfY2hhbi0+ZGV2aWNlLT5wZGV2LT5kZXYsCi0JCQkJCSJhbGxvYyBmYWlsZWRcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+bm9kZSwgaW9hdF9jaGFuLT51c2VkX2Rlc2MubmV4dCk7Ci0KLQkJCWRlc2MtPmh3LT5uZXh0Ci0JCQkJPSB0b19pb2F0X2Rlc2MoZGVzYy0+bm9kZS5uZXh0KS0+YXN5bmNfdHgucGh5czsKLQkJCXRvX2lvYXRfZGVzYyhkZXNjLT5ub2RlLnByZXYpLT5ody0+bmV4dAotCQkJCT0gZGVzYy0+YXN5bmNfdHgucGh5czsKLQkJCWlvYXRfY2hhbi0+ZGVzY2NvdW50Kys7Ci0JCX0KLQotCQlpb2F0X2NoYW4tPnVzZWRfZGVzYy5uZXh0ID0gbm9vcF9kZXNjLT5ub2RlLm5leHQ7Ci0JfQotCW5ldyA9IHRvX2lvYXRfZGVzYyhpb2F0X2NoYW4tPnVzZWRfZGVzYy5uZXh0KTsKLQlwcmVmZXRjaChuZXcpOwotCWlvYXRfY2hhbi0+dXNlZF9kZXNjLm5leHQgPSBuZXctPm5vZGUubmV4dDsKLQotCWlmIChpb2F0X2NoYW4tPnVzZWRfZGVzYy5wcmV2ID09IE5VTEwpCi0JCWlvYXRfY2hhbi0+dXNlZF9kZXNjLnByZXYgPSAmbmV3LT5ub2RlOwotCi0JcHJlZmV0Y2gobmV3LT5odyk7Ci0JcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmlvYXRfZG1hX2dldF9uZXh0X2Rlc2NyaXB0b3IoCi0JCQkJCQlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuKQotewotCWlmICghaW9hdF9jaGFuKQotCQlyZXR1cm4gTlVMTDsKLQotCXN3aXRjaCAoaW9hdF9jaGFuLT5kZXZpY2UtPnZlcnNpb24pIHsKLQljYXNlIElPQVRfVkVSXzFfMjoKLQkJcmV0dXJuIGlvYXQxX2RtYV9nZXRfbmV4dF9kZXNjcmlwdG9yKGlvYXRfY2hhbik7Ci0JY2FzZSBJT0FUX1ZFUl8yXzA6Ci0JY2FzZSBJT0FUX1ZFUl8zXzA6Ci0JCXJldHVybiBpb2F0Ml9kbWFfZ2V0X25leHRfZGVzY3JpcHRvcihpb2F0X2NoYW4pOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqaW9hdDFfZG1hX3ByZXBfbWVtY3B5KAotCQkJCQkJc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCQkJZG1hX2FkZHJfdCBkbWFfZGVzdCwKLQkJCQkJCWRtYV9hZGRyX3QgZG1hX3NyYywKLQkJCQkJCXNpemVfdCBsZW4sCi0JCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4gPSB0b19pb2F0X2NoYW4oY2hhbik7Ci0Jc3RydWN0IGlvYXRfZGVzY19zdyAqbmV3OwotCi0Jc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0JbmV3ID0gaW9hdF9kbWFfZ2V0X25leHRfZGVzY3JpcHRvcihpb2F0X2NoYW4pOwotCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0KLQlpZiAobmV3KSB7Ci0JCW5ldy0+bGVuID0gbGVuOwotCQluZXctPmRzdCA9IGRtYV9kZXN0OwotCQluZXctPnNyYyA9IGRtYV9zcmM7Ci0JCW5ldy0+YXN5bmNfdHguZmxhZ3MgPSBmbGFnczsKLQkJcmV0dXJuICZuZXctPmFzeW5jX3R4OwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoJmlvYXRfY2hhbi0+ZGV2aWNlLT5wZGV2LT5kZXYsCi0JCQkiY2hhbiVkIC0gZ2V0X25leHRfZGVzYyBmYWlsZWQ6ICVkIGRlc2NzIHdhaXRpbmcsICVkIHRvdGFsIGRlc2NcbiIsCi0JCQljaGFuX251bShpb2F0X2NoYW4pLCBpb2F0X2NoYW4tPmRtYWNvdW50LCBpb2F0X2NoYW4tPmRlc2Njb3VudCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqaW9hdDJfZG1hX3ByZXBfbWVtY3B5KAotCQkJCQkJc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCQkJZG1hX2FkZHJfdCBkbWFfZGVzdCwKLQkJCQkJCWRtYV9hZGRyX3QgZG1hX3NyYywKLQkJCQkJCXNpemVfdCBsZW4sCi0JCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4gPSB0b19pb2F0X2NoYW4oY2hhbik7Ci0Jc3RydWN0IGlvYXRfZGVzY19zdyAqbmV3OwotCi0Jc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0JbmV3ID0gaW9hdDJfZG1hX2dldF9uZXh0X2Rlc2NyaXB0b3IoaW9hdF9jaGFuKTsKLQotCS8qCi0JICogbGVhdmUgaW9hdF9jaGFuLT5kZXNjX2xvY2sgc2V0IGluIGlvYXQgMiBwYXRoCi0JICogaXQgd2lsbCBnZXQgdW5sb2NrZWQgYXQgZW5kIG9mIHR4X3N1Ym1pdAotCSAqLwotCi0JaWYgKG5ldykgewotCQluZXctPmxlbiA9IGxlbjsKLQkJbmV3LT5kc3QgPSBkbWFfZGVzdDsKLQkJbmV3LT5zcmMgPSBkbWFfc3JjOwotCQluZXctPmFzeW5jX3R4LmZsYWdzID0gZmxhZ3M7Ci0JCXJldHVybiAmbmV3LT5hc3luY190eDsKLQl9IGVsc2UgewotCQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCQlkZXZfZXJyKCZpb2F0X2NoYW4tPmRldmljZS0+cGRldi0+ZGV2LAotCQkJImNoYW4lZCAtIGdldF9uZXh0X2Rlc2MgZmFpbGVkOiAlZCBkZXNjcyB3YWl0aW5nLCAlZCB0b3RhbCBkZXNjXG4iLAotCQkJY2hhbl9udW0oaW9hdF9jaGFuKSwgaW9hdF9jaGFuLT5kbWFjb3VudCwgaW9hdF9jaGFuLT5kZXNjY291bnQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGlvYXRfZG1hX2NsZWFudXBfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGlvYXRfZG1hX2NoYW4gKmNoYW4gPSAodm9pZCAqKWRhdGE7Ci0JaW9hdF9kbWFfbWVtY3B5X2NsZWFudXAoY2hhbik7Ci0Jd3JpdGV3KElPQVRfQ0hBTkNUUkxfSU5UX0RJU0FCTEUsCi0JICAgICAgIGNoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFOQ1RSTF9PRkZTRVQpOwotfQotCi1zdGF0aWMgdm9pZAotaW9hdF9kbWFfdW5tYXAoc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbiwgc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYykKLXsKLQlpZiAoIShkZXNjLT5hc3luY190eC5mbGFncyAmIERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApKSB7Ci0JCWlmIChkZXNjLT5hc3luY190eC5mbGFncyAmIERNQV9DT01QTF9ERVNUX1VOTUFQX1NJTkdMRSkKLQkJCXBjaV91bm1hcF9zaW5nbGUoaW9hdF9jaGFuLT5kZXZpY2UtPnBkZXYsCi0JCQkJCSBwY2lfdW5tYXBfYWRkcihkZXNjLCBkc3QpLAotCQkJCQkgcGNpX3VubWFwX2xlbihkZXNjLCBsZW4pLAotCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJZWxzZQotCQkJcGNpX3VubWFwX3BhZ2UoaW9hdF9jaGFuLT5kZXZpY2UtPnBkZXYsCi0JCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKGRlc2MsIGRzdCksCi0JCQkJICAgICAgIHBjaV91bm1hcF9sZW4oZGVzYywgbGVuKSwKLQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQl9Ci0KLQlpZiAoIShkZXNjLT5hc3luY190eC5mbGFncyAmIERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCkpIHsKLQkJaWYgKGRlc2MtPmFzeW5jX3R4LmZsYWdzICYgRE1BX0NPTVBMX1NSQ19VTk1BUF9TSU5HTEUpCi0JCQlwY2lfdW5tYXBfc2luZ2xlKGlvYXRfY2hhbi0+ZGV2aWNlLT5wZGV2LAotCQkJCQkgcGNpX3VubWFwX2FkZHIoZGVzYywgc3JjKSwKLQkJCQkJIHBjaV91bm1hcF9sZW4oZGVzYywgbGVuKSwKLQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQllbHNlCi0JCQlwY2lfdW5tYXBfcGFnZShpb2F0X2NoYW4tPmRldmljZS0+cGRldiwKLQkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIoZGVzYywgc3JjKSwKLQkJCQkgICAgICAgcGNpX3VubWFwX2xlbihkZXNjLCBsZW4pLAotCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQl9Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfbWVtY3B5X2NsZWFudXAgLSBjbGVhbnVwIHVwIGZpbmlzaGVkIGRlc2NyaXB0b3JzCi0gKiBAY2hhbjogaW9hdCBjaGFubmVsIHRvIGJlIGNsZWFuZWQgdXAKLSAqLwotc3RhdGljIHZvaWQgaW9hdF9kbWFfbWVtY3B5X2NsZWFudXAoc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbikKLXsKLQl1bnNpZ25lZCBsb25nIHBoeXNfY29tcGxldGU7Ci0Jc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYywgKl9kZXNjOwotCWRtYV9jb29raWVfdCBjb29raWUgPSAwOwotCXVuc2lnbmVkIGxvbmcgZGVzY19waHlzOwotCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmxhdGVzdF9kZXNjOwotCi0JcHJlZmV0Y2goaW9hdF9jaGFuLT5jb21wbGV0aW9uX3ZpcnQpOwotCi0JaWYgKCFzcGluX3RyeWxvY2tfYmgoJmlvYXRfY2hhbi0+Y2xlYW51cF9sb2NrKSkKLQkJcmV0dXJuOwotCi0JLyogVGhlIGNvbXBsZXRpb24gd3JpdGViYWNrIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUsCi0JICAgc28gcmVhZHMgYnkgdGhlIGRyaXZlciBuZWVkIHRvIGJlIGF0b21pYyBvcGVyYXRpb25zCi0JICAgVGhlIGRlc2NyaXB0b3IgcGh5c2ljYWwgYWRkcmVzc2VzIGFyZSBsaW1pdGVkIHRvIDMyLWJpdHMKLQkgICB3aGVuIHRoZSBDUFUgY2FuIG9ubHkgZG8gYSAzMi1iaXQgbW92ICovCi0KLSNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKLQlwaHlzX2NvbXBsZXRlID0KLQkJaW9hdF9jaGFuLT5jb21wbGV0aW9uX3ZpcnQtPmZ1bGwKLQkJJiBJT0FUX0NIQU5TVFNfQ09NUExFVEVEX0RFU0NSSVBUT1JfQUREUjsKLSNlbHNlCi0JcGh5c19jb21wbGV0ZSA9Ci0JCWlvYXRfY2hhbi0+Y29tcGxldGlvbl92aXJ0LT5sb3cgJiBJT0FUX0xPV19DT01QTEVUSU9OX01BU0s7Ci0jZW5kaWYKLQotCWlmICgoaW9hdF9jaGFuLT5jb21wbGV0aW9uX3ZpcnQtPmZ1bGwKLQkJJiBJT0FUX0NIQU5TVFNfRE1BX1RSQU5TRkVSX1NUQVRVUykgPT0KLQkJCQlJT0FUX0NIQU5TVFNfRE1BX1RSQU5TRkVSX1NUQVRVU19IQUxURUQpIHsKLQkJZGV2X2VycigmaW9hdF9jaGFuLT5kZXZpY2UtPnBkZXYtPmRldiwKLQkJCSJDaGFubmVsIGhhbHRlZCwgY2hhbmVyciA9ICV4XG4iLAotCQkJcmVhZGwoaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpKTsKLQotCQkvKiBUT0RPIGRvIHNvbWV0aGluZyB0byBzYWx2YWdlIHRoZSBzaXR1YXRpb24gKi8KLQl9Ci0KLQlpZiAocGh5c19jb21wbGV0ZSA9PSBpb2F0X2NoYW4tPmxhc3RfY29tcGxldGlvbikgewotCQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5jbGVhbnVwX2xvY2spOwotCQkvKgotCQkgKiBwZXJoYXBzIHdlJ3JlIHN0dWNrIHNvIGhhcmQgdGhhdCB0aGUgd2F0Y2hkb2cgY2FuJ3QgZ28gb2ZmPwotCQkgKiB0cnkgdG8gY2F0Y2ggaXQgYWZ0ZXIgMiBzZWNvbmRzCi0JCSAqLwotCQlpZiAoaW9hdF9jaGFuLT5kZXZpY2UtPnZlcnNpb24gIT0gSU9BVF9WRVJfM18wKSB7Ci0JCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAotCQkJCSAgICAgICBpb2F0X2NoYW4tPmxhc3RfY29tcGxldGlvbl90aW1lICsgSFoqV0FUQ0hET0dfREVMQVkpKSB7Ci0JCQkJaW9hdF9kbWFfY2hhbl93YXRjaGRvZygmKGlvYXRfY2hhbi0+ZGV2aWNlLT53b3JrLndvcmspKTsKLQkJCQlpb2F0X2NoYW4tPmxhc3RfY29tcGxldGlvbl90aW1lID0gamlmZmllczsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlvYXRfY2hhbi0+bGFzdF9jb21wbGV0aW9uX3RpbWUgPSBqaWZmaWVzOwotCi0JY29va2llID0gMDsKLQlpZiAoIXNwaW5fdHJ5bG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmNsZWFudXBfbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0KLQlzd2l0Y2ggKGlvYXRfY2hhbi0+ZGV2aWNlLT52ZXJzaW9uKSB7Ci0JY2FzZSBJT0FUX1ZFUl8xXzI6Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywKLQkJCQkJICZpb2F0X2NoYW4tPnVzZWRfZGVzYywgbm9kZSkgewotCi0JCQkvKgotCQkJICogSW5jb21pbmcgRE1BIHJlcXVlc3RzIG1heSB1c2UgbXVsdGlwbGUgZGVzY3JpcHRvcnMsCi0JCQkgKiBkdWUgdG8gZXhjZWVkaW5nIHhmZXJjYXAsIHBlcmhhcHMuIElmIHNvLCBvbmx5IHRoZQotCQkJICogbGFzdCBvbmUgd2lsbCBoYXZlIGEgY29va2llLCBhbmQgcmVxdWlyZSB1bm1hcHBpbmcuCi0JCQkgKi8KLQkJCWlmIChkZXNjLT5hc3luY190eC5jb29raWUpIHsKLQkJCQljb29raWUgPSBkZXNjLT5hc3luY190eC5jb29raWU7Ci0JCQkJaW9hdF9kbWFfdW5tYXAoaW9hdF9jaGFuLCBkZXNjKTsKLQkJCQlpZiAoZGVzYy0+YXN5bmNfdHguY2FsbGJhY2spIHsKLQkJCQkJZGVzYy0+YXN5bmNfdHguY2FsbGJhY2soZGVzYy0+YXN5bmNfdHguY2FsbGJhY2tfcGFyYW0pOwotCQkJCQlkZXNjLT5hc3luY190eC5jYWxsYmFjayA9IE5VTEw7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZGVzYy0+YXN5bmNfdHgucGh5cyAhPSBwaHlzX2NvbXBsZXRlKSB7Ci0JCQkJLyoKLQkJCQkgKiBhIGNvbXBsZXRlZCBlbnRyeSwgYnV0IG5vdCB0aGUgbGFzdCwgc28gY2xlYW4KLQkJCQkgKiB1cCBpZiB0aGUgY2xpZW50IGlzIGRvbmUgd2l0aCB0aGUgZGVzY3JpcHRvcgotCQkJCSAqLwotCQkJCWlmIChhc3luY190eF90ZXN0X2FjaygmZGVzYy0+YXN5bmNfdHgpKSB7Ci0JCQkJCWxpc3RfbW92ZV90YWlsKCZkZXNjLT5ub2RlLAotCQkJCQkJICAgICAgICZpb2F0X2NoYW4tPmZyZWVfZGVzYyk7Ci0JCQkJfSBlbHNlCi0JCQkJCWRlc2MtPmFzeW5jX3R4LmNvb2tpZSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogbGFzdCB1c2VkIGRlc2MuIERvIG5vdCByZW1vdmUsIHNvIHdlIGNhbgotCQkJCSAqIGFwcGVuZCBmcm9tIGl0LCBidXQgZG9uJ3QgbG9vayBhdCBpdCBuZXh0Ci0JCQkJICogdGltZSwgZWl0aGVyCi0JCQkJICovCi0JCQkJZGVzYy0+YXN5bmNfdHguY29va2llID0gMDsKLQotCQkJCS8qIFRPRE8gY2hlY2sgc3RhdHVzIGJpdHM/ICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJT0FUX1ZFUl8yXzA6Ci0JY2FzZSBJT0FUX1ZFUl8zXzA6Ci0JCS8qIGhhcyBzb21lIG90aGVyIHRocmVhZCBoYXMgYWxyZWFkeSBjbGVhbmVkIHVwPyAqLwotCQlpZiAoaW9hdF9jaGFuLT51c2VkX2Rlc2MucHJldiA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJLyogd29yayBiYWNrd2FyZHMgdG8gZmluZCBsYXRlc3QgZmluaXNoZWQgZGVzYyAqLwotCQlkZXNjID0gdG9faW9hdF9kZXNjKGlvYXRfY2hhbi0+dXNlZF9kZXNjLm5leHQpOwotCQlsYXRlc3RfZGVzYyA9IE5VTEw7Ci0JCWRvIHsKLQkJCWRlc2MgPSB0b19pb2F0X2Rlc2MoZGVzYy0+bm9kZS5wcmV2KTsKLQkJCWRlc2NfcGh5cyA9ICh1bnNpZ25lZCBsb25nKWRlc2MtPmFzeW5jX3R4LnBoeXMKLQkJCQkgICAgICAgJiBJT0FUX0NIQU5TVFNfQ09NUExFVEVEX0RFU0NSSVBUT1JfQUREUjsKLQkJCWlmIChkZXNjX3BoeXMgPT0gcGh5c19jb21wbGV0ZSkgewotCQkJCWxhdGVzdF9kZXNjID0gZGVzYzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSB3aGlsZSAoJmRlc2MtPm5vZGUgIT0gaW9hdF9jaGFuLT51c2VkX2Rlc2MucHJldik7Ci0KLQkJaWYgKGxhdGVzdF9kZXNjICE9IE5VTEwpIHsKLQotCQkJLyogd29yayBmb3J3YXJkcyB0byBjbGVhciBmaW5pc2hlZCBkZXNjcmlwdG9ycyAqLwotCQkJZm9yIChkZXNjID0gdG9faW9hdF9kZXNjKGlvYXRfY2hhbi0+dXNlZF9kZXNjLnByZXYpOwotCQkJICAgICAmZGVzYy0+bm9kZSAhPSBsYXRlc3RfZGVzYy0+bm9kZS5uZXh0ICYmCi0JCQkgICAgICZkZXNjLT5ub2RlICE9IGlvYXRfY2hhbi0+dXNlZF9kZXNjLm5leHQ7Ci0JCQkgICAgIGRlc2MgPSB0b19pb2F0X2Rlc2MoZGVzYy0+bm9kZS5uZXh0KSkgewotCQkJCWlmIChkZXNjLT5hc3luY190eC5jb29raWUpIHsKLQkJCQkJY29va2llID0gZGVzYy0+YXN5bmNfdHguY29va2llOwotCQkJCQlkZXNjLT5hc3luY190eC5jb29raWUgPSAwOwotCQkJCQlpb2F0X2RtYV91bm1hcChpb2F0X2NoYW4sIGRlc2MpOwotCQkJCQlpZiAoZGVzYy0+YXN5bmNfdHguY2FsbGJhY2spIHsKLQkJCQkJCWRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrKGRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtKTsKLQkJCQkJCWRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrID0gTlVMTDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLyogbW92ZSB1c2VkLnByZXYgdXAgYmV5b25kIHRob3NlIHRoYXQgYXJlIGZpbmlzaGVkICovCi0JCQlpZiAoJmRlc2MtPm5vZGUgPT0gaW9hdF9jaGFuLT51c2VkX2Rlc2MubmV4dCkKLQkJCQlpb2F0X2NoYW4tPnVzZWRfZGVzYy5wcmV2ID0gTlVMTDsKLQkJCWVsc2UKLQkJCQlpb2F0X2NoYW4tPnVzZWRfZGVzYy5wcmV2ID0gJmRlc2MtPm5vZGU7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJmlvYXRfY2hhbi0+ZGVzY19sb2NrKTsKLQotCWlvYXRfY2hhbi0+bGFzdF9jb21wbGV0aW9uID0gcGh5c19jb21wbGV0ZTsKLQlpZiAoY29va2llICE9IDApCi0JCWlvYXRfY2hhbi0+Y29tcGxldGVkX2Nvb2tpZSA9IGNvb2tpZTsKLQotCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmNsZWFudXBfbG9jayk7Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfaXNfY29tcGxldGUgLSBwb2xsIHRoZSBzdGF0dXMgb2YgYSBJT0FUIERNQSB0cmFuc2FjdGlvbgotICogQGNoYW46IElPQVQgRE1BIGNoYW5uZWwgaGFuZGxlCi0gKiBAY29va2llOiBETUEgdHJhbnNhY3Rpb24gaWRlbnRpZmllcgotICogQGRvbmU6IGlmIG5vdCAlTlVMTCwgdXBkYXRlZCB3aXRoIGxhc3QgY29tcGxldGVkIHRyYW5zYWN0aW9uCi0gKiBAdXNlZDogaWYgbm90ICVOVUxMLCB1cGRhdGVkIHdpdGggbGFzdCB1c2VkIHRyYW5zYWN0aW9uCi0gKi8KLXN0YXRpYyBlbnVtIGRtYV9zdGF0dXMgaW9hdF9kbWFfaXNfY29tcGxldGUoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCQkgICAgZG1hX2Nvb2tpZV90IGNvb2tpZSwKLQkJCQkJICAgIGRtYV9jb29raWVfdCAqZG9uZSwKLQkJCQkJICAgIGRtYV9jb29raWVfdCAqdXNlZCkKLXsKLQlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuID0gdG9faW9hdF9jaGFuKGNoYW4pOwotCWRtYV9jb29raWVfdCBsYXN0X3VzZWQ7Ci0JZG1hX2Nvb2tpZV90IGxhc3RfY29tcGxldGU7Ci0JZW51bSBkbWFfc3RhdHVzIHJldDsKLQotCWxhc3RfdXNlZCA9IGNoYW4tPmNvb2tpZTsKLQlsYXN0X2NvbXBsZXRlID0gaW9hdF9jaGFuLT5jb21wbGV0ZWRfY29va2llOwotCWlvYXRfY2hhbi0+d2F0Y2hkb2dfdGNwX2Nvb2tpZSA9IGNvb2tpZTsKLQotCWlmIChkb25lKQotCQkqZG9uZSA9IGxhc3RfY29tcGxldGU7Ci0JaWYgKHVzZWQpCi0JCSp1c2VkID0gbGFzdF91c2VkOwotCi0JcmV0ID0gZG1hX2FzeW5jX2lzX2NvbXBsZXRlKGNvb2tpZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkKTsKLQlpZiAocmV0ID09IERNQV9TVUNDRVNTKQotCQlyZXR1cm4gcmV0OwotCi0JaW9hdF9kbWFfbWVtY3B5X2NsZWFudXAoaW9hdF9jaGFuKTsKLQotCWxhc3RfdXNlZCA9IGNoYW4tPmNvb2tpZTsKLQlsYXN0X2NvbXBsZXRlID0gaW9hdF9jaGFuLT5jb21wbGV0ZWRfY29va2llOwotCi0JaWYgKGRvbmUpCi0JCSpkb25lID0gbGFzdF9jb21wbGV0ZTsKLQlpZiAodXNlZCkKLQkJKnVzZWQgPSBsYXN0X3VzZWQ7Ci0KLQlyZXR1cm4gZG1hX2FzeW5jX2lzX2NvbXBsZXRlKGNvb2tpZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkKTsKLX0KLQotc3RhdGljIHZvaWQgaW9hdF9kbWFfc3RhcnRfbnVsbF9kZXNjKHN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4pCi17Ci0Jc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYzsKLQotCXNwaW5fbG9ja19iaCgmaW9hdF9jaGFuLT5kZXNjX2xvY2spOwotCi0JZGVzYyA9IGlvYXRfZG1hX2dldF9uZXh0X2Rlc2NyaXB0b3IoaW9hdF9jaGFuKTsKLQotCWlmICghZGVzYykgewotCQlkZXZfZXJyKCZpb2F0X2NoYW4tPmRldmljZS0+cGRldi0+ZGV2LAotCQkJIlVuYWJsZSB0byBzdGFydCBudWxsIGRlc2MgLSBnZXQgbmV4dCBkZXNjIGZhaWxlZFxuIik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZXNjLT5ody0+Y3RsID0gSU9BVF9ETUFfREVTQ1JJUFRPUl9OVUwKLQkJCQl8IElPQVRfRE1BX0RFU0NSSVBUT1JfQ1RMX0lOVF9HTgotCQkJCXwgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfQ1BfU1RTOwotCS8qIHNldCBzaXplIHRvIG5vbi16ZXJvIHZhbHVlIChjaGFubmVsIHJldHVybnMgZXJyb3Igd2hlbiBzaXplIGlzIDApICovCi0JZGVzYy0+aHctPnNpemUgPSBOVUxMX0RFU0NfQlVGRkVSX1NJWkU7Ci0JZGVzYy0+aHctPnNyY19hZGRyID0gMDsKLQlkZXNjLT5ody0+ZHN0X2FkZHIgPSAwOwotCWFzeW5jX3R4X2FjaygmZGVzYy0+YXN5bmNfdHgpOwotCXN3aXRjaCAoaW9hdF9jaGFuLT5kZXZpY2UtPnZlcnNpb24pIHsKLQljYXNlIElPQVRfVkVSXzFfMjoKLQkJZGVzYy0+aHctPm5leHQgPSAwOwotCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5ub2RlLCAmaW9hdF9jaGFuLT51c2VkX2Rlc2MpOwotCi0JCXdyaXRlbCgoKHU2NCkgZGVzYy0+YXN5bmNfdHgucGh5cykgJiAweDAwMDAwMDAwRkZGRkZGRkYsCi0JCSAgICAgICBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVDFfQ0hBSU5BRERSX09GRlNFVF9MT1cpOwotCQl3cml0ZWwoKCh1NjQpIGRlc2MtPmFzeW5jX3R4LnBoeXMpID4+IDMyLAotCQkgICAgICAgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVQxX0NIQUlOQUREUl9PRkZTRVRfSElHSCk7Ci0KLQkJd3JpdGViKElPQVRfQ0hBTkNNRF9TVEFSVCwgaW9hdF9jaGFuLT5yZWdfYmFzZQotCQkJKyBJT0FUX0NIQU5DTURfT0ZGU0VUKGlvYXRfY2hhbi0+ZGV2aWNlLT52ZXJzaW9uKSk7Ci0JCWJyZWFrOwotCWNhc2UgSU9BVF9WRVJfMl8wOgotCWNhc2UgSU9BVF9WRVJfM18wOgotCQl3cml0ZWwoKCh1NjQpIGRlc2MtPmFzeW5jX3R4LnBoeXMpICYgMHgwMDAwMDAwMEZGRkZGRkZGLAotCQkgICAgICAgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVQyX0NIQUlOQUREUl9PRkZTRVRfTE9XKTsKLQkJd3JpdGVsKCgodTY0KSBkZXNjLT5hc3luY190eC5waHlzKSA+PiAzMiwKLQkJICAgICAgIGlvYXRfY2hhbi0+cmVnX2Jhc2UgKyBJT0FUMl9DSEFJTkFERFJfT0ZGU0VUX0hJR0gpOwotCi0JCWlvYXRfY2hhbi0+ZG1hY291bnQrKzsKLQkJX19pb2F0Ml9kbWFfbWVtY3B5X2lzc3VlX3BlbmRpbmcoaW9hdF9jaGFuKTsKLQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmRlc2NfbG9jayk7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGEgSU9BVCB0cmFuc2FjdGlvbiB0byB2ZXJpZnkgdGhlIEhXIHdvcmtzLgotICovCi0jZGVmaW5lIElPQVRfVEVTVF9TSVpFIDIwMDAKLQotc3RhdGljIHZvaWQgaW9hdF9kbWFfdGVzdF9jYWxsYmFjayh2b2lkICpkbWFfYXN5bmNfcGFyYW0pCi17Ci0Jc3RydWN0IGNvbXBsZXRpb24gKmNtcCA9IGRtYV9hc3luY19wYXJhbTsKLQotCWNvbXBsZXRlKGNtcCk7Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfc2VsZl90ZXN0IC0gUGVyZm9ybSBhIElPQVQgdHJhbnNhY3Rpb24gdG8gdmVyaWZ5IHRoZSBIVyB3b3Jrcy4KLSAqIEBkZXZpY2U6IGRldmljZSB0byBiZSB0ZXN0ZWQKLSAqLwotc3RhdGljIGludCBpb2F0X2RtYV9zZWxmX3Rlc3Qoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpCi17Ci0JaW50IGk7Ci0JdTggKnNyYzsKLQl1OCAqZGVzdDsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7Ci0JZG1hX2FkZHJfdCBkbWFfZGVzdCwgZG1hX3NyYzsKLQlkbWFfY29va2llX3QgY29va2llOwotCWludCBlcnIgPSAwOwotCXN0cnVjdCBjb21wbGV0aW9uIGNtcDsKLQl1bnNpZ25lZCBsb25nIHRtbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3JjID0ga3phbGxvYyhzaXplb2YodTgpICogSU9BVF9URVNUX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghc3JjKQotCQlyZXR1cm4gLUVOT01FTTsKLQlkZXN0ID0ga3phbGxvYyhzaXplb2YodTgpICogSU9BVF9URVNUX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghZGVzdCkgewotCQlrZnJlZShzcmMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBGaWxsIGluIHNyYyBidWZmZXIgKi8KLQlmb3IgKGkgPSAwOyBpIDwgSU9BVF9URVNUX1NJWkU7IGkrKykKLQkJc3JjW2ldID0gKHU4KWk7Ci0KLQkvKiBTdGFydCBjb3B5LCB1c2luZyBmaXJzdCBETUEgY2hhbm5lbCAqLwotCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRldmljZS0+Y29tbW9uLmNoYW5uZWxzLm5leHQsCi0JCQkJc3RydWN0IGRtYV9jaGFuLAotCQkJCWRldmljZV9ub2RlKTsKLQlpZiAoZGV2aWNlLT5jb21tb24uZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuKSA8IDEpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5wZGV2LT5kZXYsCi0JCQkic2VsZnRlc3QgY2Fubm90IGFsbG9jYXRlIGNoYW4gcmVzb3VyY2VcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkbWFfc3JjID0gZG1hX21hcF9zaW5nbGUoZG1hX2NoYW4tPmRldmljZS0+ZGV2LCBzcmMsIElPQVRfVEVTVF9TSVpFLAotCQkJCSBETUFfVE9fREVWSUNFKTsKLQlkbWFfZGVzdCA9IGRtYV9tYXBfc2luZ2xlKGRtYV9jaGFuLT5kZXZpY2UtPmRldiwgZGVzdCwgSU9BVF9URVNUX1NJWkUsCi0JCQkJICBETUFfRlJPTV9ERVZJQ0UpOwotCWZsYWdzID0gRE1BX0NPTVBMX1NSQ19VTk1BUF9TSU5HTEUgfCBETUFfQ09NUExfREVTVF9VTk1BUF9TSU5HTEU7Ci0JdHggPSBkZXZpY2UtPmNvbW1vbi5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5KGRtYV9jaGFuLCBkbWFfZGVzdCwgZG1hX3NyYywKLQkJCQkJCSAgIElPQVRfVEVTVF9TSVpFLCBmbGFncyk7Ci0JaWYgKCF0eCkgewotCQlkZXZfZXJyKCZkZXZpY2UtPnBkZXYtPmRldiwKLQkJCSJTZWxmLXRlc3QgcHJlcCBmYWlsZWQsIGRpc2FibGluZ1xuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZnJlZV9yZXNvdXJjZXM7Ci0JfQotCi0JYXN5bmNfdHhfYWNrKHR4KTsKLQlpbml0X2NvbXBsZXRpb24oJmNtcCk7Ci0JdHgtPmNhbGxiYWNrID0gaW9hdF9kbWFfdGVzdF9jYWxsYmFjazsKLQl0eC0+Y2FsbGJhY2tfcGFyYW0gPSAmY21wOwotCWNvb2tpZSA9IHR4LT50eF9zdWJtaXQodHgpOwotCWlmIChjb29raWUgPCAwKSB7Ci0JCWRldl9lcnIoJmRldmljZS0+cGRldi0+ZGV2LAotCQkJIlNlbGYtdGVzdCBzZXR1cCBmYWlsZWQsIGRpc2FibGluZ1xuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZnJlZV9yZXNvdXJjZXM7Ci0JfQotCWRldmljZS0+Y29tbW9uLmRldmljZV9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKLQotCXRtbyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY21wLCBtc2Vjc190b19qaWZmaWVzKDMwMDApKTsKLQotCWlmICh0bW8gPT0gMCB8fAotCSAgICBkZXZpY2UtPmNvbW1vbi5kZXZpY2VfaXNfdHhfY29tcGxldGUoZG1hX2NoYW4sIGNvb2tpZSwgTlVMTCwgTlVMTCkKLQkJCQkJIT0gRE1BX1NVQ0NFU1MpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5wZGV2LT5kZXYsCi0JCQkiU2VsZi10ZXN0IGNvcHkgdGltZWQgb3V0LCBkaXNhYmxpbmdcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVzb3VyY2VzOwotCX0KLQlpZiAobWVtY21wKHNyYywgZGVzdCwgSU9BVF9URVNUX1NJWkUpKSB7Ci0JCWRldl9lcnIoJmRldmljZS0+cGRldi0+ZGV2LAotCQkJIlNlbGYtdGVzdCBjb3B5IGZhaWxlZCBjb21wYXJlLCBkaXNhYmxpbmdcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVzb3VyY2VzOwotCX0KLQotZnJlZV9yZXNvdXJjZXM6Ci0JZGV2aWNlLT5jb21tb24uZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pOwotb3V0OgotCWtmcmVlKHNyYyk7Ci0Ja2ZyZWUoZGVzdCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGNoYXIgaW9hdF9pbnRlcnJ1cHRfc3R5bGVbMzJdID0gIm1zaXgiOwotbW9kdWxlX3BhcmFtX3N0cmluZyhpb2F0X2ludGVycnVwdF9zdHlsZSwgaW9hdF9pbnRlcnJ1cHRfc3R5bGUsCi0JCSAgICBzaXplb2YoaW9hdF9pbnRlcnJ1cHRfc3R5bGUpLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaW9hdF9pbnRlcnJ1cHRfc3R5bGUsCi0JCSAic2V0IGlvYXQgaW50ZXJydXB0IHN0eWxlOiBtc2l4IChkZWZhdWx0KSwgIgotCQkgIm1zaXgtc2luZ2xlLXZlY3RvciwgbXNpLCBpbnR4KSIpOwotCi0vKioKLSAqIGlvYXRfZG1hX3NldHVwX2ludGVycnVwdHMgLSBzZXR1cCBpbnRlcnJ1cHQgaGFuZGxlcgotICogQGRldmljZTogaW9hdCBkZXZpY2UKLSAqLwotc3RhdGljIGludCBpb2F0X2RtYV9zZXR1cF9pbnRlcnJ1cHRzKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW47Ci0JaW50IGVyciwgaSwgaiwgbXNpeGNudDsKLQl1OCBpbnRyY3RybCA9IDA7Ci0KLQlpZiAoIXN0cmNtcChpb2F0X2ludGVycnVwdF9zdHlsZSwgIm1zaXgiKSkKLQkJZ290byBtc2l4OwotCWlmICghc3RyY21wKGlvYXRfaW50ZXJydXB0X3N0eWxlLCAibXNpeC1zaW5nbGUtdmVjdG9yIikpCi0JCWdvdG8gbXNpeF9zaW5nbGVfdmVjdG9yOwotCWlmICghc3RyY21wKGlvYXRfaW50ZXJydXB0X3N0eWxlLCAibXNpIikpCi0JCWdvdG8gbXNpOwotCWlmICghc3RyY21wKGlvYXRfaW50ZXJydXB0X3N0eWxlLCAiaW50eCIpKQotCQlnb3RvIGludHg7Ci0JZGV2X2VycigmZGV2aWNlLT5wZGV2LT5kZXYsICJpbnZhbGlkIGlvYXRfaW50ZXJydXB0X3N0eWxlICVzXG4iLAotCQlpb2F0X2ludGVycnVwdF9zdHlsZSk7Ci0JZ290byBlcnJfbm9faXJxOwotCi1tc2l4OgotCS8qIFRoZSBudW1iZXIgb2YgTVNJLVggdmVjdG9ycyBzaG91bGQgZXF1YWwgdGhlIG51bWJlciBvZiBjaGFubmVscyAqLwotCW1zaXhjbnQgPSBkZXZpY2UtPmNvbW1vbi5jaGFuY250OwotCWZvciAoaSA9IDA7IGkgPCBtc2l4Y250OyBpKyspCi0JCWRldmljZS0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKLQotCWVyciA9IHBjaV9lbmFibGVfbXNpeChkZXZpY2UtPnBkZXYsIGRldmljZS0+bXNpeF9lbnRyaWVzLCBtc2l4Y250KTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBtc2k7Ci0JaWYgKGVyciA+IDApCi0JCWdvdG8gbXNpeF9zaW5nbGVfdmVjdG9yOwotCi0JZm9yIChpID0gMDsgaSA8IG1zaXhjbnQ7IGkrKykgewotCQlpb2F0X2NoYW4gPSBpb2F0X2xvb2t1cF9jaGFuX2J5X2luZGV4KGRldmljZSwgaSk7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKGRldmljZS0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKLQkJCQkgIGlvYXRfZG1hX2RvX2ludGVycnVwdF9tc2l4LAotCQkJCSAgMCwgImlvYXQtbXNpeCIsIGlvYXRfY2hhbik7Ci0JCWlmIChlcnIpIHsKLQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQlpb2F0X2NoYW4gPQotCQkJCQlpb2F0X2xvb2t1cF9jaGFuX2J5X2luZGV4KGRldmljZSwgaik7Ci0JCQkJZnJlZV9pcnEoZGV2aWNlLT5tc2l4X2VudHJpZXNbal0udmVjdG9yLAotCQkJCQkgaW9hdF9jaGFuKTsKLQkJCX0KLQkJCWdvdG8gbXNpeF9zaW5nbGVfdmVjdG9yOwotCQl9Ci0JfQotCWludHJjdHJsIHw9IElPQVRfSU5UUkNUUkxfTVNJWF9WRUNUT1JfQ09OVFJPTDsKLQlkZXZpY2UtPmlycV9tb2RlID0gbXNpeF9tdWx0aV92ZWN0b3I7Ci0JZ290byBkb25lOwotCi1tc2l4X3NpbmdsZV92ZWN0b3I6Ci0JZGV2aWNlLT5tc2l4X2VudHJpZXNbMF0uZW50cnkgPSAwOwotCWVyciA9IHBjaV9lbmFibGVfbXNpeChkZXZpY2UtPnBkZXYsIGRldmljZS0+bXNpeF9lbnRyaWVzLCAxKTsKLQlpZiAoZXJyKQotCQlnb3RvIG1zaTsKLQotCWVyciA9IHJlcXVlc3RfaXJxKGRldmljZS0+bXNpeF9lbnRyaWVzWzBdLnZlY3RvciwgaW9hdF9kbWFfZG9faW50ZXJydXB0LAotCQkJICAwLCAiaW9hdC1tc2l4IiwgZGV2aWNlKTsKLQlpZiAoZXJyKSB7Ci0JCXBjaV9kaXNhYmxlX21zaXgoZGV2aWNlLT5wZGV2KTsKLQkJZ290byBtc2k7Ci0JfQotCWRldmljZS0+aXJxX21vZGUgPSBtc2l4X3NpbmdsZV92ZWN0b3I7Ci0JZ290byBkb25lOwotCi1tc2k6Ci0JZXJyID0gcGNpX2VuYWJsZV9tc2koZGV2aWNlLT5wZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGludHg7Ci0KLQllcnIgPSByZXF1ZXN0X2lycShkZXZpY2UtPnBkZXYtPmlycSwgaW9hdF9kbWFfZG9faW50ZXJydXB0LAotCQkJICAwLCAiaW9hdC1tc2kiLCBkZXZpY2UpOwotCWlmIChlcnIpIHsKLQkJcGNpX2Rpc2FibGVfbXNpKGRldmljZS0+cGRldik7Ci0JCWdvdG8gaW50eDsKLQl9Ci0JLyoKLQkgKiBDQiAxLjIgZGV2aWNlcyBuZWVkIGEgYml0IHNldCBpbiBjb25maWd1cmF0aW9uIHNwYWNlIHRvIGVuYWJsZSBNU0kKLQkgKi8KLQlpZiAoZGV2aWNlLT52ZXJzaW9uID09IElPQVRfVkVSXzFfMikgewotCQl1MzIgZG1hY3RybDsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldmljZS0+cGRldiwKLQkJCQkgICAgICBJT0FUX1BDSV9ETUFDVFJMX09GRlNFVCwgJmRtYWN0cmwpOwotCQlkbWFjdHJsIHw9IElPQVRfUENJX0RNQUNUUkxfTVNJX0VOOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldmljZS0+cGRldiwKLQkJCQkgICAgICAgSU9BVF9QQ0lfRE1BQ1RSTF9PRkZTRVQsIGRtYWN0cmwpOwotCX0KLQlkZXZpY2UtPmlycV9tb2RlID0gbXNpOwotCWdvdG8gZG9uZTsKLQotaW50eDoKLQllcnIgPSByZXF1ZXN0X2lycShkZXZpY2UtPnBkZXYtPmlycSwgaW9hdF9kbWFfZG9faW50ZXJydXB0LAotCQkJICBJUlFGX1NIQVJFRCwgImlvYXQtaW50eCIsIGRldmljZSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfbm9faXJxOwotCWRldmljZS0+aXJxX21vZGUgPSBpbnR4OwotCi1kb25lOgotCWludHJjdHJsIHw9IElPQVRfSU5UUkNUUkxfTUFTVEVSX0lOVF9FTjsKLQl3cml0ZWIoaW50cmN0cmwsIGRldmljZS0+cmVnX2Jhc2UgKyBJT0FUX0lOVFJDVFJMX09GRlNFVCk7Ci0JcmV0dXJuIDA7Ci0KLWVycl9ub19pcnE6Ci0JLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0IGdlbmVyYXRpb24gKi8KLQl3cml0ZWIoMCwgZGV2aWNlLT5yZWdfYmFzZSArIElPQVRfSU5UUkNUUkxfT0ZGU0VUKTsKLQlkZXZfZXJyKCZkZXZpY2UtPnBkZXYtPmRldiwgIm5vIHVzYWJsZSBpbnRlcnJ1cHRzXG4iKTsKLQlkZXZpY2UtPmlycV9tb2RlID0gbm9uZTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qKgotICogaW9hdF9kbWFfcmVtb3ZlX2ludGVycnVwdHMgLSByZW1vdmUgd2hhdGV2ZXIgaW50ZXJydXB0cyB3ZXJlIHNldAotICogQGRldmljZTogaW9hdCBkZXZpY2UKLSAqLwotc3RhdGljIHZvaWQgaW9hdF9kbWFfcmVtb3ZlX2ludGVycnVwdHMoc3RydWN0IGlvYXRkbWFfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlvYXRfY2hhbjsKLQlpbnQgaTsKLQotCS8qIERpc2FibGUgYWxsIGludGVycnVwdCBnZW5lcmF0aW9uICovCi0Jd3JpdGViKDAsIGRldmljZS0+cmVnX2Jhc2UgKyBJT0FUX0lOVFJDVFJMX09GRlNFVCk7Ci0KLQlzd2l0Y2ggKGRldmljZS0+aXJxX21vZGUpIHsKLQljYXNlIG1zaXhfbXVsdGlfdmVjdG9yOgotCQlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5jb21tb24uY2hhbmNudDsgaSsrKSB7Ci0JCQlpb2F0X2NoYW4gPSBpb2F0X2xvb2t1cF9jaGFuX2J5X2luZGV4KGRldmljZSwgaSk7Ci0JCQlmcmVlX2lycShkZXZpY2UtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsIGlvYXRfY2hhbik7Ci0JCX0KLQkJcGNpX2Rpc2FibGVfbXNpeChkZXZpY2UtPnBkZXYpOwotCQlicmVhazsKLQljYXNlIG1zaXhfc2luZ2xlX3ZlY3RvcjoKLQkJZnJlZV9pcnEoZGV2aWNlLT5tc2l4X2VudHJpZXNbMF0udmVjdG9yLCBkZXZpY2UpOwotCQlwY2lfZGlzYWJsZV9tc2l4KGRldmljZS0+cGRldik7Ci0JCWJyZWFrOwotCWNhc2UgbXNpOgotCQlmcmVlX2lycShkZXZpY2UtPnBkZXYtPmlycSwgZGV2aWNlKTsKLQkJcGNpX2Rpc2FibGVfbXNpKGRldmljZS0+cGRldik7Ci0JCWJyZWFrOwotCWNhc2UgaW50eDoKLQkJZnJlZV9pcnEoZGV2aWNlLT5wZGV2LT5pcnEsIGRldmljZSk7Ci0JCWJyZWFrOwotCWNhc2Ugbm9uZToKLQkJZGV2X3dhcm4oJmRldmljZS0+cGRldi0+ZGV2LAotCQkJICJjYWxsIHRvICVzIHdpdGhvdXQgaW50ZXJydXB0cyBzZXR1cFxuIiwgX19mdW5jX18pOwotCX0KLQlkZXZpY2UtPmlycV9tb2RlID0gbm9uZTsKLX0KLQotc3RydWN0IGlvYXRkbWFfZGV2aWNlICppb2F0X2RtYV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgICAgICB2b2lkIF9faW9tZW0gKmlvYmFzZSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlOwotCi0JZGV2aWNlID0ga3phbGxvYyhzaXplb2YoKmRldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghZGV2aWNlKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2t6YWxsb2M7Ci0JfQotCWRldmljZS0+cGRldiA9IHBkZXY7Ci0JZGV2aWNlLT5yZWdfYmFzZSA9IGlvYmFzZTsKLQlkZXZpY2UtPnZlcnNpb24gPSByZWFkYihkZXZpY2UtPnJlZ19iYXNlICsgSU9BVF9WRVJfT0ZGU0VUKTsKLQotCS8qIERNQSBjb2hlcmVudCBtZW1vcnkgcG9vbCBmb3IgRE1BIGRlc2NyaXB0b3IgYWxsb2NhdGlvbnMgKi8KLQlkZXZpY2UtPmRtYV9wb29sID0gcGNpX3Bvb2xfY3JlYXRlKCJkbWFfZGVzY19wb29sIiwgcGRldiwKLQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yKSwKLQkJCQkJICAgNjQsIDApOwotCWlmICghZGV2aWNlLT5kbWFfcG9vbCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9kbWFfcG9vbDsKLQl9Ci0KLQlkZXZpY2UtPmNvbXBsZXRpb25fcG9vbCA9IHBjaV9wb29sX2NyZWF0ZSgiY29tcGxldGlvbl9wb29sIiwgcGRldiwKLQkJCQkJCSAgc2l6ZW9mKHU2NCksIFNNUF9DQUNIRV9CWVRFUywKLQkJCQkJCSAgU01QX0NBQ0hFX0JZVEVTKTsKLQlpZiAoIWRldmljZS0+Y29tcGxldGlvbl9wb29sKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2NvbXBsZXRpb25fcG9vbDsKLQl9Ci0KLQlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5jb21tb24uY2hhbm5lbHMpOwotCWlvYXRfZG1hX2VudW1lcmF0ZV9jaGFubmVscyhkZXZpY2UpOwotCi0JZGV2aWNlLT5jb21tb24uZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzID0KLQkJCQkJCWlvYXRfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzOwotCWRldmljZS0+Y29tbW9uLmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0KLQkJCQkJCWlvYXRfZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXM7Ci0JZGV2aWNlLT5jb21tb24uZGV2ID0gJnBkZXYtPmRldjsKLQotCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGRldmljZS0+Y29tbW9uLmNhcF9tYXNrKTsKLQlkZXZpY2UtPmNvbW1vbi5kZXZpY2VfaXNfdHhfY29tcGxldGUgPSBpb2F0X2RtYV9pc19jb21wbGV0ZTsKLQlzd2l0Y2ggKGRldmljZS0+dmVyc2lvbikgewotCWNhc2UgSU9BVF9WRVJfMV8yOgotCQlkZXZpY2UtPmNvbW1vbi5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5ID0gaW9hdDFfZG1hX3ByZXBfbWVtY3B5OwotCQlkZXZpY2UtPmNvbW1vbi5kZXZpY2VfaXNzdWVfcGVuZGluZyA9Ci0JCQkJCQlpb2F0MV9kbWFfbWVtY3B5X2lzc3VlX3BlbmRpbmc7Ci0JCWJyZWFrOwotCWNhc2UgSU9BVF9WRVJfMl8wOgotCWNhc2UgSU9BVF9WRVJfM18wOgotCQlkZXZpY2UtPmNvbW1vbi5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5ID0gaW9hdDJfZG1hX3ByZXBfbWVtY3B5OwotCQlkZXZpY2UtPmNvbW1vbi5kZXZpY2VfaXNzdWVfcGVuZGluZyA9Ci0JCQkJCQlpb2F0Ml9kbWFfbWVtY3B5X2lzc3VlX3BlbmRpbmc7Ci0JCWJyZWFrOwotCX0KLQotCWRldl9lcnIoJmRldmljZS0+cGRldi0+ZGV2LAotCQkiSW50ZWwoUikgSS9PQVQgRE1BIEVuZ2luZSBmb3VuZCwiCi0JCSIgJWQgY2hhbm5lbHMsIGRldmljZSB2ZXJzaW9uIDB4JTAyeCwgZHJpdmVyIHZlcnNpb24gJXNcbiIsCi0JCWRldmljZS0+Y29tbW9uLmNoYW5jbnQsIGRldmljZS0+dmVyc2lvbiwgSU9BVF9ETUFfVkVSU0lPTik7Ci0KLQlpZiAoIWRldmljZS0+Y29tbW9uLmNoYW5jbnQpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5wZGV2LT5kZXYsCi0JCQkiSW50ZWwoUikgSS9PQVQgRE1BIEVuZ2luZSBwcm9ibGVtIGZvdW5kOiAiCi0JCQkiemVybyBjaGFubmVscyBkZXRlY3RlZFxuIik7Ci0JCWdvdG8gZXJyX3NldHVwX2ludGVycnVwdHM7Ci0JfQotCi0JZXJyID0gaW9hdF9kbWFfc2V0dXBfaW50ZXJydXB0cyhkZXZpY2UpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3NldHVwX2ludGVycnVwdHM7Ci0KLQllcnIgPSBpb2F0X2RtYV9zZWxmX3Rlc3QoZGV2aWNlKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9zZWxmX3Rlc3Q7Ci0KLQlpb2F0X3NldF90Y3BfY29weV9icmVhayhkZXZpY2UpOwotCi0JZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcigmZGV2aWNlLT5jb21tb24pOwotCi0JaWYgKGRldmljZS0+dmVyc2lvbiAhPSBJT0FUX1ZFUl8zXzApIHsKLQkJSU5JVF9ERUxBWUVEX1dPUksoJmRldmljZS0+d29yaywgaW9hdF9kbWFfY2hhbl93YXRjaGRvZyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2aWNlLT53b3JrLAotCQkJCSAgICAgIFdBVENIRE9HX0RFTEFZKTsKLQl9Ci0KLQlyZXR1cm4gZGV2aWNlOwotCi1lcnJfc2VsZl90ZXN0OgotCWlvYXRfZG1hX3JlbW92ZV9pbnRlcnJ1cHRzKGRldmljZSk7Ci1lcnJfc2V0dXBfaW50ZXJydXB0czoKLQlwY2lfcG9vbF9kZXN0cm95KGRldmljZS0+Y29tcGxldGlvbl9wb29sKTsKLWVycl9jb21wbGV0aW9uX3Bvb2w6Ci0JcGNpX3Bvb2xfZGVzdHJveShkZXZpY2UtPmRtYV9wb29sKTsKLWVycl9kbWFfcG9vbDoKLQlrZnJlZShkZXZpY2UpOwotZXJyX2t6YWxsb2M6Ci0JZGV2X2VycigmcGRldi0+ZGV2LAotCQkiSW50ZWwoUikgSS9PQVQgRE1BIEVuZ2luZSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwotCXJldHVybiBOVUxMOwotfQotCi12b2lkIGlvYXRfZG1hX3JlbW92ZShzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsKLQlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuOwotCi0JaWYgKGRldmljZS0+dmVyc2lvbiAhPSBJT0FUX1ZFUl8zXzApCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRldmljZS0+d29yayk7Ci0KLQlpb2F0X2RtYV9yZW1vdmVfaW50ZXJydXB0cyhkZXZpY2UpOwotCi0JZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZkZXZpY2UtPmNvbW1vbik7Ci0KLQlwY2lfcG9vbF9kZXN0cm95KGRldmljZS0+ZG1hX3Bvb2wpOwotCXBjaV9wb29sX2Rlc3Ryb3koZGV2aWNlLT5jb21wbGV0aW9uX3Bvb2wpOwotCi0JaW91bm1hcChkZXZpY2UtPnJlZ19iYXNlKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKGRldmljZS0+cGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKGRldmljZS0+cGRldik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbiwgX2NoYW4sCi0JCQkJICZkZXZpY2UtPmNvbW1vbi5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKLQkJaW9hdF9jaGFuID0gdG9faW9hdF9jaGFuKGNoYW4pOwotCQlsaXN0X2RlbCgmY2hhbi0+ZGV2aWNlX25vZGUpOwotCQlrZnJlZShpb2F0X2NoYW4pOwotCX0KLQlrZnJlZShkZXZpY2UpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pb2F0ZG1hLmggYi9kcml2ZXJzL2RtYS9pb2F0ZG1hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MmZmNGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9kbWEvaW9hdGRtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQoYykgMjAwNCAtIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBDT1BZSU5HLgotICovCi0jaWZuZGVmIElPQVRETUFfSAotI2RlZmluZSBJT0FURE1BX0gKLQotI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgotI2luY2x1ZGUgImlvYXRkbWFfaHcuaCIKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgotI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLQotI2RlZmluZSBJT0FUX0RNQV9WRVJTSU9OICAiMy42NCIKLQotZW51bSBpb2F0X2ludGVycnVwdCB7Ci0Jbm9uZSA9IDAsCi0JbXNpeF9tdWx0aV92ZWN0b3IgPSAxLAotCW1zaXhfc2luZ2xlX3ZlY3RvciA9IDIsCi0JbXNpID0gMywKLQlpbnR4ID0gNCwKLX07Ci0KLSNkZWZpbmUgSU9BVF9MT1dfQ09NUExFVElPTl9NQVNLCTB4ZmZmZmZmYzAKLSNkZWZpbmUgSU9BVF9ETUFfRENBX0FOWV9DUFUJCX4wCi0jZGVmaW5lIElPQVRfV0FUQ0hET0dfUEVSSU9ECQkoMiAqIEhaKQotCi0KLS8qKgotICogc3RydWN0IGlvYXRkbWFfZGV2aWNlIC0gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBJT0FUIGRldmljZQotICogQHBkZXY6IFBDSS1FeHByZXNzIGRldmljZQotICogQHJlZ19iYXNlOiBNTUlPIHJlZ2lzdGVyIHNwYWNlIGJhc2UgYWRkcmVzcwotICogQGRtYV9wb29sOiBmb3IgYWxsb2NhdGluZyBETUEgZGVzY3JpcHRvcnMKLSAqIEBjb21tb246IGVtYmVkZGVkIHN0cnVjdCBkbWFfZGV2aWNlCi0gKiBAdmVyc2lvbjogdmVyc2lvbiBvZiBpb2F0ZG1hIGRldmljZQotICogQGlycV9tb2RlOiB3aGljaCBzdHlsZSBpcnEgdG8gdXNlCi0gKiBAbXNpeF9lbnRyaWVzOiBpcnEgaGFuZGxlcnMKLSAqIEBpZHg6IHBlciBjaGFubmVsIGRhdGEKLSAqLwotCi1zdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7Ci0Jc3RydWN0IHBjaV9wb29sICpkbWFfcG9vbDsKLQlzdHJ1Y3QgcGNpX3Bvb2wgKmNvbXBsZXRpb25fcG9vbDsKLQlzdHJ1Y3QgZG1hX2RldmljZSBjb21tb247Ci0JdTggdmVyc2lvbjsKLQllbnVtIGlvYXRfaW50ZXJydXB0IGlycV9tb2RlOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKLQlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbNF07Ci0Jc3RydWN0IGlvYXRfZG1hX2NoYW4gKmlkeFs0XTsKLX07Ci0KLS8qKgotICogc3RydWN0IGlvYXRfZG1hX2NoYW4gLSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIERNQSBjaGFubmVsCi0gKi8KLXN0cnVjdCBpb2F0X2RtYV9jaGFuIHsKLQotCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7Ci0KLQlkbWFfY29va2llX3QgY29tcGxldGVkX2Nvb2tpZTsKLQl1bnNpZ25lZCBsb25nIGxhc3RfY29tcGxldGlvbjsKLQl1bnNpZ25lZCBsb25nIGxhc3RfY29tcGxldGlvbl90aW1lOwotCi0Jc2l6ZV90IHhmZXJjYXA7CS8qIFhGRVJDQVAgcmVnaXN0ZXIgdmFsdWUgZXhwYW5kZWQgb3V0ICovCi0KLQlzcGlubG9ja190IGNsZWFudXBfbG9jazsKLQlzcGlubG9ja190IGRlc2NfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZGVzYzsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHVzZWRfZGVzYzsKLQl1bnNpZ25lZCBsb25nIHdhdGNoZG9nX2NvbXBsZXRpb247Ci0JaW50IHdhdGNoZG9nX3RjcF9jb29raWU7Ci0JdTMyIHdhdGNoZG9nX2xhc3RfdGNwX2Nvb2tpZTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7Ci0KLQlpbnQgcGVuZGluZzsKLQlpbnQgZG1hY291bnQ7Ci0JaW50IGRlc2Njb3VudDsKLQotCXN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlOwotCXN0cnVjdCBkbWFfY2hhbiBjb21tb247Ci0KLQlkbWFfYWRkcl90IGNvbXBsZXRpb25fYWRkcjsKLQl1bmlvbiB7Ci0JCXU2NCBmdWxsOyAvKiBIVyBjb21wbGV0aW9uIHdyaXRlYmFjayAqLwotCQlzdHJ1Y3QgewotCQkJdTMyIGxvdzsKLQkJCXUzMiBoaWdoOwotCQl9OwotCX0gKmNvbXBsZXRpb25fdmlydDsKLQl1bnNpZ25lZCBsb25nIGxhc3RfY29tcGxfZGVzY19hZGRyX2h3OwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBjbGVhbnVwX3Rhc2s7Ci19OwotCi0vKiB3cmFwcGVyIGFyb3VuZCBoYXJkd2FyZSBkZXNjcmlwdG9yIGZvcm1hdCArIGFkZGl0aW9uYWwgc29mdHdhcmUgZmllbGRzICovCi0KLS8qKgotICogc3RydWN0IGlvYXRfZGVzY19zdyAtIHdyYXBwZXIgYXJvdW5kIGhhcmR3YXJlIGRlc2NyaXB0b3IKLSAqIEBodzogaGFyZHdhcmUgRE1BIGRlc2NyaXB0b3IKLSAqIEBub2RlOiB0aGlzIGRlc2NyaXB0b3Igd2lsbCBlaXRoZXIgYmUgb24gdGhlIGZyZWUgbGlzdCwKLSAqICAgICBvciBhdHRhY2hlZCB0byBhIHRyYW5zYWN0aW9uIGxpc3QgKGFzeW5jX3R4LnR4X2xpc3QpCi0gKiBAdHhfY250OiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uCi0gKiBAYXN5bmNfdHg6IHRoZSBnZW5lcmljIHNvZnR3YXJlIGRlc2NyaXB0b3IgZm9yIGFsbCBlbmdpbmVzCi0gKi8KLXN0cnVjdCBpb2F0X2Rlc2Nfc3cgewotCXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yICpodzsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci0JaW50IHR4X2NudDsKLQlzaXplX3QgbGVuOwotCWRtYV9hZGRyX3Qgc3JjOwotCWRtYV9hZGRyX3QgZHN0OwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciBhc3luY190eDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpb2F0X3NldF90Y3BfY29weV9icmVhayhzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmRldikKLXsKLQkjaWZkZWYgQ09ORklHX05FVF9ETUEKLQlzd2l0Y2ggKGRldi0+dmVyc2lvbikgewotCWNhc2UgSU9BVF9WRVJfMV8yOgotCQlzeXNjdGxfdGNwX2RtYV9jb3B5YnJlYWsgPSA0MDk2OwotCQlicmVhazsKLQljYXNlIElPQVRfVkVSXzJfMDoKLQkJc3lzY3RsX3RjcF9kbWFfY29weWJyZWFrID0gMjA0ODsKLQkJYnJlYWs7Ci0JY2FzZSBJT0FUX1ZFUl8zXzA6Ci0JCXN5c2N0bF90Y3BfZG1hX2NvcHlicmVhayA9IDI2MjE0NDsKLQkJYnJlYWs7Ci0JfQotCSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfSU5URUxfSU9BVERNQSkgfHwgZGVmaW5lZChDT05GSUdfSU5URUxfSU9BVERNQV9NT0RVTEUpCi1zdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmlvYXRfZG1hX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSAgICAgIHZvaWQgX19pb21lbSAqaW9iYXNlKTsKLXZvaWQgaW9hdF9kbWFfcmVtb3ZlKHN0cnVjdCBpb2F0ZG1hX2RldmljZSAqZGV2aWNlKTsKLXN0cnVjdCBkY2FfcHJvdmlkZXIgKmlvYXRfZGNhX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9iYXNlKTsKLXN0cnVjdCBkY2FfcHJvdmlkZXIgKmlvYXQyX2RjYV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKmlvYmFzZSk7Ci1zdHJ1Y3QgZGNhX3Byb3ZpZGVyICppb2F0M19kY2FfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICppb2Jhc2UpOwotI2Vsc2UKLSNkZWZpbmUgaW9hdF9kbWFfcHJvYmUocGRldiwgaW9iYXNlKSAgICBOVUxMCi0jZGVmaW5lIGlvYXRfZG1hX3JlbW92ZShkZXZpY2UpICAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBpb2F0X2RjYV9pbml0KHBkZXYsIGlvYmFzZSkJTlVMTAotI2RlZmluZSBpb2F0Ml9kY2FfaW5pdChwZGV2LCBpb2Jhc2UpCU5VTEwKLSNkZWZpbmUgaW9hdDNfZGNhX2luaXQocGRldiwgaW9iYXNlKQlOVUxMCi0jZW5kaWYKLQotI2VuZGlmIC8qIElPQVRETUFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdGRtYV9ody5oIGIvZHJpdmVycy9kbWEvaW9hdGRtYV9ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1N2VlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZG1hL2lvYXRkbWFfaHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQoYykgMjAwNCAtIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBDT1BZSU5HLgotICovCi0jaWZuZGVmIF9JT0FUX0hXX0hfCi0jZGVmaW5lIF9JT0FUX0hXX0hfCi0KLS8qIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlIFZhbHVlcyAqLwotI2RlZmluZSBJT0FUX1BDSV9WSUQgICAgICAgICAgICAweDgwODYKLQotLyogQ0IgZGV2aWNlIElEJ3MgKi8KLSNkZWZpbmUgSU9BVF9QQ0lfRElEXzUwMDAgICAgICAgMHgxQTM4Ci0jZGVmaW5lIElPQVRfUENJX0RJRF9DTkIgICAgICAgIDB4MzYwQgotI2RlZmluZSBJT0FUX1BDSV9ESURfU0NOQiAgICAgICAweDY1RkYKLSNkZWZpbmUgSU9BVF9QQ0lfRElEX1NOQiAgICAgICAgMHg0MDJGCi0KLSNkZWZpbmUgSU9BVF9QQ0lfUklEICAgICAgICAgICAgMHgwMAotI2RlZmluZSBJT0FUX1BDSV9TVklEICAgICAgICAgICAweDgwODYKLSNkZWZpbmUgSU9BVF9QQ0lfU0lEICAgICAgICAgICAgMHg4MDg2Ci0jZGVmaW5lIElPQVRfVkVSXzFfMiAgICAgICAgICAgIDB4MTIgICAgLyogVmVyc2lvbiAxLjIgKi8KLSNkZWZpbmUgSU9BVF9WRVJfMl8wICAgICAgICAgICAgMHgyMCAgICAvKiBWZXJzaW9uIDIuMCAqLwotI2RlZmluZSBJT0FUX1ZFUl8zXzAgICAgICAgICAgICAweDMwICAgIC8qIFZlcnNpb24gMy4wICovCi0KLXN0cnVjdCBpb2F0X2RtYV9kZXNjcmlwdG9yIHsKLQl1aW50MzJfdAlzaXplOwotCXVpbnQzMl90CWN0bDsKLQl1aW50NjRfdAlzcmNfYWRkcjsKLQl1aW50NjRfdAlkc3RfYWRkcjsKLQl1aW50NjRfdAluZXh0OwotCXVpbnQ2NF90CXJzdjE7Ci0JdWludDY0X3QJcnN2MjsKLQl1aW50NjRfdAl1c2VyMTsKLQl1aW50NjRfdAl1c2VyMjsKLX07Ci0KLSNkZWZpbmUgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfSU5UX0dOCTB4MDAwMDAwMDEKLSNkZWZpbmUgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfU1JDX1NOCTB4MDAwMDAwMDIKLSNkZWZpbmUgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfRFNUX1NOCTB4MDAwMDAwMDQKLSNkZWZpbmUgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfQ1BfU1RTCTB4MDAwMDAwMDgKLSNkZWZpbmUgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfRlJBTUUJMHgwMDAwMDAxMAotI2RlZmluZSBJT0FUX0RNQV9ERVNDUklQVE9SX05VTAkJMHgwMDAwMDAyMAotI2RlZmluZSBJT0FUX0RNQV9ERVNDUklQVE9SX0NUTF9TUF9CUksJMHgwMDAwMDA0MAotI2RlZmluZSBJT0FUX0RNQV9ERVNDUklQVE9SX0NUTF9EUF9CUksJMHgwMDAwMDA4MAotI2RlZmluZSBJT0FUX0RNQV9ERVNDUklQVE9SX0NUTF9CTkRMCTB4MDAwMDAxMDAKLSNkZWZpbmUgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfRENBCTB4MDAwMDAyMDAKLSNkZWZpbmUgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfQlVGSElOVAkweDAwMDAwNDAwCi0KLSNkZWZpbmUgSU9BVF9ETUFfREVTQ1JJUFRPUl9DVExfT1BDT0RFX0NPTlRFWFQJMHhGRjAwMDAwMAotI2RlZmluZSBJT0FUX0RNQV9ERVNDUklQVE9SX0NUTF9PUENPREVfRE1BCTB4MDAwMDAwMDAKLQotI2RlZmluZSBJT0FUX0RNQV9ERVNDUklQVE9SX0NUTF9DT05URVhUX0RDQQkweDAwMDAwMDAxCi0jZGVmaW5lIElPQVRfRE1BX0RFU0NSSVBUT1JfQ1RMX09QQ09ERV9NQVNLCTB4RkYwMDAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pb3AtYWRtYS5jIGIvZHJpdmVycy9kbWEvaW9wLWFkbWEuYwppbmRleCAyZjA1MjI2Li42NDVjYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pb3AtYWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2lvcC1hZG1hLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2FkbWEuaD4KIApAQCAtNTcsNjUgKzU4LDExMCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQKK2lvcF9kZXNjX3VubWFwKHN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbiwgc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYykKK3sKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ID0gJmRlc2MtPmFzeW5jX3R4OworCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKnVubWFwID0gZGVzYy0+Z3JvdXBfaGVhZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW9wX2NoYW4tPmRldmljZS0+cGRldi0+ZGV2OworCXUzMiBsZW4gPSB1bm1hcC0+dW5tYXBfbGVuOworCWVudW0gZG1hX2N0cmxfZmxhZ3MgZmxhZ3MgPSB0eC0+ZmxhZ3M7CisJdTMyIHNyY19jbnQ7CisJZG1hX2FkZHJfdCBhZGRyOworCWRtYV9hZGRyX3QgZGVzdDsKKworCXNyY19jbnQgPSB1bm1hcC0+dW5tYXBfc3JjX2NudDsKKwlkZXN0ID0gaW9wX2Rlc2NfZ2V0X2Rlc3RfYWRkcih1bm1hcCwgaW9wX2NoYW4pOworCWlmICghKGZsYWdzICYgRE1BX0NPTVBMX1NLSVBfREVTVF9VTk1BUCkpIHsKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCisJCWlmIChzcmNfY250ID4gMSkgLyogaXMgeG9yPyAqLworCQkJZGlyID0gRE1BX0JJRElSRUNUSU9OQUw7CisJCWVsc2UKKwkJCWRpciA9IERNQV9GUk9NX0RFVklDRTsKKworCQlkbWFfdW5tYXBfcGFnZShkZXYsIGRlc3QsIGxlbiwgZGlyKTsKKwl9CisKKwlpZiAoIShmbGFncyAmIERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCkpIHsKKwkJd2hpbGUgKHNyY19jbnQtLSkgeworCQkJYWRkciA9IGlvcF9kZXNjX2dldF9zcmNfYWRkcih1bm1hcCwgaW9wX2NoYW4sIHNyY19jbnQpOworCQkJaWYgKGFkZHIgPT0gZGVzdCkKKwkJCQljb250aW51ZTsKKwkJCWRtYV91bm1hcF9wYWdlKGRldiwgYWRkciwgbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJfQorCX0KKwlkZXNjLT5ncm91cF9oZWFkID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2lvcF9kZXNjX3VubWFwX3BxKHN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbiwgc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYykKK3sKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ID0gJmRlc2MtPmFzeW5jX3R4OworCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKnVubWFwID0gZGVzYy0+Z3JvdXBfaGVhZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW9wX2NoYW4tPmRldmljZS0+cGRldi0+ZGV2OworCXUzMiBsZW4gPSB1bm1hcC0+dW5tYXBfbGVuOworCWVudW0gZG1hX2N0cmxfZmxhZ3MgZmxhZ3MgPSB0eC0+ZmxhZ3M7CisJdTMyIHNyY19jbnQgPSB1bm1hcC0+dW5tYXBfc3JjX2NudDsKKwlkbWFfYWRkcl90IHBkZXN0ID0gaW9wX2Rlc2NfZ2V0X2Rlc3RfYWRkcih1bm1hcCwgaW9wX2NoYW4pOworCWRtYV9hZGRyX3QgcWRlc3QgPSBpb3BfZGVzY19nZXRfcWRlc3RfYWRkcih1bm1hcCwgaW9wX2NoYW4pOworCWludCBpOworCisJaWYgKHR4LT5mbGFncyAmIERNQV9QUkVQX0NPTlRJTlVFKQorCQlzcmNfY250IC09IDM7CisKKwlpZiAoIShmbGFncyAmIERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApICYmICFkZXNjLT5wcV9jaGVja19yZXN1bHQpIHsKKwkJZG1hX3VubWFwX3BhZ2UoZGV2LCBwZGVzdCwgbGVuLCBETUFfQklESVJFQ1RJT05BTCk7CisJCWRtYV91bm1hcF9wYWdlKGRldiwgcWRlc3QsIGxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOworCX0KKworCWlmICghKGZsYWdzICYgRE1BX0NPTVBMX1NLSVBfU1JDX1VOTUFQKSkgeworCQlkbWFfYWRkcl90IGFkZHI7CisKKwkJZm9yIChpID0gMDsgaSA8IHNyY19jbnQ7IGkrKykgeworCQkJYWRkciA9IGlvcF9kZXNjX2dldF9zcmNfYWRkcih1bm1hcCwgaW9wX2NoYW4sIGkpOworCQkJZG1hX3VubWFwX3BhZ2UoZGV2LCBhZGRyLCBsZW4sIERNQV9UT19ERVZJQ0UpOworCQl9CisJCWlmIChkZXNjLT5wcV9jaGVja19yZXN1bHQpIHsKKwkJCWRtYV91bm1hcF9wYWdlKGRldiwgcGRlc3QsIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQlkbWFfdW5tYXBfcGFnZShkZXYsIHFkZXN0LCBsZW4sIERNQV9UT19ERVZJQ0UpOworCQl9CisJfQorCisJZGVzYy0+Z3JvdXBfaGVhZCA9IE5VTEw7Cit9CisKKwogc3RhdGljIGRtYV9jb29raWVfdAogaW9wX2FkbWFfcnVuX3R4X2NvbXBsZXRlX2FjdGlvbnMoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywKIAlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqaW9wX2NoYW4sIGRtYV9jb29raWVfdCBjb29raWUpCiB7Ci0JQlVHX09OKGRlc2MtPmFzeW5jX3R4LmNvb2tpZSA8IDApOwotCWlmIChkZXNjLT5hc3luY190eC5jb29raWUgPiAwKSB7Ci0JCWNvb2tpZSA9IGRlc2MtPmFzeW5jX3R4LmNvb2tpZTsKLQkJZGVzYy0+YXN5bmNfdHguY29va2llID0gMDsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ID0gJmRlc2MtPmFzeW5jX3R4OworCisJQlVHX09OKHR4LT5jb29raWUgPCAwKTsKKwlpZiAodHgtPmNvb2tpZSA+IDApIHsKKwkJY29va2llID0gdHgtPmNvb2tpZTsKKwkJdHgtPmNvb2tpZSA9IDA7CiAKIAkJLyogY2FsbCB0aGUgY2FsbGJhY2sgKG11c3Qgbm90IHNsZWVwIG9yIHN1Ym1pdCBuZXcKIAkJICogb3BlcmF0aW9ucyB0byB0aGlzIGNoYW5uZWwpCiAJCSAqLwotCQlpZiAoZGVzYy0+YXN5bmNfdHguY2FsbGJhY2spCi0JCQlkZXNjLT5hc3luY190eC5jYWxsYmFjaygKLQkJCQlkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbSk7CisJCWlmICh0eC0+Y2FsbGJhY2spCisJCQl0eC0+Y2FsbGJhY2sodHgtPmNhbGxiYWNrX3BhcmFtKTsKIAogCQkvKiB1bm1hcCBkbWEgYWRkcmVzc2VzCiAJCSAqICh1bm1hcF9zaW5nbGUgdnMgdW5tYXBfcGFnZT8pCiAJCSAqLwogCQlpZiAoZGVzYy0+Z3JvdXBfaGVhZCAmJiBkZXNjLT51bm1hcF9sZW4pIHsKLQkJCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKnVubWFwID0gZGVzYy0+Z3JvdXBfaGVhZDsKLQkJCXN0cnVjdCBkZXZpY2UgKmRldiA9Ci0JCQkJJmlvcF9jaGFuLT5kZXZpY2UtPnBkZXYtPmRldjsKLQkJCXUzMiBsZW4gPSB1bm1hcC0+dW5tYXBfbGVuOwotCQkJZW51bSBkbWFfY3RybF9mbGFncyBmbGFncyA9IGRlc2MtPmFzeW5jX3R4LmZsYWdzOwotCQkJdTMyIHNyY19jbnQ7Ci0JCQlkbWFfYWRkcl90IGFkZHI7Ci0JCQlkbWFfYWRkcl90IGRlc3Q7Ci0KLQkJCXNyY19jbnQgPSB1bm1hcC0+dW5tYXBfc3JjX2NudDsKLQkJCWRlc3QgPSBpb3BfZGVzY19nZXRfZGVzdF9hZGRyKHVubWFwLCBpb3BfY2hhbik7Ci0JCQlpZiAoIShmbGFncyAmIERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApKSB7Ci0JCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOwotCi0JCQkJaWYgKHNyY19jbnQgPiAxKSAvKiBpcyB4b3I/ICovCi0JCQkJCWRpciA9IERNQV9CSURJUkVDVElPTkFMOwotCQkJCWVsc2UKLQkJCQkJZGlyID0gRE1BX0ZST01fREVWSUNFOwotCi0JCQkJZG1hX3VubWFwX3BhZ2UoZGV2LCBkZXN0LCBsZW4sIGRpcik7Ci0JCQl9Ci0KLQkJCWlmICghKGZsYWdzICYgRE1BX0NPTVBMX1NLSVBfU1JDX1VOTUFQKSkgewotCQkJCXdoaWxlIChzcmNfY250LS0pIHsKLQkJCQkJYWRkciA9IGlvcF9kZXNjX2dldF9zcmNfYWRkcih1bm1hcCwKLQkJCQkJCQkJICAgICBpb3BfY2hhbiwKLQkJCQkJCQkJICAgICBzcmNfY250KTsKLQkJCQkJaWYgKGFkZHIgPT0gZGVzdCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlkbWFfdW5tYXBfcGFnZShkZXYsIGFkZHIsIGxlbiwKLQkJCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkZXNjLT5ncm91cF9oZWFkID0gTlVMTDsKKwkJCWlmIChpb3BfZGVzY19pc19wcShkZXNjKSkKKwkJCQlpb3BfZGVzY191bm1hcF9wcShpb3BfY2hhbiwgZGVzYyk7CisJCQllbHNlCisJCQkJaW9wX2Rlc2NfdW5tYXAoaW9wX2NoYW4sIGRlc2MpOwogCQl9CiAJfQogCiAJLyogcnVuIGRlcGVuZGVudCBvcGVyYXRpb25zICovCi0JZG1hX3J1bl9kZXBlbmRlbmNpZXMoJmRlc2MtPmFzeW5jX3R4KTsKKwlkbWFfcnVuX2RlcGVuZGVuY2llcyh0eCk7CiAKIAlyZXR1cm4gY29va2llOwogfQpAQCAtMjg3LDcgKzMzMywxMiBAQAogewogCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbiA9IChzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqKSBkYXRhOwogCi0Jc3Bpbl9sb2NrKCZpb3BfY2hhbi0+bG9jayk7CisJLyogbG9ja2RlcCB3aWxsIGZsYWcgZGVwZWRlbmN5IHN1Ym1pc3Npb25zIGFzIHBvdGVudGlhbGx5CisJICogcmVjdXJzaXZlIGxvY2tpbmcsIHRoaXMgaXMgbm90IHRoZSBjYXNlIGFzIGEgZGVwZW5kZW5jeQorCSAqIHN1Ym1pc3Npb24gd2lsbCBuZXZlciByZWN1cnNlIGEgY2hhbm5lbHMgc3VibWl0IHJvdXRpbmUuCisJICogVGhlcmUgYXJlIGNoZWNrcyBpbiBhc3luY190eC5jIHRvIHByZXZlbnQgdGhpcy4KKwkgKi8KKwlzcGluX2xvY2tfbmVzdGVkKCZpb3BfY2hhbi0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwogCV9faW9wX2FkbWFfc2xvdF9jbGVhbnVwKGlvcF9jaGFuKTsKIAlzcGluX3VubG9jaygmaW9wX2NoYW4tPmxvY2spOwogfQpAQCAtMzcwLDcgKzQyMSw3IEBACiAJCQl9CiAJCQlhbGxvY190YWlsLT5ncm91cF9oZWFkID0gYWxsb2Nfc3RhcnQ7CiAJCQlhbGxvY190YWlsLT5hc3luY190eC5jb29raWUgPSAtRUJVU1k7Ci0JCQlsaXN0X3NwbGljZSgmY2hhaW4sICZhbGxvY190YWlsLT5hc3luY190eC50eF9saXN0KTsKKwkJCWxpc3Rfc3BsaWNlKCZjaGFpbiwgJmFsbG9jX3RhaWwtPnR4X2xpc3QpOwogCQkJaW9wX2NoYW4tPmxhc3RfdXNlZCA9IGxhc3RfdXNlZDsKIAkJCWlvcF9kZXNjX2NsZWFyX25leHRfZGVzYyhhbGxvY19zdGFydCk7CiAJCQlpb3BfZGVzY19jbGVhcl9uZXh0X2Rlc2MoYWxsb2NfdGFpbCk7CkBAIC00MjksNyArNDgwLDcgQEAKIAogCW9sZF9jaGFpbl90YWlsID0gbGlzdF9lbnRyeShpb3BfY2hhbi0+Y2hhaW4ucHJldiwKIAkJc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCwgY2hhaW5fbm9kZSk7Ci0JbGlzdF9zcGxpY2VfaW5pdCgmc3dfZGVzYy0+YXN5bmNfdHgudHhfbGlzdCwKKwlsaXN0X3NwbGljZV9pbml0KCZzd19kZXNjLT50eF9saXN0LAogCQkJICZvbGRfY2hhaW5fdGFpbC0+Y2hhaW5fbm9kZSk7CiAKIAkvKiBmaXggdXAgdGhlIGhhcmR3YXJlIGNoYWluICovCkBAIC00OTYsNiArNTQ3LDcgQEAKIAogCQlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KCZzbG90LT5hc3luY190eCwgY2hhbik7CiAJCXNsb3QtPmFzeW5jX3R4LnR4X3N1Ym1pdCA9IGlvcF9hZG1hX3R4X3N1Ym1pdDsKKwkJSU5JVF9MSVNUX0hFQUQoJnNsb3QtPnR4X2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmc2xvdC0+Y2hhaW5fbm9kZSk7CiAJCUlOSVRfTElTVF9IRUFEKCZzbG90LT5zbG90X25vZGUpOwogCQlod19kZXNjID0gKGNoYXIgKikgaW9wX2NoYW4tPmRldmljZS0+ZG1hX2Rlc2NfcG9vbDsKQEAgLTY2MCw5ICs3MTIsOSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKLWlvcF9hZG1hX3ByZXBfZG1hX3plcm9fc3VtKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCAqZG1hX3NyYywKLQkJCSAgIHVuc2lnbmVkIGludCBzcmNfY250LCBzaXplX3QgbGVuLCB1MzIgKnJlc3VsdCwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpb3BfYWRtYV9wcmVwX2RtYV94b3JfdmFsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCAqZG1hX3NyYywKKwkJCSAgdW5zaWduZWQgaW50IHNyY19jbnQsIHNpemVfdCBsZW4sIHUzMiAqcmVzdWx0LAorCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbiA9IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7CiAJc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqc3dfZGVzYywgKmdycF9zdGFydDsKQEAgLTY5Niw2ICs3NDgsMTE4IEBACiAJcmV0dXJuIHN3X2Rlc2MgPyAmc3dfZGVzYy0+YXN5bmNfdHggOiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2lvcF9hZG1hX3ByZXBfZG1hX3BxKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCAqZHN0LCBkbWFfYWRkcl90ICpzcmMsCisJCSAgICAgdW5zaWduZWQgaW50IHNyY19jbnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNjZiwgc2l6ZV90IGxlbiwKKwkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbiA9IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqc3dfZGVzYywgKmc7CisJaW50IHNsb3RfY250LCBzbG90c19wZXJfb3A7CisJaW50IGNvbnRpbnVlX3NyY3M7CisKKwlpZiAodW5saWtlbHkoIWxlbikpCisJCXJldHVybiBOVUxMOworCUJVR19PTihsZW4gPiBJT1BfQURNQV9YT1JfTUFYX0JZVEVfQ09VTlQpOworCisJZGV2X2RiZyhpb3BfY2hhbi0+ZGV2aWNlLT5jb21tb24uZGV2LAorCQkiJXMgc3JjX2NudDogJWQgbGVuOiAldSBmbGFnczogJWx4XG4iLAorCQlfX2Z1bmNfXywgc3JjX2NudCwgbGVuLCBmbGFncyk7CisKKwlpZiAoZG1hZl9wX2Rpc2FibGVkX2NvbnRpbnVlKGZsYWdzKSkKKwkJY29udGludWVfc3JjcyA9IDErc3JjX2NudDsKKwllbHNlIGlmIChkbWFmX2NvbnRpbnVlKGZsYWdzKSkKKwkJY29udGludWVfc3JjcyA9IDMrc3JjX2NudDsKKwllbHNlCisJCWNvbnRpbnVlX3NyY3MgPSAwK3NyY19jbnQ7CisKKwlzcGluX2xvY2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKKwlzbG90X2NudCA9IGlvcF9jaGFuX3BxX3Nsb3RfY291bnQobGVuLCBjb250aW51ZV9zcmNzLCAmc2xvdHNfcGVyX29wKTsKKwlzd19kZXNjID0gaW9wX2FkbWFfYWxsb2Nfc2xvdHMoaW9wX2NoYW4sIHNsb3RfY250LCBzbG90c19wZXJfb3ApOworCWlmIChzd19kZXNjKSB7CisJCWludCBpOworCisJCWcgPSBzd19kZXNjLT5ncm91cF9oZWFkOworCQlpb3BfZGVzY19zZXRfYnl0ZV9jb3VudChnLCBpb3BfY2hhbiwgbGVuKTsKKworCQkvKiBldmVuIGlmIFAgaXMgZGlzYWJsZWQgaXRzIGRlc3RpbmF0aW9uIGFkZHJlc3MgKGJpdHMKKwkJICogWzM6MF0pIG11c3QgbWF0Y2ggUS4gIEl0IGlzIG9rIGlmIFAgcG9pbnRzIHRvIGFuCisJCSAqIGludmFsaWQgYWRkcmVzcywgaXQgd29uJ3QgYmUgd3JpdHRlbi4KKwkJICovCisJCWlmIChmbGFncyAmIERNQV9QUkVQX1BRX0RJU0FCTEVfUCkKKwkJCWRzdFswXSA9IGRzdFsxXSAmIDB4NzsKKworCQlpb3BfZGVzY19zZXRfcHFfYWRkcihnLCBkc3QpOworCQlzd19kZXNjLT51bm1hcF9zcmNfY250ID0gc3JjX2NudDsKKwkJc3dfZGVzYy0+dW5tYXBfbGVuID0gbGVuOworCQlzd19kZXNjLT5hc3luY190eC5mbGFncyA9IGZsYWdzOworCQlmb3IgKGkgPSAwOyBpIDwgc3JjX2NudDsgaSsrKQorCQkJaW9wX2Rlc2Nfc2V0X3BxX3NyY19hZGRyKGcsIGksIHNyY1tpXSwgc2NmW2ldKTsKKworCQkvKiBpZiB3ZSBhcmUgY29udGludWluZyBhIHByZXZpb3VzIG9wZXJhdGlvbiBmYWN0b3IgaW4KKwkJICogdGhlIG9sZCBwIGFuZCBxIHZhbHVlcywgc2VlIHRoZSBjb21tZW50IGZvciBkbWFfbWF4cHEKKwkJICogaW4gaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaAorCQkgKi8KKwkJaWYgKGRtYWZfcF9kaXNhYmxlZF9jb250aW51ZShmbGFncykpCisJCQlpb3BfZGVzY19zZXRfcHFfc3JjX2FkZHIoZywgaSsrLCBkc3RbMV0sIDEpOworCQllbHNlIGlmIChkbWFmX2NvbnRpbnVlKGZsYWdzKSkgeworCQkJaW9wX2Rlc2Nfc2V0X3BxX3NyY19hZGRyKGcsIGkrKywgZHN0WzBdLCAwKTsKKwkJCWlvcF9kZXNjX3NldF9wcV9zcmNfYWRkcihnLCBpKyssIGRzdFsxXSwgMSk7CisJCQlpb3BfZGVzY19zZXRfcHFfc3JjX2FkZHIoZywgaSsrLCBkc3RbMV0sIDApOworCQl9CisJCWlvcF9kZXNjX2luaXRfcHEoZywgaSwgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19iaCgmaW9wX2NoYW4tPmxvY2spOworCisJcmV0dXJuIHN3X2Rlc2MgPyAmc3dfZGVzYy0+YXN5bmNfdHggOiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2lvcF9hZG1hX3ByZXBfZG1hX3BxX3ZhbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgKnBxLCBkbWFfYWRkcl90ICpzcmMsCisJCQkgdW5zaWduZWQgaW50IHNyY19jbnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNjZiwKKwkJCSBzaXplX3QgbGVuLCBlbnVtIHN1bV9jaGVja19mbGFncyAqcHFyZXMsCisJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqaW9wX2NoYW4gPSB0b19pb3BfYWRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKnN3X2Rlc2MsICpnOworCWludCBzbG90X2NudCwgc2xvdHNfcGVyX29wOworCisJaWYgKHVubGlrZWx5KCFsZW4pKQorCQlyZXR1cm4gTlVMTDsKKwlCVUdfT04obGVuID4gSU9QX0FETUFfWE9SX01BWF9CWVRFX0NPVU5UKTsKKworCWRldl9kYmcoaW9wX2NoYW4tPmRldmljZS0+Y29tbW9uLmRldiwgIiVzIHNyY19jbnQ6ICVkIGxlbjogJXVcbiIsCisJCV9fZnVuY19fLCBzcmNfY250LCBsZW4pOworCisJc3Bpbl9sb2NrX2JoKCZpb3BfY2hhbi0+bG9jayk7CisJc2xvdF9jbnQgPSBpb3BfY2hhbl9wcV96ZXJvX3N1bV9zbG90X2NvdW50KGxlbiwgc3JjX2NudCArIDIsICZzbG90c19wZXJfb3ApOworCXN3X2Rlc2MgPSBpb3BfYWRtYV9hbGxvY19zbG90cyhpb3BfY2hhbiwgc2xvdF9jbnQsIHNsb3RzX3Blcl9vcCk7CisJaWYgKHN3X2Rlc2MpIHsKKwkJLyogZm9yIHZhbGlkYXRlIG9wZXJhdGlvbnMgcCBhbmQgcSBhcmUgdGFnZ2VkIG9udG8gdGhlCisJCSAqIGVuZCBvZiB0aGUgc291cmNlIGxpc3QKKwkJICovCisJCWludCBwcV9pZHggPSBzcmNfY250OworCisJCWcgPSBzd19kZXNjLT5ncm91cF9oZWFkOworCQlpb3BfZGVzY19pbml0X3BxX3plcm9fc3VtKGcsIHNyY19jbnQrMiwgZmxhZ3MpOworCQlpb3BfZGVzY19zZXRfcHFfemVyb19zdW1fYnl0ZV9jb3VudChnLCBsZW4pOworCQlnLT5wcV9jaGVja19yZXN1bHQgPSBwcXJlczsKKwkJcHJfZGVidWcoIlx0JXM6IGctPnBxX2NoZWNrX3Jlc3VsdDogJXBcbiIsCisJCQlfX2Z1bmNfXywgZy0+cHFfY2hlY2tfcmVzdWx0KTsKKwkJc3dfZGVzYy0+dW5tYXBfc3JjX2NudCA9IHNyY19jbnQrMjsKKwkJc3dfZGVzYy0+dW5tYXBfbGVuID0gbGVuOworCQlzd19kZXNjLT5hc3luY190eC5mbGFncyA9IGZsYWdzOworCQl3aGlsZSAoc3JjX2NudC0tKQorCQkJaW9wX2Rlc2Nfc2V0X3BxX3plcm9fc3VtX3NyY19hZGRyKGcsIHNyY19jbnQsCisJCQkJCQkJICBzcmNbc3JjX2NudF0sCisJCQkJCQkJICBzY2Zbc3JjX2NudF0pOworCQlpb3BfZGVzY19zZXRfcHFfemVyb19zdW1fYWRkcihnLCBwcV9pZHgsIHNyYyk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZpb3BfY2hhbi0+bG9jayk7CisKKwlyZXR1cm4gc3dfZGVzYyA/ICZzd19kZXNjLT5hc3luY190eCA6IE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIGlvcF9hZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbiA9IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7CkBAIC05MDYsNyArMTA3MCw3IEBACiAKICNkZWZpbmUgSU9QX0FETUFfTlVNX1NSQ19URVNUIDQgLyogbXVzdCBiZSA8PSAxNSAqLwogc3RhdGljIGludCBfX2RldmluaXQKLWlvcF9hZG1hX3hvcl96ZXJvX3N1bV9zZWxmX3Rlc3Qoc3RydWN0IGlvcF9hZG1hX2RldmljZSAqZGV2aWNlKQoraW9wX2FkbWFfeG9yX3ZhbF9zZWxmX3Rlc3Qoc3RydWN0IGlvcF9hZG1hX2RldmljZSAqZGV2aWNlKQogewogCWludCBpLCBzcmNfaWR4OwogCXN0cnVjdCBwYWdlICpkZXN0OwpAQCAtMTAwMiw3ICsxMTY2LDcgQEAKIAkJUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKIAogCS8qIHNraXAgemVybyBzdW0gaWYgdGhlIGNhcGFiaWxpdHkgaXMgbm90IHByZXNlbnQgKi8KLQlpZiAoIWRtYV9oYXNfY2FwKERNQV9aRVJPX1NVTSwgZG1hX2NoYW4tPmRldmljZS0+Y2FwX21hc2spKQorCWlmICghZG1hX2hhc19jYXAoRE1BX1hPUl9WQUwsIGRtYV9jaGFuLT5kZXZpY2UtPmNhcF9tYXNrKSkKIAkJZ290byBmcmVlX3Jlc291cmNlczsKIAogCS8qIHplcm8gc3VtIHRoZSBzb3VyY2VzIHdpdGggdGhlIGRlc3RpbnRhdGlvbiBwYWdlICovCkBAIC0xMDE2LDEwICsxMTgwLDEwIEBACiAJCWRtYV9zcmNzW2ldID0gZG1hX21hcF9wYWdlKGRtYV9jaGFuLT5kZXZpY2UtPmRldiwKIAkJCQkJICAgemVyb19zdW1fc3Jjc1tpXSwgMCwgUEFHRV9TSVpFLAogCQkJCQkgICBETUFfVE9fREVWSUNFKTsKLQl0eCA9IGlvcF9hZG1hX3ByZXBfZG1hX3plcm9fc3VtKGRtYV9jaGFuLCBkbWFfc3JjcywKLQkJCQkJSU9QX0FETUFfTlVNX1NSQ19URVNUICsgMSwgUEFHRV9TSVpFLAotCQkJCQkmemVyb19zdW1fcmVzdWx0LAotCQkJCQlETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOworCXR4ID0gaW9wX2FkbWFfcHJlcF9kbWFfeG9yX3ZhbChkbWFfY2hhbiwgZG1hX3NyY3MsCisJCQkJICAgICAgIElPUF9BRE1BX05VTV9TUkNfVEVTVCArIDEsIFBBR0VfU0laRSwKKwkJCQkgICAgICAgJnplcm9fc3VtX3Jlc3VsdCwKKwkJCQkgICAgICAgRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKIAogCWNvb2tpZSA9IGlvcF9hZG1hX3R4X3N1Ym1pdCh0eCk7CiAJaW9wX2FkbWFfaXNzdWVfcGVuZGluZyhkbWFfY2hhbik7CkBAIC0xMDcyLDEwICsxMjM2LDEwIEBACiAJCWRtYV9zcmNzW2ldID0gZG1hX21hcF9wYWdlKGRtYV9jaGFuLT5kZXZpY2UtPmRldiwKIAkJCQkJICAgemVyb19zdW1fc3Jjc1tpXSwgMCwgUEFHRV9TSVpFLAogCQkJCQkgICBETUFfVE9fREVWSUNFKTsKLQl0eCA9IGlvcF9hZG1hX3ByZXBfZG1hX3plcm9fc3VtKGRtYV9jaGFuLCBkbWFfc3JjcywKLQkJCQkJSU9QX0FETUFfTlVNX1NSQ19URVNUICsgMSwgUEFHRV9TSVpFLAotCQkJCQkmemVyb19zdW1fcmVzdWx0LAotCQkJCQlETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOworCXR4ID0gaW9wX2FkbWFfcHJlcF9kbWFfeG9yX3ZhbChkbWFfY2hhbiwgZG1hX3NyY3MsCisJCQkJICAgICAgIElPUF9BRE1BX05VTV9TUkNfVEVTVCArIDEsIFBBR0VfU0laRSwKKwkJCQkgICAgICAgJnplcm9fc3VtX3Jlc3VsdCwKKwkJCQkgICAgICAgRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKIAogCWNvb2tpZSA9IGlvcF9hZG1hX3R4X3N1Ym1pdCh0eCk7CiAJaW9wX2FkbWFfaXNzdWVfcGVuZGluZyhkbWFfY2hhbik7CkBAIC0xMTA1LDYgKzEyNjksMTcwIEBACiAJcmV0dXJuIGVycjsKIH0KIAorI2lmZGVmIENPTkZJR19NRF9SQUlENl9QUQorc3RhdGljIGludCBfX2RldmluaXQKK2lvcF9hZG1hX3BxX3plcm9fc3VtX3NlbGZfdGVzdChzdHJ1Y3QgaW9wX2FkbWFfZGV2aWNlICpkZXZpY2UpCit7CisJLyogY29tYmluZWQgc291cmNlcywgc29mdHdhcmUgcHEgcmVzdWx0cywgYW5kIGV4dHJhIGh3IHBxIHJlc3VsdHMgKi8KKwlzdHJ1Y3QgcGFnZSAqcHFbSU9QX0FETUFfTlVNX1NSQ19URVNUKzIrMl07CisJLyogcHRyIHRvIHRoZSBleHRyYSBodyBwcSBidWZmZXJzIGRlZmluZWQgYWJvdmUgKi8KKwlzdHJ1Y3QgcGFnZSAqKnBxX2h3ID0gJnBxW0lPUF9BRE1BX05VTV9TUkNfVEVTVCsyXTsKKwkvKiBhZGRyZXNzIGNvbnZlcnNpb24gYnVmZmVycyAoZG1hX21hcCAvIHBhZ2VfYWRkcmVzcykgKi8KKwl2b2lkICpwcV9zd1tJT1BfQURNQV9OVU1fU1JDX1RFU1QrMl07CisJZG1hX2FkZHJfdCBwcV9zcmNbSU9QX0FETUFfTlVNX1NSQ19URVNUXTsKKwlkbWFfYWRkcl90IHBxX2Rlc3RbMl07CisKKwlpbnQgaTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4OworCXN0cnVjdCBkbWFfY2hhbiAqZG1hX2NoYW47CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKwl1MzIgemVyb19zdW1fcmVzdWx0OworCWludCBlcnIgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRldl9kYmcoZGV2aWNlLT5jb21tb24uZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBxKTsgaSsrKSB7CisJCXBxW2ldID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFwcVtpXSkgeworCQkJd2hpbGUgKGktLSkKKwkJCQlfX2ZyZWVfcGFnZShwcVtpXSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCS8qIEZpbGwgaW4gc3JjIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSU9QX0FETUFfTlVNX1NSQ19URVNUOyBpKyspIHsKKwkJcHFfc3dbaV0gPSBwYWdlX2FkZHJlc3MocHFbaV0pOworCQltZW1zZXQocHFfc3dbaV0sIDB4MTExMTExMTEgKiAoMTw8aSksIFBBR0VfU0laRSk7CisJfQorCXBxX3N3W2ldID0gcGFnZV9hZGRyZXNzKHBxW2ldKTsKKwlwcV9zd1tpKzFdID0gcGFnZV9hZGRyZXNzKHBxW2krMV0pOworCisJZG1hX2NoYW4gPSBjb250YWluZXJfb2YoZGV2aWNlLT5jb21tb24uY2hhbm5lbHMubmV4dCwKKwkJCQlzdHJ1Y3QgZG1hX2NoYW4sCisJCQkJZGV2aWNlX25vZGUpOworCWlmIChpb3BfYWRtYV9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbikgPCAxKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWRldiA9IGRtYV9jaGFuLT5kZXZpY2UtPmRldjsKKworCS8qIGluaXRpYWxpemUgdGhlIGRlc3RzICovCisJbWVtc2V0KHBhZ2VfYWRkcmVzcyhwcV9od1swXSksIDAgLCBQQUdFX1NJWkUpOworCW1lbXNldChwYWdlX2FkZHJlc3MocHFfaHdbMV0pLCAwICwgUEFHRV9TSVpFKTsKKworCS8qIHRlc3QgcHEgKi8KKwlwcV9kZXN0WzBdID0gZG1hX21hcF9wYWdlKGRldiwgcHFfaHdbMF0sIDAsIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlwcV9kZXN0WzFdID0gZG1hX21hcF9wYWdlKGRldiwgcHFfaHdbMV0sIDAsIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlmb3IgKGkgPSAwOyBpIDwgSU9QX0FETUFfTlVNX1NSQ19URVNUOyBpKyspCisJCXBxX3NyY1tpXSA9IGRtYV9tYXBfcGFnZShkZXYsIHBxW2ldLCAwLCBQQUdFX1NJWkUsCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKworCXR4ID0gaW9wX2FkbWFfcHJlcF9kbWFfcHEoZG1hX2NoYW4sIHBxX2Rlc3QsIHBxX3NyYywKKwkJCQkgIElPUF9BRE1BX05VTV9TUkNfVEVTVCwgKHU4ICopcmFpZDZfZ2ZleHAsCisJCQkJICBQQUdFX1NJWkUsCisJCQkJICBETUFfUFJFUF9JTlRFUlJVUFQgfAorCQkJCSAgRE1BX0NUUkxfQUNLKTsKKworCWNvb2tpZSA9IGlvcF9hZG1hX3R4X3N1Ym1pdCh0eCk7CisJaW9wX2FkbWFfaXNzdWVfcGVuZGluZyhkbWFfY2hhbik7CisJbXNsZWVwKDgpOworCisJaWYgKGlvcF9hZG1hX2lzX2NvbXBsZXRlKGRtYV9jaGFuLCBjb29raWUsIE5VTEwsIE5VTEwpICE9CisJCURNQV9TVUNDRVNTKSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IHBxIHRpbWVkIG91dCwgZGlzYWJsaW5nXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShJT1BfQURNQV9OVU1fU1JDX1RFU1QrMiwgUEFHRV9TSVpFLCBwcV9zdyk7CisKKwlpZiAobWVtY21wKHBxX3N3W0lPUF9BRE1BX05VTV9TUkNfVEVTVF0sCisJCSAgIHBhZ2VfYWRkcmVzcyhwcV9od1swXSksIFBBR0VfU0laRSkgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCBwIGZhaWxlZCBjb21wYXJlLCBkaXNhYmxpbmdcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKwlpZiAobWVtY21wKHBxX3N3W0lPUF9BRE1BX05VTV9TUkNfVEVTVCsxXSwKKwkJICAgcGFnZV9hZGRyZXNzKHBxX2h3WzFdKSwgUEFHRV9TSVpFKSAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0IHEgZmFpbGVkIGNvbXBhcmUsIGRpc2FibGluZ1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9yZXNvdXJjZXM7CisJfQorCisJLyogdGVzdCBjb3JyZWN0IHplcm8gc3VtIHVzaW5nIHRoZSBzb2Z0d2FyZSBnZW5lcmF0ZWQgcHEgdmFsdWVzICovCisJZm9yIChpID0gMDsgaSA8IElPUF9BRE1BX05VTV9TUkNfVEVTVCArIDI7IGkrKykKKwkJcHFfc3JjW2ldID0gZG1hX21hcF9wYWdlKGRldiwgcHFbaV0sIDAsIFBBR0VfU0laRSwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCisJemVyb19zdW1fcmVzdWx0ID0gfjA7CisJdHggPSBpb3BfYWRtYV9wcmVwX2RtYV9wcV92YWwoZG1hX2NoYW4sICZwcV9zcmNbSU9QX0FETUFfTlVNX1NSQ19URVNUXSwKKwkJCQkgICAgICBwcV9zcmMsIElPUF9BRE1BX05VTV9TUkNfVEVTVCwKKwkJCQkgICAgICByYWlkNl9nZmV4cCwgUEFHRV9TSVpFLCAmemVyb19zdW1fcmVzdWx0LAorCQkJCSAgICAgIERNQV9QUkVQX0lOVEVSUlVQVHxETUFfQ1RSTF9BQ0spOworCisJY29va2llID0gaW9wX2FkbWFfdHhfc3VibWl0KHR4KTsKKwlpb3BfYWRtYV9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKKwltc2xlZXAoOCk7CisKKwlpZiAoaW9wX2FkbWFfaXNfY29tcGxldGUoZG1hX2NoYW4sIGNvb2tpZSwgTlVMTCwgTlVMTCkgIT0KKwkJRE1BX1NVQ0NFU1MpIHsKKwkJZGV2X2VycihkZXYsICJTZWxmLXRlc3QgcHEtemVyby1zdW0gdGltZWQgb3V0LCBkaXNhYmxpbmdcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKworCWlmICh6ZXJvX3N1bV9yZXN1bHQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCBwcS16ZXJvLXN1bSBmYWlsZWQgdG8gdmFsaWRhdGU6ICV4XG4iLAorCQkJemVyb19zdW1fcmVzdWx0KTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwkvKiB0ZXN0IGluY29ycmVjdCB6ZXJvIHN1bSAqLworCWkgPSBJT1BfQURNQV9OVU1fU1JDX1RFU1Q7CisJbWVtc2V0KHBxX3N3W2ldICsgMTAwLCAwLCAxMDApOworCW1lbXNldChwcV9zd1tpKzFdICsgMjAwLCAwLCAyMDApOworCWZvciAoaSA9IDA7IGkgPCBJT1BfQURNQV9OVU1fU1JDX1RFU1QgKyAyOyBpKyspCisJCXBxX3NyY1tpXSA9IGRtYV9tYXBfcGFnZShkZXYsIHBxW2ldLCAwLCBQQUdFX1NJWkUsCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKworCXplcm9fc3VtX3Jlc3VsdCA9IDA7CisJdHggPSBpb3BfYWRtYV9wcmVwX2RtYV9wcV92YWwoZG1hX2NoYW4sICZwcV9zcmNbSU9QX0FETUFfTlVNX1NSQ19URVNUXSwKKwkJCQkgICAgICBwcV9zcmMsIElPUF9BRE1BX05VTV9TUkNfVEVTVCwKKwkJCQkgICAgICByYWlkNl9nZmV4cCwgUEFHRV9TSVpFLCAmemVyb19zdW1fcmVzdWx0LAorCQkJCSAgICAgIERNQV9QUkVQX0lOVEVSUlVQVHxETUFfQ1RSTF9BQ0spOworCisJY29va2llID0gaW9wX2FkbWFfdHhfc3VibWl0KHR4KTsKKwlpb3BfYWRtYV9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKKwltc2xlZXAoOCk7CisKKwlpZiAoaW9wX2FkbWFfaXNfY29tcGxldGUoZG1hX2NoYW4sIGNvb2tpZSwgTlVMTCwgTlVMTCkgIT0KKwkJRE1BX1NVQ0NFU1MpIHsKKwkJZGV2X2VycihkZXYsICJTZWxmLXRlc3QgIXBxLXplcm8tc3VtIHRpbWVkIG91dCwgZGlzYWJsaW5nXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwlpZiAoemVyb19zdW1fcmVzdWx0ICE9IChTVU1fQ0hFQ0tfUF9SRVNVTFQgfCBTVU1fQ0hFQ0tfUV9SRVNVTFQpKSB7CisJCWRldl9lcnIoZGV2LCAiU2VsZi10ZXN0ICFwcS16ZXJvLXN1bSBmYWlsZWQgdG8gdmFsaWRhdGU6ICV4XG4iLAorCQkJemVyb19zdW1fcmVzdWx0KTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKK2ZyZWVfcmVzb3VyY2VzOgorCWlvcF9hZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pOworb3V0OgorCWkgPSBBUlJBWV9TSVpFKHBxKTsKKwl3aGlsZSAoaS0tKQorCQlfX2ZyZWVfcGFnZShwcVtpXSk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBpb3BfYWRtYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpb3BfYWRtYV9kZXZpY2UgKmRldmljZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CkBAIC0xMTkyLDkgKzE1MjAsMTYgQEAKIAkJZG1hX2Rldi0+bWF4X3hvciA9IGlvcF9hZG1hX2dldF9tYXhfeG9yKCk7CiAJCWRtYV9kZXYtPmRldmljZV9wcmVwX2RtYV94b3IgPSBpb3BfYWRtYV9wcmVwX2RtYV94b3I7CiAJfQotCWlmIChkbWFfaGFzX2NhcChETUFfWkVST19TVU0sIGRtYV9kZXYtPmNhcF9tYXNrKSkKLQkJZG1hX2Rldi0+ZGV2aWNlX3ByZXBfZG1hX3plcm9fc3VtID0KLQkJCWlvcF9hZG1hX3ByZXBfZG1hX3plcm9fc3VtOworCWlmIChkbWFfaGFzX2NhcChETUFfWE9SX1ZBTCwgZG1hX2Rldi0+Y2FwX21hc2spKQorCQlkbWFfZGV2LT5kZXZpY2VfcHJlcF9kbWFfeG9yX3ZhbCA9CisJCQlpb3BfYWRtYV9wcmVwX2RtYV94b3JfdmFsOworCWlmIChkbWFfaGFzX2NhcChETUFfUFEsIGRtYV9kZXYtPmNhcF9tYXNrKSkgeworCQlkbWFfc2V0X21heHBxKGRtYV9kZXYsIGlvcF9hZG1hX2dldF9tYXhfcHEoKSwgMCk7CisJCWRtYV9kZXYtPmRldmljZV9wcmVwX2RtYV9wcSA9IGlvcF9hZG1hX3ByZXBfZG1hX3BxOworCX0KKwlpZiAoZG1hX2hhc19jYXAoRE1BX1BRX1ZBTCwgZG1hX2Rldi0+Y2FwX21hc2spKQorCQlkbWFfZGV2LT5kZXZpY2VfcHJlcF9kbWFfcHFfdmFsID0KKwkJCWlvcF9hZG1hX3ByZXBfZG1hX3BxX3ZhbDsKIAlpZiAoZG1hX2hhc19jYXAoRE1BX0lOVEVSUlVQVCwgZG1hX2Rldi0+Y2FwX21hc2spKQogCQlkbWFfZGV2LT5kZXZpY2VfcHJlcF9kbWFfaW50ZXJydXB0ID0KIAkJCWlvcF9hZG1hX3ByZXBfZG1hX2ludGVycnVwdDsKQEAgLTEyNDgsMjMgKzE1ODMsMzUgQEAKIAl9CiAKIAlpZiAoZG1hX2hhc19jYXAoRE1BX1hPUiwgZG1hX2Rldi0+Y2FwX21hc2spIHx8Ci0JCWRtYV9oYXNfY2FwKERNQV9NRU1TRVQsIGRtYV9kZXYtPmNhcF9tYXNrKSkgewotCQlyZXQgPSBpb3BfYWRtYV94b3JfemVyb19zdW1fc2VsZl90ZXN0KGFkZXYpOworCSAgICBkbWFfaGFzX2NhcChETUFfTUVNU0VULCBkbWFfZGV2LT5jYXBfbWFzaykpIHsKKwkJcmV0ID0gaW9wX2FkbWFfeG9yX3ZhbF9zZWxmX3Rlc3QoYWRldik7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInhvciBzZWxmIHRlc3QgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycl9mcmVlX2lvcF9jaGFuOwogCX0KIAorCWlmIChkbWFfaGFzX2NhcChETUFfUFEsIGRtYV9kZXYtPmNhcF9tYXNrKSAmJgorCSAgICBkbWFfaGFzX2NhcChETUFfUFFfVkFMLCBkbWFfZGV2LT5jYXBfbWFzaykpIHsKKwkJI2lmZGVmIENPTkZJR19NRF9SQUlENl9QUQorCQlyZXQgPSBpb3BfYWRtYV9wcV96ZXJvX3N1bV9zZWxmX3Rlc3QoYWRldik7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInBxIHNlbGYgdGVzdCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJI2Vsc2UKKwkJLyogY2FuIG5vdCB0ZXN0IHJhaWQ2LCBzbyBkbyBub3QgcHVibGlzaCBjYXBhYmlsaXR5ICovCisJCWRtYV9jYXBfY2xlYXIoRE1BX1BRLCBkbWFfZGV2LT5jYXBfbWFzayk7CisJCWRtYV9jYXBfY2xlYXIoRE1BX1BRX1ZBTCwgZG1hX2Rldi0+Y2FwX21hc2spOworCQlyZXQgPSAwOworCQkjZW5kaWYKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2ZyZWVfaW9wX2NoYW47CisJfQorCiAJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJJbnRlbChSKSBJT1A6ICIKLQkgICIoICVzJXMlcyVzJXMlcyVzJXMlcyVzKVxuIiwKLQkgIGRtYV9oYXNfY2FwKERNQV9QUV9YT1IsIGRtYV9kZXYtPmNhcF9tYXNrKSA/ICJwcV94b3IgIiA6ICIiLAotCSAgZG1hX2hhc19jYXAoRE1BX1BRX1VQREFURSwgZG1hX2Rldi0+Y2FwX21hc2spID8gInBxX3VwZGF0ZSAiIDogIiIsCi0JICBkbWFfaGFzX2NhcChETUFfUFFfWkVST19TVU0sIGRtYV9kZXYtPmNhcF9tYXNrKSA/ICJwcV96ZXJvX3N1bSAiIDogIiIsCisJICAiKCAlcyVzJXMlcyVzJXMlcylcbiIsCisJICBkbWFfaGFzX2NhcChETUFfUFEsIGRtYV9kZXYtPmNhcF9tYXNrKSA/ICJwcSAiIDogIiIsCisJICBkbWFfaGFzX2NhcChETUFfUFFfVkFMLCBkbWFfZGV2LT5jYXBfbWFzaykgPyAicHFfdmFsICIgOiAiIiwKIAkgIGRtYV9oYXNfY2FwKERNQV9YT1IsIGRtYV9kZXYtPmNhcF9tYXNrKSA/ICJ4b3IgIiA6ICIiLAotCSAgZG1hX2hhc19jYXAoRE1BX0RVQUxfWE9SLCBkbWFfZGV2LT5jYXBfbWFzaykgPyAiZHVhbF94b3IgIiA6ICIiLAotCSAgZG1hX2hhc19jYXAoRE1BX1pFUk9fU1VNLCBkbWFfZGV2LT5jYXBfbWFzaykgPyAieG9yX3plcm9fc3VtICIgOiAiIiwKKwkgIGRtYV9oYXNfY2FwKERNQV9YT1JfVkFMLCBkbWFfZGV2LT5jYXBfbWFzaykgPyAieG9yX3ZhbCAiIDogIiIsCiAJICBkbWFfaGFzX2NhcChETUFfTUVNU0VULCBkbWFfZGV2LT5jYXBfbWFzaykgID8gImZpbGwgIiA6ICIiLAotCSAgZG1hX2hhc19jYXAoRE1BX01FTUNQWV9DUkMzMkMsIGRtYV9kZXYtPmNhcF9tYXNrKSA/ICJjcHkrY3JjICIgOiAiIiwKIAkgIGRtYV9oYXNfY2FwKERNQV9NRU1DUFksIGRtYV9kZXYtPmNhcF9tYXNrKSA/ICJjcHkgIiA6ICIiLAogCSAgZG1hX2hhc19jYXAoRE1BX0lOVEVSUlVQVCwgZG1hX2Rldi0+Y2FwX21hc2spID8gImludHIgIiA6ICIiKTsKIApAQCAtMTI5Niw3ICsxNjQzLDcgQEAKIAlpZiAoc3dfZGVzYykgewogCQlncnBfc3RhcnQgPSBzd19kZXNjLT5ncm91cF9oZWFkOwogCi0JCWxpc3Rfc3BsaWNlX2luaXQoJnN3X2Rlc2MtPmFzeW5jX3R4LnR4X2xpc3QsICZpb3BfY2hhbi0+Y2hhaW4pOworCQlsaXN0X3NwbGljZV9pbml0KCZzd19kZXNjLT50eF9saXN0LCAmaW9wX2NoYW4tPmNoYWluKTsKIAkJYXN5bmNfdHhfYWNrKCZzd19kZXNjLT5hc3luY190eCk7CiAJCWlvcF9kZXNjX2luaXRfbWVtY3B5KGdycF9zdGFydCwgMCk7CiAJCWlvcF9kZXNjX3NldF9ieXRlX2NvdW50KGdycF9zdGFydCwgaW9wX2NoYW4sIDApOwpAQCAtMTM1Miw3ICsxNjk5LDcgQEAKIAlzd19kZXNjID0gaW9wX2FkbWFfYWxsb2Nfc2xvdHMoaW9wX2NoYW4sIHNsb3RfY250LCBzbG90c19wZXJfb3ApOwogCWlmIChzd19kZXNjKSB7CiAJCWdycF9zdGFydCA9IHN3X2Rlc2MtPmdyb3VwX2hlYWQ7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJnN3X2Rlc2MtPmFzeW5jX3R4LnR4X2xpc3QsICZpb3BfY2hhbi0+Y2hhaW4pOworCQlsaXN0X3NwbGljZV9pbml0KCZzd19kZXNjLT50eF9saXN0LCAmaW9wX2NoYW4tPmNoYWluKTsKIAkJYXN5bmNfdHhfYWNrKCZzd19kZXNjLT5hc3luY190eCk7CiAJCWlvcF9kZXNjX2luaXRfbnVsbF94b3IoZ3JwX3N0YXJ0LCAyLCAwKTsKIAkJaW9wX2Rlc2Nfc2V0X2J5dGVfY291bnQoZ3JwX3N0YXJ0LCBpb3BfY2hhbiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pb3Zsb2NrLmMgYi9kcml2ZXJzL2RtYS9pb3Zsb2NrLmMKaW5kZXggOWY2ZmU0Ni4uYzBhMjcyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW92bG9jay5jCisrKyBiL2RyaXZlcnMvZG1hL2lvdmxvY2suYwpAQCAtMTgzLDYgKzE4MywxMSBAQAogCQkJCQlpb3ZfYnl0ZV9vZmZzZXQsCiAJCQkJCWtkYXRhLAogCQkJCQljb3B5KTsKKwkJCS8qIHBvbGwgZm9yIGEgZGVzY3JpcHRvciBzbG90ICovCisJCQlpZiAodW5saWtlbHkoZG1hX2Nvb2tpZSA8IDApKSB7CisJCQkJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoY2hhbik7CisJCQkJY29udGludWU7CisJCQl9CiAKIAkJCWxlbiAtPSBjb3B5OwogCQkJaW92W2lvdmVjX2lkeF0uaW92X2xlbiAtPSBjb3B5OwpAQCAtMjQ4LDYgKzI1MywxMSBAQAogCQkJCQlwYWdlLAogCQkJCQlvZmZzZXQsCiAJCQkJCWNvcHkpOworCQkJLyogcG9sbCBmb3IgYSBkZXNjcmlwdG9yIHNsb3QgKi8KKwkJCWlmICh1bmxpa2VseShkbWFfY29va2llIDwgMCkpIHsKKwkJCQlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhjaGFuKTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAogCQkJbGVuIC09IGNvcHk7CiAJCQlpb3ZbaW92ZWNfaWR4XS5pb3ZfbGVuIC09IGNvcHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tdl94b3IuYyBiL2RyaXZlcnMvZG1hL212X3hvci5jCmluZGV4IDNmMjNlYWIuLjQ2NmFiMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL212X3hvci5jCisrKyBiL2RyaXZlcnMvZG1hL212X3hvci5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAkJCX0KIAkJCWFsbG9jX3RhaWwtPmdyb3VwX2hlYWQgPSBhbGxvY19zdGFydDsKIAkJCWFsbG9jX3RhaWwtPmFzeW5jX3R4LmNvb2tpZSA9IC1FQlVTWTsKLQkJCWxpc3Rfc3BsaWNlKCZjaGFpbiwgJmFsbG9jX3RhaWwtPmFzeW5jX3R4LnR4X2xpc3QpOworCQkJbGlzdF9zcGxpY2UoJmNoYWluLCAmYWxsb2NfdGFpbC0+dHhfbGlzdCk7CiAJCQltdl9jaGFuLT5sYXN0X3VzZWQgPSBsYXN0X3VzZWQ7CiAJCQltdl9kZXNjX2NsZWFyX25leHRfZGVzYyhhbGxvY19zdGFydCk7CiAJCQltdl9kZXNjX2NsZWFyX25leHRfZGVzYyhhbGxvY190YWlsKTsKQEAgLTU2NSwxNCArNTY1LDE0IEBACiAJY29va2llID0gbXZfZGVzY19hc3NpZ25fY29va2llKG12X2NoYW4sIHN3X2Rlc2MpOwogCiAJaWYgKGxpc3RfZW1wdHkoJm12X2NoYW4tPmNoYWluKSkKLQkJbGlzdF9zcGxpY2VfaW5pdCgmc3dfZGVzYy0+YXN5bmNfdHgudHhfbGlzdCwgJm12X2NoYW4tPmNoYWluKTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmc3dfZGVzYy0+dHhfbGlzdCwgJm12X2NoYW4tPmNoYWluKTsKIAllbHNlIHsKIAkJbmV3X2h3X2NoYWluID0gMDsKIAogCQlvbGRfY2hhaW5fdGFpbCA9IGxpc3RfZW50cnkobXZfY2hhbi0+Y2hhaW4ucHJldiwKIAkJCQkJICAgIHN0cnVjdCBtdl94b3JfZGVzY19zbG90LAogCQkJCQkgICAgY2hhaW5fbm9kZSk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJmdycF9zdGFydC0+YXN5bmNfdHgudHhfbGlzdCwKKwkJbGlzdF9zcGxpY2VfaW5pdCgmZ3JwX3N0YXJ0LT50eF9saXN0LAogCQkJCSAmb2xkX2NoYWluX3RhaWwtPmNoYWluX25vZGUpOwogCiAJCWlmICghbXZfY2FuX2NoYWluKGdycF9zdGFydCkpCkBAIC02MzIsNiArNjMyLDcgQEAKIAkJc2xvdC0+YXN5bmNfdHgudHhfc3VibWl0ID0gbXZfeG9yX3R4X3N1Ym1pdDsKIAkJSU5JVF9MSVNUX0hFQUQoJnNsb3QtPmNoYWluX25vZGUpOwogCQlJTklUX0xJU1RfSEVBRCgmc2xvdC0+c2xvdF9ub2RlKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnNsb3QtPnR4X2xpc3QpOwogCQlod19kZXNjID0gKGNoYXIgKikgbXZfY2hhbi0+ZGV2aWNlLT5kbWFfZGVzY19wb29sOwogCQlzbG90LT5hc3luY190eC5waHlzID0KIAkJCShkbWFfYWRkcl90KSAmaHdfZGVzY1tpZHggKiBNVl9YT1JfU0xPVF9TSVpFXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL212X3hvci5oIGIvZHJpdmVycy9kbWEvbXZfeG9yLmgKaW5kZXggMDZjYWZlMS4uOTc3YjU5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbXZfeG9yLmgKKysrIGIvZHJpdmVycy9kbWEvbXZfeG9yLmgKQEAgLTEyNiw5ICsxMjYsOCBAQAogICogQGlkeDogcG9vbCBpbmRleAogICogQHVubWFwX3NyY19jbnQ6IG51bWJlciBvZiB4b3Igc291cmNlcwogICogQHVubWFwX2xlbjogdHJhbnNhY3Rpb24gYnl0ZWNvdW50CisgKiBAdHhfbGlzdDogbGlzdCBvZiBzbG90cyB0aGF0IG1ha2UgdXAgYSBtdWx0aS1kZXNjcmlwdG9yIHRyYW5zYWN0aW9uCiAgKiBAYXN5bmNfdHg6IHN1cHBvcnQgZm9yIHRoZSBhc3luY190eCBhcGkKLSAqIEBncm91cF9saXN0OiBsaXN0IG9mIHNsb3RzIHRoYXQgbWFrZSB1cCBhIG11bHRpLWRlc2NyaXB0b3IgdHJhbnNhY3Rpb24KLSAqCWZvciBleGFtcGxlIHRyYW5zZmVyIGxlbmd0aHMgbGFyZ2VyIHRoYW4gdGhlIHN1cHBvcnRlZCBodyBtYXgKICAqIEB4b3JfY2hlY2tfcmVzdWx0OiByZXN1bHQgb2YgemVybyBzdW0KICAqIEBjcmMzMl9yZXN1bHQ6IHJlc3VsdCBjcmMgY2FsY3VsYXRpb24KICAqLwpAQCAtMTQ1LDYgKzE0NCw3IEBACiAJdTE2CQkJdW5tYXBfc3JjX2NudDsKIAl1MzIJCQl2YWx1ZTsKIAlzaXplX3QJCQl1bm1hcF9sZW47CisJc3RydWN0IGxpc3RfaGVhZAl0eF9saXN0OwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcglhc3luY190eDsKIAl1bmlvbiB7CiAJCXUzMgkJKnhvcl9jaGVja19yZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaGRtYS5jIGIvZHJpdmVycy9kbWEvc2hkbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IwNjVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvc2hkbWEuYwpAQCAtMCwwICsxLDc4NiBAQAorLyoKKyAqIFJlbmVzYXMgU3VwZXJIIERNQSBFbmdpbmUgc3VwcG9ydAorICoKKyAqIGJhc2UgaXMgZHJpdmVycy9kbWEvZmxzZG1hLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9idWhpcm8gSXdhbWF0c3UgPGl3YW1hdHN1Lm5vYnVoaXJvQHJlbmVzYXMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlbmVzYXMgU29sdXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAtIERNQSBvZiBTdXBlckggZG9lcyBub3QgaGF2ZSBIYXJkd2FyZSBETUEgY2hhaW4gbW9kZS4KKyAqIC0gTUFYIERNQSBzaXplIGlzIDE2TUIuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxjcHUvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2RtYS1zaC5oPgorI2luY2x1ZGUgInNoZG1hLmgiCisKKy8qIERNQSBkZXNjcmlwdG9yIGNvbnRyb2wgKi8KKyNkZWZpbmUgREVTQ19MQVNUCSgtMSkKKyNkZWZpbmUgREVTQ19DT01QCSgxKQorI2RlZmluZSBERVNDX05DT01QCSgwKQorCisjZGVmaW5lIE5SX0RFU0NTX1BFUl9DSEFOTkVMIDMyCisvKgorICogRGVmaW5lIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGR1YWwgYWRkcmVzcyBtZW1vcnktbWVtb3J5IHRyYW5zZmVyLgorICogVGhlIDB4NDAwIHZhbHVlIHJlcHJlc2VudHMgYXV0by1yZXF1ZXN0LCBleHRlcm5hbC0+ZXh0ZXJuYWwuCisgKgorICogQW5kIHRoaXMgZHJpdmVyIHNldCA0Ynl0ZSBidXJzdCBtb2RlLgorICogSWYgeW91IHdhbnQgdG8gY2hhbmdlIG1vZGUsIHlvdSBuZWVkIHRvIGNoYW5nZSBSU19ERUZBVUxUIG9mIHZhbHVlLgorICogKGV4IDFieXRlIGJ1cnN0IG1vZGUgLT4gKFJTX0RVQUwgJiB+VFNfMzIpCisgKi8KKyNkZWZpbmUgUlNfREVGQVVMVCAgKFJTX0RVQUwpCisKKyNkZWZpbmUgU0hfRE1BQ19DSEFOX0JBU0UoaWQpIChkbWFfYmFzZV9hZGRyW2lkXSkKK3N0YXRpYyB2b2lkIHNoX2RtYWVfd3JpdGVsKHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2RjLCB1MzIgZGF0YSwgdTMyIHJlZykKK3sKKwljdHJsX291dGwoZGF0YSwgKFNIX0RNQUNfQ0hBTl9CQVNFKHNoX2RjLT5pZCkgKyByZWcpKTsKK30KKworc3RhdGljIHUzMiBzaF9kbWFlX3JlYWRsKHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2RjLCB1MzIgcmVnKQoreworCXJldHVybiBjdHJsX2lubCgoU0hfRE1BQ19DSEFOX0JBU0Uoc2hfZGMtPmlkKSArIHJlZykpOworfQorCitzdGF0aWMgdm9pZCBkbWFlX2luaXQoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKK3sKKwl1MzIgY2hjciA9IFJTX0RFRkFVTFQ7IC8qIGRlZmF1bHQgaXMgRFVBTCBtb2RlICovCisJc2hfZG1hZV93cml0ZWwoc2hfY2hhbiwgY2hjciwgQ0hDUik7Cit9CisKKy8qCisgKiBSZXNldCBETUEgY29udHJvbGxlcgorICoKKyAqIFNINzc4MCBoYXMgdHdvIERNQU9SIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkIHNoX2RtYWVfY3RsX3N0b3AoaW50IGlkKQoreworCXVuc2lnbmVkIHNob3J0IGRtYW9yID0gZG1hb3JfcmVhZF9yZWcoaWQpOworCisJZG1hb3IgJj0gfihETUFPUl9OTUlGIHwgRE1BT1JfQUUpOworCWRtYW9yX3dyaXRlX3JlZyhpZCwgZG1hb3IpOworfQorCitzdGF0aWMgaW50IHNoX2RtYWVfcnN0KGludCBpZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBkbWFvcjsKKworCXNoX2RtYWVfY3RsX3N0b3AoaWQpOworCWRtYW9yID0gKGRtYW9yX3JlYWRfcmVnKGlkKXxETUFPUl9JTklUKTsKKworCWRtYW9yX3dyaXRlX3JlZyhpZCwgZG1hb3IpOworCWlmICgoZG1hb3JfcmVhZF9yZWcoaWQpICYgKERNQU9SX0FFIHwgRE1BT1JfTk1JRikpKSB7CisJCXByX3dhcm5pbmcoS0VSTl9FUlIgImRtYS1zaDogQ2FuJ3QgaW5pdGlhbGl6ZSBETUFPUi5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG1hZV9pc19pZGxlKHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4pCit7CisJdTMyIGNoY3IgPSBzaF9kbWFlX3JlYWRsKHNoX2NoYW4sIENIQ1IpOworCWlmIChjaGNyICYgQ0hDUl9ERSkgeworCQlpZiAoIShjaGNyICYgQ0hDUl9URSkpCisJCQlyZXR1cm4gLUVCVVNZOyAvKiB3b3JraW5nICovCisJfQorCXJldHVybiAwOyAvKiB3YWl0aW5nICovCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNfeG1pdF9zaGlmdChzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuKQoreworCXUzMiBjaGNyID0gc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBDSENSKTsKKwlyZXR1cm4gdHNfc2hpZnRbKGNoY3IgJiBDSENSX1RTX01BU0spID4+IENIQ1JfVFNfU0hJRlRdOworfQorCitzdGF0aWMgdm9pZCBkbWFlX3NldF9yZWcoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiwgc3RydWN0IHNoX2RtYWVfcmVncyBodykKK3sKKwlzaF9kbWFlX3dyaXRlbChzaF9jaGFuLCBody5zYXIsIFNBUik7CisJc2hfZG1hZV93cml0ZWwoc2hfY2hhbiwgaHcuZGFyLCBEQVIpOworCXNoX2RtYWVfd3JpdGVsKHNoX2NoYW4sCisJCShody50Y3IgPj4gY2FsY194bWl0X3NoaWZ0KHNoX2NoYW4pKSwgVENSKTsKK30KKworc3RhdGljIHZvaWQgZG1hZV9zdGFydChzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuKQoreworCXUzMiBjaGNyID0gc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBDSENSKTsKKworCWNoY3IgfD0gKENIQ1JfREV8Q0hDUl9JRSk7CisJc2hfZG1hZV93cml0ZWwoc2hfY2hhbiwgY2hjciwgQ0hDUik7Cit9CisKK3N0YXRpYyB2b2lkIGRtYWVfaGFsdChzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuKQoreworCXUzMiBjaGNyID0gc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBDSENSKTsKKworCWNoY3IgJj0gfihDSENSX0RFIHwgQ0hDUl9URSB8IENIQ1JfSUUpOworCXNoX2RtYWVfd3JpdGVsKHNoX2NoYW4sIGNoY3IsIENIQ1IpOworfQorCitzdGF0aWMgaW50IGRtYWVfc2V0X2NoY3Ioc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiwgdTMyIHZhbCkKK3sKKwlpbnQgcmV0ID0gZG1hZV9pc19pZGxlKHNoX2NoYW4pOworCS8qIFdoZW4gRE1BIHdhcyB3b3JraW5nLCBjYW4gbm90IHNldCBkYXRhIHRvIENIQ1IgKi8KKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2hfZG1hZV93cml0ZWwoc2hfY2hhbiwgdmFsLCBDSENSKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBETUFSUzFfQUREUgkweDA0CisjZGVmaW5lIERNQVJTMl9BRERSCTB4MDgKKyNkZWZpbmUgRE1BUlNfU0hJRlQgOAorI2RlZmluZSBETUFSU19DSEFOX01TSyAweDAxCitzdGF0aWMgaW50IGRtYWVfc2V0X2RtYXJzKHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4sIHUxNiB2YWwpCit7CisJdTMyIGFkZHI7CisJaW50IHNoaWZ0ID0gMDsKKwlpbnQgcmV0ID0gZG1hZV9pc19pZGxlKHNoX2NoYW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoc2hfY2hhbi0+aWQgJiBETUFSU19DSEFOX01TSykKKwkJc2hpZnQgPSBETUFSU19TSElGVDsKKworCXN3aXRjaCAoc2hfY2hhbi0+aWQpIHsKKwkvKiBETUFSUzAgKi8KKwljYXNlIDA6CisJY2FzZSAxOgorCQlhZGRyID0gU0hfRE1BUlNfQkFTRTsKKwkJYnJlYWs7CisJLyogRE1BUlMxICovCisJY2FzZSAyOgorCWNhc2UgMzoKKwkJYWRkciA9IChTSF9ETUFSU19CQVNFICsgRE1BUlMxX0FERFIpOworCQlicmVhazsKKwkvKiBETUFSUzIgKi8KKwljYXNlIDQ6CisJY2FzZSA1OgorCQlhZGRyID0gKFNIX0RNQVJTX0JBU0UgKyBETUFSUzJfQUREUik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN0cmxfb3V0dygodmFsIDw8IHNoaWZ0KSB8CisJCShjdHJsX2ludyhhZGRyKSAmIChzaGlmdCA/IDB4RkYwMCA6IDB4MDBGRikpLAorCQlhZGRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZG1hX2Nvb2tpZV90IHNoX2RtYWVfdHhfc3VibWl0KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpCit7CisJc3RydWN0IHNoX2Rlc2MgKmRlc2MgPSB0eF90b19zaF9kZXNjKHR4KTsKKwlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuID0gdG9fc2hfY2hhbih0eC0+Y2hhbik7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKworCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKworCWNvb2tpZSA9IHNoX2NoYW4tPmNvbW1vbi5jb29raWU7CisJY29va2llKys7CisJaWYgKGNvb2tpZSA8IDApCisJCWNvb2tpZSA9IDE7CisKKwkvKiBJZiBkZXNjIG9ubHkgaW4gdGhlIGNhc2Ugb2YgMSAqLworCWlmIChkZXNjLT5hc3luY190eC5jb29raWUgIT0gLUVCVVNZKQorCQlkZXNjLT5hc3luY190eC5jb29raWUgPSBjb29raWU7CisJc2hfY2hhbi0+Y29tbW9uLmNvb2tpZSA9IGRlc2MtPmFzeW5jX3R4LmNvb2tpZTsKKworCWxpc3Rfc3BsaWNlX2luaXQoJmRlc2MtPnR4X2xpc3QsIHNoX2NoYW4tPmxkX3F1ZXVlLnByZXYpOworCisJc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisKKwlyZXR1cm4gY29va2llOworfQorCitzdGF0aWMgc3RydWN0IHNoX2Rlc2MgKnNoX2RtYWVfZ2V0X2Rlc2Moc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKK3sKKwlzdHJ1Y3Qgc2hfZGVzYyAqZGVzYywgKl9kZXNjLCAqcmV0ID0gTlVMTDsKKworCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZzaF9jaGFuLT5sZF9mcmVlLCBub2RlKSB7CisJCWlmIChhc3luY190eF90ZXN0X2FjaygmZGVzYy0+YXN5bmNfdHgpKSB7CisJCQlsaXN0X2RlbCgmZGVzYy0+bm9kZSk7CisJCQlyZXQgPSBkZXNjOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzaF9kbWFlX3B1dF9kZXNjKHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4sIHN0cnVjdCBzaF9kZXNjICpkZXNjKQoreworCWlmIChkZXNjKSB7CisJCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKworCQlsaXN0X3NwbGljZV9pbml0KCZkZXNjLT50eF9saXN0LCAmc2hfY2hhbi0+bGRfZnJlZSk7CisJCWxpc3RfYWRkKCZkZXNjLT5ub2RlLCAmc2hfY2hhbi0+bGRfZnJlZSk7CisKKwkJc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJfQorfQorCitzdGF0aWMgaW50IHNoX2RtYWVfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4gPSB0b19zaF9jaGFuKGNoYW4pOworCXN0cnVjdCBzaF9kZXNjICpkZXNjOworCisJc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCXdoaWxlIChzaF9jaGFuLT5kZXNjc19hbGxvY2F0ZWQgPCBOUl9ERVNDU19QRVJfQ0hBTk5FTCkgeworCQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwkJZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaF9kZXNjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGVzYykgeworCQkJc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCQkJYnJlYWs7CisJCX0KKwkJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCgmZGVzYy0+YXN5bmNfdHgsCisJCQkJCSZzaF9jaGFuLT5jb21tb24pOworCQlkZXNjLT5hc3luY190eC50eF9zdWJtaXQgPSBzaF9kbWFlX3R4X3N1Ym1pdDsKKwkJZGVzYy0+YXN5bmNfdHguZmxhZ3MgPSBETUFfQ1RSTF9BQ0s7CisJCUlOSVRfTElTVF9IRUFEKCZkZXNjLT50eF9saXN0KTsKKwkJc2hfZG1hZV9wdXRfZGVzYyhzaF9jaGFuLCBkZXNjKTsKKworCQlzcGluX2xvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJCXNoX2NoYW4tPmRlc2NzX2FsbG9jYXRlZCsrOworCX0KKwlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKworCXJldHVybiBzaF9jaGFuLT5kZXNjc19hbGxvY2F0ZWQ7Cit9CisKKy8qCisgKiBzaF9kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyAtIEZyZWUgYWxsIHJlc291cmNlcyBvZiB0aGUgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgc2hfZG1hZV9mcmVlX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuID0gdG9fc2hfY2hhbihjaGFuKTsKKwlzdHJ1Y3Qgc2hfZGVzYyAqZGVzYywgKl9kZXNjOworCUxJU1RfSEVBRChsaXN0KTsKKworCUJVR19PTighbGlzdF9lbXB0eSgmc2hfY2hhbi0+bGRfcXVldWUpKTsKKwlzcGluX2xvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisKKwlsaXN0X3NwbGljZV9pbml0KCZzaF9jaGFuLT5sZF9mcmVlLCAmbGlzdCk7CisJc2hfY2hhbi0+ZGVzY3NfYWxsb2NhdGVkID0gMDsKKworCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmbGlzdCwgbm9kZSkKKwkJa2ZyZWUoZGVzYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnNoX2RtYWVfcHJlcF9tZW1jcHkoCisJc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90IGRtYV9kZXN0LCBkbWFfYWRkcl90IGRtYV9zcmMsCisJc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuOworCXN0cnVjdCBzaF9kZXNjICpmaXJzdCA9IE5VTEwsICpwcmV2ID0gTlVMTCwgKm5ldzsKKwlzaXplX3QgY29weV9zaXplOworCisJaWYgKCFjaGFuKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghbGVuKQorCQlyZXR1cm4gTlVMTDsKKworCXNoX2NoYW4gPSB0b19zaF9jaGFuKGNoYW4pOworCisJZG8geworCQkvKiBBbGxvY2F0ZSB0aGUgbGluayBkZXNjcmlwdG9yIGZyb20gRE1BIHBvb2wgKi8KKwkJbmV3ID0gc2hfZG1hZV9nZXRfZGVzYyhzaF9jaGFuKTsKKwkJaWYgKCFuZXcpIHsKKwkJCWRldl9lcnIoc2hfY2hhbi0+ZGV2LAorCQkJCQkiTm8gZnJlZSBtZW1vcnkgZm9yIGxpbmsgZGVzY3JpcHRvclxuIik7CisJCQlnb3RvIGVycl9nZXRfZGVzYzsKKwkJfQorCisJCWNvcHlfc2l6ZSA9IG1pbihsZW4sIChzaXplX3QpU0hfRE1BX1RDUl9NQVgpOworCisJCW5ldy0+aHcuc2FyID0gZG1hX3NyYzsKKwkJbmV3LT5ody5kYXIgPSBkbWFfZGVzdDsKKwkJbmV3LT5ody50Y3IgPSBjb3B5X3NpemU7CisJCWlmICghZmlyc3QpCisJCQlmaXJzdCA9IG5ldzsKKworCQluZXctPm1hcmsgPSBERVNDX05DT01QOworCQlhc3luY190eF9hY2soJm5ldy0+YXN5bmNfdHgpOworCisJCXByZXYgPSBuZXc7CisJCWxlbiAtPSBjb3B5X3NpemU7CisJCWRtYV9zcmMgKz0gY29weV9zaXplOworCQlkbWFfZGVzdCArPSBjb3B5X3NpemU7CisJCS8qIEluc2VydCB0aGUgbGluayBkZXNjcmlwdG9yIHRvIHRoZSBMRCByaW5nICovCisJCWxpc3RfYWRkX3RhaWwoJm5ldy0+bm9kZSwgJmZpcnN0LT50eF9saXN0KTsKKwl9IHdoaWxlIChsZW4pOworCisJbmV3LT5hc3luY190eC5mbGFncyA9IGZsYWdzOyAvKiBjbGllbnQgaXMgaW4gY29udHJvbCBvZiB0aGlzIGFjayAqLworCW5ldy0+YXN5bmNfdHguY29va2llID0gLUVCVVNZOyAvKiBMYXN0IGRlc2MgKi8KKworCXJldHVybiAmZmlyc3QtPmFzeW5jX3R4OworCitlcnJfZ2V0X2Rlc2M6CisJc2hfZG1hZV9wdXRfZGVzYyhzaF9jaGFuLCBmaXJzdCk7CisJcmV0dXJuIE5VTEw7CisKK30KKworLyoKKyAqIHNoX2NoYW5fbGRfY2xlYW51cCAtIENsZWFuIHVwIGxpbmsgZGVzY3JpcHRvcnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNsZWFuIHVwIHRoZSBsZF9xdWV1ZSBvZiBETUEgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgc2hfZG1hZV9jaGFuX2xkX2NsZWFudXAoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKK3sKKwlzdHJ1Y3Qgc2hfZGVzYyAqZGVzYywgKl9kZXNjOworCisJc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywgJnNoX2NoYW4tPmxkX3F1ZXVlLCBub2RlKSB7CisJCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKKwkJdm9pZCAqY2FsbGJhY2tfcGFyYW07CisKKwkJLyogbm9uIHNlbmQgZGF0YSAqLworCQlpZiAoZGVzYy0+bWFyayA9PSBERVNDX05DT01QKQorCQkJYnJlYWs7CisKKwkJLyogc2VuZCBkYXRhIHNlc2MgKi8KKwkJY2FsbGJhY2sgPSBkZXNjLT5hc3luY190eC5jYWxsYmFjazsKKwkJY2FsbGJhY2tfcGFyYW0gPSBkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbTsKKworCQkvKiBSZW1vdmUgZnJvbSBsZF9xdWV1ZSBsaXN0ICovCisJCWxpc3Rfc3BsaWNlX2luaXQoJmRlc2MtPnR4X2xpc3QsICZzaF9jaGFuLT5sZF9mcmVlKTsKKworCQlkZXZfZGJnKHNoX2NoYW4tPmRldiwgImxpbmsgZGVzY3JpcHRvciAlcCB3aWxsIGJlIHJlY3ljbGUuXG4iLAorCQkJCWRlc2MpOworCisJCWxpc3RfbW92ZSgmZGVzYy0+bm9kZSwgJnNoX2NoYW4tPmxkX2ZyZWUpOworCQkvKiBSdW4gdGhlIGxpbmsgZGVzY3JpcHRvciBjYWxsYmFjayBmdW5jdGlvbiAqLworCQlpZiAoY2FsbGJhY2spIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCQkJZGV2X2RiZyhzaF9jaGFuLT5kZXYsICJsaW5rIGRlc2NyaXB0b3IgJXAgY2FsbGJhY2tcbiIsCisJCQkJCWRlc2MpOworCQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCQkJc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzaF9jaGFuX3hmZXJfbGRfcXVldWUoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsZF9ub2RlOworCXN0cnVjdCBzaF9kbWFlX3JlZ3MgaHc7CisKKwkvKiBETUEgd29yayBjaGVjayAqLworCWlmIChkbWFlX2lzX2lkbGUoc2hfY2hhbikpCisJCXJldHVybjsKKworCS8qIEZpbmQgdGhlIGZpcnN0IHVuLXRyYW5zZmVyIGRlc2NpcHRvciAqLworCWZvciAobGRfbm9kZSA9IHNoX2NoYW4tPmxkX3F1ZXVlLm5leHQ7CisJCShsZF9ub2RlICE9ICZzaF9jaGFuLT5sZF9xdWV1ZSkKKwkJCSYmICh0b19zaF9kZXNjKGxkX25vZGUpLT5tYXJrID09IERFU0NfQ09NUCk7CisJCWxkX25vZGUgPSBsZF9ub2RlLT5uZXh0KQorCQljcHVfcmVsYXgoKTsKKworCWlmIChsZF9ub2RlICE9ICZzaF9jaGFuLT5sZF9xdWV1ZSkgeworCQkvKiBHZXQgdGhlIGxkIHN0YXJ0IGFkZHJlc3MgZnJvbSBsZF9xdWV1ZSAqLworCQlodyA9IHRvX3NoX2Rlc2MobGRfbm9kZSktPmh3OworCQlkbWFlX3NldF9yZWcoc2hfY2hhbiwgaHcpOworCQlkbWFlX3N0YXJ0KHNoX2NoYW4pOworCX0KK30KKworc3RhdGljIHZvaWQgc2hfZG1hZV9tZW1jcHlfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiA9IHRvX3NoX2NoYW4oY2hhbik7CisJc2hfY2hhbl94ZmVyX2xkX3F1ZXVlKHNoX2NoYW4pOworfQorCitzdGF0aWMgZW51bSBkbWFfc3RhdHVzIHNoX2RtYWVfaXNfY29tcGxldGUoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkJCQlkbWFfY29va2llX3QgY29va2llLAorCQkJCQlkbWFfY29va2llX3QgKmRvbmUsCisJCQkJCWRtYV9jb29raWVfdCAqdXNlZCkKK3sKKwlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuID0gdG9fc2hfY2hhbihjaGFuKTsKKwlkbWFfY29va2llX3QgbGFzdF91c2VkOworCWRtYV9jb29raWVfdCBsYXN0X2NvbXBsZXRlOworCisJc2hfZG1hZV9jaGFuX2xkX2NsZWFudXAoc2hfY2hhbik7CisKKwlsYXN0X3VzZWQgPSBjaGFuLT5jb29raWU7CisJbGFzdF9jb21wbGV0ZSA9IHNoX2NoYW4tPmNvbXBsZXRlZF9jb29raWU7CisJaWYgKGxhc3RfY29tcGxldGUgPT0gLUVCVVNZKQorCQlsYXN0X2NvbXBsZXRlID0gbGFzdF91c2VkOworCisJaWYgKGRvbmUpCisJCSpkb25lID0gbGFzdF9jb21wbGV0ZTsKKworCWlmICh1c2VkKQorCQkqdXNlZCA9IGxhc3RfdXNlZDsKKworCXJldHVybiBkbWFfYXN5bmNfaXNfY29tcGxldGUoY29va2llLCBsYXN0X2NvbXBsZXRlLCBsYXN0X3VzZWQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2hfZG1hZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuID0gKHN0cnVjdCBzaF9kbWFlX2NoYW4gKilkYXRhOworCXUzMiBjaGNyID0gc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBDSENSKTsKKworCWlmIChjaGNyICYgQ0hDUl9URSkgeworCQkvKiBETUEgc3RvcCAqLworCQlkbWFlX2hhbHQoc2hfY2hhbik7CisKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnNoX2NoYW4tPnRhc2tsZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQorc3RhdGljIGlycXJldHVybl90IHNoX2RtYWVfZXJyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldiA9IChzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKilkYXRhOworCisJLyogSVJRIE11bHRpICovCisJaWYgKHNoZGV2LT5wZGF0YS5tb2RlICYgU0hETUFfTUlYX0lSUSkgeworCQlpbnQgY250ID0gMDsKKwkJc3dpdGNoIChpcnEpIHsKKyNpZiBkZWZpbmVkKERNVEU2X0lSUSkgJiYgZGVmaW5lZChETUFFMV9JUlEpCisJCWNhc2UgRE1URTZfSVJROgorCQkJY250Kys7CisjZW5kaWYKKwkJY2FzZSBETVRFMF9JUlE6CisJCQlpZiAoZG1hb3JfcmVhZF9yZWcoY250KSAmIChETUFPUl9OTUlGIHwgRE1BT1JfQUUpKSB7CisJCQkJZGlzYWJsZV9pcnEoaXJxKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKwl9IGVsc2UgeworCQkvKiByZXNldCBkbWEgY29udHJvbGxlciAqLworCQllcnIgPSBzaF9kbWFlX3JzdCgwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWlmIChzaGRldi0+cGRhdGEubW9kZSAmIFNIRE1BX0RNQU9SMSkgeworCQkJZXJyID0gc2hfZG1hZV9yc3QoMSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZGlzYWJsZV9pcnEoaXJxKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkbWFlX2RvX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4gPSAoc3RydWN0IHNoX2RtYWVfY2hhbiAqKWRhdGE7CisJc3RydWN0IHNoX2Rlc2MgKmRlc2MsICpfZGVzYywgKmN1cl9kZXNjID0gTlVMTDsKKwl1MzIgc2FyX2J1ZiA9IHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgU0FSKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsCisJCQkJCSZzaF9jaGFuLT5sZF9xdWV1ZSwgbm9kZSkgeworCQlpZiAoKGRlc2MtPmh3LnNhciArIGRlc2MtPmh3LnRjcikgPT0gc2FyX2J1ZikgeworCQkJY3VyX2Rlc2MgPSBkZXNjOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY3VyX2Rlc2MpIHsKKwkJc3dpdGNoIChjdXJfZGVzYy0+YXN5bmNfdHguY29va2llKSB7CisJCWNhc2UgMDogLyogb3RoZXIgZGVzYyBkYXRhICovCisJCQlicmVhazsKKwkJY2FzZSAtRUJVU1k6IC8qIGxhc3QgZGVzYyAqLworCQlzaF9jaGFuLT5jb21wbGV0ZWRfY29va2llID0KKwkJCQljdXJfZGVzYy0+YXN5bmNfdHguY29va2llOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIGZpcnN0IGRlc2MgKCAwIDwgKSovCisJCQlzaF9jaGFuLT5jb21wbGV0ZWRfY29va2llID0KKwkJCQljdXJfZGVzYy0+YXN5bmNfdHguY29va2llIC0gMTsKKwkJCWJyZWFrOworCQl9CisJCWN1cl9kZXNjLT5tYXJrID0gREVTQ19DT01QOworCX0KKwkvKiBOZXh0IGRlc2MgKi8KKwlzaF9jaGFuX3hmZXJfbGRfcXVldWUoc2hfY2hhbik7CisJc2hfZG1hZV9jaGFuX2xkX2NsZWFudXAoc2hfY2hhbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2RtYWVfaXJxKHVuc2lnbmVkIGludCBpZCkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxID0gMDsKKwlpZiAoaWQgPCBBUlJBWV9TSVpFKGRtdGVfaXJxX21hcCkpCisJCWlycSA9IGRtdGVfaXJxX21hcFtpZF07CisJcmV0dXJuIGlycTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc2hfZG1hZV9jaGFuX3Byb2JlKHN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYsIGludCBpZCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpcnEgPSBnZXRfZG1hZV9pcnEoaWQpOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MgPSBJUlFGX0RJU0FCTEVEOworCXN0cnVjdCBzaF9kbWFlX2NoYW4gKm5ld19zaF9jaGFuOworCisJLyogYWxsb2MgY2hhbm5lbCAqLworCW5ld19zaF9jaGFuID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNoX2RtYWVfY2hhbiksIEdGUF9LRVJORUwpOworCWlmICghbmV3X3NoX2NoYW4pIHsKKwkJZGV2X2VycihzaGRldi0+Y29tbW9uLmRldiwgIk5vIGZyZWUgbWVtb3J5IGZvciBhbGxvY2F0aW5nICIKKwkJCQkiZG1hIGNoYW5uZWxzIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW5ld19zaF9jaGFuLT5kZXYgPSBzaGRldi0+Y29tbW9uLmRldjsKKwluZXdfc2hfY2hhbi0+aWQgPSBpZDsKKworCS8qIEluaXQgRE1BIHRhc2tsZXQgKi8KKwl0YXNrbGV0X2luaXQoJm5ld19zaF9jaGFuLT50YXNrbGV0LCBkbWFlX2RvX3Rhc2tsZXQsCisJCQkodW5zaWduZWQgbG9uZyluZXdfc2hfY2hhbik7CisKKwkvKiBJbml0IHRoZSBjaGFubmVsICovCisJZG1hZV9pbml0KG5ld19zaF9jaGFuKTsKKworCXNwaW5fbG9ja19pbml0KCZuZXdfc2hfY2hhbi0+ZGVzY19sb2NrKTsKKworCS8qIEluaXQgZGVzY3JpcHRlciBtYW5hZ2UgbGlzdCAqLworCUlOSVRfTElTVF9IRUFEKCZuZXdfc2hfY2hhbi0+bGRfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZuZXdfc2hfY2hhbi0+bGRfZnJlZSk7CisKKwkvKiBjb3B5IHN0cnVjdCBkbWFfZGV2aWNlICovCisJbmV3X3NoX2NoYW4tPmNvbW1vbi5kZXZpY2UgPSAmc2hkZXYtPmNvbW1vbjsKKworCS8qIEFkZCB0aGUgY2hhbm5lbCB0byBETUEgZGV2aWNlIGNoYW5uZWwgbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJm5ld19zaF9jaGFuLT5jb21tb24uZGV2aWNlX25vZGUsCisJCQkmc2hkZXYtPmNvbW1vbi5jaGFubmVscyk7CisJc2hkZXYtPmNvbW1vbi5jaGFuY250Kys7CisKKwlpZiAoc2hkZXYtPnBkYXRhLm1vZGUgJiBTSERNQV9NSVhfSVJRKSB7CisJCWlycWZsYWdzID0gSVJRRl9TSEFSRUQ7CisjaWYgZGVmaW5lZChETVRFNl9JUlEpCisJCWlmIChpcnEgPj0gRE1URTZfSVJRKQorCQkJaXJxID0gRE1URTZfSVJROworCQllbHNlCisjZW5kaWYKKwkJCWlycSA9IERNVEUwX0lSUTsKKwl9CisKKwlzbnByaW50ZihuZXdfc2hfY2hhbi0+ZGV2X2lkLCBzaXplb2YobmV3X3NoX2NoYW4tPmRldl9pZCksCisJCQkic2gtZG1hZSVkIiwgbmV3X3NoX2NoYW4tPmlkKTsKKworCS8qIHNldCB1cCBjaGFubmVsIGlycSAqLworCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgJnNoX2RtYWVfaW50ZXJydXB0LAorCQlpcnFmbGFncywgbmV3X3NoX2NoYW4tPmRldl9pZCwgbmV3X3NoX2NoYW4pOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihzaGRldi0+Y29tbW9uLmRldiwgIkRNQSBjaGFubmVsICVkIHJlcXVlc3RfaXJxIGVycm9yICIKKwkJCSJ3aXRoIHJldHVybiAlZFxuIiwgaWQsIGVycik7CisJCWdvdG8gZXJyX25vX2lycTsKKwl9CisKKwkvKiBDSENSIHJlZ2lzdGVyIGNvbnRyb2wgZnVuY3Rpb24gKi8KKwluZXdfc2hfY2hhbi0+c2V0X2NoY3IgPSBkbWFlX3NldF9jaGNyOworCS8qIERNQVJTIHJlZ2lzdGVyIGNvbnRyb2wgZnVuY3Rpb24gKi8KKwluZXdfc2hfY2hhbi0+c2V0X2RtYXJzID0gZG1hZV9zZXRfZG1hcnM7CisKKwlzaGRldi0+Y2hhbltpZF0gPSBuZXdfc2hfY2hhbjsKKwlyZXR1cm4gMDsKKworZXJyX25vX2lycToKKwkvKiByZW1vdmUgZnJvbSBkbWFlbmdpbmUgZGV2aWNlIG5vZGUgKi8KKwlsaXN0X2RlbCgmbmV3X3NoX2NoYW4tPmNvbW1vbi5kZXZpY2Vfbm9kZSk7CisJa2ZyZWUobmV3X3NoX2NoYW4pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHNoX2RtYWVfY2hhbl9yZW1vdmUoc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IHNoZGV2LT5jb21tb24uY2hhbmNudCAtIDEgOyBpID49IDAgOyBpLS0pIHsKKwkJaWYgKHNoZGV2LT5jaGFuW2ldKSB7CisJCQlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaGNoYW4gPSBzaGRldi0+Y2hhbltpXTsKKwkJCWlmICghKHNoZGV2LT5wZGF0YS5tb2RlICYgU0hETUFfTUlYX0lSUSkpCisJCQkJZnJlZV9pcnEoZG10ZV9pcnFfbWFwW2ldLCBzaGNoYW4pOworCisJCQlsaXN0X2RlbCgmc2hjaGFuLT5jb21tb24uZGV2aWNlX25vZGUpOworCQkJa2ZyZWUoc2hjaGFuKTsKKwkJCXNoZGV2LT5jaGFuW2ldID0gTlVMTDsKKwkJfQorCX0KKwlzaGRldi0+Y29tbW9uLmNoYW5jbnQgPSAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzaF9kbWFlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGVyciA9IDAsIGNudCwgZWNudDsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzID0gSVJRRl9ESVNBQkxFRDsKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQorCWludCBlaXJxW10gPSB7IERNQUUwX0lSUSwKKyNpZiBkZWZpbmVkKERNQUUxX0lSUSkKKwkJCURNQUUxX0lSUQorI2VuZGlmCisJCX07CisjZW5kaWYKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2OworCisJc2hkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNoZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGVub3VnaCBtZW1vcnlcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHNoZGV2X2VycjsKKwl9CisKKwkvKiBnZXQgcGxhdGZvcm0gZGF0YSAqLworCWlmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpCisJCWdvdG8gc2hkZXZfZXJyOworCisJLyogcGxhdGZvcm0gZGF0YSAqLworCW1lbWNweSgmc2hkZXYtPnBkYXRhLCBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwKKwkJCXNpemVvZihzdHJ1Y3Qgc2hfZG1hZV9wZGF0YSkpOworCisJLyogcmVzZXQgZG1hIGNvbnRyb2xsZXIgKi8KKwllcnIgPSBzaF9kbWFlX3JzdCgwKTsKKwlpZiAoZXJyKQorCQlnb3RvIHJzdF9lcnI7CisKKwkvKiBTSDc3ODAvODUvMjMgaGFzIERNQU9SMSAqLworCWlmIChzaGRldi0+cGRhdGEubW9kZSAmIFNIRE1BX0RNQU9SMSkgeworCQllcnIgPSBzaF9kbWFlX3JzdCgxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gcnN0X2VycjsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmc2hkZXYtPmNvbW1vbi5jaGFubmVscyk7CisKKwlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBzaGRldi0+Y29tbW9uLmNhcF9tYXNrKTsKKwlzaGRldi0+Y29tbW9uLmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcworCQk9IHNoX2RtYWVfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CisJc2hkZXYtPmNvbW1vbi5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcyA9IHNoX2RtYWVfZnJlZV9jaGFuX3Jlc291cmNlczsKKwlzaGRldi0+Y29tbW9uLmRldmljZV9wcmVwX2RtYV9tZW1jcHkgPSBzaF9kbWFlX3ByZXBfbWVtY3B5OworCXNoZGV2LT5jb21tb24uZGV2aWNlX2lzX3R4X2NvbXBsZXRlID0gc2hfZG1hZV9pc19jb21wbGV0ZTsKKwlzaGRldi0+Y29tbW9uLmRldmljZV9pc3N1ZV9wZW5kaW5nID0gc2hfZG1hZV9tZW1jcHlfaXNzdWVfcGVuZGluZzsKKwlzaGRldi0+Y29tbW9uLmRldiA9ICZwZGV2LT5kZXY7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQorCS8qIE5vbiBNaXggSVJRIG1vZGUgU0g3NzIyL1NINzczMCBldGMuLi4gKi8KKwlpZiAoc2hkZXYtPnBkYXRhLm1vZGUgJiBTSERNQV9NSVhfSVJRKSB7CisJCWlycWZsYWdzID0gSVJRRl9TSEFSRUQ7CisJCWVpcnFbMF0gPSBETVRFMF9JUlE7CisjaWYgZGVmaW5lZChETVRFNl9JUlEpICYmIGRlZmluZWQoRE1BRTFfSVJRKQorCQllaXJxWzFdID0gRE1URTZfSVJROworI2VuZGlmCisJfQorCisJZm9yIChlY250ID0gMCA7IGVjbnQgPCBBUlJBWV9TSVpFKGVpcnEpOyBlY250KyspIHsKKwkJZXJyID0gcmVxdWVzdF9pcnEoZWlycVtlY250XSwgc2hfZG1hZV9lcnIsCisJCQlpcnFmbGFncywgIkRNQUMgQWRkcmVzcyBFcnJvciIsIHNoZGV2KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRE1BIGRldmljZSByZXF1ZXN0X2lycSIKKwkJCQkiZXJyb3IgKGlycSAlZCkgd2l0aCByZXR1cm4gJWRcbiIsCisJCQkJZWlycVtlY250XSwgZXJyKTsKKwkJCWdvdG8gZWlycV9lcnI7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX0NQVV9TSDQgKi8KKworCS8qIENyZWF0ZSBETUEgQ2hhbm5lbCAqLworCWZvciAoY250ID0gMCA7IGNudCA8IE1BWF9ETUFfQ0hBTk5FTFMgOyBjbnQrKykgeworCQllcnIgPSBzaF9kbWFlX2NoYW5fcHJvYmUoc2hkZXYsIGNudCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGNoYW5fcHJvYmVfZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNoZGV2KTsKKwlkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKCZzaGRldi0+Y29tbW9uKTsKKworCXJldHVybiBlcnI7CisKK2NoYW5fcHJvYmVfZXJyOgorCXNoX2RtYWVfY2hhbl9yZW1vdmUoc2hkZXYpOworCitlaXJxX2VycjoKKwlmb3IgKGVjbnQtLSA7IGVjbnQgPj0gMDsgZWNudC0tKQorCQlmcmVlX2lycShlaXJxW2VjbnRdLCBzaGRldik7CisKK3JzdF9lcnI6CisJa2ZyZWUoc2hkZXYpOworCitzaGRldl9lcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2V4aXQgc2hfZG1hZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJnNoZGV2LT5jb21tb24pOworCisJaWYgKHNoZGV2LT5wZGF0YS5tb2RlICYgU0hETUFfTUlYX0lSUSkgeworCQlmcmVlX2lycShETVRFMF9JUlEsIHNoZGV2KTsKKyNpZiBkZWZpbmVkKERNVEU2X0lSUSkKKwkJZnJlZV9pcnEoRE1URTZfSVJRLCBzaGRldik7CisjZW5kaWYKKwl9CisKKwkvKiBjaGFubmVsIGRhdGEgcmVtb3ZlICovCisJc2hfZG1hZV9jaGFuX3JlbW92ZShzaGRldik7CisKKwlpZiAoIShzaGRldi0+cGRhdGEubW9kZSAmIFNIRE1BX01JWF9JUlEpKSB7CisJCWZyZWVfaXJxKERNQUUwX0lSUSwgc2hkZXYpOworI2lmIGRlZmluZWQoRE1BRTFfSVJRKQorCQlmcmVlX2lycShETUFFMV9JUlEsIHNoZGV2KTsKKyNlbmRpZgorCX0KKwlrZnJlZShzaGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hfZG1hZV9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzaF9kbWFlX2N0bF9zdG9wKDApOworCWlmIChzaGRldi0+cGRhdGEubW9kZSAmIFNIRE1BX0RNQU9SMSkKKwkJc2hfZG1hZV9jdGxfc3RvcCgxKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2hfZG1hZV9kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChzaF9kbWFlX3JlbW92ZSksCisJLnNodXRkb3duCT0gc2hfZG1hZV9zaHV0ZG93biwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJzaC1kbWEtZW5naW5lIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2hfZG1hZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmc2hfZG1hZV9kcml2ZXIsIHNoX2RtYWVfcHJvYmUpOworfQorbW9kdWxlX2luaXQoc2hfZG1hZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNoX2RtYWVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaF9kbWFlX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzaF9kbWFlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJOb2J1aGlybyBJd2FtYXRzdSA8aXdhbWF0c3Uubm9idWhpcm9AcmVuZXNhcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlbmVzYXMgU0ggRE1BIEVuZ2luZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NoZG1hLmggYi9kcml2ZXJzL2RtYS9zaGRtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGJjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9zaGRtYS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBSZW5lc2FzIFN1cGVySCBETUEgRW5naW5lIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9idWhpcm8gSXdhbWF0c3UgPGl3YW1hdHN1Lm5vYnVoaXJvQHJlbmVzYXMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlbmVzYXMgU29sdXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9fRE1BX1NIRE1BX0gKKyNkZWZpbmUgX19ETUFfU0hETUFfSAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorCisjZGVmaW5lIFNIX0RNQV9UQ1JfTUFYIDB4MDBGRkZGRkYJLyogMTZNQiAqLworCitzdHJ1Y3Qgc2hfZG1hZV9yZWdzIHsKKwl1MzIgc2FyOyAvKiBTQVIgLyBzb3VyY2UgYWRkcmVzcyAqLworCXUzMiBkYXI7IC8qIERBUiAvIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwl1MzIgdGNyOyAvKiBUQ1IgLyB0cmFuc2ZlciBjb3VudCAqLworfTsKKworc3RydWN0IHNoX2Rlc2MgeworCXN0cnVjdCBsaXN0X2hlYWQgdHhfbGlzdDsKKwlzdHJ1Y3Qgc2hfZG1hZV9yZWdzIGh3OworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgYXN5bmNfdHg7CisJaW50IG1hcms7Cit9OworCitzdHJ1Y3Qgc2hfZG1hZV9jaGFuIHsKKwlkbWFfY29va2llX3QgY29tcGxldGVkX2Nvb2tpZTsJLyogVGhlIG1heGltdW0gY29va2llIGNvbXBsZXRlZCAqLworCXNwaW5sb2NrX3QgZGVzY19sb2NrOwkJCS8qIERlc2NyaXB0b3Igb3BlcmF0aW9uIGxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxkX3F1ZXVlOwkJLyogTGluayBkZXNjcmlwdG9ycyBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGRfZnJlZTsJCS8qIExpbmsgZGVzY3JpcHRvcnMgZnJlZSAqLworCXN0cnVjdCBkbWFfY2hhbiBjb21tb247CQkJLyogRE1BIGNvbW1vbiBjaGFubmVsICovCisJc3RydWN0IGRldmljZSAqZGV2OwkJCQkvKiBDaGFubmVsIGRldmljZSAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwkvKiBUYXNrbGV0ICovCisJaW50IGRlc2NzX2FsbG9jYXRlZDsJCQkvKiBkZXNjIGNvdW50ICovCisJaW50IGlkOwkJCQkvKiBSYXcgaWQgb2YgdGhpcyBjaGFubmVsICovCisJY2hhciBkZXZfaWRbMTZdOwkvKiB1bmlxdWUgbmFtZSBwZXIgRE1BQyBvZiBjaGFubmVsICovCisKKwkvKiBTZXQgY2hjciAqLworCWludCAoKnNldF9jaGNyKShzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuLCB1MzIgcmVncyk7CisJLyogU2V0IERNQSByZXNvdXJjZSAqLworCWludCAoKnNldF9kbWFycykoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiwgdTE2IHJlcyk7Cit9OworCitzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgeworCXN0cnVjdCBkbWFfZGV2aWNlIGNvbW1vbjsKKwlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpjaGFuW01BWF9ETUFfQ0hBTk5FTFNdOworCXN0cnVjdCBzaF9kbWFlX3BkYXRhIHBkYXRhOworfTsKKworI2RlZmluZSB0b19zaF9jaGFuKGNoYW4pIGNvbnRhaW5lcl9vZihjaGFuLCBzdHJ1Y3Qgc2hfZG1hZV9jaGFuLCBjb21tb24pCisjZGVmaW5lIHRvX3NoX2Rlc2MobGgpIGNvbnRhaW5lcl9vZihsaCwgc3RydWN0IHNoX2Rlc2MsIG5vZGUpCisjZGVmaW5lIHR4X3RvX3NoX2Rlc2ModHgpIGNvbnRhaW5lcl9vZih0eCwgc3RydWN0IHNoX2Rlc2MsIGFzeW5jX3R4KQorCisjZW5kaWYJLyogX19ETUFfU0hETUFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdHh4OWRtYWMuYyBiL2RyaXZlcnMvZG1hL3R4eDlkbWFjLmMKaW5kZXggNzgzNzkzMC4uZmI2YmI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvdHh4OWRtYWMuYworKysgYi9kcml2ZXJzL2RtYS90eHg5ZG1hYy5jCkBAIC0xODAsOSArMTgwLDggQEAKIAogc3RhdGljIHN0cnVjdCB0eHg5ZG1hY19kZXNjICp0eHg5ZG1hY19sYXN0X2NoaWxkKHN0cnVjdCB0eHg5ZG1hY19kZXNjICpkZXNjKQogewotCWlmICghbGlzdF9lbXB0eSgmZGVzYy0+dHhkLnR4X2xpc3QpKQotCQlkZXNjID0gbGlzdF9lbnRyeShkZXNjLT50eGQudHhfbGlzdC5wcmV2LAotCQkJCSAgc3RydWN0IHR4eDlkbWFjX2Rlc2MsIGRlc2Nfbm9kZSk7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXNjLT50eF9saXN0KSkKKwkJZGVzYyA9IGxpc3RfZW50cnkoZGVzYy0+dHhfbGlzdC5wcmV2LCB0eXBlb2YoKmRlc2MpLCBkZXNjX25vZGUpOwogCXJldHVybiBkZXNjOwogfQogCkBAIC0xOTcsNiArMTk2LDcgQEAKIAlkZXNjID0ga3phbGxvYyhzaXplb2YoKmRlc2MpLCBmbGFncyk7CiAJaWYgKCFkZXNjKQogCQlyZXR1cm4gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmZGVzYy0+dHhfbGlzdCk7CiAJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCgmZGVzYy0+dHhkLCAmZGMtPmNoYW4pOwogCWRlc2MtPnR4ZC50eF9zdWJtaXQgPSB0eHg5ZG1hY190eF9zdWJtaXQ7CiAJLyogdHhkLmZsYWdzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gaW4gcHJlcCBmdW5jcyAqLwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJc3RydWN0IHR4eDlkbWFjX2RldiAqZGRldiA9IGRjLT5kZGV2OwogCXN0cnVjdCB0eHg5ZG1hY19kZXNjICpjaGlsZDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eGQudHhfbGlzdCwgZGVzY19ub2RlKQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eF9saXN0LCBkZXNjX25vZGUpCiAJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGNoYW4ycGFyZW50KCZkYy0+Y2hhbiksCiAJCQkJY2hpbGQtPnR4ZC5waHlzLCBkZGV2LT5kZXNjc2l6ZSwKIAkJCQlETUFfVE9fREVWSUNFKTsKQEAgLTI2NywxMSArMjY3LDExIEBACiAJCXR4eDlkbWFjX3N5bmNfZGVzY19mb3JfY3B1KGRjLCBkZXNjKTsKIAogCQlzcGluX2xvY2tfYmgoJmRjLT5sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmRlc2MtPnR4ZC50eF9saXN0LCBkZXNjX25vZGUpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eF9saXN0LCBkZXNjX25vZGUpCiAJCQlkZXZfdmRiZyhjaGFuMmRldigmZGMtPmNoYW4pLAogCQkJCSAibW92aW5nIGNoaWxkIGRlc2MgJXAgdG8gZnJlZWxpc3RcbiIsCiAJCQkJIGNoaWxkKTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmZGVzYy0+dHhkLnR4X2xpc3QsICZkYy0+ZnJlZV9saXN0KTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmZGVzYy0+dHhfbGlzdCwgJmRjLT5mcmVlX2xpc3QpOwogCQlkZXZfdmRiZyhjaGFuMmRldigmZGMtPmNoYW4pLCAibW92aW5nIGRlc2MgJXAgdG8gZnJlZWxpc3RcbiIsCiAJCQkgZGVzYyk7CiAJCWxpc3RfYWRkKCZkZXNjLT5kZXNjX25vZGUsICZkYy0+ZnJlZV9saXN0KTsKQEAgLTQyOSw3ICs0MjksNyBAQAogCXBhcmFtID0gdHhkLT5jYWxsYmFja19wYXJhbTsKIAogCXR4eDlkbWFjX3N5bmNfZGVzY19mb3JfY3B1KGRjLCBkZXNjKTsKLQlsaXN0X3NwbGljZV9pbml0KCZ0eGQtPnR4X2xpc3QsICZkYy0+ZnJlZV9saXN0KTsKKwlsaXN0X3NwbGljZV9pbml0KCZkZXNjLT50eF9saXN0LCAmZGMtPmZyZWVfbGlzdCk7CiAJbGlzdF9tb3ZlKCZkZXNjLT5kZXNjX25vZGUsICZkYy0+ZnJlZV9saXN0KTsKIAogCWlmICghZHMpIHsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCQkgIkJhZCBkZXNjcmlwdG9yIHN1Ym1pdHRlZCBmb3IgRE1BISAoY29va2llOiAlZClcbiIsCiAJCSBiYWRfZGVzYy0+dHhkLmNvb2tpZSk7CiAJdHh4OWRtYWNfZHVtcF9kZXNjKGRjLCAmYmFkX2Rlc2MtPmh3ZGVzYyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmJhZF9kZXNjLT50eGQudHhfbGlzdCwgZGVzY19ub2RlKQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZiYWRfZGVzYy0+dHhfbGlzdCwgZGVzY19ub2RlKQogCQl0eHg5ZG1hY19kdW1wX2Rlc2MoZGMsICZjaGlsZC0+aHdkZXNjKTsKIAkvKiBQcmV0ZW5kIHRoZSBkZXNjcmlwdG9yIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KIAl0eHg5ZG1hY19kZXNjcmlwdG9yX2NvbXBsZXRlKGRjLCBiYWRfZGVzYyk7CkBAIC02MTMsNyArNjEzLDcgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eGQudHhfbGlzdCwgZGVzY19ub2RlKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhfbGlzdCwgZGVzY19ub2RlKQogCQkJaWYgKGRlc2NfcmVhZF9DSEFSKGRjLCBjaGlsZCkgPT0gY2hhaW4pIHsKIAkJCQkvKiBDdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi8KIAkJCQlpZiAoY3NyICYgVFhYOV9ETUFfQ1NSX0FCQ0hDKQpAQCAtODIzLDggKzgyMyw3IEBACiAJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuMnBhcmVudCgmZGMtPmNoYW4pLAogCQkJCQlwcmV2LT50eGQucGh5cywgZGRldi0+ZGVzY3NpemUsCiAJCQkJCURNQV9UT19ERVZJQ0UpOwotCQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+ZGVzY19ub2RlLAotCQkJCQkmZmlyc3QtPnR4ZC50eF9saXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwgJmZpcnN0LT50eF9saXN0KTsKIAkJfQogCQlwcmV2ID0gZGVzYzsKIAl9CkBAIC05MTksOCArOTE4LDcgQEAKIAkJCQkJcHJldi0+dHhkLnBoeXMsCiAJCQkJCWRkZXYtPmRlc2NzaXplLAogCQkJCQlETUFfVE9fREVWSUNFKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwKLQkJCQkJJmZpcnN0LT50eGQudHhfbGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5kZXNjX25vZGUsICZmaXJzdC0+dHhfbGlzdCk7CiAJCX0KIAkJcHJldiA9IGRlc2M7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdHh4OWRtYWMuaCBiL2RyaXZlcnMvZG1hL3R4eDlkbWFjLmgKaW5kZXggYzkwN2ZmMC4uMzY1ZDQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvdHh4OWRtYWMuaAorKysgYi9kcml2ZXJzL2RtYS90eHg5ZG1hYy5oCkBAIC0yMzEsNiArMjMxLDcgQEAKIAogCS8qIFRIRU4gdmFsdWVzIGZvciBkcml2ZXIgaG91c2VrZWVwaW5nICovCiAJc3RydWN0IGxpc3RfaGVhZAkJZGVzY19ub2RlIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQl0eF9saXN0OwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgl0eGQ7CiAJc2l6ZV90CQkJCWxlbjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvS2NvbmZpZyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCmluZGV4IGEzY2ExOGUuLjU1YzljNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCkBAIC00Nyw2ICs0NywxOCBAQAogCSAgU291cmNlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgd2hlcmUgZGVidWdnaW5nIG1lc3NhZ2UKIAkgIHByaW50ZWQgd2lsbCBiZSBhZGRlZCB0byBkZWJ1Z2dpbmcgbWVzc2FnZS4KIAorIGNvbmZpZyBFREFDX0RFQ09ERV9NQ0UKKwl0cmlzdGF0ZSAiRGVjb2RlIE1DRXMgaW4gaHVtYW4tcmVhZGFibGUgZm9ybSAob25seSBvbiBBTUQgZm9yIG5vdykiCisJZGVwZW5kcyBvbiBDUFVfU1VQX0FNRCAmJiBYODZfTUNFCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGRlY29kZSBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbnMKKwkgIG9jY3VyaW5nIG9uIHlvdXIgbWFjaGluZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorCisJICBZb3Ugc2hvdWxkIGRlZmluaXRlbHkgc2F5IFkgaGVyZSBpbiBjYXNlIHlvdSB3YW50IHRvIGRlY29kZSBNQ0VzCisJICB3aGljaCBvY2N1ciByZWFsbHkgZWFybHkgdXBvbiBib290LCBiZWZvcmUgdGhlIG1vZHVsZSBpbmZyYXN0cnVjdHVyZQorCSAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisKIGNvbmZpZyBFREFDX01NX0VEQUMKIAl0cmlzdGF0ZSAiTWFpbiBNZW1vcnkgRURBQyAoRXJyb3IgRGV0ZWN0aW9uIEFuZCBDb3JyZWN0aW9uKSByZXBvcnRpbmciCiAJaGVscApAQCAtNTksNyArNzEsNyBAQAogCiBjb25maWcgRURBQ19BTUQ2NAogCXRyaXN0YXRlICJBTUQ2NCAoT3B0ZXJvbiwgQXRobG9uNjQpIEs4LCBGMTBoLCBGMTFoIgotCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIEs4X05CICYmIFg4Nl82NCAmJiBQQ0kgJiYgQ1BVX1NVUF9BTUQKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBLOF9OQiAmJiBYODZfNjQgJiYgUENJICYmIEVEQUNfREVDT0RFX01DRQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgQU1EIDY0CiAJICBGYW1pbGllcyBvZiBNZW1vcnkgQ29udHJvbGxlcnMgKEs4LCBGMTBoIGFuZCBGMTFoKQpAQCAtMTMzLDYgKzE0NSwxMyBAQAogCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIG9uIHRoZSBJbnRlbAogCSAgMzAwMCBhbmQgMzAxMCBzZXJ2ZXIgY2hpcHNldHMuCiAKK2NvbmZpZyBFREFDX0kzMjAwCisJdHJpc3RhdGUgIkludGVsIDMyMDAiCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgUENJICYmIFg4NiAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlIEludGVsCisJICAzMjAwIGFuZCAzMjEwIHNlcnZlciBjaGlwc2V0cy4KKwogY29uZmlnIEVEQUNfWDM4CiAJdHJpc3RhdGUgIkludGVsIFgzOCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kgJiYgWDg2CkBAIC0xNzYsMTEgKzE5NSwxMSBAQAogCSAgU2FuIENsZW1lbnRlIE1DSC4KIAogY29uZmlnIEVEQUNfTVBDODVYWAotCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDODV4eCIKLQlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBGU0xfU09DICYmIE1QQzg1eHgKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1QQzgzeHggLyBNUEM4NXh4IgorCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIEZTTF9TT0MgJiYgKFBQQ184M3h4IHx8IE1QQzg1eHgpCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIG9uIHRoZSBGcmVlc2NhbGUKLQkgIE1QQzg1NjAsIE1QQzg1NDAsIE1QQzg1NDgKKwkgIE1QQzgzNDksIE1QQzg1NjAsIE1QQzg1NDAsIE1QQzg1NDgKIAogY29uZmlnIEVEQUNfTVY2NFg2MAogCXRyaXN0YXRlICJNYXJ2ZWxsIE1WNjR4NjAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKaW5kZXggY2ZhMDMzYy4uYmM1ZGMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQpAQCAtNiw3ICs2LDYgQEAKICMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAjCiAKLQogb2JqLSQoQ09ORklHX0VEQUMpCQkJOj0gZWRhY19zdHViLm8KIG9iai0kKENPTkZJR19FREFDX01NX0VEQUMpCQkrPSBlZGFjX2NvcmUubwogCkBAIC0xNyw5ICsxNiw3IEBACiBlZGFjX2NvcmUtb2JqcwkrPSBlZGFjX3BjaS5vIGVkYWNfcGNpX3N5c2ZzLm8KIGVuZGlmCiAKLWlmZGVmIENPTkZJR19DUFVfU1VQX0FNRAotZWRhY19jb3JlLW9ianMgICs9IGVkYWNfbWNlX2FtZC5vCi1lbmRpZgorb2JqLSQoQ09ORklHX0VEQUNfREVDT0RFX01DRSkJCSs9IGVkYWNfbWNlX2FtZC5vCiAKIG9iai0kKENPTkZJR19FREFDX0FNRDc2WCkJCSs9IGFtZDc2eF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0NQQzkyNSkJCSs9IGNwYzkyNV9lZGFjLm8KQEAgLTMyLDYgKzI5LDcgQEAKIG9iai0kKENPTkZJR19FREFDX0k4Mjg3NVApCQkrPSBpODI4NzVwX2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfSTgyOTc1WCkJCSs9IGk4Mjk3NXhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19JMzAwMCkJCSs9IGkzMDAwX2VkYWMubworb2JqLSQoQ09ORklHX0VEQUNfSTMyMDApCQkrPSBpMzIwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX1gzOCkJCQkrPSB4MzhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19JODI4NjApCQkrPSBpODI4NjBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19SODI2MDApCQkrPSByODI2MDBfZWRhYy5vCkBAIC00OSwzICs0Nyw0IEBACiBvYmotJChDT05GSUdfRURBQ19QUEM0WFgpCQkrPSBwcGM0eHhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19BTUQ4MTExKQkJKz0gYW1kODExMV9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0FNRDgxMzEpCQkrPSBhbWQ4MTMxX2VkYWMubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYwppbmRleCA0ZTU1MWU2Li5hMzg4MzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKQEAgLTE1LDggKzE1LDggQEAKIAogLyogTG9va3VwIHRhYmxlIGZvciBhbGwgcG9zc2libGUgTUMgY29udHJvbCBpbnN0YW5jZXMgKi8KIHN0cnVjdCBhbWQ2NF9wdnQ7Ci1zdGF0aWMgc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpX2xvb2t1cFtNQVhfTlVNTk9ERVNdOwotc3RhdGljIHN0cnVjdCBhbWQ2NF9wdnQgKnB2dF9sb29rdXBbTUFYX05VTU5PREVTXTsKK3N0YXRpYyBzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2lfbG9va3VwW0VEQUNfTUFYX05VTU5PREVTXTsKK3N0YXRpYyBzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnRfbG9va3VwW0VEQUNfTUFYX05VTU5PREVTXTsKIAogLyoKICAqIFNlZSBGMng4MCBmb3IgSzggYW5kIEYyeFsxLDBdODAgZm9yIEZhbTEwIGFuZCBsYXRlci4gVGhlIHRhYmxlIGJlbG93IGlzIG9ubHkKQEAgLTE4OSw3ICsxODksMTAgQEAKIC8qIE1hcCBmcm9tIGEgQ1NST1cgZW50cnkgdG8gdGhlIG1hc2sgZW50cnkgdGhhdCBvcGVyYXRlcyBvbiBpdCAqLwogc3RhdGljIGlubGluZSB1MzIgYW1kNjRfbWFwX3RvX2Rjc19tYXNrKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGNzcm93KQogewotCXJldHVybiBjc3JvdyA+PiAocHZ0LT5udW1fZGNzbSA+PiAzKTsKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHhmICYmIHB2dC0+ZXh0X21vZGVsIDwgT1BURVJPTl9DUFVfUkVWX0YpCisJCXJldHVybiBjc3JvdzsKKwllbHNlCisJCXJldHVybiBjc3JvdyA+PiAxOwogfQogCiAvKiByZXR1cm4gdGhlICdiYXNlJyBhZGRyZXNzIHRoZSBpJ3RoIENTIGVudHJ5IG9mIHRoZSAnZGN0JyBEUkFNIGNvbnRyb2xsZXIgKi8KQEAgLTI3OSwyOSArMjgyLDI2IEBACiAJaW50bHZfZW4gPSBwdnQtPmRyYW1fSW50bHZFblswXTsKIAogCWlmIChpbnRsdl9lbiA9PSAwKSB7Ci0JCWZvciAobm9kZV9pZCA9IDA7IDsgKSB7CisJCWZvciAobm9kZV9pZCA9IDA7IG5vZGVfaWQgPCBEUkFNX1JFR19DT1VOVDsgbm9kZV9pZCsrKSB7CiAJCQlpZiAoYW1kNjRfYmFzZV9saW1pdF9tYXRjaChwdnQsIHN5c19hZGRyLCBub2RlX2lkKSkKLQkJCQlicmVhazsKLQotCQkJaWYgKCsrbm9kZV9pZCA+PSBEUkFNX1JFR19DT1VOVCkKLQkJCQlnb3RvIGVycl9ub19tYXRjaDsKKwkJCQlnb3RvIGZvdW5kOwogCQl9Ci0JCWdvdG8gZm91bmQ7CisJCWdvdG8gZXJyX25vX21hdGNoOwogCX0KIAotCWlmICh1bmxpa2VseSgoaW50bHZfZW4gIT0gKDB4MDEgPDwgOCkpICYmCi0JCSAgICAgKGludGx2X2VuICE9ICgweDAzIDw8IDgpKSAmJgotCQkgICAgIChpbnRsdl9lbiAhPSAoMHgwNyA8PCA4KSkpKSB7CisJaWYgKHVubGlrZWx5KChpbnRsdl9lbiAhPSAweDAxKSAmJgorCQkgICAgIChpbnRsdl9lbiAhPSAweDAzKSAmJgorCQkgICAgIChpbnRsdl9lbiAhPSAweDA3KSkpIHsKIAkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywgImp1bmsgdmFsdWUgb2YgMHgleCBleHRyYWN0ZWQgZnJvbSAiCiAJCQkgICAgICJJbnRsdkVuIGZpZWxkIG9mIERSQU0gQmFzZSBSZWdpc3RlciBmb3Igbm9kZSAwOiAiCi0JCQkgICAgICJUaGlzIHByb2JhYmx5IGluZGljYXRlcyBhIEJJT1MgYnVnLlxuIiwgaW50bHZfZW4pOworCQkJICAgICAidGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgYSBCSU9TIGJ1Zy5cbiIsIGludGx2X2VuKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJYml0cyA9ICgoKHUzMikgc3lzX2FkZHIpID4+IDEyKSAmIGludGx2X2VuOwogCiAJZm9yIChub2RlX2lkID0gMDsgOyApIHsKLQkJaWYgKChwdnQtPmRyYW1fbGltaXRbbm9kZV9pZF0gJiBpbnRsdl9lbikgPT0gYml0cykKKwkJaWYgKChwdnQtPmRyYW1fSW50bHZTZWxbbm9kZV9pZF0gJiBpbnRsdl9lbikgPT0gYml0cykKIAkJCWJyZWFrOwkvKiBpbnRsdl9zZWwgZmllbGQgbWF0Y2hlcyAqLwogCiAJCWlmICgrK25vZGVfaWQgPj0gRFJBTV9SRUdfQ09VTlQpCkBAIC0zMTEsMTAgKzMxMSwxMCBAQAogCS8qIHNhbml0eSB0ZXN0IGZvciBzeXNfYWRkciAqLwogCWlmICh1bmxpa2VseSghYW1kNjRfYmFzZV9saW1pdF9tYXRjaChwdnQsIHN5c19hZGRyLCBub2RlX2lkKSkpIHsKIAkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywKLQkJCSAgIiVzKCk6IHN5c19hZGRyIDB4JWx4IGZhbGxzIG91dHNpZGUgYmFzZS9saW1pdCAiCi0JCQkgICJhZGRyZXNzIHJhbmdlIGZvciBub2RlICVkIHdpdGggbm9kZSBpbnRlcmxlYXZpbmcgIgotCQkJICAiZW5hYmxlZC5cbiIsIF9fZnVuY19fLCAodW5zaWduZWQgbG9uZylzeXNfYWRkciwKLQkJCSAgbm9kZV9pZCk7CisJCQkgICAgICIlcygpOiBzeXNfYWRkciAweCVsbHggZmFsbHMgb3V0c2lkZSBiYXNlL2xpbWl0ICIKKwkJCSAgICAgImFkZHJlc3MgcmFuZ2UgZm9yIG5vZGUgJWQgd2l0aCBub2RlIGludGVybGVhdmluZyAiCisJCQkgICAgICJlbmFibGVkLlxuIiwKKwkJCSAgICAgX19mdW5jX18sIHN5c19hZGRyLCBub2RlX2lkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0zNzcsNyArMzc3LDcgQEAKIAkgKiBiYXNlL21hc2sgcmVnaXN0ZXIgcGFpciwgdGVzdCB0aGUgY29uZGl0aW9uIHNob3duIG5lYXIgdGhlIHN0YXJ0IG9mCiAJICogc2VjdGlvbiAzLjUuNCAocC4gODQsIEJLREcgIzI2MDk0LCBLOCwgcmV2QS1FKS4KIAkgKi8KLQlmb3IgKGNzcm93ID0gMDsgY3Nyb3cgPCBDSElQU0VMRUNUX0NPVU5UOyBjc3JvdysrKSB7CisJZm9yIChjc3JvdyA9IDA7IGNzcm93IDwgcHZ0LT5jc19jb3VudDsgY3Nyb3crKykgewogCiAJCS8qIFRoaXMgRFJBTSBjaGlwIHNlbGVjdCBpcyBkaXNhYmxlZCBvbiB0aGlzIG5vZGUgKi8KIAkJaWYgKChwdnQtPmRjc2IwW2Nzcm93XSAmIEs4X0RDU0JfQ1NfRU5BQkxFKSA9PSAwKQpAQCAtNzM0LDcgKzczNCw3IEBACiAJdTY0IGJhc2UsIG1hc2s7CiAKIAlwdnQgPSBtY2ktPnB2dF9pbmZvOwotCUJVR19PTigoY3Nyb3cgPCAwKSB8fCAoY3Nyb3cgPj0gQ0hJUFNFTEVDVF9DT1VOVCkpOworCUJVR19PTigoY3Nyb3cgPCAwKSB8fCAoY3Nyb3cgPj0gcHZ0LT5jc19jb3VudCkpOwogCiAJYmFzZSA9IGJhc2VfZnJvbV9kY3RfYmFzZShwdnQsIGNzcm93KTsKIAltYXNrID0gbWFza19mcm9tX2RjdF9tYXNrKHB2dCwgY3Nyb3cpOwpAQCAtOTYyLDM1ICs5NjIsMjcgQEAKICAqLwogc3RhdGljIHZvaWQgYW1kNjRfc2V0X2RjdF9iYXNlX2FuZF9tYXNrKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKIHsKLQlpZiAocHZ0LT5leHRfbW9kZWwgPj0gT1BURVJPTl9DUFVfUkVWX0YpIHsKKworCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAweGYgJiYgcHZ0LT5leHRfbW9kZWwgPCBPUFRFUk9OX0NQVV9SRVZfRikgeworCQlwdnQtPmRjc2JfYmFzZQkJPSBSRVZfRV9EQ1NCX0JBU0VfQklUUzsKKwkJcHZ0LT5kY3NtX21hc2sJCT0gUkVWX0VfRENTTV9NQVNLX0JJVFM7CisJCXB2dC0+ZGNzX21hc2tfbm90dXNlZAk9IFJFVl9FX0RDU19OT1RVU0VEX0JJVFM7CisJCXB2dC0+ZGNzX3NoaWZ0CQk9IFJFVl9FX0RDU19TSElGVDsKKwkJcHZ0LT5jc19jb3VudAkJPSA4OworCQlwdnQtPm51bV9kY3NtCQk9IDg7CisJfSBlbHNlIHsKIAkJcHZ0LT5kY3NiX2Jhc2UJCT0gUkVWX0ZfRjFYaF9EQ1NCX0JBU0VfQklUUzsKIAkJcHZ0LT5kY3NtX21hc2sJCT0gUkVWX0ZfRjFYaF9EQ1NNX01BU0tfQklUUzsKIAkJcHZ0LT5kY3NfbWFza19ub3R1c2VkCT0gUkVWX0ZfRjFYaF9EQ1NfTk9UVVNFRF9CSVRTOwogCQlwdnQtPmRjc19zaGlmdAkJPSBSRVZfRl9GMVhoX0RDU19TSElGVDsKIAotCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2KSB7Ci0JCWNhc2UgMHhmOgotCQkJcHZ0LT5udW1fZGNzbSA9IFJFVl9GX0RDU01fQ09VTlQ7Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MTA6Ci0JCQlwdnQtPm51bV9kY3NtID0gRjEwX0RDU01fQ09VTlQ7Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MTE6Ci0JCQlwdnQtPm51bV9kY3NtID0gRjExX0RDU01fQ09VTlQ7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYW1kNjRfcHJpbnRrKEtFUk5fRVJSLCAiVW5zdXBwb3J0ZWQgZmFtaWx5IVxuIik7Ci0JCQlicmVhazsKKwkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4MTEpIHsKKwkJCXB2dC0+Y3NfY291bnQgPSA0OworCQkJcHZ0LT5udW1fZGNzbSA9IDI7CisJCX0gZWxzZSB7CisJCQlwdnQtPmNzX2NvdW50ID0gODsKKwkJCXB2dC0+bnVtX2Rjc20gPSA0OwogCQl9Ci0JfSBlbHNlIHsKLQkJcHZ0LT5kY3NiX2Jhc2UJCT0gUkVWX0VfRENTQl9CQVNFX0JJVFM7Ci0JCXB2dC0+ZGNzbV9tYXNrCQk9IFJFVl9FX0RDU01fTUFTS19CSVRTOwotCQlwdnQtPmRjc19tYXNrX25vdHVzZWQJPSBSRVZfRV9EQ1NfTk9UVVNFRF9CSVRTOwotCQlwdnQtPmRjc19zaGlmdAkJPSBSRVZfRV9EQ1NfU0hJRlQ7Ci0JCXB2dC0+bnVtX2Rjc20JCT0gUkVWX0VfRENTTV9DT1VOVDsKIAl9CiB9CiAKQEAgLTEwMDMsNyArOTk1LDcgQEAKIAogCWFtZDY0X3NldF9kY3RfYmFzZV9hbmRfbWFzayhwdnQpOwogCi0JZm9yIChjcyA9IDA7IGNzIDwgQ0hJUFNFTEVDVF9DT1VOVDsgY3MrKykgeworCWZvciAoY3MgPSAwOyBjcyA8IHB2dC0+Y3NfY291bnQ7IGNzKyspIHsKIAkJcmVnID0gSzhfRENTQjAgKyAoY3MgKiA0KTsKIAkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIHJlZywKIAkJCQkJCSZwdnQtPmRjc2IwW2NzXSk7CkBAIC0xMTkzLDcgKzExODUsNyBAQAogCSAqIGRpZmZlcmVudCBmcm9tIHRoZSBub2RlIHRoYXQgZGV0ZWN0ZWQgdGhlIGVycm9yLgogCSAqLwogCXNyY19tY2kgPSBmaW5kX21jX2J5X3N5c19hZGRyKG1jaSwgU3lzdGVtQWRkcmVzcyk7Ci0JaWYgKHNyY19tY2kpIHsKKwlpZiAoIXNyY19tY2kpIHsKIAkJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCiAJCQkgICAgICJmYWlsZWQgdG8gbWFwIGVycm9yIGFkZHJlc3MgMHglbHggdG8gYSBub2RlXG4iLAogCQkJICAgICAodW5zaWduZWQgbG9uZylTeXN0ZW1BZGRyZXNzKTsKQEAgLTEzNzYsOCArMTM2OCw4IEBACiAKIAlwdnQtPmRyYW1fSW50bHZFbltkcmFtXSA9IChsb3dfYmFzZSA+PiA4KSAmIDB4NzsKIAotCXB2dC0+ZHJhbV9iYXNlW2RyYW1dID0gKCgoKCh1NjQpIGhpZ2hfYmFzZSAmIDB4MDAwMDAwRkYpIDw8IDMyKSB8Ci0JCQkJKCh1NjQpIGxvd19iYXNlICYgMHhGRkZGMDAwMCkpKSA8PCA4OworCXB2dC0+ZHJhbV9iYXNlW2RyYW1dID0gKCgodTY0KWhpZ2hfYmFzZSAmIDB4MDAwMDAwRkYpIDw8IDQwKSB8CisJCQkgICAgICAgKCgodTY0KWxvd19iYXNlICAmIDB4RkZGRjAwMDApIDw8IDgpOwogCiAJbG93X29mZnNldCA9IEs4X0RSQU1fTElNSVRfTE9XICsgKGRyYW0gPDwgMyk7CiAJaGlnaF9vZmZzZXQgPSBGMTBfRFJBTV9MSU1JVF9ISUdIICsgKGRyYW0gPDwgMyk7CkBAIC0xMzk4LDkgKzEzOTAsOSBAQAogCSAqIEV4dHJhY3QgYWRkcmVzcyB2YWx1ZXMgYW5kIGZvcm0gYSBMSU1JVCBhZGRyZXNzLiBMaW1pdCBpcyB0aGUgSElHSEVTVAogCSAqIG1lbW9yeSBsb2NhdGlvbiBvZiB0aGUgcmVnaW9uLCBzbyBsb3cgMjQgYml0cyBuZWVkIHRvIGJlIGFsbCBvbmVzLgogCSAqLwotCWxvd19saW1pdCB8PSAweDAwMDBGRkZGOwotCXB2dC0+ZHJhbV9saW1pdFtkcmFtXSA9Ci0JCSgoKCh1NjQpIGhpZ2hfbGltaXQgPDwgMzIpICsgKHU2NCkgbG93X2xpbWl0KSA8PCA4KSB8ICgweEZGKTsKKwlwdnQtPmRyYW1fbGltaXRbZHJhbV0gPSAoKCh1NjQpaGlnaF9saW1pdCAmIDB4MDAwMDAwRkYpIDw8IDQwKSB8CisJCQkJKCgodTY0KSBsb3dfbGltaXQgJiAweEZGRkYwMDAwKSA8PCA4KSB8CisJCQkJMHgwMEZGRkZGRjsKIH0KIAogc3RhdGljIHZvaWQgZjEwX3JlYWRfZHJhbV9jdGxfcmVnaXN0ZXIoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQpAQCAtMTU2Niw3ICsxNTU4LDcgQEAKIAogCWRlYnVnZjEoIklucHV0QWRkcj0weCV4ICBjaGFubmVsc2VsZWN0PSVkXG4iLCBpbl9hZGRyLCBjcyk7CiAKLQlmb3IgKGNzcm93ID0gMDsgY3Nyb3cgPCBDSElQU0VMRUNUX0NPVU5UOyBjc3JvdysrKSB7CisJZm9yIChjc3JvdyA9IDA7IGNzcm93IDwgcHZ0LT5jc19jb3VudDsgY3Nyb3crKykgewogCiAJCWNzX2Jhc2UgPSBhbWQ2NF9nZXRfZGN0X2Jhc2UocHZ0LCBjcywgY3Nyb3cpOwogCQlpZiAoIShjc19iYXNlICYgSzhfRENTQl9DU19FTkFCTEUpKQpAQCAtMjI2Miw3ICsyMjU0LDcgQEAKIHsKIAl1MzIgZWMgID0gRVJST1JfQ09ERShpbmZvLT5uYnNsKTsKIAl1MzIgeGVjID0gRVhUX0VSUk9SX0NPREUoaW5mby0+bmJzbCk7Ci0JaW50IGVjY190eXBlID0gaW5mby0+bmJzaCAmICgweDMgPDwgMTMpOworCWludCBlY2NfdHlwZSA9IChpbmZvLT5uYnNoID4+IDEzKSAmIDB4MzsKIAogCS8qIEJhaWwgZWFybHkgb3V0IGlmIHRoaXMgd2FzIGFuICdvYnNlcnZlZCcgZXJyb3IgKi8KIAlpZiAoUFAoZWMpID09IEs4X05CU0xfUFBfT0JTKQpAQCAtMjQ5Nyw3ICsyNDg5LDcgQEAKICAqIE5PVEU6IENQVSBSZXZpc2lvbiBEZXBlbmRlbnQgY29kZQogICoKICAqIElucHV0OgotICoJQGNzcm93X25yIENoaXBTZWxlY3QgUm93IE51bWJlciAoMC4uQ0hJUFNFTEVDVF9DT1VOVC0xKQorICoJQGNzcm93X25yIENoaXBTZWxlY3QgUm93IE51bWJlciAoMC4ucHZ0LT5jc19jb3VudC0xKQogICoJazggcHJpdmF0ZSBwb2ludGVyIHRvIC0tPgogICoJCQlEUkFNIEJhbmsgQWRkcmVzcyBtYXBwaW5nIHJlZ2lzdGVyCiAgKgkJCW5vZGVfaWQKQEAgLTI1NzcsNyArMjU2OSw3IEBACiAJCShwdnQtPm5iY2ZnICYgSzhfTkJDRkdfRUNDX0VOQUJMRSkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiCiAJCSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQ0hJUFNFTEVDVF9DT1VOVDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHB2dC0+Y3NfY291bnQ7IGkrKykgewogCQljc3JvdyA9ICZtY2ktPmNzcm93c1tpXTsKIAogCQlpZiAoKHB2dC0+ZGNzYjBbaV0gJiBLOF9EQ1NCX0NTX0VOQUJMRSkgPT0gMCkgewpAQCAtMjk4OCw3ICsyOTgwLDcgQEAKIAkJZ290byBlcnJfZXhpdDsKIAogCXJldCA9IC1FTk9NRU07Ci0JbWNpID0gZWRhY19tY19hbGxvYygwLCBDSElQU0VMRUNUX0NPVU5ULCBwdnQtPmNoYW5uZWxfY291bnQsIG5vZGVfaWQpOworCW1jaSA9IGVkYWNfbWNfYWxsb2MoMCwgcHZ0LT5jc19jb3VudCwgcHZ0LT5jaGFubmVsX2NvdW50LCBub2RlX2lkKTsKIAlpZiAoIW1jaSkKIAkJZ290byBlcnJfZXhpdDsKIApAQCAtMzE3MSw3ICszMTYzLDcgQEAKIAlvcHN0YXRlX2luaXQoKTsKIAogCWlmIChjYWNoZV9rOF9ub3J0aGJyaWRnZXMoKSA8IDApCi0JCWdvdG8gZXJyX2V4aXQ7CisJCXJldHVybiBlcnI7CiAKIAllcnIgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbWQ2NF9wY2lfZHJpdmVyKTsKIAlpZiAoZXJyKQpAQCAtMzE5Nyw4ICszMTg5LDYgQEAKIAogZXJyXzJuZF9zdGFnZToKIAlkZWJ1Z2YwKCIybmQgc3RhZ2UgZmFpbGVkXG4iKTsKLQotZXJyX2V4aXQ6CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbWQ2NF9wY2lfZHJpdmVyKTsKIAogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaAppbmRleCA4ZWEwN2UyLi5jNmYzNTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmgKQEAgLTEzMiw2ICsxMzIsOCBAQAogI2RlZmluZSBFREFDX0FNRDY0X1ZFUlNJT04JCSIgVmVyOiAzLjIuMCAiIF9fREFURV9fCiAjZGVmaW5lIEVEQUNfTU9EX1NUUgkJCSJhbWQ2NF9lZGFjIgogCisjZGVmaW5lIEVEQUNfTUFYX05VTU5PREVTCQk4CisKIC8qIEV4dGVuZGVkIE1vZGVsIGZyb20gQ1BVSUQsIGZvciBDUFUgUmV2aXNpb24gbnVtYmVycyAqLwogI2RlZmluZSBPUFRFUk9OX0NQVV9MRV9SRVZfQwkJMAogI2RlZmluZSBPUFRFUk9OX0NQVV9SRVZfRAkJMQpAQCAtMTQyLDcgKzE0NCw3IEBACiAjZGVmaW5lIE9QVEVST05fQ1BVX1JFVl9GQQkJNQogCiAvKiBIYXJkd2FyZSBsaW1pdCBvbiBDaGlwU2VsZWN0IHJvd3MgcGVyIE1DIGFuZCBwcm9jZXNzb3JzIHBlciBzeXN0ZW0gKi8KLSNkZWZpbmUgQ0hJUFNFTEVDVF9DT1VOVAkJOAorI2RlZmluZSBNQVhfQ1NfQ09VTlQJCQk4CiAjZGVmaW5lIERSQU1fUkVHX0NPVU5UCQkJOAogCiAKQEAgLTE5Myw3ICsxOTUsNiBAQAogICovCiAjZGVmaW5lIFJFVl9FX0RDU0JfQkFTRV9CSVRTCQkoMHhGRkUwRkUwMFVMTCkKICNkZWZpbmUgUkVWX0VfRENTX1NISUZUCQkJNAotI2RlZmluZSBSRVZfRV9EQ1NNX0NPVU5UCQk4CiAKICNkZWZpbmUgUkVWX0ZfRjFYaF9EQ1NCX0JBU0VfQklUUwkoMHgxRkY4M0ZFMFVMTCkKICNkZWZpbmUgUkVWX0ZfRjFYaF9EQ1NfU0hJRlQJCTgKQEAgLTIwNCw5ICsyMDUsNiBAQAogICovCiAjZGVmaW5lIFJFVl9GX0RDU0JfQkFTRV9CSVRTCQkoMHgxRkY4M0ZFMFVMTCkKICNkZWZpbmUgUkVWX0ZfRENTX1NISUZUCQkJOAotI2RlZmluZSBSRVZfRl9EQ1NNX0NPVU5UCQk0Ci0jZGVmaW5lIEYxMF9EQ1NNX0NPVU5UCQkJNAotI2RlZmluZSBGMTFfRENTTV9DT1VOVAkJCTIKIAogLyogRFJBTSBDUyBNYXNrIFJlZ2lzdGVycyAqLwogI2RlZmluZSBLOF9EQ1NNMAkJCTB4NjAKQEAgLTM3NCwxMyArMzcyLDExIEBACiAKICNkZWZpbmUgU0VUX05CX0RSQU1fSU5KRUNUSU9OX1dSSVRFKHdvcmQsIGJpdHMpICBcCiAJCQkJCShCSVQoKCh3b3JkKSAmIDB4RikgKyAyMCkgfCBcCi0JCQkJCUJJVCgxNykgfCAgXAotCQkJCQkoKGJpdHMpICYgMHhGKSkKKwkJCQkJQklUKDE3KSB8IGJpdHMpCiAKICNkZWZpbmUgU0VUX05CX0RSQU1fSU5KRUNUSU9OX1JFQUQod29yZCwgYml0cykgIFwKIAkJCQkJKEJJVCgoKHdvcmQpICYgMHhGKSArIDIwKSB8IFwKLQkJCQkJQklUKDE2KSB8ICBcCi0JCQkJCSgoYml0cykgJiAweEYpKQorCQkJCQlCSVQoMTYpIHwgIGJpdHMpCiAKICNkZWZpbmUgSzhfTkJDQVAJCQkweEU4CiAjZGVmaW5lIEs4X05CQ0FQX0NPUkVTCQkJKEJJVCgxMil8QklUKDEzKSkKQEAgLTQ0NSwxMiArNDQxLDEyIEBACiAJdTMyIGRiYW0xOwkJLyogRFJBTSBCYXNlIEFkZHJlc3MgTWFwcGluZyByZWcgZm9yIERDVDEgKi8KIAogCS8qIERSQU0gQ1MgQmFzZSBBZGRyZXNzIFJlZ2lzdGVycyBGMnhbMSwwXVs1Qzo0MF0gKi8KLQl1MzIgZGNzYjBbQ0hJUFNFTEVDVF9DT1VOVF07Ci0JdTMyIGRjc2IxW0NISVBTRUxFQ1RfQ09VTlRdOworCXUzMiBkY3NiMFtNQVhfQ1NfQ09VTlRdOworCXUzMiBkY3NiMVtNQVhfQ1NfQ09VTlRdOwogCiAJLyogRFJBTSBDUyBNYXNrIFJlZ2lzdGVycyBGMnhbMSwwXVs2Qzo2MF0gKi8KLQl1MzIgZGNzbTBbQ0hJUFNFTEVDVF9DT1VOVF07Ci0JdTMyIGRjc20xW0NISVBTRUxFQ1RfQ09VTlRdOworCXUzMiBkY3NtMFtNQVhfQ1NfQ09VTlRdOworCXUzMiBkY3NtMVtNQVhfQ1NfQ09VTlRdOwogCiAJLyoKIAkgKiBEZWNvZGVkIHBhcnRzIG9mIERSQU0gQkFTRSBhbmQgTElNSVQgUmVnaXN0ZXJzCkBAIC00NzAsNiArNDY2LDcgQEAKIAkgKi8KIAl1MzIgZGNzYl9iYXNlOwkJLyogRENTQiBiYXNlIGJpdHMgKi8KIAl1MzIgZGNzbV9tYXNrOwkJLyogRENTTSBtYXNrIGJpdHMgKi8KKwl1MzIgY3NfY291bnQ7CQkvKiBudW0gY2hpcCBzZWxlY3RzICg9PSBudW0gRENTQiByZWdpc3RlcnMpICovCiAJdTMyIG51bV9kY3NtOwkJLyogTnVtYmVyIG9mIERDU00gcmVnaXN0ZXJzICovCiAJdTMyIGRjc19tYXNrX25vdHVzZWQ7CS8qIERDU00gbm90dXNlZCBtYXNrIGJpdHMgKi8KIAl1MzIgZGNzX3NoaWZ0OwkJLyogRENTQiBhbmQgRENTTSBzaGlmdCB2YWx1ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWNfaW5qLmMgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19pbmouYwppbmRleCBkMzY3NWI3Li4yOWYxZjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19pbmouYworKysgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19pbmouYwpAQCAtMSw1ICsxLDExIEBACiAjaW5jbHVkZSAiYW1kNjRfZWRhYy5oIgogCitzdGF0aWMgc3NpemVfdCBhbWQ2NF9pbmplY3Rfc2VjdGlvbl9zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgcHZ0LT5pbmplY3Rpb24uc2VjdGlvbik7Cit9CisKIC8qCiAgKiBzdG9yZSBlcnJvciBpbmplY3Rpb24gc2VjdGlvbiB2YWx1ZSB3aGljaCByZWZlcnMgdG8gb25lIG9mIDQgMTYtYnl0ZSBzZWN0aW9ucwogICogd2l0aGluIGEgNjQtYnl0ZSBjYWNoZWxpbmUKQEAgLTE1LDEyICsyMSwyNiBAQAogCiAJcmV0ID0gc3RyaWN0X3N0cnRvdWwoZGF0YSwgMTAsICZ2YWx1ZSk7CiAJaWYgKHJldCAhPSAtRUlOVkFMKSB7CisKKwkJaWYgKHZhbHVlID4gMykgeworCQkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywKKwkJCQkgICAgICIlczogaW52YWxpZCBzZWN0aW9uIDB4JWx4XG4iLAorCQkJCSAgICAgX19mdW5jX18sIHZhbHVlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKIAkJcHZ0LT5pbmplY3Rpb24uc2VjdGlvbiA9ICh1MzIpIHZhbHVlOwogCQlyZXR1cm4gY291bnQ7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGFtZDY0X2luamVjdF93b3JkX3Nob3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBwdnQtPmluamVjdGlvbi53b3JkKTsKK30KKwogLyoKICAqIHN0b3JlIGVycm9yIGluamVjdGlvbiB3b3JkIHZhbHVlIHdoaWNoIHJlZmVycyB0byBvbmUgb2YgOSAxNi1iaXQgd29yZCBvZiB0aGUKICAqIDE2LWJ5dGUgKDEyOC1iaXQgKyBFQ0MgYml0cykgc2VjdGlvbgpAQCAtMzcsMTQgKzU3LDI1IEBACiAJcmV0ID0gc3RyaWN0X3N0cnRvdWwoZGF0YSwgMTAsICZ2YWx1ZSk7CiAJaWYgKHJldCAhPSAtRUlOVkFMKSB7CiAKLQkJdmFsdWUgPSAodmFsdWUgPD0gOCkgPyB2YWx1ZSA6IDA7Ci0JCXB2dC0+aW5qZWN0aW9uLndvcmQgPSAodTMyKSB2YWx1ZTsKKwkJaWYgKHZhbHVlID4gOCkgeworCQkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywKKwkJCQkgICAgICIlczogaW52YWxpZCB3b3JkIDB4JWx4XG4iLAorCQkJCSAgICAgX19mdW5jX18sIHZhbHVlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKKwkJcHZ0LT5pbmplY3Rpb24ud29yZCA9ICh1MzIpIHZhbHVlOwogCQlyZXR1cm4gY291bnQ7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGFtZDY0X2luamVjdF9lY2NfdmVjdG9yX3Nob3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBwdnQtPmluamVjdGlvbi5iaXRfbWFwKTsKK30KKwogLyoKICAqIHN0b3JlIDE2IGJpdCBlcnJvciBpbmplY3Rpb24gdmVjdG9yIHdoaWNoIGVuYWJsZXMgaW5qZWN0aW5nIGVycm9ycyB0byB0aGUKICAqIGNvcnJlc3BvbmRpbmcgYml0IHdpdGhpbiB0aGUgZXJyb3IgaW5qZWN0aW9uIHdvcmQgYWJvdmUuIFdoZW4gdXNlZCBkdXJpbmcgYQpAQCAtNjAsOCArOTEsMTQgQEAKIAlyZXQgPSBzdHJpY3Rfc3RydG91bChkYXRhLCAxNiwgJnZhbHVlKTsKIAlpZiAocmV0ICE9IC1FSU5WQUwpIHsKIAotCQlwdnQtPmluamVjdGlvbi5iaXRfbWFwID0gKHUzMikgdmFsdWUgJiAweEZGRkY7CisJCWlmICh2YWx1ZSAmIDB4RkZGRjAwMDApIHsKKwkJCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCQkJICAgICAiJXM6IGludmFsaWQgRWNjVmVjdG9yOiAweCVseFxuIiwKKwkJCQkgICAgIF9fZnVuY19fLCB2YWx1ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCisJCXB2dC0+aW5qZWN0aW9uLmJpdF9tYXAgPSAodTMyKSB2YWx1ZTsKIAkJcmV0dXJuIGNvdW50OwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTQ3LDcgKzE4NCw3IEBACiAJCQkubmFtZSA9ICJpbmplY3Rfc2VjdGlvbiIsCiAJCQkubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUikKIAkJfSwKLQkJLnNob3cgPSBOVUxMLAorCQkuc2hvdyA9IGFtZDY0X2luamVjdF9zZWN0aW9uX3Nob3csCiAJCS5zdG9yZSA9IGFtZDY0X2luamVjdF9zZWN0aW9uX3N0b3JlLAogCX0sCiAJewpAQCAtMTU1LDcgKzE5Miw3IEBACiAJCQkubmFtZSA9ICJpbmplY3Rfd29yZCIsCiAJCQkubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUikKIAkJfSwKLQkJLnNob3cgPSBOVUxMLAorCQkuc2hvdyA9IGFtZDY0X2luamVjdF93b3JkX3Nob3csCiAJCS5zdG9yZSA9IGFtZDY0X2luamVjdF93b3JkX3N0b3JlLAogCX0sCiAJewpAQCAtMTYzLDcgKzIwMCw3IEBACiAJCQkubmFtZSA9ICJpbmplY3RfZWNjX3ZlY3RvciIsCiAJCQkubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUikKIAkJfSwKLQkJLnNob3cgPSBOVUxMLAorCQkuc2hvdyA9IGFtZDY0X2luamVjdF9lY2NfdmVjdG9yX3Nob3csCiAJCS5zdG9yZSA9IGFtZDY0X2luamVjdF9lY2NfdmVjdG9yX3N0b3JlLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2NwYzkyNV9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvY3BjOTI1X2VkYWMuYwppbmRleCA4YzU0MTk2Li4zZDUwMjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvY3BjOTI1X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvY3BjOTI1X2VkYWMuYwpAQCAtODg1LDE0ICs4ODUsMTQgQEAKIAogCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwKIAkJCQkgICAgIHItPnN0YXJ0LAotCQkJCSAgICAgci0+ZW5kIC0gci0+c3RhcnQgKyAxLAorCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyKSwKIAkJCQkgICAgIHBkZXYtPm5hbWUpKSB7CiAJCWNwYzkyNV9wcmludGsoS0VSTl9FUlIsICJVbmFibGUgdG8gcmVxdWVzdCBtZW0gcmVnaW9uXG4iKTsKIAkJcmVzID0gLUVCVVNZOwogCQlnb3RvIGVycjE7CiAJfQogCi0JdmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJdmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOwogCWlmICghdmJhc2UpIHsKIAkJY3BjOTI1X3ByaW50ayhLRVJOX0VSUiwgIlVuYWJsZSB0byBpb3JlbWFwIGRldmljZVxuIik7CiAJCXJlcyA9IC1FTk9NRU07CkBAIC05NTMsNyArOTUzLDcgQEAKIAljcGM5MjVfbWNfZXhpdChtY2kpOwogCWVkYWNfbWNfZnJlZShtY2kpOwogZXJyMjoKLQlkZXZtX3JlbGVhc2VfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByLT5zdGFydCwgci0+ZW5kLXItPnN0YXJ0KzEpOworCWRldm1fcmVsZWFzZV9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKIGVycjE6CiAJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJnBkZXYtPmRldiwgY3BjOTI1X3Byb2JlKTsKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jIGIvZHJpdmVycy9lZGFjL2VkYWNfZGV2aWNlLmMKaW5kZXggYjAyYTZhNi4uZDVlMTNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfZGV2aWNlLmMKQEAgLTM1Niw3ICszNTYsNiBAQAogCiAJZWRhY19kZXYgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvLCByY3UpOwogCUlOSVRfTElTVF9IRUFEKCZlZGFjX2Rldi0+bGluayk7Ci0JY29tcGxldGUoJmVkYWNfZGV2LT5yZW1vdmFsX2NvbXBsZXRlKTsKIH0KIAogLyoKQEAgLTM2OSwxMCArMzY4LDggQEAKIAkJCQkJCSplZGFjX2RldmljZSkKIHsKIAlsaXN0X2RlbF9yY3UoJmVkYWNfZGV2aWNlLT5saW5rKTsKLQotCWluaXRfY29tcGxldGlvbigmZWRhY19kZXZpY2UtPnJlbW92YWxfY29tcGxldGUpOwogCWNhbGxfcmN1KCZlZGFjX2RldmljZS0+cmN1LCBjb21wbGV0ZV9lZGFjX2RldmljZV9saXN0X2RlbCk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmZWRhY19kZXZpY2UtPnJlbW92YWxfY29tcGxldGUpOworCXJjdV9iYXJyaWVyKCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tYy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfbWMuYwppbmRleCAzMzViN2ViLi5iNjI5YzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKQEAgLTQxOCwxNiArNDE4LDE0IEBACiAKIAltY2kgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG1lbV9jdGxfaW5mbywgcmN1KTsKIAlJTklUX0xJU1RfSEVBRCgmbWNpLT5saW5rKTsKLQljb21wbGV0ZSgmbWNpLT5jb21wbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlbF9tY19mcm9tX2dsb2JhbF9saXN0KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKIHsKIAlhdG9taWNfZGVjKCZlZGFjX2hhbmRsZXJzKTsKIAlsaXN0X2RlbF9yY3UoJm1jaS0+bGluayk7Ci0JaW5pdF9jb21wbGV0aW9uKCZtY2ktPmNvbXBsZXRlKTsKIAljYWxsX3JjdSgmbWNpLT5yY3UsIGNvbXBsZXRlX21jX2xpc3RfZGVsKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY2ktPmNvbXBsZXRlKTsKKwlyY3VfYmFycmllcigpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jZV9hbWQuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jZV9hbWQuYwppbmRleCAwYzIxYzM3Li43MTNlZDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tY2VfYW1kLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWNlX2FtZC5jCkBAIC0zLDYgKzMsNyBAQAogCiBzdGF0aWMgYm9vbCByZXBvcnRfZ2FydF9lcnJvcnM7CiBzdGF0aWMgdm9pZCAoKm5iX2J1c19kZWNvZGVyKShpbnQgbm9kZV9pZCwgc3RydWN0IGVycl9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkICgqb3JpZ19tY2VfY2FsbGJhY2spKHN0cnVjdCBtY2UgKm0pOwogCiB2b2lkIGFtZF9yZXBvcnRfZ2FydF9lcnJvcnMoYm9vbCB2KQogewpAQCAtMzYyLDcgKzM2Myw3IEBACiAJCXByX3dhcm5pbmcoIkh1aD8gVW5rbm93biBNQ0UgZXJyb3IgMHgleFxuIiwgZWMpOwogfQogCi12b2lkIGRlY29kZV9tY2Uoc3RydWN0IG1jZSAqbSkKK3N0YXRpYyB2b2lkIGFtZF9kZWNvZGVfbWNlKHN0cnVjdCBtY2UgKm0pCiB7CiAJc3RydWN0IGVycl9yZWdzIHJlZ3M7CiAJaW50IG5vZGUsIGVjYzsKQEAgLTQyMCwzICs0MjEsMzIgQEAKIAogCWFtZF9kZWNvZGVfZXJyX2NvZGUobS0+c3RhdHVzICYgMHhmZmZmKTsKIH0KKworc3RhdGljIGludCBfX2luaXQgbWNlX2FtZF9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBXZSBjYW4gZGVjb2RlIE1DRXMgZm9yIE9wdGVyb24gYW5kIGxhdGVyIENQVXM6CisJICovCisJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpICYmCisJICAgIChib290X2NwdV9kYXRhLng4NiA+PSAweGYpKSB7CisJCS8qIHNhZmUgdGhlIGRlZmF1bHQgZGVjb2RlIG1jZSBjYWxsYmFjayAqLworCQlvcmlnX21jZV9jYWxsYmFjayA9IHg4Nl9tY2VfZGVjb2RlX2NhbGxiYWNrOworCisJCXg4Nl9tY2VfZGVjb2RlX2NhbGxiYWNrID0gYW1kX2RlY29kZV9tY2U7CisJfQorCisJcmV0dXJuIDA7Cit9CitlYXJseV9pbml0Y2FsbChtY2VfYW1kX2luaXQpOworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZCBfX2V4aXQgbWNlX2FtZF9leGl0KHZvaWQpCit7CisJeDg2X21jZV9kZWNvZGVfY2FsbGJhY2sgPSBvcmlnX21jZV9jYWxsYmFjazsKK30KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUQgTUNFIGRlY29kZXIiKTsKK01PRFVMRV9BTElBUygiZWRhYy1tY2UtYW1kIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfZXhpdChtY2VfYW1kX2V4aXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCmluZGV4IDMwYjU4NWIuLmVmYjVkNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCkBAIC0xNzQsNyArMTc0LDYgQEAKIAogCXBjaSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8sIHJjdSk7CiAJSU5JVF9MSVNUX0hFQUQoJnBjaS0+bGluayk7Ci0JY29tcGxldGUoJnBjaS0+Y29tcGxldGUpOwogfQogCiAvKgpAQCAtMTg1LDkgKzE4NCw4IEBACiBzdGF0aWMgdm9pZCBkZWxfZWRhY19wY2lfZnJvbV9nbG9iYWxfbGlzdChzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSkKIHsKIAlsaXN0X2RlbF9yY3UoJnBjaS0+bGluayk7Ci0JaW5pdF9jb21wbGV0aW9uKCZwY2ktPmNvbXBsZXRlKTsKIAljYWxsX3JjdSgmcGNpLT5yY3UsIGNvbXBsZXRlX2VkYWNfcGNpX2xpc3RfZGVsKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwY2ktPmNvbXBsZXRlKTsKKwlyY3VfYmFycmllcigpOwogfQogCiAjaWYgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2kzMjAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pMzIwMF9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlNGRiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9pMzIwMF9lZGFjLmMKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBJbnRlbCAzMjAwLzMyMTAgTWVtb3J5IENvbnRyb2xsZXIga2VybmVsIG1vZHVsZQorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgQWthbWFpIFRlY2hub2xvZ2llcywgSW5jLgorICogUG9ydGlvbnMgYnkgSGl0b3NoaSBNaXRha2UgPGgubWl0YWtlQGdtYWlsLmNvbT4uCisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZWRhYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSAiZWRhY19jb3JlLmgiCisKKyNkZWZpbmUgSTMyMDBfUkVWSVNJT04gICAgICAgICIxLjEiCisKKyNkZWZpbmUgRURBQ19NT0RfU1RSICAgICAgICAiaTMyMDBfZWRhYyIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzMyMDBfSEIgICAgMHgyOWYwCisKKyNkZWZpbmUgSTMyMDBfUkFOS1MJCTgKKyNkZWZpbmUgSTMyMDBfUkFOS1NfUEVSX0NIQU5ORUwJNAorI2RlZmluZSBJMzIwMF9DSEFOTkVMUwkJMgorCisvKiBJbnRlbCAzMjAwIHJlZ2lzdGVyIGFkZHJlc3NlcyAtIGRldmljZSAwIGZ1bmN0aW9uIDAgLSBEUkFNIENvbnRyb2xsZXIgKi8KKworI2RlZmluZSBJMzIwMF9NQ0hCQVJfTE9XCTB4NDgJLyogTUNIIE1lbW9yeSBNYXBwZWQgUmVnaXN0ZXIgQkFSICovCisjZGVmaW5lIEkzMjAwX01DSEJBUl9ISUdICTB4NGMKKyNkZWZpbmUgSTMyMDBfTUNIQkFSX01BU0sJMHhmZmZmZmMwMDBVTEwJLyogYml0cyAzNToxNCAqLworI2RlZmluZSBJMzIwMF9NTVJfV0lORE9XX1NJWkUJMTYzODQKKworI2RlZmluZSBJMzIwMF9UT00JCTB4YTAJLyogVG9wIG9mIE1lbW9yeSAoMTZiKQorCQkgKgorCQkgKiAxNToxMCByZXNlcnZlZAorCQkgKiAgOTowICB0b3RhbCBwb3B1bGF0ZWQgcGh5c2ljYWwgbWVtb3J5CisJCSAqLworI2RlZmluZSBJMzIwMF9UT01fTUFTSwkJMHgzZmYJLyogYml0cyA5OjAgKi8KKyNkZWZpbmUgSTMyMDBfVE9NX1NISUZUCQkyNgkvKiA2NE1pQiBncmFpbiAqLworCisjZGVmaW5lIEkzMjAwX0VSUlNUUwkJMHhjOAkvKiBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgKDE2YikKKwkJICoKKwkJICogMTUgICAgcmVzZXJ2ZWQKKwkJICogMTQgICAgSXNvY2hyb25vdXMgVEJXUlIgUnVuIEJlaGluZCBGSUZPIEZ1bGwKKwkJICogICAgICAgKElUQ1YpCisJCSAqIDEzICAgIElzb2Nocm9ub3VzIFRCV1JSIFJ1biBCZWhpbmQgRklGTyBQdXQKKwkJICogICAgICAgKElUU1RWKQorCQkgKiAxMiAgICByZXNlcnZlZAorCQkgKiAxMSAgICBNQ0ggVGhlcm1hbCBTZW5zb3IgRXZlbnQKKwkJICogICAgICAgZm9yIFNNSS9TQ0kvU0VSUiAoR1RTRSkKKwkJICogMTAgICAgcmVzZXJ2ZWQKKwkJICogIDkgICAgTE9DSyB0byBub24tRFJBTSBNZW1vcnkgRmxhZyAoTENLRikKKwkJICogIDggICAgcmVzZXJ2ZWQKKwkJICogIDcgICAgRFJBTSBUaHJvdHRsZSBGbGFnIChEVEYpCisJCSAqICA2OjIgIHJlc2VydmVkCisJCSAqICAxICAgIE11bHRpLWJpdCBEUkFNIEVDQyBFcnJvciBGbGFnIChETUVSUikKKwkJICogIDAgICAgU2luZ2xlLWJpdCBEUkFNIEVDQyBFcnJvciBGbGFnIChEU0VSUikKKwkJICovCisjZGVmaW5lIEkzMjAwX0VSUlNUU19VRQkJMHgwMDAyCisjZGVmaW5lIEkzMjAwX0VSUlNUU19DRQkJMHgwMDAxCisjZGVmaW5lIEkzMjAwX0VSUlNUU19CSVRTCShJMzIwMF9FUlJTVFNfVUUgfCBJMzIwMF9FUlJTVFNfQ0UpCisKKworLyogSW50ZWwgIE1NSU8gcmVnaXN0ZXIgc3BhY2UgLSBkZXZpY2UgMCBmdW5jdGlvbiAwIC0gTU1SIHNwYWNlICovCisKKyNkZWZpbmUgSTMyMDBfQzBEUkIJMHgyMDAJLyogQ2hhbm5lbCAwIERSQU0gUmFuayBCb3VuZGFyeSAoMTZiIHggNCkKKwkJICoKKwkJICogMTU6MTAgcmVzZXJ2ZWQKKwkJICogIDk6MCAgQ2hhbm5lbCAwIERSQU0gUmFuayBCb3VuZGFyeSBBZGRyZXNzCisJCSAqLworI2RlZmluZSBJMzIwMF9DMURSQgkweDYwMAkvKiBDaGFubmVsIDEgRFJBTSBSYW5rIEJvdW5kYXJ5ICgxNmIgeCA0KSAqLworI2RlZmluZSBJMzIwMF9EUkJfTUFTSwkweDNmZgkvKiBiaXRzIDk6MCAqLworI2RlZmluZSBJMzIwMF9EUkJfU0hJRlQJMjYJLyogNjRNaUIgZ3JhaW4gKi8KKworI2RlZmluZSBJMzIwMF9DMEVDQ0VSUkxPRwkweDI4MAkvKiBDaGFubmVsIDAgRUNDIEVycm9yIExvZyAoNjRiKQorCQkgKgorCQkgKiA2Mzo0OCBFcnJvciBDb2x1bW4gQWRkcmVzcyAoRVJSQ09MKQorCQkgKiA0NzozMiBFcnJvciBSb3cgQWRkcmVzcyAoRVJSUk9XKQorCQkgKiAzMToyOSBFcnJvciBCYW5rIEFkZHJlc3MgKEVSUkJBTkspCisJCSAqIDI4OjI3IEVycm9yIFJhbmsgQWRkcmVzcyAoRVJSUkFOSykKKwkJICogMjY6MjQgcmVzZXJ2ZWQKKwkJICogMjM6MTYgRXJyb3IgU3luZHJvbWUgKEVSUlNZTkQpCisJCSAqIDE1OiAyIHJlc2VydmVkCisJCSAqICAgIDEgIE11bHRpcGxlIEJpdCBFcnJvciBTdGF0dXMgKE1FUlJTVFMpCisJCSAqICAgIDAgIENvcnJlY3RhYmxlIEVycm9yIFN0YXR1cyAoQ0VSUlNUUykKKwkJICovCisjZGVmaW5lIEkzMjAwX0MxRUNDRVJSTE9HCQkweDY4MAkvKiBDaGFuIDEgRUNDIEVycm9yIExvZyAoNjRiKSAqLworI2RlZmluZSBJMzIwMF9FQ0NFUlJMT0dfQ0UJCTB4MQorI2RlZmluZSBJMzIwMF9FQ0NFUlJMT0dfVUUJCTB4MgorI2RlZmluZSBJMzIwMF9FQ0NFUlJMT0dfUkFOS19CSVRTCTB4MTgwMDAwMDAKKyNkZWZpbmUgSTMyMDBfRUNDRVJSTE9HX1JBTktfU0hJRlQJMjcKKyNkZWZpbmUgSTMyMDBfRUNDRVJSTE9HX1NZTkRST01FX0JJVFMJMHhmZjAwMDAKKyNkZWZpbmUgSTMyMDBfRUNDRVJSTE9HX1NZTkRST01FX1NISUZUCTE2CisjZGVmaW5lIEkzMjAwX0NBUElEMAkJCTB4ZTAJLyogUC45NSBvZiBzcGVjIGZvciBkZXRhaWxzICovCisKK3N0cnVjdCBpMzIwMF9wcml2IHsKKwl2b2lkIF9faW9tZW0gKndpbmRvdzsKK307CisKK3N0YXRpYyBpbnQgbnJfY2hhbm5lbHM7CisKK3N0YXRpYyBpbnQgaG93X21hbnlfY2hhbm5lbHMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdW5zaWduZWQgY2hhciBjYXBpZDBfOGI7IC8qIDh0aCBieXRlIG9mIENBUElEMCAqLworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgSTMyMDBfQ0FQSUQwICsgOCwgJmNhcGlkMF84Yik7CisJaWYgKGNhcGlkMF84YiAmIDB4MjApIHsgLyogY2hlY2sgRENEOiBEdWFsIENoYW5uZWwgRGlzYWJsZSAqLworCQlkZWJ1Z2YwKCJJbiBzaW5nbGUgY2hhbm5lbCBtb2RlLlxuIik7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWRlYnVnZjAoIkluIGR1YWwgY2hhbm5lbCBtb2RlLlxuIik7CisJCXJldHVybiAyOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNjZXJybG9nX3N5bmRyb21lKHU2NCBsb2cpCit7CisJcmV0dXJuIChsb2cgJiBJMzIwMF9FQ0NFUlJMT0dfU1lORFJPTUVfQklUUykgPj4KKwkJSTMyMDBfRUNDRVJSTE9HX1NZTkRST01FX1NISUZUOworfQorCitzdGF0aWMgaW50IGVjY2VycmxvZ19yb3coaW50IGNoYW5uZWwsIHU2NCBsb2cpCit7CisJdTY0IHJhbmsgPSAoKGxvZyAmIEkzMjAwX0VDQ0VSUkxPR19SQU5LX0JJVFMpID4+CisJCUkzMjAwX0VDQ0VSUkxPR19SQU5LX1NISUZUKTsKKwlyZXR1cm4gcmFuayB8IChjaGFubmVsICogSTMyMDBfUkFOS1NfUEVSX0NIQU5ORUwpOworfQorCitlbnVtIGkzMjAwX2NoaXBzIHsKKwlJMzIwMCA9IDAsCit9OworCitzdHJ1Y3QgaTMyMDBfZGV2X2luZm8geworCWNvbnN0IGNoYXIgKmN0bF9uYW1lOworfTsKKworc3RydWN0IGkzMjAwX2Vycm9yX2luZm8geworCXUxNiBlcnJzdHM7CisJdTE2IGVycnN0czI7CisJdTY0IGVjY2VycmxvZ1tJMzIwMF9DSEFOTkVMU107Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkzMjAwX2Rldl9pbmZvIGkzMjAwX2RldnNbXSA9IHsKKwlbSTMyMDBdID0geworCQkuY3RsX25hbWUgPSAiaTMyMDAiCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqbWNpX3BkZXY7CitzdGF0aWMgaW50IGkzMjAwX3JlZ2lzdGVyZWQgPSAxOworCisKK3N0YXRpYyB2b2lkIGkzMjAwX2NsZWFyX2Vycm9yX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJcGRldiA9IHRvX3BjaV9kZXYobWNpLT5kZXYpOworCisJLyoKKwkgKiBDbGVhciBhbnkgZXJyb3IgYml0cy4KKwkgKiAoWWVzLCB3ZSByZWFsbHkgY2xlYXIgYml0cyBieSB3cml0aW5nIDEgdG8gdGhlbS4pCisJICovCisJcGNpX3dyaXRlX2JpdHMxNihwZGV2LCBJMzIwMF9FUlJTVFMsIEkzMjAwX0VSUlNUU19CSVRTLAorCQlJMzIwMF9FUlJTVFNfQklUUyk7Cit9CisKK3N0YXRpYyB2b2lkIGkzMjAwX2dldF9hbmRfY2xlYXJfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCXN0cnVjdCBpMzIwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBpMzIwMF9wcml2ICpwcml2ID0gbWNpLT5wdnRfaW5mbzsKKwl2b2lkIF9faW9tZW0gKndpbmRvdyA9IHByaXYtPndpbmRvdzsKKworCXBkZXYgPSB0b19wY2lfZGV2KG1jaS0+ZGV2KTsKKworCS8qCisJICogVGhpcyBpcyBhIG1lc3MgYmVjYXVzZSB0aGVyZSBpcyBubyBhdG9taWMgd2F5IHRvIHJlYWQgYWxsIHRoZQorCSAqIHJlZ2lzdGVycyBhdCBvbmNlIGFuZCB0aGUgcmVnaXN0ZXJzIGNhbiB0cmFuc2l0aW9uIGZyb20gQ0UgYmVpbmcKKwkgKiBvdmVyd3JpdHRlbiBieSBVRS4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBJMzIwMF9FUlJTVFMsICZpbmZvLT5lcnJzdHMpOworCWlmICghKGluZm8tPmVycnN0cyAmIEkzMjAwX0VSUlNUU19CSVRTKSkKKwkJcmV0dXJuOworCisJaW5mby0+ZWNjZXJybG9nWzBdID0gcmVhZHEod2luZG93ICsgSTMyMDBfQzBFQ0NFUlJMT0cpOworCWlmIChucl9jaGFubmVscyA9PSAyKQorCQlpbmZvLT5lY2NlcnJsb2dbMV0gPSByZWFkcSh3aW5kb3cgKyBJMzIwMF9DMUVDQ0VSUkxPRyk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBJMzIwMF9FUlJTVFMsICZpbmZvLT5lcnJzdHMyKTsKKworCS8qCisJICogSWYgdGhlIGVycm9yIGlzIHRoZSBzYW1lIGZvciBib3RoIHJlYWRzIHRoZW4gdGhlIGZpcnN0IHNldAorCSAqIG9mIHJlYWRzIGlzIHZhbGlkLiAgSWYgdGhlcmUgaXMgYSBjaGFuZ2UgdGhlbiB0aGVyZSBpcyBhIENFCisJICogd2l0aCBubyBpbmZvIGFuZCB0aGUgc2Vjb25kIHNldCBvZiByZWFkcyBpcyB2YWxpZCBhbmQKKwkgKiBzaG91bGQgYmUgVUUgaW5mby4KKwkgKi8KKwlpZiAoKGluZm8tPmVycnN0cyBeIGluZm8tPmVycnN0czIpICYgSTMyMDBfRVJSU1RTX0JJVFMpIHsKKwkJaW5mby0+ZWNjZXJybG9nWzBdID0gcmVhZHEod2luZG93ICsgSTMyMDBfQzBFQ0NFUlJMT0cpOworCQlpZiAobnJfY2hhbm5lbHMgPT0gMikKKwkJCWluZm8tPmVjY2VycmxvZ1sxXSA9IHJlYWRxKHdpbmRvdyArIEkzMjAwX0MxRUNDRVJSTE9HKTsKKwl9CisKKwlpMzIwMF9jbGVhcl9lcnJvcl9pbmZvKG1jaSk7Cit9CisKK3N0YXRpYyB2b2lkIGkzMjAwX3Byb2Nlc3NfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCXN0cnVjdCBpMzIwMF9lcnJvcl9pbmZvICppbmZvKQoreworCWludCBjaGFubmVsOworCXU2NCBsb2c7CisKKwlpZiAoIShpbmZvLT5lcnJzdHMgJiBJMzIwMF9FUlJTVFNfQklUUykpCisJCXJldHVybjsKKworCWlmICgoaW5mby0+ZXJyc3RzIF4gaW5mby0+ZXJyc3RzMikgJiBJMzIwMF9FUlJTVFNfQklUUykgeworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgIlVFIG92ZXJ3cm90ZSBDRSIpOworCQlpbmZvLT5lcnJzdHMgPSBpbmZvLT5lcnJzdHMyOworCX0KKworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBucl9jaGFubmVsczsgY2hhbm5lbCsrKSB7CisJCWxvZyA9IGluZm8tPmVjY2VycmxvZ1tjaGFubmVsXTsKKwkJaWYgKGxvZyAmIEkzMjAwX0VDQ0VSUkxPR19VRSkgeworCQkJZWRhY19tY19oYW5kbGVfdWUobWNpLCAwLCAwLAorCQkJCWVjY2VycmxvZ19yb3coY2hhbm5lbCwgbG9nKSwKKwkJCQkiaTMyMDAgVUUiKTsKKwkJfSBlbHNlIGlmIChsb2cgJiBJMzIwMF9FQ0NFUlJMT0dfQ0UpIHsKKwkJCWVkYWNfbWNfaGFuZGxlX2NlKG1jaSwgMCwgMCwKKwkJCQllY2NlcnJsb2dfc3luZHJvbWUobG9nKSwKKwkJCQllY2NlcnJsb2dfcm93KGNoYW5uZWwsIGxvZyksIDAsCisJCQkJImkzMjAwIENFIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGkzMjAwX2NoZWNrKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTMyMDBfZXJyb3JfaW5mbyBpbmZvOworCisJZGVidWdmMSgiTUMlZDogJXMoKVxuIiwgbWNpLT5tY19pZHgsIF9fZnVuY19fKTsKKwlpMzIwMF9nZXRfYW5kX2NsZWFyX2Vycm9yX2luZm8obWNpLCAmaW5mbyk7CisJaTMyMDBfcHJvY2Vzc19lcnJvcl9pbmZvKG1jaSwgJmluZm8pOworfQorCisKK3ZvaWQgX19pb21lbSAqaTMyMDBfbWFwX21jaGJhcihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1bmlvbiB7CisJCXU2NCBtY2hiYXI7CisJCXN0cnVjdCB7CisJCQl1MzIgbWNoYmFyX2xvdzsKKwkJCXUzMiBtY2hiYXJfaGlnaDsKKwkJfTsKKwl9IHU7CisJdm9pZCBfX2lvbWVtICp3aW5kb3c7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgSTMyMDBfTUNIQkFSX0xPVywgJnUubWNoYmFyX2xvdyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIEkzMjAwX01DSEJBUl9ISUdILCAmdS5tY2hiYXJfaGlnaCk7CisJdS5tY2hiYXIgJj0gSTMyMDBfTUNIQkFSX01BU0s7CisKKwlpZiAodS5tY2hiYXIgIT0gKHJlc291cmNlX3NpemVfdCl1Lm1jaGJhcikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJpMzIwMDogbW1pbyBzcGFjZSBiZXlvbmQgYWNjZXNzaWJsZSByYW5nZSAoMHglbGx4KVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdS5tY2hiYXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aW5kb3cgPSBpb3JlbWFwX25vY2FjaGUodS5tY2hiYXIsIEkzMjAwX01NUl9XSU5ET1dfU0laRSk7CisJaWYgKCF3aW5kb3cpCisJCXByaW50ayhLRVJOX0VSUiAiaTMyMDA6IGNhbm5vdCBtYXAgbW1pbyBzcGFjZSBhdCAweCVsbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXUubWNoYmFyKTsKKworCXJldHVybiB3aW5kb3c7Cit9CisKKworc3RhdGljIHZvaWQgaTMyMDBfZ2V0X2RyYnModm9pZCBfX2lvbWVtICp3aW5kb3csCisJdTE2IGRyYnNbSTMyMDBfQ0hBTk5FTFNdW0kzMjAwX1JBTktTX1BFUl9DSEFOTkVMXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJMzIwMF9SQU5LU19QRVJfQ0hBTk5FTDsgaSsrKSB7CisJCWRyYnNbMF1baV0gPSByZWFkdyh3aW5kb3cgKyBJMzIwMF9DMERSQiArIDIqaSkgJiBJMzIwMF9EUkJfTUFTSzsKKwkJZHJic1sxXVtpXSA9IHJlYWR3KHdpbmRvdyArIEkzMjAwX0MxRFJCICsgMippKSAmIEkzMjAwX0RSQl9NQVNLOworCX0KK30KKworc3RhdGljIGJvb2wgaTMyMDBfaXNfc3RhY2tlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwl1MTYgZHJic1tJMzIwMF9DSEFOTkVMU11bSTMyMDBfUkFOS1NfUEVSX0NIQU5ORUxdKQoreworCXUxNiB0b207CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBJMzIwMF9UT00sICZ0b20pOworCXRvbSAmPSBJMzIwMF9UT01fTUFTSzsKKworCXJldHVybiBkcmJzW0kzMjAwX0NIQU5ORUxTIC0gMV1bSTMyMDBfUkFOS1NfUEVSX0NIQU5ORUwgLSAxXSA9PSB0b207Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRyYl90b19ucl9wYWdlcygKKwl1MTYgZHJic1tJMzIwMF9DSEFOTkVMU11bSTMyMDBfUkFOS1NfUEVSX0NIQU5ORUxdLCBib29sIHN0YWNrZWQsCisJaW50IGNoYW5uZWwsIGludCByYW5rKQoreworCWludCBuOworCisJbiA9IGRyYnNbY2hhbm5lbF1bcmFua107CisJaWYgKHJhbmsgPiAwKQorCQluIC09IGRyYnNbY2hhbm5lbF1bcmFuayAtIDFdOworCWlmIChzdGFja2VkICYmIChjaGFubmVsID09IDEpICYmCisJZHJic1tjaGFubmVsXVtyYW5rXSA9PSBkcmJzW2NoYW5uZWxdW0kzMjAwX1JBTktTX1BFUl9DSEFOTkVMIC0gMV0pCisJCW4gLT0gZHJic1swXVtJMzIwMF9SQU5LU19QRVJfQ0hBTk5FTCAtIDFdOworCisJbiA8PD0gKEkzMjAwX0RSQl9TSElGVCAtIFBBR0VfU0hJRlQpOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGkzMjAwX3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGRldl9pZHgpCit7CisJaW50IHJjOworCWludCBpOworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsYXN0X3BhZ2U7CisJdTE2IGRyYnNbSTMyMDBfQ0hBTk5FTFNdW0kzMjAwX1JBTktTX1BFUl9DSEFOTkVMXTsKKwlib29sIHN0YWNrZWQ7CisJdm9pZCBfX2lvbWVtICp3aW5kb3c7CisJc3RydWN0IGkzMjAwX3ByaXYgKnByaXY7CisKKwlkZWJ1Z2YwKCJNQzogJXMoKVxuIiwgX19mdW5jX18pOworCisJd2luZG93ID0gaTMyMDBfbWFwX21jaGJhcihwZGV2KTsKKwlpZiAoIXdpbmRvdykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpMzIwMF9nZXRfZHJicyh3aW5kb3csIGRyYnMpOworCW5yX2NoYW5uZWxzID0gaG93X21hbnlfY2hhbm5lbHMocGRldik7CisKKwltY2kgPSBlZGFjX21jX2FsbG9jKHNpemVvZihzdHJ1Y3QgaTMyMDBfcHJpdiksIEkzMjAwX1JBTktTLAorCQlucl9jaGFubmVscywgMCk7CisJaWYgKCFtY2kpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVidWdmMygiTUM6ICVzKCk6IGluaXQgbWNpXG4iLCBfX2Z1bmNfXyk7CisKKwltY2ktPmRldiA9ICZwZGV2LT5kZXY7CisJbWNpLT5tdHlwZV9jYXAgPSBNRU1fRkxBR19ERFIyOworCisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfU0VDREVEOworCW1jaS0+ZWRhY19jYXAgPSBFREFDX0ZMQUdfU0VDREVEOworCisJbWNpLT5tb2RfbmFtZSA9IEVEQUNfTU9EX1NUUjsKKwltY2ktPm1vZF92ZXIgPSBJMzIwMF9SRVZJU0lPTjsKKwltY2ktPmN0bF9uYW1lID0gaTMyMDBfZGV2c1tkZXZfaWR4XS5jdGxfbmFtZTsKKwltY2ktPmRldl9uYW1lID0gcGNpX25hbWUocGRldik7CisJbWNpLT5lZGFjX2NoZWNrID0gaTMyMDBfY2hlY2s7CisJbWNpLT5jdGxfcGFnZV90b19waHlzID0gTlVMTDsKKwlwcml2ID0gbWNpLT5wdnRfaW5mbzsKKwlwcml2LT53aW5kb3cgPSB3aW5kb3c7CisKKwlzdGFja2VkID0gaTMyMDBfaXNfc3RhY2tlZChwZGV2LCBkcmJzKTsKKworCS8qCisJICogVGhlIGRyYW0gcmFuayBib3VuZGFyeSAoRFJCKSByZWcgdmFsdWVzIGFyZSBib3VuZGFyeSBhZGRyZXNzZXMKKwkgKiBmb3IgZWFjaCBEUkFNIHJhbmsgd2l0aCBhIGdyYW51bGFyaXR5IG9mIDY0TUIuICBEUkIgcmVncyBhcmUKKwkgKiBjdW11bGF0aXZlOyB0aGUgbGFzdCBvbmUgd2lsbCBjb250YWluIHRoZSB0b3RhbCBtZW1vcnkKKwkgKiBjb250YWluZWQgaW4gYWxsIHJhbmtzLgorCSAqLworCWxhc3RfcGFnZSA9IC0xVUw7CisJZm9yIChpID0gMDsgaSA8IG1jaS0+bnJfY3Nyb3dzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKKwkJc3RydWN0IGNzcm93X2luZm8gKmNzcm93ID0gJm1jaS0+Y3Nyb3dzW2ldOworCisJCW5yX3BhZ2VzID0gZHJiX3RvX25yX3BhZ2VzKGRyYnMsIHN0YWNrZWQsCisJCQlpIC8gSTMyMDBfUkFOS1NfUEVSX0NIQU5ORUwsCisJCQlpICUgSTMyMDBfUkFOS1NfUEVSX0NIQU5ORUwpOworCisJCWlmIChucl9wYWdlcyA9PSAwKSB7CisJCQljc3Jvdy0+bXR5cGUgPSBNRU1fRU1QVFk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNzcm93LT5maXJzdF9wYWdlID0gbGFzdF9wYWdlICsgMTsKKwkJbGFzdF9wYWdlICs9IG5yX3BhZ2VzOworCQljc3Jvdy0+bGFzdF9wYWdlID0gbGFzdF9wYWdlOworCQljc3Jvdy0+bnJfcGFnZXMgPSBucl9wYWdlczsKKworCQljc3Jvdy0+Z3JhaW4gPSBucl9wYWdlcyA8PCBQQUdFX1NISUZUOworCQljc3Jvdy0+bXR5cGUgPSBNRU1fRERSMjsKKwkJY3Nyb3ctPmR0eXBlID0gREVWX1VOS05PV047CisJCWNzcm93LT5lZGFjX21vZGUgPSBFREFDX1VOS05PV047CisJfQorCisJaTMyMDBfY2xlYXJfZXJyb3JfaW5mbyhtY2kpOworCisJcmMgPSAtRU5PREVWOworCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpKSB7CisJCWRlYnVnZjMoIk1DOiAlcygpOiBmYWlsZWQgZWRhY19tY19hZGRfbWMoKVxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogZ2V0IHRoaXMgZmFyIGFuZCBpdCdzIHN1Y2Nlc3NmdWwgKi8KKwlkZWJ1Z2YzKCJNQzogJXMoKTogc3VjY2Vzc1xuIiwgX19mdW5jX18pOworCXJldHVybiAwOworCitmYWlsOgorCWlvdW5tYXAod2luZG93KTsKKwlpZiAobWNpKQorCQllZGFjX21jX2ZyZWUobWNpKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaTMyMDBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IHJjOworCisJZGVidWdmMCgiTUM6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSA8IDApCisJCXJldHVybiAtRUlPOworCisJcmMgPSBpMzIwMF9wcm9iZTEocGRldiwgZW50LT5kcml2ZXJfZGF0YSk7CisJaWYgKCFtY2lfcGRldikKKwkJbWNpX3BkZXYgPSBwY2lfZGV2X2dldChwZGV2KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGkzMjAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCXN0cnVjdCBpMzIwMF9wcml2ICpwcml2OworCisJZGVidWdmMCgiJXMoKVxuIiwgX19mdW5jX18pOworCisJbWNpID0gZWRhY19tY19kZWxfbWMoJnBkZXYtPmRldik7CisJaWYgKCFtY2kpCisJCXJldHVybjsKKworCXByaXYgPSBtY2ktPnB2dF9pbmZvOworCWlvdW5tYXAocHJpdi0+d2luZG93KTsKKworCWVkYWNfbWNfZnJlZShtY2kpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTMyMDBfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQlQQ0lfVkVORF9ERVYoSU5URUwsIDMyMDBfSEIpLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlJMzIwMH0sCisJeworCQkwLAorCX0gICAgICAgICAgICAvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpMzIwMF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGkzMjAwX2RyaXZlciA9IHsKKwkubmFtZSA9IEVEQUNfTU9EX1NUUiwKKwkucHJvYmUgPSBpMzIwMF9pbml0X29uZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoaTMyMDBfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlID0gaTMyMDBfcGNpX3RibCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkzMjAwX2luaXQodm9pZCkKK3sKKwlpbnQgcGNpX3JjOworCisJZGVidWdmMygiTUM6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIEVuc3VyZSB0aGF0IHRoZSBPUFNUQVRFIGlzIHNldCBjb3JyZWN0bHkgZm9yIFBPTEwgb3IgTk1JICovCisJb3BzdGF0ZV9pbml0KCk7CisKKwlwY2lfcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpMzIwMF9kcml2ZXIpOworCWlmIChwY2lfcmMgPCAwKQorCQlnb3RvIGZhaWwwOworCisJaWYgKCFtY2lfcGRldikgeworCQlpMzIwMF9yZWdpc3RlcmVkID0gMDsKKwkJbWNpX3BkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCVBDSV9ERVZJQ0VfSURfSU5URUxfMzIwMF9IQiwgTlVMTCk7CisJCWlmICghbWNpX3BkZXYpIHsKKwkJCWRlYnVnZjAoImkzMjAwIHBjaV9nZXRfZGV2aWNlIGZhaWxcbiIpOworCQkJcGNpX3JjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDE7CisJCX0KKworCQlwY2lfcmMgPSBpMzIwMF9pbml0X29uZShtY2lfcGRldiwgaTMyMDBfcGNpX3RibCk7CisJCWlmIChwY2lfcmMgPCAwKSB7CisJCQlkZWJ1Z2YwKCJpMzIwMCBpbml0IGZhaWxcbiIpOworCQkJcGNpX3JjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDE6CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpMzIwMF9kcml2ZXIpOworCitmYWlsMDoKKwlpZiAobWNpX3BkZXYpCisJCXBjaV9kZXZfcHV0KG1jaV9wZGV2KTsKKworCXJldHVybiBwY2lfcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpMzIwMF9leGl0KHZvaWQpCit7CisJZGVidWdmMygiTUM6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTMyMDBfZHJpdmVyKTsKKwlpZiAoIWkzMjAwX3JlZ2lzdGVyZWQpIHsKKwkJaTMyMDBfcmVtb3ZlX29uZShtY2lfcGRldik7CisJCXBjaV9kZXZfcHV0KG1jaV9wZGV2KTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGkzMjAwX2luaXQpOworbW9kdWxlX2V4aXQoaTMyMDBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFrYW1haSBUZWNobm9sb2dpZXMsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUMgc3VwcG9ydCBmb3IgSW50ZWwgMzIwMCBtZW1vcnkgaHViIGNvbnRyb2xsZXJzIik7CisKK21vZHVsZV9wYXJhbShlZGFjX29wX3N0YXRlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlZGFjX29wX3N0YXRlLCAiRURBQyBFcnJvciBSZXBvcnRpbmcgc3RhdGU6IDA9UG9sbCwxPU5NSSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k1MDAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pNTAwMF9lZGFjLmMKaW5kZXggZDMzNTA4Ni4uNzdhOTU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k1MDAwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTUwMDBfZWRhYy5jCkBAIC0xMTczLDcgKzExNzMsNyBAQAogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMSwgd2hlcmUsCiAJCQkJCSZwdnQtPmIxX210cltzbG90X3Jvd10pOwogCQkJZGVidWdmMigiTVRSJWQgd2hlcmU9MHgleCBCMSB2YWx1ZT0weCV4XG4iLCBzbG90X3JvdywKLQkJCQl3aGVyZSwgcHZ0LT5iMF9tdHJbc2xvdF9yb3ddKTsKKwkJCQl3aGVyZSwgcHZ0LT5iMV9tdHJbc2xvdF9yb3ddKTsKIAkJfSBlbHNlIHsKIAkJCXB2dC0+YjFfbXRyW3Nsb3Rfcm93XSA9IDA7CiAJCX0KQEAgLTEyMzIsNyArMTIzMiw3IEBACiAJc3RydWN0IGNzcm93X2luZm8gKnBfY3Nyb3c7CiAJaW50IGVtcHR5LCBjaGFubmVsX2NvdW50OwogCWludCBtYXhfY3Nyb3dzOwotCWludCBtdHI7CisJaW50IG10ciwgbXRyMTsKIAlpbnQgY3Nyb3dfbWVnczsKIAlpbnQgY2hhbm5lbDsKIAlpbnQgY3Nyb3c7CkBAIC0xMjUxLDkgKzEyNTEsMTAgQEAKIAogCQkvKiB1c2UgYnJhbmNoIDAgZm9yIHRoZSBiYXNpcyAqLwogCQltdHIgPSBwdnQtPmIwX210cltjc3JvdyA+PiAxXTsKKwkJbXRyMSA9IHB2dC0+YjFfbXRyW2Nzcm93ID4+IDFdOwogCiAJCS8qIGlmIG5vIERJTU1TIG9uIHRoaXMgcm93LCBjb250aW51ZSAqLwotCQlpZiAoIU1UUl9ESU1NU19QUkVTRU5UKG10cikpCisJCWlmICghTVRSX0RJTU1TX1BSRVNFTlQobXRyKSAmJiAhTVRSX0RJTU1TX1BSRVNFTlQobXRyMSkpCiAJCQljb250aW51ZTsKIAogCQkvKiBGQUtFIE9VVCBWQUxVRVMsIEZJWE1FICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k1NDAwX2VkYWMuYwppbmRleCBiMDhiNmQ4Li5mOTlkMTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMKQEAgLTQ2LDkgKzQ2LDEwIEBACiAvKiBMaW1pdHMgZm9yIGk1NDAwICovCiAjZGVmaW5lIE5VTV9NVFJTX1BFUl9CUkFOQ0gJNAogI2RlZmluZSBDSEFOTkVMU19QRVJfQlJBTkNICTIKKyNkZWZpbmUgTUFYX0RJTU1TX1BFUl9DSEFOTkVMCU5VTV9NVFJTX1BFUl9CUkFOQ0gKICNkZWZpbmUJTUFYX0NIQU5ORUxTCQk0Ci0jZGVmaW5lIE1BWF9ESU1NUwkJKE1BWF9DSEFOTkVMUyAqIDQpCS8qIFVwIHRvIDQgRElNTSdzIHBlciBjaGFubmVsICovCi0jZGVmaW5lIE1BWF9DU1JPV1MJCShNQVhfRElNTVMgKiAyKQkJLyogbWF4IHBvc3NpYmxlIGNzcm93cyBwZXIgY2hhbm5lbCAqLworLyogbWF4IHBvc3NpYmxlIGNzcm93cyBwZXIgY2hhbm5lbCAqLworI2RlZmluZSBNQVhfQ1NST1dTCQkoTUFYX0RJTU1TX1BFUl9DSEFOTkVMKQogCiAvKiBEZXZpY2UgMTYsCiAgKiBGdW5jdGlvbiAwOiBTeXN0ZW0gQWRkcmVzcwpAQCAtMzMxLDcgKzMzMiw2IEBACiAKIHN0cnVjdCBpNTQwMF9kaW1tX2luZm8gewogCWludCBtZWdhYnl0ZXM7CQkvKiBzaXplLCAwIG1lYW5zIG5vdCBwcmVzZW50ICAqLwotCWludCBkdWFsX3Jhbms7CiB9OwogCiAvKiBkcml2ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLwpAQCAtODQ5LDExICs4NDksOSBAQAogCWludCBuOwogCiAJLyogVGhlcmUgaXMgb25lIE1UUiBmb3IgZWFjaCBzbG90IHBhaXIgb2YgRkItRElNTXMsCi0JICAgRWFjaCBzbG90IG1heSBoYXZlIG9uZSBvciB0d28gcmFua3MgKDIgY3Nyb3dzKSwKIAkgICBFYWNoIHNsb3QgcGFpciBtYXkgYmUgYXQgYnJhbmNoIDAgb3IgYnJhbmNoIDEuCi0JICAgU28sIGNzcm93IHNob3VsZCBiZSBkaXZpZGVkIGJ5IGVpZ2h0CiAJICovCi0JbiA9IGNzcm93ID4+IDM7CisJbiA9IGNzcm93OwogCiAJaWYgKG4gPj0gTlVNX01UUlNfUEVSX0JSQU5DSCkgewogCQlkZWJ1Z2YwKCJFUlJPUjogdHJ5aW5nIHRvIGFjY2VzcyBhbiBpbnZhbGlkIGNzcm93OiAlZFxuIiwKQEAgLTkwNSwyNSArOTAzLDIyIEBACiAJCWFtYl9wcmVzZW50X3JlZyA9IGRldGVybWluZV9hbWJfcHJlc2VudF9yZWcocHZ0LCBjaGFubmVsKTsKIAogCQkvKiBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBESU1NIHByZXNlbnQgaW4gdGhpcyBESU1NIHNsb3QgKi8KLQkJaWYgKGFtYl9wcmVzZW50X3JlZyAmICgxIDw8IChjc3JvdyA+PiAxKSkpIHsKLQkJCWRpbmZvLT5kdWFsX3JhbmsgPSBNVFJfRElNTV9SQU5LKG10cik7CisJCWlmIChhbWJfcHJlc2VudF9yZWcgJiAoMSA8PCBjc3JvdykpIHsKKwkJCS8qIFN0YXJ0IHdpdGggdGhlIG51bWJlciBvZiBiaXRzIGZvciBhIEJhbmsKKwkJCSAqIG9uIHRoZSBEUkFNICovCisJCQlhZGRyQml0cyA9IE1UUl9EUkFNX0JBTktTX0FERFJfQklUUyhtdHIpOworCQkJLyogQWRkIHRoZW51bWJlciBvZiBST1cgYml0cyAqLworCQkJYWRkckJpdHMgKz0gTVRSX0RJTU1fUk9XU19BRERSX0JJVFMobXRyKTsKKwkJCS8qIGFkZCB0aGUgbnVtYmVyIG9mIENPTFVNTiBiaXRzICovCisJCQlhZGRyQml0cyArPSBNVFJfRElNTV9DT0xTX0FERFJfQklUUyhtdHIpOworCQkJLyogYWRkIHRoZSBudW1iZXIgb2YgUkFOSyBiaXRzICovCisJCQlhZGRyQml0cyArPSBNVFJfRElNTV9SQU5LKG10cik7CiAKLQkJCWlmICghKChkaW5mby0+ZHVhbF9yYW5rID09IDApICYmCi0JCQkJKChjc3JvdyAmIDB4MSkgPT0gMHgxKSkpIHsKLQkJCQkvKiBTdGFydCB3aXRoIHRoZSBudW1iZXIgb2YgYml0cyBmb3IgYSBCYW5rCi0JCQkJICogb24gdGhlIERSQU0gKi8KLQkJCQlhZGRyQml0cyA9IE1UUl9EUkFNX0JBTktTX0FERFJfQklUUyhtdHIpOwotCQkJCS8qIEFkZCB0aGVudW1iZXIgb2YgUk9XIGJpdHMgKi8KLQkJCQlhZGRyQml0cyArPSBNVFJfRElNTV9ST1dTX0FERFJfQklUUyhtdHIpOwotCQkJCS8qIGFkZCB0aGUgbnVtYmVyIG9mIENPTFVNTiBiaXRzICovCi0JCQkJYWRkckJpdHMgKz0gTVRSX0RJTU1fQ09MU19BRERSX0JJVFMobXRyKTsKKwkJCWFkZHJCaXRzICs9IDY7CS8qIGFkZCA2NCBiaXRzIHBlciBESU1NICovCisJCQlhZGRyQml0cyAtPSAyMDsJLyogZGl2aWRlIGJ5IDJeXjIwICovCisJCQlhZGRyQml0cyAtPSAzOwkvKiA4IGJpdHMgcGVyIGJ5dGVzICovCiAKLQkJCQlhZGRyQml0cyArPSA2OwkvKiBhZGQgNjQgYml0cyBwZXIgRElNTSAqLwotCQkJCWFkZHJCaXRzIC09IDIwOwkvKiBkaXZpZGUgYnkgMl5eMjAgKi8KLQkJCQlhZGRyQml0cyAtPSAzOwkvKiA4IGJpdHMgcGVyIGJ5dGVzICovCi0KLQkJCQlkaW5mby0+bWVnYWJ5dGVzID0gMSA8PCBhZGRyQml0czsKLQkJCX0KKwkJCWRpbmZvLT5tZWdhYnl0ZXMgPSAxIDw8IGFkZHJCaXRzOwogCQl9CiAJfQogfQpAQCAtOTUxLDEyICs5NDYsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIFNjYW4gYWxsIHRoZSBhY3R1YWwgQ1NST1dTICh3aGljaCBpcyAjIG9mIERJTU1TICogMikKKwkvKiBTY2FuIGFsbCB0aGUgYWN0dWFsIENTUk9XUwogCSAqIGFuZCBjYWxjdWxhdGUgdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIERJTU0KIAkgKiBTdGFydCB3aXRoIHRoZSBoaWdoZXN0IGNzcm93IGZpcnN0LCB0byBkaXNwbGF5IGl0IGZpcnN0CiAJICogYW5kIHdvcmsgdG93YXJkIHRoZSAwdGggY3Nyb3cKIAkgKi8KLQltYXhfY3Nyb3dzID0gcHZ0LT5tYXhkaW1tcGVyY2ggKiAyOworCW1heF9jc3Jvd3MgPSBwdnQtPm1heGRpbW1wZXJjaDsKIAlmb3IgKGNzcm93ID0gbWF4X2Nzcm93cyAtIDE7IGNzcm93ID49IDA7IGNzcm93LS0pIHsKIAogCQkvKiBvbiBhbiBvZGQgY3Nyb3csIGZpcnN0IG91dHB1dCBhICdib3VuZGFyeScgbWFya2VyLApAQCAtMTA2NCw3ICsxMDU5LDcgQEAKIAogCS8qIEdldCB0aGUgc2V0IG9mIE1UUlswLTNdIHJlZ3MgYnkgZWFjaCBicmFuY2ggKi8KIAlmb3IgKHNsb3Rfcm93ID0gMDsgc2xvdF9yb3cgPCBOVU1fTVRSU19QRVJfQlJBTkNIOyBzbG90X3JvdysrKSB7Ci0JCWludCB3aGVyZSA9IE1UUjAgKyAoc2xvdF9yb3cgKiBzaXplb2YodTMyKSk7CisJCWludCB3aGVyZSA9IE1UUjAgKyAoc2xvdF9yb3cgKiBzaXplb2YodTE2KSk7CiAKIAkJLyogQnJhbmNoIDAgc2V0IG9mIE1UUiByZWdpc3RlcnMgKi8KIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMCwgd2hlcmUsCkBAIC0xMTQ2LDcgKzExNDEsNyBAQAogCXB2dCA9IG1jaS0+cHZ0X2luZm87CiAKIAljaGFubmVsX2NvdW50ID0gcHZ0LT5tYXhjaDsKLQltYXhfY3Nyb3dzID0gcHZ0LT5tYXhkaW1tcGVyY2ggKiAyOworCW1heF9jc3Jvd3MgPSBwdnQtPm1heGRpbW1wZXJjaDsKIAogCWVtcHR5ID0gMTsJCS8qIEFzc3VtZSBOTyBtZW1vcnkgKi8KIApAQCAtMTIxNSwyOCArMTIxMCw2IEBACiB9CiAKIC8qCi0gKiBpNTQwMF9nZXRfZGltbV9hbmRfY2hhbm5lbF9jb3VudHMocGRldiwgJm51bV9jc3Jvd3MsICZudW1fY2hhbm5lbHMpCi0gKgotICoJYXNrIHRoZSBkZXZpY2UgaG93IG1hbnkgY2hhbm5lbHMgYXJlIHByZXNlbnQgYW5kIGhvdyBtYW55IENTUk9XUwotICoJIGFzIHdlbGwKLSAqLwotc3RhdGljIHZvaWQgaTU0MDBfZ2V0X2RpbW1fYW5kX2NoYW5uZWxfY291bnRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCQlpbnQgKm51bV9kaW1tc19wZXJfY2hhbm5lbCwKLQkJCQkJaW50ICpudW1fY2hhbm5lbHMpCi17Ci0JdTggdmFsdWU7Ci0KLQkvKiBOZWVkIHRvIHJldHJpZXZlIGp1c3QgaG93IG1hbnkgY2hhbm5lbHMgYW5kIGRpbW1zIHBlciBjaGFubmVsIGFyZQotCSAqIHN1cHBvcnRlZCBvbiB0aGlzIG1lbW9yeSBjb250cm9sbGVyCi0JICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTUFYRElNTVBFUkNILCAmdmFsdWUpOwotCSpudW1fZGltbXNfcGVyX2NoYW5uZWwgPSAoaW50KXZhbHVlICogMjsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE1BWENILCAmdmFsdWUpOwotCSpudW1fY2hhbm5lbHMgPSAoaW50KXZhbHVlOwotfQotCi0vKgogICoJaTU0MDBfcHJvYmUxCVByb2JlIGZvciBPTkUgaW5zdGFuY2Ugb2YgZGV2aWNlIHRvIHNlZSBpZiBpdCBpcwogICoJCQlwcmVzZW50LgogICoJcmV0dXJuOgpAQCAtMTI2MywyMiArMTIzNiwxNiBAQAogCWlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiBBc2sgdGhlIGRldmljZXMgZm9yIHRoZSBudW1iZXIgb2YgQ1NST1dTIGFuZCBDSEFOTkVMUyBzbwotCSAqIHRoYXQgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgbWVtb3J5IHJlc291cmNlcywgZXRjCi0JICoKLQkgKiBUaGUgQ2hpcHNldCB3aWxsIHJlcG9ydCB3aGF0IGl0IGNhbiBoYW5kbGUgd2hpY2ggd2lsbCBiZSBncmVhdGVyCi0JICogb3IgZXF1YWwgdG8gd2hhdCB0aGUgbW90aGVyYm9hcmQgbWFudWZhY3R1cmVyIHdpbGwgaW1wbGVtZW50LgotCSAqCi0JICogQXMgd2UgZG9uJ3QgaGF2ZSBhIG1vdGhlcmJvYXJkIGlkZW50aWZpY2F0aW9uIHJvdXRpbmUgdG8gZGV0ZXJtaW5lCisJLyogQXMgd2UgZG9uJ3QgaGF2ZSBhIG1vdGhlcmJvYXJkIGlkZW50aWZpY2F0aW9uIHJvdXRpbmUgdG8gZGV0ZXJtaW5lCiAJICogYWN0dWFsIG51bWJlciBvZiBzbG90cy9kaW1tcyBwZXIgY2hhbm5lbCwgd2UgdGh1cyB1dGlsaXplIHRoZQogCSAqIHJlc291cmNlIGFzIHNwZWNpZmllZCBieSB0aGUgY2hpcHNldC4gVGh1cywgd2UgbWlnaHQgaGF2ZQogCSAqIGhhdmUgbW9yZSBESU1NcyBwZXIgY2hhbm5lbCB0aGFuIGFjdHVhbGx5IG9uIHRoZSBtb2JvLCBidXQgdGhpcwogCSAqIGFsbG93cyB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgdXB0byB0aGUgY2hpcHNldCBtYXgsIHdpdGhvdXQKIAkgKiBzb21lIGZhbmN5IG1vYm8gZGV0ZXJtaW5hdGlvbi4KIAkgKi8KLQlpNTQwMF9nZXRfZGltbV9hbmRfY2hhbm5lbF9jb3VudHMocGRldiwgJm51bV9kaW1tc19wZXJfY2hhbm5lbCwKLQkJCQkJJm51bV9jaGFubmVscyk7Ci0JbnVtX2Nzcm93cyA9IG51bV9kaW1tc19wZXJfY2hhbm5lbCAqIDI7CisJbnVtX2RpbW1zX3Blcl9jaGFubmVsID0gTUFYX0RJTU1TX1BFUl9DSEFOTkVMOworCW51bV9jaGFubmVscyA9IE1BWF9DSEFOTkVMUzsKKwludW1fY3Nyb3dzID0gbnVtX2RpbW1zX3Blcl9jaGFubmVsOwogCiAJZGVidWdmMCgiTUM6ICVzKCk6IE51bWJlciBvZiAtIENoYW5uZWxzPSAlZCAgRElNTVM9ICVkICBDU1JPV1M9ICVkXG4iLAogCQlfX2Z1bmNfXywgbnVtX2NoYW5uZWxzLCBudW1fZGltbXNfcGVyX2NoYW5uZWwsIG51bV9jc3Jvd3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCmluZGV4IDNmMmNjZmMuLmNmMjc0MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKQEAgLTI2LDcgKzI2LDkgQEAKICNpbmNsdWRlICJtcGM4NXh4X2VkYWMuaCIKIAogc3RhdGljIGludCBlZGFjX2Rldl9pZHg7CisjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIGludCBlZGFjX3BjaV9pZHg7CisjZW5kaWYKIHN0YXRpYyBpbnQgZWRhY19tY19pZHg7CiAKIHN0YXRpYyB1MzIgb3JpZ19kZHJfZXJyX2Rpc2FibGU7CkBAIC00MSw3ICs0Myw5IEBACiAjZW5kaWYKIAogc3RhdGljIHUzMiBvcmlnX2wyX2Vycl9kaXNhYmxlOworI2lmZGVmIENPTkZJR19NUEM4NXh4CiBzdGF0aWMgdTMyIG9yaWdfaGlkMVsyXTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIE1DIFNZU0ZTIHBhcnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC02NDYsNiArNjUwLDcgQEAKIAl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTYwLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxwMjAyMC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKIAl7fSwKIH07CiAKQEAgLTc4OCwxOSArNzkzLDIwIEBACiAJCWNzcm93ID0gJm1jaS0+Y3Nyb3dzW2luZGV4XTsKIAkJY3NfYm5kcyA9IGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19DU19CTkRTXzAgKwogCQkJCSAgKGluZGV4ICogTVBDODVYWF9NQ19DU19CTkRTX09GUykpOwotCQlzdGFydCA9IChjc19ibmRzICYgMHhmZmYwMDAwKSA8PCA0OwotCQllbmQgPSAoKGNzX2JuZHMgJiAweGZmZikgPDwgMjApOwotCQlpZiAoc3RhcnQpCi0JCQlzdGFydCB8PSAweGZmZmZmOwotCQlpZiAoZW5kKQotCQkJZW5kIHw9IDB4ZmZmZmY7CisKKwkJc3RhcnQgPSAoY3NfYm5kcyAmIDB4ZmZmZjAwMDApID4+IDE2OworCQllbmQgICA9IChjc19ibmRzICYgMHgwMDAwZmZmZik7CiAKIAkJaWYgKHN0YXJ0ID09IGVuZCkKIAkJCWNvbnRpbnVlOwkvKiBub3QgcG9wdWxhdGVkICovCiAKKwkJc3RhcnQgPDw9ICgyNCAtIFBBR0VfU0hJRlQpOworCQllbmQgICA8PD0gKDI0IC0gUEFHRV9TSElGVCk7CisJCWVuZCAgICB8PSAoMSA8PCAoMjQgLSBQQUdFX1NISUZUKSkgLSAxOworCiAJCWNzcm93LT5maXJzdF9wYWdlID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKIAkJY3Nyb3ctPmxhc3RfcGFnZSA9IGVuZCA+PiBQQUdFX1NISUZUOwotCQljc3Jvdy0+bnJfcGFnZXMgPSBjc3Jvdy0+bGFzdF9wYWdlICsgMSAtIGNzcm93LT5maXJzdF9wYWdlOworCQljc3Jvdy0+bnJfcGFnZXMgPSBlbmQgKyAxIC0gc3RhcnQ7CiAJCWNzcm93LT5ncmFpbiA9IDg7CiAJCWNzcm93LT5tdHlwZSA9IG10eXBlOwogCQljc3Jvdy0+ZHR5cGUgPSBERVZfVU5LTk9XTjsKQEAgLTk4NCw2ICs5OTAsOCBAQAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjAtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktbWVtb3J5LWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKIAl7fSwKIH07CiAKQEAgLTk5OSwxMyArMTAwNywxMyBAQAogCQkgICB9LAogfTsKIAotCisjaWZkZWYgQ09ORklHX01QQzg1eHgKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X21jX2NsZWFyX3JmeGUodm9pZCAqZGF0YSkKIHsKIAlvcmlnX2hpZDFbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IG1mc3ByKFNQUk5fSElEMSk7CiAJbXRzcHIoU1BSTl9ISUQxLCAob3JpZ19oaWQxW3NtcF9wcm9jZXNzb3JfaWQoKV0gJiB+MHgyMDAwMCkpOwogfQotCisjZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgbXBjODV4eF9tY19pbml0KHZvaWQpCiB7CkBAIC0xMDM4LDI2ICsxMDQ2LDMyIEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgRURBQ19NT0RfU1RSICJQQ0kgZmFpbHMgdG8gcmVnaXN0ZXJcbiIpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTVBDODV4eAogCS8qCiAJICogbmVlZCB0byBjbGVhciBISUQxW1JGWEVdIHRvIGRpc2FibGUgbWFjaGluZSBjaGVjayBpbnQKIAkgKiBzbyB3ZSBjYW4gY2F0Y2ggaXQKIAkgKi8KIAlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfSU5UKQogCQlvbl9lYWNoX2NwdShtcGM4NXh4X21jX2NsZWFyX3JmeGUsIE5VTEwsIDApOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KIAogbW9kdWxlX2luaXQobXBjODV4eF9tY19pbml0KTsKIAorI2lmZGVmIENPTkZJR19NUEM4NXh4CiBzdGF0aWMgdm9pZCBfX2V4aXQgbXBjODV4eF9tY19yZXN0b3JlX2hpZDEodm9pZCAqZGF0YSkKIHsKIAltdHNwcihTUFJOX0hJRDEsIG9yaWdfaGlkMVtzbXBfcHJvY2Vzc29yX2lkKCldKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXBjODV4eF9tY19leGl0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX01QQzg1eHgKIAlvbl9lYWNoX2NwdShtcGM4NXh4X21jX3Jlc3RvcmVfaGlkMSwgTlVMTCwgMCk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfUENJCiAJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm1wYzg1eHhfcGNpX2Vycl9kcml2ZXIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbXY2NHg2MF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvbXY2NHg2MF9lZGFjLmMKaW5kZXggNTEzMWFhYS4uYTZiOWZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL212NjR4NjBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuYwpAQCAtOTAsNyArOTAsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlwY2lfc2VyciA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJcGNpX3NlcnIgPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKIAlpZiAoIXBjaV9zZXJyKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTQwLDcgKzE0MCw3IEBACiAKIAlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsCiAJCQkJICAgICByLT5zdGFydCwKLQkJCQkgICAgIHItPmVuZCAtIHItPnN0YXJ0ICsgMSwKKwkJCQkgICAgIHJlc291cmNlX3NpemUociksCiAJCQkJICAgICBwZGF0YS0+bmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAogCQkgICAgICAgX19mdW5jX18pOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAKIAlwZGF0YS0+cGNpX3ZiYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsCiAJCQkJCXItPnN0YXJ0LAotCQkJCQlyLT5lbmQgLSByLT5zdGFydCArIDEpOworCQkJCQlyZXNvdXJjZV9zaXplKHIpKTsKIAlpZiAoIXBkYXRhLT5wY2lfdmJhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHNldHVwIFBDSSBlcnIgcmVnc1xuIiwgX19mdW5jX18pOwogCQlyZXMgPSAtRU5PTUVNOwpAQCAtMzA2LDcgKzMwNiw3IEBACiAKIAlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsCiAJCQkJICAgICByLT5zdGFydCwKLQkJCQkgICAgIHItPmVuZCAtIHItPnN0YXJ0ICsgMSwKKwkJCQkgICAgIHJlc291cmNlX3NpemUociksCiAJCQkJICAgICBwZGF0YS0+bmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdCBtZW0gcmVnaW9uXG4iLAogCQkgICAgICAgX19mdW5jX18pOwpAQCAtMzE2LDcgKzMxNiw3IEBACiAKIAlwZGF0YS0+c3JhbV92YmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LAogCQkJCQkgci0+c3RhcnQsCi0JCQkJCSByLT5lbmQgLSByLT5zdGFydCArIDEpOworCQkJCQkgcmVzb3VyY2Vfc2l6ZShyKSk7CiAJaWYgKCFwZGF0YS0+c3JhbV92YmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgU1JBTSBlcnIgcmVnc1xuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKQEAgLTQ3NCw3ICs0NzQsNyBAQAogCiAJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LAogCQkJCSAgICAgci0+c3RhcnQsCi0JCQkJICAgICByLT5lbmQgLSByLT5zdGFydCArIDEsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHIpLAogCQkJCSAgICAgcGRhdGEtPm5hbWUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCiAJcGRhdGEtPmNwdV92YmFzZVswXSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LAogCQkJCQkgICByLT5zdGFydCwKLQkJCQkJICAgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwkJCQkJICAgcmVzb3VyY2Vfc2l6ZShyKSk7CiAJaWYgKCFwZGF0YS0+Y3B1X3ZiYXNlWzBdKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXR1cCBDUFUgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVOT01FTTsKQEAgLTUwMSw3ICs1MDEsNyBAQAogCiAJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LAogCQkJCSAgICAgci0+c3RhcnQsCi0JCQkJICAgICByLT5lbmQgLSByLT5zdGFydCArIDEsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHIpLAogCQkJCSAgICAgcGRhdGEtPm5hbWUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiAJcGRhdGEtPmNwdV92YmFzZVsxXSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LAogCQkJCQkgICByLT5zdGFydCwKLQkJCQkJICAgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwkJCQkJICAgcmVzb3VyY2Vfc2l6ZShyKSk7CiAJaWYgKCFwZGF0YS0+Y3B1X3ZiYXNlWzFdKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXR1cCBDUFUgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVOT01FTTsKQEAgLTcyNiw3ICs3MjYsNyBAQAogCiAJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LAogCQkJCSAgICAgci0+c3RhcnQsCi0JCQkJICAgICByLT5lbmQgLSByLT5zdGFydCArIDEsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHIpLAogCQkJCSAgICAgcGRhdGEtPm5hbWUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKQEAgLTczNiw3ICs3MzYsNyBAQAogCiAJcGRhdGEtPm1jX3ZiYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsCiAJCQkJICAgICAgIHItPnN0YXJ0LAotCQkJCSAgICAgICByLT5lbmQgLSByLT5zdGFydCArIDEpOworCQkJCSAgICAgICByZXNvdXJjZV9zaXplKHIpKTsKIAlpZiAoIXBkYXRhLT5tY192YmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgTUMgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1jZGV2LmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtY2Rldi5jCmluZGV4IGNlZDE4NmQuLjUwODkzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1jZGV2LmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLWNkZXYuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvc2JwMi5jIGIvZHJpdmVycy9maXJld2lyZS9zYnAyLmMKaW5kZXggNTBmMDE3Ni4uOThkYmJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9zYnAyLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9zYnAyLmMKQEAgLTE4OCwxNCArMTg4LDcgQEAKIC8qIEltcG9zc2libGUgbG9naW5faWQsIHRvIGRldGVjdCBsb2dvdXQgYXR0ZW1wdCBiZWZvcmUgc3VjY2Vzc2Z1bCBsb2dpbiAqLwogI2RlZmluZSBJTlZBTElEX0xPR0lOX0lEIDB4MTAwMDAKIAotLyoKLSAqIFBlciBzZWN0aW9uIDcuNC44IG9mIHRoZSBTQlAtMiBzcGVjLCBhIG1ndF9PUkJfdGltZW91dCB2YWx1ZSBjYW4gYmUKLSAqIHByb3ZpZGVkIGluIHRoZSBjb25maWcgcm9tLiBNb3N0IGRldmljZXMgZG8gcHJvdmlkZSBhIHZhbHVlLCB3aGljaAotICogd2UnbGwgdXNlIGZvciBsb2dpbiBtYW5hZ2VtZW50IG9yYnMsIGJ1dCB3aXRoIHNvbWUgc2FuZSBsaW1pdHMuCi0gKi8KLSNkZWZpbmUgU0JQMl9NSU5fTE9HSU5fT1JCX1RJTUVPVVQJNTAwMFUJLyogVGltZW91dCBpbiBtcyAqLwotI2RlZmluZSBTQlAyX01BWF9MT0dJTl9PUkJfVElNRU9VVAk0MDAwMFUJLyogVGltZW91dCBpbiBtcyAqLwotI2RlZmluZSBTQlAyX09SQl9USU1FT1VUCQkyMDAwVQkvKiBUaW1lb3V0IGluIG1zICovCisjZGVmaW5lIFNCUDJfT1JCX1RJTUVPVVQJCTIwMDBVCQkvKiBUaW1lb3V0IGluIG1zICovCiAjZGVmaW5lIFNCUDJfT1JCX05VTEwJCQkweDgwMDAwMDAwCiAjZGVmaW5lIFNCUDJfUkVUUllfTElNSVQJCTB4ZgkJLyogMTUgcmV0cmllcyAqLwogI2RlZmluZSBTQlAyX0NZQ0xFX0xJTUlUCQkoMHhjOCA8PCAxMikJLyogMjAwIDEyNXVzIGN5Y2xlcyAqLwpAQCAtMTAzNCw3ICsxMDI3LDYgQEAKIHsKIAlzdHJ1Y3QgZndfY3NyX2l0ZXJhdG9yIGNpOwogCWludCBrZXksIHZhbHVlOwotCXVuc2lnbmVkIGludCB0aW1lb3V0OwogCiAJZndfY3NyX2l0ZXJhdG9yX2luaXQoJmNpLCBkaXJlY3RvcnkpOwogCXdoaWxlIChmd19jc3JfaXRlcmF0b3JfbmV4dCgmY2ksICZrZXksICZ2YWx1ZSkpIHsKQEAgLTEwNTksMTcgKzEwNTEsNyBAQAogCiAJCWNhc2UgU0JQMl9DU1JfVU5JVF9DSEFSQUNURVJJU1RJQ1M6CiAJCQkvKiB0aGUgdGltZW91dCB2YWx1ZSBpcyBzdG9yZWQgaW4gNTAwbXMgdW5pdHMgKi8KLQkJCXRpbWVvdXQgPSAoKHVuc2lnbmVkIGludCkgdmFsdWUgPj4gOCAmIDB4ZmYpICogNTAwOwotCQkJdGltZW91dCA9IG1heCh0aW1lb3V0LCBTQlAyX01JTl9MT0dJTl9PUkJfVElNRU9VVCk7Ci0JCQl0Z3QtPm1ndF9vcmJfdGltZW91dCA9Ci0JCQkJICBtaW4odGltZW91dCwgU0JQMl9NQVhfTE9HSU5fT1JCX1RJTUVPVVQpOwotCi0JCQlpZiAodGltZW91dCA+IHRndC0+bWd0X29yYl90aW1lb3V0KQotCQkJCWZ3X25vdGlmeSgiJXM6IGNvbmZpZyByb20gY29udGFpbnMgJWRzICIKLQkJCQkJICAibWFuYWdlbWVudCBPUkIgdGltZW91dCwgbGltaXRpbmcgIgotCQkJCQkgICJ0byAlZHNcbiIsIHRndC0+YnVzX2lkLAotCQkJCQkgIHRpbWVvdXQgLyAxMDAwLAotCQkJCQkgIHRndC0+bWd0X29yYl90aW1lb3V0IC8gMTAwMCk7CisJCQl0Z3QtPm1ndF9vcmJfdGltZW91dCA9ICh2YWx1ZSA+PiA4ICYgMHhmZikgKiA1MDA7CiAJCQlicmVhazsKIAogCQljYXNlIFNCUDJfQ1NSX0xPR0lDQUxfVU5JVF9OVU1CRVI6CkBAIC0xMDg3LDYgKzEwNjksMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFBlciBzZWN0aW9uIDcuNC44IG9mIHRoZSBTQlAtMiBzcGVjLCBhIG1ndF9PUkJfdGltZW91dCB2YWx1ZSBjYW4gYmUKKyAqIHByb3ZpZGVkIGluIHRoZSBjb25maWcgcm9tLiBNb3N0IGRldmljZXMgZG8gcHJvdmlkZSBhIHZhbHVlLCB3aGljaAorICogd2UnbGwgdXNlIGZvciBsb2dpbiBtYW5hZ2VtZW50IG9yYnMsIGJ1dCB3aXRoIHNvbWUgc2FuZSBsaW1pdHMuCisgKi8KK3N0YXRpYyB2b2lkIHNicDJfY2xhbXBfbWFuYWdlbWVudF9vcmJfdGltZW91dChzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCkKK3sKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IHRndC0+bWd0X29yYl90aW1lb3V0OworCisJaWYgKHRpbWVvdXQgPiA0MDAwMCkKKwkJZndfbm90aWZ5KCIlczogJWRzIG1ndF9PUkJfdGltZW91dCBsaW1pdGVkIHRvIDQwc1xuIiwKKwkJCSAgdGd0LT5idXNfaWQsIHRpbWVvdXQgLyAxMDAwKTsKKworCXRndC0+bWd0X29yYl90aW1lb3V0ID0gY2xhbXBfdmFsKHRpbWVvdXQsIDUwMDAsIDQwMDAwKTsKK30KKwogc3RhdGljIHZvaWQgc2JwMl9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBzYnAyX3RhcmdldCAqdGd0LCB1MzIgbW9kZWwsCiAJCQkJICB1MzIgZmlybXdhcmVfcmV2aXNpb24pCiB7CkBAIC0xMTcxLDYgKzExNjksNyBAQAogCQkJICAgICAgICZmaXJtd2FyZV9yZXZpc2lvbikgPCAwKQogCQlnb3RvIGZhaWxfdGd0X3B1dDsKIAorCXNicDJfY2xhbXBfbWFuYWdlbWVudF9vcmJfdGltZW91dCh0Z3QpOwogCXNicDJfaW5pdF93b3JrYXJvdW5kcyh0Z3QsIG1vZGVsLCBmaXJtd2FyZV9yZXZpc2lvbik7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnQuYwppbmRleCA0MjBhOTZlLi4wNTFkMWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnQuYwpAQCAtOTM5LDcgKzkzOSw3IEBACiAKIAlpZiAoaWJmdF9hZGRyKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImlCRlQgZGV0ZWN0ZWQgYXQgMHglbGx4LlxuIiwKLQkJICAgICAgICh1NjQpdmlydF90b19waHlzKCh2b2lkICopaWJmdF9hZGRyKSk7CisJCSAgICAgICAodTY0KWlzYV92aXJ0X3RvX2J1cyhpYmZ0X2FkZHIpKTsKIAogCQlyYyA9IGliZnRfY2hlY2tfZGV2aWNlKCk7CiAJCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnRfZmluZC5jCmluZGV4IGQ1M2ZiYmYuLmRmYjE1YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYwpAQCAtNjUsMTAgKzY1LDEwIEBACiAJCSAqIHNvIHNraXAgdGhhdCBhcmVhICovCiAJCWlmIChwb3MgPT0gVkdBX01FTSkKIAkJCXBvcyArPSBWR0FfU0laRTsKLQkJdmlydCA9IHBoeXNfdG9fdmlydChwb3MpOworCQl2aXJ0ID0gaXNhX2J1c190b192aXJ0KHBvcyk7CiAJCWlmIChtZW1jbXAodmlydCwgSUJGVF9TSUdOLCBJQkZUX1NJR05fTEVOKSA9PSAwKSB7CiAJCQl1bnNpZ25lZCBsb25nICphZGRyID0KLQkJCSAgICAodW5zaWduZWQgbG9uZyAqKXBoeXNfdG9fdmlydChwb3MgKyA0KTsKKwkJCSAgICAodW5zaWduZWQgbG9uZyAqKWlzYV9idXNfdG9fdmlydChwb3MgKyA0KTsKIAkJCWxlbiA9ICphZGRyOwogCQkJLyogaWYgdGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgZXh0ZW5kcyBwYXN0IDFNLAogCQkJICogdGhlIHRhYmxlIGNhbm5vdCBiZSB2YWxpZC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCmluZGV4IGJiMTFhNDIuLjY2MmVkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwpAQCAtMTQ4Nyw3ICsxNDg3LDcgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZ3Bpb2xpYl9zaG93LCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3Bpb2xpYl9vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3Bpb2xpYl9vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IGdwaW9saWJfb3BlbiwKIAkucmVhZAkJPSBzZXFfcmVhZCwKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby90d2w0MDMwLWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby90d2w0MDMwLWdwaW8uYwppbmRleCBhZmFkMTQ3Li40OTM4NGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vdHdsNDAzMC1ncGlvLmMKKysrIGIvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jCkBAIC00NjAsNyArNDYwLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBncGlvX3R3bDQwMzBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCisvKiBDYW5ub3QgdXNlIF9fZGV2ZXhpdCBhcyBncGlvX3R3bDQwMzBfcHJvYmUoKSBjYWxscyB1cyAqLworc3RhdGljIGludCBncGlvX3R3bDQwMzBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHR3bDQwMzBfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludCBzdGF0dXM7CkBAIC00OTMsNyArNDk0LDcgQEAKIAkuZHJpdmVyLm5hbWUJPSAidHdsNDAzMF9ncGlvIiwKIAkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJLnByb2JlCQk9IGdwaW9fdHdsNDAzMF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGdwaW9fdHdsNDAzMF9yZW1vdmUpLAorCS5yZW1vdmUJCT0gZ3Bpb190d2w0MDMwX3JlbW92ZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdwaW9fdHdsNDAzMF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCmluZGV4IGU0ZDk3MWMuLmY4MzFlYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCkBAIC0xMDIsNiArMTAyLDcgQEAKIAlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSBpZiBBQ1BJCiAJc2VsZWN0IElOUFVUIGlmIEFDUEkKIAlzZWxlY3QgQUNQSV9WSURFTyBpZiBBQ1BJCisJc2VsZWN0IEFDUElfQlVUVE9OIGlmIEFDUEkKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBzeXN0ZW0gdGhhdCBoYXMgSW50ZWwgODMwTSwgODQ1RywKIAkgIDg1MkdNLCA4NTVHTSA4NjVHIG9yIDkxNUcgaW50ZWdyYXRlZCBncmFwaGljcy4gIElmIE0gaXMgc2VsZWN0ZWQsIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwppbmRleCBiYTcyOGFkLi41Y2FlMGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwpAQCAtNDgyLDYgKzQ4Miw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1vZGUsIHQsICZjb25uZWN0b3ItPnVzZXJfbW9kZXMsIGhlYWQpCiAJCWRybV9tb2RlX3JlbW92ZShjb25uZWN0b3IsIG1vZGUpOwogCisJa2ZyZWUoY29ubmVjdG9yLT5mYl9oZWxwZXJfcHJpdmF0ZSk7CiAJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAJZHJtX21vZGVfb2JqZWN0X3B1dChkZXYsICZjb25uZWN0b3ItPmJhc2UpOwogCWxpc3RfZGVsKCZjb25uZWN0b3ItPmhlYWQpOwpAQCAtMTU1NSw4ICsxNTU2LDYgQEAKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJaW50IHJldCA9IDA7CiAKLQlEUk1fREVCVUdfS01TKCJcbiIpOwotCiAJaWYgKCFyZXEtPmZsYWdzKSB7CiAJCURSTV9FUlJPUigibm8gb3BlcmF0aW9uIHNldFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCmluZGV4IGZlODY5NzQuLjFmZTRlMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtX2NydGMuaCIKICNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJkcm1fZmJfaGVscGVyLmgiCiAKIHN0YXRpYyB2b2lkIGRybV9tb2RlX3ZhbGlkYXRlX2ZsYWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKIAkJCQkgICBpbnQgZmxhZ3MpCkBAIC05MCw3ICs5MSwxNSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2RlLCB0LCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkKIAkJbW9kZS0+c3RhdHVzID0gTU9ERV9VTlZFUklGSUVEOwogCi0JY29ubmVjdG9yLT5zdGF0dXMgPSBjb25uZWN0b3ItPmZ1bmNzLT5kZXRlY3QoY29ubmVjdG9yKTsKKwlpZiAoY29ubmVjdG9yLT5mb3JjZSkgeworCQlpZiAoY29ubmVjdG9yLT5mb3JjZSA9PSBEUk1fRk9SQ0VfT04pCisJCQljb25uZWN0b3ItPnN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCQllbHNlCisJCQljb25uZWN0b3ItPnN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCQlpZiAoY29ubmVjdG9yLT5mdW5jcy0+Zm9yY2UpCisJCQljb25uZWN0b3ItPmZ1bmNzLT5mb3JjZShjb25uZWN0b3IpOworCX0gZWxzZQorCQljb25uZWN0b3ItPnN0YXR1cyA9IGNvbm5lY3Rvci0+ZnVuY3MtPmRldGVjdChjb25uZWN0b3IpOwogCiAJaWYgKGNvbm5lY3Rvci0+c3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkKSB7CiAJCURSTV9ERUJVR19LTVMoIiVzIGlzIGRpc2Nvbm5lY3RlZFxuIiwKQEAgLTI2Nyw2ICsyNzYsNjUgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGJvb2wgZHJtX2hhc19jbWRsaW5lX21vZGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9jb25uZWN0b3IgKmZiX2hlbHBfY29ubiA9IGNvbm5lY3Rvci0+ZmJfaGVscGVyX3ByaXZhdGU7CisJc3RydWN0IGRybV9mYl9oZWxwZXJfY21kbGluZV9tb2RlICpjbWRsaW5lX21vZGU7CisKKwlpZiAoIWZiX2hlbHBfY29ubikKKwkJcmV0dXJuIGZhbHNlOworCisJY21kbGluZV9tb2RlID0gJmZiX2hlbHBfY29ubi0+Y21kbGluZV9tb2RlOworCXJldHVybiBjbWRsaW5lX21vZGUtPnNwZWNpZmllZDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fcGlja19jbWRsaW5lX21vZGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXN0cnVjdCBkcm1fZmJfaGVscGVyX2Nvbm5lY3RvciAqZmJfaGVscF9jb25uID0gY29ubmVjdG9yLT5mYl9oZWxwZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9jbWRsaW5lX21vZGUgKmNtZGxpbmVfbW9kZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9IE5VTEw7CisKKwlpZiAoIWZiX2hlbHBfY29ubikKKwkJcmV0dXJuIG1vZGU7CisKKwljbWRsaW5lX21vZGUgPSAmZmJfaGVscF9jb25uLT5jbWRsaW5lX21vZGU7CisJaWYgKGNtZGxpbmVfbW9kZS0+c3BlY2lmaWVkID09IGZhbHNlKQorCQlyZXR1cm4gbW9kZTsKKworCS8qIGF0dGVtcHQgdG8gZmluZCBhIG1hdGNoaW5nIG1vZGUgaW4gdGhlIGxpc3Qgb2YgbW9kZXMKKwkgKiAgd2UgaGF2ZSBnb3R0ZW4gc28gZmFyLCBpZiBub3QgYWRkIGEgQ1ZUIG1vZGUgdGhhdCBjb25mb3JtcworCSAqLworCWlmIChjbWRsaW5lX21vZGUtPnJiIHx8IGNtZGxpbmVfbW9kZS0+bWFyZ2lucykKKwkJZ290byBjcmVhdGVfbW9kZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKKwkJLyogY2hlY2sgd2lkdGgvaGVpZ2h0ICovCisJCWlmIChtb2RlLT5oZGlzcGxheSAhPSBjbWRsaW5lX21vZGUtPnhyZXMgfHwKKwkJICAgIG1vZGUtPnZkaXNwbGF5ICE9IGNtZGxpbmVfbW9kZS0+eXJlcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChjbWRsaW5lX21vZGUtPnJlZnJlc2hfc3BlY2lmaWVkKSB7CisJCQlpZiAobW9kZS0+dnJlZnJlc2ggIT0gY21kbGluZV9tb2RlLT5yZWZyZXNoKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNtZGxpbmVfbW9kZS0+aW50ZXJsYWNlKSB7CisJCQlpZiAoIShtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlyZXR1cm4gbW9kZTsKKwl9CisKK2NyZWF0ZV9tb2RlOgorCW1vZGUgPSBkcm1fY3Z0X21vZGUoY29ubmVjdG9yLT5kZXYsIGNtZGxpbmVfbW9kZS0+eHJlcywKKwkJCSAgICBjbWRsaW5lX21vZGUtPnlyZXMsCisJCQkgICAgY21kbGluZV9tb2RlLT5yZWZyZXNoX3NwZWNpZmllZCA/IGNtZGxpbmVfbW9kZS0+cmVmcmVzaCA6IDYwLAorCQkJICAgIGNtZGxpbmVfbW9kZS0+cmIsIGNtZGxpbmVfbW9kZS0+aW50ZXJsYWNlLAorCQkJICAgIGNtZGxpbmVfbW9kZS0+bWFyZ2lucyk7CisJbGlzdF9hZGQoJm1vZGUtPmhlYWQsICZjb25uZWN0b3ItPm1vZGVzKTsKKwlyZXR1cm4gbW9kZTsKK30KKwogc3RhdGljIGJvb2wgZHJtX2Nvbm5lY3Rvcl9lbmFibGVkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgc3RyaWN0KQogewogCWJvb2wgZW5hYmxlOwpAQCAtMzE3LDEwICszODUsMTYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJRFJNX0RFQlVHX0tNUygibG9va2luZyBmb3IgcHJlZmVycmVkIG1vZGUgb24gY29ubmVjdG9yICVkXG4iLAotCQkJICBjb25uZWN0b3ItPmJhc2UuaWQpOworCQlEUk1fREVCVUdfS01TKCJsb29raW5nIGZvciBjbWRsaW5lIG1vZGUgb24gY29ubmVjdG9yICVkXG4iLAorCQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkKTsKIAotCQltb2Rlc1tpXSA9IGRybV9oYXNfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLCB3aWR0aCwgaGVpZ2h0KTsKKwkJLyogZ290IGZvciBjb21tYW5kIGxpbmUgbW9kZSBmaXJzdCAqLworCQltb2Rlc1tpXSA9IGRybV9waWNrX2NtZGxpbmVfbW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQpOworCQlpZiAoIW1vZGVzW2ldKSB7CisJCQlEUk1fREVCVUdfS01TKCJsb29raW5nIGZvciBwcmVmZXJyZWQgbW9kZSBvbiBjb25uZWN0b3IgJWRcbiIsCisJCQkJICAgICAgY29ubmVjdG9yLT5iYXNlLmlkKTsKKwkJCW1vZGVzW2ldID0gZHJtX2hhc19wcmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQpOworCQl9CiAJCS8qIE5vIHByZWZlcnJlZCBtb2RlcywgcGljayBvbmUgb2ZmIHRoZSBsaXN0ICovCiAJCWlmICghbW9kZXNbaV0gJiYgIWxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+bW9kZXMpKSB7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGVzW2ldLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkKQEAgLTM2OSw2ICs0NDMsOCBAQAogCW15X3Njb3JlID0gMTsKIAlpZiAoY29ubmVjdG9yLT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpCiAJCW15X3Njb3JlKys7CisJaWYgKGRybV9oYXNfY21kbGluZV9tb2RlKGNvbm5lY3RvcikpCisJCW15X3Njb3JlKys7CiAJaWYgKGRybV9oYXNfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLCB3aWR0aCwgaGVpZ2h0KSkKIAkJbXlfc2NvcmUrKzsKIApAQCAtOTQzLDYgKzEwMTksOCBAQAogewogCWludCBjb3VudCA9IDA7CiAKKwlkcm1fZmJfaGVscGVyX3BhcnNlX2NvbW1hbmRfbGluZShkZXYpOworCiAJY291bnQgPSBkcm1faGVscGVyX3Byb2JlX2Nvbm5lY3Rvcl9tb2RlcyhkZXYsCiAJCQkJCQkgZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGgsCiAJCQkJCQkgZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0KTsKQEAgLTk1MCw3ICsxMDI4LDcgQEAKIAkvKgogCSAqIHdlIHNob3VsZG4ndCBlbmQgdXAgd2l0aCBubyBtb2RlcyBoZXJlLgogCSAqLwotCVdBUk4oIWNvdW50LCAiQ29ubmVjdGVkIGNvbm5lY3RvciB3aXRoIDAgbW9kZXNcbiIpOworCVdBUk4oIWNvdW50LCAiTm8gY29ubmVjdG9ycyByZXBvcnRlZCBjb25uZWN0ZWQgd2l0aCBtb2Rlc1xuIik7CiAKIAlkcm1fc2V0dXBfY3J0Y3MoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYwppbmRleCA5MGQ3NmJhLi5jZWE2NjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYwpAQCAtMTA5LDcgKzEwOSw5IEBACiAKIAogLyogVmFsaWQgRURJRCBoZWFkZXIgaGFzIHRoZXNlIGJ5dGVzICovCi1zdGF0aWMgdTggZWRpZF9oZWFkZXJbXSA9IHsgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCB9Oworc3RhdGljIGNvbnN0IHU4IGVkaWRfaGVhZGVyW10gPSB7CisJMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMAorfTsKIAogLyoqCiAgKiBlZGlkX2lzX3ZhbGlkIC0gc2FuaXR5IGNoZWNrIEVESUQgZGF0YQpAQCAtNTAwLDYgKzUwMiwxOSBAQAogCX0KIAlyZXR1cm4gbW9kZTsKIH0KKworLyoKKyAqIDAgaXMgcmVzZXJ2ZWQuICBUaGUgc3BlYyBzYXlzIDB4MDEgZmlsbCBmb3IgdW51c2VkIHRpbWluZ3MuICBTb21lIG9sZAorICogbW9uaXRvcnMgZmlsbCB3aXRoIGFzY2lpIHNwYWNlICgweDIwKSBpbnN0ZWFkLgorICovCitzdGF0aWMgaW50CitiYWRfc3RkX3RpbWluZyh1OCBhLCB1OCBiKQoreworCXJldHVybiAoYSA9PSAweDAwICYmIGIgPT0gMHgwMCkgfHwKKwkgICAgICAgKGEgPT0gMHgwMSAmJiBiID09IDB4MDEpIHx8CisJICAgICAgIChhID09IDB4MjAgJiYgYiA9PSAweDIwKTsKK30KKwogLyoqCiAgKiBkcm1fbW9kZV9zdGQgLSBjb252ZXJ0IHN0YW5kYXJkIG1vZGUgaW5mbyAod2lkdGgsIGhlaWdodCwgcmVmcmVzaCkgaW50byBtb2RlCiAgKiBAdDogc3RhbmRhcmQgdGltaW5nIHBhcmFtcwpAQCAtNTEzLDYgKzUyOCw3IEBACiAgKi8KIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZV9zdGQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3Qgc3RkX3RpbWluZyAqdCwKKwkJCQkgICAgICBpbnQgcmV2aXNpb24sCiAJCQkJICAgICAgaW50IHRpbWluZ19sZXZlbCkKIHsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKQEAgLTUyMywxNCArNTM5LDIwIEBACiAJdW5zaWduZWQgdmZyZXEgPSAodC0+dmZyZXFfYXNwZWN0ICYgRURJRF9USU1JTkdfVkZSRVFfTUFTSykKIAkJPj4gRURJRF9USU1JTkdfVkZSRVFfU0hJRlQ7CiAKKwlpZiAoYmFkX3N0ZF90aW1pbmcodC0+aHNpemUsIHQtPnZmcmVxX2FzcGVjdCkpCisJCXJldHVybiBOVUxMOworCiAJLyogQWNjb3JkaW5nIHRvIHRoZSBFRElEIHNwZWMsIHRoZSBoZGlzcGxheSA9IGhzaXplICogOCArIDI0OCAqLwogCWhzaXplID0gdC0+aHNpemUgKiA4ICsgMjQ4OwogCS8qIHZyZWZyZXNoX3JhdGUgPSB2ZnJlcSArIDYwICovCiAJdnJlZnJlc2hfcmF0ZSA9IHZmcmVxICsgNjA7CiAJLyogdGhlIHZkaXNwbGF5IGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGFzcGVjdCByYXRpbyAqLwotCWlmIChhc3BlY3RfcmF0aW8gPT0gMCkKLQkJdnNpemUgPSAoaHNpemUgKiAxMCkgLyAxNjsKLQllbHNlIGlmIChhc3BlY3RfcmF0aW8gPT0gMSkKKwlpZiAoYXNwZWN0X3JhdGlvID09IDApIHsKKwkJaWYgKHJldmlzaW9uIDwgMykKKwkJCXZzaXplID0gaHNpemU7CisJCWVsc2UKKwkJCXZzaXplID0gKGhzaXplICogMTApIC8gMTY7CisJfSBlbHNlIGlmIChhc3BlY3RfcmF0aW8gPT0gMSkKIAkJdnNpemUgPSAoaHNpemUgKiAzKSAvIDQ7CiAJZWxzZSBpZiAoYXNwZWN0X3JhdGlvID09IDIpCiAJCXZzaXplID0gKGhzaXplICogNCkgLyA1OwpAQCAtNTM4LDcgKzU2MCw4IEBACiAJCXZzaXplID0gKGhzaXplICogOSkgLyAxNjsKIAkvKiBIRFRWIGhhY2sgKi8KIAlpZiAoaHNpemUgPT0gMTM2MCAmJiB2c2l6ZSA9PSA3NjUgJiYgdnJlZnJlc2hfcmF0ZSA9PSA2MCkgewotCQltb2RlID0gZHJtX2N2dF9tb2RlKGRldiwgaHNpemUsIHZzaXplLCB2cmVmcmVzaF9yYXRlLCAwLCAwKTsKKwkJbW9kZSA9IGRybV9jdnRfbW9kZShkZXYsIGhzaXplLCB2c2l6ZSwgdnJlZnJlc2hfcmF0ZSwgMCwgMCwKKwkJCQkgICAgZmFsc2UpOwogCQltb2RlLT5oZGlzcGxheSA9IDEzNjY7CiAJCW1vZGUtPnZzeW5jX3N0YXJ0ID0gbW9kZS0+dnN5bmNfc3RhcnQgLSAxOwogCQltb2RlLT52c3luY19lbmQgPSBtb2RlLT52c3luY19lbmQgLSAxOwpAQCAtNTU3LDcgKzU4MCw4IEBACiAJCW1vZGUgPSBkcm1fZ3RmX21vZGUoZGV2LCBoc2l6ZSwgdnNpemUsIHZyZWZyZXNoX3JhdGUsIDAsIDApOwogCQlicmVhazsKIAljYXNlIExFVkVMX0NWVDoKLQkJbW9kZSA9IGRybV9jdnRfbW9kZShkZXYsIGhzaXplLCB2c2l6ZSwgdnJlZnJlc2hfcmF0ZSwgMCwgMCk7CisJCW1vZGUgPSBkcm1fY3Z0X21vZGUoZGV2LCBoc2l6ZSwgdnNpemUsIHZyZWZyZXNoX3JhdGUsIDAsIDAsCisJCQkJICAgIGZhbHNlKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBtb2RlOwpAQCAtNjAyLDYgKzYyNiwxMiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwkvKiBpdCBpcyBpbmNvcnJlY3QgaWYgaHN5bmMvdnN5bmMgd2lkdGggaXMgemVybyAqLworCWlmICghaHN5bmNfcHVsc2Vfd2lkdGggfHwgIXZzeW5jX3B1bHNlX3dpZHRoKSB7CisJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBEZXRhaWxlZCB0aW1pbmcuICIKKwkJCQkiV3JvbmcgSHN5bmMvVnN5bmMgcHVsc2Ugd2lkdGhcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJbW9kZSA9IGRybV9tb2RlX2NyZWF0ZShkZXYpOwogCWlmICghbW9kZSkKIAkJcmV0dXJuIE5VTEw7CkBAIC02MjMsNiArNjUzLDE1IEBACiAJbW9kZS0+dnN5bmNfZW5kID0gbW9kZS0+dnN5bmNfc3RhcnQgKyB2c3luY19wdWxzZV93aWR0aDsKIAltb2RlLT52dG90YWwgPSBtb2RlLT52ZGlzcGxheSArIHZibGFuazsKIAorCS8qIHBlcmZvcm0gdGhlIGJhc2ljIGNoZWNrIGZvciB0aGUgZGV0YWlsZWQgdGltaW5nICovCisJaWYgKG1vZGUtPmhzeW5jX2VuZCA+IG1vZGUtPmh0b3RhbCB8fAorCQltb2RlLT52c3luY19lbmQgPiBtb2RlLT52dG90YWwpIHsKKwkJZHJtX21vZGVfZGVzdHJveShkZXYsIG1vZGUpOworCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgZGV0YWlsZWQgdGltaW5nLiAiCisJCQkJIlN5bmMgaXMgYmV5b25kIHRoZSBibGFuay5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAlkcm1fbW9kZV9zZXRfbmFtZShtb2RlKTsKIAogCWlmIChwdC0+bWlzYyAmIERSTV9FRElEX1BUX0lOVEVSTEFDRUQpCkBAIC03NzksNyArODE4LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCW5ld21vZGUgPSBkcm1fbW9kZV9zdGQoZGV2LCAmZWRpZC0+c3RhbmRhcmRfdGltaW5nc1tpXSwKLQkJCQkJdGltaW5nX2xldmVsKTsKKwkJCQkgICAgICAgZWRpZC0+cmV2aXNpb24sIHRpbWluZ19sZXZlbCk7CiAJCWlmIChuZXdtb2RlKSB7CiAJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbmV3bW9kZSk7CiAJCQltb2RlcysrOwpAQCAtODI5LDEzICs4NjgsMTMgQEAKIAkJCWNhc2UgRURJRF9ERVRBSUxfTU9OSVRPUl9DUERBVEE6CiAJCQkJYnJlYWs7CiAJCQljYXNlIEVESURfREVUQUlMX1NURF9NT0RFUzoKLQkJCQkvKiBGaXZlIG1vZGVzIHBlciBkZXRhaWxlZCBzZWN0aW9uICovCi0JCQkJZm9yIChqID0gMDsgaiA8IDU7IGkrKykgeworCQkJCWZvciAoaiA9IDA7IGogPCA2OyBpKyspIHsKIAkJCQkJc3RydWN0IHN0ZF90aW1pbmcgKnN0ZDsKIAkJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGU7CiAKIAkJCQkJc3RkID0gJmRhdGEtPmRhdGEudGltaW5nc1tqXTsKIAkJCQkJbmV3bW9kZSA9IGRybV9tb2RlX3N0ZChkZXYsIHN0ZCwKKwkJCQkJCQkgICAgICAgZWRpZC0+cmV2aXNpb24sCiAJCQkJCQkJICAgICAgIHRpbWluZ19sZXZlbCk7CiAJCQkJCWlmIChuZXdtb2RlKSB7CiAJCQkJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbmV3bW9kZSk7CkBAIC05NjQsNyArMTAwMyw5IEBACiAJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGU7CiAKIAkJCQlzdGQgPSAmZGF0YS0+ZGF0YS50aW1pbmdzW2pdOwotCQkJCW5ld21vZGUgPSBkcm1fbW9kZV9zdGQoZGV2LCBzdGQsIHRpbWluZ19sZXZlbCk7CisJCQkJbmV3bW9kZSA9IGRybV9tb2RlX3N0ZChkZXYsIHN0ZCwKKwkJCQkJCSAgICAgICBlZGlkLT5yZXZpc2lvbiwKKwkJCQkJCSAgICAgICB0aW1pbmdfbGV2ZWwpOwogCQkJCWlmIChuZXdtb2RlKSB7CiAJCQkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKIAkJCQkJbW9kZXMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCmluZGV4IDJjNDY3MTMuLjljOTI0NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwpAQCAtNDAsNiArNDAsMTk5IEBACiAKIHN0YXRpYyBMSVNUX0hFQUQoa2VybmVsX2ZiX2hlbHBlcl9saXN0KTsKIAoraW50IGRybV9mYl9oZWxwZXJfYWRkX2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCWNvbm5lY3Rvci0+ZmJfaGVscGVyX3ByaXZhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9jb25uZWN0b3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbm5lY3Rvci0+ZmJfaGVscGVyX3ByaXZhdGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfYWRkX2Nvbm5lY3Rvcik7CisKK3N0YXRpYyBpbnQgbXlfYXRvaShjb25zdCBjaGFyICpuYW1lKQoreworCWludCB2YWwgPSAwOworCisJZm9yICg7OyBuYW1lKyspIHsKKwkJc3dpdGNoICgqbmFtZSkgeworCQljYXNlICcwJyAuLi4gJzknOgorCQkJdmFsID0gMTAqdmFsKygqbmFtZS0nMCcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gdmFsOworCQl9CisJfQorfQorCisvKioKKyAqIGRybV9mYl9oZWxwZXJfY29ubmVjdG9yX3BhcnNlX2NvbW1hbmRfbGluZSAtIHBhcnNlIGNvbW1hbmQgbGluZSBmb3IgY29ubmVjdG9yCisgKiBAY29ubmVjdG9yIC0gY29ubmVjdG9yIHRvIHBhcnNlIGxpbmUgZm9yCisgKiBAbW9kZV9vcHRpb24gLSBwZXIgY29ubmVjdG9yIG1vZGUgb3B0aW9uCisgKgorICogVGhpcyBwYXJzZXMgdGhlIGNvbm5lY3RvciBzcGVjaWZpYyB0aGVuIGdlbmVyaWMgY29tbWFuZCBsaW5lcyBmb3IKKyAqIG1vZGVzIGFuZCBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY29ubmVjdG9yLgorICoKKyAqIFRoaXMgdXNlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBmYiBtb2RlZGIuYywgZXhjZXB0IGZvciBleHRyYQorICoJPHhyZXM+eDx5cmVzPltNXVtSXVstPGJwcD5dW0A8cmVmcmVzaD5dW2ldW21dW2VEZF0KKyAqCisgKiBlbmFibGUvZW5hYmxlIERpZ2l0YWwvZGlzYWJsZSBiaXQgYXQgdGhlIGVuZAorICovCitzdGF0aWMgYm9vbCBkcm1fZmJfaGVscGVyX2Nvbm5lY3Rvcl9wYXJzZV9jb21tYW5kX2xpbmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJCSAgICAgICBjb25zdCBjaGFyICptb2RlX29wdGlvbikKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBuYW1lbGVuOworCWludCByZXNfc3BlY2lmaWVkID0gMCwgYnBwX3NwZWNpZmllZCA9IDAsIHJlZnJlc2hfc3BlY2lmaWVkID0gMDsKKwl1bnNpZ25lZCBpbnQgeHJlcyA9IDAsIHlyZXMgPSAwLCBicHAgPSAzMiwgcmVmcmVzaCA9IDA7CisJaW50IHlyZXNfc3BlY2lmaWVkID0gMCwgY3Z0ID0gMCwgcmIgPSAwLCBpbnRlcmxhY2UgPSAwLCBtYXJnaW5zID0gMDsKKwlpbnQgaTsKKwllbnVtIGRybV9jb25uZWN0b3JfZm9yY2UgZm9yY2UgPSBEUk1fRk9SQ0VfVU5TUEVDSUZJRUQ7CisJc3RydWN0IGRybV9mYl9oZWxwZXJfY29ubmVjdG9yICpmYl9oZWxwX2Nvbm4gPSBjb25uZWN0b3ItPmZiX2hlbHBlcl9wcml2YXRlOworCXN0cnVjdCBkcm1fZmJfaGVscGVyX2NtZGxpbmVfbW9kZSAqY21kbGluZV9tb2RlOworCisJaWYgKCFmYl9oZWxwX2Nvbm4pCisJCXJldHVybiBmYWxzZTsKKworCWNtZGxpbmVfbW9kZSA9ICZmYl9oZWxwX2Nvbm4tPmNtZGxpbmVfbW9kZTsKKwlpZiAoIW1vZGVfb3B0aW9uKQorCQltb2RlX29wdGlvbiA9IGZiX21vZGVfb3B0aW9uOworCisJaWYgKCFtb2RlX29wdGlvbikgeworCQljbWRsaW5lX21vZGUtPnNwZWNpZmllZCA9IGZhbHNlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJbmFtZSA9IG1vZGVfb3B0aW9uOworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJZm9yIChpID0gbmFtZWxlbi0xOyBpID49IDA7IGktLSkgeworCQlzd2l0Y2ggKG5hbWVbaV0pIHsKKwkJY2FzZSAnQCc6CisJCQluYW1lbGVuID0gaTsKKwkJCWlmICghcmVmcmVzaF9zcGVjaWZpZWQgJiYgIWJwcF9zcGVjaWZpZWQgJiYKKwkJCSAgICAheXJlc19zcGVjaWZpZWQpIHsKKwkJCQlyZWZyZXNoID0gbXlfYXRvaSgmbmFtZVtpKzFdKTsKKwkJCQlyZWZyZXNoX3NwZWNpZmllZCA9IDE7CisJCQkJaWYgKGN2dCB8fCByYikKKwkJCQkJY3Z0ID0gMDsKKwkJCX0gZWxzZQorCQkJCWdvdG8gZG9uZTsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCW5hbWVsZW4gPSBpOworCQkJaWYgKCFicHBfc3BlY2lmaWVkICYmICF5cmVzX3NwZWNpZmllZCkgeworCQkJCWJwcCA9IG15X2F0b2koJm5hbWVbaSsxXSk7CisJCQkJYnBwX3NwZWNpZmllZCA9IDE7CisJCQkJaWYgKGN2dCB8fCByYikKKwkJCQkJY3Z0ID0gMDsKKwkJCX0gZWxzZQorCQkJCWdvdG8gZG9uZTsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCWlmICgheXJlc19zcGVjaWZpZWQpIHsKKwkJCQl5cmVzID0gbXlfYXRvaSgmbmFtZVtpKzFdKTsKKwkJCQl5cmVzX3NwZWNpZmllZCA9IDE7CisJCQl9IGVsc2UKKwkJCQlnb3RvIGRvbmU7CisJCWNhc2UgJzAnIC4uLiAnOSc6CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQlpZiAoIXlyZXNfc3BlY2lmaWVkKQorCQkJCWN2dCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnUic6CisJCQlpZiAoIWN2dCkKKwkJCQlyYiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpZiAoIWN2dCkKKwkJCQltYXJnaW5zID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWlmICghY3Z0KQorCQkJCWludGVybGFjZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlmb3JjZSA9IERSTV9GT1JDRV9PTjsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWlmICgoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSkgfHwKKwkJCSAgICAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUIpKQorCQkJCWZvcmNlID0gRFJNX0ZPUkNFX09OOworCQkJZWxzZQorCQkJCWZvcmNlID0gRFJNX0ZPUkNFX09OX0RJR0lUQUw7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlmb3JjZSA9IERSTV9GT1JDRV9PRkY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwlpZiAoaSA8IDAgJiYgeXJlc19zcGVjaWZpZWQpIHsKKwkJeHJlcyA9IG15X2F0b2kobmFtZSk7CisJCXJlc19zcGVjaWZpZWQgPSAxOworCX0KK2RvbmU6CisKKwlEUk1fREVCVUdfS01TKCJjbWRsaW5lIG1vZGUgZm9yIGNvbm5lY3RvciAlcyAlZHglZEAlZEh6JXMlcyVzXG4iLAorCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksIHhyZXMsIHlyZXMsCisJCShyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MCwgKHJiKSA/ICIgcmVkdWNlZCBibGFua2luZyIgOgorCQkiIiwgKG1hcmdpbnMpID8gIiB3aXRoIG1hcmdpbnMiIDogIiIsIChpbnRlcmxhY2UpID8KKwkJIiBpbnRlcmxhY2VkIiA6ICIiKTsKKworCWlmIChmb3JjZSkgeworCQljb25zdCBjaGFyICpzOworCQlzd2l0Y2ggKGZvcmNlKSB7CisJCWNhc2UgRFJNX0ZPUkNFX09GRjogcyA9ICJPRkYiOyBicmVhazsKKwkJY2FzZSBEUk1fRk9SQ0VfT05fRElHSVRBTDogcyA9ICJPTiAtIGRpZyI7IGJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIERSTV9GT1JDRV9PTjogcyA9ICJPTiI7IGJyZWFrOworCQl9CisKKwkJRFJNX0lORk8oImZvcmNpbmcgJXMgY29ubmVjdG9yICVzXG4iLAorCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSwgcyk7CisJCWNvbm5lY3Rvci0+Zm9yY2UgPSBmb3JjZTsKKwl9CisKKwlpZiAocmVzX3NwZWNpZmllZCkgeworCQljbWRsaW5lX21vZGUtPnNwZWNpZmllZCA9IHRydWU7CisJCWNtZGxpbmVfbW9kZS0+eHJlcyA9IHhyZXM7CisJCWNtZGxpbmVfbW9kZS0+eXJlcyA9IHlyZXM7CisJfQorCisJaWYgKHJlZnJlc2hfc3BlY2lmaWVkKSB7CisJCWNtZGxpbmVfbW9kZS0+cmVmcmVzaF9zcGVjaWZpZWQgPSB0cnVlOworCQljbWRsaW5lX21vZGUtPnJlZnJlc2ggPSByZWZyZXNoOworCX0KKworCWlmIChicHBfc3BlY2lmaWVkKSB7CisJCWNtZGxpbmVfbW9kZS0+YnBwX3NwZWNpZmllZCA9IHRydWU7CisJCWNtZGxpbmVfbW9kZS0+YnBwID0gYnBwOworCX0KKwljbWRsaW5lX21vZGUtPnJiID0gcmIgPyB0cnVlIDogZmFsc2U7CisJY21kbGluZV9tb2RlLT5jdnQgPSBjdnQgID8gdHJ1ZSA6IGZhbHNlOworCWNtZGxpbmVfbW9kZS0+aW50ZXJsYWNlID0gaW50ZXJsYWNlID8gdHJ1ZSA6IGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBkcm1fZmJfaGVscGVyX3BhcnNlX2NvbW1hbmRfbGluZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJY2hhciAqb3B0aW9uID0gTlVMTDsKKworCQkvKiBkbyBzb21ldGhpbmcgb24gcmV0dXJuIC0gdHVybiBvZmYgY29ubmVjdG9yIG1heWJlICovCisJCWlmIChmYl9nZXRfb3B0aW9ucyhkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvciksICZvcHRpb24pKQorCQkJY29udGludWU7CisKKwkJZHJtX2ZiX2hlbHBlcl9jb25uZWN0b3JfcGFyc2VfY29tbWFuZF9saW5lKGNvbm5lY3Rvciwgb3B0aW9uKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIGJvb2wgZHJtX2ZiX2hlbHBlcl9mb3JjZV9rZXJuZWxfbW9kZSh2b2lkKQogewogCWludCBpID0gMDsKQEAgLTg3LDYgKzI4MCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfcmVzdG9yZSk7CiAKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKIHN0YXRpYyB2b2lkIGRybV9mYl9oZWxwZXJfcmVzdG9yZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCkKIHsKIAlkcm1fZmJfaGVscGVyX3Jlc3RvcmUoKTsKQEAgLTEwMyw2ICsyOTcsNyBAQAogCS5oZWxwX21zZyA9ICJmb3JjZS1mYihWKSIsCiAJLmFjdGlvbl9tc2cgPSAiUmVzdG9yZSBmcmFtZWJ1ZmZlciBjb25zb2xlIiwKIH07CisjZW5kaWYKIAogc3RhdGljIHZvaWQgZHJtX2ZiX2hlbHBlcl9vbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKQEAgLTI1OSw2ICs0NTQsMTA5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfaW5pdF9jcnRjX2NvdW50KTsKIAorc3RhdGljIGludCBzZXRjb2xyZWcoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgcmVkLCB1MTYgZ3JlZW4sCisJCSAgICAgdTE2IGJsdWUsIHUxNiByZWdubywgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGZiX2hlbHBlci0+ZmI7CisJaW50IHBpbmRleDsKKworCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IpIHsKKwkJdTMyICpwYWxldHRlOworCQl1MzIgdmFsdWU7CisJCS8qIHBsYWNlIGNvbG9yIGluIHBzdWVkb3BhbGV0dGUgKi8KKwkJaWYgKHJlZ25vID4gMTYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcGFsZXR0ZSA9ICh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZTsKKwkJcmVkID4+PSAoMTYgLSBpbmZvLT52YXIucmVkLmxlbmd0aCk7CisJCWdyZWVuID4+PSAoMTYgLSBpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoKTsKKwkJYmx1ZSA+Pj0gKDE2IC0gaW5mby0+dmFyLmJsdWUubGVuZ3RoKTsKKwkJdmFsdWUgPSAocmVkIDw8IGluZm8tPnZhci5yZWQub2Zmc2V0KSB8CisJCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKKwkJcGFsZXR0ZVtyZWdub10gPSB2YWx1ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGluZGV4ID0gcmVnbm87CisKKwlpZiAoZmItPmJpdHNfcGVyX3BpeGVsID09IDE2KSB7CisJCXBpbmRleCA9IHJlZ25vIDw8IDM7CisKKwkJaWYgKGZiLT5kZXB0aCA9PSAxNiAmJiByZWdubyA+IDYzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmYi0+ZGVwdGggPT0gMTUgJiYgcmVnbm8gPiAzMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChmYi0+ZGVwdGggPT0gMTYpIHsKKwkJCXUxNiByLCBnLCBiOworCQkJaW50IGk7CisJCQlpZiAocmVnbm8gPCAzMikgeworCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQkJCWZiX2hlbHBlci0+ZnVuY3MtPmdhbW1hX3NldChjcnRjLCByZWQsCisJCQkJCQlncmVlbiwgYmx1ZSwgcGluZGV4ICsgaSk7CisJCQl9CisKKwkJCWZiX2hlbHBlci0+ZnVuY3MtPmdhbW1hX2dldChjcnRjLCAmciwKKwkJCQkJCSAgICAmZywgJmIsCisJCQkJCQkgICAgcGluZGV4ID4+IDEpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJCWZiX2hlbHBlci0+ZnVuY3MtPmdhbW1hX3NldChjcnRjLCByLAorCQkJCQkJCSAgICBncmVlbiwgYiwKKwkJCQkJCQkgICAgKHBpbmRleCA+PiAxKSArIGkpOworCQl9CisJfQorCisJaWYgKGZiLT5kZXB0aCAhPSAxNikKKwkJZmJfaGVscGVyLT5mdW5jcy0+Z2FtbWFfc2V0KGNydGMsIHJlZCwgZ3JlZW4sIGJsdWUsIHBpbmRleCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fZmJfaGVscGVyX3NldGNtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGZiX2hlbHBlci0+ZGV2OworCXUxNiAqcmVkLCAqZ3JlZW4sICpibHVlLCAqdHJhbnNwOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlpbnQgaSwgcmMgPSAwOworCWludCBzdGFydDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmNydGNfZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKKwkJZm9yIChpID0gMDsgaSA8IGZiX2hlbHBlci0+Y3J0Y19jb3VudDsgaSsrKSB7CisJCQlpZiAoY3J0Yy0+YmFzZS5pZCA9PSBmYl9oZWxwZXItPmNydGNfaW5mb1tpXS5jcnRjX2lkKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IGZiX2hlbHBlci0+Y3J0Y19jb3VudCkKKwkJCWNvbnRpbnVlOworCisJCXJlZCA9IGNtYXAtPnJlZDsKKwkJZ3JlZW4gPSBjbWFwLT5ncmVlbjsKKwkJYmx1ZSA9IGNtYXAtPmJsdWU7CisJCXRyYW5zcCA9IGNtYXAtPnRyYW5zcDsKKwkJc3RhcnQgPSBjbWFwLT5zdGFydDsKKworCQlmb3IgKGkgPSAwOyBpIDwgY21hcC0+bGVuOyBpKyspIHsKKwkJCXUxNiBocmVkLCBoZ3JlZW4sIGhibHVlLCBodHJhbnNwID0gMHhmZmZmOworCisJCQlocmVkID0gKnJlZCsrOworCQkJaGdyZWVuID0gKmdyZWVuKys7CisJCQloYmx1ZSA9ICpibHVlKys7CisKKwkJCWlmICh0cmFuc3ApCisJCQkJaHRyYW5zcCA9ICp0cmFuc3ArKzsKKworCQkJcmMgPSBzZXRjb2xyZWcoY3J0YywgaHJlZCwgaGdyZWVuLCBoYmx1ZSwgc3RhcnQrKywgaW5mbyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCQl9CisJCWNydGNfZnVuY3MtPmxvYWRfbHV0KGNydGMpOworCX0KKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfc2V0Y21hcCk7CisKIGludCBkcm1fZmJfaGVscGVyX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywKIAkJCSAgICB1bnNpZ25lZCByZWQsCiAJCQkgICAgdW5zaWduZWQgZ3JlZW4sCkBAIC0yNzAsMTAgKzU2OCwxMyBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmYl9oZWxwZXItPmRldjsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJaW50IGk7CisJaW50IHJldDsKKworCWlmIChyZWdubyA+IDI1NSkKKwkJcmV0dXJuIDE7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgewotCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGZiX2hlbHBlci0+ZmI7Ci0KKwkJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOwogCQlmb3IgKGkgPSAwOyBpIDwgZmJfaGVscGVyLT5jcnRjX2NvdW50OyBpKyspIHsKIAkJCWlmIChjcnRjLT5iYXNlLmlkID09IGZiX2hlbHBlci0+Y3J0Y19pbmZvW2ldLmNydGNfaWQpCiAJCQkJYnJlYWs7CkBAIC0yODEsMzUgKzU4MiwxMSBAQAogCQlpZiAoaSA9PSBmYl9oZWxwZXItPmNydGNfY291bnQpCiAJCQljb250aW51ZTsKIAotCQlpZiAocmVnbm8gPiAyNTUpCi0JCQlyZXR1cm4gMTsKKwkJcmV0ID0gc2V0Y29scmVnKGNydGMsIHJlZCwgZ3JlZW4sIGJsdWUsIHJlZ25vLCBpbmZvKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQkJaWYgKGZiLT5kZXB0aCA9PSA4KSB7Ci0JCQlmYl9oZWxwZXItPmZ1bmNzLT5nYW1tYV9zZXQoY3J0YywgcmVkLCBncmVlbiwgYmx1ZSwgcmVnbm8pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAocmVnbm8gPCAxNikgewotCQkJc3dpdGNoIChmYi0+ZGVwdGgpIHsKLQkJCWNhc2UgMTU6Ci0JCQkJZmItPnBzZXVkb19wYWxldHRlW3JlZ25vXSA9ICgocmVkICYgMHhmODAwKSA+PiAxKSB8Ci0JCQkJCSgoZ3JlZW4gJiAweGY4MDApID4+ICA2KSB8Ci0JCQkJCSgoYmx1ZSAmIDB4ZjgwMCkgPj4gMTEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNjoKLQkJCQlmYi0+cHNldWRvX3BhbGV0dGVbcmVnbm9dID0gKHJlZCAmIDB4ZjgwMCkgfAotCQkJCQkoKGdyZWVuICYgMHhmYzAwKSA+PiAgNSkgfAotCQkJCQkoKGJsdWUgICYgMHhmODAwKSA+PiAxMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJY2FzZSAzMjoKLQkJCQlmYi0+cHNldWRvX3BhbGV0dGVbcmVnbm9dID0KLQkJCQkJKCgocmVkID4+IDgpICYgMHhmZikgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKLQkJCQkJKCgoZ3JlZW4gPj4gOCkgJiAweGZmKSA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8Ci0JCQkJCSgoKGJsdWUgPj4gOCkgJiAweGZmKSA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9CisJCWNydGNfZnVuY3MtPmxvYWRfbHV0KGNydGMpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQ3OSwxMSArNzU2LDE0IEBACiBFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfcGFuX2Rpc3BsYXkpOwogCiBpbnQgZHJtX2ZiX2hlbHBlcl9zaW5nbGVfZmJfcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgIGludCBwcmVmZXJyZWRfYnBwLAogCQkJCSAgaW50ICgqZmJfY3JlYXRlKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkJICAgdWludDMyX3QgZmJfd2lkdGgsCiAJCQkJCQkgICB1aW50MzJfdCBmYl9oZWlnaHQsCiAJCQkJCQkgICB1aW50MzJfdCBzdXJmYWNlX3dpZHRoLAogCQkJCQkJICAgdWludDMyX3Qgc3VyZmFjZV9oZWlnaHQsCisJCQkJCQkgICB1aW50MzJfdCBzdXJmYWNlX2RlcHRoLAorCQkJCQkJICAgdWludDMyX3Qgc3VyZmFjZV9icHAsCiAJCQkJCQkgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICoqZmJfcHRyKSkKIHsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CkBAIC00OTcsOCArNzc3LDQ4IEBACiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CiAJc3RydWN0IGRybV9tb2RlX3NldCAqbW9kZXNldCA9IE5VTEw7CiAJc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcjsKKwl1aW50MzJfdCBzdXJmYWNlX2RlcHRoID0gMjQsIHN1cmZhY2VfYnBwID0gMzI7CiAKKwkvKiBpZiBkcml2ZXIgcGlja3MgOCBvciAxNiBieSBkZWZhdWx0IHVzZSB0aGF0CisJICAgZm9yIGJvdGggZGVwdGgvYnBwICovCisJaWYgKHByZWZlcnJlZF9icHAgIT0gc3VyZmFjZV9icHApIHsKKwkJc3VyZmFjZV9kZXB0aCA9IHN1cmZhY2VfYnBwID0gcHJlZmVycmVkX2JwcDsKKwl9CiAJLyogZmlyc3QgdXAgZ2V0IGEgY291bnQgb2YgY3J0Y3Mgbm93IGluIHVzZSBhbmQgbmV3IG1pbi9tYXhlcyB3aWR0aC9oZWlnaHRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBkcm1fZmJfaGVscGVyX2Nvbm5lY3RvciAqZmJfaGVscF9jb25uID0gY29ubmVjdG9yLT5mYl9oZWxwZXJfcHJpdmF0ZTsKKworCQlzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9jbWRsaW5lX21vZGUgKmNtZGxpbmVfbW9kZTsKKworCQlpZiAoIWZiX2hlbHBfY29ubikKKwkJCWNvbnRpbnVlOworCQkKKwkJY21kbGluZV9tb2RlID0gJmZiX2hlbHBfY29ubi0+Y21kbGluZV9tb2RlOworCisJCWlmIChjbWRsaW5lX21vZGUtPmJwcF9zcGVjaWZpZWQpIHsKKwkJCXN3aXRjaCAoY21kbGluZV9tb2RlLT5icHApIHsKKwkJCWNhc2UgODoKKwkJCQlzdXJmYWNlX2RlcHRoID0gc3VyZmFjZV9icHAgPSA4OworCQkJCWJyZWFrOworCQkJY2FzZSAxNToKKwkJCQlzdXJmYWNlX2RlcHRoID0gMTU7CisJCQkJc3VyZmFjZV9icHAgPSAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTY6CisJCQkJc3VyZmFjZV9kZXB0aCA9IHN1cmZhY2VfYnBwID0gMTY7CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJCXN1cmZhY2VfZGVwdGggPSBzdXJmYWNlX2JwcCA9IDI0OworCQkJCWJyZWFrOworCQkJY2FzZSAzMjoKKwkJCQlzdXJmYWNlX2RlcHRoID0gMjQ7CisJCQkJc3VyZmFjZV9icHAgPSAzMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKIAkJaWYgKGRybV9oZWxwZXJfY3J0Y19pbl91c2UoY3J0YykpIHsKIAkJCWlmIChjcnRjLT5kZXNpcmVkX21vZGUpIHsKQEAgLTUyNyw3ICs4NDcsOCBAQAogCS8qIGRvIHdlIGhhdmUgYW4gZmIgYWxyZWFkeT8gKi8KIAlpZiAobGlzdF9lbXB0eSgmZGV2LT5tb2RlX2NvbmZpZy5mYl9rZXJuZWxfbGlzdCkpIHsKIAkJcmV0ID0gKCpmYl9jcmVhdGUpKGRldiwgZmJfd2lkdGgsIGZiX2hlaWdodCwgc3VyZmFjZV93aWR0aCwKLQkJCQkgICBzdXJmYWNlX2hlaWdodCwgJmZiKTsKKwkJCQkgICBzdXJmYWNlX2hlaWdodCwgc3VyZmFjZV9kZXB0aCwgc3VyZmFjZV9icHAsCisJCQkJICAgJmZiKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQluZXdfZmIgPSAxOwpAQCAtNjE4LDEwICs5MzksMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9mcmVlKTsKIAotdm9pZCBkcm1fZmJfaGVscGVyX2ZpbGxfZml4KHN0cnVjdCBmYl9pbmZvICppbmZvLCB1aW50MzJfdCBwaXRjaCkKK3ZvaWQgZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdWludDMyX3QgcGl0Y2gsCisJCQkgICAgdWludDMyX3QgZGVwdGgpCiB7CiAJaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7Ci0JaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJaW5mby0+Zml4LnZpc3VhbCA9IGRlcHRoID09IDggPyBGQl9WSVNVQUxfUFNFVURPQ09MT1IgOgorCQlGQl9WSVNVQUxfVFJVRUNPTE9SOwogCWluZm8tPmZpeC50eXBlX2F1eCA9IDA7CiAJaW5mby0+Zml4LnhwYW5zdGVwID0gMTsgLyogZG9pbmcgaXQgaW4gaHcgKi8KIAlpbmZvLT5maXgueXBhbnN0ZXAgPSAxOyAvKiBkb2luZyBpdCBpbiBodyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKaW5kZXggMjMwYzlmZi4uODAzOTE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCkBAIC0xNDIsNiArMTQyLDE5IEBACiAJaWYgKElTX0VSUihvYmotPmZpbHApKQogCQlnb3RvIGZyZWU7CiAKKwkvKiBCYXNpY2FsbHkgd2Ugd2FudCB0byBkaXNhYmxlIHRoZSBPT00ga2lsbGVyIGFuZCBoYW5kbGUgRU5PTUVNCisJICogb3Vyc2VsdmVzIGJ5IHNhY3JpZmljaW5nIHBhZ2VzIGZyb20gY2FjaGVkIGJ1ZmZlcnMuCisJICogWFhYIHNobWVtX2ZpbGVfW2dzXWV0X2dmcF9tYXNrKCkKKwkgKi8KKwltYXBwaW5nX3NldF9nZnBfbWFzayhvYmotPmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZywKKwkJCSAgICAgR0ZQX0hJR0hVU0VSIHwKKwkJCSAgICAgX19HRlBfQ09MRCB8CisJCQkgICAgIF9fR0ZQX0ZTIHwKKwkJCSAgICAgX19HRlBfUkVDTEFJTUFCTEUgfAorCQkJICAgICBfX0dGUF9OT1JFVFJZIHwKKwkJCSAgICAgX19HRlBfTk9XQVJOIHwKKwkJCSAgICAgX19HRlBfTk9NRU1BTExPQyk7CisKIAlrcmVmX2luaXQoJm9iai0+cmVmY291bnQpOwogCWtyZWZfaW5pdCgmb2JqLT5oYW5kbGVjb3VudCk7CiAJb2JqLT5zaXplID0gc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYwppbmRleCA0OTQwNGNlLi41MWY2NzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jCkBAIC04OCw3ICs4OCw3IEBACiAjZGVmaW5lIEhWX0ZBQ1RPUgkJCTEwMDAKIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fY3Z0X21vZGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhkaXNwbGF5LAogCQkJCSAgICAgIGludCB2ZGlzcGxheSwgaW50IHZyZWZyZXNoLAotCQkJCSAgICAgIGJvb2wgcmVkdWNlZCwgYm9vbCBpbnRlcmxhY2VkKQorCQkJCSAgICAgIGJvb2wgcmVkdWNlZCwgYm9vbCBpbnRlcmxhY2VkLCBib29sIG1hcmdpbnMpCiB7CiAJLyogMSkgdG9wL2JvdHRvbSBtYXJnaW4gc2l6ZSAoJSBvZiBoZWlnaHQpIC0gZGVmYXVsdDogMS44LCAqLwogI2RlZmluZQlDVlRfTUFSR0lOX1BFUkNFTlRBR0UJCTE4CkBAIC0xMDEsNyArMTAxLDYgQEAKIAkvKiBQaXhlbCBDbG9jayBzdGVwIChrSHopICovCiAjZGVmaW5lIENWVF9DTE9DS19TVEVQCQkJMjUwCiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRybV9tb2RlOwotCWJvb2wgbWFyZ2lucyA9IGZhbHNlOwogCXVuc2lnbmVkIGludCB2ZmllbGRyYXRlLCBocGVyaW9kOwogCWludCBoZGlzcGxheV9ybmQsIGhtYXJnaW4sIHZkaXNwbGF5X3JuZCwgdm1hcmdpbiwgdnN5bmM7CiAJaW50IGludGVybGFjZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYwppbmRleCA3ZTFmYmU1Li40YWM5MDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV92bS5jCkBAIC0zNjksMjggKzM2OSwyOCBAQAogfQogCiAvKiogQUdQIHZpcnR1YWwgbWVtb3J5IG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZHJtX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZHJtX3ZtX29wcyA9IHsKIAkuZmF1bHQgPSBkcm1fdm1fZmF1bHQsCiAJLm9wZW4gPSBkcm1fdm1fb3BlbiwKIAkuY2xvc2UgPSBkcm1fdm1fY2xvc2UsCiB9OwogCiAvKiogU2hhcmVkIHZpcnR1YWwgbWVtb3J5IG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZHJtX3ZtX3NobV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGRybV92bV9zaG1fb3BzID0gewogCS5mYXVsdCA9IGRybV92bV9zaG1fZmF1bHQsCiAJLm9wZW4gPSBkcm1fdm1fb3BlbiwKIAkuY2xvc2UgPSBkcm1fdm1fc2htX2Nsb3NlLAogfTsKIAogLyoqIERNQSB2aXJ0dWFsIG1lbW9yeSBvcGVyYXRpb25zICovCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGRybV92bV9kbWFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBkcm1fdm1fZG1hX29wcyA9IHsKIAkuZmF1bHQgPSBkcm1fdm1fZG1hX2ZhdWx0LAogCS5vcGVuID0gZHJtX3ZtX29wZW4sCiAJLmNsb3NlID0gZHJtX3ZtX2Nsb3NlLAogfTsKIAogLyoqIFNjYXR0ZXItZ2F0aGVyIHZpcnR1YWwgbWVtb3J5IG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZHJtX3ZtX3NnX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZHJtX3ZtX3NnX29wcyA9IHsKIAkuZmF1bHQgPSBkcm1fdm1fc2dfZmF1bHQsCiAJLm9wZW4gPSBkcm1fdm1fb3BlbiwKIAkuY2xvc2UgPSBkcm1fdm1fY2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4IDUyNjlkZmEuLmZhN2I5YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogCSAgaTkxNV9nZW0ubyBcCiAJICBpOTE1X2dlbV9kZWJ1Zy5vIFwKIAkgIGk5MTVfZ2VtX3RpbGluZy5vIFwKKwkgIGk5MTVfdHJhY2VfcG9pbnRzLm8gXAogCSAgaW50ZWxfZGlzcGxheS5vIFwKIAkgIGludGVsX2NydC5vIFwKIAkgIGludGVsX2x2ZHMubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCmluZGV4IDFlM2JkY2UuLmY4Y2U5YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCkBAIC05NiwxMSArOTYsMTMgQEAKIAl7CiAJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gb2JqX3ByaXYtPm9iajsKIAotCQlzZXFfcHJpbnRmKG0sICIgICAgJXA6ICVzICUwOHggJTA4eCAlZCIsCisJCXNlcV9wcmludGYobSwgIiAgICAlcDogJXMgJTh6ZCAlMDh4ICUwOHggJWQgJXMiLAogCQkJICAgb2JqLAogCQkJICAgZ2V0X3Bpbl9mbGFnKG9ial9wcml2KSwKKwkJCSAgIG9iai0+c2l6ZSwKIAkJCSAgIG9iai0+cmVhZF9kb21haW5zLCBvYmotPndyaXRlX2RvbWFpbiwKLQkJCSAgIG9ial9wcml2LT5sYXN0X3JlbmRlcmluZ19zZXFubyk7CisJCQkgICBvYmpfcHJpdi0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8sCisJCQkgICBvYmpfcHJpdi0+ZGlydHkgPyAiZGlydHkiIDogIiIpOwogCiAJCWlmIChvYmotPm5hbWUpCiAJCQlzZXFfcHJpbnRmKG0sICIgKG5hbWU6ICVkKSIsIG9iai0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCA1YTQ5YTE4Li5lNWIxMzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgPGxpbnV4L3ZnYWFyYi5oPgogCiAvKiBSZWFsbHkgd2FudCBhbiBPUy1pbmRlcGVuZGVudCByZXNldHRhYmxlIHRpbWVyLiAgV291bGQgbGlrZSB0byBoYXZlCkBAIC01MCwxNCArNTEsMTggQEAKIAl1MzIgbGFzdF9oZWFkID0gSTkxNV9SRUFEKFBSQjBfSEVBRCkgJiBIRUFEX0FERFI7CiAJaW50IGk7CiAKKwl0cmFjZV9pOTE1X3Jpbmdfd2FpdF9iZWdpbiAoZGV2KTsKKwogCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgewogCQlyaW5nLT5oZWFkID0gSTkxNV9SRUFEKFBSQjBfSEVBRCkgJiBIRUFEX0FERFI7CiAJCWFjdGhkID0gSTkxNV9SRUFEKGFjdGhkX3JlZyk7CiAJCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsICsgOCk7CiAJCWlmIChyaW5nLT5zcGFjZSA8IDApCiAJCQlyaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOwotCQlpZiAocmluZy0+c3BhY2UgPj0gbikKKwkJaWYgKHJpbmctPnNwYWNlID49IG4pIHsKKwkJCXRyYWNlX2k5MTVfcmluZ193YWl0X2VuZCAoZGV2KTsKIAkJCXJldHVybiAwOworCQl9CiAKIAkJaWYgKGRldi0+cHJpbWFyeS0+bWFzdGVyKSB7CiAJCQlzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gZGV2LT5wcmltYXJ5LT5tYXN0ZXItPmRyaXZlcl9wcml2OwpAQCAtNzcsNiArODIsNyBAQAogCiAJfQogCisJdHJhY2VfaTkxNV9yaW5nX3dhaXRfZW5kIChkZXYpOwogCXJldHVybiAtRUJVU1k7CiB9CiAKQEAgLTkyMiw3ICs5MjgsOCBAQAogICogaG93IG11Y2ggd2FzIHNldCBhc2lkZSBzbyB3ZSBjYW4gdXNlIGl0IGZvciBvdXIgb3duIHB1cnBvc2VzLgogICovCiBzdGF0aWMgaW50IGk5MTVfcHJvYmVfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90ICphcGVydHVyZV9zaXplLAotCQkJICB1aW50MzJfdCAqcHJlYWxsb2NhdGVkX3NpemUpCisJCQkgIHVpbnQzMl90ICpwcmVhbGxvY2F0ZWRfc2l6ZSwKKwkJCSAgdWludDMyX3QgKnN0YXJ0KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTE2IHRtcCA9IDA7CkBAIC0xMDA5LDEwICsxMDE2LDE1OSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCSpwcmVhbGxvY2F0ZWRfc2l6ZSA9IHN0b2xlbiAtIG92ZXJoZWFkOworCSpzdGFydCA9IG92ZXJoZWFkOwogCiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgUFRFX0FERFJFU1NfTUFTSwkJMHhmZmZmZjAwMAorI2RlZmluZSBQVEVfQUREUkVTU19NQVNLX0hJR0gJCTB4MDAwMDAwZjAgLyogaTkxNSsgKi8KKyNkZWZpbmUgUFRFX01BUFBJTkdfVFlQRV9VTkNBQ0hFRAkoMCA8PCAxKQorI2RlZmluZSBQVEVfTUFQUElOR19UWVBFX0RDQUNIRQkJKDEgPDwgMSkgLyogaTgzMCBvbmx5ICovCisjZGVmaW5lIFBURV9NQVBQSU5HX1RZUEVfQ0FDSEVECQkoMyA8PCAxKQorI2RlZmluZSBQVEVfTUFQUElOR19UWVBFX01BU0sJCSgzIDw8IDEpCisjZGVmaW5lIFBURV9WQUxJRAkJCSgxIDw8IDApCisKKy8qKgorICogaTkxNV9ndHRfdG9fcGh5cyAtIHRha2UgYSBHVFQgYWRkcmVzcyBhbmQgdHVybiBpdCBpbnRvIGEgcGh5c2ljYWwgb25lCisgKiBAZGV2OiBkcm0gZGV2aWNlCisgKiBAZ3R0X2FkZHI6IGFkZHJlc3MgdG8gdHJhbnNsYXRlCisgKgorICogU29tZSBjaGlwIGZ1bmN0aW9ucyByZXF1aXJlIGFsbG9jYXRpb25zIGZyb20gc3RvbGVuIHNwYWNlIGJ1dCBuZWVkIHRoZQorICogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGluIHF1ZXN0aW9uLiAgV2UgdXNlIHRoaXMgcm91dGluZQorICogdG8gZ2V0IGEgcGh5c2ljYWwgYWRkcmVzcyBzdWl0YWJsZSBmb3IgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgZnJvbSBhIGdpdmVuCisgKiBHVFQgYWRkcmVzcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaTkxNV9ndHRfdG9fcGh5cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZ3R0X2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyAqZ3R0OworCXVuc2lnbmVkIGxvbmcgZW50cnksIHBoeXM7CisJaW50IGd0dF9iYXIgPSBJU19JOVhYKGRldikgPyAwIDogMTsKKwlpbnQgZ3R0X29mZnNldCwgZ3R0X3NpemU7CisKKwlpZiAoSVNfSTk2NUcoZGV2KSkgeworCQlpZiAoSVNfRzRYKGRldikgfHwgSVNfSUdETkcoZGV2KSkgeworCQkJZ3R0X29mZnNldCA9IDIqMTAyNCoxMDI0OworCQkJZ3R0X3NpemUgPSAyKjEwMjQqMTAyNDsKKwkJfSBlbHNlIHsKKwkJCWd0dF9vZmZzZXQgPSA1MTIqMTAyNDsKKwkJCWd0dF9zaXplID0gNTEyKjEwMjQ7CisJCX0KKwl9IGVsc2UgeworCQlndHRfYmFyID0gMzsKKwkJZ3R0X29mZnNldCA9IDA7CisJCWd0dF9zaXplID0gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIGd0dF9iYXIpOworCX0KKworCWd0dCA9IGlvcmVtYXBfd2MocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgZ3R0X2JhcikgKyBndHRfb2Zmc2V0LAorCQkJIGd0dF9zaXplKTsKKwlpZiAoIWd0dCkgeworCQlEUk1fRVJST1IoImlvcmVtYXAgb2YgR1RUIGZhaWxlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWVudHJ5ID0gKih2b2xhdGlsZSB1MzIgKikoZ3R0ICsgKGd0dF9hZGRyIC8gMTAyNCkpOworCisJRFJNX0RFQlVHKCJHVFQgYWRkcjogMHglMDhseCwgUFRFOiAweCUwOGx4XG4iLCBndHRfYWRkciwgZW50cnkpOworCisJLyogTWFzayBvdXQgdGhlc2UgcmVzZXJ2ZWQgYml0cyBvbiB0aGlzIGhhcmR3YXJlLiAqLworCWlmICghSVNfSTlYWChkZXYpIHx8IElTX0k5MTVHKGRldikgfHwgSVNfSTkxNUdNKGRldikgfHwKKwkgICAgSVNfSTk0NUcoZGV2KSB8fCBJU19JOTQ1R00oZGV2KSkgeworCQllbnRyeSAmPSB+UFRFX0FERFJFU1NfTUFTS19ISUdIOworCX0KKworCS8qIElmIGl0J3Mgbm90IGEgbWFwcGluZyB0eXBlIHdlIGtub3csIHRoZW4gYmFpbC4gKi8KKwlpZiAoKGVudHJ5ICYgUFRFX01BUFBJTkdfVFlQRV9NQVNLKSAhPSBQVEVfTUFQUElOR19UWVBFX1VOQ0FDSEVEICYmCisJICAgIChlbnRyeSAmIFBURV9NQVBQSU5HX1RZUEVfTUFTSykgIT0gUFRFX01BUFBJTkdfVFlQRV9DQUNIRUQpCXsKKwkJaW91bm1hcChndHQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIShlbnRyeSAmIFBURV9WQUxJRCkpIHsKKwkJRFJNX0VSUk9SKCJiYWQgR1RUIGVudHJ5IGluIHN0b2xlbiBzcGFjZVxuIik7CisJCWlvdW5tYXAoZ3R0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW91bm1hcChndHQpOworCisJcGh5cyA9KGVudHJ5ICYgUFRFX0FERFJFU1NfTUFTSykgfAorCQkoKHVpbnQ2NF90KShlbnRyeSAmIFBURV9BRERSRVNTX01BU0tfSElHSCkgPDwgKDMyIC0gNCkpOworCisJRFJNX0RFQlVHKCJHVFQgYWRkcjogMHglMDhseCwgcGh5cyBhZGRyOiAweCUwOGx4XG4iLCBndHRfYWRkciwgcGh5cyk7CisKKwlyZXR1cm4gcGh5czsKK30KKworc3RhdGljIHZvaWQgaTkxNV93YXJuX3N0b2xlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCURSTV9FUlJPUigibm90IGVub3VnaCBzdG9sZW4gc3BhY2UgZm9yIGNvbXByZXNzZWQgYnVmZmVyLCBkaXNhYmxpbmdcbiIpOworCURSTV9FUlJPUigiaGludDogeW91IG1heSBiZSBhYmxlIHRvIGluY3JlYXNlIHN0b2xlbiBtZW1vcnkgc2l6ZSBpbiB0aGUgQklPUyB0byBhdm9pZCB0aGlzXG4iKTsKK30KKworc3RhdGljIHZvaWQgaTkxNV9zZXR1cF9jb21wcmVzc2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqY29tcHJlc3NlZF9mYiwgKmNvbXByZXNzZWRfbGxiOworCXVuc2lnbmVkIGxvbmcgY2ZiX2Jhc2UsIGxsX2Jhc2U7CisKKwkvKiBMZWF2ZSAxTSBmb3IgbGluZSBsZW5ndGggYnVmZmVyICYgbWlzYy4gKi8KKwljb21wcmVzc2VkX2ZiID0gZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+dnJhbSwgc2l6ZSwgNDA5NiwgMCk7CisJaWYgKCFjb21wcmVzc2VkX2ZiKSB7CisJCWk5MTVfd2Fybl9zdG9sZW4oZGV2KTsKKwkJcmV0dXJuOworCX0KKworCWNvbXByZXNzZWRfZmIgPSBkcm1fbW1fZ2V0X2Jsb2NrKGNvbXByZXNzZWRfZmIsIHNpemUsIDQwOTYpOworCWlmICghY29tcHJlc3NlZF9mYikgeworCQlpOTE1X3dhcm5fc3RvbGVuKGRldik7CisJCXJldHVybjsKKwl9CisKKwljZmJfYmFzZSA9IGk5MTVfZ3R0X3RvX3BoeXMoZGV2LCBjb21wcmVzc2VkX2ZiLT5zdGFydCk7CisJaWYgKCFjZmJfYmFzZSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgc3RvbGVuIHBoeXMgYWRkciwgZGlzYWJsaW5nIEZCQ1xuIik7CisJCWRybV9tbV9wdXRfYmxvY2soY29tcHJlc3NlZF9mYik7CisJfQorCisJaWYgKCFJU19HTTQ1KGRldikpIHsKKwkJY29tcHJlc3NlZF9sbGIgPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJmRldl9wcml2LT52cmFtLCA0MDk2LAorCQkJCQkJICAgIDQwOTYsIDApOworCQlpZiAoIWNvbXByZXNzZWRfbGxiKSB7CisJCQlpOTE1X3dhcm5fc3RvbGVuKGRldik7CisJCQlyZXR1cm47CisJCX0KKworCQljb21wcmVzc2VkX2xsYiA9IGRybV9tbV9nZXRfYmxvY2soY29tcHJlc3NlZF9sbGIsIDQwOTYsIDQwOTYpOworCQlpZiAoIWNvbXByZXNzZWRfbGxiKSB7CisJCQlpOTE1X3dhcm5fc3RvbGVuKGRldik7CisJCQlyZXR1cm47CisJCX0KKworCQlsbF9iYXNlID0gaTkxNV9ndHRfdG9fcGh5cyhkZXYsIGNvbXByZXNzZWRfbGxiLT5zdGFydCk7CisJCWlmICghbGxfYmFzZSkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IHN0b2xlbiBwaHlzIGFkZHIsIGRpc2FibGluZyBGQkNcbiIpOworCQkJZHJtX21tX3B1dF9ibG9jayhjb21wcmVzc2VkX2ZiKTsKKwkJCWRybV9tbV9wdXRfYmxvY2soY29tcHJlc3NlZF9sbGIpOworCQl9CisJfQorCisJZGV2X3ByaXYtPmNmYl9zaXplID0gc2l6ZTsKKworCWlmIChJU19HTTQ1KGRldikpIHsKKwkJZzR4X2Rpc2FibGVfZmJjKGRldik7CisJCUk5MTVfV1JJVEUoRFBGQ19DQl9CQVNFLCBjb21wcmVzc2VkX2ZiLT5zdGFydCk7CisJfSBlbHNlIHsKKwkJaTh4eF9kaXNhYmxlX2ZiYyhkZXYpOworCQlJOTE1X1dSSVRFKEZCQ19DRkJfQkFTRSwgY2ZiX2Jhc2UpOworCQlJOTE1X1dSSVRFKEZCQ19MTF9CQVNFLCBsbF9iYXNlKTsKKwl9CisKKwlEUk1fREVCVUcoIkZCQyBiYXNlIDB4JTA4bHgsIGxsIGJhc2UgMHglMDhseCwgc2l6ZSAlZE1cbiIsIGNmYl9iYXNlLAorCQkgIGxsX2Jhc2UsIHNpemUgPj4gMjApOworfQorCiAvKiB0cnVlID0gZW5hYmxlIGRlY29kZSwgZmFsc2UgPSBkaXNhYmxlIGRlY29kZXIgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaTkxNV92Z2Ffc2V0X2RlY29kZSh2b2lkICpjb29raWUsIGJvb2wgc3RhdGUpCiB7CkBAIC0xMDI3LDYgKzExODMsNyBAQAogfQogCiBzdGF0aWMgaW50IGk5MTVfbG9hZF9tb2Rlc2V0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcHJlYWxsb2Nfc3RhcnQsCiAJCQkJICB1bnNpZ25lZCBsb25nIHByZWFsbG9jX3NpemUsCiAJCQkJICB1bnNpZ25lZCBsb25nIGFncF9zaXplKQogewpAQCAtMTA0Nyw2ICsxMjA0LDEwIEBACiAKIAkvKiBCYXNpYyBtZW1yYW5nZSBhbGxvY2F0b3IgZm9yIHN0b2xlbiBzcGFjZSAoYWthIHZyYW0pICovCiAJZHJtX21tX2luaXQoJmRldl9wcml2LT52cmFtLCAwLCBwcmVhbGxvY19zaXplKTsKKwlEUk1fSU5GTygic2V0IHVwICVsZE0gb2Ygc3RvbGVuIHNwYWNlXG4iLCBwcmVhbGxvY19zaXplIC8gKDEwMjQqMTAyNCkpOworCisJLyogV2UncmUgb2ZmIGFuZCBydW5uaW5nIHcvS01TICovCisJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDA7CiAKIAkvKiBMZXQgR0VNIE1hbmFnZSBmcm9tIGVuZCBvZiBwcmVhbGxvYyBzcGFjZSB0byBlbmQgb2YgYXBlcnR1cmUuCiAJICoKQEAgLTEwNTksMTAgKzEyMjAsMjQgQEAKIAkgKi8KIAlpOTE1X2dlbV9kb19pbml0KGRldiwgcHJlYWxsb2Nfc2l6ZSwgYWdwX3NpemUgLSA0MDk2KTsKIAorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXQgPSBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAorCS8qIFRyeSB0byBzZXQgdXAgRkJDIHdpdGggYSByZWFzb25hYmxlIGNvbXByZXNzZWQgYnVmZmVyIHNpemUgKi8KKwlpZiAoSTkxNV9IQVNfRkJDKGRldikgJiYgaTkxNV9wb3dlcnNhdmUpIHsKKwkJaW50IGNmYl9zaXplOworCisJCS8qIFRyeSB0byBnZXQgYW4gOE0gYnVmZmVyLi4uICovCisJCWlmIChwcmVhbGxvY19zaXplID4gKDkqMTAyNCoxMDI0KSkKKwkJCWNmYl9zaXplID0gOCoxMDI0KjEwMjQ7CisJCWVsc2UgLyogZmFsbCBiYWNrIHRvIDcvOCBvZiB0aGUgc3RvbGVuIHNwYWNlICovCisJCQljZmJfc2l6ZSA9IHByZWFsbG9jX3NpemUgKiA3IC8gODsKKwkJaTkxNV9zZXR1cF9jb21wcmVzc2lvbihkZXYsIGNmYl9zaXplKTsKKwl9CisKIAkvKiBBbGxvdyBoYXJkd2FyZSBiYXRjaGJ1ZmZlcnMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLgogCSAqLwogCWRldl9wcml2LT5hbGxvd19iYXRjaGJ1ZmZlciA9IDE7CkBAIC0xMTgwLDcgKzEzNTUsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJcmVzb3VyY2Vfc2l6ZV90IGJhc2UsIHNpemU7CiAJaW50IHJldCA9IDAsIG1taW9fYmFyID0gSVNfSTlYWChkZXYpID8gMCA6IDE7Ci0JdWludDMyX3QgYWdwX3NpemUsIHByZWFsbG9jX3NpemU7CisJdWludDMyX3QgYWdwX3NpemUsIHByZWFsbG9jX3NpemUsIHByZWFsbG9jX3N0YXJ0OwogCiAJLyogaTkxNSBoYXMgNCBtb3JlIGNvdW50ZXJzICovCiAJZGV2LT5jb3VudGVycyArPSA0OwpAQCAtMTIzNCw3ICsxNDA5LDcgQEAKIAkJCSAicGVyZm9ybWFuY2UgbWF5IHN1ZmZlci5cbiIpOwogCX0KIAotCXJldCA9IGk5MTVfcHJvYmVfYWdwKGRldiwgJmFncF9zaXplLCAmcHJlYWxsb2Nfc2l6ZSk7CisJcmV0ID0gaTkxNV9wcm9iZV9hZ3AoZGV2LCAmYWdwX3NpemUsICZwcmVhbGxvY19zaXplLCAmcHJlYWxsb2Nfc3RhcnQpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2lvbWFwZnJlZTsKIApAQCAtMTI5Miw2ICsxNDY3LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXZfcHJpdi0+ZXJyb3JfbG9jayk7CiAJZGV2X3ByaXYtPnVzZXJfaXJxX3JlZmNvdW50ID0gMDsKKwlkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vID0gMDsKIAogCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIEk5MTVfTlVNX1BJUEUpOwogCkBAIC0xMzAwLDggKzE0NzYsMTIgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwkvKiBTdGFydCBvdXQgc3VzcGVuZGVkICovCisJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDE7CisKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgewotCQlyZXQgPSBpOTE1X2xvYWRfbW9kZXNldF9pbml0KGRldiwgcHJlYWxsb2Nfc2l6ZSwgYWdwX3NpemUpOworCQlyZXQgPSBpOTE1X2xvYWRfbW9kZXNldF9pbml0KGRldiwgcHJlYWxsb2Nfc3RhcnQsCisJCQkJCSAgICAgcHJlYWxsb2Nfc2l6ZSwgYWdwX3NpemUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCBtb2Rlc2V0XG4iKTsKIAkJCWdvdG8gb3V0X3dvcmtxdWV1ZV9mcmVlOwpAQCAtMTMxMyw2ICsxNDkzLDggQEAKIAlpZiAoIUlTX0lHRE5HKGRldikpCiAJCWludGVsX29wcmVnaW9uX2luaXQoZGV2LCAwKTsKIAorCXNldHVwX3RpbWVyKCZkZXZfcHJpdi0+aGFuZ2NoZWNrX3RpbWVyLCBpOTE1X2hhbmdjaGVja19lbGFwc2VkLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIGRldik7CiAJcmV0dXJuIDA7CiAKIG91dF93b3JrcXVldWVfZnJlZToKQEAgLTEzMzMsNiArMTUxNSw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCWRlc3Ryb3lfd29ya3F1ZXVlKGRldl9wcml2LT53cSk7CisJZGVsX3RpbWVyX3N5bmMoJmRldl9wcml2LT5oYW5nY2hlY2tfdGltZXIpOwogCiAJaW9fbWFwcGluZ19mcmVlKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZyk7CiAJaWYgKGRldl9wcml2LT5tbS5ndHRfbXRyciA+PSAwKSB7CkBAIC0xNDcyLDYgKzE2NTUsNyBAQAogCURSTV9JT0NUTF9ERUYoRFJNX0k5MTVfR0VNX0dFVF9USUxJTkcsIGk5MTVfZ2VtX2dldF90aWxpbmcsIDApLAogCURSTV9JT0NUTF9ERUYoRFJNX0k5MTVfR0VNX0dFVF9BUEVSVFVSRSwgaTkxNV9nZW1fZ2V0X2FwZXJ0dXJlX2lvY3RsLCAwKSwKIAlEUk1fSU9DVExfREVGKERSTV9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRCwgaW50ZWxfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkLCAwKSwKKwlEUk1fSU9DVExfREVGKERSTV9JOTE1X0dFTV9NQURWSVNFLCBpOTE1X2dlbV9tYWR2aXNlX2lvY3RsLCAwKSwKIH07CiAKIGludCBpOTE1X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk5MTVfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCmluZGV4IGRiZTU2OGMuLjdmNDM2ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwpAQCAtODksNiArODksOSBAQAogCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldi0+cGRldiwgUENJX0QzaG90KTsKIAl9CiAKKwkvKiBNb2Rlc2V0IG9uIHJlc3VtZSwgbm90IGxpZCBldmVudHMgKi8KKwlkZXZfcHJpdi0+bW9kZXNldF9vbl9saWQgPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk3LDggKzEwMCw2IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LT5wZGV2LCBQQ0lfRDApOwotCXBjaV9yZXN0b3JlX3N0YXRlKGRldi0+cGRldik7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldi0+cGRldikpCiAJCXJldHVybiAtMTsKIAlwY2lfc2V0X21hc3RlcihkZXYtPnBkZXYpOwpAQCAtMTI0LDkgKzEyNSwxMzUgQEAKIAkJZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZShkZXYpOwogCX0KIAorCWRldl9wcml2LT5tb2Rlc2V0X29uX2xpZCA9IDA7CisKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGk5NjVfcmVzZXQgLSByZXNldCBjaGlwIGFmdGVyIGEgaGFuZworICogQGRldjogZHJtIGRldmljZSB0byByZXNldAorICogQGZsYWdzOiByZXNldCBkb21haW5zCisgKgorICogUmVzZXQgdGhlIGNoaXAuICBVc2VmdWwgaWYgYSBoYW5nIGlzIGRldGVjdGVkLiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzc2Z1bAorICogcmVzZXQgb3Igb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCisgKgorICogUHJvY2VkdXJlIGlzIGZhaXJseSBzaW1wbGU6CisgKiAgIC0gcmVzZXQgdGhlIGNoaXAgdXNpbmcgdGhlIHJlc2V0IHJlZworICogICAtIHJlLWluaXQgY29udGV4dCBzdGF0ZQorICogICAtIHJlLWluaXQgaGFyZHdhcmUgc3RhdHVzIHBhZ2UKKyAqICAgLSByZS1pbml0IHJpbmcgYnVmZmVyCisgKiAgIC0gcmUtaW5pdCBpbnRlcnJ1cHQgc3RhdGUKKyAqICAgLSByZS1pbml0IGRpc3BsYXkKKyAqLworaW50IGk5NjVfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggZmxhZ3MpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXU4IGdkcnN0OworCS8qCisJICogV2UgcmVhbGx5IHNob3VsZCBvbmx5IHJlc2V0IHRoZSBkaXNwbGF5IHN1YnN5c3RlbSBpZiB3ZSBhY3R1YWxseQorCSAqIG5lZWQgdG8KKwkgKi8KKwlib29sIG5lZWRfZGlzcGxheSA9IHRydWU7CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwkvKgorCSAqIENsZWFyIHJlcXVlc3QgbGlzdAorCSAqLworCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYpOworCisJaWYgKG5lZWRfZGlzcGxheSkKKwkJaTkxNV9zYXZlX2Rpc3BsYXkoZGV2KTsKKworCWlmIChJU19JOTY1RyhkZXYpIHx8IElTX0c0WChkZXYpKSB7CisJCS8qCisJCSAqIFNldCB0aGUgZG9tYWlucyB3ZSB3YW50IHRvIHJlc2V0LCB0aGVuIHRoZSByZXNldCBiaXQgKGJpdCAwKS4KKwkJICogQ2xlYXIgdGhlIHJlc2V0IGJpdCBhZnRlciBhIHdoaWxlIGFuZCB3YWl0IGZvciBoYXJkd2FyZSBzdGF0dXMKKwkJICogYml0IChiaXQgMSkgdG8gYmUgc2V0CisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYtPnBkZXYsIEdEUlNULCAmZ2Ryc3QpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LT5wZGV2LCBHRFJTVCwgZ2Ryc3QgfCBmbGFncyB8ICgoZmxhZ3MgPT0gR0RSU1RfRlVMTCkgPyAweDEgOiAweDApKTsKKwkJdWRlbGF5KDUwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldi0+cGRldiwgR0RSU1QsIGdkcnN0ICYgMHhmZSk7CisKKwkJLyogLi4ud2UgZG9uJ3Qgd2FudCB0byBsb29wIGZvcmV2ZXIgdGhvdWdoLCA1MDBtcyBzaG91bGQgYmUgcGxlbnR5ICovCisJICAgICAgIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApOworCQlkbyB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldi0+cGRldiwgR0RSU1QsICZnZHJzdCk7CisJCX0gd2hpbGUgKChnZHJzdCAmIDB4MSkgJiYgdGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CisKKwkJaWYgKGdkcnN0ICYgMHgxKSB7CisJCQlXQVJOKHRydWUsICJpOTE1OiBGYWlsZWQgdG8gcmVzZXQgY2hpcFxuIik7CisJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIHsKKwkJRFJNX0VSUk9SKCJFcnJvciBvY2N1cnJlZC4gRG9uJ3Qga25vdyBob3cgdG8gcmVzZXQgdGhpcyBjaGlwLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIE9rLCBub3cgZ2V0IHRoaW5ncyBnb2luZyBhZ2Fpbi4uLiAqLworCisJLyoKKwkgKiBFdmVyeXRoaW5nIGRlcGVuZHMgb24gaGF2aW5nIHRoZSBHVFQgcnVubmluZywgc28gd2UgbmVlZCB0byBzdGFydAorCSAqIHRoZXJlLiAgRm9ydHVuYXRlbHkgd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGlzIHVubGVzcyB3ZSByZXNldCB0aGUKKwkgKiBjaGlwIGF0IGEgUENJIGxldmVsLgorCSAqCisJICogTmV4dCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIGNvbnRleHQsIGJ1dCB3ZSBkb24ndCB1c2UgdGhvc2UKKwkgKiB5ZXQgZWl0aGVyLi4uCisJICoKKwkgKiBSaW5nIGJ1ZmZlciBuZWVkcyB0byBiZSByZS1pbml0aWFsaXplZCBpbiB0aGUgS01TIGNhc2UsIG9yIGlmIFgKKwkgKiB3YXMgcnVubmluZyBhdCB0aGUgdGltZSBvZiB0aGUgcmVzZXQgKGkuZS4gd2Ugd2VyZW4ndCBWVAorCSAqIHN3aXRjaGVkIGF3YXkpLgorCSAqLworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpIHx8CisJICAgICFkZXZfcHJpdi0+bW0uc3VzcGVuZGVkKSB7CisJCWRybV9pOTE1X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmc7CisJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gcmluZy0+cmluZ19vYmo7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJCWRldl9wcml2LT5tbS5zdXNwZW5kZWQgPSAwOworCisJCS8qIFN0b3AgdGhlIHJpbmcgaWYgaXQncyBydW5uaW5nLiAqLworCQlJOTE1X1dSSVRFKFBSQjBfQ1RMLCAwKTsKKwkJSTkxNV9XUklURShQUkIwX1RBSUwsIDApOworCQlJOTE1X1dSSVRFKFBSQjBfSEVBRCwgMCk7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgcmluZy4gKi8KKwkJSTkxNV9XUklURShQUkIwX1NUQVJULCBvYmpfcHJpdi0+Z3R0X29mZnNldCk7CisJCUk5MTVfV1JJVEUoUFJCMF9DVEwsCisJCQkgICAoKG9iai0+c2l6ZSAtIDQwOTYpICYgUklOR19OUl9QQUdFUykgfAorCQkJICAgUklOR19OT19SRVBPUlQgfAorCQkJICAgUklOR19WQUxJRCk7CisJCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCQllbHNlIHsKKwkJCXJpbmctPmhlYWQgPSBJOTE1X1JFQUQoUFJCMF9IRUFEKSAmIEhFQURfQUREUjsKKwkJCXJpbmctPnRhaWwgPSBJOTE1X1JFQUQoUFJCMF9UQUlMKSAmIFRBSUxfQUREUjsKKwkJCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsICsgOCk7CisJCQlpZiAocmluZy0+c3BhY2UgPCAwKQorCQkJCXJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7CisJCX0KKworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKwkJZHJtX2lycV9pbnN0YWxsKGRldik7CisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwl9CisKKwkvKgorCSAqIERpc3BsYXkgbmVlZHMgcmVzdG9yZSB0b28uLi4KKwkgKi8KKwlpZiAobmVlZF9kaXNwbGF5KQorCQlpOTE1X3Jlc3RvcmVfZGlzcGxheShkZXYpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCBfX2RldmluaXQKIGk5MTVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMjM0LDYgKzM2MSw4IEBACiB7CiAJZHJpdmVyLm51bV9pb2N0bHMgPSBpOTE1X21heF9pb2N0bDsKIAorCWk5MTVfZ2VtX3Nocmlua2VyX2luaXQoKTsKKwogCS8qCiAJICogSWYgQ09ORklHX0RSTV9JOTE1X0tNUyBpcyBzZXQsIGRlZmF1bHQgdG8gS01TIHVubGVzcwogCSAqIGV4cGxpY2l0bHkgZGlzYWJsZWQgd2l0aCB0aGUgbW9kdWxlIHBhcmFybWV0ZXIuCkBAIC0yNjAsNiArMzg5LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGk5MTVfZXhpdCh2b2lkKQogeworCWk5MTVfZ2VtX3Nocmlua2VyX2V4aXQoKTsKIAlkcm1fZXhpdCgmZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggYTA2MzJmOC4uNTcyMDRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC00OCw2ICs0OCwxMSBAQAogCVBJUEVfQiwKIH07CiAKK2VudW0gcGxhbmUgeworCVBMQU5FX0EgPSAwLAorCVBMQU5FX0IsCit9OworCiAjZGVmaW5lIEk5MTVfTlVNX1BJUEUJMgogCiAvKiBJbnRlcmZhY2UgaGlzdG9yeToKQEAgLTE0OCw2ICsxNTMsMjMgQEAKIAlzdHJ1Y3QgdGltZXZhbCB0aW1lOwogfTsKIAorc3RydWN0IGRybV9pOTE1X2Rpc3BsYXlfZnVuY3MgeworCXZvaWQgKCpkcG1zKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKTsKKwlib29sICgqZmJjX2VuYWJsZWQpKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisJdm9pZCAoKmVuYWJsZV9mYmMpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCk7CisJdm9pZCAoKmRpc2FibGVfZmJjKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwlpbnQgKCpnZXRfZGlzcGxheV9jbG9ja19zcGVlZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJaW50ICgqZ2V0X2ZpZm9fc2l6ZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBsYW5lKTsKKwl2b2lkICgqdXBkYXRlX3dtKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmVhX2Nsb2NrLAorCQkJICBpbnQgcGxhbmViX2Nsb2NrLCBpbnQgc3JfaGRpc3BsYXksIGludCBwaXhlbF9zaXplKTsKKwkvKiBjbG9jayB1cGRhdGVzIGZvciBtb2RlIHNldCAqLworCS8qIGN1cnNvciB1cGRhdGVzICovCisJLyogcmVuZGVyIGNsb2NrIGluY3JlYXNlL2RlY3JlYXNlICovCisJLyogZGlzcGxheSBjbG9jayBpbmNyZWFzZS9kZWNyZWFzZSAqLworCS8qIHBsbCBjbG9jayBpbmNyZWFzZS9kZWNyZWFzZSAqLworCS8qIGNsb2NrIGdhdGluZyBpbml0ICovCit9OworCiB0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCkBAIC0xODAsNiArMjAyLDcgQEAKIAlzcGlubG9ja190IHVzZXJfaXJxX2xvY2s7CiAJLyoqIFJlZmNvdW50IGZvciBpOTE1X3VzZXJfaXJxX2dldCgpIHZlcnN1cyBpOTE1X3VzZXJfaXJxX3B1dCgpLiAqLwogCWludCB1c2VyX2lycV9yZWZjb3VudDsKKwl1MzIgdHJhY2VfaXJxX3NlcW5vOwogCS8qKiBDYWNoZWQgdmFsdWUgb2YgSU1SIHRvIGF2b2lkIHJlYWRzIGluIHVwZGF0aW5nIHRoZSBiaXRmaWVsZCAqLwogCXUzMiBpcnFfbWFza19yZWc7CiAJdTMyIHBpcGVzdGF0WzJdOwpAQCAtMTk4LDEwICsyMjEsMjEgQEAKIAl1bnNpZ25lZCBpbnQgc3IwMSwgYWRwYSwgcHBjciwgZHZvYiwgZHZvYywgbHZkczsKIAlpbnQgdmJsYW5rX3BpcGU7CiAKKwkvKiBGb3IgaGFuZ2NoZWNrIHRpbWVyICovCisjZGVmaW5lIERSTV9JOTE1X0hBTkdDSEVDS19QRVJJT0QgNzUgLyogaW4gamlmZmllcyAqLworCXN0cnVjdCB0aW1lcl9saXN0IGhhbmdjaGVja190aW1lcjsKKwlpbnQgaGFuZ2NoZWNrX2NvdW50OworCXVpbnQzMl90IGxhc3RfYWN0aGQ7CisKIAlib29sIGN1cnNvcl9uZWVkc19waHlzaWNhbDsKIAogCXN0cnVjdCBkcm1fbW0gdnJhbTsKIAorCXVuc2lnbmVkIGxvbmcgY2ZiX3NpemU7CisJdW5zaWduZWQgbG9uZyBjZmJfcGl0Y2g7CisJaW50IGNmYl9mZW5jZTsKKwlpbnQgY2ZiX3BsYW5lOworCiAJaW50IGlycV9lbmFibGVkOwogCiAJc3RydWN0IGludGVsX29wcmVnaW9uIG9wcmVnaW9uOwpAQCAtMjIyLDYgKzI1Niw4IEBACiAJdW5zaWduZWQgaW50IGVkcF9zdXBwb3J0OjE7CiAJaW50IGx2ZHNfc3NjX2ZyZXE7CiAKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbGlkX25vdGlmaWVyOworCiAJaW50IGNydF9kZGNfYnVzOyAvKiAtMSA9IHVua25vd24sIGVsc2UgR1BJTyB0byB1c2UgZm9yIENSVCBEREMgKi8KIAlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnIGZlbmNlX3JlZ3NbMTZdOyAvKiBhc3N1bWUgOTY1ICovCiAJaW50IGZlbmNlX3JlZ19zdGFydDsgLyogNCBpZiB1c2VybGFuZCBoYXNuJ3QgaW9jdGwnZCB1cyB5ZXQgKi8KQEAgLTIzNCw3ICsyNzAsMTEgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZXJyb3Jfd29yazsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAKKwkvKiBEaXNwbGF5IGZ1bmN0aW9ucyAqLworCXN0cnVjdCBkcm1faTkxNV9kaXNwbGF5X2Z1bmNzIGRpc3BsYXk7CisKIAkvKiBSZWdpc3RlciBzdGF0ZSAqLworCWJvb2wgbW9kZXNldF9vbl9saWQ7CiAJdTggc2F2ZUxCQjsKIAl1MzIgc2F2ZURTUEFDTlRSOwogCXUzMiBzYXZlRFNQQkNOVFI7CkBAIC0yNTYsNiArMjk2LDEyIEBACiAJdTMyIHNhdmVWQkxBTktfQTsKIAl1MzIgc2F2ZVZTWU5DX0E7CiAJdTMyIHNhdmVCQ0xSUEFUX0E7CisJdTMyIHNhdmVUUkFOU19IVE9UQUxfQTsKKwl1MzIgc2F2ZVRSQU5TX0hCTEFOS19BOworCXUzMiBzYXZlVFJBTlNfSFNZTkNfQTsKKwl1MzIgc2F2ZVRSQU5TX1ZUT1RBTF9BOworCXUzMiBzYXZlVFJBTlNfVkJMQU5LX0E7CisJdTMyIHNhdmVUUkFOU19WU1lOQ19BOwogCXUzMiBzYXZlUElQRUFTVEFUOwogCXUzMiBzYXZlRFNQQVNUUklERTsKIAl1MzIgc2F2ZURTUEFTSVpFOwpAQCAtMjY0LDggKzMxMCwxMSBAQAogCXUzMiBzYXZlRFNQQVNVUkY7CiAJdTMyIHNhdmVEU1BBVElMRU9GRjsKIAl1MzIgc2F2ZVBGSVRfUEdNX1JBVElPUzsKKwl1MzIgc2F2ZUJMQ19ISVNUX0NUTDsKIAl1MzIgc2F2ZUJMQ19QV01fQ1RMOwogCXUzMiBzYXZlQkxDX1BXTV9DVEwyOworCXUzMiBzYXZlQkxDX0NQVV9QV01fQ1RMOworCXUzMiBzYXZlQkxDX0NQVV9QV01fQ1RMMjsKIAl1MzIgc2F2ZUZQQjA7CiAJdTMyIHNhdmVGUEIxOwogCXUzMiBzYXZlRFBMTF9COwpAQCAtMjc3LDYgKzMyNiwxMiBAQAogCXUzMiBzYXZlVkJMQU5LX0I7CiAJdTMyIHNhdmVWU1lOQ19COwogCXUzMiBzYXZlQkNMUlBBVF9COworCXUzMiBzYXZlVFJBTlNfSFRPVEFMX0I7CisJdTMyIHNhdmVUUkFOU19IQkxBTktfQjsKKwl1MzIgc2F2ZVRSQU5TX0hTWU5DX0I7CisJdTMyIHNhdmVUUkFOU19WVE9UQUxfQjsKKwl1MzIgc2F2ZVRSQU5TX1ZCTEFOS19COworCXUzMiBzYXZlVFJBTlNfVlNZTkNfQjsKIAl1MzIgc2F2ZVBJUEVCU1RBVDsKIAl1MzIgc2F2ZURTUEJTVFJJREU7CiAJdTMyIHNhdmVEU1BCU0laRTsKQEAgLTMwMiw2ICszNTcsNyBAQAogCXUzMiBzYXZlUEZJVF9DT05UUk9MOwogCXUzMiBzYXZlX3BhbGV0dGVfYVsyNTZdOwogCXUzMiBzYXZlX3BhbGV0dGVfYlsyNTZdOworCXUzMiBzYXZlRFBGQ19DQl9CQVNFOwogCXUzMiBzYXZlRkJDX0NGQl9CQVNFOwogCXUzMiBzYXZlRkJDX0xMX0JBU0U7CiAJdTMyIHNhdmVGQkNfQ09OVFJPTDsKQEAgLTMwOSw2ICszNjUsMTIgQEAKIAl1MzIgc2F2ZUlFUjsKIAl1MzIgc2F2ZUlJUjsKIAl1MzIgc2F2ZUlNUjsKKwl1MzIgc2F2ZURFSUVSOworCXUzMiBzYXZlREVJTVI7CisJdTMyIHNhdmVHVElFUjsKKwl1MzIgc2F2ZUdUSU1SOworCXUzMiBzYXZlRkRJX1JYQV9JTVI7CisJdTMyIHNhdmVGRElfUlhCX0lNUjsKIAl1MzIgc2F2ZUNBQ0hFX01PREVfMDsKIAl1MzIgc2F2ZURfU1RBVEU7CiAJdTMyIHNhdmVEU1BDTEtfR0FURV9EOwpAQCAtMzQyLDYgKzQwNCwxNiBAQAogCXUzMiBzYXZlUElQRUJfRFBfTElOS19NOwogCXUzMiBzYXZlUElQRUFfRFBfTElOS19OOwogCXUzMiBzYXZlUElQRUJfRFBfTElOS19OOworCXUzMiBzYXZlRkRJX1JYQV9DVEw7CisJdTMyIHNhdmVGRElfVFhBX0NUTDsKKwl1MzIgc2F2ZUZESV9SWEJfQ1RMOworCXUzMiBzYXZlRkRJX1RYQl9DVEw7CisJdTMyIHNhdmVQRkFfQ1RMXzE7CisJdTMyIHNhdmVQRkJfQ1RMXzE7CisJdTMyIHNhdmVQRkFfV0lOX1NaOworCXUzMiBzYXZlUEZCX1dJTl9TWjsKKwl1MzIgc2F2ZVBGQV9XSU5fUE9TOworCXUzMiBzYXZlUEZCX1dJTl9QT1M7CiAKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgZHJtX21tIGd0dF9zcGFjZTsKQEAgLTM1MCw2ICs0MjIsMTUgQEAKIAkJaW50IGd0dF9tdHJyOwogCiAJCS8qKgorCQkgKiBNZW1iZXJzaGlwIG9uIGxpc3Qgb2YgYWxsIGxvYWRlZCBkZXZpY2VzLCB1c2VkIHRvIGV2aWN0CisJCSAqIGluYWN0aXZlIGJ1ZmZlcnMgdW5kZXIgbWVtb3J5IHByZXNzdXJlLgorCQkgKgorCQkgKiBNb2RpZmljYXRpb25zIHNob3VsZCBvbmx5IGJlIGRvbmUgd2hpbHN0IGhvbGRpbmcgdGhlCisJCSAqIHNocmlua19saXN0X2xvY2sgc3BpbmxvY2suCisJCSAqLworCQlzdHJ1Y3QgbGlzdF9oZWFkIHNocmlua19saXN0OworCisJCS8qKgogCQkgKiBMaXN0IG9mIG9iamVjdHMgY3VycmVudGx5IGludm9sdmVkIGluIHJlbmRlcmluZyBmcm9tIHRoZQogCQkgKiByaW5nYnVmZmVyLgogCQkgKgpAQCAtNDMyLDcgKzUxMyw3IEBACiAJCSAqIEl0IHByZXZlbnRzIGNvbW1hbmQgc3VibWlzc2lvbiBmcm9tIG9jY3VyaW5nIGFuZCBtYWtlcwogCQkgKiBldmVyeSBwZW5kaW5nIHJlcXVlc3QgZmFpbAogCQkgKi8KLQkJaW50IHdlZGdlZDsKKwkJYXRvbWljX3Qgd2VkZ2VkOwogCiAJCS8qKiBCaXQgNiBzd2l6emxpbmcgcmVxdWlyZWQgZm9yIFggdGlsaW5nICovCiAJCXVpbnQzMl90IGJpdF82X3N3aXp6bGVfeDsKQEAgLTQ0Myw2ICs1MjQsOCBAQAogCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BoeXNfb2JqZWN0ICpwaHlzX29ianNbSTkxNV9NQVhfUEhZU19PQkpFQ1RdOwogCX0gbW07CiAJc3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgc2R2b19tYXBwaW5nc1syXTsKKwkvKiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBMVkRTX0JPUkRFUiBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QgKi8KKwl1bnNpZ25lZCBpbnQgbHZkc19ib3JkZXJfYml0czsKIAogCS8qIFJlY2xvY2tpbmcgc3VwcG9ydCAqLwogCWJvb2wgcmVuZGVyX3JlY2xvY2tfYXZhaWw7CkBAIC00OTEsMTAgKzU3NCw3IEBACiAJICogVGhpcyBpcyB0aGUgc2FtZSBhcyBndHRfc3BhY2UtPnN0YXJ0CiAJICovCiAJdWludDMyX3QgZ3R0X29mZnNldDsKLQkvKioKLQkgKiBSZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBvYmplY3QKLQkgKi8KLQl1aW50MzJfdCBndHRfYWxpZ25tZW50OworCiAJLyoqCiAJICogRmFrZSBvZmZzZXQgZm9yIHVzZSBieSBtbWFwKDIpCiAJICovCkBAIC01NDEsNiArNjIxLDExIEBACiAJICogaW4gYW4gZXhlY2J1ZmZlciBvYmplY3QgbGlzdC4KIAkgKi8KIAlpbnQgaW5fZXhlY2J1ZmZlcjsKKworCS8qKgorCSAqIEFkdmljZTogYXJlIHRoZSBiYWNraW5nIHBhZ2VzIHB1cmdlYWJsZT8KKwkgKi8KKwlpbnQgbWFkdjsKIH07CiAKIC8qKgpAQCAtNTg1LDYgKzY3MCw4IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGk5MTVfZmJwZXJjcnRjOwogZXh0ZXJuIHVuc2lnbmVkIGludCBpOTE1X3Bvd2Vyc2F2ZTsKIAorZXh0ZXJuIHZvaWQgaTkxNV9zYXZlX2Rpc3BsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpOTE1X3Jlc3RvcmVfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgaTkxNV9tYXN0ZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpOwogZXh0ZXJuIHZvaWQgaTkxNV9tYXN0ZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKIApAQCAtNjA0LDEzICs2OTEsMTYgQEAKIGV4dGVybiBpbnQgaTkxNV9lbWl0X2JveChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3hlcywKIAkJCSBpbnQgaSwgaW50IERSMSwgaW50IERSNCk7CitleHRlcm4gaW50IGk5NjVfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggZmxhZ3MpOwogCiAvKiBpOTE1X2lycS5jICovCit2b2lkIGk5MTVfaGFuZ2NoZWNrX2VsYXBzZWQodW5zaWduZWQgbG9uZyBkYXRhKTsKIGV4dGVybiBpbnQgaTkxNV9pcnFfZW1pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiBpbnQgaTkxNV9pcnFfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIHZvaWQgaTkxNV91c2VyX2lycV9nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGk5MTVfdHJhY2VfaXJxX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8pOwogdm9pZCBpOTE1X3VzZXJfaXJxX3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGk5MTVfZW5hYmxlX2ludGVycnVwdCAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKQEAgLTY3Niw2ICs3NjYsOCBAQAogCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogaW50IGk5MTVfZ2VtX3Rocm90dGxlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworaW50IGk5MTVfZ2VtX21hZHZpc2VfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGludCBpOTE1X2dlbV9lbnRlcnZ0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBpbnQgaTkxNV9nZW1fbGVhdmV2dF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLApAQCAtNjk1LDYgKzc4Nyw3IEBACiB2b2lkIGk5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CiB2b2lkIGk5MTVfZ2VtX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHVpbnQzMl90IGk5MTVfZ2V0X2dlbV9zZXFubyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2Jvb2wgaTkxNV9zZXFub19wYXNzZWQodWludDMyX3Qgc2VxMSwgdWludDMyX3Qgc2VxMik7CiBpbnQgaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogaW50IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKIHZvaWQgaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtNzIwLDYgKzgxMyw5IEBACiB2b2lkIGk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogdm9pZCBpOTE1X2dlbV9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiAKK3ZvaWQgaTkxNV9nZW1fc2hyaW5rZXJfaW5pdCh2b2lkKTsKK3ZvaWQgaTkxNV9nZW1fc2hyaW5rZXJfZXhpdCh2b2lkKTsKKwogLyogaTkxNV9nZW1fdGlsaW5nLmMgKi8KIHZvaWQgaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIGk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CkBAIC03NjcsNiArODYzLDggQEAKIGV4dGVybiB2b2lkIGludGVsX21vZGVzZXRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX21vZGVzZXRfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgaW50ZWxfbW9kZXNldF92Z2Ffc2V0X3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgc3RhdGUpOworZXh0ZXJuIHZvaWQgaTh4eF9kaXNhYmxlX2ZiYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGc0eF9kaXNhYmxlX2ZiYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogLyoqCiAgKiBMb2NrIHRlc3QgZm9yIHdoZW4gaXQncyBqdXN0IGZvciBzeW5jaHJvbml6YXRpb24gb2YgcmluZyBhY2Nlc3MuCkBAIC04NjQsNiArOTYyLDcgQEAKIAkJICAgICAgIChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkUxMiB8fCBcCiAJCSAgICAgICAoZGV2KS0+cGNpX2RldmljZSA9PSAweDJFMjIgfHwgXAogCQkgICAgICAgKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyRTMyIHx8IFwKKwkJICAgICAgIChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkU0MiB8fCBcCiAJCSAgICAgICAoZGV2KS0+cGNpX2RldmljZSA9PSAweDAwNDIgfHwgXAogCQkgICAgICAgKGRldiktPnBjaV9kZXZpY2UgPT0gMHgwMDQ2KQogCkBAIC04NzYsNiArOTc1LDcgQEAKIAkJICAgICAoZGV2KS0+cGNpX2RldmljZSA9PSAweDJFMTIgfHwgXAogCQkgICAgIChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkUyMiB8fCBcCiAJCSAgICAgKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyRTMyIHx8IFwKKwkJICAgICAoZGV2KS0+cGNpX2RldmljZSA9PSAweDJFNDIgfHwgXAogCQkgICAgIElTX0dNNDUoZGV2KSkKIAogI2RlZmluZSBJU19JR0RHKGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4YTAwMSkKQEAgLTkwOSwxMiArMTAwOSwxNiBAQAogI2RlZmluZSBTVVBQT1JUU19JTlRFR1JBVEVEX0hETUkoZGV2KQkoSVNfRzRYKGRldikgfHwgSVNfSUdETkcoZGV2KSkKICNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9EUChkZXYpCShJU19HNFgoZGV2KSB8fCBJU19JR0RORyhkZXYpKQogI2RlZmluZSBTVVBQT1JUU19FRFAoZGV2KQkJKElTX0lHRE5HX00oZGV2KSkKLSNkZWZpbmUgSTkxNV9IQVNfSE9UUExVRyhkZXYpIChJU19JOTQ1RyhkZXYpIHx8IElTX0k5NDVHTShkZXYpIHx8IElTX0k5NjVHKGRldikpCisjZGVmaW5lIEk5MTVfSEFTX0hPVFBMVUcoZGV2KSAoSVNfSTk0NUcoZGV2KSB8fCBJU19JOTQ1R00oZGV2KSB8fCBJU19HMzMoZGV2KSB8fCBJU19JOTY1RyhkZXYpKQogLyogZHNwYXJiIGNvbnRyb2xsZWQgYnkgaHcgb25seSAqLwogI2RlZmluZSBEU1BBUkJfSFdDT05UUk9MKGRldikgKElTX0c0WChkZXYpIHx8IElTX0lHRE5HKGRldikpCiAKICNkZWZpbmUgSEFTX0ZXX0JMQyhkZXYpIChJU19JOVhYKGRldikgfHwgSVNfRzRYKGRldikgfHwgSVNfSUdETkcoZGV2KSkKICNkZWZpbmUgSEFTX1BJUEVfQ1hTUihkZXYpIChJU19HNFgoZGV2KSB8fCBJU19JR0RORyhkZXYpKQorI2RlZmluZSBJOTE1X0hBU19GQkMoZGV2KSAoSVNfTU9CSUxFKGRldikgJiYgXAorCQkJICAgKElTX0k5WFgoZGV2KSB8fCBJU19HTTQ1KGRldikpICYmIFwKKwkJCSAgICFJU19JR0QoZGV2KSAmJiBcCisJCQkgICAhSVNfSUdETkcoZGV2KSkKIAogI2RlZmluZSBQUklNQVJZX1JJTkdCVUZGRVJfU0laRSAgICAgICAgICgxMjgqMTAyNCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggYzY3MzE3MS4uYWJmYzI3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAiaTkxNV9kcm0uaCIKICNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC00OCwxMSArNDksMTUgQEAKIHN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAogCQkJCQkgICB1bnNpZ25lZCBhbGlnbm1lbnQpOwogc3RhdGljIHZvaWQgaTkxNV9nZW1fY2xlYXJfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLXN0YXRpYyBpbnQgaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG1pbl9zaXplKTsKK3N0YXRpYyBpbnQgaTkxNV9nZW1fZXZpY3RfZnJvbV9pbmFjdGl2ZV9saXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBpOTE1X2dlbV9waHlzX3B3cml0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKIAkJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSAqYXJncywKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiAKK3N0YXRpYyBMSVNUX0hFQUQoc2hyaW5rX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzaHJpbmtfbGlzdF9sb2NrKTsKKwogaW50IGk5MTVfZ2VtX2RvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJICAgICB1bnNpZ25lZCBsb25nIGVuZCkKIHsKQEAgLTMxNiw2ICszMjEsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW5saW5lIGdmcF90CitpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VfZ2ZwX21hc2sgKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoreworCXJldHVybiBtYXBwaW5nX2dmcF9tYXNrKG9iai0+ZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpOTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2VfZ2ZwX21hc2sgKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLCBnZnBfdCBnZnApCit7CisJbWFwcGluZ19zZXRfZ2ZwX21hc2sob2JqLT5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcsIGdmcCk7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXNfb3JfZXZpY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit7CisJaW50IHJldDsKKworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXMob2JqKTsKKworCS8qIElmIHdlJ3ZlIGluc3VmZmljaWVudCBtZW1vcnkgdG8gbWFwIGluIHRoZSBwYWdlcywgYXR0ZW1wdAorCSAqIHRvIG1ha2Ugc29tZSBzcGFjZSBieSB0aHJvd2luZyBvdXQgc29tZSBvbGQgYnVmZmVycy4KKwkgKi8KKwlpZiAocmV0ID09IC1FTk9NRU0pIHsKKwkJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCQlnZnBfdCBnZnA7CisKKwkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldiwgb2JqLT5zaXplKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZ2ZwID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlX2dmcF9tYXNrKG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9zZXRfcGFnZV9nZnBfbWFzayhvYmosIGdmcCAmIH5fX0dGUF9OT1JFVFJZKTsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmopOworCQlpOTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2VfZ2ZwX21hc2sgKG9iaiwgZ2ZwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIFRoaXMgaXMgdGhlIGZhbGxiYWNrIHNobWVtIHByZWFkIHBhdGgsIHdoaWNoIGFsbG9jYXRlcyB0ZW1wb3Jhcnkgc3RvcmFnZQogICogaW4ga2VybmVsIHNwYWNlIHRvIGNvcHlfdG9fdXNlciBpbnRvIG91dHNpZGUgb2YgdGhlIHN0cnVjdF9tdXRleCwgc28gd2UKQEAgLTM2Nyw4ICs0MTEsOCBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmopOwotCWlmIChyZXQgIT0gMCkKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzX29yX2V2aWN0KG9iaik7CisJaWYgKHJldCkKIAkJZ290byBmYWlsX3VubG9jazsKIAogCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfY3B1X3JlYWRfZG9tYWluX3JhbmdlKG9iaiwgYXJncy0+b2Zmc2V0LApAQCAtODQyLDggKzg4Niw4IEBACiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzKG9iaik7Ci0JaWYgKHJldCAhPSAwKQorCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXNfb3JfZXZpY3Qob2JqKTsKKwlpZiAocmV0KQogCQlnb3RvIGZhaWxfdW5sb2NrOwogCiAJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKG9iaiwgMSk7CkBAIC0xMTU1LDI4ICsxMTk5LDIyIEBACiAJLyogTm93IGJpbmQgaXQgaW50byB0aGUgR1RUIGlmIG5lZWRlZCAqLwogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAoIW9ial9wcml2LT5ndHRfc3BhY2UpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KG9iaiwgb2JqX3ByaXYtPmd0dF9hbGlnbm1lbnQpOwotCQlpZiAocmV0KSB7Ci0JCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7Ci0JCX0KLQotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB3cml0ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKLQkJfQorCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5sb2NrOwogCiAJCWxpc3RfYWRkX3RhaWwoJm9ial9wcml2LT5saXN0LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOworCisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHdyaXRlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5sb2NrOwogCX0KIAogCS8qIE5lZWQgYSBuZXcgZmVuY2UgcmVnaXN0ZXI/ICovCiAJaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7CiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKG9iaik7Ci0JCWlmIChyZXQpIHsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKLQkJfQorCQlpZiAocmV0KQorCQkJZ290byB1bmxvY2s7CiAJfQogCiAJcGZuID0gKChkZXYtPmFncC0+YmFzZSArIG9ial9wcml2LT5ndHRfb2Zmc2V0KSA+PiBQQUdFX1NISUZUKSArCkBAIC0xMTg0LDE4ICsxMjIyLDE4IEBACiAKIAkvKiBGaW5hbGx5LCByZW1hcCBpdCB1c2luZyB0aGUgbmV3IEdUVCBvZmZzZXQgKi8KIAlyZXQgPSB2bV9pbnNlcnRfcGZuKHZtYSwgKHVuc2lnbmVkIGxvbmcpdm1mLT52aXJ0dWFsX2FkZHJlc3MsIHBmbik7Ci0KK3VubG9jazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCWNhc2UgLUVSRVNUQVJUU1lTOgorCQlyZXR1cm4gVk1fRkFVTFRfTk9QQUdFOwogCWNhc2UgLUVOT01FTToKIAljYXNlIC1FQUdBSU46CiAJCXJldHVybiBWTV9GQVVMVF9PT007Ci0JY2FzZSAtRUZBVUxUOgotCWNhc2UgLUVJTlZBTDoKLQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKIAlkZWZhdWx0OgotCQlyZXR1cm4gVk1fRkFVTFRfTk9QQUdFOworCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwogCX0KIH0KIApAQCAtMTM4OCw2ICsxNDI2LDE0IEBACiAKIAlvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CiAKKwlpZiAob2JqX3ByaXYtPm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEKSB7CisJCURSTV9FUlJPUigiQXR0ZW1wdGluZyB0byBtbWFwIGEgcHVyZ2VhYmxlIGJ1ZmZlclxuIik7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwogCWlmICghb2JqX3ByaXYtPm1tYXBfb2Zmc2V0KSB7CiAJCXJldCA9IGk5MTVfZ2VtX2NyZWF0ZV9tbWFwX29mZnNldChvYmopOwogCQlpZiAocmV0KSB7CkBAIC0xMzk5LDIyICsxNDQ1LDEyIEBACiAKIAlhcmdzLT5vZmZzZXQgPSBvYmpfcHJpdi0+bW1hcF9vZmZzZXQ7CiAKLQlvYmpfcHJpdi0+Z3R0X2FsaWdubWVudCA9IGk5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KG9iaik7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlIGFsaWdubWVudCBpcyBjb3JyZWN0IGZvciBmZW5jZSByZWdzIGV0YyAqLwotCWlmIChvYmpfcHJpdi0+YWdwX21lbSAmJgotCSAgICAob2JqX3ByaXYtPmd0dF9vZmZzZXQgJiAob2JqX3ByaXYtPmd0dF9hbGlnbm1lbnQgLSAxKSkpIHsKLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCS8qCiAJICogUHVsbCBpdCBpbnRvIHRoZSBHVFQgc28gdGhhdCB3ZSBoYXZlIGEgcGFnZSBsaXN0IChtYWtlcyB0aGUKIAkgKiBpbml0aWFsIGZhdWx0IGZhc3RlciBhbmQgYW55IHN1YnNlcXVlbnQgZmx1c2hpbmcgcG9zc2libGUpLgogCSAqLwogCWlmICghb2JqX3ByaXYtPmFncF9tZW0pIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KG9iaiwgb2JqX3ByaXYtPmd0dF9hbGlnbm1lbnQpOworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCAwKTsKIAkJaWYgKHJldCkgewogCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKIAkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtMTQzNyw2ICsxNDczLDcgQEAKIAlpbnQgaTsKIAogCUJVR19PTihvYmpfcHJpdi0+cGFnZXNfcmVmY291bnQgPT0gMCk7CisJQlVHX09OKG9ial9wcml2LT5tYWR2ID09IF9fSTkxNV9NQURWX1BVUkdFRCk7CiAKIAlpZiAoLS1vYmpfcHJpdi0+cGFnZXNfcmVmY291bnQgIT0gMCkKIAkJcmV0dXJuOwpAQCAtMTQ0NCwxMyArMTQ4MSwyMSBAQAogCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJaTkxNV9nZW1fb2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUob2JqKTsKIAotCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspCi0JCWlmIChvYmpfcHJpdi0+cGFnZXNbaV0gIT0gTlVMTCkgewotCQkJaWYgKG9ial9wcml2LT5kaXJ0eSkKLQkJCQlzZXRfcGFnZV9kaXJ0eShvYmpfcHJpdi0+cGFnZXNbaV0pOworCWlmIChvYmpfcHJpdi0+bWFkdiA9PSBJOTE1X01BRFZfRE9OVE5FRUQpCisJCW9ial9wcml2LT5kaXJ0eSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKSB7CisJCWlmIChvYmpfcHJpdi0+cGFnZXNbaV0gPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWlmIChvYmpfcHJpdi0+ZGlydHkpCisJCQlzZXRfcGFnZV9kaXJ0eShvYmpfcHJpdi0+cGFnZXNbaV0pOworCisJCWlmIChvYmpfcHJpdi0+bWFkdiA9PSBJOTE1X01BRFZfV0lMTE5FRUQpCiAJCQltYXJrX3BhZ2VfYWNjZXNzZWQob2JqX3ByaXYtPnBhZ2VzW2ldKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShvYmpfcHJpdi0+cGFnZXNbaV0pOwotCQl9CisKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKG9ial9wcml2LT5wYWdlc1tpXSk7CisJfQogCW9ial9wcml2LT5kaXJ0eSA9IDA7CiAKIAlkcm1fZnJlZV9sYXJnZShvYmpfcHJpdi0+cGFnZXMpOwpAQCAtMTQ4OSw2ICsxNTM0LDI2IEBACiAJb2JqX3ByaXYtPmxhc3RfcmVuZGVyaW5nX3NlcW5vID0gMDsKIH0KIAorLyogSW1tZWRpYXRlbHkgZGlzY2FyZCB0aGUgYmFja2luZyBzdG9yYWdlICovCitzdGF0aWMgdm9pZAoraTkxNV9nZW1fb2JqZWN0X3RydW5jYXRlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gb2JqLT5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9vcC0+dHJ1bmNhdGUpCisJCWlub2RlLT5pX29wLT50cnVuY2F0ZSAoaW5vZGUpOworCisJb2JqX3ByaXYtPm1hZHYgPSBfX0k5MTVfTUFEVl9QVVJHRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdikKK3sKKwlyZXR1cm4gb2JqX3ByaXYtPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEOworfQorCiBzdGF0aWMgdm9pZAogaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCiB7CkBAIC0xNTc3LDE1ICsxNjQyLDI0IEBACiAKIAkJCWlmICgob2JqLT53cml0ZV9kb21haW4gJiBmbHVzaF9kb21haW5zKSA9PQogCQkJICAgIG9iai0+d3JpdGVfZG9tYWluKSB7CisJCQkJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOworCiAJCQkJb2JqLT53cml0ZV9kb21haW4gPSAwOwogCQkJCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShvYmosIHNlcW5vKTsKKworCQkJCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKKwkJCQkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAorCQkJCQkJCQkgICAgb2xkX3dyaXRlX2RvbWFpbik7CiAJCQl9CiAJCX0KIAogCX0KIAotCWlmICh3YXNfZW1wdHkgJiYgIWRldl9wcml2LT5tbS5zdXNwZW5kZWQpCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+bW0ucmV0aXJlX3dvcmssIEhaKTsKKwlpZiAoIWRldl9wcml2LT5tbS5zdXNwZW5kZWQpIHsKKwkJbW9kX3RpbWVyKCZkZXZfcHJpdi0+aGFuZ2NoZWNrX3RpbWVyLCBqaWZmaWVzICsgRFJNX0k5MTVfSEFOR0NIRUNLX1BFUklPRCk7CisJCWlmICh3YXNfZW1wdHkpCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPm1tLnJldGlyZV93b3JrLCBIWik7CisJfQogCXJldHVybiBzZXFubzsKIH0KIApAQCAtMTYyMyw2ICsxNjk3LDggQEAKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAorCXRyYWNlX2k5MTVfZ2VtX3JlcXVlc3RfcmV0aXJlKGRldiwgcmVxdWVzdC0+c2Vxbm8pOworCiAJLyogTW92ZSBhbnkgYnVmZmVycyBvbiB0aGUgYWN0aXZlIGxpc3QgdGhhdCBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQKIAkgKiBieSB0aGUgcmluZ2J1ZmZlciB0byB0aGUgZmx1c2hpbmcvaW5hY3RpdmUgbGlzdHMgYXMgYXBwcm9wcmlhdGUuCiAJICovCkBAIC0xNjcxLDcgKzE3NDcsNyBAQAogLyoqCiAgKiBSZXR1cm5zIHRydWUgaWYgc2VxMSBpcyBsYXRlciB0aGFuIHNlcTIuCiAgKi8KLXN0YXRpYyBpbnQKK2Jvb2wKIGk5MTVfc2Vxbm9fcGFzc2VkKHVpbnQzMl90IHNlcTEsIHVpbnQzMl90IHNlcTIpCiB7CiAJcmV0dXJuIChpbnQzMl90KShzZXExIC0gc2VxMikgPj0gMDsKQEAgLTE2OTQsNyArMTc3MCw3IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3Qgc2Vxbm87CiAKLQlpZiAoIWRldl9wcml2LT5od19zdGF0dXNfcGFnZSkKKwlpZiAoIWRldl9wcml2LT5od19zdGF0dXNfcGFnZSB8fCBsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0ucmVxdWVzdF9saXN0KSkKIAkJcmV0dXJuOwogCiAJc2Vxbm8gPSBpOTE1X2dldF9nZW1fc2Vxbm8oZGV2KTsKQEAgLTE3MDksNyArMTc4NSw3IEBACiAJCXJldGlyaW5nX3NlcW5vID0gcmVxdWVzdC0+c2Vxbm87CiAKIAkJaWYgKGk5MTVfc2Vxbm9fcGFzc2VkKHNlcW5vLCByZXRpcmluZ19zZXFubykgfHwKLQkJICAgIGRldl9wcml2LT5tbS53ZWRnZWQpIHsKKwkJICAgIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSkgewogCQkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAogCQkJbGlzdF9kZWwoJnJlcXVlc3QtPmxpc3QpOwpAQCAtMTcxOCw2ICsxNzk0LDEyIEBACiAJCX0gZWxzZQogCQkJYnJlYWs7CiAJfQorCisJaWYgKHVubGlrZWx5IChkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vICYmCisJCSAgICAgIGk5MTVfc2Vxbm9fcGFzc2VkKGRldl9wcml2LT50cmFjZV9pcnFfc2Vxbm8sIHNlcW5vKSkpIHsKKwkJaTkxNV91c2VyX2lycV9wdXQoZGV2KTsKKwkJZGV2X3ByaXYtPnRyYWNlX2lycV9zZXFubyA9IDA7CisJfQogfQogCiB2b2lkCkBAIC0xNzUxLDYgKzE4MzMsOSBAQAogCiAJQlVHX09OKHNlcW5vID09IDApOwogCisJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSkKKwkJcmV0dXJuIC1FSU87CisKIAlpZiAoIWk5MTVfc2Vxbm9fcGFzc2VkKGk5MTVfZ2V0X2dlbV9zZXFubyhkZXYpLCBzZXFubykpIHsKIAkJaWYgKElTX0lHRE5HKGRldikpCiAJCQlpZXIgPSBJOTE1X1JFQUQoREVJRVIpIHwgSTkxNV9SRUFEKEdUSUVSKTsKQEAgLTE3NjMsMTYgKzE4NDgsMjAgQEAKIAkJCWk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkZXYpOwogCQl9CiAKKwkJdHJhY2VfaTkxNV9nZW1fcmVxdWVzdF93YWl0X2JlZ2luKGRldiwgc2Vxbm8pOworCiAJCWRldl9wcml2LT5tbS53YWl0aW5nX2dlbV9zZXFubyA9IHNlcW5vOwogCQlpOTE1X3VzZXJfaXJxX2dldChkZXYpOwogCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2X3ByaXYtPmlycV9xdWV1ZSwKIAkJCQkJICAgICAgIGk5MTVfc2Vxbm9fcGFzc2VkKGk5MTVfZ2V0X2dlbV9zZXFubyhkZXYpLAogCQkJCQkJCQkgc2Vxbm8pIHx8Ci0JCQkJCSAgICAgICBkZXZfcHJpdi0+bW0ud2VkZ2VkKTsKKwkJCQkJICAgICAgIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSk7CiAJCWk5MTVfdXNlcl9pcnFfcHV0KGRldik7CiAJCWRldl9wcml2LT5tbS53YWl0aW5nX2dlbV9zZXFubyA9IDA7CisKKwkJdHJhY2VfaTkxNV9nZW1fcmVxdWVzdF93YWl0X2VuZChkZXYsIHNlcW5vKTsKIAl9Ci0JaWYgKGRldl9wcml2LT5tbS53ZWRnZWQpCisJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSkKIAkJcmV0ID0gLUVJTzsKIAogCWlmIChyZXQgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKQEAgLTE4MDMsNiArMTg5Miw4IEBACiAJRFJNX0lORk8oIiVzOiBpbnZhbGlkYXRlICUwOHggZmx1c2ggJTA4eFxuIiwgX19mdW5jX18sCiAJCSAgaW52YWxpZGF0ZV9kb21haW5zLCBmbHVzaF9kb21haW5zKTsKICNlbmRpZgorCXRyYWNlX2k5MTVfZ2VtX3JlcXVlc3RfZmx1c2goZGV2LCBkZXZfcHJpdi0+bW0ubmV4dF9nZW1fc2Vxbm8sCisJCQkJICAgICBpbnZhbGlkYXRlX2RvbWFpbnMsIGZsdXNoX2RvbWFpbnMpOwogCiAJaWYgKGZsdXNoX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKQogCQlkcm1fYWdwX2NoaXBzZXRfZmx1c2goZGV2KTsKQEAgLTE5MTUsNiArMjAwNiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBibG93IGF3YXkgbWFwcGluZ3MgaWYgbWFwcGVkIHRocm91Z2ggR1RUICovCisJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9iaik7CisKKwlpZiAob2JqX3ByaXYtPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKQorCQlpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcob2JqKTsKKwogCS8qIE1vdmUgdGhlIG9iamVjdCB0byB0aGUgQ1BVIGRvbWFpbiB0byBlbnN1cmUgdGhhdAogCSAqIGFueSBwb3NzaWJsZSBDUFUgd3JpdGVzIHdoaWxlIGl0J3Mgbm90IGluIHRoZSBHVFQKIAkgKiBhcmUgZmx1c2hlZCB3aGVuIHdlIGdvIHRvIHJlbWFwIGl0LiBUaGlzIHdpbGwKQEAgLTE5MjgsMjEgKzIwMjUsMTYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlCVUdfT04ob2JqX3ByaXYtPmFjdGl2ZSk7CisKIAlpZiAob2JqX3ByaXYtPmFncF9tZW0gIT0gTlVMTCkgewogCQlkcm1fdW5iaW5kX2FncChvYmpfcHJpdi0+YWdwX21lbSk7CiAJCWRybV9mcmVlX2FncChvYmpfcHJpdi0+YWdwX21lbSwgb2JqLT5zaXplIC8gUEFHRV9TSVpFKTsKIAkJb2JqX3ByaXYtPmFncF9tZW0gPSBOVUxMOwogCX0KIAotCUJVR19PTihvYmpfcHJpdi0+YWN0aXZlKTsKLQotCS8qIGJsb3cgYXdheSBtYXBwaW5ncyBpZiBtYXBwZWQgdGhyb3VnaCBHVFQgKi8KLQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKLQotCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpCi0JCWk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhvYmopOwotCiAJaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOworCUJVR19PTihvYmpfcHJpdi0+cGFnZXNfcmVmY291bnQpOwogCiAJaWYgKG9ial9wcml2LT5ndHRfc3BhY2UpIHsKIAkJYXRvbWljX2RlYygmZGV2LT5ndHRfY291bnQpOwpAQCAtMTk1Niw0MCArMjA0OCwxMTMgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJm9ial9wcml2LT5saXN0KSkKIAkJbGlzdF9kZWxfaW5pdCgmb2JqX3ByaXYtPmxpc3QpOwogCisJaWYgKGk5MTVfZ2VtX29iamVjdF9pc19wdXJnZWFibGUob2JqX3ByaXYpKQorCQlpOTE1X2dlbV9vYmplY3RfdHJ1bmNhdGUob2JqKTsKKworCXRyYWNlX2k5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoKK2k5MTVfZ2VtX2ZpbmRfaW5hY3RpdmVfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBtaW5fc2l6ZSkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpiZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmZpcnN0ID0gTlVMTDsKKworCS8qIFRyeSB0byBmaW5kIHRoZSBzbWFsbGVzdCBjbGVhbiBvYmplY3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSBvYmpfcHJpdi0+b2JqOworCQlpZiAob2JqLT5zaXplID49IG1pbl9zaXplKSB7CisJCQlpZiAoKCFvYmpfcHJpdi0+ZGlydHkgfHwKKwkJCSAgICAgaTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShvYmpfcHJpdikpICYmCisJCQkgICAgKCFiZXN0IHx8IG9iai0+c2l6ZSA8IGJlc3QtPnNpemUpKSB7CisJCQkJYmVzdCA9IG9iajsKKwkJCQlpZiAoYmVzdC0+c2l6ZSA9PSBtaW5fc2l6ZSkKKwkJCQkJcmV0dXJuIGJlc3Q7CisJCQl9CisJCQlpZiAoIWZpcnN0KQorCQkJICAgIGZpcnN0ID0gb2JqOworCQl9CisJfQorCisJcmV0dXJuIGJlc3QgPyBiZXN0IDogZmlyc3Q7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBzZXFubzsKKwlpbnQgcmV0OworCWJvb2wgbGlzdHNfZW1wdHk7CisKKwlzcGluX2xvY2soJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdF9sb2NrKTsKKwlsaXN0c19lbXB0eSA9IChsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCkgJiYKKwkJICAgICAgIGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSAmJgorCQkgICAgICAgbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KSk7CisJc3Bpbl91bmxvY2soJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdF9sb2NrKTsKKworCWlmIChsaXN0c19lbXB0eSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKiBGbHVzaCBldmVyeXRoaW5nIChvbiB0byB0aGUgaW5hY3RpdmUgbGlzdHMpIGFuZCBldmljdCAqLworCWk5MTVfZ2VtX2ZsdXNoKGRldiwgSTkxNV9HRU1fR1BVX0RPTUFJTlMsIEk5MTVfR0VNX0dQVV9ET01BSU5TKTsKKwlzZXFubyA9IGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCBJOTE1X0dFTV9HUFVfRE9NQUlOUyk7CisJaWYgKHNlcW5vID09IDApCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gaTkxNV93YWl0X3JlcXVlc3QoZGV2LCBzZXFubyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGk5MTVfZ2VtX2V2aWN0X2Zyb21faW5hY3RpdmVfbGlzdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2soJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdF9sb2NrKTsKKwlsaXN0c19lbXB0eSA9IChsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCkgJiYKKwkJICAgICAgIGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSAmJgorCQkgICAgICAgbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KSk7CisJc3Bpbl91bmxvY2soJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdF9sb2NrKTsKKwlCVUdfT04oIWxpc3RzX2VtcHR5KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK2k5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbWluX3NpemUpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAlmb3IgKDs7KSB7CisJCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYpOworCiAJCS8qIElmIHRoZXJlJ3MgYW4gaW5hY3RpdmUgYnVmZmVyIGF2YWlsYWJsZSBub3csIGdyYWIgaXQKIAkJICogYW5kIGJlIGRvbmUuCiAJCSAqLwotCQlpZiAoIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSkgewotCQkJb2JqX3ByaXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKLQkJCQkJCSAgICBsaXN0KTsKLQkJCW9iaiA9IG9ial9wcml2LT5vYmo7Ci0JCQlCVUdfT04ob2JqX3ByaXYtPnBpbl9jb3VudCAhPSAwKTsKKwkJb2JqID0gaTkxNV9nZW1fZmluZF9pbmFjdGl2ZV9vYmplY3QoZGV2LCBtaW5fc2l6ZSk7CisJCWlmIChvYmopIHsKKwkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwogI2lmIFdBVENIX0xSVQogCQkJRFJNX0lORk8oIiVzOiBldmljdGluZyAlcFxuIiwgX19mdW5jX18sIG9iaik7CiAjZW5kaWYKKwkJCW9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwkJCUJVR19PTihvYmpfcHJpdi0+cGluX2NvdW50ICE9IDApOwogCQkJQlVHX09OKG9ial9wcml2LT5hY3RpdmUpOwogCiAJCQkvKiBXYWl0IG9uIHRoZSByZW5kZXJpbmcgYW5kIHVuYmluZCB0aGUgYnVmZmVyLiAqLwotCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOwogCQl9CiAKIAkJLyogSWYgd2UgZGlkbid0IGdldCBhbnl0aGluZywgYnV0IHRoZSByaW5nIGlzIHN0aWxsIHByb2Nlc3NpbmcKLQkJICogdGhpbmdzLCB3YWl0IGZvciBvbmUgb2YgdGhvc2UgdGhpbmdzIHRvIGZpbmlzaCBhbmQgaG9wZWZ1bGx5Ci0JCSAqIGxlYXZlIHVzIGEgYnVmZmVyIHRvIGV2aWN0LgorCQkgKiB0aGluZ3MsIHdhaXQgZm9yIHRoZSBuZXh0IHRvIGZpbmlzaCBhbmQgaG9wZWZ1bGx5IGxlYXZlIHVzCisJCSAqIGEgYnVmZmVyIHRvIGV2aWN0LgogCQkgKi8KIAkJaWYgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0ucmVxdWVzdF9saXN0KSkgewogCQkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0OwpAQCAtMjAwMCwxNiArMjE2NSw5IEBACiAKIAkJCXJldCA9IGk5MTVfd2FpdF9yZXF1ZXN0KGRldiwgcmVxdWVzdC0+c2Vxbm8pOwogCQkJaWYgKHJldCkKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gcmV0OwogCi0JCQkvKiBpZiB3YWl0aW5nIGNhdXNlZCBhbiBvYmplY3QgdG8gYmVjb21lIGluYWN0aXZlLAotCQkJICogdGhlbiBsb29wIGFyb3VuZCBhbmQgd2FpdCBmb3IgaXQuIE90aGVyd2lzZSwgd2UKLQkJCSAqIGFzc3VtZSB0aGF0IHdhaXRpbmcgZnJlZWQgYW5kIHVuYm91bmQgc29tZXRoaW5nLAotCQkJICogc28gdGhlcmUgc2hvdWxkIG5vdyBiZSBzb21lIHNwYWNlIGluIHRoZSBHVFQKLQkJCSAqLwotCQkJaWYgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCkpCi0JCQkJY29udGludWU7Ci0JCQlicmVhazsKKwkJCWNvbnRpbnVlOwogCQl9CiAKIAkJLyogSWYgd2UgZGlkbid0IGhhdmUgYW55dGhpbmcgb24gdGhlIHJlcXVlc3QgbGlzdCBidXQgdGhlcmUKQEAgLTIwMTgsNDYgKzIxNzYsNDQgQEAKIAkJICogd2lsbCBnZXQgbW92ZWQgdG8gaW5hY3RpdmUuCiAJCSAqLwogCQlpZiAoIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSkgewotCQkJb2JqX3ByaXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCwKLQkJCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKLQkJCQkJCSAgICBsaXN0KTsKLQkJCW9iaiA9IG9ial9wcml2LT5vYmo7CisJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CiAKLQkJCWk5MTVfZ2VtX2ZsdXNoKGRldiwKLQkJCQkgICAgICAgb2JqLT53cml0ZV9kb21haW4sCi0JCQkJICAgICAgIG9iai0+d3JpdGVfZG9tYWluKTsKLQkJCWk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCBvYmotPndyaXRlX2RvbWFpbik7CisJCQkvKiBGaW5kIGFuIG9iamVjdCB0aGF0IHdlIGNhbiBpbW1lZGlhdGVseSByZXVzZSAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmpfcHJpdiwgJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0LCBsaXN0KSB7CisJCQkJb2JqID0gb2JqX3ByaXYtPm9iajsKKwkJCQlpZiAob2JqLT5zaXplID49IG1pbl9zaXplKQorCQkJCQlicmVhazsKIAotCQkJb2JqID0gTlVMTDsKLQkJCWNvbnRpbnVlOworCQkJCW9iaiA9IE5VTEw7CisJCQl9CisKKwkJCWlmIChvYmogIT0gTlVMTCkgeworCQkJCXVpbnQzMl90IHNlcW5vOworCisJCQkJaTkxNV9nZW1fZmx1c2goZGV2LAorCQkJCQkgICAgICAgb2JqLT53cml0ZV9kb21haW4sCisJCQkJCSAgICAgICBvYmotPndyaXRlX2RvbWFpbik7CisJCQkJc2Vxbm8gPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgb2JqLT53cml0ZV9kb21haW4pOworCQkJCWlmIChzZXFubyA9PSAwKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJCXJldCA9IGk5MTVfd2FpdF9yZXF1ZXN0KGRldiwgc2Vxbm8pOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJfQogCi0JCURSTV9FUlJPUigiaW5hY3RpdmUgZW1wdHkgJWQgcmVxdWVzdCBlbXB0eSAlZCAiCi0JCQkgICJmbHVzaGluZyBlbXB0eSAlZFxuIiwKLQkJCSAgbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpLAotCQkJICBsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0ucmVxdWVzdF9saXN0KSwKLQkJCSAgbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpKTsKLQkJLyogSWYgd2UgZGlkbid0IGRvIGFueSBvZiB0aGUgYWJvdmUsIHRoZXJlJ3Mgbm90aGluZyB0byBiZSBkb25lCi0JCSAqIGFuZCB3ZSBqdXN0IGNhbid0IGZpdCBpdCBpbi4KKwkJLyogSWYgd2UgZGlkbid0IGRvIGFueSBvZiB0aGUgYWJvdmUsIHRoZXJlJ3Mgbm8gc2luZ2xlIGJ1ZmZlcgorCQkgKiBsYXJnZSBlbm91Z2ggdG8gc3dhcCBvdXQgZm9yIHRoZSBuZXcgb25lLCBzbyBqdXN0IGV2aWN0CisJCSAqIGV2ZXJ5dGhpbmcgYW5kIHN0YXJ0IGFnYWluLiAoVGhpcyBzaG91bGQgYmUgcmFyZS4pCiAJCSAqLwotCQlyZXR1cm4gLUVOT1NQQzsKKwkJaWYgKCFsaXN0X2VtcHR5ICgmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpKQorCQkJcmV0dXJuIGk5MTVfZ2VtX2V2aWN0X2Zyb21faW5hY3RpdmVfbGlzdChkZXYpOworCQllbHNlCisJCQlyZXR1cm4gaTkxNV9nZW1fZXZpY3RfZXZlcnl0aGluZyhkZXYpOwogCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldDsKLQotCWZvciAoOzspIHsKLQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldik7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCWJyZWFrOwotCX0KLQlpZiAocmV0ID09IC1FTk9TUEMpCi0JCXJldHVybiAwOwotCXJldHVybiByZXQ7CiB9CiAKIGludApAQCAtMjA4MCw3ICsyMjM2LDYgQEAKIAlCVUdfT04ob2JqX3ByaXYtPnBhZ2VzICE9IE5VTEwpOwogCW9ial9wcml2LT5wYWdlcyA9IGRybV9jYWxsb2NfbGFyZ2UocGFnZV9jb3VudCwgc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKIAlpZiAob2JqX3ByaXYtPnBhZ2VzID09IE5VTEwpIHsKLQkJRFJNX0VSUk9SKCJGYWxlZCB0byBhbGxvY2F0ZSBwYWdlIGxpc3RcbiIpOwogCQlvYmpfcHJpdi0+cGFnZXNfcmVmY291bnQtLTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjA5MSw3ICsyMjQ2LDYgQEAKIAkJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIGksIE5VTEwpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOwotCQkJRFJNX0VSUk9SKCJyZWFkX21hcHBpbmdfcGFnZSBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQkJaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMjMyOCw2ICsyNDgyLDggQEAKIAllbHNlCiAJCWk4MzBfd3JpdGVfZmVuY2VfcmVnKHJlZyk7CiAKKwl0cmFjZV9pOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlKG9iaiwgaSwgb2JqX3ByaXYtPnRpbGluZ19tb2RlKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNDEwLDEwICsyNTY2LDE3IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmZyZWVfc3BhY2U7Ci0JaW50IHBhZ2VfY291bnQsIHJldDsKKwlib29sIHJldHJ5X2FsbG9jID0gZmFsc2U7CisJaW50IHJldDsKIAogCWlmIChkZXZfcHJpdi0+bW0uc3VzcGVuZGVkKQogCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKG9ial9wcml2LT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgeworCQlEUk1fRVJST1IoIkF0dGVtcHRpbmcgdG8gYmluZCBhIHB1cmdlYWJsZSBvYmplY3RcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoYWxpZ25tZW50ID09IDApCiAJCWFsaWdubWVudCA9IGk5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KG9iaik7CiAJaWYgKGFsaWdubWVudCAmIChpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChvYmopIC0gMSkpIHsKQEAgLTI0MzMsMzAgKzI1OTYsMTYgQEAKIAkJfQogCX0KIAlpZiAob2JqX3ByaXYtPmd0dF9zcGFjZSA9PSBOVUxMKSB7Ci0JCWJvb2wgbGlzdHNfZW1wdHk7Ci0KIAkJLyogSWYgdGhlIGd0dCBpcyBlbXB0eSBhbmQgd2UncmUgc3RpbGwgaGF2aW5nIHRyb3VibGUKIAkJICogZml0dGluZyBvdXIgb2JqZWN0IGluLCB3ZSdyZSBvdXQgb2YgbWVtb3J5LgogCQkgKi8KICNpZiBXQVRDSF9MUlUKIAkJRFJNX0lORk8oIiVzOiBHVFQgZnVsbCwgZXZpY3Rpbmcgc29tZXRoaW5nXG4iLCBfX2Z1bmNfXyk7CiAjZW5kaWYKLQkJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3RfbG9jayk7Ci0JCWxpc3RzX2VtcHR5ID0gKGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSAmJgotCQkJICAgICAgIGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSAmJgotCQkJICAgICAgIGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCkpOwotCQlzcGluX3VubG9jaygmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0X2xvY2spOwotCQlpZiAobGlzdHNfZW1wdHkpIHsKLQkJCURSTV9FUlJPUigiR1RUIGZ1bGwsIGJ1dCBMUlUgbGlzdCBlbXB0eVxuIik7Ci0JCQlyZXR1cm4gLUVOT1NQQzsKLQkJfQotCi0JCXJldCA9IGk5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhkZXYpOwotCQlpZiAocmV0ICE9IDApIHsKLQkJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQotCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGV2aWN0IGEgYnVmZmVyICVkXG4iLCByZXQpOworCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoZGV2LCBvYmotPnNpemUpOworCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQkJfQorCiAJCWdvdG8gc2VhcmNoX2ZyZWU7CiAJfQogCkBAIC0yNDY0LDI3ICsyNjEzLDU2IEBACiAJRFJNX0lORk8oIkJpbmRpbmcgb2JqZWN0IG9mIHNpemUgJXpkIGF0IDB4JTA4eFxuIiwKIAkJIG9iai0+c2l6ZSwgb2JqX3ByaXYtPmd0dF9vZmZzZXQpOwogI2VuZGlmCisJaWYgKHJldHJ5X2FsbG9jKSB7CisJCWk5MTVfZ2VtX29iamVjdF9zZXRfcGFnZV9nZnBfbWFzayAob2JqLAorCQkJCQkJICAgaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlX2dmcF9tYXNrIChvYmopICYgfl9fR0ZQX05PUkVUUlkpOworCX0KIAlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzKG9iaik7CisJaWYgKHJldHJ5X2FsbG9jKSB7CisJCWk5MTVfZ2VtX29iamVjdF9zZXRfcGFnZV9nZnBfbWFzayAob2JqLAorCQkJCQkJICAgaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlX2dmcF9tYXNrIChvYmopIHwgX19HRlBfTk9SRVRSWSk7CisJfQogCWlmIChyZXQpIHsKIAkJZHJtX21tX3B1dF9ibG9jayhvYmpfcHJpdi0+Z3R0X3NwYWNlKTsKIAkJb2JqX3ByaXYtPmd0dF9zcGFjZSA9IE5VTEw7CisKKwkJaWYgKHJldCA9PSAtRU5PTUVNKSB7CisJCQkvKiBmaXJzdCB0cnkgdG8gY2xlYXIgdXAgc29tZSBzcGFjZSBmcm9tIHRoZSBHVFQgKi8KKwkJCXJldCA9IGk5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhkZXYsIG9iai0+c2l6ZSk7CisJCQlpZiAocmV0KSB7CisJCQkJLyogbm93IHRyeSB0byBzaHJpbmsgZXZlcnlvbmUgZWxzZSAqLworCQkJCWlmICghIHJldHJ5X2FsbG9jKSB7CisJCQkJICAgIHJldHJ5X2FsbG9jID0gdHJ1ZTsKKwkJCQkgICAgZ290byBzZWFyY2hfZnJlZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlnb3RvIHNlYXJjaF9mcmVlOworCQl9CisKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlwYWdlX2NvdW50ID0gb2JqLT5zaXplIC8gUEFHRV9TSVpFOwogCS8qIENyZWF0ZSBhbiBBR1AgbWVtb3J5IHN0cnVjdHVyZSBwb2ludGluZyBhdCBvdXIgcGFnZXMsIGFuZCBiaW5kIGl0CiAJICogaW50byB0aGUgR1RULgogCSAqLwogCW9ial9wcml2LT5hZ3BfbWVtID0gZHJtX2FncF9iaW5kX3BhZ2VzKGRldiwKIAkJCQkJICAgICAgIG9ial9wcml2LT5wYWdlcywKLQkJCQkJICAgICAgIHBhZ2VfY291bnQsCisJCQkJCSAgICAgICBvYmotPnNpemUgPj4gUEFHRV9TSElGVCwKIAkJCQkJICAgICAgIG9ial9wcml2LT5ndHRfb2Zmc2V0LAogCQkJCQkgICAgICAgb2JqX3ByaXYtPmFncF90eXBlKTsKIAlpZiAob2JqX3ByaXYtPmFncF9tZW0gPT0gTlVMTCkgewogCQlpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKG9iaik7CiAJCWRybV9tbV9wdXRfYmxvY2sob2JqX3ByaXYtPmd0dF9zcGFjZSk7CiAJCW9ial9wcml2LT5ndHRfc3BhY2UgPSBOVUxMOwotCQlyZXR1cm4gLUVOT01FTTsKKworCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoZGV2LCBvYmotPnNpemUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlnb3RvIHNlYXJjaF9mcmVlOwogCX0KIAlhdG9taWNfaW5jKCZkZXYtPmd0dF9jb3VudCk7CiAJYXRvbWljX2FkZChvYmotPnNpemUsICZkZXYtPmd0dF9tZW1vcnkpOwpAQCAtMjQ5Niw2ICsyNjc0LDggQEAKIAlCVUdfT04ob2JqLT5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9HUFVfRE9NQUlOUyk7CiAJQlVHX09OKG9iai0+d3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpOwogCisJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2JpbmQob2JqLCBvYmpfcHJpdi0+Z3R0X29mZnNldCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjUxMSwxNSArMjY5MSw3IEBACiAJaWYgKG9ial9wcml2LT5wYWdlcyA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQkvKiBYWFg6IFRoZSA4NjUgaW4gcGFydGljdWxhciBhcHBlYXJzIHRvIGJlIHdlaXJkIGluIGhvdyBpdCBoYW5kbGVzCi0JICogY2FjaGUgZmx1c2hpbmcuICBXZSBoYXZlbid0IGZpZ3VyZWQgaXQgb3V0LCBidXQgdGhlCi0JICogY2xmbHVzaCthZ3BfY2hpcHNldF9mbHVzaCBkb2Vzbid0IGFwcGVhciB0byBzdWNjZXNzZnVsbHkgZ2V0IHRoZQotCSAqIGRhdGEgdmlzaWJsZSB0byB0aGUgUEdVLCB3aGlsZSB3YmludmQgKyBhZ3BfY2hpcHNldF9mbHVzaCBkb2VzLgotCSAqLwotCWlmIChJU19JODY1RyhvYmotPmRldikpIHsKLQkJd2JpbnZkKCk7Ci0JCXJldHVybjsKLQl9CisJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NsZmx1c2gob2JqKTsKIAogCWRybV9jbGZsdXNoX3BhZ2VzKG9ial9wcml2LT5wYWdlcywgb2JqLT5zaXplIC8gUEFHRV9TSVpFKTsKIH0KQEAgLTI1MzAsMjEgKzI3MDIsMjkgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CiAJdWludDMyX3Qgc2Vxbm87CisJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbjsKIAogCWlmICgob2JqLT53cml0ZV9kb21haW4gJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykgPT0gMCkKIAkJcmV0dXJuOwogCiAJLyogUXVldWUgdGhlIEdQVSB3cml0ZSBjYWNoZSBmbHVzaGluZyB3ZSBuZWVkLiAqLworCW9sZF93cml0ZV9kb21haW4gPSBvYmotPndyaXRlX2RvbWFpbjsKIAlpOTE1X2dlbV9mbHVzaChkZXYsIDAsIG9iai0+d3JpdGVfZG9tYWluKTsKIAlzZXFubyA9IGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCBvYmotPndyaXRlX2RvbWFpbik7CiAJb2JqLT53cml0ZV9kb21haW4gPSAwOwogCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShvYmosIHNlcW5vKTsKKworCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKKwkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAorCQkJCQkgICAgb2xkX3dyaXRlX2RvbWFpbik7CiB9CiAKIC8qKiBGbHVzaGVzIHRoZSBHVFQgd3JpdGUgZG9tYWluIGZvciB0aGUgb2JqZWN0IGlmIGl0J3MgZGlydHkuICovCiBzdGF0aWMgdm9pZAogaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2d0dF93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCiB7CisJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbjsKKwogCWlmIChvYmotPndyaXRlX2RvbWFpbiAhPSBJOTE1X0dFTV9ET01BSU5fR1RUKQogCQlyZXR1cm47CiAKQEAgLTI1NTIsNyArMjczMiwxMiBAQAogCSAqIHRvIGl0IGltbWVkaWF0ZWx5IGdvIHRvIG1haW4gbWVtb3J5IGFzIGZhciBhcyB3ZSBrbm93LCBzbyB0aGVyZSdzCiAJICogbm8gY2hpcHNldCBmbHVzaC4gIEl0IGFsc28gZG9lc24ndCBsYW5kIGluIHJlbmRlciBjYWNoZS4KIAkgKi8KKwlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47CiAJb2JqLT53cml0ZV9kb21haW4gPSAwOworCisJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAorCQkJCQkgICAgb2JqLT5yZWFkX2RvbWFpbnMsCisJCQkJCSAgICBvbGRfd3JpdGVfZG9tYWluKTsKIH0KIAogLyoqIEZsdXNoZXMgdGhlIENQVSB3cml0ZSBkb21haW4gZm9yIHRoZSBvYmplY3QgaWYgaXQncyBkaXJ0eS4gKi8KQEAgLTI1NjAsMTMgKzI3NDUsMTkgQEAKIGk5MTVfZ2VtX29iamVjdF9mbHVzaF9jcHVfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwl1aW50MzJfdCBvbGRfd3JpdGVfZG9tYWluOwogCiAJaWYgKG9iai0+d3JpdGVfZG9tYWluICE9IEk5MTVfR0VNX0RPTUFJTl9DUFUpCiAJCXJldHVybjsKIAogCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaik7CiAJZHJtX2FncF9jaGlwc2V0X2ZsdXNoKGRldik7CisJb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwogCW9iai0+d3JpdGVfZG9tYWluID0gMDsKKworCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKKwkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAorCQkJCQkgICAgb2xkX3dyaXRlX2RvbWFpbik7CiB9CiAKIC8qKgpAQCAtMjU3OSw2ICsyNzcwLDcgQEAKIGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgaW50IHdyaXRlKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiwgb2xkX3JlYWRfZG9tYWluczsKIAlpbnQgcmV0OwogCiAJLyogTm90IHZhbGlkIHRvIGJlIGNhbGxlZCBvbiB1bmJvdW5kIG9iamVjdHMuICovCkBAIC0yNTkxLDYgKzI3ODMsOSBAQAogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAorCW9sZF93cml0ZV9kb21haW4gPSBvYmotPndyaXRlX2RvbWFpbjsKKwlvbGRfcmVhZF9kb21haW5zID0gb2JqLT5yZWFkX2RvbWFpbnM7CisKIAkvKiBJZiB3ZSdyZSB3cml0aW5nIHRocm91Z2ggdGhlIEdUVCBkb21haW4sIHRoZW4gQ1BVIGFuZCBHUFUgY2FjaGVzCiAJICogd2lsbCBuZWVkIHRvIGJlIGludmFsaWRhdGVkIGF0IG5leHQgdXNlLgogCSAqLwpAQCAtMjYwOSw2ICsyODA0LDEwIEBACiAJCW9ial9wcml2LT5kaXJ0eSA9IDE7CiAJfQogCisJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAorCQkJCQkgICAgb2xkX3JlYWRfZG9tYWlucywKKwkJCQkJICAgIG9sZF93cml0ZV9kb21haW4pOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MjEsNiArMjgyMCw3IEBACiBzdGF0aWMgaW50CiBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCB3cml0ZSkKIHsKKwl1aW50MzJfdCBvbGRfd3JpdGVfZG9tYWluLCBvbGRfcmVhZF9kb21haW5zOwogCWludCByZXQ7CiAKIAlpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOwpAQCAtMjYzNiw2ICsyODM2LDkgQEAKIAkgKi8KIAlpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2Z1bGxfY3B1X3JlYWRfZG9tYWluKG9iaik7CiAKKwlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47CisJb2xkX3JlYWRfZG9tYWlucyA9IG9iai0+cmVhZF9kb21haW5zOworCiAJLyogRmx1c2ggdGhlIENQVSBjYWNoZSBpZiBpdCdzIHN0aWxsIGludmFsaWQuICovCiAJaWYgKChvYmotPnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpID09IDApIHsKIAkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqKTsKQEAgLTI2NTYsNiArMjg1OSwxMCBAQAogCQlvYmotPndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CiAJfQogCisJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAorCQkJCQkgICAgb2xkX3JlYWRfZG9tYWlucywKKwkJCQkJICAgIG9sZF93cml0ZV9kb21haW4pOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3NzcsNiArMjk4NCw3IEBACiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QJKm9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKIAl1aW50MzJfdAkJCWludmFsaWRhdGVfZG9tYWlucyA9IDA7CiAJdWludDMyX3QJCQlmbHVzaF9kb21haW5zID0gMDsKKwl1aW50MzJfdAkJCW9sZF9yZWFkX2RvbWFpbnM7CiAKIAlCVUdfT04ob2JqLT5wZW5kaW5nX3JlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpOwogCUJVR19PTihvYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluID09IEk5MTVfR0VNX0RPTUFJTl9DUFUpOwpAQCAtMjgyMyw2ICszMDMxLDggQEAKIAkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqKTsKIAl9CiAKKwlvbGRfcmVhZF9kb21haW5zID0gb2JqLT5yZWFkX2RvbWFpbnM7CisKIAkvKiBUaGUgYWN0dWFsIG9iai0+d3JpdGVfZG9tYWluIHdpbGwgYmUgdXBkYXRlZCB3aXRoCiAJICogcGVuZGluZ193cml0ZV9kb21haW4gYWZ0ZXIgd2UgZW1pdCB0aGUgYWNjdW11bGF0ZWQgZmx1c2ggZm9yIGFsbAogCSAqIG9mIG91ciBkb21haW4gY2hhbmdlcyBpbiBleGVjYnVmZmVycyAod2hpY2ggY2xlYXJzIG9iamVjdHMnCkBAIC0yODQxLDYgKzMwNTEsMTAgQEAKIAkJIG9iai0+cmVhZF9kb21haW5zLCBvYmotPndyaXRlX2RvbWFpbiwKIAkJIGRldi0+aW52YWxpZGF0ZV9kb21haW5zLCBkZXYtPmZsdXNoX2RvbWFpbnMpOwogI2VuZGlmCisKKwl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCisJCQkJCSAgICBvbGRfcmVhZF9kb21haW5zLAorCQkJCQkgICAgb2JqLT53cml0ZV9kb21haW4pOwogfQogCiAvKioKQEAgLTI4OTMsNiArMzEwNyw3IEBACiAJCQkJCSAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJdWludDMyX3Qgb2xkX3JlYWRfZG9tYWluczsKIAlpbnQgaSwgcmV0OwogCiAJaWYgKG9mZnNldCA9PSAwICYmIHNpemUgPT0gb2JqLT5zaXplKQpAQCAtMjkzOSw4ICszMTU0LDEzIEBACiAJICovCiAJQlVHX09OKChvYmotPndyaXRlX2RvbWFpbiAmIH5JOTE1X0dFTV9ET01BSU5fQ1BVKSAhPSAwKTsKIAorCW9sZF9yZWFkX2RvbWFpbnMgPSBvYmotPnJlYWRfZG9tYWluczsKIAlvYmotPnJlYWRfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fQ1BVOwogCisJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAorCQkJCQkgICAgb2xkX3JlYWRfZG9tYWlucywKKwkJCQkJICAgIG9iai0+d3JpdGVfZG9tYWluKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yOTg0LDYgKzMyMDQsMjEgQEAKIAkJfQogCQl0YXJnZXRfb2JqX3ByaXYgPSB0YXJnZXRfb2JqLT5kcml2ZXJfcHJpdmF0ZTsKIAorI2lmIFdBVENIX1JFTE9DCisJCURSTV9JTkZPKCIlczogb2JqICVwIG9mZnNldCAlMDh4IHRhcmdldCAlZCAiCisJCQkgInJlYWQgJTA4eCB3cml0ZSAlMDh4IGd0dCAlMDh4ICIKKwkJCSAicHJlc3VtZWQgJTA4eCBkZWx0YSAlMDh4XG4iLAorCQkJIF9fZnVuY19fLAorCQkJIG9iaiwKKwkJCSAoaW50KSByZWxvYy0+b2Zmc2V0LAorCQkJIChpbnQpIHJlbG9jLT50YXJnZXRfaGFuZGxlLAorCQkJIChpbnQpIHJlbG9jLT5yZWFkX2RvbWFpbnMsCisJCQkgKGludCkgcmVsb2MtPndyaXRlX2RvbWFpbiwKKwkJCSAoaW50KSB0YXJnZXRfb2JqX3ByaXYtPmd0dF9vZmZzZXQsCisJCQkgKGludCkgcmVsb2MtPnByZXN1bWVkX29mZnNldCwKKwkJCSByZWxvYy0+ZGVsdGEpOworI2VuZGlmCisKIAkJLyogVGhlIHRhcmdldCBidWZmZXIgc2hvdWxkIGhhdmUgYXBwZWFyZWQgYmVmb3JlIHVzIGluIHRoZQogCQkgKiBleGVjX29iamVjdCBsaXN0LCBzbyBpdCBzaG91bGQgaGF2ZSBhIEdUVCBzcGFjZSBib3VuZCBieSBub3cuCiAJCSAqLwpAQCAtMjk5NSw2ICszMjMwLDQ2IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCisJCS8qIFZhbGlkYXRlIHRoYXQgdGhlIHRhcmdldCBpcyBpbiBhIHZhbGlkIHIvdyBHUFUgZG9tYWluICovCisJCWlmIChyZWxvYy0+d3JpdGVfZG9tYWluICYgSTkxNV9HRU1fRE9NQUlOX0NQVSB8fAorCQkgICAgcmVsb2MtPnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpIHsKKwkJCURSTV9FUlJPUigicmVsb2Mgd2l0aCByZWFkL3dyaXRlIENQVSBkb21haW5zOiAiCisJCQkJICAib2JqICVwIHRhcmdldCAlZCBvZmZzZXQgJWQgIgorCQkJCSAgInJlYWQgJTA4eCB3cml0ZSAlMDh4IiwKKwkJCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCisJCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAorCQkJCSAgcmVsb2MtPnJlYWRfZG9tYWlucywKKwkJCQkgIHJlbG9jLT53cml0ZV9kb21haW4pOworCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UodGFyZ2V0X29iaik7CisJCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChyZWxvYy0+d3JpdGVfZG9tYWluICYmIHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluICYmCisJCSAgICByZWxvYy0+d3JpdGVfZG9tYWluICE9IHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKSB7CisJCQlEUk1fRVJST1IoIldyaXRlIGRvbWFpbiBjb25mbGljdDogIgorCQkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkICIKKwkJCQkgICJuZXcgJTA4eCBvbGQgJTA4eFxuIiwKKwkJCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCisJCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAorCQkJCSAgcmVsb2MtPndyaXRlX2RvbWFpbiwKKwkJCQkgIHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKTsKKwkJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHRhcmdldF9vYmopOworCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXRhcmdldF9vYmotPnBlbmRpbmdfcmVhZF9kb21haW5zIHw9IHJlbG9jLT5yZWFkX2RvbWFpbnM7CisJCXRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluIHw9IHJlbG9jLT53cml0ZV9kb21haW47CisKKwkJLyogSWYgdGhlIHJlbG9jYXRpb24gYWxyZWFkeSBoYXMgdGhlIHJpZ2h0IHZhbHVlIGluIGl0LCBubworCQkgKiBtb3JlIHdvcmsgbmVlZHMgdG8gYmUgZG9uZS4KKwkJICovCisJCWlmICh0YXJnZXRfb2JqX3ByaXYtPmd0dF9vZmZzZXQgPT0gcmVsb2MtPnByZXN1bWVkX29mZnNldCkgeworCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UodGFyZ2V0X29iaik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gYWRkcmVzcyBpcyB2YWxpZC4uLiAqLwogCQlpZiAocmVsb2MtPm9mZnNldCA+IG9iai0+c2l6ZSAtIDQpIHsKIAkJCURSTV9FUlJPUigiUmVsb2NhdGlvbiBiZXlvbmQgb2JqZWN0IGJvdW5kczogIgogCQkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkIHNpemUgJWQuXG4iLApAQCAtMzAxNCw2MCArMzI4OSwxNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlpZiAocmVsb2MtPndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0RPTUFJTl9DUFUgfHwKLQkJICAgIHJlbG9jLT5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKSB7Ci0JCQlEUk1fRVJST1IoInJlbG9jIHdpdGggcmVhZC93cml0ZSBDUFUgZG9tYWluczogIgotCQkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkICIKLQkJCQkgICJyZWFkICUwOHggd3JpdGUgJTA4eCIsCisJCS8qIGFuZCBwb2ludHMgdG8gc29tZXdoZXJlIHdpdGhpbiB0aGUgdGFyZ2V0IG9iamVjdC4gKi8KKwkJaWYgKHJlbG9jLT5kZWx0YSA+PSB0YXJnZXRfb2JqLT5zaXplKSB7CisJCQlEUk1fRVJST1IoIlJlbG9jYXRpb24gYmV5b25kIHRhcmdldCBvYmplY3QgYm91bmRzOiAiCisJCQkJICAib2JqICVwIHRhcmdldCAlZCBkZWx0YSAlZCBzaXplICVkLlxuIiwKIAkJCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCi0JCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAotCQkJCSAgcmVsb2MtPnJlYWRfZG9tYWlucywKLQkJCQkgIHJlbG9jLT53cml0ZV9kb21haW4pOworCQkJCSAgKGludCkgcmVsb2MtPmRlbHRhLCAoaW50KSB0YXJnZXRfb2JqLT5zaXplKTsKIAkJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHRhcmdldF9vYmopOwogCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCWlmIChyZWxvYy0+d3JpdGVfZG9tYWluICYmIHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluICYmCi0JCSAgICByZWxvYy0+d3JpdGVfZG9tYWluICE9IHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKSB7Ci0JCQlEUk1fRVJST1IoIldyaXRlIGRvbWFpbiBjb25mbGljdDogIgotCQkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkICIKLQkJCQkgICJuZXcgJTA4eCBvbGQgJTA4eFxuIiwKLQkJCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCi0JCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAotCQkJCSAgcmVsb2MtPndyaXRlX2RvbWFpbiwKLQkJCQkgIHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKTsKLQkJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHRhcmdldF9vYmopOwotCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0jaWYgV0FUQ0hfUkVMT0MKLQkJRFJNX0lORk8oIiVzOiBvYmogJXAgb2Zmc2V0ICUwOHggdGFyZ2V0ICVkICIKLQkJCSAicmVhZCAlMDh4IHdyaXRlICUwOHggZ3R0ICUwOHggIgotCQkJICJwcmVzdW1lZCAlMDh4IGRlbHRhICUwOHhcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgb2JqLAotCQkJIChpbnQpIHJlbG9jLT5vZmZzZXQsCi0JCQkgKGludCkgcmVsb2MtPnRhcmdldF9oYW5kbGUsCi0JCQkgKGludCkgcmVsb2MtPnJlYWRfZG9tYWlucywKLQkJCSAoaW50KSByZWxvYy0+d3JpdGVfZG9tYWluLAotCQkJIChpbnQpIHRhcmdldF9vYmpfcHJpdi0+Z3R0X29mZnNldCwKLQkJCSAoaW50KSByZWxvYy0+cHJlc3VtZWRfb2Zmc2V0LAotCQkJIHJlbG9jLT5kZWx0YSk7Ci0jZW5kaWYKLQotCQl0YXJnZXRfb2JqLT5wZW5kaW5nX3JlYWRfZG9tYWlucyB8PSByZWxvYy0+cmVhZF9kb21haW5zOwotCQl0YXJnZXRfb2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbiB8PSByZWxvYy0+d3JpdGVfZG9tYWluOwotCi0JCS8qIElmIHRoZSByZWxvY2F0aW9uIGFscmVhZHkgaGFzIHRoZSByaWdodCB2YWx1ZSBpbiBpdCwgbm8KLQkJICogbW9yZSB3b3JrIG5lZWRzIHRvIGJlIGRvbmUuCi0JCSAqLwotCQlpZiAodGFyZ2V0X29ial9wcml2LT5ndHRfb2Zmc2V0ID09IHJlbG9jLT5wcmVzdW1lZF9vZmZzZXQpIHsKLQkJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHRhcmdldF9vYmopOwotCQkJY29udGludWU7Ci0JCX0KLQogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCAxKTsKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSh0YXJnZXRfb2JqKTsKQEAgLTMxMjYsNiArMzM1OCw4IEBACiAJZXhlY19zdGFydCA9ICh1aW50MzJfdCkgZXhlY19vZmZzZXQgKyBleGVjLT5iYXRjaF9zdGFydF9vZmZzZXQ7CiAJZXhlY19sZW4gPSAodWludDMyX3QpIGV4ZWMtPmJhdGNoX2xlbjsKIAorCXRyYWNlX2k5MTVfZ2VtX3JlcXVlc3Rfc3VibWl0KGRldiwgZGV2X3ByaXYtPm1tLm5leHRfZ2VtX3NlcW5vICsgMSk7CisKIAljb3VudCA9IG5ib3ggPyBuYm94IDogMTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC0zMzYzLDcgKzM1OTcsNyBAQAogCiAJaTkxNV92ZXJpZnlfaW5hY3RpdmUoZGV2LCBfX0ZJTEVfXywgX19MSU5FX18pOwogCi0JaWYgKGRldl9wcml2LT5tbS53ZWRnZWQpIHsKKwlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKSB7CiAJCURSTV9FUlJPUigiRXhlY2J1ZiB3aGlsZSB3ZWRnZWRcbiIpOwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0ID0gLUVJTzsKQEAgLTM0MjEsOCArMzY1NSwyMyBAQAogCiAJCS8qIGVycm9yIG90aGVyIHRoYW4gR1RUIGZ1bGwsIG9yIHdlJ3ZlIGFscmVhZHkgdHJpZWQgYWdhaW4gKi8KIAkJaWYgKHJldCAhPSAtRU5PU1BDIHx8IHBpbl90cmllcyA+PSAxKSB7Ci0JCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKLQkJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBwaW4gYnVmZmVycyAlZFxuIiwgcmV0KTsKKwkJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKSB7CisJCQkJdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX3NpemUgPSAwOworCQkJCWZvciAoaSA9IDA7IGkgPCBhcmdzLT5idWZmZXJfY291bnQ7IGkrKykKKwkJCQkJdG90YWxfc2l6ZSArPSBvYmplY3RfbGlzdFtpXS0+c2l6ZTsKKwkJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBwaW4gYnVmZmVyICVkIG9mICVkLCB0b3RhbCAlbGx1IGJ5dGVzOiAlZFxuIiwKKwkJCQkJICBwaW5uZWQrMSwgYXJncy0+YnVmZmVyX2NvdW50LAorCQkJCQkgIHRvdGFsX3NpemUsIHJldCk7CisJCQkJRFJNX0VSUk9SKCIlZCBvYmplY3RzIFslZCBwaW5uZWRdLCAiCisJCQkJCSAgIiVkIG9iamVjdCBieXRlcyBbJWQgcGlubmVkXSwgIgorCQkJCQkgICIlZC8lZCBndHQgYnl0ZXNcbiIsCisJCQkJCSAgYXRvbWljX3JlYWQoJmRldi0+b2JqZWN0X2NvdW50KSwKKwkJCQkJICBhdG9taWNfcmVhZCgmZGV2LT5waW5fY291bnQpLAorCQkJCQkgIGF0b21pY19yZWFkKCZkZXYtPm9iamVjdF9tZW1vcnkpLAorCQkJCQkgIGF0b21pY19yZWFkKCZkZXYtPnBpbl9tZW1vcnkpLAorCQkJCQkgIGF0b21pY19yZWFkKCZkZXYtPmd0dF9tZW1vcnkpLAorCQkJCQkgIGRldi0+Z3R0X3RvdGFsKTsKKwkJCX0KIAkJCWdvdG8gZXJyOwogCQl9CiAKQEAgLTM0MzMsNyArMzY4Miw3IEBACiAKIAkJLyogZXZpY3QgZXZlcnlvbmUgd2UgY2FuIGZyb20gdGhlIGFwZXJ0dXJlICovCiAJCXJldCA9IGk5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcoZGV2KTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1NQQykKIAkJCWdvdG8gZXJyOwogCX0KIApAQCAtMzQ4OSw4ICszNzM4LDEyIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKIAkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSBvYmplY3RfbGlzdFtpXTsKKwkJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwogCiAJCW9iai0+d3JpdGVfZG9tYWluID0gb2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbjsKKwkJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAorCQkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAorCQkJCQkJICAgIG9sZF93cml0ZV9kb21haW4pOwogCX0KIAogCWk5MTVfdmVyaWZ5X2luYWN0aXZlKGRldiwgX19GSUxFX18sIF9fTElORV9fKTsKQEAgLTM2MDcsMTEgKzM4NjAsOCBAQAogCWk5MTVfdmVyaWZ5X2luYWN0aXZlKGRldiwgX19GSUxFX18sIF9fTElORV9fKTsKIAlpZiAob2JqX3ByaXYtPmd0dF9zcGFjZSA9PSBOVUxMKSB7CiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChvYmosIGFsaWdubWVudCk7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJaWYgKHJldCAhPSAtRUJVU1kgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKLQkJCQlEUk1fRVJST1IoIkZhaWx1cmUgdG8gYmluZDogJWRcbiIsIHJldCk7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQl9CiAJfQogCS8qCiAJICogUHJlLTk2NSBjaGlwcyBuZWVkIGEgZmVuY2UgcmVnaXN0ZXIgc2V0IHVwIGluIG9yZGVyIHRvCkBAIC0zNjkxLDYgKzM5NDEsMTMgQEAKIAl9CiAJb2JqX3ByaXYgPSBvYmotPmRyaXZlcl9wcml2YXRlOwogCisJaWYgKG9ial9wcml2LT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgeworCQlEUk1fRVJST1IoIkF0dGVtcHRpbmcgdG8gcGluIGEgcHVyZ2VhYmxlIGJ1ZmZlclxuIik7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAob2JqX3ByaXYtPnBpbl9maWxwICE9IE5VTEwgJiYgb2JqX3ByaXYtPnBpbl9maWxwICE9IGZpbGVfcHJpdikgewogCQlEUk1fRVJST1IoIkFscmVhZHkgcGlubmVkIGluIGk5MTVfZ2VtX3Bpbl9pb2N0bCgpOiAlZFxuIiwKIAkJCSAgYXJncy0+aGFuZGxlKTsKQEAgLTM4MDMsNiArNDA2MCw1NiBAQAogICAgIHJldHVybiBpOTE1X2dlbV9yaW5nX3Rocm90dGxlKGRldiwgZmlsZV9wcml2KTsKIH0KIAoraW50CitpOTE1X2dlbV9tYWR2aXNlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21hZHZpc2UgKmFyZ3MgPSBkYXRhOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKworCXN3aXRjaCAoYXJncy0+bWFkdikgeworCWNhc2UgSTkxNV9NQURWX0RPTlRORUVEOgorCWNhc2UgSTkxNV9NQURWX1dJTExORUVEOgorCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICByZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSk7CisJaWYgKG9iaiA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiQmFkIGhhbmRsZSBpbiBpOTE1X2dlbV9tYWR2aXNlX2lvY3RsKCk6ICVkXG4iLAorCQkJICBhcmdzLT5oYW5kbGUpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisKKwlpZiAob2JqX3ByaXYtPnBpbl9jb3VudCkgeworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCQlEUk1fRVJST1IoIkF0dGVtcHRlZCBpOTE1X2dlbV9tYWR2aXNlX2lvY3RsKCkgb24gYSBwaW5uZWQgb2JqZWN0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9ial9wcml2LT5tYWR2ICE9IF9fSTkxNV9NQURWX1BVUkdFRCkKKwkJb2JqX3ByaXYtPm1hZHYgPSBhcmdzLT5tYWR2OworCisJLyogaWYgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgYm91bmQsIGRpc2NhcmQgaXRzIGJhY2tpbmcgc3RvcmFnZSAqLworCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKG9ial9wcml2KSAmJgorCSAgICBvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpCisJCWk5MTVfZ2VtX29iamVjdF90cnVuY2F0ZShvYmopOworCisJYXJncy0+cmV0YWluZWQgPSBvYmpfcHJpdi0+bWFkdiAhPSBfX0k5MTVfTUFEVl9QVVJHRUQ7CisKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKIGludCBpOTE1X2dlbV9pbml0X29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CkBAIC0zODI3LDYgKzQxMzQsOSBAQAogCW9ial9wcml2LT5mZW5jZV9yZWcgPSBJOTE1X0ZFTkNFX1JFR19OT05FOwogCUlOSVRfTElTVF9IRUFEKCZvYmpfcHJpdi0+bGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJm9ial9wcml2LT5mZW5jZV9saXN0KTsKKwlvYmpfcHJpdi0+bWFkdiA9IEk5MTVfTUFEVl9XSUxMTkVFRDsKKworCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jcmVhdGUob2JqKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzgzNiw2ICs0MTQ2LDggQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKIAorCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9kZXN0cm95KG9iaik7CisKIAl3aGlsZSAob2JqX3ByaXYtPnBpbl9jb3VudCA+IDApCiAJCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOwogCkBAIC0zODQ0LDQzICs0MTU2LDM1IEBACiAKIAlpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CiAKLQlpOTE1X2dlbV9mcmVlX21tYXBfb2Zmc2V0KG9iaik7CisJaWYgKG9ial9wcml2LT5tbWFwX29mZnNldCkKKwkJaTkxNV9nZW1fZnJlZV9tbWFwX29mZnNldChvYmopOwogCiAJa2ZyZWUob2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkKTsKIAlrZnJlZShvYmpfcHJpdi0+Yml0XzE3KTsKIAlrZnJlZShvYmotPmRyaXZlcl9wcml2YXRlKTsKIH0KIAotLyoqIFVuYmluZHMgYWxsIG9iamVjdHMgdGhhdCBhcmUgb24gdGhlIGdpdmVuIGJ1ZmZlciBsaXN0LiAqLworLyoqIFVuYmluZHMgYWxsIGluYWN0aXZlIG9iamVjdHMuICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9ldmljdF9mcm9tX2xpc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK2k5MTVfZ2VtX2V2aWN0X2Zyb21faW5hY3RpdmVfbGlzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQlpbnQgcmV0OworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7Ci0JCW9ial9wcml2ID0gbGlzdF9maXJzdF9lbnRyeShoZWFkLAotCQkJCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCi0JCQkJCSAgICBsaXN0KTsKLQkJb2JqID0gb2JqX3ByaXYtPm9iajsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSkgeworCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwkJaW50IHJldDsKIAotCQlpZiAob2JqX3ByaXYtPnBpbl9jb3VudCAhPSAwKSB7Ci0JCQlEUk1fRVJST1IoIlBpbm5lZCBvYmplY3QgaW4gdW5iaW5kIGxpc3RcbiIpOwotCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQorCQlvYmogPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkJICAgICAgIGxpc3QpLT5vYmo7CiAKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOwogCQlpZiAocmV0ICE9IDApIHsKLQkJCURSTV9FUlJPUigiRXJyb3IgdW5iaW5kaW5nIG9iamVjdCBpbiBMZWF2ZVZUOiAlZFxuIiwKLQkJCQkgIHJldCk7Ci0JCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJCURSTV9FUlJPUigiRXJyb3IgdW5iaW5kaW5nIG9iamVjdDogJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCi0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzkwMiw2ICs0MjA2LDcgQEAKIAkgKiBXZSBuZWVkIHRvIHJlcGxhY2UgdGhpcyB3aXRoIGEgc2VtYXBob3JlLCBvciBzb21ldGhpbmcuCiAJICovCiAJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDE7CisJZGVsX3RpbWVyKCZkZXZfcHJpdi0+aGFuZ2NoZWNrX3RpbWVyKTsKIAogCS8qIENhbmNlbCB0aGUgcmV0aXJlIHdvcmsgaGFuZGxlciwgd2FpdCBmb3IgaXQgdG8gZmluaXNoIGlmIHJ1bm5pbmcKIAkgKi8KQEAgLTM5MzEsNyArNDIzNiw3IEBACiAJCWlmIChsYXN0X3NlcW5vID09IGN1cl9zZXFubykgewogCQkJaWYgKHN0dWNrKysgPiAxMDApIHsKIAkJCQlEUk1fRVJST1IoImhhcmR3YXJlIHdlZGdlZFxuIik7Ci0JCQkJZGV2X3ByaXYtPm1tLndlZGdlZCA9IDE7CisJCQkJYXRvbWljX3NldCgmZGV2X3ByaXYtPm1tLndlZGdlZCwgMSk7CiAJCQkJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0zOTQ0LDcgKzQyNDksNyBAQAogCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYpOwogCiAJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3RfbG9jayk7Ci0JaWYgKCFkZXZfcHJpdi0+bW0ud2VkZ2VkKSB7CisJaWYgKCFhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1tLndlZGdlZCkpIHsKIAkJLyogQWN0aXZlIGFuZCBmbHVzaGluZyBzaG91bGQgbm93IGJlIGVtcHR5IGFzIHdlJ3ZlCiAJCSAqIHdhaXRlZCBmb3IgYSBzZXF1ZW5jZSBoaWdoZXIgdGhhbiBhbnkgcGVuZGluZyBleGVjYnVmZmVyCiAJCSAqLwpAQCAtMzk2MiwyOSArNDI2Nyw0MSBAQAogCSAqIHRoZSBHUFUgZG9tYWlucyBhbmQganVzdCBzdHVmZiB0aGVtIG9udG8gaW5hY3RpdmUuCiAJICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QpKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJCXVpbnQzMl90IG9sZF93cml0ZV9kb21haW47CiAKLQkJb2JqX3ByaXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QsCi0JCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKLQkJCQkJICAgIGxpc3QpOwotCQlvYmpfcHJpdi0+b2JqLT53cml0ZV9kb21haW4gJj0gfkk5MTVfR0VNX0dQVV9ET01BSU5TOwotCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19pbmFjdGl2ZShvYmpfcHJpdi0+b2JqKTsKKwkJb2JqID0gbGlzdF9maXJzdF9lbnRyeSgmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKKwkJCQkgICAgICAgbGlzdCktPm9iajsKKwkJb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOworCQlvYmotPndyaXRlX2RvbWFpbiAmPSB+STkxNV9HRU1fR1BVX0RPTUFJTlM7CisJCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2luYWN0aXZlKG9iaik7CisKKwkJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAorCQkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAorCQkJCQkJICAgIG9sZF93cml0ZV9kb21haW4pOwogCX0KIAlzcGluX3VubG9jaygmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0X2xvY2spOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCkpIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwkJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbjsKIAotCQlvYmpfcHJpdiA9IGxpc3RfZmlyc3RfZW50cnkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0LAotCQkJCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCi0JCQkJCSAgICBsaXN0KTsKLQkJb2JqX3ByaXYtPm9iai0+d3JpdGVfZG9tYWluICY9IH5JOTE1X0dFTV9HUFVfRE9NQUlOUzsKLQkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUob2JqX3ByaXYtPm9iaik7CisJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKKwkJCQkgICAgICAgbGlzdCktPm9iajsKKwkJb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOworCQlvYmotPndyaXRlX2RvbWFpbiAmPSB+STkxNV9HRU1fR1BVX0RPTUFJTlM7CisJCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2luYWN0aXZlKG9iaik7CisKKwkJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAorCQkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAorCQkJCQkJICAgIG9sZF93cml0ZV9kb21haW4pOwogCX0KIAogCiAJLyogTW92ZSBhbGwgaW5hY3RpdmUgYnVmZmVycyBvdXQgb2YgdGhlIEdUVC4gKi8KLQlyZXQgPSBpOTE1X2dlbV9ldmljdF9mcm9tX2xpc3QoZGV2LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOworCXJldCA9IGk5MTVfZ2VtX2V2aWN0X2Zyb21faW5hY3RpdmVfbGlzdChkZXYpOwogCVdBUk5fT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSk7CiAJaWYgKHJldCkgewogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTQyMDYsOSArNDUyMyw5IEBACiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCXJldHVybiAwOwogCi0JaWYgKGRldl9wcml2LT5tbS53ZWRnZWQpIHsKKwlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKSB7CiAJCURSTV9FUlJPUigiUmVlbmFibGluZyB3ZWRnZWQgaGFyZHdhcmUsIGdvb2QgbHVja1xuIik7Ci0JCWRldl9wcml2LT5tbS53ZWRnZWQgPSAwOworCQlhdG9taWNfc2V0KCZkZXZfcHJpdi0+bW0ud2VkZ2VkLCAwKTsKIAl9CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC00Mjc0LDYgKzQ1OTEsMTAgQEAKIAkJCSAgaTkxNV9nZW1fcmV0aXJlX3dvcmtfaGFuZGxlcik7CiAJZGV2X3ByaXYtPm1tLm5leHRfZ2VtX3NlcW5vID0gMTsKIAorCXNwaW5fbG9jaygmc2hyaW5rX2xpc3RfbG9jayk7CisJbGlzdF9hZGQoJmRldl9wcml2LT5tbS5zaHJpbmtfbGlzdCwgJnNocmlua19saXN0KTsKKwlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7CisKIAkvKiBPbGQgWCBkcml2ZXJzIHdpbGwgdGFrZSAwLTIgZm9yIGZyb250LCBiYWNrLCBkZXB0aCBidWZmZXJzICovCiAJZGV2X3ByaXYtPmZlbmNlX3JlZ19zdGFydCA9IDM7CiAKQEAgLTQ0OTEsMyArNDgxMiwxMTYgQEAKIAkJbGlzdF9kZWxfaW5pdChpOTE1X2ZpbGVfcHJpdi0+bW0ucmVxdWVzdF9saXN0Lm5leHQpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9zaHJpbmsoaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsICpuZXh0X2RldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYsICpuZXh0X29iajsKKwlpbnQgY250ID0gMDsKKwlpbnQgd291bGRfZGVhZGxvY2sgPSAxOworCisJLyogImZhc3QtcGF0aCIgdG8gY291bnQgbnVtYmVyIG9mIGF2YWlsYWJsZSBvYmplY3RzICovCisJaWYgKG5yX3RvX3NjYW4gPT0gMCkgeworCQlzcGluX2xvY2soJnNocmlua19saXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9wcml2LCAmc2hyaW5rX2xpc3QsIG1tLnNocmlua19saXN0KSB7CisJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKworCQkJaWYgKG11dGV4X3RyeWxvY2soJmRldi0+c3RydWN0X211dGV4KSkgeworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsCisJCQkJCQkgICAgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0LAorCQkJCQkJICAgIGxpc3QpCisJCQkJCWNudCsrOworCQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKKworCQlyZXR1cm4gKGNudCAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOworCX0KKworCXNwaW5fbG9jaygmc2hyaW5rX2xpc3RfbG9jayk7CisKKwkvKiBmaXJzdCBzY2FuIGZvciBjbGVhbiBidWZmZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldl9wcml2LCBuZXh0X2RldiwKKwkJCQkgJnNocmlua19saXN0LCBtbS5zaHJpbmtfbGlzdCkgeworCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKworCQlpZiAoISBtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpCisJCQljb250aW51ZTsKKworCQlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7CisKKwkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCBuZXh0X29iaiwKKwkJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkJIGxpc3QpIHsKKwkJCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKG9ial9wcml2KSkgeworCQkJCWk5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqX3ByaXYtPm9iaik7CisJCQkJaWYgKC0tbnJfdG9fc2NhbiA8PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXNwaW5fbG9jaygmc2hyaW5rX2xpc3RfbG9jayk7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJCXdvdWxkX2RlYWRsb2NrID0gMDsKKworCQlpZiAobnJfdG9fc2NhbiA8PSAwKQorCQkJYnJlYWs7CisJfQorCisJLyogc2Vjb25kIHBhc3MsIGV2aWN0L2NvdW50IGFueXRoaW5nIHN0aWxsIG9uIHRoZSBpbmFjdGl2ZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldl9wcml2LCBuZXh0X2RldiwKKwkJCQkgJnNocmlua19saXN0LCBtbS5zaHJpbmtfbGlzdCkgeworCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKworCQlpZiAoISBtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpCisJCQljb250aW51ZTsKKworCQlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCBuZXh0X29iaiwKKwkJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkJIGxpc3QpIHsKKwkJCWlmIChucl90b19zY2FuID4gMCkgeworCQkJCWk5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqX3ByaXYtPm9iaik7CisJCQkJbnJfdG9fc2Nhbi0tOworCQkJfSBlbHNlCisJCQkJY250Kys7CisJCX0KKworCQlzcGluX2xvY2soJnNocmlua19saXN0X2xvY2spOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCQl3b3VsZF9kZWFkbG9jayA9IDA7CisJfQorCisJc3Bpbl91bmxvY2soJnNocmlua19saXN0X2xvY2spOworCisJaWYgKHdvdWxkX2RlYWRsb2NrKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoY250ID4gMCkKKwkJcmV0dXJuIChjbnQgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNocmlua2VyIHNocmlua2VyID0geworCS5zaHJpbmsgPSBpOTE1X2dlbV9zaHJpbmssCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKK19faW5pdCB2b2lkCitpOTE1X2dlbV9zaHJpbmtlcl9pbml0KHZvaWQpCit7CisgICAgcmVnaXN0ZXJfc2hyaW5rZXIoJnNocmlua2VyKTsKK30KKworX19leGl0IHZvaWQKK2k5MTVfZ2VtX3Nocmlua2VyX2V4aXQodm9pZCkKK3sKKyAgICB1bnJlZ2lzdGVyX3Nocmlua2VyKCZzaHJpbmtlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwppbmRleCA2Yzg5ZjJmLi5jM2NlZmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgogCiAjZGVmaW5lIE1BWF9OT1BJRCAoKHUzMil+MCkKQEAgLTI3OSw3ICsyODAsOSBAQAogCQl9CiAKIAkJaWYgKGd0X2lpciAmIEdUX1VTRVJfSU5URVJSVVBUKSB7Ci0JCQlkZXZfcHJpdi0+bW0uaXJxX2dlbV9zZXFubyA9IGk5MTVfZ2V0X2dlbV9zZXFubyhkZXYpOworCQkJdTMyIHNlcW5vID0gaTkxNV9nZXRfZ2VtX3NlcW5vKGRldik7CisJCQlkZXZfcHJpdi0+bW0uaXJxX2dlbV9zZXFubyA9IHNlcW5vOworCQkJdHJhY2VfaTkxNV9nZW1fcmVxdWVzdF9jb21wbGV0ZShkZXYsIHNlcW5vKTsKIAkJCURSTV9XQUtFVVAoJmRldl9wcml2LT5pcnFfcXVldWUpOwogCQl9CiAKQEAgLTMwMiwxMiArMzA1LDI1IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBkcm1faTkxNV9wcml2YXRlX3QsCiAJCQkJCQkgICAgZXJyb3Jfd29yayk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0JY2hhciAqZXZlbnRfc3RyaW5nID0gIkVSUk9SPTEiOwotCWNoYXIgKmVudnBbXSA9IHsgZXZlbnRfc3RyaW5nLCBOVUxMIH07CisJY2hhciAqZXJyb3JfZXZlbnRbXSA9IHsgIkVSUk9SPTEiLCBOVUxMIH07CisJY2hhciAqcmVzZXRfZXZlbnRbXSA9IHsgIlJFU0VUPTEiLCBOVUxMIH07CisJY2hhciAqcmVzZXRfZG9uZV9ldmVudFtdID0geyAiRVJST1I9MCIsIE5VTEwgfTsKIAogCURSTV9ERUJVRygiZ2VuZXJhdGluZyBlcnJvciBldmVudFxuIik7CisJa29iamVjdF91ZXZlbnRfZW52KCZkZXYtPnByaW1hcnktPmtkZXYua29iaiwgS09CSl9DSEFOR0UsIGVycm9yX2V2ZW50KTsKIAotCWtvYmplY3RfdWV2ZW50X2VudigmZGV2LT5wcmltYXJ5LT5rZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKKwlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKSB7CisJCWlmIChJU19JOTY1RyhkZXYpKSB7CisJCQlEUk1fREVCVUcoInJlc2V0dGluZyBjaGlwXG4iKTsKKwkJCWtvYmplY3RfdWV2ZW50X2VudigmZGV2LT5wcmltYXJ5LT5rZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCByZXNldF9ldmVudCk7CisJCQlpZiAoIWk5NjVfcmVzZXQoZGV2LCBHRFJTVF9SRU5ERVIpKSB7CisJCQkJYXRvbWljX3NldCgmZGV2X3ByaXYtPm1tLndlZGdlZCwgMCk7CisJCQkJa29iamVjdF91ZXZlbnRfZW52KCZkZXYtPnByaW1hcnktPmtkZXYua29iaiwgS09CSl9DSEFOR0UsIHJlc2V0X2RvbmVfZXZlbnQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKCJyZWJvb3QgcmVxdWlyZWRcbiIpOworCQl9CisJfQogfQogCiAvKioKQEAgLTM3Miw3ICszODgsNyBAQAogICogc28gdXNlcnNwYWNlIGtub3dzIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQgKHNob3VsZCB0cmlnZ2VyIGNvbGxlY3Rpb24KICAqIG9mIGEgcmluZyBkdW1wIGV0Yy4pLgogICovCi1zdGF0aWMgdm9pZCBpOTE1X2hhbmRsZV9lcnJvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaTkxNV9oYW5kbGVfZXJyb3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCB3ZWRnZWQpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgZWlyID0gSTkxNV9SRUFEKEVJUik7CkBAIC00ODIsNiArNDk4LDE2IEBACiAJCUk5MTVfV1JJVEUoSUlSLCBJOTE1X1JFTkRFUl9DT01NQU5EX1BBUlNFUl9FUlJPUl9JTlRFUlJVUFQpOwogCX0KIAorCWlmICh3ZWRnZWQpIHsKKwkJYXRvbWljX3NldCgmZGV2X3ByaXYtPm1tLndlZGdlZCwgMSk7CisKKwkJLyoKKwkJICogV2FrZXVwIHdhaXRpbmcgcHJvY2Vzc2VzIHNvIHRoZXkgZG9uJ3QgaGFuZworCQkgKi8KKwkJcHJpbnRrKCJpOTE1OiBXYWtpbmcgdXAgc2xlZXBpbmcgcHJvY2Vzc2VzXG4iKTsKKwkJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CisJfQorCiAJcXVldWVfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+ZXJyb3Jfd29yayk7CiB9CiAKQEAgLTUyNyw3ICs1NTMsNyBAQAogCQlwaXBlYl9zdGF0cyA9IEk5MTVfUkVBRChQSVBFQlNUQVQpOwogCiAJCWlmIChpaXIgJiBJOTE1X1JFTkRFUl9DT01NQU5EX1BBUlNFUl9FUlJPUl9JTlRFUlJVUFQpCi0JCQlpOTE1X2hhbmRsZV9lcnJvcihkZXYpOworCQkJaTkxNV9oYW5kbGVfZXJyb3IoZGV2LCBmYWxzZSk7CiAKIAkJLyoKIAkJICogQ2xlYXIgdGhlIFBJUEUoQXxCKVNUQVQgcmVncyBiZWZvcmUgdGhlIElJUgpAQCAtNTk5LDggKzYyNSwxMiBAQAogCQl9CiAKIAkJaWYgKGlpciAmIEk5MTVfVVNFUl9JTlRFUlJVUFQpIHsKLQkJCWRldl9wcml2LT5tbS5pcnFfZ2VtX3NlcW5vID0gaTkxNV9nZXRfZ2VtX3NlcW5vKGRldik7CisJCQl1MzIgc2Vxbm8gPSBpOTE1X2dldF9nZW1fc2Vxbm8oZGV2KTsKKwkJCWRldl9wcml2LT5tbS5pcnFfZ2VtX3NlcW5vID0gc2Vxbm87CisJCQl0cmFjZV9pOTE1X2dlbV9yZXF1ZXN0X2NvbXBsZXRlKGRldiwgc2Vxbm8pOwogCQkJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CisJCQlkZXZfcHJpdi0+aGFuZ2NoZWNrX2NvdW50ID0gMDsKKwkJCW1vZF90aW1lcigmZGV2X3ByaXYtPmhhbmdjaGVja190aW1lciwgamlmZmllcyArIERSTV9JOTE1X0hBTkdDSEVDS19QRVJJT0QpOwogCQl9CiAKIAkJaWYgKHBpcGVhX3N0YXRzICYgdmJsYW5rX3N0YXR1cykgewpAQCAtNjk1LDYgKzcyNSwxNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CiB9CiAKK3ZvaWQgaTkxNV90cmFjZV9pcnFfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBzZXFubykKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT50cmFjZV9pcnFfc2Vxbm8gPT0gMCkKKwkJaTkxNV91c2VyX2lycV9nZXQoZGV2KTsKKworCWRldl9wcml2LT50cmFjZV9pcnFfc2Vxbm8gPSBzZXFubzsKK30KKwogc3RhdGljIGludCBpOTE1X3dhaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgaXJxX25yKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04ODAsNiArOTIwLDUyIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqaTkxNV9nZXRfdGFpbF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpIHsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlyZXR1cm4gbGlzdF9lbnRyeShkZXZfcHJpdi0+bW0ucmVxdWVzdF9saXN0LnByZXYsIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCwgbGlzdCk7Cit9CisKKy8qKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY2hpcCBoYXNuJ3QgcmVwb3J0ZWQgYmFjayB3aXRoIGNvbXBsZXRlZAorICogYmF0Y2hidWZmZXJzIGluIGEgbG9uZyB0aW1lLiBUaGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCB3ZSBzaW1wbHkgcmVjb3JkCisgKiBBQ1RIRC4gSWYgQUNUSEQgaGFzbid0IGNoYW5nZWQgYnkgdGhlIHRpbWUgdGhlIGhhbmdjaGVjayB0aW1lciBlbGFwc2VzCisgKiBhZ2Fpbiwgd2UgYXNzdW1lIHRoZSBjaGlwIGlzIHdlZGdlZCBhbmQgdHJ5IHRvIGZpeCBpdC4KKyAqLwordm9pZCBpOTE1X2hhbmdjaGVja19lbGFwc2VkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopZGF0YTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBhY3RoZDsKKyAgICAgICAKKwlpZiAoIUlTX0k5NjVHKGRldikpCisJCWFjdGhkID0gSTkxNV9SRUFEKEFDVEhEKTsKKwllbHNlCisJCWFjdGhkID0gSTkxNV9SRUFEKEFDVEhEX0k5NjUpOworCisJLyogSWYgYWxsIHdvcmsgaXMgZG9uZSB0aGVuIEFDVEhEIGNsZWFybHkgaGFzbid0IGFkdmFuY2VkLiAqLworCWlmIChsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0ucmVxdWVzdF9saXN0KSB8fAorCQkgICAgICAgaTkxNV9zZXFub19wYXNzZWQoaTkxNV9nZXRfZ2VtX3NlcW5vKGRldiksIGk5MTVfZ2V0X3RhaWxfcmVxdWVzdChkZXYpLT5zZXFubykpIHsKKwkJZGV2X3ByaXYtPmhhbmdjaGVja19jb3VudCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmxhc3RfYWN0aGQgPT0gYWN0aGQgJiYgZGV2X3ByaXYtPmhhbmdjaGVja19jb3VudCA+IDApIHsKKwkJRFJNX0VSUk9SKCJIYW5nY2hlY2sgdGltZXIgZWxhcHNlZC4uLiBHUFUgaHVuZ1xuIik7CisJCWk5MTVfaGFuZGxlX2Vycm9yKGRldiwgdHJ1ZSk7CisJCXJldHVybjsKKwl9IAorCisJLyogUmVzZXQgdGltZXIgY2FzZSBjaGlwIGhhbmdzIHdpdGhvdXQgYW5vdGhlciByZXF1ZXN0IGJlaW5nIGFkZGVkICovCisJbW9kX3RpbWVyKCZkZXZfcHJpdi0+aGFuZ2NoZWNrX3RpbWVyLCBqaWZmaWVzICsgRFJNX0k5MTVfSEFOR0NIRUNLX1BFUklPRCk7CisKKwlpZiAoYWN0aGQgIT0gZGV2X3ByaXYtPmxhc3RfYWN0aGQpCisJCWRldl9wcml2LT5oYW5nY2hlY2tfY291bnQgPSAwOworCWVsc2UKKwkJZGV2X3ByaXYtPmhhbmdjaGVja19jb3VudCsrOworCisJZGV2X3ByaXYtPmxhc3RfYWN0aGQgPSBhY3RoZDsKK30KKwogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwogc3RhdGljIHZvaWQgaWdkbmdfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfb3ByZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfb3ByZWdpb24uYwppbmRleCBlNGI0ZTg4Li4yZDUxOTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X29wcmVnaW9uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9vcHJlZ2lvbi5jCkBAIC0xNDgsNiArMTQ4LDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBvcHJlZ2lvbl9hc2xlICphc2xlID0gZGV2X3ByaXYtPm9wcmVnaW9uLmFzbGU7CiAJdTMyIGJsY19wd21fY3RsLCBibGNfcHdtX2N0bDI7CisJdTMyIG1heF9iYWNrbGlnaHQsIGxldmVsLCBzaGlmdDsKIAogCWlmICghKGJjbHAgJiBBU0xFX0JDTFBfVkFMSUQpKQogCQlyZXR1cm4gQVNMRV9CQUNLTElHSFRfRkFJTDsKQEAgLTE1NywxNCArMTU4LDI1IEBACiAJCXJldHVybiBBU0xFX0JBQ0tMSUdIVF9GQUlMOwogCiAJYmxjX3B3bV9jdGwgPSBJOTE1X1JFQUQoQkxDX1BXTV9DVEwpOwotCWJsY19wd21fY3RsICY9IH5CQUNLTElHSFRfRFVUWV9DWUNMRV9NQVNLOwogCWJsY19wd21fY3RsMiA9IEk5MTVfUkVBRChCTENfUFdNX0NUTDIpOwogCi0JaWYgKGJsY19wd21fY3RsMiAmIEJMTV9DT01CSU5BVElPTl9NT0RFKQorCWlmIChJU19JOTY1RyhkZXYpICYmIChibGNfcHdtX2N0bDIgJiBCTE1fQ09NQklOQVRJT05fTU9ERSkpCiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LT5wZGV2LCBQQ0lfTEJQQywgYmNscCk7Ci0JZWxzZQotCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCBibGNfcHdtX2N0bCB8ICgoYmNscCAqIDB4MTAxKS0xKSk7Ci0KKwllbHNlIHsKKwkJaWYgKElTX0lHRChkZXYpKSB7CisJCQlibGNfcHdtX2N0bCAmPSB+KEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0sgLSAxKTsKKwkJCW1heF9iYWNrbGlnaHQgPSAoYmxjX3B3bV9jdGwgJiBCQUNLTElHSFRfTU9EVUxBVElPTl9GUkVRX01BU0spID4+IAorCQkJCQlCQUNLTElHSFRfTU9EVUxBVElPTl9GUkVRX1NISUZUOworCQkJc2hpZnQgPSBCQUNLTElHSFRfRFVUWV9DWUNMRV9TSElGVCArIDE7CisJCX0gZWxzZSB7CisJCQlibGNfcHdtX2N0bCAmPSB+QkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKKwkJCW1heF9iYWNrbGlnaHQgPSAoKGJsY19wd21fY3RsICYgQkFDS0xJR0hUX01PRFVMQVRJT05fRlJFUV9NQVNLKSA+PiAKKwkJCQkJQkFDS0xJR0hUX01PRFVMQVRJT05fRlJFUV9TSElGVCkgKiAyOworCQkJc2hpZnQgPSBCQUNLTElHSFRfRFVUWV9DWUNMRV9TSElGVDsKKwkJfQorCQlsZXZlbCA9IChiY2xwICogbWF4X2JhY2tsaWdodCkgLyAyNTU7CisJCUk5MTVfV1JJVEUoQkxDX1BXTV9DVEwsIGJsY19wd21fY3RsIHwgKGxldmVsIDw8IHNoaWZ0KSk7CisJfQogCWFzbGUtPmNibHYgPSAoYmNscCoweDY0KS8weGZmIHwgQVNMRV9DQkxWX1ZBTElEOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCAzZjc5NjM1Li4xNjg3ZWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTg2LDYgKzg2LDEwIEBACiAjZGVmaW5lICAgSTkxNV9HQ19SRU5ERVJfQ0xPQ0tfMjAwX01IWgkoMSA8PCAwKQogI2RlZmluZSAgIEk5MTVfR0NfUkVOREVSX0NMT0NLXzMzM19NSFoJKDQgPDwgMCkKICNkZWZpbmUgTEJCCTB4ZjQKKyNkZWZpbmUgR0RSU1QgMHhjMAorI2RlZmluZSAgR0RSU1RfRlVMTAkoMDw8MikKKyNkZWZpbmUgIEdEUlNUX1JFTkRFUgkoMTw8MikKKyNkZWZpbmUgIEdEUlNUX01FRElBCSgzPDwyKQogCiAvKiBWR0Egc3R1ZmYgKi8KIApAQCAtMzQ0LDkgKzM0OCwzNyBAQAogI2RlZmluZSAgIEZCQ19DVExfUExBTkVBCSgwPDwwKQogI2RlZmluZSAgIEZCQ19DVExfUExBTkVCCSgxPDwwKQogI2RlZmluZSBGQkNfRkVOQ0VfT0ZGCQkweDAzMjFiCisjZGVmaW5lIEZCQ19UQUcJCQkweDAzMzAwCiAKICNkZWZpbmUgRkJDX0xMX1NJWkUJCSgxNTM2KQogCisvKiBGcmFtZWJ1ZmZlciBjb21wcmVzc2lvbiBmb3IgR000NSsgKi8KKyNkZWZpbmUgRFBGQ19DQl9CQVNFCQkweDMyMDAKKyNkZWZpbmUgRFBGQ19DT05UUk9MCQkweDMyMDgKKyNkZWZpbmUgICBEUEZDX0NUTF9FTgkJKDE8PDMxKQorI2RlZmluZSAgIERQRkNfQ1RMX1BMQU5FQQkoMDw8MzApCisjZGVmaW5lICAgRFBGQ19DVExfUExBTkVCCSgxPDwzMCkKKyNkZWZpbmUgICBEUEZDX0NUTF9GRU5DRV9FTgkoMTw8MjkpCisjZGVmaW5lICAgRFBGQ19TUl9FTgkJKDE8PDEwKQorI2RlZmluZSAgIERQRkNfQ1RMX0xJTUlUXzFYCSgwPDw2KQorI2RlZmluZSAgIERQRkNfQ1RMX0xJTUlUXzJYCSgxPDw2KQorI2RlZmluZSAgIERQRkNfQ1RMX0xJTUlUXzRYCSgyPDw2KQorI2RlZmluZSBEUEZDX1JFQ09NUF9DVEwJCTB4MzIwYworI2RlZmluZSAgIERQRkNfUkVDT01QX1NUQUxMX0VOCSgxPDwyNykKKyNkZWZpbmUgICBEUEZDX1JFQ09NUF9TVEFMTF9XTV9TSElGVCAoMTYpCisjZGVmaW5lICAgRFBGQ19SRUNPTVBfU1RBTExfV01fTUFTSyAoMHgwN2ZmMDAwMCkKKyNkZWZpbmUgICBEUEZDX1JFQ09NUF9USU1FUl9DT1VOVF9TSElGVCAoMCkKKyNkZWZpbmUgICBEUEZDX1JFQ09NUF9USU1FUl9DT1VOVF9NQVNLICgweDAwMDAwMDNmKQorI2RlZmluZSBEUEZDX1NUQVRVUwkJMHgzMjEwCisjZGVmaW5lICAgRFBGQ19JTlZBTF9TRUdfU0hJRlQgICgxNikKKyNkZWZpbmUgICBEUEZDX0lOVkFMX1NFR19NQVNLCSgweDA3ZmYwMDAwKQorI2RlZmluZSAgIERQRkNfQ09NUF9TRUdfU0hJRlQJKDApCisjZGVmaW5lICAgRFBGQ19DT01QX1NFR19NQVNLCSgweDAwMDAwM2ZmKQorI2RlZmluZSBEUEZDX1NUQVRVUzIJCTB4MzIxNAorI2RlZmluZSBEUEZDX0ZFTkNFX1lPRkYJCTB4MzIxOAorI2RlZmluZSBEUEZDX0NISUNLRU4JCTB4MzIyNAorI2RlZmluZSAgIERQRkNfSFRfTU9ESUZZCSgxPDwzMSkKKwogLyoKICAqIEdQSU8gcmVncwogICovCkBAIC05MzYsNiArOTY4LDggQEAKICNkZWZpbmUgICBMVkRTX1BPUlRfRU4JCQkoMSA8PCAzMSkKIC8qIFNlbGVjdHMgcGlwZSBCIGZvciBMVkRTIGRhdGEuICBNdXN0IGJlIHNldCBvbiBwcmUtOTY1LiAqLwogI2RlZmluZSAgIExWRFNfUElQRUJfU0VMRUNUCQkoMSA8PCAzMCkKKy8qIEVuYWJsZSBib3JkZXIgZm9yIHVuc2NhbGVkIChvciBhc3BlY3Qtc2NhbGVkKSBkaXNwbGF5ICovCisjZGVmaW5lICAgTFZEU19CT1JERVJfRU5BQkxFCQkoMSA8PCAxNSkKIC8qCiAgKiBFbmFibGVzIHRoZSBBMC1BMiBkYXRhIHBhaXJzIGFuZCBDTEtBLCBjb250YWluaW5nIDE4IGJpdHMgb2YgY29sb3IgZGF0YSBwZXIKICAqIHBpeGVsLgpAQCAtMTA0Niw2ICsxMDgwLDggQEAKICNkZWZpbmUgICBCQUNLTElHSFRfRFVUWV9DWUNMRV9TSElGVAkJKDApCiAjZGVmaW5lICAgQkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSwkJKDB4ZmZmZikKIAorI2RlZmluZSBCTENfSElTVF9DVEwJCTB4NjEyNjAKKwogLyogVFYgcG9ydCBjb250cm9sICovCiAjZGVmaW5lIFRWX0NUTAkJCTB4NjgwMDAKIC8qKiBFbmFibGVzIHRoZSBUViBlbmNvZGVyICovCkBAIC0xNzQ4LDYgKzE3ODQsMTEgQEAKICNkZWZpbmUgICBQSVBFX1NUQVJUX1ZCTEFOS19JTlRFUlJVUFRfU1RBVFVTCSgxVUw8PDIpIC8qIDk2NSBvciBsYXRlciAqLwogI2RlZmluZSAgIFBJUEVfVkJMQU5LX0lOVEVSUlVQVF9TVEFUVVMJCSgxVUw8PDEpCiAjZGVmaW5lICAgUElQRV9PVkVSTEFZX1VQREFURURfU1RBVFVTCQkoMVVMPDwwKQorI2RlZmluZSAgIFBJUEVfQlBDX01BU0sgCQkJKDcgPDwgNSkgLyogSXJvbmxha2UgKi8KKyNkZWZpbmUgICBQSVBFXzhCUEMJCQkJKDAgPDwgNSkKKyNkZWZpbmUgICBQSVBFXzEwQlBDCQkJCSgxIDw8IDUpCisjZGVmaW5lICAgUElQRV82QlBDCQkJCSgyIDw8IDUpCisjZGVmaW5lICAgUElQRV8xMkJQQwkJCQkoMyA8PCA1KQogCiAjZGVmaW5lIERTUEFSQgkJCTB4NzAwMzAKICNkZWZpbmUgICBEU1BBUkJfQ1NUQVJUX01BU0sJKDB4N2YgPDwgNykKQEAgLTE3NTgsMTcgKzE3OTksMjkgQEAKICNkZWZpbmUgICBEU1BBUkJfQUVORF9TSElGVAkwCiAKICNkZWZpbmUgRFNQRlcxCQkJMHg3MDAzNAorI2RlZmluZSAgIERTUEZXX1NSX1NISUZUCTIzCisjZGVmaW5lICAgRFNQRldfQ1VSU09SQl9TSElGVAkxNgorI2RlZmluZSAgIERTUEZXX1BMQU5FQl9TSElGVAk4CiAjZGVmaW5lIERTUEZXMgkJCTB4NzAwMzgKKyNkZWZpbmUgICBEU1BGV19DVVJTT1JBX01BU0sJMHgwMDAwM2YwMAorI2RlZmluZSAgIERTUEZXX0NVUlNPUkFfU0hJRlQJMTYKICNkZWZpbmUgRFNQRlczCQkJMHg3MDAzYworI2RlZmluZSAgIERTUEZXX0hQTExfU1JfRU4JKDE8PDMxKQorI2RlZmluZSAgIERTUEZXX0NVUlNPUl9TUl9TSElGVAkyNAogI2RlZmluZSAgIElHRF9TRUxGX1JFRlJFU0hfRU4JKDE8PDMwKQogCiAvKiBGSUZPIHdhdGVybWFyayBzaXplcyBldGMgKi8KKyNkZWZpbmUgRzRYX0ZJRk9fTElORV9TSVpFCTY0CiAjZGVmaW5lIEk5MTVfRklGT19MSU5FX1NJWkUJNjQKICNkZWZpbmUgSTgzMF9GSUZPX0xJTkVfU0laRQkzMgorCisjZGVmaW5lIEc0WF9GSUZPX1NJWkUJCTEyNwogI2RlZmluZSBJOTQ1X0ZJRk9fU0laRQkJMTI3IC8qIDk0NSAmIDk2NSAqLwogI2RlZmluZSBJOTE1X0ZJRk9fU0laRQkJOTUKICNkZWZpbmUgSTg1NUdNX0ZJRk9fU0laRQkxMjcgLyogSW4gY2FjaGVsaW5lcyAqLwogI2RlZmluZSBJODMwX0ZJRk9fU0laRQkJOTUKKworI2RlZmluZSBHNFhfTUFYX1dNCQkweDNmCiAjZGVmaW5lIEk5MTVfTUFYX1dNCQkweDNmCiAKICNkZWZpbmUgSUdEX0RJU1BMQVlfRklGTwk1MTIgLyogaW4gNjRieXRlIHVuaXQgKi8KQEAgLTE5OTgsOCArMjA1MSwxNSBAQAogI2RlZmluZSBQRkFfQ1RMXzEgICAgICAgICAgICAgICAweDY4MDgwCiAjZGVmaW5lIFBGQl9DVExfMSAgICAgICAgICAgICAgIDB4Njg4ODAKICNkZWZpbmUgIFBGX0VOQUJMRSAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSAgUEZfRklMVEVSX01BU0sJCSgzPDwyMykKKyNkZWZpbmUgIFBGX0ZJTFRFUl9QUk9HUkFNTUVECSgwPDwyMykKKyNkZWZpbmUgIFBGX0ZJTFRFUl9NRURfM3gzCSgxPDwyMykKKyNkZWZpbmUgIFBGX0ZJTFRFUl9FREdFX0VOSEFOQ0UJKDI8PDIzKQorI2RlZmluZSAgUEZfRklMVEVSX0VER0VfU09GVEVOCSgzPDwyMykKICNkZWZpbmUgUEZBX1dJTl9TWgkJMHg2ODA3NAogI2RlZmluZSBQRkJfV0lOX1NaCQkweDY4ODc0CisjZGVmaW5lIFBGQV9XSU5fUE9TCQkweDY4MDcwCisjZGVmaW5lIFBGQl9XSU5fUE9TCQkweDY4ODcwCiAKIC8qIGxlZ2FjeSBwYWxldHRlICovCiAjZGVmaW5lIExHQ19QQUxFVFRFX0EgICAgICAgICAgIDB4NGEwMDAKQEAgLTIxMTUsMTEgKzIxNzUsMTEgQEAKICNkZWZpbmUgIERSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfTUFTSwkJKDM8PDEzKQogI2RlZmluZSAgRFJFRl9TU0NfU09VUkNFX0RJU0FCTEUgICAgICAgICAgICAgICAgKDA8PDExKQogI2RlZmluZSAgRFJFRl9TU0NfU09VUkNFX0VOQUJMRSAgICAgICAgICAgICAgICAgKDI8PDExKQotI2RlZmluZSAgRFJFRl9TU0NfU09VUkNFX01BU0sJCQkoMjw8MTEpCisjZGVmaW5lICBEUkVGX1NTQ19TT1VSQ0VfTUFTSwkJCSgzPDwxMSkKICNkZWZpbmUgIERSRUZfTk9OU1BSRUFEX1NPVVJDRV9ESVNBQkxFICAgICAgICAgICgwPDw5KQogI2RlZmluZSAgRFJFRl9OT05TUFJFQURfQ0s1MDVfRU5BQkxFCQkoMTw8OSkKICNkZWZpbmUgIERSRUZfTk9OU1BSRUFEX1NPVVJDRV9FTkFCTEUgICAgICAgICAgICgyPDw5KQotI2RlZmluZSAgRFJFRl9OT05TUFJFQURfU09VUkNFX01BU0sJCSgyPDw5KQorI2RlZmluZSAgRFJFRl9OT05TUFJFQURfU09VUkNFX01BU0sJCSgzPDw5KQogI2RlZmluZSAgRFJFRl9TVVBFUlNQUkVBRF9TT1VSQ0VfRElTQUJMRSAgICAgICAgKDA8PDcpCiAjZGVmaW5lICBEUkVGX1NVUEVSU1BSRUFEX1NPVVJDRV9FTkFCTEUgICAgICAgICAoMjw8NykKICNkZWZpbmUgIERSRUZfU1NDNF9ET1dOU1BSRUFEICAgICAgICAgICAgICAgICAgICgwPDw2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwppbmRleCAyMGQ0ZDE5Li45OTJkNTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwpAQCAtMzIsMTEgKzMyLDE1IEBACiBzdGF0aWMgYm9vbCBpOTE1X3BpcGVfZW5hYmxlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIHBpcGUgcGlwZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMglkcGxsX3JlZzsKIAotCWlmIChwaXBlID09IFBJUEVfQSkKLQkJcmV0dXJuIChJOTE1X1JFQUQoRFBMTF9BKSAmIERQTExfVkNPX0VOQUJMRSk7Ci0JZWxzZQotCQlyZXR1cm4gKEk5MTVfUkVBRChEUExMX0IpICYgRFBMTF9WQ09fRU5BQkxFKTsKKwlpZiAoSVNfSUdETkcoZGV2KSkgeworCQlkcGxsX3JlZyA9IChwaXBlID09IFBJUEVfQSkgPyBQQ0hfRFBMTF9BOiBQQ0hfRFBMTF9COworCX0gZWxzZSB7CisJCWRwbGxfcmVnID0gKHBpcGUgPT0gUElQRV9BKSA/IERQTExfQTogRFBMTF9COworCX0KKworCXJldHVybiAoSTkxNV9SRUFEKGRwbGxfcmVnKSAmIERQTExfVkNPX0VOQUJMRSk7CiB9CiAKIHN0YXRpYyB2b2lkIGk5MTVfc2F2ZV9wYWxldHRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gcGlwZSBwaXBlKQpAQCAtNDksNiArNTMsOSBAQAogCWlmICghaTkxNV9waXBlX2VuYWJsZWQoZGV2LCBwaXBlKSkKIAkJcmV0dXJuOwogCisJaWYgKElTX0lHRE5HKGRldikpCisJCXJlZyA9IChwaXBlID09IFBJUEVfQSkgPyBMR0NfUEFMRVRURV9BIDogTEdDX1BBTEVUVEVfQjsKKwogCWlmIChwaXBlID09IFBJUEVfQSkKIAkJYXJyYXkgPSBkZXZfcHJpdi0+c2F2ZV9wYWxldHRlX2E7CiAJZWxzZQpAQCAtNjgsNiArNzUsOSBAQAogCWlmICghaTkxNV9waXBlX2VuYWJsZWQoZGV2LCBwaXBlKSkKIAkJcmV0dXJuOwogCisJaWYgKElTX0lHRE5HKGRldikpCisJCXJlZyA9IChwaXBlID09IFBJUEVfQSkgPyBMR0NfUEFMRVRURV9BIDogTEdDX1BBTEVUVEVfQjsKKwogCWlmIChwaXBlID09IFBJUEVfQSkKIAkJYXJyYXkgPSBkZXZfcHJpdi0+c2F2ZV9wYWxldHRlX2E7CiAJZWxzZQpAQCAtMjI4LDEzICsyMzgsMjAgQEAKIAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm47CisKIAkvKiBQaXBlICYgcGxhbmUgQSBpbmZvICovCiAJZGV2X3ByaXYtPnNhdmVQSVBFQUNPTkYgPSBJOTE1X1JFQUQoUElQRUFDT05GKTsKIAlkZXZfcHJpdi0+c2F2ZVBJUEVBU1JDID0gSTkxNV9SRUFEKFBJUEVBU1JDKTsKLQlkZXZfcHJpdi0+c2F2ZUZQQTAgPSBJOTE1X1JFQUQoRlBBMCk7Ci0JZGV2X3ByaXYtPnNhdmVGUEExID0gSTkxNV9SRUFEKEZQQTEpOwotCWRldl9wcml2LT5zYXZlRFBMTF9BID0gSTkxNV9SRUFEKERQTExfQSk7Ci0JaWYgKElTX0k5NjVHKGRldikpCisJaWYgKElTX0lHRE5HKGRldikpIHsKKwkJZGV2X3ByaXYtPnNhdmVGUEEwID0gSTkxNV9SRUFEKFBDSF9GUEEwKTsKKwkJZGV2X3ByaXYtPnNhdmVGUEExID0gSTkxNV9SRUFEKFBDSF9GUEExKTsKKwkJZGV2X3ByaXYtPnNhdmVEUExMX0EgPSBJOTE1X1JFQUQoUENIX0RQTExfQSk7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPnNhdmVGUEEwID0gSTkxNV9SRUFEKEZQQTApOworCQlkZXZfcHJpdi0+c2F2ZUZQQTEgPSBJOTE1X1JFQUQoRlBBMSk7CisJCWRldl9wcml2LT5zYXZlRFBMTF9BID0gSTkxNV9SRUFEKERQTExfQSk7CisJfQorCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKQogCQlkZXZfcHJpdi0+c2F2ZURQTExfQV9NRCA9IEk5MTVfUkVBRChEUExMX0FfTUQpOwogCWRldl9wcml2LT5zYXZlSFRPVEFMX0EgPSBJOTE1X1JFQUQoSFRPVEFMX0EpOwogCWRldl9wcml2LT5zYXZlSEJMQU5LX0EgPSBJOTE1X1JFQUQoSEJMQU5LX0EpOwpAQCAtMjQyLDcgKzI1OSwyNCBAQAogCWRldl9wcml2LT5zYXZlVlRPVEFMX0EgPSBJOTE1X1JFQUQoVlRPVEFMX0EpOwogCWRldl9wcml2LT5zYXZlVkJMQU5LX0EgPSBJOTE1X1JFQUQoVkJMQU5LX0EpOwogCWRldl9wcml2LT5zYXZlVlNZTkNfQSA9IEk5MTVfUkVBRChWU1lOQ19BKTsKLQlkZXZfcHJpdi0+c2F2ZUJDTFJQQVRfQSA9IEk5MTVfUkVBRChCQ0xSUEFUX0EpOworCWlmICghSVNfSUdETkcoZGV2KSkKKwkJZGV2X3ByaXYtPnNhdmVCQ0xSUEFUX0EgPSBJOTE1X1JFQUQoQkNMUlBBVF9BKTsKKworCWlmIChJU19JR0RORyhkZXYpKSB7CisJCWRldl9wcml2LT5zYXZlRkRJX1RYQV9DVEwgPSBJOTE1X1JFQUQoRkRJX1RYQV9DVEwpOworCQlkZXZfcHJpdi0+c2F2ZUZESV9SWEFfQ1RMID0gSTkxNV9SRUFEKEZESV9SWEFfQ1RMKTsKKworCQlkZXZfcHJpdi0+c2F2ZVBGQV9DVExfMSA9IEk5MTVfUkVBRChQRkFfQ1RMXzEpOworCQlkZXZfcHJpdi0+c2F2ZVBGQV9XSU5fU1ogPSBJOTE1X1JFQUQoUEZBX1dJTl9TWik7CisJCWRldl9wcml2LT5zYXZlUEZBX1dJTl9QT1MgPSBJOTE1X1JFQUQoUEZBX1dJTl9QT1MpOworCisJCWRldl9wcml2LT5zYXZlVFJBTlNfSFRPVEFMX0EgPSBJOTE1X1JFQUQoVFJBTlNfSFRPVEFMX0EpOworCQlkZXZfcHJpdi0+c2F2ZVRSQU5TX0hCTEFOS19BID0gSTkxNV9SRUFEKFRSQU5TX0hCTEFOS19BKTsKKwkJZGV2X3ByaXYtPnNhdmVUUkFOU19IU1lOQ19BID0gSTkxNV9SRUFEKFRSQU5TX0hTWU5DX0EpOworCQlkZXZfcHJpdi0+c2F2ZVRSQU5TX1ZUT1RBTF9BID0gSTkxNV9SRUFEKFRSQU5TX1ZUT1RBTF9BKTsKKwkJZGV2X3ByaXYtPnNhdmVUUkFOU19WQkxBTktfQSA9IEk5MTVfUkVBRChUUkFOU19WQkxBTktfQSk7CisJCWRldl9wcml2LT5zYXZlVFJBTlNfVlNZTkNfQSA9IEk5MTVfUkVBRChUUkFOU19WU1lOQ19BKTsKKwl9CiAKIAlkZXZfcHJpdi0+c2F2ZURTUEFDTlRSID0gSTkxNV9SRUFEKERTUEFDTlRSKTsKIAlkZXZfcHJpdi0+c2F2ZURTUEFTVFJJREUgPSBJOTE1X1JFQUQoRFNQQVNUUklERSk7CkBAIC0yNTksMTAgKzI5MywxNiBAQAogCS8qIFBpcGUgJiBwbGFuZSBCIGluZm8gKi8KIAlkZXZfcHJpdi0+c2F2ZVBJUEVCQ09ORiA9IEk5MTVfUkVBRChQSVBFQkNPTkYpOwogCWRldl9wcml2LT5zYXZlUElQRUJTUkMgPSBJOTE1X1JFQUQoUElQRUJTUkMpOwotCWRldl9wcml2LT5zYXZlRlBCMCA9IEk5MTVfUkVBRChGUEIwKTsKLQlkZXZfcHJpdi0+c2F2ZUZQQjEgPSBJOTE1X1JFQUQoRlBCMSk7Ci0JZGV2X3ByaXYtPnNhdmVEUExMX0IgPSBJOTE1X1JFQUQoRFBMTF9CKTsKLQlpZiAoSVNfSTk2NUcoZGV2KSkKKwlpZiAoSVNfSUdETkcoZGV2KSkgeworCQlkZXZfcHJpdi0+c2F2ZUZQQjAgPSBJOTE1X1JFQUQoUENIX0ZQQjApOworCQlkZXZfcHJpdi0+c2F2ZUZQQjEgPSBJOTE1X1JFQUQoUENIX0ZQQjEpOworCQlkZXZfcHJpdi0+c2F2ZURQTExfQiA9IEk5MTVfUkVBRChQQ0hfRFBMTF9CKTsKKwl9IGVsc2UgeworCQlkZXZfcHJpdi0+c2F2ZUZQQjAgPSBJOTE1X1JFQUQoRlBCMCk7CisJCWRldl9wcml2LT5zYXZlRlBCMSA9IEk5MTVfUkVBRChGUEIxKTsKKwkJZGV2X3ByaXYtPnNhdmVEUExMX0IgPSBJOTE1X1JFQUQoRFBMTF9CKTsKKwl9CisJaWYgKElTX0k5NjVHKGRldikgJiYgIUlTX0lHRE5HKGRldikpCiAJCWRldl9wcml2LT5zYXZlRFBMTF9CX01EID0gSTkxNV9SRUFEKERQTExfQl9NRCk7CiAJZGV2X3ByaXYtPnNhdmVIVE9UQUxfQiA9IEk5MTVfUkVBRChIVE9UQUxfQik7CiAJZGV2X3ByaXYtPnNhdmVIQkxBTktfQiA9IEk5MTVfUkVBRChIQkxBTktfQik7CkBAIC0yNzAsNyArMzEwLDI0IEBACiAJZGV2X3ByaXYtPnNhdmVWVE9UQUxfQiA9IEk5MTVfUkVBRChWVE9UQUxfQik7CiAJZGV2X3ByaXYtPnNhdmVWQkxBTktfQiA9IEk5MTVfUkVBRChWQkxBTktfQik7CiAJZGV2X3ByaXYtPnNhdmVWU1lOQ19CID0gSTkxNV9SRUFEKFZTWU5DX0IpOwotCWRldl9wcml2LT5zYXZlQkNMUlBBVF9BID0gSTkxNV9SRUFEKEJDTFJQQVRfQSk7CisJaWYgKCFJU19JR0RORyhkZXYpKQorCQlkZXZfcHJpdi0+c2F2ZUJDTFJQQVRfQiA9IEk5MTVfUkVBRChCQ0xSUEFUX0IpOworCisJaWYgKElTX0lHRE5HKGRldikpIHsKKwkJZGV2X3ByaXYtPnNhdmVGRElfVFhCX0NUTCA9IEk5MTVfUkVBRChGRElfVFhCX0NUTCk7CisJCWRldl9wcml2LT5zYXZlRkRJX1JYQl9DVEwgPSBJOTE1X1JFQUQoRkRJX1JYQl9DVEwpOworCisJCWRldl9wcml2LT5zYXZlUEZCX0NUTF8xID0gSTkxNV9SRUFEKFBGQl9DVExfMSk7CisJCWRldl9wcml2LT5zYXZlUEZCX1dJTl9TWiA9IEk5MTVfUkVBRChQRkJfV0lOX1NaKTsKKwkJZGV2X3ByaXYtPnNhdmVQRkJfV0lOX1BPUyA9IEk5MTVfUkVBRChQRkJfV0lOX1BPUyk7CisKKwkJZGV2X3ByaXYtPnNhdmVUUkFOU19IVE9UQUxfQiA9IEk5MTVfUkVBRChUUkFOU19IVE9UQUxfQik7CisJCWRldl9wcml2LT5zYXZlVFJBTlNfSEJMQU5LX0IgPSBJOTE1X1JFQUQoVFJBTlNfSEJMQU5LX0IpOworCQlkZXZfcHJpdi0+c2F2ZVRSQU5TX0hTWU5DX0IgPSBJOTE1X1JFQUQoVFJBTlNfSFNZTkNfQik7CisJCWRldl9wcml2LT5zYXZlVFJBTlNfVlRPVEFMX0IgPSBJOTE1X1JFQUQoVFJBTlNfVlRPVEFMX0IpOworCQlkZXZfcHJpdi0+c2F2ZVRSQU5TX1ZCTEFOS19CID0gSTkxNV9SRUFEKFRSQU5TX1ZCTEFOS19CKTsKKwkJZGV2X3ByaXYtPnNhdmVUUkFOU19WU1lOQ19CID0gSTkxNV9SRUFEKFRSQU5TX1ZTWU5DX0IpOworCX0KIAogCWRldl9wcml2LT5zYXZlRFNQQkNOVFIgPSBJOTE1X1JFQUQoRFNQQkNOVFIpOwogCWRldl9wcml2LT5zYXZlRFNQQlNUUklERSA9IEk5MTVfUkVBRChEU1BCU1RSSURFKTsKQEAgLTI4NSwyNiArMzQyLDQ1IEBACiAJZGV2X3ByaXYtPnNhdmVQSVBFQlNUQVQgPSBJOTE1X1JFQUQoUElQRUJTVEFUKTsKIAlyZXR1cm47CiB9CisKIHN0YXRpYyB2b2lkIGk5MTVfcmVzdG9yZV9tb2Rlc2V0X3JlZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGRwbGxfYV9yZWcsIGZwYTBfcmVnLCBmcGExX3JlZzsKKwlpbnQgZHBsbF9iX3JlZywgZnBiMF9yZWcsIGZwYjFfcmVnOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCXJldHVybjsKIAorCWlmIChJU19JR0RORyhkZXYpKSB7CisJCWRwbGxfYV9yZWcgPSBQQ0hfRFBMTF9BOworCQlkcGxsX2JfcmVnID0gUENIX0RQTExfQjsKKwkJZnBhMF9yZWcgPSBQQ0hfRlBBMDsKKwkJZnBiMF9yZWcgPSBQQ0hfRlBCMDsKKwkJZnBhMV9yZWcgPSBQQ0hfRlBBMTsKKwkJZnBiMV9yZWcgPSBQQ0hfRlBCMTsKKwl9IGVsc2UgeworCQlkcGxsX2FfcmVnID0gRFBMTF9BOworCQlkcGxsX2JfcmVnID0gRFBMTF9COworCQlmcGEwX3JlZyA9IEZQQTA7CisJCWZwYjBfcmVnID0gRlBCMDsKKwkJZnBhMV9yZWcgPSBGUEExOworCQlmcGIxX3JlZyA9IEZQQjE7CisJfQorCiAJLyogUGlwZSAmIHBsYW5lIEEgaW5mbyAqLwogCS8qIFByaW1lIHRoZSBjbG9jayAqLwogCWlmIChkZXZfcHJpdi0+c2F2ZURQTExfQSAmIERQTExfVkNPX0VOQUJMRSkgewotCQlJOTE1X1dSSVRFKERQTExfQSwgZGV2X3ByaXYtPnNhdmVEUExMX0EgJgorCQlJOTE1X1dSSVRFKGRwbGxfYV9yZWcsIGRldl9wcml2LT5zYXZlRFBMTF9BICYKIAkJCSAgIH5EUExMX1ZDT19FTkFCTEUpOwogCQlEUk1fVURFTEFZKDE1MCk7CiAJfQotCUk5MTVfV1JJVEUoRlBBMCwgZGV2X3ByaXYtPnNhdmVGUEEwKTsKLQlJOTE1X1dSSVRFKEZQQTEsIGRldl9wcml2LT5zYXZlRlBBMSk7CisJSTkxNV9XUklURShmcGEwX3JlZywgZGV2X3ByaXYtPnNhdmVGUEEwKTsKKwlJOTE1X1dSSVRFKGZwYTFfcmVnLCBkZXZfcHJpdi0+c2F2ZUZQQTEpOwogCS8qIEFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCUk5MTVfV1JJVEUoRFBMTF9BLCBkZXZfcHJpdi0+c2F2ZURQTExfQSk7CisJSTkxNV9XUklURShkcGxsX2FfcmVnLCBkZXZfcHJpdi0+c2F2ZURQTExfQSk7CiAJRFJNX1VERUxBWSgxNTApOwotCWlmIChJU19JOTY1RyhkZXYpKQorCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKQogCQlJOTE1X1dSSVRFKERQTExfQV9NRCwgZGV2X3ByaXYtPnNhdmVEUExMX0FfTUQpOwogCURSTV9VREVMQVkoMTUwKTsKIApAQCAtMzE1LDcgKzM5MSwyNCBAQAogCUk5MTVfV1JJVEUoVlRPVEFMX0EsIGRldl9wcml2LT5zYXZlVlRPVEFMX0EpOwogCUk5MTVfV1JJVEUoVkJMQU5LX0EsIGRldl9wcml2LT5zYXZlVkJMQU5LX0EpOwogCUk5MTVfV1JJVEUoVlNZTkNfQSwgZGV2X3ByaXYtPnNhdmVWU1lOQ19BKTsKLQlJOTE1X1dSSVRFKEJDTFJQQVRfQSwgZGV2X3ByaXYtPnNhdmVCQ0xSUEFUX0EpOworCWlmICghSVNfSUdETkcoZGV2KSkKKwkJSTkxNV9XUklURShCQ0xSUEFUX0EsIGRldl9wcml2LT5zYXZlQkNMUlBBVF9BKTsKKworCWlmIChJU19JR0RORyhkZXYpKSB7CisJCUk5MTVfV1JJVEUoRkRJX1JYQV9DVEwsIGRldl9wcml2LT5zYXZlRkRJX1JYQV9DVEwpOworCQlJOTE1X1dSSVRFKEZESV9UWEFfQ1RMLCBkZXZfcHJpdi0+c2F2ZUZESV9UWEFfQ1RMKTsKKworCQlJOTE1X1dSSVRFKFBGQV9DVExfMSwgZGV2X3ByaXYtPnNhdmVQRkFfQ1RMXzEpOworCQlJOTE1X1dSSVRFKFBGQV9XSU5fU1osIGRldl9wcml2LT5zYXZlUEZBX1dJTl9TWik7CisJCUk5MTVfV1JJVEUoUEZBX1dJTl9QT1MsIGRldl9wcml2LT5zYXZlUEZBX1dJTl9QT1MpOworCisJCUk5MTVfV1JJVEUoVFJBTlNfSFRPVEFMX0EsIGRldl9wcml2LT5zYXZlVFJBTlNfSFRPVEFMX0EpOworCQlJOTE1X1dSSVRFKFRSQU5TX0hCTEFOS19BLCBkZXZfcHJpdi0+c2F2ZVRSQU5TX0hCTEFOS19BKTsKKwkJSTkxNV9XUklURShUUkFOU19IU1lOQ19BLCBkZXZfcHJpdi0+c2F2ZVRSQU5TX0hTWU5DX0EpOworCQlJOTE1X1dSSVRFKFRSQU5TX1ZUT1RBTF9BLCBkZXZfcHJpdi0+c2F2ZVRSQU5TX1ZUT1RBTF9BKTsKKwkJSTkxNV9XUklURShUUkFOU19WQkxBTktfQSwgZGV2X3ByaXYtPnNhdmVUUkFOU19WQkxBTktfQSk7CisJCUk5MTVfV1JJVEUoVFJBTlNfVlNZTkNfQSwgZGV2X3ByaXYtPnNhdmVUUkFOU19WU1lOQ19BKTsKKwl9CiAKIAkvKiBSZXN0b3JlIHBsYW5lIGluZm8gKi8KIAlJOTE1X1dSSVRFKERTUEFTSVpFLCBkZXZfcHJpdi0+c2F2ZURTUEFTSVpFKTsKQEAgLTMzNywxNCArNDMwLDE0IEBACiAKIAkvKiBQaXBlICYgcGxhbmUgQiBpbmZvICovCiAJaWYgKGRldl9wcml2LT5zYXZlRFBMTF9CICYgRFBMTF9WQ09fRU5BQkxFKSB7Ci0JCUk5MTVfV1JJVEUoRFBMTF9CLCBkZXZfcHJpdi0+c2F2ZURQTExfQiAmCisJCUk5MTVfV1JJVEUoZHBsbF9iX3JlZywgZGV2X3ByaXYtPnNhdmVEUExMX0IgJgogCQkJICAgfkRQTExfVkNPX0VOQUJMRSk7CiAJCURSTV9VREVMQVkoMTUwKTsKIAl9Ci0JSTkxNV9XUklURShGUEIwLCBkZXZfcHJpdi0+c2F2ZUZQQjApOwotCUk5MTVfV1JJVEUoRlBCMSwgZGV2X3ByaXYtPnNhdmVGUEIxKTsKKwlJOTE1X1dSSVRFKGZwYjBfcmVnLCBkZXZfcHJpdi0+c2F2ZUZQQjApOworCUk5MTVfV1JJVEUoZnBiMV9yZWcsIGRldl9wcml2LT5zYXZlRlBCMSk7CiAJLyogQWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JSTkxNV9XUklURShEUExMX0IsIGRldl9wcml2LT5zYXZlRFBMTF9CKTsKKwlJOTE1X1dSSVRFKGRwbGxfYl9yZWcsIGRldl9wcml2LT5zYXZlRFBMTF9CKTsKIAlEUk1fVURFTEFZKDE1MCk7CiAJaWYgKElTX0k5NjVHKGRldikpCiAJCUk5MTVfV1JJVEUoRFBMTF9CX01ELCBkZXZfcHJpdi0+c2F2ZURQTExfQl9NRCk7CkBAIC0zNTcsNyArNDUwLDI0IEBACiAJSTkxNV9XUklURShWVE9UQUxfQiwgZGV2X3ByaXYtPnNhdmVWVE9UQUxfQik7CiAJSTkxNV9XUklURShWQkxBTktfQiwgZGV2X3ByaXYtPnNhdmVWQkxBTktfQik7CiAJSTkxNV9XUklURShWU1lOQ19CLCBkZXZfcHJpdi0+c2F2ZVZTWU5DX0IpOwotCUk5MTVfV1JJVEUoQkNMUlBBVF9CLCBkZXZfcHJpdi0+c2F2ZUJDTFJQQVRfQik7CisJaWYgKCFJU19JR0RORyhkZXYpKQorCQlJOTE1X1dSSVRFKEJDTFJQQVRfQiwgZGV2X3ByaXYtPnNhdmVCQ0xSUEFUX0IpOworCisJaWYgKElTX0lHRE5HKGRldikpIHsKKwkJSTkxNV9XUklURShGRElfUlhCX0NUTCwgZGV2X3ByaXYtPnNhdmVGRElfUlhCX0NUTCk7CisJCUk5MTVfV1JJVEUoRkRJX1RYQl9DVEwsIGRldl9wcml2LT5zYXZlRkRJX1RYQl9DVEwpOworCisJCUk5MTVfV1JJVEUoUEZCX0NUTF8xLCBkZXZfcHJpdi0+c2F2ZVBGQl9DVExfMSk7CisJCUk5MTVfV1JJVEUoUEZCX1dJTl9TWiwgZGV2X3ByaXYtPnNhdmVQRkJfV0lOX1NaKTsKKwkJSTkxNV9XUklURShQRkJfV0lOX1BPUywgZGV2X3ByaXYtPnNhdmVQRkJfV0lOX1BPUyk7CisKKwkJSTkxNV9XUklURShUUkFOU19IVE9UQUxfQiwgZGV2X3ByaXYtPnNhdmVUUkFOU19IVE9UQUxfQik7CisJCUk5MTVfV1JJVEUoVFJBTlNfSEJMQU5LX0IsIGRldl9wcml2LT5zYXZlVFJBTlNfSEJMQU5LX0IpOworCQlJOTE1X1dSSVRFKFRSQU5TX0hTWU5DX0IsIGRldl9wcml2LT5zYXZlVFJBTlNfSFNZTkNfQik7CisJCUk5MTVfV1JJVEUoVFJBTlNfVlRPVEFMX0IsIGRldl9wcml2LT5zYXZlVFJBTlNfVlRPVEFMX0IpOworCQlJOTE1X1dSSVRFKFRSQU5TX1ZCTEFOS19CLCBkZXZfcHJpdi0+c2F2ZVRSQU5TX1ZCTEFOS19CKTsKKwkJSTkxNV9XUklURShUUkFOU19WU1lOQ19CLCBkZXZfcHJpdi0+c2F2ZVRSQU5TX1ZTWU5DX0IpOworCX0KIAogCS8qIFJlc3RvcmUgcGxhbmUgaW5mbyAqLwogCUk5MTVfV1JJVEUoRFNQQlNJWkUsIGRldl9wcml2LT5zYXZlRFNQQlNJWkUpOwpAQCAtMzc5LDE5ICs0ODksMTAgQEAKIAogCXJldHVybjsKIH0KLWludCBpOTE1X3NhdmVfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKKwordm9pZCBpOTE1X3NhdmVfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IGk7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYtPnBkZXYsIExCQiwgJmRldl9wcml2LT5zYXZlTEJCKTsKLQotCS8qIFJlbmRlciBTdGFuZGJ5ICovCi0JaWYgKElTX0k5NjVHKGRldikgJiYgSVNfTU9CSUxFKGRldikpCi0JCWRldl9wcml2LT5zYXZlUkVOREVSU1RBTkRCWSA9IEk5MTVfUkVBRChNQ0hCQVJfUkVOREVSX1NUQU5EQlkpOwotCi0JLyogSGFyZHdhcmUgc3RhdHVzIHBhZ2UgKi8KLQlkZXZfcHJpdi0+c2F2ZUhXUyA9IEk5MTVfUkVBRChIV1NfUEdBKTsKIAogCS8qIERpc3BsYXkgYXJiaXRyYXRpb24gY29udHJvbCAqLwogCWRldl9wcml2LT5zYXZlRFNQQVJCID0gSTkxNV9SRUFEKERTUEFSQik7CkBAIC0zOTksNiArNTAwLDcgQEAKIAkvKiBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBpbiBub24tS01TIG1vZGUgKi8KIAkvKiBEb24ndCBzYXZlIHRoZW0gaW4gS01TIG1vZGUgKi8KIAlpOTE1X3NhdmVfbW9kZXNldF9yZWcoZGV2KTsKKwogCS8qIEN1cnNvciBzdGF0ZSAqLwogCWRldl9wcml2LT5zYXZlQ1VSQUNOVFIgPSBJOTE1X1JFQUQoQ1VSQUNOVFIpOwogCWRldl9wcml2LT5zYXZlQ1VSQVBPUyA9IEk5MTVfUkVBRChDVVJBUE9TKTsKQEAgLTQxMCwyMSArNTEyLDQzIEBACiAJCWRldl9wcml2LT5zYXZlQ1VSU0laRSA9IEk5MTVfUkVBRChDVVJTSVpFKTsKIAogCS8qIENSVCBzdGF0ZSAqLwotCWRldl9wcml2LT5zYXZlQURQQSA9IEk5MTVfUkVBRChBRFBBKTsKKwlpZiAoSVNfSUdETkcoZGV2KSkgeworCQlkZXZfcHJpdi0+c2F2ZUFEUEEgPSBJOTE1X1JFQUQoUENIX0FEUEEpOworCX0gZWxzZSB7CisJCWRldl9wcml2LT5zYXZlQURQQSA9IEk5MTVfUkVBRChBRFBBKTsKKwl9CiAKIAkvKiBMVkRTIHN0YXRlICovCi0JZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MID0gSTkxNV9SRUFEKFBQX0NPTlRST0wpOwotCWRldl9wcml2LT5zYXZlUEZJVF9QR01fUkFUSU9TID0gSTkxNV9SRUFEKFBGSVRfUEdNX1JBVElPUyk7Ci0JZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCk7Ci0JaWYgKElTX0k5NjVHKGRldikpCi0JCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMMik7Ci0JaWYgKElTX01PQklMRShkZXYpICYmICFJU19JODMwKGRldikpCi0JCWRldl9wcml2LT5zYXZlTFZEUyA9IEk5MTVfUkVBRChMVkRTKTsKLQlpZiAoIUlTX0k4MzAoZGV2KSAmJiAhSVNfODQ1RyhkZXYpKQorCWlmIChJU19JR0RORyhkZXYpKSB7CisJCWRldl9wcml2LT5zYXZlUFBfQ09OVFJPTCA9IEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMSk7CisJCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyID0gSTkxNV9SRUFEKEJMQ19QV01fUENIX0NUTDIpOworCQlkZXZfcHJpdi0+c2F2ZUJMQ19DUFVfUFdNX0NUTCA9IEk5MTVfUkVBRChCTENfUFdNX0NQVV9DVEwpOworCQlkZXZfcHJpdi0+c2F2ZUJMQ19DUFVfUFdNX0NUTDIgPSBJOTE1X1JFQUQoQkxDX1BXTV9DUFVfQ1RMMik7CisJCWRldl9wcml2LT5zYXZlTFZEUyA9IEk5MTVfUkVBRChQQ0hfTFZEUyk7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MID0gSTkxNV9SRUFEKFBQX0NPTlRST0wpOworCQlkZXZfcHJpdi0+c2F2ZVBGSVRfUEdNX1JBVElPUyA9IEk5MTVfUkVBRChQRklUX1BHTV9SQVRJT1MpOworCQlkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMKTsKKwkJZGV2X3ByaXYtPnNhdmVCTENfSElTVF9DVEwgPSBJOTE1X1JFQUQoQkxDX0hJU1RfQ1RMKTsKKwkJaWYgKElTX0k5NjVHKGRldikpCisJCQlkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMMiA9IEk5MTVfUkVBRChCTENfUFdNX0NUTDIpOworCQlpZiAoSVNfTU9CSUxFKGRldikgJiYgIUlTX0k4MzAoZGV2KSkKKwkJCWRldl9wcml2LT5zYXZlTFZEUyA9IEk5MTVfUkVBRChMVkRTKTsKKwl9CisKKwlpZiAoIUlTX0k4MzAoZGV2KSAmJiAhSVNfODQ1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKQogCQlkZXZfcHJpdi0+c2F2ZVBGSVRfQ09OVFJPTCA9IEk5MTVfUkVBRChQRklUX0NPTlRST0wpOwotCWRldl9wcml2LT5zYXZlUFBfT05fREVMQVlTID0gSTkxNV9SRUFEKFBQX09OX0RFTEFZUyk7Ci0JZGV2X3ByaXYtPnNhdmVQUF9PRkZfREVMQVlTID0gSTkxNV9SRUFEKFBQX09GRl9ERUxBWVMpOwotCWRldl9wcml2LT5zYXZlUFBfRElWSVNPUiA9IEk5MTVfUkVBRChQUF9ESVZJU09SKTsKKworCWlmIChJU19JR0RORyhkZXYpKSB7CisJCWRldl9wcml2LT5zYXZlUFBfT05fREVMQVlTID0gSTkxNV9SRUFEKFBDSF9QUF9PTl9ERUxBWVMpOworCQlkZXZfcHJpdi0+c2F2ZVBQX09GRl9ERUxBWVMgPSBJOTE1X1JFQUQoUENIX1BQX09GRl9ERUxBWVMpOworCQlkZXZfcHJpdi0+c2F2ZVBQX0RJVklTT1IgPSBJOTE1X1JFQUQoUENIX1BQX0RJVklTT1IpOworCX0gZWxzZSB7CisJCWRldl9wcml2LT5zYXZlUFBfT05fREVMQVlTID0gSTkxNV9SRUFEKFBQX09OX0RFTEFZUyk7CisJCWRldl9wcml2LT5zYXZlUFBfT0ZGX0RFTEFZUyA9IEk5MTVfUkVBRChQUF9PRkZfREVMQVlTKTsKKwkJZGV2X3ByaXYtPnNhdmVQUF9ESVZJU09SID0gSTkxNV9SRUFEKFBQX0RJVklTT1IpOworCX0KIAogCS8qIERpc3BsYXkgUG9ydCBzdGF0ZSAqLwogCWlmIChTVVBQT1JUU19JTlRFR1JBVEVEX0RQKGRldikpIHsKQEAgLTQ0MywyNSArNTY3LDE2MiBAQAogCS8qIEZJWE1FOiBzYXZlIFRWICYgU0RWTyBzdGF0ZSAqLwogCiAJLyogRkJDIHN0YXRlICovCi0JZGV2X3ByaXYtPnNhdmVGQkNfQ0ZCX0JBU0UgPSBJOTE1X1JFQUQoRkJDX0NGQl9CQVNFKTsKLQlkZXZfcHJpdi0+c2F2ZUZCQ19MTF9CQVNFID0gSTkxNV9SRUFEKEZCQ19MTF9CQVNFKTsKLQlkZXZfcHJpdi0+c2F2ZUZCQ19DT05UUk9MMiA9IEk5MTVfUkVBRChGQkNfQ09OVFJPTDIpOwotCWRldl9wcml2LT5zYXZlRkJDX0NPTlRST0wgPSBJOTE1X1JFQUQoRkJDX0NPTlRST0wpOwotCi0JLyogSW50ZXJydXB0IHN0YXRlICovCi0JZGV2X3ByaXYtPnNhdmVJSVIgPSBJOTE1X1JFQUQoSUlSKTsKLQlkZXZfcHJpdi0+c2F2ZUlFUiA9IEk5MTVfUkVBRChJRVIpOwotCWRldl9wcml2LT5zYXZlSU1SID0gSTkxNV9SRUFEKElNUik7CisJaWYgKElTX0dNNDUoZGV2KSkgeworCQlkZXZfcHJpdi0+c2F2ZURQRkNfQ0JfQkFTRSA9IEk5MTVfUkVBRChEUEZDX0NCX0JBU0UpOworCX0gZWxzZSB7CisJCWRldl9wcml2LT5zYXZlRkJDX0NGQl9CQVNFID0gSTkxNV9SRUFEKEZCQ19DRkJfQkFTRSk7CisJCWRldl9wcml2LT5zYXZlRkJDX0xMX0JBU0UgPSBJOTE1X1JFQUQoRkJDX0xMX0JBU0UpOworCQlkZXZfcHJpdi0+c2F2ZUZCQ19DT05UUk9MMiA9IEk5MTVfUkVBRChGQkNfQ09OVFJPTDIpOworCQlkZXZfcHJpdi0+c2F2ZUZCQ19DT05UUk9MID0gSTkxNV9SRUFEKEZCQ19DT05UUk9MKTsKKwl9CiAKIAkvKiBWR0Egc3RhdGUgKi8KIAlkZXZfcHJpdi0+c2F2ZVZHQTAgPSBJOTE1X1JFQUQoVkdBMCk7CiAJZGV2X3ByaXYtPnNhdmVWR0ExID0gSTkxNV9SRUFEKFZHQTEpOwogCWRldl9wcml2LT5zYXZlVkdBX1BEID0gSTkxNV9SRUFEKFZHQV9QRCk7Ci0JZGV2X3ByaXYtPnNhdmVWR0FDTlRSTCA9IEk5MTVfUkVBRChWR0FDTlRSTCk7CisJaWYgKElTX0lHRE5HKGRldikpCisJCWRldl9wcml2LT5zYXZlVkdBQ05UUkwgPSBJOTE1X1JFQUQoQ1BVX1ZHQUNOVFJMKTsKKwllbHNlCisJCWRldl9wcml2LT5zYXZlVkdBQ05UUkwgPSBJOTE1X1JFQUQoVkdBQ05UUkwpOworCisJaTkxNV9zYXZlX3ZnYShkZXYpOworfQorCit2b2lkIGk5MTVfcmVzdG9yZV9kaXNwbGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIERpc3BsYXkgYXJiaXRyYXRpb24gKi8KKwlJOTE1X1dSSVRFKERTUEFSQiwgZGV2X3ByaXYtPnNhdmVEU1BBUkIpOworCisJLyogRGlzcGxheSBwb3J0IHJhdGlvcyAobXVzdCBiZSBkb25lIGJlZm9yZSBjbG9jayBpcyBzZXQpICovCisJaWYgKFNVUFBPUlRTX0lOVEVHUkFURURfRFAoZGV2KSkgeworCQlJOTE1X1dSSVRFKFBJUEVBX0dNQ0hfREFUQV9NLCBkZXZfcHJpdi0+c2F2ZVBJUEVBX0dNQ0hfREFUQV9NKTsKKwkJSTkxNV9XUklURShQSVBFQl9HTUNIX0RBVEFfTSwgZGV2X3ByaXYtPnNhdmVQSVBFQl9HTUNIX0RBVEFfTSk7CisJCUk5MTVfV1JJVEUoUElQRUFfR01DSF9EQVRBX04sIGRldl9wcml2LT5zYXZlUElQRUFfR01DSF9EQVRBX04pOworCQlJOTE1X1dSSVRFKFBJUEVCX0dNQ0hfREFUQV9OLCBkZXZfcHJpdi0+c2F2ZVBJUEVCX0dNQ0hfREFUQV9OKTsKKwkJSTkxNV9XUklURShQSVBFQV9EUF9MSU5LX00sIGRldl9wcml2LT5zYXZlUElQRUFfRFBfTElOS19NKTsKKwkJSTkxNV9XUklURShQSVBFQl9EUF9MSU5LX00sIGRldl9wcml2LT5zYXZlUElQRUJfRFBfTElOS19NKTsKKwkJSTkxNV9XUklURShQSVBFQV9EUF9MSU5LX04sIGRldl9wcml2LT5zYXZlUElQRUFfRFBfTElOS19OKTsKKwkJSTkxNV9XUklURShQSVBFQl9EUF9MSU5LX04sIGRldl9wcml2LT5zYXZlUElQRUJfRFBfTElOS19OKTsKKwl9CisKKwkvKiBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBpbiBub24tS01TIG1vZGUgKi8KKwkvKiBEb24ndCByZXN0b3JlIHRoZW0gaW4gS01TIG1vZGUgKi8KKwlpOTE1X3Jlc3RvcmVfbW9kZXNldF9yZWcoZGV2KTsKKworCS8qIEN1cnNvciBzdGF0ZSAqLworCUk5MTVfV1JJVEUoQ1VSQVBPUywgZGV2X3ByaXYtPnNhdmVDVVJBUE9TKTsKKwlJOTE1X1dSSVRFKENVUkFDTlRSLCBkZXZfcHJpdi0+c2F2ZUNVUkFDTlRSKTsKKwlJOTE1X1dSSVRFKENVUkFCQVNFLCBkZXZfcHJpdi0+c2F2ZUNVUkFCQVNFKTsKKwlJOTE1X1dSSVRFKENVUkJQT1MsIGRldl9wcml2LT5zYXZlQ1VSQlBPUyk7CisJSTkxNV9XUklURShDVVJCQ05UUiwgZGV2X3ByaXYtPnNhdmVDVVJCQ05UUik7CisJSTkxNV9XUklURShDVVJCQkFTRSwgZGV2X3ByaXYtPnNhdmVDVVJCQkFTRSk7CisJaWYgKCFJU19JOVhYKGRldikpCisJCUk5MTVfV1JJVEUoQ1VSU0laRSwgZGV2X3ByaXYtPnNhdmVDVVJTSVpFKTsKKworCS8qIENSVCBzdGF0ZSAqLworCWlmIChJU19JR0RORyhkZXYpKQorCQlJOTE1X1dSSVRFKFBDSF9BRFBBLCBkZXZfcHJpdi0+c2F2ZUFEUEEpOworCWVsc2UKKwkJSTkxNV9XUklURShBRFBBLCBkZXZfcHJpdi0+c2F2ZUFEUEEpOworCisJLyogTFZEUyBzdGF0ZSAqLworCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKQorCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMMiwgZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTDIpOworCisJaWYgKElTX0lHRE5HKGRldikpIHsKKwkJSTkxNV9XUklURShQQ0hfTFZEUywgZGV2X3ByaXYtPnNhdmVMVkRTKTsKKwl9IGVsc2UgaWYgKElTX01PQklMRShkZXYpICYmICFJU19JODMwKGRldikpCisJCUk5MTVfV1JJVEUoTFZEUywgZGV2X3ByaXYtPnNhdmVMVkRTKTsKKworCWlmICghSVNfSTgzMChkZXYpICYmICFJU184NDVHKGRldikgJiYgIUlTX0lHRE5HKGRldikpCisJCUk5MTVfV1JJVEUoUEZJVF9DT05UUk9MLCBkZXZfcHJpdi0+c2F2ZVBGSVRfQ09OVFJPTCk7CisKKwlpZiAoSVNfSUdETkcoZGV2KSkgeworCQlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDEsIGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwpOworCQlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDIsIGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyKTsKKwkJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwsIGRldl9wcml2LT5zYXZlQkxDX0NQVV9QV01fQ1RMKTsKKwkJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwyLCBkZXZfcHJpdi0+c2F2ZUJMQ19DUFVfUFdNX0NUTDIpOworCQlJOTE1X1dSSVRFKFBDSF9QUF9PTl9ERUxBWVMsIGRldl9wcml2LT5zYXZlUFBfT05fREVMQVlTKTsKKwkJSTkxNV9XUklURShQQ0hfUFBfT0ZGX0RFTEFZUywgZGV2X3ByaXYtPnNhdmVQUF9PRkZfREVMQVlTKTsKKwkJSTkxNV9XUklURShQQ0hfUFBfRElWSVNPUiwgZGV2X3ByaXYtPnNhdmVQUF9ESVZJU09SKTsKKwkJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MKTsKKwl9IGVsc2UgeworCQlJOTE1X1dSSVRFKFBGSVRfUEdNX1JBVElPUywgZGV2X3ByaXYtPnNhdmVQRklUX1BHTV9SQVRJT1MpOworCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCBkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMKTsKKwkJSTkxNV9XUklURShCTENfSElTVF9DVEwsIGRldl9wcml2LT5zYXZlQkxDX0hJU1RfQ1RMKTsKKwkJSTkxNV9XUklURShQUF9PTl9ERUxBWVMsIGRldl9wcml2LT5zYXZlUFBfT05fREVMQVlTKTsKKwkJSTkxNV9XUklURShQUF9PRkZfREVMQVlTLCBkZXZfcHJpdi0+c2F2ZVBQX09GRl9ERUxBWVMpOworCQlJOTE1X1dSSVRFKFBQX0RJVklTT1IsIGRldl9wcml2LT5zYXZlUFBfRElWSVNPUik7CisJCUk5MTVfV1JJVEUoUFBfQ09OVFJPTCwgZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MKTsKKwl9CisKKwkvKiBEaXNwbGF5IFBvcnQgc3RhdGUgKi8KKwlpZiAoU1VQUE9SVFNfSU5URUdSQVRFRF9EUChkZXYpKSB7CisJCUk5MTVfV1JJVEUoRFBfQiwgZGV2X3ByaXYtPnNhdmVEUF9CKTsKKwkJSTkxNV9XUklURShEUF9DLCBkZXZfcHJpdi0+c2F2ZURQX0MpOworCQlJOTE1X1dSSVRFKERQX0QsIGRldl9wcml2LT5zYXZlRFBfRCk7CisJfQorCS8qIEZJWE1FOiByZXN0b3JlIFRWICYgU0RWTyBzdGF0ZSAqLworCisJLyogRkJDIGluZm8gKi8KKwlpZiAoSVNfR000NShkZXYpKSB7CisJCWc0eF9kaXNhYmxlX2ZiYyhkZXYpOworCQlJOTE1X1dSSVRFKERQRkNfQ0JfQkFTRSwgZGV2X3ByaXYtPnNhdmVEUEZDX0NCX0JBU0UpOworCX0gZWxzZSB7CisJCWk4eHhfZGlzYWJsZV9mYmMoZGV2KTsKKwkJSTkxNV9XUklURShGQkNfQ0ZCX0JBU0UsIGRldl9wcml2LT5zYXZlRkJDX0NGQl9CQVNFKTsKKwkJSTkxNV9XUklURShGQkNfTExfQkFTRSwgZGV2X3ByaXYtPnNhdmVGQkNfTExfQkFTRSk7CisJCUk5MTVfV1JJVEUoRkJDX0NPTlRST0wyLCBkZXZfcHJpdi0+c2F2ZUZCQ19DT05UUk9MMik7CisJCUk5MTVfV1JJVEUoRkJDX0NPTlRST0wsIGRldl9wcml2LT5zYXZlRkJDX0NPTlRST0wpOworCX0KKworCS8qIFZHQSBzdGF0ZSAqLworCWlmIChJU19JR0RORyhkZXYpKQorCQlJOTE1X1dSSVRFKENQVV9WR0FDTlRSTCwgZGV2X3ByaXYtPnNhdmVWR0FDTlRSTCk7CisJZWxzZQorCQlJOTE1X1dSSVRFKFZHQUNOVFJMLCBkZXZfcHJpdi0+c2F2ZVZHQUNOVFJMKTsKKwlJOTE1X1dSSVRFKFZHQTAsIGRldl9wcml2LT5zYXZlVkdBMCk7CisJSTkxNV9XUklURShWR0ExLCBkZXZfcHJpdi0+c2F2ZVZHQTEpOworCUk5MTVfV1JJVEUoVkdBX1BELCBkZXZfcHJpdi0+c2F2ZVZHQV9QRCk7CisJRFJNX1VERUxBWSgxNTApOworCisJaTkxNV9yZXN0b3JlX3ZnYShkZXYpOworfQorCitpbnQgaTkxNV9zYXZlX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldi0+cGRldiwgTEJCLCAmZGV2X3ByaXYtPnNhdmVMQkIpOworCisJLyogUmVuZGVyIFN0YW5kYnkgKi8KKwlpZiAoSVNfSTk2NUcoZGV2KSAmJiBJU19NT0JJTEUoZGV2KSkKKwkJZGV2X3ByaXYtPnNhdmVSRU5ERVJTVEFOREJZID0gSTkxNV9SRUFEKE1DSEJBUl9SRU5ERVJfU1RBTkRCWSk7CisKKwkvKiBIYXJkd2FyZSBzdGF0dXMgcGFnZSAqLworCWRldl9wcml2LT5zYXZlSFdTID0gSTkxNV9SRUFEKEhXU19QR0EpOworCisJaTkxNV9zYXZlX2Rpc3BsYXkoZGV2KTsKKworCS8qIEludGVycnVwdCBzdGF0ZSAqLworCWlmIChJU19JR0RORyhkZXYpKSB7CisJCWRldl9wcml2LT5zYXZlREVJRVIgPSBJOTE1X1JFQUQoREVJRVIpOworCQlkZXZfcHJpdi0+c2F2ZURFSU1SID0gSTkxNV9SRUFEKERFSU1SKTsKKwkJZGV2X3ByaXYtPnNhdmVHVElFUiA9IEk5MTVfUkVBRChHVElFUik7CisJCWRldl9wcml2LT5zYXZlR1RJTVIgPSBJOTE1X1JFQUQoR1RJTVIpOworCQlkZXZfcHJpdi0+c2F2ZUZESV9SWEFfSU1SID0gSTkxNV9SRUFEKEZESV9SWEFfSU1SKTsKKwkJZGV2X3ByaXYtPnNhdmVGRElfUlhCX0lNUiA9IEk5MTVfUkVBRChGRElfUlhCX0lNUik7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPnNhdmVJRVIgPSBJOTE1X1JFQUQoSUVSKTsKKwkJZGV2X3ByaXYtPnNhdmVJTVIgPSBJOTE1X1JFQUQoSU1SKTsKKwl9CiAKIAkvKiBDbG9jayBnYXRpbmcgc3RhdGUgKi8KIAlkZXZfcHJpdi0+c2F2ZURfU1RBVEUgPSBJOTE1X1JFQUQoRF9TVEFURSk7Ci0JZGV2X3ByaXYtPnNhdmVEU1BDTEtfR0FURV9EID0gSTkxNV9SRUFEKERTUENMS19HQVRFX0QpOworCWRldl9wcml2LT5zYXZlRFNQQ0xLX0dBVEVfRCA9IEk5MTVfUkVBRChEU1BDTEtfR0FURV9EKTsgLyogTm90IHN1cmUgYWJvdXQgdGhpcyAqLwogCiAJLyogQ2FjaGUgbW9kZSBzdGF0ZSAqLwogCWRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wID0gSTkxNV9SRUFEKENBQ0hFX01PREVfMCk7CkBAIC00ODksNyArNzUwLDYgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCQkJZGV2X3ByaXYtPnNhdmVGRU5DRVtpKzhdID0gSTkxNV9SRUFEKEZFTkNFX1JFR185NDVfOCArIChpICogNCkpOwogCX0KLQlpOTE1X3NhdmVfdmdhKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwOCw5ICs3NjgsNiBAQAogCS8qIEhhcmR3YXJlIHN0YXR1cyBwYWdlICovCiAJSTkxNV9XUklURShIV1NfUEdBLCBkZXZfcHJpdi0+c2F2ZUhXUyk7CiAKLQkvKiBEaXNwbGF5IGFyYml0cmF0aW9uICovCi0JSTkxNV9XUklURShEU1BBUkIsIGRldl9wcml2LT5zYXZlRFNQQVJCKTsKLQogCS8qIEZlbmNlcyAqLwogCWlmIChJU19JOTY1RyhkZXYpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQpAQCAtNTIyLDY5ICs3NzksMjEgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCQkJSTkxNV9XUklURShGRU5DRV9SRUdfOTQ1XzggKyAoaSAqIDQpLCBkZXZfcHJpdi0+c2F2ZUZFTkNFW2krOF0pOwogCX0KLQkKLQkvKiBEaXNwbGF5IHBvcnQgcmF0aW9zIChtdXN0IGJlIGRvbmUgYmVmb3JlIGNsb2NrIGlzIHNldCkgKi8KLQlpZiAoU1VQUE9SVFNfSU5URUdSQVRFRF9EUChkZXYpKSB7Ci0JCUk5MTVfV1JJVEUoUElQRUFfR01DSF9EQVRBX00sIGRldl9wcml2LT5zYXZlUElQRUFfR01DSF9EQVRBX00pOwotCQlJOTE1X1dSSVRFKFBJUEVCX0dNQ0hfREFUQV9NLCBkZXZfcHJpdi0+c2F2ZVBJUEVCX0dNQ0hfREFUQV9NKTsKLQkJSTkxNV9XUklURShQSVBFQV9HTUNIX0RBVEFfTiwgZGV2X3ByaXYtPnNhdmVQSVBFQV9HTUNIX0RBVEFfTik7Ci0JCUk5MTVfV1JJVEUoUElQRUJfR01DSF9EQVRBX04sIGRldl9wcml2LT5zYXZlUElQRUJfR01DSF9EQVRBX04pOwotCQlJOTE1X1dSSVRFKFBJUEVBX0RQX0xJTktfTSwgZGV2X3ByaXYtPnNhdmVQSVBFQV9EUF9MSU5LX00pOwotCQlJOTE1X1dSSVRFKFBJUEVCX0RQX0xJTktfTSwgZGV2X3ByaXYtPnNhdmVQSVBFQl9EUF9MSU5LX00pOwotCQlJOTE1X1dSSVRFKFBJUEVBX0RQX0xJTktfTiwgZGV2X3ByaXYtPnNhdmVQSVBFQV9EUF9MSU5LX04pOwotCQlJOTE1X1dSSVRFKFBJUEVCX0RQX0xJTktfTiwgZGV2X3ByaXYtPnNhdmVQSVBFQl9EUF9MSU5LX04pOworCisJaTkxNV9yZXN0b3JlX2Rpc3BsYXkoZGV2KTsKKworCS8qIEludGVycnVwdCBzdGF0ZSAqLworCWlmIChJU19JR0RORyhkZXYpKSB7CisJCUk5MTVfV1JJVEUoREVJRVIsIGRldl9wcml2LT5zYXZlREVJRVIpOworCQlJOTE1X1dSSVRFKERFSU1SLCBkZXZfcHJpdi0+c2F2ZURFSU1SKTsKKwkJSTkxNV9XUklURShHVElFUiwgZGV2X3ByaXYtPnNhdmVHVElFUik7CisJCUk5MTVfV1JJVEUoR1RJTVIsIGRldl9wcml2LT5zYXZlR1RJTVIpOworCQlJOTE1X1dSSVRFKEZESV9SWEFfSU1SLCBkZXZfcHJpdi0+c2F2ZUZESV9SWEFfSU1SKTsKKwkJSTkxNV9XUklURShGRElfUlhCX0lNUiwgZGV2X3ByaXYtPnNhdmVGRElfUlhCX0lNUik7CisJfSBlbHNlIHsKKwkJSTkxNV9XUklURSAoSUVSLCBkZXZfcHJpdi0+c2F2ZUlFUik7CisJCUk5MTVfV1JJVEUgKElNUiwgIGRldl9wcml2LT5zYXZlSU1SKTsKIAl9Ci0JLyogVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgaW4gbm9uLUtNUyBtb2RlICovCi0JLyogRG9uJ3QgcmVzdG9yZSB0aGVtIGluIEtNUyBtb2RlICovCi0JaTkxNV9yZXN0b3JlX21vZGVzZXRfcmVnKGRldik7Ci0JLyogQ3Vyc29yIHN0YXRlICovCi0JSTkxNV9XUklURShDVVJBUE9TLCBkZXZfcHJpdi0+c2F2ZUNVUkFQT1MpOwotCUk5MTVfV1JJVEUoQ1VSQUNOVFIsIGRldl9wcml2LT5zYXZlQ1VSQUNOVFIpOwotCUk5MTVfV1JJVEUoQ1VSQUJBU0UsIGRldl9wcml2LT5zYXZlQ1VSQUJBU0UpOwotCUk5MTVfV1JJVEUoQ1VSQlBPUywgZGV2X3ByaXYtPnNhdmVDVVJCUE9TKTsKLQlJOTE1X1dSSVRFKENVUkJDTlRSLCBkZXZfcHJpdi0+c2F2ZUNVUkJDTlRSKTsKLQlJOTE1X1dSSVRFKENVUkJCQVNFLCBkZXZfcHJpdi0+c2F2ZUNVUkJCQVNFKTsKLQlpZiAoIUlTX0k5WFgoZGV2KSkKLQkJSTkxNV9XUklURShDVVJTSVpFLCBkZXZfcHJpdi0+c2F2ZUNVUlNJWkUpOwotCi0JLyogQ1JUIHN0YXRlICovCi0JSTkxNV9XUklURShBRFBBLCBkZXZfcHJpdi0+c2F2ZUFEUEEpOwotCi0JLyogTFZEUyBzdGF0ZSAqLwotCWlmIChJU19JOTY1RyhkZXYpKQotCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMMiwgZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTDIpOwotCWlmIChJU19NT0JJTEUoZGV2KSAmJiAhSVNfSTgzMChkZXYpKQotCQlJOTE1X1dSSVRFKExWRFMsIGRldl9wcml2LT5zYXZlTFZEUyk7Ci0JaWYgKCFJU19JODMwKGRldikgJiYgIUlTXzg0NUcoZGV2KSkKLQkJSTkxNV9XUklURShQRklUX0NPTlRST0wsIGRldl9wcml2LT5zYXZlUEZJVF9DT05UUk9MKTsKLQotCUk5MTVfV1JJVEUoUEZJVF9QR01fUkFUSU9TLCBkZXZfcHJpdi0+c2F2ZVBGSVRfUEdNX1JBVElPUyk7Ci0JSTkxNV9XUklURShCTENfUFdNX0NUTCwgZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCk7Ci0JSTkxNV9XUklURShQUF9PTl9ERUxBWVMsIGRldl9wcml2LT5zYXZlUFBfT05fREVMQVlTKTsKLQlJOTE1X1dSSVRFKFBQX09GRl9ERUxBWVMsIGRldl9wcml2LT5zYXZlUFBfT0ZGX0RFTEFZUyk7Ci0JSTkxNV9XUklURShQUF9ESVZJU09SLCBkZXZfcHJpdi0+c2F2ZVBQX0RJVklTT1IpOwotCUk5MTVfV1JJVEUoUFBfQ09OVFJPTCwgZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MKTsKLQotCS8qIERpc3BsYXkgUG9ydCBzdGF0ZSAqLwotCWlmIChTVVBQT1JUU19JTlRFR1JBVEVEX0RQKGRldikpIHsKLQkJSTkxNV9XUklURShEUF9CLCBkZXZfcHJpdi0+c2F2ZURQX0IpOwotCQlJOTE1X1dSSVRFKERQX0MsIGRldl9wcml2LT5zYXZlRFBfQyk7Ci0JCUk5MTVfV1JJVEUoRFBfRCwgZGV2X3ByaXYtPnNhdmVEUF9EKTsKLQl9Ci0JLyogRklYTUU6IHJlc3RvcmUgVFYgJiBTRFZPIHN0YXRlICovCi0KLQkvKiBGQkMgaW5mbyAqLwotCUk5MTVfV1JJVEUoRkJDX0NGQl9CQVNFLCBkZXZfcHJpdi0+c2F2ZUZCQ19DRkJfQkFTRSk7Ci0JSTkxNV9XUklURShGQkNfTExfQkFTRSwgZGV2X3ByaXYtPnNhdmVGQkNfTExfQkFTRSk7Ci0JSTkxNV9XUklURShGQkNfQ09OVFJPTDIsIGRldl9wcml2LT5zYXZlRkJDX0NPTlRST0wyKTsKLQlJOTE1X1dSSVRFKEZCQ19DT05UUk9MLCBkZXZfcHJpdi0+c2F2ZUZCQ19DT05UUk9MKTsKLQotCS8qIFZHQSBzdGF0ZSAqLwotCUk5MTVfV1JJVEUoVkdBQ05UUkwsIGRldl9wcml2LT5zYXZlVkdBQ05UUkwpOwotCUk5MTVfV1JJVEUoVkdBMCwgZGV2X3ByaXYtPnNhdmVWR0EwKTsKLQlJOTE1X1dSSVRFKFZHQTEsIGRldl9wcml2LT5zYXZlVkdBMSk7Ci0JSTkxNV9XUklURShWR0FfUEQsIGRldl9wcml2LT5zYXZlVkdBX1BEKTsKLQlEUk1fVURFTEFZKDE1MCk7CiAKIAkvKiBDbG9jayBnYXRpbmcgc3RhdGUgKi8KIAlJOTE1X1dSSVRFIChEX1NUQVRFLCBkZXZfcHJpdi0+c2F2ZURfU1RBVEUpOwpAQCAtNjAzLDggKzgxMiw2IEBACiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKIAkJSTkxNV9XUklURShTV0YzMCArIChpIDw8IDIpLCBkZXZfcHJpdi0+c2F2ZVNXRjJbaV0pOwogCi0JaTkxNV9yZXN0b3JlX3ZnYShkZXYpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTg0MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV90cmFjZS5oCkBAIC0wLDAgKzEsMzE2IEBACisjaWYgIWRlZmluZWQoX0k5MTVfVFJBQ0VfSF8pIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9JOTE1X1RSQUNFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI2luY2x1ZGUgPGRybS9kcm1QLmg+CisKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGk5MTUKKyNkZWZpbmUgVFJBQ0VfU1lTVEVNX1NUUklORyBfX3N0cmluZ2lmeShUUkFDRV9TWVNURU0pCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBpOTE1X3RyYWNlCisKKy8qIG9iamVjdCB0cmFja2luZyAqLworCitUUkFDRV9FVkVOVChpOTE1X2dlbV9vYmplY3RfY3JlYXRlLAorCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKSwKKworCSAgICBUUF9BUkdTKG9iaiksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQorCQkJICAgICBfX2ZpZWxkKHUzMiwgc2l6ZSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPm9iaiA9IG9iajsKKwkJCSAgIF9fZW50cnktPnNpemUgPSBvYmotPnNpemU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygib2JqPSVwLCBzaXplPSV1IiwgX19lbnRyeS0+b2JqLCBfX2VudHJ5LT5zaXplKQorKTsKKworVFJBQ0VfRVZFTlQoaTkxNV9nZW1fb2JqZWN0X2JpbmQsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHUzMiBndHRfb2Zmc2V0KSwKKworCSAgICBUUF9BUkdTKG9iaiwgZ3R0X29mZnNldCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQorCQkJICAgICBfX2ZpZWxkKHUzMiwgZ3R0X29mZnNldCkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPm9iaiA9IG9iajsKKwkJCSAgIF9fZW50cnktPmd0dF9vZmZzZXQgPSBndHRfb2Zmc2V0OworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIm9iaj0lcCwgZ3R0X29mZnNldD0lMDh4IiwKKwkJICAgICAgX19lbnRyeS0+b2JqLCBfX2VudHJ5LT5ndHRfb2Zmc2V0KQorKTsKKworVFJBQ0VfRVZFTlQoaTkxNV9nZW1fb2JqZWN0X2NsZmx1c2gsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopLAorCisJICAgIFRQX0FSR1Mob2JqKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCQkgICBfX2VudHJ5LT5vYmogPSBvYmo7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygib2JqPSVwIiwgX19lbnRyeS0+b2JqKQorKTsKKworVFJBQ0VfRVZFTlQoaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4sCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHVpbnQzMl90IG9sZF9yZWFkX2RvbWFpbnMsIHVpbnQzMl90IG9sZF93cml0ZV9kb21haW4pLAorCisJICAgIFRQX0FSR1Mob2JqLCBvbGRfcmVhZF9kb21haW5zLCBvbGRfd3JpdGVfZG9tYWluKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCQkgICAgIF9fZmllbGQodTMyLCByZWFkX2RvbWFpbnMpCisJCQkgICAgIF9fZmllbGQodTMyLCB3cml0ZV9kb21haW4pCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCQkgICBfX2VudHJ5LT5vYmogPSBvYmo7CisJCQkgICBfX2VudHJ5LT5yZWFkX2RvbWFpbnMgPSBvYmotPnJlYWRfZG9tYWlucyB8IChvbGRfcmVhZF9kb21haW5zIDw8IDE2KTsKKwkJCSAgIF9fZW50cnktPndyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluIHwgKG9sZF93cml0ZV9kb21haW4gPDwgMTYpOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIm9iaj0lcCwgcmVhZD0lMDR4LCB3cml0ZT0lMDR4IiwKKwkJICAgICAgX19lbnRyeS0+b2JqLAorCQkgICAgICBfX2VudHJ5LT5yZWFkX2RvbWFpbnMsIF9fZW50cnktPndyaXRlX2RvbWFpbikKKyk7CisKK1RSQUNFX0VWRU5UKGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2UsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCBmZW5jZSwgaW50IHRpbGluZ19tb2RlKSwKKworCSAgICBUUF9BUkdTKG9iaiwgZmVuY2UsIHRpbGluZ19tb2RlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCQkgICAgIF9fZmllbGQoaW50LCBmZW5jZSkKKwkJCSAgICAgX19maWVsZChpbnQsIHRpbGluZ19tb2RlKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkJICAgX19lbnRyeS0+b2JqID0gb2JqOworCQkJICAgX19lbnRyeS0+ZmVuY2UgPSBmZW5jZTsKKwkJCSAgIF9fZW50cnktPnRpbGluZ19tb2RlID0gdGlsaW5nX21vZGU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygib2JqPSVwLCBmZW5jZT0lZCwgdGlsaW5nPSVkIiwKKwkJICAgICAgX19lbnRyeS0+b2JqLCBfX2VudHJ5LT5mZW5jZSwgX19lbnRyeS0+dGlsaW5nX21vZGUpCispOworCitUUkFDRV9FVkVOVChpOTE1X2dlbV9vYmplY3RfdW5iaW5kLAorCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKSwKKworCSAgICBUUF9BUkdTKG9iaiksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkJICAgX19lbnRyeS0+b2JqID0gb2JqOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIm9iaj0lcCIsIF9fZW50cnktPm9iaikKKyk7CisKK1RSQUNFX0VWRU5UKGk5MTVfZ2VtX29iamVjdF9kZXN0cm95LAorCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKSwKKworCSAgICBUUF9BUkdTKG9iaiksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkJICAgX19lbnRyeS0+b2JqID0gb2JqOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIm9iaj0lcCIsIF9fZW50cnktPm9iaikKKyk7CisKKy8qIGJhdGNoIHRyYWNpbmcgKi8KKworVFJBQ0VfRVZFTlQoaTkxNV9nZW1fcmVxdWVzdF9zdWJtaXQsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKworCSAgICBUUF9BUkdTKGRldiwgc2Vxbm8pLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQodTMyLCBkZXYpCisJCQkgICAgIF9fZmllbGQodTMyLCBzZXFubykKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPmRldiA9IGRldi0+cHJpbWFyeS0+aW5kZXg7CisJCQkgICBfX2VudHJ5LT5zZXFubyA9IHNlcW5vOworCQkJICAgaTkxNV90cmFjZV9pcnFfZ2V0KGRldiwgc2Vxbm8pOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImRldj0ldSwgc2Vxbm89JXUiLCBfX2VudHJ5LT5kZXYsIF9fZW50cnktPnNlcW5vKQorKTsKKworVFJBQ0VfRVZFTlQoaTkxNV9nZW1fcmVxdWVzdF9mbHVzaCwKKworCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8sCisJCSAgICAgdTMyIGZsdXNoX2RvbWFpbnMsIHUzMiBpbnZhbGlkYXRlX2RvbWFpbnMpLAorCisJICAgIFRQX0FSR1MoZGV2LCBzZXFubywgZmx1c2hfZG9tYWlucywgaW52YWxpZGF0ZV9kb21haW5zKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkJICAgICBfX2ZpZWxkKHUzMiwgZGV2KQorCQkJICAgICBfX2ZpZWxkKHUzMiwgc2Vxbm8pCisJCQkgICAgIF9fZmllbGQodTMyLCBmbHVzaF9kb21haW5zKQorCQkJICAgICBfX2ZpZWxkKHUzMiwgaW52YWxpZGF0ZV9kb21haW5zKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkJICAgX19lbnRyeS0+ZGV2ID0gZGV2LT5wcmltYXJ5LT5pbmRleDsKKwkJCSAgIF9fZW50cnktPnNlcW5vID0gc2Vxbm87CisJCQkgICBfX2VudHJ5LT5mbHVzaF9kb21haW5zID0gZmx1c2hfZG9tYWluczsKKwkJCSAgIF9fZW50cnktPmludmFsaWRhdGVfZG9tYWlucyA9IGludmFsaWRhdGVfZG9tYWluczsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJkZXY9JXUsIHNlcW5vPSV1LCBmbHVzaD0lMDR4LCBpbnZhbGlkYXRlPSUwNHgiLAorCQkgICAgICBfX2VudHJ5LT5kZXYsIF9fZW50cnktPnNlcW5vLAorCQkgICAgICBfX2VudHJ5LT5mbHVzaF9kb21haW5zLCBfX2VudHJ5LT5pbnZhbGlkYXRlX2RvbWFpbnMpCispOworCisKK1RSQUNFX0VWRU5UKGk5MTVfZ2VtX3JlcXVlc3RfY29tcGxldGUsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKworCSAgICBUUF9BUkdTKGRldiwgc2Vxbm8pLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQodTMyLCBkZXYpCisJCQkgICAgIF9fZmllbGQodTMyLCBzZXFubykKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPmRldiA9IGRldi0+cHJpbWFyeS0+aW5kZXg7CisJCQkgICBfX2VudHJ5LT5zZXFubyA9IHNlcW5vOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImRldj0ldSwgc2Vxbm89JXUiLCBfX2VudHJ5LT5kZXYsIF9fZW50cnktPnNlcW5vKQorKTsKKworVFJBQ0VfRVZFTlQoaTkxNV9nZW1fcmVxdWVzdF9yZXRpcmUsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKworCSAgICBUUF9BUkdTKGRldiwgc2Vxbm8pLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQodTMyLCBkZXYpCisJCQkgICAgIF9fZmllbGQodTMyLCBzZXFubykKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPmRldiA9IGRldi0+cHJpbWFyeS0+aW5kZXg7CisJCQkgICBfX2VudHJ5LT5zZXFubyA9IHNlcW5vOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImRldj0ldSwgc2Vxbm89JXUiLCBfX2VudHJ5LT5kZXYsIF9fZW50cnktPnNlcW5vKQorKTsKKworVFJBQ0VfRVZFTlQoaTkxNV9nZW1fcmVxdWVzdF93YWl0X2JlZ2luLAorCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBzZXFubyksCisKKwkgICAgVFBfQVJHUyhkZXYsIHNlcW5vKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkJICAgICBfX2ZpZWxkKHUzMiwgZGV2KQorCQkJICAgICBfX2ZpZWxkKHUzMiwgc2Vxbm8pCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCQkgICBfX2VudHJ5LT5kZXYgPSBkZXYtPnByaW1hcnktPmluZGV4OworCQkJICAgX19lbnRyeS0+c2Vxbm8gPSBzZXFubzsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJkZXY9JXUsIHNlcW5vPSV1IiwgX19lbnRyeS0+ZGV2LCBfX2VudHJ5LT5zZXFubykKKyk7CisKK1RSQUNFX0VWRU5UKGk5MTVfZ2VtX3JlcXVlc3Rfd2FpdF9lbmQsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKworCSAgICBUUF9BUkdTKGRldiwgc2Vxbm8pLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQodTMyLCBkZXYpCisJCQkgICAgIF9fZmllbGQodTMyLCBzZXFubykKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPmRldiA9IGRldi0+cHJpbWFyeS0+aW5kZXg7CisJCQkgICBfX2VudHJ5LT5zZXFubyA9IHNlcW5vOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImRldj0ldSwgc2Vxbm89JXUiLCBfX2VudHJ5LT5kZXYsIF9fZW50cnktPnNlcW5vKQorKTsKKworVFJBQ0VfRVZFTlQoaTkxNV9yaW5nX3dhaXRfYmVnaW4sCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiksCisKKwkgICAgVFBfQVJHUyhkZXYpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQodTMyLCBkZXYpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCQkgICBfX2VudHJ5LT5kZXYgPSBkZXYtPnByaW1hcnktPmluZGV4OworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImRldj0ldSIsIF9fZW50cnktPmRldikKKyk7CisKK1RSQUNFX0VWRU5UKGk5MTVfcmluZ193YWl0X2VuZCwKKworCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KSwKKworCSAgICBUUF9BUkdTKGRldiksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJCSAgICAgX19maWVsZCh1MzIsIGRldikKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPmRldiA9IGRldi0+cHJpbWFyeS0+aW5kZXg7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiZGV2PSV1IiwgX19lbnRyeS0+ZGV2KQorKTsKKworI2VuZGlmIC8qIF9JOTE1X1RSQUNFX0hfICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAorI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLi4vLi4vZHJpdmVycy9ncHUvZHJtL2k5MTUKKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2VfcG9pbnRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlX3BvaW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDg3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlX3BvaW50cy5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KKyAqLworCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCmluZGV4IDFlMjhjMTYuLjk2Y2QyNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmMKQEAgLTIxNyw2ICsyMTcsOSBAQAogCQkJaWYgKElTX0k4NVgoZGV2X3ByaXYtPmRldikpCiAJCQkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPQogCQkJCQlnZW5lcmFsLT5zc2NfZnJlcSA/IDY2IDogNDg7CisJCQllbHNlIGlmIChJU19JR0RORyhkZXZfcHJpdi0+ZGV2KSkKKwkJCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9CisJCQkJCWdlbmVyYWwtPnNzY19mcmVxID8gMTAwIDogMTIwOwogCQkJZWxzZQogCQkJCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0KIAkJCQkJZ2VuZXJhbC0+c3NjX2ZyZXEgPyAxMDAgOiA5NjsKQEAgLTM0OCwyMCArMzUxLDE4IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAJc3RydWN0IGJkYl9kcml2ZXJfZmVhdHVyZXMgKmRyaXZlcjsKIAotCS8qIHNldCBkZWZhdWx0IGZvciBjaGlwcyB3aXRob3V0IGVEUCAqLwotCWlmICghU1VQUE9SVFNfRURQKGRldikpIHsKLQkJZGV2X3ByaXYtPmVkcF9zdXBwb3J0ID0gMDsKLQkJcmV0dXJuOwotCX0KLQogCWRyaXZlciA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9EUklWRVJfRkVBVFVSRVMpOwogCWlmICghZHJpdmVyKQogCQlyZXR1cm47CiAKLQlpZiAoZHJpdmVyLT5sdmRzX2NvbmZpZyA9PSBCREJfRFJJVkVSX0ZFQVRVUkVfRURQKQorCWlmIChkcml2ZXIgJiYgU1VQUE9SVFNfRURQKGRldikgJiYKKwkgICAgZHJpdmVyLT5sdmRzX2NvbmZpZyA9PSBCREJfRFJJVkVSX0ZFQVRVUkVfRURQKSB7CiAJCWRldl9wcml2LT5lZHBfc3VwcG9ydCA9IDE7CisJfSBlbHNlIHsKKwkJZGV2X3ByaXYtPmVkcF9zdXBwb3J0ID0gMDsKKwl9CiAKLQlpZiAoZHJpdmVyLT5kdWFsX2ZyZXF1ZW5jeSkKKwlpZiAoZHJpdmVyICYmIGRyaXZlci0+ZHVhbF9mcmVxdWVuY3kpCiAJCWRldl9wcml2LT5yZW5kZXJfcmVjbG9ja19hdmFpbCA9IHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKaW5kZXggODg4MTRmYS4uMjEyZTIyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKQEAgLTE3OSwxMyArMTc5LDEwIEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdTMyIGFkcGEsIHRlbXA7CisJdTMyIGFkcGE7CiAJYm9vbCByZXQ7CiAKLQl0ZW1wID0gYWRwYSA9IEk5MTVfUkVBRChQQ0hfQURQQSk7Ci0KLQlhZHBhICY9IH5BRFBBX0RBQ19FTkFCTEU7Ci0JSTkxNV9XUklURShQQ0hfQURQQSwgYWRwYSk7CisJYWRwYSA9IEk5MTVfUkVBRChQQ0hfQURQQSk7CiAKIAlhZHBhICY9IH5BRFBBX0NSVF9IT1RQTFVHX01BU0s7CiAKQEAgLTIxMiw4ICsyMDksNiBAQAogCWVsc2UKIAkJcmV0ID0gZmFsc2U7CiAKLQkvKiByZXN0b3JlIG9yaWdpbiByZWdpc3RlciAqLwotCUk5MTVfV1JJVEUoUENIX0FEUEEsIHRlbXApOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCAwMjI3YjE2Li4zYmE2NTQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpAQCAtMjQsNiArMjQsOCBAQAogICoJRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlICJkcm1QLmgiCkBAIC04NzUsNyArODc3LDcgQEAKIAkJCQkJICAgICAgIHJlZmNsaywgYmVzdF9jbG9jayk7CiAKIAlpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZEUykpIHsKLQkJaWYgKChJOTE1X1JFQUQoTFZEUykgJiBMVkRTX0NMS0JfUE9XRVJfTUFTSykgPT0KKwkJaWYgKChJOTE1X1JFQUQoUENIX0xWRFMpICYgTFZEU19DTEtCX1BPV0VSX01BU0spID09CiAJCSAgICBMVkRTX0NMS0JfUE9XRVJfVVApCiAJCQljbG9jay5wMiA9IGxpbWl0LT5wMi5wMl9mYXN0OwogCQllbHNlCkBAIC05NDEsNiArOTQzLDcgQEAKICAgICBjbG9jay5tID0gNSAqIChjbG9jay5tMSArIDIpICsgKGNsb2NrLm0yICsgMik7CiAgICAgY2xvY2sucCA9IChjbG9jay5wMSAqIGNsb2NrLnAyKTsKICAgICBjbG9jay5kb3QgPSA5NjAwMCAqIGNsb2NrLm0gLyAoY2xvY2subiArIDIpIC8gY2xvY2sucDsKKyAgICBjbG9jay52Y28gPSAwOwogICAgIG1lbWNweShiZXN0X2Nsb2NrLCAmY2xvY2ssIHNpemVvZihpbnRlbF9jbG9ja190KSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC05NTIsNiArOTU1LDI0MSBAQAogCW1kZWxheSgyMCk7CiB9CiAKKy8qIFBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkLCB1cGRhdGUgRkJDIGluZm8gKi8KK3N0YXRpYyB2b2lkIGk4eHhfZW5hYmxlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gY3J0Yy0+ZmI7CisJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSBpbnRlbF9mYi0+b2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBsYW5lLCBpOworCXUzMiBmYmNfY3RsLCBmYmNfY3RsMjsKKworCWRldl9wcml2LT5jZmJfcGl0Y2ggPSBkZXZfcHJpdi0+Y2ZiX3NpemUgLyBGQkNfTExfU0laRTsKKworCWlmIChmYi0+cGl0Y2ggPCBkZXZfcHJpdi0+Y2ZiX3BpdGNoKQorCQlkZXZfcHJpdi0+Y2ZiX3BpdGNoID0gZmItPnBpdGNoOworCisJLyogRkJDX0NUTCB3YW50cyA2NEIgdW5pdHMgKi8KKwlkZXZfcHJpdi0+Y2ZiX3BpdGNoID0gKGRldl9wcml2LT5jZmJfcGl0Y2ggLyA2NCkgLSAxOworCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOworCWRldl9wcml2LT5jZmJfcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKKwlwbGFuZSA9IGRldl9wcml2LT5jZmJfcGxhbmUgPT0gMCA/IEZCQ19DVExfUExBTkVBIDogRkJDX0NUTF9QTEFORUI7CisKKwkvKiBDbGVhciBvbGQgdGFncyAqLworCWZvciAoaSA9IDA7IGkgPCAoRkJDX0xMX1NJWkUgLyAzMikgKyAxOyBpKyspCisJCUk5MTVfV1JJVEUoRkJDX1RBRyArIChpICogNCksIDApOworCisJLyogU2V0IGl0IHVwLi4uICovCisJZmJjX2N0bDIgPSBGQkNfQ1RMX0ZFTkNFX0RCTCB8IEZCQ19DVExfSURMRV9JTU0gfCBwbGFuZTsKKwlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCisJCWZiY19jdGwyIHw9IEZCQ19DVExfQ1BVX0ZFTkNFOworCUk5MTVfV1JJVEUoRkJDX0NPTlRST0wyLCBmYmNfY3RsMik7CisJSTkxNV9XUklURShGQkNfRkVOQ0VfT0ZGLCBjcnRjLT55KTsKKworCS8qIGVuYWJsZSBpdC4uLiAqLworCWZiY19jdGwgPSBGQkNfQ1RMX0VOIHwgRkJDX0NUTF9QRVJJT0RJQzsKKwlmYmNfY3RsIHw9IChkZXZfcHJpdi0+Y2ZiX3BpdGNoICYgMHhmZikgPDwgRkJDX0NUTF9TVFJJREVfU0hJRlQ7CisJZmJjX2N0bCB8PSAoaW50ZXJ2YWwgJiAweDJmZmYpIDw8IEZCQ19DVExfSU5URVJWQUxfU0hJRlQ7CisJaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQorCQlmYmNfY3RsIHw9IGRldl9wcml2LT5jZmJfZmVuY2U7CisJSTkxNV9XUklURShGQkNfQ09OVFJPTCwgZmJjX2N0bCk7CisKKwlEUk1fREVCVUcoImVuYWJsZWQgRkJDLCBwaXRjaCAlbGQsIHlvZmYgJWQsIHBsYW5lICVkLCAiLAorCQkgIGRldl9wcml2LT5jZmJfcGl0Y2gsIGNydGMtPnksIGRldl9wcml2LT5jZmJfcGxhbmUpOworfQorCit2b2lkIGk4eHhfZGlzYWJsZV9mYmMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBmYmNfY3RsOworCisJaWYgKCFJOTE1X0hBU19GQkMoZGV2KSkKKwkJcmV0dXJuOworCisJLyogRGlzYWJsZSBjb21wcmVzc2lvbiAqLworCWZiY19jdGwgPSBJOTE1X1JFQUQoRkJDX0NPTlRST0wpOworCWZiY19jdGwgJj0gfkZCQ19DVExfRU47CisJSTkxNV9XUklURShGQkNfQ09OVFJPTCwgZmJjX2N0bCk7CisKKwkvKiBXYWl0IGZvciBjb21wcmVzc2luZyBiaXQgdG8gY2xlYXIgKi8KKwl3aGlsZSAoSTkxNV9SRUFEKEZCQ19TVEFUVVMpICYgRkJDX1NUQVRfQ09NUFJFU1NJTkcpCisJCTsgLyogbm90aGluZyAqLworCisJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldik7CisKKwlEUk1fREVCVUcoImRpc2FibGVkIEZCQ1xuIik7Cit9CisKK3N0YXRpYyBib29sIGk4eHhfZmJjX2VuYWJsZWQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiBJOTE1X1JFQUQoRkJDX0NPTlRST0wpICYgRkJDX0NUTF9FTjsKK30KKworc3RhdGljIHZvaWQgZzR4X2VuYWJsZV9mYmMoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBsb25nIGludGVydmFsKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGNydGMtPmZiOworCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gaW50ZWxfZmItPm9iai0+ZHJpdmVyX3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCWludCBwbGFuZSA9IChpbnRlbF9jcnRjLT5wbGFuZSA9PSAwID8gRFBGQ19DVExfUExBTkVBIDoKKwkJICAgICBEUEZDX0NUTF9QTEFORUIpOworCXVuc2lnbmVkIGxvbmcgc3RhbGxfd2F0ZXJtYXJrID0gMjAwOworCXUzMiBkcGZjX2N0bDsKKworCWRldl9wcml2LT5jZmJfcGl0Y2ggPSAoZGV2X3ByaXYtPmNmYl9waXRjaCAvIDY0KSAtIDE7CisJZGV2X3ByaXYtPmNmYl9mZW5jZSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJZGV2X3ByaXYtPmNmYl9wbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOworCisJZHBmY19jdGwgPSBwbGFuZSB8IERQRkNfU1JfRU4gfCBEUEZDX0NUTF9MSU1JVF8xWDsKKwlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpIHsKKwkJZHBmY19jdGwgfD0gRFBGQ19DVExfRkVOQ0VfRU4gfCBkZXZfcHJpdi0+Y2ZiX2ZlbmNlOworCQlJOTE1X1dSSVRFKERQRkNfQ0hJQ0tFTiwgRFBGQ19IVF9NT0RJRlkpOworCX0gZWxzZSB7CisJCUk5MTVfV1JJVEUoRFBGQ19DSElDS0VOLCB+RFBGQ19IVF9NT0RJRlkpOworCX0KKworCUk5MTVfV1JJVEUoRFBGQ19DT05UUk9MLCBkcGZjX2N0bCk7CisJSTkxNV9XUklURShEUEZDX1JFQ09NUF9DVEwsIERQRkNfUkVDT01QX1NUQUxMX0VOIHwKKwkJICAgKHN0YWxsX3dhdGVybWFyayA8PCBEUEZDX1JFQ09NUF9TVEFMTF9XTV9TSElGVCkgfAorCQkgICAoaW50ZXJ2YWwgPDwgRFBGQ19SRUNPTVBfVElNRVJfQ09VTlRfU0hJRlQpKTsKKwlJOTE1X1dSSVRFKERQRkNfRkVOQ0VfWU9GRiwgY3J0Yy0+eSk7CisKKwkvKiBlbmFibGUgaXQuLi4gKi8KKwlJOTE1X1dSSVRFKERQRkNfQ09OVFJPTCwgSTkxNV9SRUFEKERQRkNfQ09OVFJPTCkgfCBEUEZDX0NUTF9FTik7CisKKwlEUk1fREVCVUcoImVuYWJsZWQgZmJjIG9uIHBsYW5lICVkXG4iLCBpbnRlbF9jcnRjLT5wbGFuZSk7Cit9CisKK3ZvaWQgZzR4X2Rpc2FibGVfZmJjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgZHBmY19jdGw7CisKKwkvKiBEaXNhYmxlIGNvbXByZXNzaW9uICovCisJZHBmY19jdGwgPSBJOTE1X1JFQUQoRFBGQ19DT05UUk9MKTsKKwlkcGZjX2N0bCAmPSB+RFBGQ19DVExfRU47CisJSTkxNV9XUklURShEUEZDX0NPTlRST0wsIGRwZmNfY3RsKTsKKwlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2KTsKKworCURSTV9ERUJVRygiZGlzYWJsZWQgRkJDXG4iKTsKK30KKworc3RhdGljIGJvb2wgZzR4X2ZiY19lbmFibGVkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlyZXR1cm4gSTkxNV9SRUFEKERQRkNfQ09OVFJPTCkgJiBEUEZDX0NUTF9FTjsKK30KKworLyoqCisgKiBpbnRlbF91cGRhdGVfZmJjIC0gZW5hYmxlL2Rpc2FibGUgRkJDIGFzIG5lZWRlZAorICogQGNydGM6IENSVEMgdG8gcG9pbnQgdGhlIGNvbXByZXNzb3IgYXQKKyAqIEBtb2RlOiBtb2RlIGluIHVzZQorICoKKyAqIFNldCB1cCB0aGUgZnJhbWVidWZmZXIgY29tcHJlc3Npb24gaGFyZHdhcmUgYXQgbW9kZSBzZXQgdGltZS4gIFdlCisgKiBlbmFibGUgaXQgaWYgcG9zc2libGU6CisgKiAgIC0gcGxhbmUgQSBvbmx5IChvbiBwcmUtOTY1KQorICogICAtIG5vIHBpeGVsIG11bGl0cGx5L2xpbmUgZHVwbGljYXRpb24KKyAqICAgLSBubyBhbHBoYSBidWZmZXIgZGlzY2FyZAorICogICAtIG5vIGR1YWwgd2lkZQorICogICAtIGZyYW1lYnVmZmVyIDw9IDIwNDggaW4gd2lkdGgsIDE1MzYgaW4gaGVpZ2h0CisgKgorICogV2UgY2FuJ3QgYXNzdW1lIHRoYXQgYW55IGNvbXByZXNzaW9uIHdpbGwgdGFrZSBwbGFjZSAod29yc3QgY2FzZSksCisgKiBzbyB0aGUgY29tcHJlc3NlZCBidWZmZXIgaGFzIHRvIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIHVuY29tcHJlc3NlZAorICogb25lLiAgSXQgYWxzbyBtdXN0IHJlc2lkZSAoYWxvbmcgd2l0aCB0aGUgbGluZSBsZW5ndGggYnVmZmVyKSBpbgorICogc3RvbGVuIG1lbW9yeS4KKyAqCisgKiBXZSBuZWVkIHRvIGVuYWJsZS9kaXNhYmxlIEZCQyBvbiBhIGdsb2JhbCBiYXNpcy4KKyAqLworc3RhdGljIHZvaWQgaW50ZWxfdXBkYXRlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGNydGMtPmZiOworCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmI7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKKworCWlmICghaTkxNV9wb3dlcnNhdmUpCisJCXJldHVybjsKKworCWlmICghZGV2X3ByaXYtPmRpc3BsYXkuZmJjX2VuYWJsZWQgfHwKKwkgICAgIWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgfHwKKwkgICAgIWRldl9wcml2LT5kaXNwbGF5LmRpc2FibGVfZmJjKQorCQlyZXR1cm47CisKKwlpZiAoIWNydGMtPmZiKQorCQlyZXR1cm47CisKKwlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKKwlvYmpfcHJpdiA9IGludGVsX2ZiLT5vYmotPmRyaXZlcl9wcml2YXRlOworCisJLyoKKwkgKiBJZiBGQkMgaXMgYWxyZWFkeSBvbiwgd2UganVzdCBoYXZlIHRvIHZlcmlmeSB0aGF0IHdlIGNhbgorCSAqIGtlZXAgaXQgdGhhdCB3YXkuLi4KKwkgKiBOZWVkIHRvIGRpc2FibGUgaWY6CisJICogICAtIGNoYW5naW5nIEZCQyBwYXJhbXMgKHN0cmlkZSwgZmVuY2UsIG1vZGUpCisJICogICAtIG5ldyBmYiBpcyB0b28gbGFyZ2UgdG8gZml0IGluIGNvbXByZXNzZWQgYnVmZmVyCisJICogICAtIGdvaW5nIHRvIGFuIHVuc3VwcG9ydGVkIGNvbmZpZyAoaW50ZXJsYWNlLCBwaXhlbCBtdWx0aXBseSwgZXRjLikKKwkgKi8KKwlpZiAoaW50ZWxfZmItPm9iai0+c2l6ZSA+IGRldl9wcml2LT5jZmJfc2l6ZSkgeworCQlEUk1fREVCVUcoImZyYW1lYnVmZmVyIHRvbyBsYXJnZSwgZGlzYWJsaW5nIGNvbXByZXNzaW9uXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisJaWYgKChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKSB8fAorCSAgICAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pKSB7CisJCURSTV9ERUJVRygibW9kZSBpbmNvbXBhdGlibGUgd2l0aCBjb21wcmVzc2lvbiwgZGlzYWJsaW5nXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisJaWYgKChtb2RlLT5oZGlzcGxheSA+IDIwNDgpIHx8CisJICAgIChtb2RlLT52ZGlzcGxheSA+IDE1MzYpKSB7CisJCURSTV9ERUJVRygibW9kZSB0b28gbGFyZ2UgZm9yIGNvbXByZXNzaW9uLCBkaXNhYmxpbmdcbiIpOworCQlnb3RvIG91dF9kaXNhYmxlOworCX0KKwlpZiAoKElTX0k5MTVHTShkZXYpIHx8IElTX0k5NDVHTShkZXYpKSAmJiBwbGFuZSAhPSAwKSB7CisJCURSTV9ERUJVRygicGxhbmUgbm90IDAsIGRpc2FibGluZyBjb21wcmVzc2lvblxuIik7CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfWCkgeworCQlEUk1fREVCVUcoImZyYW1lYnVmZmVyIG5vdCB0aWxlZCwgZGlzYWJsaW5nIGNvbXByZXNzaW9uXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmRpc3BsYXkuZmJjX2VuYWJsZWQoY3J0YykpIHsKKwkJLyogV2UgY2FuIHJlLWVuYWJsZSBpdCBpbiB0aGlzIGNhc2UsIGJ1dCBuZWVkIHRvIHVwZGF0ZSBwaXRjaCAqLworCQlpZiAoZmItPnBpdGNoID4gZGV2X3ByaXYtPmNmYl9waXRjaCkKKwkJCWRldl9wcml2LT5kaXNwbGF5LmRpc2FibGVfZmJjKGRldik7CisJCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnICE9IGRldl9wcml2LT5jZmJfZmVuY2UpCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyhkZXYpOworCQlpZiAocGxhbmUgIT0gZGV2X3ByaXYtPmNmYl9wbGFuZSkKKwkJCWRldl9wcml2LT5kaXNwbGF5LmRpc2FibGVfZmJjKGRldik7CisJfQorCisJaWYgKCFkZXZfcHJpdi0+ZGlzcGxheS5mYmNfZW5hYmxlZChjcnRjKSkgeworCQkvKiBOb3cgdHJ5IHRvIHR1cm4gaXQgYmFjayBvbiBpZiBwb3NzaWJsZSAqLworCQlkZXZfcHJpdi0+ZGlzcGxheS5lbmFibGVfZmJjKGNydGMsIDUwMCk7CisJfQorCisJcmV0dXJuOworCitvdXRfZGlzYWJsZToKKwlEUk1fREVCVUcoInVuc3VwcG9ydGVkIGNvbmZpZywgZGlzYWJsaW5nIEZCQ1xuIik7CisJLyogTXVsdGlwbGUgZGlzYWJsZXMgc2hvdWxkIGJlIGhhcm1sZXNzICovCisJaWYgKGRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkKGNydGMpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyhkZXYpOworfQorCiBzdGF0aWMgaW50CiBpbnRlbF9waXBlX3NldF9iYXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAogCQkgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQpAQCAtOTY0LDEyICsxMjAyLDEzIEBACiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKIAl1bnNpZ25lZCBsb25nIFN0YXJ0LCBPZmZzZXQ7Ci0JaW50IGRzcGJhc2UgPSAocGlwZSA9PSAwID8gRFNQQUFERFIgOiBEU1BCQUREUik7Ci0JaW50IGRzcHN1cmYgPSAocGlwZSA9PSAwID8gRFNQQVNVUkYgOiBEU1BCU1VSRik7Ci0JaW50IGRzcHN0cmlkZSA9IChwaXBlID09IDApID8gRFNQQVNUUklERSA6IERTUEJTVFJJREU7Ci0JaW50IGRzcHRpbGVvZmYgPSAocGlwZSA9PSAwID8gRFNQQVRJTEVPRkYgOiBEU1BCVElMRU9GRik7Ci0JaW50IGRzcGNudHJfcmVnID0gKHBpcGUgPT0gMCkgPyBEU1BBQ05UUiA6IERTUEJDTlRSOworCWludCBkc3BiYXNlID0gKHBsYW5lID09IDAgPyBEU1BBQUREUiA6IERTUEJBRERSKTsKKwlpbnQgZHNwc3VyZiA9IChwbGFuZSA9PSAwID8gRFNQQVNVUkYgOiBEU1BCU1VSRik7CisJaW50IGRzcHN0cmlkZSA9IChwbGFuZSA9PSAwKSA/IERTUEFTVFJJREUgOiBEU1BCU1RSSURFOworCWludCBkc3B0aWxlb2ZmID0gKHBsYW5lID09IDAgPyBEU1BBVElMRU9GRiA6IERTUEJUSUxFT0ZGKTsKKwlpbnQgZHNwY250cl9yZWcgPSAocGxhbmUgPT0gMCkgPyBEU1BBQ05UUiA6IERTUEJDTlRSOwogCXUzMiBkc3BjbnRyLCBhbGlnbm1lbnQ7CiAJaW50IHJldDsKIApAQCAtOTc5LDEyICsxMjE4LDEyIEBACiAJCXJldHVybiAwOwogCX0KIAotCXN3aXRjaCAocGlwZSkgeworCXN3aXRjaCAocGxhbmUpIHsKIAljYXNlIDA6CiAJY2FzZSAxOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlEUk1fRVJST1IoIkNhbid0IHVwZGF0ZSBwaXBlICVkIGluIFNBUkVBXG4iLCBwaXBlKTsKKwkJRFJNX0VSUk9SKCJDYW4ndCB1cGRhdGUgcGxhbmUgJWQgaW4gU0FSRUFcbiIsIHBsYW5lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMDIyLDkgKzEyNjEsMTEgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBQcmUtaTk2NSBuZWVkcyB0byBpbnN0YWxsIGEgZmVuY2UgZm9yIHRpbGVkIHNjYW4tb3V0ICovCi0JaWYgKCFJU19JOTY1RyhkZXYpICYmCi0JICAgIG9ial9wcml2LT5mZW5jZV9yZWcgPT0gSTkxNV9GRU5DRV9SRUdfTk9ORSAmJgorCS8qIEluc3RhbGwgYSBmZW5jZSBmb3IgdGlsZWQgc2Nhbi1vdXQuIFByZS1pOTY1IGFsd2F5cyBuZWVkcyBhIGZlbmNlLAorCSAqIHdoZXJlYXMgOTY1KyBvbmx5IHJlcXVpcmVzIGEgZmVuY2UgaWYgdXNpbmcgZnJhbWVidWZmZXIgY29tcHJlc3Npb24uCisJICogRm9yIHNpbXBsaWNpdHksIHdlIGFsd2F5cyBpbnN0YWxsIGEgZmVuY2UgYXMgdGhlIGNvc3QgaXMgbm90IHRoYXQgb25lcm91cy4KKwkgKi8KKwlpZiAob2JqX3ByaXYtPmZlbmNlX3JlZyA9PSBJOTE1X0ZFTkNFX1JFR19OT05FICYmCiAJICAgIG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7CiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKG9iaik7CiAJCWlmIChyZXQgIT0gMCkgewpAQCAtMTA4Niw2ICsxMzI3LDkgQEAKIAkJSTkxNV9SRUFEKGRzcGJhc2UpOwogCX0KIAorCWlmICgoSVNfSTk2NUcoZGV2KSB8fCBwbGFuZSA9PSAwKSkKKwkJaW50ZWxfdXBkYXRlX2ZiYyhjcnRjLCAmY3J0Yy0+bW9kZSk7CisKIAlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2KTsKIAogCWlmIChvbGRfZmIpIHsKQEAgLTEyMTcsNiArMTQ2MSw3IEBACiAJaW50IHRyYW5zY29uZl9yZWcgPSAocGlwZSA9PSAwKSA/IFRSQU5TQUNPTkYgOiBUUkFOU0JDT05GOwogCWludCBwZl9jdGxfcmVnID0gKHBpcGUgPT0gMCkgPyBQRkFfQ1RMXzEgOiBQRkJfQ1RMXzE7CiAJaW50IHBmX3dpbl9zaXplID0gKHBpcGUgPT0gMCkgPyBQRkFfV0lOX1NaIDogUEZCX1dJTl9TWjsKKwlpbnQgcGZfd2luX3BvcyA9IChwaXBlID09IDApID8gUEZBX1dJTl9QT1MgOiBQRkJfV0lOX1BPUzsKIAlpbnQgY3B1X2h0b3RfcmVnID0gKHBpcGUgPT0gMCkgPyBIVE9UQUxfQSA6IEhUT1RBTF9COwogCWludCBjcHVfaGJsYW5rX3JlZyA9IChwaXBlID09IDApID8gSEJMQU5LX0EgOiBIQkxBTktfQjsKIAlpbnQgY3B1X2hzeW5jX3JlZyA9IChwaXBlID09IDApID8gSFNZTkNfQSA6IEhTWU5DX0I7CkBAIC0xMjY4LDYgKzE1MTMsMTkgQEAKIAkJCX0KIAkJfQogCisJCS8qIEVuYWJsZSBwYW5lbCBmaXR0aW5nIGZvciBMVkRTICovCisJCWlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9MVkRTKSkgeworCQkJdGVtcCA9IEk5MTVfUkVBRChwZl9jdGxfcmVnKTsKKwkJCUk5MTVfV1JJVEUocGZfY3RsX3JlZywgdGVtcCB8IFBGX0VOQUJMRSB8IFBGX0ZJTFRFUl9NRURfM3gzKTsKKworCQkJLyogY3VycmVudGx5IGZ1bGwgYXNwZWN0ICovCisJCQlJOTE1X1dSSVRFKHBmX3dpbl9wb3MsIDApOworCisJCQlJOTE1X1dSSVRFKHBmX3dpbl9zaXplLAorCQkJCSAgIChkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgPDwgMTYpIHwKKwkJCQkgICAoZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5KSk7CisJCX0KKwogCQkvKiBFbmFibGUgQ1BVIHBpcGUgKi8KIAkJdGVtcCA9IEk5MTVfUkVBRChwaXBlY29uZl9yZWcpOwogCQlpZiAoKHRlbXAgJiBQSVBFQUNPTkZfRU5BQkxFKSA9PSAwKSB7CkBAIC0xNTMyLDkgKzE3OTAsMTAgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CisJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CiAJaW50IGRwbGxfcmVnID0gKHBpcGUgPT0gMCkgPyBEUExMX0EgOiBEUExMX0I7Ci0JaW50IGRzcGNudHJfcmVnID0gKHBpcGUgPT0gMCkgPyBEU1BBQ05UUiA6IERTUEJDTlRSOwotCWludCBkc3BiYXNlX3JlZyA9IChwaXBlID09IDApID8gRFNQQUFERFIgOiBEU1BCQUREUjsKKwlpbnQgZHNwY250cl9yZWcgPSAocGxhbmUgPT0gMCkgPyBEU1BBQ05UUiA6IERTUEJDTlRSOworCWludCBkc3BiYXNlX3JlZyA9IChwbGFuZSA9PSAwKSA/IERTUEFBRERSIDogRFNQQkFERFI7CiAJaW50IHBpcGVjb25mX3JlZyA9IChwaXBlID09IDApID8gUElQRUFDT05GIDogUElQRUJDT05GOwogCXUzMiB0ZW1wOwogCkBAIC0xNTQ1LDYgKzE4MDQsOCBAQAogCWNhc2UgRFJNX01PREVfRFBNU19PTjoKIAljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKIAljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwkJaW50ZWxfdXBkYXRlX3dhdGVybWFya3MoZGV2KTsKKwogCQkvKiBFbmFibGUgdGhlIERQTEwgKi8KIAkJdGVtcCA9IEk5MTVfUkVBRChkcGxsX3JlZyk7CiAJCWlmICgodGVtcCAmIERQTExfVkNPX0VOQUJMRSkgPT0gMCkgewpAQCAtMTU3NywxNSArMTgzOCwyMSBAQAogCiAJCWludGVsX2NydGNfbG9hZF9sdXQoY3J0Yyk7CiAKKwkJaWYgKChJU19JOTY1RyhkZXYpIHx8IHBsYW5lID09IDApKQorCQkJaW50ZWxfdXBkYXRlX2ZiYyhjcnRjLCAmY3J0Yy0+bW9kZSk7CisKIAkJLyogR2l2ZSB0aGUgb3ZlcmxheSBzY2FsZXIgYSBjaGFuY2UgdG8gZW5hYmxlIGlmIGl0J3Mgb24gdGhpcyBwaXBlICovCiAJCS8vaW50ZWxfY3J0Y19kcG1zX3ZpZGVvKGNydGMsIHRydWUpOyBUT0RPCi0JCWludGVsX3VwZGF0ZV93YXRlcm1hcmtzKGRldik7CiAJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKIAkJaW50ZWxfdXBkYXRlX3dhdGVybWFya3MoZGV2KTsKIAkJLyogR2l2ZSB0aGUgb3ZlcmxheSBzY2FsZXIgYSBjaGFuY2UgdG8gZGlzYWJsZSBpZiBpdCdzIG9uIHRoaXMgcGlwZSAqLwogCQkvL2ludGVsX2NydGNfZHBtc192aWRlbyhjcnRjLCBGQUxTRSk7IFRPRE8KIAorCQlpZiAoZGV2X3ByaXYtPmNmYl9wbGFuZSA9PSBwbGFuZSAmJgorCQkgICAgZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMpCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyhkZXYpOworCiAJCS8qIERpc2FibGUgdGhlIFZHQSBwbGFuZSB0aGF0IHdlIG5ldmVyIHVzZSAqLwogCQlpOTE1X2Rpc2FibGVfdmdhKGRldik7CiAKQEAgLTE2MzQsMTUgKzE5MDEsMTMgQEAKIHN0YXRpYyB2b2lkIGludGVsX2NydGNfZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2OwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CiAJYm9vbCBlbmFibGVkOwogCi0JaWYgKElTX0lHRE5HKGRldikpCi0JCWlnZG5nX2NydGNfZHBtcyhjcnRjLCBtb2RlKTsKLQllbHNlCi0JCWk5eHhfY3J0Y19kcG1zKGNydGMsIG1vZGUpOworCWRldl9wcml2LT5kaXNwbGF5LmRwbXMoY3J0YywgbW9kZSk7CiAKIAlpbnRlbF9jcnRjLT5kcG1zX21vZGUgPSBtb2RlOwogCkBAIC0xNzA5LDU2ICsxOTc0LDY4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLQotLyoqIFJldHVybnMgdGhlIGNvcmUgZGlzcGxheSBjbG9jayBzcGVlZCBmb3IgaTgzMCAtIGk5NDUgKi8KLXN0YXRpYyBpbnQgaW50ZWxfZ2V0X2NvcmVfY2xvY2tfc3BlZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaTk0NV9nZXRfZGlzcGxheV9jbG9ja19zcGVlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCXJldHVybiA0MDAwMDA7Cit9CiAKLQkvKiBDb3JlIGNsb2NrIHZhbHVlcyB0YWtlbiBmcm9tIHRoZSBwdWJsaXNoZWQgZGF0YXNoZWV0cy4KLQkgKiBUaGUgODMwIG1heSBnbyB1cCB0byAxNjYgTWh6LCB3aGljaCB3ZSBzaG91bGQgY2hlY2suCi0JICovCi0JaWYgKElTX0k5NDVHKGRldikpCi0JCXJldHVybiA0MDAwMDA7Ci0JZWxzZSBpZiAoSVNfSTkxNUcoZGV2KSkKLQkJcmV0dXJuIDMzMzAwMDsKLQllbHNlIGlmIChJU19JOTQ1R00oZGV2KSB8fCBJU184NDVHKGRldikgfHwgSVNfSUdER00oZGV2KSkKLQkJcmV0dXJuIDIwMDAwMDsKLQllbHNlIGlmIChJU19JOTE1R00oZGV2KSkgewotCQl1MTYgZ2NmZ2MgPSAwOworc3RhdGljIGludCBpOTE1X2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDMzMzAwMDsKK30KIAotCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYtPnBkZXYsIEdDRkdDLCAmZ2NmZ2MpOworc3RhdGljIGludCBpOXh4X21pc2NfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMjAwMDAwOworfQogCi0JCWlmIChnY2ZnYyAmIEdDX0xPV19GUkVRVUVOQ1lfRU5BQkxFKQotCQkJcmV0dXJuIDEzMzAwMDsKLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGdjZmdjICYgR0NfRElTUExBWV9DTE9DS19NQVNLKSB7Ci0JCQljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMzMzX01IWjoKLQkJCQlyZXR1cm4gMzMzMDAwOwotCQkJZGVmYXVsdDoKLQkJCWNhc2UgR0NfRElTUExBWV9DTE9DS18xOTBfMjAwX01IWjoKLQkJCQlyZXR1cm4gMTkwMDAwOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChJU19JODY1RyhkZXYpKQotCQlyZXR1cm4gMjY2MDAwOwotCWVsc2UgaWYgKElTX0k4NTUoZGV2KSkgewotCQl1MTYgaHBsbGNjID0gMDsKLQkJLyogQXNzdW1lIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGluIHRoZSBoaWdoIHNwZWVkIHN0YXRlLiAgVGhpcwotCQkgKiBzaG91bGQgYmUgdGhlIGRlZmF1bHQuCi0JCSAqLwotCQlzd2l0Y2ggKGhwbGxjYyAmIEdDX0NMT0NLX0NPTlRST0xfTUFTSykgewotCQljYXNlIEdDX0NMT0NLXzEzM18yMDA6Ci0JCWNhc2UgR0NfQ0xPQ0tfMTAwXzIwMDoKLQkJCXJldHVybiAyMDAwMDA7Ci0JCWNhc2UgR0NfQ0xPQ0tfMTY2XzI1MDoKLQkJCXJldHVybiAyNTAwMDA7Ci0JCWNhc2UgR0NfQ0xPQ0tfMTAwXzEzMzoKLQkJCXJldHVybiAxMzMwMDA7Ci0JCX0KLQl9IGVsc2UgLyogODUyLCA4MzAgKi8KK3N0YXRpYyBpbnQgaTkxNWdtX2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTE2IGdjZmdjID0gMDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldi0+cGRldiwgR0NGR0MsICZnY2ZnYyk7CisKKwlpZiAoZ2NmZ2MgJiBHQ19MT1dfRlJFUVVFTkNZX0VOQUJMRSkKIAkJcmV0dXJuIDEzMzAwMDsKKwllbHNlIHsKKwkJc3dpdGNoIChnY2ZnYyAmIEdDX0RJU1BMQVlfQ0xPQ0tfTUFTSykgeworCQljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMzMzX01IWjoKKwkJCXJldHVybiAzMzMwMDA7CisJCWRlZmF1bHQ6CisJCWNhc2UgR0NfRElTUExBWV9DTE9DS18xOTBfMjAwX01IWjoKKwkJCXJldHVybiAxOTAwMDA7CisJCX0KKwl9Cit9CiAKLQlyZXR1cm4gMDsgLyogU2lsZW5jZSBnY2Mgd2FybmluZyAqLworc3RhdGljIGludCBpODY1X2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDI2NjAwMDsKK30KKworc3RhdGljIGludCBpODU1X2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTE2IGhwbGxjYyA9IDA7CisJLyogQXNzdW1lIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGluIHRoZSBoaWdoIHNwZWVkIHN0YXRlLiAgVGhpcworCSAqIHNob3VsZCBiZSB0aGUgZGVmYXVsdC4KKwkgKi8KKwlzd2l0Y2ggKGhwbGxjYyAmIEdDX0NMT0NLX0NPTlRST0xfTUFTSykgeworCWNhc2UgR0NfQ0xPQ0tfMTMzXzIwMDoKKwljYXNlIEdDX0NMT0NLXzEwMF8yMDA6CisJCXJldHVybiAyMDAwMDA7CisJY2FzZSBHQ19DTE9DS18xNjZfMjUwOgorCQlyZXR1cm4gMjUwMDAwOworCWNhc2UgR0NfQ0xPQ0tfMTAwXzEzMzoKKwkJcmV0dXJuIDEzMzAwMDsKKwl9CisKKwkvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgzMF9nZXRfZGlzcGxheV9jbG9ja19zcGVlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXJldHVybiAxMzMwMDA7CiB9CiAKIC8qKgpAQCAtMTgwOSw3ICsyMDg2LDcgQEAKICNkZWZpbmUgTElOS19OIDB4ODAwMDAKIAogc3RhdGljIHZvaWQKLWlnZG5nX2NvbXB1dGVfbV9uKGludCBieXRlc19wZXJfcGl4ZWwsIGludCBubGFuZXMsCitpZ2RuZ19jb21wdXRlX21fbihpbnQgYml0c19wZXJfcGl4ZWwsIGludCBubGFuZXMsCiAJCWludCBwaXhlbF9jbG9jaywgaW50IGxpbmtfY2xvY2ssCiAJCXN0cnVjdCBmZGlfbV9uICptX24pCiB7CkBAIC0xODE5LDcgKzIwOTYsOCBAQAogCiAJdGVtcCA9ICh1NjQpIERBVEFfTiAqIHBpeGVsX2Nsb2NrOwogCXRlbXAgPSBkaXZfdTY0KHRlbXAsIGxpbmtfY2xvY2spOwotCW1fbi0+Z21jaF9tID0gZGl2X3U2NCh0ZW1wICogYnl0ZXNfcGVyX3BpeGVsLCBubGFuZXMpOworCW1fbi0+Z21jaF9tID0gZGl2X3U2NCh0ZW1wICogYml0c19wZXJfcGl4ZWwsIG5sYW5lcyk7CisJbV9uLT5nbWNoX20gPj49IDM7IC8qIGNvbnZlcnQgdG8gYnl0ZXNfcGVyX3BpeGVsICovCiAJbV9uLT5nbWNoX24gPSBEQVRBX047CiAJZmRpX3JlZHVjZV9yYXRpbygmbV9uLT5nbWNoX20sICZtX24tPmdtY2hfbik7CiAKQEAgLTE4NjcsNiArMjE0NSwxMyBAQAogCUlHRF9DVVJTT1JfR1VBUkRfV00sCiAJSUdEX0ZJRk9fTElORV9TSVpFCiB9Oworc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIGc0eF93bV9pbmZvID0geworCUc0WF9GSUZPX1NJWkUsCisJRzRYX01BWF9XTSwKKwlHNFhfTUFYX1dNLAorCTIsCisJRzRYX0ZJRk9fTElORV9TSVpFLAorfTsKIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBpOTQ1X3dtX2luZm8gPSB7CiAJSTk0NV9GSUZPX1NJWkUsCiAJSTkxNV9NQVhfV00sCkBAIC0xOTIxLDcgKzIyMDYsMTQgQEAKIHsKIAlsb25nIGVudHJpZXNfcmVxdWlyZWQsIHdtX3NpemU7CiAKLQllbnRyaWVzX3JlcXVpcmVkID0gKGNsb2NrX2luX2toeiAqIHBpeGVsX3NpemUgKiBsYXRlbmN5X25zKSAvIDEwMDAwMDA7CisJLyoKKwkgKiBOb3RlOiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyBmb3IgdmFyaW91cyBjbG9jayAmCisJICogbGF0ZW5jeSB2YWx1ZXMuCisJICogY2xvY2tzIGdvIGZyb20gYSBmZXcgdGhvdXNhbmQgdG8gc2V2ZXJhbCBodW5kcmVkIHRob3VzYW5kLgorCSAqIGxhdGVuY3kgaXMgdXN1YWxseSBhIGZldyB0aG91c2FuZAorCSAqLworCWVudHJpZXNfcmVxdWlyZWQgPSAoKGNsb2NrX2luX2toeiAvIDEwMDApICogcGl4ZWxfc2l6ZSAqIGxhdGVuY3lfbnMpIC8KKwkJMTAwMDsKIAllbnRyaWVzX3JlcXVpcmVkIC89IHdtLT5jYWNoZWxpbmVfc2l6ZTsKIAogCURSTV9ERUJVRygiRklGTyBlbnRyaWVzIHJlcXVpcmVkIGZvciBtb2RlOiAlZFxuIiwgZW50cmllc19yZXF1aXJlZCk7CkBAIC0xOTg2LDE0ICsyMjc4LDEzIEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3hzcl9sYXRlbmN5X3RhYmxlKTsgaSsrKSB7CiAJCWxhdGVuY3kgPSAmY3hzcl9sYXRlbmN5X3RhYmxlW2ldOwogCQlpZiAoaXNfZGVza3RvcCA9PSBsYXRlbmN5LT5pc19kZXNrdG9wICYmCi0JCQlmc2IgPT0gbGF0ZW5jeS0+ZnNiX2ZyZXEgJiYgbWVtID09IGxhdGVuY3ktPm1lbV9mcmVxKQotCQkJYnJlYWs7CisJCSAgICBmc2IgPT0gbGF0ZW5jeS0+ZnNiX2ZyZXEgJiYgbWVtID09IGxhdGVuY3ktPm1lbV9mcmVxKQorCQkJcmV0dXJuIGxhdGVuY3k7CiAJfQotCWlmIChpID49IEFSUkFZX1NJWkUoY3hzcl9sYXRlbmN5X3RhYmxlKSkgewotCQlEUk1fREVCVUcoIlVua25vd24gRlNCL01FTSBmb3VuZCwgZGlzYWJsZSBDeFNSXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBsYXRlbmN5OworCisJRFJNX0RFQlVHKCJVbmtub3duIEZTQi9NRU0gZm91bmQsIGRpc2FibGUgQ3hTUlxuIik7CisKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgaWdkX2Rpc2FibGVfY3hzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMjA4NCwzMiArMjM3NSwxNyBAQAogICovCiBjb25zdCBzdGF0aWMgaW50IGxhdGVuY3lfbnMgPSA1MDAwOwogCi1zdGF0aWMgaW50IGludGVsX2dldF9maWZvX3NpemUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBsYW5lKQorc3RhdGljIGludCBpOXh4X2dldF9maWZvX3NpemUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBsYW5lKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgZHNwYXJiID0gSTkxNV9SRUFEKERTUEFSQik7CiAJaW50IHNpemU7CiAKLQlpZiAoSVNfSTlYWChkZXYpKSB7Ci0JCWlmIChwbGFuZSA9PSAwKQotCQkJc2l6ZSA9IGRzcGFyYiAmIDB4N2Y7Ci0JCWVsc2UKLQkJCXNpemUgPSAoKGRzcGFyYiA+PiBEU1BBUkJfQ1NUQVJUX1NISUZUKSAmIDB4N2YpIC0KLQkJCQkoZHNwYXJiICYgMHg3Zik7Ci0JfSBlbHNlIGlmIChJU19JODVYKGRldikpIHsKLQkJaWYgKHBsYW5lID09IDApCi0JCQlzaXplID0gZHNwYXJiICYgMHgxZmY7Ci0JCWVsc2UKLQkJCXNpemUgPSAoKGRzcGFyYiA+PiBEU1BBUkJfQkVORF9TSElGVCkgJiAweDFmZikgLQotCQkJCShkc3BhcmIgJiAweDFmZik7Ci0JCXNpemUgPj49IDE7IC8qIENvbnZlcnQgdG8gY2FjaGVsaW5lcyAqLwotCX0gZWxzZSBpZiAoSVNfODQ1RyhkZXYpKSB7CisJaWYgKHBsYW5lID09IDApCiAJCXNpemUgPSBkc3BhcmIgJiAweDdmOwotCQlzaXplID4+PSAyOyAvKiBDb252ZXJ0IHRvIGNhY2hlbGluZXMgKi8KLQl9IGVsc2UgewotCQlzaXplID0gZHNwYXJiICYgMHg3ZjsKLQkJc2l6ZSA+Pj0gMTsgLyogQ29udmVydCB0byBjYWNoZWxpbmVzICovCi0JfQorCWVsc2UKKwkJc2l6ZSA9ICgoZHNwYXJiID4+IERTUEFSQl9DU1RBUlRfU0hJRlQpICYgMHg3ZikgLQorCQkJKGRzcGFyYiAmIDB4N2YpOwogCiAJRFJNX0RFQlVHKCJGSUZPIHNpemUgLSAoMHglMDh4KSAlczogJWRcbiIsIGRzcGFyYiwgcGxhbmUgPyAiQiIgOiAiQSIsCiAJCSAgc2l6ZSk7CkBAIC0yMTE3LDE5ICsyMzkzLDEyNyBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgdm9pZCBnNHhfdXBkYXRlX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGk4NXhfZ2V0X2ZpZm9fc2l6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmUpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgZndfYmxjX3NlbGYgPSBJOTE1X1JFQUQoRldfQkxDX1NFTEYpOworCXVpbnQzMl90IGRzcGFyYiA9IEk5MTVfUkVBRChEU1BBUkIpOworCWludCBzaXplOwogCi0JaWYgKGk5MTVfcG93ZXJzYXZlKQotCQlmd19ibGNfc2VsZiB8PSBGV19CTENfU0VMRl9FTjsKKwlpZiAocGxhbmUgPT0gMCkKKwkJc2l6ZSA9IGRzcGFyYiAmIDB4MWZmOwogCWVsc2UKLQkJZndfYmxjX3NlbGYgJj0gfkZXX0JMQ19TRUxGX0VOOwotCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIGZ3X2JsY19zZWxmKTsKKwkJc2l6ZSA9ICgoZHNwYXJiID4+IERTUEFSQl9CRU5EX1NISUZUKSAmIDB4MWZmKSAtCisJCQkoZHNwYXJiICYgMHgxZmYpOworCXNpemUgPj49IDE7IC8qIENvbnZlcnQgdG8gY2FjaGVsaW5lcyAqLworCisJRFJNX0RFQlVHKCJGSUZPIHNpemUgLSAoMHglMDh4KSAlczogJWRcbiIsIGRzcGFyYiwgcGxhbmUgPyAiQiIgOiAiQSIsCisJCSAgc2l6ZSk7CisKKwlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIHZvaWQgaTk2NV91cGRhdGVfd20oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaTg0NV9nZXRfZmlmb19zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGRzcGFyYiA9IEk5MTVfUkVBRChEU1BBUkIpOworCWludCBzaXplOworCisJc2l6ZSA9IGRzcGFyYiAmIDB4N2Y7CisJc2l6ZSA+Pj0gMjsgLyogQ29udmVydCB0byBjYWNoZWxpbmVzICovCisKKwlEUk1fREVCVUcoIkZJRk8gc2l6ZSAtICgweCUwOHgpICVzOiAlZFxuIiwgZHNwYXJiLCBwbGFuZSA/ICJCIiA6ICJBIiwKKwkJICBzaXplKTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGk4MzBfZ2V0X2ZpZm9fc2l6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBkc3BhcmIgPSBJOTE1X1JFQUQoRFNQQVJCKTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBkc3BhcmIgJiAweDdmOworCXNpemUgPj49IDE7IC8qIENvbnZlcnQgdG8gY2FjaGVsaW5lcyAqLworCisJRFJNX0RFQlVHKCJGSUZPIHNpemUgLSAoMHglMDh4KSAlczogJWRcbiIsIGRzcGFyYiwgcGxhbmUgPyAiQiIgOiAiQSIsCisJCSAgc2l6ZSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgZzR4X3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCAgaW50IHBsYW5lYV9jbG9jaywKKwkJCSAgaW50IHBsYW5lYl9jbG9jaywgaW50IHNyX2hkaXNwbGF5LCBpbnQgcGl4ZWxfc2l6ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCB0b3RhbF9zaXplLCBjYWNoZWxpbmVfc2l6ZTsKKwlpbnQgcGxhbmVhX3dtLCBwbGFuZWJfd20sIGN1cnNvcmFfd20sIGN1cnNvcmJfd20sIGN1cnNvcl9zcjsKKwlzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBwbGFuZWFfcGFyYW1zLCBwbGFuZWJfcGFyYW1zOworCXVuc2lnbmVkIGxvbmcgbGluZV90aW1lX3VzOworCWludCBzcl9jbG9jaywgc3JfZW50cmllcyA9IDAsIGVudHJpZXNfcmVxdWlyZWQ7CisKKwkvKiBDcmVhdGUgY29waWVzIG9mIHRoZSBiYXNlIHNldHRpbmdzIGZvciBlYWNoIHBpcGUgKi8KKwlwbGFuZWFfcGFyYW1zID0gcGxhbmViX3BhcmFtcyA9IGc0eF93bV9pbmZvOworCisJLyogR3JhYiBhIGNvdXBsZSBvZiBnbG9iYWwgdmFsdWVzIGJlZm9yZSB3ZSBvdmVyd3JpdGUgdGhlbSAqLworCXRvdGFsX3NpemUgPSBwbGFuZWFfcGFyYW1zLmZpZm9fc2l6ZTsKKwljYWNoZWxpbmVfc2l6ZSA9IHBsYW5lYV9wYXJhbXMuY2FjaGVsaW5lX3NpemU7CisKKwkvKgorCSAqIE5vdGU6IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IGZvciB2YXJpb3VzIGNsb2NrICYKKwkgKiBsYXRlbmN5IHZhbHVlcy4KKwkgKiBjbG9ja3MgZ28gZnJvbSBhIGZldyB0aG91c2FuZCB0byBzZXZlcmFsIGh1bmRyZWQgdGhvdXNhbmQuCisJICogbGF0ZW5jeSBpcyB1c3VhbGx5IGEgZmV3IHRob3VzYW5kCisJICovCisJZW50cmllc19yZXF1aXJlZCA9ICgocGxhbmVhX2Nsb2NrIC8gMTAwMCkgKiBwaXhlbF9zaXplICogbGF0ZW5jeV9ucykgLworCQkxMDAwOworCWVudHJpZXNfcmVxdWlyZWQgLz0gRzRYX0ZJRk9fTElORV9TSVpFOworCXBsYW5lYV93bSA9IGVudHJpZXNfcmVxdWlyZWQgKyBwbGFuZWFfcGFyYW1zLmd1YXJkX3NpemU7CisKKwllbnRyaWVzX3JlcXVpcmVkID0gKChwbGFuZWJfY2xvY2sgLyAxMDAwKSAqIHBpeGVsX3NpemUgKiBsYXRlbmN5X25zKSAvCisJCTEwMDA7CisJZW50cmllc19yZXF1aXJlZCAvPSBHNFhfRklGT19MSU5FX1NJWkU7CisJcGxhbmViX3dtID0gZW50cmllc19yZXF1aXJlZCArIHBsYW5lYl9wYXJhbXMuZ3VhcmRfc2l6ZTsKKworCWN1cnNvcmFfd20gPSBjdXJzb3JiX3dtID0gMTY7CisJY3Vyc29yX3NyID0gMzI7CisKKwlEUk1fREVCVUcoIkZJRk8gd2F0ZXJtYXJrcyAtIEE6ICVkLCBCOiAlZFxuIiwgcGxhbmVhX3dtLCBwbGFuZWJfd20pOworCisJLyogQ2FsYyBzciBlbnRyaWVzIGZvciBvbmUgcGxhbmUgY29uZmlncyAqLworCWlmIChzcl9oZGlzcGxheSAmJiAoIXBsYW5lYV9jbG9jayB8fCAhcGxhbmViX2Nsb2NrKSkgeworCQkvKiBzZWxmLXJlZnJlc2ggaGFzIG11Y2ggaGlnaGVyIGxhdGVuY3kgKi8KKwkJY29uc3Qgc3RhdGljIGludCBzcl9sYXRlbmN5X25zID0gMTIwMDA7CisKKwkJc3JfY2xvY2sgPSBwbGFuZWFfY2xvY2sgPyBwbGFuZWFfY2xvY2sgOiBwbGFuZWJfY2xvY2s7CisJCWxpbmVfdGltZV91cyA9ICgoc3JfaGRpc3BsYXkgKiAxMDAwKSAvIHNyX2Nsb2NrKTsKKworCQkvKiBVc2UgbnMvdXMgdGhlbiBkaXZpZGUgdG8gcHJlc2VydmUgcHJlY2lzaW9uICovCisJCXNyX2VudHJpZXMgPSAoKChzcl9sYXRlbmN5X25zIC8gbGluZV90aW1lX3VzKSArIDEpICoKKwkJCSAgICAgIHBpeGVsX3NpemUgKiBzcl9oZGlzcGxheSkgLyAxMDAwOworCQlzcl9lbnRyaWVzID0gcm91bmR1cChzcl9lbnRyaWVzIC8gY2FjaGVsaW5lX3NpemUsIDEpOworCQlEUk1fREVCVUcoInNlbGYtcmVmcmVzaCBlbnRyaWVzOiAlZFxuIiwgc3JfZW50cmllcyk7CisJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIEZXX0JMQ19TRUxGX0VOKTsKKwl9CisKKwlEUk1fREVCVUcoIlNldHRpbmcgRklGTyB3YXRlcm1hcmtzIC0gQTogJWQsIEI6ICVkLCBTUiAlZFxuIiwKKwkJICBwbGFuZWFfd20sIHBsYW5lYl93bSwgc3JfZW50cmllcyk7CisKKwlwbGFuZWFfd20gJj0gMHgzZjsKKwlwbGFuZWJfd20gJj0gMHgzZjsKKworCUk5MTVfV1JJVEUoRFNQRlcxLCAoc3JfZW50cmllcyA8PCBEU1BGV19TUl9TSElGVCkgfAorCQkgICAoY3Vyc29yYl93bSA8PCBEU1BGV19DVVJTT1JCX1NISUZUKSB8CisJCSAgIChwbGFuZWJfd20gPDwgRFNQRldfUExBTkVCX1NISUZUKSB8IHBsYW5lYV93bSk7CisJSTkxNV9XUklURShEU1BGVzIsIChJOTE1X1JFQUQoRFNQRlcyKSAmIERTUEZXX0NVUlNPUkFfTUFTSykgfAorCQkgICAoY3Vyc29yYV93bSA8PCBEU1BGV19DVVJTT1JBX1NISUZUKSk7CisJLyogSFBMTCBvZmYgaW4gU1IgaGFzIHNvbWUgaXNzdWVzIG9uIEc0eC4uLiBkaXNhYmxlIGl0ICovCisJSTkxNV9XUklURShEU1BGVzMsIChJOTE1X1JFQUQoRFNQRlczKSAmIH5EU1BGV19IUExMX1NSX0VOKSB8CisJCSAgIChjdXJzb3Jfc3IgPDwgRFNQRldfQ1VSU09SX1NSX1NISUZUKSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5NjVfdXBkYXRlX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCB1bnVzZWQsIGludCB1bnVzZWQyLAorCQkJICAgaW50IHVudXNlZDMsIGludCB1bnVzZWQ0KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTIxNjUsOCArMjU0OSw4IEBACiAJY2FjaGVsaW5lX3NpemUgPSBwbGFuZWFfcGFyYW1zLmNhY2hlbGluZV9zaXplOwogCiAJLyogVXBkYXRlIHBlci1wbGFuZSBGSUZPIHNpemVzICovCi0JcGxhbmVhX3BhcmFtcy5maWZvX3NpemUgPSBpbnRlbF9nZXRfZmlmb19zaXplKGRldiwgMCk7Ci0JcGxhbmViX3BhcmFtcy5maWZvX3NpemUgPSBpbnRlbF9nZXRfZmlmb19zaXplKGRldiwgMSk7CisJcGxhbmVhX3BhcmFtcy5maWZvX3NpemUgPSBkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplKGRldiwgMCk7CisJcGxhbmViX3BhcmFtcy5maWZvX3NpemUgPSBkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplKGRldiwgMSk7CiAKIAlwbGFuZWFfd20gPSBpbnRlbF9jYWxjdWxhdGVfd20ocGxhbmVhX2Nsb2NrLCAmcGxhbmVhX3BhcmFtcywKIAkJCQkgICAgICAgcGl4ZWxfc2l6ZSwgbGF0ZW5jeV9ucyk7CkBAIC0yMjEzLDE0ICsyNTk3LDE0IEBACiAJSTkxNV9XUklURShGV19CTEMyLCBmd2F0ZXJfaGkpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmVhX2Nsb2NrLAotCQkJICAgaW50IHBpeGVsX3NpemUpCitzdGF0aWMgdm9pZCBpODMwX3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmVhX2Nsb2NrLCBpbnQgdW51c2VkLAorCQkJICAgaW50IHVudXNlZDIsIGludCBwaXhlbF9zaXplKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgZndhdGVyX2xvID0gSTkxNV9SRUFEKEZXX0JMQykgJiB+MHhmZmY7CiAJaW50IHBsYW5lYV93bTsKIAotCWk4MzBfd21faW5mby5maWZvX3NpemUgPSBpbnRlbF9nZXRfZmlmb19zaXplKGRldiwgMCk7CisJaTgzMF93bV9pbmZvLmZpZm9fc2l6ZSA9IGRldl9wcml2LT5kaXNwbGF5LmdldF9maWZvX3NpemUoZGV2LCAwKTsKIAogCXBsYW5lYV93bSA9IGludGVsX2NhbGN1bGF0ZV93bShwbGFuZWFfY2xvY2ssICZpODMwX3dtX2luZm8sCiAJCQkJICAgICAgIHBpeGVsX3NpemUsIGxhdGVuY3lfbnMpOwpAQCAtMjI2NCwxMiArMjY0OCwxNiBAQAogICAqLwogc3RhdGljIHZvaWQgaW50ZWxfdXBkYXRlX3dhdGVybWFya3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YzsKIAlpbnQgc3JfaGRpc3BsYXkgPSAwOwogCXVuc2lnbmVkIGxvbmcgcGxhbmVhX2Nsb2NrID0gMCwgcGxhbmViX2Nsb2NrID0gMCwgc3JfY2xvY2sgPSAwOwogCWludCBlbmFibGVkID0gMCwgcGl4ZWxfc2l6ZSA9IDA7CiAKKwlpZiAoIWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSkKKwkJcmV0dXJuOworCiAJLyogR2V0IHRoZSBjbG9jayBjb25maWcgZnJvbSBib3RoIHBsYW5lcyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CiAJCWludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwpAQCAtMjMwMiwxNSArMjY5MCw4IEBACiAJZWxzZSBpZiAoSVNfSUdEKGRldikpCiAJCWlnZF9kaXNhYmxlX2N4c3IoZGV2KTsKIAotCWlmIChJU19HNFgoZGV2KSkKLQkJZzR4X3VwZGF0ZV93bShkZXYpOwotCWVsc2UgaWYgKElTX0k5NjVHKGRldikpCi0JCWk5NjVfdXBkYXRlX3dtKGRldik7Ci0JZWxzZSBpZiAoSVNfSTlYWChkZXYpIHx8IElTX01PQklMRShkZXYpKQotCQlpOXh4X3VwZGF0ZV93bShkZXYsIHBsYW5lYV9jbG9jaywgcGxhbmViX2Nsb2NrLCBzcl9oZGlzcGxheSwKLQkJCSAgICAgICBwaXhlbF9zaXplKTsKLQllbHNlCi0JCWk4MzBfdXBkYXRlX3dtKGRldiwgcGxhbmVhX2Nsb2NrLCBwaXhlbF9zaXplKTsKKwlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20oZGV2LCBwbGFuZWFfY2xvY2ssIHBsYW5lYl9jbG9jaywKKwkJCQkgICAgc3JfaGRpc3BsYXksIHBpeGVsX3NpemUpOwogfQogCiBzdGF0aWMgaW50IGludGVsX2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLApAQCAtMjMyMywxMCArMjcwNCwxMSBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKIAlpbnQgZnBfcmVnID0gKHBpcGUgPT0gMCkgPyBGUEEwIDogRlBCMDsKIAlpbnQgZHBsbF9yZWcgPSAocGlwZSA9PSAwKSA/IERQTExfQSA6IERQTExfQjsKIAlpbnQgZHBsbF9tZF9yZWcgPSAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKSA/IERQTExfQV9NRCA6IERQTExfQl9NRDsKLQlpbnQgZHNwY250cl9yZWcgPSAocGlwZSA9PSAwKSA/IERTUEFDTlRSIDogRFNQQkNOVFI7CisJaW50IGRzcGNudHJfcmVnID0gKHBsYW5lID09IDApID8gRFNQQUNOVFIgOiBEU1BCQ05UUjsKIAlpbnQgcGlwZWNvbmZfcmVnID0gKHBpcGUgPT0gMCkgPyBQSVBFQUNPTkYgOiBQSVBFQkNPTkY7CiAJaW50IGh0b3RfcmVnID0gKHBpcGUgPT0gMCkgPyBIVE9UQUxfQSA6IEhUT1RBTF9COwogCWludCBoYmxhbmtfcmVnID0gKHBpcGUgPT0gMCkgPyBIQkxBTktfQSA6IEhCTEFOS19COwpAQCAtMjMzNCw4ICsyNzE2LDggQEAKIAlpbnQgdnRvdF9yZWcgPSAocGlwZSA9PSAwKSA/IFZUT1RBTF9BIDogVlRPVEFMX0I7CiAJaW50IHZibGFua19yZWcgPSAocGlwZSA9PSAwKSA/IFZCTEFOS19BIDogVkJMQU5LX0I7CiAJaW50IHZzeW5jX3JlZyA9IChwaXBlID09IDApID8gVlNZTkNfQSA6IFZTWU5DX0I7Ci0JaW50IGRzcHNpemVfcmVnID0gKHBpcGUgPT0gMCkgPyBEU1BBU0laRSA6IERTUEJTSVpFOwotCWludCBkc3Bwb3NfcmVnID0gKHBpcGUgPT0gMCkgPyBEU1BBUE9TIDogRFNQQlBPUzsKKwlpbnQgZHNwc2l6ZV9yZWcgPSAocGxhbmUgPT0gMCkgPyBEU1BBU0laRSA6IERTUEJTSVpFOworCWludCBkc3Bwb3NfcmVnID0gKHBsYW5lID09IDApID8gRFNQQVBPUyA6IERTUEJQT1M7CiAJaW50IHBpcGVzcmNfcmVnID0gKHBpcGUgPT0gMCkgPyBQSVBFQVNSQyA6IFBJUEVCU1JDOwogCWludCByZWZjbGssIG51bV9vdXRwdXRzID0gMDsKIAlpbnRlbF9jbG9ja190IGNsb2NrLCByZWR1Y2VkX2Nsb2NrOwpAQCAtMjQ1Myw3ICsyODM1LDcgQEAKIAogCS8qIEZESSBsaW5rICovCiAJaWYgKElTX0lHRE5HKGRldikpIHsKLQkJaW50IGxhbmUsIGxpbmtfYnc7CisJCWludCBsYW5lLCBsaW5rX2J3LCBicHA7CiAJCS8qIGVEUCBkb2Vzbid0IHJlcXVpcmUgRkRJIGxpbmssIHNvIGp1c3Qgc2V0IERQIE0vTgogCQkgICBhY2NvcmRpbmcgdG8gY3VycmVudCBsaW5rIGNvbmZpZyAqLwogCQlpZiAoaXNfZWRwKSB7CkBAIC0yNDcyLDEwICsyODU0LDcyIEBACiAJCQlsYW5lID0gNDsKIAkJCWxpbmtfYncgPSAyNzAwMDA7CiAJCX0KLQkJaWdkbmdfY29tcHV0ZV9tX24oMywgbGFuZSwgdGFyZ2V0X2Nsb2NrLAorCisJCS8qIGRldGVybWluZSBwYW5lbCBjb2xvciBkZXB0aCAqLworCQl0ZW1wID0gSTkxNV9SRUFEKHBpcGVjb25mX3JlZyk7CisKKwkJc3dpdGNoICh0ZW1wICYgUElQRV9CUENfTUFTSykgeworCQljYXNlIFBJUEVfOEJQQzoKKwkJCWJwcCA9IDI0OworCQkJYnJlYWs7CisJCWNhc2UgUElQRV8xMEJQQzoKKwkJCWJwcCA9IDMwOworCQkJYnJlYWs7CisJCWNhc2UgUElQRV82QlBDOgorCQkJYnBwID0gMTg7CisJCQlicmVhazsKKwkJY2FzZSBQSVBFXzEyQlBDOgorCQkJYnBwID0gMzY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigidW5rbm93biBwaXBlIGJwYyB2YWx1ZVxuIik7CisJCQlicHAgPSAyNDsKKwkJfQorCisJCWlnZG5nX2NvbXB1dGVfbV9uKGJwcCwgbGFuZSwgdGFyZ2V0X2Nsb2NrLAogCQkJCSAgbGlua19idywgJm1fbik7CiAJfQogCisJLyogSXJvbmxha2U6IHRyeSB0byBzZXR1cCBkaXNwbGF5IHJlZiBjbG9jayBiZWZvcmUgRFBMTAorCSAqIGVuYWJsaW5nLiBUaGlzIGlzIG9ubHkgdW5kZXIgZHJpdmVyJ3MgY29udHJvbCBhZnRlcgorCSAqIFBDSCBCIHN0ZXBwaW5nLCBwcmV2aW91cyBjaGlwc2V0IHN0ZXBwaW5nIHNob3VsZCBiZQorCSAqIGlnbm9yaW5nIHRoaXMgc2V0dGluZy4KKwkgKi8KKwlpZiAoSVNfSUdETkcoZGV2KSkgeworCQl0ZW1wID0gSTkxNV9SRUFEKFBDSF9EUkVGX0NPTlRST0wpOworCQkvKiBBbHdheXMgZW5hYmxlIG5vbnNwcmVhZCBzb3VyY2UgKi8KKwkJdGVtcCAmPSB+RFJFRl9OT05TUFJFQURfU09VUkNFX01BU0s7CisJCXRlbXAgfD0gRFJFRl9OT05TUFJFQURfU09VUkNFX0VOQUJMRTsKKwkJSTkxNV9XUklURShQQ0hfRFJFRl9DT05UUk9MLCB0ZW1wKTsKKwkJUE9TVElOR19SRUFEKFBDSF9EUkVGX0NPTlRST0wpOworCisJCXRlbXAgJj0gfkRSRUZfU1NDX1NPVVJDRV9NQVNLOworCQl0ZW1wIHw9IERSRUZfU1NDX1NPVVJDRV9FTkFCTEU7CisJCUk5MTVfV1JJVEUoUENIX0RSRUZfQ09OVFJPTCwgdGVtcCk7CisJCVBPU1RJTkdfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKKworCQl1ZGVsYXkoMjAwKTsKKworCQlpZiAoaXNfZWRwKSB7CisJCQlpZiAoZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYykgeworCQkJCXRlbXAgfD0gRFJFRl9TU0MxX0VOQUJMRTsKKwkJCQlJOTE1X1dSSVRFKFBDSF9EUkVGX0NPTlRST0wsIHRlbXApOworCQkJCVBPU1RJTkdfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKKworCQkJCXVkZWxheSgyMDApOworCisJCQkJdGVtcCAmPSB+RFJFRl9DUFVfU09VUkNFX09VVFBVVF9NQVNLOworCQkJCXRlbXAgfD0gRFJFRl9DUFVfU09VUkNFX09VVFBVVF9ET1dOU1BSRUFEOworCQkJCUk5MTVfV1JJVEUoUENIX0RSRUZfQ09OVFJPTCwgdGVtcCk7CisJCQkJUE9TVElOR19SRUFEKFBDSF9EUkVGX0NPTlRST0wpOworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wIHw9IERSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfTk9OU1BSRUFEOworCQkJCUk5MTVfV1JJVEUoUENIX0RSRUZfQ09OVFJPTCwgdGVtcCk7CisJCQkJUE9TVElOR19SRUFEKFBDSF9EUkVGX0NPTlRST0wpOworCQkJfQorCQl9CisJfQorCiAJaWYgKElTX0lHRChkZXYpKSB7CiAJCWZwID0gKDEgPDwgY2xvY2subikgPDwgMTYgfCBjbG9jay5tMSA8PCA4IHwgY2xvY2subTI7CiAJCWlmIChoYXNfcmVkdWNlZF9jbG9jaykKQEAgLTI1NjgsNyArMzAxMiw3IEBACiAJICAgZW5hYmxlIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gKi8KIAlpZiAoIUlTX0lHRE5HKGRldikpIHsKIAkJaWYgKHBpcGUgPT0gMCkKLQkJCWRzcGNudHIgfD0gRElTUFBMQU5FX1NFTF9QSVBFX0E7CisJCQlkc3BjbnRyICY9IH5ESVNQUExBTkVfU0VMX1BJUEVfTUFTSzsKIAkJZWxzZQogCQkJZHNwY250ciB8PSBESVNQUExBTkVfU0VMX1BJUEVfQjsKIAl9CkBAIC0yNTgwLDcgKzMwMjQsOCBAQAogCQkgKiBYWFg6IE5vIGRvdWJsZS13aWRlIG9uIDkxNUdNIHBpcGUgQi4gSXMgdGhhdCB0aGUgb25seSByZWFzb24gZm9yIHRoZQogCQkgKiBwaXBlID09IDAgY2hlY2s/CiAJCSAqLwotCQlpZiAobW9kZS0+Y2xvY2sgPiBpbnRlbF9nZXRfY29yZV9jbG9ja19zcGVlZChkZXYpICogOSAvIDEwKQorCQlpZiAobW9kZS0+Y2xvY2sgPgorCQkgICAgZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQoZGV2KSAqIDkgLyAxMCkKIAkJCXBpcGVjb25mIHw9IFBJUEVBQ09ORl9ET1VCTEVfV0lERTsKIAkJZWxzZQogCQkJcGlwZWNvbmYgJj0gflBJUEVBQ09ORl9ET1VCTEVfV0lERTsKQEAgLTI2MjUsNiArMzA3MCw4IEBACiAKIAkJbHZkcyA9IEk5MTVfUkVBRChsdmRzX3JlZyk7CiAJCWx2ZHMgfD0gTFZEU19QT1JUX0VOIHwgTFZEU19BMEEyX0NMS0FfUE9XRVJfVVAgfCBMVkRTX1BJUEVCX1NFTEVDVDsKKwkJLyogc2V0IHRoZSBjb3JyZXNwb25zZGluZyBMVkRTX0JPUkRFUiBiaXQgKi8KKwkJbHZkcyB8PSBkZXZfcHJpdi0+bHZkc19ib3JkZXJfYml0czsKIAkJLyogU2V0IHRoZSBCMC1CMyBkYXRhIHBhaXJzIGNvcnJlc3BvbmRpbmcgdG8gd2hldGhlciB3ZSdyZSBnb2luZyB0bwogCQkgKiBzZXQgdGhlIERQTExzIGZvciBkdWFsLWNoYW5uZWwgbW9kZSBvciBub3QuCiAJCSAqLwpAQCAtMjY1Miw5ICszMDk5LDEyIEBACiAJCXVkZWxheSgxNTApOwogCiAJCWlmIChJU19JOTY1RyhkZXYpICYmICFJU19JR0RORyhkZXYpKSB7Ci0JCQlzZHZvX3BpeGVsX211bHRpcGx5ID0gYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgLyBtb2RlLT5jbG9jazsKLQkJCUk5MTVfV1JJVEUoZHBsbF9tZF9yZWcsICgwIDw8IERQTExfTURfVURJX0RJVklERVJfU0hJRlQpIHwKKwkJCWlmIChpc19zZHZvKSB7CisJCQkJc2R2b19waXhlbF9tdWx0aXBseSA9IGFkanVzdGVkX21vZGUtPmNsb2NrIC8gbW9kZS0+Y2xvY2s7CisJCQkJSTkxNV9XUklURShkcGxsX21kX3JlZywgKDAgPDwgRFBMTF9NRF9VRElfRElWSURFUl9TSElGVCkgfAogCQkJCQkoKHNkdm9fcGl4ZWxfbXVsdGlwbHkgLSAxKSA8PCBEUExMX01EX1VESV9NVUxUSVBMSUVSX1NISUZUKSk7CisJCQl9IGVsc2UKKwkJCQlJOTE1X1dSSVRFKGRwbGxfbWRfcmVnLCAwKTsKIAkJfSBlbHNlIHsKIAkJCS8qIHdyaXRlIGl0IGFnYWluIC0tIHRoZSBCSU9TIGRvZXMsIGFmdGVyIGFsbCAqLwogCQkJSTkxNV9XUklURShkcGxsX3JlZywgZHBsbCk7CkBAIC0yNzM0LDYgKzMxODQsOSBAQAogCS8qIEZsdXNoIHRoZSBwbGFuZSBjaGFuZ2VzICovCiAJcmV0ID0gaW50ZWxfcGlwZV9zZXRfYmFzZShjcnRjLCB4LCB5LCBvbGRfZmIpOwogCisJaWYgKChJU19JOTY1RyhkZXYpIHx8IHBsYW5lID09IDApKQorCQlpbnRlbF91cGRhdGVfZmJjKGNydGMsICZjcnRjLT5tb2RlKTsKKwogCWludGVsX3VwZGF0ZV93YXRlcm1hcmtzKGRldik7CiAKIAlkcm1fdmJsYW5rX3Bvc3RfbW9kZXNldChkZXYsIHBpcGUpOwpAQCAtMjg2Myw2ICszMzE2LDcgQEAKIAkJCWk5MTVfZ2VtX29iamVjdF91bnBpbihpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOwogCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOwogCX0KKwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJaW50ZWxfY3J0Yy0+Y3Vyc29yX2FkZHIgPSBhZGRyOwpAQCAtMjkyMiw2ICszMzc2LDE2IEBACiAJaW50ZWxfY3J0Yy0+bHV0X2JbcmVnbm9dID0gYmx1ZSA+PiA4OwogfQogCit2b2lkIGludGVsX2NydGNfZmJfZ2FtbWFfZ2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2ICpyZWQsIHUxNiAqZ3JlZW4sCisJCQkgICAgIHUxNiAqYmx1ZSwgaW50IHJlZ25vKQoreworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKworCSpyZWQgPSBpbnRlbF9jcnRjLT5sdXRfcltyZWdub10gPDwgODsKKwkqZ3JlZW4gPSBpbnRlbF9jcnRjLT5sdXRfZ1tyZWdub10gPDwgODsKKwkqYmx1ZSA9IGludGVsX2NydGMtPmx1dF9iW3JlZ25vXSA8PCA4OworfQorCiBzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX2dhbW1hX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUxNiAqcmVkLCB1MTYgKmdyZWVuLAogCQkJCSB1MTYgKmJsdWUsIHVpbnQzMl90IHNpemUpCiB7CkBAIC0zNTEzLDYgKzM5NzcsNyBAQAogCS5tb2RlX3NldF9iYXNlID0gaW50ZWxfcGlwZV9zZXRfYmFzZSwKIAkucHJlcGFyZSA9IGludGVsX2NydGNfcHJlcGFyZSwKIAkuY29tbWl0ID0gaW50ZWxfY3J0Y19jb21taXQsCisJLmxvYWRfbHV0ID0gaW50ZWxfY3J0Y19sb2FkX2x1dCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgaW50ZWxfY3J0Y19mdW5jcyA9IHsKQEAgLTM1NDQsNiArNDAwOSwxNCBAQAogCQlpbnRlbF9jcnRjLT5sdXRfYltpXSA9IGk7CiAJfQogCisJLyogU3dhcCBwaXBlcyAmIHBsYW5lcyBmb3IgRkJDIG9uIHByZS05NjUgKi8KKwlpbnRlbF9jcnRjLT5waXBlID0gcGlwZTsKKwlpbnRlbF9jcnRjLT5wbGFuZSA9IHBpcGU7CisJaWYgKElTX01PQklMRShkZXYpICYmIChJU19JOVhYKGRldikgJiYgIUlTX0k5NjVHKGRldikpKSB7CisJCURSTV9ERUJVRygic3dhcHBpbmcgcGlwZXMgJiBwbGFuZXMgZm9yIEZCQ1xuIik7CisJCWludGVsX2NydGMtPnBsYW5lID0gKChwaXBlID09IDApID8gMSA6IDApOworCX0KKwogCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gMDsKIAlpbnRlbF9jcnRjLT5kcG1zX21vZGUgPSBEUk1fTU9ERV9EUE1TX09GRjsKIAlkcm1fY3J0Y19oZWxwZXJfYWRkKCZpbnRlbF9jcnRjLT5iYXNlLCAmaW50ZWxfaGVscGVyX2Z1bmNzKTsKQEAgLTM3ODcsNyArNDI2MCw5IEBACiAJICogRGlzYWJsZSBjbG9jayBnYXRpbmcgcmVwb3J0ZWQgdG8gd29yayBpbmNvcnJlY3RseSBhY2NvcmRpbmcgdG8gdGhlCiAJICogc3BlY3MsIGJ1dCBlbmFibGUgYXMgbXVjaCBlbHNlIGFzIHdlIGNhbi4KIAkgKi8KLQlpZiAoSVNfRzRYKGRldikpIHsKKwlpZiAoSVNfSUdETkcoZGV2KSkgeworCQlyZXR1cm47CisJfSBlbHNlIGlmIChJU19HNFgoZGV2KSkgewogCQl1aW50MzJfdCBkc3BjbGtfZ2F0ZTsKIAkJSTkxNV9XUklURShSRU5DTEtfR0FURV9EMSwgMCk7CiAJCUk5MTVfV1JJVEUoUkVOQ0xLX0dBVEVfRDIsIFZGX1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFIHwKQEAgLTM4MjYsNiArNDMwMSw3NSBAQAogCX0KIH0KIAorLyogU2V0IHVwIGNoaXAgc3BlY2lmaWMgZGlzcGxheSBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGludGVsX2luaXRfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBXZSBhbHdheXMgd2FudCBhIERQTVMgZnVuY3Rpb24gKi8KKwlpZiAoSVNfSUdETkcoZGV2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZHBtcyA9IGlnZG5nX2NydGNfZHBtczsKKwllbHNlCisJCWRldl9wcml2LT5kaXNwbGF5LmRwbXMgPSBpOXh4X2NydGNfZHBtczsKKworCS8qIE9ubHkgbW9iaWxlIGhhcyBGQkMsIGxlYXZlIHBvaW50ZXJzIE5VTEwgZm9yIG90aGVyIGNoaXBzICovCisJaWYgKElTX01PQklMRShkZXYpKSB7CisJCWlmIChJU19HTTQ1KGRldikpIHsKKwkJCWRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkID0gZzR4X2ZiY19lbmFibGVkOworCQkJZGV2X3ByaXYtPmRpc3BsYXkuZW5hYmxlX2ZiYyA9IGc0eF9lbmFibGVfZmJjOworCQkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMgPSBnNHhfZGlzYWJsZV9mYmM7CisJCX0gZWxzZSBpZiAoSVNfSTk2NUdNKGRldikgfHwgSVNfSTk0NUdNKGRldikgfHwgSVNfSTkxNUdNKGRldikpIHsKKwkJCWRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkID0gaTh4eF9mYmNfZW5hYmxlZDsKKwkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgPSBpOHh4X2VuYWJsZV9mYmM7CisJCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyA9IGk4eHhfZGlzYWJsZV9mYmM7CisJCX0KKwkJLyogODU1R00gbmVlZHMgdGVzdGluZyAqLworCX0KKworCS8qIFJldHVybnMgdGhlIGNvcmUgZGlzcGxheSBjbG9jayBzcGVlZCAqLworCWlmIChJU19JOTQ1RyhkZXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZGlzcGxheV9jbG9ja19zcGVlZCA9CisJCQlpOTQ1X2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkOworCWVsc2UgaWYgKElTX0k5MTVHKGRldikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9kaXNwbGF5X2Nsb2NrX3NwZWVkID0KKwkJCWk5MTVfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQ7CisJZWxzZSBpZiAoSVNfSTk0NUdNKGRldikgfHwgSVNfODQ1RyhkZXYpIHx8IElTX0lHREdNKGRldikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9kaXNwbGF5X2Nsb2NrX3NwZWVkID0KKwkJCWk5eHhfbWlzY19nZXRfZGlzcGxheV9jbG9ja19zcGVlZDsKKwllbHNlIGlmIChJU19JOTE1R00oZGV2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQgPQorCQkJaTkxNWdtX2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkOworCWVsc2UgaWYgKElTX0k4NjVHKGRldikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9kaXNwbGF5X2Nsb2NrX3NwZWVkID0KKwkJCWk4NjVfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQ7CisJZWxzZSBpZiAoSVNfSTg1NShkZXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZGlzcGxheV9jbG9ja19zcGVlZCA9CisJCQlpODU1X2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkOworCWVsc2UgLyogODUyLCA4MzAgKi8KKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQgPQorCQkJaTgzMF9nZXRfZGlzcGxheV9jbG9ja19zcGVlZDsKKworCS8qIEZvciBGSUZPIHdhdGVybWFyayB1cGRhdGVzICovCisJaWYgKElTX0lHRE5HKGRldikpCisJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7CisJZWxzZSBpZiAoSVNfRzRYKGRldikpCisJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGc0eF91cGRhdGVfd207CisJZWxzZSBpZiAoSVNfSTk2NUcoZGV2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gaTk2NV91cGRhdGVfd207CisJZWxzZSBpZiAoSVNfSTlYWChkZXYpIHx8IElTX01PQklMRShkZXYpKSB7CisJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGk5eHhfdXBkYXRlX3dtOworCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplID0gaTl4eF9nZXRfZmlmb19zaXplOworCX0gZWxzZSB7CisJCWlmIChJU19JODVYKGRldikpCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplID0gaTg1eF9nZXRfZmlmb19zaXplOworCQllbHNlIGlmIChJU184NDVHKGRldikpCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplID0gaTg0NV9nZXRfZmlmb19zaXplOworCQllbHNlCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplID0gaTgzMF9nZXRfZmlmb19zaXplOworCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBpODMwX3VwZGF0ZV93bTsKKwl9Cit9CisKIHZvaWQgaW50ZWxfbW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTM4MzksNiArNDM4Myw4IEBACiAKIAlkZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmaW50ZWxfbW9kZV9mdW5jczsKIAorCWludGVsX2luaXRfZGlzcGxheShkZXYpOworCiAJaWYgKElTX0k5NjVHKGRldikpIHsKIAkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA4MTkyOwogCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA4MTkyOwpAQCAtMzkwNCw2ICs0NDUwLDkgQEAKIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCisJaWYgKGRldl9wcml2LT5kaXNwbGF5LmRpc2FibGVfZmJjKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyhkZXYpOworCiAJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKaW5kZXggZjQ4NTZhNS4uZDgzNDQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCkBAIC00MDAsNyArNDAwLDcgQEAKIHsKIAlzdHJ1Y3QgaW50ZWxfZHBfcHJpdiAgICpkcF9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKIAotCURSTV9FUlJPUigiaTJjX2luaXQgJXNcbiIsIG5hbWUpOworCURSTV9ERUJVR19LTVMoImkyY19pbml0ICVzXG4iLCBuYW1lKTsKIAlkcF9wcml2LT5hbGdvLnJ1bm5pbmcgPSBmYWxzZTsKIAlkcF9wcml2LT5hbGdvLmFkZHJlc3MgPSAwOwogCWRwX3ByaXYtPmFsZ28uYXV4X2NoID0gaW50ZWxfZHBfaTJjX2F1eF9jaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggM2ViYmJhYi4uZWY2MWZlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlICJpOTE1X2Rydi5oIgogI2luY2x1ZGUgImRybV9jcnRjLmgiCiAKICNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKQEAgLTExMSw4ICsxMTIsOCBAQAogCiBzdHJ1Y3QgaW50ZWxfY3J0YyB7CiAJc3RydWN0IGRybV9jcnRjIGJhc2U7Ci0JaW50IHBpcGU7Ci0JaW50IHBsYW5lOworCWVudW0gcGlwZSBwaXBlOworCWVudW0gcGxhbmUgcGxhbmU7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpjdXJzb3JfYm87CiAJdWludDMyX3QgY3Vyc29yX2FkZHI7CiAJdTggbHV0X3JbMjU2XSwgbHV0X2dbMjU2XSwgbHV0X2JbMjU2XTsKQEAgLTE3NCw2ICsxNzUsOCBAQAogZXh0ZXJuIHZvaWQgaW50ZWxmYl9yZXN0b3JlKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW50ZWxfY3J0Y19mYl9nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgcmVkLCB1MTYgZ3JlZW4sCiAJCQkJICAgIHUxNiBibHVlLCBpbnQgcmVnbm8pOworZXh0ZXJuIHZvaWQgaW50ZWxfY3J0Y19mYl9nYW1tYV9nZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwKKwkJCQkgICAgdTE2ICpibHVlLCBpbnQgcmVnbm8pOwogCiBleHRlcm4gaW50IGludGVsX2ZyYW1lYnVmZmVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jCmluZGV4IDdiYTRhMjMuLjJiMGZlNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYwpAQCAtNjAsMTAgKzYwLDEyIEBACiAJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCiAJLmZiX3Bhbl9kaXNwbGF5ID0gZHJtX2ZiX2hlbHBlcl9wYW5fZGlzcGxheSwKIAkuZmJfYmxhbmsgPSBkcm1fZmJfaGVscGVyX2JsYW5rLAorCS5mYl9zZXRjbWFwID0gZHJtX2ZiX2hlbHBlcl9zZXRjbWFwLAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZmJfaGVscGVyX2Z1bmNzIGludGVsX2ZiX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2FtbWFfc2V0ID0gaW50ZWxfY3J0Y19mYl9nYW1tYV9zZXQsCisJLmdhbW1hX2dldCA9IGludGVsX2NydGNfZmJfZ2FtbWFfZ2V0LAogfTsKIAogCkBAIC0xMTAsNiArMTEyLDcgQEAKIHN0YXRpYyBpbnQgaW50ZWxmYl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgZmJfd2lkdGgsCiAJCQkgIHVpbnQzMl90IGZiX2hlaWdodCwgdWludDMyX3Qgc3VyZmFjZV93aWR0aCwKIAkJCSAgdWludDMyX3Qgc3VyZmFjZV9oZWlnaHQsCisJCQkgIHVpbnQzMl90IHN1cmZhY2VfZGVwdGgsIHVpbnQzMl90IHN1cmZhY2VfYnBwLAogCQkJICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICoqZmJfcCkKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKQEAgLTEyMiwxMiArMTI1LDE2IEBACiAJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJmRldi0+cGRldi0+ZGV2OwogCWludCBzaXplLCByZXQsIG1taW9fYmFyID0gSVNfSTlYWChkZXYpID8gMCA6IDE7CiAKKwkvKiB3ZSBkb24ndCBkbyBwYWNrZWQgMjRicHAgKi8KKwlpZiAoc3VyZmFjZV9icHAgPT0gMjQpCisJCXN1cmZhY2VfYnBwID0gMzI7CisKIAltb2RlX2NtZC53aWR0aCA9IHN1cmZhY2Vfd2lkdGg7CiAJbW9kZV9jbWQuaGVpZ2h0ID0gc3VyZmFjZV9oZWlnaHQ7CiAKLQltb2RlX2NtZC5icHAgPSAzMjsKKwltb2RlX2NtZC5icHAgPSBzdXJmYWNlX2JwcDsKIAltb2RlX2NtZC5waXRjaCA9IEFMSUdOKG1vZGVfY21kLndpZHRoICogKChtb2RlX2NtZC5icHAgKyAxKSAvIDgpLCA2NCk7Ci0JbW9kZV9jbWQuZGVwdGggPSAyNDsKKwltb2RlX2NtZC5kZXB0aCA9IHN1cmZhY2VfZGVwdGg7CiAKIAlzaXplID0gbW9kZV9jbWQucGl0Y2ggKiBtb2RlX2NtZC5oZWlnaHQ7CiAJc2l6ZSA9IEFMSUdOKHNpemUsIFBBR0VfU0laRSk7CkBAIC0yMDUsNyArMjEyLDcgQEAKIAogLy8JbWVtc2V0KGluZm8tPnNjcmVlbl9iYXNlLCAwLCBzaXplKTsKIAotCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmItPnBpdGNoKTsKKwlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGluZm8sIGZiLT5waXRjaCwgZmItPmRlcHRoKTsKIAlkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKGluZm8sIGZiLCBmYl93aWR0aCwgZmJfaGVpZ2h0KTsKIAogCS8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkbid0IGV4cG9zZSBtbWlvIHNwYWNlIGF0IGFsbCAqLwpAQCAtMjQzLDcgKzI1MCw3IEBACiAJaW50IHJldDsKIAogCURSTV9ERUJVRygiXG4iKTsKLQlyZXQgPSBkcm1fZmJfaGVscGVyX3NpbmdsZV9mYl9wcm9iZShkZXYsIGludGVsZmJfY3JlYXRlKTsKKwlyZXQgPSBkcm1fZmJfaGVscGVyX3NpbmdsZV9mYl9wcm9iZShkZXYsIDMyLCBpbnRlbGZiX2NyZWF0ZSk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaW50ZWxmYl9wcm9iZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKaW5kZXggZmEzMDRlMS4uNjYzYWI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAKIAljb25uZWN0b3IgPSAmaW50ZWxfb3V0cHV0LT5iYXNlOwogCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwgJmludGVsX2hkbWlfY29ubmVjdG9yX2Z1bmNzLAotCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQpOworCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBKTsKIAlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubmVjdG9yLCAmaW50ZWxfaGRtaV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKIAogCWludGVsX291dHB1dC0+dHlwZSA9IElOVEVMX09VVFBVVF9IRE1JOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCmluZGV4IGRhZmMwZGEuLjA1NTk4YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICAqICAgICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgogICovCiAKKyNpbmNsdWRlIDxhY3BpL2J1dHRvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgImRybVAuaCIKQEAgLTI5NSw2ICsyOTYsMTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyogZnVsbCBzY3JlZW4gc2NhbGUgZm9yIG5vdyAqLworCWlmIChJU19JR0RORyhkZXYpKQorCQlnb3RvIG91dDsKKwogCS8qIDk2NSsgd2FudHMgZnV6enkgZml0dGluZyAqLwogCWlmIChJU19JOTY1RyhkZXYpKQogCQlwZml0X2NvbnRyb2wgfD0gKGludGVsX2NydGMtPnBpcGUgPDwgUEZJVF9QSVBFX1NISUZUKSB8CkBAIC0zMjIsOCArMzI3LDEwIEBACiAJICogdG8gcmVnaXN0ZXIgZGVzY3JpcHRpb24gYW5kIFBSTS4KIAkgKiBDaGFuZ2UgdGhlIHZhbHVlIGhlcmUgdG8gc2VlIHRoZSBib3JkZXJzIGZvciBkZWJ1Z2dpbmcKIAkgKi8KLQlJOTE1X1dSSVRFKEJDTFJQQVRfQSwgMCk7Ci0JSTkxNV9XUklURShCQ0xSUEFUX0IsIDApOworCWlmICghSVNfSUdETkcoZGV2KSkgeworCQlJOTE1X1dSSVRFKEJDTFJQQVRfQSwgMCk7CisJCUk5MTVfV1JJVEUoQkNMUlBBVF9CLCAwKTsKKwl9CiAKIAlzd2l0Y2ggKGx2ZHNfcHJpdi0+Zml0dGluZ19tb2RlKSB7CiAJY2FzZSBEUk1fTU9ERV9TQ0FMRV9DRU5URVI6CkBAIC0zNzMsNyArMzgwLDcgQEAKIAkJCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZibGFua19zdGFydCArIHZzeW5jX3BvczsKIAkJLyoga2VlcCB0aGUgdnN5bmMgd2lkdGggY29uc3RhbnQgKi8KIAkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192c3luY19lbmQgPQotCQkJCWFkanVzdGVkX21vZGUtPmNydGNfdmJsYW5rX3N0YXJ0ICsgdnN5bmNfd2lkdGg7CisJCQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192c3luY19zdGFydCArIHZzeW5jX3dpZHRoOwogCQlib3JkZXIgPSAxOwogCQlicmVhazsKIAljYXNlIERSTV9NT0RFX1NDQUxFX0FTUEVDVDoKQEAgLTUxOSw2ICs1MjYsMTQgQEAKIAlsdmRzX3ByaXYtPnBmaXRfY29udHJvbCA9IHBmaXRfY29udHJvbDsKIAlsdmRzX3ByaXYtPnBmaXRfcGdtX3JhdGlvcyA9IHBmaXRfcGdtX3JhdGlvczsKIAkvKgorCSAqIFdoZW4gdGhlcmUgZXhpc3RzIHRoZSBib3JkZXIsIGl0IG1lYW5zIHRoYXQgdGhlIExWRFNfQk9SRFIKKwkgKiBzaG91bGQgYmUgZW5hYmxlZC4KKwkgKi8KKwlpZiAoYm9yZGVyKQorCQlkZXZfcHJpdi0+bHZkc19ib3JkZXJfYml0cyB8PSBMVkRTX0JPUkRFUl9FTkFCTEU7CisJZWxzZQorCQlkZXZfcHJpdi0+bHZkc19ib3JkZXJfYml0cyAmPSB+KExWRFNfQk9SREVSX0VOQUJMRSk7CisJLyoKIAkgKiBYWFg6IEl0IHdvdWxkIGJlIG5pY2UgdG8gc3VwcG9ydCBsb3dlciByZWZyZXNoIHJhdGVzIG9uIHRoZQogCSAqIHBhbmVscyB0byByZWR1Y2UgcG93ZXIgY29uc3VtcHRpb24sIGFuZCBwZXJoYXBzIG1hdGNoIHRoZQogCSAqIHVzZXIncyByZXF1ZXN0ZWQgcmVmcmVzaCByYXRlLgpAQCAtNTcyLDcgKzU4Nyw2IEBACiAJICogc2V0dGluZ3MuCiAJICovCiAKLQkvKiBObyBwYW5lbCBmaXR0aW5nIHlldCwgZml4bWUgKi8KIAlpZiAoSVNfSUdETkcoZGV2KSkKIAkJcmV0dXJuOwogCkBAIC01ODUsMTUgKzU5OSwzMyBAQAogCUk5MTVfV1JJVEUoUEZJVF9DT05UUk9MLCBsdmRzX3ByaXYtPnBmaXRfY29udHJvbCk7CiB9CiAKKy8qIFNvbWUgbGlkIGRldmljZXMgcmVwb3J0IGluY29ycmVjdCBsaWQgc3RhdHVzLCBhc3N1bWUgdGhleSdyZSBjb25uZWN0ZWQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBiYWRfbGlkX3N0YXR1c1tdID0geworCXsKKwkJLmlkZW50ID0gIkFzcGlyZSBPbmUiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIG9uZSIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCiAvKioKICAqIERldGVjdCB0aGUgTFZEUyBjb25uZWN0aW9uLgogICoKLSAqIFRoaXMgYWx3YXlzIHJldHVybnMgQ09OTkVDVE9SX1NUQVRVU19DT05ORUNURUQuICBUaGlzIGNvbm5lY3RvciBzaG91bGQgb25seSBoYXZlCi0gKiBiZWVuIHNldCB1cCBpZiB0aGUgTFZEUyB3YXMgYWN0dWFsbHkgY29ubmVjdGVkIGFueXdheS4KKyAqIFNpbmNlIExWRFMgZG9lc24ndCBoYXZlIGhvdGx1Zywgd2UgdXNlIHRoZSBsaWQgYXMgYSBwcm94eS4gIE9wZW4gbWVhbnMKKyAqIGNvbm5lY3RlZCBhbmQgY2xvc2VkIG1lYW5zIGRpc2Nvbm5lY3RlZC4gIFdlIGFsc28gc2VuZCBob3RwbHVnIGV2ZW50cyBhcworICogbmVlZGVkLCB1c2luZyBsaWQgc3RhdHVzIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBpbnB1dCBsYXllci4KICAqLwogc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgaW50ZWxfbHZkc19kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKLQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKworCWlmICghYWNwaV9saWRfb3BlbigpICYmICFkbWlfY2hlY2tfc3lzdGVtKGJhZF9saWRfc3RhdHVzKSkKKwkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisKKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioKQEAgLTYzMiw2ICs2NjQsMzkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIExpZCBldmVudHMuIE5vdGUgdGhlIHVzZSBvZiAnbW9kZXNldF9vbl9saWQnOgorICogIC0gd2Ugc2V0IGl0IG9uIGxpZCBjbG9zZSwgYW5kIHJlc2V0IGl0IG9uIG9wZW4KKyAqICAtIHdlIHVzZSBpdCBhcyBhICJvbmx5IG9uY2UiIGJpdCAoaWUgd2UgaWdub3JlCisgKiAgICBkdXBsaWNhdGUgZXZlbnRzIHdoZXJlIGl0IHdhcyBhbHJlYWR5IHByb3Blcmx5CisgKiAgICBzZXQvcmVzZXQpCisgKiAgLSB0aGUgc3VzcGVuZC9yZXN1bWUgcGF0aHMgd2lsbCBhbHNvIHNldCBpdCB0bworICogICAgemVybywgc2luY2UgdGhleSByZXN0b3JlIHRoZSBtb2RlICgibGlkIG9wZW4iKS4KKyAqLworc3RhdGljIGludCBpbnRlbF9saWRfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJICAgIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlLCBsaWRfbm90aWZpZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCisJaWYgKCFhY3BpX2xpZF9vcGVuKCkpIHsKKwkJZGV2X3ByaXYtPm1vZGVzZXRfb25fbGlkID0gMTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwl9CisKKwlpZiAoIWRldl9wcml2LT5tb2Rlc2V0X29uX2xpZCkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCWRldl9wcml2LT5tb2Rlc2V0X29uX2xpZCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1faGVscGVyX3Jlc3VtZV9mb3JjZV9tb2RlKGRldik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKIC8qKgogICogaW50ZWxfbHZkc19kZXN0cm95IC0gdW5yZWdpc3RlciBhbmQgZnJlZSBMVkRTIHN0cnVjdHVyZXMKICAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB0byBmcmVlCkBAIC02NDEsMTAgKzcwNiwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBpbnRlbF9sdmRzX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCWlmIChpbnRlbF9vdXRwdXQtPmRkY19idXMpCiAJCWludGVsX2kyY19kZXN0cm95KGludGVsX291dHB1dC0+ZGRjX2J1cyk7CisJaWYgKGRldl9wcml2LT5saWRfbm90aWZpZXIubm90aWZpZXJfY2FsbCkKKwkJYWNwaV9saWRfbm90aWZpZXJfdW5yZWdpc3RlcigmZGV2X3ByaXYtPmxpZF9ub3RpZmllcik7CiAJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoY29ubmVjdG9yKTsKIAlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKIAlrZnJlZShjb25uZWN0b3IpOwpAQCAtMTAxMSw2ICsxMDgwLDExIEBACiAJCXB3bSB8PSBQV01fUENIX0VOQUJMRTsKIAkJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwxLCBwd20pOwogCX0KKwlkZXZfcHJpdi0+bGlkX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBpbnRlbF9saWRfbm90aWZ5OworCWlmIChhY3BpX2xpZF9ub3RpZmllcl9yZWdpc3RlcigmZGV2X3ByaXYtPmxpZF9ub3RpZmllcikpIHsKKwkJRFJNX0RFQlVHKCJsaWQgbm90aWZpZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCWRldl9wcml2LT5saWRfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IE5VTEw7CisJfQogCWRybV9zeXNmc19jb25uZWN0b3JfYWRkKGNvbm5lY3Rvcik7CiAJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKaW5kZXggMGJmMjhlZi4uMDgzYmVjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwpAQCAtMTM1LDYgKzEzNSwzMCBAQAogCXN0cnVjdCBpbnRlbF9zZHZvX2R0ZCBzYXZlX2lucHV0X2R0ZF8xLCBzYXZlX2lucHV0X2R0ZF8yOwogCXN0cnVjdCBpbnRlbF9zZHZvX2R0ZCBzYXZlX291dHB1dF9kdGRbMTZdOwogCXUzMiBzYXZlX1NEVk9YOworCS8qIGFkZCB0aGUgcHJvcGVydHkgZm9yIHRoZSBTRFZPLVRWICovCisJc3RydWN0IGRybV9wcm9wZXJ0eSAqbGVmdF9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpyaWdodF9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICp0b3BfcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqYm90dG9tX3Byb3BlcnR5OworCXN0cnVjdCBkcm1fcHJvcGVydHkgKmhwb3NfcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqdnBvc19wcm9wZXJ0eTsKKworCS8qIGFkZCB0aGUgcHJvcGVydHkgZm9yIHRoZSBTRFZPLVRWL0xWRFMgKi8KKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpicmlnaHRuZXNzX3Byb3BlcnR5OworCXN0cnVjdCBkcm1fcHJvcGVydHkgKmNvbnRyYXN0X3Byb3BlcnR5OworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnNhdHVyYXRpb25fcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqaHVlX3Byb3BlcnR5OworCisJLyogQWRkIHZhcmlhYmxlIHRvIHJlY29yZCBjdXJyZW50IHNldHRpbmcgZm9yIHRoZSBhYm92ZSBwcm9wZXJ0eSAqLworCXUzMglsZWZ0X21hcmdpbiwgcmlnaHRfbWFyZ2luLCB0b3BfbWFyZ2luLCBib3R0b21fbWFyZ2luOworCS8qIHRoaXMgaXMgdG8gZ2V0IHRoZSByYW5nZSBvZiBtYXJnaW4uKi8KKwl1MzIJbWF4X2hzY2FuLCAgbWF4X3ZzY2FuOworCXUzMgltYXhfaHBvcywgY3VyX2hwb3M7CisJdTMyCW1heF92cG9zLCBjdXJfdnBvczsKKwl1MzIJY3VyX2JyaWdodG5lc3MsIG1heF9icmlnaHRuZXNzOworCXUzMgljdXJfY29udHJhc3QsCW1heF9jb250cmFzdDsKKwl1MzIJY3VyX3NhdHVyYXRpb24sIG1heF9zYXR1cmF0aW9uOworCXUzMgljdXJfaHVlLAltYXhfaHVlOwogfTsKIAogc3RhdGljIGJvb2wKQEAgLTI4MSw2ICszMDUsMzEgQEAKICAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TRFRWX1JFU09MVVRJT05fU1VQUE9SVCksCiAgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU0NBTEVEX0hEVFZfUkVTT0xVVElPTl9TVVBQT1JUKSwKICAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TVVBQT1JURURfRU5IQU5DRU1FTlRTKSwKKyAgICAvKiBBZGQgdGhlIG9wIGNvZGUgZm9yIFNEVk8gZW5oYW5jZW1lbnRzICovCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1BPU0lUSU9OX0gpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1BPU0lUSU9OX0gpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1BPU0lUSU9OX0gpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9QT1NJVElPTl9WKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9QT1NJVElPTl9WKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9QT1NJVElPTl9WKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfU0FUVVJBVElPTiksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU0FUVVJBVElPTiksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfU0FUVVJBVElPTiksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0hVRSksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSFVFKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IVUUpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9DT05UUkFTVCksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQ09OVFJBU1QpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0NPTlRSQVNUKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfQlJJR0hUTkVTUyksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQlJJR0hUTkVTUyksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQlJJR0hUTkVTUyksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX09WRVJTQ0FOX0gpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09WRVJTQ0FOX0gpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX09WRVJTQ0FOX0gpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9PVkVSU0NBTl9WKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9PVkVSU0NBTl9WKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVkVSU0NBTl9WKSwKICAgICAvKiBIRE1JIG9wIGNvZGUgKi8KICAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TVVBQX0VOQ09ERSksCiAgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfRU5DT0RFKSwKQEAgLTk4MSw3ICsxMDMwLDcgQEAKIAogCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShvdXRwdXQsIE5VTEwsIDApOwogCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpCi0JCURSTV9ERUJVRygiJXM6IEZhaWxlZCB0byBzZXQgVFYgZm9ybWF0XG4iLAorCQlEUk1fREVCVUdfS01TKCIlczogRmFpbGVkIHRvIHNldCBUViBmb3JtYXRcbiIsCiAJCQkgIFNEVk9fTkFNRShzZHZvX3ByaXYpKTsKIH0KIApAQCAtMTc5Miw2ICsxODQxLDQ1IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYwordm9pZCBpbnRlbF9zZHZvX2Rlc3Ryb3lfZW5oYW5jZV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKnNkdm9fcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCisJaWYgKHNkdm9fcHJpdi0+aXNfdHYpIHsKKwkJaWYgKHNkdm9fcHJpdi0+bGVmdF9wcm9wZXJ0eSkKKwkJCWRybV9wcm9wZXJ0eV9kZXN0cm95KGRldiwgc2R2b19wcml2LT5sZWZ0X3Byb3BlcnR5KTsKKwkJaWYgKHNkdm9fcHJpdi0+cmlnaHRfcHJvcGVydHkpCisJCQlkcm1fcHJvcGVydHlfZGVzdHJveShkZXYsIHNkdm9fcHJpdi0+cmlnaHRfcHJvcGVydHkpOworCQlpZiAoc2R2b19wcml2LT50b3BfcHJvcGVydHkpCisJCQlkcm1fcHJvcGVydHlfZGVzdHJveShkZXYsIHNkdm9fcHJpdi0+dG9wX3Byb3BlcnR5KTsKKwkJaWYgKHNkdm9fcHJpdi0+Ym90dG9tX3Byb3BlcnR5KQorCQkJZHJtX3Byb3BlcnR5X2Rlc3Ryb3koZGV2LCBzZHZvX3ByaXYtPmJvdHRvbV9wcm9wZXJ0eSk7CisJCWlmIChzZHZvX3ByaXYtPmhwb3NfcHJvcGVydHkpCisJCQlkcm1fcHJvcGVydHlfZGVzdHJveShkZXYsIHNkdm9fcHJpdi0+aHBvc19wcm9wZXJ0eSk7CisJCWlmIChzZHZvX3ByaXYtPnZwb3NfcHJvcGVydHkpCisJCQlkcm1fcHJvcGVydHlfZGVzdHJveShkZXYsIHNkdm9fcHJpdi0+dnBvc19wcm9wZXJ0eSk7CisJfQorCWlmIChzZHZvX3ByaXYtPmlzX3R2KSB7CisJCWlmIChzZHZvX3ByaXYtPnNhdHVyYXRpb25fcHJvcGVydHkpCisJCQlkcm1fcHJvcGVydHlfZGVzdHJveShkZXYsCisJCQkJCXNkdm9fcHJpdi0+c2F0dXJhdGlvbl9wcm9wZXJ0eSk7CisJCWlmIChzZHZvX3ByaXYtPmNvbnRyYXN0X3Byb3BlcnR5KQorCQkJZHJtX3Byb3BlcnR5X2Rlc3Ryb3koZGV2LAorCQkJCQlzZHZvX3ByaXYtPmNvbnRyYXN0X3Byb3BlcnR5KTsKKwkJaWYgKHNkdm9fcHJpdi0+aHVlX3Byb3BlcnR5KQorCQkJZHJtX3Byb3BlcnR5X2Rlc3Ryb3koZGV2LCBzZHZvX3ByaXYtPmh1ZV9wcm9wZXJ0eSk7CisJfQorCWlmIChzZHZvX3ByaXYtPmlzX3R2IHx8IHNkdm9fcHJpdi0+aXNfbHZkcykgeworCQlpZiAoc2R2b19wcml2LT5icmlnaHRuZXNzX3Byb3BlcnR5KQorCQkJZHJtX3Byb3BlcnR5X2Rlc3Ryb3koZGV2LAorCQkJCQlzZHZvX3ByaXYtPmJyaWdodG5lc3NfcHJvcGVydHkpOworCX0KKwlyZXR1cm47Cit9CisKIHN0YXRpYyB2b2lkIGludGVsX3Nkdm9fZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOwpAQCAtMTgxMiw2ICsxOTAwLDkgQEAKIAkJZHJtX3Byb3BlcnR5X2Rlc3Ryb3koY29ubmVjdG9yLT5kZXYsCiAJCQkJICAgICBzZHZvX3ByaXYtPnR2X2Zvcm1hdF9wcm9wZXJ0eSk7CiAKKwlpZiAoc2R2b19wcml2LT5pc190diB8fCBzZHZvX3ByaXYtPmlzX2x2ZHMpCisJCWludGVsX3Nkdm9fZGVzdHJveV9lbmhhbmNlX3Byb3BlcnR5KGNvbm5lY3Rvcik7CisKIAlkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShjb25uZWN0b3IpOwogCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOwogCkBAIC0xODI5LDYgKzE5MjAsOCBAQAogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CiAJaW50IHJldCA9IDA7CiAJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisJdWludDhfdCBjbWQsIHN0YXR1czsKKwl1aW50MTZfdCB0ZW1wX3ZhbHVlOwogCiAJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfdmFsdWUoY29ubmVjdG9yLCBwcm9wZXJ0eSwgdmFsKTsKIAlpZiAocmV0IDwgMCkKQEAgLTE4NDUsMTEgKzE5MzgsMTAyIEBACiAKIAkJc2R2b19wcml2LT50dl9mb3JtYXRfbmFtZSA9IHNkdm9fcHJpdi0+dHZfZm9ybWF0X3N1cHBvcnRlZFt2YWxdOwogCQljaGFuZ2VkID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAoc2R2b19wcml2LT5pc190diB8fCBzZHZvX3ByaXYtPmlzX2x2ZHMpIHsKKwkJY21kID0gMDsKKwkJdGVtcF92YWx1ZSA9IHZhbDsKKwkJaWYgKHNkdm9fcHJpdi0+bGVmdF9wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworCQkJZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfdmFsdWUoY29ubmVjdG9yLAorCQkJCXNkdm9fcHJpdi0+cmlnaHRfcHJvcGVydHksIHZhbCk7CisJCQlpZiAoc2R2b19wcml2LT5sZWZ0X21hcmdpbiA9PSB0ZW1wX3ZhbHVlKQorCQkJCWdvdG8gb3V0OworCisJCQlzZHZvX3ByaXYtPmxlZnRfbWFyZ2luID0gdGVtcF92YWx1ZTsKKwkJCXNkdm9fcHJpdi0+cmlnaHRfbWFyZ2luID0gdGVtcF92YWx1ZTsKKwkJCXRlbXBfdmFsdWUgPSBzZHZvX3ByaXYtPm1heF9oc2NhbiAtCisJCQkJCXNkdm9fcHJpdi0+bGVmdF9tYXJnaW47CisJCQljbWQgPSBTRFZPX0NNRF9TRVRfT1ZFUlNDQU5fSDsKKwkJfSBlbHNlIGlmIChzZHZvX3ByaXYtPnJpZ2h0X3Byb3BlcnR5ID09IHByb3BlcnR5KSB7CisJCQlkcm1fY29ubmVjdG9yX3Byb3BlcnR5X3NldF92YWx1ZShjb25uZWN0b3IsCisJCQkJc2R2b19wcml2LT5sZWZ0X3Byb3BlcnR5LCB2YWwpOworCQkJaWYgKHNkdm9fcHJpdi0+cmlnaHRfbWFyZ2luID09IHRlbXBfdmFsdWUpCisJCQkJZ290byBvdXQ7CisKKwkJCXNkdm9fcHJpdi0+bGVmdF9tYXJnaW4gPSB0ZW1wX3ZhbHVlOworCQkJc2R2b19wcml2LT5yaWdodF9tYXJnaW4gPSB0ZW1wX3ZhbHVlOworCQkJdGVtcF92YWx1ZSA9IHNkdm9fcHJpdi0+bWF4X2hzY2FuIC0KKwkJCQlzZHZvX3ByaXYtPmxlZnRfbWFyZ2luOworCQkJY21kID0gU0RWT19DTURfU0VUX09WRVJTQ0FOX0g7CisJCX0gZWxzZSBpZiAoc2R2b19wcml2LT50b3BfcHJvcGVydHkgPT0gcHJvcGVydHkpIHsKKwkJCWRybV9jb25uZWN0b3JfcHJvcGVydHlfc2V0X3ZhbHVlKGNvbm5lY3RvciwKKwkJCQlzZHZvX3ByaXYtPmJvdHRvbV9wcm9wZXJ0eSwgdmFsKTsKKwkJCWlmIChzZHZvX3ByaXYtPnRvcF9tYXJnaW4gPT0gdGVtcF92YWx1ZSkKKwkJCQlnb3RvIG91dDsKKworCQkJc2R2b19wcml2LT50b3BfbWFyZ2luID0gdGVtcF92YWx1ZTsKKwkJCXNkdm9fcHJpdi0+Ym90dG9tX21hcmdpbiA9IHRlbXBfdmFsdWU7CisJCQl0ZW1wX3ZhbHVlID0gc2R2b19wcml2LT5tYXhfdnNjYW4gLQorCQkJCQlzZHZvX3ByaXYtPnRvcF9tYXJnaW47CisJCQljbWQgPSBTRFZPX0NNRF9TRVRfT1ZFUlNDQU5fVjsKKwkJfSBlbHNlIGlmIChzZHZvX3ByaXYtPmJvdHRvbV9wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworCQkJZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfdmFsdWUoY29ubmVjdG9yLAorCQkJCXNkdm9fcHJpdi0+dG9wX3Byb3BlcnR5LCB2YWwpOworCQkJaWYgKHNkdm9fcHJpdi0+Ym90dG9tX21hcmdpbiA9PSB0ZW1wX3ZhbHVlKQorCQkJCWdvdG8gb3V0OworCQkJc2R2b19wcml2LT50b3BfbWFyZ2luID0gdGVtcF92YWx1ZTsKKwkJCXNkdm9fcHJpdi0+Ym90dG9tX21hcmdpbiA9IHRlbXBfdmFsdWU7CisJCQl0ZW1wX3ZhbHVlID0gc2R2b19wcml2LT5tYXhfdnNjYW4gLQorCQkJCQlzZHZvX3ByaXYtPnRvcF9tYXJnaW47CisJCQljbWQgPSBTRFZPX0NNRF9TRVRfT1ZFUlNDQU5fVjsKKwkJfSBlbHNlIGlmIChzZHZvX3ByaXYtPmhwb3NfcHJvcGVydHkgPT0gcHJvcGVydHkpIHsKKwkJCWlmIChzZHZvX3ByaXYtPmN1cl9ocG9zID09IHRlbXBfdmFsdWUpCisJCQkJZ290byBvdXQ7CisKKwkJCWNtZCA9IFNEVk9fQ01EX1NFVF9QT1NJVElPTl9IOworCQkJc2R2b19wcml2LT5jdXJfaHBvcyA9IHRlbXBfdmFsdWU7CisJCX0gZWxzZSBpZiAoc2R2b19wcml2LT52cG9zX3Byb3BlcnR5ID09IHByb3BlcnR5KSB7CisJCQlpZiAoc2R2b19wcml2LT5jdXJfdnBvcyA9PSB0ZW1wX3ZhbHVlKQorCQkJCWdvdG8gb3V0OworCisJCQljbWQgPSBTRFZPX0NNRF9TRVRfUE9TSVRJT05fVjsKKwkJCXNkdm9fcHJpdi0+Y3VyX3Zwb3MgPSB0ZW1wX3ZhbHVlOworCQl9IGVsc2UgaWYgKHNkdm9fcHJpdi0+c2F0dXJhdGlvbl9wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworCQkJaWYgKHNkdm9fcHJpdi0+Y3VyX3NhdHVyYXRpb24gPT0gdGVtcF92YWx1ZSkKKwkJCQlnb3RvIG91dDsKKworCQkJY21kID0gU0RWT19DTURfU0VUX1NBVFVSQVRJT047CisJCQlzZHZvX3ByaXYtPmN1cl9zYXR1cmF0aW9uID0gdGVtcF92YWx1ZTsKKwkJfSBlbHNlIGlmIChzZHZvX3ByaXYtPmNvbnRyYXN0X3Byb3BlcnR5ID09IHByb3BlcnR5KSB7CisJCQlpZiAoc2R2b19wcml2LT5jdXJfY29udHJhc3QgPT0gdGVtcF92YWx1ZSkKKwkJCQlnb3RvIG91dDsKKworCQkJY21kID0gU0RWT19DTURfU0VUX0NPTlRSQVNUOworCQkJc2R2b19wcml2LT5jdXJfY29udHJhc3QgPSB0ZW1wX3ZhbHVlOworCQl9IGVsc2UgaWYgKHNkdm9fcHJpdi0+aHVlX3Byb3BlcnR5ID09IHByb3BlcnR5KSB7CisJCQlpZiAoc2R2b19wcml2LT5jdXJfaHVlID09IHRlbXBfdmFsdWUpCisJCQkJZ290byBvdXQ7CisKKwkJCWNtZCA9IFNEVk9fQ01EX1NFVF9IVUU7CisJCQlzZHZvX3ByaXYtPmN1cl9odWUgPSB0ZW1wX3ZhbHVlOworCQl9IGVsc2UgaWYgKHNkdm9fcHJpdi0+YnJpZ2h0bmVzc19wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworCQkJaWYgKHNkdm9fcHJpdi0+Y3VyX2JyaWdodG5lc3MgPT0gdGVtcF92YWx1ZSkKKwkJCQlnb3RvIG91dDsKKworCQkJY21kID0gU0RWT19DTURfU0VUX0JSSUdIVE5FU1M7CisJCQlzZHZvX3ByaXYtPmN1cl9icmlnaHRuZXNzID0gdGVtcF92YWx1ZTsKKwkJfQorCQlpZiAoY21kKSB7CisJCQlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsIGNtZCwgJnRlbXBfdmFsdWUsIDIpOworCQkJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwKKwkJCQkJCQkJTlVMTCwgMCk7CisJCQlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gY29tbWFuZCBcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJY2hhbmdlZCA9IHRydWU7CisJCX0KKwl9CiAJaWYgKGNoYW5nZWQgJiYgY3J0YykKIAkJZHJtX2NydGNfaGVscGVyX3NldF9tb2RlKGNydGMsICZjcnRjLT5tb2RlLCBjcnRjLT54LAogCQkJCWNydGMtPnksIGNydGMtPmZiKTsKQEAgLTIwOTAsNiArMjI3NCw4IEBACiAJCXNkdm9fcHJpdi0+Y29udHJvbGxlZF9vdXRwdXQgPSBTRFZPX09VVFBVVF9SR0IxOwogCQllbmNvZGVyLT5lbmNvZGVyX3R5cGUgPSBEUk1fTU9ERV9FTkNPREVSX0RBQzsKIAkJY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E7CisJCWludGVsX291dHB1dC0+Y2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX1NEVk9fTk9OX1RWX0NMT05FX0JJVCkgfAorCQkJCQkoMSA8PCBJTlRFTF9BTkFMT0dfQ0xPTkVfQklUKTsKIAl9IGVsc2UgaWYgKGZsYWdzICYgU0RWT19PVVRQVVRfTFZEUzApIHsKIAogCQlzZHZvX3ByaXYtPmNvbnRyb2xsZWRfb3V0cHV0ID0gU0RWT19PVVRQVVRfTFZEUzA7CkBAIC0yMTc2LDYgKzIzNjIsMzEwIEBACiAKIH0KIAorc3RhdGljIHZvaWQgaW50ZWxfc2R2b19jcmVhdGVfZW5oYW5jZV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKnNkdm9fcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJc3RydWN0IGludGVsX3Nkdm9fZW5oYW5jZW1lbnRzX3JlcGx5IHNkdm9fZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJdWludDhfdCBzdGF0dXM7CisJdWludDE2X3QgcmVzcG9uc2UsIGRhdGFfdmFsdWVbMl07CisKKwlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsIFNEVk9fQ01EX0dFVF9TVVBQT1JURURfRU5IQU5DRU1FTlRTLAorCQkJCQkJTlVMTCwgMCk7CisJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgJnNkdm9fZGF0YSwKKwkJCQkJc2l6ZW9mKHNkdm9fZGF0YSkpOworCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJRFJNX0RFQlVHX0tNUygiIGluY29ycmVjdCByZXNwb25zZSBpcyByZXR1cm5lZFxuIik7CisJCXJldHVybjsKKwl9CisJcmVzcG9uc2UgPSAqKCh1aW50MTZfdCAqKSZzZHZvX2RhdGEpOworCWlmICghcmVzcG9uc2UpIHsKKwkJRFJNX0RFQlVHX0tNUygiTm8gZW5oYW5jZW1lbnQgaXMgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc2R2b19wcml2LT5pc190dikgeworCQkvKiB3aGVuIGhvcml6b250YWwgb3ZlcnNjYW4gaXMgc3VwcG9ydGVkLCBBZGQgdGhlIGxlZnQvcmlnaHQKKwkJICogcHJvcGVydHkKKwkJICovCisJCWlmIChzZHZvX2RhdGEub3ZlcnNjYW5faCkgeworCQkJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LAorCQkJCVNEVk9fQ01EX0dFVF9NQVhfT1ZFUlNDQU5fSCwgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZkYXRhX3ZhbHVlLCA0KTsKKwkJCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgU0RWTyBtYXggIgorCQkJCQkJImhfb3ZlcnNjYW5cbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwKKwkJCQlTRFZPX0NNRF9HRVRfT1ZFUlNDQU5fSCwgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZyZXNwb25zZSwgMik7CisJCQlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gaF9vdmVyc2NhblxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJc2R2b19wcml2LT5tYXhfaHNjYW4gPSBkYXRhX3ZhbHVlWzBdOworCQkJc2R2b19wcml2LT5sZWZ0X21hcmdpbiA9IGRhdGFfdmFsdWVbMF0gLSByZXNwb25zZTsKKwkJCXNkdm9fcHJpdi0+cmlnaHRfbWFyZ2luID0gc2R2b19wcml2LT5sZWZ0X21hcmdpbjsKKwkJCXNkdm9fcHJpdi0+bGVmdF9wcm9wZXJ0eSA9CisJCQkJZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfUkFOR0UsCisJCQkJCQkibGVmdF9tYXJnaW4iLCAyKTsKKwkJCXNkdm9fcHJpdi0+bGVmdF9wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwkJCXNkdm9fcHJpdi0+bGVmdF9wcm9wZXJ0eS0+dmFsdWVzWzFdID0gZGF0YV92YWx1ZVswXTsKKwkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJCXNkdm9fcHJpdi0+bGVmdF9wcm9wZXJ0eSwKKwkJCQkJCXNkdm9fcHJpdi0+bGVmdF9tYXJnaW4pOworCQkJc2R2b19wcml2LT5yaWdodF9wcm9wZXJ0eSA9CisJCQkJZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfUkFOR0UsCisJCQkJCQkicmlnaHRfbWFyZ2luIiwgMik7CisJCQlzZHZvX3ByaXYtPnJpZ2h0X3Byb3BlcnR5LT52YWx1ZXNbMF0gPSAwOworCQkJc2R2b19wcml2LT5yaWdodF9wcm9wZXJ0eS0+dmFsdWVzWzFdID0gZGF0YV92YWx1ZVswXTsKKwkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJCXNkdm9fcHJpdi0+cmlnaHRfcHJvcGVydHksCisJCQkJCQlzZHZvX3ByaXYtPnJpZ2h0X21hcmdpbik7CisJCQlEUk1fREVCVUdfS01TKCJoX292ZXJzY2FuOiBtYXggJWQsICIKKwkJCQkJImRlZmF1bHQgJWQsIGN1cnJlbnQgJWRcbiIsCisJCQkJCWRhdGFfdmFsdWVbMF0sIGRhdGFfdmFsdWVbMV0sIHJlc3BvbnNlKTsKKwkJfQorCQlpZiAoc2R2b19kYXRhLm92ZXJzY2FuX3YpIHsKKwkJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwKKwkJCQlTRFZPX0NNRF9HRVRfTUFYX09WRVJTQ0FOX1YsIE5VTEwsIDApOworCQkJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwKKwkJCQkmZGF0YV92YWx1ZSwgNCk7CisJCQlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gbWF4ICIKKwkJCQkJCSJ2X292ZXJzY2FuXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsCisJCQkJU0RWT19DTURfR0VUX09WRVJTQ0FOX1YsIE5VTEwsIDApOworCQkJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwKKwkJCQkmcmVzcG9uc2UsIDIpOworCQkJaWYgKHN0YXR1cyAhPSBTRFZPX0NNRF9TVEFUVVNfU1VDQ0VTUykgeworCQkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIHZfb3ZlcnNjYW5cbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXNkdm9fcHJpdi0+bWF4X3ZzY2FuID0gZGF0YV92YWx1ZVswXTsKKwkJCXNkdm9fcHJpdi0+dG9wX21hcmdpbiA9IGRhdGFfdmFsdWVbMF0gLSByZXNwb25zZTsKKwkJCXNkdm9fcHJpdi0+Ym90dG9tX21hcmdpbiA9IHNkdm9fcHJpdi0+dG9wX21hcmdpbjsKKwkJCXNkdm9fcHJpdi0+dG9wX3Byb3BlcnR5ID0KKwkJCQlkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgRFJNX01PREVfUFJPUF9SQU5HRSwKKwkJCQkJCSJ0b3BfbWFyZ2luIiwgMik7CisJCQlzZHZvX3ByaXYtPnRvcF9wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwkJCXNkdm9fcHJpdi0+dG9wX3Byb3BlcnR5LT52YWx1ZXNbMV0gPSBkYXRhX3ZhbHVlWzBdOworCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQkJc2R2b19wcml2LT50b3BfcHJvcGVydHksCisJCQkJCQlzZHZvX3ByaXYtPnRvcF9tYXJnaW4pOworCQkJc2R2b19wcml2LT5ib3R0b21fcHJvcGVydHkgPQorCQkJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLAorCQkJCQkJImJvdHRvbV9tYXJnaW4iLCAyKTsKKwkJCXNkdm9fcHJpdi0+Ym90dG9tX3Byb3BlcnR5LT52YWx1ZXNbMF0gPSAwOworCQkJc2R2b19wcml2LT5ib3R0b21fcHJvcGVydHktPnZhbHVlc1sxXSA9IGRhdGFfdmFsdWVbMF07CisJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCQlzZHZvX3ByaXYtPmJvdHRvbV9wcm9wZXJ0eSwKKwkJCQkJCXNkdm9fcHJpdi0+Ym90dG9tX21hcmdpbik7CisJCQlEUk1fREVCVUdfS01TKCJ2X292ZXJzY2FuOiBtYXggJWQsICIKKwkJCQkJImRlZmF1bHQgJWQsIGN1cnJlbnQgJWRcbiIsCisJCQkJCWRhdGFfdmFsdWVbMF0sIGRhdGFfdmFsdWVbMV0sIHJlc3BvbnNlKTsKKwkJfQorCQlpZiAoc2R2b19kYXRhLnBvc2l0aW9uX2gpIHsKKwkJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwKKwkJCQlTRFZPX0NNRF9HRVRfTUFYX1BPU0lUSU9OX0gsIE5VTEwsIDApOworCQkJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwKKwkJCQkmZGF0YV92YWx1ZSwgNCk7CisJCQlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gTWF4IGhfcG9zXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsCisJCQkJU0RWT19DTURfR0VUX1BPU0lUSU9OX0gsIE5VTEwsIDApOworCQkJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwKKwkJCQkmcmVzcG9uc2UsIDIpOworCQkJaWYgKHN0YXR1cyAhPSBTRFZPX0NNRF9TVEFUVVNfU1VDQ0VTUykgeworCQkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIGdldCBoX3Bvc3Rpb25cbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXNkdm9fcHJpdi0+bWF4X2hwb3MgPSBkYXRhX3ZhbHVlWzBdOworCQkJc2R2b19wcml2LT5jdXJfaHBvcyA9IHJlc3BvbnNlOworCQkJc2R2b19wcml2LT5ocG9zX3Byb3BlcnR5ID0KKwkJCQlkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgRFJNX01PREVfUFJPUF9SQU5HRSwKKwkJCQkJCSJocG9zIiwgMik7CisJCQlzZHZvX3ByaXYtPmhwb3NfcHJvcGVydHktPnZhbHVlc1swXSA9IDA7CisJCQlzZHZvX3ByaXYtPmhwb3NfcHJvcGVydHktPnZhbHVlc1sxXSA9IGRhdGFfdmFsdWVbMF07CisJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCQlzZHZvX3ByaXYtPmhwb3NfcHJvcGVydHksCisJCQkJCQlzZHZvX3ByaXYtPmN1cl9ocG9zKTsKKwkJCURSTV9ERUJVR19LTVMoImhfcG9zaXRpb246IG1heCAlZCwgIgorCQkJCQkiZGVmYXVsdCAlZCwgY3VycmVudCAlZFxuIiwKKwkJCQkJZGF0YV92YWx1ZVswXSwgZGF0YV92YWx1ZVsxXSwgcmVzcG9uc2UpOworCQl9CisJCWlmIChzZHZvX2RhdGEucG9zaXRpb25fdikgeworCQkJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LAorCQkJCVNEVk9fQ01EX0dFVF9NQVhfUE9TSVRJT05fViwgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZkYXRhX3ZhbHVlLCA0KTsKKwkJCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgU0RWTyBNYXggdl9wb3NcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwKKwkJCQlTRFZPX0NNRF9HRVRfUE9TSVRJT05fViwgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZyZXNwb25zZSwgMik7CisJCQlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gZ2V0IHZfcG9zdGlvblxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJc2R2b19wcml2LT5tYXhfdnBvcyA9IGRhdGFfdmFsdWVbMF07CisJCQlzZHZvX3ByaXYtPmN1cl92cG9zID0gcmVzcG9uc2U7CisJCQlzZHZvX3ByaXYtPnZwb3NfcHJvcGVydHkgPQorCQkJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLAorCQkJCQkJInZwb3MiLCAyKTsKKwkJCXNkdm9fcHJpdi0+dnBvc19wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwkJCXNkdm9fcHJpdi0+dnBvc19wcm9wZXJ0eS0+dmFsdWVzWzFdID0gZGF0YV92YWx1ZVswXTsKKwkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJCXNkdm9fcHJpdi0+dnBvc19wcm9wZXJ0eSwKKwkJCQkJCXNkdm9fcHJpdi0+Y3VyX3Zwb3MpOworCQkJRFJNX0RFQlVHX0tNUygidl9wb3NpdGlvbjogbWF4ICVkLCAiCisJCQkJCSJkZWZhdWx0ICVkLCBjdXJyZW50ICVkXG4iLAorCQkJCQlkYXRhX3ZhbHVlWzBdLCBkYXRhX3ZhbHVlWzFdLCByZXNwb25zZSk7CisJCX0KKwl9CisJaWYgKHNkdm9fcHJpdi0+aXNfdHYpIHsKKwkJaWYgKHNkdm9fZGF0YS5zYXR1cmF0aW9uKSB7CisJCQlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsCisJCQkJU0RWT19DTURfR0VUX01BWF9TQVRVUkFUSU9OLCBOVUxMLCAwKTsKKwkJCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsCisJCQkJJmRhdGFfdmFsdWUsIDQpOworCQkJaWYgKHN0YXR1cyAhPSBTRFZPX0NNRF9TVEFUVVNfU1VDQ0VTUykgeworCQkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIE1heCBzYXRcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwKKwkJCQlTRFZPX0NNRF9HRVRfU0FUVVJBVElPTiwgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZyZXNwb25zZSwgMik7CisJCQlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gZ2V0IHNhdFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJc2R2b19wcml2LT5tYXhfc2F0dXJhdGlvbiA9IGRhdGFfdmFsdWVbMF07CisJCQlzZHZvX3ByaXYtPmN1cl9zYXR1cmF0aW9uID0gcmVzcG9uc2U7CisJCQlzZHZvX3ByaXYtPnNhdHVyYXRpb25fcHJvcGVydHkgPQorCQkJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLAorCQkJCQkJInNhdHVyYXRpb24iLCAyKTsKKwkJCXNkdm9fcHJpdi0+c2F0dXJhdGlvbl9wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwkJCXNkdm9fcHJpdi0+c2F0dXJhdGlvbl9wcm9wZXJ0eS0+dmFsdWVzWzFdID0KKwkJCQkJCQlkYXRhX3ZhbHVlWzBdOworCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQkJc2R2b19wcml2LT5zYXR1cmF0aW9uX3Byb3BlcnR5LAorCQkJCQkJc2R2b19wcml2LT5jdXJfc2F0dXJhdGlvbik7CisJCQlEUk1fREVCVUdfS01TKCJzYXR1cmF0aW9uOiBtYXggJWQsICIKKwkJCQkJImRlZmF1bHQgJWQsIGN1cnJlbnQgJWRcbiIsCisJCQkJCWRhdGFfdmFsdWVbMF0sIGRhdGFfdmFsdWVbMV0sIHJlc3BvbnNlKTsKKwkJfQorCQlpZiAoc2R2b19kYXRhLmNvbnRyYXN0KSB7CisJCQlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsCisJCQkJU0RWT19DTURfR0VUX01BWF9DT05UUkFTVCwgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZkYXRhX3ZhbHVlLCA0KTsKKwkJCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgU0RWTyBNYXggY29udHJhc3RcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwKKwkJCQlTRFZPX0NNRF9HRVRfQ09OVFJBU1QsIE5VTEwsIDApOworCQkJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwKKwkJCQkmcmVzcG9uc2UsIDIpOworCQkJaWYgKHN0YXR1cyAhPSBTRFZPX0NNRF9TVEFUVVNfU1VDQ0VTUykgeworCQkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIGdldCBjb250cmFzdFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJc2R2b19wcml2LT5tYXhfY29udHJhc3QgPSBkYXRhX3ZhbHVlWzBdOworCQkJc2R2b19wcml2LT5jdXJfY29udHJhc3QgPSByZXNwb25zZTsKKwkJCXNkdm9fcHJpdi0+Y29udHJhc3RfcHJvcGVydHkgPQorCQkJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLAorCQkJCQkJImNvbnRyYXN0IiwgMik7CisJCQlzZHZvX3ByaXYtPmNvbnRyYXN0X3Byb3BlcnR5LT52YWx1ZXNbMF0gPSAwOworCQkJc2R2b19wcml2LT5jb250cmFzdF9wcm9wZXJ0eS0+dmFsdWVzWzFdID0gZGF0YV92YWx1ZVswXTsKKwkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJCXNkdm9fcHJpdi0+Y29udHJhc3RfcHJvcGVydHksCisJCQkJCQlzZHZvX3ByaXYtPmN1cl9jb250cmFzdCk7CisJCQlEUk1fREVCVUdfS01TKCJjb250cmFzdDogbWF4ICVkLCAiCisJCQkJCSJkZWZhdWx0ICVkLCBjdXJyZW50ICVkXG4iLAorCQkJCQlkYXRhX3ZhbHVlWzBdLCBkYXRhX3ZhbHVlWzFdLCByZXNwb25zZSk7CisJCX0KKwkJaWYgKHNkdm9fZGF0YS5odWUpIHsKKwkJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwKKwkJCQlTRFZPX0NNRF9HRVRfTUFYX0hVRSwgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZkYXRhX3ZhbHVlLCA0KTsKKwkJCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgU0RWTyBNYXggaHVlXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsCisJCQkJU0RWT19DTURfR0VUX0hVRSwgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZyZXNwb25zZSwgMik7CisJCQlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gZ2V0IGh1ZVxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJc2R2b19wcml2LT5tYXhfaHVlID0gZGF0YV92YWx1ZVswXTsKKwkJCXNkdm9fcHJpdi0+Y3VyX2h1ZSA9IHJlc3BvbnNlOworCQkJc2R2b19wcml2LT5odWVfcHJvcGVydHkgPQorCQkJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLAorCQkJCQkJImh1ZSIsIDIpOworCQkJc2R2b19wcml2LT5odWVfcHJvcGVydHktPnZhbHVlc1swXSA9IDA7CisJCQlzZHZvX3ByaXYtPmh1ZV9wcm9wZXJ0eS0+dmFsdWVzWzFdID0KKwkJCQkJCQlkYXRhX3ZhbHVlWzBdOworCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQkJc2R2b19wcml2LT5odWVfcHJvcGVydHksCisJCQkJCQlzZHZvX3ByaXYtPmN1cl9odWUpOworCQkJRFJNX0RFQlVHX0tNUygiaHVlOiBtYXggJWQsIGRlZmF1bHQgJWQsIGN1cnJlbnQgJWRcbiIsCisJCQkJCWRhdGFfdmFsdWVbMF0sIGRhdGFfdmFsdWVbMV0sIHJlc3BvbnNlKTsKKwkJfQorCX0KKwlpZiAoc2R2b19wcml2LT5pc190diB8fCBzZHZvX3ByaXYtPmlzX2x2ZHMpIHsKKwkJaWYgKHNkdm9fZGF0YS5icmlnaHRuZXNzKSB7CisJCQlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsCisJCQkJU0RWT19DTURfR0VUX01BWF9CUklHSFRORVNTLCBOVUxMLCAwKTsKKwkJCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsCisJCQkJJmRhdGFfdmFsdWUsIDQpOworCQkJaWYgKHN0YXR1cyAhPSBTRFZPX0NNRF9TVEFUVVNfU1VDQ0VTUykgeworCQkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIE1heCBicmlnaHRcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwKKwkJCQlTRFZPX0NNRF9HRVRfQlJJR0hUTkVTUywgTlVMTCwgMCk7CisJCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LAorCQkJCSZyZXNwb25zZSwgMik7CisJCQlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiSW5jb3JyZWN0IFNEVk8gZ2V0IGJyaWdoXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlzZHZvX3ByaXYtPm1heF9icmlnaHRuZXNzID0gZGF0YV92YWx1ZVswXTsKKwkJCXNkdm9fcHJpdi0+Y3VyX2JyaWdodG5lc3MgPSByZXNwb25zZTsKKwkJCXNkdm9fcHJpdi0+YnJpZ2h0bmVzc19wcm9wZXJ0eSA9CisJCQkJZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfUkFOR0UsCisJCQkJCQkiYnJpZ2h0bmVzcyIsIDIpOworCQkJc2R2b19wcml2LT5icmlnaHRuZXNzX3Byb3BlcnR5LT52YWx1ZXNbMF0gPSAwOworCQkJc2R2b19wcml2LT5icmlnaHRuZXNzX3Byb3BlcnR5LT52YWx1ZXNbMV0gPQorCQkJCQkJCWRhdGFfdmFsdWVbMF07CisJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCQlzZHZvX3ByaXYtPmJyaWdodG5lc3NfcHJvcGVydHksCisJCQkJCQlzZHZvX3ByaXYtPmN1cl9icmlnaHRuZXNzKTsKKwkJCURSTV9ERUJVR19LTVMoImJyaWdodG5lc3M6IG1heCAlZCwgIgorCQkJCQkiZGVmYXVsdCAlZCwgY3VycmVudCAlZFxuIiwKKwkJCQkJZGF0YV92YWx1ZVswXSwgZGF0YV92YWx1ZVsxXSwgcmVzcG9uc2UpOworCQl9CisJfQorCXJldHVybjsKK30KKwogYm9vbCBpbnRlbF9zZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG91dHB1dF9kZXZpY2UpCiB7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKQEAgLTIyNjQsNiArMjc1NCwxMCBAQAogCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmaW50ZWxfb3V0cHV0LT5iYXNlLCAmaW50ZWxfb3V0cHV0LT5lbmMpOwogCWlmIChzZHZvX3ByaXYtPmlzX3R2KQogCQlpbnRlbF9zZHZvX3R2X2NyZWF0ZV9wcm9wZXJ0eShjb25uZWN0b3IpOworCisJaWYgKHNkdm9fcHJpdi0+aXNfdHYgfHwgc2R2b19wcml2LT5pc19sdmRzKQorCQlpbnRlbF9zZHZvX2NyZWF0ZV9lbmhhbmNlX3Byb3BlcnR5KGNvbm5lY3Rvcik7CisKIAlkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOwogCiAJaW50ZWxfc2R2b19zZWxlY3RfZGRjX2J1cyhzZHZvX3ByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKaW5kZXggYzY0ZWFiNC4uOWNhOTE3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCkBAIC0xMDgyLDcgKzEwODIsOCBAQAogCWNvbnN0IHN0cnVjdCB0dl9tb2RlICp0dl9tb2RlID0gaW50ZWxfdHZfbW9kZV9maW5kKGludGVsX291dHB1dCk7CiAKIAkvKiBFbnN1cmUgVFYgcmVmcmVzaCBpcyBjbG9zZSB0byBkZXNpcmVkIHJlZnJlc2ggKi8KLQlpZiAodHZfbW9kZSAmJiBhYnModHZfbW9kZS0+cmVmcmVzaCAtIGRybV9tb2RlX3ZyZWZyZXNoKG1vZGUpKSA8IDEwKQorCWlmICh0dl9tb2RlICYmIGFicyh0dl9tb2RlLT5yZWZyZXNoIC0gZHJtX21vZGVfdnJlZnJlc2gobW9kZSkgKiAxMDAwKQorCQkJCTwgMTAwMCkKIAkJcmV0dXJuIE1PREVfT0s7CiAJcmV0dXJuIE1PREVfQ0xPQ0tfUkFOR0U7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uLy5naXRpZ25vcmUgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzZWIzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKK21rcmVndGFibGUKKypfcmVnX3NhZmUuaAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jCmluZGV4IDZhMDE1OTIuLjE0ZmE5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jCkBAIC03MzMsNiArNzMzLDcgQEAKIAkubW9kZV9zZXRfYmFzZSA9IGF0b21iaW9zX2NydGNfc2V0X2Jhc2UsCiAJLnByZXBhcmUgPSBhdG9tYmlvc19jcnRjX3ByZXBhcmUsCiAJLmNvbW1pdCA9IGF0b21iaW9zX2NydGNfY29tbWl0LAorCS5sb2FkX2x1dCA9IHJhZGVvbl9jcnRjX2xvYWRfbHV0LAogfTsKIAogdm9pZCByYWRlb25fYXRvbWJpb3NfaW5pdF9jcnRjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F2aXZvZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdml2b2QuaAppbmRleCBlMmI5MmM0Li5kNGU2ZTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F2aXZvZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXZpdm9kLmgKQEAgLTU3LDEzICs1Nyw0IEBACiAjZGVmaW5lCVZHQV9SRU5ERVJfQ09OVFJPTAkJCQkweDAzMDAKICNkZWZpbmUJCVZHQV9WU1RBVFVTX0NOVExfTUFTSwkJCQkweDAwMDMwMDAwCiAKLS8qIEFWSVZPIGRpc2FibGUgVkdBIHJlbmRlcmluZyAqLwotc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9hdml2b192Z2FfcmVuZGVyX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCi17Ci0JdTMyIHZnYV9yZW5kZXI7Ci0JdmdhX3JlbmRlciA9IFJSRUczMihWR0FfUkVOREVSX0NPTlRST0wpOwotCXZnYV9yZW5kZXIgJj0gflZHQV9WU1RBVFVTX0NOVExfTUFTSzsKLQlXUkVHMzIoVkdBX1JFTkRFUl9DT05UUk9MLCB2Z2FfcmVuZGVyKTsKLX0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCmluZGV4IGJlNTFjNWYuLjE2MTA5NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCkBAIC0zMiw2ICszMiw5IEBACiAjaW5jbHVkZSAicmFkZW9uX3JlZy5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgInIxMDBkLmgiCisjaW5jbHVkZSAicnMxMDBkLmgiCisjaW5jbHVkZSAicnYyMDBkLmgiCisjaW5jbHVkZSAicnYyNTBkLmgiCiAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtNjAsMTggKzYzLDcgQEAKIAogLyogVGhpcyBmaWxlcyBnYXRoZXIgZnVuY3Rpb25zIHNwZWNpZmljcyB0bzoKICAqIHIxMDAscnYxMDAscnMxMDAscnYyMDAscnMyMDAscjIwMCxydjI1MCxyczMwMCxydjI4MAotICoKLSAqIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IGJlIHVzZWQgYnkgbmV3ZXIgQVNJQ3MuCiAgKi8KLWludCByMjAwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByMTAwX2hkcF9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHIxMDBfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHIxMDBfZ3VpX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHIxMDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHIxMDBfZ3B1X3dhaXRfZm9yX3ZzeW5jKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjEwMF9ncHVfd2FpdF9mb3JfdnN5bmMyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMTAwX2RlYnVnZnNfbWNfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQogCiAvKgogICogUENJIEdBUlQKQEAgLTE1MiwxMzYgKzE0NCw2IEBACiAJcmFkZW9uX2dhcnRfZmluaShyZGV2KTsKIH0KIAotCi0vKgotICogTUMKLSAqLwotdm9pZCByMTAwX21jX2Rpc2FibGVfY2xpZW50cyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQl1aW50MzJfdCBvdjBfc2NhbGVfY250bCwgY3J0Y19leHRfY250bCwgY3J0Y19nZW5fY250bCwgY3J0YzJfZ2VuX2NudGw7Ci0KLQkvKiBGSVhNRTogaXMgdGhpcyBmdW5jdGlvbiBjb3JyZWN0IGZvciByczEwMCxyczIwMCxyczMwMCA/ICovCi0JaWYgKHIxMDBfZ3VpX3dhaXRfZm9yX2lkbGUocmRldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIHdhaXQgR1VJIGlkbGUgd2hpbGUgIgotCQkgICAgICAgInByb2dyYW1taW5nIHBpcGVzLiBCYWQgdGhpbmdzIG1pZ2h0IGhhcHBlbi5cbiIpOwotCX0KLQotCS8qIHN0b3AgZGlzcGxheSBhbmQgbWVtb3J5IGFjY2VzcyAqLwotCW92MF9zY2FsZV9jbnRsID0gUlJFRzMyKFJBREVPTl9PVjBfU0NBTEVfQ05UTCk7Ci0JV1JFRzMyKFJBREVPTl9PVjBfU0NBTEVfQ05UTCwgb3YwX3NjYWxlX2NudGwgJiB+UkFERU9OX1NDQUxFUl9FTkFCTEUpOwotCWNydGNfZXh0X2NudGwgPSBSUkVHMzIoUkFERU9OX0NSVENfRVhUX0NOVEwpOwotCVdSRUczMihSQURFT05fQ1JUQ19FWFRfQ05UTCwgY3J0Y19leHRfY250bCB8IFJBREVPTl9DUlRDX0RJU1BMQVlfRElTKTsKLQljcnRjX2dlbl9jbnRsID0gUlJFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMKTsKLQotCXIxMDBfZ3B1X3dhaXRfZm9yX3ZzeW5jKHJkZXYpOwotCi0JV1JFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMLAotCSAgICAgICAoY3J0Y19nZW5fY250bCAmIH4oUkFERU9OX0NSVENfQ1VSX0VOIHwgUkFERU9OX0NSVENfSUNPTl9FTikpIHwKLQkgICAgICAgUkFERU9OX0NSVENfRElTUF9SRVFfRU5fQiB8IFJBREVPTl9DUlRDX0VYVF9ESVNQX0VOKTsKLQotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX1NJTkdMRV9DUlRDKSkgewotCQljcnRjMl9nZW5fY250bCA9IFJSRUczMihSQURFT05fQ1JUQzJfR0VOX0NOVEwpOwotCi0JCXIxMDBfZ3B1X3dhaXRfZm9yX3ZzeW5jMihyZGV2KTsKLQkJV1JFRzMyKFJBREVPTl9DUlRDMl9HRU5fQ05UTCwKLQkJICAgICAgIChjcnRjMl9nZW5fY250bCAmCi0JCSAgICAgICAgfihSQURFT05fQ1JUQzJfQ1VSX0VOIHwgUkFERU9OX0NSVEMyX0lDT05fRU4pKSB8Ci0JCSAgICAgICBSQURFT05fQ1JUQzJfRElTUF9SRVFfRU5fQik7Ci0JfQotCi0JdWRlbGF5KDUwMCk7Ci19Ci0KLXZvaWQgcjEwMF9tY19zZXR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQl1aW50MzJfdCB0bXA7Ci0JaW50IHI7Ci0KLQlyID0gcjEwMF9kZWJ1Z2ZzX21jX2luZm9faW5pdChyZGV2KTsKLQlpZiAocikgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBkZWJ1Z2ZzIGZpbGUgZm9yIFIxMDAgTUMgIVxuIik7Ci0JfQotCS8qIFdyaXRlIFZSQU0gc2l6ZSBpbiBjYXNlIHdlIGFyZSBsaW1pdGluZyBpdCAqLwotCVdSRUczMihSQURFT05fQ09ORklHX01FTVNJWkUsIHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplKTsKLQkvKiBOb3ZlbGwgYnVnIDIwNDg4MiBmb3IgUk41MC9NNi9NNyB3aXRoIDgvMTYvMzJNQiBWUkFNLAotCSAqIGlmIHRoZSBhcGVydHVyZSBpcyA2NE1CIGJ1dCB3ZSBoYXZlIDMyTUIgVlJBTQotCSAqIHdlIHJlcG9ydCBvbmx5IDMyTUIgVlJBTSBidXQgd2UgaGF2ZSB0byBzZXQgTUNfRkJfTE9DQVRJT04KLQkgKiB0byA2NE1CLCBvdGhlcndpc2UgdGhlIGdwdSBhY2NpZGVudGlhbGx5IGRpZXMgKi8KLQl0bXAgPSByZGV2LT5tYy52cmFtX2xvY2F0aW9uICsgcmRldi0+bWMubWNfdnJhbV9zaXplIC0gMTsKLQl0bXAgPSBSRUdfU0VUKFJBREVPTl9NQ19GQl9UT1AsIHRtcCA+PiAxNik7Ci0JdG1wIHw9IFJFR19TRVQoUkFERU9OX01DX0ZCX1NUQVJULCByZGV2LT5tYy52cmFtX2xvY2F0aW9uID4+IDE2KTsKLQlXUkVHMzIoUkFERU9OX01DX0ZCX0xPQ0FUSU9OLCB0bXApOwotCi0JLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KLQl0bXAgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKSAmIH5SQURFT05fQlVTX01BU1RFUl9ESVM7Ci0JV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgdG1wKTsKLQotCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKLQkJdG1wID0gcmRldi0+bWMuZ3R0X2xvY2F0aW9uICsgcmRldi0+bWMuZ3R0X3NpemUgLSAxOwotCQl0bXAgPSBSRUdfU0VUKFJBREVPTl9NQ19BR1BfVE9QLCB0bXAgPj4gMTYpOwotCQl0bXAgfD0gUkVHX1NFVChSQURFT05fTUNfQUdQX1NUQVJULCByZGV2LT5tYy5ndHRfbG9jYXRpb24gPj4gMTYpOwotCQlXUkVHMzIoUkFERU9OX01DX0FHUF9MT0NBVElPTiwgdG1wKTsKLQkJV1JFRzMyKFJBREVPTl9BR1BfQkFTRSwgcmRldi0+bWMuYWdwX2Jhc2UpOwotCX0gZWxzZSB7Ci0JCVdSRUczMihSQURFT05fTUNfQUdQX0xPQ0FUSU9OLCAweDBGRkZGRkZGKTsKLQkJV1JFRzMyKFJBREVPTl9BR1BfQkFTRSwgMCk7Ci0JfQotCi0JdG1wID0gUlJFRzMyKFJBREVPTl9IT1NUX1BBVEhfQ05UTCkgJiBSQURFT05fSERQX0FQRVJfQ05UTDsKLQl0bXAgfD0gKDcgPDwgMjgpOwotCVdSRUczMihSQURFT05fSE9TVF9QQVRIX0NOVEwsIHRtcCB8IFJBREVPTl9IRFBfU09GVF9SRVNFVCB8IFJBREVPTl9IRFBfUkVBRF9CVUZGRVJfSU5WQUxJREFURSk7Ci0JKHZvaWQpUlJFRzMyKFJBREVPTl9IT1NUX1BBVEhfQ05UTCk7Ci0JV1JFRzMyKFJBREVPTl9IT1NUX1BBVEhfQ05UTCwgdG1wKTsKLQkodm9pZClSUkVHMzIoUkFERU9OX0hPU1RfUEFUSF9DTlRMKTsKLX0KLQotaW50IHIxMDBfbWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlpbnQgcjsKLQotCWlmIChyMTAwX2RlYnVnZnNfcmJibV9pbml0KHJkZXYpKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGRlYnVnZnMgZmlsZSBmb3IgUkJCTSAhXG4iKTsKLQl9Ci0KLQlyMTAwX2dwdV9pbml0KHJkZXYpOwotCS8qIERpc2FibGUgZ2FydCB3aGljaCBhbHNvIGRpc2FibGUgb3V0IG9mIGdhcnQgYWNjZXNzICovCi0JcjEwMF9wY2lfZ2FydF9kaXNhYmxlKHJkZXYpOwotCi0JLyogU2V0dXAgR1BVIG1lbW9yeSBzcGFjZSAqLwotCXJkZXYtPm1jLmd0dF9sb2NhdGlvbiA9IDB4RkZGRkZGRkZVTDsKLQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7Ci0JCXIgPSByYWRlb25fYWdwX2luaXQocmRldik7Ci0JCWlmIChyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJbZHJtXSBEaXNhYmxpbmcgQUdQXG4iKTsKLQkJCXJkZXYtPmZsYWdzICY9IH5SQURFT05fSVNfQUdQOwotCQkJcmRldi0+bWMuZ3R0X3NpemUgPSByYWRlb25fZ2FydF9zaXplICogMTAyNCAqIDEwMjQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZGV2LT5tYy5ndHRfbG9jYXRpb24gPSByZGV2LT5tYy5hZ3BfYmFzZTsKLQkJfQotCX0KLQlyID0gcmFkZW9uX21jX3NldHVwKHJkZXYpOwotCWlmIChyKSB7Ci0JCXJldHVybiByOwotCX0KLQotCXIxMDBfbWNfZGlzYWJsZV9jbGllbnRzKHJkZXYpOwotCWlmIChyMTAwX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIHdhaXQgTUMgaWRsZSB3aGlsZSAiCi0JCSAgICAgICAicHJvZ3JhbW1pbmcgcGlwZXMuIEJhZCB0aGluZ3MgbWlnaHQgaGFwcGVuLlxuIik7Ci0JfQotCi0JcjEwMF9tY19zZXR1cChyZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCByMTAwX21jX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCi17Ci19Ci0KLQotLyoKLSAqIEludGVycnVwdHMKLSAqLwogaW50IHIxMDBfaXJxX3NldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1aW50MzJfdCB0bXAgPSAwOwpAQCAtMzU4LDEwICsyMjAsNiBAQAogCQlyZXR1cm4gUlJFRzMyKFJBREVPTl9DUlRDMl9DUk5UX0ZSQU1FKTsKIH0KIAotCi0vKgotICogRmVuY2UgZW1pc3Npb24KLSAqLwogdm9pZCByMTAwX2ZlbmNlX3JpbmdfZW1pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJCSAgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpCiB7CkBAIC0zNzcsMTAgKzIzNSw2IEBACiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUkFERU9OX1NXX0lOVF9GSVJFKTsKIH0KIAotCi0vKgotICogV3JpdGViYWNrCi0gKi8KIGludCByMTAwX3diX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IHI7CkBAIC01MDQsMTAgKzM1OCw2IEBACiAJcmV0dXJuIHI7CiB9CiAKLQotLyoKLSAqIENQCi0gKi8KIHN0YXRpYyBpbnQgcjEwMF9jcF93YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXVuc2lnbmVkIGk7CkBAIC02MTIsNiArNDYyLDcgQEAKIAl9CiAJcmV0dXJuIGVycjsKIH0KKwogc3RhdGljIHZvaWQgcjEwMF9jcF9sb2FkX21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAljb25zdCBfX2JlMzIgKmZ3X2RhdGE7CkBAIC04NjMsMTMgKzcxNCwxMSBAQAogdm9pZCByMTAwX2NzX2R1bXBfcGFja2V0KHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAogCQkJIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QpCiB7Ci0Jc3RydWN0IHJhZGVvbl9jc19jaHVuayAqaWJfY2h1bms7CiAJdm9sYXRpbGUgdWludDMyX3QgKmliOwogCXVuc2lnbmVkIGk7CiAJdW5zaWduZWQgaWR4OwogCiAJaWIgPSBwLT5pYi0+cHRyOwotCWliX2NodW5rID0gJnAtPmNodW5rc1twLT5jaHVua19pYl9pZHhdOwogCWlkeCA9IHBrdC0+aWR4OwogCWZvciAoaSA9IDA7IGkgPD0gKHBrdC0+Y291bnQgKyAxKTsgaSsrLCBpZHgrKykgewogCQlEUk1fSU5GTygiaWJbJWRdPTB4JTA4WFxuIiwgaWR4LCBpYltpZHhdKTsKQEAgLTg5Niw3ICs3NDUsNyBAQAogCQkJICBpZHgsIGliX2NodW5rLT5sZW5ndGhfZHcpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaGVhZGVyID0gaWJfY2h1bmstPmtkYXRhW2lkeF07CisJaGVhZGVyID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwogCXBrdC0+aWR4ID0gaWR4OwogCXBrdC0+dHlwZSA9IENQX1BBQ0tFVF9HRVRfVFlQRShoZWFkZXIpOwogCXBrdC0+Y291bnQgPSBDUF9QQUNLRVRfR0VUX0NPVU5UKGhlYWRlcik7CkBAIC05MzksNyArNzg4LDYgQEAKICAqLwogaW50IHIxMDBfY3NfcGFja2V0X3BhcnNlX3ZsaW5lKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKQogewotCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKmliX2NodW5rOwogCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YzsKQEAgLTk0Nyw4ICs3OTUsOSBAQAogCWludCBjcnRjX2lkOwogCWludCByOwogCXVpbnQzMl90IGhlYWRlciwgaF9pZHgsIHJlZzsKKwl2b2xhdGlsZSB1aW50MzJfdCAqaWI7CiAKLQlpYl9jaHVuayA9ICZwLT5jaHVua3NbcC0+Y2h1bmtfaWJfaWR4XTsKKwlpYiA9IHAtPmliLT5wdHI7CiAKIAkvKiBwYXJzZSB0aGUgd2FpdCB1bnRpbCAqLwogCXIgPSByMTAwX2NzX3BhY2tldF9wYXJzZShwLCAmd2FpdHJlbG9jLCBwLT5pZHgpOwpAQCAtOTYzLDI0ICs4MTIsMjQgQEAKIAkJcmV0dXJuIHI7CiAJfQogCi0JaWYgKGliX2NodW5rLT5rZGF0YVt3YWl0cmVsb2MuaWR4ICsgMV0gIT0gUkFERU9OX1dBSVRfQ1JUQ19WTElORSkgeworCWlmIChyYWRlb25fZ2V0X2liX3ZhbHVlKHAsIHdhaXRyZWxvYy5pZHggKyAxKSAhPSBSQURFT05fV0FJVF9DUlRDX1ZMSU5FKSB7CiAJCURSTV9FUlJPUigidmxpbmUgd2FpdCBoYWQgaWxsZWdhbCB3YWl0IHVudGlsXG4iKTsKIAkJciA9IC1FSU5WQUw7CiAJCXJldHVybiByOwogCX0KIAogCS8qIGp1bXAgb3ZlciB0aGUgTk9QICovCi0JciA9IHIxMDBfY3NfcGFja2V0X3BhcnNlKHAsICZwM3JlbG9jLCBwLT5pZHgpOworCXIgPSByMTAwX2NzX3BhY2tldF9wYXJzZShwLCAmcDNyZWxvYywgcC0+aWR4ICsgd2FpdHJlbG9jLmNvdW50ICsgMik7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCiAJaF9pZHggPSBwLT5pZHggLSAyOwotCXAtPmlkeCArPSB3YWl0cmVsb2MuY291bnQ7Ci0JcC0+aWR4ICs9IHAzcmVsb2MuY291bnQ7CisJcC0+aWR4ICs9IHdhaXRyZWxvYy5jb3VudCArIDI7CisJcC0+aWR4ICs9IHAzcmVsb2MuY291bnQgKyAyOwogCi0JaGVhZGVyID0gaWJfY2h1bmstPmtkYXRhW2hfaWR4XTsKLQljcnRjX2lkID0gaWJfY2h1bmstPmtkYXRhW2hfaWR4ICsgNV07Ci0JcmVnID0gaWJfY2h1bmstPmtkYXRhW2hfaWR4XSA+PiAyOworCWhlYWRlciA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaF9pZHgpOworCWNydGNfaWQgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGhfaWR4ICsgNSk7CisJcmVnID0gQ1BfUEFDS0VUMF9HRVRfUkVHKGhlYWRlcik7CiAJbXV0ZXhfbG9jaygmcC0+cmRldi0+ZGRldi0+bW9kZV9jb25maWcubXV0ZXgpOwogCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKHAtPnJkZXYtPmRkZXYsIGNydGNfaWQsIERSTV9NT0RFX09CSkVDVF9DUlRDKTsKIAlpZiAoIW9iaikgewpAQCAtOTk0LDE2ICs4NDMsMTYgQEAKIAogCWlmICghY3J0Yy0+ZW5hYmxlZCkgewogCQkvKiBpZiB0aGUgQ1JUQyBpc24ndCBlbmFibGVkIC0gd2UgbmVlZCB0byBub3Agb3V0IHRoZSB3YWl0IHVudGlsICovCi0JCWliX2NodW5rLT5rZGF0YVtoX2lkeCArIDJdID0gUEFDS0VUMigwKTsKLQkJaWJfY2h1bmstPmtkYXRhW2hfaWR4ICsgM10gPSBQQUNLRVQyKDApOworCQlpYltoX2lkeCArIDJdID0gUEFDS0VUMigwKTsKKwkJaWJbaF9pZHggKyAzXSA9IFBBQ0tFVDIoMCk7CiAJfSBlbHNlIGlmIChjcnRjX2lkID09IDEpIHsKIAkJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSBBVklWT19EMU1PREVfVkxJTkVfU1RBUlRfRU5EOgotCQkJaGVhZGVyICY9IFIzMDBfQ1BfUEFDS0VUMF9SRUdfTUFTSzsKKwkJCWhlYWRlciAmPSB+UjMwMF9DUF9QQUNLRVQwX1JFR19NQVNLOwogCQkJaGVhZGVyIHw9IEFWSVZPX0QyTU9ERV9WTElORV9TVEFSVF9FTkQgPj4gMjsKIAkJCWJyZWFrOwogCQljYXNlIFJBREVPTl9DUlRDX0dVSV9UUklHX1ZMSU5FOgotCQkJaGVhZGVyICY9IFIzMDBfQ1BfUEFDS0VUMF9SRUdfTUFTSzsKKwkJCWhlYWRlciAmPSB+UjMwMF9DUF9QQUNLRVQwX1JFR19NQVNLOwogCQkJaGVhZGVyIHw9IFJBREVPTl9DUlRDMl9HVUlfVFJJR19WTElORSA+PiAyOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0xMDExLDggKzg2MCw4IEBACiAJCQlyID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWliX2NodW5rLT5rZGF0YVtoX2lkeF0gPSBoZWFkZXI7Ci0JCWliX2NodW5rLT5rZGF0YVtoX2lkeCArIDNdIHw9IFJBREVPTl9FTkdfRElTUExBWV9TRUxFQ1RfQ1JUQzE7CisJCWliW2hfaWR4XSA9IGhlYWRlcjsKKwkJaWJbaF9pZHggKyAzXSB8PSBSQURFT05fRU5HX0RJU1BMQVlfU0VMRUNUX0NSVEMxOwogCX0KIG91dDoKIAltdXRleF91bmxvY2soJnAtPnJkZXYtPmRkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKQEAgLTEwMzMsNyArODgyLDYgQEAKIGludCByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAogCQkJICAgICAgc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqKmNzX3JlbG9jKQogewotCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKmliX2NodW5rOwogCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKnJlbG9jc19jaHVuazsKIAlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCBwM3JlbG9jOwogCXVuc2lnbmVkIGlkeDsKQEAgLTEwNDQsNyArODkyLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCSpjc19yZWxvYyA9IE5VTEw7Ci0JaWJfY2h1bmsgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07CiAJcmVsb2NzX2NodW5rID0gJnAtPmNodW5rc1twLT5jaHVua19yZWxvY3NfaWR4XTsKIAlyID0gcjEwMF9jc19wYWNrZXRfcGFyc2UocCwgJnAzcmVsb2MsIHAtPmlkeCk7CiAJaWYgKHIpIHsKQEAgLTEwNTcsNyArOTA0LDcgQEAKIAkJcjEwMF9jc19kdW1wX3BhY2tldChwLCAmcDNyZWxvYyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZHggPSBpYl9jaHVuay0+a2RhdGFbcDNyZWxvYy5pZHggKyAxXTsKKwlpZHggPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIHAzcmVsb2MuaWR4ICsgMSk7CiAJaWYgKGlkeCA+PSByZWxvY3NfY2h1bmstPmxlbmd0aF9kdykgewogCQlEUk1fRVJST1IoIlJlbG9jcyBhdCAlZCBhZnRlciByZWxvY2F0aW9ucyBjaHVuayBlbmQgJWQgIVxuIiwKIAkJCSAgaWR4LCByZWxvY3NfY2h1bmstPmxlbmd0aF9kdyk7CkBAIC0xMTI2LDcgKzk3Myw2IEBACiAJCQkgICAgICBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAogCQkJICAgICAgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCByZWcpCiB7Ci0Jc3RydWN0IHJhZGVvbl9jc19jaHVuayAqaWJfY2h1bms7CiAJc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqcmVsb2M7CiAJc3RydWN0IHIxMDBfY3NfdHJhY2sgKnRyYWNrOwogCXZvbGF0aWxlIHVpbnQzMl90ICppYjsKQEAgLTExMzQsMTEgKzk4MCwxMyBAQAogCWludCByOwogCWludCBpLCBmYWNlOwogCXUzMiB0aWxlX2ZsYWdzID0gMDsKKwl1MzIgaWR4X3ZhbHVlOwogCiAJaWIgPSBwLT5pYi0+cHRyOwotCWliX2NodW5rID0gJnAtPmNodW5rc1twLT5jaHVua19pYl9pZHhdOwogCXRyYWNrID0gKHN0cnVjdCByMTAwX2NzX3RyYWNrICopcC0+dHJhY2s7CiAKKwlpZHhfdmFsdWUgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CisKIAlzd2l0Y2ggKHJlZykgewogCWNhc2UgUkFERU9OX0NSVENfR1VJX1RSSUdfVkxJTkU6CiAJCXIgPSByMTAwX2NzX3BhY2tldF9wYXJzZV92bGluZShwKTsKQEAgLTExNjYsOCArMTAxNCw4IEBACiAJCQlyZXR1cm4gcjsKIAkJfQogCQl0cmFjay0+emIucm9iaiA9IHJlbG9jLT5yb2JqOwotCQl0cmFjay0+emIub2Zmc2V0ID0gaWJfY2h1bmstPmtkYXRhW2lkeF07Ci0JCWliW2lkeF0gPSBpYl9jaHVuay0+a2RhdGFbaWR4XSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOworCQl0cmFjay0+emIub2Zmc2V0ID0gaWR4X3ZhbHVlOworCQlpYltpZHhdID0gaWR4X3ZhbHVlICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1JCM0RfQ09MT1JPRkZTRVQ6CiAJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CkBAIC0xMTc4LDggKzEwMjYsOCBAQAogCQkJcmV0dXJuIHI7CiAJCX0KIAkJdHJhY2stPmNiWzBdLnJvYmogPSByZWxvYy0+cm9iajsKLQkJdHJhY2stPmNiWzBdLm9mZnNldCA9IGliX2NodW5rLT5rZGF0YVtpZHhdOwotCQlpYltpZHhdID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJdHJhY2stPmNiWzBdLm9mZnNldCA9IGlkeF92YWx1ZTsKKwkJaWJbaWR4XSA9IGlkeF92YWx1ZSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QUF9UWE9GRlNFVF8wOgogCWNhc2UgUkFERU9OX1BQX1RYT0ZGU0VUXzE6CkBAIC0xMTkyLDcgKzEwNDAsNyBAQAogCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwogCQkJcmV0dXJuIHI7CiAJCX0KLQkJaWJbaWR4XSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCWliW2lkeF0gPSBpZHhfdmFsdWUgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKIAkJdHJhY2stPnRleHR1cmVzW2ldLnJvYmogPSByZWxvYy0+cm9iajsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QwXzA6CkBAIC0xMjA4LDggKzEwNTYsOCBAQAogCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwogCQkJcmV0dXJuIHI7CiAJCX0KLQkJdHJhY2stPnRleHR1cmVzWzBdLmN1YmVfaW5mb1tpXS5vZmZzZXQgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKLQkJaWJbaWR4XSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCXRyYWNrLT50ZXh0dXJlc1swXS5jdWJlX2luZm9baV0ub2Zmc2V0ID0gaWR4X3ZhbHVlOworCQlpYltpZHhdID0gaWR4X3ZhbHVlICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CiAJCXRyYWNrLT50ZXh0dXJlc1swXS5jdWJlX2luZm9baV0ucm9iaiA9IHJlbG9jLT5yb2JqOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDFfMDoKQEAgLTEyMjUsOCArMTA3Myw4IEBACiAJCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7CiAJCQlyZXR1cm4gcjsKIAkJfQotCQl0cmFjay0+dGV4dHVyZXNbMV0uY3ViZV9pbmZvW2ldLm9mZnNldCA9IGliX2NodW5rLT5rZGF0YVtpZHhdOwotCQlpYltpZHhdID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJdHJhY2stPnRleHR1cmVzWzFdLmN1YmVfaW5mb1tpXS5vZmZzZXQgPSBpZHhfdmFsdWU7CisJCWliW2lkeF0gPSBpZHhfdmFsdWUgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKIAkJdHJhY2stPnRleHR1cmVzWzFdLmN1YmVfaW5mb1tpXS5yb2JqID0gcmVsb2MtPnJvYmo7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wOgpAQCAtMTI0MiwxMiArMTA5MCwxMiBAQAogCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwogCQkJcmV0dXJuIHI7CiAJCX0KLQkJdHJhY2stPnRleHR1cmVzWzJdLmN1YmVfaW5mb1tpXS5vZmZzZXQgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKLQkJaWJbaWR4XSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCXRyYWNrLT50ZXh0dXJlc1syXS5jdWJlX2luZm9baV0ub2Zmc2V0ID0gaWR4X3ZhbHVlOworCQlpYltpZHhdID0gaWR4X3ZhbHVlICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CiAJCXRyYWNrLT50ZXh0dXJlc1syXS5jdWJlX2luZm9baV0ucm9iaiA9IHJlbG9jLT5yb2JqOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9SRV9XSURUSF9IRUlHSFQ6Ci0JCXRyYWNrLT5tYXh5ID0gKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiAxNikgJiAweDdGRik7CisJCXRyYWNrLT5tYXh5ID0gKChpZHhfdmFsdWUgPj4gMTYpICYgMHg3RkYpOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9SQjNEX0NPTE9SUElUQ0g6CiAJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CkBAIC0xMjYzLDE3ICsxMTExLDE3IEBACiAJCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01JQ1JPKQogCQkJdGlsZV9mbGFncyB8PSBSQURFT05fQ09MT1JfTUlDUk9USUxFX0VOQUJMRTsKIAotCQl0bXAgPSBpYl9jaHVuay0+a2RhdGFbaWR4XSAmIH4oMHg3IDw8IDE2KTsKKwkJdG1wID0gaWR4X3ZhbHVlICYgfigweDcgPDwgMTYpOwogCQl0bXAgfD0gdGlsZV9mbGFnczsKIAkJaWJbaWR4XSA9IHRtcDsKIAotCQl0cmFjay0+Y2JbMF0ucGl0Y2ggPSBpYl9jaHVuay0+a2RhdGFbaWR4XSAmIFJBREVPTl9DT0xPUlBJVENIX01BU0s7CisJCXRyYWNrLT5jYlswXS5waXRjaCA9IGlkeF92YWx1ZSAmIFJBREVPTl9DT0xPUlBJVENIX01BU0s7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1JCM0RfREVQVEhQSVRDSDoKLQkJdHJhY2stPnpiLnBpdGNoID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gJiBSQURFT05fREVQVEhQSVRDSF9NQVNLOworCQl0cmFjay0+emIucGl0Y2ggPSBpZHhfdmFsdWUgJiBSQURFT05fREVQVEhQSVRDSF9NQVNLOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9SQjNEX0NOVEw6Ci0JCXN3aXRjaCAoKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IFJBREVPTl9SQjNEX0NPTE9SX0ZPUk1BVF9TSElGVCkgJiAweDFmKSB7CisJCXN3aXRjaCAoKGlkeF92YWx1ZSA+PiBSQURFT05fUkIzRF9DT0xPUl9GT1JNQVRfU0hJRlQpICYgMHgxZikgewogCQljYXNlIDc6CiAJCWNhc2UgODoKIAkJY2FzZSA5OgpAQCAtMTI5MSwxMyArMTEzOSwxMyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlEUk1fRVJST1IoIkludmFsaWQgY29sb3IgYnVmZmVyIGZvcm1hdCAoJWQpICFcbiIsCi0JCQkJICAoKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IFJBREVPTl9SQjNEX0NPTE9SX0ZPUk1BVF9TSElGVCkgJiAweDFmKSk7CisJCQkJICAoKGlkeF92YWx1ZSA+PiBSQURFT05fUkIzRF9DT0xPUl9GT1JNQVRfU0hJRlQpICYgMHgxZikpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJdHJhY2stPnpfZW5hYmxlZCA9ICEhKGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX1pfRU5BQkxFKTsKKwkJdHJhY2stPnpfZW5hYmxlZCA9ICEhKGlkeF92YWx1ZSAmIFJBREVPTl9aX0VOQUJMRSk7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1JCM0RfWlNURU5DSUxDTlRMOgotCQlzd2l0Y2ggKGliX2NodW5rLT5rZGF0YVtpZHhdICYgMHhmKSB7CisJCXN3aXRjaCAoaWR4X3ZhbHVlICYgMHhmKSB7CiAJCWNhc2UgMDoKIAkJCXRyYWNrLT56Yi5jcHAgPSAyOwogCQkJYnJlYWs7CkBAIC0xMzIxLDQ0ICsxMTY5LDQ0IEBACiAJCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7CiAJCQlyZXR1cm4gcjsKIAkJfQotCQlpYltpZHhdID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJaWJbaWR4XSA9IGlkeF92YWx1ZSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QUF9DTlRMOgogCQl7Ci0JCQl1aW50MzJfdCB0ZW1wID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gNDsKKwkJCXVpbnQzMl90IHRlbXAgPSBpZHhfdmFsdWUgPj4gNDsKIAkJCWZvciAoaSA9IDA7IGkgPCB0cmFjay0+bnVtX3RleHR1cmU7IGkrKykKIAkJCQl0cmFjay0+dGV4dHVyZXNbaV0uZW5hYmxlZCA9ICEhKHRlbXAgJiAoMSA8PCBpKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fU0VfVkZfQ05UTDoKLQkJdHJhY2stPnZhcF92Zl9jbnRsID0gaWJfY2h1bmstPmtkYXRhW2lkeF07CisJCXRyYWNrLT52YXBfdmZfY250bCA9IGlkeF92YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fU0VfVlRYX0ZNVDoKLQkJdHJhY2stPnZ0eF9zaXplID0gcjEwMF9nZXRfdnR4X3NpemUoaWJfY2h1bmstPmtkYXRhW2lkeF0pOworCQl0cmFjay0+dnR4X3NpemUgPSByMTAwX2dldF92dHhfc2l6ZShpZHhfdmFsdWUpOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QUF9URVhfU0laRV8wOgogCWNhc2UgUkFERU9OX1BQX1RFWF9TSVpFXzE6CiAJY2FzZSBSQURFT05fUFBfVEVYX1NJWkVfMjoKIAkJaSA9IChyZWcgLSBSQURFT05fUFBfVEVYX1NJWkVfMCkgLyA4OwotCQl0cmFjay0+dGV4dHVyZXNbaV0ud2lkdGggPSAoaWJfY2h1bmstPmtkYXRhW2lkeF0gJiBSQURFT05fVEVYX1VTSVpFX01BU0spICsgMTsKLQkJdHJhY2stPnRleHR1cmVzW2ldLmhlaWdodCA9ICgoaWJfY2h1bmstPmtkYXRhW2lkeF0gJiBSQURFT05fVEVYX1ZTSVpFX01BU0spID4+IFJBREVPTl9URVhfVlNJWkVfU0hJRlQpICsgMTsKKwkJdHJhY2stPnRleHR1cmVzW2ldLndpZHRoID0gKGlkeF92YWx1ZSAmIFJBREVPTl9URVhfVVNJWkVfTUFTSykgKyAxOworCQl0cmFjay0+dGV4dHVyZXNbaV0uaGVpZ2h0ID0gKChpZHhfdmFsdWUgJiBSQURFT05fVEVYX1ZTSVpFX01BU0spID4+IFJBREVPTl9URVhfVlNJWkVfU0hJRlQpICsgMTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUFBfVEVYX1BJVENIXzA6CiAJY2FzZSBSQURFT05fUFBfVEVYX1BJVENIXzE6CiAJY2FzZSBSQURFT05fUFBfVEVYX1BJVENIXzI6CiAJCWkgPSAocmVnIC0gUkFERU9OX1BQX1RFWF9QSVRDSF8wKSAvIDg7Ci0JCXRyYWNrLT50ZXh0dXJlc1tpXS5waXRjaCA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgMzI7CisJCXRyYWNrLT50ZXh0dXJlc1tpXS5waXRjaCA9IGlkeF92YWx1ZSArIDMyOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QUF9UWEZJTFRFUl8wOgogCWNhc2UgUkFERU9OX1BQX1RYRklMVEVSXzE6CiAJY2FzZSBSQURFT05fUFBfVFhGSUxURVJfMjoKIAkJaSA9IChyZWcgLSBSQURFT05fUFBfVFhGSUxURVJfMCkgLyAyNDsKLQkJdHJhY2stPnRleHR1cmVzW2ldLm51bV9sZXZlbHMgPSAoKGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX01BWF9NSVBfTEVWRUxfTUFTSykKKwkJdHJhY2stPnRleHR1cmVzW2ldLm51bV9sZXZlbHMgPSAoKGlkeF92YWx1ZSAmIFJBREVPTl9NQVhfTUlQX0xFVkVMX01BU0spCiAJCQkJCQkgPj4gUkFERU9OX01BWF9NSVBfTEVWRUxfU0hJRlQpOwotCQl0bXAgPSAoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMjMpICYgMHg3OworCQl0bXAgPSAoaWR4X3ZhbHVlID4+IDIzKSAmIDB4NzsKIAkJaWYgKHRtcCA9PSAyIHx8IHRtcCA9PSA2KQogCQkJdHJhY2stPnRleHR1cmVzW2ldLnJvdW5kdXBfdyA9IGZhbHNlOwotCQl0bXAgPSAoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMjcpICYgMHg3OworCQl0bXAgPSAoaWR4X3ZhbHVlID4+IDI3KSAmIDB4NzsKIAkJaWYgKHRtcCA9PSAyIHx8IHRtcCA9PSA2KQogCQkJdHJhY2stPnRleHR1cmVzW2ldLnJvdW5kdXBfaCA9IGZhbHNlOwogCQlicmVhazsKQEAgLTEzNjYsMTYgKzEyMTQsMTYgQEAKIAljYXNlIFJBREVPTl9QUF9UWEZPUk1BVF8xOgogCWNhc2UgUkFERU9OX1BQX1RYRk9STUFUXzI6CiAJCWkgPSAocmVnIC0gUkFERU9OX1BQX1RYRk9STUFUXzApIC8gMjQ7Ci0JCWlmIChpYl9jaHVuay0+a2RhdGFbaWR4XSAmIFJBREVPTl9UWEZPUk1BVF9OT05fUE9XRVIyKSB7CisJCWlmIChpZHhfdmFsdWUgJiBSQURFT05fVFhGT1JNQVRfTk9OX1BPV0VSMikgewogCQkJdHJhY2stPnRleHR1cmVzW2ldLnVzZV9waXRjaCA9IDE7CiAJCX0gZWxzZSB7CiAJCQl0cmFjay0+dGV4dHVyZXNbaV0udXNlX3BpdGNoID0gMDsKLQkJCXRyYWNrLT50ZXh0dXJlc1tpXS53aWR0aCA9IDEgPDwgKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiBSQURFT05fVFhGT1JNQVRfV0lEVEhfU0hJRlQpICYgUkFERU9OX1RYRk9STUFUX1dJRFRIX01BU0spOwotCQkJdHJhY2stPnRleHR1cmVzW2ldLmhlaWdodCA9IDEgPDwgKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiBSQURFT05fVFhGT1JNQVRfSEVJR0hUX1NISUZUKSAmIFJBREVPTl9UWEZPUk1BVF9IRUlHSFRfTUFTSyk7CisJCQl0cmFjay0+dGV4dHVyZXNbaV0ud2lkdGggPSAxIDw8ICgoaWR4X3ZhbHVlID4+IFJBREVPTl9UWEZPUk1BVF9XSURUSF9TSElGVCkgJiBSQURFT05fVFhGT1JNQVRfV0lEVEhfTUFTSyk7CisJCQl0cmFjay0+dGV4dHVyZXNbaV0uaGVpZ2h0ID0gMSA8PCAoKGlkeF92YWx1ZSA+PiBSQURFT05fVFhGT1JNQVRfSEVJR0hUX1NISUZUKSAmIFJBREVPTl9UWEZPUk1BVF9IRUlHSFRfTUFTSyk7CiAJCX0KLQkJaWYgKGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX1RYRk9STUFUX0NVQklDX01BUF9FTkFCTEUpCisJCWlmIChpZHhfdmFsdWUgJiBSQURFT05fVFhGT1JNQVRfQ1VCSUNfTUFQX0VOQUJMRSkKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS50ZXhfY29vcmRfdHlwZSA9IDI7Ci0JCXN3aXRjaCAoKGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX1RYRk9STUFUX0ZPUk1BVF9NQVNLKSkgeworCQlzd2l0Y2ggKChpZHhfdmFsdWUgJiBSQURFT05fVFhGT1JNQVRfRk9STUFUX01BU0spKSB7CiAJCWNhc2UgUkFERU9OX1RYRk9STUFUX0k4OgogCQljYXNlIFJBREVPTl9UWEZPUk1BVF9SR0IzMzI6CiAJCWNhc2UgUkFERU9OX1RYRk9STUFUX1k4OgpAQCAtMTQwMiwxMyArMTI1MCwxMyBAQAogCQkJdHJhY2stPnRleHR1cmVzW2ldLmNwcCA9IDQ7CiAJCQlicmVhazsKIAkJfQotCQl0cmFjay0+dGV4dHVyZXNbaV0uY3ViZV9pbmZvWzRdLndpZHRoID0gMSA8PCAoKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDE2KSAmIDB4Zik7Ci0JCXRyYWNrLT50ZXh0dXJlc1tpXS5jdWJlX2luZm9bNF0uaGVpZ2h0ID0gMSA8PCAoKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDIwKSAmIDB4Zik7CisJCXRyYWNrLT50ZXh0dXJlc1tpXS5jdWJlX2luZm9bNF0ud2lkdGggPSAxIDw8ICgoaWR4X3ZhbHVlID4+IDE2KSAmIDB4Zik7CisJCXRyYWNrLT50ZXh0dXJlc1tpXS5jdWJlX2luZm9bNF0uaGVpZ2h0ID0gMSA8PCAoKGlkeF92YWx1ZSA+PiAyMCkgJiAweGYpOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QUF9DVUJJQ19GQUNFU18wOgogCWNhc2UgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzE6CiAJY2FzZSBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMjoKLQkJdG1wID0gaWJfY2h1bmstPmtkYXRhW2lkeF07CisJCXRtcCA9IGlkeF92YWx1ZTsKIAkJaSA9IChyZWcgLSBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMCkgLyA0OwogCQlmb3IgKGZhY2UgPSAwOyBmYWNlIDwgNDsgZmFjZSsrKSB7CiAJCQl0cmFjay0+dGV4dHVyZXNbaV0uY3ViZV9pbmZvW2ZhY2VdLndpZHRoID0gMSA8PCAoKHRtcCA+PiAoZmFjZSAqIDgpKSAmIDB4Zik7CkBAIC0xNDI3LDE1ICsxMjc1LDE0IEBACiAJCQkJCSBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAogCQkJCQkgc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmopCiB7Ci0Jc3RydWN0IHJhZGVvbl9jc19jaHVuayAqaWJfY2h1bms7CiAJdW5zaWduZWQgaWR4OwotCi0JaWJfY2h1bmsgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07CisJdTMyIHZhbHVlOwogCWlkeCA9IHBrdC0+aWR4ICsgMTsKLQlpZiAoKGliX2NodW5rLT5rZGF0YVtpZHgrMl0gKyAxKSA+IHJhZGVvbl9vYmplY3Rfc2l6ZShyb2JqKSkgeworCXZhbHVlID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAyKTsKKwlpZiAoKHZhbHVlICsgMSkgPiByYWRlb25fb2JqZWN0X3NpemUocm9iaikpIHsKIAkJRFJNX0VSUk9SKCJbZHJtXSBCdWZmZXIgdG9vIHNtYWxsIGZvciBQQUNLRVQzIElORFhfQlVGRkVSICIKIAkJCSAgIihuZWVkICV1IGhhdmUgJWx1KSAhXG4iLAotCQkJICBpYl9jaHVuay0+a2RhdGFbaWR4KzJdICsgMSwKKwkJCSAgdmFsdWUgKyAxLAogCQkJICByYWRlb25fb2JqZWN0X3NpemUocm9iaikpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNDQ1LDU5ICsxMjkyLDIwIEBACiBzdGF0aWMgaW50IHIxMDBfcGFja2V0M19jaGVjayhzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKIAkJCSAgICAgIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QpCiB7Ci0Jc3RydWN0IHJhZGVvbl9jc19jaHVuayAqaWJfY2h1bms7CiAJc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqcmVsb2M7CiAJc3RydWN0IHIxMDBfY3NfdHJhY2sgKnRyYWNrOwogCXVuc2lnbmVkIGlkeDsKLQl1bnNpZ25lZCBpLCBjOwogCXZvbGF0aWxlIHVpbnQzMl90ICppYjsKIAlpbnQgcjsKIAogCWliID0gcC0+aWItPnB0cjsKLQlpYl9jaHVuayA9ICZwLT5jaHVua3NbcC0+Y2h1bmtfaWJfaWR4XTsKIAlpZHggPSBwa3QtPmlkeCArIDE7CiAJdHJhY2sgPSAoc3RydWN0IHIxMDBfY3NfdHJhY2sgKilwLT50cmFjazsKIAlzd2l0Y2ggKHBrdC0+b3Bjb2RlKSB7CiAJY2FzZSBQQUNLRVQzXzNEX0xPQURfVkJQTlRSOgotCQljID0gaWJfY2h1bmstPmtkYXRhW2lkeCsrXTsKLQkJdHJhY2stPm51bV9hcnJheXMgPSBjOwotCQlmb3IgKGkgPSAwOyBpIDwgKGMgLSAxKTsgaSArPSAyLCBpZHggKz0gMykgewotCQkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKLQkJCWlmIChyKSB7Ci0JCQkJRFJNX0VSUk9SKCJObyByZWxvYyBmb3IgcGFja2V0MyAlZFxuIiwKLQkJCQkJICBwa3QtPm9wY29kZSk7Ci0JCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCQkJCXJldHVybiByOwotCQkJfQotCQkJaWJbaWR4KzFdID0gaWJfY2h1bmstPmtkYXRhW2lkeCsxXSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0ucm9iaiA9IHJlbG9jLT5yb2JqOwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiA4OwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgJj0gMHg3RjsKLQkJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7Ci0JCQlpZiAocikgewotCQkJCURSTV9FUlJPUigiTm8gcmVsb2MgZm9yIHBhY2tldDMgJWRcbiIsCi0JCQkJCSAgcGt0LT5vcGNvZGUpOwotCQkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJCWliW2lkeCsyXSA9IGliX2NodW5rLT5rZGF0YVtpZHgrMl0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKLQkJCXRyYWNrLT5hcnJheXNbaSArIDFdLnJvYmogPSByZWxvYy0+cm9iajsKLQkJCXRyYWNrLT5hcnJheXNbaSArIDFdLmVzaXplID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMjQ7Ci0JCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5lc2l6ZSAmPSAweDdGOwotCQl9Ci0JCWlmIChjICYgMSkgewotCQkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKLQkJCWlmIChyKSB7Ci0JCQkJRFJNX0VSUk9SKCJObyByZWxvYyBmb3IgcGFja2V0MyAlZFxuIiwKLQkJCQkJICBwa3QtPm9wY29kZSk7Ci0JCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCQkJCXJldHVybiByOwotCQkJfQotCQkJaWJbaWR4KzFdID0gaWJfY2h1bmstPmtkYXRhW2lkeCsxXSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0ucm9iaiA9IHJlbG9jLT5yb2JqOwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiA4OwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgJj0gMHg3RjsKLQkJfQorCQlyID0gcjEwMF9wYWNrZXQzX2xvYWRfdmJwbnRyKHAsIHBrdCwgaWR4KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKIAkJYnJlYWs7CiAJY2FzZSBQQUNLRVQzX0lORFhfQlVGRkVSOgogCQlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOwpAQCAtMTUwNiw3ICsxMzE0LDcgQEAKIAkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKIAkJCXJldHVybiByOwogCQl9Ci0JCWliW2lkeCsxXSA9IGliX2NodW5rLT5rZGF0YVtpZHgrMV0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJaWJbaWR4KzFdID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgrMSkgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKIAkJciA9IHIxMDBfY3NfdHJhY2tfY2hlY2tfcGt0M19pbmR4X2J1ZmZlcihwLCBwa3QsIHJlbG9jLT5yb2JqKTsKIAkJaWYgKHIpIHsKIAkJCXJldHVybiByOwpAQCAtMTUyMCwyNyArMTMyOCwyNyBAQAogCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwogCQkJcmV0dXJuIHI7CiAJCX0KLQkJaWJbaWR4XSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCWliW2lkeF0gPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCkgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKIAkJdHJhY2stPm51bV9hcnJheXMgPSAxOwotCQl0cmFjay0+dnR4X3NpemUgPSByMTAwX2dldF92dHhfc2l6ZShpYl9jaHVuay0+a2RhdGFbaWR4KzJdKTsKKwkJdHJhY2stPnZ0eF9zaXplID0gcjEwMF9nZXRfdnR4X3NpemUocmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAyKSk7CiAKIAkJdHJhY2stPmFycmF5c1swXS5yb2JqID0gcmVsb2MtPnJvYmo7CiAJCXRyYWNrLT5hcnJheXNbMF0uZXNpemUgPSB0cmFjay0+dnR4X3NpemU7CiAKLQkJdHJhY2stPm1heF9pbmR4ID0gaWJfY2h1bmstPmtkYXRhW2lkeCsxXTsKKwkJdHJhY2stPm1heF9pbmR4ID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgrMSk7CiAKLQkJdHJhY2stPnZhcF92Zl9jbnRsID0gaWJfY2h1bmstPmtkYXRhW2lkeCszXTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgrMyk7CiAJCXRyYWNrLT5pbW1kX2R3b3JkcyA9IHBrdC0+Y291bnQgLSAxOwogCQlyID0gcjEwMF9jc190cmFja19jaGVjayhwLT5yZGV2LCB0cmFjayk7CiAJCWlmIChyKQogCQkJcmV0dXJuIHI7CiAJCWJyZWFrOwogCWNhc2UgUEFDS0VUM18zRF9EUkFXX0lNTUQ6Ci0JCWlmICgoKGliX2NodW5rLT5rZGF0YVtpZHgrMV0gPj4gNCkgJiAweDMpICE9IDMpIHsKKwkJaWYgKCgocmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKSA+PiA0KSAmIDB4MykgIT0gMykgewogCQkJRFJNX0VSUk9SKCJQUklNX1dBTEsgbXVzdCBiZSAzIGZvciBJTU1EIGRyYXdcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJdHJhY2stPnZhcF92Zl9jbnRsID0gaWJfY2h1bmstPmtkYXRhW2lkeCsxXTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKTsKIAkJdHJhY2stPmltbWRfZHdvcmRzID0gcGt0LT5jb3VudCAtIDE7CiAJCXIgPSByMTAwX2NzX3RyYWNrX2NoZWNrKHAtPnJkZXYsIHRyYWNrKTsKIAkJaWYgKHIpCkBAIC0xNTQ4LDExICsxMzU2LDExIEBACiAJCWJyZWFrOwogCQkvKiB0cmlnZ2VycyBkcmF3aW5nIHVzaW5nIGluLXBhY2tldCB2ZXJ0ZXggZGF0YSAqLwogCWNhc2UgUEFDS0VUM18zRF9EUkFXX0lNTURfMjoKLQkJaWYgKCgoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gNCkgJiAweDMpICE9IDMpIHsKKwkJaWYgKCgocmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpID4+IDQpICYgMHgzKSAhPSAzKSB7CiAJCQlEUk1fRVJST1IoIlBSSU1fV0FMSyBtdXN0IGJlIDMgZm9yIElNTUQgZHJhd1xuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQl0cmFjay0+dmFwX3ZmX2NudGwgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwogCQl0cmFjay0+aW1tZF9kd29yZHMgPSBwa3QtPmNvdW50OwogCQlyID0gcjEwMF9jc190cmFja19jaGVjayhwLT5yZGV2LCB0cmFjayk7CiAJCWlmIChyKQpAQCAtMTU2MCwyOCArMTM2OCwyOCBAQAogCQlicmVhazsKIAkJLyogdHJpZ2dlcnMgZHJhd2luZyB1c2luZyBpbi1wYWNrZXQgdmVydGV4IGRhdGEgKi8KIAljYXNlIFBBQ0tFVDNfM0RfRFJBV19WQlVGXzI6Ci0JCXRyYWNrLT52YXBfdmZfY250bCA9IGliX2NodW5rLT5rZGF0YVtpZHhdOworCQl0cmFjay0+dmFwX3ZmX2NudGwgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CiAJCXIgPSByMTAwX2NzX3RyYWNrX2NoZWNrKHAtPnJkZXYsIHRyYWNrKTsKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKIAkJYnJlYWs7CiAJCS8qIHRyaWdnZXJzIGRyYXdpbmcgb2YgdmVydGV4IGJ1ZmZlcnMgc2V0dXAgZWxzZXdoZXJlICovCiAJY2FzZSBQQUNLRVQzXzNEX0RSQVdfSU5EWF8yOgotCQl0cmFjay0+dmFwX3ZmX2NudGwgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwogCQlyID0gcjEwMF9jc190cmFja19jaGVjayhwLT5yZGV2LCB0cmFjayk7CiAJCWlmIChyKQogCQkJcmV0dXJuIHI7CiAJCWJyZWFrOwogCQkvKiB0cmlnZ2VycyBkcmF3aW5nIHVzaW5nIGluZGljZXMgdG8gdmVydGV4IGJ1ZmZlciAqLwogCWNhc2UgUEFDS0VUM18zRF9EUkFXX1ZCVUY6Ci0JCXRyYWNrLT52YXBfdmZfY250bCA9IGliX2NodW5rLT5rZGF0YVtpZHggKyAxXTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKTsKIAkJciA9IHIxMDBfY3NfdHJhY2tfY2hlY2socC0+cmRldiwgdHJhY2spOwogCQlpZiAocikKIAkJCXJldHVybiByOwogCQlicmVhazsKIAkJLyogdHJpZ2dlcnMgZHJhd2luZyBvZiB2ZXJ0ZXggYnVmZmVycyBzZXR1cCBlbHNld2hlcmUgKi8KIAljYXNlIFBBQ0tFVDNfM0RfRFJBV19JTkRYOgotCQl0cmFjay0+dmFwX3ZmX2NudGwgPSBpYl9jaHVuay0+a2RhdGFbaWR4ICsgMV07CisJCXRyYWNrLT52YXBfdmZfY250bCA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMSk7CiAJCXIgPSByMTAwX2NzX3RyYWNrX2NoZWNrKHAtPnJkZXYsIHRyYWNrKTsKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKQEAgLTIwMzMsNyArMTg0MSw3IEBACiAJcjEwMF9wbGxfZXJyYXRhX2FmdGVyX2RhdGEocmRldik7CiB9CiAKLWludCByMTAwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit2b2lkIHIxMDBfc2V0X3NhZmVfcmVnaXN0ZXJzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWlmIChBU0lDX0lTX1JONTAocmRldikpIHsKIAkJcmRldi0+Y29uZmlnLnIxMDAucmVnX3NhZmVfYm0gPSBybjUwX3JlZ19zYWZlX2JtOwpAQCAtMjA0Miw5ICsxODUwLDggQEAKIAkJcmRldi0+Y29uZmlnLnIxMDAucmVnX3NhZmVfYm0gPSByMTAwX3JlZ19zYWZlX2JtOwogCQlyZGV2LT5jb25maWcucjEwMC5yZWdfc2FmZV9ibV9zaXplID0gQVJSQVlfU0laRShyMTAwX3JlZ19zYWZlX2JtKTsKIAl9IGVsc2UgewotCQlyZXR1cm4gcjIwMF9pbml0KHJkZXYpOworCQlyMjAwX3NldF9zYWZlX3JlZ2lzdGVycyhyZGV2KTsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMzQyLDkgKzIxNDksMTEgQEAKIAkJbW9kZTEgPSAmcmRldi0+bW9kZV9pbmZvLmNydGNzWzBdLT5iYXNlLm1vZGU7CiAJCXBpeGVsX2J5dGVzMSA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1swXS0+YmFzZS5mYi0+Yml0c19wZXJfcGl4ZWwgLyA4OwogCX0KLQlpZiAocmRldi0+bW9kZV9pbmZvLmNydGNzWzFdLT5iYXNlLmVuYWJsZWQpIHsKLQkJbW9kZTIgPSAmcmRldi0+bW9kZV9pbmZvLmNydGNzWzFdLT5iYXNlLm1vZGU7Ci0JCXBpeGVsX2J5dGVzMiA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1sxXS0+YmFzZS5mYi0+Yml0c19wZXJfcGl4ZWwgLyA4OworCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX1NJTkdMRV9DUlRDKSkgeworCQlpZiAocmRldi0+bW9kZV9pbmZvLmNydGNzWzFdLT5iYXNlLmVuYWJsZWQpIHsKKwkJCW1vZGUyID0gJnJkZXYtPm1vZGVfaW5mby5jcnRjc1sxXS0+YmFzZS5tb2RlOworCQkJcGl4ZWxfYnl0ZXMyID0gcmRldi0+bW9kZV9pbmZvLmNydGNzWzFdLT5iYXNlLmZiLT5iaXRzX3Blcl9waXhlbCAvIDg7CisJCX0KIAl9CiAKIAltaW5fbWVtX2VmZi5mdWxsID0gcmZpeGVkX2NvbnN0XzgoMCk7CkBAIC0zMTU3LDcgKzI5NjYsNyBAQAogCVdSRUczMihSXzAwMDc0MF9DUF9DU1FfQ05UTCwgMCk7CiAKIAkvKiBTYXZlIGZldyBDUlRDIHJlZ2lzdGVycyAqLwotCXNhdmUtPkdFTk1PX1dUID0gUlJFRzMyKFJfMDAwM0MwX0dFTk1PX1dUKTsKKwlzYXZlLT5HRU5NT19XVCA9IFJSRUc4KFJfMDAwM0MyX0dFTk1PX1dUKTsKIAlzYXZlLT5DUlRDX0VYVF9DTlRMID0gUlJFRzMyKFJfMDAwMDU0X0NSVENfRVhUX0NOVEwpOwogCXNhdmUtPkNSVENfR0VOX0NOVEwgPSBSUkVHMzIoUl8wMDAwNTBfQ1JUQ19HRU5fQ05UTCk7CiAJc2F2ZS0+Q1VSX09GRlNFVCA9IFJSRUczMihSXzAwMDI2MF9DVVJfT0ZGU0VUKTsKQEAgLTMxNjcsNyArMjk3Niw3IEBACiAJfQogCiAJLyogRGlzYWJsZSBWR0EgYXBlcnR1cmUgYWNjZXNzICovCi0JV1JFRzMyKFJfMDAwM0MwX0dFTk1PX1dULCBDXzAwMDNDMF9WR0FfUkFNX0VOICYgc2F2ZS0+R0VOTU9fV1QpOworCVdSRUc4KFJfMDAwM0MyX0dFTk1PX1dULCBDXzAwMDNDMl9WR0FfUkFNX0VOICYgc2F2ZS0+R0VOTU9fV1QpOwogCS8qIERpc2FibGUgY3Vyc29yLCBvdmVybGF5LCBjcnRjICovCiAJV1JFRzMyKFJfMDAwMjYwX0NVUl9PRkZTRVQsIHNhdmUtPkNVUl9PRkZTRVQgfCBTXzAwMDI2MF9DVVJfTE9DSygxKSk7CiAJV1JFRzMyKFJfMDAwMDU0X0NSVENfRVhUX0NOVEwsIHNhdmUtPkNSVENfRVhUX0NOVEwgfApAQCAtMzE5OSwxMCArMzAwOCwyNjQgQEAKIAkJCQlyZGV2LT5tYy52cmFtX2xvY2F0aW9uKTsKIAl9CiAJLyogUmVzdG9yZSBDUlRDIHJlZ2lzdGVycyAqLwotCVdSRUczMihSXzAwMDNDMF9HRU5NT19XVCwgc2F2ZS0+R0VOTU9fV1QpOworCVdSRUc4KFJfMDAwM0MyX0dFTk1PX1dULCBzYXZlLT5HRU5NT19XVCk7CiAJV1JFRzMyKFJfMDAwMDU0X0NSVENfRVhUX0NOVEwsIHNhdmUtPkNSVENfRVhUX0NOVEwpOwogCVdSRUczMihSXzAwMDA1MF9DUlRDX0dFTl9DTlRMLCBzYXZlLT5DUlRDX0dFTl9DTlRMKTsKIAlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykpIHsKIAkJV1JFRzMyKFJfMDAwM0Y4X0NSVEMyX0dFTl9DTlRMLCBzYXZlLT5DUlRDMl9HRU5fQ05UTCk7CiAJfQogfQorCit2b2lkIHIxMDBfdmdhX3JlbmRlcl9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiB0bXA7CisKKwl0bXAgPSBSUkVHOChSXzAwMDNDMl9HRU5NT19XVCk7CisJV1JFRzgoUl8wMDAzQzJfR0VOTU9fV1QsIENfMDAwM0MyX1ZHQV9SQU1fRU4gJiB0bXApOworfQorCitzdGF0aWMgdm9pZCByMTAwX2RlYnVnZnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHI7CisKKwlyID0gcjEwMF9kZWJ1Z2ZzX21jX2luZm9faW5pdChyZGV2KTsKKwlpZiAocikKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSByMTAwX21jIGRlYnVnZnMgZmlsZS5cbiIpOworfQorCitzdGF0aWMgdm9pZCByMTAwX21jX3Byb2dyYW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IHIxMDBfbWNfc2F2ZSBzYXZlOworCisJLyogU3RvcHMgYWxsIG1jIGNsaWVudHMgKi8KKwlyMTAwX21jX3N0b3AocmRldiwgJnNhdmUpOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKKwkJV1JFRzMyKFJfMDAwMTRDX01DX0FHUF9MT0NBVElPTiwKKwkJCVNfMDAwMTRDX01DX0FHUF9TVEFSVChyZGV2LT5tYy5ndHRfc3RhcnQgPj4gMTYpIHwKKwkJCVNfMDAwMTRDX01DX0FHUF9UT1AocmRldi0+bWMuZ3R0X2VuZCA+PiAxNikpOworCQlXUkVHMzIoUl8wMDAxNzBfQUdQX0JBU0UsIGxvd2VyXzMyX2JpdHMocmRldi0+bWMuYWdwX2Jhc2UpKTsKKwkJaWYgKHJkZXYtPmZhbWlseSA+IENISVBfUlYyMDApCisJCQlXUkVHMzIoUl8wMDAxNUNfQUdQX0JBU0VfMiwKKwkJCQl1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLmFncF9iYXNlKSAmIDB4ZmYpOworCX0gZWxzZSB7CisJCVdSRUczMihSXzAwMDE0Q19NQ19BR1BfTE9DQVRJT04sIDB4MEZGRkZGRkYpOworCQlXUkVHMzIoUl8wMDAxNzBfQUdQX0JBU0UsIDApOworCQlpZiAocmRldi0+ZmFtaWx5ID4gQ0hJUF9SVjIwMCkKKwkJCVdSRUczMihSXzAwMDE1Q19BR1BfQkFTRV8yLCAwKTsKKwl9CisJLyogV2FpdCBmb3IgbWMgaWRsZSAqLworCWlmIChyMTAwX21jX3dhaXRfZm9yX2lkbGUocmRldikpCisJCWRldl93YXJuKHJkZXYtPmRldiwgIldhaXQgZm9yIE1DIGlkbGUgdGltZW91dC5cbiIpOworCS8qIFByb2dyYW0gTUMsIHNob3VsZCBiZSBhIDMyYml0cyBsaW1pdGVkIGFkZHJlc3Mgc3BhY2UgKi8KKwlXUkVHMzIoUl8wMDAxNDhfTUNfRkJfTE9DQVRJT04sCisJCVNfMDAwMTQ4X01DX0ZCX1NUQVJUKHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTYpIHwKKwkJU18wMDAxNDhfTUNfRkJfVE9QKHJkZXYtPm1jLnZyYW1fZW5kID4+IDE2KSk7CisJcjEwMF9tY19yZXN1bWUocmRldiwgJnNhdmUpOworfQorCit2b2lkIHIxMDBfY2xvY2tfc3RhcnR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgdG1wOworCisJaWYgKHJhZGVvbl9keW5jbGtzICE9IC0xICYmIHJhZGVvbl9keW5jbGtzKQorCQlyYWRlb25fbGVnYWN5X3NldF9jbG9ja19nYXRpbmcocmRldiwgMSk7CisJLyogV2UgbmVlZCB0byBmb3JjZSBvbiBzb21lIG9mIHRoZSBibG9jayAqLworCXRtcCA9IFJSRUczMl9QTEwoUl8wMDAwMERfU0NMS19DTlRMKTsKKwl0bXAgfD0gU18wMDAwMERfRk9SQ0VfQ1AoMSkgfCBTXzAwMDAwRF9GT1JDRV9WSVAoMSk7CisJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjI1MCkgfHwgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWMjgwKSkKKwkJdG1wIHw9IFNfMDAwMDBEX0ZPUkNFX0RJU1AxKDEpIHwgU18wMDAwMERfRk9SQ0VfRElTUDIoMSk7CisJV1JFRzMyX1BMTChSXzAwMDAwRF9TQ0xLX0NOVEwsIHRtcCk7Cit9CisKK3N0YXRpYyBpbnQgcjEwMF9zdGFydHVwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCisJcjEwMF9tY19wcm9ncmFtKHJkZXYpOworCS8qIFJlc3VtZSBjbG9jayAqLworCXIxMDBfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdQVSBjb25maWd1cmF0aW9uICgjIHBpcGVzLCAuLi4pICovCisJcjEwMF9ncHVfaW5pdChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdBUlQgKGluaXRpYWxpemUgYWZ0ZXIgVFRNIHNvIHdlIGNhbiBhbGxvY2F0ZQorCSAqIG1lbW9yeSB0aHJvdWdoIFRUTSBidXQgZmluYWxpemUgYWZ0ZXIgVFRNKSAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0kpIHsKKwkJciA9IHIxMDBfcGNpX2dhcnRfZW5hYmxlKHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKwkvKiBFbmFibGUgSVJRICovCisJcmRldi0+aXJxLnN3X2ludCA9IHRydWU7CisJcjEwMF9pcnFfc2V0KHJkZXYpOworCS8qIDFNIHJpbmcgYnVmZmVyICovCisJciA9IHIxMDBfY3BfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJmYWlsbGVkIGluaXRpYWxpemluZyBDUCAoJWQpLlxuIiwgcik7CisJCXJldHVybiByOworCX0KKwlyID0gcjEwMF93Yl9pbml0KHJkZXYpOworCWlmIChyKQorCQlkZXZfZXJyKHJkZXYtPmRldiwgImZhaWxsZWQgaW5pdGlhbGl6aW5nIFdCICglZCkuXG4iLCByKTsKKwlyID0gcjEwMF9pYl9pbml0KHJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgSUIgKCVkKS5cbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByMTAwX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwkvKiBNYWtlIHN1ciBHQVJUIGFyZSBub3Qgd29ya2luZyAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0kpCisJCXIxMDBfcGNpX2dhcnRfZGlzYWJsZShyZGV2KTsKKwkvKiBSZXN1bWUgY2xvY2sgYmVmb3JlIGRvaW5nIHJlc2V0ICovCisJcjEwMF9jbG9ja19zdGFydHVwKHJkZXYpOworCS8qIFJlc2V0IGdwdSBiZWZvcmUgcG9zdGluZyBvdGhlcndpc2UgQVRPTSB3aWxsIGVudGVyIGluZmluaXRlIGxvb3AgKi8KKwlpZiAocmFkZW9uX2dwdV9yZXNldChyZGV2KSkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsICJHUFUgcmVzZXQgZmFpbGVkICEgKDB4RTQwPTB4JTA4WCwgMHg3QzA9MHglMDhYKVxuIiwKKwkJCVJSRUczMihSXzAwMEU0MF9SQkJNX1NUQVRVUyksCisJCQlSUkVHMzIoUl8wMDA3QzBfQ1BfU1RBVCkpOworCX0KKwkvKiBwb3N0ICovCisJcmFkZW9uX2NvbWJpb3NfYXNpY19pbml0KHJkZXYtPmRkZXYpOworCS8qIFJlc3VtZSBjbG9jayBhZnRlciBwb3N0aW5nICovCisJcjEwMF9jbG9ja19zdGFydHVwKHJkZXYpOworCXJldHVybiByMTAwX3N0YXJ0dXAocmRldik7Cit9CisKK2ludCByMTAwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcjEwMF9jcF9kaXNhYmxlKHJkZXYpOworCXIxMDBfd2JfZGlzYWJsZShyZGV2KTsKKwlyMTAwX2lycV9kaXNhYmxlKHJkZXYpOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0kpCisJCXIxMDBfcGNpX2dhcnRfZGlzYWJsZShyZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByMTAwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcjEwMF9zdXNwZW5kKHJkZXYpOworCXIxMDBfY3BfZmluaShyZGV2KTsKKwlyMTAwX3diX2ZpbmkocmRldik7CisJcjEwMF9pYl9maW5pKHJkZXYpOworCXJhZGVvbl9nZW1fZmluaShyZGV2KTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJKQorCQlyMTAwX3BjaV9nYXJ0X2ZpbmkocmRldik7CisJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKKwlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7CisJcmFkZW9uX29iamVjdF9maW5pKHJkZXYpOworCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOworCWtmcmVlKHJkZXYtPmJpb3MpOworCXJkZXYtPmJpb3MgPSBOVUxMOworfQorCitpbnQgcjEwMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCXUzMiB0bXA7CisKKwkvKiBTZXR1cCBHUFUgbWVtb3J5IHNwYWNlICovCisJcmRldi0+bWMudnJhbV9sb2NhdGlvbiA9IDB4RkZGRkZGRkZVTDsKKwlyZGV2LT5tYy5ndHRfbG9jYXRpb24gPSAweEZGRkZGRkZGVUw7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgeworCQl0bXAgPSBHXzAwMDE1Q19NQ19GQl9TVEFSVChSUkVHMzIoUl8wMDAxNUNfTkJfVE9NKSk7CisJCXJkZXYtPm1jLnZyYW1fbG9jYXRpb24gPSB0bXAgPDwgMTY7CisJfQorCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKKwkJciA9IHJhZGVvbl9hZ3BfaW5pdChyZGV2KTsKKwkJaWYgKHIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIltkcm1dIERpc2FibGluZyBBR1BcbiIpOworCQkJcmRldi0+ZmxhZ3MgJj0gflJBREVPTl9JU19BR1A7CisJCQlyZGV2LT5tYy5ndHRfc2l6ZSA9IHJhZGVvbl9nYXJ0X3NpemUgKiAxMDI0ICogMTAyNDsKKwkJfSBlbHNlIHsKKwkJCXJkZXYtPm1jLmd0dF9sb2NhdGlvbiA9IHJkZXYtPm1jLmFncF9iYXNlOworCQl9CisJfQorCXIgPSByYWRlb25fbWNfc2V0dXAocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXJldHVybiAwOworfQorCitpbnQgcjEwMF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCisJLyogUmVnaXN0ZXIgZGVidWdmcyBmaWxlIHNwZWNpZmljIHRvIHRoaXMgZ3JvdXAgb2YgYXNpY3MgKi8KKwlyMTAwX2RlYnVnZnMocmRldik7CisJLyogRGlzYWJsZSBWR0EgKi8KKwlyMTAwX3ZnYV9yZW5kZXJfZGlzYWJsZShyZGV2KTsKKwkvKiBJbml0aWFsaXplIHNjcmF0Y2ggcmVnaXN0ZXJzICovCisJcmFkZW9uX3NjcmF0Y2hfaW5pdChyZGV2KTsKKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKKwkvKiBUT0RPOiBkaXNhYmxlIFZHQSBuZWVkIHRvIHVzZSBWR0EgcmVxdWVzdCAqLworCS8qIEJJT1MqLworCWlmICghcmFkZW9uX2dldF9iaW9zKHJkZXYpKSB7CisJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJFeHBlY3RpbmcgY29tYmlvcyBmb3IgUlM0MDAvUlM0ODAgR1BVXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJciA9IHJhZGVvbl9jb21iaW9zX2luaXQocmRldik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCS8qIFJlc2V0IGdwdSBiZWZvcmUgcG9zdGluZyBvdGhlcndpc2UgQVRPTSB3aWxsIGVudGVyIGluZmluaXRlIGxvb3AgKi8KKwlpZiAocmFkZW9uX2dwdV9yZXNldChyZGV2KSkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsCisJCQkiR1BVIHJlc2V0IGZhaWxlZCAhICgweEU0MD0weCUwOFgsIDB4N0MwPTB4JTA4WClcbiIsCisJCQlSUkVHMzIoUl8wMDBFNDBfUkJCTV9TVEFUVVMpLAorCQkJUlJFRzMyKFJfMDAwN0MwX0NQX1NUQVQpKTsKKwl9CisJLyogY2hlY2sgaWYgY2FyZHMgYXJlIHBvc3RlZCBvciBub3QgKi8KKwlpZiAoIXJhZGVvbl9jYXJkX3Bvc3RlZChyZGV2KSAmJiByZGV2LT5iaW9zKSB7CisJCURSTV9JTkZPKCJHUFUgbm90IHBvc3RlZC4gcG9zdGluZyBub3cuLi5cbiIpOworCQlyYWRlb25fY29tYmlvc19hc2ljX2luaXQocmRldi0+ZGRldik7CisJfQorCS8qIFNldCBhc2ljIGVycmF0YSAqLworCXIxMDBfZXJyYXRhKHJkZXYpOworCS8qIEluaXRpYWxpemUgY2xvY2tzICovCisJcmFkZW9uX2dldF9jbG9ja19pbmZvKHJkZXYtPmRkZXYpOworCS8qIEdldCB2cmFtIGluZm9ybWF0aW9ucyAqLworCXIxMDBfdnJhbV9pbmZvKHJkZXYpOworCS8qIEluaXRpYWxpemUgbWVtb3J5IGNvbnRyb2xsZXIgKGFsc28gdGVzdCBBR1ApICovCisJciA9IHIxMDBfbWNfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJLyogRmVuY2UgZHJpdmVyICovCisJciA9IHJhZGVvbl9mZW5jZV9kcml2ZXJfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJciA9IHJhZGVvbl9pcnFfa21zX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCS8qIE1lbW9yeSBtYW5hZ2VyICovCisJciA9IHJhZGVvbl9vYmplY3RfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkgeworCQlyID0gcjEwMF9wY2lfZ2FydF9pbml0KHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKwlyMTAwX3NldF9zYWZlX3JlZ2lzdGVycyhyZGV2KTsKKwlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKKwlyID0gcjEwMF9zdGFydHVwKHJkZXYpOworCWlmIChyKSB7CisJCS8qIFNvbWV0aGluZ3Mgd2FudCB3cm9udCB3aXRoIHRoZSBhY2NlbCBpbml0IHN0b3AgYWNjZWwgKi8KKwkJZGV2X2VycihyZGV2LT5kZXYsICJEaXNhYmxpbmcgR1BVIGFjY2VsZXJhdGlvblxuIik7CisJCXIxMDBfc3VzcGVuZChyZGV2KTsKKwkJcjEwMF9jcF9maW5pKHJkZXYpOworCQlyMTAwX3diX2ZpbmkocmRldik7CisJCXIxMDBfaWJfZmluaShyZGV2KTsKKwkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkKKwkJCXIxMDBfcGNpX2dhcnRfZmluaShyZGV2KTsKKwkJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKKwkJcmRldi0+YWNjZWxfd29ya2luZyA9IGZhbHNlOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwX3RyYWNrLmgKaW5kZXggNzBhODJlZC4uMGRhZjBkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwX3RyYWNrLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwX3RyYWNrLmgKQEAgLTg0LDYgKzg0LDggQEAKIAkJICAgICAgIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCiAJCSAgICAgICB1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIHJlZyk7CiAKKworCiBzdGF0aWMgaW5saW5lIGludCByMTAwX3JlbG9jX3BpdGNoX29mZnNldChzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKIAkJCQkJICBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAogCQkJCQkgIHVuc2lnbmVkIGlkeCwKQEAgLTkzLDkgKzk1LDcgQEAKIAl1MzIgdGlsZV9mbGFncyA9IDA7CiAJdTMyIHRtcDsKIAlzdHJ1Y3QgcmFkZW9uX2NzX3JlbG9jICpyZWxvYzsKLQlzdHJ1Y3QgcmFkZW9uX2NzX2NodW5rICppYl9jaHVuazsKLQotCWliX2NodW5rID0gJnAtPmNodW5rc1twLT5jaHVua19pYl9pZHhdOworCXUzMiB2YWx1ZTsKIAogCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CiAJaWYgKHIpIHsKQEAgLTEwNCw3ICsxMDQsOCBAQAogCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7CiAJCXJldHVybiByOwogCX0KLQl0bXAgPSBpYl9jaHVuay0+a2RhdGFbaWR4XSAmIDB4MDAzZmZmZmY7CisJdmFsdWUgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CisJdG1wID0gdmFsdWUgJiAweDAwM2ZmZmZmOwogCXRtcCArPSAoKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCkgPj4gMTApOwogCiAJaWYgKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pCkBAIC0xMTksNiArMTIwLDY0IEBACiAJfQogCiAJdG1wIHw9IHRpbGVfZmxhZ3M7Ci0JcC0+aWItPnB0cltpZHhdID0gKGliX2NodW5rLT5rZGF0YVtpZHhdICYgMHgzZmMwMDAwMCkgfCB0bXA7CisJcC0+aWItPnB0cltpZHhdID0gKHZhbHVlICYgMHgzZmMwMDAwMCkgfCB0bXA7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbmxpbmUgaW50IHIxMDBfcGFja2V0M19sb2FkX3ZicG50cihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKKwkJCQkJICAgc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKKwkJCQkJICAgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBjLCBpOworCXN0cnVjdCByYWRlb25fY3NfcmVsb2MgKnJlbG9jOworCXN0cnVjdCByMTAwX2NzX3RyYWNrICp0cmFjazsKKwlpbnQgciA9IDA7CisJdm9sYXRpbGUgdWludDMyX3QgKmliOworCXUzMiBpZHhfdmFsdWU7CisKKwlpYiA9IHAtPmliLT5wdHI7CisJdHJhY2sgPSAoc3RydWN0IHIxMDBfY3NfdHJhY2sgKilwLT50cmFjazsKKwljID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgrKykgJiAweDFGOworCXRyYWNrLT5udW1fYXJyYXlzID0gYzsKKwlmb3IgKGkgPSAwOyBpIDwgKGMgLSAxKTsgaSs9MiwgaWR4Kz0zKSB7CisJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBwYWNrZXQzICVkXG4iLAorCQkJCSAgcGt0LT5vcGNvZGUpOworCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJaWR4X3ZhbHVlID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOworCQlpYltpZHgrMV0gPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDEpICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisKKwkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpZHhfdmFsdWUgPj4gODsKKwkJdHJhY2stPmFycmF5c1tpICsgMF0ucm9iaiA9IHJlbG9jLT5yb2JqOworCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5lc2l6ZSAmPSAweDdGOworCQlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOworCQlpZiAocikgeworCQkJRFJNX0VSUk9SKCJObyByZWxvYyBmb3IgcGFja2V0MyAlZFxuIiwKKwkJCQkgIHBrdC0+b3Bjb2RlKTsKKwkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkJCXJldHVybiByOworCQl9CisJCWliW2lkeCsyXSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMikgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJdHJhY2stPmFycmF5c1tpICsgMV0ucm9iaiA9IHJlbG9jLT5yb2JqOworCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5lc2l6ZSA9IGlkeF92YWx1ZSA+PiAyNDsKKwkJdHJhY2stPmFycmF5c1tpICsgMV0uZXNpemUgJj0gMHg3RjsKKwl9CisJaWYgKGMgJiAxKSB7CisJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBwYWNrZXQzICVkXG4iLAorCQkJCQkgIHBrdC0+b3Bjb2RlKTsKKwkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkJCXJldHVybiByOworCQl9CisJCWlkeF92YWx1ZSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKKwkJaWJbaWR4KzFdID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOworCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5yb2JqID0gcmVsb2MtPnJvYmo7CisJCXRyYWNrLT5hcnJheXNbaSArIDBdLmVzaXplID0gaWR4X3ZhbHVlID4+IDg7CisJCXRyYWNrLT5hcnJheXNbaSArIDBdLmVzaXplICY9IDB4N0Y7CisJfQorCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwZC5oCmluZGV4IGM0YjI1N2UuLmRmMjlhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBkLmgKQEAgLTM4MSw2ICszODEsMjQgQEAKICNkZWZpbmUgICBTXzAwMDA1NF9WQ1JUQ19JRFhfTUFTVEVSKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4N0YpIDw8IDI0KQogI2RlZmluZSAgIEdfMDAwMDU0X1ZDUlRDX0lEWF9NQVNURVIoeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDI0KSAmIDB4N0YpCiAjZGVmaW5lICAgQ18wMDAwNTRfVkNSVENfSURYX01BU1RFUiAgICAgICAgICAgICAgICAgICAgMHg4MEZGRkZGRgorI2RlZmluZSBSXzAwMDE0OF9NQ19GQl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDE0OAorI2RlZmluZSAgIFNfMDAwMTQ4X01DX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMTQ4X01DX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMTQ4X01DX0ZCX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgICBTXzAwMDE0OF9NQ19GQl9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMTYpCisjZGVmaW5lICAgR18wMDAxNDhfTUNfRkJfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMTQ4X01DX0ZCX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgUl8wMDAxNENfTUNfQUdQX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgMHgwMDAxNEMKKyNkZWZpbmUgICBTXzAwMDE0Q19NQ19BR1BfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDE0Q19NQ19BR1BfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDE0Q19NQ19BR1BfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisjZGVmaW5lICAgU18wMDAxNENfTUNfQUdQX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDE2KQorI2RlZmluZSAgIEdfMDAwMTRDX01DX0FHUF9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDE0Q19NQ19BR1BfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIFJfMDAwMTcwX0FHUF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTcwCisjZGVmaW5lICAgU18wMDAxNzBfQUdQX0JBU0VfQUREUih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkZGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMTcwX0FHUF9CQVNFX0FERFIoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGRkZGRikKKyNkZWZpbmUgICBDXzAwMDE3MF9BR1BfQkFTRV9BRERSICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCiAjZGVmaW5lIFJfMDAwMjNDX0RJU1BMQVlfQkFTRV9BRERSICAgICAgICAgICAgICAgICAgIDB4MDAwMjNDCiAjZGVmaW5lICAgU18wMDAyM0NfRElTUExBWV9CQVNFX0FERFIoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkZGRkZGKSA8PCAwKQogI2RlZmluZSAgIEdfMDAwMjNDX0RJU1BMQVlfQkFTRV9BRERSKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGRkZGRikKQEAgLTQwMywyNSArNDIxLDI1IEBACiAjZGVmaW5lICAgU18wMDAzNjBfQ1VSMl9MT0NLKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQogI2RlZmluZSAgIEdfMDAwMzYwX0NVUjJfTE9DSyh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKICNkZWZpbmUgICBDXzAwMDM2MF9DVVIyX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCi0jZGVmaW5lIFJfMDAwM0MwX0dFTk1PX1dUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwM0MwCi0jZGVmaW5lICAgU18wMDAzQzBfR0VOTU9fTU9OT19BRERSRVNTX0IoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCi0jZGVmaW5lICAgR18wMDAzQzBfR0VOTU9fTU9OT19BRERSRVNTX0IoeCkgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCi0jZGVmaW5lICAgQ18wMDAzQzBfR0VOTU9fTU9OT19BRERSRVNTX0IgICAgICAgICAgICAgICAgMHhGRkZGRkZGRQotI2RlZmluZSAgIFNfMDAwM0MwX1ZHQV9SQU1fRU4oeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxKQotI2RlZmluZSAgIEdfMDAwM0MwX1ZHQV9SQU1fRU4oeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEpICYgMHgxKQotI2RlZmluZSAgIENfMDAwM0MwX1ZHQV9SQU1fRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkQKLSNkZWZpbmUgICBTXzAwMDNDMF9WR0FfQ0tTRUwoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMikKLSNkZWZpbmUgICBHXzAwMDNDMF9WR0FfQ0tTRUwoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyKSAmIDB4MykKLSNkZWZpbmUgICBDXzAwMDNDMF9WR0FfQ0tTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkYzCi0jZGVmaW5lICAgU18wMDAzQzBfT0REX0VWRU5fTURfUEdTRUwoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDUpCi0jZGVmaW5lICAgR18wMDAzQzBfT0REX0VWRU5fTURfUEdTRUwoeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gNSkgJiAweDEpCi0jZGVmaW5lICAgQ18wMDAzQzBfT0REX0VWRU5fTURfUEdTRUwgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZERgotI2RlZmluZSAgIFNfMDAwM0MwX1ZHQV9IU1lOQ19QT0woeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA2KQotI2RlZmluZSAgIEdfMDAwM0MwX1ZHQV9IU1lOQ19QT0woeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDYpICYgMHgxKQotI2RlZmluZSAgIENfMDAwM0MwX1ZHQV9IU1lOQ19QT0wgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGQkYKLSNkZWZpbmUgICBTXzAwMDNDMF9WR0FfVlNZTkNfUE9MKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgNykKLSNkZWZpbmUgICBHXzAwMDNDMF9WR0FfVlNZTkNfUE9MKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA3KSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDNDMF9WR0FfVlNZTkNfUE9MICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRjdGCisjZGVmaW5lIFJfMDAwM0MyX0dFTk1PX1dUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwM0MwCisjZGVmaW5lICAgU18wMDAzQzJfR0VOTU9fTU9OT19BRERSRVNTX0IoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDAzQzJfR0VOTU9fTU9OT19BRERSRVNTX0IoeCkgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzQzJfR0VOTU9fTU9OT19BRERSRVNTX0IgICAgICAgICAgICAgICAgMHhGRQorI2RlZmluZSAgIFNfMDAwM0MyX1ZHQV9SQU1fRU4oeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxKQorI2RlZmluZSAgIEdfMDAwM0MyX1ZHQV9SQU1fRU4oeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwM0MyX1ZHQV9SQU1fRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkQKKyNkZWZpbmUgICBTXzAwMDNDMl9WR0FfQ0tTRUwoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMikKKyNkZWZpbmUgICBHXzAwMDNDMl9WR0FfQ0tTRUwoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyKSAmIDB4MykKKyNkZWZpbmUgICBDXzAwMDNDMl9WR0FfQ0tTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEYzCisjZGVmaW5lICAgU18wMDAzQzJfT0REX0VWRU5fTURfUEdTRUwoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDUpCisjZGVmaW5lICAgR18wMDAzQzJfT0REX0VWRU5fTURfUEdTRUwoeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gNSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzQzJfT0REX0VWRU5fTURfUEdTRUwgICAgICAgICAgICAgICAgICAgMHhERgorI2RlZmluZSAgIFNfMDAwM0MyX1ZHQV9IU1lOQ19QT0woeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA2KQorI2RlZmluZSAgIEdfMDAwM0MyX1ZHQV9IU1lOQ19QT0woeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwM0MyX1ZHQV9IU1lOQ19QT0wgICAgICAgICAgICAgICAgICAgICAgIDB4QkYKKyNkZWZpbmUgICBTXzAwMDNDMl9WR0FfVlNZTkNfUE9MKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgNykKKyNkZWZpbmUgICBHXzAwMDNDMl9WR0FfVlNZTkNfUE9MKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDNDMl9WR0FfVlNZTkNfUE9MICAgICAgICAgICAgICAgICAgICAgICAweDdGCiAjZGVmaW5lIFJfMDAwM0Y4X0NSVEMyX0dFTl9DTlRMICAgICAgICAgICAgICAgICAgICAgIDB4MDAwM0Y4CiAjZGVmaW5lICAgU18wMDAzRjhfQ1JUQzJfREJMX1NDQU5fRU4oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCiAjZGVmaW5lICAgR18wMDAzRjhfQ1JUQzJfREJMX1NDQU5fRU4oeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCkBAIC01NDUsNiArNTYzLDQ2IEBACiAjZGVmaW5lICAgU18wMDA3NzRfU0NSQVRDSF9BRERSKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDdGRkZGRkYpIDw8IDUpCiAjZGVmaW5lICAgR18wMDA3NzRfU0NSQVRDSF9BRERSKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gNSkgJiAweDdGRkZGRkYpCiAjZGVmaW5lICAgQ18wMDA3NzRfU0NSQVRDSF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRgorI2RlZmluZSBSXzAwMDdDMF9DUF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDdDMAorI2RlZmluZSAgIFNfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX01SVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMSkKKyNkZWZpbmUgICBHXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9NV1VfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZECisjZGVmaW5lICAgU18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIpCisjZGVmaW5lICAgR18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfUlNJVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGQgorI2RlZmluZSAgIFNfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzKQorI2RlZmluZSAgIEdfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX1JDSVVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjcKKyNkZWZpbmUgICBTXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOSkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSA+PiA5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGREZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZGQkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX1BSSU1BUllfQlVTWSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDExKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9QUklNQVJZX0JVU1koeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDExKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGN0ZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NJX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEzKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTSV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0lfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZERkZGCisjZGVmaW5lICAgU18wMDA3QzBfR1VJRE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQorI2RlZmluZSAgIEdfMDAwN0MwX0dVSURNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9HVUlETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweEVGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfVklERE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI5KQorI2RlZmluZSAgIEdfMDAwN0MwX1ZJRERNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9WSURETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NNRFNUUk1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DTURTVFJNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1BfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQorI2RlZmluZSAgIEdfMDAwN0MwX0NQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCiAjZGVmaW5lIFJfMDAwRTQwX1JCQk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTQwCiAjZGVmaW5lICAgU18wMDBFNDBfQ01ERklGT19BVkFJTCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDdGKSA8PCAwKQogI2RlZmluZSAgIEdfMDAwRTQwX0NNREZJRk9fQVZBSUwoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHg3RikKQEAgLTYwNCw0ICs2NjIsNTMgQEAKICNkZWZpbmUgICBHXzAwMEU0MF9HVUlfQUNUSVZFKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAzMSkgJiAweDEpCiAjZGVmaW5lICAgQ18wMDBFNDBfR1VJX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RkZGRkZGRgogCisKKyNkZWZpbmUgUl8wMDAwMERfU0NMS19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMEQKKyNkZWZpbmUgICBTXzAwMDAwRF9TQ0xLX1NSQ19TRUwoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4NykgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDAwRF9TQ0xLX1NSQ19TRUwoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4NykKKyNkZWZpbmUgICBDXzAwMDAwRF9TQ0xLX1NSQ19TRUwgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkY4CisjZGVmaW5lICAgU18wMDAwMERfVENMS19TUkNfU0VMKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDcpIDw8IDgpCisjZGVmaW5lICAgR18wMDAwMERfVENMS19TUkNfU0VMKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gOCkgJiAweDcpCisjZGVmaW5lICAgQ18wMDAwMERfVENMS19TUkNfU0VMICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRjhGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX0NQKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9DUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX0hEUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNykKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9IRFAoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNykgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfSERQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZERkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX0RJU1AoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxOCkKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9ESVNQKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZCRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxOSkKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxOSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkY3RkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX0UyKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMCkKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9FMih4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkVGRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX1NFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMSkKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9TRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkRGRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX0lEQ1QoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMikKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9JRENUKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfSURDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkJGRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX1ZJUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMykKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9WSVAoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMykgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfVklQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjdGRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX1JFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNCkKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9SRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRUZGRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX1BCKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNSkKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9QQih4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfUEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGREZGRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX1RBTSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNikKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9UQU0oeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfVEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGQkZGRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX1RETSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNykKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9URE0oeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNykgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfVERNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGN0ZGRkZGRgorI2RlZmluZSAgIFNfMDAwMDBEX0ZPUkNFX1JCKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyOCkKKyNkZWZpbmUgICBHXzAwMDAwRF9GT1JDRV9SQih4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfRk9SQ0VfUkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFRkZGRkZGRgorCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IyMDAuYwppbmRleCA1NjhjNzRiLi5lYjc0MGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IyMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IyMDAuYwpAQCAtOTYsNyArOTYsNiBAQAogCQkgICAgICAgc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKIAkJICAgICAgIHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgcmVnKQogewotCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKmliX2NodW5rOwogCXN0cnVjdCByYWRlb25fY3NfcmVsb2MgKnJlbG9jOwogCXN0cnVjdCByMTAwX2NzX3RyYWNrICp0cmFjazsKIAl2b2xhdGlsZSB1aW50MzJfdCAqaWI7CkBAIC0xMDUsMTEgKzEwNCwxMSBAQAogCWludCBpOwogCWludCBmYWNlOwogCXUzMiB0aWxlX2ZsYWdzID0gMDsKKwl1MzIgaWR4X3ZhbHVlOwogCiAJaWIgPSBwLT5pYi0+cHRyOwotCWliX2NodW5rID0gJnAtPmNodW5rc1twLT5jaHVua19pYl9pZHhdOwogCXRyYWNrID0gKHN0cnVjdCByMTAwX2NzX3RyYWNrICopcC0+dHJhY2s7Ci0KKwlpZHhfdmFsdWUgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CiAJc3dpdGNoIChyZWcpIHsKIAljYXNlIFJBREVPTl9DUlRDX0dVSV9UUklHX1ZMSU5FOgogCQlyID0gcjEwMF9jc19wYWNrZXRfcGFyc2VfdmxpbmUocCk7CkBAIC0xMzcsOCArMTM2LDggQEAKIAkJCXJldHVybiByOwogCQl9CiAJCXRyYWNrLT56Yi5yb2JqID0gcmVsb2MtPnJvYmo7Ci0JCXRyYWNrLT56Yi5vZmZzZXQgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKLQkJaWJbaWR4XSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCXRyYWNrLT56Yi5vZmZzZXQgPSBpZHhfdmFsdWU7CisJCWliW2lkeF0gPSBpZHhfdmFsdWUgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUkIzRF9DT0xPUk9GRlNFVDoKIAkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKQEAgLTE0OSw4ICsxNDgsOCBAQAogCQkJcmV0dXJuIHI7CiAJCX0KIAkJdHJhY2stPmNiWzBdLnJvYmogPSByZWxvYy0+cm9iajsKLQkJdHJhY2stPmNiWzBdLm9mZnNldCA9IGliX2NodW5rLT5rZGF0YVtpZHhdOwotCQlpYltpZHhdID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJdHJhY2stPmNiWzBdLm9mZnNldCA9IGlkeF92YWx1ZTsKKwkJaWJbaWR4XSA9IGlkeF92YWx1ZSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwogCQlicmVhazsKIAljYXNlIFIyMDBfUFBfVFhPRkZTRVRfMDoKIAljYXNlIFIyMDBfUFBfVFhPRkZTRVRfMToKQEAgLTE2Niw3ICsxNjUsNyBAQAogCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwogCQkJcmV0dXJuIHI7CiAJCX0KLQkJaWJbaWR4XSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCWliW2lkeF0gPSBpZHhfdmFsdWUgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKIAkJdHJhY2stPnRleHR1cmVzW2ldLnJvYmogPSByZWxvYy0+cm9iajsKIAkJYnJlYWs7CiAJY2FzZSBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wOgpAQCAtMjA4LDEyICsyMDcsMTIgQEAKIAkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKIAkJCXJldHVybiByOwogCQl9Ci0JCXRyYWNrLT50ZXh0dXJlc1tpXS5jdWJlX2luZm9bZmFjZSAtIDFdLm9mZnNldCA9IGliX2NodW5rLT5rZGF0YVtpZHhdOwotCQlpYltpZHhdID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJdHJhY2stPnRleHR1cmVzW2ldLmN1YmVfaW5mb1tmYWNlIC0gMV0ub2Zmc2V0ID0gaWR4X3ZhbHVlOworCQlpYltpZHhdID0gaWR4X3ZhbHVlICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CiAJCXRyYWNrLT50ZXh0dXJlc1tpXS5jdWJlX2luZm9bZmFjZSAtIDFdLnJvYmogPSByZWxvYy0+cm9iajsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUkVfV0lEVEhfSEVJR0hUOgotCQl0cmFjay0+bWF4eSA9ICgoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMTYpICYgMHg3RkYpOworCQl0cmFjay0+bWF4eSA9ICgoaWR4X3ZhbHVlID4+IDE2KSAmIDB4N0ZGKTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUkIzRF9DT0xPUlBJVENIOgogCQlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOwpAQCAtMjI5LDE3ICsyMjgsMTcgQEAKIAkJaWYgKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUlDUk8pCiAJCQl0aWxlX2ZsYWdzIHw9IFJBREVPTl9DT0xPUl9NSUNST1RJTEVfRU5BQkxFOwogCi0JCXRtcCA9IGliX2NodW5rLT5rZGF0YVtpZHhdICYgfigweDcgPDwgMTYpOworCQl0bXAgPSBpZHhfdmFsdWUgJiB+KDB4NyA8PCAxNik7CiAJCXRtcCB8PSB0aWxlX2ZsYWdzOwogCQlpYltpZHhdID0gdG1wOwogCi0JCXRyYWNrLT5jYlswXS5waXRjaCA9IGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX0NPTE9SUElUQ0hfTUFTSzsKKwkJdHJhY2stPmNiWzBdLnBpdGNoID0gaWR4X3ZhbHVlICYgUkFERU9OX0NPTE9SUElUQ0hfTUFTSzsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUkIzRF9ERVBUSFBJVENIOgotCQl0cmFjay0+emIucGl0Y2ggPSBpYl9jaHVuay0+a2RhdGFbaWR4XSAmIFJBREVPTl9ERVBUSFBJVENIX01BU0s7CisJCXRyYWNrLT56Yi5waXRjaCA9IGlkeF92YWx1ZSAmIFJBREVPTl9ERVBUSFBJVENIX01BU0s7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1JCM0RfQ05UTDoKLQkJc3dpdGNoICgoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gUkFERU9OX1JCM0RfQ09MT1JfRk9STUFUX1NISUZUKSAmIDB4MWYpIHsKKwkJc3dpdGNoICgoaWR4X3ZhbHVlID4+IFJBREVPTl9SQjNEX0NPTE9SX0ZPUk1BVF9TSElGVCkgJiAweDFmKSB7CiAJCWNhc2UgNzoKIAkJY2FzZSA4OgogCQljYXNlIDk6CkBAIC0yNTcsMTggKzI1NiwxOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlEUk1fRVJST1IoIkludmFsaWQgY29sb3IgYnVmZmVyIGZvcm1hdCAoJWQpICFcbiIsCi0JCQkJICAoKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IFJBREVPTl9SQjNEX0NPTE9SX0ZPUk1BVF9TSElGVCkgJiAweDFmKSk7CisJCQkJICAoKGlkeF92YWx1ZSA+PiBSQURFT05fUkIzRF9DT0xPUl9GT1JNQVRfU0hJRlQpICYgMHgxZikpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaWYgKGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX0RFUFRIWFlfT0ZGU0VUX0VOQUJMRSkgeworCQlpZiAoaWR4X3ZhbHVlICYgUkFERU9OX0RFUFRIWFlfT0ZGU0VUX0VOQUJMRSkgewogCQkJRFJNX0VSUk9SKCJObyBzdXBwb3J0IGZvciBkZXB0aCB4eSBvZmZzZXQgaW4ga21zXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJdHJhY2stPnpfZW5hYmxlZCA9ICEhKGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX1pfRU5BQkxFKTsKKwkJdHJhY2stPnpfZW5hYmxlZCA9ICEhKGlkeF92YWx1ZSAmIFJBREVPTl9aX0VOQUJMRSk7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1JCM0RfWlNURU5DSUxDTlRMOgotCQlzd2l0Y2ggKGliX2NodW5rLT5rZGF0YVtpZHhdICYgMHhmKSB7CisJCXN3aXRjaCAoaWR4X3ZhbHVlICYgMHhmKSB7CiAJCWNhc2UgMDoKIAkJCXRyYWNrLT56Yi5jcHAgPSAyOwogCQkJYnJlYWs7CkBAIC0yOTIsMjcgKzI5MSwyNyBAQAogCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwogCQkJcmV0dXJuIHI7CiAJCX0KLQkJaWJbaWR4XSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCWliW2lkeF0gPSBpZHhfdmFsdWUgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUFBfQ05UTDoKIAkJewotCQkJdWludDMyX3QgdGVtcCA9IGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDQ7CisJCQl1aW50MzJfdCB0ZW1wID0gaWR4X3ZhbHVlID4+IDQ7CiAJCQlmb3IgKGkgPSAwOyBpIDwgdHJhY2stPm51bV90ZXh0dXJlOyBpKyspCiAJCQkJdHJhY2stPnRleHR1cmVzW2ldLmVuYWJsZWQgPSAhISh0ZW1wICYgKDEgPDwgaSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1NFX1ZGX0NOVEw6Ci0JCXRyYWNrLT52YXBfdmZfY250bCA9IGliX2NodW5rLT5rZGF0YVtpZHhdOworCQl0cmFjay0+dmFwX3ZmX2NudGwgPSBpZHhfdmFsdWU7CiAJCWJyZWFrOwogCWNhc2UgMHgyMTBjOgogCQkvKiBWQVBfVkZfTUFYX1ZUWF9JTkRYICovCi0JCXRyYWNrLT5tYXhfaW5keCA9IGliX2NodW5rLT5rZGF0YVtpZHhdICYgMHgwMEZGRkZGRlVMOworCQl0cmFjay0+bWF4X2luZHggPSBpZHhfdmFsdWUgJiAweDAwRkZGRkZGVUw7CiAJCWJyZWFrOwogCWNhc2UgUjIwMF9TRV9WVFhfRk1UXzA6Ci0JCXRyYWNrLT52dHhfc2l6ZSA9IHIyMDBfZ2V0X3Z0eF9zaXplXzAoaWJfY2h1bmstPmtkYXRhW2lkeF0pOworCQl0cmFjay0+dnR4X3NpemUgPSByMjAwX2dldF92dHhfc2l6ZV8wKGlkeF92YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgUjIwMF9TRV9WVFhfRk1UXzE6Ci0JCXRyYWNrLT52dHhfc2l6ZSArPSByMjAwX2dldF92dHhfc2l6ZV8xKGliX2NodW5rLT5rZGF0YVtpZHhdKTsKKwkJdHJhY2stPnZ0eF9zaXplICs9IHIyMDBfZ2V0X3Z0eF9zaXplXzEoaWR4X3ZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBSMjAwX1BQX1RYU0laRV8wOgogCWNhc2UgUjIwMF9QUF9UWFNJWkVfMToKQEAgLTMyMSw4ICszMjAsOCBAQAogCWNhc2UgUjIwMF9QUF9UWFNJWkVfNDoKIAljYXNlIFIyMDBfUFBfVFhTSVpFXzU6CiAJCWkgPSAocmVnIC0gUjIwMF9QUF9UWFNJWkVfMCkgLyAzMjsKLQkJdHJhY2stPnRleHR1cmVzW2ldLndpZHRoID0gKGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX1RFWF9VU0laRV9NQVNLKSArIDE7Ci0JCXRyYWNrLT50ZXh0dXJlc1tpXS5oZWlnaHQgPSAoKGliX2NodW5rLT5rZGF0YVtpZHhdICYgUkFERU9OX1RFWF9WU0laRV9NQVNLKSA+PiBSQURFT05fVEVYX1ZTSVpFX1NISUZUKSArIDE7CisJCXRyYWNrLT50ZXh0dXJlc1tpXS53aWR0aCA9IChpZHhfdmFsdWUgJiBSQURFT05fVEVYX1VTSVpFX01BU0spICsgMTsKKwkJdHJhY2stPnRleHR1cmVzW2ldLmhlaWdodCA9ICgoaWR4X3ZhbHVlICYgUkFERU9OX1RFWF9WU0laRV9NQVNLKSA+PiBSQURFT05fVEVYX1ZTSVpFX1NISUZUKSArIDE7CiAJCWJyZWFrOwogCWNhc2UgUjIwMF9QUF9UWFBJVENIXzA6CiAJY2FzZSBSMjAwX1BQX1RYUElUQ0hfMToKQEAgLTMzMSw3ICszMzAsNyBAQAogCWNhc2UgUjIwMF9QUF9UWFBJVENIXzQ6CiAJY2FzZSBSMjAwX1BQX1RYUElUQ0hfNToKIAkJaSA9IChyZWcgLSBSMjAwX1BQX1RYUElUQ0hfMCkgLyAzMjsKLQkJdHJhY2stPnRleHR1cmVzW2ldLnBpdGNoID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gKyAzMjsKKwkJdHJhY2stPnRleHR1cmVzW2ldLnBpdGNoID0gaWR4X3ZhbHVlICsgMzI7CiAJCWJyZWFrOwogCWNhc2UgUjIwMF9QUF9UWEZJTFRFUl8wOgogCWNhc2UgUjIwMF9QUF9UWEZJTFRFUl8xOgpAQCAtMzQwLDEyICszMzksMTIgQEAKIAljYXNlIFIyMDBfUFBfVFhGSUxURVJfNDoKIAljYXNlIFIyMDBfUFBfVFhGSUxURVJfNToKIAkJaSA9IChyZWcgLSBSMjAwX1BQX1RYRklMVEVSXzApIC8gMzI7Ci0JCXRyYWNrLT50ZXh0dXJlc1tpXS5udW1fbGV2ZWxzID0gKChpYl9jaHVuay0+a2RhdGFbaWR4XSAmIFIyMDBfTUFYX01JUF9MRVZFTF9NQVNLKQorCQl0cmFjay0+dGV4dHVyZXNbaV0ubnVtX2xldmVscyA9ICgoaWR4X3ZhbHVlICYgUjIwMF9NQVhfTUlQX0xFVkVMX01BU0spCiAJCQkJCQkgPj4gUjIwMF9NQVhfTUlQX0xFVkVMX1NISUZUKTsKLQkJdG1wID0gKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDIzKSAmIDB4NzsKKwkJdG1wID0gKGlkeF92YWx1ZSA+PiAyMykgJiAweDc7CiAJCWlmICh0bXAgPT0gMiB8fCB0bXAgPT0gNikKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS5yb3VuZHVwX3cgPSBmYWxzZTsKLQkJdG1wID0gKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDI3KSAmIDB4NzsKKwkJdG1wID0gKGlkeF92YWx1ZSA+PiAyNykgJiAweDc7CiAJCWlmICh0bXAgPT0gMiB8fCB0bXAgPT0gNikKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS5yb3VuZHVwX2ggPSBmYWxzZTsKIAkJYnJlYWs7CkBAIC0zNjQsOCArMzYzLDggQEAKIAljYXNlIFIyMDBfUFBfVFhGT1JNQVRfWF80OgogCWNhc2UgUjIwMF9QUF9UWEZPUk1BVF9YXzU6CiAJCWkgPSAocmVnIC0gUjIwMF9QUF9UWEZPUk1BVF9YXzApIC8gMzI7Ci0JCXRyYWNrLT50ZXh0dXJlc1tpXS50eGRlcHRoID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gJiAweDc7Ci0JCXRtcCA9IChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiAxNikgJiAweDM7CisJCXRyYWNrLT50ZXh0dXJlc1tpXS50eGRlcHRoID0gaWR4X3ZhbHVlICYgMHg3OworCQl0bXAgPSAoaWR4X3ZhbHVlID4+IDE2KSAmIDB4MzsKIAkJLyogMkQsIDNELCBDVUJFICovCiAJCXN3aXRjaCAodG1wKSB7CiAJCWNhc2UgMDoKQEAgLTM4OSwxNCArMzg4LDE0IEBACiAJY2FzZSBSMjAwX1BQX1RYRk9STUFUXzQ6CiAJY2FzZSBSMjAwX1BQX1RYRk9STUFUXzU6CiAJCWkgPSAocmVnIC0gUjIwMF9QUF9UWEZPUk1BVF8wKSAvIDMyOwotCQlpZiAoaWJfY2h1bmstPmtkYXRhW2lkeF0gJiBSMjAwX1RYRk9STUFUX05PTl9QT1dFUjIpIHsKKwkJaWYgKGlkeF92YWx1ZSAmIFIyMDBfVFhGT1JNQVRfTk9OX1BPV0VSMikgewogCQkJdHJhY2stPnRleHR1cmVzW2ldLnVzZV9waXRjaCA9IDE7CiAJCX0gZWxzZSB7CiAJCQl0cmFjay0+dGV4dHVyZXNbaV0udXNlX3BpdGNoID0gMDsKLQkJCXRyYWNrLT50ZXh0dXJlc1tpXS53aWR0aCA9IDEgPDwgKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiBSQURFT05fVFhGT1JNQVRfV0lEVEhfU0hJRlQpICYgUkFERU9OX1RYRk9STUFUX1dJRFRIX01BU0spOwotCQkJdHJhY2stPnRleHR1cmVzW2ldLmhlaWdodCA9IDEgPDwgKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiBSQURFT05fVFhGT1JNQVRfSEVJR0hUX1NISUZUKSAmIFJBREVPTl9UWEZPUk1BVF9IRUlHSFRfTUFTSyk7CisJCQl0cmFjay0+dGV4dHVyZXNbaV0ud2lkdGggPSAxIDw8ICgoaWR4X3ZhbHVlID4+IFJBREVPTl9UWEZPUk1BVF9XSURUSF9TSElGVCkgJiBSQURFT05fVFhGT1JNQVRfV0lEVEhfTUFTSyk7CisJCQl0cmFjay0+dGV4dHVyZXNbaV0uaGVpZ2h0ID0gMSA8PCAoKGlkeF92YWx1ZSA+PiBSQURFT05fVFhGT1JNQVRfSEVJR0hUX1NISUZUKSAmIFJBREVPTl9UWEZPUk1BVF9IRUlHSFRfTUFTSyk7CiAJCX0KLQkJc3dpdGNoICgoaWJfY2h1bmstPmtkYXRhW2lkeF0gJiBSQURFT05fVFhGT1JNQVRfRk9STUFUX01BU0spKSB7CisJCXN3aXRjaCAoKGlkeF92YWx1ZSAmIFJBREVPTl9UWEZPUk1BVF9GT1JNQVRfTUFTSykpIHsKIAkJY2FzZSBSMjAwX1RYRk9STUFUX0k4OgogCQljYXNlIFIyMDBfVFhGT1JNQVRfUkdCMzMyOgogCQljYXNlIFIyMDBfVFhGT1JNQVRfWTg6CkBAIC00MjQsOCArNDIzLDggQEAKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS5jcHAgPSA0OwogCQkJYnJlYWs7CiAJCX0KLQkJdHJhY2stPnRleHR1cmVzW2ldLmN1YmVfaW5mb1s0XS53aWR0aCA9IDEgPDwgKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiAxNikgJiAweGYpOwotCQl0cmFjay0+dGV4dHVyZXNbaV0uY3ViZV9pbmZvWzRdLmhlaWdodCA9IDEgPDwgKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiAyMCkgJiAweGYpOworCQl0cmFjay0+dGV4dHVyZXNbaV0uY3ViZV9pbmZvWzRdLndpZHRoID0gMSA8PCAoKGlkeF92YWx1ZSA+PiAxNikgJiAweGYpOworCQl0cmFjay0+dGV4dHVyZXNbaV0uY3ViZV9pbmZvWzRdLmhlaWdodCA9IDEgPDwgKChpZHhfdmFsdWUgPj4gMjApICYgMHhmKTsKIAkJYnJlYWs7CiAJY2FzZSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzA6CiAJY2FzZSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzE6CkBAIC00MzMsNyArNDMyLDcgQEAKIAljYXNlIFIyMDBfUFBfQ1VCSUNfRkFDRVNfMzoKIAljYXNlIFIyMDBfUFBfQ1VCSUNfRkFDRVNfNDoKIAljYXNlIFIyMDBfUFBfQ1VCSUNfRkFDRVNfNToKLQkJdG1wID0gaWJfY2h1bmstPmtkYXRhW2lkeF07CisJCXRtcCA9IGlkeF92YWx1ZTsKIAkJaSA9IChyZWcgLSBSMjAwX1BQX0NVQklDX0ZBQ0VTXzApIC8gMzI7CiAJCWZvciAoZmFjZSA9IDA7IGZhY2UgPCA0OyBmYWNlKyspIHsKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS5jdWJlX2luZm9bZmFjZV0ud2lkdGggPSAxIDw8ICgodG1wID4+IChmYWNlICogOCkpICYgMHhmKTsKQEAgLTQ0OCw5ICs0NDcsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcjIwMF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQordm9pZCByMjAwX3NldF9zYWZlX3JlZ2lzdGVycyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlyZGV2LT5jb25maWcucjEwMC5yZWdfc2FmZV9ibSA9IHIyMDBfcmVnX3NhZmVfYm07CiAJcmRldi0+Y29uZmlnLnIxMDAucmVnX3NhZmVfYm1fc2l6ZSA9IEFSUkFZX1NJWkUocjIwMF9yZWdfc2FmZV9ibSk7Ci0JcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCmluZGV4IGJiMTUxZWMuLmUwOGM0YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jCkBAIC0zMyw0MyArMzMsMTYgQEAKICNpbmNsdWRlICJyYWRlb25fZHJtLmgiCiAjaW5jbHVkZSAicjEwMF90cmFjay5oIgogI2luY2x1ZGUgInIzMDBkLmgiCi0KKyNpbmNsdWRlICJydjM1MGQuaCIKICNpbmNsdWRlICJyMzAwX3JlZ19zYWZlLmgiCiAKLS8qIHIzMDAscjM1MCxydjM1MCxydjM3MCxydjM4MCBkZXBlbmRzIG9uIDogKi8KLXZvaWQgcjEwMF9oZHBfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHIxMDBfY3BfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHIxMDBfcmIyZF9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcjEwMF9jcF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCByaW5nX3NpemUpOwotaW50IHIxMDBfcGNpX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjEwMF9tY19zZXR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHIxMDBfbWNfZGlzYWJsZV9jbGllbnRzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMTAwX2d1aV93YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMTAwX2NzX3BhY2tldF9wYXJzZShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKLQkJCSBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAotCQkJIHVuc2lnbmVkIGlkeCk7Ci1pbnQgcjEwMF9jc19wYWNrZXRfcGFyc2VfdmxpbmUoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnApOwotaW50IHIxMDBfY3NfcGFyc2VfcGFja2V0MChzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKLQkJCSAgc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKLQkJCSAgY29uc3QgdW5zaWduZWQgKmF1dGgsIHVuc2lnbmVkIG4sCi0JCQkgIHJhZGVvbl9wYWNrZXQwX2NoZWNrX3QgY2hlY2spOwotaW50IHIxMDBfY3NfdHJhY2tfY2hlY2tfcGt0M19pbmR4X2J1ZmZlcihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKLQkJCQkJIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCi0JCQkJCSBzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iaik7Ci0KLS8qIFRoaXMgZmlsZXMgZ2F0aGVyIGZ1bmN0aW9ucyBzcGVjaWZpY3MgdG86Ci0gKiByMzAwLHIzNTAscnYzNTAscnYzNzAscnYzODAKLSAqCi0gKiBTb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBtaWdodCBiZSB1c2VkIGJ5IG5ld2VyIEFTSUNzLgotICovCi12b2lkIHIzMDBfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHIzMDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcnYzNzBfZGVidWdmc19wY2llX2dhcnRfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQorLyogVGhpcyBmaWxlcyBnYXRoZXIgZnVuY3Rpb25zIHNwZWNpZmljcyB0bzogcjMwMCxyMzUwLHJ2MzUwLHJ2MzcwLHJ2MzgwICovCiAKIC8qCiAgKiBydjM3MCxydjM4MCBQQ0lFIEdBUlQKICAqLworc3RhdGljIGludCBydjM3MF9kZWJ1Z2ZzX3BjaWVfZ2FydF9pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCiB2b2lkIHJ2MzcwX3BjaWVfZ2FydF90bGJfZmx1c2goc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdWludDMyX3QgdG1wOwpAQCAtMTgyLDU5ICsxNTUsNiBAQAogCXJhZGVvbl9nYXJ0X2ZpbmkocmRldik7CiB9CiAKLS8qCi0gKiBNQwotICovCi1pbnQgcjMwMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCWludCByOwotCi0JaWYgKHIxMDBfZGVidWdmc19yYmJtX2luaXQocmRldikpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBmaWxlIGZvciBSQkJNICFcbiIpOwotCX0KLQotCXIzMDBfZ3B1X2luaXQocmRldik7Ci0JcjEwMF9wY2lfZ2FydF9kaXNhYmxlKHJkZXYpOwotCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKSB7Ci0JCXJ2MzcwX3BjaWVfZ2FydF9kaXNhYmxlKHJkZXYpOwotCX0KLQotCS8qIFNldHVwIEdQVSBtZW1vcnkgc3BhY2UgKi8KLQlyZGV2LT5tYy52cmFtX2xvY2F0aW9uID0gMHhGRkZGRkZGRlVMOwotCXJkZXYtPm1jLmd0dF9sb2NhdGlvbiA9IDB4RkZGRkZGRkZVTDsKLQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7Ci0JCXIgPSByYWRlb25fYWdwX2luaXQocmRldik7Ci0JCWlmIChyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJbZHJtXSBEaXNhYmxpbmcgQUdQXG4iKTsKLQkJCXJkZXYtPmZsYWdzICY9IH5SQURFT05fSVNfQUdQOwotCQkJcmRldi0+bWMuZ3R0X3NpemUgPSByYWRlb25fZ2FydF9zaXplICogMTAyNCAqIDEwMjQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZGV2LT5tYy5ndHRfbG9jYXRpb24gPSByZGV2LT5tYy5hZ3BfYmFzZTsKLQkJfQotCX0KLQlyID0gcmFkZW9uX21jX3NldHVwKHJkZXYpOwotCWlmIChyKSB7Ci0JCXJldHVybiByOwotCX0KLQotCS8qIFByb2dyYW0gR1BVIG1lbW9yeSBzcGFjZSAqLwotCXIxMDBfbWNfZGlzYWJsZV9jbGllbnRzKHJkZXYpOwotCWlmIChyMzAwX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIHdhaXQgTUMgaWRsZSB3aGlsZSAiCi0JCSAgICAgICAicHJvZ3JhbW1pbmcgcGlwZXMuIEJhZCB0aGluZ3MgbWlnaHQgaGFwcGVuLlxuIik7Ci0JfQotCXIxMDBfbWNfc2V0dXAocmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcjMwMF9tY19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotfQotCi0KLS8qCi0gKiBGZW5jZSBlbWlzc2lvbgotICovCiB2b2lkIHIzMDBfZmVuY2VfcmluZ19lbWl0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkJICBzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSkKIHsKQEAgLTI2MCwxMCArMTgwLDYgQEAKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBSQURFT05fU1dfSU5UX0ZJUkUpOwogfQogCi0KLS8qCi0gKiBHbG9iYWwgR1BVIGZ1bmN0aW9ucwotICovCiBpbnQgcjMwMF9jb3B5X2RtYShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJICB1aW50NjRfdCBzcmNfb2Zmc2V0LAogCQkgIHVpbnQ2NF90IGRzdF9vZmZzZXQsCkBAIC01ODIsMTEgKzQ5OCw2IEBACiAJcjEwMF92cmFtX2luaXRfc2l6ZXMocmRldik7CiB9CiAKLQotLyoKLSAqIFBDSUUgTGFuZXMKLSAqLwotCiB2b2lkIHJ2MzcwX3NldF9wY2llX2xhbmVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgbGFuZXMpCiB7CiAJdWludDMyX3QgbGlua193aWR0aF9jbnRsLCBtYXNrOwpAQCAtNjQ2LDEwICs1NTcsNiBAQAogCiB9CiAKLQotLyoKLSAqIERlYnVnZnMgaW5mbwotICovCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCiBzdGF0aWMgaW50IHJ2MzcwX2RlYnVnZnNfcGNpZV9nYXJ0X2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogewpAQCAtNjgwLDcgKzU4Nyw3IEBACiB9OwogI2VuZGlmCiAKLWludCBydjM3MF9kZWJ1Z2ZzX3BjaWVfZ2FydF9pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgaW50IHJ2MzcwX2RlYnVnZnNfcGNpZV9nYXJ0X2luZm9faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKIAlyZXR1cm4gcmFkZW9uX2RlYnVnZnNfYWRkX2ZpbGVzKHJkZXYsIHJ2MzcwX3BjaWVfZ2FydF9pbmZvX2xpc3QsIDEpOwpAQCAtNjg5LDI1ICs1OTYsMjIgQEAKICNlbmRpZgogfQogCi0KLS8qCi0gKiBDUyBmdW5jdGlvbnMKLSAqLwogc3RhdGljIGludCByMzAwX3BhY2tldDBfY2hlY2soc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCiAJCXN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCiAJCXVuc2lnbmVkIGlkeCwgdW5zaWduZWQgcmVnKQogewotCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKmliX2NodW5rOwogCXN0cnVjdCByYWRlb25fY3NfcmVsb2MgKnJlbG9jOwogCXN0cnVjdCByMTAwX2NzX3RyYWNrICp0cmFjazsKIAl2b2xhdGlsZSB1aW50MzJfdCAqaWI7CiAJdWludDMyX3QgdG1wLCB0aWxlX2ZsYWdzID0gMDsKIAl1bnNpZ25lZCBpOwogCWludCByOworCXUzMiBpZHhfdmFsdWU7CiAKIAlpYiA9IHAtPmliLT5wdHI7Ci0JaWJfY2h1bmsgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07CiAJdHJhY2sgPSAoc3RydWN0IHIxMDBfY3NfdHJhY2sgKilwLT50cmFjazsKKwlpZHhfdmFsdWUgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CisKIAlzd2l0Y2gocmVnKSB7CiAJY2FzZSBBVklWT19EMU1PREVfVkxJTkVfU1RBUlRfRU5EOgogCWNhc2UgUkFERU9OX0NSVENfR1VJX1RSSUdfVkxJTkU6CkBAIC03MzgsOCArNjQyLDggQEAKIAkJCXJldHVybiByOwogCQl9CiAJCXRyYWNrLT5jYltpXS5yb2JqID0gcmVsb2MtPnJvYmo7Ci0JCXRyYWNrLT5jYltpXS5vZmZzZXQgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKLQkJaWJbaWR4XSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCXRyYWNrLT5jYltpXS5vZmZzZXQgPSBpZHhfdmFsdWU7CisJCWliW2lkeF0gPSBpZHhfdmFsdWUgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKIAkJYnJlYWs7CiAJY2FzZSBSMzAwX1pCX0RFUFRIT0ZGU0VUOgogCQlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOwpAQCAtNzUwLDggKzY1NCw4IEBACiAJCQlyZXR1cm4gcjsKIAkJfQogCQl0cmFjay0+emIucm9iaiA9IHJlbG9jLT5yb2JqOwotCQl0cmFjay0+emIub2Zmc2V0ID0gaWJfY2h1bmstPmtkYXRhW2lkeF07Ci0JCWliW2lkeF0gPSBpYl9jaHVuay0+a2RhdGFbaWR4XSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOworCQl0cmFjay0+emIub2Zmc2V0ID0gaWR4X3ZhbHVlOworCQlpYltpZHhdID0gaWR4X3ZhbHVlICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CiAJCWJyZWFrOwogCWNhc2UgUjMwMF9UWF9PRkZTRVRfMDoKIAljYXNlIFIzMDBfVFhfT0ZGU0VUXzArNDoKQEAgLTc3NywzMiArNjgxLDMyIEBACiAJCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7CiAJCQlyZXR1cm4gcjsKIAkJfQotCQlpYltpZHhdID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJaWJbaWR4XSA9IGlkeF92YWx1ZSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwogCQl0cmFjay0+dGV4dHVyZXNbaV0ucm9iaiA9IHJlbG9jLT5yb2JqOwogCQlicmVhazsKIAkvKiBUcmFja2VkIHJlZ2lzdGVycyAqLwogCWNhc2UgMHgyMDg0OgogCQkvKiBWQVBfVkZfQ05UTCAqLwotCQl0cmFjay0+dmFwX3ZmX2NudGwgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gaWR4X3ZhbHVlOwogCQlicmVhazsKIAljYXNlIDB4MjBCNDoKIAkJLyogVkFQX1ZUWF9TSVpFICovCi0JCXRyYWNrLT52dHhfc2l6ZSA9IGliX2NodW5rLT5rZGF0YVtpZHhdICYgMHg3RjsKKwkJdHJhY2stPnZ0eF9zaXplID0gaWR4X3ZhbHVlICYgMHg3RjsKIAkJYnJlYWs7CiAJY2FzZSAweDIxMzQ6CiAJCS8qIFZBUF9WRl9NQVhfVlRYX0lORFggKi8KLQkJdHJhY2stPm1heF9pbmR4ID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gJiAweDAwRkZGRkZGVUw7CisJCXRyYWNrLT5tYXhfaW5keCA9IGlkeF92YWx1ZSAmIDB4MDBGRkZGRkZVTDsKIAkJYnJlYWs7CiAJY2FzZSAweDQzRTQ6CiAJCS8qIFNDX1NDSVNTT1IxICovCi0JCXRyYWNrLT5tYXh5ID0gKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiAxMykgJiAweDFGRkYpICsgMTsKKwkJdHJhY2stPm1heHkgPSAoKGlkeF92YWx1ZSA+PiAxMykgJiAweDFGRkYpICsgMTsKIAkJaWYgKHAtPnJkZXYtPmZhbWlseSA8IENISVBfUlY1MTUpIHsKIAkJCXRyYWNrLT5tYXh5IC09IDE0NDA7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAweDRFMDA6CiAJCS8qIFJCM0RfQ0NUTCAqLwotCQl0cmFjay0+bnVtX2NiID0gKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiA1KSAmIDB4MykgKyAxOworCQl0cmFjay0+bnVtX2NiID0gKChpZHhfdmFsdWUgPj4gNSkgJiAweDMpICsgMTsKIAkJYnJlYWs7CiAJY2FzZSAweDRFMzg6CiAJY2FzZSAweDRFM0M6CkBAIC04MjUsMTMgKzcyOSwxMyBAQAogCQlpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKIAkJCXRpbGVfZmxhZ3MgfD0gUjMwMF9DT0xPUl9NSUNST1RJTEVfRU5BQkxFOwogCi0JCXRtcCA9IGliX2NodW5rLT5rZGF0YVtpZHhdICYgfigweDcgPDwgMTYpOworCQl0bXAgPSBpZHhfdmFsdWUgJiB+KDB4NyA8PCAxNik7CiAJCXRtcCB8PSB0aWxlX2ZsYWdzOwogCQlpYltpZHhdID0gdG1wOwogCiAJCWkgPSAocmVnIC0gMHg0RTM4KSA+PiAyOwotCQl0cmFjay0+Y2JbaV0ucGl0Y2ggPSBpYl9jaHVuay0+a2RhdGFbaWR4XSAmIDB4M0ZGRTsKLQkJc3dpdGNoICgoKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDIxKSAmIDB4RikpIHsKKwkJdHJhY2stPmNiW2ldLnBpdGNoID0gaWR4X3ZhbHVlICYgMHgzRkZFOworCQlzd2l0Y2ggKCgoaWR4X3ZhbHVlID4+IDIxKSAmIDB4RikpIHsKIAkJY2FzZSA5OgogCQljYXNlIDExOgogCQljYXNlIDEyOgpAQCAtODU0LDEzICs3NTgsMTMgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGNvbG9yIGJ1ZmZlciBmb3JtYXQgKCVkKSAhXG4iLAotCQkJCSAgKChpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiAyMSkgJiAweEYpKTsKKwkJCQkgICgoaWR4X3ZhbHVlID4+IDIxKSAmIDB4RikpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAweDRGMDA6CiAJCS8qIFpCX0NOVEwgKi8KLQkJaWYgKGliX2NodW5rLT5rZGF0YVtpZHhdICYgMikgeworCQlpZiAoaWR4X3ZhbHVlICYgMikgewogCQkJdHJhY2stPnpfZW5hYmxlZCA9IHRydWU7CiAJCX0gZWxzZSB7CiAJCQl0cmFjay0+el9lbmFibGVkID0gZmFsc2U7CkBAIC04NjgsNyArNzcyLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSAweDRGMTA6CiAJCS8qIFpCX0ZPUk1BVCAqLwotCQlzd2l0Y2ggKChpYl9jaHVuay0+a2RhdGFbaWR4XSAmIDB4RikpIHsKKwkJc3dpdGNoICgoaWR4X3ZhbHVlICYgMHhGKSkgewogCQljYXNlIDA6CiAJCWNhc2UgMToKIAkJCXRyYWNrLT56Yi5jcHAgPSAyOwpAQCAtODc4LDcgKzc4Miw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURSTV9FUlJPUigiSW52YWxpZCB6IGJ1ZmZlciBmb3JtYXQgKCVkKSAhXG4iLAotCQkJCSAgKGliX2NodW5rLT5rZGF0YVtpZHhdICYgMHhGKSk7CisJCQkJICAoaWR4X3ZhbHVlICYgMHhGKSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKQEAgLTg5NywxNyArODAxLDE3IEBACiAJCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01JQ1JPKQogCQkJdGlsZV9mbGFncyB8PSBSMzAwX0RFUFRITUlDUk9USUxFX1RJTEVEOzsKIAotCQl0bXAgPSBpYl9jaHVuay0+a2RhdGFbaWR4XSAmIH4oMHg3IDw8IDE2KTsKKwkJdG1wID0gaWR4X3ZhbHVlICYgfigweDcgPDwgMTYpOwogCQl0bXAgfD0gdGlsZV9mbGFnczsKIAkJaWJbaWR4XSA9IHRtcDsKIAotCQl0cmFjay0+emIucGl0Y2ggPSBpYl9jaHVuay0+a2RhdGFbaWR4XSAmIDB4M0ZGQzsKKwkJdHJhY2stPnpiLnBpdGNoID0gaWR4X3ZhbHVlICYgMHgzRkZDOwogCQlicmVhazsKIAljYXNlIDB4NDEwNDoKIAkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJCWJvb2wgZW5hYmxlZDsKIAotCQkJZW5hYmxlZCA9ICEhKGliX2NodW5rLT5rZGF0YVtpZHhdICYgKDEgPDwgaSkpOworCQkJZW5hYmxlZCA9ICEhKGlkeF92YWx1ZSAmICgxIDw8IGkpKTsKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS5lbmFibGVkID0gZW5hYmxlZDsKIAkJfQogCQlicmVhazsKQEAgLTkyOSw5ICs4MzMsOSBAQAogCWNhc2UgMHg0NEZDOgogCQkvKiBUWF9GT1JNQVQxX1swLTE1XSAqLwogCQlpID0gKHJlZyAtIDB4NDRDMCkgPj4gMjsKLQkJdG1wID0gKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDI1KSAmIDB4MzsKKwkJdG1wID0gKGlkeF92YWx1ZSA+PiAyNSkgJiAweDM7CiAJCXRyYWNrLT50ZXh0dXJlc1tpXS50ZXhfY29vcmRfdHlwZSA9IHRtcDsKLQkJc3dpdGNoICgoaWJfY2h1bmstPmtkYXRhW2lkeF0gJiAweDFGKSkgeworCQlzd2l0Y2ggKChpZHhfdmFsdWUgJiAweDFGKSkgewogCQljYXNlIFIzMDBfVFhfRk9STUFUX1g4OgogCQljYXNlIFIzMDBfVFhfRk9STUFUX1k0WDQ6CiAJCWNhc2UgUjMwMF9UWF9GT1JNQVRfWjNZM1gyOgpAQCAtOTcxLDcgKzg3NSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURSTV9FUlJPUigiSW52YWxpZCB0ZXh0dXJlIGZvcm1hdCAldVxuIiwKLQkJCQkgIChpYl9jaHVuay0+a2RhdGFbaWR4XSAmIDB4MUYpKTsKKwkJCQkgIChpZHhfdmFsdWUgJiAweDFGKSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CkBAIC05OTQsMTEgKzg5OCwxMSBAQAogCWNhc2UgMHg0NDNDOgogCQkvKiBUWF9GSUxURVIwX1swLTE1XSAqLwogCQlpID0gKHJlZyAtIDB4NDQwMCkgPj4gMjsKLQkJdG1wID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gJiAweDc7CisJCXRtcCA9IGlkeF92YWx1ZSAmIDB4NzsKIAkJaWYgKHRtcCA9PSAyIHx8IHRtcCA9PSA0IHx8IHRtcCA9PSA2KSB7CiAJCQl0cmFjay0+dGV4dHVyZXNbaV0ucm91bmR1cF93ID0gZmFsc2U7CiAJCX0KLQkJdG1wID0gKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDMpICYgMHg3OworCQl0bXAgPSAoaWR4X3ZhbHVlID4+IDMpICYgMHg3OwogCQlpZiAodG1wID09IDIgfHwgdG1wID09IDQgfHwgdG1wID09IDYpIHsKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS5yb3VuZHVwX2ggPSBmYWxzZTsKIAkJfQpAQCAtMTAyMSwxMiArOTI1LDEyIEBACiAJY2FzZSAweDQ1M0M6CiAJCS8qIFRYX0ZPUk1BVDJfWzAtMTVdICovCiAJCWkgPSAocmVnIC0gMHg0NTAwKSA+PiAyOwotCQl0bXAgPSBpYl9jaHVuay0+a2RhdGFbaWR4XSAmIDB4M0ZGRjsKKwkJdG1wID0gaWR4X3ZhbHVlICYgMHgzRkZGOwogCQl0cmFjay0+dGV4dHVyZXNbaV0ucGl0Y2ggPSB0bXAgKyAxOwogCQlpZiAocC0+cmRldi0+ZmFtaWx5ID49IENISVBfUlY1MTUpIHsKLQkJCXRtcCA9ICgoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMTUpICYgMSkgPDwgMTE7CisJCQl0bXAgPSAoKGlkeF92YWx1ZSA+PiAxNSkgJiAxKSA8PCAxMTsKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS53aWR0aF8xMSA9IHRtcDsKLQkJCXRtcCA9ICgoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMTYpICYgMSkgPDwgMTE7CisJCQl0bXAgPSAoKGlkeF92YWx1ZSA+PiAxNikgJiAxKSA8PCAxMTsKIAkJCXRyYWNrLT50ZXh0dXJlc1tpXS5oZWlnaHRfMTEgPSB0bXA7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMDQ4LDE1ICs5NTIsMTUgQEAKIAljYXNlIDB4NDRCQzoKIAkJLyogVFhfRk9STUFUMF9bMC0xNV0gKi8KIAkJaSA9IChyZWcgLSAweDQ0ODApID4+IDI7Ci0JCXRtcCA9IGliX2NodW5rLT5rZGF0YVtpZHhdICYgMHg3RkY7CisJCXRtcCA9IGlkeF92YWx1ZSAmIDB4N0ZGOwogCQl0cmFjay0+dGV4dHVyZXNbaV0ud2lkdGggPSB0bXAgKyAxOwotCQl0bXAgPSAoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMTEpICYgMHg3RkY7CisJCXRtcCA9IChpZHhfdmFsdWUgPj4gMTEpICYgMHg3RkY7CiAJCXRyYWNrLT50ZXh0dXJlc1tpXS5oZWlnaHQgPSB0bXAgKyAxOwotCQl0bXAgPSAoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMjYpICYgMHhGOworCQl0bXAgPSAoaWR4X3ZhbHVlID4+IDI2KSAmIDB4RjsKIAkJdHJhY2stPnRleHR1cmVzW2ldLm51bV9sZXZlbHMgPSB0bXA7Ci0JCXRtcCA9IGliX2NodW5rLT5rZGF0YVtpZHhdICYgKDEgPDwgMzEpOworCQl0bXAgPSBpZHhfdmFsdWUgJiAoMSA8PCAzMSk7CiAJCXRyYWNrLT50ZXh0dXJlc1tpXS51c2VfcGl0Y2ggPSAhIXRtcDsKLQkJdG1wID0gKGliX2NodW5rLT5rZGF0YVtpZHhdID4+IDIyKSAmIDB4RjsKKwkJdG1wID0gKGlkeF92YWx1ZSA+PiAyMikgJiAweEY7CiAJCXRyYWNrLT50ZXh0dXJlc1tpXS50eGRlcHRoID0gdG1wOwogCQlicmVhazsKIAljYXNlIFIzMDBfWkJfWlBBU1NfQUREUjoKQEAgLTEwNjcsNyArOTcxLDcgQEAKIAkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKIAkJCXJldHVybiByOwogCQl9Ci0JCWliW2lkeF0gPSBpYl9jaHVuay0+a2RhdGFbaWR4XSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOworCQlpYltpZHhdID0gaWR4X3ZhbHVlICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CiAJCWJyZWFrOwogCWNhc2UgMHg0YmU4OgogCQkvKiB2YWxpZCByZWdpc3RlciBvbmx5IG9uIFJWNTMwICovCkBAIC0xMDg1LDYwICs5ODksMjAgQEAKIHN0YXRpYyBpbnQgcjMwMF9wYWNrZXQzX2NoZWNrKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAogCQkJICAgICAgc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCkKIHsKLQlzdHJ1Y3QgcmFkZW9uX2NzX2NodW5rICppYl9jaHVuazsKLQogCXN0cnVjdCByYWRlb25fY3NfcmVsb2MgKnJlbG9jOwogCXN0cnVjdCByMTAwX2NzX3RyYWNrICp0cmFjazsKIAl2b2xhdGlsZSB1aW50MzJfdCAqaWI7CiAJdW5zaWduZWQgaWR4OwotCXVuc2lnbmVkIGksIGM7CiAJaW50IHI7CiAKIAlpYiA9IHAtPmliLT5wdHI7Ci0JaWJfY2h1bmsgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07CiAJaWR4ID0gcGt0LT5pZHggKyAxOwogCXRyYWNrID0gKHN0cnVjdCByMTAwX2NzX3RyYWNrICopcC0+dHJhY2s7CiAJc3dpdGNoKHBrdC0+b3Bjb2RlKSB7CiAJY2FzZSBQQUNLRVQzXzNEX0xPQURfVkJQTlRSOgotCQljID0gaWJfY2h1bmstPmtkYXRhW2lkeCsrXSAmIDB4MUY7Ci0JCXRyYWNrLT5udW1fYXJyYXlzID0gYzsKLQkJZm9yIChpID0gMDsgaSA8IChjIC0gMSk7IGkrPTIsIGlkeCs9MykgewotCQkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKLQkJCWlmIChyKSB7Ci0JCQkJRFJNX0VSUk9SKCJObyByZWxvYyBmb3IgcGFja2V0MyAlZFxuIiwKLQkJCQkJICBwa3QtPm9wY29kZSk7Ci0JCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCQkJCXJldHVybiByOwotCQkJfQotCQkJaWJbaWR4KzFdID0gaWJfY2h1bmstPmtkYXRhW2lkeCsxXSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0ucm9iaiA9IHJlbG9jLT5yb2JqOwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiA4OwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgJj0gMHg3RjsKLQkJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7Ci0JCQlpZiAocikgewotCQkJCURSTV9FUlJPUigiTm8gcmVsb2MgZm9yIHBhY2tldDMgJWRcbiIsCi0JCQkJCSAgcGt0LT5vcGNvZGUpOwotCQkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJCWliW2lkeCsyXSA9IGliX2NodW5rLT5rZGF0YVtpZHgrMl0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKLQkJCXRyYWNrLT5hcnJheXNbaSArIDFdLnJvYmogPSByZWxvYy0+cm9iajsKLQkJCXRyYWNrLT5hcnJheXNbaSArIDFdLmVzaXplID0gaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gMjQ7Ci0JCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5lc2l6ZSAmPSAweDdGOwotCQl9Ci0JCWlmIChjICYgMSkgewotCQkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKLQkJCWlmIChyKSB7Ci0JCQkJRFJNX0VSUk9SKCJObyByZWxvYyBmb3IgcGFja2V0MyAlZFxuIiwKLQkJCQkJICBwa3QtPm9wY29kZSk7Ci0JCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCQkJCXJldHVybiByOwotCQkJfQotCQkJaWJbaWR4KzFdID0gaWJfY2h1bmstPmtkYXRhW2lkeCsxXSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0ucm9iaiA9IHJlbG9jLT5yb2JqOwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpYl9jaHVuay0+a2RhdGFbaWR4XSA+PiA4OwotCQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgJj0gMHg3RjsKLQkJfQorCQlyID0gcjEwMF9wYWNrZXQzX2xvYWRfdmJwbnRyKHAsIHBrdCwgaWR4KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKIAkJYnJlYWs7CiAJY2FzZSBQQUNLRVQzX0lORFhfQlVGRkVSOgogCQlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOwpAQCAtMTE0Nyw3ICsxMDExLDcgQEAKIAkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKIAkJCXJldHVybiByOwogCQl9Ci0JCWliW2lkeCsxXSA9IGliX2NodW5rLT5rZGF0YVtpZHgrMV0gKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJaWJbaWR4KzFdID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwogCQlyID0gcjEwMF9jc190cmFja19jaGVja19wa3QzX2luZHhfYnVmZmVyKHAsIHBrdCwgcmVsb2MtPnJvYmopOwogCQlpZiAocikgewogCQkJcmV0dXJuIHI7CkBAIC0xMTU4LDExICsxMDIyLDExIEBACiAJCS8qIE51bWJlciBvZiBkd29yZHMgaXMgdnR4X3NpemUgKiAobnVtX3ZlcnRpY2VzIC0gMSkKIAkJICogUFJJTV9XQUxLIG11c3QgYmUgZXF1YWwgdG8gMyB2ZXJ0ZXggZGF0YSBpbiBlbWJlZGRlZAogCQkgKiBpbiBjbWQgc3RyZWFtICovCi0JCWlmICgoKGliX2NodW5rLT5rZGF0YVtpZHgrMV0gPj4gNCkgJiAweDMpICE9IDMpIHsKKwkJaWYgKCgocmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKSA+PiA0KSAmIDB4MykgIT0gMykgewogCQkJRFJNX0VSUk9SKCJQUklNX1dBTEsgbXVzdCBiZSAzIGZvciBJTU1EIGRyYXdcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJdHJhY2stPnZhcF92Zl9jbnRsID0gaWJfY2h1bmstPmtkYXRhW2lkeCsxXTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKTsKIAkJdHJhY2stPmltbWRfZHdvcmRzID0gcGt0LT5jb3VudCAtIDE7CiAJCXIgPSByMTAwX2NzX3RyYWNrX2NoZWNrKHAtPnJkZXYsIHRyYWNrKTsKIAkJaWYgKHIpIHsKQEAgLTExNzMsMTEgKzEwMzcsMTEgQEAKIAkJLyogTnVtYmVyIG9mIGR3b3JkcyBpcyB2dHhfc2l6ZSAqIChudW1fdmVydGljZXMgLSAxKQogCQkgKiBQUklNX1dBTEsgbXVzdCBiZSBlcXVhbCB0byAzIHZlcnRleCBkYXRhIGluIGVtYmVkZGVkCiAJCSAqIGluIGNtZCBzdHJlYW0gKi8KLQkJaWYgKCgoaWJfY2h1bmstPmtkYXRhW2lkeF0gPj4gNCkgJiAweDMpICE9IDMpIHsKKwkJaWYgKCgocmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpID4+IDQpICYgMHgzKSAhPSAzKSB7CiAJCQlEUk1fRVJST1IoIlBSSU1fV0FMSyBtdXN0IGJlIDMgZm9yIElNTUQgZHJhd1xuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQl0cmFjay0+dmFwX3ZmX2NudGwgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwogCQl0cmFjay0+aW1tZF9kd29yZHMgPSBwa3QtPmNvdW50OwogCQlyID0gcjEwMF9jc190cmFja19jaGVjayhwLT5yZGV2LCB0cmFjayk7CiAJCWlmIChyKSB7CkBAIC0xMTg1LDI4ICsxMDQ5LDI4IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQQUNLRVQzXzNEX0RSQVdfVkJVRjoKLQkJdHJhY2stPnZhcF92Zl9jbnRsID0gaWJfY2h1bmstPmtkYXRhW2lkeCArIDFdOworCQl0cmFjay0+dmFwX3ZmX2NudGwgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDEpOwogCQlyID0gcjEwMF9jc190cmFja19jaGVjayhwLT5yZGV2LCB0cmFjayk7CiAJCWlmIChyKSB7CiAJCQlyZXR1cm4gcjsKIAkJfQogCQlicmVhazsKIAljYXNlIFBBQ0tFVDNfM0RfRFJBV19WQlVGXzI6Ci0JCXRyYWNrLT52YXBfdmZfY250bCA9IGliX2NodW5rLT5rZGF0YVtpZHhdOworCQl0cmFjay0+dmFwX3ZmX2NudGwgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CiAJCXIgPSByMTAwX2NzX3RyYWNrX2NoZWNrKHAtPnJkZXYsIHRyYWNrKTsKIAkJaWYgKHIpIHsKIAkJCXJldHVybiByOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgUEFDS0VUM18zRF9EUkFXX0lORFg6Ci0JCXRyYWNrLT52YXBfdmZfY250bCA9IGliX2NodW5rLT5rZGF0YVtpZHggKyAxXTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKTsKIAkJciA9IHIxMDBfY3NfdHJhY2tfY2hlY2socC0+cmRldiwgdHJhY2spOwogCQlpZiAocikgewogCQkJcmV0dXJuIHI7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQQUNLRVQzXzNEX0RSQVdfSU5EWF8yOgotCQl0cmFjay0+dmFwX3ZmX2NudGwgPSBpYl9jaHVuay0+a2RhdGFbaWR4XTsKKwkJdHJhY2stPnZhcF92Zl9jbnRsID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwogCQlyID0gcjEwMF9jc190cmFja19jaGVjayhwLT5yZGV2LCB0cmFjayk7CiAJCWlmIChyKSB7CiAJCQlyZXR1cm4gcjsKQEAgLTEyNjUsMTIgKzExMjksNiBAQAogCXJkZXYtPmNvbmZpZy5yMzAwLnJlZ19zYWZlX2JtX3NpemUgPSBBUlJBWV9TSVpFKHIzMDBfcmVnX3NhZmVfYm0pOwogfQogCi1pbnQgcjMwMF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCXIzMDBfc2V0X3JlZ19zYWZlKHJkZXYpOwotCXJldHVybiAwOwotfQotCiB2b2lkIHIzMDBfbWNfcHJvZ3JhbShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlzdHJ1Y3QgcjEwMF9tY19zYXZlIHNhdmU7CkBAIC0xMzA0LDMgKzExNjIsMTk4IEBACiAJCVNfMDAwMTQ4X01DX0ZCX1RPUChyZGV2LT5tYy52cmFtX2VuZCA+PiAxNikpOwogCXIxMDBfbWNfcmVzdW1lKHJkZXYsICZzYXZlKTsKIH0KKwordm9pZCByMzAwX2Nsb2NrX3N0YXJ0dXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIHRtcDsKKworCWlmIChyYWRlb25fZHluY2xrcyAhPSAtMSAmJiByYWRlb25fZHluY2xrcykKKwkJcmFkZW9uX2xlZ2FjeV9zZXRfY2xvY2tfZ2F0aW5nKHJkZXYsIDEpOworCS8qIFdlIG5lZWQgdG8gZm9yY2Ugb24gc29tZSBvZiB0aGUgYmxvY2sgKi8KKwl0bXAgPSBSUkVHMzJfUExMKFJfMDAwMDBEX1NDTEtfQ05UTCk7CisJdG1wIHw9IFNfMDAwMDBEX0ZPUkNFX0NQKDEpIHwgU18wMDAwMERfRk9SQ0VfVklQKDEpOworCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlYzNTApIHx8IChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjM4MCkpCisJCXRtcCB8PSBTXzAwMDAwRF9GT1JDRV9WQVAoMSk7CisJV1JFRzMyX1BMTChSXzAwMDAwRF9TQ0xLX0NOVEwsIHRtcCk7Cit9CisKK3N0YXRpYyBpbnQgcjMwMF9zdGFydHVwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCisJcjMwMF9tY19wcm9ncmFtKHJkZXYpOworCS8qIFJlc3VtZSBjbG9jayAqLworCXIzMDBfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdQVSBjb25maWd1cmF0aW9uICgjIHBpcGVzLCAuLi4pICovCisJcjMwMF9ncHVfaW5pdChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdBUlQgKGluaXRpYWxpemUgYWZ0ZXIgVFRNIHNvIHdlIGNhbiBhbGxvY2F0ZQorCSAqIG1lbW9yeSB0aHJvdWdoIFRUTSBidXQgZmluYWxpemUgYWZ0ZXIgVFRNKSAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKSB7CisJCXIgPSBydjM3MF9wY2llX2dhcnRfZW5hYmxlKHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJKSB7CisJCXIgPSByMTAwX3BjaV9nYXJ0X2VuYWJsZShyZGV2KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisJLyogRW5hYmxlIElSUSAqLworCXJkZXYtPmlycS5zd19pbnQgPSB0cnVlOworCXIxMDBfaXJxX3NldChyZGV2KTsKKwkvKiAxTSByaW5nIGJ1ZmZlciAqLworCXIgPSByMTAwX2NwX2luaXQocmRldiwgMTAyNCAqIDEwMjQpOworCWlmIChyKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgQ1AgKCVkKS5cbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJciA9IHIxMDBfd2JfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJZGV2X2VycihyZGV2LT5kZXYsICJmYWlsbGVkIGluaXRpYWxpemluZyBXQiAoJWQpLlxuIiwgcik7CisJciA9IHIxMDBfaWJfaW5pdChyZGV2KTsKKwlpZiAocikgeworCQlkZXZfZXJyKHJkZXYtPmRldiwgImZhaWxsZWQgaW5pdGlhbGl6aW5nIElCICglZCkuXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcjMwMF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJLyogTWFrZSBzdXIgR0FSVCBhcmUgbm90IHdvcmtpbmcgKi8KKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJcnYzNzBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkKKwkJcjEwMF9wY2lfZ2FydF9kaXNhYmxlKHJkZXYpOworCS8qIFJlc3VtZSBjbG9jayBiZWZvcmUgZG9pbmcgcmVzZXQgKi8KKwlyMzAwX2Nsb2NrX3N0YXJ0dXAocmRldik7CisJLyogUmVzZXQgZ3B1IGJlZm9yZSBwb3N0aW5nIG90aGVyd2lzZSBBVE9NIHdpbGwgZW50ZXIgaW5maW5pdGUgbG9vcCAqLworCWlmIChyYWRlb25fZ3B1X3Jlc2V0KHJkZXYpKSB7CisJCWRldl93YXJuKHJkZXYtPmRldiwgIkdQVSByZXNldCBmYWlsZWQgISAoMHhFNDA9MHglMDhYLCAweDdDMD0weCUwOFgpXG4iLAorCQkJUlJFRzMyKFJfMDAwRTQwX1JCQk1fU1RBVFVTKSwKKwkJCVJSRUczMihSXzAwMDdDMF9DUF9TVEFUKSk7CisJfQorCS8qIHBvc3QgKi8KKwlyYWRlb25fY29tYmlvc19hc2ljX2luaXQocmRldi0+ZGRldik7CisJLyogUmVzdW1lIGNsb2NrIGFmdGVyIHBvc3RpbmcgKi8KKwlyMzAwX2Nsb2NrX3N0YXJ0dXAocmRldik7CisJcmV0dXJuIHIzMDBfc3RhcnR1cChyZGV2KTsKK30KKworaW50IHIzMDBfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlyMTAwX2NwX2Rpc2FibGUocmRldik7CisJcjEwMF93Yl9kaXNhYmxlKHJkZXYpOworCXIxMDBfaXJxX2Rpc2FibGUocmRldik7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpCisJCXJ2MzcwX3BjaWVfZ2FydF9kaXNhYmxlKHJkZXYpOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0kpCisJCXIxMDBfcGNpX2dhcnRfZGlzYWJsZShyZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByMzAwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcjMwMF9zdXNwZW5kKHJkZXYpOworCXIxMDBfY3BfZmluaShyZGV2KTsKKwlyMTAwX3diX2ZpbmkocmRldik7CisJcjEwMF9pYl9maW5pKHJkZXYpOworCXJhZGVvbl9nZW1fZmluaShyZGV2KTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJcnYzNzBfcGNpZV9nYXJ0X2ZpbmkocmRldik7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkKKwkJcjEwMF9wY2lfZ2FydF9maW5pKHJkZXYpOworCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CisJcmFkZW9uX2ZlbmNlX2RyaXZlcl9maW5pKHJkZXYpOworCXJhZGVvbl9vYmplY3RfZmluaShyZGV2KTsKKwlyYWRlb25fYXRvbWJpb3NfZmluaShyZGV2KTsKKwlrZnJlZShyZGV2LT5iaW9zKTsKKwlyZGV2LT5iaW9zID0gTlVMTDsKK30KKworaW50IHIzMDBfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcjsKKworCS8qIERpc2FibGUgVkdBICovCisJcjEwMF92Z2FfcmVuZGVyX2Rpc2FibGUocmRldik7CisJLyogSW5pdGlhbGl6ZSBzY3JhdGNoIHJlZ2lzdGVycyAqLworCXJhZGVvbl9zY3JhdGNoX2luaXQocmRldik7CisJLyogSW5pdGlhbGl6ZSBzdXJmYWNlIHJlZ2lzdGVycyAqLworCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7CisJLyogVE9ETzogZGlzYWJsZSBWR0EgbmVlZCB0byB1c2UgVkdBIHJlcXVlc3QgKi8KKwkvKiBCSU9TKi8KKwlpZiAoIXJhZGVvbl9nZXRfYmlvcyhyZGV2KSkgeworCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmRldi0+aXNfYXRvbV9iaW9zKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiRXhwZWN0aW5nIGNvbWJpb3MgZm9yIFJTNDAwL1JTNDgwIEdQVVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCXIgPSByYWRlb25fY29tYmlvc19pbml0KHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKwkvKiBSZXNldCBncHUgYmVmb3JlIHBvc3Rpbmcgb3RoZXJ3aXNlIEFUT00gd2lsbCBlbnRlciBpbmZpbml0ZSBsb29wICovCisJaWYgKHJhZGVvbl9ncHVfcmVzZXQocmRldikpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LAorCQkJIkdQVSByZXNldCBmYWlsZWQgISAoMHhFNDA9MHglMDhYLCAweDdDMD0weCUwOFgpXG4iLAorCQkJUlJFRzMyKFJfMDAwRTQwX1JCQk1fU1RBVFVTKSwKKwkJCVJSRUczMihSXzAwMDdDMF9DUF9TVEFUKSk7CisJfQorCS8qIGNoZWNrIGlmIGNhcmRzIGFyZSBwb3N0ZWQgb3Igbm90ICovCisJaWYgKCFyYWRlb25fY2FyZF9wb3N0ZWQocmRldikgJiYgcmRldi0+YmlvcykgeworCQlEUk1fSU5GTygiR1BVIG5vdCBwb3N0ZWQuIHBvc3Rpbmcgbm93Li4uXG4iKTsKKwkJcmFkZW9uX2NvbWJpb3NfYXNpY19pbml0KHJkZXYtPmRkZXYpOworCX0KKwkvKiBTZXQgYXNpYyBlcnJhdGEgKi8KKwlyMzAwX2VycmF0YShyZGV2KTsKKwkvKiBJbml0aWFsaXplIGNsb2NrcyAqLworCXJhZGVvbl9nZXRfY2xvY2tfaW5mbyhyZGV2LT5kZGV2KTsKKwkvKiBHZXQgdnJhbSBpbmZvcm1hdGlvbnMgKi8KKwlyMzAwX3ZyYW1faW5mbyhyZGV2KTsKKwkvKiBJbml0aWFsaXplIG1lbW9yeSBjb250cm9sbGVyIChhbHNvIHRlc3QgQUdQKSAqLworCXIgPSByNDIwX21jX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCS8qIEZlbmNlIGRyaXZlciAqLworCXIgPSByYWRlb25fZmVuY2VfZHJpdmVyX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXIgPSByYWRlb25faXJxX2ttc19pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwkvKiBNZW1vcnkgbWFuYWdlciAqLworCXIgPSByYWRlb25fb2JqZWN0X2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKSB7CisJCXIgPSBydjM3MF9wY2llX2dhcnRfaW5pdChyZGV2KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkgeworCQlyID0gcjEwMF9wY2lfZ2FydF9pbml0KHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKwlyMzAwX3NldF9yZWdfc2FmZShyZGV2KTsKKwlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKKwlyID0gcjMwMF9zdGFydHVwKHJkZXYpOworCWlmIChyKSB7CisJCS8qIFNvbWV0aGluZ3Mgd2FudCB3cm9udCB3aXRoIHRoZSBhY2NlbCBpbml0IHN0b3AgYWNjZWwgKi8KKwkJZGV2X2VycihyZGV2LT5kZXYsICJEaXNhYmxpbmcgR1BVIGFjY2VsZXJhdGlvblxuIik7CisJCXIzMDBfc3VzcGVuZChyZGV2KTsKKwkJcjEwMF9jcF9maW5pKHJkZXYpOworCQlyMTAwX3diX2ZpbmkocmRldik7CisJCXIxMDBfaWJfZmluaShyZGV2KTsKKwkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpCisJCQlydjM3MF9wY2llX2dhcnRfZmluaShyZGV2KTsKKwkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkKKwkJCXIxMDBfcGNpX2dhcnRfZmluaShyZGV2KTsKKwkJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKKwkJcmRldi0+YWNjZWxfd29ya2luZyA9IGZhbHNlOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMGQuaAppbmRleCBkNGZhM2ViLi40YzczMTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwZC5oCkBAIC05Niw2ICs5NiwyMTEgQEAKICNkZWZpbmUgICBTXzAwMDE3MF9BR1BfQkFTRV9BRERSKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRkZGRkYpIDw8IDApCiAjZGVmaW5lICAgR18wMDAxNzBfQUdQX0JBU0VfQUREUih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkZGRkZGKQogI2RlZmluZSAgIENfMDAwMTcwX0FHUF9CQVNFX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUl8wMDA3QzBfQ1BfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA3QzAKKyNkZWZpbmUgICBTXzAwMDdDMF9NUlVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDdDMF9NUlVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9NUlVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lICAgU18wMDA3QzBfTVdVX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEpCisjZGVmaW5lICAgR18wMDA3QzBfTVdVX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfTVdVX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRAorI2RlZmluZSAgIFNfMDAwN0MwX1JTSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyKQorI2RlZmluZSAgIEdfMDAwN0MwX1JTSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX1JTSVVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkIKKyNkZWZpbmUgICBTXzAwMDdDMF9SQ0lVX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMykKKyNkZWZpbmUgICBHXzAwMDdDMF9SQ0lVX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9SQ0lVX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkY3CisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX1BSSU1BUllfQlVTWSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDkpCisjZGVmaW5lICAgR18wMDA3QzBfQ1NGX1BSSU1BUllfQlVTWSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gOSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ1NGX1BSSU1BUllfQlVTWSAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkRGRgorI2RlZmluZSAgIFNfMDAwN0MwX0NTRl9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMCkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU0ZfSU5ESVJFQ1RfQlVTWSh4KSAgICAgICAgICAgICAgICAoKCh4KSA+PiAxMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ1NGX0lORElSRUNUX0JVU1kgICAgICAgICAgICAgICAgICAgMHhGRkZGRkJGRgorI2RlZmluZSAgIFNfMDAwN0MwX0NTUV9QUklNQVJZX0JVU1koeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMSkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU1FfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ1NRX1BSSU1BUllfQlVTWSAgICAgICAgICAgICAgICAgICAgMHhGRkZGRjdGRgorI2RlZmluZSAgIFNfMDAwN0MwX0NTUV9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMikKKyNkZWZpbmUgICBHXzAwMDdDMF9DU1FfSU5ESVJFQ1RfQlVTWSh4KSAgICAgICAgICAgICAgICAoKCh4KSA+PiAxMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ1NRX0lORElSRUNUX0JVU1kgICAgICAgICAgICAgICAgICAgMHhGRkZGRUZGRgorI2RlZmluZSAgIFNfMDAwN0MwX0NTSV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMykKKyNkZWZpbmUgICBHXzAwMDdDMF9DU0lfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxMykgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ1NJX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGREZGRgorI2RlZmluZSAgIFNfMDAwN0MwX0NTRl9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNCkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU0ZfSU5ESVJFQ1QyX0JVU1koeCkgICAgICAgICAgICAgICAoKCh4KSA+PiAxNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ1NGX0lORElSRUNUMl9CVVNZICAgICAgICAgICAgICAgICAgMHhGRkZGQkZGRgorI2RlZmluZSAgIFNfMDAwN0MwX0NTUV9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNSkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU1FfSU5ESVJFQ1QyX0JVU1koeCkgICAgICAgICAgICAgICAoKCh4KSA+PiAxNSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ1NRX0lORElSRUNUMl9CVVNZICAgICAgICAgICAgICAgICAgMHhGRkZGN0ZGRgorI2RlZmluZSAgIFNfMDAwN0MwX0dVSURNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyOCkKKyNkZWZpbmUgICBHXzAwMDdDMF9HVUlETUFfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfR1VJRE1BX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgMHhFRkZGRkZGRgorI2RlZmluZSAgIFNfMDAwN0MwX1ZJRERNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyOSkKKyNkZWZpbmUgICBHXzAwMDdDMF9WSURETUFfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyOSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfVklERE1BX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgMHhERkZGRkZGRgorI2RlZmluZSAgIFNfMDAwN0MwX0NNRFNUUk1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzMCkKKyNkZWZpbmUgICBHXzAwMDdDMF9DTURTVFJNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAzMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ01EU1RSTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgMHhCRkZGRkZGRgorI2RlZmluZSAgIFNfMDAwN0MwX0NQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzMSkKKyNkZWZpbmUgICBHXzAwMDdDMF9DUF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAzMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfQ1BfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RkZGRkZGRgorI2RlZmluZSBSXzAwMEU0MF9SQkJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEU0MAorI2RlZmluZSAgIFNfMDAwRTQwX0NNREZJRk9fQVZBSUwoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHg3RikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMEU0MF9DTURGSUZPX0FWQUlMKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4N0YpCisjZGVmaW5lICAgQ18wMDBFNDBfQ01ERklGT19BVkFJTCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkY4MAorI2RlZmluZSAgIFNfMDAwRTQwX0hJUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA4KQorI2RlZmluZSAgIEdfMDAwRTQwX0hJUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0hJUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZFRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUFJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOSkKKyNkZWZpbmUgICBHXzAwMEU0MF9DUFJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9DUFJRX09OX1JCQiAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGREZGCisjZGVmaW5lICAgU18wMDBFNDBfQ0ZSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEwKQorI2RlZmluZSAgIEdfMDAwRTQwX0NGUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9DRlJRX09OX1JCQiAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGQkZGCisjZGVmaW5lICAgU18wMDBFNDBfSElSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDExKQorI2RlZmluZSAgIEdfMDAwRTQwX0hJUlFfSU5fUlRCVUYoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDExKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9ISVJRX0lOX1JUQlVGICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGN0ZGCisjZGVmaW5lICAgU18wMDBFNDBfQ1BSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwRTQwX0NQUlFfSU5fUlRCVUYoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9DUFJRX0lOX1JUQlVGICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDBFNDBfQ0ZSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEzKQorI2RlZmluZSAgIEdfMDAwRTQwX0NGUlFfSU5fUlRCVUYoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9DRlJRX0lOX1JUQlVGICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZERkZGCisjZGVmaW5lICAgU18wMDBFNDBfQ0ZfUElQRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE0KQorI2RlZmluZSAgIEdfMDAwRTQwX0NGX1BJUEVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9DRl9QSVBFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZCRkZGCisjZGVmaW5lICAgU18wMDBFNDBfRU5HX0VWX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE1KQorI2RlZmluZSAgIEdfMDAwRTQwX0VOR19FVl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9FTkdfRVZfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkY3RkZGCisjZGVmaW5lICAgU18wMDBFNDBfQ1BfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDAwRTQwX0NQX0NNRFNUUk1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9DUF9DTURTVFJNX0JVU1kgICAgICAgICAgICAgICAgICAgICAweEZGRkVGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfRTJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE3KQorI2RlZmluZSAgIEdfMDAwRTQwX0UyX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9FMl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkRGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfUkIyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE4KQorI2RlZmluZSAgIEdfMDAwRTQwX1JCMkRfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9SQjJEX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkJGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfUkIzRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE5KQorI2RlZmluZSAgIEdfMDAwRTQwX1JCM0RfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9SQjNEX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRjdGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfVkFQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIwKQorI2RlZmluZSAgIEdfMDAwRTQwX1ZBUF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9WQVBfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRUZGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfUkVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIxKQorI2RlZmluZSAgIEdfMDAwRTQwX1JFX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9SRV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGREZGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfVEFNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIyKQorI2RlZmluZSAgIEdfMDAwRTQwX1RBTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9UQU1fQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGQkZGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfVERNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIzKQorI2RlZmluZSAgIEdfMDAwRTQwX1RETV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9URE1fQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGN0ZGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfUEJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI0KQorI2RlZmluZSAgIEdfMDAwRTQwX1BCX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9QQl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZFRkZGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfVElNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI1KQorI2RlZmluZSAgIEdfMDAwRTQwX1RJTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9USU1fQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZERkZGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfR0FfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI2KQorI2RlZmluZSAgIEdfMDAwRTQwX0dBX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9HQV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZCRkZGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfQ0JBMkRfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI3KQorI2RlZmluZSAgIEdfMDAwRTQwX0NCQTJEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9DQkEyRF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAweEY3RkZGRkZGCisjZGVmaW5lICAgU18wMDBFNDBfR1VJX0FDVElWRSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQorI2RlZmluZSAgIEdfMDAwRTQwX0dVSV9BQ1RJVkUoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9HVUlfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCiAKIAorI2RlZmluZSBSXzAwMDAwRF9TQ0xLX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwRAorI2RlZmluZSAgIFNfMDAwMDBEX1NDTEtfU1JDX1NFTCh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHg3KSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDBEX1NDTEtfU1JDX1NFTCh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHg3KQorI2RlZmluZSAgIENfMDAwMDBEX1NDTEtfU1JDX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjgKKyNkZWZpbmUgICBTXzAwMDAwRF9DUF9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMykKKyNkZWZpbmUgICBHXzAwMDAwRF9DUF9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSA+PiAzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9DUF9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgICAweEZGRkZGRkY3CisjZGVmaW5lICAgU18wMDAwMERfSERQX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDQpCisjZGVmaW5lICAgR18wMDAwMERfSERQX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgKCgoeCkgPj4gNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfSERQX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAgMHhGRkZGRkZFRgorI2RlZmluZSAgIFNfMDAwMDBEX1RWX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA1KQorI2RlZmluZSAgIEdfMDAwMDBEX1RWX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpID4+IDUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX1RWX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAgIDB4RkZGRkZGREYKKyNkZWZpbmUgICBTXzAwMDAwRF9FMl9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgNikKKyNkZWZpbmUgICBHXzAwMDAwRF9FMl9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSA+PiA2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9FMl9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgICAweEZGRkZGRkJGCisjZGVmaW5lICAgU18wMDAwMERfU0VfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDcpCisjZGVmaW5lICAgR18wMDAwMERfU0VfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gNykgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfU0VfTUFYX0RZTl9TVE9QX0xBVCAgICAgICAgICAgICAgICAgMHhGRkZGRkY3RgorI2RlZmluZSAgIFNfMDAwMDBEX0lEQ1RfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA4KQorI2RlZmluZSAgIEdfMDAwMDBEX0lEQ1RfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICgoKHgpID4+IDgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0lEQ1RfTUFYX0RZTl9TVE9QX0xBVCAgICAgICAgICAgICAgIDB4RkZGRkZFRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9WSVBfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOSkKKyNkZWZpbmUgICBHXzAwMDAwRF9WSVBfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAoKCh4KSA+PiA5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9WSVBfTUFYX0RZTl9TVE9QX0xBVCAgICAgICAgICAgICAgICAweEZGRkZGREZGCisjZGVmaW5lICAgU18wMDAwMERfUkVfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEwKQorI2RlZmluZSAgIEdfMDAwMDBEX1JFX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpID4+IDEwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9SRV9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgICAweEZGRkZGQkZGCisjZGVmaW5lICAgU18wMDAwMERfUEJfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDExKQorI2RlZmluZSAgIEdfMDAwMDBEX1BCX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpID4+IDExKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9QQl9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgICAweEZGRkZGN0ZGCisjZGVmaW5lICAgU18wMDAwMERfVEFNX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwMDBEX1RBTV9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9UQU1fTUFYX0RZTl9TVE9QX0xBVCAgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDAwMERfVERNX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEzKQorI2RlZmluZSAgIEdfMDAwMDBEX1RETV9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICgoKHgpID4+IDEzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9URE1fTUFYX0RZTl9TVE9QX0xBVCAgICAgICAgICAgICAgICAweEZGRkZERkZGCisjZGVmaW5lICAgU18wMDAwMERfUkJfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE0KQorI2RlZmluZSAgIEdfMDAwMDBEX1JCX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpID4+IDE0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9SQl9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgICAweEZGRkZCRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfRElTUDIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE1KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX0RJU1AyKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9ESVNQMiAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkY3RkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfQ1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX0NQKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9DUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkVGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfSERQKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE3KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX0hEUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9IRFAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkRGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfRElTUDEoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE4KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX0RJU1AxKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9ESVNQMSAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkJGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE5KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRjdGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfRTIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIwKQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX0UyKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRUZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfU0UoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIxKQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1NFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGREZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfSURDVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIyKQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX0lEQ1QoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9JRENUICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGQkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfVklQKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIzKQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1ZJUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9WSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGN0ZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfUkUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI0KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1JFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZFRkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfUEIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI1KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1BCKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9QQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZERkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfVEFNKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI2KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1RBTSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9UQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAweEZCRkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfVERNKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI3KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1RETSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9URE0gICAgICAgICAgICAgICAgICAgICAgICAgICAweEY3RkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfUkIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1JCKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9SQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEVGRkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfVFZfU0NMSyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI5KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1RWX1NDTEsoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9UVl9TQ0xLICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfU1VCUElDKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1NVQlBJQyh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9TVUJQSUMgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfT1YwKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX09WMCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9PVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I0MjAuYwppbmRleCA0OWEyZmRjLi41YzdmZTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I0MjAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I0MjAuYwpAQCAtMTU1LDYgKzE1NSw5IEBACiBzdGF0aWMgdm9pZCByNDIwX2Nsb2NrX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgc2Nsa19jbnRsOworCisJaWYgKHJhZGVvbl9keW5jbGtzICE9IC0xICYmIHJhZGVvbl9keW5jbGtzKQorCQlyYWRlb25fYXRvbV9zZXRfY2xvY2tfZ2F0aW5nKHJkZXYsIDEpOwogCXNjbGtfY250bCA9IFJSRUczMl9QTEwoUl8wMDAwMERfU0NMS19DTlRMKTsKIAlzY2xrX2NudGwgfD0gU18wMDAwMERfRk9SQ0VfQ1AoMSkgfCBTXzAwMDAwRF9GT1JDRV9WSVAoMSk7CiAJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1I0MjApCkBAIC0xNjcsNiArMTcwLDggQEAKIAlpbnQgcjsKIAogCXIzMDBfbWNfcHJvZ3JhbShyZGV2KTsKKwkvKiBSZXN1bWUgY2xvY2sgKi8KKwlyNDIwX2Nsb2NrX3Jlc3VtZShyZGV2KTsKIAkvKiBJbml0aWFsaXplIEdBUlQgKGluaXRpYWxpemUgYWZ0ZXIgVFRNIHNvIHdlIGNhbiBhbGxvY2F0ZQogCSAqIG1lbW9yeSB0aHJvdWdoIFRUTSBidXQgZmluYWxpemUgYWZ0ZXIgVFRNKSAqLwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKSB7CkBAIC0yNjcsNyArMjcyLDYgQEAKIHsKIAlpbnQgcjsKIAotCXJkZXYtPm5ld19pbml0X3BhdGggPSB0cnVlOwogCS8qIEluaXRpYWxpemUgc2NyYXRjaCByZWdpc3RlcnMgKi8KIAlyYWRlb25fc2NyYXRjaF9pbml0KHJkZXYpOwogCS8qIEluaXRpYWxpemUgc3VyZmFjZSByZWdpc3RlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjQyMGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjQyMGQuaAppbmRleCBhNDhhN2RiLi5mYzc4ZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I0MjBkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNDIwZC5oCkBAIC0yMTIsOSArMjEyLDkgQEAKICNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9FMih4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCiAjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfRTIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQogI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX0UyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZFRkZGRkYKLSNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9TRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCi0jZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfU0UoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQotI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9WQVAoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVkFQKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1ZBUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZERkZGRkYKICNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9JRENUKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjIpCiAjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfSURDVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjIpICYgMHgxKQogI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX0lEQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZCRkZGRkYKQEAgLTIyNCwyNCArMjI0LDI0IEBACiAjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfUkUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI0KQogI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1JFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI0KSAmIDB4MSkKICNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZFRkZGRkZGCi0jZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfUEIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI1KQotI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1BCKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI1KSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9QQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZERkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfU1IoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI1KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1NSKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZERkZGRkZGCiAjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfUFgoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI2KQogI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1BYKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI2KSAmIDB4MSkKICNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9QWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZCRkZGRkZGCiAjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfVFgoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI3KQogI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1RYKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI3KSAmIDB4MSkKICNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEY3RkZGRkZGCi0jZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfUkIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQotI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1JCKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9SQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEVGRkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfVVMoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1VTKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEVGRkZGRkZGCiAjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfVFZfU0NMSyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI5KQogI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1RWX1NDTEsoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI5KSAmIDB4MSkKICNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9UVl9TQ0xLICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGRkZGCi0jZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfU1VCUElDKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQotI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1NVQlBJQyh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKLSNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9TVUJQSUMgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGRkZGCisjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfU1UoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQorI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX1NVKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9TVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGRkZGCiAjZGVmaW5lICAgU18wMDAwMERfRk9SQ0VfT1YwKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQogI2RlZmluZSAgIEdfMDAwMDBEX0ZPUkNFX09WMCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKICNkZWZpbmUgICBDXzAwMDAwRF9GT1JDRV9PVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmgKaW5kZXggZTFkNWUwMy4uODY4YWRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTAwX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUwMF9yZWcuaApAQCAtNDQ1LDYgKzQ0NSw4IEBACiAjZGVmaW5lIEFWSVZPX0QxTU9ERV9WQkxBTktfU1RBVFVTICAgICAgICAgICAgICAweDY1MzQKICMgICAgICAgZGVmaW5lIEFWSVZPX1ZCTEFOS19BQ0sgICAgICAgICAgICAgICAgICgxIDw8IDQpCiAjZGVmaW5lIEFWSVZPX0QxTU9ERV9WTElORV9TVEFSVF9FTkQgICAgICAgICAgICAweDY1MzgKKyNkZWZpbmUgQVZJVk9fRDFNT0RFX1ZMSU5FX1NUQVRVUyAgICAgICAgICAgICAgIDB4NjUzYworIyAgICAgICBkZWZpbmUgQVZJVk9fRDFNT0RFX1ZMSU5FX1NUQVQgICAgICAgICAgKDEgPDwgMTIpCiAjZGVmaW5lIEFWSVZPX0R4TU9ERV9JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAweDY1NDAKICMgICAgICAgZGVmaW5lIEFWSVZPX0QxTU9ERV9JTlRfTUFTSyAgICAgICAgICAgICgxIDw8IDApCiAjICAgICAgIGRlZmluZSBBVklWT19EMk1PREVfSU5UX01BU0sgICAgICAgICAgICAoMSA8PCA4KQpAQCAtNTAyLDYgKzUwNCw3IEBACiAKICNkZWZpbmUgQVZJVk9fRDJNT0RFX1ZCTEFOS19TVEFUVVMgICAgICAgICAgICAgIDB4NmQzNAogI2RlZmluZSBBVklWT19EMk1PREVfVkxJTkVfU1RBUlRfRU5EICAgICAgICAgICAgMHg2ZDM4CisjZGVmaW5lIEFWSVZPX0QyTU9ERV9WTElORV9TVEFUVVMgICAgICAgICAgICAgICAweDZkM2MKICNkZWZpbmUgQVZJVk9fRDJNT0RFX1ZJRVdQT1JUX1NUQVJUICAgICAgICAgICAgIDB4NmQ4MAogI2RlZmluZSBBVklWT19EMk1PREVfVklFV1BPUlRfU0laRSAgICAgICAgICAgICAgMHg2ZDg0CiAjZGVmaW5lIEFWSVZPX0QyTU9ERV9FWFRfT1ZFUlNDQU5fTEVGVF9SSUdIVCAgICAweDZkODgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTIwLmMKaW5kZXggZDRiMGI5ZC4uYTU1NWI3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTIwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTIwLmMKQEAgLTI2LDEwOCArMjYsMTMgQEAKICAqICAgICAgICAgIEplcm9tZSBHbGlzc2UKICAqLwogI2luY2x1ZGUgImRybVAuaCIKLSNpbmNsdWRlICJyYWRlb25fcmVnLmgiCiAjaW5jbHVkZSAicmFkZW9uLmgiCisjaW5jbHVkZSAiYXRvbS5oIgorI2luY2x1ZGUgInI1MjBkLmgiCiAKLS8qIHI1MjAscnY1MzAscnY1NjAscnY1NzAscjU4MCBkZXBlbmRzIG9uIDogKi8KLXZvaWQgcjEwMF9oZHBfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByNDIwX3BpcGVzX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczYwMF9tY19kaXNhYmxlX2NsaWVudHMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczYwMF9kaXNhYmxlX3ZnYShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcnY1MTVfZGVidWdmc19waXBlc19pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJ2NTE1X2RlYnVnZnNfZ2FfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKy8qIFRoaXMgZmlsZXMgZ2F0aGVyIGZ1bmN0aW9ucyBzcGVjaWZpY3MgdG86IHI1MjAscnY1MzAscnY1NjAscnY1NzAscjU4MCAqLwogCi0vKiBUaGlzIGZpbGVzIGdhdGhlciBmdW5jdGlvbnMgc3BlY2lmaWNzIHRvOgotICogcjUyMCxydjUzMCxydjU2MCxydjU3MCxyNTgwCi0gKgotICogU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgbWlnaHQgYmUgdXNlZCBieSBuZXdlciBBU0lDcy4KLSAqLwotdm9pZCByNTIwX2dwdV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByNTIwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotCi0KLS8qCi0gKiBNQwotICovCi1pbnQgcjUyMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCXVpbnQzMl90IHRtcDsKLQlpbnQgcjsKLQotCWlmIChyMTAwX2RlYnVnZnNfcmJibV9pbml0KHJkZXYpKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGRlYnVnZnMgZmlsZSBmb3IgUkJCTSAhXG4iKTsKLQl9Ci0JaWYgKHJ2NTE1X2RlYnVnZnNfcGlwZXNfaW5mb19pbml0KHJkZXYpKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGRlYnVnZnMgZmlsZSBmb3IgcGlwZXMgIVxuIik7Ci0JfQotCWlmIChydjUxNV9kZWJ1Z2ZzX2dhX2luZm9faW5pdChyZGV2KSkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBkZWJ1Z2ZzIGZpbGUgZm9yIHBpcGVzICFcbiIpOwotCX0KLQotCXI1MjBfZ3B1X2luaXQocmRldik7Ci0JcnYzNzBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7Ci0KLQkvKiBTZXR1cCBHUFUgbWVtb3J5IHNwYWNlICovCi0JcmRldi0+bWMudnJhbV9sb2NhdGlvbiA9IDB4RkZGRkZGRkZVTDsKLQlyZGV2LT5tYy5ndHRfbG9jYXRpb24gPSAweEZGRkZGRkZGVUw7Ci0JaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewotCQlyID0gcmFkZW9uX2FncF9pbml0KHJkZXYpOwotCQlpZiAocikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiW2RybV0gRGlzYWJsaW5nIEFHUFxuIik7Ci0JCQlyZGV2LT5mbGFncyAmPSB+UkFERU9OX0lTX0FHUDsKLQkJCXJkZXYtPm1jLmd0dF9zaXplID0gcmFkZW9uX2dhcnRfc2l6ZSAqIDEwMjQgKiAxMDI0OwotCQl9IGVsc2UgewotCQkJcmRldi0+bWMuZ3R0X2xvY2F0aW9uID0gcmRldi0+bWMuYWdwX2Jhc2U7Ci0JCX0KLQl9Ci0JciA9IHJhZGVvbl9tY19zZXR1cChyZGV2KTsKLQlpZiAocikgewotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKiBQcm9ncmFtIEdQVSBtZW1vcnkgc3BhY2UgKi8KLQlyczYwMF9tY19kaXNhYmxlX2NsaWVudHMocmRldik7Ci0JaWYgKHI1MjBfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gd2FpdCBNQyBpZGxlIHdoaWxlICIKLQkJICAgICAgICJwcm9ncmFtbWluZyBwaXBlcy4gQmFkIHRoaW5ncyBtaWdodCBoYXBwZW4uXG4iKTsKLQl9Ci0JLyogV3JpdGUgVlJBTSBzaXplIGluIGNhc2Ugd2UgYXJlIGxpbWl0aW5nIGl0ICovCi0JV1JFRzMyKFJBREVPTl9DT05GSUdfTUVNU0laRSwgcmRldi0+bWMucmVhbF92cmFtX3NpemUpOwotCXRtcCA9IHJkZXYtPm1jLnZyYW1fbG9jYXRpb24gKyByZGV2LT5tYy5tY192cmFtX3NpemUgLSAxOwotCXRtcCA9IFJFR19TRVQoUjUyMF9NQ19GQl9UT1AsIHRtcCA+PiAxNik7Ci0JdG1wIHw9IFJFR19TRVQoUjUyMF9NQ19GQl9TVEFSVCwgcmRldi0+bWMudnJhbV9sb2NhdGlvbiA+PiAxNik7Ci0JV1JFRzMyX01DKFI1MjBfTUNfRkJfTE9DQVRJT04sIHRtcCk7Ci0JV1JFRzMyKFJTNjkwX0hEUF9GQl9MT0NBVElPTiwgcmRldi0+bWMudnJhbV9sb2NhdGlvbiA+PiAxNik7Ci0JV1JFRzMyKDB4MzEwLCByZGV2LT5tYy52cmFtX2xvY2F0aW9uKTsKLQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7Ci0JCXRtcCA9IHJkZXYtPm1jLmd0dF9sb2NhdGlvbiArIHJkZXYtPm1jLmd0dF9zaXplIC0gMTsKLQkJdG1wID0gUkVHX1NFVChSNTIwX01DX0FHUF9UT1AsIHRtcCA+PiAxNik7Ci0JCXRtcCB8PSBSRUdfU0VUKFI1MjBfTUNfQUdQX1NUQVJULCByZGV2LT5tYy5ndHRfbG9jYXRpb24gPj4gMTYpOwotCQlXUkVHMzJfTUMoUjUyMF9NQ19BR1BfTE9DQVRJT04sIHRtcCk7Ci0JCVdSRUczMl9NQyhSNTIwX01DX0FHUF9CQVNFLCByZGV2LT5tYy5hZ3BfYmFzZSk7Ci0JCVdSRUczMl9NQyhSNTIwX01DX0FHUF9CQVNFXzIsIDApOwotCX0gZWxzZSB7Ci0JCVdSRUczMl9NQyhSNTIwX01DX0FHUF9MT0NBVElPTiwgMHgwRkZGRkZGRik7Ci0JCVdSRUczMl9NQyhSNTIwX01DX0FHUF9CQVNFLCAwKTsKLQkJV1JFRzMyX01DKFI1MjBfTUNfQUdQX0JBU0VfMiwgMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIHI1MjBfbWNfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLX0KLQotCi0vKgotICogR2xvYmFsIEdQVSBmdW5jdGlvbnMKLSAqLwotdm9pZCByNTIwX2VycmF0YShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlyZGV2LT5wbGxfZXJyYXRhID0gMDsKLX0KLQotaW50IHI1MjBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyBpbnQgcjUyMF9tY193YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXVuc2lnbmVkIGk7CiAJdWludDMyX3QgdG1wOwpAQCAtMTQzLDEyICs0OCwxMiBAQAogCXJldHVybiAtMTsKIH0KIAotdm9pZCByNTIwX2dwdV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQorc3RhdGljIHZvaWQgcjUyMF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1bnNpZ25lZCBwaXBlX3NlbGVjdF9jdXJyZW50LCBnYl9waXBlX3NlbGVjdCwgdG1wOwogCiAJcjEwMF9oZHBfcmVzZXQocmRldik7Ci0JcnM2MDBfZGlzYWJsZV92Z2EocmRldik7CisJcnY1MTVfdmdhX3JlbmRlcl9kaXNhYmxlKHJkZXYpOwogCS8qCiAJICogRFNUX1BJUEVfQ09ORklHCQkweDE3MEMKIAkgKiBHQl9USUxFX0NPTkZJRwkJMHg0MDE4CkBAIC0xODYsMTAgKzkxLDYgQEAKIAl9CiB9CiAKLQotLyoKLSAqIFZSQU0gaW5mbwotICovCiBzdGF0aWMgdm9pZCByNTIwX3ZyYW1fZ2V0X3R5cGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdWludDMyX3QgdG1wOwpAQCAtMjMzLDcgKzEzNCwxNjcgQEAKIAlyZGV2LT5wbS5zY2xrLmZ1bGwgPSByZml4ZWRfZGl2KHJkZXYtPnBtLnNjbGssIGEpOwogfQogCi12b2lkIHI1MjBfYmFuZHdpZHRoX3VwZGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3ZvaWQgcjUyMF9tY19wcm9ncmFtKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXJ2NTE1X2JhbmR3aWR0aF9hdml2b191cGRhdGUocmRldik7CisJc3RydWN0IHJ2NTE1X21jX3NhdmUgc2F2ZTsKKworCS8qIFN0b3BzIGFsbCBtYyBjbGllbnRzICovCisJcnY1MTVfbWNfc3RvcChyZGV2LCAmc2F2ZSk7CisKKwkvKiBXYWl0IGZvciBtYyBpZGxlICovCisJaWYgKHI1MjBfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiV2FpdCBNQyBpZGxlIHRpbWVvdXQgYmVmb3JlIHVwZGF0aW5nIE1DLlxuIik7CisJLyogV3JpdGUgVlJBTSBzaXplIGluIGNhc2Ugd2UgYXJlIGxpbWl0aW5nIGl0ICovCisJV1JFRzMyKFJfMDAwMEY4X0NPTkZJR19NRU1TSVpFLCByZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSk7CisJLyogUHJvZ3JhbSBNQywgc2hvdWxkIGJlIGEgMzJiaXRzIGxpbWl0ZWQgYWRkcmVzcyBzcGFjZSAqLworCVdSRUczMl9NQyhSXzAwMDAwNF9NQ19GQl9MT0NBVElPTiwKKwkJCVNfMDAwMDA0X01DX0ZCX1NUQVJUKHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTYpIHwKKwkJCVNfMDAwMDA0X01DX0ZCX1RPUChyZGV2LT5tYy52cmFtX2VuZCA+PiAxNikpOworCVdSRUczMihSXzAwMDEzNF9IRFBfRkJfTE9DQVRJT04sCisJCVNfMDAwMTM0X0hEUF9GQl9TVEFSVChyZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDE2KSk7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgeworCQlXUkVHMzJfTUMoUl8wMDAwMDVfTUNfQUdQX0xPQ0FUSU9OLAorCQkJU18wMDAwMDVfTUNfQUdQX1NUQVJUKHJkZXYtPm1jLmd0dF9zdGFydCA+PiAxNikgfAorCQkJU18wMDAwMDVfTUNfQUdQX1RPUChyZGV2LT5tYy5ndHRfZW5kID4+IDE2KSk7CisJCVdSRUczMl9NQyhSXzAwMDAwNl9BR1BfQkFTRSwgbG93ZXJfMzJfYml0cyhyZGV2LT5tYy5hZ3BfYmFzZSkpOworCQlXUkVHMzJfTUMoUl8wMDAwMDdfQUdQX0JBU0VfMiwKKwkJCVNfMDAwMDA3X0FHUF9CQVNFX0FERFJfMih1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLmFncF9iYXNlKSkpOworCX0gZWxzZSB7CisJCVdSRUczMl9NQyhSXzAwMDAwNV9NQ19BR1BfTE9DQVRJT04sIDB4RkZGRkZGRkYpOworCQlXUkVHMzJfTUMoUl8wMDAwMDZfQUdQX0JBU0UsIDApOworCQlXUkVHMzJfTUMoUl8wMDAwMDdfQUdQX0JBU0VfMiwgMCk7CisJfQorCisJcnY1MTVfbWNfcmVzdW1lKHJkZXYsICZzYXZlKTsKK30KKworc3RhdGljIGludCByNTIwX3N0YXJ0dXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHI7CisKKwlyNTIwX21jX3Byb2dyYW0ocmRldik7CisJLyogUmVzdW1lIGNsb2NrICovCisJcnY1MTVfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdQVSBjb25maWd1cmF0aW9uICgjIHBpcGVzLCAuLi4pICovCisJcjUyMF9ncHVfaW5pdChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdBUlQgKGluaXRpYWxpemUgYWZ0ZXIgVFRNIHNvIHdlIGNhbiBhbGxvY2F0ZQorCSAqIG1lbW9yeSB0aHJvdWdoIFRUTSBidXQgZmluYWxpemUgYWZ0ZXIgVFRNKSAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKSB7CisJCXIgPSBydjM3MF9wY2llX2dhcnRfZW5hYmxlKHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKwkvKiBFbmFibGUgSVJRICovCisJcmRldi0+aXJxLnN3X2ludCA9IHRydWU7CisJcnM2MDBfaXJxX3NldChyZGV2KTsKKwkvKiAxTSByaW5nIGJ1ZmZlciAqLworCXIgPSByMTAwX2NwX2luaXQocmRldiwgMTAyNCAqIDEwMjQpOworCWlmIChyKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgQ1AgKCVkKS5cbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJciA9IHIxMDBfd2JfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJZGV2X2VycihyZGV2LT5kZXYsICJmYWlsbGVkIGluaXRpYWxpemluZyBXQiAoJWQpLlxuIiwgcik7CisJciA9IHIxMDBfaWJfaW5pdChyZGV2KTsKKwlpZiAocikgeworCQlkZXZfZXJyKHJkZXYtPmRldiwgImZhaWxsZWQgaW5pdGlhbGl6aW5nIElCICglZCkuXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcjUyMF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJLyogTWFrZSBzdXIgR0FSVCBhcmUgbm90IHdvcmtpbmcgKi8KKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJcnYzNzBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CisJLyogUmVzdW1lIGNsb2NrIGJlZm9yZSBkb2luZyByZXNldCAqLworCXJ2NTE1X2Nsb2NrX3N0YXJ0dXAocmRldik7CisJLyogUmVzZXQgZ3B1IGJlZm9yZSBwb3N0aW5nIG90aGVyd2lzZSBBVE9NIHdpbGwgZW50ZXIgaW5maW5pdGUgbG9vcCAqLworCWlmIChyYWRlb25fZ3B1X3Jlc2V0KHJkZXYpKSB7CisJCWRldl93YXJuKHJkZXYtPmRldiwgIkdQVSByZXNldCBmYWlsZWQgISAoMHhFNDA9MHglMDhYLCAweDdDMD0weCUwOFgpXG4iLAorCQkJUlJFRzMyKFJfMDAwRTQwX1JCQk1fU1RBVFVTKSwKKwkJCVJSRUczMihSXzAwMDdDMF9DUF9TVEFUKSk7CisJfQorCS8qIHBvc3QgKi8KKwlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKKwkvKiBSZXN1bWUgY2xvY2sgYWZ0ZXIgcG9zdGluZyAqLworCXJ2NTE1X2Nsb2NrX3N0YXJ0dXAocmRldik7CisJcmV0dXJuIHI1MjBfc3RhcnR1cChyZGV2KTsKK30KKworaW50IHI1MjBfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcjsKKworCS8qIEluaXRpYWxpemUgc2NyYXRjaCByZWdpc3RlcnMgKi8KKwlyYWRlb25fc2NyYXRjaF9pbml0KHJkZXYpOworCS8qIEluaXRpYWxpemUgc3VyZmFjZSByZWdpc3RlcnMgKi8KKwlyYWRlb25fc3VyZmFjZV9pbml0KHJkZXYpOworCS8qIFRPRE86IGRpc2FibGUgVkdBIG5lZWQgdG8gdXNlIFZHQSByZXF1ZXN0ICovCisJLyogQklPUyovCisJaWYgKCFyYWRlb25fZ2V0X2Jpb3MocmRldikpIHsKKwkJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJkZXYtPmlzX2F0b21fYmlvcykgeworCQlyID0gcmFkZW9uX2F0b21iaW9zX2luaXQocmRldik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfSBlbHNlIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJFeHBlY3RpbmcgYXRvbWJpb3MgZm9yIFJWNTE1IEdQVVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBSZXNldCBncHUgYmVmb3JlIHBvc3Rpbmcgb3RoZXJ3aXNlIEFUT00gd2lsbCBlbnRlciBpbmZpbml0ZSBsb29wICovCisJaWYgKHJhZGVvbl9ncHVfcmVzZXQocmRldikpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LAorCQkJIkdQVSByZXNldCBmYWlsZWQgISAoMHhFNDA9MHglMDhYLCAweDdDMD0weCUwOFgpXG4iLAorCQkJUlJFRzMyKFJfMDAwRTQwX1JCQk1fU1RBVFVTKSwKKwkJCVJSRUczMihSXzAwMDdDMF9DUF9TVEFUKSk7CisJfQorCS8qIGNoZWNrIGlmIGNhcmRzIGFyZSBwb3N0ZWQgb3Igbm90ICovCisJaWYgKCFyYWRlb25fY2FyZF9wb3N0ZWQocmRldikgJiYgcmRldi0+YmlvcykgeworCQlEUk1fSU5GTygiR1BVIG5vdCBwb3N0ZWQuIHBvc3Rpbmcgbm93Li4uXG4iKTsKKwkJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7CisJfQorCS8qIEluaXRpYWxpemUgY2xvY2tzICovCisJcmFkZW9uX2dldF9jbG9ja19pbmZvKHJkZXYtPmRkZXYpOworCS8qIEdldCB2cmFtIGluZm9ybWF0aW9ucyAqLworCXI1MjBfdnJhbV9pbmZvKHJkZXYpOworCS8qIEluaXRpYWxpemUgbWVtb3J5IGNvbnRyb2xsZXIgKGFsc28gdGVzdCBBR1ApICovCisJciA9IHI0MjBfbWNfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJcnY1MTVfZGVidWdmcyhyZGV2KTsKKwkvKiBGZW5jZSBkcml2ZXIgKi8KKwlyID0gcmFkZW9uX2ZlbmNlX2RyaXZlcl9pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlyID0gcmFkZW9uX2lycV9rbXNfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJLyogTWVtb3J5IG1hbmFnZXIgKi8KKwlyID0gcmFkZW9uX29iamVjdF9pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlyID0gcnYzNzBfcGNpZV9nYXJ0X2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXJ2NTE1X3NldF9zYWZlX3JlZ2lzdGVycyhyZGV2KTsKKwlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKKwlyID0gcjUyMF9zdGFydHVwKHJkZXYpOworCWlmIChyKSB7CisJCS8qIFNvbWV0aGluZ3Mgd2FudCB3cm9udCB3aXRoIHRoZSBhY2NlbCBpbml0IHN0b3AgYWNjZWwgKi8KKwkJZGV2X2VycihyZGV2LT5kZXYsICJEaXNhYmxpbmcgR1BVIGFjY2VsZXJhdGlvblxuIik7CisJCXJ2NTE1X3N1c3BlbmQocmRldik7CisJCXIxMDBfY3BfZmluaShyZGV2KTsKKwkJcjEwMF93Yl9maW5pKHJkZXYpOworCQlyMTAwX2liX2ZpbmkocmRldik7CisJCXJ2MzcwX3BjaWVfZ2FydF9maW5pKHJkZXYpOworCQlyYWRlb25fYWdwX2ZpbmkocmRldik7CisJCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CisJCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKKwl9CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MjBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MjBkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhZjYxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUyMGQuaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IDIwMDkgSmVyb21lIEdsaXNzZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBEYXZlIEFpcmxpZQorICogICAgICAgICAgQWxleCBEZXVjaGVyCisgKiAgICAgICAgICBKZXJvbWUgR2xpc3NlCisgKi8KKyNpZm5kZWYgX19SNTIwRF9IX18KKyNkZWZpbmUgX19SNTIwRF9IX18KKworLyogUmVnaXN0ZXJzICovCisjZGVmaW5lIFJfMDAwMEY4X0NPTkZJR19NRU1TSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEY4CisjZGVmaW5lICAgU18wMDAwRjhfQ09ORklHX01FTVNJWkUoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkZGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMEY4X0NPTkZJR19NRU1TSVpFKHgpICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGRkZGRikKKyNkZWZpbmUgICBDXzAwMDBGOF9DT05GSUdfTUVNU0laRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFJfMDAwMTM0X0hEUF9GQl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTM0CisjZGVmaW5lICAgU18wMDAxMzRfSERQX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAxMzRfSERQX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkYpCisjZGVmaW5lICAgQ18wMDAxMzRfSERQX0ZCX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSBSXzAwMDdDMF9DUF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDdDMAorI2RlZmluZSAgIFNfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX01SVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMSkKKyNkZWZpbmUgICBHXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9NV1VfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZECisjZGVmaW5lICAgU18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIpCisjZGVmaW5lICAgR18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfUlNJVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGQgorI2RlZmluZSAgIFNfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzKQorI2RlZmluZSAgIEdfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX1JDSVVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjcKKyNkZWZpbmUgICBTXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOSkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSA+PiA5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGREZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZGQkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX1BSSU1BUllfQlVTWSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDExKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9QUklNQVJZX0JVU1koeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDExKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGN0ZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NJX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEzKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTSV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0lfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZERkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE0KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDE0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1QyX0JVU1kgICAgICAgICAgICAgICAgICAweEZGRkZCRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE1KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDE1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1QyX0JVU1kgICAgICAgICAgICAgICAgICAweEZGRkY3RkZGCisjZGVmaW5lICAgU18wMDA3QzBfR1VJRE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQorI2RlZmluZSAgIEdfMDAwN0MwX0dVSURNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9HVUlETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweEVGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfVklERE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI5KQorI2RlZmluZSAgIEdfMDAwN0MwX1ZJRERNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9WSURETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NNRFNUUk1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DTURTVFJNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1BfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQorI2RlZmluZSAgIEdfMDAwN0MwX0NQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCisjZGVmaW5lIFJfMDAwRTQwX1JCQk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTQwCisjZGVmaW5lICAgU18wMDBFNDBfQ01ERklGT19BVkFJTCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDdGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwRTQwX0NNREZJRk9fQVZBSUwoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHg3RikKKyNkZWZpbmUgICBDXzAwMEU0MF9DTURGSUZPX0FWQUlMICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRjgwCisjZGVmaW5lICAgU18wMDBFNDBfSElSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDgpCisjZGVmaW5lICAgR18wMDBFNDBfSElSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfSElSUV9PTl9SQkIgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkVGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NQUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA5KQorI2RlZmluZSAgIEdfMDAwRTQwX0NQUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZERkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRlJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTApCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZCRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9ISVJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTEpCisjZGVmaW5lICAgR18wMDBFNDBfSElSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0hJUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkY3RkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUFJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTIpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkVGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRlJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTMpCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkRGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRl9QSVBFX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZfUElQRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGX1BJUEVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9FTkdfRVZfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTUpCisjZGVmaW5lICAgR18wMDBFNDBfRU5HX0VWX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0VOR19FVl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjdGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUF9DTURTVFJNX0JVU1koeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQX0NNRFNUUk1fQlVTWSAgICAgICAgICAgICAgICAgICAgIDB4RkZGRUZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9FMl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTcpCisjZGVmaW5lICAgR18wMDBFNDBfRTJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0UyX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGREZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQjJEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTgpCisjZGVmaW5lICAgR18wMDBFNDBfUkIyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCMkRfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGQkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQjNEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTkpCisjZGVmaW5lICAgR18wMDBFNDBfUkIzRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCM0RfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGN0ZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9WQVBfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDBFNDBfVkFQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1ZBUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDBFNDBfUkVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9UQU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjIpCisjZGVmaW5lICAgR18wMDBFNDBfVEFNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RBTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZCRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9URE1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjMpCisjZGVmaW5lICAgR18wMDBFNDBfVERNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RETV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkY3RkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9QQl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDBFNDBfUEJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1BCX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9USU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDBFNDBfVElNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RJTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9HQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjYpCisjZGVmaW5lICAgR18wMDBFNDBfR0FfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0dBX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkJGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DQkEyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjcpCisjZGVmaW5lICAgR18wMDBFNDBfQ0JBMkRfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NCQTJEX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjdGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQkJNX0hJQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjgpCisjZGVmaW5lICAgR18wMDBFNDBfUkJCTV9ISUJVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCQk1fSElCVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9TS0lEX0NGQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjkpCisjZGVmaW5lICAgR18wMDBFNDBfU0tJRF9DRkJVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1NLSURfQ0ZCVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4REZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9WQVBfVkZfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzApCisjZGVmaW5lICAgR18wMDBFNDBfVkFQX1ZGX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1ZBUF9WRl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9HVUlfQUNUSVZFKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lICAgR18wMDBFNDBfR1VJX0FDVElWRSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0dVSV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKKworCisjZGVmaW5lIFJfMDAwMDA0X01DX0ZCX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0CisjZGVmaW5lICAgU18wMDAwMDRfTUNfRkJfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAwMDRfTUNfRkJfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkYpCisjZGVmaW5lICAgQ18wMDAwMDRfTUNfRkJfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSAgIFNfMDAwMDA0X01DX0ZCX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwMDAwNF9NQ19GQl9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweEZGRkYpCisjZGVmaW5lICAgQ18wMDAwMDRfTUNfRkJfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBSXzAwMDAwNV9NQ19BR1BfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAweDAwMDAwNQorI2RlZmluZSAgIFNfMDAwMDA1X01DX0FHUF9TVEFSVCh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDA1X01DX0FHUF9TVEFSVCh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMDA1X01DX0FHUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgICBTXzAwMDAwNV9NQ19BR1BfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMTYpCisjZGVmaW5lICAgR18wMDAwMDVfTUNfQUdQX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMDA1X01DX0FHUF9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgUl8wMDAwMDZfQUdQX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYKKyNkZWZpbmUgICBTXzAwMDAwNl9BR1BfQkFTRV9BRERSKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRkZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAwMDZfQUdQX0JBU0VfQUREUih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkZGRkZGKQorI2RlZmluZSAgIENfMDAwMDA2X0FHUF9CQVNFX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUl8wMDAwMDdfQUdQX0JBU0VfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcKKyNkZWZpbmUgICBTXzAwMDAwN19BR1BfQkFTRV9BRERSXzIoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDAwN19BR1BfQkFTRV9BRERSXzIoeCkgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RikKKyNkZWZpbmUgICBDXzAwMDAwN19BR1BfQkFTRV9BRERSXzIgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkYwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYwppbmRleCBlYWIzMWMxLi42MDk3MTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYwpAQCAtMzMsOCArMzMsOCBAQAogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgInJhZGVvbl9tb2RlLmgiCiAjaW5jbHVkZSAicjYwMGQuaCIKLSNpbmNsdWRlICJhdml2b2QuaCIKICNpbmNsdWRlICJhdG9tLmgiCisjaW5jbHVkZSAiYXZpdm9kLmgiCiAKICNkZWZpbmUgUEZQX1VDT0RFX1NJWkUgNTc2CiAjZGVmaW5lIFBNNF9VQ09ERV9TSVpFIDE3OTIKQEAgLTY1LDE2ICs2NSwxMSBAQAogCiBpbnQgcjYwMF9kZWJ1Z2ZzX21jX2luZm9faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKLS8qIFRoaXMgZmlsZXMgZ2F0aGVyIGZ1bmN0aW9ucyBzcGVjaWZpY3MgdG86Ci0gKiByNjAwLHJ2NjEwLHJ2NjMwLHJ2NjIwLHJ2NjM1LHJ2NjcwCi0gKgotICogU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgbWlnaHQgYmUgdXNlZCBieSBuZXdlciBBU0lDcy4KLSAqLworLyogcjYwMCxydjYxMCxydjYzMCxydjYyMCxydjYzNSxydjY3MCAqLwogaW50IHI2MDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHI2MDBfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByNjAwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCi0KIC8qCiAgKiBSNjAwIFBDSUUgR0FSVAogICovCkBAIC0xNjgsNyArMTYzLDcgQEAKIAlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9SRF9TRU1fQ05UTCwgdG1wIHwgRU5BQkxFX1NFTUFQSE9SRV9NT0RFKTsKIAlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9XUl9TRU1fQ05UTCwgdG1wIHwgRU5BQkxFX1NFTUFQSE9SRV9NT0RFKTsKIAlXUkVHMzIoVk1fQ09OVEVYVDBfUEFHRV9UQUJMRV9TVEFSVF9BRERSLCByZGV2LT5tYy5ndHRfc3RhcnQgPj4gMTIpOwotCVdSRUczMihWTV9DT05URVhUMF9QQUdFX1RBQkxFX0VORF9BRERSLCAocmRldi0+bWMuZ3R0X2VuZCAtIDEpID4+IDEyKTsKKwlXUkVHMzIoVk1fQ09OVEVYVDBfUEFHRV9UQUJMRV9FTkRfQUREUiwgcmRldi0+bWMuZ3R0X2VuZCA+PiAxMik7CiAJV1JFRzMyKFZNX0NPTlRFWFQwX1BBR0VfVEFCTEVfQkFTRV9BRERSLCByZGV2LT5nYXJ0LnRhYmxlX2FkZHIgPj4gMTIpOwogCVdSRUczMihWTV9DT05URVhUMF9DTlRMLCBFTkFCTEVfQ09OVEVYVCB8IFBBR0VfVEFCTEVfREVQVEgoMCkgfAogCQkJCVJBTkdFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RFRkFVTFQpOwpAQCAtMjI1LDYgKzIyMCw0MCBAQAogCXJhZGVvbl9nYXJ0X2ZpbmkocmRldik7CiB9CiAKK3ZvaWQgcjYwMF9hZ3BfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiB0bXA7CisJaW50IGk7CisKKwkvKiBTZXR1cCBMMiBjYWNoZSAqLworCVdSRUczMihWTV9MMl9DTlRMLCBFTkFCTEVfTDJfQ0FDSEUgfCBFTkFCTEVfTDJfRlJBR01FTlRfUFJPQ0VTU0lORyB8CisJCQkJRU5BQkxFX0wyX1BURV9DQUNIRV9MUlVfVVBEQVRFX0JZX1dSSVRFIHwKKwkJCQlFRkZFQ1RJVkVfTDJfUVVFVUVfU0laRSg3KSk7CisJV1JFRzMyKFZNX0wyX0NOVEwyLCAwKTsKKwlXUkVHMzIoVk1fTDJfQ05UTDMsIEJBTktfU0VMRUNUXzAoMCkgfCBCQU5LX1NFTEVDVF8xKDEpKTsKKwkvKiBTZXR1cCBUTEIgY29udHJvbCAqLworCXRtcCA9IEVOQUJMRV9MMV9UTEIgfCBFTkFCTEVfTDFfRlJBR01FTlRfUFJPQ0VTU0lORyB8CisJCVNZU1RFTV9BQ0NFU1NfTU9ERV9OT1RfSU5fU1lTIHwKKwkJRUZGRUNUSVZFX0wxX1RMQl9TSVpFKDUpIHwgRUZGRUNUSVZFX0wxX1FVRVVFX1NJWkUoNSkgfAorCQlFTkFCTEVfV0FJVF9MMl9RVUVSWTsKKwlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9SRF9TWVNfQ05UTCwgdG1wKTsKKwlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9XUl9TWVNfQ05UTCwgdG1wKTsKKwlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9SRF9IRFBfQ05UTCwgdG1wIHwgRU5BQkxFX0wxX1NUUklDVF9PUkRFUklORyk7CisJV1JFRzMyKE1DX1ZNX0wxX1RMQl9NQ0JfV1JfSERQX0NOVEwsIHRtcCk7CisJV1JFRzMyKE1DX1ZNX0wxX1RMQl9NQ0RfUkRfQV9DTlRMLCB0bXApOworCVdSRUczMihNQ19WTV9MMV9UTEJfTUNEX1dSX0FfQ05UTCwgdG1wKTsKKwlXUkVHMzIoTUNfVk1fTDFfVExCX01DRF9SRF9CX0NOVEwsIHRtcCk7CisJV1JFRzMyKE1DX1ZNX0wxX1RMQl9NQ0RfV1JfQl9DTlRMLCB0bXApOworCVdSRUczMihNQ19WTV9MMV9UTEJfTUNCX1JEX0dGWF9DTlRMLCB0bXApOworCVdSRUczMihNQ19WTV9MMV9UTEJfTUNCX1dSX0dGWF9DTlRMLCB0bXApOworCVdSRUczMihNQ19WTV9MMV9UTEJfTUNCX1JEX1BETUFfQ05UTCwgdG1wKTsKKwlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9XUl9QRE1BX0NOVEwsIHRtcCk7CisJV1JFRzMyKE1DX1ZNX0wxX1RMQl9NQ0JfUkRfU0VNX0NOVEwsIHRtcCB8IEVOQUJMRV9TRU1BUEhPUkVfTU9ERSk7CisJV1JFRzMyKE1DX1ZNX0wxX1RMQl9NQ0JfV1JfU0VNX0NOVEwsIHRtcCB8IEVOQUJMRV9TRU1BUEhPUkVfTU9ERSk7CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJV1JFRzMyKFZNX0NPTlRFWFQwX0NOVEwgKyAoaSAqIDQpLCAwKTsKK30KKwogaW50IHI2MDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1bnNpZ25lZCBpOwpAQCAtMjQwLDE0ICsyNjksOSBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHZvaWQgcjYwMF9tY19yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgdm9pZCByNjAwX21jX3Byb2dyYW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JdTMyIGQxdmdhX2NvbnRyb2wsIGQydmdhX2NvbnRyb2w7Ci0JdTMyIHZnYV9yZW5kZXJfY29udHJvbCwgdmdhX2hkcF9jb250cm9sOwotCXUzMiBkMWNydGNfY29udHJvbCwgZDJjcnRjX2NvbnRyb2w7Ci0JdTMyIG5ld19kMWdycGhfcHJpbWFyeSwgbmV3X2QxZ3JwaF9zZWNvbmRhcnk7Ci0JdTMyIG5ld19kMmdycGhfcHJpbWFyeSwgbmV3X2QyZ3JwaF9zZWNvbmRhcnk7Ci0JdTY0IG9sZF92cmFtX3N0YXJ0OworCXN0cnVjdCBydjUxNV9tY19zYXZlIHNhdmU7CiAJdTMyIHRtcDsKIAlpbnQgaSwgajsKIApAQCAtMjYxLDg4ICsyODUsNTQgQEAKIAl9CiAJV1JFRzMyKEhEUF9SRUdfQ09IRVJFTkNZX0ZMVVNIX0NOVEwsIDApOwogCi0JZDF2Z2FfY29udHJvbCA9IFJSRUczMihEMVZHQV9DT05UUk9MKTsKLQlkMnZnYV9jb250cm9sID0gUlJFRzMyKEQyVkdBX0NPTlRST0wpOwotCXZnYV9yZW5kZXJfY29udHJvbCA9IFJSRUczMihWR0FfUkVOREVSX0NPTlRST0wpOwotCXZnYV9oZHBfY29udHJvbCA9IFJSRUczMihWR0FfSERQX0NPTlRST0wpOwotCWQxY3J0Y19jb250cm9sID0gUlJFRzMyKEQxQ1JUQ19DT05UUk9MKTsKLQlkMmNydGNfY29udHJvbCA9IFJSRUczMihEMkNSVENfQ09OVFJPTCk7Ci0Jb2xkX3ZyYW1fc3RhcnQgPSAodTY0KShSUkVHMzIoTUNfVk1fRkJfTE9DQVRJT04pICYgMHhGRkZGKSA8PCAyNDsKLQluZXdfZDFncnBoX3ByaW1hcnkgPSBSUkVHMzIoRDFHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTKTsKLQluZXdfZDFncnBoX3NlY29uZGFyeSA9IFJSRUczMihEMUdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyk7Ci0JbmV3X2QxZ3JwaF9wcmltYXJ5ICs9IHJkZXYtPm1jLnZyYW1fc3RhcnQgLSBvbGRfdnJhbV9zdGFydDsKLQluZXdfZDFncnBoX3NlY29uZGFyeSArPSByZGV2LT5tYy52cmFtX3N0YXJ0IC0gb2xkX3ZyYW1fc3RhcnQ7Ci0JbmV3X2QyZ3JwaF9wcmltYXJ5ID0gUlJFRzMyKEQyR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyk7Ci0JbmV3X2QyZ3JwaF9zZWNvbmRhcnkgPSBSUkVHMzIoRDJHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MpOwotCW5ld19kMmdycGhfcHJpbWFyeSArPSByZGV2LT5tYy52cmFtX3N0YXJ0IC0gb2xkX3ZyYW1fc3RhcnQ7Ci0JbmV3X2QyZ3JwaF9zZWNvbmRhcnkgKz0gcmRldi0+bWMudnJhbV9zdGFydCAtIG9sZF92cmFtX3N0YXJ0OwotCi0JLyogU3RvcCBhbGwgdmlkZW8gKi8KLQlXUkVHMzIoRDFWR0FfQ09OVFJPTCwgMCk7Ci0JV1JFRzMyKEQyVkdBX0NPTlRST0wsIDApOwotCVdSRUczMihWR0FfUkVOREVSX0NPTlRST0wsIDApOwotCVdSRUczMihEMUNSVENfVVBEQVRFX0xPQ0ssIDEpOwotCVdSRUczMihEMkNSVENfVVBEQVRFX0xPQ0ssIDEpOwotCVdSRUczMihEMUNSVENfQ09OVFJPTCwgMCk7Ci0JV1JFRzMyKEQyQ1JUQ19DT05UUk9MLCAwKTsKLQlXUkVHMzIoRDFDUlRDX1VQREFURV9MT0NLLCAwKTsKLQlXUkVHMzIoRDJDUlRDX1VQREFURV9MT0NLLCAwKTsKLQotCW1kZWxheSgxKTsKKwlydjUxNV9tY19zdG9wKHJkZXYsICZzYXZlKTsKIAlpZiAocjYwMF9tY193YWl0X2Zvcl9pZGxlKHJkZXYpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIltkcm1dIE1DIG5vdCBpZGxlICFcbiIpOworCQlkZXZfd2FybihyZGV2LT5kZXYsICJXYWl0IGZvciBNQyBpZGxlIHRpbWVkb3V0ICFcbiIpOwogCX0KLQotCS8qIExvY2tvdXQgYWNjZXNzIHRocm91Z2ggVkdBIGFwZXJ0dXJlKi8KKwkvKiBMb2Nrb3V0IGFjY2VzcyB0aHJvdWdoIFZHQSBhcGVydHVyZSAoZG9lc24ndCBleGlzdCBiZWZvcmUgUjYwMCkgKi8KIAlXUkVHMzIoVkdBX0hEUF9DT05UUk9MLCBWR0FfTUVNT1JZX0RJU0FCTEUpOwotCiAJLyogVXBkYXRlIGNvbmZpZ3VyYXRpb24gKi8KLQlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0xPV19BRERSLCByZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDEyKTsKLQlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0hJR0hfQUREUiwgKHJkZXYtPm1jLnZyYW1fZW5kIC0gMSkgPj4gMTIpOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKKwkJaWYgKHJkZXYtPm1jLnZyYW1fc3RhcnQgPCByZGV2LT5tYy5ndHRfc3RhcnQpIHsKKwkJCS8qIFZSQU0gYmVmb3JlIEFHUCAqLworCQkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9MT1dfQUREUiwKKwkJCQlyZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDEyKTsKKwkJCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfSElHSF9BRERSLAorCQkJCXJkZXYtPm1jLmd0dF9lbmQgPj4gMTIpOworCQl9IGVsc2UgeworCQkJLyogVlJBTSBhZnRlciBBR1AgKi8KKwkJCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfTE9XX0FERFIsCisJCQkJcmRldi0+bWMuZ3R0X3N0YXJ0ID4+IDEyKTsKKwkJCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfSElHSF9BRERSLAorCQkJCXJkZXYtPm1jLnZyYW1fZW5kID4+IDEyKTsKKwkJfQorCX0gZWxzZSB7CisJCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfTE9XX0FERFIsIHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTIpOworCQlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0hJR0hfQUREUiwgcmRldi0+bWMudnJhbV9lbmQgPj4gMTIpOworCX0KIAlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0RFRkFVTFRfQUREUiwgMCk7Ci0JdG1wID0gKCgocmRldi0+bWMudnJhbV9lbmQgLSAxKSA+PiAyNCkgJiAweEZGRkYpIDw8IDE2OworCXRtcCA9ICgocmRldi0+bWMudnJhbV9lbmQgPj4gMjQpICYgMHhGRkZGKSA8PCAxNjsKIAl0bXAgfD0gKChyZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDI0KSAmIDB4RkZGRik7CiAJV1JFRzMyKE1DX1ZNX0ZCX0xPQ0FUSU9OLCB0bXApOwogCVdSRUczMihIRFBfTk9OU1VSRkFDRV9CQVNFLCAocmRldi0+bWMudnJhbV9zdGFydCA+PiA4KSk7CiAJV1JFRzMyKEhEUF9OT05TVVJGQUNFX0lORk8sICgyIDw8IDcpKTsKLQlXUkVHMzIoSERQX05PTlNVUkZBQ0VfU0laRSwgKHJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSAtIDEpIHwgMHgzRkYpOworCVdSRUczMihIRFBfTk9OU1VSRkFDRV9TSVpFLCByZGV2LT5tYy5tY192cmFtX3NpemUgfCAweDNGRik7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewotCQlXUkVHMzIoTUNfVk1fQUdQX1RPUCwgKHJkZXYtPm1jLmd0dF9lbmQgLSAxKSA+PiAxNik7Ci0JCVdSRUczMihNQ19WTV9BR1BfQk9ULCByZGV2LT5tYy5ndHRfc3RhcnQgPj4gMTYpOworCQlXUkVHMzIoTUNfVk1fQUdQX1RPUCwgcmRldi0+bWMuZ3R0X2VuZCA+PiAyMik7CisJCVdSRUczMihNQ19WTV9BR1BfQk9ULCByZGV2LT5tYy5ndHRfc3RhcnQgPj4gMjIpOwogCQlXUkVHMzIoTUNfVk1fQUdQX0JBU0UsIHJkZXYtPm1jLmFncF9iYXNlID4+IDIyKTsKIAl9IGVsc2UgewogCQlXUkVHMzIoTUNfVk1fQUdQX0JBU0UsIDApOwogCQlXUkVHMzIoTUNfVk1fQUdQX1RPUCwgMHgwRkZGRkZGRik7CiAJCVdSRUczMihNQ19WTV9BR1BfQk9ULCAweDBGRkZGRkZGKTsKIAl9Ci0JV1JFRzMyKEQxR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUywgbmV3X2QxZ3JwaF9wcmltYXJ5KTsKLQlXUkVHMzIoRDFHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MsIG5ld19kMWdycGhfc2Vjb25kYXJ5KTsKLQlXUkVHMzIoRDJHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTLCBuZXdfZDJncnBoX3ByaW1hcnkpOwotCVdSRUczMihEMkdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUywgbmV3X2QyZ3JwaF9zZWNvbmRhcnkpOwotCVdSRUczMihWR0FfTUVNT1JZX0JBU0VfQUREUkVTUywgcmRldi0+bWMudnJhbV9zdGFydCk7Ci0KLQkvKiBVbmxvY2sgaG9zdCBhY2Nlc3MgKi8KLQlXUkVHMzIoVkdBX0hEUF9DT05UUk9MLCB2Z2FfaGRwX2NvbnRyb2wpOwotCi0JbWRlbGF5KDEpOwogCWlmIChyNjAwX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiW2RybV0gTUMgbm90IGlkbGUgIVxuIik7CisJCWRldl93YXJuKHJkZXYtPmRldiwgIldhaXQgZm9yIE1DIGlkbGUgdGltZWRvdXQgIVxuIik7CiAJfQotCi0JLyogUmVzdG9yZSB2aWRlbyBzdGF0ZSAqLwotCVdSRUczMihEMUNSVENfVVBEQVRFX0xPQ0ssIDEpOwotCVdSRUczMihEMkNSVENfVVBEQVRFX0xPQ0ssIDEpOwotCVdSRUczMihEMUNSVENfQ09OVFJPTCwgZDFjcnRjX2NvbnRyb2wpOwotCVdSRUczMihEMkNSVENfQ09OVFJPTCwgZDJjcnRjX2NvbnRyb2wpOwotCVdSRUczMihEMUNSVENfVVBEQVRFX0xPQ0ssIDApOwotCVdSRUczMihEMkNSVENfVVBEQVRFX0xPQ0ssIDApOwotCVdSRUczMihEMVZHQV9DT05UUk9MLCBkMXZnYV9jb250cm9sKTsKLQlXUkVHMzIoRDJWR0FfQ09OVFJPTCwgZDJ2Z2FfY29udHJvbCk7Ci0JV1JFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCwgdmdhX3JlbmRlcl9jb250cm9sKTsKLQorCXJ2NTE1X21jX3Jlc3VtZShyZGV2LCAmc2F2ZSk7CiAJLyogd2UgbmVlZCB0byBvd24gVlJBTSwgc28gdHVybiBvZmYgdGhlIFZHQSByZW5kZXJlciBoZXJlCiAJICogdG8gc3RvcCBpdCBvdmVyd3JpdGluZyBvdXIgb2JqZWN0cyAqLwotCXJhZGVvbl9hdml2b192Z2FfcmVuZGVyX2Rpc2FibGUocmRldik7CisJcnY1MTVfdmdhX3JlbmRlcl9kaXNhYmxlKHJkZXYpOwogfQogCiBpbnQgcjYwMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMzgwLDYgKzM3MCwxMyBAQAogCS8qIFNldHVwIEdQVSBtZW1vcnkgc3BhY2UgKi8KIAlyZGV2LT5tYy5tY192cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpOwogCXJkZXYtPm1jLnJlYWxfdnJhbV9zaXplID0gUlJFRzMyKENPTkZJR19NRU1TSVpFKTsKKworCWlmIChyZGV2LT5tYy5tY192cmFtX3NpemUgPiByZGV2LT5tYy5hcGVyX3NpemUpCisJCXJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLmFwZXJfc2l6ZTsKKworCWlmIChyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA+IHJkZXYtPm1jLmFwZXJfc2l6ZSkKKwkJcmRldi0+bWMucmVhbF92cmFtX3NpemUgPSByZGV2LT5tYy5hcGVyX3NpemU7CisKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CiAJCXIgPSByYWRlb25fYWdwX2luaXQocmRldik7CiAJCWlmIChyKQpAQCAtNDM4LDkgKzQzNSw5IEBACiAJCX0KIAl9CiAJcmRldi0+bWMudnJhbV9zdGFydCA9IHJkZXYtPm1jLnZyYW1fbG9jYXRpb247Ci0JcmRldi0+bWMudnJhbV9lbmQgPSByZGV2LT5tYy52cmFtX2xvY2F0aW9uICsgcmRldi0+bWMubWNfdnJhbV9zaXplOworCXJkZXYtPm1jLnZyYW1fZW5kID0gcmRldi0+bWMudnJhbV9sb2NhdGlvbiArIHJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSAtIDE7CiAJcmRldi0+bWMuZ3R0X3N0YXJ0ID0gcmRldi0+bWMuZ3R0X2xvY2F0aW9uOwotCXJkZXYtPm1jLmd0dF9lbmQgPSByZGV2LT5tYy5ndHRfbG9jYXRpb24gKyByZGV2LT5tYy5ndHRfc2l6ZTsKKwlyZGV2LT5tYy5ndHRfZW5kID0gcmRldi0+bWMuZ3R0X2xvY2F0aW9uICsgcmRldi0+bWMuZ3R0X3NpemUgLSAxOwogCS8qIEZJWE1FOiB3ZSBzaG91bGQgZW5mb3JjZSBkZWZhdWx0IGNsb2NrIGluIGNhc2UgR1BVIGlzIG5vdCBpbgogCSAqIGRlZmF1bHQgc2V0dXAKIAkgKi8KQEAgLTQ1Niw2ICs0NTMsNyBAQAogICovCiBpbnQgcjYwMF9ncHVfc29mdF9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSBzYXZlOwogCXUzMiBncmJtX2J1c3lfbWFzayA9IFNfMDA4MDEwX1ZDX0JVU1koMSkgfCBTXzAwODAxMF9WR1RfQlVTWV9OT19ETUEoMSkgfAogCQkJCVNfMDA4MDEwX1ZHVF9CVVNZKDEpIHwgU18wMDgwMTBfVEEwM19CVVNZKDEpIHwKIAkJCQlTXzAwODAxMF9UQ19CVVNZKDEpIHwgU18wMDgwMTBfU1hfQlVTWSgxKSB8CkBAIC00NzMsMTMgKzQ3MSwyNSBAQAogCQkJU18wMDgwMTRfQ0IwX0JVU1koMSkgfCBTXzAwODAxNF9DQjFfQlVTWSgxKSB8CiAJCQlTXzAwODAxNF9DQjJfQlVTWSgxKSB8IFNfMDA4MDE0X0NCM19CVVNZKDEpOwogCXUzMiBzcmJtX3Jlc2V0ID0gMDsKKwl1MzIgdG1wOwogCisJZGV2X2luZm8ocmRldi0+ZGV2LCAiR1BVIHNvZnRyZXNldCBcbiIpOworCWRldl9pbmZvKHJkZXYtPmRldiwgIiAgUl8wMDgwMTBfR1JCTV9TVEFUVVM9MHglMDhYXG4iLAorCQlSUkVHMzIoUl8wMDgwMTBfR1JCTV9TVEFUVVMpKTsKKwlkZXZfaW5mbyhyZGV2LT5kZXYsICIgIFJfMDA4MDE0X0dSQk1fU1RBVFVTMj0weCUwOFhcbiIsCisJCVJSRUczMihSXzAwODAxNF9HUkJNX1NUQVRVUzIpKTsKKwlkZXZfaW5mbyhyZGV2LT5kZXYsICIgIFJfMDAwRTUwX1NSQk1fU1RBVFVTPTB4JTA4WFxuIiwKKwkJUlJFRzMyKFJfMDAwRTUwX1NSQk1fU1RBVFVTKSk7CisJcnY1MTVfbWNfc3RvcChyZGV2LCAmc2F2ZSk7CisJaWYgKHI2MDBfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsICJXYWl0IGZvciBNQyBpZGxlIHRpbWVkb3V0ICFcbiIpOworCX0KIAkvKiBEaXNhYmxlIENQIHBhcnNpbmcvcHJlZmV0Y2hpbmcgKi8KIAlXUkVHMzIoUl8wMDg2RDhfQ1BfTUVfQ05UTCwgU18wMDg2RDhfQ1BfTUVfSEFMVCgweGZmKSk7CiAJLyogQ2hlY2sgaWYgYW55IG9mIHRoZSByZW5kZXJpbmcgYmxvY2sgaXMgYnVzeSBhbmQgcmVzZXQgaXQgKi8KIAlpZiAoKFJSRUczMihSXzAwODAxMF9HUkJNX1NUQVRVUykgJiBncmJtX2J1c3lfbWFzaykgfHwKIAkgICAgKFJSRUczMihSXzAwODAxNF9HUkJNX1NUQVRVUzIpICYgZ3JibTJfYnVzeV9tYXNrKSkgewotCQlXUkVHMzIoUl8wMDgwMjBfR1JCTV9TT0ZUX1JFU0VULCBTXzAwODAyMF9TT0ZUX1JFU0VUX0NSKDEpIHwKKwkJdG1wID0gU18wMDgwMjBfU09GVF9SRVNFVF9DUigxKSB8CiAJCQlTXzAwODAyMF9TT0ZUX1JFU0VUX0RCKDEpIHwKIAkJCVNfMDA4MDIwX1NPRlRfUkVTRVRfQ0IoMSkgfAogCQkJU18wMDgwMjBfU09GVF9SRVNFVF9QQSgxKSB8CkBAIC00OTEsMTQgKzUwMSwxOCBAQAogCQkJU18wMDgwMjBfU09GVF9SRVNFVF9UQygxKSB8CiAJCQlTXzAwODAyMF9TT0ZUX1JFU0VUX1RBKDEpIHwKIAkJCVNfMDA4MDIwX1NPRlRfUkVTRVRfVkMoMSkgfAotCQkJU18wMDgwMjBfU09GVF9SRVNFVF9WR1QoMSkpOworCQkJU18wMDgwMjBfU09GVF9SRVNFVF9WR1QoMSk7CisJCWRldl9pbmZvKHJkZXYtPmRldiwgIiAgUl8wMDgwMjBfR1JCTV9TT0ZUX1JFU0VUPTB4JTA4WFxuIiwgdG1wKTsKKwkJV1JFRzMyKFJfMDA4MDIwX0dSQk1fU09GVF9SRVNFVCwgdG1wKTsKIAkJKHZvaWQpUlJFRzMyKFJfMDA4MDIwX0dSQk1fU09GVF9SRVNFVCk7CiAJCXVkZWxheSg1MCk7CiAJCVdSRUczMihSXzAwODAyMF9HUkJNX1NPRlRfUkVTRVQsIDApOwogCQkodm9pZClSUkVHMzIoUl8wMDgwMjBfR1JCTV9TT0ZUX1JFU0VUKTsKIAl9CiAJLyogUmVzZXQgQ1AgKHdlIGFsd2F5cyByZXNldCBDUCkgKi8KLQlXUkVHMzIoUl8wMDgwMjBfR1JCTV9TT0ZUX1JFU0VULCBTXzAwODAyMF9TT0ZUX1JFU0VUX0NQKDEpKTsKKwl0bXAgPSBTXzAwODAyMF9TT0ZUX1JFU0VUX0NQKDEpOworCWRldl9pbmZvKHJkZXYtPmRldiwgIlJfMDA4MDIwX0dSQk1fU09GVF9SRVNFVD0weCUwOFhcbiIsIHRtcCk7CisJV1JFRzMyKFJfMDA4MDIwX0dSQk1fU09GVF9SRVNFVCwgdG1wKTsKIAkodm9pZClSUkVHMzIoUl8wMDgwMjBfR1JCTV9TT0ZUX1JFU0VUKTsKIAl1ZGVsYXkoNTApOwogCVdSRUczMihSXzAwODAyMF9HUkJNX1NPRlRfUkVTRVQsIDApOwpAQCAtNTI2LDYgKzU0MCwxNCBAQAogCQlzcmJtX3Jlc2V0IHw9IFNfMDAwRTYwX1NPRlRfUkVTRVRfUkxDKDEpOwogCWlmIChHXzAwMEU1MF9TRU1fQlVTWShSUkVHMzIoUl8wMDBFNTBfU1JCTV9TVEFUVVMpKSkKIAkJc3JibV9yZXNldCB8PSBTXzAwMEU2MF9TT0ZUX1JFU0VUX1NFTSgxKTsKKwlpZiAoR18wMDBFNTBfQklGX0JVU1koUlJFRzMyKFJfMDAwRTUwX1NSQk1fU1RBVFVTKSkpCisJCXNyYm1fcmVzZXQgfD0gU18wMDBFNjBfU09GVF9SRVNFVF9CSUYoMSk7CisJZGV2X2luZm8ocmRldi0+ZGV2LCAiICBSXzAwMEU2MF9TUkJNX1NPRlRfUkVTRVQ9MHglMDhYXG4iLCBzcmJtX3Jlc2V0KTsKKwlXUkVHMzIoUl8wMDBFNjBfU1JCTV9TT0ZUX1JFU0VULCBzcmJtX3Jlc2V0KTsKKwkodm9pZClSUkVHMzIoUl8wMDBFNjBfU1JCTV9TT0ZUX1JFU0VUKTsKKwl1ZGVsYXkoNTApOworCVdSRUczMihSXzAwMEU2MF9TUkJNX1NPRlRfUkVTRVQsIDApOworCSh2b2lkKVJSRUczMihSXzAwMEU2MF9TUkJNX1NPRlRfUkVTRVQpOwogCVdSRUczMihSXzAwMEU2MF9TUkJNX1NPRlRfUkVTRVQsIHNyYm1fcmVzZXQpOwogCSh2b2lkKVJSRUczMihSXzAwMEU2MF9TUkJNX1NPRlRfUkVTRVQpOwogCXVkZWxheSg1MCk7CkBAIC01MzMsNiArNTU1LDE3IEBACiAJKHZvaWQpUlJFRzMyKFJfMDAwRTYwX1NSQk1fU09GVF9SRVNFVCk7CiAJLyogV2FpdCBhIGxpdHRsZSBmb3IgdGhpbmdzIHRvIHNldHRsZSBkb3duICovCiAJdWRlbGF5KDUwKTsKKwlkZXZfaW5mbyhyZGV2LT5kZXYsICIgIFJfMDA4MDEwX0dSQk1fU1RBVFVTPTB4JTA4WFxuIiwKKwkJUlJFRzMyKFJfMDA4MDEwX0dSQk1fU1RBVFVTKSk7CisJZGV2X2luZm8ocmRldi0+ZGV2LCAiICBSXzAwODAxNF9HUkJNX1NUQVRVUzI9MHglMDhYXG4iLAorCQlSUkVHMzIoUl8wMDgwMTRfR1JCTV9TVEFUVVMyKSk7CisJZGV2X2luZm8ocmRldi0+ZGV2LCAiICBSXzAwMEU1MF9TUkJNX1NUQVRVUz0weCUwOFhcbiIsCisJCVJSRUczMihSXzAwMEU1MF9TUkJNX1NUQVRVUykpOworCS8qIEFmdGVyIHJlc2V0IHdlIG5lZWQgdG8gcmVpbml0IHRoZSBhc2ljIGFzIEdQVSBvZnRlbiBlbmR1cCBpbiBhbgorCSAqIGluY29oZXJlbnQgc3RhdGUuCisJICovCisJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7CisJcnY1MTVfbWNfcmVzdW1lKHJkZXYsICZzYXZlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM0MywzMiArMTM3Niw0NyBAQAogCXJldHVybiByOwogfQogCi0vKgotICogV3JpdGViYWNrCi0gKi8KLWludCByNjAwX3diX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit2b2lkIHI2MDBfd2JfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlXUkVHMzIoU0NSQVRDSF9VTVNLLCAwKTsKKwlpZiAocmRldi0+d2Iud2Jfb2JqKSB7CisJCXJhZGVvbl9vYmplY3Rfa3VubWFwKHJkZXYtPndiLndiX29iaik7CisJCXJhZGVvbl9vYmplY3RfdW5waW4ocmRldi0+d2Iud2Jfb2JqKTsKKwl9Cit9CisKK3ZvaWQgcjYwMF93Yl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXI2MDBfd2JfZGlzYWJsZShyZGV2KTsKKwlpZiAocmRldi0+d2Iud2Jfb2JqKSB7CisJCXJhZGVvbl9vYmplY3RfdW5yZWYoJnJkZXYtPndiLndiX29iaik7CisJCXJkZXYtPndiLndiID0gTlVMTDsKKwkJcmRldi0+d2Iud2Jfb2JqID0gTlVMTDsKKwl9Cit9CisKK2ludCByNjAwX3diX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgcjsKIAogCWlmIChyZGV2LT53Yi53Yl9vYmogPT0gTlVMTCkgewotCQlyID0gcmFkZW9uX29iamVjdF9jcmVhdGUocmRldiwgTlVMTCwgNDA5NiwKLQkJCQkJIHRydWUsCi0JCQkJCSBSQURFT05fR0VNX0RPTUFJTl9HVFQsCi0JCQkJCSBmYWxzZSwgJnJkZXYtPndiLndiX29iaik7CisJCXIgPSByYWRlb25fb2JqZWN0X2NyZWF0ZShyZGV2LCBOVUxMLCA0MDk2LCB0cnVlLAorCQkJCVJBREVPTl9HRU1fRE9NQUlOX0dUVCwgZmFsc2UsICZyZGV2LT53Yi53Yl9vYmopOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBjcmVhdGUgV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCWRldl93YXJuKHJkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgV0IgYnVmZmVyICglZCkuXG4iLCByKTsKIAkJCXJldHVybiByOwogCQl9Ci0JCXIgPSByYWRlb25fb2JqZWN0X3BpbihyZGV2LT53Yi53Yl9vYmosCi0JCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fR1RULAotCQkJCSAgICAgICZyZGV2LT53Yi5ncHVfYWRkcik7CisJCXIgPSByYWRlb25fb2JqZWN0X3BpbihyZGV2LT53Yi53Yl9vYmosIFJBREVPTl9HRU1fRE9NQUlOX0dUVCwKKwkJCQkmcmRldi0+d2IuZ3B1X2FkZHIpOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBwaW4gV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCWRldl93YXJuKHJkZXYtPmRldiwgImZhaWxlZCB0byBwaW4gV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCXI2MDBfd2JfZmluaShyZGV2KTsKIAkJCXJldHVybiByOwogCQl9CiAJCXIgPSByYWRlb25fb2JqZWN0X2ttYXAocmRldi0+d2Iud2Jfb2JqLCAodm9pZCAqKikmcmRldi0+d2Iud2IpOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxlZCB0byBtYXAgV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCWRldl93YXJuKHJkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgV0IgYnVmZmVyICglZCkuXG4iLCByKTsKKwkJCXI2MDBfd2JfZmluaShyZGV2KTsKIAkJCXJldHVybiByOwogCQl9CiAJfQpAQCAtMTM3OSwyMSArMTQyNyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcjYwMF93Yl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCWlmIChyZGV2LT53Yi53Yl9vYmopIHsKLQkJcmFkZW9uX29iamVjdF9rdW5tYXAocmRldi0+d2Iud2Jfb2JqKTsKLQkJcmFkZW9uX29iamVjdF91bnBpbihyZGV2LT53Yi53Yl9vYmopOwotCQlyYWRlb25fb2JqZWN0X3VucmVmKCZyZGV2LT53Yi53Yl9vYmopOwotCQlyZGV2LT53Yi53YiA9IE5VTEw7Ci0JCXJkZXYtPndiLndiX29iaiA9IE5VTEw7Ci0JfQotfQotCi0KLS8qCi0gKiBDUwotICovCiB2b2lkIHI2MDBfZmVuY2VfcmluZ19lbWl0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkJICBzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSkKIHsKQEAgLTE0NzAsMTEgKzE1MDMsMTQgQEAKIHsKIAlpbnQgcjsKIAotCXI2MDBfZ3B1X3Jlc2V0KHJkZXYpOwotCXI2MDBfbWNfcmVzdW1lKHJkZXYpOwotCXIgPSByNjAwX3BjaWVfZ2FydF9lbmFibGUocmRldik7Ci0JaWYgKHIpCi0JCXJldHVybiByOworCXI2MDBfbWNfcHJvZ3JhbShyZGV2KTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CisJCXI2MDBfYWdwX2VuYWJsZShyZGV2KTsKKwl9IGVsc2UgeworCQlyID0gcjYwMF9wY2llX2dhcnRfZW5hYmxlKHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KIAlyNjAwX2dwdV9pbml0KHJkZXYpOwogCiAJciA9IHJhZGVvbl9vYmplY3RfcGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLApAQCAtMTQ5Myw5ICsxNTI5LDggQEAKIAlyID0gcjYwMF9jcF9yZXN1bWUocmRldik7CiAJaWYgKHIpCiAJCXJldHVybiByOwotCXIgPSByNjAwX3diX2luaXQocmRldik7Ci0JaWYgKHIpCi0JCXJldHVybiByOworCS8qIHdyaXRlIGJhY2sgYnVmZmVyIGFyZSBub3Qgdml0YWwgc28gZG9uJ3Qgd29ycnkgYWJvdXQgZmFpbHVyZSAqLworCXI2MDBfd2JfZW5hYmxlKHJkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xNTE3LDE1ICsxNTUyLDEyIEBACiB7CiAJaW50IHI7CiAKLQlpZiAocmFkZW9uX2dwdV9yZXNldChyZGV2KSkgewotCQkvKiBGSVhNRTogd2hhdCBkbyB3ZSB3YW50IHRvIGRvIGhlcmUgPyAqLwotCX0KKwkvKiBEbyBub3QgcmVzZXQgR1BVIGJlZm9yZSBwb3N0aW5nLCBvbiByNjAwIGh3IHVubGlrZSBvbiByNTAwIGh3LAorCSAqIHBvc3Rpbmcgd2lsbCBwZXJmb3JtIG5lY2Vzc2FyeSB0YXNrIHRvIGJyaW5nIGJhY2sgR1BVIGludG8gZ29vZAorCSAqIHNoYXBlLgorCSAqLwogCS8qIHBvc3QgY2FyZCAqLwotCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKLQkJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7Ci0JfSBlbHNlIHsKLQkJcmFkZW9uX2NvbWJpb3NfYXNpY19pbml0KHJkZXYtPmRkZXYpOwotCX0KKwlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKIAkvKiBJbml0aWFsaXplIGNsb2NrcyAqLwogCXIgPSByYWRlb25fY2xvY2tzX2luaXQocmRldik7CiAJaWYgKHIpIHsKQEAgLTE1MzgsNyArMTU3MCw3IEBACiAJCXJldHVybiByOwogCX0KIAotCXIgPSByYWRlb25faWJfdGVzdChyZGV2KTsKKwlyID0gcjYwMF9pYl90ZXN0KHJkZXYpOwogCWlmIChyKSB7CiAJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsbGVkIHRlc3RpbmcgSUIgKCVkKS5cbiIsIHIpOwogCQlyZXR1cm4gcjsKQEAgLTE1NDYsMTMgKzE1NzgsMTIgQEAKIAlyZXR1cm4gcjsKIH0KIAotCiBpbnQgcjYwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCS8qIEZJWE1FOiB3ZSBzaG91bGQgd2FpdCBmb3IgcmluZyB0byBiZSBlbXB0eSAqLwogCXI2MDBfY3Bfc3RvcChyZGV2KTsKIAlyZGV2LT5jcC5yZWFkeSA9IGZhbHNlOwotCisJcjYwMF93Yl9kaXNhYmxlKHJkZXYpOwogCXI2MDBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CiAJLyogdW5waW4gc2hhZGVycyBibyAqLwogCXJhZGVvbl9vYmplY3RfdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwpAQCAtMTU2OSw3ICsxNjAwLDYgQEAKIHsKIAlpbnQgcjsKIAotCXJkZXYtPm5ld19pbml0X3BhdGggPSB0cnVlOwogCXIgPSByYWRlb25fZHVtbXlfcGFnZV9pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTE1ODYsOCArMTYxNiwxMCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIE11c3QgYmUgYW4gQVRPTUJJT1MgKi8KLQlpZiAoIXJkZXYtPmlzX2F0b21fYmlvcykKKwlpZiAoIXJkZXYtPmlzX2F0b21fYmlvcykgeworCQlkZXZfZXJyKHJkZXYtPmRldiwgIkV4cGVjdGluZyBhdG9tYmlvcyBmb3IgUjYwMCBHUFVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJciA9IHJhZGVvbl9hdG9tYmlvc19pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTE2MDksMTUgKzE2NDEsOCBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAlyID0gcjYwMF9tY19pbml0KHJkZXYpOwotCWlmIChyKSB7Ci0JCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKLQkJCS8qIFJldHJ5IHdpdGggZGlzYWJsaW5nIEFHUCAqLwotCQkJcjYwMF9maW5pKHJkZXYpOwotCQkJcmRldi0+ZmxhZ3MgJj0gflJBREVPTl9JU19BR1A7Ci0JCQlyZXR1cm4gcjYwMF9pbml0KHJkZXYpOwotCQl9CisJaWYgKHIpCiAJCXJldHVybiByOwotCX0KIAkvKiBNZW1vcnkgbWFuYWdlciAqLwogCXIgPSByYWRlb25fb2JqZWN0X2luaXQocmRldik7CiAJaWYgKHIpCkBAIC0xNjQ2LDEyICsxNjcxLDEwIEBACiAKIAlyID0gcjYwMF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7Ci0JCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKLQkJCS8qIFJldHJ5IHdpdGggZGlzYWJsaW5nIEFHUCAqLwotCQkJcjYwMF9maW5pKHJkZXYpOwotCQkJcmRldi0+ZmxhZ3MgJj0gflJBREVPTl9JU19BR1A7Ci0JCQlyZXR1cm4gcjYwMF9pbml0KHJkZXYpOwotCQl9CisJCXI2MDBfc3VzcGVuZChyZGV2KTsKKwkJcjYwMF93Yl9maW5pKHJkZXYpOworCQlyYWRlb25fcmluZ19maW5pKHJkZXYpOworCQlyNjAwX3BjaWVfZ2FydF9maW5pKHJkZXYpOwogCQlyZGV2LT5hY2NlbF93b3JraW5nID0gZmFsc2U7CiAJfQogCWlmIChyZGV2LT5hY2NlbF93b3JraW5nKSB7CkBAIC0xNjYwLDcgKzE2ODMsNyBAQAogCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxsZWQgaW5pdGlhbGl6aW5nIElCIHBvb2wgKCVkKS5cbiIsIHIpOwogCQkJcmRldi0+YWNjZWxfd29ya2luZyA9IGZhbHNlOwogCQl9Ci0JCXIgPSByYWRlb25faWJfdGVzdChyZGV2KTsKKwkJciA9IHI2MDBfaWJfdGVzdChyZGV2KTsKIAkJaWYgKHIpIHsKIAkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsbGVkIHRlc3RpbmcgSUIgKCVkKS5cbiIsIHIpOwogCQkJcmRldi0+YWNjZWxfd29ya2luZyA9IGZhbHNlOwpAQCAtMTY3NiwxOSArMTY5OSwxNSBAQAogCiAJcjYwMF9ibGl0X2ZpbmkocmRldik7CiAJcmFkZW9uX3JpbmdfZmluaShyZGV2KTsKKwlyNjAwX3diX2ZpbmkocmRldik7CiAJcjYwMF9wY2llX2dhcnRfZmluaShyZGV2KTsKIAlyYWRlb25fZ2VtX2ZpbmkocmRldik7CiAJcmFkZW9uX2ZlbmNlX2RyaXZlcl9maW5pKHJkZXYpOwogCXJhZGVvbl9jbG9ja3NfZmluaShyZGV2KTsKLSNpZiBfX09TX0hBU19BR1AKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKQogCQlyYWRlb25fYWdwX2ZpbmkocmRldik7Ci0jZW5kaWYKIAlyYWRlb25fb2JqZWN0X2ZpbmkocmRldik7Ci0JaWYgKHJkZXYtPmlzX2F0b21fYmlvcykKLQkJcmFkZW9uX2F0b21iaW9zX2ZpbmkocmRldik7Ci0JZWxzZQotCQlyYWRlb25fY29tYmlvc19maW5pKHJkZXYpOworCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwogCWtmcmVlKHJkZXYtPmJpb3MpOwogCXJkZXYtPmJpb3MgPSBOVUxMOwogCXJhZGVvbl9kdW1teV9wYWdlX2ZpbmkocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYmxpdC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXQuYwppbmRleCBkZGUyY2NiLi5kZWM1MDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYmxpdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0LmMKQEAgLTU4Miw4ICs1ODIsNiBAQAogCXU2NCB2Yl9hZGRyOwogCXUzMiAqdmI7CiAKLQl2YiA9IHI2MDBfbm9tbV9nZXRfdmJfcHRyKGRldik7Ci0KIAlpZiAoKHNpemVfYnl0ZXMgJiAzKSB8fCAoc3JjX2dwdV9hZGRyICYgMykgfHwgKGRzdF9ncHVfYWRkciAmIDMpKSB7CiAJCW1heF9ieXRlcyA9IDgxOTI7CiAKQEAgLTYxOSw4ICs2MTcsOCBAQAogCQkJCWlmICghZGV2X3ByaXYtPmJsaXRfdmIpCiAJCQkJCXJldHVybjsKIAkJCQlzZXRfc2hhZGVycyhkZXYpOwotCQkJCXZiID0gcjYwMF9ub21tX2dldF92Yl9wdHIoZGV2KTsKIAkJCX0KKwkJCXZiID0gcjYwMF9ub21tX2dldF92Yl9wdHIoZGV2KTsKIAogCQkJdmJbMF0gPSBpMmYoZHN0X3gpOwogCQkJdmJbMV0gPSAwOwpAQCAtNzA4LDggKzcwNiw4IEBACiAJCQkJCXJldHVybjsKIAogCQkJCXNldF9zaGFkZXJzKGRldik7Ci0JCQkJdmIgPSByNjAwX25vbW1fZ2V0X3ZiX3B0cihkZXYpOwogCQkJfQorCQkJdmIgPSByNjAwX25vbW1fZ2V0X3ZiX3B0cihkZXYpOwogCiAJCQl2YlswXSA9IGkyZihkc3RfeCAvIDQpOwogCQkJdmJbMV0gPSAwOwpAQCAtNzM3LDcgKzczNSw3IEBACiAKIAkJCS8qIGRzdCAqLwogCQkJc2V0X3JlbmRlcl90YXJnZXQoZGV2X3ByaXYsIENPTE9SXzhfOF84XzgsCi0JCQkJCSAgZHN0X3ggKyBjdXJfc2l6ZSwgaCwKKwkJCQkJICAoZHN0X3ggKyBjdXJfc2l6ZSkgLyA0LCBoLAogCQkJCQkgIGRzdF9ncHVfYWRkcik7CiAKIAkJCS8qIHNjaXNzb3JzICovCkBAIC03NzcsOCArNzc1LDYgQEAKIAl1NjQgdmJfYWRkcjsKIAl1MzIgKnZiOwogCi0JdmIgPSByNjAwX25vbW1fZ2V0X3ZiX3B0cihkZXYpOwotCiAJaWYgKChkZXZfcHJpdi0+YmxpdF92Yi0+dXNlZCArIDQ4KSA+IGRldl9wcml2LT5ibGl0X3ZiLT50b3RhbCkgewogCiAJCXI2MDBfbm9tbV9wdXRfdmIoZGV2KTsKQEAgLTc4Nyw4ICs3ODMsOCBAQAogCQkJcmV0dXJuOwogCiAJCXNldF9zaGFkZXJzKGRldik7Ci0JCXZiID0gcjYwMF9ub21tX2dldF92Yl9wdHIoZGV2KTsKIAl9CisJdmIgPSByNjAwX25vbW1fZ2V0X3ZiX3B0cihkZXYpOwogCiAJaWYgKGNwcCA9PSA0KSB7CiAJCWNiX2Zvcm1hdCA9IENPTE9SXzhfOF84Xzg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYmxpdF9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jCmluZGV4IDBhNmY0NjguLjkzMTA4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jCkBAIC02MTAsNyArNjEwLDYgQEAKIAogCURSTV9ERUJVRygiZW1pdHRpbmcgY29weSAlMTZsbHggJTE2bGx4ICVkICVkXG4iLCBzcmNfZ3B1X2FkZHIsIGRzdF9ncHVfYWRkciwKIAkJICBzaXplX2J5dGVzLCByZGV2LT5yNjAwX2JsaXQudmJfdXNlZCk7Ci0JdmIgPSAodTMyICopKHJkZXYtPnI2MDBfYmxpdC52Yl9pYi0+cHRyICsgcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQpOwogCWlmICgoc2l6ZV9ieXRlcyAmIDMpIHx8IChzcmNfZ3B1X2FkZHIgJiAzKSB8fCAoZHN0X2dwdV9hZGRyICYgMykpIHsKIAkJbWF4X2J5dGVzID0gODE5MjsKIApAQCAtNjUzLDYgKzY1Miw3IEBACiAJCQkJdmIgPSByNjAwX25vbW1fZ2V0X3ZiX3B0cihkZXYpOwogI2VuZGlmCiAJCQl9CisJCQl2YiA9ICh1MzIgKikocmRldi0+cjYwMF9ibGl0LnZiX2liLT5wdHIgKyByZGV2LT5yNjAwX2JsaXQudmJfdXNlZCk7CiAKIAkJCXZiWzBdID0gaTJmKGRzdF94KTsKIAkJCXZiWzFdID0gMDsKQEAgLTc0Nyw2ICs3NDcsNyBAQAogCQkJCXZiID0gcjYwMF9ub21tX2dldF92Yl9wdHIoZGV2KTsKIAkJCX0KICNlbmRpZgorCQkJdmIgPSAodTMyICopKHJkZXYtPnI2MDBfYmxpdC52Yl9pYi0+cHRyICsgcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQpOwogCiAJCQl2YlswXSA9IGkyZihkc3RfeCAvIDQpOwogCQkJdmJbMV0gPSAwOwpAQCAtNzc0LDcgKzc3NSw3IEBACiAKIAkJCS8qIGRzdCAyMyAqLwogCQkJc2V0X3JlbmRlcl90YXJnZXQocmRldiwgQ09MT1JfOF84XzhfOCwKLQkJCQkJICBkc3RfeCArIGN1cl9zaXplLCBoLAorCQkJCQkgIChkc3RfeCArIGN1cl9zaXplKSAvIDQsIGgsCiAJCQkJCSAgZHN0X2dwdV9hZGRyKTsKIAogCQkJLyogc2Npc3NvcnMgMTIgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jCmluZGV4IDMzYjg5Y2QuLjE3ZTQyMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgInI2MDBkLmgiCi0jaW5jbHVkZSAiYXZpdm9kLmgiCiAKIHN0YXRpYyBpbnQgcjYwMF9jc19wYWNrZXRfbmV4dF9yZWxvY19tbShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKIAkJCQkJc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqKmNzX3JlbG9jKTsKQEAgLTU3LDcgKzU2LDcgQEAKIAkJCSAgaWR4LCBpYl9jaHVuay0+bGVuZ3RoX2R3KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWhlYWRlciA9IGliX2NodW5rLT5rZGF0YVtpZHhdOworCWhlYWRlciA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKIAlwa3QtPmlkeCA9IGlkeDsKIAlwa3QtPnR5cGUgPSBDUF9QQUNLRVRfR0VUX1RZUEUoaGVhZGVyKTsKIAlwa3QtPmNvdW50ID0gQ1BfUEFDS0VUX0dFVF9DT1VOVChoZWFkZXIpOwpAQCAtOTgsNyArOTcsNiBAQAogc3RhdGljIGludCByNjAwX2NzX3BhY2tldF9uZXh0X3JlbG9jX21tKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAogCQkJCQlzdHJ1Y3QgcmFkZW9uX2NzX3JlbG9jICoqY3NfcmVsb2MpCiB7Ci0Jc3RydWN0IHJhZGVvbl9jc19jaHVuayAqaWJfY2h1bms7CiAJc3RydWN0IHJhZGVvbl9jc19jaHVuayAqcmVsb2NzX2NodW5rOwogCXN0cnVjdCByYWRlb25fY3NfcGFja2V0IHAzcmVsb2M7CiAJdW5zaWduZWQgaWR4OwpAQCAtMTA5LDcgKzEwNyw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkqY3NfcmVsb2MgPSBOVUxMOwotCWliX2NodW5rID0gJnAtPmNodW5rc1twLT5jaHVua19pYl9pZHhdOwogCXJlbG9jc19jaHVuayA9ICZwLT5jaHVua3NbcC0+Y2h1bmtfcmVsb2NzX2lkeF07CiAJciA9IHI2MDBfY3NfcGFja2V0X3BhcnNlKHAsICZwM3JlbG9jLCBwLT5pZHgpOwogCWlmIChyKSB7CkBAIC0xMjEsNyArMTE4LDcgQEAKIAkJCSAgcDNyZWxvYy5pZHgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWR4ID0gaWJfY2h1bmstPmtkYXRhW3AzcmVsb2MuaWR4ICsgMV07CisJaWR4ID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBwM3JlbG9jLmlkeCArIDEpOwogCWlmIChpZHggPj0gcmVsb2NzX2NodW5rLT5sZW5ndGhfZHcpIHsKIAkJRFJNX0VSUk9SKCJSZWxvY3MgYXQgJWQgYWZ0ZXIgcmVsb2NhdGlvbnMgY2h1bmsgZW5kICVkICFcbiIsCiAJCQkgIGlkeCwgcmVsb2NzX2NodW5rLT5sZW5ndGhfZHcpOwpAQCAtMTQ2LDcgKzE0Myw2IEBACiBzdGF0aWMgaW50IHI2MDBfY3NfcGFja2V0X25leHRfcmVsb2Nfbm9tbShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKIAkJCQkJc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqKmNzX3JlbG9jKQogewotCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKmliX2NodW5rOwogCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKnJlbG9jc19jaHVuazsKIAlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCBwM3JlbG9jOwogCXVuc2lnbmVkIGlkeDsKQEAgLTE1Nyw3ICsxNTMsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJKmNzX3JlbG9jID0gTlVMTDsKLQlpYl9jaHVuayA9ICZwLT5jaHVua3NbcC0+Y2h1bmtfaWJfaWR4XTsKIAlyZWxvY3NfY2h1bmsgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX3JlbG9jc19pZHhdOwogCXIgPSByNjAwX2NzX3BhY2tldF9wYXJzZShwLCAmcDNyZWxvYywgcC0+aWR4KTsKIAlpZiAocikgewpAQCAtMTY5LDcgKzE2NCw3IEBACiAJCQkgIHAzcmVsb2MuaWR4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlkeCA9IGliX2NodW5rLT5rZGF0YVtwM3JlbG9jLmlkeCArIDFdOworCWlkeCA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgcDNyZWxvYy5pZHggKyAxKTsKIAlpZiAoaWR4ID49IHJlbG9jc19jaHVuay0+bGVuZ3RoX2R3KSB7CiAJCURSTV9FUlJPUigiUmVsb2NzIGF0ICVkIGFmdGVyIHJlbG9jYXRpb25zIGNodW5rIGVuZCAlZCAhXG4iLAogCQkJICBpZHgsIHJlbG9jc19jaHVuay0+bGVuZ3RoX2R3KTsKQEAgLTE4MSwxMyArMTc2LDEzNiBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIHI2MDBfY3NfcGFja2V0X25leHRfdmxpbmUoKSAtIHBhcnNlIHVzZXJzcGFjZSBWTElORSBwYWNrZXQKKyAqIEBwYXJzZXI6CQlwYXJzZXIgc3RydWN0dXJlIGhvbGRpbmcgcGFyc2luZyBjb250ZXh0LgorICoKKyAqIFVzZXJzcGFjZSBzZW5kcyBhIHNwZWNpYWwgc2VxdWVuY2UgZm9yIFZMSU5FIHdhaXRzLgorICogUEFDS0VUMCAtIFZMSU5FX1NUQVJUX0VORCArIHZhbHVlCisgKiBQQUNLRVQzIC0gV0FJVF9SRUdfTUVNIHBvbGwgdmxpbmUgc3RhdHVzIHJlZworICogUkVMT0MgKFAzKSAtIGNydGNfaWQgaW4gcmVsb2MuCisgKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhpcyBhbmQgcmVsb2NhdGVzIHRoZSBWTElORSBTVEFSVCBFTkQKKyAqIGFuZCBXQUlUX1JFR19NRU0gcGFja2V0cyB0byB0aGUgY29ycmVjdCBjcnRjLgorICogSXQgYWxzbyBkZXRlY3RzIGEgc3dpdGNoZWQgb2ZmIGNydGMgYW5kIG51bGxzIG91dCB0aGUKKyAqIHdhaXQgaW4gdGhhdCBjYXNlLgorICovCitzdGF0aWMgaW50IHI2MDBfY3NfcGFja2V0X3BhcnNlX3ZsaW5lKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKQoreworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YzsKKwlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCBwM3JlbG9jLCB3YWl0X3JlZ19tZW07CisJaW50IGNydGNfaWQ7CisJaW50IHI7CisJdWludDMyX3QgaGVhZGVyLCBoX2lkeCwgcmVnLCB3YWl0X3JlZ19tZW1faW5mbzsKKwl2b2xhdGlsZSB1aW50MzJfdCAqaWI7CisKKwlpYiA9IHAtPmliLT5wdHI7CisKKwkvKiBwYXJzZSB0aGUgV0FJVF9SRUdfTUVNICovCisJciA9IHI2MDBfY3NfcGFja2V0X3BhcnNlKHAsICZ3YWl0X3JlZ19tZW0sIHAtPmlkeCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJLyogY2hlY2sgaXRzIGEgV0FJVF9SRUdfTUVNICovCisJaWYgKHdhaXRfcmVnX21lbS50eXBlICE9IFBBQ0tFVF9UWVBFMyB8fAorCSAgICB3YWl0X3JlZ19tZW0ub3Bjb2RlICE9IFBBQ0tFVDNfV0FJVF9SRUdfTUVNKSB7CisJCURSTV9FUlJPUigidmxpbmUgd2FpdCBtaXNzaW5nIFdBSVRfUkVHX01FTSBzZWdtZW50XG4iKTsKKwkJciA9IC1FSU5WQUw7CisJCXJldHVybiByOworCX0KKworCXdhaXRfcmVnX21lbV9pbmZvID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCB3YWl0X3JlZ19tZW0uaWR4ICsgMSk7CisJLyogYml0IDQgaXMgcmVnICgwKSBvciBtZW0gKDEpICovCisJaWYgKHdhaXRfcmVnX21lbV9pbmZvICYgMHgxMCkgeworCQlEUk1fRVJST1IoInZsaW5lIFdBSVRfUkVHX01FTSB3YWl0aW5nIG9uIE1FTSByYXRoZXIgdGhhbiBSRUdcbiIpOworCQlyID0gLUVJTlZBTDsKKwkJcmV0dXJuIHI7CisJfQorCS8qIHdhaXRpbmcgZm9yIHZhbHVlIHRvIGJlIGVxdWFsICovCisJaWYgKCh3YWl0X3JlZ19tZW1faW5mbyAmIDB4NykgIT0gMHgzKSB7CisJCURSTV9FUlJPUigidmxpbmUgV0FJVF9SRUdfTUVNIGZ1bmN0aW9uIG5vdCBlcXVhbFxuIik7CisJCXIgPSAtRUlOVkFMOworCQlyZXR1cm4gcjsKKwl9CisJaWYgKChyYWRlb25fZ2V0X2liX3ZhbHVlKHAsIHdhaXRfcmVnX21lbS5pZHggKyAyKSA8PCAyKSAhPSBBVklWT19EMU1PREVfVkxJTkVfU1RBVFVTKSB7CisJCURSTV9FUlJPUigidmxpbmUgV0FJVF9SRUdfTUVNIGJhZCByZWdcbiIpOworCQlyID0gLUVJTlZBTDsKKwkJcmV0dXJuIHI7CisJfQorCisJaWYgKHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgd2FpdF9yZWdfbWVtLmlkeCArIDUpICE9IEFWSVZPX0QxTU9ERV9WTElORV9TVEFUKSB7CisJCURSTV9FUlJPUigidmxpbmUgV0FJVF9SRUdfTUVNIGJhZCBiaXQgbWFza1xuIik7CisJCXIgPSAtRUlOVkFMOworCQlyZXR1cm4gcjsKKwl9CisKKwkvKiBqdW1wIG92ZXIgdGhlIE5PUCAqLworCXIgPSByNjAwX2NzX3BhY2tldF9wYXJzZShwLCAmcDNyZWxvYywgcC0+aWR4ICsgd2FpdF9yZWdfbWVtLmNvdW50ICsgMik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaF9pZHggPSBwLT5pZHggLSAyOworCXAtPmlkeCArPSB3YWl0X3JlZ19tZW0uY291bnQgKyAyOworCXAtPmlkeCArPSBwM3JlbG9jLmNvdW50ICsgMjsKKworCWhlYWRlciA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaF9pZHgpOworCWNydGNfaWQgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGhfaWR4ICsgMiArIDcgKyAxKTsKKwlyZWcgPSBDUF9QQUNLRVQwX0dFVF9SRUcoaGVhZGVyKTsKKwltdXRleF9sb2NrKCZwLT5yZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQocC0+cmRldi0+ZGRldiwgY3J0Y19pZCwgRFJNX01PREVfT0JKRUNUX0NSVEMpOworCWlmICghb2JqKSB7CisJCURSTV9FUlJPUigiY2Fubm90IGZpbmQgY3J0YyAlZFxuIiwgY3J0Y19pZCk7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJY3J0YyA9IG9ial90b19jcnRjKG9iaik7CisJcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKKwljcnRjX2lkID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7CisKKwlpZiAoIWNydGMtPmVuYWJsZWQpIHsKKwkJLyogaWYgdGhlIENSVEMgaXNuJ3QgZW5hYmxlZCAtIHdlIG5lZWQgdG8gbm9wIG91dCB0aGUgV0FJVF9SRUdfTUVNICovCisJCWliW2hfaWR4ICsgMl0gPSBQQUNLRVQyKDApOworCQlpYltoX2lkeCArIDNdID0gUEFDS0VUMigwKTsKKwkJaWJbaF9pZHggKyA0XSA9IFBBQ0tFVDIoMCk7CisJCWliW2hfaWR4ICsgNV0gPSBQQUNLRVQyKDApOworCQlpYltoX2lkeCArIDZdID0gUEFDS0VUMigwKTsKKwkJaWJbaF9pZHggKyA3XSA9IFBBQ0tFVDIoMCk7CisJCWliW2hfaWR4ICsgOF0gPSBQQUNLRVQyKDApOworCX0gZWxzZSBpZiAoY3J0Y19pZCA9PSAxKSB7CisJCXN3aXRjaCAocmVnKSB7CisJCWNhc2UgQVZJVk9fRDFNT0RFX1ZMSU5FX1NUQVJUX0VORDoKKwkJCWhlYWRlciAmPSB+UjYwMF9DUF9QQUNLRVQwX1JFR19NQVNLOworCQkJaGVhZGVyIHw9IEFWSVZPX0QyTU9ERV9WTElORV9TVEFSVF9FTkQgPj4gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJ1bmtub3duIGNydGMgcmVsb2NcbiIpOworCQkJciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpYltoX2lkeF0gPSBoZWFkZXI7CisJCWliW2hfaWR4ICsgNF0gPSBBVklWT19EMk1PREVfVkxJTkVfU1RBVFVTID4+IDI7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmcC0+cmRldi0+ZGRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByOworfQorCiBzdGF0aWMgaW50IHI2MDBfcGFja2V0MF9jaGVjayhzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKIAkJCQlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAogCQkJCXVuc2lnbmVkIGlkeCwgdW5zaWduZWQgcmVnKQogeworCWludCByOworCiAJc3dpdGNoIChyZWcpIHsKIAljYXNlIEFWSVZPX0QxTU9ERV9WTElORV9TVEFSVF9FTkQ6Ci0JY2FzZSBBVklWT19EMk1PREVfVkxJTkVfU1RBUlRfRU5EOgorCQlyID0gcjYwMF9jc19wYWNrZXRfcGFyc2VfdmxpbmUocCk7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBpYlslZF09MHglMDRYXG4iLAorCQkJCQlpZHgsIHJlZyk7CisJCQlyZXR1cm4gcjsKKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIkZvcmJpZGRlbiByZWdpc3RlciAweCUwNFggaW4gY3MgYXQgJWRcbiIsCkBAIC0yMTgsMTcgKzMzNiwxOCBAQAogc3RhdGljIGludCByNjAwX3BhY2tldDNfY2hlY2soc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCiAJCQkJc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCkKIHsKLQlzdHJ1Y3QgcmFkZW9uX2NzX2NodW5rICppYl9jaHVuazsKIAlzdHJ1Y3QgcmFkZW9uX2NzX3JlbG9jICpyZWxvYzsKIAl2b2xhdGlsZSB1MzIgKmliOwogCXVuc2lnbmVkIGlkeDsKIAl1bnNpZ25lZCBpOwogCXVuc2lnbmVkIHN0YXJ0X3JlZywgZW5kX3JlZywgcmVnOwogCWludCByOworCXUzMiBpZHhfdmFsdWU7CiAKIAlpYiA9IHAtPmliLT5wdHI7Ci0JaWJfY2h1bmsgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07CiAJaWR4ID0gcGt0LT5pZHggKyAxOworCWlkeF92YWx1ZSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKKwogCXN3aXRjaCAocGt0LT5vcGNvZGUpIHsKIAljYXNlIFBBQ0tFVDNfU1RBUlRfM0RfQ01EQlVGOgogCQlpZiAocC0+ZmFtaWx5ID49IENISVBfUlY3NzAgfHwgcGt0LT5jb3VudCkgewpAQCAtMjU5LDggKzM3OCw4IEBACiAJCQlEUk1fRVJST1IoImJhZCBEUkFXX0lOREVYXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWliW2lkeCswXSArPSAodTMyKShyZWxvYy0+bG9iai5ncHVfb2Zmc2V0ICYgMHhmZmZmZmZmZik7Ci0JCWliW2lkeCsxXSA9IHVwcGVyXzMyX2JpdHMocmVsb2MtPmxvYmouZ3B1X29mZnNldCkgJiAweGZmOworCQlpYltpZHgrMF0gPSBpZHhfdmFsdWUgKyAodTMyKShyZWxvYy0+bG9iai5ncHVfb2Zmc2V0ICYgMHhmZmZmZmZmZik7CisJCWliW2lkeCsxXSArPSB1cHBlcl8zMl9iaXRzKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpICYgMHhmZjsKIAkJYnJlYWs7CiAJY2FzZSBQQUNLRVQzX0RSQVdfSU5ERVhfQVVUTzoKIAkJaWYgKHBrdC0+Y291bnQgIT0gMSkgewpAQCAtMjgxLDE0ICs0MDAsMTQgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qIGJpdCA0IGlzIHJlZyAoMCkgb3IgbWVtICgxKSAqLwotCQlpZiAoaWJfY2h1bmstPmtkYXRhW2lkeCswXSAmIDB4MTApIHsKKwkJaWYgKGlkeF92YWx1ZSAmIDB4MTApIHsKIAkJCXIgPSByNjAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CiAJCQlpZiAocikgewogCQkJCURSTV9FUlJPUigiYmFkIFdBSVRfUkVHX01FTVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlpYltpZHgrMV0gKz0gKHUzMikocmVsb2MtPmxvYmouZ3B1X29mZnNldCAmIDB4ZmZmZmZmZmYpOwotCQkJaWJbaWR4KzJdID0gdXBwZXJfMzJfYml0cyhyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KSAmIDB4ZmY7CisJCQlpYltpZHgrMl0gKz0gdXBwZXJfMzJfYml0cyhyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KSAmIDB4ZmY7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQQUNLRVQzX1NVUkZBQ0VfU1lOQzoKQEAgLTI5Nyw4ICs0MTYsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJLyogMHhmZmZmZmZmZi8weDAgaXMgZmx1c2ggYWxsIGNhY2hlIGZsYWcgKi8KLQkJaWYgKGliX2NodW5rLT5rZGF0YVtpZHgrMV0gIT0gMHhmZmZmZmZmZiB8fAotCQkgICAgaWJfY2h1bmstPmtkYXRhW2lkeCsyXSAhPSAwKSB7CisJCWlmIChyYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDEpICE9IDB4ZmZmZmZmZmYgfHwKKwkJICAgIHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMikgIT0gMCkgewogCQkJciA9IHI2MDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKIAkJCWlmIChyKSB7CiAJCQkJRFJNX0VSUk9SKCJiYWQgU1VSRkFDRV9TWU5DXG4iKTsKQEAgLTMxOSw3ICs0MzgsNyBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJaWJbaWR4KzFdICs9ICh1MzIpKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQgJiAweGZmZmZmZmZmKTsKLQkJCWliW2lkeCsyXSB8PSB1cHBlcl8zMl9iaXRzKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpICYgMHhmZjsKKwkJCWliW2lkeCsyXSArPSB1cHBlcl8zMl9iaXRzKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpICYgMHhmZjsKIAkJfQogCQlicmVhazsKIAljYXNlIFBBQ0tFVDNfRVZFTlRfV1JJVEVfRU9QOgpAQCAtMzMzLDEwICs0NTIsMTAgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWliW2lkeCsxXSArPSAodTMyKShyZWxvYy0+bG9iai5ncHVfb2Zmc2V0ICYgMHhmZmZmZmZmZik7Ci0JCWliW2lkeCsyXSB8PSB1cHBlcl8zMl9iaXRzKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpICYgMHhmZjsKKwkJaWJbaWR4KzJdICs9IHVwcGVyXzMyX2JpdHMocmVsb2MtPmxvYmouZ3B1X29mZnNldCkgJiAweGZmOwogCQlicmVhazsKIAljYXNlIFBBQ0tFVDNfU0VUX0NPTkZJR19SRUc6Ci0JCXN0YXJ0X3JlZyA9IChpYltpZHgrMF0gPDwgMikgKyBQQUNLRVQzX1NFVF9DT05GSUdfUkVHX09GRlNFVDsKKwkJc3RhcnRfcmVnID0gKGlkeF92YWx1ZSA8PCAyKSArIFBBQ0tFVDNfU0VUX0NPTkZJR19SRUdfT0ZGU0VUOwogCQllbmRfcmVnID0gNCAqIHBrdC0+Y291bnQgKyBzdGFydF9yZWcgLSA0OwogCQlpZiAoKHN0YXJ0X3JlZyA8IFBBQ0tFVDNfU0VUX0NPTkZJR19SRUdfT0ZGU0VUKSB8fAogCQkgICAgKHN0YXJ0X3JlZyA+PSBQQUNLRVQzX1NFVF9DT05GSUdfUkVHX0VORCkgfHwKQEAgLTM1Niw3ICs0NzUsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUEFDS0VUM19TRVRfQ09OVEVYVF9SRUc6Ci0JCXN0YXJ0X3JlZyA9IChpYltpZHgrMF0gPDwgMikgKyBQQUNLRVQzX1NFVF9DT05URVhUX1JFR19PRkZTRVQ7CisJCXN0YXJ0X3JlZyA9IChpZHhfdmFsdWUgPDwgMikgKyBQQUNLRVQzX1NFVF9DT05URVhUX1JFR19PRkZTRVQ7CiAJCWVuZF9yZWcgPSA0ICogcGt0LT5jb3VudCArIHN0YXJ0X3JlZyAtIDQ7CiAJCWlmICgoc3RhcnRfcmVnIDwgUEFDS0VUM19TRVRfQ09OVEVYVF9SRUdfT0ZGU0VUKSB8fAogCQkgICAgKHN0YXJ0X3JlZyA+PSBQQUNLRVQzX1NFVF9DT05URVhUX1JFR19FTkQpIHx8CkBAIC00MjEsNyArNTQwLDcgQEAKIAkJCURSTV9FUlJPUigiYmFkIFNFVF9SRVNPVVJDRVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlzdGFydF9yZWcgPSAoaWJbaWR4KzBdIDw8IDIpICsgUEFDS0VUM19TRVRfUkVTT1VSQ0VfT0ZGU0VUOworCQlzdGFydF9yZWcgPSAoaWR4X3ZhbHVlIDw8IDIpICsgUEFDS0VUM19TRVRfUkVTT1VSQ0VfT0ZGU0VUOwogCQllbmRfcmVnID0gNCAqIHBrdC0+Y291bnQgKyBzdGFydF9yZWcgLSA0OwogCQlpZiAoKHN0YXJ0X3JlZyA8IFBBQ0tFVDNfU0VUX1JFU09VUkNFX09GRlNFVCkgfHwKIAkJICAgIChzdGFydF9yZWcgPj0gUEFDS0VUM19TRVRfUkVTT1VSQ0VfRU5EKSB8fApAQCAtNDMwLDcgKzU0OSw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgKHBrdC0+Y291bnQgLyA3KTsgaSsrKSB7Ci0JCQlzd2l0Y2ggKEdfX1NRX1ZUWF9DT05TVEFOVF9UWVBFKGliW2lkeCsoaSo3KSs2KzFdKSkgeworCQkJc3dpdGNoIChHX19TUV9WVFhfQ09OU1RBTlRfVFlQRShyYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCsoaSo3KSs2KzEpKSkgewogCQkJY2FzZSBTUV9URVhfVlRYX1ZBTElEX1RFWFRVUkU6CiAJCQkJLyogdGV4IGJhc2UgKi8KIAkJCQlyID0gcjYwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOwpAQCAtNDU1LDcgKzU3NCw3IEBACiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0KIAkJCQlpYltpZHgrMSsoaSo3KSswXSArPSAodTMyKSgocmVsb2MtPmxvYmouZ3B1X29mZnNldCkgJiAweGZmZmZmZmZmKTsKLQkJCQlpYltpZHgrMSsoaSo3KSsyXSB8PSB1cHBlcl8zMl9iaXRzKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpICYgMHhmZjsKKwkJCQlpYltpZHgrMSsoaSo3KSsyXSArPSB1cHBlcl8zMl9iaXRzKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpICYgMHhmZjsKIAkJCQlicmVhazsKIAkJCWNhc2UgU1FfVEVYX1ZUWF9JTlZBTElEX1RFWFRVUkU6CiAJCQljYXNlIFNRX1RFWF9WVFhfSU5WQUxJRF9CVUZGRVI6CkBAIC00NjYsNyArNTg1LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFBBQ0tFVDNfU0VUX0FMVV9DT05TVDoKLQkJc3RhcnRfcmVnID0gKGliW2lkeCswXSA8PCAyKSArIFBBQ0tFVDNfU0VUX0FMVV9DT05TVF9PRkZTRVQ7CisJCXN0YXJ0X3JlZyA9IChpZHhfdmFsdWUgPDwgMikgKyBQQUNLRVQzX1NFVF9BTFVfQ09OU1RfT0ZGU0VUOwogCQllbmRfcmVnID0gNCAqIHBrdC0+Y291bnQgKyBzdGFydF9yZWcgLSA0OwogCQlpZiAoKHN0YXJ0X3JlZyA8IFBBQ0tFVDNfU0VUX0FMVV9DT05TVF9PRkZTRVQpIHx8CiAJCSAgICAoc3RhcnRfcmVnID49IFBBQ0tFVDNfU0VUX0FMVV9DT05TVF9FTkQpIHx8CkBAIC00NzYsNyArNTk1LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFBBQ0tFVDNfU0VUX0JPT0xfQ09OU1Q6Ci0JCXN0YXJ0X3JlZyA9IChpYltpZHgrMF0gPDwgMikgKyBQQUNLRVQzX1NFVF9CT09MX0NPTlNUX09GRlNFVDsKKwkJc3RhcnRfcmVnID0gKGlkeF92YWx1ZSA8PCAyKSArIFBBQ0tFVDNfU0VUX0JPT0xfQ09OU1RfT0ZGU0VUOwogCQllbmRfcmVnID0gNCAqIHBrdC0+Y291bnQgKyBzdGFydF9yZWcgLSA0OwogCQlpZiAoKHN0YXJ0X3JlZyA8IFBBQ0tFVDNfU0VUX0JPT0xfQ09OU1RfT0ZGU0VUKSB8fAogCQkgICAgKHN0YXJ0X3JlZyA+PSBQQUNLRVQzX1NFVF9CT09MX0NPTlNUX0VORCkgfHwKQEAgLTQ4Niw3ICs2MDUsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUEFDS0VUM19TRVRfTE9PUF9DT05TVDoKLQkJc3RhcnRfcmVnID0gKGliW2lkeCswXSA8PCAyKSArIFBBQ0tFVDNfU0VUX0xPT1BfQ09OU1RfT0ZGU0VUOworCQlzdGFydF9yZWcgPSAoaWR4X3ZhbHVlIDw8IDIpICsgUEFDS0VUM19TRVRfTE9PUF9DT05TVF9PRkZTRVQ7CiAJCWVuZF9yZWcgPSA0ICogcGt0LT5jb3VudCArIHN0YXJ0X3JlZyAtIDQ7CiAJCWlmICgoc3RhcnRfcmVnIDwgUEFDS0VUM19TRVRfTE9PUF9DT05TVF9PRkZTRVQpIHx8CiAJCSAgICAoc3RhcnRfcmVnID49IFBBQ0tFVDNfU0VUX0xPT1BfQ09OU1RfRU5EKSB8fApAQCAtNDk2LDcgKzYxNSw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQQUNLRVQzX1NFVF9DVExfQ09OU1Q6Ci0JCXN0YXJ0X3JlZyA9IChpYltpZHgrMF0gPDwgMikgKyBQQUNLRVQzX1NFVF9DVExfQ09OU1RfT0ZGU0VUOworCQlzdGFydF9yZWcgPSAoaWR4X3ZhbHVlIDw8IDIpICsgUEFDS0VUM19TRVRfQ1RMX0NPTlNUX09GRlNFVDsKIAkJZW5kX3JlZyA9IDQgKiBwa3QtPmNvdW50ICsgc3RhcnRfcmVnIC0gNDsKIAkJaWYgKChzdGFydF9yZWcgPCBQQUNLRVQzX1NFVF9DVExfQ09OU1RfT0ZGU0VUKSB8fAogCQkgICAgKHN0YXJ0X3JlZyA+PSBQQUNLRVQzX1NFVF9DVExfQ09OU1RfRU5EKSB8fApAQCAtNTEwLDcgKzYyOSw3IEBACiAJCQlEUk1fRVJST1IoImJhZCBTRVRfU0FNUExFUlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlzdGFydF9yZWcgPSAoaWJbaWR4KzBdIDw8IDIpICsgUEFDS0VUM19TRVRfU0FNUExFUl9PRkZTRVQ7CisJCXN0YXJ0X3JlZyA9IChpZHhfdmFsdWUgPDwgMikgKyBQQUNLRVQzX1NFVF9TQU1QTEVSX09GRlNFVDsKIAkJZW5kX3JlZyA9IDQgKiBwa3QtPmNvdW50ICsgc3RhcnRfcmVnIC0gNDsKIAkJaWYgKChzdGFydF9yZWcgPCBQQUNLRVQzX1NFVF9TQU1QTEVSX09GRlNFVCkgfHwKIAkJICAgIChzdGFydF9yZWcgPj0gUEFDS0VUM19TRVRfU0FNUExFUl9FTkQpIHx8CkBAIC02MDIsNiArNzIxLDggQEAKIAlrZnJlZShwYXJzZXItPnJlbG9jcyk7CiAJZm9yIChpID0gMDsgaSA8IHBhcnNlci0+bmNodW5rczsgaSsrKSB7CiAJCWtmcmVlKHBhcnNlci0+Y2h1bmtzW2ldLmtkYXRhKTsKKwkJa2ZyZWUocGFyc2VyLT5jaHVua3NbaV0ua3BhZ2VbMF0pOworCQlrZnJlZShwYXJzZXItPmNodW5rc1tpXS5rcGFnZVsxXSk7CiAJfQogCWtmcmVlKHBhcnNlci0+Y2h1bmtzKTsKIAlrZnJlZShwYXJzZXItPmNodW5rc19hcnJheSk7CkBAIC02MzksNyArNzYwLDYgQEAKIAkgKiB1bmNhY2hlZCkuICovCiAJaWJfY2h1bmsgPSAmcGFyc2VyLmNodW5rc1twYXJzZXIuY2h1bmtfaWJfaWR4XTsKIAlwYXJzZXIuaWItPmxlbmd0aF9kdyA9IGliX2NodW5rLT5sZW5ndGhfZHc7Ci0JbWVtY3B5KCh2b2lkICopcGFyc2VyLmliLT5wdHIsIGliX2NodW5rLT5rZGF0YSwgaWJfY2h1bmstPmxlbmd0aF9kdyo0KTsKIAkqbCA9IHBhcnNlci5pYi0+bGVuZ3RoX2R3OwogCXIgPSByNjAwX2NzX3BhcnNlKCZwYXJzZXIpOwogCWlmIChyKSB7CkBAIC02NDcsNiArNzY3LDEyIEBACiAJCXI2MDBfY3NfcGFyc2VyX2ZpbmkoJnBhcnNlciwgcik7CiAJCXJldHVybiByOwogCX0KKwlyID0gcmFkZW9uX2NzX2ZpbmlzaF9wYWdlcygmcGFyc2VyKTsKKwlpZiAocikgeworCQlEUk1fRVJST1IoIkludmFsaWQgY29tbWFuZCBzdHJlYW0gIVxuIik7CisJCXI2MDBfY3NfcGFyc2VyX2ZpbmkoJnBhcnNlciwgcik7CisJCXJldHVybiByOworCX0KIAlyNjAwX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOwogCXJldHVybiByOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCmluZGV4IDRhOTAyOGEuLjliNjRkNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKQEAgLTY0Myw2ICs2NDMsNyBAQAogI2RlZmluZQkJR18wMDBFNTBfTUNEV19CVVNZKHgpCQkJKCgoeCkgPj4gMTMpICYgMSkKICNkZWZpbmUJCUdfMDAwRTUwX1NFTV9CVVNZKHgpCQkJKCgoeCkgPj4gMTQpICYgMSkKICNkZWZpbmUJCUdfMDAwRTUwX1JMQ19CVVNZKHgpCQkJKCgoeCkgPj4gMTUpICYgMSkKKyNkZWZpbmUJCUdfMDAwRTUwX0JJRl9CVVNZKHgpCQkJKCgoeCkgPj4gMjkpICYgMSkKICNkZWZpbmUJUl8wMDBFNjBfU1JCTV9TT0ZUX1JFU0VUCQkJMHgwRTYwCiAjZGVmaW5lCQlTXzAwMEU2MF9TT0ZUX1JFU0VUX0JJRih4KQkJKCgoeCkgJiAxKSA8PCAxKQogI2RlZmluZQkJU18wMDBFNjBfU09GVF9SRVNFVF9DRyh4KQkJKCgoeCkgJiAxKSA8PCAyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKaW5kZXggYzgzOWI2MC4uNWFiMzViOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCkBAIC00NCwxMSArNDQsMzAgQEAKICAqCS0gVEVTVElORywgVEVTVElORywgVEVTVElORwogICovCiAKKy8qIEluaXRpYWxpemF0aW9uIHBhdGg6CisgKiAgV2UgZXhwZWN0IHRoYXQgYWNjZWxlcmF0aW9uIGluaXRpYWxpemF0aW9uIG1pZ2h0IGZhaWwgZm9yIHZhcmlvdXMKKyAqICByZWFzb25zIGV2ZW4gdGhvdWdodCB3ZSB3b3JrIGhhcmQgdG8gbWFrZSBpdCB3b3JrcyBvbiBtb3N0CisgKiAgY29uZmlndXJhdGlvbnMuIEluIG9yZGVyIHRvIHN0aWxsIGhhdmUgYSB3b3JraW5nIHVzZXJzcGFjZSBpbiBzdWNoCisgKiAgc2l0dWF0aW9uIHRoZSBpbml0IHBhdGggbXVzdCBzdWNjZWVkIHVwIHRvIHRoZSBtZW1vcnkgY29udHJvbGxlcgorICogIGluaXRpYWxpemF0aW9uIHBvaW50LiBGYWlsdXJlIGJlZm9yZSB0aGlzIHBvaW50IGFyZSBjb25zaWRlcmVkIGFzCisgKiAgZmF0YWwgZXJyb3IuIEhlcmUgaXMgdGhlIGluaXQgY2FsbGNoYWluIDoKKyAqICAgICAgcmFkZW9uX2RldmljZV9pbml0ICBwZXJmb3JtIGNvbW1vbiBzdHJ1Y3R1cmUsIG11dGV4IGluaXRpYWxpemF0aW9uCisgKiAgICAgIGFzaWNfaW5pdCAgICAgICAgICAgc2V0dXAgdGhlIEdQVSBtZW1vcnkgbGF5b3V0IGFuZCBwZXJmb3JtIGFsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSB0aW1lIGluaXRpYWxpemF0aW9uIChmYWlsdXJlIGluIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcmUgY29uc2lkZXJlZCBmYXRhbCkKKyAqICAgICAgYXNpY19zdGFydHVwICAgICAgICBzZXR1cCB0aGUgR1BVIGFjY2VsZXJhdGlvbiwgaW4gb3JkZXIgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3cgZ3VpZGVsaW5lIHRoZSBmaXJzdCB0aGluZyB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGRvIGlzIHNldHRpbmcgdGhlIEdQVQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjb250cm9sbGVyIChvbmx5IE1DIHNldHVwIGZhaWx1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgY29uc2lkZXJlZCBhcyBmYXRhbCkKKyAqLworCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogCisjaW5jbHVkZSAicmFkZW9uX2ZhbWlseS5oIgogI2luY2x1ZGUgInJhZGVvbl9tb2RlLmgiCiAjaW5jbHVkZSAicmFkZW9uX3JlZy5oIgogCkBAIC03Nyw2NCArOTYsNiBAQAogI2RlZmluZSBSQURFT05GQl9DT05OX0xJTUlUCQk0CiAjZGVmaW5lIFJBREVPTl9CSU9TX05VTV9TQ1JBVENICQk4CiAKLWVudW0gcmFkZW9uX2ZhbWlseSB7Ci0JQ0hJUF9SMTAwLAotCUNISVBfUlYxMDAsCi0JQ0hJUF9SUzEwMCwKLQlDSElQX1JWMjAwLAotCUNISVBfUlMyMDAsCi0JQ0hJUF9SMjAwLAotCUNISVBfUlYyNTAsCi0JQ0hJUF9SUzMwMCwKLQlDSElQX1JWMjgwLAotCUNISVBfUjMwMCwKLQlDSElQX1IzNTAsCi0JQ0hJUF9SVjM1MCwKLQlDSElQX1JWMzgwLAotCUNISVBfUjQyMCwKLQlDSElQX1I0MjMsCi0JQ0hJUF9SVjQxMCwKLQlDSElQX1JTNDAwLAotCUNISVBfUlM0ODAsCi0JQ0hJUF9SUzYwMCwKLQlDSElQX1JTNjkwLAotCUNISVBfUlM3NDAsCi0JQ0hJUF9SVjUxNSwKLQlDSElQX1I1MjAsCi0JQ0hJUF9SVjUzMCwKLQlDSElQX1JWNTYwLAotCUNISVBfUlY1NzAsCi0JQ0hJUF9SNTgwLAotCUNISVBfUjYwMCwKLQlDSElQX1JWNjEwLAotCUNISVBfUlY2MzAsCi0JQ0hJUF9SVjY3MCwKLQlDSElQX1JWNjIwLAotCUNISVBfUlY2MzUsCi0JQ0hJUF9SUzc4MCwKLQlDSElQX1JTODgwLAotCUNISVBfUlY3NzAsCi0JQ0hJUF9SVjczMCwKLQlDSElQX1JWNzEwLAotCUNISVBfUlY3NDAsCi0JQ0hJUF9MQVNULAotfTsKLQotZW51bSByYWRlb25fY2hpcF9mbGFncyB7Ci0JUkFERU9OX0ZBTUlMWV9NQVNLID0gMHgwMDAwZmZmZlVMLAotCVJBREVPTl9GTEFHU19NQVNLID0gMHhmZmZmMDAwMFVMLAotCVJBREVPTl9JU19NT0JJTElUWSA9IDB4MDAwMTAwMDBVTCwKLQlSQURFT05fSVNfSUdQID0gMHgwMDAyMDAwMFVMLAotCVJBREVPTl9TSU5HTEVfQ1JUQyA9IDB4MDAwNDAwMDBVTCwKLQlSQURFT05fSVNfQUdQID0gMHgwMDA4MDAwMFVMLAotCVJBREVPTl9IQVNfSElFUlogPSAweDAwMTAwMDAwVUwsCi0JUkFERU9OX0lTX1BDSUUgPSAweDAwMjAwMDAwVUwsCi0JUkFERU9OX05FV19NRU1NQVAgPSAweDAwNDAwMDAwVUwsCi0JUkFERU9OX0lTX1BDSSA9IDB4MDA4MDAwMDBVTCwKLQlSQURFT05fSVNfSUdQR0FSVCA9IDB4MDEwMDAwMDBVTCwKLX07Ci0KLQogLyoKICAqIEVycmF0YSB3b3JrYXJvdW5kcy4KICAqLwpAQCAtMzk5LDcgKzM2MCw3IEBACiAJdW5zaWduZWQgbG9uZwkJaWR4OwogCXVpbnQ2NF90CQlncHVfYWRkcjsKIAlzdHJ1Y3QgcmFkZW9uX2ZlbmNlCSpmZW5jZTsKLQl2b2xhdGlsZSB1aW50MzJfdAkqcHRyOworCXVpbnQzMl90CSpwdHI7CiAJdWludDMyX3QJCWxlbmd0aF9kdzsKIH07CiAKQEAgLTQ3Miw3ICs0MzMsMTIgQEAKIHN0cnVjdCByYWRlb25fY3NfY2h1bmsgewogCXVpbnQzMl90CQljaHVua19pZDsKIAl1aW50MzJfdAkJbGVuZ3RoX2R3OworCWludCBrcGFnZV9pZHhbMl07CisJdWludDMyX3QgICAgICAgICAgICAgICAgKmtwYWdlWzJdOwogCXVpbnQzMl90CQkqa2RhdGE7CisJdm9pZCBfX3VzZXIgKnVzZXJfcHRyOworCWludCBsYXN0X2NvcGllZF9wYWdlOworCWludCBsYXN0X3BhZ2VfaW5kZXg7CiB9OwogCiBzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciB7CkBAIC00OTUsOCArNDYxLDM4IEBACiAJc3RydWN0IHJhZGVvbl9pYgkqaWI7CiAJdm9pZAkJCSp0cmFjazsKIAl1bnNpZ25lZAkJZmFtaWx5OworCWludCBwYXJzZXJfZXJyb3I7CiB9OwogCitleHRlcm4gaW50IHJhZGVvbl9jc191cGRhdGVfcGFnZXMoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIGludCBwZ19pZHgpOworZXh0ZXJuIGludCByYWRlb25fY3NfZmluaXNoX3BhZ2VzKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKTsKKworCitzdGF0aWMgaW5saW5lIHUzMiByYWRlb25fZ2V0X2liX3ZhbHVlKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCBpbnQgaWR4KQoreworCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKmliYyA9ICZwLT5jaHVua3NbcC0+Y2h1bmtfaWJfaWR4XTsKKwl1MzIgcGdfaWR4LCBwZ19vZmZzZXQ7CisJdTMyIGlkeF92YWx1ZSA9IDA7CisJaW50IG5ld19wYWdlOworCisJcGdfaWR4ID0gKGlkeCAqIDQpIC8gUEFHRV9TSVpFOworCXBnX29mZnNldCA9IChpZHggKiA0KSAlIFBBR0VfU0laRTsKKworCWlmIChpYmMtPmtwYWdlX2lkeFswXSA9PSBwZ19pZHgpCisJCXJldHVybiBpYmMtPmtwYWdlWzBdW3BnX29mZnNldC80XTsKKwlpZiAoaWJjLT5rcGFnZV9pZHhbMV0gPT0gcGdfaWR4KQorCQlyZXR1cm4gaWJjLT5rcGFnZVsxXVtwZ19vZmZzZXQvNF07CisKKwluZXdfcGFnZSA9IHJhZGVvbl9jc191cGRhdGVfcGFnZXMocCwgcGdfaWR4KTsKKwlpZiAobmV3X3BhZ2UgPCAwKSB7CisJCXAtPnBhcnNlcl9lcnJvciA9IG5ld19wYWdlOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZHhfdmFsdWUgPSBpYmMtPmtwYWdlW25ld19wYWdlXVtwZ19vZmZzZXQvNF07CisJcmV0dXJuIGlkeF92YWx1ZTsKK30KKwogc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgewogCXVuc2lnbmVkCWlkeDsKIAl1bnNpZ25lZAl0eXBlOwpAQCAtNTk0LDE4ICs1OTAsOCBAQAogCXZvaWQgKCpmaW5pKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJaW50ICgqc3VzcGVuZCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotCXZvaWQgKCplcnJhdGEpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQl2b2lkICgqdnJhbV9pbmZvKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJdm9pZCAoKnZnYV9zZXRfc3RhdGUpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBib29sIHN0YXRlKTsKIAlpbnQgKCpncHVfcmVzZXQpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQlpbnQgKCptY19pbml0KShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0Jdm9pZCAoKm1jX2ZpbmkpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQlpbnQgKCp3Yl9pbml0KShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0Jdm9pZCAoKndiX2ZpbmkpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQlpbnQgKCpnYXJ0X2luaXQpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQl2b2lkICgqZ2FydF9maW5pKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0JaW50ICgqZ2FydF9lbmFibGUpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQl2b2lkICgqZ2FydF9kaXNhYmxlKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJdm9pZCAoKmdhcnRfdGxiX2ZsdXNoKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJaW50ICgqZ2FydF9zZXRfcGFnZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKTsKIAlpbnQgKCpjcF9pbml0KShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdW5zaWduZWQgcmluZ19zaXplKTsKQEAgLTYxNSw3ICs2MDEsNiBAQAogCXZvaWQgKCpyaW5nX3N0YXJ0KShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJaW50ICgqcmluZ190ZXN0KShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJdm9pZCAoKnJpbmdfaWJfZXhlY3V0ZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25faWIgKmliKTsKLQlpbnQgKCppYl90ZXN0KShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJaW50ICgqaXJxX3NldCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCWludCAoKmlycV9wcm9jZXNzKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJdTMyICgqZ2V0X3ZibGFua19jb3VudGVyKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwpAQCAtNzkzLDcgKzc3OCw2IEBACiAJYm9vbAkJCQlzaHV0ZG93bjsKIAlib29sCQkJCXN1c3BlbmQ7CiAJYm9vbAkJCQluZWVkX2RtYTMyOwotCWJvb2wJCQkJbmV3X2luaXRfcGF0aDsKIAlib29sCQkJCWFjY2VsX3dvcmtpbmc7CiAJc3RydWN0IHJhZGVvbl9zdXJmYWNlX3JlZyBzdXJmYWNlX3JlZ3NbUkFERU9OX0dFTV9NQVhfU1VSRkFDRVNdOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqbWVfZnc7CS8qIGFsbCBmYW1pbHkgTUUgZmlybXdhcmUgKi8KQEAgLTk1MywyOCArOTM3LDE0IEBACiAjZGVmaW5lIHJhZGVvbl9yZXN1bWUocmRldikgKHJkZXYpLT5hc2ljLT5yZXN1bWUoKHJkZXYpKQogI2RlZmluZSByYWRlb25fc3VzcGVuZChyZGV2KSAocmRldiktPmFzaWMtPnN1c3BlbmQoKHJkZXYpKQogI2RlZmluZSByYWRlb25fY3NfcGFyc2UocCkgcmRldi0+YXNpYy0+Y3NfcGFyc2UoKHApKQotI2RlZmluZSByYWRlb25fZXJyYXRhKHJkZXYpIChyZGV2KS0+YXNpYy0+ZXJyYXRhKChyZGV2KSkKLSNkZWZpbmUgcmFkZW9uX3ZyYW1faW5mbyhyZGV2KSAocmRldiktPmFzaWMtPnZyYW1faW5mbygocmRldikpCiAjZGVmaW5lIHJhZGVvbl92Z2Ffc2V0X3N0YXRlKHJkZXYsIHN0YXRlKSAocmRldiktPmFzaWMtPnZnYV9zZXRfc3RhdGUoKHJkZXYpLCAoc3RhdGUpKQogI2RlZmluZSByYWRlb25fZ3B1X3Jlc2V0KHJkZXYpIChyZGV2KS0+YXNpYy0+Z3B1X3Jlc2V0KChyZGV2KSkKLSNkZWZpbmUgcmFkZW9uX21jX2luaXQocmRldikgKHJkZXYpLT5hc2ljLT5tY19pbml0KChyZGV2KSkKLSNkZWZpbmUgcmFkZW9uX21jX2ZpbmkocmRldikgKHJkZXYpLT5hc2ljLT5tY19maW5pKChyZGV2KSkKLSNkZWZpbmUgcmFkZW9uX3diX2luaXQocmRldikgKHJkZXYpLT5hc2ljLT53Yl9pbml0KChyZGV2KSkKLSNkZWZpbmUgcmFkZW9uX3diX2ZpbmkocmRldikgKHJkZXYpLT5hc2ljLT53Yl9maW5pKChyZGV2KSkKLSNkZWZpbmUgcmFkZW9uX2dwdV9nYXJ0X2luaXQocmRldikgKHJkZXYpLT5hc2ljLT5nYXJ0X2luaXQoKHJkZXYpKQotI2RlZmluZSByYWRlb25fZ3B1X2dhcnRfZmluaShyZGV2KSAocmRldiktPmFzaWMtPmdhcnRfZmluaSgocmRldikpCi0jZGVmaW5lIHJhZGVvbl9nYXJ0X2VuYWJsZShyZGV2KSAocmRldiktPmFzaWMtPmdhcnRfZW5hYmxlKChyZGV2KSkKLSNkZWZpbmUgcmFkZW9uX2dhcnRfZGlzYWJsZShyZGV2KSAocmRldiktPmFzaWMtPmdhcnRfZGlzYWJsZSgocmRldikpCiAjZGVmaW5lIHJhZGVvbl9nYXJ0X3RsYl9mbHVzaChyZGV2KSAocmRldiktPmFzaWMtPmdhcnRfdGxiX2ZsdXNoKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX2dhcnRfc2V0X3BhZ2UocmRldiwgaSwgcCkgKHJkZXYpLT5hc2ljLT5nYXJ0X3NldF9wYWdlKChyZGV2KSwgKGkpLCAocCkpCi0jZGVmaW5lIHJhZGVvbl9jcF9pbml0KHJkZXYscnNpemUpIChyZGV2KS0+YXNpYy0+Y3BfaW5pdCgocmRldiksIChyc2l6ZSkpCi0jZGVmaW5lIHJhZGVvbl9jcF9maW5pKHJkZXYpIChyZGV2KS0+YXNpYy0+Y3BfZmluaSgocmRldikpCi0jZGVmaW5lIHJhZGVvbl9jcF9kaXNhYmxlKHJkZXYpIChyZGV2KS0+YXNpYy0+Y3BfZGlzYWJsZSgocmRldikpCiAjZGVmaW5lIHJhZGVvbl9jcF9jb21taXQocmRldikgKHJkZXYpLT5hc2ljLT5jcF9jb21taXQoKHJkZXYpKQogI2RlZmluZSByYWRlb25fcmluZ19zdGFydChyZGV2KSAocmRldiktPmFzaWMtPnJpbmdfc3RhcnQoKHJkZXYpKQogI2RlZmluZSByYWRlb25fcmluZ190ZXN0KHJkZXYpIChyZGV2KS0+YXNpYy0+cmluZ190ZXN0KChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX3JpbmdfaWJfZXhlY3V0ZShyZGV2LCBpYikgKHJkZXYpLT5hc2ljLT5yaW5nX2liX2V4ZWN1dGUoKHJkZXYpLCAoaWIpKQotI2RlZmluZSByYWRlb25faWJfdGVzdChyZGV2KSAocmRldiktPmFzaWMtPmliX3Rlc3QoKHJkZXYpKQogI2RlZmluZSByYWRlb25faXJxX3NldChyZGV2KSAocmRldiktPmFzaWMtPmlycV9zZXQoKHJkZXYpKQogI2RlZmluZSByYWRlb25faXJxX3Byb2Nlc3MocmRldikgKHJkZXYpLT5hc2ljLT5pcnFfcHJvY2VzcygocmRldikpCiAjZGVmaW5lIHJhZGVvbl9nZXRfdmJsYW5rX2NvdW50ZXIocmRldiwgY3J0YykgKHJkZXYpLT5hc2ljLT5nZXRfdmJsYW5rX2NvdW50ZXIoKHJkZXYpLCAoY3J0YykpCkBAIC0xMDAwLDYgKzk3MCw4IEBACiBleHRlcm4gdm9pZCByYWRlb25fc2NyYXRjaF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9zdXJmYWNlX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCByYWRlb25fY3NfcGFyc2VyX2luaXQoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2xlZ2FjeV9zZXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgZW5hYmxlKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9hdG9tX3NldF9jbG9ja19nYXRpbmcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBlbmFibGUpOwogCiAvKiByMTAwLHJ2MTAwLHJzMTAwLHJ2MjAwLHJzMjAwLHIyMDAscnYyNTAscnMzMDAscnYyODAgKi8KIHN0cnVjdCByMTAwX21jX3NhdmUgewpAQCAtMTAzMSwyMyArMTAwMyw3MSBAQAogZXh0ZXJuIHZvaWQgcjEwMF93Yl9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHIxMDBfd2JfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gaW50IHIxMDBfd2JfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByMTAwX2hkcF9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHIxMDBfcmIyZF9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHIxMDBfY3BfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjEwMF92Z2FfcmVuZGVyX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCByMTAwX2NzX3RyYWNrX2NoZWNrX3BrdDNfaW5keF9idWZmZXIoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCisJCQkJCQlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAorCQkJCQkJc3RydWN0IHJhZGVvbl9vYmplY3QgKnJvYmopOworZXh0ZXJuIGludCByMTAwX2NzX3BhcnNlX3BhY2tldDAoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCisJCQkJc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKKwkJCQljb25zdCB1bnNpZ25lZCAqYXV0aCwgdW5zaWduZWQgbiwKKwkJCQlyYWRlb25fcGFja2V0MF9jaGVja190IGNoZWNrKTsKK2V4dGVybiBpbnQgcjEwMF9jc19wYWNrZXRfcGFyc2Uoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCisJCQkJc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKKwkJCQl1bnNpZ25lZCBpZHgpOworCisvKiBydjIwMCxydjI1MCxydjI4MCAqLworZXh0ZXJuIHZvaWQgcjIwMF9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiAvKiByMzAwLHIzNTAscnYzNTAscnYzNzAscnYzODAgKi8KIGV4dGVybiB2b2lkIHIzMDBfc2V0X3JlZ19zYWZlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHIzMDBfbWNfcHJvZ3JhbShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByMzAwX3ZyYW1faW5mbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByMzAwX2Nsb2NrX3N0YXJ0dXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCByMzAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCBydjM3MF9wY2llX2dhcnRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBydjM3MF9wY2llX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gaW50IHJ2MzcwX3BjaWVfZ2FydF9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcnYzNzBfcGNpZV9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiAvKiByNDIwLHI0MjMscnY0MTAgKi8KK2V4dGVybiBpbnQgcjQyMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB1MzIgcjQyMF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnKTsKIGV4dGVybiB2b2lkIHI0MjBfbWNfd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHJlZywgdTMyIHYpOwogZXh0ZXJuIGludCByNDIwX2RlYnVnZnNfcGlwZXNfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHI0MjBfcGlwZXNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIC8qIHJ2NTE1ICovCitzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSB7CisJdTMyIGQxdmdhX2NvbnRyb2w7CisJdTMyIGQydmdhX2NvbnRyb2w7CisJdTMyIHZnYV9yZW5kZXJfY29udHJvbDsKKwl1MzIgdmdhX2hkcF9jb250cm9sOworCXUzMiBkMWNydGNfY29udHJvbDsKKwl1MzIgZDJjcnRjX2NvbnRyb2w7Cit9OwogZXh0ZXJuIHZvaWQgcnY1MTVfYmFuZHdpZHRoX2F2aXZvX3VwZGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCBydjUxNV92Z2FfcmVuZGVyX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcnY1MTVfc2V0X3NhZmVfcmVnaXN0ZXJzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHJ2NTE1X21jX3N0b3Aoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCBydjUxNV9tY19zYXZlICpzYXZlKTsKK2V4dGVybiB2b2lkIHJ2NTE1X21jX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJ2NTE1X21jX3NhdmUgKnNhdmUpOworZXh0ZXJuIHZvaWQgcnY1MTVfY2xvY2tfc3RhcnR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCBydjUxNV9kZWJ1Z2ZzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBpbnQgcnY1MTVfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKKy8qIHJzNDAwICovCitleHRlcm4gaW50IHJzNDAwX2dhcnRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHJzNDAwX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHJzNDAwX2dhcnRfYWRqdXN0X3NpemUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcnM0MDBfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHJzNDAwX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKKy8qIHJzNjAwICovCitleHRlcm4gdm9pZCByczYwMF9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCByczYwMF9pcnFfc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHJzNjAwX2lycV9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLyogcnM2OTAsIHJzNzQwICovCiBleHRlcm4gdm9pZCByczY5MF9saW5lX2J1ZmZlcl9hZGp1c3Qoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCkBAIC0xMDY2LDggKzEwODYsOSBAQAogZXh0ZXJuIHZvaWQgcjYwMF9wY2llX2dhcnRfdGxiX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcjYwMF9pYl90ZXN0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcjYwMF9yaW5nX3Rlc3Qoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIGludCByNjAwX3diX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcjYwMF93Yl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBpbnQgcjYwMF93Yl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjYwMF93Yl9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHI2MDBfc2NyYXRjaF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcjYwMF9ibGl0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcjYwMF9ibGl0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oCmluZGV4IDg5NjhmNzguLmMzNTMyYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKQEAgLTQxLDI4ICs0MSwxNyBAQAogLyoKICAqIHIxMDAscnYxMDAscnMxMDAscnYyMDAscnMyMDAscjIwMCxydjI1MCxyczMwMCxydjI4MAogICovCi1pbnQgcjEwMF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMjAwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCByMTAwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjEwMF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBpbnQgcjEwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBpbnQgcjEwMF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdWludDMyX3QgcjEwMF9tbV9ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpOwogdm9pZCByMTAwX21tX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7Ci12b2lkIHIxMDBfZXJyYXRhKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjEwMF92cmFtX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByMTAwX3ZnYV9zZXRfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGJvb2wgc3RhdGUpOwogaW50IHIxMDBfZ3B1X3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMTAwX21jX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByMTAwX21jX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdTMyIHIxMDBfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7Ci1pbnQgcjEwMF93Yl9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjEwMF93Yl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMTAwX3BjaV9nYXJ0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByMTAwX3BjaV9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHIxMDBfcGNpX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjEwMF9wY2lfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcjEwMF9wY2lfZ2FydF90bGJfZmx1c2goc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHIxMDBfcGNpX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKTsKLWludCByMTAwX2NwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIHJpbmdfc2l6ZSk7Ci12b2lkIHIxMDBfY3BfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHIxMDBfY3BfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHIxMDBfY3BfY29tbWl0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcjEwMF9yaW5nX3N0YXJ0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByMTAwX2lycV9zZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtODMsMzMgKzcyLDIxIEBACiBpbnQgcjEwMF9jbGVhcl9zdXJmYWNlX3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHJlZyk7CiB2b2lkIHIxMDBfYmFuZHdpZHRoX3VwZGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHIxMDBfcmluZ19pYl9leGVjdXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX2liICppYik7Ci1pbnQgcjEwMF9pYl90ZXN0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByMTAwX3JpbmdfdGVzdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcjEwMF9hc2ljID0gewogCS5pbml0ID0gJnIxMDBfaW5pdCwKLQkuZXJyYXRhID0gJnIxMDBfZXJyYXRhLAotCS52cmFtX2luZm8gPSAmcjEwMF92cmFtX2luZm8sCisJLmZpbmkgPSAmcjEwMF9maW5pLAorCS5zdXNwZW5kID0gJnIxMDBfc3VzcGVuZCwKKwkucmVzdW1lID0gJnIxMDBfcmVzdW1lLAogCS52Z2Ffc2V0X3N0YXRlID0gJnIxMDBfdmdhX3NldF9zdGF0ZSwKIAkuZ3B1X3Jlc2V0ID0gJnIxMDBfZ3B1X3Jlc2V0LAotCS5tY19pbml0ID0gJnIxMDBfbWNfaW5pdCwKLQkubWNfZmluaSA9ICZyMTAwX21jX2ZpbmksCi0JLndiX2luaXQgPSAmcjEwMF93Yl9pbml0LAotCS53Yl9maW5pID0gJnIxMDBfd2JfZmluaSwKLQkuZ2FydF9pbml0ID0gJnIxMDBfcGNpX2dhcnRfaW5pdCwKLQkuZ2FydF9maW5pID0gJnIxMDBfcGNpX2dhcnRfZmluaSwKLQkuZ2FydF9lbmFibGUgPSAmcjEwMF9wY2lfZ2FydF9lbmFibGUsCi0JLmdhcnRfZGlzYWJsZSA9ICZyMTAwX3BjaV9nYXJ0X2Rpc2FibGUsCiAJLmdhcnRfdGxiX2ZsdXNoID0gJnIxMDBfcGNpX2dhcnRfdGxiX2ZsdXNoLAogCS5nYXJ0X3NldF9wYWdlID0gJnIxMDBfcGNpX2dhcnRfc2V0X3BhZ2UsCi0JLmNwX2luaXQgPSAmcjEwMF9jcF9pbml0LAotCS5jcF9maW5pID0gJnIxMDBfY3BfZmluaSwKLQkuY3BfZGlzYWJsZSA9ICZyMTAwX2NwX2Rpc2FibGUsCiAJLmNwX2NvbW1pdCA9ICZyMTAwX2NwX2NvbW1pdCwKIAkucmluZ19zdGFydCA9ICZyMTAwX3Jpbmdfc3RhcnQsCiAJLnJpbmdfdGVzdCA9ICZyMTAwX3JpbmdfdGVzdCwKIAkucmluZ19pYl9leGVjdXRlID0gJnIxMDBfcmluZ19pYl9leGVjdXRlLAotCS5pYl90ZXN0ID0gJnIxMDBfaWJfdGVzdCwKIAkuaXJxX3NldCA9ICZyMTAwX2lycV9zZXQsCiAJLmlycV9wcm9jZXNzID0gJnIxMDBfaXJxX3Byb2Nlc3MsCiAJLmdldF92YmxhbmtfY291bnRlciA9ICZyMTAwX2dldF92YmxhbmtfY291bnRlciwKQEAgLTEzMSw1NSArMTA4LDM4IEBACiAvKgogICogcjMwMCxyMzUwLHJ2MzUwLHJ2MzgwCiAgKi8KLWludCByMzAwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByMzAwX2VycmF0YShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHIzMDBfdnJhbV9pbmZvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMzAwX2dwdV9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcjMwMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjMwMF9tY19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjMwMF9yaW5nX3N0YXJ0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjMwMF9mZW5jZV9yaW5nX2VtaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkgIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKTsKLWludCByMzAwX2NzX3BhcnNlKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKTsKLWludCBydjM3MF9wY2llX2dhcnRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHJ2MzcwX3BjaWVfZ2FydF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCBydjM3MF9wY2llX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcnYzNzBfcGNpZV9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCBydjM3MF9wY2llX2dhcnRfdGxiX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCBydjM3MF9wY2llX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKTsKLXVpbnQzMl90IHJ2MzcwX3BjaWVfcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnKTsKLXZvaWQgcnYzNzBfcGNpZV93cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHYpOwotdm9pZCBydjM3MF9zZXRfcGNpZV9sYW5lcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGxhbmVzKTsKLWludCByMzAwX2NvcHlfZG1hKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkgIHVpbnQ2NF90IHNyY19vZmZzZXQsCi0JCSAgdWludDY0X3QgZHN0X29mZnNldCwKLQkJICB1bnNpZ25lZCBudW1fcGFnZXMsCi0JCSAgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpOwotCitleHRlcm4gaW50IHIzMDBfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByMzAwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCByMzAwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCByMzAwX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHIzMDBfZ3B1X3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHIzMDBfcmluZ19zdGFydChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByMzAwX2ZlbmNlX3JpbmdfZW1pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCQlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSk7CitleHRlcm4gaW50IHIzMDBfY3NfcGFyc2Uoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnApOworZXh0ZXJuIHZvaWQgcnYzNzBfcGNpZV9nYXJ0X3RsYl9mbHVzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHJ2MzcwX3BjaWVfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGksIHVpbnQ2NF90IGFkZHIpOworZXh0ZXJuIHVpbnQzMl90IHJ2MzcwX3BjaWVfcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnKTsKK2V4dGVybiB2b2lkIHJ2MzcwX3BjaWVfd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2KTsKK2V4dGVybiB2b2lkIHJ2MzcwX3NldF9wY2llX2xhbmVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgbGFuZXMpOworZXh0ZXJuIGludCByMzAwX2NvcHlfZG1hKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJdWludDY0X3Qgc3JjX29mZnNldCwKKwkJCXVpbnQ2NF90IGRzdF9vZmZzZXQsCisJCQl1bnNpZ25lZCBudW1fcGFnZXMsCisJCQlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSk7CiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHIzMDBfYXNpYyA9IHsKIAkuaW5pdCA9ICZyMzAwX2luaXQsCi0JLmVycmF0YSA9ICZyMzAwX2VycmF0YSwKLQkudnJhbV9pbmZvID0gJnIzMDBfdnJhbV9pbmZvLAorCS5maW5pID0gJnIzMDBfZmluaSwKKwkuc3VzcGVuZCA9ICZyMzAwX3N1c3BlbmQsCisJLnJlc3VtZSA9ICZyMzAwX3Jlc3VtZSwKIAkudmdhX3NldF9zdGF0ZSA9ICZyMTAwX3ZnYV9zZXRfc3RhdGUsCiAJLmdwdV9yZXNldCA9ICZyMzAwX2dwdV9yZXNldCwKLQkubWNfaW5pdCA9ICZyMzAwX21jX2luaXQsCi0JLm1jX2ZpbmkgPSAmcjMwMF9tY19maW5pLAotCS53Yl9pbml0ID0gJnIxMDBfd2JfaW5pdCwKLQkud2JfZmluaSA9ICZyMTAwX3diX2ZpbmksCi0JLmdhcnRfaW5pdCA9ICZyMTAwX3BjaV9nYXJ0X2luaXQsCi0JLmdhcnRfZmluaSA9ICZyMTAwX3BjaV9nYXJ0X2ZpbmksCi0JLmdhcnRfZW5hYmxlID0gJnIxMDBfcGNpX2dhcnRfZW5hYmxlLAotCS5nYXJ0X2Rpc2FibGUgPSAmcjEwMF9wY2lfZ2FydF9kaXNhYmxlLAogCS5nYXJ0X3RsYl9mbHVzaCA9ICZyMTAwX3BjaV9nYXJ0X3RsYl9mbHVzaCwKIAkuZ2FydF9zZXRfcGFnZSA9ICZyMTAwX3BjaV9nYXJ0X3NldF9wYWdlLAotCS5jcF9pbml0ID0gJnIxMDBfY3BfaW5pdCwKLQkuY3BfZmluaSA9ICZyMTAwX2NwX2ZpbmksCi0JLmNwX2Rpc2FibGUgPSAmcjEwMF9jcF9kaXNhYmxlLAogCS5jcF9jb21taXQgPSAmcjEwMF9jcF9jb21taXQsCiAJLnJpbmdfc3RhcnQgPSAmcjMwMF9yaW5nX3N0YXJ0LAogCS5yaW5nX3Rlc3QgPSAmcjEwMF9yaW5nX3Rlc3QsCiAJLnJpbmdfaWJfZXhlY3V0ZSA9ICZyMTAwX3JpbmdfaWJfZXhlY3V0ZSwKLQkuaWJfdGVzdCA9ICZyMTAwX2liX3Rlc3QsCiAJLmlycV9zZXQgPSAmcjEwMF9pcnFfc2V0LAogCS5pcnFfcHJvY2VzcyA9ICZyMTAwX2lycV9wcm9jZXNzLAogCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSAmcjEwMF9nZXRfdmJsYW5rX2NvdW50ZXIsCkBAIC0yMDksMjYgKzE2OSwxNCBAQAogCS5maW5pID0gJnI0MjBfZmluaSwKIAkuc3VzcGVuZCA9ICZyNDIwX3N1c3BlbmQsCiAJLnJlc3VtZSA9ICZyNDIwX3Jlc3VtZSwKLQkuZXJyYXRhID0gTlVMTCwKLQkudnJhbV9pbmZvID0gTlVMTCwKIAkudmdhX3NldF9zdGF0ZSA9ICZyMTAwX3ZnYV9zZXRfc3RhdGUsCiAJLmdwdV9yZXNldCA9ICZyMzAwX2dwdV9yZXNldCwKLQkubWNfaW5pdCA9IE5VTEwsCi0JLm1jX2ZpbmkgPSBOVUxMLAotCS53Yl9pbml0ID0gTlVMTCwKLQkud2JfZmluaSA9IE5VTEwsCi0JLmdhcnRfZW5hYmxlID0gTlVMTCwKLQkuZ2FydF9kaXNhYmxlID0gTlVMTCwKIAkuZ2FydF90bGJfZmx1c2ggPSAmcnYzNzBfcGNpZV9nYXJ0X3RsYl9mbHVzaCwKIAkuZ2FydF9zZXRfcGFnZSA9ICZydjM3MF9wY2llX2dhcnRfc2V0X3BhZ2UsCi0JLmNwX2luaXQgPSBOVUxMLAotCS5jcF9maW5pID0gTlVMTCwKLQkuY3BfZGlzYWJsZSA9IE5VTEwsCiAJLmNwX2NvbW1pdCA9ICZyMTAwX2NwX2NvbW1pdCwKIAkucmluZ19zdGFydCA9ICZyMzAwX3Jpbmdfc3RhcnQsCiAJLnJpbmdfdGVzdCA9ICZyMTAwX3JpbmdfdGVzdCwKIAkucmluZ19pYl9leGVjdXRlID0gJnIxMDBfcmluZ19pYl9leGVjdXRlLAotCS5pYl90ZXN0ID0gTlVMTCwKIAkuaXJxX3NldCA9ICZyMTAwX2lycV9zZXQsCiAJLmlycV9wcm9jZXNzID0gJnIxMDBfaXJxX3Byb2Nlc3MsCiAJLmdldF92YmxhbmtfY291bnRlciA9ICZyMTAwX2dldF92YmxhbmtfY291bnRlciwKQEAgLTI1MCw0MiArMTk4LDI3IEBACiAvKgogICogcnM0MDAscnM0ODAKICAqLwotdm9pZCByczQwMF9lcnJhdGEoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczQwMF92cmFtX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJzNDAwX21jX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczQwMF9tY19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByczQwMF9nYXJ0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczQwMF9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJzNDAwX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcnM0MDBfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBpbnQgcnM0MDBfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByczQwMF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBpbnQgcnM0MDBfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHJzNDAwX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJzNDAwX2dhcnRfdGxiX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByczQwMF9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaSwgdWludDY0X3QgYWRkcik7CiB1aW50MzJfdCByczQwMF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpOwogdm9pZCByczQwMF9tY193cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHYpOwogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByczQwMF9hc2ljID0gewotCS5pbml0ID0gJnIzMDBfaW5pdCwKLQkuZXJyYXRhID0gJnJzNDAwX2VycmF0YSwKLQkudnJhbV9pbmZvID0gJnJzNDAwX3ZyYW1faW5mbywKKwkuaW5pdCA9ICZyczQwMF9pbml0LAorCS5maW5pID0gJnJzNDAwX2ZpbmksCisJLnN1c3BlbmQgPSAmcnM0MDBfc3VzcGVuZCwKKwkucmVzdW1lID0gJnJzNDAwX3Jlc3VtZSwKIAkudmdhX3NldF9zdGF0ZSA9ICZyMTAwX3ZnYV9zZXRfc3RhdGUsCiAJLmdwdV9yZXNldCA9ICZyMzAwX2dwdV9yZXNldCwKLQkubWNfaW5pdCA9ICZyczQwMF9tY19pbml0LAotCS5tY19maW5pID0gJnJzNDAwX21jX2ZpbmksCi0JLndiX2luaXQgPSAmcjEwMF93Yl9pbml0LAotCS53Yl9maW5pID0gJnIxMDBfd2JfZmluaSwKLQkuZ2FydF9pbml0ID0gJnJzNDAwX2dhcnRfaW5pdCwKLQkuZ2FydF9maW5pID0gJnJzNDAwX2dhcnRfZmluaSwKLQkuZ2FydF9lbmFibGUgPSAmcnM0MDBfZ2FydF9lbmFibGUsCi0JLmdhcnRfZGlzYWJsZSA9ICZyczQwMF9nYXJ0X2Rpc2FibGUsCiAJLmdhcnRfdGxiX2ZsdXNoID0gJnJzNDAwX2dhcnRfdGxiX2ZsdXNoLAogCS5nYXJ0X3NldF9wYWdlID0gJnJzNDAwX2dhcnRfc2V0X3BhZ2UsCi0JLmNwX2luaXQgPSAmcjEwMF9jcF9pbml0LAotCS5jcF9maW5pID0gJnIxMDBfY3BfZmluaSwKLQkuY3BfZGlzYWJsZSA9ICZyMTAwX2NwX2Rpc2FibGUsCiAJLmNwX2NvbW1pdCA9ICZyMTAwX2NwX2NvbW1pdCwKIAkucmluZ19zdGFydCA9ICZyMzAwX3Jpbmdfc3RhcnQsCiAJLnJpbmdfdGVzdCA9ICZyMTAwX3JpbmdfdGVzdCwKIAkucmluZ19pYl9leGVjdXRlID0gJnIxMDBfcmluZ19pYl9leGVjdXRlLAotCS5pYl90ZXN0ID0gJnIxMDBfaWJfdGVzdCwKIAkuaXJxX3NldCA9ICZyMTAwX2lycV9zZXQsCiAJLmlycV9wcm9jZXNzID0gJnIxMDBfaXJxX3Byb2Nlc3MsCiAJLmdldF92YmxhbmtfY291bnRlciA9ICZyMTAwX2dldF92YmxhbmtfY291bnRlciwKQEAgLTMwNywxOCArMjQwLDEzIEBACiAvKgogICogcnM2MDAuCiAgKi8KLWludCByczYwMF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcnM2MDBfZXJyYXRhKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcnM2MDBfdnJhbV9pbmZvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByczYwMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcnM2MDBfbWNfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHJzNjAwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcnM2MDBfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHJzNjAwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCByczYwMF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJzNjAwX2lycV9zZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJzNjAwX2lycV9wcm9jZXNzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHUzMiByczYwMF9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKLWludCByczYwMF9nYXJ0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczYwMF9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJzNjAwX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcnM2MDBfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcnM2MDBfZ2FydF90bGJfZmx1c2goc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJzNjAwX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKTsKIHVpbnQzMl90IHJzNjAwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7CkBAIC0zMjYsMjggKzI1NCwxNyBAQAogdm9pZCByczYwMF9iYW5kd2lkdGhfdXBkYXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcnM2MDBfYXNpYyA9IHsKIAkuaW5pdCA9ICZyczYwMF9pbml0LAotCS5lcnJhdGEgPSAmcnM2MDBfZXJyYXRhLAotCS52cmFtX2luZm8gPSAmcnM2MDBfdnJhbV9pbmZvLAorCS5maW5pID0gJnJzNjAwX2ZpbmksCisJLnN1c3BlbmQgPSAmcnM2MDBfc3VzcGVuZCwKKwkucmVzdW1lID0gJnJzNjAwX3Jlc3VtZSwKIAkudmdhX3NldF9zdGF0ZSA9ICZyMTAwX3ZnYV9zZXRfc3RhdGUsCiAJLmdwdV9yZXNldCA9ICZyMzAwX2dwdV9yZXNldCwKLQkubWNfaW5pdCA9ICZyczYwMF9tY19pbml0LAotCS5tY19maW5pID0gJnJzNjAwX21jX2ZpbmksCi0JLndiX2luaXQgPSAmcjEwMF93Yl9pbml0LAotCS53Yl9maW5pID0gJnIxMDBfd2JfZmluaSwKLQkuZ2FydF9pbml0ID0gJnJzNjAwX2dhcnRfaW5pdCwKLQkuZ2FydF9maW5pID0gJnJzNjAwX2dhcnRfZmluaSwKLQkuZ2FydF9lbmFibGUgPSAmcnM2MDBfZ2FydF9lbmFibGUsCi0JLmdhcnRfZGlzYWJsZSA9ICZyczYwMF9nYXJ0X2Rpc2FibGUsCiAJLmdhcnRfdGxiX2ZsdXNoID0gJnJzNjAwX2dhcnRfdGxiX2ZsdXNoLAogCS5nYXJ0X3NldF9wYWdlID0gJnJzNjAwX2dhcnRfc2V0X3BhZ2UsCi0JLmNwX2luaXQgPSAmcjEwMF9jcF9pbml0LAotCS5jcF9maW5pID0gJnIxMDBfY3BfZmluaSwKLQkuY3BfZGlzYWJsZSA9ICZyMTAwX2NwX2Rpc2FibGUsCiAJLmNwX2NvbW1pdCA9ICZyMTAwX2NwX2NvbW1pdCwKIAkucmluZ19zdGFydCA9ICZyMzAwX3Jpbmdfc3RhcnQsCiAJLnJpbmdfdGVzdCA9ICZyMTAwX3JpbmdfdGVzdCwKIAkucmluZ19pYl9leGVjdXRlID0gJnIxMDBfcmluZ19pYl9leGVjdXRlLAotCS5pYl90ZXN0ID0gJnIxMDBfaWJfdGVzdCwKIAkuaXJxX3NldCA9ICZyczYwMF9pcnFfc2V0LAogCS5pcnFfcHJvY2VzcyA9ICZyczYwMF9pcnFfcHJvY2VzcywKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gJnJzNjAwX2dldF92YmxhbmtfY291bnRlciwKQEAgLTM2NywzNyArMjg0LDI2IEBACiAvKgogICogcnM2OTAscnM3NDAKICAqLwotdm9pZCByczY5MF9lcnJhdGEoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczY5MF92cmFtX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJzNjkwX21jX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczY5MF9tY19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2ludCByczY5MF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcnM2OTBfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitpbnQgcnM2OTBfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2ludCByczY5MF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHVpbnQzMl90IHJzNjkwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7CiB2b2lkIHJzNjkwX21jX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7CiB2b2lkIHJzNjkwX2JhbmR3aWR0aF91cGRhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByczY5MF9hc2ljID0gewotCS5pbml0ID0gJnJzNjAwX2luaXQsCi0JLmVycmF0YSA9ICZyczY5MF9lcnJhdGEsCi0JLnZyYW1faW5mbyA9ICZyczY5MF92cmFtX2luZm8sCisJLmluaXQgPSAmcnM2OTBfaW5pdCwKKwkuZmluaSA9ICZyczY5MF9maW5pLAorCS5zdXNwZW5kID0gJnJzNjkwX3N1c3BlbmQsCisJLnJlc3VtZSA9ICZyczY5MF9yZXN1bWUsCiAJLnZnYV9zZXRfc3RhdGUgPSAmcjEwMF92Z2Ffc2V0X3N0YXRlLAogCS5ncHVfcmVzZXQgPSAmcjMwMF9ncHVfcmVzZXQsCi0JLm1jX2luaXQgPSAmcnM2OTBfbWNfaW5pdCwKLQkubWNfZmluaSA9ICZyczY5MF9tY19maW5pLAotCS53Yl9pbml0ID0gJnIxMDBfd2JfaW5pdCwKLQkud2JfZmluaSA9ICZyMTAwX3diX2ZpbmksCi0JLmdhcnRfaW5pdCA9ICZyczQwMF9nYXJ0X2luaXQsCi0JLmdhcnRfZmluaSA9ICZyczQwMF9nYXJ0X2ZpbmksCi0JLmdhcnRfZW5hYmxlID0gJnJzNDAwX2dhcnRfZW5hYmxlLAotCS5nYXJ0X2Rpc2FibGUgPSAmcnM0MDBfZ2FydF9kaXNhYmxlLAogCS5nYXJ0X3RsYl9mbHVzaCA9ICZyczQwMF9nYXJ0X3RsYl9mbHVzaCwKIAkuZ2FydF9zZXRfcGFnZSA9ICZyczQwMF9nYXJ0X3NldF9wYWdlLAotCS5jcF9pbml0ID0gJnIxMDBfY3BfaW5pdCwKLQkuY3BfZmluaSA9ICZyMTAwX2NwX2ZpbmksCi0JLmNwX2Rpc2FibGUgPSAmcjEwMF9jcF9kaXNhYmxlLAogCS5jcF9jb21taXQgPSAmcjEwMF9jcF9jb21taXQsCiAJLnJpbmdfc3RhcnQgPSAmcjMwMF9yaW5nX3N0YXJ0LAogCS5yaW5nX3Rlc3QgPSAmcjEwMF9yaW5nX3Rlc3QsCiAJLnJpbmdfaWJfZXhlY3V0ZSA9ICZyMTAwX3JpbmdfaWJfZXhlY3V0ZSwKLQkuaWJfdGVzdCA9ICZyMTAwX2liX3Rlc3QsCiAJLmlycV9zZXQgPSAmcnM2MDBfaXJxX3NldCwKIAkuaXJxX3Byb2Nlc3MgPSAmcnM2MDBfaXJxX3Byb2Nlc3MsCiAJLmdldF92YmxhbmtfY291bnRlciA9ICZyczYwMF9nZXRfdmJsYW5rX2NvdW50ZXIsCkBAIC00MjAsNDEgKzMyNiwyOSBAQAogICogcnY1MTUKICAqLwogaW50IHJ2NTE1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCBydjUxNV9lcnJhdGEoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCBydjUxNV92cmFtX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCBydjUxNV9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBydjUxNV9ncHVfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJ2NTE1X21jX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCBydjUxNV9tY19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHVpbnQzMl90IHJ2NTE1X21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7CiB2b2lkIHJ2NTE1X21jX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7CiB2b2lkIHJ2NTE1X3Jpbmdfc3RhcnQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdWludDMyX3QgcnY1MTVfcGNpZV9ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpOwogdm9pZCBydjUxNV9wY2llX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7CiB2b2lkIHJ2NTE1X2JhbmR3aWR0aF91cGRhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworaW50IHJ2NTE1X3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitpbnQgcnY1MTVfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHJ2NTE1X2FzaWMgPSB7CiAJLmluaXQgPSAmcnY1MTVfaW5pdCwKLQkuZXJyYXRhID0gJnJ2NTE1X2VycmF0YSwKLQkudnJhbV9pbmZvID0gJnJ2NTE1X3ZyYW1faW5mbywKKwkuZmluaSA9ICZydjUxNV9maW5pLAorCS5zdXNwZW5kID0gJnJ2NTE1X3N1c3BlbmQsCisJLnJlc3VtZSA9ICZydjUxNV9yZXN1bWUsCiAJLnZnYV9zZXRfc3RhdGUgPSAmcjEwMF92Z2Ffc2V0X3N0YXRlLAogCS5ncHVfcmVzZXQgPSAmcnY1MTVfZ3B1X3Jlc2V0LAotCS5tY19pbml0ID0gJnJ2NTE1X21jX2luaXQsCi0JLm1jX2ZpbmkgPSAmcnY1MTVfbWNfZmluaSwKLQkud2JfaW5pdCA9ICZyMTAwX3diX2luaXQsCi0JLndiX2ZpbmkgPSAmcjEwMF93Yl9maW5pLAotCS5nYXJ0X2luaXQgPSAmcnYzNzBfcGNpZV9nYXJ0X2luaXQsCi0JLmdhcnRfZmluaSA9ICZydjM3MF9wY2llX2dhcnRfZmluaSwKLQkuZ2FydF9lbmFibGUgPSAmcnYzNzBfcGNpZV9nYXJ0X2VuYWJsZSwKLQkuZ2FydF9kaXNhYmxlID0gJnJ2MzcwX3BjaWVfZ2FydF9kaXNhYmxlLAogCS5nYXJ0X3RsYl9mbHVzaCA9ICZydjM3MF9wY2llX2dhcnRfdGxiX2ZsdXNoLAogCS5nYXJ0X3NldF9wYWdlID0gJnJ2MzcwX3BjaWVfZ2FydF9zZXRfcGFnZSwKLQkuY3BfaW5pdCA9ICZyMTAwX2NwX2luaXQsCi0JLmNwX2ZpbmkgPSAmcjEwMF9jcF9maW5pLAotCS5jcF9kaXNhYmxlID0gJnIxMDBfY3BfZGlzYWJsZSwKIAkuY3BfY29tbWl0ID0gJnIxMDBfY3BfY29tbWl0LAogCS5yaW5nX3N0YXJ0ID0gJnJ2NTE1X3Jpbmdfc3RhcnQsCiAJLnJpbmdfdGVzdCA9ICZyMTAwX3JpbmdfdGVzdCwKIAkucmluZ19pYl9leGVjdXRlID0gJnIxMDBfcmluZ19pYl9leGVjdXRlLAotCS5pYl90ZXN0ID0gJnIxMDBfaWJfdGVzdCwKIAkuaXJxX3NldCA9ICZyczYwMF9pcnFfc2V0LAogCS5pcnFfcHJvY2VzcyA9ICZyczYwMF9pcnFfcHJvY2VzcywKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gJnJzNjAwX2dldF92YmxhbmtfY291bnRlciwKQEAgLTQ3NiwzNSArMzcwLDIxIEBACiAvKgogICogcjUyMCxydjUzMCxydjU2MCxydjU3MCxyNTgwCiAgKi8KLXZvaWQgcjUyMF9lcnJhdGEoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByNTIwX3ZyYW1faW5mbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcjUyMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjUyMF9tY19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjUyMF9iYW5kd2lkdGhfdXBkYXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2ludCByNTIwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworaW50IHI1MjBfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcjUyMF9hc2ljID0gewotCS5pbml0ID0gJnJ2NTE1X2luaXQsCi0JLmVycmF0YSA9ICZyNTIwX2VycmF0YSwKLQkudnJhbV9pbmZvID0gJnI1MjBfdnJhbV9pbmZvLAorCS5pbml0ID0gJnI1MjBfaW5pdCwKKwkuZmluaSA9ICZydjUxNV9maW5pLAorCS5zdXNwZW5kID0gJnJ2NTE1X3N1c3BlbmQsCisJLnJlc3VtZSA9ICZyNTIwX3Jlc3VtZSwKIAkudmdhX3NldF9zdGF0ZSA9ICZyMTAwX3ZnYV9zZXRfc3RhdGUsCiAJLmdwdV9yZXNldCA9ICZydjUxNV9ncHVfcmVzZXQsCi0JLm1jX2luaXQgPSAmcjUyMF9tY19pbml0LAotCS5tY19maW5pID0gJnI1MjBfbWNfZmluaSwKLQkud2JfaW5pdCA9ICZyMTAwX3diX2luaXQsCi0JLndiX2ZpbmkgPSAmcjEwMF93Yl9maW5pLAotCS5nYXJ0X2luaXQgPSAmcnYzNzBfcGNpZV9nYXJ0X2luaXQsCi0JLmdhcnRfZmluaSA9ICZydjM3MF9wY2llX2dhcnRfZmluaSwKLQkuZ2FydF9lbmFibGUgPSAmcnYzNzBfcGNpZV9nYXJ0X2VuYWJsZSwKLQkuZ2FydF9kaXNhYmxlID0gJnJ2MzcwX3BjaWVfZ2FydF9kaXNhYmxlLAogCS5nYXJ0X3RsYl9mbHVzaCA9ICZydjM3MF9wY2llX2dhcnRfdGxiX2ZsdXNoLAogCS5nYXJ0X3NldF9wYWdlID0gJnJ2MzcwX3BjaWVfZ2FydF9zZXRfcGFnZSwKLQkuY3BfaW5pdCA9ICZyMTAwX2NwX2luaXQsCi0JLmNwX2ZpbmkgPSAmcjEwMF9jcF9maW5pLAotCS5jcF9kaXNhYmxlID0gJnIxMDBfY3BfZGlzYWJsZSwKIAkuY3BfY29tbWl0ID0gJnIxMDBfY3BfY29tbWl0LAogCS5yaW5nX3N0YXJ0ID0gJnJ2NTE1X3Jpbmdfc3RhcnQsCiAJLnJpbmdfdGVzdCA9ICZyMTAwX3JpbmdfdGVzdCwKIAkucmluZ19pYl9leGVjdXRlID0gJnIxMDBfcmluZ19pYl9leGVjdXRlLAotCS5pYl90ZXN0ID0gJnIxMDBfaWJfdGVzdCwKIAkuaXJxX3NldCA9ICZyczYwMF9pcnFfc2V0LAogCS5pcnFfcHJvY2VzcyA9ICZyczYwMF9pcnFfcHJvY2VzcywKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gJnJzNjAwX2dldF92YmxhbmtfY291bnRlciwKQEAgLTUxOSw3ICszOTksNyBAQAogCS5zZXRfY2xvY2tfZ2F0aW5nID0gJnJhZGVvbl9hdG9tX3NldF9jbG9ja19nYXRpbmcsCiAJLnNldF9zdXJmYWNlX3JlZyA9IHIxMDBfc2V0X3N1cmZhY2VfcmVnLAogCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHIxMDBfY2xlYXJfc3VyZmFjZV9yZWcsCi0JLmJhbmR3aWR0aF91cGRhdGUgPSAmcjUyMF9iYW5kd2lkdGhfdXBkYXRlLAorCS5iYW5kd2lkdGhfdXBkYXRlID0gJnJ2NTE1X2JhbmR3aWR0aF91cGRhdGUsCiB9OwogCiAvKgpAQCAtNTUyLDM3ICs0MzIsMjMgQEAKIAkJCSB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IG9ial9zaXplKTsKIGludCByNjAwX2NsZWFyX3N1cmZhY2VfcmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgcmVnKTsKIHZvaWQgcjYwMF9yaW5nX2liX2V4ZWN1dGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25faWIgKmliKTsKLWludCByNjAwX2liX3Rlc3Qoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHI2MDBfcmluZ190ZXN0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByNjAwX2NvcHlfYmxpdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJICAgdWludDY0X3Qgc3JjX29mZnNldCwgdWludDY0X3QgZHN0X29mZnNldCwKIAkJICAgdW5zaWduZWQgbnVtX3BhZ2VzLCBzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcjYwMF9hc2ljID0gewotCS5lcnJhdGEgPSBOVUxMLAogCS5pbml0ID0gJnI2MDBfaW5pdCwKIAkuZmluaSA9ICZyNjAwX2ZpbmksCiAJLnN1c3BlbmQgPSAmcjYwMF9zdXNwZW5kLAogCS5yZXN1bWUgPSAmcjYwMF9yZXN1bWUsCiAJLmNwX2NvbW1pdCA9ICZyNjAwX2NwX2NvbW1pdCwKLQkudnJhbV9pbmZvID0gTlVMTCwKIAkudmdhX3NldF9zdGF0ZSA9ICZyNjAwX3ZnYV9zZXRfc3RhdGUsCiAJLmdwdV9yZXNldCA9ICZyNjAwX2dwdV9yZXNldCwKLQkubWNfaW5pdCA9IE5VTEwsCi0JLm1jX2ZpbmkgPSBOVUxMLAotCS53Yl9pbml0ID0gJnI2MDBfd2JfaW5pdCwKLQkud2JfZmluaSA9ICZyNjAwX3diX2ZpbmksCi0JLmdhcnRfZW5hYmxlID0gTlVMTCwKLQkuZ2FydF9kaXNhYmxlID0gTlVMTCwKIAkuZ2FydF90bGJfZmx1c2ggPSAmcjYwMF9wY2llX2dhcnRfdGxiX2ZsdXNoLAogCS5nYXJ0X3NldF9wYWdlID0gJnJzNjAwX2dhcnRfc2V0X3BhZ2UsCi0JLmNwX2luaXQgPSBOVUxMLAotCS5jcF9maW5pID0gTlVMTCwKLQkuY3BfZGlzYWJsZSA9IE5VTEwsCi0JLnJpbmdfc3RhcnQgPSBOVUxMLAogCS5yaW5nX3Rlc3QgPSAmcjYwMF9yaW5nX3Rlc3QsCiAJLnJpbmdfaWJfZXhlY3V0ZSA9ICZyNjAwX3JpbmdfaWJfZXhlY3V0ZSwKLQkuaWJfdGVzdCA9ICZyNjAwX2liX3Rlc3QsCiAJLmlycV9zZXQgPSAmcjYwMF9pcnFfc2V0LAogCS5pcnFfcHJvY2VzcyA9ICZyNjAwX2lycV9wcm9jZXNzLAogCS5mZW5jZV9yaW5nX2VtaXQgPSAmcjYwMF9mZW5jZV9yaW5nX2VtaXQsCkBAIC01OTYsNyArNDYyLDcgQEAKIAkuc2V0X2Nsb2NrX2dhdGluZyA9ICZyYWRlb25fYXRvbV9zZXRfY2xvY2tfZ2F0aW5nLAogCS5zZXRfc3VyZmFjZV9yZWcgPSByNjAwX3NldF9zdXJmYWNlX3JlZywKIAkuY2xlYXJfc3VyZmFjZV9yZWcgPSByNjAwX2NsZWFyX3N1cmZhY2VfcmVnLAotCS5iYW5kd2lkdGhfdXBkYXRlID0gJnI1MjBfYmFuZHdpZHRoX3VwZGF0ZSwKKwkuYmFuZHdpZHRoX3VwZGF0ZSA9ICZydjUxNV9iYW5kd2lkdGhfdXBkYXRlLAogfTsKIAogLyoKQEAgLTYwOSwzMCArNDc1LDE3IEBACiBpbnQgcnY3NzBfZ3B1X3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyBydjc3MF9hc2ljID0gewotCS5lcnJhdGEgPSBOVUxMLAogCS5pbml0ID0gJnJ2NzcwX2luaXQsCiAJLmZpbmkgPSAmcnY3NzBfZmluaSwKIAkuc3VzcGVuZCA9ICZydjc3MF9zdXNwZW5kLAogCS5yZXN1bWUgPSAmcnY3NzBfcmVzdW1lLAogCS5jcF9jb21taXQgPSAmcjYwMF9jcF9jb21taXQsCi0JLnZyYW1faW5mbyA9IE5VTEwsCiAJLmdwdV9yZXNldCA9ICZydjc3MF9ncHVfcmVzZXQsCiAJLnZnYV9zZXRfc3RhdGUgPSAmcjYwMF92Z2Ffc2V0X3N0YXRlLAotCS5tY19pbml0ID0gTlVMTCwKLQkubWNfZmluaSA9IE5VTEwsCi0JLndiX2luaXQgPSAmcjYwMF93Yl9pbml0LAotCS53Yl9maW5pID0gJnI2MDBfd2JfZmluaSwKLQkuZ2FydF9lbmFibGUgPSBOVUxMLAotCS5nYXJ0X2Rpc2FibGUgPSBOVUxMLAogCS5nYXJ0X3RsYl9mbHVzaCA9ICZyNjAwX3BjaWVfZ2FydF90bGJfZmx1c2gsCiAJLmdhcnRfc2V0X3BhZ2UgPSAmcnM2MDBfZ2FydF9zZXRfcGFnZSwKLQkuY3BfaW5pdCA9IE5VTEwsCi0JLmNwX2ZpbmkgPSBOVUxMLAotCS5jcF9kaXNhYmxlID0gTlVMTCwKLQkucmluZ19zdGFydCA9IE5VTEwsCiAJLnJpbmdfdGVzdCA9ICZyNjAwX3JpbmdfdGVzdCwKIAkucmluZ19pYl9leGVjdXRlID0gJnI2MDBfcmluZ19pYl9leGVjdXRlLAotCS5pYl90ZXN0ID0gJnI2MDBfaWJfdGVzdCwKIAkuaXJxX3NldCA9ICZyNjAwX2lycV9zZXQsCiAJLmlycV9wcm9jZXNzID0gJnI2MDBfaXJxX3Byb2Nlc3MsCiAJLmZlbmNlX3JpbmdfZW1pdCA9ICZyNjAwX2ZlbmNlX3JpbmdfZW1pdCwKQEAgLTY0Niw3ICs0OTksNyBAQAogCS5zZXRfY2xvY2tfZ2F0aW5nID0gJnJhZGVvbl9hdG9tX3NldF9jbG9ja19nYXRpbmcsCiAJLnNldF9zdXJmYWNlX3JlZyA9IHI2MDBfc2V0X3N1cmZhY2VfcmVnLAogCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHI2MDBfY2xlYXJfc3VyZmFjZV9yZWcsCi0JLmJhbmR3aWR0aF91cGRhdGUgPSAmcjUyMF9iYW5kd2lkdGhfdXBkYXRlLAorCS5iYW5kd2lkdGhfdXBkYXRlID0gJnJ2NTE1X2JhbmR3aWR0aF91cGRhdGUsCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCmluZGV4IDc0Mzc0MjEuLjViNmMwOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYwpAQCAtMjcyLDEyICsyNzIsOSBAQAogCQkJICAgIChsZTE2X3RvX2NwdShwYXRoLT51c0Nvbm5PYmplY3RJZCkgJgogCQkJICAgICBPQkpFQ1RfVFlQRV9NQVNLKSA+PiBPQkpFQ1RfVFlQRV9TSElGVDsKIAotCQkJaWYgKChsZTE2X3RvX2NwdShwYXRoLT51c0RldmljZVRhZykgPT0KLQkJCSAgICAgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpCi0JCQkgICAgfHwgKGxlMTZfdG9fY3B1KHBhdGgtPnVzRGV2aWNlVGFnKSA9PQotCQkJCUFUT01fREVWSUNFX1RWMl9TVVBQT1JUKQotCQkJICAgIHx8IChsZTE2X3RvX2NwdShwYXRoLT51c0RldmljZVRhZykgPT0KLQkJCQlBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKKwkJCS8qIFRPRE8gQ1Ygc3VwcG9ydCAqLworCQkJaWYgKGxlMTZfdG9fY3B1KHBhdGgtPnVzRGV2aWNlVGFnKSA9PQorCQkJCUFUT01fREVWSUNFX0NWX1NVUFBPUlQpCiAJCQkJY29udGludWU7CiAKIAkJCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlM3ODApICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKaW5kZXggOTZlMzdhNi4uMzRhOWI5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYwpAQCAtMzMsMTIgKzMzLDUwIEBACiAvKgogICogQklPUy4KICAqLworCisvKiBJZiB5b3UgYm9vdCBhbiBJR1AgYm9hcmQgd2l0aCBhIGRpc2NyZXRlIGNhcmQgYXMgdGhlIHByaW1hcnksCisgKiB0aGUgSUdQIHJvbSBpcyBub3QgYWNjZXNzaWJsZSB2aWEgdGhlIHJvbSBiYXIgYXMgdGhlIElHUCByb20gaXMKKyAqIHBhcnQgb2YgdGhlIHN5c3RlbSBiaW9zLiAgT24gYm9vdCwgdGhlIHN5c3RlbSBiaW9zIHB1dHMgYQorICogY29weSBvZiB0aGUgaWdwIHJvbSBhdCB0aGUgc3RhcnQgb2YgdnJhbSBpZiBhIGRpc2NyZXRlIGNhcmQgaXMKKyAqIHByZXNlbnQuCisgKi8KK3N0YXRpYyBib29sIGlncF9yZWFkX2Jpb3NfZnJvbV92cmFtKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXVpbnQ4X3QgX19pb21lbSAqYmlvczsKKwlyZXNvdXJjZV9zaXplX3QgdnJhbV9iYXNlOworCXJlc291cmNlX3NpemVfdCBzaXplID0gMjU2ICogMTAyNDsgLyogPz8/ICovCisKKwlyZGV2LT5iaW9zID0gTlVMTDsKKwl2cmFtX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KHJkZXYtPmRkZXYsIDApOworCWJpb3MgPSBpb3JlbWFwKHZyYW1fYmFzZSwgc2l6ZSk7CisJaWYgKCFiaW9zKSB7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIG1tYXAgdnJhbVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoc2l6ZSA9PSAwIHx8IGJpb3NbMF0gIT0gMHg1NSB8fCBiaW9zWzFdICE9IDB4YWEpIHsKKwkJaW91bm1hcChiaW9zKTsKKwkJRFJNX0VSUk9SKCJiYWQgcm9tIHNpZ25hdHVyZVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmRldi0+YmlvcyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJkZXYtPmJpb3MgPT0gTlVMTCkgeworCQlpb3VubWFwKGJpb3MpOworCQlEUk1fRVJST1IoImttYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwltZW1jcHkocmRldi0+YmlvcywgYmlvcywgc2l6ZSk7CisJaW91bm1hcChiaW9zKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwogc3RhdGljIGJvb2wgcmFkZW9uX3JlYWRfYmlvcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1aW50OF90IF9faW9tZW0gKmJpb3M7CiAJc2l6ZV90IHNpemU7CiAKIAlyZGV2LT5iaW9zID0gTlVMTDsKKwkvKiBYWFg6IHNvbWUgY2FyZHMgbWF5IHJldHVybiAwIGZvciByb20gc2l6ZT8gZGR4IGhhcyBhIHdvcmthcm91bmQgKi8KIAliaW9zID0gcGNpX21hcF9yb20ocmRldi0+cGRldiwgJnNpemUpOwogCWlmICghYmlvcykgewogCQlyZXR1cm4gZmFsc2U7CkBAIC0zNDEsNyArMzc5LDkgQEAKIAogc3RhdGljIGJvb2wgcmFkZW9uX3JlYWRfZGlzYWJsZWRfYmlvcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkKKwkJcmV0dXJuIGlncF9yZWFkX2Jpb3NfZnJvbV92cmFtKHJkZXYpOworCWVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWNzcwKQogCQlyZXR1cm4gcjcwMF9yZWFkX2Rpc2FibGVkX2Jpb3MocmRldik7CiAJZWxzZSBpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkKIAkJcmV0dXJuIHI2MDBfcmVhZF9kaXNhYmxlZF9iaW9zKHJkZXYpOwpAQCAtMzU2LDcgKzM5NiwxMiBAQAogCWJvb2wgcjsKIAl1aW50MTZfdCB0bXA7CiAKLQlyID0gcmFkZW9uX3JlYWRfYmlvcyhyZGV2KTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7CisJCXIgPSBpZ3BfcmVhZF9iaW9zX2Zyb21fdnJhbShyZGV2KTsKKwkJaWYgKHIgPT0gZmFsc2UpCisJCQlyID0gcmFkZW9uX3JlYWRfYmlvcyhyZGV2KTsKKwl9IGVsc2UKKwkJciA9IHJhZGVvbl9yZWFkX2Jpb3MocmRldik7CiAJaWYgKHIgPT0gZmFsc2UpIHsKIAkJciA9IHJhZGVvbl9yZWFkX2Rpc2FibGVkX2Jpb3MocmRldik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY2xvY2tzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYwppbmRleCAxNTJlZWYxLi5mNWMzMmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYwpAQCAtNDExLDcgKzQxMSw3IEBACiAJCQkJCVIzMDBfUElYQ0xLX1RSQU5TX0FMV0FZU19PTmIgfAogCQkJCQlSMzAwX1BJWENMS19UVk9fQUxXQVlTX09OYiB8CiAJCQkJCVIzMDBfUDJHMkNMS19BTFdBWVNfT05iIHwKLQkJCQkJUjMwMF9QMkcyQ0xLX0FMV0FZU19PTmIpOworCQkJCQlSMzAwX1AyRzJDTEtfREFDX0FMV0FZU19PTmIpOwogCQkJCVdSRUczMl9QTEwoUkFERU9OX1BJWENMS1NfQ05UTCwgdG1wKTsKIAkJCX0gZWxzZSBpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlYzNTApIHsKIAkJCQl0bXAgPSBSUkVHMzJfUExMKFIzMDBfU0NMS19DTlRMMik7CkBAIC00NjQsNyArNDY0LDcgQEAKIAkJCQkJUjMwMF9QSVhDTEtfVFJBTlNfQUxXQVlTX09OYiB8CiAJCQkJCVIzMDBfUElYQ0xLX1RWT19BTFdBWVNfT05iIHwKIAkJCQkJUjMwMF9QMkcyQ0xLX0FMV0FZU19PTmIgfAotCQkJCQlSMzAwX1AyRzJDTEtfQUxXQVlTX09OYik7CisJCQkJCVIzMDBfUDJHMkNMS19EQUNfQUxXQVlTX09OYik7CiAJCQkJV1JFRzMyX1BMTChSQURFT05fUElYQ0xLU19DTlRMLCB0bXApOwogCiAJCQkJdG1wID0gUlJFRzMyX1BMTChSQURFT05fTUNMS19NSVNDKTsKQEAgLTY1NCw3ICs2NTQsNyBAQAogCQkJCSBSMzAwX1BJWENMS19UUkFOU19BTFdBWVNfT05iIHwKIAkJCQkgUjMwMF9QSVhDTEtfVFZPX0FMV0FZU19PTmIgfAogCQkJCSBSMzAwX1AyRzJDTEtfQUxXQVlTX09OYiB8Ci0JCQkJIFIzMDBfUDJHMkNMS19BTFdBWVNfT05iIHwKKwkJCQkgUjMwMF9QMkcyQ0xLX0RBQ19BTFdBWVNfT05iIHwKIAkJCQkgUjMwMF9ESVNQX0RBQ19QSVhDTEtfREFDMl9CTEFOS19PRkYpOwogCQkJV1JFRzMyX1BMTChSQURFT05fUElYQ0xLU19DTlRMLCB0bXApOwogCQl9IGVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWMzUwKSB7CkBAIC03MDUsNyArNzA1LDcgQEAKIAkJCQkgUjMwMF9QSVhDTEtfVFJBTlNfQUxXQVlTX09OYiB8CiAJCQkJIFIzMDBfUElYQ0xLX1RWT19BTFdBWVNfT05iIHwKIAkJCQkgUjMwMF9QMkcyQ0xLX0FMV0FZU19PTmIgfAotCQkJCSBSMzAwX1AyRzJDTEtfQUxXQVlTX09OYiB8CisJCQkJIFIzMDBfUDJHMkNMS19EQUNfQUxXQVlTX09OYiB8CiAJCQkJIFIzMDBfRElTUF9EQUNfUElYQ0xLX0RBQzJfQkxBTktfT0ZGKTsKIAkJCVdSRUczMl9QTEwoUkFERU9OX1BJWENMS1NfQ05UTCwgdG1wKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwppbmRleCBhZjFkNTUxLi5lMzc2YmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9lZGlkLmgiCiAjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAiZHJtX2ZiX2hlbHBlci5oIgogI2luY2x1ZGUgInJhZGVvbl9kcm0uaCIKICNpbmNsdWRlICJyYWRlb24uaCIKICNpbmNsdWRlICJhdG9tLmgiCkBAIC0yNDUsNyArMjQ2LDcgQEAKIAkJaWYgKGNvbW1vbl9tb2Rlc1tpXS53IDwgMzIwIHx8IGNvbW1vbl9tb2Rlc1tpXS5oIDwgMjAwKQogCQkJY29udGludWU7CiAKLQkJbW9kZSA9IGRybV9jdnRfbW9kZShkZXYsIGNvbW1vbl9tb2Rlc1tpXS53LCBjb21tb25fbW9kZXNbaV0uaCwgNjAsIGZhbHNlLCBmYWxzZSk7CisJCW1vZGUgPSBkcm1fY3Z0X21vZGUoZGV2LCBjb21tb25fbW9kZXNbaV0udywgY29tbW9uX21vZGVzW2ldLmgsIDYwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKIAkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwogCX0KIH0KQEAgLTU1OSw3ICs1NjAsNyBAQAogCQlyYWRlb25fYWRkX2NvbW1vbl9tb2RlcyhlbmNvZGVyLCBjb25uZWN0b3IpOwogCWVsc2UgewogCQkvKiBvbmx5IDgwMHg2MDAgaXMgc3VwcG9ydGVkIHJpZ2h0IG5vdyBvbiBwcmUtYXZpdm8gY2hpcHMgKi8KLQkJdHZfbW9kZSA9IGRybV9jdnRfbW9kZShkZXYsIDgwMCwgNjAwLCA2MCwgZmFsc2UsIGZhbHNlKTsKKwkJdHZfbW9kZSA9IGRybV9jdnRfbW9kZShkZXYsIDgwMCwgNjAwLCA2MCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAJCXR2X21vZGUtPnR5cGUgPSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwogCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgdHZfbW9kZSk7CiAJfQpAQCAtNzQzLDYgKzc0NCwxNSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdm9pZCByYWRlb25fZHZpX2ZvcmNlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJaWYgKGNvbm5lY3Rvci0+Zm9yY2UgPT0gRFJNX0ZPUkNFX09OKQorCQlyYWRlb25fY29ubmVjdG9yLT51c2VfZGlnaXRhbCA9IGZhbHNlOworCWlmIChjb25uZWN0b3ItPmZvcmNlID09IERSTV9GT1JDRV9PTl9ESUdJVEFMKQorCQlyYWRlb25fY29ubmVjdG9yLT51c2VfZGlnaXRhbCA9IHRydWU7Cit9CisKIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyByYWRlb25fZHZpX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CiAJLmdldF9tb2RlcyA9IHJhZGVvbl9kdmlfZ2V0X21vZGVzLAogCS5tb2RlX3ZhbGlkID0gcmFkZW9uX3ZnYV9tb2RlX3ZhbGlkLApAQCAtNzU1LDYgKzc2NSw3IEBACiAJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCiAJLnNldF9wcm9wZXJ0eSA9IHJhZGVvbl9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5LAogCS5kZXN0cm95ID0gcmFkZW9uX2Nvbm5lY3Rvcl9kZXN0cm95LAorCS5mb3JjZSA9IHJhZGVvbl9kdmlfZm9yY2UsCiB9OwogCiB2b2lkCkBAIC03NzEsNiArNzgyLDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvcjsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3I7CiAJdWludDMyX3Qgc3VicGl4ZWxfb3JkZXIgPSBTdWJQaXhlbE5vbmU7CisJaW50IHJldDsKIAogCS8qIGZpeG1lIC0gdHYvY3YvZGluICovCiAJaWYgKGNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duKQpAQCAtNzk2LDI0ICs4MDgsMzAgQEAKIAlzd2l0Y2ggKGNvbm5lY3Rvcl90eXBlKSB7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOgogCQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl92Z2FfY29ubmVjdG9yX2Z1bmNzLCBjb25uZWN0b3JfdHlwZSk7Ci0JCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl92Z2FfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCXJldCA9IGRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl92Z2FfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxlZDsKIAkJaWYgKGkyY19idXMtPnZhbGlkKSB7CiAJCQlyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzID0gcmFkZW9uX2kyY19jcmVhdGUoZGV2LCBpMmNfYnVzLCAiVkdBIik7CiAJCQlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMpCiAJCQkJZ290byBmYWlsZWQ7CiAJCX0KKwkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ID0gdHJ1ZTsKIAkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCiAJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby5sb2FkX2RldGVjdF9wcm9wZXJ0eSwKIAkJCQkJICAgICAgMSk7CiAJCWJyZWFrOwogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUE6CiAJCWRybV9jb25uZWN0b3JfaW5pdChkZXYsICZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX3ZnYV9jb25uZWN0b3JfZnVuY3MsIGNvbm5lY3Rvcl90eXBlKTsKLQkJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX3ZnYV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX3ZnYV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbGVkOwogCQlpZiAoaTJjX2J1cy0+dmFsaWQpIHsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMgPSByYWRlb25faTJjX2NyZWF0ZShkZXYsIGkyY19idXMsICJEVkkiKTsKIAkJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKIAkJCQlnb3RvIGZhaWxlZDsKIAkJfQorCQlyYWRlb25fY29ubmVjdG9yLT5kYWNfbG9hZF9kZXRlY3QgPSB0cnVlOwogCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAogCQkJCQkgICAgICAxKTsKQEAgLTgyNyw3ICs4NDUsOSBAQAogCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+aWdwX2xhbmVfaW5mbyA9IGlncF9sYW5lX2luZm87CiAJCXJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2ID0gcmFkZW9uX2RpZ19jb25uZWN0b3I7CiAJCWRybV9jb25uZWN0b3JfaW5pdChkZXYsICZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2R2aV9jb25uZWN0b3JfZnVuY3MsIGNvbm5lY3Rvcl90eXBlKTsKLQkJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2R2aV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2R2aV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbGVkOwogCQlpZiAoaTJjX2J1cy0+dmFsaWQpIHsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMgPSByYWRlb25faTJjX2NyZWF0ZShkZXYsIGkyY19idXMsICJEVkkiKTsKIAkJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKQEAgLTgzNyw2ICs4NTcsNyBAQAogCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmNvaGVyZW50X21vZGVfcHJvcGVydHksCiAJCQkJCSAgICAgIDEpOworCQlyYWRlb25fY29ubmVjdG9yLT5kYWNfbG9hZF9kZXRlY3QgPSB0cnVlOwogCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAogCQkJCQkgICAgICAxKTsKQEAgLTg1MCw3ICs4NzEsOSBAQAogCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+aWdwX2xhbmVfaW5mbyA9IGlncF9sYW5lX2luZm87CiAJCXJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2ID0gcmFkZW9uX2RpZ19jb25uZWN0b3I7CiAJCWRybV9jb25uZWN0b3JfaW5pdChkZXYsICZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2R2aV9jb25uZWN0b3JfZnVuY3MsIGNvbm5lY3Rvcl90eXBlKTsKLQkJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2R2aV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2R2aV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbGVkOwogCQlpZiAoaTJjX2J1cy0+dmFsaWQpIHsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMgPSByYWRlb25faTJjX2NyZWF0ZShkZXYsIGkyY19idXMsICJIRE1JIik7CiAJCQlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMpCkBAIC04NjksNyArODkyLDkgQEAKIAkJcmFkZW9uX2RpZ19jb25uZWN0b3ItPmlncF9sYW5lX2luZm8gPSBpZ3BfbGFuZV9pbmZvOwogCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdiA9IHJhZGVvbl9kaWdfY29ubmVjdG9yOwogCQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9kdmlfY29ubmVjdG9yX2Z1bmNzLCBjb25uZWN0b3JfdHlwZSk7Ci0JCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9kdmlfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCXJldCA9IGRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9kdmlfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxlZDsKIAkJaWYgKGkyY19idXMtPnZhbGlkKSB7CiAJCQlyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzID0gcmFkZW9uX2kyY19jcmVhdGUoZGV2LCBpMmNfYnVzLCAiRFAiKTsKIAkJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKQEAgLTg4MiwxMSArOTA3LDE0IEBACiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfOVBpbkRJTjoKIAkJaWYgKHJhZGVvbl90diA9PSAxKSB7CiAJCQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl90dl9jb25uZWN0b3JfZnVuY3MsIGNvbm5lY3Rvcl90eXBlKTsKLQkJCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl90dl9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJCXJldCA9IGRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl90dl9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBmYWlsZWQ7CisJCQlyYWRlb25fY29ubmVjdG9yLT5kYWNfbG9hZF9kZXRlY3QgPSB0cnVlOworCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCisJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCisJCQkJCQkgICAgICAxKTsKIAkJfQotCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKLQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAotCQkJCQkgICAgICAxKTsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzoKIAkJcmFkZW9uX2RpZ19jb25uZWN0b3IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyksIEdGUF9LRVJORUwpOwpAQCAtODk2LDcgKzkyNCw5IEBACiAJCXJhZGVvbl9kaWdfY29ubmVjdG9yLT5pZ3BfbGFuZV9pbmZvID0gaWdwX2xhbmVfaW5mbzsKIAkJcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXYgPSByYWRlb25fZGlnX2Nvbm5lY3RvcjsKIAkJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fbHZkc19jb25uZWN0b3JfZnVuY3MsIGNvbm5lY3Rvcl90eXBlKTsKLQkJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2x2ZHNfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCXJldCA9IGRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9sdmRzX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsZWQ7CiAJCWlmIChpMmNfYnVzLT52YWxpZCkgewogCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cyA9IHJhZGVvbl9pMmNfY3JlYXRlKGRldiwgaTJjX2J1cywgIkxWRFMiKTsKIAkJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKQEAgLTkzMiw2ICs5NjIsNyBAQAogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3I7CiAJdWludDMyX3Qgc3VicGl4ZWxfb3JkZXIgPSBTdWJQaXhlbE5vbmU7CisJaW50IHJldDsKIAogCS8qIGZpeG1lIC0gdHYvY3YvZGluICovCiAJaWYgKGNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duKQpAQCAtOTU3LDI0ICs5ODgsMzAgQEAKIAlzd2l0Y2ggKGNvbm5lY3Rvcl90eXBlKSB7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOgogCQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl92Z2FfY29ubmVjdG9yX2Z1bmNzLCBjb25uZWN0b3JfdHlwZSk7Ci0JCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl92Z2FfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCXJldCA9IGRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl92Z2FfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxlZDsKIAkJaWYgKGkyY19idXMtPnZhbGlkKSB7CiAJCQlyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzID0gcmFkZW9uX2kyY19jcmVhdGUoZGV2LCBpMmNfYnVzLCAiVkdBIik7CiAJCQlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMpCiAJCQkJZ290byBmYWlsZWQ7CiAJCX0KKwkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ID0gdHJ1ZTsKIAkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCiAJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby5sb2FkX2RldGVjdF9wcm9wZXJ0eSwKIAkJCQkJICAgICAgMSk7CiAJCWJyZWFrOwogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUE6CiAJCWRybV9jb25uZWN0b3JfaW5pdChkZXYsICZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX3ZnYV9jb25uZWN0b3JfZnVuY3MsIGNvbm5lY3Rvcl90eXBlKTsKLQkJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX3ZnYV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX3ZnYV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbGVkOwogCQlpZiAoaTJjX2J1cy0+dmFsaWQpIHsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMgPSByYWRlb25faTJjX2NyZWF0ZShkZXYsIGkyY19idXMsICJEVkkiKTsKIAkJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKIAkJCQlnb3RvIGZhaWxlZDsKIAkJfQorCQlyYWRlb25fY29ubmVjdG9yLT5kYWNfbG9hZF9kZXRlY3QgPSB0cnVlOwogCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAogCQkJCQkgICAgICAxKTsKQEAgLTk4MiwxMSArMTAxOSwxNCBAQAogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUk6CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDoKIAkJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fZHZpX2Nvbm5lY3Rvcl9mdW5jcywgY29ubmVjdG9yX3R5cGUpOwotCQlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fZHZpX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCQlyZXQgPSBkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fZHZpX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsZWQ7CiAJCWlmIChpMmNfYnVzLT52YWxpZCkgewogCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cyA9IHJhZGVvbl9pMmNfY3JlYXRlKGRldiwgaTJjX2J1cywgIkRWSSIpOwogCQkJaWYgKCFyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzKQogCQkJCWdvdG8gZmFpbGVkOworCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ID0gdHJ1ZTsKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAogCQkJCQkJICAgICAgMSk7CkBAIC05OTgsNyArMTAzOCwxMCBAQAogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SXzlQaW5ESU46CiAJCWlmIChyYWRlb25fdHYgPT0gMSkgewogCQkJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fdHZfY29ubmVjdG9yX2Z1bmNzLCBjb25uZWN0b3JfdHlwZSk7Ci0JCQlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fdHZfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCQlyZXQgPSBkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fdHZfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZmFpbGVkOworCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ID0gdHJ1ZTsKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAogCQkJCQkJICAgICAgMSk7CkBAIC0xMDA2LDcgKzEwNDksOSBAQAogCQlicmVhazsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOgogCQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9sdmRzX2Nvbm5lY3Rvcl9mdW5jcywgY29ubmVjdG9yX3R5cGUpOwotCQlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fbHZkc19jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwkJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLCAmcmFkZW9uX2x2ZHNfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxlZDsKIAkJaWYgKGkyY19idXMtPnZhbGlkKSB7CiAJCQlyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzID0gcmFkZW9uX2kyY19jcmVhdGUoZGV2LCBpMmNfYnVzLCAiTFZEUyIpOwogCQkJaWYgKCFyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKaW5kZXggMTJmNTk5MC4uNWFiMmNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCkBAIC0xNDIsMTUgKzE0MiwzMSBAQAogCQl9CiAKIAkJcC0+Y2h1bmtzW2ldLmxlbmd0aF9kdyA9IHVzZXJfY2h1bmsubGVuZ3RoX2R3OwotCQljZGF0YSA9ICh1aW50MzJfdCAqKSh1bnNpZ25lZCBsb25nKXVzZXJfY2h1bmsuY2h1bmtfZGF0YTsKKwkJcC0+Y2h1bmtzW2ldLnVzZXJfcHRyID0gKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdXNlcl9jaHVuay5jaHVua19kYXRhOwogCi0JCXNpemUgPSBwLT5jaHVua3NbaV0ubGVuZ3RoX2R3ICogc2l6ZW9mKHVpbnQzMl90KTsKLQkJcC0+Y2h1bmtzW2ldLmtkYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHAtPmNodW5rc1tpXS5rZGF0YSA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKHAtPmNodW5rc1tpXS5rZGF0YSwgY2RhdGEsIHNpemUpKSB7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJY2RhdGEgPSAodWludDMyX3QgKikodW5zaWduZWQgbG9uZyl1c2VyX2NodW5rLmNodW5rX2RhdGE7CisJCWlmIChwLT5jaHVua3NbaV0uY2h1bmtfaWQgIT0gUkFERU9OX0NIVU5LX0lEX0lCKSB7CisJCQlzaXplID0gcC0+Y2h1bmtzW2ldLmxlbmd0aF9kdyAqIHNpemVvZih1aW50MzJfdCk7CisJCQlwLT5jaHVua3NbaV0ua2RhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKHAtPmNodW5rc1tpXS5rZGF0YSA9PSBOVUxMKSB7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKHAtPmNodW5rc1tpXS5rZGF0YSwKKwkJCQkJICAgICAgIHAtPmNodW5rc1tpXS51c2VyX3B0ciwgc2l6ZSkpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXAtPmNodW5rc1tpXS5rcGFnZVswXSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJCXAtPmNodW5rc1tpXS5rcGFnZVsxXSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChwLT5jaHVua3NbaV0ua3BhZ2VbMF0gPT0gTlVMTCB8fCBwLT5jaHVua3NbaV0ua3BhZ2VbMV0gPT0gTlVMTCkgeworCQkJCWtmcmVlKHAtPmNodW5rc1tpXS5rcGFnZVswXSk7CisJCQkJa2ZyZWUocC0+Y2h1bmtzW2ldLmtwYWdlWzFdKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCXAtPmNodW5rc1tpXS5rcGFnZV9pZHhbMF0gPSAtMTsKKwkJCXAtPmNodW5rc1tpXS5rcGFnZV9pZHhbMV0gPSAtMTsKKwkJCXAtPmNodW5rc1tpXS5sYXN0X2NvcGllZF9wYWdlID0gLTE7CisJCQlwLT5jaHVua3NbaV0ubGFzdF9wYWdlX2luZGV4ID0gKChwLT5jaHVua3NbaV0ubGVuZ3RoX2R3ICogNCkgLSAxKSAvIFBBR0VfU0laRTsKIAkJfQogCX0KIAlpZiAocC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF0ubGVuZ3RoX2R3ID4gKDE2ICogMTAyNCkpIHsKQEAgLTE5MCw2ICsyMDYsOCBAQAogCWtmcmVlKHBhcnNlci0+cmVsb2NzX3B0cik7CiAJZm9yIChpID0gMDsgaSA8IHBhcnNlci0+bmNodW5rczsgaSsrKSB7CiAJCWtmcmVlKHBhcnNlci0+Y2h1bmtzW2ldLmtkYXRhKTsKKwkJa2ZyZWUocGFyc2VyLT5jaHVua3NbaV0ua3BhZ2VbMF0pOworCQlrZnJlZShwYXJzZXItPmNodW5rc1tpXS5rcGFnZVsxXSk7CiAJfQogCWtmcmVlKHBhcnNlci0+Y2h1bmtzKTsKIAlrZnJlZShwYXJzZXItPmNodW5rc19hcnJheSk7CkBAIC0yMzgsOCArMjU2LDE0IEBACiAJICogdW5jYWNoZWQpLiAqLwogCWliX2NodW5rID0gJnBhcnNlci5jaHVua3NbcGFyc2VyLmNodW5rX2liX2lkeF07CiAJcGFyc2VyLmliLT5sZW5ndGhfZHcgPSBpYl9jaHVuay0+bGVuZ3RoX2R3OwotCW1lbWNweSgodm9pZCAqKXBhcnNlci5pYi0+cHRyLCBpYl9jaHVuay0+a2RhdGEsIGliX2NodW5rLT5sZW5ndGhfZHcqNCk7CiAJciA9IHJhZGVvbl9jc19wYXJzZSgmcGFyc2VyKTsKKwlpZiAociB8fCBwYXJzZXIucGFyc2VyX2Vycm9yKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBjb21tYW5kIHN0cmVhbSAhXG4iKTsKKwkJcmFkZW9uX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOworCQltdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKKwkJcmV0dXJuIHI7CisJfQorCXIgPSByYWRlb25fY3NfZmluaXNoX3BhZ2VzKCZwYXJzZXIpOwogCWlmIChyKSB7CiAJCURSTV9FUlJPUigiSW52YWxpZCBjb21tYW5kIHN0cmVhbSAhXG4iKTsKIAkJcmFkZW9uX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOwpAQCAtMjU0LDMgKzI3OCw2NCBAQAogCW11dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOwogCXJldHVybiByOwogfQorCitpbnQgcmFkZW9uX2NzX2ZpbmlzaF9wYWdlcyhzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NzX2NodW5rICppYmMgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07CisJaW50IGk7CisJaW50IHNpemUgPSBQQUdFX1NJWkU7CisKKwlmb3IgKGkgPSBpYmMtPmxhc3RfY29waWVkX3BhZ2UgKyAxOyBpIDw9IGliYy0+bGFzdF9wYWdlX2luZGV4OyBpKyspIHsKKwkJaWYgKGkgPT0gaWJjLT5sYXN0X3BhZ2VfaW5kZXgpIHsKKwkJCXNpemUgPSAoaWJjLT5sZW5ndGhfZHcgKiA0KSAlIFBBR0VfU0laRTsKKwkJCWlmIChzaXplID09IDApCisJCQkJc2l6ZSA9IFBBR0VfU0laRTsKKwkJfQorCQkKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihwLT5pYi0+cHRyICsgKGkgKiAoUEFHRV9TSVpFLzQpKSwKKwkJCQkgICAgICAgaWJjLT51c2VyX3B0ciArIChpICogUEFHRV9TSVpFKSwKKwkJCQkgICAgICAgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByYWRlb25fY3NfdXBkYXRlX3BhZ2VzKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCBpbnQgcGdfaWR4KQoreworCWludCBuZXdfcGFnZTsKKwlzdHJ1Y3QgcmFkZW9uX2NzX2NodW5rICppYmMgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07CisJaW50IGk7CisJaW50IHNpemUgPSBQQUdFX1NJWkU7CisKKwlmb3IgKGkgPSBpYmMtPmxhc3RfY29waWVkX3BhZ2UgKyAxOyBpIDwgcGdfaWR4OyBpKyspIHsKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihwLT5pYi0+cHRyICsgKGkgKiAoUEFHRV9TSVpFLzQpKSwKKwkJCQkgICAgICAgaWJjLT51c2VyX3B0ciArIChpICogUEFHRV9TSVpFKSwKKwkJCQkgICAgICAgUEFHRV9TSVpFKSkgeworCQkJcC0+cGFyc2VyX2Vycm9yID0gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJbmV3X3BhZ2UgPSBpYmMtPmtwYWdlX2lkeFswXSA8IGliYy0+a3BhZ2VfaWR4WzFdID8gMCA6IDE7CisKKwlpZiAocGdfaWR4ID09IGliYy0+bGFzdF9wYWdlX2luZGV4KSB7CisJCXNpemUgPSAoaWJjLT5sZW5ndGhfZHcgKiA0KSAlIFBBR0VfU0laRTsKKwkJCWlmIChzaXplID09IDApCisJCQkJc2l6ZSA9IFBBR0VfU0laRTsKKwl9CisKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGliYy0+a3BhZ2VbbmV3X3BhZ2VdLAorCQkJICAgICAgIGliYy0+dXNlcl9wdHIgKyAocGdfaWR4ICogUEFHRV9TSVpFKSwKKwkJCSAgICAgICBzaXplKSkgeworCQlwLT5wYXJzZXJfZXJyb3IgPSAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjb3B5IHRvIElCIGhlcmUgKi8KKwltZW1jcHkoKHZvaWQgKikocC0+aWItPnB0cisocGdfaWR4KihQQUdFX1NJWkUvNCkpKSwgaWJjLT5rcGFnZVtuZXdfcGFnZV0sIHNpemUpOworCisJaWJjLT5sYXN0X2NvcGllZF9wYWdlID0gcGdfaWR4OworCWliYy0+a3BhZ2VfaWR4W25ld19wYWdlXSA9IHBnX2lkeDsKKworCXJldHVybiBuZXdfcGFnZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKaW5kZXggZGFmNWRiNy4uZGY5ODgxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKQEAgLTMyMiwxMCArMzIyLDYgQEAKIAljYXNlIENISVBfUlYzODA6CiAJCXJkZXYtPmFzaWMgPSAmcjMwMF9hc2ljOwogCQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkgewotCQkJcmRldi0+YXNpYy0+Z2FydF9pbml0ID0gJnJ2MzcwX3BjaWVfZ2FydF9pbml0OwotCQkJcmRldi0+YXNpYy0+Z2FydF9maW5pID0gJnJ2MzcwX3BjaWVfZ2FydF9maW5pOwotCQkJcmRldi0+YXNpYy0+Z2FydF9lbmFibGUgPSAmcnYzNzBfcGNpZV9nYXJ0X2VuYWJsZTsKLQkJCXJkZXYtPmFzaWMtPmdhcnRfZGlzYWJsZSA9ICZydjM3MF9wY2llX2dhcnRfZGlzYWJsZTsKIAkJCXJkZXYtPmFzaWMtPmdhcnRfdGxiX2ZsdXNoID0gJnJ2MzcwX3BjaWVfZ2FydF90bGJfZmx1c2g7CiAJCQlyZGV2LT5hc2ljLT5nYXJ0X3NldF9wYWdlID0gJnJ2MzcwX3BjaWVfZ2FydF9zZXRfcGFnZTsKIAkJfQpAQCAtNDg1LDcgKzQ4MSw2IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHJhZGVvbl92Z2Ffc2V0X2RlY29kZSh2b2lkICpjb29raWUsIGJvb2wgc3RhdGUpCiB7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBjb29raWU7Ci0KIAlyYWRlb25fdmdhX3NldF9zdGF0ZShyZGV2LCBzdGF0ZSk7CiAJaWYgKHN0YXRlKQogCQlyZXR1cm4gVkdBX1JTUkNfTEVHQUNZX0lPIHwgVkdBX1JTUkNfTEVHQUNZX01FTSB8CkBAIC00OTMsNiArNDg4LDI5IEBACiAJZWxzZQogCQlyZXR1cm4gVkdBX1JTUkNfTk9STUFMX0lPIHwgVkdBX1JTUkNfTk9STUFMX01FTTsKIH0KKwordm9pZCByYWRlb25fYWdwX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcmRldi0+ZmxhZ3MgJj0gflJBREVPTl9JU19BR1A7CisJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApIHsKKwkJRFJNX0lORk8oIkZvcmNpbmcgQUdQIHRvIFBDSUUgbW9kZVxuIik7CisJCXJkZXYtPmZsYWdzIHw9IFJBREVPTl9JU19QQ0lFOworCX0gZWxzZSBpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY1MTUgfHwKKwkJCXJkZXYtPmZhbWlseSA9PSBDSElQX1JWMzgwIHx8CisJCQlyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjQxMCB8fAorCQkJcmRldi0+ZmFtaWx5ID09IENISVBfUjQyMykgeworCQlEUk1fSU5GTygiRm9yY2luZyBBR1AgdG8gUENJRSBtb2RlXG4iKTsKKwkJcmRldi0+ZmxhZ3MgfD0gUkFERU9OX0lTX1BDSUU7CisJCXJkZXYtPmFzaWMtPmdhcnRfdGxiX2ZsdXNoID0gJnJ2MzcwX3BjaWVfZ2FydF90bGJfZmx1c2g7CisJCXJkZXYtPmFzaWMtPmdhcnRfc2V0X3BhZ2UgPSAmcnYzNzBfcGNpZV9nYXJ0X3NldF9wYWdlOworCX0gZWxzZSB7CisJCURSTV9JTkZPKCJGb3JjaW5nIEFHUCB0byBQQ0kgbW9kZVxuIik7CisJCXJkZXYtPmZsYWdzIHw9IFJBREVPTl9JU19QQ0k7CisJCXJkZXYtPmFzaWMtPmdhcnRfdGxiX2ZsdXNoID0gJnIxMDBfcGNpX2dhcnRfdGxiX2ZsdXNoOworCQlyZGV2LT5hc2ljLT5nYXJ0X3NldF9wYWdlID0gJnIxMDBfcGNpX2dhcnRfc2V0X3BhZ2U7CisJfQorfQorCiAvKgogICogUmFkZW9uIGRldmljZS4KICAqLwpAQCAtNTMxLDI5ICs1NDksNyBAQAogCX0KIAogCWlmIChyYWRlb25fYWdwbW9kZSA9PSAtMSkgewotCQlyZGV2LT5mbGFncyAmPSB+UkFERU9OX0lTX0FHUDsKLQkJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWNTE1IHx8Ci0JCSAgICByZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjM4MCB8fAotCQkgICAgcmRldi0+ZmFtaWx5ID09IENISVBfUlY0MTAgfHwKLQkJICAgIHJkZXYtPmZhbWlseSA9PSBDSElQX1I0MjMpIHsKLQkJCURSTV9JTkZPKCJGb3JjaW5nIEFHUCB0byBQQ0lFIG1vZGVcbiIpOwotCQkJcmRldi0+ZmxhZ3MgfD0gUkFERU9OX0lTX1BDSUU7Ci0JCQlyZGV2LT5hc2ljLT5nYXJ0X2luaXQgPSAmcnYzNzBfcGNpZV9nYXJ0X2luaXQ7Ci0JCQlyZGV2LT5hc2ljLT5nYXJ0X2ZpbmkgPSAmcnYzNzBfcGNpZV9nYXJ0X2Zpbmk7Ci0JCQlyZGV2LT5hc2ljLT5nYXJ0X2VuYWJsZSA9ICZydjM3MF9wY2llX2dhcnRfZW5hYmxlOwotCQkJcmRldi0+YXNpYy0+Z2FydF9kaXNhYmxlID0gJnJ2MzcwX3BjaWVfZ2FydF9kaXNhYmxlOwotCQkJcmRldi0+YXNpYy0+Z2FydF90bGJfZmx1c2ggPSAmcnYzNzBfcGNpZV9nYXJ0X3RsYl9mbHVzaDsKLQkJCXJkZXYtPmFzaWMtPmdhcnRfc2V0X3BhZ2UgPSAmcnYzNzBfcGNpZV9nYXJ0X3NldF9wYWdlOwotCQl9IGVsc2UgewotCQkJRFJNX0lORk8oIkZvcmNpbmcgQUdQIHRvIFBDSSBtb2RlXG4iKTsKLQkJCXJkZXYtPmZsYWdzIHw9IFJBREVPTl9JU19QQ0k7Ci0JCQlyZGV2LT5hc2ljLT5nYXJ0X2luaXQgPSAmcjEwMF9wY2lfZ2FydF9pbml0OwotCQkJcmRldi0+YXNpYy0+Z2FydF9maW5pID0gJnIxMDBfcGNpX2dhcnRfZmluaTsKLQkJCXJkZXYtPmFzaWMtPmdhcnRfZW5hYmxlID0gJnIxMDBfcGNpX2dhcnRfZW5hYmxlOwotCQkJcmRldi0+YXNpYy0+Z2FydF9kaXNhYmxlID0gJnIxMDBfcGNpX2dhcnRfZGlzYWJsZTsKLQkJCXJkZXYtPmFzaWMtPmdhcnRfdGxiX2ZsdXNoID0gJnIxMDBfcGNpX2dhcnRfdGxiX2ZsdXNoOwotCQkJcmRldi0+YXNpYy0+Z2FydF9zZXRfcGFnZSA9ICZyMTAwX3BjaV9nYXJ0X3NldF9wYWdlOwotCQl9CisJCXJhZGVvbl9hZ3BfZGlzYWJsZShyZGV2KTsKIAl9CiAKIAkvKiBzZXQgRE1BIG1hc2sgKyBuZWVkX2RtYTMyIGZsYWdzLgpAQCAtNTg1LDExMSArNTgxLDI2IEBACiAJRFJNX0lORk8oInJlZ2lzdGVyIG1taW8gYmFzZTogMHglMDhYXG4iLCAodWludDMyX3QpcmRldi0+cm1taW9fYmFzZSk7CiAJRFJNX0lORk8oInJlZ2lzdGVyIG1taW8gc2l6ZTogJXVcbiIsICh1bnNpZ25lZClyZGV2LT5ybW1pb19zaXplKTsKIAotCXJkZXYtPm5ld19pbml0X3BhdGggPSBmYWxzZTsKLQlyID0gcmFkZW9uX2luaXQocmRldik7Ci0JaWYgKHIpIHsKLQkJcmV0dXJuIHI7Ci0JfQotCiAJLyogaWYgd2UgaGF2ZSA+IDEgVkdBIGNhcmRzLCB0aGVuIGRpc2FibGUgdGhlIHJhZGVvbiBWR0EgcmVzb3VyY2VzICovCi0JciA9IHZnYV9jbGllbnRfcmVnaXN0ZXIocmRldi0+cGRldiwgcmRldiwgTlVMTCwgcmFkZW9uX3ZnYV9zZXRfZGVjb2RlKTsKLQlpZiAocikgewotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiB0aGlzIHdpbGwgZmFpbCBmb3IgY2FyZHMgdGhhdCBhcmVuJ3QgVkdBIGNsYXNzIGRldmljZXMsIGp1c3QKKwkgKiBpZ25vcmUgaXQgKi8KKwl2Z2FfY2xpZW50X3JlZ2lzdGVyKHJkZXYtPnBkZXYsIHJkZXYsIE5VTEwsIHJhZGVvbl92Z2Ffc2V0X2RlY29kZSk7CisKKwlyID0gcmFkZW9uX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCAmJiAhcmRldi0+YWNjZWxfd29ya2luZykgeworCQkvKiBBY2NlbGVyYXRpb24gbm90IHdvcmtpbmcgb24gQUdQIGNhcmQgdHJ5IGFnYWluCisJCSAqIHdpdGggZmFsbGJhY2sgdG8gUENJIG9yIFBDSUUgR0FSVAorCQkgKi8KKwkJcmFkZW9uX2dwdV9yZXNldChyZGV2KTsKKwkJcmFkZW9uX2ZpbmkocmRldik7CisJCXJhZGVvbl9hZ3BfZGlzYWJsZShyZGV2KTsKKwkJciA9IHJhZGVvbl9pbml0KHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOwogCX0KLQotCWlmICghcmRldi0+bmV3X2luaXRfcGF0aCkgewotCQkvKiBTZXR1cCBlcnJhdGEgZmxhZ3MgKi8KLQkJcmFkZW9uX2VycmF0YShyZGV2KTsKLQkJLyogSW5pdGlhbGl6ZSBzY3JhdGNoIHJlZ2lzdGVycyAqLwotCQlyYWRlb25fc2NyYXRjaF9pbml0KHJkZXYpOwotCQkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCi0JCXJhZGVvbl9zdXJmYWNlX2luaXQocmRldik7Ci0KLQkJLyogQklPUyovCi0JCWlmICghcmFkZW9uX2dldF9iaW9zKHJkZXYpKSB7Ci0JCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAocmRldi0+aXNfYXRvbV9iaW9zKSB7Ci0JCQlyID0gcmFkZW9uX2F0b21iaW9zX2luaXQocmRldik7Ci0JCQlpZiAocikgewotCQkJCXJldHVybiByOwotCQkJfQotCQl9IGVsc2UgewotCQkJciA9IHJhZGVvbl9jb21iaW9zX2luaXQocmRldik7Ci0JCQlpZiAocikgewotCQkJCXJldHVybiByOwotCQkJfQotCQl9Ci0JCS8qIFJlc2V0IGdwdSBiZWZvcmUgcG9zdGluZyBvdGhlcndpc2UgQVRPTSB3aWxsIGVudGVyIGluZmluaXRlIGxvb3AgKi8KLQkJaWYgKHJhZGVvbl9ncHVfcmVzZXQocmRldikpIHsKLQkJCS8qIEZJWE1FOiB3aGF0IGRvIHdlIHdhbnQgdG8gZG8gaGVyZSA/ICovCi0JCX0KLQkJLyogY2hlY2sgaWYgY2FyZHMgYXJlIHBvc3RlZCBvciBub3QgKi8KLQkJaWYgKCFyYWRlb25fY2FyZF9wb3N0ZWQocmRldikgJiYgcmRldi0+YmlvcykgewotCQkJRFJNX0lORk8oIkdQVSBub3QgcG9zdGVkLiBwb3N0aW5nIG5vdy4uLlxuIik7Ci0JCQlpZiAocmRldi0+aXNfYXRvbV9iaW9zKSB7Ci0JCQkJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCXJhZGVvbl9jb21iaW9zX2FzaWNfaW5pdChyZGV2LT5kZGV2KTsKLQkJCX0KLQkJfQotCQkvKiBHZXQgY2xvY2sgJiB2cmFtIGluZm9ybWF0aW9uICovCi0JCXJhZGVvbl9nZXRfY2xvY2tfaW5mbyhyZGV2LT5kZGV2KTsKLQkJcmFkZW9uX3ZyYW1faW5mbyhyZGV2KTsKLQkJLyogSW5pdGlhbGl6ZSBjbG9ja3MgKi8KLQkJciA9IHJhZGVvbl9jbG9ja3NfaW5pdChyZGV2KTsKLQkJaWYgKHIpIHsKLQkJCXJldHVybiByOwotCQl9Ci0KLQkJLyogSW5pdGlhbGl6ZSBtZW1vcnkgY29udHJvbGxlciAoYWxzbyB0ZXN0IEFHUCkgKi8KLQkJciA9IHJhZGVvbl9tY19pbml0KHJkZXYpOwotCQlpZiAocikgewotCQkJcmV0dXJuIHI7Ci0JCX0KLQkJLyogRmVuY2UgZHJpdmVyICovCi0JCXIgPSByYWRlb25fZmVuY2VfZHJpdmVyX2luaXQocmRldik7Ci0JCWlmIChyKSB7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCQlyID0gcmFkZW9uX2lycV9rbXNfaW5pdChyZGV2KTsKLQkJaWYgKHIpIHsKLQkJCXJldHVybiByOwotCQl9Ci0JCS8qIE1lbW9yeSBtYW5hZ2VyICovCi0JCXIgPSByYWRlb25fb2JqZWN0X2luaXQocmRldik7Ci0JCWlmIChyKSB7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCQlyID0gcmFkZW9uX2dwdV9nYXJ0X2luaXQocmRldik7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7Ci0JCS8qIEluaXRpYWxpemUgR0FSVCAoaW5pdGlhbGl6ZSBhZnRlciBUVE0gc28gd2UgY2FuIGFsbG9jYXRlCi0JCSAqIG1lbW9yeSB0aHJvdWdoIFRUTSBidXQgZmluYWxpemUgYWZ0ZXIgVFRNKSAqLwotCQlyID0gcmFkZW9uX2dhcnRfZW5hYmxlKHJkZXYpOwotCQlpZiAocikKLQkJCXJldHVybiAwOwotCQkJciA9IHJhZGVvbl9nZW1faW5pdChyZGV2KTsKLQkJaWYgKHIpCi0JCQlyZXR1cm4gMDsKLQotCQkvKiAxTSByaW5nIGJ1ZmZlciAqLwotCQlyID0gcmFkZW9uX2NwX2luaXQocmRldiwgMTAyNCAqIDEwMjQpOwotCQlpZiAocikKLQkJCXJldHVybiAwOwotCQlyID0gcmFkZW9uX3diX2luaXQocmRldik7Ci0JCWlmIChyKQotCQkJRFJNX0VSUk9SKCJyYWRlb246IGZhaWxsZWQgaW5pdGlhbGl6aW5nIFdCICglZCkuXG4iLCByKTsKLQkJciA9IHJhZGVvbl9pYl9wb29sX2luaXQocmRldik7Ci0JCWlmIChyKQotCQkJcmV0dXJuIDA7Ci0JCXIgPSByYWRlb25faWJfdGVzdChyZGV2KTsKLQkJaWYgKHIpCi0JCQlyZXR1cm4gMDsKLQkJcmRldi0+YWNjZWxfd29ya2luZyA9IHRydWU7Ci0JfQotCURSTV9JTkZPKCJyYWRlb246IGtlcm5lbCBtb2Rlc2V0dGluZyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQuXG4iKTsKIAlpZiAocmFkZW9uX3Rlc3RpbmcpIHsKIAkJcmFkZW9uX3Rlc3RfbW92ZXMocmRldik7CiAJfQpAQCAtNzAzLDMyICs2MTQsOCBAQAogewogCURSTV9JTkZPKCJyYWRlb246IGZpbmlzaGluZyBkZXZpY2UuXG4iKTsKIAlyZGV2LT5zaHV0ZG93biA9IHRydWU7Ci0JLyogT3JkZXIgbWF0dGVyIHNvIGJlY2FyZWZ1bGwgaWYgeW91IHJlYXJyYW5nZSBhbnl0aGluZ3MgKi8KLQlpZiAoIXJkZXYtPm5ld19pbml0X3BhdGgpIHsKLQkJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKLQkJcmFkZW9uX2NwX2ZpbmkocmRldik7Ci0JCXJhZGVvbl93Yl9maW5pKHJkZXYpOwotCQlyYWRlb25fZ3B1X2dhcnRfZmluaShyZGV2KTsKLQkJcmFkZW9uX2dlbV9maW5pKHJkZXYpOwotCQlyYWRlb25fbWNfZmluaShyZGV2KTsKLSNpZiBfX09TX0hBU19BR1AKLQkJcmFkZW9uX2FncF9maW5pKHJkZXYpOwotI2VuZGlmCi0JCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7Ci0JCXZnYV9jbGllbnRfcmVnaXN0ZXIocmRldi0+cGRldiwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JCXJhZGVvbl9mZW5jZV9kcml2ZXJfZmluaShyZGV2KTsKLQkJcmFkZW9uX2Nsb2Nrc19maW5pKHJkZXYpOwotCQlyYWRlb25fb2JqZWN0X2ZpbmkocmRldik7Ci0JCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKLQkJCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwotCQl9IGVsc2UgewotCQkJcmFkZW9uX2NvbWJpb3NfZmluaShyZGV2KTsKLQkJfQotCQlrZnJlZShyZGV2LT5iaW9zKTsKLQkJcmRldi0+YmlvcyA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJcmFkZW9uX2ZpbmkocmRldik7Ci0JfQorCXJhZGVvbl9maW5pKHJkZXYpOworCXZnYV9jbGllbnRfcmVnaXN0ZXIocmRldi0+cGRldiwgTlVMTCwgTlVMTCwgTlVMTCk7CiAJaW91bm1hcChyZGV2LT5ybW1pbyk7CiAJcmRldi0+cm1taW8gPSBOVUxMOwogfQpAQCAtNzY4LDE0ICs2NTUsNyBAQAogCiAJcmFkZW9uX3NhdmVfYmlvc19zY3JhdGNoX3JlZ3MocmRldik7CiAKLQlpZiAoIXJkZXYtPm5ld19pbml0X3BhdGgpIHsKLQkJcmFkZW9uX2NwX2Rpc2FibGUocmRldik7Ci0JCXJhZGVvbl9nYXJ0X2Rpc2FibGUocmRldik7Ci0JCXJkZXYtPmlycS5zd19pbnQgPSBmYWxzZTsKLQkJcmFkZW9uX2lycV9zZXQocmRldik7Ci0JfSBlbHNlIHsKLQkJcmFkZW9uX3N1c3BlbmQocmRldik7Ci0JfQorCXJhZGVvbl9zdXNwZW5kKHJkZXYpOwogCS8qIGV2aWN0IHJlbWFpbmluZyB2cmFtIG1lbW9yeSAqLwogCXJhZGVvbl9vYmplY3RfZXZpY3RfdnJhbShyZGV2KTsKIApAQCAtNzk0LDcgKzY3NCw2IEBACiBpbnQgcmFkZW9uX3Jlc3VtZV9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IHI7CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYtPnBkZXYsIFBDSV9EMCk7CkBAIC04MDQsNDMgKzY4Myw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJcGNpX3NldF9tYXN0ZXIoZGV2LT5wZGV2KTsKLQkvKiBSZXNldCBncHUgYmVmb3JlIHBvc3Rpbmcgb3RoZXJ3aXNlIEFUT00gd2lsbCBlbnRlciBpbmZpbml0ZSBsb29wICovCi0JaWYgKCFyZGV2LT5uZXdfaW5pdF9wYXRoKSB7Ci0JCWlmIChyYWRlb25fZ3B1X3Jlc2V0KHJkZXYpKSB7Ci0JCQkvKiBGSVhNRTogd2hhdCBkbyB3ZSB3YW50IHRvIGRvIGhlcmUgPyAqLwotCQl9Ci0JCS8qIHBvc3QgY2FyZCAqLwotCQlpZiAocmRldi0+aXNfYXRvbV9iaW9zKSB7Ci0JCQlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCXJhZGVvbl9jb21iaW9zX2FzaWNfaW5pdChyZGV2LT5kZGV2KTsKLQkJfQotCQkvKiBJbml0aWFsaXplIGNsb2NrcyAqLwotCQlyID0gcmFkZW9uX2Nsb2Nrc19pbml0KHJkZXYpOwotCQlpZiAocikgewotCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQkJLyogRW5hYmxlIElSUSAqLwotCQlyZGV2LT5pcnEuc3dfaW50ID0gdHJ1ZTsKLQkJcmFkZW9uX2lycV9zZXQocmRldik7Ci0JCS8qIEluaXRpYWxpemUgR1BVIE1lbW9yeSBDb250cm9sbGVyICovCi0JCXIgPSByYWRlb25fbWNfaW5pdChyZGV2KTsKLQkJaWYgKHIpIHsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXIgPSByYWRlb25fZ2FydF9lbmFibGUocmRldik7Ci0JCWlmIChyKSB7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlyID0gcmFkZW9uX2NwX2luaXQocmRldiwgcmRldi0+Y3AucmluZ19zaXplKTsKLQkJaWYgKHIpIHsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfSBlbHNlIHsKLQkJcmFkZW9uX3Jlc3VtZShyZGV2KTsKLQl9Ci1vdXQ6CisJcmFkZW9uX3Jlc3VtZShyZGV2KTsKIAlyYWRlb25fcmVzdG9yZV9iaW9zX3NjcmF0Y2hfcmVncyhyZGV2KTsKIAlmYl9zZXRfc3VzcGVuZChyZGV2LT5mYmRldl9pbmZvLCAwKTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKaW5kZXggNWQ4MTQxYi4uMzY1NWQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwpAQCAtMTA2LDI0ICsxMDYsMzMgQEAKIAkJbGVnYWN5X2NydGNfbG9hZF9sdXQoY3J0Yyk7CiB9CiAKLS8qKiBTZXRzIHRoZSBjb2xvciByYW1wcyBvbiBiZWhhbGYgb2YgUmFuZFIgKi8KKy8qKiBTZXRzIHRoZSBjb2xvciByYW1wcyBvbiBiZWhhbGYgb2YgZmJjb24gKi8KIHZvaWQgcmFkZW9uX2NydGNfZmJfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2IHJlZCwgdTE2IGdyZWVuLAogCQkJICAgICAgdTE2IGJsdWUsIGludCByZWdubykKIHsKIAlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoY3J0Yyk7CiAKLQlpZiAocmVnbm8gPT0gMCkKLQkJRFJNX0RFQlVHKCJnYW1tYSBzZXQgJWRcbiIsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKIAlyYWRlb25fY3J0Yy0+bHV0X3JbcmVnbm9dID0gcmVkID4+IDY7CiAJcmFkZW9uX2NydGMtPmx1dF9nW3JlZ25vXSA9IGdyZWVuID4+IDY7CiAJcmFkZW9uX2NydGMtPmx1dF9iW3JlZ25vXSA9IGJsdWUgPj4gNjsKIH0KIAorLyoqIEdldHMgdGhlIGNvbG9yIHJhbXBzIG9uIGJlaGFsZiBvZiBmYmNvbiAqLwordm9pZCByYWRlb25fY3J0Y19mYl9nYW1tYV9nZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwKKwkJCSAgICAgIHUxNiAqYmx1ZSwgaW50IHJlZ25vKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKKworCSpyZWQgPSByYWRlb25fY3J0Yy0+bHV0X3JbcmVnbm9dIDw8IDY7CisJKmdyZWVuID0gcmFkZW9uX2NydGMtPmx1dF9nW3JlZ25vXSA8PCA2OworCSpibHVlID0gcmFkZW9uX2NydGMtPmx1dF9iW3JlZ25vXSA8PCA2OworfQorCiBzdGF0aWMgdm9pZCByYWRlb25fY3J0Y19nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwKIAkJCQkgIHUxNiAqYmx1ZSwgdWludDMyX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoY3J0Yyk7Ci0JaW50IGksIGo7CisJaW50IGk7CiAKIAlpZiAoc2l6ZSAhPSAyNTYpIHsKIAkJcmV0dXJuOwpAQCAtMTMyLDIzICsxNDEsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChjcnRjLT5mYi0+ZGVwdGggPT0gMTYpIHsKLQkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJCWlmIChpIDw9IDMxKSB7Ci0JCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCQkJCQlyYWRlb25fY3J0Yy0+bHV0X3JbaSAqIDggKyBqXSA9IHJlZFtpXSA+PiA2OwotCQkJCQlyYWRlb25fY3J0Yy0+bHV0X2JbaSAqIDggKyBqXSA9IGJsdWVbaV0gPj4gNjsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotCQkJCXJhZGVvbl9jcnRjLT5sdXRfZ1tpICogNCArIGpdID0gZ3JlZW5baV0gPj4gNjsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQkJcmFkZW9uX2NydGMtPmx1dF9yW2ldID0gcmVkW2ldID4+IDY7Ci0JCQlyYWRlb25fY3J0Yy0+bHV0X2dbaV0gPSBncmVlbltpXSA+PiA2OwotCQkJcmFkZW9uX2NydGMtPmx1dF9iW2ldID0gYmx1ZVtpXSA+PiA2OwotCQl9CisJLyogdXNlcnNwYWNlIHBhbGV0dGVzIGFyZSBhbHdheXMgY29ycmVjdCBhcyBpcyAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlyYWRlb25fY3J0Yy0+bHV0X3JbaV0gPSByZWRbaV0gPj4gNjsKKwkJcmFkZW9uX2NydGMtPmx1dF9nW2ldID0gZ3JlZW5baV0gPj4gNjsKKwkJcmFkZW9uX2NydGMtPmx1dF9iW2ldID0gYmx1ZVtpXSA+PiA2OwogCX0KIAogCXJhZGVvbl9jcnRjX2xvYWRfbHV0KGNydGMpOwpAQCAtNzI0LDcgKzcyMSwxMSBAQAogCWlmIChyZXQpIHsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JLyogYWxsb2NhdGUgY3J0Y3MgLSBUT0RPIHNpbmdsZSBjcnRjICovCisKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fU0lOR0xFX0NSVEMpCisJCW51bV9jcnRjID0gMTsKKworCS8qIGFsbG9jYXRlIGNydGNzICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9jcnRjOyBpKyspIHsKIAkJcmFkZW9uX2NydGNfaW5pdChyZGV2LT5kZGV2LCBpKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCmluZGV4IDUwZmNlNDkuLjdmNTBmYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCkBAIC02Miw5ICs2Miw2IEBACiBpbnQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGxfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGxfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlcl9rbXMoRFJNX0lSUV9BUkdTKTsKLWludCByYWRlb25fbWFzdGVyX2NyZWF0ZV9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3Rlcik7Ci12b2lkIHJhZGVvbl9tYXN0ZXJfZGVzdHJveV9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKIGludCByYWRlb25fZG1hX2lvY3RsX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGludCByYWRlb25fZ2VtX29iamVjdF9pbml0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKQEAgLTI2MCw4ICsyNTcsNiBAQAogCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSByYWRlb25fZ2V0X3ZibGFua19jb3VudGVyX2ttcywKIAkuZW5hYmxlX3ZibGFuayA9IHJhZGVvbl9lbmFibGVfdmJsYW5rX2ttcywKIAkuZGlzYWJsZV92YmxhbmsgPSByYWRlb25fZGlzYWJsZV92Ymxhbmtfa21zLAotCS5tYXN0ZXJfY3JlYXRlID0gcmFkZW9uX21hc3Rlcl9jcmVhdGVfa21zLAotCS5tYXN0ZXJfZGVzdHJveSA9IHJhZGVvbl9tYXN0ZXJfZGVzdHJveV9rbXMsCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCiAJLmRlYnVnZnNfaW5pdCA9IHJhZGVvbl9kZWJ1Z2ZzX2luaXQsCiAJLmRlYnVnZnNfY2xlYW51cCA9IHJhZGVvbl9kZWJ1Z2ZzX2NsZWFudXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5oCmluZGV4IGNiMGNmZTQuLjM1MDk2MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5oCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorI2luY2x1ZGUgInJhZGVvbl9mYW1pbHkuaCIKKwogLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgogICovCiAKQEAgLTEwOSw3NSArMTExLDEyIEBACiAjZGVmaW5lIERSSVZFUl9NSU5PUgkJMzEKICNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAogCi0vKgotICogUmFkZW9uIGNoaXAgZmFtaWxpZXMKLSAqLwotZW51bSByYWRlb25fZmFtaWx5IHsKLQlDSElQX1IxMDAsCi0JQ0hJUF9SVjEwMCwKLQlDSElQX1JTMTAwLAotCUNISVBfUlYyMDAsCi0JQ0hJUF9SUzIwMCwKLQlDSElQX1IyMDAsCi0JQ0hJUF9SVjI1MCwKLQlDSElQX1JTMzAwLAotCUNISVBfUlYyODAsCi0JQ0hJUF9SMzAwLAotCUNISVBfUjM1MCwKLQlDSElQX1JWMzUwLAotCUNISVBfUlYzODAsCi0JQ0hJUF9SNDIwLAotCUNISVBfUjQyMywKLQlDSElQX1JWNDEwLAotCUNISVBfUlM0MDAsCi0JQ0hJUF9SUzQ4MCwKLQlDSElQX1JTNjAwLAotCUNISVBfUlM2OTAsCi0JQ0hJUF9SUzc0MCwKLQlDSElQX1JWNTE1LAotCUNISVBfUjUyMCwKLQlDSElQX1JWNTMwLAotCUNISVBfUlY1NjAsCi0JQ0hJUF9SVjU3MCwKLQlDSElQX1I1ODAsCi0JQ0hJUF9SNjAwLAotCUNISVBfUlY2MTAsCi0JQ0hJUF9SVjYzMCwKLQlDSElQX1JWNjIwLAotCUNISVBfUlY2MzUsCi0JQ0hJUF9SVjY3MCwKLQlDSElQX1JTNzgwLAotCUNISVBfUlM4ODAsCi0JQ0hJUF9SVjc3MCwKLQlDSElQX1JWNzMwLAotCUNISVBfUlY3MTAsCi0JQ0hJUF9SVjc0MCwKLQlDSElQX0xBU1QsCi19OwotCiBlbnVtIHJhZGVvbl9jcF9taWNyb2NvZGVfdmVyc2lvbiB7CiAJVUNPREVfUjEwMCwKIAlVQ09ERV9SMjAwLAogCVVDT0RFX1IzMDAsCiB9OwogCi0vKgotICogQ2hpcCBmbGFncwotICovCi1lbnVtIHJhZGVvbl9jaGlwX2ZsYWdzIHsKLQlSQURFT05fRkFNSUxZX01BU0sgPSAweDAwMDBmZmZmVUwsCi0JUkFERU9OX0ZMQUdTX01BU0sgPSAweGZmZmYwMDAwVUwsCi0JUkFERU9OX0lTX01PQklMSVRZID0gMHgwMDAxMDAwMFVMLAotCVJBREVPTl9JU19JR1AgPSAweDAwMDIwMDAwVUwsCi0JUkFERU9OX1NJTkdMRV9DUlRDID0gMHgwMDA0MDAwMFVMLAotCVJBREVPTl9JU19BR1AgPSAweDAwMDgwMDAwVUwsCi0JUkFERU9OX0hBU19ISUVSWiA9IDB4MDAxMDAwMDBVTCwKLQlSQURFT05fSVNfUENJRSA9IDB4MDAyMDAwMDBVTCwKLQlSQURFT05fTkVXX01FTU1BUCA9IDB4MDA0MDAwMDBVTCwKLQlSQURFT05fSVNfUENJID0gMHgwMDgwMDAwMFVMLAotCVJBREVPTl9JU19JR1BHQVJUID0gMHgwMTAwMDAwMFVMLAotfTsKLQogdHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9mcmVlbGlzdCB7CiAJdW5zaWduZWQgaW50IGFnZTsKIAlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKaW5kZXggNjIxNjQ2Ny4uYTY1YWIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCkBAIC0xMzQ1LDYgKzEzNDUsNyBAQAogdm9pZAogcmFkZW9uX2FkZF9hdG9tX2VuY29kZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgZW5jb2Rlcl9pZCwgdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSkKIHsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXI7CiAKQEAgLTEzNjQsNyArMTM2NSwxMCBAQAogCQlyZXR1cm47CiAKIAllbmNvZGVyID0gJnJhZGVvbl9lbmNvZGVyLT5iYXNlOwotCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHgzOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykKKwkJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSAweDE7CisJZWxzZQorCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4MzsKIAllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOwogCiAJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZhbWlseS5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3OTcyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZhbWlseS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAyMDA5IEplcm9tZSBHbGlzc2UuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogRGF2ZSBBaXJsaWUKKyAqICAgICAgICAgIEFsZXggRGV1Y2hlcgorICogICAgICAgICAgSmVyb21lIEdsaXNzZQorICovCisKKy8qIHRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDSElQXyAgYW5kIGZhbWlseSBmbGFncyB1c2VkIGluIHRoZSBwY2lpZHMsCisgKiBpdHMgaXMgY29tbW9uIGJldHdlZW4ga21zIGFuZCBub24ta21zIGJlY2F1c2UgZHVwbGljYXRpbmcgaXQgYW5kCisgKiBjaGFuZ2luZyBvbmUgcGxhY2UgaXMgZmFpbC4KKyAqLworI2lmbmRlZiBSQURFT05fRkFNSUxZX0gKKyNkZWZpbmUgUkFERU9OX0ZBTUlMWV9ICisvKgorICogUmFkZW9uIGNoaXAgZmFtaWxpZXMKKyAqLworZW51bSByYWRlb25fZmFtaWx5IHsKKwlDSElQX1IxMDAsCisJQ0hJUF9SVjEwMCwKKwlDSElQX1JTMTAwLAorCUNISVBfUlYyMDAsCisJQ0hJUF9SUzIwMCwKKwlDSElQX1IyMDAsCisJQ0hJUF9SVjI1MCwKKwlDSElQX1JTMzAwLAorCUNISVBfUlYyODAsCisJQ0hJUF9SMzAwLAorCUNISVBfUjM1MCwKKwlDSElQX1JWMzUwLAorCUNISVBfUlYzODAsCisJQ0hJUF9SNDIwLAorCUNISVBfUjQyMywKKwlDSElQX1JWNDEwLAorCUNISVBfUlM0MDAsCisJQ0hJUF9SUzQ4MCwKKwlDSElQX1JTNjAwLAorCUNISVBfUlM2OTAsCisJQ0hJUF9SUzc0MCwKKwlDSElQX1JWNTE1LAorCUNISVBfUjUyMCwKKwlDSElQX1JWNTMwLAorCUNISVBfUlY1NjAsCisJQ0hJUF9SVjU3MCwKKwlDSElQX1I1ODAsCisJQ0hJUF9SNjAwLAorCUNISVBfUlY2MTAsCisJQ0hJUF9SVjYzMCwKKwlDSElQX1JWNjcwLAorCUNISVBfUlY2MjAsCisJQ0hJUF9SVjYzNSwKKwlDSElQX1JTNzgwLAorCUNISVBfUlM4ODAsCisJQ0hJUF9SVjc3MCwKKwlDSElQX1JWNzMwLAorCUNISVBfUlY3MTAsCisJQ0hJUF9SVjc0MCwKKwlDSElQX0xBU1QsCit9OworCisvKgorICogQ2hpcCBmbGFncworICovCitlbnVtIHJhZGVvbl9jaGlwX2ZsYWdzIHsKKwlSQURFT05fRkFNSUxZX01BU0sgPSAweDAwMDBmZmZmVUwsCisJUkFERU9OX0ZMQUdTX01BU0sgPSAweGZmZmYwMDAwVUwsCisJUkFERU9OX0lTX01PQklMSVRZID0gMHgwMDAxMDAwMFVMLAorCVJBREVPTl9JU19JR1AgPSAweDAwMDIwMDAwVUwsCisJUkFERU9OX1NJTkdMRV9DUlRDID0gMHgwMDA0MDAwMFVMLAorCVJBREVPTl9JU19BR1AgPSAweDAwMDgwMDAwVUwsCisJUkFERU9OX0hBU19ISUVSWiA9IDB4MDAxMDAwMDBVTCwKKwlSQURFT05fSVNfUENJRSA9IDB4MDAyMDAwMDBVTCwKKwlSQURFT05fTkVXX01FTU1BUCA9IDB4MDA0MDAwMDBVTCwKKwlSQURFT05fSVNfUENJID0gMHgwMDgwMDAwMFVMLAorCVJBREVPTl9JU19JR1BHQVJUID0gMHgwMTAwMDAwMFVMLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMKaW5kZXggOTQ0ZTRmYS4uYjM4YzRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYi5jCkBAIC01NSw2ICs1NSw3IEBACiAJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCiAJLmZiX3Bhbl9kaXNwbGF5ID0gZHJtX2ZiX2hlbHBlcl9wYW5fZGlzcGxheSwKIAkuZmJfYmxhbmsgPSBkcm1fZmJfaGVscGVyX2JsYW5rLAorCS5mYl9zZXRjbWFwID0gZHJtX2ZiX2hlbHBlcl9zZXRjbWFwLAogfTsKIAogLyoqCkBAIC0xMjMsMTEgKzEyNCwxMyBAQAogCiBzdGF0aWMgc3RydWN0IGRybV9mYl9oZWxwZXJfZnVuY3MgcmFkZW9uX2ZiX2hlbHBlcl9mdW5jcyA9IHsKIAkuZ2FtbWFfc2V0ID0gcmFkZW9uX2NydGNfZmJfZ2FtbWFfc2V0LAorCS5nYW1tYV9nZXQgPSByYWRlb25fY3J0Y19mYl9nYW1tYV9nZXQsCiB9OwogCiBpbnQgcmFkZW9uZmJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCSAgICB1aW50MzJfdCBmYl93aWR0aCwgdWludDMyX3QgZmJfaGVpZ2h0LAogCQkgICAgdWludDMyX3Qgc3VyZmFjZV93aWR0aCwgdWludDMyX3Qgc3VyZmFjZV9oZWlnaHQsCisJCSAgICB1aW50MzJfdCBzdXJmYWNlX2RlcHRoLCB1aW50MzJfdCBzdXJmYWNlX2JwcCwKIAkJICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKipmYl9wKQogewogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE0NSwxMyArMTQ4LDE5IEBACiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJYm9vbCBmYl90aWxlZCA9IGZhbHNlOyAvKiB1c2VmdWwgZm9yIHRlc3RpbmcgKi8KIAl1MzIgdGlsaW5nX2ZsYWdzID0gMDsKKwlpbnQgY3J0Y19jb3VudDsKIAogCW1vZGVfY21kLndpZHRoID0gc3VyZmFjZV93aWR0aDsKIAltb2RlX2NtZC5oZWlnaHQgPSBzdXJmYWNlX2hlaWdodDsKLQltb2RlX2NtZC5icHAgPSAzMjsKKworCS8qIGF2aXZvIGNhbid0IHNjYW5vdXQgcmVhbCAyNGJwcCAqLworCWlmICgoc3VyZmFjZV9icHAgPT0gMjQpICYmIEFTSUNfSVNfQVZJVk8ocmRldikpCisJCXN1cmZhY2VfYnBwID0gMzI7CisKKwltb2RlX2NtZC5icHAgPSBzdXJmYWNlX2JwcDsKIAkvKiBuZWVkIHRvIGFsaWduIHBpdGNoIHdpdGggY3J0YyBsaW1pdHMgKi8KIAltb2RlX2NtZC5waXRjaCA9IHJhZGVvbl9hbGlnbl9waXRjaChyZGV2LCBtb2RlX2NtZC53aWR0aCwgbW9kZV9jbWQuYnBwLCBmYl90aWxlZCkgKiAoKG1vZGVfY21kLmJwcCArIDEpIC8gOCk7Ci0JbW9kZV9jbWQuZGVwdGggPSAyNDsKKwltb2RlX2NtZC5kZXB0aCA9IHN1cmZhY2VfZGVwdGg7CiAKIAlzaXplID0gbW9kZV9jbWQucGl0Y2ggKiBtb2RlX2NtZC5oZWlnaHQ7CiAJYWxpZ25lZF9zaXplID0gQUxJR04oc2l6ZSwgUEFHRV9TSVpFKTsKQEAgLTIxNiw3ICsyMjUsMTEgQEAKIAlyZmJkZXYgPSBpbmZvLT5wYXI7CiAJcmZiZGV2LT5oZWxwZXIuZnVuY3MgPSAmcmFkZW9uX2ZiX2hlbHBlcl9mdW5jczsKIAlyZmJkZXYtPmhlbHBlci5kZXYgPSBkZXY7Ci0JcmV0ID0gZHJtX2ZiX2hlbHBlcl9pbml0X2NydGNfY291bnQoJnJmYmRldi0+aGVscGVyLCAyLAorCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykKKwkJY3J0Y19jb3VudCA9IDE7CisJZWxzZQorCQljcnRjX2NvdW50ID0gMjsKKwlyZXQgPSBkcm1fZmJfaGVscGVyX2luaXRfY3J0Y19jb3VudCgmcmZiZGV2LT5oZWxwZXIsIGNydGNfY291bnQsCiAJCQkJCSAgICBSQURFT05GQl9DT05OX0xJTUlUKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF91bnJlZjsKQEAgLTIzMyw3ICsyNDYsNyBAQAogCiAJc3RyY3B5KGluZm8tPmZpeC5pZCwgInJhZGVvbmRybWZiIik7CiAKLQlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGluZm8sIGZiLT5waXRjaCk7CisJZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChpbmZvLCBmYi0+cGl0Y2gsIGZiLT5kZXB0aCk7CiAKIAlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOwogCWluZm8tPmZib3BzID0gJnJhZGVvbmZiX29wczsKQEAgLTI5MCwxMyArMzAzLDI2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uOworaW50IHJhZGVvbl9wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMpCit7CisJY2hhciAqdGhpc19vcHQ7CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKKwkJbW9kZV9vcHRpb24gPSB0aGlzX29wdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIGludCByYWRlb25mYl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCWludCByZXQ7Ci0JcmV0ID0gZHJtX2ZiX2hlbHBlcl9zaW5nbGVfZmJfcHJvYmUoZGV2LCAmcmFkZW9uZmJfY3JlYXRlKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBkcm1fZmJfaGVscGVyX3NpbmdsZV9mYl9wcm9iZShkZXYsIDMyLCAmcmFkZW9uZmJfY3JlYXRlKTsKIH0KLUVYUE9SVF9TWU1CT0wocmFkZW9uZmJfcHJvYmUpOwogCiBpbnQgcmFkZW9uZmJfcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCmluZGV4IDE4NDExNDUuLjhlMGE4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKQEAgLTgzLDggKzgzLDEyIEBACiBpbnQgcmFkZW9uX2lycV9rbXNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgciA9IDA7CisJaW50IG51bV9jcnRjID0gMjsKIAotCXIgPSBkcm1fdmJsYW5rX2luaXQocmRldi0+ZGRldiwgMik7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX1NJTkdMRV9DUlRDKQorCQludW1fY3J0YyA9IDE7CisKKwlyID0gZHJtX3ZibGFua19pbml0KHJkZXYtPmRkZXYsIG51bV9jcnRjKTsKIAlpZiAocikgewogCQlyZXR1cm4gcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jCmluZGV4IDcwOWJkODkuLmJhMTI4NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jCkBAIC0yMDEsNTUgKzIwMSw2IEBACiAKIAogLyoKLSAqIEZvciBtdWx0aXBsZSBtYXN0ZXIgKGxpa2UgbXVsdGlwbGUgWCkuCi0gKi8KLXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlIHsKLQlkcm1fbG9jYWxfbWFwX3QgKnNhcmVhOwotCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdjsKLX07Ci0KLWludCByYWRlb25fbWFzdGVyX2NyZWF0ZV9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlcikKLXsKLQlzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXY7Ci0JdW5zaWduZWQgbG9uZyBzYXJlYXBhZ2U7Ci0JaW50IHJldDsKLQotCW1hc3Rlcl9wcml2ID0ga3phbGxvYyhzaXplb2YoKm1hc3Rlcl9wcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG1hc3Rlcl9wcml2ID09IE5VTEwpIHsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCS8qIHByZWJ1aWxkIHRoZSBTQVJFQSAqLwotCXNhcmVhcGFnZSA9IG1heF90KHVuc2lnbmVkIGxvbmcsIFNBUkVBX01BWCwgUEFHRV9TSVpFKTsKLQlyZXQgPSBkcm1fYWRkbWFwKGRldiwgMCwgc2FyZWFwYWdlLCBfRFJNX1NITSwKLQkJCSBfRFJNX0NPTlRBSU5TX0xPQ0ssCi0JCQkgJm1hc3Rlcl9wcml2LT5zYXJlYSk7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoIlNBUkVBIHNldHVwIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2ID0gbWFzdGVyX3ByaXYtPnNhcmVhLT5oYW5kbGUgKyBzaXplb2Yoc3RydWN0IGRybV9zYXJlYSk7Ci0JbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSAwOwotCW1hc3Rlci0+ZHJpdmVyX3ByaXYgPSBtYXN0ZXJfcHJpdjsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCByYWRlb25fbWFzdGVyX2Rlc3Ryb3lfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlcikKLXsKLQlzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBtYXN0ZXItPmRyaXZlcl9wcml2OwotCi0JaWYgKG1hc3Rlcl9wcml2ID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAobWFzdGVyX3ByaXYtPnNhcmVhKSB7Ci0JCWRybV9ybW1hcF9sb2NrZWQoZGV2LCBtYXN0ZXJfcHJpdi0+c2FyZWEpOwotCX0KLQlrZnJlZShtYXN0ZXJfcHJpdik7Ci0JbWFzdGVyLT5kcml2ZXJfcHJpdiA9IE5VTEw7Ci19Ci0KLQotLyoKICAqIElPQ1RMLgogICovCiBpbnQgcmFkZW9uX2RtYV9pb2N0bF9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfY3J0Yy5jCmluZGV4IDJiOTk3YTEuLjM2NDEwZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2NydGMuYwpAQCAtMTA1Myw2ICsxMDUzLDcgQEAKIAkubW9kZV9zZXRfYmFzZSA9IHJhZGVvbl9jcnRjX3NldF9iYXNlLAogCS5wcmVwYXJlID0gcmFkZW9uX2NydGNfcHJlcGFyZSwKIAkuY29tbWl0ID0gcmFkZW9uX2NydGNfY29tbWl0LAorCS5sb2FkX2x1dCA9IHJhZGVvbl9jcnRjX2xvYWRfbHV0LAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfZW5jb2RlcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9lbmNvZGVycy5jCmluZGV4IGIxNTQ3ZjcuLjZjZWI5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9lbmNvZGVycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9lbmNvZGVycy5jCkBAIC04ODEsNyArODgxLDcgQEAKIAkJCQkJUjQyMF9UVl9EQUNfREFDQURKX01BU0sgfAogCQkJCQlSNDIwX1RWX0RBQ19SREFDUEQgfAogCQkJCQlSNDIwX1RWX0RBQ19HREFDUEQgfAotCQkJCQlSNDIwX1RWX0RBQ19HREFDUEQgfAorCQkJCQlSNDIwX1RWX0RBQ19CREFDUEQgfAogCQkJCQlSNDIwX1RWX0RBQ19UVkVOQUJMRSk7CiAJCX0gZWxzZSB7CiAJCQl0dl9kYWNfY250bCAmPSB+KFJBREVPTl9UVl9EQUNfU1REX01BU0sgfApAQCAtODg5LDcgKzg4OSw3IEBACiAJCQkJCVJBREVPTl9UVl9EQUNfREFDQURKX01BU0sgfAogCQkJCQlSQURFT05fVFZfREFDX1JEQUNQRCB8CiAJCQkJCVJBREVPTl9UVl9EQUNfR0RBQ1BEIHwKLQkJCQkJUkFERU9OX1RWX0RBQ19HREFDUEQpOworCQkJCQlSQURFT05fVFZfREFDX0JEQUNQRCk7CiAJCX0KIAogCQkvKiAgRklYTUUgVFYgKi8KQEAgLTEzMTgsNyArMTMxOCwxMCBAQAogCQlyZXR1cm47CiAKIAllbmNvZGVyID0gJnJhZGVvbl9lbmNvZGVyLT5iYXNlOwotCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHgzOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykKKwkJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSAweDE7CisJZWxzZQorCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4MzsKIAllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOwogCiAJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaAppbmRleCA1NzBhNTg3Li5lNjEyMjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCkBAIC00MDcsNiArNDA3LDggQEAKIHJhZGVvbl9jb21iaW9zX2VuY29kZXJfZHBtc19zY3JhdGNoX3JlZ3Moc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBib29sIG9uKTsKIGV4dGVybiB2b2lkIHJhZGVvbl9jcnRjX2ZiX2dhbW1hX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUxNiByZWQsIHUxNiBncmVlbiwKIAkJCQkgICAgIHUxNiBibHVlLCBpbnQgcmVnbm8pOworZXh0ZXJuIHZvaWQgcmFkZW9uX2NydGNfZmJfZ2FtbWFfZ2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2ICpyZWQsIHUxNiAqZ3JlZW4sCisJCQkJICAgICB1MTYgKmJsdWUsIGludCByZWdubyk7CiBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpyYWRlb25fZnJhbWVidWZmZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCQkgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kLAogCQkJCQkJICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCmluZGV4IDczYWY0NjMuLjFmMDU2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCkBAIC00MDAsMTEgKzQwMCw5IEBACiBpbnQgcmFkZW9uX29iamVjdF9saXN0X3Jlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlzdHJ1Y3QgcmFkZW9uX29iamVjdF9saXN0ICpsb2JqOwotCXN0cnVjdCBsaXN0X2hlYWQgKmk7CiAJaW50IHI7CiAKLQlsaXN0X2Zvcl9lYWNoKGksIGhlYWQpIHsKLQkJbG9iaiA9IGxpc3RfZW50cnkoaSwgc3RydWN0IHJhZGVvbl9vYmplY3RfbGlzdCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCBsaXN0KXsKIAkJaWYgKCFsb2JqLT5yb2JqLT5waW5fY291bnQpIHsKIAkJCXIgPSByYWRlb25fb2JqZWN0X3Jlc2VydmUobG9iai0+cm9iaiwgdHJ1ZSk7CiAJCQlpZiAodW5saWtlbHkociAhPSAwKSkgewpAQCAtNDIwLDEzICs0MTgsMTAgQEAKIHZvaWQgcmFkZW9uX29iamVjdF9saXN0X3VucmVzZXJ2ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCXN0cnVjdCByYWRlb25fb2JqZWN0X2xpc3QgKmxvYmo7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaTsKIAotCWxpc3RfZm9yX2VhY2goaSwgaGVhZCkgewotCQlsb2JqID0gbGlzdF9lbnRyeShpLCBzdHJ1Y3QgcmFkZW9uX29iamVjdF9saXN0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvYmosIGhlYWQsIGxpc3QpIHsKIAkJaWYgKCFsb2JqLT5yb2JqLT5waW5fY291bnQpIHsKIAkJCXJhZGVvbl9vYmplY3RfdW5yZXNlcnZlKGxvYmotPnJvYmopOwotCQl9IGVsc2UgewogCQl9CiAJfQogfQpAQCAtNDM2LDcgKzQzMSw2IEBACiAJc3RydWN0IHJhZGVvbl9vYmplY3RfbGlzdCAqbG9iajsKIAlzdHJ1Y3QgcmFkZW9uX29iamVjdCAqcm9iajsKIAlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpvbGRfZmVuY2UgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmk7CiAJaW50IHI7CiAKIAlyID0gcmFkZW9uX29iamVjdF9saXN0X3Jlc2VydmUoaGVhZCk7CkBAIC00NDQsOCArNDM4LDcgQEAKIAkJcmFkZW9uX29iamVjdF9saXN0X3VucmVzZXJ2ZShoZWFkKTsKIAkJcmV0dXJuIHI7CiAJfQotCWxpc3RfZm9yX2VhY2goaSwgaGVhZCkgewotCQlsb2JqID0gbGlzdF9lbnRyeShpLCBzdHJ1Y3QgcmFkZW9uX29iamVjdF9saXN0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvYmosIGhlYWQsIGxpc3QpIHsKIAkJcm9iaiA9IGxvYmotPnJvYmo7CiAJCWlmICghcm9iai0+cGluX2NvdW50KSB7CiAJCQlpZiAobG9iai0+d2RvbWFpbikgewpAQCAtNDgyLDEwICs0NzUsOCBAQAogewogCXN0cnVjdCByYWRlb25fb2JqZWN0X2xpc3QgKmxvYmo7CiAJc3RydWN0IHJhZGVvbl9mZW5jZSAqb2xkX2ZlbmNlID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppOwogCi0JbGlzdF9mb3JfZWFjaChpLCBoZWFkKSB7Ci0JCWxvYmogPSBsaXN0X2VudHJ5KGksIHN0cnVjdCByYWRlb25fb2JqZWN0X2xpc3QsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobG9iaiwgaGVhZCwgbGlzdCkgewogCQlvbGRfZmVuY2UgPSAoc3RydWN0IHJhZGVvbl9mZW5jZSAqKWxvYmotPnJvYmotPnRvYmouc3luY19vYmo7CiAJCWxvYmotPnJvYmotPnRvYmouc3luY19vYmogPSBOVUxMOwogCQlpZiAob2xkX2ZlbmNlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oCmluZGV4IDIxZGE4NzEuLmJmYTFhYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oCkBAIC0zMzMzLDYgKzMzMzMsNyBAQAogIyAgICAgICBkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVF9NQVhfRFdPUkRTICAgICAgICAgICgxIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDBfUkVHX01BU0sgICAgICAgICAgIDB4MDAwMDA3ZmYKICMgICAgICAgZGVmaW5lIFIzMDBfQ1BfUEFDS0VUMF9SRUdfTUFTSyAgICAgICAgICAgICAweDAwMDAxZmZmCisjICAgICAgIGRlZmluZSBSNjAwX0NQX1BBQ0tFVDBfUkVHX01BU0sgICAgICAgICAgICAgMHgwMDAwZmZmZgogIyAgICAgICBkZWZpbmUgUkFERU9OX0NQX1BBQ0tFVDFfUkVHMF9NQVNLICAgICAgICAgIDB4MDAwMDA3ZmYKICMgICAgICAgZGVmaW5lIFJBREVPTl9DUF9QQUNLRVQxX1JFRzFfTUFTSyAgICAgICAgICAweDAwM2ZmODAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKaW5kZXggYWNkODg5Yy4uNzY1YmQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKQEAgLTUzMCw3ICs1MzAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHJhZGVvbl90dG1fdm1fb3BzOwotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCAqdHRtX3ZtX29wcyA9IE5VTEw7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICp0dG1fdm1fb3BzID0gTlVMTDsKIAogc3RhdGljIGludCByYWRlb25fdHRtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKIHsKQEAgLTY4OSw5ICs2ODksNiBAQAogCiAjZGVmaW5lIFJBREVPTl9ERUJVR0ZTX01FTV9UWVBFUyAyCiAKLXN0YXRpYyBzdHJ1Y3QgZHJtX2luZm9fbGlzdCByYWRlb25fbWVtX3R5cGVzX2xpc3RbUkFERU9OX0RFQlVHRlNfTUVNX1RZUEVTXTsKLXN0YXRpYyBjaGFyIHJhZGVvbl9tZW1fdHlwZXNfbmFtZXNbUkFERU9OX0RFQlVHRlNfTUVNX1RZUEVTXVszMl07Ci0KICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKIHN0YXRpYyBpbnQgcmFkZW9uX21tX2R1bXBfdGFibGUoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogewpAQCAtNzExLDkgKzcwOCwxMSBAQAogCiBzdGF0aWMgaW50IHJhZGVvbl90dG1fZGVidWdmc19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQorCXN0YXRpYyBzdHJ1Y3QgZHJtX2luZm9fbGlzdCByYWRlb25fbWVtX3R5cGVzX2xpc3RbUkFERU9OX0RFQlVHRlNfTUVNX1RZUEVTXTsKKwlzdGF0aWMgY2hhciByYWRlb25fbWVtX3R5cGVzX25hbWVzW1JBREVPTl9ERUJVR0ZTX01FTV9UWVBFU11bMzJdOwogCXVuc2lnbmVkIGk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKIAlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX0RFQlVHRlNfTUVNX1RZUEVTOyBpKyspIHsKIAkJaWYgKGkgPT0gMCkKIAkJCXNwcmludGYocmFkZW9uX21lbV90eXBlc19uYW1lc1tpXSwgInJhZGVvbl92cmFtX21tIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzMTAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczEwMGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE5MTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczEwMGQuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOSBKZXJvbWUgR2xpc3NlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IERhdmUgQWlybGllCisgKiAgICAgICAgICBBbGV4IERldWNoZXIKKyAqICAgICAgICAgIEplcm9tZSBHbGlzc2UKKyAqLworI2lmbmRlZiBfX1JTMTAwRF9IX18KKyNkZWZpbmUgX19SUzEwMERfSF9fCisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBSXzAwMDE1Q19OQl9UT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDE1QworI2RlZmluZSAgIFNfMDAwMTVDX01DX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMTVDX01DX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMTVDX01DX0ZCX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgICBTXzAwMDE1Q19NQ19GQl9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMTYpCisjZGVmaW5lICAgR18wMDAxNUNfTUNfRkJfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMTVDX01DX0ZCX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMKaW5kZXggYTNmYmRhZC4uYTc2OWMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYwpAQCAtMjcsMjcgKzI3LDEyIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSAicmFkZW9uX3JlZy5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgorI2luY2x1ZGUgInJzNDAwZC5oIgogCi0vKiByczQwMCxyczQ4MCBkZXBlbmRzIG9uIDogKi8KLXZvaWQgcjEwMF9oZHBfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByMTAwX21jX2Rpc2FibGVfY2xpZW50cyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcjMwMF9tY193YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcjQyMF9waXBlc19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKy8qIFRoaXMgZmlsZXMgZ2F0aGVyIGZ1bmN0aW9ucyBzcGVjaWZpY3MgdG8gOiByczQwMCxyczQ4MCAqLworc3RhdGljIGludCByczQwMF9kZWJ1Z2ZzX3BjaWVfZ2FydF9pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCi0vKiBUaGlzIGZpbGVzIGdhdGhlciBmdW5jdGlvbnMgc3BlY2lmaWNzIHRvIDoKLSAqIHJzNDAwLHJzNDgwCi0gKgotICogU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgbWlnaHQgYmUgdXNlZCBieSBuZXdlciBBU0lDcy4KLSAqLwotdm9pZCByczQwMF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcnM0MDBfZGVidWdmc19wY2llX2dhcnRfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQotCi0vKgotICogR0FSVCBmdW5jdGlvbnMuCi0gKi8KIHZvaWQgcnM0MDBfZ2FydF9hZGp1c3Rfc2l6ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAkvKiBDaGVjayBnYXJ0IHNpemUgKi8KQEAgLTIzOCw2MSArMjIzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0vKgotICogTUMgZnVuY3Rpb25zLgotICovCi1pbnQgcnM0MDBfbWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQl1aW50MzJfdCB0bXA7Ci0JaW50IHI7Ci0KLQlpZiAocjEwMF9kZWJ1Z2ZzX3JiYm1faW5pdChyZGV2KSkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBkZWJ1Z2ZzIGZpbGUgZm9yIFJCQk0gIVxuIik7Ci0JfQotCi0JcnM0MDBfZ3B1X2luaXQocmRldik7Ci0JcnM0MDBfZ2FydF9kaXNhYmxlKHJkZXYpOwotCXJkZXYtPm1jLmd0dF9sb2NhdGlvbiA9IHJkZXYtPm1jLm1jX3ZyYW1fc2l6ZTsKLQlyZGV2LT5tYy5ndHRfbG9jYXRpb24gKz0gKHJkZXYtPm1jLmd0dF9zaXplIC0gMSk7Ci0JcmRldi0+bWMuZ3R0X2xvY2F0aW9uICY9IH4ocmRldi0+bWMuZ3R0X3NpemUgLSAxKTsKLQlyID0gcmFkZW9uX21jX3NldHVwKHJkZXYpOwotCWlmIChyKSB7Ci0JCXJldHVybiByOwotCX0KLQotCXIxMDBfbWNfZGlzYWJsZV9jbGllbnRzKHJkZXYpOwotCWlmIChyMzAwX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIHdhaXQgTUMgaWRsZSB3aGlsZSAiCi0JCSAgICAgICAicHJvZ3JhbW1pbmcgcGlwZXMuIEJhZCB0aGluZ3MgbWlnaHQgaGFwcGVuLlxuIik7Ci0JfQotCi0JdG1wID0gcmRldi0+bWMudnJhbV9sb2NhdGlvbiArIHJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSAtIDE7Ci0JdG1wID0gUkVHX1NFVChSQURFT05fTUNfRkJfVE9QLCB0bXAgPj4gMTYpOwotCXRtcCB8PSBSRUdfU0VUKFJBREVPTl9NQ19GQl9TVEFSVCwgcmRldi0+bWMudnJhbV9sb2NhdGlvbiA+PiAxNik7Ci0JV1JFRzMyKFJBREVPTl9NQ19GQl9MT0NBVElPTiwgdG1wKTsKLQl0bXAgPSBSUkVHMzIoUkFERU9OX0hPU1RfUEFUSF9DTlRMKSB8IFJBREVPTl9IUF9MSU5fUkRfQ0FDSEVfRElTOwotCVdSRUczMihSQURFT05fSE9TVF9QQVRIX0NOVEwsIHRtcCB8IFJBREVPTl9IRFBfU09GVF9SRVNFVCB8IFJBREVPTl9IRFBfUkVBRF9CVUZGRVJfSU5WQUxJREFURSk7Ci0JKHZvaWQpUlJFRzMyKFJBREVPTl9IT1NUX1BBVEhfQ05UTCk7Ci0JV1JFRzMyKFJBREVPTl9IT1NUX1BBVEhfQ05UTCwgdG1wKTsKLQkodm9pZClSUkVHMzIoUkFERU9OX0hPU1RfUEFUSF9DTlRMKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHJzNDAwX21jX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCi17Ci19Ci0KLQotLyoKLSAqIEdsb2JhbCBHUFUgZnVuY3Rpb25zCi0gKi8KLXZvaWQgcnM0MDBfZXJyYXRhKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCXJkZXYtPnBsbF9lcnJhdGEgPSAwOwotfQotCiB2b2lkIHJzNDAwX2dwdV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCS8qIEZJWE1FOiBIRFAgc2FtZSBwbGFjZSBvbiByczQwMCA/ICovCkBAIC0zMDUsMTAgKzIzNSw2IEBACiAJfQogfQogCi0KLS8qCi0gKiBWUkFNIGluZm8uCi0gKi8KIHZvaWQgcnM0MDBfdnJhbV9pbmZvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXJzNDAwX2dhcnRfYWRqdXN0X3NpemUocmRldik7CkBAIC0zMTksMTAgKzI0NSw2IEBACiAJcjEwMF92cmFtX2luaXRfc2l6ZXMocmRldik7CiB9CiAKLQotLyoKLSAqIEluZGlyZWN0IHJlZ2lzdGVycyBhY2Nlc3NvcgotICovCiB1aW50MzJfdCByczQwMF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpCiB7CiAJdWludDMyX3QgcjsKQEAgLTM0MCwxMCArMjYyLDYgQEAKIAlXUkVHMzIoUlM0ODBfTkJfTUNfSU5ERVgsIDB4ZmYpOwogfQogCi0KLS8qCi0gKiBEZWJ1Z2ZzIGluZm8KLSAqLwogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQogc3RhdGljIGludCByczQwMF9kZWJ1Z2ZzX2dhcnRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7CkBAIC00MTksNyArMzM3LDcgQEAKIH07CiAjZW5kaWYKIAotaW50IHJzNDAwX2RlYnVnZnNfcGNpZV9nYXJ0X2luZm9faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyBpbnQgcnM0MDBfZGVidWdmc19wY2llX2dhcnRfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQogCXJldHVybiByYWRlb25fZGVidWdmc19hZGRfZmlsZXMocmRldiwgcnM0MDBfZ2FydF9pbmZvX2xpc3QsIDEpOwpAQCAtNDI3LDMgKzM0NSwxODggQEAKIAlyZXR1cm4gMDsKICNlbmRpZgogfQorCitzdGF0aWMgaW50IHJzNDAwX21jX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHI7CisJdTMyIHRtcDsKKworCS8qIFNldHVwIEdQVSBtZW1vcnkgc3BhY2UgKi8KKwl0bXAgPSBHXzAwMDE1Q19NQ19GQl9TVEFSVChSUkVHMzIoUl8wMDAxNUNfTkJfVE9NKSk7CisJcmRldi0+bWMudnJhbV9sb2NhdGlvbiA9IEdfMDAwMTVDX01DX0ZCX1NUQVJUKHRtcCkgPDwgMTY7CisJcmRldi0+bWMuZ3R0X2xvY2F0aW9uID0gMHhGRkZGRkZGRlVMOworCXIgPSByYWRlb25fbWNfc2V0dXAocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXJldHVybiAwOworfQorCit2b2lkIHJzNDAwX21jX3Byb2dyYW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IHIxMDBfbWNfc2F2ZSBzYXZlOworCisJLyogU3RvcHMgYWxsIG1jIGNsaWVudHMgKi8KKwlyMTAwX21jX3N0b3AocmRldiwgJnNhdmUpOworCisJLyogV2FpdCBmb3IgbWMgaWRsZSAqLworCWlmIChyMzAwX21jX3dhaXRfZm9yX2lkbGUocmRldikpCisJCWRldl93YXJuKHJkZXYtPmRldiwgIldhaXQgTUMgaWRsZSB0aW1lb3V0IGJlZm9yZSB1cGRhdGluZyBNQy5cbiIpOworCVdSRUczMihSXzAwMDE0OF9NQ19GQl9MT0NBVElPTiwKKwkJU18wMDAxNDhfTUNfRkJfU1RBUlQocmRldi0+bWMudnJhbV9zdGFydCA+PiAxNikgfAorCQlTXzAwMDE0OF9NQ19GQl9UT1AocmRldi0+bWMudnJhbV9lbmQgPj4gMTYpKTsKKworCXIxMDBfbWNfcmVzdW1lKHJkZXYsICZzYXZlKTsKK30KKworc3RhdGljIGludCByczQwMF9zdGFydHVwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCisJcnM0MDBfbWNfcHJvZ3JhbShyZGV2KTsKKwkvKiBSZXN1bWUgY2xvY2sgKi8KKwlyMzAwX2Nsb2NrX3N0YXJ0dXAocmRldik7CisJLyogSW5pdGlhbGl6ZSBHUFUgY29uZmlndXJhdGlvbiAoIyBwaXBlcywgLi4uKSAqLworCXJzNDAwX2dwdV9pbml0KHJkZXYpOworCS8qIEluaXRpYWxpemUgR0FSVCAoaW5pdGlhbGl6ZSBhZnRlciBUVE0gc28gd2UgY2FuIGFsbG9jYXRlCisJICogbWVtb3J5IHRocm91Z2ggVFRNIGJ1dCBmaW5hbGl6ZSBhZnRlciBUVE0pICovCisJciA9IHJzNDAwX2dhcnRfZW5hYmxlKHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwkvKiBFbmFibGUgSVJRICovCisJcmRldi0+aXJxLnN3X2ludCA9IHRydWU7CisJcjEwMF9pcnFfc2V0KHJkZXYpOworCS8qIDFNIHJpbmcgYnVmZmVyICovCisJciA9IHIxMDBfY3BfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJmYWlsbGVkIGluaXRpYWxpemluZyBDUCAoJWQpLlxuIiwgcik7CisJCXJldHVybiByOworCX0KKwlyID0gcjEwMF93Yl9pbml0KHJkZXYpOworCWlmIChyKQorCQlkZXZfZXJyKHJkZXYtPmRldiwgImZhaWxsZWQgaW5pdGlhbGl6aW5nIFdCICglZCkuXG4iLCByKTsKKwlyID0gcjEwMF9pYl9pbml0KHJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgSUIgKCVkKS5cbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByczQwMF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJLyogTWFrZSBzdXIgR0FSVCBhcmUgbm90IHdvcmtpbmcgKi8KKwlyczQwMF9nYXJ0X2Rpc2FibGUocmRldik7CisJLyogUmVzdW1lIGNsb2NrIGJlZm9yZSBkb2luZyByZXNldCAqLworCXIzMDBfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBSZXNldCBncHUgYmVmb3JlIHBvc3Rpbmcgb3RoZXJ3aXNlIEFUT00gd2lsbCBlbnRlciBpbmZpbml0ZSBsb29wICovCisJaWYgKHJhZGVvbl9ncHVfcmVzZXQocmRldikpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiR1BVIHJlc2V0IGZhaWxlZCAhICgweEU0MD0weCUwOFgsIDB4N0MwPTB4JTA4WClcbiIsCisJCQlSUkVHMzIoUl8wMDBFNDBfUkJCTV9TVEFUVVMpLAorCQkJUlJFRzMyKFJfMDAwN0MwX0NQX1NUQVQpKTsKKwl9CisJLyogcG9zdCAqLworCXJhZGVvbl9jb21iaW9zX2FzaWNfaW5pdChyZGV2LT5kZGV2KTsKKwkvKiBSZXN1bWUgY2xvY2sgYWZ0ZXIgcG9zdGluZyAqLworCXIzMDBfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwlyZXR1cm4gcnM0MDBfc3RhcnR1cChyZGV2KTsKK30KKworaW50IHJzNDAwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcjEwMF9jcF9kaXNhYmxlKHJkZXYpOworCXIxMDBfd2JfZGlzYWJsZShyZGV2KTsKKwlyMTAwX2lycV9kaXNhYmxlKHJkZXYpOworCXJzNDAwX2dhcnRfZGlzYWJsZShyZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByczQwMF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXJzNDAwX3N1c3BlbmQocmRldik7CisJcjEwMF9jcF9maW5pKHJkZXYpOworCXIxMDBfd2JfZmluaShyZGV2KTsKKwlyMTAwX2liX2ZpbmkocmRldik7CisJcmFkZW9uX2dlbV9maW5pKHJkZXYpOworCXJzNDAwX2dhcnRfZmluaShyZGV2KTsKKwlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOworCXJhZGVvbl9mZW5jZV9kcml2ZXJfZmluaShyZGV2KTsKKwlyYWRlb25fb2JqZWN0X2ZpbmkocmRldik7CisJcmFkZW9uX2F0b21iaW9zX2ZpbmkocmRldik7CisJa2ZyZWUocmRldi0+Ymlvcyk7CisJcmRldi0+YmlvcyA9IE5VTEw7Cit9CisKK2ludCByczQwMF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCisJLyogRGlzYWJsZSBWR0EgKi8KKwlyMTAwX3ZnYV9yZW5kZXJfZGlzYWJsZShyZGV2KTsKKwkvKiBJbml0aWFsaXplIHNjcmF0Y2ggcmVnaXN0ZXJzICovCisJcmFkZW9uX3NjcmF0Y2hfaW5pdChyZGV2KTsKKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKKwkvKiBUT0RPOiBkaXNhYmxlIFZHQSBuZWVkIHRvIHVzZSBWR0EgcmVxdWVzdCAqLworCS8qIEJJT1MqLworCWlmICghcmFkZW9uX2dldF9iaW9zKHJkZXYpKSB7CisJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJFeHBlY3RpbmcgY29tYmlvcyBmb3IgUlM0MDAvUlM0ODAgR1BVXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJciA9IHJhZGVvbl9jb21iaW9zX2luaXQocmRldik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCS8qIFJlc2V0IGdwdSBiZWZvcmUgcG9zdGluZyBvdGhlcndpc2UgQVRPTSB3aWxsIGVudGVyIGluZmluaXRlIGxvb3AgKi8KKwlpZiAocmFkZW9uX2dwdV9yZXNldChyZGV2KSkgeworCQlkZXZfd2FybihyZGV2LT5kZXYsCisJCQkiR1BVIHJlc2V0IGZhaWxlZCAhICgweEU0MD0weCUwOFgsIDB4N0MwPTB4JTA4WClcbiIsCisJCQlSUkVHMzIoUl8wMDBFNDBfUkJCTV9TVEFUVVMpLAorCQkJUlJFRzMyKFJfMDAwN0MwX0NQX1NUQVQpKTsKKwl9CisJLyogY2hlY2sgaWYgY2FyZHMgYXJlIHBvc3RlZCBvciBub3QgKi8KKwlpZiAoIXJhZGVvbl9jYXJkX3Bvc3RlZChyZGV2KSAmJiByZGV2LT5iaW9zKSB7CisJCURSTV9JTkZPKCJHUFUgbm90IHBvc3RlZC4gcG9zdGluZyBub3cuLi5cbiIpOworCQlyYWRlb25fY29tYmlvc19hc2ljX2luaXQocmRldi0+ZGRldik7CisJfQorCS8qIEluaXRpYWxpemUgY2xvY2tzICovCisJcmFkZW9uX2dldF9jbG9ja19pbmZvKHJkZXYtPmRkZXYpOworCS8qIEdldCB2cmFtIGluZm9ybWF0aW9ucyAqLworCXJzNDAwX3ZyYW1faW5mbyhyZGV2KTsKKwkvKiBJbml0aWFsaXplIG1lbW9yeSBjb250cm9sbGVyIChhbHNvIHRlc3QgQUdQKSAqLworCXIgPSByczQwMF9tY19pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwkvKiBGZW5jZSBkcml2ZXIgKi8KKwlyID0gcmFkZW9uX2ZlbmNlX2RyaXZlcl9pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlyID0gcmFkZW9uX2lycV9rbXNfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJLyogTWVtb3J5IG1hbmFnZXIgKi8KKwlyID0gcmFkZW9uX29iamVjdF9pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlyID0gcnM0MDBfZ2FydF9pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlyMzAwX3NldF9yZWdfc2FmZShyZGV2KTsKKwlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKKwlyID0gcnM0MDBfc3RhcnR1cChyZGV2KTsKKwlpZiAocikgeworCQkvKiBTb21ldGhpbmdzIHdhbnQgd3JvbnQgd2l0aCB0aGUgYWNjZWwgaW5pdCBzdG9wIGFjY2VsICovCisJCWRldl9lcnIocmRldi0+ZGV2LCAiRGlzYWJsaW5nIEdQVSBhY2NlbGVyYXRpb25cbiIpOworCQlyczQwMF9zdXNwZW5kKHJkZXYpOworCQlyMTAwX2NwX2ZpbmkocmRldik7CisJCXIxMDBfd2JfZmluaShyZGV2KTsKKwkJcjEwMF9pYl9maW5pKHJkZXYpOworCQlyczQwMF9nYXJ0X2ZpbmkocmRldik7CisJCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CisJCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDhiYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMGQuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IDIwMDkgSmVyb21lIEdsaXNzZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBEYXZlIEFpcmxpZQorICogICAgICAgICAgQWxleCBEZXVjaGVyCisgKiAgICAgICAgICBKZXJvbWUgR2xpc3NlCisgKi8KKyNpZm5kZWYgX19SUzQwMERfSF9fCisjZGVmaW5lIF9fUlM0MDBEX0hfXworCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl8wMDAxNDhfTUNfRkJfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAxNDgKKyNkZWZpbmUgICBTXzAwMDE0OF9NQ19GQl9TVEFSVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDE0OF9NQ19GQl9TVEFSVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDE0OF9NQ19GQl9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisjZGVmaW5lICAgU18wMDAxNDhfTUNfRkJfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDE2KQorI2RlZmluZSAgIEdfMDAwMTQ4X01DX0ZCX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDE0OF9NQ19GQl9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIFJfMDAwMTVDX05CX1RPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTVDCisjZGVmaW5lICAgU18wMDAxNUNfTUNfRkJfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAxNUNfTUNfRkJfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkYpCisjZGVmaW5lICAgQ18wMDAxNUNfTUNfRkJfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSAgIFNfMDAwMTVDX01DX0ZCX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwMDE1Q19NQ19GQl9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweEZGRkYpCisjZGVmaW5lICAgQ18wMDAxNUNfTUNfRkJfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBSXzAwMDdDMF9DUF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDdDMAorI2RlZmluZSAgIFNfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX01SVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMSkKKyNkZWZpbmUgICBHXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9NV1VfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZECisjZGVmaW5lICAgU18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIpCisjZGVmaW5lICAgR18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfUlNJVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGQgorI2RlZmluZSAgIFNfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzKQorI2RlZmluZSAgIEdfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX1JDSVVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjcKKyNkZWZpbmUgICBTXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOSkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSA+PiA5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGREZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZGQkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX1BSSU1BUllfQlVTWSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDExKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9QUklNQVJZX0JVU1koeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDExKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGN0ZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NJX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEzKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTSV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0lfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZERkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE0KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDE0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1QyX0JVU1kgICAgICAgICAgICAgICAgICAweEZGRkZCRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE1KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDE1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1QyX0JVU1kgICAgICAgICAgICAgICAgICAweEZGRkY3RkZGCisjZGVmaW5lICAgU18wMDA3QzBfR1VJRE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQorI2RlZmluZSAgIEdfMDAwN0MwX0dVSURNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9HVUlETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweEVGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfVklERE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI5KQorI2RlZmluZSAgIEdfMDAwN0MwX1ZJRERNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9WSURETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NNRFNUUk1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DTURTVFJNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1BfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQorI2RlZmluZSAgIEdfMDAwN0MwX0NQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCisjZGVmaW5lIFJfMDAwRTQwX1JCQk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTQwCisjZGVmaW5lICAgU18wMDBFNDBfQ01ERklGT19BVkFJTCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDdGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwRTQwX0NNREZJRk9fQVZBSUwoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHg3RikKKyNkZWZpbmUgICBDXzAwMEU0MF9DTURGSUZPX0FWQUlMICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRjgwCisjZGVmaW5lICAgU18wMDBFNDBfSElSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDgpCisjZGVmaW5lICAgR18wMDBFNDBfSElSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfSElSUV9PTl9SQkIgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkVGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NQUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA5KQorI2RlZmluZSAgIEdfMDAwRTQwX0NQUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZERkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRlJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTApCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZCRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9ISVJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTEpCisjZGVmaW5lICAgR18wMDBFNDBfSElSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0hJUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkY3RkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUFJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTIpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkVGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRlJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTMpCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkRGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRl9QSVBFX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZfUElQRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGX1BJUEVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9FTkdfRVZfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTUpCisjZGVmaW5lICAgR18wMDBFNDBfRU5HX0VWX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0VOR19FVl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjdGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUF9DTURTVFJNX0JVU1koeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQX0NNRFNUUk1fQlVTWSAgICAgICAgICAgICAgICAgICAgIDB4RkZGRUZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9FMl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTcpCisjZGVmaW5lICAgR18wMDBFNDBfRTJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0UyX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGREZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQjJEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTgpCisjZGVmaW5lICAgR18wMDBFNDBfUkIyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCMkRfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGQkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQjNEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTkpCisjZGVmaW5lICAgR18wMDBFNDBfUkIzRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCM0RfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGN0ZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9WQVBfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDBFNDBfVkFQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1ZBUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDBFNDBfUkVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9UQU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjIpCisjZGVmaW5lICAgR18wMDBFNDBfVEFNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RBTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZCRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9URE1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjMpCisjZGVmaW5lICAgR18wMDBFNDBfVERNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RETV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkY3RkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9QQl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDBFNDBfUEJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1BCX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9USU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDBFNDBfVElNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RJTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9HQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjYpCisjZGVmaW5lICAgR18wMDBFNDBfR0FfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0dBX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkJGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DQkEyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjcpCisjZGVmaW5lICAgR18wMDBFNDBfQ0JBMkRfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NCQTJEX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjdGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9HVUlfQUNUSVZFKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lICAgR18wMDBFNDBfR1VJX0FDVElWRSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0dVSV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKaW5kZXggMGU3OTFlMjYuLjEwZGZhNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKQEAgLTI1LDI4ICsyNSwyNSBAQAogICogICAgICAgICAgQWxleCBEZXVjaGVyCiAgKiAgICAgICAgICBKZXJvbWUgR2xpc3NlCiAgKi8KKy8qIFJTNjAwIC8gUmFkZW9uIFgxMjUwL1gxMjcwIGludGVncmF0ZWQgR1BVCisgKgorICogVGhpcyBmaWxlIGdhdGhlciBmdW5jdGlvbiBzcGVjaWZpYyB0byBSUzYwMCB3aGljaCBpcyB0aGUgSUdQIG9mCisgKiB0aGUgWDEyNTAvWDEyNzAgZmFtaWx5IHN1cHBvcnRpbmcgaW50ZWwgQ1BVICh3aGlsZSBSUzY5MC9SUzc0MAorICogaXMgdGhlIFgxMjUwL1gxMjcwIHN1cHBvcnRpbmcgQU1EIENQVSkuIFRoZSBkaXNwbGF5IGVuZ2luZSBhcmUKKyAqIHRoZSBhdml2byBvbmUsIGJpb3MgaXMgYW4gYXRvbWJpb3MsIDNEIGJsb2NrIGFyZSB0aGUgb25lIG9mIHRoZQorICogUjRYWCBmYW1pbHkuIFRoZSBHQVJUIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBSUzQwMCBvbmUgYW5kIGlzIHZlcnkKKyAqIGNsb3NlIHRvIHRoZSBvbmUgb2YgdGhlIFI2MDAgZmFtaWx5IChSNjAwIGxpa2VseSBiZWluZyBhbiBldm9sdXRpb24KKyAqIG9mIHRoZSBSUzYwMCBHQVJUIGJsb2NrKS4KKyAqLwogI2luY2x1ZGUgImRybVAuaCIKLSNpbmNsdWRlICJyYWRlb25fcmVnLmgiCiAjaW5jbHVkZSAicmFkZW9uLmgiCi0jaW5jbHVkZSAiYXZpdm9kLmgiCisjaW5jbHVkZSAiYXRvbS5oIgorI2luY2x1ZGUgInJzNjAwZC5oIgogCiAjaW5jbHVkZSAicnM2MDBfcmVnX3NhZmUuaCIKIAotLyogcnM2MDAgZGVwZW5kcyBvbiA6ICovCi12b2lkIHIxMDBfaGRwX3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMTAwX2d1aV93YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMzAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByNDIwX3BpcGVzX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotCi0vKiBUaGlzIGZpbGVzIGdhdGhlciBmdW5jdGlvbnMgc3BlY2lmaWNzIHRvIDoKLSAqIHJzNjAwCi0gKgotICogU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgbWlnaHQgYmUgdXNlZCBieSBuZXdlciBBU0lDcy4KLSAqLwogdm9pZCByczYwMF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnM2MDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHJzNjAwX2Rpc2FibGVfdmdhKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQogCiAvKgogICogR0FSVC4KQEAgLTU1LDE4ICs1MiwxOCBAQAogewogCXVpbnQzMl90IHRtcDsKIAotCXRtcCA9IFJSRUczMl9NQyhSUzYwMF9NQ19QVDBfQ05UTCk7Ci0JdG1wICY9IH4oUlM2MDBfSU5WQUxJREFURV9BTExfTDFfVExCUyB8IFJTNjAwX0lOVkFMSURBVEVfTDJfQ0FDSEUpOwotCVdSRUczMl9NQyhSUzYwMF9NQ19QVDBfQ05UTCwgdG1wKTsKKwl0bXAgPSBSUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwpOworCXRtcCAmPSBDXzAwMDEwMF9JTlZBTElEQVRFX0FMTF9MMV9UTEJTICYgQ18wMDAxMDBfSU5WQUxJREFURV9MMl9DQUNIRTsKKwlXUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwsIHRtcCk7CiAKLQl0bXAgPSBSUkVHMzJfTUMoUlM2MDBfTUNfUFQwX0NOVEwpOwotCXRtcCB8PSBSUzYwMF9JTlZBTElEQVRFX0FMTF9MMV9UTEJTIHwgUlM2MDBfSU5WQUxJREFURV9MMl9DQUNIRTsKLQlXUkVHMzJfTUMoUlM2MDBfTUNfUFQwX0NOVEwsIHRtcCk7CisJdG1wID0gUlJFRzMyX01DKFJfMDAwMTAwX01DX1BUMF9DTlRMKTsKKwl0bXAgfD0gU18wMDAxMDBfSU5WQUxJREFURV9BTExfTDFfVExCUygxKSAmIFNfMDAwMTAwX0lOVkFMSURBVEVfTDJfQ0FDSEUoMSk7CisJV1JFRzMyX01DKFJfMDAwMTAwX01DX1BUMF9DTlRMLCB0bXApOwogCi0JdG1wID0gUlJFRzMyX01DKFJTNjAwX01DX1BUMF9DTlRMKTsKLQl0bXAgJj0gfihSUzYwMF9JTlZBTElEQVRFX0FMTF9MMV9UTEJTIHwgUlM2MDBfSU5WQUxJREFURV9MMl9DQUNIRSk7Ci0JV1JFRzMyX01DKFJTNjAwX01DX1BUMF9DTlRMLCB0bXApOwotCXRtcCA9IFJSRUczMl9NQyhSUzYwMF9NQ19QVDBfQ05UTCk7CisJdG1wID0gUlJFRzMyX01DKFJfMDAwMTAwX01DX1BUMF9DTlRMKTsKKwl0bXAgJj0gQ18wMDAxMDBfSU5WQUxJREFURV9BTExfTDFfVExCUyAmIENfMDAwMTAwX0lOVkFMSURBVEVfTDJfQ0FDSEU7CisJV1JFRzMyX01DKFJfMDAwMTAwX01DX1BUMF9DTlRMLCB0bXApOworCXRtcCA9IFJSRUczMl9NQyhSXzAwMDEwMF9NQ19QVDBfQ05UTCk7CiB9CiAKIGludCByczYwMF9nYXJ0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC04OCw3ICs4NSw3IEBACiAKIGludCByczYwMF9nYXJ0X2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQl1aW50MzJfdCB0bXA7CisJdTMyIHRtcDsKIAlpbnQgciwgaTsKIAogCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiA9PSBOVUxMKSB7CkBAIC05OCw0NiArOTUsNTAgQEAKIAlyID0gcmFkZW9uX2dhcnRfdGFibGVfdnJhbV9waW4ocmRldik7CiAJaWYgKHIpCiAJCXJldHVybiByOworCS8qIEVuYWJsZSBidXMgbWFzdGVyICovCisJdG1wID0gUlJFRzMyKFJfMDAwMDRDX0JVU19DTlRMKSAmIENfMDAwMDRDX0JVU19NQVNURVJfRElTOworCVdSRUczMihSXzAwMDA0Q19CVVNfQ05UTCwgdG1wKTsKIAkvKiBGSVhNRTogc2V0dXAgZGVmYXVsdCBwYWdlICovCi0JV1JFRzMyX01DKFJTNjAwX01DX1BUMF9DTlRMLAotCQkgKFJTNjAwX0VGRkVDVElWRV9MMl9DQUNIRV9TSVpFKDYpIHwKLQkJICBSUzYwMF9FRkZFQ1RJVkVfTDJfUVVFVUVfU0laRSg2KSkpOworCVdSRUczMl9NQyhSXzAwMDEwMF9NQ19QVDBfQ05UTCwKKwkJIChTXzAwMDEwMF9FRkZFQ1RJVkVfTDJfQ0FDSEVfU0laRSg2KSB8CisJCSAgU18wMDAxMDBfRUZGRUNUSVZFX0wyX1FVRVVFX1NJWkUoNikpKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTk7IGkrKykgewotCQlXUkVHMzJfTUMoUlM2MDBfTUNfUFQwX0NMSUVOVDBfQ05UTCArIGksCi0JCQkgKFJTNjAwX0VOQUJMRV9UUkFOU0xBVElPTl9NT0RFX09WRVJSSURFIHwKLQkJCSAgUlM2MDBfU1lTVEVNX0FDQ0VTU19NT0RFX0lOX1NZUyB8Ci0JCQkgIFJTNjAwX1NZU1RFTV9BUEVSVFVSRV9VTk1BUFBFRF9BQ0NFU1NfREVGQVVMVF9QQUdFIHwKLQkJCSAgUlM2MDBfRUZGRUNUSVZFX0wxX0NBQ0hFX1NJWkUoMykgfAotCQkJICBSUzYwMF9FTkFCTEVfRlJBR01FTlRfUFJPQ0VTU0lORyB8Ci0JCQkgIFJTNjAwX0VGRkVDVElWRV9MMV9RVUVVRV9TSVpFKDMpKSk7CisJCVdSRUczMl9NQyhSXzAwMDE2Q19NQ19QVDBfQ0xJRU5UMF9DTlRMICsgaSwKKwkJCVNfMDAwMTZDX0VOQUJMRV9UUkFOU0xBVElPTl9NT0RFX09WRVJSSURFKDEpIHwKKwkJCVNfMDAwMTZDX1NZU1RFTV9BQ0NFU1NfTU9ERV9NQVNLKAorCQkJCVZfMDAwMTZDX1NZU1RFTV9BQ0NFU1NfTU9ERV9JTl9TWVMpIHwKKwkJCVNfMDAwMTZDX1NZU1RFTV9BUEVSVFVSRV9VTk1BUFBFRF9BQ0NFU1MoCisJCQkJVl8wMDAxNkNfU1lTVEVNX0FQRVJUVVJFX1VOTUFQUEVEX0RFRkFVTFRfUEFHRSkgfAorCQkJU18wMDAxNkNfRUZGRUNUSVZFX0wxX0NBQ0hFX1NJWkUoMSkgfAorCQkJU18wMDAxNkNfRU5BQkxFX0ZSQUdNRU5UX1BST0NFU1NJTkcoMSkgfAorCQkJU18wMDAxNkNfRUZGRUNUSVZFX0wxX1FVRVVFX1NJWkUoMSkpOwogCX0KIAogCS8qIFN5c3RlbSBjb250ZXh0IG1hcCB0byBHQVJUIHNwYWNlICovCi0JV1JFRzMyX01DKFJTNjAwX01DX1BUMF9TWVNURU1fQVBFUlRVUkVfTE9XX0FERFIsIHJkZXYtPm1jLmd0dF9sb2NhdGlvbik7Ci0JdG1wID0gcmRldi0+bWMuZ3R0X2xvY2F0aW9uICsgcmRldi0+bWMuZ3R0X3NpemUgLSAxOwotCVdSRUczMl9NQyhSUzYwMF9NQ19QVDBfU1lTVEVNX0FQRVJUVVJFX0hJR0hfQUREUiwgdG1wKTsKKwlXUkVHMzJfTUMoUl8wMDAxMTJfTUNfUFQwX1NZU1RFTV9BUEVSVFVSRV9MT1dfQUREUiwgcmRldi0+bWMuZ3R0X3N0YXJ0KTsKKwlXUkVHMzJfTUMoUl8wMDAxMTRfTUNfUFQwX1NZU1RFTV9BUEVSVFVSRV9ISUdIX0FERFIsIHJkZXYtPm1jLmd0dF9lbmQpOwogCiAJLyogZW5hYmxlIGZpcnN0IGNvbnRleHQgKi8KLQlXUkVHMzJfTUMoUlM2MDBfTUNfUFQwX0NPTlRFWFQwX0ZMQVRfU1RBUlRfQUREUiwgcmRldi0+bWMuZ3R0X2xvY2F0aW9uKTsKLQl0bXAgPSByZGV2LT5tYy5ndHRfbG9jYXRpb24gKyByZGV2LT5tYy5ndHRfc2l6ZSAtIDE7Ci0JV1JFRzMyX01DKFJTNjAwX01DX1BUMF9DT05URVhUMF9GTEFUX0VORF9BRERSLCB0bXApOwotCVdSRUczMl9NQyhSUzYwMF9NQ19QVDBfQ09OVEVYVDBfQ05UTCwKLQkJIChSUzYwMF9FTkFCTEVfUEFHRV9UQUJMRSB8IFJTNjAwX1BBR0VfVEFCTEVfVFlQRV9GTEFUKSk7CisJV1JFRzMyX01DKFJfMDAwMTNDX01DX1BUMF9DT05URVhUMF9GTEFUX1NUQVJUX0FERFIsIHJkZXYtPm1jLmd0dF9zdGFydCk7CisJV1JFRzMyX01DKFJfMDAwMTRDX01DX1BUMF9DT05URVhUMF9GTEFUX0VORF9BRERSLCByZGV2LT5tYy5ndHRfZW5kKTsKKwlXUkVHMzJfTUMoUl8wMDAxMDJfTUNfUFQwX0NPTlRFWFQwX0NOVEwsCisJCQlTXzAwMDEwMl9FTkFCTEVfUEFHRV9UQUJMRSgxKSB8CisJCQlTXzAwMDEwMl9QQUdFX1RBQkxFX0RFUFRIKFZfMDAwMTAyX1BBR0VfVEFCTEVfRkxBVCkpOwogCS8qIGRpc2FibGUgYWxsIG90aGVyIGNvbnRleHRzICovCiAJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgewotCQlXUkVHMzJfTUMoUlM2MDBfTUNfUFQwX0NPTlRFWFQwX0NOVEwgKyBpLCAwKTsKKwkJV1JFRzMyX01DKFJfMDAwMTAyX01DX1BUMF9DT05URVhUMF9DTlRMICsgaSwgMCk7CiAJfQogCiAJLyogc2V0dXAgdGhlIHBhZ2UgdGFibGUgKi8KLQlXUkVHMzJfTUMoUlM2MDBfTUNfUFQwX0NPTlRFWFQwX0ZMQVRfQkFTRV9BRERSLAotCQkgcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKLQlXUkVHMzJfTUMoUlM2MDBfTUNfUFQwX0NPTlRFWFQwX0RFRkFVTFRfUkVBRF9BRERSLCAwKTsKKwlXUkVHMzJfTUMoUl8wMDAxMkNfTUNfUFQwX0NPTlRFWFQwX0ZMQVRfQkFTRV9BRERSLAorCQkJcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKKwlXUkVHMzJfTUMoUl8wMDAxMUNfTUNfUFQwX0NPTlRFWFQwX0RFRkFVTFRfUkVBRF9BRERSLCAwKTsKIAogCS8qIGVuYWJsZSBwYWdlIHRhYmxlcyAqLwotCXRtcCA9IFJSRUczMl9NQyhSUzYwMF9NQ19QVDBfQ05UTCk7Ci0JV1JFRzMyX01DKFJTNjAwX01DX1BUMF9DTlRMLCAodG1wIHwgUlM2MDBfRU5BQkxFX1BUKSk7Ci0JdG1wID0gUlJFRzMyX01DKFJTNjAwX01DX0NOVEwxKTsKLQlXUkVHMzJfTUMoUlM2MDBfTUNfQ05UTDEsICh0bXAgfCBSUzYwMF9FTkFCTEVfUEFHRV9UQUJMRVMpKTsKKwl0bXAgPSBSUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwpOworCVdSRUczMl9NQyhSXzAwMDEwMF9NQ19QVDBfQ05UTCwgKHRtcCB8IFNfMDAwMTAwX0VOQUJMRV9QVCgxKSkpOworCXRtcCA9IFJSRUczMl9NQyhSXzAwMDAwOV9NQ19DTlRMMSk7CisJV1JFRzMyX01DKFJfMDAwMDA5X01DX0NOVEwxLCAodG1wIHwgU18wMDAwMDlfRU5BQkxFX1BBR0VfVEFCTEVTKDEpKSk7CiAJcnM2MDBfZ2FydF90bGJfZmx1c2gocmRldik7CiAJcmRldi0+Z2FydC5yZWFkeSA9IHRydWU7CiAJcmV0dXJuIDA7CkBAIC0xNDgsMTAgKzE0OSw5IEBACiAJdWludDMyX3QgdG1wOwogCiAJLyogRklYTUU6IGRpc2FibGUgb3V0IG9mIGdhcnQgYWNjZXNzICovCi0JV1JFRzMyX01DKFJTNjAwX01DX1BUMF9DTlRMLCAwKTsKLQl0bXAgPSBSUkVHMzJfTUMoUlM2MDBfTUNfQ05UTDEpOwotCXRtcCAmPSB+UlM2MDBfRU5BQkxFX1BBR0VfVEFCTEVTOwotCVdSRUczMl9NQyhSUzYwMF9NQ19DTlRMMSwgdG1wKTsKKwlXUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwsIDApOworCXRtcCA9IFJSRUczMl9NQyhSXzAwMDAwOV9NQ19DTlRMMSk7CisJV1JFRzMyX01DKFJfMDAwMDA5X01DX0NOVEwxLCB0bXAgJiBDXzAwMDAwOV9FTkFCTEVfUEFHRV9UQUJMRVMpOwogCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaikgewogCQlyYWRlb25fb2JqZWN0X2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CiAJCXJhZGVvbl9vYmplY3RfdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwpAQCAtMTg1LDEyOSArMTg1LDYxIEBACiAJcmV0dXJuIDA7CiB9CiAKLQotLyoKLSAqIE1DLgotICovCi12b2lkIHJzNjAwX21jX2Rpc2FibGVfY2xpZW50cyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQl1bnNpZ25lZCB0bXA7Ci0KLQlpZiAocjEwMF9ndWlfd2FpdF9mb3JfaWRsZShyZGV2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gd2FpdCBHVUkgaWRsZSB3aGlsZSAiCi0JCSAgICAgICAicHJvZ3JhbW1pbmcgcGlwZXMuIEJhZCB0aGluZ3MgbWlnaHQgaGFwcGVuLlxuIik7Ci0JfQotCi0JcmFkZW9uX2F2aXZvX3ZnYV9yZW5kZXJfZGlzYWJsZShyZGV2KTsKLQotCXRtcCA9IFJSRUczMihBVklWT19EMVZHQV9DT05UUk9MKTsKLQlXUkVHMzIoQVZJVk9fRDFWR0FfQ09OVFJPTCwgdG1wICYgfkFWSVZPX0RWR0FfQ09OVFJPTF9NT0RFX0VOQUJMRSk7Ci0JdG1wID0gUlJFRzMyKEFWSVZPX0QyVkdBX0NPTlRST0wpOwotCVdSRUczMihBVklWT19EMlZHQV9DT05UUk9MLCB0bXAgJiB+QVZJVk9fRFZHQV9DT05UUk9MX01PREVfRU5BQkxFKTsKLQotCXRtcCA9IFJSRUczMihBVklWT19EMUNSVENfQ09OVFJPTCk7Ci0JV1JFRzMyKEFWSVZPX0QxQ1JUQ19DT05UUk9MLCB0bXAgJiB+QVZJVk9fQ1JUQ19FTik7Ci0JdG1wID0gUlJFRzMyKEFWSVZPX0QyQ1JUQ19DT05UUk9MKTsKLQlXUkVHMzIoQVZJVk9fRDJDUlRDX0NPTlRST0wsIHRtcCAmIH5BVklWT19DUlRDX0VOKTsKLQotCS8qIG1ha2Ugc3VyZSBhbGwgcHJldmlvdXMgd3JpdGUgZ290IHRocm91Z2ggKi8KLQl0bXAgPSBSUkVHMzIoQVZJVk9fRDJDUlRDX0NPTlRST0wpOwotCi0JbWRlbGF5KDEpOwotfQotCi1pbnQgcnM2MDBfbWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQl1aW50MzJfdCB0bXA7Ci0JaW50IHI7Ci0KLQlpZiAocjEwMF9kZWJ1Z2ZzX3JiYm1faW5pdChyZGV2KSkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBkZWJ1Z2ZzIGZpbGUgZm9yIFJCQk0gIVxuIik7Ci0JfQotCi0JcnM2MDBfZ3B1X2luaXQocmRldik7Ci0JcnM2MDBfZ2FydF9kaXNhYmxlKHJkZXYpOwotCi0JLyogU2V0dXAgR1BVIG1lbW9yeSBzcGFjZSAqLwotCXJkZXYtPm1jLnZyYW1fbG9jYXRpb24gPSAweEZGRkZGRkZGVUw7Ci0JcmRldi0+bWMuZ3R0X2xvY2F0aW9uID0gMHhGRkZGRkZGRlVMOwotCXIgPSByYWRlb25fbWNfc2V0dXAocmRldik7Ci0JaWYgKHIpIHsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyogUHJvZ3JhbSBHUFUgbWVtb3J5IHNwYWNlICovCi0JLyogRW5hYmxlIGJ1cyBtYXN0ZXIgKi8KLQl0bXAgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKSAmIH5SUzYwMF9CVVNfTUFTVEVSX0RJUzsKLQlXUkVHMzIoUkFERU9OX0JVU19DTlRMLCB0bXApOwotCS8qIEZJWE1FOiBXaGF0IGRvZXMgQUdQIG1lYW5zIGZvciBzdWNoIGNoaXBzZXQgPyAqLwotCVdSRUczMl9NQyhSUzYwMF9NQ19BR1BfTE9DQVRJT04sIDB4MEZGRkZGRkYpOwotCS8qIEZJWE1FOiBhcmUgdGhpcyBBR1AgcmVnIGluIGluZGlyZWN0IE1DIHJhbmdlID8gKi8KLQlXUkVHMzJfTUMoUlM2MDBfTUNfQUdQX0JBU0UsIDApOwotCVdSRUczMl9NQyhSUzYwMF9NQ19BR1BfQkFTRV8yLCAwKTsKLQlyczYwMF9tY19kaXNhYmxlX2NsaWVudHMocmRldik7Ci0JaWYgKHJzNjAwX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIHdhaXQgTUMgaWRsZSB3aGlsZSAiCi0JCSAgICAgICAicHJvZ3JhbW1pbmcgcGlwZXMuIEJhZCB0aGluZ3MgbWlnaHQgaGFwcGVuLlxuIik7Ci0JfQotCXRtcCA9IHJkZXYtPm1jLnZyYW1fbG9jYXRpb24gKyByZGV2LT5tYy5tY192cmFtX3NpemUgLSAxOwotCXRtcCA9IFJFR19TRVQoUlM2MDBfTUNfRkJfVE9QLCB0bXAgPj4gMTYpOwotCXRtcCB8PSBSRUdfU0VUKFJTNjAwX01DX0ZCX1NUQVJULCByZGV2LT5tYy52cmFtX2xvY2F0aW9uID4+IDE2KTsKLQlXUkVHMzJfTUMoUlM2MDBfTUNfRkJfTE9DQVRJT04sIHRtcCk7Ci0JV1JFRzMyKFJTNjkwX0hEUF9GQl9MT0NBVElPTiwgcmRldi0+bWMudnJhbV9sb2NhdGlvbiA+PiAxNik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcnM2MDBfbWNfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLX0KLQotCi0vKgotICogSW50ZXJydXB0cwotICovCiBpbnQgcnM2MDBfaXJxX3NldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1aW50MzJfdCB0bXAgPSAwOwogCXVpbnQzMl90IG1vZGVfaW50ID0gMDsKIAogCWlmIChyZGV2LT5pcnEuc3dfaW50KSB7Ci0JCXRtcCB8PSBSQURFT05fU1dfSU5UX0VOQUJMRTsKKwkJdG1wIHw9IFNfMDAwMDQwX1NXX0lOVF9FTigxKTsKIAl9CiAJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0pIHsKLQkJbW9kZV9pbnQgfD0gQVZJVk9fRDFNT0RFX0lOVF9NQVNLOworCQltb2RlX2ludCB8PSBTXzAwNjU0MF9EMU1PREVfVkJMQU5LX0lOVF9NQVNLKDEpOwogCX0KIAlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFsxXSkgewotCQltb2RlX2ludCB8PSBBVklWT19EMk1PREVfSU5UX01BU0s7CisJCW1vZGVfaW50IHw9IFNfMDA2NTQwX0QyTU9ERV9WQkxBTktfSU5UX01BU0soMSk7CiAJfQotCVdSRUczMihSQURFT05fR0VOX0lOVF9DTlRMLCB0bXApOwotCVdSRUczMihBVklWT19EeE1PREVfSU5UX01BU0ssIG1vZGVfaW50KTsKKwlXUkVHMzIoUl8wMDAwNDBfR0VOX0lOVF9DTlRMLCB0bXApOworCVdSRUczMihSXzAwNjU0MF9EeE1PREVfSU5UX01BU0ssIG1vZGVfaW50KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB1aW50MzJfdCByczYwMF9pcnFfYWNrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgKnI1MDBfZGlzcF9pbnQpCiB7Ci0JdWludDMyX3QgaXJxcyA9IFJSRUczMihSQURFT05fR0VOX0lOVF9TVEFUVVMpOwotCXVpbnQzMl90IGlycV9tYXNrID0gUkFERU9OX1NXX0lOVF9URVNUOworCXVpbnQzMl90IGlycXMgPSBSUkVHMzIoUl8wMDAwNDRfR0VOX0lOVF9TVEFUVVMpOworCXVpbnQzMl90IGlycV9tYXNrID0gfkNfMDAwMDQ0X1NXX0lOVDsKIAotCWlmIChpcnFzICYgQVZJVk9fRElTUExBWV9JTlRfU1RBVFVTKSB7Ci0JCSpyNTAwX2Rpc3BfaW50ID0gUlJFRzMyKEFWSVZPX0RJU1BfSU5URVJSVVBUX1NUQVRVUyk7Ci0JCWlmICgqcjUwMF9kaXNwX2ludCAmIEFWSVZPX0QxX1ZCTEFOS19JTlRFUlJVUFQpIHsKLQkJCVdSRUczMihBVklWT19EMU1PREVfVkJMQU5LX1NUQVRVUywgQVZJVk9fVkJMQU5LX0FDSyk7CisJaWYgKEdfMDAwMDQ0X0RJU1BMQVlfSU5UX1NUQVQoaXJxcykpIHsKKwkJKnI1MDBfZGlzcF9pbnQgPSBSUkVHMzIoUl8wMDdFRENfRElTUF9JTlRFUlJVUFRfU1RBVFVTKTsKKwkJaWYgKEdfMDA3RURDX0xCX0QxX1ZCTEFOS19JTlRFUlJVUFQoKnI1MDBfZGlzcF9pbnQpKSB7CisJCQlXUkVHMzIoUl8wMDY1MzRfRDFNT0RFX1ZCTEFOS19TVEFUVVMsCisJCQkJU18wMDY1MzRfRDFNT0RFX1ZCTEFOS19BQ0soMSkpOwogCQl9Ci0JCWlmICgqcjUwMF9kaXNwX2ludCAmIEFWSVZPX0QyX1ZCTEFOS19JTlRFUlJVUFQpIHsKLQkJCVdSRUczMihBVklWT19EMk1PREVfVkJMQU5LX1NUQVRVUywgQVZJVk9fVkJMQU5LX0FDSyk7CisJCWlmIChHXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUKCpyNTAwX2Rpc3BfaW50KSkgeworCQkJV1JFRzMyKFJfMDA2RDM0X0QyTU9ERV9WQkxBTktfU1RBVFVTLAorCQkJCVNfMDA2RDM0X0QyTU9ERV9WQkxBTktfQUNLKDEpKTsKIAkJfQogCX0gZWxzZSB7CiAJCSpyNTAwX2Rpc3BfaW50ID0gMDsKIAl9CiAKIAlpZiAoaXJxcykgewotCQlXUkVHMzIoUkFERU9OX0dFTl9JTlRfU1RBVFVTLCBpcnFzKTsKKwkJV1JFRzMyKFJfMDAwMDQ0X0dFTl9JTlRfU1RBVFVTLCBpcnFzKTsKIAl9CiAJcmV0dXJuIGlycXMgJiBpcnFfbWFzazsKIH0KIAordm9pZCByczYwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgdG1wOworCisJV1JFRzMyKFJfMDAwMDQwX0dFTl9JTlRfQ05UTCwgMCk7CisJV1JFRzMyKFJfMDA2NTQwX0R4TU9ERV9JTlRfTUFTSywgMCk7CisJLyogV2FpdCBhbmQgYWNrbm93bGVkZ2UgaXJxICovCisJbWRlbGF5KDEpOworCXJzNjAwX2lycV9hY2socmRldiwgJnRtcCk7Cit9CisKIGludCByczYwMF9pcnFfcHJvY2VzcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1aW50MzJfdCBzdGF0dXM7CkBAIC0zMTksMTYgKzI1MSwxMyBAQAogCX0KIAl3aGlsZSAoc3RhdHVzIHx8IHI1MDBfZGlzcF9pbnQpIHsKIAkJLyogU1cgaW50ZXJydXB0ICovCi0JCWlmIChzdGF0dXMgJiBSQURFT05fU1dfSU5UX1RFU1QpIHsKKwkJaWYgKEdfMDAwMDQwX1NXX0lOVF9FTihzdGF0dXMpKQogCQkJcmFkZW9uX2ZlbmNlX3Byb2Nlc3MocmRldik7Ci0JCX0KIAkJLyogVmVydGljYWwgYmxhbmsgaW50ZXJydXB0cyAqLwotCQlpZiAocjUwMF9kaXNwX2ludCAmIEFWSVZPX0QxX1ZCTEFOS19JTlRFUlJVUFQpIHsKKwkJaWYgKEdfMDA3RURDX0xCX0QxX1ZCTEFOS19JTlRFUlJVUFQocjUwMF9kaXNwX2ludCkpCiAJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAwKTsKLQkJfQotCQlpZiAocjUwMF9kaXNwX2ludCAmIEFWSVZPX0QyX1ZCTEFOS19JTlRFUlJVUFQpIHsKKwkJaWYgKEdfMDA3RURDX0xCX0QyX1ZCTEFOS19JTlRFUlJVUFQocjUwMF9kaXNwX2ludCkpCiAJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAxKTsKLQkJfQogCQlzdGF0dXMgPSByczYwMF9pcnFfYWNrKHJkZXYsICZyNTAwX2Rpc3BfaW50KTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMzM3LDY3ICsyNjYsMzQgQEAKIHUzMiByczYwMF9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKQogewogCWlmIChjcnRjID09IDApCi0JCXJldHVybiBSUkVHMzIoQVZJVk9fRDFDUlRDX0ZSQU1FX0NPVU5UKTsKKwkJcmV0dXJuIFJSRUczMihSXzAwNjBBNF9EMUNSVENfU1RBVFVTX0ZSQU1FX0NPVU5UKTsKIAllbHNlCi0JCXJldHVybiBSUkVHMzIoQVZJVk9fRDJDUlRDX0ZSQU1FX0NPVU5UKTsKLX0KLQotCi0vKgotICogR2xvYmFsIEdQVSBmdW5jdGlvbnMKLSAqLwotdm9pZCByczYwMF9kaXNhYmxlX3ZnYShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQl1bnNpZ25lZCB0bXA7Ci0KLQlXUkVHMzIoMHgzMzAsIDApOwotCVdSRUczMigweDMzOCwgMCk7Ci0JdG1wID0gUlJFRzMyKDB4MzAwKTsKLQl0bXAgJj0gfigzIDw8IDE2KTsKLQlXUkVHMzIoMHgzMDAsIHRtcCk7Ci0JV1JFRzMyKDB4MzA4LCAoMSA8PCA4KSk7Ci0JV1JFRzMyKDB4MzEwLCByZGV2LT5tYy52cmFtX2xvY2F0aW9uKTsKLQlXUkVHMzIoMHg1OTQsIDApOworCQlyZXR1cm4gUlJFRzMyKFJfMDA2OEE0X0QyQ1JUQ19TVEFUVVNfRlJBTUVfQ09VTlQpOwogfQogCiBpbnQgcnM2MDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1bnNpZ25lZCBpOwotCXVpbnQzMl90IHRtcDsKIAogCWZvciAoaSA9IDA7IGkgPCByZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgewotCQkvKiByZWFkIE1DX1NUQVRVUyAqLwotCQl0bXAgPSBSUkVHMzJfTUMoUlM2MDBfTUNfU1RBVFVTKTsKLQkJaWYgKHRtcCAmIFJTNjAwX01DX1NUQVRVU19JRExFKSB7CisJCWlmIChHXzAwMDAwMF9NQ19JRExFKFJSRUczMl9NQyhSXzAwMDAwMF9NQ19TVEFUVVMpKSkKIAkJCXJldHVybiAwOwotCQl9Ci0JCURSTV9VREVMQVkoMSk7CisJCXVkZWxheSgxKTsKIAl9CiAJcmV0dXJuIC0xOwogfQogCi12b2lkIHJzNjAwX2VycmF0YShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlyZGV2LT5wbGxfZXJyYXRhID0gMDsKLX0KLQogdm9pZCByczYwMF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAkvKiBGSVhNRTogSERQIHNhbWUgcGxhY2Ugb24gcnM2MDAgPyAqLwogCXIxMDBfaGRwX3Jlc2V0KHJkZXYpOwotCXJzNjAwX2Rpc2FibGVfdmdhKHJkZXYpOwogCS8qIEZJWE1FOiBpcyB0aGlzIGNvcnJlY3QgPyAqLwogCXI0MjBfcGlwZXNfaW5pdChyZGV2KTsKLQlpZiAocnM2MDBfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gd2FpdCBNQyBpZGxlIHdoaWxlICIKLQkJICAgICAgICJwcm9ncmFtbWluZyBwaXBlcy4gQmFkIHRoaW5ncyBtaWdodCBoYXBwZW4uXG4iKTsKLQl9CisJLyogV2FpdCBmb3IgbWMgaWRsZSAqLworCWlmIChyczYwMF9tY193YWl0X2Zvcl9pZGxlKHJkZXYpKQorCQlkZXZfd2FybihyZGV2LT5kZXYsICJXYWl0IE1DIGlkbGUgdGltZW91dCBiZWZvcmUgdXBkYXRpbmcgTUMuXG4iKTsKIH0KIAotCi0vKgotICogVlJBTSBpbmZvLgotICovCiB2b2lkIHJzNjAwX3ZyYW1faW5mbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAkvKiBGSVhNRTogdG8gZG8gb3IgaXMgdGhlc2UgdmFsdWVzIHNhbmUgPyAqLwpAQCAtNDEwLDMxICszMDYsMjA2IEBACiAJLyogRklYTUU6IGltcGxlbWVudCwgc2hvdWxkIHRoaXMgYmUgbGlrZSByczY5MCA/ICovCiB9CiAKLQotLyoKLSAqIEluZGlyZWN0IHJlZ2lzdGVycyBhY2Nlc3NvcgotICovCiB1aW50MzJfdCByczYwMF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpCiB7Ci0JdWludDMyX3QgcjsKLQotCVdSRUczMihSUzYwMF9NQ19JTkRFWCwKLQkgICAgICAgKChyZWcgJiBSUzYwMF9NQ19BRERSX01BU0spIHwgUlM2MDBfTUNfSU5EX0NJVEZfQVJCMCkpOwotCXIgPSBSUkVHMzIoUlM2MDBfTUNfREFUQSk7Ci0JcmV0dXJuIHI7CisJV1JFRzMyKFJfMDAwMDcwX01DX0lORF9JTkRFWCwgU18wMDAwNzBfTUNfSU5EX0FERFIocmVnKSB8CisJCVNfMDAwMDcwX01DX0lORF9DSVRGX0FSQjAoMSkpOworCXJldHVybiBSUkVHMzIoUl8wMDAwNzRfTUNfSU5EX0RBVEEpOwogfQogCiB2b2lkIHJzNjAwX21jX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdikKIHsKLQlXUkVHMzIoUlM2MDBfTUNfSU5ERVgsCi0JCVJTNjAwX01DX0lORF9XUl9FTiB8IFJTNjAwX01DX0lORF9DSVRGX0FSQjAgfAotCQkoKHJlZykgJiBSUzYwMF9NQ19BRERSX01BU0spKTsKLQlXUkVHMzIoUlM2MDBfTUNfREFUQSwgdik7CisJV1JFRzMyKFJfMDAwMDcwX01DX0lORF9JTkRFWCwgU18wMDAwNzBfTUNfSU5EX0FERFIocmVnKSB8CisJCVNfMDAwMDcwX01DX0lORF9DSVRGX0FSQjAoMSkgfCBTXzAwMDA3MF9NQ19JTkRfV1JfRU4oMSkpOworCVdSRUczMihSXzAwMDA3NF9NQ19JTkRfREFUQSwgdik7Cit9CisKK3ZvaWQgcnM2MDBfZGVidWdmcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpZiAocjEwMF9kZWJ1Z2ZzX3JiYm1faW5pdChyZGV2KSkKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBmaWxlIGZvciBSQkJNICFcbiIpOworfQorCit2b2lkIHJzNjAwX3NldF9zYWZlX3JlZ2lzdGVycyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlyZGV2LT5jb25maWcucjMwMC5yZWdfc2FmZV9ibSA9IHJzNjAwX3JlZ19zYWZlX2JtOworCXJkZXYtPmNvbmZpZy5yMzAwLnJlZ19zYWZlX2JtX3NpemUgPSBBUlJBWV9TSVpFKHJzNjAwX3JlZ19zYWZlX2JtKTsKK30KKworc3RhdGljIHZvaWQgcnM2MDBfbWNfcHJvZ3JhbShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSBzYXZlOworCisJLyogU3RvcHMgYWxsIG1jIGNsaWVudHMgKi8KKwlydjUxNV9tY19zdG9wKHJkZXYsICZzYXZlKTsKKworCS8qIFdhaXQgZm9yIG1jIGlkbGUgKi8KKwlpZiAocnM2MDBfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiV2FpdCBNQyBpZGxlIHRpbWVvdXQgYmVmb3JlIHVwZGF0aW5nIE1DLlxuIik7CisKKwkvKiBGSVhNRTogV2hhdCBkb2VzIEFHUCBtZWFucyBmb3Igc3VjaCBjaGlwc2V0ID8gKi8KKwlXUkVHMzJfTUMoUl8wMDAwMDVfTUNfQUdQX0xPQ0FUSU9OLCAweDBGRkZGRkZGKTsKKwlXUkVHMzJfTUMoUl8wMDAwMDZfQUdQX0JBU0UsIDApOworCVdSRUczMl9NQyhSXzAwMDAwN19BR1BfQkFTRV8yLCAwKTsKKwkvKiBQcm9ncmFtIE1DICovCisJV1JFRzMyX01DKFJfMDAwMDA0X01DX0ZCX0xPQ0FUSU9OLAorCQkJU18wMDAwMDRfTUNfRkJfU1RBUlQocmRldi0+bWMudnJhbV9zdGFydCA+PiAxNikgfAorCQkJU18wMDAwMDRfTUNfRkJfVE9QKHJkZXYtPm1jLnZyYW1fZW5kID4+IDE2KSk7CisJV1JFRzMyKFJfMDAwMTM0X0hEUF9GQl9MT0NBVElPTiwKKwkJU18wMDAxMzRfSERQX0ZCX1NUQVJUKHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTYpKTsKKworCXJ2NTE1X21jX3Jlc3VtZShyZGV2LCAmc2F2ZSk7Cit9CisKK3N0YXRpYyBpbnQgcnM2MDBfc3RhcnR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcjsKKworCXJzNjAwX21jX3Byb2dyYW0ocmRldik7CisJLyogUmVzdW1lIGNsb2NrICovCisJcnY1MTVfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdQVSBjb25maWd1cmF0aW9uICgjIHBpcGVzLCAuLi4pICovCisJcnM2MDBfZ3B1X2luaXQocmRldik7CisJLyogSW5pdGlhbGl6ZSBHQVJUIChpbml0aWFsaXplIGFmdGVyIFRUTSBzbyB3ZSBjYW4gYWxsb2NhdGUKKwkgKiBtZW1vcnkgdGhyb3VnaCBUVE0gYnV0IGZpbmFsaXplIGFmdGVyIFRUTSkgKi8KKwlyID0gcnM2MDBfZ2FydF9lbmFibGUocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCS8qIEVuYWJsZSBJUlEgKi8KKwlyZGV2LT5pcnEuc3dfaW50ID0gdHJ1ZTsKKwlyczYwMF9pcnFfc2V0KHJkZXYpOworCS8qIDFNIHJpbmcgYnVmZmVyICovCisJciA9IHIxMDBfY3BfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJmYWlsbGVkIGluaXRpYWxpemluZyBDUCAoJWQpLlxuIiwgcik7CisJCXJldHVybiByOworCX0KKwlyID0gcjEwMF93Yl9pbml0KHJkZXYpOworCWlmIChyKQorCQlkZXZfZXJyKHJkZXYtPmRldiwgImZhaWxsZWQgaW5pdGlhbGl6aW5nIFdCICglZCkuXG4iLCByKTsKKwlyID0gcjEwMF9pYl9pbml0KHJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgSUIgKCVkKS5cbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByczYwMF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJLyogTWFrZSBzdXIgR0FSVCBhcmUgbm90IHdvcmtpbmcgKi8KKwlyczYwMF9nYXJ0X2Rpc2FibGUocmRldik7CisJLyogUmVzdW1lIGNsb2NrIGJlZm9yZSBkb2luZyByZXNldCAqLworCXJ2NTE1X2Nsb2NrX3N0YXJ0dXAocmRldik7CisJLyogUmVzZXQgZ3B1IGJlZm9yZSBwb3N0aW5nIG90aGVyd2lzZSBBVE9NIHdpbGwgZW50ZXIgaW5maW5pdGUgbG9vcCAqLworCWlmIChyYWRlb25fZ3B1X3Jlc2V0KHJkZXYpKSB7CisJCWRldl93YXJuKHJkZXYtPmRldiwgIkdQVSByZXNldCBmYWlsZWQgISAoMHhFNDA9MHglMDhYLCAweDdDMD0weCUwOFgpXG4iLAorCQkJUlJFRzMyKFJfMDAwRTQwX1JCQk1fU1RBVFVTKSwKKwkJCVJSRUczMihSXzAwMDdDMF9DUF9TVEFUKSk7CisJfQorCS8qIHBvc3QgKi8KKwlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKKwkvKiBSZXN1bWUgY2xvY2sgYWZ0ZXIgcG9zdGluZyAqLworCXJ2NTE1X2Nsb2NrX3N0YXJ0dXAocmRldik7CisJcmV0dXJuIHJzNjAwX3N0YXJ0dXAocmRldik7Cit9CisKK2ludCByczYwMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXIxMDBfY3BfZGlzYWJsZShyZGV2KTsKKwlyMTAwX3diX2Rpc2FibGUocmRldik7CisJcnM2MDBfaXJxX2Rpc2FibGUocmRldik7CisJcnM2MDBfZ2FydF9kaXNhYmxlKHJkZXYpOworCXJldHVybiAwOworfQorCit2b2lkIHJzNjAwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcnM2MDBfc3VzcGVuZChyZGV2KTsKKwlyMTAwX2NwX2ZpbmkocmRldik7CisJcjEwMF93Yl9maW5pKHJkZXYpOworCXIxMDBfaWJfZmluaShyZGV2KTsKKwlyYWRlb25fZ2VtX2ZpbmkocmRldik7CisJcnM2MDBfZ2FydF9maW5pKHJkZXYpOworCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CisJcmFkZW9uX2ZlbmNlX2RyaXZlcl9maW5pKHJkZXYpOworCXJhZGVvbl9vYmplY3RfZmluaShyZGV2KTsKKwlyYWRlb25fYXRvbWJpb3NfZmluaShyZGV2KTsKKwlrZnJlZShyZGV2LT5iaW9zKTsKKwlyZGV2LT5iaW9zID0gTlVMTDsKIH0KIAogaW50IHJzNjAwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JcmRldi0+Y29uZmlnLnIzMDAucmVnX3NhZmVfYm0gPSByczYwMF9yZWdfc2FmZV9ibTsKLQlyZGV2LT5jb25maWcucjMwMC5yZWdfc2FmZV9ibV9zaXplID0gQVJSQVlfU0laRShyczYwMF9yZWdfc2FmZV9ibSk7CisJaW50IHI7CisKKwkvKiBEaXNhYmxlIFZHQSAqLworCXJ2NTE1X3ZnYV9yZW5kZXJfZGlzYWJsZShyZGV2KTsKKwkvKiBJbml0aWFsaXplIHNjcmF0Y2ggcmVnaXN0ZXJzICovCisJcmFkZW9uX3NjcmF0Y2hfaW5pdChyZGV2KTsKKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKKwkvKiBCSU9TICovCisJaWYgKCFyYWRlb25fZ2V0X2Jpb3MocmRldikpIHsKKwkJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJkZXYtPmlzX2F0b21fYmlvcykgeworCQlyID0gcmFkZW9uX2F0b21iaW9zX2luaXQocmRldik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfSBlbHNlIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJFeHBlY3RpbmcgYXRvbWJpb3MgZm9yIFJTNjAwIEdQVVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBSZXNldCBncHUgYmVmb3JlIHBvc3Rpbmcgb3RoZXJ3aXNlIEFUT00gd2lsbCBlbnRlciBpbmZpbml0ZSBsb29wICovCisJaWYgKHJhZGVvbl9ncHVfcmVzZXQocmRldikpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LAorCQkJIkdQVSByZXNldCBmYWlsZWQgISAoMHhFNDA9MHglMDhYLCAweDdDMD0weCUwOFgpXG4iLAorCQkJUlJFRzMyKFJfMDAwRTQwX1JCQk1fU1RBVFVTKSwKKwkJCVJSRUczMihSXzAwMDdDMF9DUF9TVEFUKSk7CisJfQorCS8qIGNoZWNrIGlmIGNhcmRzIGFyZSBwb3N0ZWQgb3Igbm90ICovCisJaWYgKCFyYWRlb25fY2FyZF9wb3N0ZWQocmRldikgJiYgcmRldi0+YmlvcykgeworCQlEUk1fSU5GTygiR1BVIG5vdCBwb3N0ZWQuIHBvc3Rpbmcgbm93Li4uXG4iKTsKKwkJYXRvbV9hc2ljX2luaXQocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCk7CisJfQorCS8qIEluaXRpYWxpemUgY2xvY2tzICovCisJcmFkZW9uX2dldF9jbG9ja19pbmZvKHJkZXYtPmRkZXYpOworCS8qIEdldCB2cmFtIGluZm9ybWF0aW9ucyAqLworCXJzNjAwX3ZyYW1faW5mbyhyZGV2KTsKKwkvKiBJbml0aWFsaXplIG1lbW9yeSBjb250cm9sbGVyIChhbHNvIHRlc3QgQUdQKSAqLworCXIgPSByNDIwX21jX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXJzNjAwX2RlYnVnZnMocmRldik7CisJLyogRmVuY2UgZHJpdmVyICovCisJciA9IHJhZGVvbl9mZW5jZV9kcml2ZXJfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJciA9IHJhZGVvbl9pcnFfa21zX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCS8qIE1lbW9yeSBtYW5hZ2VyICovCisJciA9IHJhZGVvbl9vYmplY3RfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJciA9IHJzNjAwX2dhcnRfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJcnM2MDBfc2V0X3NhZmVfcmVnaXN0ZXJzKHJkZXYpOworCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSB0cnVlOworCXIgPSByczYwMF9zdGFydHVwKHJkZXYpOworCWlmIChyKSB7CisJCS8qIFNvbWV0aGluZ3Mgd2FudCB3cm9udCB3aXRoIHRoZSBhY2NlbCBpbml0IHN0b3AgYWNjZWwgKi8KKwkJZGV2X2VycihyZGV2LT5kZXYsICJEaXNhYmxpbmcgR1BVIGFjY2VsZXJhdGlvblxuIik7CisJCXJzNjAwX3N1c3BlbmQocmRldik7CisJCXIxMDBfY3BfZmluaShyZGV2KTsKKwkJcjEwMF93Yl9maW5pKHJkZXYpOworCQlyMTAwX2liX2ZpbmkocmRldik7CisJCXJzNjAwX2dhcnRfZmluaShyZGV2KTsKKwkJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKKwkJcmRldi0+YWNjZWxfd29ya2luZyA9IGZhbHNlOworCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzA4OTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwZC5oCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOSBKZXJvbWUgR2xpc3NlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IERhdmUgQWlybGllCisgKiAgICAgICAgICBBbGV4IERldWNoZXIKKyAqICAgICAgICAgIEplcm9tZSBHbGlzc2UKKyAqLworI2lmbmRlZiBfX1JTNjAwRF9IX18KKyNkZWZpbmUgX19SUzYwMERfSF9fCisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBSXzAwMDA0MF9HRU5fSU5UX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MAorI2RlZmluZSAgIFNfMDAwMDQwX0RJU1BMQVlfSU5UX1NUQVRVUyh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDQwX0RJU1BMQVlfSU5UX1NUQVRVUyh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0RJU1BMQVlfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDA0MF9ETUFfVklQSDBfSU5UX0VOKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTIpCisjZGVmaW5lICAgR18wMDAwNDBfRE1BX1ZJUEgwX0lOVF9FTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0RNQV9WSVBIMF9JTlRfRU4gICAgICAgICAgICAgICAgICAgIDB4RkZGRkVGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9DUlRDMl9WU1lOQyh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgNikKKyNkZWZpbmUgICBHXzAwMDA0MF9DUlRDMl9WU1lOQyh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA0MF9DUlRDMl9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkJGCisjZGVmaW5lICAgU18wMDAwNDBfU05BUFNIT1QyKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDcpCisjZGVmaW5lICAgR18wMDAwNDBfU05BUFNIT1QyKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gNykgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwNDBfU05BUFNIT1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkY3RgorI2RlZmluZSAgIFNfMDAwMDQwX0NSVEMyX1ZCTEFOSyh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA5KQorI2RlZmluZSAgIEdfMDAwMDQwX0NSVEMyX1ZCTEFOSyh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0NSVEMyX1ZCTEFOSyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZERkYKKyNkZWZpbmUgICBTXzAwMDA0MF9GUDJfREVURUNUKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTApCisjZGVmaW5lICAgR18wMDAwNDBfRlAyX0RFVEVDVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0ZQMl9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZCRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9WU1lOQ19ESUZGX09WRVJfTElNSVQoeCkgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTEpCisjZGVmaW5lICAgR18wMDAwNDBfVlNZTkNfRElGRl9PVkVSX0xJTUlUKHgpICAgICAgICAgICAgKCgoeCkgPj4gMTEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX1ZTWU5DX0RJRkZfT1ZFUl9MSU1JVCAgICAgICAgICAgICAgIDB4RkZGRkY3RkYKKyNkZWZpbmUgICBTXzAwMDA0MF9ETUFfVklQSDFfSU5UX0VOKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTMpCisjZGVmaW5lICAgR18wMDAwNDBfRE1BX1ZJUEgxX0lOVF9FTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0RNQV9WSVBIMV9JTlRfRU4gICAgICAgICAgICAgICAgICAgIDB4RkZGRkRGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9ETUFfVklQSDJfSU5UX0VOKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDAwNDBfRE1BX1ZJUEgyX0lOVF9FTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0RNQV9WSVBIMl9JTlRfRU4gICAgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9ETUFfVklQSDNfSU5UX0VOKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTUpCisjZGVmaW5lICAgR18wMDAwNDBfRE1BX1ZJUEgzX0lOVF9FTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0RNQV9WSVBIM19JTlRfRU4gICAgICAgICAgICAgICAgICAgIDB4RkZGRjdGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9JMkNfSU5UX0VOKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTcpCisjZGVmaW5lICAgR18wMDAwNDBfSTJDX0lOVF9FTih4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0kyQ19JTlRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGREZGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9HVUlfSURMRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTkpCisjZGVmaW5lICAgR18wMDAwNDBfR1VJX0lETEUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0dVSV9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGN0ZGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9WSVBIX0lOVF9FTih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDAwNDBfVklQSF9JTlRfRU4oeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX1ZJUEhfSU5UX0VOICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9TV19JTlRfRU4oeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDAwNDBfU1dfSU5UX0VOKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX1NXX0lOVF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9HRVlTRVJWSUxMRSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjcpCisjZGVmaW5lICAgR18wMDAwNDBfR0VZU0VSVklMTEUoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0dFWVNFUlZJTExFICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjdGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9IRENQX0FVVEhPUklaRURfSU5UKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjgpCisjZGVmaW5lICAgR18wMDAwNDBfSERDUF9BVVRIT1JJWkVEX0lOVCh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gMjgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0hEQ1BfQVVUSE9SSVpFRF9JTlQgICAgICAgICAgICAgICAgIDB4RUZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9EVklfSTJDX0lOVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjkpCisjZGVmaW5lICAgR18wMDAwNDBfRFZJX0kyQ19JTlQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0RWSV9JMkNfSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4REZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9HVUlETUEoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzApCisjZGVmaW5lICAgR18wMDAwNDBfR1VJRE1BKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX0dVSURNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0MF9WSURETUEoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lICAgR18wMDAwNDBfVklERE1BKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQwX1ZJRERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKKyNkZWZpbmUgUl8wMDAwNDRfR0VOX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDQKKyNkZWZpbmUgICBTXzAwMDA0NF9ESVNQTEFZX0lOVF9TVEFUKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDA0NF9ESVNQTEFZX0lOVF9TVEFUKHgpICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA0NF9ESVNQTEFZX0lOVF9TVEFUICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lICAgU18wMDAwNDRfVkdBX0lOVF9TVEFUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEpCisjZGVmaW5lICAgR18wMDAwNDRfVkdBX0lOVF9TVEFUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwNDRfVkdBX0lOVF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRAorI2RlZmluZSAgIFNfMDAwMDQ0X0NBUDBfSU5UX0FDVElWRSh4KSAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA4KQorI2RlZmluZSAgIEdfMDAwMDQ0X0NBUDBfSU5UX0FDVElWRSh4KSAgICAgICAgICAgICAgICAgICgoKHgpID4+IDgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0NBUDBfSU5UX0FDVElWRSAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZFRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9ETUFfVklQSDBfSU5UKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTIpCisjZGVmaW5lICAgR18wMDAwNDRfRE1BX1ZJUEgwX0lOVCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0RNQV9WSVBIMF9JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkVGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9ETUFfVklQSDFfSU5UKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTMpCisjZGVmaW5lICAgR18wMDAwNDRfRE1BX1ZJUEgxX0lOVCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0RNQV9WSVBIMV9JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkRGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9ETUFfVklQSDJfSU5UKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDAwNDRfRE1BX1ZJUEgyX0lOVCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0RNQV9WSVBIMl9JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9ETUFfVklQSDNfSU5UKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTUpCisjZGVmaW5lICAgR18wMDAwNDRfRE1BX1ZJUEgzX0lOVCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0RNQV9WSVBIM19JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjdGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9NQ19QUk9CRV9GQVVMVF9TVEFUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDAwNDRfTUNfUFJPQkVfRkFVTFRfU1RBVCh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X01DX1BST0JFX0ZBVUxUX1NUQVQgICAgICAgICAgICAgICAgIDB4RkZGRUZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9JMkNfSU5UKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTcpCisjZGVmaW5lICAgR18wMDAwNDRfSTJDX0lOVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0kyQ19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGREZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9TQ1JBVENIX0lOVF9TVEFUKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTgpCisjZGVmaW5lICAgR18wMDAwNDRfU0NSQVRDSF9JTlRfU1RBVCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X1NDUkFUQ0hfSU5UX1NUQVQgICAgICAgICAgICAgICAgICAgIDB4RkZGQkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9HVUlfSURMRV9TVEFUKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTkpCisjZGVmaW5lICAgR18wMDAwNDRfR1VJX0lETEVfU1RBVCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0dVSV9JRExFX1NUQVQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGN0ZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9BVElfT1ZFUkRSSVZFX0lOVF9TVEFUKHgpICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDAwNDRfQVRJX09WRVJEUklWRV9JTlRfU1RBVCh4KSAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0FUSV9PVkVSRFJJVkVfSU5UX1NUQVQgICAgICAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9NQ19QUk9URUNUSU9OX0ZBVUxUX1NUQVQoeCkgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDAwNDRfTUNfUFJPVEVDVElPTl9GQVVMVF9TVEFUKHgpICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X01DX1BST1RFQ1RJT05fRkFVTFRfU1RBVCAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9SQkJNX1JFQURfSU5UX1NUQVQoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjIpCisjZGVmaW5lICAgR18wMDAwNDRfUkJCTV9SRUFEX0lOVF9TVEFUKHgpICAgICAgICAgICAgICAgKCgoeCkgPj4gMjIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X1JCQk1fUkVBRF9JTlRfU1RBVCAgICAgICAgICAgICAgICAgIDB4RkZCRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9DQl9DT05URVhUX1NXSVRDSF9TVEFUKHgpICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjMpCisjZGVmaW5lICAgR18wMDAwNDRfQ0JfQ09OVEVYVF9TV0lUQ0hfU1RBVCh4KSAgICAgICAgICAgKCgoeCkgPj4gMjMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0NCX0NPTlRFWFRfU1dJVENIX1NUQVQgICAgICAgICAgICAgIDB4RkY3RkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9WSVBIX0lOVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDAwNDRfVklQSF9JTlQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X1ZJUEhfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9TV19JTlQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDAwNDRfU1dfSU5UKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X1NXX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9TV19JTlRfU0VUKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjYpCisjZGVmaW5lICAgR18wMDAwNDRfU1dfSU5UX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X1NXX0lOVF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkJGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9JRENUX0lOVF9TVEFUKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjcpCisjZGVmaW5lICAgR18wMDAwNDRfSURDVF9JTlRfU1RBVCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0lEQ1RfSU5UX1NUQVQgICAgICAgICAgICAgICAgICAgICAgIDB4RjdGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9HVUlETUFfU1RBVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzApCisjZGVmaW5lICAgR18wMDAwNDRfR1VJRE1BX1NUQVQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X0dVSURNQV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDA0NF9WSURETUFfU1RBVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lICAgR18wMDAwNDRfVklERE1BX1NUQVQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDQ0X1ZJRERNQV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKKyNkZWZpbmUgUl8wMDAwNENfQlVTX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNEMKKyNkZWZpbmUgICBTXzAwMDA0Q19CVVNfTUFTVEVSX0RJUyh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDAwNENfQlVTX01BU1RFUl9ESVMoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDRDX0JVU19NQVNURVJfRElTICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMDA0Q19CVVNfTVNJX1JFQVJNKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDAwNENfQlVTX01TSV9SRUFSTSh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDRDX0JVU19NU0lfUkVBUk0gICAgICAgICAgICAgICAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgUl8wMDAwNzBfTUNfSU5EX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNzAKKyNkZWZpbmUgICBTXzAwMDA3MF9NQ19JTkRfQUREUih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDA3MF9NQ19JTkRfQUREUih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX1NFUV9SQlNfMCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9TRVFfUkJTXzAoeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfU0VRX1JCU18wICAgICAgICAgICAgICAgICAgICAweEZGRkVGRkZGCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX1NFUV9SQlNfMSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE3KQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9TRVFfUkJTXzEoeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDE3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfU0VRX1JCU18xICAgICAgICAgICAgICAgICAgICAweEZGRkRGRkZGCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX1NFUV9SQlNfMih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE4KQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9TRVFfUkJTXzIoeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDE4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfU0VRX1JCU18yICAgICAgICAgICAgICAgICAgICAweEZGRkJGRkZGCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX1NFUV9SQlNfMyh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE5KQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9TRVFfUkJTXzMoeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDE5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfU0VRX1JCU18zICAgICAgICAgICAgICAgICAgICAweEZGRjdGRkZGCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX0FJQ19SQlMoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIwKQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9BSUNfUkJTKHgpICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfQUlDX1JCUyAgICAgICAgICAgICAgICAgICAgICAweEZGRUZGRkZGCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX0NJVEZfQVJCMCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIxKQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9DSVRGX0FSQjAoeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDIxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfQ0lURl9BUkIwICAgICAgICAgICAgICAgICAgICAweEZGREZGRkZGCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX0NJVEZfQVJCMSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIyKQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9DSVRGX0FSQjEoeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDIyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfQ0lURl9BUkIxICAgICAgICAgICAgICAgICAgICAweEZGQkZGRkZGCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX1dSX0VOKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIzKQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9XUl9FTih4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfV1JfRU4gICAgICAgICAgICAgICAgICAgICAgICAweEZGN0ZGRkZGCisjZGVmaW5lICAgU18wMDAwNzBfTUNfSU5EX1JEX0lOVih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI0KQorI2RlZmluZSAgIEdfMDAwMDcwX01DX0lORF9SRF9JTlYoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA3MF9NQ19JTkRfUkRfSU5WICAgICAgICAgICAgICAgICAgICAgICAweEZFRkZGRkZGCisjZGVmaW5lIFJfMDAwMDc0X01DX0lORF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDc0CisjZGVmaW5lICAgU18wMDAwNzRfTUNfSU5EX0RBVEEoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkZGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDc0X01DX0lORF9EQVRBKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGRkZGRikKKyNkZWZpbmUgICBDXzAwMDA3NF9NQ19JTkRfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFJfMDAwMTM0X0hEUF9GQl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTM0CisjZGVmaW5lICAgU18wMDAxMzRfSERQX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAxMzRfSERQX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkYpCisjZGVmaW5lICAgQ18wMDAxMzRfSERQX0ZCX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSBSXzAwMDdDMF9DUF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDdDMAorI2RlZmluZSAgIFNfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX01SVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMSkKKyNkZWZpbmUgICBHXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9NV1VfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZECisjZGVmaW5lICAgU18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIpCisjZGVmaW5lICAgR18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfUlNJVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGQgorI2RlZmluZSAgIFNfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzKQorI2RlZmluZSAgIEdfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX1JDSVVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjcKKyNkZWZpbmUgICBTXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOSkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSA+PiA5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGREZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZGQkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX1BSSU1BUllfQlVTWSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDExKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9QUklNQVJZX0JVU1koeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDExKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGN0ZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NJX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEzKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTSV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0lfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZERkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE0KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDE0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1QyX0JVU1kgICAgICAgICAgICAgICAgICAweEZGRkZCRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE1KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDE1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1QyX0JVU1kgICAgICAgICAgICAgICAgICAweEZGRkY3RkZGCisjZGVmaW5lICAgU18wMDA3QzBfR1VJRE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQorI2RlZmluZSAgIEdfMDAwN0MwX0dVSURNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9HVUlETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweEVGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfVklERE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI5KQorI2RlZmluZSAgIEdfMDAwN0MwX1ZJRERNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9WSURETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NNRFNUUk1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DTURTVFJNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1BfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQorI2RlZmluZSAgIEdfMDAwN0MwX0NQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCisjZGVmaW5lIFJfMDAwRTQwX1JCQk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTQwCisjZGVmaW5lICAgU18wMDBFNDBfQ01ERklGT19BVkFJTCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDdGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwRTQwX0NNREZJRk9fQVZBSUwoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHg3RikKKyNkZWZpbmUgICBDXzAwMEU0MF9DTURGSUZPX0FWQUlMICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRjgwCisjZGVmaW5lICAgU18wMDBFNDBfSElSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDgpCisjZGVmaW5lICAgR18wMDBFNDBfSElSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfSElSUV9PTl9SQkIgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkVGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NQUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA5KQorI2RlZmluZSAgIEdfMDAwRTQwX0NQUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZERkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRlJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTApCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZCRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9ISVJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTEpCisjZGVmaW5lICAgR18wMDBFNDBfSElSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0hJUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkY3RkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUFJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTIpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkVGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRlJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTMpCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkRGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRl9QSVBFX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZfUElQRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGX1BJUEVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9FTkdfRVZfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTUpCisjZGVmaW5lICAgR18wMDBFNDBfRU5HX0VWX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0VOR19FVl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjdGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUF9DTURTVFJNX0JVU1koeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQX0NNRFNUUk1fQlVTWSAgICAgICAgICAgICAgICAgICAgIDB4RkZGRUZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9FMl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTcpCisjZGVmaW5lICAgR18wMDBFNDBfRTJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0UyX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGREZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQjJEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTgpCisjZGVmaW5lICAgR18wMDBFNDBfUkIyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCMkRfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGQkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQjNEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTkpCisjZGVmaW5lICAgR18wMDBFNDBfUkIzRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCM0RfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGN0ZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9WQVBfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDBFNDBfVkFQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1ZBUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDBFNDBfUkVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9UQU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjIpCisjZGVmaW5lICAgR18wMDBFNDBfVEFNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RBTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZCRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9URE1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjMpCisjZGVmaW5lICAgR18wMDBFNDBfVERNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RETV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkY3RkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9QQl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDBFNDBfUEJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1BCX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9USU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDBFNDBfVElNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RJTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9HQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjYpCisjZGVmaW5lICAgR18wMDBFNDBfR0FfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0dBX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkJGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DQkEyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjcpCisjZGVmaW5lICAgR18wMDBFNDBfQ0JBMkRfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NCQTJEX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjdGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9HVUlfQUNUSVZFKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lICAgR18wMDBFNDBfR1VJX0FDVElWRSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0dVSV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKKyNkZWZpbmUgUl8wMDYwQTRfRDFDUlRDX1NUQVRVU19GUkFNRV9DT1VOVCAgICAgICAgICAgMHgwMDYwQTQKKyNkZWZpbmUgICBTXzAwNjBBNF9EMUNSVENfRlJBTUVfQ09VTlQoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDA2MEE0X0QxQ1JUQ19GUkFNRV9DT1VOVCh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGRkYpCisjZGVmaW5lICAgQ18wMDYwQTRfRDFDUlRDX0ZSQU1FX0NPVU5UICAgICAgICAgICAgICAgICAgMHhGRjAwMDAwMAorI2RlZmluZSBSXzAwNjUzNF9EMU1PREVfVkJMQU5LX1NUQVRVUyAgICAgICAgICAgICAgICAweDAwNjUzNAorI2RlZmluZSAgIFNfMDA2NTM0X0QxTU9ERV9WQkxBTktfT0NDVVJSRUQoeCkgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDA2NTM0X0QxTU9ERV9WQkxBTktfT0NDVVJSRUQoeCkgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDA2NTM0X0QxTU9ERV9WQkxBTktfT0NDVVJSRUQgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwNjUzNF9EMU1PREVfVkJMQU5LX0FDSyh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgNCkKKyNkZWZpbmUgICBHXzAwNjUzNF9EMU1PREVfVkJMQU5LX0FDSyh4KSAgICAgICAgICAgICAgICAoKCh4KSA+PiA0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjUzNF9EMU1PREVfVkJMQU5LX0FDSyAgICAgICAgICAgICAgICAgICAweEZGRkZGRkVGCisjZGVmaW5lICAgU18wMDY1MzRfRDFNT0RFX1ZCTEFOS19TVEFUKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDA2NTM0X0QxTU9ERV9WQkxBTktfU1RBVCh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjUzNF9EMU1PREVfVkJMQU5LX1NUQVQgICAgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDY1MzRfRDFNT0RFX1ZCTEFOS19JTlRFUlJVUFQoeCkgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDA2NTM0X0QxTU9ERV9WQkxBTktfSU5URVJSVVBUKHgpICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjUzNF9EMU1PREVfVkJMQU5LX0lOVEVSUlVQVCAgICAgICAgICAgICAweEZGRkVGRkZGCisjZGVmaW5lIFJfMDA2NTQwX0R4TU9ERV9JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA2NTQwCisjZGVmaW5lICAgU18wMDY1NDBfRDFNT0RFX1ZCTEFOS19JTlRfTUFTSyh4KSAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDY1NDBfRDFNT0RFX1ZCTEFOS19JTlRfTUFTSyh4KSAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDY1NDBfRDFNT0RFX1ZCTEFOS19JTlRfTUFTSyAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDA2NTQwX0QxTU9ERV9WTElORV9JTlRfTUFTSyh4KSAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA0KQorI2RlZmluZSAgIEdfMDA2NTQwX0QxTU9ERV9WTElORV9JTlRfTUFTSyh4KSAgICAgICAgICAgICgoKHgpID4+IDQpICYgMHgxKQorI2RlZmluZSAgIENfMDA2NTQwX0QxTU9ERV9WTElORV9JTlRfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRkZGRUYKKyNkZWZpbmUgICBTXzAwNjU0MF9EMk1PREVfVkJMQU5LX0lOVF9NQVNLKHgpICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOCkKKyNkZWZpbmUgICBHXzAwNjU0MF9EMk1PREVfVkJMQU5LX0lOVF9NQVNLKHgpICAgICAgICAgICAoKCh4KSA+PiA4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjU0MF9EMk1PREVfVkJMQU5LX0lOVF9NQVNLICAgICAgICAgICAgICAweEZGRkZGRUZGCisjZGVmaW5lICAgU18wMDY1NDBfRDJNT0RFX1ZMSU5FX0lOVF9NQVNLKHgpICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDA2NTQwX0QyTU9ERV9WTElORV9JTlRfTUFTSyh4KSAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjU0MF9EMk1PREVfVkxJTkVfSU5UX01BU0sgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDY1NDBfRDFNT0RFX1ZCTEFOS19DUF9TRUwoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQorI2RlZmluZSAgIEdfMDA2NTQwX0QxTU9ERV9WQkxBTktfQ1BfU0VMKHgpICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjU0MF9EMU1PREVfVkJMQU5LX0NQX1NFTCAgICAgICAgICAgICAgICAweEJGRkZGRkZGCisjZGVmaW5lICAgU18wMDY1NDBfRDJNT0RFX1ZCTEFOS19DUF9TRUwoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQorI2RlZmluZSAgIEdfMDA2NTQwX0QyTU9ERV9WQkxBTktfQ1BfU0VMKHgpICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjU0MF9EMk1PREVfVkJMQU5LX0NQX1NFTCAgICAgICAgICAgICAgICAweDdGRkZGRkZGCisjZGVmaW5lIFJfMDA2OEE0X0QyQ1JUQ19TVEFUVVNfRlJBTUVfQ09VTlQgICAgICAgICAgIDB4MDA2OEE0CisjZGVmaW5lICAgU18wMDY4QTRfRDJDUlRDX0ZSQU1FX0NPVU5UKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwNjhBNF9EMkNSVENfRlJBTUVfQ09VTlQoeCkgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRkZGKQorI2RlZmluZSAgIENfMDA2OEE0X0QyQ1JUQ19GUkFNRV9DT1VOVCAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDAKKyNkZWZpbmUgUl8wMDZEMzRfRDJNT0RFX1ZCTEFOS19TVEFUVVMgICAgICAgICAgICAgICAgMHgwMDZEMzQKKyNkZWZpbmUgICBTXzAwNkQzNF9EMk1PREVfVkJMQU5LX09DQ1VSUkVEKHgpICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBHXzAwNkQzNF9EMk1PREVfVkJMQU5LX09DQ1VSUkVEKHgpICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNkQzNF9EMk1PREVfVkJMQU5LX09DQ1VSUkVEICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lICAgU18wMDZEMzRfRDJNT0RFX1ZCTEFOS19BQ0soeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDQpCisjZGVmaW5lICAgR18wMDZEMzRfRDJNT0RFX1ZCTEFOS19BQ0soeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDZEMzRfRDJNT0RFX1ZCTEFOS19BQ0sgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZFRgorI2RlZmluZSAgIFNfMDA2RDM0X0QyTU9ERV9WQkxBTktfU1RBVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMikKKyNkZWZpbmUgICBHXzAwNkQzNF9EMk1PREVfVkJMQU5LX1NUQVQoeCkgICAgICAgICAgICAgICAoKCh4KSA+PiAxMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDZEMzRfRDJNT0RFX1ZCTEFOS19TVEFUICAgICAgICAgICAgICAgICAgMHhGRkZGRUZGRgorI2RlZmluZSAgIFNfMDA2RDM0X0QyTU9ERV9WQkxBTktfSU5URVJSVVBUKHgpICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwNkQzNF9EMk1PREVfVkJMQU5LX0lOVEVSUlVQVCh4KSAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDZEMzRfRDJNT0RFX1ZCTEFOS19JTlRFUlJVUFQgICAgICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSBSXzAwN0VEQ19ESVNQX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAweDAwN0VEQworI2RlZmluZSAgIFNfMDA3RURDX0xCX0QxX1ZCTEFOS19JTlRFUlJVUFQoeCkgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA0KQorI2RlZmluZSAgIEdfMDA3RURDX0xCX0QxX1ZCTEFOS19JTlRFUlJVUFQoeCkgICAgICAgICAgICgoKHgpID4+IDQpICYgMHgxKQorI2RlZmluZSAgIENfMDA3RURDX0xCX0QxX1ZCTEFOS19JTlRFUlJVUFQgICAgICAgICAgICAgIDB4RkZGRkZGRUYKKyNkZWZpbmUgICBTXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUKHgpICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgNSkKKyNkZWZpbmUgICBHXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUKHgpICAgICAgICAgICAoKCh4KSA+PiA1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUICAgICAgICAgICAgICAweEZGRkZGRkRGCisKKworLyogTUMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfMDAwMDAwX01DX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwCisjZGVmaW5lICAgU18wMDAwMDBfTUNfSURMRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDAwMDBfTUNfSURMRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMDBfTUNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSBSXzAwMDAwNF9NQ19GQl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNAorI2RlZmluZSAgIFNfMDAwMDA0X01DX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDA0X01DX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMDA0X01DX0ZCX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgICBTXzAwMDAwNF9NQ19GQl9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMTYpCisjZGVmaW5lICAgR18wMDAwMDRfTUNfRkJfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMDA0X01DX0ZCX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgUl8wMDAwMDVfTUNfQUdQX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUKKyNkZWZpbmUgICBTXzAwMDAwNV9NQ19BR1BfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDAwNV9NQ19BR1BfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDAwNV9NQ19BR1BfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisjZGVmaW5lICAgU18wMDAwMDVfTUNfQUdQX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDE2KQorI2RlZmluZSAgIEdfMDAwMDA1X01DX0FHUF9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDAwNV9NQ19BR1BfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIFJfMDAwMDA2X0FHUF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2CisjZGVmaW5lICAgU18wMDAwMDZfQUdQX0JBU0VfQUREUih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkZGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDA2X0FHUF9CQVNFX0FERFIoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGRkZGRikKKyNkZWZpbmUgICBDXzAwMDAwNl9BR1BfQkFTRV9BRERSICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFJfMDAwMDA3X0FHUF9CQVNFXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3CisjZGVmaW5lICAgU18wMDAwMDdfQUdQX0JBU0VfQUREUl8yKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEYpIDw8IDApCisjZGVmaW5lICAgR18wMDAwMDdfQUdQX0JBU0VfQUREUl8yKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEYpCisjZGVmaW5lICAgQ18wMDAwMDdfQUdQX0JBU0VfQUREUl8yICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGMAorI2RlZmluZSBSXzAwMDAwOV9NQ19DTlRMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwOQorI2RlZmluZSAgIFNfMDAwMDA5X0VOQUJMRV9QQUdFX1RBQkxFUyh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNikKKyNkZWZpbmUgICBHXzAwMDAwOV9FTkFCTEVfUEFHRV9UQUJMRVMoeCkgICAgICAgICAgICAgICAoKCh4KSA+PiAyNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMDlfRU5BQkxFX1BBR0VfVEFCTEVTICAgICAgICAgICAgICAgICAgMHhGQkZGRkZGRgorLyogRklYTUUgZG9uJ3Qga25vdyB0aGUgdmFyaW91cyBmaWVsZCBzaXplIG5lZWQgZmVlZGJhY2sgZnJvbSBBTUQgKi8KKyNkZWZpbmUgUl8wMDAxMDBfTUNfUFQwX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAKKyNkZWZpbmUgICBTXzAwMDEwMF9FTkFCTEVfUFQoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDEwMF9FTkFCTEVfUFQoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDEwMF9FTkFCTEVfUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lICAgU18wMDAxMDBfRUZGRUNUSVZFX0wyX0NBQ0hFX1NJWkUoeCkgICAgICAgICAgKCgoeCkgJiAweDcpIDw8IDE1KQorI2RlZmluZSAgIEdfMDAwMTAwX0VGRkVDVElWRV9MMl9DQUNIRV9TSVpFKHgpICAgICAgICAgICgoKHgpID4+IDE1KSAmIDB4NykKKyNkZWZpbmUgICBDXzAwMDEwMF9FRkZFQ1RJVkVfTDJfQ0FDSEVfU0laRSAgICAgICAgICAgICAweEZGRkM3RkZGCisjZGVmaW5lICAgU18wMDAxMDBfRUZGRUNUSVZFX0wyX1FVRVVFX1NJWkUoeCkgICAgICAgICAgKCgoeCkgJiAweDcpIDw8IDIxKQorI2RlZmluZSAgIEdfMDAwMTAwX0VGRkVDVElWRV9MMl9RVUVVRV9TSVpFKHgpICAgICAgICAgICgoKHgpID4+IDIxKSAmIDB4NykKKyNkZWZpbmUgICBDXzAwMDEwMF9FRkZFQ1RJVkVfTDJfUVVFVUVfU0laRSAgICAgICAgICAgICAweEZGMUZGRkZGCisjZGVmaW5lICAgU18wMDAxMDBfSU5WQUxJREFURV9BTExfTDFfVExCUyh4KSAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQorI2RlZmluZSAgIEdfMDAwMTAwX0lOVkFMSURBVEVfQUxMX0wxX1RMQlMoeCkgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDEwMF9JTlZBTElEQVRFX0FMTF9MMV9UTEJTICAgICAgICAgICAgICAweEVGRkZGRkZGCisjZGVmaW5lICAgU18wMDAxMDBfSU5WQUxJREFURV9MMl9DQUNIRSh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI5KQorI2RlZmluZSAgIEdfMDAwMTAwX0lOVkFMSURBVEVfTDJfQ0FDSEUoeCkgICAgICAgICAgICAgICgoKHgpID4+IDI5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDEwMF9JTlZBTElEQVRFX0wyX0NBQ0hFICAgICAgICAgICAgICAgICAweERGRkZGRkZGCisjZGVmaW5lIFJfMDAwMTAyX01DX1BUMF9DT05URVhUMF9DTlRMICAgICAgICAgICAgICAgIDB4MDAwMTAyCisjZGVmaW5lICAgU18wMDAxMDJfRU5BQkxFX1BBR0VfVEFCTEUoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDAxMDJfRU5BQkxFX1BBR0VfVEFCTEUoeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAxMDJfRU5BQkxFX1BBR0VfVEFCTEUgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDAwMTAyX1BBR0VfVEFCTEVfREVQVEgoeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAxKQorI2RlZmluZSAgIEdfMDAwMTAyX1BBR0VfVEFCTEVfREVQVEgoeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDEpICYgMHgzKQorI2RlZmluZSAgIENfMDAwMTAyX1BBR0VfVEFCTEVfREVQVEggICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjkKKyNkZWZpbmUgICBWXzAwMDEwMl9QQUdFX1RBQkxFX0ZMQVQgICAgICAgICAgICAgICAgICAgICAwCisvKiBSNjAwIGRvY3VtZW50YXRpb24gc3VnZ2VzdCB0aGF0IHRoaXMgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHBhZ2VzICovCisjZGVmaW5lIFJfMDAwMTEyX01DX1BUMF9TWVNURU1fQVBFUlRVUkVfTE9XX0FERFIgICAgIDB4MDAwMTEyCisjZGVmaW5lIFJfMDAwMTE0X01DX1BUMF9TWVNURU1fQVBFUlRVUkVfSElHSF9BRERSICAgIDB4MDAwMTE0CisjZGVmaW5lIFJfMDAwMTFDX01DX1BUMF9DT05URVhUMF9ERUZBVUxUX1JFQURfQUREUiAgIDB4MDAwMTFDCisjZGVmaW5lIFJfMDAwMTJDX01DX1BUMF9DT05URVhUMF9GTEFUX0JBU0VfQUREUiAgICAgIDB4MDAwMTJDCisjZGVmaW5lIFJfMDAwMTNDX01DX1BUMF9DT05URVhUMF9GTEFUX1NUQVJUX0FERFIgICAgIDB4MDAwMTNDCisjZGVmaW5lIFJfMDAwMTRDX01DX1BUMF9DT05URVhUMF9GTEFUX0VORF9BRERSICAgICAgIDB4MDAwMTRDCisjZGVmaW5lIFJfMDAwMTZDX01DX1BUMF9DTElFTlQwX0NOVEwgICAgICAgICAgICAgICAgIDB4MDAwMTZDCisjZGVmaW5lICAgU18wMDAxNkNfRU5BQkxFX1RSQU5TTEFUSU9OX01PREVfT1ZFUlJJREUoeCkgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDAxNkNfRU5BQkxFX1RSQU5TTEFUSU9OX01PREVfT1ZFUlJJREUoeCkgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAxNkNfRU5BQkxFX1RSQU5TTEFUSU9OX01PREVfT1ZFUlJJREUgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDAwMTZDX1RSQU5TTEFUSU9OX01PREVfT1ZFUlJJREUoeCkgICAgICAgICgoKHgpICYgMHgxKSA8PCAxKQorI2RlZmluZSAgIEdfMDAwMTZDX1RSQU5TTEFUSU9OX01PREVfT1ZFUlJJREUoeCkgICAgICAgICgoKHgpID4+IDEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMTZDX1RSQU5TTEFUSU9OX01PREVfT1ZFUlJJREUgICAgICAgICAgIDB4RkZGRkZGRkQKKyNkZWZpbmUgICBTXzAwMDE2Q19TWVNURU1fQUNDRVNTX01PREVfTUFTSyh4KSAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgOCkKKyNkZWZpbmUgICBHXzAwMDE2Q19TWVNURU1fQUNDRVNTX01PREVfTUFTSyh4KSAgICAgICAgICAoKCh4KSA+PiA4KSAmIDB4MykKKyNkZWZpbmUgICBDXzAwMDE2Q19TWVNURU1fQUNDRVNTX01PREVfTUFTSyAgICAgICAgICAgICAweEZGRkZGQ0ZGCisjZGVmaW5lICAgVl8wMDAxNkNfU1lTVEVNX0FDQ0VTU19NT0RFX1BBX09OTFkgICAgICAgICAgMAorI2RlZmluZSAgIFZfMDAwMTZDX1NZU1RFTV9BQ0NFU1NfTU9ERV9VU0VfU1lTX01BUCAgICAgIDEKKyNkZWZpbmUgICBWXzAwMDE2Q19TWVNURU1fQUNDRVNTX01PREVfSU5fU1lTICAgICAgICAgICAyCisjZGVmaW5lICAgVl8wMDAxNkNfU1lTVEVNX0FDQ0VTU19NT0RFX05PVF9JTl9TWVMgICAgICAgMworI2RlZmluZSAgIFNfMDAwMTZDX1NZU1RFTV9BUEVSVFVSRV9VTk1BUFBFRF9BQ0NFU1MoeCkgICgoKHgpICYgMHgxKSA8PCAxMCkKKyNkZWZpbmUgICBHXzAwMDE2Q19TWVNURU1fQVBFUlRVUkVfVU5NQVBQRURfQUNDRVNTKHgpICAoKCh4KSA+PiAxMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAxNkNfU1lTVEVNX0FQRVJUVVJFX1VOTUFQUEVEX0FDQ0VTUyAgICAgMHhGRkZGRkJGRgorI2RlZmluZSAgIFZfMDAwMTZDX1NZU1RFTV9BUEVSVFVSRV9VTk1BUFBFRF9QQVNTVEhST1VHSCAgMAorI2RlZmluZSAgIFZfMDAwMTZDX1NZU1RFTV9BUEVSVFVSRV9VTk1BUFBFRF9ERUZBVUxUX1BBR0UgMQorI2RlZmluZSAgIFNfMDAwMTZDX0VGRkVDVElWRV9MMV9DQUNIRV9TSVpFKHgpICAgICAgICAgICgoKHgpICYgMHg3KSA8PCAxMSkKKyNkZWZpbmUgICBHXzAwMDE2Q19FRkZFQ1RJVkVfTDFfQ0FDSEVfU0laRSh4KSAgICAgICAgICAoKCh4KSA+PiAxMSkgJiAweDcpCisjZGVmaW5lICAgQ18wMDAxNkNfRUZGRUNUSVZFX0wxX0NBQ0hFX1NJWkUgICAgICAgICAgICAgMHhGRkZGQzdGRgorI2RlZmluZSAgIFNfMDAwMTZDX0VOQUJMRV9GUkFHTUVOVF9QUk9DRVNTSU5HKHgpICAgICAgICgoKHgpICYgMHgxKSA8PCAxNCkKKyNkZWZpbmUgICBHXzAwMDE2Q19FTkFCTEVfRlJBR01FTlRfUFJPQ0VTU0lORyh4KSAgICAgICAoKCh4KSA+PiAxNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAxNkNfRU5BQkxFX0ZSQUdNRU5UX1BST0NFU1NJTkcgICAgICAgICAgMHhGRkZGQkZGRgorI2RlZmluZSAgIFNfMDAwMTZDX0VGRkVDVElWRV9MMV9RVUVVRV9TSVpFKHgpICAgICAgICAgICgoKHgpICYgMHg3KSA8PCAxNSkKKyNkZWZpbmUgICBHXzAwMDE2Q19FRkZFQ1RJVkVfTDFfUVVFVUVfU0laRSh4KSAgICAgICAgICAoKCh4KSA+PiAxNSkgJiAweDcpCisjZGVmaW5lICAgQ18wMDAxNkNfRUZGRUNUSVZFX0wxX1FVRVVFX1NJWkUgICAgICAgICAgICAgMHhGRkZDN0ZGRgorI2RlZmluZSAgIFNfMDAwMTZDX0lOVkFMSURBVEVfTDFfVExCKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMCkKKyNkZWZpbmUgICBHXzAwMDE2Q19JTlZBTElEQVRFX0wxX1RMQih4KSAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAxNkNfSU5WQUxJREFURV9MMV9UTEIgICAgICAgICAgICAgICAgICAgMHhGRkVGRkZGRgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2OTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2OTAuYwppbmRleCAwZjU4NWNhLi4wMjVlMzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjkwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczY5MC5jCkBAIC0yNiwxMDYgKzI2LDI5IEBACiAgKiAgICAgICAgICBKZXJvbWUgR2xpc3NlCiAgKi8KICNpbmNsdWRlICJkcm1QLmgiCi0jaW5jbHVkZSAicmFkZW9uX3JlZy5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgotI2luY2x1ZGUgInJzNjkwci5oIgogI2luY2x1ZGUgImF0b20uaCIKLSNpbmNsdWRlICJhdG9tLWJpdHMuaCIKKyNpbmNsdWRlICJyczY5MGQuaCIKIAotLyogcnM2OTAscnM3NDAgZGVwZW5kcyBvbiA6ICovCi12b2lkIHIxMDBfaGRwX3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWludCByMzAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByNDIwX3BpcGVzX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczQwMF9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJzNDAwX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgcnM0MDBfZ2FydF9hZGp1c3Rfc2l6ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHJzNjAwX21jX2Rpc2FibGVfY2xpZW50cyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci12b2lkIHJzNjAwX2Rpc2FibGVfdmdhKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQotLyogVGhpcyBmaWxlcyBnYXRoZXIgZnVuY3Rpb25zIHNwZWNpZmljcyB0byA6Ci0gKiByczY5MCxyczc0MAotICoKLSAqIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IGJlIHVzZWQgYnkgbmV3ZXIgQVNJQ3MuCi0gKi8KLXZvaWQgcnM2OTBfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHJzNjkwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotCi0KLS8qCi0gKiBNQyBmdW5jdGlvbnMuCi0gKi8KLWludCByczY5MF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCXVpbnQzMl90IHRtcDsKLQlpbnQgcjsKLQotCWlmIChyMTAwX2RlYnVnZnNfcmJibV9pbml0KHJkZXYpKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGRlYnVnZnMgZmlsZSBmb3IgUkJCTSAhXG4iKTsKLQl9Ci0KLQlyczY5MF9ncHVfaW5pdChyZGV2KTsKLQlyczQwMF9nYXJ0X2Rpc2FibGUocmRldik7Ci0KLQkvKiBTZXR1cCBHUFUgbWVtb3J5IHNwYWNlICovCi0JcmRldi0+bWMuZ3R0X2xvY2F0aW9uID0gcmRldi0+bWMubWNfdnJhbV9zaXplOwotCXJkZXYtPm1jLmd0dF9sb2NhdGlvbiArPSAocmRldi0+bWMuZ3R0X3NpemUgLSAxKTsKLQlyZGV2LT5tYy5ndHRfbG9jYXRpb24gJj0gfihyZGV2LT5tYy5ndHRfc2l6ZSAtIDEpOwotCXJkZXYtPm1jLnZyYW1fbG9jYXRpb24gPSAweEZGRkZGRkZGVUw7Ci0JciA9IHJhZGVvbl9tY19zZXR1cChyZGV2KTsKLQlpZiAocikgewotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKiBQcm9ncmFtIEdQVSBtZW1vcnkgc3BhY2UgKi8KLQlyczYwMF9tY19kaXNhYmxlX2NsaWVudHMocmRldik7Ci0JaWYgKHJzNjkwX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIHdhaXQgTUMgaWRsZSB3aGlsZSAiCi0JCSAgICAgICAicHJvZ3JhbW1pbmcgcGlwZXMuIEJhZCB0aGluZ3MgbWlnaHQgaGFwcGVuLlxuIik7Ci0JfQotCXRtcCA9IHJkZXYtPm1jLnZyYW1fbG9jYXRpb24gKyByZGV2LT5tYy5tY192cmFtX3NpemUgLSAxOwotCXRtcCA9IFJFR19TRVQoUlM2OTBfTUNfRkJfVE9QLCB0bXAgPj4gMTYpOwotCXRtcCB8PSBSRUdfU0VUKFJTNjkwX01DX0ZCX1NUQVJULCByZGV2LT5tYy52cmFtX2xvY2F0aW9uID4+IDE2KTsKLQlXUkVHMzJfTUMoUlM2OTBfTUNDRkdfRkJfTE9DQVRJT04sIHRtcCk7Ci0JLyogRklYTUU6IERvZXMgdGhpcyByZWcgZXhpc3Qgb24gUlM0ODAsUlM3NDAgPyAqLwotCVdSRUczMigweDMxMCwgcmRldi0+bWMudnJhbV9sb2NhdGlvbik7Ci0JV1JFRzMyKFJTNjkwX0hEUF9GQl9MT0NBVElPTiwgcmRldi0+bWMudnJhbV9sb2NhdGlvbiA+PiAxNik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcnM2OTBfbWNfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLX0KLQotCi0vKgotICogR2xvYmFsIEdQVSBmdW5jdGlvbnMKLSAqLwotaW50IHJzNjkwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgaW50IHJzNjkwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdW5zaWduZWQgaTsKIAl1aW50MzJfdCB0bXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmRldi0+dXNlY190aW1lb3V0OyBpKyspIHsKIAkJLyogcmVhZCBNQ19TVEFUVVMgKi8KLQkJdG1wID0gUlJFRzMyX01DKFJTNjkwX01DX1NUQVRVUyk7Ci0JCWlmICh0bXAgJiBSUzY5MF9NQ19TVEFUVVNfSURMRSkgeworCQl0bXAgPSBSUkVHMzJfTUMoUl8wMDAwOTBfTUNfU1lTVEVNX1NUQVRVUyk7CisJCWlmIChHXzAwMDA5MF9NQ19TWVNURU1fSURMRSh0bXApKQogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJRFJNX1VERUxBWSgxKTsKKwkJdWRlbGF5KDEpOwogCX0KIAlyZXR1cm4gLTE7CiB9CiAKLXZvaWQgcnM2OTBfZXJyYXRhKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCXJkZXYtPnBsbF9lcnJhdGEgPSAwOwotfQotCi12b2lkIHJzNjkwX2dwdV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQorc3RhdGljIHZvaWQgcnM2OTBfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJLyogRklYTUU6IEhEUCBzYW1lIHBsYWNlIG9uIHJzNjkwID8gKi8KIAlyMTAwX2hkcF9yZXNldChyZGV2KTsKLQlyczYwMF9kaXNhYmxlX3ZnYShyZGV2KTsKIAkvKiBGSVhNRTogaXMgdGhpcyBjb3JyZWN0ID8gKi8KIAlyNDIwX3BpcGVzX2luaXQocmRldik7CiAJaWYgKHJzNjkwX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKQEAgLTEzNCwxMCArNTcsNiBAQAogCX0KIH0KIAotCi0vKgotICogVlJBTSBpbmZvLgotICovCiB2b2lkIHJzNjkwX3BtX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgSW50ZWdyYXRlZFN5c3RlbUluZm8pOwpAQCAtMjUxLDM5ICsxNzAsMzkgQEAKIAkvKgogCSAqIExpbmUgQnVmZmVyIFNldHVwCiAJICogVGhlcmUgaXMgYSBzaW5nbGUgbGluZSBidWZmZXIgc2hhcmVkIGJ5IGJvdGggZGlzcGxheSBjb250cm9sbGVycy4KLQkgKiBEQ19MQl9NRU1PUllfU1BMSVQgY29udHJvbHMgaG93IHRoYXQgbGluZSBidWZmZXIgaXMgc2hhcmVkIGJldHdlZW4KKwkgKiBSXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVQgY29udHJvbHMgaG93IHRoYXQgbGluZSBidWZmZXIgaXMgc2hhcmVkIGJldHdlZW4KIAkgKiB0aGUgZGlzcGxheSBjb250cm9sbGVycy4gIFRoZSBwYXJpdGlvbmluZyBjYW4gZWl0aGVyIGJlIGRvbmUKIAkgKiBtYW51YWxseSBvciB2aWEgb25lIG9mIGZvdXIgcHJlc2V0IGFsbG9jYXRpb25zIHNwZWNpZmllZCBpbiBiaXRzIDE6MDoKIAkgKiAgMCAtIGxpbmUgYnVmZmVyIGlzIGRpdmlkZWQgaW4gaGFsZiBhbmQgc2hhcmVkIGJldHdlZW4gY3J0YwogCSAqICAxIC0gRDEgZ2V0cyAzLzQgb2YgdGhlIGxpbmUgYnVmZmVyLCBEMiBnZXRzIDEvNAogCSAqICAyIC0gRDEgZ2V0cyB0aGUgd2hvbGUgYnVmZmVyCiAJICogIDMgLSBEMSBnZXRzIDEvNCBvZiB0aGUgbGluZSBidWZmZXIsIEQyIGdldHMgMy80Ci0JICogU2V0dGluZyBiaXQgMiBvZiBEQ19MQl9NRU1PUllfU1BMSVQgY29udHJvbHMgc3dpdGNoZXMgdG8gbWFudWFsCisJICogU2V0dGluZyBiaXQgMiBvZiBSXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVQgY29udHJvbHMgc3dpdGNoZXMgdG8gbWFudWFsCiAJICogYWxsb2NhdGlvbiBtb2RlLiBJbiBtYW51YWwgYWxsb2NhdGlvbiBtb2RlLCBEMSBhbHdheXMgc3RhcnRzIGF0IDAsCiAJICogRDEgZW5kLzIgaXMgc3BlY2lmaWVkIGluIGJpdHMgMTQ6NDsgRDIgYWxsb2NhdGlvbiBmb2xsb3dzIEQxLgogCSAqLwotCXRtcCA9IFJSRUczMihEQ19MQl9NRU1PUllfU1BMSVQpICYgfkRDX0xCX01FTU9SWV9TUExJVF9NQVNLOwotCXRtcCAmPSB+RENfTEJfTUVNT1JZX1NQTElUX1NISUZUX01PREU7CisJdG1wID0gUlJFRzMyKFJfMDA2NTIwX0RDX0xCX01FTU9SWV9TUExJVCkgJiBDXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVQ7CisJdG1wICY9IH5DXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVRfTU9ERTsKIAkvKiBhdXRvICovCiAJaWYgKG1vZGUxICYmIG1vZGUyKSB7CiAJCWlmIChtb2RlMS0+aGRpc3BsYXkgPiBtb2RlMi0+aGRpc3BsYXkpIHsKIAkJCWlmIChtb2RlMS0+aGRpc3BsYXkgPiAyNTYwKQotCQkJCXRtcCB8PSBEQ19MQl9NRU1PUllfU1BMSVRfRDFfM1FfRDJfMVE7CisJCQkJdG1wIHw9IFZfMDA2NTIwX0RDX0xCX01FTU9SWV9TUExJVF9EMV8zUV9EMl8xUTsKIAkJCWVsc2UKLQkJCQl0bXAgfD0gRENfTEJfTUVNT1JZX1NQTElUX0QxSEFMRl9EMkhBTEY7CisJCQkJdG1wIHw9IFZfMDA2NTIwX0RDX0xCX01FTU9SWV9TUExJVF9EMUhBTEZfRDJIQUxGOwogCQl9IGVsc2UgaWYgKG1vZGUyLT5oZGlzcGxheSA+IG1vZGUxLT5oZGlzcGxheSkgewogCQkJaWYgKG1vZGUyLT5oZGlzcGxheSA+IDI1NjApCi0JCQkJdG1wIHw9IERDX0xCX01FTU9SWV9TUExJVF9EMV8xUV9EMl8zUTsKKwkJCQl0bXAgfD0gVl8wMDY1MjBfRENfTEJfTUVNT1JZX1NQTElUX0QxXzFRX0QyXzNROwogCQkJZWxzZQotCQkJCXRtcCB8PSBEQ19MQl9NRU1PUllfU1BMSVRfRDFIQUxGX0QySEFMRjsKKwkJCQl0bXAgfD0gVl8wMDY1MjBfRENfTEJfTUVNT1JZX1NQTElUX0QxSEFMRl9EMkhBTEY7CiAJCX0gZWxzZQotCQkJdG1wIHw9IEFWSVZPX0RDX0xCX01FTU9SWV9TUExJVF9EMUhBTEZfRDJIQUxGOworCQkJdG1wIHw9IFZfMDA2NTIwX0RDX0xCX01FTU9SWV9TUExJVF9EMUhBTEZfRDJIQUxGOwogCX0gZWxzZSBpZiAobW9kZTEpIHsKLQkJdG1wIHw9IERDX0xCX01FTU9SWV9TUExJVF9EMV9PTkxZOworCQl0bXAgfD0gVl8wMDY1MjBfRENfTEJfTUVNT1JZX1NQTElUX0QxX09OTFk7CiAJfSBlbHNlIGlmIChtb2RlMikgewotCQl0bXAgfD0gRENfTEJfTUVNT1JZX1NQTElUX0QxXzFRX0QyXzNROworCQl0bXAgfD0gVl8wMDY1MjBfRENfTEJfTUVNT1JZX1NQTElUX0QxXzFRX0QyXzNROwogCX0KLQlXUkVHMzIoRENfTEJfTUVNT1JZX1NQTElULCB0bXApOworCVdSRUczMihSXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVQsIHRtcCk7CiB9CiAKIHN0cnVjdCByczY5MF93YXRlcm1hcmsgewpAQCAtNDg4LDI4ICs0MDcsMjggQEAKIAkgKiBvcHRpb24uCiAJICovCiAJaWYgKHJkZXYtPmRpc3BfcHJpb3JpdHkgPT0gMikgewotCQl0bXAgPSBSUkVHMzJfTUMoTUNfSU5JVF9NSVNDX0xBVF9USU1FUik7Ci0JCXRtcCAmPSB+TUNfRElTUDFSX0lOSVRfTEFUX01BU0s7Ci0JCXRtcCAmPSB+TUNfRElTUDBSX0lOSVRfTEFUX01BU0s7Ci0JCWlmIChtb2RlMSkKLQkJCXRtcCB8PSAoMSA8PCBNQ19ESVNQMVJfSU5JVF9MQVRfU0hJRlQpOworCQl0bXAgPSBSUkVHMzJfTUMoUl8wMDAxMDRfTUNfSU5JVF9NSVNDX0xBVF9USU1FUik7CisJCXRtcCAmPSBDXzAwMDEwNF9NQ19ESVNQMFJfSU5JVF9MQVQ7CisJCXRtcCAmPSBDXzAwMDEwNF9NQ19ESVNQMVJfSU5JVF9MQVQ7CiAJCWlmIChtb2RlMCkKLQkJCXRtcCB8PSAoMSA8PCBNQ19ESVNQMFJfSU5JVF9MQVRfU0hJRlQpOwotCQlXUkVHMzJfTUMoTUNfSU5JVF9NSVNDX0xBVF9USU1FUiwgdG1wKTsKKwkJCXRtcCB8PSBTXzAwMDEwNF9NQ19ESVNQMFJfSU5JVF9MQVQoMSk7CisJCWlmIChtb2RlMSkKKwkJCXRtcCB8PSBTXzAwMDEwNF9NQ19ESVNQMVJfSU5JVF9MQVQoMSk7CisJCVdSRUczMl9NQyhSXzAwMDEwNF9NQ19JTklUX01JU0NfTEFUX1RJTUVSLCB0bXApOwogCX0KIAlyczY5MF9saW5lX2J1ZmZlcl9hZGp1c3QocmRldiwgbW9kZTAsIG1vZGUxKTsKIAogCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlM2OTApIHx8IChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzc0MCkpCi0JCVdSRUczMihEQ1BfQ09OVFJPTCwgMCk7CisJCVdSRUczMihSXzAwNkM5Q19EQ1BfQ09OVFJPTCwgMCk7CiAJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzc4MCkgfHwgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTODgwKSkKLQkJV1JFRzMyKERDUF9DT05UUk9MLCAyKTsKKwkJV1JFRzMyKFJfMDA2QzlDX0RDUF9DT05UUk9MLCAyKTsKIAogCXJzNjkwX2NydGNfYmFuZHdpZHRoX2NvbXB1dGUocmRldiwgcmRldi0+bW9kZV9pbmZvLmNydGNzWzBdLCAmd20wKTsKIAlyczY5MF9jcnRjX2JhbmR3aWR0aF9jb21wdXRlKHJkZXYsIHJkZXYtPm1vZGVfaW5mby5jcnRjc1sxXSwgJndtMSk7CiAKIAl0bXAgPSAod20wLmxiX3JlcXVlc3RfZmlmb19kZXB0aCAtIDEpOwogCXRtcCB8PSAod20xLmxiX3JlcXVlc3RfZmlmb19kZXB0aCAtIDEpIDw8IDE2OwotCVdSRUczMihMQl9NQVhfUkVRX09VVFNUQU5ESU5HLCB0bXApOworCVdSRUczMihSXzAwNkQ1OF9MQl9NQVhfUkVRX09VVFNUQU5ESU5HLCB0bXApOwogCiAJaWYgKG1vZGUwICYmIG1vZGUxKSB7CiAJCWlmIChyZml4ZWRfdHJ1bmMod20wLmRicHApID4gNjQpCkBAIC01NjIsMTAgKzQ4MSwxMCBAQAogCQkJcHJpb3JpdHlfbWFyazEyLmZ1bGwgPSAwOwogCQlpZiAod20xLnByaW9yaXR5X21hcmtfbWF4LmZ1bGwgPiBwcmlvcml0eV9tYXJrMTIuZnVsbCkKIAkJCXByaW9yaXR5X21hcmsxMi5mdWxsID0gd20xLnByaW9yaXR5X21hcmtfbWF4LmZ1bGw7Ci0JCVdSRUczMihEMU1PREVfUFJJT1JJVFlfQV9DTlQsIHJmaXhlZF90cnVuYyhwcmlvcml0eV9tYXJrMDIpKTsKLQkJV1JFRzMyKEQxTU9ERV9QUklPUklUWV9CX0NOVCwgcmZpeGVkX3RydW5jKHByaW9yaXR5X21hcmswMikpOwotCQlXUkVHMzIoRDJNT0RFX1BSSU9SSVRZX0FfQ05ULCByZml4ZWRfdHJ1bmMocHJpb3JpdHlfbWFyazEyKSk7Ci0JCVdSRUczMihEMk1PREVfUFJJT1JJVFlfQl9DTlQsIHJmaXhlZF90cnVuYyhwcmlvcml0eV9tYXJrMTIpKTsKKwkJV1JFRzMyKFJfMDA2NTQ4X0QxTU9ERV9QUklPUklUWV9BX0NOVCwgcmZpeGVkX3RydW5jKHByaW9yaXR5X21hcmswMikpOworCQlXUkVHMzIoUl8wMDY1NENfRDFNT0RFX1BSSU9SSVRZX0JfQ05ULCByZml4ZWRfdHJ1bmMocHJpb3JpdHlfbWFyazAyKSk7CisJCVdSRUczMihSXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfQV9DTlQsIHJmaXhlZF90cnVuYyhwcmlvcml0eV9tYXJrMTIpKTsKKwkJV1JFRzMyKFJfMDA2RDRDX0QyTU9ERV9QUklPUklUWV9CX0NOVCwgcmZpeGVkX3RydW5jKHByaW9yaXR5X21hcmsxMikpOwogCX0gZWxzZSBpZiAobW9kZTApIHsKIAkJaWYgKHJmaXhlZF90cnVuYyh3bTAuZGJwcCkgPiA2NCkKIAkJCWEuZnVsbCA9IHJmaXhlZF9tdWwod20wLmRicHAsIHdtMC5udW1fbGluZV9wYWlyKTsKQEAgLTU5MiwxMCArNTExLDEyIEBACiAJCQlwcmlvcml0eV9tYXJrMDIuZnVsbCA9IDA7CiAJCWlmICh3bTAucHJpb3JpdHlfbWFya19tYXguZnVsbCA+IHByaW9yaXR5X21hcmswMi5mdWxsKQogCQkJcHJpb3JpdHlfbWFyazAyLmZ1bGwgPSB3bTAucHJpb3JpdHlfbWFya19tYXguZnVsbDsKLQkJV1JFRzMyKEQxTU9ERV9QUklPUklUWV9BX0NOVCwgcmZpeGVkX3RydW5jKHByaW9yaXR5X21hcmswMikpOwotCQlXUkVHMzIoRDFNT0RFX1BSSU9SSVRZX0JfQ05ULCByZml4ZWRfdHJ1bmMocHJpb3JpdHlfbWFyazAyKSk7Ci0JCVdSRUczMihEMk1PREVfUFJJT1JJVFlfQV9DTlQsIE1PREVfUFJJT1JJVFlfT0ZGKTsKLQkJV1JFRzMyKEQyTU9ERV9QUklPUklUWV9CX0NOVCwgTU9ERV9QUklPUklUWV9PRkYpOworCQlXUkVHMzIoUl8wMDY1NDhfRDFNT0RFX1BSSU9SSVRZX0FfQ05ULCByZml4ZWRfdHJ1bmMocHJpb3JpdHlfbWFyazAyKSk7CisJCVdSRUczMihSXzAwNjU0Q19EMU1PREVfUFJJT1JJVFlfQl9DTlQsIHJmaXhlZF90cnVuYyhwcmlvcml0eV9tYXJrMDIpKTsKKwkJV1JFRzMyKFJfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX0NOVCwKKwkJCVNfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX09GRigxKSk7CisJCVdSRUczMihSXzAwNkQ0Q19EMk1PREVfUFJJT1JJVFlfQl9DTlQsCisJCQlTXzAwNkQ0Q19EMk1PREVfUFJJT1JJVFlfQl9PRkYoMSkpOwogCX0gZWxzZSB7CiAJCWlmIChyZml4ZWRfdHJ1bmMod20xLmRicHApID4gNjQpCiAJCQlhLmZ1bGwgPSByZml4ZWRfbXVsKHdtMS5kYnBwLCB3bTEubnVtX2xpbmVfcGFpcik7CkBAIC02MjIsMzAgKzU0MywyMDMgQEAKIAkJCXByaW9yaXR5X21hcmsxMi5mdWxsID0gMDsKIAkJaWYgKHdtMS5wcmlvcml0eV9tYXJrX21heC5mdWxsID4gcHJpb3JpdHlfbWFyazEyLmZ1bGwpCiAJCQlwcmlvcml0eV9tYXJrMTIuZnVsbCA9IHdtMS5wcmlvcml0eV9tYXJrX21heC5mdWxsOwotCQlXUkVHMzIoRDFNT0RFX1BSSU9SSVRZX0FfQ05ULCBNT0RFX1BSSU9SSVRZX09GRik7Ci0JCVdSRUczMihEMU1PREVfUFJJT1JJVFlfQl9DTlQsIE1PREVfUFJJT1JJVFlfT0ZGKTsKLQkJV1JFRzMyKEQyTU9ERV9QUklPUklUWV9BX0NOVCwgcmZpeGVkX3RydW5jKHByaW9yaXR5X21hcmsxMikpOwotCQlXUkVHMzIoRDJNT0RFX1BSSU9SSVRZX0JfQ05ULCByZml4ZWRfdHJ1bmMocHJpb3JpdHlfbWFyazEyKSk7CisJCVdSRUczMihSXzAwNjU0OF9EMU1PREVfUFJJT1JJVFlfQV9DTlQsCisJCQlTXzAwNjU0OF9EMU1PREVfUFJJT1JJVFlfQV9PRkYoMSkpOworCQlXUkVHMzIoUl8wMDY1NENfRDFNT0RFX1BSSU9SSVRZX0JfQ05ULAorCQkJU18wMDY1NENfRDFNT0RFX1BSSU9SSVRZX0JfT0ZGKDEpKTsKKwkJV1JFRzMyKFJfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX0NOVCwgcmZpeGVkX3RydW5jKHByaW9yaXR5X21hcmsxMikpOworCQlXUkVHMzIoUl8wMDZENENfRDJNT0RFX1BSSU9SSVRZX0JfQ05ULCByZml4ZWRfdHJ1bmMocHJpb3JpdHlfbWFyazEyKSk7CiAJfQogfQogCi0vKgotICogSW5kaXJlY3QgcmVnaXN0ZXJzIGFjY2Vzc29yCi0gKi8KIHVpbnQzMl90IHJzNjkwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZykKIHsKIAl1aW50MzJfdCByOwogCi0JV1JFRzMyKFJTNjkwX01DX0lOREVYLCAocmVnICYgUlM2OTBfTUNfSU5ERVhfTUFTSykpOwotCXIgPSBSUkVHMzIoUlM2OTBfTUNfREFUQSk7Ci0JV1JFRzMyKFJTNjkwX01DX0lOREVYLCBSUzY5MF9NQ19JTkRFWF9NQVNLKTsKKwlXUkVHMzIoUl8wMDAwNzhfTUNfSU5ERVgsIFNfMDAwMDc4X01DX0lORF9BRERSKHJlZykpOworCXIgPSBSUkVHMzIoUl8wMDAwN0NfTUNfREFUQSk7CisJV1JFRzMyKFJfMDAwMDc4X01DX0lOREVYLCB+Q18wMDAwNzhfTUNfSU5EX0FERFIpOwogCXJldHVybiByOwogfQogCiB2b2lkIHJzNjkwX21jX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdikKIHsKLQlXUkVHMzIoUlM2OTBfTUNfSU5ERVgsCi0JICAgICAgIFJTNjkwX01DX0lOREVYX1dSX0VOIHwgKChyZWcpICYgUlM2OTBfTUNfSU5ERVhfTUFTSykpOwotCVdSRUczMihSUzY5MF9NQ19EQVRBLCB2KTsKLQlXUkVHMzIoUlM2OTBfTUNfSU5ERVgsIFJTNjkwX01DX0lOREVYX1dSX0FDSyk7CisJV1JFRzMyKFJfMDAwMDc4X01DX0lOREVYLCBTXzAwMDA3OF9NQ19JTkRfQUREUihyZWcpIHwKKwkJU18wMDAwNzhfTUNfSU5EX1dSX0VOKDEpKTsKKwlXUkVHMzIoUl8wMDAwN0NfTUNfREFUQSwgdik7CisJV1JFRzMyKFJfMDAwMDc4X01DX0lOREVYLCAweDdGKTsKK30KKwordm9pZCByczY5MF9tY19wcm9ncmFtKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCBydjUxNV9tY19zYXZlIHNhdmU7CisKKwkvKiBTdG9wcyBhbGwgbWMgY2xpZW50cyAqLworCXJ2NTE1X21jX3N0b3AocmRldiwgJnNhdmUpOworCisJLyogV2FpdCBmb3IgbWMgaWRsZSAqLworCWlmIChyczY5MF9tY193YWl0X2Zvcl9pZGxlKHJkZXYpKQorCQlkZXZfd2FybihyZGV2LT5kZXYsICJXYWl0IE1DIGlkbGUgdGltZW91dCBiZWZvcmUgdXBkYXRpbmcgTUMuXG4iKTsKKwkvKiBQcm9ncmFtIE1DLCBzaG91bGQgYmUgYSAzMmJpdHMgbGltaXRlZCBhZGRyZXNzIHNwYWNlICovCisJV1JFRzMyX01DKFJfMDAwMTAwX01DQ0ZHX0ZCX0xPQ0FUSU9OLAorCQkJU18wMDAxMDBfTUNfRkJfU1RBUlQocmRldi0+bWMudnJhbV9zdGFydCA+PiAxNikgfAorCQkJU18wMDAxMDBfTUNfRkJfVE9QKHJkZXYtPm1jLnZyYW1fZW5kID4+IDE2KSk7CisJV1JFRzMyKFJfMDAwMTM0X0hEUF9GQl9MT0NBVElPTiwKKwkJU18wMDAxMzRfSERQX0ZCX1NUQVJUKHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTYpKTsKKworCXJ2NTE1X21jX3Jlc3VtZShyZGV2LCAmc2F2ZSk7Cit9CisKK3N0YXRpYyBpbnQgcnM2OTBfc3RhcnR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcjsKKworCXJzNjkwX21jX3Byb2dyYW0ocmRldik7CisJLyogUmVzdW1lIGNsb2NrICovCisJcnY1MTVfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdQVSBjb25maWd1cmF0aW9uICgjIHBpcGVzLCAuLi4pICovCisJcnM2OTBfZ3B1X2luaXQocmRldik7CisJLyogSW5pdGlhbGl6ZSBHQVJUIChpbml0aWFsaXplIGFmdGVyIFRUTSBzbyB3ZSBjYW4gYWxsb2NhdGUKKwkgKiBtZW1vcnkgdGhyb3VnaCBUVE0gYnV0IGZpbmFsaXplIGFmdGVyIFRUTSkgKi8KKwlyID0gcnM0MDBfZ2FydF9lbmFibGUocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCS8qIEVuYWJsZSBJUlEgKi8KKwlyZGV2LT5pcnEuc3dfaW50ID0gdHJ1ZTsKKwlyczYwMF9pcnFfc2V0KHJkZXYpOworCS8qIDFNIHJpbmcgYnVmZmVyICovCisJciA9IHIxMDBfY3BfaW5pdChyZGV2LCAxMDI0ICogMTAyNCk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJmYWlsbGVkIGluaXRpYWxpemluZyBDUCAoJWQpLlxuIiwgcik7CisJCXJldHVybiByOworCX0KKwlyID0gcjEwMF93Yl9pbml0KHJkZXYpOworCWlmIChyKQorCQlkZXZfZXJyKHJkZXYtPmRldiwgImZhaWxsZWQgaW5pdGlhbGl6aW5nIFdCICglZCkuXG4iLCByKTsKKwlyID0gcjEwMF9pYl9pbml0KHJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgSUIgKCVkKS5cbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByczY5MF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJLyogTWFrZSBzdXIgR0FSVCBhcmUgbm90IHdvcmtpbmcgKi8KKwlyczQwMF9nYXJ0X2Rpc2FibGUocmRldik7CisJLyogUmVzdW1lIGNsb2NrIGJlZm9yZSBkb2luZyByZXNldCAqLworCXJ2NTE1X2Nsb2NrX3N0YXJ0dXAocmRldik7CisJLyogUmVzZXQgZ3B1IGJlZm9yZSBwb3N0aW5nIG90aGVyd2lzZSBBVE9NIHdpbGwgZW50ZXIgaW5maW5pdGUgbG9vcCAqLworCWlmIChyYWRlb25fZ3B1X3Jlc2V0KHJkZXYpKSB7CisJCWRldl93YXJuKHJkZXYtPmRldiwgIkdQVSByZXNldCBmYWlsZWQgISAoMHhFNDA9MHglMDhYLCAweDdDMD0weCUwOFgpXG4iLAorCQkJUlJFRzMyKFJfMDAwRTQwX1JCQk1fU1RBVFVTKSwKKwkJCVJSRUczMihSXzAwMDdDMF9DUF9TVEFUKSk7CisJfQorCS8qIHBvc3QgKi8KKwlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKKwkvKiBSZXN1bWUgY2xvY2sgYWZ0ZXIgcG9zdGluZyAqLworCXJ2NTE1X2Nsb2NrX3N0YXJ0dXAocmRldik7CisJcmV0dXJuIHJzNjkwX3N0YXJ0dXAocmRldik7Cit9CisKK2ludCByczY5MF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXIxMDBfY3BfZGlzYWJsZShyZGV2KTsKKwlyMTAwX3diX2Rpc2FibGUocmRldik7CisJcnM2MDBfaXJxX2Rpc2FibGUocmRldik7CisJcnM0MDBfZ2FydF9kaXNhYmxlKHJkZXYpOworCXJldHVybiAwOworfQorCit2b2lkIHJzNjkwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcnM2OTBfc3VzcGVuZChyZGV2KTsKKwlyMTAwX2NwX2ZpbmkocmRldik7CisJcjEwMF93Yl9maW5pKHJkZXYpOworCXIxMDBfaWJfZmluaShyZGV2KTsKKwlyYWRlb25fZ2VtX2ZpbmkocmRldik7CisJcnM0MDBfZ2FydF9maW5pKHJkZXYpOworCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CisJcmFkZW9uX2ZlbmNlX2RyaXZlcl9maW5pKHJkZXYpOworCXJhZGVvbl9vYmplY3RfZmluaShyZGV2KTsKKwlyYWRlb25fYXRvbWJpb3NfZmluaShyZGV2KTsKKwlrZnJlZShyZGV2LT5iaW9zKTsKKwlyZGV2LT5iaW9zID0gTlVMTDsKK30KKworaW50IHJzNjkwX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHI7CisKKwkvKiBEaXNhYmxlIFZHQSAqLworCXJ2NTE1X3ZnYV9yZW5kZXJfZGlzYWJsZShyZGV2KTsKKwkvKiBJbml0aWFsaXplIHNjcmF0Y2ggcmVnaXN0ZXJzICovCisJcmFkZW9uX3NjcmF0Y2hfaW5pdChyZGV2KTsKKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKKwkvKiBUT0RPOiBkaXNhYmxlIFZHQSBuZWVkIHRvIHVzZSBWR0EgcmVxdWVzdCAqLworCS8qIEJJT1MqLworCWlmICghcmFkZW9uX2dldF9iaW9zKHJkZXYpKSB7CisJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKKwkJciA9IHJhZGVvbl9hdG9tYmlvc19pbml0KHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0gZWxzZSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiRXhwZWN0aW5nIGF0b21iaW9zIGZvciBSVjUxNSBHUFVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogUmVzZXQgZ3B1IGJlZm9yZSBwb3N0aW5nIG90aGVyd2lzZSBBVE9NIHdpbGwgZW50ZXIgaW5maW5pdGUgbG9vcCAqLworCWlmIChyYWRlb25fZ3B1X3Jlc2V0KHJkZXYpKSB7CisJCWRldl93YXJuKHJkZXYtPmRldiwKKwkJCSJHUFUgcmVzZXQgZmFpbGVkICEgKDB4RTQwPTB4JTA4WCwgMHg3QzA9MHglMDhYKVxuIiwKKwkJCVJSRUczMihSXzAwMEU0MF9SQkJNX1NUQVRVUyksCisJCQlSUkVHMzIoUl8wMDA3QzBfQ1BfU1RBVCkpOworCX0KKwkvKiBjaGVjayBpZiBjYXJkcyBhcmUgcG9zdGVkIG9yIG5vdCAqLworCWlmICghcmFkZW9uX2NhcmRfcG9zdGVkKHJkZXYpICYmIHJkZXYtPmJpb3MpIHsKKwkJRFJNX0lORk8oIkdQVSBub3QgcG9zdGVkLiBwb3N0aW5nIG5vdy4uLlxuIik7CisJCWF0b21fYXNpY19pbml0KHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOworCX0KKwkvKiBJbml0aWFsaXplIGNsb2NrcyAqLworCXJhZGVvbl9nZXRfY2xvY2tfaW5mbyhyZGV2LT5kZGV2KTsKKwkvKiBHZXQgdnJhbSBpbmZvcm1hdGlvbnMgKi8KKwlyczY5MF92cmFtX2luZm8ocmRldik7CisJLyogSW5pdGlhbGl6ZSBtZW1vcnkgY29udHJvbGxlciAoYWxzbyB0ZXN0IEFHUCkgKi8KKwlyID0gcjQyMF9tY19pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlydjUxNV9kZWJ1Z2ZzKHJkZXYpOworCS8qIEZlbmNlIGRyaXZlciAqLworCXIgPSByYWRlb25fZmVuY2VfZHJpdmVyX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXIgPSByYWRlb25faXJxX2ttc19pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwkvKiBNZW1vcnkgbWFuYWdlciAqLworCXIgPSByYWRlb25fb2JqZWN0X2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXIgPSByczQwMF9nYXJ0X2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXJzNjAwX3NldF9zYWZlX3JlZ2lzdGVycyhyZGV2KTsKKwlyZGV2LT5hY2NlbF93b3JraW5nID0gdHJ1ZTsKKwlyID0gcnM2OTBfc3RhcnR1cChyZGV2KTsKKwlpZiAocikgeworCQkvKiBTb21ldGhpbmdzIHdhbnQgd3JvbnQgd2l0aCB0aGUgYWNjZWwgaW5pdCBzdG9wIGFjY2VsICovCisJCWRldl9lcnIocmRldi0+ZGV2LCAiRGlzYWJsaW5nIEdQVSBhY2NlbGVyYXRpb25cbiIpOworCQlyczY5MF9zdXNwZW5kKHJkZXYpOworCQlyMTAwX2NwX2ZpbmkocmRldik7CisJCXIxMDBfd2JfZmluaShyZGV2KTsKKwkJcjEwMF9pYl9maW5pKHJkZXYpOworCQlyczQwMF9nYXJ0X2ZpbmkocmRldik7CisJCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CisJCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKKwl9CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjkwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczY5MGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQzMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczY5MGQuaApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IDIwMDkgSmVyb21lIEdsaXNzZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBEYXZlIEFpcmxpZQorICogICAgICAgICAgQWxleCBEZXVjaGVyCisgKiAgICAgICAgICBKZXJvbWUgR2xpc3NlCisgKi8KKyNpZm5kZWYgX19SUzY5MERfSF9fCisjZGVmaW5lIF9fUlM2OTBEX0hfXworCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl8wMDAwNzhfTUNfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNzgKKyNkZWZpbmUgICBTXzAwMDA3OF9NQ19JTkRfQUREUih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MUZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDc4X01DX0lORF9BRERSKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxRkYpCisjZGVmaW5lICAgQ18wMDAwNzhfTUNfSU5EX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkUwMAorI2RlZmluZSAgIFNfMDAwMDc4X01DX0lORF9XUl9FTih4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA5KQorI2RlZmluZSAgIEdfMDAwMDc4X01DX0lORF9XUl9FTih4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDc4X01DX0lORF9XUl9FTiAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZERkYKKyNkZWZpbmUgUl8wMDAwN0NfTUNfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwN0MKKyNkZWZpbmUgICBTXzAwMDA3Q19NQ19EQVRBKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRkZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAwN0NfTUNfREFUQSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkZGRkZGKQorI2RlZmluZSAgIENfMDAwMDdDX01DX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUl8wMDAwRjhfQ09ORklHX01FTVNJWkUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRjgKKyNkZWZpbmUgICBTXzAwMDBGOF9DT05GSUdfTUVNU0laRSh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRkZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAwRjhfQ09ORklHX01FTVNJWkUoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkZGRkZGKQorI2RlZmluZSAgIENfMDAwMEY4X0NPTkZJR19NRU1TSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUl8wMDAxMzRfSERQX0ZCX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMzQKKyNkZWZpbmUgICBTXzAwMDEzNF9IRFBfRkJfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDEzNF9IRFBfRkJfU1RBUlQoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDEzNF9IRFBfRkJfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisjZGVmaW5lIFJfMDAwN0MwX0NQX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwN0MwCisjZGVmaW5lICAgU18wMDA3QzBfTVJVX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDA3QzBfTVJVX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfTVJVX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDAwN0MwX01XVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxKQorI2RlZmluZSAgIEdfMDAwN0MwX01XVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX01XVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkQKKyNkZWZpbmUgICBTXzAwMDdDMF9SU0lVX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMikKKyNkZWZpbmUgICBHXzAwMDdDMF9SU0lVX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9SU0lVX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZCCisjZGVmaW5lICAgU18wMDA3QzBfUkNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMpCisjZGVmaW5lICAgR18wMDA3QzBfUkNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMykgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfUkNJVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGNworI2RlZmluZSAgIFNfMDAwN0MwX0NTRl9QUklNQVJZX0JVU1koeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA5KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9QUklNQVJZX0JVU1koeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NTRl9QUklNQVJZX0JVU1kgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZERkYKKyNkZWZpbmUgICBTXzAwMDdDMF9DU0ZfSU5ESVJFQ1RfQlVTWSh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTApCisjZGVmaW5lICAgR18wMDA3QzBfQ1NGX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTApICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NTRl9JTkRJUkVDVF9CVVNZICAgICAgICAgICAgICAgICAgIDB4RkZGRkZCRkYKKyNkZWZpbmUgICBTXzAwMDdDMF9DU1FfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTEpCisjZGVmaW5lICAgR18wMDA3QzBfQ1NRX1BSSU1BUllfQlVTWSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NTUV9QUklNQVJZX0JVU1kgICAgICAgICAgICAgICAgICAgIDB4RkZGRkY3RkYKKyNkZWZpbmUgICBTXzAwMDdDMF9DU1FfSU5ESVJFQ1RfQlVTWSh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTIpCisjZGVmaW5lICAgR18wMDA3QzBfQ1NRX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NTUV9JTkRJUkVDVF9CVVNZICAgICAgICAgICAgICAgICAgIDB4RkZGRkVGRkYKKyNkZWZpbmUgICBTXzAwMDdDMF9DU0lfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTMpCisjZGVmaW5lICAgR18wMDA3QzBfQ1NJX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NTSV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkRGRkYKKyNkZWZpbmUgICBTXzAwMDdDMF9DU0ZfSU5ESVJFQ1QyX0JVU1koeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDA3QzBfQ1NGX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NTRl9JTkRJUkVDVDJfQlVTWSAgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMDdDMF9DU1FfSU5ESVJFQ1QyX0JVU1koeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTUpCisjZGVmaW5lICAgR18wMDA3QzBfQ1NRX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NTUV9JTkRJUkVDVDJfQlVTWSAgICAgICAgICAgICAgICAgIDB4RkZGRjdGRkYKKyNkZWZpbmUgICBTXzAwMDdDMF9HVUlETUFfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjgpCisjZGVmaW5lICAgR18wMDA3QzBfR1VJRE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0dVSURNQV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDdDMF9WSURETUFfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjkpCisjZGVmaW5lICAgR18wMDA3QzBfVklERE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX1ZJRERNQV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4REZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDdDMF9DTURTVFJNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzApCisjZGVmaW5lICAgR18wMDA3QzBfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzApICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NNRFNUUk1fQlVTWSAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDdDMF9DUF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lICAgR18wMDA3QzBfQ1BfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX0NQX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKKyNkZWZpbmUgUl8wMDBFNDBfUkJCTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBFNDAKKyNkZWZpbmUgICBTXzAwMEU0MF9DTURGSUZPX0FWQUlMKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4N0YpIDw8IDApCisjZGVmaW5lICAgR18wMDBFNDBfQ01ERklGT19BVkFJTCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDdGKQorI2RlZmluZSAgIENfMDAwRTQwX0NNREZJRk9fQVZBSUwgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGODAKKyNkZWZpbmUgICBTXzAwMEU0MF9ISVJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOCkKKyNkZWZpbmUgICBHXzAwMEU0MF9ISVJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMEU0MF9ISVJRX09OX1JCQiAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRUZGCisjZGVmaW5lICAgU18wMDBFNDBfQ1BSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDkpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gOSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfQ1BSUV9PTl9SQkIgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkRGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NGUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMCkKKyNkZWZpbmUgICBHXzAwMEU0MF9DRlJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfQ0ZSUV9PTl9SQkIgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkJGRgorI2RlZmluZSAgIFNfMDAwRTQwX0hJUlFfSU5fUlRCVUYoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMSkKKyNkZWZpbmUgICBHXzAwMEU0MF9ISVJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfSElSUV9JTl9SVEJVRiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRjdGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NQUlFfSU5fUlRCVUYoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMikKKyNkZWZpbmUgICBHXzAwMEU0MF9DUFJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfQ1BSUV9JTl9SVEJVRiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRUZGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NGUlFfSU5fUlRCVUYoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxMykKKyNkZWZpbmUgICBHXzAwMEU0MF9DRlJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxMykgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfQ0ZSUV9JTl9SVEJVRiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGREZGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NGX1BJUEVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNCkKKyNkZWZpbmUgICBHXzAwMEU0MF9DRl9QSVBFX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfQ0ZfUElQRV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGQkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX0VOR19FVl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNSkKKyNkZWZpbmUgICBHXzAwMEU0MF9FTkdfRVZfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfRU5HX0VWX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGN0ZGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NQX0NNRFNUUk1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwMEU0MF9DUF9DTURTVFJNX0JVU1koeCkgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfQ1BfQ01EU1RSTV9CVVNZICAgICAgICAgICAgICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX0UyX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNykKKyNkZWZpbmUgICBHXzAwMEU0MF9FMl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNykgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfRTJfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZERkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX1JCMkRfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxOCkKKyNkZWZpbmUgICBHXzAwMEU0MF9SQjJEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfUkIyRF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZCRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX1JCM0RfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxOSkKKyNkZWZpbmUgICBHXzAwMEU0MF9SQjNEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxOSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfUkIzRF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkY3RkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX1ZBUF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMCkKKyNkZWZpbmUgICBHXzAwMEU0MF9WQVBfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfVkFQX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkVGRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX1JFX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMSkKKyNkZWZpbmUgICBHXzAwMEU0MF9SRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfUkVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkRGRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX1RBTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMikKKyNkZWZpbmUgICBHXzAwMEU0MF9UQU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfVEFNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkJGRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX1RETV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMykKKyNkZWZpbmUgICBHXzAwMEU0MF9URE1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMykgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfVERNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjdGRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX1BCX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNCkKKyNkZWZpbmUgICBHXzAwMEU0MF9QQl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfUEJfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRUZGRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX1RJTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNSkKKyNkZWZpbmUgICBHXzAwMEU0MF9USU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfVElNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGREZGRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX0dBX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNikKKyNkZWZpbmUgICBHXzAwMEU0MF9HQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfR0FfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGQkZGRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NCQTJEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNykKKyNkZWZpbmUgICBHXzAwMEU0MF9DQkEyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNykgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfQ0JBMkRfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGN0ZGRkZGRgorI2RlZmluZSAgIFNfMDAwRTQwX0dVSV9BQ1RJVkUoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzMSkKKyNkZWZpbmUgICBHXzAwMEU0MF9HVUlfQUNUSVZFKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAzMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfR1VJX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RkZGRkZGRgorI2RlZmluZSBSXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVQgICAgICAgICAgICAgICAgICAweDAwNjUyMAorI2RlZmluZSAgIFNfMDA2NTIwX0RDX0xCX01FTU9SWV9TUExJVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAwKQorI2RlZmluZSAgIEdfMDA2NTIwX0RDX0xCX01FTU9SWV9TUExJVCh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgzKQorI2RlZmluZSAgIENfMDA2NTIwX0RDX0xCX01FTU9SWV9TUExJVCAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkMKKyNkZWZpbmUgICBTXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVRfTU9ERSh4KSAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMikKKyNkZWZpbmUgICBHXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVRfTU9ERSh4KSAgICAgICAgICAoKCh4KSA+PiAyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVRfTU9ERSAgICAgICAgICAgICAweEZGRkZGRkZCCisjZGVmaW5lICAgVl8wMDY1MjBfRENfTEJfTUVNT1JZX1NQTElUX0QxSEFMRl9EMkhBTEYgICAgMAorI2RlZmluZSAgIFZfMDA2NTIwX0RDX0xCX01FTU9SWV9TUExJVF9EMV8zUV9EMl8xUSAgICAgIDEKKyNkZWZpbmUgICBWXzAwNjUyMF9EQ19MQl9NRU1PUllfU1BMSVRfRDFfT05MWSAgICAgICAgICAyCisjZGVmaW5lICAgVl8wMDY1MjBfRENfTEJfTUVNT1JZX1NQTElUX0QxXzFRX0QyXzNRICAgICAgMworI2RlZmluZSAgIFNfMDA2NTIwX0RDX0xCX0RJU1AxX0VORF9BRFIoeCkgICAgICAgICAgICAgICgoKHgpICYgMHg3RkYpIDw8IDQpCisjZGVmaW5lICAgR18wMDY1MjBfRENfTEJfRElTUDFfRU5EX0FEUih4KSAgICAgICAgICAgICAgKCgoeCkgPj4gNCkgJiAweDdGRikKKyNkZWZpbmUgICBDXzAwNjUyMF9EQ19MQl9ESVNQMV9FTkRfQURSICAgICAgICAgICAgICAgICAweEZGRkY4MDBGCisjZGVmaW5lIFJfMDA2NTQ4X0QxTU9ERV9QUklPUklUWV9BX0NOVCAgICAgICAgICAgICAgIDB4MDA2NTQ4CisjZGVmaW5lICAgU18wMDY1NDhfRDFNT0RFX1BSSU9SSVRZX01BUktfQSh4KSAgICAgICAgICAgKCgoeCkgJiAweDdGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDY1NDhfRDFNT0RFX1BSSU9SSVRZX01BUktfQSh4KSAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDdGRkYpCisjZGVmaW5lICAgQ18wMDY1NDhfRDFNT0RFX1BSSU9SSVRZX01BUktfQSAgICAgICAgICAgICAgMHhGRkZGODAwMAorI2RlZmluZSAgIFNfMDA2NTQ4X0QxTU9ERV9QUklPUklUWV9BX09GRih4KSAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwNjU0OF9EMU1PREVfUFJJT1JJVFlfQV9PRkYoeCkgICAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDY1NDhfRDFNT0RFX1BSSU9SSVRZX0FfT0ZGICAgICAgICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSAgIFNfMDA2NTQ4X0QxTU9ERV9QUklPUklUWV9BX0ZPUkNFX01BU0soeCkgICAgICgoKHgpICYgMHgxKSA8PCAyNCkKKyNkZWZpbmUgICBHXzAwNjU0OF9EMU1PREVfUFJJT1JJVFlfQV9GT1JDRV9NQVNLKHgpICAgICAoKCh4KSA+PiAyNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDY1NDhfRDFNT0RFX1BSSU9SSVRZX0FfRk9SQ0VfTUFTSyAgICAgICAgMHhGRUZGRkZGRgorI2RlZmluZSBSXzAwNjU0Q19EMU1PREVfUFJJT1JJVFlfQl9DTlQgICAgICAgICAgICAgICAweDAwNjU0QworI2RlZmluZSAgIFNfMDA2NTRDX0QxTU9ERV9QUklPUklUWV9NQVJLX0IoeCkgICAgICAgICAgICgoKHgpICYgMHg3RkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDA2NTRDX0QxTU9ERV9QUklPUklUWV9NQVJLX0IoeCkgICAgICAgICAgICgoKHgpID4+IDApICYgMHg3RkZGKQorI2RlZmluZSAgIENfMDA2NTRDX0QxTU9ERV9QUklPUklUWV9NQVJLX0IgICAgICAgICAgICAgIDB4RkZGRjgwMDAKKyNkZWZpbmUgICBTXzAwNjU0Q19EMU1PREVfUFJJT1JJVFlfQl9PRkYoeCkgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDY1NENfRDFNT0RFX1BSSU9SSVRZX0JfT0ZGKHgpICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDA2NTRDX0QxTU9ERV9QUklPUklUWV9CX09GRiAgICAgICAgICAgICAgIDB4RkZGRUZGRkYKKyNkZWZpbmUgICBTXzAwNjU0Q19EMU1PREVfUFJJT1JJVFlfQl9BTFdBWVNfT04oeCkgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDY1NENfRDFNT0RFX1BSSU9SSVRZX0JfQUxXQVlTX09OKHgpICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDA2NTRDX0QxTU9ERV9QUklPUklUWV9CX0FMV0FZU19PTiAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgICBTXzAwNjU0Q19EMU1PREVfUFJJT1JJVFlfQl9GT1JDRV9NQVNLKHgpICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDY1NENfRDFNT0RFX1BSSU9SSVRZX0JfRk9SQ0VfTUFTSyh4KSAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDA2NTRDX0QxTU9ERV9QUklPUklUWV9CX0ZPUkNFX01BU0sgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgUl8wMDZDOUNfRENQX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDZDOUMKKyNkZWZpbmUgUl8wMDZENDhfRDJNT0RFX1BSSU9SSVRZX0FfQ05UICAgICAgICAgICAgICAgMHgwMDZENDgKKyNkZWZpbmUgICBTXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfTUFSS19BKHgpICAgICAgICAgICAoKCh4KSAmIDB4N0ZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfTUFSS19BKHgpICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4N0ZGRikKKyNkZWZpbmUgICBDXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfTUFSS19BICAgICAgICAgICAgICAweEZGRkY4MDAwCisjZGVmaW5lICAgU18wMDZENDhfRDJNT0RFX1BSSU9SSVRZX0FfT0ZGKHgpICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX09GRih4KSAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfQV9PRkYgICAgICAgICAgICAgICAweEZGRkVGRkZGCisjZGVmaW5lICAgU18wMDZENDhfRDJNT0RFX1BSSU9SSVRZX0FfQUxXQVlTX09OKHgpICAgICAgKCgoeCkgJiAweDEpIDw8IDIwKQorI2RlZmluZSAgIEdfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX0FMV0FZU19PTih4KSAgICAgICgoKHgpID4+IDIwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfQV9BTFdBWVNfT04gICAgICAgICAweEZGRUZGRkZGCisjZGVmaW5lICAgU18wMDZENDhfRDJNT0RFX1BSSU9SSVRZX0FfRk9SQ0VfTUFTSyh4KSAgICAgKCgoeCkgJiAweDEpIDw8IDI0KQorI2RlZmluZSAgIEdfMDA2RDQ4X0QyTU9ERV9QUklPUklUWV9BX0ZPUkNFX01BU0soeCkgICAgICgoKHgpID4+IDI0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNkQ0OF9EMk1PREVfUFJJT1JJVFlfQV9GT1JDRV9NQVNLICAgICAgICAweEZFRkZGRkZGCisjZGVmaW5lIFJfMDA2RDRDX0QyTU9ERV9QUklPUklUWV9CX0NOVCAgICAgICAgICAgICAgIDB4MDA2RDRDCisjZGVmaW5lICAgU18wMDZENENfRDJNT0RFX1BSSU9SSVRZX01BUktfQih4KSAgICAgICAgICAgKCgoeCkgJiAweDdGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDZENENfRDJNT0RFX1BSSU9SSVRZX01BUktfQih4KSAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDdGRkYpCisjZGVmaW5lICAgQ18wMDZENENfRDJNT0RFX1BSSU9SSVRZX01BUktfQiAgICAgICAgICAgICAgMHhGRkZGODAwMAorI2RlZmluZSAgIFNfMDA2RDRDX0QyTU9ERV9QUklPUklUWV9CX09GRih4KSAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwNkQ0Q19EMk1PREVfUFJJT1JJVFlfQl9PRkYoeCkgICAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDZENENfRDJNT0RFX1BSSU9SSVRZX0JfT0ZGICAgICAgICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSAgIFNfMDA2RDRDX0QyTU9ERV9QUklPUklUWV9CX0FMV0FZU19PTih4KSAgICAgICgoKHgpICYgMHgxKSA8PCAyMCkKKyNkZWZpbmUgICBHXzAwNkQ0Q19EMk1PREVfUFJJT1JJVFlfQl9BTFdBWVNfT04oeCkgICAgICAoKCh4KSA+PiAyMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDZENENfRDJNT0RFX1BSSU9SSVRZX0JfQUxXQVlTX09OICAgICAgICAgMHhGRkVGRkZGRgorI2RlZmluZSAgIFNfMDA2RDRDX0QyTU9ERV9QUklPUklUWV9CX0ZPUkNFX01BU0soeCkgICAgICgoKHgpICYgMHgxKSA8PCAyNCkKKyNkZWZpbmUgICBHXzAwNkQ0Q19EMk1PREVfUFJJT1JJVFlfQl9GT1JDRV9NQVNLKHgpICAgICAoKCh4KSA+PiAyNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDZENENfRDJNT0RFX1BSSU9SSVRZX0JfRk9SQ0VfTUFTSyAgICAgICAgMHhGRUZGRkZGRgorI2RlZmluZSBSXzAwNkQ1OF9MQl9NQVhfUkVRX09VVFNUQU5ESU5HICAgICAgICAgICAgICAweDAwNkQ1OAorI2RlZmluZSAgIFNfMDA2RDU4X0xCX0QxX01BWF9SRVFfT1VUU1RBTkRJTkcoeCkgICAgICAgICgoKHgpICYgMHhGKSA8PCAwKQorI2RlZmluZSAgIEdfMDA2RDU4X0xCX0QxX01BWF9SRVFfT1VUU1RBTkRJTkcoeCkgICAgICAgICgoKHgpID4+IDApICYgMHhGKQorI2RlZmluZSAgIENfMDA2RDU4X0xCX0QxX01BWF9SRVFfT1VUU1RBTkRJTkcgICAgICAgICAgIDB4RkZGRkZGRjAKKyNkZWZpbmUgICBTXzAwNkQ1OF9MQl9EMl9NQVhfUkVRX09VVFNUQU5ESU5HKHgpICAgICAgICAoKCh4KSAmIDB4RikgPDwgMTYpCisjZGVmaW5lICAgR18wMDZENThfTEJfRDJfTUFYX1JFUV9PVVRTVEFORElORyh4KSAgICAgICAgKCgoeCkgPj4gMTYpICYgMHhGKQorI2RlZmluZSAgIENfMDA2RDU4X0xCX0QyX01BWF9SRVFfT1VUU1RBTkRJTkcgICAgICAgICAgIDB4RkZGMEZGRkYKKworCisjZGVmaW5lIFJfMDAwMDkwX01DX1NZU1RFTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkwCisjZGVmaW5lICAgU18wMDAwOTBfTUNfU1lTVEVNX0lETEUoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDAwOTBfTUNfU1lTVEVNX0lETEUoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwOTBfTUNfU1lTVEVNX0lETEUgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDAwMDkwX01DX1NFUVVFTkNFUl9JRExFKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxKQorI2RlZmluZSAgIEdfMDAwMDkwX01DX1NFUVVFTkNFUl9JRExFKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDkwX01DX1NFUVVFTkNFUl9JRExFICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkQKKyNkZWZpbmUgICBTXzAwMDA5MF9NQ19BUkJJVEVSX0lETEUoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMikKKyNkZWZpbmUgICBHXzAwMDA5MF9NQ19BUkJJVEVSX0lETEUoeCkgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA5MF9NQ19BUkJJVEVSX0lETEUgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZCCisjZGVmaW5lICAgU18wMDAwOTBfTUNfU0VMRUNUX1BNKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMpCisjZGVmaW5lICAgR18wMDAwOTBfTUNfU0VMRUNUX1BNKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMykgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwOTBfTUNfU0VMRUNUX1BNICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGNworI2RlZmluZSAgIFNfMDAwMDkwX1JFU0VSVkVENCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGKSA8PCA0KQorI2RlZmluZSAgIEdfMDAwMDkwX1JFU0VSVkVENCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDQpICYgMHhGKQorI2RlZmluZSAgIENfMDAwMDkwX1JFU0VSVkVENCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGMEYKKyNkZWZpbmUgICBTXzAwMDA5MF9SRVNFUlZFRDgoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgOCkKKyNkZWZpbmUgICBHXzAwMDA5MF9SRVNFUlZFRDgoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA4KSAmIDB4RikKKyNkZWZpbmUgICBDXzAwMDA5MF9SRVNFUlZFRDggICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGMEZGCisjZGVmaW5lICAgU18wMDAwOTBfUkVTRVJWRUQxMih4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEYpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwMDkwX1JFU0VSVkVEMTIoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4RikKKyNkZWZpbmUgICBDXzAwMDA5MF9SRVNFUlZFRDEyICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwRkZGCisjZGVmaW5lICAgU18wMDAwOTBfTUNBX0lOSVRfRVhFQ1VURUQoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDAwMDkwX01DQV9JTklUX0VYRUNVVEVEKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA5MF9NQ0FfSU5JVF9FWEVDVVRFRCAgICAgICAgICAgICAgICAgICAweEZGRkVGRkZGCisjZGVmaW5lICAgU18wMDAwOTBfTUNBX0lETEUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE3KQorI2RlZmluZSAgIEdfMDAwMDkwX01DQV9JRExFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA5MF9NQ0FfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkRGRkZGCisjZGVmaW5lICAgU18wMDAwOTBfTUNBX1NFUV9JRExFKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE4KQorI2RlZmluZSAgIEdfMDAwMDkwX01DQV9TRVFfSURMRSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA5MF9NQ0FfU0VRX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkJGRkZGCisjZGVmaW5lICAgU18wMDAwOTBfTUNBX0FSQl9JRExFKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE5KQorI2RlZmluZSAgIEdfMDAwMDkwX01DQV9BUkJfSURMRSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDA5MF9NQ0FfQVJCX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAweEZGRjdGRkZGCisjZGVmaW5lICAgU18wMDAwOTBfUkVTRVJWRUQyMCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRikgPDwgMjApCisjZGVmaW5lICAgR18wMDAwOTBfUkVTRVJWRUQyMCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHhGRkYpCisjZGVmaW5lICAgQ18wMDAwOTBfUkVTRVJWRUQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGRkZGRgorI2RlZmluZSBSXzAwMDEwMF9NQ0NGR19GQl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAweDAwMDEwMAorI2RlZmluZSAgIFNfMDAwMTAwX01DX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMTAwX01DX0ZCX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMTAwX01DX0ZCX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgICBTXzAwMDEwMF9NQ19GQl9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMTYpCisjZGVmaW5lICAgR18wMDAxMDBfTUNfRkJfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMTAwX01DX0ZCX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgUl8wMDAxMDRfTUNfSU5JVF9NSVNDX0xBVF9USU1FUiAgICAgICAgICAgICAgMHgwMDAxMDQKKyNkZWZpbmUgICBTXzAwMDEwNF9NQ19DUFJfSU5JVF9MQVQoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDEwNF9NQ19DUFJfSU5JVF9MQVQoeCkgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RikKKyNkZWZpbmUgICBDXzAwMDEwNF9NQ19DUFJfSU5JVF9MQVQgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkYwCisjZGVmaW5lICAgU18wMDAxMDRfTUNfVkZfSU5JVF9MQVQoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEYpIDw8IDQpCisjZGVmaW5lICAgR18wMDAxMDRfTUNfVkZfSU5JVF9MQVQoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gNCkgJiAweEYpCisjZGVmaW5lICAgQ18wMDAxMDRfTUNfVkZfSU5JVF9MQVQgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkYwRgorI2RlZmluZSAgIFNfMDAwMTA0X01DX0RJU1AwUl9JTklUX0xBVCh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHhGKSA8PCA4KQorI2RlZmluZSAgIEdfMDAwMTA0X01DX0RJU1AwUl9JTklUX0xBVCh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDgpICYgMHhGKQorI2RlZmluZSAgIENfMDAwMTA0X01DX0RJU1AwUl9JTklUX0xBVCAgICAgICAgICAgICAgICAgIDB4RkZGRkYwRkYKKyNkZWZpbmUgICBTXzAwMDEwNF9NQ19ESVNQMVJfSU5JVF9MQVQoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMTIpCisjZGVmaW5lICAgR18wMDAxMDRfTUNfRElTUDFSX0lOSVRfTEFUKHgpICAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHhGKQorI2RlZmluZSAgIENfMDAwMTA0X01DX0RJU1AxUl9JTklUX0xBVCAgICAgICAgICAgICAgICAgIDB4RkZGRjBGRkYKKyNkZWZpbmUgICBTXzAwMDEwNF9NQ19GSVhFRF9JTklUX0xBVCh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMTYpCisjZGVmaW5lICAgR18wMDAxMDRfTUNfRklYRURfSU5JVF9MQVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHhGKQorI2RlZmluZSAgIENfMDAwMTA0X01DX0ZJWEVEX0lOSVRfTEFUICAgICAgICAgICAgICAgICAgIDB4RkZGMEZGRkYKKyNkZWZpbmUgICBTXzAwMDEwNF9NQ19FMlJfSU5JVF9MQVQoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMjApCisjZGVmaW5lICAgR18wMDAxMDRfTUNfRTJSX0lOSVRfTEFUKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHhGKQorI2RlZmluZSAgIENfMDAwMTA0X01DX0UyUl9JTklUX0xBVCAgICAgICAgICAgICAgICAgICAgIDB4RkYwRkZGRkYKKyNkZWZpbmUgICBTXzAwMDEwNF9TQU1FX1BBR0VfUFJJTyh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMjQpCisjZGVmaW5lICAgR18wMDAxMDRfU0FNRV9QQUdFX1BSSU8oeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHhGKQorI2RlZmluZSAgIENfMDAwMTA0X1NBTUVfUEFHRV9QUklPICAgICAgICAgICAgICAgICAgICAgIDB4RjBGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDEwNF9NQ19HTE9CV19JTklUX0xBVCh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMjgpCisjZGVmaW5lICAgR18wMDAxMDRfTUNfR0xPQldfSU5JVF9MQVQoeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjgpICYgMHhGKQorI2RlZmluZSAgIENfMDAwMTA0X01DX0dMT0JXX0lOSVRfTEFUICAgICAgICAgICAgICAgICAgIDB4MEZGRkZGRkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjkwci5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczY5MHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkOWZhYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjkwci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFJlZCBIYXQgSW5jLgotICogQ29weXJpZ2h0IDIwMDkgSmVyb21lIEdsaXNzZS4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKiBBdXRob3JzOiBEYXZlIEFpcmxpZQotICogICAgICAgICAgQWxleCBEZXVjaGVyCi0gKiAgICAgICAgICBKZXJvbWUgR2xpc3NlCi0gKi8KLSNpZm5kZWYgUlM2OTBSX0gKLSNkZWZpbmUgUlM2OTBSX0gKLQotLyogUlM2OTAvUlM3NDAgcmVnaXN0ZXJzICovCi0jZGVmaW5lIE1DX0lOREVYCQkJMHgwMDc4Ci0jCWRlZmluZSBNQ19JTkRFWF9NQVNLCQkJMHgxRkYKLSMJZGVmaW5lIE1DX0lOREVYX1dSX0VOCQkJKDEgPDwgOSkKLSMJZGVmaW5lIE1DX0lOREVYX1dSX0FDSwkJCTB4N0YKLSNkZWZpbmUgTUNfREFUQQkJCQkweDAwN0MKLSNkZWZpbmUgSERQX0ZCX0xPQ0FUSU9OCQkJMHgwMTM0Ci0jZGVmaW5lIERDX0xCX01FTU9SWV9TUExJVAkJMHg2NTIwCi0jZGVmaW5lCQlEQ19MQl9NRU1PUllfU1BMSVRfTUFTSwkJCTB4MDAwMDAwMDMKLSNkZWZpbmUJCURDX0xCX01FTU9SWV9TUExJVF9TSElGVAkJMAotI2RlZmluZQkJRENfTEJfTUVNT1JZX1NQTElUX0QxSEFMRl9EMkhBTEYJMAotI2RlZmluZQkJRENfTEJfTUVNT1JZX1NQTElUX0QxXzNRX0QyXzFRCQkxCi0jZGVmaW5lCQlEQ19MQl9NRU1PUllfU1BMSVRfRDFfT05MWQkJMgotI2RlZmluZQkJRENfTEJfTUVNT1JZX1NQTElUX0QxXzFRX0QyXzNRCQkzCi0jZGVmaW5lCQlEQ19MQl9NRU1PUllfU1BMSVRfU0hJRlRfTU9ERQkJKDEgPDwgMikKLSNkZWZpbmUJCURDX0xCX0RJU1AxX0VORF9BRFJfU0hJRlQJCTQKLSNkZWZpbmUJCURDX0xCX0RJU1AxX0VORF9BRFJfTUFTSwkJMHgwMDAwN0ZGMAotI2RlZmluZSBEMU1PREVfUFJJT1JJVFlfQV9DTlQJCTB4NjU0OAotI2RlZmluZQkJTU9ERV9QUklPUklUWV9NQVJLX01BU0sJCQkweDAwMDA3RkZGCi0jZGVmaW5lCQlNT0RFX1BSSU9SSVRZX09GRgkJCSgxIDw8IDE2KQotI2RlZmluZQkJTU9ERV9QUklPUklUWV9BTFdBWVNfT04JCQkoMSA8PCAyMCkKLSNkZWZpbmUJCU1PREVfUFJJT1JJVFlfRk9SQ0VfTUFTSwkJKDEgPDwgMjQpCi0jZGVmaW5lIEQxTU9ERV9QUklPUklUWV9CX0NOVAkJMHg2NTRDCi0jZGVmaW5lIExCX01BWF9SRVFfT1VUU1RBTkRJTkcJCTB4NkQ1OAotI2RlZmluZQkJTEJfRDFfTUFYX1JFUV9PVVRTVEFORElOR19NQVNLCQkweDAwMDAwMDBGCi0jZGVmaW5lCQlMQl9EMV9NQVhfUkVRX09VVFNUQU5ESU5HX1NISUZUCQkwCi0jZGVmaW5lCQlMQl9EMl9NQVhfUkVRX09VVFNUQU5ESU5HX01BU0sJCTB4MDAwRjAwMDAKLSNkZWZpbmUJCUxCX0QyX01BWF9SRVFfT1VUU1RBTkRJTkdfU0hJRlQJCTE2Ci0jZGVmaW5lIERDUF9DT05UUk9MCQkJMHg2QzlDCi0jZGVmaW5lIEQyTU9ERV9QUklPUklUWV9BX0NOVAkJMHg2RDQ4Ci0jZGVmaW5lIEQyTU9ERV9QUklPUklUWV9CX0NOVAkJMHg2RDRDCi0KLS8qIE1DIGluZGlyZWN0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBNQ19TVEFUVVNfSURMRQkJCQkoMSA8PCAwKQotI2RlZmluZSBNQ19NSVNDX0NOVEwJCQkweDE4Ci0jZGVmaW5lCQlESVNBQkxFX0dUVwkJCSgxIDw8IDEpCi0jZGVmaW5lCQlHQVJUX0lOREVYX1JFR19FTgkJKDEgPDwgMTIpCi0jZGVmaW5lCQlCTE9DS19HRlhfRDNfRU4JCQkoMSA8PCAxNCkKLSNkZWZpbmUgR0FSVF9GRUFUVVJFX0lECQkJMHgyQgotI2RlZmluZQkJSEFOR19FTgkJCQkoMSA8PCAxMSkKLSNkZWZpbmUJCVRMQl9FTkFCTEUJCQkoMSA8PCAxOCkKLSNkZWZpbmUJCVAyUF9FTkFCTEUJCQkoMSA8PCAxOSkKLSNkZWZpbmUJCUdUV19MQUNfRU4JCQkoMSA8PCAyNSkKLSNkZWZpbmUJCUxFVkVMMl9HQVJUCQkJKDAgPDwgMzApCi0jZGVmaW5lCQlMRVZFTDFfR0FSVAkJCSgxIDw8IDMwKQotI2RlZmluZQkJUERDX0VOCQkJCSgxIDw8IDMxKQotI2RlZmluZSBHQVJUX0JBU0UJCQkweDJDCi0jZGVmaW5lIEdBUlRfQ0FDSEVfQ05UUkwJCTB4MkUKLSMJZGVmaW5lIEdBUlRfQ0FDSEVfSU5WQUxJREFURQkJKDEgPDwgMCkKLSNkZWZpbmUgTUNfU1RBVFVTCQkJMHg5MAotI2RlZmluZSBNQ0NGR19GQl9MT0NBVElPTgkJMHgxMDAKLSNkZWZpbmUJCU1DX0ZCX1NUQVJUX01BU0sJCTB4MDAwMEZGRkYKLSNkZWZpbmUJCU1DX0ZCX1NUQVJUX1NISUZUCQkwCi0jZGVmaW5lCQlNQ19GQl9UT1BfTUFTSwkJCTB4RkZGRjAwMDAKLSNkZWZpbmUJCU1DX0ZCX1RPUF9TSElGVAkJCTE2Ci0jZGVmaW5lIE1DQ0ZHX0FHUF9MT0NBVElPTgkJMHgxMDEKLSNkZWZpbmUJCU1DX0FHUF9TVEFSVF9NQVNLCQkweDAwMDBGRkZGCi0jZGVmaW5lCQlNQ19BR1BfU1RBUlRfU0hJRlQJCTAKLSNkZWZpbmUJCU1DX0FHUF9UT1BfTUFTSwkJCTB4RkZGRjAwMDAKLSNkZWZpbmUJCU1DX0FHUF9UT1BfU0hJRlQJCTE2Ci0jZGVmaW5lIE1DQ0ZHX0FHUF9CQVNFCQkJMHgxMDIKLSNkZWZpbmUgTUNDRkdfQUdQX0JBU0VfMgkJMHgxMDMKLSNkZWZpbmUgTUNfSU5JVF9NSVNDX0xBVF9USU1FUgkJMHgxMDQKLSNkZWZpbmUJCU1DX0RJU1AwUl9JTklUX0xBVF9TSElGVAk4Ci0jZGVmaW5lCQlNQ19ESVNQMFJfSU5JVF9MQVRfTUFTSwkJMHgwMDAwMEYwMAotI2RlZmluZQkJTUNfRElTUDFSX0lOSVRfTEFUX1NISUZUCTEyCi0jZGVmaW5lCQlNQ19ESVNQMVJfSU5JVF9MQVRfTUFTSwkJMHgwMDAwRjAwMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnYyMDBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2MjAwZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjM5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2MjAwZC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAyMDA5IEplcm9tZSBHbGlzc2UuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogRGF2ZSBBaXJsaWUKKyAqICAgICAgICAgIEFsZXggRGV1Y2hlcgorICogICAgICAgICAgSmVyb21lIEdsaXNzZQorICovCisjaWZuZGVmIF9fUlYyMDBEX0hfXworI2RlZmluZSBfX1JWMjAwRF9IX18KKworI2RlZmluZSBSXzAwMDE1Q19BR1BfQkFTRV8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDE1QworI2RlZmluZSAgIFNfMDAwMTVDX0FHUF9CQVNFX0FERFJfMih4KSAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMTVDX0FHUF9CQVNFX0FERFJfMih4KSAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGKQorI2RlZmluZSAgIENfMDAwMTVDX0FHUF9CQVNFX0FERFJfMiAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2MjUwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjI1MGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE3MGIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjI1MGQuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IDIwMDkgSmVyb21lIEdsaXNzZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBEYXZlIEFpcmxpZQorICogICAgICAgICAgQWxleCBEZXVjaGVyCisgKiAgICAgICAgICBKZXJvbWUgR2xpc3NlCisgKi8KKyNpZm5kZWYgX19SVjI1MERfSF9fCisjZGVmaW5lIF9fUlYyNTBEX0hfXworCisjZGVmaW5lIFJfMDAwMDBEX1NDTEtfQ05UTF9NNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBECisjZGVmaW5lICAgU18wMDAwMERfU0NMS19TUkNfU0VMKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDcpIDw8IDApCisjZGVmaW5lICAgR18wMDAwMERfU0NMS19TUkNfU0VMKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDcpCisjZGVmaW5lICAgQ18wMDAwMERfU0NMS19TUkNfU0VMICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGOAorI2RlZmluZSAgIFNfMDAwMDBEX0NQX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzKQorI2RlZmluZSAgIEdfMDAwMDBEX0NQX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpID4+IDMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0NQX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjcKKyNkZWZpbmUgICBTXzAwMDAwRF9IRFBfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgNCkKKyNkZWZpbmUgICBHXzAwMDAwRF9IRFBfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAoKCh4KSA+PiA0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9IRFBfTUFYX0RZTl9TVE9QX0xBVCAgICAgICAgICAgICAgICAweEZGRkZGRkVGCisjZGVmaW5lICAgU18wMDAwMERfVFZfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDUpCisjZGVmaW5lICAgR18wMDAwMERfVFZfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gNSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfVFZfTUFYX0RZTl9TVE9QX0xBVCAgICAgICAgICAgICAgICAgMHhGRkZGRkZERgorI2RlZmluZSAgIFNfMDAwMDBEX0UyX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA2KQorI2RlZmluZSAgIEdfMDAwMDBEX0UyX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpID4+IDYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0UyX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAgIDB4RkZGRkZGQkYKKyNkZWZpbmUgICBTXzAwMDAwRF9TRV9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgNykKKyNkZWZpbmUgICBHXzAwMDAwRF9TRV9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSA+PiA3KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRF9TRV9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgICAweEZGRkZGRjdGCisjZGVmaW5lICAgU18wMDAwMERfSURDVF9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDgpCisjZGVmaW5lICAgR18wMDAwMERfSURDVF9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgKCgoeCkgPj4gOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMERfSURDVF9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgMHhGRkZGRkVGRgorI2RlZmluZSAgIFNfMDAwMDBEX1ZJUF9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA5KQorI2RlZmluZSAgIEdfMDAwMDBEX1ZJUF9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICgoKHgpID4+IDkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX1ZJUF9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgIDB4RkZGRkZERkYKKyNkZWZpbmUgICBTXzAwMDAwRF9SRV9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTApCisjZGVmaW5lICAgR18wMDAwMERfUkVfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gMTApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX1JFX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAgIDB4RkZGRkZCRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9QQl9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTEpCisjZGVmaW5lICAgR18wMDAwMERfUEJfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gMTEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX1BCX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAgIDB4RkZGRkY3RkYKKyNkZWZpbmUgICBTXzAwMDAwRF9UQU1fTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTIpCisjZGVmaW5lICAgR18wMDAwMERfVEFNX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX1RBTV9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgIDB4RkZGRkVGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9URE1fTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTMpCisjZGVmaW5lICAgR18wMDAwMERfVERNX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgKCgoeCkgPj4gMTMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX1RETV9NQVhfRFlOX1NUT1BfTEFUICAgICAgICAgICAgICAgIDB4RkZGRkRGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9SQl9NQVhfRFlOX1NUT1BfTEFUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDAwMERfUkJfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX1JCX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9ESVNQMih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTUpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfRElTUDIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX0RJU1AyICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjdGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9DUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfQ1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX0NQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRUZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9IRFAoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTcpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfSERQKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX0hEUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGREZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9ESVNQMSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTgpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfRElTUDEoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX0RJU1AxICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGQkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTkpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGN0ZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9FMih4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfRTIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX0UyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9TRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfU0UoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9JRENUKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjIpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfSURDVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX0lEQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZCRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9WSVAoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjMpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVklQKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1ZJUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkY3RkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9SRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfUkUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9QQih4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfUEIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1BCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9UQU0oeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjYpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVEFNKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1RBTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkJGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9URE0oeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjcpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVERNKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1RETSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjdGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9SQih4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjgpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfUkIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1JCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9UVl9TQ0xLKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjkpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVFZfU0NMSyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1RWX1NDTEsgICAgICAgICAgICAgICAgICAgICAgIDB4REZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9TVUJQSUMoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzApCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfU1VCUElDKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1NVQlBJQyAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9PVjAoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfT1YwKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX09WMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2MzUwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjM1MGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzVjNWVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjM1MGQuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOSBKZXJvbWUgR2xpc3NlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IERhdmUgQWlybGllCisgKiAgICAgICAgICBBbGV4IERldWNoZXIKKyAqICAgICAgICAgIEplcm9tZSBHbGlzc2UKKyAqLworI2lmbmRlZiBfX1JWMzUwRF9IX18KKyNkZWZpbmUgX19SVjM1MERfSF9fCisKKy8qIFJWMzUwLCBSVjM4MCByZWdpc3RlcnMgKi8KKy8qICNkZWZpbmUgUl8wMDAwMERfU0NMS19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMEQgKi8KKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9WQVAoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVkFQKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1ZBUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9TUih4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfU1IoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9QWCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjYpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfUFgoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1BYICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkJGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9UWCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjcpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVFgoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjdGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9VUyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjgpCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfVVMoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAwRF9GT1JDRV9TVSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzApCisjZGVmaW5lICAgR18wMDAwMERfRk9SQ0VfU1UoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBEX0ZPUkNFX1NVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkZGRkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NTE1LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NTE1LmMKaW5kZXggZmQ3OTk3NC4uNDFhMzRjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjUxNS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY1MTUuYwpAQCAtMjksMzcgKzI5LDE3IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInJ2NTE1ZC5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgotCisjaW5jbHVkZSAiYXRvbS5oIgogI2luY2x1ZGUgInJ2NTE1X3JlZ19zYWZlLmgiCi0vKiBydjUxNSBkZXBlbmRzIG9uIDogKi8KLXZvaWQgcjEwMF9oZHBfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHIxMDBfY3BfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotaW50IHIxMDBfcmIyZF9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcjEwMF9ndWlfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1pbnQgcjEwMF9jcF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCByaW5nX3NpemUpOwotdm9pZCByNDIwX3BpcGVzX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczYwMF9tY19kaXNhYmxlX2NsaWVudHMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCByczYwMF9kaXNhYmxlX3ZnYShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKLS8qIFRoaXMgZmlsZXMgZ2F0aGVyIGZ1bmN0aW9ucyBzcGVjaWZpY3MgdG86Ci0gKiBydjUxNQotICoKLSAqIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IGJlIHVzZWQgYnkgbmV3ZXIgQVNJQ3MuCi0gKi8KKy8qIFRoaXMgZmlsZXMgZ2F0aGVyIGZ1bmN0aW9ucyBzcGVjaWZpY3MgdG86IHJ2NTE1ICovCiBpbnQgcnY1MTVfZGVidWdmc19waXBlc19pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJ2NTE1X2RlYnVnZnNfZ2FfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcnY1MTVfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJ2NTE1X21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCi0KLS8qCi0gKiBNQwotICovCi1pbnQgcnY1MTVfbWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3ZvaWQgcnY1MTVfZGVidWdmcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQl1aW50MzJfdCB0bXA7Ci0JaW50IHI7Ci0KIAlpZiAocjEwMF9kZWJ1Z2ZzX3JiYm1faW5pdChyZGV2KSkgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBkZWJ1Z2ZzIGZpbGUgZm9yIFJCQk0gIVxuIik7CiAJfQpAQCAtNjksNjcgKzQ5LDggQEAKIAlpZiAocnY1MTVfZGVidWdmc19nYV9pbmZvX2luaXQocmRldikpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBmaWxlIGZvciBwaXBlcyAhXG4iKTsKIAl9Ci0KLQlydjUxNV9ncHVfaW5pdChyZGV2KTsKLQlydjM3MF9wY2llX2dhcnRfZGlzYWJsZShyZGV2KTsKLQotCS8qIFNldHVwIEdQVSBtZW1vcnkgc3BhY2UgKi8KLQlyZGV2LT5tYy52cmFtX2xvY2F0aW9uID0gMHhGRkZGRkZGRlVMOwotCXJkZXYtPm1jLmd0dF9sb2NhdGlvbiA9IDB4RkZGRkZGRkZVTDsKLQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7Ci0JCXIgPSByYWRlb25fYWdwX2luaXQocmRldik7Ci0JCWlmIChyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJbZHJtXSBEaXNhYmxpbmcgQUdQXG4iKTsKLQkJCXJkZXYtPmZsYWdzICY9IH5SQURFT05fSVNfQUdQOwotCQkJcmRldi0+bWMuZ3R0X3NpemUgPSByYWRlb25fZ2FydF9zaXplICogMTAyNCAqIDEwMjQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZGV2LT5tYy5ndHRfbG9jYXRpb24gPSByZGV2LT5tYy5hZ3BfYmFzZTsKLQkJfQotCX0KLQlyID0gcmFkZW9uX21jX3NldHVwKHJkZXYpOwotCWlmIChyKSB7Ci0JCXJldHVybiByOwotCX0KLQotCS8qIFByb2dyYW0gR1BVIG1lbW9yeSBzcGFjZSAqLwotCXJzNjAwX21jX2Rpc2FibGVfY2xpZW50cyhyZGV2KTsKLQlpZiAocnY1MTVfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gd2FpdCBNQyBpZGxlIHdoaWxlICIKLQkJICAgICAgICJwcm9ncmFtbWluZyBwaXBlcy4gQmFkIHRoaW5ncyBtaWdodCBoYXBwZW4uXG4iKTsKLQl9Ci0JLyogV3JpdGUgVlJBTSBzaXplIGluIGNhc2Ugd2UgYXJlIGxpbWl0aW5nIGl0ICovCi0JV1JFRzMyKFJBREVPTl9DT05GSUdfTUVNU0laRSwgcmRldi0+bWMucmVhbF92cmFtX3NpemUpOwotCXRtcCA9IFJFR19TRVQoTUNfRkJfU1RBUlQsIHJkZXYtPm1jLnZyYW1fbG9jYXRpb24gPj4gMTYpOwotCVdSRUczMigweDEzNCwgdG1wKTsKLQl0bXAgPSByZGV2LT5tYy52cmFtX2xvY2F0aW9uICsgcmRldi0+bWMubWNfdnJhbV9zaXplIC0gMTsKLQl0bXAgPSBSRUdfU0VUKE1DX0ZCX1RPUCwgdG1wID4+IDE2KTsKLQl0bXAgfD0gUkVHX1NFVChNQ19GQl9TVEFSVCwgcmRldi0+bWMudnJhbV9sb2NhdGlvbiA+PiAxNik7Ci0JV1JFRzMyX01DKE1DX0ZCX0xPQ0FUSU9OLCB0bXApOwotCVdSRUczMihIRFBfRkJfTE9DQVRJT04sIHJkZXYtPm1jLnZyYW1fbG9jYXRpb24gPj4gMTYpOwotCVdSRUczMigweDMxMCwgcmRldi0+bWMudnJhbV9sb2NhdGlvbik7Ci0JaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewotCQl0bXAgPSByZGV2LT5tYy5ndHRfbG9jYXRpb24gKyByZGV2LT5tYy5ndHRfc2l6ZSAtIDE7Ci0JCXRtcCA9IFJFR19TRVQoTUNfQUdQX1RPUCwgdG1wID4+IDE2KTsKLQkJdG1wIHw9IFJFR19TRVQoTUNfQUdQX1NUQVJULCByZGV2LT5tYy5ndHRfbG9jYXRpb24gPj4gMTYpOwotCQlXUkVHMzJfTUMoTUNfQUdQX0xPQ0FUSU9OLCB0bXApOwotCQlXUkVHMzJfTUMoTUNfQUdQX0JBU0UsIHJkZXYtPm1jLmFncF9iYXNlKTsKLQkJV1JFRzMyX01DKE1DX0FHUF9CQVNFXzIsIDApOwotCX0gZWxzZSB7Ci0JCVdSRUczMl9NQyhNQ19BR1BfTE9DQVRJT04sIDB4MEZGRkZGRkYpOwotCQlXUkVHMzJfTUMoTUNfQUdQX0JBU0UsIDApOwotCQlXUkVHMzJfTUMoTUNfQUdQX0JBU0VfMiwgMCk7Ci0JfQotCXJldHVybiAwOwogfQogCi12b2lkIHJ2NTE1X21jX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCi17Ci19Ci0KLQotLyoKLSAqIEdsb2JhbCBHUFUgZnVuY3Rpb25zCi0gKi8KIHZvaWQgcnY1MTVfcmluZ19zdGFydChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgcjsKQEAgLTE5OCwxMSArMTE5LDYgQEAKIAlyYWRlb25fcmluZ191bmxvY2tfY29tbWl0KHJkZXYpOwogfQogCi12b2lkIHJ2NTE1X2VycmF0YShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlyZGV2LT5wbGxfZXJyYXRhID0gMDsKLX0KLQogaW50IHJ2NTE1X21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdW5zaWduZWQgaTsKQEAgLTIxOSw2ICsxMzUsMTIgQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3ZvaWQgcnY1MTVfdmdhX3JlbmRlcl9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCVdSRUczMihSXzAwMDMwMF9WR0FfUkVOREVSX0NPTlRST0wsCisJCVJSRUczMihSXzAwMDMwMF9WR0FfUkVOREVSX0NPTlRST0wpICYgQ18wMDAzMDBfVkdBX1ZTVEFUVVNfQ05UTCk7Cit9CisKIHZvaWQgcnY1MTVfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdW5zaWduZWQgcGlwZV9zZWxlY3RfY3VycmVudCwgZ2JfcGlwZV9zZWxlY3QsIHRtcDsKQEAgLTIzMSw3ICsxNTMsNyBAQAogCQkgICAgICAgInJlc2V0aW5nIEdQVS4gQmFkIHRoaW5ncyBtaWdodCBoYXBwZW4uXG4iKTsKIAl9CiAKLQlyczYwMF9kaXNhYmxlX3ZnYShyZGV2KTsKKwlydjUxNV92Z2FfcmVuZGVyX2Rpc2FibGUocmRldik7CiAKIAlyNDIwX3BpcGVzX2luaXQocmRldik7CiAJZ2JfcGlwZV9zZWxlY3QgPSBSUkVHMzIoMHg0MDJDKTsKQEAgLTMzNSwxMCArMjU3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0vKgotICogVlJBTSBpbmZvCi0gKi8KIHN0YXRpYyB2b2lkIHJ2NTE1X3ZyYW1fZ2V0X3R5cGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdWludDMyX3QgdG1wOwpAQCAtMzc0LDEwICsyOTIsNiBAQAogCXJkZXYtPnBtLnNjbGsuZnVsbCA9IHJmaXhlZF9kaXYocmRldi0+cG0uc2NsaywgYSk7CiB9CiAKLQotLyoKLSAqIEluZGlyZWN0IHJlZ2lzdGVycyBhY2Nlc3NvcgotICovCiB1aW50MzJfdCBydjUxNV9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpCiB7CiAJdWludDMyX3QgcjsKQEAgLTM5NSw5ICszMDksNiBAQAogCVdSRUczMihNQ19JTkRfSU5ERVgsIDApOwogfQogCi0vKgotICogRGVidWdmcyBpbmZvCi0gKi8KICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKIHN0YXRpYyBpbnQgcnY1MTVfZGVidWdmc19waXBlc19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKIHsKQEAgLTQ1OSwxMyArMzcwLDI1NyBAQAogI2VuZGlmCiB9CiAKLS8qCi0gKiBBc2ljIGluaXRpYWxpemF0aW9uCi0gKi8KLWludCBydjUxNV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQordm9pZCBydjUxNV9tY19zdG9wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSAqc2F2ZSkKK3sKKwlzYXZlLT5kMXZnYV9jb250cm9sID0gUlJFRzMyKFJfMDAwMzMwX0QxVkdBX0NPTlRST0wpOworCXNhdmUtPmQydmdhX2NvbnRyb2wgPSBSUkVHMzIoUl8wMDAzMzhfRDJWR0FfQ09OVFJPTCk7CisJc2F2ZS0+dmdhX3JlbmRlcl9jb250cm9sID0gUlJFRzMyKFJfMDAwMzAwX1ZHQV9SRU5ERVJfQ09OVFJPTCk7CisJc2F2ZS0+dmdhX2hkcF9jb250cm9sID0gUlJFRzMyKFJfMDAwMzI4X1ZHQV9IRFBfQ09OVFJPTCk7CisJc2F2ZS0+ZDFjcnRjX2NvbnRyb2wgPSBSUkVHMzIoUl8wMDYwODBfRDFDUlRDX0NPTlRST0wpOworCXNhdmUtPmQyY3J0Y19jb250cm9sID0gUlJFRzMyKFJfMDA2ODgwX0QyQ1JUQ19DT05UUk9MKTsKKworCS8qIFN0b3AgYWxsIHZpZGVvICovCisJV1JFRzMyKFJfMDAwMzMwX0QxVkdBX0NPTlRST0wsIDApOworCVdSRUczMihSXzAwNjhFOF9EMkNSVENfVVBEQVRFX0xPQ0ssIDApOworCVdSRUczMihSXzAwMDMwMF9WR0FfUkVOREVSX0NPTlRST0wsIDApOworCVdSRUczMihSXzAwNjBFOF9EMUNSVENfVVBEQVRFX0xPQ0ssIDEpOworCVdSRUczMihSXzAwNjhFOF9EMkNSVENfVVBEQVRFX0xPQ0ssIDEpOworCVdSRUczMihSXzAwNjA4MF9EMUNSVENfQ09OVFJPTCwgMCk7CisJV1JFRzMyKFJfMDA2ODgwX0QyQ1JUQ19DT05UUk9MLCAwKTsKKwlXUkVHMzIoUl8wMDYwRThfRDFDUlRDX1VQREFURV9MT0NLLCAwKTsKKwlXUkVHMzIoUl8wMDY4RThfRDJDUlRDX1VQREFURV9MT0NLLCAwKTsKK30KKwordm9pZCBydjUxNV9tY19yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCBydjUxNV9tY19zYXZlICpzYXZlKQoreworCVdSRUczMihSXzAwNjExMF9EMUdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MsIHJkZXYtPm1jLnZyYW1fc3RhcnQpOworCVdSRUczMihSXzAwNjExOF9EMUdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUywgcmRldi0+bWMudnJhbV9zdGFydCk7CisJV1JFRzMyKFJfMDA2OTEwX0QyR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUywgcmRldi0+bWMudnJhbV9zdGFydCk7CisJV1JFRzMyKFJfMDA2OTE4X0QyR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTLCByZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwlXUkVHMzIoUl8wMDAzMTBfVkdBX01FTU9SWV9CQVNFX0FERFJFU1MsIHJkZXYtPm1jLnZyYW1fc3RhcnQpOworCS8qIFVubG9jayBob3N0IGFjY2VzcyAqLworCVdSRUczMihSXzAwMDMyOF9WR0FfSERQX0NPTlRST0wsIHNhdmUtPnZnYV9oZHBfY29udHJvbCk7CisJbWRlbGF5KDEpOworCS8qIFJlc3RvcmUgdmlkZW8gc3RhdGUgKi8KKwlXUkVHMzIoUl8wMDYwRThfRDFDUlRDX1VQREFURV9MT0NLLCAxKTsKKwlXUkVHMzIoUl8wMDY4RThfRDJDUlRDX1VQREFURV9MT0NLLCAxKTsKKwlXUkVHMzIoUl8wMDYwODBfRDFDUlRDX0NPTlRST0wsIHNhdmUtPmQxY3J0Y19jb250cm9sKTsKKwlXUkVHMzIoUl8wMDY4ODBfRDJDUlRDX0NPTlRST0wsIHNhdmUtPmQyY3J0Y19jb250cm9sKTsKKwlXUkVHMzIoUl8wMDYwRThfRDFDUlRDX1VQREFURV9MT0NLLCAwKTsKKwlXUkVHMzIoUl8wMDY4RThfRDJDUlRDX1VQREFURV9MT0NLLCAwKTsKKwlXUkVHMzIoUl8wMDAzMzBfRDFWR0FfQ09OVFJPTCwgc2F2ZS0+ZDF2Z2FfY29udHJvbCk7CisJV1JFRzMyKFJfMDAwMzM4X0QyVkdBX0NPTlRST0wsIHNhdmUtPmQydmdhX2NvbnRyb2wpOworCVdSRUczMihSXzAwMDMwMF9WR0FfUkVOREVSX0NPTlRST0wsIHNhdmUtPnZnYV9yZW5kZXJfY29udHJvbCk7Cit9CisKK3ZvaWQgcnY1MTVfbWNfcHJvZ3JhbShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSBzYXZlOworCisJLyogU3RvcHMgYWxsIG1jIGNsaWVudHMgKi8KKwlydjUxNV9tY19zdG9wKHJkZXYsICZzYXZlKTsKKworCS8qIFdhaXQgZm9yIG1jIGlkbGUgKi8KKwlpZiAocnY1MTVfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiV2FpdCBNQyBpZGxlIHRpbWVvdXQgYmVmb3JlIHVwZGF0aW5nIE1DLlxuIik7CisJLyogV3JpdGUgVlJBTSBzaXplIGluIGNhc2Ugd2UgYXJlIGxpbWl0aW5nIGl0ICovCisJV1JFRzMyKFJfMDAwMEY4X0NPTkZJR19NRU1TSVpFLCByZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSk7CisJLyogUHJvZ3JhbSBNQywgc2hvdWxkIGJlIGEgMzJiaXRzIGxpbWl0ZWQgYWRkcmVzcyBzcGFjZSAqLworCVdSRUczMl9NQyhSXzAwMDAwMV9NQ19GQl9MT0NBVElPTiwKKwkJCVNfMDAwMDAxX01DX0ZCX1NUQVJUKHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTYpIHwKKwkJCVNfMDAwMDAxX01DX0ZCX1RPUChyZGV2LT5tYy52cmFtX2VuZCA+PiAxNikpOworCVdSRUczMihSXzAwMDEzNF9IRFBfRkJfTE9DQVRJT04sCisJCVNfMDAwMTM0X0hEUF9GQl9TVEFSVChyZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDE2KSk7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgeworCQlXUkVHMzJfTUMoUl8wMDAwMDJfTUNfQUdQX0xPQ0FUSU9OLAorCQkJU18wMDAwMDJfTUNfQUdQX1NUQVJUKHJkZXYtPm1jLmd0dF9zdGFydCA+PiAxNikgfAorCQkJU18wMDAwMDJfTUNfQUdQX1RPUChyZGV2LT5tYy5ndHRfZW5kID4+IDE2KSk7CisJCVdSRUczMl9NQyhSXzAwMDAwM19NQ19BR1BfQkFTRSwgbG93ZXJfMzJfYml0cyhyZGV2LT5tYy5hZ3BfYmFzZSkpOworCQlXUkVHMzJfTUMoUl8wMDAwMDRfTUNfQUdQX0JBU0VfMiwKKwkJCVNfMDAwMDA0X0FHUF9CQVNFX0FERFJfMih1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLmFncF9iYXNlKSkpOworCX0gZWxzZSB7CisJCVdSRUczMl9NQyhSXzAwMDAwMl9NQ19BR1BfTE9DQVRJT04sIDB4RkZGRkZGRkYpOworCQlXUkVHMzJfTUMoUl8wMDAwMDNfTUNfQUdQX0JBU0UsIDApOworCQlXUkVHMzJfTUMoUl8wMDAwMDRfTUNfQUdQX0JBU0VfMiwgMCk7CisJfQorCisJcnY1MTVfbWNfcmVzdW1lKHJkZXYsICZzYXZlKTsKK30KKwordm9pZCBydjUxNV9jbG9ja19zdGFydHVwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWlmIChyYWRlb25fZHluY2xrcyAhPSAtMSAmJiByYWRlb25fZHluY2xrcykKKwkJcmFkZW9uX2F0b21fc2V0X2Nsb2NrX2dhdGluZyhyZGV2LCAxKTsKKwkvKiBXZSBuZWVkIHRvIGZvcmNlIG9uIHNvbWUgb2YgdGhlIGJsb2NrICovCisJV1JFRzMyX1BMTChSXzAwMDAwRl9DUF9EWU5fQ05UTCwKKwkJUlJFRzMyX1BMTChSXzAwMDAwRl9DUF9EWU5fQ05UTCkgfCBTXzAwMDAwRl9DUF9GT1JDRU9OKDEpKTsKKwlXUkVHMzJfUExMKFJfMDAwMDExX0UyX0RZTl9DTlRMLAorCQlSUkVHMzJfUExMKFJfMDAwMDExX0UyX0RZTl9DTlRMKSB8IFNfMDAwMDExX0UyX0ZPUkNFT04oMSkpOworCVdSRUczMl9QTEwoUl8wMDAwMTNfSURDVF9EWU5fQ05UTCwKKwkJUlJFRzMyX1BMTChSXzAwMDAxM19JRENUX0RZTl9DTlRMKSB8IFNfMDAwMDEzX0lEQ1RfRk9SQ0VPTigxKSk7Cit9CisKK3N0YXRpYyBpbnQgcnY1MTVfc3RhcnR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcjsKKworCXJ2NTE1X21jX3Byb2dyYW0ocmRldik7CisJLyogUmVzdW1lIGNsb2NrICovCisJcnY1MTVfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBJbml0aWFsaXplIEdQVSBjb25maWd1cmF0aW9uICgjIHBpcGVzLCAuLi4pICovCisJcnY1MTVfZ3B1X2luaXQocmRldik7CisJLyogSW5pdGlhbGl6ZSBHQVJUIChpbml0aWFsaXplIGFmdGVyIFRUTSBzbyB3ZSBjYW4gYWxsb2NhdGUKKwkgKiBtZW1vcnkgdGhyb3VnaCBUVE0gYnV0IGZpbmFsaXplIGFmdGVyIFRUTSkgKi8KKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkgeworCQlyID0gcnYzNzBfcGNpZV9nYXJ0X2VuYWJsZShyZGV2KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisJLyogRW5hYmxlIElSUSAqLworCXJkZXYtPmlycS5zd19pbnQgPSB0cnVlOworCXJzNjAwX2lycV9zZXQocmRldik7CisJLyogMU0gcmluZyBidWZmZXIgKi8KKwlyID0gcjEwMF9jcF9pbml0KHJkZXYsIDEwMjQgKiAxMDI0KTsKKwlpZiAocikgeworCQlkZXZfZXJyKHJkZXYtPmRldiwgImZhaWxsZWQgaW5pdGlhbGl6aW5nIENQICglZCkuXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCXIgPSByMTAwX3diX2luaXQocmRldik7CisJaWYgKHIpCisJCWRldl9lcnIocmRldi0+ZGV2LCAiZmFpbGxlZCBpbml0aWFsaXppbmcgV0IgKCVkKS5cbiIsIHIpOworCXIgPSByMTAwX2liX2luaXQocmRldik7CisJaWYgKHIpIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJmYWlsbGVkIGluaXRpYWxpemluZyBJQiAoJWQpLlxuIiwgcik7CisJCXJldHVybiByOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ2NTE1X3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwkvKiBNYWtlIHN1ciBHQVJUIGFyZSBub3Qgd29ya2luZyAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKQorCQlydjM3MF9wY2llX2dhcnRfZGlzYWJsZShyZGV2KTsKKwkvKiBSZXN1bWUgY2xvY2sgYmVmb3JlIGRvaW5nIHJlc2V0ICovCisJcnY1MTVfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwkvKiBSZXNldCBncHUgYmVmb3JlIHBvc3Rpbmcgb3RoZXJ3aXNlIEFUT00gd2lsbCBlbnRlciBpbmZpbml0ZSBsb29wICovCisJaWYgKHJhZGVvbl9ncHVfcmVzZXQocmRldikpIHsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiR1BVIHJlc2V0IGZhaWxlZCAhICgweEU0MD0weCUwOFgsIDB4N0MwPTB4JTA4WClcbiIsCisJCQlSUkVHMzIoUl8wMDBFNDBfUkJCTV9TVEFUVVMpLAorCQkJUlJFRzMyKFJfMDAwN0MwX0NQX1NUQVQpKTsKKwl9CisJLyogcG9zdCAqLworCWF0b21fYXNpY19pbml0KHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOworCS8qIFJlc3VtZSBjbG9jayBhZnRlciBwb3N0aW5nICovCisJcnY1MTVfY2xvY2tfc3RhcnR1cChyZGV2KTsKKwlyZXR1cm4gcnY1MTVfc3RhcnR1cChyZGV2KTsKK30KKworaW50IHJ2NTE1X3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcjEwMF9jcF9kaXNhYmxlKHJkZXYpOworCXIxMDBfd2JfZGlzYWJsZShyZGV2KTsKKwlyczYwMF9pcnFfZGlzYWJsZShyZGV2KTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJcnYzNzBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnY1MTVfc2V0X3NhZmVfcmVnaXN0ZXJzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXJkZXYtPmNvbmZpZy5yMzAwLnJlZ19zYWZlX2JtID0gcnY1MTVfcmVnX3NhZmVfYm07CiAJcmRldi0+Y29uZmlnLnIzMDAucmVnX3NhZmVfYm1fc2l6ZSA9IEFSUkFZX1NJWkUocnY1MTVfcmVnX3NhZmVfYm0pOworfQorCit2b2lkIHJ2NTE1X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJcnY1MTVfc3VzcGVuZChyZGV2KTsKKwlyMTAwX2NwX2ZpbmkocmRldik7CisJcjEwMF93Yl9maW5pKHJkZXYpOworCXIxMDBfaWJfZmluaShyZGV2KTsKKwlyYWRlb25fZ2VtX2ZpbmkocmRldik7CisgICAgcnYzNzBfcGNpZV9nYXJ0X2ZpbmkocmRldik7CisJcmFkZW9uX2FncF9maW5pKHJkZXYpOworCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CisJcmFkZW9uX2ZlbmNlX2RyaXZlcl9maW5pKHJkZXYpOworCXJhZGVvbl9vYmplY3RfZmluaShyZGV2KTsKKwlyYWRlb25fYXRvbWJpb3NfZmluaShyZGV2KTsKKwlrZnJlZShyZGV2LT5iaW9zKTsKKwlyZGV2LT5iaW9zID0gTlVMTDsKK30KKworaW50IHJ2NTE1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHI7CisKKwkvKiBJbml0aWFsaXplIHNjcmF0Y2ggcmVnaXN0ZXJzICovCisJcmFkZW9uX3NjcmF0Y2hfaW5pdChyZGV2KTsKKwkvKiBJbml0aWFsaXplIHN1cmZhY2UgcmVnaXN0ZXJzICovCisJcmFkZW9uX3N1cmZhY2VfaW5pdChyZGV2KTsKKwkvKiBUT0RPOiBkaXNhYmxlIFZHQSBuZWVkIHRvIHVzZSBWR0EgcmVxdWVzdCAqLworCS8qIEJJT1MqLworCWlmICghcmFkZW9uX2dldF9iaW9zKHJkZXYpKSB7CisJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZGV2LT5pc19hdG9tX2Jpb3MpIHsKKwkJciA9IHJhZGVvbl9hdG9tYmlvc19pbml0KHJkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0gZWxzZSB7CisJCWRldl9lcnIocmRldi0+ZGV2LCAiRXhwZWN0aW5nIGF0b21iaW9zIGZvciBSVjUxNSBHUFVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogUmVzZXQgZ3B1IGJlZm9yZSBwb3N0aW5nIG90aGVyd2lzZSBBVE9NIHdpbGwgZW50ZXIgaW5maW5pdGUgbG9vcCAqLworCWlmIChyYWRlb25fZ3B1X3Jlc2V0KHJkZXYpKSB7CisJCWRldl93YXJuKHJkZXYtPmRldiwKKwkJCSJHUFUgcmVzZXQgZmFpbGVkICEgKDB4RTQwPTB4JTA4WCwgMHg3QzA9MHglMDhYKVxuIiwKKwkJCVJSRUczMihSXzAwMEU0MF9SQkJNX1NUQVRVUyksCisJCQlSUkVHMzIoUl8wMDA3QzBfQ1BfU1RBVCkpOworCX0KKwkvKiBjaGVjayBpZiBjYXJkcyBhcmUgcG9zdGVkIG9yIG5vdCAqLworCWlmICghcmFkZW9uX2NhcmRfcG9zdGVkKHJkZXYpICYmIHJkZXYtPmJpb3MpIHsKKwkJRFJNX0lORk8oIkdQVSBub3QgcG9zdGVkLiBwb3N0aW5nIG5vdy4uLlxuIik7CisJCWF0b21fYXNpY19pbml0KHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOworCX0KKwkvKiBJbml0aWFsaXplIGNsb2NrcyAqLworCXJhZGVvbl9nZXRfY2xvY2tfaW5mbyhyZGV2LT5kZGV2KTsKKwkvKiBHZXQgdnJhbSBpbmZvcm1hdGlvbnMgKi8KKwlydjUxNV92cmFtX2luZm8ocmRldik7CisJLyogSW5pdGlhbGl6ZSBtZW1vcnkgY29udHJvbGxlciAoYWxzbyB0ZXN0IEFHUCkgKi8KKwlyID0gcjQyMF9tY19pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlydjUxNV9kZWJ1Z2ZzKHJkZXYpOworCS8qIEZlbmNlIGRyaXZlciAqLworCXIgPSByYWRlb25fZmVuY2VfZHJpdmVyX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXIgPSByYWRlb25faXJxX2ttc19pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwkvKiBNZW1vcnkgbWFuYWdlciAqLworCXIgPSByYWRlb25fb2JqZWN0X2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCXIgPSBydjM3MF9wY2llX2dhcnRfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJcnY1MTVfc2V0X3NhZmVfcmVnaXN0ZXJzKHJkZXYpOworCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSB0cnVlOworCXIgPSBydjUxNV9zdGFydHVwKHJkZXYpOworCWlmIChyKSB7CisJCS8qIFNvbWV0aGluZ3Mgd2FudCB3cm9udCB3aXRoIHRoZSBhY2NlbCBpbml0IHN0b3AgYWNjZWwgKi8KKwkJZGV2X2VycihyZGV2LT5kZXYsICJEaXNhYmxpbmcgR1BVIGFjY2VsZXJhdGlvblxuIik7CisJCXJ2NTE1X3N1c3BlbmQocmRldik7CisJCXIxMDBfY3BfZmluaShyZGV2KTsKKwkJcjEwMF93Yl9maW5pKHJkZXYpOworCQlyMTAwX2liX2ZpbmkocmRldik7CisJCXJ2MzcwX3BjaWVfZ2FydF9maW5pKHJkZXYpOworCQlyYWRlb25fYWdwX2ZpbmkocmRldik7CisJCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CisJCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY1MTVkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NTE1ZC5oCmluZGV4IGE2NWUxN2UuLmZjMjE2ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY1MTVkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjUxNWQuaApAQCAtMjE2LDUgKzIxNiwzODggQEAKICNkZWZpbmUgQ1BfUEFDS0VUMF9HRVRfT05FX1JFR19XUihoKSAoKChoKSA+PiAxNSkgJiAxKQogI2RlZmluZSBDUF9QQUNLRVQzX0dFVF9PUENPREUoaCkgKCgoaCkgPj4gOCkgJiAweEZGKQogCi0jZW5kaWYKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBSXzAwMDBGOF9DT05GSUdfTUVNU0laRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGOAorI2RlZmluZSAgIFNfMDAwMEY4X0NPTkZJR19NRU1TSVpFKHgpICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGRkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDBGOF9DT05GSUdfTUVNU0laRSh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRkZGRkYpCisjZGVmaW5lICAgQ18wMDAwRjhfQ09ORklHX01FTVNJWkUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBSXzAwMDEzNF9IRFBfRkJfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAweDAwMDEzNAorI2RlZmluZSAgIFNfMDAwMTM0X0hEUF9GQl9TVEFSVCh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMTM0X0hEUF9GQl9TVEFSVCh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGRkZGKQorI2RlZmluZSAgIENfMDAwMTM0X0hEUF9GQl9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgUl8wMDAzMDBfVkdBX1JFTkRFUl9DT05UUk9MICAgICAgICAgICAgICAgICAgMHgwMDAzMDAKKyNkZWZpbmUgICBTXzAwMDMwMF9WR0FfQkxJTktfUkFURSh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MUYpIDw8IDApCisjZGVmaW5lICAgR18wMDAzMDBfVkdBX0JMSU5LX1JBVEUoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDFGKQorI2RlZmluZSAgIENfMDAwMzAwX1ZHQV9CTElOS19SQVRFICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRTAKKyNkZWZpbmUgICBTXzAwMDMwMF9WR0FfQkxJTktfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgNSkKKyNkZWZpbmUgICBHXzAwMDMwMF9WR0FfQkxJTktfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiA1KSAmIDB4MykKKyNkZWZpbmUgICBDXzAwMDMwMF9WR0FfQkxJTktfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRjlGCisjZGVmaW5lICAgU18wMDAzMDBfVkdBX0NVUlNPUl9CTElOS19JTlZFUlQoeCkgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDcpCisjZGVmaW5lICAgR18wMDAzMDBfVkdBX0NVUlNPUl9CTElOS19JTlZFUlQoeCkgICAgICAgICAgKCgoeCkgPj4gNykgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMDBfVkdBX0NVUlNPUl9CTElOS19JTlZFUlQgICAgICAgICAgICAgMHhGRkZGRkY3RgorI2RlZmluZSAgIFNfMDAwMzAwX1ZHQV9FWFREX0FERFJfQ09VTlRfRU5BQkxFKHgpICAgICAgICgoKHgpICYgMHgxKSA8PCA4KQorI2RlZmluZSAgIEdfMDAwMzAwX1ZHQV9FWFREX0FERFJfQ09VTlRfRU5BQkxFKHgpICAgICAgICgoKHgpID4+IDgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMzAwX1ZHQV9FWFREX0FERFJfQ09VTlRfRU5BQkxFICAgICAgICAgIDB4RkZGRkZFRkYKKyNkZWZpbmUgICBTXzAwMDMwMF9WR0FfVlNUQVRVU19DTlRMKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMTYpCisjZGVmaW5lICAgR18wMDAzMDBfVkdBX1ZTVEFUVVNfQ05UTCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHgzKQorI2RlZmluZSAgIENfMDAwMzAwX1ZHQV9WU1RBVFVTX0NOVEwgICAgICAgICAgICAgICAgICAgIDB4RkZGQ0ZGRkYKKyNkZWZpbmUgICBTXzAwMDMwMF9WR0FfTE9DS184RE9UKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDAzMDBfVkdBX0xPQ0tfOERPVCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMzAwX1ZHQV9MT0NLXzhET1QgICAgICAgICAgICAgICAgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgICBTXzAwMDMwMF9WR0FSRUdfTElORUNNUF9DT01QQVRJQklMSVRZX1NFTCh4KSAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDAzMDBfVkdBUkVHX0xJTkVDTVBfQ09NUEFUSUJJTElUWV9TRUwoeCkgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMzAwX1ZHQVJFR19MSU5FQ01QX0NPTVBBVElCSUxJVFlfU0VMICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgUl8wMDAzMTBfVkdBX01FTU9SWV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgMHgwMDAzMTAKKyNkZWZpbmUgICBTXzAwMDMxMF9WR0FfTUVNT1JZX0JBU0VfQUREUkVTUyh4KSAgICAgICAgICAoKCh4KSAmIDB4RkZGRkZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAzMTBfVkdBX01FTU9SWV9CQVNFX0FERFJFU1MoeCkgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkZGRkZGKQorI2RlZmluZSAgIENfMDAwMzEwX1ZHQV9NRU1PUllfQkFTRV9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUl8wMDAzMjhfVkdBX0hEUF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMjgKKyNkZWZpbmUgICBTXzAwMDMyOF9WR0FfTUVNX1BBR0VfU0VMRUNUX0VOKHgpICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDMyOF9WR0FfTUVNX1BBR0VfU0VMRUNUX0VOKHgpICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDMyOF9WR0FfTUVNX1BBR0VfU0VMRUNUX0VOICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lICAgU18wMDAzMjhfVkdBX1JCQk1fTE9DS19ESVNBQkxFKHgpICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDgpCisjZGVmaW5lICAgR18wMDAzMjhfVkdBX1JCQk1fTE9DS19ESVNBQkxFKHgpICAgICAgICAgICAgKCgoeCkgPj4gOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMjhfVkdBX1JCQk1fTE9DS19ESVNBQkxFICAgICAgICAgICAgICAgMHhGRkZGRkVGRgorI2RlZmluZSAgIFNfMDAwMzI4X1ZHQV9TT0ZUX1JFU0VUKHgpICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwMDMyOF9WR0FfU09GVF9SRVNFVCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMjhfVkdBX1NPRlRfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSAgIFNfMDAwMzI4X1ZHQV9URVNUX1JFU0VUX0NPTlRST0woeCkgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyNCkKKyNkZWZpbmUgICBHXzAwMDMyOF9WR0FfVEVTVF9SRVNFVF9DT05UUk9MKHgpICAgICAgICAgICAoKCh4KSA+PiAyNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMjhfVkdBX1RFU1RfUkVTRVRfQ09OVFJPTCAgICAgICAgICAgICAgMHhGRUZGRkZGRgorI2RlZmluZSBSXzAwMDMzMF9EMVZHQV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMzMAorI2RlZmluZSAgIFNfMDAwMzMwX0QxVkdBX01PREVfRU5BQkxFKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMzMwX0QxVkdBX01PREVfRU5BQkxFKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMzMwX0QxVkdBX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDMzMF9EMVZHQV9USU1JTkdfU0VMRUNUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOCkKKyNkZWZpbmUgICBHXzAwMDMzMF9EMVZHQV9USU1JTkdfU0VMRUNUKHgpICAgICAgICAgICAgICAoKCh4KSA+PiA4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDMzMF9EMVZHQV9USU1JTkdfU0VMRUNUICAgICAgICAgICAgICAgICAweEZGRkZGRUZGCisjZGVmaW5lICAgU18wMDAzMzBfRDFWR0FfU1lOQ19QT0xBUklUWV9TRUxFQ1QoeCkgICAgICAgKCgoeCkgJiAweDEpIDw8IDkpCisjZGVmaW5lICAgR18wMDAzMzBfRDFWR0FfU1lOQ19QT0xBUklUWV9TRUxFQ1QoeCkgICAgICAgKCgoeCkgPj4gOSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMzBfRDFWR0FfU1lOQ19QT0xBUklUWV9TRUxFQ1QgICAgICAgICAgMHhGRkZGRkRGRgorI2RlZmluZSAgIFNfMDAwMzMwX0QxVkdBX09WRVJTQ0FOX1RJTUlOR19TRUxFQ1QoeCkgICAgICgoKHgpICYgMHgxKSA8PCAxMCkKKyNkZWZpbmUgICBHXzAwMDMzMF9EMVZHQV9PVkVSU0NBTl9USU1JTkdfU0VMRUNUKHgpICAgICAoKCh4KSA+PiAxMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMzBfRDFWR0FfT1ZFUlNDQU5fVElNSU5HX1NFTEVDVCAgICAgICAgMHhGRkZGRkJGRgorI2RlZmluZSAgIFNfMDAwMzMwX0QxVkdBX09WRVJTQ0FOX0NPTE9SX0VOKHgpICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwMDMzMF9EMVZHQV9PVkVSU0NBTl9DT0xPUl9FTih4KSAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMzBfRDFWR0FfT1ZFUlNDQU5fQ09MT1JfRU4gICAgICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSAgIFNfMDAwMzMwX0QxVkdBX1JPVEFURSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAyNCkKKyNkZWZpbmUgICBHXzAwMDMzMF9EMVZHQV9ST1RBVEUoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNCkgJiAweDMpCisjZGVmaW5lICAgQ18wMDAzMzBfRDFWR0FfUk9UQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHhGQ0ZGRkZGRgorI2RlZmluZSBSXzAwMDMzOF9EMlZHQV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMzOAorI2RlZmluZSAgIFNfMDAwMzM4X0QyVkdBX01PREVfRU5BQkxFKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMzM4X0QyVkdBX01PREVfRU5BQkxFKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMzM4X0QyVkdBX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDMzOF9EMlZHQV9USU1JTkdfU0VMRUNUKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOCkKKyNkZWZpbmUgICBHXzAwMDMzOF9EMlZHQV9USU1JTkdfU0VMRUNUKHgpICAgICAgICAgICAgICAoKCh4KSA+PiA4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDMzOF9EMlZHQV9USU1JTkdfU0VMRUNUICAgICAgICAgICAgICAgICAweEZGRkZGRUZGCisjZGVmaW5lICAgU18wMDAzMzhfRDJWR0FfU1lOQ19QT0xBUklUWV9TRUxFQ1QoeCkgICAgICAgKCgoeCkgJiAweDEpIDw8IDkpCisjZGVmaW5lICAgR18wMDAzMzhfRDJWR0FfU1lOQ19QT0xBUklUWV9TRUxFQ1QoeCkgICAgICAgKCgoeCkgPj4gOSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMzhfRDJWR0FfU1lOQ19QT0xBUklUWV9TRUxFQ1QgICAgICAgICAgMHhGRkZGRkRGRgorI2RlZmluZSAgIFNfMDAwMzM4X0QyVkdBX09WRVJTQ0FOX1RJTUlOR19TRUxFQ1QoeCkgICAgICgoKHgpICYgMHgxKSA8PCAxMCkKKyNkZWZpbmUgICBHXzAwMDMzOF9EMlZHQV9PVkVSU0NBTl9USU1JTkdfU0VMRUNUKHgpICAgICAoKCh4KSA+PiAxMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMzhfRDJWR0FfT1ZFUlNDQU5fVElNSU5HX1NFTEVDVCAgICAgICAgMHhGRkZGRkJGRgorI2RlZmluZSAgIFNfMDAwMzM4X0QyVkdBX09WRVJTQ0FOX0NPTE9SX0VOKHgpICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwMDMzOF9EMlZHQV9PVkVSU0NBTl9DT0xPUl9FTih4KSAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweDEpCisjZGVmaW5lICAgQ18wMDAzMzhfRDJWR0FfT1ZFUlNDQU5fQ09MT1JfRU4gICAgICAgICAgICAgMHhGRkZFRkZGRgorI2RlZmluZSAgIFNfMDAwMzM4X0QyVkdBX1JPVEFURSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAyNCkKKyNkZWZpbmUgICBHXzAwMDMzOF9EMlZHQV9ST1RBVEUoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyNCkgJiAweDMpCisjZGVmaW5lICAgQ18wMDAzMzhfRDJWR0FfUk9UQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHhGQ0ZGRkZGRgorI2RlZmluZSBSXzAwMDdDMF9DUF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDdDMAorI2RlZmluZSAgIFNfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwN0MwX01SVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX01SVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMSkKKyNkZWZpbmUgICBHXzAwMDdDMF9NV1VfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9NV1VfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZECisjZGVmaW5lICAgU18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIpCisjZGVmaW5lICAgR18wMDA3QzBfUlNJVV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDA3QzBfUlNJVV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGQgorI2RlZmluZSAgIFNfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzKQorI2RlZmluZSAgIEdfMDAwN0MwX1JDSVVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwN0MwX1JDSVVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjcKKyNkZWZpbmUgICBTXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgOSkKKyNkZWZpbmUgICBHXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZKHgpICAgICAgICAgICAgICAgICAoKCh4KSA+PiA5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGREZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZGQkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX1BSSU1BUllfQlVTWSh4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDExKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9QUklNQVJZX0JVU1koeCkgICAgICAgICAgICAgICAgICgoKHgpID4+IDExKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfUFJJTUFSWV9CVVNZICAgICAgICAgICAgICAgICAgICAweEZGRkZGN0ZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUX0JVU1koeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVF9CVVNZKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1RfQlVTWSAgICAgICAgICAgICAgICAgICAweEZGRkZFRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NJX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEzKQorI2RlZmluZSAgIEdfMDAwN0MwX0NTSV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDEzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0lfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZERkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NGX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE0KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTRl9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDE0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU0ZfSU5ESVJFQ1QyX0JVU1kgICAgICAgICAgICAgICAgICAweEZGRkZCRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1NRX0lORElSRUNUMl9CVVNZKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDE1KQorI2RlZmluZSAgIEdfMDAwN0MwX0NTUV9JTkRJUkVDVDJfQlVTWSh4KSAgICAgICAgICAgICAgICgoKHgpID4+IDE1KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DU1FfSU5ESVJFQ1QyX0JVU1kgICAgICAgICAgICAgICAgICAweEZGRkY3RkZGCisjZGVmaW5lICAgU18wMDA3QzBfR1VJRE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI4KQorI2RlZmluZSAgIEdfMDAwN0MwX0dVSURNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9HVUlETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweEVGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfVklERE1BX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDI5KQorI2RlZmluZSAgIEdfMDAwN0MwX1ZJRERNQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI5KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9WSURETUFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMwKQorI2RlZmluZSAgIEdfMDAwN0MwX0NNRFNUUk1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DTURTVFJNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGRkZGCisjZGVmaW5lICAgU18wMDA3QzBfQ1BfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQorI2RlZmluZSAgIEdfMDAwN0MwX0NQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDdDMF9DUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCisjZGVmaW5lIFJfMDAwRTQwX1JCQk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTQwCisjZGVmaW5lICAgU18wMDBFNDBfQ01ERklGT19BVkFJTCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDdGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwRTQwX0NNREZJRk9fQVZBSUwoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHg3RikKKyNkZWZpbmUgICBDXzAwMEU0MF9DTURGSUZPX0FWQUlMICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRjgwCisjZGVmaW5lICAgU18wMDBFNDBfSElSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDgpCisjZGVmaW5lICAgR18wMDBFNDBfSElSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gOCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDBFNDBfSElSUV9PTl9SQkIgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkVGRgorI2RlZmluZSAgIFNfMDAwRTQwX0NQUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA5KQorI2RlZmluZSAgIEdfMDAwRTQwX0NQUlFfT05fUkJCKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZERkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRlJRX09OX1JCQih4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTApCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZSUV9PTl9SQkIoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGUlFfT05fUkJCICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZCRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9ISVJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTEpCisjZGVmaW5lICAgR18wMDBFNDBfSElSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0hJUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkY3RkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUFJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTIpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkVGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRlJRX0lOX1JUQlVGKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTMpCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZSUV9JTl9SVEJVRih4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGUlFfSU5fUlRCVUYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkRGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DRl9QSVBFX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTQpCisjZGVmaW5lICAgR18wMDBFNDBfQ0ZfUElQRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NGX1BJUEVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkJGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9FTkdfRVZfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTUpCisjZGVmaW5lICAgR18wMDBFNDBfRU5HX0VWX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0VOR19FVl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjdGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DUF9DTURTVFJNX0JVU1koeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDBFNDBfQ1BfQ01EU1RSTV9CVVNZKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NQX0NNRFNUUk1fQlVTWSAgICAgICAgICAgICAgICAgICAgIDB4RkZGRUZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9FMl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTcpCisjZGVmaW5lICAgR18wMDBFNDBfRTJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0UyX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGREZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQjJEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTgpCisjZGVmaW5lICAgR18wMDBFNDBfUkIyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCMkRfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGQkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQjNEX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMTkpCisjZGVmaW5lICAgR18wMDBFNDBfUkIzRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMTkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCM0RfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGN0ZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9WQVBfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDBFNDBfVkFQX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1ZBUF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SRV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDBFNDBfUkVfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9UQU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjIpCisjZGVmaW5lICAgR18wMDBFNDBfVEFNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RBTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZCRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9URE1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjMpCisjZGVmaW5lICAgR18wMDBFNDBfVERNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RETV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkY3RkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9QQl9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDBFNDBfUEJfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1BCX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9USU1fQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjUpCisjZGVmaW5lICAgR18wMDBFNDBfVElNX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1RJTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkRGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9HQV9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjYpCisjZGVmaW5lICAgR18wMDBFNDBfR0FfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjYpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0dBX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkJGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9DQkEyRF9CVVNZKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjcpCisjZGVmaW5lICAgR18wMDBFNDBfQ0JBMkRfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjcpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0NCQTJEX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjdGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9SQkJNX0hJQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjgpCisjZGVmaW5lICAgR18wMDBFNDBfUkJCTV9ISUJVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjgpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1JCQk1fSElCVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9TS0lEX0NGQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjkpCisjZGVmaW5lICAgR18wMDBFNDBfU0tJRF9DRkJVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjkpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1NLSURfQ0ZCVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4REZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9WQVBfVkZfQlVTWSh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzApCisjZGVmaW5lICAgR18wMDBFNDBfVkFQX1ZGX0JVU1koeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzApICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX1ZBUF9WRl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkZGRkYKKyNkZWZpbmUgICBTXzAwMEU0MF9HVUlfQUNUSVZFKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lICAgR18wMDBFNDBfR1VJX0FDVElWRSh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMzEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwRTQwX0dVSV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKKyNkZWZpbmUgUl8wMDYwODBfRDFDUlRDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwODAKKyNkZWZpbmUgICBTXzAwNjA4MF9EMUNSVENfTUFTVEVSX0VOKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBHXzAwNjA4MF9EMUNSVENfTUFTVEVSX0VOKHgpICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjA4MF9EMUNSVENfTUFTVEVSX0VOICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lICAgU18wMDYwODBfRDFDUlRDX1NZTkNfUkVTRVRfU0VMKHgpICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDQpCisjZGVmaW5lICAgR18wMDYwODBfRDFDUlRDX1NZTkNfUkVTRVRfU0VMKHgpICAgICAgICAgICAgKCgoeCkgPj4gNCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDYwODBfRDFDUlRDX1NZTkNfUkVTRVRfU0VMICAgICAgICAgICAgICAgMHhGRkZGRkZFRgorI2RlZmluZSAgIFNfMDA2MDgwX0QxQ1JUQ19ESVNBQkxFX1BPSU5UX0NOVEwoeCkgICAgICAgICgoKHgpICYgMHgzKSA8PCA4KQorI2RlZmluZSAgIEdfMDA2MDgwX0QxQ1JUQ19ESVNBQkxFX1BPSU5UX0NOVEwoeCkgICAgICAgICgoKHgpID4+IDgpICYgMHgzKQorI2RlZmluZSAgIENfMDA2MDgwX0QxQ1JUQ19ESVNBQkxFX1BPSU5UX0NOVEwgICAgICAgICAgIDB4RkZGRkZDRkYKKyNkZWZpbmUgICBTXzAwNjA4MF9EMUNSVENfQ1VSUkVOVF9NQVNURVJfRU5fU1RBVEUoeCkgICAoKCh4KSAmIDB4MSkgPDwgMTYpCisjZGVmaW5lICAgR18wMDYwODBfRDFDUlRDX0NVUlJFTlRfTUFTVEVSX0VOX1NUQVRFKHgpICAgKCgoeCkgPj4gMTYpICYgMHgxKQorI2RlZmluZSAgIENfMDA2MDgwX0QxQ1JUQ19DVVJSRU5UX01BU1RFUl9FTl9TVEFURSAgICAgIDB4RkZGRUZGRkYKKyNkZWZpbmUgICBTXzAwNjA4MF9EMUNSVENfRElTUF9SRUFEX1JFUVVFU1RfRElTQUJMRSh4KSAoKCh4KSAmIDB4MSkgPDwgMjQpCisjZGVmaW5lICAgR18wMDYwODBfRDFDUlRDX0RJU1BfUkVBRF9SRVFVRVNUX0RJU0FCTEUoeCkgKCgoeCkgPj4gMjQpICYgMHgxKQorI2RlZmluZSAgIENfMDA2MDgwX0QxQ1JUQ19ESVNQX1JFQURfUkVRVUVTVF9ESVNBQkxFICAgIDB4RkVGRkZGRkYKKyNkZWZpbmUgUl8wMDYwRThfRDFDUlRDX1VQREFURV9MT0NLICAgICAgICAgICAgICAgICAgMHgwMDYwRTgKKyNkZWZpbmUgICBTXzAwNjBFOF9EMUNSVENfVVBEQVRFX0xPQ0soeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBHXzAwNjBFOF9EMUNSVENfVVBEQVRFX0xPQ0soeCkgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjBFOF9EMUNSVENfVVBEQVRFX0xPQ0sgICAgICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lIFJfMDA2MTEwX0QxR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyAgICAgIDB4MDA2MTEwCisjZGVmaW5lICAgU18wMDYxMTBfRDFHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTKHgpICAgKCgoeCkgJiAweEZGRkZGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDA2MTEwX0QxR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyh4KSAgICgoKHgpID4+IDApICYgMHhGRkZGRkZGRikKKyNkZWZpbmUgICBDXzAwNjExMF9EMUdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFJfMDA2MTE4X0QxR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICAgIDB4MDA2MTE4CisjZGVmaW5lICAgU18wMDYxMThfRDFHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MoeCkgKCgoeCkgJiAweEZGRkZGRkZGKSA8PCAwKQorI2RlZmluZSAgIEdfMDA2MTE4X0QxR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTKHgpICgoKHgpID4+IDApICYgMHhGRkZGRkZGRikKKyNkZWZpbmUgICBDXzAwNjExOF9EMUdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyAgICAweDAwMDAwMDAwCisjZGVmaW5lIFJfMDA2ODgwX0QyQ1JUQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ODgwCisjZGVmaW5lICAgU18wMDY4ODBfRDJDUlRDX01BU1RFUl9FTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDY4ODBfRDJDUlRDX01BU1RFUl9FTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDY4ODBfRDJDUlRDX01BU1RFUl9FTiAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDA2ODgwX0QyQ1JUQ19TWU5DX1JFU0VUX1NFTCh4KSAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCA0KQorI2RlZmluZSAgIEdfMDA2ODgwX0QyQ1JUQ19TWU5DX1JFU0VUX1NFTCh4KSAgICAgICAgICAgICgoKHgpID4+IDQpICYgMHgxKQorI2RlZmluZSAgIENfMDA2ODgwX0QyQ1JUQ19TWU5DX1JFU0VUX1NFTCAgICAgICAgICAgICAgIDB4RkZGRkZGRUYKKyNkZWZpbmUgICBTXzAwNjg4MF9EMkNSVENfRElTQUJMRV9QT0lOVF9DTlRMKHgpICAgICAgICAoKCh4KSAmIDB4MykgPDwgOCkKKyNkZWZpbmUgICBHXzAwNjg4MF9EMkNSVENfRElTQUJMRV9QT0lOVF9DTlRMKHgpICAgICAgICAoKCh4KSA+PiA4KSAmIDB4MykKKyNkZWZpbmUgICBDXzAwNjg4MF9EMkNSVENfRElTQUJMRV9QT0lOVF9DTlRMICAgICAgICAgICAweEZGRkZGQ0ZGCisjZGVmaW5lICAgU18wMDY4ODBfRDJDUlRDX0NVUlJFTlRfTUFTVEVSX0VOX1NUQVRFKHgpICAgKCgoeCkgJiAweDEpIDw8IDE2KQorI2RlZmluZSAgIEdfMDA2ODgwX0QyQ1JUQ19DVVJSRU5UX01BU1RFUl9FTl9TVEFURSh4KSAgICgoKHgpID4+IDE2KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjg4MF9EMkNSVENfQ1VSUkVOVF9NQVNURVJfRU5fU1RBVEUgICAgICAweEZGRkVGRkZGCisjZGVmaW5lICAgU18wMDY4ODBfRDJDUlRDX0RJU1BfUkVBRF9SRVFVRVNUX0RJU0FCTEUoeCkgKCgoeCkgJiAweDEpIDw8IDI0KQorI2RlZmluZSAgIEdfMDA2ODgwX0QyQ1JUQ19ESVNQX1JFQURfUkVRVUVTVF9ESVNBQkxFKHgpICgoKHgpID4+IDI0KSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwNjg4MF9EMkNSVENfRElTUF9SRUFEX1JFUVVFU1RfRElTQUJMRSAgICAweEZFRkZGRkZGCisjZGVmaW5lIFJfMDA2OEU4X0QyQ1JUQ19VUERBVEVfTE9DSyAgICAgICAgICAgICAgICAgIDB4MDA2OEU4CisjZGVmaW5lICAgU18wMDY4RThfRDJDUlRDX1VQREFURV9MT0NLKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDY4RThfRDJDUlRDX1VQREFURV9MT0NLKHgpICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDY4RThfRDJDUlRDX1VQREFURV9MT0NLICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSBSXzAwNjkxMF9EMkdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgICAgICAweDAwNjkxMAorI2RlZmluZSAgIFNfMDA2OTEwX0QyR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyh4KSAgICgoKHgpICYgMHhGRkZGRkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwNjkxMF9EMkdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MoeCkgICAoKCh4KSA+PiAwKSAmIDB4RkZGRkZGRkYpCisjZGVmaW5lICAgQ18wMDY5MTBfRDJHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBSXzAwNjkxOF9EMkdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyAgICAweDAwNjkxOAorI2RlZmluZSAgIFNfMDA2OTE4X0QyR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTKHgpICgoKHgpICYgMHhGRkZGRkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwNjkxOF9EMkdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyh4KSAoKCh4KSA+PiAwKSAmIDB4RkZGRkZGRkYpCisjZGVmaW5lICAgQ18wMDY5MThfRDJHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgICAgMHgwMDAwMDAwMAogCisKKyNkZWZpbmUgUl8wMDAwMDFfTUNfRkJfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEKKyNkZWZpbmUgICBTXzAwMDAwMV9NQ19GQl9TVEFSVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDAwMV9NQ19GQl9TVEFSVCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDAwMV9NQ19GQl9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisjZGVmaW5lICAgU18wMDAwMDFfTUNfRkJfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDE2KQorI2RlZmluZSAgIEdfMDAwMDAxX01DX0ZCX1RPUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDE2KSAmIDB4RkZGRikKKyNkZWZpbmUgICBDXzAwMDAwMV9NQ19GQl9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIFJfMDAwMDAyX01DX0FHUF9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyCisjZGVmaW5lICAgU18wMDAwMDJfTUNfQUdQX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDApCisjZGVmaW5lICAgR18wMDAwMDJfTUNfQUdQX1NUQVJUKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweEZGRkYpCisjZGVmaW5lICAgQ18wMDAwMDJfTUNfQUdQX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSAgIFNfMDAwMDAyX01DX0FHUF9UT1AoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGKSA8PCAxNikKKyNkZWZpbmUgICBHXzAwMDAwMl9NQ19BR1BfVE9QKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAxNikgJiAweEZGRkYpCisjZGVmaW5lICAgQ18wMDAwMDJfTUNfQUdQX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBSXzAwMDAwM19NQ19BR1BfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMworI2RlZmluZSAgIFNfMDAwMDAzX0FHUF9CQVNFX0FERFIoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGRkZGRkZGRikgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDAwM19BR1BfQkFTRV9BRERSKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4RkZGRkZGRkYpCisjZGVmaW5lICAgQ18wMDAwMDNfQUdQX0JBU0VfQUREUiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBSXzAwMDAwNF9NQ19BR1BfQkFTRV8yICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNAorI2RlZmluZSAgIFNfMDAwMDA0X0FHUF9CQVNFX0FERFJfMih4KSAgICAgICAgICAgICAgICAgICgoKHgpICYgMHhGKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDA0X0FHUF9CQVNFX0FERFJfMih4KSAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHhGKQorI2RlZmluZSAgIENfMDAwMDA0X0FHUF9CQVNFX0FERFJfMiAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjAKKworCisjZGVmaW5lIFJfMDAwMDBGX0NQX0RZTl9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBGCisjZGVmaW5lICAgU18wMDAwMEZfQ1BfRk9SQ0VPTih4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCisjZGVmaW5lICAgR18wMDAwMEZfQ1BfRk9SQ0VPTih4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMEZfQ1BfRk9SQ0VPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRQorI2RlZmluZSAgIFNfMDAwMDBGX0NQX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAxKQorI2RlZmluZSAgIEdfMDAwMDBGX0NQX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAgICgoKHgpID4+IDEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDBGX0NQX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkQKKyNkZWZpbmUgICBTXzAwMDAwRl9DUF9DTE9DS19TVEFUVVMoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMikKKyNkZWZpbmUgICBHXzAwMDAwRl9DUF9DTE9DS19TVEFUVVMoeCkgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRl9DUF9DTE9DS19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZCCisjZGVmaW5lICAgU18wMDAwMEZfQ1BfUFJPR19TSFVUT0ZGKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMpCisjZGVmaW5lICAgR18wMDAwMEZfQ1BfUFJPR19TSFVUT0ZGKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMykgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMEZfQ1BfUFJPR19TSFVUT0ZGICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGNworI2RlZmluZSAgIFNfMDAwMDBGX0NQX1BST0dfREVMQVlfVkFMVUUoeCkgICAgICAgICAgICAgICgoKHgpICYgMHhGRikgPDwgNCkKKyNkZWZpbmUgICBHXzAwMDAwRl9DUF9QUk9HX0RFTEFZX1ZBTFVFKHgpICAgICAgICAgICAgICAoKCh4KSA+PiA0KSAmIDB4RkYpCisjZGVmaW5lICAgQ18wMDAwMEZfQ1BfUFJPR19ERUxBWV9WQUxVRSAgICAgICAgICAgICAgICAgMHhGRkZGRjAwRgorI2RlZmluZSAgIFNfMDAwMDBGX0NQX0xPV0VSX1BPV0VSX0lETEUoeCkgICAgICAgICAgICAgICgoKHgpICYgMHhGRikgPDwgMTIpCisjZGVmaW5lICAgR18wMDAwMEZfQ1BfTE9XRVJfUE9XRVJfSURMRSh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gMTIpICYgMHhGRikKKyNkZWZpbmUgICBDXzAwMDAwRl9DUF9MT1dFUl9QT1dFUl9JRExFICAgICAgICAgICAgICAgICAweEZGRjAwRkZGCisjZGVmaW5lICAgU18wMDAwMEZfQ1BfTE9XRVJfUE9XRVJfSUdOT1JFKHgpICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIwKQorI2RlZmluZSAgIEdfMDAwMDBGX0NQX0xPV0VSX1BPV0VSX0lHTk9SRSh4KSAgICAgICAgICAgICgoKHgpID4+IDIwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRl9DUF9MT1dFUl9QT1dFUl9JR05PUkUgICAgICAgICAgICAgICAweEZGRUZGRkZGCisjZGVmaW5lICAgU18wMDAwMEZfQ1BfTk9STUFMX1BPV0VSX0lHTk9SRSh4KSAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIxKQorI2RlZmluZSAgIEdfMDAwMDBGX0NQX05PUk1BTF9QT1dFUl9JR05PUkUoeCkgICAgICAgICAgICgoKHgpID4+IDIxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAwRl9DUF9OT1JNQUxfUE9XRVJfSUdOT1JFICAgICAgICAgICAgICAweEZGREZGRkZGCisjZGVmaW5lICAgU18wMDAwMEZfU1BBUkUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDIyKQorI2RlZmluZSAgIEdfMDAwMDBGX1NQQVJFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIyKSAmIDB4MykKKyNkZWZpbmUgICBDXzAwMDAwRl9TUEFSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGM0ZGRkZGCisjZGVmaW5lICAgU18wMDAwMEZfQ1BfTk9STUFMX1BPV0VSX0JVU1koeCkgICAgICAgICAgICAgKCgoeCkgJiAweEZGKSA8PCAyNCkKKyNkZWZpbmUgICBHXzAwMDAwRl9DUF9OT1JNQUxfUE9XRVJfQlVTWSh4KSAgICAgICAgICAgICAoKCh4KSA+PiAyNCkgJiAweEZGKQorI2RlZmluZSAgIENfMDAwMDBGX0NQX05PUk1BTF9QT1dFUl9CVVNZICAgICAgICAgICAgICAgIDB4MDBGRkZGRkYKKyNkZWZpbmUgUl8wMDAwMTFfRTJfRFlOX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTEKKyNkZWZpbmUgICBTXzAwMDAxMV9FMl9GT1JDRU9OKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMCkKKyNkZWZpbmUgICBHXzAwMDAxMV9FMl9GT1JDRU9OKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAwKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAxMV9FMl9GT1JDRU9OICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZFCisjZGVmaW5lICAgU18wMDAwMTFfRTJfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDEpCisjZGVmaW5lICAgR18wMDAwMTFfRTJfTUFYX0RZTl9TVE9QX0xBVCh4KSAgICAgICAgICAgICAgKCgoeCkgPj4gMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMTFfRTJfTUFYX0RZTl9TVE9QX0xBVCAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRAorI2RlZmluZSAgIFNfMDAwMDExX0UyX0NMT0NLX1NUQVRVUyh4KSAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyKQorI2RlZmluZSAgIEdfMDAwMDExX0UyX0NMT0NLX1NUQVRVUyh4KSAgICAgICAgICAgICAgICAgICgoKHgpID4+IDIpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDExX0UyX0NMT0NLX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkIKKyNkZWZpbmUgICBTXzAwMDAxMV9FMl9QUk9HX1NIVVRPRkYoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMykKKyNkZWZpbmUgICBHXzAwMDAxMV9FMl9QUk9HX1NIVVRPRkYoeCkgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAzKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAxMV9FMl9QUk9HX1NIVVRPRkYgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkY3CisjZGVmaW5lICAgU18wMDAwMTFfRTJfUFJPR19ERUxBWV9WQUxVRSh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweEZGKSA8PCA0KQorI2RlZmluZSAgIEdfMDAwMDExX0UyX1BST0dfREVMQVlfVkFMVUUoeCkgICAgICAgICAgICAgICgoKHgpID4+IDQpICYgMHhGRikKKyNkZWZpbmUgICBDXzAwMDAxMV9FMl9QUk9HX0RFTEFZX1ZBTFVFICAgICAgICAgICAgICAgICAweEZGRkZGMDBGCisjZGVmaW5lICAgU18wMDAwMTFfRTJfTE9XRVJfUE9XRVJfSURMRSh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweEZGKSA8PCAxMikKKyNkZWZpbmUgICBHXzAwMDAxMV9FMl9MT1dFUl9QT1dFUl9JRExFKHgpICAgICAgICAgICAgICAoKCh4KSA+PiAxMikgJiAweEZGKQorI2RlZmluZSAgIENfMDAwMDExX0UyX0xPV0VSX1BPV0VSX0lETEUgICAgICAgICAgICAgICAgIDB4RkZGMDBGRkYKKyNkZWZpbmUgICBTXzAwMDAxMV9FMl9MT1dFUl9QT1dFUl9JR05PUkUoeCkgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjApCisjZGVmaW5lICAgR18wMDAwMTFfRTJfTE9XRVJfUE9XRVJfSUdOT1JFKHgpICAgICAgICAgICAgKCgoeCkgPj4gMjApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDExX0UyX0xPV0VSX1BPV0VSX0lHTk9SRSAgICAgICAgICAgICAgIDB4RkZFRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAxMV9FMl9OT1JNQUxfUE9XRVJfSUdOT1JFKHgpICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMjEpCisjZGVmaW5lICAgR18wMDAwMTFfRTJfTk9STUFMX1BPV0VSX0lHTk9SRSh4KSAgICAgICAgICAgKCgoeCkgPj4gMjEpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDExX0UyX05PUk1BTF9QT1dFUl9JR05PUkUgICAgICAgICAgICAgIDB4RkZERkZGRkYKKyNkZWZpbmUgICBTXzAwMDAxMV9TUEFSRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMjIpCisjZGVmaW5lICAgR18wMDAwMTFfU1BBUkUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjIpICYgMHgzKQorI2RlZmluZSAgIENfMDAwMDExX1NQQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYzRkZGRkYKKyNkZWZpbmUgICBTXzAwMDAxMV9FMl9OT1JNQUxfUE9XRVJfQlVTWSh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDI0KQorI2RlZmluZSAgIEdfMDAwMDExX0UyX05PUk1BTF9QT1dFUl9CVVNZKHgpICAgICAgICAgICAgICgoKHgpID4+IDI0KSAmIDB4RkYpCisjZGVmaW5lICAgQ18wMDAwMTFfRTJfTk9STUFMX1BPV0VSX0JVU1kgICAgICAgICAgICAgICAgMHgwMEZGRkZGRgorI2RlZmluZSBSXzAwMDAxM19JRENUX0RZTl9DTlRMICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMworI2RlZmluZSAgIFNfMDAwMDEzX0lEQ1RfRk9SQ0VPTih4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQorI2RlZmluZSAgIEdfMDAwMDEzX0lEQ1RfRk9SQ0VPTih4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDEzX0lEQ1RfRk9SQ0VPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkUKKyNkZWZpbmUgICBTXzAwMDAxM19JRENUX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAoKCh4KSAmIDB4MSkgPDwgMSkKKyNkZWZpbmUgICBHXzAwMDAxM19JRENUX01BWF9EWU5fU1RPUF9MQVQoeCkgICAgICAgICAgICAoKCh4KSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgICBDXzAwMDAxM19JRENUX01BWF9EWU5fU1RPUF9MQVQgICAgICAgICAgICAgICAweEZGRkZGRkZECisjZGVmaW5lICAgU18wMDAwMTNfSURDVF9DTE9DS19TVEFUVVMoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDIpCisjZGVmaW5lICAgR18wMDAwMTNfSURDVF9DTE9DS19TVEFUVVMoeCkgICAgICAgICAgICAgICAgKCgoeCkgPj4gMikgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMTNfSURDVF9DTE9DS19TVEFUVVMgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGQgorI2RlZmluZSAgIFNfMDAwMDEzX0lEQ1RfUFJPR19TSFVUT0ZGKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzKQorI2RlZmluZSAgIEdfMDAwMDEzX0lEQ1RfUFJPR19TSFVUT0ZGKHgpICAgICAgICAgICAgICAgICgoKHgpID4+IDMpICYgMHgxKQorI2RlZmluZSAgIENfMDAwMDEzX0lEQ1RfUFJPR19TSFVUT0ZGICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRjcKKyNkZWZpbmUgICBTXzAwMDAxM19JRENUX1BST0dfREVMQVlfVkFMVUUoeCkgICAgICAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDQpCisjZGVmaW5lICAgR18wMDAwMTNfSURDVF9QUk9HX0RFTEFZX1ZBTFVFKHgpICAgICAgICAgICAgKCgoeCkgPj4gNCkgJiAweEZGKQorI2RlZmluZSAgIENfMDAwMDEzX0lEQ1RfUFJPR19ERUxBWV9WQUxVRSAgICAgICAgICAgICAgIDB4RkZGRkYwMEYKKyNkZWZpbmUgICBTXzAwMDAxM19JRENUX0xPV0VSX1BPV0VSX0lETEUoeCkgICAgICAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDEyKQorI2RlZmluZSAgIEdfMDAwMDEzX0lEQ1RfTE9XRVJfUE9XRVJfSURMRSh4KSAgICAgICAgICAgICgoKHgpID4+IDEyKSAmIDB4RkYpCisjZGVmaW5lICAgQ18wMDAwMTNfSURDVF9MT1dFUl9QT1dFUl9JRExFICAgICAgICAgICAgICAgMHhGRkYwMEZGRgorI2RlZmluZSAgIFNfMDAwMDEzX0lEQ1RfTE9XRVJfUE9XRVJfSUdOT1JFKHgpICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMCkKKyNkZWZpbmUgICBHXzAwMDAxM19JRENUX0xPV0VSX1BPV0VSX0lHTk9SRSh4KSAgICAgICAgICAoKCh4KSA+PiAyMCkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMTNfSURDVF9MT1dFUl9QT1dFUl9JR05PUkUgICAgICAgICAgICAgMHhGRkVGRkZGRgorI2RlZmluZSAgIFNfMDAwMDEzX0lEQ1RfTk9STUFMX1BPV0VSX0lHTk9SRSh4KSAgICAgICAgICgoKHgpICYgMHgxKSA8PCAyMSkKKyNkZWZpbmUgICBHXzAwMDAxM19JRENUX05PUk1BTF9QT1dFUl9JR05PUkUoeCkgICAgICAgICAoKCh4KSA+PiAyMSkgJiAweDEpCisjZGVmaW5lICAgQ18wMDAwMTNfSURDVF9OT1JNQUxfUE9XRVJfSUdOT1JFICAgICAgICAgICAgMHhGRkRGRkZGRgorI2RlZmluZSAgIFNfMDAwMDEzX1NQQVJFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAyMikKKyNkZWZpbmUgICBHXzAwMDAxM19TUEFSRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAyMikgJiAweDMpCisjZGVmaW5lICAgQ18wMDAwMTNfU1BBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjNGRkZGRgorI2RlZmluZSAgIFNfMDAwMDEzX0lEQ1RfTk9STUFMX1BPV0VSX0JVU1koeCkgICAgICAgICAgICgoKHgpICYgMHhGRikgPDwgMjQpCisjZGVmaW5lICAgR18wMDAwMTNfSURDVF9OT1JNQUxfUE9XRVJfQlVTWSh4KSAgICAgICAgICAgKCgoeCkgPj4gMjQpICYgMHhGRikKKyNkZWZpbmUgICBDXzAwMDAxM19JRENUX05PUk1BTF9QT1dFUl9CVVNZICAgICAgICAgICAgICAweDAwRkZGRkZGCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCmluZGV4IGI1NzRjNzMuLjU5NWFjNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKQEAgLTMxLDggKzMxLDggQEAKICNpbmNsdWRlICJyYWRlb24uaCIKICNpbmNsdWRlICJyYWRlb25fZHJtLmgiCiAjaW5jbHVkZSAicnY3NzBkLmgiCi0jaW5jbHVkZSAiYXZpdm9kLmgiCiAjaW5jbHVkZSAiYXRvbS5oIgorI2luY2x1ZGUgImF2aXZvZC5oIgogCiAjZGVmaW5lIFI3MDBfUEZQX1VDT0RFX1NJWkUgODQ4CiAjZGVmaW5lIFI3MDBfUE00X1VDT0RFX1NJWkUgMTM2MApAQCAtNzUsNyArNzUsNyBAQAogCVdSRUczMihNQ19WTV9NQl9MMV9UTEIyX0NOVEwsIHRtcCk7CiAJV1JFRzMyKE1DX1ZNX01CX0wxX1RMQjNfQ05UTCwgdG1wKTsKIAlXUkVHMzIoVk1fQ09OVEVYVDBfUEFHRV9UQUJMRV9TVEFSVF9BRERSLCByZGV2LT5tYy5ndHRfc3RhcnQgPj4gMTIpOwotCVdSRUczMihWTV9DT05URVhUMF9QQUdFX1RBQkxFX0VORF9BRERSLCAocmRldi0+bWMuZ3R0X2VuZCAtIDEpID4+IDEyKTsKKwlXUkVHMzIoVk1fQ09OVEVYVDBfUEFHRV9UQUJMRV9FTkRfQUREUiwgcmRldi0+bWMuZ3R0X2VuZCA+PiAxMik7CiAJV1JFRzMyKFZNX0NPTlRFWFQwX1BBR0VfVEFCTEVfQkFTRV9BRERSLCByZGV2LT5nYXJ0LnRhYmxlX2FkZHIgPj4gMTIpOwogCVdSRUczMihWTV9DT05URVhUMF9DTlRMLCBFTkFCTEVfQ09OVEVYVCB8IFBBR0VfVEFCTEVfREVQVEgoMCkgfAogCQkJCVJBTkdFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RFRkFVTFQpOwpAQCAtMTI2LDE3ICsxMjYsMzYgQEAKIH0KIAogCi0vKgotICogTUMKLSAqLwotc3RhdGljIHZvaWQgcnY3NzBfbWNfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQordm9pZCBydjc3MF9hZ3BfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXUzMiBkMXZnYV9jb250cm9sLCBkMnZnYV9jb250cm9sOwotCXUzMiB2Z2FfcmVuZGVyX2NvbnRyb2wsIHZnYV9oZHBfY29udHJvbDsKLQl1MzIgZDFjcnRjX2NvbnRyb2wsIGQyY3J0Y19jb250cm9sOwotCXUzMiBuZXdfZDFncnBoX3ByaW1hcnksIG5ld19kMWdycGhfc2Vjb25kYXJ5OwotCXUzMiBuZXdfZDJncnBoX3ByaW1hcnksIG5ld19kMmdycGhfc2Vjb25kYXJ5OwotCXU2NCBvbGRfdnJhbV9zdGFydDsKKwl1MzIgdG1wOworCWludCBpOworCisJLyogU2V0dXAgTDIgY2FjaGUgKi8KKwlXUkVHMzIoVk1fTDJfQ05UTCwgRU5BQkxFX0wyX0NBQ0hFIHwgRU5BQkxFX0wyX0ZSQUdNRU5UX1BST0NFU1NJTkcgfAorCQkJCUVOQUJMRV9MMl9QVEVfQ0FDSEVfTFJVX1VQREFURV9CWV9XUklURSB8CisJCQkJRUZGRUNUSVZFX0wyX1FVRVVFX1NJWkUoNykpOworCVdSRUczMihWTV9MMl9DTlRMMiwgMCk7CisJV1JFRzMyKFZNX0wyX0NOVEwzLCBCQU5LX1NFTEVDVCgwKSB8IENBQ0hFX1VQREFURV9NT0RFKDIpKTsKKwkvKiBTZXR1cCBUTEIgY29udHJvbCAqLworCXRtcCA9IEVOQUJMRV9MMV9UTEIgfCBFTkFCTEVfTDFfRlJBR01FTlRfUFJPQ0VTU0lORyB8CisJCVNZU1RFTV9BQ0NFU1NfTU9ERV9OT1RfSU5fU1lTIHwKKwkJU1lTVEVNX0FQRVJUVVJFX1VOTUFQUEVEX0FDQ0VTU19QQVNTX1RIUlUgfAorCQlFRkZFQ1RJVkVfTDFfVExCX1NJWkUoNSkgfCBFRkZFQ1RJVkVfTDFfUVVFVUVfU0laRSg1KTsKKwlXUkVHMzIoTUNfVk1fTURfTDFfVExCMF9DTlRMLCB0bXApOworCVdSRUczMihNQ19WTV9NRF9MMV9UTEIxX0NOVEwsIHRtcCk7CisJV1JFRzMyKE1DX1ZNX01EX0wxX1RMQjJfQ05UTCwgdG1wKTsKKwlXUkVHMzIoTUNfVk1fTUJfTDFfVExCMF9DTlRMLCB0bXApOworCVdSRUczMihNQ19WTV9NQl9MMV9UTEIxX0NOVEwsIHRtcCk7CisJV1JFRzMyKE1DX1ZNX01CX0wxX1RMQjJfQ05UTCwgdG1wKTsKKwlXUkVHMzIoTUNfVk1fTUJfTDFfVExCM19DTlRMLCB0bXApOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCVdSRUczMihWTV9DT05URVhUMF9DTlRMICsgKGkgKiA0KSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ2NzcwX21jX3Byb2dyYW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IHJ2NTE1X21jX3NhdmUgc2F2ZTsKIAl1MzIgdG1wOwogCWludCBpLCBqOwogCkBAIC0xNTAsNTMgKzE2OSw0MiBAQAogCX0KIAlXUkVHMzIoSERQX1JFR19DT0hFUkVOQ1lfRkxVU0hfQ05UTCwgMCk7CiAKLQlkMXZnYV9jb250cm9sID0gUlJFRzMyKEQxVkdBX0NPTlRST0wpOwotCWQydmdhX2NvbnRyb2wgPSBSUkVHMzIoRDJWR0FfQ09OVFJPTCk7Ci0JdmdhX3JlbmRlcl9jb250cm9sID0gUlJFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCk7Ci0JdmdhX2hkcF9jb250cm9sID0gUlJFRzMyKFZHQV9IRFBfQ09OVFJPTCk7Ci0JZDFjcnRjX2NvbnRyb2wgPSBSUkVHMzIoRDFDUlRDX0NPTlRST0wpOwotCWQyY3J0Y19jb250cm9sID0gUlJFRzMyKEQyQ1JUQ19DT05UUk9MKTsKLQlvbGRfdnJhbV9zdGFydCA9ICh1NjQpKFJSRUczMihNQ19WTV9GQl9MT0NBVElPTikgJiAweEZGRkYpIDw8IDI0OwotCW5ld19kMWdycGhfcHJpbWFyeSA9IFJSRUczMihEMUdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MpOwotCW5ld19kMWdycGhfc2Vjb25kYXJ5ID0gUlJFRzMyKEQxR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTKTsKLQluZXdfZDFncnBoX3ByaW1hcnkgKz0gcmRldi0+bWMudnJhbV9zdGFydCAtIG9sZF92cmFtX3N0YXJ0OwotCW5ld19kMWdycGhfc2Vjb25kYXJ5ICs9IHJkZXYtPm1jLnZyYW1fc3RhcnQgLSBvbGRfdnJhbV9zdGFydDsKLQluZXdfZDJncnBoX3ByaW1hcnkgPSBSUkVHMzIoRDJHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTKTsKLQluZXdfZDJncnBoX3NlY29uZGFyeSA9IFJSRUczMihEMkdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyk7Ci0JbmV3X2QyZ3JwaF9wcmltYXJ5ICs9IHJkZXYtPm1jLnZyYW1fc3RhcnQgLSBvbGRfdnJhbV9zdGFydDsKLQluZXdfZDJncnBoX3NlY29uZGFyeSArPSByZGV2LT5tYy52cmFtX3N0YXJ0IC0gb2xkX3ZyYW1fc3RhcnQ7Ci0KLQkvKiBTdG9wIGFsbCB2aWRlbyAqLwotCVdSRUczMihEMVZHQV9DT05UUk9MLCAwKTsKLQlXUkVHMzIoRDJWR0FfQ09OVFJPTCwgMCk7Ci0JV1JFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCwgMCk7Ci0JV1JFRzMyKEQxQ1JUQ19VUERBVEVfTE9DSywgMSk7Ci0JV1JFRzMyKEQyQ1JUQ19VUERBVEVfTE9DSywgMSk7Ci0JV1JFRzMyKEQxQ1JUQ19DT05UUk9MLCAwKTsKLQlXUkVHMzIoRDJDUlRDX0NPTlRST0wsIDApOwotCVdSRUczMihEMUNSVENfVVBEQVRFX0xPQ0ssIDApOwotCVdSRUczMihEMkNSVENfVVBEQVRFX0xPQ0ssIDApOwotCi0JbWRlbGF5KDEpOworCXJ2NTE1X21jX3N0b3AocmRldiwgJnNhdmUpOwogCWlmIChyNjAwX21jX3dhaXRfZm9yX2lkbGUocmRldikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiW2RybV0gTUMgbm90IGlkbGUgIVxuIik7CisJCWRldl93YXJuKHJkZXYtPmRldiwgIldhaXQgZm9yIE1DIGlkbGUgdGltZWRvdXQgIVxuIik7CiAJfQotCiAJLyogTG9ja291dCBhY2Nlc3MgdGhyb3VnaCBWR0EgYXBlcnR1cmUqLwogCVdSRUczMihWR0FfSERQX0NPTlRST0wsIFZHQV9NRU1PUllfRElTQUJMRSk7Ci0KIAkvKiBVcGRhdGUgY29uZmlndXJhdGlvbiAqLwotCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfTE9XX0FERFIsIHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTIpOwotCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfSElHSF9BRERSLCAocmRldi0+bWMudnJhbV9lbmQgLSAxKSA+PiAxMik7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgeworCQlpZiAocmRldi0+bWMudnJhbV9zdGFydCA8IHJkZXYtPm1jLmd0dF9zdGFydCkgeworCQkJLyogVlJBTSBiZWZvcmUgQUdQICovCisJCQlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0xPV19BRERSLAorCQkJCXJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTIpOworCQkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ISUdIX0FERFIsCisJCQkJcmRldi0+bWMuZ3R0X2VuZCA+PiAxMik7CisJCX0gZWxzZSB7CisJCQkvKiBWUkFNIGFmdGVyIEFHUCAqLworCQkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9MT1dfQUREUiwKKwkJCQlyZGV2LT5tYy5ndHRfc3RhcnQgPj4gMTIpOworCQkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ISUdIX0FERFIsCisJCQkJcmRldi0+bWMudnJhbV9lbmQgPj4gMTIpOworCQl9CisJfSBlbHNlIHsKKwkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9MT1dfQUREUiwKKwkJCXJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gMTIpOworCQlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0hJR0hfQUREUiwKKwkJCXJkZXYtPm1jLnZyYW1fZW5kID4+IDEyKTsKKwl9CiAJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ERUZBVUxUX0FERFIsIDApOwotCXRtcCA9ICgoKHJkZXYtPm1jLnZyYW1fZW5kIC0gMSkgPj4gMjQpICYgMHhGRkZGKSA8PCAxNjsKKwl0bXAgPSAoKHJkZXYtPm1jLnZyYW1fZW5kID4+IDI0KSAmIDB4RkZGRikgPDwgMTY7CiAJdG1wIHw9ICgocmRldi0+bWMudnJhbV9zdGFydCA+PiAyNCkgJiAweEZGRkYpOwogCVdSRUczMihNQ19WTV9GQl9MT0NBVElPTiwgdG1wKTsKIAlXUkVHMzIoSERQX05PTlNVUkZBQ0VfQkFTRSwgKHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gOCkpOwogCVdSRUczMihIRFBfTk9OU1VSRkFDRV9JTkZPLCAoMiA8PCA3KSk7CiAJV1JFRzMyKEhEUF9OT05TVVJGQUNFX1NJWkUsIChyZGV2LT5tYy5tY192cmFtX3NpemUgLSAxKSB8IDB4M0ZGKTsKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7Ci0JCVdSRUczMihNQ19WTV9BR1BfVE9QLCAocmRldi0+bWMuZ3R0X2VuZCAtIDEpID4+IDE2KTsKKwkJV1JFRzMyKE1DX1ZNX0FHUF9UT1AsIHJkZXYtPm1jLmd0dF9lbmQgPj4gMTYpOwogCQlXUkVHMzIoTUNfVk1fQUdQX0JPVCwgcmRldi0+bWMuZ3R0X3N0YXJ0ID4+IDE2KTsKIAkJV1JFRzMyKE1DX1ZNX0FHUF9CQVNFLCByZGV2LT5tYy5hZ3BfYmFzZSA+PiAyMik7CiAJfSBlbHNlIHsKQEAgLTIwNCwzNCArMjEyLDEzIEBACiAJCVdSRUczMihNQ19WTV9BR1BfVE9QLCAweDBGRkZGRkZGKTsKIAkJV1JFRzMyKE1DX1ZNX0FHUF9CT1QsIDB4MEZGRkZGRkYpOwogCX0KLQlXUkVHMzIoRDFHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTLCBuZXdfZDFncnBoX3ByaW1hcnkpOwotCVdSRUczMihEMUdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUywgbmV3X2QxZ3JwaF9zZWNvbmRhcnkpOwotCVdSRUczMihEMkdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MsIG5ld19kMmdycGhfcHJpbWFyeSk7Ci0JV1JFRzMyKEQyR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTLCBuZXdfZDJncnBoX3NlY29uZGFyeSk7Ci0JV1JFRzMyKFZHQV9NRU1PUllfQkFTRV9BRERSRVNTLCByZGV2LT5tYy52cmFtX3N0YXJ0KTsKLQotCS8qIFVubG9jayBob3N0IGFjY2VzcyAqLwotCVdSRUczMihWR0FfSERQX0NPTlRST0wsIHZnYV9oZHBfY29udHJvbCk7Ci0KLQltZGVsYXkoMSk7CiAJaWYgKHI2MDBfbWNfd2FpdF9mb3JfaWRsZShyZGV2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJbZHJtXSBNQyBub3QgaWRsZSAhXG4iKTsKKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiV2FpdCBmb3IgTUMgaWRsZSB0aW1lZG91dCAhXG4iKTsKIAl9Ci0KLQkvKiBSZXN0b3JlIHZpZGVvIHN0YXRlICovCi0JV1JFRzMyKEQxQ1JUQ19VUERBVEVfTE9DSywgMSk7Ci0JV1JFRzMyKEQyQ1JUQ19VUERBVEVfTE9DSywgMSk7Ci0JV1JFRzMyKEQxQ1JUQ19DT05UUk9MLCBkMWNydGNfY29udHJvbCk7Ci0JV1JFRzMyKEQyQ1JUQ19DT05UUk9MLCBkMmNydGNfY29udHJvbCk7Ci0JV1JFRzMyKEQxQ1JUQ19VUERBVEVfTE9DSywgMCk7Ci0JV1JFRzMyKEQyQ1JUQ19VUERBVEVfTE9DSywgMCk7Ci0JV1JFRzMyKEQxVkdBX0NPTlRST0wsIGQxdmdhX2NvbnRyb2wpOwotCVdSRUczMihEMlZHQV9DT05UUk9MLCBkMnZnYV9jb250cm9sKTsKLQlXUkVHMzIoVkdBX1JFTkRFUl9DT05UUk9MLCB2Z2FfcmVuZGVyX2NvbnRyb2wpOwotCisJcnY1MTVfbWNfcmVzdW1lKHJkZXYsICZzYXZlKTsKIAkvKiB3ZSBuZWVkIHRvIG93biBWUkFNLCBzbyB0dXJuIG9mZiB0aGUgVkdBIHJlbmRlcmVyIGhlcmUKIAkgKiB0byBzdG9wIGl0IG92ZXJ3cml0aW5nIG91ciBvYmplY3RzICovCi0JcmFkZW9uX2F2aXZvX3ZnYV9yZW5kZXJfZGlzYWJsZShyZGV2KTsKKwlydjUxNV92Z2FfcmVuZGVyX2Rpc2FibGUocmRldik7CiB9CiAKIApAQCAtODAxLDYgKzc4OCwxMyBAQAogCS8qIFNldHVwIEdQVSBtZW1vcnkgc3BhY2UgKi8KIAlyZGV2LT5tYy5tY192cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpOwogCXJkZXYtPm1jLnJlYWxfdnJhbV9zaXplID0gUlJFRzMyKENPTkZJR19NRU1TSVpFKTsKKworCWlmIChyZGV2LT5tYy5tY192cmFtX3NpemUgPiByZGV2LT5tYy5hcGVyX3NpemUpCisJCXJkZXYtPm1jLm1jX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLmFwZXJfc2l6ZTsKKworCWlmIChyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA+IHJkZXYtPm1jLmFwZXJfc2l6ZSkKKwkJcmRldi0+bWMucmVhbF92cmFtX3NpemUgPSByZGV2LT5tYy5hcGVyX3NpemU7CisKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CiAJCXIgPSByYWRlb25fYWdwX2luaXQocmRldik7CiAJCWlmIChyKQpAQCAtODMzLDkgKzgyNyw5IEBACiAJCXJkZXYtPm1jLmd0dF9zaXplID0gcmFkZW9uX2dhcnRfc2l6ZSAqIDEwMjQgKiAxMDI0OwogCX0KIAlyZGV2LT5tYy52cmFtX3N0YXJ0ID0gcmRldi0+bWMudnJhbV9sb2NhdGlvbjsKLQlyZGV2LT5tYy52cmFtX2VuZCA9IHJkZXYtPm1jLnZyYW1fbG9jYXRpb24gKyByZGV2LT5tYy5tY192cmFtX3NpemU7CisJcmRldi0+bWMudnJhbV9lbmQgPSByZGV2LT5tYy52cmFtX2xvY2F0aW9uICsgcmRldi0+bWMubWNfdnJhbV9zaXplIC0gMTsKIAlyZGV2LT5tYy5ndHRfc3RhcnQgPSByZGV2LT5tYy5ndHRfbG9jYXRpb247Ci0JcmRldi0+bWMuZ3R0X2VuZCA9IHJkZXYtPm1jLmd0dF9sb2NhdGlvbiArIHJkZXYtPm1jLmd0dF9zaXplOworCXJkZXYtPm1jLmd0dF9lbmQgPSByZGV2LT5tYy5ndHRfbG9jYXRpb24gKyByZGV2LT5tYy5ndHRfc2l6ZSAtIDE7CiAJLyogRklYTUU6IHdlIHNob3VsZCBlbmZvcmNlIGRlZmF1bHQgY2xvY2sgaW4gY2FzZSBHUFUgaXMgbm90IGluCiAJICogZGVmYXVsdCBzZXR1cAogCSAqLwpAQCAtODU0LDExICs4NDgsMTQgQEAKIHsKIAlpbnQgcjsKIAotCXJhZGVvbl9ncHVfcmVzZXQocmRldik7Ci0JcnY3NzBfbWNfcmVzdW1lKHJkZXYpOwotCXIgPSBydjc3MF9wY2llX2dhcnRfZW5hYmxlKHJkZXYpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKKwlydjc3MF9tY19wcm9ncmFtKHJkZXYpOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKKwkJcnY3NzBfYWdwX2VuYWJsZShyZGV2KTsKKwl9IGVsc2UgeworCQlyID0gcnY3NzBfcGNpZV9nYXJ0X2VuYWJsZShyZGV2KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CiAJcnY3NzBfZ3B1X2luaXQocmRldik7CiAKIAlyID0gcmFkZW9uX29iamVjdF9waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCkBAIC04NzcsOSArODc0LDggQEAKIAlyID0gcjYwMF9jcF9yZXN1bWUocmRldik7CiAJaWYgKHIpCiAJCXJldHVybiByOwotCXIgPSByNjAwX3diX2luaXQocmRldik7Ci0JaWYgKHIpCi0JCXJldHVybiByOworCS8qIHdyaXRlIGJhY2sgYnVmZmVyIGFyZSBub3Qgdml0YWwgc28gZG9uJ3Qgd29ycnkgYWJvdXQgZmFpbHVyZSAqLworCXI2MDBfd2JfZW5hYmxlKHJkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC04ODcsMTUgKzg4MywxMiBAQAogewogCWludCByOwogCi0JaWYgKHJhZGVvbl9ncHVfcmVzZXQocmRldikpIHsKLQkJLyogRklYTUU6IHdoYXQgZG8gd2Ugd2FudCB0byBkbyBoZXJlID8gKi8KLQl9CisJLyogRG8gbm90IHJlc2V0IEdQVSBiZWZvcmUgcG9zdGluZywgb24gcnY3NzAgaHcgdW5saWtlIG9uIHI1MDAgaHcsCisJICogcG9zdGluZyB3aWxsIHBlcmZvcm0gbmVjZXNzYXJ5IHRhc2sgdG8gYnJpbmcgYmFjayBHUFUgaW50byBnb29kCisJICogc2hhcGUuCisJICovCiAJLyogcG9zdCBjYXJkICovCi0JaWYgKHJkZXYtPmlzX2F0b21fYmlvcykgewotCQlhdG9tX2FzaWNfaW5pdChyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0KTsKLQl9IGVsc2UgewotCQlyYWRlb25fY29tYmlvc19hc2ljX2luaXQocmRldi0+ZGRldik7Ci0JfQorCWF0b21fYXNpY19pbml0KHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQpOwogCS8qIEluaXRpYWxpemUgY2xvY2tzICovCiAJciA9IHJhZGVvbl9jbG9ja3NfaW5pdChyZGV2KTsKIAlpZiAocikgewpAQCAtOTA4LDcgKzkwMSw3IEBACiAJCXJldHVybiByOwogCX0KIAotCXIgPSByYWRlb25faWJfdGVzdChyZGV2KTsKKwlyID0gcjYwMF9pYl90ZXN0KHJkZXYpOwogCWlmIChyKSB7CiAJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsbGVkIHRlc3RpbmcgSUIgKCVkKS5cbiIsIHIpOwogCQlyZXR1cm4gcjsKQEAgLTkyMiw4ICs5MTUsOCBAQAogCS8qIEZJWE1FOiB3ZSBzaG91bGQgd2FpdCBmb3IgcmluZyB0byBiZSBlbXB0eSAqLwogCXI3MDBfY3Bfc3RvcChyZGV2KTsKIAlyZGV2LT5jcC5yZWFkeSA9IGZhbHNlOworCXI2MDBfd2JfZGlzYWJsZShyZGV2KTsKIAlydjc3MF9wY2llX2dhcnRfZGlzYWJsZShyZGV2KTsKLQogCS8qIHVucGluIHNoYWRlcnMgYm8gKi8KICAgICAgICAgcmFkZW9uX29iamVjdF91bnBpbihyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CiAJcmV0dXJuIDA7CkBAIC05MzksNyArOTMyLDYgQEAKIHsKIAlpbnQgcjsKIAotCXJkZXYtPm5ld19pbml0X3BhdGggPSB0cnVlOwogCXIgPSByYWRlb25fZHVtbXlfcGFnZV9pbml0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTk1Myw4ICs5NDUsMTAgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBNdXN0IGJlIGFuIEFUT01CSU9TICovCi0JaWYgKCFyZGV2LT5pc19hdG9tX2Jpb3MpCisJaWYgKCFyZGV2LT5pc19hdG9tX2Jpb3MpIHsKKwkJZGV2X2VycihyZGV2LT5kZXYsICJFeHBlY3RpbmcgYXRvbWJpb3MgZm9yIFI2MDAgR1BVXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXIgPSByYWRlb25fYXRvbWJpb3NfaW5pdChyZGV2KTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CkBAIC05NzYsMTUgKzk3MCw4IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCXIgPSBydjc3MF9tY19pbml0KHJkZXYpOwotCWlmIChyKSB7Ci0JCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKLQkJCS8qIFJldHJ5IHdpdGggZGlzYWJsaW5nIEFHUCAqLwotCQkJcnY3NzBfZmluaShyZGV2KTsKLQkJCXJkZXYtPmZsYWdzICY9IH5SQURFT05fSVNfQUdQOwotCQkJcmV0dXJuIHJ2NzcwX2luaXQocmRldik7Ci0JCX0KKwlpZiAocikKIAkJcmV0dXJuIHI7Ci0JfQogCS8qIE1lbW9yeSBtYW5hZ2VyICovCiAJciA9IHJhZGVvbl9vYmplY3RfaW5pdChyZGV2KTsKIAlpZiAocikKQEAgLTEwMTMsMTIgKzEwMDAsMTAgQEAKIAogCXIgPSBydjc3MF9zdGFydHVwKHJkZXYpOwogCWlmIChyKSB7Ci0JCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKLQkJCS8qIFJldHJ5IHdpdGggZGlzYWJsaW5nIEFHUCAqLwotCQkJcnY3NzBfZmluaShyZGV2KTsKLQkJCXJkZXYtPmZsYWdzICY9IH5SQURFT05fSVNfQUdQOwotCQkJcmV0dXJuIHJ2NzcwX2luaXQocmRldik7Ci0JCX0KKwkJcnY3NzBfc3VzcGVuZChyZGV2KTsKKwkJcjYwMF93Yl9maW5pKHJkZXYpOworCQlyYWRlb25fcmluZ19maW5pKHJkZXYpOworCQlydjc3MF9wY2llX2dhcnRfZmluaShyZGV2KTsKIAkJcmRldi0+YWNjZWxfd29ya2luZyA9IGZhbHNlOwogCX0KIAlpZiAocmRldi0+YWNjZWxfd29ya2luZykgewpAQCAtMTAyNyw3ICsxMDEyLDcgQEAKIAkJCURSTV9FUlJPUigicmFkZW9uOiBmYWlsbGVkIGluaXRpYWxpemluZyBJQiBwb29sICglZCkuXG4iLCByKTsKIAkJCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKIAkJfQotCQlyID0gcmFkZW9uX2liX3Rlc3QocmRldik7CisJCXIgPSByNjAwX2liX3Rlc3QocmRldik7CiAJCWlmIChyKSB7CiAJCQlEUk1fRVJST1IoInJhZGVvbjogZmFpbGxlZCB0ZXN0aW5nIElCICglZCkuXG4iLCByKTsKIAkJCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKQEAgLTEwNDIsMjAgKzEwMjcsMTUgQEAKIAogCXI2MDBfYmxpdF9maW5pKHJkZXYpOwogCXJhZGVvbl9yaW5nX2ZpbmkocmRldik7CisJcjYwMF93Yl9maW5pKHJkZXYpOwogCXJ2NzcwX3BjaWVfZ2FydF9maW5pKHJkZXYpOwogCXJhZGVvbl9nZW1fZmluaShyZGV2KTsKIAlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7CiAJcmFkZW9uX2Nsb2Nrc19maW5pKHJkZXYpOwotI2lmIF9fT1NfSEFTX0FHUAogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApCiAJCXJhZGVvbl9hZ3BfZmluaShyZGV2KTsKLSNlbmRpZgogCXJhZGVvbl9vYmplY3RfZmluaShyZGV2KTsKLQlpZiAocmRldi0+aXNfYXRvbV9iaW9zKSB7Ci0JCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwotCX0gZWxzZSB7Ci0JCXJhZGVvbl9jb21iaW9zX2ZpbmkocmRldik7Ci0JfQorCXJhZGVvbl9hdG9tYmlvc19maW5pKHJkZXYpOwogCWtmcmVlKHJkZXYtPmJpb3MpOwogCXJkZXYtPmJpb3MgPSBOVUxMOwogCXJhZGVvbl9kdW1teV9wYWdlX2ZpbmkocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib192bS5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdm0uYwppbmRleCAzM2RlNzYzLi4xYzA0MGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib192bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3ZtLmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB0dG1fYm9fdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB0dG1fYm9fdm1fb3BzID0gewogCS5mYXVsdCA9IHR0bV9ib192bV9mYXVsdCwKIAkub3BlbiA9IHR0bV9ib192bV9vcGVuLAogCS5jbG9zZSA9IHR0bV9ib192bV9jbG9zZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fZ2xvYmFsLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9nbG9iYWwuYwppbmRleCA1NDE3NDRkLi5iMTcwMDcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9nbG9iYWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9nbG9iYWwuYwpAQCAtODIsOCArODIsOCBAQAogCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQkJZ290byBvdXRfZXJyOwogCi0JCSsraXRlbS0+cmVmY291bnQ7CiAJfQorCSsraXRlbS0+cmVmY291bnQ7CiAJcmVmLT5vYmplY3QgPSBpdGVtLT5vYmplY3Q7CiAJb2JqZWN0ID0gaXRlbS0+b2JqZWN0OwogCW11dGV4X3VubG9jaygmaXRlbS0+bXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggYmUzNGQzMi4uN2QwNWM0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC0xMDY2LDcgKzEwNjYsNyBAQAogICogQHR5cGU6IEhJRCByZXBvcnQgdHlwZSAoSElEXypfUkVQT1JUKQogICogQGRhdGE6IHJlcG9ydCBjb250ZW50cwogICogQHNpemU6IHNpemUgb2YgZGF0YSBwYXJhbWV0ZXIKLSAqIEBpbnRlcnJ1cHQ6IGNhbGxlZCBmcm9tIGF0b21pYz8KKyAqIEBpbnRlcnJ1cHQ6IGRpc3Rpbmd1aXNoIGJldHdlZW4gaW50ZXJydXB0IGFuZCBjb250cm9sIHRyYW5zZmVycwogICoKICAqIFRoaXMgaXMgZGF0YSBlbnRyeSBmb3IgbG93ZXIgbGF5ZXJzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdHdpbmhhbi5jIGIvZHJpdmVycy9oaWQvaGlkLXR3aW5oYW4uYwppbmRleCBiMDVmNjAyLi5jNDBhZmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtdHdpbmhhbi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC10d2luaGFuLmMKQEAgLTEzMiwxMiArMTMyLDEyIEBACiAJLmlucHV0X21hcHBpbmcgPSB0d2luaGFuX2lucHV0X21hcHBpbmcsCiB9OwogCi1zdGF0aWMgaW50IHR3aW5oYW5faW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgdHdpbmhhbl9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnR3aW5oYW5fZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgdHdpbmhhbl9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgdHdpbmhhbl9leGl0KHZvaWQpCiB7CiAJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZ0d2luaGFuX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWRyYXcuYyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCmluZGV4IDBjNjYzOWUuLmNkZDEzNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZHJhdy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L2hpZHJhdy5oPgpAQCAtNDcsMTAgKzQ4LDkgQEAKIAljaGFyICpyZXBvcnQ7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKKwltdXRleF9sb2NrKCZsaXN0LT5yZWFkX211dGV4KTsKKwogCXdoaWxlIChyZXQgPT0gMCkgewotCi0JCW11dGV4X2xvY2soJmxpc3QtPnJlYWRfbXV0ZXgpOwotCiAJCWlmIChsaXN0LT5oZWFkID09IGxpc3QtPnRhaWwpIHsKIAkJCWFkZF93YWl0X3F1ZXVlKCZsaXN0LT5oaWRyYXctPndhaXQsICZ3YWl0KTsKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggZWQ3NzExZC4uNzAwZTkzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtMzI1LDM0ICszMjUsNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZjc1Mzc1cy4KIAotY29uZmlnIFNFTlNPUlNfRlNDSEVSCi0JdHJpc3RhdGUgIkZTQyBIZXJtZXMgKERFUFJFQ0FURUQpIgotCWRlcGVuZHMgb24gWDg2ICYmIEkyQwotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIGlzIERFUFJFQ0FURUQgcGxlYXNlIHVzZSB0aGUgbmV3IG1lcmdlZCBmc2NobWQKLQkgICgiRlNDIFBvc2VpZG9uLCBTY3lsbGEsIEhlcm1lcywgSGVpbWRhbGwgYW5kIEhlcmFjbGVzIikgZHJpdmVyCi0JICBpbnN0ZWFkLgotCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCi0JICBDb21wdXRlcnMgSGVybWVzIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgZnNjaGVyLgotCi1jb25maWcgU0VOU09SU19GU0NQT1MKLQl0cmlzdGF0ZSAiRlNDIFBvc2VpZG9uIChERVBSRUNBVEVEKSIKLQlkZXBlbmRzIG9uIFg4NiAmJiBJMkMKLQloZWxwCi0JICBUaGlzIGRyaXZlciBpcyBERVBSRUNBVEVEIHBsZWFzZSB1c2UgdGhlIG5ldyBtZXJnZWQgZnNjaG1kCi0JICAoIkZTQyBQb3NlaWRvbiwgU2N5bGxhLCBIZXJtZXMsIEhlaW1kYWxsIGFuZCBIZXJhY2xlcyIpIGRyaXZlcgotCSAgaW5zdGVhZC4KLQotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEZ1aml0c3UgU2llbWVucwotCSAgQ29tcHV0ZXJzIFBvc2VpZG9uIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgZnNjcG9zLgotCiBjb25maWcgU0VOU09SU19GU0NITUQKIAl0cmlzdGF0ZSAiRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVycyBzZW5zb3IgY2hpcHMiCiAJZGVwZW5kcyBvbiBYODYgJiYgSTJDCkBAIC00MDEsMTIgKzM3MywxMiBAQAogCSAgd2lsbCBiZSBjYWxsZWQgZ2w1MjBzbS4KIAogY29uZmlnIFNFTlNPUlNfQ09SRVRFTVAKLQl0cmlzdGF0ZSAiSW50ZWwgQ29yZSAoMikgRHVvL1NvbG8gdGVtcGVyYXR1cmUgc2Vuc29yIgorCXRyaXN0YXRlICJJbnRlbCBDb3JlL0NvcmUyL0F0b20gdGVtcGVyYXR1cmUgc2Vuc29yIgogCWRlcGVuZHMgb24gWDg2ICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgdGVtcGVyYXR1cmUKLQkgIHNlbnNvciBpbnNpZGUgeW91ciBDUFUuIFN1cHBvcnRlZCBhbGwgYXJlIGFsbCBrbm93biB2YXJpYW50cwotCSAgb2YgSW50ZWwgQ29yZSBmYW1pbHkuCisJICBzZW5zb3IgaW5zaWRlIHlvdXIgQ1BVLiBNb3N0IG9mIHRoZSBmYW1pbHkgNiBDUFVzCisJICBhcmUgc3VwcG9ydGVkLiBDaGVjayBkb2N1bWVudGF0aW9uL2RyaXZlciBmb3IgZGV0YWlscy4KIAogY29uZmlnIFNFTlNPUlNfSUJNQUVNCiAJdHJpc3RhdGUgIklCTSBBY3RpdmUgRW5lcmd5IE1hbmFnZXIgdGVtcGVyYXR1cmUvcG93ZXIgc2Vuc29ycyBhbmQgY29udHJvbCIKQEAgLTcwMyw3ICs2NzUsNyBAQAogCiBjb25maWcgU0VOU09SU19TM0MKIAl0cmlzdGF0ZSAiUzNDMjRYWC9TM0M2NFhYIEluYnVpbHQgQURDIgotCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwIHx8IEFSQ0hfUzNDNjRYWAorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBvbi1ib2FyZCBBRENzIG9mCiAJICB0aGUgU2Ftc3VuZyBTM0MyNFhYIG9yIFMzQzY0WFggc2VyaWVzIG9mIFNvQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggYmNmNzNhOS4uOWY0NmNiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC00Miw5ICs0Miw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19GNzE4MDVGKQkrPSBmNzE4MDVmLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHKQkrPSBmNzE4ODJmZy5vCiBvYmotJChDT05GSUdfU0VOU09SU19GNzUzNzVTKQkrPSBmNzUzNzVzLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ0hFUikJKz0gZnNjaGVyLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ0hNRCkJKz0gZnNjaG1kLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ1BPUykJKz0gZnNjcG9zLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0c3NjBBKQkrPSBnNzYwYS5vCiBvYmotJChDT05GSUdfU0VOU09SU19HTDUxOFNNKQkrPSBnbDUxOHNtLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0dMNTIwU00pCSs9IGdsNTIwc20ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDMxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwppbmRleCA3ODk0NDE4Li41NjkwNTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwpAQCAtMzcsNiArMzcsNyBAQAogI2RlZmluZSBBRE0xMDMxX1JFR19QV00JCQkoMHgyMikKICNkZWZpbmUgQURNMTAzMV9SRUdfRkFOX01JTihucikJCSgweDEwICsgKG5yKSkKIAorI2RlZmluZSBBRE0xMDMxX1JFR19URU1QX09GRlNFVChucikJKDB4MGQgKyAobnIpKQogI2RlZmluZSBBRE0xMDMxX1JFR19URU1QX01BWChucikJKDB4MTQgKyA0ICogKG5yKSkKICNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUF9NSU4obnIpCSgweDE1ICsgNCAqIChucikpCiAjZGVmaW5lIEFETTEwMzFfUkVHX1RFTVBfQ1JJVChucikJKDB4MTYgKyA0ICogKG5yKSkKQEAgLTkzLDYgKzk0LDcgQEAKIAl1OCBhdXRvX3RlbXBfbWluWzNdOwogCXU4IGF1dG9fdGVtcF9vZmZbM107CiAJdTggYXV0b190ZW1wX21heFszXTsKKwlzOCB0ZW1wX29mZnNldFszXTsKIAlzOCB0ZW1wX21pblszXTsKIAlzOCB0ZW1wX21heFszXTsKIAlzOCB0ZW1wX2NyaXRbM107CkBAIC0xNDUsNiArMTQ3LDEwIEBACiAKICNkZWZpbmUgVEVNUF9GUk9NX1JFR19FWFQodmFsLCBleHQpCShURU1QX0ZST01fUkVHKHZhbCkgKyAoZXh0KSAqIDEyNSkKIAorI2RlZmluZSBURU1QX09GRlNFVF9UT19SRUcodmFsKQkJKFRFTVBfVE9fUkVHKHZhbCkgJiAweDhmKQorI2RlZmluZSBURU1QX09GRlNFVF9GUk9NX1JFRyh2YWwpCVRFTVBfRlJPTV9SRUcoKHZhbCkgPCAwID8gXAorCQkJCQkJICAgICAgKHZhbCkgfCAweDcwIDogKHZhbCkpCisKICNkZWZpbmUgRkFOX0ZST01fUkVHKHJlZywgZGl2KQkJKChyZWcpID8gKDExMjUwICogNjApIC8gKChyZWcpICogKGRpdikpIDogMCkKIAogc3RhdGljIGludCBGQU5fVE9fUkVHKGludCByZWcsIGludCBkaXYpCkBAIC01ODUsNiArNTkxLDE0IEBACiAJICAgICgoKGRhdGEtPmV4dF90ZW1wW25yXSA+PiAoKG5yIC0gMSkgKiAzKSkgJiA3KSk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUdfRVhUKGRhdGEtPnRlbXBbbnJdLCBleHQpKTsKIH0KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSAgICAgICBURU1QX09GRlNFVF9GUk9NX1JFRyhkYXRhLT50ZW1wX29mZnNldFtucl0pKTsKK30KIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtNjA2LDYgKzYyMCwyNCBAQAogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2NyaXRbbnJdKSk7CiB9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJaW50IHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIC0xNTAwMCwgMTUwMDApOworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX29mZnNldFtucl0gPSBURU1QX09GRlNFVF9UT19SRUcodmFsKTsKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfVEVNUF9PRkZTRVQobnIpLAorCQkJICAgIGRhdGEtPnRlbXBfb2Zmc2V0W25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQogc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CkBAIC02NjEsNiArNjkzLDggQEAKICNkZWZpbmUgdGVtcF9yZWcob2Zmc2V0KQkJCQkJCVwKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sCQlcCiAJCXNob3dfdGVtcCwgTlVMTCwgb2Zmc2V0IC0gMSk7CQkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3RlbXBfb2Zmc2V0LCBzZXRfdGVtcF9vZmZzZXQsIG9mZnNldCAtIDEpOwkJXAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAlcCiAJCXNob3dfdGVtcF9taW4sIHNldF90ZW1wX21pbiwgb2Zmc2V0IC0gMSk7CQlcCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCVwKQEAgLTcxNCw2ICs3NDgsNyBAQAogCSZzZW5zb3JfZGV2X2F0dHJfcHdtMS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfYXV0b19mYW4xX2NoYW5uZWwuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKQEAgLTcyMSw2ICs3NTYsNyBAQAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX29mZnNldC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWluLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heC5kZXZfYXR0ci5hdHRyLApAQCAtNzU3LDYgKzc5Myw3IEBACiAJJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9hdXRvX2ZhbjJfY2hhbm5lbC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX29mZnNldC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLApAQCAtOTM3LDYgKzk3NCw5IEBACiAJCQl9CiAJCQlkYXRhLT50ZW1wW2NoYW5dID0gbmV3aDsKIAorCQkJZGF0YS0+dGVtcF9vZmZzZXRbY2hhbl0gPQorCQkJICAgIGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBBRE0xMDMxX1JFR19URU1QX09GRlNFVChjaGFuKSk7CiAJCQlkYXRhLT50ZW1wX21pbltjaGFuXSA9CiAJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwKIAkJCQkJICAgICAgIEFETTEwMzFfUkVHX1RFTVBfTUlOKGNoYW4pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMgYi9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jCmluZGV4IGZlNGZhMjkuLjVhM2VlMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc3VzX2F0azAxMTAuYwpAQCAtMzUsMTggKzM1LDIyIEBACiAjZGVmaW5lIE1FVEhPRF9PTERfRU5VTV9GQU4JIkZTSUYiCiAKICNkZWZpbmUgQVRLX01VWF9IV01PTgkJMHgwMDAwMDAwNlVMTAorI2RlZmluZSBBVEtfTVVYX01HTVQJCTB4MDAwMDAwMTFVTEwKIAogI2RlZmluZSBBVEtfQ0xBU1NfTUFTSwkJMHhmZjAwMDAwMFVMTAogI2RlZmluZSBBVEtfQ0xBU1NfRlJFUV9DVEwJMHgwMzAwMDAwMFVMTAogI2RlZmluZSBBVEtfQ0xBU1NfRkFOX0NUTAkweDA0MDAwMDAwVUxMCiAjZGVmaW5lIEFUS19DTEFTU19IV01PTgkJMHgwNjAwMDAwMFVMTAorI2RlZmluZSBBVEtfQ0xBU1NfTUdNVAkJMHgxMTAwMDAwMFVMTAogCiAjZGVmaW5lIEFUS19UWVBFX01BU0sJCTB4MDBmZjAwMDBVTEwKICNkZWZpbmUgSFdNT05fVFlQRV9WT0xUCQkweDAwMDIwMDAwVUxMCiAjZGVmaW5lIEhXTU9OX1RZUEVfVEVNUAkJMHgwMDAzMDAwMFVMTAogI2RlZmluZSBIV01PTl9UWVBFX0ZBTgkJMHgwMDA0MDAwMFVMTAogCi0jZGVmaW5lIEhXTU9OX1NFTlNPUl9JRF9NQVNLCTB4MDAwMGZmZmZVTEwKKyNkZWZpbmUgQVRLX0VMRU1FTlRfSURfTUFTSwkweDAwMDBmZmZmVUxMCisKKyNkZWZpbmUgQVRLX0VDX0lECQkweDExMDYwMDA0VUxMCiAKIGVudW0gYXRrX3BhY2tfbWVtYmVyIHsKIAlIV01PTl9QQUNLX0ZMQUdTLApAQCAtODksNiArOTMsOSBAQAogCS8qIG5ldyBpbnRlZmFjZSAqLwogCWFjcGlfaGFuZGxlIGVudW1lcmF0ZV9oYW5kbGU7CiAJYWNwaV9oYW5kbGUgcmVhZF9oYW5kbGU7CisJYWNwaV9oYW5kbGUgd3JpdGVfaGFuZGxlOworCisJYm9vbCBkaXNhYmxlX2VjOwogCiAJaW50IHZvbHRhZ2VfY291bnQ7CiAJaW50IHRlbXBlcmF0dXJlX2NvdW50OwpAQCAtMTI5LDkgKzEzNiwyMiBAQAogCWNoYXIgY29uc3QgKmFjcGlfbmFtZTsKIH07CiAKLXN0cnVjdCBhdGtfYWNwaV9idWZmZXJfdTY0IHsKLQl1bmlvbiBhY3BpX29iamVjdCBidWY7Ci0JdTY0IHZhbHVlOworLyogUmV0dXJuIGJ1ZmZlciBmb3JtYXQ6CisgKiBbMC0zXSAidmFsdWUiIGlzIHZhbGlkIGZsYWcKKyAqIFs0LTddIHZhbHVlCisgKiBbOC0gXSB1bmtub3duIHN0dWZmIG9uIG5ld2VyIG1vYm9zCisgKi8KK3N0cnVjdCBhdGtfYWNwaV9yZXRfYnVmZmVyIHsKKwl1MzIgZmxhZ3M7CisJdTMyIHZhbHVlOworCXU4IGRhdGFbXTsKK307CisKKy8qIElucHV0IGJ1ZmZlciB1c2VkIGZvciBHSVRNIGFuZCBTSVRNIG1ldGhvZHMgKi8KK3N0cnVjdCBhdGtfYWNwaV9pbnB1dF9idWYgeworCXUzMiBpZDsKKwl1MzIgcGFyYW0xOworCXUzMiBwYXJhbTI7CiB9OwogCiBzdGF0aWMgaW50IGF0a19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwpAQCAtNDM5LDUyICs0NTksMTQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1bmlvbiBhY3BpX29iamVjdCAqYXRrX2dncnAoc3RydWN0IGF0a19kYXRhICpkYXRhLCB1MTYgbXV4KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5hY3BpX2Rldi0+ZGV2OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWY7CisJYWNwaV9zdGF0dXMgcmV0OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IHBhcmFtczsKKwl1bmlvbiBhY3BpX29iamVjdCBpZDsKKwl1bmlvbiBhY3BpX29iamVjdCAqcGFjazsKKworCWlkLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlpZC5pbnRlZ2VyLnZhbHVlID0gbXV4OworCXBhcmFtcy5jb3VudCA9IDE7CisJcGFyYW1zLnBvaW50ZXIgPSAmaWQ7CisKKwlidWYubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9CVUZGRVI7CisJcmV0ID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGF0YS0+ZW51bWVyYXRlX2hhbmRsZSwgTlVMTCwgJnBhcmFtcywgJmJ1Zik7CisJaWYgKHJldCAhPSBBRV9PSykgeworCQlkZXZfZXJyKGRldiwgIkdHUlBbJSN4XSBBQ1BJIGV4Y2VwdGlvbjogJXNcbiIsIG11eCwKKwkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24ocmV0KSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKwlwYWNrID0gYnVmLnBvaW50ZXI7CisJaWYgKHBhY2stPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJLyogRXhlY3V0aW9uIHdhcyBzdWNjZXNzZnVsLCBidXQgdGhlIGlkIHdhcyBub3QgZm91bmQgKi8KKwkJQUNQSV9GUkVFKHBhY2spOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwl9CisKKwlpZiAocGFjay0+cGFja2FnZS5jb3VudCA8IDEpIHsKKwkJZGV2X2VycihkZXYsICJHR1JQWyUjeF0gcGFja2FnZSBpcyB0b28gc21hbGxcbiIsIG11eCk7CisJCUFDUElfRlJFRShwYWNrKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCXJldHVybiBwYWNrOworfQorCitzdGF0aWMgdW5pb24gYWNwaV9vYmplY3QgKmF0a19naXRtKHN0cnVjdCBhdGtfZGF0YSAqZGF0YSwgdTY0IGlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5hY3BpX2Rldi0+ZGV2OworCXN0cnVjdCBhdGtfYWNwaV9pbnB1dF9idWYgYnVmOworCXVuaW9uIGFjcGlfb2JqZWN0IHRtcDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CisJc3RydWN0IGFjcGlfYnVmZmVyIHJldDsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWJ1Zi5pZCA9IGlkOworCWJ1Zi5wYXJhbTEgPSAwOworCWJ1Zi5wYXJhbTIgPSAwOworCisJdG1wLnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOworCXRtcC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSZidWY7CisJdG1wLmJ1ZmZlci5sZW5ndGggPSBzaXplb2YoYnVmKTsKKworCXBhcmFtcy5jb3VudCA9IDE7CisJcGFyYW1zLnBvaW50ZXIgPSAodm9pZCAqKSZ0bXA7CisKKwlyZXQubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9CVUZGRVI7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQoZGF0YS0+cmVhZF9oYW5kbGUsIE5VTEwsICZwYXJhbXMsCisJCQkmcmV0LCBBQ1BJX1RZUEVfQlVGRkVSKTsKKwlpZiAoc3RhdHVzICE9IEFFX09LKSB7CisJCWRldl93YXJuKGRldiwgIkdJVE1bJSNsbHhdIEFDUEkgZXhjZXB0aW9uOiAlc1xuIiwgaWQsCisJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisJb2JqID0gcmV0LnBvaW50ZXI7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoIDwgOCkgeworCQlkZXZfd2FybihkZXYsICJVbmV4cGVjdGVkIEFTQkYgbGVuZ3RoOiAldVxuIiwKKwkJCQlvYmotPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX0ZSRUUob2JqKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB1bmlvbiBhY3BpX29iamVjdCAqYXRrX3NpdG0oc3RydWN0IGF0a19kYXRhICpkYXRhLAorCQlzdHJ1Y3QgYXRrX2FjcGlfaW5wdXRfYnVmICpidWYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmFjcGlfZGV2LT5kZXY7CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgcGFyYW1zOworCXVuaW9uIGFjcGlfb2JqZWN0IHRtcDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgcmV0OworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJdG1wLnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOworCXRtcC5idWZmZXIucG9pbnRlciA9ICh1OCAqKWJ1ZjsKKwl0bXAuYnVmZmVyLmxlbmd0aCA9IHNpemVvZigqYnVmKTsKKworCXBhcmFtcy5jb3VudCA9IDE7CisJcGFyYW1zLnBvaW50ZXIgPSAmdG1wOworCisJcmV0Lmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfQlVGRkVSOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkKGRhdGEtPndyaXRlX2hhbmRsZSwgTlVMTCwgJnBhcmFtcywKKwkJCSZyZXQsIEFDUElfVFlQRV9CVUZGRVIpOworCWlmIChzdGF0dXMgIT0gQUVfT0spIHsKKwkJZGV2X3dhcm4oZGV2LCAiU0lUTVslI3hdIEFDUEkgZXhjZXB0aW9uOiAlc1xuIiwgYnVmLT5pZCwKKwkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKwlvYmogPSByZXQucG9pbnRlcjsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChvYmotPmJ1ZmZlci5sZW5ndGggPCA4KSB7CisJCWRldl93YXJuKGRldiwgIlVuZXhwZWN0ZWQgQVNCRiBsZW5ndGg6ICV1XG4iLAorCQkJCW9iai0+YnVmZmVyLmxlbmd0aCk7CisJCUFDUElfRlJFRShvYmopOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisJcmV0dXJuIG9iajsKK30KKwogc3RhdGljIGludCBhdGtfcmVhZF92YWx1ZV9uZXcoc3RydWN0IGF0a19zZW5zb3JfZGF0YSAqc2Vuc29yLCB1NjQgKnZhbHVlKQogewogCXN0cnVjdCBhdGtfZGF0YSAqZGF0YSA9IHNlbnNvci0+ZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+YWNwaV9kZXYtPmRldjsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIHJldDsKLQl1bmlvbiBhY3BpX29iamVjdCBpZDsKLQlzdHJ1Y3QgYXRrX2FjcGlfYnVmZmVyX3U2NCB0bXA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJc3RydWN0IGF0a19hY3BpX3JldF9idWZmZXIgKmJ1ZjsKKwlpbnQgZXJyID0gMDsKIAotCWlkLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKLQlpZC5pbnRlZ2VyLnZhbHVlID0gc2Vuc29yLT5pZDsKKwlvYmogPSBhdGtfZ2l0bShkYXRhLCBzZW5zb3ItPmlkKTsKKwlpZiAoSVNfRVJSKG9iaikpCisJCXJldHVybiBQVFJfRVJSKG9iaik7CiAKLQlwYXJhbXMuY291bnQgPSAxOwotCXBhcmFtcy5wb2ludGVyID0gJmlkOwotCi0JdG1wLmJ1Zi50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKLQl0bXAuYnVmLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopJnRtcC52YWx1ZTsKLQl0bXAuYnVmLmJ1ZmZlci5sZW5ndGggPSBzaXplb2YodTY0KTsKLQlyZXQubGVuZ3RoID0gc2l6ZW9mKHRtcCk7Ci0JcmV0LnBvaW50ZXIgPSAmdG1wOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQoZGF0YS0+cmVhZF9oYW5kbGUsIE5VTEwsICZwYXJhbXMsCi0JCQkmcmV0LCBBQ1BJX1RZUEVfQlVGRkVSKTsKLQlpZiAoc3RhdHVzICE9IEFFX09LKSB7Ci0JCWRldl93YXJuKGRldiwgIiVzOiBBQ1BJIGV4Y2VwdGlvbjogJXNcbiIsIF9fZnVuY19fLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogUmV0dXJuIGJ1ZmZlciBmb3JtYXQ6Ci0JICogWzAtM10gInZhbHVlIiBpcyB2YWxpZCBmbGFnCi0JICogWzQtN10gdmFsdWUKLQkgKi8KLQlpZiAoISh0bXAudmFsdWUgJiAweGZmZmZmZmZmKSkgeworCWJ1ZiA9IChzdHJ1Y3QgYXRrX2FjcGlfcmV0X2J1ZmZlciAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CisJaWYgKGJ1Zi0+ZmxhZ3MgPT0gMCkgewogCQkvKiBUaGUgcmVhZGluZyBpcyBub3QgdmFsaWQsIHBvc3NpYmxlIGNhdXNlczoKIAkJICogLSBzZW5zb3IgZmFpbHVyZQogCQkgKiAtIGVudW1lcmF0aW9uIHdhcyBGVUJBUiAoYW5kIHdlIGRpZG4ndCBub3RpY2UpCiAJCSAqLwotCQlkZXZfaW5mbyhkZXYsICJGYWlsdXJlOiAlI2xseFxuIiwgdG1wLnZhbHVlKTsKLQkJcmV0dXJuIC1FSU87CisJCWRldl93YXJuKGRldiwgIlJlYWQgZmFpbGVkLCBzZW5zb3IgPSAlI2xseFxuIiwgc2Vuc29yLT5pZCk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OwogCX0KIAotCSp2YWx1ZSA9ICh0bXAudmFsdWUgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpID4+IDMyOwotCi0JcmV0dXJuIDA7CisJKnZhbHVlID0gYnVmLT52YWx1ZTsKK291dDoKKwlBQ1BJX0ZSRUUob2JqKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGF0a19yZWFkX3ZhbHVlKHN0cnVjdCBhdGtfc2Vuc29yX2RhdGEgKnNlbnNvciwgdTY0ICp2YWx1ZSkKQEAgLTcxMyw0MiArODI4LDE0MCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYXRrX2VjX3ByZXNlbnQoc3RydWN0IGF0a19kYXRhICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5hY3BpX2Rldi0+ZGV2OworCXVuaW9uIGFjcGlfb2JqZWN0ICpwYWNrOworCXVuaW9uIGFjcGlfb2JqZWN0ICplYzsKKwlpbnQgcmV0OworCWludCBpOworCisJcGFjayA9IGF0a19nZ3JwKGRhdGEsIEFUS19NVVhfTUdNVCk7CisJaWYgKElTX0VSUihwYWNrKSkgeworCQlpZiAoUFRSX0VSUihwYWNrKSA9PSAtRU5PRU5UKSB7CisJCQkvKiBUaGUgTUdNVCBjbGFzcyBkb2VzIG5vdCBleGlzdHMgLSB0aGF0J3Mgb2sgKi8KKwkJCWRldl9kYmcoZGV2LCAiQ2xhc3MgJSNsbHggbm90IGZvdW5kXG4iLCBBVEtfTVVYX01HTVQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIFBUUl9FUlIocGFjayk7CisJfQorCisJLyogU2VhcmNoIHRoZSBFQyAqLworCWVjID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgcGFjay0+cGFja2FnZS5jb3VudDsgaSsrKSB7CisJCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmogPSAmcGFjay0+cGFja2FnZS5lbGVtZW50c1tpXTsKKwkJdW5pb24gYWNwaV9vYmplY3QgKmlkOworCisJCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpCisJCQljb250aW51ZTsKKworCQlpZCA9ICZvYmotPnBhY2thZ2UuZWxlbWVudHNbMF07CisJCWlmIChpZC0+dHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUikKKwkJCWNvbnRpbnVlOworCisJCWlmIChpZC0+aW50ZWdlci52YWx1ZSA9PSBBVEtfRUNfSUQpIHsKKwkJCWVjID0gb2JqOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXQgPSAoZWMgIT0gTlVMTCk7CisJaWYgKCFyZXQpCisJCS8qIFRoZSBzeXN0ZW0gaGFzIG5vIEVDICovCisJCWRldl9kYmcoZGV2LCAiRUMgbm90IGZvdW5kXG4iKTsKKworCUFDUElfRlJFRShwYWNrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0a19lY19lbmFibGVkKHN0cnVjdCBhdGtfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+YWNwaV9kZXYtPmRldjsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCBhdGtfYWNwaV9yZXRfYnVmZmVyICpidWY7CisJaW50IGVycjsKKworCW9iaiA9IGF0a19naXRtKGRhdGEsIEFUS19FQ19JRCk7CisJaWYgKElTX0VSUihvYmopKSB7CisJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHF1ZXJ5IEVDIHN0YXR1c1xuIik7CisJCXJldHVybiBQVFJfRVJSKG9iaik7CisJfQorCWJ1ZiA9IChzdHJ1Y3QgYXRrX2FjcGlfcmV0X2J1ZmZlciAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CisKKwlpZiAoYnVmLT5mbGFncyA9PSAwKSB7CisJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHF1ZXJ5IEVDIHN0YXR1c1xuIik7CisJCWVyciA9IC1FSU87CisJfSBlbHNlIHsKKwkJZXJyID0gKGJ1Zi0+dmFsdWUgIT0gMCk7CisJCWRldl9kYmcoZGV2LCAiRUMgaXMgJXNhYmxlZFxuIiwKKwkJCQllcnIgPyAiZW4iIDogImRpcyIpOworCX0KKworCUFDUElfRlJFRShvYmopOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXRrX2VjX2N0bChzdHJ1Y3QgYXRrX2RhdGEgKmRhdGEsIGludCBlbmFibGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmFjcGlfZGV2LT5kZXY7CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgYXRrX2FjcGlfaW5wdXRfYnVmIHNpdG07CisJc3RydWN0IGF0a19hY3BpX3JldF9idWZmZXIgKmVjX3JldDsKKwlpbnQgZXJyID0gMDsKKworCXNpdG0uaWQgPSBBVEtfRUNfSUQ7CisJc2l0bS5wYXJhbTEgPSBlbmFibGU7CisJc2l0bS5wYXJhbTIgPSAwOworCisJb2JqID0gYXRrX3NpdG0oZGF0YSwgJnNpdG0pOworCWlmIChJU19FUlIob2JqKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byAlc2FibGUgdGhlIEVDXG4iLAorCQkJCWVuYWJsZSA/ICJlbiIgOiAiZGlzIik7CisJCXJldHVybiBQVFJfRVJSKG9iaik7CisJfQorCWVjX3JldCA9IChzdHJ1Y3QgYXRrX2FjcGlfcmV0X2J1ZmZlciAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CisJaWYgKGVjX3JldC0+ZmxhZ3MgPT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byAlc2FibGUgdGhlIEVDXG4iLAorCQkJCWVuYWJsZSA/ICJlbiIgOiAiZGlzIik7CisJCWVyciA9IC1FSU87CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oZGV2LCAiRUMgJXNhYmxlZFxuIiwKKwkJCQllbmFibGUgPyAiZW4iIDogImRpcyIpOworCX0KKworCUFDUElfRlJFRShvYmopOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgYXRrX2VudW1lcmF0ZV9uZXdfaHdtb24oc3RydWN0IGF0a19kYXRhICpkYXRhKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5hY3BpX2Rldi0+ZGV2OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWY7Ci0JYWNwaV9zdGF0dXMgcmV0OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IHBhcmFtczsKLQl1bmlvbiBhY3BpX29iamVjdCBpZDsKIAl1bmlvbiBhY3BpX29iamVjdCAqcGFjazsKIAlpbnQgZXJyOwogCWludCBpOwogCisJZXJyID0gYXRrX2VjX3ByZXNlbnQoZGF0YSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKGVycikgeworCQllcnIgPSBhdGtfZWNfZW5hYmxlZChkYXRhKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQkvKiBJZiB0aGUgRUMgd2FzIGRpc2FibGVkIHdlIHdpbGwgZGlzYWJsZSBpdCBhZ2FpbiBvbiB1bmxvYWQgKi8KKwkJZGF0YS0+ZGlzYWJsZV9lYyA9IGVycjsKKworCQllcnIgPSBhdGtfZWNfY3RsKGRhdGEsIDEpOworCQlpZiAoZXJyKSB7CisJCQlkYXRhLT5kaXNhYmxlX2VjID0gZmFsc2U7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCiAJZGV2X2RiZyhkZXYsICJFbnVtZXJhdGluZyBod21vbiBzZW5zb3JzXG4iKTsKIAotCWlkLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKLQlpZC5pbnRlZ2VyLnZhbHVlID0gQVRLX01VWF9IV01PTjsKLQlwYXJhbXMuY291bnQgPSAxOwotCXBhcmFtcy5wb2ludGVyID0gJmlkOwotCi0JYnVmLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfQlVGRkVSOwotCXJldCA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkKGRhdGEtPmVudW1lcmF0ZV9oYW5kbGUsIE5VTEwsICZwYXJhbXMsCi0JCQkmYnVmLCBBQ1BJX1RZUEVfUEFDS0FHRSk7Ci0JaWYgKHJldCAhPSBBRV9PSykgewotCQlkZXZfd2FybihkZXYsIE1FVEhPRF9FTlVNRVJBVEUgIjogQUNQSSBleGNlcHRpb246ICVzXG4iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihyZXQpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogUmVzdWx0IG11c3QgYmUgYSBwYWNrYWdlICovCi0JcGFjayA9IGJ1Zi5wb2ludGVyOwotCi0JaWYgKHBhY2stPnBhY2thZ2UuY291bnQgPCAxKSB7Ci0JCWRldl9kYmcoZGV2LCAiJXM6IGh3bW9uIHBhY2thZ2UgaXMgdG9vIHNtYWxsOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJcGFjay0+cGFja2FnZS5jb3VudCk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KKwlwYWNrID0gYXRrX2dncnAoZGF0YSwgQVRLX01VWF9IV01PTik7CisJaWYgKElTX0VSUihwYWNrKSkKKwkJcmV0dXJuIFBUUl9FUlIocGFjayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFjay0+cGFja2FnZS5jb3VudDsgaSsrKSB7CiAJCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmogPSAmcGFjay0+cGFja2FnZS5lbGVtZW50c1tpXTsKQEAgLTc1OCw4ICs5NzEsNyBAQAogCiAJZXJyID0gZGF0YS0+dm9sdGFnZV9jb3VudCArIGRhdGEtPnRlbXBlcmF0dXJlX2NvdW50ICsgZGF0YS0+ZmFuX2NvdW50OwogCi1vdXQ6Ci0JQUNQSV9GUkVFKGJ1Zi5wb2ludGVyKTsKKwlBQ1BJX0ZSRUUocGFjayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODk1LDYgKzExMDcsMTUgQEAKIAl9CiAJZGF0YS0+cmVhZF9oYW5kbGUgPSByZXQ7CiAKKwkvKiBEZS1tdWx0aXBsZXhlciAod3JpdGUpICovCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGRhdGEtPmF0a19oYW5kbGUsIE1FVEhPRF9XUklURSwgJnJldCk7CisJaWYgKHN0YXR1cyAhPSBBRV9PSykgeworCQlkZXZfZGJnKGRldiwgIm1ldGhvZCAiIE1FVEhPRF9SRUFEICIgbm90IGZvdW5kOiAlc1xuIiwKKwkJCQkgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGF0YS0+d3JpdGVfaGFuZGxlID0gcmV0OworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkxNSw2ICsxMTM2LDcgQEAKIAlkYXRhLT5hY3BpX2RldiA9IGRldmljZTsKIAlkYXRhLT5hdGtfaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CiAJSU5JVF9MSVNUX0hFQUQoJmRhdGEtPnNlbnNvcl9saXN0KTsKKwlkYXRhLT5kaXNhYmxlX2VjID0gZmFsc2U7CiAKIAlidWYubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9CVUZGRVI7CiAJcmV0ID0gYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQoZGF0YS0+YXRrX2hhbmRsZSwgQk9BUkRfSUQsIE5VTEwsCkBAIC05NzMsNiArMTE5NSw4IEBACiBjbGVhbnVwOgogCWF0a19mcmVlX3NlbnNvcnMoZGF0YSk7CiBvdXQ6CisJaWYgKGRhdGEtPmRpc2FibGVfZWMpCisJCWF0a19lY19jdGwoZGF0YSwgMCk7CiAJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTk4OCw2ICsxMjEyLDExIEBACiAJYXRrX2ZyZWVfc2Vuc29ycyhkYXRhKTsKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogCisJaWYgKGRhdGEtPmRpc2FibGVfZWMpIHsKKwkJaWYgKGF0a19lY19jdGwoZGF0YSwgMCkpCisJCQlkZXZfZXJyKCZkZXZpY2UtPmRldiwgIkZhaWxlZCB0byBkaXNhYmxlIEVDXG4iKTsKKwl9CisKIAlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCmluZGV4IDk3MmNmNGIuLmNhZWYzOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKQEAgLTE1NywxNyArMTU3LDI2IEBACiAJLyogVGhlIDEwMEMgaXMgZGVmYXVsdCBmb3IgYm90aCBtb2JpbGUgYW5kIG5vbiBtb2JpbGUgQ1BVcyAqLwogCiAJaW50IHRqbWF4ID0gMTAwMDAwOwotCWludCBpc21vYmlsZSA9IDE7CisJaW50IHRqbWF4X2VlID0gODUwMDA7CisJaW50IHVzZW1zcl9lZSA9IDE7CiAJaW50IGVycjsKIAl1MzIgZWF4LCBlZHg7CiAKIAkvKiBFYXJseSBjaGlwcyBoYXZlIG5vIE1TUiBmb3IgVGpNYXggKi8KIAogCWlmICgoYy0+eDg2X21vZGVsID09IDB4ZikgJiYgKGMtPng4Nl9tYXNrIDwgNCkpIHsKLQkJaXNtb2JpbGUgPSAwOworCQl1c2Vtc3JfZWUgPSAwOwogCX0KIAotCWlmICgoYy0+eDg2X21vZGVsID4gMHhlKSAmJiAoaXNtb2JpbGUpKSB7CisJLyogQXRvbXMgc2VlbXMgdG8gaGF2ZSBUak1heCBhdCA5MEMgKi8KKworCWlmIChjLT54ODZfbW9kZWwgPT0gMHgxYykgeworCQl1c2Vtc3JfZWUgPSAwOworCQl0am1heCA9IDkwMDAwOworCX0KKworCWlmICgoYy0+eDg2X21vZGVsID4gMHhlKSAmJiAodXNlbXNyX2VlKSkgeworCQl1OCBwbGF0Zm9ybV9pZDsKIAogCQkvKiBOb3cgd2UgY2FuIGRldGVjdCB0aGUgbW9iaWxlIENQVSB1c2luZyBJbnRlbCBwcm92aWRlZCB0YWJsZQogCQkgICBodHRwOi8vc29mdHdhcmVjb21tdW5pdHkuaW50ZWwuY29tL1dpa2kvTW9iaWxpdHkvNzIwLmh0bQpAQCAtMTc5LDEzICsxODgsMjkgQEAKIAkJCWRldl93YXJuKGRldiwKIAkJCQkgIlVuYWJsZSB0byBhY2Nlc3MgTVNSIDB4MTcsIGFzc3VtaW5nIGRlc2t0b3AiCiAJCQkJICIgQ1BVXG4iKTsKLQkJCWlzbW9iaWxlID0gMDsKLQkJfSBlbHNlIGlmICghKGVheCAmIDB4MTAwMDAwMDApKSB7Ci0JCQlpc21vYmlsZSA9IDA7CisJCQl1c2Vtc3JfZWUgPSAwOworCQl9IGVsc2UgaWYgKGMtPng4Nl9tb2RlbCA8IDB4MTcgJiYgIShlYXggJiAweDEwMDAwMDAwKSkgeworCQkJLyogVHJ1c3QgYml0IDI4IHVwIHRvIFBlbnJ5biwgSSBjb3VsZCBub3QgZmluZCBhbnkKKwkJCSAgIGRvY3VtZW50YXRpb24gb24gdGhhdDsgaWYgeW91IGhhcHBlbiB0byBrbm93CisJCQkgICBzb21lb25lIGF0IEludGVsIHBsZWFzZSBhc2sgKi8KKwkJCXVzZW1zcl9lZSA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBQbGF0Zm9ybSBJRCBiaXRzIDUyOjUwIChFRFggc3RhcnRzIGF0IGJpdCAzMikgKi8KKwkJCXBsYXRmb3JtX2lkID0gKGVkeCA+PiAxOCkgJiAweDc7CisKKwkJCS8qIE1vYmlsZSBQZW5yeW4gQ1BVIHNlZW1zIHRvIGJlIHBsYXRmb3JtIElEIDcgb3IgNQorCQkJICAoZ3Vlc3N3b3JrKSAqLworCQkJaWYgKChjLT54ODZfbW9kZWwgPT0gMHgxNykgJiYKKwkJCSAgICAoKHBsYXRmb3JtX2lkID09IDUpIHx8IChwbGF0Zm9ybV9pZCA9PSA3KSkpIHsKKwkJCQkvKiBJZiBNU1IgRUUgYml0IGlzIHNldCwgc2V0IGl0IHRvIDkwIGRlZ3JlZXMgQywKKwkJCQkgICBvdGhlcndpc2UgMTA1IGRlZ3JlZXMgQyAqLworCQkJCXRqbWF4X2VlID0gOTAwMDA7CisJCQkJdGptYXggPSAxMDUwMDA7CisJCQl9CiAJCX0KIAl9CiAKLQlpZiAoaXNtb2JpbGUgfHwgYy0+eDg2X21vZGVsID09IDB4MWMpIHsKKwlpZiAodXNlbXNyX2VlKSB7CiAKIAkJZXJyID0gcmRtc3Jfc2FmZV9vbl9jcHUoaWQsIDB4ZWUsICZlYXgsICZlZHgpOwogCQlpZiAoZXJyKSB7CkBAIC0xOTMsOSArMjE4LDExIEBACiAJCQkJICJVbmFibGUgdG8gYWNjZXNzIE1TUiAweEVFLCBmb3IgVGptYXgsIGxlZnQiCiAJCQkJICIgYXQgZGVmYXVsdCIpOwogCQl9IGVsc2UgaWYgKGVheCAmIDB4NDAwMDAwMDApIHsKLQkJCXRqbWF4ID0gODUwMDA7CisJCQl0am1heCA9IHRqbWF4X2VlOwogCQl9Ci0JfSBlbHNlIHsKKwkvKiBpZiB3ZSBkb250IHVzZSBtc3IgRUUgaXQgbWVhbnMgd2UgYXJlIGRlc2t0b3AgQ1BVICh3aXRoIGV4ZWNlcHRpb24KKwkgICBvZiBBdG9tKSAqLworCX0gZWxzZSBpZiAodGptYXggPT0gMTAwMDAwKSB7CiAJCWRldl93YXJuKGRldiwgIlVzaW5nIHJlbGF0aXZlIHRlbXBlcmF0dXJlIHNjYWxlIVxuIik7CiAJfQogCkBAIC0yNDgsOSArMjc1LDkgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKIAogCS8qIHJlYWQgdGhlIHN0aWxsIHVuZG9jdW1lbnRlZCBJQTMyX1RFTVBFUkFUVVJFX1RBUkdFVCBpdCBleGlzdHMKLQkgICBvbiBvbGRlciBDUFVzIGJ1dCBub3QgaW4gdGhpcyByZWdpc3RlciAqLworCSAgIG9uIG9sZGVyIENQVXMgYnV0IG5vdCBpbiB0aGlzIHJlZ2lzdGVyLCBBdG9tcyBkb24ndCBoYXZlIGl0IGVpdGhlciAqLwogCi0JaWYgKGMtPng4Nl9tb2RlbCA+IDB4ZSkgeworCWlmICgoYy0+eDg2X21vZGVsID4gMHhlKSAmJiAoYy0+eDg2X21vZGVsICE9IDB4MWMpKSB7CiAJCWVyciA9IHJkbXNyX3NhZmVfb25fY3B1KGRhdGEtPmlkLCAweDFhMiwgJmVheCwgJmVkeCk7CiAJCWlmIChlcnIpIHsKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVhZCIKQEAgLTQxMywxMSArNDQwLDE1IEBACiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CiAJCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShpKTsKIAotCQkvKiBjaGVjayBpZiBmYW1pbHkgNiwgbW9kZWxzIDB4ZSwgMHhmLCAweDE2LCAweDE3LCAweDFBICovCisJCS8qIGNoZWNrIGlmIGZhbWlseSA2LCBtb2RlbHMgMHhlIChQZW50aXVtIE0gREMpLAorCQkgIDB4ZiAoQ29yZSAyIERDIDY1bm0pLCAweDE2IChDb3JlIDIgU0MgNjVubSksCisJCSAgMHgxNyAoUGVucnluIDQ1bm0pLCAweDFhIChOZWhhbGVtKSwgMHgxYyAoQXRvbSksCisJCSAgMHgxZSAoTHlubmZpZWxkKSAqLwogCQlpZiAoKGMtPmNwdWlkX2xldmVsIDwgMCkgfHwgKGMtPng4NiAhPSAweDYpIHx8CiAJCSAgICAhKChjLT54ODZfbW9kZWwgPT0gMHhlKSB8fCAoYy0+eDg2X21vZGVsID09IDB4ZikgfHwKIAkJCShjLT54ODZfbW9kZWwgPT0gMHgxNikgfHwgKGMtPng4Nl9tb2RlbCA9PSAweDE3KSB8fAotCQkJKGMtPng4Nl9tb2RlbCA9PSAweDFBKSB8fCAoYy0+eDg2X21vZGVsID09IDB4MWMpKSkgeworCQkJKGMtPng4Nl9tb2RlbCA9PSAweDFhKSB8fCAoYy0+eDg2X21vZGVsID09IDB4MWMpIHx8CisJCQkoYy0+eDg2X21vZGVsID09IDB4MWUpKSkgewogCiAJCQkvKiBzdXBwb3J0ZWQgQ1BVIG5vdCBmb3VuZCwgYnV0IHJlcG9ydCB0aGUgdW5rbm93bgogCQkJICAgZmFtaWx5IDYgQ1BVICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCmluZGV4IDJjMmNiMWUuLjI3ZDYyNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCkBAIC01NzIsNyArNTcyLDcgQEAKIAogCS8qIFNhbXBsZSByZWdpc3RlciBjb250ZW50cyBldmVyeSAxIHNlYyAqLwogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlICsgSFopIHx8ICFkYXRhLT52YWxpZCkgewotCQlpZiAoZGF0YS0+dHlwZSAhPSBzY2g1MDI3KSB7CisJCWlmIChkYXRhLT50eXBlID09IGRtZTE3MzcpIHsKIAkJCWRhdGEtPnZpZCA9IGRtZTE3MzdfcmVhZChkYXRhLCBETUUxNzM3X1JFR19WSUQpICYKIAkJCQkweDNmOwogCQl9CkBAIC0xNjIxLDkgKzE2MjEsNiBAQAogCSZzZW5zb3JfZGV2X2F0dHJfem9uZTFfYXV0b19wb2ludDFfdGVtcF9oeXN0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl96b25lMl9hdXRvX3BvaW50MV90ZW1wX2h5c3QuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3pvbmUzX2F1dG9fcG9pbnQxX3RlbXBfaHlzdC5kZXZfYXR0ci5hdHRyLAotCS8qIE1pc2MgKi8KLQkmZGV2X2F0dHJfdnJtLmF0dHIsCi0JJmRldl9hdHRyX2NwdTBfdmlkLmF0dHIsCiAJTlVMTAogfTsKIApAQCAtMTYzMSw2ICsxNjI4LDE4IEBACiAJLmF0dHJzID0gZG1lMTczN19taXNjX2F0dHIsCiB9OwogCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdCBob2xkcyBWSUQtcmVsYXRlZCBhdHRyaWJ1dGVzLiBUaGVpciBjcmVhdGlvbgorICAgZGVwZW5kcyBvbiB0aGUgY2hpcCB0eXBlIHdoaWNoIGlzIGRldGVybWluZWQgZHVyaW5nIG1vZHVsZSBsb2FkLiAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRtZTE3MzdfdmlkX2F0dHJbXSA9IHsKKwkmZGV2X2F0dHJfdnJtLmF0dHIsCisJJmRldl9hdHRyX2NwdTBfdmlkLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZG1lMTczN192aWRfZ3JvdXAgPSB7CisJLmF0dHJzID0gZG1lMTczN192aWRfYXR0ciwKK307CisKIC8qIFRoZSBmb2xsb3dpbmcgc3RydWN0cyBob2xkIHRoZSBQV00gYXR0cmlidXRlcywgc29tZSBvZiB3aGljaCBhcmUgb3B0aW9uYWwuCiAgKiBUaGVpciBjcmVhdGlvbiBkZXBlbmRzIG9uIHRoZSBjaGlwIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgZGV0ZXJtaW5lZCBkdXJpbmcKICAqIG1vZHVsZSBsb2FkLiAqLwpAQCAtMTkwMiw2ICsxOTExLDkgQEAKIAlpZiAoZGF0YS0+dHlwZSAhPSBzY2g1MDI3KSB7CiAJCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmZG1lMTczN19taXNjX2dyb3VwKTsKIAl9CisJaWYgKGRhdGEtPnR5cGUgPT0gZG1lMTczNykgeworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmRtZTE3MzdfdmlkX2dyb3VwKTsKKwl9CiAKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmRtZTE3MzdfZ3JvdXApOwogCkBAIC0xOTMzLDYgKzE5NDUsMTMgQEAKIAkJZ290byBleGl0X3JlbW92ZTsKIAl9CiAKKwkvKiBDcmVhdGUgVklELXJlbGF0ZWQgc3lzZnMgYXR0cmlidXRlcyAqLworCWlmICgoZGF0YS0+dHlwZSA9PSBkbWUxNzM3KSAmJgorCSAgICAoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosCisJCQkJICAgICAgJmRtZTE3MzdfdmlkX2dyb3VwKSkpIHsKKwkJZ290byBleGl0X3JlbW92ZTsKKwl9CisKIAkvKiBDcmVhdGUgZmFuIHN5c2ZzIGF0dHJpYnV0ZXMgKi8KIAlmb3IgKGl4ID0gMDsgaXggPCBBUlJBWV9TSVpFKGRtZTE3MzdfZmFuX2dyb3VwKTsgaXgrKykgewogCQlpZiAoZGF0YS0+aGFzX2ZhbiAmICgxIDw8IGl4KSkgewpAQCAtMjEyNyw3ICsyMTQ2LDcgQEAKIAlkYXRhLT5wd21fYWN6WzJdID0gNDsJLyogcHdtMyAtPiB6b25lMyAqLwogCiAJLyogU2V0IFZSTSAqLwotCWlmIChkYXRhLT50eXBlICE9IHNjaDUwMjcpIHsKKwlpZiAoZGF0YS0+dHlwZSA9PSBkbWUxNzM3KSB7CiAJCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZnNjaGVyLmMgYi9kcml2ZXJzL2h3bW9uL2ZzY2hlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmM3MGU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaHdtb24vZnNjaGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODAgKzAsMCBAQAotLyoKLSAqIGZzY2hlci5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKLSAqIG1vbml0b3JpbmcKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBSZWluaGFyZCBOaXNzbCA8cm5pc3NsQGdteC5kZT4KLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0vKiAKLSAqICBmdWppdHN1IHNpZW1lbnMgaGVybWVzIGNoaXAsIAotICogIG1vZHVsZSBiYXNlZCBvbiBmc2Nwb3MuYyAKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAgSGVybWFubiBKdW5nIDxoZWpAb2RuLmRlPgotICogIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+Ci0gKiAgYW5kIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0KLS8qCi0gKiBBZGRyZXNzZXMgdG8gc2NhbgotICovCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NzMsIEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qCi0gKiBJbnNtb2QgcGFyYW1ldGVycwotICovCi0KLUkyQ19DTElFTlRfSU5TTU9EXzEoZnNjaGVyKTsKLQotLyoKLSAqIFRoZSBGU0NIRVIgcmVnaXN0ZXJzCi0gKi8KLQotLyogY2hpcCBpZGVudGlmaWNhdGlvbiAqLwotI2RlZmluZSBGU0NIRVJfUkVHX0lERU5UXzAJCTB4MDAKLSNkZWZpbmUgRlNDSEVSX1JFR19JREVOVF8xCQkweDAxCi0jZGVmaW5lIEZTQ0hFUl9SRUdfSURFTlRfMgkJMHgwMgotI2RlZmluZSBGU0NIRVJfUkVHX1JFVklTSU9OCQkweDAzCi0KLS8qIGdsb2JhbCBjb250cm9sIGFuZCBzdGF0dXMgKi8KLSNkZWZpbmUgRlNDSEVSX1JFR19FVkVOVF9TVEFURQkJMHgwNAotI2RlZmluZSBGU0NIRVJfUkVHX0NPTlRST0wJCTB4MDUKLQotLyogd2F0Y2hkb2cgKi8KLSNkZWZpbmUgRlNDSEVSX1JFR19XRE9HX1BSRVNFVAkJMHgyOAotI2RlZmluZSBGU0NIRVJfUkVHX1dET0dfU1RBVEUJCTB4MjMKLSNkZWZpbmUgRlNDSEVSX1JFR19XRE9HX0NPTlRST0wJCTB4MjEKLQotLyogZmFuIDAgKi8KLSNkZWZpbmUgRlNDSEVSX1JFR19GQU4wX01JTgkJMHg1NQotI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjBfQUNUCQkweDBlCi0jZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMF9TVEFURQkJMHgwZAotI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjBfUklQUExFCQkweDBmCi0KLS8qIGZhbiAxICovCi0jZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMV9NSU4JCTB4NjUKLSNkZWZpbmUgRlNDSEVSX1JFR19GQU4xX0FDVAkJMHg2YgotI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjFfU1RBVEUJCTB4NjIKLSNkZWZpbmUgRlNDSEVSX1JFR19GQU4xX1JJUFBMRQkJMHg2ZgotCi0vKiBmYW4gMiAqLwotI2RlZmluZSBGU0NIRVJfUkVHX0ZBTjJfTUlOCQkweGI1Ci0jZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMl9BQ1QJCTB4YmIKLSNkZWZpbmUgRlNDSEVSX1JFR19GQU4yX1NUQVRFCQkweGIyCi0jZGVmaW5lIEZTQ0hFUl9SRUdfRkFOMl9SSVBQTEUJCTB4YmYKLQotLyogdm9sdGFnZSBzdXBlcnZpc2lvbiAqLwotI2RlZmluZSBGU0NIRVJfUkVHX1ZPTFRfMTIJCTB4NDUKLSNkZWZpbmUgRlNDSEVSX1JFR19WT0xUXzUJCTB4NDIKLSNkZWZpbmUgRlNDSEVSX1JFR19WT0xUX0JBVFQJCTB4NDgKLQotLyogdGVtcGVyYXR1cmUgMCAqLwotI2RlZmluZSBGU0NIRVJfUkVHX1RFTVAwX0FDVAkJMHg2NAotI2RlZmluZSBGU0NIRVJfUkVHX1RFTVAwX1NUQVRFCQkweDcxCi0KLS8qIHRlbXBlcmF0dXJlIDEgKi8KLSNkZWZpbmUgRlNDSEVSX1JFR19URU1QMV9BQ1QJCTB4MzIKLSNkZWZpbmUgRlNDSEVSX1JFR19URU1QMV9TVEFURQkJMHg4MQotCi0vKiB0ZW1wZXJhdHVyZSAyICovCi0jZGVmaW5lIEZTQ0hFUl9SRUdfVEVNUDJfQUNUCQkweDM1Ci0jZGVmaW5lIEZTQ0hFUl9SRUdfVEVNUDJfU1RBVEUJCTB4OTEKLQotLyoKLSAqIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbgotICovCi0KLXN0YXRpYyBpbnQgZnNjaGVyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwotc3RhdGljIGludCBmc2NoZXJfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBraW5kLAotCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50IGZzY2hlcl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7Ci1zdGF0aWMgc3RydWN0IGZzY2hlcl9kYXRhICpmc2NoZXJfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgZnNjaGVyX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotCi1zdGF0aWMgaW50IGZzY2hlcl9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7Ci1zdGF0aWMgaW50IGZzY2hlcl93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKTsKLQotLyoKLSAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCi0gKi8KLSAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBmc2NoZXJfaWRbXSA9IHsKLQl7ICJmc2NoZXIiLCBmc2NoZXIgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBmc2NoZXJfZHJpdmVyID0gewotCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiZnNjaGVyIiwKLQl9LAotCS5wcm9iZQkJPSBmc2NoZXJfcHJvYmUsCi0JLnJlbW92ZQkJPSBmc2NoZXJfcmVtb3ZlLAotCS5pZF90YWJsZQk9IGZzY2hlcl9pZCwKLQkuZGV0ZWN0CQk9IGZzY2hlcl9kZXRlY3QsCi0JLmFkZHJlc3NfZGF0YQk9ICZhZGRyX2RhdGEsCi19OwotCi0vKgotICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKLSAqLwotCi1zdHJ1Y3QgZnNjaGVyX2RhdGEgewotCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKLQlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7Ci0JY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwotCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCi0KLQkvKiByZWdpc3RlciB2YWx1ZXMgKi8KLQl1OCByZXZpc2lvbjsJCS8qIHJldmlzaW9uIG9mIGNoaXAgKi8KLQl1OCBnbG9iYWxfZXZlbnQ7CS8qIGdsb2JhbCBldmVudCBzdGF0dXMgKi8KLQl1OCBnbG9iYWxfY29udHJvbDsJLyogZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQl1OCB3YXRjaGRvZ1szXTsJCS8qIHdhdGNoZG9nICovCi0JdTggdm9sdFszXTsJCS8qIDEyLCA1LCBiYXR0ZXJ5IHZvbHRhZ2UgKi8gCi0JdTggdGVtcF9hY3RbM107CQkvKiB0ZW1wZXJhdHVyZSAqLwotCXU4IHRlbXBfc3RhdHVzWzNdOwkvKiBzdGF0dXMgb2Ygc2Vuc29yICovCi0JdTggZmFuX2FjdFszXTsJCS8qIGZhbnMgcmV2b2x1dGlvbnMgcGVyIHNlY29uZCAqLwotCXU4IGZhbl9zdGF0dXNbM107CS8qIGZhbiBzdGF0dXMgKi8KLQl1OCBmYW5fbWluWzNdOwkJLyogZmFuIG1pbiB2YWx1ZSBmb3IgcnBzICovCi0JdTggZmFuX3JpcHBsZVszXTsJLyogZGl2aWRlciBmb3IgcnBzICovCi19OwotCi0vKgotICogU3lzZnMgc3R1ZmYKLSAqLwotCi0jZGVmaW5lIHN5c2ZzX3Ioa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI2tpbmQjI3N1YiAoc3RydWN0IGZzY2hlcl9kYXRhICosIGNoYXIgKiwgaW50KTsgXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI2tpbmQjI29mZnNldCMjc3ViIChzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICopOyBcCi1zdGF0aWMgc3NpemVfdCBzaG93XyMja2luZCMjb2Zmc2V0IyNzdWIgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhID0gZnNjaGVyX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzaG93XyMja2luZCMjc3ViKGRhdGEsIGJ1ZiwgKG9mZnNldCkpOyBcCi19Ci0KLSNkZWZpbmUgc3lzZnNfdyhraW5kLCBzdWIsIG9mZnNldCwgcmVnKSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfIyNraW5kIyNzdWIgKHN0cnVjdCBpMmNfY2xpZW50ICosIHN0cnVjdCBmc2NoZXJfZGF0YSAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgaW50LCBpbnQpOyBcCi1zdGF0aWMgc3NpemVfdCBzZXRfIyNraW5kIyNvZmZzZXQjI3N1YiAoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqLCBzaXplX3QpOyBcCi1zdGF0aWMgc3NpemVfdCBzZXRfIyNraW5kIyNvZmZzZXQjI3N1YiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotCXJldHVybiBzZXRfIyNraW5kIyNzdWIoY2xpZW50LCBkYXRhLCBidWYsIGNvdW50LCAob2Zmc2V0KSwgcmVnKTsgXAotfQotCi0jZGVmaW5lIHN5c2ZzX3J3X24oa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAotc3lzZnNfcihraW5kLCBzdWIsIG9mZnNldCwgcmVnKSBcCi1zeXNmc193KGtpbmQsIHN1Yiwgb2Zmc2V0LCByZWcpIFwKLXN0YXRpYyBERVZJQ0VfQVRUUihraW5kIyNvZmZzZXQjI3N1YiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfIyNraW5kIyNvZmZzZXQjI3N1Yiwgc2V0XyMja2luZCMjb2Zmc2V0IyNzdWIpOwotCi0jZGVmaW5lIHN5c2ZzX3J3KGtpbmQsIHN1YiwgcmVnKSBcCi1zeXNmc19yKGtpbmQsIHN1YiwgMCwgcmVnKSBcCi1zeXNmc193KGtpbmQsIHN1YiwgMCwgcmVnKSBcCi1zdGF0aWMgREVWSUNFX0FUVFIoa2luZCMjc3ViLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd18jI2tpbmQjIzAjI3N1Yiwgc2V0XyMja2luZCMjMCMjc3ViKTsKLQotI2RlZmluZSBzeXNmc19yb19uKGtpbmQsIHN1Yiwgb2Zmc2V0LCByZWcpIFwKLXN5c2ZzX3Ioa2luZCwgc3ViLCBvZmZzZXQsIHJlZykgXAotc3RhdGljIERFVklDRV9BVFRSKGtpbmQjI29mZnNldCMjc3ViLCBTX0lSVUdPLCBzaG93XyMja2luZCMjb2Zmc2V0IyNzdWIsIE5VTEwpOwotCi0jZGVmaW5lIHN5c2ZzX3JvKGtpbmQsIHN1YiwgcmVnKSBcCi1zeXNmc19yKGtpbmQsIHN1YiwgMCwgcmVnKSBcCi1zdGF0aWMgREVWSUNFX0FUVFIoa2luZCwgU19JUlVHTywgc2hvd18jI2tpbmQjIzAjI3N1YiwgTlVMTCk7Ci0KLSNkZWZpbmUgc3lzZnNfZmFuKG9mZnNldCwgcmVnX3N0YXR1cywgcmVnX21pbiwgcmVnX3JpcHBsZSwgcmVnX2FjdCkgXAotc3lzZnNfcndfbihwd20sICAgICAgICAsIG9mZnNldCwgcmVnX21pbikgXAotc3lzZnNfcndfbihmYW4sIF9zdGF0dXMsIG9mZnNldCwgcmVnX3N0YXR1cykgXAotc3lzZnNfcndfbihmYW4sIF9kaXYgICAsIG9mZnNldCwgcmVnX3JpcHBsZSkgXAotc3lzZnNfcm9fbihmYW4sIF9pbnB1dCAsIG9mZnNldCwgcmVnX2FjdCkKLQotI2RlZmluZSBzeXNmc190ZW1wKG9mZnNldCwgcmVnX3N0YXR1cywgcmVnX2FjdCkgXAotc3lzZnNfcndfbih0ZW1wLCBfc3RhdHVzLCBvZmZzZXQsIHJlZ19zdGF0dXMpIFwKLXN5c2ZzX3JvX24odGVtcCwgX2lucHV0ICwgb2Zmc2V0LCByZWdfYWN0KQotICAgIAotI2RlZmluZSBzeXNmc19pbihvZmZzZXQsIHJlZ19hY3QpIFwKLXN5c2ZzX3JvX24oaW4sIF9pbnB1dCwgb2Zmc2V0LCByZWdfYWN0KQotCi0jZGVmaW5lIHN5c2ZzX3JldmlzaW9uKHJlZ19yZXZpc2lvbikgXAotc3lzZnNfcm8ocmV2aXNpb24sICwgcmVnX3JldmlzaW9uKQotCi0jZGVmaW5lIHN5c2ZzX2FsYXJtcyhyZWdfZXZlbnRzKSBcCi1zeXNmc19ybyhhbGFybXMsICwgcmVnX2V2ZW50cykKLQotI2RlZmluZSBzeXNmc19jb250cm9sKHJlZ19jb250cm9sKSBcCi1zeXNmc19ydyhjb250cm9sLCAsIHJlZ19jb250cm9sKQotCi0jZGVmaW5lIHN5c2ZzX3dhdGNoZG9nKHJlZ19jb250cm9sLCByZWdfc3RhdHVzLCByZWdfcHJlc2V0KSBcCi1zeXNmc19ydyh3YXRjaGRvZywgX2NvbnRyb2wsIHJlZ19jb250cm9sKSBcCi1zeXNmc19ydyh3YXRjaGRvZywgX3N0YXR1cyAsIHJlZ19zdGF0dXMpIFwKLXN5c2ZzX3J3KHdhdGNoZG9nLCBfcHJlc2V0ICwgcmVnX3ByZXNldCkKLQotc3lzZnNfZmFuKDEsIEZTQ0hFUl9SRUdfRkFOMF9TVEFURSwgRlNDSEVSX1JFR19GQU4wX01JTiwKLQkgICAgIEZTQ0hFUl9SRUdfRkFOMF9SSVBQTEUsIEZTQ0hFUl9SRUdfRkFOMF9BQ1QpCi1zeXNmc19mYW4oMiwgRlNDSEVSX1JFR19GQU4xX1NUQVRFLCBGU0NIRVJfUkVHX0ZBTjFfTUlOLAotCSAgICAgRlNDSEVSX1JFR19GQU4xX1JJUFBMRSwgRlNDSEVSX1JFR19GQU4xX0FDVCkKLXN5c2ZzX2ZhbigzLCBGU0NIRVJfUkVHX0ZBTjJfU1RBVEUsIEZTQ0hFUl9SRUdfRkFOMl9NSU4sCi0JICAgICBGU0NIRVJfUkVHX0ZBTjJfUklQUExFLCBGU0NIRVJfUkVHX0ZBTjJfQUNUKQotCi1zeXNmc190ZW1wKDEsIEZTQ0hFUl9SRUdfVEVNUDBfU1RBVEUsIEZTQ0hFUl9SRUdfVEVNUDBfQUNUKQotc3lzZnNfdGVtcCgyLCBGU0NIRVJfUkVHX1RFTVAxX1NUQVRFLCBGU0NIRVJfUkVHX1RFTVAxX0FDVCkKLXN5c2ZzX3RlbXAoMywgRlNDSEVSX1JFR19URU1QMl9TVEFURSwgRlNDSEVSX1JFR19URU1QMl9BQ1QpCi0KLXN5c2ZzX2luKDAsIEZTQ0hFUl9SRUdfVk9MVF8xMikKLXN5c2ZzX2luKDEsIEZTQ0hFUl9SRUdfVk9MVF81KQotc3lzZnNfaW4oMiwgRlNDSEVSX1JFR19WT0xUX0JBVFQpCi0KLXN5c2ZzX3JldmlzaW9uKEZTQ0hFUl9SRUdfUkVWSVNJT04pCi1zeXNmc19hbGFybXMoRlNDSEVSX1JFR19FVkVOVFMpCi1zeXNmc19jb250cm9sKEZTQ0hFUl9SRUdfQ09OVFJPTCkKLXN5c2ZzX3dhdGNoZG9nKEZTQ0hFUl9SRUdfV0RPR19DT05UUk9MLCBGU0NIRVJfUkVHX1dET0dfU1RBVEUsIEZTQ0hFUl9SRUdfV0RPR19QUkVTRVQpCi0gIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZzY2hlcl9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX3JldmlzaW9uLmF0dHIsCi0JJmRldl9hdHRyX2FsYXJtcy5hdHRyLAotCSZkZXZfYXR0cl9jb250cm9sLmF0dHIsCi0KLQkmZGV2X2F0dHJfd2F0Y2hkb2dfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX3dhdGNoZG9nX2NvbnRyb2wuYXR0ciwKLQkmZGV2X2F0dHJfd2F0Y2hkb2dfcHJlc2V0LmF0dHIsCi0KLQkmZGV2X2F0dHJfaW4wX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luMV9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjJfaW5wdXQuYXR0ciwKLQotCSZkZXZfYXR0cl9mYW4xX3N0YXR1cy5hdHRyLAotCSZkZXZfYXR0cl9mYW4xX2Rpdi5hdHRyLAotCSZkZXZfYXR0cl9mYW4xX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX3B3bTEuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9kaXYuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9wd20yLmF0dHIsCi0JJmRldl9hdHRyX2ZhbjNfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX2ZhbjNfZGl2LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjNfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfcHdtMy5hdHRyLAotCi0JJmRldl9hdHRyX3RlbXAxX3N0YXR1cy5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMV9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDNfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX2lucHV0LmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZnNjaGVyX2dyb3VwID0gewotCS5hdHRycyA9IGZzY2hlcl9hdHRyaWJ1dGVzLAotfTsKLQotLyoKLSAqIFJlYWwgY29kZQotICovCi0KLS8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLwotc3RhdGljIGludCBmc2NoZXJfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LCBpbnQga2luZCwKLQkJCSBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gbmV3X2NsaWVudC0+YWRhcHRlcjsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBEbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbiB1bmxlc3MgZm9yY2Ugb3IgZm9yY2VfZnNjaGVyIHBhcmFtZXRlciAqLwotCWlmIChraW5kIDwgMCkgewotCQlpZiAoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkgICAgIEZTQ0hFUl9SRUdfSURFTlRfMCkgIT0gMHg0OCkJLyogJ0gnICovCi0JCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCSAgICAgRlNDSEVSX1JFR19JREVOVF8xKSAhPSAweDQ1KQkvKiAnRScgKi8KLQkJIHx8IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJICAgICBGU0NIRVJfUkVHX0lERU5UXzIpICE9IDB4NTIpKQkvKiAnUicgKi8KLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQotCXN0cmxjcHkoaW5mby0+dHlwZSwgImZzY2hlciIsIEkyQ19OQU1FX1NJWkUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZnNjaGVyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LAotCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YTsKLQlpbnQgZXJyOwotCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmc2NoZXJfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOwotCWRhdGEtPnZhbGlkID0gMDsKLQltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlmc2NoZXJfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7Ci0KLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmZzY2hlcl9ncm91cCkpKQotCQlnb3RvIGV4aXRfZnJlZTsKLQotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwotCX0KLQotCXJldHVybiAwOwotCi1leGl0X3JlbW92ZV9maWxlczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmZnNjaGVyX2dyb3VwKTsKLWV4aXRfZnJlZToKLQlrZnJlZShkYXRhKTsKLWV4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBmc2NoZXJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmZzY2hlcl9ncm91cCk7Ci0KLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmc2NoZXJfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCi17Ci0JZGV2X2RiZygmY2xpZW50LT5kZXYsICJyZWFkIHJlZyAweCUwMnhcbiIsIHJlZyk7Ci0KLQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKLX0KLQotc3RhdGljIGludCBmc2NoZXJfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKLXsKLQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIndyaXRlIHJlZyAweCUwMngsIHZhbCAweCUwMnhcbiIsCi0JCXJlZywgdmFsdWUpOwotCi0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKLX0KLQotLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBGU0MgSGVybWVzLiAqLwotc3RhdGljIHZvaWQgZnNjaGVyX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQkvKiBSZWFkIHJldmlzaW9uIGZyb20gY2hpcCAqLwotCWRhdGEtPnJldmlzaW9uID0gIGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19SRVZJU0lPTik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmZzY2hlcl91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgMiAqIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKLQotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGZzY2hlciB1cGRhdGVcbiIpOwotCi0JCWRhdGEtPnRlbXBfYWN0WzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAwX0FDVCk7Ci0JCWRhdGEtPnRlbXBfYWN0WzFdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAxX0FDVCk7Ci0JCWRhdGEtPnRlbXBfYWN0WzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAyX0FDVCk7Ci0JCWRhdGEtPnRlbXBfc3RhdHVzWzBdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1RFTVAwX1NUQVRFKTsKLQkJZGF0YS0+dGVtcF9zdGF0dXNbMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfVEVNUDFfU1RBVEUpOwotCQlkYXRhLT50ZW1wX3N0YXR1c1syXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19URU1QMl9TVEFURSk7Ci0KLQkJZGF0YS0+dm9sdFswXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19WT0xUXzEyKTsKLQkJZGF0YS0+dm9sdFsxXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19WT0xUXzUpOwotCQlkYXRhLT52b2x0WzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1ZPTFRfQkFUVCk7Ci0KLQkJZGF0YS0+ZmFuX2FjdFswXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4wX0FDVCk7Ci0JCWRhdGEtPmZhbl9hY3RbMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMV9BQ1QpOwotCQlkYXRhLT5mYW5fYWN0WzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjJfQUNUKTsKLQkJZGF0YS0+ZmFuX3N0YXR1c1swXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4wX1NUQVRFKTsKLQkJZGF0YS0+ZmFuX3N0YXR1c1sxXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4xX1NUQVRFKTsKLQkJZGF0YS0+ZmFuX3N0YXR1c1syXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4yX1NUQVRFKTsKLQkJZGF0YS0+ZmFuX21pblswXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4wX01JTik7Ci0JCWRhdGEtPmZhbl9taW5bMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMV9NSU4pOwotCQlkYXRhLT5mYW5fbWluWzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjJfTUlOKTsKLQkJZGF0YS0+ZmFuX3JpcHBsZVswXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19GQU4wX1JJUFBMRSk7Ci0JCWRhdGEtPmZhbl9yaXBwbGVbMV0gPSBmc2NoZXJfcmVhZF92YWx1ZShjbGllbnQsIEZTQ0hFUl9SRUdfRkFOMV9SSVBQTEUpOwotCQlkYXRhLT5mYW5fcmlwcGxlWzJdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX0ZBTjJfUklQUExFKTsKLQotCQlkYXRhLT53YXRjaGRvZ1swXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19XRE9HX1BSRVNFVCk7Ci0JCWRhdGEtPndhdGNoZG9nWzFdID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NIRVJfUkVHX1dET0dfU1RBVEUpOwotCQlkYXRhLT53YXRjaGRvZ1syXSA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19XRE9HX0NPTlRST0wpOwotCi0JCWRhdGEtPmdsb2JhbF9ldmVudCA9IGZzY2hlcl9yZWFkX3ZhbHVlKGNsaWVudCwgRlNDSEVSX1JFR19FVkVOVF9TVEFURSk7Ci0JCWRhdGEtPmdsb2JhbF9jb250cm9sID0gZnNjaGVyX3JlYWRfdmFsdWUoY2xpZW50LAotCQkJCQkJCUZTQ0hFUl9SRUdfQ09OVFJPTCk7Ci0KLQkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKLQkJZGF0YS0+dmFsaWQgPSAxOyAgICAgICAgICAgICAgICAgCi0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotCi0KLSNkZWZpbmUgRkFOX0lOREVYX0ZST01fTlVNKG5yKQkoKG5yKSAtIDEpCi0KLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCi17Ci0JLyogYml0cyAwLi4xLCAzLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDA0ICovICAKLQl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4MDQ7Ci0JCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPmZhbl9zdGF0dXNbRkFOX0lOREVYX0ZST01fTlVNKG5yKV0gJj0gfnY7Ci0JZnNjaGVyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCB2KTsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX3N0YXR1cyhzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQotewotCS8qIGJpdHMgMC4uMSwgMy4uNyByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHgwNCAqLyAgCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmZhbl9zdGF0dXNbRkFOX0lOREVYX0ZST01fTlVNKG5yKV0gJiAweDA0KTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsCi0JCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQotewotCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPmZhbl9taW5bRkFOX0lOREVYX0ZST01fTlVNKG5yKV0gPSB2ID4gMHhmZiA/IDB4ZmYgOiB2OwotCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+ZmFuX21pbltGQU5fSU5ERVhfRlJPTV9OVU0obnIpXSk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3B3bShzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5mYW5fbWluW0ZBTl9JTkRFWF9GUk9NX05VTShucildKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAotCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKLXsKLQkvKiBzdXBwb3J0ZWQgdmFsdWVzOiAyLCA0LCA4ICovCi0JdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7Ci0KLQlzd2l0Y2ggKHYpIHsKLQljYXNlIDI6IHYgPSAxOyBicmVhazsKLQljYXNlIDQ6IHYgPSAyOyBicmVhazsKLQljYXNlIDg6IHYgPSAzOyBicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhbl9kaXYgdmFsdWUgJWxkIG5vdCAiCi0JCQkgInN1cHBvcnRlZC4gQ2hvb3NlIG9uZSBvZiAyLCA0IG9yIDghXG4iLCB2KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovCi0JZGF0YS0+ZmFuX3JpcHBsZVtGQU5fSU5ERVhfRlJPTV9OVU0obnIpXSAmPSB+MHgwMzsKLQlkYXRhLT5mYW5fcmlwcGxlW0ZBTl9JTkRFWF9GUk9NX05VTShucildIHw9IHY7Ci0KLQlmc2NoZXJfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPmZhbl9yaXBwbGVbRkFOX0lOREVYX0ZST01fTlVNKG5yKV0pOwotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCi17Ci0JLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovICAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgMSA8PCAoZGF0YS0+ZmFuX3JpcHBsZVtGQU5fSU5ERVhfRlJPTV9OVU0obnIpXSAmIDB4MDMpKTsKLX0KLQotI2RlZmluZSBSUE1fRlJPTV9SRUcodmFsKQkodmFsKjYwKQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9pbnB1dCAoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgUlBNX0ZST01fUkVHKGRhdGEtPmZhbl9hY3RbRkFOX0lOREVYX0ZST01fTlVNKG5yKV0pKTsKLX0KLQotCi0KLSNkZWZpbmUgVEVNUF9JTkRFWF9GUk9NX05VTShucikJCSgobnIpIC0gMSkKLQotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwKLQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQotewotCS8qIGJpdHMgMi4uNyByZXNlcnZlZCwgMCByZWFkIG9ubHkgPT4gbWFzayB3aXRoIDB4MDIgKi8gIAotCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICYgMHgwMjsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT50ZW1wX3N0YXR1c1tURU1QX0lOREVYX0ZST01fTlVNKG5yKV0gJj0gfnY7Ci0JZnNjaGVyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCB2KTsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9zdGF0dXMoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKLXsKLQkvKiBiaXRzIDIuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDMgKi8KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+dGVtcF9zdGF0dXNbVEVNUF9JTkRFWF9GUk9NX05VTShucildICYgMHgwMyk7Ci19Ci0KLSNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSgoKHZhbCkgLSAxMjgpICogMTAwMCkKLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2lucHV0KHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9hY3RbVEVNUF9JTkRFWF9GUk9NX05VTShucildKSk7Ci19Ci0KLS8qCi0gKiBUaGUgZmluYWwgY29udmVyc2lvbiBpcyBzcGVjaWZpZWQgaW4gc2Vuc29ycy5jb25mLCBhcyBpdCBkZXBlbmRzIG9uCi0gKiBtYWluYm9hcmQgc3BlY2lmaWMgdmFsdWVzLiBXZSBleHBvcnQgdGhlIHJlZ2lzdGVycyBjb250ZW50cyBhcwotICogcHNldWRvLWh1bmRyZWR0aHMtb2YtVm9sdHMgKHJhbmdlIDBWIC0gMi41NVYpLiBOb3QgdGhhdCBpdCBtYWtlcyBtdWNoCi0gKiBzZW5zZSBwZXIgc2UsIGJ1dCBpdCBtaW5pbWl6ZXMgdGhlIGNvbnZlcnNpb25zIGNvdW50IGFuZCBrZWVwcyB0aGUKLSAqIHZhbHVlcyB3aXRoaW4gYSB1c3VhbCByYW5nZS4KLSAqLwotI2RlZmluZSBWT0xUX0ZST01fUkVHKHZhbCkJKCh2YWwpICogMTApCi0KLXN0YXRpYyBzc2l6ZV90IHNob3dfaW5faW5wdXQoc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgVk9MVF9GUk9NX1JFRyhkYXRhLT52b2x0W25yXSkpOwotfQotCi0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19yZXZpc2lvbihzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5yZXZpc2lvbik7Ci19Ci0KLQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQotewotCS8qIGJpdHMgMiwgNS4uNiByZXNlcnZlZCA9PiBtYXNrIHdpdGggMHg5YiAqLwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5nbG9iYWxfZXZlbnQgJiAweDliKTsKLX0KLQotCi0KLXN0YXRpYyBzc2l6ZV90IHNldF9jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwKLQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCi17Ci0JLyogYml0cyAxLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAxICovICAKLQl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4MDE7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+Z2xvYmFsX2NvbnRyb2wgPSB2OwotCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgdik7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2NvbnRyb2woc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKLXsKLQkvKiBiaXRzIDEuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDEgKi8KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+Z2xvYmFsX2NvbnRyb2wgJiAweDAxKTsKLX0KLQotCi0KLXN0YXRpYyBzc2l6ZV90IHNldF93YXRjaGRvZ19jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdAotCQkJCSAgICBmc2NoZXJfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkJICAgIGludCBuciwgaW50IHJlZykKLXsKLQkvKiBiaXRzIDAuLjMgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4ZjAgKi8gIAotCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICYgMHhmMDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT53YXRjaGRvZ1syXSAmPSB+MHhmMDsKLQlkYXRhLT53YXRjaGRvZ1syXSB8PSB2OwotCWZzY2hlcl93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+d2F0Y2hkb2dbMl0pOwotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd193YXRjaGRvZ19jb250cm9sKHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCi17Ci0JLyogYml0cyAwLi4zIHJlc2VydmVkLCBiaXQgNSB3cml0ZSBvbmx5ID0+IG1hc2sgd2l0aCAweGQwICovCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPndhdGNoZG9nWzJdICYgMHhkMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF93YXRjaGRvZ19zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAotCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCi17Ci0JLyogYml0cyAwLCAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAyICovICAKLQl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4MDI7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+d2F0Y2hkb2dbMV0gJj0gfnY7Ci0JZnNjaGVyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCB2KTsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfd2F0Y2hkb2dfc3RhdHVzKHN0cnVjdCBmc2NoZXJfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCi17Ci0JLyogYml0cyAwLCAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAyICovCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPndhdGNoZG9nWzFdICYgMHgwMik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF93YXRjaGRvZ19wcmVzZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY2hlcl9kYXRhICpkYXRhLAotCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIsIGludCByZWcpCi17Ci0JdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweGZmOwotCQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT53YXRjaGRvZ1swXSA9IHY7Ci0JZnNjaGVyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT53YXRjaGRvZ1swXSk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3dhdGNoZG9nX3ByZXNldChzdHJ1Y3QgZnNjaGVyX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG5yKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT53YXRjaGRvZ1swXSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfZnNjaGVyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmZzY2hlcl9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19mc2NoZXJfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZmc2NoZXJfZHJpdmVyKTsKLX0KLQotTU9EVUxFX0FVVEhPUigiUmVpbmhhcmQgTmlzc2wgPHJuaXNzbEBnbXguZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkZTQyBIZXJtZXMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLW1vZHVsZV9pbml0KHNlbnNvcnNfZnNjaGVyX2luaXQpOwotbW9kdWxlX2V4aXQoc2Vuc29yc19mc2NoZXJfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jIGIvZHJpdmVycy9od21vbi9mc2NobWQuYwppbmRleCBlYTk1NWVkLi5kYTFiMWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vZnNjaG1kLmMKQEAgLTgxOSw3ICs4MTksNyBAQAogc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKIHsKLQlzaXplX3QgcmV0OworCWludCByZXQ7CiAJc3RydWN0IGZzY2htZF9kYXRhICpkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGNvdW50KSB7CkBAIC05MTUsNyArOTE1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3YXRjaGRvZ19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2F0Y2hkb2dfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkubGxzZWVrID0gbm9fbGxzZWVrLAogCS5vcGVuID0gd2F0Y2hkb2dfb3BlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZnNjcG9zLmMgYi9kcml2ZXJzL2h3bW9uL2ZzY3Bvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTdiY2Y1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaHdtb24vZnNjcG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLyoKLQlmc2Nwb3MuYyAtIEtlcm5lbCBtb2R1bGUgZm9yIGhhcmR3YXJlIG1vbml0b3Jpbmcgd2l0aCBGU0MgUG9zZWlkb24gY2hpcHMKLQlDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgU3RlZmFuIE90dCA8c3RlZmFuQGRlc2lyZS5jaD4KLQotCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0JaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLQl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLQlUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLQlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQotCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLQlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0JRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qLwotCi0vKgotCWZ1aml0c3Ugc2llbWVucyBwb3NlaWRvbiBjaGlwLAotCW1vZHVsZSBiYXNlZCBvbiB0aGUgb2xkIGZzY3BvcyBtb2R1bGUgYnkgSGVybWFubiBKdW5nIDxoZWpAb2RuLmRlPiBhbmQKLQl0aGUgZnNjaGVyIG1vZHVsZSBieSBSZWluaGFyZCBOaXNzbCA8cm5pc3NsQGdteC5kZT4KLQotCW9yaWdpbmFsIG1vZHVsZSBiYXNlZCBvbiBsbTgwLmMKLQlDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgotCWFuZCBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+Ci0KLQlUaGFua3MgdG8gSmVhbiBEZWx2YXJlIGZvciByZXZpZXdpbmcgbXkgY29kZSBhbmQgc3VnZ2VzdGluZyBhIGxvdCBvZgotCWltcHJvdmVtZW50cy4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLQotLyoKLSAqIEFkZHJlc3NlcyB0byBzY2FuCi0gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NzMsIEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qCi0gKiBJbnNtb2QgcGFyYW1ldGVycwotICovCi1JMkNfQ0xJRU5UX0lOU01PRF8xKGZzY3Bvcyk7Ci0KLS8qCi0gKiBUaGUgRlNDUE9TIHJlZ2lzdGVycwotICovCi0KLS8qIGNoaXAgaWRlbnRpZmljYXRpb24gKi8KLSNkZWZpbmUgRlNDUE9TX1JFR19JREVOVF8wCQkweDAwCi0jZGVmaW5lIEZTQ1BPU19SRUdfSURFTlRfMQkJMHgwMQotI2RlZmluZSBGU0NQT1NfUkVHX0lERU5UXzIJCTB4MDIKLSNkZWZpbmUgRlNDUE9TX1JFR19SRVZJU0lPTgkJMHgwMwotCi0vKiBnbG9iYWwgY29udHJvbCBhbmQgc3RhdHVzICovCi0jZGVmaW5lIEZTQ1BPU19SRUdfRVZFTlRfU1RBVEUJCTB4MDQKLSNkZWZpbmUgRlNDUE9TX1JFR19DT05UUk9MCQkweDA1Ci0KLS8qIHdhdGNoZG9nICovCi0jZGVmaW5lIEZTQ1BPU19SRUdfV0RPR19QUkVTRVQJCTB4MjgKLSNkZWZpbmUgRlNDUE9TX1JFR19XRE9HX1NUQVRFCQkweDIzCi0jZGVmaW5lIEZTQ1BPU19SRUdfV0RPR19DT05UUk9MCQkweDIxCi0KLS8qIHZvbHRhZ2VzICovCi0jZGVmaW5lIEZTQ1BPU19SRUdfVk9MVF8xMgkJMHg0NQotI2RlZmluZSBGU0NQT1NfUkVHX1ZPTFRfNQkJMHg0MgotI2RlZmluZSBGU0NQT1NfUkVHX1ZPTFRfQkFUVAkJMHg0OAotCi0vKiBmYW5zIC0gdGhlIGNoaXAgZG9lcyBub3Qgc3VwcG9ydCBtaW5pbXVtIHNwZWVkIGZvciBmYW4yICovCi1zdGF0aWMgdTggRlNDUE9TX1JFR19QV01bXSA9IHsgMHg1NSwgMHg2NSB9Owotc3RhdGljIHU4IEZTQ1BPU19SRUdfRkFOX0FDVFtdID0geyAweDBlLCAweDZiLCAweGFiIH07Ci1zdGF0aWMgdTggRlNDUE9TX1JFR19GQU5fU1RBVEVbXSA9IHsgMHgwZCwgMHg2MiwgMHhhMiB9Owotc3RhdGljIHU4IEZTQ1BPU19SRUdfRkFOX1JJUFBMRVtdID0geyAweDBmLCAweDZmLCAweGFmIH07Ci0KLS8qIHRlbXBlcmF0dXJlcyAqLwotc3RhdGljIHU4IEZTQ1BPU19SRUdfVEVNUF9BQ1RbXSA9IHsgMHg2NCwgMHgzMiwgMHgzNSB9Owotc3RhdGljIHU4IEZTQ1BPU19SRUdfVEVNUF9TVEFURVtdID0geyAweDcxLCAweDgxLCAweDkxIH07Ci0KLS8qCi0gKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KLSAqLwotc3RhdGljIGludCBmc2Nwb3NfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCk7Ci1zdGF0aWMgaW50IGZzY3Bvc19kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGtpbmQsCi0JCQkgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgZnNjcG9zX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLQotc3RhdGljIGludCBmc2Nwb3NfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpOwotc3RhdGljIGludCBmc2Nwb3Nfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSk7Ci1zdGF0aWMgc3RydWN0IGZzY3Bvc19kYXRhICpmc2Nwb3NfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgZnNjcG9zX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotCi1zdGF0aWMgdm9pZCByZXNldF9mYW5fYWxhcm0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG5yKTsKLQotLyoKLSAqIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBmc2Nwb3NfaWRbXSA9IHsKLQl7ICJmc2Nwb3MiLCBmc2Nwb3MgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBmc2Nwb3NfZHJpdmVyID0gewotCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiZnNjcG9zIiwKLQl9LAotCS5wcm9iZQkJPSBmc2Nwb3NfcHJvYmUsCi0JLnJlbW92ZQkJPSBmc2Nwb3NfcmVtb3ZlLAotCS5pZF90YWJsZQk9IGZzY3Bvc19pZCwKLQkuZGV0ZWN0CQk9IGZzY3Bvc19kZXRlY3QsCi0JLmFkZHJlc3NfZGF0YQk9ICZhZGRyX2RhdGEsCi19OwotCi0vKgotICogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikKLSAqLwotc3RydWN0IGZzY3Bvc19kYXRhIHsKLQlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7Ci0Jc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwotCWNoYXIgdmFsaWQ7IAkJLyogMCB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwotCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCi0KLQkvKiByZWdpc3RlciB2YWx1ZXMgKi8KLQl1OCByZXZpc2lvbjsJCS8qIHJldmlzaW9uIG9mIGNoaXAgKi8KLQl1OCBnbG9iYWxfZXZlbnQ7CS8qIGdsb2JhbCBldmVudCBzdGF0dXMgKi8KLQl1OCBnbG9iYWxfY29udHJvbDsJLyogZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQl1OCB3ZG9nX2NvbnRyb2w7CS8qIHdhdGNoZG9nIGNvbnRyb2wgKi8KLQl1OCB3ZG9nX3N0YXRlOwkJLyogd2F0Y2hkb2cgc3RhdHVzICovCi0JdTggd2RvZ19wcmVzZXQ7CQkvKiB3YXRjaGRvZyBwcmVzZXQgKi8KLQl1OCB2b2x0WzNdOwkJLyogMTIsIDUsIGJhdHRlcnkgY3VycmVudCAqLwotCXU4IHRlbXBfYWN0WzNdOwkJLyogdGVtcGVyYXR1cmUgKi8KLQl1OCB0ZW1wX3N0YXR1c1szXTsJLyogc3RhdHVzIG9mIHNlbnNvciAqLwotCXU4IGZhbl9hY3RbM107CQkvKiBmYW5zIHJldm9sdXRpb25zIHBlciBzZWNvbmQgKi8KLQl1OCBmYW5fc3RhdHVzWzNdOwkvKiBmYW4gc3RhdHVzICovCi0JdTggcHdtWzJdOwkJLyogZmFuIG1pbiB2YWx1ZSBmb3IgcnBzICovCi0JdTggZmFuX3JpcHBsZVszXTsJLyogZGl2aWRlciBmb3IgcnBzICovCi19OwotCi0vKiBUZW1wZXJhdHVyZSAqLwotI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkJKCgodmFsKSAtIDEyOCkgKiAxMDAwKQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfaW5wdXQoc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2FjdFtuciAtIDFdKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9zdGF0dXMoc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKLXsKLQkvKiBiaXRzIDIuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDMgKi8KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+dGVtcF9zdGF0dXNbbnIgLSAxXSAmIDB4MDMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfcmVzZXQoc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfcmVzZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY3Bvc19kYXRhCi0JCQkqZGF0YSwgY29uc3QgY2hhciAqYnVmLAlzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKLXsKLQl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQlpZiAodiAhPSAxKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidGVtcF9yZXNldCB2YWx1ZSAlbGQgbm90IHN1cHBvcnRlZC4gIgotCQkJCQkiVXNlIDEgdG8gcmVzZXQgdGhlIGFsYXJtIVxuIiwgdik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIllvdSB1c2VkIHRoZSB0ZW1wX3Jlc2V0IGZlYXR1cmUgd2hpY2ggaGFzIG5vdCAiCi0JCQkJImJlZW4gcHJvcGxlcmx5IHRlc3RlZC4gUGxlYXNlIHJlcG9ydCB5b3VyICIKLQkJCQkiZXhwZXJpZW5jZSB0byB0aGUgbW9kdWxlIGF1dGhvci5cbiIpOwotCi0JLyogU3VwcG9ydGVkIHZhbHVlOiAyIChjbGVhcnMgdGhlIHN0YXR1cykgKi8KLQlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCBGU0NQT1NfUkVHX1RFTVBfU1RBVEVbbnIgLSAxXSwgMik7Ci0JcmV0dXJuIGNvdW50OwotfQotCi0vKiBGYW5zICovCi0jZGVmaW5lIFJQTV9GUk9NX1JFRyh2YWwpCSgodmFsKSAqIDYwKQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9zdGF0dXMoc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBucikKLXsKLQkvKiBiaXRzIDAuLjEsIDMuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDQgKi8KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+ZmFuX3N0YXR1c1tuciAtIDFdICYgMHgwNCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2lucHV0KHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFJQTV9GUk9NX1JFRyhkYXRhLT5mYW5fYWN0W25yIC0gMV0pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fcmlwcGxlKHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCi17Ci0JLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmZhbl9yaXBwbGVbbnIgLSAxXSAmIDB4MDMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfZmFuX3JpcHBsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEKLQkJCSpkYXRhLCBjb25zdCBjaGFyICpidWYsCXNpemVfdCBjb3VudCwgaW50IG5yLCBpbnQgcmVnKQotewotCS8qIHN1cHBvcnRlZCB2YWx1ZXM6IDIsIDQsIDggKi8KLQl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQotCXN3aXRjaCAodikgewotCQljYXNlIDI6IHYgPSAxOyBicmVhazsKLQkJY2FzZSA0OiB2ID0gMjsgYnJlYWs7Ci0JCWNhc2UgODogdiA9IDM7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFuX3JpcHBsZSB2YWx1ZSAlbGQgbm90IHN1cHBvcnRlZC4gIgotCQkJCQkiTXVzdCBiZSBvbmUgb2YgMiwgNCBvciA4IVxuIiwgdik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JLyogYml0cyAyLi43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDAzICovCi0JZGF0YS0+ZmFuX3JpcHBsZVtuciAtIDFdICY9IH4weDAzOwotCWRhdGEtPmZhbl9yaXBwbGVbbnIgLSAxXSB8PSB2OwotCQotCWZzY3Bvc193cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+ZmFuX3JpcHBsZVtuciAtIDFdKTsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbnIpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnB3bVtuciAtIDFdKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuciwgaW50IHJlZykKLXsKLQl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQotCS8qIFJhbmdlOiAwLi4yNTUgKi8KLQlpZiAodiA8IDApIHYgPSAwOwotCWlmICh2ID4gMjU1KSB2ID0gMjU1OwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPnB3bVtuciAtIDFdID0gdjsKLQlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnB3bVtuciAtIDFdKTsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2V0X2Zhbl9hbGFybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgbnIpCi17Ci0JZnNjcG9zX3dyaXRlX3ZhbHVlKGNsaWVudCwgRlNDUE9TX1JFR19GQU5fU1RBVEVbbnJdLCA0KTsKLX0KLQotLyogVm9sdHMgKi8KLSNkZWZpbmUgVk9MVF9GUk9NX1JFRyh2YWwsIG11bHQpCSgodmFsKSAqIChtdWx0KSAvIDI1NSkKLQotc3RhdGljIHNzaXplX3Qgc2hvd192b2x0XzEyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBmc2Nwb3NfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBWT0xUX0ZST01fUkVHKGRhdGEtPnZvbHRbMF0sIDE0MjAwKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdm9sdF81KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBmc2Nwb3NfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBWT0xUX0ZST01fUkVHKGRhdGEtPnZvbHRbMV0sIDY2MDApKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd192b2x0X2JhdHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSA9IGZzY3Bvc191cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIFZPTFRfRlJPTV9SRUcoZGF0YS0+dm9sdFsyXSwgMzMwMCkpOwotfQotCi0vKiBXYXRjaGRvZyAqLwotc3RhdGljIHNzaXplX3Qgc2hvd193ZG9nX2NvbnRyb2woc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhLCBjaGFyICpidWYpCi17Ci0JLyogYml0cyAwLi4zIHJlc2VydmVkLCBiaXQgNiB3cml0ZSBvbmx5ID0+IG1hc2sgd2l0aCAweGIwICovCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPndkb2dfY29udHJvbCAmIDB4YjApOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfd2RvZ19jb250cm9sKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBmc2Nwb3NfZGF0YQotCQkJCSpkYXRhLCBjb25zdCBjaGFyICpidWYsCXNpemVfdCBjb3VudCwgaW50IHJlZykKLXsKLQkvKiBiaXRzIDAuLjMgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4ZjAgKi8KLQl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4ZjA7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+d2RvZ19jb250cm9sICY9IH4weGYwOwotCWRhdGEtPndkb2dfY29udHJvbCB8PSB2OwotCWZzY3Bvc193cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+d2RvZ19jb250cm9sKTsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfd2RvZ19zdGF0ZShzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZikKLXsKLQkvKiBiaXRzIDAsIDIuLjcgcmVzZXJ2ZWQgPT4gbWFzayB3aXRoIDB4MDIgKi8KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+d2RvZ19zdGF0ZSAmIDB4MDIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfd2RvZ19zdGF0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZnNjcG9zX2RhdGEKLQkJCQkqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCByZWcpCi17Ci0JdW5zaWduZWQgbG9uZyB2ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiAweDAyOwotCi0JLyogVmFsaWQgdmFsdWVzOiAyIChjbGVhcikgKi8KLQlpZiAodiAhPSAyKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid2RvZ19zdGF0ZSB2YWx1ZSAlbGQgbm90IHN1cHBvcnRlZC4gIgotCQkJCQkiTXVzdCBiZSAyIHRvIGNsZWFyIHRoZSBzdGF0ZSFcbiIsIHYpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+d2RvZ19zdGF0ZSAmPSB+djsKLQlmc2Nwb3Nfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHYpOwotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd193ZG9nX3ByZXNldChzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+d2RvZ19wcmVzZXQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfd2RvZ19wcmVzZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGZzY3Bvc19kYXRhCi0JCQkJKmRhdGEsIGNvbnN0IGNoYXIgKmJ1ZiwJc2l6ZV90IGNvdW50LCBpbnQgcmVnKQotewotCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICYgMHhmZjsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT53ZG9nX3ByZXNldCA9IHY7Ci0JZnNjcG9zX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT53ZG9nX3ByZXNldCk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi0vKiBFdmVudCAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19ldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0JLyogYml0cyA1Li43IHJlc2VydmVkID0+IG1hc2sgd2l0aCAweDFmICovCi0Jc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gZnNjcG9zX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+Z2xvYmFsX2V2ZW50ICYgMHg5Yik7Ci19Ci0KLS8qCi0gKiBTeXNmcyBzdHVmZgotICovCi0jZGVmaW5lIGNyZWF0ZV9nZXR0ZXIoa2luZCwgc3ViKSBcCi0Jc3RhdGljIHNzaXplX3Qgc3lzZnNfc2hvd18jI2tpbmQjI3N1YihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLQl7IFwKLQkJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gZnNjcG9zX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCQlyZXR1cm4gc2hvd18jI2tpbmQjI3N1YihkYXRhLCBidWYpOyBcCi0JfQotCi0jZGVmaW5lIGNyZWF0ZV9nZXR0ZXJfbihraW5kLCBvZmZzZXQsIHN1YikgXAotCXN0YXRpYyBzc2l6ZV90IHN5c2ZzX3Nob3dfIyNraW5kIyNvZmZzZXQjI3N1YihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyXAotCQkJCQkJCQkgCSpidWYpIFwKLQl7IFwKLQkJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gZnNjcG9zX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCQlyZXR1cm4gc2hvd18jI2tpbmQjI3N1YihkYXRhLCBidWYsIG9mZnNldCk7IFwKLQl9Ci0KLSNkZWZpbmUgY3JlYXRlX3NldHRlcihraW5kLCBzdWIsIHJlZykgXAotCXN0YXRpYyBzc2l6ZV90IHN5c2ZzX3NldF8jI2tpbmQjI3N1YiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciBcCi0JCQkJCQkJKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi0JeyBcCi0JCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQkJc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLQkJcmV0dXJuIHNldF8jI2tpbmQjI3N1YihjbGllbnQsIGRhdGEsIGJ1ZiwgY291bnQsIHJlZyk7IFwKLQl9Ci0KLSNkZWZpbmUgY3JlYXRlX3NldHRlcl9uKGtpbmQsIG9mZnNldCwgc3ViLCByZWcpIFwKLQlzdGF0aWMgc3NpemVfdCBzeXNmc19zZXRfIyNraW5kIyNvZmZzZXQjI3N1YiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAotCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAotCXsgXAotCQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0JCXN0cnVjdCBmc2Nwb3NfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi0JCXJldHVybiBzZXRfIyNraW5kIyNzdWIoY2xpZW50LCBkYXRhLCBidWYsIGNvdW50LCBvZmZzZXQsIHJlZyk7XAotCX0KLQotI2RlZmluZSBjcmVhdGVfc3lzZnNfZGV2aWNlX3JvKGtpbmQsIHN1Yiwgb2Zmc2V0KSBcCi0Jc3RhdGljIERFVklDRV9BVFRSKGtpbmQjI29mZnNldCMjc3ViLCBTX0lSVUdPLCBcCi0JCQkJCXN5c2ZzX3Nob3dfIyNraW5kIyNvZmZzZXQjI3N1YiwgTlVMTCk7Ci0KLSNkZWZpbmUgY3JlYXRlX3N5c2ZzX2RldmljZV9ydyhraW5kLCBzdWIsIG9mZnNldCkgXAotCXN0YXRpYyBERVZJQ0VfQVRUUihraW5kIyNvZmZzZXQjI3N1YiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKLQkJc3lzZnNfc2hvd18jI2tpbmQjI29mZnNldCMjc3ViLCBzeXNmc19zZXRfIyNraW5kIyNvZmZzZXQjI3N1Yik7Ci0KLSNkZWZpbmUgc3lzZnNfcm9fbihraW5kLCBzdWIsIG9mZnNldCkgXAotCWNyZWF0ZV9nZXR0ZXJfbihraW5kLCBvZmZzZXQsIHN1Yik7IFwKLQljcmVhdGVfc3lzZnNfZGV2aWNlX3JvKGtpbmQsIHN1Yiwgb2Zmc2V0KTsKLQotI2RlZmluZSBzeXNmc19yd19uKGtpbmQsIHN1Yiwgb2Zmc2V0LCByZWcpIFwKLQljcmVhdGVfZ2V0dGVyX24oa2luZCwgb2Zmc2V0LCBzdWIpOyBcCi0JY3JlYXRlX3NldHRlcl9uKGtpbmQsIG9mZnNldCwgc3ViLCByZWcpOyBcCi0JY3JlYXRlX3N5c2ZzX2RldmljZV9ydyhraW5kLCBzdWIsIG9mZnNldCk7Ci0KLSNkZWZpbmUgc3lzZnNfcncoa2luZCwgc3ViLCByZWcpIFwKLQljcmVhdGVfZ2V0dGVyKGtpbmQsIHN1Yik7IFwKLQljcmVhdGVfc2V0dGVyKGtpbmQsIHN1YiwgcmVnKTsgXAotCWNyZWF0ZV9zeXNmc19kZXZpY2Vfcncoa2luZCwgc3ViLCk7Ci0KLSNkZWZpbmUgc3lzZnNfZmFuX3dpdGhfbWluKG9mZnNldCwgcmVnX3N0YXR1cywgcmVnX3JpcHBsZSwgcmVnX21pbikgXAotCXN5c2ZzX2ZhbihvZmZzZXQsIHJlZ19zdGF0dXMsIHJlZ19yaXBwbGUpOyBcCi0Jc3lzZnNfcndfbihwd20sLCBvZmZzZXQsIHJlZ19taW4pOwotCi0jZGVmaW5lIHN5c2ZzX2ZhbihvZmZzZXQsIHJlZ19zdGF0dXMsIHJlZ19yaXBwbGUpIFwKLQlzeXNmc19yb19uKGZhbiwgX2lucHV0LCBvZmZzZXQpOyBcCi0Jc3lzZnNfcm9fbihmYW4sIF9zdGF0dXMsIG9mZnNldCk7IFwKLQlzeXNmc19yd19uKGZhbiwgX3JpcHBsZSwgb2Zmc2V0LCByZWdfcmlwcGxlKTsKLQotI2RlZmluZSBzeXNmc190ZW1wKG9mZnNldCwgcmVnX3N0YXR1cykgXAotCXN5c2ZzX3JvX24odGVtcCwgX2lucHV0LCBvZmZzZXQpOyBcCi0Jc3lzZnNfcm9fbih0ZW1wLCBfc3RhdHVzLCBvZmZzZXQpOyBcCi0Jc3lzZnNfcndfbih0ZW1wLCBfcmVzZXQsIG9mZnNldCwgcmVnX3N0YXR1cyk7Ci0KLSNkZWZpbmUgc3lzZnNfd2F0Y2hkb2cocmVnX3dkb2dfcHJlc2V0LCByZWdfd2RvZ19zdGF0ZSwgcmVnX3dkb2dfY29udHJvbCkgXAotCXN5c2ZzX3J3KHdkb2csIF9jb250cm9sLCByZWdfd2RvZ19jb250cm9sKTsgXAotCXN5c2ZzX3J3KHdkb2csIF9wcmVzZXQsIHJlZ193ZG9nX3ByZXNldCk7IFwKLQlzeXNmc19ydyh3ZG9nLCBfc3RhdGUsIHJlZ193ZG9nX3N0YXRlKTsKLQotc3lzZnNfZmFuX3dpdGhfbWluKDEsIEZTQ1BPU19SRUdfRkFOX1NUQVRFWzBdLCBGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbMF0sCi0JCQkJCQkJRlNDUE9TX1JFR19QV01bMF0pOwotc3lzZnNfZmFuX3dpdGhfbWluKDIsIEZTQ1BPU19SRUdfRkFOX1NUQVRFWzFdLCBGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbMV0sCi0JCQkJCQkJRlNDUE9TX1JFR19QV01bMV0pOwotc3lzZnNfZmFuKDMsIEZTQ1BPU19SRUdfRkFOX1NUQVRFWzJdLCBGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbMl0pOwotCi1zeXNmc190ZW1wKDEsIEZTQ1BPU19SRUdfVEVNUF9TVEFURVswXSk7Ci1zeXNmc190ZW1wKDIsIEZTQ1BPU19SRUdfVEVNUF9TVEFURVsxXSk7Ci1zeXNmc190ZW1wKDMsIEZTQ1BPU19SRUdfVEVNUF9TVEFURVsyXSk7Ci0KLXN5c2ZzX3dhdGNoZG9nKEZTQ1BPU19SRUdfV0RPR19QUkVTRVQsIEZTQ1BPU19SRUdfV0RPR19TVEFURSwKLQkJCQkJCUZTQ1BPU19SRUdfV0RPR19DT05UUk9MKTsKLQotc3RhdGljIERFVklDRV9BVFRSKGV2ZW50LCBTX0lSVUdPLCBzaG93X2V2ZW50LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdF8xMiwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRfNSwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRfYmF0dCwgTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmc2Nwb3NfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9ldmVudC5hdHRyLAotCSZkZXZfYXR0cl9pbjBfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW4xX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luMl9pbnB1dC5hdHRyLAotCi0JJmRldl9hdHRyX3dkb2dfY29udHJvbC5hdHRyLAotCSZkZXZfYXR0cl93ZG9nX3ByZXNldC5hdHRyLAotCSZkZXZfYXR0cl93ZG9nX3N0YXRlLmF0dHIsCi0KLQkmZGV2X2F0dHJfdGVtcDFfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDFfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAxX3Jlc2V0LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAyX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAyX3N0YXR1cy5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9yZXNldC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDNfcmVzZXQuYXR0ciwKLQotCSZkZXZfYXR0cl9mYW4xX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjFfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX2ZhbjFfcmlwcGxlLmF0dHIsCi0JJmRldl9hdHRyX3B3bTEuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9mYW4yX3N0YXR1cy5hdHRyLAotCSZkZXZfYXR0cl9mYW4yX3JpcHBsZS5hdHRyLAotCSZkZXZfYXR0cl9wd20yLmF0dHIsCi0JJmRldl9hdHRyX2ZhbjNfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfZmFuM19zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfZmFuM19yaXBwbGUuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmc2Nwb3NfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gZnNjcG9zX2F0dHJpYnV0ZXMsCi19OwotCi0vKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgZnNjcG9zX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwgaW50IGtpbmQsCi0JCQkgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQotewotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogRG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24gdW5sZXNzIGZvcmNlIG9yIGZvcmNlX2ZzY3BvcyBwYXJhbWV0ZXIgKi8KLQlpZiAoa2luZCA8IDApIHsKLQkJaWYgKChmc2Nwb3NfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBGU0NQT1NfUkVHX0lERU5UXzApCi0JCQkhPSAweDUwKSAvKiAnUCcgKi8KLQkJfHwgKGZzY3Bvc19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEZTQ1BPU19SRUdfSURFTlRfMSkKLQkJCSE9IDB4NDUpIC8qICdFJyAqLwotCQl8fCAoZnNjcG9zX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgRlNDUE9TX1JFR19JREVOVF8yKQotCQkJIT0gMHg0NykpLyogJ0cnICovCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlzdHJsY3B5KGluZm8tPnR5cGUsICJmc2Nwb3MiLCBJMkNfTkFNRV9TSVpFKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZzY3Bvc19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKLQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGE7Ci0JaW50IGVycjsKLQotCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZnNjcG9zX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKLQlkYXRhLT52YWxpZCA9IDA7Ci0JbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JLyogSW5pemlhbGl6ZSB0aGUgZnNjcG9zIGNoaXAgKi8KLQlmc2Nwb3NfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7Ci0KLQkvKiBBbm5vdW5jZSB0aGF0IHRoZSBjaGlwIHdhcyBmb3VuZCAqLwotCWRldl9pbmZvKCZuZXdfY2xpZW50LT5kZXYsICJGb3VuZCBmc2Nwb3MgY2hpcCwgcmV2ICV1XG4iLCBkYXRhLT5yZXZpc2lvbik7Ci0KLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmZzY3Bvc19ncm91cCkpKQotCQlnb3RvIGV4aXRfZnJlZTsKLQotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwotCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwotCX0KLQotCXJldHVybiAwOwotCi1leGl0X3JlbW92ZV9maWxlczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmZnNjcG9zX2dyb3VwKTsKLWV4aXRfZnJlZToKLQlrZnJlZShkYXRhKTsKLWV4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBmc2Nwb3NfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGZzY3Bvc19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmZzY3Bvc19ncm91cCk7Ci0KLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmc2Nwb3NfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCi17Ci0JZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZWFkIHJlZyAweCUwMnhcbiIsIHJlZyk7Ci0JcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgZnNjcG9zX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCi17Ci0JZGV2X2RiZygmY2xpZW50LT5kZXYsICJXcml0ZSByZWcgMHglMDJ4LCB2YWwgMHglMDJ4XG4iLCByZWcsIHZhbHVlKTsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwotfQotCi0vKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IEZTQ1BPUyBjaGlwICovCi1zdGF0aWMgdm9pZCBmc2Nwb3NfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCS8qIHJlYWQgcmV2aXNpb24gZnJvbSBjaGlwICovCi0JZGF0YS0+cmV2aXNpb24gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsIEZTQ1BPU19SRUdfUkVWSVNJT04pOwotfQotCi1zdGF0aWMgc3RydWN0IGZzY3Bvc19kYXRhICpmc2Nwb3NfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgZnNjcG9zX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIDIgKiBIWikgfHwgIWRhdGEtPnZhbGlkKSB7Ci0JCWludCBpOwotCi0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZnNjcG9zIHVwZGF0ZVxuIik7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJZGF0YS0+dGVtcF9hY3RbaV0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCi0JCQkJCQlGU0NQT1NfUkVHX1RFTVBfQUNUW2ldKTsKLQkJCWRhdGEtPnRlbXBfc3RhdHVzW2ldID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LAotCQkJCQkJRlNDUE9TX1JFR19URU1QX1NUQVRFW2ldKTsKLQkJCWRhdGEtPmZhbl9hY3RbaV0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCi0JCQkJCQlGU0NQT1NfUkVHX0ZBTl9BQ1RbaV0pOwotCQkJZGF0YS0+ZmFuX3N0YXR1c1tpXSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKLQkJCQkJCUZTQ1BPU19SRUdfRkFOX1NUQVRFW2ldKTsKLQkJCWRhdGEtPmZhbl9yaXBwbGVbaV0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCi0JCQkJCQlGU0NQT1NfUkVHX0ZBTl9SSVBQTEVbaV0pOwotCQkJaWYgKGkgPCAyKSB7Ci0JCQkJLyogZmFuMl9taW4gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY2hpcCAqLwotCQkJCWRhdGEtPnB3bVtpXSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKLQkJCQkJCQlGU0NQT1NfUkVHX1BXTVtpXSk7Ci0JCQl9Ci0JCQkvKiByZXNldCBmYW4gc3RhdHVzIGlmIHNwZWVkIGlzIGJhY2sgdG8gPiAwICovCi0JCQlpZiAoZGF0YS0+ZmFuX3N0YXR1c1tpXSAhPSAwICYmIGRhdGEtPmZhbl9hY3RbaV0gPiAwKSB7Ci0JCQkJcmVzZXRfZmFuX2FsYXJtKGNsaWVudCwgaSk7Ci0JCQl9Ci0JCX0KLQotCQlkYXRhLT52b2x0WzBdID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NQT1NfUkVHX1ZPTFRfMTIpOwotCQlkYXRhLT52b2x0WzFdID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LCBGU0NQT1NfUkVHX1ZPTFRfNSk7Ci0JCWRhdGEtPnZvbHRbMl0gPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsIEZTQ1BPU19SRUdfVk9MVF9CQVRUKTsKLQotCQlkYXRhLT53ZG9nX3ByZXNldCA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKLQkJCQkJCQlGU0NQT1NfUkVHX1dET0dfUFJFU0VUKTsKLQkJZGF0YS0+d2RvZ19zdGF0ZSA9IGZzY3Bvc19yZWFkX3ZhbHVlKGNsaWVudCwKLQkJCQkJCQlGU0NQT1NfUkVHX1dET0dfU1RBVEUpOwotCQlkYXRhLT53ZG9nX2NvbnRyb2wgPSBmc2Nwb3NfcmVhZF92YWx1ZShjbGllbnQsCi0JCQkJCQlGU0NQT1NfUkVHX1dET0dfQ09OVFJPTCk7Ci0KLQkJZGF0YS0+Z2xvYmFsX2V2ZW50ID0gZnNjcG9zX3JlYWRfdmFsdWUoY2xpZW50LAotCQkJCQkJRlNDUE9TX1JFR19FVkVOVF9TVEFURSk7Ci0KLQkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKLQkJZGF0YS0+dmFsaWQgPSAxOwotCX0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc21fZnNjcG9zX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmZzY3Bvc19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc21fZnNjcG9zX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmZnNjcG9zX2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIlN0ZWZhbiBPdHQgPHN0ZWZhbkBkZXNpcmUuY2g+IGJhc2VkIG9uIHdvcmsgZnJvbSBIZXJtYW5uIEp1bmcgIgotCQkJCSI8aGVqQG9kbi5kZT4sIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4iCi0JCQkJIiBhbmQgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJmdWppdHN1IHNpZW1lbnMgcG9zZWlkb24gY2hpcCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotbW9kdWxlX2luaXQoc21fZnNjcG9zX2luaXQpOwotbW9kdWxlX2V4aXQoc21fZnNjcG9zX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9ocF9hY2NlbC5jIGIvZHJpdmVycy9od21vbi9ocF9hY2NlbC5jCmluZGV4IDY2Nzk4NTQuLmJlNDc1ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHBfYWNjZWwuYworKysgYi9kcml2ZXJzL2h3bW9uL2hwX2FjY2VsLmMKQEAgLTE5NywxMSArMTk3LDEzIEBACiAJQVhJU19ETUlfTUFUQ0goIkhQMjEzMyIsICJIUCAyMTMzIiwgeHlfcm90YXRlZF9sZWZ0KSwKIAlBWElTX0RNSV9NQVRDSCgiSFAyMTQwIiwgIkhQIDIxNDAiLCB4eV9zd2FwX2ludmVydGVkKSwKIAlBWElTX0RNSV9NQVRDSCgiTkM2NTN4IiwgIkhQIENvbXBhcSA2NTMiLCB4eV9yb3RhdGVkX2xlZnRfdXNkKSwKLQlBWElTX0RNSV9NQVRDSCgiTkM2NzN4IiwgIkhQIENvbXBhcSA2NzMiLCB4eV9yb3RhdGVkX2xlZnRfdXNkKSwKKwlBWElTX0RNSV9NQVRDSCgiTkM2NzMwYiIsICJIUCBDb21wYXEgNjczMGIiLCB4eV9yb3RhdGVkX2xlZnRfdXNkKSwKKwlBWElTX0RNSV9NQVRDSCgiTkM2NzMwcyIsICJIUCBDb21wYXEgNjczMHMiLCB4eV9zd2FwKSwKIAlBWElTX0RNSV9NQVRDSCgiTkM2NTF4eCIsICJIUCBDb21wYXEgNjUxIiwgeHlfcm90YXRlZF9yaWdodCksCiAJQVhJU19ETUlfTUFUQ0goIk5DNjcxMHgiLCAiSFAgQ29tcGFxIDY3MTAiLCB4eV9zd2FwX3l6X2ludmVydGVkKSwKIAlBWElTX0RNSV9NQVRDSCgiTkM2NzE1eCIsICJIUCBDb21wYXEgNjcxNSIsIHlfaW52ZXJ0ZWQpLAogCUFYSVNfRE1JX01BVENIKCJOQzY5M3h4IiwgIkhQIEVsaXRlQm9vayA2OTMiLCB4eV9yb3RhdGVkX3JpZ2h0KSwKKwlBWElTX0RNSV9NQVRDSCgiTkM2OTN4eCIsICJIUCBFbGl0ZUJvb2sgODUzIiwgeHlfc3dhcCksCiAJLyogSW50ZWwtYmFzZWQgSFAgUGF2aWxpb24gZHY1ICovCiAJQVhJU19ETUlfTUFUQ0gyKCJIUERWNV9JIiwKIAkJCVBST0RVQ1RfTkFNRSwgIkhQIFBhdmlsaW9uIGR2NSIsCkBAIC0yMTQsNiArMjE2LDcgQEAKIAkJCXlfaW52ZXJ0ZWQpLAogCUFYSVNfRE1JX01BVENIKCJEVjciLCAiSFAgUGF2aWxpb24gZHY3IiwgeF9pbnZlcnRlZCksCiAJQVhJU19ETUlfTUFUQ0goIkhQODcxMCIsICJIUCBDb21wYXEgODcxMCIsIHlfaW52ZXJ0ZWQpLAorCUFYSVNfRE1JX01BVENIKCJIRFgxOCIsICJIUCBIRFggMTgiLCB4X2ludmVydGVkKSwKIAl7IE5VTEwsIH0KIC8qIExhcHRvcCBtb2RlbHMgd2l0aG91dCBheGlzIGluZm8gKHlldCk6CiAgKiAiTkM2OTEwIiAiSFAgQ29tcGFxIDY5MTAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2l0ODcuYyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCmluZGV4IGZmZWIyYTEuLmEzNzQ5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCisrKyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCkBAIC0xMDI4LDEyICsxMDI4LDExIEBACiAJCWNoaXBfdHlwZSwgKmFkZHJlc3MsIHNpb19kYXRhLT5yZXZpc2lvbik7CiAKIAkvKiBSZWFkIEdQSU8gY29uZmlnIGFuZCBWSUQgdmFsdWUgZnJvbSBMRE4gNyAoR1BJTykgKi8KLQlpZiAoY2hpcF90eXBlICE9IElUODcwNUZfREVWSUQpIHsKKwlpZiAoc2lvX2RhdGEtPnR5cGUgIT0gaXQ4NykgewogCQlpbnQgcmVnOwogCiAJCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwotCQlpZiAoKGNoaXBfdHlwZSA9PSBpdDg3MTgpIHx8Ci0JCSAgICAoY2hpcF90eXBlID09IGl0ODcyMCkpCisJCWlmIChzaW9fZGF0YS0+dHlwZSA9PSBpdDg3MTggfHwgc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzIwKQogCQkJc2lvX2RhdGEtPnZpZF92YWx1ZSA9IHN1cGVyaW9faW5iKElUODdfU0lPX1ZJRF9SRUcpOwogCiAJCXJlZyA9IHN1cGVyaW9faW5iKElUODdfU0lPX1BJTlgyX1JFRyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZF9zcGkuYyBiL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkX3NwaS5jCmluZGV4IGVjZDczOTUuLjgyYjE2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkX3NwaS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkX3NwaS5jCkBAIC04Myw3ICs4Myw4IEBACiAJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwogCWxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKCk7CiAJbGlzM2x2MDJkX3Bvd2Vyb2ZmKGxpczMpOwotCXJldHVybiAwOworCisJcmV0dXJuIGxpczNsdjAyZF9yZW1vdmVfZnMoJmxpczNfZGV2KTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGM0MjE1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzQyMTUuYwppbmRleCA5Mzg2ZTJhLi4wMGQ5NzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2x0YzQyMTUuYworKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyMTUuYwpAQCAtMjAsMTEgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qIEluc21vZCBwYXJhbWV0ZXJzICovCi1JMkNfQ0xJRU5UX0lOU01PRF8xKGx0YzQyMTUpOwotCiAvKiBIZXJlIGFyZSBuYW1lcyBvZiB0aGUgY2hpcCdzIHJlZ2lzdGVycyAoYS5rLmEuIGNvbW1hbmRzKSAqLwogZW51bSBsdGM0MjE1X2NtZCB7CiAJTFRDNDIxNV9DT05UUk9MCQkJPSAweDAwLCAvKiBydyAqLwpAQCAtMjQ2LDkgKzI0MSwxMyBAQAogc3RhdGljIGludCBsdGM0MjE1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKIAlzdHJ1Y3QgbHRjNDIxNV9kYXRhICpkYXRhOwogCWludCByZXQ7CiAKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAtRU5PREVWOworCiAJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0yNTksNyArMjU4LDcgQEAKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBMVEM0MjE1IGNoaXAgKi8KLQkvKiBUT0RPICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExUQzQyMTVfRkFVTFQsIDB4MDApOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KIAlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsdGM0MjE1X2dyb3VwKTsKQEAgLTI5NCw1NiArMjkzLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbHRjNDIxNV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgaW50IGtpbmQsCi0JCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGtpbmQgPCAwKSB7CQkvKiBwcm9iZWQgZGV0ZWN0aW9uIC0gY2hlY2sgdGhlIGNoaXAgdHlwZSAqLwotCQlzMzIgdjsJCS8qIDggYml0cyBmcm9tIHRoZSBjaGlwLCBvciAtRVJSTk8gKi8KLQotCQkvKgotCQkgKiBSZWdpc3RlciAweDAxIGJpdCBiNyBpcyByZXNlcnZlZCwgZXhwZWN0IDAKLQkJICogUmVnaXN0ZXIgMHgwMyBiaXQgYjYgYW5kIGI3IGFyZSByZXNlcnZlZCwgZXhwZWN0IDAKLQkJICovCi0JCXYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjE1X0FMRVJUKTsKLQkJaWYgKHYgPCAwIHx8ICh2ICYgKDEgPDwgNykpICE9IDApCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQl2ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTFRDNDIxNV9GQVVMVCk7Ci0JCWlmICh2IDwgMCB8fCAodiAmICgoMSA8PCA2KSB8ICgxIDw8IDcpKSkgIT0gMCkKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlzdHJsY3B5KGluZm8tPnR5cGUsICJsdGM0MjE1IiwgSTJDX05BTUVfU0laRSk7Ci0JZGV2X2luZm8oJmFkYXB0ZXItPmRldiwgImx0YzQyMTUgJXMgYXQgYWRkcmVzcyAweCUwMnhcbiIsCi0JCQlraW5kIDwgMCA/ICJwcm9iZWQiIDogImZvcmNlZCIsCi0JCQljbGllbnQtPmFkZHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjE1X2lkW10gPSB7Ci0JeyAibHRjNDIxNSIsIGx0YzQyMTUgfSwKKwl7ICJsdGM0MjE1IiwgMCB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGM0MjE1X2lkKTsKIAogLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzQyMTVfZHJpdmVyID0gewotCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAibHRjNDIxNSIsCiAJfSwKIAkucHJvYmUJCT0gbHRjNDIxNV9wcm9iZSwKIAkucmVtb3ZlCQk9IGx0YzQyMTVfcmVtb3ZlLAogCS5pZF90YWJsZQk9IGx0YzQyMTVfaWQsCi0JLmRldGVjdAkJPSBsdGM0MjE1X2RldGVjdCwKLQkuYWRkcmVzc19kYXRhCT0gJmFkZHJfZGF0YSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGx0YzQyMTVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwppbmRleCAwMzRiMmM1Li42NWMyMzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYworKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwpAQCAtMjIsMTUgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAKLS8qIFZhbGlkIGFkZHJlc3NlcyBhcmUgMHgyMCAtIDB4M2YKLSAqCi0gKiBGb3Igbm93LCB3ZSBkbyBub3QgcHJvYmUsIHNpbmNlIHNvbWUgb2YgdGhlc2UgYWRkcmVzc2VzCi0gKiBhcmUga25vd24gdG8gYmUgdW5mcmllbmRseSB0byBwcm9iaW5nICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9OwotCi0vKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotSTJDX0NMSUVOVF9JTlNNT0RfMShsdGM0MjQ1KTsKLQogLyogSGVyZSBhcmUgbmFtZXMgb2YgdGhlIGNoaXAncyByZWdpc3RlcnMgKGEuay5hLiBjb21tYW5kcykgKi8KIGVudW0gbHRjNDI0NV9jbWQgewogCUxUQzQyNDVfU1RBVFVTCQkJPSAweDAwLCAvKiByZWFkb25seSAqLwpAQCAtMzY5LDkgKzM2MCwxMyBAQAogc3RhdGljIGludCBsdGM0MjQ1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKIAlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhOwogCWludCByZXQ7CiAKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAtRU5PREVWOworCiAJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0zODIsNyArMzc3LDggQEAKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBMVEM0MjQ1IGNoaXAgKi8KLQkvKiBUT0RPICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExUQzQyNDVfRkFVTFQxLCAweDAwKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTFRDNDI0NV9GQVVMVDIsIDB4MDApOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KIAlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsdGM0MjQ1X2dyb3VwKTsKQEAgLTQxNywxMzYgKzQxMywyMCBAQAogCXJldHVybiAwOwogfQogCi0vKiBDaGVjayB0aGF0IHNvbWUgYml0cyBpbiBhIGNvbnRyb2wgcmVnaXN0ZXIgYXBwZWFyIGF0IGFsbCBwb3NzaWJsZQotICogbG9jYXRpb25zIHdpdGhvdXQgY2hhbmdpbmcgdmFsdWUKLSAqCi0gKiBAY2xpZW50OiB0aGUgaTJjIGNsaWVudCB0byB1c2UKLSAqIEByZWc6IHRoZSByZWdpc3RlciB0byByZWFkCi0gKiBAYml0czogdGhlIGJpdHMgdG8gY2hlY2sgKDB4ZmYgY2hlY2tzIGFsbCBiaXRzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIGNoZWNrcyBvbmx5IHRoZSBsYXN0IHR3byBiaXRzKQotICoKLSAqIHJldHVybiAtRVJSTk8gaWYgdGhlIHJlZ2lzdGVyIHJlYWQgZmFpbGVkCi0gKiByZXR1cm4gLUVOT0RFViBpZiB0aGUgcmVnaXN0ZXIgdmFsdWUgZG9lc24ndCBzdGF5IGNvbnN0YW50IGF0IGFsbAotICogcG9zc2libGUgYWRkcmVzc2VzCi0gKgotICogcmV0dXJuIDAgZm9yIHN1Y2Nlc3MKLSAqLwotc3RhdGljIGludCBsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggYml0cykKLXsKLQlpbnQgaTsKLQlzMzIgdiwgdm9mZjEsIHZvZmYyOwotCi0JLyogUmVhZCByZWdpc3RlciBhbmQgY2hlY2sgZm9yIGVycm9yICovCi0JdiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Ci0JaWYgKHYgPCAwKQotCQlyZXR1cm4gdjsKLQotCXYgJj0gYml0czsKLQotCWZvciAoaSA9IDB4MDA7IGkgPCAweGZmOyBpICs9IDB4MjApIHsKLQotCQl2b2ZmMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyArIGkpOwotCQlpZiAodm9mZjEgPCAwKQotCQkJcmV0dXJuIHZvZmYxOwotCi0JCXZvZmYyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnICsgaSArIDB4MDgpOwotCQlpZiAodm9mZjIgPCAwKQotCQkJcmV0dXJuIHZvZmYyOwotCi0JCXZvZmYxICY9IGJpdHM7Ci0JCXZvZmYyICY9IGJpdHM7Ci0KLQkJaWYgKHYgIT0gdm9mZjEgfHwgdiAhPSB2b2ZmMikKLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGx0YzQyNDVfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgIGludCBraW5kLAotCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChraW5kIDwgMCkgewkJLyogcHJvYmVkIGRldGVjdGlvbiAtIGNoZWNrIHRoZSBjaGlwIHR5cGUgKi8KLQkJczMyIHY7CQkvKiA4IGJpdHMgZnJvbSB0aGUgY2hpcCwgb3IgLUVSUk5PICovCi0KLQkJLyogQ2hpcCByZWdpc3RlcnMgMHgwMC0weDA3IGFyZSBjb250cm9sIHJlZ2lzdGVycwotCQkgKiBDaGlwIHJlZ2lzdGVycyAweDEwLTB4MWYgYXJlIGRhdGEgcmVnaXN0ZXJzCi0JCSAqCi0JCSAqIEFkZHJlc3MgYml0cyBiNy1iNSBhcmUgaWdub3JlZC4gVGhpcyBtYWtlcyB0aGUgY2hpcCAicmVwZWF0IgotCQkgKiBpbiBzdGVwcyBvZiAweDIwLiBBbnkgY29udHJvbCByZWdpc3RlcnMgc2hvdWxkIGFwcGVhciB3aXRoCi0JCSAqIHRoZSBzYW1lIHZhbHVlcyBhY3Jvc3MgYWxsIGR1cGxpY2F0ZWQgYWRkcmVzc2VzLgotCQkgKgotCQkgKiBSZWdpc3RlciAweDAyIGJpdCBiMiBpcyByZXNlcnZlZCwgZXhwZWN0IDAKLQkJICogUmVnaXN0ZXIgMHgwNyBiaXRzIGI3IHRvIGI0IGFyZSByZXNlcnZlZCwgZXhwZWN0IDAKLQkJICoKLQkJICogUmVnaXN0ZXJzIDB4MDEsIDB4MDIgYXJlIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBzaG91bGQgbm90Ci0JCSAqIGNoYW5nZSBvbiB0aGVpciBvd24uCi0JCSAqCi0JCSAqIFJlZ2lzdGVyIDB4MDYgYml0cyBiNiBhbmQgYjcgYXJlIGNvbnRyb2wgYml0cywgYW5kIHNob3VsZAotCQkgKiBub3QgY2hhbmdlIG9uIHRoZWlyIG93bi4KLQkJICoKLQkJICogUmVnaXN0ZXIgMHgwNyBiaXRzIGIzIHRvIGIwIGFyZSBjb250cm9sIGJpdHMsIGFuZCBzaG91bGQKLQkJICogbm90IGNoYW5nZSBvbiB0aGVpciBvd24uCi0JCSAqLwotCi0JCS8qIHJlYWQgcmVnaXN0ZXIgMHgwMiByZXNlcnZlZCBiaXQsIGV4cGVjdCAwICovCi0JCXYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0NPTlRST0wpOwotCQlpZiAodiA8IDAgfHwgKHYgJiAweDA0KSAhPSAwKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJLyogcmVhZCByZWdpc3RlciAweDA3IHJlc2VydmVkIGJpdHMsIGV4cGVjdCAwICovCi0JCXYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0FEQ0FEUik7Ci0JCWlmICh2IDwgMCB8fCAodiAmIDB4ZjApICE9IDApCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQkvKiBjaGVjayB0aGF0IHRoZSBhbGVydCByZWdpc3RlciBhcHBlYXJzIGF0IGFsbCBsb2NhdGlvbnMgKi8KLQkJaWYgKGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoY2xpZW50LCBMVEM0MjQ1X0FMRVJULCAweGZmKSkKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCS8qIGNoZWNrIHRoYXQgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgYXBwZWFycyBhdCBhbGwgbG9jYXRpb25zICovCi0JCWlmIChsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKGNsaWVudCwgTFRDNDI0NV9DT05UUk9MLCAweGZmKSkKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCS8qIGNoZWNrIHRoYXQgcmVnaXN0ZXIgMHgwNiBiaXRzIGI2IGFuZCBiNyBzdGF5IGNvbnN0YW50ICovCi0JCWlmIChsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKGNsaWVudCwgTFRDNDI0NV9HUElPLCAweGMwKSkKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCS8qIGNoZWNrIHRoYXQgcmVnaXN0ZXIgMHgwNyBiaXRzIGIzLWIwIHN0YXkgY29uc3RhbnQgKi8KLQkJaWYgKGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoY2xpZW50LCBMVEM0MjQ1X0FEQ0FEUiwgMHgwZikpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlzdHJsY3B5KGluZm8tPnR5cGUsICJsdGM0MjQ1IiwgSTJDX05BTUVfU0laRSk7Ci0JZGV2X2luZm8oJmFkYXB0ZXItPmRldiwgImx0YzQyNDUgJXMgYXQgYWRkcmVzcyAweCUwMnhcbiIsCi0JCQlraW5kIDwgMCA/ICJwcm9iZWQiIDogImZvcmNlZCIsCi0JCQljbGllbnQtPmFkZHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjQ1X2lkW10gPSB7Ci0JeyAibHRjNDI0NSIsIGx0YzQyNDUgfSwKKwl7ICJsdGM0MjQ1IiwgMCB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGM0MjQ1X2lkKTsKIAogLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzQyNDVfZHJpdmVyID0gewotCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAibHRjNDI0NSIsCiAJfSwKIAkucHJvYmUJCT0gbHRjNDI0NV9wcm9iZSwKIAkucmVtb3ZlCQk9IGx0YzQyNDVfcmVtb3ZlLAogCS5pZF90YWJsZQk9IGx0YzQyNDVfaWQsCi0JLmRldGVjdAkJPSBsdGM0MjQ1X2RldGVjdCwKLQkuYWRkcmVzc19kYXRhCT0gJmFkZHJfZGF0YSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGx0YzQyNDVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zaHQxNS5jIGIvZHJpdmVycy9od21vbi9zaHQxNS5jCmluZGV4IDMwM2MwMjYuLmViZTM4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vc2h0MTUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NodDE1LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTYyMiw3ICs2MjMsMTIgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaHRfZHJpdmVyc1tdID0geworLyoKKyAqIHNodF9kcml2ZXJzIHNpbXVsdGFuZW91c2x5IHJlZmVycyB0byBfX2RldmluaXQgYW5kIF9fZGV2ZXhpdCBmdW5jdGlvbgorICogd2hpY2ggY2F1c2VzIHNwdXJpb3VzIHNlY3Rpb24gbWlzbWF0Y2ggd2FybmluZy4gU28gdXNlIF9fcmVmZGF0YSB0bworICogZ2V0IHJpZCBmcm9tIHRoaXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIF9fcmVmZGF0YSBzaHRfZHJpdmVyc1tdID0gewogCXsKIAkJLmRyaXZlciA9IHsKIAkJCS5uYW1lID0gInNodDEwIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggNmJlZGQyZi4uNzM3MzM1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTQ3Nyw4ICs0NzcsOCBAQAogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLXBueC4KIAogY29uZmlnIEkyQ19QWEEKLQl0cmlzdGF0ZSAiSW50ZWwgUFhBMlhYIEkyQyBhZGFwdGVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIEFSQ0hfUFhBCisJdHJpc3RhdGUgIkludGVsIFBYQTJYWCBJMkMgYWRhcHRlciIKKwlkZXBlbmRzIG9uIEFSQ0hfUFhBIHx8IEFSQ0hfTU1QCiAJaGVscAogCSAgSWYgeW91IGhhdmUgZGV2aWNlcyBpbiB0aGUgUFhBIEkyQyBidXMsIHNheSB5ZXMgdG8gdGhpcyBvcHRpb24uCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYwppbmRleCBmN2Q2ZmU5Li44ZjBiOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKQEAgLTM2NCw3ICszNjQsNyBAQAogCWVycm9yID0gYWNwaV9jaGVja19yZWdpb24oYW1kNzU2X2lvcG9ydCwgU01CX0lPU0laRSwKIAkJCQkgIGFtZDc1Nl9kcml2ZXIubmFtZSk7CiAJaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7CisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhbWQ3NTZfaW9wb3J0LCBTTUJfSU9TSVpFLCBhbWQ3NTZfZHJpdmVyLm5hbWUpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlNNQiByZWdpb24gMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDgxMTEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jCmluZGV4IGE3YzU5OTAuLjViNGFkODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kODExMS5jCkBAIC0zNzYsOCArMzc2LDEwIEBACiAJc21idXMtPnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCk7CiAKIAllcnJvciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJmRldi0+cmVzb3VyY2VbMF0pOwotCWlmIChlcnJvcikKKwlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSAtRU5PREVWOwogCQlnb3RvIG91dF9rZnJlZTsKKwl9CiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKHNtYnVzLT5iYXNlLCBzbWJ1cy0+c2l6ZSwgYW1kODExMV9kcml2ZXIubmFtZSkpIHsKIAkJZXJyb3IgPSAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IDlkMmM1YWQuLjU1ZWRjZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCkBAIC03MzIsOCArNzMyLDEwIEBACiAJfQogCiAJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmZGV2LT5yZXNvdXJjZVtTTUJCQVJdKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0OworCX0KIAogCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIFNNQkJBUiwgaTgwMV9kcml2ZXIubmFtZSk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMKaW5kZXggNGFmYmEzZS4uZTM2NTRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlteC5jCkBAIC0xMjAsMTkgKzEyMCwyNiBAQAogCXdhaXRfcXVldWVfaGVhZF90CXF1ZXVlOwogCXVuc2lnbmVkIGxvbmcJCWkyY3NyOwogCXVuc2lnbmVkIGludCAJCWRpc2FibGVfZGVsYXk7CisJaW50CQkJc3RvcHBlZDsKKwl1bnNpZ25lZCBpbnQJCWlmZHI7IC8qIElNWF9JMkNfSUZEUiAqLwogfTsKIAogLyoqIEZ1bmN0aW9ucyBmb3IgSU1YIEkyQyBhZGFwdGVyIGRyaXZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgaTJjX2lteF9idXNfYnVzeShzdHJ1Y3QgaW14X2kyY19zdHJ1Y3QgKmkyY19pbXgpCitzdGF0aWMgaW50IGkyY19pbXhfYnVzX2J1c3koc3RydWN0IGlteF9pMmNfc3RydWN0ICppMmNfaW14LCBpbnQgZm9yX2J1c3kpCiB7CiAJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworCXVuc2lnbmVkIGludCB0ZW1wOwogCiAJZGV2X2RiZygmaTJjX2lteC0+YWRhcHRlci5kZXYsICI8JXM+XG4iLCBfX2Z1bmNfXyk7CiAKLQkvKiB3YWl0IGZvciBidXMgbm90IGJ1c3kgKi8KLQl3aGlsZSAocmVhZGIoaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJTUikgJiBJMlNSX0lCQikgeworCXdoaWxlICgxKSB7CisJCXRlbXAgPSByZWFkYihpMmNfaW14LT5iYXNlICsgSU1YX0kyQ19JMlNSKTsKKwkJaWYgKGZvcl9idXN5ICYmICh0ZW1wICYgSTJTUl9JQkIpKQorCQkJYnJlYWs7CisJCWlmICghZm9yX2J1c3kgJiYgISh0ZW1wICYgSTJTUl9JQkIpKQorCQkJYnJlYWs7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJZGV2X2RiZygmaTJjX2lteC0+YWRhcHRlci5kZXYsCiAJCQkJIjwlcz4gSTJDIEludGVycnVwdGVkXG4iLCBfX2Z1bmNfXyk7CkBAIC0xNzksNDEgKzE4Niw2MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpMmNfaW14X3N0YXJ0KHN0cnVjdCBpbXhfaTJjX3N0cnVjdCAqaTJjX2lteCkKK3N0YXRpYyBpbnQgaTJjX2lteF9zdGFydChzdHJ1Y3QgaW14X2kyY19zdHJ1Y3QgKmkyY19pbXgpCiB7CiAJdW5zaWduZWQgaW50IHRlbXAgPSAwOworCWludCByZXN1bHQ7CiAKIAlkZXZfZGJnKCZpMmNfaW14LT5hZGFwdGVyLmRldiwgIjwlcz5cbiIsIF9fZnVuY19fKTsKIAorCWNsa19lbmFibGUoaTJjX2lteC0+Y2xrKTsKKwl3cml0ZWIoaTJjX2lteC0+aWZkciwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSUZEUik7CiAJLyogRW5hYmxlIEkyQyBjb250cm9sbGVyICovCisJd3JpdGViKDAsIGkyY19pbXgtPmJhc2UgKyBJTVhfSTJDX0kyU1IpOwogCXdyaXRlYihJMkNSX0lFTiwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJDUik7CisKKwkvKiBXYWl0IGNvbnRyb2xsZXIgdG8gYmUgc3RhYmxlICovCisJdWRlbGF5KDUwKTsKKwogCS8qIFN0YXJ0IEkyQyB0cmFuc2FjdGlvbiAqLwogCXRlbXAgPSByZWFkYihpMmNfaW14LT5iYXNlICsgSU1YX0kyQ19JMkNSKTsKIAl0ZW1wIHw9IEkyQ1JfTVNUQTsKIAl3cml0ZWIodGVtcCwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJDUik7CisJcmVzdWx0ID0gaTJjX2lteF9idXNfYnVzeShpMmNfaW14LCAxKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCWkyY19pbXgtPnN0b3BwZWQgPSAwOworCiAJdGVtcCB8PSBJMkNSX0lJRU4gfCBJMkNSX01UWCB8IEkyQ1JfVFhBSzsKIAl3cml0ZWIodGVtcCwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJDUik7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHZvaWQgaTJjX2lteF9zdG9wKHN0cnVjdCBpbXhfaTJjX3N0cnVjdCAqaTJjX2lteCkKIHsKIAl1bnNpZ25lZCBpbnQgdGVtcCA9IDA7CiAKLQkvKiBTdG9wIEkyQyB0cmFuc2FjdGlvbiAqLwotCWRldl9kYmcoJmkyY19pbXgtPmFkYXB0ZXIuZGV2LCAiPCVzPlxuIiwgX19mdW5jX18pOwotCXRlbXAgPSByZWFkYihpMmNfaW14LT5iYXNlICsgSU1YX0kyQ19JMkNSKTsKLQl0ZW1wICY9IH5JMkNSX01TVEE7Ci0Jd3JpdGViKHRlbXAsIGkyY19pbXgtPmJhc2UgKyBJTVhfSTJDX0kyQ1IpOwotCS8qIHNldHVwIGNoaXAgcmVnaXN0ZXJzIHRvIGRlZmF1bHRzICovCi0Jd3JpdGViKEkyQ1JfSUVOLCBpMmNfaW14LT5iYXNlICsgSU1YX0kyQ19JMkNSKTsKLQl3cml0ZWIoMCwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJTUik7Ci0JLyoKLQkgKiBUaGlzIGRlbGF5IGNhdXNlZCBieSBhbiBpLk1YTCBoYXJkd2FyZSBidWcuCi0JICogSWYgbm8gKG9yIHRvbyBzaG9ydCkgZGVsYXksIG5vICJTVE9QIiBiaXQgd2lsbCBiZSBnZW5lcmF0ZWQuCi0JICovCi0JdWRlbGF5KGkyY19pbXgtPmRpc2FibGVfZGVsYXkpOworCWlmICghaTJjX2lteC0+c3RvcHBlZCkgeworCQkvKiBTdG9wIEkyQyB0cmFuc2FjdGlvbiAqLworCQlkZXZfZGJnKCZpMmNfaW14LT5hZGFwdGVyLmRldiwgIjwlcz5cbiIsIF9fZnVuY19fKTsKKwkJdGVtcCA9IHJlYWRiKGkyY19pbXgtPmJhc2UgKyBJTVhfSTJDX0kyQ1IpOworCQl0ZW1wICY9IH4oSTJDUl9NU1RBIHwgSTJDUl9NVFgpOworCQl3cml0ZWIodGVtcCwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJDUik7CisJCWkyY19pbXgtPnN0b3BwZWQgPSAxOworCX0KKwlpZiAoY3B1X2lzX214MSgpKSB7CisJCS8qCisJCSAqIFRoaXMgZGVsYXkgY2F1c2VkIGJ5IGFuIGkuTVhMIGhhcmR3YXJlIGJ1Zy4KKwkJICogSWYgbm8gKG9yIHRvbyBzaG9ydCkgZGVsYXksIG5vICJTVE9QIiBiaXQgd2lsbCBiZSBnZW5lcmF0ZWQuCisJCSAqLworCQl1ZGVsYXkoaTJjX2lteC0+ZGlzYWJsZV9kZWxheSk7CisJfQorCisJaWYgKCFpMmNfaW14LT5zdG9wcGVkKQorCQlpMmNfaW14X2J1c19idXN5KGkyY19pbXgsIDApOworCiAJLyogRGlzYWJsZSBJMkMgY29udHJvbGxlciAqLwogCXdyaXRlYigwLCBpMmNfaW14LT5iYXNlICsgSU1YX0kyQ19JMkNSKTsKKwljbGtfZGlzYWJsZShpMmNfaW14LT5jbGspOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaTJjX2lteF9zZXRfY2xrKHN0cnVjdCBpbXhfaTJjX3N0cnVjdCAqaTJjX2lteCwKQEAgLTIzMyw4ICsyNjEsOCBAQAogCWVsc2UKIAkJZm9yIChpID0gMDsgaTJjX2Nsa19kaXZbaV1bMF0gPCBkaXY7IGkrKyk7CiAKLQkvKiBXcml0ZSBkaXZpZGVyIHZhbHVlIHRvIHJlZ2lzdGVyICovCi0Jd3JpdGViKGkyY19jbGtfZGl2W2ldWzFdLCBpMmNfaW14LT5iYXNlICsgSU1YX0kyQ19JRkRSKTsKKwkvKiBTdG9yZSBkaXZpZGVyIHZhbHVlICovCisJaTJjX2lteC0+aWZkciA9IGkyY19jbGtfZGl2W2ldWzFdOwogCiAJLyoKIAkgKiBUaGVyZSBkdW1teSBkZWxheSBpcyBjYWxjdWxhdGVkLgpAQCAtMzQxLDExICszNjksMTUgQEAKIAkJaWYgKHJlc3VsdCkKIAkJCXJldHVybiByZXN1bHQ7CiAJCWlmIChpID09IChtc2dzLT5sZW4gLSAxKSkgeworCQkJLyogSXQgbXVzdCBnZW5lcmF0ZSBTVE9QIGJlZm9yZSByZWFkIEkyRFIgdG8gcHJldmVudAorCQkJICAgY29udHJvbGxlciBmcm9tIGdlbmVyYXRpbmcgYW5vdGhlciBjbG9jayBjeWNsZSAqLwogCQkJZGV2X2RiZygmaTJjX2lteC0+YWRhcHRlci5kZXYsCiAJCQkJIjwlcz4gY2xlYXIgTVNUQVxuIiwgX19mdW5jX18pOwogCQkJdGVtcCA9IHJlYWRiKGkyY19pbXgtPmJhc2UgKyBJTVhfSTJDX0kyQ1IpOwotCQkJdGVtcCAmPSB+STJDUl9NU1RBOworCQkJdGVtcCAmPSB+KEkyQ1JfTVNUQSB8IEkyQ1JfTVRYKTsKIAkJCXdyaXRlYih0ZW1wLCBpMmNfaW14LT5iYXNlICsgSU1YX0kyQ19JMkNSKTsKKwkJCWkyY19pbXhfYnVzX2J1c3koaTJjX2lteCwgMCk7CisJCQlpMmNfaW14LT5zdG9wcGVkID0gMTsKIAkJfSBlbHNlIGlmIChpID09IChtc2dzLT5sZW4gLSAyKSkgewogCQkJZGV2X2RiZygmaTJjX2lteC0+YWRhcHRlci5kZXYsCiAJCQkJIjwlcz4gc2V0IFRYQUtcbiIsIF9fZnVuY19fKTsKQEAgLTM3MCwxNCArNDAyLDExIEBACiAKIAlkZXZfZGJnKCZpMmNfaW14LT5hZGFwdGVyLmRldiwgIjwlcz5cbiIsIF9fZnVuY19fKTsKIAotCS8qIENoZWNrIGlmIGkyYyBidXMgaXMgbm90IGJ1c3kgKi8KLQlyZXN1bHQgPSBpMmNfaW14X2J1c19idXN5KGkyY19pbXgpOworCS8qIFN0YXJ0IEkyQyB0cmFuc2ZlciAqLworCXJlc3VsdCA9IGkyY19pbXhfc3RhcnQoaTJjX2lteCk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBmYWlsMDsKIAotCS8qIFN0YXJ0IEkyQyB0cmFuc2ZlciAqLwotCWkyY19pbXhfc3RhcnQoaTJjX2lteCk7Ci0KIAkvKiByZWFkL3dyaXRlIGRhdGEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJaWYgKGkpIHsKQEAgLTM4Niw2ICs0MTUsOSBAQAogCQkJdGVtcCA9IHJlYWRiKGkyY19pbXgtPmJhc2UgKyBJTVhfSTJDX0kyQ1IpOwogCQkJdGVtcCB8PSBJMkNSX1JTVEE7CiAJCQl3cml0ZWIodGVtcCwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJDUik7CisJCQlyZXN1bHQgPSAgaTJjX2lteF9idXNfYnVzeShpMmNfaW14LCAxKTsKKwkJCWlmIChyZXN1bHQpCisJCQkJZ290byBmYWlsMDsKIAkJfQogCQlkZXZfZGJnKCZpMmNfaW14LT5hZGFwdGVyLmRldiwKIAkJCSI8JXM+IHRyYW5zZmVyIG1lc3NhZ2U6ICVkXG4iLCBfX2Z1bmNfXywgaSk7CkBAIC01MDAsNyArNTMyLDYgQEAKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IEkyQyBjbG9ja1xuIik7CiAJCWdvdG8gZmFpbDM7CiAJfQotCWNsa19lbmFibGUoaTJjX2lteC0+Y2xrKTsKIAogCS8qIFJlcXVlc3QgSVJRICovCiAJcmV0ID0gcmVxdWVzdF9pcnEoaTJjX2lteC0+aXJxLCBpMmNfaW14X2lzciwgMCwgcGRldi0+bmFtZSwgaTJjX2lteCk7CkBAIC01NDksNyArNTgwLDYgQEAKIGZhaWw1OgogCWZyZWVfaXJxKGkyY19pbXgtPmlycSwgaTJjX2lteCk7CiBmYWlsNDoKLQljbGtfZGlzYWJsZShpMmNfaW14LT5jbGspOwogCWNsa19wdXQoaTJjX2lteC0+Y2xrKTsKIGZhaWwzOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihpMmNfaW14LT5yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwpAQCAtNTg2LDggKzYxNiw2IEBACiAJaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQogCQlwZGF0YS0+ZXhpdCgmcGRldi0+ZGV2KTsKIAotCS8qIERpc2FibGUgSTJDIGNsb2NrICovCi0JY2xrX2Rpc2FibGUoaTJjX2lteC0+Y2xrKTsKIAljbGtfcHV0KGkyY19pbXgtPmNsayk7CiAKIAlyZWxlYXNlX21lbV9yZWdpb24oaTJjX2lteC0+cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpMmNfaW14LT5yZXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNjaC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2NoLmMKaW5kZXggOWY2YjhlMC4uZGJhNmViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2NoLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2NoLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKGFjcGlfY2hlY2tfcmVnaW9uKHNjaF9zbWJhLCBTTUJJT1NJWkUsIHNjaF9kcml2ZXIubmFtZSkpCi0JCXJldHVybiAtRUJVU1k7CisJCXJldHVybiAtRU5PREVWOwogCWlmICghcmVxdWVzdF9yZWdpb24oc2NoX3NtYmEsIFNNQklPU0laRSwgc2NoX2RyaXZlci5uYW1lKSkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIlNNQnVzIHJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKIAkJCXNjaF9zbWJhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCmluZGV4IGQzMjVlODYuLmY2MjcwMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYwpAQCAtMzY1LDkgKzM2NSw2IEBACiAJdW5zaWduZWQgdGltZW91dCA9IGkyYy0+YWRhcC50aW1lb3V0OwogCXUzMiBmbGFncyA9IHJlc3RhcnQgPyBDQ1JfUlNUQSA6IDA7CiAKLQkvKiBTdGFydCB3aXRoIE1FTiAqLwotCWlmICghcmVzdGFydCkKLQkJd3JpdGVjY3IoaTJjLCBDQ1JfTUVOKTsKIAkvKiBTdGFydCBhcyBtYXN0ZXIgKi8KIAl3cml0ZWNjcihpMmMsIENDUl9NSUVOIHwgQ0NSX01FTiB8IENDUl9NU1RBIHwgQ0NSX01UWCB8IGZsYWdzKTsKIAkvKiBXcml0ZSB0YXJnZXQgYnl0ZSAqLwpAQCAtMzk2LDkgKzM5Myw2IEBACiAJaW50IGksIHJlc3VsdDsKIAl1MzIgZmxhZ3MgPSByZXN0YXJ0ID8gQ0NSX1JTVEEgOiAwOwogCi0JLyogU3RhcnQgd2l0aCBNRU4gKi8KLQlpZiAoIXJlc3RhcnQpCi0JCXdyaXRlY2NyKGkyYywgQ0NSX01FTik7CiAJLyogU3dpdGNoIHRvIHJlYWQgLSByZXN0YXJ0ICovCiAJd3JpdGVjY3IoaTJjLCBDQ1JfTUlFTiB8IENDUl9NRU4gfCBDQ1JfTVNUQSB8IENDUl9NVFggfCBmbGFncyk7CiAJLyogV3JpdGUgdGFyZ2V0IGFkZHJlc3MgYnl0ZSAtIHRoaXMgdGltZSB3aXRoIHRoZSByZWFkIGZsYWcgc2V0ICovCkBAIC00MjUsOSArNDE5LDkgQEAKIAkJLyogR2VuZXJhdGUgdHhhY2sgb24gbmV4dCB0byBsYXN0IGJ5dGUgKi8KIAkJaWYgKGkgPT0gbGVuZ3RoIC0gMikKIAkJCXdyaXRlY2NyKGkyYywgQ0NSX01JRU4gfCBDQ1JfTUVOIHwgQ0NSX01TVEEgfCBDQ1JfVFhBSyk7Ci0JCS8qIEdlbmVyYXRlIHN0b3Agb24gbGFzdCBieXRlICovCisJCS8qIERvIG5vdCBnZW5lcmF0ZSBzdG9wIG9uIGxhc3QgYnl0ZSAqLwogCQlpZiAoaSA9PSBsZW5ndGggLSAxKQotCQkJd3JpdGVjY3IoaTJjLCBDQ1JfTUlFTiB8IENDUl9NRU4gfCBDQ1JfVFhBSyk7CisJCQl3cml0ZWNjcihpMmMsIENDUl9NSUVOIHwgQ0NSX01FTiB8IENDUl9NU1RBIHwgQ0NSX01UWCk7CiAJCWRhdGFbaV0gPSByZWFkYihpMmMtPmJhc2UgKyBNUENfSTJDX0RSKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYwppbmRleCBhNzgyYzdhLi5kMjZhOTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAl9CiAKIAlpZiAoYWNwaV9jaGVja19yZWdpb24ocGlpeDRfc21iYSwgU01CSU9TSVpFLCBwaWl4NF9kcml2ZXIubmFtZSkpCi0JCXJldHVybiAtRUJVU1k7CisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwaWl4NF9zbWJhLCBTTUJJT1NJWkUsIHBpaXg0X2RyaXZlci5uYW1lKSkgewogCQlkZXZfZXJyKCZQSUlYNF9kZXYtPmRldiwgIlNNQnVzIHJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKQEAgLTI2MCw3ICsyNjAsNyBAQAogCiAJcGlpeDRfc21iYSA9ICgoc21iYV9lbl9oaSA8PCA4KSB8IHNtYmFfZW5fbG8pICYgMHhmZmUwOwogCWlmIChhY3BpX2NoZWNrX3JlZ2lvbihwaWl4NF9zbWJhLCBTTUJJT1NJWkUsIHBpaXg0X2RyaXZlci5uYW1lKSkKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKHBpaXg0X3NtYmEsIFNNQklPU0laRSwgcGlpeDRfZHJpdmVyLm5hbWUpKSB7CiAJCWRldl9lcnIoJlBJSVg0X2Rldi0+ZGV2LCAiU01CdXMgcmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zY21pLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNjbWkuYwppbmRleCAyNzZhMDQ2Li5iNGE1NWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNjbWkuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNjbWkuYwpAQCAtMzY5LDkgKzM2OSw4IEBACiAJCWdvdG8gZXJyOwogCiAJc25wcmludGYoc21idXNfY21pLT5hZGFwdGVyLm5hbWUsIHNpemVvZihzbWJ1c19jbWktPmFkYXB0ZXIubmFtZSksCi0JCSJTTUJ1cyBDTUkgYWRhcHRlciAlcyAoJXMpIiwKLQkJYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLAotCQlhY3BpX2RldmljZV91aWQoZGV2aWNlKSk7CisJCSJTTUJ1cyBDTUkgYWRhcHRlciAlcyIsCisJCWFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSk7CiAJc21idXNfY21pLT5hZGFwdGVyLm93bmVyID0gVEhJU19NT0RVTEU7CiAJc21idXNfY21pLT5hZGFwdGVyLmFsZ28gPSAmYWNwaV9zbWJ1c19jbWlfYWxnb3JpdGhtOwogCXNtYnVzX2NtaS0+YWRhcHRlci5hbGdvX2RhdGEgPSBzbWJ1c19jbWk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczk2eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM5NnguYwppbmRleCA4Mjk1ODg1Li4xNjQ5OTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczk2eC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzOTZ4LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAJcmV0dmFsID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmZGV2LT5yZXNvdXJjZVtTSVM5NnhfQkFSXSk7CiAJaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBFdmVyeXRoaW5nIGlzIGhhcHB5LCBsZXQncyBncmFiIHRoZSBtZW1vcnkgYW5kIHNldCB0aGluZ3MgdXAuICovCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzaXM5Nnhfc21idXNfYmFzZSwgU01CX0lPU0laRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYXByby5jCmluZGV4IDU0ZDgxMGEuLmU0YjE1NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYwpAQCAtMzY1LDcgKzM2NSw3IEBACiBmb3VuZDoKIAllcnJvciA9IGFjcGlfY2hlY2tfcmVnaW9uKHZ0NTk2X3NtYmEsIDgsIHZ0NTk2X2RyaXZlci5uYW1lKTsKIAlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKHZ0NTk2X3NtYmEsIDgsIHZ0NTk2X2RyaXZlci5uYW1lKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTTUJ1cyByZWdpb24gMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9hdGlpeHAuYyBiL2RyaXZlcnMvaWRlL2F0aWl4cC5jCmluZGV4IDYzOTZjM2EuLjgzNzMyMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2F0aWl4cC5jCisrKyBiL2RyaXZlcnMvaWRlL2F0aWl4cC5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAl7IFBDSV9WREVWSUNFKEFUSSwgUENJX0RFVklDRV9JRF9BVElfSVhQNDAwX0lERSksIDAgfSwKIAl7IFBDSV9WREVWSUNFKEFUSSwgUENJX0RFVklDRV9JRF9BVElfSVhQNjAwX0lERSksIDEgfSwKIAl7IFBDSV9WREVWSUNFKEFUSSwgUENJX0RFVklDRV9JRF9BVElfSVhQNzAwX0lERSksIDAgfSwKLQl7IFBDSV9WREVWSUNFKEFNRCwgUENJX0RFVklDRV9JRF9BTURfU0I5MDBfSURFKSwgMCB9LAorCXsgUENJX1ZERVZJQ0UoQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9IVURTT04yX0lERSksIDAgfSwKIAl7IDAsIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGF0aWl4cF9wY2lfdGJsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2NtZDY0eC5jIGIvZHJpdmVycy9pZGUvY21kNjR4LmMKaW5kZXggNjgwZTU5Ny4uY2EwYzQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY21kNjR4LmMKKysrIGIvZHJpdmVycy9pZGUvY21kNjR4LmMKQEAgLTM3OSw3ICszNzksOCBAQAogCQkuZW5hYmxlYml0cwk9IHt7MHgwMCwweDAwLDB4MDB9LCB7MHg1MSwweDA4LDB4MDh9fSwKIAkJLnBvcnRfb3BzCT0gJmNtZDY0eF9wb3J0X29wcywKIAkJLmhvc3RfZmxhZ3MJPSBJREVfSEZMQUdfQ0xFQVJfU0lNUExFWCB8Ci0JCQkJICBJREVfSEZMQUdfQUJVU0VfUFJFRkVUQ0gsCisJCQkJICBJREVfSEZMQUdfQUJVU0VfUFJFRkVUQ0ggfAorCQkJCSAgSURFX0hGTEFHX1NFUklBTElaRSwKIAkJLnBpb19tYXNrCT0gQVRBX1BJTzUsCiAJCS5td2RtYV9tYXNrCT0gQVRBX01XRE1BMiwKIAkJLnVkbWFfbWFzawk9IDB4MDAsIC8qIG5vIHVkbWEgKi8KQEAgLTM4OSw3ICszOTAsOCBAQAogCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2NtZDY0eCwKIAkJLmVuYWJsZWJpdHMJPSB7ezB4NTEsMHgwNCwweDA0fSwgezB4NTEsMHgwOCwweDA4fX0sCiAJCS5wb3J0X29wcwk9ICZjbWQ2NDhfcG9ydF9vcHMsCi0JCS5ob3N0X2ZsYWdzCT0gSURFX0hGTEFHX0FCVVNFX1BSRUZFVENILAorCQkuaG9zdF9mbGFncwk9IElERV9IRkxBR19BQlVTRV9QUkVGRVRDSCB8CisJCQkJICBJREVfSEZMQUdfU0VSSUFMSVpFLAogCQkucGlvX21hc2sJPSBBVEFfUElPNSwKIAkJLm13ZG1hX21hc2sJPSBBVEFfTVdETUEyLAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUEyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKaW5kZXggMjhkMDlhNS4uMDE3YzA5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCkBAIC0yNzMsMTQgKzI3Myw4IEBACiAKIHN0YXRpYyB2b2lkIHByb2NfaWRlX3NldHRpbmdzX3dhcm4odm9pZCkKIHsKLQlzdGF0aWMgaW50IHdhcm5lZDsKLQotCWlmICh3YXJuZWQpCi0JCXJldHVybjsKLQotCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IC9wcm9jL2lkZS9oZD8vc2V0dGluZ3MgaW50ZXJmYWNlIGlzICIKKwlwcmludGtfb25jZShLRVJOX1dBUk5JTkcgIldhcm5pbmc6IC9wcm9jL2lkZS9oZD8vc2V0dGluZ3MgaW50ZXJmYWNlIGlzICIKIAkJCSAgICAib2Jzb2xldGUsIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbiFcbiIpOwotCXdhcm5lZCA9IDE7CiB9CiAKIHN0YXRpYyBpbnQgaWRlX3NldHRpbmdzX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zaXM1NTEzLmMgYi9kcml2ZXJzL2lkZS9zaXM1NTEzLmMKaW5kZXggYWZjYTIyYi4uM2I4OGViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2lzNTUxMy5jCisrKyBiL2RyaXZlcnMvaWRlL3NpczU1MTMuYwpAQCAtMiw3ICsyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAwCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIJCUxpb25lbCBCb3V0b24gPExpb25lbC5Cb3V0b25AaW5ldDYuZnI+LCBNYWludGFpbmVyCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMJCVZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDcJCUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5CUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oKICAqCiAgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqCkBAIC0yODEsMTEgKzI4MSwxMyBAQAogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRiLCAmcmVnNGJoKTsKIAotCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCi0JCXJ3X3ByZWZldGNoID0gMHgxMSA8PCBkcml2ZS0+ZG47CisJcndfcHJlZmV0Y2ggPSByZWc0YmggJiB+KDB4MTEgPDwgZHJpdmUtPmRuKTsKIAotCWlmICgocmVnNGJoICYgKDB4MTEgPDwgZHJpdmUtPmRuKSkgIT0gcndfcHJlZmV0Y2gpCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGIsIHJlZzRiaHxyd19wcmVmZXRjaCk7CisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKKwkJcndfcHJlZmV0Y2ggfD0gMHgxMSA8PCBkcml2ZS0+ZG47CisKKwlpZiAocmVnNGJoICE9IHJ3X3ByZWZldGNoKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDRiLCByd19wcmVmZXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNpc19zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkbGUvaTczMDBfaWRsZS5jIGIvZHJpdmVycy9pZGxlL2k3MzAwX2lkbGUuYwppbmRleCA5NDljOTdmLi4xZjIwYTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkbGUvaTczMDBfaWRsZS5jCisrKyBiL2RyaXZlcnMvaWRsZS9pNzMwMF9pZGxlLmMKQEAgLTI5LDggKzI5LDggQEAKIAogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAKLSNpbmNsdWRlICIuLi9kbWEvaW9hdGRtYV9ody5oIgotI2luY2x1ZGUgIi4uL2RtYS9pb2F0ZG1hX3JlZ2lzdGVycy5oIgorI2luY2x1ZGUgIi4uL2RtYS9pb2F0L2h3LmgiCisjaW5jbHVkZSAiLi4vZG1hL2lvYXQvcmVnaXN0ZXJzLmgiCiAKICNkZWZpbmUgSTczMDBfSURMRV9EUklWRVJfVkVSU0lPTgkiMS41NSIKICNkZWZpbmUgSTczMDBfUFJJTlQJCQkiaTczMDBfaWRsZToiCkBAIC0xMjYsOSArMTI2LDkgQEAKIAkJdWRlbGF5KDEwKTsKIAogCQlzdHMgPSByZWFkcShpb2F0X2NoYW5iYXNlICsgSU9BVDFfQ0hBTlNUU19PRkZTRVQpICYKLQkJCUlPQVRfQ0hBTlNUU19ETUFfVFJBTlNGRVJfU1RBVFVTOworCQkJSU9BVF9DSEFOU1RTX1NUQVRVUzsKIAotCQlpZiAoc3RzICE9IElPQVRfQ0hBTlNUU19ETUFfVFJBTlNGRVJfU1RBVFVTX0FDVElWRSkKKwkJaWYgKHN0cyAhPSBJT0FUX0NIQU5TVFNfQUNUSVZFKQogCQkJYnJlYWs7CiAKIAl9CkBAIC0xNjAsOSArMTYwLDkgQEAKIAl1ZGVsYXkoMTAwMCk7CiAKIAljaGFuX3N0cyA9IHJlYWRxKGlvYXRfY2hhbmJhc2UgKyBJT0FUMV9DSEFOU1RTX09GRlNFVCkgJgotCQkJSU9BVF9DSEFOU1RTX0RNQV9UUkFOU0ZFUl9TVEFUVVM7CisJCQlJT0FUX0NIQU5TVFNfU1RBVFVTOwogCi0JaWYgKGNoYW5fc3RzICE9IElPQVRfQ0hBTlNUU19ETUFfVFJBTlNGRVJfU1RBVFVTX0RPTkUpIHsKKwlpZiAoY2hhbl9zdHMgIT0gSU9BVF9DSEFOU1RTX0RPTkUpIHsKIAkJLyogTm90IGNvbXBsZXRlLCByZXNldCB0aGUgY2hhbm5lbCAqLwogCQl3cml0ZWIoSU9BVF9DSEFOQ01EX1JFU0VULAogCQkgICAgICAgaW9hdF9jaGFuYmFzZSArIElPQVQxX0NIQU5DTURfT0ZGU0VUKTsKQEAgLTI4OCw5ICsyODgsOSBAQAogCQkgICAgICAgaW9hdF9jaGFuYmFzZSArIElPQVQxX0NIQU5DTURfT0ZGU0VUKTsKIAogCQljaGFuX3N0cyA9IHJlYWRxKGlvYXRfY2hhbmJhc2UgKyBJT0FUMV9DSEFOU1RTX09GRlNFVCkgJgotCQkJSU9BVF9DSEFOU1RTX0RNQV9UUkFOU0ZFUl9TVEFUVVM7CisJCQlJT0FUX0NIQU5TVFNfU1RBVFVTOwogCi0JCWlmIChjaGFuX3N0cyAhPSBJT0FUX0NIQU5TVFNfRE1BX1RSQU5TRkVSX1NUQVRVU19BQ1RJVkUpIHsKKwkJaWYgKGNoYW5fc3RzICE9IElPQVRfQ0hBTlNUU19BQ1RJVkUpIHsKIAkJCXdyaXRldygwLCBpb2F0X2NoYW5iYXNlICsgSU9BVF9DSEFOQ1RSTF9PRkZTRVQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI5OCwxNCArMjk4LDE0IEBACiAJfQogCiAJY2hhbl9zdHMgPSByZWFkcShpb2F0X2NoYW5iYXNlICsgSU9BVDFfQ0hBTlNUU19PRkZTRVQpICYKLQkJCUlPQVRfQ0hBTlNUU19ETUFfVFJBTlNGRVJfU1RBVFVTOworCQkJSU9BVF9DSEFOU1RTX1NUQVRVUzsKIAogCS8qCiAJICogV2UgdHJpZWQgdG8gcmVzZXQgbXVsdGlwbGUgdGltZXMuIElmIElPIEEvVCBjaGFubmVsIGlzIHN0aWxsIGFjdGl2ZQogCSAqIGZsYWcgYW4gZXJyb3IgYW5kIHJldHVybiB3aXRob3V0IGNsZWFudXAuIE1lbW9yeSBsZWFrIGlzIGJldHRlcgogCSAqIHRoYW4gcmFuZG9tIGNvcnJ1cHRpb24gaW4gdGhhdCBleHRyZW1lIGVycm9yIHNpdHVhdGlvbi4KIAkgKi8KLQlpZiAoY2hhbl9zdHMgPT0gSU9BVF9DSEFOU1RTX0RNQV9UUkFOU0ZFUl9TVEFUVVNfQUNUSVZFKSB7CisJaWYgKGNoYW5fc3RzID09IElPQVRfQ0hBTlNUU19BQ1RJVkUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIEk3MzAwX1BSSU5UICJVbmFibGUgdG8gc3RvcCBJTyBBL1QgY2hhbm5lbHMuIgogCQkJIiBOb3QgZnJlZWluZyByZXNvdXJjZXNcbiIpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2RtYS5jIGIvZHJpdmVycy9pZWVlMTM5NC9kbWEuYwppbmRleCAxYWJhOGMxLi44ZTdlMzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2RtYS5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGRtYV9yZWdpb25fdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBkbWFfcmVnaW9uX3ZtX29wcyA9IHsKIAkuZmF1bHQgPSBkbWFfcmVnaW9uX3BhZ2VmYXVsdCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKaW5kZXggMGJjM2Q3OC4uOGFhNTZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMKaW5kZXggZDI4N2JhNy4uOTQ5MDY0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCkBAIC0zMCw2ICszMCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCmluZGV4IDViZTFiZDQuLmJkMDc4MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogCiAJCWZvcl9lYWNoX25ldGRldigmaW5pdF9uZXQsIGRldikKIAkJCWlmIChpcHY2X2Noa19hZGRyKCZpbml0X25ldCwKLQkJCQkJICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIGFkZHIpLT5zaW42X2FkZHIsCisJCQkJCSAgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSBkc3RfaW4pLT5zaW42X2FkZHIsCiAJCQkJCSAgZGV2LCAxKSkKIAkJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jCmluZGV4IDU1ZDA5M2EuLjBmODk5MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2l3Y20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9pd2NtLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgpAQCAtMzYyLDcgKzM2Myw5IEBACiAJCSAqIEluIGVpdGhlciBjYXNlLCBtdXN0IHRlbGwgdGhlIHByb3ZpZGVyIHRvIHJlamVjdC4KIAkJICovCiAJCWNtX2lkX3ByaXYtPnN0YXRlID0gSVdfQ01fU1RBVEVfREVTVFJPWUlORzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCQljbV9pZC0+ZGV2aWNlLT5pd2NtLT5yZWplY3QoY21faWQsIE5VTEwsIDApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIElXX0NNX1NUQVRFX0NPTk5fU0VOVDoKIAljYXNlIElXX0NNX1NUQVRFX0RFU1RST1lJTkc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWRfcm1wcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkX3JtcHAuYwppbmRleCA1N2EzYzZmLi40ZTBmMjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWRfcm1wcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZF9ybXBwLmMKQEAgLTM3LDcgKzM3LDggQEAKIGVudW0gcm1wcF9zdGF0ZSB7CiAJUk1QUF9TVEFURV9BQ1RJVkUsCiAJUk1QUF9TVEFURV9USU1FT1VULAotCVJNUFBfU1RBVEVfQ09NUExFVEUKKwlSTVBQX1NUQVRFX0NPTVBMRVRFLAorCVJNUFBfU1RBVEVfQ0FOQ0VMSU5HCiB9OwogCiBzdHJ1Y3QgbWFkX3JtcHBfcmVjdiB7CkBAIC04NywxOCArODgsMjIgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhZ2VudC0+bG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocm1wcF9yZWN2LCAmYWdlbnQtPnJtcHBfbGlzdCwgbGlzdCkgeworCQlpZiAocm1wcF9yZWN2LT5zdGF0ZSAhPSBSTVBQX1NUQVRFX0NPTVBMRVRFKQorCQkJaWJfZnJlZV9yZWN2X21hZChybXBwX3JlY3YtPnJtcHBfd2MpOworCQlybXBwX3JlY3YtPnN0YXRlID0gUk1QUF9TVEFURV9DQU5DRUxJTkc7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFnZW50LT5sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJtcHBfcmVjdiwgJmFnZW50LT5ybXBwX2xpc3QsIGxpc3QpIHsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcm1wcF9yZWN2LT50aW1lb3V0X3dvcmspOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZybXBwX3JlY3YtPmNsZWFudXBfd29yayk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFnZW50LT5sb2NrLCBmbGFncyk7CiAKIAlmbHVzaF93b3JrcXVldWUoYWdlbnQtPnFwX2luZm8tPnBvcnRfcHJpdi0+d3EpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJtcHBfcmVjdiwgdGVtcF9ybXBwX3JlY3YsCiAJCQkJICZhZ2VudC0+cm1wcF9saXN0LCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZybXBwX3JlY3YtPmxpc3QpOwotCQlpZiAocm1wcF9yZWN2LT5zdGF0ZSAhPSBSTVBQX1NUQVRFX0NPTVBMRVRFKQotCQkJaWJfZnJlZV9yZWN2X21hZChybXBwX3JlY3YtPnJtcHBfd2MpOwogCQlkZXN0cm95X3JtcHBfcmVjdihybXBwX3JlY3YpOwogCX0KIH0KQEAgLTI2MCw2ICsyNjUsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJtcHBfcmVjdi0+YWdlbnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAocm1wcF9yZWN2LT5zdGF0ZSA9PSBSTVBQX1NUQVRFX0NBTkNFTElORykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybXBwX3JlY3YtPmFnZW50LT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CiAJbGlzdF9kZWwoJnJtcHBfcmVjdi0+bGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm1wcF9yZWN2LT5hZ2VudC0+bG9jaywgZmxhZ3MpOwogCWRlc3Ryb3lfcm1wcF9yZWN2KHJtcHBfcmVjdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCmluZGV4IDUxYmQ5NjYuLmY1MDRjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtYS5jCmluZGV4IDQzNDZhMjQuLmJiOTZkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y21hLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXNlcl9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMKaW5kZXggOGM0NmYyMi4uN2RlMDI5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXNlcl9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwppbmRleCBkM2ZmZjllLi5hZWMwZmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5jCmluZGV4IDY4OTU1MjM3Ny4uZWQ3MTc1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgpAQCAtMTE5OSwxMSArMTIwMCwxNCBAQAogCQlwcm9wcy0+c3RhdGUgPSBJQl9QT1JUX0RPV047CiAJZWxzZSB7CiAJCWluZXRkZXYgPSBpbl9kZXZfZ2V0KG5ldGRldik7Ci0JCWlmIChpbmV0ZGV2LT5pZmFfbGlzdCkKLQkJCXByb3BzLT5zdGF0ZSA9IElCX1BPUlRfQUNUSVZFOwotCQllbHNlCisJCWlmIChpbmV0ZGV2KSB7CisJCQlpZiAoaW5ldGRldi0+aWZhX2xpc3QpCisJCQkJcHJvcHMtPnN0YXRlID0gSUJfUE9SVF9BQ1RJVkU7CisJCQllbHNlCisJCQkJcHJvcHMtPnN0YXRlID0gSUJfUE9SVF9JTklUOworCQkJaW5fZGV2X3B1dChpbmV0ZGV2KTsKKwkJfSBlbHNlCiAJCQlwcm9wcy0+c3RhdGUgPSBJQl9QT1JUX0lOSVQ7Ci0JCWluX2Rldl9wdXQoaW5ldGRldik7CiAJfQogCiAJcHJvcHMtPnBvcnRfY2FwX2ZsYWdzID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9xcC5jCmluZGV4IDZlODY1MzQuLjFjZWNmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcXAuYwpAQCAtMjksNiArMjksNyBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQogICogU09GVFdBUkUuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgIml3Y2hfcHJvdmlkZXIuaCIKICNpbmNsdWRlICJpd2NoLmgiCiAjaW5jbHVkZSAiaXdjaF9jbS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV91dmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfdXZlcmJzLmMKaW5kZXggM2NiNjg4ZC4uZjE1NjVjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV91dmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3V2ZXJicy5jCkBAIC05NSw3ICs5NSw3IEBACiAJCSAgICAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsICpjb3VudCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2bV9vcHMgPSB7CiAJLm9wZW4gPQllaGNhX21tX29wZW4sCiAJLmNsb3NlID0gZWhjYV9tbV9jbG9zZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKaW5kZXggMDRlODhiNi4uMDEzZDEzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYwpAQCAtMzEsNiArMzEsNyBAQAogICogU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKaW5kZXggMzhhMjg3MC4uNDBkYmU1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKQEAgLTExNTEsNyArMTE1MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgaXBhdGhfZmlsZV92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGlwYXRoX2ZpbGVfdm1fb3BzID0gewogCS5mYXVsdCA9IGlwYXRoX2ZpbGVfdm1hX2ZhdWx0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTcyMjAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE3MjIwLmMKaW5kZXggYjJhOWQ0Yy4uYTgwNTQwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTcyMjAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNzIyMC5jCkBAIC0zNyw2ICszNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW50ci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ludHIuYwppbmRleCA2YzIxYjRiLi5jMGEwM2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW50ci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbnRyLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgImlwYXRoX2tlcm5lbC5oIgogI2luY2x1ZGUgImlwYXRoX3ZlcmJzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbW1hcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX21tYXAuYwppbmRleCBmYTgzMGUyLi5iMjg4NjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbW1hcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9tbWFwLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlrcmVmX3B1dCgmaXAtPnJlZiwgaXBhdGhfcmVsZWFzZV9tbWFwX2luZm8pOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGlwYXRoX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgaXBhdGhfdm1fb3BzID0gewogCS5vcGVuID0gICAgIGlwYXRoX3ZtYV9vcGVuLAogCS5jbG9zZSA9ICAgIGlwYXRoX3ZtYV9jbG9zZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9xcC5jCmluZGV4IDNhNWE4OWIuLmNiMmQzZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9xcC5jCkBAIC0zMiw2ICszMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSAiaXBhdGhfdmVyYnMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9ydWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9ydWMuYwppbmRleCAyMjk2ODMyLi4xZjk1YmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfcnVjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3J1Yy5jCkBAIC0zMSw2ICszMSw3IEBACiAgKiBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSAiaXBhdGhfdmVyYnMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91ZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VkLmMKaW5kZXggNjA3NmNiNi4uNzQyMDcxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VkLmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPHJkbWEvaWJfc21pLmg+CiAKICNpbmNsdWRlICJpcGF0aF92ZXJicy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfcGFnZXMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91c2VyX3BhZ2VzLmMKaW5kZXggODU1OTExZS4uODI4NzhlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfcGFnZXMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdXNlcl9wYWdlcy5jCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlICJpcGF0aF9rZXJuZWwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfc2RtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfc2RtYS5jCmluZGV4IDdiZmY0YjkuLmJlNzhmNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91c2VyX3NkbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdXNlcl9zZG1hLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzX21jYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdmVyYnNfbWNhc3QuYwppbmRleCBkNzNlMzIyLi42OTIzZTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdmVyYnNfbWNhc3QuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdmVyYnNfbWNhc3QuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgImlwYXRoX3ZlcmJzLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jYXRhcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKaW5kZXggMDU2YjJhNC4uMGFhMDExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKQEAgLTY4LDExICs2OCwxNiBAQAogCXNwaW5fdW5sb2NrX2lycSgmY2F0YXNfbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXBkZXYsICZ0bGlzdCwgY2F0YXNfZXJyLmxpc3QpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBkZXY7CiAJCXJldCA9IF9fbXRoY2FfcmVzdGFydF9vbmUoZGV2LT5wZGV2KTsKKwkJLyogJ2Rldicgbm93IGlzIG5vdCB2YWxpZCAqLwogCQlpZiAocmV0KQotCQkJbXRoY2FfZXJyKGRldiwgIlJlc2V0IGZhaWxlZCAoJWQpXG4iLCByZXQpOwotCQllbHNlCi0JCQltdGhjYV9kYmcoZGV2LCAiUmVzZXQgc3VjY2VlZGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAibXRoY2EgJXM6IFJlc2V0IGZhaWxlZCAoJWQpXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCByZXQpOworCQllbHNlIHsKKwkJCXN0cnVjdCBtdGhjYV9kZXYgKmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJCQltdGhjYV9kYmcoZCwgIlJlc2V0IHN1Y2NlZWRlZFxuIik7CisJCX0KIAl9CiAKIAltdXRleF91bmxvY2soJm10aGNhX2RldmljZV9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCmluZGV4IDUzOGU0MDkuLmU1OTNhZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCkBAIC0xNTY2LDcgKzE1NjYsNiBAQAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gbmVzX25ldGRldl9zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBuZXNfbmV0ZGV2X3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gbmVzX25ldGRldl9jaGFuZ2VfbXR1LAotCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIgCT0gbmVzX25ldGRldl92bGFuX3J4X3JlZ2lzdGVyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCmluZGV4IDI1ODc0ZmMuLjg3NjNjMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwpAQCAtMzYyLDEyICszNjIsMTkgQEAKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwb2liX2Rldl9wcml2LAogCQkJCQkJICAgY2Fycmllcl9vbl90YXNrKTsKKwlzdHJ1Y3QgaWJfcG9ydF9hdHRyIGF0dHI7CiAKIAkvKgogCSAqIFRha2UgcnRubF9sb2NrIHRvIGF2b2lkIHJhY2luZyB3aXRoIGlwb2liX3N0b3AoKSBhbmQKIAkgKiB0dXJuaW5nIHRoZSBjYXJyaWVyIGJhY2sgb24gd2hpbGUgYSBkZXZpY2UgaXMgYmVpbmcKIAkgKiByZW1vdmVkLgogCSAqLworCWlmIChpYl9xdWVyeV9wb3J0KHByaXYtPmNhLCBwcml2LT5wb3J0LCAmYXR0cikgfHwKKwkgICAgYXR0ci5zdGF0ZSAhPSBJQl9QT1JUX0FDVElWRSkgeworCQlpcG9pYl9kYmcocHJpdiwgIktlZXBpbmcgY2FycmllciBvZmYgdW50aWwgSUIgcG9ydCBpcyBhY3RpdmVcbiIpOworCQlyZXR1cm47CisJfQorCiAJcnRubF9sb2NrKCk7CiAJbmV0aWZfY2Fycmllcl9vbihwcml2LT5kZXYpOwogCXJ0bmxfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYwppbmRleCAwYmE2ZWM4Li5hZGQ5MTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMKQEAgLTQyNiw3ICs0MjYsNyBAQAogCSAqIGJlY2F1c2Ugd2UgcHJlYWxsb2NhdGUgc28gbWFueSByZXNvdXJjZXMKIAkgKi8KIAljbHNfc2Vzc2lvbiA9IGlzY3NpX3Nlc3Npb25fc2V0dXAoJmlzY3NpX2lzZXJfdHJhbnNwb3J0LCBzaG9zdCwKLQkJCQkJICBJU0NTSV9ERUZfWE1JVF9DTURTX01BWCwKKwkJCQkJICBJU0NTSV9ERUZfWE1JVF9DTURTX01BWCwgMCwKIAkJCQkJICBzaXplb2Yoc3RydWN0IGlzY3NpX2lzZXJfdGFzayksCiAJCQkJCSAgaW5pdGlhbF9jbWRzbiwgMCk7CiAJaWYgKCFjbHNfc2Vzc2lvbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwppbmRleCAxMTQ4MTQwLi5kZWU2NzA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCkBAIC0xMyw2ICsxMyw3IEBACiAjZGVmaW5lIEVWREVWX0JVRkZFUl9TSVpFCTY0CiAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCmluZGV4IDU1NjUzOWQuLmNjNzYzYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKQEAgLTExLDExICsxMSwxMyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC01MTQsNyArNTE2LDcgQEAKIAkgKiB0aGF0IHRoZXJlIGFyZSBubyB0aHJlYWRzIGluIHRoZSBtaWRkbGUgb2YgaW5wdXRfb3Blbl9kZXZpY2UoKQogCSAqLwogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwotCWRldi0+Z29pbmdfYXdheSA9IDE7CisJZGV2LT5nb2luZ19hd2F5ID0gdHJ1ZTsKIAltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCiAJc3Bpbl9sb2NrX2lycSgmZGV2LT5ldmVudF9sb2NrKTsKQEAgLTc4MCwxMCArNzgyLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3VuaW9uIGlucHV0X3NlcV9zdGF0ZSB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgc2hvcnQgcG9zOworCQlib29sIG11dGV4X2FjcXVpcmVkOworCX07CisJdm9pZCAqcDsKK307CisKIHN0YXRpYyB2b2lkICppbnB1dF9kZXZpY2VzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaW5wdXRfbXV0ZXgpKQotCQlyZXR1cm4gTlVMTDsKKwl1bmlvbiBpbnB1dF9zZXFfc3RhdGUgKnN0YXRlID0gKHVuaW9uIGlucHV0X3NlcV9zdGF0ZSAqKSZzZXEtPnByaXZhdGU7CisJaW50IGVycm9yOworCisJLyogV2UgbmVlZCB0byBmaXQgaW50byBzZXEtPnByaXZhdGUgcG9pbnRlciAqLworCUJVSUxEX0JVR19PTihzaXplb2YodW5pb24gaW5wdXRfc2VxX3N0YXRlKSAhPSBzaXplb2Yoc2VxLT5wcml2YXRlKSk7CisKKwllcnJvciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaW5wdXRfbXV0ZXgpOworCWlmIChlcnJvcikgeworCQlzdGF0ZS0+bXV0ZXhfYWNxdWlyZWQgPSBmYWxzZTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCX0KKworCXN0YXRlLT5tdXRleF9hY3F1aXJlZCA9IHRydWU7CiAKIAlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJmlucHV0X2Rldl9saXN0LCAqcG9zKTsKIH0KQEAgLTc5Myw5ICs4MTQsMTIgQEAKIAlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmaW5wdXRfZGV2X2xpc3QsIHBvcyk7CiB9CiAKLXN0YXRpYyB2b2lkIGlucHV0X2RldmljZXNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCitzdGF0aWMgdm9pZCBpbnB1dF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQltdXRleF91bmxvY2soJmlucHV0X211dGV4KTsKKwl1bmlvbiBpbnB1dF9zZXFfc3RhdGUgKnN0YXRlID0gKHVuaW9uIGlucHV0X3NlcV9zdGF0ZSAqKSZzZXEtPnByaXZhdGU7CisKKwlpZiAoc3RhdGUtPm11dGV4X2FjcXVpcmVkKQorCQltdXRleF91bmxvY2soJmlucHV0X211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgaW5wdXRfc2VxX3ByaW50X2JpdG1hcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgY29uc3QgY2hhciAqbmFtZSwKQEAgLTg1OSw3ICs4ODMsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpbnB1dF9kZXZpY2VzX3NlcV9vcHMgPSB7CiAJLnN0YXJ0CT0gaW5wdXRfZGV2aWNlc19zZXFfc3RhcnQsCiAJLm5leHQJPSBpbnB1dF9kZXZpY2VzX3NlcV9uZXh0LAotCS5zdG9wCT0gaW5wdXRfZGV2aWNlc19zZXFfc3RvcCwKKwkuc3RvcAk9IGlucHV0X3NlcV9zdG9wLAogCS5zaG93CT0gaW5wdXRfZGV2aWNlc19zZXFfc2hvdywKIH07CiAKQEAgLTg3OSw0MCArOTAzLDQ5IEBACiAKIHN0YXRpYyB2b2lkICppbnB1dF9oYW5kbGVyc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmlucHV0X211dGV4KSkKLQkJcmV0dXJuIE5VTEw7CisJdW5pb24gaW5wdXRfc2VxX3N0YXRlICpzdGF0ZSA9ICh1bmlvbiBpbnB1dF9zZXFfc3RhdGUgKikmc2VxLT5wcml2YXRlOworCWludCBlcnJvcjsKIAotCXNlcS0+cHJpdmF0ZSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpKnBvczsKKwkvKiBXZSBuZWVkIHRvIGZpdCBpbnRvIHNlcS0+cHJpdmF0ZSBwb2ludGVyICovCisJQlVJTERfQlVHX09OKHNpemVvZih1bmlvbiBpbnB1dF9zZXFfc3RhdGUpICE9IHNpemVvZihzZXEtPnByaXZhdGUpKTsKKworCWVycm9yID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpbnB1dF9tdXRleCk7CisJaWYgKGVycm9yKSB7CisJCXN0YXRlLT5tdXRleF9hY3F1aXJlZCA9IGZhbHNlOworCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJfQorCisJc3RhdGUtPm11dGV4X2FjcXVpcmVkID0gdHJ1ZTsKKwlzdGF0ZS0+cG9zID0gKnBvczsKKwogCXJldHVybiBzZXFfbGlzdF9zdGFydCgmaW5wdXRfaGFuZGxlcl9saXN0LCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKmlucHV0X2hhbmRsZXJzX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzZXEtPnByaXZhdGUgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSgqcG9zICsgMSk7Ci0JcmV0dXJuIHNlcV9saXN0X25leHQodiwgJmlucHV0X2hhbmRsZXJfbGlzdCwgcG9zKTsKLX0KKwl1bmlvbiBpbnB1dF9zZXFfc3RhdGUgKnN0YXRlID0gKHVuaW9uIGlucHV0X3NlcV9zdGF0ZSAqKSZzZXEtPnByaXZhdGU7CiAKLXN0YXRpYyB2b2lkIGlucHV0X2hhbmRsZXJzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCW11dGV4X3VubG9jaygmaW5wdXRfbXV0ZXgpOworCXN0YXRlLT5wb3MgPSAqcG9zICsgMTsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmaW5wdXRfaGFuZGxlcl9saXN0LCBwb3MpOwogfQogCiBzdGF0aWMgaW50IGlucHV0X2hhbmRsZXJzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCXN0cnVjdCBpbnB1dF9oYW5kbGVyICpoYW5kbGVyID0gY29udGFpbmVyX29mKHYsIHN0cnVjdCBpbnB1dF9oYW5kbGVyLCBub2RlKTsKKwl1bmlvbiBpbnB1dF9zZXFfc3RhdGUgKnN0YXRlID0gKHVuaW9uIGlucHV0X3NlcV9zdGF0ZSAqKSZzZXEtPnByaXZhdGU7CiAKLQlzZXFfcHJpbnRmKHNlcSwgIk46IE51bWJlcj0lbGQgTmFtZT0lcyIsCi0JCSAgICh1bnNpZ25lZCBsb25nKXNlcS0+cHJpdmF0ZSwgaGFuZGxlci0+bmFtZSk7CisJc2VxX3ByaW50ZihzZXEsICJOOiBOdW1iZXI9JXUgTmFtZT0lcyIsIHN0YXRlLT5wb3MsIGhhbmRsZXItPm5hbWUpOwogCWlmIChoYW5kbGVyLT5mb3BzKQogCQlzZXFfcHJpbnRmKHNlcSwgIiBNaW5vcj0lZCIsIGhhbmRsZXItPm1pbm9yKTsKIAlzZXFfcHV0YyhzZXEsICdcbicpOwogCiAJcmV0dXJuIDA7CiB9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaW5wdXRfaGFuZGxlcnNfc2VxX29wcyA9IHsKIAkuc3RhcnQJPSBpbnB1dF9oYW5kbGVyc19zZXFfc3RhcnQsCiAJLm5leHQJPSBpbnB1dF9oYW5kbGVyc19zZXFfbmV4dCwKLQkuc3RvcAk9IGlucHV0X2hhbmRsZXJzX3NlcV9zdG9wLAorCS5zdG9wCT0gaW5wdXRfc2VxX3N0b3AsCiAJLnNob3cJPSBpbnB1dF9oYW5kbGVyc19zZXFfc2hvdywKIH07CiAKQEAgLTEyNTksMTAgKzEyOTIsNzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBJTlBVVF9ET19UT0dHTEUoZGV2LCB0eXBlLCBiaXRzLCBvbikJCQlcCisJZG8gewkJCQkJCQlcCisJCWludCBpOwkJCQkJCVwKKwkJaWYgKCF0ZXN0X2JpdChFVl8jI3R5cGUsIGRldi0+ZXZiaXQpKQkJXAorCQkJYnJlYWs7CQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCB0eXBlIyNfTUFYOyBpKyspIHsJCVwKKwkJCWlmICghdGVzdF9iaXQoaSwgZGV2LT5iaXRzIyNiaXQpIHx8CVwKKwkJCSAgICAhdGVzdF9iaXQoaSwgZGV2LT5iaXRzKSkJCVwKKwkJCQljb250aW51ZTsJCQlcCisJCQlkZXYtPmV2ZW50KGRldiwgRVZfIyN0eXBlLCBpLCBvbik7CVwKKwkJfQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZCBpbnB1dF9kZXZfcmVzZXQoc3RydWN0IGlucHV0X2RldiAqZGV2LCBib29sIGFjdGl2YXRlKQoreworCWlmICghZGV2LT5ldmVudCkKKwkJcmV0dXJuOworCisJSU5QVVRfRE9fVE9HR0xFKGRldiwgTEVELCBsZWQsIGFjdGl2YXRlKTsKKwlJTlBVVF9ET19UT0dHTEUoZGV2LCBTTkQsIHNuZCwgYWN0aXZhdGUpOworCisJaWYgKGFjdGl2YXRlICYmIHRlc3RfYml0KEVWX1JFUCwgZGV2LT5ldmJpdCkpIHsKKwkJZGV2LT5ldmVudChkZXYsIEVWX1JFUCwgUkVQX1BFUklPRCwgZGV2LT5yZXBbUkVQX1BFUklPRF0pOworCQlkZXYtPmV2ZW50KGRldiwgRVZfUkVQLCBSRVBfREVMQVksIGRldi0+cmVwW1JFUF9ERUxBWV0pOworCX0KK30KKworc3RhdGljIGludCBpbnB1dF9kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gdG9faW5wdXRfZGV2KGRldik7CisKKwltdXRleF9sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKwlpbnB1dF9kZXZfcmVzZXQoaW5wdXRfZGV2LCBmYWxzZSk7CisJbXV0ZXhfdW5sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlucHV0X2Rldl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IHRvX2lucHV0X2RldihkZXYpOworCisJbXV0ZXhfbG9jaygmaW5wdXRfZGV2LT5tdXRleCk7CisJaW5wdXRfZGV2X3Jlc2V0KGlucHV0X2RldiwgdHJ1ZSk7CisJbXV0ZXhfdW5sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaW5wdXRfZGV2X3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IGlucHV0X2Rldl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaW5wdXRfZGV2X3Jlc3VtZSwKKwkucG93ZXJvZmYJPSBpbnB1dF9kZXZfc3VzcGVuZCwKKwkucmVzdG9yZQk9IGlucHV0X2Rldl9yZXN1bWUsCit9OworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCiBzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIGlucHV0X2Rldl90eXBlID0gewogCS5ncm91cHMJCT0gaW5wdXRfZGV2X2F0dHJfZ3JvdXBzLAogCS5yZWxlYXNlCT0gaW5wdXRfZGV2X3JlbGVhc2UsCiAJLnVldmVudAkJPSBpbnB1dF9kZXZfdWV2ZW50LAorI2lmZGVmIENPTkZJR19QTQorCS5wbQkJPSAmaW5wdXRfZGV2X3BtX29wcywKKyNlbmRpZgogfTsKIAogc3RhdGljIGNoYXIgKmlucHV0X2Rldm5vZGUoc3RydWN0IGRldmljZSAqZGV2LCBtb2RlX3QgKm1vZGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveWRldi5jIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwppbmRleCA5MDFiMjUyLi5iMWJkNmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCmluZGV4IDIzODhjZjUuLjc5ZTNlZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2sveHBhZC5jCkBAIC0xNDMsNiArMTQzLDcgQEAKIAl7IDB4MTJhYiwgMHg4ODA5LCAiWGJveCBERFIgZGFuY2VwYWQiLCBNQVBfRFBBRF9UT19CVVRUT05TLCBYVFlQRV9YQk9YIH0sCiAJeyAweDE0MzAsIDB4NDc0OCwgIlJlZE9jdGFuZSBHdWl0YXIgSGVybyBYLXBsb3JlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gzNjAgfSwKIAl7IDB4MTQzMCwgMHg4ODg4LCAiVFg2NTAwKyBEYW5jZSBQYWQgKGZpcnN0IGdlbmVyYXRpb24pIiwgTUFQX0RQQURfVE9fQlVUVE9OUywgWFRZUEVfWEJPWCB9LAorCXsgMHgxNDZiLCAweDA2MDEsICJCaWdCZW4gSW50ZXJhY3RpdmUgWEJPWCAzNjAgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gzNjAgfSwKIAl7IDB4MDQ1ZSwgMHgwMjhlLCAiTWljcm9zb2Z0IFgtQm94IDM2MCBwYWQiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YMzYwIH0sCiAJeyAweDFiYWQsIDB4MDAwMywgIkhhcm1vbml4IFJvY2sgQmFuZCBEcnVta2l0IiwgTUFQX0RQQURfVE9fQlVUVE9OUywgWFRZUEVfWEJPWDM2MCB9LAogCXsgMHhmZmZmLCAweGZmZmYsICJDaGluZXNlLW1hZGUgWGJveCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LApAQCAtMjA5LDYgKzIxMCw3IEBACiAJWFBBRF9YQk9YMzYwX1ZFTkRPUigweDA3MzgpLAkJLyogTWFkIENhdHogWC1Cb3ggMzYwIGNvbnRyb2xsZXJzICovCiAJWFBBRF9YQk9YMzYwX1ZFTkRPUigweDBlNmYpLAkJLyogMHgwZTZmIFgtQm94IDM2MCBjb250cm9sbGVycyAqLwogCVhQQURfWEJPWDM2MF9WRU5ET1IoMHgxNDMwKSwJCS8qIFJlZE9jdGFuZSBYLUJveCAzNjAgY29udHJvbGxlcnMgKi8KKwlYUEFEX1hCT1gzNjBfVkVORE9SKDB4MTQ2YiksCQkvKiBCaWdCZW4gSW50ZXJhY3RpdmUgQ29udHJvbGxlcnMgKi8KIAlYUEFEX1hCT1gzNjBfVkVORE9SKDB4MWJhZCksCQkvKiBSb2NrIEJhbmQgRHJ1bXMgKi8KIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKaW5kZXggMzUyNWMxOS4uZWU5OGIxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwpAQCAtMjQsNiArMjQsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFhZWQyMDAwX2tiZC4KIAorY29uZmlnIEtFWUJPQVJEX0FEUDU1ODgKKwl0cmlzdGF0ZSAiQURQNTU4OCBJMkMgUVdFUlRZIEtleXBhZCBhbmQgSU8gRXhwYW5kZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIEFEUDU1ODggYXR0YWNoZWQgdG8geW91cgorCSAgc3lzdGVtIEkyQyBidXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkcDU1ODgta2V5cy4KKwogY29uZmlnIEtFWUJPQVJEX0FNSUdBCiAJdHJpc3RhdGUgIkFtaWdhIGtleWJvYXJkIgogCWRlcGVuZHMgb24gQU1JR0EKQEAgLTEwNCw2ICsxMTQsMTYgQEAKIAkgIHJpZ2h0LWhhbmQgY29sdW1uIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGtleSBzaG93biBpbiB0aGUKIAkgIGxlZnQtaGFuZCBjb2x1bW4uCiAKK2NvbmZpZyBRVDIxNjAKKwl0cmlzdGF0ZSAiQXRtZWwgQVQ0MlFUMjE2MCBUb3VjaCBTZW5zb3IgQ2hpcCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQXRtZWwgQVQ0MlFUMjE2MCBUb3VjaAorCSAgU2Vuc29yIGNoaXAgYXMgYSBrZXlib2FyZCBpbnB1dC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBxdDIxNjAuCisKIGNvbmZpZyBLRVlCT0FSRF9CRklOCiAJdHJpc3RhdGUgIkJsYWNrZmluIEJGNTR4IGtleXBhZCBzdXBwb3J0IgogCWRlcGVuZHMgb24gKEJGNTR4ICYmICFCRjU0NCkKQEAgLTI1MSw2ICsyNzEsMTcgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1hcGxlX2tleWIuCiAKK2NvbmZpZyBLRVlCT0FSRF9NQVg3MzU5CisJdHJpc3RhdGUgIk1heGltIE1BWDczNTkgS2V5IFN3aXRjaCBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVg3MzU5IEtleQorCSAgU3dpdGNoIENvbnRyb2xsZXIgY2hpcC4gVGhpcyBwcm92aWRlcnMgbWljcm9wcm9jZXNzb3JzIHdpdGgKKwkgIG1hbmFnZW1lbnQgb2YgdXAgdG8gNjQga2V5IHN3aXRjaGVzCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1heDczNTlfa2V5cGFkLgorCiBjb25maWcgS0VZQk9BUkRfTkVXVE9OCiAJdHJpc3RhdGUgIk5ld3RvbiBrZXlib2FyZCIKIAlzZWxlY3QgU0VSSU8KQEAgLTI2MCw2ICsyOTEsMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG5ld3RvbmtiZC4KIAorY29uZmlnIEtFWUJPQVJEX09QRU5DT1JFUworCXRyaXN0YXRlICJPcGVuQ29yZXMgS2V5Ym9hcmQgQ29udHJvbGxlciIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgT3BlbkNvcmVzIEtleWJvYXJkIENvbnRyb2xsZXIKKwkgIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9wcm9qZWN0LGtleWJvYXJkY29udHJvbGxlcgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOyB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvcGVuY29yZXMta2JkLgorCiBjb25maWcgS0VZQk9BUkRfUFhBMjd4CiAJdHJpc3RhdGUgIlBYQTI3eC9QWEEzeHgga2V5cGFkIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQWEEyN3ggfHwgUFhBM3h4CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQppbmRleCA4YTdhMjJiLi5iYWJhZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKQEAgLTUsNiArNSw3IEBACiAjIEVhY2ggY29uZmlndXJhdGlvbiBvcHRpb24gZW5hYmxlcyBhIGxpc3Qgb2YgZmlsZXMuCiAKIG9iai0kKENPTkZJR19LRVlCT0FSRF9BQUVEMjAwMCkJCSs9IGFhZWQyMDAwX2tiZC5vCitvYmotJChDT05GSUdfS0VZQk9BUkRfQURQNTU4OCkJCSs9IGFkcDU1ODgta2V5cy5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQU1JR0EpCQkrPSBhbWlrYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FUQVJJKQkJKz0gYXRha2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9BVEtCRCkJCSs9IGF0a2JkLm8KQEAgLTIxLDEwICsyMiwxMyBAQAogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0xPQ09NTykJCSs9IGxvY29tb2tiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfTUFQTEUpCQkrPSBtYXBsZV9rZXliLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9NQVRSSVgpCQkrPSBtYXRyaXhfa2V5cGFkLm8KK29iai0kKENPTkZJR19LRVlCT0FSRF9NQVg3MzU5KQkJKz0gbWF4NzM1OV9rZXlwYWQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX05FV1RPTikJCSs9IG5ld3RvbmtiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfT01BUCkJCSs9IG9tYXAta2V5cGFkLm8KK29iai0kKENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMpCSs9IG9wZW5jb3Jlcy1rYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTI3eCkJCSs9IHB4YTI3eF9rZXlwYWQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTkzMF9ST1RBUlkpCSs9IHB4YTkzMF9yb3Rhcnkubworb2JqLSQoQ09ORklHX0tFWUJPQVJEX1FUMjE2MCkJCSs9IHF0MjE2MC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfU0hfS0VZU0MpCQkrPSBzaF9rZXlzYy5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfU1BJVFopCQkrPSBzcGl0emtiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkpCQkrPSBzdG93YXdheS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODgta2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDhjODA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIEZpbGU6IGRyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OF9rZXlzLmMKKyAqIERlc2NyaXB0aW9uOiAga2V5cGFkIGRyaXZlciBmb3IgQURQNTU4OCBJMkMgUVdFUlRZIEtleXBhZCBhbmQgSU8gRXhwYW5kZXIKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy9hZHA1NTg4Lmg+CisKKyAvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyMSAqLworI2RlZmluZSBBVVRPX0lOQwkoMSA8PCA3KQorI2RlZmluZSBHUElFTV9DRkcJKDEgPDwgNikKKyNkZWZpbmUgT1ZSX0ZMT1dfTQkoMSA8PCA1KQorI2RlZmluZSBJTlRfQ0ZHCQkoMSA8PCA0KQorI2RlZmluZSBPVlJfRkxPV19JRU4JKDEgPDwgMykKKyNkZWZpbmUgS19MQ0tfSU0JKDEgPDwgMikKKyNkZWZpbmUgR1BJX0lFTgkJKDEgPDwgMSkKKyNkZWZpbmUgS0VfSUVOCQkoMSA8PCAwKQorCisvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIENNUDJfSU5UCSgxIDw8IDUpCisjZGVmaW5lIENNUDFfSU5UCSgxIDw8IDQpCisjZGVmaW5lIE9WUl9GTE9XX0lOVAkoMSA8PCAzKQorI2RlZmluZSBLX0xDS19JTlQJKDEgPDwgMikKKyNkZWZpbmUgR1BJX0lOVAkJKDEgPDwgMSkKKyNkZWZpbmUgS0VfSU5UCQkoMSA8PCAwKQorCisvKiBLZXkgTG9jayBhbmQgRXZlbnQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBLX0xDS19FTgkoMSA8PCA2KQorI2RlZmluZSBMQ0syMQkJMHgzMAorI2RlZmluZSBLRUMJCTB4RgorCisvKiBLZXkgRXZlbnQgUmVnaXN0ZXIgeHkgKi8KKyNkZWZpbmUgS0VZX0VWX1BSRVNTRUQJCSgxIDw8IDcpCisjZGVmaW5lIEtFWV9FVl9NQVNLCQkoMHg3RikKKworI2RlZmluZSBLUF9TRUwoeCkJCSgweEZGRkYgPj4gKDE2IC0geCkpCS8qIDJeeC0xICovCisKKyNkZWZpbmUgS0VZUF9NQVhfRVZFTlQJCTEwCisKKy8qCisgKiBFYXJseSBwcmUgNC4wIFNpbGljb24gcmVxdWlyZWQgdG8gZGVsYXkgcmVhZG91dCBieSBhdCBsZWFzdCAyNW1zLAorICogc2luY2UgdGhlIEV2ZW50IENvdW50ZXIgUmVnaXN0ZXIgdXBkYXRlZCAyNW1zIGFmdGVyIHRoZSBpbnRlcnJ1cHQKKyAqIGFzc2VydGVkLgorICovCisjZGVmaW5lIFdBX0RFTEFZRURfUkVBRE9VVF9SRVZJRChyZXYpCQkoKHJldikgPCA0KQorCitzdHJ1Y3QgYWRwNTU4OF9rcGFkIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworCXVuc2lnbmVkIHNob3J0IGtleWNvZGVbQURQNTU4OF9LRVlNQVBTSVpFXTsKK307CisKK3N0YXRpYyBpbnQgYWRwNTU4OF9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlJlYWQgRXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHA1NTg4X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBhZHA1NTg4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZHA1NTg4X2twYWQgKmtwYWQgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCXN0cnVjdCBhZHA1NTg4X2twYWQsIHdvcmsud29yayk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGtwYWQtPmNsaWVudDsKKwlpbnQgaSwga2V5LCBzdGF0dXMsIGV2X2NudDsKKworCXN0YXR1cyA9IGFkcDU1ODhfcmVhZChjbGllbnQsIElOVF9TVEFUKTsKKworCWlmIChzdGF0dXMgJiBPVlJfRkxPV19JTlQpCS8qIFVubGlrZWx5IGFuZCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRXZlbnQgT3ZlcmZsb3cgRXJyb3JcbiIpOworCisJaWYgKHN0YXR1cyAmIEtFX0lOVCkgeworCQlldl9jbnQgPSBhZHA1NTg4X3JlYWQoY2xpZW50LCBLRVlfTENLX0VDX1NUQVQpICYgS0VDOworCQlpZiAoZXZfY250KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgZXZfY250OyBpKyspIHsKKwkJCQlrZXkgPSBhZHA1NTg4X3JlYWQoY2xpZW50LCBLZXlfRVZFTlRBICsgaSk7CisJCQkJaW5wdXRfcmVwb3J0X2tleShrcGFkLT5pbnB1dCwKKwkJCQkJa3BhZC0+a2V5Y29kZVsoa2V5ICYgS0VZX0VWX01BU0spIC0gMV0sCisJCQkJCWtleSAmIEtFWV9FVl9QUkVTU0VEKTsKKwkJCX0KKwkJCWlucHV0X3N5bmMoa3BhZC0+aW5wdXQpOworCQl9CisJfQorCWFkcDU1ODhfd3JpdGUoY2xpZW50LCBJTlRfU1RBVCwgc3RhdHVzKTsgLyogU3RhdHVzIGlzIFcxQyAqLworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWRwNTU4OF9pcnEoaW50IGlycSwgdm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBhZHA1NTg4X2twYWQgKmtwYWQgPSBoYW5kbGU7CisKKwkvKgorCSAqIHVzZSBrZXZlbnRkIGNvbnRleHQgdG8gcmVhZCB0aGUgZXZlbnQgZmlmbyByZWdpc3RlcnMKKwkgKiBTY2hlZHVsZSByZWFkb3V0IGF0IGxlYXN0IDI1bXMgYWZ0ZXIgbm90aWZpY2F0aW9uIGZvcgorCSAqIFJFVklEIDwgNAorCSAqLworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZrcGFkLT53b3JrLCBrcGFkLT5kZWxheSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkcDU1ODhfc2V0dXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWRwNTU4OF9rcGFkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gYWRwNTU4OF93cml0ZShjbGllbnQsIEtQX0dQSU8xLCBLUF9TRUwocGRhdGEtPnJvd3MpKTsKKwlyZXQgfD0gYWRwNTU4OF93cml0ZShjbGllbnQsIEtQX0dQSU8yLCBLUF9TRUwocGRhdGEtPmNvbHMpICYgMHhGRik7CisJcmV0IHw9IGFkcDU1ODhfd3JpdGUoY2xpZW50LCBLUF9HUElPMywgS1BfU0VMKHBkYXRhLT5jb2xzKSA+PiA4KTsKKworCWlmIChwZGF0YS0+ZW5fa2V5bG9jaykgeworCQlyZXQgfD0gYWRwNTU4OF93cml0ZShjbGllbnQsIFVOTE9DSzEsIHBkYXRhLT51bmxvY2tfa2V5MSk7CisJCXJldCB8PSBhZHA1NTg4X3dyaXRlKGNsaWVudCwgVU5MT0NLMiwgcGRhdGEtPnVubG9ja19rZXkyKTsKKwkJcmV0IHw9IGFkcDU1ODhfd3JpdGUoY2xpZW50LCBLRVlfTENLX0VDX1NUQVQsIEtfTENLX0VOKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgS0VZUF9NQVhfRVZFTlQ7IGkrKykKKwkJcmV0IHw9IGFkcDU1ODhfcmVhZChjbGllbnQsIEtleV9FVkVOVEEpOworCisJcmV0IHw9IGFkcDU1ODhfd3JpdGUoY2xpZW50LCBJTlRfU1RBVCwgQ01QMl9JTlQgfCBDTVAxX0lOVCB8CisJCQkJCU9WUl9GTE9XX0lOVCB8IEtfTENLX0lOVCB8CisJCQkJCUdQSV9JTlQgfCBLRV9JTlQpOyAvKiBTdGF0dXMgaXMgVzFDICovCisKKwlyZXQgfD0gYWRwNTU4OF93cml0ZShjbGllbnQsIENGRywgSU5UX0NGRyB8IE9WUl9GTE9XX0lFTiB8IEtFX0lFTik7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIldyaXRlIEVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRwNTU4OF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFkcDU1ODhfa3BhZCAqa3BhZDsKKwlzdHJ1Y3QgYWRwNTU4OF9rcGFkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwl1bnNpZ25lZCBpbnQgcmV2aWQ7CisJaW50IHJldCwgaTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlNNQlVTIEJ5dGUgRGF0YSBub3QgU3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFwZGF0YS0+cm93cyB8fCAhcGRhdGEtPmNvbHMgfHwgIXBkYXRhLT5rZXltYXApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJubyByb3dzLCBjb2xzIG9yIGtleW1hcCBmcm9tIHBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBkYXRhLT5rZXltYXBzaXplICE9IEFEUDU1ODhfS0VZTUFQU0laRSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQga2V5bWFwc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY2xpZW50LT5pcnEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJubyBJUlE/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJa3BhZCA9IGt6YWxsb2Moc2l6ZW9mKCprcGFkKSwgR0ZQX0tFUk5FTCk7CisJaW5wdXQgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWtwYWQgfHwgIWlucHV0KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJa3BhZC0+Y2xpZW50ID0gY2xpZW50OworCWtwYWQtPmlucHV0ID0gaW5wdXQ7CisJSU5JVF9ERUxBWUVEX1dPUksoJmtwYWQtPndvcmssIGFkcDU1ODhfd29yayk7CisKKwlyZXQgPSBhZHA1NTg4X3JlYWQoY2xpZW50LCBERVZfSUQpOworCWlmIChyZXQgPCAwKSB7CisJCWVycm9yID0gcmV0OworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlyZXZpZCA9ICh1OCkgcmV0ICYgQURQNTU4OF9ERVZJQ0VfSURfTUFTSzsKKwlpZiAoV0FfREVMQVlFRF9SRUFET1VUX1JFVklEKHJldmlkKSkKKwkJa3BhZC0+ZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDMwKTsKKworCWlucHV0LT5uYW1lID0gY2xpZW50LT5uYW1lOworCWlucHV0LT5waHlzID0gImFkcDU1ODgta2V5cy9pbnB1dDAiOworCWlucHV0LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXQsIGtwYWQpOworCisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCWlucHV0LT5pZC52ZW5kb3IgPSAweDAwMDE7CisJaW5wdXQtPmlkLnByb2R1Y3QgPSAweDAwMDE7CisJaW5wdXQtPmlkLnZlcnNpb24gPSByZXZpZDsKKworCWlucHV0LT5rZXljb2Rlc2l6ZSA9IHNpemVvZihrcGFkLT5rZXljb2RlWzBdKTsKKwlpbnB1dC0+a2V5Y29kZW1heCA9IHBkYXRhLT5rZXltYXBzaXplOworCWlucHV0LT5rZXljb2RlID0ga3BhZC0+a2V5Y29kZTsKKworCW1lbWNweShrcGFkLT5rZXljb2RlLCBwZGF0YS0+a2V5bWFwLAorCQlwZGF0YS0+a2V5bWFwc2l6ZSAqIGlucHV0LT5rZXljb2Rlc2l6ZSk7CisKKwkvKiBzZXR1cCBpbnB1dCBkZXZpY2UgKi8KKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dC0+ZXZiaXQpOworCisJaWYgKHBkYXRhLT5yZXBlYXQpCisJCV9fc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5wdXQtPmtleWNvZGVtYXg7IGkrKykKKwkJX19zZXRfYml0KGtwYWQtPmtleWNvZGVbaV0gJiBLRVlfTUFYLCBpbnB1dC0+a2V5Yml0KTsKKwlfX2NsZWFyX2JpdChLRVlfUkVTRVJWRUQsIGlucHV0LT5rZXliaXQpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGNsaWVudC0+aXJxLCBhZHA1NTg4X2lycSwKKwkJCSAgICBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfRElTQUJMRUQsCisJCQkgICAgY2xpZW50LT5kZXYuZHJpdmVyLT5uYW1lLCBrcGFkKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIGNsaWVudC0+aXJxKTsKKwkJZ290byBlcnJfdW5yZWdfZGV2OworCX0KKworCWVycm9yID0gYWRwNTU4OF9zZXR1cChjbGllbnQpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJmNsaWVudC0+ZGV2LCAxKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBrcGFkKTsKKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlJldi4lZCBrZXlwYWQsIGlycSAlZFxuIiwgcmV2aWQsIGNsaWVudC0+aXJxKTsKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2lycToKKwlmcmVlX2lycShjbGllbnQtPmlycSwga3BhZCk7CisgZXJyX3VucmVnX2RldjoKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dCk7CisJaW5wdXQgPSBOVUxMOworIGVycl9mcmVlX21lbToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7CisJa2ZyZWUoa3BhZCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkcDU1ODhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkcDU1ODhfa3BhZCAqa3BhZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJYWRwNTU4OF93cml0ZShjbGllbnQsIENGRywgMCk7CisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGtwYWQpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygma3BhZC0+d29yayk7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoa3BhZC0+aW5wdXQpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCWtmcmVlKGtwYWQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWRwNTU4OF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRwNTU4OF9rcGFkICprcGFkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGtwYWQtPmNsaWVudDsKKworCWRpc2FibGVfaXJxKGNsaWVudC0+aXJxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmtwYWQtPndvcmspOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZjbGllbnQtPmRldikpCisJCWVuYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHA1NTg4X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkcDU1ODhfa3BhZCAqa3BhZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBrcGFkLT5jbGllbnQ7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisKKwllbmFibGVfaXJxKGNsaWVudC0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgYWRwNTU4OF9kZXZfcG1fb3BzID0geworCS5zdXNwZW5kID0gYWRwNTU4OF9zdXNwZW5kLAorCS5yZXN1bWUgID0gYWRwNTU4OF9yZXN1bWUsCit9OworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHA1NTg4X2lkW10gPSB7CisJeyBLQlVJTERfTU9ETkFNRSwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZHA1NTg4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkcDU1ODhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbSAgID0gJmFkcDU1ODhfZGV2X3BtX29wcywKKyNlbmRpZgorCX0sCisJLnByb2JlICAgID0gYWRwNTU4OF9wcm9iZSwKKwkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChhZHA1NTg4X3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWRwNTU4OF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkcDU1ODhfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWRwNTU4OF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRwNTU4OF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkcDU1ODhfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZHA1NTg4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZHA1NTg4X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFA1NTg4IEtleXBhZCBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YWRwNTU4OC1rZXlzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKaW5kZXggYWRiMDllMi4uNDQ1MmVhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwpAQCAtMjMzLDYgKzIzMyw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICgqYXRrYmRfcGxhdGZvcm1fZml4dXApKHN0cnVjdCBhdGtiZCAqLCBjb25zdCB2b2lkICpkYXRhKTsKIHN0YXRpYyB2b2lkICphdGtiZF9wbGF0Zm9ybV9maXh1cF9kYXRhOworc3RhdGljIHVuc2lnbmVkIGludCAoKmF0a2JkX3BsYXRmb3JtX3NjYW5jb2RlX2ZpeHVwKShzdHJ1Y3QgYXRrYmQgKiwgdW5zaWduZWQgaW50KTsKIAogc3RhdGljIHNzaXplX3QgYXRrYmRfYXR0cl9zaG93X2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwKIAkJCQlzc2l6ZV90ICgqaGFuZGxlcikoc3RydWN0IGF0a2JkICosIGNoYXIgKikpOwpAQCAtMzkzLDYgKzM5NCw5IEBACiAKIAlpbnB1dF9ldmVudChkZXYsIEVWX01TQywgTVNDX1JBVywgY29kZSk7CiAKKwlpZiAoYXRrYmRfcGxhdGZvcm1fc2NhbmNvZGVfZml4dXApCisJCWNvZGUgPSBhdGtiZF9wbGF0Zm9ybV9zY2FuY29kZV9maXh1cChhdGtiZCwgY29kZSk7CisKIAlpZiAoYXRrYmQtPnRyYW5zbGF0ZWQpIHsKIAogCQlpZiAoYXRrYmQtPmVtdWwgfHwgYXRrYmRfbmVlZF94bGF0ZShhdGtiZC0+eGxfYml0LCBjb2RlKSkgewpAQCAtNTc0LDExICs1NzgsMjIgQEAKIAogCW11dGV4X2xvY2soJmF0a2JkLT5ldmVudF9tdXRleCk7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFUS0JEX0xFRF9FVkVOVF9CSVQsICZhdGtiZC0+ZXZlbnRfbWFzaykpCi0JCWF0a2JkX3NldF9sZWRzKGF0a2JkKTsKKwlpZiAoIWF0a2JkLT5lbmFibGVkKSB7CisJCS8qCisJCSAqIFNlcmlvIHBvcnRzIGFyZSByZXN1bWVkIGFzeW5jaHJvbm91c2x5IHNvIHdoaWxlIGRyaXZlciBjb3JlCisJCSAqIHRoaW5rcyB0aGF0IGRldmljZSBpcyBhbHJlYWR5IGZ1bGx5IG9wZXJhdGlvbmFsIGluIHJlYWxpdHkKKwkJICogaXQgbWF5IG5vdCBiZSByZWFkeSB5ZXQuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGtlZXAKKwkJICogcmVzY2hlZHVsaW5nIHRpbGwgcmVjb25uZWN0IGNvbXBsZXRlcy4KKwkJICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYXRrYmQtPmV2ZW50X3dvcmssCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBVEtCRF9MRURfRVZFTlRfQklULCAmYXRrYmQtPmV2ZW50X21hc2spKQorCQkJYXRrYmRfc2V0X2xlZHMoYXRrYmQpOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBVEtCRF9SRVBfRVZFTlRfQklULCAmYXRrYmQtPmV2ZW50X21hc2spKQotCQlhdGtiZF9zZXRfcmVwZWF0X3JhdGUoYXRrYmQpOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFUS0JEX1JFUF9FVkVOVF9CSVQsICZhdGtiZC0+ZXZlbnRfbWFzaykpCisJCQlhdGtiZF9zZXRfcmVwZWF0X3JhdGUoYXRrYmQpOworCX0KIAogCW11dGV4X3VubG9jaygmYXRrYmQtPmV2ZW50X211dGV4KTsKIH0KQEAgLTc3MCwxMyArNzg1LDEzIEBACiAJcmV0dXJuIDM7CiB9CiAKLXN0YXRpYyBpbnQgYXRrYmRfYWN0aXZhdGUoc3RydWN0IGF0a2JkICphdGtiZCkKK3N0YXRpYyBpbnQgYXRrYmRfcmVzZXRfc3RhdGUoc3RydWN0IGF0a2JkICphdGtiZCkKIHsKLQlzdHJ1Y3QgcHMyZGV2ICpwczJkZXYgPSAmYXRrYmQtPnBzMmRldjsKKyAgICAgICAgc3RydWN0IHBzMmRldiAqcHMyZGV2ID0gJmF0a2JkLT5wczJkZXY7CiAJdW5zaWduZWQgY2hhciBwYXJhbVsxXTsKIAogLyoKLSAqIFNldCB0aGUgTEVEcyB0byBhIGRlZmluZWQgc3RhdGUuCisgKiBTZXQgdGhlIExFRHMgdG8gYSBwcmVkZWZpbmVkIHN0YXRlIChhbGwgb2ZmKS4KICAqLwogCiAJcGFyYW1bMF0gPSAwOwpAQCAtNzkxLDYgKzgwNiwxMyBAQAogCWlmIChwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBBVEtCRF9DTURfU0VUUkVQKSkKIAkJcmV0dXJuIC0xOwogCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRrYmRfYWN0aXZhdGUoc3RydWN0IGF0a2JkICphdGtiZCkKK3sKKwlzdHJ1Y3QgcHMyZGV2ICpwczJkZXYgPSAmYXRrYmQtPnBzMmRldjsKKwogLyoKICAqIEVuYWJsZSB0aGUga2V5Ym9hcmQgdG8gcmVjZWl2ZSBrZXlzdHJva2VzLgogICovCkBAIC04NjksMjkgKzg5MSw2IEBACiB9OwogCiAvKgotICogSW52ZW50ZWMgc3lzdGVtIHdpdGggYnJva2VuIGtleSByZWxlYXNlIG9uIHZvbHVtZSBrZXlzCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXRrYmRfaW52ZW50ZWNfZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0gewotCTB4YWUsIDB4YjAsIC0xVQotfTsKLQotLyoKLSAqIFBlcmZvcm0gZml4dXAgZm9yIEhQIFBhdmlsaW9uIFpWNjEwMCBsYXB0b3AgdGhhdCBkb2Vzbid0IGdlbmVyYXRlIHJlbGVhc2UKLSAqIGZvciBpdHMgdm9sdW1lIGJ1dHRvbnMKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhdGtiZF9ocF96djYxMDBfZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0gewotCTB4YWUsIDB4YjAsIC0xVQotfTsKLQotLyoKLSAqIFBlcmZvcm0gZml4dXAgZm9yIEhQIChDb21wYXEpIFByZXNhcmlvIFI0MDAwIFI0MTAwIFI0MjAwIHRoYXQgZG9uJ3QgZ2VuZXJhdGUKLSAqIHJlbGVhc2UgZm9yIHRoZWlyIHZvbHVtZSBidXR0b25zCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXRrYmRfaHBfcjQwMDBfZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0gewotCTB4YWUsIDB4YjAsIC0xVQotfTsKLQotLyoKICAqIFNhbXN1bmcgTkMxMCxOQzIwIHdpdGggRm4rRj8ga2V5IHJlbGVhc2Ugbm90IHdvcmtpbmcKICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBhdGtiZF9zYW1zdW5nX2ZvcmNlZF9yZWxlYXNlX2tleXNbXSA9IHsKQEAgLTg5OSwxNCArODk4LDYgQEAKIH07CiAKIC8qCi0gKiBUaGUgdm9sdW1lIHVwIGFuZCB2b2x1bWUgZG93biBzcGVjaWFsIGtleXMgb24gYSBGdWppdHN1IEFtaWxvIFBBIDE1MTAgbGFwdG9wCi0gKiBkbyBub3QgZ2VuZXJhdGUgcmVsZWFzZSBldmVudHMgc28gd2UgaGF2ZSB0byBkbyBpdCBvdXJzZWx2ZXMuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXRrYmRfYW1pbG9fcGExNTEwX2ZvcmNlZF9yZWxlYXNlX2tleXNbXSA9IHsKLQkweGIwLCAweGFlLCAtMVUKLX07Ci0KLS8qCiAgKiBBbWlsbyBQaSAzNTI1IGtleSByZWxlYXNlIGZvciBGbitWb2x1bWUga2V5cyBub3Qgd29ya2luZwogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGF0a2JkX2FtaWxvX3BpMzUyNV9mb3JjZWRfcmVsZWFzZV9rZXlzW10gPSB7CkBAIC05MjgsNiArOTE5LDMwIEBACiB9OwogCiAvKgorICogTWFueSBub3RlYm9va3MgZG9uJ3Qgc2VuZCBrZXkgcmVsZWFzZSBldmVudCBmb3Igdm9sdW1lIHVwL2Rvd24KKyAqIGtleXMsIHdpdGgga2V5IGxpc3QgYmVsb3cgY29tbW9uIGFtb25nIHRoZW0KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0geworCTB4YWUsIDB4YjAsIC0xVQorfTsKKworLyoKKyAqIE9RTyAwMSsgbXVsdGltZWRpYSBrZXlzICg2NC0tNjYpIGdlbmVyYXRlIGUwIDZ4IHVwb24gcmVsZWFzZSB3aGVyZWFzCisgKiB0aGV5IHNob3VsZCBiZSBnZW5lcmF0aW5nIGU0LWU2ICgweDgwIHwgY29kZSkuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRrYmRfb3FvXzAxcGx1c19zY2FuY29kZV9maXh1cChzdHJ1Y3QgYXRrYmQgKmF0a2JkLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCBjb2RlKQoreworCWlmIChhdGtiZC0+dHJhbnNsYXRlZCAmJiBhdGtiZC0+ZW11bCA9PSAxICYmCisJICAgIChjb2RlID09IDB4NjQgfHwgY29kZSA9PSAweDY1IHx8IGNvZGUgPT0gMHg2NikpIHsKKwkJYXRrYmQtPmVtdWwgPSAwOworCQljb2RlIHw9IDB4ODA7CisJfQorCisJcmV0dXJuIGNvZGU7Cit9CisKKy8qCiAgKiBhdGtiZF9zZXRfa2V5Y29kZV90YWJsZSgpIGluaXRpYWxpemVzIGtleWJvYXJkJ3Mga2V5Y29kZSB0YWJsZQogICogYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBzY2FuY29kZSBzZXQKICAqLwpAQCAtMTEwNCw2ICsxMTE5LDcgQEAKIAkJfQogCiAJCWF0a2JkLT5zZXQgPSBhdGtiZF9zZWxlY3Rfc2V0KGF0a2JkLCBhdGtiZF9zZXQsIGF0a2JkX2V4dHJhKTsKKwkJYXRrYmRfcmVzZXRfc3RhdGUoYXRrYmQpOwogCQlhdGtiZF9hY3RpdmF0ZShhdGtiZCk7CiAKIAl9IGVsc2UgewpAQCAtMTE1OCwxNCArMTE3NCw2IEBACiAJCQlyZXR1cm4gLTE7CiAKIAkJYXRrYmRfYWN0aXZhdGUoYXRrYmQpOwotCi0vKgotICogUmVzdG9yZSByZXBlYXQgcmF0ZSBhbmQgTEVEcyAodGhhdCB3ZXJlIHJlc2V0IGJ5IGF0a2JkX2FjdGl2YXRlKQotICogdG8gcHJlLXJlc3VtZSBzdGF0ZQotICovCi0JCWlmICghYXRrYmQtPnNvZnRyZXBlYXQpCi0JCQlhdGtiZF9zZXRfcmVwZWF0X3JhdGUoYXRrYmQpOwotCQlhdGtiZF9zZXRfbGVkcyhhdGtiZCk7CiAJfQogCiAJYXRrYmRfZW5hYmxlKGF0a2JkKTsKQEAgLTEyOTIsNiArMTMwMCw3IEBACiAKIAkJYXRrYmQtPmRldiA9IG5ld19kZXY7CiAJCWF0a2JkLT5zZXQgPSBhdGtiZF9zZWxlY3Rfc2V0KGF0a2JkLCBhdGtiZC0+c2V0LCB2YWx1ZSk7CisJCWF0a2JkX3Jlc2V0X3N0YXRlKGF0a2JkKTsKIAkJYXRrYmRfYWN0aXZhdGUoYXRrYmQpOwogCQlhdGtiZF9zZXRfa2V5Y29kZV90YWJsZShhdGtiZCk7CiAJCWF0a2JkX3NldF9kZXZpY2VfYXR0cnMoYXRrYmQpOwpAQCAtMTUzOCw2ICsxNTQ3LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IGF0a2JkX3NldHVwX3NjYW5jb2RlX2ZpeHVwKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlhdGtiZF9wbGF0Zm9ybV9zY2FuY29kZV9maXh1cCA9IGlkLT5kcml2ZXJfZGF0YTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgYXRrYmRfZG1pX3F1aXJrX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKIAl7CiAJCS5pZGVudCA9ICJEZWxsIExhcHRvcCIsCkBAIC0xNTczLDcgKzE1ODksNyBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQYXZpbGlvbiBaVjYxMDAiKSwKIAkJfSwKIAkJLmNhbGxiYWNrID0gYXRrYmRfc2V0dXBfZm9yY2VkX3JlbGVhc2UsCi0JCS5kcml2ZXJfZGF0YSA9IGF0a2JkX2hwX3p2NjEwMF9mb3JjZWRfcmVsZWFzZV9rZXlzLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKIAkJLmlkZW50ID0gIkhQIFByZXNhcmlvIFI0MDAwIiwKQEAgLTE1ODIsNyArMTU5OCw3IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlByZXNhcmlvIFI0MDAwIiksCiAJCX0sCiAJCS5jYWxsYmFjayA9IGF0a2JkX3NldHVwX2ZvcmNlZF9yZWxlYXNlLAotCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9ocF9yNDAwMF9mb3JjZWRfcmVsZWFzZV9rZXlzLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKIAkJLmlkZW50ID0gIkhQIFByZXNhcmlvIFI0MTAwIiwKQEAgLTE1OTEsNyArMTYwNyw3IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlByZXNhcmlvIFI0MTAwIiksCiAJCX0sCiAJCS5jYWxsYmFjayA9IGF0a2JkX3NldHVwX2ZvcmNlZF9yZWxlYXNlLAotCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9ocF9yNDAwMF9mb3JjZWRfcmVsZWFzZV9rZXlzLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKIAkJLmlkZW50ID0gIkhQIFByZXNhcmlvIFI0MjAwIiwKQEAgLTE2MDAsNyArMTYxNiw3IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlByZXNhcmlvIFI0MjAwIiksCiAJCX0sCiAJCS5jYWxsYmFjayA9IGF0a2JkX3NldHVwX2ZvcmNlZF9yZWxlYXNlLAotCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9ocF9yNDAwMF9mb3JjZWRfcmVsZWFzZV9rZXlzLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKIAkJLmlkZW50ID0gIkludmVudGVjIFN5bXBob255IiwKQEAgLTE2MDksNyArMTYyNSw3IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlNZTVBIT05ZIDYuMC83LjAiKSwKIAkJfSwKIAkJLmNhbGxiYWNrID0gYXRrYmRfc2V0dXBfZm9yY2VkX3JlbGVhc2UsCi0JCS5kcml2ZXJfZGF0YSA9IGF0a2JkX2ludmVudGVjX2ZvcmNlZF9yZWxlYXNlX2tleXMsCisJCS5kcml2ZXJfZGF0YSA9IGF0a2JkX3ZvbHVtZV9mb3JjZWRfcmVsZWFzZV9rZXlzLAogCX0sCiAJewogCQkuaWRlbnQgPSAiU2Ftc3VuZyBOQzEwIiwKQEAgLTE2NDUsNyArMTY2MSw3IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFNSUxPIFBhIDE1MTAiKSwKIAkJfSwKIAkJLmNhbGxiYWNrID0gYXRrYmRfc2V0dXBfZm9yY2VkX3JlbGVhc2UsCi0JCS5kcml2ZXJfZGF0YSA9IGF0a2JkX2FtaWxvX3BhMTUxMF9mb3JjZWRfcmVsZWFzZV9rZXlzLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF92b2x1bWVfZm9yY2VkX3JlbGVhc2Vfa2V5cywKIAl9LAogCXsKIAkJLmlkZW50ID0gIkZ1aml0c3UgQW1pbG8gUGkgMzUyNSIsCkBAIC0xNjc0LDYgKzE2OTAsMTUgQEAKIAkJLmNhbGxiYWNrID0gYXRrYmRfc2V0dXBfZm9yY2VkX3JlbGVhc2UsCiAJCS5kcml2ZXJfZGF0YSA9IGF0a2RiX3NvbHRlY2hfdGExMl9mb3JjZWRfcmVsZWFzZV9rZXlzLAogCX0sCisJeworCQkuaWRlbnQgPSAiT1FPIE1vZGVsIDAxKyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiT1FPIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlpFUFRPIiksCisJCX0sCisJCS5jYWxsYmFjayA9IGF0a2JkX3NldHVwX3NjYW5jb2RlX2ZpeHVwLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9vcW9fMDFwbHVzX3NjYW5jb2RlX2ZpeHVwLAorCX0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwppbmRleCBhODhhZmYzLi43N2QxMzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKQEAgLTE0Nyw2ICsxNDcsNyBAQAogCQl9CiAKIAkJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIGdwaW9fa2V5c19pc3IsCisJCQkJICAgIElSUUZfU0hBUkVEIHwKIAkJCQkgICAgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAogCQkJCSAgICBidXR0b24tPmRlc2MgPyBidXR0b24tPmRlc2MgOiAiZ3Bpb19rZXlzIiwKIAkJCQkgICAgYmRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaGlsa2JkLmMKaW5kZXggZTlkNjM5ZS4uNWY3MjQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2hpbGtiZC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlsLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2lmZGVmIENPTkZJR19IUDMwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXg3MzU5X2tleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXg3MzU5X2tleXBhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNWI5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL21heDczNTlfa2V5cGFkLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBtYXg3MzU5X2tleXBhZC5jIC0gTUFYNzM1OSBLZXkgU3dpdGNoIENvbnRyb2xsZXIgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIEtpbSBLeXV3b24gPHExLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBweGEyN3hfa2V5cGFkLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERhdGFzaGVldDogaHR0cDovL3d3dy5tYXhpbS1pYy5jb20vcXVpY2tfdmlldzIuY2ZtL3F2X3BrLzU0NTYKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CisKKyNkZWZpbmUgTUFYNzM1OV9NQVhfS0VZX1JPV1MJOAorI2RlZmluZSBNQVg3MzU5X01BWF9LRVlfQ09MUwk4CisjZGVmaW5lIE1BWDczNTlfTUFYX0tFWV9OVU0JKE1BWDczNTlfTUFYX0tFWV9ST1dTICogTUFYNzM1OV9NQVhfS0VZX0NPTFMpCisjZGVmaW5lIE1BWDczNTlfUk9XX1NISUZUCTMKKworLyoKKyAqIE1BWDczNTkgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgTUFYNzM1OV9SRUdfS0VZRklGTwkweDAwCisjZGVmaW5lIE1BWDczNTlfUkVHX0NPTkZJRwkweDAxCisjZGVmaW5lIE1BWDczNTlfUkVHX0RFQk9VTkNFCTB4MDIKKyNkZWZpbmUgTUFYNzM1OV9SRUdfSU5URVJSVVBUCTB4MDMKKyNkZWZpbmUgTUFYNzM1OV9SRUdfUE9SVFMJMHgwNAorI2RlZmluZSBNQVg3MzU5X1JFR19LRVlSRVAJMHgwNQorI2RlZmluZSBNQVg3MzU5X1JFR19TTEVFUAkweDA2CisKKy8qCisgKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJpdHMKKyAqLworI2RlZmluZSBNQVg3MzU5X0NGR19TTEVFUAkoMSA8PCA3KQorI2RlZmluZSBNQVg3MzU5X0NGR19JTlRFUlJVUFQJKDEgPDwgNSkKKyNkZWZpbmUgTUFYNzM1OV9DRkdfS0VZX1JFTEVBU0UJKDEgPDwgMykKKyNkZWZpbmUgTUFYNzM1OV9DRkdfV0FLRVVQCSgxIDw8IDEpCisjZGVmaW5lIE1BWDczNTlfQ0ZHX1RJTUVPVVQJKDEgPDwgMCkKKworLyoKKyAqIEF1dG9zbGVlcCByZWdpc3RlciB2YWx1ZXMgKG1zKQorICovCisjZGVmaW5lIE1BWDczNTlfQVVUT1NMRUVQXzgxOTIJMHgwMQorI2RlZmluZSBNQVg3MzU5X0FVVE9TTEVFUF80MDk2CTB4MDIKKyNkZWZpbmUgTUFYNzM1OV9BVVRPU0xFRVBfMjA0OAkweDAzCisjZGVmaW5lIE1BWDczNTlfQVVUT1NMRUVQXzEwMjQJMHgwNAorI2RlZmluZSBNQVg3MzU5X0FVVE9TTEVFUF81MTIJMHgwNQorI2RlZmluZSBNQVg3MzU5X0FVVE9TTEVFUF8yNTYJMHgwNgorCitzdHJ1Y3QgbWF4NzM1OV9rZXlwYWQgeworCS8qIG1hdHJpeCBrZXkgY29kZSBtYXAgKi8KKwl1bnNpZ25lZCBzaG9ydCBrZXljb2Rlc1tNQVg3MzU5X01BWF9LRVlfTlVNXTsKKworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworfTsKKworc3RhdGljIGludCBtYXg3MzU5X3dyaXRlX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsKTsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWcgMHgleCwgdmFsIDB4JXgsIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZWcsIHZhbCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDczNTlfcmVhZF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHJlZykKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWcgMHgleCwgZXJyICVkXG4iLAorCQkJX19mdW5jX18sIHJlZywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtYXg3MzU5X2J1aWxkX2tleWNvZGUoc3RydWN0IG1heDczNTlfa2V5cGFkICprZXlwYWQsCisJCQkJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSAqa2V5bWFwX2RhdGEpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0ga2V5cGFkLT5pbnB1dF9kZXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwga2V5bWFwX2RhdGEtPmtleW1hcF9zaXplOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGtleSA9IGtleW1hcF9kYXRhLT5rZXltYXBbaV07CisJCXVuc2lnbmVkIGludCByb3cgPSBLRVlfUk9XKGtleSk7CisJCXVuc2lnbmVkIGludCBjb2wgPSBLRVlfQ09MKGtleSk7CisJCXVuc2lnbmVkIGludCBzY2FuY29kZSA9IE1BVFJJWF9TQ0FOX0NPREUocm93LCBjb2wsCisJCQkJCQlNQVg3MzU5X1JPV19TSElGVCk7CisJCXVuc2lnbmVkIHNob3J0IGtleWNvZGUgPSBLRVlfVkFMKGtleSk7CisKKwkJa2V5cGFkLT5rZXljb2Rlc1tzY2FuY29kZV0gPSBrZXljb2RlOworCQlfX3NldF9iaXQoa2V5Y29kZSwgaW5wdXRfZGV2LT5rZXliaXQpOworCX0KKwlfX2NsZWFyX2JpdChLRVlfUkVTRVJWRUQsIGlucHV0X2Rldi0+a2V5Yml0KTsKK30KKworLyogcnVucyBpbiBhbiBJUlEgdGhyZWFkIC0tIGNhbiAoYW5kIHdpbGwhKSBzbGVlcCAqLworc3RhdGljIGlycXJldHVybl90IG1heDczNTlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbWF4NzM1OV9rZXlwYWQgKmtleXBhZCA9IGRldl9pZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBrZXlwYWQtPmlucHV0X2RldjsKKwlpbnQgdmFsLCByb3csIGNvbCwgcmVsZWFzZSwgY29kZTsKKworCXZhbCA9IG1heDczNTlfcmVhZF9yZWcoa2V5cGFkLT5jbGllbnQsIE1BWDczNTlfUkVHX0tFWUZJRk8pOworCXJvdyA9IHZhbCAmIDB4NzsKKwljb2wgPSAodmFsID4+IDMpICYgMHg3OworCXJlbGVhc2UgPSB2YWwgJiAweDQwOworCisJY29kZSA9IE1BVFJJWF9TQ0FOX0NPREUocm93LCBjb2wsIE1BWDczNTlfUk9XX1NISUZUKTsKKworCWRldl9kYmcoJmtleXBhZC0+Y2xpZW50LT5kZXYsCisJCSJrZXlbJWQ6JWRdICVzXG4iLCByb3csIGNvbCwgcmVsZWFzZSA/ICJyZWxlYXNlIiA6ICJwcmVzcyIpOworCisJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLCBjb2RlKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2Rldiwga2V5cGFkLT5rZXljb2Rlc1tjb2RlXSwgIXJlbGVhc2UpOworCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIExldCBNQVg3MzU5IGZhbGwgaW50byBhIGRlZXAgc2xlZXA6CisgKiBJZiBubyBrZXlzIGFyZSBwcmVzc2VkLCBlbnRlciBzbGVlcCBtb2RlIGZvciA4MTkyIG1zLiBBbmQgaWYgYW55CisgKiBrZXkgaXMgcHJlc3NlZCwgdGhlIE1BWDczNTkgcmV0dXJucyB0byBub3JtYWwgb3BlcmF0aW5nIG1vZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXg3MzU5X2ZhbGxfZGVlcHNsZWVwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJbWF4NzM1OV93cml0ZV9yZWcoY2xpZW50LCBNQVg3MzU5X1JFR19TTEVFUCwgTUFYNzM1OV9BVVRPU0xFRVBfODE5Mik7Cit9CisKKy8qCisgKiBMZXQgTUFYNzM1OSB0YWtlIGEgY2F0bmFwOgorICogQXV0b3NsZWVwIGp1c3QgZm9yIDI1NiBtcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1heDczNTlfdGFrZV9jYXRuYXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwltYXg3MzU5X3dyaXRlX3JlZyhjbGllbnQsIE1BWDczNTlfUkVHX1NMRUVQLCBNQVg3MzU5X0FVVE9TTEVFUF8yNTYpOworfQorCitzdGF0aWMgaW50IG1heDczNTlfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IG1heDczNTlfa2V5cGFkICprZXlwYWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJbWF4NzM1OV90YWtlX2NhdG5hcChrZXlwYWQtPmNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWF4NzM1OV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IG1heDczNTlfa2V5cGFkICprZXlwYWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJbWF4NzM1OV9mYWxsX2RlZXBzbGVlcChrZXlwYWQtPmNsaWVudCk7Cit9CisKK3N0YXRpYyB2b2lkIG1heDczNTlfaW5pdGlhbGl6ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCW1heDczNTlfd3JpdGVfcmVnKGNsaWVudCwgTUFYNzM1OV9SRUdfQ09ORklHLAorCQlNQVg3MzU5X0NGR19JTlRFUlJVUFQgfCAvKiBJcnEgY2xlYXJzIGFmdGVyIGhvc3QgcmVhZCAqLworCQlNQVg3MzU5X0NGR19LRVlfUkVMRUFTRSB8IC8qIEtleSByZWxlYXNlIGVuYWJsZSAqLworCQlNQVg3MzU5X0NGR19XQUtFVVApOyAvKiBLZXkgcHJlc3Mgd2FrZXVwIGVuYWJsZSAqLworCisJLyogRnVsbCBrZXktc2NhbiBmdW5jdGlvbmFsaXR5ICovCisJbWF4NzM1OV93cml0ZV9yZWcoY2xpZW50LCBNQVg3MzU5X1JFR19ERUJPVU5DRSwgMHgxRik7CisKKwkvKiBuSU5UIGFzc2VydHMgZXZlcnkgZGVib3VuY2UgY3ljbGVzICovCisJbWF4NzM1OV93cml0ZV9yZWcoY2xpZW50LCBNQVg3MzU5X1JFR19JTlRFUlJVUFQsIDB4MDEpOworCisJbWF4NzM1OV9mYWxsX2RlZXBzbGVlcChjbGllbnQpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYXg3MzU5X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwljb25zdCBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhICprZXltYXBfZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG1heDczNTlfa2V5cGFkICprZXlwYWQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCByZXQ7CisJaW50IGVycm9yOworCisJaWYgKCFjbGllbnQtPmlycSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlRoZSBpcnEgbnVtYmVyIHNob3VsZCBub3QgYmUgemVyb1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIERldGVjdCBNQVg3MzU5OiBUaGUgaW5pdGlhbCBLZXlzIEZJRk8gdmFsdWUgaXMgJzB4M0YnICovCisJcmV0ID0gbWF4NzM1OV9yZWFkX3JlZyhjbGllbnQsIE1BWDczNTlfUkVHX0tFWUZJRk8pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGRldGVjdCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgImtleXMgRklGTyBpcyAweCUwMnhcbiIsIHJldCk7CisKKwlrZXlwYWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4NzM1OV9rZXlwYWQpLCBHRlBfS0VSTkVMKTsKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWtleXBhZCB8fCAhaW5wdXRfZGV2KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfZnJlZV9tZW07CisJfQorCisJa2V5cGFkLT5jbGllbnQgPSBjbGllbnQ7CisJa2V5cGFkLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSBjbGllbnQtPm5hbWU7CisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKKwlpbnB1dF9kZXYtPm9wZW4gPSBtYXg3MzU5X29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IG1heDczNTlfY2xvc2U7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCisJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9SRVApOworCWlucHV0X2Rldi0+a2V5Y29kZXNpemUgPSBzaXplb2Yoa2V5cGFkLT5rZXljb2Rlc1swXSk7CisJaW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShrZXlwYWQtPmtleWNvZGVzKTsKKwlpbnB1dF9kZXYtPmtleWNvZGUgPSBrZXlwYWQtPmtleWNvZGVzOworCisJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOKTsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIGtleXBhZCk7CisKKwltYXg3MzU5X2J1aWxkX2tleWNvZGUoa2V5cGFkLCBrZXltYXBfZGF0YSk7CisKKwllcnJvciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGNsaWVudC0+aXJxLCBOVUxMLCBtYXg3MzU5X2ludGVycnVwdCwKKwkJCQkgICAgIElSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsCisJCQkJICAgICBjbGllbnQtPm5hbWUsIGtleXBhZCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGludGVycnVwdFxuIik7CisJCWdvdG8gZmFpbGVkX2ZyZWVfbWVtOworCX0KKworCS8qIFJlZ2lzdGVyIHRoZSBpbnB1dCBkZXZpY2UgKi8KKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlnb3RvIGZhaWxlZF9mcmVlX2lycTsKKwl9CisKKwkvKiBJbml0aWFsaXplIE1BWDczNTkgKi8KKwltYXg3MzU5X2luaXRpYWxpemUoY2xpZW50KTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGtleXBhZCk7CisJZGV2aWNlX2luaXRfd2FrZXVwKCZjbGllbnQtPmRldiwgMSk7CisKKwlyZXR1cm4gMDsKKworZmFpbGVkX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBrZXlwYWQpOworZmFpbGVkX2ZyZWVfbWVtOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoa2V5cGFkKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1heDczNTlfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1heDczNTlfa2V5cGFkICprZXlwYWQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBrZXlwYWQpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGtleXBhZC0+aW5wdXRfZGV2KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwlrZnJlZShrZXlwYWQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbWF4NzM1OV9zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCW1heDczNTlfZmFsbF9kZWVwc2xlZXAoY2xpZW50KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmY2xpZW50LT5kZXYpKQorCQllbmFibGVfaXJxX3dha2UoY2xpZW50LT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4NzM1OV9yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisKKwkvKiBSZXN0b3JlIHRoZSBkZWZhdWx0IHNldHRpbmcgKi8KKwltYXg3MzU5X3Rha2VfY2F0bmFwKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIG1heDczNTlfc3VzcGVuZAlOVUxMCisjZGVmaW5lIG1heDczNTlfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4NzM1OV9pZHNbXSA9IHsKKwl7ICJtYXg3MzU5IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXg3MzU5X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg3MzU5X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibWF4NzM1OSIsCisJfSwKKwkucHJvYmUJCT0gbWF4NzM1OV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1heDczNTlfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IG1heDczNTlfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG1heDczNTlfcmVzdW1lLAorCS5pZF90YWJsZQk9IG1heDczNTlfaWRzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWF4NzM1OV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtYXg3MzU5X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQobWF4NzM1OV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1heDczNTlfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtYXg3MzU5X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobWF4NzM1OV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiS2ltIEt5dXdvbiA8cTEua2ltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVg3MzU5IEtleSBTd2l0Y2ggQ29udHJvbGxlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb3BlbmNvcmVzLWtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vcGVuY29yZXMta2JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjY2NkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb3BlbmNvcmVzLWtiZC5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogT3BlbkNvcmVzIEtleWJvYXJkIENvbnRyb2xsZXIgRHJpdmVyCisgKiBodHRwOi8vd3d3Lm9wZW5jb3Jlcy5vcmcvcHJvamVjdCxrZXlib2FyZGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEhWIFNpc3RlbWFzIFMuTC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworc3RydWN0IG9wZW5jb3Jlc19rYmQgeworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCXN0cnVjdCByZXNvdXJjZSAqYWRkcl9yZXM7CisJdm9pZCBfX2lvbWVtICphZGRyOworCWludCBpcnE7CisJdW5zaWduZWQgc2hvcnQga2V5Y29kZXNbMTI4XTsKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBvcGVuY29yZXNfa2JkX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG9wZW5jb3Jlc19rYmQgKm9wZW5jb3Jlc19rYmQgPSBkZXZfaWQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBvcGVuY29yZXNfa2JkLT5pbnB1dDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwljID0gcmVhZGIob3BlbmNvcmVzX2tiZC0+YWRkcik7CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgYyAmIDB4N2YsIGMgJiAweDgwID8gMCA6IDEpOworCWlucHV0X3N5bmMoaW5wdXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvcGVuY29yZXNfa2JkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IG9wZW5jb3Jlc19rYmQgKm9wZW5jb3Jlc19rYmQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycSwgaSwgZXJyb3I7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgYm9hcmQgbWVtb3J5IHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIGJvYXJkIElSUSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9wZW5jb3Jlc19rYmQgPSBremFsbG9jKHNpemVvZigqb3BlbmNvcmVzX2tiZCksIEdGUF9LRVJORUwpOworCWlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFvcGVuY29yZXNfa2JkIHx8ICFpbnB1dCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIHN0cnVjdHVyZXNcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCW9wZW5jb3Jlc19rYmQtPmFkZHJfcmVzID0gcmVzOworCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IEkvTyBtZW1vcnlcbiIpOworCQllcnJvciA9IC1FQlVTWTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJb3BlbmNvcmVzX2tiZC0+YWRkciA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIW9wZW5jb3Jlc19rYmQtPmFkZHIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlbWFwIEkvTyBtZW1vcnlcbiIpOworCQllcnJvciA9IC1FTlhJTzsKKwkJZ290byBlcnJfcmVsX21lbTsKKwl9CisKKwlvcGVuY29yZXNfa2JkLT5pbnB1dCA9IGlucHV0OworCW9wZW5jb3Jlc19rYmQtPmlycSA9IGlycTsKKworCWlucHV0LT5uYW1lID0gcGRldi0+bmFtZTsKKwlpbnB1dC0+cGh5cyA9ICJvcGVuY29yZXMta2JkL2lucHV0MCI7CisJaW5wdXQtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXQsIG9wZW5jb3Jlc19rYmQpOworCisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dC0+aWQudmVuZG9yID0gMHgwMDAxOworCWlucHV0LT5pZC5wcm9kdWN0ID0gMHgwMDAxOworCWlucHV0LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCisJaW5wdXQtPmtleWNvZGUgPSBvcGVuY29yZXNfa2JkLT5rZXljb2RlczsKKwlpbnB1dC0+a2V5Y29kZXNpemUgPSBzaXplb2Yob3BlbmNvcmVzX2tiZC0+a2V5Y29kZXNbMF0pOworCWlucHV0LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShvcGVuY29yZXNfa2JkLT5rZXljb2Rlcyk7CisKKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dC0+ZXZiaXQpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3BlbmNvcmVzX2tiZC0+a2V5Y29kZXMpOyBpKyspIHsKKwkJLyoKKwkJICogT3BlbkNvcmVzIGNvbnRyb2xsZXIgaGFwcGVucyB0byBoYXZlIHNjYW5jb2RlcyBtYXRjaAorCQkgKiBvdXIgS0VZXyogZGVmaW5pdGlvbnMuCisJCSAqLworCQlvcGVuY29yZXNfa2JkLT5rZXljb2Rlc1tpXSA9IGk7CisJCV9fc2V0X2JpdChvcGVuY29yZXNfa2JkLT5rZXljb2Rlc1tpXSwgaW5wdXQtPmtleWJpdCk7CisJfQorCV9fY2xlYXJfYml0KEtFWV9SRVNFUlZFRCwgaW5wdXQtPmtleWJpdCk7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgJm9wZW5jb3Jlc19rYmRfaXNyLAorCQkJICAgIElSUUZfVFJJR0dFUl9SSVNJTkcsIHBkZXYtPm5hbWUsIG9wZW5jb3Jlc19rYmQpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gY2xhaW0gaXJxICVkXG4iLCBpcnEpOworCQlnb3RvIGVycl91bm1hcF9tZW07CisJfQorCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgb3BlbmNvcmVzX2tiZCk7CisKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2lycToKKwlmcmVlX2lycShpcnEsIG9wZW5jb3Jlc19rYmQpOworIGVycl91bm1hcF9tZW06CisJaW91bm1hcChvcGVuY29yZXNfa2JkLT5hZGRyKTsKKyBlcnJfcmVsX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKyBlcnJfZnJlZV9tZW06CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOworCWtmcmVlKG9wZW5jb3Jlc19rYmQpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBvcGVuY29yZXNfa2JkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvcGVuY29yZXNfa2JkICpvcGVuY29yZXNfa2JkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlmcmVlX2lycShvcGVuY29yZXNfa2JkLT5pcnEsIG9wZW5jb3Jlc19rYmQpOworCisJaW91bm1hcChvcGVuY29yZXNfa2JkLT5hZGRyKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ob3BlbmNvcmVzX2tiZC0+YWRkcl9yZXMtPnN0YXJ0LAorCQlyZXNvdXJjZV9zaXplKG9wZW5jb3Jlc19rYmQtPmFkZHJfcmVzKSk7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uob3BlbmNvcmVzX2tiZC0+aW5wdXQpOworCWtmcmVlKG9wZW5jb3Jlc19rYmQpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb3BlbmNvcmVzX2tiZF9kZXZpY2VfZHJpdmVyID0geworCS5wcm9iZSAgICA9IG9wZW5jb3Jlc19rYmRfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3Aob3BlbmNvcmVzX2tiZF9yZW1vdmUpLAorCS5kcml2ZXIgICA9IHsKKwkJLm5hbWUgPSAib3BlbmNvcmVzLWtiZCIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9wZW5jb3Jlc19rYmRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9wZW5jb3Jlc19rYmRfZGV2aWNlX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChvcGVuY29yZXNfa2JkX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgb3BlbmNvcmVzX2tiZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9wZW5jb3Jlc19rYmRfZGV2aWNlX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChvcGVuY29yZXNfa2JkX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKYXZpZXIgSGVycmVybyA8amhlcnJlcm9AaHZzaXN0ZW1hcy5lcz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiS2V5Ym9hcmQgZHJpdmVyIGZvciBPcGVuQ29yZXMgS2V5Ym9hcmQgQ29udHJvbGxlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9xdDIxNjAuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcXQyMTYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxY2M1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcXQyMTYwLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiAgcXQyMTYwLmMgLSBBdG1lbCBBVDQyUVQyMTYwIFRvdWNoIFNlbnNlIENvbnRyb2xsZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IFJhcGhhZWwgRGVyb3NzbyBQZXJlaXJhIDxyYXBoYWVscGVyZWlyYUBnbWFpbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2RlZmluZSBRVDIxNjBfVkFMSURfQ0hJUElEICAweDExCisKKyNkZWZpbmUgUVQyMTYwX0NNRF9DSElQSUQgICAgIDAKKyNkZWZpbmUgUVQyMTYwX0NNRF9DT0RFVkVSICAgIDEKKyNkZWZpbmUgUVQyMTYwX0NNRF9HU1RBVCAgICAgIDIKKyNkZWZpbmUgUVQyMTYwX0NNRF9LRVlTMyAgICAgIDMKKyNkZWZpbmUgUVQyMTYwX0NNRF9LRVlTNCAgICAgIDQKKyNkZWZpbmUgUVQyMTYwX0NNRF9TTElERSAgICAgIDUKKyNkZWZpbmUgUVQyMTYwX0NNRF9HUElPUyAgICAgIDYKKyNkZWZpbmUgUVQyMTYwX0NNRF9TVUJWRVIgICAgIDcKKyNkZWZpbmUgUVQyMTYwX0NNRF9DQUxJQlJBVEUgIDEwCisKKyNkZWZpbmUgUVQyMTYwX0NZQ0xFX0lOVEVSVkFMCSgyKkhaKQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBxdDIxNjBfa2V5MmNvZGVbXSA9IHsKKwlLRVlfMCwgS0VZXzEsIEtFWV8yLCBLRVlfMywKKwlLRVlfNCwgS0VZXzUsIEtFWV82LCBLRVlfNywKKwlLRVlfOCwgS0VZXzksIEtFWV9BLCBLRVlfQiwKKwlLRVlfQywgS0VZX0QsIEtFWV9FLCBLRVlfRiwKK307CisKK3N0cnVjdCBxdDIxNjBfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrOworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgIC8qIFByb3RlY3RzIGNhbmNlbGluZy9yZXNjaGVkdWxpbmcgb2YgZHdvcmsgKi8KKwl1bnNpZ25lZCBzaG9ydCBrZXljb2Rlc1tBUlJBWV9TSVpFKHF0MjE2MF9rZXkyY29kZSldOworCXUxNiBrZXlfbWF0cml4OworfTsKKworc3RhdGljIGludCBxdDIxNjBfcmVhZF9ibG9jayhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICB1OCBpbmlyZWcsIHU4ICpidWZmZXIsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgZXJyb3IsIGlkeCA9IDA7CisKKwkvKgorCSAqIENhbid0IHVzZSBTTUJ1cyBibG9jayBkYXRhIHJlYWQuIENoZWNrIGZvciBJMkMgZnVuY3Rpb25hbGl0eSB0byBzcGVlZAorCSAqIHRoaW5ncyB1cCB3aGVuZXZlciBwb3NzaWJsZS4gT3RoZXJ3aXNlIHdlIHdpbGwgYmUgZm9yY2VkIHRvIHJlYWQKKwkgKiBzZXF1ZW50aWFsbHkuCisJICovCisJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkJeworCisJCWVycm9yID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBpbmlyZWcgKyBpZHgpOworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJjb3VsZG4ndCBzZW5kIHJlcXVlc3QuIFJldHVybmVkICVkXG4iLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQllcnJvciA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZmZlciwgY291bnQpOworCQlpZiAoZXJyb3IgIT0gY291bnQpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJjb3VsZG4ndCByZWFkIHJlZ2lzdGVycy4gUmV0dXJuZWQgJWQgYnl0ZXNcbiIsIGVycm9yKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0gZWxzZSB7CisKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWludCBkYXRhOworCisJCQllcnJvciA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgaW5pcmVnICsgaWR4KTsKKwkJCWlmIChlcnJvcikgeworCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCQkiY291bGRuJ3Qgc2VuZCByZXF1ZXN0LiBSZXR1cm5lZCAlZFxuIiwgZXJyb3IpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKworCQkJZGF0YSA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKKwkJCWlmIChkYXRhIDwgMCkgeworCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCQkiY291bGRuJ3QgcmVhZCByZWdpc3Rlci4gUmV0dXJuZWQgJWRcbiIsIGRhdGEpOworCQkJCXJldHVybiBkYXRhOworCQkJfQorCisJCQlidWZmZXJbaWR4KytdID0gZGF0YTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF0MjE2MF9nZXRfa2V5X21hdHJpeChzdHJ1Y3QgcXQyMTYwX2RhdGEgKnF0MjE2MCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gcXQyMTYwLT5jbGllbnQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBxdDIxNjAtPmlucHV0OworCXU4IHJlZ3NbNl07CisJdTE2IG9sZF9tYXRyaXgsIG5ld19tYXRyaXg7CisJaW50IHJldCwgaSwgbWFzazsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAicmVxdWVzdGluZyBrZXlzLi4uXG4iKTsKKworCS8qCisJICogUmVhZCBhbGwgcmVnaXN0ZXJzIGZyb20gR2VuZXJhbCBTdGF0dXMgUmVnaXN0ZXIKKwkgKiB0byBHUElPcyByZWdpc3RlcgorCSAqLworCXJldCA9IHF0MjE2MF9yZWFkX2Jsb2NrKGNsaWVudCwgUVQyMTYwX0NNRF9HU1RBVCwgcmVncywgNik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJjb3VsZCBub3QgcGVyZm9ybSBjaGlwIHJlYWQuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlvbGRfbWF0cml4ID0gcXQyMTYwLT5rZXlfbWF0cml4OworCXF0MjE2MC0+a2V5X21hdHJpeCA9IG5ld19tYXRyaXggPSAocmVnc1syXSA8PCA4KSB8IHJlZ3NbMV07CisKKwltYXNrID0gMHgwMTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSwgbWFzayA8PD0gMSkgeworCQlpbnQga2V5dmFsID0gbmV3X21hdHJpeCAmIG1hc2s7CisKKwkJaWYgKChvbGRfbWF0cml4ICYgbWFzaykgIT0ga2V5dmFsKSB7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBxdDIxNjAtPmtleWNvZGVzW2ldLCBrZXl2YWwpOworCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJrZXkgJWQgJXNcbiIsCisJCQkJaSwga2V5dmFsID8gInByZXNzZWQiIDogInJlbGVhc2VkIik7CisJCX0KKwl9CisKKwlpbnB1dF9zeW5jKGlucHV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcXQyMTYwX2lycShpbnQgaXJxLCB2b2lkICpfcXQyMTYwKQoreworCXN0cnVjdCBxdDIxNjBfZGF0YSAqcXQyMTYwID0gX3F0MjE2MDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF0MjE2MC0+bG9jaywgZmxhZ3MpOworCisJX19jYW5jZWxfZGVsYXllZF93b3JrKCZxdDIxNjAtPmR3b3JrKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnF0MjE2MC0+ZHdvcmssIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXQyMTYwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHF0MjE2MF9zY2hlZHVsZV9yZWFkKHN0cnVjdCBxdDIxNjBfZGF0YSAqcXQyMTYwKQoreworCXNwaW5fbG9ja19pcnEoJnF0MjE2MC0+bG9jayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZxdDIxNjAtPmR3b3JrLCBRVDIxNjBfQ1lDTEVfSU5URVJWQUwpOworCXNwaW5fdW5sb2NrX2lycSgmcXQyMTYwLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcXQyMTYwX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHF0MjE2MF9kYXRhICpxdDIxNjAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHF0MjE2MF9kYXRhLCBkd29yay53b3JrKTsKKworCWRldl9kYmcoJnF0MjE2MC0+Y2xpZW50LT5kZXYsICJ3b3JrZXJcbiIpOworCisJcXQyMTYwX2dldF9rZXlfbWF0cml4KHF0MjE2MCk7CisKKwkvKiBBdm9pZCBkZXZpY2UgbG9jayB1cCBieSBjaGVja2luZyBldmVyeSBzbyBvZnRlbiAqLworCXF0MjE2MF9zY2hlZHVsZV9yZWFkKHF0MjE2MCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHF0MjE2MF9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCByZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiY291bGRuJ3Qgc2VuZCByZXF1ZXN0LiBSZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiY291bGRuJ3QgcmVhZCByZWdpc3Rlci4gUmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcXQyMTYwX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgcmVnKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiY291bGRuJ3Qgc2VuZCByZXF1ZXN0LiBSZXR1cm5lZCAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIGRhdGEpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJjb3VsZG4ndCB3cml0ZSBkYXRhLiBSZXR1cm5lZCAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBib29sIF9fZGV2aW5pdCBxdDIxNjBfaWRlbnRpZnkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgaWQsIHZlciwgcmV2OworCisJLyogUmVhZCBDaGlkIElEIHRvIGNoZWNrIGlmIGNoaXAgaXMgdmFsaWQgKi8KKwlpZCA9IHF0MjE2MF9yZWFkKGNsaWVudCwgUVQyMTYwX0NNRF9DSElQSUQpOworCWlmIChpZCAhPSBRVDIxNjBfVkFMSURfQ0hJUElEKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSUQgJWQgbm90IHN1cHBvcnRlZFxuIiwgaWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogUmVhZCBjaGlwIGZpcm13YXJlIHZlcnNpb24gKi8KKwl2ZXIgPSBxdDIxNjBfcmVhZChjbGllbnQsIFFUMjE2MF9DTURfQ09ERVZFUik7CisJaWYgKHZlciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjb3VsZCBub3QgZ2V0IGZpcm13YXJlIHZlcnNpb25cbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogUmVhZCBjaGlwIGZpcm13YXJlIHJldmlzaW9uICovCisJcmV2ID0gcXQyMTYwX3JlYWQoY2xpZW50LCBRVDIxNjBfQ01EX1NVQlZFUik7CisJaWYgKHJldiA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjb3VsZCBub3QgZ2V0IGZpcm13YXJlIHJldmlzaW9uXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkFUNDJRVDIxNjAgZmlybXdhcmUgdmVyc2lvbiAlZC4lZC4lZFxuIiwKKwkJCXZlciA+PiA0LCB2ZXIgJiAweGYsIHJldik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcXQyMTYwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHF0MjE2MF9kYXRhICpxdDIxNjA7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJaW50IGk7CisJaW50IGVycm9yOworCisJLyogQ2hlY2sgZnVuY3Rpb25hbGl0eSAqLworCWVycm9yID0gaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJSTJDX0ZVTkNfU01CVVNfQllURSk7CisJaWYgKCFlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGFkYXB0ZXIgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQlkZXZfZHJpdmVyX3N0cmluZygmY2xpZW50LT5hZGFwdGVyLT5kZXYpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFxdDIxNjBfaWRlbnRpZnkoY2xpZW50KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDaGlwIGlzIHZhbGlkIGFuZCBhY3RpdmUuIEFsbG9jYXRlIHN0cnVjdHVyZSAqLworCXF0MjE2MCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxdDIxNjBfZGF0YSksIEdGUF9LRVJORUwpOworCWlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFxdDIxNjAgfHwgIWlucHV0KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJcXQyMTYwLT5jbGllbnQgPSBjbGllbnQ7CisJcXQyMTYwLT5pbnB1dCA9IGlucHV0OworCUlOSVRfREVMQVlFRF9XT1JLKCZxdDIxNjAtPmR3b3JrLCBxdDIxNjBfd29ya2VyKTsKKwlzcGluX2xvY2tfaW5pdCgmcXQyMTYwLT5sb2NrKTsKKworCWlucHV0LT5uYW1lID0gIkFUNDJRVDIxNjAgVG91Y2ggU2Vuc2UgS2V5Ym9hcmQiOworCWlucHV0LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKKworCWlucHV0LT5rZXljb2RlID0gcXQyMTYwLT5rZXljb2RlczsKKwlpbnB1dC0+a2V5Y29kZXNpemUgPSBzaXplb2YocXQyMTYwLT5rZXljb2Rlc1swXSk7CisJaW5wdXQtPmtleWNvZGVtYXggPSBBUlJBWV9TSVpFKHF0MjE2MF9rZXkyY29kZSk7CisKKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dC0+ZXZiaXQpOworCV9fY2xlYXJfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShxdDIxNjBfa2V5MmNvZGUpOyBpKyspIHsKKwkJcXQyMTYwLT5rZXljb2Rlc1tpXSA9IHF0MjE2MF9rZXkyY29kZVtpXTsKKwkJX19zZXRfYml0KHF0MjE2MF9rZXkyY29kZVtpXSwgaW5wdXQtPmtleWJpdCk7CisJfQorCV9fY2xlYXJfYml0KEtFWV9SRVNFUlZFRCwgaW5wdXQtPmtleWJpdCk7CisKKwkvKiBDYWxpYnJhdGUgZGV2aWNlICovCisJZXJyb3IgPSBxdDIxNjBfd3JpdGUoY2xpZW50LCBRVDIxNjBfQ01EX0NBTElCUkFURSwgMSk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGNhbGlicmF0ZSBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlpZiAoY2xpZW50LT5pcnEpIHsKKwkJZXJyb3IgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgcXQyMTYwX2lycSwKKwkJCQkgICAgSVJRRl9UUklHR0VSX0ZBTExJTkcsICJxdDIxNjAiLCBxdDIxNjApOworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCBjbGllbnQtPmlycSk7CisJCQlnb3RvIGVycl9mcmVlX21lbTsKKwkJfQorCX0KKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHF0MjE2MC0+aW5wdXQpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcXQyMTYwKTsKKwlxdDIxNjBfc2NoZWR1bGVfcmVhZChxdDIxNjApOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2lycToKKwlpZiAoY2xpZW50LT5pcnEpCisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBxdDIxNjApOworZXJyX2ZyZWVfbWVtOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0KTsKKwlrZnJlZShxdDIxNjApOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcXQyMTYwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBxdDIxNjBfZGF0YSAqcXQyMTYwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwkvKiBSZWxlYXNlIElSUSBzbyBubyBxdWV1ZSB3aWxsIGJlIHNjaGVkdWxlZCAqLworCWlmIChjbGllbnQtPmlycSkKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHF0MjE2MCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnF0MjE2MC0+ZHdvcmspOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocXQyMTYwLT5pbnB1dCk7CisJa2ZyZWUocXQyMTYwKTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgcXQyMTYwX2lkdGFibGVbXSA9IHsKKwl7ICJxdDIxNjAiLCAwLCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHF0MjE2MF9pZHRhYmxlKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHF0MjE2MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAicXQyMTYwIiwKKwkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCX0sCisKKwkuaWRfdGFibGUJPSBxdDIxNjBfaWR0YWJsZSwKKwkucHJvYmUJCT0gcXQyMTYwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocXQyMTYwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBxdDIxNjBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcXQyMTYwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChxdDIxNjBfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxdDIxNjBfY2xlYW51cCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZxdDIxNjBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHF0MjE2MF9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiUmFwaGFlbCBEZXJvc3NvIFBlcmVpcmEgPHJhcGhhZWxwZXJlaXJhQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBBVDQyUVQyMTYwIFRvdWNoIFNlbnNvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdW5rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3Vua2JkLmMKaW5kZXggNDcyYjU2Ni4uYTk5YTA0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdW5rYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N1bmtiZC5jCkBAIC0yNyw2ICsyNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCmluZGV4IDc2ZDY3NTEuLmE5YmIyNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCkBAIC0yMjUsNyArMjI1LDkgQEAKIGNvbmZpZyBJTlBVVF9XSU5CT05EX0NJUgogCXRyaXN0YXRlICJXaW5ib25kIElSIHJlbW90ZSBjb250cm9sIgogCWRlcGVuZHMgb24gWDg2ICYmIFBOUAorCXNlbGVjdCBORVdfTEVEUwogCXNlbGVjdCBMRURTX0NMQVNTCisJc2VsZWN0IExFRFNfVFJJR0dFUlMKIAlzZWxlY3QgQklUUkVWRVJTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBJUiByZW1vdGUgZnVuY3Rpb25hbGl0eSBmb3VuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2RtMzU1ZXZtX2tleXMuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9kbTM1NWV2bV9rZXlzLmMKaW5kZXggMDkxOGFjYS4uZjJiNjdkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2RtMzU1ZXZtX2tleXMuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvZG0zNTVldm1fa2V5cy5jCkBAIC05Niw3ICs5NiwxMyBAQAogCXsgMHgzMTY5LCBLRVlfUEFVU0UsIH0sCiB9OwogCi0vKiBydW5zIGluIGFuIElSUSB0aHJlYWQgLS0gY2FuIChhbmQgd2lsbCEpIHNsZWVwICovCisvKgorICogQmVjYXVzZSB3ZSBjb21tdW5pY2F0ZSB3aXRoIHRoZSBNU1A0MzAgdXNpbmcgSTJDLCBhbmQgYWxsIEkyQyBjYWxscworICogaW4gTGludXggc2xlZXAsIHdlIHVzZSBhIHRocmVhZGVkIElSUSBoYW5kbGVyLiAgVGhlIElSUSBpdHNlbGYgaXMKKyAqIGFjdGl2ZSBsb3csIGJ1dCB3ZSBnbyB0aHJvdWdoIHRoZSBHUElPIGNvbnRyb2xsZXIgc28gd2UgY2FuIHRyaWdnZXIKKyAqIG9uIGZhbGxpbmcgZWRnZXMgYW5kIG5vdCB3b3JyeSBhYm91dCBlbmFibGluZy9kaXNhYmxpbmcgdGhlIElSUSBpbgorICogdGhlIGtleXByZXNzIGhhbmRsaW5nIHBhdGguCisgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBkbTM1NWV2bV9rZXlzX2lycShpbnQgaXJxLCB2b2lkICpfa2V5cykKIHsKIAlzdHJ1Y3QgZG0zNTVldm1fa2V5cwkqa2V5cyA9IF9rZXlzOwpAQCAtMTcxLDE4ICsxNzcsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyoKLSAqIEJlY2F1c2Ugd2UgY29tbXVuaWNhdGUgd2l0aCB0aGUgTVNQNDMwIHVzaW5nIEkyQywgYW5kIGFsbCBJMkMgY2FsbHMKLSAqIGluIExpbnV4IHNsZWVwLCB3ZSB1c2UgYSB0aHJlYWRlZCBJUlEgaGFuZGxlci4gIFRoZSBJUlEgaXRzZWxmIGlzCi0gKiBhY3RpdmUgbG93LCBidXQgd2UgZ28gdGhyb3VnaCB0aGUgR1BJTyBjb250cm9sbGVyIHNvIHdlIGNhbiB0cmlnZ2VyCi0gKiBvbiBmYWxsaW5nIGVkZ2VzIGFuZCBub3Qgd29ycnkgYWJvdXQgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSBJUlEgaW4KLSAqIHRoZSBrZXlwcmVzcyBoYW5kbGluZyBwYXRoLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgZG0zNTVldm1fa2V5c19oYXJkaXJxKGludCBpcnEsIHZvaWQgKl9rZXlzKQotewotCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Ci19Ci0KIHN0YXRpYyBpbnQgZG0zNTVldm1fc2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBpbmRleCwgaW50IGtleWNvZGUpCiB7CiAJdTE2CQlvbGRfa2V5Y29kZTsKQEAgLTI1NywxMCArMjUxLDggQEAKIAogCS8qIFJFVklTSVQ6ICBmbHVzaCB0aGUgZXZlbnQgcXVldWU/ICovCiAKLQlzdGF0dXMgPSByZXF1ZXN0X3RocmVhZGVkX2lycShrZXlzLT5pcnEsCi0JCQlkbTM1NWV2bV9rZXlzX2hhcmRpcnEsIGRtMzU1ZXZtX2tleXNfaXJxLAotCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcsCi0JCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwga2V5cyk7CisJc3RhdHVzID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoa2V5cy0+aXJxLCBOVUxMLCBkbTM1NWV2bV9rZXlzX2lycSwKKwkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwga2V5cyk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZmFpbDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jCmluZGV4IDIxNmE1NTkuLmVhODIxYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2hwX3NkY19ydGMuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAKIC8qIFJlYWQgdGhlIGk4MDQyIGZhc3QgaGFuZHNoYWtlIHRpbWVyICovCiBzdGF0aWMgaW5saW5lIGludCBocF9zZGNfcnRjX3JlYWRfZmhzKHN0cnVjdCB0aW1ldmFsICpyZXMpIHsKLQl1aW50NjRfdCByYXc7CisJaW50NjRfdCByYXc7CiAJdW5zaWduZWQgaW50IHRlbm1zOwogCiAJcmF3ID0gaHBfc2RjX3J0Y19yZWFkX2k4MDQydGltZXIoSFBfU0RDX0NNRF9MT0FEX0ZIUywgMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2Mvcm90YXJ5X2VuY29kZXIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9yb3RhcnlfZW5jb2Rlci5jCmluZGV4IGM4MDZmYmYuLjNiOWY1ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9yb3RhcnlfZW5jb2Rlci5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9yb3RhcnlfZW5jb2Rlci5jCkBAIC0xMDYsOCArMTA2LDggQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKIAlpbnQgZXJyOwogCi0JaWYgKCFwZGF0YSB8fCAhcGRhdGEtPnN0ZXBzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgcGxhdGZvcm0gZGF0YVxuIik7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9zcGFyY3Nwa3IuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9zcGFyY3Nwa3IuYwppbmRleCBjNGY0MjMxLi5iMDY0NDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mvc3BhcmNzcGtyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3NwYXJjc3Brci5jCkBAIC0yMzAsNyArMjMwLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGJiY19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiYmNfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewogCXN0cnVjdCBzcGFyY3Nwa3Jfc3RhdGUgKnN0YXRlID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBzdGF0ZS0+aW5wdXRfZGV2OwpAQCAtMzA4LDcgKzMwOCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBncm92ZXJfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQorc3RhdGljIGludCBfX2RldmV4aXQgZ3JvdmVyX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKIHsKIAlzdHJ1Y3Qgc3BhcmNzcGtyX3N0YXRlICpzdGF0ZSA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CiAJc3RydWN0IGdyb3Zlcl9iZWVwX2luZm8gKmluZm8gPSAmc3RhdGUtPnUuZ3JvdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCmluZGV4IGM1YTQ5YWIuLmQzZjU3MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKQEAgLTMwLDYgKzMwLDcgQEAKICAqCQktIGZpcnN0IHB1YmxpYyB2ZXJzaW9uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jCmluZGV4IDExZmQwMzguLmE5MzIxNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2Mvd2lzdHJvbl9idG5zLmMKQEAgLTkzNiw2ICs5MzYsMTUgQEAKIAl9LAogCXsKIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCisJCS5pZGVudCA9ICJNZWRpb24gTUQgNDIyMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1lZGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJXSU0gMjAzMCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfZnNfYW1pbG9fcHJvX3YyMDAwCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAogCQkuaWRlbnQgPSAiTWVkaW9uIE1EIDk2NTAwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNRURJT05QQyIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKaW5kZXggZGU3NDVkNy4uYWI1ZGM1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCkBAIC0yMTksNyArMjE5LDcgQEAKIAkJCQlQUzJQUF9XSEVFTCB8IFBTMlBQX1NJREVfQlROIHwgUFMyUFBfVEFTS19CVE4gfAogCQkJCVBTMlBQX0VYVFJBX0JUTiB8IFBTMlBQX05BVl9CVE4gfCBQUzJQUF9IV0hFRUwgfSwKIAkJeyA3MiwJUFMyUFBfS0lORF9UUkFDS01BTiwJMCB9LAkJCS8qIFQtQ0gxMTogVHJhY2tNYW4gTWFyYmxlICovCi0JCXsgNzMsCTAsCQkJUFMyUFBfU0lERV9CVE4gfSwKKwkJeyA3MywJUFMyUFBfS0lORF9UUkFDS01BTiwJUFMyUFBfU0lERV9CVE4gfSwJLyogVHJhY2tNYW4gRlggKi8KIAkJeyA3NSwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKIAkJeyA3NiwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfV0hFRUwgfSwKIAkJeyA3OSwJUFMyUFBfS0lORF9UUkFDS01BTiwJUFMyUFBfV0hFRUwgfSwJCS8qIFRyYWNrTWFuIHdpdGggd2hlZWwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuYwppbmRleCA4NGUyZmMwLi5mODRjYmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3NlbnRlbGljLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zZW50ZWxpYy5jCkBAIC05Miw3ICs5Miw4IEBACiAJICovCiAJcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBQU01PVVNFX0NNRF9ESVNBQkxFKTsKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0NNRF9NT0RFKTsKLQltdXRleF9sb2NrKCZwczJkZXYtPmNtZF9tdXRleCk7CisKKwlwczJfYmVnaW5fY29tbWFuZChwczJkZXYpOwogCiAJaWYgKHBzMl9zZW5kYnl0ZShwczJkZXYsIDB4ZjMsIEZTUF9DTURfVElNRU9VVCkgPCAwKQogCQlnb3RvIG91dDsKQEAgLTEyNiw3ICsxMjcsNyBAQAogCXJjID0gMDsKIAogIG91dDoKLQltdXRleF91bmxvY2soJnBzMmRldi0+Y21kX211dGV4KTsKKwlwczJfZW5kX2NvbW1hbmQocHMyZGV2KTsKIAlwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX0VOQUJMRSk7CiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9BQ1RJVkFURUQpOwogCWRldl9kYmcoJnBzMmRldi0+c2VyaW8tPmRldiwgIlJFQUQgUkVHOiAweCUwMnggaXMgMHglMDJ4IChyYyA9ICVkKVxuIiwKQEAgLTE0MCw3ICsxNDEsNyBAQAogCXVuc2lnbmVkIGNoYXIgdjsKIAlpbnQgcmMgPSAtMTsKIAotCW11dGV4X2xvY2soJnBzMmRldi0+Y21kX211dGV4KTsKKwlwczJfYmVnaW5fY29tbWFuZChwczJkZXYpOwogCiAJaWYgKHBzMl9zZW5kYnl0ZShwczJkZXYsIDB4ZjMsIEZTUF9DTURfVElNRU9VVCkgPCAwKQogCQlnb3RvIG91dDsKQEAgLTE3OSw3ICsxODAsNyBAQAogCXJjID0gMDsKIAogIG91dDoKLQltdXRleF91bmxvY2soJnBzMmRldi0+Y21kX211dGV4KTsKKwlwczJfZW5kX2NvbW1hbmQocHMyZGV2KTsKIAlkZXZfZGJnKCZwczJkZXYtPnNlcmlvLT5kZXYsICJXUklURSBSRUc6IDB4JTAyeCB0byAweCUwMnggKHJjID0gJWQpXG4iLAogCQlyZWdfYWRkciwgcmVnX3ZhbCwgcmMpOwogCXJldHVybiByYzsKQEAgLTIxNCw3ICsyMTUsOCBAQAogCiAJcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCBQU01PVVNFX0NNRF9ESVNBQkxFKTsKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0NNRF9NT0RFKTsKLQltdXRleF9sb2NrKCZwczJkZXYtPmNtZF9tdXRleCk7CisKKwlwczJfYmVnaW5fY29tbWFuZChwczJkZXYpOwogCiAJaWYgKHBzMl9zZW5kYnl0ZShwczJkZXYsIDB4ZjMsIEZTUF9DTURfVElNRU9VVCkgPCAwKQogCQlnb3RvIG91dDsKQEAgLTIzNiw3ICsyMzgsNyBAQAogCXJjID0gMDsKIAogIG91dDoKLQltdXRleF91bmxvY2soJnBzMmRldi0+Y21kX211dGV4KTsKKwlwczJfZW5kX2NvbW1hbmQocHMyZGV2KTsKIAlwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX0VOQUJMRSk7CiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9BQ1RJVkFURUQpOwogCWRldl9kYmcoJnBzMmRldi0+c2VyaW8tPmRldiwgIlJFQUQgUEFHRSBSRUc6IDB4JTAyeCAocmMgPSAlZClcbiIsCkBAIC0yNTAsNyArMjUyLDcgQEAKIAl1bnNpZ25lZCBjaGFyIHY7CiAJaW50IHJjID0gLTE7CiAKLQltdXRleF9sb2NrKCZwczJkZXYtPmNtZF9tdXRleCk7CisJcHMyX2JlZ2luX2NvbW1hbmQocHMyZGV2KTsKIAogCWlmIChwczJfc2VuZGJ5dGUocHMyZGV2LCAweGYzLCBGU1BfQ01EX1RJTUVPVVQpIDwgMCkKIAkJZ290byBvdXQ7CkBAIC0yNzUsNyArMjc3LDcgQEAKIAlyYyA9IDA7CiAKICBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwczJkZXYtPmNtZF9tdXRleCk7CisJcHMyX2VuZF9jb21tYW5kKHBzMmRldik7CiAJZGV2X2RiZygmcHMyZGV2LT5zZXJpby0+ZGV2LCAiV1JJVEUgUEFHRSBSRUc6IHRvIDB4JTAyeCAocmMgPSAlZClcbiIsCiAJCXJlZ192YWwsIHJjKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwppbmRleCBiNjZmZjFhLi5mNGE2MTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKQEAgLTY1Miw2ICs2NTIsMTYgQEAKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUE9SVEVHRSBNMzAwIiksCiAJCX0sCisKKwl9LAorCXsKKwkJLmlkZW50ID0gIlRvc2hpYmEgUG9ydGVnZSBNMzAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUT1NISUJBIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvcnRhYmxlIFBDIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIlZlcnNpb24gMS4wIiksCisJCX0sCisKIAl9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzX2kyYy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKaW5kZXggZWFjOWZkZC4uNzI4M2M3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogICogYW5kIHRoZSBpcnEgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgc2V0IHRvIEZhbGxpbmcgRWRnZSBUcmlnZ2VyCiAgKi8KIC8qIENvbnRyb2wgSVJRIC8gUG9sbGluZyBvcHRpb24gKi8KLXN0YXRpYyBpbnQgcG9sbGluZ19yZXE7CitzdGF0aWMgYm9vbCBwb2xsaW5nX3JlcTsKIG1vZHVsZV9wYXJhbShwb2xsaW5nX3JlcSwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvbGxpbmdfcmVxLCAiUmVxdWVzdCBQb2xsaW5nLiBEZWZhdWx0ID0gMCAodXNlIGlycSkiKTsKIApAQCAtMjE3LDYgKzIxNyw3IEBACiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKIAlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCWR3b3JrOworCXNwaW5sb2NrX3QJCWxvY2s7CiAJaW50CQkJbm9fZGF0YV9jb3VudDsKIAlpbnQJCQlub19kZWNlbF9wYXJhbTsKIAlpbnQJCQlyZWR1Y2VfcmVwb3J0X3BhcmFtOwpAQCAtMzY2LDE3ICszNjcsMjggQEAKIAlyZXR1cm4geHlfZGVsdGEgfHwgZ2VzdHVyZTsKIH0KIAorc3RhdGljIHZvaWQgc3luYXB0aWNzX2kyY19yZXNjaGVkdWxlX3dvcmsoc3RydWN0IHN5bmFwdGljc19pMmMgKnRvdWNoLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgZGVsYXkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0b3VjaC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBJZiB3b3JrIGlzIGFscmVhZHkgc2NoZWR1bGVkIHRoZW4gc3Vic2VxdWVudCBzY2hlZHVsZXMgd2lsbCBub3QKKwkgKiBjaGFuZ2UgdGhlIHNjaGVkdWxlZCB0aW1lIHRoYXQncyB3aHkgd2UgaGF2ZSB0byBjYW5jZWwgaXQgZmlyc3QuCisJICovCisJX19jYW5jZWxfZGVsYXllZF93b3JrKCZ0b3VjaC0+ZHdvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdG91Y2gtPmR3b3JrLCBkZWxheSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0b3VjaC0+bG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3luYXB0aWNzX2kyY19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBzeW5hcHRpY3NfaTJjICp0b3VjaCA9IGRldl9pZDsKIAotCS8qCi0JICogV2Ugd2FudCB0byBoYXZlIHRoZSB3b3JrIHJ1biBpbW1lZGlhdGVseSBidXQgaXQgbWlnaHQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBzY2hlZHVsZWQgd2l0aCBhIGRlbGF5LCB0aGF0J3Mgd2h5IHdlIGhhdmUgdG8KLQkgKiBjYW5jZWwgaXQgZmlyc3QuCi0JICovCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmdG91Y2gtPmR3b3JrKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRvdWNoLT5kd29yaywgMCk7CisJc3luYXB0aWNzX2kyY19yZXNjaGVkdWxlX3dvcmsodG91Y2gsIDApOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNDUyLDcgKzQ2NCw3IEBACiAJICogV2UgcG9sbCB0aGUgZGV2aWNlIG9uY2UgaW4gVEhSRUFEX0lSUV9TTEVFUF9TRUNTIGFuZAogCSAqIGlmIGVycm9yIGlzIGRldGVjdGVkLCB3ZSB0cnkgdG8gcmVzZXQgYW5kIHJlY29uZmlndXJlIHRoZSB0b3VjaHBhZC4KIAkgKi8KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRvdWNoLT5kd29yaywgZGVsYXkpOworCXN5bmFwdGljc19pMmNfcmVzY2hlZHVsZV93b3JrKHRvdWNoLCBkZWxheSk7CiB9CiAKIHN0YXRpYyBpbnQgc3luYXB0aWNzX2kyY19vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQpAQCAtNDY1LDggKzQ3Nyw4IEBACiAJCXJldHVybiByZXQ7CiAKIAlpZiAocG9sbGluZ19yZXEpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdG91Y2gtPmR3b3JrLAotCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKE5PX0RBVEFfU0xFRVBfTVNFQ1MpKTsKKwkJc3luYXB0aWNzX2kyY19yZXNjaGVkdWxlX3dvcmsodG91Y2gsCisJCQkJbXNlY3NfdG9famlmZmllcyhOT19EQVRBX1NMRUVQX01TRUNTKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUyMSw2ICs1MzMsNyBAQAogCXRvdWNoLT5zY2FuX3JhdGVfcGFyYW0gPSBzY2FuX3JhdGU7CiAJc2V0X3NjYW5fcmF0ZSh0b3VjaCwgc2Nhbl9yYXRlKTsKIAlJTklUX0RFTEFZRURfV09SSygmdG91Y2gtPmR3b3JrLCBzeW5hcHRpY3NfaTJjX3dvcmtfaGFuZGxlcik7CisJc3Bpbl9sb2NrX2luaXQoJnRvdWNoLT5sb2NrKTsKIAogCXJldHVybiB0b3VjaDsKIH0KQEAgLTUzNSwxNCArNTQ4LDEyIEBACiAJaWYgKCF0b3VjaCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0b3VjaCk7Ci0KIAlyZXQgPSBzeW5hcHRpY3NfaTJjX3Jlc2V0X2NvbmZpZyhjbGllbnQpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX21lbV9mcmVlOwogCiAJaWYgKGNsaWVudC0+aXJxIDwgMSkKLQkJcG9sbGluZ19yZXEgPSAxOworCQlwb2xsaW5nX3JlcSA9IHRydWU7CiAKIAl0b3VjaC0+aW5wdXQgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIXRvdWNoLT5pbnB1dCkgewpAQCAtNTYzLDcgKzU3NCw3IEBACiAJCQlkZXZfd2FybigmdG91Y2gtPmNsaWVudC0+ZGV2LAogCQkJCSAgIklSUSByZXF1ZXN0IGZhaWxlZDogJWQsICIKIAkJCQkgICJmYWxsaW5nIGJhY2sgdG8gcG9sbGluZ1xuIiwgcmV0KTsKLQkJCXBvbGxpbmdfcmVxID0gMTsKKwkJCXBvbGxpbmdfcmVxID0gdHJ1ZTsKIAkJCXN5bmFwdGljc19pMmNfcmVnX3NldCh0b3VjaC0+Y2xpZW50LAogCQkJCQkgICAgICBJTlRFUlJVUFRfRU5fUkVHLCAwKTsKIAkJfQpAQCAtNTgwLDEyICs1OTEsMTQgQEAKIAkJCSAiSW5wdXQgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyX2lucHV0X2ZyZWU7CiAJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdG91Y2gpOworCiAJcmV0dXJuIDA7CiAKIGVycl9pbnB1dF9mcmVlOgogCWlucHV0X2ZyZWVfZGV2aWNlKHRvdWNoLT5pbnB1dCk7CiBlcnJfbWVtX2ZyZWU6Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CiAJa2ZyZWUodG91Y2gpOwogCiAJcmV0dXJuIHJldDsKQEAgLTU5Niw3ICs2MDksNyBAQAogCXN0cnVjdCBzeW5hcHRpY3NfaTJjICp0b3VjaCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJaWYgKCFwb2xsaW5nX3JlcSkKLQkJZnJlZV9pcnEodG91Y2gtPmNsaWVudC0+aXJxLCB0b3VjaCk7CisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCB0b3VjaCk7CiAKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0b3VjaC0+aW5wdXQpOwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOwpAQCAtNjI3LDggKzY0MCw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdG91Y2gtPmR3b3JrLAotCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoTk9fREFUQV9TTEVFUF9NU0VDUykpOworCXN5bmFwdGljc19pMmNfcmVzY2hlZHVsZV93b3JrKHRvdWNoLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoTk9fREFUQV9TTEVFUF9NU0VDUykpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKaW5kZXggOTY2Yjg4Ni4uYTEzZDgwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwpAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBNT1VTRURFVl9NSU5PUlMJCTMyCiAjZGVmaW5lIE1PVVNFREVWX01JWAkJMzEKIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnCmluZGV4IGM0YjNmYmQuLmFhNTMzY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL0tjb25maWcKQEAgLTQsNyArNCw3IEBACiBjb25maWcgU0VSSU8KIAl0cmlzdGF0ZSAiU2VyaWFsIEkvTyBzdXBwb3J0IiBpZiBFTUJFRERFRCB8fCAhWDg2CiAJZGVmYXVsdCB5Ci0JLS0taGVscC0tLQorCWhlbHAKIAkgIFNheSBZZXMgaGVyZSBpZiB5b3UgaGF2ZSBhbnkgaW5wdXQgZGV2aWNlIHRoYXQgdXNlcyBzZXJpYWwgSS9PIHRvCiAJICBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzeXN0ZW0uIFRoaXMgaW5jbHVkZXMgdGhlCiAJICAJCSogc3RhbmRhcmQgQVQga2V5Ym9hcmQgYW5kIFBTLzIgbW91c2UgKgpAQCAtMjIsNyArMjIsNyBAQAogCXRyaXN0YXRlICJpODA0MiBQQyBLZXlib2FyZCBjb250cm9sbGVyIiBpZiBFTUJFRERFRCB8fCAhWDg2CiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiAhUEFSSVNDICYmICghQVJNIHx8IEFSQ0hfU0hBUksgfHwgRk9PVEJSSURHRV9IT1NUKSAmJiAhTTY4SyAmJiAhQkxBQ0tGSU4KLQktLS1oZWxwLS0tCisJaGVscAogCSAgaTgwNDIgaXMgdGhlIGNoaXAgb3ZlciB3aGljaCB0aGUgc3RhbmRhcmQgQVQga2V5Ym9hcmQgYW5kIFBTLzIKIAkgIG1vdXNlIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGNvbXB1dGVyLiBJZiB5b3UgdXNlIHRoZXNlIGRldmljZXMsCiAJICB5b3UnbGwgbmVlZCB0byBzYXkgWSBoZXJlLgpAQCAtMzUsNyArMzUsNyBAQAogY29uZmlnIFNFUklPX1NFUlBPUlQKIAl0cmlzdGF0ZSAiU2VyaWFsIHBvcnQgbGluZSBkaXNjaXBsaW5lIgogCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KKwloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBwbGFuIHRvIHVzZSBhbiBpbnB1dCBkZXZpY2UgKG1vdXNlLCBqb3lzdGljaywKIAkgIHRhYmxldCwgNmRvZikgdGhhdCBjb21tdW5pY2F0ZXMgb3ZlciB0aGUgUlMyMzIgc2VyaWFsIChDT00pIHBvcnQuCiAKQEAgLTQ5LDcgKzQ5LDcgQEAKIGNvbmZpZyBTRVJJT19DVDgyQzcxMAogCXRyaXN0YXRlICJjdDgyYzcxMCBBdXggcG9ydCBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gWDg2Ci0JLS0taGVscC0tLQorCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBUZXhhcyBJbnN0cnVtZW50cyBUcmF2ZWxNYXRlIG5vdGVib29rCiAJICBlcXVpcHBlZCB3aXRoIHRoZSBjdDgyYzcxMCBjaGlwIGFuZCB3YW50IHRvIHVzZSBhIG1vdXNlIGNvbm5lY3RlZAogCSAgdG8gdGhlICJRdWlja1BvcnQiLgpAQCAtNjYsNyArNjYsNyBAQAogY29uZmlnIFNFUklPX1BBUktCRAogCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IGtleWJvYXJkIGFkYXB0ZXIiCiAJZGVwZW5kcyBvbiBQQVJQT1JUCi0JLS0taGVscC0tLQorCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGJ1aWx0IGEgc2ltcGxlIHBhcmFsbGVsIHBvcnQgYWRhcHRlciB0byBhdHRhY2gKIAkgIGFuIGFkZGl0aW9uYWwgQVQga2V5Ym9hcmQsIFhUIGtleWJvYXJkIG9yIFBTLzIgbW91c2UuCiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogCXRyaXN0YXRlICJIUCBTeXN0ZW0gRGV2aWNlIENvbnRyb2xsZXIgaTgwNDIgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIChHU0MgfHwgSFAzMDApICYmIFNFUklPCiAJZGVmYXVsdCB5Ci0JLS0taGVscC0tLQorCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlICJTeXN0ZW0gRGV2aWNlCiAJICBDb250cm9sbGVyIiwgYW4gaTgwNDIgY2FycnlpbmcgbWljcm9jb2RlIHRvIG1hbmFnZSBhCiAJICBmZXcgbWlzY2VsbGFuZW91cyBkZXZpY2VzIG9uIHNvbWUgSGV3bGV0dCBQYWNrYXJkIHN5c3RlbXMuCkBAIC0xNjgsNiArMTY4LDcgQEAKIAogY29uZmlnIFNFUklPX0xJQlBTMgogCXRyaXN0YXRlICJQUy8yIGRyaXZlciBsaWJyYXJ5IiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gU0VSSU9fSTgwNDIgfHwgU0VSSU9fSTgwNDI9bgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyBhIGRyaXZlciBmb3IgZGV2aWNlIGNvbm5lY3RlZAogCSAgdG8gYSBQUy8yIHBvcnQsIHN1Y2ggYXMgUFMvMiBtb3VzZSBvciBzdGFuZGFyZCBBVCBrZXlib2FyZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCmluZGV4IGEzOWJjNGUuLmE1Mzc5MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaApAQCAtMzI3LDYgKzMyNywxNyBAQAogCQl9LAogCX0sCiAJeworCQkvKgorCQkgKiBSZXNldCBhbmQgR0VUIElEIGNvbW1hbmRzIGlzc3VlZCB2aWEgS0JEIHBvcnQgYXJlCisJCSAqIHNvbWV0aW1lcyBiZWluZyBkZWxpdmVyZWQgdG8gQVVYMy4KKwkJICovCisJCS5pZGVudCA9ICJTb255IFZhaW8gRlotMjQwRSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tRloyNDBFIiksCisJCX0sCisJfSwKKwl7CiAJCS5pZGVudCA9ICJBbW9pIE02MzYvQTczNyIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQW1vaSBFbGVjdHJvbmljcyBDTy4sTFRELiIpLApAQCAtNjYxLDcgKzY3Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBpODA0Ml9wbnBfaW5pdCh2b2lkKQogewogCWNoYXIga2JkX2lycV9zdHJbNF0gPSB7IDAgfSwgYXV4X2lycV9zdHJbNF0gPSB7IDAgfTsKLQlpbnQgcG5wX2RhdGFfYnVzdGVkID0gZmFsc2U7CisJYm9vbCBwbnBfZGF0YV9idXN0ZWQgPSBmYWxzZTsKIAlpbnQgZXJyOwogCiAjaWZkZWYgQ09ORklHX1g4NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCmluZGV4IGViM2ZmOTQuLjFkZjAyZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKQEAgLTg3LDggKzg3LDIyIEBACiAKICNpbmNsdWRlICJpODA0Mi5oIgogCisvKgorICogaTgwNDJfbG9jayBwcm90ZWN0cyBzZXJpYWxpemF0aW9uIGJldHdlZW4gaTgwNDJfY29tbWFuZCBhbmQKKyAqIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyhpODA0Ml9sb2NrKTsKIAorLyoKKyAqIFdyaXRlcnMgdG8gQVVYIGFuZCBLQkQgcG9ydHMgYXMgd2VsbCBhcyB1c2VycyBpc3N1aW5nIGk4MDQyX2NvbW1hbmQKKyAqIGRpcmVjdGx5IHNob3VsZCBhY3F1aXJlIGk4MDQyX211dGV4IChieSBtZWFucyBvZiBjYWxsaW5nCisgKiBpODA0Ml9sb2NrX2NoaXAoKSBhbmQgaTgwNDJfdW5sb2NrX3NoaXAoKSBoZWxwZXJzKSB0byBlbnN1cmUgdGhhdAorICogdGhleSBkbyBub3QgZGlzdHVyYiBlYWNoIG90aGVyICh1bmZvcnR1bmF0ZWx5IGluIG1hbnkgaTgwNDIKKyAqIGltcGxlbWVudGF0aW9ucyB3cml0ZSB0byBvbmUgb2YgdGhlIHBvcnRzIHdpbGwgaW1tZWRpYXRlbHkgYWJvcnQKKyAqIGNvbW1hbmQgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQgYnkgYW5vdGhlciBwb3J0KS4KKyAqLworc3RhdGljIERFRklORV9NVVRFWChpODA0Ml9tdXRleCk7CisKIHN0cnVjdCBpODA0Ml9wb3J0IHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwogCWludCBpcnE7CkBAIC0xMTMsNiArMTI3LDE4IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpODA0Ml9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIAordm9pZCBpODA0Ml9sb2NrX2NoaXAodm9pZCkKK3sKKwltdXRleF9sb2NrKCZpODA0Ml9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGk4MDQyX2xvY2tfY2hpcCk7CisKK3ZvaWQgaTgwNDJfdW5sb2NrX2NoaXAodm9pZCkKK3sKKwltdXRleF91bmxvY2soJmk4MDQyX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woaTgwNDJfdW5sb2NrX2NoaXApOworCiAvKgogICogVGhlIGk4MDQyX3dhaXRfcmVhZCgpIGFuZCBpODA0Ml93YWl0X3dyaXRlIGZ1bmN0aW9ucyB3YWl0IGZvciB0aGUgaTgwNDIgdG8KICAqIGJlIHJlYWR5IGZvciByZWFkaW5nIHZhbHVlcyBmcm9tIGl0IC8gd3JpdGluZyB2YWx1ZXMgdG8gaXQuCkBAIC01ODMsNiArNjA5LDggQEAKIAlzdHIgPSBpODA0Ml9yZWFkX3N0YXR1cygpOwogCWlmIChzdHIgJiBJODA0Ml9TVFJfT0JGKSB7CiAJCWRhdGEgPSBpODA0Ml9yZWFkX2RhdGEoKTsKKwkJZGJnKCIlMDJ4IDwtIGk4MDQyIChhdXhfdGVzdF9pcnEsICVzKSIsCisJCQlkYXRhLCBzdHIgJiBJODA0Ml9TVFJfQVVYREFUQSA/ICJhdXgiIDogImtiZCIpOwogCQlpZiAoaTgwNDJfaXJxX2JlaW5nX3Rlc3RlZCAmJgogCQkgICAgZGF0YSA9PSAweGE1ICYmIChzdHIgJiBJODA0Ml9TVFJfQVVYREFUQSkpCiAJCQljb21wbGV0ZSgmaTgwNDJfYXV4X2lycV9kZWxpdmVyZWQpOwpAQCAtNzI0LDYgKzc1Miw3IEBACiAgKiBBVVggSVJRIHdhcyBuZXZlciBkZWxpdmVyZWQgc28gd2UgbmVlZCB0byBmbHVzaCB0aGUgY29udHJvbGxlciB0bwogICogZ2V0IHJpZCBvZiB0aGUgYnl0ZSB3ZSBwdXQgdGhlcmU7IG90aGVyd2lzZSBrZXlib2FyZCBtYXkgbm90IHdvcmsuCiAgKi8KKwkJZGJnKCIgICAgIC0tIGk4MDQyIChhdXggaXJxIHRlc3QgdGltZW91dCkiKTsKIAkJaTgwNDJfZmx1c2goKTsKIAkJcmV0dmFsID0gLTE7CiAJfQpAQCAtODA3LDE3ICs4MzYsMzIgQEAKIHN0YXRpYyBpbnQgaTgwNDJfY29udHJvbGxlcl9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbiA9IDA7CisJdW5zaWduZWQgY2hhciBjdHJbMl07CiAKIC8qCi0gKiBTYXZlIHRoZSBDVFIgZm9yIHJlc3RvcmFsIG9uIHVubG9hZCAvIHJlYm9vdC4KKyAqIFNhdmUgdGhlIENUUiBmb3IgcmVzdG9yZSBvbiB1bmxvYWQgLyByZWJvb3QuCiAgKi8KIAotCWlmIChpODA0Ml9jb21tYW5kKCZpODA0Ml9jdHIsIEk4MDQyX0NNRF9DVExfUkNUUikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpODA0Mi5jOiBDYW4ndCByZWFkIENUUiB3aGlsZSBpbml0aWFsaXppbmcgaTgwNDIuXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCWRvIHsKKwkJaWYgKG4gPj0gMTApIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJpODA0Mi5jOiBVbmFibGUgdG8gZ2V0IHN0YWJsZSBDVFIgcmVhZC5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAotCWk4MDQyX2luaXRpYWxfY3RyID0gaTgwNDJfY3RyOworCQlpZiAobiAhPSAwKQorCQkJdWRlbGF5KDUwKTsKKworCQlpZiAoaTgwNDJfY29tbWFuZCgmY3RyW24rKyAlIDJdLCBJODA0Ml9DTURfQ1RMX1JDVFIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiaTgwNDIuYzogQ2FuJ3QgcmVhZCBDVFIgd2hpbGUgaW5pdGlhbGl6aW5nIGk4MDQyLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJfSB3aGlsZSAobiA8IDIgfHwgY3RyWzBdICE9IGN0clsxXSk7CisKKwlpODA0Ml9pbml0aWFsX2N0ciA9IGk4MDQyX2N0ciA9IGN0clswXTsKIAogLyoKICAqIERpc2FibGUgdGhlIGtleWJvYXJkIGludGVyZmFjZSBhbmQgaW50ZXJydXB0LgpAQCAtODY2LDYgKzkxMCwxMiBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKKy8qCisgKiBGbHVzaCB3aGF0ZXZlciBhY2N1bXVsYXRlZCB3aGlsZSB3ZSB3ZXJlIGRpc2FibGluZyBrZXlib2FyZCBwb3J0LgorICovCisKKwlpODA0Ml9mbHVzaCgpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg4NSw3ICs5MzUsNyBAQAogCWk4MDQyX2N0ciB8PSBJODA0Ml9DVFJfS0JERElTIHwgSTgwNDJfQ1RSX0FVWERJUzsKIAlpODA0Ml9jdHIgJj0gfihJODA0Ml9DVFJfS0JESU5UIHwgSTgwNDJfQ1RSX0FVWElOVCk7CiAKLQlpZiAoaTgwNDJfY29tbWFuZCgmaTgwNDJfaW5pdGlhbF9jdHIsIEk4MDQyX0NNRF9DVExfV0NUUikpCisJaWYgKGk4MDQyX2NvbW1hbmQoJmk4MDQyX2N0ciwgSTgwNDJfQ01EX0NUTF9XQ1RSKSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTgwNDIuYzogQ2FuJ3Qgd3JpdGUgQ1RSIHdoaWxlIHJlc2V0dGluZy5cbiIpOwogCiAvKgpAQCAtMTE2MSw2ICsxMjExLDIxIEBACiAJfQogfQogCisvKgorICogQ2hlY2tzIHdoZXRoZXIgcG9ydCBiZWxvbmdzIHRvIGk4MDQyIGNvbnRyb2xsZXIuCisgKi8KK2Jvb2wgaTgwNDJfY2hlY2tfcG9ydF9vd25lcihjb25zdCBzdHJ1Y3Qgc2VyaW8gKnBvcnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTgwNDJfTlVNX1BPUlRTOyBpKyspCisJCWlmIChpODA0Ml9wb3J0c1tpXS5zZXJpbyA9PSBwb3J0KQorCQkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MKGk4MDQyX2NoZWNrX3BvcnRfb3duZXIpOworCiBzdGF0aWMgdm9pZCBpODA0Ml9mcmVlX2lycXModm9pZCkKIHsKIAlpZiAoaTgwNDJfYXV4X2lycV9yZWdpc3RlcmVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKaW5kZXggM2E5NWI1MC4uZjM4NzZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCkBAIC0xMywxMCArMTMsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2k4MDQyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYnBzMi5oPgogCkBAIC01NCw2ICs1NiwyNCBAQAogfQogRVhQT1JUX1NZTUJPTChwczJfc2VuZGJ5dGUpOwogCit2b2lkIHBzMl9iZWdpbl9jb21tYW5kKHN0cnVjdCBwczJkZXYgKnBzMmRldikKK3sKKwltdXRleF9sb2NrKCZwczJkZXYtPmNtZF9tdXRleCk7CisKKwlpZiAoaTgwNDJfY2hlY2tfcG9ydF9vd25lcihwczJkZXYtPnNlcmlvKSkKKwkJaTgwNDJfbG9ja19jaGlwKCk7Cit9CitFWFBPUlRfU1lNQk9MKHBzMl9iZWdpbl9jb21tYW5kKTsKKwordm9pZCBwczJfZW5kX2NvbW1hbmQoc3RydWN0IHBzMmRldiAqcHMyZGV2KQoreworCWlmIChpODA0Ml9jaGVja19wb3J0X293bmVyKHBzMmRldi0+c2VyaW8pKQorCQlpODA0Ml91bmxvY2tfY2hpcCgpOworCisJbXV0ZXhfdW5sb2NrKCZwczJkZXYtPmNtZF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHBzMl9lbmRfY29tbWFuZCk7CisKIC8qCiAgKiBwczJfZHJhaW4oKSB3YWl0cyBmb3IgZGV2aWNlIHRvIHRyYW5zbWl0IHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMKICAqIGFuZCBkaXNjYXJkcyB0aGVtLgpAQCAtNjYsNyArODYsNyBAQAogCQltYXhieXRlcyA9IHNpemVvZihwczJkZXYtPmNtZGJ1Zik7CiAJfQogCi0JbXV0ZXhfbG9jaygmcHMyZGV2LT5jbWRfbXV0ZXgpOworCXBzMl9iZWdpbl9jb21tYW5kKHBzMmRldik7CiAKIAlzZXJpb19wYXVzZV9yeChwczJkZXYtPnNlcmlvKTsKIAlwczJkZXYtPmZsYWdzID0gUFMyX0ZMQUdfQ01EOwpAQCAtNzYsNyArOTYsOCBAQAogCXdhaXRfZXZlbnRfdGltZW91dChwczJkZXYtPndhaXQsCiAJCQkgICAhKHBzMmRldi0+ZmxhZ3MgJiBQUzJfRkxBR19DTUQpLAogCQkJICAgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0JbXV0ZXhfdW5sb2NrKCZwczJkZXYtPmNtZF9tdXRleCk7CisKKwlwczJfZW5kX2NvbW1hbmQocHMyZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0wocHMyX2RyYWluKTsKIApAQCAtMjM3LDkgKzI1OCw5IEBACiB7CiAJaW50IHJjOwogCi0JbXV0ZXhfbG9jaygmcHMyZGV2LT5jbWRfbXV0ZXgpOworCXBzMl9iZWdpbl9jb21tYW5kKHBzMmRldik7CiAJcmMgPSBfX3BzMl9jb21tYW5kKHBzMmRldiwgcGFyYW0sIGNvbW1hbmQpOwotCW11dGV4X3VubG9jaygmcHMyZGV2LT5jbWRfbXV0ZXgpOworCXBzMl9lbmRfY29tbWFuZChwczJkZXYpOwogCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMKaW5kZXggYjAzMDA5Yi4uMjdmZGFhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvX3Jhdy5jCkBAIC05LDYgKzksNyBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcnBvcnQuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCmluZGV4IGI5Njk0YjYuLjZkMzQ1MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jCkBAIC0xNSw2ICsxNSw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwppbmRleCBhYjAyZDcyLi44Y2M0NTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCkBAIC00OCw4ICs0OCw4IEBACiAJc2VsZWN0IFRPVUNIU0NSRUVOX0FENzg3OQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSB0b3VjaHNjcmVlbiBpbnRlcmZhY2UgdXNpbmcgdGhlCi0JICBBRDc4NzktMSBjb250cm9sbGVyLCBhbmQgeW91ciBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgotCSAgY29kZSBpbmNsdWRlcyB0aGF0IGluIGl0cyB0YWJsZSBvZiBJMkMgZGV2aWNlcy4KKwkgIEFENzg3OS0xL0FENzg4OS0xIGNvbnRyb2xsZXIsIGFuZCB5b3VyIGJvYXJkLXNwZWNpZmljCisJICBpbml0aWFsaXphdGlvbiBjb2RlIGluY2x1ZGVzIHRoYXQgaW4gaXRzIHRhYmxlIG9mIEkyQyBkZXZpY2VzLgogCiAJICBJZiB1bnN1cmUsIHNheSBOIChidXQgaXQncyBzYWZlIHRvIHNheSAiWSIpLgogCkBAIC02Miw3ICs2Miw3IEBACiAJc2VsZWN0IFRPVUNIU0NSRUVOX0FENzg3OQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSB0b3VjaHNjcmVlbiBpbnRlcmZhY2UgdXNpbmcgdGhlCi0JICBBRDc4NzkgY29udHJvbGxlciwgYW5kIHlvdXIgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKwkgIEFENzg3OS9BRDc4ODkgY29udHJvbGxlciwgYW5kIHlvdXIgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KIAkgIGNvZGUgaW5jbHVkZXMgdGhhdCBpbiBpdHMgdGFibGUgb2YgU1BJIGRldmljZXMuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4gKGJ1dCBpdCdzIHNhZmUgdG8gc2F5ICJZIikuCkBAIC0xNjksNiArMTY5LDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YWNvbV93ODAwMS4KIAorY29uZmlnIFRPVUNIU0NSRUVOX01DUzUwMDAKKwl0cmlzdGF0ZSAiTUVMRkFTIE1DUy01MDAwIHRvdWNoc2NyZWVuIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSB0aGUgTUVMRkFTIE1DUy01MDAwIHRvdWNoc2NyZWVuIGNvbnRyb2xsZXIKKwkgIGNoaXAgaW4geW91ciBzeXN0ZW0uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1jczUwMDBfdHMuCiAKIGNvbmZpZyBUT1VDSFNDUkVFTl9NVE9VQ0gKIAl0cmlzdGF0ZSAiTWljcm9Ub3VjaCBzZXJpYWwgdG91Y2hzY3JlZW5zIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKaW5kZXggNDU5OWJmNy4uMTVmYTYyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCkBAIC0xNyw2ICsxNyw3IEBACiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fRUxPKQkJKz0gZWxvLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVKQkrPSBmdWppdHN1X3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9JTkVYSU8pCSs9IGluZXhpby5vCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fTUNTNTAwMCkJKz0gbWNzNTAwMF90cy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fTUlHT1IpCQkrPSBtaWdvcl90cy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIKQkrPSBtdG91Y2gubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyKQkJKz0gbWs3MTIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKaW5kZXggMTliNGRiNy4uYzIxZTZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS5jCkBAIC0xLDcgKzEsOCBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBNaWNoYWVsIEhlbm5lcmljaCwgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgTWljaGFlbCBIZW5uZXJpY2gsIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBEZXNjcmlwdGlvbjoJQUQ3ODc5IGJhc2VkIHRvdWNoc2NyZWVuLCBhbmQgR1BJTyBkcml2ZXIgKEkyQy9TUEkgSW50ZXJmYWNlKQorICogRGVzY3JpcHRpb246CUFENzg3OS9BRDc4ODkgYmFzZWQgdG91Y2hzY3JlZW4sIGFuZCBHUElPIGRyaXZlcgorICoJCShJMkMvU1BJIEludGVyZmFjZSkKICAqCiAgKiBCdWdzOiAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCiAgKgpAQCAtNjQ0LDcgKzY0NSw3IEBACiAJCWtmcmVlKHRzKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGFkNzg3OV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKQEAgLTczMSw3ICs3MzIsNyBAQAogCQlrZnJlZSh0cyk7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDc4NzlfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC03NDcsNiArNzQ4LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzg3OV9pZFtdID0gewogCXsgImFkNzg3OSIsIDAgfSwKKwl7ICJhZDc4ODkiLCAwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkNzg3OV9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jczUwMDBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWNzNTAwMF90cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMjhiODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jczUwMDBfdHMuYwpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIG1jczUwMDBfdHMuYyAtIFRvdWNoc2NyZWVuIGRyaXZlciBmb3IgTUVMRkFTIE1DUy01MDAwIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKKyAqIEF1dGhvcjogSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoKKyAqIEJhc2VkIG9uIHdtOTd4eC1jb3JlLmMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvbWNzNTAwMF90cy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBNQ1M1MDAwX1RTX1NUQVRVUwkJMHgwMAorI2RlZmluZSBTVEFUVVNfT0ZGU0VUCQkJMAorI2RlZmluZSBTVEFUVVNfTk8JCQkoMCA8PCBTVEFUVVNfT0ZGU0VUKQorI2RlZmluZSBTVEFUVVNfSU5JVAkJCSgxIDw8IFNUQVRVU19PRkZTRVQpCisjZGVmaW5lIFNUQVRVU19TRU5TSU5HCQkJKDIgPDwgU1RBVFVTX09GRlNFVCkKKyNkZWZpbmUgU1RBVFVTX0NPT1JECQkJKDMgPDwgU1RBVFVTX09GRlNFVCkKKyNkZWZpbmUgU1RBVFVTX0dFU1RVUkUJCQkoNCA8PCBTVEFUVVNfT0ZGU0VUKQorI2RlZmluZSBFUlJPUl9PRkZTRVQJCQk0CisjZGVmaW5lIEVSUk9SX05PCQkJKDAgPDwgRVJST1JfT0ZGU0VUKQorI2RlZmluZSBFUlJPUl9QT1dFUl9PTl9SRVNFVAkJKDEgPDwgRVJST1JfT0ZGU0VUKQorI2RlZmluZSBFUlJPUl9JTlRfUkVTRVQJCQkoMiA8PCBFUlJPUl9PRkZTRVQpCisjZGVmaW5lIEVSUk9SX0VYVF9SRVNFVAkJCSgzIDw8IEVSUk9SX09GRlNFVCkKKyNkZWZpbmUgRVJST1JfSU5WQUxJRF9SRUdfQUREUkVTUwkoOCA8PCBFUlJPUl9PRkZTRVQpCisjZGVmaW5lIEVSUk9SX0lOVkFMSURfUkVHX1ZBTFVFCQkoOSA8PCBFUlJPUl9PRkZTRVQpCisKKyNkZWZpbmUgTUNTNTAwMF9UU19PUF9NT0RFCQkweDAxCisjZGVmaW5lIFJFU0VUX09GRlNFVAkJCTAKKyNkZWZpbmUgUkVTRVRfTk8JCQkoMCA8PCBSRVNFVF9PRkZTRVQpCisjZGVmaW5lIFJFU0VUX0VYVF9TT0ZUCQkJKDEgPDwgUkVTRVRfT0ZGU0VUKQorI2RlZmluZSBPUF9NT0RFX09GRlNFVAkJCTEKKyNkZWZpbmUgT1BfTU9ERV9TTEVFUAkJCSgwIDw8IE9QX01PREVfT0ZGU0VUKQorI2RlZmluZSBPUF9NT0RFX0FDVElWRQkJCSgxIDw8IE9QX01PREVfT0ZGU0VUKQorI2RlZmluZSBHRVNUVVJFX09GRlNFVAkJCTQKKyNkZWZpbmUgR0VTVFVSRV9ESVNBQkxFCQkJKDAgPDwgR0VTVFVSRV9PRkZTRVQpCisjZGVmaW5lIEdFU1RVUkVfRU5BQkxFCQkJKDEgPDwgR0VTVFVSRV9PRkZTRVQpCisjZGVmaW5lIFBST1hJTUlUWV9PRkZTRVQJCTUKKyNkZWZpbmUgUFJPWElNSVRZX0RJU0FCTEUJCSgwIDw8IFBST1hJTUlUWV9PRkZTRVQpCisjZGVmaW5lIFBST1hJTUlUWV9FTkFCTEUJCSgxIDw8IFBST1hJTUlUWV9PRkZTRVQpCisjZGVmaW5lIFNDQU5fTU9ERV9PRkZTRVQJCTYKKyNkZWZpbmUgU0NBTl9NT0RFX0lOVEVSUlVQVAkJKDAgPDwgU0NBTl9NT0RFX09GRlNFVCkKKyNkZWZpbmUgU0NBTl9NT0RFX1BPTExJTkcJCSgxIDw8IFNDQU5fTU9ERV9PRkZTRVQpCisjZGVmaW5lIFJFUE9SVF9SQVRFX09GRlNFVAkJNworI2RlZmluZSBSRVBPUlRfUkFURV80MAkJCSgwIDw8IFJFUE9SVF9SQVRFX09GRlNFVCkKKyNkZWZpbmUgUkVQT1JUX1JBVEVfODAJCQkoMSA8PCBSRVBPUlRfUkFURV9PRkZTRVQpCisKKyNkZWZpbmUgTUNTNTAwMF9UU19TRU5TX0NUTAkJMHgwMgorI2RlZmluZSBNQ1M1MDAwX1RTX0ZJTFRFUl9DVEwJCTB4MDMKKyNkZWZpbmUgUFJJX0ZJTFRFUl9PRkZTRVQJCTAKKyNkZWZpbmUgU0VDX0ZJTFRFUl9PRkZTRVQJCTQKKworI2RlZmluZSBNQ1M1MDAwX1RTX1hfU0laRV9VUFBFUgkJMHgwOAorI2RlZmluZSBNQ1M1MDAwX1RTX1hfU0laRV9MT1dFUgkJMHgwOQorI2RlZmluZSBNQ1M1MDAwX1RTX1lfU0laRV9VUFBFUgkJMHgwQQorI2RlZmluZSBNQ1M1MDAwX1RTX1lfU0laRV9MT1dFUgkJMHgwQgorCisjZGVmaW5lIE1DUzUwMDBfVFNfSU5QVVRfSU5GTwkJMHgxMAorI2RlZmluZSBJTlBVVF9UWVBFX09GRlNFVAkJMAorI2RlZmluZSBJTlBVVF9UWVBFX05PTlRPVUNICQkoMCA8PCBJTlBVVF9UWVBFX09GRlNFVCkKKyNkZWZpbmUgSU5QVVRfVFlQRV9TSU5HTEUJCSgxIDw8IElOUFVUX1RZUEVfT0ZGU0VUKQorI2RlZmluZSBJTlBVVF9UWVBFX0RVQUwJCQkoMiA8PCBJTlBVVF9UWVBFX09GRlNFVCkKKyNkZWZpbmUgSU5QVVRfVFlQRV9QQUxNCQkJKDMgPDwgSU5QVVRfVFlQRV9PRkZTRVQpCisjZGVmaW5lIElOUFVUX1RZUEVfUFJPWElNSVRZCQkoNyA8PCBJTlBVVF9UWVBFX09GRlNFVCkKKyNkZWZpbmUgR0VTVFVSRV9DT0RFX09GRlNFVAkJMworI2RlZmluZSBHRVNUVVJFX0NPREVfTk8JCQkoMCA8PCBHRVNUVVJFX0NPREVfT0ZGU0VUKQorCisjZGVmaW5lIE1DUzUwMDBfVFNfWF9QT1NfVVBQRVIJCTB4MTEKKyNkZWZpbmUgTUNTNTAwMF9UU19YX1BPU19MT1dFUgkJMHgxMgorI2RlZmluZSBNQ1M1MDAwX1RTX1lfUE9TX1VQUEVSCQkweDEzCisjZGVmaW5lIE1DUzUwMDBfVFNfWV9QT1NfTE9XRVIJCTB4MTQKKyNkZWZpbmUgTUNTNTAwMF9UU19aX1BPUwkJMHgxNQorI2RlZmluZSBNQ1M1MDAwX1RTX1dJRFRICQkweDE2CisjZGVmaW5lIE1DUzUwMDBfVFNfR0VTVFVSRV9WQUwJCTB4MTcKKyNkZWZpbmUgTUNTNTAwMF9UU19NT0RVTEVfUkVWCQkweDIwCisjZGVmaW5lIE1DUzUwMDBfVFNfRklSTVdBUkVfVkVSCQkweDIxCisKKy8qIFRvdWNoc2NyZWVuIGFic29sdXRlIHZhbHVlcyAqLworI2RlZmluZSBNQ1M1MDAwX01BWF9YQwkJCTB4M2ZmCisjZGVmaW5lIE1DUzUwMDBfTUFYX1lDCQkJMHgzZmYKKworZW51bSBtY3M1MDAwX3RzX3JlYWRfb2Zmc2V0IHsKKwlSRUFEX0lOUFVUX0lORk8sCisJUkVBRF9YX1BPU19VUFBFUiwKKwlSRUFEX1hfUE9TX0xPV0VSLAorCVJFQURfWV9QT1NfVVBQRVIsCisJUkVBRF9ZX1BPU19MT1dFUiwKKwlSRUFEX0JMT0NLX1NJWkUsCit9OworCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBtY3M1MDAwX3RzX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWNvbnN0IHN0cnVjdCBtY3M1MDAwX3RzX3BsYXRmb3JtX2RhdGEgKnBsYXRmb3JtX2RhdGE7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWNzNTAwMF90c19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBtY3M1MDAwX3RzX2RhdGEgKmRhdGEgPSBkZXZfaWQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwl1OCBidWZmZXJbUkVBRF9CTE9DS19TSVpFXTsKKwlpbnQgZXJyOworCWludCB4OworCWludCB5OworCisJZXJyID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCBNQ1M1MDAwX1RTX0lOUFVUX0lORk8sCisJCQlSRUFEX0JMT0NLX1NJWkUsIGJ1ZmZlcik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcywgZXJyWyVkXVxuIiwgX19mdW5jX18sIGVycik7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoYnVmZmVyW1JFQURfSU5QVVRfSU5GT10pIHsKKwljYXNlIElOUFVUX1RZUEVfTk9OVE9VQ0g6CisJCWlucHV0X3JlcG9ydF9rZXkoZGF0YS0+aW5wdXRfZGV2LCBCVE5fVE9VQ0gsIDApOworCQlpbnB1dF9zeW5jKGRhdGEtPmlucHV0X2Rldik7CisJCWJyZWFrOworCisJY2FzZSBJTlBVVF9UWVBFX1NJTkdMRToKKwkJeCA9IChidWZmZXJbUkVBRF9YX1BPU19VUFBFUl0gPDwgOCkgfCBidWZmZXJbUkVBRF9YX1BPU19MT1dFUl07CisJCXkgPSAoYnVmZmVyW1JFQURfWV9QT1NfVVBQRVJdIDw8IDgpIHwgYnVmZmVyW1JFQURfWV9QT1NfTE9XRVJdOworCisJCWlucHV0X3JlcG9ydF9rZXkoZGF0YS0+aW5wdXRfZGV2LCBCVE5fVE9VQ0gsIDEpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRhdGEtPmlucHV0X2RldiwgQUJTX1gsIHgpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRhdGEtPmlucHV0X2RldiwgQUJTX1ksIHkpOworCQlpbnB1dF9zeW5jKGRhdGEtPmlucHV0X2Rldik7CisJCWJyZWFrOworCisJY2FzZSBJTlBVVF9UWVBFX0RVQUw6CisJCS8qIFRPRE8gKi8KKwkJYnJlYWs7CisKKwljYXNlIElOUFVUX1RZUEVfUEFMTToKKwkJLyogVE9ETyAqLworCQlicmVhazsKKworCWNhc2UgSU5QVVRfVFlQRV9QUk9YSU1JVFk6CisJCS8qIFRPRE8gKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVua25vd24gdHMgaW5wdXQgdHlwZSAlZFxuIiwKKwkJCQlidWZmZXJbUkVBRF9JTlBVVF9JTkZPXSk7CisJCWJyZWFrOworCX0KKworIG91dDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1jczUwMDBfdHNfcGh5c19pbml0KHN0cnVjdCBtY3M1MDAwX3RzX2RhdGEgKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IG1jczUwMDBfdHNfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YSA9CisJCWRhdGEtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKworCS8qIFRvdWNoIHJlc2V0ICYgc2xlZXAgbW9kZSAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQ1M1MDAwX1RTX09QX01PREUsCisJCQlSRVNFVF9FWFRfU09GVCB8IE9QX01PREVfU0xFRVApOworCisJLyogVG91Y2ggc2l6ZSAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQ1M1MDAwX1RTX1hfU0laRV9VUFBFUiwKKwkJCXBsYXRmb3JtX2RhdGEtPnhfc2l6ZSA+PiA4KTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUNTNTAwMF9UU19YX1NJWkVfTE9XRVIsCisJCQlwbGF0Zm9ybV9kYXRhLT54X3NpemUgJiAweGZmKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUNTNTAwMF9UU19ZX1NJWkVfVVBQRVIsCisJCQlwbGF0Zm9ybV9kYXRhLT55X3NpemUgPj4gOCk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1DUzUwMDBfVFNfWV9TSVpFX0xPV0VSLAorCQkJcGxhdGZvcm1fZGF0YS0+eV9zaXplICYgMHhmZik7CisKKwkvKiBUb3VjaCBhY3RpdmUgbW9kZSAmIDgwIHJlcG9ydCByYXRlICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIE1DUzUwMDBfVFNfT1BfTU9ERSwKKwkJCU9QX01PREVfQUNUSVZFIHwgUkVQT1JUX1JBVEVfODApOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtY3M1MDAwX3RzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbWNzNTAwMF90c19kYXRhICpkYXRhOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgcmV0OworCisJaWYgKCFjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWNzNTAwMF90c19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFkYXRhIHx8ICFpbnB1dF9kZXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWRhdGEtPmlucHV0X2RldiA9IGlucHV0X2RldjsKKwlkYXRhLT5wbGF0Zm9ybV9kYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlucHV0X2Rldi0+bmFtZSA9ICJNRUxQQVMgTUNTLTUwMDAgVG91Y2hzY3JlZW4iOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCisJX19zZXRfYml0KEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEJUTl9UT1VDSCwgaW5wdXRfZGV2LT5rZXliaXQpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIE1DUzUwMDBfTUFYX1hDLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLCBNQ1M1MDAwX01BWF9ZQywgMCwgMCk7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIGRhdGEpOworCisJaWYgKGRhdGEtPnBsYXRmb3JtX2RhdGEtPmNmZ19waW4pCisJCWRhdGEtPnBsYXRmb3JtX2RhdGEtPmNmZ19waW4oKTsKKworCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGNsaWVudC0+aXJxLCBOVUxMLCBtY3M1MDAwX3RzX2ludGVycnVwdCwKKwkJCUlSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsICJtY3M1MDAwX3RzIiwgZGF0YSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwltY3M1MDAwX3RzX3BoeXNfaW5pdChkYXRhKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGRhdGEpOworZXJyX2ZyZWVfbWVtOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWNzNTAwMF90c19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbWNzNTAwMF90c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlmcmVlX2lycShjbGllbnQtPmlycSwgZGF0YSk7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKKwlrZnJlZShkYXRhKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG1jczUwMDBfdHNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwkvKiBUb3VjaCBzbGVlcCBtb2RlICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1DUzUwMDBfVFNfT1BfTU9ERSwgT1BfTU9ERV9TTEVFUCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY3M1MDAwX3RzX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtY3M1MDAwX3RzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCW1jczUwMDBfdHNfcGh5c19pbml0KGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBtY3M1MDAwX3RzX3N1c3BlbmQJTlVMTAorI2RlZmluZSBtY3M1MDAwX3RzX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1jczUwMDBfdHNfaWRbXSA9IHsKKwl7ICJtY3M1MDAwX3RzIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtY3M1MDAwX3RzX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1jczUwMDBfdHNfZHJpdmVyID0geworCS5wcm9iZQkJPSBtY3M1MDAwX3RzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobWNzNTAwMF90c19yZW1vdmUpLAorCS5zdXNwZW5kCT0gbWNzNTAwMF90c19zdXNwZW5kLAorCS5yZXN1bWUJCT0gbWNzNTAwMF90c19yZXN1bWUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibWNzNTAwMF90cyIsCisJfSwKKwkuaWRfdGFibGUJPSBtY3M1MDAwX3RzX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWNzNTAwMF90c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtY3M1MDAwX3RzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtY3M1MDAwX3RzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbWNzNTAwMF90c19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtY3M1MDAwX3RzX2luaXQpOworbW9kdWxlX2V4aXQobWNzNTAwMF90c19leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRvdWNoc2NyZWVuIGRyaXZlciBmb3IgTUVMRkFTIE1DUy01MDAwIGNvbnRyb2xsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205N3h4LWNvcmUuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205N3h4LWNvcmUuYwppbmRleCAyNTJlYjExLi5mOTQ0OTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTd4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3eHgtY29yZS5jCkBAIC01NjEsNiArNTYxLDcgQEAKIHN0YXRpYyBpbnQgd205N3h4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgd205N3h4ICp3bTsKKwlzdHJ1Y3Qgd205N3h4X3BkYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAlpbnQgcmV0ID0gMCwgaWQgPSAwOwogCiAJd20gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd205N3h4KSwgR0ZQX0tFUk5FTCk7CkBAIC02NTgsNiArNjU5LDcgQEAKIAl9CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEod20tPmJhdHRlcnlfZGV2LCB3bSk7CiAJd20tPmJhdHRlcnlfZGV2LT5kZXYucGFyZW50ID0gZGV2OworCXdtLT5iYXR0ZXJ5X2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHdtLT5iYXR0ZXJ5X2Rldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gYmF0dF9yZWdfZXJyOwpAQCAtNjcxLDYgKzY3Myw3IEBACiAJfQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHdtLT50b3VjaF9kZXYsIHdtKTsKIAl3bS0+dG91Y2hfZGV2LT5kZXYucGFyZW50ID0gZGV2OworCXdtLT50b3VjaF9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh3bS0+dG91Y2hfZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byB0b3VjaF9yZWdfZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCmluZGV4IDJkODM1MjQuLjY1YmY5MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKQEAgLTYwMyw3ICs2MDMsNyBAQAogCiAJaWYgKENBUElNU0dfQ01EKHNrYi0+ZGF0YSkgPT0gQ0FQSV9DT05ORUNUX0IzX0NPTkYpIHsKIAkJdTE2IGluZm8gPSBDQVBJTVNHX1UxNihza2ItPmRhdGEsIDEyKTsgLy8gSW5mbyBmaWVsZAotCQlpZiAoaW5mbyA9PSAwKSB7CisJCWlmICgoaW5mbyAmIDB4ZmYwMCkgPT0gMCkgewogCQkJbXV0ZXhfbG9jaygmY2Rldi0+bmNjaV9saXN0X210eCk7CiAJCQljYXBpbmNjaV9hbGxvYyhjZGV2LCBDQVBJTVNHX05DQ0koc2tiLT5kYXRhKSk7CiAJCQltdXRleF91bmxvY2soJmNkZXYtPm5jY2lfbGlzdF9tdHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jCmluZGV4IDY1MDEyMDIuLjNlNmQxN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMKQEAgLTQwLDcgKzQwLDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQ0FQSTRMaW51eDogSW50ZXJmYWNlIHRvIElTRE40TGludXgiKTsKIE1PRFVMRV9BVVRIT1IoIkNhcnN0ZW4gUGFldGgiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLW1vZHVsZV9wYXJhbShkZWJ1Z21vZGUsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnbW9kZSwgdWludCwgU19JUlVHT3xTX0lXVVNSKTsKIAogLyogLS0tLS0tLS0gdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC02NzEsOCArNjcxLDggQEAKIAkJCQkgTlVMTCwJLyogVXNlcnVzZXJkYXRhICovICAgLyogJCQkJCAqLwogCQkJCSBOVUxMCS8qIEZhY2lsaXR5ZGF0YWFycmF5ICovCiAJKTsKLQlzZW5kX21lc3NhZ2UoY2FyZCwgJmNtc2cpOwogCXBsY2lfY2hhbmdlX3N0YXRlKGNhcmQsIG5jY2ktPnBsY2lwLCBFVl9QTENJX0RJU0NPTk5FQ1RfUkVRKTsKKwlzZW5kX21lc3NhZ2UoY2FyZCwgJmNtc2cpOwogCiAJY21kLmNvbW1hbmQgPSBJU0ROX1NUQVRfQkhVUDsKIAljbWQuZHJpdmVyID0gY2FyZC0+bXlpZDsKQEAgLTkyNCw4ICs5MjQsOCBAQAogCQkgKi8KIAkJY2FwaV9jbXNnX2Fuc3dlcihjbXNnKTsKIAkJY21zZy0+UmVqZWN0ID0gMTsJLyogaWdub3JlICovCi0JCXNlbmRfbWVzc2FnZShjYXJkLCBjbXNnKTsKIAkJcGxjaV9jaGFuZ2Vfc3RhdGUoY2FyZCwgcGxjaXAsIEVWX1BMQ0lfQ09OTkVDVF9SRUpFQ1QpOworCQlzZW5kX21lc3NhZ2UoY2FyZCwgY21zZyk7CiAJCXByaW50ayhLRVJOX0lORk8gImNhcGlkcnYtJWQ6IGluY29taW5nIGNhbGwgJXMsJWQsJWQsJXMgaWdub3JlZFxuIiwKIAkJCWNhcmQtPmNvbnRybnIsCiAJCQljbWQucGFybS5zZXR1cC5waG9uZSwKQEAgLTk3NCw4ICs5NzQsOCBAQAogCWNhc2UgMjoJCS8qIENhbGwgd2lsbCBiZSByZWplY3RlZC4gKi8KIAkJY2FwaV9jbXNnX2Fuc3dlcihjbXNnKTsKIAkJY21zZy0+UmVqZWN0ID0gMjsJLyogcmVqZWN0IGNhbGwsIG5vcm1hbCBjYWxsIGNsZWFyaW5nICovCi0JCXNlbmRfbWVzc2FnZShjYXJkLCBjbXNnKTsKIAkJcGxjaV9jaGFuZ2Vfc3RhdGUoY2FyZCwgcGxjaXAsIEVWX1BMQ0lfQ09OTkVDVF9SRUpFQ1QpOworCQlzZW5kX21lc3NhZ2UoY2FyZCwgY21zZyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTk4Myw4ICs5ODMsOCBAQAogCQljYXBpX2Ntc2dfYW5zd2VyKGNtc2cpOwogCQljbXNnLT5SZWplY3QgPSA4OwkvKiByZWplY3QgY2FsbCwKIAkJCQkJICAgZGVzdGluYXRpb24gb3V0IG9mIG9yZGVyICovCi0JCXNlbmRfbWVzc2FnZShjYXJkLCBjbXNnKTsKIAkJcGxjaV9jaGFuZ2Vfc3RhdGUoY2FyZCwgcGxjaXAsIEVWX1BMQ0lfQ09OTkVDVF9SRUpFQ1QpOworCQlzZW5kX21lc3NhZ2UoY2FyZCwgY21zZyk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm47CkBAIC0xMDIwLDggKzEwMjAsOCBAQAogCQljYXJkLT5iY2hhbnNbcGxjaXAtPmNoYW5dLmRpc2Nvbm5lY3RpbmcgPSAxOwogCQlwbGNpX2NoYW5nZV9zdGF0ZShjYXJkLCBwbGNpcCwgRVZfUExDSV9ESVNDT05ORUNUX0lORCk7CiAJCWNhcGlfY21zZ19hbnN3ZXIoY21zZyk7Ci0JCXNlbmRfbWVzc2FnZShjYXJkLCBjbXNnKTsKIAkJcGxjaV9jaGFuZ2Vfc3RhdGUoY2FyZCwgcGxjaXAsIEVWX1BMQ0lfRElTQ09OTkVDVF9SRVNQKTsKKwkJc2VuZF9tZXNzYWdlKGNhcmQsIGNtc2cpOwogCQlicmVhazsKIAogCWNhc2UgQ0FQSV9ESVNDT05ORUNUX0NPTkY6CS8qIHBsY2kgKi8KQEAgLTEwNzgsOCArMTA3OCw4IEBACiAKIAkJaWYgKGNhcmQtPmJjaGFuc1twbGNpcC0+Y2hhbl0uaW5jb21pbmcpIHsKIAkJCWNhcGlfY21zZ19hbnN3ZXIoY21zZyk7Ci0JCQlzZW5kX21lc3NhZ2UoY2FyZCwgY21zZyk7CiAJCQlwbGNpX2NoYW5nZV9zdGF0ZShjYXJkLCBwbGNpcCwgRVZfUExDSV9DT05ORUNUX0FDVElWRV9JTkQpOworCQkJc2VuZF9tZXNzYWdlKGNhcmQsIGNtc2cpOwogCQl9IGVsc2UgewogCQkJY2FwaWRydl9uY2NpICpuY2NpcDsKIAkJCWNhcGlfY21zZ19hbnN3ZXIoY21zZyk7CkBAIC0xMDk4LDEzICsxMDk4LDE0IEBACiAJCQkJCQkgTlVMTAkvKiBOQ1BJICovCiAJCQkpOwogCQkJbmNjaXAtPm1zZ2lkID0gY21zZy0+TWVzc2FnZW51bWJlcjsKKwkJCXBsY2lfY2hhbmdlX3N0YXRlKGNhcmQsIHBsY2lwLAorCQkJCQkgIEVWX1BMQ0lfQ09OTkVDVF9BQ1RJVkVfSU5EKTsKKwkJCW5jY2lfY2hhbmdlX3N0YXRlKGNhcmQsIG5jY2lwLCBFVl9OQ0NJX0NPTk5FQ1RfQjNfUkVRKTsKIAkJCXNlbmRfbWVzc2FnZShjYXJkLCBjbXNnKTsKIAkJCWNtZC5jb21tYW5kID0gSVNETl9TVEFUX0RDT05OOwogCQkJY21kLmRyaXZlciA9IGNhcmQtPm15aWQ7CiAJCQljbWQuYXJnID0gcGxjaXAtPmNoYW47CiAJCQljYXJkLT5pbnRlcmZhY2Uuc3RhdGNhbGxiKCZjbWQpOwotCQkJcGxjaV9jaGFuZ2Vfc3RhdGUoY2FyZCwgcGxjaXAsIEVWX1BMQ0lfQ09OTkVDVF9BQ1RJVkVfSU5EKTsKLQkJCW5jY2lfY2hhbmdlX3N0YXRlKGNhcmQsIG5jY2lwLCBFVl9OQ0NJX0NPTk5FQ1RfQjNfUkVRKTsKIAkJfQogCQlicmVhazsKIApAQCAtMTE5Myw4ICsxMTk0LDggQEAKIAkJCWdvdG8gbm90Zm91bmQ7CiAKIAkJY2FwaV9jbXNnX2Fuc3dlcihjbXNnKTsKLQkJc2VuZF9tZXNzYWdlKGNhcmQsIGNtc2cpOwogCQluY2NpX2NoYW5nZV9zdGF0ZShjYXJkLCBuY2NpcCwgRVZfTkNDSV9DT05ORUNUX0IzX0FDVElWRV9JTkQpOworCQlzZW5kX21lc3NhZ2UoY2FyZCwgY21zZyk7CiAKIAkJY21kLmNvbW1hbmQgPSBJU0ROX1NUQVRfQkNPTk47CiAJCWNtZC5kcml2ZXIgPSBjYXJkLT5teWlkOwpAQCAtMTIyMiw4ICsxMjIzLDggQEAKIAkJCQkJCQkgIDAsCS8qIFJlamVjdCAqLwogCQkJCQkJCSAgTlVMTAkvKiBOQ1BJICovCiAJCQkJKTsKLQkJCQlzZW5kX21lc3NhZ2UoY2FyZCwgY21zZyk7CiAJCQkJbmNjaV9jaGFuZ2Vfc3RhdGUoY2FyZCwgbmNjaXAsIEVWX05DQ0lfQ09OTkVDVF9CM19SRVNQKTsKKwkJCQlzZW5kX21lc3NhZ2UoY2FyZCwgY21zZyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlwcmludGsoS0VSTl9FUlIgImNhcGlkcnYtJWQ6IG5vIG1lbSBmb3IgbmNjaSwgc29ycnlcbiIsCQkJCQkJCWNhcmQtPmNvbnRybnIpOwpAQCAtMTI5OSw4ICsxMzAwLDggQEAKIAkJY2FyZC0+YmNoYW5zW25jY2lwLT5jaGFuXS5kaXNjb25uZWN0aW5nID0gMTsKIAkJbmNjaV9jaGFuZ2Vfc3RhdGUoY2FyZCwgbmNjaXAsIEVWX05DQ0lfRElTQ09OTkVDVF9CM19JTkQpOwogCQljYXBpX2Ntc2dfYW5zd2VyKGNtc2cpOwotCQlzZW5kX21lc3NhZ2UoY2FyZCwgY21zZyk7CiAJCW5jY2lfY2hhbmdlX3N0YXRlKGNhcmQsIG5jY2lwLCBFVl9OQ0NJX0RJU0NPTk5FQ1RfQjNfUkVTUCk7CisJCXNlbmRfbWVzc2FnZShjYXJkLCBjbXNnKTsKIAkJYnJlYWs7CiAKIAljYXNlIENBUElfRElTQ09OTkVDVF9CM19DT05GOgkvKiBuY2NpICovCkBAIC0yMDE0LDggKzIwMTUsOCBAQAogCQkJICAgICBjYXJkLT5jaXBtYXNrLAogCQkJICAgICBjYXJkLT5jaXBtYXNrMiwKIAkJCSAgICAgTlVMTCwgTlVMTCk7Ci0Jc2VuZF9tZXNzYWdlKGNhcmQsICZjbWRjbXNnKTsKIAlsaXN0ZW5fY2hhbmdlX3N0YXRlKGNhcmQsIEVWX0xJU1RFTl9SRVEpOworCXNlbmRfbWVzc2FnZShjYXJkLCAmY21kY21zZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGxpc3RlbnRpbWVyZnVuYyh1bnNpZ25lZCBsb25nIHgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYwppbmRleCA1N2QyNjM2Li5kYzUwNmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2RpdmVydC9kaXZlcnRfcHJvY2ZzLmMgYi9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2RpdmVydF9wcm9jZnMuYwppbmRleCA4YjI1NmE2Li4zNjk3YzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2RpdmVydF9wcm9jZnMuYworKysgYi9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2RpdmVydF9wcm9jZnMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2VuZGlmCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pc2RuaWYuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgImlzZG5fZGl2ZXJ0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9hc3luY2RhdGEuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCmluZGV4IDIzNGNjNWQuLjQ0YTU4ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCkBAIC0zMzQsNyArMzM0LDE0IEBACiAJcmV0dXJuIHN0YXJ0Ynl0ZXMgLSBudW1ieXRlczsKIH0KIAotLyogcHJvY2VzcyBhIGJsb2NrIG9mIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisvKioKKyAqIGdpZ2FzZXRfbTEweF9pbnB1dCgpIC0gcHJvY2VzcyBhIGJsb2NrIG9mIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlCisgKiBAaW5idWY6CXJlY2VpdmVkIGRhdGEgYW5kIGRldmljZSBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqCisgKiBDYWxsZWQgYnkgaGFyZHdhcmUgbW9kdWxlIHtzZXIsdXNifV9naWdhc2V0IHdpdGggYSBibG9jayBvZiByZWNlaXZlZAorICogYnl0ZXMuIFNlcGFyYXRlcyB0aGUgYnl0ZXMgcmVjZWl2ZWQgb3ZlciB0aGUgc2VyaWFsIGRhdGEgY2hhbm5lbCBpbnRvCisgKiB1c2VyIGRhdGEgYW5kIGNvbW1hbmQgcmVwbGllcyAobG9ja2VkL3VubG9ja2VkKSBhY2NvcmRpbmcgdG8gdGhlCisgKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbnRlcmZhY2UuCiAgKi8KIHZvaWQgZ2lnYXNldF9tMTB4X2lucHV0KHN0cnVjdCBpbmJ1Zl90ICppbmJ1ZikKIHsKQEAgLTU0MywxNiArNTUwLDE3IEBACiAJcmV0dXJuIGlyYXdfc2tiOwogfQogCi0vKiBnaWdhc2V0X3NlbmRfc2tiCi0gKiBjYWxsZWQgYnkgY29tbW9uLmMgdG8gcXVldWUgYW4gc2tiIGZvciBzZW5kaW5nCi0gKiBhbmQgc3RhcnQgdHJhbnNtaXNzaW9uIGlmIG5lY2Vzc2FyeQotICogcGFyYW1ldGVyczoKLSAqCUIgQ2hhbm5lbCBjb250cm9sIHN0cnVjdHVyZQotICoJc2tiCisvKioKKyAqIGdpZ2FzZXRfbTEweF9zZW5kX3NrYigpIC0gcXVldWUgYW4gc2tiIGZvciBzZW5kaW5nCisgKiBAYmNzOglCIGNoYW5uZWwgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKiBAc2tiOglkYXRhIHRvIHNlbmQuCisgKgorICogQ2FsbGVkIGJ5IGk0bC5jIHRvIGVuY29kZSBhbmQgcXVldWUgYW4gc2tiIGZvciBzZW5kaW5nLCBhbmQgc3RhcnQKKyAqIHRyYW5zbWlzc2lvbiBpZiBuZWNlc3NhcnkuCisgKgogICogUmV0dXJuIHZhbHVlOgotICoJbnVtYmVyIG9mIGJ5dGVzIGFjY2VwdGVkIGZvciBzZW5kaW5nCi0gKgkoc2tiLT5sZW4gaWYgb2ssIDAgaWYgb3V0IG9mIGJ1ZmZlciBzcGFjZSkKLSAqCW9yIGVycm9yIGNvZGUgKDwgMCwgZWcuIC1FSU5WQUwpCisgKgludW1iZXIgb2YgYnl0ZXMgYWNjZXB0ZWQgZm9yIHNlbmRpbmcgKHNrYi0+bGVuKSBpZiBvaywKKyAqCWVycm9yIGNvZGUgPCAwIChlZy4gLUVOT01FTSkgb24gZXJyb3IKICAqLwogaW50IGdpZ2FzZXRfbTEweF9zZW5kX3NrYihzdHJ1Y3QgYmNfc3RhdGUgKmJjcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9iYXMtZ2lnYXNldC5jCmluZGV4IDc4MWM0MDQuLjVlZDFkOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYmFzLWdpZ2FzZXQuYwpAQCAtMTM0LDYgKzEzNCw3IEBACiAjZGVmaW5lIEJTX0FUUkRQRU5ECTB4MDQwCS8qIHVyYl9jbWRfaW4gaW4gdXNlICovCiAjZGVmaW5lIEJTX0FUV1JQRU5ECTB4MDgwCS8qIHVyYl9jbWRfb3V0IGluIHVzZSAqLwogI2RlZmluZSBCU19TVVNQRU5ECTB4MTAwCS8qIFVTQiBwb3J0IHN1c3BlbmRlZCAqLworI2RlZmluZSBCU19SRVNFVFRJTkcJMHgyMDAJLyogd2FpdGluZyBmb3IgSERfUkVTRVRfSU5URVJSVVBUX1BJUEVfQUNLICovCiAKIAogc3RhdGljIHN0cnVjdCBnaWdhc2V0X2RyaXZlciAqZHJpdmVyID0gTlVMTDsKQEAgLTMxOSw2ICszMjAsMjEgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorLyogc2V0L2NsZWFyIGJpdHMgaW4gYmFzZSBjb25uZWN0aW9uIHN0YXRlLCByZXR1cm4gcHJldmlvdXMgc3RhdGUKKyAqLworc3RhdGljIGlubGluZSBpbnQgdXBkYXRlX2Jhc3N0YXRlKHN0cnVjdCBiYXNfY2FyZHN0YXRlICp1Y3MsCisJCQkJICBpbnQgc2V0LCBpbnQgY2xlYXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWNzLT5sb2NrLCBmbGFncyk7CisJc3RhdGUgPSB1Y3MtPmJhc3N0YXRlOworCXVjcy0+YmFzc3RhdGUgPSAoc3RhdGUgJiB+Y2xlYXIpIHwgc2V0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0ZTsKK30KKwogLyogZXJyb3JfaGFuZ3VwCiAgKiBoYW5nIHVwIGFueSBleGlzdGluZyBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcgogICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQgYW5kIHRha2VzIGNhcmUgb2Ygc2NoZWR1bGluZwpAQCAtMzUwLDEyICszNjYsOSBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZXJyb3JfcmVzZXQoc3RydWN0IGNhcmRzdGF0ZSAqY3MpCiB7Ci0JLyogY2xvc2UgQVQgY29tbWFuZCBjaGFubmVsIHRvIHJlY292ZXIgKGlnbm9yZSBlcnJvcnMpICovCi0JcmVxX3N1Ym1pdChjcy0+YmNzLCBIRF9DTE9TRV9BVENIQU5ORUwsIDAsIEJBU19USU1FT1VUKTsKLQotCS8vRklYTUUgdHJ5IHRvIHJlY292ZXIgd2l0aG91dCBib3RoZXJpbmcgdGhlIHVzZXIKLQlkZXZfZXJyKGNzLT5kZXYsCi0JICAgICJ1bnJlY292ZXJhYmxlIGVycm9yIC0gcGxlYXNlIGRpc2Nvbm5lY3QgR2lnYXNldCBiYXNlIHRvIHJlc2V0XG4iKTsKKwkvKiByZXNldCBpbnRlcnJ1cHQgcGlwZSB0byByZWNvdmVyIChpZ25vcmUgZXJyb3JzKSAqLworCXVwZGF0ZV9iYXNzdGF0ZShjcy0+aHcuYmFzLCBCU19SRVNFVFRJTkcsIDApOworCXJlcV9zdWJtaXQoY3MtPmJjcywgSERfUkVTRVRfSU5URVJSVVBUX1BJUEUsIDAsIEJBU19USU1FT1VUKTsKIH0KIAogLyogY2hlY2tfcGVuZGluZwpAQCAtMzk4LDggKzQxMSwxMyBAQAogCWNhc2UgSERfREVWSUNFX0lOSVRfQUNLOgkJLyogbm8gcmVwbHkgZXhwZWN0ZWQgKi8KIAkJdWNzLT5wZW5kaW5nID0gMDsKIAkJYnJlYWs7Ci0JLyogSERfUkVBRF9BVE1FU1NBR0UsIEhEX1dSSVRFX0FUTUVTU0FHRSwgSERfUkVTRVRfSU5URVJSVVBUUElQRQotCSAqIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgYW5kIHNob3VsZCBuZXZlciBlbmQgdXAgaGVyZQorCWNhc2UgSERfUkVTRVRfSU5URVJSVVBUX1BJUEU6CisJCWlmICghKHVjcy0+YmFzc3RhdGUgJiBCU19SRVNFVFRJTkcpKQorCQkJdWNzLT5wZW5kaW5nID0gMDsKKwkJYnJlYWs7CisJLyoKKwkgKiBIRF9SRUFEX0FUTUVTU0FHRSBhbmQgSERfV1JJVEVfQVRNRVNTQUdFIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKKwkgKiBhbmQgc2hvdWxkIG5ldmVyIGVuZCB1cCBoZXJlCiAJICovCiAJZGVmYXVsdDoKIAkJZGV2X3dhcm4oJnVjcy0+aW50ZXJmYWNlLT5kZXYsCkBAIC00NDksMjEgKzQ2Nyw2IEBACiAJZXJyb3JfcmVzZXQoY3MpOwogfQogCi0vKiBzZXQvY2xlYXIgYml0cyBpbiBiYXNlIGNvbm5lY3Rpb24gc3RhdGUsIHJldHVybiBwcmV2aW91cyBzdGF0ZQotICovCi1pbmxpbmUgc3RhdGljIGludCB1cGRhdGVfYmFzc3RhdGUoc3RydWN0IGJhc19jYXJkc3RhdGUgKnVjcywKLQkJCQkgIGludCBzZXQsIGludCBjbGVhcikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBzdGF0ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ1Y3MtPmxvY2ssIGZsYWdzKTsKLQlzdGF0ZSA9IHVjcy0+YmFzc3RhdGU7Ci0JdWNzLT5iYXNzdGF0ZSA9IChzdGF0ZSAmIH5jbGVhcikgfCBzZXQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWNzLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHN0YXRlOwotfQotCiAvKiByZWFkX2N0cmxfY2FsbGJhY2sKICAqIFVTQiBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGNvbnRyb2wgcGlwZSBpbnB1dAogICogY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtIGluIGludGVycnVwdCBjb250ZXh0CkBAIC03NjIsNyArNzY1LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIEhEX1JFU0VUX0lOVEVSUlVQVF9QSVBFX0FDSzoKLQkJZ2lnX2RiZyhERUJVR19VU0JSRVEsICJIRF9SRVNFVF9JTlRFUlJVUFRfUElQRV9BQ0siKTsKKwkJdXBkYXRlX2Jhc3N0YXRlKHVjcywgMCwgQlNfUkVTRVRUSU5HKTsKKwkJZGV2X25vdGljZShjcy0+ZGV2LCAiaW50ZXJydXB0IHBpcGUgcmVzZXRcbiIpOwogCQlicmVhazsKIAogCWNhc2UgSERfU1VTUEVORF9FTkQ6CkBAIC0xMzMxLDI4ICsxMzM1LDI0IEBACiAJCXJjdmJ1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCQl0b3RsZWZ0ID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlmb3IgKGZyYW1lID0gMDsgdG90bGVmdCA+IDAgJiYgZnJhbWUgPCBCQVNfTlVNRlJBTUVTOyBmcmFtZSsrKSB7Ci0JCQlpZiAodW5saWtlbHkodXJiLT5pc29fZnJhbWVfZGVzY1tmcmFtZV0uc3RhdHVzKSkgeworCQkJbnVtYnl0ZXMgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ZyYW1lXS5hY3R1YWxfbGVuZ3RoOworCQkJaWYgKHVubGlrZWx5KHVyYi0+aXNvX2ZyYW1lX2Rlc2NbZnJhbWVdLnN0YXR1cykpCiAJCQkJZGV2X3dhcm4oY3MtPmRldiwKLQkJCQkJICJpc29jaHJvbm91cyByZWFkOiBmcmFtZSAlZDogJXNcbiIsCi0JCQkJCSBmcmFtZSwKKwkJCQkJICJpc29jaHJvbm91cyByZWFkOiBmcmFtZSAlZFslZF06ICVzXG4iLAorCQkJCQkgZnJhbWUsIG51bWJ5dGVzLAogCQkJCQkgZ2V0X3VzYl9zdGF0bXNnKAogCQkJCQkgICAgdXJiLT5pc29fZnJhbWVfZGVzY1tmcmFtZV0uc3RhdHVzKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQludW1ieXRlcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbZnJhbWVdLmFjdHVhbF9sZW5ndGg7Ci0JCQlpZiAodW5saWtlbHkobnVtYnl0ZXMgPiBCQVNfTUFYRlJBTUUpKSB7CisJCQlpZiAodW5saWtlbHkobnVtYnl0ZXMgPiBCQVNfTUFYRlJBTUUpKQogCQkJCWRldl93YXJuKGNzLT5kZXYsCiAJCQkJCSAiaXNvY2hyb25vdXMgcmVhZDogZnJhbWUgJWQ6ICIKIAkJCQkJICJudW1ieXRlcyAoJWQpID4gQkFTX01BWEZSQU1FXG4iLAogCQkJCQkgZnJhbWUsIG51bWJ5dGVzKTsKLQkJCQlicmVhazsKLQkJCX0KIAkJCWlmICh1bmxpa2VseShudW1ieXRlcyA+IHRvdGxlZnQpKSB7CiAJCQkJZGV2X3dhcm4oY3MtPmRldiwKIAkJCQkJICJpc29jaHJvbm91cyByZWFkOiBmcmFtZSAlZDogIgogCQkJCQkgIm51bWJ5dGVzICglZCkgPiB0b3RsZWZ0ICglZClcbiIsCiAJCQkJCSBmcmFtZSwgbnVtYnl0ZXMsIHRvdGxlZnQpOwotCQkJCWJyZWFrOworCQkJCW51bWJ5dGVzID0gdG90bGVmdDsKIAkJCX0KIAkJCW9mZnNldCA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbZnJhbWVdLm9mZnNldDsKIAkJCWlmICh1bmxpa2VseShvZmZzZXQgKyBudW1ieXRlcyA+IEJBU19JTkJVRlNJWkUpKSB7CkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCQkJCQkgIm9mZnNldCAoJWQpICsgbnVtYnl0ZXMgKCVkKSAiCiAJCQkJCSAiPiBCQVNfSU5CVUZTSVpFXG4iLAogCQkJCQkgZnJhbWUsIG9mZnNldCwgbnVtYnl0ZXMpOwotCQkJCWJyZWFrOworCQkJCW51bWJ5dGVzID0gQkFTX0lOQlVGU0laRSAtIG9mZnNldDsKIAkJCX0KIAkJCWdpZ2FzZXRfaXNvY19yZWNlaXZlKHJjdmJ1ZiArIG9mZnNldCwgbnVtYnl0ZXMsIGJjcyk7CiAJCQl0b3RsZWZ0IC09IG51bWJ5dGVzOwpAQCAtMTQzMyw2ICsxNDMzLDcgQEAKIAogCWNhc2UgSERfQ0xPU0VfQVRDSEFOTkVMOgogCQlkZXZfZXJyKGJjcy0+Y3MtPmRldiwgInRpbWVvdXQgY2xvc2luZyBBVCBjaGFubmVsXG4iKTsKKwkJZXJyb3JfcmVzZXQoYmNzLT5jcyk7CiAJCWJyZWFrOwogCiAJY2FzZSBIRF9DTE9TRV9CMkNIQU5ORUw6CkBAIC0xNDQyLDYgKzE0NDMsMTMgQEAKIAkJZXJyb3JfcmVzZXQoYmNzLT5jcyk7CiAJCWJyZWFrOwogCisJY2FzZSBIRF9SRVNFVF9JTlRFUlJVUFRfUElQRToKKwkJLyogZXJyb3IgcmVjb3ZlcnkgZXNjYWxhdGlvbiAqLworCQlkZXZfZXJyKGJjcy0+Y3MtPmRldiwKKwkJCSJyZXNldCBpbnRlcnJ1cHQgcGlwZSB0aW1lb3V0LCBhdHRlbXB0aW5nIFVTQiByZXNldFxuIik7CisJCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoYmNzLT5jcy0+aHcuYmFzLT5pbnRlcmZhY2UpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWRldl93YXJuKGJjcy0+Y3MtPmRldiwgInJlcXVlc3QgMHglMDJ4IHRpbWVkIG91dCwgY2xlYXJpbmdcbiIsCiAJCQkgcGVuZGluZyk7CkBAIC0xOTM0LDYgKzE5NDIsMTUgQEAKIAkJZ290byBub3RxdWV1ZWQ7CiAJfQogCisJLyogdHJhbnNsYXRlICIrKysiIGVzY2FwZSBzZXF1ZW5jZSBzZW50IGFzIGEgc2luZ2xlIHNlcGFyYXRlIGNvbW1hbmQKKwkgKiBpbnRvICJjbG9zZSBBVCBjaGFubmVsIiBjb21tYW5kIGZvciBlcnJvciByZWNvdmVyeQorCSAqIFRoZSBuZXh0IGNvbW1hbmQgd2lsbCByZW9wZW4gdGhlIEFUIGNoYW5uZWwgYXV0b21hdGljYWxseS4KKwkgKi8KKwlpZiAobGVuID09IDMgJiYgIW1lbWNtcChidWYsICIrKysiLCAzKSkgeworCQlyYyA9IHJlcV9zdWJtaXQoY3MtPmJjcywgSERfQ0xPU0VfQVRDSEFOTkVMLCAwLCBCQVNfVElNRU9VVCk7CisJCWdvdG8gbm90cXVldWVkOworCX0KKwogCWlmIChsZW4gPiBJRl9XUklURUJVRikKIAkJbGVuID0gSUZfV1JJVEVCVUY7CiAJaWYgKCEoY2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kYnVmX3QpICsgbGVuLCBHRlBfQVRPTUlDKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMKaW5kZXggZTQxNDFiZi4uMzNkY2Q4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY29tbW9uLmMKQEAgLTIyLDYgKzIyLDEyIEBACiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkhhbnNqb2VyZyBMaXBwIDxoamxpcHBAd2ViLmRlPiwgVGlsbWFuIFNjaG1pZHQgPHRpbG1hbkBpbWFwLmNjPiwgU3RlZmFuIEVpbGVycyIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkRyaXZlciBmb3IgR2lnYXNldCAzMDd4IgogCisjaWZkZWYgQ09ORklHX0dJR0FTRVRfREVCVUcKKyNkZWZpbmUgRFJJVkVSX0RFU0NfREVCVUcgIiAoZGVidWcgYnVpbGQpIgorI2Vsc2UKKyNkZWZpbmUgRFJJVkVSX0RFU0NfREVCVUcgIiIKKyNlbmRpZgorCiAvKiBNb2R1bGUgcGFyYW1ldGVycyAqLwogaW50IGdpZ2FzZXRfZGVidWdsZXZlbCA9IERFQlVHX0RFRkFVTFQ7CiBFWFBPUlRfU1lNQk9MX0dQTChnaWdhc2V0X2RlYnVnbGV2ZWwpOwpAQCAtMzIsNiArMzgsMTcgQEAKICNkZWZpbmUgVkFMSURfTUlOT1IJMHgwMQogI2RlZmluZSBWQUxJRF9JRAkweDAyCiAKKy8qKgorICogZ2lnYXNldF9kYmdfYnVmZmVyKCkgLSBkdW1wIGRhdGEgaW4gQVNDSUkgYW5kIGhleCBmb3IgZGVidWdnaW5nCisgKiBAbGV2ZWw6CWRlYnVnZ2luZyBsZXZlbC4KKyAqIEBtc2c6CW1lc3NhZ2UgcHJlZml4LgorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIGR1bXAuCisgKiBAYnVmOglkYXRhIHRvIGR1bXAuCisgKgorICogSWYgdGhlIGN1cnJlbnQgZGVidWdnaW5nIGxldmVsIGluY2x1ZGVzIG9uZSBvZiB0aGUgYml0cyBzZXQgaW4gQGxldmVsLAorICogQGxlbiBieXRlcyBzdGFydGluZyBhdCBAYnVmIGFyZSBsb2dnZWQgdG8gZG1lc2cgYXQgS0VSTl9ERUJVRyBwcmlvLAorICogcHJlZml4ZWQgYnkgdGhlIHRleHQgQG1zZy4KKyAqLwogdm9pZCBnaWdhc2V0X2RiZ19idWZmZXIoZW51bSBkZWJ1Z2xldmVsIGxldmVsLCBjb25zdCB1bnNpZ25lZCBjaGFyICptc2csCiAJCQlzaXplX3QgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYpCiB7CkBAIC0yNzQsNiArMjkxLDIwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmV2X2xvY2ssIGZsYWdzKTsKIH0KIAorLyoqCisgKiBnaWdhc2V0X2FkZF9ldmVudCgpIC0gYWRkIGV2ZW50IHRvIGRldmljZSBldmVudCBxdWV1ZQorICogQGNzOgkJZGV2aWNlIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorICogQGF0X3N0YXRlOgljb25uZWN0aW9uIHN0YXRlIHN0cnVjdHVyZS4KKyAqIEB0eXBlOglldmVudCB0eXBlLgorICogQHB0cjoJcG9pbnRlciBwYXJhbWV0ZXIgZm9yIGV2ZW50LgorICogQHBhcmFtZXRlcjoJaW50ZWdlciBwYXJhbWV0ZXIgZm9yIGV2ZW50LgorICogQGFyZzoJcG9pbnRlciBwYXJhbWV0ZXIgZm9yIGV2ZW50LgorICoKKyAqIEFsbG9jYXRlIGFuIGV2ZW50IHF1ZXVlIGVudHJ5IGZyb20gdGhlIGRldmljZSdzIGV2ZW50IHF1ZXVlLCBhbmQgc2V0IGl0IHVwCisgKiB3aXRoIHRoZSBwYXJhbWV0ZXJzIGdpdmVuLgorICoKKyAqIFJldHVybiB2YWx1ZTogYWRkZWQgZXZlbnQKKyAqLwogc3RydWN0IGV2ZW50X3QgKmdpZ2FzZXRfYWRkX2V2ZW50KHN0cnVjdCBjYXJkc3RhdGUgKmNzLAogCQkJCSAgc3RydWN0IGF0X3N0YXRlX3QgKmF0X3N0YXRlLCBpbnQgdHlwZSwKIAkJCQkgIHZvaWQgKnB0ciwgaW50IHBhcmFtZXRlciwgdm9pZCAqYXJnKQpAQCAtMzk4LDYgKzQyOSwxNSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydi0+bG9jaywgZmxhZ3MpOwogfQogCisvKioKKyAqIGdpZ2FzZXRfZnJlZWNzKCkgLSBmcmVlIGFsbCBhc3NvY2lhdGVkIHJlc3NvdXJjZXMgb2YgYSBkZXZpY2UKKyAqIEBjczoJCWRldmljZSBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqCisgKiBTdG9wcyBhbGwgdGFza2xldHMgYW5kIHRpbWVycywgdW5yZWdpc3RlcnMgdGhlIGRldmljZSBmcm9tIGFsbAorICogc3Vic3lzdGVtcyBpdCB3YXMgcmVnaXN0ZXJlZCB0bywgZGVhbGxvY2F0ZXMgdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjcyBhbmQgYWxsIHN0cnVjdHVyZXMgcmVmZXJlbmNlZCBmcm9tIGl0LgorICogT3BlcmF0aW9ucyBvbiB0aGUgZGV2aWNlIHNob3VsZCBiZSBzdG9wcGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KIHZvaWQgZ2lnYXNldF9mcmVlY3Moc3RydWN0IGNhcmRzdGF0ZSAqY3MpCiB7CiAJaW50IGk7CkBAIC01MDYsNyArNTQ2LDEyIEBACiAJaW5idWYtPmlucHV0c3RhdGUgPSBpbnB1dHN0YXRlOwogfQogCi0vKiBhcHBlbmQgcmVjZWl2ZWQgYnl0ZXMgdG8gaW5idWYgKi8KKy8qKgorICogZ2lnYXNldF9maWxsX2luYnVmKCkgLSBhcHBlbmQgcmVjZWl2ZWQgZGF0YSB0byBpbnB1dCBidWZmZXIKKyAqIEBpbmJ1ZjoJYnVmZmVyIHN0cnVjdHVyZS4KKyAqIEBzcmM6CXJlY2VpdmVkIGRhdGEuCisgKiBAbnVtYnl0ZXM6CW51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KKyAqLwogaW50IGdpZ2FzZXRfZmlsbF9pbmJ1ZihzdHJ1Y3QgaW5idWZfdCAqaW5idWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKIAkJICAgICAgIHVuc2lnbmVkIG51bWJ5dGVzKQogewpAQCAtNjA2LDIwICs2NTEsMjIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyogZ2lnYXNldF9pbml0Y3MKKy8qKgorICogZ2lnYXNldF9pbml0Y3MoKSAtIGluaXRpYWxpemUgZGV2aWNlIHN0cnVjdHVyZQorICogQGRydjoJaGFyZHdhcmUgZHJpdmVyIHRoZSBkZXZpY2UgYmVsb25ncyB0bworICogQGNoYW5uZWxzOgludW1iZXIgb2YgQiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgZGV2aWNlCisgKiBAb25lY2hhbm5lbDoJIT0wIGlmIEIgY2hhbm5lbCBkYXRhIGFuZCBBVCBjb21tYW5kcyBzaGFyZSBvbmUKKyAqCQkgICAgY29tbXVuaWNhdGlvbiBjaGFubmVsIChNMTB4KSwKKyAqCQk9PTAgaWYgQiBjaGFubmVscyBoYXZlIHNlcGFyYXRlIGNvbW11bmljYXRpb24gY2hhbm5lbHMgKGJhc2UpCisgKiBAaWdub3JlZnJhbWVzOgludW1iZXIgb2YgZnJhbWVzIHRvIGlnbm9yZSBhZnRlciBzZXR0aW5nIHVwIEIgY2hhbm5lbAorICogQGNpZG1vZGU6CSE9MDogc3RhcnQgaW4gQ2FsbElEIG1vZGUKKyAqIEBtb2R1bGVuYW1lOgluYW1lIG9mIGRyaXZlciBtb2R1bGUgZm9yIExMIHJlZ2lzdHJhdGlvbgorICoKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGNhcmRzdGF0ZSBzdHJ1Y3R1cmUgZm9yIEdpZ2FzZXQgZHJpdmVyCiAgKiBDYWxscyBoYXJkd2FyZSBkZXBlbmRlbnQgZ2lnYXNldF9pbml0Y3NodygpIGZ1bmN0aW9uCiAgKiBDYWxscyBCIGNoYW5uZWwgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZ2lnYXNldF9pbml0YmNzKCkgZm9yIGVhY2ggQiBjaGFubmVsCi0gKiBwYXJhbWV0ZXJzOgotICoJZHJ2CQloYXJkd2FyZSBkcml2ZXIgdGhlIGRldmljZSBiZWxvbmdzIHRvCi0gKgljaGFubmVscwludW1iZXIgb2YgQiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgZGV2aWNlCi0gKglvbmVjaGFubmVsCSE9MDogQiBjaGFubmVsIGRhdGEgYW5kIEFUIGNvbW1hbmRzIHNoYXJlIG9uZQotICoJCQkgICAgIGNvbW11bmljYXRpb24gY2hhbm5lbAotICoJCQk9PTA6IEIgY2hhbm5lbHMgaGF2ZSBzZXBhcmF0ZSBjb21tdW5pY2F0aW9uIGNoYW5uZWxzCi0gKglpZ25vcmVmcmFtZXMJbnVtYmVyIG9mIGZyYW1lcyB0byBpZ25vcmUgYWZ0ZXIgc2V0dGluZyB1cCBCIGNoYW5uZWwKLSAqCWNpZG1vZGUJCSE9MDogc3RhcnQgaW4gQ2FsbElEIG1vZGUKLSAqCW1vZHVsZW5hbWUJbmFtZSBvZiBkcml2ZXIgbW9kdWxlICh1c2VkIGZvciBJNEwgcmVnaXN0cmF0aW9uKQotICogcmV0dXJuIHZhbHVlOgorICoKKyAqIFJldHVybiB2YWx1ZToKICAqCXBvaW50ZXIgdG8gY2FyZHN0YXRlIHN0cnVjdHVyZQogICovCiBzdHJ1Y3QgY2FyZHN0YXRlICpnaWdhc2V0X2luaXRjcyhzdHJ1Y3QgZ2lnYXNldF9kcml2ZXIgKmRydiwgaW50IGNoYW5uZWxzLApAQCAtODM3LDYgKzg4NCwxNyBAQAogfQogCiAKKy8qKgorICogZ2lnYXNldF9zdGFydCgpIC0gc3RhcnQgZGV2aWNlIG9wZXJhdGlvbnMKKyAqIEBjczoJCWRldmljZSBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqCisgKiBQcmVwYXJlcyB0aGUgZGV2aWNlIGZvciB1c2UgYnkgc2V0dGluZyB1cCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMsCisgKiBzY2hlZHVsaW5nIGFuIEVWX1NUQVJUIGV2ZW50IHRvIGluaXRpYXRlIGRldmljZSBpbml0aWFsaXphdGlvbiwgYW5kCisgKiB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIHRoZSBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkxIC0gc3VjY2VzcywgMCAtIGVycm9yCisgKi8KIGludCBnaWdhc2V0X3N0YXJ0KHN0cnVjdCBjYXJkc3RhdGUgKmNzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC04NzksOSArOTM3LDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnaWdhc2V0X3N0YXJ0KTsKIAotLyogZ2lnYXNldF9zaHV0ZG93bgotICogY2hlY2sgaWYgYSBkZXZpY2UgaXMgYXNzb2NpYXRlZCB0byB0aGUgY2FyZHN0YXRlIHN0cnVjdHVyZSBhbmQgc3RvcCBpdAotICogcmV0dXJuIHZhbHVlOiAwIGlmIG9rLCAtMSBpZiBubyBkZXZpY2Ugd2FzIGFzc29jaWF0ZWQKKy8qKgorICogZ2lnYXNldF9zaHV0ZG93bigpIC0gc2h1dCBkb3duIGRldmljZSBvcGVyYXRpb25zCisgKiBAY3M6CQlkZXZpY2UgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKgorICogRGVhY3RpdmF0ZXMgdGhlIGRldmljZSBieSBzY2hlZHVsaW5nIGFuIEVWX1NIVVRET1dOIGV2ZW50IGFuZAorICogd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiB0aGUgc2h1dGRvd24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJMCAtIHN1Y2Nlc3MsIC0xIC0gZXJyb3IgKG5vIGRldmljZSBhc3NvY2lhdGVkKQogICovCiBpbnQgZ2lnYXNldF9zaHV0ZG93bihzdHJ1Y3QgY2FyZHN0YXRlICpjcykKIHsKQEAgLTkxMiw2ICs5NzYsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdpZ2FzZXRfc2h1dGRvd24pOwogCisvKioKKyAqIGdpZ2FzZXRfc3RvcCgpIC0gc3RvcCBkZXZpY2Ugb3BlcmF0aW9ucworICogQGNzOgkJZGV2aWNlIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorICoKKyAqIFN0b3BzIG9wZXJhdGlvbnMgb24gdGhlIGRldmljZSBieSBzY2hlZHVsaW5nIGFuIEVWX1NUT1AgZXZlbnQgYW5kCisgKiB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIHRoZSBzaHV0ZG93bi4KKyAqLwogdm9pZCBnaWdhc2V0X3N0b3Aoc3RydWN0IGNhcmRzdGF0ZSAqY3MpCiB7CiAJbXV0ZXhfbG9jaygmY3MtPm11dGV4KTsKQEAgLTEwMjAsNiArMTA5MSwxNCBAQAogCXJldHVybiBnaWdhc2V0X2dldF9jc19ieV9taW5vcih0dHktPmluZGV4ICsgdHR5LT5kcml2ZXItPm1pbm9yX3N0YXJ0KTsKIH0KIAorLyoqCisgKiBnaWdhc2V0X2ZyZWVkcml2ZXIoKSAtIGZyZWUgYWxsIGFzc29jaWF0ZWQgcmVzc291cmNlcyBvZiBhIGRyaXZlcgorICogQGRydjoJZHJpdmVyIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorICoKKyAqIFVucmVnaXN0ZXJzIHRoZSBkcml2ZXIgZnJvbSB0aGUgc3lzdGVtIGFuZCBkZWFsbG9jYXRlcyB0aGUgZHJpdmVyCisgKiBzdHJ1Y3R1cmUgQGRydiBhbmQgYWxsIHN0cnVjdHVyZXMgcmVmZXJlbmNlZCBmcm9tIGl0LgorICogQWxsIGRldmljZXMgc2hvdWxkIGJlIHNodXQgZG93biBiZWZvcmUgY2FsbGluZyB0aGlzLgorICovCiB2b2lkIGdpZ2FzZXRfZnJlZWRyaXZlcihzdHJ1Y3QgZ2lnYXNldF9kcml2ZXIgKmRydikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTAzNSwxNCArMTExNCwxNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2lnYXNldF9mcmVlZHJpdmVyKTsKIAotLyogZ2lnYXNldF9pbml0ZHJpdmVyCisvKioKKyAqIGdpZ2FzZXRfaW5pdGRyaXZlcigpIC0gaW5pdGlhbGl6ZSBkcml2ZXIgc3RydWN0dXJlCisgKiBAbWlub3I6CUZpcnN0IG1pbm9yIG51bWJlcgorICogQG1pbm9yczoJTnVtYmVyIG9mIG1pbm9ycyB0aGlzIGRyaXZlciBjYW4gaGFuZGxlCisgKiBAcHJvY25hbWU6CU5hbWUgb2YgdGhlIGRyaXZlcgorICogQGRldm5hbWU6CU5hbWUgb2YgdGhlIGRldmljZSBmaWxlcyAocHJlZml4IHdpdGhvdXQgbWlub3IgbnVtYmVyKQorICoKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGdpZ2FzZXRfZHJpdmVyIHN0cnVjdHVyZS4gSW5pdGlhbGl6ZSBpbnRlcmZhY2UuCi0gKiBwYXJhbWV0ZXJzOgotICoJbWlub3IJCUZpcnN0IG1pbm9yIG51bWJlcgotICoJbWlub3JzCQlOdW1iZXIgb2YgbWlub3JzIHRoaXMgZHJpdmVyIGNhbiBoYW5kbGUKLSAqCXByb2NuYW1lCU5hbWUgb2YgdGhlIGRyaXZlcgotICoJZGV2bmFtZQkJTmFtZSBvZiB0aGUgZGV2aWNlIGZpbGVzIChwcmVmaXggd2l0aG91dCBtaW5vciBudW1iZXIpCi0gKiByZXR1cm4gdmFsdWU6CisgKgorICogUmV0dXJuIHZhbHVlOgogICoJUG9pbnRlciB0byB0aGUgZ2lnYXNldF9kcml2ZXIgc3RydWN0dXJlIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KICAqLwogc3RydWN0IGdpZ2FzZXRfZHJpdmVyICpnaWdhc2V0X2luaXRkcml2ZXIodW5zaWduZWQgbWlub3IsIHVuc2lnbmVkIG1pbm9ycywKQEAgLTEwOTUsNiArMTE3NiwxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2lnYXNldF9pbml0ZHJpdmVyKTsKIAorLyoqCisgKiBnaWdhc2V0X2Jsb2NrZHJpdmVyKCkgLSBibG9jayBkcml2ZXIKKyAqIEBkcnY6CWRyaXZlciBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqCisgKiBQcmV2ZW50cyB0aGUgZHJpdmVyIGZyb20gYXR0YWNoaW5nIG5ldyBkZXZpY2VzLCBpbiBwcmVwYXJhdGlvbiBmb3IKKyAqIGRlcmVnaXN0cmF0aW9uLgorICovCiB2b2lkIGdpZ2FzZXRfYmxvY2tkcml2ZXIoc3RydWN0IGdpZ2FzZXRfZHJpdmVyICpkcnYpCiB7CiAJZHJ2LT5ibG9ja2VkID0gMTsKQEAgLTExMTAsNyArMTE5OCw3IEBACiAJaWYgKGdpZ2FzZXRfZGVidWdsZXZlbCA9PSAxKQogCQlnaWdhc2V0X2RlYnVnbGV2ZWwgPSBERUJVR19ERUZBVUxUOwogCi0JcHJfaW5mbyhEUklWRVJfREVTQyAiXG4iKTsKKwlwcl9pbmZvKERSSVZFUl9ERVNDIERSSVZFUl9ERVNDX0RFQlVHICJcbiIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZXYtbGF5ZXIuYwppbmRleCAyZDkxMDQ5Li5jYzc2OGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2V2LWxheWVyLmMKQEAgLTIwNyw3ICsyMDcsNiBAQAogCS8qIGxlYXZlIGRsZSBtb2RlICovCiAJe1JTUF9JTklULCAgICAgIDAsICAwLFNFUV9ETEUwLCAgICAgICAgICAgMjAxLCA1LCB7MH0sICAgICAgICAgICAgICJeU0RMRT0wXHIifSwKIAl7UlNQX09LLCAgICAgIDIwMSwyMDEsIC0xLCAgICAgICAgICAgICAgICAyMDIsLTF9LAotCS8ve1JTUF9aRExFLCAgICAyMDIsMjAyLCAgMCwgICAgICAgICAgICAgICAgMjAyLCAwLCB7QUNUX0VSUk9SfX0sLy9ERUxFVEUKIAl7UlNQX1pETEUsICAgIDIwMiwyMDIsICAwLCAgICAgICAgICAgICAgICAgIDAsIDAsIHtBQ1RfRExFMH19LAogCXtSU1BfTk9ERVYsICAgMjAwLDI0OSwgLTEsICAgICAgICAgICAgICAgICAgMCwgMCwge0FDVF9GQUtFRExFMH19LAogCXtSU1BfRVJST1IsICAgMjAwLDI0OSwgLTEsICAgICAgICAgICAgICAgICAgMCwgMCwge0FDVF9GQUlMRExFMH19LApAQCAtMjY1LDYgKzI2NCw3IEBACiAJe0VWX1NIVVRET1dOLCAgLTEsIC0xLCAtMSwgICAgICAgICAgICAgICAgIC0xLC0xLCB7QUNUX1NIVVRET1dOfX0sIC8vRklYTUUKIAogCS8qIG1pc2MuICovCisJe1JTUF9FUlJPUiwgICAgLTEsIC0xLCAtMSwgICAgICAgICAgICAgICAgIC0xLCAtMSwge0FDVF9FUlJPUn0gfSwKIAl7UlNQX0VNUFRZLCAgICAtMSwgLTEsIC0xLCAgICAgICAgICAgICAgICAgLTEsLTEsIHtBQ1RfREVCVUd9fSwgLy9GSVhNRQogCXtSU1BfWkNGR1QsICAgIC0xLCAtMSwgLTEsICAgICAgICAgICAgICAgICAtMSwtMSwge0FDVF9ERUJVR319LCAvL0ZJWE1FCiAJe1JTUF9aQ0ZHLCAgICAgLTEsIC0xLCAtMSwgICAgICAgICAgICAgICAgIC0xLC0xLCB7QUNUX0RFQlVHfX0sIC8vRklYTUUKQEAgLTMyOCwxMCArMzI4LDkgQEAKIAl7UlNQX0lOSVQsICAgICAtMSwgLTEsU0VRX0hVUCwgICAgICAgICAgICA0MDEsIDUsIHswfSwgICAgICAgICAgICAgIitWTFM9MFxyIn0sIC8qIGhhbmcgdXAgKi8gLy8tMSwtMT8KIAl7UlNQX09LLCAgICAgIDQwMSw0MDEsIC0xLCAgICAgICAgICAgICAgICA0MDIsIDV9LAogCXtSU1BfWlZMUywgICAgNDAyLDQwMiwgIDAsICAgICAgICAgICAgICAgIDQwMywgNX0sCi0Je1JTUF9aU0FVLCAgICA0MDMsNDAzLFpTQVVfRElTQ09OTkVDVF9SRVEsIC0xLC0xLCB7QUNUX0RFQlVHfX0sIC8qIGlmIG5vdCByZW1vdGUgaHVwICovCi0JLy97UlNQX1pTQVUsICAgIDQwMyw0MDMsWlNBVV9OVUxMLCAgICAgICAgICA0MDEsIDAsIHtBQ1RfRVJST1J9fSwgLy9ERUxFVEUvL0ZJWE1FIC0+IERMRTAgLy8gc2hvdWxkIHdlIGRvIHRoaXMgX2JlZm9yZV8gaGFuZ2luZyB1cCBmb3IgYmFzZSBkcml2ZXI/Ci0Je1JTUF9aU0FVLCAgICA0MDMsNDAzLFpTQVVfTlVMTCwgICAgICAgICAgICAwLCAwLCB7QUNUX0RJU0NPTk5FQ1R9fSwgLy9GSVhNRSAtPiBETEUwIC8vIHNob3VsZCB3ZSBkbyB0aGlzIF9iZWZvcmVfIGhhbmdpbmcgdXAgZm9yIGJhc2UgZHJpdmVyPwotCXtSU1BfTk9ERVYsICAgNDAxLDQwMywgLTEsICAgICAgICAgICAgICAgICAgMCwgMCwge0FDVF9GQUtFSFVQfX0sIC8vRklYTUUgLT4gRExFMCAvLyBzaG91bGQgd2UgZG8gdGhpcyBfYmVmb3JlXyBoYW5naW5nIHVwIGZvciBiYXNlIGRyaXZlcj8KKwl7UlNQX1pTQVUsICAgIDQwMywgNDAzLCBaU0FVX0RJU0NPTk5FQ1RfUkVRLCAtMSwgLTEsIHtBQ1RfREVCVUd9IH0sCisJe1JTUF9aU0FVLCAgICA0MDMsIDQwMywgWlNBVV9OVUxMLCAgICAgICAgICAgIDAsICAwLCB7QUNUX0RJU0NPTk5FQ1R9IH0sCisJe1JTUF9OT0RFViwgICA0MDEsIDQwMywgLTEsICAgICAgICAgICAgICAgICAgIDAsICAwLCB7QUNUX0ZBS0VIVVB9IH0sCiAJe1JTUF9FUlJPUiwgICA0MDEsNDAxLCAtMSwgICAgICAgICAgICAgICAgICAwLCAwLCB7QUNUX0FCT1JUSFVQfX0sCiAJe0VWX1RJTUVPVVQsICA0MDEsNDAzLCAtMSwgICAgICAgICAgICAgICAgICAwLCAwLCB7QUNUX0FCT1JUSFVQfX0sCiAKQEAgLTQ3NCw4ICs0NzMsMTMgQEAKIAkvL0ZJWE1FIGlzIDs8ZGlnaXQ+KyBhdCBlbmQgb2Ygbm9uLUNJRCByZXNwb25zZSByZWFsbHkgaW1wb3NzaWJsZT8KIH0KIAotLyogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB2aWEgdGFzayBxdWV1ZSBmcm9tIHRoZSBjYWxsYmFjayBoYW5kbGVyLgotICogV2UgcmVjZWl2ZWQgYSBtb2RlbSByZXNwb25zZSBhbmQgaGF2ZSB0byBoYW5kbGUgaXQuLgorLyoqCisgKiBnaWdhc2V0X2hhbmRsZV9tb2RlbV9yZXNwb25zZSgpIC0gcHJvY2VzcyByZWNlaXZlZCBtb2RlbSByZXNwb25zZQorICogQGNzOgkJZGV2aWNlIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorICoKKyAqIENhbGxlZCBieSBhc3luY2RhdGEvaXNvY2RhdGEgaWYgYSBibG9jayBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlCisgKiBkZXZpY2UgbXVzdCBiZSBwcm9jZXNzZWQgYXMgYSBtb2RlbSBjb21tYW5kIHJlc3BvbnNlLiBUaGUgZGF0YSBpcworICogYWxyZWFkeSBpbiB0aGUgY3Mgc3RydWN0dXJlLgogICovCiB2b2lkIGdpZ2FzZXRfaGFuZGxlX21vZGVtX3Jlc3BvbnNlKHN0cnVjdCBjYXJkc3RhdGUgKmNzKQogewpAQCAtNzA3LDYgKzcxMSwxMSBAQAogCWlmIChiY3MpIHsKIAkJLyogQiBjaGFubmVsIGFzc2lnbmVkOiBpbnZva2UgaGFyZHdhcmUgc3BlY2lmaWMgaGFuZGxlciAqLwogCQljcy0+b3BzLT5jbG9zZV9iY2hhbm5lbChiY3MpOworCQkvKiBub3RpZnkgTEwgKi8KKwkJaWYgKGJjcy0+Y2hzdGF0ZSAmIChDSFNfRF9VUCB8IENIU19OT1RJRllfTEwpKSB7CisJCQliY3MtPmNoc3RhdGUgJj0gfihDSFNfRF9VUCB8IENIU19OT1RJRllfTEwpOworCQkJZ2lnYXNldF9pNGxfY2hhbm5lbF9jbWQoYmNzLCBJU0ROX1NUQVRfREhVUCk7CisJCX0KIAl9IGVsc2UgewogCQkvKiBubyBCIGNoYW5uZWwgYXNzaWduZWQ6IGp1c3QgZGVhbGxvY2F0ZSAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKQEAgLTE0MjksMTEgKzE0MzgsMTIgQEAKIAkJY3MtPmdvdGZ3dmVyID0gLTE7CiAJCWRldl9lcnIoY3MtPmRldiwgImNvdWxkIG5vdCByZWFkIGZpcm13YXJlIHZlcnNpb24uXG4iKTsKIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0dJR0FTRVRfREVCVUcKIAljYXNlIEFDVF9FUlJPUjoKLQkJKnBfZ2VucmVzcCA9IDE7Ci0JCSpwX3Jlc3BfY29kZSA9IFJTUF9FUlJPUjsKKwkJZ2lnX2RiZyhERUJVR19BTlksICIlczogRVJST1IgcmVzcG9uc2UgaW4gQ29uU3RhdGUgJWQiLAorCQkJX19mdW5jX18sIGF0X3N0YXRlLT5Db25TdGF0ZSk7CisJCWNzLT5jdXJfYXRfc2VxID0gU0VRX05PTkU7CiAJCWJyZWFrOworI2lmZGVmIENPTkZJR19HSUdBU0VUX0RFQlVHCiAJY2FzZSBBQ1RfVEVTVDoKIAkJewogCQkJc3RhdGljIGludCBjb3VudCA9IDM7IC8vMjsgLy8xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pNGwuYwppbmRleCA5YjIyZjljLi42NTQ0ODlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pNGwuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pNGwuYwpAQCAtNTEsNiArNTEsMTIgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWJjcyA9ICZjcy0+YmNzW2NoYW5uZWxdOworCisJLyogY2FuIG9ubHkgaGFuZGxlIGxpbmVhciBza19idWZmcyAqLworCWlmIChza2JfbGluZWFyaXplKHNrYikgPCAwKSB7CisJCWRldl9lcnIoY3MtPmRldiwgIiVzOiBza2JfbGluZWFyaXplIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAJbGVuID0gc2tiLT5sZW47CiAKIAlnaWdfZGJnKERFQlVHX0xMREFUQSwKQEAgLTc5LDYgKzg1LDE0IEBACiAJcmV0dXJuIGNzLT5vcHMtPnNlbmRfc2tiKGJjcywgc2tiKTsKIH0KIAorLyoqCisgKiBnaWdhc2V0X3NrYl9zZW50KCkgLSBhY2tub3dsZWRnZSBzZW5kaW5nIGFuIHNrYgorICogQGJjczoJQiBjaGFubmVsIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorICogQHNrYjoJc2VudCBkYXRhLgorICoKKyAqIENhbGxlZCBieSBoYXJkd2FyZSBtb2R1bGUge2JhcyxzZXIsdXNifV9naWdhc2V0IHdoZW4gdGhlIGRhdGEgaW4gYQorICogc2tiIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50LCBmb3Igc2lnbmFsbGluZyBjb21wbGV0aW9uIHRvIHRoZSBMTC4KKyAqLwogdm9pZCBnaWdhc2V0X3NrYl9zZW50KHN0cnVjdCBiY19zdGF0ZSAqYmNzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXVuc2lnbmVkIGxlbjsKQEAgLTQ1NSw2ICs0NjksMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBnaWdhc2V0X2lzZG5faWNhbGwoKSAtIHNpZ25hbCBpbmNvbWluZyBjYWxsCisgKiBAYXRfc3RhdGU6CWNvbm5lY3Rpb24gc3RhdGUgc3RydWN0dXJlLgorICoKKyAqIENhbGxlZCBieSBtYWluIG1vZHVsZSB0byBub3RpZnkgdGhlIExMIHRoYXQgYW4gaW5jb21pbmcgY2FsbCBoYXMgYmVlbgorICogcmVjZWl2ZWQuIEBhdF9zdGF0ZSBjb250YWlucyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgY2FsbC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IGNhbGwgZGlzcG9zaXRpb24gKElDQUxMXyopCisgKi8KIGludCBnaWdhc2V0X2lzZG5faWNhbGwoc3RydWN0IGF0X3N0YXRlX3QgKmF0X3N0YXRlKQogewogCXN0cnVjdCBjYXJkc3RhdGUgKmNzID0gYXRfc3RhdGUtPmNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwppbmRleCBmMzNhYzI3Li42YThlMTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwpAQCAtNjE2LDYgKzYxNiwxNSBAQAogCXR0eV91bnJlZ2lzdGVyX2RldmljZShkcnYtPnR0eSwgY3MtPm1pbm9yX2luZGV4KTsKIH0KIAorLyoqCisgKiBnaWdhc2V0X2lmX3JlY2VpdmUoKSAtIHBhc3MgYSByZWNlaXZlZCBibG9jayBvZiBkYXRhIHRvIHRoZSB0dHkgZGV2aWNlCisgKiBAY3M6CQlkZXZpY2UgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKiBAYnVmZmVyOglyZWNlaXZlZCBkYXRhLgorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgorICoKKyAqIENhbGxlZCBieSBhc3luY2RhdGEvaXNvY2RhdGEgaWYgYSBibG9jayBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlCisgKiBkZXZpY2UgbXVzdCBiZSBzZW50IHRvIHVzZXJzcGFjZSB0aHJvdWdoIHRoZSB0dHlHKiBkZXZpY2UuCisgKi8KIHZvaWQgZ2lnYXNldF9pZl9yZWNlaXZlKHN0cnVjdCBjYXJkc3RhdGUgKmNzLAogCQkJdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaXNvY2RhdGEuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2lzb2NkYXRhLmMKaW5kZXggYmVkMzhmYy4uOWYzZWY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaXNvY2RhdGEuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pc29jZGF0YS5jCkBAIC00MjksNyArNDI5LDcgQEAKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JZHVtcF9ieXRlcyhERUJVR19TVFJFQU0sICJzbmQgZGF0YSIsIGluLCBjb3VudCk7CisJZHVtcF9ieXRlcyhERUJVR19TVFJFQU1fRFVNUCwgInNuZCBkYXRhIiwgaW4sIGNvdW50KTsKIAogCS8qIGJpdHN0dWZmIGFuZCBjaGVja3N1bSBpbnB1dCBkYXRhICovCiAJZmNzID0gUFBQX0lOSVRGQ1M7CkBAIC00NDgsNyArNDQ4LDYgQEAKIAkvKiBwdXQgY2xvc2luZyBmbGFnIGFuZCByZXBlYXQgYnl0ZSBmb3IgZmxhZyBpZGxlICovCiAJaXNvd2J1Zl9wdXRmbGFnKGl3Yik7CiAJZW5kID0gaXNvd2J1Zl9kb25ld3JpdGUoaXdiKTsKLQlkdW1wX2J5dGVzKERFQlVHX1NUUkVBTV9EVU1QLCAiaXNvd2J1ZiIsIGl3Yi0+ZGF0YSwgZW5kICsgMSk7CiAJcmV0dXJuIGVuZDsKIH0KIApAQCAtNDgyLDYgKzQ4MSw4IEBACiAJfQogCiAJZ2lnX2RiZyhERUJVR19TVFJFQU0sICJwdXQgJWQgYnl0ZXMiLCBjb3VudCk7CisJZHVtcF9ieXRlcyhERUJVR19TVFJFQU1fRFVNUCwgInNuZCBkYXRhIiwgaW4sIGNvdW50KTsKKwogCXdyaXRlID0gaXdiLT53cml0ZTsKIAlkbyB7CiAJCWMgPSBiaXRyZXY4KCppbisrKTsKQEAgLTU4Myw3ICs1ODQsNyBAQAogCQlwcm9jc2tiLT50YWlsIC09IDI7CiAJCWdpZ19kYmcoREVCVUdfSVNPLCAiJXM6IGdvb2QgZnJhbWUgKCVkIG9jdGV0cykiLAogCQkJX19mdW5jX18sIHByb2Nza2ItPmxlbik7Ci0JCWR1bXBfYnl0ZXMoREVCVUdfU1RSRUFNLAorCQlkdW1wX2J5dGVzKERFQlVHX1NUUkVBTV9EVU1QLAogCQkJICAgInJjdiBkYXRhIiwgcHJvY3NrYi0+ZGF0YSwgcHJvY3NrYi0+bGVuKTsKIAkJYmNzLT5ody5iYXMtPmdvb2RieXRlcyArPSBwcm9jc2tiLT5sZW47CiAJCWdpZ2FzZXRfcmN2X3NrYihwcm9jc2tiLCBiY3MtPmNzLCBiY3MpOwpAQCAtODc4LDYgKzg3OSw4IEBACiAJCQlkb2J5dGVzLS07CiAJCX0KIAkJaWYgKGRvYnl0ZXMgPT0gMCkgeworCQkJZHVtcF9ieXRlcyhERUJVR19TVFJFQU1fRFVNUCwKKwkJCQkgICAicmN2IGRhdGEiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJCWdpZ2FzZXRfcmN2X3NrYihza2IsIGJjcy0+Y3MsIGJjcyk7CiAJCQliY3MtPnNrYiA9IHNrYiA9IGRldl9hbGxvY19za2IoU0JVRlNJWkUgKyBIV19IRFJfTEVOKTsKIAkJCWlmICghc2tiKSB7CkBAIC05NzMsMTYgKzk3NiwxNyBAQAogCiAvKiA9PSBkYXRhIG91dHB1dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLS8qIGdpZ2FzZXRfc2VuZF9za2IKLSAqIGNhbGxlZCBieSBjb21tb24uYyB0byBxdWV1ZSBhbiBza2IgZm9yIHNlbmRpbmcKLSAqIGFuZCBzdGFydCB0cmFuc21pc3Npb24gaWYgbmVjZXNzYXJ5Ci0gKiBwYXJhbWV0ZXJzOgotICoJQiBDaGFubmVsIGNvbnRyb2wgc3RydWN0dXJlCi0gKglza2IKLSAqIHJldHVybiB2YWx1ZToKLSAqCW51bWJlciBvZiBieXRlcyBhY2NlcHRlZCBmb3Igc2VuZGluZwotICoJKHNrYi0+bGVuIGlmIG9rLCAwIGlmIG91dCBvZiBidWZmZXIgc3BhY2UpCi0gKglvciBlcnJvciBjb2RlICg8IDAsIGVnLiAtRUlOVkFMKQorLyoqCisgKiBnaWdhc2V0X2lzb2Nfc2VuZF9za2IoKSAtIHF1ZXVlIGFuIHNrYiBmb3Igc2VuZGluZworICogQGJjczoJQiBjaGFubmVsIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorICogQHNrYjoJZGF0YSB0byBzZW5kLgorICoKKyAqIENhbGxlZCBieSBpNGwuYyB0byBxdWV1ZSBhbiBza2IgZm9yIHNlbmRpbmcsIGFuZCBzdGFydCB0cmFuc21pc3Npb24gaWYKKyAqIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgludW1iZXIgb2YgYnl0ZXMgYWNjZXB0ZWQgZm9yIHNlbmRpbmcgKHNrYi0+bGVuKSBpZiBvaywKKyAqCWVycm9yIGNvZGUgPCAwIChlZy4gLUVOT0RFVikgb24gZXJyb3IKICAqLwogaW50IGdpZ2FzZXRfaXNvY19zZW5kX3NrYihzdHJ1Y3QgYmNfc3RhdGUgKmJjcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL0tjb25maWcKaW5kZXggYmRlNTVkNy4uZWFkYzFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL0tjb25maWcKQEAgLTc4LDYgKzc4LDcgQEAKIAlkZXBlbmRzIG9uIFBDSQogCXNlbGVjdCBNSVNETl9JUEFDCiAJc2VsZWN0IElTRE5fSERMQworCXNlbGVjdCBJU0ROX0k0TAogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBUcmF2ZXJzZSBUZWNobm9sb2dpZXMgTkVUSmV0IFBDSSBjYXJkcy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2FyY29maS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2FyY29maS5jCmluZGV4IGQzMGNlNWIuLjg1YThmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9hcmNvZmkuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYXJjb2ZpLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqCiAgKi8KICAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgImhpc2F4LmgiCiAjaW5jbHVkZSAiaXNkbmwxLmgiCiAjaW5jbHVkZSAiaXNhYy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY18yYmRzMC5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY18yYmRzMC5jCmluZGV4IDVjNDZhNzEuLjhkMjJmNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfMmJkczAuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjXzJiZHMwLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAiaGlzYXguaCIKICNpbmNsdWRlICJoZmNfMmJkczAuaCIKICNpbmNsdWRlICJpc2RubDEuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfcGNpLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3BjaS5jCmluZGV4IGQxMTBhNzcuLjEwOTE0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19wY2kuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgImhmY19wY2kuaCIKICNpbmNsdWRlICJpc2RubDEuaCIKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiBzdGF0aWMgY29uc3QgY2hhciAqaGZjcGNpX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS40OC4yLjQgJCI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2NvbmYuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jY29uZi5jCmluZGV4IDhmOWY0OTEuLjkwYjM1ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jY29uZi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jY29uZi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jcmVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jbG9nLmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jCmluZGV4IDg5OTFkMmMuLjhiY2FlMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jbG9nLmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3Byb2Nsb2cuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogCiAjaW5jbHVkZSAiaHlzZG5fZGVmcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2k0bC9LY29uZmlnCmluZGV4IGRkNzQ0ZmYuLjA3YzRlNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcKQEAgLTE0MSw4ICsxNDEsNyBAQAogZW5kaWYKIAogY29uZmlnIElTRE5fSERMQwotCXRyaXN0YXRlIAotCWRlcGVuZHMgb24gSElTQVhfU1Q1NDgxCisJdHJpc3RhdGUKIAlzZWxlY3QgQ1JDX0NDSVRUCiAJc2VsZWN0IEJJVFJFVkVSU0UKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5oIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5oCmluZGV4IDc0MDMyZDAuLjc1MTFmMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuaAorKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmgKQEAgLTgzLDE5ICs4MywxOSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5kLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJbHAgPSBuZC0+cXVldWU7ICAgICAgICAgLyogZ2V0IGxwIG9uIHRvcCBvZiBxdWV1ZSAqLwotCXNwaW5fbG9jaygmbmQtPnF1ZXVlLT54bWl0X2xvY2spOwogCXdoaWxlIChpc2RuX25ldF9scF9idXN5KG5kLT5xdWV1ZSkpIHsKLQkJc3Bpbl91bmxvY2soJm5kLT5xdWV1ZS0+eG1pdF9sb2NrKTsKIAkJbmQtPnF1ZXVlID0gbmQtPnF1ZXVlLT5uZXh0OwogCQlpZiAobmQtPnF1ZXVlID09IGxwKSB7IC8qIG5vdCBmb3VuZCAtLSBzaG91bGQgbmV2ZXIgaGFwcGVuICovCiAJCQlscCA9IE5VTEw7CiAJCQlnb3RvIGVycm91dDsKIAkJfQotCQlzcGluX2xvY2soJm5kLT5xdWV1ZS0+eG1pdF9sb2NrKTsKIAl9CiAJbHAgPSBuZC0+cXVldWU7CiAJbmQtPnF1ZXVlID0gbmQtPnF1ZXVlLT5uZXh0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5kLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZscC0+eG1pdF9sb2NrKTsKIAlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcmV0dXJuIGxwOwogZXJyb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5kLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGxwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL3NvY2tldC5jIGIvZHJpdmVycy9pc2RuL21JU0ROL3NvY2tldC5jCmluZGV4IGMzNmY1MjEuLmZlYjBmYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9zb2NrZXQuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vc29ja2V0LmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogfQogCiBzdGF0aWMgaW50IGRhdGFfc29ja19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IGxlbikKKwljaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCWludCBlcnIgPSAwLCBvcHQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL3BjYml0L2Rydi5jIGIvZHJpdmVycy9pc2RuL3BjYml0L2Rydi5jCmluZGV4IDhjNjZiY2IuLjEyM2MxZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9wY2JpdC9kcnYuYworKysgYi9kcml2ZXJzL2lzZG4vcGNiaXQvZHJ2LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9wY2JpdC9sYXllcjIuYyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9sYXllcjIuYwppbmRleCBlMDc1ZThkLi4zMGYwZjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vcGNiaXQvbGF5ZXIyLmMKKysrIGIvZHJpdmVycy9pc2RuL3BjYml0L2xheWVyMi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9zYy9pbml0LmMgYi9kcml2ZXJzL2lzZG4vc2MvaW5pdC5jCmluZGV4IGRkMGFjZDAuLjVhMDc3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9zYy9pbml0LmMKKysrIGIvZHJpdmVycy9pc2RuL3NjL2luaXQuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgImluY2x1ZGVzLmgiCiAjaW5jbHVkZSAiaGFyZHdhcmUuaCIKICNpbmNsdWRlICJjYXJkLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvS2NvbmZpZyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCmluZGV4IDdjOGU3MTIuLmU0ZjU5OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCkBAIC0xNTAsOSArMTUwLDkgQEAKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIE4uUy4gTFAzOTQ0IChGdW4gTGlnaHQpIEkyQyBjaGlwIgogCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBJMkMKIAloZWxwCi0gICAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBMRURzIGNvbm5lY3RlZCB0byB0aGUgTmF0aW9uYWwKLSAgICBTZW1pY29uZHVjdG9yIExQMzk0NCBMaWdodGluZyBNYW5hZ2VtZW50IFVuaXQgKExNVSkgYWxzbyBrbm93biBhcwotICAgIEZ1biBMaWdodCBDaGlwLgorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBMRURzIGNvbm5lY3RlZCB0byB0aGUgTmF0aW9uYWwKKwkgIFNlbWljb25kdWN0b3IgTFAzOTQ0IExpZ2h0aW5nIE1hbmFnZW1lbnQgVW5pdCAoTE1VKSBhbHNvIGtub3duIGFzCisJICBGdW4gTGlnaHQgQ2hpcC4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbGVkcy1scDM5NDQuCkBAIC0xOTUsNiArMTk1LDEzIEBACiAJICBMRUQgZHJpdmVyIGNoaXBzIGFjY2Vzc2VkIHZpYSB0aGUgSTJDIGJ1cy4gIFN1cHBvcnRlZAogCSAgZGV2aWNlcyBpbmNsdWRlIFBDQTk1NTAsIFBDQTk1NTEsIFBDQTk1NTIsIGFuZCBQQ0E5NTUzLgogCitjb25maWcgTEVEU19XTTgzMVhfU1RBVFVTCisJdHJpc3RhdGUgIkxFRCBzdXBwb3J0IGZvciBzdGF0dXMgTEVEcyBvbiBXTTgzMXggUE1JQ3MiCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIE1GRF9XTTgzMVgKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBzdGF0dXMgTEVEcyBvZiB0aGUgV004MzF4CisgICAgICAgICAgc2VyaWVzIG9mIFBNSUNzLgorCiBjb25maWcgTEVEU19XTTgzNTAKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIFdNODM1MCBBdWRpb1BsdXMgUE1JQyIKIAlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgTUZEX1dNODM1MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL01ha2VmaWxlIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCmluZGV4IGU4Y2RjZjcuLjQ2ZDcyNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKQEAgLTI2LDYgKzI2LDcgQEAKIG9iai0kKENPTkZJR19MRURTX0ZTRykJCQkrPSBsZWRzLWZzZy5vCiBvYmotJChDT05GSUdfTEVEU19QQ0E5NTVYKQkJKz0gbGVkcy1wY2E5NTV4Lm8KIG9iai0kKENPTkZJR19MRURTX0RBOTAzWCkJCSs9IGxlZHMtZGE5MDN4Lm8KK29iai0kKENPTkZJR19MRURTX1dNODMxWF9TVEFUVVMpCSs9IGxlZHMtd204MzF4LXN0YXR1cy5vCiBvYmotJChDT05GSUdfTEVEU19XTTgzNTApCQkrPSBsZWRzLXdtODM1MC5vCiBvYmotJChDT05GSUdfTEVEU19QV00pCQkJKz0gbGVkcy1wd20ubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1jbGV2by1tYWlsLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1jbGV2by1tYWlsLmMKaW5kZXggMTgxM2M4NC4uYTQ5ODEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtY2xldm8tbWFpbC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWNsZXZvLW1haWwuYwpAQCAtOTMsNiArOTMsOCBAQAogc3RhdGljIHZvaWQgY2xldm9fbWFpbF9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAogCQkJCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCiB7CisJaTgwNDJfbG9ja19jaGlwKCk7CisKIAlpZiAodmFsdWUgPT0gTEVEX09GRikKIAkJaTgwNDJfY29tbWFuZChOVUxMLCBDTEVWT19NQUlMX0xFRF9PRkYpOwogCWVsc2UgaWYgKHZhbHVlIDw9IExFRF9IQUxGKQpAQCAtMTAwLDYgKzEwMiw4IEBACiAJZWxzZQogCQlpODA0Ml9jb21tYW5kKE5VTEwsIENMRVZPX01BSUxfTEVEX0JMSU5LXzFIWik7CiAKKwlpODA0Ml91bmxvY2tfY2hpcCgpOworCiB9CiAKIHN0YXRpYyBpbnQgY2xldm9fbWFpbF9sZWRfYmxpbmsoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCkBAIC0xMDgsNiArMTEyLDggQEAKIHsKIAlpbnQgc3RhdHVzID0gLUVJTlZBTDsKIAorCWk4MDQyX2xvY2tfY2hpcCgpOworCiAJaWYgKCpkZWxheV9vbiA9PSAwIC8qIG1zICovICYmICpkZWxheV9vZmYgPT0gMCAvKiBtcyAqLykgewogCQkvKiBTcGVjaWFsIGNhc2U6IHRoZSBsZWRzIHN1YnN5c3RlbSByZXF1ZXN0ZWQgdXMgdG8KIAkJICogY2hvc2Ugb25lIHVzZXIgZnJpZW5kbHkgYmxpbmtpbmcgb2YgdGhlIExFRCwgYW5kCkBAIC0xMzUsNiArMTQxLDggQEAKIAkJICAgICAgICpkZWxheV9vbiwgKmRlbGF5X29mZik7CiAJfQogCisJaTgwNDJfdW5sb2NrX2NoaXAoKTsKKwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE0NSw3ICsxNTMsNyBAQAogCS5mbGFncwkJCT0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGNsZXZvX21haWxfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjbGV2b19tYWlsX2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNsZXZvX21haWxfbGVkKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWNvYmFsdC1xdWJlLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1jb2JhbHQtcXViZS5jCmluZGV4IDA1OWFhMjkuLjg4MTY4MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWNvYmFsdC1xdWJlLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtY29iYWx0LXF1YmUuYwpAQCAtMjgsNyArMjgsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiBxdWJlX2Zyb250X2xlZCA9IHsKLQkubmFtZQkJCT0gInF1YmUtZnJvbnQiLAorCS5uYW1lCQkJPSAicXViZTo6ZnJvbnQiLAogCS5icmlnaHRuZXNzCQk9IExFRF9GVUxMLAogCS5icmlnaHRuZXNzX3NldAkJPSBxdWJlX2Zyb250X2xlZF9zZXQsCiAJLmRlZmF1bHRfdHJpZ2dlcgk9ICJpZGUtZGlzayIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1jb2JhbHQtcmFxLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1jb2JhbHQtcmFxLmMKaW5kZXggNWYxY2U4MS4uZGVmYzIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtY29iYWx0LXJhcS5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWNvYmFsdC1yYXEuYwpAQCAtNDksNyArNDksNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiByYXFfd2ViX2xlZCA9IHsKLQkubmFtZQkJPSAicmFxLXdlYiIsCisJLm5hbWUJCT0gInJhcTo6d2ViIiwKIAkuYnJpZ2h0bmVzc19zZXQJPSByYXFfd2ViX2xlZF9zZXQsCiB9OwogCkBAIC03MCw3ICs3MCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IHJhcV9wb3dlcl9vZmZfbGVkID0gewotCS5uYW1lCQkJPSAicmFxLXBvd2VyLW9mZiIsCisJLm5hbWUJCQk9ICJyYXE6OnBvd2VyLW9mZiIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IHJhcV9wb3dlcl9vZmZfbGVkX3NldCwKIAkuZGVmYXVsdF90cmlnZ2VyCT0gInBvd2VyLW9mZiIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jIGIvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCmluZGV4IDZiMDY2MzguLjc0Njc5ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogCS8qIHNraXAgbGVkcyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgKi8KIAlpZiAoIWdwaW9faXNfdmFsaWQodGVtcGxhdGUtPmdwaW8pKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlNraXBwaW5nIHVuYXZpbGFibGUgTEVEIGdwaW8gJWQgKCVzKVxuIiwgCisJCXByaW50ayhLRVJOX0lORk8gIlNraXBwaW5nIHVuYXZhaWxhYmxlIExFRCBncGlvICVkICglcylcbiIsCiAJCQkJdGVtcGxhdGUtPmdwaW8sIHRlbXBsYXRlLT5uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTUzMi5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTUzMi5jCmluZGV4IGRiYTg5MjEuLmFkYzU2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXBjYTk1MzIuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NTMyLmMKQEAgLTE5LDkgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLXBjYTk1MzIuaD4KIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgLyoweDYwLCovIEkyQ19DTElFTlRfRU5EfTsKLUkyQ19DTElFTlRfSU5TTU9EXzEocGNhOTUzMik7Ci0KICNkZWZpbmUgUENBOTUzMl9SRUdfUFNDKGkpICgweDIrKGkpKjIpCiAjZGVmaW5lIFBDQTk1MzJfUkVHX1BXTShpKSAoMHgzKyhpKSoyKQogI2RlZmluZSBQQ0E5NTMyX1JFR19MUzAgIDB4NgpAQCAtMzQsNyArMzEsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IHBjYTk1MzJfbGVkIGxlZHNbMTZdOwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICAgICppZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJdTggcHdtWzJdOwogCXU4IHBzY1syXTsKQEAgLTUzLDkgKzUwLDkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjYTk1MzJfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICAgPSAicGNhOTUzMiIsCisJCS5uYW1lID0gInBjYTk1MzIiLAogCX0sCi0JLnByb2JlICA9IHBjYTk1MzJfcHJvYmUsCisJLnByb2JlID0gcGNhOTUzMl9wcm9iZSwKIAkucmVtb3ZlID0gcGNhOTUzMl9yZW1vdmUsCiAJLmlkX3RhYmxlID0gcGNhOTUzMl9pZCwKIH07CkBAIC0xNDksNyArMTQ2LDcgQEAKIAogCWlmICgqZGVsYXlfb24gPT0gMCAmJiAqZGVsYXlfb2ZmID09IDApIHsKIAkvKiBsZWQgc3Vic3lzdGVtIGFzayB1cyBmb3IgYSBibGluayByYXRlICovCi0JCSpkZWxheV9vbiAgPSAxMDAwOworCQkqZGVsYXlfb24gPSAxMDAwOwogCQkqZGVsYXlfb2ZmID0gMTAwMDsKIAl9CiAJaWYgKCpkZWxheV9vbiAhPSAqZGVsYXlfb2ZmIHx8ICpkZWxheV9vbiA+IDE2OTAgfHwgKmRlbGF5X29uIDwgNikKQEAgLTIyNyw3ICsyMjQsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgUENBOTUzMl9UWVBFX0xFRDoKIAkJCWxlZC0+c3RhdGUgPSBwbGVkLT5zdGF0ZTsKLQkJCWxlZC0+bmFtZSA9ICBwbGVkLT5uYW1lOworCQkJbGVkLT5uYW1lID0gcGxlZC0+bmFtZTsKIAkJCWxlZC0+bGRldi5uYW1lID0gbGVkLT5uYW1lOwogCQkJbGVkLT5sZGV2LmJyaWdodG5lc3MgPSBMRURfT0ZGOwogCQkJbGVkLT5sZGV2LmJyaWdodG5lc3Nfc2V0ID0gcGNhOTUzMl9zZXRfYnJpZ2h0bmVzczsKQEAgLTI1NCw3ICsyNTEsNyBAQAogCQkJZGF0YS0+aWRldi0+bmFtZSA9IHBsZWQtPm5hbWU7CiAJCQlkYXRhLT5pZGV2LT5waHlzID0gImkyYy9wY2E5NTMyIjsKIAkJCWRhdGEtPmlkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQkJCWRhdGEtPmlkZXYtPmlkLnZlbmRvciAgPSAweDAwMWY7CisJCQlkYXRhLT5pZGV2LT5pZC52ZW5kb3IgPSAweDAwMWY7CiAJCQlkYXRhLT5pZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOwogCQkJZGF0YS0+aWRldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKIAkJCWRhdGEtPmlkZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfU05EKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXdtODMxeC1zdGF0dXMuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXdtODMxeC1zdGF0dXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTg2ZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtd204MzF4LXN0YXR1cy5jCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogTEVEIGRyaXZlciBmb3IgV004MzF4IHN0YXR1cyBMRURzCisgKgorICogQ29weXJpZ2h0KEMpIDIwMDkgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L3BkYXRhLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9zdGF0dXMuaD4KKworCitzdHJ1Y3Qgd204MzF4X3N0YXR1cyB7CisJc3RydWN0IGxlZF9jbGFzc2RldiBjZGV2OworCXN0cnVjdCB3bTgzMXggKndtODMxeDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisKKwlzcGlubG9ja190IHZhbHVlX2xvY2s7CisJaW50IHJlZzsgICAgIC8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwlpbnQgcmVnX3ZhbDsgLyogQ29udHJvbCByZWdpc3RlciB2YWx1ZSAqLworCisJaW50IGJsaW5rOworCWludCBibGlua190aW1lOworCWludCBibGlua19jeWM7CisJaW50IHNyYzsKKwllbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3M7Cit9OworCisjZGVmaW5lIHRvX3dtODMxeF9zdGF0dXMobGVkX2NkZXYpIFwKKwljb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCB3bTgzMXhfc3RhdHVzLCBjZGV2KQorCitzdGF0aWMgdm9pZCB3bTgzMXhfc3RhdHVzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB3bTgzMXhfc3RhdHVzICpsZWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdtODMxeF9zdGF0dXMsCisJCQkJCQkgd29yayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW11dGV4X2xvY2soJmxlZC0+bXV0ZXgpOworCisJbGVkLT5yZWdfdmFsICY9IH4oV004MzFYX0xFRF9TUkNfTUFTSyB8IFdNODMxWF9MRURfTU9ERV9NQVNLIHwKKwkJCSAgV004MzFYX0xFRF9EVVRZX0NZQ19NQVNLIHwgV004MzFYX0xFRF9EVVJfTUFTSyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGVkLT52YWx1ZV9sb2NrLCBmbGFncyk7CisKKwlsZWQtPnJlZ192YWwgfD0gbGVkLT5zcmMgPDwgV004MzFYX0xFRF9TUkNfU0hJRlQ7CisJaWYgKGxlZC0+YmxpbmspIHsKKwkJbGVkLT5yZWdfdmFsIHw9IDIgPDwgV004MzFYX0xFRF9NT0RFX1NISUZUOworCQlsZWQtPnJlZ192YWwgfD0gbGVkLT5ibGlua190aW1lIDw8IFdNODMxWF9MRURfRFVSX1NISUZUOworCQlsZWQtPnJlZ192YWwgfD0gbGVkLT5ibGlua19jeWM7CisJfSBlbHNlIHsKKwkJaWYgKGxlZC0+YnJpZ2h0bmVzcyAhPSBMRURfT0ZGKQorCQkJbGVkLT5yZWdfdmFsIHw9IDEgPDwgV004MzFYX0xFRF9NT0RFX1NISUZUOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxlZC0+dmFsdWVfbG9jaywgZmxhZ3MpOworCisJd204MzF4X3JlZ193cml0ZShsZWQtPndtODMxeCwgbGVkLT5yZWcsIGxlZC0+cmVnX3ZhbCk7CisKKwltdXRleF91bmxvY2soJmxlZC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCB3bTgzMXhfc3RhdHVzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJCSAgIGVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJc3RydWN0IHdtODMxeF9zdGF0dXMgKmxlZCA9IHRvX3dtODMxeF9zdGF0dXMobGVkX2NkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGVkLT52YWx1ZV9sb2NrLCBmbGFncyk7CisJbGVkLT5icmlnaHRuZXNzID0gdmFsdWU7CisJaWYgKHZhbHVlID09IExFRF9PRkYpCisJCWxlZC0+YmxpbmsgPSAwOworCXNjaGVkdWxlX3dvcmsoJmxlZC0+d29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGVkLT52YWx1ZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgd204MzF4X3N0YXR1c19ibGlua19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkJICAgdW5zaWduZWQgbG9uZyAqZGVsYXlfb24sCisJCQkJICAgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQoreworCXN0cnVjdCB3bTgzMXhfc3RhdHVzICpsZWQgPSB0b193bTgzMXhfc3RhdHVzKGxlZF9jZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogUGljayBzb21lIGRlZmF1bHRzIGlmIHdlJ3ZlIG5vdCBiZWVuIGdpdmVuIHRpbWVzICovCisJaWYgKCpkZWxheV9vbiA9PSAwICYmICpkZWxheV9vZmYgPT0gMCkgeworCQkqZGVsYXlfb24gPSAyNTA7CisJCSpkZWxheV9vZmYgPSAyNTA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxlZC0+dmFsdWVfbG9jaywgZmxhZ3MpOworCisJLyogV2Ugb25seSBoYXZlIGEgbGltaXRlZCBzZWxlY3Rpb24gb2Ygc2V0dGluZ3MsIHNlZSBpZiB3ZSBjYW4KKwkgKiBzdXBwb3J0IHRoZSBjb25maWd1cmF0aW9uIHdlJ3JlIGJlaW5nIGdpdmVuICovCisJc3dpdGNoICgqZGVsYXlfb24pIHsKKwljYXNlIDEwMDA6CisJCWxlZC0+YmxpbmtfdGltZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMjUwOgorCQlsZWQtPmJsaW5rX3RpbWUgPSAxOworCQlicmVhazsKKwljYXNlIDEyNToKKwkJbGVkLT5ibGlua190aW1lID0gMjsKKwkJYnJlYWs7CisJY2FzZSA2MjoKKwljYXNlIDYzOgorCQkvKiBBY3R1YWxseSA2Mi41bXMgKi8KKwkJbGVkLT5ibGlua190aW1lID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA9PSAwKSB7CisJCXN3aXRjaCAoKmRlbGF5X29mZiAvICpkZWxheV9vbikgeworCQljYXNlIDE6CisJCQlsZWQtPmJsaW5rX2N5YyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJbGVkLT5ibGlua19jeWMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWxlZC0+YmxpbmtfY3ljID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlsZWQtPmJsaW5rX2N5YyA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXQgPT0gMCkKKwkJbGVkLT5ibGluayA9IDE7CisJZWxzZQorCQlsZWQtPmJsaW5rID0gMDsKKworCS8qIEFsd2F5cyB1cGRhdGU7IGlmIHdlIGZhaWwgdHVybiBvZmYgYmxpbmtpbmcgc2luY2Ugd2UgZXhwZWN0CisJICogYSBzb2Z0d2FyZSBmYWxsYmFjay4gKi8KKwlzY2hlZHVsZV93b3JrKCZsZWQtPndvcmspOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGVkLT52YWx1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbGVkX3NyY190ZXh0c1tdID0geworCSJvdHAiLAorCSJwb3dlciIsCisJImNoYXJnZXIiLAorCSJzb2Z0IiwKK307CisKK3N0YXRpYyBzc2l6ZV90IHdtODMxeF9zdGF0dXNfc3JjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgd204MzF4X3N0YXR1cyAqbGVkID0gdG9fd204MzF4X3N0YXR1cyhsZWRfY2Rldik7CisJaW50IGk7CisJc3NpemVfdCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmbGVkLT5tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsZWRfc3JjX3RleHRzKTsgaSsrKQorCQlpZiAoaSA9PSBsZWQtPnNyYykKKwkJCXJldCArPSBzcHJpbnRmKCZidWZbcmV0XSwgIlslc10gIiwgbGVkX3NyY190ZXh0c1tpXSk7CisJCWVsc2UKKwkJCXJldCArPSBzcHJpbnRmKCZidWZbcmV0XSwgIiVzICIsIGxlZF9zcmNfdGV4dHNbaV0pOworCisJbXV0ZXhfdW5sb2NrKCZsZWQtPm11dGV4KTsKKworCXJldCArPSBzcHJpbnRmKCZidWZbcmV0XSwgIlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB3bTgzMXhfc3RhdHVzX3NyY19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHdtODMxeF9zdGF0dXMgKmxlZCA9IHRvX3dtODMxeF9zdGF0dXMobGVkX2NkZXYpOworCWNoYXIgbmFtZVsyMF07CisJaW50IGk7CisJc2l6ZV90IGxlbjsKKworCW5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAnXDAnOworCXN0cm5jcHkobmFtZSwgYnVmLCBzaXplb2YobmFtZSkgLSAxKTsKKwlsZW4gPSBzdHJsZW4obmFtZSk7CisKKwlpZiAobGVuICYmIG5hbWVbbGVuIC0gMV0gPT0gJ1xuJykKKwkJbmFtZVtsZW4gLSAxXSA9ICdcMCc7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsZWRfc3JjX3RleHRzKTsgaSsrKSB7CisJCWlmICghc3RyY21wKG5hbWUsIGxlZF9zcmNfdGV4dHNbaV0pKSB7CisJCQltdXRleF9sb2NrKCZsZWQtPm11dGV4KTsKKworCQkJbGVkLT5zcmMgPSBpOworCQkJc2NoZWR1bGVfd29yaygmbGVkLT53b3JrKTsKKworCQkJbXV0ZXhfdW5sb2NrKCZsZWQtPm11dGV4KTsKKwkJfQorCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc3JjLCAwNjQ0LCB3bTgzMXhfc3RhdHVzX3NyY19zaG93LCB3bTgzMXhfc3RhdHVzX3NyY19zdG9yZSk7CisKK3N0YXRpYyBpbnQgd204MzF4X3N0YXR1c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgd204MzF4X3BkYXRhICpjaGlwX3BkYXRhOworCXN0cnVjdCB3bTgzMXhfc3RhdHVzX3BkYXRhIHBkYXRhOworCXN0cnVjdCB3bTgzMXhfc3RhdHVzICpkcnZkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpZCA9IHBkZXYtPmlkICUgQVJSQVlfU0laRShjaGlwX3BkYXRhLT5zdGF0dXMpOworCWludCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIEkvTyByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCWRydmRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204MzF4X3N0YXR1cyksIEdGUF9LRVJORUwpOworCWlmICghZHJ2ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRydmRhdGEpOworCisJZHJ2ZGF0YS0+d204MzF4ID0gd204MzF4OworCWRydmRhdGEtPnJlZyA9IHJlcy0+c3RhcnQ7CisKKwlpZiAod204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGEpCisJCWNoaXBfcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwllbHNlCisJCWNoaXBfcGRhdGEgPSBOVUxMOworCisJbWVtc2V0KCZwZGF0YSwgMCwgc2l6ZW9mKHBkYXRhKSk7CisJaWYgKGNoaXBfcGRhdGEgJiYgY2hpcF9wZGF0YS0+c3RhdHVzW2lkXSkKKwkJbWVtY3B5KCZwZGF0YSwgY2hpcF9wZGF0YS0+c3RhdHVzW2lkXSwgc2l6ZW9mKHBkYXRhKSk7CisJZWxzZQorCQlwZGF0YS5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisKKwltdXRleF9pbml0KCZkcnZkYXRhLT5tdXRleCk7CisJSU5JVF9XT1JLKCZkcnZkYXRhLT53b3JrLCB3bTgzMXhfc3RhdHVzX3dvcmspOworCXNwaW5fbG9ja19pbml0KCZkcnZkYXRhLT52YWx1ZV9sb2NrKTsKKworCS8qIFdlIGNhY2hlIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGFuZCByZWFkIHN0YXJ0dXAgdmFsdWVzCisJICogZnJvbSBpdC4gKi8KKwlkcnZkYXRhLT5yZWdfdmFsID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgZHJ2ZGF0YS0+cmVnKTsKKworCWlmIChkcnZkYXRhLT5yZWdfdmFsICYgV004MzFYX0xFRF9NT0RFX01BU0spCisJCWRydmRhdGEtPmJyaWdodG5lc3MgPSBMRURfRlVMTDsKKwllbHNlCisJCWRydmRhdGEtPmJyaWdodG5lc3MgPSBMRURfT0ZGOworCisJLyogU2V0IGEgZGVmYXVsdCBzb3VyY2UgaWYgY29uZmlndXJlZCwgb3RoZXJ3aXNlIGxlYXZlIHRoZQorCSAqIGN1cnJlbnQgaGFyZHdhcmUgc2V0dGluZy4KKwkgKi8KKwlpZiAocGRhdGEuZGVmYXVsdF9zcmMgPT0gV004MzFYX1NUQVRVU19QUkVTRVJWRSkgeworCQlkcnZkYXRhLT5zcmMgPSBkcnZkYXRhLT5yZWdfdmFsOworCQlkcnZkYXRhLT5zcmMgJj0gV004MzFYX0xFRF9TUkNfTUFTSzsKKwkJZHJ2ZGF0YS0+c3JjID4+PSBXTTgzMVhfTEVEX1NSQ19TSElGVDsKKwl9IGVsc2UgeworCQlkcnZkYXRhLT5zcmMgPSBwZGF0YS5kZWZhdWx0X3NyYyAtIDE7CisJfQorCisJZHJ2ZGF0YS0+Y2Rldi5uYW1lID0gcGRhdGEubmFtZTsKKwlkcnZkYXRhLT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IHBkYXRhLmRlZmF1bHRfdHJpZ2dlcjsKKwlkcnZkYXRhLT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gd204MzF4X3N0YXR1c19zZXQ7CisJZHJ2ZGF0YS0+Y2Rldi5ibGlua19zZXQgPSB3bTgzMXhfc3RhdHVzX2JsaW5rX3NldDsKKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3Rlcih3bTgzMXgtPmRldiwgJmRydmRhdGEtPmNkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBMRUQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9sZWQ7CisJfQorCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRydmRhdGEtPmNkZXYuZGV2LCAmZGV2X2F0dHJfc3JjKTsKKwlpZiAocmV0ICE9IDApCisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJObyBzb3VyY2UgY29udHJvbCBmb3IgTEVEOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiAwOworCitlcnJfbGVkOgorCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZkcnZkYXRhLT5jZGV2KTsKKwlrZnJlZShkcnZkYXRhKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODMxeF9zdGF0dXNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtODMxeF9zdGF0dXMgKmRydmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldmljZV9yZW1vdmVfZmlsZShkcnZkYXRhLT5jZGV2LmRldiwgJmRldl9hdHRyX3NyYyk7CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRydmRhdGEtPmNkZXYpOworCWtmcmVlKGRydmRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODMxeF9zdGF0dXNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gIndtODMxeC1zdGF0dXMiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfSwKKwkucHJvYmUgPSB3bTgzMXhfc3RhdHVzX3Byb2JlLAorCS5yZW1vdmUgPSB3bTgzMXhfc3RhdHVzX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdtODMxeF9zdGF0dXNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndtODMxeF9zdGF0dXNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHdtODMxeF9zdGF0dXNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIHdtODMxeF9zdGF0dXNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ3bTgzMXhfc3RhdHVzX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh3bTgzMXhfc3RhdHVzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV004MzF4IHN0YXR1cyBMRUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODMxeC1zdGF0dXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWR0cmlnLWdwaW8uYyBiL2RyaXZlcnMvbGVkcy9sZWR0cmlnLWdwaW8uYwppbmRleCAxYmM1ZGI0Li5mNTkxMzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkdHJpZy1ncGlvLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctZ3Bpby5jCkBAIC00NCwyMiArNDQsMjIgQEAKIAkJCXN0cnVjdCBncGlvX3RyaWdfZGF0YSwgd29yayk7CiAJaW50IHRtcDsKIAotICAgICAgIGlmICghZ3Bpb19kYXRhLT5ncGlvKQotCSAgICAgICByZXR1cm47CisJaWYgKCFncGlvX2RhdGEtPmdwaW8pCisJCXJldHVybjsKIAotICAgICAgIHRtcCA9IGdwaW9fZ2V0X3ZhbHVlKGdwaW9fZGF0YS0+Z3Bpbyk7Ci0gICAgICAgaWYgKGdwaW9fZGF0YS0+aW52ZXJ0ZWQpCi0JICAgICAgIHRtcCA9ICF0bXA7CisJdG1wID0gZ3Bpb19nZXRfdmFsdWUoZ3Bpb19kYXRhLT5ncGlvKTsKKwlpZiAoZ3Bpb19kYXRhLT5pbnZlcnRlZCkKKwkJdG1wID0gIXRtcDsKIAotICAgICAgIGlmICh0bXApIHsKLSAgICAgICAgICAgICAgIGlmIChncGlvX2RhdGEtPmRlc2lyZWRfYnJpZ2h0bmVzcykKLSAgICAgICAgICAgICAgICAgICAgICAgbGVkX3NldF9icmlnaHRuZXNzKGdwaW9fZGF0YS0+bGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Bpb19kYXRhLT5kZXNpcmVkX2JyaWdodG5lc3MpOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICBsZWRfc2V0X2JyaWdodG5lc3MoZ3Bpb19kYXRhLT5sZWQsIExFRF9GVUxMKTsKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgbGVkX3NldF9icmlnaHRuZXNzKGdwaW9fZGF0YS0+bGVkLCBMRURfT0ZGKTsKLSAgICAgICB9CisJaWYgKHRtcCkgeworCQlpZiAoZ3Bpb19kYXRhLT5kZXNpcmVkX2JyaWdodG5lc3MpCisJCQlsZWRfc2V0X2JyaWdodG5lc3MoZ3Bpb19kYXRhLT5sZWQsCisJCQkJCSAgIGdwaW9fZGF0YS0+ZGVzaXJlZF9icmlnaHRuZXNzKTsKKwkJZWxzZQorCQkJbGVkX3NldF9icmlnaHRuZXNzKGdwaW9fZGF0YS0+bGVkLCBMRURfRlVMTCk7CisJfSBlbHNlIHsKKwkJbGVkX3NldF9icmlnaHRuZXNzKGdwaW9fZGF0YS0+bGVkLCBMRURfT0ZGKTsKKwl9CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGdwaW9fdHJpZ19icmlnaHRuZXNzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvaW50ZXJydXB0c19hbmRfdHJhcHMuYyBiL2RyaXZlcnMvbGd1ZXN0L2ludGVycnVwdHNfYW5kX3RyYXBzLmMKaW5kZXggMTg2NDgxOC4uZGFhZjg2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvaW50ZXJydXB0c19hbmRfdHJhcHMuYworKysgYi9kcml2ZXJzL2xndWVzdC9pbnRlcnJ1cHRzX2FuZF90cmFwcy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAibGcuaCIKIAogLyogQWxsb3cgR3Vlc3RzIHRvIHVzZSBhIG5vbi0xMjggKGllLiBub24tTGludXgpIHN5c2NhbGwgdHJhcC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfdXNlci5jCmluZGV4IGI0ZDNmN2MuLmJkMTYzMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X3VzZXIuYwpAQCAtNTA4LDcgKzUwOCw3IEBACiAgKiB1c2VzOiByZWFkaW5nIGFuZCB3cml0aW5nIGEgY2hhcmFjdGVyIGRldmljZSBjYWxsZWQgL2Rldi9sZ3Vlc3QuICBBbGwgdGhlCiAgKiB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSwgd3JpdGUoKSBhbmQgY2xvc2UoKSByb3V0aW5lczoKICAqLwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGd1ZXN0X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsZ3Vlc3RfZm9wcyA9IHsKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCiAJLnJlbGVhc2UgPSBjbG9zZSwKIAkud3JpdGUJID0gd3JpdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKaW5kZXggZmRlMzc3Yy4uNTU2ZjBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwpAQCAtMTI0LDYgKzEyNCw4IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0aGVybW9zdGF0X2RyaXZlcjsKKwogc3RhdGljIGludAogYXR0YWNoX3RoZXJtb3N0YXQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewpAQCAtMTQ4LDcgKzE1MCw3IEBACiAJICogTGV0IGkyYy1jb3JlIGRlbGV0ZSB0aGF0IGRldmljZSBvbiBkcml2ZXIgcmVtb3ZhbC4KIAkgKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpMmMtY29yZSBob2xkcyB0aGUgY29yZV9sb2NrIG11dGV4IGZvciB1cy4KIAkgKi8KLQlsaXN0X2FkZF90YWlsKCZjbGllbnQtPmRldGVjdGVkLCAmY2xpZW50LT5kcml2ZXItPmNsaWVudHMpOworCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+ZGV0ZWN0ZWQsICZ0aGVybW9zdGF0X2RyaXZlci5jbGllbnRzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCmluZGV4IGEwMjg1OTguLmVhMzJjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKQEAgLTI4Niw2ICsyODYsOCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdGhlcm1fcG03Ml9kcml2ZXI7CisKIC8qCiAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBpMmNfY2xpZW50IHN0cnVjdHVyZSBhbmQKICAqIGF0dGFjaCBpdCB0byBvbmUgb2YgdTMgYWRhcHRlcnMKQEAgLTMxOCw3ICszMjAsNyBAQAogCSAqIExldCBpMmMtY29yZSBkZWxldGUgdGhhdCBkZXZpY2Ugb24gZHJpdmVyIHJlbW92YWwuCiAJICogVGhpcyBpcyBzYWZlIGJlY2F1c2UgaTJjLWNvcmUgaG9sZHMgdGhlIGNvcmVfbG9jayBtdXRleCBmb3IgdXMuCiAJICovCi0JbGlzdF9hZGRfdGFpbCgmY2x0LT5kZXRlY3RlZCwgJmNsdC0+ZHJpdmVyLT5jbGllbnRzKTsKKwlsaXN0X2FkZF90YWlsKCZjbHQtPmRldGVjdGVkLCAmdGhlcm1fcG03Ml9kcml2ZXIuY2xpZW50cyk7CiAJcmV0dXJuIGNsdDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS1sZWQuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtbGVkLmMKaW5kZXggNTVhZDk1Ni4uZDI0Mjk3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS1sZWQuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LWxlZC5jCkBAIC03Miw3ICs3Miw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IHBtdV9sZWQgPSB7Ci0JLm5hbWUgPSAicG11LWZyb250LWxlZCIsCisJLm5hbWUgPSAicG11LWxlZDo6ZnJvbnQiLAogI2lmZGVmIENPTkZJR19BREJfUE1VX0xFRF9JREUKIAkuZGVmYXVsdF90cmlnZ2VyID0gImlkZS1kaXNrIiwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCmluZGV4IGI0MGZiOWIuLjZmMzA4YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKQEAgLTQwNSw3ICs0MDUsMTEgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJ2aWEtcG11OiBjYW4ndCBtYXAgaW50ZXJydXB0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmIChyZXF1ZXN0X2lycShpcnEsIHZpYV9wbXVfaW50ZXJydXB0LCAwLCAiVklBLVBNVSIsICh2b2lkICopMCkpIHsKKwkvKiBXZSBzZXQgSVJRRl9USU1FUiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlIGludGVycnVwdCB0byBiZSBkaXNhYmxlZAorCSAqIGJldHdlZW4gdGhlIDIgcGFzc2VzIG9mIGRyaXZlciBzdXNwZW5kLCB3ZSBjb250cm9sIG91ciBvd24gZGlzYWJsaW5nCisJICogZm9yIHRoYXQgb25lCisJICovCisJaWYgKHJlcXVlc3RfaXJxKGlycSwgdmlhX3BtdV9pbnRlcnJ1cHQsIElSUUZfVElNRVIsICJWSUEtUE1VIiwgKHZvaWQgKikwKSkgewogCQlwcmludGsoS0VSTl9FUlIgInZpYS1wbXU6IGNhbid0IHJlcXVlc3QgaXJxICVkXG4iLCBpcnEpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC00MTksNyArNDIzLDcgQEAKIAkJCWdwaW9faXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZ3Bpb19ub2RlLCAwKTsKIAogCQlpZiAoZ3Bpb19pcnEgIT0gTk9fSVJRKSB7Ci0JCQlpZiAocmVxdWVzdF9pcnEoZ3Bpb19pcnEsIGdwaW8xX2ludGVycnVwdCwgMCwKKwkJCWlmIChyZXF1ZXN0X2lycShncGlvX2lycSwgZ3BpbzFfaW50ZXJydXB0LCBJUlFGX1RJTUVSLAogCQkJCQkiR1BJTzEgQURCIiwgKHZvaWQgKikwKSkKIAkJCQlwcmludGsoS0VSTl9FUlIgInBtdTogY2FuJ3QgZ2V0IGlycSAlZCIKIAkJCQkgICAgICAgIiAoR1BJTzEpXG4iLCBncGlvX2lycSk7CkBAIC05MjUsOCArOTI5LDcgQEAKIAogI2lmZGVmIENPTkZJR19BREIKIC8qIFNlbmQgYW4gQURCIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQKLXBtdV9zZW5kX3JlcXVlc3Qoc3RydWN0IGFkYl9yZXF1ZXN0ICpyZXEsIGludCBzeW5jKQorc3RhdGljIGludCBwbXVfc2VuZF9yZXF1ZXN0KHN0cnVjdCBhZGJfcmVxdWVzdCAqcmVxLCBpbnQgc3luYykKIHsKIAlpbnQgaSwgcmV0OwogCkBAIC0xMDA1LDE2ICsxMDA4LDExIEBACiB9CiAKIC8qIEVuYWJsZS9kaXNhYmxlIGF1dG9wb2xsaW5nICovCi1zdGF0aWMgaW50Ci1wbXVfYWRiX2F1dG9wb2xsKGludCBkZXZzKQorc3RhdGljIGludCBfX3BtdV9hZGJfYXV0b3BvbGwoaW50IGRldnMpCiB7CiAJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKIAotCWlmICgodmlhcyA9PSBOVUxMKSB8fCAoIXBtdV9mdWxseV9pbml0ZWQpIHx8ICFwbXVfaGFzX2FkYikKLQkJcmV0dXJuIC1FTlhJTzsKLQogCWlmIChkZXZzKSB7Ci0JCWFkYl9kZXZfbWFwID0gZGV2czsKIAkJcG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgUE1VX0FEQl9DTUQsIDAsIDB4ODYsCiAJCQkgICAgYWRiX2Rldl9tYXAgPj4gOCwgYWRiX2Rldl9tYXApOwogCQlwbXVfYWRiX2ZsYWdzID0gMjsKQEAgLTEwMjcsOSArMTAyNSwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBtdV9hZGJfYXV0b3BvbGwoaW50IGRldnMpCit7CisJaWYgKCh2aWFzID09IE5VTEwpIHx8ICghcG11X2Z1bGx5X2luaXRlZCkgfHwgIXBtdV9oYXNfYWRiKQorCQlyZXR1cm4gLUVOWElPOworCisJYWRiX2Rldl9tYXAgPSBkZXZzOworCXJldHVybiBfX3BtdV9hZGJfYXV0b3BvbGwoZGV2cyk7Cit9CisKIC8qIFJlc2V0IHRoZSBBREIgYnVzICovCi1zdGF0aWMgaW50Ci1wbXVfYWRiX3Jlc2V0X2J1cyh2b2lkKQorc3RhdGljIGludCBwbXVfYWRiX3Jlc2V0X2J1cyh2b2lkKQogewogCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CiAJaW50IHNhdmVfYXV0b3BvbGwgPSBhZGJfZGV2X21hcDsKQEAgLTEwMzgsMTMgKzEwNDQsMTMgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIGFueW9uZSBnb3QgYSBiZXR0ZXIgaWRlYT8/ICovCi0JcG11X2FkYl9hdXRvcG9sbCgwKTsKKwlfX3BtdV9hZGJfYXV0b3BvbGwoMCk7CiAKLQlyZXEubmJ5dGVzID0gNTsKKwlyZXEubmJ5dGVzID0gNDsKIAlyZXEuZG9uZSA9IE5VTEw7CiAJcmVxLmRhdGFbMF0gPSBQTVVfQURCX0NNRDsKLQlyZXEuZGF0YVsxXSA9IDA7Ci0JcmVxLmRhdGFbMl0gPSBBREJfQlVTUkVTRVQ7CisJcmVxLmRhdGFbMV0gPSBBREJfQlVTUkVTRVQ7CisJcmVxLmRhdGFbMl0gPSAwOwogCXJlcS5kYXRhWzNdID0gMDsKIAlyZXEuZGF0YVs0XSA9IDA7CiAJcmVxLnJlcGx5X2xlbiA9IDA7CkBAIC0xMDU2LDcgKzEwNjIsNyBAQAogCXBtdV93YWl0X2NvbXBsZXRlKCZyZXEpOwogCiAJaWYgKHNhdmVfYXV0b3BvbGwgIT0gMCkKLQkJcG11X2FkYl9hdXRvcG9sbChzYXZlX2F1dG9wb2xsKTsKKwkJX19wbXVfYWRiX2F1dG9wb2xsKHNhdmVfYXV0b3BvbGwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9sbTc1X3NlbnNvci5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fbG03NV9zZW5zb3IuYwppbmRleCA1Mjk4ODZjLi5lZDY0MjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9sbTc1X3NlbnNvci5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2xtNzVfc2Vuc29yLmMKQEAgLTExNSw2ICsxMTUsOCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdmX2xtNzVfZHJpdmVyOworCiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKndmX2xtNzVfY3JlYXRlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKIAkJCQkJICAgICB1OCBhZGRyLCBpbnQgZHMxNzc1LAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKmxvYykKQEAgLTE1Nyw3ICsxNTksNyBAQAogCSAqIExldCBpMmMtY29yZSBkZWxldGUgdGhhdCBkZXZpY2Ugb24gZHJpdmVyIHJlbW92YWwuCiAJICogVGhpcyBpcyBzYWZlIGJlY2F1c2UgaTJjLWNvcmUgaG9sZHMgdGhlIGNvcmVfbG9jayBtdXRleCBmb3IgdXMuCiAJICovCi0JbGlzdF9hZGRfdGFpbCgmY2xpZW50LT5kZXRlY3RlZCwgJmNsaWVudC0+ZHJpdmVyLT5jbGllbnRzKTsKKwlsaXN0X2FkZF90YWlsKCZjbGllbnQtPmRldGVjdGVkLCAmd2ZfbG03NV9kcml2ZXIuY2xpZW50cyk7CiAJcmV0dXJuIGNsaWVudDsKICBmYWlsOgogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fbWF4NjY5MF9zZW5zb3IuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX21heDY2OTBfc2Vuc29yLmMKaW5kZXggZTJhNTVlYy4uYTY3YjM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fbWF4NjY5MF9zZW5zb3IuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9tYXg2NjkwX3NlbnNvci5jCkBAIC04OCw2ICs4OCw4IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd2ZfbWF4NjY5MF9kcml2ZXI7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqd2ZfbWF4NjY5MF9jcmVhdGUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAogCQkJCQkgICAgdTggYWRkciwgY29uc3QgY2hhciAqbG9jKQogewpAQCAtMTE5LDcgKzEyMSw3IEBACiAJICogTGV0IGkyYy1jb3JlIGRlbGV0ZSB0aGF0IGRldmljZSBvbiBkcml2ZXIgcmVtb3ZhbC4KIAkgKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpMmMtY29yZSBob2xkcyB0aGUgY29yZV9sb2NrIG11dGV4IGZvciB1cy4KIAkgKi8KLQlsaXN0X2FkZF90YWlsKCZjbGllbnQtPmRldGVjdGVkLCAmY2xpZW50LT5kcml2ZXItPmNsaWVudHMpOworCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+ZGV0ZWN0ZWQsICZ3Zl9tYXg2NjkwX2RyaXZlci5jbGllbnRzKTsKIAlyZXR1cm4gY2xpZW50OwogCiAgZmFpbDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3NtdV9zYXQuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3NtdV9zYXQuYwppbmRleCA1ZGE3MjllLi5lMjAzMzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9zbXVfc2F0LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X3NhdC5jCkBAIC0xOTQsNiArMTk0LDggQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd2Zfc2F0X2RyaXZlcjsKKwogc3RhdGljIHZvaWQgd2Zfc2F0X2NyZWF0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOwpAQCAtMjIyLDcgKzIyNCw3IEBACiAJICogTGV0IGkyYy1jb3JlIGRlbGV0ZSB0aGF0IGRldmljZSBvbiBkcml2ZXIgcmVtb3ZhbC4KIAkgKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpMmMtY29yZSBob2xkcyB0aGUgY29yZV9sb2NrIG11dGV4IGZvciB1cy4KIAkgKi8KLQlsaXN0X2FkZF90YWlsKCZjbGllbnQtPmRldGVjdGVkLCAmY2xpZW50LT5kcml2ZXItPmNsaWVudHMpOworCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+ZGV0ZWN0ZWQsICZ3Zl9zYXRfZHJpdmVyLmNsaWVudHMpOwogfQogCiBzdGF0aWMgaW50IHdmX3NhdF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9LY29uZmlnIGIvZHJpdmVycy9tZC9LY29uZmlnCmluZGV4IDAyMGY5NTcuLjIxNTgzNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvS2NvbmZpZworKysgYi9kcml2ZXJzL21kL0tjb25maWcKQEAgLTEyNCw2ICsxMjQsOCBAQAogCXNlbGVjdCBNRF9SQUlENl9QUQogCXNlbGVjdCBBU1lOQ19NRU1DUFkKIAlzZWxlY3QgQVNZTkNfWE9SCisJc2VsZWN0IEFTWU5DX1BRCisJc2VsZWN0IEFTWU5DX1JBSUQ2X1JFQ09WCiAJLS0taGVscC0tLQogCSAgQSBSQUlELTUgc2V0IG9mIE4gZHJpdmVzIHdpdGggYSBjYXBhY2l0eSBvZiBDIE1CIHBlciBkcml2ZSBwcm92aWRlcwogCSAgdGhlIGNhcGFjaXR5IG9mIEMgKiAoTiAtIDEpIE1CLCBhbmQgcHJvdGVjdHMgYWdhaW5zdCBhIGZhaWx1cmUKQEAgLTE1Miw5ICsxNTQsMzMgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIE1VTFRJQ09SRV9SQUlENDU2CisJYm9vbCAiUkFJRC00L1JBSUQtNS9SQUlELTYgTXVsdGljb3JlIHByb2Nlc3NpbmcgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBNRF9SQUlENDU2CisJZGVwZW5kcyBvbiBTTVAKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSB0aGUgcmFpZDQ1NiBtb2R1bGUgdG8gZGlzcGF0Y2ggcGVyLXN0cmlwZSByYWlkIG9wZXJhdGlvbnMgdG8gYQorCSAgdGhyZWFkIHBvb2wuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBNRF9SQUlENl9QUQogCXRyaXN0YXRlCiAKK2NvbmZpZyBBU1lOQ19SQUlENl9URVNUCisJdHJpc3RhdGUgIlNlbGYgdGVzdCBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgcmFpZDYgcmVjb3ZlcnkiCisJZGVwZW5kcyBvbiBNRF9SQUlENl9QUQorCXNlbGVjdCBBU1lOQ19SQUlENl9SRUNPVgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBvbmUtc2hvdCBzZWxmIHRlc3QgdGhhdCBwZXJtdXRlcyB0aHJvdWdoIHRoZQorCSAgcmVjb3Zlcnkgb2YgYWxsIHRoZSBwb3NzaWJsZSB0d28gZGlzayBmYWlsdXJlIHNjZW5hcmlvcyBmb3IgYQorCSAgTi1kaXNrIGFycmF5LiAgUmVjb3ZlcnkgaXMgcGVyZm9ybWVkIHdpdGggdGhlIGFzeW5jaHJvbm91cworCSAgcmFpZDYgcmVjb3Zlcnkgcm91dGluZXMsIGFuZCB3aWxsIG9wdGlvbmFsbHkgdXNlIGFuIG9mZmxvYWQKKwkgIGVuZ2luZSBpZiBvbmUgaXMgYXZhaWxhYmxlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTURfTVVMVElQQVRICiAJdHJpc3RhdGUgIk11bHRpcGF0aCBJL08gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEJMS19ERVZfTUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvTWFrZWZpbGUgYi9kcml2ZXJzL21kL01ha2VmaWxlCmluZGV4IDFkYzQxODUuLmUzNTVlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZC9NYWtlZmlsZQpAQCAtNDYsNyArNDYsNyBAQAogb2JqLSQoQ09ORklHX0RNX1pFUk8pCQkrPSBkbS16ZXJvLm8KIAogcXVpZXRfY21kX3Vucm9sbCA9IFVOUk9MTCAgJEAKLSAgICAgIGNtZF91bnJvbGwgPSAkKFBFUkwpICQoc3JjdHJlZSkvJChzcmMpL3Vucm9sbC5wbCAkKFVOUk9MTCkgXAorICAgICAgY21kX3Vucm9sbCA9ICQoQVdLKSAtZiQoc3JjdHJlZSkvJChzcmMpL3Vucm9sbC5hd2sgLXZOPSQoVU5ST0xMKSBcCiAgICAgICAgICAgICAgICAgICAgPCAkPCA+ICRAIHx8ICggcm0gLWYgJEAgJiYgZXhpdCAxICkKIAogaWZlcSAoJChDT05GSUdfQUxUSVZFQykseSkKQEAgLTU5LDU2ICs1OSw1NiBAQAogCiB0YXJnZXRzICs9IHJhaWQ2aW50MS5jCiAkKG9iaikvcmFpZDZpbnQxLmM6ICAgVU5ST0xMIDo9IDEKLSQob2JqKS9yYWlkNmludDEuYzogICAkKHNyYykvcmFpZDZpbnQudWMgJChzcmMpL3Vucm9sbC5wbCBGT1JDRQorJChvYmopL3JhaWQ2aW50MS5jOiAgICQoc3JjKS9yYWlkNmludC51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAogdGFyZ2V0cyArPSByYWlkNmludDIuYwogJChvYmopL3JhaWQ2aW50Mi5jOiAgIFVOUk9MTCA6PSAyCi0kKG9iaikvcmFpZDZpbnQyLmM6ICAgJChzcmMpL3JhaWQ2aW50LnVjICQoc3JjKS91bnJvbGwucGwgRk9SQ0UKKyQob2JqKS9yYWlkNmludDIuYzogICAkKHNyYykvcmFpZDZpbnQudWMgJChzcmMpL3Vucm9sbC5hd2sgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCx1bnJvbGwpCiAKIHRhcmdldHMgKz0gcmFpZDZpbnQ0LmMKICQob2JqKS9yYWlkNmludDQuYzogICBVTlJPTEwgOj0gNAotJChvYmopL3JhaWQ2aW50NC5jOiAgICQoc3JjKS9yYWlkNmludC51YyAkKHNyYykvdW5yb2xsLnBsIEZPUkNFCiskKG9iaikvcmFpZDZpbnQ0LmM6ICAgJChzcmMpL3JhaWQ2aW50LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQogCiB0YXJnZXRzICs9IHJhaWQ2aW50OC5jCiAkKG9iaikvcmFpZDZpbnQ4LmM6ICAgVU5ST0xMIDo9IDgKLSQob2JqKS9yYWlkNmludDguYzogICAkKHNyYykvcmFpZDZpbnQudWMgJChzcmMpL3Vucm9sbC5wbCBGT1JDRQorJChvYmopL3JhaWQ2aW50OC5jOiAgICQoc3JjKS9yYWlkNmludC51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAogdGFyZ2V0cyArPSByYWlkNmludDE2LmMKICQob2JqKS9yYWlkNmludDE2LmM6ICBVTlJPTEwgOj0gMTYKLSQob2JqKS9yYWlkNmludDE2LmM6ICAkKHNyYykvcmFpZDZpbnQudWMgJChzcmMpL3Vucm9sbC5wbCBGT1JDRQorJChvYmopL3JhaWQ2aW50MTYuYzogICQoc3JjKS9yYWlkNmludC51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAogdGFyZ2V0cyArPSByYWlkNmludDMyLmMKICQob2JqKS9yYWlkNmludDMyLmM6ICBVTlJPTEwgOj0gMzIKLSQob2JqKS9yYWlkNmludDMyLmM6ICAkKHNyYykvcmFpZDZpbnQudWMgJChzcmMpL3Vucm9sbC5wbCBGT1JDRQorJChvYmopL3JhaWQ2aW50MzIuYzogICQoc3JjKS9yYWlkNmludC51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAogQ0ZMQUdTX3JhaWQ2YWx0aXZlYzEubyArPSAkKGFsdGl2ZWNfZmxhZ3MpCiB0YXJnZXRzICs9IHJhaWQ2YWx0aXZlYzEuYwogJChvYmopL3JhaWQ2YWx0aXZlYzEuYzogICBVTlJPTEwgOj0gMQotJChvYmopL3JhaWQ2YWx0aXZlYzEuYzogICAkKHNyYykvcmFpZDZhbHRpdmVjLnVjICQoc3JjKS91bnJvbGwucGwgRk9SQ0UKKyQob2JqKS9yYWlkNmFsdGl2ZWMxLmM6ICAgJChzcmMpL3JhaWQ2YWx0aXZlYy51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAogQ0ZMQUdTX3JhaWQ2YWx0aXZlYzIubyArPSAkKGFsdGl2ZWNfZmxhZ3MpCiB0YXJnZXRzICs9IHJhaWQ2YWx0aXZlYzIuYwogJChvYmopL3JhaWQ2YWx0aXZlYzIuYzogICBVTlJPTEwgOj0gMgotJChvYmopL3JhaWQ2YWx0aXZlYzIuYzogICAkKHNyYykvcmFpZDZhbHRpdmVjLnVjICQoc3JjKS91bnJvbGwucGwgRk9SQ0UKKyQob2JqKS9yYWlkNmFsdGl2ZWMyLmM6ICAgJChzcmMpL3JhaWQ2YWx0aXZlYy51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAogQ0ZMQUdTX3JhaWQ2YWx0aXZlYzQubyArPSAkKGFsdGl2ZWNfZmxhZ3MpCiB0YXJnZXRzICs9IHJhaWQ2YWx0aXZlYzQuYwogJChvYmopL3JhaWQ2YWx0aXZlYzQuYzogICBVTlJPTEwgOj0gNAotJChvYmopL3JhaWQ2YWx0aXZlYzQuYzogICAkKHNyYykvcmFpZDZhbHRpdmVjLnVjICQoc3JjKS91bnJvbGwucGwgRk9SQ0UKKyQob2JqKS9yYWlkNmFsdGl2ZWM0LmM6ICAgJChzcmMpL3JhaWQ2YWx0aXZlYy51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAogQ0ZMQUdTX3JhaWQ2YWx0aXZlYzgubyArPSAkKGFsdGl2ZWNfZmxhZ3MpCiB0YXJnZXRzICs9IHJhaWQ2YWx0aXZlYzguYwogJChvYmopL3JhaWQ2YWx0aXZlYzguYzogICBVTlJPTEwgOj0gOAotJChvYmopL3JhaWQ2YWx0aXZlYzguYzogICAkKHNyYykvcmFpZDZhbHRpdmVjLnVjICQoc3JjKS91bnJvbGwucGwgRk9SQ0UKKyQob2JqKS9yYWlkNmFsdGl2ZWM4LmM6ICAgJChzcmMpL3JhaWQ2YWx0aXZlYy51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAogcXVpZXRfY21kX21rdGFibGUgPSBUQUJMRSAgICRACmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JpdG1hcC5jIGIvZHJpdmVycy9tZC9iaXRtYXAuYwppbmRleCAzMzE5YzJmLi42MGUyYjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKQEAgLTEwOCw2ICsxMDgsOCBAQAogICogYWxsb2NhdGVkIHdoaWxlIHdlJ3JlIHVzaW5nIGl0CiAgKi8KIHN0YXRpYyBpbnQgYml0bWFwX2NoZWNrcGFnZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGxvbmcgcGFnZSwgaW50IGNyZWF0ZSkKK19fcmVsZWFzZXMoYml0bWFwLT5sb2NrKQorX19hY3F1aXJlcyhiaXRtYXAtPmxvY2spCiB7CiAJdW5zaWduZWQgY2hhciAqbWFwcGFnZTsKIApAQCAtMzI1LDcgKzMyNyw2IEBACiAJcmV0dXJuIDA7CiAKICBiYWRfYWxpZ25tZW50OgotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC0xMjA3LDYgKzEyMDgsOCBAQAogc3RhdGljIGJpdG1hcF9jb3VudGVyX3QgKmJpdG1hcF9nZXRfY291bnRlcihzdHJ1Y3QgYml0bWFwICpiaXRtYXAsCiAJCQkJCSAgICBzZWN0b3JfdCBvZmZzZXQsIGludCAqYmxvY2tzLAogCQkJCQkgICAgaW50IGNyZWF0ZSkKK19fcmVsZWFzZXMoYml0bWFwLT5sb2NrKQorX19hY3F1aXJlcyhiaXRtYXAtPmxvY2spCiB7CiAJLyogSWYgJ2NyZWF0ZScsIHdlIG1pZ2h0IHJlbGVhc2UgdGhlIGxvY2sgYW5kIHJlY2xhaW0gaXQuCiAJICogVGhlIGxvY2sgbXVzdCBoYXZlIGJlZW4gdGFrZW4gd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCkBAIC0xNjIxLDEwICsxNjI0LDExIEBACiAJYml0bWFwLT5vZmZzZXQgPSBtZGRldi0+Yml0bWFwX29mZnNldDsKIAlpZiAoZmlsZSkgewogCQlnZXRfZmlsZShmaWxlKTsKLQkJZG9fc3luY19tYXBwaW5nX3JhbmdlKGZpbGUtPmZfbWFwcGluZywgMCwgTExPTkdfTUFYLAotCQkJCSAgICAgIFNZTkNfRklMRV9SQU5HRV9XQUlUX0JFRk9SRSB8Ci0JCQkJICAgICAgU1lOQ19GSUxFX1JBTkdFX1dSSVRFIHwKLQkJCQkgICAgICBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9BRlRFUik7CisJCS8qIEFzIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGZpbGUgd2lsbCB1c2UgYm1hcCwKKwkJICogYW5kIGJ5cGFzcyB0aGUgcGFnZSBjYWNoZSwgd2UgbXVzdCBzeW5jIHRoZSBmaWxlCisJCSAqIGZpcnN0LgorCQkgKi8KKwkJdmZzX2ZzeW5jKGZpbGUsIGZpbGUtPmZfZGVudHJ5LCAxKTsKIAl9CiAJLyogcmVhZCBzdXBlcmJsb2NrIGZyb20gYml0bWFwIGZpbGUgKHRoaXMgc2V0cyBiaXRtYXAtPmNodW5rc2l6ZSkgKi8KIAllcnIgPSBiaXRtYXBfcmVhZF9zYihiaXRtYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKaW5kZXggNTU2YWNmZi4uN2RiZTY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYworKysgYi9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCkBAIC0xMzgsMTYgKzEzOCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRtX2V4Y2VwdGlvbl9zdG9yZV90eXBlX3VucmVnaXN0ZXIpOwogCi0vKgotICogUm91bmQgYSBudW1iZXIgdXAgdG8gdGhlIG5lYXJlc3QgJ3NpemUnIGJvdW5kYXJ5LiAgc2l6ZSBtdXN0Ci0gKiBiZSBhIHBvd2VyIG9mIDIuCi0gKi8KLXN0YXRpYyB1bG9uZyByb3VuZF91cCh1bG9uZyBuLCB1bG9uZyBzaXplKQotewotCXNpemUtLTsKLQlyZXR1cm4gKG4gKyBzaXplKSAmIH5zaXplOwotfQotCiBzdGF0aWMgaW50IHNldF9jaHVua19zaXplKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAogCQkJICBjb25zdCBjaGFyICpjaHVua19zaXplX2FyZywgY2hhciAqKmVycm9yKQogewpAQCAtMTU1LDcgKzE0NSw4IEBACiAJY2hhciAqdmFsdWU7CiAKIAljaHVua19zaXplX3Vsb25nID0gc2ltcGxlX3N0cnRvdWwoY2h1bmtfc2l6ZV9hcmcsICZ2YWx1ZSwgMTApOwotCWlmICgqY2h1bmtfc2l6ZV9hcmcgPT0gJ1wwJyB8fCAqdmFsdWUgIT0gJ1wwJykgeworCWlmICgqY2h1bmtfc2l6ZV9hcmcgPT0gJ1wwJyB8fCAqdmFsdWUgIT0gJ1wwJyB8fAorCSAgICBjaHVua19zaXplX3Vsb25nID4gVUlOVF9NQVgpIHsKIAkJKmVycm9yID0gIkludmFsaWQgY2h1bmsgc2l6ZSI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE2NSw0MCArMTU2LDM1IEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qCi0JICogQ2h1bmsgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZS4gIFNpbGVudGx5Ci0JICogcm91bmQgdXAgaWYgaXQncyBub3QuCi0JICovCi0JY2h1bmtfc2l6ZV91bG9uZyA9IHJvdW5kX3VwKGNodW5rX3NpemVfdWxvbmcsIFBBR0VfU0laRSA+PiA5KTsKLQotCXJldHVybiBkbV9leGNlcHRpb25fc3RvcmVfc2V0X2NodW5rX3NpemUoc3RvcmUsIGNodW5rX3NpemVfdWxvbmcsCisJcmV0dXJuIGRtX2V4Y2VwdGlvbl9zdG9yZV9zZXRfY2h1bmtfc2l6ZShzdG9yZSwKKwkJCQkJCSAodW5zaWduZWQpIGNodW5rX3NpemVfdWxvbmcsCiAJCQkJCQkgZXJyb3IpOwogfQogCiBpbnQgZG1fZXhjZXB0aW9uX3N0b3JlX3NldF9jaHVua19zaXplKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZV91bG9uZywKKwkJCQkgICAgICB1bnNpZ25lZCBjaHVua19zaXplLAogCQkJCSAgICAgIGNoYXIgKiplcnJvcikKIHsKIAkvKiBDaGVjayBjaHVua19zaXplIGlzIGEgcG93ZXIgb2YgMiAqLwotCWlmICghaXNfcG93ZXJfb2ZfMihjaHVua19zaXplX3Vsb25nKSkgeworCWlmICghaXNfcG93ZXJfb2ZfMihjaHVua19zaXplKSkgewogCQkqZXJyb3IgPSAiQ2h1bmsgc2l6ZSBpcyBub3QgYSBwb3dlciBvZiAyIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogVmFsaWRhdGUgdGhlIGNodW5rIHNpemUgYWdhaW5zdCB0aGUgZGV2aWNlIGJsb2NrIHNpemUgKi8KLQlpZiAoY2h1bmtfc2l6ZV91bG9uZyAlIChiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShzdG9yZS0+Y293LT5iZGV2KSA+PiA5KSkgeworCWlmIChjaHVua19zaXplICUgKGJkZXZfbG9naWNhbF9ibG9ja19zaXplKHN0b3JlLT5jb3ctPmJkZXYpID4+IDkpKSB7CiAJCSplcnJvciA9ICJDaHVuayBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIGRldmljZSBibG9ja3NpemUiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoY2h1bmtfc2l6ZV91bG9uZyA+IElOVF9NQVggPj4gU0VDVE9SX1NISUZUKSB7CisJaWYgKGNodW5rX3NpemUgPiBJTlRfTUFYID4+IFNFQ1RPUl9TSElGVCkgewogCQkqZXJyb3IgPSAiQ2h1bmsgc2l6ZSBpcyB0b28gaGlnaCI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXN0b3JlLT5jaHVua19zaXplID0gY2h1bmtfc2l6ZV91bG9uZzsKLQlzdG9yZS0+Y2h1bmtfbWFzayA9IGNodW5rX3NpemVfdWxvbmcgLSAxOwotCXN0b3JlLT5jaHVua19zaGlmdCA9IGZmcyhjaHVua19zaXplX3Vsb25nKSAtIDE7CisJc3RvcmUtPmNodW5rX3NpemUgPSBjaHVua19zaXplOworCXN0b3JlLT5jaHVua19tYXNrID0gY2h1bmtfc2l6ZSAtIDE7CisJc3RvcmUtPmNodW5rX3NoaWZ0ID0gZmZzKGNodW5rX3NpemUpIC0gMTsKIAogCXJldHVybiAwOwogfQpAQCAtMjUxLDcgKzIzNyw3IEBACiAKIAlyID0gc2V0X2NodW5rX3NpemUodG1wX3N0b3JlLCBhcmd2WzJdLCAmdGktPmVycm9yKTsKIAlpZiAocikKLQkJZ290byBiYWRfY293OworCQlnb3RvIGJhZF9jdHI7CiAKIAlyID0gdHlwZS0+Y3RyKHRtcF9zdG9yZSwgMCwgTlVMTCk7CiAJaWYgKHIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmggYi9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5oCmluZGV4IDgxMmM3MTguLjhhMjIzYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmgKKysrIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuaApAQCAtMTAxLDkgKzEwMSw5IEBACiAJc3RydWN0IGRtX2RldiAqY293OwogCiAJLyogU2l6ZSBvZiBkYXRhIGJsb2NrcyBzYXZlZCAtIG11c3QgYmUgYSBwb3dlciBvZiAyICovCi0JY2h1bmtfdCBjaHVua19zaXplOwotCWNodW5rX3QgY2h1bmtfbWFzazsKLQljaHVua190IGNodW5rX3NoaWZ0OworCXVuc2lnbmVkIGNodW5rX3NpemU7CisJdW5zaWduZWQgY2h1bmtfbWFzazsKKwl1bnNpZ25lZCBjaHVua19zaGlmdDsKIAogCXZvaWQgKmNvbnRleHQ7CiB9OwpAQCAtMTY5LDcgKzE2OSw3IEBACiBpbnQgZG1fZXhjZXB0aW9uX3N0b3JlX3R5cGVfdW5yZWdpc3RlcihzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlX3R5cGUgKnR5cGUpOwogCiBpbnQgZG1fZXhjZXB0aW9uX3N0b3JlX3NldF9jaHVua19zaXplKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZV91bG9uZywKKwkJCQkgICAgICB1bnNpZ25lZCBjaHVua19zaXplLAogCQkJCSAgICAgIGNoYXIgKiplcnJvcik7CiAKIGludCBkbV9leGNlcHRpb25fc3RvcmVfY3JlYXRlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jIGIvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYwppbmRleCA2NTJiZDMzLi43YWMyYzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS1iYXNlLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCX0KIAogCS8qIFRoZSBwdHIgdmFsdWUgaXMgc3VmZmljaWVudCBmb3IgbG9jYWwgdW5pcXVlIGlkICovCi0JbGMtPmx1aWQgPSAodWludDY0X3QpbGM7CisJbGMtPmx1aWQgPSAodW5zaWduZWQgbG9uZylsYzsKIAogCWxjLT50aSA9IHRpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtdHJhbnNmZXIuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCmluZGV4IGJhMGVkYWQuLjU0YWJmOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCkBAIC0xMjksMTEgKzEyOSwxMyBAQAogICogVGhpcyBpcyB0aGUgY29ubmVjdG9yIGNhbGxiYWNrIHRoYXQgZGVsaXZlcnMgZGF0YQogICogdGhhdCB3YXMgc2VudCBmcm9tIHVzZXJzcGFjZS4KICAqLwotc3RhdGljIHZvaWQgY25fdWxvZ19jYWxsYmFjayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgY25fdWxvZ19jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2csIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqbnNwKQogewotCXN0cnVjdCBjbl9tc2cgKm1zZyA9IChzdHJ1Y3QgY25fbXNnICopZGF0YTsKIAlzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0ICp0ZnIgPSAoc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCAqKShtc2cgKyAxKTsKIAorCWlmICghY2FwX3JhaXNlZChuc3AtPmVmZl9jYXAsIENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2soJnJlY2VpdmluZ19saXN0X2xvY2spOwogCWlmIChtc2ctPmxlbiA9PSAwKQogCQlmaWxsX3BrZyhtc2csIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMKaW5kZXggZDViMmUwOC4uMGM3NDY0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCkBAIC0yODQsMTIgKzI4NCwxMyBAQAogewogCWludCByOwogCXN0cnVjdCBkaXNrX2hlYWRlciAqZGg7Ci0JY2h1bmtfdCBjaHVua19zaXplOworCXVuc2lnbmVkIGNodW5rX3NpemU7CiAJaW50IGNodW5rX3NpemVfc3VwcGxpZWQgPSAxOwogCWNoYXIgKmNodW5rX2VycjsKIAogCS8qCi0JICogVXNlIGRlZmF1bHQgY2h1bmsgc2l6ZSAob3IgaGFyZHNlY3Rfc2l6ZSwgaWYgbGFyZ2VyKSBpZiBub25lIHN1cHBsaWVkCisJICogVXNlIGRlZmF1bHQgY2h1bmsgc2l6ZSAob3IgbG9naWNhbF9ibG9ja19zaXplLCBpZiBsYXJnZXIpCisJICogaWYgbm9uZSBzdXBwbGllZAogCSAqLwogCWlmICghcHMtPnN0b3JlLT5jaHVua19zaXplKSB7CiAJCXBzLT5zdG9yZS0+Y2h1bmtfc2l6ZSA9IG1heChETV9DSFVOS19TSVpFX0RFRkFVTFRfU0VDVE9SUywKQEAgLTMzNCwxMCArMzM1LDkgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoY2h1bmtfc2l6ZV9zdXBwbGllZCkKLQkJRE1XQVJOKCJjaHVuayBzaXplICVsbHUgaW4gZGV2aWNlIG1ldGFkYXRhIG92ZXJyaWRlcyAiCi0JCSAgICAgICAidGFibGUgY2h1bmsgc2l6ZSBvZiAlbGx1LiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNodW5rX3NpemUsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBzLT5zdG9yZS0+Y2h1bmtfc2l6ZSk7CisJCURNV0FSTigiY2h1bmsgc2l6ZSAldSBpbiBkZXZpY2UgbWV0YWRhdGEgb3ZlcnJpZGVzICIKKwkJICAgICAgICJ0YWJsZSBjaHVuayBzaXplIG9mICV1LiIsCisJCSAgICAgICBjaHVua19zaXplLCBwcy0+c3RvcmUtPmNodW5rX3NpemUpOwogCiAJLyogV2UgaGFkIGEgYm9ndXMgY2h1bmtfc2l6ZS4gRml4IHN0dWZmIHVwLiAqLwogCWZyZWVfYXJlYShwcyk7CkBAIC0zNDUsOCArMzQ1LDggQEAKIAlyID0gZG1fZXhjZXB0aW9uX3N0b3JlX3NldF9jaHVua19zaXplKHBzLT5zdG9yZSwgY2h1bmtfc2l6ZSwKIAkJCQkJICAgICAgJmNodW5rX2Vycik7CiAJaWYgKHIpIHsKLQkJRE1FUlIoImludmFsaWQgb24tZGlzayBjaHVuayBzaXplICVsbHU6ICVzLiIsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY2h1bmtfc2l6ZSwgY2h1bmtfZXJyKTsKKwkJRE1FUlIoImludmFsaWQgb24tZGlzayBjaHVuayBzaXplICV1OiAlcy4iLAorCQkgICAgICBjaHVua19zaXplLCBjaHVua19lcnIpOwogCQlyZXR1cm4gcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKaW5kZXggNTdmMWJmNy4uM2EzYmE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKQEAgLTI5Niw2ICsyOTYsNyBAQAogICovCiBzdGF0aWMgaW50IHJlZ2lzdGVyX3NuYXBzaG90KHN0cnVjdCBkbV9zbmFwc2hvdCAqc25hcCkKIHsKKwlzdHJ1Y3QgZG1fc25hcHNob3QgKmw7CiAJc3RydWN0IG9yaWdpbiAqbywgKm5ld19vOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBzbmFwLT5vcmlnaW4tPmJkZXY7CiAKQEAgLTMxOSw3ICszMjAsMTEgQEAKIAkJX19pbnNlcnRfb3JpZ2luKG8pOwogCX0KIAotCWxpc3RfYWRkX3RhaWwoJnNuYXAtPmxpc3QsICZvLT5zbmFwc2hvdHMpOworCS8qIFNvcnQgdGhlIGxpc3QgYWNjb3JkaW5nIHRvIGNodW5rIHNpemUsIGxhcmdlc3QtZmlyc3Qgc21hbGxlc3QtbGFzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkobCwgJm8tPnNuYXBzaG90cywgbGlzdCkKKwkJaWYgKGwtPnN0b3JlLT5jaHVua19zaXplIDwgc25hcC0+c3RvcmUtPmNodW5rX3NpemUpCisJCQlicmVhazsKKwlsaXN0X2FkZF90YWlsKCZzbmFwLT5saXN0LCAmbC0+bGlzdCk7CiAKIAl1cF93cml0ZSgmX29yaWdpbnNfbG9jayk7CiAJcmV0dXJuIDA7CkBAIC02NjgsNiArNjczLDExIEBACiAJYmlvX2xpc3RfaW5pdCgmcy0+cXVldWVkX2Jpb3MpOwogCUlOSVRfV09SSygmcy0+cXVldWVkX2Jpb3Nfd29yaywgZmx1c2hfcXVldWVkX2Jpb3MpOwogCisJaWYgKCFzLT5zdG9yZS0+Y2h1bmtfc2l6ZSkgeworCQl0aS0+ZXJyb3IgPSAiQ2h1bmsgc2l6ZSBub3Qgc2V0IjsKKwkJZ290byBiYWRfbG9hZF9hbmRfcmVnaXN0ZXI7CisJfQorCiAJLyogQWRkIHNuYXBzaG90IHRvIHRoZSBsaXN0IG9mIHNuYXBzaG90cyBmb3IgdGhpcyBvcmlnaW4gKi8KIAkvKiBFeGNlcHRpb25zIGFyZW4ndCB0cmlnZ2VyZWQgdGlsbCBzbmFwc2hvdF9yZXN1bWUoKSBpcyBjYWxsZWQgKi8KIAlpZiAocmVnaXN0ZXJfc25hcHNob3QocykpIHsKQEAgLTk1MSw3ICs5NjEsNyBAQAogCiAJc3JjLmJkZXYgPSBiZGV2OwogCXNyYy5zZWN0b3IgPSBjaHVua190b19zZWN0b3Iocy0+c3RvcmUsIHBlLT5lLm9sZF9jaHVuayk7Ci0Jc3JjLmNvdW50ID0gbWluKHMtPnN0b3JlLT5jaHVua19zaXplLCBkZXZfc2l6ZSAtIHNyYy5zZWN0b3IpOworCXNyYy5jb3VudCA9IG1pbigoc2VjdG9yX3Qpcy0+c3RvcmUtPmNodW5rX3NpemUsIGRldl9zaXplIC0gc3JjLnNlY3Rvcik7CiAKIAlkZXN0LmJkZXYgPSBzLT5zdG9yZS0+Y293LT5iZGV2OwogCWRlc3Quc2VjdG9yID0gY2h1bmtfdG9fc2VjdG9yKHMtPnN0b3JlLCBwZS0+ZS5uZXdfY2h1bmspOwpAQCAtMTE0Miw2ICsxMTUyLDggQEAKIAl1bnNpZ25lZCBzeiA9IDA7CiAJc3RydWN0IGRtX3NuYXBzaG90ICpzbmFwID0gdGktPnByaXZhdGU7CiAKKwlkb3duX3dyaXRlKCZzbmFwLT5sb2NrKTsKKwogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgU1RBVFVTVFlQRV9JTkZPOgogCQlpZiAoIXNuYXAtPnZhbGlkKQpAQCAtMTE3Myw2ICsxMTg1LDggQEAKIAkJYnJlYWs7CiAJfQogCisJdXBfd3JpdGUoJnNuYXAtPmxvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzODgsNyArMTQwMiw3IEBACiAJc3RydWN0IGRtX2RldiAqZGV2ID0gdGktPnByaXZhdGU7CiAJc3RydWN0IGRtX3NuYXBzaG90ICpzbmFwOwogCXN0cnVjdCBvcmlnaW4gKm87Ci0JY2h1bmtfdCBjaHVua19zaXplID0gMDsKKwl1bnNpZ25lZCBjaHVua19zaXplID0gMDsKIAogCWRvd25fcmVhZCgmX29yaWdpbnNfbG9jayk7CiAJbyA9IF9fbG9va3VwX29yaWdpbihkZXYtPmJkZXYpOwpAQCAtMTQ2NSw3ICsxNDc5LDcgQEAKIAlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZzbmFwc2hvdF90YXJnZXQpOwogCWlmIChyKSB7CiAJCURNRVJSKCJzbmFwc2hvdCB0YXJnZXQgcmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7Ci0JCXJldHVybiByOworCQlnb3RvIGJhZF9yZWdpc3Rlcl9zbmFwc2hvdF90YXJnZXQ7CiAJfQogCiAJciA9IGRtX3JlZ2lzdGVyX3RhcmdldCgmb3JpZ2luX3RhcmdldCk7CkBAIC0xNTIyLDYgKzE1MzYsOSBAQAogCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZvcmlnaW5fdGFyZ2V0KTsKIGJhZDE6CiAJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnNuYXBzaG90X3RhcmdldCk7CisKK2JhZF9yZWdpc3Rlcl9zbmFwc2hvdF90YXJnZXQ6CisJZG1fZXhjZXB0aW9uX3N0b3JlX2V4aXQoKTsKIAlyZXR1cm4gcjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IDM3NmYxYWIuLjcyNGVmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIAlhdG9taWNfdCBpb19jb3VudDsKIAlzdHJ1Y3QgYmlvICpiaW87CiAJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCXNwaW5sb2NrX3QgZW5kaW9fbG9jazsKIH07CiAKIC8qCkBAIC01NzgsOCArNTc5LDEyIEBACiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0gaW8tPm1kOwogCiAJLyogUHVzaC1iYWNrIHN1cGVyc2VkZXMgYW55IEkvTyBlcnJvcnMgKi8KLQlpZiAoZXJyb3IgJiYgIShpby0+ZXJyb3IgPiAwICYmIF9fbm9mbHVzaF9zdXNwZW5kaW5nKG1kKSkpCi0JCWlvLT5lcnJvciA9IGVycm9yOworCWlmICh1bmxpa2VseShlcnJvcikpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvLT5lbmRpb19sb2NrLCBmbGFncyk7CisJCWlmICghKGlvLT5lcnJvciA+IDAgJiYgX19ub2ZsdXNoX3N1c3BlbmRpbmcobWQpKSkKKwkJCWlvLT5lcnJvciA9IGVycm9yOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpby0+ZW5kaW9fbG9jaywgZmxhZ3MpOworCX0KIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpby0+aW9fY291bnQpKSB7CiAJCWlmIChpby0+ZXJyb3IgPT0gRE1fRU5ESU9fUkVRVUVVRSkgewpAQCAtMTIyNiw2ICsxMjMxLDcgQEAKIAlhdG9taWNfc2V0KCZjaS5pby0+aW9fY291bnQsIDEpOwogCWNpLmlvLT5iaW8gPSBiaW87CiAJY2kuaW8tPm1kID0gbWQ7CisJc3Bpbl9sb2NrX2luaXQoJmNpLmlvLT5lbmRpb19sb2NrKTsKIAljaS5zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKIAljaS5zZWN0b3JfY291bnQgPSBiaW9fc2VjdG9ycyhiaW8pOwogCWlmICh1bmxpa2VseShiaW9fZW1wdHlfYmFycmllcihiaW8pKSkKQEAgLTE4MjIsNiArMTgyOCw3IEBACiBiYWRfYmRldjoKIAlkZXN0cm95X3dvcmtxdWV1ZShtZC0+d3EpOwogYmFkX3RocmVhZDoKKwlkZWxfZ2VuZGlzayhtZC0+ZGlzayk7CiAJcHV0X2Rpc2sobWQtPmRpc2spOwogYmFkX2Rpc2s6CiAJYmxrX2NsZWFudXBfcXVldWUobWQtPnF1ZXVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbGluZWFyLmMgYi9kcml2ZXJzL21kL2xpbmVhci5jCmluZGV4IGVhNDg0MjkuLjFjZWNlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbGluZWFyLmMKKysrIGIvZHJpdmVycy9tZC9saW5lYXIuYwpAQCAtMTA4LDYgKzEwOCw5IEBACiAJbGluZWFyX2NvbmZfdCAqY29uZjsKIAlpbnQgaSwgcmV0ID0gMDsKIAorCWlmIChtZGRldl9jb25nZXN0ZWQobWRkZXYsIGJpdHMpKQorCQlyZXR1cm4gMTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAljb25mID0gcmN1X2RlcmVmZXJlbmNlKG1kZGV2LT5wcml2YXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDZhYTQ5N2UuLjEwZWIxZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTI2Miw2ICsyNjIsMTIgQEAKIAltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMCk7CiB9CiAKK2ludCBtZGRldl9jb25nZXN0ZWQobWRkZXZfdCAqbWRkZXYsIGludCBiaXRzKQoreworCXJldHVybiBtZGRldi0+c3VzcGVuZGVkOworfQorRVhQT1JUX1NZTUJPTChtZGRldl9jb25nZXN0ZWQpOworCiAKIHN0YXRpYyBpbmxpbmUgbWRkZXZfdCAqbWRkZXZfZ2V0KG1kZGV2X3QgKm1kZGV2KQogewpAQCAtMjYyNSw3ICsyNjMxLDcgQEAKIAkJCXJkZXYtPmRlc2NfbnIgPSBpKys7CiAJCQlyZGV2LT5yYWlkX2Rpc2sgPSByZGV2LT5kZXNjX25yOwogCQkJc2V0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpOwotCQl9IGVsc2UgaWYgKHJkZXYtPnJhaWRfZGlzayA+PSBtZGRldi0+cmFpZF9kaXNrcykgeworCQl9IGVsc2UgaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAobWRkZXYtPnJhaWRfZGlza3MgLSBtaW4oMCwgbWRkZXYtPmRlbHRhX2Rpc2tzKSkpIHsKIAkJCXJkZXYtPnJhaWRfZGlzayA9IC0xOwogCQkJY2xlYXJfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncyk7CiAJCX0KQEAgLTQyMTgsNyArNDIyNCw3IEBACiAJCQlzZXRfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpOwogCQkJbWRkZXYtPnN5bmNfdGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKG1kX2RvX3N5bmMsCiAJCQkJCQkJCW1kZGV2LAotCQkJCQkJCQkiJXNfcmVzeW5jIik7CisJCQkJCQkJCSJyZXN5bmMiKTsKIAkJCWlmICghbWRkZXYtPnN5bmNfdGhyZWFkKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IHN0YXJ0IHJlc3luYyIKIAkJCQkgICAgICAgIiB0aHJlYWQuLi5cbiIsCkBAIC00NTc1LDEwICs0NTgxLDEwIEBACiBzdGF0aWMgaW50IGdldF9hcnJheV9pbmZvKG1kZGV2X3QgKiBtZGRldiwgdm9pZCBfX3VzZXIgKiBhcmcpCiB7CiAJbWR1X2FycmF5X2luZm9fdCBpbmZvOwotCWludCBucix3b3JraW5nLGFjdGl2ZSxmYWlsZWQsc3BhcmU7CisJaW50IG5yLHdvcmtpbmcsaW5zeW5jLGZhaWxlZCxzcGFyZTsKIAltZGtfcmRldl90ICpyZGV2OwogCi0JbnI9d29ya2luZz1hY3RpdmU9ZmFpbGVkPXNwYXJlPTA7CisJbnI9d29ya2luZz1pbnN5bmM9ZmFpbGVkPXNwYXJlPTA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlucisrOwogCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQpAQCAtNDU4Niw3ICs0NTkyLDcgQEAKIAkJZWxzZSB7CiAJCQl3b3JraW5nKys7CiAJCQlpZiAodGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkKLQkJCQlhY3RpdmUrKzsJCisJCQkJaW5zeW5jKys7CQogCQkJZWxzZQogCQkJCXNwYXJlKys7CiAJCX0KQEAgLTQ2MTEsNyArNDYxNyw3IEBACiAJCWluZm8uc3RhdGUgPSAoMTw8TURfU0JfQ0xFQU4pOwogCWlmIChtZGRldi0+Yml0bWFwICYmIG1kZGV2LT5iaXRtYXBfb2Zmc2V0KQogCQlpbmZvLnN0YXRlID0gKDE8PE1EX1NCX0JJVE1BUF9QUkVTRU5UKTsKLQlpbmZvLmFjdGl2ZV9kaXNrcyAgPSBhY3RpdmU7CisJaW5mby5hY3RpdmVfZGlza3MgID0gaW5zeW5jOwogCWluZm8ud29ya2luZ19kaXNrcyA9IHdvcmtpbmc7CiAJaW5mby5mYWlsZWRfZGlza3MgID0gZmFpbGVkOwogCWluZm8uc3BhcmVfZGlza3MgICA9IHNwYXJlOwpAQCAtNDcyMSw3ICs0NzI3LDcgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZtZGRldi0+ZGlza3MpKSB7CiAJCQltZGtfcmRldl90ICpyZGV2MCA9IGxpc3RfZW50cnkobWRkZXYtPmRpc2tzLm5leHQsCiAJCQkJCQkJbWRrX3JkZXZfdCwgc2FtZV9zZXQpOwotCQkJaW50IGVyciA9IHN1cGVyX3R5cGVzW21kZGV2LT5tYWpvcl92ZXJzaW9uXQorCQkJZXJyID0gc3VwZXJfdHlwZXNbbWRkZXYtPm1ham9yX3ZlcnNpb25dCiAJCQkJLmxvYWRfc3VwZXIocmRldiwgcmRldjAsIG1kZGV2LT5taW5vcl92ZXJzaW9uKTsKIAkJCWlmIChlcnIgPCAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKQEAgLTU2MzEsNyArNTYzNywxMCBAQAogCXRocmVhZC0+cnVuID0gcnVuOwogCXRocmVhZC0+bWRkZXYgPSBtZGRldjsKIAl0aHJlYWQtPnRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKLQl0aHJlYWQtPnRzayA9IGt0aHJlYWRfcnVuKG1kX3RocmVhZCwgdGhyZWFkLCBuYW1lLCBtZG5hbWUodGhyZWFkLT5tZGRldikpOworCXRocmVhZC0+dHNrID0ga3RocmVhZF9ydW4obWRfdGhyZWFkLCB0aHJlYWQsCisJCQkJICAiJXNfJXMiLAorCQkJCSAgbWRuYW1lKHRocmVhZC0+bWRkZXYpLAorCQkJCSAgbmFtZSA/OiBtZGRldi0+cGVycy0+bmFtZSk7CiAJaWYgKElTX0VSUih0aHJlYWQtPnRzaykpIHsKIAkJa2ZyZWUodGhyZWFkKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC02NzQ1LDcgKzY3NTQsNyBAQAogCQkJfQogCQkJbWRkZXYtPnN5bmNfdGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKG1kX2RvX3N5bmMsCiAJCQkJCQkJCW1kZGV2LAotCQkJCQkJCQkiJXNfcmVzeW5jIik7CisJCQkJCQkJCSJyZXN5bmMiKTsKIAkJCWlmICghbWRkZXYtPnN5bmNfdGhyZWFkKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IHN0YXJ0IHJlc3luYyIKIAkJCQkJIiB0aHJlYWQuLi5cbiIsIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5oIGIvZHJpdmVycy9tZC9tZC5oCmluZGV4IGY1NWQyZmYuLmYxODRiNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuaAorKysgYi9kcml2ZXJzL21kL21kLmgKQEAgLTQzMCw2ICs0MzAsNyBAQAogZXh0ZXJuIHZvaWQgbWRfZG9uZV9zeW5jKG1kZGV2X3QgKm1kZGV2LCBpbnQgYmxvY2tzLCBpbnQgb2spOwogZXh0ZXJuIHZvaWQgbWRfZXJyb3IobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpOwogCitleHRlcm4gaW50IG1kZGV2X2Nvbmdlc3RlZChtZGRldl90ICptZGRldiwgaW50IGJpdHMpOwogZXh0ZXJuIHZvaWQgbWRfc3VwZXJfd3JpdGUobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYsCiAJCQkgICBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBleHRlcm4gdm9pZCBtZF9zdXBlcl93YWl0KG1kZGV2X3QgKm1kZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCmluZGV4IGQyZDNmZDUuLmVlNzY0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKKysrIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwpAQCAtMTUwLDcgKzE1MCw2IEBACiAJfQogCiAJbXBfYmggPSBtZW1wb29sX2FsbG9jKGNvbmYtPnBvb2wsIEdGUF9OT0lPKTsKLQltZW1zZXQobXBfYmgsIDAsIHNpemVvZigqbXBfYmgpKTsKIAogCW1wX2JoLT5tYXN0ZXJfYmlvID0gYmlvOwogCW1wX2JoLT5tZGRldiA9IG1kZGV2OwpAQCAtMTk5LDYgKzE5OCw5IEBACiAJbXVsdGlwYXRoX2NvbmZfdCAqY29uZiA9IG1kZGV2LT5wcml2YXRlOwogCWludCBpLCByZXQgPSAwOwogCisJaWYgKG1kZGV2X2Nvbmdlc3RlZChtZGRldiwgYml0cykpCisJCXJldHVybiAxOworCiAJcmN1X3JlYWRfbG9jaygpOwogCWZvciAoaSA9IDA7IGkgPCBtZGRldi0+cmFpZF9kaXNrcyA7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPm11bHRpcGF0aHNbaV0ucmRldik7CkBAIC01MDQsNyArNTA2LDcgQEAKIAl9CiAKIAl7Ci0JCW1kZGV2LT50aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQobXVsdGlwYXRoZCwgbWRkZXYsICIlc19tdWx0aXBhdGgiKTsKKwkJbWRkZXYtPnRocmVhZCA9IG1kX3JlZ2lzdGVyX3RocmVhZChtdWx0aXBhdGhkLCBtZGRldiwgTlVMTCk7CiAJCWlmICghbWRkZXYtPnRocmVhZCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJtdWx0aXBhdGg6IGNvdWxkbid0IGFsbG9jYXRlIHRocmVhZCIKIAkJCQkiIGZvciAlc1xuIiwgbWRuYW1lKG1kZGV2KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQwLmMgYi9kcml2ZXJzL21kL3JhaWQwLmMKaW5kZXggZjg0NWVkOS4uZDNhNGNlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDAuYwpAQCAtNDQsNiArNDQsOSBAQAogCW1ka19yZGV2X3QgKipkZXZsaXN0ID0gY29uZi0+ZGV2bGlzdDsKIAlpbnQgaSwgcmV0ID0gMDsKIAorCWlmIChtZGRldl9jb25nZXN0ZWQobWRkZXYsIGJpdHMpKQorCQlyZXR1cm4gMTsKKwogCWZvciAoaSA9IDA7IGkgPCBtZGRldi0+cmFpZF9kaXNrcyAmJiAhcmV0IDsgaSsrKSB7CiAJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGV2bGlzdFtpXS0+YmRldik7CiAKQEAgLTg2LDcgKzg5LDcgQEAKIAogc3RhdGljIGludCBjcmVhdGVfc3RyaXBfem9uZXMobWRkZXZfdCAqbWRkZXYpCiB7Ci0JaW50IGksIGMsIGosIGVycjsKKwlpbnQgaSwgYywgZXJyOwogCXNlY3Rvcl90IGN1cnJfem9uZV9lbmQsIHNlY3RvcnM7CiAJbWRrX3JkZXZfdCAqc21hbGxlc3QsICpyZGV2MSwgKnJkZXYyLCAqcmRldiwgKipkZXY7CiAJc3RydWN0IHN0cmlwX3pvbmUgKnpvbmU7CkBAIC0xOTgsNiArMjAxLDggQEAKIAkvKiBub3cgZG8gdGhlIG90aGVyIHpvbmVzICovCiAJZm9yIChpID0gMTsgaSA8IGNvbmYtPm5yX3N0cmlwX3pvbmVzOyBpKyspCiAJeworCQlpbnQgajsKKwogCQl6b25lID0gY29uZi0+c3RyaXBfem9uZSArIGk7CiAJCWRldiA9IGNvbmYtPmRldmxpc3QgKyBpICogbWRkZXYtPnJhaWRfZGlza3M7CiAKQEAgLTIwNyw3ICsyMTIsNiBAQAogCQljID0gMDsKIAogCQlmb3IgKGo9MDsgajxjbnQ7IGorKykgewotCQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQkJcmRldiA9IGNvbmYtPmRldmxpc3Rbal07CiAJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogY2hlY2tpbmcgJXMgLi4uIiwKIAkJCQliZGV2bmFtZShyZGV2LT5iZGV2LCBiKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggZmY3ZWQzMy4uYTA1MzQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtNjQsNyArNjQsNyBAQAogCiAJLyogYWxsb2NhdGUgYSByMWJpbyB3aXRoIHJvb20gZm9yIHJhaWRfZGlza3MgZW50cmllcyBpbiB0aGUgYmlvcyBhcnJheSAqLwogCXIxX2JpbyA9IGt6YWxsb2Moc2l6ZSwgZ2ZwX2ZsYWdzKTsKLQlpZiAoIXIxX2JpbykKKwlpZiAoIXIxX2JpbyAmJiBwaS0+bWRkZXYpCiAJCXVucGx1Z19zbGF2ZXMocGktPm1kZGV2KTsKIAogCXJldHVybiByMV9iaW87CkBAIC01NzYsNiArNTc2LDkgQEAKIAljb25mX3QgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlpbnQgaSwgcmV0ID0gMDsKIAorCWlmIChtZGRldl9jb25nZXN0ZWQobWRkZXYsIGJpdHMpKQorCQlyZXR1cm4gMTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGkgPSAwOyBpIDwgbWRkZXYtPnJhaWRfZGlza3M7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPm1pcnJvcnNbaV0ucmRldik7CkBAIC04NTEsNyArODU0LDcgQEAKIAkJcmVhZF9iaW8tPmJpX3NlY3RvciA9IHIxX2Jpby0+c2VjdG9yICsgbWlycm9yLT5yZGV2LT5kYXRhX29mZnNldDsKIAkJcmVhZF9iaW8tPmJpX2JkZXYgPSBtaXJyb3ItPnJkZXYtPmJkZXY7CiAJCXJlYWRfYmlvLT5iaV9lbmRfaW8gPSByYWlkMV9lbmRfcmVhZF9yZXF1ZXN0OwotCQlyZWFkX2Jpby0+YmlfcncgPSBSRUFEIHwgZG9fc3luYzsKKwkJcmVhZF9iaW8tPmJpX3J3ID0gUkVBRCB8IChkb19zeW5jIDw8IEJJT19SV19TWU5DSU8pOwogCQlyZWFkX2Jpby0+YmlfcHJpdmF0ZSA9IHIxX2JpbzsKIAogCQlnZW5lcmljX21ha2VfcmVxdWVzdChyZWFkX2Jpbyk7CkBAIC05NDMsNyArOTQ2LDggQEAKIAkJbWJpby0+Ymlfc2VjdG9yCT0gcjFfYmlvLT5zZWN0b3IgKyBjb25mLT5taXJyb3JzW2ldLnJkZXYtPmRhdGFfb2Zmc2V0OwogCQltYmlvLT5iaV9iZGV2ID0gY29uZi0+bWlycm9yc1tpXS5yZGV2LT5iZGV2OwogCQltYmlvLT5iaV9lbmRfaW8JPSByYWlkMV9lbmRfd3JpdGVfcmVxdWVzdDsKLQkJbWJpby0+YmlfcncgPSBXUklURSB8IGRvX2JhcnJpZXJzIHwgZG9fc3luYzsKKwkJbWJpby0+YmlfcncgPSBXUklURSB8IChkb19iYXJyaWVycyA8PCBCSU9fUldfQkFSUklFUikgfAorCQkJKGRvX3N5bmMgPDwgQklPX1JXX1NZTkNJTyk7CiAJCW1iaW8tPmJpX3ByaXZhdGUgPSByMV9iaW87CiAKIAkJaWYgKGJlaGluZF9wYWdlcykgewpAQCAtMTYyMyw3ICsxNjI3LDggQEAKIAkJCQkJCWNvbmYtPm1pcnJvcnNbaV0ucmRldi0+ZGF0YV9vZmZzZXQ7CiAJCQkJCWJpby0+YmlfYmRldiA9IGNvbmYtPm1pcnJvcnNbaV0ucmRldi0+YmRldjsKIAkJCQkJYmlvLT5iaV9lbmRfaW8gPSByYWlkMV9lbmRfd3JpdGVfcmVxdWVzdDsKLQkJCQkJYmlvLT5iaV9ydyA9IFdSSVRFIHwgZG9fc3luYzsKKwkJCQkJYmlvLT5iaV9ydyA9IFdSSVRFIHwKKwkJCQkJCShkb19zeW5jIDw8IEJJT19SV19TWU5DSU8pOwogCQkJCQliaW8tPmJpX3ByaXZhdGUgPSByMV9iaW87CiAJCQkJCXIxX2Jpby0+Ymlvc1tpXSA9IGJpbzsKIAkJCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKQEAgLTE2NzIsMTIgKzE2NzcsMTMgQEAKIAkJCQliaW8tPmJpX3NlY3RvciA9IHIxX2Jpby0+c2VjdG9yICsgcmRldi0+ZGF0YV9vZmZzZXQ7CiAJCQkJYmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKIAkJCQliaW8tPmJpX2VuZF9pbyA9IHJhaWQxX2VuZF9yZWFkX3JlcXVlc3Q7Ci0JCQkJYmlvLT5iaV9ydyA9IFJFQUQgfCBkb19zeW5jOworCQkJCWJpby0+YmlfcncgPSBSRUFEIHwgKGRvX3N5bmMgPDwgQklPX1JXX1NZTkNJTyk7CiAJCQkJYmlvLT5iaV9wcml2YXRlID0gcjFfYmlvOwogCQkJCXVucGx1ZyA9IDE7CiAJCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKIAkJCX0KIAkJfQorCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJaWYgKHVucGx1ZykKIAkJdW5wbHVnX3NsYXZlcyhtZGRldik7CkBAIC0xOTczLDEzICsxOTc5LDE0IEBACiAJY29uZi0+cG9vbGluZm8gPSBrbWFsbG9jKHNpemVvZigqY29uZi0+cG9vbGluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbmYtPnBvb2xpbmZvKQogCQlnb3RvIG91dF9ub19tZW07Ci0JY29uZi0+cG9vbGluZm8tPm1kZGV2ID0gbWRkZXY7CisJY29uZi0+cG9vbGluZm8tPm1kZGV2ID0gTlVMTDsKIAljb25mLT5wb29saW5mby0+cmFpZF9kaXNrcyA9IG1kZGV2LT5yYWlkX2Rpc2tzOwogCWNvbmYtPnIxYmlvX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZShOUl9SQUlEMV9CSU9TLCByMWJpb19wb29sX2FsbG9jLAogCQkJCQkgIHIxYmlvX3Bvb2xfZnJlZSwKIAkJCQkJICBjb25mLT5wb29saW5mbyk7CiAJaWYgKCFjb25mLT5yMWJpb19wb29sKQogCQlnb3RvIG91dF9ub19tZW07CisJY29uZi0+cG9vbGluZm8tPm1kZGV2ID0gbWRkZXY7CiAKIAlzcGluX2xvY2tfaW5pdCgmY29uZi0+ZGV2aWNlX2xvY2spOwogCW1kZGV2LT5xdWV1ZS0+cXVldWVfbG9jayA9ICZjb25mLT5kZXZpY2VfbG9jazsKQEAgLTIwNDcsNyArMjA1NCw3IEBACiAJY29uZi0+bGFzdF91c2VkID0gajsKIAogCi0JbWRkZXYtPnRocmVhZCA9IG1kX3JlZ2lzdGVyX3RocmVhZChyYWlkMWQsIG1kZGV2LCAiJXNfcmFpZDEiKTsKKwltZGRldi0+dGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKHJhaWQxZCwgbWRkZXYsIE5VTEwpOwogCWlmICghbWRkZXYtPnRocmVhZCkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJyYWlkMTogY291bGRuJ3QgYWxsb2NhdGUgdGhyZWFkIGZvciAlc1xuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IGQwYTIxNTIuLmMyY2I3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtNjgsNyArNjgsNyBAQAogCiAJLyogYWxsb2NhdGUgYSByMTBiaW8gd2l0aCByb29tIGZvciByYWlkX2Rpc2tzIGVudHJpZXMgaW4gdGhlIGJpb3MgYXJyYXkgKi8KIAlyMTBfYmlvID0ga3phbGxvYyhzaXplLCBnZnBfZmxhZ3MpOwotCWlmICghcjEwX2JpbykKKwlpZiAoIXIxMF9iaW8gJiYgY29uZi0+bWRkZXYpCiAJCXVucGx1Z19zbGF2ZXMoY29uZi0+bWRkZXYpOwogCiAJcmV0dXJuIHIxMF9iaW87CkBAIC02MzEsNiArNjMxLDggQEAKIAljb25mX3QgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlpbnQgaSwgcmV0ID0gMDsKIAorCWlmIChtZGRldl9jb25nZXN0ZWQobWRkZXYsIGJpdHMpKQorCQlyZXR1cm4gMTsKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yIChpID0gMDsgaSA8IG1kZGV2LT5yYWlkX2Rpc2tzICYmIHJldCA9PSAwOyBpKyspIHsKIAkJbWRrX3JkZXZfdCAqcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5taXJyb3JzW2ldLnJkZXYpOwpAQCAtODgyLDcgKzg4NCw3IEBACiAJCQltaXJyb3ItPnJkZXYtPmRhdGFfb2Zmc2V0OwogCQlyZWFkX2Jpby0+YmlfYmRldiA9IG1pcnJvci0+cmRldi0+YmRldjsKIAkJcmVhZF9iaW8tPmJpX2VuZF9pbyA9IHJhaWQxMF9lbmRfcmVhZF9yZXF1ZXN0OwotCQlyZWFkX2Jpby0+YmlfcncgPSBSRUFEIHwgZG9fc3luYzsKKwkJcmVhZF9iaW8tPmJpX3J3ID0gUkVBRCB8IChkb19zeW5jIDw8IEJJT19SV19TWU5DSU8pOwogCQlyZWFkX2Jpby0+YmlfcHJpdmF0ZSA9IHIxMF9iaW87CiAKIAkJZ2VuZXJpY19tYWtlX3JlcXVlc3QocmVhZF9iaW8pOwpAQCAtOTUwLDcgKzk1Miw3IEBACiAJCQljb25mLT5taXJyb3JzW2RdLnJkZXYtPmRhdGFfb2Zmc2V0OwogCQltYmlvLT5iaV9iZGV2ID0gY29uZi0+bWlycm9yc1tkXS5yZGV2LT5iZGV2OwogCQltYmlvLT5iaV9lbmRfaW8JPSByYWlkMTBfZW5kX3dyaXRlX3JlcXVlc3Q7Ci0JCW1iaW8tPmJpX3J3ID0gV1JJVEUgfCBkb19zeW5jOworCQltYmlvLT5iaV9ydyA9IFdSSVRFIHwgKGRvX3N5bmMgPDwgQklPX1JXX1NZTkNJTyk7CiAJCW1iaW8tPmJpX3ByaXZhdGUgPSByMTBfYmlvOwogCiAJCWF0b21pY19pbmMoJnIxMF9iaW8tPnJlbWFpbmluZyk7CkBAIC0xNjIzLDEzICsxNjI1LDE0IEBACiAJCQkJYmlvLT5iaV9zZWN0b3IgPSByMTBfYmlvLT5kZXZzW3IxMF9iaW8tPnJlYWRfc2xvdF0uYWRkcgogCQkJCQkrIHJkZXYtPmRhdGFfb2Zmc2V0OwogCQkJCWJpby0+YmlfYmRldiA9IHJkZXYtPmJkZXY7Ci0JCQkJYmlvLT5iaV9ydyA9IFJFQUQgfCBkb19zeW5jOworCQkJCWJpby0+YmlfcncgPSBSRUFEIHwgKGRvX3N5bmMgPDwgQklPX1JXX1NZTkNJTyk7CiAJCQkJYmlvLT5iaV9wcml2YXRlID0gcjEwX2JpbzsKIAkJCQliaW8tPmJpX2VuZF9pbyA9IHJhaWQxMF9lbmRfcmVhZF9yZXF1ZXN0OwogCQkJCXVucGx1ZyA9IDE7CiAJCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKIAkJCX0KIAkJfQorCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJaWYgKHVucGx1ZykKIAkJdW5wbHVnX3NsYXZlcyhtZGRldik7CkBAIC0xNzczLDcgKzE3NzYsNyBAQAogCW1heF9zeW5jID0gUkVTWU5DX1BBR0VTIDw8IChQQUdFX1NISUZULTkpOwogCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfU1lOQywgJm1kZGV2LT5yZWNvdmVyeSkpIHsKIAkJLyogcmVjb3ZlcnkuLi4gdGhlIGNvbXBsaWNhdGVkIG9uZSAqLwotCQlpbnQgaSwgaiwgazsKKwkJaW50IGosIGs7CiAJCXIxMF9iaW8gPSBOVUxMOwogCiAJCWZvciAoaT0wIDsgaTxjb25mLT5yYWlkX2Rpc2tzOyBpKyspCkBAIC0yMDkzLDcgKzIwOTYsNiBAQAogCWlmICghY29uZi0+dG1wcGFnZSkKIAkJZ290byBvdXRfZnJlZV9jb25mOwogCi0JY29uZi0+bWRkZXYgPSBtZGRldjsKIAljb25mLT5yYWlkX2Rpc2tzID0gbWRkZXYtPnJhaWRfZGlza3M7CiAJY29uZi0+bmVhcl9jb3BpZXMgPSBuYzsKIAljb25mLT5mYXJfY29waWVzID0gZmM7CkBAIC0yMTMwLDYgKzIxMzIsNyBAQAogCQlnb3RvIG91dF9mcmVlX2NvbmY7CiAJfQogCisJY29uZi0+bWRkZXYgPSBtZGRldjsKIAlzcGluX2xvY2tfaW5pdCgmY29uZi0+ZGV2aWNlX2xvY2spOwogCW1kZGV2LT5xdWV1ZS0+cXVldWVfbG9jayA9ICZjb25mLT5kZXZpY2VfbG9jazsKIApAQCAtMjE4OCw3ICsyMTkxLDcgQEAKIAl9CiAKIAotCW1kZGV2LT50aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQocmFpZDEwZCwgbWRkZXYsICIlc19yYWlkMTAiKTsKKwltZGRldi0+dGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKHJhaWQxMGQsIG1kZGV2LCBOVUxMKTsKIAlpZiAoIW1kZGV2LT50aHJlYWQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAicmFpZDEwOiBjb3VsZG4ndCBhbGxvY2F0ZSB0aHJlYWQgZm9yICVzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5jIGIvZHJpdmVycy9tZC9yYWlkNS5jCmluZGV4IDgyNmViMzQuLjgxYWJlZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LmMKQEAgLTQ3LDcgKzQ3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jX3R4Lmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgIm1kLmgiCiAjaW5jbHVkZSAicmFpZDUuaCIKICNpbmNsdWRlICJiaXRtYXAuaCIKQEAgLTE1NCwxMyArMTU2LDE2IEBACiBzdGF0aWMgaW50IHJhaWQ2X2lkeF90b19zbG90KGludCBpZHgsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsCiAJCQkgICAgIGludCAqY291bnQsIGludCBzeW5kcm9tZV9kaXNrcykKIHsKLQlpbnQgc2xvdDsKKwlpbnQgc2xvdCA9ICpjb3VudDsKIAorCWlmIChzaC0+ZGRmX2xheW91dCkKKwkJKCpjb3VudCkrKzsKIAlpZiAoaWR4ID09IHNoLT5wZF9pZHgpCiAJCXJldHVybiBzeW5kcm9tZV9kaXNrczsKIAlpZiAoaWR4ID09IHNoLT5xZF9pZHgpCiAJCXJldHVybiBzeW5kcm9tZV9kaXNrcyArIDE7Ci0Jc2xvdCA9ICgqY291bnQpKys7CisJaWYgKCFzaC0+ZGRmX2xheW91dCkKKwkJKCpjb3VudCkrKzsKIAlyZXR1cm4gc2xvdDsKIH0KIApAQCAtNDk5LDExICs1MDQsMTggQEAKIAlzdHJ1Y3QgcGFnZSAqYmlvX3BhZ2U7CiAJaW50IGk7CiAJaW50IHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBhc3luY19zdWJtaXRfY3RsIHN1Ym1pdDsKKwllbnVtIGFzeW5jX3R4X2ZsYWdzIGZsYWdzID0gMDsKIAogCWlmIChiaW8tPmJpX3NlY3RvciA+PSBzZWN0b3IpCiAJCXBhZ2Vfb2Zmc2V0ID0gKHNpZ25lZCkoYmlvLT5iaV9zZWN0b3IgLSBzZWN0b3IpICogNTEyOwogCWVsc2UKIAkJcGFnZV9vZmZzZXQgPSAoc2lnbmVkKShzZWN0b3IgLSBiaW8tPmJpX3NlY3RvcikgKiAtNTEyOworCisJaWYgKGZyb21iaW8pCisJCWZsYWdzIHw9IEFTWU5DX1RYX0ZFTkNFOworCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIGZsYWdzLCB0eCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKIAliaW9fZm9yX2VhY2hfc2VnbWVudChidmwsIGJpbywgaSkgewogCQlpbnQgbGVuID0gYmlvX2lvdmVjX2lkeChiaW8sIGkpLT5idl9sZW47CiAJCWludCBjbGVuOwpAQCAtNTI1LDE1ICs1MzcsMTQgQEAKIAkJCWJpb19wYWdlID0gYmlvX2lvdmVjX2lkeChiaW8sIGkpLT5idl9wYWdlOwogCQkJaWYgKGZyb21iaW8pCiAJCQkJdHggPSBhc3luY19tZW1jcHkocGFnZSwgYmlvX3BhZ2UsIHBhZ2Vfb2Zmc2V0LAotCQkJCQliX29mZnNldCwgY2xlbiwKLQkJCQkJQVNZTkNfVFhfREVQX0FDSywKLQkJCQkJdHgsIE5VTEwsIE5VTEwpOworCQkJCQkJICBiX29mZnNldCwgY2xlbiwgJnN1Ym1pdCk7CiAJCQllbHNlCiAJCQkJdHggPSBhc3luY19tZW1jcHkoYmlvX3BhZ2UsIHBhZ2UsIGJfb2Zmc2V0LAotCQkJCQlwYWdlX29mZnNldCwgY2xlbiwKLQkJCQkJQVNZTkNfVFhfREVQX0FDSywKLQkJCQkJdHgsIE5VTEwsIE5VTEwpOworCQkJCQkJICBwYWdlX29mZnNldCwgY2xlbiwgJnN1Ym1pdCk7CiAJCX0KKwkJLyogY2hhaW4gdGhlIG9wZXJhdGlvbnMgKi8KKwkJc3VibWl0LmRlcGVuZF90eCA9IHR4OworCiAJCWlmIChjbGVuIDwgbGVuKSAvKiBoaXQgZW5kIG9mIHBhZ2UgKi8KIAkJCWJyZWFrOwogCQlwYWdlX29mZnNldCArPSAgbGVuOwpAQCAtNTkyLDYgKzYwMyw3IEBACiB7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9IE5VTEw7CiAJcmFpZDVfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKKwlzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCBzdWJtaXQ7CiAJaW50IGk7CiAKIAlwcl9kZWJ1ZygiJXM6IHN0cmlwZSAlbGx1XG4iLCBfX2Z1bmNfXywKQEAgLTYxNSwyMiArNjI3LDM0IEBACiAJfQogCiAJYXRvbWljX2luYygmc2gtPmNvdW50KTsKLQlhc3luY190cmlnZ2VyX2NhbGxiYWNrKEFTWU5DX1RYX0RFUF9BQ0sgfCBBU1lOQ19UWF9BQ0ssIHR4LAotCQlvcHNfY29tcGxldGVfYmlvZmlsbCwgc2gpOworCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIEFTWU5DX1RYX0FDSywgdHgsIG9wc19jb21wbGV0ZV9iaW9maWxsLCBzaCwgTlVMTCk7CisJYXN5bmNfdHJpZ2dlcl9jYWxsYmFjaygmc3VibWl0KTsKIH0KIAotc3RhdGljIHZvaWQgb3BzX2NvbXBsZXRlX2NvbXB1dGU1KHZvaWQgKnN0cmlwZV9oZWFkX3JlZikKK3N0YXRpYyB2b2lkIG1hcmtfdGFyZ2V0X3VwdG9kYXRlKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCB0YXJnZXQpCit7CisJc3RydWN0IHI1ZGV2ICp0Z3Q7CisKKwlpZiAodGFyZ2V0IDwgMCkKKwkJcmV0dXJuOworCisJdGd0ID0gJnNoLT5kZXZbdGFyZ2V0XTsKKwlzZXRfYml0KFI1X1VQVE9EQVRFLCAmdGd0LT5mbGFncyk7CisJQlVHX09OKCF0ZXN0X2JpdChSNV9XYW50Y29tcHV0ZSwgJnRndC0+ZmxhZ3MpKTsKKwljbGVhcl9iaXQoUjVfV2FudGNvbXB1dGUsICZ0Z3QtPmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgb3BzX2NvbXBsZXRlX2NvbXB1dGUodm9pZCAqc3RyaXBlX2hlYWRfcmVmKQogewogCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2ggPSBzdHJpcGVfaGVhZF9yZWY7Ci0JaW50IHRhcmdldCA9IHNoLT5vcHMudGFyZ2V0OwotCXN0cnVjdCByNWRldiAqdGd0ID0gJnNoLT5kZXZbdGFyZ2V0XTsKIAogCXByX2RlYnVnKCIlczogc3RyaXBlICVsbHVcbiIsIF9fZnVuY19fLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwogCi0Jc2V0X2JpdChSNV9VUFRPREFURSwgJnRndC0+ZmxhZ3MpOwotCUJVR19PTighdGVzdF9iaXQoUjVfV2FudGNvbXB1dGUsICZ0Z3QtPmZsYWdzKSk7Ci0JY2xlYXJfYml0KFI1X1dhbnRjb21wdXRlLCAmdGd0LT5mbGFncyk7CisJLyogbWFyayB0aGUgY29tcHV0ZWQgdGFyZ2V0KHMpIGFzIHVwdG9kYXRlICovCisJbWFya190YXJnZXRfdXB0b2RhdGUoc2gsIHNoLT5vcHMudGFyZ2V0KTsKKwltYXJrX3RhcmdldF91cHRvZGF0ZShzaCwgc2gtPm9wcy50YXJnZXQyKTsKKwogCWNsZWFyX2JpdChTVFJJUEVfQ09NUFVURV9SVU4sICZzaC0+c3RhdGUpOwogCWlmIChzaC0+Y2hlY2tfc3RhdGUgPT0gY2hlY2tfc3RhdGVfY29tcHV0ZV9ydW4pCiAJCXNoLT5jaGVja19zdGF0ZSA9IGNoZWNrX3N0YXRlX2NvbXB1dGVfcmVzdWx0OwpAQCAtNjM4LDE2ICs2NjIsMjQgQEAKIAlyZWxlYXNlX3N0cmlwZShzaCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKm9wc19ydW5fY29tcHV0ZTUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKKy8qIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3MgY29udmVyc2lvbiByZWdpb24gb2YgdGhlIHNjcmliYmxlIGJ1ZmZlciAqLworc3RhdGljIGFkZHJfY29udl90ICp0b19hZGRyX2NvbnYoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwKKwkJCQkgc3RydWN0IHJhaWQ1X3BlcmNwdSAqcGVyY3B1KQogewotCS8qIGtlcm5lbCBzdGFjayBzaXplIGxpbWl0cyB0aGUgdG90YWwgbnVtYmVyIG9mIGRpc2tzICovCisJcmV0dXJuIHBlcmNwdS0+c2NyaWJibGUgKyBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiAoc2gtPmRpc2tzICsgMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorb3BzX3J1bl9jb21wdXRlNShzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzdHJ1Y3QgcmFpZDVfcGVyY3B1ICpwZXJjcHUpCit7CiAJaW50IGRpc2tzID0gc2gtPmRpc2tzOwotCXN0cnVjdCBwYWdlICp4b3Jfc3Jjc1tkaXNrc107CisJc3RydWN0IHBhZ2UgKip4b3Jfc3JjcyA9IHBlcmNwdS0+c2NyaWJibGU7CiAJaW50IHRhcmdldCA9IHNoLT5vcHMudGFyZ2V0OwogCXN0cnVjdCByNWRldiAqdGd0ID0gJnNoLT5kZXZbdGFyZ2V0XTsKIAlzdHJ1Y3QgcGFnZSAqeG9yX2Rlc3QgPSB0Z3QtPnBhZ2U7CiAJaW50IGNvdW50ID0gMDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4OworCXN0cnVjdCBhc3luY19zdWJtaXRfY3RsIHN1Ym1pdDsKIAlpbnQgaTsKIAogCXByX2RlYnVnKCIlczogc3RyaXBlICVsbHUgYmxvY2s6ICVkXG4iLApAQCAtNjYwLDE3ICs2OTIsMjEzIEBACiAKIAlhdG9taWNfaW5jKCZzaC0+Y291bnQpOwogCisJaW5pdF9hc3luY19zdWJtaXQoJnN1Ym1pdCwgQVNZTkNfVFhfRkVOQ0V8QVNZTkNfVFhfWE9SX1pFUk9fRFNULCBOVUxMLAorCQkJICBvcHNfY29tcGxldGVfY29tcHV0ZSwgc2gsIHRvX2FkZHJfY29udihzaCwgcGVyY3B1KSk7CiAJaWYgKHVubGlrZWx5KGNvdW50ID09IDEpKQotCQl0eCA9IGFzeW5jX21lbWNweSh4b3JfZGVzdCwgeG9yX3NyY3NbMF0sIDAsIDAsIFNUUklQRV9TSVpFLAotCQkJMCwgTlVMTCwgb3BzX2NvbXBsZXRlX2NvbXB1dGU1LCBzaCk7CisJCXR4ID0gYXN5bmNfbWVtY3B5KHhvcl9kZXN0LCB4b3Jfc3Jjc1swXSwgMCwgMCwgU1RSSVBFX1NJWkUsICZzdWJtaXQpOwogCWVsc2UKLQkJdHggPSBhc3luY194b3IoeG9yX2Rlc3QsIHhvcl9zcmNzLCAwLCBjb3VudCwgU1RSSVBFX1NJWkUsCi0JCQlBU1lOQ19UWF9YT1JfWkVST19EU1QsIE5VTEwsCi0JCQlvcHNfY29tcGxldGVfY29tcHV0ZTUsIHNoKTsKKwkJdHggPSBhc3luY194b3IoeG9yX2Rlc3QsIHhvcl9zcmNzLCAwLCBjb3VudCwgU1RSSVBFX1NJWkUsICZzdWJtaXQpOwogCiAJcmV0dXJuIHR4OwogfQogCisvKiBzZXRfc3luZHJvbWVfc291cmNlcyAtIHBvcHVsYXRlIHNvdXJjZSBidWZmZXJzIGZvciBnZW5fc3luZHJvbWUKKyAqIEBzcmNzIC0gKHN0cnVjdCBwYWdlICopIGFycmF5IG9mIHNpemUgc2gtPmRpc2tzCisgKiBAc2ggLSBzdHJpcGVfaGVhZCB0byBwYXJzZQorICoKKyAqIFBvcHVsYXRlcyBzcmNzIGluIHByb3BlciBsYXlvdXQgb3JkZXIgZm9yIHRoZSBzdHJpcGUgYW5kIHJldHVybnMgdGhlCisgKiAnY291bnQnIG9mIHNvdXJjZXMgdG8gYmUgdXNlZCBpbiBhIGNhbGwgdG8gYXN5bmNfZ2VuX3N5bmRyb21lLiAgVGhlIFAKKyAqIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyByZWNvcmRlZCBpbiBzcmNzW2NvdW50XSBhbmQgdGhlIFEgZGVzdGluYXRpb24KKyAqIGlzIHJlY29yZGVkIGluIHNyY3NbY291bnQrMV1dLgorICovCitzdGF0aWMgaW50IHNldF9zeW5kcm9tZV9zb3VyY2VzKHN0cnVjdCBwYWdlICoqc3Jjcywgc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKK3sKKwlpbnQgZGlza3MgPSBzaC0+ZGlza3M7CisJaW50IHN5bmRyb21lX2Rpc2tzID0gc2gtPmRkZl9sYXlvdXQgPyBkaXNrcyA6IChkaXNrcyAtIDIpOworCWludCBkMF9pZHggPSByYWlkNl9kMChzaCk7CisJaW50IGNvdW50OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRpc2tzOyBpKyspCisJCXNyY3NbaV0gPSBOVUxMOworCisJY291bnQgPSAwOworCWkgPSBkMF9pZHg7CisJZG8geworCQlpbnQgc2xvdCA9IHJhaWQ2X2lkeF90b19zbG90KGksIHNoLCAmY291bnQsIHN5bmRyb21lX2Rpc2tzKTsKKworCQlzcmNzW3Nsb3RdID0gc2gtPmRldltpXS5wYWdlOworCQlpID0gcmFpZDZfbmV4dF9kaXNrKGksIGRpc2tzKTsKKwl9IHdoaWxlIChpICE9IGQwX2lkeCk7CisKKwlyZXR1cm4gc3luZHJvbWVfZGlza3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorb3BzX3J1bl9jb21wdXRlNl8xKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCByYWlkNV9wZXJjcHUgKnBlcmNwdSkKK3sKKwlpbnQgZGlza3MgPSBzaC0+ZGlza3M7CisJc3RydWN0IHBhZ2UgKipibG9ja3MgPSBwZXJjcHUtPnNjcmliYmxlOworCWludCB0YXJnZXQ7CisJaW50IHFkX2lkeCA9IHNoLT5xZF9pZHg7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKwlzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCBzdWJtaXQ7CisJc3RydWN0IHI1ZGV2ICp0Z3Q7CisJc3RydWN0IHBhZ2UgKmRlc3Q7CisJaW50IGk7CisJaW50IGNvdW50OworCisJaWYgKHNoLT5vcHMudGFyZ2V0IDwgMCkKKwkJdGFyZ2V0ID0gc2gtPm9wcy50YXJnZXQyOworCWVsc2UgaWYgKHNoLT5vcHMudGFyZ2V0MiA8IDApCisJCXRhcmdldCA9IHNoLT5vcHMudGFyZ2V0OworCWVsc2UKKwkJLyogd2Ugc2hvdWxkIG9ubHkgaGF2ZSBvbmUgdmFsaWQgdGFyZ2V0ICovCisJCUJVRygpOworCUJVR19PTih0YXJnZXQgPCAwKTsKKwlwcl9kZWJ1ZygiJXM6IHN0cmlwZSAlbGx1IGJsb2NrOiAlZFxuIiwKKwkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgdGFyZ2V0KTsKKworCXRndCA9ICZzaC0+ZGV2W3RhcmdldF07CisJQlVHX09OKCF0ZXN0X2JpdChSNV9XYW50Y29tcHV0ZSwgJnRndC0+ZmxhZ3MpKTsKKwlkZXN0ID0gdGd0LT5wYWdlOworCisJYXRvbWljX2luYygmc2gtPmNvdW50KTsKKworCWlmICh0YXJnZXQgPT0gcWRfaWR4KSB7CisJCWNvdW50ID0gc2V0X3N5bmRyb21lX3NvdXJjZXMoYmxvY2tzLCBzaCk7CisJCWJsb2Nrc1tjb3VudF0gPSBOVUxMOyAvKiByZWdlbmVyYXRpbmcgcCBpcyBub3QgbmVjZXNzYXJ5ICovCisJCUJVR19PTihibG9ja3NbY291bnQrMV0gIT0gZGVzdCk7IC8qIHEgc2hvdWxkIGFscmVhZHkgYmUgc2V0ICovCisJCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFLCBOVUxMLAorCQkJCSAgb3BzX2NvbXBsZXRlX2NvbXB1dGUsIHNoLAorCQkJCSAgdG9fYWRkcl9jb252KHNoLCBwZXJjcHUpKTsKKwkJdHggPSBhc3luY19nZW5fc3luZHJvbWUoYmxvY2tzLCAwLCBjb3VudCsyLCBTVFJJUEVfU0laRSwgJnN1Ym1pdCk7CisJfSBlbHNlIHsKKwkJLyogQ29tcHV0ZSBhbnkgZGF0YS0gb3IgcC1kcml2ZSB1c2luZyBYT1IgKi8KKwkJY291bnQgPSAwOworCQlmb3IgKGkgPSBkaXNrczsgaS0tIDsgKSB7CisJCQlpZiAoaSA9PSB0YXJnZXQgfHwgaSA9PSBxZF9pZHgpCisJCQkJY29udGludWU7CisJCQlibG9ja3NbY291bnQrK10gPSBzaC0+ZGV2W2ldLnBhZ2U7CisJCX0KKworCQlpbml0X2FzeW5jX3N1Ym1pdCgmc3VibWl0LCBBU1lOQ19UWF9GRU5DRXxBU1lOQ19UWF9YT1JfWkVST19EU1QsCisJCQkJICBOVUxMLCBvcHNfY29tcGxldGVfY29tcHV0ZSwgc2gsCisJCQkJICB0b19hZGRyX2NvbnYoc2gsIHBlcmNwdSkpOworCQl0eCA9IGFzeW5jX3hvcihkZXN0LCBibG9ja3MsIDAsIGNvdW50LCBTVFJJUEVfU0laRSwgJnN1Ym1pdCk7CisJfQorCisJcmV0dXJuIHR4OworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK29wc19ydW5fY29tcHV0ZTZfMihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzdHJ1Y3QgcmFpZDVfcGVyY3B1ICpwZXJjcHUpCit7CisJaW50IGksIGNvdW50LCBkaXNrcyA9IHNoLT5kaXNrczsKKwlpbnQgc3luZHJvbWVfZGlza3MgPSBzaC0+ZGRmX2xheW91dCA/IGRpc2tzIDogZGlza3MtMjsKKwlpbnQgZDBfaWR4ID0gcmFpZDZfZDAoc2gpOworCWludCBmYWlsYSA9IC0xLCBmYWlsYiA9IC0xOworCWludCB0YXJnZXQgPSBzaC0+b3BzLnRhcmdldDsKKwlpbnQgdGFyZ2V0MiA9IHNoLT5vcHMudGFyZ2V0MjsKKwlzdHJ1Y3QgcjVkZXYgKnRndCA9ICZzaC0+ZGV2W3RhcmdldF07CisJc3RydWN0IHI1ZGV2ICp0Z3QyID0gJnNoLT5kZXZbdGFyZ2V0Ml07CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKwlzdHJ1Y3QgcGFnZSAqKmJsb2NrcyA9IHBlcmNwdS0+c2NyaWJibGU7CisJc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgc3VibWl0OworCisJcHJfZGVidWcoIiVzOiBzdHJpcGUgJWxsdSBibG9jazE6ICVkIGJsb2NrMjogJWRcbiIsCisJCSBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCB0YXJnZXQsIHRhcmdldDIpOworCUJVR19PTih0YXJnZXQgPCAwIHx8IHRhcmdldDIgPCAwKTsKKwlCVUdfT04oIXRlc3RfYml0KFI1X1dhbnRjb21wdXRlLCAmdGd0LT5mbGFncykpOworCUJVR19PTighdGVzdF9iaXQoUjVfV2FudGNvbXB1dGUsICZ0Z3QyLT5mbGFncykpOworCisJLyogd2UgbmVlZCB0byBvcGVuLWNvZGUgc2V0X3N5bmRyb21lX3NvdXJjZXMgdG8gaGFuZGxlIHRoZQorCSAqIHNsb3QgbnVtYmVyIGNvbnZlcnNpb24gZm9yICdmYWlsYScgYW5kICdmYWlsYicKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGlza3MgOyBpKyspCisJCWJsb2Nrc1tpXSA9IE5VTEw7CisJY291bnQgPSAwOworCWkgPSBkMF9pZHg7CisJZG8geworCQlpbnQgc2xvdCA9IHJhaWQ2X2lkeF90b19zbG90KGksIHNoLCAmY291bnQsIHN5bmRyb21lX2Rpc2tzKTsKKworCQlibG9ja3Nbc2xvdF0gPSBzaC0+ZGV2W2ldLnBhZ2U7CisKKwkJaWYgKGkgPT0gdGFyZ2V0KQorCQkJZmFpbGEgPSBzbG90OworCQlpZiAoaSA9PSB0YXJnZXQyKQorCQkJZmFpbGIgPSBzbG90OworCQlpID0gcmFpZDZfbmV4dF9kaXNrKGksIGRpc2tzKTsKKwl9IHdoaWxlIChpICE9IGQwX2lkeCk7CisKKwlCVUdfT04oZmFpbGEgPT0gZmFpbGIpOworCWlmIChmYWlsYiA8IGZhaWxhKQorCQlzd2FwKGZhaWxhLCBmYWlsYik7CisJcHJfZGVidWcoIiVzOiBzdHJpcGU6ICVsbHUgZmFpbGE6ICVkIGZhaWxiOiAlZFxuIiwKKwkJIF9fZnVuY19fLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGZhaWxhLCBmYWlsYik7CisKKwlhdG9taWNfaW5jKCZzaC0+Y291bnQpOworCisJaWYgKGZhaWxiID09IHN5bmRyb21lX2Rpc2tzKzEpIHsKKwkJLyogUSBkaXNrIGlzIG9uZSBvZiB0aGUgbWlzc2luZyBkaXNrcyAqLworCQlpZiAoZmFpbGEgPT0gc3luZHJvbWVfZGlza3MpIHsKKwkJCS8qIE1pc3NpbmcgUCtRLCBqdXN0IHJlY29tcHV0ZSAqLworCQkJaW5pdF9hc3luY19zdWJtaXQoJnN1Ym1pdCwgQVNZTkNfVFhfRkVOQ0UsIE5VTEwsCisJCQkJCSAgb3BzX2NvbXBsZXRlX2NvbXB1dGUsIHNoLAorCQkJCQkgIHRvX2FkZHJfY29udihzaCwgcGVyY3B1KSk7CisJCQlyZXR1cm4gYXN5bmNfZ2VuX3N5bmRyb21lKGJsb2NrcywgMCwgc3luZHJvbWVfZGlza3MrMiwKKwkJCQkJCSAgU1RSSVBFX1NJWkUsICZzdWJtaXQpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHBhZ2UgKmRlc3Q7CisJCQlpbnQgZGF0YV90YXJnZXQ7CisJCQlpbnQgcWRfaWR4ID0gc2gtPnFkX2lkeDsKKworCQkJLyogTWlzc2luZyBEK1E6IHJlY29tcHV0ZSBEIGZyb20gUCwgdGhlbiByZWNvbXB1dGUgUSAqLworCQkJaWYgKHRhcmdldCA9PSBxZF9pZHgpCisJCQkJZGF0YV90YXJnZXQgPSB0YXJnZXQyOworCQkJZWxzZQorCQkJCWRhdGFfdGFyZ2V0ID0gdGFyZ2V0OworCisJCQljb3VudCA9IDA7CisJCQlmb3IgKGkgPSBkaXNrczsgaS0tIDsgKSB7CisJCQkJaWYgKGkgPT0gZGF0YV90YXJnZXQgfHwgaSA9PSBxZF9pZHgpCisJCQkJCWNvbnRpbnVlOworCQkJCWJsb2Nrc1tjb3VudCsrXSA9IHNoLT5kZXZbaV0ucGFnZTsKKwkJCX0KKwkJCWRlc3QgPSBzaC0+ZGV2W2RhdGFfdGFyZ2V0XS5wYWdlOworCQkJaW5pdF9hc3luY19zdWJtaXQoJnN1Ym1pdCwKKwkJCQkJICBBU1lOQ19UWF9GRU5DRXxBU1lOQ19UWF9YT1JfWkVST19EU1QsCisJCQkJCSAgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJICB0b19hZGRyX2NvbnYoc2gsIHBlcmNwdSkpOworCQkJdHggPSBhc3luY194b3IoZGVzdCwgYmxvY2tzLCAwLCBjb3VudCwgU1RSSVBFX1NJWkUsCisJCQkJICAgICAgICZzdWJtaXQpOworCisJCQljb3VudCA9IHNldF9zeW5kcm9tZV9zb3VyY2VzKGJsb2Nrcywgc2gpOworCQkJaW5pdF9hc3luY19zdWJtaXQoJnN1Ym1pdCwgQVNZTkNfVFhfRkVOQ0UsIHR4LAorCQkJCQkgIG9wc19jb21wbGV0ZV9jb21wdXRlLCBzaCwKKwkJCQkJICB0b19hZGRyX2NvbnYoc2gsIHBlcmNwdSkpOworCQkJcmV0dXJuIGFzeW5jX2dlbl9zeW5kcm9tZShibG9ja3MsIDAsIGNvdW50KzIsCisJCQkJCQkgIFNUUklQRV9TSVpFLCAmc3VibWl0KTsKKwkJfQorCX0gZWxzZSB7CisJCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFLCBOVUxMLAorCQkJCSAgb3BzX2NvbXBsZXRlX2NvbXB1dGUsIHNoLAorCQkJCSAgdG9fYWRkcl9jb252KHNoLCBwZXJjcHUpKTsKKwkJaWYgKGZhaWxiID09IHN5bmRyb21lX2Rpc2tzKSB7CisJCQkvKiBXZSdyZSBtaXNzaW5nIEQrUC4gKi8KKwkJCXJldHVybiBhc3luY19yYWlkNl9kYXRhcF9yZWNvdihzeW5kcm9tZV9kaXNrcysyLAorCQkJCQkJICAgICAgIFNUUklQRV9TSVpFLCBmYWlsYSwKKwkJCQkJCSAgICAgICBibG9ja3MsICZzdWJtaXQpOworCQl9IGVsc2UgeworCQkJLyogV2UncmUgbWlzc2luZyBEK0QuICovCisJCQlyZXR1cm4gYXN5bmNfcmFpZDZfMmRhdGFfcmVjb3Yoc3luZHJvbWVfZGlza3MrMiwKKwkJCQkJCSAgICAgICBTVFJJUEVfU0laRSwgZmFpbGEsIGZhaWxiLAorCQkJCQkJICAgICAgIGJsb2NrcywgJnN1Ym1pdCk7CisJCX0KKwl9Cit9CisKKwogc3RhdGljIHZvaWQgb3BzX2NvbXBsZXRlX3ByZXhvcih2b2lkICpzdHJpcGVfaGVhZF9yZWYpCiB7CiAJc3RydWN0IHN0cmlwZV9oZWFkICpzaCA9IHN0cmlwZV9oZWFkX3JlZjsKQEAgLTY4MCwxMiArOTA4LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgotb3BzX3J1bl9wcmV4b3Ioc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKK29wc19ydW5fcHJleG9yKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCByYWlkNV9wZXJjcHUgKnBlcmNwdSwKKwkgICAgICAgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKIHsKLQkvKiBrZXJuZWwgc3RhY2sgc2l6ZSBsaW1pdHMgdGhlIHRvdGFsIG51bWJlciBvZiBkaXNrcyAqLwogCWludCBkaXNrcyA9IHNoLT5kaXNrczsKLQlzdHJ1Y3QgcGFnZSAqeG9yX3NyY3NbZGlza3NdOworCXN0cnVjdCBwYWdlICoqeG9yX3NyY3MgPSBwZXJjcHUtPnNjcmliYmxlOwogCWludCBjb3VudCA9IDAsIHBkX2lkeCA9IHNoLT5wZF9pZHgsIGk7CisJc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgc3VibWl0OwogCiAJLyogZXhpc3RpbmcgcGFyaXR5IGRhdGEgc3VidHJhY3RlZCAqLwogCXN0cnVjdCBwYWdlICp4b3JfZGVzdCA9IHhvcl9zcmNzW2NvdW50KytdID0gc2gtPmRldltwZF9pZHhdLnBhZ2U7CkBAIC03MDAsOSArOTI5LDkgQEAKIAkJCXhvcl9zcmNzW2NvdW50KytdID0gZGV2LT5wYWdlOwogCX0KIAotCXR4ID0gYXN5bmNfeG9yKHhvcl9kZXN0LCB4b3Jfc3JjcywgMCwgY291bnQsIFNUUklQRV9TSVpFLAotCQlBU1lOQ19UWF9ERVBfQUNLIHwgQVNZTkNfVFhfWE9SX0RST1BfRFNULCB0eCwKLQkJb3BzX2NvbXBsZXRlX3ByZXhvciwgc2gpOworCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIEFTWU5DX1RYX0ZFTkNFfEFTWU5DX1RYX1hPUl9EUk9QX0RTVCwgdHgsCisJCQkgIG9wc19jb21wbGV0ZV9wcmV4b3IsIHNoLCB0b19hZGRyX2NvbnYoc2gsIHBlcmNwdSkpOworCXR4ID0gYXN5bmNfeG9yKHhvcl9kZXN0LCB4b3Jfc3JjcywgMCwgY291bnQsIFNUUklQRV9TSVpFLCAmc3VibWl0KTsKIAogCXJldHVybiB0eDsKIH0KQEAgLTc0MiwxNyArOTcxLDIxIEBACiAJcmV0dXJuIHR4OwogfQogCi1zdGF0aWMgdm9pZCBvcHNfY29tcGxldGVfcG9zdHhvcih2b2lkICpzdHJpcGVfaGVhZF9yZWYpCitzdGF0aWMgdm9pZCBvcHNfY29tcGxldGVfcmVjb25zdHJ1Y3Qodm9pZCAqc3RyaXBlX2hlYWRfcmVmKQogewogCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2ggPSBzdHJpcGVfaGVhZF9yZWY7Ci0JaW50IGRpc2tzID0gc2gtPmRpc2tzLCBpLCBwZF9pZHggPSBzaC0+cGRfaWR4OworCWludCBkaXNrcyA9IHNoLT5kaXNrczsKKwlpbnQgcGRfaWR4ID0gc2gtPnBkX2lkeDsKKwlpbnQgcWRfaWR4ID0gc2gtPnFkX2lkeDsKKwlpbnQgaTsKIAogCXByX2RlYnVnKCIlczogc3RyaXBlICVsbHVcbiIsIF9fZnVuY19fLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwogCiAJZm9yIChpID0gZGlza3M7IGktLTsgKSB7CiAJCXN0cnVjdCByNWRldiAqZGV2ID0gJnNoLT5kZXZbaV07Ci0JCWlmIChkZXYtPndyaXR0ZW4gfHwgaSA9PSBwZF9pZHgpCisKKwkJaWYgKGRldi0+d3JpdHRlbiB8fCBpID09IHBkX2lkeCB8fCBpID09IHFkX2lkeCkKIAkJCXNldF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKTsKIAl9CiAKQEAgLTc3MCwxMiArMTAwMywxMiBAQAogfQogCiBzdGF0aWMgdm9pZAotb3BzX3J1bl9wb3N0eG9yKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpCitvcHNfcnVuX3JlY29uc3RydWN0NShzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzdHJ1Y3QgcmFpZDVfcGVyY3B1ICpwZXJjcHUsCisJCSAgICAgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKIHsKLQkvKiBrZXJuZWwgc3RhY2sgc2l6ZSBsaW1pdHMgdGhlIHRvdGFsIG51bWJlciBvZiBkaXNrcyAqLwogCWludCBkaXNrcyA9IHNoLT5kaXNrczsKLQlzdHJ1Y3QgcGFnZSAqeG9yX3NyY3NbZGlza3NdOwotCisJc3RydWN0IHBhZ2UgKip4b3Jfc3JjcyA9IHBlcmNwdS0+c2NyaWJibGU7CisJc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgc3VibWl0OwogCWludCBjb3VudCA9IDAsIHBkX2lkeCA9IHNoLT5wZF9pZHgsIGk7CiAJc3RydWN0IHBhZ2UgKnhvcl9kZXN0OwogCWludCBwcmV4b3IgPSAwOwpAQCAtODA5LDE4ICsxMDQyLDM2IEBACiAJICogc2V0IEFTWU5DX1RYX1hPUl9EUk9QX0RTVCBhbmQgQVNZTkNfVFhfWE9SX1pFUk9fRFNUCiAJICogZm9yIHRoZSBzeW5jaHJvbm91cyB4b3IgY2FzZQogCSAqLwotCWZsYWdzID0gQVNZTkNfVFhfREVQX0FDSyB8IEFTWU5DX1RYX0FDSyB8CisJZmxhZ3MgPSBBU1lOQ19UWF9BQ0sgfAogCQkocHJleG9yID8gQVNZTkNfVFhfWE9SX0RST1BfRFNUIDogQVNZTkNfVFhfWE9SX1pFUk9fRFNUKTsKIAogCWF0b21pY19pbmMoJnNoLT5jb3VudCk7CiAKLQlpZiAodW5saWtlbHkoY291bnQgPT0gMSkpIHsKLQkJZmxhZ3MgJj0gfihBU1lOQ19UWF9YT1JfRFJPUF9EU1QgfCBBU1lOQ19UWF9YT1JfWkVST19EU1QpOwotCQl0eCA9IGFzeW5jX21lbWNweSh4b3JfZGVzdCwgeG9yX3NyY3NbMF0sIDAsIDAsIFNUUklQRV9TSVpFLAotCQkJZmxhZ3MsIHR4LCBvcHNfY29tcGxldGVfcG9zdHhvciwgc2gpOwotCX0gZWxzZQotCQl0eCA9IGFzeW5jX3hvcih4b3JfZGVzdCwgeG9yX3NyY3MsIDAsIGNvdW50LCBTVFJJUEVfU0laRSwKLQkJCWZsYWdzLCB0eCwgb3BzX2NvbXBsZXRlX3Bvc3R4b3IsIHNoKTsKKwlpbml0X2FzeW5jX3N1Ym1pdCgmc3VibWl0LCBmbGFncywgdHgsIG9wc19jb21wbGV0ZV9yZWNvbnN0cnVjdCwgc2gsCisJCQkgIHRvX2FkZHJfY29udihzaCwgcGVyY3B1KSk7CisJaWYgKHVubGlrZWx5KGNvdW50ID09IDEpKQorCQl0eCA9IGFzeW5jX21lbWNweSh4b3JfZGVzdCwgeG9yX3NyY3NbMF0sIDAsIDAsIFNUUklQRV9TSVpFLCAmc3VibWl0KTsKKwllbHNlCisJCXR4ID0gYXN5bmNfeG9yKHhvcl9kZXN0LCB4b3Jfc3JjcywgMCwgY291bnQsIFNUUklQRV9TSVpFLCAmc3VibWl0KTsKK30KKworc3RhdGljIHZvaWQKK29wc19ydW5fcmVjb25zdHJ1Y3Q2KHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCByYWlkNV9wZXJjcHUgKnBlcmNwdSwKKwkJICAgICBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQoreworCXN0cnVjdCBhc3luY19zdWJtaXRfY3RsIHN1Ym1pdDsKKwlzdHJ1Y3QgcGFnZSAqKmJsb2NrcyA9IHBlcmNwdS0+c2NyaWJibGU7CisJaW50IGNvdW50OworCisJcHJfZGVidWcoIiVzOiBzdHJpcGUgJWxsdVxuIiwgX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7CisKKwljb3VudCA9IHNldF9zeW5kcm9tZV9zb3VyY2VzKGJsb2Nrcywgc2gpOworCisJYXRvbWljX2luYygmc2gtPmNvdW50KTsKKworCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIEFTWU5DX1RYX0FDSywgdHgsIG9wc19jb21wbGV0ZV9yZWNvbnN0cnVjdCwKKwkJCSAgc2gsIHRvX2FkZHJfY29udihzaCwgcGVyY3B1KSk7CisJYXN5bmNfZ2VuX3N5bmRyb21lKGJsb2NrcywgMCwgY291bnQrMiwgU1RSSVBFX1NJWkUsICAmc3VibWl0KTsKIH0KIAogc3RhdGljIHZvaWQgb3BzX2NvbXBsZXRlX2NoZWNrKHZvaWQgKnN0cmlwZV9oZWFkX3JlZikKQEAgLTgzNSw2MyArMTA4NiwxMTUgQEAKIAlyZWxlYXNlX3N0cmlwZShzaCk7CiB9CiAKLXN0YXRpYyB2b2lkIG9wc19ydW5fY2hlY2soc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKK3N0YXRpYyB2b2lkIG9wc19ydW5fY2hlY2tfcChzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzdHJ1Y3QgcmFpZDVfcGVyY3B1ICpwZXJjcHUpCiB7Ci0JLyoga2VybmVsIHN0YWNrIHNpemUgbGltaXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgZGlza3MgKi8KIAlpbnQgZGlza3MgPSBzaC0+ZGlza3M7Ci0Jc3RydWN0IHBhZ2UgKnhvcl9zcmNzW2Rpc2tzXTsKKwlpbnQgcGRfaWR4ID0gc2gtPnBkX2lkeDsKKwlpbnQgcWRfaWR4ID0gc2gtPnFkX2lkeDsKKwlzdHJ1Y3QgcGFnZSAqeG9yX2Rlc3Q7CisJc3RydWN0IHBhZ2UgKip4b3Jfc3JjcyA9IHBlcmNwdS0+c2NyaWJibGU7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKLQotCWludCBjb3VudCA9IDAsIHBkX2lkeCA9IHNoLT5wZF9pZHgsIGk7Ci0Jc3RydWN0IHBhZ2UgKnhvcl9kZXN0ID0geG9yX3NyY3NbY291bnQrK10gPSBzaC0+ZGV2W3BkX2lkeF0ucGFnZTsKKwlzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCBzdWJtaXQ7CisJaW50IGNvdW50OworCWludCBpOwogCiAJcHJfZGVidWcoIiVzOiBzdHJpcGUgJWxsdVxuIiwgX19mdW5jX18sCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7CiAKKwljb3VudCA9IDA7CisJeG9yX2Rlc3QgPSBzaC0+ZGV2W3BkX2lkeF0ucGFnZTsKKwl4b3Jfc3Jjc1tjb3VudCsrXSA9IHhvcl9kZXN0OwogCWZvciAoaSA9IGRpc2tzOyBpLS07ICkgewotCQlzdHJ1Y3QgcjVkZXYgKmRldiA9ICZzaC0+ZGV2W2ldOwotCQlpZiAoaSAhPSBwZF9pZHgpCi0JCQl4b3Jfc3Jjc1tjb3VudCsrXSA9IGRldi0+cGFnZTsKKwkJaWYgKGkgPT0gcGRfaWR4IHx8IGkgPT0gcWRfaWR4KQorCQkJY29udGludWU7CisJCXhvcl9zcmNzW2NvdW50KytdID0gc2gtPmRldltpXS5wYWdlOwogCX0KIAotCXR4ID0gYXN5bmNfeG9yX3plcm9fc3VtKHhvcl9kZXN0LCB4b3Jfc3JjcywgMCwgY291bnQsIFNUUklQRV9TSVpFLAotCQkmc2gtPm9wcy56ZXJvX3N1bV9yZXN1bHQsIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIDAsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkgIHRvX2FkZHJfY29udihzaCwgcGVyY3B1KSk7CisJdHggPSBhc3luY194b3JfdmFsKHhvcl9kZXN0LCB4b3Jfc3JjcywgMCwgY291bnQsIFNUUklQRV9TSVpFLAorCQkJICAgJnNoLT5vcHMuemVyb19zdW1fcmVzdWx0LCAmc3VibWl0KTsKIAogCWF0b21pY19pbmMoJnNoLT5jb3VudCk7Ci0JdHggPSBhc3luY190cmlnZ2VyX2NhbGxiYWNrKEFTWU5DX1RYX0RFUF9BQ0sgfCBBU1lOQ19UWF9BQ0ssIHR4LAotCQlvcHNfY29tcGxldGVfY2hlY2ssIHNoKTsKKwlpbml0X2FzeW5jX3N1Ym1pdCgmc3VibWl0LCBBU1lOQ19UWF9BQ0ssIHR4LCBvcHNfY29tcGxldGVfY2hlY2ssIHNoLCBOVUxMKTsKKwl0eCA9IGFzeW5jX3RyaWdnZXJfY2FsbGJhY2soJnN1Ym1pdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhaWQ1X3J1bl9vcHMoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgdW5zaWduZWQgbG9uZyBvcHNfcmVxdWVzdCkKK3N0YXRpYyB2b2lkIG9wc19ydW5fY2hlY2tfcHEoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc3RydWN0IHJhaWQ1X3BlcmNwdSAqcGVyY3B1LCBpbnQgY2hlY2twKQoreworCXN0cnVjdCBwYWdlICoqc3JjcyA9IHBlcmNwdS0+c2NyaWJibGU7CisJc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgc3VibWl0OworCWludCBjb3VudDsKKworCXByX2RlYnVnKCIlczogc3RyaXBlICVsbHUgY2hlY2twOiAlZFxuIiwgX19mdW5jX18sCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgY2hlY2twKTsKKworCWNvdW50ID0gc2V0X3N5bmRyb21lX3NvdXJjZXMoc3Jjcywgc2gpOworCWlmICghY2hlY2twKQorCQlzcmNzW2NvdW50XSA9IE5VTEw7CisKKwlhdG9taWNfaW5jKCZzaC0+Y291bnQpOworCWluaXRfYXN5bmNfc3VibWl0KCZzdWJtaXQsIEFTWU5DX1RYX0FDSywgTlVMTCwgb3BzX2NvbXBsZXRlX2NoZWNrLAorCQkJICBzaCwgdG9fYWRkcl9jb252KHNoLCBwZXJjcHUpKTsKKwlhc3luY19zeW5kcm9tZV92YWwoc3JjcywgMCwgY291bnQrMiwgU1RSSVBFX1NJWkUsCisJCQkgICAmc2gtPm9wcy56ZXJvX3N1bV9yZXN1bHQsIHBlcmNwdS0+c3BhcmVfcGFnZSwgJnN1Ym1pdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmFpZF9ydW5fb3BzKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHVuc2lnbmVkIGxvbmcgb3BzX3JlcXVlc3QpCiB7CiAJaW50IG92ZXJsYXBfY2xlYXIgPSAwLCBpLCBkaXNrcyA9IHNoLT5kaXNrczsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ID0gTlVMTDsKKwlyYWlkNV9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOworCWludCBsZXZlbCA9IGNvbmYtPmxldmVsOworCXN0cnVjdCByYWlkNV9wZXJjcHUgKnBlcmNwdTsKKwl1bnNpZ25lZCBsb25nIGNwdTsKIAorCWNwdSA9IGdldF9jcHUoKTsKKwlwZXJjcHUgPSBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSk7CiAJaWYgKHRlc3RfYml0KFNUUklQRV9PUF9CSU9GSUxMLCAmb3BzX3JlcXVlc3QpKSB7CiAJCW9wc19ydW5fYmlvZmlsbChzaCk7CiAJCW92ZXJsYXBfY2xlYXIrKzsKIAl9CiAKIAlpZiAodGVzdF9iaXQoU1RSSVBFX09QX0NPTVBVVEVfQkxLLCAmb3BzX3JlcXVlc3QpKSB7Ci0JCXR4ID0gb3BzX3J1bl9jb21wdXRlNShzaCk7Ci0JCS8qIHRlcm1pbmF0ZSB0aGUgY2hhaW4gaWYgcG9zdHhvciBpcyBub3Qgc2V0IHRvIGJlIHJ1biAqLwotCQlpZiAodHggJiYgIXRlc3RfYml0KFNUUklQRV9PUF9QT1NUWE9SLCAmb3BzX3JlcXVlc3QpKQorCQlpZiAobGV2ZWwgPCA2KQorCQkJdHggPSBvcHNfcnVuX2NvbXB1dGU1KHNoLCBwZXJjcHUpOworCQllbHNlIHsKKwkJCWlmIChzaC0+b3BzLnRhcmdldDIgPCAwIHx8IHNoLT5vcHMudGFyZ2V0IDwgMCkKKwkJCQl0eCA9IG9wc19ydW5fY29tcHV0ZTZfMShzaCwgcGVyY3B1KTsKKwkJCWVsc2UKKwkJCQl0eCA9IG9wc19ydW5fY29tcHV0ZTZfMihzaCwgcGVyY3B1KTsKKwkJfQorCQkvKiB0ZXJtaW5hdGUgdGhlIGNoYWluIGlmIHJlY29uc3RydWN0IGlzIG5vdCBzZXQgdG8gYmUgcnVuICovCisJCWlmICh0eCAmJiAhdGVzdF9iaXQoU1RSSVBFX09QX1JFQ09OU1RSVUNULCAmb3BzX3JlcXVlc3QpKQogCQkJYXN5bmNfdHhfYWNrKHR4KTsKIAl9CiAKIAlpZiAodGVzdF9iaXQoU1RSSVBFX09QX1BSRVhPUiwgJm9wc19yZXF1ZXN0KSkKLQkJdHggPSBvcHNfcnVuX3ByZXhvcihzaCwgdHgpOworCQl0eCA9IG9wc19ydW5fcHJleG9yKHNoLCBwZXJjcHUsIHR4KTsKIAogCWlmICh0ZXN0X2JpdChTVFJJUEVfT1BfQklPRFJBSU4sICZvcHNfcmVxdWVzdCkpIHsKIAkJdHggPSBvcHNfcnVuX2Jpb2RyYWluKHNoLCB0eCk7CiAJCW92ZXJsYXBfY2xlYXIrKzsKIAl9CiAKLQlpZiAodGVzdF9iaXQoU1RSSVBFX09QX1BPU1RYT1IsICZvcHNfcmVxdWVzdCkpCi0JCW9wc19ydW5fcG9zdHhvcihzaCwgdHgpOworCWlmICh0ZXN0X2JpdChTVFJJUEVfT1BfUkVDT05TVFJVQ1QsICZvcHNfcmVxdWVzdCkpIHsKKwkJaWYgKGxldmVsIDwgNikKKwkJCW9wc19ydW5fcmVjb25zdHJ1Y3Q1KHNoLCBwZXJjcHUsIHR4KTsKKwkJZWxzZQorCQkJb3BzX3J1bl9yZWNvbnN0cnVjdDYoc2gsIHBlcmNwdSwgdHgpOworCX0KIAotCWlmICh0ZXN0X2JpdChTVFJJUEVfT1BfQ0hFQ0ssICZvcHNfcmVxdWVzdCkpCi0JCW9wc19ydW5fY2hlY2soc2gpOworCWlmICh0ZXN0X2JpdChTVFJJUEVfT1BfQ0hFQ0ssICZvcHNfcmVxdWVzdCkpIHsKKwkJaWYgKHNoLT5jaGVja19zdGF0ZSA9PSBjaGVja19zdGF0ZV9ydW4pCisJCQlvcHNfcnVuX2NoZWNrX3Aoc2gsIHBlcmNwdSk7CisJCWVsc2UgaWYgKHNoLT5jaGVja19zdGF0ZSA9PSBjaGVja19zdGF0ZV9ydW5fcSkKKwkJCW9wc19ydW5fY2hlY2tfcHEoc2gsIHBlcmNwdSwgMCk7CisJCWVsc2UgaWYgKHNoLT5jaGVja19zdGF0ZSA9PSBjaGVja19zdGF0ZV9ydW5fcHEpCisJCQlvcHNfcnVuX2NoZWNrX3BxKHNoLCBwZXJjcHUsIDEpOworCQllbHNlCisJCQlCVUcoKTsKKwl9CiAKIAlpZiAob3ZlcmxhcF9jbGVhcikKIAkJZm9yIChpID0gZGlza3M7IGktLTsgKSB7CkBAIC04OTksMjQgKzEyMDIsNTggQEAKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfT3ZlcmxhcCwgJmRldi0+ZmxhZ3MpKQogCQkJCXdha2VfdXAoJnNoLT5yYWlkX2NvbmYtPndhaXRfZm9yX292ZXJsYXApOwogCQl9CisJcHV0X2NwdSgpOwogfQogCisjaWZkZWYgQ09ORklHX01VTFRJQ09SRV9SQUlENDU2CitzdGF0aWMgdm9pZCBhc3luY19ydW5fb3BzKHZvaWQgKnBhcmFtLCBhc3luY19jb29raWVfdCBjb29raWUpCit7CisJc3RydWN0IHN0cmlwZV9oZWFkICpzaCA9IHBhcmFtOworCXVuc2lnbmVkIGxvbmcgb3BzX3JlcXVlc3QgPSBzaC0+b3BzLnJlcXVlc3Q7CisKKwljbGVhcl9iaXRfdW5sb2NrKFNUUklQRV9PUFNfUkVRX1BFTkRJTkcsICZzaC0+c3RhdGUpOworCXdha2VfdXAoJnNoLT5vcHMud2FpdF9mb3Jfb3BzKTsKKworCV9fcmFpZF9ydW5fb3BzKHNoLCBvcHNfcmVxdWVzdCk7CisJcmVsZWFzZV9zdHJpcGUoc2gpOworfQorCitzdGF0aWMgdm9pZCByYWlkX3J1bl9vcHMoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgdW5zaWduZWQgbG9uZyBvcHNfcmVxdWVzdCkKK3sKKwkvKiBzaW5jZSBoYW5kbGVfc3RyaXBlIGNhbiBiZSBjYWxsZWQgb3V0c2lkZSBvZiByYWlkNWQgY29udGV4dAorCSAqIHdlIG5lZWQgdG8gZW5zdXJlIHNoLT5vcHMucmVxdWVzdCBpcyBkZS1zdGFnZWQgYmVmb3JlIGFub3RoZXIKKwkgKiByZXF1ZXN0IGFycml2ZXMKKwkgKi8KKwl3YWl0X2V2ZW50KHNoLT5vcHMud2FpdF9mb3Jfb3BzLAorCQkgICAhdGVzdF9hbmRfc2V0X2JpdF9sb2NrKFNUUklQRV9PUFNfUkVRX1BFTkRJTkcsICZzaC0+c3RhdGUpKTsKKwlzaC0+b3BzLnJlcXVlc3QgPSBvcHNfcmVxdWVzdDsKKworCWF0b21pY19pbmMoJnNoLT5jb3VudCk7CisJYXN5bmNfc2NoZWR1bGUoYXN5bmNfcnVuX29wcywgc2gpOworfQorI2Vsc2UKKyNkZWZpbmUgcmFpZF9ydW5fb3BzIF9fcmFpZF9ydW5fb3BzCisjZW5kaWYKKwogc3RhdGljIGludCBncm93X29uZV9zdHJpcGUocmFpZDVfY29uZl90ICpjb25mKQogewogCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2g7CisJaW50IGRpc2tzID0gbWF4KGNvbmYtPnJhaWRfZGlza3MsIGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MpOwogCXNoID0ga21lbV9jYWNoZV9hbGxvYyhjb25mLT5zbGFiX2NhY2hlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNoKQogCQlyZXR1cm4gMDsKLQltZW1zZXQoc2gsIDAsIHNpemVvZigqc2gpICsgKGNvbmYtPnJhaWRfZGlza3MtMSkqc2l6ZW9mKHN0cnVjdCByNWRldikpOworCW1lbXNldChzaCwgMCwgc2l6ZW9mKCpzaCkgKyAoZGlza3MtMSkqc2l6ZW9mKHN0cnVjdCByNWRldikpOwogCXNoLT5yYWlkX2NvbmYgPSBjb25mOwogCXNwaW5fbG9ja19pbml0KCZzaC0+bG9jayk7CisJI2lmZGVmIENPTkZJR19NVUxUSUNPUkVfUkFJRDQ1NgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNoLT5vcHMud2FpdF9mb3Jfb3BzKTsKKwkjZW5kaWYKIAotCWlmIChncm93X2J1ZmZlcnMoc2gsIGNvbmYtPnJhaWRfZGlza3MpKSB7Ci0JCXNocmlua19idWZmZXJzKHNoLCBjb25mLT5yYWlkX2Rpc2tzKTsKKwlpZiAoZ3Jvd19idWZmZXJzKHNoLCBkaXNrcykpIHsKKwkJc2hyaW5rX2J1ZmZlcnMoc2gsIGRpc2tzKTsKIAkJa21lbV9jYWNoZV9mcmVlKGNvbmYtPnNsYWJfY2FjaGUsIHNoKTsKIAkJcmV0dXJuIDA7CiAJfQotCXNoLT5kaXNrcyA9IGNvbmYtPnJhaWRfZGlza3M7CiAJLyogd2UganVzdCBjcmVhdGVkIGFuIGFjdGl2ZSBzdHJpcGUgc28uLi4gKi8KIAlhdG9taWNfc2V0KCZzaC0+Y291bnQsIDEpOwogCWF0b21pY19pbmMoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKTsKQEAgLTkyOCw3ICsxMjY1LDcgQEAKIHN0YXRpYyBpbnQgZ3Jvd19zdHJpcGVzKHJhaWQ1X2NvbmZfdCAqY29uZiwgaW50IG51bSkKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqc2M7Ci0JaW50IGRldnMgPSBjb25mLT5yYWlkX2Rpc2tzOworCWludCBkZXZzID0gbWF4KGNvbmYtPnJhaWRfZGlza3MsIGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MpOwogCiAJc3ByaW50Zihjb25mLT5jYWNoZV9uYW1lWzBdLAogCQkicmFpZCVkLSVzIiwgY29uZi0+bGV2ZWwsIG1kbmFtZShjb25mLT5tZGRldikpOwpAQCAtOTQ4LDYgKzEyODUsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBzY3JpYmJsZV9sZW4gLSByZXR1cm4gdGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIHNjcmliYmxlIHJlZ2lvbgorICogQG51bSAtIHRvdGFsIG51bWJlciBvZiBkaXNrcyBpbiB0aGUgYXJyYXkKKyAqCisgKiBUaGUgc2l6ZSBtdXN0IGJlIGVub3VnaCB0byBjb250YWluOgorICogMS8gYSBzdHJ1Y3QgcGFnZSBwb2ludGVyIGZvciBlYWNoIGRldmljZSBpbiB0aGUgYXJyYXkgKzIKKyAqIDIvIHJvb20gdG8gY29udmVydCBlYWNoIGVudHJ5IGluICgxKSB0byBpdHMgY29ycmVzcG9uZGluZyBkbWEKKyAqICAgIChkbWFfbWFwX3BhZ2UoKSkgb3IgcGFnZSAocGFnZV9hZGRyZXNzKCkpIGFkZHJlc3MuCisgKgorICogTm90ZTogdGhlICsyIGlzIGZvciB0aGUgZGVzdGluYXRpb24gYnVmZmVycyBvZiB0aGUgZGRmL3JhaWQ2IGNhc2Ugd2hlcmUgd2UKKyAqIGNhbGN1bGF0ZSBvdmVyIGFsbCBkZXZpY2VzIChub3QganVzdCB0aGUgZGF0YSBibG9ja3MpLCB1c2luZyB6ZXJvcyBpbiBwbGFjZQorICogb2YgdGhlIFAgYW5kIFEgYmxvY2tzLgorICovCitzdGF0aWMgc2l6ZV90IHNjcmliYmxlX2xlbihpbnQgbnVtKQoreworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiAobnVtKzIpICsgc2l6ZW9mKGFkZHJfY29udl90KSAqIChudW0rMik7CisKKwlyZXR1cm4gbGVuOworfQorCiBzdGF0aWMgaW50IHJlc2l6ZV9zdHJpcGVzKHJhaWQ1X2NvbmZfdCAqY29uZiwgaW50IG5ld3NpemUpCiB7CiAJLyogTWFrZSBhbGwgdGhlIHN0cmlwZXMgYWJsZSB0byBob2xkICduZXdzaXplJyBkZXZpY2VzLgpAQCAtOTc2LDYgKzEzMzUsNyBAQAogCXN0cnVjdCBzdHJpcGVfaGVhZCAqb3NoLCAqbnNoOwogCUxJU1RfSEVBRChuZXdzdHJpcGVzKTsKIAlzdHJ1Y3QgZGlza19pbmZvICpuZGlza3M7CisJdW5zaWduZWQgbG9uZyBjcHU7CiAJaW50IGVycjsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqc2M7CiAJaW50IGk7CkBAIC0xMDAzLDYgKzEzNjMsOSBAQAogCiAJCW5zaC0+cmFpZF9jb25mID0gY29uZjsKIAkJc3Bpbl9sb2NrX2luaXQoJm5zaC0+bG9jayk7CisJCSNpZmRlZiBDT05GSUdfTVVMVElDT1JFX1JBSUQ0NTYKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmbnNoLT5vcHMud2FpdF9mb3Jfb3BzKTsKKwkJI2VuZGlmCiAKIAkJbGlzdF9hZGQoJm5zaC0+bHJ1LCAmbmV3c3RyaXBlcyk7CiAJfQpAQCAtMTA0MSw3ICsxNDA0LDcgQEAKIAkvKiBTdGVwIDMuCiAJICogQXQgdGhpcyBwb2ludCwgd2UgYXJlIGhvbGRpbmcgYWxsIHRoZSBzdHJpcGVzIHNvIHRoZSBhcnJheQogCSAqIGlzIGNvbXBsZXRlbHkgc3RhbGxlZCwgc28gbm93IGlzIGEgZ29vZCB0aW1lIHRvIHJlc2l6ZQotCSAqIGNvbmYtPmRpc2tzLgorCSAqIGNvbmYtPmRpc2tzIGFuZCB0aGUgc2NyaWJibGUgcmVnaW9uCiAJICovCiAJbmRpc2tzID0ga3phbGxvYyhuZXdzaXplICogc2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8pLCBHRlBfTk9JTyk7CiAJaWYgKG5kaXNrcykgewpAQCAtMTA1MiwxMCArMTQxNSwzMCBAQAogCX0gZWxzZQogCQllcnIgPSAtRU5PTUVNOwogCisJZ2V0X29ubGluZV9jcHVzKCk7CisJY29uZi0+c2NyaWJibGVfbGVuID0gc2NyaWJibGVfbGVuKG5ld3NpemUpOworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQlzdHJ1Y3QgcmFpZDVfcGVyY3B1ICpwZXJjcHU7CisJCXZvaWQgKnNjcmliYmxlOworCisJCXBlcmNwdSA9IHBlcl9jcHVfcHRyKGNvbmYtPnBlcmNwdSwgY3B1KTsKKwkJc2NyaWJibGUgPSBrbWFsbG9jKGNvbmYtPnNjcmliYmxlX2xlbiwgR0ZQX05PSU8pOworCisJCWlmIChzY3JpYmJsZSkgeworCQkJa2ZyZWUocGVyY3B1LT5zY3JpYmJsZSk7CisJCQlwZXJjcHUtPnNjcmliYmxlID0gc2NyaWJibGU7CisJCX0gZWxzZSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwl9CisJcHV0X29ubGluZV9jcHVzKCk7CisKIAkvKiBTdGVwIDQsIHJldHVybiBuZXcgc3RyaXBlcyB0byBzZXJ2aWNlICovCiAJd2hpbGUoIWxpc3RfZW1wdHkoJm5ld3N0cmlwZXMpKSB7CiAJCW5zaCA9IGxpc3RfZW50cnkobmV3c3RyaXBlcy5uZXh0LCBzdHJ1Y3Qgc3RyaXBlX2hlYWQsIGxydSk7CiAJCWxpc3RfZGVsX2luaXQoJm5zaC0+bHJ1KTsKKwogCQlmb3IgKGk9Y29uZi0+cmFpZF9kaXNrczsgaSA8IG5ld3NpemU7IGkrKykKIAkJCWlmIChuc2gtPmRldltpXS5wYWdlID09IE5VTEwpIHsKIAkJCQlzdHJ1Y3QgcGFnZSAqcCA9IGFsbG9jX3BhZ2UoR0ZQX05PSU8pOwpAQCAtMTU1MywxMCArMTkzNiwxNSBAQAogCQljYXNlIEFMR09SSVRITV9QQVJJVFlfTjoKIAkJCWJyZWFrOwogCQljYXNlIEFMR09SSVRITV9ST1RBVElOR19OX0NPTlRJTlVFOgorCQkJLyogTGlrZSBsZWZ0X3N5bW1ldHJpYywgYnV0IFAgaXMgYmVmb3JlIFEgKi8KIAkJCWlmIChzaC0+cGRfaWR4ID09IDApCiAJCQkJaS0tOwkvKiBQIEQgRCBEIFEgKi8KLQkJCWVsc2UgaWYgKGkgPiBzaC0+cGRfaWR4KQotCQkJCWkgLT0gMjsgLyogRCBEIFEgUCBEICovCisJCQllbHNlIHsKKwkJCQkvKiBEIEQgUSBQIEQgKi8KKwkJCQlpZiAoaSA8IHNoLT5wZF9pZHgpCisJCQkJCWkgKz0gcmFpZF9kaXNrczsKKwkJCQlpIC09IChzaC0+cGRfaWR4ICsgMSk7CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBBTEdPUklUSE1fTEVGVF9BU1lNTUVUUklDXzY6CiAJCWNhc2UgQUxHT1JJVEhNX1JJR0hUX0FTWU1NRVRSSUNfNjoKQEAgLTE1OTQsMjU4ICsxOTgyLDEzIEBACiB9CiAKIAotCi0vKgotICogQ29weSBkYXRhIGJldHdlZW4gYSBwYWdlIGluIHRoZSBzdHJpcGUgY2FjaGUsIGFuZCBvbmUgb3IgbW9yZSBiaW9uCi0gKiBUaGUgcGFnZSBjb3VsZCBhbGlnbiB3aXRoIHRoZSBtaWRkbGUgb2YgdGhlIGJpbywgb3IgdGhlcmUgY291bGQgYmUKLSAqIHNldmVyYWwgYmlvbiwgZWFjaCB3aXRoIHNldmVyYWwgYmlvX3ZlY3MsIHdoaWNoIGNvdmVyIHBhcnQgb2YgdGhlIHBhZ2UKLSAqIE11bHRpcGxlIGJpb24gYXJlIGxpbmtlZCB0b2dldGhlciBvbiBiaV9uZXh0LiAgVGhlcmUgbWF5IGJlIGV4dHJhcwotICogYXQgdGhlIGVuZCBvZiB0aGlzIGxpc3QuICBXZSBpZ25vcmUgdGhlbS4KLSAqLwotc3RhdGljIHZvaWQgY29weV9kYXRhKGludCBmcm9tYmlvLCBzdHJ1Y3QgYmlvICpiaW8sCi0JCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCSAgICAgc2VjdG9yX3Qgc2VjdG9yKQotewotCWNoYXIgKnBhID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCXN0cnVjdCBiaW9fdmVjICpidmw7Ci0JaW50IGk7Ci0JaW50IHBhZ2Vfb2Zmc2V0OwotCi0JaWYgKGJpby0+Ymlfc2VjdG9yID49IHNlY3RvcikKLQkJcGFnZV9vZmZzZXQgPSAoc2lnbmVkKShiaW8tPmJpX3NlY3RvciAtIHNlY3RvcikgKiA1MTI7Ci0JZWxzZQotCQlwYWdlX29mZnNldCA9IChzaWduZWQpKHNlY3RvciAtIGJpby0+Ymlfc2VjdG9yKSAqIC01MTI7Ci0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZsLCBiaW8sIGkpIHsKLQkJaW50IGxlbiA9IGJpb19pb3ZlY19pZHgoYmlvLGkpLT5idl9sZW47Ci0JCWludCBjbGVuOwotCQlpbnQgYl9vZmZzZXQgPSAwOwotCi0JCWlmIChwYWdlX29mZnNldCA8IDApIHsKLQkJCWJfb2Zmc2V0ID0gLXBhZ2Vfb2Zmc2V0OwotCQkJcGFnZV9vZmZzZXQgKz0gYl9vZmZzZXQ7Ci0JCQlsZW4gLT0gYl9vZmZzZXQ7Ci0JCX0KLQotCQlpZiAobGVuID4gMCAmJiBwYWdlX29mZnNldCArIGxlbiA+IFNUUklQRV9TSVpFKQotCQkJY2xlbiA9IFNUUklQRV9TSVpFIC0gcGFnZV9vZmZzZXQ7Ci0JCWVsc2UgY2xlbiA9IGxlbjsKLQotCQlpZiAoY2xlbiA+IDApIHsKLQkJCWNoYXIgKmJhID0gX19iaW9fa21hcF9hdG9taWMoYmlvLCBpLCBLTV9VU0VSMCk7Ci0JCQlpZiAoZnJvbWJpbykKLQkJCQltZW1jcHkocGErcGFnZV9vZmZzZXQsIGJhK2Jfb2Zmc2V0LCBjbGVuKTsKLQkJCWVsc2UKLQkJCQltZW1jcHkoYmErYl9vZmZzZXQsIHBhK3BhZ2Vfb2Zmc2V0LCBjbGVuKTsKLQkJCV9fYmlvX2t1bm1hcF9hdG9taWMoYmEsIEtNX1VTRVIwKTsKLQkJfQotCQlpZiAoY2xlbiA8IGxlbikgLyogaGl0IGVuZCBvZiBwYWdlICovCi0JCQlicmVhazsKLQkJcGFnZV9vZmZzZXQgKz0gIGxlbjsKLQl9Ci19Ci0KLSNkZWZpbmUgY2hlY2tfeG9yKCkJZG8gewkJCQkJCSAgXAotCQkJCWlmIChjb3VudCA9PSBNQVhfWE9SX0JMT0NLUykgewkJICBcCi0JCQkJeG9yX2Jsb2Nrcyhjb3VudCwgU1RSSVBFX1NJWkUsIGRlc3QsIHB0cik7XAotCQkJCWNvdW50ID0gMDsJCQkJICBcCi0JCQkgICB9CQkJCQkJICBcCi0JCQl9IHdoaWxlKDApCi0KLXN0YXRpYyB2b2lkIGNvbXB1dGVfcGFyaXR5NihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgbWV0aG9kKQotewotCXJhaWQ1X2NvbmZfdCAqY29uZiA9IHNoLT5yYWlkX2NvbmY7Ci0JaW50IGksIHBkX2lkeCwgcWRfaWR4LCBkMF9pZHgsIGRpc2tzID0gc2gtPmRpc2tzLCBjb3VudDsKLQlpbnQgc3luZHJvbWVfZGlza3MgPSBzaC0+ZGRmX2xheW91dCA/IGRpc2tzIDogKGRpc2tzIC0gMik7Ci0Jc3RydWN0IGJpbyAqY2hvc2VuOwotCS8qKioqIEZJWCBUSElTOiBUaGlzIGNvdWxkIGJlIHZlcnkgYmFkIGlmIGRpc2tzIGlzIGNsb3NlIHRvIDI1NiAqKioqLwotCXZvaWQgKnB0cnNbc3luZHJvbWVfZGlza3MrMl07Ci0KLQlwZF9pZHggPSBzaC0+cGRfaWR4OwotCXFkX2lkeCA9IHNoLT5xZF9pZHg7Ci0JZDBfaWR4ID0gcmFpZDZfZDAoc2gpOwotCi0JcHJfZGVidWcoImNvbXB1dGVfcGFyaXR5LCBzdHJpcGUgJWxsdSwgbWV0aG9kICVkXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIG1ldGhvZCk7Ci0KLQlzd2l0Y2gobWV0aG9kKSB7Ci0JY2FzZSBSRUFEX01PRElGWV9XUklURToKLQkJQlVHKCk7CQkvKiBSRUFEX01PRElGWV9XUklURSBOL0EgZm9yIFJBSUQtNiAqLwotCWNhc2UgUkVDT05TVFJVQ1RfV1JJVEU6Ci0JCWZvciAoaT0gZGlza3M7IGktLSA7KQotCQkJaWYgKCBpICE9IHBkX2lkeCAmJiBpICE9IHFkX2lkeCAmJiBzaC0+ZGV2W2ldLnRvd3JpdGUgKSB7Ci0JCQkJY2hvc2VuID0gc2gtPmRldltpXS50b3dyaXRlOwotCQkJCXNoLT5kZXZbaV0udG93cml0ZSA9IE5VTEw7Ci0KLQkJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X092ZXJsYXAsICZzaC0+ZGV2W2ldLmZsYWdzKSkKLQkJCQkJd2FrZV91cCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCk7Ci0KLQkJCQlCVUdfT04oc2gtPmRldltpXS53cml0dGVuKTsKLQkJCQlzaC0+ZGV2W2ldLndyaXR0ZW4gPSBjaG9zZW47Ci0JCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ0hFQ0tfUEFSSVRZOgotCQlCVUcoKTsJCS8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLQl9Ci0KLQlmb3IgKGkgPSBkaXNrczsgaS0tOykKLQkJaWYgKHNoLT5kZXZbaV0ud3JpdHRlbikgewotCQkJc2VjdG9yX3Qgc2VjdG9yID0gc2gtPmRldltpXS5zZWN0b3I7Ci0JCQlzdHJ1Y3QgYmlvICp3YmkgPSBzaC0+ZGV2W2ldLndyaXR0ZW47Ci0JCQl3aGlsZSAod2JpICYmIHdiaS0+Ymlfc2VjdG9yIDwgc2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKLQkJCQljb3B5X2RhdGEoMSwgd2JpLCBzaC0+ZGV2W2ldLnBhZ2UsIHNlY3Rvcik7Ci0JCQkJd2JpID0gcjVfbmV4dF9iaW8od2JpLCBzZWN0b3IpOwotCQkJfQotCi0JCQlzZXRfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpOwotCQkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0uZmxhZ3MpOwotCQl9Ci0KLQkvKiBOb3RlIHRoYXQgdW5saWtlIFJBSUQtNSwgdGhlIG9yZGVyaW5nIG9mIHRoZSBkaXNrcyBtYXR0ZXJzIGdyZWF0bHkuKi8KLQotCWZvciAoaSA9IDA7IGkgPCBkaXNrczsgaSsrKQotCQlwdHJzW2ldID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7Ci0KLQljb3VudCA9IDA7Ci0JaSA9IGQwX2lkeDsKLQlkbyB7Ci0JCWludCBzbG90ID0gcmFpZDZfaWR4X3RvX3Nsb3QoaSwgc2gsICZjb3VudCwgc3luZHJvbWVfZGlza3MpOwotCi0JCXB0cnNbc2xvdF0gPSBwYWdlX2FkZHJlc3Moc2gtPmRldltpXS5wYWdlKTsKLQkJaWYgKHNsb3QgPCBzeW5kcm9tZV9kaXNrcyAmJgotCQkgICAgIXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltpXS5mbGFncykpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmxvY2sgJWQvJWQgbm90IHVwdG9kYXRlICIKLQkJCSAgICAgICAib24gcGFyaXR5IGNhbGNcbiIsIGksIGNvdW50KTsKLQkJCUJVRygpOwotCQl9Ci0KLQkJaSA9IHJhaWQ2X25leHRfZGlzayhpLCBkaXNrcyk7Ci0JfSB3aGlsZSAoaSAhPSBkMF9pZHgpOwotCUJVR19PTihjb3VudCAhPSBzeW5kcm9tZV9kaXNrcyk7Ci0KLQlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShzeW5kcm9tZV9kaXNrcysyLCBTVFJJUEVfU0laRSwgcHRycyk7Ci0KLQlzd2l0Y2gobWV0aG9kKSB7Ci0JY2FzZSBSRUNPTlNUUlVDVF9XUklURToKLQkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbcGRfaWR4XS5mbGFncyk7Ci0JCXNldF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W3FkX2lkeF0uZmxhZ3MpOwotCQlzZXRfYml0KFI1X0xPQ0tFRCwgICAmc2gtPmRldltwZF9pZHhdLmZsYWdzKTsKLQkJc2V0X2JpdChSNV9MT0NLRUQsICAgJnNoLT5kZXZbcWRfaWR4XS5mbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgVVBEQVRFX1BBUklUWToKLQkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbcGRfaWR4XS5mbGFncyk7Ci0JCXNldF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W3FkX2lkeF0uZmxhZ3MpOwotCQlicmVhazsKLQl9Ci19Ci0KLQotLyogQ29tcHV0ZSBvbmUgbWlzc2luZyBibG9jayAqLwotc3RhdGljIHZvaWQgY29tcHV0ZV9ibG9ja18xKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBkZF9pZHgsIGludCBub3plcm8pCi17Ci0JaW50IGksIGNvdW50LCBkaXNrcyA9IHNoLT5kaXNrczsKLQl2b2lkICpwdHJbTUFYX1hPUl9CTE9DS1NdLCAqZGVzdCwgKnA7Ci0JaW50IHFkX2lkeCA9IHNoLT5xZF9pZHg7Ci0KLQlwcl9kZWJ1ZygiY29tcHV0ZV9ibG9ja18xLCBzdHJpcGUgJWxsdSwgaWR4ICVkXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGRkX2lkeCk7Ci0KLQlpZiAoIGRkX2lkeCA9PSBxZF9pZHggKSB7Ci0JCS8qIFdlJ3JlIGFjdHVhbGx5IGNvbXB1dGluZyB0aGUgUSBkcml2ZSAqLwotCQljb21wdXRlX3Bhcml0eTYoc2gsIFVQREFURV9QQVJJVFkpOwotCX0gZWxzZSB7Ci0JCWRlc3QgPSBwYWdlX2FkZHJlc3Moc2gtPmRldltkZF9pZHhdLnBhZ2UpOwotCQlpZiAoIW5vemVybykgbWVtc2V0KGRlc3QsIDAsIFNUUklQRV9TSVpFKTsKLQkJY291bnQgPSAwOwotCQlmb3IgKGkgPSBkaXNrcyA7IGktLTsgKSB7Ci0JCQlpZiAoaSA9PSBkZF9pZHggfHwgaSA9PSBxZF9pZHgpCi0JCQkJY29udGludWU7Ci0JCQlwID0gcGFnZV9hZGRyZXNzKHNoLT5kZXZbaV0ucGFnZSk7Ci0JCQlpZiAodGVzdF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2ldLmZsYWdzKSkKLQkJCQlwdHJbY291bnQrK10gPSBwOwotCQkJZWxzZQotCQkJCXByaW50aygiY29tcHV0ZV9ibG9jaygpICVkLCBzdHJpcGUgJWxsdSwgJWQiCi0JCQkJICAgICAgICIgbm90IHByZXNlbnRcbiIsIGRkX2lkeCwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpKTsKLQotCQkJY2hlY2tfeG9yKCk7Ci0JCX0KLQkJaWYgKGNvdW50KQotCQkJeG9yX2Jsb2Nrcyhjb3VudCwgU1RSSVBFX1NJWkUsIGRlc3QsIHB0cik7Ci0JCWlmICghbm96ZXJvKSBzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltkZF9pZHhdLmZsYWdzKTsKLQkJZWxzZSBjbGVhcl9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W2RkX2lkeF0uZmxhZ3MpOwotCX0KLX0KLQotLyogQ29tcHV0ZSB0d28gbWlzc2luZyBibG9ja3MgKi8KLXN0YXRpYyB2b2lkIGNvbXB1dGVfYmxvY2tfMihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgZGRfaWR4MSwgaW50IGRkX2lkeDIpCi17Ci0JaW50IGksIGNvdW50LCBkaXNrcyA9IHNoLT5kaXNrczsKLQlpbnQgc3luZHJvbWVfZGlza3MgPSBzaC0+ZGRmX2xheW91dCA/IGRpc2tzIDogZGlza3MtMjsKLQlpbnQgZDBfaWR4ID0gcmFpZDZfZDAoc2gpOwotCWludCBmYWlsYSA9IC0xLCBmYWlsYiA9IC0xOwotCS8qKioqIEZJWCBUSElTOiBUaGlzIGNvdWxkIGJlIHZlcnkgYmFkIGlmIGRpc2tzIGlzIGNsb3NlIHRvIDI1NiAqKioqLwotCXZvaWQgKnB0cnNbc3luZHJvbWVfZGlza3MrMl07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGlza3MgOyBpKyspCi0JCXB0cnNbaV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKLQljb3VudCA9IDA7Ci0JaSA9IGQwX2lkeDsKLQlkbyB7Ci0JCWludCBzbG90ID0gcmFpZDZfaWR4X3RvX3Nsb3QoaSwgc2gsICZjb3VudCwgc3luZHJvbWVfZGlza3MpOwotCi0JCXB0cnNbc2xvdF0gPSBwYWdlX2FkZHJlc3Moc2gtPmRldltpXS5wYWdlKTsKLQotCQlpZiAoaSA9PSBkZF9pZHgxKQotCQkJZmFpbGEgPSBzbG90OwotCQlpZiAoaSA9PSBkZF9pZHgyKQotCQkJZmFpbGIgPSBzbG90OwotCQlpID0gcmFpZDZfbmV4dF9kaXNrKGksIGRpc2tzKTsKLQl9IHdoaWxlIChpICE9IGQwX2lkeCk7Ci0JQlVHX09OKGNvdW50ICE9IHN5bmRyb21lX2Rpc2tzKTsKLQotCUJVR19PTihmYWlsYSA9PSBmYWlsYik7Ci0JaWYgKCBmYWlsYiA8IGZhaWxhICkgeyBpbnQgdG1wID0gZmFpbGE7IGZhaWxhID0gZmFpbGI7IGZhaWxiID0gdG1wOyB9Ci0KLQlwcl9kZWJ1ZygiY29tcHV0ZV9ibG9ja18yLCBzdHJpcGUgJWxsdSwgaWR4ICVkLCVkICglZCwlZClcbiIsCi0JCSAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGRkX2lkeDEsIGRkX2lkeDIsCi0JCSBmYWlsYSwgZmFpbGIpOwotCi0JaWYgKGZhaWxiID09IHN5bmRyb21lX2Rpc2tzKzEpIHsKLQkJLyogUSBkaXNrIGlzIG9uZSBvZiB0aGUgbWlzc2luZyBkaXNrcyAqLwotCQlpZiAoZmFpbGEgPT0gc3luZHJvbWVfZGlza3MpIHsKLQkJCS8qIE1pc3NpbmcgUCtRLCBqdXN0IHJlY29tcHV0ZSAqLwotCQkJY29tcHV0ZV9wYXJpdHk2KHNoLCBVUERBVEVfUEFSSVRZKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCS8qIFdlJ3JlIG1pc3NpbmcgRCtROyByZWNvbXB1dGUgRCBmcm9tIFAgKi8KLQkJCWNvbXB1dGVfYmxvY2tfMShzaCwgKChkZF9pZHgxID09IHNoLT5xZF9pZHgpID8KLQkJCQkJICAgICBkZF9pZHgyIDogZGRfaWR4MSksCi0JCQkJCTApOwotCQkJY29tcHV0ZV9wYXJpdHk2KHNoLCBVUERBVEVfUEFSSVRZKTsgLyogSXMgdGhpcyBuZWNlc3Nhcnk/ICovCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiBXZSdyZSBtaXNzaW5nIEQrUCBvciBEK0Q7ICovCi0JaWYgKGZhaWxiID09IHN5bmRyb21lX2Rpc2tzKSB7Ci0JCS8qIFdlJ3JlIG1pc3NpbmcgRCtQLiAqLwotCQlyYWlkNl9kYXRhcF9yZWNvdihzeW5kcm9tZV9kaXNrcysyLCBTVFJJUEVfU0laRSwgZmFpbGEsIHB0cnMpOwotCX0gZWxzZSB7Ci0JCS8qIFdlJ3JlIG1pc3NpbmcgRCtELiAqLwotCQlyYWlkNl8yZGF0YV9yZWNvdihzeW5kcm9tZV9kaXNrcysyLCBTVFJJUEVfU0laRSwgZmFpbGEsIGZhaWxiLAotCQkJCSAgcHRycyk7Ci0JfQotCi0JLyogQm90aCB0aGUgYWJvdmUgdXBkYXRlIGJvdGggbWlzc2luZyBibG9ja3MgKi8KLQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltkZF9pZHgxXS5mbGFncyk7Ci0Jc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbZGRfaWR4Ml0uZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZAotc2NoZWR1bGVfcmVjb25zdHJ1Y3Rpb241KHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCBzdHJpcGVfaGVhZF9zdGF0ZSAqcywKK3NjaGVkdWxlX3JlY29uc3RydWN0aW9uKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCBzdHJpcGVfaGVhZF9zdGF0ZSAqcywKIAkJCSBpbnQgcmN3LCBpbnQgZXhwYW5kKQogewogCWludCBpLCBwZF9pZHggPSBzaC0+cGRfaWR4LCBkaXNrcyA9IHNoLT5kaXNrczsKKwlyYWlkNV9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOworCWludCBsZXZlbCA9IGNvbmYtPmxldmVsOwogCiAJaWYgKHJjdykgewogCQkvKiBpZiB3ZSBhcmUgbm90IGV4cGFuZGluZyB0aGlzIGlzIGEgcHJvcGVyIHdyaXRlIHJlcXVlc3QsIGFuZApAQCAtMTg1OCw3ICsyMDAxLDcgQEAKIAkJfSBlbHNlCiAJCQlzaC0+cmVjb25zdHJ1Y3Rfc3RhdGUgPSByZWNvbnN0cnVjdF9zdGF0ZV9ydW47CiAKLQkJc2V0X2JpdChTVFJJUEVfT1BfUE9TVFhPUiwgJnMtPm9wc19yZXF1ZXN0KTsKKwkJc2V0X2JpdChTVFJJUEVfT1BfUkVDT05TVFJVQ1QsICZzLT5vcHNfcmVxdWVzdCk7CiAKIAkJZm9yIChpID0gZGlza3M7IGktLTsgKSB7CiAJCQlzdHJ1Y3QgcjVkZXYgKmRldiA9ICZzaC0+ZGV2W2ldOwpAQCAtMTg3MSwxNyArMjAxNCwxOCBAQAogCQkJCXMtPmxvY2tlZCsrOwogCQkJfQogCQl9Ci0JCWlmIChzLT5sb2NrZWQgKyAxID09IGRpc2tzKQorCQlpZiAocy0+bG9ja2VkICsgY29uZi0+bWF4X2RlZ3JhZGVkID09IGRpc2tzKQogCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNUUklQRV9GVUxMX1dSSVRFLCAmc2gtPnN0YXRlKSkKLQkJCQlhdG9taWNfaW5jKCZzaC0+cmFpZF9jb25mLT5wZW5kaW5nX2Z1bGxfd3JpdGVzKTsKKwkJCQlhdG9taWNfaW5jKCZjb25mLT5wZW5kaW5nX2Z1bGxfd3JpdGVzKTsKIAl9IGVsc2UgeworCQlCVUdfT04obGV2ZWwgPT0gNik7CiAJCUJVR19PTighKHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltwZF9pZHhdLmZsYWdzKSB8fAogCQkJdGVzdF9iaXQoUjVfV2FudGNvbXB1dGUsICZzaC0+ZGV2W3BkX2lkeF0uZmxhZ3MpKSk7CiAKIAkJc2gtPnJlY29uc3RydWN0X3N0YXRlID0gcmVjb25zdHJ1Y3Rfc3RhdGVfcHJleG9yX2RyYWluX3J1bjsKIAkJc2V0X2JpdChTVFJJUEVfT1BfUFJFWE9SLCAmcy0+b3BzX3JlcXVlc3QpOwogCQlzZXRfYml0KFNUUklQRV9PUF9CSU9EUkFJTiwgJnMtPm9wc19yZXF1ZXN0KTsKLQkJc2V0X2JpdChTVFJJUEVfT1BfUE9TVFhPUiwgJnMtPm9wc19yZXF1ZXN0KTsKKwkJc2V0X2JpdChTVFJJUEVfT1BfUkVDT05TVFJVQ1QsICZzLT5vcHNfcmVxdWVzdCk7CiAKIAkJZm9yIChpID0gZGlza3M7IGktLTsgKSB7CiAJCQlzdHJ1Y3QgcjVkZXYgKmRldiA9ICZzaC0+ZGV2W2ldOwpAQCAtMTg5OSwxMyArMjA0MywyMiBAQAogCQl9CiAJfQogCi0JLyoga2VlcCB0aGUgcGFyaXR5IGRpc2sgbG9ja2VkIHdoaWxlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zCisJLyoga2VlcCB0aGUgcGFyaXR5IGRpc2socykgbG9ja2VkIHdoaWxlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zCiAJICogYXJlIGluIGZsaWdodAogCSAqLwogCXNldF9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltwZF9pZHhdLmZsYWdzKTsKIAljbGVhcl9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W3BkX2lkeF0uZmxhZ3MpOwogCXMtPmxvY2tlZCsrOwogCisJaWYgKGxldmVsID09IDYpIHsKKwkJaW50IHFkX2lkeCA9IHNoLT5xZF9pZHg7CisJCXN0cnVjdCByNWRldiAqZGV2ID0gJnNoLT5kZXZbcWRfaWR4XTsKKworCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKTsKKwkJcy0+bG9ja2VkKys7CisJfQorCiAJcHJfZGVidWcoIiVzOiBzdHJpcGUgJWxsdSBsb2NrZWQ6ICVkIG9wc19yZXF1ZXN0OiAlbHhcbiIsCiAJCV9fZnVuY19fLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsCiAJCXMtPmxvY2tlZCwgcy0+b3BzX3JlcXVlc3QpOwpAQCAtMTk4NiwxMyArMjEzOSw2IEBACiAKIHN0YXRpYyB2b2lkIGVuZF9yZXNoYXBlKHJhaWQ1X2NvbmZfdCAqY29uZik7CiAKLXN0YXRpYyBpbnQgcGFnZV9pc196ZXJvKHN0cnVjdCBwYWdlICpwKQotewotCWNoYXIgKmEgPSBwYWdlX2FkZHJlc3MocCk7Ci0JcmV0dXJuICgoKih1MzIqKWEpID09IDAgJiYKLQkJbWVtY21wKGEsIGErNCwgU1RSSVBFX1NJWkUtNCk9PTApOwotfQotCiBzdGF0aWMgdm9pZCBzdHJpcGVfc2V0X2lkeChzZWN0b3JfdCBzdHJpcGUsIHJhaWQ1X2NvbmZfdCAqY29uZiwgaW50IHByZXZpb3VzLAogCQkJICAgIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCiB7CkBAIC0yMTMyLDkgKzIyNzgsMTAgQEAKIAkJCXNldF9iaXQoU1RSSVBFX09QX0NPTVBVVEVfQkxLLCAmcy0+b3BzX3JlcXVlc3QpOwogCQkJc2V0X2JpdChSNV9XYW50Y29tcHV0ZSwgJmRldi0+ZmxhZ3MpOwogCQkJc2gtPm9wcy50YXJnZXQgPSBkaXNrX2lkeDsKKwkJCXNoLT5vcHMudGFyZ2V0MiA9IC0xOwogCQkJcy0+cmVxX2NvbXB1dGUgPSAxOwogCQkJLyogQ2FyZWZ1bDogZnJvbSB0aGlzIHBvaW50IG9uICd1cHRvZGF0ZScgaXMgaW4gdGhlIGV5ZQotCQkJICogb2YgcmFpZDVfcnVuX29wcyB3aGljaCBzZXJ2aWNlcyAnY29tcHV0ZScgb3BlcmF0aW9ucworCQkJICogb2YgcmFpZF9ydW5fb3BzIHdoaWNoIHNlcnZpY2VzICdjb21wdXRlJyBvcGVyYXRpb25zCiAJCQkgKiBiZWZvcmUgd3JpdGVzLiBSNV9XYW50Y29tcHV0ZSBmbGFncyBhIGJsb2NrIHRoYXQgd2lsbAogCQkJICogYmUgUjVfVVBUT0RBVEUgYnkgdGhlIHRpbWUgaXQgaXMgbmVlZGVkIGZvciBhCiAJCQkgKiBzdWJzZXF1ZW50IG9wZXJhdGlvbi4KQEAgLTIxNzMsNjEgKzIzMjAsMTA0IEBACiAJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKIH0KIAorLyogZmV0Y2hfYmxvY2s2IC0gY2hlY2tzIHRoZSBnaXZlbiBtZW1iZXIgZGV2aWNlIHRvIHNlZSBpZiBpdHMgZGF0YSBuZWVkcworICogdG8gYmUgcmVhZCBvciBjb21wdXRlZCB0byBzYXRpc2Z5IGEgcmVxdWVzdC4KKyAqCisgKiBSZXR1cm5zIDEgd2hlbiBubyBtb3JlIG1lbWJlciBkZXZpY2VzIG5lZWQgdG8gYmUgY2hlY2tlZCwgb3RoZXJ3aXNlIHJldHVybnMKKyAqIDAgdG8gdGVsbCB0aGUgbG9vcCBpbiBoYW5kbGVfc3RyaXBlX2ZpbGw2IHRvIGNvbnRpbnVlCisgKi8KK3N0YXRpYyBpbnQgZmV0Y2hfYmxvY2s2KHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCBzdHJpcGVfaGVhZF9zdGF0ZSAqcywKKwkJCSBzdHJ1Y3QgcjZfc3RhdGUgKnI2cywgaW50IGRpc2tfaWR4LCBpbnQgZGlza3MpCit7CisJc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltkaXNrX2lkeF07CisJc3RydWN0IHI1ZGV2ICpmZGV2WzJdID0geyAmc2gtPmRldltyNnMtPmZhaWxlZF9udW1bMF1dLAorCQkJCSAgJnNoLT5kZXZbcjZzLT5mYWlsZWRfbnVtWzFdXSB9OworCisJaWYgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSAmJgorCSAgICAhdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSAmJgorCSAgICAoZGV2LT50b3JlYWQgfHwKKwkgICAgIChkZXYtPnRvd3JpdGUgJiYgIXRlc3RfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpKSB8fAorCSAgICAgcy0+c3luY2luZyB8fCBzLT5leHBhbmRpbmcgfHwKKwkgICAgIChzLT5mYWlsZWQgPj0gMSAmJgorCSAgICAgIChmZGV2WzBdLT50b3JlYWQgfHwgcy0+dG9fd3JpdGUpKSB8fAorCSAgICAgKHMtPmZhaWxlZCA+PSAyICYmCisJICAgICAgKGZkZXZbMV0tPnRvcmVhZCB8fCBzLT50b193cml0ZSkpKSkgeworCQkvKiB3ZSB3b3VsZCBsaWtlIHRvIGdldCB0aGlzIGJsb2NrLCBwb3NzaWJseSBieSBjb21wdXRpbmcgaXQsCisJCSAqIG90aGVyd2lzZSByZWFkIGl0IGlmIHRoZSBiYWNraW5nIGRpc2sgaXMgaW5zeW5jCisJCSAqLworCQlCVUdfT04odGVzdF9iaXQoUjVfV2FudGNvbXB1dGUsICZkZXYtPmZsYWdzKSk7CisJCUJVR19PTih0ZXN0X2JpdChSNV9XYW50cmVhZCwgJmRldi0+ZmxhZ3MpKTsKKwkJaWYgKChzLT51cHRvZGF0ZSA9PSBkaXNrcyAtIDEpICYmCisJCSAgICAocy0+ZmFpbGVkICYmIChkaXNrX2lkeCA9PSByNnMtPmZhaWxlZF9udW1bMF0gfHwKKwkJCQkgICBkaXNrX2lkeCA9PSByNnMtPmZhaWxlZF9udW1bMV0pKSkgeworCQkJLyogaGF2ZSBkaXNrIGZhaWxlZCwgYW5kIHdlJ3JlIHJlcXVlc3RlZCB0byBmZXRjaCBpdDsKKwkJCSAqIGRvIGNvbXB1dGUgaXQKKwkJCSAqLworCQkJcHJfZGVidWcoIkNvbXB1dGluZyBzdHJpcGUgJWxsdSBibG9jayAlZFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGRpc2tfaWR4KTsKKwkJCXNldF9iaXQoU1RSSVBFX0NPTVBVVEVfUlVOLCAmc2gtPnN0YXRlKTsKKwkJCXNldF9iaXQoU1RSSVBFX09QX0NPTVBVVEVfQkxLLCAmcy0+b3BzX3JlcXVlc3QpOworCQkJc2V0X2JpdChSNV9XYW50Y29tcHV0ZSwgJmRldi0+ZmxhZ3MpOworCQkJc2gtPm9wcy50YXJnZXQgPSBkaXNrX2lkeDsKKwkJCXNoLT5vcHMudGFyZ2V0MiA9IC0xOyAvKiBubyAybmQgdGFyZ2V0ICovCisJCQlzLT5yZXFfY29tcHV0ZSA9IDE7CisJCQlzLT51cHRvZGF0ZSsrOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAocy0+dXB0b2RhdGUgPT0gZGlza3MtMiAmJiBzLT5mYWlsZWQgPj0gMikgeworCQkJLyogQ29tcHV0aW5nIDItZmFpbHVyZSBpcyAqdmVyeSogZXhwZW5zaXZlOyBvbmx5CisJCQkgKiBkbyBpdCBpZiBmYWlsZWQgPj0gMgorCQkJICovCisJCQlpbnQgb3RoZXI7CisJCQlmb3IgKG90aGVyID0gZGlza3M7IG90aGVyLS07ICkgeworCQkJCWlmIChvdGhlciA9PSBkaXNrX2lkeCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCF0ZXN0X2JpdChSNV9VUFRPREFURSwKKwkJCQkgICAgICAmc2gtPmRldltvdGhlcl0uZmxhZ3MpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCUJVR19PTihvdGhlciA8IDApOworCQkJcHJfZGVidWcoIkNvbXB1dGluZyBzdHJpcGUgJWxsdSBibG9ja3MgJWQsJWRcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLAorCQkJICAgICAgIGRpc2tfaWR4LCBvdGhlcik7CisJCQlzZXRfYml0KFNUUklQRV9DT01QVVRFX1JVTiwgJnNoLT5zdGF0ZSk7CisJCQlzZXRfYml0KFNUUklQRV9PUF9DT01QVVRFX0JMSywgJnMtPm9wc19yZXF1ZXN0KTsKKwkJCXNldF9iaXQoUjVfV2FudGNvbXB1dGUsICZzaC0+ZGV2W2Rpc2tfaWR4XS5mbGFncyk7CisJCQlzZXRfYml0KFI1X1dhbnRjb21wdXRlLCAmc2gtPmRldltvdGhlcl0uZmxhZ3MpOworCQkJc2gtPm9wcy50YXJnZXQgPSBkaXNrX2lkeDsKKwkJCXNoLT5vcHMudGFyZ2V0MiA9IG90aGVyOworCQkJcy0+dXB0b2RhdGUgKz0gMjsKKwkJCXMtPnJlcV9jb21wdXRlID0gMTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgaWYgKHRlc3RfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpKSB7CisJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOworCQkJc2V0X2JpdChSNV9XYW50cmVhZCwgJmRldi0+ZmxhZ3MpOworCQkJcy0+bG9ja2VkKys7CisJCQlwcl9kZWJ1ZygiUmVhZGluZyBibG9jayAlZCAoc3luYz0lZClcbiIsCisJCQkJZGlza19pZHgsIHMtPnN5bmNpbmcpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGFuZGxlX3N0cmlwZV9maWxsNiAtIHJlYWQgb3IgY29tcHV0ZSBkYXRhIHRvIHNhdGlzZnkgcGVuZGluZyByZXF1ZXN0cy4KKyAqLwogc3RhdGljIHZvaWQgaGFuZGxlX3N0cmlwZV9maWxsNihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLAogCQkJc3RydWN0IHN0cmlwZV9oZWFkX3N0YXRlICpzLCBzdHJ1Y3QgcjZfc3RhdGUgKnI2cywKIAkJCWludCBkaXNrcykKIHsKIAlpbnQgaTsKLQlmb3IgKGkgPSBkaXNrczsgaS0tOyApIHsKLQkJc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltpXTsKLQkJaWYgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSAmJgotCQkgICAgIXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncykgJiYKLQkJICAgIChkZXYtPnRvcmVhZCB8fCAoZGV2LT50b3dyaXRlICYmCi0JCSAgICAgIXRlc3RfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpKSB8fAotCQkgICAgIHMtPnN5bmNpbmcgfHwgcy0+ZXhwYW5kaW5nIHx8Ci0JCSAgICAgKHMtPmZhaWxlZCA+PSAxICYmCi0JCSAgICAgIChzaC0+ZGV2W3I2cy0+ZmFpbGVkX251bVswXV0udG9yZWFkIHx8Ci0JCSAgICAgICBzLT50b193cml0ZSkpIHx8Ci0JCSAgICAgKHMtPmZhaWxlZCA+PSAyICYmCi0JCSAgICAgIChzaC0+ZGV2W3I2cy0+ZmFpbGVkX251bVsxXV0udG9yZWFkIHx8Ci0JCSAgICAgICBzLT50b193cml0ZSkpKSkgewotCQkJLyogd2Ugd291bGQgbGlrZSB0byBnZXQgdGhpcyBibG9jaywgcG9zc2libHkKLQkJCSAqIGJ5IGNvbXB1dGluZyBpdCwgYnV0IHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvCi0JCQkgKi8KLQkJCWlmICgocy0+dXB0b2RhdGUgPT0gZGlza3MgLSAxKSAmJgotCQkJICAgIChzLT5mYWlsZWQgJiYgKGkgPT0gcjZzLT5mYWlsZWRfbnVtWzBdIHx8Ci0JCQkJCSAgIGkgPT0gcjZzLT5mYWlsZWRfbnVtWzFdKSkpIHsKLQkJCQlwcl9kZWJ1ZygiQ29tcHV0aW5nIHN0cmlwZSAlbGx1IGJsb2NrICVkXG4iLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGkpOwotCQkJCWNvbXB1dGVfYmxvY2tfMShzaCwgaSwgMCk7Ci0JCQkJcy0+dXB0b2RhdGUrKzsKLQkJCX0gZWxzZSBpZiAoIHMtPnVwdG9kYXRlID09IGRpc2tzLTIgJiYgcy0+ZmFpbGVkID49IDIgKSB7Ci0JCQkJLyogQ29tcHV0aW5nIDItZmFpbHVyZSBpcyAqdmVyeSogZXhwZW5zaXZlOyBvbmx5Ci0JCQkJICogZG8gaXQgaWYgZmFpbGVkID49IDIKLQkJCQkgKi8KLQkJCQlpbnQgb3RoZXI7Ci0JCQkJZm9yIChvdGhlciA9IGRpc2tzOyBvdGhlci0tOyApIHsKLQkJCQkJaWYgKG90aGVyID09IGkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKCF0ZXN0X2JpdChSNV9VUFRPREFURSwKLQkJCQkJICAgICAgJnNoLT5kZXZbb3RoZXJdLmZsYWdzKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlCVUdfT04ob3RoZXIgPCAwKTsKLQkJCQlwcl9kZWJ1ZygiQ29tcHV0aW5nIHN0cmlwZSAlbGx1IGJsb2NrcyAlZCwlZFxuIiwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLAotCQkJCSAgICAgICBpLCBvdGhlcik7Ci0JCQkJY29tcHV0ZV9ibG9ja18yKHNoLCBpLCBvdGhlcik7Ci0JCQkJcy0+dXB0b2RhdGUgKz0gMjsKLQkJCX0gZWxzZSBpZiAodGVzdF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncykpIHsKLQkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOwotCQkJCXNldF9iaXQoUjVfV2FudHJlYWQsICZkZXYtPmZsYWdzKTsKLQkJCQlzLT5sb2NrZWQrKzsKLQkJCQlwcl9kZWJ1ZygiUmVhZGluZyBibG9jayAlZCAoc3luYz0lZClcbiIsCi0JCQkJCWksIHMtPnN5bmNpbmcpOwotCQkJfQotCQl9Ci0JfQorCisJLyogbG9vayBmb3IgYmxvY2tzIHRvIHJlYWQvY29tcHV0ZSwgc2tpcCB0aGlzIGlmIGEgY29tcHV0ZQorCSAqIGlzIGFscmVhZHkgaW4gZmxpZ2h0LCBvciBpZiB0aGUgc3RyaXBlIGNvbnRlbnRzIGFyZSBpbiB0aGUKKwkgKiBtaWRzdCBvZiBjaGFuZ2luZyBkdWUgdG8gYSB3cml0ZQorCSAqLworCWlmICghdGVzdF9iaXQoU1RSSVBFX0NPTVBVVEVfUlVOLCAmc2gtPnN0YXRlKSAmJiAhc2gtPmNoZWNrX3N0YXRlICYmCisJICAgICFzaC0+cmVjb25zdHJ1Y3Rfc3RhdGUpCisJCWZvciAoaSA9IGRpc2tzOyBpLS07ICkKKwkJCWlmIChmZXRjaF9ibG9jazYoc2gsIHMsIHI2cywgaSwgZGlza3MpKQorCQkJCWJyZWFrOwogCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CiB9CiAKQEAgLTIzNjEsMTE0ICsyNTUxLDYxIEBACiAJICovCiAJLyogc2luY2UgaGFuZGxlX3N0cmlwZSBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIHdlIG5lZWQgdG8gaGFuZGxlIHRoZQogCSAqIGNhc2Ugd2hlcmUgYSBjb21wdXRlIGJsb2NrIG9wZXJhdGlvbiBoYXMgYmVlbiBzdWJtaXR0ZWQgYW5kIHRoZW4gYQotCSAqIHN1YnNlcXVlbnQgY2FsbCB3YW50cyB0byBzdGFydCBhIHdyaXRlIHJlcXVlc3QuICByYWlkNV9ydW5fb3BzIG9ubHkKLQkgKiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGNvbXB1dGUgYmxvY2sgYW5kIHBvc3R4b3IgYXJlIHJlcXVlc3RlZAorCSAqIHN1YnNlcXVlbnQgY2FsbCB3YW50cyB0byBzdGFydCBhIHdyaXRlIHJlcXVlc3QuICByYWlkX3J1bl9vcHMgb25seQorCSAqIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY29tcHV0ZSBibG9jayBhbmQgcmVjb25zdHJ1Y3QgYXJlIHJlcXVlc3RlZAogCSAqIHNpbXVsdGFuZW91c2x5LiAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgdGhlbiBuZXcgd3JpdGVzIG5lZWQgdG8gYmUKIAkgKiBoZWxkIG9mZiB1bnRpbCB0aGUgY29tcHV0ZSBjb21wbGV0ZXMuCiAJICovCiAJaWYgKChzLT5yZXFfY29tcHV0ZSB8fCAhdGVzdF9iaXQoU1RSSVBFX0NPTVBVVEVfUlVOLCAmc2gtPnN0YXRlKSkgJiYKIAkgICAgKHMtPmxvY2tlZCA9PSAwICYmIChyY3cgPT0gMCB8fCBybXcgPT0gMCkgJiYKIAkgICAgIXRlc3RfYml0KFNUUklQRV9CSVRfREVMQVksICZzaC0+c3RhdGUpKSkKLQkJc2NoZWR1bGVfcmVjb25zdHJ1Y3Rpb241KHNoLCBzLCByY3cgPT0gMCwgMCk7CisJCXNjaGVkdWxlX3JlY29uc3RydWN0aW9uKHNoLCBzLCByY3cgPT0gMCwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9zdHJpcGVfZGlydHlpbmc2KHJhaWQ1X2NvbmZfdCAqY29uZiwKIAkJc3RydWN0IHN0cmlwZV9oZWFkICpzaCwJc3RydWN0IHN0cmlwZV9oZWFkX3N0YXRlICpzLAogCQlzdHJ1Y3QgcjZfc3RhdGUgKnI2cywgaW50IGRpc2tzKQogewotCWludCByY3cgPSAwLCBtdXN0X2NvbXB1dGUgPSAwLCBwZF9pZHggPSBzaC0+cGRfaWR4LCBpOworCWludCByY3cgPSAwLCBwZF9pZHggPSBzaC0+cGRfaWR4LCBpOwogCWludCBxZF9pZHggPSBzaC0+cWRfaWR4OworCisJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKIAlmb3IgKGkgPSBkaXNrczsgaS0tOyApIHsKIAkJc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltpXTsKLQkJLyogV291bGQgSSBoYXZlIHRvIHJlYWQgdGhpcyBidWZmZXIgZm9yIHJlY29uc3RydWN0X3dyaXRlICovCi0JCWlmICghdGVzdF9iaXQoUjVfT1ZFUldSSVRFLCAmZGV2LT5mbGFncykKLQkJICAgICYmIGkgIT0gcGRfaWR4ICYmIGkgIT0gcWRfaWR4Ci0JCSAgICAmJiAoIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpCi0JCQkgICAgKSAmJgotCQkgICAgIXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncykpIHsKLQkJCWlmICh0ZXN0X2JpdChSNV9JbnN5bmMsICZkZXYtPmZsYWdzKSkgcmN3Kys7Ci0JCQllbHNlIHsKLQkJCQlwcl9kZWJ1ZygicmFpZDY6IG11c3RfY29tcHV0ZTogIgotCQkJCQkiZGlzayAlZCBmbGFncz0lI2x4XG4iLCBpLCBkZXYtPmZsYWdzKTsKLQkJCQltdXN0X2NvbXB1dGUrKzsKKwkJLyogY2hlY2sgaWYgd2UgaGF2ZW4ndCBlbm91Z2ggZGF0YSAqLworCQlpZiAoIXRlc3RfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpICYmCisJCSAgICBpICE9IHBkX2lkeCAmJiBpICE9IHFkX2lkeCAmJgorCQkgICAgIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpICYmCisJCSAgICAhKHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncykgfHwKKwkJICAgICAgdGVzdF9iaXQoUjVfV2FudGNvbXB1dGUsICZkZXYtPmZsYWdzKSkpIHsKKwkJCXJjdysrOworCQkJaWYgKCF0ZXN0X2JpdChSNV9JbnN5bmMsICZkZXYtPmZsYWdzKSkKKwkJCQljb250aW51ZTsgLyogaXQncyBhIGZhaWxlZCBkcml2ZSAqLworCisJCQlpZiAoCisJCQkgIHRlc3RfYml0KFNUUklQRV9QUkVSRUFEX0FDVElWRSwgJnNoLT5zdGF0ZSkpIHsKKwkJCQlwcl9kZWJ1ZygiUmVhZF9vbGQgc3RyaXBlICVsbHUgIgorCQkJCQkiYmxvY2sgJWQgZm9yIFJlY29uc3RydWN0XG4iLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBpKTsKKwkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOworCQkJCXNldF9iaXQoUjVfV2FudHJlYWQsICZkZXYtPmZsYWdzKTsKKwkJCQlzLT5sb2NrZWQrKzsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGVidWcoIlJlcXVlc3QgZGVsYXllZCBzdHJpcGUgJWxsdSAiCisJCQkJCSJibG9jayAlZCBmb3IgUmVjb25zdHJ1Y3RcbiIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGkpOworCQkJCXNldF9iaXQoU1RSSVBFX0RFTEFZRUQsICZzaC0+c3RhdGUpOworCQkJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CiAJCQl9CiAJCX0KIAl9Ci0JcHJfZGVidWcoImZvciBzZWN0b3IgJWxsdSwgcmN3PSVkLCBtdXN0X2NvbXB1dGU9JWRcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgcmN3LCBtdXN0X2NvbXB1dGUpOwotCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7Ci0KLQlpZiAocmN3ID4gMCkKLQkJLyogd2FudCByZWNvbnN0cnVjdCB3cml0ZSwgYnV0IG5lZWQgdG8gZ2V0IHNvbWUgZGF0YSAqLwotCQlmb3IgKGkgPSBkaXNrczsgaS0tOyApIHsKLQkJCXN0cnVjdCByNWRldiAqZGV2ID0gJnNoLT5kZXZbaV07Ci0JCQlpZiAoIXRlc3RfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpCi0JCQkgICAgJiYgIShzLT5mYWlsZWQgPT0gMCAmJiAoaSA9PSBwZF9pZHggfHwgaSA9PSBxZF9pZHgpKQotCQkJICAgICYmICF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSAmJgotCQkJICAgICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpICYmCi0JCQkgICAgdGVzdF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncykpIHsKLQkJCQlpZiAoCi0JCQkJICB0ZXN0X2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7Ci0JCQkJCXByX2RlYnVnKCJSZWFkX29sZCBzdHJpcGUgJWxsdSAiCi0JCQkJCQkiYmxvY2sgJWQgZm9yIFJlY29uc3RydWN0XG4iLAotCQkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSk7Ci0JCQkJCXNldF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncyk7Ci0JCQkJCXNldF9iaXQoUjVfV2FudHJlYWQsICZkZXYtPmZsYWdzKTsKLQkJCQkJcy0+bG9ja2VkKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJfZGVidWcoIlJlcXVlc3QgZGVsYXllZCBzdHJpcGUgJWxsdSAiCi0JCQkJCQkiYmxvY2sgJWQgZm9yIFJlY29uc3RydWN0XG4iLAotCQkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSk7Ci0JCQkJCXNldF9iaXQoU1RSSVBFX0RFTEFZRUQsICZzaC0+c3RhdGUpOwotCQkJCQlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwotCQkJCX0KLQkJCX0KLQkJfQogCS8qIG5vdyBpZiBub3RoaW5nIGlzIGxvY2tlZCwgYW5kIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEsIHdlIGNhbiBzdGFydCBhCiAJICogd3JpdGUgcmVxdWVzdAogCSAqLwotCWlmIChzLT5sb2NrZWQgPT0gMCAmJiByY3cgPT0gMCAmJgorCWlmICgocy0+cmVxX2NvbXB1dGUgfHwgIXRlc3RfYml0KFNUUklQRV9DT01QVVRFX1JVTiwgJnNoLT5zdGF0ZSkpICYmCisJICAgIHMtPmxvY2tlZCA9PSAwICYmIHJjdyA9PSAwICYmCiAJICAgICF0ZXN0X2JpdChTVFJJUEVfQklUX0RFTEFZLCAmc2gtPnN0YXRlKSkgewotCQlpZiAobXVzdF9jb21wdXRlID4gMCkgewotCQkJLyogV2UgaGF2ZSBmYWlsZWQgYmxvY2tzIGFuZCBuZWVkIHRvIGNvbXB1dGUgdGhlbSAqLwotCQkJc3dpdGNoIChzLT5mYWlsZWQpIHsKLQkJCWNhc2UgMDoKLQkJCQlCVUcoKTsKLQkJCWNhc2UgMToKLQkJCQljb21wdXRlX2Jsb2NrXzEoc2gsIHI2cy0+ZmFpbGVkX251bVswXSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJY29tcHV0ZV9ibG9ja18yKHNoLCByNnMtPmZhaWxlZF9udW1bMF0sCi0JCQkJCQlyNnMtPmZhaWxlZF9udW1bMV0pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDogLyogVGhpcyByZXF1ZXN0IHNob3VsZCBoYXZlIGJlZW4gZmFpbGVkPyAqLwotCQkJCUJVRygpOwotCQkJfQotCQl9Ci0KLQkJcHJfZGVidWcoIkNvbXB1dGluZyBwYXJpdHkgZm9yIHN0cmlwZSAlbGx1XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yKTsKLQkJY29tcHV0ZV9wYXJpdHk2KHNoLCBSRUNPTlNUUlVDVF9XUklURSk7Ci0JCS8qIG5vdyBldmVyeSBsb2NrZWQgYnVmZmVyIGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4gKi8KLQkJZm9yIChpID0gZGlza3M7IGktLTsgKQotCQkJaWYgKHRlc3RfYml0KFI1X0xPQ0tFRCwgJnNoLT5kZXZbaV0uZmxhZ3MpKSB7Ci0JCQkJcHJfZGVidWcoIldyaXRpbmcgc3RyaXBlICVsbHUgYmxvY2sgJWRcbiIsCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSk7Ci0JCQkJcy0+bG9ja2VkKys7Ci0JCQkJc2V0X2JpdChSNV9XYW50d3JpdGUsICZzaC0+ZGV2W2ldLmZsYWdzKTsKLQkJCX0KLQkJaWYgKHMtPmxvY2tlZCA9PSBkaXNrcykKLQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChTVFJJUEVfRlVMTF9XUklURSwgJnNoLT5zdGF0ZSkpCi0JCQkJYXRvbWljX2luYygmY29uZi0+cGVuZGluZ19mdWxsX3dyaXRlcyk7Ci0JCS8qIGFmdGVyIGEgUkVDT05TVFJVQ1RfV1JJVEUsIHRoZSBzdHJpcGUgTVVTVCBiZSBpbi1zeW5jICovCi0JCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7Ci0KLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7Ci0JCQlhdG9taWNfZGVjKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKTsKLQkJCWlmIChhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPAotCQkJICAgIElPX1RIUkVTSE9MRCkKLQkJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOwotCQl9CisJCXNjaGVkdWxlX3JlY29uc3RydWN0aW9uKHNoLCBzLCAxLCAwKTsKIAl9CiB9CiAKQEAgLTI1MjcsNyArMjY2NCw3IEBACiAJCSAqIHdlIGFyZSBkb25lLiAgT3RoZXJ3aXNlIHVwZGF0ZSB0aGUgbWlzbWF0Y2ggY291bnQgYW5kIHJlcGFpcgogCQkgKiBwYXJpdHkgaWYgIU1EX1JFQ09WRVJZX0NIRUNLCiAJCSAqLwotCQlpZiAoc2gtPm9wcy56ZXJvX3N1bV9yZXN1bHQgPT0gMCkKKwkJaWYgKChzaC0+b3BzLnplcm9fc3VtX3Jlc3VsdCAmIFNVTV9DSEVDS19QX1JFU1VMVCkgPT0gMCkKIAkJCS8qIHBhcml0eSBpcyBjb3JyZWN0IChvbiBkaXNjLAogCQkJICogbm90IGluIGJ1ZmZlciBhbnkgbW9yZSkKIAkJCSAqLwpAQCAtMjU0NCw2ICsyNjgxLDcgQEAKIAkJCQlzZXRfYml0KFI1X1dhbnRjb21wdXRlLAogCQkJCQkmc2gtPmRldltzaC0+cGRfaWR4XS5mbGFncyk7CiAJCQkJc2gtPm9wcy50YXJnZXQgPSBzaC0+cGRfaWR4OworCQkJCXNoLT5vcHMudGFyZ2V0MiA9IC0xOwogCQkJCXMtPnVwdG9kYXRlKys7CiAJCQl9CiAJCX0KQEAgLTI1NjAsNjcgKzI2OTgsNzQgQEAKIAogCiBzdGF0aWMgdm9pZCBoYW5kbGVfcGFyaXR5X2NoZWNrczYocmFpZDVfY29uZl90ICpjb25mLCBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLAotCQkJCXN0cnVjdCBzdHJpcGVfaGVhZF9zdGF0ZSAqcywKLQkJCQlzdHJ1Y3QgcjZfc3RhdGUgKnI2cywgc3RydWN0IHBhZ2UgKnRtcF9wYWdlLAotCQkJCWludCBkaXNrcykKKwkJCQkgIHN0cnVjdCBzdHJpcGVfaGVhZF9zdGF0ZSAqcywKKwkJCQkgIHN0cnVjdCByNl9zdGF0ZSAqcjZzLCBpbnQgZGlza3MpCiB7Ci0JaW50IHVwZGF0ZV9wID0gMCwgdXBkYXRlX3EgPSAwOwotCXN0cnVjdCByNWRldiAqZGV2OwogCWludCBwZF9pZHggPSBzaC0+cGRfaWR4OwogCWludCBxZF9pZHggPSBzaC0+cWRfaWR4OworCXN0cnVjdCByNWRldiAqZGV2OwogCiAJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKIAogCUJVR19PTihzLT5mYWlsZWQgPiAyKTsKLQlCVUdfT04ocy0+dXB0b2RhdGUgPCBkaXNrcyk7CisKIAkvKiBXYW50IHRvIGNoZWNrIGFuZCBwb3NzaWJseSByZXBhaXIgUCBhbmQgUS4KIAkgKiBIb3dldmVyIHRoZXJlIGNvdWxkIGJlIG9uZSAnZmFpbGVkJyBkZXZpY2UsIGluIHdoaWNoCiAJICogY2FzZSB3ZSBjYW4gb25seSBjaGVjayBvbmUgb2YgdGhlbSwgcG9zc2libHkgdXNpbmcgdGhlCiAJICogb3RoZXIgdG8gZ2VuZXJhdGUgbWlzc2luZyBkYXRhCiAJICovCiAKLQkvKiBJZiAhdG1wX3BhZ2UsIHdlIGNhbm5vdCBkbyB0aGUgY2FsY3VsYXRpb25zLAotCSAqIGJ1dCBhcyB3ZSBoYXZlIHNldCBTVFJJUEVfSEFORExFLCB3ZSB3aWxsIHNvb24gYmUgY2FsbGVkCi0JICogYnkgc3RyaXBlX2hhbmRsZSB3aXRoIGEgdG1wX3BhZ2UgLSBqdXN0IHdhaXQgdW50aWwgdGhlbi4KLQkgKi8KLQlpZiAodG1wX3BhZ2UpIHsKKwlzd2l0Y2ggKHNoLT5jaGVja19zdGF0ZSkgeworCWNhc2UgY2hlY2tfc3RhdGVfaWRsZToKKwkJLyogc3RhcnQgYSBuZXcgY2hlY2sgb3BlcmF0aW9uIGlmIHRoZXJlIGFyZSA8IDIgZmFpbHVyZXMgKi8KIAkJaWYgKHMtPmZhaWxlZCA9PSByNnMtPnFfZmFpbGVkKSB7Ci0JCQkvKiBUaGUgb25seSBwb3NzaWJsZSBmYWlsZWQgZGV2aWNlIGhvbGRzICdRJywgc28gaXQKKwkJCS8qIFRoZSBvbmx5IHBvc3NpYmxlIGZhaWxlZCBkZXZpY2UgaG9sZHMgUSwgc28gaXQKIAkJCSAqIG1ha2VzIHNlbnNlIHRvIGNoZWNrIFAgKElmIGFueXRoaW5nIGVsc2Ugd2VyZSBmYWlsZWQsCiAJCQkgKiB3ZSB3b3VsZCBoYXZlIHVzZWQgUCB0byByZWNyZWF0ZSBpdCkuCiAJCQkgKi8KLQkJCWNvbXB1dGVfYmxvY2tfMShzaCwgcGRfaWR4LCAxKTsKLQkJCWlmICghcGFnZV9pc196ZXJvKHNoLT5kZXZbcGRfaWR4XS5wYWdlKSkgewotCQkJCWNvbXB1dGVfYmxvY2tfMShzaCwgcGRfaWR4LCAwKTsKLQkJCQl1cGRhdGVfcCA9IDE7Ci0JCQl9CisJCQlzaC0+Y2hlY2tfc3RhdGUgPSBjaGVja19zdGF0ZV9ydW47CiAJCX0KIAkJaWYgKCFyNnMtPnFfZmFpbGVkICYmIHMtPmZhaWxlZCA8IDIpIHsKLQkJCS8qIHEgaXMgbm90IGZhaWxlZCwgYW5kIHdlIGRpZG4ndCB1c2UgaXQgdG8gZ2VuZXJhdGUKKwkJCS8qIFEgaXMgbm90IGZhaWxlZCwgYW5kIHdlIGRpZG4ndCB1c2UgaXQgdG8gZ2VuZXJhdGUKIAkJCSAqIGFueXRoaW5nLCBzbyBpdCBtYWtlcyBzZW5zZSB0byBjaGVjayBpdAogCQkJICovCi0JCQltZW1jcHkocGFnZV9hZGRyZXNzKHRtcF9wYWdlKSwKLQkJCSAgICAgICBwYWdlX2FkZHJlc3Moc2gtPmRldltxZF9pZHhdLnBhZ2UpLAotCQkJICAgICAgIFNUUklQRV9TSVpFKTsKLQkJCWNvbXB1dGVfcGFyaXR5NihzaCwgVVBEQVRFX1BBUklUWSk7Ci0JCQlpZiAobWVtY21wKHBhZ2VfYWRkcmVzcyh0bXBfcGFnZSksCi0JCQkJICAgcGFnZV9hZGRyZXNzKHNoLT5kZXZbcWRfaWR4XS5wYWdlKSwKLQkJCQkgICBTVFJJUEVfU0laRSkgIT0gMCkgewotCQkJCWNsZWFyX2JpdChTVFJJUEVfSU5TWU5DLCAmc2gtPnN0YXRlKTsKLQkJCQl1cGRhdGVfcSA9IDE7Ci0JCQl9CisJCQlpZiAoc2gtPmNoZWNrX3N0YXRlID09IGNoZWNrX3N0YXRlX3J1bikKKwkJCQlzaC0+Y2hlY2tfc3RhdGUgPSBjaGVja19zdGF0ZV9ydW5fcHE7CisJCQllbHNlCisJCQkJc2gtPmNoZWNrX3N0YXRlID0gY2hlY2tfc3RhdGVfcnVuX3E7CiAJCX0KLQkJaWYgKHVwZGF0ZV9wIHx8IHVwZGF0ZV9xKSB7Ci0JCQljb25mLT5tZGRldi0+cmVzeW5jX21pc21hdGNoZXMgKz0gU1RSSVBFX1NFQ1RPUlM7Ci0JCQlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfQ0hFQ0ssICZjb25mLT5tZGRldi0+cmVjb3ZlcnkpKQotCQkJCS8qIGRvbid0IHRyeSB0byByZXBhaXIhISAqLwotCQkJCXVwZGF0ZV9wID0gdXBkYXRlX3EgPSAwOworCisJCS8qIGRpc2NhcmQgcG90ZW50aWFsbHkgc3RhbGUgemVyb19zdW1fcmVzdWx0ICovCisJCXNoLT5vcHMuemVyb19zdW1fcmVzdWx0ID0gMDsKKworCQlpZiAoc2gtPmNoZWNrX3N0YXRlID09IGNoZWNrX3N0YXRlX3J1bikgeworCQkJLyogYXN5bmNfeG9yX3plcm9fc3VtIGRlc3Ryb3lzIHRoZSBjb250ZW50cyBvZiBQICovCisJCQljbGVhcl9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W3BkX2lkeF0uZmxhZ3MpOworCQkJcy0+dXB0b2RhdGUtLTsKIAkJfQorCQlpZiAoc2gtPmNoZWNrX3N0YXRlID49IGNoZWNrX3N0YXRlX3J1biAmJgorCQkgICAgc2gtPmNoZWNrX3N0YXRlIDw9IGNoZWNrX3N0YXRlX3J1bl9wcSkgeworCQkJLyogYXN5bmNfc3luZHJvbWVfemVyb19zdW0gcHJlc2VydmVzIFAgYW5kIFEsIHNvCisJCQkgKiBubyBuZWVkIHRvIG1hcmsgdGhlbSAhdXB0b2RhdGUgaGVyZQorCQkJICovCisJCQlzZXRfYml0KFNUUklQRV9PUF9DSEVDSywgJnMtPm9wc19yZXF1ZXN0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogd2UgaGF2ZSAyLWRpc2sgZmFpbHVyZSAqLworCQlCVUdfT04ocy0+ZmFpbGVkICE9IDIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIGNoZWNrX3N0YXRlX2NvbXB1dGVfcmVzdWx0OgorCQlzaC0+Y2hlY2tfc3RhdGUgPSBjaGVja19zdGF0ZV9pZGxlOworCisJCS8qIGNoZWNrIHRoYXQgYSB3cml0ZSBoYXMgbm90IG1hZGUgdGhlIHN0cmlwZSBpbnN5bmMgKi8KKwkJaWYgKHRlc3RfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpKQorCQkJYnJlYWs7CiAKIAkJLyogbm93IHdyaXRlIG91dCBhbnkgYmxvY2sgb24gYSBmYWlsZWQgZHJpdmUsCi0JCSAqIG9yIFAgb3IgUSBpZiB0aGV5IG5lZWQgaXQKKwkJICogb3IgUCBvciBRIGlmIHRoZXkgd2VyZSByZWNvbXB1dGVkCiAJCSAqLwotCisJCUJVR19PTihzLT51cHRvZGF0ZSA8IGRpc2tzIC0gMSk7IC8qIFdlIGRvbid0IG5lZWQgUSB0byByZWNvdmVyICovCiAJCWlmIChzLT5mYWlsZWQgPT0gMikgewogCQkJZGV2ID0gJnNoLT5kZXZbcjZzLT5mYWlsZWRfbnVtWzFdXTsKIAkJCXMtPmxvY2tlZCsrOwpAQCAtMjYzMywxNCArMjc3OCwxMyBAQAogCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKIAkJCXNldF9iaXQoUjVfV2FudHdyaXRlLCAmZGV2LT5mbGFncyk7CiAJCX0KLQotCQlpZiAodXBkYXRlX3ApIHsKKwkJaWYgKHNoLT5vcHMuemVyb19zdW1fcmVzdWx0ICYgU1VNX0NIRUNLX1BfUkVTVUxUKSB7CiAJCQlkZXYgPSAmc2gtPmRldltwZF9pZHhdOwogCQkJcy0+bG9ja2VkKys7CiAJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOwogCQkJc2V0X2JpdChSNV9XYW50d3JpdGUsICZkZXYtPmZsYWdzKTsKIAkJfQotCQlpZiAodXBkYXRlX3EpIHsKKwkJaWYgKHNoLT5vcHMuemVyb19zdW1fcmVzdWx0ICYgU1VNX0NIRUNLX1FfUkVTVUxUKSB7CiAJCQlkZXYgPSAmc2gtPmRldltxZF9pZHhdOwogCQkJcy0+bG9ja2VkKys7CiAJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOwpAQCAtMjY0OSw2ICsyNzkzLDcwIEBACiAJCWNsZWFyX2JpdChTVFJJUEVfREVHUkFERUQsICZzaC0+c3RhdGUpOwogCiAJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgY2hlY2tfc3RhdGVfcnVuOgorCWNhc2UgY2hlY2tfc3RhdGVfcnVuX3E6CisJY2FzZSBjaGVja19zdGF0ZV9ydW5fcHE6CisJCWJyZWFrOyAvKiB3ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB1cG9uIGNvbXBsZXRpb24gKi8KKwljYXNlIGNoZWNrX3N0YXRlX2NoZWNrX3Jlc3VsdDoKKwkJc2gtPmNoZWNrX3N0YXRlID0gY2hlY2tfc3RhdGVfaWRsZTsKKworCQkvKiBoYW5kbGUgYSBzdWNjZXNzZnVsIGNoZWNrIG9wZXJhdGlvbiwgaWYgcGFyaXR5IGlzIGNvcnJlY3QKKwkJICogd2UgYXJlIGRvbmUuICBPdGhlcndpc2UgdXBkYXRlIHRoZSBtaXNtYXRjaCBjb3VudCBhbmQgcmVwYWlyCisJCSAqIHBhcml0eSBpZiAhTURfUkVDT1ZFUllfQ0hFQ0sKKwkJICovCisJCWlmIChzaC0+b3BzLnplcm9fc3VtX3Jlc3VsdCA9PSAwKSB7CisJCQkvKiBib3RoIHBhcml0aWVzIGFyZSBjb3JyZWN0ICovCisJCQlpZiAoIXMtPmZhaWxlZCkKKwkJCQlzZXRfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOworCQkJZWxzZSB7CisJCQkJLyogaW4gY29udHJhc3QgdG8gdGhlIHJhaWQ1IGNhc2Ugd2UgY2FuIHZhbGlkYXRlCisJCQkJICogcGFyaXR5LCBidXQgc3RpbGwgaGF2ZSBhIGZhaWx1cmUgdG8gd3JpdGUKKwkJCQkgKiBiYWNrCisJCQkJICovCisJCQkJc2gtPmNoZWNrX3N0YXRlID0gY2hlY2tfc3RhdGVfY29tcHV0ZV9yZXN1bHQ7CisJCQkJLyogUmV0dXJuaW5nIGF0IHRoaXMgcG9pbnQgbWVhbnMgdGhhdCB3ZSBtYXkgZ28KKwkJCQkgKiBvZmYgYW5kIGJyaW5nIHAgYW5kL29yIHEgdXB0b2RhdGUgYWdhaW4gc28KKwkJCQkgKiB3ZSBtYWtlIHN1cmUgdG8gY2hlY2sgemVyb19zdW1fcmVzdWx0IGFnYWluCisJCQkJICogdG8gdmVyaWZ5IGlmIHAgb3IgcSBuZWVkIHdyaXRlYmFjaworCQkJCSAqLworCQkJfQorCQl9IGVsc2UgeworCQkJY29uZi0+bWRkZXYtPnJlc3luY19taXNtYXRjaGVzICs9IFNUUklQRV9TRUNUT1JTOworCQkJaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX0NIRUNLLCAmY29uZi0+bWRkZXYtPnJlY292ZXJ5KSkKKwkJCQkvKiBkb24ndCB0cnkgdG8gcmVwYWlyISEgKi8KKwkJCQlzZXRfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpOworCQkJZWxzZSB7CisJCQkJaW50ICp0YXJnZXQgPSAmc2gtPm9wcy50YXJnZXQ7CisKKwkJCQlzaC0+b3BzLnRhcmdldCA9IC0xOworCQkJCXNoLT5vcHMudGFyZ2V0MiA9IC0xOworCQkJCXNoLT5jaGVja19zdGF0ZSA9IGNoZWNrX3N0YXRlX2NvbXB1dGVfcnVuOworCQkJCXNldF9iaXQoU1RSSVBFX0NPTVBVVEVfUlVOLCAmc2gtPnN0YXRlKTsKKwkJCQlzZXRfYml0KFNUUklQRV9PUF9DT01QVVRFX0JMSywgJnMtPm9wc19yZXF1ZXN0KTsKKwkJCQlpZiAoc2gtPm9wcy56ZXJvX3N1bV9yZXN1bHQgJiBTVU1fQ0hFQ0tfUF9SRVNVTFQpIHsKKwkJCQkJc2V0X2JpdChSNV9XYW50Y29tcHV0ZSwKKwkJCQkJCSZzaC0+ZGV2W3BkX2lkeF0uZmxhZ3MpOworCQkJCQkqdGFyZ2V0ID0gcGRfaWR4OworCQkJCQl0YXJnZXQgPSAmc2gtPm9wcy50YXJnZXQyOworCQkJCQlzLT51cHRvZGF0ZSsrOworCQkJCX0KKwkJCQlpZiAoc2gtPm9wcy56ZXJvX3N1bV9yZXN1bHQgJiBTVU1fQ0hFQ0tfUV9SRVNVTFQpIHsKKwkJCQkJc2V0X2JpdChSNV9XYW50Y29tcHV0ZSwKKwkJCQkJCSZzaC0+ZGV2W3FkX2lkeF0uZmxhZ3MpOworCQkJCQkqdGFyZ2V0ID0gcWRfaWR4OworCQkJCQlzLT51cHRvZGF0ZSsrOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIGNoZWNrX3N0YXRlX2NvbXB1dGVfcnVuOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmtub3duIGNoZWNrX3N0YXRlOiAlZCBzZWN0b3I6ICVsbHVcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc2gtPmNoZWNrX3N0YXRlLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2gtPnNlY3Rvcik7CisJCUJVRygpOwogCX0KIH0KIApAQCAtMjY2Niw2ICsyODc0LDcgQEAKIAkJaWYgKGkgIT0gc2gtPnBkX2lkeCAmJiBpICE9IHNoLT5xZF9pZHgpIHsKIAkJCWludCBkZF9pZHgsIGo7CiAJCQlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoMjsKKwkJCXN0cnVjdCBhc3luY19zdWJtaXRfY3RsIHN1Ym1pdDsKIAogCQkJc2VjdG9yX3QgYm4gPSBjb21wdXRlX2Jsb2NrbnIoc2gsIGksIDEpOwogCQkJc2VjdG9yX3QgcyA9IHJhaWQ1X2NvbXB1dGVfc2VjdG9yKGNvbmYsIGJuLCAwLApAQCAtMjY4NSw5ICsyODk0LDEwIEBACiAJCQl9CiAKIAkJCS8qIHBsYWNlIGFsbCB0aGUgY29waWVzIG9uIG9uZSBjaGFubmVsICovCisJCQlpbml0X2FzeW5jX3N1Ym1pdCgmc3VibWl0LCAwLCB0eCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAJCQl0eCA9IGFzeW5jX21lbWNweShzaDItPmRldltkZF9pZHhdLnBhZ2UsCi0JCQkJc2gtPmRldltpXS5wYWdlLCAwLCAwLCBTVFJJUEVfU0laRSwKLQkJCQlBU1lOQ19UWF9ERVBfQUNLLCB0eCwgTlVMTCwgTlVMTCk7CisJCQkJCSAgc2gtPmRldltpXS5wYWdlLCAwLCAwLCBTVFJJUEVfU0laRSwKKwkJCQkJICAmc3VibWl0KTsKIAogCQkJc2V0X2JpdChSNV9FeHBhbmRlZCwgJnNoMi0+ZGV2W2RkX2lkeF0uZmxhZ3MpOwogCQkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoMi0+ZGV2W2RkX2lkeF0uZmxhZ3MpOwpAQCAtMjcyOCw3ICsyOTM4LDcgQEAKICAqCiAgKi8KIAotc3RhdGljIGJvb2wgaGFuZGxlX3N0cmlwZTUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKK3N0YXRpYyB2b2lkIGhhbmRsZV9zdHJpcGU1KHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCiB7CiAJcmFpZDVfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKIAlpbnQgZGlza3MgPSBzaC0+ZGlza3MsIGk7CkBAIC0yNzU2LDcgKzI5NjYsOCBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGk9ZGlza3M7IGktLTsgKSB7CiAJCW1ka19yZGV2X3QgKnJkZXY7Ci0JCXN0cnVjdCByNWRldiAqZGV2ID0gJnNoLT5kZXZbaV07CisKKwkJZGV2ID0gJnNoLT5kZXZbaV07CiAJCWNsZWFyX2JpdChSNV9JbnN5bmMsICZkZXYtPmZsYWdzKTsKIAogCQlwcl9kZWJ1ZygiY2hlY2sgJWQ6IHN0YXRlIDB4JWx4IHRvcmVhZCAlcCByZWFkICVwIHdyaXRlICVwICIKQEAgLTI5NzMsNyArMzE4NCw3IEBACiAJCS8qIE5lZWQgdG8gd3JpdGUgb3V0IGFsbCBibG9ja3MgYWZ0ZXIgY29tcHV0aW5nIHBhcml0eSAqLwogCQlzaC0+ZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzOwogCQlzdHJpcGVfc2V0X2lkeChzaC0+c2VjdG9yLCBjb25mLCAwLCBzaCk7Ci0JCXNjaGVkdWxlX3JlY29uc3RydWN0aW9uNShzaCwgJnMsIDEsIDEpOworCQlzY2hlZHVsZV9yZWNvbnN0cnVjdGlvbihzaCwgJnMsIDEsIDEpOwogCX0gZWxzZSBpZiAocy5leHBhbmRlZCAmJiAhc2gtPnJlY29uc3RydWN0X3N0YXRlICYmIHMubG9ja2VkID09IDApIHsKIAkJY2xlYXJfYml0KFNUUklQRV9FWFBBTkRfUkVBRFksICZzaC0+c3RhdGUpOwogCQlhdG9taWNfZGVjKCZjb25mLT5yZXNoYXBlX3N0cmlwZXMpOwpAQCAtMjk5MywxNiArMzIwNCwxNCBAQAogCQltZF93YWl0X2Zvcl9ibG9ja2VkX3JkZXYoYmxvY2tlZF9yZGV2LCBjb25mLT5tZGRldik7CiAKIAlpZiAocy5vcHNfcmVxdWVzdCkKLQkJcmFpZDVfcnVuX29wcyhzaCwgcy5vcHNfcmVxdWVzdCk7CisJCXJhaWRfcnVuX29wcyhzaCwgcy5vcHNfcmVxdWVzdCk7CiAKIAlvcHNfcnVuX2lvKHNoLCAmcyk7CiAKIAlyZXR1cm5faW8ocmV0dXJuX2JpKTsKLQotCXJldHVybiBibG9ja2VkX3JkZXYgPT0gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgaGFuZGxlX3N0cmlwZTYoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc3RydWN0IHBhZ2UgKnRtcF9wYWdlKQorc3RhdGljIHZvaWQgaGFuZGxlX3N0cmlwZTYoc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKIHsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOwogCWludCBkaXNrcyA9IHNoLT5kaXNrczsKQEAgLTMwMTQsOSArMzIyMywxMCBAQAogCW1ka19yZGV2X3QgKmJsb2NrZWRfcmRldiA9IE5VTEw7CiAKIAlwcl9kZWJ1ZygiaGFuZGxpbmcgc3RyaXBlICVsbHUsIHN0YXRlPSUjbHggY250PSVkLCAiCi0JCSJwZF9pZHg9JWQsIHFkX2lkeD0lZFxuIiwKKwkJInBkX2lkeD0lZCwgcWRfaWR4PSVkXG4sIGNoZWNrOiVkLCByZWNvbnN0cnVjdDolZFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yLCBzaC0+c3RhdGUsCi0JICAgICAgIGF0b21pY19yZWFkKCZzaC0+Y291bnQpLCBwZF9pZHgsIHFkX2lkeCk7CisJICAgICAgIGF0b21pY19yZWFkKCZzaC0+Y291bnQpLCBwZF9pZHgsIHFkX2lkeCwKKwkgICAgICAgc2gtPmNoZWNrX3N0YXRlLCBzaC0+cmVjb25zdHJ1Y3Rfc3RhdGUpOwogCW1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKIAogCXNwaW5fbG9jaygmc2gtPmxvY2spOwpAQCAtMzAzNiwzNSArMzI0NiwyNiBAQAogCiAJCXByX2RlYnVnKCJjaGVjayAlZDogc3RhdGUgMHglbHggcmVhZCAlcCB3cml0ZSAlcCB3cml0dGVuICVwXG4iLAogCQkJaSwgZGV2LT5mbGFncywgZGV2LT50b3JlYWQsIGRldi0+dG93cml0ZSwgZGV2LT53cml0dGVuKTsKLQkJLyogbWF5YmUgd2UgY2FuIHJlcGx5IHRvIGEgcmVhZCAqLwotCQlpZiAodGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSAmJiBkZXYtPnRvcmVhZCkgewotCQkJc3RydWN0IGJpbyAqcmJpLCAqcmJpMjsKLQkJCXByX2RlYnVnKCJSZXR1cm4gcmVhZCBmb3IgZGlzYyAlZFxuIiwgaSk7Ci0JCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JCQlyYmkgPSBkZXYtPnRvcmVhZDsKLQkJCWRldi0+dG9yZWFkID0gTlVMTDsKLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfT3ZlcmxhcCwgJmRldi0+ZmxhZ3MpKQotCQkJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JCQl3aGlsZSAocmJpICYmIHJiaS0+Ymlfc2VjdG9yIDwgZGV2LT5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewotCQkJCWNvcHlfZGF0YSgwLCByYmksIGRldi0+cGFnZSwgZGV2LT5zZWN0b3IpOwotCQkJCXJiaTIgPSByNV9uZXh0X2JpbyhyYmksIGRldi0+c2VjdG9yKTsKLQkJCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JCQkJaWYgKCFyYWlkNV9kZWNfYmlfcGh5c19zZWdtZW50cyhyYmkpKSB7Ci0JCQkJCXJiaS0+YmlfbmV4dCA9IHJldHVybl9iaTsKLQkJCQkJcmV0dXJuX2JpID0gcmJpOwotCQkJCX0KLQkJCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQkJCQlyYmkgPSByYmkyOwotCQkJfQotCQl9CisJCS8qIG1heWJlIHdlIGNhbiByZXBseSB0byBhIHJlYWQKKwkJICoKKwkJICogbmV3IHdhbnRmaWxsIHJlcXVlc3RzIGFyZSBvbmx5IHBlcm1pdHRlZCB3aGlsZQorCQkgKiBvcHNfY29tcGxldGVfYmlvZmlsbCBpcyBndWFyYW50ZWVkIHRvIGJlIGluYWN0aXZlCisJCSAqLworCQlpZiAodGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSAmJiBkZXYtPnRvcmVhZCAmJgorCQkgICAgIXRlc3RfYml0KFNUUklQRV9CSU9GSUxMX1JVTiwgJnNoLT5zdGF0ZSkpCisJCQlzZXRfYml0KFI1X1dhbnRmaWxsLCAmZGV2LT5mbGFncyk7CiAKIAkJLyogbm93IGNvdW50IHNvbWUgdGhpbmdzICovCiAJCWlmICh0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSkgcy5sb2NrZWQrKzsKIAkJaWYgKHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncykpIHMudXB0b2RhdGUrKzsKKwkJaWYgKHRlc3RfYml0KFI1X1dhbnRjb21wdXRlLCAmZGV2LT5mbGFncykpIHsKKwkJCXMuY29tcHV0ZSsrOworCQkJQlVHX09OKHMuY29tcHV0ZSA+IDIpOworCQl9CiAKLQotCQlpZiAoZGV2LT50b3JlYWQpCisJCWlmICh0ZXN0X2JpdChSNV9XYW50ZmlsbCwgJmRldi0+ZmxhZ3MpKSB7CisJCQlzLnRvX2ZpbGwrKzsKKwkJfSBlbHNlIGlmIChkZXYtPnRvcmVhZCkKIAkJCXMudG9fcmVhZCsrOwogCQlpZiAoZGV2LT50b3dyaXRlKSB7CiAJCQlzLnRvX3dyaXRlKys7CkBAIC0zMTA1LDYgKzMzMDYsMTEgQEAKIAkJYmxvY2tlZF9yZGV2ID0gTlVMTDsKIAl9CiAKKwlpZiAocy50b19maWxsICYmICF0ZXN0X2JpdChTVFJJUEVfQklPRklMTF9SVU4sICZzaC0+c3RhdGUpKSB7CisJCXNldF9iaXQoU1RSSVBFX09QX0JJT0ZJTEwsICZzLm9wc19yZXF1ZXN0KTsKKwkJc2V0X2JpdChTVFJJUEVfQklPRklMTF9SVU4sICZzaC0+c3RhdGUpOworCX0KKwogCXByX2RlYnVnKCJsb2NrZWQ9JWQgdXB0b2RhdGU9JWQgdG9fcmVhZD0lZCIKIAkgICAgICAgIiB0b193cml0ZT0lZCBmYWlsZWQ9JWQgZmFpbGVkX251bT0lZCwlZFxuIiwKIAkgICAgICAgcy5sb2NrZWQsIHMudXB0b2RhdGUsIHMudG9fcmVhZCwgcy50b193cml0ZSwgcy5mYWlsZWQsCkBAIC0zMTQ1LDE5ICszMzUxLDYyIEBACiAJICogb3IgdG8gbG9hZCBhIGJsb2NrIHRoYXQgaXMgYmVpbmcgcGFydGlhbGx5IHdyaXR0ZW4uCiAJICovCiAJaWYgKHMudG9fcmVhZCB8fCBzLm5vbl9vdmVyd3JpdGUgfHwgKHMudG9fd3JpdGUgJiYgcy5mYWlsZWQpIHx8Ci0JICAgIChzLnN5bmNpbmcgJiYgKHMudXB0b2RhdGUgPCBkaXNrcykpIHx8IHMuZXhwYW5kaW5nKQorCSAgICAocy5zeW5jaW5nICYmIChzLnVwdG9kYXRlICsgcy5jb21wdXRlIDwgZGlza3MpKSB8fCBzLmV4cGFuZGluZykKIAkJaGFuZGxlX3N0cmlwZV9maWxsNihzaCwgJnMsICZyNnMsIGRpc2tzKTsKIAotCS8qIG5vdyB0byBjb25zaWRlciB3cml0aW5nIGFuZCB3aGF0IGVsc2UsIGlmIGFueXRoaW5nIHNob3VsZCBiZSByZWFkICovCi0JaWYgKHMudG9fd3JpdGUpCisJLyogTm93IHdlIGNoZWNrIHRvIHNlZSBpZiBhbnkgd3JpdGUgb3BlcmF0aW9ucyBoYXZlIHJlY2VudGx5CisJICogY29tcGxldGVkCisJICovCisJaWYgKHNoLT5yZWNvbnN0cnVjdF9zdGF0ZSA9PSByZWNvbnN0cnVjdF9zdGF0ZV9kcmFpbl9yZXN1bHQpIHsKKwkJaW50IHFkX2lkeCA9IHNoLT5xZF9pZHg7CisKKwkJc2gtPnJlY29uc3RydWN0X3N0YXRlID0gcmVjb25zdHJ1Y3Rfc3RhdGVfaWRsZTsKKwkJLyogQWxsIHRoZSAnd3JpdHRlbicgYnVmZmVycyBhbmQgdGhlIHBhcml0eSBibG9ja3MgYXJlIHJlYWR5IHRvCisJCSAqIGJlIHdyaXR0ZW4gYmFjayB0byBkaXNrCisJCSAqLworCQlCVUdfT04oIXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltzaC0+cGRfaWR4XS5mbGFncykpOworCQlCVUdfT04oIXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltxZF9pZHhdLmZsYWdzKSk7CisJCWZvciAoaSA9IGRpc2tzOyBpLS07ICkgeworCQkJZGV2ID0gJnNoLT5kZXZbaV07CisJCQlpZiAodGVzdF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncykgJiYKKwkJCSAgICAoaSA9PSBzaC0+cGRfaWR4IHx8IGkgPT0gcWRfaWR4IHx8CisJCQkgICAgIGRldi0+d3JpdHRlbikpIHsKKwkJCQlwcl9kZWJ1ZygiV3JpdGluZyBibG9jayAlZFxuIiwgaSk7CisJCQkJQlVHX09OKCF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKTsKKwkJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJmRldi0+ZmxhZ3MpOworCQkJCWlmICghdGVzdF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncykgfHwKKwkJCQkgICAgKChpID09IHNoLT5wZF9pZHggfHwgaSA9PSBxZF9pZHgpICYmCisJCQkJICAgICAgcy5mYWlsZWQgPT0gMCkpCisJCQkJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CisJCQl9CisJCX0KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7CisJCQlhdG9taWNfZGVjKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKTsKKwkJCWlmIChhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPAorCQkJCUlPX1RIUkVTSE9MRCkKKwkJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOworCQl9CisJfQorCisJLyogTm93IHRvIGNvbnNpZGVyIG5ldyB3cml0ZSByZXF1ZXN0cyBhbmQgd2hhdCBlbHNlLCBpZiBhbnl0aGluZworCSAqIHNob3VsZCBiZSByZWFkLiAgV2UgZG8gbm90IGhhbmRsZSBuZXcgd3JpdGVzIHdoZW46CisJICogMS8gQSAnd3JpdGUnIG9wZXJhdGlvbiAoY29weStnZW5fc3luZHJvbWUpIGlzIGFscmVhZHkgaW4gZmxpZ2h0LgorCSAqIDIvIEEgJ2NoZWNrJyBvcGVyYXRpb24gaXMgaW4gZmxpZ2h0LCBhcyBpdCBtYXkgY2xvYmJlciB0aGUgcGFyaXR5CisJICogICAgYmxvY2suCisJICovCisJaWYgKHMudG9fd3JpdGUgJiYgIXNoLT5yZWNvbnN0cnVjdF9zdGF0ZSAmJiAhc2gtPmNoZWNrX3N0YXRlKQogCQloYW5kbGVfc3RyaXBlX2RpcnR5aW5nNihjb25mLCBzaCwgJnMsICZyNnMsIGRpc2tzKTsKIAogCS8qIG1heWJlIHdlIG5lZWQgdG8gY2hlY2sgYW5kIHBvc3NpYmx5IGZpeCB0aGUgcGFyaXR5IGZvciB0aGlzIHN0cmlwZQogCSAqIEFueSByZWFkcyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHNjaGVkdWxlZCwgc28gd2UganVzdCBzZWUgaWYgZW5vdWdoCi0JICogZGF0YSBpcyBhdmFpbGFibGUKKwkgKiBkYXRhIGlzIGF2YWlsYWJsZS4gIFRoZSBwYXJpdHkgY2hlY2sgaXMgaGVsZCBvZmYgd2hpbGUgcGFyaXR5CisJICogZGVwZW5kZW50IG9wZXJhdGlvbnMgYXJlIGluIGZsaWdodC4KIAkgKi8KLQlpZiAocy5zeW5jaW5nICYmIHMubG9ja2VkID09IDAgJiYgIXRlc3RfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpKQotCQloYW5kbGVfcGFyaXR5X2NoZWNrczYoY29uZiwgc2gsICZzLCAmcjZzLCB0bXBfcGFnZSwgZGlza3MpOworCWlmIChzaC0+Y2hlY2tfc3RhdGUgfHwKKwkgICAgKHMuc3luY2luZyAmJiBzLmxvY2tlZCA9PSAwICYmCisJICAgICAhdGVzdF9iaXQoU1RSSVBFX0NPTVBVVEVfUlVOLCAmc2gtPnN0YXRlKSAmJgorCSAgICAgIXRlc3RfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpKSkKKwkJaGFuZGxlX3Bhcml0eV9jaGVja3M2KGNvbmYsIHNoLCAmcywgJnI2cywgZGlza3MpOwogCiAJaWYgKHMuc3luY2luZyAmJiBzLmxvY2tlZCA9PSAwICYmIHRlc3RfYml0KFNUUklQRV9JTlNZTkMsICZzaC0+c3RhdGUpKSB7CiAJCW1kX2RvbmVfc3luYyhjb25mLT5tZGRldiwgU1RSSVBFX1NFQ1RPUlMsMSk7CkBAIC0zMTc4LDE1ICszNDI3LDI5IEBACiAJCQkJCXNldF9iaXQoUjVfV2FudHdyaXRlLCAmZGV2LT5mbGFncyk7CiAJCQkJCXNldF9iaXQoUjVfUmVXcml0ZSwgJmRldi0+ZmxhZ3MpOwogCQkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOworCQkJCQlzLmxvY2tlZCsrOwogCQkJCX0gZWxzZSB7CiAJCQkJCS8qIGxldCdzIHJlYWQgaXQgYmFjayAqLwogCQkJCQlzZXRfYml0KFI1X1dhbnRyZWFkLCAmZGV2LT5mbGFncyk7CiAJCQkJCXNldF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncyk7CisJCQkJCXMubG9ja2VkKys7CiAJCQkJfQogCQkJfQogCQl9CiAKLQlpZiAocy5leHBhbmRlZCAmJiB0ZXN0X2JpdChTVFJJUEVfRVhQQU5ESU5HLCAmc2gtPnN0YXRlKSkgeworCS8qIEZpbmlzaCByZWNvbnN0cnVjdCBvcGVyYXRpb25zIGluaXRpYXRlZCBieSB0aGUgZXhwYW5zaW9uIHByb2Nlc3MgKi8KKwlpZiAoc2gtPnJlY29uc3RydWN0X3N0YXRlID09IHJlY29uc3RydWN0X3N0YXRlX3Jlc3VsdCkgeworCQlzaC0+cmVjb25zdHJ1Y3Rfc3RhdGUgPSByZWNvbnN0cnVjdF9zdGF0ZV9pZGxlOworCQljbGVhcl9iaXQoU1RSSVBFX0VYUEFORElORywgJnNoLT5zdGF0ZSk7CisJCWZvciAoaSA9IGNvbmYtPnJhaWRfZGlza3M7IGktLTsgKSB7CisJCQlzZXRfYml0KFI1X1dhbnR3cml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpOworCQkJc2V0X2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKKwkJCXMubG9ja2VkKys7CisJCX0KKwl9CisKKwlpZiAocy5leHBhbmRlZCAmJiB0ZXN0X2JpdChTVFJJUEVfRVhQQU5ESU5HLCAmc2gtPnN0YXRlKSAmJgorCSAgICAhc2gtPnJlY29uc3RydWN0X3N0YXRlKSB7CiAJCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2gyCiAJCQk9IGdldF9hY3RpdmVfc3RyaXBlKGNvbmYsIHNoLT5zZWN0b3IsIDEsIDEsIDEpOwogCQlpZiAoc2gyICYmIHRlc3RfYml0KFNUUklQRV9FWFBBTkRfU09VUkNFLCAmc2gyLT5zdGF0ZSkpIHsKQEAgLTMyMDcsMTQgKzM0NzAsOCBAQAogCQkvKiBOZWVkIHRvIHdyaXRlIG91dCBhbGwgYmxvY2tzIGFmdGVyIGNvbXB1dGluZyBQJlEgKi8KIAkJc2gtPmRpc2tzID0gY29uZi0+cmFpZF9kaXNrczsKIAkJc3RyaXBlX3NldF9pZHgoc2gtPnNlY3RvciwgY29uZiwgMCwgc2gpOwotCQljb21wdXRlX3Bhcml0eTYoc2gsIFJFQ09OU1RSVUNUX1dSSVRFKTsKLQkJZm9yIChpID0gY29uZi0+cmFpZF9kaXNrcyA7IGktLSA7ICApIHsKLQkJCXNldF9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncyk7Ci0JCQlzLmxvY2tlZCsrOwotCQkJc2V0X2JpdChSNV9XYW50d3JpdGUsICZzaC0+ZGV2W2ldLmZsYWdzKTsKLQkJfQotCQljbGVhcl9iaXQoU1RSSVBFX0VYUEFORElORywgJnNoLT5zdGF0ZSk7Ci0JfSBlbHNlIGlmIChzLmV4cGFuZGVkKSB7CisJCXNjaGVkdWxlX3JlY29uc3RydWN0aW9uKHNoLCAmcywgMSwgMSk7CisJfSBlbHNlIGlmIChzLmV4cGFuZGVkICYmICFzaC0+cmVjb25zdHJ1Y3Rfc3RhdGUgJiYgcy5sb2NrZWQgPT0gMCkgewogCQljbGVhcl9iaXQoU1RSSVBFX0VYUEFORF9SRUFEWSwgJnNoLT5zdGF0ZSk7CiAJCWF0b21pY19kZWMoJmNvbmYtPnJlc2hhcGVfc3RyaXBlcyk7CiAJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX292ZXJsYXApOwpAQCAtMzIzMiwyNCArMzQ4OSwyMiBAQAogCWlmICh1bmxpa2VseShibG9ja2VkX3JkZXYpKQogCQltZF93YWl0X2Zvcl9ibG9ja2VkX3JkZXYoYmxvY2tlZF9yZGV2LCBjb25mLT5tZGRldik7CiAKKwlpZiAocy5vcHNfcmVxdWVzdCkKKwkJcmFpZF9ydW5fb3BzKHNoLCBzLm9wc19yZXF1ZXN0KTsKKwogCW9wc19ydW5faW8oc2gsICZzKTsKIAogCXJldHVybl9pbyhyZXR1cm5fYmkpOwotCi0JcmV0dXJuIGJsb2NrZWRfcmRldiA9PSBOVUxMOwogfQogCi0vKiByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmlwZSB3YXMgaGFuZGxlZCAqLwotc3RhdGljIGJvb2wgaGFuZGxlX3N0cmlwZShzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzdHJ1Y3QgcGFnZSAqdG1wX3BhZ2UpCitzdGF0aWMgdm9pZCBoYW5kbGVfc3RyaXBlKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCiB7CiAJaWYgKHNoLT5yYWlkX2NvbmYtPmxldmVsID09IDYpCi0JCXJldHVybiBoYW5kbGVfc3RyaXBlNihzaCwgdG1wX3BhZ2UpOworCQloYW5kbGVfc3RyaXBlNihzaCk7CiAJZWxzZQotCQlyZXR1cm4gaGFuZGxlX3N0cmlwZTUoc2gpOworCQloYW5kbGVfc3RyaXBlNShzaCk7CiB9CiAKLQotCiBzdGF0aWMgdm9pZCByYWlkNV9hY3RpdmF0ZV9kZWxheWVkKHJhaWQ1X2NvbmZfdCAqY29uZikKIHsKIAlpZiAoYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpIDwgSU9fVEhSRVNIT0xEKSB7CkBAIC0zMjg1LDkgKzM1NDAsMTAgQEAKIHsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlpbnQgaTsKKwlpbnQgZGV2cyA9IG1heChjb25mLT5yYWlkX2Rpc2tzLCBjb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlmb3IgKGkgPSAwOyBpIDwgY29uZi0+cmFpZF9kaXNrczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGRldnM7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPmRpc2tzW2ldLnJkZXYpOwogCQlpZiAocmRldiAmJiAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpICYmIGF0b21pY19yZWFkKCZyZGV2LT5ucl9wZW5kaW5nKSkgewogCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShyZGV2LT5iZGV2KTsKQEAgLTMzMzEsNiArMzU4Nyw5IEBACiAJLyogTm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHJlYWRzIGFuZCB3cml0ZXMuICBKdXN0IGNoZWNrCiAJICogaG93IGJ1c3kgdGhlIHN0cmlwZV9jYWNoZSBpcwogCSAqLworCisJaWYgKG1kZGV2X2Nvbmdlc3RlZChtZGRldiwgYml0cykpCisJCXJldHVybiAxOwogCWlmIChjb25mLT5pbmFjdGl2ZV9ibG9ja2VkKQogCQlyZXR1cm4gMTsKIAlpZiAoY29uZi0+cXVpZXNjZSkKQEAgLTM4ODAsNyArNDEzOSw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnN0cmlwZXMpOwogCWZvciAoaSA9IDA7IGkgPCByZXNoYXBlX3NlY3RvcnM7IGkgKz0gU1RSSVBFX1NFQ1RPUlMpIHsKIAkJaW50IGo7Ci0JCWludCBza2lwcGVkID0gMDsKKwkJaW50IHNraXBwZWRfZGlzayA9IDA7CiAJCXNoID0gZ2V0X2FjdGl2ZV9zdHJpcGUoY29uZiwgc3RyaXBlX2FkZHIraSwgMCwgMCwgMSk7CiAJCXNldF9iaXQoU1RSSVBFX0VYUEFORElORywgJnNoLT5zdGF0ZSk7CiAJCWF0b21pY19pbmMoJmNvbmYtPnJlc2hhcGVfc3RyaXBlcyk7CkBAIC0zODk2LDE0ICs0MTU1LDE0IEBACiAJCQkJY29udGludWU7CiAJCQlzID0gY29tcHV0ZV9ibG9ja25yKHNoLCBqLCAwKTsKIAkJCWlmIChzIDwgcmFpZDVfc2l6ZShtZGRldiwgMCwgMCkpIHsKLQkJCQlza2lwcGVkID0gMTsKKwkJCQlza2lwcGVkX2Rpc2sgPSAxOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhzaC0+ZGV2W2pdLnBhZ2UpLCAwLCBTVFJJUEVfU0laRSk7CiAJCQlzZXRfYml0KFI1X0V4cGFuZGVkLCAmc2gtPmRldltqXS5mbGFncyk7CiAJCQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmc2gtPmRldltqXS5mbGFncyk7CiAJCX0KLQkJaWYgKCFza2lwcGVkKSB7CisJCWlmICghc2tpcHBlZF9kaXNrKSB7CiAJCQlzZXRfYml0KFNUUklQRV9FWFBBTkRfUkVBRFksICZzaC0+c3RhdGUpOwogCQkJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKIAkJfQpAQCAtNDA1Niw5ICs0MzE1LDcgQEAKIAljbGVhcl9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CiAJc3Bpbl91bmxvY2soJnNoLT5sb2NrKTsKIAotCS8qIHdhaXQgZm9yIGFueSBibG9ja2VkIGRldmljZSB0byBiZSBoYW5kbGVkICovCi0Jd2hpbGUodW5saWtlbHkoIWhhbmRsZV9zdHJpcGUoc2gsIE5VTEwpKSkKLQkJOworCWhhbmRsZV9zdHJpcGUoc2gpOwogCXJlbGVhc2Vfc3RyaXBlKHNoKTsKIAogCXJldHVybiBTVFJJUEVfU0VDVE9SUzsKQEAgLTQxMTQsNyArNDM3MSw3IEBACiAJCQlyZXR1cm4gaGFuZGxlZDsKIAkJfQogCi0JCWhhbmRsZV9zdHJpcGUoc2gsIE5VTEwpOworCQloYW5kbGVfc3RyaXBlKHNoKTsKIAkJcmVsZWFzZV9zdHJpcGUoc2gpOwogCQloYW5kbGVkKys7CiAJfQpAQCAtNDEyOSw3ICs0Mzg2LDYgQEAKIH0KIAogCi0KIC8qCiAgKiBUaGlzIGlzIG91ciByYWlkNSBrZXJuZWwgdGhyZWFkLgogICoKQEAgLTQxNzgsOCArNDQzNCw5IEBACiAJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCQkKIAkJaGFuZGxlZCsrOwotCQloYW5kbGVfc3RyaXBlKHNoLCBjb25mLT5zcGFyZV9wYWdlKTsKKwkJaGFuZGxlX3N0cmlwZShzaCk7CiAJCXJlbGVhc2Vfc3RyaXBlKHNoKTsKKwkJY29uZF9yZXNjaGVkKCk7CiAKIAkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCX0KQEAgLTQzMDYsMzIgKzQ1NjMsMTMxIEBACiAKIAlpZiAoIXNlY3RvcnMpCiAJCXNlY3RvcnMgPSBtZGRldi0+ZGV2X3NlY3RvcnM7Ci0JaWYgKCFyYWlkX2Rpc2tzKSB7CisJaWYgKCFyYWlkX2Rpc2tzKQogCQkvKiBzaXplIGlzIGRlZmluZWQgYnkgdGhlIHNtYWxsZXN0IG9mIHByZXZpb3VzIGFuZCBuZXcgc2l6ZSAqLwotCQlpZiAoY29uZi0+cmFpZF9kaXNrcyA8IGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MpCi0JCQlyYWlkX2Rpc2tzID0gY29uZi0+cmFpZF9kaXNrczsKLQkJZWxzZQotCQkJcmFpZF9kaXNrcyA9IGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3M7Ci0JfQorCQlyYWlkX2Rpc2tzID0gbWluKGNvbmYtPnJhaWRfZGlza3MsIGNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MpOwogCiAJc2VjdG9ycyAmPSB+KChzZWN0b3JfdCltZGRldi0+Y2h1bmtfc2VjdG9ycyAtIDEpOwogCXNlY3RvcnMgJj0gfigoc2VjdG9yX3QpbWRkZXYtPm5ld19jaHVua19zZWN0b3JzIC0gMSk7CiAJcmV0dXJuIHNlY3RvcnMgKiAocmFpZF9kaXNrcyAtIGNvbmYtPm1heF9kZWdyYWRlZCk7CiB9CiAKK3N0YXRpYyB2b2lkIHJhaWQ1X2ZyZWVfcGVyY3B1KHJhaWQ1X2NvbmZfdCAqY29uZikKK3sKKwlzdHJ1Y3QgcmFpZDVfcGVyY3B1ICpwZXJjcHU7CisJdW5zaWduZWQgbG9uZyBjcHU7CisKKwlpZiAoIWNvbmYtPnBlcmNwdSkKKwkJcmV0dXJuOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwZXJjcHUgPSBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSk7CisJCXNhZmVfcHV0X3BhZ2UocGVyY3B1LT5zcGFyZV9wYWdlKTsKKwkJa2ZyZWUocGVyY3B1LT5zY3JpYmJsZSk7CisJfQorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjb25mLT5jcHVfbm90aWZ5KTsKKyNlbmRpZgorCXB1dF9vbmxpbmVfY3B1cygpOworCisJZnJlZV9wZXJjcHUoY29uZi0+cGVyY3B1KTsKK30KKwogc3RhdGljIHZvaWQgZnJlZV9jb25mKHJhaWQ1X2NvbmZfdCAqY29uZikKIHsKIAlzaHJpbmtfc3RyaXBlcyhjb25mKTsKLQlzYWZlX3B1dF9wYWdlKGNvbmYtPnNwYXJlX3BhZ2UpOworCXJhaWQ1X2ZyZWVfcGVyY3B1KGNvbmYpOwogCWtmcmVlKGNvbmYtPmRpc2tzKTsKIAlrZnJlZShjb25mLT5zdHJpcGVfaGFzaHRibCk7CiAJa2ZyZWUoY29uZik7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgcmFpZDQ1Nl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKKwkJCSAgICAgIHZvaWQgKmhjcHUpCit7CisJcmFpZDVfY29uZl90ICpjb25mID0gY29udGFpbmVyX29mKG5mYiwgcmFpZDVfY29uZl90LCBjcHVfbm90aWZ5KTsKKwlsb25nIGNwdSA9IChsb25nKWhjcHU7CisJc3RydWN0IHJhaWQ1X3BlcmNwdSAqcGVyY3B1ID0gcGVyX2NwdV9wdHIoY29uZi0+cGVyY3B1LCBjcHUpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9VUF9QUkVQQVJFOgorCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgorCQlpZiAoY29uZi0+bGV2ZWwgPT0gNiAmJiAhcGVyY3B1LT5zcGFyZV9wYWdlKQorCQkJcGVyY3B1LT5zcGFyZV9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZXJjcHUtPnNjcmliYmxlKQorCQkJcGVyY3B1LT5zY3JpYmJsZSA9IGttYWxsb2MoY29uZi0+c2NyaWJibGVfbGVuLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoIXBlcmNwdS0+c2NyaWJibGUgfHwKKwkJICAgIChjb25mLT5sZXZlbCA9PSA2ICYmICFwZXJjcHUtPnNwYXJlX3BhZ2UpKSB7CisJCQlzYWZlX3B1dF9wYWdlKHBlcmNwdS0+c3BhcmVfcGFnZSk7CisJCQlrZnJlZShwZXJjcHUtPnNjcmliYmxlKTsKKwkJCXByX2VycigiJXM6IGZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgY3B1JWxkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBjcHUpOworCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwljYXNlIENQVV9ERUFEX0ZST1pFTjoKKwkJc2FmZV9wdXRfcGFnZShwZXJjcHUtPnNwYXJlX3BhZ2UpOworCQlrZnJlZShwZXJjcHUtPnNjcmliYmxlKTsKKwkJcGVyY3B1LT5zcGFyZV9wYWdlID0gTlVMTDsKKwkJcGVyY3B1LT5zY3JpYmJsZSA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcmFpZDVfYWxsb2NfcGVyY3B1KHJhaWQ1X2NvbmZfdCAqY29uZikKK3sKKwl1bnNpZ25lZCBsb25nIGNwdTsKKwlzdHJ1Y3QgcGFnZSAqc3BhcmVfcGFnZTsKKwlzdHJ1Y3QgcmFpZDVfcGVyY3B1ICphbGxjcHVzOworCXZvaWQgKnNjcmliYmxlOworCWludCBlcnI7CisKKwlhbGxjcHVzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCByYWlkNV9wZXJjcHUpOworCWlmICghYWxsY3B1cykKKwkJcmV0dXJuIC1FTk9NRU07CisJY29uZi0+cGVyY3B1ID0gYWxsY3B1czsKKworCWdldF9vbmxpbmVfY3B1cygpOworCWVyciA9IDA7CisJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCWlmIChjb25mLT5sZXZlbCA9PSA2KSB7CisJCQlzcGFyZV9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJCWlmICghc3BhcmVfcGFnZSkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisJCQlwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSktPnNwYXJlX3BhZ2UgPSBzcGFyZV9wYWdlOworCQl9CisJCXNjcmliYmxlID0ga21hbGxvYyhjb25mLT5zY3JpYmJsZV9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXNjcmliYmxlKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJcGVyX2NwdV9wdHIoY29uZi0+cGVyY3B1LCBjcHUpLT5zY3JpYmJsZSA9IHNjcmliYmxlOworCX0KKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwljb25mLT5jcHVfbm90aWZ5Lm5vdGlmaWVyX2NhbGwgPSByYWlkNDU2X2NwdV9ub3RpZnk7CisJY29uZi0+Y3B1X25vdGlmeS5wcmlvcml0eSA9IDA7CisJaWYgKGVyciA9PSAwKQorCQllcnIgPSByZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNvbmYtPmNwdV9ub3RpZnkpOworI2VuZGlmCisJcHV0X29ubGluZV9jcHVzKCk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgcmFpZDVfY29uZl90ICpzZXR1cF9jb25mKG1kZGV2X3QgKm1kZGV2KQogewogCXJhaWQ1X2NvbmZfdCAqY29uZjsKLQlpbnQgcmFpZF9kaXNrLCBtZW1vcnk7CisJaW50IHJhaWRfZGlzaywgbWVtb3J5LCBtYXhfZGlza3M7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlzdHJ1Y3QgZGlza19pbmZvICpkaXNrOwogCkBAIC00MzY3LDI4ICs0NzIzLDYgQEAKIAljb25mID0ga3phbGxvYyhzaXplb2YocmFpZDVfY29uZl90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNvbmYgPT0gTlVMTCkKIAkJZ290byBhYm9ydDsKLQotCWNvbmYtPnJhaWRfZGlza3MgPSBtZGRldi0+cmFpZF9kaXNrczsKLQlpZiAobWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gPT0gTWF4U2VjdG9yKQotCQljb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzID0gbWRkZXYtPnJhaWRfZGlza3M7Ci0JZWxzZQotCQljb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzID0gbWRkZXYtPnJhaWRfZGlza3MgLSBtZGRldi0+ZGVsdGFfZGlza3M7Ci0KLQljb25mLT5kaXNrcyA9IGt6YWxsb2MoY29uZi0+cmFpZF9kaXNrcyAqIHNpemVvZihzdHJ1Y3QgZGlza19pbmZvKSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmICghY29uZi0+ZGlza3MpCi0JCWdvdG8gYWJvcnQ7Ci0KLQljb25mLT5tZGRldiA9IG1kZGV2OwotCi0JaWYgKChjb25mLT5zdHJpcGVfaGFzaHRibCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJZ290byBhYm9ydDsKLQotCWlmIChtZGRldi0+bmV3X2xldmVsID09IDYpIHsKLQkJY29uZi0+c3BhcmVfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmICghY29uZi0+c3BhcmVfcGFnZSkKLQkJCWdvdG8gYWJvcnQ7Ci0JfQogCXNwaW5fbG9ja19pbml0KCZjb25mLT5kZXZpY2VfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY29uZi0+d2FpdF9mb3Jfc3RyaXBlKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb25mLT53YWl0X2Zvcl9vdmVybGFwKTsKQEAgLTQ0MDIsMTEgKzQ3MzYsMzMgQEAKIAlhdG9taWNfc2V0KCZjb25mLT5hY3RpdmVfYWxpZ25lZF9yZWFkcywgMCk7CiAJY29uZi0+YnlwYXNzX3RocmVzaG9sZCA9IEJZUEFTU19USFJFU0hPTEQ7CiAKKwljb25mLT5yYWlkX2Rpc2tzID0gbWRkZXYtPnJhaWRfZGlza3M7CisJaWYgKG1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uID09IE1heFNlY3RvcikKKwkJY29uZi0+cHJldmlvdXNfcmFpZF9kaXNrcyA9IG1kZGV2LT5yYWlkX2Rpc2tzOworCWVsc2UKKwkJY29uZi0+cHJldmlvdXNfcmFpZF9kaXNrcyA9IG1kZGV2LT5yYWlkX2Rpc2tzIC0gbWRkZXYtPmRlbHRhX2Rpc2tzOworCW1heF9kaXNrcyA9IG1heChjb25mLT5yYWlkX2Rpc2tzLCBjb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzKTsKKwljb25mLT5zY3JpYmJsZV9sZW4gPSBzY3JpYmJsZV9sZW4obWF4X2Rpc2tzKTsKKworCWNvbmYtPmRpc2tzID0ga3phbGxvYyhtYXhfZGlza3MgKiBzaXplb2Yoc3RydWN0IGRpc2tfaW5mbyksCisJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbmYtPmRpc2tzKQorCQlnb3RvIGFib3J0OworCisJY29uZi0+bWRkZXYgPSBtZGRldjsKKworCWlmICgoY29uZi0+c3RyaXBlX2hhc2h0YmwgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gYWJvcnQ7CisKKwljb25mLT5sZXZlbCA9IG1kZGV2LT5uZXdfbGV2ZWw7CisJaWYgKHJhaWQ1X2FsbG9jX3BlcmNwdShjb25mKSAhPSAwKQorCQlnb3RvIGFib3J0OworCiAJcHJfZGVidWcoInJhaWQ1OiBydW4oJXMpIGNhbGxlZC5cbiIsIG1kbmFtZShtZGRldikpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlyYWlkX2Rpc2sgPSByZGV2LT5yYWlkX2Rpc2s7Ci0JCWlmIChyYWlkX2Rpc2sgPj0gY29uZi0+cmFpZF9kaXNrcworCQlpZiAocmFpZF9kaXNrID49IG1heF9kaXNrcwogCQkgICAgfHwgcmFpZF9kaXNrIDwgMCkKIAkJCWNvbnRpbnVlOwogCQlkaXNrID0gY29uZi0+ZGlza3MgKyByYWlkX2Rpc2s7CkBAIC00NDM4LDcgKzQ3OTQsNyBAQAogCX0KIAogCW1lbW9yeSA9IGNvbmYtPm1heF9ucl9zdHJpcGVzICogKHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2hlYWQpICsKLQkJIGNvbmYtPnJhaWRfZGlza3MgKiAoKHNpemVvZihzdHJ1Y3QgYmlvKSArIFBBR0VfU0laRSkpKSAvIDEwMjQ7CisJCSBtYXhfZGlza3MgKiAoKHNpemVvZihzdHJ1Y3QgYmlvKSArIFBBR0VfU0laRSkpKSAvIDEwMjQ7CiAJaWYgKGdyb3dfc3RyaXBlcyhjb25mLCBjb25mLT5tYXhfbnJfc3RyaXBlcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkicmFpZDU6IGNvdWxkbid0IGFsbG9jYXRlICVka0IgZm9yIGJ1ZmZlcnNcbiIsIG1lbW9yeSk7CkBAIC00NDQ3LDcgKzQ4MDMsNyBAQAogCQlwcmludGsoS0VSTl9JTkZPICJyYWlkNTogYWxsb2NhdGVkICVka0IgZm9yICVzXG4iLAogCQkJbWVtb3J5LCBtZG5hbWUobWRkZXYpKTsKIAotCWNvbmYtPnRocmVhZCA9IG1kX3JlZ2lzdGVyX3RocmVhZChyYWlkNWQsIG1kZGV2LCAiJXNfcmFpZDUiKTsKKwljb25mLT50aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQocmFpZDVkLCBtZGRldiwgTlVMTCk7CiAJaWYgKCFjb25mLT50aHJlYWQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAicmFpZDU6IGNvdWxkbid0IGFsbG9jYXRlIHRocmVhZCBmb3IgJXNcbiIsCkBAIC00NTYzLDcgKzQ5MTksOCBAQAogCQkgICAgdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkKIAkJCXdvcmtpbmdfZGlza3MrKzsKIAotCW1kZGV2LT5kZWdyYWRlZCA9IGNvbmYtPnJhaWRfZGlza3MgLSB3b3JraW5nX2Rpc2tzOworCW1kZGV2LT5kZWdyYWRlZCA9IChtYXgoY29uZi0+cmFpZF9kaXNrcywgY29uZi0+cHJldmlvdXNfcmFpZF9kaXNrcykKKwkJCSAgIC0gd29ya2luZ19kaXNrcyk7CiAKIAlpZiAobWRkZXYtPmRlZ3JhZGVkID4gY29uZi0+bWF4X2RlZ3JhZGVkKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicmFpZDU6IG5vdCBlbm91Z2ggb3BlcmF0aW9uYWwgZGV2aWNlcyBmb3IgJXMiCkBAIC00NjEzLDcgKzQ5NzAsNyBAQAogCQlzZXRfYml0KE1EX1JFQ09WRVJZX1JFU0hBUEUsICZtZGRldi0+cmVjb3ZlcnkpOwogCQlzZXRfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpOwogCQltZGRldi0+c3luY190aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQobWRfZG9fc3luYywgbWRkZXYsCi0JCQkJCQkJIiVzX3Jlc2hhcGUiKTsKKwkJCQkJCQkicmVzaGFwZSIpOwogCX0KIAogCS8qIHJlYWQtYWhlYWQgc2l6ZSBtdXN0IGNvdmVyIHR3byB3aG9sZSBzdHJpcGVzLCB3aGljaCBpcwpAQCAtNTAzMSw3ICs1Mzg4LDcgQEAKIAlzZXRfYml0KE1EX1JFQ09WRVJZX1JFU0hBUEUsICZtZGRldi0+cmVjb3ZlcnkpOwogCXNldF9iaXQoTURfUkVDT1ZFUllfUlVOTklORywgJm1kZGV2LT5yZWNvdmVyeSk7CiAJbWRkZXYtPnN5bmNfdGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKG1kX2RvX3N5bmMsIG1kZGV2LAotCQkJCQkJIiVzX3Jlc2hhcGUiKTsKKwkJCQkJCSJyZXNoYXBlIik7CiAJaWYgKCFtZGRldi0+c3luY190aHJlYWQpIHsKIAkJbWRkZXYtPnJlY292ZXJ5ID0gMDsKIAkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5oIGIvZHJpdmVycy9tZC9yYWlkNS5oCmluZGV4IDk0NTk2ODkuLmRkNzA4MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuaAorKysgYi9kcml2ZXJzL21kL3JhaWQ1LmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9SQUlENV9ICiAKICNpbmNsdWRlIDxsaW51eC9yYWlkL3hvci5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogCiAvKgogICoKQEAgLTE3NSw3ICsxNzYsOSBAQAogICovCiBlbnVtIGNoZWNrX3N0YXRlcyB7CiAJY2hlY2tfc3RhdGVfaWRsZSA9IDAsCi0JY2hlY2tfc3RhdGVfcnVuLCAvKiBwYXJpdHkgY2hlY2sgKi8KKwljaGVja19zdGF0ZV9ydW4sIC8qIHhvciBwYXJpdHkgY2hlY2sgKi8KKwljaGVja19zdGF0ZV9ydW5fcSwgLyogcS1wYXJpdHkgY2hlY2sgKi8KKwljaGVja19zdGF0ZV9ydW5fcHEsIC8qIHBxIGR1YWwgcGFyaXR5IGNoZWNrICovCiAJY2hlY2tfc3RhdGVfY2hlY2tfcmVzdWx0LAogCWNoZWNrX3N0YXRlX2NvbXB1dGVfcnVuLCAvKiBwYXJpdHkgcmVwYWlyICovCiAJY2hlY2tfc3RhdGVfY29tcHV0ZV9yZXN1bHQsCkBAIC0yMTEsMTIgKzIxNCwyMCBAQAogCWludAkJCWRpc2tzOwkJLyogZGlza3MgaW4gc3RyaXBlICovCiAJZW51bSBjaGVja19zdGF0ZXMJY2hlY2tfc3RhdGU7CiAJZW51bSByZWNvbnN0cnVjdF9zdGF0ZXMgcmVjb25zdHJ1Y3Rfc3RhdGU7Ci0JLyogc3RyaXBlX29wZXJhdGlvbnMKKwkvKioKKwkgKiBzdHJ1Y3Qgc3RyaXBlX29wZXJhdGlvbnMKIAkgKiBAdGFyZ2V0IC0gU1RSSVBFX09QX0NPTVBVVEVfQkxLIHRhcmdldAorCSAqIEB0YXJnZXQyIC0gMm5kIGNvbXB1dGUgdGFyZ2V0IGluIHRoZSByYWlkNiBjYXNlCisJICogQHplcm9fc3VtX3Jlc3VsdCAtIFAgYW5kIFEgdmVyaWZpY2F0aW9uIGZsYWdzCisJICogQHJlcXVlc3QgLSBhc3luYyBzZXJ2aWNlIHJlcXVlc3QgZmxhZ3MgZm9yIHJhaWRfcnVuX29wcwogCSAqLwogCXN0cnVjdCBzdHJpcGVfb3BlcmF0aW9ucyB7Ci0JCWludAkJICAgdGFyZ2V0OwotCQl1MzIJCSAgIHplcm9fc3VtX3Jlc3VsdDsKKwkJaW50IAkJICAgICB0YXJnZXQsIHRhcmdldDI7CisJCWVudW0gc3VtX2NoZWNrX2ZsYWdzIHplcm9fc3VtX3Jlc3VsdDsKKwkJI2lmZGVmIENPTkZJR19NVUxUSUNPUkVfUkFJRDQ1NgorCQl1bnNpZ25lZCBsb25nCSAgICAgcmVxdWVzdDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3QgICAgd2FpdF9mb3Jfb3BzOworCQkjZW5kaWYKIAl9IG9wczsKIAlzdHJ1Y3QgcjVkZXYgewogCQlzdHJ1Y3QgYmlvCXJlcTsKQEAgLTI5MSw2ICszMDIsOCBAQAogI2RlZmluZQlTVFJJUEVfRlVMTF9XUklURQkxMyAvKiBhbGwgYmxvY2tzIGFyZSBzZXQgdG8gYmUgb3ZlcndyaXR0ZW4gKi8KICNkZWZpbmUJU1RSSVBFX0JJT0ZJTExfUlVOCTE0CiAjZGVmaW5lCVNUUklQRV9DT01QVVRFX1JVTgkxNQorI2RlZmluZQlTVFJJUEVfT1BTX1JFUV9QRU5ESU5HCTE2CisKIC8qCiAgKiBPcGVyYXRpb24gcmVxdWVzdCBmbGFncwogICovCkBAIC0yOTgsNyArMzExLDcgQEAKICNkZWZpbmUgU1RSSVBFX09QX0NPTVBVVEVfQkxLCTEKICNkZWZpbmUgU1RSSVBFX09QX1BSRVhPUgkyCiAjZGVmaW5lIFNUUklQRV9PUF9CSU9EUkFJTgkzCi0jZGVmaW5lIFNUUklQRV9PUF9QT1NUWE9SCTQKKyNkZWZpbmUgU1RSSVBFX09QX1JFQ09OU1RSVUNUCTQKICNkZWZpbmUgU1RSSVBFX09QX0NIRUNLCTUKIAogLyoKQEAgLTM4NSw4ICszOTgsMjEgQEAKIAkJCQkJICAgICogKGZyZXNoIGRldmljZSBhZGRlZCkuCiAJCQkJCSAgICAqIENsZWFyZWQgd2hlbiBhIHN5bmMgY29tcGxldGVzLgogCQkJCQkgICAgKi8KLQotCXN0cnVjdCBwYWdlIAkJKnNwYXJlX3BhZ2U7IC8qIFVzZWQgd2hlbiBjaGVja2luZyBQL1EgaW4gcmFpZDYgKi8KKwkvKiBwZXIgY3B1IHZhcmlhYmxlcyAqLworCXN0cnVjdCByYWlkNV9wZXJjcHUgeworCQlzdHJ1Y3QgcGFnZQkqc3BhcmVfcGFnZTsgLyogVXNlZCB3aGVuIGNoZWNraW5nIFAvUSBpbiByYWlkNiAqLworCQl2b2lkCQkqc2NyaWJibGU7ICAgLyogc3BhY2UgZm9yIGNvbnN0cnVjdGluZyBidWZmZXIKKwkJCQkJICAgICAgKiBsaXN0cyBhbmQgcGVyZm9ybWluZyBhZGRyZXNzCisJCQkJCSAgICAgICogY29udmVyc2lvbnMKKwkJCQkJICAgICAgKi8KKwl9ICpwZXJjcHU7CisJc2l6ZV90CQkJc2NyaWJibGVfbGVuOyAvKiBzaXplIG9mIHNjcmliYmxlIHJlZ2lvbiBtdXN0IGJlCisJCQkJCSAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCBjb25mIHRvIGhhbmRsZQorCQkJCQkgICAgICAgKiBjcHUgaG90cGx1ZyB3aGlsZSByZXNoYXBpbmcKKwkJCQkJICAgICAgICovCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCWNwdV9ub3RpZnk7CisjZW5kaWYKIAogCS8qCiAJICogRnJlZSBzdHJpcGVzIHBvb2wKQEAgLTQ2Miw3ICs0ODgsNyBAQAogewogCXJldHVybiAobGF5b3V0ID49IDAgJiYgbGF5b3V0IDw9IDUpCiAJCXx8Ci0JCShsYXlvdXQgPT0gOCB8fCBsYXlvdXQgPT0gMTApCisJCShsYXlvdXQgPj0gOCAmJiBsYXlvdXQgPD0gMTApCiAJCXx8CiAJCShsYXlvdXQgPj0gMTYgJiYgbGF5b3V0IDw9IDIwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDZhbHRpdmVjLnVjIGIvZHJpdmVycy9tZC9yYWlkNmFsdGl2ZWMudWMKaW5kZXggNjk5ZGZlZS4uMjY1NGQ1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNmFsdGl2ZWMudWMKKysrIGIvZHJpdmVycy9tZC9yYWlkNmFsdGl2ZWMudWMKQEAgLTE1LDcgKzE1LDcgQEAKICAqCiAgKiAkIy13YXkgdW5yb2xsZWQgcG9ydGFibGUgaW50ZWdlciBtYXRoIFJBSUQtNiBpbnN0cnVjdGlvbiBzZXQKICAqCi0gKiBUaGlzIGZpbGUgaXMgcG9zdHByb2Nlc3NlZCB1c2luZyB1bnJvbGwucGwKKyAqIFRoaXMgZmlsZSBpcyBwb3N0cHJvY2Vzc2VkIHVzaW5nIHVucm9sbC5hd2sKICAqCiAgKiA8YmVuaD4gaHBhOiBpbiBwcm9jZXNzLAogICogeW91IGNhbiBqdXN0ICJzdGVhbCIgdGhlIHZlYyB1bml0IHdpdGggZW5hYmxlX2tlcm5lbF9hbHRpdmVjKCkgKGJ1dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNmludC51YyBiL2RyaXZlcnMvbWQvcmFpZDZpbnQudWMKaW5kZXggZjliZjljYi4uZDFlMjc2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNmludC51YworKysgYi9kcml2ZXJzL21kL3JhaWQ2aW50LnVjCkBAIC0xNSw3ICsxNSw3IEBACiAgKgogICogJCMtd2F5IHVucm9sbGVkIHBvcnRhYmxlIGludGVnZXIgbWF0aCBSQUlELTYgaW5zdHJ1Y3Rpb24gc2V0CiAgKgotICogVGhpcyBmaWxlIGlzIHBvc3Rwcm9jZXNzZWQgdXNpbmcgdW5yb2xsLnBsCisgKiBUaGlzIGZpbGUgaXMgcG9zdHByb2Nlc3NlZCB1c2luZyB1bnJvbGwuYXdrCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDZ0ZXN0L01ha2VmaWxlIGIvZHJpdmVycy9tZC9yYWlkNnRlc3QvTWFrZWZpbGUKaW5kZXggNThmZmRmNC4uMjg3NGNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNnRlc3QvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZC9yYWlkNnRlc3QvTWFrZWZpbGUKQEAgLTcsNyArNyw3IEBACiBPUFRGTEFHUyA9IC1PMgkJCSMgQWRqdXN0IGFzIGRlc2lyZWQKIENGTEFHUwkgPSAtSS4uIC1JIC4uLy4uLy4uL2luY2x1ZGUgLWcgJChPUFRGTEFHUykKIExECSA9IGxkCi1QRVJMCSA9IHBlcmwKK0FXSwkgPSBhd2sKIEFSCSA9IGFyCiBSQU5MSUIJID0gcmFubGliCiAKQEAgLTM1LDM1ICszNSwzNSBAQAogcmFpZDZ0ZXN0OiB0ZXN0LmMgcmFpZDYuYQogCSQoQ0MpICQoQ0ZMQUdTKSAtbyByYWlkNnRlc3QgJF4KIAotcmFpZDZhbHRpdmVjMS5jOiByYWlkNmFsdGl2ZWMudWMgLi4vdW5yb2xsLnBsCi0JJChQRVJMKSAuLi91bnJvbGwucGwgMSA8IHJhaWQ2YWx0aXZlYy51YyA+ICRACityYWlkNmFsdGl2ZWMxLmM6IHJhaWQ2YWx0aXZlYy51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTEgPCByYWlkNmFsdGl2ZWMudWMgPiAkQAogCi1yYWlkNmFsdGl2ZWMyLmM6IHJhaWQ2YWx0aXZlYy51YyAuLi91bnJvbGwucGwKLQkkKFBFUkwpIC4uL3Vucm9sbC5wbCAyIDwgcmFpZDZhbHRpdmVjLnVjID4gJEAKK3JhaWQ2YWx0aXZlYzIuYzogcmFpZDZhbHRpdmVjLnVjIC4uL3Vucm9sbC5hd2sKKwkkKEFXSykgLi4vdW5yb2xsLmF3ayAtdk49MiA8IHJhaWQ2YWx0aXZlYy51YyA+ICRACiAKLXJhaWQ2YWx0aXZlYzQuYzogcmFpZDZhbHRpdmVjLnVjIC4uL3Vucm9sbC5wbAotCSQoUEVSTCkgLi4vdW5yb2xsLnBsIDQgPCByYWlkNmFsdGl2ZWMudWMgPiAkQAorcmFpZDZhbHRpdmVjNC5jOiByYWlkNmFsdGl2ZWMudWMgLi4vdW5yb2xsLmF3aworCSQoQVdLKSAuLi91bnJvbGwuYXdrIC12Tj00IDwgcmFpZDZhbHRpdmVjLnVjID4gJEAKIAotcmFpZDZhbHRpdmVjOC5jOiByYWlkNmFsdGl2ZWMudWMgLi4vdW5yb2xsLnBsCi0JJChQRVJMKSAuLi91bnJvbGwucGwgOCA8IHJhaWQ2YWx0aXZlYy51YyA+ICRACityYWlkNmFsdGl2ZWM4LmM6IHJhaWQ2YWx0aXZlYy51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTggPCByYWlkNmFsdGl2ZWMudWMgPiAkQAogCi1yYWlkNmludDEuYzogcmFpZDZpbnQudWMgLi4vdW5yb2xsLnBsCi0JJChQRVJMKSAuLi91bnJvbGwucGwgMSA8IHJhaWQ2aW50LnVjID4gJEAKK3JhaWQ2aW50MS5jOiByYWlkNmludC51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTEgPCByYWlkNmludC51YyA+ICRACiAKLXJhaWQ2aW50Mi5jOiByYWlkNmludC51YyAuLi91bnJvbGwucGwKLQkkKFBFUkwpIC4uL3Vucm9sbC5wbCAyIDwgcmFpZDZpbnQudWMgPiAkQAorcmFpZDZpbnQyLmM6IHJhaWQ2aW50LnVjIC4uL3Vucm9sbC5hd2sKKwkkKEFXSykgLi4vdW5yb2xsLmF3ayAtdk49MiA8IHJhaWQ2aW50LnVjID4gJEAKIAotcmFpZDZpbnQ0LmM6IHJhaWQ2aW50LnVjIC4uL3Vucm9sbC5wbAotCSQoUEVSTCkgLi4vdW5yb2xsLnBsIDQgPCByYWlkNmludC51YyA+ICRACityYWlkNmludDQuYzogcmFpZDZpbnQudWMgLi4vdW5yb2xsLmF3aworCSQoQVdLKSAuLi91bnJvbGwuYXdrIC12Tj00IDwgcmFpZDZpbnQudWMgPiAkQAogCi1yYWlkNmludDguYzogcmFpZDZpbnQudWMgLi4vdW5yb2xsLnBsCi0JJChQRVJMKSAuLi91bnJvbGwucGwgOCA8IHJhaWQ2aW50LnVjID4gJEAKK3JhaWQ2aW50OC5jOiByYWlkNmludC51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTggPCByYWlkNmludC51YyA+ICRACiAKLXJhaWQ2aW50MTYuYzogcmFpZDZpbnQudWMgLi4vdW5yb2xsLnBsCi0JJChQRVJMKSAuLi91bnJvbGwucGwgMTYgPCByYWlkNmludC51YyA+ICRACityYWlkNmludDE2LmM6IHJhaWQ2aW50LnVjIC4uL3Vucm9sbC5hd2sKKwkkKEFXSykgLi4vdW5yb2xsLmF3ayAtdk49MTYgPCByYWlkNmludC51YyA+ICRACiAKLXJhaWQ2aW50MzIuYzogcmFpZDZpbnQudWMgLi4vdW5yb2xsLnBsCi0JJChQRVJMKSAuLi91bnJvbGwucGwgMzIgPCByYWlkNmludC51YyA+ICRACityYWlkNmludDMyLmM6IHJhaWQ2aW50LnVjIC4uL3Vucm9sbC5hd2sKKwkkKEFXSykgLi4vdW5yb2xsLmF3ayAtdk49MzIgPCByYWlkNmludC51YyA+ICRACiAKIHJhaWQ2dGFibGVzLmM6IG1rdGFibGVzCiAJLi9ta3RhYmxlcyA+IHJhaWQ2dGFibGVzLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvdW5yb2xsLmF3ayBiL2RyaXZlcnMvbWQvdW5yb2xsLmF3awpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFhMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC91bnJvbGwuYXdrCkBAIC0wLDAgKzEsMjAgQEAKKworIyBUaGlzIGZpbHRlciByZXF1aXJlcyBvbmUgY29tbWFuZCBsaW5lIG9wdGlvbiBvZiBmb3JtIC12Tj1uCisjIHdoZXJlIG4gbXVzdCBiZSBhIGRlY2ltYWwgbnVtYmVyLgorIworIyBSZXBlYXQgZWFjaCBpbnB1dCBsaW5lIGNvbnRhaW5pbmcgJCQgbiB0aW1lcywgcmVwbGFjaW5nICQkIHdpdGggMC4uLm4tMS4KKyMgUmVwbGFjZSBlYWNoICQjIHdpdGggbiwgYW5kIGVhY2ggJCogd2l0aCBhIHNpbmdsZSAkLgorCitCRUdJTiB7CisJbiA9IE4gKyAwCit9Cit7CisJaWYgKC9cJFwkLykgeyByZXAgPSBuIH0gZWxzZSB7IHJlcCA9IDEgfQorCWZvciAoaSA9IDA7IGkgPCByZXA7ICsraSkgeworCQl0bXAgPSAkMAorCQlnc3ViKC9cJFwkLywgaSwgdG1wKQorCQlnc3ViKC9cJFwjLywgbiwgdG1wKQorCQlnc3ViKC9cJFwqLywgIiQiLCB0bXApCisJCXByaW50IHRtcAorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvdW5yb2xsLnBsIGIvZHJpdmVycy9tZC91bnJvbGwucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhY2M3MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZC91bnJvbGwucGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS91c3IvYmluL3BlcmwKLSMKLSMgVGFrZSBhIHBpZWNlIG9mIEMgY29kZSBhbmQgZm9yIGVhY2ggbGluZSB3aGljaCBjb250YWlucyB0aGUgc2VxdWVuY2UgJCQKLSMgcmVwZWF0IG4gdGltZXMgd2l0aCAkIHJlcGxhY2VkIGJ5IDAuLi5uLTE7IHRoZSBzZXF1ZW5jZSAkIyBpcyByZXBsYWNlZAotIyBieSB0aGUgdW5yb2xsaW5nIGZhY3RvciwgYW5kICQqIHdpdGggYSBzaW5nbGUgJAotIwotCi0oJG4pID0gQEFSR1Y7Ci0kbiArPSAwOwotCi13aGlsZSAoIGRlZmluZWQoJGxpbmUgPSA8U1RESU4+KSApIHsKLSAgICBpZiAoICRsaW5lID1+IC9cJFwkLyApIHsKLQkkcmVwID0gJG47Ci0gICAgfSBlbHNlIHsKLQkkcmVwID0gMTsKLSAgICB9Ci0gICAgZm9yICggJGkgPSAwIDsgJGkgPCAkcmVwIDsgJGkrKyApIHsKLQkkdG1wID0gJGxpbmU7Ci0JJHRtcCA9fiBzL1wkXCQvJGkvZzsKLQkkdG1wID1+IHMvXCRcIy8kbi9nOwotCSR0bXAgPX4gcy9cJFwqL1wkL2c7Ci0JcHJpbnQgJHRtcDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCmluZGV4IDM3NTBmZjQuLmMzNzc5MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KQEAgLTEyMDMsNyArMTIwNCw3IEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR2Yl9kdnJfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR2Yl9kdnJfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkucmVhZCA9IGR2Yl9kdnJfcmVhZCwKIAkud3JpdGUgPSBkdmJfZHZyX3dyaXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguYwppbmRleCBlZWY2ZDM2Li45MWM1MzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguYwpAQCAtMjEsNiArMjEsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKaW5kZXggOGM5YWUwYS4uMDI0MWE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYwpAQCAtNjMsNiArNjMsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlICJkdmJfZGVtdXguaCIKICNpbmNsdWRlICJkdmJfbmV0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCmluZGV4IDg5NWUyZWYuLjAxZmM3MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCkBAIC0zMSwxMCArMzEsOSBAQAogI2RlZmluZSBEVkJfTUFKT1IgMjEyCiAKICNpZiBkZWZpbmVkKENPTkZJR19EVkJfTUFYX0FEQVBURVJTKSAmJiBDT05GSUdfRFZCX01BWF9BREFQVEVSUyA+IDAKLSNkZWZpbmUgRFZCX01BWF9BREFQVEVSUyBDT05GSUdfRFZCX01BWF9BREFQVEVSUworICAjZGVmaW5lIERWQl9NQVhfQURBUFRFUlMgQ09ORklHX0RWQl9NQVhfQURBUFRFUlMKICNlbHNlCi0jd2FybmluZyBpbnZhbGlkIENPTkZJR19EVkJfTUFYX0FEQVBURVJTIHZhbHVlCi0jZGVmaW5lIERWQl9NQVhfQURBUFRFUlMgOAorICAjZGVmaW5lIERWQl9NQVhfQURBUFRFUlMgOAogI2VuZGlmCiAKICNkZWZpbmUgRFZCX1VOU0VUICgtMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwppbmRleCAwZTRiOTdmLi45NzQ0YjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCkBAIC03NSw3ICs3NSw3IEBACiAJc2VsZWN0IERWQl9ESUIzMDAwTUMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1M1SDE0MTEgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0xHRFQzMzA1IGlmICFEVkJfRkVfQ1VTVE9NSVNFCi0Jc2VsZWN0IERWQl9UVU5FUl9ESUIwMDcwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9UVU5FUl9ESUIwMDcwCiAJc2VsZWN0IE1FRElBX1RVTkVSX01UMjA2MCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX01UMjI2NiBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1hDMjAyOCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWNpLmMKaW5kZXggZWViODBkMC4uODUzZTA0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1jaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtY2kuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJcmV0dXJuIFBPTExJTjsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmR0dl9jYV9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmR0dl9jYV9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuaW9jdGwJCT0gZHZiX2dlbmVyaWNfaW9jdGwsCiAJLm9wZW4JCT0gZHZiX2dlbmVyaWNfb3BlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYwppbmRleCA4YjE0NDAxLi40ODJkMGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIFY0TDIgQVBJIGRlZnMJCSovCiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKaW5kZXggNjU3YzQ4MS4uMTAyMzBjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCkBAIC0xMzI1LDcgKzEzMjUsNyBAQAogCW11dGV4X3VubG9jaygmc2J1Zi0+Y2FtLT5zX211dGV4KTsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBjYWZlX3Y0bF92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGNhZmVfdjRsX3ZtX29wcyA9IHsKIAkub3BlbiA9IGNhZmVfdjRsX3ZtX29wZW4sCiAJLmNsb3NlID0gY2FmZV92NGxfdm1fY2xvc2UKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCmluZGV4IDQzYWIwYWQuLjIzNzczMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwppbmRleCA3NDA5MmY0Li44ODk4N2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwpAQCAtMTQ5Niw3ICsxNDk2LDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGV0NjF4MjUxX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZXQ2MXgyNTFfdm1fb3BzID0gewogCS5vcGVuID0gZXQ2MXgyNTFfdm1fb3BlbiwKIAkuY2xvc2UgPSBldDYxeDI1MV92bV9jbG9zZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKaW5kZXggY2Y2NTQwZC4uMjNkM2ZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYwpAQCAtOTksNyArOTksNyBAQAogCQlmcmFtZS0+djRsMl9idWYuZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfTUFQUEVEOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGdzcGNhX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ3NwY2Ffdm1fb3BzID0gewogCS5vcGVuCQk9IGdzcGNhX3ZtX29wZW4sCiAJLmNsb3NlCQk9IGdzcGNhX3ZtX2Nsb3NlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMKaW5kZXggZDA3NjViZS4uMDFlMWVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMKQEAgLTI4LDYgKzI4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KQEAgLTE1ODksNyArMTU5MCw3IEBACiAJbWV5ZS52bWFfdXNlX2NvdW50W2lkeF0tLTsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtZXllX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbWV5ZV92bV9vcHMgPSB7CiAJLm9wZW4JCT0gbWV5ZV92bV9vcGVuLAogCS5jbG9zZQkJPSBtZXllX3ZtX2Nsb3NlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWFwaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtYXBpLmMKaW5kZXggYmI2ZGYxYi4uNmYwOTRhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtYXBpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtYXBpLmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoZGVidWcgJiBEQkdMVkxfQVBJKQorCWlmIChzYWFfZGVidWcgJiBEQkdMVkxfQVBJKQogCQlzYWE3MTY0X2R1bXBoZXgxNihkZXYsIGJ1ZiwgKGJ1Zmxlbi8xNikqMTYpOwogCiAJc2FhNzE2NF9hcGlfZHVtcF9zdWJkZXZzKGRldiwgYnVmLCBidWZsZW4pOwpAQCAtNDgwLDcgKzQ4MCw3IEBACiAKIAlkcHJpbnRrKERCR0xWTF9BUEksICIlcygpIGxlbiA9ICVkIGJ5dGVzXG4iLCBfX2Z1bmNfXywgbGVuKTsKIAotCWlmIChkZWJ1ZyAmIERCR0xWTF9JMkMpCisJaWYgKHNhYV9kZWJ1ZyAmIERCR0xWTF9JMkMpCiAJCXNhYTcxNjRfZHVtcGhleDE2KGRldiwgYnVmLCAyICogMTYpOwogCiAJcmV0ID0gc2FhNzE2NF9jbWRfc2VuZChidXMtPmRldiwgdW5pdGlkLCBHRVRfQ1VSLApAQCAtNDg4LDcgKzQ4OCw3IEBACiAJaWYgKHJldCAhPSBTQUFfT0spCiAJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBlcnJvciwgcmV0KDIpID0gMHgleFxuIiwgX19mdW5jX18sIHJldCk7CiAJZWxzZSB7Ci0JCWlmIChkZWJ1ZyAmIERCR0xWTF9JMkMpCisJCWlmIChzYWFfZGVidWcgJiBEQkdMVkxfSTJDKQogCQkJc2FhNzE2NF9kdW1waGV4MTYoZGV2LCBidWYsIHNpemVvZihidWYpKTsKIAkJbWVtY3B5KGRhdGEsIChidWYgKyAyICogc2l6ZW9mKHUzMikgKyByZWdsZW4pLCBkYXRhbGVuKTsKIAl9CkBAIC01NDgsNyArNTQ4LDcgQEAKIAkqKCh1MzIgKikoYnVmICsgMSAqIHNpemVvZih1MzIpKSkgPSBkYXRhbGVuIC0gcmVnbGVuOwogCW1lbWNweSgoYnVmICsgMiAqIHNpemVvZih1MzIpKSwgZGF0YSwgZGF0YWxlbik7CiAKLQlpZiAoZGVidWcgJiBEQkdMVkxfSTJDKQorCWlmIChzYWFfZGVidWcgJiBEQkdMVkxfSTJDKQogCQlzYWE3MTY0X2R1bXBoZXgxNihkZXYsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCiAJcmV0ID0gc2FhNzE2NF9jbWRfc2VuZChidXMtPmRldiwgdW5pdGlkLCBTRVRfQ1VSLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY21kLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jbWQuYwppbmRleCBlMDk3ZjFhLi5jNDU5NjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jbWQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jbWQuYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGFtcDsKIAlpbnQgcjsKIAotCWlmIChkZWJ1ZyA+PSA0KQorCWlmIChzYWFfZGVidWcgPj0gNCkKIAkJc2FhNzE2NF9idXNfZHVtcChkZXYpOwogCiAJZHByaW50ayhEQkdMVkxfQ01ELCAiJXMoc2Vxbm89JWQpXG4iLCBfX2Z1bmNfXywgc2Vxbm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY29yZS5jCmluZGV4IGYwZGJlYWQuLjcwOWFmZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jb3JlLmMKQEAgLTQ1LDggKzQ1LDggQEAKICAzMiBidXMKICAqLwogCi11bnNpZ25lZCBpbnQgZGVidWc7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Cit1bnNpZ25lZCBpbnQgc2FhX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBzYWFfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CiAKIHVuc2lnbmVkIGludCB3YWl0c2VjcyA9IDEwOwpAQCAtNjUzLDcgKzY1Myw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBVbnN1cHBvcnRlZCBib2FyZCBkZXRlY3RlZCwgIgogCQkJInJlZ2lzdGVyaW5nIHdpdGhvdXQgZmlybXdhcmVcbiIsIF9fZnVuY19fKTsKIAotCWRwcmludGsoMSwgIiVzKCkgcGFyYW1ldGVyIGRlYnVnID0gJWRcbiIsIF9fZnVuY19fLCBkZWJ1Zyk7CisJZHByaW50aygxLCAiJXMoKSBwYXJhbWV0ZXIgZGVidWcgPSAlZFxuIiwgX19mdW5jX18sIHNhYV9kZWJ1Zyk7CiAJZHByaW50aygxLCAiJXMoKSBwYXJhbWV0ZXIgd2FpdHNlY3MgPSAlZFxuIiwgX19mdW5jX18sIHdhaXRzZWNzKTsKIAogZmFpbF9mdzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC5oCmluZGV4IDY3NTMwMDguLjQyNjYwYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQuaApAQCAtMzc1LDkgKzM3NSw5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgZGVidWc7CitleHRlcm4gdW5zaWduZWQgaW50IHNhYV9kZWJ1ZzsKICNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pXAotCWRvIHsgaWYgKGRlYnVnICYgbGV2ZWwpXAorCWRvIHsgaWYgKHNhYV9kZWJ1ZyAmIGxldmVsKVwKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgZGV2LT5uYW1lLCAjIyBhcmcpO1wKIAl9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKaW5kZXggNWFiN2M1YS4uNjVhYzQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYwpAQCAtNDA0LDcgKzQwNCw3IEBACiAJCSAiU3VwZXJIIE1vYmlsZSBDRVUgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIAotCWNsa19lbmFibGUocGNkZXYtPmNsayk7CisJcG1fcnVudGltZV9nZXRfc3luYyhpY2ktPnY0bDJfZGV2LmRldik7CiAKIAljZXVfd3JpdGUocGNkZXYsIENBUFNSLCAxIDw8IDE2KTsgLyogcmVzZXQgKi8KIAl3aGlsZSAoY2V1X3JlYWQocGNkZXYsIENTVFNSKSAmIDEpCkBAIC00MzgsNyArNDM4LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNkZXYtPmxvY2ssIGZsYWdzKTsKIAotCWNsa19kaXNhYmxlKHBjZGV2LT5jbGspOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoaWNpLT52NGwyX2Rldi5kZXYpOwogCiAJZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LAogCQkgIlN1cGVySCBNb2JpbGUgQ0VVIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwppbmRleCA5ZDg0Yzk0Li40YTc3MTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCkBAIC0yMDc3LDcgKzIwNzcsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc245YzEwMl92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNuOWMxMDJfdm1fb3BzID0gewogCS5vcGVuID0gc245YzEwMl92bV9vcGVuLAogCS5jbG9zZSA9IHNuOWMxMDJfdm1fY2xvc2UsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0ay13ZWJjYW0uYwppbmRleCAwYjk5NmVhLi42YjQxODY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0ay13ZWJjYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0ay13ZWJjYW0uYwpAQCAtNzkwLDcgKzc5MCw3IEBACiAJaWYgKHNidWYtPm1hcGNvdW50ID09IDApCiAJCXNidWYtPnY0bGJ1Zi5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19NQVBQRUQ7CiB9Ci1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHN0a192NGxfdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzdGtfdjRsX3ZtX29wcyA9IHsKIAkub3BlbiA9IHN0a192NGxfdm1fb3BlbiwKIAkuY2xvc2UgPSBzdGtfdjRsX3ZtX2Nsb3NlCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jb3JlLmMKaW5kZXggNmJhMTZhYi4uZTBmOTFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY29yZS5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1pMmMuYwppbmRleCBmOTdmZDA2Li5jMTlmNTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24taTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWkyYy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwppbmRleCA5MGQ5YjVjLi5hMmE1MGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwpAQCAtNTIsNyArNTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYwppbmRleCA5ZTczNTE1Li5hMmJkZDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKQEAgLTEwNjksNyArMTA2OSw3IEBACiAJYnVmZmVyLT52bWFfdXNlX2NvdW50LS07CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdXZjX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdXZjX3ZtX29wcyA9IHsKIAkub3BlbgkJPSB1dmNfdm1fb3BlbiwKIAkuY2xvc2UJCT0gdXZjX3ZtX2Nsb3NlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1jb3JlLmMKaW5kZXggZjFjY2Y5OC4uOGU5M2M2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1jb3JlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLWNvbnRpZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtY29udGlnLmMKaW5kZXggZDA5Y2U4My4uNjM1ZmZjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtY29udGlnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtY29udGlnLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2aWRlb2J1Zl92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHZpZGVvYnVmX3ZtX29wcyA9IHsKIAkub3BlbiAgICAgPSB2aWRlb2J1Zl92bV9vcGVuLAogCS5jbG9zZSAgICA9IHZpZGVvYnVmX3ZtX2Nsb3NlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jCmluZGV4IGE4ZGQyMmEuLjAzMmViYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCkBAIC0zOTQsNyArMzk1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2aWRlb2J1Zl92bV9vcHMgPQorc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2aWRlb2J1Zl92bV9vcHMgPQogewogCS5vcGVuICAgICA9IHZpZGVvYnVmX3ZtX29wZW4sCiAJLmNsb3NlICAgID0gdmlkZW9idWZfdm1fY2xvc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLXZtYWxsb2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtdm1hbGxvYy5jCmluZGV4IDMwYWUzMGYuLjM1ZjM5MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtdm1hbGxvYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtdm1hbGxvYy5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdmlkZW9idWZfdm1fb3BzID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdmlkZW9idWZfdm1fb3BzID0KIHsKIAkub3BlbiAgICAgPSB2aWRlb2J1Zl92bV9vcGVuLAogCS5jbG9zZSAgICA9IHZpZGVvYnVmX3ZtX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwppbmRleCBjZDZhMzQ0Li5iMDM0YTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwpAQCAtMzg1Nyw3ICszODU3LDcgQEAKIAlkcHJpbnRrKCJ2aW5vX3ZtX2Nsb3NlKCk6IGNvdW50ID0gJWRcbiIsIGZiLT5tYXBfY291bnQpOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHZpbm9fdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2aW5vX3ZtX29wcyA9IHsKIAkub3Blbgk9IHZpbm9fdm1fb3BlbiwKIAkuY2xvc2UJPSB2aW5vX3ZtX2Nsb3NlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfY29yZS5jCmluZGV4IGIzYzY0MzYuLjMxMmE3MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYwpAQCAtOTM1LDcgKzkzNSw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB6YzAzMDFfdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB6YzAzMDFfdm1fb3BzID0gewogCS5vcGVuID0gemMwMzAxX3ZtX29wZW4sCiAJLmNsb3NlID0gemMwMzAxX3ZtX2Nsb3NlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RyaXZlci5jCmluZGV4IGJjZGVmYjEuLjQ3MTM3ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kcml2ZXIuYwpAQCAtMzE3Miw3ICszMTcyLDcgQEAKIAltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB6b3Jhbl92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHpvcmFuX3ZtX29wcyA9IHsKIAkub3BlbiA9IHpvcmFuX3ZtX29wZW4sCiAJLmNsb3NlID0gem9yYW5fdm1fY2xvc2UsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwppbmRleCBhNWI0NDhlLi5iM2JmMWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwpAQCAtMzM5LDkgKzMzOSw5IEBACiAJCQljYXJkLT5pZC50eXBlID0gaWRfcmVnLnR5cGU7CiAJCQljYXJkLT5pZC5jYXRlZ29yeSA9IGlkX3JlZy5jYXRlZ29yeTsKIAkJCWNhcmQtPmlkLmNsYXNzID0gaWRfcmVnLmNsYXNzOworCQkJZGV2X2RiZygmY2FyZC0+ZGV2LCAiaWZfbW9kZSA9ICUwMnhcbiIsIGlkX3JlZy5pZl9tb2RlKTsKIAkJfQogCQljb21wbGV0ZSgmY2FyZC0+bXJxX2NvbXBsZXRlKTsKLQkJZGV2X2RiZygmY2FyZC0+ZGV2LCAiaWZfbW9kZSA9ICUwMnhcbiIsIGlkX3JlZy5pZl9tb2RlKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKaW5kZXggYmMyZWMyMS4uMzRmM2YzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2RlZmluZSBteV9WRVJTSU9OCU1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTgogI2RlZmluZSBNWU5BTQkJIm1wdGxhbiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiMzEwMC1jb3JlLmMgYi9kcml2ZXJzL21mZC9hYjMxMDAtY29yZS5jCmluZGV4IDU0NDdkYTEuLjYxMzQ4MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FiMzEwMC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvYWIzMTAwLWNvcmUuYwpAQCAtNTcsOCArNTcsNiBAQAogICogVGhlIEFCMzEwMCBpcyB1c3VhbGx5IGFzc2lnbmVkIGFkZHJlc3MgMHg0OCAoNy1iaXQpCiAgKiBUaGUgY2hpcCBpcyBkZWZpbmVkIGluIHRoZSBwbGF0Zm9ybSBpMmNfYm9hcmRfZGF0YSBzZWN0aW9uLgogICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQ4LCBJMkNfQ0xJRU5UX0VORCB9OwotSTJDX0NMSUVOVF9JTlNNT0RfMShhYjMxMDApOwogCiB1OCBhYjMxMDBfZ2V0X2NoaXBfdHlwZShzdHJ1Y3QgYWIzMTAwICphYjMxMDApCiB7CkBAIC05NjYsNyArOTY0LDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFiMzEwMF9pZFtdID0gewotCXsgImFiMzEwMCIsIGFiMzEwMCB9LAorCXsgImFiMzEwMCIsIDAgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWIzMTAwX2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtY29yZS5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMKaW5kZXggZTQyNGNmNi4uYTFjNDdlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMKQEAgLTQ4MCw3ICs0ODAsNiBAQAogYWRkX2NoaWxkcmVuKHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBkYXRhLCB1bnNpZ25lZCBsb25nIGZlYXR1cmVzKQogewogCXN0cnVjdCBkZXZpY2UJKmNoaWxkOwotCXN0cnVjdCBkZXZpY2UJKnVzYl90cmFuc2NlaXZlciA9IE5VTEw7CiAKIAlpZiAodHdsX2hhc19iY2koKSAmJiBwZGF0YS0+YmNpICYmICEoZmVhdHVyZXMgJiBUUFNfU1VCU0VUKSkgewogCQljaGlsZCA9IGFkZF9jaGlsZCgzLCAidHdsNDAzMF9iY2kiLApAQCAtNTMyLDE2ICs1MzEsNjEgQEAKIAl9CiAKIAlpZiAodHdsX2hhc191c2IoKSAmJiBwZGF0YS0+dXNiKSB7CisKKwkJc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHVzYjF2NSA9IHsKKwkJCS5zdXBwbHkgPQkidXNiMXY1IiwKKwkJfTsKKwkJc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHVzYjF2OCA9IHsKKwkJCS5zdXBwbHkgPQkidXNiMXY4IiwKKwkJfTsKKwkJc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHVzYjN2MSA9IHsKKwkJCS5zdXBwbHkgPQkidXNiM3YxIiwKKwkJfTsKKworCS8qIEZpcnN0IGFkZCB0aGUgcmVndWxhdG9ycyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYnkgdHJhbnNjZWl2ZXIgKi8KKwkJaWYgKHR3bF9oYXNfcmVndWxhdG9yKCkpIHsKKwkJCS8qIHRoaXMgaXMgYSB0ZW1wbGF0ZSB0aGF0IGdldHMgY29waWVkICovCisJCQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB1c2JfZml4ZWQgPSB7CisJCQkJLmNvbnN0cmFpbnRzLnZhbGlkX21vZGVzX21hc2sgPQorCQkJCQlSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkJCS5jb25zdHJhaW50cy52YWxpZF9vcHNfbWFzayA9CisJCQkJCVJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkJfTsKKworCQkJY2hpbGQgPSBhZGRfcmVndWxhdG9yX2xpbmtlZChUV0w0MDMwX1JFR19WVVNCMVY1LAorCQkJCQkJICAgICAgJnVzYl9maXhlZCwgJnVzYjF2NSwgMSk7CisJCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcl9saW5rZWQoVFdMNDAzMF9SRUdfVlVTQjFWOCwKKwkJCQkJCSAgICAgICZ1c2JfZml4ZWQsICZ1c2IxdjgsIDEpOworCQkJaWYgKElTX0VSUihjaGlsZCkpCisJCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCQljaGlsZCA9IGFkZF9yZWd1bGF0b3JfbGlua2VkKFRXTDQwMzBfUkVHX1ZVU0IzVjEsCisJCQkJCQkgICAgICAmdXNiX2ZpeGVkLCAmdXNiM3YxLCAxKTsKKwkJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQl9CisKIAkJY2hpbGQgPSBhZGRfY2hpbGQoMCwgInR3bDQwMzBfdXNiIiwKIAkJCQlwZGF0YS0+dXNiLCBzaXplb2YoKnBkYXRhLT51c2IpLAogCQkJCXRydWUsCiAJCQkJLyogaXJxMCA9IFVTQl9QUkVTLCBpcnExID0gVVNCICovCiAJCQkJcGRhdGEtPmlycV9iYXNlICsgOCArIDIsIHBkYXRhLT5pcnFfYmFzZSArIDQpOworCiAJCWlmIChJU19FUlIoY2hpbGQpKQogCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwogCiAJCS8qIHdlIG5lZWQgdG8gY29ubmVjdCByZWd1bGF0b3JzIHRvIHRoaXMgdHJhbnNjZWl2ZXIgKi8KLQkJdXNiX3RyYW5zY2VpdmVyID0gY2hpbGQ7CisJCWlmICh0d2xfaGFzX3JlZ3VsYXRvcigpICYmIGNoaWxkKSB7CisJCQl1c2IxdjUuZGV2ID0gY2hpbGQ7CisJCQl1c2IxdjguZGV2ID0gY2hpbGQ7CisJCQl1c2IzdjEuZGV2ID0gY2hpbGQ7CisJCX0KIAl9CiAKIAlpZiAodHdsX2hhc193YXRjaGRvZygpKSB7CkBAIC01ODAsNDcgKzYyNCw2IEBACiAJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CiAJfQogCi0JaWYgKHR3bF9oYXNfcmVndWxhdG9yKCkgJiYgdXNiX3RyYW5zY2VpdmVyKSB7Ci0JCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IxdjUgPSB7Ci0JCQkuc3VwcGx5ID0JInVzYjF2NSIsCi0JCX07Ci0JCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IxdjggPSB7Ci0JCQkuc3VwcGx5ID0JInVzYjF2OCIsCi0JCX07Ci0JCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IzdjEgPSB7Ci0JCQkuc3VwcGx5ID0JInVzYjN2MSIsCi0JCX07Ci0KLQkJLyogdGhpcyBpcyBhIHRlbXBsYXRlIHRoYXQgZ2V0cyBjb3BpZWQgKi8KLQkJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdXNiX2ZpeGVkID0gewotCQkJLmNvbnN0cmFpbnRzLnZhbGlkX21vZGVzX21hc2sgPQotCQkJCSAgUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkJLmNvbnN0cmFpbnRzLnZhbGlkX29wc19tYXNrID0KLQkJCQkgIFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCX07Ci0KLQkJdXNiMXY1LmRldiA9IHVzYl90cmFuc2NlaXZlcjsKLQkJdXNiMXY4LmRldiA9IHVzYl90cmFuc2NlaXZlcjsKLQkJdXNiM3YxLmRldiA9IHVzYl90cmFuc2NlaXZlcjsKLQotCQljaGlsZCA9IGFkZF9yZWd1bGF0b3JfbGlua2VkKFRXTDQwMzBfUkVHX1ZVU0IxVjUsICZ1c2JfZml4ZWQsCi0JCQkJJnVzYjF2NSwgMSk7Ci0JCWlmIChJU19FUlIoY2hpbGQpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwotCi0JCWNoaWxkID0gYWRkX3JlZ3VsYXRvcl9saW5rZWQoVFdMNDAzMF9SRUdfVlVTQjFWOCwgJnVzYl9maXhlZCwKLQkJCQkmdXNiMXY4LCAxKTsKLQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0KLQkJY2hpbGQgPSBhZGRfcmVndWxhdG9yX2xpbmtlZChUV0w0MDMwX1JFR19WVVNCM1YxLCAmdXNiX2ZpeGVkLAotCQkJCSZ1c2IzdjEsIDEpOwotCQlpZiAoSVNfRVJSKGNoaWxkKSkKLQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKLQl9Ci0KIAkvKiBtYXliZSBhZGQgTERPcyB0aGF0IGFyZSBvbWl0dGVkIG9uIGNvc3QtcmVkdWNlZCBwYXJ0cyAqLwogCWlmICh0d2xfaGFzX3JlZ3VsYXRvcigpICYmICEoZmVhdHVyZXMgJiBUUFNfU1VCU0VUKSkgewogCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVlBMTDIsIHBkYXRhLT52cGxsMik7CkBAIC03OTIsNyArNzk1LDcgQEAKIAkJCXR3bC0+Y2xpZW50ID0gaTJjX25ld19kdW1teShjbGllbnQtPmFkYXB0ZXIsCiAJCQkJCXR3bC0+YWRkcmVzcyk7CiAJCQlpZiAoIXR3bC0+Y2xpZW50KSB7Ci0JCQkJZGV2X2VycigmdHdsLT5jbGllbnQtPmRldiwKKwkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCQkJImNhbid0IGF0dGFjaCBjbGllbnQgJWRcbiIsIGkpOwogCQkJCXN0YXR1cyA9IC1FTk9NRU07CiAJCQkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMTQwMF9jb3JlLmMgYi9kcml2ZXJzL21mZC91Y2IxNDAwX2NvcmUuYwppbmRleCAyYWZjMDgwLi5mYTI5NGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC91Y2IxNDAwX2NvcmUuYworKysgYi9kcml2ZXJzL21mZC91Y2IxNDAwX2NvcmUuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VjYjE0MDAuaD4KIAogdW5zaWduZWQgaW50IHVjYjE0MDBfYWRjX3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1MTYgYWRjX2NoYW5uZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCmluZGV4IGZlYTkwODUuLjYwYzM5ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYwppbmRleCBkMzAxNWRmLi5hYzA1NmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCkBAIC01MDcsNiArNTA3LDggQEAKIHsKIAlpbnQgaSwgcmV0OwogCisJbXV0ZXhfaW5pdCgmd204MzF4LT5pcnFfbG9jayk7CisKIAlpZiAoIWlycSkgewogCQlkZXZfd2Fybih3bTgzMXgtPmRldiwKIAkJCSAiTm8gaW50ZXJydXB0IHNwZWNpZmllZCAtIGZ1bmN0aW9uYWxpdHkgbGltaXRlZFxuIik7CkBAIC01MjEsNyArNTIzLDYgQEAKIAl9CiAKIAl3bTgzMXgtPmlycSA9IGlycTsKLQltdXRleF9pbml0KCZ3bTgzMXgtPmlycV9sb2NrKTsKIAlJTklUX1dPUksoJndtODMxeC0+aXJxX3dvcmssIHdtODMxeF9pcnFfd29ya2VyKTsKIAogCS8qIE1hc2sgdGhlIGluZGl2aWR1YWwgaW50ZXJydXB0IHNvdXJjZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vbWF4Njg3NS5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9tYXg2ODc1LmMKaW5kZXggM2MwYzU4ZS4uNWE2YjJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9tYXg2ODc1LmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9tYXg2ODc1LmMKQEAgLTMzLDEyICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotLyogRG8gbm90IHNjYW4gLSB0aGUgTUFYNjg3NSBhY2Nlc3MgbWV0aG9kIHdpbGwgd3JpdGUgdG8gc29tZSBFRVBST00gY2hpcHMgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qIEluc21vZCBwYXJhbWV0ZXJzICovCi1JMkNfQ0xJRU5UX0lOU01PRF8xKG1heDY4NzUpOwotCiAvKiBUaGUgTUFYNjg3NSBjYW4gb25seSByZWFkL3dyaXRlIDE2IGJ5dGVzIGF0IGEgdGltZSAqLwogI2RlZmluZSBTTElDRV9TSVpFCQkJMTYKICNkZWZpbmUgU0xJQ0VfQklUUwkJCTQKQEAgLTE0NiwzMSArMTQwLDIxIEBACiAJLnJlYWQgPSBtYXg2ODc1X3JlYWQsCiB9OwogCi0vKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgbWF4Njg3NV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGtpbmQsCi0JCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgbWF4Njg3NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJc3RydWN0IG1heDY4NzVfZGF0YSAqZGF0YTsKKwlpbnQgZXJyOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEKIAkJCQkgICAgIHwgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiBPbmx5IGNoZWNrIGV2ZW4gYWRkcmVzc2VzICovCisJLyogT25seSBiaW5kIHRvIGV2ZW4gYWRkcmVzc2VzICovCiAJaWYgKGNsaWVudC0+YWRkciAmIDEpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3RybGNweShpbmZvLT50eXBlLCAibWF4Njg3NSIsIEkyQ19OQU1FX1NJWkUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Njg3NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgbWF4Njg3NV9kYXRhICpkYXRhOwotCWludCBlcnI7Ci0KIAlpZiAoIShkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1heDY4NzVfZGF0YSksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIyMiw5ICsyMDYsNiBAQAogCS5wcm9iZQkJPSBtYXg2ODc1X3Byb2JlLAogCS5yZW1vdmUJCT0gbWF4Njg3NV9yZW1vdmUsCiAJLmlkX3RhYmxlCT0gbWF4Njg3NV9pZCwKLQotCS5kZXRlY3QJCT0gbWF4Njg3NV9kZXRlY3QsCi0JLmFkZHJlc3NfZGF0YQk9ICZhZGRyX2RhdGEsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBtYXg2ODc1X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ocGlsby5jIGIvZHJpdmVycy9taXNjL2hwaWxvLmMKaW5kZXggMWFkMjdjNi4uYTkyYTNhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2hwaWxvLmMKKysrIGIvZHJpdmVycy9taXNjL2hwaWxvLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vY29tbWFuZC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKaW5kZXggMjc2ZDNmYi4uZTIwMzE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAiaWJtYXNtLmgiCiAjaW5jbHVkZSAibG93bGV2ZWwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jCmluZGV4IDY4YTBhNWIuLjU3MmQ0MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAiaWJtYXNtLmgiCiAjaW5jbHVkZSAibG93bGV2ZWwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9yX2hlYXJ0YmVhdC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9yX2hlYXJ0YmVhdC5jCmluZGV4IGJlYzllMmMuLjJkZTQ4N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vcl9oZWFydGJlYXQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3JfaGVhcnRiZWF0LmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAiaWJtYXNtLmgiCiAjaW5jbHVkZSAiZG90X2NvbW1hbmQuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3BoYW50b20uYyBiL2RyaXZlcnMvbWlzYy9waGFudG9tLmMKaW5kZXggZmE1N2I2Ny4uMDRjMjcyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3BoYW50b20uYworKysgYi9kcml2ZXJzL21pc2MvcGhhbnRvbS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BoYW50b20uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC0yNzEsNyArMjcyLDcgQEAKIAlyZXR1cm4gbWFzazsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGhhbnRvbV9maWxlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBoYW50b21fZmlsZV9vcHMgPSB7CiAJLm9wZW4gPSBwaGFudG9tX29wZW4sCiAJLnJlbGVhc2UgPSBwaGFudG9tX3JlbGVhc2UsCiAJLnVubG9ja2VkX2lvY3RsID0gcGhhbnRvbV9pb2N0bCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZpbGUuYyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZpbGUuYwppbmRleCBhZWQ2MDk4Li40MWM4ZmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVmaWxlLmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmlsZS5jCkBAIC01Myw3ICs1Myw2IEBACiAvKiBHdWFyYW50ZWVkIHVzZXIgYXZhaWxhYmxlIHJlc291cmNlcyBvbiBlYWNoIG5vZGUgKi8KIHN0YXRpYyBpbnQgbWF4X3VzZXJfY2JycywgbWF4X3VzZXJfZHNyX2J5dGVzOwogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBncnVfZm9wczsKIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBncnVfbWlzY2RldjsKIAogCkBAIC00MjYsNyArNDI1LDcgQEAKIAlncnVfcHJvY19leGl0KCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdydV9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3J1X2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS51bmxvY2tlZF9pb2N0bAk9IGdydV9maWxlX3VubG9ja2VkX2lvY3RsLAogCS5tbWFwCQk9IGdydV9maWxlX21tYXAsCkBAIC00MzgsNyArNDM3LDcgQEAKIAkuZm9wcwkJPSAmZ3J1X2ZvcHMsCiB9OwogCi1zdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ3J1X3ZtX29wcyA9IHsKK2NvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBncnVfdm1fb3BzID0gewogCS5jbG9zZQkJPSBncnVfdm1hX2Nsb3NlLAogCS5mYXVsdAkJPSBncnVfZmF1bHQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1a3NlcnZpY2VzLmMgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVrc2VydmljZXMuYwppbmRleCA3OTY4OWIxLi43NjZlMjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVrc2VydmljZXMuYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVrc2VydmljZXMuYwpAQCAtOTM3LDYgKzkzNyw4IEBACiAKIAkvKiBOZWVkICAxSyBjYWNoZWxpbmUgYWxpZ25lZCB0aGF0IGRvZXMgbm90IGNyb3NzIHBhZ2UgYm91bmRhcnkgKi8KIAlwID0ga21hbGxvYyg0MDk2LCAwKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAltcSA9IEFMSUdOVVAocCwgMTAyNCk7CiAJbWVtc2V0KG1lcywgMHhlZSwgc2l6ZW9mKG1lcykpOwogCWR3ID0gbXE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVwcm9jZnMuYyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydXByb2Nmcy5jCmluZGV4IDljYmY5NWIuLjNmMjM3NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydXByb2Nmcy5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydXByb2Nmcy5jCkBAIC0xNjEsMTQgKzE2MSwxNSBAQAogc3RhdGljIHNzaXplX3Qgb3B0aW9uc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCiAJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWNoYXIgYnVmWzgwXTsKKwljaGFyIGJ1ZlsyMF07CiAKLQlpZiAoc3RybmNweV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBzaXplb2YoYnVmKSAtIDEpIDwgMCkKKwlpZiAoY291bnQgPj0gc2l6ZW9mKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JYnVmW2NvdW50IC0gMV0gPSAnXDAnOwotCWlmICghc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkpCi0JCWdydV9vcHRpb25zID0gdmFsOworCWJ1Zltjb3VudF0gPSAnXDAnOworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZncnVfb3B0aW9ucykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMzQwLDEwICszNDEsOSBAQAogCiBzdGF0aWMgaW50IGNyZWF0ZV9wcm9jX2ZpbGUoc3RydWN0IHByb2NfZW50cnkgKnApCiB7Ci0JcC0+ZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShwLT5uYW1lLCBwLT5tb2RlLCBwcm9jX2dydSk7CisJcC0+ZW50cnkgPSBwcm9jX2NyZWF0ZShwLT5uYW1lLCBwLT5tb2RlLCBwcm9jX2dydSwgcC0+Zm9wcyk7CiAJaWYgKCFwLT5lbnRyeSkKIAkJcmV0dXJuIC0xOwotCXAtPmVudHJ5LT5wcm9jX2ZvcHMgPSBwLT5mb3BzOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnV0YWJsZXMuaCBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydXRhYmxlcy5oCmluZGV4IDM0YWIzZDQuLjQ2OTkwYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydXRhYmxlcy5oCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydXRhYmxlcy5oCkBAIC02MjQsNyArNjI0LDcgQEAKICAqLwogc3RydWN0IGdydV91bmxvYWRfY29udGV4dF9yZXE7CiAKLWV4dGVybiBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ3J1X3ZtX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ3J1X3ZtX29wczsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlICpncnVkZXY7CiAKIGV4dGVybiBzdHJ1Y3QgZ3J1X3ZtYV9kYXRhICpncnVfYWxsb2Nfdm1hX2RhdGEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2RlYnVnZnMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jCmluZGV4IDYxMGRiZDEuLjk2ZDEwZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbW1jX2RiZ19leHRfY3NkX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtbWNfZGJnX2V4dF9jc2RfZm9wcyA9IHsKIAkub3BlbgkJPSBtbWNfZXh0X2NzZF9vcGVuLAogCS5yZWFkCQk9IG1tY19leHRfY3NkX3JlYWQsCiAJLnJlbGVhc2UJPSBtbWNfZXh0X2NzZF9yZWxlYXNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2Npcy5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2Npcy5jCmluZGV4IDY2MzYzNTQuLmY4NWRjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19jaXMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fY2lzLmMKQEAgLTI5LDYgKzI5LDggQEAKIAl1bnNpZ25lZCBpLCBucl9zdHJpbmdzOwogCWNoYXIgKipidWZmZXIsICpzdHJpbmc7CiAKKwkvKiBGaW5kIGFsbCBudWxsLXRlcm1pbmF0ZWQgKGluY2x1ZGluZyB6ZXJvIGxlbmd0aCkgc3RyaW5ncyBpbgorCSAgIHRoZSBUUExMVjFfSU5GTyBmaWVsZC4gVHJhaWxpbmcgZ2FyYmFnZSBpcyBpZ25vcmVkLiAqLwogCWJ1ZiArPSAyOwogCXNpemUgLT0gMjsKIApAQCAtMzksMTEgKzQxLDggQEAKIAkJaWYgKGJ1ZltpXSA9PSAwKQogCQkJbnJfc3RyaW5ncysrOwogCX0KLQotCWlmIChucl9zdHJpbmdzIDwgNCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTRElPOiBpZ25vcmluZyBicm9rZW4gQ0lTVFBMX1ZFUlNfMVxuIik7CisJaWYgKG5yX3N0cmluZ3MgPT0gMCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJc2l6ZSA9IGk7CiAKQEAgLTk4LDYgKzk3LDIyIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwZWVkX3VuaXRbOF0gPQogCXsgMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCwgMTAwMDAwMDAsIDAsIDAsIDAsIDAgfTsKIAorLyogRlVOQ0UgdHVwbGVzIHdpdGggdGhlc2UgdHlwZXMgZ2V0IHBhc3NlZCB0byBTRElPIGRyaXZlcnMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZ1bmNlX3R5cGVfd2hpdGVsaXN0W10gPSB7CisJNCAvKiBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQgdXNlZCBpbiBCcm9hZGNvbSBjYXJkcyAqLworfTsKKworc3RhdGljIGludCBjaXN0cGxfZnVuY2Vfd2hpdGVsaXN0ZWQodW5zaWduZWQgY2hhciB0eXBlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnVuY2VfdHlwZV93aGl0ZWxpc3QpOyBpKyspIHsKKwkJaWYgKGZ1bmNlX3R5cGVfd2hpdGVsaXN0W2ldID09IHR5cGUpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY2lzdHBsX2Z1bmNlX2NvbW1vbihzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCiAJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBzaXplKQogewpAQCAtMTIwLDYgKzEzNSwxMCBAQAogCXVuc2lnbmVkIHZzbjsKIAl1bnNpZ25lZCBtaW5fc2l6ZTsKIAorCS8qIGxldCBTRElPIGRyaXZlcnMgdGFrZSBjYXJlIG9mIHdoaXRlbGlzdGVkIEZVTkNFIHR1cGxlcyAqLworCWlmIChjaXN0cGxfZnVuY2Vfd2hpdGVsaXN0ZWQoYnVmWzBdKSkKKwkJcmV0dXJuIC1FSUxTRVE7CisKIAl2c24gPSBmdW5jLT5jYXJkLT5jY2NyLnNkaW9fdnNuOwogCW1pbl9zaXplID0gKHZzbiA9PSBTRElPX1NESU9fUkVWXzFfMDApID8gMjggOiA0MjsKIApAQCAtMTU0LDEzICsxNzMsMTIgQEAKIAllbHNlCiAJCXJldCA9IGNpc3RwbF9mdW5jZV9jb21tb24oY2FyZCwgYnVmLCBzaXplKTsKIAotCWlmIChyZXQpIHsKKwlpZiAocmV0ICYmIHJldCAhPSAtRUlMU0VRKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCBDSVNUUExfRlVOQ0Ugc2l6ZSAldSAiCiAJCSAgICAgICAidHlwZSAldVxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBzaXplLCBidWZbMF0pOwotCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHR5cGVkZWYgaW50ICh0cGxfcGFyc2VfdCkoc3RydWN0IG1tY19jYXJkICosIHN0cnVjdCBzZGlvX2Z1bmMgKiwKQEAgLTI1Myw4ICsyNzEsMzMgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2lzX3RwbF9saXN0KTsgaSsrKQogCQkJaWYgKGNpc190cGxfbGlzdFtpXS5jb2RlID09IHRwbF9jb2RlKQogCQkJCWJyZWFrOwotCQlpZiAoaSA+PSBBUlJBWV9TSVpFKGNpc190cGxfbGlzdCkpIHsKLQkJCS8qIHRoaXMgdHVwbGUgaXMgdW5rbm93biB0byB0aGUgY29yZSAqLworCQlpZiAoaSA8IEFSUkFZX1NJWkUoY2lzX3RwbF9saXN0KSkgeworCQkJY29uc3Qgc3RydWN0IGNpc190cGwgKnRwbCA9IGNpc190cGxfbGlzdCArIGk7CisJCQlpZiAodHBsX2xpbmsgPCB0cGwtPm1pbl9zaXplKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogYmFkIENJUyB0dXBsZSAweCUwMngiCisJCQkJICAgICAgICIgKGxlbmd0aCA9ICV1LCBleHBlY3RlZCA+PSAldSlcbiIsCisJCQkJICAgICAgIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKKwkJCQkgICAgICAgdHBsX2NvZGUsIHRwbF9saW5rLCB0cGwtPm1pbl9zaXplKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJfSBlbHNlIGlmICh0cGwtPnBhcnNlKSB7CisJCQkJcmV0ID0gdHBsLT5wYXJzZShjYXJkLCBmdW5jLAorCQkJCQkJIHRoaXMtPmRhdGEsIHRwbF9saW5rKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBXZSBkb24ndCBuZWVkIHRoZSB0dXBsZSBhbnltb3JlIGlmIGl0IHdhcworCQkJICogc3VjY2Vzc2Z1bGx5IHBhcnNlZCBieSB0aGUgU0RJTyBjb3JlIG9yIGlmIGl0IGlzCisJCQkgKiBub3QgZ29pbmcgdG8gYmUgcGFyc2VkIGJ5IFNESU8gZHJpdmVycy4KKwkJCSAqLworCQkJaWYgKCFyZXQgfHwgcmV0ICE9IC1FSUxTRVEpCisJCQkJa2ZyZWUodGhpcyk7CisJCX0gZWxzZSB7CisJCQkvKiB1bmtub3duIHR1cGxlICovCisJCQlyZXQgPSAtRUlMU0VROworCQl9CisKKwkJaWYgKHJldCA9PSAtRUlMU0VRKSB7CisJCQkvKiB0aGlzIHR1cGxlIGlzIHVua25vd24gdG8gdGhlIGNvcmUgb3Igd2hpdGVsaXN0ZWQgKi8KIAkJCXRoaXMtPm5leHQgPSBOVUxMOwogCQkJdGhpcy0+Y29kZSA9IHRwbF9jb2RlOwogCQkJdGhpcy0+c2l6ZSA9IHRwbF9saW5rOwpAQCAtMjYzLDE5ICszMDYsOCBAQAogCQkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCSAgICAgICAiJXM6IHF1ZXVpbmcgQ0lTIHR1cGxlIDB4JTAyeCBsZW5ndGggJXVcbiIsCiAJCQkgICAgICAgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCB0cGxfY29kZSwgdHBsX2xpbmspOwotCQl9IGVsc2UgewotCQkJY29uc3Qgc3RydWN0IGNpc190cGwgKnRwbCA9IGNpc190cGxfbGlzdCArIGk7Ci0JCQlpZiAodHBsX2xpbmsgPCB0cGwtPm1pbl9zaXplKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICIlczogYmFkIENJUyB0dXBsZSAweCUwMnggKGxlbmd0aCA9ICV1LCBleHBlY3RlZCA+PSAldSlcbiIsCi0JCQkJICAgICAgIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKLQkJCQkgICAgICAgdHBsX2NvZGUsIHRwbF9saW5rLCB0cGwtPm1pbl9zaXplKTsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJfSBlbHNlIGlmICh0cGwtPnBhcnNlKSB7Ci0JCQkJcmV0ID0gdHBsLT5wYXJzZShjYXJkLCBmdW5jLAotCQkJCQkJIHRoaXMtPmRhdGEsIHRwbF9saW5rKTsKLQkJCX0KLQkJCWtmcmVlKHRoaXMpOworCQkJLyoga2VlcCBvbiBhbmFseXppbmcgdHVwbGVzICovCisJCQlyZXQgPSAwOwogCQl9CiAKIAkJcHRyICs9IHRwbF9saW5rOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnIGIvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCmluZGV4IDdjYjA1N2YuLjQzMmFlODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKQEAgLTI3Niw2ICsyNzYsNDcgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIE1NQ19TM0NfSFdfU0RJT19JUlEKKyAgICAgICBib29sICJIYXJkd2FyZSBzdXBwb3J0IGZvciBTRElPIElSUSIKKyAgICAgICBkZXBlbmRzIG9uIE1NQ19TM0MKKyAgICAgICBoZWxwCisgICAgICAgICBFbmFibGUgdGhlIGhhcmR3YXJlIHN1cHBvcnQgZm9yIFNESU8gaW50ZXJydXB0cyBpbnN0ZWFkIG9mIHVzaW5nCisJIHRoZSBnZW5lcmljIHBvbGxpbmcgY29kZS4KKworY2hvaWNlCisJcHJvbXB0ICJTYW1zdW5nIFMzQyBTRC9NTUMgdHJhbnNmZXIgY29kZSIKKwlkZXBlbmRzIG9uIE1NQ19TM0MKKworY29uZmlnIE1NQ19TM0NfUElPCisJYm9vbCAiVXNlIFBJTyB0cmFuc2ZlcnMgb25seSIKKwloZWxwCisJICBVc2UgUElPIHRvIHRyYW5zZmVyIGRhdGEgYmV0d2VlbiBtZW1vcnkgYW5kIHRoZSBoYXJkd2FyZS4KKworCSAgUElPIGlzIHNsb3dlciB0aGFuIERNQSBhcyBpdCByZXF1aXJlcyBDUFUgaW5zdHJ1Y3Rpb25zIHRvCisJICBtb3ZlIHRoZSBkYXRhLiBUaGlzIGhhcyBiZWVuIHRoZSB0cmFkaXRpb25hbCBkZWZhdWx0IGZvcgorCSAgdGhlIFMzQyBNQ0kgZHJpdmVyLgorCitjb25maWcgTU1DX1MzQ19ETUEKKwlib29sICJVc2UgRE1BIHRyYW5zZmVycyBvbmx5IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVXNlIERNQSB0byB0cmFuc2ZlciBkYXRhIGJldHdlZW4gbWVtb3J5IGFuZCB0aGUgaGFyZGFyZS4KKworCSAgQ3VycmVudGx5LCB0aGUgRE1BIHN1cHBvcnQgaW4gdGhpcyBkcml2ZXIgc2VlbXMgdG8gbm90IGJlCisJICB3b3JraW5nIHByb3Blcmx5IGFuZCBuZWVkcyB0byBiZSBkZWJ1Z2dlZCBiZWZvcmUgdGhpcworCSAgb3B0aW9uIGlzIHVzZWZ1bC4KKworY29uZmlnIE1NQ19TM0NfUElPRE1BCisJYm9vbCAiU3VwcG9ydCBmb3IgYm90aCBQSU8gYW5kIERNQSAoRVhQRVJJTUVOVEFMKSIKKwloZWxwCisJICBDb21waWxlIGJvdGggdGhlIFBJTyBhbmQgRE1BIHRyYW5zZmVyIHJvdXRpbmVzIGludG8gdGhlCisJICBkcml2ZXIgYW5kIGxldCB0aGUgcGxhdGZvcm0gc2VsZWN0IGF0IHJ1bi10aW1lIHdoaWNoIG9uZQorCSAgaXMgYmVzdC4KKworCSAgU2VlIG5vdGVzIGZvciB0aGUgRE1BIG9wdGlvbi4KKworZW5kY2hvaWNlCisKIGNvbmZpZyBNTUNfU0RSSUNPSF9DUwogCXRyaXN0YXRlICJNTUMvU0QgZHJpdmVyIGZvciBSaWNvaCBCYXkxQ29udHJvbGxlcnMgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgUENJICYmIFBDTUNJQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9hdDkxX21jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9hdDkxX21jaS5jCmluZGV4IGU1NTZkNDIuLjYzOTI0ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmMKQEAgLTcyLDcgKzcyLDYgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoL21tYy5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9tY2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCmluZGV4IDA2NWZhODEuLmZjMjU1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYwpAQCAtNTk5LDYgKzU5OSw3IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0CQkqc2c7CiAJdW5zaWduZWQgaW50CQkJaTsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbgkJZGlyZWN0aW9uOworCXVuc2lnbmVkIGludAkJCXNnbGVuOwogCiAJLyoKIAkgKiBXZSBkb24ndCBkbyBETUEgb24gImNvbXBsZXgiIHRyYW5zZmVycywgaS5lLiB3aXRoCkBAIC02MjgsMTEgKzYyOSwxNCBAQAogCWVsc2UKIAkJZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKIAorCXNnbGVuID0gZG1hX21hcF9zZygmaG9zdC0+cGRldi0+ZGV2LCBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLCBkaXJlY3Rpb24pOworCWlmIChzZ2xlbiAhPSBkYXRhLT5zZ19sZW4pCisJCWdvdG8gdW5tYXBfZXhpdDsKIAlkZXNjID0gY2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFuLAogCQkJZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwgZGlyZWN0aW9uLAogCQkJRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKIAlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIHVubWFwX2V4aXQ7CiAKIAlob3N0LT5kbWEuZGF0YV9kZXNjID0gZGVzYzsKIAlkZXNjLT5jYWxsYmFjayA9IGF0bWNpX2RtYV9jb21wbGV0ZTsKQEAgLTY0Myw2ICs2NDcsOSBAQAogCWNoYW4tPmRldmljZS0+ZGV2aWNlX2lzc3VlX3BlbmRpbmcoY2hhbik7CiAKIAlyZXR1cm4gMDsKK3VubWFwX2V4aXQ6CisJZG1hX3VubWFwX3NnKCZob3N0LT5wZGV2LT5kZXYsIGRhdGEtPnNnLCBzZ2xlbiwgZGlyZWN0aW9uKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogI2Vsc2UgLyogQ09ORklHX01NQ19BVE1FTE1DSV9ETUEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKaW5kZXggODc0MWQwZi4uNzA1YTU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKQEAgLTIyLDEyICsyMiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tbWMuaD4KIAogI2luY2x1ZGUgIm1tY2kuaCIKIApAQCAtMzgsNiArMzksMzYgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBmbWF4ID0gNTE1NjMzOwogCisvKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGhvc3QtPmxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBtbWNpX3NldF9jbGtyZWcoc3RydWN0IG1tY2lfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IGRlc2lyZWQpCit7CisJdTMyIGNsayA9IDA7CisKKwlpZiAoZGVzaXJlZCkgeworCQlpZiAoZGVzaXJlZCA+PSBob3N0LT5tY2xrKSB7CisJCQljbGsgPSBNQ0lfQ0xLX0JZUEFTUzsKKwkJCWhvc3QtPmNjbGsgPSBob3N0LT5tY2xrOworCQl9IGVsc2UgeworCQkJY2xrID0gaG9zdC0+bWNsayAvICgyICogZGVzaXJlZCkgLSAxOworCQkJaWYgKGNsayA+PSAyNTYpCisJCQkJY2xrID0gMjU1OworCQkJaG9zdC0+Y2NsayA9IGhvc3QtPm1jbGsgLyAoMiAqIChjbGsgKyAxKSk7CisJCX0KKwkJaWYgKGhvc3QtPmh3X2Rlc2lnbmVyID09IDB4ODApCisJCQljbGsgfD0gTUNJX0ZDRU47IC8qIEJ1ZyBmaXggaW4gU1QgSVAgYmxvY2sgKi8KKwkJY2xrIHw9IE1DSV9DTEtfRU5BQkxFOworCQkvKiBUaGlzIGhhc24ndCBwcm92ZW4gdG8gYmUgd29ydGh3aGlsZSAqLworCQkvKiBjbGsgfD0gTUNJX0NMS19QV1JTQVZFOyAqLworCX0KKworCWlmIChob3N0LT5tbWMtPmlvcy5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF80KQorCQljbGsgfD0gTUNJX1dJREVfQlVTOworCisJd3JpdGVsKGNsaywgaG9zdC0+YmFzZSArIE1NQ0lDTE9DSyk7Cit9CisKIHN0YXRpYyB2b2lkCiBtbWNpX3JlcXVlc3RfZW5kKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewpAQCAtNDE5LDMwICs0NTAsMzEgQEAKIHN0YXRpYyB2b2lkIG1tY2lfc2V0X2lvcyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19pb3MgKmlvcykKIHsKIAlzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKLQl1MzIgY2xrID0gMCwgcHdyID0gMDsKLQotCWlmIChpb3MtPmNsb2NrKSB7Ci0JCWlmIChpb3MtPmNsb2NrID49IGhvc3QtPm1jbGspIHsKLQkJCWNsayA9IE1DSV9DTEtfQllQQVNTOwotCQkJaG9zdC0+Y2NsayA9IGhvc3QtPm1jbGs7Ci0JCX0gZWxzZSB7Ci0JCQljbGsgPSBob3N0LT5tY2xrIC8gKDIgKiBpb3MtPmNsb2NrKSAtIDE7Ci0JCQlpZiAoY2xrID49IDI1NikKLQkJCQljbGsgPSAyNTU7Ci0JCQlob3N0LT5jY2xrID0gaG9zdC0+bWNsayAvICgyICogKGNsayArIDEpKTsKLQkJfQotCQlpZiAoaG9zdC0+aHdfZGVzaWduZXIgPT0gQU1CQV9WRU5ET1JfU1QpCi0JCQljbGsgfD0gTUNJX0ZDRU47IC8qIEJ1ZyBmaXggaW4gU1QgSVAgYmxvY2sgKi8KLQkJY2xrIHw9IE1DSV9DTEtfRU5BQkxFOwotCX0KLQotCWlmIChob3N0LT5wbGF0LT50cmFuc2xhdGVfdmRkKQotCQlwd3IgfD0gaG9zdC0+cGxhdC0+dHJhbnNsYXRlX3ZkZChtbWNfZGV2KG1tYyksIGlvcy0+dmRkKTsKKwl1MzIgcHdyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3dpdGNoIChpb3MtPnBvd2VyX21vZGUpIHsKIAljYXNlIE1NQ19QT1dFUl9PRkY6CisJCWlmKGhvc3QtPnZjYyAmJgorCQkgICByZWd1bGF0b3JfaXNfZW5hYmxlZChob3N0LT52Y2MpKQorCQkJcmVndWxhdG9yX2Rpc2FibGUoaG9zdC0+dmNjKTsKIAkJYnJlYWs7CiAJY2FzZSBNTUNfUE9XRVJfVVA6CisjaWZkZWYgQ09ORklHX1JFR1VMQVRPUgorCQlpZiAoaG9zdC0+dmNjKQorCQkJLyogVGhpcyBpbXBsaWNpdGx5IGVuYWJsZXMgdGhlIHJlZ3VsYXRvciAqLworCQkJbW1jX3JlZ3VsYXRvcl9zZXRfb2NyKGhvc3QtPnZjYywgaW9zLT52ZGQpOworI2VuZGlmCisJCS8qCisJCSAqIFRoZSB0cmFuc2xhdGVfdmRkIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGlmIHlvdSBoYXZlCisJCSAqIGFuIGV4dGVybmFsIHJlZ3VsYXRvciwgb3IgeW91ciBkZXNpZ24gaXMgcmVhbGx5IHdlaXJkLgorCQkgKiBVc2luZyBpdCB3b3VsZCBtZWFuIHNlbmRpbmcgaW4gcG93ZXIgY29udHJvbCBCT1RIIHVzaW5nCisJCSAqIGEgcmVndWxhdG9yIEFORCB0aGUgNCBNTUNJUFdSIGJpdHMuIElmIHdlIGRvbid0IGhhdmUKKwkJICogYSByZWd1bGF0b3IsIHdlIG1pZ2h0IGhhdmUgc29tZSBvdGhlciBwbGF0Zm9ybSBzcGVjaWZpYworCQkgKiBwb3dlciBjb250cm9sIGJlaGluZCB0aGlzIHRyYW5zbGF0ZSBmdW5jdGlvbi4KKwkJICovCisJCWlmICghaG9zdC0+dmNjICYmIGhvc3QtPnBsYXQtPnRyYW5zbGF0ZV92ZGQpCisJCQlwd3IgfD0gaG9zdC0+cGxhdC0+dHJhbnNsYXRlX3ZkZChtbWNfZGV2KG1tYyksIGlvcy0+dmRkKTsKIAkJLyogVGhlIFNUIHZlcnNpb24gZG9lcyBub3QgaGF2ZSB0aGlzLCBmYWxsIHRocm91Z2ggdG8gUE9XRVJfT04gKi8KIAkJaWYgKGhvc3QtPmh3X2Rlc2lnbmVyICE9IEFNQkFfVkVORE9SX1NUKSB7CiAJCQlwd3IgfD0gTUNJX1BXUl9VUDsKQEAgLTQ2NSwxMiArNDk3LDE2IEBACiAJCX0KIAl9CiAKLQl3cml0ZWwoY2xrLCBob3N0LT5iYXNlICsgTU1DSUNMT0NLKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCisJbW1jaV9zZXRfY2xrcmVnKGhvc3QsIGlvcy0+Y2xvY2spOwogCiAJaWYgKGhvc3QtPnB3ciAhPSBwd3IpIHsKIAkJaG9zdC0+cHdyID0gcHdyOwogCQl3cml0ZWwocHdyLCBob3N0LT5iYXNlICsgTU1DSVBPV0VSKTsKIAl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgbW1jaV9nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCkBAIC01MTcsNyArNTUzLDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgbW1jaV9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiwgc3RydWN0IGFtYmFfaWQgKmlkKQogewotCXN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSAqcGxhdCA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSAqcGxhdCA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IG1tY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKIAlpbnQgcmV0OwpAQCAtNTgzLDcgKzYxOSwzMCBAQAogCW1tYy0+b3BzID0gJm1tY2lfb3BzOwogCW1tYy0+Zl9taW4gPSAoaG9zdC0+bWNsayArIDUxMSkgLyA1MTI7CiAJbW1jLT5mX21heCA9IG1pbihob3N0LT5tY2xrLCBmbWF4KTsKLQltbWMtPm9jcl9hdmFpbCA9IHBsYXQtPm9jcl9tYXNrOworI2lmZGVmIENPTkZJR19SRUdVTEFUT1IKKwkvKiBJZiB3ZSdyZSB1c2luZyB0aGUgcmVndWxhdG9yIGZyYW1ld29yaywgdHJ5IHRvIGZldGNoIGEgcmVndWxhdG9yICovCisJaG9zdC0+dmNjID0gcmVndWxhdG9yX2dldCgmZGV2LT5kZXYsICJ2bW1jIik7CisJaWYgKElTX0VSUihob3N0LT52Y2MpKQorCQlob3N0LT52Y2MgPSBOVUxMOworCWVsc2UgeworCQlpbnQgbWFzayA9IG1tY19yZWd1bGF0b3JfZ2V0X29jcm1hc2soaG9zdC0+dmNjKTsKKworCQlpZiAobWFzayA8IDApCisJCQlkZXZfZXJyKCZkZXYtPmRldiwgImVycm9yIGdldHRpbmcgT0NSIG1hc2sgKCVkKVxuIiwKKwkJCQltYXNrKTsKKwkJZWxzZSB7CisJCQlob3N0LT5tbWMtPm9jcl9hdmFpbCA9ICh1MzIpIG1hc2s7CisJCQlpZiAocGxhdC0+b2NyX21hc2spCisJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LAorCQkJCSAiUHJvdmlkZWQgb2NyX21hc2svc2V0cG93ZXIgd2lsbCBub3QgYmUgdXNlZCAiCisJCQkJICIodXNpbmcgcmVndWxhdG9yIGluc3RlYWQpXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCS8qIEZhbGwgYmFjayB0byBwbGF0Zm9ybSBkYXRhIGlmIG5vIHJlZ3VsYXRvciBpcyBmb3VuZCAqLworCWlmIChob3N0LT52Y2MgPT0gTlVMTCkKKwkJbW1jLT5vY3JfYXZhaWwgPSBwbGF0LT5vY3JfbWFzazsKKwltbWMtPmNhcHMgPSBwbGF0LT5jYXBhYmlsaXRpZXM7CiAKIAkvKgogCSAqIFdlIGNhbiBkbyBTR0lPCkBAIC02MTksNyArNjc4LDYgQEAKIAl3cml0ZWwoMCwgaG9zdC0+YmFzZSArIE1NQ0lNQVNLMSk7CiAJd3JpdGVsKDB4ZmZmLCBob3N0LT5iYXNlICsgTU1DSUNMRUFSKTsKIAotI2lmZGVmIENPTkZJR19HUElPTElCCiAJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+Z3Bpb19jZCkpIHsKIAkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBsYXQtPmdwaW9fY2QsIERSSVZFUl9OQU1FICIgKGNkKSIpOwogCQlpZiAocmV0ID09IDApCkBAIC02MzgsNyArNjk2LDYgQEAKIAkJZWxzZSBpZiAocmV0ICE9IC1FTk9TWVMpCiAJCQlnb3RvIGVycl9ncGlvX3dwOwogCX0KLSNlbmRpZgogCiAJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnFbMF0sIG1tY2lfaXJxLCBJUlFGX1NIQVJFRCwgRFJJVkVSX05BTUUgIiAoY21kKSIsIGhvc3QpOwogCWlmIChyZXQpCkBAIC03MjAsNiArNzc3LDEwIEBACiAJCWNsa19kaXNhYmxlKGhvc3QtPmNsayk7CiAJCWNsa19wdXQoaG9zdC0+Y2xrKTsKIAorCQlpZiAocmVndWxhdG9yX2lzX2VuYWJsZWQoaG9zdC0+dmNjKSkKKwkJCXJlZ3VsYXRvcl9kaXNhYmxlKGhvc3QtPnZjYyk7CisJCXJlZ3VsYXRvcl9wdXQoaG9zdC0+dmNjKTsKKwogCQltbWNfZnJlZV9ob3N0KG1tYyk7CiAKIAkJYW1iYV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKaW5kZXggODM5ZjI2NC4uMWNlYjlhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKQEAgLTE2MSw3ICsxNjEsNyBAQAogCXVuc2lnbmVkIGludAkJbWNsazsKIAl1bnNpZ25lZCBpbnQJCWNjbGs7CiAJdTMyCQkJcHdyOwotCXN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSAqcGxhdDsKKwlzdHJ1Y3QgbW1jaV9wbGF0Zm9ybV9kYXRhICpwbGF0OwogCiAJdTgJCQlod19kZXNpZ25lcjsKIAl1OAkJCWh3X3JldmlzaW9uOjQ7CkBAIC0xNzUsNiArMTc1LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnX3B0cjsKIAl1bnNpZ25lZCBpbnQJCXNnX29mZjsKIAl1bnNpZ25lZCBpbnQJCXNpemU7CisJc3RydWN0IHJlZ3VsYXRvcgkqdmNjOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIG1tY2lfaW5pdF9zZyhzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCmluZGV4IDQ0ODdjYzAuLjBhZWNhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCkBAIC0yMDEzLDcgKzIwMTMsNyBAQAogc3RhdGljIGludCBfX2luaXQgb21hcF9oc21tY19pbml0KHZvaWQpCiB7CiAJLyogUmVnaXN0ZXIgdGhlIE1NQyBkcml2ZXIgKi8KLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwX2hzbW1jX2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmb21hcF9oc21tY19kcml2ZXIsIG9tYXBfaHNtbWNfcHJvYmUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgb21hcF9oc21tY19jbGVhbnVwKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9weGFtY2kuYwppbmRleCBlNTVhYzc5Li5iMDBkNjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvcHhhbWNpLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKQEAgLTk2LDEwICs5NywxOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHhhbWNpX3NldF9wb3dlcihzdHJ1Y3QgcHhhbWNpX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB2ZGQpCiB7CisJaW50IG9uOworCiAjaWZkZWYgQ09ORklHX1JFR1VMQVRPUgogCWlmIChob3N0LT52Y2MpCiAJCW1tY19yZWd1bGF0b3Jfc2V0X29jcihob3N0LT52Y2MsIHZkZCk7CiAjZW5kaWYKKwlpZiAoIWhvc3QtPnZjYyAmJiBob3N0LT5wZGF0YSAmJgorCSAgICBncGlvX2lzX3ZhbGlkKGhvc3QtPnBkYXRhLT5ncGlvX3Bvd2VyKSkgeworCQlvbiA9ICgoMSA8PCB2ZGQpICYgaG9zdC0+cGRhdGEtPm9jcl9tYXNrKTsKKwkJZ3Bpb19zZXRfdmFsdWUoaG9zdC0+cGRhdGEtPmdwaW9fcG93ZXIsCisJCQkgICAgICAgISFvbiBeIGhvc3QtPnBkYXRhLT5ncGlvX3Bvd2VyX2ludmVydCk7CisJfQogCWlmICghaG9zdC0+dmNjICYmIGhvc3QtPnBkYXRhICYmIGhvc3QtPnBkYXRhLT5zZXRwb3dlcikKIAkJaG9zdC0+cGRhdGEtPnNldHBvd2VyKG1tY19kZXYoaG9zdC0+bW1jKSwgdmRkKTsKIH0KQEAgLTQyMSw2ICs0MzAsMTIgQEAKIHsKIAlzdHJ1Y3QgcHhhbWNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwogCisJaWYgKGhvc3QtPnBkYXRhICYmIGdwaW9faXNfdmFsaWQoaG9zdC0+cGRhdGEtPmdwaW9fY2FyZF9ybykpIHsKKwkJaWYgKGhvc3QtPnBkYXRhLT5ncGlvX2NhcmRfcm9faW52ZXJ0KQorCQkJcmV0dXJuICFncGlvX2dldF92YWx1ZShob3N0LT5wZGF0YS0+Z3Bpb19jYXJkX3JvKTsKKwkJZWxzZQorCQkJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKGhvc3QtPnBkYXRhLT5ncGlvX2NhcmRfcm8pOworCX0KIAlpZiAoaG9zdC0+cGRhdGEgJiYgaG9zdC0+cGRhdGEtPmdldF9ybykKIAkJcmV0dXJuICEhaG9zdC0+cGRhdGEtPmdldF9ybyhtbWNfZGV2KG1tYykpOwogCS8qCkBAIC01MzQsNyArNTQ5LDcgQEAKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKIAlzdHJ1Y3QgcHhhbWNpX2hvc3QgKmhvc3QgPSBOVUxMOwogCXN0cnVjdCByZXNvdXJjZSAqciwgKmRtYXJ4LCAqZG1hdHg7Ci0JaW50IHJldCwgaXJxOworCWludCByZXQsIGlycSwgZ3Bpb19jZCA9IC0xLCBncGlvX3JvID0gLTEsIGdwaW9fcG93ZXIgPSAtMTsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CkBAIC02NjEsMTMgKzY3Niw2MyBAQAogCX0KIAlob3N0LT5kbWFfZHJjbXJ0eCA9IGRtYXR4LT5zdGFydDsKIAorCWlmIChob3N0LT5wZGF0YSkgeworCQlncGlvX2NkID0gaG9zdC0+cGRhdGEtPmdwaW9fY2FyZF9kZXRlY3Q7CisJCWdwaW9fcm8gPSBob3N0LT5wZGF0YS0+Z3Bpb19jYXJkX3JvOworCQlncGlvX3Bvd2VyID0gaG9zdC0+cGRhdGEtPmdwaW9fcG93ZXI7CisJfQorCWlmIChncGlvX2lzX3ZhbGlkKGdwaW9fcG93ZXIpKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChncGlvX3Bvd2VyLCAibW1jIGNhcmQgcG93ZXIiKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHJlcXVlc3RpbmcgZ3Bpb19wb3dlciAlZFxuIiwgZ3Bpb19wb3dlcik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3Bpb19wb3dlciwKKwkJCQkgICAgICBob3N0LT5wZGF0YS0+Z3Bpb19wb3dlcl9pbnZlcnQpOworCX0KKwlpZiAoZ3Bpb19pc192YWxpZChncGlvX3JvKSkgeworCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3Bpb19ybywgIm1tYyBjYXJkIHJlYWQgb25seSIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgcmVxdWVzdGluZyBncGlvX3JvICVkXG4iLCBncGlvX3JvKTsKKwkJCWdvdG8gZXJyX2dwaW9fcm87CisJCX0KKwkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpb19ybyk7CisJfQorCWlmIChncGlvX2lzX3ZhbGlkKGdwaW9fY2QpKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChncGlvX2NkLCAibW1jIGNhcmQgZGV0ZWN0Iik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCByZXF1ZXN0aW5nIGdwaW9fY2QgJWRcbiIsIGdwaW9fY2QpOworCQkJZ290byBlcnJfZ3Bpb19jZDsKKwkJfQorCQlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvX2NkKTsKKworCQlyZXQgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShncGlvX2NkKSwgcHhhbWNpX2RldGVjdF9pcnEsCisJCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJICAibW1jIGNhcmQgZGV0ZWN0IiwgbW1jKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgY2FyZCBkZXRlY3QgSVJRXG4iKTsKKwkJCWdvdG8gZXJyX3JlcXVlc3RfaXJxOworCQl9CisJfQorCiAJaWYgKGhvc3QtPnBkYXRhICYmIGhvc3QtPnBkYXRhLT5pbml0KQogCQlob3N0LT5wZGF0YS0+aW5pdCgmcGRldi0+ZGV2LCBweGFtY2lfZGV0ZWN0X2lycSwgbW1jKTsKIAorCWlmIChncGlvX2lzX3ZhbGlkKGdwaW9fcG93ZXIpICYmIGhvc3QtPnBkYXRhLT5zZXRwb3dlcikKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImdwaW9fcG93ZXIgYW5kIHNldHBvd2VyKCkgYm90aCBkZWZpbmVkXG4iKTsKKwlpZiAoZ3Bpb19pc192YWxpZChncGlvX3JvKSAmJiBob3N0LT5wZGF0YS0+Z2V0X3JvKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZ3Bpb19ybyBhbmQgZ2V0X3JvKCkgYm90aCBkZWZpbmVkXG4iKTsKKwogCW1tY19hZGRfaG9zdChtbWMpOwogCiAJcmV0dXJuIDA7CiAKK2Vycl9yZXF1ZXN0X2lycToKKwlncGlvX2ZyZWUoZ3Bpb19jZCk7CitlcnJfZ3Bpb19jZDoKKwlncGlvX2ZyZWUoZ3Bpb19ybyk7CitlcnJfZ3Bpb19ybzoKKwlncGlvX2ZyZWUoZ3Bpb19wb3dlcik7CiAgb3V0OgogCWlmIChob3N0KSB7CiAJCWlmIChob3N0LT5kbWEgPj0gMCkKQEAgLTY4OCwxMiArNzUzLDI2IEBACiBzdGF0aWMgaW50IHB4YW1jaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBncGlvX2NkID0gLTEsIGdwaW9fcm8gPSAtMSwgZ3Bpb19wb3dlciA9IC0xOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAKIAlpZiAobW1jKSB7CiAJCXN0cnVjdCBweGFtY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CiAKKwkJaWYgKGhvc3QtPnBkYXRhKSB7CisJCQlncGlvX2NkID0gaG9zdC0+cGRhdGEtPmdwaW9fY2FyZF9kZXRlY3Q7CisJCQlncGlvX3JvID0gaG9zdC0+cGRhdGEtPmdwaW9fY2FyZF9ybzsKKwkJCWdwaW9fcG93ZXIgPSBob3N0LT5wZGF0YS0+Z3Bpb19wb3dlcjsKKwkJfQorCQlpZiAoZ3Bpb19pc192YWxpZChncGlvX2NkKSkgeworCQkJZnJlZV9pcnEoZ3Bpb190b19pcnEoZ3Bpb19jZCksIG1tYyk7CisJCQlncGlvX2ZyZWUoZ3Bpb19jZCk7CisJCX0KKwkJaWYgKGdwaW9faXNfdmFsaWQoZ3Bpb19ybykpCisJCQlncGlvX2ZyZWUoZ3Bpb19ybyk7CisJCWlmIChncGlvX2lzX3ZhbGlkKGdwaW9fcG93ZXIpKQorCQkJZ3Bpb19mcmVlKGdwaW9fcG93ZXIpOwogCQlpZiAoaG9zdC0+dmNjKQogCQkJcmVndWxhdG9yX3B1dChob3N0LT52Y2MpOwogCkBAIC03MjUsMjAgKzgwNCwyMCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHB4YW1jaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBweGFtY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1tY19ob3N0ICptbWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAobW1jKQotCQlyZXQgPSBtbWNfc3VzcGVuZF9ob3N0KG1tYywgc3RhdGUpOworCQlyZXQgPSBtbWNfc3VzcGVuZF9ob3N0KG1tYywgUE1TR19TVVNQRU5EKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHhhbWNpX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHB4YW1jaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCByZXQgPSAwOwogCiAJaWYgKG1tYykKQEAgLTc0NiwxOSArODI1LDIyIEBACiAKIAlyZXR1cm4gcmV0OwogfQotI2Vsc2UKLSNkZWZpbmUgcHhhbWNpX3N1c3BlbmQJTlVMTAotI2RlZmluZSBweGFtY2lfcmVzdW1lCU5VTEwKKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHB4YW1jaV9wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBweGFtY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHB4YW1jaV9yZXN1bWUsCit9OwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB4YW1jaV9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHB4YW1jaV9wcm9iZSwKIAkucmVtb3ZlCQk9IHB4YW1jaV9yZW1vdmUsCi0JLnN1c3BlbmQJPSBweGFtY2lfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHB4YW1jaV9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gRFJJVkVSX05BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmcHhhbWNpX3BtX29wcywKKyNlbmRpZgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3MzY21jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuYwppbmRleCA4YzA4Y2Q3Li45OWI3NGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3MzY21jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvczNjbWNpLmMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTU4LDggKzYwLDYgQEAKIAkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LCBhcmdzKTsgIFwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIFJFU1NJWkUocmVzc291cmNlKSAoKChyZXNzb3VyY2UpLT5lbmQgLSAocmVzc291cmNlKS0+c3RhcnQpKzEpCi0KIHN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50IHMzY21jaV9kbWFfY2xpZW50ID0gewogCS5uYW1lCQk9ICJzM2MtbWNpIiwKIH07CkBAIC0xNjQsNiArMTY0LDQwIEBACiAKICNlbmRpZiAvKiBDT05GSUdfTU1DX0RFQlVHICovCiAKKy8qKgorICogczNjbWNpX2hvc3RfdXNlZG1hIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGhvc3QgaXMgdXNpbmcgZG1hIG9yIHBpbworICogQGhvc3Q6IFRoZSBob3N0IHN0YXRlCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGhvc3QgaXMgdXNpbmcgRE1BIHRvIHRyYW5zZmVyIGRhdGEsIGVsc2UgZmFsc2UKKyAqIHRvIHVzZSBQSU8gbW9kZS4gV2lsbCByZXR1cm4gc3RhdGljIGRhdGEgZGVwZW5kaW5nIG9uIHRoZSBkcml2ZXIKKyAqIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBzM2NtY2lfaG9zdF91c2VkbWEoc3RydWN0IHMzY21jaV9ob3N0ICpob3N0KQoreworI2lmZGVmIENPTkZJR19NTUNfUzNDX1BJTworCXJldHVybiBmYWxzZTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01NQ19TM0NfRE1BKQorCXJldHVybiB0cnVlOworI2Vsc2UKKwlyZXR1cm4gaG9zdC0+ZG9kbWE7CisjZW5kaWYKK30KKworLyoqCisgKiBzM2NtY2lfaG9zdF9jYW5waW8gLSByZXR1cm4gdHJ1ZSBpZiBob3N0IGhhcyBwaW8gY29kZSBhdmFpbGFibGUKKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZHJpdmVyIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGggdGhlIFBJTyBzdXBwb3J0IGNvZGUKKyAqIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIHMzY21jaV9ob3N0X2NhbnBpbyh2b2lkKQoreworI2lmZGVmIENPTkZJR19NTUNfUzNDX1BJTworCXJldHVybiB0cnVlOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwogc3RhdGljIGlubGluZSB1MzIgZW5hYmxlX2ltYXNrKHN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCwgdTMyIGltYXNrKQogewogCXUzMiBuZXdtYXNrOwpAQCAtMTkwLDcgKzIyNCwzMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfaW1hc2soc3RydWN0IHMzY21jaV9ob3N0ICpob3N0KQogewotCXdyaXRlbCgwLCBob3N0LT5iYXNlICsgaG9zdC0+c2RpaW1zayk7CisJdTMyIG1hc2sgPSByZWFkbChob3N0LT5iYXNlICsgaG9zdC0+c2RpaW1zayk7CisKKwkvKiBwcmVzZXJ2ZSB0aGUgU0RJTyBJUlEgbWFzayBzdGF0ZSAqLworCW1hc2sgJj0gUzNDMjQxMF9TRElJTVNLX1NESU9JUlE7CisJd3JpdGVsKG1hc2ssIGhvc3QtPmJhc2UgKyBob3N0LT5zZGlpbXNrKTsKK30KKworLyoqCisgKiBzM2NtY2lfY2hlY2tfc2Rpb19pcnEgLSB0ZXN0IHdoZXRoZXIgdGhlIFNESU8gSVJRIGlzIGJlaW5nIHNpZ25hbGxlZAorICogQGhvc3Q6IFRoZSBob3N0IHRvIGNoZWNrLgorICoKKyAqIFRlc3QgdG8gc2VlIGlmIHRoZSBTRElPIGludGVycnVwdCBpcyBiZWluZyBzaWduYWxsZWQgaW4gY2FzZSB0aGUKKyAqIGNvbnRyb2xsZXIgaGFzIGZhaWxlZCB0byByZS1kZXRlY3QgYSBjYXJkIGludGVycnVwdC4gUmVhZCBHUEU4IGFuZAorICogc2VlIGlmIGl0IGlzIGxvdyBhbmQgaWYgc28sIHNpZ25hbCBhIFNESU8gaW50ZXJydXB0LgorICoKKyAqIFRoaXMgaXMgY3VycmVudGx5IGNhbGxlZCBpZiBhIHJlcXVlc3QgaXMgZmluaXNoZWQgKHdlIGFzc3VtZSB0aGF0IHRoZQorICogYnVzIGlzIG5vdyBpZGxlKSBhbmQgd2hlbiB0aGUgU0RJTyBJUlEgaXMgZW5hYmxlZCBpbiBjYXNlIHRoZSBJUlEgaXMKKyAqIGFscmVhZHkgYmVpbmcgaW5kaWNhdGVkLgorKi8KK3N0YXRpYyB2b2lkIHMzY21jaV9jaGVja19zZGlvX2lycShzdHJ1Y3QgczNjbWNpX2hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QtPnNkaW9faXJxZW4pIHsKKwkJaWYgKGdwaW9fZ2V0X3ZhbHVlKFMzQzI0MTBfR1BFKDgpKSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNpZ25hbGxpbmcgaXJxXG4iLCBfX2Z1bmNfXyk7CisJCQltbWNfc2lnbmFsX3NkaW9faXJxKGhvc3QtPm1tYyk7CisJCX0KKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdldF9kYXRhX2J1ZmZlcihzdHJ1Y3QgczNjbWNpX2hvc3QgKmhvc3QsCkBAIC0yMzgsNiArMjk4LDY0IEBACiAJcmV0dXJuIDYzIC0gZmlmb3N0YXQ7CiB9CiAKKy8qKgorICogczNjbWNpX2VuYWJsZV9pcnEgLSBlbmFibGUgSVJRLCBhZnRlciBoYXZpbmcgZGlzYWJsZWQgaXQuCisgKiBAaG9zdDogVGhlIGRldmljZSBzdGF0ZS4KKyAqIEBtb3JlOiBUcnVlIGlmIG1vcmUgSVJRcyBhcmUgZXhwZWN0ZWQgZnJvbSB0cmFuc2Zlci4KKyAqCisgKiBFbmFibGUgdGhlIG1haW4gSVJRIGlmIG5lZWRlZCBhZnRlciBpdCBoYXMgYmVlbiBkaXNhYmxlZC4KKyAqCisgKiBUaGUgSVJRIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdGF0ZXM6CisgKgktIGRpc2FibGVkIGR1cmluZyBJRExFCisgKgktIGRpc2FibGVkIHdoaWxzdCBwcm9jZXNzaW5nIGRhdGEKKyAqCS0gZW5hYmxlZCBkdXJpbmcgdHJhbnNmZXIKKyAqCS0gZW5hYmxlZCB3aGlsc3QgYXdhaXRpbmcgU0RJTyBpbnRlcnJ1cHQgZGV0ZWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHMzY21jaV9lbmFibGVfaXJxKHN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCwgYm9vbCBtb3JlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBlbmFibGUgPSBmYWxzZTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWhvc3QtPmlycV9lbmFibGVkID0gbW9yZTsKKwlob3N0LT5pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKworCWVuYWJsZSA9IG1vcmUgfCBob3N0LT5zZGlvX2lycWVuOworCisJaWYgKGhvc3QtPmlycV9zdGF0ZSAhPSBlbmFibGUpIHsKKwkJaG9zdC0+aXJxX3N0YXRlID0gZW5hYmxlOworCisJCWlmIChlbmFibGUpCisJCQllbmFibGVfaXJxKGhvc3QtPmlycSk7CisJCWVsc2UKKwkJCWRpc2FibGVfaXJxKGhvc3QtPmlycSk7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHMzY21jaV9kaXNhYmxlX2lycShzdHJ1Y3QgczNjbWNpX2hvc3QgKmhvc3QsIGJvb2wgdHJhbnNmZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8vcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0cmFuc2ZlciAlZFxuIiwgX19mdW5jX18sIHRyYW5zZmVyKTsKKworCWhvc3QtPmlycV9kaXNhYmxlZCA9IHRyYW5zZmVyOworCisJaWYgKHRyYW5zZmVyICYmIGhvc3QtPmlycV9zdGF0ZSkgeworCQlob3N0LT5pcnFfc3RhdGUgPSBmYWxzZTsKKwkJZGlzYWJsZV9pcnEoaG9zdC0+aXJxKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIGRvX3Bpb19yZWFkKHN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCkKIHsKIAlpbnQgcmVzOwpAQCAtMzc0LDggKzQ5Miw3IEBACiB7CiAJc3RydWN0IHMzY21jaV9ob3N0ICpob3N0ID0gKHN0cnVjdCBzM2NtY2lfaG9zdCAqKSBkYXRhOwogCi0KLQlkaXNhYmxlX2lycShob3N0LT5pcnEpOworCXMzY21jaV9kaXNhYmxlX2lycShob3N0LCB0cnVlKTsKIAogCWlmIChob3N0LT5waW9fYWN0aXZlID09IFhGRVJfV1JJVEUpCiAJCWRvX3Bpb193cml0ZShob3N0KTsKQEAgLTM5NSw5ICs1MTIsMTAgQEAKIAkJCQlob3N0LT5tcnEtPmRhdGEtPmVycm9yID0gLUVJTlZBTDsKIAkJfQogCisJCXMzY21jaV9lbmFibGVfaXJxKGhvc3QsIGZhbHNlKTsKIAkJZmluYWxpemVfcmVxdWVzdChob3N0KTsKIAl9IGVsc2UKLQkJZW5hYmxlX2lycShob3N0LT5pcnEpOworCQlzM2NtY2lfZW5hYmxlX2lycShob3N0LCB0cnVlKTsKIH0KIAogLyoKQEAgLTQzMiwxNyArNTUwLDI3IEBACiAJc3RydWN0IHMzY21jaV9ob3N0ICpob3N0ID0gZGV2X2lkOwogCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kOwogCXUzMiBtY2lfY3N0YSwgbWNpX2RzdGEsIG1jaV9mc3RhLCBtY2lfZGNudCwgbWNpX2ltc2s7Ci0JdTMyIG1jaV9jY2xlYXIsIG1jaV9kY2xlYXI7CisJdTMyIG1jaV9jY2xlYXIgPSAwLCBtY2lfZGNsZWFyOwogCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwogCisJbWNpX2RzdGEgPSByZWFkbChob3N0LT5iYXNlICsgUzNDMjQxMF9TRElEU1RBKTsKKwltY2lfaW1zayA9IHJlYWRsKGhvc3QtPmJhc2UgKyBob3N0LT5zZGlpbXNrKTsKKworCWlmIChtY2lfZHN0YSAmIFMzQzI0MTBfU0RJRFNUQV9TRElPSVJRREVURUNUKSB7CisJCWlmIChtY2lfaW1zayAmIFMzQzI0MTBfU0RJSU1TS19TRElPSVJRKSB7CisJCQltY2lfZGNsZWFyID0gUzNDMjQxMF9TRElEU1RBX1NESU9JUlFERVRFQ1Q7CisJCQl3cml0ZWwobWNpX2RjbGVhciwgaG9zdC0+YmFzZSArIFMzQzI0MTBfU0RJRFNUQSk7CisKKwkJCW1tY19zaWduYWxfc2Rpb19pcnEoaG9zdC0+bW1jKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKwogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jb21wbGV0ZV9sb2NrLCBpZmxhZ3MpOwogCiAJbWNpX2NzdGEgPSByZWFkbChob3N0LT5iYXNlICsgUzNDMjQxMF9TRElDTURTVEFUKTsKLQltY2lfZHN0YSA9IHJlYWRsKGhvc3QtPmJhc2UgKyBTM0MyNDEwX1NESURTVEEpOwogCW1jaV9kY250ID0gcmVhZGwoaG9zdC0+YmFzZSArIFMzQzI0MTBfU0RJRENOVCk7CiAJbWNpX2ZzdGEgPSByZWFkbChob3N0LT5iYXNlICsgUzNDMjQxMF9TRElGU1RBKTsKLQltY2lfaW1zayA9IHJlYWRsKGhvc3QtPmJhc2UgKyBob3N0LT5zZGlpbXNrKTsKLQltY2lfY2NsZWFyID0gMDsKIAltY2lfZGNsZWFyID0gMDsKIAogCWlmICgoaG9zdC0+Y29tcGxldGVfd2hhdCA9PSBDT01QTEVUSU9OX05PTkUpIHx8CkBAIC00NjYsNyArNTk0LDcgQEAKIAkJZ290byBpcnFfb3V0OwogCX0KIAotCWlmICghaG9zdC0+ZG9kbWEpIHsKKwlpZiAoIXMzY21jaV9ob3N0X3VzZWRtYShob3N0KSkgewogCQlpZiAoKGhvc3QtPnBpb19hY3RpdmUgPT0gWEZFUl9XUklURSkgJiYKIAkJICAgIChtY2lfZnN0YSAmIFMzQzI0MTBfU0RJRlNUQV9URkRFVCkpIHsKIApAQCAtNjczLDYgKzgwMSw3IEBACiAJZGJnKGhvc3QsIGRiZ19kbWEsICJETUEgRklOSVNIRUQgU2l6ZTolaSBEU1RBOiUwOHggRENOVDolMDh4XG4iLAogCQlzaXplLCBtY2lfZHN0YSwgbWNpX2RjbnQpOwogCisJaG9zdC0+ZG1hX2NvbXBsZXRlID0gMTsKIAlob3N0LT5jb21wbGV0ZV93aGF0ID0gQ09NUExFVElPTl9GSU5BTElaRTsKIAogb3V0OgpAQCAtNjgzLDkgKzgxMiw5IEBACiBmYWlsX3JlcXVlc3Q6CiAJaG9zdC0+bXJxLT5kYXRhLT5lcnJvciA9IC1FSU5WQUw7CiAJaG9zdC0+Y29tcGxldGVfd2hhdCA9IENPTVBMRVRJT05fRklOQUxJWkU7Ci0Jd3JpdGVsKDAsIGhvc3QtPmJhc2UgKyBob3N0LT5zZGlpbXNrKTsKLQlnb3RvIG91dDsKKwljbGVhcl9pbWFzayhob3N0KTsKIAorCWdvdG8gb3V0OwogfQogCiBzdGF0aWMgdm9pZCBmaW5hbGl6ZV9yZXF1ZXN0KHN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCkKQEAgLTcwMiw4ICs4MzEsOSBAQAogCiAJaWYgKGNtZC0+ZGF0YSAmJiAoY21kLT5lcnJvciA9PSAwKSAmJgogCSAgICAoY21kLT5kYXRhLT5lcnJvciA9PSAwKSkgewotCQlpZiAoaG9zdC0+ZG9kbWEgJiYgKCFob3N0LT5kbWFfY29tcGxldGUpKSB7Ci0JCQlkYmcoaG9zdCwgZGJnX2RtYSwgIkRNQSBNaXNzaW5nIVxuIik7CisJCWlmIChzM2NtY2lfaG9zdF91c2VkbWEoaG9zdCkgJiYgKCFob3N0LT5kbWFfY29tcGxldGUpKSB7CisJCQlkYmcoaG9zdCwgZGJnX2RtYSwgIkRNQSBNaXNzaW5nICglZCkhXG4iLAorCQkJICAgIGhvc3QtPmRtYV9jb21wbGV0ZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC03MjgsNyArODU4LDcgQEAKIAl3cml0ZWwoMCwgaG9zdC0+YmFzZSArIFMzQzI0MTBfU0RJQ01EQVJHKTsKIAl3cml0ZWwoUzNDMjQxMF9TRElEQ09OX1NUT1AsIGhvc3QtPmJhc2UgKyBTM0MyNDEwX1NESURDT04pOwogCXdyaXRlbCgwLCBob3N0LT5iYXNlICsgUzNDMjQxMF9TRElDTURDT04pOwotCXdyaXRlbCgwLCBob3N0LT5iYXNlICsgaG9zdC0+c2RpaW1zayk7CisJY2xlYXJfaW1hc2soaG9zdCk7CiAKIAlpZiAoY21kLT5kYXRhICYmIGNtZC0+ZXJyb3IpCiAJCWNtZC0+ZGF0YS0+ZXJyb3IgPSBjbWQtPmVycm9yOwpAQCAtNzU0LDcgKzg4NCw3IEBACiAJLyogSWYgd2UgaGFkIGFuIGVycm9yIHdoaWxlIHRyYW5zZmVyaW5nIGRhdGEgd2UgZmx1c2ggdGhlCiAJICogRE1BIGNoYW5uZWwgYW5kIHRoZSBmaWZvIHRvIGNsZWFyIG91dCBhbnkgZ2FyYmFnZS4gKi8KIAlpZiAobXJxLT5kYXRhLT5lcnJvciAhPSAwKSB7Ci0JCWlmIChob3N0LT5kb2RtYSkKKwkJaWYgKHMzY21jaV9ob3N0X3VzZWRtYShob3N0KSkKIAkJCXMzYzI0MTBfZG1hX2N0cmwoaG9zdC0+ZG1hLCBTM0MyNDEwX0RNQU9QX0ZMVVNIKTsKIAogCQlpZiAoaG9zdC0+aXMyNDQwKSB7CkBAIC03NzYsNiArOTA2LDggQEAKIHJlcXVlc3RfZG9uZToKIAlob3N0LT5jb21wbGV0ZV93aGF0ID0gQ09NUExFVElPTl9OT05FOwogCWhvc3QtPm1ycSA9IE5VTEw7CisKKwlzM2NtY2lfY2hlY2tfc2Rpb19pcnEoaG9zdCk7CiAJbW1jX3JlcXVlc3RfZG9uZShob3N0LT5tbWMsIG1ycSk7CiB9CiAKQEAgLTg3Miw3ICsxMDA0LDcgQEAKIAogCWRjb24gID0gZGF0YS0+YmxvY2tzICYgUzNDMjQxMF9TRElEQ09OX0JMS05VTV9NQVNLOwogCi0JaWYgKGhvc3QtPmRvZG1hKQorCWlmIChzM2NtY2lfaG9zdF91c2VkbWEoaG9zdCkpCiAJCWRjb24gfD0gUzNDMjQxMF9TRElEQ09OX0RNQUVOOwogCiAJaWYgKGhvc3QtPmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQpCkBAIC05NTAsNyArMTA4Miw3IEBACiBzdGF0aWMgaW50IHMzY21jaV9wcmVwYXJlX2RtYShzdHJ1Y3QgczNjbWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKIHsKIAlpbnQgZG1hX2xlbiwgaTsKLQlpbnQgcncgPSAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURSkgPyAxIDogMDsKKwlpbnQgcncgPSBkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFOwogCiAJQlVHX09OKChkYXRhLT5mbGFncyAmIEJPVEhfRElSKSA9PSBCT1RIX0RJUik7CiAKQEAgLTk1OCw3ICsxMDkwLDcgQEAKIAlzM2MyNDEwX2RtYV9jdHJsKGhvc3QtPmRtYSwgUzNDMjQxMF9ETUFPUF9GTFVTSCk7CiAKIAlkbWFfbGVuID0gZG1hX21hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sCi0JCQkgICAgIChydykgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwkJCSAgICAgcncgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKIAogCWlmIChkbWFfbGVuID09IDApCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTY5LDExICsxMTAxLDExIEBACiAJZm9yIChpID0gMDsgaSA8IGRtYV9sZW47IGkrKykgewogCQlpbnQgcmVzOwogCi0JCWRiZyhob3N0LCBkYmdfZG1hLCAiZW5xdWV1ZSAlaToldUAldVxuIiwgaSwKLQkJCXNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSksCi0JCQlzZ19kbWFfbGVuKCZkYXRhLT5zZ1tpXSkpOworCQlkYmcoaG9zdCwgZGJnX2RtYSwgImVucXVldWUgJWk6ICUwOHhAJXVcbiIsIGksCisJCSAgICBzZ19kbWFfYWRkcmVzcygmZGF0YS0+c2dbaV0pLAorCQkgICAgc2dfZG1hX2xlbigmZGF0YS0+c2dbaV0pKTsKIAotCQlyZXMgPSBzM2MyNDEwX2RtYV9lbnF1ZXVlKGhvc3QtPmRtYSwgKHZvaWQgKikgaG9zdCwKKwkJcmVzID0gczNjMjQxMF9kbWFfZW5xdWV1ZShob3N0LT5kbWEsIGhvc3QsCiAJCQkJCSAgc2dfZG1hX2FkZHJlc3MoJmRhdGEtPnNnW2ldKSwKIAkJCQkJICBzZ19kbWFfbGVuKCZkYXRhLT5zZ1tpXSkpOwogCkBAIC0xMDE4LDcgKzExNTAsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJaWYgKGhvc3QtPmRvZG1hKQorCQlpZiAoczNjbWNpX2hvc3RfdXNlZG1hKGhvc3QpKQogCQkJcmVzID0gczNjbWNpX3ByZXBhcmVfZG1hKGhvc3QsIGNtZC0+ZGF0YSk7CiAJCWVsc2UKIAkJCXJlcyA9IHMzY21jaV9wcmVwYXJlX3Bpbyhob3N0LCBjbWQtPmRhdGEpOwpAQCAtMTAzNyw3ICsxMTY5LDcgQEAKIAlzM2NtY2lfc2VuZF9jb21tYW5kKGhvc3QsIGNtZCk7CiAKIAkvKiBFbmFibGUgSW50ZXJydXB0ICovCi0JZW5hYmxlX2lycShob3N0LT5pcnEpOworCXMzY21jaV9lbmFibGVfaXJxKGhvc3QsIHRydWUpOwogfQogCiBzdGF0aWMgaW50IHMzY21jaV9jYXJkX3ByZXNlbnQoc3RydWN0IG1tY19ob3N0ICptbWMpCkBAIC0xMDQ5LDcgKzExODEsNyBAQAogCWlmIChwZGF0YS0+Z3Bpb19kZXRlY3QgPT0gMCkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKLQlyZXQgPSBzM2MyNDEwX2dwaW9fZ2V0cGluKHBkYXRhLT5ncGlvX2RldGVjdCkgPyAwIDogMTsKKwlyZXQgPSBncGlvX2dldF92YWx1ZShwZGF0YS0+Z3Bpb19kZXRlY3QpID8gMCA6IDE7CiAJcmV0dXJuIHJldCBeIHBkYXRhLT5kZXRlY3RfaW52ZXJ0OwogfQogCkBAIC0xMTA0LDEyICsxMjM2LDEyIEBACiAJc3dpdGNoIChpb3MtPnBvd2VyX21vZGUpIHsKIAljYXNlIE1NQ19QT1dFUl9PTjoKIAljYXNlIE1NQ19QT1dFUl9VUDoKLQkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRTUsIFMzQzI0MTBfR1BFNV9TRENMSyk7Ci0JCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEU2LCBTM0MyNDEwX0dQRTZfU0RDTUQpOwotCQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFNywgUzNDMjQxMF9HUEU3X1NEREFUMCk7Ci0JCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEU4LCBTM0MyNDEwX0dQRThfU0REQVQxKTsKLQkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRTksIFMzQzI0MTBfR1BFOV9TRERBVDIpOwotCQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMTAsIFMzQzI0MTBfR1BFMTBfU0REQVQzKTsKKwkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRSg1KSwgUzNDMjQxMF9HUEU1X1NEQ0xLKTsKKwkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRSg2KSwgUzNDMjQxMF9HUEU2X1NEQ01EKTsKKwkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRSg3KSwgUzNDMjQxMF9HUEU3X1NEREFUMCk7CisJCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEUoOCksIFMzQzI0MTBfR1BFOF9TRERBVDEpOworCQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFKDkpLCBTM0MyNDEwX0dQRTlfU0REQVQyKTsKKwkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRSgxMCksIFMzQzI0MTBfR1BFMTBfU0REQVQzKTsKIAogCQlpZiAoaG9zdC0+cGRhdGEtPnNldF9wb3dlcikKIAkJCWhvc3QtPnBkYXRhLT5zZXRfcG93ZXIoaW9zLT5wb3dlcl9tb2RlLCBpb3MtPnZkZCk7CkBAIC0xMTIxLDggKzEyNTMsNyBAQAogCiAJY2FzZSBNTUNfUE9XRVJfT0ZGOgogCWRlZmF1bHQ6Ci0JCXMzYzI0MTBfZ3Bpb19zZXRwaW4oUzNDMjQxMF9HUEU1LCAwKTsKLQkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRTUsIFMzQzI0MTBfR1BJT19PVVRQVVQpOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoUzNDMjQxMF9HUEUoNSksIDApOwogCiAJCWlmIChob3N0LT5pczI0NDApCiAJCQltY2lfY29uIHw9IFMzQzI0NDBfU0RJQ09OX1NEUkVTRVQ7CkBAIC0xMTY4LDcgKzEyOTksNyBAQAogCXN0cnVjdCBzM2MyNHh4X21jaV9wZGF0YSAqcGRhdGEgPSBob3N0LT5wZGF0YTsKIAlpbnQgcmV0OwogCi0JaWYgKHBkYXRhLT5ncGlvX3dwcm90ZWN0ID09IDApCisJaWYgKHBkYXRhLT5ub193cHJvdGVjdCkKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSBzM2MyNDEwX2dwaW9fZ2V0cGluKHBkYXRhLT5ncGlvX3dwcm90ZWN0KTsKQEAgLTExNzksMTEgKzEzMTAsNTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBzM2NtY2lfZW5hYmxlX3NkaW9faXJxKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgY29uOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJY29uID0gcmVhZGwoaG9zdC0+YmFzZSArIFMzQzI0MTBfU0RJQ09OKTsKKwlob3N0LT5zZGlvX2lycWVuID0gZW5hYmxlOworCisJaWYgKGVuYWJsZSA9PSBob3N0LT5zZGlvX2lycWVuKQorCQlnb3RvIHNhbWVfc3RhdGU7CisKKwlpZiAoZW5hYmxlKSB7CisJCWNvbiB8PSBTM0MyNDEwX1NESUNPTl9TRElPSVJROworCQllbmFibGVfaW1hc2soaG9zdCwgUzNDMjQxMF9TRElJTVNLX1NESU9JUlEpOworCisJCWlmICghaG9zdC0+aXJxX3N0YXRlICYmICFob3N0LT5pcnFfZGlzYWJsZWQpIHsKKwkJCWhvc3QtPmlycV9zdGF0ZSA9IHRydWU7CisJCQllbmFibGVfaXJxKGhvc3QtPmlycSk7CisJCX0KKwl9IGVsc2UgeworCQlkaXNhYmxlX2ltYXNrKGhvc3QsIFMzQzI0MTBfU0RJSU1TS19TRElPSVJRKTsKKwkJY29uICY9IH5TM0MyNDEwX1NESUNPTl9TRElPSVJROworCisJCWlmICghaG9zdC0+aXJxX2VuYWJsZWQgJiYgaG9zdC0+aXJxX3N0YXRlKSB7CisJCQlkaXNhYmxlX2lycV9ub3N5bmMoaG9zdC0+aXJxKTsKKwkJCWhvc3QtPmlycV9zdGF0ZSA9IGZhbHNlOworCQl9CisJfQorCisJd3JpdGVsKGNvbiwgaG9zdC0+YmFzZSArIFMzQzI0MTBfU0RJQ09OKTsKKworIHNhbWVfc3RhdGU6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJczNjbWNpX2NoZWNrX3NkaW9faXJxKGhvc3QpOworfQorCiBzdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBzM2NtY2lfb3BzID0gewogCS5yZXF1ZXN0CT0gczNjbWNpX3JlcXVlc3QsCiAJLnNldF9pb3MJPSBzM2NtY2lfc2V0X2lvcywKIAkuZ2V0X3JvCQk9IHMzY21jaV9nZXRfcm8sCiAJLmdldF9jZAkJPSBzM2NtY2lfY2FyZF9wcmVzZW50LAorCS5lbmFibGVfc2Rpb19pcnEgPSBzM2NtY2lfZW5hYmxlX3NkaW9faXJxLAogfTsKIAogc3RhdGljIHN0cnVjdCBzM2MyNHh4X21jaV9wZGF0YSBzM2NtY2lfZGVmX3BkYXRhID0gewpAQCAtMTI0NiwxMSArMTQxOCwxNDAgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzM2NtY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGlzMjQ0MCkKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCitzdGF0aWMgaW50IHMzY21jaV9zdGF0ZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCA9IHNlcS0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYoc2VxLCAiUmVnaXN0ZXIgYmFzZSA9IDB4JTA4eFxuIiwgKHUzMilob3N0LT5iYXNlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkNsb2NrIHJhdGUgPSAlbGRcbiIsIGhvc3QtPmNsa19yYXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlByZXNjYWxlID0gJWRcbiIsIGhvc3QtPnByZXNjYWxlcik7CisJc2VxX3ByaW50ZihzZXEsICJpczI0NDAgPSAlZFxuIiwgaG9zdC0+aXMyNDQwKTsKKwlzZXFfcHJpbnRmKHNlcSwgIklSUSA9ICVkXG4iLCBob3N0LT5pcnEpOworCXNlcV9wcmludGYoc2VxLCAiSVJRIGVuYWJsZWQgPSAlZFxuIiwgaG9zdC0+aXJxX2VuYWJsZWQpOworCXNlcV9wcmludGYoc2VxLCAiSVJRIGRpc2FibGVkID0gJWRcbiIsIGhvc3QtPmlycV9kaXNhYmxlZCk7CisJc2VxX3ByaW50ZihzZXEsICJJUlEgc3RhdGUgPSAlZFxuIiwgaG9zdC0+aXJxX3N0YXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkNEIElSUSA9ICVkXG4iLCBob3N0LT5pcnFfY2QpOworCXNlcV9wcmludGYoc2VxLCAiRG8gRE1BID0gJWRcbiIsIHMzY21jaV9ob3N0X3VzZWRtYShob3N0KSk7CisJc2VxX3ByaW50ZihzZXEsICJTRElJTVNLIGF0ICVkXG4iLCBob3N0LT5zZGlpbXNrKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNESURBVEEgYXQgJWRcbiIsIGhvc3QtPnNkaWRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjbWNpX3N0YXRlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHMzY21jaV9zdGF0ZV9zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgczNjbWNpX2ZvcHNfc3RhdGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHMzY21jaV9zdGF0ZV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCisjZGVmaW5lIERCR19SRUcoX3IpIHsgLmFkZHIgPSBTM0MyNDEwX1NESSMjX3IsIC5uYW1lID0gI19yIH0KKworc3RydWN0IHMzY21jaV9yZWcgeworCXVuc2lnbmVkIHNob3J0CWFkZHI7CisJdW5zaWduZWQgY2hhcgkqbmFtZTsKK30gZGVidWdfcmVnc1tdID0geworCURCR19SRUcoQ09OKSwKKwlEQkdfUkVHKFBSRSksCisJREJHX1JFRyhDTURBUkcpLAorCURCR19SRUcoQ01EQ09OKSwKKwlEQkdfUkVHKENNRFNUQVQpLAorCURCR19SRUcoUlNQMCksCisJREJHX1JFRyhSU1AxKSwKKwlEQkdfUkVHKFJTUDIpLAorCURCR19SRUcoUlNQMyksCisJREJHX1JFRyhUSU1FUiksCisJREJHX1JFRyhCU0laRSksCisJREJHX1JFRyhEQ09OKSwKKwlEQkdfUkVHKERDTlQpLAorCURCR19SRUcoRFNUQSksCisJREJHX1JFRyhGU1RBKSwKKwl7fQorfTsKKworc3RhdGljIGludCBzM2NtY2lfcmVnc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgczNjbWNpX3JlZyAqcnB0ciA9IGRlYnVnX3JlZ3M7CisKKwlmb3IgKDsgcnB0ci0+bmFtZTsgcnB0cisrKQorCQlzZXFfcHJpbnRmKHNlcSwgIlNESSVzXHQ9MHglMDh4XG4iLCBycHRyLT5uYW1lLAorCQkJICAgcmVhZGwoaG9zdC0+YmFzZSArIHJwdHItPmFkZHIpKTsKKworCXNlcV9wcmludGYoc2VxLCAiU0RJSU1TS1x0PTB4JTA4eFxuIiwgcmVhZGwoaG9zdC0+YmFzZSArIGhvc3QtPnNkaWltc2spKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzY21jaV9yZWdzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHMzY21jaV9yZWdzX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzM2NtY2lfZm9wc19yZWdzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBzM2NtY2lfcmVnc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBzM2NtY2lfZGVidWdmc19hdHRhY2goc3RydWN0IHMzY21jaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZob3N0LT5wZGV2LT5kZXY7CisKKwlob3N0LT5kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKGRldl9uYW1lKGRldiksIE5VTEwpOworCWlmIChJU19FUlIoaG9zdC0+ZGVidWdfcm9vdCkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgcm9vdFxuIik7CisJCXJldHVybjsKKwl9CisKKwlob3N0LT5kZWJ1Z19zdGF0ZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN0YXRlIiwgMDQ0NCwKKwkJCQkJCWhvc3QtPmRlYnVnX3Jvb3QsIGhvc3QsCisJCQkJCQkmczNjbWNpX2ZvcHNfc3RhdGUpOworCisJaWYgKElTX0VSUihob3N0LT5kZWJ1Z19zdGF0ZSkpCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1ZyBzdGF0ZSBmaWxlXG4iKTsKKworCWhvc3QtPmRlYnVnX3JlZ3MgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWdzIiwgMDQ0NCwKKwkJCQkJICAgICAgIGhvc3QtPmRlYnVnX3Jvb3QsIGhvc3QsCisJCQkJCSAgICAgICAmczNjbWNpX2ZvcHNfcmVncyk7CisKKwlpZiAoSVNfRVJSKGhvc3QtPmRlYnVnX3JlZ3MpKQorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgZGVidWcgcmVncyBmaWxlXG4iKTsKK30KKworc3RhdGljIHZvaWQgczNjbWNpX2RlYnVnZnNfcmVtb3ZlKHN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShob3N0LT5kZWJ1Z19yZWdzKTsKKwlkZWJ1Z2ZzX3JlbW92ZShob3N0LT5kZWJ1Z19zdGF0ZSk7CisJZGVidWdmc19yZW1vdmUoaG9zdC0+ZGVidWdfcm9vdCk7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgczNjbWNpX2RlYnVnZnNfYXR0YWNoKHN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgczNjbWNpX2RlYnVnZnNfcmVtb3ZlKHN0cnVjdCBzM2NtY2lfaG9zdCAqaG9zdCkgeyB9CisKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgczNjbWNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHMzY21jaV9ob3N0ICpob3N0OwogCXN0cnVjdCBtbWNfaG9zdAkqbW1jOwogCWludCByZXQ7CisJaW50IGlzMjQ0MDsKKwlpbnQgaTsKKworCWlzMjQ0MCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOwogCiAJbW1jID0gbW1jX2FsbG9jX2hvc3Qoc2l6ZW9mKHN0cnVjdCBzM2NtY2lfaG9zdCksICZwZGV2LT5kZXYpOwogCWlmICghbW1jKSB7CkBAIC0xMjU4LDYgKzE1NTksMTggQEAKIAkJZ290byBwcm9iZV9vdXQ7CiAJfQogCisJZm9yIChpID0gUzNDMjQxMF9HUEUoNSk7IGkgPD0gUzNDMjQxMF9HUEUoMTApOyBpKyspIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGksIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBncGlvICVkXG4iLCBpKTsKKworCQkJZm9yIChpLS07IGkgPj0gUzNDMjQxMF9HUEUoNSk7IGktLSkKKwkJCQlncGlvX2ZyZWUoaSk7CisKKwkJCWdvdG8gcHJvYmVfZnJlZV9ob3N0OworCQl9CisJfQorCiAJaG9zdCA9IG1tY19wcml2KG1tYyk7CiAJaG9zdC0+bW1jIAk9IG1tYzsKIAlob3N0LT5wZGV2CT0gcGRldjsKQEAgLTEyODIsMTEgKzE1OTUsMTIgQEAKIAkJaG9zdC0+Y2xrX2Rpdgk9IDI7CiAJfQogCi0JaG9zdC0+ZG9kbWEJCT0gMDsKIAlob3N0LT5jb21wbGV0ZV93aGF0IAk9IENPTVBMRVRJT05fTk9ORTsKIAlob3N0LT5waW9fYWN0aXZlIAk9IFhGRVJfTk9ORTsKIAotCWhvc3QtPmRtYQkJPSBTM0NNQ0lfRE1BOworI2lmZGVmIENPTkZJR19NTUNfUzNDX1BJT0RNQQorCWhvc3QtPmRvZG1hCQk9IGhvc3QtPnBkYXRhLT5kbWE7CisjZW5kaWYKIAogCWhvc3QtPm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFob3N0LT5tZW0pIHsKQEAgLTEyOTQsMTkgKzE2MDgsMTkgQEAKIAkJCSJmYWlsZWQgdG8gZ2V0IGlvIG1lbW9yeSByZWdpb24gcmVzb3VjZS5cbiIpOwogCiAJCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gcHJvYmVfZnJlZV9ob3N0OworCQlnb3RvIHByb2JlX2ZyZWVfZ3BpbzsKIAl9CiAKIAlob3N0LT5tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24oaG9zdC0+bWVtLT5zdGFydCwKLQkJCQkgICAgICAgUkVTU0laRShob3N0LT5tZW0pLCBwZGV2LT5uYW1lKTsKKwkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZShob3N0LT5tZW0pLCBwZGV2LT5uYW1lKTsKIAogCWlmICghaG9zdC0+bWVtKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlvIG1lbW9yeSByZWdpb24uXG4iKTsKIAkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBwcm9iZV9mcmVlX2hvc3Q7CisJCWdvdG8gcHJvYmVfZnJlZV9ncGlvOwogCX0KIAotCWhvc3QtPmJhc2UgPSBpb3JlbWFwKGhvc3QtPm1lbS0+c3RhcnQsIFJFU1NJWkUoaG9zdC0+bWVtKSk7CisJaG9zdC0+YmFzZSA9IGlvcmVtYXAoaG9zdC0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShob3N0LT5tZW0pKTsKIAlpZiAoIWhvc3QtPmJhc2UpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGlvcmVtYXAoKSBpbyBtZW1vcnkgcmVnaW9uLlxuIik7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0xMzMxLDMxICsxNjQ1LDYwIEBACiAJICogZW5zdXJlIHdlIGRvbid0IGxvY2sgdGhlIHN5c3RlbSB3aXRoIHVuLXNlcnZpY2VhYmxlIHJlcXVlc3RzLiAqLwogCiAJZGlzYWJsZV9pcnEoaG9zdC0+aXJxKTsKKwlob3N0LT5pcnFfc3RhdGUgPSBmYWxzZTsKIAotCWhvc3QtPmlycV9jZCA9IHMzYzI0MTBfZ3Bpb19nZXRpcnEoaG9zdC0+cGRhdGEtPmdwaW9fZGV0ZWN0KTsKLQotCWlmIChob3N0LT5pcnFfY2QgPj0gMCkgewotCQlpZiAocmVxdWVzdF9pcnEoaG9zdC0+aXJxX2NkLCBzM2NtY2lfaXJxX2NkLAotCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCQlEUklWRVJfTkFNRSwgaG9zdCkpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBjYXJkIGRldGVjdCBpcnEuXG4iKTsKLQkJCXJldCA9IC1FTk9FTlQ7CisJaWYgKCFob3N0LT5wZGF0YS0+bm9fZGV0ZWN0KSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChob3N0LT5wZGF0YS0+Z3Bpb19kZXRlY3QsICJzM2NtY2kgZGV0ZWN0Iik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgZGV0ZWN0IGdwaW9cbiIpOwogCQkJZ290byBwcm9iZV9mcmVlX2lycTsKIAkJfQotCX0gZWxzZSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJob3N0IGRldGVjdCBoYXMgbm8gaXJxIGF2YWlsYWJsZVxuIik7Ci0JCXMzYzI0MTBfZ3Bpb19jZmdwaW4oaG9zdC0+cGRhdGEtPmdwaW9fZGV0ZWN0LAotCQkJCSAgICBTM0MyNDEwX0dQSU9fSU5QVVQpOworCisJCWhvc3QtPmlycV9jZCA9IHMzYzI0MTBfZ3Bpb19nZXRpcnEoaG9zdC0+cGRhdGEtPmdwaW9fZGV0ZWN0KTsKKworCQlpZiAoaG9zdC0+aXJxX2NkID49IDApIHsKKwkJCWlmIChyZXF1ZXN0X2lycShob3N0LT5pcnFfY2QsIHMzY21jaV9pcnFfY2QsCisJCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfAorCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkJRFJJVkVSX05BTUUsIGhvc3QpKSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCQkiY2FuJ3QgZ2V0IGNhcmQgZGV0ZWN0IGlycS5cbiIpOworCQkJCXJldCA9IC1FTk9FTlQ7CisJCQkJZ290byBwcm9iZV9mcmVlX2dwaW9fY2Q7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiaG9zdCBkZXRlY3QgaGFzIG5vIGlycSBhdmFpbGFibGVcbiIpOworCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoaG9zdC0+cGRhdGEtPmdwaW9fZGV0ZWN0KTsKKwkJfQorCX0gZWxzZQorCQlob3N0LT5pcnFfY2QgPSAtMTsKKworCWlmICghaG9zdC0+cGRhdGEtPm5vX3dwcm90ZWN0KSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChob3N0LT5wZGF0YS0+Z3Bpb193cHJvdGVjdCwgInMzY21jaSB3cCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHdyaXRlcHJvdGVjdFxuIik7CisJCQlnb3RvIHByb2JlX2ZyZWVfaXJxX2NkOworCQl9CisKKwkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoaG9zdC0+cGRhdGEtPmdwaW9fd3Byb3RlY3QpOwogCX0KIAotCWlmIChob3N0LT5wZGF0YS0+Z3Bpb193cHJvdGVjdCkKLQkJczNjMjQxMF9ncGlvX2NmZ3Bpbihob3N0LT5wZGF0YS0+Z3Bpb193cHJvdGVjdCwKLQkJCQkgICAgUzNDMjQxMF9HUElPX0lOUFVUKTsKKwkvKiBkZXBlbmRpbmcgb24gdGhlIGRtYSBzdGF0ZSwgZ2V0IGEgZG1hIGNoYW5uZWwgdG8gdXNlLiAqLwogCi0JaWYgKHMzYzI0MTBfZG1hX3JlcXVlc3QoUzNDTUNJX0RNQSwgJnMzY21jaV9kbWFfY2xpZW50LCBOVUxMKSA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBETUEgY2hhbm5lbC5cbiIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gcHJvYmVfZnJlZV9pcnFfY2Q7CisJaWYgKHMzY21jaV9ob3N0X3VzZWRtYShob3N0KSkgeworCQlob3N0LT5kbWEgPSBzM2MyNDEwX2RtYV9yZXF1ZXN0KERNQUNIX1NESSwgJnMzY21jaV9kbWFfY2xpZW50LAorCQkJCQkJaG9zdCk7CisJCWlmIChob3N0LT5kbWEgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IERNQSBjaGFubmVsLlxuIik7CisJCQlpZiAoIXMzY21jaV9ob3N0X2NhbnBpbygpKSB7CisJCQkJcmV0ID0gLUVCVVNZOworCQkJCWdvdG8gcHJvYmVfZnJlZV9ncGlvX3dwOworCQkJfSBlbHNlIHsKKwkJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZmFsbGluZyBiYWNrIHRvIFBJTy5cbiIpOworCQkJCWhvc3QtPmRvZG1hID0gMDsKKwkJCX0KKwkJfQogCX0KIAogCWhvc3QtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInNkaSIpOwpAQCAtMTM2Myw3ICsxNzA2LDcgQEAKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGZpbmQgY2xvY2sgc291cmNlLlxuIik7CiAJCXJldCA9IFBUUl9FUlIoaG9zdC0+Y2xrKTsKIAkJaG9zdC0+Y2xrID0gTlVMTDsKLQkJZ290byBwcm9iZV9mcmVlX2hvc3Q7CisJCWdvdG8gcHJvYmVfZnJlZV9kbWE7CiAJfQogCiAJcmV0ID0gY2xrX2VuYWJsZShob3N0LT5jbGspOwpAQCAtMTM3Niw3ICsxNzE5LDExIEBACiAKIAltbWMtPm9wcyAJPSAmczNjbWNpX29wczsKIAltbWMtPm9jcl9hdmFpbAk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OworI2lmZGVmIENPTkZJR19NTUNfUzNDX0hXX1NESU9fSVJRCisJbW1jLT5jYXBzCT0gTU1DX0NBUF80X0JJVF9EQVRBIHwgTU1DX0NBUF9TRElPX0lSUTsKKyNlbHNlCiAJbW1jLT5jYXBzCT0gTU1DX0NBUF80X0JJVF9EQVRBOworI2VuZGlmCiAJbW1jLT5mX21pbiAJPSBob3N0LT5jbGtfcmF0ZSAvIChob3N0LT5jbGtfZGl2ICogMjU2KTsKIAltbWMtPmZfbWF4IAk9IGhvc3QtPmNsa19yYXRlIC8gaG9zdC0+Y2xrX2RpdjsKIApAQCAtMTQwOCw4ICsxNzU1LDEyIEBACiAJCWdvdG8gZnJlZV9jcHVmcmVxOwogCX0KIAorCXMzY21jaV9kZWJ1Z2ZzX2F0dGFjaChob3N0KTsKKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1tYyk7Ci0JZGV2X2luZm8oJnBkZXYtPmRldiwgImluaXRpYWxpc2F0aW9uIGRvbmUuXG4iKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgLSB1c2luZyAlcywgJXMgU0RJTyBJUlFcbiIsIG1tY19ob3N0bmFtZShtbWMpLAorCQkgczNjbWNpX2hvc3RfdXNlZG1hKGhvc3QpID8gImRtYSIgOiAicGlvIiwKKwkJIG1tYy0+Y2FwcyAmIE1NQ19DQVBfU0RJT19JUlEgPyAiaHciIDogInN3Iik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTQyMiw2ICsxNzczLDE4IEBACiAgY2xrX2ZyZWU6CiAJY2xrX3B1dChob3N0LT5jbGspOwogCisgcHJvYmVfZnJlZV9kbWE6CisJaWYgKHMzY21jaV9ob3N0X3VzZWRtYShob3N0KSkKKwkJczNjMjQxMF9kbWFfZnJlZShob3N0LT5kbWEsICZzM2NtY2lfZG1hX2NsaWVudCk7CisKKyBwcm9iZV9mcmVlX2dwaW9fd3A6CisJaWYgKCFob3N0LT5wZGF0YS0+bm9fd3Byb3RlY3QpCisJCWdwaW9fZnJlZShob3N0LT5wZGF0YS0+Z3Bpb193cHJvdGVjdCk7CisKKyBwcm9iZV9mcmVlX2dwaW9fY2Q6CisJaWYgKCFob3N0LT5wZGF0YS0+bm9fZGV0ZWN0KQorCQlncGlvX2ZyZWUoaG9zdC0+cGRhdGEtPmdwaW9fZGV0ZWN0KTsKKwogIHByb2JlX2ZyZWVfaXJxX2NkOgogCWlmIChob3N0LT5pcnFfY2QgPj0gMCkKIAkJZnJlZV9pcnEoaG9zdC0+aXJxX2NkLCBob3N0KTsKQEAgLTE0MzMsMTAgKzE3OTYsMTUgQEAKIAlpb3VubWFwKGhvc3QtPmJhc2UpOwogCiAgcHJvYmVfZnJlZV9tZW1fcmVnaW9uOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihob3N0LT5tZW0tPnN0YXJ0LCBSRVNTSVpFKGhvc3QtPm1lbSkpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihob3N0LT5tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGhvc3QtPm1lbSkpOworCisgcHJvYmVfZnJlZV9ncGlvOgorCWZvciAoaSA9IFMzQzI0MTBfR1BFKDUpOyBpIDw9IFMzQzI0MTBfR1BFKDEwKTsgaSsrKQorCQlncGlvX2ZyZWUoaSk7CiAKICBwcm9iZV9mcmVlX2hvc3Q6CiAJbW1jX2ZyZWVfaG9zdChtbWMpOworCiAgcHJvYmVfb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xNDQ5LDYgKzE4MTcsNyBAQAogCWlmIChob3N0LT5pcnFfY2QgPj0gMCkKIAkJZnJlZV9pcnEoaG9zdC0+aXJxX2NkLCBob3N0KTsKIAorCXMzY21jaV9kZWJ1Z2ZzX3JlbW92ZShob3N0KTsKIAlzM2NtY2lfY3B1ZnJlcV9kZXJlZ2lzdGVyKGhvc3QpOwogCW1tY19yZW1vdmVfaG9zdChtbWMpOwogCWNsa19kaXNhYmxlKGhvc3QtPmNsayk7CkBAIC0xNDU4LDEwNCArMTgyNywxMDIgQEAKIHsKIAlzdHJ1Y3QgbW1jX2hvc3QJCSptbWMgID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHMzY21jaV9ob3N0CSpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEgKnBkID0gaG9zdC0+cGRhdGE7CisJaW50IGk7CiAKIAlzM2NtY2lfc2h1dGRvd24ocGRldik7CiAKIAljbGtfcHV0KGhvc3QtPmNsayk7CiAKIAl0YXNrbGV0X2Rpc2FibGUoJmhvc3QtPnBpb190YXNrbGV0KTsKLQlzM2MyNDEwX2RtYV9mcmVlKFMzQ01DSV9ETUEsICZzM2NtY2lfZG1hX2NsaWVudCk7CisKKwlpZiAoczNjbWNpX2hvc3RfdXNlZG1hKGhvc3QpKQorCQlzM2MyNDEwX2RtYV9mcmVlKGhvc3QtPmRtYSwgJnMzY21jaV9kbWFfY2xpZW50KTsKIAogCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CiAKKwlpZiAoIXBkLT5ub193cHJvdGVjdCkKKwkJZ3Bpb19mcmVlKHBkLT5ncGlvX3dwcm90ZWN0KTsKKworCWlmICghcGQtPm5vX2RldGVjdCkKKwkJZ3Bpb19mcmVlKHBkLT5ncGlvX2RldGVjdCk7CisKKwlmb3IgKGkgPSBTM0MyNDEwX0dQRSg1KTsgaSA8PSBTM0MyNDEwX0dQRSgxMCk7IGkrKykKKwkJZ3Bpb19mcmVlKGkpOworCisKIAlpb3VubWFwKGhvc3QtPmJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihob3N0LT5tZW0tPnN0YXJ0LCBSRVNTSVpFKGhvc3QtPm1lbSkpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihob3N0LT5tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGhvc3QtPm1lbSkpOwogCiAJbW1jX2ZyZWVfaG9zdChtbWMpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzM2NtY2lfMjQxMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIHMzY21jaV9wcm9iZShkZXYsIDApOwotfQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgczNjbWNpX2RyaXZlcl9pZHNbXSA9IHsKKwl7CisJCS5uYW1lCT0gInMzYzI0MTAtc2RpIiwKKwkJLmRyaXZlcl9kYXRhCT0gMCwKKwl9LCB7CisJCS5uYW1lCT0gInMzYzI0MTItc2RpIiwKKwkJLmRyaXZlcl9kYXRhCT0gMSwKKwl9LCB7CisJCS5uYW1lCT0gInMzYzI0NDAtc2RpIiwKKwkJLmRyaXZlcl9kYXRhCT0gMSwKKwl9LAorCXsgfQorfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgczNjbWNpXzI0MTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXJldHVybiBzM2NtY2lfcHJvYmUoZGV2LCAxKTsKLX0KK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHMzY21jaV9kcml2ZXJfaWRzKTsKIAotc3RhdGljIGludCBfX2RldmluaXQgczNjbWNpXzI0NDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXJldHVybiBzM2NtY2lfcHJvYmUoZGV2LCAxKTsKLX0KIAogI2lmZGVmIENPTkZJR19QTQogCi1zdGF0aWMgaW50IHMzY21jaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzM2NtY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1tY19ob3N0ICptbWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworCXN0cnVjdCBwbV9tZXNzYWdlIGV2ZW50ID0geyBQTV9FVkVOVF9TVVNQRU5EIH07CiAKLQlyZXR1cm4gIG1tY19zdXNwZW5kX2hvc3QobW1jLCBzdGF0ZSk7CisJcmV0dXJuIG1tY19zdXNwZW5kX2hvc3QobW1jLCBldmVudCk7CiB9CiAKLXN0YXRpYyBpbnQgczNjbWNpX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHMzY21jaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKIAogCXJldHVybiBtbWNfcmVzdW1lX2hvc3QobW1jKTsKIH0KIAorc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHMzY21jaV9wbSA9IHsKKwkuc3VzcGVuZAk9IHMzY21jaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gczNjbWNpX3Jlc3VtZSwKK307CisKKyNkZWZpbmUgczNjbWNpX3BtX29wcyAmczNjbWNpX3BtCiAjZWxzZSAvKiBDT05GSUdfUE0gKi8KLSNkZWZpbmUgczNjbWNpX3N1c3BlbmQgTlVMTAotI2RlZmluZSBzM2NtY2lfcmVzdW1lIE5VTEwKKyNkZWZpbmUgczNjbWNpX3BtX29wcyBOVUxMCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjbWNpXzI0MTBfZHJpdmVyID0gewotCS5kcml2ZXIubmFtZQk9ICJzM2MyNDEwLXNkaSIsCi0JLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5wcm9iZQkJPSBzM2NtY2lfMjQxMF9wcm9iZSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzY21jaV9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAiczNjLXNkaSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSBzM2NtY2lfcG1fb3BzLAorCX0sCisJLmlkX3RhYmxlCT0gczNjbWNpX2RyaXZlcl9pZHMsCisJLnByb2JlCQk9IHMzY21jaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHMzY21jaV9yZW1vdmUpLAogCS5zaHV0ZG93bgk9IHMzY21jaV9zaHV0ZG93biwKLQkuc3VzcGVuZAk9IHMzY21jaV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gczNjbWNpX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzY21jaV8yNDEyX2RyaXZlciA9IHsKLQkuZHJpdmVyLm5hbWUJPSAiczNjMjQxMi1zZGkiLAotCS5kcml2ZXIub3duZXIJPSBUSElTX01PRFVMRSwKLQkucHJvYmUJCT0gczNjbWNpXzI0MTJfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzM2NtY2lfcmVtb3ZlKSwKLQkuc2h1dGRvd24JPSBzM2NtY2lfc2h1dGRvd24sCi0JLnN1c3BlbmQJPSBzM2NtY2lfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHMzY21jaV9yZXN1bWUsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2NtY2lfMjQ0MF9kcml2ZXIgPSB7Ci0JLmRyaXZlci5uYW1lCT0gInMzYzI0NDAtc2RpIiwKLQkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLnByb2JlCQk9IHMzY21jaV8yNDQwX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoczNjbWNpX3JlbW92ZSksCi0JLnNodXRkb3duCT0gczNjbWNpX3NodXRkb3duLAotCS5zdXNwZW5kCT0gczNjbWNpX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzM2NtY2lfcmVzdW1lLAotfTsKLQotCiBzdGF0aWMgaW50IF9faW5pdCBzM2NtY2lfaW5pdCh2b2lkKQogewotCXBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmczNjbWNpXzI0MTBfZHJpdmVyKTsKLQlwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnMzY21jaV8yNDEyX2RyaXZlcik7Ci0JcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzM2NtY2lfMjQ0MF9kcml2ZXIpOwotCXJldHVybiAwOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnMzY21jaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgczNjbWNpX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjbWNpXzI0MTBfZHJpdmVyKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjbWNpXzI0MTJfZHJpdmVyKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjbWNpXzI0NDBfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjbWNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHMzY21jaV9pbml0KTsKQEAgLTE1NjQsNiArMTkzMSwzIEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgUzNDIE1NQy9TRCBDYXJkIEludGVyZmFjZSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIE1PRFVMRV9BVVRIT1IoIlRob21hcyBLbGVmZmVsIDx0a0BtYWludGVjaC5kZT4sIEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4iKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06czNjMjQxMC1zZGkiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06czNjMjQxMi1zZGkiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06czNjMjQ0MC1zZGkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvczNjbWNpLmggYi9kcml2ZXJzL21tYy9ob3N0L3MzY21jaS5oCmluZGV4IGNhMWJhM2QuLmM3NmI1M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvczNjbWNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuaApAQCAtOCw5ICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLS8qIEZJWE1FOiBETUEgUmVzb3VyY2UgbWFuYWdlbWVudCA/ISAqLwotI2RlZmluZSBTM0NNQ0lfRE1BIDAKLQogZW51bSBzM2NtY2lfd2FpdGZvciB7CiAJQ09NUExFVElPTl9OT05FLAogCUNPTVBMRVRJT05fRklOQUxJWkUsCkBAIC00Miw2ICszOSwxMSBAQAogCWludAkJCWRvZG1hOwogCWludAkJCWRtYXRvZ287CiAKKwlib29sCQkJaXJxX2Rpc2FibGVkOworCWJvb2wJCQlpcnFfZW5hYmxlZDsKKwlib29sCQkJaXJxX3N0YXRlOworCWludAkJCXNkaW9faXJxZW47CisKIAlzdHJ1Y3QgbW1jX3JlcXVlc3QJKm1ycTsKIAlpbnQJCQljbWRfaXNfc3RvcDsKIApAQCAtNjgsNiArNzAsMTIgQEAKIAl1bnNpZ25lZCBpbnQJCWNjbnQsIGRjbnQ7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CXBpb190YXNrbGV0OwogCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJc3RydWN0IGRlbnRyeQkJKmRlYnVnX3Jvb3Q7CisJc3RydWN0IGRlbnRyeQkJKmRlYnVnX3N0YXRlOworCXN0cnVjdCBkZW50cnkJCSpkZWJ1Z19yZWdzOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJZnJlcV90cmFuc2l0aW9uOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvS2NvbmZpZwppbmRleCBlNGVjMzY1Li5lY2Y5MGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL0tjb25maWcKQEAgLTE1OSw3ICsxNTksNyBAQAogCiBjb25maWcgTVREX09GX1BBUlRTCiAJdHJpc3RhdGUgIkZsYXNoIHBhcnRpdGlvbiBtYXAgYmFzZWQgb24gT0YgZGVzY3JpcHRpb24iCi0JZGVwZW5kcyBvbiBQUENfT0YgJiYgTVREX1BBUlRJVElPTlMKKwlkZXBlbmRzIG9uIChNSUNST0JMQVpFIHx8IFBQQ19PRikgJiYgTVREX1BBUlRJVElPTlMKIAloZWxwCiAJICBUaGlzIHByb3ZpZGVzIGEgcGFydGl0aW9uIHBhcnNpbmcgZnVuY3Rpb24gd2hpY2ggZGVyaXZlcwogCSAgdGhlIHBhcnRpdGlvbiBtYXAgZnJvbSB0aGUgY2hpbGRyZW4gb2YgdGhlIGZsYXNoIG5vZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwppbmRleCAzNzljMzE2Li40YzE5MjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvc3N0MjVsLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3NzdDI1bC5jCmluZGV4IGMyYmFmMzMuLjBhMTE3MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvc3N0MjVsLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9zc3QyNWwuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCmluZGV4IDBmYzY3YTIuLjE0YmUwNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKQEAgLTc0LDcgKzc0LDcgQEAKIAogY29uZmlnIE1URF9QSFlTTUFQX09GCiAJdHJpc3RhdGUgIkZsYXNoIGRldmljZSBpbiBwaHlzaWNhbCBtZW1vcnkgbWFwIGJhc2VkIG9uIE9GIGRlc2NyaXB0aW9uIgotCWRlcGVuZHMgb24gUFBDX09GICYmIChNVERfQ0ZJIHx8IE1URF9KRURFQ1BST0JFIHx8IE1URF9ST00pCisJZGVwZW5kcyBvbiAoTUlDUk9CTEFaRSB8fCBQUENfT0YpICYmIChNVERfQ0ZJIHx8IE1URF9KRURFQ1BST0JFIHx8IE1URF9ST00pCiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBhICdtYXBwaW5nJyBkcml2ZXIgd2hpY2ggYWxsb3dzIHRoZSBOT1IgRmxhc2ggYW5kCiAJICBST00gZHJpdmVyIGNvZGUgdG8gY29tbXVuaWNhdGUgd2l0aCBjaGlwcyB3aGljaCBhcmUgbWFwcGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jIGIvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYwppbmRleCAwYWNiZjRmLi44Y2ExN2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCisrKyBiL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKQEAgLTMyLDE0ICszMiw2IEBACiAJc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOwogfTsKIAotc3RhdGljIGludCBibGt0cmFuc19kaXNjYXJkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCi0JCQkJICAgIHN0cnVjdCByZXF1ZXN0ICpyZXEpCi17Ci0JcmVxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0xJTlVYX0JMT0NLOwotCXJlcS0+Y21kWzBdID0gUkVRX0xCX09QX0RJU0NBUkQ7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZG9fYmxrdHJhbnNfcmVxdWVzdChzdHJ1Y3QgbXRkX2Jsa3RyYW5zX29wcyAqdHIsCiAJCQkgICAgICAgc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQpAQCAtNTIsMTAgKzQ0LDYgQEAKIAogCWJ1ZiA9IHJlcS0+YnVmZmVyOwogCi0JaWYgKHJlcS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfTElOVVhfQkxPQ0sgJiYKLQkgICAgcmVxLT5jbWRbMF0gPT0gUkVRX0xCX09QX0RJU0NBUkQpCi0JCXJldHVybiB0ci0+ZGlzY2FyZChkZXYsIGJsb2NrLCBuc2VjdCk7Ci0KIAlpZiAoIWJsa19mc19yZXF1ZXN0KHJlcSkpCiAJCXJldHVybiAtRUlPOwogCkBAIC02Myw2ICs1MSw5IEBACiAJICAgIGdldF9jYXBhY2l0eShyZXEtPnJxX2Rpc2spKQogCQlyZXR1cm4gLUVJTzsKIAorCWlmIChibGtfZGlzY2FyZF9ycShyZXEpKQorCQlyZXR1cm4gdHItPmRpc2NhcmQoZGV2LCBibG9jaywgbnNlY3QpOworCiAJc3dpdGNoKHJxX2RhdGFfZGlyKHJlcSkpIHsKIAljYXNlIFJFQUQ6CiAJCWZvciAoOyBuc2VjdCA+IDA7IG5zZWN0LS0sIGJsb2NrKyssIGJ1ZiArPSB0ci0+Ymxrc2l6ZSkKQEAgLTM4MCw4ICszNzEsOCBAQAogCXRyLT5ibGtjb3JlX3ByaXYtPnJxLT5xdWV1ZWRhdGEgPSB0cjsKIAlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHRyLT5ibGtjb3JlX3ByaXYtPnJxLCB0ci0+Ymxrc2l6ZSk7CiAJaWYgKHRyLT5kaXNjYXJkKQotCQlibGtfcXVldWVfc2V0X2Rpc2NhcmQodHItPmJsa2NvcmVfcHJpdi0+cnEsCi0JCQkJICAgICAgYmxrdHJhbnNfZGlzY2FyZF9yZXF1ZXN0KTsKKwkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELAorCQkJCQl0ci0+YmxrY29yZV9wcml2LT5ycSk7CiAKIAl0ci0+Ymxrc2hpZnQgPSBmZnModHItPmJsa3NpemUpIC0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwppbmRleCBlMWY3ZDBhLi4xNGNlYzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvYnVpbGQuYworKysgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSAidWJpLmgiCiAKIC8qIE1heGltdW0gbGVuZ3RoIG9mIHRoZSAnbXRkPScgcGFyYW1ldGVyICovCkBAIC0xMjU3LDcgKzEyNTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCiAJcmVzdWx0ID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmZW5kcCwgMCk7Ci0JaWYgKHN0ciA9PSBlbmRwIHx8IHJlc3VsdCA8IDApIHsKKwlpZiAoc3RyID09IGVuZHAgfHwgcmVzdWx0ID49IElOVF9NQVgpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVQkkgZXJyb3I6IGluY29ycmVjdCBieXRlcyBjb3VudDogXCIlc1wiXG4iLAogCQkgICAgICAgc3RyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uYwppbmRleCBlNzE2MWFkLi45MGFmNjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKQEAgLTc5NCwxNiArNzk0LDE1IEBACiAJCSAqIG51bWJlci4KIAkJICovCiAJCWltYWdlX3NlcSA9IGJlMzJfdG9fY3B1KGVjaC0+aW1hZ2Vfc2VxKTsKLQkJaWYgKCFzaS0+aW1hZ2Vfc2VxX3NldCkgeworCQlpZiAoIXViaS0+aW1hZ2Vfc2VxICYmIGltYWdlX3NlcSkKIAkJCXViaS0+aW1hZ2Vfc2VxID0gaW1hZ2Vfc2VxOwotCQkJc2ktPmltYWdlX3NlcV9zZXQgPSAxOwotCQl9IGVsc2UgaWYgKHViaS0+aW1hZ2Vfc2VxICYmIHViaS0+aW1hZ2Vfc2VxICE9IGltYWdlX3NlcSkgeworCQlpZiAodWJpLT5pbWFnZV9zZXEgJiYgaW1hZ2Vfc2VxICYmCisJCSAgICB1YmktPmltYWdlX3NlcSAhPSBpbWFnZV9zZXEpIHsKIAkJCXViaV9lcnIoImJhZCBpbWFnZSBzZXF1ZW5jZSBudW1iZXIgJWQgaW4gUEVCICVkLCAiCiAJCQkJImV4cGVjdGVkICVkIiwgaW1hZ2Vfc2VxLCBwbnVtLCB1YmktPmltYWdlX3NlcSk7CiAJCQl1YmlfZGJnX2R1bXBfZWNfaGRyKGVjaCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCiAJfQogCiAJLyogT0ssIHdlJ3ZlIGRvbmUgd2l0aCB0aGUgRUMgaGVhZGVyLCBsZXQncyBsb29rIGF0IHRoZSBWSUQgaGVhZGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5oIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uaAppbmRleCBiYWIzMTY5Li5mZjE3OWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5oCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmgKQEAgLTEwMyw3ICsxMDMsNiBAQAogICogQGVjX3N1bTogYSB0ZW1wb3JhcnkgdmFyaWFibGUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIEBtZWFuX2VjCiAgKiBAZWNfY291bnQ6IGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyBAbWVhbl9lYwogICogQGNvcnJfY291bnQ6IGNvdW50IG9mIGNvcnJ1cHRlZCBQRUJzCi0gKiBAaW1hZ2Vfc2VxX3NldDogaW5kaWNhdGVzIEB1YmktPmltYWdlX3NlcSBpcyBrbm93bgogICoKICAqIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBzY2FubmluZyBhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXIKICAqIFVCSSBzdWItc3lzdGVtcyB0byBidWlsZCBmaW5hbCBVQkkgZGF0YSBzdHJ1Y3R1cmVzLCBmdXJ0aGVyIGVycm9yLXJlY292ZXJ5CkBAIC0xMjcsNyArMTI2LDYgQEAKIAl1aW50NjRfdCBlY19zdW07CiAJaW50IGVjX2NvdW50OwogCWludCBjb3JyX2NvdW50OwotCWludCBpbWFnZV9zZXFfc2V0OwogfTsKIAogc3RydWN0IHViaV9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzU5eC5jIGIvZHJpdmVycy9uZXQvM2M1OXguYwppbmRleCA3YWRmZjRkLi45NzVlMjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzU5eC5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKQEAgLTgwNSw1OCArODA1LDU0IEBACiAKICNpZmRlZiBDT05GSUdfUE0KIAotc3RhdGljIGludCB2b3J0ZXhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCB2b3J0ZXhfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChkZXYgJiYgbmV0ZGV2X3ByaXYoZGV2KSkgewotCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7Ci0JCQl2b3J0ZXhfZG93bihkZXYsIDEpOwotCQl9Ci0JCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIDApOwotCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKLQl9CisJaWYgKCFuZGV2IHx8ICFuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQlyZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmRldik7CisJdm9ydGV4X2Rvd24obmRldiwgMSk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2b3J0ZXhfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCB2b3J0ZXhfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBlcnI7CiAKLQlpZiAoZGV2ICYmIHZwKSB7Ci0JCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKLQkJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7Ci0JCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCQlpZiAoZXJyKSB7Ci0JCQlwcl93YXJuaW5nKCIlczogQ291bGQgbm90IGVuYWJsZSBkZXZpY2VcbiIsCi0JCQkJZGV2LT5uYW1lKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQkJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgdnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCA/Ci0JCQkJJmJvb21lcmFuZ19pbnRlcnJ1cHQgOiAmdm9ydGV4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSkgewotCQkJcHJfd2FybmluZygiJXM6IENvdWxkIG5vdCByZXNlcnZlIElSUSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7Ci0JCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJCWVyciA9IHZvcnRleF91cChkZXYpOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCQkJZWxzZQotCQkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKLQkJfQotCX0KKwlpZiAoIW5kZXYgfHwgIW5ldGlmX3J1bm5pbmcobmRldikpCisJCXJldHVybiAwOworCisJZXJyID0gdm9ydGV4X3VwKG5kZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyB2b3J0ZXhfcG1fb3BzID0geworCS5zdXNwZW5kID0gdm9ydGV4X3N1c3BlbmQsCisJLnJlc3VtZSA9IHZvcnRleF9yZXN1bWUsCisJLmZyZWV6ZSA9IHZvcnRleF9zdXNwZW5kLAorCS50aGF3ID0gdm9ydGV4X3Jlc3VtZSwKKwkucG93ZXJvZmYgPSB2b3J0ZXhfc3VzcGVuZCwKKwkucmVzdG9yZSA9IHZvcnRleF9yZXN1bWUsCit9OworCisjZGVmaW5lIFZPUlRFWF9QTV9PUFMgKCZ2b3J0ZXhfcG1fb3BzKQorCisjZWxzZSAvKiAhQ09ORklHX1BNICovCisKKyNkZWZpbmUgVk9SVEVYX1BNX09QUyBOVUxMCisKKyNlbmRpZiAvKiAhQ09ORklHX1BNICovCiAKICNpZmRlZiBDT05GSUdfRUlTQQogc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCB2b3J0ZXhfZWlzYV9pZHNbXSA9IHsKQEAgLTMyMDUsMTAgKzMyMDEsNyBAQAogCS5wcm9iZQkJPSB2b3J0ZXhfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh2b3J0ZXhfcmVtb3ZlX29uZSksCiAJLmlkX3RhYmxlCT0gdm9ydGV4X3BjaV90YmwsCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSB2b3J0ZXhfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHZvcnRleF9yZXN1bWUsCi0jZW5kaWYKKwkuZHJpdmVyLnBtCT0gVk9SVEVYX1BNX09QUywKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOWNwLmMgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwppbmRleCA0NjJkOWY1Li44M2ExOTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5Y3AuYworKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtODcsNyArODcsNyBAQAogCiAvKiBUaGVzZSBpZGVudGlmeSB0aGUgZHJpdmVyIGJhc2UgdmVyc2lvbiBhbmQgbWF5IG5vdCBiZSByZW1vdmVkLiAqLwogc3RhdGljIGNoYXIgdmVyc2lvbltdID0KLUtFUk5fSU5GTyBEUlZfTkFNRSAiOiAxMC8xMDAgUENJIEV0aGVybmV0IGRyaXZlciB2IiBEUlZfVkVSU0lPTiAiICgiIERSVl9SRUxEQVRFICIpXG4iOworRFJWX05BTUUgIjogMTAvMTAwIFBDSSBFdGhlcm5ldCBkcml2ZXIgdiIgRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKIAogTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFsVGVrIFJUTC04MTM5Qysgc2VyaWVzIDEwLzEwMCBQQ0kgRXRoZXJuZXQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCBlZDU3NDFiLi5lMTljYTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTE3MzgsNiArMTczOCwxNCBAQAogICAgICAgIGhlbHAKICAgICAgICAgIFNQSSBkcml2ZXIgZm9yIE1pY3JlbCBLUzg4NTEgU1BJIGF0dGFjaGVkIG5ldHdvcmsgY2hpcC4KIAorY29uZmlnIEtTODg1MV9NTEwKKwl0cmlzdGF0ZSAiTWljcmVsIEtTODg1MSBNTEwiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KKwlzZWxlY3QgTUlJCisJaGVscAorCSAgVGhpcyBwbGF0Zm9ybSBkcml2ZXIgaXMgZm9yIE1pY3JlbCBLUzg4NTEgQWRkcmVzcy9kYXRhIGJ1cworCSAgbXVsdGlwbGV4ZWQgbmV0d29yayBjaGlwLgorCiBjb25maWcgVklBX1JISU5FCiAJdHJpc3RhdGUgIlZJQSBSaGluZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kKQEAgLTE4NzUsNyArMTg4Myw3IEBACiAKIGNvbmZpZyBGRUMKIAlib29sICJGRUMgZXRoZXJuZXQgY29udHJvbGxlciAob2YgQ29sZEZpcmUgYW5kIHNvbWUgaS5NWCBDUFVzKSIKLQlkZXBlbmRzIG9uIE01MjN4IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MjB4IHx8IE01MzJ4IHx8IE1BQ0hfTVgyNyB8fCBBUkNIX01YMzUKKwlkZXBlbmRzIG9uIE01MjN4IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MjB4IHx8IE01MzJ4IHx8IE1BQ0hfTVgyNyB8fCBBUkNIX01YMzUgfHwgQVJDSF9NWDI1CiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGJ1aWx0LWluIDEwLzEwMCBGYXN0IGV0aGVybmV0CiAJICBjb250cm9sbGVyIG9uIHNvbWUgTW90b3JvbGEgQ29sZEZpcmUgYW5kIEZyZWVzY2FsZSBpLk1YIHByb2Nlc3NvcnMuCkBAIC0yNDc1LDYgKzI0ODMsOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgczZnbWFjLgogCitzb3VyY2UgImRyaXZlcnMvbmV0L3N0bW1hYy9LY29uZmlnIgorCiBlbmRpZiAjIE5FVERFVl8xMDAwCiAKICMKQEAgLTMyMjMsNCArMzIzMywxMiBAQAogCSAgVGhpcyBpcyB0aGUgdmlydHVhbCBuZXR3b3JrIGRyaXZlciBmb3IgdmlydGlvLiAgSXQgY2FuIGJlIHVzZWQgd2l0aAogICAgICAgICAgIGxndWVzdCBvciBRRU1VIGJhc2VkIFZNTXMgKGxpa2UgS1ZNIG9yIFhlbikuICBTYXkgWSBvciBNLgogCitjb25maWcgVk1YTkVUMworICAgICAgIHRyaXN0YXRlICJWTXdhcmUgVk1YTkVUMyBldGhlcm5ldCBkcml2ZXIiCisgICAgICAgZGVwZW5kcyBvbiBQQ0kgJiYgWDg2ICYmIElORVQKKyAgICAgICBoZWxwCisgICAgICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyBWTXdhcmUncyB2bXhuZXQzIHZpcnR1YWwgZXRoZXJuZXQgTklDLgorICAgICAgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisgICAgICAgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdm14bmV0My4KKwogZW5kaWYgIyBORVRERVZJQ0VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IGFlOGNkMzAuLjI0NjMyM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC0yLDYgKzIsMTAgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBuZXR3b3JrIChldGhlcmNhcmQpIGRldmljZSBkcml2ZXJzLgogIwogCitvYmotJChDT05GSUdfTUlJKSArPSBtaWkubworb2JqLSQoQ09ORklHX01ESU8pICs9IG1kaW8ubworb2JqLSQoQ09ORklHX1BIWUxJQikgKz0gcGh5LworCiBvYmotJChDT05GSUdfVElfREFWSU5DSV9FTUFDKSArPSBkYXZpbmNpX2VtYWMubwogCiBvYmotJChDT05GSUdfRTEwMDApICs9IGUxMDAwLwpAQCAtMjYsNiArMzAsNyBAQAogb2JqLSQoQ09ORklHX0VOSUMpICs9IGVuaWMvCiBvYmotJChDT05GSUdfSk1FKSArPSBqbWUubwogb2JqLSQoQ09ORklHX0JFMk5FVCkgKz0gYmVuZXQvCitvYmotJChDT05GSUdfVk1YTkVUMykgKz0gdm14bmV0My8KIAogZ2lhbmZhcl9kcml2ZXItb2JqcyA6PSBnaWFuZmFyLm8gXAogCQlnaWFuZmFyX2V0aHRvb2wubyBcCkBAIC04OSwyMCArOTQsMTggQEAKIG9iai0kKENPTkZJR19TS0ZQKSArPSBza2ZwLwogb2JqLSQoQ09ORklHX0tTODg0MikJKz0ga3M4ODQyLm8KIG9iai0kKENPTkZJR19LUzg4NTEpCSs9IGtzODg1MS5vCitvYmotJChDT05GSUdfS1M4ODUxX01MTCkJKz0ga3M4ODUxX21sbC5vCiBvYmotJChDT05GSUdfVklBX1JISU5FKSArPSB2aWEtcmhpbmUubwogb2JqLSQoQ09ORklHX1ZJQV9WRUxPQ0lUWSkgKz0gdmlhLXZlbG9jaXR5Lm8KIG9iai0kKENPTkZJR19BREFQVEVDX1NUQVJGSVJFKSArPSBzdGFyZmlyZS5vCiBvYmotJChDT05GSUdfUklPTkVUKSArPSByaW9uZXQubwogb2JqLSQoQ09ORklHX1NIX0VUSCkgKz0gc2hfZXRoLm8KK29iai0kKENPTkZJR19TVE1NQUNfRVRIKSArPSBzdG1tYWMvCiAKICMKICMgZW5kIGxpbmsgb3JkZXIgc2VjdGlvbgogIwogCi1vYmotJChDT05GSUdfTUlJKSArPSBtaWkubwotb2JqLSQoQ09ORklHX01ESU8pICs9IG1kaW8ubwotb2JqLSQoQ09ORklHX1BIWUxJQikgKz0gcGh5LwotCiBvYmotJChDT05GSUdfU1VOREFOQ0UpICs9IHN1bmRhbmNlLm8KIG9iai0kKENPTkZJR19IQU1BQ0hJKSArPSBoYW1hY2hpLm8KIG9iai0kKENPTkZJR19ORVQpICs9IFNwYWNlLm8gbG9vcGJhY2subwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWNlbmljLmMgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwppbmRleCA1ZjBiMDVjLi5kODJhOWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hY2VuaWMuYworKysgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwpAQCAtMTIwOSw3ICsxMjA5LDggQEAKIAltZW1zZXQoYXAtPmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWNlX2luZm8pKTsKIAltZW1zZXQoYXAtPnNrYiwgMCwgc2l6ZW9mKHN0cnVjdCBhY2Vfc2tiKSk7CiAKLQlpZiAoYWNlX2xvYWRfZmlybXdhcmUoZGV2KSkKKwllY29kZSA9IGFjZV9sb2FkX2Zpcm13YXJlKGRldik7CisJaWYgKGVjb2RlKQogCQlnb3RvIGluaXRfZXJyb3I7CiAKIAlhcC0+ZndfcnVubmluZyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxYy9hdGwxY19tYWluLmMgYi9kcml2ZXJzL25ldC9hdGwxYy9hdGwxY19tYWluLmMKaW5kZXggYmUyYzZjZi4uMTM3MmU5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX21haW4uYwpAQCAtMjI5Niw3ICsyMjk2LDcgQEAKIAl1MzIgY3RybDsKIAl1MzIgbWFjX2N0cmxfZGF0YTsKIAl1MzIgbWFzdGVyX2N0cmxfZGF0YTsKLQl1MzIgd29sX2N0cmxfZGF0YTsKKwl1MzIgd29sX2N0cmxfZGF0YSA9IDA7CiAJdTE2IG1paV9ibXNyX2RhdGE7CiAJdTE2IHNhdmVfYXV0b25lZ19hZHZlcnRpc2VkOwogCXUxNiBtaWlfaW50cl9zdGF0dXNfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYyBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYwppbmRleCBmZGY1OTM3Li5jZTZmMWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCkBAIC0zNCw2ICszNCw3IEBACiAgKgogICoKICAqLworI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNzIxLDcgKzcyMiw3IEBACiAJCXBzLT5yeF9lcnJvcnMrKzsKIAkJaWYgKHN0YXR1cyAmIFJYX01JU1NFRF9GUkFNRSkKIAkJCXBzLT5yeF9taXNzZWRfZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiAoUlhfT1ZFUkxFTiB8IFJYX09WRVJMRU4gfCBSWF9MRU5fRVJST1IpKQorCQlpZiAoc3RhdHVzICYgKFJYX09WRVJMRU4gfCBSWF9SVU5UIHwgUlhfTEVOX0VSUk9SKSkKIAkJCXBzLT5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCWlmIChzdGF0dXMgJiBSWF9DUkNfRVJST1IpCiAJCQlwcy0+cnhfY3JjX2Vycm9ycysrOwpAQCAtNzk0LDggKzc5NSw2IEBACiAJCQkJCXByaW50aygicnggbGVuIGVycm9yXG4iKTsKIAkJCQlpZiAoc3RhdHVzICYgUlhfVV9DTlRSTF9GUkFNRSkKIAkJCQkJcHJpbnRrKCJyeCB1IGNvbnRyb2wgZnJhbWVcbiIpOwotCQkJCWlmIChzdGF0dXMgJiBSWF9NSVNTRURfRlJBTUUpCi0JCQkJCXByaW50aygicnggbWlzc1xuIik7CiAJCQl9CiAJCX0KIAkJcHJ4ZC0+YnVmZl9zdGF0ID0gKHUzMikocERCLT5kbWFfYWRkciB8IFJYX0RNQV9FTkFCTEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmNtNjN4eF9lbmV0LmMgYi9kcml2ZXJzL25ldC9iY202M3h4X2VuZXQuYwppbmRleCAwOWQyNzA5Li5iYTI5ZGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iY202M3h4X2VuZXQuYworKysgYi9kcml2ZXJzL25ldC9iY202M3h4X2VuZXQuYwpAQCAtOTAsNyArOTAsNyBAQAogCQlpZiAoZW5ldF9yZWFkbChwcml2LCBFTkVUX0lSX1JFRykgJiBFTkVUX0lSX01JSSkKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMSk7Ci0JfSB3aGlsZSAobGltaXQtLSA+PSAwKTsKKwl9IHdoaWxlIChsaW1pdC0tID4gMCk7CiAKIAlyZXR1cm4gKGxpbWl0IDwgMCkgPyAxIDogMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlLmggYi9kcml2ZXJzL25ldC9iZW5ldC9iZS5oCmluZGV4IDY4NGM2ZmUuLmE4MGRhMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlLmgKKysrIGIvZHJpdmVycy9uZXQvYmVuZXQvYmUuaApAQCAtMjU4LDYgKzI1OCw3IEBACiAJYm9vbCBsaW5rX3VwOwogCXUzMiBwb3J0X251bTsKIAlib29sIHByb21pc2N1b3VzOworCXUzMiBjYXA7CiB9OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJlX2V0aHRvb2xfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5jIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5jCmluZGV4IDNkZDc2YzQuLjI4YTBlZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuYworKysgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9jbWRzLmMKQEAgLTI0MywxNSArMjQzLDI2IEBACiAKIGludCBiZV9jbWRfUE9TVChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQl1MTYgc3RhZ2UsIGVycm9yOworCXUxNiBzdGFnZTsKKwlpbnQgc3RhdHVzLCB0aW1lb3V0ID0gMDsKIAotCWVycm9yID0gYmVfUE9TVF9zdGFnZV9nZXQoYWRhcHRlciwgJnN0YWdlKTsKLQlpZiAoZXJyb3IgfHwgc3RhZ2UgIT0gUE9TVF9TVEFHRV9BUk1GV19SRFkpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUE9TVCBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlkbyB7CisJCXN0YXR1cyA9IGJlX1BPU1Rfc3RhZ2VfZ2V0KGFkYXB0ZXIsICZzdGFnZSk7CisJCWlmIChzdGF0dXMpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIlBPU1QgZXJyb3I7IHN0YWdlPTB4JXhcbiIsCisJCQkJc3RhZ2UpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKHN0YWdlICE9IFBPU1RfU1RBR0VfQVJNRldfUkRZKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgyICogSFopOworCQkJdGltZW91dCArPSAyOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlICh0aW1lb3V0IDwgMjApOwogCi0JcmV0dXJuIDA7CisJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUE9TVCB0aW1lb3V0OyBzdGFnZT0weCV4XG4iLCBzdGFnZSk7CisJcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmVtYmVkZGVkX3BheWxvYWQoc3RydWN0IGJlX21jY193cmIgKndyYikKQEAgLTcyOSw4ICs3NDAsOCBAQAogLyogQ3JlYXRlIGFuIHJ4IGZpbHRlcmluZyBwb2xpY3kgY29uZmlndXJhdGlvbiBvbiBhbiBpL2YKICAqIFVzZXMgbWJveAogICovCi1pbnQgYmVfY21kX2lmX2NyZWF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGZsYWdzLCB1OCAqbWFjLAotCQlib29sIHBtYWNfaW52YWxpZCwgdTMyICppZl9oYW5kbGUsIHUzMiAqcG1hY19pZCkKK2ludCBiZV9jbWRfaWZfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgY2FwX2ZsYWdzLCB1MzIgZW5fZmxhZ3MsCisJCXU4ICptYWMsIGJvb2wgcG1hY19pbnZhbGlkLCB1MzIgKmlmX2hhbmRsZSwgdTMyICpwbWFjX2lkKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfaWZfY3JlYXRlICpyZXE7CkBAIC03NDYsOCArNzU3LDggQEAKIAliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKIAkJT1BDT0RFX0NPTU1PTl9OVFdLX0lOVEVSRkFDRV9DUkVBVEUsIHNpemVvZigqcmVxKSk7CiAKLQlyZXEtPmNhcGFiaWxpdHlfZmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7Ci0JcmVxLT5lbmFibGVfZmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CisJcmVxLT5jYXBhYmlsaXR5X2ZsYWdzID0gY3B1X3RvX2xlMzIoY2FwX2ZsYWdzKTsKKwlyZXEtPmVuYWJsZV9mbGFncyA9IGNwdV90b19sZTMyKGVuX2ZsYWdzKTsKIAlyZXEtPnBtYWNfaW52YWxpZCA9IHBtYWNfaW52YWxpZDsKIAlpZiAoIXBtYWNfaW52YWxpZCkKIAkJbWVtY3B5KHJlcS0+bWFjX2FkZHIsIG1hYywgRVRIX0FMRU4pOwpAQCAtMTA2OCw3ICsxMDc5LDcgQEAKIH0KIAogLyogVXNlcyBtYm94ICovCi1pbnQgYmVfY21kX3F1ZXJ5X2Z3X2NmZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyICpwb3J0X251bSkKK2ludCBiZV9jbWRfcXVlcnlfZndfY2ZnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgKnBvcnRfbnVtLCB1MzIgKmNhcCkKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfcmVxX3F1ZXJ5X2Z3X2NmZyAqcmVxOwpAQCAtMTA4OCw2ICsxMDk5LDcgQEAKIAlpZiAoIXN0YXR1cykgewogCQlzdHJ1Y3QgYmVfY21kX3Jlc3BfcXVlcnlfZndfY2ZnICpyZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCQkqcG9ydF9udW0gPSBsZTMyX3RvX2NwdShyZXNwLT5waHlzX3BvcnQpOworCQkqY2FwID0gbGUzMl90b19jcHUocmVzcC0+ZnVuY3Rpb25fY2FwKTsKIAl9CiAKIAlzcGluX3VubG9jaygmYWRhcHRlci0+bWJveF9sb2NrKTsKQEAgLTExMjgsNyArMTE0MCw2IEBACiAJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwotCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAlzZ2UgPSBub25lbWJlZGRlZF9zZ2wod3JiKTsKIAogCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIGNtZC0+c2l6ZSwgZmFsc2UsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5oIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5oCmluZGV4IDkzZTQzMmYuLjQ5OTUzNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuaAorKysgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9jbWRzLmgKQEAgLTYyLDcgKzYyLDcgQEAKIAlNQ0NfU1RBVFVTX1FVRVVFX0ZMVVNISU5HID0gMHg0LAogLyogVGhlIGNvbW1hbmQgaXMgY29tcGxldGluZyB3aXRoIGEgRE1BIGVycm9yICovCiAJTUNDX1NUQVRVU19ETUFfRkFJTEVEID0gMHg1LAotCU1DQ19TVEFUVVNfTk9UX1NVUFBPUlRFRCA9IDB4NjYKKwlNQ0NfU1RBVFVTX05PVF9TVVBQT1JURUQgPSA2NgogfTsKIAogI2RlZmluZSBDUUVfU1RBVFVTX0NPTVBMX01BU0sJCTB4RkZGRgpAQCAtNzIwLDggKzcyMCw5IEBACiBleHRlcm4gaW50IGJlX2NtZF9wbWFjX2FkZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hY19hZGRyLAogCQkJdTMyIGlmX2lkLCB1MzIgKnBtYWNfaWQpOwogZXh0ZXJuIGludCBiZV9jbWRfcG1hY19kZWwoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBpZl9pZCwgdTMyIHBtYWNfaWQpOwotZXh0ZXJuIGludCBiZV9jbWRfaWZfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgaWZfZmxhZ3MsIHU4ICptYWMsCi0JCQlib29sIHBtYWNfaW52YWxpZCwgdTMyICppZl9oYW5kbGUsIHUzMiAqcG1hY19pZCk7CitleHRlcm4gaW50IGJlX2NtZF9pZl9jcmVhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjYXBfZmxhZ3MsCisJCQl1MzIgZW5fZmxhZ3MsIHU4ICptYWMsIGJvb2wgcG1hY19pbnZhbGlkLAorCQkJdTMyICppZl9oYW5kbGUsIHUzMiAqcG1hY19pZCk7CiBleHRlcm4gaW50IGJlX2NtZF9pZl9kZXN0cm95KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgaWZfaGFuZGxlKTsKIGV4dGVybiBpbnQgYmVfY21kX2VxX2NyZWF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcSwgaW50IGVxX2RlbGF5KTsKQEAgLTc2MCw3ICs3NjEsOCBAQAogCQkJdTMyIHR4X2ZjLCB1MzIgcnhfZmMpOwogZXh0ZXJuIGludCBiZV9jbWRfZ2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJCXUzMiAqdHhfZmMsIHUzMiAqcnhfZmMpOwotZXh0ZXJuIGludCBiZV9jbWRfcXVlcnlfZndfY2ZnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgKnBvcnRfbnVtKTsKK2V4dGVybiBpbnQgYmVfY21kX3F1ZXJ5X2Z3X2NmZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCXUzMiAqcG9ydF9udW0sIHUzMiAqY2FwKTsKIGV4dGVybiBpbnQgYmVfY21kX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiBpbnQgYmVfcHJvY2Vzc19tY2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIGludCBiZV9jbWRfd3JpdGVfZmxhc2hyb20oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9ldGh0b29sLmMKaW5kZXggMTE0NDVkZi4uY2RhNWJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2V0aHRvb2wuYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJLmdldF9yeF9jc3VtID0gYmVfZ2V0X3J4X2NzdW0sCiAJLnNldF9yeF9jc3VtID0gYmVfc2V0X3J4X2NzdW0sCiAJLmdldF90eF9jc3VtID0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKLQkuc2V0X3R4X2NzdW0gPSBldGh0b29sX29wX3NldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3Bfc2V0X3R4X2h3X2NzdW0sCiAJLmdldF9zZyA9IGV0aHRvb2xfb3BfZ2V0X3NnLAogCS5zZXRfc2cgPSBldGh0b29sX29wX3NldF9zZywKIAkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX21haW4uYwppbmRleCA0MDljZjA1Li4xZjk0MWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfbWFpbi5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXggKi8KIAlkZXZfc3RhdHMtPnR4X2Ryb3BwZWQgPSAwOwogCi0JZGV2X3N0YXRzLT5tdWx0aWNhc3QgPSBwb3J0X3N0YXRzLT50eF9tdWx0aWNhc3RmcmFtZXM7CisJZGV2X3N0YXRzLT5tdWx0aWNhc3QgPSBwb3J0X3N0YXRzLT5yeF9tdWx0aWNhc3RfZnJhbWVzOwogCWRldl9zdGF0cy0+Y29sbGlzaW9ucyA9IDA7CiAKIAkvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KQEAgLTc0Nyw5ICs3NDcsMTYgQEAKIAkJCXN0cnVjdCBiZV9ldGhfcnhfY29tcGwgKnJ4Y3ApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1MzIgdnRwLCB2aWQ7CisJdTMyIHZsYW5mLCB2aWQ7CisJdTggdnRtOwogCi0JdnRwID0gQU1BUF9HRVRfQklUUyhzdHJ1Y3QgYW1hcF9ldGhfcnhfY29tcGwsIHZ0cCwgcnhjcCk7CisJdmxhbmYgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbCwgdnRwLCByeGNwKTsKKwl2dG0gPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbCwgdnRtLCByeGNwKTsKKworCS8qIHZsYW5mIGNvdWxkIGJlIHdyb25nbHkgc2V0IGluIHNvbWUgY2FyZHMuCisJICogaWdub3JlIGlmIHZ0bSBpcyBub3Qgc2V0ICovCisJaWYgKChhZGFwdGVyLT5jYXAgPT0gMHg0MDApICYmICF2dG0pCisJCXZsYW5mID0gMDsKIAogCXNrYiA9IG5ldGRldl9hbGxvY19za2IoYWRhcHRlci0+bmV0ZGV2LCBCRV9IRFJfTEVOICsgTkVUX0lQX0FMSUdOKTsKIAlpZiAoIXNrYikgewpAQCAtNzcyLDcgKzc3OSw3IEBACiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYWRhcHRlci0+bmV0ZGV2KTsKIAlza2ItPmRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAotCWlmICh2dHApIHsKKwlpZiAodmxhbmYpIHsKIAkJaWYgKCFhZGFwdGVyLT52bGFuX2dycCB8fCBhZGFwdGVyLT5udW1fdmxhbnMgPT0gMCkgewogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm47CkBAIC03OTcsMTEgKzgwNCwxOCBAQAogCXN0cnVjdCBiZV9lcV9vYmogKmVxX29iaiA9ICAmYWRhcHRlci0+cnhfZXE7CiAJdTMyIG51bV9yY3ZkLCBwa3Rfc2l6ZSwgcmVtYWluaW5nLCB2bGFuZiwgY3Vycl9mcmFnX2xlbjsKIAl1MTYgaSwgcnhxX2lkeCA9IDAsIHZpZCwgajsKKwl1OCB2dG07CiAKIAludW1fcmN2ZCA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfZXRoX3J4X2NvbXBsLCBudW1mcmFncywgcnhjcCk7CiAJcGt0X3NpemUgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbCwgcGt0c2l6ZSwgcnhjcCk7CiAJdmxhbmYgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9yeF9jb21wbCwgdnRwLCByeGNwKTsKIAlyeHFfaWR4ID0gQU1BUF9HRVRfQklUUyhzdHJ1Y3QgYW1hcF9ldGhfcnhfY29tcGwsIGZyYWduZHgsIHJ4Y3ApOworCXZ0bSA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfZXRoX3J4X2NvbXBsLCB2dG0sIHJ4Y3ApOworCisJLyogdmxhbmYgY291bGQgYmUgd3JvbmdseSBzZXQgaW4gc29tZSBjYXJkcy4KKwkgKiBpZ25vcmUgaWYgdnRtIGlzIG5vdCBzZXQgKi8KKwlpZiAoKGFkYXB0ZXItPmNhcCA9PSAweDQwMCkgJiYgIXZ0bSkKKwkJdmxhbmYgPSAwOwogCiAJc2tiID0gbmFwaV9nZXRfZnJhZ3MoJmVxX29iai0+bmFwaSk7CiAJaWYgKCFza2IpIHsKQEAgLTE2MDYsMTkgKzE2MjAsMjIgQEAKIHN0YXRpYyBpbnQgYmVfc2V0dXAoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQl1MzIgaWZfZmxhZ3M7CisJdTMyIGNhcF9mbGFncywgZW5fZmxhZ3M7CiAJaW50IHN0YXR1czsKIAotCWlmX2ZsYWdzID0gQkVfSUZfRkxBR1NfQlJPQURDQVNUIHwgQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMgfAotCQlCRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUyB8IEJFX0lGX0ZMQUdTX1VOVEFHR0VEIHwKLQkJQkVfSUZfRkxBR1NfUEFTU19MM0w0X0VSUk9SUzsKLQlzdGF0dXMgPSBiZV9jbWRfaWZfY3JlYXRlKGFkYXB0ZXIsIGlmX2ZsYWdzLCBuZXRkZXYtPmRldl9hZGRyLAotCQkJZmFsc2UvKiBwbWFjX2ludmFsaWQgKi8sICZhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQkmYWRhcHRlci0+cG1hY19pZCk7CisJY2FwX2ZsYWdzID0gQkVfSUZfRkxBR1NfVU5UQUdHRUQgfCBCRV9JRl9GTEFHU19CUk9BRENBU1QgfAorCQkJQkVfSUZfRkxBR1NfTUNBU1RfUFJPTUlTQ1VPVVMgfAorCQkJQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMgfAorCQkJQkVfSUZfRkxBR1NfUEFTU19MM0w0X0VSUk9SUzsKKwllbl9mbGFncyA9IEJFX0lGX0ZMQUdTX1VOVEFHR0VEIHwgQkVfSUZfRkxBR1NfQlJPQURDQVNUIHwKKwkJCUJFX0lGX0ZMQUdTX1BBU1NfTDNMNF9FUlJPUlM7CisKKwlzdGF0dXMgPSBiZV9jbWRfaWZfY3JlYXRlKGFkYXB0ZXIsIGNhcF9mbGFncywgZW5fZmxhZ3MsCisJCQluZXRkZXYtPmRldl9hZGRyLCBmYWxzZS8qIHBtYWNfaW52YWxpZCAqLywKKwkJCSZhZGFwdGVyLT5pZl9oYW5kbGUsICZhZGFwdGVyLT5wbWFjX2lkKTsKIAlpZiAoc3RhdHVzICE9IDApCiAJCWdvdG8gZG9fbm9uZTsKIAotCiAJc3RhdHVzID0gYmVfdHhfcXVldWVzX2NyZWF0ZShhZGFwdGVyKTsKIAlpZiAoc3RhdHVzICE9IDApCiAJCWdvdG8gaWZfZGVzdHJveTsKQEAgLTE4ODUsOCArMTkwMiw4IEBACiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9UU08gfAotCQlORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fRklMVEVSIHwgTkVUSUZfRl9JUF9DU1VNIHwKLQkJTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX0dSTzsKKwkJTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUiB8IE5FVElGX0ZfSFdfQ1NVTSB8CisJCU5FVElGX0ZfR1JPOwogCiAJbmV0ZGV2LT5mbGFncyB8PSBJRkZfTVVMVElDQVNUOwogCkBAIC0yMDQxLDExICsyMDU4LDE2IEBACiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAorCXN0YXR1cyA9IGJlX2NtZF9yZXNldF9mdW5jdGlvbihhZGFwdGVyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCiAJc3RhdHVzID0gYmVfY21kX2dldF9md192ZXIoYWRhcHRlciwgYWRhcHRlci0+ZndfdmVyKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCi0Jc3RhdHVzID0gYmVfY21kX3F1ZXJ5X2Z3X2NmZyhhZGFwdGVyLCAmYWRhcHRlci0+cG9ydF9udW0pOworCXN0YXR1cyA9IGJlX2NtZF9xdWVyeV9md19jZmcoYWRhcHRlciwKKwkJCQkmYWRhcHRlci0+cG9ydF9udW0sICZhZGFwdGVyLT5jYXApOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIwOTMsMTAgKzIxMTUsNiBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZnJlZV9uZXRkZXY7CiAKLQlzdGF0dXMgPSBiZV9jbWRfcmVzZXRfZnVuY3Rpb24oYWRhcHRlcik7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBjdHJsX2NsZWFuOwotCiAJc3RhdHVzID0gYmVfc3RhdHNfaW5pdChhZGFwdGVyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGN0cmxfY2xlYW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyLmggYi9kcml2ZXJzL25ldC9ibngyLmgKaW5kZXggNmM3Zjc5NS4uYTRkODM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54Mi5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDIuaApAQCAtMzYxLDkgKzM2MSwxMiBAQAogI2RlZmluZSBCTlgyX0wyQ1RYX0NUWF9UWVBFX0NUWF9CRF9DSE5fVFlQRV9WQUxVRQkgKDE8PDI4KQogCiAjZGVmaW5lIEJOWDJfTDJDVFhfSE9TVF9CRElEWAkJCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEJOWDJfTDJDVFhfU1RBVFVTQl9OVU1fU0hJRlQJCQkgMTYKLSNkZWZpbmUgQk5YMl9MMkNUWF9TVEFUVVNCX05VTShzYl9pZCkJCQkgXAotCSgoKHNiX2lkKSA+IDApID8gKCgoc2JfaWQpICsgNykgPDwgQk5YMl9MMkNUWF9TVEFUVVNCX05VTV9TSElGVCkgOiAwKQorI2RlZmluZSBCTlgyX0wyQ1RYX0w1X1NUQVRVU0JfTlVNX1NISUZUCQkJIDE2CisjZGVmaW5lIEJOWDJfTDJDVFhfTDJfU1RBVFVTQl9OVU1fU0hJRlQJCQkgMjQKKyNkZWZpbmUgQk5YMl9MMkNUWF9MNV9TVEFUVVNCX05VTShzYl9pZCkJCVwKKwkoKChzYl9pZCkgPiAwKSA/ICgoKHNiX2lkKSArIDcpIDw8IEJOWDJfTDJDVFhfTDVfU1RBVFVTQl9OVU1fU0hJRlQpIDogMCkKKyNkZWZpbmUgQk5YMl9MMkNUWF9MMl9TVEFUVVNCX05VTShzYl9pZCkJCVwKKwkoKChzYl9pZCkgPiAwKSA/ICgoKHNiX2lkKSArIDcpIDw8IEJOWDJfTDJDVFhfTDJfU1RBVFVTQl9OVU1fU0hJRlQpIDogMCkKICNkZWZpbmUgQk5YMl9MMkNUWF9IT1NUX0JTRVEJCQkJMHgwMDAwMDAwOAogI2RlZmluZSBCTlgyX0wyQ1RYX05YX0JTRVEJCQkJMHgwMDAwMDAwYwogI2RlZmluZSBCTlgyX0wyQ1RYX05YX0JESEFERFJfSEkJCQkweDAwMDAwMDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCA2OWM1YjE1Li40MGZiNWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTY5MSw3ICs2OTEsNyBAQAogCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYsIGludCByZXBvcnRpbmcpCiB7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpzbGF2ZV9vcHMgPSBzbGF2ZV9kZXYtPm5ldGRldl9vcHM7Ci0Jc3RhdGljIGludCAoKmlvY3RsKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKKwlpbnQgKCppb2N0bCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CiAJc3RydWN0IGlmcmVxIGlmcjsKIAlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKm1paTsKIApAQCAtMzY2NSwxMCArMzY2NSwxMCBAQAogCiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CiAJCXJldHVybiAoKG50b2hsKGlwaC0+c2FkZHIgXiBpcGgtPmRhZGRyKSAmIDB4ZmZmZikgXgotCQkJKGRhdGEtPmhfZGVzdFs1XSBeIGJvbmRfZGV2LT5kZXZfYWRkcls1XSkpICUgY291bnQ7CisJCQkoZGF0YS0+aF9kZXN0WzVdIF4gZGF0YS0+aF9zb3VyY2VbNV0pKSAlIGNvdW50OwogCX0KIAotCXJldHVybiAoZGF0YS0+aF9kZXN0WzVdIF4gYm9uZF9kZXYtPmRldl9hZGRyWzVdKSAlIGNvdW50OworCXJldHVybiAoZGF0YS0+aF9kZXN0WzVdIF4gZGF0YS0+aF9zb3VyY2VbNV0pICUgY291bnQ7CiB9CiAKIC8qCkBAIC0zNjk1LDcgKzM2OTUsNyBAQAogCiAJfQogCi0JcmV0dXJuIChkYXRhLT5oX2Rlc3RbNV0gXiBib25kX2Rldi0+ZGV2X2FkZHJbNV0pICUgY291bnQ7CisJcmV0dXJuIChkYXRhLT5oX2Rlc3RbNV0gXiBkYXRhLT5oX3NvdXJjZVs1XSkgJSBjb3VudDsKIH0KIAogLyoKQEAgLTM3MDYsNyArMzcwNiw3IEBACiB7CiAJc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwogCi0JcmV0dXJuIChkYXRhLT5oX2Rlc3RbNV0gXiBib25kX2Rldi0+ZGV2X2FkZHJbNV0pICUgY291bnQ7CisJcmV0dXJuIChkYXRhLT5oX2Rlc3RbNV0gXiBkYXRhLT5oX3NvdXJjZVs1XSkgJSBjb3VudDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgZW50cnkgcG9pbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwppbmRleCA2MDQ0ZTEyLi44NzYyYTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTE4Miw2ICsxMTgzLDcgQEAKIAkJCQkgICAgICAgIjogJXM6IFNldHRpbmcgJXMgYXMgcHJpbWFyeSBzbGF2ZS5cbiIsCiAJCQkJICAgICAgIGJvbmQtPmRldi0+bmFtZSwgc2xhdmUtPmRldi0+bmFtZSk7CiAJCQkJYm9uZC0+cHJpbWFyeV9zbGF2ZSA9IHNsYXZlOworCQkJCXN0cmNweShib25kLT5wYXJhbXMucHJpbWFyeSwgc2xhdmUtPmRldi0+bmFtZSk7CiAJCQkJYm9uZF9zZWxlY3RfYWN0aXZlX3NsYXZlKGJvbmQpOwogCQkJCWdvdG8gb3V0OwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwppbmRleCAwOTAwNzQzLi5kZjMyYzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwpAQCAtNzUsNiArNzUsMTMgQEAKIAkgIENQQy1QQ0llIGFuZCBDUEMtMTA0UCBjYXJkcyBmcm9tIEVNUyBEci4gVGhvbWFzIFd1ZW5zY2hlCiAJICAoaHR0cDovL3d3dy5lbXMtd3VlbnNjaGUuZGUpLgogCitjb25maWcgQ0FOX0VNU19VU0IKKwl0cmlzdGF0ZSAiRU1TIENQQy1VU0IvQVJNNyBDQU4vVVNCIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIFVTQiAmJiBDQU5fREVWCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBvbmUgY2hhbm5lbCBDUEMtVVNCL0FSTTcgQ0FOL1VTQiBpbnRlcmZhY2UKKwkgIGZyb20gZnJvbSBFTVMgRHIuIFRob21hcyBXdWVuc2NoZSAoaHR0cDovL3d3dy5lbXMtd3VlbnNjaGUuZGUpLgorCiBjb25maWcgQ0FOX0tWQVNFUl9QQ0kKIAl0cmlzdGF0ZSAiS3Zhc2VyIFBDSWNhbnggYW5kIEt2YXNlciBQQ0ljYW4gUENJIENhcmRzIgogCWRlcGVuZHMgb24gUENJICYmIENBTl9TSkExMDAwCkBAIC04Miw2ICs4OSwxMiBAQAogCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSB0aGUgUENJY2FueCBhbmQgUENJY2FuIGNhcmRzICgxLCAyIG9yCiAJICA0IGNoYW5uZWwpIGZyb20gS3Zhc2VyIChodHRwOi8vd3d3Lmt2YXNlci5jb20pLgogCitjb25maWcgQ0FOX0FUOTEKKwl0cmlzdGF0ZSAiQXRtZWwgQVQ5MSBvbmNoaXAgQ0FOIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBDQU4gJiYgQ0FOX0RFViAmJiBBUkNIX0FUOTFTQU05MjYzCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNvQyBDQU4gY29udHJvbGxlciBpbiBBdG1lbCdzIEFUOTFTQU05MjYzLgorCiBjb25maWcgQ0FOX0RFQlVHX0RFVklDRVMKIAlib29sICJDQU4gZGV2aWNlcyBkZWJ1Z2dpbmcgbWVzc2FnZXMiCiAJZGVwZW5kcyBvbiBDQU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZQppbmRleCA1MjNhOTQxLi4wZGVhNjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvY2FuL01ha2VmaWxlCkBAIC03LDYgKzcsOSBAQAogb2JqLSQoQ09ORklHX0NBTl9ERVYpCQkrPSBjYW4tZGV2Lm8KIGNhbi1kZXYteQkJCTo9IGRldi5vCiAKK29iai15CQkJCSs9IHVzYi8KKwogb2JqLSQoQ09ORklHX0NBTl9TSkExMDAwKQkrPSBzamExMDAwLworb2JqLSQoQ09ORklHX0NBTl9BVDkxKQkJKz0gYXQ5MV9jYW4ubwogCiBjY2ZsYWdzLSQoQ09ORklHX0NBTl9ERUJVR19ERVZJQ0VTKSA6PSAtRERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vYXQ5MV9jYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9hdDkxX2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2FlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jYW4vYXQ5MV9jYW4uYwpAQCAtMCwwICsxLDExODYgQEAKKy8qCisgKiBhdDkxX2Nhbi5jIC0gQ0FOIG5ldHdvcmsgZHJpdmVyIGZvciBBVDkxIFNvQyBDQU4gY29udHJvbGxlcgorICoKKyAqIChDKSAyMDA3IGJ5IEhhbnMgSi4gS29jaCA8aGprQGxpbnV0cm9uaXguZGU+CisgKiAoQykgMjAwOCwgMjAwOSBieSBNYXJjIEtsZWluZS1CdWRkZSA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIGRpc3RyaWJ1dGVkIGluIHRoZSAnQ09QWUlORycKKyAqIGZpbGUgZnJvbSB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIGxpbnV4IGtlcm5lbCBzb3VyY2UuCisgKgorICogU2VuZCBmZWVkYmFjayB0byA8c29ja2V0Y2FuLXVzZXJzQGxpc3RzLmJlcmxpb3MuZGU+CisgKgorICoKKyAqIFlvdXIgcGxhdGZvcm0gZGVmaW5pdGlvbiBmaWxlIHNob3VsZCBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlOgorICoKKyAqIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9jYW5fZGF0YSBla19jYW5fZGF0YSA9IHsKKyAqCXRyYW5zY2VpdmVyX3N3aXRjaCA9IHNhbTkyNjNla190cmFuc2NlaXZlcl9zd2l0Y2gsCisgKiB9OworICoKKyAqIGF0OTFfYWRkX2RldmljZV9jYW4oJmVrX2Nhbl9kYXRhKTsKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vZXJyb3IuaD4KKworI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKworI2RlZmluZSBEUlZfTkFNRQkJImF0OTFfY2FuIgorI2RlZmluZSBBVDkxX05BUElfV0VJR0hUCTEyCisKKy8qCisgKiBSWC9UWCBNYWlsYm94IHNwbGl0CisgKiBkb24ndCBkYXJlIHRvIHRvdWNoCisgKi8KKyNkZWZpbmUgQVQ5MV9NQl9SWF9OVU0JCTEyCisjZGVmaW5lIEFUOTFfTUJfVFhfU0hJRlQJMgorCisjZGVmaW5lIEFUOTFfTUJfUlhfRklSU1QJMAorI2RlZmluZSBBVDkxX01CX1JYX0xBU1QJCShBVDkxX01CX1JYX0ZJUlNUICsgQVQ5MV9NQl9SWF9OVU0gLSAxKQorCisjZGVmaW5lIEFUOTFfTUJfUlhfTUFTSyhpKQkoKDEgPDwgKGkpKSAtIDEpCisjZGVmaW5lIEFUOTFfTUJfUlhfU1BMSVQJOAorI2RlZmluZSBBVDkxX01CX1JYX0xPV19MQVNUCShBVDkxX01CX1JYX1NQTElUIC0gMSkKKyNkZWZpbmUgQVQ5MV9NQl9SWF9MT1dfTUFTSwkoQVQ5MV9NQl9SWF9NQVNLKEFUOTFfTUJfUlhfU1BMSVQpKQorCisjZGVmaW5lIEFUOTFfTUJfVFhfTlVNCQkoMSA8PCBBVDkxX01CX1RYX1NISUZUKQorI2RlZmluZSBBVDkxX01CX1RYX0ZJUlNUCShBVDkxX01CX1JYX0xBU1QgKyAxKQorI2RlZmluZSBBVDkxX01CX1RYX0xBU1QJCShBVDkxX01CX1RYX0ZJUlNUICsgQVQ5MV9NQl9UWF9OVU0gLSAxKQorCisjZGVmaW5lIEFUOTFfTkVYVF9QUklPX1NISUZUCShBVDkxX01CX1RYX1NISUZUKQorI2RlZmluZSBBVDkxX05FWFRfUFJJT19NQVNLCSgweGYgPDwgQVQ5MV9NQl9UWF9TSElGVCkKKyNkZWZpbmUgQVQ5MV9ORVhUX01CX01BU0sJKEFUOTFfTUJfVFhfTlVNIC0gMSkKKyNkZWZpbmUgQVQ5MV9ORVhUX01BU0sJCSgoQVQ5MV9NQl9UWF9OVU0gLSAxKSB8IEFUOTFfTkVYVF9QUklPX01BU0spCisKKy8qIENvbW1vbiByZWdpc3RlcnMgKi8KK2VudW0gYXQ5MV9yZWcgeworCUFUOTFfTVIJCT0gMHgwMDAsCisJQVQ5MV9JRVIJPSAweDAwNCwKKwlBVDkxX0lEUgk9IDB4MDA4LAorCUFUOTFfSU1SCT0gMHgwMEMsCisJQVQ5MV9TUgkJPSAweDAxMCwKKwlBVDkxX0JSCQk9IDB4MDE0LAorCUFUOTFfVElNCT0gMHgwMTgsCisJQVQ5MV9USU1FU1RQCT0gMHgwMUMsCisJQVQ5MV9FQ1IJPSAweDAyMCwKKwlBVDkxX1RDUgk9IDB4MDI0LAorCUFUOTFfQUNSCT0gMHgwMjgsCit9OworCisvKiBNYWlsYm94IHJlZ2lzdGVycyAoMCA8PSBpIDw9IDE1KSAqLworI2RlZmluZSBBVDkxX01NUihpKQkJKGVudW0gYXQ5MV9yZWcpKDB4MjAwICsgKChpKSAqIDB4MjApKQorI2RlZmluZSBBVDkxX01BTShpKQkJKGVudW0gYXQ5MV9yZWcpKDB4MjA0ICsgKChpKSAqIDB4MjApKQorI2RlZmluZSBBVDkxX01JRChpKQkJKGVudW0gYXQ5MV9yZWcpKDB4MjA4ICsgKChpKSAqIDB4MjApKQorI2RlZmluZSBBVDkxX01GSUQoaSkJCShlbnVtIGF0OTFfcmVnKSgweDIwQyArICgoaSkgKiAweDIwKSkKKyNkZWZpbmUgQVQ5MV9NU1IoaSkJCShlbnVtIGF0OTFfcmVnKSgweDIxMCArICgoaSkgKiAweDIwKSkKKyNkZWZpbmUgQVQ5MV9NREwoaSkJCShlbnVtIGF0OTFfcmVnKSgweDIxNCArICgoaSkgKiAweDIwKSkKKyNkZWZpbmUgQVQ5MV9NREgoaSkJCShlbnVtIGF0OTFfcmVnKSgweDIxOCArICgoaSkgKiAweDIwKSkKKyNkZWZpbmUgQVQ5MV9NQ1IoaSkJCShlbnVtIGF0OTFfcmVnKSgweDIxQyArICgoaSkgKiAweDIwKSkKKworLyogUmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBBVDkxX01SX0NBTkVOCQlCSVQoMCkKKyNkZWZpbmUgQVQ5MV9NUl9MUE0JCUJJVCgxKQorI2RlZmluZSBBVDkxX01SX0FCTQkJQklUKDIpCisjZGVmaW5lIEFUOTFfTVJfT1ZMCQlCSVQoMykKKyNkZWZpbmUgQVQ5MV9NUl9URU9GCQlCSVQoNCkKKyNkZWZpbmUgQVQ5MV9NUl9UVE0JCUJJVCg1KQorI2RlZmluZSBBVDkxX01SX1RJTUZSWgkJQklUKDYpCisjZGVmaW5lIEFUOTFfTVJfRFJQVAkJQklUKDcpCisKKyNkZWZpbmUgQVQ5MV9TUl9SQlNZCQlCSVQoMjkpCisKKyNkZWZpbmUgQVQ5MV9NTVJfUFJJT19TSElGVAkoMTYpCisKKyNkZWZpbmUgQVQ5MV9NSURfTUlERQkJQklUKDI5KQorCisjZGVmaW5lIEFUOTFfTVNSX01SVFIJCUJJVCgyMCkKKyNkZWZpbmUgQVQ5MV9NU1JfTUFCVAkJQklUKDIyKQorI2RlZmluZSBBVDkxX01TUl9NUkRZCQlCSVQoMjMpCisjZGVmaW5lIEFUOTFfTVNSX01NSQkJQklUKDI0KQorCisjZGVmaW5lIEFUOTFfTUNSX01SVFIJCUJJVCgyMCkKKyNkZWZpbmUgQVQ5MV9NQ1JfTVRDUgkJQklUKDIzKQorCisvKiBNYWlsYm94IE1vZGVzICovCitlbnVtIGF0OTFfbWJfbW9kZSB7CisJQVQ5MV9NQl9NT0RFX0RJU0FCTEVECT0gMCwKKwlBVDkxX01CX01PREVfUlgJCT0gMSwKKwlBVDkxX01CX01PREVfUlhfT1ZSV1IJPSAyLAorCUFUOTFfTUJfTU9ERV9UWAkJPSAzLAorCUFUOTFfTUJfTU9ERV9DT05TVU1FUgk9IDQsCisJQVQ5MV9NQl9NT0RFX1BST0RVQ0VSCT0gNSwKK307CisKKy8qIEludGVycnVwdCBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgQVQ5MV9JUlFfTUJfUlgJCSgoMSA8PCAoQVQ5MV9NQl9SWF9MQVNUICsgMSkpIFwKKwkJCQkgLSAoMSA8PCBBVDkxX01CX1JYX0ZJUlNUKSkKKyNkZWZpbmUgQVQ5MV9JUlFfTUJfVFgJCSgoMSA8PCAoQVQ5MV9NQl9UWF9MQVNUICsgMSkpIFwKKwkJCQkgLSAoMSA8PCBBVDkxX01CX1RYX0ZJUlNUKSkKKyNkZWZpbmUgQVQ5MV9JUlFfTUJfQUxMCQkoQVQ5MV9JUlFfTUJfUlggfCBBVDkxX0lSUV9NQl9UWCkKKworI2RlZmluZSBBVDkxX0lSUV9FUlJBCQkoMSA8PCAxNikKKyNkZWZpbmUgQVQ5MV9JUlFfV0FSTgkJKDEgPDwgMTcpCisjZGVmaW5lIEFUOTFfSVJRX0VSUlAJCSgxIDw8IDE4KQorI2RlZmluZSBBVDkxX0lSUV9CT0ZGCQkoMSA8PCAxOSkKKyNkZWZpbmUgQVQ5MV9JUlFfU0xFRVAJCSgxIDw8IDIwKQorI2RlZmluZSBBVDkxX0lSUV9XQUtFVVAJCSgxIDw8IDIxKQorI2RlZmluZSBBVDkxX0lSUV9UT1ZGCQkoMSA8PCAyMikKKyNkZWZpbmUgQVQ5MV9JUlFfVFNUUAkJKDEgPDwgMjMpCisjZGVmaW5lIEFUOTFfSVJRX0NFUlIJCSgxIDw8IDI0KQorI2RlZmluZSBBVDkxX0lSUV9TRVJSCQkoMSA8PCAyNSkKKyNkZWZpbmUgQVQ5MV9JUlFfQUVSUgkJKDEgPDwgMjYpCisjZGVmaW5lIEFUOTFfSVJRX0ZFUlIJCSgxIDw8IDI3KQorI2RlZmluZSBBVDkxX0lSUV9CRVJSCQkoMSA8PCAyOCkKKworI2RlZmluZSBBVDkxX0lSUV9FUlJfQUxMCSgweDFmZmYwMDAwKQorI2RlZmluZSBBVDkxX0lSUV9FUlJfRlJBTUUJKEFUOTFfSVJRX0NFUlIgfCBBVDkxX0lSUV9TRVJSIHwgXAorCQkJCSBBVDkxX0lSUV9BRVJSIHwgQVQ5MV9JUlFfRkVSUiB8IEFUOTFfSVJRX0JFUlIpCisjZGVmaW5lIEFUOTFfSVJRX0VSUl9MSU5FCShBVDkxX0lSUV9FUlJBIHwgQVQ5MV9JUlFfV0FSTiB8IFwKKwkJCQkgQVQ5MV9JUlFfRVJSUCB8IEFUOTFfSVJRX0JPRkYpCisKKyNkZWZpbmUgQVQ5MV9JUlFfQUxMCQkoMHgxZmZmZmZmZikKKworc3RydWN0IGF0OTFfcHJpdiB7CisJc3RydWN0IGNhbl9wcml2CQljYW47CSAgIC8qIG11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciEgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCXN0cnVjdCBuYXBpX3N0cnVjdAluYXBpOworCisJdm9pZCBfX2lvbWVtCQkqcmVnX2Jhc2U7CisKKwl1MzIJCQlyZWdfc3I7CisJdW5zaWduZWQgaW50CQl0eF9uZXh0OworCXVuc2lnbmVkIGludAkJdHhfZWNobzsKKwl1bnNpZ25lZCBpbnQJCXJ4X25leHQ7CisKKwlzdHJ1Y3QgY2xrCQkqY2xrOworCXN0cnVjdCBhdDkxX2Nhbl9kYXRhCSpwZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCBhdDkxX2JpdHRpbWluZ19jb25zdCA9IHsKKwkudHNlZzFfbWluCT0gNCwKKwkudHNlZzFfbWF4CT0gMTYsCisJLnRzZWcyX21pbgk9IDIsCisJLnRzZWcyX21heAk9IDgsCisJLnNqd19tYXgJPSA0LAorCS5icnBfbWluIAk9IDIsCisJLmJycF9tYXgJPSAxMjgsCisJLmJycF9pbmMJPSAxLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3R4X25leHRfbWIoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gKHByaXYtPnR4X25leHQgJiBBVDkxX05FWFRfTUJfTUFTSykgKyBBVDkxX01CX1RYX0ZJUlNUOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfdHhfbmV4dF9wcmlvKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCit7CisJcmV0dXJuIChwcml2LT50eF9uZXh0ID4+IEFUOTFfTkVYVF9QUklPX1NISUZUKSAmIDB4ZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3R4X2VjaG9fbWIoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gKHByaXYtPnR4X2VjaG8gJiBBVDkxX05FWFRfTUJfTUFTSykgKyBBVDkxX01CX1RYX0ZJUlNUOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBhdDkxX3JlYWQoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdiwgZW51bSBhdDkxX3JlZyByZWcpCit7CisJcmV0dXJuIHJlYWRsKHByaXYtPnJlZ19iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0OTFfd3JpdGUoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdiwgZW51bSBhdDkxX3JlZyByZWcsCisJCXUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIHByaXYtPnJlZ19iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9tYl9tb2RlX3ByaW8oY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdiwKKwkJdW5zaWduZWQgaW50IG1iLCBlbnVtIGF0OTFfbWJfbW9kZSBtb2RlLCBpbnQgcHJpbykKK3sKKwlhdDkxX3dyaXRlKHByaXYsIEFUOTFfTU1SKG1iKSwgKG1vZGUgPDwgMjQpIHwgKHByaW8gPDwgMTYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9tYl9tb2RlKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBtYiwKKwkJZW51bSBhdDkxX21iX21vZGUgbW9kZSkKK3sKKwlzZXRfbWJfbW9kZV9wcmlvKHByaXYsIG1iLCBtb2RlLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICphbGxvY19jYW5fc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBjYW5fZnJhbWUgKipjZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIHNpemVvZihzdHJ1Y3QgY2FuX2ZyYW1lKSk7CisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DQU4pOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJKmNmID0gKHN0cnVjdCBjYW5fZnJhbWUgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBjYW5fZnJhbWUpKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2NfY2FuX2Vycl9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGNhbl9mcmFtZSAqKmNmKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19jYW5fc2tiKGRldiwgY2YpOworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoKmNmLCAwLCBzaXplb2Yoc3RydWN0IGNhbl9mcmFtZSkpOworCSgqY2YpLT5jYW5faWQgPSBDQU5fRVJSX0ZMQUc7CisJKCpjZiktPmNhbl9kbGMgPSBDQU5fRVJSX0RMQzsKKworCXJldHVybiBza2I7Cit9CisKKy8qCisgKiBTd3RpY2ggdHJhbnNjZWl2ZXIgb24gb3Igb2ZmCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfdHJhbnNjZWl2ZXJfc3dpdGNoKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYsIGludCBvbikKK3sKKwlpZiAocHJpdi0+cGRhdGEgJiYgcHJpdi0+cGRhdGEtPnRyYW5zY2VpdmVyX3N3aXRjaCkKKwkJcHJpdi0+cGRhdGEtPnRyYW5zY2VpdmVyX3N3aXRjaChvbik7Cit9CisKK3N0YXRpYyB2b2lkIGF0OTFfc2V0dXBfbWFpbGJveGVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0OTFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKgorCSAqIFRoZSBmaXJzdCAxMiBtYWlsYm94ZXMgYXJlIHVzZWQgYXMgYSByZWNlcHRpb24gRklGTy4gVGhlCisJICogbGFzdCBtYWlsYm94IGlzIGNvbmZpZ3VyZWQgd2l0aCBvdmVyd3JpdGUgb3B0aW9uLiBUaGUKKwkgKiBvdmVyd3JpdGUgZmxhZyBpbmRpY2F0ZXMgYSBGSUZPIG92ZXJmbG93LgorCSAqLworCWZvciAoaSA9IEFUOTFfTUJfUlhfRklSU1Q7IGkgPCBBVDkxX01CX1JYX0xBU1Q7IGkrKykKKwkJc2V0X21iX21vZGUocHJpdiwgaSwgQVQ5MV9NQl9NT0RFX1JYKTsKKwlzZXRfbWJfbW9kZShwcml2LCBBVDkxX01CX1JYX0xBU1QsIEFUOTFfTUJfTU9ERV9SWF9PVlJXUik7CisKKwkvKiBUaGUgbGFzdCA0IG1haWxib3hlcyBhcmUgdXNlZCBmb3IgdHJhbnNtaXR0aW5nLiAqLworCWZvciAoaSA9IEFUOTFfTUJfVFhfRklSU1Q7IGkgPD0gQVQ5MV9NQl9UWF9MQVNUOyBpKyspCisJCXNldF9tYl9tb2RlX3ByaW8ocHJpdiwgaSwgQVQ5MV9NQl9NT0RFX1RYLCAwKTsKKworCS8qIFJlc2V0IHR4IGFuZCByeCBoZWxwZXIgcG9pbnRlcnMgKi8KKwlwcml2LT50eF9uZXh0ID0gcHJpdi0+dHhfZWNobyA9IHByaXYtPnJ4X25leHQgPSAwOworfQorCitzdGF0aWMgaW50IGF0OTFfc2V0X2JpdHRpbWluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHN0cnVjdCBjYW5fYml0dGltaW5nICpidCA9ICZwcml2LT5jYW4uYml0dGltaW5nOworCXUzMiByZWdfYnI7CisKKwlyZWdfYnIgPSAoKHByaXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV8zX1NBTVBMRVMpIDw8IDI0KSB8CisJCSgoYnQtPmJycCAtIDEpIDw8IDE2KSB8CSgoYnQtPnNqdyAtIDEpIDw8IDEyKSB8CisJCSgoYnQtPnByb3Bfc2VnIC0gMSkgPDwgOCkgfCAoKGJ0LT5waGFzZV9zZWcxIC0gMSkgPDwgNCkgfAorCQkoKGJ0LT5waGFzZV9zZWcyIC0gMSkgPDwgMCk7CisKKwlkZXZfaW5mbyhkZXYtPmRldi5wYXJlbnQsICJ3cml0aW5nIEFUOTFfQlI6IDB4JTA4eFxuIiwgcmVnX2JyKTsKKworCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9CUiwgcmVnX2JyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdDkxX2NoaXBfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgcmVnX21yLCByZWdfaWVyOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJYXQ5MV93cml0ZShwcml2LCBBVDkxX0lEUiwgQVQ5MV9JUlFfQUxMKTsKKworCS8qIGRpc2FibGUgY2hpcCAqLworCXJlZ19tciA9IGF0OTFfcmVhZChwcml2LCBBVDkxX01SKTsKKwlhdDkxX3dyaXRlKHByaXYsIEFUOTFfTVIsIHJlZ19tciAmIH5BVDkxX01SX0NBTkVOKTsKKworCWF0OTFfc2V0dXBfbWFpbGJveGVzKGRldik7CisJYXQ5MV90cmFuc2NlaXZlcl9zd2l0Y2gocHJpdiwgMSk7CisKKwkvKiBlbmFibGUgY2hpcCAqLworCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9NUiwgQVQ5MV9NUl9DQU5FTik7CisKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlyZWdfaWVyID0gQVQ5MV9JUlFfTUJfUlggfCBBVDkxX0lSUV9FUlJQIHwgQVQ5MV9JUlFfRVJSX0ZSQU1FOworCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9JRFIsIEFUOTFfSVJRX0FMTCk7CisJYXQ5MV93cml0ZShwcml2LCBBVDkxX0lFUiwgcmVnX2llcik7Cit9CisKK3N0YXRpYyB2b2lkIGF0OTFfY2hpcF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGVudW0gY2FuX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCBhdDkxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiByZWdfbXI7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlhdDkxX3dyaXRlKHByaXYsIEFUOTFfSURSLCBBVDkxX0lSUV9BTEwpOworCisJcmVnX21yID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfTVIpOworCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9NUiwgcmVnX21yICYgfkFUOTFfTVJfQ0FORU4pOworCisJYXQ5MV90cmFuc2NlaXZlcl9zd2l0Y2gocHJpdiwgMCk7CisJcHJpdi0+Y2FuLnN0YXRlID0gc3RhdGU7Cit9CisKKy8qCisgKiB0aGVvcnkgb2Ygb3BlcmF0aW9uOgorICoKKyAqIEFjY29yZGluZyB0byB0aGUgZGF0YXNoZWV0IHByaW9yaXR5IDAgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIDE1CisgKiBpcyB0aGUgbG93ZXN0LiBJZiB0d28gbWFpbGJveGVzIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgdGhlCisgKiBtZXNzYWdlIG9mIHRoZSBtYWlsYm94IHdpdGggdGhlIGxvd2VzdCBudW1iZXIgaXMgc2VudCBmaXJzdC4KKyAqCisgKiBXZSB1c2UgdGhlIGZpcnN0IFRYIG1haWxib3ggKEFUOTFfTUJfVFhfRklSU1QpIHdpdGggcHJpbyAwLCB0aGVuCisgKiB0aGUgbmV4dCBtYWlsYm94IHdpdGggcHJpbyAwLCBhbmQgc28gb24sIHVudGlsIGFsbCBtYWlsYm94ZXMgYXJlCisgKiB1c2VkLiBUaGVuIHdlIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyB3aXRoIG1haWxib3gKKyAqIEFUOTFfTUJfVFhfRklSU1QsIGJ1dCB3aXRoIHByaW8gMSwgbWFpbGJveCBBVDkxX01CX1RYX0ZJUlNUICsgMQorICogcHJpbyAxLiBXaGVuIHdlIHJlYWNoIHRoZSBsYXN0IG1haWxib3ggd2l0aCBwcmlvIDE1LCB3ZSBoYXZlIHRvCisgKiBzdG9wIHNlbmRpbmcsIHdhaXRpbmcgZm9yIGFsbCBtZXNzYWdlcyB0byBiZSBkZWxpdmVyZWQsIHRoZW4gc3RhcnQKKyAqIGFnYWluIHdpdGggbWFpbGJveCBBVDkxX01CX1RYX0ZJUlNUIHByaW8gMC4KKyAqCisgKiBXZSB1c2UgdGhlIHByaXYtPnR4X25leHQgYXMgY291bnRlciBmb3IgdGhlIG5leHQgdHJhbnNtaXNzaW9uCisgKiBtYWlsYm94LCBidXQgd2l0aG91dCB0aGUgb2Zmc2V0IEFUOTFfTUJfVFhfRklSU1QuIFRoZSBsb3dlciBiaXRzCisgKiBlbmNvZGUgdGhlIG1haWxib3ggbnVtYmVyLCB0aGUgdXBwZXIgNCBiaXRzIHRoZSBtYWlsYm94IHByaW9yaXR5OgorICoKKyAqIHByaXYtPnR4X25leHQgPSAocHJpbyA8PCBBVDkxX05FWFRfUFJJT19TSElGVCkgfHwKKyAqICAgICAgICAgICAgICAgICAobWIgLSBBVDkxX01CX1RYX0ZJUlNUKTsKKyAqCisgKi8KK3N0YXRpYyBuZXRkZXZfdHhfdCBhdDkxX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZiA9IChzdHJ1Y3QgY2FuX2ZyYW1lICopc2tiLT5kYXRhOworCXVuc2lnbmVkIGludCBtYiwgcHJpbzsKKwl1MzIgcmVnX21pZCwgcmVnX21jcjsKKworCW1iID0gZ2V0X3R4X25leHRfbWIocHJpdik7CisJcHJpbyA9IGdldF90eF9uZXh0X3ByaW8ocHJpdik7CisKKwlpZiAodW5saWtlbHkoIShhdDkxX3JlYWQocHJpdiwgQVQ5MV9NU1IobWIpKSAmIEFUOTFfTVNSX01SRFkpKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJZGV2X2VycihkZXYtPmRldi5wYXJlbnQsCisJCQkiQlVHISBUWCBidWZmZXIgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIik7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlpZiAoY2YtPmNhbl9pZCAmIENBTl9FRkZfRkxBRykKKwkJcmVnX21pZCA9IChjZi0+Y2FuX2lkICYgQ0FOX0VGRl9NQVNLKSB8IEFUOTFfTUlEX01JREU7CisJZWxzZQorCQlyZWdfbWlkID0gKGNmLT5jYW5faWQgJiBDQU5fU0ZGX01BU0spIDw8IDE4OworCisJcmVnX21jciA9ICgoY2YtPmNhbl9pZCAmIENBTl9SVFJfRkxBRykgPyBBVDkxX01DUl9NUlRSIDogMCkgfAorCQkoY2YtPmNhbl9kbGMgPDwgMTYpIHwgQVQ5MV9NQ1JfTVRDUjsKKworCS8qIGRpc2FibGUgTUIgd2hpbGUgd3JpdGluZyBJRCAoc2VlIGRhdGFzaGVldCkgKi8KKwlzZXRfbWJfbW9kZShwcml2LCBtYiwgQVQ5MV9NQl9NT0RFX0RJU0FCTEVEKTsKKwlhdDkxX3dyaXRlKHByaXYsIEFUOTFfTUlEKG1iKSwgcmVnX21pZCk7CisJc2V0X21iX21vZGVfcHJpbyhwcml2LCBtYiwgQVQ5MV9NQl9NT0RFX1RYLCBwcmlvKTsKKworCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9NREwobWIpLCAqKHUzMiAqKShjZi0+ZGF0YSArIDApKTsKKwlhdDkxX3dyaXRlKHByaXYsIEFUOTFfTURIKG1iKSwgKih1MzIgKikoY2YtPmRhdGEgKyA0KSk7CisKKwkvKiBUaGlzIHRyaWdnZXJzIHRyYW5zbWlzc2lvbiAqLworCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9NQ1IobWIpLCByZWdfbWNyKTsKKworCXN0YXRzLT50eF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIF9OT1RFXzogc3Vic3RyYWN0IEFUOTFfTUJfVFhfRklSU1Qgb2Zmc2V0IGZyb20gbWIhICovCisJY2FuX3B1dF9lY2hvX3NrYihza2IsIGRldiwgbWIgLSBBVDkxX01CX1RYX0ZJUlNUKTsKKworCS8qCisJICogd2UgaGF2ZSB0byBzdG9wIHRoZSBxdWV1ZSBhbmQgZGVsaXZlciBhbGwgbWVzc2FnZXMgaW4gY2FzZQorCSAqIG9mIGEgcHJpbyttYiBjb3VudGVyIHdyYXAgYXJvdW5kLiBUaGlzIGlzIHRoZSBjYXNlIGlmCisJICogdHhfbmV4dCBidWZmZXIgcHJpbyBhbmQgbWFpbGJveCBlcXVhbHMgMC4KKwkgKgorCSAqIGFsc28gc3RvcCB0aGUgcXVldWUgaWYgbmV4dCBidWZmZXIgaXMgc3RpbGwgaW4gdXNlCisJICogKD09IG5vdCByZWFkeSkKKwkgKi8KKwlwcml2LT50eF9uZXh0Kys7CisJaWYgKCEoYXQ5MV9yZWFkKHByaXYsIEFUOTFfTVNSKGdldF90eF9uZXh0X21iKHByaXYpKSkgJgorCSAgICAgIEFUOTFfTVNSX01SRFkpIHx8CisJICAgIChwcml2LT50eF9uZXh0ICYgQVQ5MV9ORVhUX01BU0spID09IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIHRoaXMgbWFpbGJveCAqLworCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9JRVIsIDEgPDwgbWIpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworLyoqCisgKiBhdDkxX2FjdGl2YXRlX3J4X2xvdyAtIGFjdGl2YXRlIGxvd2VyIHJ4IG1haWxib3hlcworICogQHByaXY6IGE5MSBjb250ZXh0CisgKgorICogUmVlbmFibGVzIHRoZSBsb3dlciBtYWlsYm94ZXMgZm9yIHJlY2VwdGlvbiBvZiBuZXcgQ0FOIG1lc3NhZ2VzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdDkxX2FjdGl2YXRlX3J4X2xvdyhjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQoreworCXUzMiBtYXNrID0gQVQ5MV9NQl9SWF9MT1dfTUFTSzsKKwlhdDkxX3dyaXRlKHByaXYsIEFUOTFfVENSLCBtYXNrKTsKK30KKworLyoqCisgKiBhdDkxX2FjdGl2YXRlX3J4X21iIC0gcmVhY3RpdmUgc2luZ2xlIHJ4IG1haWxib3gKKyAqIEBwcml2OiBhOTEgY29udGV4dAorICogQG1iOiBtYWlsYm94IHRvIHJlYWN0aXZhdGUKKyAqCisgKiBSZWVuYWJsZXMgZ2l2ZW4gbWFpbGJveCBmb3IgcmVjZXB0aW9uIG9mIG5ldyBDQU4gbWVzc2FnZXMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0OTFfYWN0aXZhdGVfcnhfbWIoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdiwKKwkJdW5zaWduZWQgaW50IG1iKQoreworCXUzMiBtYXNrID0gMSA8PCBtYjsKKwlhdDkxX3dyaXRlKHByaXYsIEFUOTFfVENSLCBtYXNrKTsKK30KKworLyoqCisgKiBhdDkxX3J4X292ZXJmbG93X2VyciAtIHNlbmQgZXJyb3IgZnJhbWUgZHVlIHRvIHJ4IG92ZXJmbG93CisgKiBAZGV2OiBuZXQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfcnhfb3ZlcmZsb3dfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKKworCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiUlggYnVmZmVyIG92ZXJmbG93XG4iKTsKKwlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMrKzsKKwlzdGF0cy0+cnhfZXJyb3JzKys7CisKKwlza2IgPSBhbGxvY19jYW5fZXJyX3NrYihkZXYsICZjZik7CisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm47CisKKwljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQ1JUTDsKKwljZi0+ZGF0YVsxXSA9IENBTl9FUlJfQ1JUTF9SWF9PVkVSRkxPVzsKKwluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gY2YtPmNhbl9kbGM7Cit9CisKKy8qKgorICogYXQ5MV9yZWFkX21iIC0gcmVhZCBDQU4gbXNnIGZyb20gbWFpbGJveCAobG93bGV2ZWwgaW1wbCkKKyAqIEBkZXY6IG5ldCBkZXZpY2UKKyAqIEBtYjogbWFpbGJveCBudW1iZXIgdG8gcmVhZCBmcm9tCisgKiBAY2Y6IGNhbiBmcmFtZSB3aGVyZSB0byBzdG9yZSBtZXNzYWdlCisgKgorICogUmVhZHMgYSBDQU4gbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBtYWlsYm94IGFuZCBzdG9yZXMgZGF0YSBpbnRvCisgKiBnaXZlbiBjYW4gZnJhbWUuICJtYiIgYW5kICJjZiIgbXVzdCBiZSB2YWxpZC4KKyAqLworc3RhdGljIHZvaWQgYXQ5MV9yZWFkX21iKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBtYiwKKwkJc3RydWN0IGNhbl9mcmFtZSAqY2YpCit7CisJY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJlZ19tc3IsIHJlZ19taWQ7CisKKwlyZWdfbWlkID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfTUlEKG1iKSk7CisJaWYgKHJlZ19taWQgJiBBVDkxX01JRF9NSURFKQorCQljZi0+Y2FuX2lkID0gKChyZWdfbWlkID4+IDApICYgQ0FOX0VGRl9NQVNLKSB8IENBTl9FRkZfRkxBRzsKKwllbHNlCisJCWNmLT5jYW5faWQgPSAocmVnX21pZCA+PiAxOCkgJiBDQU5fU0ZGX01BU0s7CisKKwlyZWdfbXNyID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfTVNSKG1iKSk7CisJaWYgKHJlZ19tc3IgJiBBVDkxX01TUl9NUlRSKQorCQljZi0+Y2FuX2lkIHw9IENBTl9SVFJfRkxBRzsKKwljZi0+Y2FuX2RsYyA9IG1pbl90KF9fdTgsIChyZWdfbXNyID4+IDE2KSAmIDB4ZiwgOCk7CisKKwkqKHUzMiAqKShjZi0+ZGF0YSArIDApID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfTURMKG1iKSk7CisJKih1MzIgKikoY2YtPmRhdGEgKyA0KSA9IGF0OTFfcmVhZChwcml2LCBBVDkxX01ESChtYikpOworCisJaWYgKHVubGlrZWx5KG1iID09IEFUOTFfTUJfUlhfTEFTVCAmJiByZWdfbXNyICYgQVQ5MV9NU1JfTU1JKSkKKwkJYXQ5MV9yeF9vdmVyZmxvd19lcnIoZGV2KTsKK30KKworLyoqCisgKiBhdDkxX3JlYWRfbXNnIC0gcmVhZCBDQU4gbWVzc2FnZSBmcm9tIG1haWxib3gKKyAqIEBkZXY6IG5ldCBkZXZpY2UKKyAqIEBtYjogbWFpbCBib3ggdG8gcmVhZCBmcm9tCisgKgorICogUmVhZHMgYSBDQU4gbWVzc2FnZSBmcm9tIGdpdmVuIG1haWxib3gsIGFuZCBwdXQgaW50byBsaW51eCBuZXR3b3JrCisgKiBSWCBxdWV1ZSwgZG9lcyBhbGwgaG91c2VrZWVwaW5nIGNob3JlcyAoc3RhdHMsIC4uLikKKyAqLworc3RhdGljIHZvaWQgYXQ5MV9yZWFkX21zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbWIpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGFsbG9jX2Nhbl9za2IoZGV2LCAmY2YpOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJYXQ5MV9yZWFkX21iKGRldiwgbWIsIGNmKTsKKwluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gY2YtPmNhbl9kbGM7Cit9CisKKy8qKgorICogYXQ5MV9wb2xsX3J4IC0gcmVhZCBtdWx0aXBsZSBDQU4gbWVzc2FnZXMgZnJvbSBtYWlsYm94ZXMKKyAqIEBkZXY6IG5ldCBkZXZpY2UKKyAqIEBxdW90YTogbWF4IG51bWJlciBvZiBwa2dzIHdlJ3JlIGFsbG93ZWQgdG8gcmVjZWl2ZQorICoKKyAqIFRoZW9yeSBvZiBPcGVyYXRpb246CisgKgorICogMTIgb2YgdGhlIDE2IG1haWxib3hlcyBvbiB0aGUgY2hpcCBhcmUgcmVzZXJ2ZWQgZm9yIFJYLiB3ZSBzcGxpdAorICogdGhlbSBpbnRvIDIgZ3JvdXBzLiBUaGUgbG93ZXIgZ3JvdXAgaG9sZHMgOCBhbmQgdXBwZXIgNCBtYWlsYm94ZXMuCisgKgorICogTGlrZSBpdCBvciBub3QsIGJ1dCB0aGUgY2hpcCBhbHdheXMgc2F2ZXMgYSByZWNlaXZlZCBDQU4gbWVzc2FnZQorICogaW50byB0aGUgZmlyc3QgZnJlZSBtYWlsYm94IGl0IGZpbmRzIChzdGFydGluZyB3aXRoIHRoZQorICogbG93ZXN0KS4gVGhpcyBtYWtlcyBpdCB2ZXJ5IGRpZmZpY3VsdCB0byByZWFkIHRoZSBtZXNzYWdlcyBpbiB0aGUKKyAqIHJpZ2h0IG9yZGVyIGZyb20gdGhlIGNoaXAuIFRoaXMgaXMgaG93IHdlIHdvcmsgYXJvdW5kIHRoYXQgcHJvYmxlbToKKyAqCisgKiBUaGUgZmlyc3QgbWVzc2FnZSBnb2VzIGludG8gbWIgbnIuIDAgYW5kIGlzc3VlcyBhbiBpbnRlcnJ1cHQuIEFsbAorICogcnggaW50cyBhcmUgZGlzYWJsZWQgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIGFuZCBhIG5hcGkgcG9sbCBpcworICogc2NoZWR1bGVkLiBXZSByZWFkIHRoZSBtYWlsYm94LCBidXQgZG8gX25vdF8gcmVlbmFibGUgdGhlIG1iICh0bworICogcmVjZWl2ZSBhbm90aGVyIG1lc3NhZ2UpLgorICoKKyAqICAgIGxvd2VyIG1ieHMgICAgICB1cHBlcgorICogICBfX19fX19eX19fX19fICAgIF9fXl9fCisgKiAgLyAgICAgICAgICAgICBcICAvICAgICBcCisgKiArLSstKy0rLSstKy0rLSstKystKy0rLSstKworICogfHh8eHx4fHh8eHx4fHh8eHx8IHwgfCB8IHwKKyAqICstKy0rLSstKy0rLSstKy0rKy0rLSstKy0rCisgKiAgMCAwIDAgMCAwIDAgIDAgMCAwIDAgMSAxICBcIG1haWwKKyAqICAwIDEgMiAzIDQgNSAgNiA3IDggOSAwIDEgIC8gYm94CisgKgorICogVGhlIHZhcmlhYmxlIHByaXYtPnJ4X25leHQgcG9pbnRzIHRvIHRoZSBuZXh0IG1haWxib3ggdG8gcmVhZCBhCisgKiBtZXNzYWdlIGZyb20uIEFzIGxvbmcgd2UncmUgaW4gdGhlIGxvd2VyIG1haWxib3hlcyB3ZSBqdXN0IHJlYWQgdGhlCisgKiBtYWlsYm94IGJ1dCBub3QgcmVlbmFibGUgaXQuCisgKgorICogV2l0aCBjb21wbGV0aW9uIG9mIHRoZSBsYXN0IG9mIHRoZSBsb3dlciBtYWlsYm94ZXMsIHdlIHJlZW5hYmxlIHRoZQorICogd2hvbGUgZmlyc3QgZ3JvdXAsIGJ1dCBjb250aW51ZSB0byBsb29rIGZvciBmaWxsZWQgbWFpbGJveGVzIGluIHRoZQorICogdXBwZXIgbWFpbGJveGVzLiBJbWFnaW5lIHRoZSBzZWNvbmQgZ3JvdXAgbGlrZSBvdmVyZmxvdyBtYWlsYm94ZXMsCisgKiB3aGljaCB0YWtlcyBDQU4gbWVzc2FnZXMgaWYgdGhlIGxvd2VyIGdvdXAgaXMgZnVsbC4gV2hpbGUgaW4gdGhlCisgKiB1cHBlciBncm91cCB3ZSByZWVuYWJsZSB0aGUgbWFpbGJveCByaWdodCBhZnRlciByZWFkaW5nIGl0LiBHaXZpbmcKKyAqIHRoZSBjaGlwIG1vcmUgcm9vbSB0byBzdG9yZSBtZXNzYWdlcy4KKyAqCisgKiBBZnRlciBmaW5pc2hpbmcgd2UgbG9vayBhZ2FpbiBpbiB0aGUgbG93ZXIgZ3JvdXAgaWYgd2UndmUgc3RpbGwKKyAqIHF1b3RhLgorICoKKyAqLworc3RhdGljIGludCBhdDkxX3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1b3RhKQoreworCXN0cnVjdCBhdDkxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiByZWdfc3IgPSBhdDkxX3JlYWQocHJpdiwgQVQ5MV9TUik7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciA9ICh1bnNpZ25lZCBsb25nICopJnJlZ19zcjsKKwl1bnNpZ25lZCBpbnQgbWI7CisJaW50IHJlY2VpdmVkID0gMDsKKworCWlmIChwcml2LT5yeF9uZXh0ID4gQVQ5MV9NQl9SWF9MT1dfTEFTVCAmJgorCSAgICByZWdfc3IgJiBBVDkxX01CX1JYX0xPV19NQVNLKQorCQlkZXZfaW5mbyhkZXYtPmRldi5wYXJlbnQsCisJCQkgIm9yZGVyIG9mIGluY29taW5nIGZyYW1lcyBjYW5ub3QgYmUgZ3VhcmFudGVlZFxuIik7CisKKyBhZ2FpbjoKKwlmb3IgKG1iID0gZmluZF9uZXh0X2JpdChhZGRyLCBBVDkxX01CX1JYX05VTSwgcHJpdi0+cnhfbmV4dCk7CisJICAgICBtYiA8IEFUOTFfTUJfUlhfTlVNICYmIHF1b3RhID4gMDsKKwkgICAgIHJlZ19zciA9IGF0OTFfcmVhZChwcml2LCBBVDkxX1NSKSwKKwkgICAgIG1iID0gZmluZF9uZXh0X2JpdChhZGRyLCBBVDkxX01CX1JYX05VTSwgKytwcml2LT5yeF9uZXh0KSkgeworCQlhdDkxX3JlYWRfbXNnKGRldiwgbWIpOworCisJCS8qIHJlYWN0aXZhdGUgbWFpbGJveGVzICovCisJCWlmIChtYiA9PSBBVDkxX01CX1JYX0xPV19MQVNUKQorCQkJLyogYWxsIGxvd2VyIG1haWxib3hlZCwgaWYganVzdCBmaW5pc2hlZCBpdCAqLworCQkJYXQ5MV9hY3RpdmF0ZV9yeF9sb3cocHJpdik7CisJCWVsc2UgaWYgKG1iID4gQVQ5MV9NQl9SWF9MT1dfTEFTVCkKKwkJCS8qIG9ubHkgdGhlIG1haWxib3ggd2UgcmVhZCAqLworCQkJYXQ5MV9hY3RpdmF0ZV9yeF9tYihwcml2LCBtYik7CisKKwkJcmVjZWl2ZWQrKzsKKwkJcXVvdGEtLTsKKwl9CisKKwkvKiB1cHBlciBncm91cCBjb21wbGV0ZWQsIGxvb2sgYWdhaW4gaW4gbG93ZXIgKi8KKwlpZiAocHJpdi0+cnhfbmV4dCA+IEFUOTFfTUJfUlhfTE9XX0xBU1QgJiYKKwkgICAgcXVvdGEgPiAwICYmIG1iID49IEFUOTFfTUJfUlhfTlVNKSB7CisJCXByaXYtPnJ4X25leHQgPSAwOworCQlnb3RvIGFnYWluOworCX0KKworCXJldHVybiByZWNlaXZlZDsKK30KKworc3RhdGljIHZvaWQgYXQ5MV9wb2xsX2Vycl9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgY2FuX2ZyYW1lICpjZiwgdTMyIHJlZ19zcikKK3sKKwlzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIENSQyBlcnJvciAqLworCWlmIChyZWdfc3IgJiBBVDkxX0lSUV9DRVJSKSB7CisJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiQ0VSUiBpcnFcbiIpOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlwcml2LT5jYW4uY2FuX3N0YXRzLmJ1c19lcnJvcisrOworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVCB8IENBTl9FUlJfQlVTRVJST1I7CisJfQorCisJLyogU3R1ZmZpbmcgRXJyb3IgKi8KKwlpZiAocmVnX3NyICYgQVQ5MV9JUlFfU0VSUikgeworCQlkZXZfZGJnKGRldi0+ZGV2LnBhcmVudCwgIlNFUlIgaXJxXG4iKTsKKwkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcHJpdi0+Y2FuLmNhbl9zdGF0cy5idXNfZXJyb3IrKzsKKwkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1QgfCBDQU5fRVJSX0JVU0VSUk9SOworCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfU1RVRkY7CisJfQorCisJLyogQWNrbm93bGVkZ2VtZW50IEVycm9yICovCisJaWYgKHJlZ19zciAmIEFUOTFfSVJRX0FFUlIpIHsKKwkJZGV2X2RiZyhkZXYtPmRldi5wYXJlbnQsICJBRVJSIGlycVxuIik7CisJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9BQ0s7CisJfQorCisJLyogRm9ybSBlcnJvciAqLworCWlmIChyZWdfc3IgJiBBVDkxX0lSUV9GRVJSKSB7CisJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiRkVSUiBpcnFcbiIpOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlwcml2LT5jYW4uY2FuX3N0YXRzLmJ1c19lcnJvcisrOworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVCB8IENBTl9FUlJfQlVTRVJST1I7CisJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9GT1JNOworCX0KKworCS8qIEJpdCBFcnJvciAqLworCWlmIChyZWdfc3IgJiBBVDkxX0lSUV9CRVJSKSB7CisJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiQkVSUiBpcnFcbiIpOworCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlwcml2LT5jYW4uY2FuX3N0YXRzLmJ1c19lcnJvcisrOworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVCB8IENBTl9FUlJfQlVTRVJST1I7CisJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9CSVQ7CisJfQorfQorCitzdGF0aWMgaW50IGF0OTFfcG9sbF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1b3RhLCB1MzIgcmVnX3NyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisKKwlpZiAocXVvdGEgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlza2IgPSBhbGxvY19jYW5fZXJyX3NrYihkZXYsICZjZik7CisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm4gMDsKKworCWF0OTFfcG9sbF9lcnJfZnJhbWUoZGV2LCBjZiwgcmVnX3NyKTsKKwluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGNmLT5jYW5fZGxjOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IHF1b3RhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuYXBpLT5kZXY7CisJY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJlZ19zciA9IGF0OTFfcmVhZChwcml2LCBBVDkxX1NSKTsKKwlpbnQgd29ya19kb25lID0gMDsKKworCWlmIChyZWdfc3IgJiBBVDkxX0lSUV9NQl9SWCkKKwkJd29ya19kb25lICs9IGF0OTFfcG9sbF9yeChkZXYsIHF1b3RhIC0gd29ya19kb25lKTsKKworCS8qCisJICogVGhlIGVycm9yIGJpdHMgYXJlIGNsZWFyIG9uIHJlYWQsCisJICogc28gdXNlIHNhdmVkIHZhbHVlIGZyb20gaXJxIGhhbmRsZXIuCisJICovCisJcmVnX3NyIHw9IHByaXYtPnJlZ19zcjsKKwlpZiAocmVnX3NyICYgQVQ5MV9JUlFfRVJSX0ZSQU1FKQorCQl3b3JrX2RvbmUgKz0gYXQ5MV9wb2xsX2VycihkZXYsIHF1b3RhIC0gd29ya19kb25lLCByZWdfc3IpOworCisJaWYgKHdvcmtfZG9uZSA8IHF1b3RhKSB7CisJCS8qIGVuYWJsZSBJUlFzIGZvciBmcmFtZSBlcnJvcnMgYW5kIGFsbCBtYWlsYm94ZXMgPj0gcnhfbmV4dCAqLworCQl1MzIgcmVnX2llciA9IEFUOTFfSVJRX0VSUl9GUkFNRTsKKwkJcmVnX2llciB8PSBBVDkxX0lSUV9NQl9SWCAmIH5BVDkxX01CX1JYX01BU0socHJpdi0+cnhfbmV4dCk7CisKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJYXQ5MV93cml0ZShwcml2LCBBVDkxX0lFUiwgcmVnX2llcik7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworLyoKKyAqIHRoZW9yeSBvZiBvcGVyYXRpb246CisgKgorICogcHJpdi0+dHhfZWNobyBob2xkcyB0aGUgbnVtYmVyIG9mIHRoZSBvbGRlc3QgY2FuX2ZyYW1lIHB1dCBmb3IKKyAqIHRyYW5zbWlzc2lvbiBpbnRvIHRoZSBoYXJkd2FyZSwgYnV0IG5vdCB5ZXQgQUNLZWQgYnkgdGhlIENBTiB0eAorICogY29tcGxldGUgSVJRLgorICoKKyAqIFdlIGl0ZXJhdGUgZnJvbSBwcml2LT50eF9lY2hvIHRvIHByaXYtPnR4X25leHQgYW5kIGNoZWNrIGlmIHRoZQorICogcGFja2V0IGhhcyBiZWVuIHRyYW5zbWl0dGVkLCBlY2hvIGl0IGJhY2sgdG8gdGhlIENBTiBmcmFtZXdvcmsuIElmCisgKiB3ZSBkaXNjb3ZlciBhIG5vdCB5ZXQgdHJhbnNtaXR0ZWQgcGFja2FnZSwgc3RvcCBsb29raW5nIGZvciBtb3JlLgorICoKKyAqLworc3RhdGljIHZvaWQgYXQ5MV9pcnFfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHJlZ19zcikKK3sKKwlzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgcmVnX21zcjsKKwl1bnNpZ25lZCBpbnQgbWI7CisKKwkvKiBtYXNraW5nIG9mIHJlZ19zciBub3QgbmVlZGVkLCBhbHJlYWR5IGRvbmUgYnkgYXQ5MV9pcnEgKi8KKworCWZvciAoLyogbml4ICovOyAocHJpdi0+dHhfbmV4dCAtIHByaXYtPnR4X2VjaG8pID4gMDsgcHJpdi0+dHhfZWNobysrKSB7CisJCW1iID0gZ2V0X3R4X2VjaG9fbWIocHJpdik7CisKKwkJLyogbm8gZXZlbnQgaW4gbWFpbGJveD8gKi8KKwkJaWYgKCEocmVnX3NyICYgKDEgPDwgbWIpKSkKKwkJCWJyZWFrOworCisJCS8qIERpc2FibGUgaXJxIGZvciB0aGlzIFRYIG1haWxib3ggKi8KKwkJYXQ5MV93cml0ZShwcml2LCBBVDkxX0lEUiwgMSA8PCBtYik7CisKKwkJLyoKKwkJICogb25seSBlY2hvIGlmIG1haWxib3ggc2lnbmFscyB1cyBhIHRyYW5zZmVyCisJCSAqIGNvbXBsZXRlIChNU1JfTVJEWSkuIE90aGVyd2lzZSBpdCdzIGEgdGFuc2ZlcgorCQkgKiBhYm9ydC4gImNhbl9idXNfb2ZmKCkiIHRha2VzIGNhcmUgYWJvdXQgdGhlIHNrYnMKKwkJICogcGFya2VkIGluIHRoZSBlY2hvIHF1ZXVlLgorCQkgKi8KKwkJcmVnX21zciA9IGF0OTFfcmVhZChwcml2LCBBVDkxX01TUihtYikpOworCQlpZiAobGlrZWx5KHJlZ19tc3IgJiBBVDkxX01TUl9NUkRZICYmCisJCQkgICB+cmVnX21zciAmIEFUOTFfTVNSX01BQlQpKSB7CisJCQkvKiBfTk9URV86IHN1YnN0cmFjdCBBVDkxX01CX1RYX0ZJUlNUIG9mZnNldCBmcm9tIG1iISAqLworCQkJY2FuX2dldF9lY2hvX3NrYihkZXYsIG1iIC0gQVQ5MV9NQl9UWF9GSVJTVCk7CisJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCX0KKworCS8qCisJICogcmVzdGFydCBxdWV1ZSBpZiB3ZSBkb24ndCBoYXZlIGEgd3JhcCBhcm91bmQgYnV0IHJlc3RhcnQgaWYKKwkgKiB3ZSBnZXQgYSBUWCBpbnQgZm9yIHRoZSBsYXN0IGNhbiBmcmFtZSBkaXJlY3RseSBiZWZvcmUgYQorCSAqIHdyYXAgYXJvdW5kLgorCSAqLworCWlmICgocHJpdi0+dHhfbmV4dCAmIEFUOTFfTkVYVF9NQVNLKSAhPSAwIHx8CisJICAgIChwcml2LT50eF9lY2hvICYgQVQ5MV9ORVhUX01BU0spID09IDApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgYXQ5MV9pcnFfZXJyX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBjYW5fZnJhbWUgKmNmLCBlbnVtIGNhbl9zdGF0ZSBuZXdfc3RhdGUpCit7CisJc3RydWN0IGF0OTFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJlZ19pZHIsIHJlZ19pZXIsIHJlZ19lY3I7CisJdTggdGVjLCByZWM7CisKKwlyZWdfZWNyID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfRUNSKTsKKwlyZWMgPSByZWdfZWNyICYgMHhmZjsKKwl0ZWMgPSByZWdfZWNyID4+IDE2OworCisJc3dpdGNoIChwcml2LT5jYW4uc3RhdGUpIHsKKwljYXNlIENBTl9TVEFURV9FUlJPUl9BQ1RJVkU6CisJCS8qCisJCSAqIGZyb206IEVSUk9SX0FDVElWRQorCQkgKiB0byAgOiBFUlJPUl9XQVJOSU5HLCBFUlJPUl9QQVNTSVZFLCBCVVNfT0ZGCisJCSAqID0+ICA6IHRoZXJlIHdhcyBhIHdhcm5pbmcgaW50CisJCSAqLworCQlpZiAobmV3X3N0YXRlID49IENBTl9TVEFURV9FUlJPUl9XQVJOSU5HICYmCisJCSAgICBuZXdfc3RhdGUgPD0gQ0FOX1NUQVRFX0JVU19PRkYpIHsKKwkJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiRXJyb3IgV2FybmluZyBJUlFcbiIpOworCQkJcHJpdi0+Y2FuLmNhbl9zdGF0cy5lcnJvcl93YXJuaW5nKys7CisKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9DUlRMOworCQkJY2YtPmRhdGFbMV0gPSAodGVjID4gcmVjKSA/CisJCQkJQ0FOX0VSUl9DUlRMX1RYX1dBUk5JTkcgOgorCQkJCUNBTl9FUlJfQ1JUTF9SWF9XQVJOSU5HOworCQl9CisJY2FzZSBDQU5fU1RBVEVfRVJST1JfV0FSTklORzoJLyogZmFsbHRocm91Z2ggKi8KKwkJLyoKKwkJICogZnJvbTogRVJST1JfQUNUSVZFLCBFUlJPUl9XQVJOSU5HCisJCSAqIHRvICA6IEVSUk9SX1BBU1NJVkUsIEJVU19PRkYKKwkJICogPT4gIDogZXJyb3IgcGFzc2l2ZSBpbnQKKwkJICovCisJCWlmIChuZXdfc3RhdGUgPj0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUgJiYKKwkJICAgIG5ld19zdGF0ZSA8PSBDQU5fU1RBVEVfQlVTX09GRikgeworCQkJZGV2X2RiZyhkZXYtPmRldi5wYXJlbnQsICJFcnJvciBQYXNzaXZlIElSUVxuIik7CisJCQlwcml2LT5jYW4uY2FuX3N0YXRzLmVycm9yX3Bhc3NpdmUrKzsKKworCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0NSVEw7CisJCQljZi0+ZGF0YVsxXSA9ICh0ZWMgPiByZWMpID8KKwkJCQlDQU5fRVJSX0NSVExfVFhfUEFTU0lWRSA6CisJCQkJQ0FOX0VSUl9DUlRMX1JYX1BBU1NJVkU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDQU5fU1RBVEVfQlVTX09GRjoKKwkJLyoKKwkJICogZnJvbTogQlVTX09GRgorCQkgKiB0byAgOiBFUlJPUl9BQ1RJVkUsIEVSUk9SX1dBUk5JTkcsIEVSUk9SX1BBU1NJVkUKKwkJICovCisJCWlmIChuZXdfc3RhdGUgPD0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUpIHsKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9SRVNUQVJURUQ7CisKKwkJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAicmVzdGFydGVkXG4iKTsKKwkJCXByaXYtPmNhbi5jYW5fc3RhdHMucmVzdGFydHMrKzsKKworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCisJLyogcHJvY2VzcyBzdGF0ZSBjaGFuZ2VzIGRlcGVuZGluZyBvbiB0aGUgbmV3IHN0YXRlICovCisJc3dpdGNoIChuZXdfc3RhdGUpIHsKKwljYXNlIENBTl9TVEFURV9FUlJPUl9BQ1RJVkU6CisJCS8qCisJCSAqIGFjdHVhbGx5IHdlIHdhbnQgdG8gZW5hYmxlIEFUOTFfSVJRX1dBUk4gaGVyZSwgYnV0CisJCSAqIGl0IHNjcmV3cyB1cCB0aGUgc3lzdGVtIHVuZGVyIGNlcnRhaW4KKwkJICogY2lyY3Vtc3RhbmNlcy4gc28ganVzdCBlbmFibGUgQVQ5MV9JUlFfRVJSUCwgdGh1cworCQkgKiB0aGUgImZhbGx0aHJvdWdoIgorCQkgKi8KKwkJZGV2X2RiZyhkZXYtPmRldi5wYXJlbnQsICJFcnJvciBBY3RpdmVcbiIpOworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVDsKKwkJY2YtPmRhdGFbMl0gPSBDQU5fRVJSX1BST1RfQUNUSVZFOworCWNhc2UgQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkc6CS8qIGZhbGx0aHJvdWdoICovCisJCXJlZ19pZHIgPSBBVDkxX0lSUV9FUlJBIHwgQVQ5MV9JUlFfV0FSTiB8IEFUOTFfSVJRX0JPRkY7CisJCXJlZ19pZXIgPSBBVDkxX0lSUV9FUlJQOworCQlicmVhazsKKwljYXNlIENBTl9TVEFURV9FUlJPUl9QQVNTSVZFOgorCQlyZWdfaWRyID0gQVQ5MV9JUlFfRVJSQSB8IEFUOTFfSVJRX1dBUk4gfCBBVDkxX0lSUV9FUlJQOworCQlyZWdfaWVyID0gQVQ5MV9JUlFfQk9GRjsKKwkJYnJlYWs7CisJY2FzZSBDQU5fU1RBVEVfQlVTX09GRjoKKwkJcmVnX2lkciA9IEFUOTFfSVJRX0VSUkEgfCBBVDkxX0lSUV9FUlJQIHwKKwkJCUFUOTFfSVJRX1dBUk4gfCBBVDkxX0lSUV9CT0ZGOworCQlyZWdfaWVyID0gMDsKKworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQlVTT0ZGOworCisJCWRldl9kYmcoZGV2LT5kZXYucGFyZW50LCAiYnVzLW9mZlxuIik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCXByaXYtPmNhbi5jYW5fc3RhdHMuYnVzX29mZisrOworCisJCS8qIHR1cm4gb2ZmIGNoaXAsIGlmIHJlc3RhcnQgaXMgZGlzYWJsZWQgKi8KKwkJaWYgKCFwcml2LT5jYW4ucmVzdGFydF9tcykgeworCQkJYXQ5MV9jaGlwX3N0b3AoZGV2LCBDQU5fU1RBVEVfQlVTX09GRik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJYXQ5MV93cml0ZShwcml2LCBBVDkxX0lEUiwgcmVnX2lkcik7CisJYXQ5MV93cml0ZShwcml2LCBBVDkxX0lFUiwgcmVnX2llcik7Cit9CisKK3N0YXRpYyB2b2lkIGF0OTFfaXJxX2VycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdDkxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJZW51bSBjYW5fc3RhdGUgbmV3X3N0YXRlOworCXUzMiByZWdfc3I7CisKKwlyZWdfc3IgPSBhdDkxX3JlYWQocHJpdiwgQVQ5MV9TUik7CisKKwkvKiB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHVubWFza2VkIHJlZ19zciAqLworCWlmICh1bmxpa2VseShyZWdfc3IgJiBBVDkxX0lSUV9CT0ZGKSkKKwkJbmV3X3N0YXRlID0gQ0FOX1NUQVRFX0JVU19PRkY7CisJZWxzZSBpZiAodW5saWtlbHkocmVnX3NyICYgQVQ5MV9JUlFfRVJSUCkpCisJCW5ld19zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9QQVNTSVZFOworCWVsc2UgaWYgKHVubGlrZWx5KHJlZ19zciAmIEFUOTFfSVJRX1dBUk4pKQorCQluZXdfc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfV0FSTklORzsKKwllbHNlIGlmIChsaWtlbHkocmVnX3NyICYgQVQ5MV9JUlFfRVJSQSkpCisJCW5ld19zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7CisJZWxzZSB7CisJCWRldl9lcnIoZGV2LT5kZXYucGFyZW50LCAiQlVHISBoYXJkd2FyZSBpbiB1bmRlZmluZWQgc3RhdGVcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogc3RhdGUgaGFzbid0IGNoYW5nZWQgKi8KKwlpZiAobGlrZWx5KG5ld19zdGF0ZSA9PSBwcml2LT5jYW4uc3RhdGUpKQorCQlyZXR1cm47CisKKwlza2IgPSBhbGxvY19jYW5fZXJyX3NrYihkZXYsICZjZik7CisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm47CisKKwlhdDkxX2lycV9lcnJfc3RhdGUoZGV2LCBjZiwgbmV3X3N0YXRlKTsKKwluZXRpZl9yeChza2IpOworCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGNmLT5jYW5fZGxjOworCisJcHJpdi0+Y2FuLnN0YXRlID0gbmV3X3N0YXRlOworfQorCisvKgorICogaW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RhdGljIGlycXJldHVybl90IGF0OTFfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBhdDkxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWlycXJldHVybl90IGhhbmRsZWQgPSBJUlFfTk9ORTsKKwl1MzIgcmVnX3NyLCByZWdfaW1yOworCisJcmVnX3NyID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfU1IpOworCXJlZ19pbXIgPSBhdDkxX3JlYWQocHJpdiwgQVQ5MV9JTVIpOworCisJLyogSWdub3JlIG1hc2tlZCBpbnRlcnJ1cHRzICovCisJcmVnX3NyICY9IHJlZ19pbXI7CisJaWYgKCFyZWdfc3IpCisJCWdvdG8gZXhpdDsKKworCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKworCS8qIFJlY2VpdmUgb3IgZXJyb3IgaW50ZXJydXB0PyAtPiBuYXBpICovCisJaWYgKHJlZ19zciAmIChBVDkxX0lSUV9NQl9SWCB8IEFUOTFfSVJRX0VSUl9GUkFNRSkpIHsKKwkJLyoKKwkJICogVGhlIGVycm9yIGJpdHMgYXJlIGNsZWFyIG9uIHJlYWQsCisJCSAqIHNhdmUgZm9yIGxhdGVyIHVzZS4KKwkJICovCisJCXByaXYtPnJlZ19zciA9IHJlZ19zcjsKKwkJYXQ5MV93cml0ZShwcml2LCBBVDkxX0lEUiwKKwkJCSAgIEFUOTFfSVJRX01CX1JYIHwgQVQ5MV9JUlFfRVJSX0ZSQU1FKTsKKwkJbmFwaV9zY2hlZHVsZSgmcHJpdi0+bmFwaSk7CisJfQorCisJLyogVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCAqLworCWlmIChyZWdfc3IgJiBBVDkxX0lSUV9NQl9UWCkKKwkJYXQ5MV9pcnFfdHgoZGV2LCByZWdfc3IpOworCisJYXQ5MV9pcnFfZXJyKGRldik7CisKKyBleGl0OgorCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaW50IGF0OTFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdDkxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwljbGtfZW5hYmxlKHByaXYtPmNsayk7CisKKwkvKiBjaGVjayBvciBkZXRlcm1pbmUgYW5kIHNldCBiaXR0aW1lICovCisJZXJyID0gb3Blbl9jYW5kZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIHJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyICovCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBhdDkxX2lycSwgSVJRRl9TSEFSRUQsCisJCQlkZXYtPm5hbWUsIGRldikpIHsKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJLyogc3RhcnQgY2hpcCBhbmQgcXVldWluZyAqLworCWF0OTFfY2hpcF9zdGFydChkZXYpOworCW5hcGlfZW5hYmxlKCZwcml2LT5uYXBpKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKKyBvdXRfY2xvc2U6CisJY2xvc2VfY2FuZGV2KGRldik7Cisgb3V0OgorCWNsa19kaXNhYmxlKHByaXYtPmNsayk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogc3RvcCBDQU4gYnVzIGFjdGl2aXR5CisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdDkxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5hcGlfZGlzYWJsZSgmcHJpdi0+bmFwaSk7CisJYXQ5MV9jaGlwX3N0b3AoZGV2LCBDQU5fU1RBVEVfU1RPUFBFRCk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwljbGtfZGlzYWJsZShwcml2LT5jbGspOworCisJY2xvc2VfY2FuZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDkxX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGVudW0gY2FuX21vZGUgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENBTl9NT0RFX1NUQVJUOgorCQlhdDkxX2NoaXBfc3RhcnQoZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBhdDkxX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCT0gYXQ5MV9vcGVuLAorCS5uZG9fc3RvcAk9IGF0OTFfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CT0gYXQ5MV9zdGFydF94bWl0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQ5MV9jYW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhdDkxX3ByaXYgKnByaXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGNsayAqY2xrOworCXZvaWQgX19pb21lbSAqYWRkcjsKKwlpbnQgZXJyLCBpcnE7CisKKwljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJjYW5fY2xrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGNsb2NrIGRlZmluZWRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICghcmVzIHx8ICFpcnEpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBleGl0X3B1dDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUocmVzKSwKKwkJCQlwZGV2LT5uYW1lKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXhpdF9wdXQ7CisJfQorCisJYWRkciA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghYWRkcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9CisKKwlkZXYgPSBhbGxvY19jYW5kZXYoc2l6ZW9mKHN0cnVjdCBhdDkxX3ByaXYpKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfaW91bm1hcDsKKwl9CisKKwlkZXYtPm5ldGRldl9vcHMJPSAmYXQ5MV9uZXRkZXZfb3BzOworCWRldi0+aXJxID0gaXJxOworCWRldi0+ZmxhZ3MgfD0gSUZGX0VDSE87CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5jYW4uY2xvY2suZnJlcSA9IGNsa19nZXRfcmF0ZShjbGspOworCXByaXYtPmNhbi5iaXR0aW1pbmdfY29uc3QgPSAmYXQ5MV9iaXR0aW1pbmdfY29uc3Q7CisJcHJpdi0+Y2FuLmRvX3NldF9iaXR0aW1pbmcgPSBhdDkxX3NldF9iaXR0aW1pbmc7CisJcHJpdi0+Y2FuLmRvX3NldF9tb2RlID0gYXQ5MV9zZXRfbW9kZTsKKwlwcml2LT5yZWdfYmFzZSA9IGFkZHI7CisJcHJpdi0+ZGV2ID0gZGV2OworCXByaXYtPmNsayA9IGNsazsKKwlwcml2LT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHJpdi0+bmFwaSwgYXQ5MV9wb2xsLCBBVDkxX05BUElfV0VJR0hUKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwllcnIgPSByZWdpc3Rlcl9jYW5kZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ2lzdGVyaW5nIG5ldGRldiBmYWlsZWRcbiIpOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZGV2aWNlIHJlZ2lzdGVyZWQgKHJlZ19iYXNlPSVwLCBpcnE9JWQpXG4iLAorCQkgcHJpdi0+cmVnX2Jhc2UsIGRldi0+aXJxKTsKKworCXJldHVybiAwOworCisgZXhpdF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CisgZXhpdF9pb3VubWFwOgorCWlvdW5tYXAoYWRkcik7CisgZXhpdF9yZWxlYXNlOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworIGV4aXRfcHV0OgorCWNsa19wdXQoY2xrKTsKKyBleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGF0OTFfY2FuX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlpb3VubWFwKHByaXYtPnJlZ19iYXNlKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisKKwljbGtfcHV0KHByaXYtPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXQ5MV9jYW5fZHJpdmVyID0geworCS5wcm9iZQkJPSBhdDkxX2Nhbl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF0OTFfY2FuX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gRFJWX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX2Nhbl9tb2R1bGVfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIG5ldGRldmljZSBkcml2ZXJcbiIsIERSVl9OQU1FKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdDkxX2Nhbl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXQ5MV9jYW5fbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXQ5MV9jYW5fZHJpdmVyKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogZHJpdmVyIHJlbW92ZWRcbiIsIERSVl9OQU1FKTsKK30KKworbW9kdWxlX2luaXQoYXQ5MV9jYW5fbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoYXQ5MV9jYW5fbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJjIEtsZWluZS1CdWRkZSA8bWtsQHBlbmd1dHJvbml4LmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9OQU1FICIgQ0FOIG5ldGRldmljZSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL2Vtc19wY2kuYyBiL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL2Vtc19wY2kuYwppbmRleCA3ZDg0YjhhLi5mZDA0Nzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9lbXNfcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvZW1zX3BjaS5jCkBAIC05NCwxMiArOTQsMTQgQEAKICNkZWZpbmUgRU1TX1BDSV9DRFIgICAgICAgICAgICAgKENEUl9DQlAgfCBDRFJfQ0xLT1VUX01BU0spCiAKICNkZWZpbmUgRU1TX1BDSV9WMV9CQVNFX0JBUiAgICAgMQotI2RlZmluZSBFTVNfUENJX1YxX01FTV9TSVpFICAgICA0MDk2CisjZGVmaW5lIEVNU19QQ0lfVjFfQ09ORl9TSVpFICAgIDQwOTYgLyogc2l6ZSBvZiBQSVRBIGNvbnRyb2wgYXJlYSAqLwogI2RlZmluZSBFTVNfUENJX1YyX0JBU0VfQkFSICAgICAyCi0jZGVmaW5lIEVNU19QQ0lfVjJfTUVNX1NJWkUgICAgIDEyOAorI2RlZmluZSBFTVNfUENJX1YyX0NPTkZfU0laRSAgICAxMjggLyogc2l6ZSBvZiBQTFggY29udHJvbCBhcmVhICovCiAjZGVmaW5lIEVNU19QQ0lfQ0FOX0JBU0VfT0ZGU0VUIDB4NDAwIC8qIG9mZnNldCB3aGVyZSB0aGUgY29udHJvbGxlcnMgc3RhcnRzICovCiAjZGVmaW5lIEVNU19QQ0lfQ0FOX0NUUkxfU0laRSAgIDB4MjAwIC8qIG1lbW9yeSBzaXplIGZvciBlYWNoIGNvbnRyb2xsZXIgKi8KIAorI2RlZmluZSBFTVNfUENJX0JBU0VfU0laRSAgNDA5NiAvKiBzaXplIG9mIGNvbnRyb2xsZXIgYXJlYSAqLworCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZW1zX3BjaV90YmxbXSA9IHsKIAkvKiBDUEMtUENJIHYxICovCiAJe1BDSV9WRU5ET1JfSURfU0lFTUVOUywgMHgyMTA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCkBAIC0yMjQsNyArMjI2LDcgQEAKIAlzdHJ1Y3Qgc2phMTAwMF9wcml2ICpwcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGVtc19wY2lfY2FyZCAqY2FyZDsKLQlpbnQgbWF4X2NoYW4sIG1lbV9zaXplLCBiYXNlX2JhcjsKKwlpbnQgbWF4X2NoYW4sIGNvbmZfc2l6ZSwgYmFzZV9iYXI7CiAJaW50IGVyciwgaTsKIAogCS8qIEVuYWJsaW5nIFBDSSBkZXZpY2UgKi8KQEAgLTI1MSwyMiArMjUzLDIyIEBACiAJCWNhcmQtPnZlcnNpb24gPSAyOyAvKiBDUEMtUENJIHYyICovCiAJCW1heF9jaGFuID0gRU1TX1BDSV9WMl9NQVhfQ0hBTjsKIAkJYmFzZV9iYXIgPSBFTVNfUENJX1YyX0JBU0VfQkFSOwotCQltZW1fc2l6ZSA9IEVNU19QQ0lfVjJfTUVNX1NJWkU7CisJCWNvbmZfc2l6ZSA9IEVNU19QQ0lfVjJfQ09ORl9TSVpFOwogCX0gZWxzZSB7CiAJCWNhcmQtPnZlcnNpb24gPSAxOyAvKiBDUEMtUENJIHYxICovCiAJCW1heF9jaGFuID0gRU1TX1BDSV9WMV9NQVhfQ0hBTjsKIAkJYmFzZV9iYXIgPSBFTVNfUENJX1YxX0JBU0VfQkFSOwotCQltZW1fc2l6ZSA9IEVNU19QQ0lfVjFfTUVNX1NJWkU7CisJCWNvbmZfc2l6ZSA9IEVNU19QQ0lfVjFfQ09ORl9TSVpFOwogCX0KIAogCS8qIFJlbWFwIGNvbmZpZ3VyYXRpb24gc3BhY2UgYW5kIGNvbnRyb2xsZXIgbWVtb3J5IGFyZWEgKi8KLQljYXJkLT5jb25mX2FkZHIgPSBwY2lfaW9tYXAocGRldiwgMCwgbWVtX3NpemUpOworCWNhcmQtPmNvbmZfYWRkciA9IHBjaV9pb21hcChwZGV2LCAwLCBjb25mX3NpemUpOwogCWlmIChjYXJkLT5jb25mX2FkZHIgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWx1cmVfY2xlYW51cDsKIAl9CiAKLQljYXJkLT5iYXNlX2FkZHIgPSBwY2lfaW9tYXAocGRldiwgYmFzZV9iYXIsIG1lbV9zaXplKTsKKwljYXJkLT5iYXNlX2FkZHIgPSBwY2lfaW9tYXAocGRldiwgYmFzZV9iYXIsIEVNU19QQ0lfQkFTRV9TSVpFKTsKIAlpZiAoY2FyZC0+YmFzZV9hZGRyID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsdXJlX2NsZWFudXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwX29mX3BsYXRmb3JtLmMgYi9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwX29mX3BsYXRmb3JtLmMKaW5kZXggMzM3MzU2MC4uOWRkMDc2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMF9vZl9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDBfb2ZfcGxhdGZvcm0uYwpAQCAtMjEzLDYgKzIxMyw3IEBACiAJey5jb21wYXRpYmxlID0gIm54cCxzamExMDAwIn0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2phMTAwMF9vZnBfdGFibGUpOwogCiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBzamExMDAwX29mcF9kcml2ZXIgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Y3NWJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgIE1ha2VmaWxlIGZvciB0aGUgTGludXggQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgVVNCIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19DQU5fRU1TX1VTQikgKz0gZW1zX3VzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL2Vtc191c2IuYyBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvZW1zX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTJlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2Vtc191c2IuYwpAQCAtMCwwICsxLDExNTUgQEAKKy8qCisgKiBDQU4gZHJpdmVyIGZvciBFTVMgRHIuIFRob21hcyBXdWVuc2NoZSBDUEMtVVNCL0FSTTcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBFTVMgRHIuIFRob21hcyBXdWVuc2NoZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vZXJyb3IuaD4KKworTU9EVUxFX0FVVEhPUigiU2ViYXN0aWFuIEhhYXMgPGhhYXNAZW1zLXd1ZW5zY2hlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ0FOIGRyaXZlciBmb3IgRU1TIERyLiBUaG9tYXMgV3VlbnNjaGUgQ0FOL1VTQiBpbnRlcmZhY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKKy8qIENvbnRyb2wtVmFsdWVzIGZvciBDUENfQ29udHJvbCgpIENvbW1hbmQgU3ViamVjdCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgQ09OVFJfQ0FOX01FU1NBR0UgMHgwNAorI2RlZmluZSBDT05UUl9DQU5fU1RBVEUgICAweDBDCisjZGVmaW5lIENPTlRSX0JVU19FUlJPUiAgIDB4MUMKKworLyogQ29udHJvbCBDb21tYW5kIEFjdGlvbnMgKi8KKyNkZWZpbmUgQ09OVFJfQ09OVF9PRkYgMAorI2RlZmluZSBDT05UUl9DT05UX09OICAxCisjZGVmaW5lIENPTlRSX09OQ0UgICAgIDIKKworLyogTWVzc2FnZXMgZnJvbSBDUEMgdG8gUEMgKi8KKyNkZWZpbmUgQ1BDX01TR19UWVBFX0NBTl9GUkFNRSAgICAgICAxICAvKiBDQU4gZGF0YSBmcmFtZSAqLworI2RlZmluZSBDUENfTVNHX1RZUEVfUlRSX0ZSQU1FICAgICAgIDggIC8qIENBTiByZW1vdGUgZnJhbWUgKi8KKyNkZWZpbmUgQ1BDX01TR19UWVBFX0NBTl9QQVJBTVMgICAgICAxMiAvKiBBY3R1YWwgQ0FOIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgQ1BDX01TR19UWVBFX0NBTl9TVEFURSAgICAgICAxNCAvKiBDQU4gc3RhdGUgbWVzc2FnZSAqLworI2RlZmluZSBDUENfTVNHX1RZUEVfRVhUX0NBTl9GUkFNRSAgIDE2IC8qIEV4dGVuZGVkIENBTiBkYXRhIGZyYW1lICovCisjZGVmaW5lIENQQ19NU0dfVFlQRV9FWFRfUlRSX0ZSQU1FICAgMTcgLyogRXh0ZW5kZWQgcmVtb3RlIGZyYW1lICovCisjZGVmaW5lIENQQ19NU0dfVFlQRV9DT05UUk9MICAgICAgICAgMTkgLyogY2hhbmdlIGludGVyZmFjZSBiZWhhdmlvciAqLworI2RlZmluZSBDUENfTVNHX1RZUEVfQ09ORklSTSAgICAgICAgIDIwIC8qIGNvbW1hbmQgcHJvY2Vzc2VkIGNvbmZpcm1hdGlvbiAqLworI2RlZmluZSBDUENfTVNHX1RZUEVfT1ZFUlJVTiAgICAgICAgIDIxIC8qIG92ZXJydW4gZXZlbnRzICovCisjZGVmaW5lIENQQ19NU0dfVFlQRV9DQU5fRlJBTUVfRVJST1IgMjMgLyogZGV0ZWN0ZWQgYnVzIGVycm9ycyAqLworI2RlZmluZSBDUENfTVNHX1RZUEVfRVJSX0NPVU5URVIgICAgIDI1IC8qIFJYL1RYIGVycm9yIGNvdW50ZXIgKi8KKworLyogTWVzc2FnZXMgZnJvbSB0aGUgUEMgdG8gdGhlIENQQyBpbnRlcmZhY2UgICovCisjZGVmaW5lIENQQ19DTURfVFlQRV9DQU5fRlJBTUUgICAgIDEgICAvKiBDQU4gZGF0YSBmcmFtZSAqLworI2RlZmluZSBDUENfQ01EX1RZUEVfQ09OVFJPTCAgICAgICAzICAgLyogY29udHJvbCBvZiBpbnRlcmZhY2UgYmVoYXZpb3IgKi8KKyNkZWZpbmUgQ1BDX0NNRF9UWVBFX0NBTl9QQVJBTVMgICAgNiAgIC8qIHNldCBDQU4gcGFyYW1ldGVycyAqLworI2RlZmluZSBDUENfQ01EX1RZUEVfUlRSX0ZSQU1FICAgICAxMyAgLyogQ0FOIHJlbW90ZSBmcmFtZSAqLworI2RlZmluZSBDUENfQ01EX1RZUEVfQ0FOX1NUQVRFICAgICAxNCAgLyogQ0FOIHN0YXRlIG1lc3NhZ2UgKi8KKyNkZWZpbmUgQ1BDX0NNRF9UWVBFX0VYVF9DQU5fRlJBTUUgMTUgIC8qIEV4dGVuZGVkIENBTiBkYXRhIGZyYW1lICovCisjZGVmaW5lIENQQ19DTURfVFlQRV9FWFRfUlRSX0ZSQU1FIDE2ICAvKiBFeHRlbmRlZCBDQU4gcmVtb3RlIGZyYW1lICovCisjZGVmaW5lIENQQ19DTURfVFlQRV9DQU5fRVhJVCAgICAgIDIwMCAvKiBleGl0IHRoZSBDQU4gKi8KKworI2RlZmluZSBDUENfQ01EX1RZUEVfSU5RX0VSUl9DT1VOVEVSIDI1IC8qIHJlcXVlc3QgdGhlIENBTiBlcnJvciBjb3VudGVycyAqLworI2RlZmluZSBDUENfQ01EX1RZUEVfQ0xFQVJfTVNHX1FVRVVFIDggIC8qIGNsZWFyIENQQ19NU0cgcXVldWUgKi8KKyNkZWZpbmUgQ1BDX0NNRF9UWVBFX0NMRUFSX0NNRF9RVUVVRSAyOCAvKiBjbGVhciBDUENfQ01EIHF1ZXVlICovCisKKyNkZWZpbmUgQ1BDX0NDX1RZUEVfU0pBMTAwMCAyIC8qIFBoaWxpcHMgYmFzaWMgQ0FOIGNvbnRyb2xsZXIgKi8KKworI2RlZmluZSBDUENfQ0FOX0VDT0RFX0VSUkZSQU1FIDB4MDEgLyogRWNvZGUgdHlwZSAqLworCisvKiBPdmVycnVuIHR5cGVzICovCisjZGVmaW5lIENQQ19PVlJfRVZFTlRfQ0FOICAgICAgIDB4MDEKKyNkZWZpbmUgQ1BDX09WUl9FVkVOVF9DQU5TVEFURSAgMHgwMgorI2RlZmluZSBDUENfT1ZSX0VWRU5UX0JVU0VSUk9SICAweDA0CisKKy8qCisgKiBJZiB0aGUgQ0FOIGNvbnRyb2xsZXIgbG9zdCBhIG1lc3NhZ2Ugd2UgaW5kaWNhdGUgaXQgd2l0aCB0aGUgaGlnaGVzdCBiaXQKKyAqIHNldCBpbiB0aGUgY291bnQgZmllbGQuCisgKi8KKyNkZWZpbmUgQ1BDX09WUl9IVyAweDgwCisKKy8qIFNpemUgb2YgdGhlICJzdHJ1Y3QgZW1zX2NwY19tc2ciIHdpdGhvdXQgdGhlIHVuaW9uICovCisjZGVmaW5lIENQQ19NU0dfSEVBREVSX0xFTiAgIDExCisjZGVmaW5lIENQQ19DQU5fTVNHX01JTl9TSVpFIDUKKworLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZXMgKi8KKyNkZWZpbmUgVVNCX0NQQ1VTQl9WRU5ET1JfSUQgMHgxMkQ2CisKKyNkZWZpbmUgVVNCX0NQQ1VTQl9BUk03X1BST0RVQ1RfSUQgMHgwNDQ0CisKKy8qIE1vZGUgcmVnaXN0ZXIgTlhQIExQQzIxMTkvU0pBMTAwMCBDQU4gQ29udHJvbGxlciAqLworI2RlZmluZSBTSkExMDAwX01PRF9OT1JNQUwgMHgwMAorI2RlZmluZSBTSkExMDAwX01PRF9STSAgICAgMHgwMQorCisvKiBFQ0MgcmVnaXN0ZXIgTlhQIExQQzIxMTkvU0pBMTAwMCBDQU4gQ29udHJvbGxlciAqLworI2RlZmluZSBTSkExMDAwX0VDQ19TRUcgICAweDFGCisjZGVmaW5lIFNKQTEwMDBfRUNDX0RJUiAgIDB4MjAKKyNkZWZpbmUgU0pBMTAwMF9FQ0NfRVJSICAgMHgwNgorI2RlZmluZSBTSkExMDAwX0VDQ19CSVQgICAweDAwCisjZGVmaW5lIFNKQTEwMDBfRUNDX0ZPUk0gIDB4NDAKKyNkZWZpbmUgU0pBMTAwMF9FQ0NfU1RVRkYgMHg4MAorI2RlZmluZSBTSkExMDAwX0VDQ19NQVNLICAweGMwCisKKy8qIFN0YXR1cyByZWdpc3RlciBjb250ZW50ICovCisjZGVmaW5lIFNKQTEwMDBfU1JfQlMgMHg4MAorI2RlZmluZSBTSkExMDAwX1NSX0VTIDB4NDAKKworI2RlZmluZSBTSkExMDAwX0RFRkFVTFRfT1VUUFVUX0NPTlRST0wgMHhEQQorCisvKgorICogVGhlIGRldmljZSBhY3R1YWxseSB1c2VzIGEgMTZNSHogY2xvY2sgdG8gZ2VuZXJhdGUgdGhlIENBTiBjbG9jaworICogYnV0IGl0IGV4cGVjdHMgU0pBMTAwMCBiaXQgc2V0dGluZ3MgYmFzZWQgb24gOE1IeiAoaXMgaW50ZXJuYWxseQorICogY29udmVydGVkKS4KKyAqLworI2RlZmluZSBFTVNfVVNCX0FSTTdfQ0xPQ0sgODAwMDAwMAorCisvKgorICogQ0FOLU1lc3NhZ2UgcmVwcmVzZW50YXRpb24gaW4gYSBDUENfTVNHLiBNZXNzYWdlIG9iamVjdCB0eXBlIGlzCisgKiBDUENfTVNHX1RZUEVfQ0FOX0ZSQU1FIG9yIENQQ19NU0dfVFlQRV9SVFJfRlJBTUUgb3IKKyAqIENQQ19NU0dfVFlQRV9FWFRfQ0FOX0ZSQU1FIG9yIENQQ19NU0dfVFlQRV9FWFRfUlRSX0ZSQU1FLgorICovCitzdHJ1Y3QgY3BjX2Nhbl9tc2cgeworCXUzMiBpZDsKKwl1OCBsZW5ndGg7CisJdTggbXNnWzhdOworfTsKKworLyogUmVwcmVzZW50YXRpb24gb2YgdGhlIENBTiBwYXJhbWV0ZXJzIGZvciB0aGUgU0pBMTAwMCBjb250cm9sbGVyICovCitzdHJ1Y3QgY3BjX3NqYTEwMDBfcGFyYW1zIHsKKwl1OCBtb2RlOworCXU4IGFjY19jb2RlMDsKKwl1OCBhY2NfY29kZTE7CisJdTggYWNjX2NvZGUyOworCXU4IGFjY19jb2RlMzsKKwl1OCBhY2NfbWFzazA7CisJdTggYWNjX21hc2sxOworCXU4IGFjY19tYXNrMjsKKwl1OCBhY2NfbWFzazM7CisJdTggYnRyMDsKKwl1OCBidHIxOworCXU4IG91dHBfY29udHI7Cit9OworCisvKiBDQU4gcGFyYW1zIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24gKi8KK3N0cnVjdCBjcGNfY2FuX3BhcmFtcyB7CisJdTggY2NfdHlwZTsKKworCS8qIFdpbGwgc3VwcG9ydCBNMTZDIENBTiBjb250cm9sbGVyIGluIHRoZSBmdXR1cmUgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBjcGNfc2phMTAwMF9wYXJhbXMgc2phMTAwMDsKKwl9IGNjX3BhcmFtczsKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgY29uZmlybWVkIG1lc3NhZ2UgaGFuZGxpbmcgKi8KK3N0cnVjdCBjcGNfY29uZmlybSB7CisJdTggZXJyb3I7IC8qIGVycm9yIGNvZGUgKi8KK307CisKKy8qIFN0cnVjdHVyZSBmb3Igb3ZlcnJ1biBjb25kaXRpb25zICovCitzdHJ1Y3QgY3BjX292ZXJydW4geworCXU4IGV2ZW50OworCXU4IGNvdW50OworfTsKKworLyogU0pBMTAwMCBDQU4gZXJyb3JzIChjb21wYXRpYmxlIHRvIE5YUCBMUEMyMTE5KSAqLworc3RydWN0IGNwY19zamExMDAwX2Nhbl9lcnJvciB7CisJdTggZWNjOworCXU4IHJ4ZXJyOworCXU4IHR4ZXJyOworfTsKKworLyogc3RydWN0dXJlIGZvciBDQU4gZXJyb3IgY29uZGl0aW9ucyAqLworc3RydWN0IGNwY19jYW5fZXJyb3IgeworCXU4IGVjb2RlOworCisJc3RydWN0IHsKKwkJdTggY2NfdHlwZTsKKworCQkvKiBPdGhlciBjb250cm9sbGVycyBtYXkgYWxzbyBwcm92aWRlIGVycm9yIGNvZGUgY2FwdHVyZSByZWdzICovCisJCXVuaW9uIHsKKwkJCXN0cnVjdCBjcGNfc2phMTAwMF9jYW5fZXJyb3Igc2phMTAwMDsKKwkJfSByZWdzOworCX0gY2M7Cit9OworCisvKgorICogU3RydWN0dXJlIGNvbnRhaW5pbmcgUlgvVFggZXJyb3IgY291bnRlci4gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXF1ZXN0CisgKiB0aGUgdmFsdWVzIG9mIHRoZSBDQU4gY29udHJvbGxlcnMgVFggYW5kIFJYIGVycm9yIGNvdW50ZXIuCisgKi8KK3N0cnVjdCBjcGNfY2FuX2Vycl9jb3VudGVyIHsKKwl1OCByeDsKKwl1OCB0eDsKK307CisKKy8qIE1haW4gbWVzc2FnZSB0eXBlIHVzZWQgYmV0d2VlbiBsaWJyYXJ5IGFuZCBhcHBsaWNhdGlvbiAqLworc3RydWN0IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBlbXNfY3BjX21zZyB7CisJdTggdHlwZTsJLyogdHlwZSBvZiBtZXNzYWdlICovCisJdTggbGVuZ3RoOwkvKiBsZW5ndGggb2YgZGF0YSB3aXRoaW4gdW5pb24gJ21zZycgKi8KKwl1OCBtc2dpZDsJLyogY29uZmlybWF0aW9uIGhhbmRsZSAqLworCXUzMiB0c19zZWM7CS8qIHRpbWVzdGFtcCBpbiBzZWNvbmRzICovCisJdTMyIHRzX25zZWM7CS8qIHRpbWVzdGFtcCBpbiBuYW5vIHNlY29uZHMgKi8KKworCXVuaW9uIHsKKwkJdTggZ2VuZXJpY1s2NF07CisJCXN0cnVjdCBjcGNfY2FuX21zZyBjYW5fbXNnOworCQlzdHJ1Y3QgY3BjX2Nhbl9wYXJhbXMgY2FuX3BhcmFtczsKKwkJc3RydWN0IGNwY19jb25maXJtIGNvbmZpcm1hdGlvbjsKKwkJc3RydWN0IGNwY19vdmVycnVuIG92ZXJydW47CisJCXN0cnVjdCBjcGNfY2FuX2Vycm9yIGVycm9yOworCQlzdHJ1Y3QgY3BjX2Nhbl9lcnJfY291bnRlciBlcnJfY291bnRlcjsKKwkJdTggY2FuX3N0YXRlOworCX0gbXNnOworfTsKKworLyoKKyAqIFRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIKKyAqIE5PVEU6IFRoaXMgZHJpdmVyIHN1cHBvcnRzIG9ubHkgQ1BDLVVTQi9BUk03IChMUEMyMTE5KSB5ZXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBlbXNfdXNiX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoVVNCX0NQQ1VTQl9WRU5ET1JfSUQsIFVTQl9DUENVU0JfQVJNN19QUk9EVUNUX0lEKX0sCisJe30gLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBlbXNfdXNiX3RhYmxlKTsKKworI2RlZmluZSBSWF9CVUZGRVJfU0laRSAgICAgIDY0CisjZGVmaW5lIENQQ19IRUFERVJfU0laRSAgICAgNAorI2RlZmluZSBJTlRSX0lOX0JVRkZFUl9TSVpFIDQKKworI2RlZmluZSBNQVhfUlhfVVJCUyAxMAorI2RlZmluZSBNQVhfVFhfVVJCUyBDQU5fRUNIT19TS0JfTUFYCisKK3N0cnVjdCBlbXNfdXNiOworCitzdHJ1Y3QgZW1zX3R4X3VyYl9jb250ZXh0IHsKKwlzdHJ1Y3QgZW1zX3VzYiAqZGV2OworCisJdTMyIGVjaG9faW5kZXg7CisJdTggZGxjOworfTsKKworc3RydWN0IGVtc191c2IgeworCXN0cnVjdCBjYW5fcHJpdiBjYW47IC8qIG11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciAqLworCWludCBvcGVuX3RpbWU7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqZWNob19za2JbTUFYX1RYX1VSQlNdOworCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCWF0b21pY190IGFjdGl2ZV90eF91cmJzOworCXN0cnVjdCB1c2JfYW5jaG9yIHR4X3N1Ym1pdHRlZDsKKwlzdHJ1Y3QgZW1zX3R4X3VyYl9jb250ZXh0IHR4X2NvbnRleHRzW01BWF9UWF9VUkJTXTsKKworCXN0cnVjdCB1c2JfYW5jaG9yIHJ4X3N1Ym1pdHRlZDsKKworCXN0cnVjdCB1cmIgKmludHJfdXJiOworCisJdTggKnR4X21zZ19idWZmZXI7CisKKwl1OCAqaW50cl9pbl9idWZmZXI7CisJdW5zaWduZWQgaW50IGZyZWVfc2xvdHM7IC8qIHJlbWVtYmVyIG51bWJlciBvZiBhdmFpbGFibGUgc2xvdHMgKi8KKworCXN0cnVjdCBlbXNfY3BjX21zZyBhY3RpdmVfcGFyYW1zOyAvKiBhY3RpdmUgY29udHJvbGxlciBwYXJhbWV0ZXJzICovCit9OworCitzdGF0aWMgdm9pZCBlbXNfdXNiX3JlYWRfaW50ZXJydXB0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgZW1zX3VzYiAqZGV2ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXYtPm5ldGRldjsKKwlpbnQgZXJyOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChuZXRkZXYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlkZXYtPmZyZWVfc2xvdHMgPSBkZXYtPmludHJfaW5fYnVmZmVyWzFdOworCQlicmVhazsKKworCWNhc2UgLUVDT05OUkVTRVQ6IC8qIHVubGluayAqLworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCWRldl9pbmZvKG5ldGRldi0+ZGV2LnBhcmVudCwgIlJ4IGludGVycnVwdCBhYm9ydGVkICVkXG4iLAorCQkJIHVyYi0+c3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCisJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChlcnIgPT0gLUVOT0RFVikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCWVsc2UgaWYgKGVycikKKwkJZGV2X2VycihuZXRkZXYtPmRldi5wYXJlbnQsCisJCQkiZmFpbGVkIHJlc3VibWl0dGluZyBpbnRyIHVyYjogJWRcbiIsIGVycik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGVtc191c2JfcnhfY2FuX21zZyhzdHJ1Y3QgZW1zX3VzYiAqZGV2LCBzdHJ1Y3QgZW1zX2NwY19tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPm5ldGRldi0+c3RhdHM7CisKKwlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldi0+bmV0ZGV2LCBzaXplb2Yoc3RydWN0IGNhbl9mcmFtZSkpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0NBTik7CisKKwljZiA9IChzdHJ1Y3QgY2FuX2ZyYW1lICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgY2FuX2ZyYW1lKSk7CisKKwljZi0+Y2FuX2lkID0gbXNnLT5tc2cuY2FuX21zZy5pZDsKKwljZi0+Y2FuX2RsYyA9IG1pbl90KHU4LCBtc2ctPm1zZy5jYW5fbXNnLmxlbmd0aCwgOCk7CisKKwlpZiAobXNnLT50eXBlID09IENQQ19NU0dfVFlQRV9FWFRfQ0FOX0ZSQU1FCisJICAgIHx8IG1zZy0+dHlwZSA9PSBDUENfTVNHX1RZUEVfRVhUX1JUUl9GUkFNRSkKKwkJY2YtPmNhbl9pZCB8PSBDQU5fRUZGX0ZMQUc7CisKKwlpZiAobXNnLT50eXBlID09IENQQ19NU0dfVFlQRV9SVFJfRlJBTUUKKwkgICAgfHwgbXNnLT50eXBlID09IENQQ19NU0dfVFlQRV9FWFRfUlRSX0ZSQU1FKSB7CisJCWNmLT5jYW5faWQgfD0gQ0FOX1JUUl9GTEFHOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBjZi0+Y2FuX2RsYzsgaSsrKQorCQkJY2YtPmRhdGFbaV0gPSBtc2ctPm1zZy5jYW5fbXNnLm1zZ1tpXTsKKwl9CisKKwluZXRpZl9yeChza2IpOworCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gY2YtPmNhbl9kbGM7Cit9CisKK3N0YXRpYyB2b2lkIGVtc191c2JfcnhfZXJyKHN0cnVjdCBlbXNfdXNiICpkZXYsIHN0cnVjdCBlbXNfY3BjX21zZyAqbXNnKQoreworCXN0cnVjdCBjYW5fZnJhbWUgKmNmOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+bmV0ZGV2LT5zdGF0czsKKworCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LT5uZXRkZXYsIHNpemVvZihzdHJ1Y3QgY2FuX2ZyYW1lKSk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQ0FOKTsKKworCWNmID0gKHN0cnVjdCBjYW5fZnJhbWUgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBjYW5fZnJhbWUpKTsKKwltZW1zZXQoY2YsIDAsIHNpemVvZihzdHJ1Y3QgY2FuX2ZyYW1lKSk7CisKKwljZi0+Y2FuX2lkID0gQ0FOX0VSUl9GTEFHOworCWNmLT5jYW5fZGxjID0gQ0FOX0VSUl9ETEM7CisKKwlpZiAobXNnLT50eXBlID09IENQQ19NU0dfVFlQRV9DQU5fU1RBVEUpIHsKKwkJdTggc3RhdGUgPSBtc2ctPm1zZy5jYW5fc3RhdGU7CisKKwkJaWYgKHN0YXRlICYgU0pBMTAwMF9TUl9CUykgeworCQkJZGV2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfQlVTX09GRjsKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9CVVNPRkY7CisKKwkJCWNhbl9idXNfb2ZmKGRldi0+bmV0ZGV2KTsKKwkJfSBlbHNlIGlmIChzdGF0ZSAmIFNKQTEwMDBfU1JfRVMpIHsKKwkJCWRldi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkc7CisJCQlkZXYtPmNhbi5jYW5fc3RhdHMuZXJyb3Jfd2FybmluZysrOworCQl9IGVsc2UgeworCQkJZGV2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCQkJZGV2LT5jYW4uY2FuX3N0YXRzLmVycm9yX3Bhc3NpdmUrKzsKKwkJfQorCX0gZWxzZSBpZiAobXNnLT50eXBlID09IENQQ19NU0dfVFlQRV9DQU5fRlJBTUVfRVJST1IpIHsKKwkJdTggZWNjID0gbXNnLT5tc2cuZXJyb3IuY2MucmVncy5zamExMDAwLmVjYzsKKwkJdTggdHhlcnIgPSBtc2ctPm1zZy5lcnJvci5jYy5yZWdzLnNqYTEwMDAudHhlcnI7CisJCXU4IHJ4ZXJyID0gbXNnLT5tc2cuZXJyb3IuY2MucmVncy5zamExMDAwLnJ4ZXJyOworCisJCS8qIGJ1cyBlcnJvciBpbnRlcnJ1cHQgKi8KKwkJZGV2LT5jYW4uY2FuX3N0YXRzLmJ1c19lcnJvcisrOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisKKwkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1QgfCBDQU5fRVJSX0JVU0VSUk9SOworCisJCXN3aXRjaCAoZWNjICYgU0pBMTAwMF9FQ0NfTUFTSykgeworCQljYXNlIFNKQTEwMDBfRUNDX0JJVDoKKwkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9CSVQ7CisJCQlicmVhazsKKwkJY2FzZSBTSkExMDAwX0VDQ19GT1JNOgorCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX0ZPUk07CisJCQlicmVhazsKKwkJY2FzZSBTSkExMDAwX0VDQ19TVFVGRjoKKwkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9TVFVGRjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX1VOU1BFQzsKKwkJCWNmLT5kYXRhWzNdID0gZWNjICYgU0pBMTAwMF9FQ0NfU0VHOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBFcnJvciBvY2N1cmVkIGR1cmluZyB0cmFuc21pc3Npb24/ICovCisJCWlmICgoZWNjICYgU0pBMTAwMF9FQ0NfRElSKSA9PSAwKQorCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX1RYOworCisJCWlmIChkZXYtPmNhbi5zdGF0ZSA9PSBDQU5fU1RBVEVfRVJST1JfV0FSTklORyB8fAorCQkgICAgZGV2LT5jYW4uc3RhdGUgPT0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUpIHsKKwkJCWNmLT5kYXRhWzFdID0gKHR4ZXJyID4gcnhlcnIpID8KKwkJCSAgICBDQU5fRVJSX0NSVExfVFhfUEFTU0lWRSA6IENBTl9FUlJfQ1JUTF9SWF9QQVNTSVZFOworCQl9CisJfSBlbHNlIGlmIChtc2ctPnR5cGUgPT0gQ1BDX01TR19UWVBFX09WRVJSVU4pIHsKKwkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0NSVEw7CisJCWNmLT5kYXRhWzFdID0gQ0FOX0VSUl9DUlRMX1JYX09WRVJGTE9XOworCisJCXN0YXRzLT5yeF9vdmVyX2Vycm9ycysrOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJfQorCisJbmV0aWZfcngoc2tiKTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IGNmLT5jYW5fZGxjOworfQorCisvKgorICogY2FsbGJhY2sgZm9yIGJ1bGsgSU4gdXJiCisgKi8KK3N0YXRpYyB2b2lkIGVtc191c2JfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgZW1zX3VzYiAqZGV2ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJaW50IHJldHZhbDsKKworCW5ldGRldiA9IGRldi0+bmV0ZGV2OworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChuZXRkZXYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOiAvKiBzdWNjZXNzICovCisJCWJyZWFrOworCisJY2FzZSAtRU5PRU5UOgorCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQlkZXZfaW5mbyhuZXRkZXYtPmRldi5wYXJlbnQsICJSeCBVUkIgYWJvcnRlZCAoJWQpXG4iLAorCQkJIHVyYi0+c3RhdHVzKTsKKwkJZ290byByZXN1Ym1pdF91cmI7CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IENQQ19IRUFERVJfU0laRSkgeworCQlzdHJ1Y3QgZW1zX2NwY19tc2cgKm1zZzsKKwkJdTggKmlidWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwkJdTggbXNnX2NvdW50LCBhZ2Fpbiwgc3RhcnQ7CisKKwkJbXNnX2NvdW50ID0gaWJ1ZlswXSAmIH4weDgwOworCQlhZ2FpbiA9IGlidWZbMF0gJiAweDgwOworCisJCXN0YXJ0ID0gQ1BDX0hFQURFUl9TSVpFOworCisJCXdoaWxlIChtc2dfY291bnQpIHsKKwkJCW1zZyA9IChzdHJ1Y3QgZW1zX2NwY19tc2cgKikmaWJ1ZltzdGFydF07CisKKwkJCXN3aXRjaCAobXNnLT50eXBlKSB7CisJCQljYXNlIENQQ19NU0dfVFlQRV9DQU5fU1RBVEU6CisJCQkJLyogUHJvY2VzcyBDQU4gc3RhdGUgY2hhbmdlcyAqLworCQkJCWVtc191c2JfcnhfZXJyKGRldiwgbXNnKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDUENfTVNHX1RZUEVfQ0FOX0ZSQU1FOgorCQkJY2FzZSBDUENfTVNHX1RZUEVfRVhUX0NBTl9GUkFNRToKKwkJCWNhc2UgQ1BDX01TR19UWVBFX1JUUl9GUkFNRToKKwkJCWNhc2UgQ1BDX01TR19UWVBFX0VYVF9SVFJfRlJBTUU6CisJCQkJZW1zX3VzYl9yeF9jYW5fbXNnKGRldiwgbXNnKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDUENfTVNHX1RZUEVfQ0FOX0ZSQU1FX0VSUk9SOgorCQkJCS8qIFByb2Nlc3MgZXJyb3JmcmFtZSAqLworCQkJCWVtc191c2JfcnhfZXJyKGRldiwgbXNnKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDUENfTVNHX1RZUEVfT1ZFUlJVTjoKKwkJCQkvKiBNZXNzYWdlIGxvc3Qgd2hpbGUgcmVjZWl2aW5nICovCisJCQkJZW1zX3VzYl9yeF9lcnIoZGV2LCBtc2cpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzdGFydCArPSBDUENfTVNHX0hFQURFUl9MRU4gKyBtc2ctPmxlbmd0aDsKKwkJCW1zZ19jb3VudC0tOworCisJCQlpZiAoc3RhcnQgPiB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKKwkJCQlkZXZfZXJyKG5ldGRldi0+ZGV2LnBhcmVudCwgImZvcm1hdCBlcnJvclxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKK3Jlc3VibWl0X3VyYjoKKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIGRldi0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgMiksCisJCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBSWF9CVUZGRVJfU0laRSwKKwkJCSAgZW1zX3VzYl9yZWFkX2J1bGtfY2FsbGJhY2ssIGRldik7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisJaWYgKHJldHZhbCA9PSAtRU5PREVWKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJZWxzZSBpZiAocmV0dmFsKQorCQlkZXZfZXJyKG5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCSJmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgYnVsayB1cmI6ICVkXG4iLCByZXR2YWwpOworCisJcmV0dXJuOworfQorCisvKgorICogY2FsbGJhY2sgZm9yIGJ1bGsgSU4gdXJiCisgKi8KK3N0YXRpYyB2b2lkIGVtc191c2Jfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGVtc190eF91cmJfY29udGV4dCAqY29udGV4dCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZW1zX3VzYiAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwlCVUdfT04oIWNvbnRleHQpOworCisJZGV2ID0gY29udGV4dC0+ZGV2OworCW5ldGRldiA9IGRldi0+bmV0ZGV2OworCisJLyogZnJlZSB1cCBvdXIgYWxsb2NhdGVkIGJ1ZmZlciAqLworCXVzYl9idWZmZXJfZnJlZSh1cmItPmRldiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+dHJhbnNmZXJfZG1hKTsKKworCWF0b21pY19kZWMoJmRldi0+YWN0aXZlX3R4X3VyYnMpOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChuZXRkZXYpKQorCQlyZXR1cm47CisKKwlpZiAodXJiLT5zdGF0dXMpCisJCWRldl9pbmZvKG5ldGRldi0+ZGV2LnBhcmVudCwgIlR4IFVSQiBhYm9ydGVkICglZClcbiIsCisJCQkgdXJiLT5zdGF0dXMpOworCisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiB0cmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0ICovCisJbmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBjb250ZXh0LT5kbGM7CisKKwljYW5fZ2V0X2VjaG9fc2tiKG5ldGRldiwgY29udGV4dC0+ZWNob19pbmRleCk7CisKKwkvKiBSZWxlYXNlIGNvbnRleHQgKi8KKwljb250ZXh0LT5lY2hvX2luZGV4ID0gTUFYX1RYX1VSQlM7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7Cit9CisKKy8qCisgKiBTZW5kIHRoZSBnaXZlbiBDUEMgY29tbWFuZCBzeW5jaHJvbm91c2x5CisgKi8KK3N0YXRpYyBpbnQgZW1zX3VzYl9jb21tYW5kX21zZyhzdHJ1Y3QgZW1zX3VzYiAqZGV2LCBzdHJ1Y3QgZW1zX2NwY19tc2cgKm1zZykKK3sKKwlpbnQgYWN0dWFsX2xlbmd0aDsKKworCS8qIENvcHkgcGF5bG9hZCAqLworCW1lbWNweSgmZGV2LT50eF9tc2dfYnVmZmVyW0NQQ19IRUFERVJfU0laRV0sIG1zZywKKwkgICAgICAgbXNnLT5sZW5ndGggKyBDUENfTVNHX0hFQURFUl9MRU4pOworCisJLyogQ2xlYXIgaGVhZGVyICovCisJbWVtc2V0KCZkZXYtPnR4X21zZ19idWZmZXJbMF0sIDAsIENQQ19IRUFERVJfU0laRSk7CisKKwlyZXR1cm4gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwgMiksCisJCQkgICAgJmRldi0+dHhfbXNnX2J1ZmZlclswXSwKKwkJCSAgICBtc2ctPmxlbmd0aCArIENQQ19NU0dfSEVBREVSX0xFTiArIENQQ19IRUFERVJfU0laRSwKKwkJCSAgICAmYWN0dWFsX2xlbmd0aCwgMTAwMCk7Cit9CisKKy8qCisgKiBDaGFuZ2UgQ0FOIGNvbnRyb2xsZXJzJyBtb2RlIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbnQgZW1zX3VzYl93cml0ZV9tb2RlKHN0cnVjdCBlbXNfdXNiICpkZXYsIHU4IG1vZGUpCit7CisJZGV2LT5hY3RpdmVfcGFyYW1zLm1zZy5jYW5fcGFyYW1zLmNjX3BhcmFtcy5zamExMDAwLm1vZGUgPSBtb2RlOworCisJcmV0dXJuIGVtc191c2JfY29tbWFuZF9tc2coZGV2LCAmZGV2LT5hY3RpdmVfcGFyYW1zKTsKK30KKworLyoKKyAqIFNlbmQgYSBDUENfQ29udHJvbCBjb21tYW5kIHRvIGNoYW5nZSBiZWhhdmlvdXIgd2hlbiBpbnRlcmZhY2UgcmVjZWl2ZXMgYSBDQU4KKyAqIG1lc3NhZ2UsIGJ1cyBlcnJvciBvciBDQU4gc3RhdGUgY2hhbmdlZCBub3RpZmljYXRpb25zLgorICovCitzdGF0aWMgaW50IGVtc191c2JfY29udHJvbF9jbWQoc3RydWN0IGVtc191c2IgKmRldiwgdTggdmFsKQoreworCXN0cnVjdCBlbXNfY3BjX21zZyBjbWQ7CisKKwljbWQudHlwZSA9IENQQ19DTURfVFlQRV9DT05UUk9MOworCWNtZC5sZW5ndGggPSBDUENfTVNHX0hFQURFUl9MRU4gKyAxOworCisJY21kLm1zZ2lkID0gMDsKKworCWNtZC5tc2cuZ2VuZXJpY1swXSA9IHZhbDsKKworCXJldHVybiBlbXNfdXNiX2NvbW1hbmRfbXNnKGRldiwgJmNtZCk7Cit9CisKKy8qCisgKiBTdGFydCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBlbXNfdXNiX3N0YXJ0KHN0cnVjdCBlbXNfdXNiICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldi0+bmV0ZGV2OworCWludCBlcnIsIGk7CisKKwlkZXYtPmludHJfaW5fYnVmZmVyWzBdID0gMDsKKwlkZXYtPmZyZWVfc2xvdHMgPSAxNTsgLyogaW5pdGlhbCBzaXplICovCisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JYX1VSQlM7IGkrKykgeworCQlzdHJ1Y3QgdXJiICp1cmIgPSBOVUxMOworCQl1OCAqYnVmID0gTlVMTDsKKworCQkvKiBjcmVhdGUgYSBVUkIsIGFuZCBhIGJ1ZmZlciBmb3IgaXQgKi8KKwkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmIpIHsKKwkJCWRldl9lcnIobmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCSJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LT51ZGV2LCBSWF9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgICAgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKwkJaWYgKCFidWYpIHsKKwkJCWRldl9lcnIobmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCSJObyBtZW1vcnkgbGVmdCBmb3IgVVNCIGJ1ZmZlclxuIik7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIDIpLAorCQkJCSAgYnVmLCBSWF9CVUZGRVJfU0laRSwKKwkJCQkgIGVtc191c2JfcmVhZF9idWxrX2NhbGxiYWNrLCBkZXYpOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCQl1c2JfYW5jaG9yX3VyYih1cmIsICZkZXYtPnJ4X3N1Ym1pdHRlZCk7CisKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycikgeworCQkJaWYgKGVyciA9PSAtRU5PREVWKQorCQkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2LT5uZXRkZXYpOworCisJCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7CisJCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBSWF9CVUZGRVJfU0laRSwgYnVmLAorCQkJCQl1cmItPnRyYW5zZmVyX2RtYSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIERyb3AgcmVmZXJlbmNlLCBVU0IgY29yZSB3aWxsIHRha2UgY2FyZSBvZiBmcmVlaW5nIGl0ICovCisJCXVzYl9mcmVlX3VyYih1cmIpOworCX0KKworCS8qIERpZCB3ZSBzdWJtaXQgYW55IFVSQnMgKi8KKwlpZiAoaSA9PSAwKSB7CisJCWRldl93YXJuKG5ldGRldi0+ZGV2LnBhcmVudCwgImNvdWxkbid0IHNldHVwIHJlYWQgVVJCc1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogV2FybiBpZiB3ZSd2ZSBjb3VsZG4ndCB0cmFuc21pdCBhbGwgdGhlIFVSQnMgKi8KKwlpZiAoaSA8IE1BWF9SWF9VUkJTKQorCQlkZXZfd2FybihuZXRkZXYtPmRldi5wYXJlbnQsICJyeCBwZXJmb3JtYW5jZSBtYXkgYmUgc2xvd1xuIik7CisKKwkvKiBTZXR1cCBhbmQgc3RhcnQgaW50ZXJydXB0IFVSQiAqLworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRyX3VyYiwgZGV2LT51ZGV2LAorCQkJIHVzYl9yY3ZpbnRwaXBlKGRldi0+dWRldiwgMSksCisJCQkgZGV2LT5pbnRyX2luX2J1ZmZlciwKKwkJCSBJTlRSX0lOX0JVRkZFUl9TSVpFLAorCQkJIGVtc191c2JfcmVhZF9pbnRlcnJ1cHRfY2FsbGJhY2ssIGRldiwgMSk7CisKKwllcnIgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludHJfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVOT0RFVikKKwkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2LT5uZXRkZXYpOworCisJCWRldl93YXJuKG5ldGRldi0+ZGV2LnBhcmVudCwgImludHIgVVJCIHN1Ym1pdCBmYWlsZWQ6ICVkXG4iLAorCQkJIGVycik7CisKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBDUEMtVVNCIHdpbGwgdHJhbnNmZXIgcmVjZWl2ZWQgbWVzc2FnZSB0byBob3N0ICovCisJZXJyID0gZW1zX3VzYl9jb250cm9sX2NtZChkZXYsIENPTlRSX0NBTl9NRVNTQUdFIHwgQ09OVFJfQ09OVF9PTik7CisJaWYgKGVycikKKwkJZ290byBmYWlsZWQ7CisKKwkvKiBDUEMtVVNCIHdpbGwgdHJhbnNmZXIgQ0FOIHN0YXRlIGNoYW5nZXMgdG8gaG9zdCAqLworCWVyciA9IGVtc191c2JfY29udHJvbF9jbWQoZGV2LCBDT05UUl9DQU5fU1RBVEUgfCBDT05UUl9DT05UX09OKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxlZDsKKworCS8qIENQQy1VU0Igd2lsbCB0cmFuc2ZlciBidXMgZXJyb3JzIHRvIGhvc3QgKi8KKwllcnIgPSBlbXNfdXNiX2NvbnRyb2xfY21kKGRldiwgQ09OVFJfQlVTX0VSUk9SIHwgQ09OVFJfQ09OVF9PTik7CisJaWYgKGVycikKKwkJZ290byBmYWlsZWQ7CisKKwllcnIgPSBlbXNfdXNiX3dyaXRlX21vZGUoZGV2LCBTSkExMDAwX01PRF9OT1JNQUwpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbGVkOworCisJZGV2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwlpZiAoZXJyID09IC1FTk9ERVYpCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2LT5uZXRkZXYpOworCisJZGV2X3dhcm4obmV0ZGV2LT5kZXYucGFyZW50LCAiY291bGRuJ3Qgc3VibWl0IGNvbnRyb2w6ICVkXG4iLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdW5saW5rX2FsbF91cmJzKHN0cnVjdCBlbXNfdXNiICpkZXYpCit7CisJaW50IGk7CisKKwl1c2JfdW5saW5rX3VyYihkZXYtPmludHJfdXJiKTsKKworCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldi0+cnhfc3VibWl0dGVkKTsKKworCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRldi0+dHhfc3VibWl0dGVkKTsKKwlhdG9taWNfc2V0KCZkZXYtPmFjdGl2ZV90eF91cmJzLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVFhfVVJCUzsgaSsrKQorCQlkZXYtPnR4X2NvbnRleHRzW2ldLmVjaG9faW5kZXggPSBNQVhfVFhfVVJCUzsKK30KKworc3RhdGljIGludCBlbXNfdXNiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW1zX3VzYiAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgZXJyOworCisJZXJyID0gZW1zX3VzYl93cml0ZV9tb2RlKGRldiwgU0pBMTAwMF9NT0RfUk0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBjb21tb24gb3BlbiAqLworCWVyciA9IG9wZW5fY2FuZGV2KG5ldGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIGZpbmFsbHkgc3RhcnQgZGV2aWNlICovCisJZXJyID0gZW1zX3VzYl9zdGFydChkZXYpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU5PREVWKQorCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYtPm5ldGRldik7CisKKwkJZGV2X3dhcm4obmV0ZGV2LT5kZXYucGFyZW50LCAiY291bGRuJ3Qgc3RhcnQgZGV2aWNlOiAlZFxuIiwKKwkJCSBlcnIpOworCisJCWNsb3NlX2NhbmRldihuZXRkZXYpOworCisJCXJldHVybiBlcnI7CisJfQorCisJZGV2LT5vcGVuX3RpbWUgPSBqaWZmaWVzOworCisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgbmV0ZGV2X3R4X3QgZW1zX3VzYl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVtc191c2IgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGVtc190eF91cmJfY29udGV4dCAqY29udGV4dCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm5ldGRldi0+c3RhdHM7CisJc3RydWN0IGNhbl9mcmFtZSAqY2YgPSAoc3RydWN0IGNhbl9mcmFtZSAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgZW1zX2NwY19tc2cgKm1zZzsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJdTggKmJ1ZjsKKwlpbnQgaSwgZXJyOworCXNpemVfdCBzaXplID0gQ1BDX0hFQURFUl9TSVpFICsgQ1BDX01TR19IRUFERVJfTEVOCisJCQkrIHNpemVvZihzdHJ1Y3QgY3BjX2Nhbl9tc2cpOworCisJLyogY3JlYXRlIGEgVVJCLCBhbmQgYSBidWZmZXIgZm9yIGl0LCBhbmQgY29weSB0aGUgZGF0YSB0byB0aGUgVVJCICovCisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXVyYikgeworCQlkZXZfZXJyKG5ldGRldi0+ZGV2LnBhcmVudCwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKKwkJZ290byBub21lbTsKKwl9CisKKwlidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldi0+dWRldiwgc2l6ZSwgR0ZQX0FUT01JQywgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKwlpZiAoIWJ1ZikgeworCQlkZXZfZXJyKG5ldGRldi0+ZGV2LnBhcmVudCwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVU0IgYnVmZmVyXG4iKTsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCWdvdG8gbm9tZW07CisJfQorCisJbXNnID0gKHN0cnVjdCBlbXNfY3BjX21zZyAqKSZidWZbQ1BDX0hFQURFUl9TSVpFXTsKKworCW1zZy0+bXNnLmNhbl9tc2cuaWQgPSBjZi0+Y2FuX2lkICYgQ0FOX0VSUl9NQVNLOworCW1zZy0+bXNnLmNhbl9tc2cubGVuZ3RoID0gY2YtPmNhbl9kbGM7CisKKwlpZiAoY2YtPmNhbl9pZCAmIENBTl9SVFJfRkxBRykgeworCQltc2ctPnR5cGUgPSBjZi0+Y2FuX2lkICYgQ0FOX0VGRl9GTEFHID8KKwkJCUNQQ19DTURfVFlQRV9FWFRfUlRSX0ZSQU1FIDogQ1BDX0NNRF9UWVBFX1JUUl9GUkFNRTsKKworCQltc2ctPmxlbmd0aCA9IENQQ19DQU5fTVNHX01JTl9TSVpFOworCX0gZWxzZSB7CisJCW1zZy0+dHlwZSA9IGNmLT5jYW5faWQgJiBDQU5fRUZGX0ZMQUcgPworCQkJQ1BDX0NNRF9UWVBFX0VYVF9DQU5fRlJBTUUgOiBDUENfQ01EX1RZUEVfQ0FOX0ZSQU1FOworCisJCWZvciAoaSA9IDA7IGkgPCBjZi0+Y2FuX2RsYzsgaSsrKQorCQkJbXNnLT5tc2cuY2FuX21zZy5tc2dbaV0gPSBjZi0+ZGF0YVtpXTsKKworCQltc2ctPmxlbmd0aCA9IENQQ19DQU5fTVNHX01JTl9TSVpFICsgY2YtPmNhbl9kbGM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9UWF9VUkJTOyBpKyspIHsKKwkJaWYgKGRldi0+dHhfY29udGV4dHNbaV0uZWNob19pbmRleCA9PSBNQVhfVFhfVVJCUykgeworCQkJY29udGV4dCA9ICZkZXYtPnR4X2NvbnRleHRzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIE1heSBuZXZlciBoYXBwZW4hIFdoZW4gdGhpcyBoYXBwZW5zIHdlJ2QgbW9yZSBVUkJzIGluIGZsaWdodCBhcworCSAqIGFsbG93ZWQgKE1BWF9UWF9VUkJTKS4KKwkgKi8KKwlpZiAoIWNvbnRleHQpIHsKKwkJdXNiX3VuYW5jaG9yX3VyYih1cmIpOworCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBzaXplLCBidWYsIHVyYi0+dHJhbnNmZXJfZG1hKTsKKworCQlkZXZfd2FybihuZXRkZXYtPmRldi5wYXJlbnQsICJjb3VsZG4ndCBmaW5kIGZyZWUgY29udGV4dFxuIik7CisKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWNvbnRleHQtPmRldiA9IGRldjsKKwljb250ZXh0LT5lY2hvX2luZGV4ID0gaTsKKwljb250ZXh0LT5kbGMgPSBjZi0+Y2FuX2RsYzsKKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgZGV2LT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCAyKSwgYnVmLAorCQkJICBzaXplLCBlbXNfdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2ssIGNvbnRleHQpOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJdXNiX2FuY2hvcl91cmIodXJiLCAmZGV2LT50eF9zdWJtaXR0ZWQpOworCisJY2FuX3B1dF9lY2hvX3NrYihza2IsIG5ldGRldiwgY29udGV4dC0+ZWNob19pbmRleCk7CisKKwlhdG9taWNfaW5jKCZkZXYtPmFjdGl2ZV90eF91cmJzKTsKKworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJY2FuX2ZyZWVfZWNob19za2IobmV0ZGV2LCBjb250ZXh0LT5lY2hvX2luZGV4KTsKKworCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7CisJCXVzYl9idWZmZXJfZnJlZShkZXYtPnVkZXYsIHNpemUsIGJ1ZiwgdXJiLT50cmFuc2Zlcl9kbWEpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkJYXRvbWljX2RlYygmZGV2LT5hY3RpdmVfdHhfdXJicyk7CisKKwkJaWYgKGVyciA9PSAtRU5PREVWKSB7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybihuZXRkZXYtPmRldi5wYXJlbnQsICJmYWlsZWQgdHhfdXJiICVkXG4iLCBlcnIpOworCisJCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQl9CisJfSBlbHNlIHsKKwkJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkJLyogU2xvdyBkb3duIHR4IHBhdGggKi8KKwkJaWYgKGF0b21pY19yZWFkKCZkZXYtPmFjdGl2ZV90eF91cmJzKSA+PSBNQVhfVFhfVVJCUyB8fAorCQkgICAgZGV2LT5mcmVlX3Nsb3RzIDwgNSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQl9CisJfQorCisJLyoKKwkgKiBSZWxlYXNlIG91ciByZWZlcmVuY2UgdG8gdGhpcyBVUkIsIHRoZSBVU0IgY29yZSB3aWxsIGV2ZW50dWFsbHkgZnJlZQorCSAqIGl0IGVudGlyZWx5LgorCSAqLworCXVzYl9mcmVlX3VyYih1cmIpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworbm9tZW06CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBpbnQgZW1zX3VzYl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbXNfdXNiICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogU3RvcCBwb2xsaW5nICovCisJdW5saW5rX2FsbF91cmJzKGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiBTZXQgQ0FOIGNvbnRyb2xsZXIgdG8gcmVzZXQgbW9kZSAqLworCWlmIChlbXNfdXNiX3dyaXRlX21vZGUoZGV2LCBTSkExMDAwX01PRF9STSkpCisJCWRldl93YXJuKG5ldGRldi0+ZGV2LnBhcmVudCwgImNvdWxkbid0IHN0b3AgZGV2aWNlIik7CisKKwljbG9zZV9jYW5kZXYobmV0ZGV2KTsKKworCWRldi0+b3Blbl90aW1lID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGVtc191c2JfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gPSBlbXNfdXNiX29wZW4sCisJLm5kb19zdG9wID0gZW1zX3VzYl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQgPSBlbXNfdXNiX3N0YXJ0X3htaXQsCit9OworCitzdGF0aWMgc3RydWN0IGNhbl9iaXR0aW1pbmdfY29uc3QgZW1zX3VzYl9iaXR0aW1pbmdfY29uc3QgPSB7CisJLm5hbWUgPSAiZW1zX3VzYiIsCisJLnRzZWcxX21pbiA9IDEsCisJLnRzZWcxX21heCA9IDE2LAorCS50c2VnMl9taW4gPSAxLAorCS50c2VnMl9tYXggPSA4LAorCS5zandfbWF4ID0gNCwKKwkuYnJwX21pbiA9IDEsCisJLmJycF9tYXggPSA2NCwKKwkuYnJwX2luYyA9IDEsCit9OworCitzdGF0aWMgaW50IGVtc191c2Jfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgZW51bSBjYW5fbW9kZSBtb2RlKQoreworCXN0cnVjdCBlbXNfdXNiICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKCFkZXYtPm9wZW5fdGltZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENBTl9NT0RFX1NUQVJUOgorCQlpZiAoZW1zX3VzYl93cml0ZV9tb2RlKGRldiwgU0pBMTAwMF9NT0RfTk9STUFMKSkKKwkJCWRldl93YXJuKG5ldGRldi0+ZGV2LnBhcmVudCwgImNvdWxkbid0IHN0YXJ0IGRldmljZSIpOworCisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikpCisJCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtc191c2Jfc2V0X2JpdHRpbWluZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbXNfdXNiICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBjYW5fYml0dGltaW5nICpidCA9ICZkZXYtPmNhbi5iaXR0aW1pbmc7CisJdTggYnRyMCwgYnRyMTsKKworCWJ0cjAgPSAoKGJ0LT5icnAgLSAxKSAmIDB4M2YpIHwgKCgoYnQtPnNqdyAtIDEpICYgMHgzKSA8PCA2KTsKKwlidHIxID0gKChidC0+cHJvcF9zZWcgKyBidC0+cGhhc2Vfc2VnMSAtIDEpICYgMHhmKSB8CisJCSgoKGJ0LT5waGFzZV9zZWcyIC0gMSkgJiAweDcpIDw8IDQpOworCWlmIChkZXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV8zX1NBTVBMRVMpCisJCWJ0cjEgfD0gMHg4MDsKKworCWRldl9pbmZvKG5ldGRldi0+ZGV2LnBhcmVudCwgInNldHRpbmcgQlRSMD0weCUwMnggQlRSMT0weCUwMnhcbiIsCisJCSBidHIwLCBidHIxKTsKKworCWRldi0+YWN0aXZlX3BhcmFtcy5tc2cuY2FuX3BhcmFtcy5jY19wYXJhbXMuc2phMTAwMC5idHIwID0gYnRyMDsKKwlkZXYtPmFjdGl2ZV9wYXJhbXMubXNnLmNhbl9wYXJhbXMuY2NfcGFyYW1zLnNqYTEwMDAuYnRyMSA9IGJ0cjE7CisKKwlyZXR1cm4gZW1zX3VzYl9jb21tYW5kX21zZyhkZXYsICZkZXYtPmFjdGl2ZV9wYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3BhcmFtc19zamExMDAwKHN0cnVjdCBlbXNfY3BjX21zZyAqbXNnKQoreworCXN0cnVjdCBjcGNfc2phMTAwMF9wYXJhbXMgKnNqYTEwMDAgPQorCQkmbXNnLT5tc2cuY2FuX3BhcmFtcy5jY19wYXJhbXMuc2phMTAwMDsKKworCW1zZy0+dHlwZSA9IENQQ19DTURfVFlQRV9DQU5fUEFSQU1TOworCW1zZy0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBjcGNfY2FuX3BhcmFtcyk7CisJbXNnLT5tc2dpZCA9IDA7CisKKwltc2ctPm1zZy5jYW5fcGFyYW1zLmNjX3R5cGUgPSBDUENfQ0NfVFlQRV9TSkExMDAwOworCisJLyogQWNjZXB0YW5jZSBmaWx0ZXIgb3BlbiAqLworCXNqYTEwMDAtPmFjY19jb2RlMCA9IDB4MDA7CisJc2phMTAwMC0+YWNjX2NvZGUxID0gMHgwMDsKKwlzamExMDAwLT5hY2NfY29kZTIgPSAweDAwOworCXNqYTEwMDAtPmFjY19jb2RlMyA9IDB4MDA7CisKKwkvKiBBY2NlcHRhbmNlIGZpbHRlciBvcGVuICovCisJc2phMTAwMC0+YWNjX21hc2swID0gMHhGRjsKKwlzamExMDAwLT5hY2NfbWFzazEgPSAweEZGOworCXNqYTEwMDAtPmFjY19tYXNrMiA9IDB4RkY7CisJc2phMTAwMC0+YWNjX21hc2szID0gMHhGRjsKKworCXNqYTEwMDAtPmJ0cjAgPSAwOworCXNqYTEwMDAtPmJ0cjEgPSAwOworCisJc2phMTAwMC0+b3V0cF9jb250ciA9IFNKQTEwMDBfREVGQVVMVF9PVVRQVVRfQ09OVFJPTDsKKwlzamExMDAwLT5tb2RlID0gU0pBMTAwMF9NT0RfUk07Cit9CisKKy8qCisgKiBwcm9iZSBmdW5jdGlvbiBmb3IgbmV3IENQQy1VU0IgZGV2aWNlcworICovCitzdGF0aWMgaW50IGVtc191c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGVtc191c2IgKmRldjsKKwlpbnQgaSwgZXJyID0gLUVOT01FTTsKKworCW5ldGRldiA9IGFsbG9jX2NhbmRldihzaXplb2Yoc3RydWN0IGVtc191c2IpKTsKKwlpZiAoIW5ldGRldikgeworCQlkZXZfZXJyKG5ldGRldi0+ZGV2LnBhcmVudCwgIkNvdWxkbid0IGFsbG9jIGNhbmRldlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlkZXYtPnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWRldi0+bmV0ZGV2ID0gbmV0ZGV2OworCisJZGV2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfU1RPUFBFRDsKKwlkZXYtPmNhbi5jbG9jay5mcmVxID0gRU1TX1VTQl9BUk03X0NMT0NLOworCWRldi0+Y2FuLmJpdHRpbWluZ19jb25zdCA9ICZlbXNfdXNiX2JpdHRpbWluZ19jb25zdDsKKwlkZXYtPmNhbi5kb19zZXRfYml0dGltaW5nID0gZW1zX3VzYl9zZXRfYml0dGltaW5nOworCWRldi0+Y2FuLmRvX3NldF9tb2RlID0gZW1zX3VzYl9zZXRfbW9kZTsKKworCW5ldGRldi0+ZmxhZ3MgfD0gSUZGX0VDSE87IC8qIHdlIHN1cHBvcnQgbG9jYWwgZWNobyAqLworCisJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmVtc191c2JfbmV0ZGV2X29wczsKKworCW5ldGRldi0+ZmxhZ3MgfD0gSUZGX0VDSE87IC8qIHdlIHN1cHBvcnQgbG9jYWwgZWNobyAqLworCisJaW5pdF91c2JfYW5jaG9yKCZkZXYtPnJ4X3N1Ym1pdHRlZCk7CisKKwlpbml0X3VzYl9hbmNob3IoJmRldi0+dHhfc3VibWl0dGVkKTsKKwlhdG9taWNfc2V0KCZkZXYtPmFjdGl2ZV90eF91cmJzLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVFhfVVJCUzsgaSsrKQorCQlkZXYtPnR4X2NvbnRleHRzW2ldLmVjaG9faW5kZXggPSBNQVhfVFhfVVJCUzsKKworCWRldi0+aW50cl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRyX3VyYikgeworCQlkZXZfZXJyKG5ldGRldi0+ZGV2LnBhcmVudCwgIkNvdWxkbid0IGFsbG9jIGludHIgVVJCXG4iKTsKKwkJZ290byBjbGVhbnVwX2NhbmRldjsKKwl9CisKKwlkZXYtPmludHJfaW5fYnVmZmVyID0ga3phbGxvYyhJTlRSX0lOX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50cl9pbl9idWZmZXIpIHsKKwkJZGV2X2VycihuZXRkZXYtPmRldi5wYXJlbnQsICJDb3VsZG4ndCBhbGxvYyBJbnRyIGJ1ZmZlclxuIik7CisJCWdvdG8gY2xlYW51cF9pbnRyX3VyYjsKKwl9CisKKwlkZXYtPnR4X21zZ19idWZmZXIgPSBremFsbG9jKENQQ19IRUFERVJfU0laRSArCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGVtc19jcGNfbXNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPnR4X21zZ19idWZmZXIpIHsKKwkJZGV2X2VycihuZXRkZXYtPmRldi5wYXJlbnQsICJDb3VsZG4ndCBhbGxvYyBUeCBidWZmZXJcbiIpOworCQlnb3RvIGNsZWFudXBfaW50cl9pbl9idWZmZXI7CisJfQorCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkZXYpOworCisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmaW50Zi0+ZGV2KTsKKworCWluaXRfcGFyYW1zX3NqYTEwMDAoJmRldi0+YWN0aXZlX3BhcmFtcyk7CisKKwllcnIgPSBlbXNfdXNiX2NvbW1hbmRfbXNnKGRldiwgJmRldi0+YWN0aXZlX3BhcmFtcyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKG5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCSJjb3VsZG4ndCBpbml0aWFsaXplIGNvbnRyb2xsZXI6ICVkXG4iLCBlcnIpOworCQlnb3RvIGNsZWFudXBfdHhfbXNnX2J1ZmZlcjsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9jYW5kZXYobmV0ZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIobmV0ZGV2LT5kZXYucGFyZW50LAorCQkJImNvdWxkbid0IHJlZ2lzdGVyIENBTiBkZXZpY2U6ICVkXG4iLCBlcnIpOworCQlnb3RvIGNsZWFudXBfdHhfbXNnX2J1ZmZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW51cF90eF9tc2dfYnVmZmVyOgorCWtmcmVlKGRldi0+dHhfbXNnX2J1ZmZlcik7CisKK2NsZWFudXBfaW50cl9pbl9idWZmZXI6CisJa2ZyZWUoZGV2LT5pbnRyX2luX2J1ZmZlcik7CisKK2NsZWFudXBfaW50cl91cmI6CisJdXNiX2ZyZWVfdXJiKGRldi0+aW50cl91cmIpOworCitjbGVhbnVwX2NhbmRldjoKKwlmcmVlX2NhbmRldihuZXRkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtCisgKi8KK3N0YXRpYyB2b2lkIGVtc191c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZW1zX3VzYiAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlpZiAoZGV2KSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldi0+bmV0ZGV2KTsKKwkJZnJlZV9jYW5kZXYoZGV2LT5uZXRkZXYpOworCisJCXVubGlua19hbGxfdXJicyhkZXYpOworCisJCXVzYl9mcmVlX3VyYihkZXYtPmludHJfdXJiKTsKKworCQlrZnJlZShkZXYtPmludHJfaW5fYnVmZmVyKTsKKwl9Cit9CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBlbXNfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJlbXNfdXNiIiwKKwkucHJvYmUgPSBlbXNfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZW1zX3VzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9IGVtc191c2JfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlbXNfdXNiX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ1BDLVVTQiBrZXJuZWwgZHJpdmVyIGxvYWRlZFxuIik7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJZXJyID0gdXNiX3JlZ2lzdGVyKCZlbXNfdXNiX2RyaXZlcik7CisKKwlpZiAoZXJyKSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZW1zX3VzYl9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmVtc191c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZW1zX3VzYl9pbml0KTsKK21vZHVsZV9leGl0KGVtc191c2JfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jbmljLmMgYi9kcml2ZXJzL25ldC9jbmljLmMKaW5kZXggZDQ1ZWFjYi4uM2JmMWIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2NuaWMuYwpAQCAtODUsOCArODUsNiBAQAogCiAJY3AtPnVpb19kZXYgPSBpbWlub3IoaW5vZGUpOwogCi0JY25pY19zaHV0ZG93bl9ibngyX3J4X3JpbmcoZGV2KTsKLQogCWNuaWNfaW5pdF9ibngyX3R4X3JpbmcoZGV2KTsKIAljbmljX2luaXRfYm54Ml9yeF9yaW5nKGRldik7CiAKQEAgLTk4LDYgKzk2LDggQEAKIAlzdHJ1Y3QgY25pY19kZXYgKmRldiA9IHVpbmZvLT5wcml2OwogCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OwogCisJY25pY19zaHV0ZG93bl9ibngyX3J4X3JpbmcoZGV2KTsKKwogCWNwLT51aW9fZGV2ID0gLTE7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjY0LDkgKzIyNjQsOSBAQAogCWNuaWNfY3R4X3dyKGRldiwgY2lkX2FkZHIsIEJOWDJfTDJDVFhfQ1RYX1RZUEUsIHZhbCk7CiAKIAlpZiAoc2JfaWQgPT0gMCkKLQkJdmFsID0gMiA8PCBCTlgyX0wyQ1RYX1NUQVRVU0JfTlVNX1NISUZUOworCQl2YWwgPSAyIDw8IEJOWDJfTDJDVFhfTDJfU1RBVFVTQl9OVU1fU0hJRlQ7CiAJZWxzZQotCQl2YWwgPSBCTlgyX0wyQ1RYX1NUQVRVU0JfTlVNKHNiX2lkKTsKKwkJdmFsID0gQk5YMl9MMkNUWF9MMl9TVEFUVVNCX05VTShzYl9pZCk7CiAJY25pY19jdHhfd3IoZGV2LCBjaWRfYWRkciwgQk5YMl9MMkNUWF9IT1NUX0JESURYLCB2YWwpOwogCiAJcnhiZCA9IChzdHJ1Y3QgcnhfYmQgKikgKGNwLT5sMl9yaW5nICsgQkNNX1BBR0VfU0laRSk7CkBAIC0yNDIzLDcgKzI0MjMsNyBAQAogCWNwLT5pbnRfbnVtID0gMDsKIAlpZiAoZXRoZGV2LT5kcnZfc3RhdGUgJiBDTklDX0RSVl9TVEFURV9VU0lOR19NU0lYKSB7CiAJCXUzMiBzYl9pZCA9IGNwLT5zdGF0dXNfYmxrX251bTsKLQkJdTMyIHNiID0gQk5YMl9MMkNUWF9TVEFUVVNCX05VTShzYl9pZCk7CisJCXUzMiBzYiA9IEJOWDJfTDJDVFhfTDVfU1RBVFVTQl9OVU0oc2JfaWQpOwogCiAJCWNwLT5pbnRfbnVtID0gc2JfaWQgPDwgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfSU5UX05VTV9TSElGVDsKIAkJY25pY19jdHhfd3IoZGV2LCBjcC0+a3dxX2NpZF9hZGRyLCBMNV9LUk5MUV9IT1NUX1FJRFgsIHNiKTsKQEAgLTI3MzMsNyArMjczMyw4IEBACiAJCQljbmljX3VscF9pbml0KGRldik7CiAJCWVsc2UgaWYgKGV2ZW50ID09IE5FVERFVl9VTlJFR0lTVEVSKQogCQkJY25pY191bHBfZXhpdChkZXYpOwotCQllbHNlIGlmIChldmVudCA9PSBORVRERVZfVVApIHsKKworCQlpZiAoZXZlbnQgPT0gTkVUREVWX1VQKSB7CiAJCQlpZiAoY25pY19yZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CiAJCQkJY25pY19wdXQoZGV2KTsKIAkJCQlnb3RvIGRvbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jbmljX2lmLmggYi9kcml2ZXJzL25ldC9jbmljX2lmLmgKaW5kZXggYTQ5MjM1Ny4uZDhiMDllZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY25pY19pZi5oCisrKyBiL2RyaXZlcnMvbmV0L2NuaWNfaWYuaApAQCAtMTIsOCArMTIsOCBAQAogI2lmbmRlZiBDTklDX0lGX0gKICNkZWZpbmUgQ05JQ19JRl9ICiAKLSNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi4wLjAiCi0jZGVmaW5lIENOSUNfTU9EVUxFX1JFTERBVEUJIk1heSAyMSwgMjAwOSIKKyNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi4wLjEiCisjZGVmaW5lIENOSUNfTU9EVUxFX1JFTERBVEUJIk9jdCAwMSwgMjAwOSIKIAogI2RlZmluZSBDTklDX1VMUF9SRE1BCQkwCiAjZGVmaW5lIENOSUNfVUxQX0lTQ1NJCQkxCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcG1hYy5jIGIvZHJpdmVycy9uZXQvY3BtYWMuYwppbmRleCAzZTNmYWI4Li42MWY5ZGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jcG1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2NwbWFjLmMKQEAgLTExMDksNyArMTEwOSw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjcG1hY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByYywgcGh5X2lkOwotCWNoYXIgbWRpb19idXNfaWRbQlVTX0lEX1NJWkVdOworCWNoYXIgbWRpb19idXNfaWRbTUlJX0JVU19JRF9TSVpFXTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAlzdHJ1Y3QgY3BtYWNfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMTExOCw3ICsxMTE4LDcgQEAKIAlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJaWYgKGV4dGVybmFsX3N3aXRjaCB8fCBkdW1iX3N3aXRjaCkgewotCQlzdHJuY3B5KG1kaW9fYnVzX2lkLCAiMCIsIEJVU19JRF9TSVpFKTsgLyogZml4ZWQgcGh5cyBidXMgKi8KKwkJc3RybmNweShtZGlvX2J1c19pZCwgIjAiLCBNSUlfQlVTX0lEX1NJWkUpOyAvKiBmaXhlZCBwaHlzIGJ1cyAqLwogCQlwaHlfaWQgPSBwZGV2LT5pZDsKIAl9IGVsc2UgewogCQlmb3IgKHBoeV9pZCA9IDA7IHBoeV9pZCA8IFBIWV9NQVhfQUREUjsgcGh5X2lkKyspIHsKQEAgLTExMjYsNyArMTEyNiw3IEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoIWNwbWFjX21paS0+cGh5X21hcFtwaHlfaWRdKQogCQkJCWNvbnRpbnVlOwotCQkJc3RybmNweShtZGlvX2J1c19pZCwgY3BtYWNfbWlpLT5pZCwgQlVTX0lEX1NJWkUpOworCQkJc3RybmNweShtZGlvX2J1c19pZCwgY3BtYWNfbWlpLT5pZCwgTUlJX0JVU19JRF9TSVpFKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTE2Nyw3ICsxMTY3LDcgQEAKIAlwcml2LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWdfbGV2ZWwsIDB4ZmYpOwogCW1lbWNweShkZXYtPmRldl9hZGRyLCBwZGF0YS0+ZGV2X2FkZHIsIHNpemVvZihkZXYtPmRldl9hZGRyKSk7CiAKLQlzbnByaW50Zihwcml2LT5waHlfbmFtZSwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsIG1kaW9fYnVzX2lkLCBwaHlfaWQpOworCXNucHJpbnRmKHByaXYtPnBoeV9uYW1lLCBNSUlfQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsIG1kaW9fYnVzX2lkLCBwaHlfaWQpOwogCiAJcHJpdi0+cGh5ID0gcGh5X2Nvbm5lY3QoZGV2LCBwcml2LT5waHlfbmFtZSwgJmNwbWFjX2FkanVzdF9saW5rLCAwLAogCQkJCQkJUEhZX0lOVEVSRkFDRV9NT0RFX01JSSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCmluZGV4IDE1YzAxOTUuLmEyNGJlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCisrKyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCkBAIC03NjgsMTAgKzc2OCwyNCBAQAogCiAJZTEwMF9zZXRfbWRpb19yZWcoZGV2LCBucC0+bWlpX2lmLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwgZGF0YSk7CiAKLQkvKiBSZW5lZ290aWF0ZSB3aXRoIGxpbmsgcGFydG5lciAqLworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG5wLT5taWlfaWYucGh5X2lkLCBNSUlfQk1DUik7CiAJaWYgKGF1dG9uZWdfbm9ybWFsKSB7Ci0JICBkYXRhID0gZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBucC0+bWlpX2lmLnBoeV9pZCwgTUlJX0JNQ1IpOwotCWRhdGEgfD0gQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUOworCQkvKiBSZW5lZ290aWF0ZSB3aXRoIGxpbmsgcGFydG5lciAqLworCQlkYXRhIHw9IEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVDsKKwl9IGVsc2UgeworCQkvKiBEb24ndCBuZWdvdGlhdGUgc3BlZWQgb3IgZHVwbGV4ICovCisJCWRhdGEgJj0gfihCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCisJCS8qIFNldCBzcGVlZCBhbmQgZHVwbGV4IHN0YXRpYyAqLworCQlpZiAoY3VycmVudF9zcGVlZF9zZWxlY3Rpb24gPT0gMTApCisJCQlkYXRhICY9IH5CTUNSX1NQRUVEMTAwOworCQllbHNlCisJCQlkYXRhIHw9IEJNQ1JfU1BFRUQxMDA7CisKKwkJaWYgKGN1cnJlbnRfZHVwbGV4ICE9IGZ1bGwpCisJCQlkYXRhICY9IH5CTUNSX0ZVTExEUExYOworCQllbHNlCisJCQlkYXRhIHw9IEJNQ1JfRlVMTERQTFg7CiAJfQogCWUxMDBfc2V0X21kaW9fcmVnKGRldiwgbnAtPm1paV9pZi5waHlfaWQsIE1JSV9CTUNSLCBkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RhdmluY2lfZW1hYy5jIGIvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKaW5kZXggZDQ2NWVhYS4uZjcyYzU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKQEAgLTIwMCw2ICsyMDAsOSBAQAogLyoqIE5PVEU6OiBGb3IgRE02NDZ4IHRoZSBJTl9WRUNUT1IgaGFzIGNoYW5nZWQgKi8KICNkZWZpbmUgRU1BQ19ETTY0NlhfTUFDX0lOX1ZFQ1RPUl9SWF9JTlRfVkVDCUJJVChFTUFDX0RFRl9SWF9DSCkKICNkZWZpbmUgRU1BQ19ETTY0NlhfTUFDX0lOX1ZFQ1RPUl9UWF9JTlRfVkVDCUJJVCgxNiArIEVNQUNfREVGX1RYX0NIKQorI2RlZmluZSBFTUFDX0RNNjQ2WF9NQUNfSU5fVkVDVE9SX0hPU1RfSU5UCUJJVCgyNikKKyNkZWZpbmUgRU1BQ19ETTY0NlhfTUFDX0lOX1ZFQ1RPUl9TVEFUUEVORF9JTlQJQklUKDI3KQorCiAKIC8qIENQUEkgYml0IHBvc2l0aW9ucyAqLwogI2RlZmluZSBFTUFDX0NQUElfU09QX0JJVAkJQklUKDMxKQpAQCAtMzMwLDYgKzMzMyw5IEBACiAjZGVmaW5lIEVNQUNfRE02NDZYX01BQ19FT0lfQzBfUlhFTgkoMHgwMSkKICNkZWZpbmUgRU1BQ19ETTY0NlhfTUFDX0VPSV9DMF9UWEVOCSgweDAyKQogCisvKiBFTUFDIFN0YXRzIENsZWFyIE1hc2sgKi8KKyNkZWZpbmUgRU1BQ19TVEFUU19DTFJfTUFTSyAgICAoMHhGRkZGRkZGRikKKwogLyoqIG5ldF9idWZfb2JqOiBFTUFDIG5ldHdvcmsgYnVmZmVyZGF0YSBzdHJ1Y3R1cmUKICAqCiAgKiBFTUFDIG5ldHdvcmsgYnVmZmVyIGRhdGEgc3RydWN0dXJlCkBAIC0yMTY3LDcgKzIxNzMsMTEgQEAKIAkJZW1hY19pbnRfZW5hYmxlKHByaXYpOwogCX0KIAotCWlmICh1bmxpa2VseShzdGF0dXMgJiBFTUFDX0RNNjQ0WF9NQUNfSU5fVkVDVE9SX0hPU1RfSU5UKSkgeworCW1hc2sgPSBFTUFDX0RNNjQ0WF9NQUNfSU5fVkVDVE9SX0hPU1RfSU5UOworCWlmIChwcml2LT52ZXJzaW9uID09IEVNQUNfVkVSU0lPTl8yKQorCQltYXNrID0gRU1BQ19ETTY0NlhfTUFDX0lOX1ZFQ1RPUl9IT1NUX0lOVDsKKworCWlmICh1bmxpa2VseShzdGF0dXMgJiBtYXNrKSkgewogCQl1MzIgY2gsIGNhdXNlOwogCQlkZXZfZXJyKGVtYWNfZGV2LCAiRGFWaW5jaSBFTUFDOiBGYXRhbCBIYXJkd2FyZSBFcnJvclxuIik7CiAJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CkBAIC0yNTQxLDQwICsyNTUxLDQ5IEBACiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVtYWNfZGV2X2dldG5ldHN0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBlbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgbWFjX2NvbnRyb2w7CisJdTMyIHN0YXRzX2NsZWFyX21hc2s7CiAKIAkvKiB1cGRhdGUgZW1hYyBoYXJkd2FyZSBzdGF0cyBhbmQgcmVzZXQgdGhlIHJlZ2lzdGVycyovCiAKKwltYWNfY29udHJvbCA9IGVtYWNfcmVhZChFTUFDX01BQ0NPTlRST0wpOworCisJaWYgKG1hY19jb250cm9sICYgRU1BQ19NQUNDT05UUk9MX0dNSUlFTikKKwkJc3RhdHNfY2xlYXJfbWFzayA9IEVNQUNfU1RBVFNfQ0xSX01BU0s7CisJZWxzZQorCQlzdGF0c19jbGVhcl9tYXNrID0gMDsKKwogCXByaXYtPm5ldF9kZXZfc3RhdHMubXVsdGljYXN0ICs9IGVtYWNfcmVhZChFTUFDX1JYTUNBU1RGUkFNRVMpOwotCWVtYWNfd3JpdGUoRU1BQ19SWE1DQVNURlJBTUVTLCBFTUFDX0FMTF9NVUxUSV9SRUdfVkFMVUUpOworCWVtYWNfd3JpdGUoRU1BQ19SWE1DQVNURlJBTUVTLCBzdGF0c19jbGVhcl9tYXNrKTsKIAogCXByaXYtPm5ldF9kZXZfc3RhdHMuY29sbGlzaW9ucyArPSAoZW1hY19yZWFkKEVNQUNfVFhDT0xMSVNJT04pICsKIAkJCQkJICAgZW1hY19yZWFkKEVNQUNfVFhTSU5HTEVDT0xMKSArCiAJCQkJCSAgIGVtYWNfcmVhZChFTUFDX1RYTVVMVElDT0xMKSk7Ci0JZW1hY193cml0ZShFTUFDX1RYQ09MTElTSU9OLCBFTUFDX0FMTF9NVUxUSV9SRUdfVkFMVUUpOwotCWVtYWNfd3JpdGUoRU1BQ19UWFNJTkdMRUNPTEwsIEVNQUNfQUxMX01VTFRJX1JFR19WQUxVRSk7Ci0JZW1hY193cml0ZShFTUFDX1RYTVVMVElDT0xMLCBFTUFDX0FMTF9NVUxUSV9SRUdfVkFMVUUpOworCWVtYWNfd3JpdGUoRU1BQ19UWENPTExJU0lPTiwgc3RhdHNfY2xlYXJfbWFzayk7CisJZW1hY193cml0ZShFTUFDX1RYU0lOR0xFQ09MTCwgc3RhdHNfY2xlYXJfbWFzayk7CisJZW1hY193cml0ZShFTUFDX1RYTVVMVElDT0xMLCBzdGF0c19jbGVhcl9tYXNrKTsKIAogCXByaXYtPm5ldF9kZXZfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPSAoZW1hY19yZWFkKEVNQUNfUlhPVkVSU0laRUQpICsKIAkJCQkJCWVtYWNfcmVhZChFTUFDX1JYSkFCQkVSKSArCiAJCQkJCQllbWFjX3JlYWQoRU1BQ19SWFVOREVSU0laRUQpKTsKLQllbWFjX3dyaXRlKEVNQUNfUlhPVkVSU0laRUQsIEVNQUNfQUxMX01VTFRJX1JFR19WQUxVRSk7Ci0JZW1hY193cml0ZShFTUFDX1JYSkFCQkVSLCBFTUFDX0FMTF9NVUxUSV9SRUdfVkFMVUUpOwotCWVtYWNfd3JpdGUoRU1BQ19SWFVOREVSU0laRUQsIEVNQUNfQUxMX01VTFRJX1JFR19WQUxVRSk7CisJZW1hY193cml0ZShFTUFDX1JYT1ZFUlNJWkVELCBzdGF0c19jbGVhcl9tYXNrKTsKKwllbWFjX3dyaXRlKEVNQUNfUlhKQUJCRVIsIHN0YXRzX2NsZWFyX21hc2spOworCWVtYWNfd3JpdGUoRU1BQ19SWFVOREVSU0laRUQsIHN0YXRzX2NsZWFyX21hc2spOwogCiAJcHJpdi0+bmV0X2Rldl9zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSAoZW1hY19yZWFkKEVNQUNfUlhTT0ZPVkVSUlVOUykgKwogCQkJCQkgICAgICAgZW1hY19yZWFkKEVNQUNfUlhNT0ZPVkVSUlVOUykpOwotCWVtYWNfd3JpdGUoRU1BQ19SWFNPRk9WRVJSVU5TLCBFTUFDX0FMTF9NVUxUSV9SRUdfVkFMVUUpOwotCWVtYWNfd3JpdGUoRU1BQ19SWE1PRk9WRVJSVU5TLCBFTUFDX0FMTF9NVUxUSV9SRUdfVkFMVUUpOworCWVtYWNfd3JpdGUoRU1BQ19SWFNPRk9WRVJSVU5TLCBzdGF0c19jbGVhcl9tYXNrKTsKKwllbWFjX3dyaXRlKEVNQUNfUlhNT0ZPVkVSUlVOUywgc3RhdHNfY2xlYXJfbWFzayk7CiAKIAlwcml2LT5uZXRfZGV2X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzICs9IGVtYWNfcmVhZChFTUFDX1JYRE1BT1ZFUlJVTlMpOwotCWVtYWNfd3JpdGUoRU1BQ19SWERNQU9WRVJSVU5TLCBFTUFDX0FMTF9NVUxUSV9SRUdfVkFMVUUpOworCWVtYWNfd3JpdGUoRU1BQ19SWERNQU9WRVJSVU5TLCBzdGF0c19jbGVhcl9tYXNrKTsKIAogCXByaXYtPm5ldF9kZXZfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0KIAkJZW1hY19yZWFkKEVNQUNfVFhDQVJSSUVSU0VOU0UpOwotCWVtYWNfd3JpdGUoRU1BQ19UWENBUlJJRVJTRU5TRSwgRU1BQ19BTExfTVVMVElfUkVHX1ZBTFVFKTsKKwllbWFjX3dyaXRlKEVNQUNfVFhDQVJSSUVSU0VOU0UsIHN0YXRzX2NsZWFyX21hc2spOwogCiAJcHJpdi0+bmV0X2Rldl9zdGF0cy50eF9maWZvX2Vycm9ycyA9IGVtYWNfcmVhZChFTUFDX1RYVU5ERVJSVU4pOwotCWVtYWNfd3JpdGUoRU1BQ19UWFVOREVSUlVOLCBFTUFDX0FMTF9NVUxUSV9SRUdfVkFMVUUpOworCWVtYWNfd3JpdGUoRU1BQ19UWFVOREVSUlVOLCBzdGF0c19jbGVhcl9tYXNrKTsKIAogCXJldHVybiAmcHJpdi0+bmV0X2Rldl9zdGF0czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9kcml2ZXJzL25ldC9kZXBjYS5jCmluZGV4IDk2ODZjMWYuLjdhM2JkYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlcGNhLmMKKysrIGIvZHJpdmVycy9uZXQvZGVwY2EuYwpAQCAtMjM3LDYgKzIzNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbTkwMDAuaCBiL2RyaXZlcnMvbmV0L2RtOTAwMC5oCmluZGV4IDgwODE3YzIuLmZiMWM5MjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kbTkwMDAuaAorKysgYi9kcml2ZXJzL25ldC9kbTkwMDAuaApAQCAtNTAsNyArNTAsNyBAQAogI2RlZmluZSBETTkwMDBfUkNTUgkgICAgICAgMHgzMgogCiAjZGVmaW5lIENISVBSX0RNOTAwMEEJICAgICAgIDB4MTkKLSNkZWZpbmUgQ0hJUFJfRE05MDAwQgkgICAgICAgMHgxQgorI2RlZmluZSBDSElQUl9ETTkwMDBCCSAgICAgICAweDFBCiAKICNkZWZpbmUgRE05MDAwX01SQ01EWCAgICAgICAgICAweEYwCiAjZGVmaW5lIERNOTAwMF9NUkNNRCAgICAgICAgICAgMHhGMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMC5jIGIvZHJpdmVycy9uZXQvZTEwMC5jCmluZGV4IDY3OTk2NWMuLjNjMjlhMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAuYworKysgYi9kcml2ZXJzL25ldC9lMTAwLmMKQEAgLTE1MSw2ICsxNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTE0MjYsMTkgKzE0MjcsMzEgQEAKIAl9IGVsc2UKIAkJRFBSSU5USyhIVywgREVCVUcsICJwaHlfYWRkciA9ICVkXG4iLCBuaWMtPm1paS5waHlfaWQpOwogCi0JLyogSXNvbGF0ZSBhbGwgdGhlIFBIWSBpZHMgKi8KLQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgMzI7IGFkZHIrKykKLQkJbWRpb193cml0ZShuZXRkZXYsIGFkZHIsIE1JSV9CTUNSLCBCTUNSX0lTT0xBVEUpOwotCS8qIFNlbGVjdCB0aGUgZGlzY292ZXJlZCBQSFkgKi8KLQlibWNyICY9IH5CTUNSX0lTT0xBVEU7Ci0JbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIGJtY3IpOwotCiAJLyogR2V0IHBoeSBJRCAqLwogCWlkX2xvID0gbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfUEhZU0lEMSk7CiAJaWRfaGkgPSBtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQyKTsKIAluaWMtPnBoeSA9ICh1MzIpaWRfaGkgPDwgMTYgfCAodTMyKWlkX2xvOwogCURQUklOVEsoSFcsIERFQlVHLCAicGh5IElEID0gMHglMDhYXG4iLCBuaWMtPnBoeSk7CiAKKwkvKiBTZWxlY3QgdGhlIHBoeSBhbmQgaXNvbGF0ZSB0aGUgcmVzdCAqLworCWZvciAoYWRkciA9IDA7IGFkZHIgPCAzMjsgYWRkcisrKSB7CisJCWlmIChhZGRyICE9IG5pYy0+bWlpLnBoeV9pZCkgeworCQkJbWRpb193cml0ZShuZXRkZXYsIGFkZHIsIE1JSV9CTUNSLCBCTUNSX0lTT0xBVEUpOworCQl9IGVsc2UgaWYgKG5pYy0+cGh5ICE9IHBoeV84MjU1Ml92KSB7CisJCQlibWNyID0gbWRpb19yZWFkKG5ldGRldiwgYWRkciwgTUlJX0JNQ1IpOworCQkJbWRpb193cml0ZShuZXRkZXYsIGFkZHIsIE1JSV9CTUNSLAorCQkJCWJtY3IgJiB+Qk1DUl9JU09MQVRFKTsKKwkJfQorCX0KKwkvKgorCSAqIFdvcmthcm91bmQgZm9yIDgyNTUyOgorCSAqIENsZWFyIHRoZSBJU09MQVRFIGJpdCBvbiBzZWxlY3RlZCBwaHlfaWQgbGFzdCAobWlycm9yZWQgb24gYWxsCisJICogb3RoZXIgcGh5X2lkJ3MpIHVzaW5nIGJtY3IgdmFsdWUgZnJvbSBhZGRyIGRpc2NvdmVyeSBsb29wIGFib3ZlLgorCSAqLworCWlmIChuaWMtPnBoeSA9PSBwaHlfODI1NTJfdikKKwkJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsCisJCQlibWNyICYgfkJNQ1JfSVNPTEFURSk7CisKIAkvKiBIYW5kbGUgTmF0aW9uYWwgdHggcGh5cyAqLwogI2RlZmluZSBOQ1NfUEhZX01PREVMX01BU0sJMHhGRkYwRkZGRgogCWlmICgobmljLT5waHkgJiBOQ1NfUEhZX01PREVMX01BU0spID09IHBoeV9uc2NfdHgpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCmluZGV4IDFhNGY4OWMuLjQyZTJiN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaApAQCAtMTQ5LDcgKzE0OSw2IEBACiAKICNkZWZpbmUgQVVUT19BTExfTU9ERVMgICAgICAgICAgICAwCiAjZGVmaW5lIEUxMDAwX0VFUFJPTV84MjU0NF9BUE0gICAgMHgwMDA0Ci0jZGVmaW5lIEUxMDAwX0VFUFJPTV9JQ0g4X0FQTUUgICAgMHgwMDA0CiAjZGVmaW5lIEUxMDAwX0VFUFJPTV9BUE1FICAgICAgICAgMHgwNDAwCiAKICNpZm5kZWYgRTEwMDBfTUFTVEVSX1NMQVZFCkBAIC0yOTMsNyArMjkyLDYgQEAKIAogCXU2NCBod19jc3VtX2VycjsKIAl1NjQgaHdfY3N1bV9nb29kOwotCXU2NCByeF9oZHJfc3BsaXQ7CiAJdTMyIGFsbG9jX3J4X2J1ZmZfZmFpbGVkOwogCXUzMiByeF9pbnRfZGVsYXk7CiAJdTMyIHJ4X2Fic19pbnRfZGVsYXk7CkBAIC0zMTcsNyArMzE1LDYgQEAKIAlzdHJ1Y3QgZTEwMDBfcnhfcmluZyB0ZXN0X3J4X3Jpbmc7CiAKIAlpbnQgbXNnX2VuYWJsZTsKLQlib29sIGhhdmVfbXNpOwogCiAJLyogdG8gbm90IG1lc3MgdXAgY2FjaGUgYWxpZ25tZW50LCBhbHdheXMgYWRkIHRvIHRoZSBib3R0b20gKi8KIAlib29sIHRzb19mb3JjZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwppbmRleCAyN2Y5OTZhLi40OTBiMmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCkBAIC04Miw3ICs4Miw2IEBACiAJeyAicnhfbG9uZ19ieXRlX2NvdW50IiwgRTEwMDBfU1RBVChzdGF0cy5nb3JjbCkgfSwKIAl7ICJyeF9jc3VtX29mZmxvYWRfZ29vZCIsIEUxMDAwX1NUQVQoaHdfY3N1bV9nb29kKSB9LAogCXsgInJ4X2NzdW1fb2ZmbG9hZF9lcnJvcnMiLCBFMTAwMF9TVEFUKGh3X2NzdW1fZXJyKSB9LAotCXsgInJ4X2hlYWRlcl9zcGxpdCIsIEUxMDAwX1NUQVQocnhfaGRyX3NwbGl0KSB9LAogCXsgImFsbG9jX3J4X2J1ZmZfZmFpbGVkIiwgRTEwMDBfU1RBVChhbGxvY19yeF9idWZmX2ZhaWxlZCkgfSwKIAl7ICJ0eF9zbWJ1cyIsIEUxMDAwX1NUQVQoc3RhdHMubWdwdGMpIH0sCiAJeyAicnhfc21idXMiLCBFMTAwMF9TVEFUKHN0YXRzLm1ncHJjKSB9LApAQCAtMTE0LDggKzExMyw2IEBACiAJCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGx8CiAJCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfQXV0b25lZyB8CiAJCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfVFApOwotCQlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpCi0JCQllY21kLT5zdXBwb3J0ZWQgJj0gflNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKIAkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX1RQOwogCiAJCWlmIChody0+YXV0b25lZyA9PSAxKSB7CkBAIC0xNzgsMTQgKzE3NSw2IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKLQkvKiBXaGVuIFNvTC9JREVSIHNlc3Npb25zIGFyZSBhY3RpdmUsIGF1dG9uZWcvc3BlZWQvZHVwbGV4Ci0JICogY2Fubm90IGJlIGNoYW5nZWQgKi8KLQlpZiAoZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKGh3KSkgewotCQlEUFJJTlRLKERSViwgRVJSLCAiQ2Fubm90IGNoYW5nZSBsaW5rIGNoYXJhY3RlcmlzdGljcyAiCi0JCSAgICAgICAgIndoZW4gU29ML0lERVIgaXMgYWN0aXZlLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fRTEwMDBfUkVTRVRUSU5HLCAmYWRhcHRlci0+ZmxhZ3MpKQogCQltc2xlZXAoMSk7CiAKQEAgLTMzMCwxMCArMzE5LDcgQEAKIAllbHNlCiAJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOwogCi0JaWYgKGRhdGEgJiYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpKQotCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLQllbHNlCi0JCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPNjsKKwluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzY7CiAKIAlEUFJJTlRLKFBST0JFLCBJTkZPLCAiVFNPIGlzICVzXG4iLCBkYXRhID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CiAJYWRhcHRlci0+dHNvX2ZvcmNlID0gdHJ1ZTsKQEAgLTQ0MSw3ICs0MjcsNiBAQAogCXJlZ3NfYnVmZlsyNF0gPSAodTMyKXBoeV9kYXRhOyAgLyogcGh5IGxvY2FsIHJlY2VpdmVyIHN0YXR1cyAqLwogCXJlZ3NfYnVmZlsyNV0gPSByZWdzX2J1ZmZbMjRdOyAgLyogcGh5IHJlbW90ZSByZWNlaXZlciBzdGF0dXMgKi8KIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmCi0JICAgIGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxICYmCiAJICAgIGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CiAJCXJlZ3NfYnVmZlsyNl0gPSBlcjMyKE1BTkMpOwogCX0KQEAgLTU1NCwxMCArNTM5LDggQEAKIAlyZXRfdmFsID0gZTEwMDBfd3JpdGVfZWVwcm9tKGh3LCBmaXJzdF93b3JkLAogCQkJCSAgICAgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDEsIGVlcHJvbV9idWZmKTsKIAotCS8qIFVwZGF0ZSB0aGUgY2hlY2tzdW0gb3ZlciB0aGUgZmlyc3QgcGFydCBvZiB0aGUgRUVQUk9NIGlmIG5lZWRlZAotCSAqIGFuZCBmbHVzaCBzaGFkb3cgUkFNIGZvciA4MjU3MyBjb25yb2xsZXJzICovCi0JaWYgKChyZXRfdmFsID09IDApICYmICgoZmlyc3Rfd29yZCA8PSBFRVBST01fQ0hFQ0tTVU1fUkVHKSB8fAotCQkJCShody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpKSkKKwkvKiBVcGRhdGUgdGhlIGNoZWNrc3VtIG92ZXIgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIEVFUFJPTSBpZiBuZWVkZWQgKi8KKwlpZiAoKHJldF92YWwgPT0gMCkgJiYgKGZpcnN0X3dvcmQgPD0gRUVQUk9NX0NIRUNLU1VNX1JFRykpCiAJCWUxMDAwX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oaHcpOwogCiAJa2ZyZWUoZWVwcm9tX2J1ZmYpOwpAQCAtNTY4LDMxICs1NTEsMTIgQEAKIAkJCSAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJY2hhciBmaXJtd2FyZV92ZXJzaW9uWzMyXTsKLQl1MTYgZWVwcm9tX2RhdGE7CiAKIAlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIGUxMDAwX2RyaXZlcl9uYW1lLCAzMik7CiAJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBlMTAwMF9kcml2ZXJfdmVyc2lvbiwgMzIpOwogCi0JLyogRUVQUk9NIGltYWdlIHZlcnNpb24gIyBpcyByZXBvcnRlZCBhcyBmaXJtd2FyZSB2ZXJzaW9uICMgZm9yCi0JICogODI1N3sxfDJ8M30gY29udHJvbGxlcnMgKi8KLQllMTAwMF9yZWFkX2VlcHJvbShodywgNSwgMSwgJmVlcHJvbV9kYXRhKTsKLQlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotCWNhc2UgZTEwMDBfODI1NzE6Ci0JY2FzZSBlMTAwMF84MjU3MjoKLQljYXNlIGUxMDAwXzgyNTczOgotCWNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0JY2FzZSBlMTAwMF9pY2g4bGFuOgotCQlzcHJpbnRmKGZpcm13YXJlX3ZlcnNpb24sICIlZC4lZC0lZCIsCi0JCQkoZWVwcm9tX2RhdGEgJiAweEYwMDApID4+IDEyLAotCQkJKGVlcHJvbV9kYXRhICYgMHgwRkYwKSA+PiA0LAotCQkJZWVwcm9tX2RhdGEgJiAweDAwMEYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzcHJpbnRmKGZpcm13YXJlX3ZlcnNpb24sICJOL0EiKTsKLQl9Ci0KKwlzcHJpbnRmKGZpcm13YXJlX3ZlcnNpb24sICJOL0EiKTsKIAlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sIGZpcm13YXJlX3ZlcnNpb24sIDMyKTsKIAlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwgMzIpOwogCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gZTEwMDBfZ2V0X3JlZ3NfbGVuKG5ldGRldik7CkBAIC03ODEsMjEgKzc0NSw5IEBACiAJLyogVGhlIHN0YXR1cyByZWdpc3RlciBpcyBSZWFkIE9ubHksIHNvIGEgd3JpdGUgc2hvdWxkIGZhaWwuCiAJICogU29tZSBiaXRzIHRoYXQgZ2V0IHRvZ2dsZWQgYXJlIGlnbm9yZWQuCiAJICovCi0Jc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKwogCS8qIHRoZXJlIGFyZSBzZXZlcmFsIGJpdHMgb24gbmV3ZXIgaGFyZHdhcmUgdGhhdCBhcmUgci93ICovCi0JY2FzZSBlMTAwMF84MjU3MToKLQljYXNlIGUxMDAwXzgyNTcyOgotCWNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0JCXRvZ2dsZSA9IDB4N0ZGRkYzRkY7Ci0JCWJyZWFrOwotCWNhc2UgZTEwMDBfODI1NzM6Ci0JY2FzZSBlMTAwMF9pY2g4bGFuOgotCQl0b2dnbGUgPSAweDdGRkZGMDMzOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl0b2dnbGUgPSAweEZGRkZGODMzOwotCQlicmVhazsKLQl9CisJdG9nZ2xlID0gMHhGRkZGRjgzMzsKIAogCWJlZm9yZSA9IGVyMzIoU1RBVFVTKTsKIAl2YWx1ZSA9IChlcjMyKFNUQVRVUykgJiB0b2dnbGUpOwpAQCAtODEwLDEyICs3NjIsMTAgQEAKIAkvKiByZXN0b3JlIHByZXZpb3VzIHN0YXR1cyAqLwogCWV3MzIoU1RBVFVTLCBiZWZvcmUpOwogCi0JaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0JCVJFR19QQVRURVJOX1RFU1QoRkNBTCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7Ci0JCVJFR19QQVRURVJOX1RFU1QoRkNBSCwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7Ci0JCVJFR19QQVRURVJOX1RFU1QoRkNULCAweDAwMDBGRkZGLCAweEZGRkZGRkZGKTsKLQkJUkVHX1BBVFRFUk5fVEVTVChWRVQsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOwotCX0KKwlSRUdfUEFUVEVSTl9URVNUKEZDQUwsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoRkNBSCwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChGQ1QsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoVkVULCAweDAwMDBGRkZGLCAweEZGRkZGRkZGKTsKIAogCVJFR19QQVRURVJOX1RFU1QoUkRUUiwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7CiAJUkVHX1BBVFRFUk5fVEVTVChSREJBSCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7CkBAIC04MzAsOCArNzgwLDcgQEAKIAogCVJFR19TRVRfQU5EX0NIRUNLKFJDVEwsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDApOwogCi0JYmVmb3JlID0gKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuID8KLQkgICAgICAgICAgMHgwNkMzQjMzRSA6IDB4MDZERkIzRkUpOworCWJlZm9yZSA9IDB4MDZERkIzRkU7CiAJUkVHX1NFVF9BTkRfQ0hFQ0soUkNUTCwgYmVmb3JlLCAweDAwM0ZGRkZCKTsKIAlSRUdfU0VUX0FORF9DSEVDSyhUQ1RMLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwKTsKIApAQCAtODM5LDEyICs3ODgsMTAgQEAKIAogCQlSRUdfU0VUX0FORF9DSEVDSyhSQ1RMLCBiZWZvcmUsIDB4RkZGRkZGRkYpOwogCQlSRUdfUEFUVEVSTl9URVNUKFJEQkFMLCAweEZGRkZGRkYwLCAweEZGRkZGRkZGKTsKLQkJaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKQotCQkJUkVHX1BBVFRFUk5fVEVTVChUWENXLCAweEMwMDBGRkZGLCAweDAwMDBGRkZGKTsKKwkJUkVHX1BBVFRFUk5fVEVTVChUWENXLCAweEMwMDBGRkZGLCAweDAwMDBGRkZGKTsKIAkJUkVHX1BBVFRFUk5fVEVTVChUREJBTCwgMHhGRkZGRkZGMCwgMHhGRkZGRkZGRik7CiAJCVJFR19QQVRURVJOX1RFU1QoVElEViwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRik7Ci0JCXZhbHVlID0gKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuID8KLQkJICAgICAgICAgRTEwMDBfUkFSX0VOVFJJRVNfSUNIOExBTiA6IEUxMDAwX1JBUl9FTlRSSUVTKTsKKwkJdmFsdWUgPSBFMTAwMF9SQVJfRU5UUklFUzsKIAkJZm9yIChpID0gMDsgaSA8IHZhbHVlOyBpKyspIHsKIAkJCVJFR19QQVRURVJOX1RFU1QoUkEgKyAoKChpIDw8IDEpICsgMSkgPDwgMiksIDB4ODAwM0ZGRkYsCiAJCQkgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYpOwpAQCAtODU5LDggKzgwNiw3IEBACiAKIAl9CiAKLQl2YWx1ZSA9IChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbiA/Ci0JCQlFMTAwMF9NQ19UQkxfU0laRV9JQ0g4TEFOIDogRTEwMDBfTUNfVEJMX1NJWkUpOworCXZhbHVlID0gRTEwMDBfTUNfVEJMX1NJWkU7CiAJZm9yIChpID0gMDsgaSA8IHZhbHVlOyBpKyspCiAJCVJFR19QQVRURVJOX1RFU1QoTVRBICsgKGkgPDwgMiksIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOwogCkBAIC05MzMsOSArODc5LDYgQEAKIAkvKiBUZXN0IGVhY2ggaW50ZXJydXB0ICovCiAJZm9yICg7IGkgPCAxMDsgaSsrKSB7CiAKLQkJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuICYmIGkgPT0gOCkKLQkJCWNvbnRpbnVlOwotCiAJCS8qIEludGVycnVwdCB0byB0ZXN0ICovCiAJCW1hc2sgPSAxIDw8IGk7CiAKQEAgLTEyODksMzUgKzEyMzIsMjAgQEAKIAkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIDB4OTE0MCk7CiAJCS8qIGF1dG9uZWcgb2ZmICovCiAJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAweDgxNDApOwotCX0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9nZzgyNTYzKQotCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LAotCQkgICAgICAgICAgICAgICAgICAgIEdHODI1NjNfUEhZX0tNUk5fTU9ERV9DVFJMLAotCQkgICAgICAgICAgICAgICAgICAgIDB4MUNDKTsKKwl9CiAKIAljdHJsX3JlZyA9IGVyMzIoQ1RSTCk7CiAKLQlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKLQkJLyogZm9yY2UgMTAwLCBzZXQgbG9vcGJhY2sgKi8KLQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIDB4NjEwMCk7CisJLyogZm9yY2UgMTAwMCwgc2V0IGxvb3BiYWNrICovCisJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIDB4NDE0MCk7CiAKLQkJLyogTm93IHNldCB1cCB0aGUgTUFDIHRvIHRoZSBzYW1lIHNwZWVkL2R1cGxleCBhcyB0aGUgUEhZLiAqLwotCQljdHJsX3JlZyAmPSB+RTEwMDBfQ1RSTF9TUERfU0VMOyAvKiBDbGVhciB0aGUgc3BlZWQgc2VsIGJpdHMgKi8KLQkJY3RybF9yZWcgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgLyogU2V0IHRoZSBGb3JjZSBTcGVlZCBCaXQgKi8KLQkJCSAgICAgRTEwMDBfQ1RSTF9GUkNEUFggfCAvKiBTZXQgdGhlIEZvcmNlIER1cGxleCBCaXQgKi8KLQkJCSAgICAgRTEwMDBfQ1RSTF9TUERfMTAwIHwvKiBGb3JjZSBTcGVlZCB0byAxMDAgKi8KLQkJCSAgICAgRTEwMDBfQ1RSTF9GRCk7CSAvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLwotCX0gZWxzZSB7Ci0JCS8qIGZvcmNlIDEwMDAsIHNldCBsb29wYmFjayAqLwotCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgMHg0MTQwKTsKLQotCQkvKiBOb3cgc2V0IHVwIHRoZSBNQUMgdG8gdGhlIHNhbWUgc3BlZWQvZHVwbGV4IGFzIHRoZSBQSFkuICovCi0JCWN0cmxfcmVnID0gZXIzMihDVFJMKTsKLQkJY3RybF9yZWcgJj0gfkUxMDAwX0NUUkxfU1BEX1NFTDsgLyogQ2xlYXIgdGhlIHNwZWVkIHNlbCBiaXRzICovCi0JCWN0cmxfcmVnIHw9IChFMTAwMF9DVFJMX0ZSQ1NQRCB8IC8qIFNldCB0aGUgRm9yY2UgU3BlZWQgQml0ICovCi0JCQkgICAgIEUxMDAwX0NUUkxfRlJDRFBYIHwgLyogU2V0IHRoZSBGb3JjZSBEdXBsZXggQml0ICovCi0JCQkgICAgIEUxMDAwX0NUUkxfU1BEXzEwMDAgfC8qIEZvcmNlIFNwZWVkIHRvIDEwMDAgKi8KLQkJCSAgICAgRTEwMDBfQ1RSTF9GRCk7CSAvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLwotCX0KKwkvKiBOb3cgc2V0IHVwIHRoZSBNQUMgdG8gdGhlIHNhbWUgc3BlZWQvZHVwbGV4IGFzIHRoZSBQSFkuICovCisJY3RybF9yZWcgPSBlcjMyKENUUkwpOworCWN0cmxfcmVnICY9IH5FMTAwMF9DVFJMX1NQRF9TRUw7IC8qIENsZWFyIHRoZSBzcGVlZCBzZWwgYml0cyAqLworCWN0cmxfcmVnIHw9IChFMTAwMF9DVFJMX0ZSQ1NQRCB8IC8qIFNldCB0aGUgRm9yY2UgU3BlZWQgQml0ICovCisJCQlFMTAwMF9DVFJMX0ZSQ0RQWCB8IC8qIFNldCB0aGUgRm9yY2UgRHVwbGV4IEJpdCAqLworCQkJRTEwMDBfQ1RSTF9TUERfMTAwMCB8LyogRm9yY2UgU3BlZWQgdG8gMTAwMCAqLworCQkJRTEwMDBfQ1RSTF9GRCk7CSAvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLwogCiAJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyICYmCiAJICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpCkBAIC0xMzczLDE0ICsxMzAxLDggQEAKIAljYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgogCWNhc2UgZTEwMDBfODI1NDc6CiAJY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKLQljYXNlIGUxMDAwXzgyNTcxOgotCWNhc2UgZTEwMDBfODI1NzI6Ci0JY2FzZSBlMTAwMF84MjU3MzoKLQljYXNlIGUxMDAwXzgwMDAzZXMybGFuOgotCWNhc2UgZTEwMDBfaWNoOGxhbjoKIAkJcmV0dXJuIGUxMDAwX2ludGVncmF0ZWRfcGh5X2xvb3BiYWNrKGFkYXB0ZXIpOwogCQlicmVhazsKLQogCWRlZmF1bHQ6CiAJCS8qIERlZmF1bHQgUEhZIGxvb3BiYWNrIHdvcmsgaXMgdG8gcmVhZCB0aGUgTUlJCiAJCSAqIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIGFzc2VydCBiaXQgMTQgKGxvb3BiYWNrIG1vZGUpLgpAQCAtMTQwOSwxNCArMTMzMSw2IEBACiAJCWNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CiAJCQlyZXR1cm4gZTEwMDBfc2V0X3BoeV9sb29wYmFjayhhZGFwdGVyKTsKIAkJCWJyZWFrOwotCQljYXNlIGUxMDAwXzgyNTcxOgotCQljYXNlIGUxMDAwXzgyNTcyOgotI2RlZmluZSBFMTAwMF9TRVJERVNfTEJfT04gMHg0MTAKLQkJCWUxMDAwX3NldF9waHlfbG9vcGJhY2soYWRhcHRlcik7Ci0JCQlldzMyKFNDVEwsIEUxMDAwX1NFUkRFU19MQl9PTik7Ci0JCQltc2xlZXAoMTApOwotCQkJcmV0dXJuIDA7Ci0JCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJjdGwgPSBlcjMyKFJDVEwpOwogCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX0xCTV9UQ1ZSOwpAQCAtMTQ0MCwyNiArMTM1NCwxMiBAQAogCWV3MzIoUkNUTCwgcmN0bCk7CiAKIAlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotCWNhc2UgZTEwMDBfODI1NzE6Ci0JY2FzZSBlMTAwMF84MjU3MjoKLQkJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIgfHwKLQkJICAgIGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSB7Ci0jZGVmaW5lIEUxMDAwX1NFUkRFU19MQl9PRkYgMHg0MDAKLQkJCWV3MzIoU0NUTCwgRTEwMDBfU0VSREVTX0xCX09GRik7Ci0JCQltc2xlZXAoMTApOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogRmFsbCBUaHJvdWdoICovCiAJY2FzZSBlMTAwMF84MjU0NToKIAljYXNlIGUxMDAwXzgyNTQ2OgogCWNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CiAJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKIAlkZWZhdWx0OgogCQlody0+YXV0b25lZyA9IHRydWU7Ci0JCWlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpCi0JCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LAotCQkJCQkgICAgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsCi0JCQkJCSAgICAweDE4MCk7CiAJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZwaHlfcmVnKTsKIAkJaWYgKHBoeV9yZWcgJiBNSUlfQ1JfTE9PUEJBQ0spIHsKIAkJCXBoeV9yZWcgJj0gfk1JSV9DUl9MT09QQkFDSzsKQEAgLTE1NjAsMTcgKzE0NjAsNiBAQAogCiBzdGF0aWMgaW50IGUxMDAwX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCi0JLyogUEhZIGxvb3BiYWNrIGNhbm5vdCBiZSBwZXJmb3JtZWQgaWYgU29ML0lERVIKLQkgKiBzZXNzaW9ucyBhcmUgYWN0aXZlICovCi0JaWYgKGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jayhodykpIHsKLQkJRFBSSU5USyhEUlYsIEVSUiwgIkNhbm5vdCBkbyBQSFkgbG9vcGJhY2sgdGVzdCAiCi0JCSAgICAgICAgIndoZW4gU29ML0lERVIgaXMgYWN0aXZlLlxuIik7Ci0JCSpkYXRhID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCiAJKmRhdGEgPSBlMTAwMF9zZXR1cF9kZXNjX3JpbmdzKGFkYXB0ZXIpOwogCWlmICgqZGF0YSkKIAkJZ290byBvdXQ7CkBAIC0xNTkyLDEzICsxNDgxLDEzIEBACiAJKmRhdGEgPSAwOwogCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgewogCQlpbnQgaSA9IDA7Ci0JCWh3LT5zZXJkZXNfbGlua19kb3duID0gdHJ1ZTsKKwkJaHctPnNlcmRlc19oYXNfbGluayA9IGZhbHNlOwogCiAJCS8qIE9uIHNvbWUgYmxhZGUgc2VydmVyIGRlc2lnbnMsIGxpbmsgZXN0YWJsaXNobWVudAogCQkgKiBjb3VsZCB0YWtlIGFzIGxvbmcgYXMgMi0zIG1pbnV0ZXMgKi8KIAkJZG8gewogCQkJZTEwMDBfY2hlY2tfZm9yX2xpbmsoaHcpOwotCQkJaWYgKCFody0+c2VyZGVzX2xpbmtfZG93bikKKwkJCWlmIChody0+c2VyZGVzX2hhc19saW5rKQogCQkJCXJldHVybiAqZGF0YTsKIAkJCW1zbGVlcCgyMCk7CiAJCX0gd2hpbGUgKGkrKyA8IDM3NTApOwpAQCAtMTcxNiwxNSArMTYwNSwxMSBAQAogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fQ09QUEVSOgogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVI6CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9QQ0lFOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTX1FVQUQ6CiAJCS8qIHRoZXNlIGRvbid0IHN1cHBvcnQgV29MIGF0IGFsbCAqLwogCQl3b2wtPnN1cHBvcnRlZCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2RUJfRklCRVI6CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX0ZJQkVSOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfQ09QUEVSOgogCQkvKiBXYWtlIGV2ZW50cyBub3Qgc3VwcG9ydGVkIG9uIHBvcnQgQiAqLwogCQlpZiAoZXIzMihTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkgewogCQkJd29sLT5zdXBwb3J0ZWQgPSAwOwpAQCAtMTczMywxMCArMTYxOCw2IEBACiAJCS8qIHJldHVybiBzdWNjZXNzIGZvciBub24gZXhjbHVkZWQgYWRhcHRlciBwb3J0cyAqLwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9GSUJFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSX0xPV1BST0ZJTEU6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NzFQVF9RVUFEX0NPUFBFUjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSX0tTUDM6CiAJCS8qIHF1YWQgcG9ydCBhZGFwdGVycyBvbmx5IHN1cHBvcnQgV29MIG9uIHBvcnQgQSAqLwogCQlpZiAoIWFkYXB0ZXItPnF1YWRfcG9ydF9hKSB7CkBAIC0xODcyLDMwICsxNzUzLDE1IEBACiAJaWYgKCFkYXRhKQogCQlkYXRhID0gSU5UX01BWDsKIAotCWlmIChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU3MSkgewotCQlpZiAoIWFkYXB0ZXItPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7Ci0JCQlpbml0X3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lcik7Ci0JCQlhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDAwX2xlZF9ibGlua19jYWxsYmFjazsKLQkJCWFkYXB0ZXItPmJsaW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylhZGFwdGVyOwotCQl9Ci0JCWUxMDAwX3NldHVwX2xlZChodyk7Ci0JCW1vZF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIsIGppZmZpZXMpOwotCQltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7Ci0JCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5ibGlua190aW1lcik7Ci0JfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lmZSkgewotCQlpZiAoIWFkYXB0ZXItPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7Ci0JCQlpbml0X3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lcik7Ci0JCQlhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDAwX2xlZF9ibGlua19jYWxsYmFjazsKLQkJCWFkYXB0ZXItPmJsaW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylhZGFwdGVyOwotCQl9Ci0JCW1vZF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIsIGppZmZpZXMpOwotCQltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7Ci0JCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5ibGlua190aW1lcik7Ci0JCWUxMDAwX3dyaXRlX3BoeV9yZWcoJihhZGFwdGVyLT5odyksIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MX0xFRCwgMCk7Ci0JfSBlbHNlIHsKLQkJZTEwMDBfYmxpbmtfbGVkX3N0YXJ0KGh3KTsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOworCWlmICghYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24pIHsKKwkJaW5pdF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIpOworCQlhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDAwX2xlZF9ibGlua19jYWxsYmFjazsKKwkJYWRhcHRlci0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7CiAJfQorCWUxMDAwX3NldHVwX2xlZChodyk7CisJbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyk7CisJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOworCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5ibGlua190aW1lcik7CiAKIAllMTAwMF9sZWRfb2ZmKGh3KTsKIAljbGVhcl9iaXQoRTEwMDBfTEVEX09OLCAmYWRhcHRlci0+bGVkX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwppbmRleCA0NWFjMjI1Li44ZDdkODdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKQEAgLTI0LDg4ICsyNCwzNCBAQAogICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KICAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiAKIC8qIGUxMDAwX2h3LmMKICAqIFNoYXJlZCBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBhbmQgY29uZmlndXJpbmcgdGhlIE1BQwogICovCiAKLQogI2luY2x1ZGUgImUxMDAwX2h3LmgiCiAKLXN0YXRpYyBzMzIgZTEwMDBfc3dmd19zeW5jX2FjcXVpcmUoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG1hc2spOwotc3RhdGljIHZvaWQgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2Uoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG1hc2spOwotc3RhdGljIHMzMiBlMTAwMF9yZWFkX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiByZWdfYWRkciwgdTE2ICpkYXRhKTsKLXN0YXRpYyBzMzIgZTEwMDBfd3JpdGVfa21ybl9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZ19hZGRyLCB1MTYgZGF0YSk7Ci1zdGF0aWMgczMyIGUxMDAwX2dldF9zb2Z0d2FyZV9zZW1hcGhvcmUoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgdm9pZCBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLQotc3RhdGljIHU4IGUxMDAwX2FyY19zdWJzeXN0ZW1fdmFsaWQoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgczMyIGUxMDAwX2NoZWNrX2Rvd25zaGlmdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyBzMzIgZTEwMDBfY2hlY2tfcG9sYXJpdHkoc3RydWN0IGUxMDAwX2h3ICpodywKIAkJCQllMTAwMF9yZXZfcG9sYXJpdHkgKnBvbGFyaXR5KTsKIHN0YXRpYyB2b2lkIGUxMDAwX2NsZWFyX2h3X2NudHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHZvaWQgZTEwMDBfY2xlYXJfdmZ0YShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLXN0YXRpYyBzMzIgZTEwMDBfY29tbWl0X3NoYWRvd19yYW0oc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgczMyIGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2Uoc3RydWN0IGUxMDAwX2h3ICpodywKIAkJCQkJICAgICAgYm9vbCBsaW5rX3VwKTsKIHN0YXRpYyBzMzIgZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgczMyIGUxMDAwX2RldGVjdF9naWdfcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpOwotc3RhdGljIHMzMiBlMTAwMF9lcmFzZV9pY2g4XzRrX3NlZ21lbnQoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGJhbmspOwogc3RhdGljIHMzMiBlMTAwMF9nZXRfYXV0b19yZF9kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiAqbWluX2xlbmd0aCwKIAkJCQkgIHUxNiAqbWF4X2xlbmd0aCk7Ci1zdGF0aWMgczMyIGUxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9nZXRfcGh5X2NmZ19kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcpOwotc3RhdGljIHMzMiBlMTAwMF9nZXRfc29mdHdhcmVfZmxhZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLXN0YXRpYyBzMzIgZTEwMDBfaWNoOF9jeWNsZV9pbml0KHN0cnVjdCBlMTAwMF9odyAqaHcpOwotc3RhdGljIHMzMiBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiB0aW1lb3V0KTsKIHN0YXRpYyBzMzIgZTEwMDBfaWRfbGVkX2luaXQoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgczMyIGUxMDAwX2luaXRfbGNkX2Zyb21fbnZtX2NvbmZpZ19yZWdpb24oc3RydWN0IGUxMDAwX2h3ICpodywKLQkJCQkJCSB1MzIgY25mX2Jhc2VfYWRkciwKLQkJCQkJCSB1MzIgY25mX3NpemUpOwotc3RhdGljIHMzMiBlMTAwMF9pbml0X2xjZF9mcm9tX252bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyB2b2lkIGUxMDAwX2luaXRfcnhfYWRkcnMoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgdm9pZCBlMTAwMF9pbml0aWFsaXplX2hhcmR3YXJlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgYm9vbCBlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgczMyIGUxMDAwX2t1bWVyYW5fbG9ja19sb3NzX3dvcmthcm91bmQoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgczMyIGUxMDAwX21uZ19lbmFibGVfaG9zdF9pZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLXN0YXRpYyBzMzIgZTEwMDBfbW5nX2hvc3RfaWZfd3JpdGUoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKmJ1ZmZlciwgdTE2IGxlbmd0aCwKLQkJCQkgICB1MTYgb2Zmc2V0LCB1OCAqc3VtKTsKLXN0YXRpYyBzMzIgZTEwMDBfbW5nX3dyaXRlX2NtZF9oZWFkZXIoc3RydWN0IGUxMDAwX2h3KiBodywKLQkJCQkgICAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIKLQkJCQkgICAgICAqaGRyKTsKLXN0YXRpYyBzMzIgZTEwMDBfbW5nX3dyaXRlX2NvbW1pdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLXN0YXRpYyBzMzIgZTEwMDBfcGh5X2lmZV9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAotCQkJCSAgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbyk7CiBzdGF0aWMgczMyIGUxMDAwX3BoeV9pZ3BfZ2V0X2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywKIAkJCQkgIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pOwotc3RhdGljIHMzMiBlMTAwMF9yZWFkX2VlcHJvbV9lZXJkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKLQkJCQkgIHUxNiAqZGF0YSk7Ci1zdGF0aWMgczMyIGUxMDAwX3dyaXRlX2VlcHJvbV9lZXdyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKLQkJCQkgICB1MTYgKmRhdGEpOwotc3RhdGljIHMzMiBlMTAwMF9wb2xsX2VlcmRfZWV3cl9kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcsIGludCBlZXJkKTsKIHN0YXRpYyBzMzIgZTEwMDBfcGh5X204OF9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAogCQkJCSAgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbyk7Ci1zdGF0aWMgdm9pZCBlMTAwMF9wdXRfaHdfZWVwcm9tX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLXN0YXRpYyBzMzIgZTEwMDBfcmVhZF9pY2g4X2J5dGUoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGluZGV4LCB1OCAqZGF0YSk7Ci1zdGF0aWMgczMyIGUxMDAwX3ZlcmlmeV93cml0ZV9pY2g4X2J5dGUoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGluZGV4LAotCQkJCQl1OCBieXRlKTsKLXN0YXRpYyBzMzIgZTEwMDBfd3JpdGVfaWNoOF9ieXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBpbmRleCwgdTggYnl0ZSk7Ci1zdGF0aWMgczMyIGUxMDAwX3JlYWRfaWNoOF93b3JkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBpbmRleCwgdTE2ICpkYXRhKTsKLXN0YXRpYyBzMzIgZTEwMDBfcmVhZF9pY2g4X2RhdGEoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGluZGV4LCB1MzIgc2l6ZSwKLQkJCQl1MTYgKmRhdGEpOwotc3RhdGljIHMzMiBlMTAwMF93cml0ZV9pY2g4X2RhdGEoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGluZGV4LCB1MzIgc2l6ZSwKLQkJCQkgdTE2IGRhdGEpOwotc3RhdGljIHMzMiBlMTAwMF9yZWFkX2VlcHJvbV9pY2g4KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKLQkJCQkgIHUxNiAqZGF0YSk7Ci1zdGF0aWMgczMyIGUxMDAwX3dyaXRlX2VlcHJvbV9pY2g4KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKLQkJCQkgICB1MTYgKmRhdGEpOwotc3RhdGljIHZvaWQgZTEwMDBfcmVsZWFzZV9zb2Z0d2FyZV9mbGFnKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGFjdGl2ZSk7Ci1zdGF0aWMgczMyIGUxMDAwX3NldF9kMF9scGx1X3N0YXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIGJvb2wgYWN0aXZlKTsKLXN0YXRpYyBzMzIgZTEwMDBfc2V0X3BjaV9leF9ub19zbm9vcChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgbm9fc25vb3ApOwotc3RhdGljIHZvaWQgZTEwMDBfc2V0X3BjaV9leHByZXNzX21hc3Rlcl9kaXNhYmxlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF93YWl0X2F1dG9uZWcoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgdm9pZCBlMTAwMF93cml0ZV9yZWdfaW8oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTMyIHZhbHVlKTsKIHN0YXRpYyBzMzIgZTEwMDBfc2V0X3BoeV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwpAQCAtMTE3LDEyICs2MywxMSBAQAogc3RhdGljIHMzMiBlMTAwMF9jb25maWdfbWFjX3RvX3BoeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyB2b2lkIGUxMDAwX3JhaXNlX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyICpjdHJsKTsKIHN0YXRpYyB2b2lkIGUxMDAwX2xvd2VyX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyICpjdHJsKTsKLXN0YXRpYyB2b2lkIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgZGF0YSwKLQkJCQkgICAgIHUxNiBjb3VudCk7CitzdGF0aWMgdm9pZCBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGRhdGEsIHUxNiBjb3VudCk7CiBzdGF0aWMgdTE2IGUxMDAwX3NoaWZ0X2luX21kaV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9waHlfcmVzZXRfZHNwKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF93cml0ZV9lZXByb21fc3BpKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiB3b3JkcywgdTE2ICpkYXRhKTsKKwkJCQkgIHUxNiB3b3JkcywgdTE2ICpkYXRhKTsKIHN0YXRpYyBzMzIgZTEwMDBfd3JpdGVfZWVwcm9tX21pY3Jvd2lyZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LAogCQkJCQl1MTYgd29yZHMsIHUxNiAqZGF0YSk7CiBzdGF0aWMgczMyIGUxMDAwX3NwaV9lZXByb21fcmVhZHkoc3RydWN0IGUxMDAwX2h3ICpodyk7CkBAIC0xMzEsNyArNzYsNyBAQAogc3RhdGljIHZvaWQgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IGRhdGEsIHUxNiBjb3VudCk7CiBzdGF0aWMgczMyIGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZ19hZGRyLAogCQkJCSAgdTE2IHBoeV9kYXRhKTsKLXN0YXRpYyBzMzIgZTEwMDBfcmVhZF9waHlfcmVnX2V4KHN0cnVjdCBlMTAwMF9odyAqaHcsdTMyIHJlZ19hZGRyLAorc3RhdGljIHMzMiBlMTAwMF9yZWFkX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZ19hZGRyLAogCQkJCSB1MTYgKnBoeV9kYXRhKTsKIHN0YXRpYyB1MTYgZTEwMDBfc2hpZnRfaW5fZWVfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgY291bnQpOwogc3RhdGljIHMzMiBlMTAwMF9hY3F1aXJlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKQEAgLTE0MCwxODggKzg1LDE2NCBAQAogc3RhdGljIHMzMiBlMTAwMF9zZXRfdmNvX3NwZWVkKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9zZXRfcGh5X21vZGUoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zdGF0aWMgczMyIGUxMDAwX2hvc3RfaWZfcmVhZF9jb29raWUoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKmJ1ZmZlcik7Ci1zdGF0aWMgdTggZTEwMDBfY2FsY3VsYXRlX21uZ19jaGVja3N1bShjaGFyICpidWZmZXIsIHUzMiBsZW5ndGgpOwotc3RhdGljIHMzMiBlMTAwMF9jb25maWd1cmVfa21ybl9mb3JfMTBfMTAwKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBkdXBsZXgpOwotc3RhdGljIHMzMiBlMTAwMF9jb25maWd1cmVfa21ybl9mb3JfMTAwMChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLXN0YXRpYyBzMzIgZTEwMDBfZG9fcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG9mZnNldCwgdTE2IHdvcmRzLCB1MTYgKmRhdGEpOwotc3RhdGljIHMzMiBlMTAwMF9kb193cml0ZV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG9mZnNldCwgdTE2IHdvcmRzLCB1MTYgKmRhdGEpOworc3RhdGljIHMzMiBlMTAwMF9kb19yZWFkX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsCisJCQkJdTE2ICpkYXRhKTsKK3N0YXRpYyBzMzIgZTEwMDBfZG9fd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKKwkJCQkgdTE2ICpkYXRhKTsKIAogLyogSUdQIGNhYmxlIGxlbmd0aCB0YWJsZSAqLwogc3RhdGljIGNvbnN0Ci11MTYgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF90YWJsZVtJR1AwMUUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRV0gPQotICAgIHsgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKLSAgICAgIDUsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI1LCAyNSwgMjUsCi0gICAgICAyNSwgMjUsIDI1LCAyNSwgMzAsIDMwLCAzMCwgMzAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwKLSAgICAgIDQwLCA1MCwgNTAsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLAotICAgICAgNjAsIDcwLCA3MCwgNzAsIDcwLCA3MCwgNzAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDkwLCA5MCwgOTAsCi0gICAgICA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsCi0gICAgICAxMDAsIDEwMCwgMTAwLCAxMDAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsCi0gICAgICAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjB9OwotCi1zdGF0aWMgY29uc3QKLXUxNiBlMTAwMF9pZ3BfMl9jYWJsZV9sZW5ndGhfdGFibGVbSUdQMDJFMTAwMF9BR0NfTEVOR1RIX1RBQkxFX1NJWkVdID0KLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDUsIDgsIDExLCAxMywgMTYsIDE4LCAyMSwKLSAgICAgIDAsIDAsIDAsIDMsIDYsIDEwLCAxMywgMTYsIDE5LCAyMywgMjYsIDI5LCAzMiwgMzUsIDM4LCA0MSwKLSAgICAgIDYsIDEwLCAxNCwgMTgsIDIyLCAyNiwgMzAsIDMzLCAzNywgNDEsIDQ0LCA0OCwgNTEsIDU0LCA1OCwgNjEsCi0gICAgICAyMSwgMjYsIDMxLCAzNSwgNDAsIDQ0LCA0OSwgNTMsIDU3LCA2MSwgNjUsIDY4LCA3MiwgNzUsIDc5LCA4MiwKLSAgICAgIDQwLCA0NSwgNTEsIDU2LCA2MSwgNjYsIDcwLCA3NSwgNzksIDgzLCA4NywgOTEsIDk0LCA5OCwgMTAxLCAxMDQsCi0gICAgICA2MCwgNjYsIDcyLCA3NywgODIsIDg3LCA5MiwgOTYsIDEwMCwgMTA0LCAxMDgsIDExMSwgMTE0LCAxMTcsIDExOSwgMTIxLAotICAgICAgODMsIDg5LCA5NSwgMTAwLCAxMDUsIDEwOSwgMTEzLCAxMTYsIDExOSwgMTIyLCAxMjQsCi0gICAgICAxMDQsIDEwOSwgMTE0LCAxMTgsIDEyMSwgMTI0fTsKK3UxNiBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoX3RhYmxlW0lHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFXSA9IHsKKwk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorCTUsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDI1LCAyNSwgMjUsCisJMjUsIDI1LCAyNSwgMjUsIDMwLCAzMCwgMzAsIDMwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsCisJNDAsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTAsIDUwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsCisJNjAsIDcwLCA3MCwgNzAsIDcwLCA3MCwgNzAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDkwLCA5MCwgOTAsCisJOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwKKwkgICAgMTAwLAorCTEwMCwgMTAwLCAxMDAsIDEwMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLAorCSAgICAxMTAsIDExMCwKKwkxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwKKwkgICAgMTIwLCAxMjAKK307CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZTEwMDBfZWVwcm9tX2xvY2spOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTZXQgdGhlIHBoeSB0eXBlIG1lbWJlciBpbiB0aGUgaHcgc3RydWN0LgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX3NldF9waHlfdHlwZSAtIFNldCB0aGUgcGh5IHR5cGUgbWVtYmVyIGluIHRoZSBodyBzdHJ1Y3QuCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICovCiBzdGF0aWMgczMyIGUxMDAwX3NldF9waHlfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X3BoeV90eXBlIik7CisJREVCVUdGVU5DKCJlMTAwMF9zZXRfcGh5X3R5cGUiKTsKIAotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfdW5kZWZpbmVkKQotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFlfVFlQRTsKKwlpZiAoaHctPm1hY190eXBlID09IGUxMDAwX3VuZGVmaW5lZCkKKwkJcmV0dXJuIC1FMTAwMF9FUlJfUEhZX1RZUEU7CiAKLSAgICBzd2l0Y2ggKGh3LT5waHlfaWQpIHsKLSAgICBjYXNlIE04OEUxMDAwX0VfUEhZX0lEOgotICAgIGNhc2UgTTg4RTEwMDBfSV9QSFlfSUQ6Ci0gICAgY2FzZSBNODhFMTAxMV9JX1BIWV9JRDoKLSAgICBjYXNlIE04OEUxMTExX0lfUEhZX0lEOgotICAgICAgICBody0+cGh5X3R5cGUgPSBlMTAwMF9waHlfbTg4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElHUDAxRTEwMDBfSV9QSFlfSUQ6Ci0gICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEgfHwKLSAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMiB8fAotICAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8Ci0gICAgICAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKLSAgICAgICAgICAgIGh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV9pZ3A7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgSUdQMDNFMTAwMF9FX1BIWV9JRDoKLSAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X2lncF8zOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElGRV9FX1BIWV9JRDoKLSAgICBjYXNlIElGRV9QTFVTX0VfUEhZX0lEOgotICAgIGNhc2UgSUZFX0NfRV9QSFlfSUQ6Ci0gICAgICAgIGh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV9pZmU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0c4MjU2M19FX1BIWV9JRDoKLSAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikgewotICAgICAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X2dnODI1NjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvKiBGYWxsIFRocm91Z2ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgICAvKiBTaG91bGQgbmV2ZXIgaGF2ZSBsb2FkZWQgb24gdGhpcyBkZXZpY2UgKi8KLSAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X3VuZGVmaW5lZDsKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZX1RZUEU7Ci0gICAgfQorCXN3aXRjaCAoaHctPnBoeV9pZCkgeworCWNhc2UgTTg4RTEwMDBfRV9QSFlfSUQ6CisJY2FzZSBNODhFMTAwMF9JX1BIWV9JRDoKKwljYXNlIE04OEUxMDExX0lfUEhZX0lEOgorCWNhc2UgTTg4RTExMTFfSV9QSFlfSUQ6CisJCWh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV9tODg7CisJCWJyZWFrOworCWNhc2UgSUdQMDFFMTAwMF9JX1BIWV9JRDoKKwkJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSB8fAorCQkgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8CisJCSAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwKKwkJICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgeworCQkJaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X2lncDsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJLyogU2hvdWxkIG5ldmVyIGhhdmUgbG9hZGVkIG9uIHRoaXMgZGV2aWNlICovCisJCWh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV91bmRlZmluZWQ7CisJCXJldHVybiAtRTEwMDBfRVJSX1BIWV9UWVBFOworCX0KIAotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJR1AgcGh5IGluaXQgc2NyaXB0IC0gaW5pdGlhbGl6ZXMgdGhlIEdiRSBQSFkKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9waHlfaW5pdF9zY3JpcHQgLSBJR1AgcGh5IGluaXQgc2NyaXB0IC0gaW5pdGlhbGl6ZXMgdGhlIEdiRSBQSFkKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKi8KIHN0YXRpYyB2b2lkIGUxMDAwX3BoeV9pbml0X3NjcmlwdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiByZXRfdmFsOwotICAgIHUxNiBwaHlfc2F2ZWRfZGF0YTsKKwl1MzIgcmV0X3ZhbDsKKwl1MTYgcGh5X3NhdmVkX2RhdGE7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9pbml0X3NjcmlwdCIpOworCURFQlVHRlVOQygiZTEwMDBfcGh5X2luaXRfc2NyaXB0Iik7CiAKLSAgICBpZiAoaHctPnBoeV9pbml0X3NjcmlwdCkgewotICAgICAgICBtc2xlZXAoMjApOworCWlmIChody0+cGh5X2luaXRfc2NyaXB0KSB7CisJCW1zbGVlcCgyMCk7CiAKLSAgICAgICAgLyogU2F2ZSBvZmYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmVnaXN0ZXIgMHgyRjVCIHRvIGJlIHJlc3RvcmVkIGF0Ci0gICAgICAgICAqIHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lLiAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCAweDJGNUIsICZwaHlfc2F2ZWRfZGF0YSk7CisJCS8qIFNhdmUgb2ZmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHJlZ2lzdGVyIDB4MkY1QiB0byBiZSByZXN0b3JlZCBhdAorCQkgKiB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4gKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgMHgyRjVCLCAmcGh5X3NhdmVkX2RhdGEpOwogCi0gICAgICAgIC8qIERpc2FibGVkIHRoZSBQSFkgdHJhbnNtaXR0ZXIgKi8KLSAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCAweDAwMDMpOworCQkvKiBEaXNhYmxlZCB0aGUgUEhZIHRyYW5zbWl0dGVyICovCisJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MkY1QiwgMHgwMDAzKTsKKwkJbXNsZWVwKDIwKTsKIAotICAgICAgICBtc2xlZXAoMjApOworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsIDB4MDE0MCk7CisJCW1zbGVlcCg1KTsKIAotICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LDB4MDAwMCwweDAxNDApOworCQlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworCQljYXNlIGUxMDAwXzgyNTQxOgorCQljYXNlIGUxMDAwXzgyNTQ3OgorCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjk1LCAweDAwMDEpOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjcxLCAweEJEMjEpOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjc5LCAweDAwMTgpOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMwLCAweDE2MDApOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMxLCAweDAwMTQpOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMyLCAweDE2MUMpOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjk0LCAweDAwMDMpOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjk2LCAweDAwM0YpOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyMDEwLCAweDAwMDgpOworCQkJYnJlYWs7CiAKLSAgICAgICAgbXNsZWVwKDUpOworCQljYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorCQljYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjczLCAweDAwOTkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCi0gICAgICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDE6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDc6Ci0gICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTUsIDB4MDAwMSk7CisJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwgMHgzMzAwKTsKKwkJbXNsZWVwKDIwKTsKIAotICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjcxLCAweEJEMjEpOworCQkvKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIHBoeV9zYXZlZF9kYXRhKTsKIAotICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjc5LCAweDAwMTgpOworCQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSB7CisJCQl1MTYgZnVzZWQsIGZpbmUsIGNvYXJzZTsKIAotICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMwLCAweDE2MDApOworCQkJLyogTW92ZSB0byBhbmFsb2cgcmVnaXN0ZXJzIHBhZ2UgKi8KKwkJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywKKwkJCQkJICAgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9TVEFUVVMsCisJCQkJCSAgICZmdXNlZCk7CiAKLSAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUYzMSwgMHgwMDE0KTsKKwkJCWlmICghKGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9FTkFCTEVEKSkgeworCQkJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywKKwkJCQkJCSAgIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfU1RBVFVTLAorCQkJCQkJICAgJmZ1c2VkKTsKIAotICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMyLCAweDE2MUMpOworCQkJCWZpbmUgPSBmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV9NQVNLOworCQkJCWNvYXJzZSA9CisJCQkJICAgIGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfTUFTSzsKIAotICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjk0LCAweDAwMDMpOworCQkJCWlmIChjb2Fyc2UgPgorCQkJCSAgICBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9USFJFU0gpIHsKKwkJCQkJY29hcnNlIC09CisJCQkJCSAgICBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV8xMDsKKwkJCQkJZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTsKKwkJCQl9IGVsc2UgaWYgKGNvYXJzZSA9PQorCQkJCQkgICBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9USFJFU0gpCisJCQkJCWZpbmUgLT0gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEwOwogCi0gICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTYsIDB4MDAzRik7CisJCQkJZnVzZWQgPQorCQkJCSAgICAoZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX1BPTFlfTUFTSykgfAorCQkJCSAgICAoZmluZSAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV9NQVNLKSB8CisJCQkJICAgIChjb2Fyc2UgJgorCQkJCSAgICAgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfTUFTSyk7CiAKLSAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MjAxMCwgMHgwMDA4KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6Ci0gICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGNzMsIDB4MDA5OSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLCAweDMzMDApOwotCi0gICAgICAgIG1zbGVlcCgyMCk7Ci0KLSAgICAgICAgLyogTm93IGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KLSAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7Ci0KLSAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgewotICAgICAgICAgICAgdTE2IGZ1c2VkLCBmaW5lLCBjb2Fyc2U7Ci0KLSAgICAgICAgICAgIC8qIE1vdmUgdG8gYW5hbG9nIHJlZ2lzdGVycyBwYWdlICovCi0gICAgICAgICAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfU1RBVFVTLCAmZnVzZWQpOwotCi0gICAgICAgICAgICBpZiAoIShmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfRU5BQkxFRCkpIHsKLSAgICAgICAgICAgICAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfU1RBVFVTLCAmZnVzZWQpOwotCi0gICAgICAgICAgICAgICAgZmluZSA9IGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0s7Ci0gICAgICAgICAgICAgICAgY29hcnNlID0gZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9NQVNLOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvYXJzZSA+IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX1RIUkVTSCkgewotICAgICAgICAgICAgICAgICAgICBjb2Fyc2UgLT0gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfMTA7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmUgLT0gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2Fyc2UgPT0gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIKQotICAgICAgICAgICAgICAgICAgICBmaW5lIC09IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV8xMDsKLQotICAgICAgICAgICAgICAgIGZ1c2VkID0gKGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9QT0xZX01BU0spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmaW5lICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb2Fyc2UgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9NQVNLKTsKLQotICAgICAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09OVFJPTCwgZnVzZWQpOwotICAgICAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQllQQVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9FTkFCTEVfU1dfQ09OVFJPTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJCQkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKwkJCQkJCSAgICBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPTlRST0wsCisJCQkJCQkgICAgZnVzZWQpOworCQkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsCisJCQkJCQkgICAgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9CWVBBU1MsCisJCQkJCQkgICAgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9FTkFCTEVfU1dfQ09OVFJPTCk7CisJCQl9CisJCX0KKwl9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNldCB0aGUgbWFjIHR5cGUgbWVtYmVyIGluIHRoZSBodyBzdHJ1Y3QuCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfc2V0X21hY190eXBlIC0gU2V0IHRoZSBtYWMgdHlwZSBtZW1iZXIgaW4gdGhlIGh3IHN0cnVjdC4KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKi8KIHMzMiBlMTAwMF9zZXRfbWFjX3R5cGUoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKIAlERUJVR0ZVTkMoImUxMDAwX3NldF9tYWNfdHlwZSIpOwpAQCAtMzk3LDYxICszMTgsMTIgQEAKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0N0dJOgogCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0N19yZXZfMjsKIAkJYnJlYWs7Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9DT1BQRVI6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUzoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFU19EVUFMOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTX1FVQUQ6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MVBUX1FVQURfQ09QUEVSOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9GSUJFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSX0xPV1BST0ZJTEU6Ci0JCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTcxOwotCQlicmVhazsKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MkVJX0NPUFBFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MkVJX0ZJQkVSOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcyRUlfU0VSREVTOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcyRUk6Ci0JCWh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTcyOwotCQlicmVhazsKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3M0U6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NzNFX0lBTVQ6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NzNMOgotCQlody0+bWFjX3R5cGUgPSBlMTAwMF84MjU3MzsKLQkJYnJlYWs7Ci0JY2FzZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fQ09QUEVSX1NQVDoKLQljYXNlIEUxMDAwX0RFVl9JRF84MDAwM0VTMkxBTl9TRVJERVNfU1BUOgotCWNhc2UgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX0NPUFBFUl9EUFQ6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fU0VSREVTX0RQVDoKLQkJaHctPm1hY190eXBlID0gZTEwMDBfODAwMDNlczJsYW47Ci0JCWJyZWFrOwotCWNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUdQX01fQU1UOgotCWNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUdQX0FNVDoKLQljYXNlIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9DOgotCWNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUZFOgotCWNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0dUOgotCWNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0c6Ci0JY2FzZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTToKLQkJaHctPm1hY190eXBlID0gZTEwMDBfaWNoOGxhbjsKLQkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogU2hvdWxkIG5ldmVyIGhhdmUgbG9hZGVkIG9uIHRoaXMgZGV2aWNlICovCiAJCXJldHVybiAtRTEwMDBfRVJSX01BQ19UWVBFOwogCX0KIAogCXN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0JY2FzZSBlMTAwMF9pY2g4bGFuOgotCQlody0+c3dmd2h3X3NlbWFwaG9yZV9wcmVzZW50ID0gdHJ1ZTsKLQkJaHctPmFzZl9maXJtd2FyZV9wcmVzZW50ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLQkJaHctPnN3Zndfc3luY19wcmVzZW50ID0gdHJ1ZTsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBlMTAwMF84MjU3MToKLQljYXNlIGUxMDAwXzgyNTcyOgotCWNhc2UgZTEwMDBfODI1NzM6Ci0JCWh3LT5lZXByb21fc2VtYXBob3JlX3ByZXNlbnQgPSB0cnVlOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIGUxMDAwXzgyNTQxOgogCWNhc2UgZTEwMDBfODI1NDc6CiAJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKQEAgLTQ2OCw2MDU4ICszNDAsNDUwMCBAQAogCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDMpCiAJCWh3LT5iYWRfdHhfY2Fycl9zdGF0c19mZCA9IHRydWU7CiAKLQkvKiBjYXBhYmxlIG9mIHJlY2VpdmluZyBtYW5hZ2VtZW50IHBhY2tldHMgdG8gdGhlIGhvc3QgKi8KLQlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTcxKQotCQlody0+aGFzX21hbmMyaCA9IHRydWU7Ci0KLQkvKiBJbiByYXJlIG9jY2FzaW9ucywgRVNCMiBzeXN0ZW1zIHdvdWxkIGVuZCB1cCBzdGFydGVkIHdpdGhvdXQKLQkgKiB0aGUgUlggdW5pdCBiZWluZyB0dXJuZWQgb24uCi0JICovCi0JaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikKLQkJaHctPnJ4X25lZWRzX2tpY2tpbmcgPSB0cnVlOwotCiAJaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KQogCQlody0+aGFzX3NtYnVzID0gdHJ1ZTsKIAogCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNldCBtZWRpYSB0eXBlIGFuZCBUQkkgY29tcGF0aWJpbGl0eS4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX3NldF9tZWRpYV90eXBlIC0gU2V0IG1lZGlhIHR5cGUgYW5kIFRCSSBjb21wYXRpYmlsaXR5LgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqLwogdm9pZCBlMTAwMF9zZXRfbWVkaWFfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiBzdGF0dXM7CisJdTMyIHN0YXR1czsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X21lZGlhX3R5cGUiKTsKKwlERUJVR0ZVTkMoImUxMDAwX3NldF9tZWRpYV90eXBlIik7CiAKLSAgICBpZiAoaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTQzKSB7Ci0gICAgICAgIC8qIHRiaV9jb21wYXRpYmlsaXR5IGlzIG9ubHkgdmFsaWQgb24gODI1NDMgKi8KLSAgICAgICAgaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuID0gZmFsc2U7Ci0gICAgfQorCWlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NDMpIHsKKwkJLyogdGJpX2NvbXBhdGliaWxpdHkgaXMgb25seSB2YWxpZCBvbiA4MjU0MyAqLworCQlody0+dGJpX2NvbXBhdGliaWxpdHlfZW4gPSBmYWxzZTsKKwl9CiAKLSAgICBzd2l0Y2ggKGh3LT5kZXZpY2VfaWQpIHsKLSAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX1NFUkRFUzoKLSAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUzoKLSAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFUzoKLSAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFU19EVUFMOgotICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTX1FVQUQ6Ci0gICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NzJFSV9TRVJERVM6Ci0gICAgY2FzZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fU0VSREVTX0RQVDoKLSAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlczsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKLSAgICAgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgotICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfaWNoOGxhbjoKLSAgICAgICAgY2FzZSBlMTAwMF84MjU3MzoKLSAgICAgICAgICAgIC8qIFRoZSBTVEFUVVNfVEJJTU9ERSBiaXQgaXMgcmVzZXJ2ZWQgb3IgcmV1c2VkIGZvciB0aGUgdGhpcwotICAgICAgICAgICAgICogZGV2aWNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzdGF0dXMgPSBlcjMyKFNUQVRVUyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1RCSU1PREUpIHsKLSAgICAgICAgICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7Ci0gICAgICAgICAgICAgICAgLyogdGJpX2NvbXBhdGliaWxpdHkgbm90IHZhbGlkIG9uIGZpYmVyICovCi0gICAgICAgICAgICAgICAgaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KKwlzd2l0Y2ggKGh3LT5kZXZpY2VfaWQpIHsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX1NFUkRFUzoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUzoKKwkJaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKwkJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisJCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCQkJaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGF0dXMgPSBlcjMyKFNUQVRVUyk7CisJCQlpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1RCSU1PREUpIHsKKwkJCQlody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7CisJCQkJLyogdGJpX2NvbXBhdGliaWxpdHkgbm90IHZhbGlkIG9uIGZpYmVyICovCisJCQkJaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCWh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXI7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmVzZXQgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHVuaXRzOyBtYXNrIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cy4KKy8qKgorICogZTEwMDBfcmVzZXRfaHc6IHJlc2V0IHRoZSBoYXJkd2FyZSBjb21wbGV0ZWx5CisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQogICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHM7IG1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgorICovCiBzMzIgZTEwMDBfcmVzZXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICB1MzIgY3RybDsKLSAgICB1MzIgY3RybF9leHQ7Ci0gICAgdTMyIGljcjsKLSAgICB1MzIgbWFuYzsKLSAgICB1MzIgbGVkX2N0cmw7Ci0gICAgdTMyIHRpbWVvdXQ7Ci0gICAgdTMyIGV4dGNuZl9jdHJsOwotICAgIHMzMiByZXRfdmFsOworCXUzMiBjdHJsOworCXUzMiBjdHJsX2V4dDsKKwl1MzIgaWNyOworCXUzMiBtYW5jOworCXUzMiBsZWRfY3RybDsKKwlzMzIgcmV0X3ZhbDsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfcmVzZXRfaHciKTsKKwlERUJVR0ZVTkMoImUxMDAwX3Jlc2V0X2h3Iik7CiAKLSAgICAvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBiZWZvcmUgaXNzdWluZyBhIGRldmljZSByZXNldCAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7Ci0gICAgICAgIERFQlVHT1VUKCJEaXNhYmxpbmcgTVdJIG9uIDgyNTQyIHJldiAyLjBcbiIpOwotICAgICAgICBlMTAwMF9wY2lfY2xlYXJfbXdpKGh3KTsKLSAgICB9CisJLyogRm9yIDgyNTQyIChyZXYgMi4wKSwgZGlzYWJsZSBNV0kgYmVmb3JlIGlzc3VpbmcgYSBkZXZpY2UgcmVzZXQgKi8KKwlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworCQlERUJVR09VVCgiRGlzYWJsaW5nIE1XSSBvbiA4MjU0MiByZXYgMi4wXG4iKTsKKwkJZTEwMDBfcGNpX2NsZWFyX213aShodyk7CisJfQogCi0gICAgaWYgKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzcykgewotICAgICAgICAvKiBQcmV2ZW50IHRoZSBQQ0ktRSBidXMgZnJvbSBzdGlja2luZyBpZiB0aGVyZSBpcyBubyBUTFAgY29ubmVjdGlvbgotICAgICAgICAgKiBvbiB0aGUgbGFzdCBUTFAgcmVhZC93cml0ZSB0cmFuc2FjdGlvbiB3aGVuIE1BQyBpcyByZXNldC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChlMTAwMF9kaXNhYmxlX3BjaWV4X21hc3RlcihodykgIT0gRTEwMDBfU1VDQ0VTUykgewotICAgICAgICAgICAgREVCVUdPVVQoIlBDSS1FIE1hc3RlciBkaXNhYmxlIHBvbGxpbmcgaGFzIGZhaWxlZC5cbiIpOwotICAgICAgICB9Ci0gICAgfQorCS8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KKwlERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOworCWV3MzIoSU1DLCAweGZmZmZmZmZmKTsKIAotICAgIC8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KLSAgICBERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOwotICAgIGV3MzIoSU1DLCAweGZmZmZmZmZmKTsKKwkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSB1bml0cy4gIFRoZW4gZGVsYXkgdG8gYWxsb3cKKwkgKiBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlIHdlIGhpdCB0aGUgTUFDIHdpdGgKKwkgKiB0aGUgZ2xvYmFsIHJlc2V0LgorCSAqLworCWV3MzIoUkNUTCwgMCk7CisJZXczMihUQ1RMLCBFMTAwMF9UQ1RMX1BTUCk7CisJRTEwMDBfV1JJVEVfRkxVU0goKTsKIAotICAgIC8qIERpc2FibGUgdGhlIFRyYW5zbWl0IGFuZCBSZWNlaXZlIHVuaXRzLiAgVGhlbiBkZWxheSB0byBhbGxvdwotICAgICAqIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgd2UgaGl0IHRoZSBNQUMgd2l0aAotICAgICAqIHRoZSBnbG9iYWwgcmVzZXQuCi0gICAgICovCi0gICAgZXczMihSQ1RMLCAwKTsKLSAgICBldzMyKFRDVEwsIEUxMDAwX1RDVExfUFNQKTsKLSAgICBFMTAwMF9XUklURV9GTFVTSCgpOworCS8qIFRoZSB0YmlfY29tcGF0aWJpbGl0eV9vbiBGbGFnIG11c3QgYmUgY2xlYXJlZCB3aGVuIFJjdGwgaXMgY2xlYXJlZC4gKi8KKwlody0+dGJpX2NvbXBhdGliaWxpdHlfb24gPSBmYWxzZTsKIAotICAgIC8qIFRoZSB0YmlfY29tcGF0aWJpbGl0eV9vbiBGbGFnIG11c3QgYmUgY2xlYXJlZCB3aGVuIFJjdGwgaXMgY2xlYXJlZC4gKi8KLSAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfb24gPSBmYWxzZTsKKwkvKiBEZWxheSB0byBhbGxvdyBhbnkgb3V0c3RhbmRpbmcgUENJIHRyYW5zYWN0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUKKwkgKiByZXNldHRpbmcgdGhlIGRldmljZQorCSAqLworCW1zbGVlcCgxMCk7CiAKLSAgICAvKiBEZWxheSB0byBhbGxvdyBhbnkgb3V0c3RhbmRpbmcgUENJIHRyYW5zYWN0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUKLSAgICAgKiByZXNldHRpbmcgdGhlIGRldmljZQotICAgICAqLwotICAgIG1zbGVlcCgxMCk7CisJY3RybCA9IGVyMzIoQ1RSTCk7CiAKLSAgICBjdHJsID0gZXIzMihDVFJMKTsKKwkvKiBNdXN0IHJlc2V0IHRoZSBQSFkgYmVmb3JlIHJlc2V0dGluZyB0aGUgTUFDICovCisJaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisJCWV3MzIoQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1BIWV9SU1QpKTsKKwkJbXNsZWVwKDUpOworCX0KIAotICAgIC8qIE11c3QgcmVzZXQgdGhlIFBIWSBiZWZvcmUgcmVzZXR0aW5nIHRoZSBNQUMgKi8KLSAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKLSAgICAgICAgZXczMihDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUEhZX1JTVCkpOwotICAgICAgICBtc2xlZXAoNSk7Ci0gICAgfQorCS8qIElzc3VlIGEgZ2xvYmFsIHJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncworCSAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEsIGFuZCBsaW5rIHVuaXRzLiAgSXQgd2lsbCBub3QgZWZmZWN0CisJICogdGhlIGN1cnJlbnQgUENJIGNvbmZpZ3VyYXRpb24uICBUaGUgZ2xvYmFsIHJlc2V0IGJpdCBpcyBzZWxmLQorCSAqIGNsZWFyaW5nLCBhbmQgc2hvdWxkIGNsZWFyIHdpdGhpbiBhIG1pY3Jvc2Vjb25kLgorCSAqLworCURFQlVHT1VUKCJJc3N1aW5nIGEgZ2xvYmFsIHJlc2V0IHRvIE1BQ1xuIik7CiAKLSAgICAvKiBNdXN0IGFjcXVpcmUgdGhlIE1ESU8gb3duZXJzaGlwIGJlZm9yZSBNQUMgcmVzZXQuCi0gICAgICogT3duZXJzaGlwIGRlZmF1bHRzIHRvIGZpcm13YXJlIGFmdGVyIGEgcmVzZXQuICovCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykgewotICAgICAgICB0aW1lb3V0ID0gMTA7CisJc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQ0OgorCWNhc2UgZTEwMDBfODI1NDA6CisJY2FzZSBlMTAwMF84MjU0NToKKwljYXNlIGUxMDAwXzgyNTQ2OgorCWNhc2UgZTEwMDBfODI1NDE6CisJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwkJLyogVGhlc2UgY29udHJvbGxlcnMgY2FuJ3QgYWNrIHRoZSA2NC1iaXQgd3JpdGUgd2hlbiBpc3N1aW5nIHRoZQorCQkgKiByZXNldCwgc28gdXNlIElPLW1hcHBpbmcgYXMgYSB3b3JrYXJvdW5kIHRvIGlzc3VlIHRoZSByZXNldCAqLworCQlFMTAwMF9XUklURV9SRUdfSU8oaHcsIENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9SU1QpKTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKwljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQkvKiBSZXNldCBpcyBwZXJmb3JtZWQgb24gYSBzaGFkb3cgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJZXczMihDVFJMX0RVUCwgKGN0cmwgfCBFMTAwMF9DVFJMX1JTVCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlldzMyKENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9SU1QpKTsKKwkJYnJlYWs7CisJfQogCi0gICAgICAgIGV4dGNuZl9jdHJsID0gZXIzMihFWFRDTkZfQ1RSTCk7Ci0gICAgICAgIGV4dGNuZl9jdHJsIHw9IEUxMDAwX0VYVENORl9DVFJMX01ESU9fU1dfT1dORVJTSElQOworCS8qIEFmdGVyIE1BQyByZXNldCwgZm9yY2UgcmVsb2FkIG9mIEVFUFJPTSB0byByZXN0b3JlIHBvd2VyLW9uIHNldHRpbmdzIHRvCisJICogZGV2aWNlLiAgTGF0ZXIgY29udHJvbGxlcnMgcmVsb2FkIHRoZSBFRVBST00gYXV0b21hdGljYWxseSwgc28ganVzdCB3YWl0CisJICogZm9yIHJlbG9hZCB0byBjb21wbGV0ZS4KKwkgKi8KKwlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCWNhc2UgZTEwMDBfODI1NDM6CisJY2FzZSBlMTAwMF84MjU0NDoKKwkJLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKwkJdWRlbGF5KDEwKTsKKwkJY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKKwkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfRUVfUlNUOworCQlldzMyKENUUkxfRVhULCBjdHJsX2V4dCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CisJCS8qIFdhaXQgZm9yIEVFUFJPTSByZWxvYWQgKi8KKwkJbXNsZWVwKDIpOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQxOgorCWNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisJY2FzZSBlMTAwMF84MjU0NzoKKwljYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorCQkvKiBXYWl0IGZvciBFRVBST00gcmVsb2FkICovCisJCW1zbGVlcCgyMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEF1dG8gcmVhZCBkb25lIHdpbGwgZGVsYXkgNW1zIG9yIHBvbGwgYmFzZWQgb24gbWFjIHR5cGUgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX2dldF9hdXRvX3JkX2RvbmUoaHcpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCQlicmVhazsKKwl9CiAKLSAgICAgICAgZG8gewotICAgICAgICAgICAgZXczMihFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOwotICAgICAgICAgICAgZXh0Y25mX2N0cmwgPSBlcjMyKEVYVENORl9DVFJMKTsKKwkvKiBEaXNhYmxlIEhXIEFSUHMgb24gQVNGIGVuYWJsZWQgYWRhcHRlcnMgKi8KKwlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQwKSB7CisJCW1hbmMgPSBlcjMyKE1BTkMpOworCQltYW5jICY9IH4oRTEwMDBfTUFOQ19BUlBfRU4pOworCQlldzMyKE1BTkMsIG1hbmMpOworCX0KIAotICAgICAgICAgICAgaWYgKGV4dGNuZl9jdHJsICYgRTEwMDBfRVhUQ05GX0NUUkxfTURJT19TV19PV05FUlNISVApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXh0Y25mX2N0cmwgfD0gRTEwMDBfRVhUQ05GX0NUUkxfTURJT19TV19PV05FUlNISVA7CisJaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisJCWUxMDAwX3BoeV9pbml0X3NjcmlwdChodyk7CiAKLSAgICAgICAgICAgIG1zbGVlcCgyKTsKLSAgICAgICAgICAgIHRpbWVvdXQtLTsKLSAgICAgICAgfSB3aGlsZSAodGltZW91dCk7Ci0gICAgfQorCQkvKiBDb25maWd1cmUgYWN0aXZpdHkgTEVEIGFmdGVyIFBIWSByZXNldCAqLworCQlsZWRfY3RybCA9IGVyMzIoTEVEQ1RMKTsKKwkJbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOworCQlsZWRfY3RybCB8PSAoSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgfCBJR1BfTEVEM19NT0RFKTsKKwkJZXczMihMRURDVEwsIGxlZF9jdHJsKTsKKwl9CiAKLSAgICAvKiBXb3JrYXJvdW5kIGZvciBJQ0g4IGJpdCBjb3JydXB0aW9uIGlzc3VlIGluIEZJRk8gbWVtb3J5ICovCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgIC8qIFNldCBUeCBhbmQgUnggYnVmZmVyIGFsbG9jYXRpb24gdG8gOGsgYXBpZWNlLiAqLwotICAgICAgICBldzMyKFBCQSwgRTEwMDBfUEJBXzhLKTsKLSAgICAgICAgLyogU2V0IFBhY2tldCBCdWZmZXIgU2l6ZSB0byAxNmsuICovCi0gICAgICAgIGV3MzIoUEJTLCBFMTAwMF9QQlNfMTZLKTsKLSAgICB9CisJLyogQ2xlYXIgaW50ZXJydXB0IG1hc2sgdG8gc3RvcCBib2FyZCBmcm9tIGdlbmVyYXRpbmcgaW50ZXJydXB0cyAqLworCURFQlVHT1VUKCJNYXNraW5nIG9mZiBhbGwgaW50ZXJydXB0c1xuIik7CisJZXczMihJTUMsIDB4ZmZmZmZmZmYpOwogCi0gICAgLyogSXNzdWUgYSBnbG9iYWwgcmVzZXQgdG8gdGhlIE1BQy4gIFRoaXMgd2lsbCByZXNldCB0aGUgY2hpcCdzCi0gICAgICogdHJhbnNtaXQsIHJlY2VpdmUsIERNQSwgYW5kIGxpbmsgdW5pdHMuICBJdCB3aWxsIG5vdCBlZmZlY3QKLSAgICAgKiB0aGUgY3VycmVudCBQQ0kgY29uZmlndXJhdGlvbi4gIFRoZSBnbG9iYWwgcmVzZXQgYml0IGlzIHNlbGYtCi0gICAgICogY2xlYXJpbmcsIGFuZCBzaG91bGQgY2xlYXIgd2l0aGluIGEgbWljcm9zZWNvbmQuCi0gICAgICovCi0gICAgREVCVUdPVVQoIklzc3VpbmcgYSBnbG9iYWwgcmVzZXQgdG8gTUFDXG4iKTsKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgZXZlbnRzLiAqLworCWljciA9IGVyMzIoSUNSKTsKIAotICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDQ6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDA6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDU6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDY6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDE6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6Ci0gICAgICAgICAgICAvKiBUaGVzZSBjb250cm9sbGVycyBjYW4ndCBhY2sgdGhlIDY0LWJpdCB3cml0ZSB3aGVuIGlzc3VpbmcgdGhlCi0gICAgICAgICAgICAgKiByZXNldCwgc28gdXNlIElPLW1hcHBpbmcgYXMgYSB3b3JrYXJvdW5kIHRvIGlzc3VlIHRoZSByZXNldCAqLwotICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0lPKGh3LCBDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKLSAgICAgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKLSAgICAgICAgICAgIC8qIFJlc2V0IGlzIHBlcmZvcm1lZCBvbiBhIHNoYWRvdyBvZiB0aGUgY29udHJvbCByZWdpc3RlciAqLwotICAgICAgICAgICAgZXczMihDVFJMX0RVUCwgKGN0cmwgfCBFMTAwMF9DVFJMX1JTVCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfaWNoOGxhbjoKLSAgICAgICAgICAgIGlmICghaHctPnBoeV9yZXNldF9kaXNhYmxlICYmCi0gICAgICAgICAgICAgICAgZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKGh3KSA9PSBFMTAwMF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgLyogZTEwMDBfaWNoOGxhbiBQSFkgSFcgcmVzZXQgcmVxdWlyZXMgTUFDIENPUkUgcmVzZXQKLSAgICAgICAgICAgICAgICAgKiBhdCB0aGUgc2FtZSB0aW1lIHRvIG1ha2Ugc3VyZSB0aGUgaW50ZXJmYWNlIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgKiBNQUMgYW5kIHRoZSBleHRlcm5hbCBQSFkgaXMgcmVzZXQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1BIWV9SU1Q7Ci0gICAgICAgICAgICB9CisJLyogSWYgTVdJIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQsIHJlZW5hYmxlIGl0LiAqLworCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisJCWlmIChody0+cGNpX2NtZF93b3JkICYgUENJX0NPTU1BTkRfSU5WQUxJREFURSkKKwkJCWUxMDAwX3BjaV9zZXRfbXdpKGh3KTsKKwl9CiAKLSAgICAgICAgICAgIGUxMDAwX2dldF9zb2Z0d2FyZV9mbGFnKGh3KTsKLSAgICAgICAgICAgIGV3MzIoQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1JTVCkpOwotICAgICAgICAgICAgbXNsZWVwKDUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBldzMyKENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9SU1QpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIEFmdGVyIE1BQyByZXNldCwgZm9yY2UgcmVsb2FkIG9mIEVFUFJPTSB0byByZXN0b3JlIHBvd2VyLW9uIHNldHRpbmdzIHRvCi0gICAgICogZGV2aWNlLiAgTGF0ZXIgY29udHJvbGxlcnMgcmVsb2FkIHRoZSBFRVBST00gYXV0b21hdGljYWxseSwgc28ganVzdCB3YWl0Ci0gICAgICogZm9yIHJlbG9hZCB0byBjb21wbGV0ZS4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotICAgICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKLSAgICAgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDM6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDQ6Ci0gICAgICAgICAgICAvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZSAqLwotICAgICAgICAgICAgdWRlbGF5KDEwKTsKLSAgICAgICAgICAgIGN0cmxfZXh0ID0gZXIzMihDVFJMX0VYVCk7Ci0gICAgICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9FRV9SU1Q7Ci0gICAgICAgICAgICBldzMyKENUUkxfRVhULCBjdHJsX2V4dCk7Ci0gICAgICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgICAgICAgICAgLyogV2FpdCBmb3IgRUVQUk9NIHJlbG9hZCAqLwotICAgICAgICAgICAgbXNsZWVwKDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDE6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDc6Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6Ci0gICAgICAgICAgICAvKiBXYWl0IGZvciBFRVBST00gcmVsb2FkICovCi0gICAgICAgICAgICBtc2xlZXAoMjApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfODI1NzM6Ci0gICAgICAgICAgICBpZiAoIWUxMDAwX2lzX29uYm9hcmRfbnZtX2VlcHJvbShodykpIHsKLSAgICAgICAgICAgICAgICB1ZGVsYXkoMTApOwotICAgICAgICAgICAgICAgIGN0cmxfZXh0ID0gZXIzMihDVFJMX0VYVCk7Ci0gICAgICAgICAgICAgICAgY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfRUVfUlNUOwotICAgICAgICAgICAgICAgIGV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0KTsKLSAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBBdXRvIHJlYWQgZG9uZSB3aWxsIGRlbGF5IDVtcyBvciBwb2xsIGJhc2VkIG9uIG1hYyB0eXBlICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X2F1dG9fcmRfZG9uZShodyk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIERpc2FibGUgSFcgQVJQcyBvbiBBU0YgZW5hYmxlZCBhZGFwdGVycyAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYgaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKSB7Ci0gICAgICAgIG1hbmMgPSBlcjMyKE1BTkMpOwotICAgICAgICBtYW5jICY9IH4oRTEwMDBfTUFOQ19BUlBfRU4pOwotICAgICAgICBldzMyKE1BTkMsIG1hbmMpOwotICAgIH0KLQotICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxKSB8fCAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgewotICAgICAgICBlMTAwMF9waHlfaW5pdF9zY3JpcHQoaHcpOwotCi0gICAgICAgIC8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCi0gICAgICAgIGxlZF9jdHJsID0gZXIzMihMRURDVEwpOwotICAgICAgICBsZWRfY3RybCAmPSBJR1BfQUNUSVZJVFlfTEVEX01BU0s7Ci0gICAgICAgIGxlZF9jdHJsIHw9IChJR1BfQUNUSVZJVFlfTEVEX0VOQUJMRSB8IElHUF9MRUQzX01PREUpOwotICAgICAgICBldzMyKExFRENUTCwgbGVkX2N0cmwpOwotICAgIH0KLQotICAgIC8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KLSAgICBERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOwotICAgIGV3MzIoSU1DLCAweGZmZmZmZmZmKTsKLQotICAgIC8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCBldmVudHMuICovCi0gICAgaWNyID0gZXIzMihJQ1IpOwotCi0gICAgLyogSWYgTVdJIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQsIHJlZW5hYmxlIGl0LiAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7Ci0gICAgICAgIGlmIChody0+cGNpX2NtZF93b3JkICYgUENJX0NPTU1BTkRfSU5WQUxJREFURSkKLSAgICAgICAgICAgIGUxMDAwX3BjaV9zZXRfbXdpKGh3KTsKLSAgICB9Ci0KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKLSAgICAgICAgdTMyIGthYiA9IGVyMzIoS0FCR1RYRCk7Ci0gICAgICAgIGthYiB8PSBFMTAwMF9LQUJHVFhEX0JHU1FMQklBUzsKLSAgICAgICAgZXczMihLQUJHVFhELCBrYWIpOwotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSW5pdGlhbGl6ZSBhIG51bWJlciBvZiBoYXJkd2FyZS1kZXBlbmRlbnQgYml0cwotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGhhcmR3YXJlIGxpbWl0YXRpb24gd29ya2Fyb3VuZHMgZm9yIFBDSS1FIGFkYXB0ZXJzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZTEwMDBfaW5pdGlhbGl6ZV9oYXJkd2FyZV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgaWYgKChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpICYmICghaHctPmluaXRpYWxpemVfaHdfYml0c19kaXNhYmxlKSkgewotICAgICAgICAvKiBTZXR0aW5ncyBjb21tb24gdG8gYWxsIFBDSS1leHByZXNzIHNpbGljb24gKi8KLSAgICAgICAgdTMyIHJlZ19jdHJsLCByZWdfY3RybF9leHQ7Ci0gICAgICAgIHUzMiByZWdfdGFyYzAsIHJlZ190YXJjMTsKLSAgICAgICAgdTMyIHJlZ190Y3RsOwotICAgICAgICB1MzIgcmVnX3R4ZGN0bCwgcmVnX3R4ZGN0bDE7Ci0KLSAgICAgICAgLyogbGluayBhdXRvbmVnb3RpYXRpb24vc3luYyB3b3JrYXJvdW5kcyAqLwotICAgICAgICByZWdfdGFyYzAgPSBlcjMyKFRBUkMwKTsKLSAgICAgICAgcmVnX3RhcmMwICY9IH4oKDEgPDwgMzApfCgxIDw8IDI5KXwoMSA8PCAyOCl8KDEgPDwgMjcpKTsKLQotICAgICAgICAvKiBFbmFibGUgbm90LWRvbmUgVFggZGVzY3JpcHRvciBjb3VudGluZyAqLwotICAgICAgICByZWdfdHhkY3RsID0gZXIzMihUWERDVEwpOwotICAgICAgICByZWdfdHhkY3RsIHw9IEUxMDAwX1RYRENUTF9DT1VOVF9ERVNDOwotICAgICAgICBldzMyKFRYRENUTCwgcmVnX3R4ZGN0bCk7Ci0gICAgICAgIHJlZ190eGRjdGwxID0gZXIzMihUWERDVEwxKTsKLSAgICAgICAgcmVnX3R4ZGN0bDEgfD0gRTEwMDBfVFhEQ1RMX0NPVU5UX0RFU0M7Ci0gICAgICAgIGV3MzIoVFhEQ1RMMSwgcmVnX3R4ZGN0bDEpOwotCi0gICAgICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIGUxMDAwXzgyNTcxOgotICAgICAgICAgICAgY2FzZSBlMTAwMF84MjU3MjoKLSAgICAgICAgICAgICAgICAvKiBDbGVhciBQSFkgVFggY29tcGF0aWJsZSBtb2RlIGJpdHMgKi8KLSAgICAgICAgICAgICAgICByZWdfdGFyYzEgPSBlcjMyKFRBUkMxKTsKLSAgICAgICAgICAgICAgICByZWdfdGFyYzEgJj0gfigoMSA8PCAzMCl8KDEgPDwgMjkpKTsKLQotICAgICAgICAgICAgICAgIC8qIGxpbmsgYXV0b25lZ290aWF0aW9uL3N5bmMgd29ya2Fyb3VuZHMgKi8KLSAgICAgICAgICAgICAgICByZWdfdGFyYzAgfD0gKCgxIDw8IDI2KXwoMSA8PCAyNSl8KDEgPDwgMjQpfCgxIDw8IDIzKSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBUWCByaW5nIGNvbnRyb2wgZml4ZXMgKi8KLSAgICAgICAgICAgICAgICByZWdfdGFyYzEgfD0gKCgxIDw8IDI2KXwoMSA8PCAyNSl8KDEgPDwgMjQpKTsKLQotICAgICAgICAgICAgICAgIC8qIE11bHRpcGxlIHJlYWQgYml0IGlzIHJldmVyc2VkIHBvbGFyaXR5ICovCi0gICAgICAgICAgICAgICAgcmVnX3RjdGwgPSBlcjMyKFRDVEwpOwotICAgICAgICAgICAgICAgIGlmIChyZWdfdGN0bCAmIEUxMDAwX1RDVExfTVVMUikKLSAgICAgICAgICAgICAgICAgICAgcmVnX3RhcmMxICY9IH4oMSA8PCAyOCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZWdfdGFyYzEgfD0gKDEgPDwgMjgpOwotCi0gICAgICAgICAgICAgICAgZXczMihUQVJDMSwgcmVnX3RhcmMxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgZTEwMDBfODI1NzM6Ci0gICAgICAgICAgICAgICAgcmVnX2N0cmxfZXh0ID0gZXIzMihDVFJMX0VYVCk7Ci0gICAgICAgICAgICAgICAgcmVnX2N0cmxfZXh0ICY9IH4oMSA8PCAyMyk7Ci0gICAgICAgICAgICAgICAgcmVnX2N0cmxfZXh0IHw9ICgxIDw8IDIyKTsKLQotICAgICAgICAgICAgICAgIC8qIFRYIGJ5dGUgY291bnQgZml4ICovCi0gICAgICAgICAgICAgICAgcmVnX2N0cmwgPSBlcjMyKENUUkwpOwotICAgICAgICAgICAgICAgIHJlZ19jdHJsICY9IH4oMSA8PCAyOSk7Ci0KLSAgICAgICAgICAgICAgICBldzMyKENUUkxfRVhULCByZWdfY3RybF9leHQpOwotICAgICAgICAgICAgICAgIGV3MzIoQ1RSTCwgcmVnX2N0cmwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLSAgICAgICAgICAgICAgICAvKiBpbXByb3ZlIHNtYWxsIHBhY2tldCBwZXJmb3JtYWNlIGZvciBmaWJlci9zZXJkZXMgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnX3RhcmMwICY9IH4oMSA8PCAyMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogTXVsdGlwbGUgcmVhZCBiaXQgaXMgcmV2ZXJzZWQgcG9sYXJpdHkgKi8KLSAgICAgICAgICAgICAgICByZWdfdGN0bCA9IGVyMzIoVENUTCk7Ci0gICAgICAgICAgICAgICAgcmVnX3RhcmMxID0gZXIzMihUQVJDMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZ190Y3RsICYgRTEwMDBfVENUTF9NVUxSKQotICAgICAgICAgICAgICAgICAgICByZWdfdGFyYzEgJj0gfigxIDw8IDI4KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlZ190YXJjMSB8PSAoMSA8PCAyOCk7Ci0KLSAgICAgICAgICAgICAgICBldzMyKFRBUkMxLCByZWdfdGFyYzEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBlMTAwMF9pY2g4bGFuOgotICAgICAgICAgICAgICAgIC8qIFJlZHVjZSBjb25jdXJyZW50IERNQSByZXF1ZXN0cyB0byAzIGZyb20gNCAqLwotICAgICAgICAgICAgICAgIGlmICgoaHctPnJldmlzaW9uX2lkIDwgMykgfHwKLSAgICAgICAgICAgICAgICAgICAgKChody0+ZGV2aWNlX2lkICE9IEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NX0FNVCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIChody0+ZGV2aWNlX2lkICE9IEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NKSkpCi0gICAgICAgICAgICAgICAgICAgIHJlZ190YXJjMCB8PSAoKDEgPDwgMjkpfCgxIDw8IDI4KSk7Ci0KLSAgICAgICAgICAgICAgICByZWdfY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKLSAgICAgICAgICAgICAgICByZWdfY3RybF9leHQgfD0gKDEgPDwgMjIpOwotICAgICAgICAgICAgICAgIGV3MzIoQ1RSTF9FWFQsIHJlZ19jdHJsX2V4dCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB3b3JrYXJvdW5kIFRYIGhhbmcgd2l0aCBUU089b24gKi8KLSAgICAgICAgICAgICAgICByZWdfdGFyYzAgfD0gKCgxIDw8IDI3KXwoMSA8PCAyNil8KDEgPDwgMjQpfCgxIDw8IDIzKSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBNdWx0aXBsZSByZWFkIGJpdCBpcyByZXZlcnNlZCBwb2xhcml0eSAqLwotICAgICAgICAgICAgICAgIHJlZ190Y3RsID0gZXIzMihUQ1RMKTsKLSAgICAgICAgICAgICAgICByZWdfdGFyYzEgPSBlcjMyKFRBUkMxKTsKLSAgICAgICAgICAgICAgICBpZiAocmVnX3RjdGwgJiBFMTAwMF9UQ1RMX01VTFIpCi0gICAgICAgICAgICAgICAgICAgIHJlZ190YXJjMSAmPSB+KDEgPDwgMjgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVnX3RhcmMxIHw9ICgxIDw8IDI4KTsKLQotICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgVFggaGFuZyB3aXRoIFRTTz1vbiAqLwotICAgICAgICAgICAgICAgIHJlZ190YXJjMSB8PSAoKDEgPDwgMzApfCgxIDw8IDI2KXwoMSA8PCAyNCkpOwotCi0gICAgICAgICAgICAgICAgZXczMihUQVJDMSwgcmVnX3RhcmMxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBldzMyKFRBUkMwLCByZWdfdGFyYzApOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGVyZm9ybXMgYmFzaWMgY29uZmlndXJhdGlvbiBvZiB0aGUgYWRhcHRlci4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorLyoqCisgKiBlMTAwMF9pbml0X2h3OiBQZXJmb3JtcyBiYXNpYyBjb25maWd1cmF0aW9uIG9mIHRoZSBhZGFwdGVyLgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICAqCiAgKiBBc3N1bWVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIHByZXZpb3VzbHkgYmVlbiByZXNldCBhbmQgaXMgaW4gYQogICogcG9zdC1yZXNldCB1bmluaXRpYWxpemVkIHN0YXRlLiBJbml0aWFsaXplcyB0aGUgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycywKICAqIG11bHRpY2FzdCB0YWJsZSwgYW5kIFZMQU4gZmlsdGVyIHRhYmxlLiBDYWxscyByb3V0aW5lcyB0byBzZXR1cCBsaW5rCiAgKiBjb25maWd1cmF0aW9uIGFuZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MuIENsZWFycyBhbGwgb24tY2hpcCBjb3VudGVycy4gTGVhdmVzCiAgKiB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHMgZGlzYWJsZWQgYW5kIHVuaW5pdGlhbGl6ZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIHMzMiBlMTAwMF9pbml0X2h3KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIGN0cmw7Ci0gICAgdTMyIGk7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTMyIG10YV9zaXplOwotICAgIHUzMiByZWdfZGF0YTsKLSAgICB1MzIgY3RybF9leHQ7CisJdTMyIGN0cmw7CisJdTMyIGk7CisJczMyIHJldF92YWw7CisJdTMyIG10YV9zaXplOworCXUzMiBjdHJsX2V4dDsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfaW5pdF9odyIpOworCURFQlVHRlVOQygiZTEwMDBfaW5pdF9odyIpOwogCi0gICAgLyogZm9yY2UgZnVsbCBETUEgY2xvY2sgZnJlcXVlbmN5IGZvciAxMC8xMDAgb24gSUNIOCBBMC1CMCAqLwotICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pICYmCi0gICAgICAgICgoaHctPnJldmlzaW9uX2lkIDwgMykgfHwKLSAgICAgICAgICgoaHctPmRldmljZV9pZCAhPSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTV9BTVQpICYmCi0gICAgICAgICAgKGh3LT5kZXZpY2VfaWQgIT0gRTEwMDBfREVWX0lEX0lDSDhfSUdQX00pKSkpIHsKLSAgICAgICAgICAgIHJlZ19kYXRhID0gZXIzMihTVEFUVVMpOwotICAgICAgICAgICAgcmVnX2RhdGEgJj0gfjB4ODAwMDAwMDA7Ci0gICAgICAgICAgICBldzMyKFNUQVRVUywgcmVnX2RhdGEpOwotICAgIH0KKwkvKiBJbml0aWFsaXplIElkZW50aWZpY2F0aW9uIExFRCAqLworCXJldF92YWwgPSBlMTAwMF9pZF9sZWRfaW5pdChodyk7CisJaWYgKHJldF92YWwpIHsKKwkJREVCVUdPVVQoIkVycm9yIEluaXRpYWxpemluZyBJZGVudGlmaWNhdGlvbiBMRURcbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CiAKLSAgICAvKiBJbml0aWFsaXplIElkZW50aWZpY2F0aW9uIExFRCAqLwotICAgIHJldF92YWwgPSBlMTAwMF9pZF9sZWRfaW5pdChodyk7Ci0gICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgREVCVUdPVVQoIkVycm9yIEluaXRpYWxpemluZyBJZGVudGlmaWNhdGlvbiBMRURcbiIpOwotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9CisJLyogU2V0IHRoZSBtZWRpYSB0eXBlIGFuZCBUQkkgY29tcGF0aWJpbGl0eSAqLworCWUxMDAwX3NldF9tZWRpYV90eXBlKGh3KTsKIAotICAgIC8qIFNldCB0aGUgbWVkaWEgdHlwZSBhbmQgVEJJIGNvbXBhdGliaWxpdHkgKi8KLSAgICBlMTAwMF9zZXRfbWVkaWFfdHlwZShodyk7CisJLyogRGlzYWJsaW5nIFZMQU4gZmlsdGVyaW5nLiAqLworCURFQlVHT1VUKCJJbml0aWFsaXppbmcgdGhlIElFRUUgVkxBTlxuIik7CisJaWYgKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQ1X3Jldl8zKQorCQlldzMyKFZFVCwgMCk7CisJZTEwMDBfY2xlYXJfdmZ0YShodyk7CiAKLSAgICAvKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBlMTAwMF9zZXRfbWVkaWFfdHlwZSBiZWNhdXNlIG1lZGlhX3R5cGUgaXMgdXNlZCAqLwotICAgIGUxMDAwX2luaXRpYWxpemVfaGFyZHdhcmVfYml0cyhodyk7CisJLyogRm9yIDgyNTQyIChyZXYgMi4wKSwgZGlzYWJsZSBNV0kgYW5kIHB1dCB0aGUgcmVjZWl2ZXIgaW50byByZXNldCAqLworCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisJCURFQlVHT1VUKCJEaXNhYmxpbmcgTVdJIG9uIDgyNTQyIHJldiAyLjBcbiIpOworCQllMTAwMF9wY2lfY2xlYXJfbXdpKGh3KTsKKwkJZXczMihSQ1RMLCBFMTAwMF9SQ1RMX1JTVCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CisJCW1zbGVlcCg1KTsKKwl9CiAKLSAgICAvKiBEaXNhYmxpbmcgVkxBTiBmaWx0ZXJpbmcuICovCi0gICAgREVCVUdPVVQoIkluaXRpYWxpemluZyB0aGUgSUVFRSBWTEFOXG4iKTsKLSAgICAvKiBWRVQgaGFyZGNvZGVkIHRvIHN0YW5kYXJkIHZhbHVlIGFuZCBWRlRBIHJlbW92ZWQgaW4gSUNIOCBMQU4gKi8KLSAgICBpZiAoaHctPm1hY190eXBlICE9IGUxMDAwX2ljaDhsYW4pIHsKLSAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQ1X3Jldl8zKQotICAgICAgICAgICAgZXczMihWRVQsIDApOwotICAgICAgICBlMTAwMF9jbGVhcl92ZnRhKGh3KTsKLSAgICB9CisJLyogU2V0dXAgdGhlIHJlY2VpdmUgYWRkcmVzcy4gVGhpcyBpbnZvbHZlcyBpbml0aWFsaXppbmcgYWxsIG9mIHRoZSBSZWNlaXZlCisJICogQWRkcmVzcyBSZWdpc3RlcnMgKFJBUnMgMCAtIDE1KS4KKwkgKi8KKwllMTAwMF9pbml0X3J4X2FkZHJzKGh3KTsKIAotICAgIC8qIEZvciA4MjU0MiAocmV2IDIuMCksIGRpc2FibGUgTVdJIGFuZCBwdXQgdGhlIHJlY2VpdmVyIGludG8gcmVzZXQgKi8KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgewotICAgICAgICBERUJVR09VVCgiRGlzYWJsaW5nIE1XSSBvbiA4MjU0MiByZXYgMi4wXG4iKTsKLSAgICAgICAgZTEwMDBfcGNpX2NsZWFyX213aShodyk7Ci0gICAgICAgIGV3MzIoUkNUTCwgRTEwMDBfUkNUTF9SU1QpOwotICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgICAgICBtc2xlZXAoNSk7Ci0gICAgfQorCS8qIEZvciA4MjU0MiAocmV2IDIuMCksIHRha2UgdGhlIHJlY2VpdmVyIG91dCBvZiByZXNldCBhbmQgZW5hYmxlIE1XSSAqLworCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisJCWV3MzIoUkNUTCwgMCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CisJCW1zbGVlcCgxKTsKKwkJaWYgKGh3LT5wY2lfY21kX3dvcmQgJiBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKQorCQkJZTEwMDBfcGNpX3NldF9td2koaHcpOworCX0KIAotICAgIC8qIFNldHVwIHRoZSByZWNlaXZlIGFkZHJlc3MuIFRoaXMgaW52b2x2ZXMgaW5pdGlhbGl6aW5nIGFsbCBvZiB0aGUgUmVjZWl2ZQotICAgICAqIEFkZHJlc3MgUmVnaXN0ZXJzIChSQVJzIDAgLSAxNSkuCi0gICAgICovCi0gICAgZTEwMDBfaW5pdF9yeF9hZGRycyhodyk7CisJLyogWmVybyBvdXQgdGhlIE11bHRpY2FzdCBIQVNIIHRhYmxlICovCisJREVCVUdPVVQoIlplcm9pbmcgdGhlIE1UQVxuIik7CisJbXRhX3NpemUgPSBFMTAwMF9NQ19UQkxfU0laRTsKKwlmb3IgKGkgPSAwOyBpIDwgbXRhX3NpemU7IGkrKykgeworCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CisJCS8qIHVzZSB3cml0ZSBmbHVzaCB0byBwcmV2ZW50IE1lbW9yeSBXcml0ZSBCbG9jayAoTVdCKSBmcm9tCisJCSAqIG9jY3VycmluZyB3aGVuIGFjY2Vzc2luZyBvdXIgcmVnaXN0ZXIgc3BhY2UgKi8KKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwl9CiAKLSAgICAvKiBGb3IgODI1NDIgKHJldiAyLjApLCB0YWtlIHRoZSByZWNlaXZlciBvdXQgb2YgcmVzZXQgYW5kIGVuYWJsZSBNV0kgKi8KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgewotICAgICAgICBldzMyKFJDVEwsIDApOwotICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgICAgICBtc2xlZXAoMSk7Ci0gICAgICAgIGlmIChody0+cGNpX2NtZF93b3JkICYgUENJX0NPTU1BTkRfSU5WQUxJREFURSkKLSAgICAgICAgICAgIGUxMDAwX3BjaV9zZXRfbXdpKGh3KTsKLSAgICB9CisJLyogU2V0IHRoZSBQQ0kgcHJpb3JpdHkgYml0IGNvcnJlY3RseSBpbiB0aGUgQ1RSTCByZWdpc3Rlci4gIFRoaXMKKwkgKiBkZXRlcm1pbmVzIGlmIHRoZSBhZGFwdGVyIGdpdmVzIHByaW9yaXR5IHRvIHJlY2VpdmVzLCBvciBpZiBpdAorCSAqIGdpdmVzIGVxdWFsIHByaW9yaXR5IHRvIHRyYW5zbWl0cyBhbmQgcmVjZWl2ZXMuICBWYWxpZCBvbmx5IG9uCisJICogODI1NDIgYW5kIDgyNTQzIHNpbGljb24uCisJICovCisJaWYgKGh3LT5kbWFfZmFpcm5lc3MgJiYgaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzKSB7CisJCWN0cmwgPSBlcjMyKENUUkwpOworCQlldzMyKENUUkwsIGN0cmwgfCBFMTAwMF9DVFJMX1BSSU9SKTsKKwl9CiAKLSAgICAvKiBaZXJvIG91dCB0aGUgTXVsdGljYXN0IEhBU0ggdGFibGUgKi8KLSAgICBERUJVR09VVCgiWmVyb2luZyB0aGUgTVRBXG4iKTsKLSAgICBtdGFfc2l6ZSA9IEUxMDAwX01DX1RCTF9TSVpFOwotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikKLSAgICAgICAgbXRhX3NpemUgPSBFMTAwMF9NQ19UQkxfU0laRV9JQ0g4TEFOOwotICAgIGZvciAoaSA9IDA7IGkgPCBtdGFfc2l6ZTsgaSsrKSB7Ci0gICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCBpLCAwKTsKLSAgICAgICAgLyogdXNlIHdyaXRlIGZsdXNoIHRvIHByZXZlbnQgTWVtb3J5IFdyaXRlIEJsb2NrIChNV0IpIGZyb20KLSAgICAgICAgICogb2NjdXJpbmcgd2hlbiBhY2Nlc3Npbmcgb3VyIHJlZ2lzdGVyIHNwYWNlICovCi0gICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgfQorCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKwljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBXb3JrYXJvdW5kIGZvciBQQ0ktWCBwcm9ibGVtIHdoZW4gQklPUyBzZXRzIE1NUkJDIGluY29ycmVjdGx5LiAqLworCQlpZiAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgKKwkJICAgICYmIGUxMDAwX3BjaXhfZ2V0X21tcmJjKGh3KSA+IDIwNDgpCisJCQllMTAwMF9wY2l4X3NldF9tbXJiYyhodywgMjA0OCk7CisJCWJyZWFrOworCX0KIAotICAgIC8qIFNldCB0aGUgUENJIHByaW9yaXR5IGJpdCBjb3JyZWN0bHkgaW4gdGhlIENUUkwgcmVnaXN0ZXIuICBUaGlzCi0gICAgICogZGV0ZXJtaW5lcyBpZiB0aGUgYWRhcHRlciBnaXZlcyBwcmlvcml0eSB0byByZWNlaXZlcywgb3IgaWYgaXQKLSAgICAgKiBnaXZlcyBlcXVhbCBwcmlvcml0eSB0byB0cmFuc21pdHMgYW5kIHJlY2VpdmVzLiAgVmFsaWQgb25seSBvbgotICAgICAqIDgyNTQyIGFuZCA4MjU0MyBzaWxpY29uLgotICAgICAqLwotICAgIGlmIChody0+ZG1hX2ZhaXJuZXNzICYmIGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0MykgewotICAgICAgICBjdHJsID0gZXIzMihDVFJMKTsKLSAgICAgICAgZXczMihDVFJMLCBjdHJsIHwgRTEwMDBfQ1RSTF9QUklPUik7Ci0gICAgfQorCS8qIENhbGwgYSBzdWJyb3V0aW5lIHRvIGNvbmZpZ3VyZSB0aGUgbGluayBhbmQgc2V0dXAgZmxvdyBjb250cm9sLiAqLworCXJldF92YWwgPSBlMTAwMF9zZXR1cF9saW5rKGh3KTsKIAotICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKLSAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAvKiBXb3JrYXJvdW5kIGZvciBQQ0ktWCBwcm9ibGVtIHdoZW4gQklPUyBzZXRzIE1NUkJDIGluY29ycmVjdGx5LiAqLwotCWlmIChody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpeCAmJiBlMTAwMF9wY2l4X2dldF9tbXJiYyhodykgPiAyMDQ4KQotCQllMTAwMF9wY2l4X3NldF9tbXJiYyhodywgMjA0OCk7Ci0JYnJlYWs7Ci0gICAgfQorCS8qIFNldCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciB3cml0ZS1iYWNrIHBvbGljeSAqLworCWlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgeworCQljdHJsID0gZXIzMihUWERDVEwpOworCQljdHJsID0KKwkJICAgIChjdHJsICYgfkUxMDAwX1RYRENUTF9XVEhSRVNIKSB8CisJCSAgICBFMTAwMF9UWERDVExfRlVMTF9UWF9ERVNDX1dCOworCQlldzMyKFRYRENUTCwgY3RybCk7CisJfQogCi0gICAgLyogTW9yZSB0aW1lIG5lZWRlZCBmb3IgUEhZIHRvIGluaXRpYWxpemUgKi8KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCi0gICAgICAgIG1zbGVlcCgxNSk7CisJLyogQ2xlYXIgYWxsIG9mIHRoZSBzdGF0aXN0aWNzIHJlZ2lzdGVycyAoY2xlYXIgb24gcmVhZCkuICBJdCBpcworCSAqIGltcG9ydGFudCB0aGF0IHdlIGRvIHRoaXMgYWZ0ZXIgd2UgaGF2ZSB0cmllZCB0byBlc3RhYmxpc2ggbGluaworCSAqIGJlY2F1c2UgdGhlIHN5bWJvbCBlcnJvciBjb3VudCB3aWxsIGluY3JlbWVudCB3aWxkbHkgaWYgdGhlcmUKKwkgKiBpcyBubyBsaW5rLgorCSAqLworCWUxMDAwX2NsZWFyX2h3X2NudHJzKGh3KTsKIAotICAgIC8qIENhbGwgYSBzdWJyb3V0aW5lIHRvIGNvbmZpZ3VyZSB0aGUgbGluayBhbmQgc2V0dXAgZmxvdyBjb250cm9sLiAqLwotICAgIHJldF92YWwgPSBlMTAwMF9zZXR1cF9saW5rKGh3KTsKKwlpZiAoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUiB8fAorCSAgICBody0+ZGV2aWNlX2lkID09IEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSX0tTUDMpIHsKKwkJY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKKwkJLyogUmVsYXhlZCBvcmRlcmluZyBtdXN0IGJlIGRpc2FibGVkIHRvIGF2b2lkIGEgcGFyaXR5CisJCSAqIGVycm9yIGNyYXNoIGluIGEgUENJIHNsb3QuICovCisJCWN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX1JPX0RJUzsKKwkJZXczMihDVFJMX0VYVCwgY3RybF9leHQpOworCX0KIAotICAgIC8qIFNldCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciB3cml0ZS1iYWNrIHBvbGljeSAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgewotICAgICAgICBjdHJsID0gZXIzMihUWERDVEwpOwotICAgICAgICBjdHJsID0gKGN0cmwgJiB+RTEwMDBfVFhEQ1RMX1dUSFJFU0gpIHwgRTEwMDBfVFhEQ1RMX0ZVTExfVFhfREVTQ19XQjsKLSAgICAgICAgZXczMihUWERDVEwsIGN0cmwpOwotICAgIH0KLQotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKLSAgICAgICAgZTEwMDBfZW5hYmxlX3R4X3BrdF9maWx0ZXJpbmcoaHcpOwotICAgIH0KLQotICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLSAgICAgICAgLyogRW5hYmxlIHJldHJhbnNtaXQgb24gbGF0ZSBjb2xsaXNpb25zICovCi0gICAgICAgIHJlZ19kYXRhID0gZXIzMihUQ1RMKTsKLSAgICAgICAgcmVnX2RhdGEgfD0gRTEwMDBfVENUTF9SVExDOwotICAgICAgICBldzMyKFRDVEwsIHJlZ19kYXRhKTsKLQotICAgICAgICAvKiBDb25maWd1cmUgR2lnYWJpdCBDYXJyeSBFeHRlbmQgUGFkZGluZyAqLwotICAgICAgICByZWdfZGF0YSA9IGVyMzIoVENUTF9FWFQpOwotICAgICAgICByZWdfZGF0YSAmPSB+RTEwMDBfVENUTF9FWFRfR0NFWF9NQVNLOwotICAgICAgICByZWdfZGF0YSB8PSBERUZBVUxUXzgwMDAzRVMyTEFOX1RDVExfRVhUX0dDRVg7Ci0gICAgICAgIGV3MzIoVENUTF9FWFQsIHJlZ19kYXRhKTsKLQotICAgICAgICAvKiBDb25maWd1cmUgVHJhbnNtaXQgSW50ZXItUGFja2V0IEdhcCAqLwotICAgICAgICByZWdfZGF0YSA9IGVyMzIoVElQRyk7Ci0gICAgICAgIHJlZ19kYXRhICY9IH5FMTAwMF9USVBHX0lQR1RfTUFTSzsKLSAgICAgICAgcmVnX2RhdGEgfD0gREVGQVVMVF84MDAwM0VTMkxBTl9USVBHX0lQR1RfMTAwMDsKLSAgICAgICAgZXczMihUSVBHLCByZWdfZGF0YSk7Ci0KLSAgICAgICAgcmVnX2RhdGEgPSBFMTAwMF9SRUFEX1JFR19BUlJBWShodywgRkZMVCwgMHgwMDAxKTsKLSAgICAgICAgcmVnX2RhdGEgJj0gfjB4MDAxMDAwMDA7Ci0gICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgRkZMVCwgMHgwMDAxLCByZWdfZGF0YSk7Ci0gICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgZTEwMDBfODI1NzE6Ci0gICAgY2FzZSBlMTAwMF84MjU3MjoKLSAgICBjYXNlIGUxMDAwX2ljaDhsYW46Ci0gICAgICAgIGN0cmwgPSBlcjMyKFRYRENUTDEpOwotICAgICAgICBjdHJsID0gKGN0cmwgJiB+RTEwMDBfVFhEQ1RMX1dUSFJFU0gpIHwgRTEwMDBfVFhEQ1RMX0ZVTExfVFhfREVTQ19XQjsKLSAgICAgICAgZXczMihUWERDVEwxLCBjdHJsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7Ci0gICAgICAgIHUzMiBnY3IgPSBlcjMyKEdDUik7Ci0gICAgICAgIGdjciB8PSBFMTAwMF9HQ1JfTDFfQUNUX1dJVEhPVVRfTDBTX1JYOwotICAgICAgICBldzMyKEdDUiwgZ2NyKTsKLSAgICB9Ci0KLSAgICAvKiBDbGVhciBhbGwgb2YgdGhlIHN0YXRpc3RpY3MgcmVnaXN0ZXJzIChjbGVhciBvbiByZWFkKS4gIEl0IGlzCi0gICAgICogaW1wb3J0YW50IHRoYXQgd2UgZG8gdGhpcyBhZnRlciB3ZSBoYXZlIHRyaWVkIHRvIGVzdGFibGlzaCBsaW5rCi0gICAgICogYmVjYXVzZSB0aGUgc3ltYm9sIGVycm9yIGNvdW50IHdpbGwgaW5jcmVtZW50IHdpbGRseSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGxpbmsuCi0gICAgICovCi0gICAgZTEwMDBfY2xlYXJfaHdfY250cnMoaHcpOwotCi0gICAgLyogSUNIOCBOby1zbm9vcCBiaXRzIGFyZSBvcHBvc2l0ZSBwb2xhcml0eS4KLSAgICAgKiBTZXQgdG8gc25vb3AgYnkgZGVmYXVsdCBhZnRlciByZXNldC4gKi8KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCi0gICAgICAgIGUxMDAwX3NldF9wY2lfZXhfbm9fc25vb3AoaHcsIFBDSV9FWF84MjU2Nl9TTk9PUF9BTEwpOwotCi0gICAgaWYgKGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVIgfHwKLSAgICAgICAgaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzKSB7Ci0gICAgICAgIGN0cmxfZXh0ID0gZXIzMihDVFJMX0VYVCk7Ci0gICAgICAgIC8qIFJlbGF4ZWQgb3JkZXJpbmcgbXVzdCBiZSBkaXNhYmxlZCB0byBhdm9pZCBhIHBhcml0eQotICAgICAgICAgKiBlcnJvciBjcmFzaCBpbiBhIFBDSSBzbG90LiAqLwotICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9ST19ESVM7Ci0gICAgICAgIGV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0X3ZhbDsKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQWRqdXN0IFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGJhc2VkIG9uIEVFUFJPTSBzZXR0aW5nLgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9hZGp1c3Rfc2VyZGVzX2FtcGxpdHVkZSAtIEFkanVzdCBTRVJERVMgb3V0cHV0IGFtcGxpdHVkZSBiYXNlZCBvbiBFRVBST00gc2V0dGluZy4KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlLgorICovCiBzdGF0aWMgczMyIGUxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTE2IGVlcHJvbV9kYXRhOwotICAgIHMzMiAgcmV0X3ZhbDsKKwl1MTYgZWVwcm9tX2RhdGE7CisJczMyIHJldF92YWw7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlIik7CisJREVCVUdGVU5DKCJlMTAwMF9hZGp1c3Rfc2VyZGVzX2FtcGxpdHVkZSIpOwogCi0gICAgaWYgKGh3LT5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKQotICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlpZiAoaHctPm1lZGlhX3R5cGUgIT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpCisJCXJldHVybiBFMTAwMF9TVUNDRVNTOwogCi0gICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKLSAgICBjYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgotICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotICAgIH0KKwlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJfQogCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fU0VSREVTX0FNUExJVFVERSwgMSwgJmVlcHJvbV9kYXRhKTsKLSAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9CisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fU0VSREVTX0FNUExJVFVERSwgMSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVlcHJvbV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkgeworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CiAKLSAgICBpZiAoZWVwcm9tX2RhdGEgIT0gRUVQUk9NX1JFU0VSVkVEX1dPUkQpIHsKLSAgICAgICAgLyogQWRqdXN0IFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIG9ubHkuICovCi0gICAgICAgIGVlcHJvbV9kYXRhICY9IEVFUFJPTV9TRVJERVNfQU1QTElUVURFX01BU0s7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfRVhUX0NUUkwsIGVlcHJvbV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9CisJaWYgKGVlcHJvbV9kYXRhICE9IEVFUFJPTV9SRVNFUlZFRF9XT1JEKSB7CisJCS8qIEFkanVzdCBTRVJERVMgb3V0cHV0IGFtcGxpdHVkZSBvbmx5LiAqLworCQllZXByb21fZGF0YSAmPSBFRVBST01fU0VSREVTX0FNUExJVFVERV9NQVNLOworCQlyZXRfdmFsID0KKwkJICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9FWFRfQ1RSTCwgZWVwcm9tX2RhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCX0KIAotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25maWd1cmVzIGZsb3cgY29udHJvbCBhbmQgbGluayBzZXR0aW5ncy4KKy8qKgorICogZTEwMDBfc2V0dXBfbGluayAtIENvbmZpZ3VyZXMgZmxvdyBjb250cm9sIGFuZCBsaW5rIHNldHRpbmdzLgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoKLSAqIERldGVybWluZXMgd2hpY2ggZmxvdyBjb250cm9sIHNldHRpbmdzIHRvIHVzZS4gQ2FsbHMgdGhlIGFwcm9wcmlhdGUgbWVkaWEtCisgKiBEZXRlcm1pbmVzIHdoaWNoIGZsb3cgY29udHJvbCBzZXR0aW5ncyB0byB1c2UuIENhbGxzIHRoZSBhcHByb3ByaWF0ZSBtZWRpYS0KICAqIHNwZWNpZmljIGxpbmsgY29uZmlndXJhdGlvbiBmdW5jdGlvbi4gQ29uZmlndXJlcyB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzLgogICogQXNzdW1pbmcgdGhlIGFkYXB0ZXIgaGFzIGEgdmFsaWQgbGluayBwYXJ0bmVyLCBhIHZhbGlkIGxpbmsgc2hvdWxkIGJlCiAgKiBlc3RhYmxpc2hlZC4gQXNzdW1lcyB0aGUgaGFyZHdhcmUgaGFzIHByZXZpb3VzbHkgYmVlbiByZXNldCBhbmQgdGhlCiAgKiB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIgYXJlIG5vdCBlbmFibGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzMzIgZTEwMDBfc2V0dXBfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiBjdHJsX2V4dDsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICB1MTYgZWVwcm9tX2RhdGE7CisJdTMyIGN0cmxfZXh0OworCXMzMiByZXRfdmFsOworCXUxNiBlZXByb21fZGF0YTsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfc2V0dXBfbGluayIpOworCURFQlVHRlVOQygiZTEwMDBfc2V0dXBfbGluayIpOwogCi0gICAgLyogSW4gdGhlIGNhc2Ugb2YgdGhlIHBoeSByZXNldCBiZWluZyBibG9ja2VkLCB3ZSBhbHJlYWR5IGhhdmUgYSBsaW5rLgotICAgICAqIFdlIGRvIG5vdCBoYXZlIHRvIHNldCBpdCB1cCBhZ2Fpbi4gKi8KLSAgICBpZiAoZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKGh3KSkKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJLyogUmVhZCBhbmQgc3RvcmUgd29yZCAweDBGIG9mIHRoZSBFRVBST00uIFRoaXMgd29yZCBjb250YWlucyBiaXRzCisJICogdGhhdCBkZXRlcm1pbmUgdGhlIGhhcmR3YXJlJ3MgZGVmYXVsdCBQQVVTRSAoZmxvdyBjb250cm9sKSBtb2RlLAorCSAqIGEgYml0IHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBIVyBkZWZhdWx0cyB0byBlbmFibGluZyBvcgorCSAqIGRpc2FibGluZyBhdXRvLW5lZ290aWF0aW9uLCBhbmQgdGhlIGRpcmVjdGlvbiBvZiB0aGUKKwkgKiBTVyBkZWZpbmVkIHBpbnMuIElmIHRoZXJlIGlzIG5vIFNXIG92ZXItcmlkZSBvZiB0aGUgZmxvdworCSAqIGNvbnRyb2wgc2V0dGluZywgdGhlbiB0aGUgdmFyaWFibGUgaHctPmZjIHdpbGwKKwkgKiBiZSBpbml0aWFsaXplZCBiYXNlZCBvbiBhIHZhbHVlIGluIHRoZSBFRVBST00uCisJICovCisJaWYgKGh3LT5mYyA9PSBFMTAwMF9GQ19ERUZBVUxUKSB7CisJCXJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHLAorCQkJCQkgICAgMSwgJmVlcHJvbV9kYXRhKTsKKwkJaWYgKHJldF92YWwpIHsKKwkJCURFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJCX0KKwkJaWYgKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfUEFVU0VfTUFTSykgPT0gMCkKKwkJCWh3LT5mYyA9IEUxMDAwX0ZDX05PTkU7CisJCWVsc2UgaWYgKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfUEFVU0VfTUFTSykgPT0KKwkJCSBFRVBST01fV09SRDBGX0FTTV9ESVIpCisJCQlody0+ZmMgPSBFMTAwMF9GQ19UWF9QQVVTRTsKKwkJZWxzZQorCQkJaHctPmZjID0gRTEwMDBfRkNfRlVMTDsKKwl9CiAKLSAgICAvKiBSZWFkIGFuZCBzdG9yZSB3b3JkIDB4MEYgb2YgdGhlIEVFUFJPTS4gVGhpcyB3b3JkIGNvbnRhaW5zIGJpdHMKLSAgICAgKiB0aGF0IGRldGVybWluZSB0aGUgaGFyZHdhcmUncyBkZWZhdWx0IFBBVVNFIChmbG93IGNvbnRyb2wpIG1vZGUsCi0gICAgICogYSBiaXQgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIEhXIGRlZmF1bHRzIHRvIGVuYWJsaW5nIG9yCi0gICAgICogZGlzYWJsaW5nIGF1dG8tbmVnb3RpYXRpb24sIGFuZCB0aGUgZGlyZWN0aW9uIG9mIHRoZQotICAgICAqIFNXIGRlZmluZWQgcGlucy4gSWYgdGhlcmUgaXMgbm8gU1cgb3Zlci1yaWRlIG9mIHRoZSBmbG93Ci0gICAgICogY29udHJvbCBzZXR0aW5nLCB0aGVuIHRoZSB2YXJpYWJsZSBody0+ZmMgd2lsbAotICAgICAqIGJlIGluaXRpYWxpemVkIGJhc2VkIG9uIGEgdmFsdWUgaW4gdGhlIEVFUFJPTS4KLSAgICAgKi8KLSAgICBpZiAoaHctPmZjID09IEUxMDAwX0ZDX0RFRkFVTFQpIHsKLSAgICAgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKLSAgICAgICAgY2FzZSBlMTAwMF9pY2g4bGFuOgotICAgICAgICBjYXNlIGUxMDAwXzgyNTczOgotICAgICAgICAgICAgaHctPmZjID0gRTEwMDBfRkNfRlVMTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fSU5JVF9DT05UUk9MMl9SRUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJmVlcHJvbV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKSB7Ci0gICAgICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGVlcHJvbV9kYXRhICYgRUVQUk9NX1dPUkQwRl9QQVVTRV9NQVNLKSA9PSAwKQotICAgICAgICAgICAgICAgIGh3LT5mYyA9IEUxMDAwX0ZDX05PTkU7Ci0gICAgICAgICAgICBlbHNlIGlmICgoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDBGX1BBVVNFX01BU0spID09Ci0gICAgICAgICAgICAgICAgICAgIEVFUFJPTV9XT1JEMEZfQVNNX0RJUikKLSAgICAgICAgICAgICAgICBody0+ZmMgPSBFMTAwMF9GQ19UWF9QQVVTRTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBody0+ZmMgPSBFMTAwMF9GQ19GVUxMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9CisJLyogV2Ugd2FudCB0byBzYXZlIG9mZiB0aGUgb3JpZ2luYWwgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24ganVzdAorCSAqIGluIGNhc2Ugd2UgZ2V0IGRpc2Nvbm5lY3RlZCBhbmQgdGhlbiByZWNvbm5lY3RlZCBpbnRvIGEgZGlmZmVyZW50CisJICogaHViIG9yIHN3aXRjaCB3aXRoIGRpZmZlcmVudCBGbG93IENvbnRyb2wgY2FwYWJpbGl0aWVzLgorCSAqLworCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQorCQlody0+ZmMgJj0gKH5FMTAwMF9GQ19UWF9QQVVTRSk7CiAKLSAgICAvKiBXZSB3YW50IHRvIHNhdmUgb2ZmIHRoZSBvcmlnaW5hbCBGbG93IENvbnRyb2wgY29uZmlndXJhdGlvbiBqdXN0Ci0gICAgICogaW4gY2FzZSB3ZSBnZXQgZGlzY29ubmVjdGVkIGFuZCB0aGVuIHJlY29ubmVjdGVkIGludG8gYSBkaWZmZXJlbnQKLSAgICAgKiBodWIgb3Igc3dpdGNoIHdpdGggZGlmZmVyZW50IEZsb3cgQ29udHJvbCBjYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCi0gICAgICAgIGh3LT5mYyAmPSAofkUxMDAwX0ZDX1RYX1BBVVNFKTsKKwlpZiAoKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSAmJiAoaHctPnJlcG9ydF90eF9lYXJseSA9PSAxKSkKKwkJaHctPmZjICY9ICh+RTEwMDBfRkNfUlhfUEFVU0UpOwogCi0gICAgaWYgKChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU0MykgJiYgKGh3LT5yZXBvcnRfdHhfZWFybHkgPT0gMSkpCi0gICAgICAgIGh3LT5mYyAmPSAofkUxMDAwX0ZDX1JYX1BBVVNFKTsKKwlody0+b3JpZ2luYWxfZmMgPSBody0+ZmM7CiAKLSAgICBody0+b3JpZ2luYWxfZmMgPSBody0+ZmM7CisJREVCVUdPVVQxKCJBZnRlciBmaXgtdXBzIEZsb3dDb250cm9sIGlzIG5vdyA9ICV4XG4iLCBody0+ZmMpOwogCi0gICAgREVCVUdPVVQxKCJBZnRlciBmaXgtdXBzIEZsb3dDb250cm9sIGlzIG5vdyA9ICV4XG4iLCBody0+ZmMpOworCS8qIFRha2UgdGhlIDQgYml0cyBmcm9tIEVFUFJPTSB3b3JkIDB4MEYgdGhhdCBkZXRlcm1pbmUgdGhlIGluaXRpYWwKKwkgKiBwb2xhcml0eSB2YWx1ZSBmb3IgdGhlIFNXIGNvbnRyb2xsZWQgcGlucywgYW5kIHNldHVwIHRoZQorCSAqIEV4dGVuZGVkIERldmljZSBDb250cm9sIHJlZyB3aXRoIHRoYXQgaW5mby4KKwkgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9uZSBvZiB0aGUgU1cgY29udHJvbGxlZCBwaW5zIGlzIHVzZWQgZm9yCisJICogc2lnbmFsIGRldGVjdGlvbi4gIFNvIHRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGUxMDAwX3NldHVwX3Bjc19saW5rKCkKKwkgKiBvciBlMTAwMF9waHlfc2V0dXAoKSBpcyBjYWxsZWQuCisJICovCisJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgeworCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRywKKwkJCQkJICAgIDEsICZlZXByb21fZGF0YSk7CisJCWlmIChyZXRfdmFsKSB7CisJCQlERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCQl9CisJCWN0cmxfZXh0ID0gKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfU1dQRElPX0VYVCkgPDwKKwkJCSAgICBTV0RQSU9fX0VYVF9TSElGVCk7CisJCWV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKwl9CiAKLSAgICAvKiBUYWtlIHRoZSA0IGJpdHMgZnJvbSBFRVBST00gd29yZCAweDBGIHRoYXQgZGV0ZXJtaW5lIHRoZSBpbml0aWFsCi0gICAgICogcG9sYXJpdHkgdmFsdWUgZm9yIHRoZSBTVyBjb250cm9sbGVkIHBpbnMsIGFuZCBzZXR1cCB0aGUKLSAgICAgKiBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCByZWcgd2l0aCB0aGF0IGluZm8uCi0gICAgICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvbmUgb2YgdGhlIFNXIGNvbnRyb2xsZWQgcGlucyBpcyB1c2VkIGZvcgotICAgICAqIHNpZ25hbCBkZXRlY3Rpb24uICBTbyB0aGlzIHNob3VsZCBiZSBkb25lIGJlZm9yZSBlMTAwMF9zZXR1cF9wY3NfbGluaygpCi0gICAgICogb3IgZTEwMDBfcGh5X3NldHVwKCkgaXMgY2FsbGVkLgotICAgICAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDMpIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fSU5JVF9DT05UUk9MMl9SRUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmZWVwcm9tX2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICAgICAgfQotICAgICAgICBjdHJsX2V4dCA9ICgoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDBGX1NXUERJT19FWFQpIDw8Ci0gICAgICAgICAgICAgICAgICAgIFNXRFBJT19fRVhUX1NISUZUKTsKLSAgICAgICAgZXczMihDVFJMX0VYVCwgY3RybF9leHQpOwotICAgIH0KKwkvKiBDYWxsIHRoZSBuZWNlc3Nhcnkgc3Vicm91dGluZSB0byBjb25maWd1cmUgdGhlIGxpbmsuICovCisJcmV0X3ZhbCA9IChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgPworCSAgICBlMTAwMF9zZXR1cF9jb3BwZXJfbGluayhodykgOiBlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhodyk7CiAKLSAgICAvKiBDYWxsIHRoZSBuZWNlc3Nhcnkgc3Vicm91dGluZSB0byBjb25maWd1cmUgdGhlIGxpbmsuICovCi0gICAgcmV0X3ZhbCA9IChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgPwotICAgICAgICAgICAgICBlMTAwMF9zZXR1cF9jb3BwZXJfbGluayhodykgOgotICAgICAgICAgICAgICBlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhodyk7CisJLyogSW5pdGlhbGl6ZSB0aGUgZmxvdyBjb250cm9sIGFkZHJlc3MsIHR5cGUsIGFuZCBQQVVTRSB0aW1lcgorCSAqIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gIFRoaXMgaXMgZG9uZSBldmVuIGlmIGZsb3cKKwkgKiBjb250cm9sIGlzIGRpc2FibGVkLCBiZWNhdXNlIGl0IGRvZXMgbm90IGh1cnQgYW55dGhpbmcgdG8KKwkgKiBpbml0aWFsaXplIHRoZXNlIHJlZ2lzdGVycy4KKwkgKi8KKwlERUJVR09VVAorCSAgICAoIkluaXRpYWxpemluZyB0aGUgRmxvdyBDb250cm9sIGFkZHJlc3MsIHR5cGUgYW5kIHRpbWVyIHJlZ3NcbiIpOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgZmxvdyBjb250cm9sIGFkZHJlc3MsIHR5cGUsIGFuZCBQQVVTRSB0aW1lcgotICAgICAqIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gIFRoaXMgaXMgZG9uZSBldmVuIGlmIGZsb3cKLSAgICAgKiBjb250cm9sIGlzIGRpc2FibGVkLCBiZWNhdXNlIGl0IGRvZXMgbm90IGh1cnQgYW55dGhpbmcgdG8KLSAgICAgKiBpbml0aWFsaXplIHRoZXNlIHJlZ2lzdGVycy4KLSAgICAgKi8KLSAgICBERUJVR09VVCgiSW5pdGlhbGl6aW5nIHRoZSBGbG93IENvbnRyb2wgYWRkcmVzcywgdHlwZSBhbmQgdGltZXIgcmVnc1xuIik7CisJZXczMihGQ1QsIEZMT1dfQ09OVFJPTF9UWVBFKTsKKwlldzMyKEZDQUgsIEZMT1dfQ09OVFJPTF9BRERSRVNTX0hJR0gpOworCWV3MzIoRkNBTCwgRkxPV19DT05UUk9MX0FERFJFU1NfTE9XKTsKIAotICAgIC8qIEZDQUwvSCBhbmQgRkNUIGFyZSBoYXJkY29kZWQgdG8gc3RhbmRhcmQgdmFsdWVzIGluIGUxMDAwX2ljaDhsYW4uICovCi0gICAgaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgIGV3MzIoRkNULCBGTE9XX0NPTlRST0xfVFlQRSk7Ci0gICAgICAgIGV3MzIoRkNBSCwgRkxPV19DT05UUk9MX0FERFJFU1NfSElHSCk7Ci0gICAgICAgIGV3MzIoRkNBTCwgRkxPV19DT05UUk9MX0FERFJFU1NfTE9XKTsKLSAgICB9CisJZXczMihGQ1RUViwgaHctPmZjX3BhdXNlX3RpbWUpOwogCi0gICAgZXczMihGQ1RUViwgaHctPmZjX3BhdXNlX3RpbWUpOwotCi0gICAgLyogU2V0IHRoZSBmbG93IGNvbnRyb2wgcmVjZWl2ZSB0aHJlc2hvbGQgcmVnaXN0ZXJzLiAgTm9ybWFsbHksCi0gICAgICogdGhlc2UgcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIGEgZGVmYXVsdCB0aHJlc2hvbGQgdGhhdCBtYXkgYmUKLSAgICAgKiBhZGp1c3RlZCBsYXRlciBieSB0aGUgZHJpdmVyJ3MgcnVudGltZSBjb2RlLiAgSG93ZXZlciwgaWYgdGhlCi0gICAgICogYWJpbGl0eSB0byB0cmFuc21pdCBwYXVzZSBmcmFtZXMgaW4gbm90IGVuYWJsZWQsIHRoZW4gdGhlc2UKLSAgICAgKiByZWdpc3RlcnMgd2lsbCBiZSBzZXQgdG8gMC4KLSAgICAgKi8KLSAgICBpZiAoIShody0+ZmMgJiBFMTAwMF9GQ19UWF9QQVVTRSkpIHsKLSAgICAgICAgZXczMihGQ1JUTCwgMCk7Ci0gICAgICAgIGV3MzIoRkNSVEgsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFdlIG5lZWQgdG8gc2V0IHVwIHRoZSBSZWNlaXZlIFRocmVzaG9sZCBoaWdoIGFuZCBsb3cgd2F0ZXIgbWFya3MKLSAgICAgICAgICogYXMgd2VsbCBhcyAob3B0aW9uYWxseSkgZW5hYmxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBYT04gZnJhbWVzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGh3LT5mY19zZW5kX3hvbikgewotICAgICAgICAgICAgZXczMihGQ1JUTCwgKGh3LT5mY19sb3dfd2F0ZXIgfCBFMTAwMF9GQ1JUTF9YT05FKSk7Ci0gICAgICAgICAgICBldzMyKEZDUlRILCBody0+ZmNfaGlnaF93YXRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldzMyKEZDUlRMLCBody0+ZmNfbG93X3dhdGVyKTsKLSAgICAgICAgICAgIGV3MzIoRkNSVEgsIGh3LT5mY19oaWdoX3dhdGVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0X3ZhbDsKKwkvKiBTZXQgdGhlIGZsb3cgY29udHJvbCByZWNlaXZlIHRocmVzaG9sZCByZWdpc3RlcnMuICBOb3JtYWxseSwKKwkgKiB0aGVzZSByZWdpc3RlcnMgd2lsbCBiZSBzZXQgdG8gYSBkZWZhdWx0IHRocmVzaG9sZCB0aGF0IG1heSBiZQorCSAqIGFkanVzdGVkIGxhdGVyIGJ5IHRoZSBkcml2ZXIncyBydW50aW1lIGNvZGUuICBIb3dldmVyLCBpZiB0aGUKKwkgKiBhYmlsaXR5IHRvIHRyYW5zbWl0IHBhdXNlIGZyYW1lcyBpbiBub3QgZW5hYmxlZCwgdGhlbiB0aGVzZQorCSAqIHJlZ2lzdGVycyB3aWxsIGJlIHNldCB0byAwLgorCSAqLworCWlmICghKGh3LT5mYyAmIEUxMDAwX0ZDX1RYX1BBVVNFKSkgeworCQlldzMyKEZDUlRMLCAwKTsKKwkJZXczMihGQ1JUSCwgMCk7CisJfSBlbHNlIHsKKwkJLyogV2UgbmVlZCB0byBzZXQgdXAgdGhlIFJlY2VpdmUgVGhyZXNob2xkIGhpZ2ggYW5kIGxvdyB3YXRlciBtYXJrcworCQkgKiBhcyB3ZWxsIGFzIChvcHRpb25hbGx5KSBlbmFibGluZyB0aGUgdHJhbnNtaXNzaW9uIG9mIFhPTiBmcmFtZXMuCisJCSAqLworCQlpZiAoaHctPmZjX3NlbmRfeG9uKSB7CisJCQlldzMyKEZDUlRMLCAoaHctPmZjX2xvd193YXRlciB8IEUxMDAwX0ZDUlRMX1hPTkUpKTsKKwkJCWV3MzIoRkNSVEgsIGh3LT5mY19oaWdoX3dhdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWV3MzIoRkNSVEwsIGh3LT5mY19sb3dfd2F0ZXIpOworCQkJZXczMihGQ1JUSCwgaHctPmZjX2hpZ2hfd2F0ZXIpOworCQl9CisJfQorCXJldHVybiByZXRfdmFsOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTZXRzIHVwIGxpbmsgZm9yIGEgZmliZXIgYmFzZWQgb3Igc2VyZGVzIGJhc2VkIGFkYXB0ZXIKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorLyoqCisgKiBlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayAtIHByZXBhcmUgZmliZXIgb3Igc2VyZGVzIGxpbmsKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCiAgKgogICogTWFuaXB1bGF0ZXMgUGh5c2ljYWwgQ29kaW5nIFN1YmxheWVyIGZ1bmN0aW9ucyBpbiBvcmRlciB0byBjb25maWd1cmUKICAqIGxpbmsuIEFzc3VtZXMgdGhlIGhhcmR3YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgcmVzZXQgYW5kIHRoZSB0cmFuc21pdHRlcgogICogYW5kIHJlY2VpdmVyIGFyZSBub3QgZW5hYmxlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogc3RhdGljIHMzMiBlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiBjdHJsOwotICAgIHUzMiBzdGF0dXM7Ci0gICAgdTMyIHR4Y3cgPSAwOwotICAgIHUzMiBpOwotICAgIHUzMiBzaWduYWwgPSAwOwotICAgIHMzMiByZXRfdmFsOworCXUzMiBjdHJsOworCXUzMiBzdGF0dXM7CisJdTMyIHR4Y3cgPSAwOworCXUzMiBpOworCXUzMiBzaWduYWwgPSAwOworCXMzMiByZXRfdmFsOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayIpOworCURFQlVHRlVOQygiZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsiKTsKIAotICAgIC8qIE9uIDgyNTcxIGFuZCA4MjU3MiBGaWJlciBjb25uZWN0aW9ucywgU2VyRGVzIGxvb3BiYWNrIG1vZGUgcGVyc2lzdHMKLSAgICAgKiB1bnRpbCBleHBsaWNpdGx5IHR1cm5lZCBvZmYgb3IgYSBwb3dlciBjeWNsZSBpcyBwZXJmb3JtZWQuICBBIHJlYWQgdG8KLSAgICAgKiB0aGUgcmVnaXN0ZXIgZG9lcyBub3QgaW5kaWNhdGUgaXRzIHN0YXR1cy4gIFRoZXJlZm9yZSwgd2UgZW5zdXJlCi0gICAgICogbG9vcGJhY2sgbW9kZSBpcyBkaXNhYmxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0gICAgICovCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MSB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzIpCi0gICAgICAgIGV3MzIoU0NUTCwgRTEwMDBfRElTQUJMRV9TRVJERVNfTE9PUEJBQ0spOworCS8qIE9uIGFkYXB0ZXJzIHdpdGggYSBNQUMgbmV3ZXIgdGhhbiA4MjU0NCwgU1dEUCAxIHdpbGwgYmUKKwkgKiBzZXQgd2hlbiB0aGUgb3B0aWNzIGRldGVjdCBhIHNpZ25hbC4gT24gb2xkZXIgYWRhcHRlcnMsIGl0IHdpbGwgYmUKKwkgKiBjbGVhcmVkIHdoZW4gdGhlcmUgaXMgYSBzaWduYWwuICBUaGlzIGFwcGxpZXMgdG8gZmliZXIgbWVkaWEgb25seS4KKwkgKiBJZiB3ZSdyZSBvbiBzZXJkZXMgbWVkaWEsIGFkanVzdCB0aGUgb3V0cHV0IGFtcGxpdHVkZSB0byB2YWx1ZQorCSAqIHNldCBpbiB0aGUgRUVQUk9NLgorCSAqLworCWN0cmwgPSBlcjMyKENUUkwpOworCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKQorCQlzaWduYWwgPSAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpID8gRTEwMDBfQ1RSTF9TV0RQSU4xIDogMDsKIAotICAgIC8qIE9uIGFkYXB0ZXJzIHdpdGggYSBNQUMgbmV3ZXIgdGhhbiA4MjU0NCwgU1dEUCAxIHdpbGwgYmUKLSAgICAgKiBzZXQgd2hlbiB0aGUgb3B0aWNzIGRldGVjdCBhIHNpZ25hbC4gT24gb2xkZXIgYWRhcHRlcnMsIGl0IHdpbGwgYmUKLSAgICAgKiBjbGVhcmVkIHdoZW4gdGhlcmUgaXMgYSBzaWduYWwuICBUaGlzIGFwcGxpZXMgdG8gZmliZXIgbWVkaWEgb25seS4KLSAgICAgKiBJZiB3ZSdyZSBvbiBzZXJkZXMgbWVkaWEsIGFkanVzdCB0aGUgb3V0cHV0IGFtcGxpdHVkZSB0byB2YWx1ZQotICAgICAqIHNldCBpbiB0aGUgRUVQUk9NLgotICAgICAqLwotICAgIGN0cmwgPSBlcjMyKENUUkwpOwotICAgIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKQotICAgICAgICBzaWduYWwgPSAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpID8gRTEwMDBfQ1RSTF9TV0RQSU4xIDogMDsKKwlyZXRfdmFsID0gZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUoaHcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIHJldF92YWwgPSBlMTAwMF9hZGp1c3Rfc2VyZGVzX2FtcGxpdHVkZShodyk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCS8qIFRha2UgdGhlIGxpbmsgb3V0IG9mIHJlc2V0ICovCisJY3RybCAmPSB+KEUxMDAwX0NUUkxfTFJTVCk7CiAKLSAgICAvKiBUYWtlIHRoZSBsaW5rIG91dCBvZiByZXNldCAqLwotICAgIGN0cmwgJj0gfihFMTAwMF9DVFJMX0xSU1QpOworCS8qIEFkanVzdCBWQ08gc3BlZWQgdG8gaW1wcm92ZSBCRVIgcGVyZm9ybWFuY2UgKi8KKwlyZXRfdmFsID0gZTEwMDBfc2V0X3Zjb19zcGVlZChodyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgLyogQWRqdXN0IFZDTyBzcGVlZCB0byBpbXByb3ZlIEJFUiBwZXJmb3JtYW5jZSAqLwotICAgIHJldF92YWwgPSBlMTAwMF9zZXRfdmNvX3NwZWVkKGh3KTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKIAotICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisJLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kIHNldHVwCisJICogdGhlIGRldmljZSBhY2NvcmRpbmdseS4gIElmIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGhlbiBzb2Z0d2FyZQorCSAqIHdpbGwgaGF2ZSB0byBzZXQgdGhlICJQQVVTRSIgYml0cyB0byB0aGUgY29ycmVjdCB2YWx1ZSBpbiB0aGUgVHJhbm1zaXQKKwkgKiBDb25maWcgV29yZCBSZWdpc3RlciAoVFhDVykgYW5kIHJlLXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24uICBIb3dldmVyLCBpZgorCSAqIGF1dG8tbmVnb3RpYXRpb24gaXMgZGlzYWJsZWQsIHRoZW4gc29mdHdhcmUgd2lsbCBoYXZlIHRvIG1hbnVhbGx5CisJICogY29uZmlndXJlIHRoZSB0d28gZmxvdyBjb250cm9sIGVuYWJsZSBiaXRzIGluIHRoZSBDVFJMIHJlZ2lzdGVyLgorCSAqCisJICogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgImZjIiBwYXJhbWV0ZXIgYXJlOgorCSAqICAgICAgMDogIEZsb3cgY29udHJvbCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkCisJICogICAgICAxOiAgUnggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiByZWNlaXZlIHBhdXNlIGZyYW1lcywgYnV0CisJICogICAgICAgICAgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzIGJ1dCB3ZSBkbworCSAqICAgICAgICAgIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKwkgKi8KKwlzd2l0Y2ggKGh3LT5mYykgeworCWNhc2UgRTEwMDBfRkNfTk9ORToKKwkJLyogRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYSBzb2Z0d2FyZSBvdmVyLXJpZGUuICovCisJCXR4Y3cgPSAoRTEwMDBfVFhDV19BTkUgfCBFMTAwMF9UWENXX0ZEKTsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9GQ19SWF9QQVVTRToKKwkJLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQgYW5kIFRYIEZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCBieSBhCisJCSAqIHNvZnR3YXJlIG92ZXItcmlkZS4gU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZQorCQkgKiB0aGF0IHdlIGFyZSBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKKwkJICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gTGF0ZXIsIHdlIHdpbGwKKwkJICogIGRpc2FibGUgdGhlIGFkYXB0ZXIncyBhYmlsaXR5IHRvIHNlbmQgUEFVU0UgZnJhbWVzLgorCQkgKi8KKwkJdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQgfCBFMTAwMF9UWENXX1BBVVNFX01BU0spOworCQlicmVhazsKKwljYXNlIEUxMDAwX0ZDX1RYX1BBVVNFOgorCQkvKiBUWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCwgYW5kIFJYIEZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCwgYnkgYQorCQkgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisJCSAqLworCQl0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfQVNNX0RJUik7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfRkNfRlVMTDoKKwkJLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4gKi8KKwkJdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQgfCBFMTAwMF9UWENXX1BBVVNFX01BU0spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwkJYnJlYWs7CisJfQogCi0gICAgLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kIHNldHVwCi0gICAgICogdGhlIGRldmljZSBhY2NvcmRpbmdseS4gIElmIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGhlbiBzb2Z0d2FyZQotICAgICAqIHdpbGwgaGF2ZSB0byBzZXQgdGhlICJQQVVTRSIgYml0cyB0byB0aGUgY29ycmVjdCB2YWx1ZSBpbiB0aGUgVHJhbm1zaXQKLSAgICAgKiBDb25maWcgV29yZCBSZWdpc3RlciAoVFhDVykgYW5kIHJlLXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24uICBIb3dldmVyLCBpZgotICAgICAqIGF1dG8tbmVnb3RpYXRpb24gaXMgZGlzYWJsZWQsIHRoZW4gc29mdHdhcmUgd2lsbCBoYXZlIHRvIG1hbnVhbGx5Ci0gICAgICogY29uZmlndXJlIHRoZSB0d28gZmxvdyBjb250cm9sIGVuYWJsZSBiaXRzIGluIHRoZSBDVFJMIHJlZ2lzdGVyLgotICAgICAqCi0gICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgImZjIiBwYXJhbWV0ZXIgYXJlOgotICAgICAqICAgICAgMDogIEZsb3cgY29udHJvbCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkCi0gICAgICogICAgICAxOiAgUnggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiByZWNlaXZlIHBhdXNlIGZyYW1lcywgYnV0Ci0gICAgICogICAgICAgICAgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KLSAgICAgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzIGJ1dCB3ZSBkbwotICAgICAqICAgICAgICAgIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgotICAgICAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKGh3LT5mYykgewotICAgIGNhc2UgRTEwMDBfRkNfTk9ORToKLSAgICAgICAgLyogRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYSBzb2Z0d2FyZSBvdmVyLXJpZGUuICovCi0gICAgICAgIHR4Y3cgPSAoRTEwMDBfVFhDV19BTkUgfCBFMTAwMF9UWENXX0ZEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFMTAwMF9GQ19SWF9QQVVTRToKLSAgICAgICAgLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQgYW5kIFRYIEZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCBieSBhCi0gICAgICAgICAqIHNvZnR3YXJlIG92ZXItcmlkZS4gU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZQotICAgICAgICAgKiB0aGF0IHdlIGFyZSBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKLSAgICAgICAgICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gTGF0ZXIsIHdlIHdpbGwKLSAgICAgICAgICogIGRpc2FibGUgdGhlIGFkYXB0ZXIncyBhYmlsaXR5IHRvIHNlbmQgUEFVU0UgZnJhbWVzLgotICAgICAgICAgKi8KLSAgICAgICAgdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQgfCBFMTAwMF9UWENXX1BBVVNFX01BU0spOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEUxMDAwX0ZDX1RYX1BBVVNFOgotICAgICAgICAvKiBUWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCwgYW5kIFJYIEZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCwgYnkgYQotICAgICAgICAgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCi0gICAgICAgICAqLwotICAgICAgICB0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfQVNNX0RJUik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRTEwMDBfRkNfRlVMTDoKLSAgICAgICAgLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4gKi8KLSAgICAgICAgdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQgfCBFMTAwMF9UWENXX1BBVVNFX01BU0spOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCS8qIFNpbmNlIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGFrZSB0aGUgbGluayBvdXQgb2YgcmVzZXQgKHRoZSBsaW5rCisJICogd2lsbCBiZSBpbiByZXNldCwgYmVjYXVzZSB3ZSBwcmV2aW91c2x5IHJlc2V0IHRoZSBjaGlwKS4gVGhpcyB3aWxsCisJICogcmVzdGFydCBhdXRvLW5lZ290aWF0aW9uLiAgSWYgYXV0by1uZWdvdGlhdGlvbiBpcyBzdWNjZXNzZnVsIHRoZW4gdGhlCisJICogbGluay11cCBzdGF0dXMgYml0IHdpbGwgYmUgc2V0IGFuZCB0aGUgZmxvdyBjb250cm9sIGVuYWJsZSBiaXRzIChSRkNFCisJICogYW5kIFRGQ0UpIHdpbGwgYmUgc2V0IGFjY29yZGluZyB0byB0aGVpciBuZWdvdGlhdGVkIHZhbHVlLgorCSAqLworCURFQlVHT1VUKCJBdXRvLW5lZ290aWF0aW9uIGVuYWJsZWRcbiIpOwogCi0gICAgLyogU2luY2UgYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0YWtlIHRoZSBsaW5rIG91dCBvZiByZXNldCAodGhlIGxpbmsKLSAgICAgKiB3aWxsIGJlIGluIHJlc2V0LCBiZWNhdXNlIHdlIHByZXZpb3VzbHkgcmVzZXQgdGhlIGNoaXApLiBUaGlzIHdpbGwKLSAgICAgKiByZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24uICBJZiBhdXRvLW5lb2d0aWF0aW9uIGlzIHN1Y2Nlc3NmdWwgdGhlbiB0aGUKLSAgICAgKiBsaW5rLXVwIHN0YXR1cyBiaXQgd2lsbCBiZSBzZXQgYW5kIHRoZSBmbG93IGNvbnRyb2wgZW5hYmxlIGJpdHMgKFJGQ0UKLSAgICAgKiBhbmQgVEZDRSkgd2lsbCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ290aWF0ZWQgdmFsdWUuCi0gICAgICovCi0gICAgREVCVUdPVVQoIkF1dG8tbmVnb3RpYXRpb24gZW5hYmxlZFxuIik7CisJZXczMihUWENXLCB0eGN3KTsKKwlldzMyKENUUkwsIGN0cmwpOworCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CiAKLSAgICBldzMyKFRYQ1csIHR4Y3cpOwotICAgIGV3MzIoQ1RSTCwgY3RybCk7Ci0gICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKKwlody0+dHhjdyA9IHR4Y3c7CisJbXNsZWVwKDEpOwogCi0gICAgaHctPnR4Y3cgPSB0eGN3OwotICAgIG1zbGVlcCgxKTsKLQotICAgIC8qIElmIHdlIGhhdmUgYSBzaWduYWwgKHRoZSBjYWJsZSBpcyBwbHVnZ2VkIGluKSB0aGVuIHBvbGwgZm9yIGEgIkxpbmstVXAiCi0gICAgICogaW5kaWNhdGlvbiBpbiB0aGUgRGV2aWNlIFN0YXR1cyBSZWdpc3Rlci4gIFRpbWUtb3V0IGlmIGEgbGluayBpc24ndAotICAgICAqIHNlZW4gaW4gNTAwIG1pbGxpc2Vjb25kcyBzZWNvbmRzIChBdXRvLW5lZ290aWF0aW9uIHNob3VsZCBjb21wbGV0ZSBpbgotICAgICAqIGxlc3MgdGhhbiA1MDAgbWlsbGlzZWNvbmRzIGV2ZW4gaWYgdGhlIG90aGVyIGVuZCBpcyBkb2luZyBpdCBpbiBTVykuCi0gICAgICogRm9yIGludGVybmFsIHNlcmRlcywgd2UganVzdCBhc3N1bWUgYSBzaWduYWwgaXMgcHJlc2VudCwgdGhlbiBwb2xsLgotICAgICAqLwotICAgIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcyB8fAotICAgICAgIChlcjMyKENUUkwpICYgRTEwMDBfQ1RSTF9TV0RQSU4xKSA9PSBzaWduYWwpIHsKLSAgICAgICAgREVCVUdPVVQoIkxvb2tpbmcgZm9yIExpbmtcbiIpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKExJTktfVVBfVElNRU9VVCAvIDEwKTsgaSsrKSB7Ci0gICAgICAgICAgICBtc2xlZXAoMTApOwotICAgICAgICAgICAgc3RhdHVzID0gZXIzMihTVEFUVVMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gKExJTktfVVBfVElNRU9VVCAvIDEwKSkgewotICAgICAgICAgICAgREVCVUdPVVQoIk5ldmVyIGdvdCBhIHZhbGlkIGxpbmsgZnJvbSBhdXRvLW5lZyEhIVxuIik7Ci0gICAgICAgICAgICBody0+YXV0b25lZ19mYWlsZWQgPSAxOwotICAgICAgICAgICAgLyogQXV0b05lZyBmYWlsZWQgdG8gYWNoaWV2ZSBhIGxpbmssIHNvIHdlJ2xsIGNhbGwKLSAgICAgICAgICAgICAqIGUxMDAwX2NoZWNrX2Zvcl9saW5rLiBUaGlzIHJvdXRpbmUgd2lsbCBmb3JjZSB0aGUgbGluayB1cCBpZgotICAgICAgICAgICAgICogd2UgZGV0ZWN0IGEgc2lnbmFsLiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gY29tbXVuaWNhdGUgd2l0aAotICAgICAgICAgICAgICogbm9uLWF1dG9uZWdvdGlhdGluZyBsaW5rIHBhcnRuZXJzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY2hlY2tfZm9yX2xpbmsoaHcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIGxpbmtcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaHctPmF1dG9uZWdfZmFpbGVkID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGh3LT5hdXRvbmVnX2ZhaWxlZCA9IDA7Ci0gICAgICAgICAgICBERUJVR09VVCgiVmFsaWQgTGluayBGb3VuZFxuIik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR09VVCgiTm8gU2lnbmFsIERldGVjdGVkXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJLyogSWYgd2UgaGF2ZSBhIHNpZ25hbCAodGhlIGNhYmxlIGlzIHBsdWdnZWQgaW4pIHRoZW4gcG9sbCBmb3IgYSAiTGluay1VcCIKKwkgKiBpbmRpY2F0aW9uIGluIHRoZSBEZXZpY2UgU3RhdHVzIFJlZ2lzdGVyLiAgVGltZS1vdXQgaWYgYSBsaW5rIGlzbid0CisJICogc2VlbiBpbiA1MDAgbWlsbGlzZWNvbmRzIHNlY29uZHMgKEF1dG8tbmVnb3RpYXRpb24gc2hvdWxkIGNvbXBsZXRlIGluCisJICogbGVzcyB0aGFuIDUwMCBtaWxsaXNlY29uZHMgZXZlbiBpZiB0aGUgb3RoZXIgZW5kIGlzIGRvaW5nIGl0IGluIFNXKS4KKwkgKiBGb3IgaW50ZXJuYWwgc2VyZGVzLCB3ZSBqdXN0IGFzc3VtZSBhIHNpZ25hbCBpcyBwcmVzZW50LCB0aGVuIHBvbGwuCisJICovCisJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzIHx8CisJICAgIChlcjMyKENUUkwpICYgRTEwMDBfQ1RSTF9TV0RQSU4xKSA9PSBzaWduYWwpIHsKKwkJREVCVUdPVVQoIkxvb2tpbmcgZm9yIExpbmtcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgKExJTktfVVBfVElNRU9VVCAvIDEwKTsgaSsrKSB7CisJCQltc2xlZXAoMTApOworCQkJc3RhdHVzID0gZXIzMihTVEFUVVMpOworCQkJaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSAoTElOS19VUF9USU1FT1VUIC8gMTApKSB7CisJCQlERUJVR09VVCgiTmV2ZXIgZ290IGEgdmFsaWQgbGluayBmcm9tIGF1dG8tbmVnISEhXG4iKTsKKwkJCWh3LT5hdXRvbmVnX2ZhaWxlZCA9IDE7CisJCQkvKiBBdXRvTmVnIGZhaWxlZCB0byBhY2hpZXZlIGEgbGluaywgc28gd2UnbGwgY2FsbAorCQkJICogZTEwMDBfY2hlY2tfZm9yX2xpbmsuIFRoaXMgcm91dGluZSB3aWxsIGZvcmNlIHRoZSBsaW5rIHVwIGlmCisJCQkgKiB3ZSBkZXRlY3QgYSBzaWduYWwuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBjb21tdW5pY2F0ZSB3aXRoCisJCQkgKiBub24tYXV0b25lZ290aWF0aW5nIGxpbmsgcGFydG5lcnMuCisJCQkgKi8KKwkJCXJldF92YWwgPSBlMTAwMF9jaGVja19mb3JfbGluayhodyk7CisJCQlpZiAocmV0X3ZhbCkgeworCQkJCURFQlVHT1VUKCJFcnJvciB3aGlsZSBjaGVja2luZyBmb3IgbGlua1xuIik7CisJCQkJcmV0dXJuIHJldF92YWw7CisJCQl9CisJCQlody0+YXV0b25lZ19mYWlsZWQgPSAwOworCQl9IGVsc2UgeworCQkJaHctPmF1dG9uZWdfZmFpbGVkID0gMDsKKwkJCURFQlVHT1VUKCJWYWxpZCBMaW5rIEZvdW5kXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCURFQlVHT1VUKCJObyBTaWduYWwgRGV0ZWN0ZWRcbiIpOworCX0KKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIFBIWSBhbmQgY2hhbmdlIFBIWSBtb2RlIGJlZm9yZSBsaW5rIHNldHVwLgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWcgLSBlYXJseSBjb25maWd1cmF0aW9uIGZvciBjb3BwZXIKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBQSFkgYW5kIGNoYW5nZSBQSFkgbW9kZSBiZWZvcmUgbGluayBzZXR1cC4KKyAqLwogc3RhdGljIHMzMiBlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWcoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICB1MzIgY3RybDsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICB1MTYgcGh5X2RhdGE7CisJdTMyIGN0cmw7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9kYXRhOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWciKTsKKwlERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX3ByZWNvbmZpZyIpOwogCi0gICAgY3RybCA9IGVyMzIoQ1RSTCk7Ci0gICAgLyogV2l0aCA4MjU0Mywgd2UgbmVlZCB0byBmb3JjZSBzcGVlZCBhbmQgZHVwbGV4IG9uIHRoZSBNQUMgZXF1YWwgdG8gd2hhdAotICAgICAqIHRoZSBQSFkgc3BlZWQgYW5kIGR1cGxleCBjb25maWd1cmF0aW9uIGlzLiBJbiBhZGRpdGlvbiwgd2UgbmVlZCB0bwotICAgICAqIHBlcmZvcm0gYSBoYXJkd2FyZSByZXNldCBvbiB0aGUgUEhZIHRvIHRha2UgaXQgb3V0IG9mIHJlc2V0LgotICAgICAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgewotICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU0xVOwotICAgICAgICBjdHJsICY9IH4oRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCk7Ci0gICAgICAgIGV3MzIoQ1RSTCwgY3RybCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCB8IEUxMDAwX0NUUkxfU0xVKTsKLSAgICAgICAgZXczMihDVFJMLCBjdHJsKTsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9od19yZXNldChodyk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQorCWN0cmwgPSBlcjMyKENUUkwpOworCS8qIFdpdGggODI1NDMsIHdlIG5lZWQgdG8gZm9yY2Ugc3BlZWQgYW5kIGR1cGxleCBvbiB0aGUgTUFDIGVxdWFsIHRvIHdoYXQKKwkgKiB0aGUgUEhZIHNwZWVkIGFuZCBkdXBsZXggY29uZmlndXJhdGlvbiBpcy4gSW4gYWRkaXRpb24sIHdlIG5lZWQgdG8KKwkgKiBwZXJmb3JtIGEgaGFyZHdhcmUgcmVzZXQgb24gdGhlIFBIWSB0byB0YWtlIGl0IG91dCBvZiByZXNldC4KKwkgKi8KKwlpZiAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKwkJY3RybCB8PSBFMTAwMF9DVFJMX1NMVTsKKwkJY3RybCAmPSB+KEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFgpOworCQlldzMyKENUUkwsIGN0cmwpOworCX0gZWxzZSB7CisJCWN0cmwgfD0KKwkJICAgIChFMTAwMF9DVFJMX0ZSQ1NQRCB8IEUxMDAwX0NUUkxfRlJDRFBYIHwgRTEwMDBfQ1RSTF9TTFUpOworCQlldzMyKENUUkwsIGN0cmwpOworCQlyZXRfdmFsID0gZTEwMDBfcGh5X2h3X3Jlc2V0KGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CiAKLSAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIFBIWSAqLwotICAgIHJldF92YWwgPSBlMTAwMF9kZXRlY3RfZ2lnX3BoeShodyk7Ci0gICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgREVCVUdPVVQoIkVycm9yLCBkaWQgbm90IGRldGVjdCB2YWxpZCBwaHkuXG4iKTsKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQotICAgIERFQlVHT1VUMSgiUGh5IElEID0gJXggXG4iLCBody0+cGh5X2lkKTsKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIFBIWSAqLworCXJldF92YWwgPSBlMTAwMF9kZXRlY3RfZ2lnX3BoeShodyk7CisJaWYgKHJldF92YWwpIHsKKwkJREVCVUdPVVQoIkVycm9yLCBkaWQgbm90IGRldGVjdCB2YWxpZCBwaHkuXG4iKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCURFQlVHT1VUMSgiUGh5IElEID0gJXggXG4iLCBody0+cGh5X2lkKTsKIAotICAgIC8qIFNldCBQSFkgdG8gY2xhc3MgQSBtb2RlIChpZiBuZWNlc3NhcnkpICovCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3NldF9waHlfbW9kZShodyk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCS8qIFNldCBQSFkgdG8gY2xhc3MgQSBtb2RlIChpZiBuZWNlc3NhcnkpICovCisJcmV0X3ZhbCA9IGUxMDAwX3NldF9waHlfbW9kZShodyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDVfcmV2XzMpIHx8Ci0gICAgICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Nl9yZXZfMykpIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICAgICAgcGh5X2RhdGEgfD0gMHgwMDAwMDAwODsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKLSAgICB9CisJaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDVfcmV2XzMpIHx8CisJICAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDZfcmV2XzMpKSB7CisJCXJldF92YWwgPQorCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOworCQlwaHlfZGF0YSB8PSAweDAwMDAwMDA4OworCQlyZXRfdmFsID0KKwkJICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKKwl9CiAKLSAgICBpZiAoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzIHx8Ci0gICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwKLSAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikKLSAgICAgICAgaHctPnBoeV9yZXNldF9kaXNhYmxlID0gZmFsc2U7CisJaWYgKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0MyB8fAorCSAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8CisJICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMgorCSAgICB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpCisJCWh3LT5waHlfcmVzZXRfZGlzYWJsZSA9IGZhbHNlOwogCi0gICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29wcGVyIGxpbmsgc2V0dXAgZm9yIGUxMDAwX3BoeV9pZ3Agc2VyaWVzLgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9jb3BwZXJfbGlua19pZ3Bfc2V0dXAgLSBDb3BwZXIgbGluayBzZXR1cCBmb3IgZTEwMDBfcGh5X2lncCBzZXJpZXMuCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICovCiBzdGF0aWMgczMyIGUxMDAwX2NvcHBlcl9saW5rX2lncF9zZXR1cChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiBsZWRfY3RybDsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICB1MTYgcGh5X2RhdGE7CisJdTMyIGxlZF9jdHJsOworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfZGF0YTsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfaWdwX3NldHVwIik7CisJREVCVUdGVU5DKCJlMTAwMF9jb3BwZXJfbGlua19pZ3Bfc2V0dXAiKTsKIAotICAgIGlmIChody0+cGh5X3Jlc2V0X2Rpc2FibGUpCi0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCWlmIChody0+cGh5X3Jlc2V0X2Rpc2FibGUpCisJCXJldHVybiBFMTAwMF9TVUNDRVNTOwogCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldChodyk7Ci0gICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyB0aGUgUEhZXG4iKTsKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQorCXJldF92YWwgPSBlMTAwMF9waHlfcmVzZXQoaHcpOworCWlmIChyZXRfdmFsKSB7CisJCURFQlVHT1VUKCJFcnJvciBSZXNldHRpbmcgdGhlIFBIWVxuIik7CisJCXJldHVybiByZXRfdmFsOworCX0KIAotICAgIC8qIFdhaXQgMTVtcyBmb3IgTUFDIHRvIGNvbmZpZ3VyZSBQSFkgZnJvbSBlZXByb20gc2V0dGluZ3MgKi8KLSAgICBtc2xlZXAoMTUpOwotICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewotICAgIC8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCi0gICAgbGVkX2N0cmwgPSBlcjMyKExFRENUTCk7Ci0gICAgbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOwotICAgIGxlZF9jdHJsIHw9IChJR1BfQUNUSVZJVFlfTEVEX0VOQUJMRSB8IElHUF9MRUQzX01PREUpOwotICAgIGV3MzIoTEVEQ1RMLCBsZWRfY3RybCk7Ci0gICAgfQorCS8qIFdhaXQgMTVtcyBmb3IgTUFDIHRvIGNvbmZpZ3VyZSBQSFkgZnJvbSBlZXByb20gc2V0dGluZ3MgKi8KKwltc2xlZXAoMTUpOworCS8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCisJbGVkX2N0cmwgPSBlcjMyKExFRENUTCk7CisJbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOworCWxlZF9jdHJsIHw9IChJR1BfQUNUSVZJVFlfTEVEX0VOQUJMRSB8IElHUF9MRUQzX01PREUpOworCWV3MzIoTEVEQ1RMLCBsZWRfY3RybCk7CiAKLSAgICAvKiBUaGUgTlZNIHNldHRpbmdzIHdpbGwgY29uZmlndXJlIExQTFUgaW4gRDMgZm9yIElHUDIgYW5kIElHUDMgUEhZcyAqLwotICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgewotICAgICAgICAvKiBkaXNhYmxlIGxwbHUgZDMgZHVyaW5nIGRyaXZlciBpbml0ICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShodywgZmFsc2UpOwotICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIERpc2FibGluZyBMUExVIEQzXG4iKTsKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9Ci0gICAgfQorCS8qIFRoZSBOVk0gc2V0dGluZ3Mgd2lsbCBjb25maWd1cmUgTFBMVSBpbiBEMyBmb3IgSUdQMiBhbmQgSUdQMyBQSFlzICovCisJaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisJCS8qIGRpc2FibGUgbHBsdSBkMyBkdXJpbmcgZHJpdmVyIGluaXQgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX3NldF9kM19scGx1X3N0YXRlKGh3LCBmYWxzZSk7CisJCWlmIChyZXRfdmFsKSB7CisJCQlERUJVR09VVCgiRXJyb3IgRGlzYWJsaW5nIExQTFUgRDNcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwl9CiAKLSAgICAvKiBkaXNhYmxlIGxwbHUgZDAgZHVyaW5nIGRyaXZlciBpbml0ICovCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3NldF9kMF9scGx1X3N0YXRlKGh3LCBmYWxzZSk7Ci0gICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgREVCVUdPVVQoIkVycm9yIERpc2FibGluZyBMUExVIEQwXG4iKTsKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQotICAgIC8qIENvbmZpZ3VyZSBtZGktbWRpeCBzZXR0aW5ncyAqLwotICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJLyogQ29uZmlndXJlIG1kaS1tZGl4IHNldHRpbmdzICovCisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLCAmcGh5X2RhdGEpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxKSB8fCAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgewotICAgICAgICBody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZGlzYWJsZWQ7Ci0gICAgICAgIC8qIEZvcmNlIE1ESSBmb3IgZWFybGllciByZXZzIG9mIHRoZSBJR1AgUEhZICovCi0gICAgICAgIHBoeV9kYXRhICY9IH4oSUdQMDFFMTAwMF9QU0NSX0FVVE9fTURJWCB8IElHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWCk7Ci0gICAgICAgIGh3LT5tZGl4ID0gMTsKKwlpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKwkJaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2Rpc2FibGVkOworCQkvKiBGb3JjZSBNREkgZm9yIGVhcmxpZXIgcmV2cyBvZiB0aGUgSUdQIFBIWSAqLworCQlwaHlfZGF0YSAmPQorCQkgICAgfihJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYIHwKKwkJICAgICAgSUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYKTsKKwkJaHctPm1kaXggPSAxOwogCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQ7Ci0gICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworCX0gZWxzZSB7CisJCWh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOworCQlwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NSX0FVVE9fTURJWDsKIAotICAgICAgICBzd2l0Y2ggKGh3LT5tZGl4KSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCQlzd2l0Y2ggKGh3LT5tZGl4KSB7CisJCWNhc2UgMToKKwkJCXBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJZGVmYXVsdDoKKwkJCXBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLCBwaHlfZGF0YSk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgLyogc2V0IGF1dG8tbWFzdGVyIHNsYXZlIHJlc29sdXRpb24gc2V0dGluZ3MgKi8KLSAgICBpZiAoaHctPmF1dG9uZWcpIHsKLSAgICAgICAgZTEwMDBfbXNfdHlwZSBwaHlfbXNfc2V0dGluZyA9IGh3LT5tYXN0ZXJfc2xhdmU7CisJLyogc2V0IGF1dG8tbWFzdGVyIHNsYXZlIHJlc29sdXRpb24gc2V0dGluZ3MgKi8KKwlpZiAoaHctPmF1dG9uZWcpIHsKKwkJZTEwMDBfbXNfdHlwZSBwaHlfbXNfc2V0dGluZyA9IGh3LT5tYXN0ZXJfc2xhdmU7CiAKLSAgICAgICAgaWYgKGh3LT5mZmVfY29uZmlnX3N0YXRlID09IGUxMDAwX2ZmZV9jb25maWdfYWN0aXZlKQotICAgICAgICAgICAgaHctPmZmZV9jb25maWdfc3RhdGUgPSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQ7CisJCWlmIChody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSkKKwkJCWh3LT5mZmVfY29uZmlnX3N0YXRlID0gZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkOwogCi0gICAgICAgIGlmIChody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkKLSAgICAgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOworCQlpZiAoaHctPmRzcF9jb25maWdfc3RhdGUgPT0gZTEwMDBfZHNwX2NvbmZpZ19hY3RpdmF0ZWQpCisJCQlody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZDsKIAotICAgICAgICAvKiB3aGVuIGF1dG9uZWdvdGlhdGlvbiBhZHZlcnRpc21lbnQgaXMgb25seSAxMDAwTWJwcyB0aGVuIHdlCi0gICAgICAgICAgKiBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkIGFuZCBlbmFibGUgQXV0byBNYXN0ZXJTbGF2ZQotICAgICAgICAgICogcmVzb2x1dGlvbiBhcyBoYXJkd2FyZSBkZWZhdWx0LiAqLwotICAgICAgICBpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBRFZFUlRJU0VfMTAwMF9GVUxMKSB7Ci0gICAgICAgICAgICAvKiBEaXNhYmxlIFNtYXJ0U3BlZWQgKi8KLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgLyogU2V0IGF1dG8gTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gcHJvY2VzcyAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgIHBoeV9kYXRhICY9IH5DUl8xMDAwVF9NU19FTkFCTEU7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIHBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9CisJCS8qIHdoZW4gYXV0b25lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgaXMgb25seSAxMDAwTWJwcyB0aGVuIHdlCisJCSAqIHNob3VsZCBkaXNhYmxlIFNtYXJ0U3BlZWQgYW5kIGVuYWJsZSBBdXRvIE1hc3RlclNsYXZlCisJCSAqIHJlc29sdXRpb24gYXMgaGFyZHdhcmUgZGVmYXVsdC4gKi8KKwkJaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQURWRVJUSVNFXzEwMDBfRlVMTCkgeworCQkJLyogRGlzYWJsZSBTbWFydFNwZWVkICovCisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorCQkJCQkgICAgICAgJnBoeV9kYXRhKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKwkJCQkJCXBoeV9kYXRhKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJLyogU2V0IGF1dG8gTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gcHJvY2VzcyAqLworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9kYXRhKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJcGh5X2RhdGEgJj0gfkNSXzEwMDBUX01TX0VOQUJMRTsKKwkJCXJldF92YWwgPQorCQkJICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfZGF0YSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQogCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAvKiBsb2FkIGRlZmF1bHRzIGZvciBmdXR1cmUgdXNlICovCi0gICAgICAgIGh3LT5vcmlnaW5hbF9tYXN0ZXJfc2xhdmUgPSAocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19FTkFCTEUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBoeV9kYXRhICYgQ1JfMTAwMFRfTVNfVkFMVUUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfZm9yY2VfbWFzdGVyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfZm9yY2Vfc2xhdmUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfYXV0bzsKKwkJLyogbG9hZCBkZWZhdWx0cyBmb3IgZnV0dXJlIHVzZSAqLworCQlody0+b3JpZ2luYWxfbWFzdGVyX3NsYXZlID0gKHBoeV9kYXRhICYgQ1JfMTAwMFRfTVNfRU5BQkxFKSA/CisJCSAgICAoKHBoeV9kYXRhICYgQ1JfMTAwMFRfTVNfVkFMVUUpID8KKwkJICAgICBlMTAwMF9tc19mb3JjZV9tYXN0ZXIgOgorCQkgICAgIGUxMDAwX21zX2ZvcmNlX3NsYXZlKSA6IGUxMDAwX21zX2F1dG87CiAKLSAgICAgICAgc3dpdGNoIChwaHlfbXNfc2V0dGluZykgewotICAgICAgICBjYXNlIGUxMDAwX21zX2ZvcmNlX21hc3RlcjoKLSAgICAgICAgICAgIHBoeV9kYXRhIHw9IChDUl8xMDAwVF9NU19FTkFCTEUgfCBDUl8xMDAwVF9NU19WQUxVRSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBlMTAwMF9tc19mb3JjZV9zbGF2ZToKLSAgICAgICAgICAgIHBoeV9kYXRhIHw9IENSXzEwMDBUX01TX0VOQUJMRTsKLSAgICAgICAgICAgIHBoeV9kYXRhICY9IH4oQ1JfMTAwMFRfTVNfVkFMVUUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfbXNfYXV0bzoKLSAgICAgICAgICAgIHBoeV9kYXRhICY9IH5DUl8xMDAwVF9NU19FTkFCTEU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQorCQlzd2l0Y2ggKHBoeV9tc19zZXR0aW5nKSB7CisJCWNhc2UgZTEwMDBfbXNfZm9yY2VfbWFzdGVyOgorCQkJcGh5X2RhdGEgfD0gKENSXzEwMDBUX01TX0VOQUJMRSB8IENSXzEwMDBUX01TX1ZBTFVFKTsKKwkJCWJyZWFrOworCQljYXNlIGUxMDAwX21zX2ZvcmNlX3NsYXZlOgorCQkJcGh5X2RhdGEgfD0gQ1JfMTAwMFRfTVNfRU5BQkxFOworCQkJcGh5X2RhdGEgJj0gfihDUl8xMDAwVF9NU19WQUxVRSk7CisJCQlicmVhazsKKwkJY2FzZSBlMTAwMF9tc19hdXRvOgorCQkJcGh5X2RhdGEgJj0gfkNSXzEwMDBUX01TX0VOQUJMRTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgcGh5X2RhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCX0KIAotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29wcGVyIGxpbmsgc2V0dXAgZm9yIGUxMDAwX3BoeV9nZzgyNTYzIHNlcmllcy4KLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfY29wcGVyX2xpbmtfZ2dwX3NldHVwKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHBoeV9kYXRhOwotICAgIHUzMiByZWdfZGF0YTsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfZ2dwX3NldHVwIik7Ci0KLSAgICBpZiAoIWh3LT5waHlfcmVzZXRfZGlzYWJsZSkgewotCi0gICAgICAgIC8qIEVuYWJsZSBDUlMgb24gVFggZm9yIGhhbGYtZHVwbGV4IG9wZXJhdGlvbi4gKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfTUFDX1NQRUNfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgIHBoeV9kYXRhIHw9IEdHODI1NjNfTVNDUl9BU1NFUlRfQ1JTX09OX1RYOwotICAgICAgICAvKiBVc2UgMjVNSHogZm9yIGJvdGggbGluayBkb3duIGFuZCAxMDAwQkFTRS1UIGZvciBUeCBjbG9jayAqLwotICAgICAgICBwaHlfZGF0YSB8PSBHRzgyNTYzX01TQ1JfVFhfQ0xLXzEwMDBNQlBTXzI1TUhaOwotCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9NQUNfU1BFQ19DVFJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAgICAgLyogT3B0aW9uczoKLSAgICAgICAgICogICBNREkvTURJLVggPSAwIChkZWZhdWx0KQotICAgICAgICAgKiAgIDAgLSBBdXRvIGZvciBhbGwgc3BlZWRzCi0gICAgICAgICAqICAgMSAtIE1ESSBtb2RlCi0gICAgICAgICAqICAgMiAtIE1ESS1YIG1vZGUKLSAgICAgICAgICogICAzIC0gQXV0byBmb3IgMTAwMEJhc2UtVCBvbmx5IChNREktWCBmb3IgMTAvMTAwQmFzZS1UIG1vZGVzKQotICAgICAgICAgKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgIHBoeV9kYXRhICY9IH5HRzgyNTYzX1BTQ1JfQ1JPU1NPVkVSX01PREVfTUFTSzsKLQotICAgICAgICBzd2l0Y2ggKGh3LT5tZGl4KSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHBoeV9kYXRhIHw9IEdHODI1NjNfUFNDUl9DUk9TU09WRVJfTU9ERV9NREk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19QU0NSX0NST1NTT1ZFUl9NT0RFX01ESVg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19QU0NSX0NST1NTT1ZFUl9NT0RFX0FVVE87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE9wdGlvbnM6Ci0gICAgICAgICAqICAgZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID0gMCAoZGVmYXVsdCkKLSAgICAgICAgICogICAgICAgQXV0b21hdGljIENvcnJlY3Rpb24gZm9yIFJldmVyc2VkIENhYmxlIFBvbGFyaXR5Ci0gICAgICAgICAqICAgMCAtIERpc2FibGVkCi0gICAgICAgICAqICAgMSAtIEVuYWJsZWQKLSAgICAgICAgICovCi0gICAgICAgIHBoeV9kYXRhICY9IH5HRzgyNTYzX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUxfRElTQUJMRTsKLSAgICAgICAgaWYgKGh3LT5kaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPT0gMSkKLSAgICAgICAgICAgIHBoeV9kYXRhIHw9IEdHODI1NjNfUFNDUl9QT0xBUklUWV9SRVZFUlNBTF9ESVNBQkxFOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7Ci0KLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICAvKiBTVyBSZXNldCB0aGUgUEhZIHNvIGFsbCBjaGFuZ2VzIHRha2UgZWZmZWN0ICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfcmVzZXQoaHcpOwotICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyB0aGUgUEhZXG4iKTsKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9Ci0gICAgfSAvKiBwaHlfcmVzZXRfZGlzYWJsZSAqLwotCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikgewotICAgICAgICAvKiBCeXBhc3MgUlggYW5kIFRYIEZJRk8ncyAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfa21ybl9yZWcoaHcsIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUX0ZJRk9fQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0tVTUNUUkxTVEFfRklGT19DVFJMX1JYX0JZUEFTUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9LVU1DVFJMU1RBX0ZJRk9fQ1RSTF9UWF9CWVBBU1MpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIEdHODI1NjNfUEhZX1NQRUNfQ1RSTF8yLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgIHBoeV9kYXRhICY9IH5HRzgyNTYzX1BTQ1IyX1JFVkVSU0VfQVVUT19ORUc7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9TUEVDX0NUUkxfMiwgcGh5X2RhdGEpOwotCi0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAgICAgcmVnX2RhdGEgPSBlcjMyKENUUkxfRVhUKTsKLSAgICAgICAgcmVnX2RhdGEgJj0gfihFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfTUFTSyk7Ci0gICAgICAgIGV3MzIoQ1RSTF9FWFQsIHJlZ19kYXRhKTsKLQotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9QV1JfTUdNVF9DVFJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICAvKiBEbyBub3QgaW5pdCB0aGVzZSByZWdpc3RlcnMgd2hlbiB0aGUgSFcgaXMgaW4gSUFNVCBtb2RlLCBzaW5jZSB0aGUKLSAgICAgICAgICogZmlybXdhcmUgd2lsbCBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlbS4gIFdlIG9ubHkgaW5pdGlhbGl6ZQotICAgICAgICAgKiB0aGVtIGlmIHRoZSBIVyBpcyBub3QgaW4gSUFNVCBtb2RlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFlMTAwMF9jaGVja19tbmdfbW9kZShodykpIHsKLSAgICAgICAgICAgIC8qIEVuYWJsZSBFbGVjdHJpY2FsIElkbGUgb24gdGhlIFBIWSAqLwotICAgICAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19QTUNSX0VOQUJMRV9FTEVDVFJJQ0FMX0lETEU7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfUFdSX01HTVRfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgICAgICBwaHlfZGF0YSAmPSB+R0c4MjU2M19LTUNSX1BBU1NfRkFMU0VfQ0FSUklFUjsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9LTVJOX01PREVfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKLQotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXb3JrYXJvdW5kOiBEaXNhYmxlIHBhZGRpbmcgaW4gS3VtZXJhbiBpbnRlcmZhY2UgaW4gdGhlIE1BQwotICAgICAgICAgKiBhbmQgaW4gdGhlIFBIWSB0byBhdm9pZCBDUkMgZXJyb3JzLgotICAgICAgICAgKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfSU5CQU5EX0NUUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19JQ1JfRElTX1BBRERJTkc7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBHRzgyNTYzX1BIWV9JTkJBTkRfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29wcGVyIGxpbmsgc2V0dXAgZm9yIGUxMDAwX3BoeV9tODggc2VyaWVzLgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9jb3BwZXJfbGlua19tZ3Bfc2V0dXAgLSBDb3BwZXIgbGluayBzZXR1cCBmb3IgZTEwMDBfcGh5X204OCBzZXJpZXMuCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICovCiBzdGF0aWMgczMyIGUxMDAwX2NvcHBlcl9saW5rX21ncF9zZXR1cChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBwaHlfZGF0YTsKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgcGh5X2RhdGE7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX21ncF9zZXR1cCIpOworCURFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfbWdwX3NldHVwIik7CiAKLSAgICBpZiAoaHctPnBoeV9yZXNldF9kaXNhYmxlKQotICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlpZiAoaHctPnBoeV9yZXNldF9kaXNhYmxlKQorCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIAotICAgIC8qIEVuYWJsZSBDUlMgb24gVFguIFRoaXMgbXVzdCBiZSBzZXQgZm9yIGhhbGYtZHVwbGV4IG9wZXJhdGlvbi4gKi8KLSAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkvKiBFbmFibGUgQ1JTIG9uIFRYLiBUaGlzIG11c3QgYmUgc2V0IGZvciBoYWxmLWR1cGxleCBvcGVyYXRpb24uICovCisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFg7CisJcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BU1NFUlRfQ1JTX09OX1RYOwogCi0gICAgLyogT3B0aW9uczoKLSAgICAgKiAgIE1ESS9NREktWCA9IDAgKGRlZmF1bHQpCi0gICAgICogICAwIC0gQXV0byBmb3IgYWxsIHNwZWVkcwotICAgICAqICAgMSAtIE1ESSBtb2RlCi0gICAgICogICAyIC0gTURJLVggbW9kZQotICAgICAqICAgMyAtIEF1dG8gZm9yIDEwMDBCYXNlLVQgb25seSAoTURJLVggZm9yIDEwLzEwMEJhc2UtVCBtb2RlcykKLSAgICAgKi8KLSAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKKwkvKiBPcHRpb25zOgorCSAqICAgTURJL01ESS1YID0gMCAoZGVmYXVsdCkKKwkgKiAgIDAgLSBBdXRvIGZvciBhbGwgc3BlZWRzCisJICogICAxIC0gTURJIG1vZGUKKwkgKiAgIDIgLSBNREktWCBtb2RlCisJICogICAzIC0gQXV0byBmb3IgMTAwMEJhc2UtVCBvbmx5IChNREktWCBmb3IgMTAvMTAwQmFzZS1UIG1vZGVzKQorCSAqLworCXBoeV9kYXRhICY9IH5NODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOwogCi0gICAgc3dpdGNoIChody0+bWRpeCkgewotICAgIGNhc2UgMToKLSAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElYX01BTlVBTF9NT0RFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVVUT19YXzEwMDBUOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDA6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCXN3aXRjaCAoaHctPm1kaXgpIHsKKwljYXNlIDE6CisJCXBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfTURJX01BTlVBTF9NT0RFOworCQlicmVhazsKKwljYXNlIDI6CisJCXBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfTURJWF9NQU5VQUxfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FVVE9fWF8xMDAwVDsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCXBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVVUT19YX01PREU7CisJCWJyZWFrOworCX0KIAotICAgIC8qIE9wdGlvbnM6Ci0gICAgICogICBkaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPSAwIChkZWZhdWx0KQotICAgICAqICAgICAgIEF1dG9tYXRpYyBDb3JyZWN0aW9uIGZvciBSZXZlcnNlZCBDYWJsZSBQb2xhcml0eQotICAgICAqICAgMCAtIERpc2FibGVkCi0gICAgICogICAxIC0gRW5hYmxlZAotICAgICAqLwotICAgIHBoeV9kYXRhICY9IH5NODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMOwotICAgIGlmIChody0+ZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID09IDEpCi0gICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUw7Ci0gICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJLyogT3B0aW9uczoKKwkgKiAgIGRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9IDAgKGRlZmF1bHQpCisJICogICAgICAgQXV0b21hdGljIENvcnJlY3Rpb24gZm9yIFJldmVyc2VkIENhYmxlIFBvbGFyaXR5CisJICogICAwIC0gRGlzYWJsZWQKKwkgKiAgIDEgLSBFbmFibGVkCisJICovCisJcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUw7CisJaWYgKGh3LT5kaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPT0gMSkKKwkJcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTDsKKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIGlmIChody0+cGh5X3JldmlzaW9uIDwgTTg4RTEwMTFfSV9SRVZfNCkgewotICAgICAgICAvKiBGb3JjZSBUWF9DTEsgaW4gdGhlIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyCi0gICAgICAgICAqIHRvIDI1TUh6IGNsb2NrLgotICAgICAgICAgKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJaWYgKGh3LT5waHlfcmV2aXNpb24gPCBNODhFMTAxMV9JX1JFVl80KSB7CisJCS8qIEZvcmNlIFRYX0NMSyBpbiB0aGUgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIKKwkJICogdG8gMjVNSHogY2xvY2suCisJCSAqLworCQlyZXRfdmFsID0KKwkJICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsCisJCQkJICAgICAgICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1OworCQlwaHlfZGF0YSB8PSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMjU7CiAKLSAgICAgICAgaWYgKChody0+cGh5X3JldmlzaW9uID09IEUxMDAwX1JFVklTSU9OXzIpICYmCi0gICAgICAgICAgICAoaHctPnBoeV9pZCA9PSBNODhFMTExMV9JX1BIWV9JRCkpIHsKLSAgICAgICAgICAgIC8qIFZpZGFsaWEgUGh5LCBzZXQgdGhlIGRvd25zaGlmdCBjb3VudGVyIHRvIDV4ICovCi0gICAgICAgICAgICBwaHlfZGF0YSAmPSB+KE04OEVDMDE4X0VQU0NSX0RPV05TSElGVF9DT1VOVEVSX01BU0spOwotICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RUMwMThfRVBTQ1JfRE9XTlNISUZUX0NPVU5URVJfNVg7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBDb25maWd1cmUgTWFzdGVyIGFuZCBTbGF2ZSBkb3duc2hpZnQgdmFsdWVzICovCi0gICAgICAgICAgICBwaHlfZGF0YSAmPSB+KE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfTUFTSyk7Ci0gICAgICAgICAgICBwaHlfZGF0YSB8PSAoTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF8xWCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF8xWCk7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQotICAgIH0KKwkJaWYgKChody0+cGh5X3JldmlzaW9uID09IEUxMDAwX1JFVklTSU9OXzIpICYmCisJCSAgICAoaHctPnBoeV9pZCA9PSBNODhFMTExMV9JX1BIWV9JRCkpIHsKKwkJCS8qIFZpZGFsaWEgUGh5LCBzZXQgdGhlIGRvd25zaGlmdCBjb3VudGVyIHRvIDV4ICovCisJCQlwaHlfZGF0YSAmPSB+KE04OEVDMDE4X0VQU0NSX0RPV05TSElGVF9DT1VOVEVSX01BU0spOworCQkJcGh5X2RhdGEgfD0gTTg4RUMwMThfRVBTQ1JfRE9XTlNISUZUX0NPVU5URVJfNVg7CisJCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKwkJCQkJCSAgICAgIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLAorCQkJCQkJICAgICAgcGh5X2RhdGEpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCX0gZWxzZSB7CisJCQkvKiBDb25maWd1cmUgTWFzdGVyIGFuZCBTbGF2ZSBkb3duc2hpZnQgdmFsdWVzICovCisJCQlwaHlfZGF0YSAmPSB+KE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfTUFTSyB8CisJCQkJICAgICAgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUX01BU0spOworCQkJcGh5X2RhdGEgfD0gKE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfMVggfAorCQkJCSAgICAgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzFYKTsKKwkJCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LAorCQkJCQkJICAgICAgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsCisJCQkJCQkgICAgICBwaHlfZGF0YSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCX0KIAotICAgIC8qIFNXIFJlc2V0IHRoZSBQSFkgc28gYWxsIGNoYW5nZXMgdGFrZSBlZmZlY3QgKi8KLSAgICByZXRfdmFsID0gZTEwMDBfcGh5X3Jlc2V0KGh3KTsKLSAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOwotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9CisJLyogU1cgUmVzZXQgdGhlIFBIWSBzbyBhbGwgY2hhbmdlcyB0YWtlIGVmZmVjdCAqLworCXJldF92YWwgPSBlMTAwMF9waHlfcmVzZXQoaHcpOworCWlmIChyZXRfdmFsKSB7CisJCURFQlVHT1VUKCJFcnJvciBSZXNldHRpbmcgdGhlIFBIWVxuIik7CisJCXJldHVybiByZXRfdmFsOworCX0KIAotICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBTZXR1cCBhdXRvLW5lZ290aWF0aW9uIGFuZCBmbG93IGNvbnRyb2wgYWR2ZXJ0aXNlbWVudHMsCi0qIGFuZCB0aGVuIHBlcmZvcm0gYXV0by1uZWdvdGlhdGlvbi4KLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyAtIHNldHVwIGF1dG8tbmVnCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFNldHVwIGF1dG8tbmVnb3RpYXRpb24gYW5kIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50cywKKyAqIGFuZCB0aGVuIHBlcmZvcm0gYXV0by1uZWdvdGlhdGlvbi4KKyAqLwogc3RhdGljIHMzMiBlMTAwMF9jb3BwZXJfbGlua19hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHBoeV9kYXRhOworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfZGF0YTsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyIpOworCURFQlVHRlVOQygiZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyIpOwogCi0gICAgLyogUGVyZm9ybSBzb21lIGJvdW5kcyBjaGVja2luZyBvbiB0aGUgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZAotICAgICAqIHBhcmFtZXRlci4gIElmIHRoaXMgdmFyaWFibGUgaXMgemVybywgdGhlbiBzZXQgaXQgdG8gdGhlIGRlZmF1bHQuCi0gICAgICovCi0gICAgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOworCS8qIFBlcmZvcm0gc29tZSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQKKwkgKiBwYXJhbWV0ZXIuICBJZiB0aGlzIHZhcmlhYmxlIGlzIHplcm8sIHRoZW4gc2V0IGl0IHRvIHRoZSBkZWZhdWx0LgorCSAqLworCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJj0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKIAotICAgIC8qIElmIGF1dG9uZWdfYWR2ZXJ0aXNlZCBpcyB6ZXJvLCB3ZSBhc3N1bWUgaXQgd2FzIG5vdCBkZWZhdWx0ZWQKLSAgICAgKiBieSB0aGUgY2FsbGluZyBjb2RlIHNvIHdlIHNldCB0byBhZHZlcnRpc2UgZnVsbCBjYXBhYmlsaXR5LgotICAgICAqLwotICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IDApCi0gICAgICAgIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOworCS8qIElmIGF1dG9uZWdfYWR2ZXJ0aXNlZCBpcyB6ZXJvLCB3ZSBhc3N1bWUgaXQgd2FzIG5vdCBkZWZhdWx0ZWQKKwkgKiBieSB0aGUgY2FsbGluZyBjb2RlIHNvIHdlIHNldCB0byBhZHZlcnRpc2UgZnVsbCBjYXBhYmlsaXR5LgorCSAqLworCWlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IDApCisJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOwogCi0gICAgLyogSUZFIHBoeSBvbmx5IHN1cHBvcnRzIDEwLzEwMCAqLwotICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lmZSkKLSAgICAgICAgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmPSBBVVRPTkVHX0FEVkVSVElTRV8xMF8xMDBfQUxMOworCURFQlVHT1VUKCJSZWNvbmZpZ3VyaW5nIGF1dG8tbmVnIGFkdmVydGlzZW1lbnQgcGFyYW1zXG4iKTsKKwlyZXRfdmFsID0gZTEwMDBfcGh5X3NldHVwX2F1dG9uZWcoaHcpOworCWlmIChyZXRfdmFsKSB7CisJCURFQlVHT1VUKCJFcnJvciBTZXR0aW5nIHVwIEF1dG8tTmVnb3RpYXRpb25cbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisJREVCVUdPVVQoIlJlc3RhcnRpbmcgQXV0by1OZWdcbiIpOwogCi0gICAgREVCVUdPVVQoIlJlY29uZmlndXJpbmcgYXV0by1uZWcgYWR2ZXJ0aXNlbWVudCBwYXJhbXNcbiIpOwotICAgIHJldF92YWwgPSBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhodyk7Ci0gICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgREVCVUdPVVQoIkVycm9yIFNldHRpbmcgdXAgQXV0by1OZWdvdGlhdGlvblxuIik7Ci0gICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIH0KLSAgICBERUJVR09VVCgiUmVzdGFydGluZyBBdXRvLU5lZ1xuIik7CisJLyogUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIGJ5IHNldHRpbmcgdGhlIEF1dG8gTmVnIEVuYWJsZSBiaXQgYW5kCisJICogdGhlIEF1dG8gTmVnIFJlc3RhcnQgYml0IGluIHRoZSBQSFkgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwlyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgJnBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAvKiBSZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gYnkgc2V0dGluZyB0aGUgQXV0byBOZWcgRW5hYmxlIGJpdCBhbmQKLSAgICAgKiB0aGUgQXV0byBOZWcgUmVzdGFydCBiaXQgaW4gdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyLgotICAgICAqLwotICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmcGh5X2RhdGEpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwlwaHlfZGF0YSB8PSAoTUlJX0NSX0FVVE9fTkVHX0VOIHwgTUlJX0NSX1JFU1RBUlRfQVVUT19ORUcpOworCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgcGh5X2RhdGEpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIHBoeV9kYXRhIHw9IChNSUlfQ1JfQVVUT19ORUdfRU4gfCBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyk7Ci0gICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCS8qIERvZXMgdGhlIHVzZXIgd2FudCB0byB3YWl0IGZvciBBdXRvLU5lZyB0byBjb21wbGV0ZSBoZXJlLCBvcgorCSAqIGNoZWNrIGF0IGEgbGF0ZXIgdGltZSAoZm9yIGV4YW1wbGUsIGNhbGxiYWNrIHJvdXRpbmUpLgorCSAqLworCWlmIChody0+d2FpdF9hdXRvbmVnX2NvbXBsZXRlKSB7CisJCXJldF92YWwgPSBlMTAwMF93YWl0X2F1dG9uZWcoaHcpOworCQlpZiAocmV0X3ZhbCkgeworCQkJREVCVUdPVVQKKwkJCSAgICAoIkVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIGF1dG9uZWcgdG8gY29tcGxldGVcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwl9CiAKLSAgICAvKiBEb2VzIHRoZSB1c2VyIHdhbnQgdG8gd2FpdCBmb3IgQXV0by1OZWcgdG8gY29tcGxldGUgaGVyZSwgb3IKLSAgICAgKiBjaGVjayBhdCBhIGxhdGVyIHRpbWUgKGZvciBleGFtcGxlLCBjYWxsYmFjayByb3V0aW5lKS4KLSAgICAgKi8KLSAgICBpZiAoaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSkgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfd2FpdF9hdXRvbmVnKGh3KTsKLSAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9Ci0gICAgfQorCWh3LT5nZXRfbGlua19zdGF0dXMgPSB0cnVlOwogCi0gICAgaHctPmdldF9saW5rX3N0YXR1cyA9IHRydWU7Ci0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb25maWcgdGhlIE1BQyBhbmQgdGhlIFBIWSBhZnRlciBsaW5rIGlzIHVwLgotKiAgIDEpIFNldCB1cCB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKLSogICAgICBpZiB3ZSBhcmUgb24gODI1NDMuICBJZiB3ZQotKiAgICAgIGFyZSBvbiBuZXdlciBzaWxpY29uLCB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlCi0qICAgICAgY29sbGlzaW9uIGRpc3RhbmNlIGluIHRoZSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyLgotKiAgIDIpIFNldCB1cCBmbG93IGNvbnRyb2wgb24gdGhlIE1BQyB0byB0aGF0IGVzdGFibGlzaGVkIHdpdGgKLSogICAgICB0aGUgbGluayBwYXJ0bmVyLgotKiAgIDMpIENvbmZpZyBEU1AgdG8gaW1wcm92ZSBHaWdhYml0IGxpbmsgcXVhbGl0eSBmb3Igc29tZSBQSFkgcmV2aXNpb25zLgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9jb3BwZXJfbGlua19wb3N0Y29uZmlnIC0gcG9zdCBsaW5rIHNldHVwCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIENvbmZpZyB0aGUgTUFDIGFuZCB0aGUgUEhZIGFmdGVyIGxpbmsgaXMgdXAuCisgKiAgIDEpIFNldCB1cCB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKKyAqICAgICAgaWYgd2UgYXJlIG9uIDgyNTQzLiAgSWYgd2UKKyAqICAgICAgYXJlIG9uIG5ld2VyIHNpbGljb24sIHdlIG9ubHkgbmVlZCB0byBjb25maWd1cmUKKyAqICAgICAgY29sbGlzaW9uIGRpc3RhbmNlIGluIHRoZSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyLgorICogICAyKSBTZXQgdXAgZmxvdyBjb250cm9sIG9uIHRoZSBNQUMgdG8gdGhhdCBlc3RhYmxpc2hlZCB3aXRoCisgKiAgICAgIHRoZSBsaW5rIHBhcnRuZXIuCisgKiAgIDMpIENvbmZpZyBEU1AgdG8gaW1wcm92ZSBHaWdhYml0IGxpbmsgcXVhbGl0eSBmb3Igc29tZSBQSFkgcmV2aXNpb25zLgorICovCiBzdGF0aWMgczMyIGUxMDAwX2NvcHBlcl9saW5rX3Bvc3Rjb25maWcoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICBERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX3Bvc3Rjb25maWciKTsKKwlzMzIgcmV0X3ZhbDsKKwlERUJVR0ZVTkMoImUxMDAwX2NvcHBlcl9saW5rX3Bvc3Rjb25maWciKTsKIAotICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpIHsKLSAgICAgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOwotICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIE1BQyB0byBQSFkgc2V0dGluZ3NcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KTsKLSAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICBERUJVR09VVCgiRXJyb3IgQ29uZmlndXJpbmcgRmxvdyBDb250cm9sXG4iKTsKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQorCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpIHsKKwkJZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKKwl9IGVsc2UgeworCQlyZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOworCQlpZiAocmV0X3ZhbCkgeworCQkJREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIE1BQyB0byBQSFkgc2V0dGluZ3NcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KKwl9CisJcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KTsKKwlpZiAocmV0X3ZhbCkgeworCQlERUJVR09VVCgiRXJyb3IgQ29uZmlndXJpbmcgRmxvdyBDb250cm9sXG4iKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQogCi0gICAgLyogQ29uZmlnIERTUCB0byBpbXByb3ZlIEdpZ2EgbGluayBxdWFsaXR5ICovCi0gICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlKGh3LCB0cnVlKTsKLSAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBDb25maWd1cmluZyBEU1AgYWZ0ZXIgbGluayB1cFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQotICAgIH0KKwkvKiBDb25maWcgRFNQIHRvIGltcHJvdmUgR2lnYSBsaW5rIHF1YWxpdHkgKi8KKwlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApIHsKKwkJcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UoaHcsIHRydWUpOworCQlpZiAocmV0X3ZhbCkgeworCQkJREVCVUdPVVQoIkVycm9yIENvbmZpZ3VyaW5nIERTUCBhZnRlciBsaW5rIHVwXG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQogCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRGV0ZWN0cyB3aGljaCBQSFkgaXMgcHJlc2VudCBhbmQgc2V0dXAgdGhlIHNwZWVkIGFuZCBkdXBsZXgKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsgLSBwaHkvc3BlZWQvZHVwbGV4IHNldHRpbmcKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogRGV0ZWN0cyB3aGljaCBQSFkgaXMgcHJlc2VudCBhbmQgc2V0cyB1cCB0aGUgc3BlZWQgYW5kIGR1cGxleAorICovCiBzdGF0aWMgczMyIGUxMDAwX3NldHVwX2NvcHBlcl9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IGk7Ci0gICAgdTE2IHBoeV9kYXRhOwotICAgIHUxNiByZWdfZGF0YSA9IDA7CisJczMyIHJldF92YWw7CisJdTE2IGk7CisJdTE2IHBoeV9kYXRhOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9jb3BwZXJfbGluayIpOworCURFQlVHRlVOQygiZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsiKTsKIAotICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLSAgICBjYXNlIGUxMDAwX2ljaDhsYW46Ci0gICAgICAgIC8qIFNldCB0aGUgbWFjIHRvIHdhaXQgdGhlIG1heGltdW0gdGltZSBiZXR3ZWVuIGVhY2gKLSAgICAgICAgICogaXRlcmF0aW9uIGFuZCBpbmNyZWFzZSB0aGUgbWF4IGl0ZXJhdGlvbnMgd2hlbgotICAgICAgICAgKiBwb2xsaW5nIHRoZSBwaHk7IHRoaXMgZml4ZXMgZXJyb25lb3VzIHRpbWVvdXRzIGF0IDEwTWJwcy4gKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX2ttcm5fcmVnKGh3LCBHRzgyNTYzX1JFRygweDM0LCA0KSwgMHhGRkZGKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfa21ybl9yZWcoaHcsIEdHODI1NjNfUkVHKDB4MzQsIDkpLCAmcmVnX2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICByZWdfZGF0YSB8PSAweDNGOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfa21ybl9yZWcoaHcsIEdHODI1NjNfUkVHKDB4MzQsIDkpLCByZWdfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCS8qIENoZWNrIGlmIGl0IGlzIGEgdmFsaWQgUEhZIGFuZCBzZXQgUEhZIG1vZGUgaWYgbmVjZXNzYXJ5LiAqLworCXJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWcoaHcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIC8qIENoZWNrIGlmIGl0IGlzIGEgdmFsaWQgUEhZIGFuZCBzZXQgUEhZIG1vZGUgaWYgbmVjZXNzYXJ5LiAqLwotICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19wcmVjb25maWcoaHcpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApIHsKKwkJcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX2lncF9zZXR1cChodyk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworCQlyZXRfdmFsID0gZTEwMDBfY29wcGVyX2xpbmtfbWdwX3NldHVwKGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CiAKLSAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0gICAgICAgIC8qIEt1bWVyYW4gcmVnaXN0ZXJzIGFyZSB3cml0dGVuLW9ubHkgKi8KLSAgICAgICAgcmVnX2RhdGEgPSBFMTAwMF9LVU1DVFJMU1RBX0lOQl9DVFJMX0xJTktfU1RBVFVTX1RYX1RJTUVPVVRfREVGQVVMVDsKLSAgICAgICAgcmVnX2RhdGEgfD0gRTEwMDBfS1VNQ1RSTFNUQV9JTkJfQ1RSTF9ESVNfUEFERElORzsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX2ttcm5fcmVnKGh3LCBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9JTkJfQ1RSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCWlmIChody0+YXV0b25lZykgeworCQkvKiBTZXR1cCBhdXRvbmVnIGFuZCBmbG93IGNvbnRyb2wgYWR2ZXJ0aXNlbWVudAorCQkgKiBhbmQgcGVyZm9ybSBhdXRvbmVnb3RpYXRpb24gKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX2F1dG9uZWcoaHcpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCX0gZWxzZSB7CisJCS8qIFBIWSB3aWxsIGJlIHNldCB0byAxMEgsIDEwRiwgMTAwSCxvciAxMDBGCisJCSAqIGRlcGVuZGluZyBvbiB2YWx1ZSBmcm9tIGZvcmNlZF9zcGVlZF9kdXBsZXguICovCisJCURFQlVHT1VUKCJGb3JjaW5nIHNwZWVkIGFuZCBkdXBsZXhcbiIpOworCQlyZXRfdmFsID0gZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleChodyk7CisJCWlmIChyZXRfdmFsKSB7CisJCQlERUJVR09VVCgiRXJyb3IgRm9yY2luZyBTcGVlZCBhbmQgRHVwbGV4XG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQogCi0gICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8Ci0gICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzMgfHwKLSAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMikgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfY29wcGVyX2xpbmtfaWdwX3NldHVwKGh3KTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19tZ3Bfc2V0dXAoaHcpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9nZzgyNTYzKSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9jb3BwZXJfbGlua19nZ3Bfc2V0dXAoaHcpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIH0KKwkvKiBDaGVjayBsaW5rIHN0YXR1cy4gV2FpdCB1cCB0byAxMDAgbWljcm9zZWNvbmRzIGZvciBsaW5rIHRvIGJlY29tZQorCSAqIHZhbGlkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICBpZiAoaHctPmF1dG9uZWcpIHsKLSAgICAgICAgLyogU2V0dXAgYXV0b25lZyBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQKLSAgICAgICAgICAqIGFuZCBwZXJmb3JtIGF1dG9uZWdvdGlhdGlvbiAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfY29wcGVyX2xpbmtfYXV0b25lZyhodyk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogUEhZIHdpbGwgYmUgc2V0IHRvIDEwSCwgMTBGLCAxMDBILG9yIDEwMEYKLSAgICAgICAgICAqIGRlcGVuZGluZyBvbiB2YWx1ZSBmcm9tIGZvcmNlZF9zcGVlZF9kdXBsZXguICovCi0gICAgICAgIERFQlVHT1VUKCJGb3JjaW5nIHNwZWVkIGFuZCBkdXBsZXhcbiIpOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleChodyk7Ci0gICAgICAgIGlmIChyZXRfdmFsKSB7Ci0gICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgRm9yY2luZyBTcGVlZCBhbmQgRHVwbGV4XG4iKTsKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKKwkJCS8qIENvbmZpZyB0aGUgTUFDIGFuZCBQSFkgYWZ0ZXIgbGluayBpcyB1cCAqLworCQkJcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX3Bvc3Rjb25maWcoaHcpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAvKiBDaGVjayBsaW5rIHN0YXR1cy4gV2FpdCB1cCB0byAxMDAgbWljcm9zZWNvbmRzIGZvciBsaW5rIHRvIGJlY29tZQotICAgICAqIHZhbGlkLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCQlERUJVR09VVCgiVmFsaWQgbGluayBlc3RhYmxpc2hlZCEhIVxuIik7CisJCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KIAotICAgICAgICBpZiAocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKLSAgICAgICAgICAgIC8qIENvbmZpZyB0aGUgTUFDIGFuZCBQSFkgYWZ0ZXIgbGluayBpcyB1cCAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvcHBlcl9saW5rX3Bvc3Rjb25maWcoaHcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAgICAgICAgIERFQlVHT1VUKCJWYWxpZCBsaW5rIGVzdGFibGlzaGVkISEhXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotICAgICAgICB9Ci0gICAgICAgIHVkZWxheSgxMCk7Ci0gICAgfQotCi0gICAgREVCVUdPVVQoIlVuYWJsZSB0byBlc3RhYmxpc2ggbGluayEhIVxuIik7Ci0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJREVCVUdPVVQoIlVuYWJsZSB0byBlc3RhYmxpc2ggbGluayEhIVxuIik7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29uZmlndXJlIHRoZSBNQUMtdG8tUEhZIGludGVyZmFjZSBmb3IgMTAvMTAwTWJwcwotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9jb25maWd1cmVfa21ybl9mb3JfMTBfMTAwKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBkdXBsZXgpCi17Ci0gICAgczMyIHJldF92YWwgPSBFMTAwMF9TVUNDRVNTOwotICAgIHUzMiB0aXBnOwotICAgIHUxNiByZWdfZGF0YTsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlndXJlX2ttcm5fZm9yXzEwXzEwMCIpOwotCi0gICAgcmVnX2RhdGEgPSBFMTAwMF9LVU1DVFJMU1RBX0hEX0NUUkxfMTBfMTAwX0RFRkFVTFQ7Ci0gICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX2ttcm5fcmVnKGh3LCBFMTAwMF9LVU1DVFJMU1RBX09GRlNFVF9IRF9DVFJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgLyogQ29uZmlndXJlIFRyYW5zbWl0IEludGVyLVBhY2tldCBHYXAgKi8KLSAgICB0aXBnID0gZXIzMihUSVBHKTsKLSAgICB0aXBnICY9IH5FMTAwMF9USVBHX0lQR1RfTUFTSzsKLSAgICB0aXBnIHw9IERFRkFVTFRfODAwMDNFUzJMQU5fVElQR19JUEdUXzEwXzEwMDsKLSAgICBldzMyKFRJUEcsIHRpcGcpOwotCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsICZyZWdfZGF0YSk7Ci0KLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICBpZiAoZHVwbGV4ID09IEhBTEZfRFVQTEVYKQotICAgICAgICByZWdfZGF0YSB8PSBHRzgyNTYzX0tNQ1JfUEFTU19GQUxTRV9DQVJSSUVSOwotICAgIGVsc2UKLSAgICAgICAgcmVnX2RhdGEgJj0gfkdHODI1NjNfS01DUl9QQVNTX0ZBTFNFX0NBUlJJRVI7Ci0KLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsIHJlZ19kYXRhKTsKLQotICAgIHJldHVybiByZXRfdmFsOwotfQotCi1zdGF0aWMgczMyIGUxMDAwX2NvbmZpZ3VyZV9rbXJuX2Zvcl8xMDAwKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgczMyIHJldF92YWwgPSBFMTAwMF9TVUNDRVNTOwotICAgIHUxNiByZWdfZGF0YTsKLSAgICB1MzIgdGlwZzsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlndXJlX2ttcm5fZm9yXzEwMDAiKTsKLQotICAgIHJlZ19kYXRhID0gRTEwMDBfS1VNQ1RSTFNUQV9IRF9DVFJMXzEwMDBfREVGQVVMVDsKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfa21ybl9yZWcoaHcsIEUxMDAwX0tVTUNUUkxTVEFfT0ZGU0VUX0hEX0NUUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19kYXRhKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAvKiBDb25maWd1cmUgVHJhbnNtaXQgSW50ZXItUGFja2V0IEdhcCAqLwotICAgIHRpcGcgPSBlcjMyKFRJUEcpOwotICAgIHRpcGcgJj0gfkUxMDAwX1RJUEdfSVBHVF9NQVNLOwotICAgIHRpcGcgfD0gREVGQVVMVF84MDAwM0VTMkxBTl9USVBHX0lQR1RfMTAwMDsKLSAgICBldzMyKFRJUEcsIHRpcGcpOwotCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsICZyZWdfZGF0YSk7Ci0KLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICByZWdfZGF0YSAmPSB+R0c4MjU2M19LTUNSX1BBU1NfRkFMU0VfQ0FSUklFUjsKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwsIHJlZ19kYXRhKTsKLQotICAgIHJldHVybiByZXRfdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvbmZpZ3VyZXMgUEhZIGF1dG9uZWcgYW5kIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IHNldHRpbmdzCi0qCi0qIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnIC0gcGh5IHNldHRpbmdzCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIENvbmZpZ3VyZXMgUEhZIGF1dG9uZWcgYW5kIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IHNldHRpbmdzCisgKi8KIHMzMiBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBtaWlfYXV0b25lZ19hZHZfcmVnOwotICAgIHUxNiBtaWlfMTAwMHRfY3RybF9yZWc7CisJczMyIHJldF92YWw7CisJdTE2IG1paV9hdXRvbmVnX2Fkdl9yZWc7CisJdTE2IG1paV8xMDAwdF9jdHJsX3JlZzsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X3NldHVwX2F1dG9uZWciKTsKKwlERUJVR0ZVTkMoImUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnIik7CiAKLSAgICAvKiBSZWFkIHRoZSBNSUkgQXV0by1OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoQWRkcmVzcyA0KS4gKi8KLSAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQVVUT05FR19BRFYsICZtaWlfYXV0b25lZ19hZHZfcmVnKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJLyogUmVhZCB0aGUgTUlJIEF1dG8tTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkuICovCisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLCAmbWlpX2F1dG9uZWdfYWR2X3JlZyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgaWYgKGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWZlKSB7Ci0gICAgICAgIC8qIFJlYWQgdGhlIE1JSSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKEFkZHJlc3MgOSkuICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCAmbWlpXzEwMDB0X2N0cmxfcmVnKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9IGVsc2UKLSAgICAgICAgbWlpXzEwMDB0X2N0cmxfcmVnPTA7CisJLyogUmVhZCB0aGUgTUlJIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4gKi8KKwlyZXRfdmFsID0KKwkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJm1paV8xMDAwdF9jdHJsX3JlZyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgLyogTmVlZCB0byBwYXJzZSBib3RoIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMgYW5kIHNldCB1cAotICAgICAqIHRoZSBhcHByb3ByaWF0ZSBQSFkgcmVnaXN0ZXJzLiAgRmlyc3Qgd2Ugd2lsbCBwYXJzZSBmb3IKLSAgICAgKiBhdXRvbmVnX2FkdmVydGlzZWQgc29mdHdhcmUgb3ZlcnJpZGUuICBTaW5jZSB3ZSBjYW4gYWR2ZXJ0aXNlCi0gICAgICogYSBwbGV0aG9yYSBvZiBjb21iaW5hdGlvbnMsIHdlIG5lZWQgdG8gY2hlY2sgZWFjaCBiaXQKLSAgICAgKiBpbmRpdmlkdWFsbHkuCi0gICAgICovCisJLyogTmVlZCB0byBwYXJzZSBib3RoIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMgYW5kIHNldCB1cAorCSAqIHRoZSBhcHByb3ByaWF0ZSBQSFkgcmVnaXN0ZXJzLiAgRmlyc3Qgd2Ugd2lsbCBwYXJzZSBmb3IKKwkgKiBhdXRvbmVnX2FkdmVydGlzZWQgc29mdHdhcmUgb3ZlcnJpZGUuICBTaW5jZSB3ZSBjYW4gYWR2ZXJ0aXNlCisJICogYSBwbGV0aG9yYSBvZiBjb21iaW5hdGlvbnMsIHdlIG5lZWQgdG8gY2hlY2sgZWFjaCBiaXQKKwkgKiBpbmRpdmlkdWFsbHkuCisJICovCiAKLSAgICAvKiBGaXJzdCB3ZSBjbGVhciBhbGwgdGhlIDEwLzEwMCBtYiBzcGVlZCBiaXRzIGluIHRoZSBBdXRvLU5lZwotICAgICAqIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkgYW5kIHRoZSAxMDAwIG1iIHNwZWVkIGJpdHMgaW4KLSAgICAgKiB0aGUgIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4KLSAgICAgKi8KLSAgICBtaWlfYXV0b25lZ19hZHZfcmVnICY9IH5SRUc0X1NQRUVEX01BU0s7Ci0gICAgbWlpXzEwMDB0X2N0cmxfcmVnICY9IH5SRUc5X1NQRUVEX01BU0s7CisJLyogRmlyc3Qgd2UgY2xlYXIgYWxsIHRoZSAxMC8xMDAgbWIgc3BlZWQgYml0cyBpbiB0aGUgQXV0by1OZWcKKwkgKiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyIChBZGRyZXNzIDQpIGFuZCB0aGUgMTAwMCBtYiBzcGVlZCBiaXRzIGluCisJICogdGhlICAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKEFkZHJlc3MgOSkuCisJICovCisJbWlpX2F1dG9uZWdfYWR2X3JlZyAmPSB+UkVHNF9TUEVFRF9NQVNLOworCW1paV8xMDAwdF9jdHJsX3JlZyAmPSB+UkVHOV9TUEVFRF9NQVNLOwogCi0gICAgREVCVUdPVVQxKCJhdXRvbmVnX2FkdmVydGlzZWQgJXhcbiIsIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQpOworCURFQlVHT1VUMSgiYXV0b25lZ19hZHZlcnRpc2VkICV4XG4iLCBody0+YXV0b25lZ19hZHZlcnRpc2VkKTsKIAotICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwIE1iIEhhbGYgRHVwbGV4PyAqLwotICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0hBTEYpIHsKLSAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEhhbGYgZHVwbGV4XG4iKTsKLSAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9IRF9DQVBTOwotICAgIH0KKwkvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMCBNYiBIYWxmIER1cGxleD8gKi8KKwlpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMF9IQUxGKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTBtYiBIYWxmIGR1cGxleFxuIik7CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMFRfSERfQ0FQUzsKKwl9CiAKLSAgICAvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMCBNYiBGdWxsIER1cGxleD8gKi8KLSAgICBpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMF9GVUxMKSB7Ci0gICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTBtYiBGdWxsIGR1cGxleFxuIik7Ci0gICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMFRfRkRfQ0FQUzsKLSAgICB9CisJLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAgTWIgRnVsbCBEdXBsZXg/ICovCisJaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTBfRlVMTCkgeworCQlERUJVR09VVCgiQWR2ZXJ0aXNlIDEwbWIgRnVsbCBkdXBsZXhcbiIpOworCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTBUX0ZEX0NBUFM7CisJfQogCi0gICAgLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwIE1iIEhhbGYgRHVwbGV4PyAqLwotICAgIGlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9IQUxGKSB7Ci0gICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTAwbWIgSGFsZiBkdXBsZXhcbiIpOwotICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTAwVFhfSERfQ0FQUzsKLSAgICB9CisJLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwIE1iIEhhbGYgRHVwbGV4PyAqLworCWlmIChody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9IQUxGKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTAwbWIgSGFsZiBkdXBsZXhcbiIpOworCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTAwVFhfSERfQ0FQUzsKKwl9CiAKLSAgICAvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMDAgTWIgRnVsbCBEdXBsZXg/ICovCi0gICAgaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwX0ZVTEwpIHsKLSAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMDBtYiBGdWxsIGR1cGxleFxuIik7Ci0gICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMDBUWF9GRF9DQVBTOwotICAgIH0KKwkvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMDAgTWIgRnVsbCBEdXBsZXg/ICovCisJaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwX0ZVTEwpIHsKKwkJREVCVUdPVVQoIkFkdmVydGlzZSAxMDBtYiBGdWxsIGR1cGxleFxuIik7CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMDBUWF9GRF9DQVBTOworCX0KIAotICAgIC8qIFdlIGRvIG5vdCBhbGxvdyB0aGUgUGh5IHRvIGFkdmVydGlzZSAxMDAwIE1iIEhhbGYgRHVwbGV4ICovCi0gICAgaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwMF9IQUxGKSB7Ci0gICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTAwMG1iIEhhbGYgZHVwbGV4IHJlcXVlc3RlZCwgcmVxdWVzdCBkZW5pZWQhXG4iKTsKLSAgICB9CisJLyogV2UgZG8gbm90IGFsbG93IHRoZSBQaHkgdG8gYWR2ZXJ0aXNlIDEwMDAgTWIgSGFsZiBEdXBsZXggKi8KKwlpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDAwX0hBTEYpIHsKKwkJREVCVUdPVVQKKwkJICAgICgiQWR2ZXJ0aXNlIDEwMDBtYiBIYWxmIGR1cGxleCByZXF1ZXN0ZWQsIHJlcXVlc3QgZGVuaWVkIVxuIik7CisJfQogCi0gICAgLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwMCBNYiBGdWxsIER1cGxleD8gKi8KLSAgICBpZiAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDAwX0ZVTEwpIHsKLSAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMDAwbWIgRnVsbCBkdXBsZXhcbiIpOwotICAgICAgICBtaWlfMTAwMHRfY3RybF9yZWcgfD0gQ1JfMTAwMFRfRkRfQ0FQUzsKLSAgICAgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7Ci0gICAgICAgICAgICBERUJVR09VVCgiZTEwMDBfcGh5X2lmZSBpcyBhIDEwLzEwMCBQSFkuIEdpZ2FiaXQgc3BlZWQgaXMgbm90IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICB9Ci0gICAgfQorCS8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMDAgTWIgRnVsbCBEdXBsZXg/ICovCisJaWYgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwMF9GVUxMKSB7CisJCURFQlVHT1VUKCJBZHZlcnRpc2UgMTAwMG1iIEZ1bGwgZHVwbGV4XG4iKTsKKwkJbWlpXzEwMDB0X2N0cmxfcmVnIHw9IENSXzEwMDBUX0ZEX0NBUFM7CisJfQogCi0gICAgLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kCi0gICAgICogc2V0dXAgdGhlIFBIWSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyBhY2NvcmRpbmdseS4gIElmCi0gICAgICogYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGVuIHNvZnR3YXJlIHdpbGwgaGF2ZSB0byBzZXQgdGhlCi0gICAgICogIlBBVVNFIiBiaXRzIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZSBBdXRvLU5lZ290aWF0aW9uCi0gICAgICogQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoUEhZX0FVVE9ORUdfQURWKSBhbmQgcmUtc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4KLSAgICAgKgotICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlICJmYyIgcGFyYW1ldGVyIGFyZToKLSAgICAgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAotICAgICAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMKLSAgICAgKiAgICAgICAgICBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KLSAgICAgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCi0gICAgICogICAgICAgICAgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgotICAgICAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KLSAgICAgKiAgb3RoZXI6ICBObyBzb2Z0d2FyZSBvdmVycmlkZS4gIFRoZSBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbgotICAgICAqICAgICAgICAgIGluIHRoZSBFRVBST00gaXMgdXNlZC4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKGh3LT5mYykgewotICAgIGNhc2UgRTEwMDBfRkNfTk9ORTogLyogMCAqLwotICAgICAgICAvKiBGbG93IGNvbnRyb2wgKFJYICYgVFgpIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYQotICAgICAgICAgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCi0gICAgICAgICAqLwotICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnICY9IH4oTldBWV9BUl9BU01fRElSIHwgTldBWV9BUl9QQVVTRSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRTEwMDBfRkNfUlhfUEFVU0U6IC8qIDEgKi8KLSAgICAgICAgLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsIGFuZCBUWCBGbG93IGNvbnRyb2wgaXMKLSAgICAgICAgICogZGlzYWJsZWQsIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLgotICAgICAgICAgKi8KLSAgICAgICAgLyogU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZSB0aGF0IHdlIGFyZQotICAgICAgICAgKiBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKLSAgICAgICAgICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gIExhdGVyCi0gICAgICAgICAqIChpbiBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cCkgd2Ugd2lsbCBkaXNhYmxlIHRoZQotICAgICAgICAgKmh3J3MgYWJpbGl0eSB0byBzZW5kIFBBVVNFIGZyYW1lcy4KLSAgICAgICAgICovCi0gICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEUxMDAwX0ZDX1RYX1BBVVNFOiAvKiAyICovCi0gICAgICAgIC8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzCi0gICAgICAgICAqIGRpc2FibGVkLCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4KLSAgICAgICAgICovCi0gICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl9BU01fRElSOwotICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnICY9IH5OV0FZX0FSX1BBVVNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEUxMDAwX0ZDX0ZVTEw6IC8qIDMgKi8KLSAgICAgICAgLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlCi0gICAgICAgICAqIG92ZXItcmlkZS4KLSAgICAgICAgICovCi0gICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKLSAgICB9CisJLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kCisJICogc2V0dXAgdGhlIFBIWSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyBhY2NvcmRpbmdseS4gIElmCisJICogYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGVuIHNvZnR3YXJlIHdpbGwgaGF2ZSB0byBzZXQgdGhlCisJICogIlBBVVNFIiBiaXRzIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZSBBdXRvLU5lZ290aWF0aW9uCisJICogQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoUEhZX0FVVE9ORUdfQURWKSBhbmQgcmUtc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4KKwkgKgorCSAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlICJmYyIgcGFyYW1ldGVyIGFyZToKKwkgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAorCSAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMKKwkgKiAgICAgICAgICBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCisJICogICAgICAgICAgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKwkgKiAgb3RoZXI6ICBObyBzb2Z0d2FyZSBvdmVycmlkZS4gIFRoZSBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbgorCSAqICAgICAgICAgIGluIHRoZSBFRVBST00gaXMgdXNlZC4KKwkgKi8KKwlzd2l0Y2ggKGh3LT5mYykgeworCWNhc2UgRTEwMDBfRkNfTk9ORToJLyogMCAqLworCQkvKiBGbG93IGNvbnRyb2wgKFJYICYgVFgpIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYQorCQkgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisJCSAqLworCQltaWlfYXV0b25lZ19hZHZfcmVnICY9IH4oTldBWV9BUl9BU01fRElSIHwgTldBWV9BUl9QQVVTRSk7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfRkNfUlhfUEFVU0U6CS8qIDEgKi8KKwkJLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsIGFuZCBUWCBGbG93IGNvbnRyb2wgaXMKKwkJICogZGlzYWJsZWQsIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLgorCQkgKi8KKwkJLyogU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZSB0aGF0IHdlIGFyZQorCQkgKiBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKKwkJICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gIExhdGVyCisJCSAqIChpbiBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cCkgd2Ugd2lsbCBkaXNhYmxlIHRoZQorCQkgKmh3J3MgYWJpbGl0eSB0byBzZW5kIFBBVVNFIGZyYW1lcy4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworCQlicmVhazsKKwljYXNlIEUxMDAwX0ZDX1RYX1BBVVNFOgkvKiAyICovCisJCS8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzCisJCSAqIGRpc2FibGVkLCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl9BU01fRElSOworCQltaWlfYXV0b25lZ19hZHZfcmVnICY9IH5OV0FZX0FSX1BBVVNFOworCQlicmVhazsKKwljYXNlIEUxMDAwX0ZDX0ZVTEw6CS8qIDMgKi8KKwkJLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlCisJCSAqIG92ZXItcmlkZS4KKwkJICovCisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CiAKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLCBtaWlfYXV0b25lZ19hZHZfcmVnKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9BVVRPTkVHX0FEViwgbWlpX2F1dG9uZWdfYWR2X3JlZyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgREVCVUdPVVQxKCJBdXRvLU5lZyBBZHZlcnRpc2luZyAleFxuIiwgbWlpX2F1dG9uZWdfYWR2X3JlZyk7CisJREVCVUdPVVQxKCJBdXRvLU5lZyBBZHZlcnRpc2luZyAleFxuIiwgbWlpX2F1dG9uZWdfYWR2X3JlZyk7CiAKLSAgICBpZiAoaHctPnBoeV90eXBlICE9IGUxMDAwX3BoeV9pZmUpIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBtaWlfMTAwMHRfY3RybF9yZWcpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIH0KKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIG1paV8xMDAwdF9jdHJsX3JlZyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRm9yY2UgUEhZIHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3MgdG8gaHctPmZvcmNlZF9zcGVlZF9kdXBsZXgKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleCAtIGZvcmNlIGxpbmsgc2V0dGluZ3MKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogRm9yY2UgUEhZIHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3MgdG8gaHctPmZvcmNlZF9zcGVlZF9kdXBsZXgKKyAqLwogc3RhdGljIHMzMiBlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIGN0cmw7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IG1paV9jdHJsX3JlZzsKLSAgICB1MTYgbWlpX3N0YXR1c19yZWc7Ci0gICAgdTE2IHBoeV9kYXRhOwotICAgIHUxNiBpOworCXUzMiBjdHJsOworCXMzMiByZXRfdmFsOworCXUxNiBtaWlfY3RybF9yZWc7CisJdTE2IG1paV9zdGF0dXNfcmVnOworCXUxNiBwaHlfZGF0YTsKKwl1MTYgaTsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleCIpOworCURFQlVHRlVOQygiZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleCIpOwogCi0gICAgLyogVHVybiBvZmYgRmxvdyBjb250cm9sIGlmIHdlIGFyZSBmb3JjaW5nIHNwZWVkIGFuZCBkdXBsZXguICovCi0gICAgaHctPmZjID0gRTEwMDBfRkNfTk9ORTsKKwkvKiBUdXJuIG9mZiBGbG93IGNvbnRyb2wgaWYgd2UgYXJlIGZvcmNpbmcgc3BlZWQgYW5kIGR1cGxleC4gKi8KKwlody0+ZmMgPSBFMTAwMF9GQ19OT05FOwogCi0gICAgREVCVUdPVVQxKCJody0+ZmMgPSAlZFxuIiwgaHctPmZjKTsKKwlERUJVR09VVDEoImh3LT5mYyA9ICVkXG4iLCBody0+ZmMpOwogCi0gICAgLyogUmVhZCB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIuICovCi0gICAgY3RybCA9IGVyMzIoQ1RSTCk7CisJLyogUmVhZCB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIuICovCisJY3RybCA9IGVyMzIoQ1RSTCk7CiAKLSAgICAvKiBTZXQgdGhlIGJpdHMgdG8gRm9yY2UgU3BlZWQgYW5kIER1cGxleCBpbiB0aGUgRGV2aWNlIEN0cmwgUmVnLiAqLwotICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFgpOwotICAgIGN0cmwgJj0gfihERVZJQ0VfU1BFRURfTUFTSyk7CisJLyogU2V0IHRoZSBiaXRzIHRvIEZvcmNlIFNwZWVkIGFuZCBEdXBsZXggaW4gdGhlIERldmljZSBDdHJsIFJlZy4gKi8KKwljdHJsIHw9IChFMTAwMF9DVFJMX0ZSQ1NQRCB8IEUxMDAwX0NUUkxfRlJDRFBYKTsKKwljdHJsICY9IH4oREVWSUNFX1NQRUVEX01BU0spOwogCi0gICAgLyogQ2xlYXIgdGhlIEF1dG8gU3BlZWQgRGV0ZWN0IEVuYWJsZSBiaXQuICovCi0gICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9BU0RFOworCS8qIENsZWFyIHRoZSBBdXRvIFNwZWVkIERldGVjdCBFbmFibGUgYml0LiAqLworCWN0cmwgJj0gfkUxMDAwX0NUUkxfQVNERTsKIAotICAgIC8qIFJlYWQgdGhlIE1JSSBDb250cm9sIFJlZ2lzdGVyLiAqLwotICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmbWlpX2N0cmxfcmVnKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJLyogUmVhZCB0aGUgTUlJIENvbnRyb2wgUmVnaXN0ZXIuICovCisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZtaWlfY3RybF9yZWcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIC8qIFdlIG5lZWQgdG8gZGlzYWJsZSBhdXRvbmVnIGluIG9yZGVyIHRvIGZvcmNlIGxpbmsgYW5kIGR1cGxleC4gKi8KKwkvKiBXZSBuZWVkIHRvIGRpc2FibGUgYXV0b25lZyBpbiBvcmRlciB0byBmb3JjZSBsaW5rIGFuZCBkdXBsZXguICovCiAKLSAgICBtaWlfY3RybF9yZWcgJj0gfk1JSV9DUl9BVVRPX05FR19FTjsKKwltaWlfY3RybF9yZWcgJj0gfk1JSV9DUl9BVVRPX05FR19FTjsKIAotICAgIC8qIEFyZSB3ZSBmb3JjaW5nIEZ1bGwgb3IgSGFsZiBEdXBsZXg/ICovCi0gICAgaWYgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9mdWxsIHx8Ci0gICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwpIHsKLSAgICAgICAgLyogV2Ugd2FudCB0byBmb3JjZSBmdWxsIGR1cGxleCBzbyB3ZSBTRVQgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4gdGhlCi0gICAgICAgICAqIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgotICAgICAgICAgKi8KLSAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX0ZEOwotICAgICAgICBtaWlfY3RybF9yZWcgfD0gTUlJX0NSX0ZVTExfRFVQTEVYOwotICAgICAgICBERUJVR09VVCgiRnVsbCBEdXBsZXhcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFdlIHdhbnQgdG8gZm9yY2UgaGFsZiBkdXBsZXggc28gd2UgQ0xFQVIgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4KLSAgICAgICAgICogdGhlIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgotICAgICAgICAgKi8KLSAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9GRDsKLSAgICAgICAgbWlpX2N0cmxfcmVnICY9IH5NSUlfQ1JfRlVMTF9EVVBMRVg7Ci0gICAgICAgIERFQlVHT1VUKCJIYWxmIER1cGxleFxuIik7Ci0gICAgfQorCS8qIEFyZSB3ZSBmb3JjaW5nIEZ1bGwgb3IgSGFsZiBEdXBsZXg/ICovCisJaWYgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9mdWxsIHx8CisJICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwpIHsKKwkJLyogV2Ugd2FudCB0byBmb3JjZSBmdWxsIGR1cGxleCBzbyB3ZSBTRVQgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4gdGhlCisJCSAqIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgorCQkgKi8KKwkJY3RybCB8PSBFMTAwMF9DVFJMX0ZEOworCQltaWlfY3RybF9yZWcgfD0gTUlJX0NSX0ZVTExfRFVQTEVYOworCQlERUJVR09VVCgiRnVsbCBEdXBsZXhcbiIpOworCX0gZWxzZSB7CisJCS8qIFdlIHdhbnQgdG8gZm9yY2UgaGFsZiBkdXBsZXggc28gd2UgQ0xFQVIgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4KKwkJICogdGhlIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgorCQkgKi8KKwkJY3RybCAmPSB+RTEwMDBfQ1RSTF9GRDsKKwkJbWlpX2N0cmxfcmVnICY9IH5NSUlfQ1JfRlVMTF9EVVBMRVg7CisJCURFQlVHT1VUKCJIYWxmIER1cGxleFxuIik7CisJfQogCi0gICAgLyogQXJlIHdlIGZvcmNpbmcgMTAwTWJwcz8/PyAqLwotICAgIGlmIChody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMDBfZnVsbCB8fAotICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9oYWxmKSB7Ci0gICAgICAgIC8qIFNldCB0aGUgMTAwTWIgYml0IGFuZCB0dXJuIG9mZiB0aGUgMTAwME1iIGFuZCAxME1iIGJpdHMuICovCi0gICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwOwotICAgICAgICBtaWlfY3RybF9yZWcgfD0gTUlJX0NSX1NQRUVEXzEwMDsKLSAgICAgICAgbWlpX2N0cmxfcmVnICY9IH4oTUlJX0NSX1NQRUVEXzEwMDAgfCBNSUlfQ1JfU1BFRURfMTApOwotICAgICAgICBERUJVR09VVCgiRm9yY2luZyAxMDBtYiAiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBTZXQgdGhlIDEwTWIgYml0IGFuZCB0dXJuIG9mZiB0aGUgMTAwME1iIGFuZCAxMDBNYiBiaXRzLiAqLwotICAgICAgICBjdHJsICY9IH4oRTEwMDBfQ1RSTF9TUERfMTAwMCB8IEUxMDAwX0NUUkxfU1BEXzEwMCk7Ci0gICAgICAgIG1paV9jdHJsX3JlZyB8PSBNSUlfQ1JfU1BFRURfMTA7Ci0gICAgICAgIG1paV9jdHJsX3JlZyAmPSB+KE1JSV9DUl9TUEVFRF8xMDAwIHwgTUlJX0NSX1NQRUVEXzEwMCk7Ci0gICAgICAgIERFQlVHT1VUKCJGb3JjaW5nIDEwbWIgIik7Ci0gICAgfQorCS8qIEFyZSB3ZSBmb3JjaW5nIDEwME1icHM/Pz8gKi8KKwlpZiAoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTAwX2Z1bGwgfHwKKwkgICAgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTAwX2hhbGYpIHsKKwkJLyogU2V0IHRoZSAxMDBNYiBiaXQgYW5kIHR1cm4gb2ZmIHRoZSAxMDAwTWIgYW5kIDEwTWIgYml0cy4gKi8KKwkJY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDA7CisJCW1paV9jdHJsX3JlZyB8PSBNSUlfQ1JfU1BFRURfMTAwOworCQltaWlfY3RybF9yZWcgJj0gfihNSUlfQ1JfU1BFRURfMTAwMCB8IE1JSV9DUl9TUEVFRF8xMCk7CisJCURFQlVHT1VUKCJGb3JjaW5nIDEwMG1iICIpOworCX0gZWxzZSB7CisJCS8qIFNldCB0aGUgMTBNYiBiaXQgYW5kIHR1cm4gb2ZmIHRoZSAxMDAwTWIgYW5kIDEwME1iIGJpdHMuICovCisJCWN0cmwgJj0gfihFMTAwMF9DVFJMX1NQRF8xMDAwIHwgRTEwMDBfQ1RSTF9TUERfMTAwKTsKKwkJbWlpX2N0cmxfcmVnIHw9IE1JSV9DUl9TUEVFRF8xMDsKKwkJbWlpX2N0cmxfcmVnICY9IH4oTUlJX0NSX1NQRUVEXzEwMDAgfCBNSUlfQ1JfU1BFRURfMTAwKTsKKwkJREVCVUdPVVQoIkZvcmNpbmcgMTBtYiAiKTsKKwl9CiAKLSAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCWUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CiAKLSAgICAvKiBXcml0ZSB0aGUgY29uZmlndXJlZCB2YWx1ZXMgYmFjayB0byB0aGUgRGV2aWNlIENvbnRyb2wgUmVnLiAqLwotICAgIGV3MzIoQ1RSTCwgY3RybCk7CisJLyogV3JpdGUgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGJhY2sgdG8gdGhlIERldmljZSBDb250cm9sIFJlZy4gKi8KKwlldzMyKENUUkwsIGN0cmwpOwogCi0gICAgaWYgKChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgfHwKLSAgICAgICAgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykpIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKwkJcmV0X3ZhbCA9CisJCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgLyogQ2xlYXIgQXV0by1Dcm9zc292ZXIgdG8gZm9yY2UgTURJIG1hbnVhbGx5LiBNODhFMTAwMCByZXF1aXJlcyBNREkKLSAgICAgICAgICogZm9yY2VkIHdoZW5ldmVyIHNwZWVkIGFyZSBkdXBsZXggYXJlIGZvcmNlZC4KLSAgICAgICAgICovCi0gICAgICAgIHBoeV9kYXRhICY9IH5NODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkvKiBDbGVhciBBdXRvLUNyb3Nzb3ZlciB0byBmb3JjZSBNREkgbWFudWFsbHkuIE04OEUxMDAwIHJlcXVpcmVzIE1ESQorCQkgKiBmb3JjZWQgd2hlbmV2ZXIgc3BlZWQgYXJlIGR1cGxleCBhcmUgZm9yY2VkLgorCQkgKi8KKwkJcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfQVVUT19YX01PREU7CisJCXJldF92YWwgPQorCQkgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgIERFQlVHT1VUMSgiTTg4RTEwMDAgUFNDUjogJXggXG4iLCBwaHlfZGF0YSk7CisJCURFQlVHT1VUMSgiTTg4RTEwMDAgUFNDUjogJXggXG4iLCBwaHlfZGF0YSk7CiAKLSAgICAgICAgLyogTmVlZCB0byByZXNldCB0aGUgUEhZIG9yIHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBpZ25vcmVkICovCi0gICAgICAgIG1paV9jdHJsX3JlZyB8PSBNSUlfQ1JfUkVTRVQ7CisJCS8qIE5lZWQgdG8gcmVzZXQgdGhlIFBIWSBvciB0aGVzZSBjaGFuZ2VzIHdpbGwgYmUgaWdub3JlZCAqLworCQltaWlfY3RybF9yZWcgfD0gTUlJX0NSX1JFU0VUOwogCi0gICAgLyogRGlzYWJsZSBNREktWCBzdXBwb3J0IGZvciAxMC8xMDAgKi8KLSAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElGRV9QSFlfTURJWF9DT05UUk9MLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkvKiBEaXNhYmxlIE1ESS1YIHN1cHBvcnQgZm9yIDEwLzEwMCAqLworCX0gZWxzZSB7CisJCS8qIENsZWFyIEF1dG8tQ3Jvc3NvdmVyIHRvIGZvcmNlIE1ESSBtYW51YWxseS4gIElHUCByZXF1aXJlcyBNREkKKwkJICogZm9yY2VkIHdoZW5ldmVyIHNwZWVkIG9yIGR1cGxleCBhcmUgZm9yY2VkLgorCQkgKi8KKwkJcmV0X3ZhbCA9CisJCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgJnBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBwaHlfZGF0YSAmPSB+SUZFX1BNQ19BVVRPX01ESVg7Ci0gICAgICAgIHBoeV9kYXRhICY9IH5JRkVfUE1DX0ZPUkNFX01ESVg7CisJCXBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworCQlwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYOwogCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJRkVfUEhZX01ESVhfQ09OVFJPTCwgcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0KKwkJICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgcGh5X2RhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCX0KIAotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIENsZWFyIEF1dG8tQ3Jvc3NvdmVyIHRvIGZvcmNlIE1ESSBtYW51YWxseS4gIElHUCByZXF1aXJlcyBNREkKLSAgICAgICAgICogZm9yY2VkIHdoZW5ldmVyIHNwZWVkIG9yIGR1cGxleCBhcmUgZm9yY2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCS8qIFdyaXRlIGJhY2sgdGhlIG1vZGlmaWVkIFBIWSBNSUkgY29udHJvbCByZWdpc3Rlci4gKi8KKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIG1paV9jdHJsX3JlZyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOwotICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYOworCXVkZWxheSgxKTsKIAotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLCBwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQorCS8qIFRoZSB3YWl0X2F1dG9uZWdfY29tcGxldGUgZmxhZyBtYXkgYmUgYSBsaXR0bGUgbWlzbGVhZGluZyBoZXJlLgorCSAqIFNpbmNlIHdlIGFyZSBmb3JjaW5nIHNwZWVkIGFuZCBkdXBsZXgsIEF1dG8tTmVnIGlzIG5vdCBlbmFibGVkLgorCSAqIEJ1dCB3ZSBkbyB3YW50IHRvIGRlbGF5IGZvciBhIHBlcmlvZCB3aGlsZSBmb3JjaW5nIG9ubHkgc28gd2UKKwkgKiBkb24ndCBnZW5lcmF0ZSBmYWxzZSBObyBMaW5rIG1lc3NhZ2VzLiAgU28gd2Ugd2lsbCB3YWl0IGhlcmUKKwkgKiBvbmx5IGlmIHRoZSB1c2VyIGhhcyBzZXQgd2FpdF9hdXRvbmVnX2NvbXBsZXRlIHRvIDEsIHdoaWNoIGlzCisJICogdGhlIGRlZmF1bHQuCisJICovCisJaWYgKGh3LT53YWl0X2F1dG9uZWdfY29tcGxldGUpIHsKKwkJLyogV2Ugd2lsbCB3YWl0IGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlLiAqLworCQlERUJVR09VVCgiV2FpdGluZyBmb3IgZm9yY2VkIHNwZWVkL2R1cGxleCBsaW5rLlxuIik7CisJCW1paV9zdGF0dXNfcmVnID0gMDsKIAotICAgIC8qIFdyaXRlIGJhY2sgdGhlIG1vZGlmaWVkIFBIWSBNSUkgY29udHJvbCByZWdpc3Rlci4gKi8KLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIG1paV9jdHJsX3JlZyk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCQkvKiBXZSB3aWxsIHdhaXQgZm9yIGF1dG9uZWcgdG8gY29tcGxldGUgb3IgNC41IHNlY29uZHMgdG8gZXhwaXJlLiAqLworCQlmb3IgKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgeworCQkJLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgQXV0by1OZWcgQ29tcGxldGUgYml0CisJCQkgKiB0byBiZSBzZXQuCisJCQkgKi8KKwkJCXJldF92YWwgPQorCQkJICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOwogCi0gICAgdWRlbGF5KDEpOworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAvKiBUaGUgd2FpdF9hdXRvbmVnX2NvbXBsZXRlIGZsYWcgbWF5IGJlIGEgbGl0dGxlIG1pc2xlYWRpbmcgaGVyZS4KLSAgICAgKiBTaW5jZSB3ZSBhcmUgZm9yY2luZyBzcGVlZCBhbmQgZHVwbGV4LCBBdXRvLU5lZyBpcyBub3QgZW5hYmxlZC4KLSAgICAgKiBCdXQgd2UgZG8gd2FudCB0byBkZWxheSBmb3IgYSBwZXJpb2Qgd2hpbGUgZm9yY2luZyBvbmx5IHNvIHdlCi0gICAgICogZG9uJ3QgZ2VuZXJhdGUgZmFsc2UgTm8gTGluayBtZXNzYWdlcy4gIFNvIHdlIHdpbGwgd2FpdCBoZXJlCi0gICAgICogb25seSBpZiB0aGUgdXNlciBoYXMgc2V0IHdhaXRfYXV0b25lZ19jb21wbGV0ZSB0byAxLCB3aGljaCBpcwotICAgICAqIHRoZSBkZWZhdWx0LgotICAgICAqLwotICAgIGlmIChody0+d2FpdF9hdXRvbmVnX2NvbXBsZXRlKSB7Ci0gICAgICAgIC8qIFdlIHdpbGwgd2FpdCBmb3IgYXV0b25lZyB0byBjb21wbGV0ZS4gKi8KLSAgICAgICAgREVCVUdPVVQoIldhaXRpbmcgZm9yIGZvcmNlZCBzcGVlZC9kdXBsZXggbGluay5cbiIpOwotICAgICAgICBtaWlfc3RhdHVzX3JlZyA9IDA7CisJCQlpZiAobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfTElOS19TVEFUVVMpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMTAwKTsKKwkJfQorCQlpZiAoKGkgPT0gMCkgJiYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSkgeworCQkJLyogV2UgZGlkbid0IGdldCBsaW5rLiAgUmVzZXQgdGhlIERTUCBhbmQgd2FpdCBhZ2FpbiBmb3IgbGluay4gKi8KKwkJCXJldF92YWwgPSBlMTAwMF9waHlfcmVzZXRfZHNwKGh3KTsKKwkJCWlmIChyZXRfdmFsKSB7CisJCQkJREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyBQSFkgRFNQXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKwkJfQorCQkvKiBUaGlzIGxvb3Agd2lsbCBlYXJseS1vdXQgaWYgdGhlIGxpbmsgY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gICovCisJCWZvciAoaSA9IFBIWV9GT1JDRV9USU1FOyBpID4gMDsgaS0tKSB7CisJCQlpZiAobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfTElOS19TVEFUVVMpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMTAwKTsKKwkJCS8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnIENvbXBsZXRlIGJpdAorCQkJICogdG8gYmUgc2V0LgorCQkJICovCisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAvKiBXZSB3aWxsIHdhaXQgZm9yIGF1dG9uZWcgdG8gY29tcGxldGUgb3IgNC41IHNlY29uZHMgdG8gZXhwaXJlLiAqLwotICAgICAgICBmb3IgKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgewotICAgICAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgQXV0by1OZWcgQ29tcGxldGUgYml0Ci0gICAgICAgICAgICAgKiB0byBiZSBzZXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkJCXJldF92YWwgPQorCQkJICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQogCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisJCS8qIEJlY2F1c2Ugd2UgcmVzZXQgdGhlIFBIWSBhYm92ZSwgd2UgbmVlZCB0byByZS1mb3JjZSBUWF9DTEsgaW4gdGhlCisJCSAqIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyIHRvIDI1TUh6IGNsb2NrLiAgVGhpcyB2YWx1ZQorCQkgKiBkZWZhdWx0cyBiYWNrIHRvIGEgMi41TUh6IGNsb2NrIHdoZW4gdGhlIFBIWSBpcyByZXNldC4KKwkJICovCisJCXJldF92YWwgPQorCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwKKwkJCQkgICAgICAgJnBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgaWYgKG1paV9zdGF0dXNfcmVnICYgTUlJX1NSX0xJTktfU1RBVFVTKSBicmVhazsKLSAgICAgICAgICAgIG1zbGVlcCgxMDApOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoaSA9PSAwKSAmJgotICAgICAgICAgICAoKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB8fAotICAgICAgICAgICAgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykpKSB7Ci0gICAgICAgICAgICAvKiBXZSBkaWRuJ3QgZ2V0IGxpbmsuICBSZXNldCB0aGUgRFNQIGFuZCB3YWl0IGFnYWluIGZvciBsaW5rLiAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldF9kc3AoaHcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIFBIWSBEU1BcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFRoaXMgbG9vcCB3aWxsIGVhcmx5LW91dCBpZiB0aGUgbGluayBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAgKi8KLSAgICAgICAgZm9yIChpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7Ci0gICAgICAgICAgICBtc2xlZXAoMTAwKTsKLSAgICAgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnIENvbXBsZXRlIGJpdAotICAgICAgICAgICAgICogdG8gYmUgc2V0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCXBoeV9kYXRhIHw9IE04OEUxMDAwX0VQU0NSX1RYX0NMS18yNTsKKwkJcmV0X3ZhbCA9CisJCSAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwKKwkJCQkJcGh5X2RhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0KLSAgICB9CisJCS8qIEluIGFkZGl0aW9uLCBiZWNhdXNlIG9mIHRoZSBzL3cgcmVzZXQgYWJvdmUsIHdlIG5lZWQgdG8gZW5hYmxlIENSUyBvbgorCQkgKiBUWC4gIFRoaXMgbXVzdCBiZSBzZXQgZm9yIGJvdGggZnVsbCBhbmQgaGFsZiBkdXBsZXggb3BlcmF0aW9uLgorCQkgKi8KKwkJcmV0X3ZhbCA9CisJCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKLSAgICAgICAgLyogQmVjYXVzZSB3ZSByZXNldCB0aGUgUEhZIGFib3ZlLCB3ZSBuZWVkIHRvIHJlLWZvcmNlIFRYX0NMSyBpbiB0aGUKLSAgICAgICAgICogRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgdG8gMjVNSHogY2xvY2suICBUaGlzIHZhbHVlCi0gICAgICAgICAqIGRlZmF1bHRzIGJhY2sgdG8gYSAyLjVNSHogY2xvY2sgd2hlbiB0aGUgUEhZIGlzIHJlc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCXBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWDsKKwkJcmV0X3ZhbCA9CisJCSAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1OwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICAvKiBJbiBhZGRpdGlvbiwgYmVjYXVzZSBvZiB0aGUgcy93IHJlc2V0IGFib3ZlLCB3ZSBuZWVkIHRvIGVuYWJsZSBDUlMgb24KLSAgICAgICAgICogVFguICBUaGlzIG11c3QgYmUgc2V0IGZvciBib3RoIGZ1bGwgYW5kIGhhbGYgZHVwbGV4IG9wZXJhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BU1NFUlRfQ1JTX09OX1RYOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgJiYKLSAgICAgICAgICAgICghaHctPmF1dG9uZWcpICYmIChody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9mdWxsIHx8Ci0gICAgICAgICAgICAgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpIHsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKGh3KTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpIHsKLSAgICAgICAgLyogVGhlIFRYX0NMSyBvZiB0aGUgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgZGVmYXVsdHMKLSAgICAgICAgICogdG8gMi41TUh6IG9uIGEgcmVzZXQuICBXZSBuZWVkIHRvIHJlLWZvcmNlIGl0IGJhY2sgdG8gMjVNSHosIGlmCi0gICAgICAgICAqIHdlJ3JlIG5vdCBpbiBhIGZvcmNlZCAxMC9kdXBsZXggY29uZmlndXJhdGlvbi4gKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfTUFDX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICBwaHlfZGF0YSAmPSB+R0c4MjU2M19NU0NSX1RYX0NMS19NQVNLOwotICAgICAgICBpZiAoKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwpIHx8Ci0gICAgICAgICAgICAoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpCi0gICAgICAgICAgICBwaHlfZGF0YSB8PSBHRzgyNTYzX01TQ1JfVFhfQ0xLXzEwTUJQU18yXzVNSFo7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBoeV9kYXRhIHw9IEdHODI1NjNfTVNDUl9UWF9DTEtfMTAwTUJQU18yNU1IWjsKLQotICAgICAgICAvKiBBbHNvIGR1ZSB0byB0aGUgcmVzZXQsIHdlIG5lZWQgdG8gZW5hYmxlIENSUyBvbiBUeC4gKi8KLSAgICAgICAgcGh5X2RhdGEgfD0gR0c4MjU2M19NU0NSX0FTU0VSVF9DUlNfT05fVFg7Ci0KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIEdHODI1NjNfUEhZX01BQ19TUEVDX0NUUkwsIHBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9Ci0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJCWlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykKKwkJICAgICYmICghaHctPmF1dG9uZWcpCisJCSAgICAmJiAoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfZnVsbAorCQkJfHwgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpIHsKKwkJCXJldF92YWwgPSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKGh3KTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQorCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFNldHMgdGhlIGNvbGxpc2lvbiBkaXN0YW5jZSBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCByZWdpc3RlcgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKgotKiBMaW5rIHNob3VsZCBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgcHJldmlvdXNseS4gUmVhZHMgdGhlIHNwZWVkIGFuZCBkdXBsZXgKLSogaW5mb3JtYXRpb24gZnJvbSB0aGUgRGV2aWNlIFN0YXR1cyByZWdpc3Rlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0IC0gc2V0IGNvbGxpc2lvbiBkaXN0YW5jZSByZWdpc3RlcgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBTZXRzIHRoZSBjb2xsaXNpb24gZGlzdGFuY2UgaW4gdGhlIFRyYW5zbWl0IENvbnRyb2wgcmVnaXN0ZXIuCisgKiBMaW5rIHNob3VsZCBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgcHJldmlvdXNseS4gUmVhZHMgdGhlIHNwZWVkIGFuZCBkdXBsZXgKKyAqIGluZm9ybWF0aW9uIGZyb20gdGhlIERldmljZSBTdGF0dXMgcmVnaXN0ZXIuCisgKi8KIHZvaWQgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIHRjdGwsIGNvbGxfZGlzdDsKKwl1MzIgdGN0bCwgY29sbF9kaXN0OwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QiKTsKKwlERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdCIpOwogCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKQotICAgICAgICBjb2xsX2Rpc3QgPSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0VfODI1NDI7Ci0gICAgZWxzZQotICAgICAgICBjb2xsX2Rpc3QgPSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0U7CisJaWYgKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKQorCQljb2xsX2Rpc3QgPSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0VfODI1NDI7CisJZWxzZQorCQljb2xsX2Rpc3QgPSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0U7CiAKLSAgICB0Y3RsID0gZXIzMihUQ1RMKTsKKwl0Y3RsID0gZXIzMihUQ1RMKTsKIAotICAgIHRjdGwgJj0gfkUxMDAwX1RDVExfQ09MRDsKLSAgICB0Y3RsIHw9IGNvbGxfZGlzdCA8PCBFMTAwMF9DT0xEX1NISUZUOworCXRjdGwgJj0gfkUxMDAwX1RDVExfQ09MRDsKKwl0Y3RsIHw9IGNvbGxfZGlzdCA8PCBFMTAwMF9DT0xEX1NISUZUOwogCi0gICAgZXczMihUQ1RMLCB0Y3RsKTsKLSAgICBFMTAwMF9XUklURV9GTFVTSCgpOworCWV3MzIoVENUTCwgdGN0bCk7CisJRTEwMDBfV1JJVEVfRkxVU0goKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBTZXRzIE1BQyBzcGVlZCBhbmQgZHVwbGV4IHNldHRpbmdzIHRvIHJlZmxlY3QgdGhlIHRob3NlIGluIHRoZSBQSFkKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSogbWlpX3JlZyAtIGRhdGEgdG8gd3JpdGUgdG8gdGhlIE1JSSBjb250cm9sIHJlZ2lzdGVyCi0qCi0qIFRoZSBjb250ZW50cyBvZiB0aGUgUEhZIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBuZWVkIHRvCi0qIGJlIHBhc3NlZCBpbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfY29uZmlnX21hY190b19waHkgLSBzeW5jIHBoeSBhbmQgbWFjIHNldHRpbmdzCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQG1paV9yZWc6IGRhdGEgdG8gd3JpdGUgdG8gdGhlIE1JSSBjb250cm9sIHJlZ2lzdGVyCisgKgorICogU2V0cyBNQUMgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncyB0byByZWZsZWN0IHRoZSB0aG9zZSBpbiB0aGUgUEhZCisgKiBUaGUgY29udGVudHMgb2YgdGhlIFBIWSByZWdpc3RlciBjb250YWluaW5nIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24gbmVlZCB0bworICogYmUgcGFzc2VkIGluLgorICovCiBzdGF0aWMgczMyIGUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIGN0cmw7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHBoeV9kYXRhOworCXUzMiBjdHJsOworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfZGF0YTsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlnX21hY190b19waHkiKTsKKwlERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5Iik7CiAKLSAgICAvKiA4MjU0NCBvciBuZXdlciBNQUMsIEF1dG8gU3BlZWQgRGV0ZWN0aW9uIHRha2VzIGNhcmUgb2YKLSAgICAqIE1BQyBzcGVlZC9kdXBsZXggY29uZmlndXJhdGlvbi4qLwotICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCi0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCS8qIDgyNTQ0IG9yIG5ld2VyIE1BQywgQXV0byBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZgorCSAqIE1BQyBzcGVlZC9kdXBsZXggY29uZmlndXJhdGlvbi4qLworCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCisJCXJldHVybiBFMTAwMF9TVUNDRVNTOwogCi0gICAgLyogUmVhZCB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgYW5kIHNldCB0aGUgYml0cyB0byBGb3JjZSBTcGVlZAotICAgICAqIGFuZCBEdXBsZXguCi0gICAgICovCi0gICAgY3RybCA9IGVyMzIoQ1RSTCk7Ci0gICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCk7Ci0gICAgY3RybCAmPSB+KEUxMDAwX0NUUkxfU1BEX1NFTCB8IEUxMDAwX0NUUkxfSUxPUyk7CisJLyogUmVhZCB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgYW5kIHNldCB0aGUgYml0cyB0byBGb3JjZSBTcGVlZAorCSAqIGFuZCBEdXBsZXguCisJICovCisJY3RybCA9IGVyMzIoQ1RSTCk7CisJY3RybCB8PSAoRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCk7CisJY3RybCAmPSB+KEUxMDAwX0NUUkxfU1BEX1NFTCB8IEUxMDAwX0NUUkxfSUxPUyk7CiAKLSAgICAvKiBTZXQgdXAgZHVwbGV4IGluIHRoZSBEZXZpY2UgQ29udHJvbCBhbmQgVHJhbnNtaXQgQ29udHJvbAotICAgICAqIHJlZ2lzdGVycyBkZXBlbmRpbmcgb24gbmVnb3RpYXRlZCB2YWx1ZXMuCi0gICAgICovCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkvKiBTZXQgdXAgZHVwbGV4IGluIHRoZSBEZXZpY2UgQ29udHJvbCBhbmQgVHJhbnNtaXQgQ29udHJvbAorCSAqIHJlZ2lzdGVycyBkZXBlbmRpbmcgb24gbmVnb3RpYXRlZCB2YWx1ZXMuCisJICovCisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLCAmcGh5X2RhdGEpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIGlmIChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfRFBMWCkKLSAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX0ZEOwotICAgIGVsc2UKLSAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9GRDsKKwlpZiAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RQTFgpCisJCWN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKwllbHNlCisJCWN0cmwgJj0gfkUxMDAwX0NUUkxfRkQ7CiAKLSAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCWUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CiAKLSAgICAvKiBTZXQgdXAgc3BlZWQgaW4gdGhlIERldmljZSBDb250cm9sIHJlZ2lzdGVyIGRlcGVuZGluZyBvbgotICAgICAqIG5lZ290aWF0ZWQgdmFsdWVzLgotICAgICAqLwotICAgIGlmICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwMDBNQlMpCi0gICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwMDsKLSAgICBlbHNlIGlmICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwME1CUykKLSAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDA7CisJLyogU2V0IHVwIHNwZWVkIGluIHRoZSBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBkZXBlbmRpbmcgb24KKwkgKiBuZWdvdGlhdGVkIHZhbHVlcy4KKwkgKi8KKwlpZiAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDAwTUJTKQorCQljdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7CisJZWxzZSBpZiAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDBNQlMpCisJCWN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwOwogCi0gICAgLyogV3JpdGUgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGJhY2sgdG8gdGhlIERldmljZSBDb250cm9sIFJlZy4gKi8KLSAgICBldzMyKENUUkwsIGN0cmwpOwotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCS8qIFdyaXRlIHRoZSBjb25maWd1cmVkIHZhbHVlcyBiYWNrIHRvIHRoZSBEZXZpY2UgQ29udHJvbCBSZWcuICovCisJZXczMihDVFJMLCBjdHJsKTsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqCisgKiBlMTAwMF9mb3JjZV9tYWNfZmMgLSBmb3JjZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgogICogRm9yY2VzIHRoZSBNQUMncyBmbG93IGNvbnRyb2wgc2V0dGluZ3MuCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCiAgKiBTZXRzIHRoZSBURkNFIGFuZCBSRkNFIGJpdHMgaW4gdGhlIGRldmljZSBjb250cm9sIHJlZ2lzdGVyIHRvIHJlZmxlY3QKICAqIHRoZSBhZGFwdGVyIHNldHRpbmdzLiBURkNFIGFuZCBSRkNFIG5lZWQgdG8gYmUgZXhwbGljaXRseSBzZXQgYnkKICAqIHNvZnR3YXJlIHdoZW4gYSBDb3BwZXIgUEhZIGlzIHVzZWQgYmVjYXVzZSBhdXRvbmVnb3RpYXRpb24gaXMgbWFuYWdlZAogICogYnkgdGhlIFBIWSByYXRoZXIgdGhhbiB0aGUgTUFDLiBTb2Z0d2FyZSBtdXN0IGFsc28gY29uZmlndXJlIHRoZXNlCiAgKiBiaXRzIHdoZW4gbGluayBpcyBmb3JjZWQgb24gYSBmaWJlciBjb25uZWN0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzMzIgZTEwMDBfZm9yY2VfbWFjX2ZjKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIGN0cmw7CisJdTMyIGN0cmw7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX2ZvcmNlX21hY19mYyIpOworCURFQlVHRlVOQygiZTEwMDBfZm9yY2VfbWFjX2ZjIik7CiAKLSAgICAvKiBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSAgICBjdHJsID0gZXIzMihDVFJMKTsKKwkvKiBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwljdHJsID0gZXIzMihDVFJMKTsKIAotICAgIC8qIEJlY2F1c2Ugd2UgZGlkbid0IGdldCBsaW5rIHZpYSB0aGUgaW50ZXJuYWwgYXV0by1uZWdvdGlhdGlvbgotICAgICAqIG1lY2hhbmlzbSAod2UgZWl0aGVyIGZvcmNlZCBsaW5rIG9yIHdlIGdvdCBsaW5rIHZpYSBQSFkKLSAgICAgKiBhdXRvLW5lZyksIHdlIGhhdmUgdG8gbWFudWFsbHkgZW5hYmxlL2Rpc2FibGUgdHJhbnNtaXQgYW4KLSAgICAgKiByZWNlaXZlIGZsb3cgY29udHJvbC4KLSAgICAgKgotICAgICAqIFRoZSAiQ2FzZSIgc3RhdGVtZW50IGJlbG93IGVuYWJsZXMvZGlzYWJsZSBmbG93IGNvbnRyb2wKLSAgICAgKiBhY2NvcmRpbmcgdG8gdGhlICJody0+ZmMiIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlICJmYyIgcGFyYW1ldGVyIGFyZToKLSAgICAgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAotICAgICAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZQotICAgICAqICAgICAgICAgIGZyYW1lcyBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KLSAgICAgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCi0gICAgICogICAgICAgICAgZnJhbWVzIGJ1dCB3ZSBkbyBub3QgcmVjZWl2ZSBwYXVzZSBmcmFtZXMpLgotICAgICAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBpcyBlbmFibGVkLgotICAgICAqICBvdGhlcjogIE5vIG90aGVyIHZhbHVlcyBzaG91bGQgYmUgcG9zc2libGUgYXQgdGhpcyBwb2ludC4KLSAgICAgKi8KKwkvKiBCZWNhdXNlIHdlIGRpZG4ndCBnZXQgbGluayB2aWEgdGhlIGludGVybmFsIGF1dG8tbmVnb3RpYXRpb24KKwkgKiBtZWNoYW5pc20gKHdlIGVpdGhlciBmb3JjZWQgbGluayBvciB3ZSBnb3QgbGluayB2aWEgUEhZCisJICogYXV0by1uZWcpLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IGVuYWJsZS9kaXNhYmxlIHRyYW5zbWl0IGFuCisJICogcmVjZWl2ZSBmbG93IGNvbnRyb2wuCisJICoKKwkgKiBUaGUgIkNhc2UiIHN0YXRlbWVudCBiZWxvdyBlbmFibGVzL2Rpc2FibGUgZmxvdyBjb250cm9sCisJICogYWNjb3JkaW5nIHRvIHRoZSAiaHctPmZjIiBwYXJhbWV0ZXIuCisJICoKKwkgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmMiIHBhcmFtZXRlciBhcmU6CisJICogICAgICAwOiAgRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKwkgKiAgICAgIDE6ICBSeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHJlY2VpdmUgcGF1c2UKKwkgKiAgICAgICAgICBmcmFtZXMgYnV0IG5vdCBzZW5kIHBhdXNlIGZyYW1lcykuCisJICogICAgICAyOiAgVHggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiBzZW5kIHBhdXNlIGZyYW1lcworCSAqICAgICAgICAgIGZyYW1lcyBidXQgd2UgZG8gbm90IHJlY2VpdmUgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDM6ICBCb3RoIFJ4IGFuZCBUWCBmbG93IGNvbnRyb2wgKHN5bW1ldHJpYykgaXMgZW5hYmxlZC4KKwkgKiAgb3RoZXI6ICBObyBvdGhlciB2YWx1ZXMgc2hvdWxkIGJlIHBvc3NpYmxlIGF0IHRoaXMgcG9pbnQuCisJICovCiAKLSAgICBzd2l0Y2ggKGh3LT5mYykgewotICAgIGNhc2UgRTEwMDBfRkNfTk9ORToKLSAgICAgICAgY3RybCAmPSAofihFMTAwMF9DVFJMX1RGQ0UgfCBFMTAwMF9DVFJMX1JGQ0UpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFMTAwMF9GQ19SWF9QQVVTRToKLSAgICAgICAgY3RybCAmPSAofkUxMDAwX0NUUkxfVEZDRSk7Ci0gICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9SRkNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEUxMDAwX0ZDX1RYX1BBVVNFOgotICAgICAgICBjdHJsICY9ICh+RTEwMDBfQ1RSTF9SRkNFKTsKLSAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1RGQ0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRTEwMDBfRkNfRlVMTDoKLSAgICAgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9URkNFIHwgRTEwMDBfQ1RSTF9SRkNFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgREVCVUdPVVQoIkZsb3cgY29udHJvbCBwYXJhbSBzZXQgaW5jb3JyZWN0bHlcbiIpOwotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7Ci0gICAgfQorCXN3aXRjaCAoaHctPmZjKSB7CisJY2FzZSBFMTAwMF9GQ19OT05FOgorCQljdHJsICY9ICh+KEUxMDAwX0NUUkxfVEZDRSB8IEUxMDAwX0NUUkxfUkZDRSkpOworCQlicmVhazsKKwljYXNlIEUxMDAwX0ZDX1JYX1BBVVNFOgorCQljdHJsICY9ICh+RTEwMDBfQ1RSTF9URkNFKTsKKwkJY3RybCB8PSBFMTAwMF9DVFJMX1JGQ0U7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfRkNfVFhfUEFVU0U6CisJCWN0cmwgJj0gKH5FMTAwMF9DVFJMX1JGQ0UpOworCQljdHJsIHw9IEUxMDAwX0NUUkxfVEZDRTsKKwkJYnJlYWs7CisJY2FzZSBFMTAwMF9GQ19GVUxMOgorCQljdHJsIHw9IChFMTAwMF9DVFJMX1RGQ0UgfCBFMTAwMF9DVFJMX1JGQ0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CiAKLSAgICAvKiBEaXNhYmxlIFRYIEZsb3cgQ29udHJvbCBmb3IgODI1NDIgKHJldiAyLjApICovCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCi0gICAgICAgIGN0cmwgJj0gKH5FMTAwMF9DVFJMX1RGQ0UpOworCS8qIERpc2FibGUgVFggRmxvdyBDb250cm9sIGZvciA4MjU0MiAocmV2IDIuMCkgKi8KKwlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKKwkJY3RybCAmPSAofkUxMDAwX0NUUkxfVEZDRSk7CiAKLSAgICBldzMyKENUUkwsIGN0cmwpOwotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCWV3MzIoQ1RSTCwgY3RybCk7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKgorICogZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAgLSBjb25maWd1cmUgZmxvdyBjb250cm9sIGFmdGVyIGF1dG9uZWcKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgogICogQ29uZmlndXJlcyBmbG93IGNvbnRyb2wgc2V0dGluZ3MgYWZ0ZXIgbGluayBpcyBlc3RhYmxpc2hlZAotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKgogICogU2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIHZhbGlkIGxpbmsgaGFzIGJlZW4gZXN0YWJsaXNoZWQuCiAgKiBGb3JjZXMgTUFDIGZsb3cgY29udHJvbCBzZXR0aW5ncyBpZiBsaW5rIHdhcyBmb3JjZWQuIFdoZW4gaW4gTUlJL0dNSUkgbW9kZQogICogYW5kIGF1dG9uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGUgTUFDIGZsb3cgY29udHJvbCBzZXR0aW5ncyB3aWxsIGJlIHNldAogICogYmFzZWQgb24gdGhlIGZsb3cgY29udHJvbCBuZWdvdGlhdGVkIGJ5IHRoZSBQSFkuIEluIFRCSSBtb2RlLCB0aGUgVEZDRQotICogYW5kIFJGQ0UgYml0cyB3aWxsIGJlIGF1dG9tYXRpY2FseSBzZXQgdG8gdGhlIG5lZ290aWF0ZWQgZmxvdyBjb250cm9sIG1vZGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBhbmQgUkZDRSBiaXRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlIG5lZ290aWF0ZWQgZmxvdyBjb250cm9sIG1vZGUuCisgKi8KIHN0YXRpYyBzMzIgZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICB1MTYgbWlpX3N0YXR1c19yZWc7Ci0gICAgdTE2IG1paV9ud2F5X2Fkdl9yZWc7Ci0gICAgdTE2IG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnOwotICAgIHUxNiBzcGVlZDsKLSAgICB1MTYgZHVwbGV4OworCXMzMiByZXRfdmFsOworCXUxNiBtaWlfc3RhdHVzX3JlZzsKKwl1MTYgbWlpX253YXlfYWR2X3JlZzsKKwl1MTYgbWlpX253YXlfbHBfYWJpbGl0eV9yZWc7CisJdTE2IHNwZWVkOworCXUxNiBkdXBsZXg7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwIik7CisJREVCVUdGVU5DKCJlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cCIpOwogCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgZmliZXIgbWVkaWEgYW5kIGF1dG8tbmVnIGZhaWxlZAotICAgICAqIHNvIHdlIGhhZCB0byBmb3JjZSBsaW5rLiAgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGZvcmNlIHRoZQotICAgICAqIGNvbmZpZ3VyYXRpb24gb2YgdGhlIE1BQyB0byBtYXRjaCB0aGUgImZjIiBwYXJhbWV0ZXIuCi0gICAgICovCi0gICAgaWYgKCgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgJiYgKGh3LT5hdXRvbmVnX2ZhaWxlZCkpIHx8Ci0gICAgICAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpICYmCi0gICAgICAgICAoaHctPmF1dG9uZWdfZmFpbGVkKSkgfHwKLSAgICAgICAgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYgKCFody0+YXV0b25lZykpKSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpOwotICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9Ci0gICAgfQorCS8qIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGZpYmVyIG1lZGlhIGFuZCBhdXRvLW5lZyBmYWlsZWQKKwkgKiBzbyB3ZSBoYWQgdG8gZm9yY2UgbGluay4gIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBmb3JjZSB0aGUKKwkgKiBjb25maWd1cmF0aW9uIG9mIHRoZSBNQUMgdG8gbWF0Y2ggdGhlICJmYyIgcGFyYW1ldGVyLgorCSAqLworCWlmICgoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmIChody0+YXV0b25lZ19mYWlsZWQpKQorCSAgICB8fCAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKQorCQkmJiAoaHctPmF1dG9uZWdfZmFpbGVkKSkKKwkgICAgfHwgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikKKwkJJiYgKCFody0+YXV0b25lZykpKSB7CisJCXJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpOworCQlpZiAocmV0X3ZhbCkgeworCQkJREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQogCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgY29wcGVyIG1lZGlhIGFuZCBhdXRvLW5lZyBpcwotICAgICAqIGVuYWJsZWQuICBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gY2hlY2sgYW5kIHNlZSBpZiBBdXRvLU5lZwotICAgICAqIGhhcyBjb21wbGV0ZWQsIGFuZCBpZiBzbywgaG93IHRoZSBQSFkgYW5kIGxpbmsgcGFydG5lciBoYXMKLSAgICAgKiBmbG93IGNvbnRyb2wgY29uZmlndXJlZC4KLSAgICAgKi8KLSAgICBpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSAmJiBody0+YXV0b25lZykgewotICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCBjaGVjayB0byBzZWUgaWYgQXV0b05lZwotICAgICAgICAgKiBoYXMgY29tcGxldGVkLiAgV2UgcmVhZCB0aGlzIHR3aWNlIGJlY2F1c2UgdGhpcyByZWcgaGFzCi0gICAgICAgICAqIHNvbWUgInN0aWNreSIgKGxhdGNoZWQpIGJpdHMuCi0gICAgICAgICAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCS8qIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGNvcHBlciBtZWRpYSBhbmQgYXV0by1uZWcgaXMKKwkgKiBlbmFibGVkLiAgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNoZWNrIGFuZCBzZWUgaWYgQXV0by1OZWcKKwkgKiBoYXMgY29tcGxldGVkLCBhbmQgaWYgc28sIGhvdyB0aGUgUEhZIGFuZCBsaW5rIHBhcnRuZXIgaGFzCisJICogZmxvdyBjb250cm9sIGNvbmZpZ3VyZWQuCisJICovCisJaWYgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYgaHctPmF1dG9uZWcpIHsKKwkJLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgY2hlY2sgdG8gc2VlIGlmIEF1dG9OZWcKKwkJICogaGFzIGNvbXBsZXRlZC4gIFdlIHJlYWQgdGhpcyB0d2ljZSBiZWNhdXNlIHRoaXMgcmVnIGhhcworCQkgKiBzb21lICJzdGlja3kiIChsYXRjaGVkKSBiaXRzLgorCQkgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBpZiAobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfQVVUT05FR19DT01QTEVURSkgewotICAgICAgICAgICAgLyogVGhlIEF1dG9OZWcgcHJvY2VzcyBoYXMgY29tcGxldGVkLCBzbyB3ZSBub3cgbmVlZCB0bwotICAgICAgICAgICAgICogcmVhZCBib3RoIHRoZSBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKLSAgICAgICAgICAgICAqIChBZGRyZXNzIDQpIGFuZCB0aGUgQXV0b19OZWdvdGlhdGlvbiBCYXNlIFBhZ2UgQWJpbGl0eQotICAgICAgICAgICAgICogUmVnaXN0ZXIgKEFkZHJlc3MgNSkgdG8gZGV0ZXJtaW5lIGhvdyBmbG93IGNvbnRyb2wgd2FzCi0gICAgICAgICAgICAgKiBuZWdvdGlhdGVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQVVUT05FR19BRFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWlfbndheV9hZHZfcmVnKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0xQX0FCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWlfbndheV9scF9hYmlsaXR5X3JlZyk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkJaWYgKG1paV9zdGF0dXNfcmVnICYgTUlJX1NSX0FVVE9ORUdfQ09NUExFVEUpIHsKKwkJCS8qIFRoZSBBdXRvTmVnIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCwgc28gd2Ugbm93IG5lZWQgdG8KKwkJCSAqIHJlYWQgYm90aCB0aGUgQXV0byBOZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCisJCQkgKiAoQWRkcmVzcyA0KSBhbmQgdGhlIEF1dG9fTmVnb3RpYXRpb24gQmFzZSBQYWdlIEFiaWxpdHkKKwkJCSAqIFJlZ2lzdGVyIChBZGRyZXNzIDUpIHRvIGRldGVybWluZSBob3cgZmxvdyBjb250cm9sIHdhcworCQkJICogbmVnb3RpYXRlZC4KKwkJCSAqLworCQkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLAorCQkJCQkJICAgICAmbWlpX253YXlfYWR2X3JlZyk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9MUF9BQklMSVRZLAorCQkJCQkJICAgICAmbWlpX253YXlfbHBfYWJpbGl0eV9yZWcpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgICAgIC8qIFR3byBiaXRzIGluIHRoZSBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKLSAgICAgICAgICAgICAqIChBZGRyZXNzIDQpIGFuZCB0d28gYml0cyBpbiB0aGUgQXV0byBOZWdvdGlhdGlvbiBCYXNlCi0gICAgICAgICAgICAgKiBQYWdlIEFiaWxpdHkgUmVnaXN0ZXIgKEFkZHJlc3MgNSkgZGV0ZXJtaW5lIGZsb3cgY29udHJvbAotICAgICAgICAgICAgICogZm9yIGJvdGggdGhlIFBIWSBhbmQgdGhlIGxpbmsgcGFydG5lci4gIFRoZSBmb2xsb3dpbmcKLSAgICAgICAgICAgICAqIHRhYmxlLCB0YWtlbiBvdXQgb2YgdGhlIElFRUUgODAyLjNhYi9ENi4wIGRhdGVkIE1hcmNoIDI1LAotICAgICAgICAgICAgICogMTk5OSwgZGVzY3JpYmVzIHRoZXNlIFBBVVNFIHJlc29sdXRpb24gYml0cyBhbmQgaG93IGZsb3cKLSAgICAgICAgICAgICAqIGNvbnRyb2wgaXMgZGV0ZXJtaW5lZCBiYXNlZCB1cG9uIHRoZXNlIHNldHRpbmdzLgotICAgICAgICAgICAgICogTk9URTogIERDID0gRG9uJ3QgQ2FyZQotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCi0gICAgICAgICAgICAgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBOSUMgUmVzb2x1dGlvbgotICAgICAgICAgICAgICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICogICAwICAgfCAgICAwICAgIHwgIERDICAgfCAgIERDICAgIHwgRTEwMDBfRkNfTk9ORQotICAgICAgICAgICAgICogICAwICAgfCAgICAxICAgIHwgICAwICAgfCAgIERDICAgIHwgRTEwMDBfRkNfTk9ORQotICAgICAgICAgICAgICogICAwICAgfCAgICAxICAgIHwgICAxICAgfCAgICAwICAgIHwgRTEwMDBfRkNfTk9ORQotICAgICAgICAgICAgICogICAwICAgfCAgICAxICAgIHwgICAxICAgfCAgICAxICAgIHwgRTEwMDBfRkNfVFhfUEFVU0UKLSAgICAgICAgICAgICAqICAgMSAgIHwgICAgMCAgICB8ICAgMCAgIHwgICBEQyAgICB8IEUxMDAwX0ZDX05PTkUKLSAgICAgICAgICAgICAqICAgMSAgIHwgICBEQyAgICB8ICAgMSAgIHwgICBEQyAgICB8IEUxMDAwX0ZDX0ZVTEwKLSAgICAgICAgICAgICAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMCAgICB8IEUxMDAwX0ZDX05PTkUKLSAgICAgICAgICAgICAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMSAgICB8IEUxMDAwX0ZDX1JYX1BBVVNFCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiBBcmUgYm90aCBQQVVTRSBiaXRzIHNldCB0byAxPyAgSWYgc28sIHRoaXMgaW1wbGllcwotICAgICAgICAgICAgICogU3ltbWV0cmljIEZsb3cgQ29udHJvbCBpcyBlbmFibGVkIGF0IGJvdGggZW5kcy4gIFRoZQotICAgICAgICAgICAgICogQVNNX0RJUiBiaXRzIGFyZSBpcnJlbGV2YW50IHBlciB0aGUgc3BlYy4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBGb3IgU3ltbWV0cmljIEZsb3cgQ29udHJvbDoKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgotICAgICAgICAgICAgICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgUmVzdWx0Ci0gICAgICAgICAgICAgKi0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgKiAgIDEgICB8ICAgREMgICAgfCAgIDEgICB8ICAgREMgICAgfCBFMTAwMF9GQ19GVUxMCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgotICAgICAgICAgICAgICAgIChtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkpIHsKLSAgICAgICAgICAgICAgICAvKiBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgdXNlciBzZWxlY3RlZCBSWCBPTkxZCi0gICAgICAgICAgICAgICAgICogb2YgcGF1c2UgZnJhbWVzLiAgSW4gdGhpcyBjYXNlLCB3ZSBoYWQgdG8gYWR2ZXJ0aXNlCi0gICAgICAgICAgICAgICAgICogRlVMTCBmbG93IGNvbnRyb2wgYmVjYXVzZSB3ZSBjb3VsZCBub3QgYWR2ZXJ0aXNlIFJYCi0gICAgICAgICAgICAgICAgICogT05MWS4gSGVuY2UsIHdlIG11c3Qgbm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICogdHVybiBPRkYgIHRoZSBUUkFOU01JU1NJT04gb2YgUEFVU0UgZnJhbWVzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChody0+b3JpZ2luYWxfZmMgPT0gRTEwMDBfRkNfRlVMTCkgewotICAgICAgICAgICAgICAgICAgICBody0+ZmMgPSBFMTAwMF9GQ19GVUxMOwotICAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gRlVMTC5cbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGh3LT5mYyA9IEUxMDAwX0ZDX1JYX1BBVVNFOwotICAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gUlggUEFVU0UgZnJhbWVzIG9ubHkuXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBGb3IgcmVjZWl2aW5nIFBBVVNFIGZyYW1lcyBPTkxZLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCi0gICAgICAgICAgICAgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBSZXN1bHQKLSAgICAgICAgICAgICAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMSAgICB8IEUxMDAwX0ZDX1RYX1BBVVNFCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBlbHNlIGlmICghKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX0FTTV9ESVIpICYmCi0gICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfUEFVU0UpICYmCi0gICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfQVNNX0RJUikpIHsKLSAgICAgICAgICAgICAgICBody0+ZmMgPSBFMTAwMF9GQ19UWF9QQVVTRTsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gVFggUEFVU0UgZnJhbWVzIG9ubHkuXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEZvciB0cmFuc21pdHRpbmcgUEFVU0UgZnJhbWVzIE9OTFkuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogICBMT0NBTCBERVZJQ0UgIHwgICBMSU5LIFBBUlRORVIKLSAgICAgICAgICAgICAqIFBBVVNFIHwgQVNNX0RJUiB8IFBBVVNFIHwgQVNNX0RJUiB8IFJlc3VsdAotICAgICAgICAgICAgICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICogICAxICAgfCAgICAxICAgIHwgICAwICAgfCAgICAxICAgIHwgRTEwMDBfRkNfUlhfUEFVU0UKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9QQVVTRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9BU01fRElSKSAmJgotICAgICAgICAgICAgICAgICAgICAgIShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIChtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9BU01fRElSKSkgewotICAgICAgICAgICAgICAgIGh3LT5mYyA9IEUxMDAwX0ZDX1JYX1BBVVNFOwotICAgICAgICAgICAgICAgIERFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUGVyIHRoZSBJRUVFIHNwZWMsIGF0IHRoaXMgcG9pbnQgZmxvdyBjb250cm9sIHNob3VsZCBiZQotICAgICAgICAgICAgICogZGlzYWJsZWQuICBIb3dldmVyLCB3ZSB3YW50IHRvIGNvbnNpZGVyIHRoYXQgd2UgY291bGQKLSAgICAgICAgICAgICAqIGJlIGNvbm5lY3RlZCB0byBhIGxlZ2FjeSBzd2l0Y2ggdGhhdCBkb2Vzbid0IGFkdmVydGlzZQotICAgICAgICAgICAgICogZGVzaXJlZCBmbG93IGNvbnRyb2wsIGJ1dCBjYW4gYmUgZm9yY2VkIG9uIHRoZSBsaW5rCi0gICAgICAgICAgICAgKiBwYXJ0bmVyLiAgU28gaWYgd2UgYWR2ZXJ0aXNlZCBubyBmbG93IGNvbnRyb2wsIHRoYXQgaXMKLSAgICAgICAgICAgICAqIHdoYXQgd2Ugd2lsbCByZXNvbHZlIHRvLiAgSWYgd2UgYWR2ZXJ0aXNlZCBzb21lIGtpbmQgb2YKLSAgICAgICAgICAgICAqIHJlY2VpdmUgY2FwYWJpbGl0eSAoUnggUGF1c2UgT25seSBvciBGdWxsIEZsb3cgQ29udHJvbCkKLSAgICAgICAgICAgICAqIGFuZCB0aGUgbGluayBwYXJ0bmVyIGFkdmVydGlzZWQgbm9uZSwgd2Ugd2lsbCBjb25maWd1cmUKLSAgICAgICAgICAgICAqIG91cnNlbHZlcyB0byBlbmFibGUgUnggRmxvdyBDb250cm9sIG9ubHkuICBXZSBjYW4gZG8KLSAgICAgICAgICAgICAqIHRoaXMgc2FmZWx5IGZvciB0d28gcmVhc29uczogIElmIHRoZSBsaW5rIHBhcnRuZXIgcmVhbGx5Ci0gICAgICAgICAgICAgKiBkaWRuJ3Qgd2FudCBmbG93IGNvbnRyb2wgZW5hYmxlZCwgYW5kIHdlIGVuYWJsZSBSeCwgbm8KLSAgICAgICAgICAgICAqIGhhcm0gZG9uZSBzaW5jZSB3ZSB3b24ndCBiZSByZWNlaXZpbmcgYW55IFBBVVNFIGZyYW1lcwotICAgICAgICAgICAgICogYW55d2F5LiAgSWYgdGhlIGludGVudCBvbiB0aGUgbGluayBwYXJ0bmVyIHdhcyB0byBoYXZlCi0gICAgICAgICAgICAgKiBmbG93IGNvbnRyb2wgZW5hYmxlZCwgdGhlbiBieSB1cyBlbmFibGluZyBSWCBvbmx5LCB3ZQotICAgICAgICAgICAgICogY2FuIGF0IGxlYXN0IHJlY2VpdmUgcGF1c2UgZnJhbWVzIGFuZCBwcm9jZXNzIHRoZW0uCi0gICAgICAgICAgICAgKiBUaGlzIGlzIGEgZ29vZCBpZGVhIGJlY2F1c2UgaW4gbW9zdCBjYXNlcywgc2luY2Ugd2UgYXJlCi0gICAgICAgICAgICAgKiBwcmVkb21pbmFudGx5IGEgc2VydmVyIE5JQywgbW9yZSB0aW1lcyB0aGFuIG5vdCB3ZSB3aWxsCi0gICAgICAgICAgICAgKiBiZSBhc2tlZCB0byBkZWxheSB0cmFuc21pc3Npb24gb2YgcGFja2V0cyB0aGFuIGFza2luZwotICAgICAgICAgICAgICogb3VyIGxpbmsgcGFydG5lciB0byBwYXVzZSB0cmFuc21pc3Npb24gb2YgZnJhbWVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBlbHNlIGlmICgoaHctPm9yaWdpbmFsX2ZjID09IEUxMDAwX0ZDX05PTkUgfHwKLSAgICAgICAgICAgICAgICAgICAgICBody0+b3JpZ2luYWxfZmMgPT0gRTEwMDBfRkNfVFhfUEFVU0UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgaHctPmZjX3N0cmljdF9pZWVlKSB7Ci0gICAgICAgICAgICAgICAgaHctPmZjID0gRTEwMDBfRkNfTk9ORTsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gTk9ORS5cbiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBody0+ZmMgPSBFMTAwMF9GQ19SWF9QQVVTRTsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gUlggUEFVU0UgZnJhbWVzIG9ubHkuXG4iKTsKLSAgICAgICAgICAgIH0KKwkJCS8qIFR3byBiaXRzIGluIHRoZSBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKwkJCSAqIChBZGRyZXNzIDQpIGFuZCB0d28gYml0cyBpbiB0aGUgQXV0byBOZWdvdGlhdGlvbiBCYXNlCisJCQkgKiBQYWdlIEFiaWxpdHkgUmVnaXN0ZXIgKEFkZHJlc3MgNSkgZGV0ZXJtaW5lIGZsb3cgY29udHJvbAorCQkJICogZm9yIGJvdGggdGhlIFBIWSBhbmQgdGhlIGxpbmsgcGFydG5lci4gIFRoZSBmb2xsb3dpbmcKKwkJCSAqIHRhYmxlLCB0YWtlbiBvdXQgb2YgdGhlIElFRUUgODAyLjNhYi9ENi4wIGRhdGVkIE1hcmNoIDI1LAorCQkJICogMTk5OSwgZGVzY3JpYmVzIHRoZXNlIFBBVVNFIHJlc29sdXRpb24gYml0cyBhbmQgaG93IGZsb3cKKwkJCSAqIGNvbnRyb2wgaXMgZGV0ZXJtaW5lZCBiYXNlZCB1cG9uIHRoZXNlIHNldHRpbmdzLgorCQkJICogTk9URTogIERDID0gRG9uJ3QgQ2FyZQorCQkJICoKKwkJCSAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCisJCQkgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBOSUMgUmVzb2x1dGlvbgorCQkJICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogICAwICAgfCAgICAwICAgIHwgIERDICAgfCAgIERDICAgIHwgRTEwMDBfRkNfTk9ORQorCQkJICogICAwICAgfCAgICAxICAgIHwgICAwICAgfCAgIERDICAgIHwgRTEwMDBfRkNfTk9ORQorCQkJICogICAwICAgfCAgICAxICAgIHwgICAxICAgfCAgICAwICAgIHwgRTEwMDBfRkNfTk9ORQorCQkJICogICAwICAgfCAgICAxICAgIHwgICAxICAgfCAgICAxICAgIHwgRTEwMDBfRkNfVFhfUEFVU0UKKwkJCSAqICAgMSAgIHwgICAgMCAgICB8ICAgMCAgIHwgICBEQyAgICB8IEUxMDAwX0ZDX05PTkUKKwkJCSAqICAgMSAgIHwgICBEQyAgICB8ICAgMSAgIHwgICBEQyAgICB8IEUxMDAwX0ZDX0ZVTEwKKwkJCSAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMCAgICB8IEUxMDAwX0ZDX05PTkUKKwkJCSAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMSAgICB8IEUxMDAwX0ZDX1JYX1BBVVNFCisJCQkgKgorCQkJICovCisJCQkvKiBBcmUgYm90aCBQQVVTRSBiaXRzIHNldCB0byAxPyAgSWYgc28sIHRoaXMgaW1wbGllcworCQkJICogU3ltbWV0cmljIEZsb3cgQ29udHJvbCBpcyBlbmFibGVkIGF0IGJvdGggZW5kcy4gIFRoZQorCQkJICogQVNNX0RJUiBiaXRzIGFyZSBpcnJlbGV2YW50IHBlciB0aGUgc3BlYy4KKwkJCSAqCisJCQkgKiBGb3IgU3ltbWV0cmljIEZsb3cgQ29udHJvbDoKKwkJCSAqCisJCQkgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorCQkJICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgUmVzdWx0CisJCQkgKi0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkgKiAgIDEgICB8ICAgREMgICAgfCAgIDEgICB8ICAgREMgICAgfCBFMTAwMF9GQ19GVUxMCisJCQkgKgorCQkJICovCisJCQlpZiAoKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgorCQkJICAgIChtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkpIHsKKwkJCQkvKiBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgdXNlciBzZWxlY3RlZCBSWCBPTkxZCisJCQkJICogb2YgcGF1c2UgZnJhbWVzLiAgSW4gdGhpcyBjYXNlLCB3ZSBoYWQgdG8gYWR2ZXJ0aXNlCisJCQkJICogRlVMTCBmbG93IGNvbnRyb2wgYmVjYXVzZSB3ZSBjb3VsZCBub3QgYWR2ZXJ0aXNlIFJYCisJCQkJICogT05MWS4gSGVuY2UsIHdlIG11c3Qgbm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvCisJCQkJICogdHVybiBPRkYgIHRoZSBUUkFOU01JU1NJT04gb2YgUEFVU0UgZnJhbWVzLgorCQkJCSAqLworCQkJCWlmIChody0+b3JpZ2luYWxfZmMgPT0gRTEwMDBfRkNfRlVMTCkgeworCQkJCQlody0+ZmMgPSBFMTAwMF9GQ19GVUxMOworCQkJCQlERUJVR09VVCgiRmxvdyBDb250cm9sID0gRlVMTC5cbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCWh3LT5mYyA9IEUxMDAwX0ZDX1JYX1BBVVNFOworCQkJCQlERUJVR09VVAorCQkJCQkgICAgKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cbiIpOworCQkJCX0KKwkJCX0KKwkJCS8qIEZvciByZWNlaXZpbmcgUEFVU0UgZnJhbWVzIE9OTFkuCisJCQkgKgorCQkJICogICBMT0NBTCBERVZJQ0UgIHwgICBMSU5LIFBBUlRORVIKKwkJCSAqIFBBVVNFIHwgQVNNX0RJUiB8IFBBVVNFIHwgQVNNX0RJUiB8IFJlc3VsdAorCQkJICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogICAwICAgfCAgICAxICAgIHwgICAxICAgfCAgICAxICAgIHwgRTEwMDBfRkNfVFhfUEFVU0UKKwkJCSAqCisJCQkgKi8KKwkJCWVsc2UgaWYgKCEobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisJCQkJIChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9BU01fRElSKSAmJgorCQkJCSAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfUEFVU0UpICYmCisJCQkJIChtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9BU01fRElSKSkKKwkJCXsKKwkJCQlody0+ZmMgPSBFMTAwMF9GQ19UWF9QQVVTRTsKKwkJCQlERUJVR09VVAorCQkJCSAgICAoIkZsb3cgQ29udHJvbCA9IFRYIFBBVVNFIGZyYW1lcyBvbmx5LlxuIik7CisJCQl9CisJCQkvKiBGb3IgdHJhbnNtaXR0aW5nIFBBVVNFIGZyYW1lcyBPTkxZLgorCQkJICoKKwkJCSAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCisJCQkgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBSZXN1bHQKKwkJCSAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMSAgICB8IEUxMDAwX0ZDX1JYX1BBVVNFCisJCQkgKgorCQkJICovCisJCQllbHNlIGlmICgobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisJCQkJIChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9BU01fRElSKSAmJgorCQkJCSAhKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgorCQkJCSAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfQVNNX0RJUikpCisJCQl7CisJCQkJaHctPmZjID0gRTEwMDBfRkNfUlhfUEFVU0U7CisJCQkJREVCVUdPVVQKKwkJCQkgICAgKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cbiIpOworCQkJfQorCQkJLyogUGVyIHRoZSBJRUVFIHNwZWMsIGF0IHRoaXMgcG9pbnQgZmxvdyBjb250cm9sIHNob3VsZCBiZQorCQkJICogZGlzYWJsZWQuICBIb3dldmVyLCB3ZSB3YW50IHRvIGNvbnNpZGVyIHRoYXQgd2UgY291bGQKKwkJCSAqIGJlIGNvbm5lY3RlZCB0byBhIGxlZ2FjeSBzd2l0Y2ggdGhhdCBkb2Vzbid0IGFkdmVydGlzZQorCQkJICogZGVzaXJlZCBmbG93IGNvbnRyb2wsIGJ1dCBjYW4gYmUgZm9yY2VkIG9uIHRoZSBsaW5rCisJCQkgKiBwYXJ0bmVyLiAgU28gaWYgd2UgYWR2ZXJ0aXNlZCBubyBmbG93IGNvbnRyb2wsIHRoYXQgaXMKKwkJCSAqIHdoYXQgd2Ugd2lsbCByZXNvbHZlIHRvLiAgSWYgd2UgYWR2ZXJ0aXNlZCBzb21lIGtpbmQgb2YKKwkJCSAqIHJlY2VpdmUgY2FwYWJpbGl0eSAoUnggUGF1c2UgT25seSBvciBGdWxsIEZsb3cgQ29udHJvbCkKKwkJCSAqIGFuZCB0aGUgbGluayBwYXJ0bmVyIGFkdmVydGlzZWQgbm9uZSwgd2Ugd2lsbCBjb25maWd1cmUKKwkJCSAqIG91cnNlbHZlcyB0byBlbmFibGUgUnggRmxvdyBDb250cm9sIG9ubHkuICBXZSBjYW4gZG8KKwkJCSAqIHRoaXMgc2FmZWx5IGZvciB0d28gcmVhc29uczogIElmIHRoZSBsaW5rIHBhcnRuZXIgcmVhbGx5CisJCQkgKiBkaWRuJ3Qgd2FudCBmbG93IGNvbnRyb2wgZW5hYmxlZCwgYW5kIHdlIGVuYWJsZSBSeCwgbm8KKwkJCSAqIGhhcm0gZG9uZSBzaW5jZSB3ZSB3b24ndCBiZSByZWNlaXZpbmcgYW55IFBBVVNFIGZyYW1lcworCQkJICogYW55d2F5LiAgSWYgdGhlIGludGVudCBvbiB0aGUgbGluayBwYXJ0bmVyIHdhcyB0byBoYXZlCisJCQkgKiBmbG93IGNvbnRyb2wgZW5hYmxlZCwgdGhlbiBieSB1cyBlbmFibGluZyBSWCBvbmx5LCB3ZQorCQkJICogY2FuIGF0IGxlYXN0IHJlY2VpdmUgcGF1c2UgZnJhbWVzIGFuZCBwcm9jZXNzIHRoZW0uCisJCQkgKiBUaGlzIGlzIGEgZ29vZCBpZGVhIGJlY2F1c2UgaW4gbW9zdCBjYXNlcywgc2luY2Ugd2UgYXJlCisJCQkgKiBwcmVkb21pbmFudGx5IGEgc2VydmVyIE5JQywgbW9yZSB0aW1lcyB0aGFuIG5vdCB3ZSB3aWxsCisJCQkgKiBiZSBhc2tlZCB0byBkZWxheSB0cmFuc21pc3Npb24gb2YgcGFja2V0cyB0aGFuIGFza2luZworCQkJICogb3VyIGxpbmsgcGFydG5lciB0byBwYXVzZSB0cmFuc21pc3Npb24gb2YgZnJhbWVzLgorCQkJICovCisJCQllbHNlIGlmICgoaHctPm9yaWdpbmFsX2ZjID09IEUxMDAwX0ZDX05PTkUgfHwKKwkJCQkgIGh3LT5vcmlnaW5hbF9mYyA9PSBFMTAwMF9GQ19UWF9QQVVTRSkgfHwKKwkJCQkgaHctPmZjX3N0cmljdF9pZWVlKSB7CisJCQkJaHctPmZjID0gRTEwMDBfRkNfTk9ORTsKKwkJCQlERUJVR09VVCgiRmxvdyBDb250cm9sID0gTk9ORS5cbiIpOworCQkJfSBlbHNlIHsKKwkJCQlody0+ZmMgPSBFMTAwMF9GQ19SWF9QQVVTRTsKKwkJCQlERUJVR09VVAorCQkJCSAgICAoIkZsb3cgQ29udHJvbCA9IFJYIFBBVVNFIGZyYW1lcyBvbmx5LlxuIik7CisJCQl9CiAKLSAgICAgICAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGRvIG9uZSBsYXN0IGNoZWNrLi4uICBJZiB3ZSBhdXRvLQotICAgICAgICAgICAgICogbmVnb3RpYXRlZCB0byBIQUxGIERVUExFWCwgZmxvdyBjb250cm9sIHNob3VsZCBub3QgYmUKLSAgICAgICAgICAgICAqIGVuYWJsZWQgcGVyIElFRUUgODAyLjMgc3BlYy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgZ2V0dGluZyBsaW5rIHNwZWVkIGFuZCBkdXBsZXhcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgfQorCQkJLyogTm93IHdlIG5lZWQgdG8gZG8gb25lIGxhc3QgY2hlY2suLi4gIElmIHdlIGF1dG8tCisJCQkgKiBuZWdvdGlhdGVkIHRvIEhBTEYgRFVQTEVYLCBmbG93IGNvbnRyb2wgc2hvdWxkIG5vdCBiZQorCQkJICogZW5hYmxlZCBwZXIgSUVFRSA4MDIuMyBzcGVjLgorCQkJICovCisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKKwkJCWlmIChyZXRfdmFsKSB7CisJCQkJREVCVUdPVVQKKwkJCQkgICAgKCJFcnJvciBnZXR0aW5nIGxpbmsgc3BlZWQgYW5kIGR1cGxleFxuIik7CisJCQkJcmV0dXJuIHJldF92YWw7CisJCQl9CiAKLSAgICAgICAgICAgIGlmIChkdXBsZXggPT0gSEFMRl9EVVBMRVgpCi0gICAgICAgICAgICAgICAgaHctPmZjID0gRTEwMDBfRkNfTk9ORTsKKwkJCWlmIChkdXBsZXggPT0gSEFMRl9EVVBMRVgpCisJCQkJaHctPmZjID0gRTEwMDBfRkNfTk9ORTsKIAotICAgICAgICAgICAgLyogTm93IHdlIGNhbGwgYSBzdWJyb3V0aW5lIHRvIGFjdHVhbGx5IGZvcmNlIHRoZSBNQUMKLSAgICAgICAgICAgICAqIGNvbnRyb2xsZXIgdG8gdXNlIHRoZSBjb3JyZWN0IGZsb3cgY29udHJvbCBzZXR0aW5ncy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2ZvcmNlX21hY19mYyhodyk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBmb3JjaW5nIGZsb3cgY29udHJvbCBzZXR0aW5nc1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR09VVCgiQ29wcGVyIFBIWSBhbmQgQXV0byBOZWcgaGFzIG5vdCBjb21wbGV0ZWQuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJCS8qIE5vdyB3ZSBjYWxsIGEgc3Vicm91dGluZSB0byBhY3R1YWxseSBmb3JjZSB0aGUgTUFDCisJCQkgKiBjb250cm9sbGVyIHRvIHVzZSB0aGUgY29ycmVjdCBmbG93IGNvbnRyb2wgc2V0dGluZ3MuCisJCQkgKi8KKwkJCXJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpOworCQkJaWYgKHJldF92YWwpIHsKKwkJCQlERUJVR09VVAorCQkJCSAgICAoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURFQlVHT1VUCisJCQkgICAgKCJDb3BwZXIgUEhZIGFuZCBBdXRvIE5lZyBoYXMgbm90IGNvbXBsZXRlZC5cbiIpOworCQl9CisJfQorCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioKKyAqIGUxMDAwX2NoZWNrX2Zvcl9zZXJkZXNfbGlua19nZW5lcmljIC0gQ2hlY2sgZm9yIGxpbmsgKFNlcmRlcykKKyAqIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKgorICogQ2hlY2tzIGZvciBsaW5rIHVwIG9uIHRoZSBoYXJkd2FyZS4gIElmIGxpbmsgaXMgbm90IHVwIGFuZCB3ZSBoYXZlCisgKiBhIHNpZ25hbCwgdGhlbiB3ZSBuZWVkIHRvIGZvcmNlIGxpbmsgdXAuCisgKi8KK3N0YXRpYyBzMzIgZTEwMDBfY2hlY2tfZm9yX3NlcmRlc19saW5rX2dlbmVyaWMoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1MzIgcnhjdzsKKwl1MzIgY3RybDsKKwl1MzIgc3RhdHVzOworCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKworCURFQlVHRlVOQygiZTEwMDBfY2hlY2tfZm9yX3NlcmRlc19saW5rX2dlbmVyaWMiKTsKKworCWN0cmwgPSBlcjMyKENUUkwpOworCXN0YXR1cyA9IGVyMzIoU1RBVFVTKTsKKwlyeGN3ID0gZXIzMihSWENXKTsKKworCS8qCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBsaW5rIChhdXRvLW5lZ290aWF0aW9uIGZhaWxlZCBvciBsaW5rIHBhcnRuZXIKKwkgKiBjYW5ub3QgYXV0by1uZWdvdGlhdGUpLCBhbmQgb3VyIGxpbmsgcGFydG5lciBpcyBub3QgdHJ5aW5nIHRvCisJICogYXV0by1uZWdvdGlhdGUgd2l0aCB1cyAod2UgYXJlIHJlY2VpdmluZyBpZGxlcyBvciBkYXRhKSwKKwkgKiB3ZSBuZWVkIHRvIGZvcmNlIGxpbmsgdXAuIFdlIGFsc28gbmVlZCB0byBnaXZlIGF1dG8tbmVnb3RpYXRpb24KKwkgKiB0aW1lIHRvIGNvbXBsZXRlLgorCSAqLworCS8qIChjdHJsICYgRTEwMDBfQ1RSTF9TV0RQSU4xKSA9PSAxID09IGhhdmUgc2lnbmFsICovCisJaWYgKCghKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkpICYmICghKHJ4Y3cgJiBFMTAwMF9SWENXX0MpKSkgeworCQlpZiAoaHctPmF1dG9uZWdfZmFpbGVkID09IDApIHsKKwkJCWh3LT5hdXRvbmVnX2ZhaWxlZCA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCQlERUJVR09VVCgiTk9UIFJYaW5nIC9DLywgZGlzYWJsZSBBdXRvTmVnIGFuZCBmb3JjZSBsaW5rLlxuIik7CisKKwkJLyogRGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uIGluIHRoZSBUWENXIHJlZ2lzdGVyICovCisJCWV3MzIoVFhDVywgKGh3LT50eGN3ICYgfkUxMDAwX1RYQ1dfQU5FKSk7CisKKwkJLyogRm9yY2UgbGluay11cCBhbmQgYWxzbyBmb3JjZSBmdWxsLWR1cGxleC4gKi8KKwkJY3RybCA9IGVyMzIoQ1RSTCk7CisJCWN0cmwgfD0gKEUxMDAwX0NUUkxfU0xVIHwgRTEwMDBfQ1RSTF9GRCk7CisJCWV3MzIoQ1RSTCwgY3RybCk7CisKKwkJLyogQ29uZmlndXJlIEZsb3cgQ29udHJvbCBhZnRlciBmb3JjaW5nIGxpbmsgdXAuICovCisJCXJldF92YWwgPSBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChodyk7CisJCWlmIChyZXRfdmFsKSB7CisJCQlERUJVR09VVCgiRXJyb3IgY29uZmlndXJpbmcgZmxvdyBjb250cm9sXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmICgoY3RybCAmIEUxMDAwX0NUUkxfU0xVKSAmJiAocnhjdyAmIEUxMDAwX1JYQ1dfQykpIHsKKwkJLyoKKwkJICogSWYgd2UgYXJlIGZvcmNpbmcgbGluayBhbmQgd2UgYXJlIHJlY2VpdmluZyAvQy8gb3JkZXJlZAorCQkgKiBzZXRzLCByZS1lbmFibGUgYXV0by1uZWdvdGlhdGlvbiBpbiB0aGUgVFhDVyByZWdpc3RlcgorCQkgKiBhbmQgZGlzYWJsZSBmb3JjZWQgbGluayBpbiB0aGUgRGV2aWNlIENvbnRyb2wgcmVnaXN0ZXIKKwkJICogaW4gYW4gYXR0ZW1wdCB0byBhdXRvLW5lZ290aWF0ZSB3aXRoIG91ciBsaW5rIHBhcnRuZXIuCisJCSAqLworCQlERUJVR09VVCgiUlhpbmcgL0MvLCBlbmFibGUgQXV0b05lZyBhbmQgc3RvcCBmb3JjaW5nIGxpbmsuXG4iKTsKKwkJZXczMihUWENXLCBody0+dHhjdyk7CisJCWV3MzIoQ1RSTCwgKGN0cmwgJiB+RTEwMDBfQ1RSTF9TTFUpKTsKKworCQlody0+c2VyZGVzX2hhc19saW5rID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCEoRTEwMDBfVFhDV19BTkUgJiBlcjMyKFRYQ1cpKSkgeworCQkvKgorCQkgKiBJZiB3ZSBmb3JjZSBsaW5rIGZvciBub24tYXV0by1uZWdvdGlhdGlvbiBzd2l0Y2gsIGNoZWNrCisJCSAqIGxpbmsgc3RhdHVzIGJhc2VkIG9uIE1BQyBzeW5jaHJvbml6YXRpb24gZm9yIGludGVybmFsCisJCSAqIHNlcmRlcyBtZWRpYSB0eXBlLgorCQkgKi8KKwkJLyogU1lOQ0ggYml0IGFuZCBJViBiaXQgYXJlIHN0aWNreS4gKi8KKwkJdWRlbGF5KDEwKTsKKwkJcnhjdyA9IGVyMzIoUlhDVyk7CisJCWlmIChyeGN3ICYgRTEwMDBfUlhDV19TWU5DSCkgeworCQkJaWYgKCEocnhjdyAmIEUxMDAwX1JYQ1dfSVYpKSB7CisJCQkJaHctPnNlcmRlc19oYXNfbGluayA9IHRydWU7CisJCQkJREVCVUdPVVQoIlNFUkRFUzogTGluayB1cCAtIGZvcmNlZC5cbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaHctPnNlcmRlc19oYXNfbGluayA9IGZhbHNlOworCQkJREVCVUdPVVQoIlNFUkRFUzogTGluayBkb3duIC0gZm9yY2UgZmFpbGVkLlxuIik7CisJCX0KKwl9CisKKwlpZiAoRTEwMDBfVFhDV19BTkUgJiBlcjMyKFRYQ1cpKSB7CisJCXN0YXR1cyA9IGVyMzIoU1RBVFVTKTsKKwkJaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkgeworCQkJLyogU1lOQ0ggYml0IGFuZCBJViBiaXQgYXJlIHN0aWNreSwgc28gcmVyZWFkIHJ4Y3cuICovCisJCQl1ZGVsYXkoMTApOworCQkJcnhjdyA9IGVyMzIoUlhDVyk7CisJCQlpZiAocnhjdyAmIEUxMDAwX1JYQ1dfU1lOQ0gpIHsKKwkJCQlpZiAoIShyeGN3ICYgRTEwMDBfUlhDV19JVikpIHsKKwkJCQkJaHctPnNlcmRlc19oYXNfbGluayA9IHRydWU7CisJCQkJCURFQlVHT1VUKCJTRVJERVM6IExpbmsgdXAgLSBhdXRvbmVnICIKKwkJCQkJCSAiY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCWh3LT5zZXJkZXNfaGFzX2xpbmsgPSBmYWxzZTsKKwkJCQkJREVCVUdPVVQoIlNFUkRFUzogTGluayBkb3duIC0gaW52YWxpZCIKKwkJCQkJCSAiY29kZXdvcmRzIGRldGVjdGVkIGluIGF1dG9uZWcuXG4iKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWh3LT5zZXJkZXNfaGFzX2xpbmsgPSBmYWxzZTsKKwkJCQlERUJVR09VVCgiU0VSREVTOiBMaW5rIGRvd24gLSBubyBzeW5jLlxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlody0+c2VyZGVzX2hhc19saW5rID0gZmFsc2U7CisJCQlERUJVR09VVCgiU0VSREVTOiBMaW5rIGRvd24gLSBhdXRvbmVnIGZhaWxlZFxuIik7CisJCX0KKwl9CisKKyAgICAgIG91dDoKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiBlMTAwMF9jaGVja19mb3JfbGluaworICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCiAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgaGFyZHdhcmUgaGFzIGNoYW5nZWQuCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCiAgKiBDYWxsZWQgYnkgYW55IGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gY2hlY2sgdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSBhZGFwdGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzMzIgZTEwMDBfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICB1MzIgcnhjdyA9IDA7Ci0gICAgdTMyIGN0cmw7Ci0gICAgdTMyIHN0YXR1czsKLSAgICB1MzIgcmN0bDsKLSAgICB1MzIgaWNyOwotICAgIHUzMiBzaWduYWwgPSAwOwotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBwaHlfZGF0YTsKKwl1MzIgcnhjdyA9IDA7CisJdTMyIGN0cmw7CisJdTMyIHN0YXR1czsKKwl1MzIgcmN0bDsKKwl1MzIgaWNyOworCXUzMiBzaWduYWwgPSAwOworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfZGF0YTsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfY2hlY2tfZm9yX2xpbmsiKTsKKwlERUJVR0ZVTkMoImUxMDAwX2NoZWNrX2Zvcl9saW5rIik7CiAKLSAgICBjdHJsID0gZXIzMihDVFJMKTsKLSAgICBzdGF0dXMgPSBlcjMyKFNUQVRVUyk7CisJY3RybCA9IGVyMzIoQ1RSTCk7CisJc3RhdHVzID0gZXIzMihTVEFUVVMpOwogCi0gICAgLyogT24gYWRhcHRlcnMgd2l0aCBhIE1BQyBuZXdlciB0aGFuIDgyNTQ0LCBTVyBEZWZpbmVhYmxlIHBpbiAxIHdpbGwgYmUKLSAgICAgKiBzZXQgd2hlbiB0aGUgb3B0aWNzIGRldGVjdCBhIHNpZ25hbC4gT24gb2xkZXIgYWRhcHRlcnMsIGl0IHdpbGwgYmUKLSAgICAgKiBjbGVhcmVkIHdoZW4gdGhlcmUgaXMgYSBzaWduYWwuICBUaGlzIGFwcGxpZXMgdG8gZmliZXIgbWVkaWEgb25seS4KLSAgICAgKi8KLSAgICBpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHx8Ci0gICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpIHsKLSAgICAgICAgcnhjdyA9IGVyMzIoUlhDVyk7CisJLyogT24gYWRhcHRlcnMgd2l0aCBhIE1BQyBuZXdlciB0aGFuIDgyNTQ0LCBTVyBEZWZpbmFibGUgcGluIDEgd2lsbCBiZQorCSAqIHNldCB3aGVuIHRoZSBvcHRpY3MgZGV0ZWN0IGEgc2lnbmFsLiBPbiBvbGRlciBhZGFwdGVycywgaXQgd2lsbCBiZQorCSAqIGNsZWFyZWQgd2hlbiB0aGVyZSBpcyBhIHNpZ25hbC4gIFRoaXMgYXBwbGllcyB0byBmaWJlciBtZWRpYSBvbmx5LgorCSAqLworCWlmICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKKwkgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkgeworCQlyeGN3ID0gZXIzMihSWENXKTsKIAotICAgICAgICBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgewotICAgICAgICAgICAgc2lnbmFsID0gKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0xVKQotICAgICAgICAgICAgICAgIGh3LT5nZXRfbGlua19zdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KKwkJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKwkJCXNpZ25hbCA9CisJCQkgICAgKGh3LT5tYWNfdHlwZSA+CisJCQkgICAgIGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7CisJCQlpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0xVKQorCQkJCWh3LT5nZXRfbGlua19zdGF0dXMgPSBmYWxzZTsKKwkJfQorCX0KIAotICAgIC8qIElmIHdlIGhhdmUgYSBjb3BwZXIgUEhZIHRoZW4gd2Ugb25seSB3YW50IHRvIGdvIG91dCB0byB0aGUgUEhZCi0gICAgICogcmVnaXN0ZXJzIHRvIHNlZSBpZiBBdXRvLU5lZyBoYXMgY29tcGxldGVkIGFuZC9vciBpZiBvdXIgbGluawotICAgICAqIHN0YXR1cyBoYXMgY2hhbmdlZC4gIFRoZSBnZXRfbGlua19zdGF0dXMgZmxhZyB3aWxsIGJlIHNldCBpZiB3ZQotICAgICAqIHJlY2VpdmUgYSBMaW5rIFN0YXR1cyBDaGFuZ2UgaW50ZXJydXB0IG9yIHdlIGhhdmUgUnggU2VxdWVuY2UKLSAgICAgKiBFcnJvcnMuCi0gICAgICovCi0gICAgaWYgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYgaHctPmdldF9saW5rX3N0YXR1cykgewotICAgICAgICAvKiBGaXJzdCB3ZSB3YW50IHRvIHNlZSBpZiB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciByZXBvcnRzCi0gICAgICAgICAqIGxpbmsuICBJZiBzbywgdGhlbiB3ZSB3YW50IHRvIGdldCB0aGUgY3VycmVudCBzcGVlZC9kdXBsZXgKLSAgICAgICAgICogb2YgdGhlIFBIWS4KLSAgICAgICAgICogUmVhZCB0aGUgcmVnaXN0ZXIgdHdpY2Ugc2luY2UgdGhlIGxpbmsgYml0IGlzIHN0aWNreS4KLSAgICAgICAgICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJLyogSWYgd2UgaGF2ZSBhIGNvcHBlciBQSFkgdGhlbiB3ZSBvbmx5IHdhbnQgdG8gZ28gb3V0IHRvIHRoZSBQSFkKKwkgKiByZWdpc3RlcnMgdG8gc2VlIGlmIEF1dG8tTmVnIGhhcyBjb21wbGV0ZWQgYW5kL29yIGlmIG91ciBsaW5rCisJICogc3RhdHVzIGhhcyBjaGFuZ2VkLiAgVGhlIGdldF9saW5rX3N0YXR1cyBmbGFnIHdpbGwgYmUgc2V0IGlmIHdlCisJICogcmVjZWl2ZSBhIExpbmsgU3RhdHVzIENoYW5nZSBpbnRlcnJ1cHQgb3Igd2UgaGF2ZSBSeCBTZXF1ZW5jZQorCSAqIEVycm9ycy4KKwkgKi8KKwlpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSAmJiBody0+Z2V0X2xpbmtfc3RhdHVzKSB7CisJCS8qIEZpcnN0IHdlIHdhbnQgdG8gc2VlIGlmIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIHJlcG9ydHMKKwkJICogbGluay4gIElmIHNvLCB0aGVuIHdlIHdhbnQgdG8gZ2V0IHRoZSBjdXJyZW50IHNwZWVkL2R1cGxleAorCQkgKiBvZiB0aGUgUEhZLgorCQkgKiBSZWFkIHRoZSByZWdpc3RlciB0d2ljZSBzaW5jZSB0aGUgbGluayBiaXQgaXMgc3RpY2t5LgorCQkgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBpZiAocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKLSAgICAgICAgICAgIGh3LT5nZXRfbGlua19zdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZXJlIHdhcyBEb3duU2hpZnQsIG11c3QgYmUgY2hlY2tlZCBpbW1lZGlhdGVseSBhZnRlcgotICAgICAgICAgICAgICogbGluay11cCAqLwotICAgICAgICAgICAgZTEwMDBfY2hlY2tfZG93bnNoaWZ0KGh3KTsKKwkJaWYgKHBoeV9kYXRhICYgTUlJX1NSX0xJTktfU1RBVFVTKSB7CisJCQlody0+Z2V0X2xpbmtfc3RhdHVzID0gZmFsc2U7CisJCQkvKiBDaGVjayBpZiB0aGVyZSB3YXMgRG93blNoaWZ0LCBtdXN0IGJlIGNoZWNrZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKKwkJCSAqIGxpbmstdXAgKi8KKwkJCWUxMDAwX2NoZWNrX2Rvd25zaGlmdChodyk7CiAKLSAgICAgICAgICAgIC8qIElmIHdlIGFyZSBvbiA4MjU0NCBvciA4MjU0MyBzaWxpY29uIGFuZCBzcGVlZC9kdXBsZXgKLSAgICAgICAgICAgICAqIGFyZSBmb3JjZWQgdG8gMTBIIG9yIDEwRiwgdGhlbiB3ZSB3aWxsIGltcGxlbWVudCB0aGUgcG9sYXJpdHkKLSAgICAgICAgICAgICAqIHJldmVyc2FsIHdvcmthcm91bmQuICBXZSBkaXNhYmxlIGludGVycnVwdHMgZmlyc3QsIGFuZCB1cG9uCi0gICAgICAgICAgICAgKiByZXR1cm5pbmcsIHBsYWNlIHRoZSBkZXZpY2VzIGludGVycnVwdCBzdGF0ZSB0byBpdHMgcHJldmlvdXMKLSAgICAgICAgICAgICAqIHZhbHVlIGV4Y2VwdCBmb3IgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgd2hpY2ggd2lsbAotICAgICAgICAgICAgICogaGFwcGVuIGR1ZSB0byB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgd29ya2Fyb3VuZC4KLSAgICAgICAgICAgICAqLworCQkJLyogSWYgd2UgYXJlIG9uIDgyNTQ0IG9yIDgyNTQzIHNpbGljb24gYW5kIHNwZWVkL2R1cGxleAorCQkJICogYXJlIGZvcmNlZCB0byAxMEggb3IgMTBGLCB0aGVuIHdlIHdpbGwgaW1wbGVtZW50IHRoZSBwb2xhcml0eQorCQkJICogcmV2ZXJzYWwgd29ya2Fyb3VuZC4gIFdlIGRpc2FibGUgaW50ZXJydXB0cyBmaXJzdCwgYW5kIHVwb24KKwkJCSAqIHJldHVybmluZywgcGxhY2UgdGhlIGRldmljZXMgaW50ZXJydXB0IHN0YXRlIHRvIGl0cyBwcmV2aW91cworCQkJICogdmFsdWUgZXhjZXB0IGZvciB0aGUgbGluayBzdGF0dXMgY2hhbmdlIGludGVycnVwdCB3aGljaCB3aWxsCisJCQkgKiBoYXBwZW4gZHVlIHRvIHRoZSBleGVjdXRpb24gb2YgdGhpcyB3b3JrYXJvdW5kLgorCQkJICovCiAKLSAgICAgICAgICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgJiYKLSAgICAgICAgICAgICAgICAoIWh3LT5hdXRvbmVnKSAmJgotICAgICAgICAgICAgICAgIChody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9mdWxsIHx8Ci0gICAgICAgICAgICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2hhbGYpKSB7Ci0gICAgICAgICAgICAgICAgZXczMihJTUMsIDB4ZmZmZmZmZmYpOwotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKGh3KTsKLSAgICAgICAgICAgICAgICBpY3IgPSBlcjMyKElDUik7Ci0gICAgICAgICAgICAgICAgZXczMihJQ1MsIChpY3IgJiB+RTEwMDBfSUNTX0xTQykpOwotICAgICAgICAgICAgICAgIGV3MzIoSU1TLCBJTVNfRU5BQkxFX01BU0spOwotICAgICAgICAgICAgfQorCQkJaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDQKKwkJCSAgICAgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQzKSAmJiAoIWh3LT5hdXRvbmVnKQorCQkJICAgICYmIChody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9mdWxsCisJCQkJfHwgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpIHsKKwkJCQlldzMyKElNQywgMHhmZmZmZmZmZik7CisJCQkJcmV0X3ZhbCA9CisJCQkJICAgIGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3dvcmthcm91bmQoaHcpOworCQkJCWljciA9IGVyMzIoSUNSKTsKKwkJCQlldzMyKElDUywgKGljciAmIH5FMTAwMF9JQ1NfTFNDKSk7CisJCQkJZXczMihJTVMsIElNU19FTkFCTEVfTUFTSyk7CisJCQl9CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIE5vIGxpbmsgZGV0ZWN0ZWQgKi8KLSAgICAgICAgICAgIGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UoaHcsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisJCX0gZWxzZSB7CisJCQkvKiBObyBsaW5rIGRldGVjdGVkICovCisJCQllMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlKGh3LCBmYWxzZSk7CisJCQlyZXR1cm4gMDsKKwkJfQogCi0gICAgICAgIC8qIElmIHdlIGFyZSBmb3JjaW5nIHNwZWVkL2R1cGxleCwgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIHNpbmNlCi0gICAgICAgICAqIHdlIGhhdmUgYWxyZWFkeSBkZXRlcm1pbmVkIHdoZXRoZXIgd2UgaGF2ZSBsaW5rIG9yIG5vdC4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghaHctPmF1dG9uZWcpIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwkJLyogSWYgd2UgYXJlIGZvcmNpbmcgc3BlZWQvZHVwbGV4LCB0aGVuIHdlIHNpbXBseSByZXR1cm4gc2luY2UKKwkJICogd2UgaGF2ZSBhbHJlYWR5IGRldGVybWluZWQgd2hldGhlciB3ZSBoYXZlIGxpbmsgb3Igbm90LgorCQkgKi8KKwkJaWYgKCFody0+YXV0b25lZykKKwkJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKIAotICAgICAgICAvKiBvcHRpbWl6ZSB0aGUgZHNwIHNldHRpbmdzIGZvciB0aGUgaWdwIHBoeSAqLwotICAgICAgICBlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlKGh3LCB0cnVlKTsKKwkJLyogb3B0aW1pemUgdGhlIGRzcCBzZXR0aW5ncyBmb3IgdGhlIGlncCBwaHkgKi8KKwkJZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShodywgdHJ1ZSk7CiAKLSAgICAgICAgLyogV2UgaGF2ZSBhIE04OEUxMDAwIFBIWSBhbmQgQXV0by1OZWcgaXMgZW5hYmxlZC4gIElmIHdlCi0gICAgICAgICAqIGhhdmUgU2kgb24gYm9hcmQgdGhhdCBpcyA4MjU0NCBvciBuZXdlciwgQXV0bwotICAgICAgICAgKiBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZiBNQUMgc3BlZWQvZHVwbGV4Ci0gICAgICAgICAqIGNvbmZpZ3VyYXRpb24uICBTbyB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlIENvbGxpc2lvbgotICAgICAgICAgKiBEaXN0YW5jZSBpbiB0aGUgTUFDLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGZvcmNlCi0gICAgICAgICAqIHNwZWVkL2R1cGxleCBvbiB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKLSAgICAgICAgICogc2V0dGluZ3MuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KQotICAgICAgICAgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgY29uZmlndXJpbmcgTUFDIHRvIFBIWSBzZXR0aW5nc1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJLyogV2UgaGF2ZSBhIE04OEUxMDAwIFBIWSBhbmQgQXV0by1OZWcgaXMgZW5hYmxlZC4gIElmIHdlCisJCSAqIGhhdmUgU2kgb24gYm9hcmQgdGhhdCBpcyA4MjU0NCBvciBuZXdlciwgQXV0bworCQkgKiBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZiBNQUMgc3BlZWQvZHVwbGV4CisJCSAqIGNvbmZpZ3VyYXRpb24uICBTbyB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlIENvbGxpc2lvbgorCQkgKiBEaXN0YW5jZSBpbiB0aGUgTUFDLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGZvcmNlCisJCSAqIHNwZWVkL2R1cGxleCBvbiB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKKwkJICogc2V0dGluZ3MuCisJCSAqLworCQlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KQorCQkJZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKKwkJZWxzZSB7CisJCQlyZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOworCQkJaWYgKHJldF92YWwpIHsKKwkJCQlERUJVR09VVAorCQkJCSAgICAoIkVycm9yIGNvbmZpZ3VyaW5nIE1BQyB0byBQSFkgc2V0dGluZ3NcbiIpOworCQkJCXJldHVybiByZXRfdmFsOworCQkJfQorCQl9CiAKLSAgICAgICAgLyogQ29uZmlndXJlIEZsb3cgQ29udHJvbCBub3cgdGhhdCBBdXRvLU5lZyBoYXMgY29tcGxldGVkLiBGaXJzdCwgd2UKLSAgICAgICAgICogbmVlZCB0byByZXN0b3JlIHRoZSBkZXNpcmVkIGZsb3cgY29udHJvbCBzZXR0aW5ncyBiZWNhdXNlIHdlIG1heQotICAgICAgICAgKiBoYXZlIGhhZCB0byByZS1hdXRvbmVnIHdpdGggYSBkaWZmZXJlbnQgbGluayBwYXJ0bmVyLgotICAgICAgICAgKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KTsKLSAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBmbG93IGNvbnRyb2xcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0KKwkJLyogQ29uZmlndXJlIEZsb3cgQ29udHJvbCBub3cgdGhhdCBBdXRvLU5lZyBoYXMgY29tcGxldGVkLiBGaXJzdCwgd2UKKwkJICogbmVlZCB0byByZXN0b3JlIHRoZSBkZXNpcmVkIGZsb3cgY29udHJvbCBzZXR0aW5ncyBiZWNhdXNlIHdlIG1heQorCQkgKiBoYXZlIGhhZCB0byByZS1hdXRvbmVnIHdpdGggYSBkaWZmZXJlbnQgbGluayBwYXJ0bmVyLgorCQkgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KTsKKwkJaWYgKHJldF92YWwpIHsKKwkJCURFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBmbG93IGNvbnRyb2xcbiIpOworCQkJcmV0dXJuIHJldF92YWw7CisJCX0KIAotICAgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB3ZSBhcmUgb24gY29wcGVyIGFuZCB3ZSBoYXZlCi0gICAgICAgICAqIGF1dG8tbmVnb3RpYXRlZCBsaW5rLiAgVGhlc2UgYXJlIGNvbmRpdGlvbnMgZm9yIGNoZWNraW5nIHRoZSBsaW5rCi0gICAgICAgICAqIHBhcnRuZXIgY2FwYWJpbGl0eSByZWdpc3Rlci4gIFdlIHVzZSB0aGUgbGluayBzcGVlZCB0byBkZXRlcm1pbmUgaWYKLSAgICAgICAgICogVEJJIGNvbXBhdGliaWxpdHkgbmVlZHMgdG8gYmUgdHVybmVkIG9uIG9yIG9mZi4gIElmIHRoZSBsaW5rIGlzIG5vdAotICAgICAgICAgKiBhdCBnaWdhYml0IHNwZWVkLCB0aGVuIFRCSSBjb21wYXRpYmlsaXR5IGlzIG5vdCBuZWVkZWQuICBJZiB3ZSBhcmUKLSAgICAgICAgICogYXQgZ2lnYWJpdCBzcGVlZCwgd2UgdHVybiBvbiBUQkkgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChody0+dGJpX2NvbXBhdGliaWxpdHlfZW4pIHsKLSAgICAgICAgICAgIHUxNiBzcGVlZCwgZHVwbGV4OwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgZ2V0dGluZyBsaW5rIHNwZWVkIGFuZCBkdXBsZXhcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNwZWVkICE9IFNQRUVEXzEwMDApIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBsaW5rIHNwZWVkIGlzIG5vdCBzZXQgdG8gZ2lnYWJpdCBzcGVlZCwgd2UgZG8gbm90IG5lZWQKLSAgICAgICAgICAgICAgICAgKiB0byBlbmFibGUgVEJJIGNvbXBhdGliaWxpdHkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGh3LT50YmlfY29tcGF0aWJpbGl0eV9vbikgewotICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBwcmV2aW91c2x5IHdlcmUgaW4gdGhlIG1vZGUsIHR1cm4gaXQgb2ZmLiAqLwotICAgICAgICAgICAgICAgICAgICByY3RsID0gZXIzMihSQ1RMKTsKLSAgICAgICAgICAgICAgICAgICAgcmN0bCAmPSB+RTEwMDBfUkNUTF9TQlA7Ci0gICAgICAgICAgICAgICAgICAgIGV3MzIoUkNUTCwgcmN0bCk7Ci0gICAgICAgICAgICAgICAgICAgIGh3LT50YmlfY29tcGF0aWJpbGl0eV9vbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogSWYgVEJJIGNvbXBhdGliaWxpdHkgaXMgd2FzIHByZXZpb3VzbHkgb2ZmLCB0dXJuIGl0IG9uLiBGb3IKLSAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IHdpdGggYSBUQkkgbGluayBwYXJ0bmVyLCB3ZSB3aWxsIHN0b3JlIGJhZAotICAgICAgICAgICAgICAgICAqIHBhY2tldHMuIFNvbWUgZnJhbWVzIGhhdmUgYW4gYWRkaXRpb25hbCBieXRlIG9uIHRoZSBlbmQgYW5kCi0gICAgICAgICAgICAgICAgICogd2lsbCBsb29rIGxpa2UgQ1JDIGVycm9ycyB0byB0aGUgaGFyZHdhcmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCFody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaHctPnRiaV9jb21wYXRpYmlsaXR5X29uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmN0bCA9IGVyMzIoUkNUTCk7Ci0gICAgICAgICAgICAgICAgICAgIHJjdGwgfD0gRTEwMDBfUkNUTF9TQlA7Ci0gICAgICAgICAgICAgICAgICAgIGV3MzIoUkNUTCwgcmN0bCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qIElmIHdlIGRvbid0IGhhdmUgbGluayAoYXV0by1uZWdvdGlhdGlvbiBmYWlsZWQgb3IgbGluayBwYXJ0bmVyIGNhbm5vdAotICAgICAqIGF1dG8tbmVnb3RpYXRlKSwgdGhlIGNhYmxlIGlzIHBsdWdnZWQgaW4gKHdlIGhhdmUgc2lnbmFsKSwgYW5kIG91cgotICAgICAqIGxpbmsgcGFydG5lciBpcyBub3QgdHJ5aW5nIHRvIGF1dG8tbmVnb3RpYXRlIHdpdGggdXMgKHdlIGFyZSByZWNlaXZpbmcKLSAgICAgKiBpZGxlcyBvciBkYXRhKSwgd2UgbmVlZCB0byBmb3JjZSBsaW5rIHVwLiBXZSBhbHNvIG5lZWQgdG8gZ2l2ZQotICAgICAqIGF1dG8tbmVnb3RpYXRpb24gdGltZSB0byBjb21wbGV0ZSwgaW4gY2FzZSB0aGUgY2FibGUgd2FzIGp1c3QgcGx1Z2dlZAotICAgICAqIGluLiBUaGUgYXV0b25lZ19mYWlsZWQgZmxhZyBkb2VzIHRoaXMuCi0gICAgICovCi0gICAgZWxzZSBpZiAoKCgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgJiYKLSAgICAgICAgICAgICAgKChjdHJsICYgRTEwMDBfQ1RSTF9TV0RQSU4xKSA9PSBzaWduYWwpKSB8fAotICAgICAgICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgotICAgICAgICAgICAgICAoIShzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpKSAmJgotICAgICAgICAgICAgICAoIShyeGN3ICYgRTEwMDBfUlhDV19DKSkpIHsKLSAgICAgICAgaWYgKGh3LT5hdXRvbmVnX2ZhaWxlZCA9PSAwKSB7Ci0gICAgICAgICAgICBody0+YXV0b25lZ19mYWlsZWQgPSAxOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgREVCVUdPVVQoIk5PVCBSWGluZyAvQy8sIGRpc2FibGUgQXV0b05lZyBhbmQgZm9yY2UgbGluay5cbiIpOworCQkvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB3ZSBhcmUgb24gY29wcGVyIGFuZCB3ZSBoYXZlCisJCSAqIGF1dG8tbmVnb3RpYXRlZCBsaW5rLiAgVGhlc2UgYXJlIGNvbmRpdGlvbnMgZm9yIGNoZWNraW5nIHRoZSBsaW5rCisJCSAqIHBhcnRuZXIgY2FwYWJpbGl0eSByZWdpc3Rlci4gIFdlIHVzZSB0aGUgbGluayBzcGVlZCB0byBkZXRlcm1pbmUgaWYKKwkJICogVEJJIGNvbXBhdGliaWxpdHkgbmVlZHMgdG8gYmUgdHVybmVkIG9uIG9yIG9mZi4gIElmIHRoZSBsaW5rIGlzIG5vdAorCQkgKiBhdCBnaWdhYml0IHNwZWVkLCB0aGVuIFRCSSBjb21wYXRpYmlsaXR5IGlzIG5vdCBuZWVkZWQuICBJZiB3ZSBhcmUKKwkJICogYXQgZ2lnYWJpdCBzcGVlZCwgd2UgdHVybiBvbiBUQkkgY29tcGF0aWJpbGl0eS4KKwkJICovCisJCWlmIChody0+dGJpX2NvbXBhdGliaWxpdHlfZW4pIHsKKwkJCXUxNiBzcGVlZCwgZHVwbGV4OworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7CisJCQlpZiAocmV0X3ZhbCkgeworCQkJCURFQlVHT1VUCisJCQkJICAgICgiRXJyb3IgZ2V0dGluZyBsaW5rIHNwZWVkIGFuZCBkdXBsZXhcbiIpOworCQkJCXJldHVybiByZXRfdmFsOworCQkJfQorCQkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMDApIHsKKwkJCQkvKiBJZiBsaW5rIHNwZWVkIGlzIG5vdCBzZXQgdG8gZ2lnYWJpdCBzcGVlZCwgd2UgZG8gbm90IG5lZWQKKwkJCQkgKiB0byBlbmFibGUgVEJJIGNvbXBhdGliaWxpdHkuCisJCQkJICovCisJCQkJaWYgKGh3LT50YmlfY29tcGF0aWJpbGl0eV9vbikgeworCQkJCQkvKiBJZiB3ZSBwcmV2aW91c2x5IHdlcmUgaW4gdGhlIG1vZGUsIHR1cm4gaXQgb2ZmLiAqLworCQkJCQlyY3RsID0gZXIzMihSQ1RMKTsKKwkJCQkJcmN0bCAmPSB+RTEwMDBfUkNUTF9TQlA7CisJCQkJCWV3MzIoUkNUTCwgcmN0bCk7CisJCQkJCWh3LT50YmlfY29tcGF0aWJpbGl0eV9vbiA9IGZhbHNlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogSWYgVEJJIGNvbXBhdGliaWxpdHkgaXMgd2FzIHByZXZpb3VzbHkgb2ZmLCB0dXJuIGl0IG9uLiBGb3IKKwkJCQkgKiBjb21wYXRpYmlsaXR5IHdpdGggYSBUQkkgbGluayBwYXJ0bmVyLCB3ZSB3aWxsIHN0b3JlIGJhZAorCQkJCSAqIHBhY2tldHMuIFNvbWUgZnJhbWVzIGhhdmUgYW4gYWRkaXRpb25hbCBieXRlIG9uIHRoZSBlbmQgYW5kCisJCQkJICogd2lsbCBsb29rIGxpa2UgQ1JDIGVycm9ycyB0byB0byB0aGUgaGFyZHdhcmUuCisJCQkJICovCisJCQkJaWYgKCFody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKKwkJCQkJaHctPnRiaV9jb21wYXRpYmlsaXR5X29uID0gdHJ1ZTsKKwkJCQkJcmN0bCA9IGVyMzIoUkNUTCk7CisJCQkJCXJjdGwgfD0gRTEwMDBfUkNUTF9TQlA7CisJCQkJCWV3MzIoUkNUTCwgcmN0bCk7CisJCQkJfQorCQkJfQorCQl9CisJfQogCi0gICAgICAgIC8qIERpc2FibGUgYXV0by1uZWdvdGlhdGlvbiBpbiB0aGUgVFhDVyByZWdpc3RlciAqLwotICAgICAgICBldzMyKFRYQ1csIChody0+dHhjdyAmIH5FMTAwMF9UWENXX0FORSkpOworCWlmICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKKwkgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkKKwkJZTEwMDBfY2hlY2tfZm9yX3NlcmRlc19saW5rX2dlbmVyaWMoaHcpOwogCi0gICAgICAgIC8qIEZvcmNlIGxpbmstdXAgYW5kIGFsc28gZm9yY2UgZnVsbC1kdXBsZXguICovCi0gICAgICAgIGN0cmwgPSBlcjMyKENUUkwpOwotICAgICAgICBjdHJsIHw9IChFMTAwMF9DVFJMX1NMVSB8IEUxMDAwX0NUUkxfRkQpOwotICAgICAgICBldzMyKENUUkwsIGN0cmwpOwotCi0gICAgICAgIC8qIENvbmZpZ3VyZSBGbG93IENvbnRyb2wgYWZ0ZXIgZm9yY2luZyBsaW5rIHVwLiAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoaHcpOwotICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIGZsb3cgY29udHJvbFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBJZiB3ZSBhcmUgZm9yY2luZyBsaW5rIGFuZCB3ZSBhcmUgcmVjZWl2aW5nIC9DLyBvcmRlcmVkIHNldHMsIHJlLWVuYWJsZQotICAgICAqIGF1dG8tbmVnb3RpYXRpb24gaW4gdGhlIFRYQ1cgcmVnaXN0ZXIgYW5kIGRpc2FibGUgZm9yY2VkIGxpbmsgaW4gdGhlCi0gICAgICogRGV2aWNlIENvbnRyb2wgcmVnaXN0ZXIgaW4gYW4gYXR0ZW1wdCB0byBhdXRvLW5lZ290aWF0ZSB3aXRoIG91ciBsaW5rCi0gICAgICogcGFydG5lci4KLSAgICAgKi8KLSAgICBlbHNlIGlmICgoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHx8Ci0gICAgICAgICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpICYmCi0gICAgICAgICAgICAgIChjdHJsICYgRTEwMDBfQ1RSTF9TTFUpICYmIChyeGN3ICYgRTEwMDBfUlhDV19DKSkgewotICAgICAgICBERUJVR09VVCgiUlhpbmcgL0MvLCBlbmFibGUgQXV0b05lZyBhbmQgc3RvcCBmb3JjaW5nIGxpbmsuXG4iKTsKLSAgICAgICAgZXczMihUWENXLCBody0+dHhjdyk7Ci0gICAgICAgIGV3MzIoQ1RSTCwgKGN0cmwgJiB+RTEwMDBfQ1RSTF9TTFUpKTsKLQotICAgICAgICBody0+c2VyZGVzX2xpbmtfZG93biA9IGZhbHNlOwotICAgIH0KLSAgICAvKiBJZiB3ZSBmb3JjZSBsaW5rIGZvciBub24tYXV0by1uZWdvdGlhdGlvbiBzd2l0Y2gsIGNoZWNrIGxpbmsgc3RhdHVzCi0gICAgICogYmFzZWQgb24gTUFDIHN5bmNocm9uaXphdGlvbiBmb3IgaW50ZXJuYWwgc2VyZGVzIG1lZGlhIHR5cGUuCi0gICAgICovCi0gICAgZWxzZSBpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgotICAgICAgICAgICAgICEoRTEwMDBfVFhDV19BTkUgJiBlcjMyKFRYQ1cpKSkgewotICAgICAgICAvKiBTWU5DSCBiaXQgYW5kIElWIGJpdCBhcmUgc3RpY2t5LiAqLwotICAgICAgICB1ZGVsYXkoMTApOwotICAgICAgICBpZiAoRTEwMDBfUlhDV19TWU5DSCAmIGVyMzIoUlhDVykpIHsKLSAgICAgICAgICAgIGlmICghKHJ4Y3cgJiBFMTAwMF9SWENXX0lWKSkgewotICAgICAgICAgICAgICAgIGh3LT5zZXJkZXNfbGlua19kb3duID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgREVCVUdPVVQoIlNFUkRFUzogTGluayBpcyB1cC5cbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaHctPnNlcmRlc19saW5rX2Rvd24gPSB0cnVlOwotICAgICAgICAgICAgREVCVUdPVVQoIlNFUkRFUzogTGluayBpcyBkb3duLlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKLSAgICAgICAgKEUxMDAwX1RYQ1dfQU5FICYgZXIzMihUWENXKSkpIHsKLSAgICAgICAgaHctPnNlcmRlc19saW5rX2Rvd24gPSAhKEUxMDAwX1NUQVRVU19MVSAmIGVyMzIoU1RBVFVTKSk7Ci0gICAgfQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioKKyAqIGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4CisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQHNwZWVkOiBTcGVlZCBvZiB0aGUgY29ubmVjdGlvbgorICogQGR1cGxleDogRHVwbGV4IHNldHRpbmcgb2YgdGhlIGNvbm5lY3Rpb24KKwogICogRGV0ZWN0cyB0aGUgY3VycmVudCBzcGVlZCBhbmQgZHVwbGV4IHNldHRpbmdzIG9mIHRoZSBoYXJkd2FyZS4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogc3BlZWQgLSBTcGVlZCBvZiB0aGUgY29ubmVjdGlvbgotICogZHVwbGV4IC0gRHVwbGV4IHNldHRpbmcgb2YgdGhlIGNvbm5lY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogczMyIGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiAqc3BlZWQsIHUxNiAqZHVwbGV4KQogewotICAgIHUzMiBzdGF0dXM7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHBoeV9kYXRhOworCXUzMiBzdGF0dXM7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9kYXRhOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleCIpOworCURFQlVHRlVOQygiZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgiKTsKIAotICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKLSAgICAgICAgc3RhdHVzID0gZXIzMihTVEFUVVMpOwotICAgICAgICBpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMDApIHsKLSAgICAgICAgICAgICpzcGVlZCA9IFNQRUVEXzEwMDA7Ci0gICAgICAgICAgICBERUJVR09VVCgiMTAwMCBNYnMsICIpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19TUEVFRF8xMDApIHsKLSAgICAgICAgICAgICpzcGVlZCA9IFNQRUVEXzEwMDsKLSAgICAgICAgICAgIERFQlVHT1VUKCIxMDAgTWJzLCAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpzcGVlZCA9IFNQRUVEXzEwOwotICAgICAgICAgICAgREVCVUdPVVQoIjEwIE1icywgIik7Ci0gICAgICAgIH0KKwlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CisJCXN0YXR1cyA9IGVyMzIoU1RBVFVTKTsKKwkJaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAwKSB7CisJCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQkJREVCVUdPVVQoIjEwMDAgTWJzLCAiKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwKSB7CisJCQkqc3BlZWQgPSBTUEVFRF8xMDA7CisJCQlERUJVR09VVCgiMTAwIE1icywgIik7CisJCX0gZWxzZSB7CisJCQkqc3BlZWQgPSBTUEVFRF8xMDsKKwkJCURFQlVHT1VUKCIxMCBNYnMsICIpOworCQl9CiAKLSAgICAgICAgaWYgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19GRCkgewotICAgICAgICAgICAgKmR1cGxleCA9IEZVTExfRFVQTEVYOwotICAgICAgICAgICAgREVCVUdPVVQoIkZ1bGwgRHVwbGV4XG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkdXBsZXggPSBIQUxGX0RVUExFWDsKLSAgICAgICAgICAgIERFQlVHT1VUKCIgSGFsZiBEdXBsZXhcbiIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgREVCVUdPVVQoIjEwMDAgTWJzLCBGdWxsIER1cGxleFxuIik7Ci0gICAgICAgICpzcGVlZCA9IFNQRUVEXzEwMDA7Ci0gICAgICAgICpkdXBsZXggPSBGVUxMX0RVUExFWDsKLSAgICB9CisJCWlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfRkQpIHsKKwkJCSpkdXBsZXggPSBGVUxMX0RVUExFWDsKKwkJCURFQlVHT1VUKCJGdWxsIER1cGxleFxuIik7CisJCX0gZWxzZSB7CisJCQkqZHVwbGV4ID0gSEFMRl9EVVBMRVg7CisJCQlERUJVR09VVCgiIEhhbGYgRHVwbGV4XG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCURFQlVHT1VUKCIxMDAwIE1icywgRnVsbCBEdXBsZXhcbiIpOworCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQkqZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisJfQogCi0gICAgLyogSUdQMDEgUEhZIG1heSBhZHZlcnRpc2UgZnVsbCBkdXBsZXggb3BlcmF0aW9uIGFmdGVyIHNwZWVkIGRvd25ncmFkZSBldmVuCi0gICAgICogaWYgaXQgaXMgb3BlcmF0aW5nIGF0IGhhbGYgZHVwbGV4LiAgSGVyZSB3ZSBzZXQgdGhlIGR1cGxleCBzZXR0aW5ncyB0bwotICAgICAqIG1hdGNoIHRoZSBkdXBsZXggaW4gdGhlIGxpbmsgcGFydG5lcidzIGNhcGFiaWxpdGllcy4KLSAgICAgKi8KLSAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgJiYgaHctPnNwZWVkX2Rvd25ncmFkZWQpIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfRVhQLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCS8qIElHUDAxIFBIWSBtYXkgYWR2ZXJ0aXNlIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiBhZnRlciBzcGVlZCBkb3duZ3JhZGUgZXZlbgorCSAqIGlmIGl0IGlzIG9wZXJhdGluZyBhdCBoYWxmIGR1cGxleC4gIEhlcmUgd2Ugc2V0IHRoZSBkdXBsZXggc2V0dGluZ3MgdG8KKwkgKiBtYXRjaCB0aGUgZHVwbGV4IGluIHRoZSBsaW5rIHBhcnRuZXIncyBjYXBhYmlsaXRpZXMuCisJICovCisJaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwICYmIGh3LT5zcGVlZF9kb3duZ3JhZGVkKSB7CisJCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9BVVRPTkVHX0VYUCwgJnBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBpZiAoIShwaHlfZGF0YSAmIE5XQVlfRVJfTFBfTldBWV9DQVBTKSkKLSAgICAgICAgICAgICpkdXBsZXggPSBIQUxGX0RVUExFWDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfTFBfQUJJTElUWSwgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgaWYgKCgqc3BlZWQgPT0gU1BFRURfMTAwICYmICEocGh5X2RhdGEgJiBOV0FZX0xQQVJfMTAwVFhfRkRfQ0FQUykpIHx8Ci0gICAgICAgICAgICAgICAoKnNwZWVkID09IFNQRUVEXzEwICYmICEocGh5X2RhdGEgJiBOV0FZX0xQQVJfMTBUX0ZEX0NBUFMpKSkKLSAgICAgICAgICAgICAgICAqZHVwbGV4ID0gSEFMRl9EVVBMRVg7Ci0gICAgICAgIH0KLSAgICB9CisJCWlmICghKHBoeV9kYXRhICYgTldBWV9FUl9MUF9OV0FZX0NBUFMpKQorCQkJKmR1cGxleCA9IEhBTEZfRFVQTEVYOworCQllbHNlIHsKKwkJCXJldF92YWwgPQorCQkJICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0xQX0FCSUxJVFksICZwaHlfZGF0YSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCWlmICgoKnNwZWVkID09IFNQRUVEXzEwMAorCQkJICAgICAmJiAhKHBoeV9kYXRhICYgTldBWV9MUEFSXzEwMFRYX0ZEX0NBUFMpKQorCQkJICAgIHx8ICgqc3BlZWQgPT0gU1BFRURfMTAKKwkJCQkmJiAhKHBoeV9kYXRhICYgTldBWV9MUEFSXzEwVF9GRF9DQVBTKSkpCisJCQkJKmR1cGxleCA9IEhBTEZfRFVQTEVYOworCQl9CisJfQogCi0gICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pICYmCi0gICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikpIHsKLSAgICAgICAgaWYgKCpzcGVlZCA9PSBTUEVFRF8xMDAwKQotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ3VyZV9rbXJuX2Zvcl8xMDAwKGh3KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ3VyZV9rbXJuX2Zvcl8xMF8xMDAoaHcsICpkdXBsZXgpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIH0KLQotICAgIGlmICgoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMykgJiYgKCpzcGVlZCA9PSBTUEVFRF8xMDAwKSkgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfa3VtZXJhbl9sb2NrX2xvc3Nfd29ya2Fyb3VuZChodyk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQotCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQmxvY2tzIHVudGlsIGF1dG9uZWcgY29tcGxldGVzIG9yIHRpbWVzIG91dCAofjQuNSBzZWNvbmRzKQotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF93YWl0X2F1dG9uZWcKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogQmxvY2tzIHVudGlsIGF1dG9uZWcgY29tcGxldGVzIG9yIHRpbWVzIG91dCAofjQuNSBzZWNvbmRzKQorICovCiBzdGF0aWMgczMyIGUxMDAwX3dhaXRfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBpOwotICAgIHUxNiBwaHlfZGF0YTsKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgaTsKKwl1MTYgcGh5X2RhdGE7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3dhaXRfYXV0b25lZyIpOwotICAgIERFQlVHT1VUKCJXYWl0aW5nIGZvciBBdXRvLU5lZyB0byBjb21wbGV0ZS5cbiIpOworCURFQlVHRlVOQygiZTEwMDBfd2FpdF9hdXRvbmVnIik7CisJREVCVUdPVVQoIldhaXRpbmcgZm9yIEF1dG8tTmVnIHRvIGNvbXBsZXRlLlxuIik7CiAKLSAgICAvKiBXZSB3aWxsIHdhaXQgZm9yIGF1dG9uZWcgdG8gY29tcGxldGUgb3IgNC41IHNlY29uZHMgdG8gZXhwaXJlLiAqLwotICAgIGZvciAoaSA9IFBIWV9BVVRPX05FR19USU1FOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnCi0gICAgICAgICAqIENvbXBsZXRlIGJpdCB0byBiZSBzZXQuCi0gICAgICAgICAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICBpZiAocGh5X2RhdGEgJiBNSUlfU1JfQVVUT05FR19DT01QTEVURSkgewotICAgICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0gICAgICAgIH0KLSAgICAgICAgbXNsZWVwKDEwMCk7Ci0gICAgfQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCS8qIFdlIHdpbGwgd2FpdCBmb3IgYXV0b25lZyB0byBjb21wbGV0ZSBvciA0LjUgc2Vjb25kcyB0byBleHBpcmUuICovCisJZm9yIChpID0gUEhZX0FVVE9fTkVHX1RJTUU7IGkgPiAwOyBpLS0pIHsKKwkJLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgQXV0by1OZWcKKwkJICogQ29tcGxldGUgYml0IHRvIGJlIHNldC4KKwkJICovCisJCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCWlmIChwaHlfZGF0YSAmIE1JSV9TUl9BVVRPTkVHX0NPTVBMRVRFKSB7CisJCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJfQorCQltc2xlZXAoMTAwKTsKKwl9CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogUmFpc2VzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSogY3RybCAtIERldmljZSBjb250cm9sIHJlZ2lzdGVyJ3MgY3VycmVudCB2YWx1ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9yYWlzZV9tZGlfY2xrIC0gUmFpc2VzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAY3RybDogRGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIncyBjdXJyZW50IHZhbHVlCisgKi8KIHN0YXRpYyB2b2lkIGUxMDAwX3JhaXNlX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyICpjdHJsKQogewotICAgIC8qIFJhaXNlIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChieSBzZXR0aW5nIHRoZSBNREMKLSAgICAgKiBiaXQpLCBhbmQgdGhlbiBkZWxheSAxMCBtaWNyb3NlY29uZHMuCi0gICAgICovCi0gICAgZXczMihDVFJMLCAoKmN0cmwgfCBFMTAwMF9DVFJMX01EQykpOwotICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgdWRlbGF5KDEwKTsKKwkvKiBSYWlzZSB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIE1hbmFnZW1lbnQgRGF0YSBDbG9jayAoYnkgc2V0dGluZyB0aGUgTURDCisJICogYml0KSwgYW5kIHRoZW4gZGVsYXkgMTAgbWljcm9zZWNvbmRzLgorCSAqLworCWV3MzIoQ1RSTCwgKCpjdHJsIHwgRTEwMDBfQ1RSTF9NREMpKTsKKwlFMTAwMF9XUklURV9GTFVTSCgpOworCXVkZWxheSgxMCk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTG93ZXJzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSogY3RybCAtIERldmljZSBjb250cm9sIHJlZ2lzdGVyJ3MgY3VycmVudCB2YWx1ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9sb3dlcl9tZGlfY2xrIC0gTG93ZXJzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAY3RybDogRGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIncyBjdXJyZW50IHZhbHVlCisgKi8KIHN0YXRpYyB2b2lkIGUxMDAwX2xvd2VyX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyICpjdHJsKQogewotICAgIC8qIExvd2VyIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChieSBjbGVhcmluZyB0aGUgTURDCi0gICAgICogYml0KSwgYW5kIHRoZW4gZGVsYXkgMTAgbWljcm9zZWNvbmRzLgotICAgICAqLwotICAgIGV3MzIoQ1RSTCwgKCpjdHJsICYgfkUxMDAwX0NUUkxfTURDKSk7Ci0gICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICB1ZGVsYXkoMTApOworCS8qIExvd2VyIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChieSBjbGVhcmluZyB0aGUgTURDCisJICogYml0KSwgYW5kIHRoZW4gZGVsYXkgMTAgbWljcm9zZWNvbmRzLgorCSAqLworCWV3MzIoQ1RSTCwgKCpjdHJsICYgfkUxMDAwX0NUUkxfTURDKSk7CisJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwl1ZGVsYXkoMTApOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFNoaWZ0cyBkYXRhIGJpdHMgb3V0IHRvIHRoZSBQSFkKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSogZGF0YSAtIERhdGEgdG8gc2VuZCBvdXQgdG8gdGhlIFBIWQotKiBjb3VudCAtIE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IG91dAotKgotKiBCaXRzIGFyZSBzaGlmdGVkIG91dCBpbiBNU0IgdG8gTFNCIG9yZGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMgLSBTaGlmdHMgZGF0YSBiaXRzIG91dCB0byB0aGUgUEhZCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQGRhdGE6IERhdGEgdG8gc2VuZCBvdXQgdG8gdGhlIFBIWQorICogQGNvdW50OiBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKKyAqCisgKiBCaXRzIGFyZSBzaGlmdGVkIG91dCBpbiBNU0IgdG8gTFNCIG9yZGVyLgorICovCiBzdGF0aWMgdm9pZCBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGRhdGEsIHUxNiBjb3VudCkKIHsKLSAgICB1MzIgY3RybDsKLSAgICB1MzIgbWFzazsKKwl1MzIgY3RybDsKKwl1MzIgbWFzazsKIAotICAgIC8qIFdlIG5lZWQgdG8gc2hpZnQgImNvdW50IiBudW1iZXIgb2YgYml0cyBvdXQgdG8gdGhlIFBIWS4gU28sIHRoZSB2YWx1ZQotICAgICAqIGluIHRoZSAiZGF0YSIgcGFyYW1ldGVyIHdpbGwgYmUgc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBvbmUgYml0IGF0IGEKLSAgICAgKiB0aW1lLiBJbiBvcmRlciB0byBkbyB0aGlzLCAiZGF0YSIgbXVzdCBiZSBicm9rZW4gZG93biBpbnRvIGJpdHMuCi0gICAgICovCi0gICAgbWFzayA9IDB4MDE7Ci0gICAgbWFzayA8PD0gKGNvdW50IC0gMSk7CisJLyogV2UgbmVlZCB0byBzaGlmdCAiY291bnQiIG51bWJlciBvZiBiaXRzIG91dCB0byB0aGUgUEhZLiBTbywgdGhlIHZhbHVlCisJICogaW4gdGhlICJkYXRhIiBwYXJhbWV0ZXIgd2lsbCBiZSBzaGlmdGVkIG91dCB0byB0aGUgUEhZIG9uZSBiaXQgYXQgYQorCSAqIHRpbWUuIEluIG9yZGVyIHRvIGRvIHRoaXMsICJkYXRhIiBtdXN0IGJlIGJyb2tlbiBkb3duIGludG8gYml0cy4KKwkgKi8KKwltYXNrID0gMHgwMTsKKwltYXNrIDw8PSAoY291bnQgLSAxKTsKIAotICAgIGN0cmwgPSBlcjMyKENUUkwpOworCWN0cmwgPSBlcjMyKENUUkwpOwogCi0gICAgLyogU2V0IE1ESU9fRElSIGFuZCBNRENfRElSIGRpcmVjdGlvbiBiaXRzIHRvIGJlIHVzZWQgYXMgb3V0cHV0IHBpbnMuICovCi0gICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9NRElPX0RJUiB8IEUxMDAwX0NUUkxfTURDX0RJUik7CisJLyogU2V0IE1ESU9fRElSIGFuZCBNRENfRElSIGRpcmVjdGlvbiBiaXRzIHRvIGJlIHVzZWQgYXMgb3V0cHV0IHBpbnMuICovCisJY3RybCB8PSAoRTEwMDBfQ1RSTF9NRElPX0RJUiB8IEUxMDAwX0NUUkxfTURDX0RJUik7CiAKLSAgICB3aGlsZSAobWFzaykgewotICAgICAgICAvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgUEhZIGJ5IHNldHRpbmcgdGhlIE1ESU8gYml0IHRvICIxIiBhbmQKLSAgICAgICAgICogdGhlbiByYWlzaW5nIGFuZCBsb3dlcmluZyB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrLiBBICIwIiBpcwotICAgICAgICAgKiBzaGlmdGVkIG91dCB0byB0aGUgUEhZIGJ5IHNldHRpbmcgdGhlIE1ESU8gYml0IHRvICIwIiBhbmQgdGhlbgotICAgICAgICAgKiByYWlzaW5nIGFuZCBsb3dlcmluZyB0aGUgY2xvY2suCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZGF0YSAmIG1hc2spCi0gICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfTURJTzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9NRElPOworCXdoaWxlIChtYXNrKSB7CisJCS8qIEEgIjEiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBQSFkgYnkgc2V0dGluZyB0aGUgTURJTyBiaXQgdG8gIjEiIGFuZAorCQkgKiB0aGVuIHJhaXNpbmcgYW5kIGxvd2VyaW5nIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2suIEEgIjAiIGlzCisJCSAqIHNoaWZ0ZWQgb3V0IHRvIHRoZSBQSFkgYnkgc2V0dGluZyB0aGUgTURJTyBiaXQgdG8gIjAiIGFuZCB0aGVuCisJCSAqIHJhaXNpbmcgYW5kIGxvd2VyaW5nIHRoZSBjbG9jay4KKwkJICovCisJCWlmIChkYXRhICYgbWFzaykKKwkJCWN0cmwgfD0gRTEwMDBfQ1RSTF9NRElPOworCQllbHNlCisJCQljdHJsICY9IH5FMTAwMF9DVFJMX01ESU87CiAKLSAgICAgICAgZXczMihDVFJMLCBjdHJsKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKKwkJZXczMihDVFJMLCBjdHJsKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKIAotICAgICAgICB1ZGVsYXkoMTApOworCQl1ZGVsYXkoMTApOwogCi0gICAgICAgIGUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKLSAgICAgICAgZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworCQllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJCWUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKIAotICAgICAgICBtYXNrID0gbWFzayA+PiAxOwotICAgIH0KKwkJbWFzayA9IG1hc2sgPj4gMTsKKwl9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogU2hpZnRzIGRhdGEgYml0cyBpbiBmcm9tIHRoZSBQSFkKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSoKLSogQml0cyBhcmUgc2hpZnRlZCBpbiBpbiBNU0IgdG8gTFNCIG9yZGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyAtIFNoaWZ0cyBkYXRhIGJpdHMgaW4gZnJvbSB0aGUgUEhZCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIEJpdHMgYXJlIHNoaWZ0ZWQgaW4gaW4gTVNCIHRvIExTQiBvcmRlci4KKyAqLwogc3RhdGljIHUxNiBlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiBjdHJsOwotICAgIHUxNiBkYXRhID0gMDsKLSAgICB1OCBpOworCXUzMiBjdHJsOworCXUxNiBkYXRhID0gMDsKKwl1OCBpOwogCi0gICAgLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIFBIWSwgd2UgbmVlZCB0byBzaGlmdCBpbiBhIHRvdGFsCi0gICAgICogb2YgMTggYml0cyBmcm9tIHRoZSBQSFkuIFRoZSBmaXJzdCB0d28gYml0ICh0dXJuYXJvdW5kKSB0aW1lcyBhcmUgdXNlZAotICAgICAqIHRvIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIE1ESU8gcGluIHdoZW4gYSByZWFkIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCi0gICAgICogVGhlc2UgdHdvIGJpdHMgYXJlIGlnbm9yZWQgYnkgdXMgYW5kIHRocm93biBhd2F5LiBCaXRzIGFyZSAic2hpZnRlZCBpbiIKLSAgICAgKiBieSByYWlzaW5nIHRoZSBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChzZXR0aW5nIHRoZSBNREMgYml0KSwKLSAgICAgKiBhbmQgdGhlbiByZWFkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgTURJTyBiaXQuCi0gICAgICovCi0gICAgY3RybCA9IGVyMzIoQ1RSTCk7CisJLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIFBIWSwgd2UgbmVlZCB0byBzaGlmdCBpbiBhIHRvdGFsCisJICogb2YgMTggYml0cyBmcm9tIHRoZSBQSFkuIFRoZSBmaXJzdCB0d28gYml0ICh0dXJuYXJvdW5kKSB0aW1lcyBhcmUgdXNlZAorCSAqIHRvIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIE1ESU8gcGluIHdoZW4gYSByZWFkIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCisJICogVGhlc2UgdHdvIGJpdHMgYXJlIGlnbm9yZWQgYnkgdXMgYW5kIHRocm93biBhd2F5LiBCaXRzIGFyZSAic2hpZnRlZCBpbiIKKwkgKiBieSByYWlzaW5nIHRoZSBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChzZXR0aW5nIHRoZSBNREMgYml0KSwKKwkgKiBhbmQgdGhlbiByZWFkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgTURJTyBiaXQuCisJICovCisJY3RybCA9IGVyMzIoQ1RSTCk7CiAKLSAgICAvKiBDbGVhciBNRElPX0RJUiAoU1dEUElPMSkgdG8gaW5kaWNhdGUgdGhpcyBiaXQgaXMgdG8gYmUgdXNlZCBhcyBpbnB1dC4gKi8KLSAgICBjdHJsICY9IH5FMTAwMF9DVFJMX01ESU9fRElSOwotICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfTURJTzsKKwkvKiBDbGVhciBNRElPX0RJUiAoU1dEUElPMSkgdG8gaW5kaWNhdGUgdGhpcyBiaXQgaXMgdG8gYmUgdXNlZCBhcyBpbnB1dC4gKi8KKwljdHJsICY9IH5FMTAwMF9DVFJMX01ESU9fRElSOworCWN0cmwgJj0gfkUxMDAwX0NUUkxfTURJTzsKIAotICAgIGV3MzIoQ1RSTCwgY3RybCk7Ci0gICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKKwlldzMyKENUUkwsIGN0cmwpOworCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CiAKLSAgICAvKiBSYWlzZSBhbmQgTG93ZXIgdGhlIGNsb2NrIGJlZm9yZSByZWFkaW5nIGluIHRoZSBkYXRhLiBUaGlzIGFjY291bnRzIGZvcgotICAgICAqIHRoZSB0dXJuYXJvdW5kIGJpdHMuIFRoZSBmaXJzdCBjbG9jayBvY2N1cnJlZCB3aGVuIHdlIGNsb2NrZWQgb3V0IHRoZQotICAgICAqIGxhc3QgYml0IG9mIHRoZSBSZWdpc3RlciBBZGRyZXNzLgotICAgICAqLwotICAgIGUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKLSAgICBlMTAwMF9sb3dlcl9tZGlfY2xrKGh3LCAmY3RybCk7CisJLyogUmFpc2UgYW5kIExvd2VyIHRoZSBjbG9jayBiZWZvcmUgcmVhZGluZyBpbiB0aGUgZGF0YS4gVGhpcyBhY2NvdW50cyBmb3IKKwkgKiB0aGUgdHVybmFyb3VuZCBiaXRzLiBUaGUgZmlyc3QgY2xvY2sgb2NjdXJyZWQgd2hlbiB3ZSBjbG9ja2VkIG91dCB0aGUKKwkgKiBsYXN0IGJpdCBvZiB0aGUgUmVnaXN0ZXIgQWRkcmVzcy4KKwkgKi8KKwllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOwogCi0gICAgZm9yIChkYXRhID0gMCwgaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICAgIGRhdGEgPSBkYXRhIDw8IDE7Ci0gICAgICAgIGUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKLSAgICAgICAgY3RybCA9IGVyMzIoQ1RSTCk7Ci0gICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBzaGlmdGVkIGluIGEgIjEiLiAqLwotICAgICAgICBpZiAoY3RybCAmIEUxMDAwX0NUUkxfTURJTykKLSAgICAgICAgICAgIGRhdGEgfD0gMTsKLSAgICAgICAgZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOwotICAgIH0KKwlmb3IgKGRhdGEgPSAwLCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZGF0YSA9IGRhdGEgPDwgMTsKKwkJZTEwMDBfcmFpc2VfbWRpX2NsayhodywgJmN0cmwpOworCQljdHJsID0gZXIzMihDVFJMKTsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNoaWZ0ZWQgaW4gYSAiMSIuICovCisJCWlmIChjdHJsICYgRTEwMDBfQ1RSTF9NRElPKQorCQkJZGF0YSB8PSAxOworCQllMTAwMF9sb3dlcl9tZGlfY2xrKGh3LCAmY3RybCk7CisJfQogCi0gICAgZTEwMDBfcmFpc2VfbWRpX2NsayhodywgJmN0cmwpOwotICAgIGUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKKwllMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisJZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOwogCi0gICAgcmV0dXJuIGRhdGE7CisJcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyBzMzIgZTEwMDBfc3dmd19zeW5jX2FjcXVpcmUoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG1hc2spCi17Ci0gICAgdTMyIHN3Zndfc3luYyA9IDA7Ci0gICAgdTMyIHN3bWFzayA9IG1hc2s7Ci0gICAgdTMyIGZ3bWFzayA9IG1hc2sgPDwgMTY7Ci0gICAgczMyIHRpbWVvdXQgPSAyMDA7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3N3Zndfc3luY19hY3F1aXJlIik7Ci0KLSAgICBpZiAoaHctPnN3Zndod19zZW1hcGhvcmVfcHJlc2VudCkKLSAgICAgICAgcmV0dXJuIGUxMDAwX2dldF9zb2Z0d2FyZV9mbGFnKGh3KTsKLQotICAgIGlmICghaHctPnN3Zndfc3luY19wcmVzZW50KQotICAgICAgICByZXR1cm4gZTEwMDBfZ2V0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpOwotCi0gICAgd2hpbGUgKHRpbWVvdXQpIHsKLSAgICAgICAgICAgIGlmIChlMTAwMF9nZXRfaHdfZWVwcm9tX3NlbWFwaG9yZShodykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfU1dGV19TWU5DOwotCi0gICAgICAgICAgICBzd2Z3X3N5bmMgPSBlcjMyKFNXX0ZXX1NZTkMpOwotICAgICAgICAgICAgaWYgKCEoc3dmd19zeW5jICYgKGZ3bWFzayB8IHN3bWFzaykpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGZpcm13YXJlIGN1cnJlbnRseSB1c2luZyByZXNvdXJjZSAoZndtYXNrKSAqLwotICAgICAgICAgICAgLyogb3Igb3RoZXIgc29mdHdhcmUgdGhyZWFkIGN1cnJlbnRseSB1c2luZyByZXNvdXJjZSAoc3dtYXNrKSAqLwotICAgICAgICAgICAgZTEwMDBfcHV0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpOwotICAgICAgICAgICAgbWRlbGF5KDUpOwotICAgICAgICAgICAgdGltZW91dC0tOwotICAgIH0KLQotICAgIGlmICghdGltZW91dCkgewotICAgICAgICBERUJVR09VVCgiRHJpdmVyIGNhbid0IGFjY2VzcyByZXNvdXJjZSwgU1dfRldfU1lOQyB0aW1lb3V0LlxuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1NXRldfU1lOQzsKLSAgICB9Ci0KLSAgICBzd2Z3X3N5bmMgfD0gc3dtYXNrOwotICAgIGV3MzIoU1dfRldfU1lOQywgc3dmd19zeW5jKTsKLQotICAgIGUxMDAwX3B1dF9od19lZXByb21fc2VtYXBob3JlKGh3KTsKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2Uoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG1hc2spCi17Ci0gICAgdTMyIHN3Zndfc3luYzsKLSAgICB1MzIgc3dtYXNrID0gbWFzazsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UiKTsKLQotICAgIGlmIChody0+c3dmd2h3X3NlbWFwaG9yZV9wcmVzZW50KSB7Ci0gICAgICAgIGUxMDAwX3JlbGVhc2Vfc29mdHdhcmVfZmxhZyhodyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWh3LT5zd2Z3X3N5bmNfcHJlc2VudCkgewotICAgICAgICBlMTAwMF9wdXRfaHdfZWVwcm9tX3NlbWFwaG9yZShodyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBpZiAoZTEwMDBfZ2V0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpKQotICAgICAqICAgIHJldHVybiAtRTEwMDBfRVJSX1NXRldfU1lOQzsgKi8KLSAgICB3aGlsZSAoZTEwMDBfZ2V0X2h3X2VlcHJvbV9zZW1hcGhvcmUoaHcpICE9IEUxMDAwX1NVQ0NFU1MpOwotICAgICAgICAvKiBlbXB0eSAqLwotCi0gICAgc3dmd19zeW5jID0gZXIzMihTV19GV19TWU5DKTsKLSAgICBzd2Z3X3N5bmMgJj0gfnN3bWFzazsKLSAgICBldzMyKFNXX0ZXX1NZTkMsIHN3Zndfc3luYyk7Ci0KLSAgICBlMTAwMF9wdXRfaHdfZWVwcm9tX3NlbWFwaG9yZShodyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSZWFkcyB0aGUgdmFsdWUgZnJvbSBhIFBIWSByZWdpc3RlciwgaWYgdGhlIHZhbHVlIGlzIG9uIGEgc3BlY2lmaWMgbm9uIHplcm8KLSogcGFnZSwgc2V0cyB0aGUgcGFnZSBmaXJzdC4KLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSogcmVnX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gcmVhZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9yZWFkX3BoeV9yZWcgLSByZWFkIGEgcGh5IHJlZ2lzdGVyCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQHJlZ19hZGRyOiBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gcmVhZAorICoKKyAqIFJlYWRzIHRoZSB2YWx1ZSBmcm9tIGEgUEhZIHJlZ2lzdGVyLCBpZiB0aGUgdmFsdWUgaXMgb24gYSBzcGVjaWZpYyBub24gemVybworICogcGFnZSwgc2V0cyB0aGUgcGFnZSBmaXJzdC4KKyAqLwogczMyIGUxMDAwX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgcmVnX2FkZHIsIHUxNiAqcGh5X2RhdGEpCiB7Ci0gICAgdTMyIHJldF92YWw7Ci0gICAgdTE2IHN3Znc7CisJdTMyIHJldF92YWw7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfcGh5X3JlZyIpOworCURFQlVHRlVOQygiZTEwMDBfcmVhZF9waHlfcmVnIik7CiAKLSAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikgJiYKLSAgICAgICAgKGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpKSB7Ci0gICAgICAgIHN3ZncgPSBFMTAwMF9TV0ZXX1BIWTFfU007Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dmdyA9IEUxMDAwX1NXRldfUEhZMF9TTTsKLSAgICB9Ci0gICAgaWYgKGUxMDAwX3N3Zndfc3luY19hY3F1aXJlKGh3LCBzd2Z3KSkKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfU1dGV19TWU5DOworCWlmICgoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApICYmCisJICAgIChyZWdfYWRkciA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpKSB7CisJCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJCQkJCSAodTE2KSByZWdfYWRkcik7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQogCi0gICAgaWYgKChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCB8fAotICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8zIHx8Ci0gICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzIpICYmCi0gICAgICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2KXJlZ19hZGRyKTsKLSAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBzd2Z3KTsKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpIHsKLSAgICAgICAgaWYgKCgocmVnX2FkZHIgJiBNQVhfUEhZX1JFR19BRERSRVNTKSA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpIHx8Ci0gICAgICAgICAgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSkgewotICAgICAgICAgICAgLyogU2VsZWN0IENvbmZpZ3VyYXRpb24gUGFnZSAqLwotICAgICAgICAgICAgaWYgKChyZWdfYWRkciAmIE1BWF9QSFlfUkVHX0FERFJFU1MpIDwgR0c4MjU2M19NSU5fQUxUX1JFRykgewotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBHRzgyNTYzX1BIWV9QQUdFX1NFTEVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNikoKHUxNilyZWdfYWRkciA+PiBHRzgyNTYzX1BBR0VfU0hJRlQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogVXNlIEFsdGVybmF0aXZlIFBhZ2UgU2VsZWN0IHJlZ2lzdGVyIHRvIGFjY2VzcwotICAgICAgICAgICAgICAgICAqIHJlZ2lzdGVycyAzMCBhbmQgMzEKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19leChodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRzgyNTYzX1BIWV9QQUdFX1NFTEVDVF9BTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1MTYpKCh1MTYpcmVnX2FkZHIgPj4gR0c4MjU2M19QQUdFX1NISUZUKSk7Ci0gICAgICAgICAgICB9CisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZ19leChodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIHJlZ19hZGRyLAorCQkJCQlwaHlfZGF0YSk7CiAKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKSB7Ci0gICAgICAgICAgICAgICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZ19leChodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIHJlZ19hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotCi0gICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOwotICAgIHJldHVybiByZXRfdmFsOworCXJldHVybiByZXRfdmFsOwogfQogCiBzdGF0aWMgczMyIGUxMDAwX3JlYWRfcGh5X3JlZ19leChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgcmVnX2FkZHIsCiAJCQkJIHUxNiAqcGh5X2RhdGEpCiB7Ci0gICAgdTMyIGk7Ci0gICAgdTMyIG1kaWMgPSAwOwotICAgIGNvbnN0IHUzMiBwaHlfYWRkciA9IDE7CisJdTMyIGk7CisJdTMyIG1kaWMgPSAwOworCWNvbnN0IHUzMiBwaHlfYWRkciA9IDE7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfcGh5X3JlZ19leCIpOworCURFQlVHRlVOQygiZTEwMDBfcmVhZF9waHlfcmVnX2V4Iik7CiAKLSAgICBpZiAocmVnX2FkZHIgPiBNQVhfUEhZX1JFR19BRERSRVNTKSB7Ci0gICAgICAgIERFQlVHT1VUMSgiUEhZIEFkZHJlc3MgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWdfYWRkcik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BBUkFNOwotICAgIH0KKwlpZiAocmVnX2FkZHIgPiBNQVhfUEhZX1JFR19BRERSRVNTKSB7CisJCURFQlVHT1VUMSgiUEhZIEFkZHJlc3MgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWdfYWRkcik7CisJCXJldHVybiAtRTEwMDBfRVJSX1BBUkFNOworCX0KIAotICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgewotICAgICAgICAvKiBTZXQgdXAgT3AtY29kZSwgUGh5IEFkZHJlc3MsIGFuZCByZWdpc3RlciBhZGRyZXNzIGluIHRoZSBNREkKLSAgICAgICAgICogQ29udHJvbCByZWdpc3Rlci4gIFRoZSBNQUMgd2lsbCB0YWtlIGNhcmUgb2YgaW50ZXJmYWNpbmcgd2l0aCB0aGUKLSAgICAgICAgICogUEhZIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBtZGljID0gKChyZWdfYWRkciA8PCBFMTAwMF9NRElDX1JFR19TSElGVCkgfAotICAgICAgICAgICAgICAgIChwaHlfYWRkciA8PCBFMTAwMF9NRElDX1BIWV9TSElGVCkgfAotICAgICAgICAgICAgICAgIChFMTAwMF9NRElDX09QX1JFQUQpKTsKKwlpZiAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKwkJLyogU2V0IHVwIE9wLWNvZGUsIFBoeSBBZGRyZXNzLCBhbmQgcmVnaXN0ZXIgYWRkcmVzcyBpbiB0aGUgTURJCisJCSAqIENvbnRyb2wgcmVnaXN0ZXIuICBUaGUgTUFDIHdpbGwgdGFrZSBjYXJlIG9mIGludGVyZmFjaW5nIHdpdGggdGhlCisJCSAqIFBIWSB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBkYXRhLgorCQkgKi8KKwkJbWRpYyA9ICgocmVnX2FkZHIgPDwgRTEwMDBfTURJQ19SRUdfU0hJRlQpIHwKKwkJCShwaHlfYWRkciA8PCBFMTAwMF9NRElDX1BIWV9TSElGVCkgfAorCQkJKEUxMDAwX01ESUNfT1BfUkVBRCkpOwogCi0gICAgICAgIGV3MzIoTURJQywgbWRpYyk7CisJCWV3MzIoTURJQywgbWRpYyk7CiAKLSAgICAgICAgLyogUG9sbCB0aGUgcmVhZHkgYml0IHRvIHNlZSBpZiB0aGUgTURJIHJlYWQgY29tcGxldGVkICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0gICAgICAgICAgICB1ZGVsYXkoNTApOwotICAgICAgICAgICAgbWRpYyA9IGVyMzIoTURJQyk7Ci0gICAgICAgICAgICBpZiAobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSkgewotICAgICAgICAgICAgREVCVUdPVVQoIk1ESSBSZWFkIGRpZCBub3QgY29tcGxldGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtZGljICYgRTEwMDBfTURJQ19FUlJPUikgewotICAgICAgICAgICAgREVCVUdPVVQoIk1ESSBFcnJvclxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7Ci0gICAgICAgIH0KLSAgICAgICAgKnBoeV9kYXRhID0gKHUxNiltZGljOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFdlIG11c3QgZmlyc3Qgc2VuZCBhIHByZWFtYmxlIHRocm91Z2ggdGhlIE1ESU8gcGluIHRvIHNpZ25hbCB0aGUKLSAgICAgICAgICogYmVnaW5uaW5nIG9mIGFuIE1JSSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIDMyCi0gICAgICAgICAqIGNvbnNlY3V0aXZlICIxIiBiaXRzLgotICAgICAgICAgKi8KLSAgICAgICAgZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBQSFlfUFJFQU1CTEUsIFBIWV9QUkVBTUJMRV9TSVpFKTsKKwkJLyogUG9sbCB0aGUgcmVhZHkgYml0IHRvIHNlZSBpZiB0aGUgTURJIHJlYWQgY29tcGxldGVkICovCisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCQl1ZGVsYXkoNTApOworCQkJbWRpYyA9IGVyMzIoTURJQyk7CisJCQlpZiAobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpKSB7CisJCQlERUJVR09VVCgiTURJIFJlYWQgZGlkIG5vdCBjb21wbGV0ZVxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisJCX0KKwkJaWYgKG1kaWMgJiBFMTAwMF9NRElDX0VSUk9SKSB7CisJCQlERUJVR09VVCgiTURJIEVycm9yXG4iKTsKKwkJCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKKwkJfQorCQkqcGh5X2RhdGEgPSAodTE2KSBtZGljOworCX0gZWxzZSB7CisJCS8qIFdlIG11c3QgZmlyc3Qgc2VuZCBhIHByZWFtYmxlIHRocm91Z2ggdGhlIE1ESU8gcGluIHRvIHNpZ25hbCB0aGUKKwkJICogYmVnaW5uaW5nIG9mIGFuIE1JSSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIDMyCisJCSAqIGNvbnNlY3V0aXZlICIxIiBiaXRzLgorCQkgKi8KKwkJZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBQSFlfUFJFQU1CTEUsIFBIWV9QUkVBTUJMRV9TSVpFKTsKIAotICAgICAgICAvKiBOb3cgY29tYmluZSB0aGUgbmV4dCBmZXcgZmllbGRzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBhIHJlYWQKLSAgICAgICAgICogb3BlcmF0aW9uLiAgV2UgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgY2FsbGluZyB0aGUKLSAgICAgICAgICogZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzIHJvdXRpbmUgZml2ZSBkaWZmZXJlbnQgdGltZXMuIFRoZSBmb3JtYXQgb2YKLSAgICAgICAgICogYSBNSUkgcmVhZCBpbnN0cnVjdGlvbiBjb25zaXN0cyBvZiBhIHNoaWZ0IG91dCBvZiAxNCBiaXRzIGFuZCBpcwotICAgICAgICAgKiBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0gICAgICAgICAqICAgIDxQcmVhbWJsZT48U09GPjxPcCBDb2RlPjxQaHkgQWRkcj48UmVnIEFkZHI+Ci0gICAgICAgICAqIGZvbGxvd2VkIGJ5IGEgc2hpZnQgaW4gb2YgMTggYml0cy4gIFRoaXMgZmlyc3QgdHdvIGJpdHMgc2hpZnRlZCBpbgotICAgICAgICAgKiBhcmUgVHVybkFyb3VuZCBiaXRzIHVzZWQgdG8gYXZvaWQgY29udGVudGlvbiBvbiB0aGUgTURJTyBwaW4gd2hlbiBhCi0gICAgICAgICAqIFJFQUQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4gIFRoZXNlIHR3byBiaXRzIGFyZSB0aHJvd24gYXdheQotICAgICAgICAgKiBmb2xsb3dlZCBieSBhIHNoaWZ0IGluIG9mIDE2IGJpdHMgd2hpY2ggY29udGFpbnMgdGhlIGRlc2lyZWQgZGF0YS4KLSAgICAgICAgICovCi0gICAgICAgIG1kaWMgPSAoKHJlZ19hZGRyKSB8IChwaHlfYWRkciA8PCA1KSB8Ci0gICAgICAgICAgICAgICAgKFBIWV9PUF9SRUFEIDw8IDEwKSB8IChQSFlfU09GIDw8IDEyKSk7CisJCS8qIE5vdyBjb21iaW5lIHRoZSBuZXh0IGZldyBmaWVsZHMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIGEgcmVhZAorCQkgKiBvcGVyYXRpb24uICBXZSB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZQorCQkgKiBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMgcm91dGluZSBmaXZlIGRpZmZlcmVudCB0aW1lcy4gVGhlIGZvcm1hdCBvZgorCQkgKiBhIE1JSSByZWFkIGluc3RydWN0aW9uIGNvbnNpc3RzIG9mIGEgc2hpZnQgb3V0IG9mIDE0IGJpdHMgYW5kIGlzCisJCSAqIGRlZmluZWQgYXMgZm9sbG93czoKKwkJICogICAgPFByZWFtYmxlPjxTT0Y+PE9wIENvZGU+PFBoeSBBZGRyPjxSZWcgQWRkcj4KKwkJICogZm9sbG93ZWQgYnkgYSBzaGlmdCBpbiBvZiAxOCBiaXRzLiAgVGhpcyBmaXJzdCB0d28gYml0cyBzaGlmdGVkIGluCisJCSAqIGFyZSBUdXJuQXJvdW5kIGJpdHMgdXNlZCB0byBhdm9pZCBjb250ZW50aW9uIG9uIHRoZSBNRElPIHBpbiB3aGVuIGEKKwkJICogUkVBRCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLiAgVGhlc2UgdHdvIGJpdHMgYXJlIHRocm93biBhd2F5CisJCSAqIGZvbGxvd2VkIGJ5IGEgc2hpZnQgaW4gb2YgMTYgYml0cyB3aGljaCBjb250YWlucyB0aGUgZGVzaXJlZCBkYXRhLgorCQkgKi8KKwkJbWRpYyA9ICgocmVnX2FkZHIpIHwgKHBoeV9hZGRyIDw8IDUpIHwKKwkJCShQSFlfT1BfUkVBRCA8PCAxMCkgfCAoUEhZX1NPRiA8PCAxMikpOwogCi0gICAgICAgIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgbWRpYywgMTQpOworCQllMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIG1kaWMsIDE0KTsKIAotICAgICAgICAvKiBOb3cgdGhhdCB3ZSd2ZSBzaGlmdGVkIG91dCB0aGUgcmVhZCBjb21tYW5kIHRvIHRoZSBNSUksIHdlIG5lZWQgdG8KLSAgICAgICAgICogInNoaWZ0IGluIiB0aGUgMTYtYml0IHZhbHVlICgxOCB0b3RhbCBiaXRzKSBvZiB0aGUgcmVxdWVzdGVkIFBIWQotICAgICAgICAgKiByZWdpc3RlciBhZGRyZXNzLgotICAgICAgICAgKi8KLSAgICAgICAgKnBoeV9kYXRhID0gZTEwMDBfc2hpZnRfaW5fbWRpX2JpdHMoaHcpOwotICAgIH0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJLyogTm93IHRoYXQgd2UndmUgc2hpZnRlZCBvdXQgdGhlIHJlYWQgY29tbWFuZCB0byB0aGUgTUlJLCB3ZSBuZWVkIHRvCisJCSAqICJzaGlmdCBpbiIgdGhlIDE2LWJpdCB2YWx1ZSAoMTggdG90YWwgYml0cykgb2YgdGhlIHJlcXVlc3RlZCBQSFkKKwkJICogcmVnaXN0ZXIgYWRkcmVzcy4KKwkJICovCisJCSpwaHlfZGF0YSA9IGUxMDAwX3NoaWZ0X2luX21kaV9iaXRzKGh3KTsKKwl9CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogV3JpdGVzIGEgdmFsdWUgdG8gYSBQSFkgcmVnaXN0ZXIKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSogcmVnX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gd3JpdGUKLSogZGF0YSAtIGRhdGEgdG8gd3JpdGUgdG8gdGhlIFBIWQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF93cml0ZV9waHlfcmVnIC0gd3JpdGUgYSBwaHkgcmVnaXN0ZXIKKyAqCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQHJlZ19hZGRyOiBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gd3JpdGUKKyAqIEBkYXRhOiBkYXRhIHRvIHdyaXRlIHRvIHRoZSBQSFkKKworICogV3JpdGVzIGEgdmFsdWUgdG8gYSBQSFkgcmVnaXN0ZXIKKyAqLwogczMyIGUxMDAwX3dyaXRlX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZ19hZGRyLCB1MTYgcGh5X2RhdGEpCiB7Ci0gICAgdTMyIHJldF92YWw7Ci0gICAgdTE2IHN3Znc7CisJdTMyIHJldF92YWw7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX3BoeV9yZWciKTsKKwlERUJVR0ZVTkMoImUxMDAwX3dyaXRlX3BoeV9yZWciKTsKIAotICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSAmJgotICAgICAgICAoZXIzMihTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkpIHsKLSAgICAgICAgc3dmdyA9IEUxMDAwX1NXRldfUEhZMV9TTTsKLSAgICB9IGVsc2UgewotICAgICAgICBzd2Z3ID0gRTEwMDBfU1dGV19QSFkwX1NNOwotICAgIH0KLSAgICBpZiAoZTEwMDBfc3dmd19zeW5jX2FjcXVpcmUoaHcsIHN3ZncpKQotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9TV0ZXX1NZTkM7CisJaWYgKChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgJiYKKwkgICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKKwkJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorCQkJCQkJICh1MTYpIHJlZ19hZGRyKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CiAKLSAgICBpZiAoKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8Ci0gICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzMgfHwKLSAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMikgJiYKLSAgICAgICAocmVnX2FkZHIgPiBNQVhfUEhZX01VTFRJX1BBR0VfUkVHKSkgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19leChodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MTYpcmVnX2FkZHIpOwotICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOwotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfZ2c4MjU2MykgewotICAgICAgICBpZiAoKChyZWdfYWRkciAmIE1BWF9QSFlfUkVHX0FERFJFU1MpID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykgfHwKLSAgICAgICAgICAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pKSB7Ci0gICAgICAgICAgICAvKiBTZWxlY3QgQ29uZmlndXJhdGlvbiBQYWdlICovCi0gICAgICAgICAgICBpZiAoKHJlZ19hZGRyICYgTUFYX1BIWV9SRUdfQUREUkVTUykgPCBHRzgyNTYzX01JTl9BTFRfUkVHKSB7Ci0gICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIEdHODI1NjNfUEhZX1BBR0VfU0VMRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2KSgodTE2KXJlZ19hZGRyID4+IEdHODI1NjNfUEFHRV9TSElGVCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBVc2UgQWx0ZXJuYXRpdmUgUGFnZSBTZWxlY3QgcmVnaXN0ZXIgdG8gYWNjZXNzCi0gICAgICAgICAgICAgICAgICogcmVnaXN0ZXJzIDMwIGFuZCAzMQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHODI1NjNfUEhZX1BBR0VfU0VMRUNUX0FMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNikoKHUxNilyZWdfYWRkciA+PiBHRzgyNTYzX1BBR0VfU0hJRlQpKTsKLSAgICAgICAgICAgIH0KKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19leChodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIHJlZ19hZGRyLAorCQkJCQkgcGh5X2RhdGEpOwogCi0gICAgICAgICAgICBpZiAocmV0X3ZhbCkgewotICAgICAgICAgICAgICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBzd2Z3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgcmVnX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotCi0gICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOwotICAgIHJldHVybiByZXRfdmFsOworCXJldHVybiByZXRfdmFsOwogfQogCiBzdGF0aWMgczMyIGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZ19hZGRyLAogCQkJCSAgdTE2IHBoeV9kYXRhKQogewotICAgIHUzMiBpOwotICAgIHUzMiBtZGljID0gMDsKLSAgICBjb25zdCB1MzIgcGh5X2FkZHIgPSAxOworCXUzMiBpOworCXUzMiBtZGljID0gMDsKKwljb25zdCB1MzIgcGh5X2FkZHIgPSAxOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9waHlfcmVnX2V4Iik7CisJREVCVUdGVU5DKCJlMTAwMF93cml0ZV9waHlfcmVnX2V4Iik7CiAKLSAgICBpZiAocmVnX2FkZHIgPiBNQVhfUEhZX1JFR19BRERSRVNTKSB7Ci0gICAgICAgIERFQlVHT1VUMSgiUEhZIEFkZHJlc3MgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWdfYWRkcik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BBUkFNOwotICAgIH0KKwlpZiAocmVnX2FkZHIgPiBNQVhfUEhZX1JFR19BRERSRVNTKSB7CisJCURFQlVHT1VUMSgiUEhZIEFkZHJlc3MgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWdfYWRkcik7CisJCXJldHVybiAtRTEwMDBfRVJSX1BBUkFNOworCX0KIAotICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgewotICAgICAgICAvKiBTZXQgdXAgT3AtY29kZSwgUGh5IEFkZHJlc3MsIHJlZ2lzdGVyIGFkZHJlc3MsIGFuZCBkYXRhIGludGVuZGVkCi0gICAgICAgICAqIGZvciB0aGUgUEhZIHJlZ2lzdGVyIGluIHRoZSBNREkgQ29udHJvbCByZWdpc3Rlci4gIFRoZSBNQUMgd2lsbCB0YWtlCi0gICAgICAgICAqIGNhcmUgb2YgaW50ZXJmYWNpbmcgd2l0aCB0aGUgUEhZIHRvIHNlbmQgdGhlIGRlc2lyZWQgZGF0YS4KLSAgICAgICAgICovCi0gICAgICAgIG1kaWMgPSAoKCh1MzIpcGh5X2RhdGEpIHwKLSAgICAgICAgICAgICAgICAocmVnX2FkZHIgPDwgRTEwMDBfTURJQ19SRUdfU0hJRlQpIHwKLSAgICAgICAgICAgICAgICAocGh5X2FkZHIgPDwgRTEwMDBfTURJQ19QSFlfU0hJRlQpIHwKLSAgICAgICAgICAgICAgICAoRTEwMDBfTURJQ19PUF9XUklURSkpOworCWlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgeworCQkvKiBTZXQgdXAgT3AtY29kZSwgUGh5IEFkZHJlc3MsIHJlZ2lzdGVyIGFkZHJlc3MsIGFuZCBkYXRhIGludGVuZGVkCisJCSAqIGZvciB0aGUgUEhZIHJlZ2lzdGVyIGluIHRoZSBNREkgQ29udHJvbCByZWdpc3Rlci4gIFRoZSBNQUMgd2lsbCB0YWtlCisJCSAqIGNhcmUgb2YgaW50ZXJmYWNpbmcgd2l0aCB0aGUgUEhZIHRvIHNlbmQgdGhlIGRlc2lyZWQgZGF0YS4KKwkJICovCisJCW1kaWMgPSAoKCh1MzIpIHBoeV9kYXRhKSB8CisJCQkocmVnX2FkZHIgPDwgRTEwMDBfTURJQ19SRUdfU0hJRlQpIHwKKwkJCShwaHlfYWRkciA8PCBFMTAwMF9NRElDX1BIWV9TSElGVCkgfAorCQkJKEUxMDAwX01ESUNfT1BfV1JJVEUpKTsKIAotICAgICAgICBldzMyKE1ESUMsIG1kaWMpOworCQlldzMyKE1ESUMsIG1kaWMpOwogCi0gICAgICAgIC8qIFBvbGwgdGhlIHJlYWR5IGJpdCB0byBzZWUgaWYgdGhlIE1ESSByZWFkIGNvbXBsZXRlZCAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQxOyBpKyspIHsKLSAgICAgICAgICAgIHVkZWxheSg1KTsKLSAgICAgICAgICAgIG1kaWMgPSBlcjMyKE1ESUMpOwotICAgICAgICAgICAgaWYgKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShtZGljICYgRTEwMDBfTURJQ19SRUFEWSkpIHsKLSAgICAgICAgICAgIERFQlVHT1VUKCJNREkgV3JpdGUgZGlkIG5vdCBjb21wbGV0ZVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiBXZSdsbCBuZWVkIHRvIHVzZSB0aGUgU1cgZGVmaW5lZCBwaW5zIHRvIHNoaWZ0IHRoZSB3cml0ZSBjb21tYW5kCi0gICAgICAgICAqIG91dCB0byB0aGUgUEhZLiBXZSBmaXJzdCBzZW5kIGEgcHJlYW1ibGUgdG8gdGhlIFBIWSB0byBzaWduYWwgdGhlCi0gICAgICAgICAqIGJlZ2lubmluZyBvZiB0aGUgTUlJIGluc3RydWN0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IHNlbmRpbmcgMzIKLSAgICAgICAgICogY29uc2VjdXRpdmUgIjEiIGJpdHMuCi0gICAgICAgICAqLwotICAgICAgICBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIFBIWV9QUkVBTUJMRSwgUEhZX1BSRUFNQkxFX1NJWkUpOworCQkvKiBQb2xsIHRoZSByZWFkeSBiaXQgdG8gc2VlIGlmIHRoZSBNREkgcmVhZCBjb21wbGV0ZWQgKi8KKwkJZm9yIChpID0gMDsgaSA8IDY0MTsgaSsrKSB7CisJCQl1ZGVsYXkoNSk7CisJCQltZGljID0gZXIzMihNRElDKTsKKwkJCWlmIChtZGljICYgRTEwMDBfTURJQ19SRUFEWSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIShtZGljICYgRTEwMDBfTURJQ19SRUFEWSkpIHsKKwkJCURFQlVHT1VUKCJNREkgV3JpdGUgZGlkIG5vdCBjb21wbGV0ZVxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBXZSdsbCBuZWVkIHRvIHVzZSB0aGUgU1cgZGVmaW5lZCBwaW5zIHRvIHNoaWZ0IHRoZSB3cml0ZSBjb21tYW5kCisJCSAqIG91dCB0byB0aGUgUEhZLiBXZSBmaXJzdCBzZW5kIGEgcHJlYW1ibGUgdG8gdGhlIFBIWSB0byBzaWduYWwgdGhlCisJCSAqIGJlZ2lubmluZyBvZiB0aGUgTUlJIGluc3RydWN0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IHNlbmRpbmcgMzIKKwkJICogY29uc2VjdXRpdmUgIjEiIGJpdHMuCisJCSAqLworCQllMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIFBIWV9QUkVBTUJMRSwgUEhZX1BSRUFNQkxFX1NJWkUpOwogCi0gICAgICAgIC8qIE5vdyBjb21iaW5lIHRoZSByZW1haW5pbmcgcmVxdWlyZWQgZmllbGRzIHRoYXQgd2lsbCBpbmRpY2F0ZSBhCi0gICAgICAgICAqIHdyaXRlIG9wZXJhdGlvbi4gV2UgdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgY2FsbGluZyB0aGUKLSAgICAgICAgICogZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzIHJvdXRpbmUgZm9yIGVhY2ggZmllbGQgaW4gdGhlIGNvbW1hbmQuIFRoZQotICAgICAgICAgKiBmb3JtYXQgb2YgYSBNSUkgd3JpdGUgaW5zdHJ1Y3Rpb24gaXMgYXMgZm9sbG93czoKLSAgICAgICAgICogPFByZWFtYmxlPjxTT0Y+PE9wIENvZGU+PFBoeSBBZGRyPjxSZWcgQWRkcj48VHVybmFyb3VuZD48RGF0YT4uCi0gICAgICAgICAqLwotICAgICAgICBtZGljID0gKChQSFlfVFVSTkFST1VORCkgfCAocmVnX2FkZHIgPDwgMikgfCAocGh5X2FkZHIgPDwgNykgfAotICAgICAgICAgICAgICAgIChQSFlfT1BfV1JJVEUgPDwgMTIpIHwgKFBIWV9TT0YgPDwgMTQpKTsKLSAgICAgICAgbWRpYyA8PD0gMTY7Ci0gICAgICAgIG1kaWMgfD0gKHUzMilwaHlfZGF0YTsKKwkJLyogTm93IGNvbWJpbmUgdGhlIHJlbWFpbmluZyByZXF1aXJlZCBmaWVsZHMgdGhhdCB3aWxsIGluZGljYXRlIGEKKwkJICogd3JpdGUgb3BlcmF0aW9uLiBXZSB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZQorCQkgKiBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMgcm91dGluZSBmb3IgZWFjaCBmaWVsZCBpbiB0aGUgY29tbWFuZC4gVGhlCisJCSAqIGZvcm1hdCBvZiBhIE1JSSB3cml0ZSBpbnN0cnVjdGlvbiBpcyBhcyBmb2xsb3dzOgorCQkgKiA8UHJlYW1ibGU+PFNPRj48T3AgQ29kZT48UGh5IEFkZHI+PFJlZyBBZGRyPjxUdXJuYXJvdW5kPjxEYXRhPi4KKwkJICovCisJCW1kaWMgPSAoKFBIWV9UVVJOQVJPVU5EKSB8IChyZWdfYWRkciA8PCAyKSB8IChwaHlfYWRkciA8PCA3KSB8CisJCQkoUEhZX09QX1dSSVRFIDw8IDEyKSB8IChQSFlfU09GIDw8IDE0KSk7CisJCW1kaWMgPDw9IDE2OworCQltZGljIHw9ICh1MzIpIHBoeV9kYXRhOwogCi0gICAgICAgIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgbWRpYywgMzIpOwotICAgIH0KKwkJZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBtZGljLCAzMik7CisJfQogCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyBzMzIgZTEwMDBfcmVhZF9rbXJuX3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgcmVnX2FkZHIsIHUxNiAqZGF0YSkKLXsKLSAgICB1MzIgcmVnX3ZhbDsKLSAgICB1MTYgc3dmdzsKLSAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfa21ybl9yZWciKTsKLQotICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSAmJgotICAgICAgICAoZXIzMihTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkpIHsKLSAgICAgICAgc3dmdyA9IEUxMDAwX1NXRldfUEhZMV9TTTsKLSAgICB9IGVsc2UgewotICAgICAgICBzd2Z3ID0gRTEwMDBfU1dGV19QSFkwX1NNOwotICAgIH0KLSAgICBpZiAoZTEwMDBfc3dmd19zeW5jX2FjcXVpcmUoaHcsIHN3ZncpKQotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9TV0ZXX1NZTkM7Ci0KLSAgICAvKiBXcml0ZSByZWdpc3RlciBhZGRyZXNzICovCi0gICAgcmVnX3ZhbCA9ICgocmVnX2FkZHIgPDwgRTEwMDBfS1VNQ1RSTFNUQV9PRkZTRVRfU0hJRlQpICYKLSAgICAgICAgICAgICAgRTEwMDBfS1VNQ1RSTFNUQV9PRkZTRVQpIHwKLSAgICAgICAgICAgICAgRTEwMDBfS1VNQ1RSTFNUQV9SRU47Ci0gICAgZXczMihLVU1DVFJMU1RBLCByZWdfdmFsKTsKLSAgICB1ZGVsYXkoMik7Ci0KLSAgICAvKiBSZWFkIHRoZSBkYXRhIHJldHVybmVkICovCi0gICAgcmVnX3ZhbCA9IGVyMzIoS1VNQ1RSTFNUQSk7Ci0gICAgKmRhdGEgPSAodTE2KXJlZ192YWw7Ci0KLSAgICBlMTAwMF9zd2Z3X3N5bmNfcmVsZWFzZShodywgc3dmdyk7Ci0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBzMzIgZTEwMDBfd3JpdGVfa21ybl9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZ19hZGRyLCB1MTYgZGF0YSkKLXsKLSAgICB1MzIgcmVnX3ZhbDsKLSAgICB1MTYgc3dmdzsKLSAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX2ttcm5fcmVnIik7Ci0KLSAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikgJiYKLSAgICAgICAgKGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpKSB7Ci0gICAgICAgIHN3ZncgPSBFMTAwMF9TV0ZXX1BIWTFfU007Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dmdyA9IEUxMDAwX1NXRldfUEhZMF9TTTsKLSAgICB9Ci0gICAgaWYgKGUxMDAwX3N3Zndfc3luY19hY3F1aXJlKGh3LCBzd2Z3KSkKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfU1dGV19TWU5DOwotCi0gICAgcmVnX3ZhbCA9ICgocmVnX2FkZHIgPDwgRTEwMDBfS1VNQ1RSTFNUQV9PRkZTRVRfU0hJRlQpICYKLSAgICAgICAgICAgICAgRTEwMDBfS1VNQ1RSTFNUQV9PRkZTRVQpIHwgZGF0YTsKLSAgICBldzMyKEtVTUNUUkxTVEEsIHJlZ192YWwpOwotICAgIHVkZWxheSgyKTsKLQotICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBzd2Z3KTsKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSZXR1cm5zIHRoZSBQSFkgdG8gdGhlIHBvd2VyLW9uIHJlc2V0IHN0YXRlCi0qCi0qIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX3BoeV9od19yZXNldCAtIHJlc2V0IHRoZSBwaHksIGhhcmR3YXJlIHN0eWxlCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnMgdGhlIFBIWSB0byB0aGUgcG93ZXItb24gcmVzZXQgc3RhdGUKKyAqLwogczMyIGUxMDAwX3BoeV9od19yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiBjdHJsLCBjdHJsX2V4dDsKLSAgICB1MzIgbGVkX2N0cmw7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHN3Znc7CisJdTMyIGN0cmwsIGN0cmxfZXh0OworCXUzMiBsZWRfY3RybDsKKwlzMzIgcmV0X3ZhbDsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X2h3X3Jlc2V0Iik7CisJREVCVUdGVU5DKCJlMTAwMF9waHlfaHdfcmVzZXQiKTsKIAotICAgIC8qIEluIHRoZSBjYXNlIG9mIHRoZSBwaHkgcmVzZXQgYmVpbmcgYmxvY2tlZCwgaXQncyBub3QgYW4gZXJyb3IsIHdlCi0gICAgICogc2ltcGx5IHJldHVybiBzdWNjZXNzIHdpdGhvdXQgcGVyZm9ybWluZyB0aGUgcmVzZXQuICovCi0gICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jayhodyk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCURFQlVHT1VUKCJSZXNldHRpbmcgUGh5Li4uXG4iKTsKIAotICAgIERFQlVHT1VUKCJSZXNldHRpbmcgUGh5Li4uXG4iKTsKKwlpZiAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKwkJLyogUmVhZCB0aGUgZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIGFzc2VydCB0aGUgRTEwMDBfQ1RSTF9QSFlfUlNUCisJCSAqIGJpdC4gVGhlbiwgdGFrZSBpdCBvdXQgb2YgcmVzZXQuCisJCSAqIEZvciBlMTAwMCBoYXJkd2FyZSwgd2UgZGVsYXkgZm9yIDEwbXMgYmV0d2VlbiB0aGUgYXNzZXJ0CisJCSAqIGFuZCBkZWFzc2VydC4KKwkJICovCisJCWN0cmwgPSBlcjMyKENUUkwpOworCQlldzMyKENUUkwsIGN0cmwgfCBFMTAwMF9DVFJMX1BIWV9SU1QpOworCQlFMTAwMF9XUklURV9GTFVTSCgpOwogCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7Ci0gICAgICAgIGlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSAmJgotICAgICAgICAgICAgKGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpKSB7Ci0gICAgICAgICAgICBzd2Z3ID0gRTEwMDBfU1dGV19QSFkxX1NNOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dmdyA9IEUxMDAwX1NXRldfUEhZMF9TTTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZTEwMDBfc3dmd19zeW5jX2FjcXVpcmUoaHcsIHN3ZncpKSB7Ci0gICAgICAgICAgICBERUJVR09VVCgiVW5hYmxlIHRvIGFjcXVpcmUgc3dmdyBzeW5jXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1NXRldfU1lOQzsKLSAgICAgICAgfQotICAgICAgICAvKiBSZWFkIHRoZSBkZXZpY2UgY29udHJvbCByZWdpc3RlciBhbmQgYXNzZXJ0IHRoZSBFMTAwMF9DVFJMX1BIWV9SU1QKLSAgICAgICAgICogYml0LiBUaGVuLCB0YWtlIGl0IG91dCBvZiByZXNldC4KLSAgICAgICAgICogRm9yIHByZS1lMTAwMF84MjU3MSBoYXJkd2FyZSwgd2UgZGVsYXkgZm9yIDEwbXMgYmV0d2VlbiB0aGUgYXNzZXJ0Ci0gICAgICAgICAqIGFuZCBkZWFzc2VydC4gIEZvciBlMTAwMF84MjU3MSBoYXJkd2FyZSBhbmQgbGF0ZXIsIHdlIGluc3RlYWQgZGVsYXkKLSAgICAgICAgICogZm9yIDUwdXMgYmV0d2VlbiBhbmQgMTBtcyBhZnRlciB0aGUgZGVhc3NlcnRpb24uCi0gICAgICAgICAqLwotICAgICAgICBjdHJsID0gZXIzMihDVFJMKTsKLSAgICAgICAgZXczMihDVFJMLCBjdHJsIHwgRTEwMDBfQ1RSTF9QSFlfUlNUKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKKwkJbXNsZWVwKDEwKTsKIAotICAgICAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NzEpCi0gICAgICAgICAgICBtc2xlZXAoMTApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1ZGVsYXkoMTAwKTsKKwkJZXczMihDVFJMLCBjdHJsKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKIAotICAgICAgICBldzMyKENUUkwsIGN0cmwpOwotICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOworCX0gZWxzZSB7CisJCS8qIFJlYWQgdGhlIEV4dGVuZGVkIERldmljZSBDb250cm9sIFJlZ2lzdGVyLCBhc3NlcnQgdGhlIFBIWV9SRVNFVF9ESVIKKwkJICogYml0IHRvIHB1dCB0aGUgUEhZIGludG8gcmVzZXQuIFRoZW4sIHRha2UgaXQgb3V0IG9mIHJlc2V0LgorCQkgKi8KKwkJY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKKwkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfU0RQNF9ESVI7CisJCWN0cmxfZXh0ICY9IH5FMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEE7CisJCWV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwkJbXNsZWVwKDEwKTsKKwkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfU0RQNF9EQVRBOworCQlldzMyKENUUkxfRVhULCBjdHJsX2V4dCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CisJfQorCXVkZWxheSgxNTApOwogCi0gICAgICAgIGlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpCi0gICAgICAgICAgICBtZGVsYXkoMTApOworCWlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxKSB8fCAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgeworCQkvKiBDb25maWd1cmUgYWN0aXZpdHkgTEVEIGFmdGVyIFBIWSByZXNldCAqLworCQlsZWRfY3RybCA9IGVyMzIoTEVEQ1RMKTsKKwkJbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOworCQlsZWRfY3RybCB8PSAoSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgfCBJR1BfTEVEM19NT0RFKTsKKwkJZXczMihMRURDVEwsIGxlZF9jdHJsKTsKKwl9CiAKLSAgICAgICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIHN3ZncpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFJlYWQgdGhlIEV4dGVuZGVkIERldmljZSBDb250cm9sIFJlZ2lzdGVyLCBhc3NlcnQgdGhlIFBIWV9SRVNFVF9ESVIKLSAgICAgICAgICogYml0IHRvIHB1dCB0aGUgUEhZIGludG8gcmVzZXQuIFRoZW4sIHRha2UgaXQgb3V0IG9mIHJlc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKLSAgICAgICAgY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfU0RQNF9ESVI7Ci0gICAgICAgIGN0cmxfZXh0ICY9IH5FMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEE7Ci0gICAgICAgIGV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0KTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICAgICAgbXNsZWVwKDEwKTsKLSAgICAgICAgY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfU0RQNF9EQVRBOwotICAgICAgICBldzMyKENUUkxfRVhULCBjdHJsX2V4dCk7Ci0gICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgfQotICAgIHVkZWxheSgxNTApOworCS8qIFdhaXQgZm9yIEZXIHRvIGZpbmlzaCBQSFkgY29uZmlndXJhdGlvbi4gKi8KKwlyZXRfdmFsID0gZTEwMDBfZ2V0X3BoeV9jZmdfZG9uZShodyk7CisJaWYgKHJldF92YWwgIT0gRTEwMDBfU1VDQ0VTUykKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKLSAgICAgICAgLyogQ29uZmlndXJlIGFjdGl2aXR5IExFRCBhZnRlciBQSFkgcmVzZXQgKi8KLSAgICAgICAgbGVkX2N0cmwgPSBlcjMyKExFRENUTCk7Ci0gICAgICAgIGxlZF9jdHJsICY9IElHUF9BQ1RJVklUWV9MRURfTUFTSzsKLSAgICAgICAgbGVkX2N0cmwgfD0gKElHUF9BQ1RJVklUWV9MRURfRU5BQkxFIHwgSUdQX0xFRDNfTU9ERSk7Ci0gICAgICAgIGV3MzIoTEVEQ1RMLCBsZWRfY3RybCk7Ci0gICAgfQotCi0gICAgLyogV2FpdCBmb3IgRlcgdG8gZmluaXNoIFBIWSBjb25maWd1cmF0aW9uLiAqLwotICAgIHJldF92YWwgPSBlMTAwMF9nZXRfcGh5X2NmZ19kb25lKGh3KTsKLSAgICBpZiAocmV0X3ZhbCAhPSBFMTAwMF9TVUNDRVNTKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX3NlbWFwaG9yZShodyk7Ci0KLSAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSAmJiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMykpCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9pbml0X2xjZF9mcm9tX252bShodyk7Ci0KLSAgICByZXR1cm4gcmV0X3ZhbDsKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSZXNldHMgdGhlIFBIWQotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKgotKiBTZXRzIGJpdCAxNSBvZiB0aGUgTUlJIENvbnRyb2wgcmVnaXN0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfcGh5X3Jlc2V0IC0gcmVzZXQgdGhlIHBoeSB0byBjb21taXQgc2V0dGluZ3MKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmVzZXRzIHRoZSBQSFkKKyAqIFNldHMgYml0IDE1IG9mIHRoZSBNSUkgQ29udHJvbCByZWdpc3RlcgorICovCiBzMzIgZTEwMDBfcGh5X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHBoeV9kYXRhOworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfZGF0YTsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X3Jlc2V0Iik7CisJREVCVUdGVU5DKCJlMTAwMF9waHlfcmVzZXQiKTsKIAotICAgIC8qIEluIHRoZSBjYXNlIG9mIHRoZSBwaHkgcmVzZXQgYmVpbmcgYmxvY2tlZCwgaXQncyBub3QgYW4gZXJyb3IsIHdlCi0gICAgICogc2ltcGx5IHJldHVybiBzdWNjZXNzIHdpdGhvdXQgcGVyZm9ybWluZyB0aGUgcmVzZXQuICovCi0gICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jayhodyk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXN3aXRjaCAoaHctPnBoeV90eXBlKSB7CisJY2FzZSBlMTAwMF9waHlfaWdwOgorCQlyZXRfdmFsID0gZTEwMDBfcGh5X2h3X3Jlc2V0KGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICBzd2l0Y2ggKGh3LT5waHlfdHlwZSkgewotICAgIGNhc2UgZTEwMDBfcGh5X2lncDoKLSAgICBjYXNlIGUxMDAwX3BoeV9pZ3BfMjoKLSAgICBjYXNlIGUxMDAwX3BoeV9pZ3BfMzoKLSAgICBjYXNlIGUxMDAwX3BoeV9pZmU6Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfaHdfcmVzZXQoaHcpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkJcGh5X2RhdGEgfD0gTUlJX0NSX1JFU0VUOworCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIHBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBwaHlfZGF0YSB8PSBNSUlfQ1JfUkVTRVQ7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQl1ZGVsYXkoMSk7CisJCWJyZWFrOworCX0KIAotICAgICAgICB1ZGVsYXkoMSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApCisJCWUxMDAwX3BoeV9pbml0X3NjcmlwdChodyk7CiAKLSAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgfHwgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMikKLSAgICAgICAgZTEwMDBfcGh5X2luaXRfc2NyaXB0KGh3KTsKLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFdvcmstYXJvdW5kIGZvciA4MjU2NiBwb3dlci1kb3duOiBvbiBEMyBlbnRyeS0KLSogMSkgZGlzYWJsZSBnaWdhYml0IGxpbmsKLSogMikgd3JpdGUgVlIgcG93ZXItZG93biBlbmFibGUKLSogMykgcmVhZCBpdCBiYWNrCi0qIGlmIHN1Y2Nlc3NmdWwgY29udGludWUsIGVsc2UgaXNzdWUgTENEIHJlc2V0IGFuZCByZXBlYXQKLSoKLSogaHcgLSBzdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZTEwMDBfcGh5X3Bvd2VyZG93bl93b3JrYXJvdW5kKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgczMyIHJlZzsKLSAgICB1MTYgcGh5X2RhdGE7Ci0gICAgczMyIHJldHJ5ID0gMDsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X3Bvd2VyZG93bl93b3JrYXJvdW5kIik7Ci0KLSAgICBpZiAoaHctPnBoeV90eXBlICE9IGUxMDAwX3BoeV9pZ3BfMykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZG8gewotICAgICAgICAvKiBEaXNhYmxlIGxpbmsgKi8KLSAgICAgICAgcmVnID0gZXIzMihQSFlfQ1RSTCk7Ci0gICAgICAgIGV3MzIoUEhZX0NUUkwsIHJlZyB8IEUxMDAwX1BIWV9DVFJMX0dCRV9ESVNBQkxFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX1BIWV9DVFJMX05PTkQwQV9HQkVfRElTQUJMRSk7Ci0KLSAgICAgICAgLyogV3JpdGUgVlIgcG93ZXItZG93biBlbmFibGUgLSBiaXRzIDk6OCBzaG91bGQgYmUgMTBiICovCi0gICAgICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQM19WUl9DVFJMLCAmcGh5X2RhdGEpOwotICAgICAgICBwaHlfZGF0YSB8PSAoMSA8PCA5KTsKLSAgICAgICAgcGh5X2RhdGEgJj0gfigxIDw8IDgpOwotICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AzX1ZSX0NUUkwsIHBoeV9kYXRhKTsKLQotICAgICAgICAvKiBSZWFkIGl0IGJhY2sgYW5kIHRlc3QgKi8KLSAgICAgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AzX1ZSX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmICgoKHBoeV9kYXRhICYgSUdQM19WUl9DVFJMX01PREVfTUFTSykgPT0gSUdQM19WUl9DVFJMX01PREVfU0hVVCkgfHwgcmV0cnkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBJc3N1ZSBQSFkgcmVzZXQgYW5kIHJlcGVhdCBhdCBtb3N0IG9uZSBtb3JlIHRpbWUgKi8KLSAgICAgICAgcmVnID0gZXIzMihDVFJMKTsKLSAgICAgICAgZXczMihDVFJMLCByZWcgfCBFMTAwMF9DVFJMX1BIWV9SU1QpOwotICAgICAgICByZXRyeSsrOwotICAgIH0gd2hpbGUgKHJldHJ5KTsKLQotICAgIHJldHVybjsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFdvcmstYXJvdW5kIGZvciA4MjU2NiBLdW1lcmFuIFBDUyBsb2NrIGxvc3M6Ci0qIE9uIGxpbmsgc3RhdHVzIGNoYW5nZSAoaS5lLiBQQ0kgcmVzZXQsIHNwZWVkIGNoYW5nZSkgYW5kIGxpbmsgaXMgdXAgYW5kCi0qIHNwZWVkIGlzIGdpZ2FiaXQtCi0qIDApIGlmIHdvcmthcm91bmQgaXMgb3B0aW9uYWxseSBkaXNhYmxlZCBkbyBub3RoaW5nCi0qIDEpIHdhaXQgMW1zIGZvciBLdW1lcmFuIGxpbmsgdG8gY29tZSB1cAotKiAyKSBjaGVjayBLdW1lcmFuIERpYWdub3N0aWMgcmVnaXN0ZXIgUENTIGxvY2sgbG9zcyBiaXQKLSogMykgaWYgbm90IHNldCB0aGUgbGluayBpcyBsb2NrZWQgKGFsbCBpcyBnb29kKSwgb3RoZXJ3aXNlLi4uCi0qIDQpIHJlc2V0IHRoZSBQSFkKLSogNSkgcmVwZWF0IHVwIHRvIDEwIHRpbWVzCi0qIE5vdGU6IHRoaXMgaXMgb25seSBjYWxsZWQgZm9yIElHUDMgY29wcGVyIHdoZW4gc3BlZWQgaXMgMWdiLgotKgotKiBodyAtIHN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9rdW1lcmFuX2xvY2tfbG9zc193b3JrYXJvdW5kKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgczMyIHJldF92YWw7Ci0gICAgczMyIHJlZzsKLSAgICBzMzIgY250OwotICAgIHUxNiBwaHlfZGF0YTsKLQotICAgIGlmIChody0+a21ybl9sb2NrX2xvc3Nfd29ya2Fyb3VuZF9kaXNhYmxlZCkKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0KLSAgICAvKiBNYWtlIHN1cmUgbGluayBpcyB1cCBiZWZvcmUgcHJvY2VlZGluZy4gIElmIG5vdCBqdXN0IHJldHVybi4KLSAgICAgKiBBdHRlbXB0aW5nIHRoaXMgd2hpbGUgbGluayBpcyBuZWdvdGlhdGluZyBmb3VsZWQgdXAgbGluawotICAgICAqIHN0YWJpbGl0eSAqLwotICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7Ci0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKLQotICAgIGlmIChwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgewotICAgICAgICBmb3IgKGNudCA9IDA7IGNudCA8IDEwOyBjbnQrKykgewotICAgICAgICAgICAgLyogcmVhZCBvbmNlIHRvIGNsZWFyICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AzX0tNUk5fRElBRywgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgLyogYW5kIGFnYWluIHRvIGdldCBuZXcgc3RhdHVzICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AzX0tNUk5fRElBRywgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgICAgICAvKiBjaGVjayBmb3IgUENTIGxvY2sgKi8KLSAgICAgICAgICAgIGlmICghKHBoeV9kYXRhICYgSUdQM19LTVJOX0RJQUdfUENTX0xPQ0tfTE9TUykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0KLSAgICAgICAgICAgIC8qIElzc3VlIFBIWSByZXNldCAqLwotICAgICAgICAgICAgZTEwMDBfcGh5X2h3X3Jlc2V0KGh3KTsKLSAgICAgICAgICAgIG1kZWxheSg1KTsKLSAgICAgICAgfQotICAgICAgICAvKiBEaXNhYmxlIEdpZ0UgbGluayBuZWdvdGlhdGlvbiAqLwotICAgICAgICByZWcgPSBlcjMyKFBIWV9DVFJMKTsKLSAgICAgICAgZXczMihQSFlfQ1RSTCwgcmVnIHwgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfUEhZX0NUUkxfTk9ORDBBX0dCRV9ESVNBQkxFKTsKLQotICAgICAgICAvKiB1bmFibGUgdG8gYWNxdWlyZSBQQ1MgbG9jayAqLwotICAgICAgICByZXR1cm4gRTEwMDBfRVJSX1BIWTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBQcm9iZXMgdGhlIGV4cGVjdGVkIFBIWSBhZGRyZXNzIGZvciBrbm93biBQSFkgSURzCi0qCi0qIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX2RldGVjdF9naWdfcGh5IC0gY2hlY2sgdGhlIHBoeSB0eXBlCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFByb2JlcyB0aGUgZXhwZWN0ZWQgUEhZIGFkZHJlc3MgZm9yIGtub3duIFBIWSBJRHMKKyAqLwogc3RhdGljIHMzMiBlMTAwMF9kZXRlY3RfZ2lnX3BoeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHMzMiBwaHlfaW5pdF9zdGF0dXMsIHJldF92YWw7Ci0gICAgdTE2IHBoeV9pZF9oaWdoLCBwaHlfaWRfbG93OwotICAgIGJvb2wgbWF0Y2ggPSBmYWxzZTsKKwlzMzIgcGh5X2luaXRfc3RhdHVzLCByZXRfdmFsOworCXUxNiBwaHlfaWRfaGlnaCwgcGh5X2lkX2xvdzsKKwlib29sIG1hdGNoID0gZmFsc2U7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX2RldGVjdF9naWdfcGh5Iik7CisJREVCVUdGVU5DKCJlMTAwMF9kZXRlY3RfZ2lnX3BoeSIpOwogCi0gICAgaWYgKGh3LT5waHlfaWQgIT0gMCkKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJaWYgKGh3LT5waHlfaWQgIT0gMCkKKwkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiAKLSAgICAvKiBUaGUgODI1NzEgZmlybXdhcmUgbWF5IHN0aWxsIGJlIGNvbmZpZ3VyaW5nIHRoZSBQSFkuICBJbiB0aGlzCi0gICAgICogY2FzZSwgd2UgY2Fubm90IGFjY2VzcyB0aGUgUEhZIHVudGlsIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmUuICBTbwotICAgICAqIHdlIGV4cGxpY2l0bHkgc2V0IHRoZSBQSFkgdmFsdWVzLiAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzEgfHwKLSAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcyKSB7Ci0gICAgICAgIGh3LT5waHlfaWQgPSBJR1AwMUUxMDAwX0lfUEhZX0lEOwotICAgICAgICBody0+cGh5X3R5cGUgPSBlMTAwMF9waHlfaWdwXzI7Ci0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotICAgIH0KKwkvKiBSZWFkIHRoZSBQSFkgSUQgUmVnaXN0ZXJzIHRvIGlkZW50aWZ5IHdoaWNoIFBIWSBpcyBvbmJvYXJkLiAqLworCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9JRDEsICZwaHlfaWRfaGlnaCk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgLyogRVNCLTIgUEhZIHJlYWRzIHJlcXVpcmUgZTEwMDBfcGh5X2dnODI1NjMgdG8gYmUgc2V0IGJlY2F1c2Ugb2YgYSB3b3JrLQotICAgICAqIGFyb3VuZCB0aGF0IGZvcmNlcyBQSFkgcGFnZSAwIHRvIGJlIHNldCBvciB0aGUgcmVhZHMgZmFpbC4gIFRoZSByZXN0IG9mCi0gICAgICogdGhlIGNvZGUgaW4gdGhpcyByb3V0aW5lIHVzZXMgZTEwMDBfcmVhZF9waHlfcmVnIHRvIHJlYWQgdGhlIFBIWSBJRC4KLSAgICAgKiBTbyBmb3IgRVNCLTIgd2UgbmVlZCB0byBoYXZlIHRoaXMgc2V0IHNvIG91ciByZWFkcyB3b24ndCBmYWlsLiAgSWYgdGhlCi0gICAgICogYXR0YWNoZWQgUEhZIGlzIG5vdCBhIGUxMDAwX3BoeV9nZzgyNTYzLCB0aGUgcm91dGluZXMgYmVsb3cgd2lsbCBmaWd1cmUKLSAgICAgKiB0aGlzIG91dCBhcyB3ZWxsLiAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pCi0gICAgICAgIGh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV9nZzgyNTYzOworCWh3LT5waHlfaWQgPSAodTMyKSAocGh5X2lkX2hpZ2ggPDwgMTYpOworCXVkZWxheSgyMCk7CisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0lEMiwgJnBoeV9pZF9sb3cpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIC8qIFJlYWQgdGhlIFBIWSBJRCBSZWdpc3RlcnMgdG8gaWRlbnRpZnkgd2hpY2ggUEhZIGlzIG9uYm9hcmQuICovCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0lEMSwgJnBoeV9pZF9oaWdoKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJaHctPnBoeV9pZCB8PSAodTMyKSAocGh5X2lkX2xvdyAmIFBIWV9SRVZJU0lPTl9NQVNLKTsKKwlody0+cGh5X3JldmlzaW9uID0gKHUzMikgcGh5X2lkX2xvdyAmIH5QSFlfUkVWSVNJT05fTUFTSzsKIAotICAgIGh3LT5waHlfaWQgPSAodTMyKShwaHlfaWRfaGlnaCA8PCAxNik7Ci0gICAgdWRlbGF5KDIwKTsKLSAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfSUQyLCAmcGh5X2lkX2xvdyk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU0MzoKKwkJaWYgKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfRV9QSFlfSUQpCisJCQltYXRjaCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDQ6CisJCWlmIChody0+cGh5X2lkID09IE04OEUxMDAwX0lfUEhZX0lEKQorCQkJbWF0Y2ggPSB0cnVlOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQwOgorCWNhc2UgZTEwMDBfODI1NDU6CisJY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKwljYXNlIGUxMDAwXzgyNTQ2OgorCWNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisJCWlmIChody0+cGh5X2lkID09IE04OEUxMDExX0lfUEhZX0lEKQorCQkJbWF0Y2ggPSB0cnVlOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQxOgorCWNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisJY2FzZSBlMTAwMF84MjU0NzoKKwljYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorCQlpZiAoaHctPnBoeV9pZCA9PSBJR1AwMUUxMDAwX0lfUEhZX0lEKQorCQkJbWF0Y2ggPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVDEoIkludmFsaWQgTUFDIHR5cGUgJWRcbiIsIGh3LT5tYWNfdHlwZSk7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CisJcGh5X2luaXRfc3RhdHVzID0gZTEwMDBfc2V0X3BoeV90eXBlKGh3KTsKIAotICAgIGh3LT5waHlfaWQgfD0gKHUzMikocGh5X2lkX2xvdyAmIFBIWV9SRVZJU0lPTl9NQVNLKTsKLSAgICBody0+cGh5X3JldmlzaW9uID0gKHUzMilwaHlfaWRfbG93ICYgflBIWV9SRVZJU0lPTl9NQVNLOwotCi0gICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKLSAgICBjYXNlIGUxMDAwXzgyNTQzOgotICAgICAgICBpZiAoaHctPnBoeV9pZCA9PSBNODhFMTAwMF9FX1BIWV9JRCkgbWF0Y2ggPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwXzgyNTQ0OgotICAgICAgICBpZiAoaHctPnBoeV9pZCA9PSBNODhFMTAwMF9JX1BIWV9JRCkgbWF0Y2ggPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwXzgyNTQwOgotICAgIGNhc2UgZTEwMDBfODI1NDU6Ci0gICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKLSAgICBjYXNlIGUxMDAwXzgyNTQ2OgotICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6Ci0gICAgICAgIGlmIChody0+cGh5X2lkID09IE04OEUxMDExX0lfUEhZX0lEKSBtYXRjaCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgZTEwMDBfODI1NDE6Ci0gICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKLSAgICBjYXNlIGUxMDAwXzgyNTQ3OgotICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6Ci0gICAgICAgIGlmIChody0+cGh5X2lkID09IElHUDAxRTEwMDBfSV9QSFlfSUQpIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF84MjU3MzoKLSAgICAgICAgaWYgKGh3LT5waHlfaWQgPT0gTTg4RTExMTFfSV9QSFlfSUQpIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLSAgICAgICAgaWYgKGh3LT5waHlfaWQgPT0gR0c4MjU2M19FX1BIWV9JRCkgbWF0Y2ggPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwX2ljaDhsYW46Ci0gICAgICAgIGlmIChody0+cGh5X2lkID09IElHUDAzRTEwMDBfRV9QSFlfSUQpIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgaWYgKGh3LT5waHlfaWQgPT0gSUZFX0VfUEhZX0lEKSBtYXRjaCA9IHRydWU7Ci0gICAgICAgIGlmIChody0+cGh5X2lkID09IElGRV9QTFVTX0VfUEhZX0lEKSBtYXRjaCA9IHRydWU7Ci0gICAgICAgIGlmIChody0+cGh5X2lkID09IElGRV9DX0VfUEhZX0lEKSBtYXRjaCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIERFQlVHT1VUMSgiSW52YWxpZCBNQUMgdHlwZSAlZFxuIiwgaHctPm1hY190eXBlKTsKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOwotICAgIH0KLSAgICBwaHlfaW5pdF9zdGF0dXMgPSBlMTAwMF9zZXRfcGh5X3R5cGUoaHcpOwotCi0gICAgaWYgKChtYXRjaCkgJiYgKHBoeV9pbml0X3N0YXR1cyA9PSBFMTAwMF9TVUNDRVNTKSkgewotICAgICAgICBERUJVR09VVDEoIlBIWSBJRCAweCVYIGRldGVjdGVkXG4iLCBody0+cGh5X2lkKTsKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0gICAgfQotICAgIERFQlVHT1VUMSgiSW52YWxpZCBQSFkgSUQgMHglWFxuIiwgaHctPnBoeV9pZCk7Ci0gICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworCWlmICgobWF0Y2gpICYmIChwaHlfaW5pdF9zdGF0dXMgPT0gRTEwMDBfU1VDQ0VTUykpIHsKKwkJREVCVUdPVVQxKCJQSFkgSUQgMHglWCBkZXRlY3RlZFxuIiwgaHctPnBoeV9pZCk7CisJCXJldHVybiBFMTAwMF9TVUNDRVNTOworCX0KKwlERUJVR09VVDEoIkludmFsaWQgUEhZIElEIDB4JVhcbiIsIGh3LT5waHlfaWQpOworCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSZXNldHMgdGhlIFBIWSdzIERTUAotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9waHlfcmVzZXRfZHNwIC0gcmVzZXQgRFNQCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJlc2V0cyB0aGUgUEhZJ3MgRFNQCisgKi8KIHN0YXRpYyBzMzIgZTEwMDBfcGh5X3Jlc2V0X2RzcChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHMzMiByZXRfdmFsOwotICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X3Jlc2V0X2RzcCIpOworCXMzMiByZXRfdmFsOworCURFQlVHRlVOQygiZTEwMDBfcGh5X3Jlc2V0X2RzcCIpOwogCi0gICAgZG8gewotICAgICAgICBpZiAoaHctPnBoeV90eXBlICE9IGUxMDAwX3BoeV9nZzgyNTYzKSB7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMjksIDB4MDAxZCk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDMwLCAweDAwYzEpOwotICAgICAgICBpZiAocmV0X3ZhbCkgYnJlYWs7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAzMCwgMHgwMDAwKTsKLSAgICAgICAgaWYgKHJldF92YWwpIGJyZWFrOwotICAgICAgICByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKLSAgICB9IHdoaWxlICgwKTsKKwlkbyB7CisJCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAyOSwgMHgwMDFkKTsKKwkJaWYgKHJldF92YWwpCisJCQlicmVhazsKKwkJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDMwLCAweDAwYzEpOworCQlpZiAocmV0X3ZhbCkKKwkJCWJyZWFrOworCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMzAsIDB4MDAwMCk7CisJCWlmIChyZXRfdmFsKQorCQkJYnJlYWs7CisJCXJldF92YWwgPSBFMTAwMF9TVUNDRVNTOworCX0gd2hpbGUgKDApOwogCi0gICAgcmV0dXJuIHJldF92YWw7CisJcmV0dXJuIHJldF92YWw7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogR2V0IFBIWSBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMgUEhZIHJlZ2lzdGVycyBmb3IgaWdwIFBIWSBvbmx5LgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKiBwaHlfaW5mbyAtIFBIWSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfcGh5X2lncF9nZXRfaW5mbyAtIGdldCBpZ3Agc3BlY2lmaWMgcmVnaXN0ZXJzCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQHBoeV9pbmZvOiBQSFkgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKgorICogR2V0IFBIWSBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMgUEhZIHJlZ2lzdGVycyBmb3IgaWdwIFBIWSBvbmx5LgorICovCiBzdGF0aWMgczMyIGUxMDAwX3BoeV9pZ3BfZ2V0X2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywKIAkJCQkgIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pCiB7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHBoeV9kYXRhLCBtaW5fbGVuZ3RoLCBtYXhfbGVuZ3RoLCBhdmVyYWdlOwotICAgIGUxMDAwX3Jldl9wb2xhcml0eSBwb2xhcml0eTsKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgcGh5X2RhdGEsIG1pbl9sZW5ndGgsIG1heF9sZW5ndGgsIGF2ZXJhZ2U7CisJZTEwMDBfcmV2X3BvbGFyaXR5IHBvbGFyaXR5OwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9waHlfaWdwX2dldF9pbmZvIik7CisJREVCVUdGVU5DKCJlMTAwMF9waHlfaWdwX2dldF9pbmZvIik7CiAKLSAgICAvKiBUaGUgZG93bnNoaWZ0IHN0YXR1cyBpcyBjaGVja2VkIG9ubHkgb25jZSwgYWZ0ZXIgbGluayBpcyBlc3RhYmxpc2hlZCwKLSAgICAgKiBhbmQgaXQgc3RvcmVkIGluIHRoZSBody0+c3BlZWRfZG93bmdyYWRlZCBwYXJhbWV0ZXIuICovCi0gICAgcGh5X2luZm8tPmRvd25zaGlmdCA9IChlMTAwMF9kb3duc2hpZnQpaHctPnNwZWVkX2Rvd25ncmFkZWQ7CisJLyogVGhlIGRvd25zaGlmdCBzdGF0dXMgaXMgY2hlY2tlZCBvbmx5IG9uY2UsIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQsCisJICogYW5kIGl0IHN0b3JlZCBpbiB0aGUgaHctPnNwZWVkX2Rvd25ncmFkZWQgcGFyYW1ldGVyLiAqLworCXBoeV9pbmZvLT5kb3duc2hpZnQgPSAoZTEwMDBfZG93bnNoaWZ0KSBody0+c3BlZWRfZG93bmdyYWRlZDsKIAotICAgIC8qIElHUDAxRTEwMDAgZG9lcyBub3QgbmVlZCB0byBzdXBwb3J0IGl0LiAqLwotICAgIHBoeV9pbmZvLT5leHRlbmRlZF8xMGJ0X2Rpc3RhbmNlID0gZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbm9ybWFsOworCS8qIElHUDAxRTEwMDAgZG9lcyBub3QgbmVlZCB0byBzdXBwb3J0IGl0LiAqLworCXBoeV9pbmZvLT5leHRlbmRlZF8xMGJ0X2Rpc3RhbmNlID0gZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbm9ybWFsOwogCi0gICAgLyogSUdQMDFFMTAwMCBhbHdheXMgY29ycmVjdCBwb2xhcml0eSByZXZlcnNhbCAqLwotICAgIHBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID0gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZW5hYmxlZDsKKwkvKiBJR1AwMUUxMDAwIGFsd2F5cyBjb3JyZWN0IHBvbGFyaXR5IHJldmVyc2FsICovCisJcGh5X2luZm8tPnBvbGFyaXR5X2NvcnJlY3Rpb24gPSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF9lbmFibGVkOwogCi0gICAgLyogQ2hlY2sgcG9sYXJpdHkgc3RhdHVzICovCi0gICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BvbGFyaXR5KGh3LCAmcG9sYXJpdHkpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkvKiBDaGVjayBwb2xhcml0eSBzdGF0dXMgKi8KKwlyZXRfdmFsID0gZTEwMDBfY2hlY2tfcG9sYXJpdHkoaHcsICZwb2xhcml0eSk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgcGh5X2luZm8tPmNhYmxlX3BvbGFyaXR5ID0gcG9sYXJpdHk7CisJcGh5X2luZm8tPmNhYmxlX3BvbGFyaXR5ID0gcG9sYXJpdHk7CiAKLSAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX1NUQVRVUywgJnBoeV9kYXRhKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMsICZwaHlfZGF0YSk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgcGh5X2luZm8tPm1kaXhfbW9kZSA9IChlMTAwMF9hdXRvX3hfbW9kZSkoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX01ESVgpID4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUFNTUl9NRElYX1NISUZUKTsKKwlwaHlfaW5mby0+bWRpeF9tb2RlID0KKwkgICAgKGUxMDAwX2F1dG9feF9tb2RlKSAoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX01ESVgpID4+CisJCQkJIElHUDAxRTEwMDBfUFNTUl9NRElYX1NISUZUKTsKIAotICAgIGlmICgocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSykgPT0KLSAgICAgICBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwME1CUFMpIHsKLSAgICAgICAgLyogTG9jYWwvUmVtb3RlIFJlY2VpdmVyIEluZm9ybWF0aW9uIGFyZSBvbmx5IHZhbGlkIGF0IDEwMDAgTWJwcyAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCWlmICgocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSykgPT0KKwkgICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTKSB7CisJCS8qIExvY2FsL1JlbW90ZSBSZWNlaXZlciBJbmZvcm1hdGlvbiBhcmUgb25seSB2YWxpZCBhdCAxMDAwIE1icHMgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBwaHlfaW5mby0+bG9jYWxfcnggPSAoKHBoeV9kYXRhICYgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVNfU0hJRlQpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rIDogZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vazsKLSAgICAgICAgcGh5X2luZm8tPnJlbW90ZV9yeCA9ICgocGh5X2RhdGEgJiBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVU19TSElGVCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rIDogZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vazsKKwkJcGh5X2luZm8tPmxvY2FsX3J4ID0gKChwaHlfZGF0YSAmIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUykgPj4KKwkJCQkgICAgICBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVNfU0hJRlQpID8KKwkJICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1c19vayA6IGUxMDAwXzEwMDB0X3J4X3N0YXR1c19ub3Rfb2s7CisJCXBoeV9pbmZvLT5yZW1vdGVfcnggPSAoKHBoeV9kYXRhICYgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVUykgPj4KKwkJCQkgICAgICAgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVU19TSElGVCkgPworCQkgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rIDogZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vazsKIAotICAgICAgICAvKiBHZXQgY2FibGUgbGVuZ3RoICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKGh3LCAmbWluX2xlbmd0aCwgJm1heF9sZW5ndGgpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkvKiBHZXQgY2FibGUgbGVuZ3RoICovCisJCXJldF92YWwgPSBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKGh3LCAmbWluX2xlbmd0aCwgJm1heF9sZW5ndGgpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgIC8qIFRyYW5zbGF0ZSB0byBvbGQgbWV0aG9kICovCi0gICAgICAgIGF2ZXJhZ2UgPSAobWF4X2xlbmd0aCArIG1pbl9sZW5ndGgpIC8gMjsKKwkJLyogVHJhbnNsYXRlIHRvIG9sZCBtZXRob2QgKi8KKwkJYXZlcmFnZSA9IChtYXhfbGVuZ3RoICsgbWluX2xlbmd0aCkgLyAyOwogCi0gICAgICAgIGlmIChhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApCi0gICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzUwOwotICAgICAgICBlbHNlIGlmIChhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfODApCi0gICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwOwotICAgICAgICBlbHNlIGlmIChhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTEwKQotICAgICAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF84MF8xMTA7Ci0gICAgICAgIGVsc2UgaWYgKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNDApCi0gICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzExMF8xNDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfMTQwOwotICAgIH0KKwkJaWYgKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkKKwkJCXBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfNTA7CisJCWVsc2UgaWYgKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF84MCkKKwkJCXBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfNTBfODA7CisJCWVsc2UgaWYgKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTApCisJCQlwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzgwXzExMDsKKwkJZWxzZSBpZiAoYXZlcmFnZSA8PSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE0MCkKKwkJCXBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfMTEwXzE0MDsKKwkJZWxzZQorCQkJcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF8xNDA7CisJfQogCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogR2V0IFBIWSBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMgUEhZIHJlZ2lzdGVycyBmb3IgaWZlIFBIWSBvbmx5LgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKiBwaHlfaW5mbyAtIFBIWSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfcGh5X2lmZV9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAotCQkJCSAgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbykKLXsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICB1MTYgcGh5X2RhdGE7Ci0gICAgZTEwMDBfcmV2X3BvbGFyaXR5IHBvbGFyaXR5OwotCi0gICAgREVCVUdGVU5DKCJlMTAwMF9waHlfaWZlX2dldF9pbmZvIik7Ci0KLSAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gKGUxMDAwX2Rvd25zaGlmdClody0+c3BlZWRfZG93bmdyYWRlZDsKLSAgICBwaHlfaW5mby0+ZXh0ZW5kZWRfMTBidF9kaXN0YW5jZSA9IGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbDsKLQotICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MLCAmcGh5X2RhdGEpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICBwaHlfaW5mby0+cG9sYXJpdHlfY29ycmVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKHBoeV9kYXRhICYgSUZFX1BTQ19BVVRPX1BPTEFSSVRZX0RJU0FCTEUpID4+Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRkVfUFNDX0FVVE9fUE9MQVJJVFlfRElTQUJMRV9TSElGVCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZGlzYWJsZWQgOiBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF9lbmFibGVkOwotCi0gICAgaWYgKHBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID09IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2VuYWJsZWQpIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BvbGFyaXR5KGh3LCAmcG9sYXJpdHkpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFBvbGFyaXR5IGlzIGZvcmNlZC4gKi8KLSAgICAgICAgcG9sYXJpdHkgPSAoKHBoeV9kYXRhICYgSUZFX1BTQ19GT1JDRV9QT0xBUklUWSkgPj4KLSAgICAgICAgICAgICAgICAgICAgIElGRV9QU0NfRk9SQ0VfUE9MQVJJVFlfU0hJRlQpID8KLSAgICAgICAgICAgICAgICAgICAgIGUxMDAwX3Jldl9wb2xhcml0eV9yZXZlcnNlZCA6IGUxMDAwX3Jldl9wb2xhcml0eV9ub3JtYWw7Ci0gICAgfQotICAgIHBoeV9pbmZvLT5jYWJsZV9wb2xhcml0eSA9IHBvbGFyaXR5OwotCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUZFX1BIWV9NRElYX0NPTlRST0wsICZwaHlfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgcGh5X2luZm8tPm1kaXhfbW9kZSA9IChlMTAwMF9hdXRvX3hfbW9kZSkKLSAgICAgICAgICAgICAgICAgICAgICgocGh5X2RhdGEgJiAoSUZFX1BNQ19BVVRPX01ESVggfCBJRkVfUE1DX0ZPUkNFX01ESVgpKSA+PgotICAgICAgICAgICAgICAgICAgICAgSUZFX1BNQ19NRElYX01PREVfU0hJRlQpOwotCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogR2V0IFBIWSBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMgUEhZIHJlZ2lzdGVycyBmb3QgbTg4IFBIWSBvbmx5LgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKiBwaHlfaW5mbyAtIFBIWSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfcGh5X204OF9nZXRfaW5mbyAtIGdldCBtODggc3BlY2lmaWMgcmVnaXN0ZXJzCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQHBoeV9pbmZvOiBQSFkgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKgorICogR2V0IFBIWSBpbmZvcm1hdGlvbiBmcm9tIHZhcmlvdXMgUEhZIHJlZ2lzdGVycyBmb3IgbTg4IFBIWSBvbmx5LgorICovCiBzdGF0aWMgczMyIGUxMDAwX3BoeV9tODhfZ2V0X2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywKIAkJCQkgIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pCiB7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHBoeV9kYXRhOwotICAgIGUxMDAwX3Jldl9wb2xhcml0eSBwb2xhcml0eTsKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgcGh5X2RhdGE7CisJZTEwMDBfcmV2X3BvbGFyaXR5IHBvbGFyaXR5OwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9waHlfbTg4X2dldF9pbmZvIik7CisJREVCVUdGVU5DKCJlMTAwMF9waHlfbTg4X2dldF9pbmZvIik7CiAKLSAgICAvKiBUaGUgZG93bnNoaWZ0IHN0YXR1cyBpcyBjaGVja2VkIG9ubHkgb25jZSwgYWZ0ZXIgbGluayBpcyBlc3RhYmxpc2hlZCwKLSAgICAgKiBhbmQgaXQgc3RvcmVkIGluIHRoZSBody0+c3BlZWRfZG93bmdyYWRlZCBwYXJhbWV0ZXIuICovCi0gICAgcGh5X2luZm8tPmRvd25zaGlmdCA9IChlMTAwMF9kb3duc2hpZnQpaHctPnNwZWVkX2Rvd25ncmFkZWQ7CisJLyogVGhlIGRvd25zaGlmdCBzdGF0dXMgaXMgY2hlY2tlZCBvbmx5IG9uY2UsIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQsCisJICogYW5kIGl0IHN0b3JlZCBpbiB0aGUgaHctPnNwZWVkX2Rvd25ncmFkZWQgcGFyYW1ldGVyLiAqLworCXBoeV9pbmZvLT5kb3duc2hpZnQgPSAoZTEwMDBfZG93bnNoaWZ0KSBody0+c3BlZWRfZG93bmdyYWRlZDsKIAotICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgcGh5X2luZm8tPmV4dGVuZGVkXzEwYnRfZGlzdGFuY2UgPQotICAgICAgICAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRSkgPj4KLSAgICAgICAgTTg4RTEwMDBfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRV9TSElGVCkgPwotICAgICAgICBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV9sb3dlciA6IGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbDsKKwlwaHlfaW5mby0+ZXh0ZW5kZWRfMTBidF9kaXN0YW5jZSA9CisJICAgICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFKSA+PgorCSAgICAgTTg4RTEwMDBfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRV9TSElGVCkgPworCSAgICBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV9sb3dlciA6CisJICAgIGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbDsKIAotICAgIHBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID0KLSAgICAgICAgKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUwpID4+Ci0gICAgICAgIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUxfU0hJRlQpID8KLSAgICAgICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZGlzYWJsZWQgOiBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF9lbmFibGVkOworCXBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID0KKwkgICAgKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUwpID4+CisJICAgICBNODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMX1NISUZUKSA/CisJICAgIGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2Rpc2FibGVkIDogZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZW5hYmxlZDsKIAotICAgIC8qIENoZWNrIHBvbGFyaXR5IHN0YXR1cyAqLwotICAgIHJldF92YWwgPSBlMTAwMF9jaGVja19wb2xhcml0eShodywgJnBvbGFyaXR5KTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgcGh5X2luZm8tPmNhYmxlX3BvbGFyaXR5ID0gcG9sYXJpdHk7CisJLyogQ2hlY2sgcG9sYXJpdHkgc3RhdHVzICovCisJcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BvbGFyaXR5KGh3LCAmcG9sYXJpdHkpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlwaHlfaW5mby0+Y2FibGVfcG9sYXJpdHkgPSBwb2xhcml0eTsKIAotICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywgJnBoeV9kYXRhKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLCAmcGh5X2RhdGEpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIHBoeV9pbmZvLT5tZGl4X21vZGUgPSAoZTEwMDBfYXV0b194X21vZGUpKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfTURJWCkgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfUFNTUl9NRElYX1NISUZUKTsKKwlwaHlfaW5mby0+bWRpeF9tb2RlID0KKwkgICAgKGUxMDAwX2F1dG9feF9tb2RlKSAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9NRElYKSA+PgorCQkJCSBNODhFMTAwMF9QU1NSX01ESVhfU0hJRlQpOwogCi0gICAgaWYgKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfU1BFRUQpID09IE04OEUxMDAwX1BTU1JfMTAwME1CUykgewotICAgICAgICAvKiBDYWJsZSBMZW5ndGggRXN0aW1hdGlvbiBhbmQgTG9jYWwvUmVtb3RlIFJlY2VpdmVyIEluZm9ybWF0aW9uCi0gICAgICAgICAqIGFyZSBvbmx5IHZhbGlkIGF0IDEwMDAgTWJwcy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2dnODI1NjMpIHsKLSAgICAgICAgICAgIHBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSAoZTEwMDBfY2FibGVfbGVuZ3RoKSgocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCkgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgR0c4MjU2M19QSFlfRFNQX0RJU1RBTkNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJaWYgKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfU1BFRUQpID09IE04OEUxMDAwX1BTU1JfMTAwME1CUykgeworCQkvKiBDYWJsZSBMZW5ndGggRXN0aW1hdGlvbiBhbmQgTG9jYWwvUmVtb3RlIFJlY2VpdmVyIEluZm9ybWF0aW9uCisJCSAqIGFyZSBvbmx5IHZhbGlkIGF0IDEwMDAgTWJwcy4KKwkJICovCisJCXBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPQorCQkgICAgKGUxMDAwX2NhYmxlX2xlbmd0aCkgKChwaHlfZGF0YSAmCisJCQkJCSAgIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIKSA+PgorCQkJCQkgIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIX1NISUZUKTsKIAotICAgICAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IChlMTAwMF9jYWJsZV9sZW5ndGgpKHBoeV9kYXRhICYgR0c4MjU2M19EU1BEX0NBQkxFX0xFTkdUSCk7Ci0gICAgICAgIH0KKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQlwaHlfaW5mby0+bG9jYWxfcnggPSAoKHBoeV9kYXRhICYgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTKSA+PgorCQkJCSAgICAgIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVU19TSElGVCkgPworCQkgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rIDogZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vazsKKwkJcGh5X2luZm8tPnJlbW90ZV9yeCA9ICgocGh5X2RhdGEgJiBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTKSA+PgorCQkJCSAgICAgICBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTX1NISUZUKSA/CisJCSAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfb2sgOiBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfbm90X29rOwogCi0gICAgICAgIHBoeV9pbmZvLT5sb2NhbF9yeCA9ICgocGh5X2RhdGEgJiBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVMpID4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVU19TSElGVCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfb2sgOiBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfbm90X29rOwotICAgICAgICBwaHlfaW5mby0+cmVtb3RlX3J4ID0gKChwaHlfZGF0YSAmIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVMpID4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTX1NISUZUKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfb2sgOiBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfbm90X29rOworCX0KIAotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEdldCBQSFkgaW5mb3JtYXRpb24gZnJvbSB2YXJpb3VzIFBIWSByZWdpc3RlcnMKLSoKLSogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSogcGh5X2luZm8gLSBQSFkgaW5mb3JtYXRpb24gc3RydWN0dXJlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX3BoeV9nZXRfaW5mbyAtIHJlcXVlc3QgcGh5IGluZm8KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAcGh5X2luZm86IFBIWSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKiBHZXQgUEhZIGluZm9ybWF0aW9uIGZyb20gdmFyaW91cyBQSFkgcmVnaXN0ZXJzCisgKi8KIHMzMiBlMTAwMF9waHlfZ2V0X2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbykKIHsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICB1MTYgcGh5X2RhdGE7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9kYXRhOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9waHlfZ2V0X2luZm8iKTsKKwlERUJVR0ZVTkMoImUxMDAwX3BoeV9nZXRfaW5mbyIpOwogCi0gICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF91bmRlZmluZWQ7Ci0gICAgcGh5X2luZm8tPmV4dGVuZGVkXzEwYnRfZGlzdGFuY2UgPSBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV91bmRlZmluZWQ7Ci0gICAgcGh5X2luZm8tPmNhYmxlX3BvbGFyaXR5ID0gZTEwMDBfcmV2X3BvbGFyaXR5X3VuZGVmaW5lZDsKLSAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gZTEwMDBfZG93bnNoaWZ0X3VuZGVmaW5lZDsKLSAgICBwaHlfaW5mby0+cG9sYXJpdHlfY29ycmVjdGlvbiA9IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3VuZGVmaW5lZDsKLSAgICBwaHlfaW5mby0+bWRpeF9tb2RlID0gZTEwMDBfYXV0b194X21vZGVfdW5kZWZpbmVkOwotICAgIHBoeV9pbmZvLT5sb2NhbF9yeCA9IGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQ7Ci0gICAgcGh5X2luZm8tPnJlbW90ZV9yeCA9IGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQ7CisJcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF91bmRlZmluZWQ7CisJcGh5X2luZm8tPmV4dGVuZGVkXzEwYnRfZGlzdGFuY2UgPSBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV91bmRlZmluZWQ7CisJcGh5X2luZm8tPmNhYmxlX3BvbGFyaXR5ID0gZTEwMDBfcmV2X3BvbGFyaXR5X3VuZGVmaW5lZDsKKwlwaHlfaW5mby0+ZG93bnNoaWZ0ID0gZTEwMDBfZG93bnNoaWZ0X3VuZGVmaW5lZDsKKwlwaHlfaW5mby0+cG9sYXJpdHlfY29ycmVjdGlvbiA9IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3VuZGVmaW5lZDsKKwlwaHlfaW5mby0+bWRpeF9tb2RlID0gZTEwMDBfYXV0b194X21vZGVfdW5kZWZpbmVkOworCXBoeV9pbmZvLT5sb2NhbF9yeCA9IGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQ7CisJcGh5X2luZm8tPnJlbW90ZV9yeCA9IGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQ7CiAKLSAgICBpZiAoaHctPm1lZGlhX3R5cGUgIT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKLSAgICAgICAgREVCVUdPVVQoIlBIWSBpbmZvIGlzIG9ubHkgdmFsaWQgZm9yIGNvcHBlciBtZWRpYVxuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKLSAgICB9CisJaWYgKGh3LT5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCURFQlVHT1VUKCJQSFkgaW5mbyBpcyBvbmx5IHZhbGlkIGZvciBjb3BwZXIgbWVkaWFcbiIpOworCQlyZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisJfQogCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwlyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIGlmICgocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpICE9IE1JSV9TUl9MSU5LX1NUQVRVUykgewotICAgICAgICBERUJVR09VVCgiUEhZIGluZm8gaXMgb25seSB2YWxpZCBpZiBsaW5rIGlzIHVwXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOwotICAgIH0KKwlpZiAoKHBoeV9kYXRhICYgTUlJX1NSX0xJTktfU1RBVFVTKSAhPSBNSUlfU1JfTElOS19TVEFUVVMpIHsKKwkJREVCVUdPVVQoIlBIWSBpbmZvIGlzIG9ubHkgdmFsaWQgaWYgbGluayBpcyB1cFxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CiAKLSAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgfHwKLSAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMyB8fAotICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yKQotICAgICAgICByZXR1cm4gZTEwMDBfcGh5X2lncF9nZXRfaW5mbyhodywgcGh5X2luZm8pOwotICAgIGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKQotICAgICAgICByZXR1cm4gZTEwMDBfcGh5X2lmZV9nZXRfaW5mbyhodywgcGh5X2luZm8pOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGUxMDAwX3BoeV9tODhfZ2V0X2luZm8oaHcsIHBoeV9pbmZvKTsKKwlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApCisJCXJldHVybiBlMTAwMF9waHlfaWdwX2dldF9pbmZvKGh3LCBwaHlfaW5mbyk7CisJZWxzZQorCQlyZXR1cm4gZTEwMDBfcGh5X204OF9nZXRfaW5mbyhodywgcGh5X2luZm8pOwogfQogCiBzMzIgZTEwMDBfdmFsaWRhdGVfbWRpX3NldHRpbmcoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICBERUJVR0ZVTkMoImUxMDAwX3ZhbGlkYXRlX21kaV9zZXR0aW5ncyIpOworCURFQlVHRlVOQygiZTEwMDBfdmFsaWRhdGVfbWRpX3NldHRpbmdzIik7CiAKLSAgICBpZiAoIWh3LT5hdXRvbmVnICYmIChody0+bWRpeCA9PSAwIHx8IGh3LT5tZGl4ID09IDMpKSB7Ci0gICAgICAgIERFQlVHT1VUKCJJbnZhbGlkIE1ESSBzZXR0aW5nIGRldGVjdGVkXG4iKTsKLSAgICAgICAgaHctPm1kaXggPSAxOwotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7Ci0gICAgfQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCWlmICghaHctPmF1dG9uZWcgJiYgKGh3LT5tZGl4ID09IDAgfHwgaHctPm1kaXggPT0gMykpIHsKKwkJREVCVUdPVVQoIkludmFsaWQgTURJIHNldHRpbmcgZGV0ZWN0ZWRcbiIpOworCQlody0+bWRpeCA9IDE7CisJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwl9CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2V0cyB1cCBlZXByb20gdmFyaWFibGVzIGluIHRoZSBodyBzdHJ1Y3QuICBNdXN0IGJlIGNhbGxlZCBhZnRlciBtYWNfdHlwZQotICogaXMgY29uZmlndXJlZC4gIEFkZGl0aW9uYWxseSwgaWYgdGhpcyBpcyBJQ0g4LCB0aGUgZmxhc2ggY29udHJvbGxlciBHYkUKLSAqIHJlZ2lzdGVycyBtdXN0IGJlIG1hcHBlZCwgb3IgdGhpcyB3aWxsIGNyYXNoLgorLyoqCisgKiBlMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMgLSBpbml0aWFsaXplIHN3IGVlcHJvbSB2YXJzCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQogICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBTZXRzIHVwIGVlcHJvbSB2YXJpYWJsZXMgaW4gdGhlIGh3IHN0cnVjdC4gIE11c3QgYmUgY2FsbGVkIGFmdGVyIG1hY190eXBlCisgKiBpcyBjb25maWd1cmVkLgorICovCiBzMzIgZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKLSAgICB1MzIgZWVjZCA9IGVyMzIoRUVDRCk7Ci0gICAgczMyIHJldF92YWwgPSBFMTAwMF9TVUNDRVNTOwotICAgIHUxNiBlZXByb21fc2l6ZTsKKwlzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworCXUzMiBlZWNkID0gZXIzMihFRUNEKTsKKwlzMzIgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisJdTE2IGVlcHJvbV9zaXplOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMiKTsKKwlERUJVR0ZVTkMoImUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyIpOwogCi0gICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKLSAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKLSAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKLSAgICBjYXNlIGUxMDAwXzgyNTQzOgotICAgIGNhc2UgZTEwMDBfODI1NDQ6Ci0gICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9taWNyb3dpcmU7Ci0gICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gNjQ7Ci0gICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMgPSAzOwotICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDY7Ci0gICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOwotICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gZmFsc2U7Ci0gICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF84MjU0MDoKLSAgICBjYXNlIGUxMDAwXzgyNTQ1OgotICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6Ci0gICAgY2FzZSBlMTAwMF84MjU0NjoKLSAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgotICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fbWljcm93aXJlOwotICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzID0gMzsKLSAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gNTA7Ci0gICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9TSVpFKSB7Ci0gICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDI1NjsKLSAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gNjQ7Ci0gICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDY7Ci0gICAgICAgIH0KLSAgICAgICAgZWVwcm9tLT51c2VfZWVyZCA9IGZhbHNlOwotICAgICAgICBlZXByb20tPnVzZV9lZXdyID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgZTEwMDBfODI1NDE6Ci0gICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKLSAgICBjYXNlIGUxMDAwXzgyNTQ3OgotICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6Ci0gICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9UWVBFKSB7Ci0gICAgICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fc3BpOwotICAgICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDg7Ci0gICAgICAgICAgICBlZXByb20tPmRlbGF5X3VzZWMgPSAxOwotICAgICAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgewotICAgICAgICAgICAgICAgIGVlcHJvbS0+cGFnZV9zaXplID0gMzI7Ci0gICAgICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSA4OwotICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9taWNyb3dpcmU7Ci0gICAgICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzID0gMzsKLSAgICAgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOwotICAgICAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgewotICAgICAgICAgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gMjU2OwotICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKLSAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWVwcm9tLT51c2VfZWVyZCA9IGZhbHNlOwotICAgICAgICBlZXByb20tPnVzZV9lZXdyID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgZTEwMDBfODI1NzE6Ci0gICAgY2FzZSBlMTAwMF84MjU3MjoKLSAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX3NwaTsKLSAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDg7Ci0gICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDE7Ci0gICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9BRERSX0JJVFMpIHsKLSAgICAgICAgICAgIGVlcHJvbS0+cGFnZV9zaXplID0gMzI7Ci0gICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDE2OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSA4OwotICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVlcHJvbS0+dXNlX2VlcmQgPSBmYWxzZTsKLSAgICAgICAgZWVwcm9tLT51c2VfZWV3ciA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwXzgyNTczOgotICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fc3BpOwotICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzID0gODsKLSAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gMTsKLSAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgewotICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSAzMjsKLSAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gMTY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlZXByb20tPnBhZ2Vfc2l6ZSA9IDg7Ci0gICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWVwcm9tLT51c2VfZWVyZCA9IHRydWU7Ci0gICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSB0cnVlOwotICAgICAgICBpZiAoIWUxMDAwX2lzX29uYm9hcmRfbnZtX2VlcHJvbShodykpIHsKLSAgICAgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9mbGFzaDsKLSAgICAgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gMjA0ODsKKwlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCWNhc2UgZTEwMDBfODI1NDM6CisJY2FzZSBlMTAwMF84MjU0NDoKKwkJZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKwkJZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKwkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKwkJZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDA6CisJY2FzZSBlMTAwMF84MjU0NToKKwljYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorCWNhc2UgZTEwMDBfODI1NDY6CisJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKwkJZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKwkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisJCWVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOworCQlpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfU0laRSkgeworCQkJZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisJCQllZXByb20tPmFkZHJlc3NfYml0cyA9IDg7CisJCX0gZWxzZSB7CisJCQllZXByb20tPndvcmRfc2l6ZSA9IDY0OworCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA2OworCQl9CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDE6CisJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwljYXNlIGUxMDAwXzgyNTQ3OgorCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJCWlmIChlZWNkICYgRTEwMDBfRUVDRF9UWVBFKSB7CisJCQllZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fc3BpOworCQkJZWVwcm9tLT5vcGNvZGVfYml0cyA9IDg7CisJCQllZXByb20tPmRlbGF5X3VzZWMgPSAxOworCQkJaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgeworCQkJCWVlcHJvbS0+cGFnZV9zaXplID0gMzI7CisJCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSAxNjsKKwkJCX0gZWxzZSB7CisJCQkJZWVwcm9tLT5wYWdlX3NpemUgPSA4OworCQkJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9taWNyb3dpcmU7CisJCQllZXByb20tPm9wY29kZV9iaXRzID0gMzsKKwkJCWVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOworCQkJaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgeworCQkJCWVlcHJvbS0+d29yZF9zaXplID0gMjU2OworCQkJCWVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKwkJCX0gZWxzZSB7CisJCQkJZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKwkJCQllZXByb20tPmFkZHJlc3NfYml0cyA9IDY7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCi0gICAgICAgICAgICAvKiBFbnN1cmUgdGhhdCB0aGUgQXV0b25vbW91cyBGTEFTSCB1cGRhdGUgYml0IGlzIGNsZWFyZWQgZHVlIHRvCi0gICAgICAgICAgICAgKiBGbGFzaCB1cGRhdGUgaXNzdWUgb24gcGFydHMgd2hpY2ggdXNlIGEgRkxBU0ggZm9yIE5WTS4gKi8KLSAgICAgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfQVVQREVOOwotICAgICAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwXzgwMDAzZXMybGFuOgotICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fc3BpOwotICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzID0gODsKLSAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gMTsKLSAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgewotICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSAzMjsKLSAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gMTY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlZXByb20tPnBhZ2Vfc2l6ZSA9IDg7Ci0gICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWVwcm9tLT51c2VfZWVyZCA9IHRydWU7Ci0gICAgICAgIGVlcHJvbS0+dXNlX2Vld3IgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF9pY2g4bGFuOgotICAgICAgICB7Ci0gICAgICAgIHMzMiAgaSA9IDA7Ci0gICAgICAgIHUzMiBmbGFzaF9zaXplID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfR0ZQUkVHKTsKKwlpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKwkJLyogZWVwcm9tX3NpemUgd2lsbCBiZSBhbiBlbnVtIFswLi44XSB0aGF0IG1hcHMgdG8gZWVwcm9tIHNpemVzIDEyOEIgdG8KKwkJICogMzJLQiAoaW5jcmVtZW50ZWQgYnkgcG93ZXJzIG9mIDIpLgorCQkgKi8KKwkJLyogU2V0IHRvIGRlZmF1bHQgdmFsdWUgZm9yIGluaXRpYWwgZWVwcm9tIHJlYWQuICovCisJCWVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisJCXJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0NGRywgMSwgJmVlcHJvbV9zaXplKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJZWVwcm9tX3NpemUgPQorCQkgICAgKGVlcHJvbV9zaXplICYgRUVQUk9NX1NJWkVfTUFTSykgPj4gRUVQUk9NX1NJWkVfU0hJRlQ7CisJCS8qIDI1NkIgZWVwcm9tIHNpemUgd2FzIG5vdCBzdXBwb3J0ZWQgaW4gZWFybGllciBoYXJkd2FyZSwgc28gd2UKKwkJICogYnVtcCBlZXByb21fc2l6ZSB1cCBvbmUgdG8gZW5zdXJlIHRoYXQgIjEiICh3aGljaCBtYXBzIHRvIDI1NkIpCisJCSAqIGlzIG5ldmVyIHRoZSByZXN1bHQgdXNlZCBpbiB0aGUgc2hpZnRpbmcgbG9naWMgYmVsb3cuICovCisJCWlmIChlZXByb21fc2l6ZSkKKwkJCWVlcHJvbV9zaXplKys7CiAKLSAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX2ljaDg7Ci0gICAgICAgIGVlcHJvbS0+dXNlX2VlcmQgPSBmYWxzZTsKLSAgICAgICAgZWVwcm9tLT51c2VfZWV3ciA9IGZhbHNlOwotICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IEUxMDAwX1NIQURPV19SQU1fV09SRFM7Ci0KLSAgICAgICAgLyogWmVybyB0aGUgc2hhZG93IFJBTSBzdHJ1Y3R1cmUuIEJ1dCBkb24ndCBsb2FkIGl0IGZyb20gTlZNCi0gICAgICAgICAqIHNvIGFzIHRvIHNhdmUgdGltZSBmb3IgZHJpdmVyIGluaXQgKi8KLSAgICAgICAgaWYgKGh3LT5lZXByb21fc2hhZG93X3JhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRTEwMDBfU0hBRE9XX1JBTV9XT1JEUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLm1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLmVlcHJvbV93b3JkID0gMHhGRkZGOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaHctPmZsYXNoX2Jhc2VfYWRkciA9IChmbGFzaF9zaXplICYgSUNIX0dGUFJFR19CQVNFX01BU0spICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDSF9GTEFTSF9TRUNUT1JfU0laRTsKLQotICAgICAgICBody0+Zmxhc2hfYmFua19zaXplID0gKChmbGFzaF9zaXplID4+IDE2KSAmIElDSF9HRlBSRUdfQkFTRV9NQVNLKSArIDE7Ci0gICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgLT0gKGZsYXNoX3NpemUgJiBJQ0hfR0ZQUkVHX0JBU0VfTUFTSyk7Ci0KLSAgICAgICAgaHctPmZsYXNoX2Jhbmtfc2l6ZSAqPSBJQ0hfRkxBU0hfU0VDVE9SX1NJWkU7Ci0KLSAgICAgICAgaHctPmZsYXNoX2Jhbmtfc2l6ZSAvPSAyICogc2l6ZW9mKHUxNik7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKLSAgICAgICAgLyogZWVwcm9tX3NpemUgd2lsbCBiZSBhbiBlbnVtIFswLi44XSB0aGF0IG1hcHMgdG8gZWVwcm9tIHNpemVzIDEyOEIgdG8KLSAgICAgICAgICogMzJLQiAoaW5jcmVtZW50ZWQgYnkgcG93ZXJzIG9mIDIpLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikgewotICAgICAgICAgICAgLyogU2V0IHRvIGRlZmF1bHQgdmFsdWUgZm9yIGluaXRpYWwgZWVwcm9tIHJlYWQuICovCi0gICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDY0OwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fQ0ZHLCAxLCAmZWVwcm9tX3NpemUpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICBlZXByb21fc2l6ZSA9IChlZXByb21fc2l6ZSAmIEVFUFJPTV9TSVpFX01BU0spID4+IEVFUFJPTV9TSVpFX1NISUZUOwotICAgICAgICAgICAgLyogMjU2QiBlZXByb20gc2l6ZSB3YXMgbm90IHN1cHBvcnRlZCBpbiBlYXJsaWVyIGhhcmR3YXJlLCBzbyB3ZQotICAgICAgICAgICAgICogYnVtcCBlZXByb21fc2l6ZSB1cCBvbmUgdG8gZW5zdXJlIHRoYXQgIjEiICh3aGljaCBtYXBzIHRvIDI1NkIpCi0gICAgICAgICAgICAgKiBpcyBuZXZlciB0aGUgcmVzdWx0IHVzZWQgaW4gdGhlIHNoaWZ0aW5nIGxvZ2ljIGJlbG93LiAqLwotICAgICAgICAgICAgaWYgKGVlcHJvbV9zaXplKQotICAgICAgICAgICAgICAgIGVlcHJvbV9zaXplKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlZXByb21fc2l6ZSA9ICh1MTYpKChlZWNkICYgRTEwMDBfRUVDRF9TSVpFX0VYX01BU0spID4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0VFQ0RfU0laRV9FWF9TSElGVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDEgPDwgKGVlcHJvbV9zaXplICsgRUVQUk9NX1dPUkRfU0laRV9TSElGVCk7Ci0gICAgfQotICAgIHJldHVybiByZXRfdmFsOworCQllZXByb20tPndvcmRfc2l6ZSA9IDEgPDwgKGVlcHJvbV9zaXplICsgRUVQUk9NX1dPUkRfU0laRV9TSElGVCk7CisJfQorCXJldHVybiByZXRfdmFsOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWlzZXMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiBlZWNkIC0gRUVDRCdzIGN1cnJlbnQgdmFsdWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfcmFpc2VfZWVfY2xrIC0gUmFpc2VzIHRoZSBFRVBST00ncyBjbG9jayBpbnB1dC4KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAZWVjZDogRUVDRCdzIGN1cnJlbnQgdmFsdWUKKyAqLwogc3RhdGljIHZvaWQgZTEwMDBfcmFpc2VfZWVfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiAqZWVjZCkKIHsKLSAgICAvKiBSYWlzZSB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIEVFUFJPTSAoYnkgc2V0dGluZyB0aGUgU0sgYml0KSwgYW5kIHRoZW4KLSAgICAgKiB3YWl0IDxkZWxheT4gbWljcm9zZWNvbmRzLgotICAgICAqLwotICAgICplZWNkID0gKmVlY2QgfCBFMTAwMF9FRUNEX1NLOwotICAgIGV3MzIoRUVDRCwgKmVlY2QpOwotICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisJLyogUmFpc2UgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00gKGJ5IHNldHRpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuCisJICogd2FpdCA8ZGVsYXk+IG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwkqZWVjZCA9ICplZWNkIHwgRTEwMDBfRUVDRF9TSzsKKwlldzMyKEVFQ0QsICplZWNkKTsKKwlFMTAwMF9XUklURV9GTFVTSCgpOworCXVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMb3dlcnMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiBlZWNkIC0gRUVDRCdzIGN1cnJlbnQgdmFsdWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfbG93ZXJfZWVfY2xrIC0gTG93ZXJzIHRoZSBFRVBST00ncyBjbG9jayBpbnB1dC4KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAZWVjZDogRUVDRCdzIGN1cnJlbnQgdmFsdWUKKyAqLwogc3RhdGljIHZvaWQgZTEwMDBfbG93ZXJfZWVfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiAqZWVjZCkKIHsKLSAgICAvKiBMb3dlciB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIEVFUFJPTSAoYnkgY2xlYXJpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuCi0gICAgICogd2FpdCA1MCBtaWNyb3NlY29uZHMuCi0gICAgICovCi0gICAgKmVlY2QgPSAqZWVjZCAmIH5FMTAwMF9FRUNEX1NLOwotICAgIGV3MzIoRUVDRCwgKmVlY2QpOwotICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisJLyogTG93ZXIgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00gKGJ5IGNsZWFyaW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbgorCSAqIHdhaXQgNTAgbWljcm9zZWNvbmRzLgorCSAqLworCSplZWNkID0gKmVlY2QgJiB+RTEwMDBfRUVDRF9TSzsKKwlldzMyKEVFQ0QsICplZWNkKTsKKwlFMTAwMF9XUklURV9GTFVTSCgpOworCXVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTaGlmdCBkYXRhIGJpdHMgb3V0IHRvIHRoZSBFRVBST00uCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqIGRhdGEgLSBkYXRhIHRvIHNlbmQgdG8gdGhlIEVFUFJPTQotICogY291bnQgLSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMgLSBTaGlmdCBkYXRhIGJpdHMgb3V0IHRvIHRoZSBFRVBST00uCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQGRhdGE6IGRhdGEgdG8gc2VuZCB0byB0aGUgRUVQUk9NCisgKiBAY291bnQ6IG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IG91dAorICovCiBzdGF0aWMgdm9pZCBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgZGF0YSwgdTE2IGNvdW50KQogewotICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207Ci0gICAgdTMyIGVlY2Q7Ci0gICAgdTMyIG1hc2s7CisJc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKwl1MzIgZWVjZDsKKwl1MzIgbWFzazsKIAotICAgIC8qIFdlIG5lZWQgdG8gc2hpZnQgImNvdW50IiBiaXRzIG91dCB0byB0aGUgRUVQUk9NLiBTbywgdmFsdWUgaW4gdGhlCi0gICAgICogImRhdGEiIHBhcmFtZXRlciB3aWxsIGJlIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00gb25lIGJpdCBhdCBhIHRpbWUuCi0gICAgICogSW4gb3JkZXIgdG8gZG8gdGhpcywgImRhdGEiIG11c3QgYmUgYnJva2VuIGRvd24gaW50byBiaXRzLgotICAgICAqLwotICAgIG1hc2sgPSAweDAxIDw8IChjb3VudCAtIDEpOwotICAgIGVlY2QgPSBlcjMyKEVFQ0QpOwotICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgewotICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX0RPOwotICAgIH0gZWxzZSBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKLSAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0RPOwotICAgIH0KLSAgICBkbyB7Ci0gICAgICAgIC8qIEEgIjEiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00gYnkgc2V0dGluZyBiaXQgIkRJIiB0byBhICIxIiwKLSAgICAgICAgICogYW5kIHRoZW4gcmFpc2luZyBhbmQgdGhlbiBsb3dlcmluZyB0aGUgY2xvY2sgKHRoZSBTSyBiaXQgY29udHJvbHMKLSAgICAgICAgICogdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00pLiAgQSAiMCIgaXMgc2hpZnRlZCBvdXQgdG8gdGhlIEVFUFJPTQotICAgICAgICAgKiBieSBzZXR0aW5nICJESSIgdG8gIjAiIGFuZCB0aGVuIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrLgotICAgICAgICAgKi8KLSAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9ESTsKKwkvKiBXZSBuZWVkIHRvIHNoaWZ0ICJjb3VudCIgYml0cyBvdXQgdG8gdGhlIEVFUFJPTS4gU28sIHZhbHVlIGluIHRoZQorCSAqICJkYXRhIiBwYXJhbWV0ZXIgd2lsbCBiZSBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIG9uZSBiaXQgYXQgYSB0aW1lLgorCSAqIEluIG9yZGVyIHRvIGRvIHRoaXMsICJkYXRhIiBtdXN0IGJlIGJyb2tlbiBkb3duIGludG8gYml0cy4KKwkgKi8KKwltYXNrID0gMHgwMSA8PCAoY291bnQgLSAxKTsKKwllZWNkID0gZXIzMihFRUNEKTsKKwlpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKwkJZWVjZCAmPSB+RTEwMDBfRUVDRF9ETzsKKwl9IGVsc2UgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisJCWVlY2QgfD0gRTEwMDBfRUVDRF9ETzsKKwl9CisJZG8geworCQkvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIGJ5IHNldHRpbmcgYml0ICJESSIgdG8gYSAiMSIsCisJCSAqIGFuZCB0aGVuIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrICh0aGUgU0sgYml0IGNvbnRyb2xzCisJCSAqIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NKS4gIEEgIjAiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00KKwkJICogYnkgc2V0dGluZyAiREkiIHRvICIwIiBhbmQgdGhlbiByYWlzaW5nIGFuZCB0aGVuIGxvd2VyaW5nIHRoZSBjbG9jay4KKwkJICovCisJCWVlY2QgJj0gfkUxMDAwX0VFQ0RfREk7CiAKLSAgICAgICAgaWYgKGRhdGEgJiBtYXNrKQotICAgICAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0RJOworCQlpZiAoZGF0YSAmIG1hc2spCisJCQllZWNkIHw9IEUxMDAwX0VFQ0RfREk7CiAKLSAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKKwkJZXczMihFRUNELCBlZWNkKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKIAotICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKwkJdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CiAKLSAgICAgICAgZTEwMDBfcmFpc2VfZWVfY2xrKGh3LCAmZWVjZCk7Ci0gICAgICAgIGUxMDAwX2xvd2VyX2VlX2NsayhodywgJmVlY2QpOworCQllMTAwMF9yYWlzZV9lZV9jbGsoaHcsICZlZWNkKTsKKwkJZTEwMDBfbG93ZXJfZWVfY2xrKGh3LCAmZWVjZCk7CiAKLSAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKKwkJbWFzayA9IG1hc2sgPj4gMTsKIAotICAgIH0gd2hpbGUgKG1hc2spOworCX0gd2hpbGUgKG1hc2spOwogCi0gICAgLyogV2UgbGVhdmUgdGhlICJESSIgYml0IHNldCB0byAiMCIgd2hlbiB3ZSBsZWF2ZSB0aGlzIHJvdXRpbmUuICovCi0gICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9ESTsKLSAgICBldzMyKEVFQ0QsIGVlY2QpOworCS8qIFdlIGxlYXZlIHRoZSAiREkiIGJpdCBzZXQgdG8gIjAiIHdoZW4gd2UgbGVhdmUgdGhpcyByb3V0aW5lLiAqLworCWVlY2QgJj0gfkUxMDAwX0VFQ0RfREk7CisJZXczMihFRUNELCBlZWNkKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2hpZnQgZGF0YSBiaXRzIGluIGZyb20gdGhlIEVFUFJPTQotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX3NoaWZ0X2luX2VlX2JpdHMgLSBTaGlmdCBkYXRhIGJpdHMgaW4gZnJvbSB0aGUgRUVQUk9NCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQGNvdW50OiBudW1iZXIgb2YgYml0cyB0byBzaGlmdCBpbgorICovCiBzdGF0aWMgdTE2IGUxMDAwX3NoaWZ0X2luX2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IGNvdW50KQogewotICAgIHUzMiBlZWNkOwotICAgIHUzMiBpOwotICAgIHUxNiBkYXRhOworCXUzMiBlZWNkOworCXUzMiBpOworCXUxNiBkYXRhOwogCi0gICAgLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIEVFUFJPTSwgd2UgbmVlZCB0byBzaGlmdCAnY291bnQnCi0gICAgICogYml0cyBpbiBmcm9tIHRoZSBFRVBST00uIEJpdHMgYXJlICJzaGlmdGVkIGluIiBieSByYWlzaW5nIHRoZSBjbG9jawotICAgICAqIGlucHV0IHRvIHRoZSBFRVBST00gKHNldHRpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuIHJlYWRpbmcgdGhlIHZhbHVlIG9mCi0gICAgICogdGhlICJETyIgYml0LiAgRHVyaW5nIHRoaXMgInNoaWZ0aW5nIGluIiBwcm9jZXNzIHRoZSAiREkiIGJpdCBzaG91bGQKLSAgICAgKiBhbHdheXMgYmUgY2xlYXIuCi0gICAgICovCisJLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIEVFUFJPTSwgd2UgbmVlZCB0byBzaGlmdCAnY291bnQnCisJICogYml0cyBpbiBmcm9tIHRoZSBFRVBST00uIEJpdHMgYXJlICJzaGlmdGVkIGluIiBieSByYWlzaW5nIHRoZSBjbG9jaworCSAqIGlucHV0IHRvIHRoZSBFRVBST00gKHNldHRpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuIHJlYWRpbmcgdGhlIHZhbHVlIG9mCisJICogdGhlICJETyIgYml0LiAgRHVyaW5nIHRoaXMgInNoaWZ0aW5nIGluIiBwcm9jZXNzIHRoZSAiREkiIGJpdCBzaG91bGQKKwkgKiBhbHdheXMgYmUgY2xlYXIuCisJICovCiAKLSAgICBlZWNkID0gZXIzMihFRUNEKTsKKwllZWNkID0gZXIzMihFRUNEKTsKIAotICAgIGVlY2QgJj0gfihFMTAwMF9FRUNEX0RPIHwgRTEwMDBfRUVDRF9ESSk7Ci0gICAgZGF0YSA9IDA7CisJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfRE8gfCBFMTAwMF9FRUNEX0RJKTsKKwlkYXRhID0gMDsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGRhdGEgPSBkYXRhIDw8IDE7Ci0gICAgICAgIGUxMDAwX3JhaXNlX2VlX2NsayhodywgJmVlY2QpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRhdGEgPSBkYXRhIDw8IDE7CisJCWUxMDAwX3JhaXNlX2VlX2NsayhodywgJmVlY2QpOwogCi0gICAgICAgIGVlY2QgPSBlcjMyKEVFQ0QpOworCQllZWNkID0gZXIzMihFRUNEKTsKIAotICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9ESSk7Ci0gICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9ETykKLSAgICAgICAgICAgIGRhdGEgfD0gMTsKKwkJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfREkpOworCQlpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfRE8pCisJCQlkYXRhIHw9IDE7CiAKLSAgICAgICAgZTEwMDBfbG93ZXJfZWVfY2xrKGh3LCAmZWVjZCk7Ci0gICAgfQorCQllMTAwMF9sb3dlcl9lZV9jbGsoaHcsICZlZWNkKTsKKwl9CiAKLSAgICByZXR1cm4gZGF0YTsKKwlyZXR1cm4gZGF0YTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUHJlcGFyZXMgRUVQUk9NIGZvciBhY2Nlc3MKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorLyoqCisgKiBlMTAwMF9hY3F1aXJlX2VlcHJvbSAtIFByZXBhcmVzIEVFUFJPTSBmb3IgYWNjZXNzCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQogICoKICAqIExvd2VycyBFRVBST00gY2xvY2suIENsZWFycyBpbnB1dCBwaW4uIFNldHMgdGhlIGNoaXAgc2VsZWN0IHBpbi4gVGhpcwogICogZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgaXNzdWluZyBhIGNvbW1hbmQgdG8gdGhlIEVFUFJPTS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogc3RhdGljIHMzMiBlMTAwMF9hY3F1aXJlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207Ci0gICAgdTMyIGVlY2QsIGk9MDsKKwlzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworCXUzMiBlZWNkLCBpID0gMDsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfYWNxdWlyZV9lZXByb20iKTsKKwlERUJVR0ZVTkMoImUxMDAwX2FjcXVpcmVfZWVwcm9tIik7CiAKLSAgICBpZiAoZTEwMDBfc3dmd19zeW5jX2FjcXVpcmUoaHcsIEUxMDAwX1NXRldfRUVQX1NNKSkKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfU1dGV19TWU5DOwotICAgIGVlY2QgPSBlcjMyKEVFQ0QpOworCWVlY2QgPSBlcjMyKEVFQ0QpOwogCi0gICAgaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU3MykgewotICAgICAgICAvKiBSZXF1ZXN0IEVFUFJPTSBBY2Nlc3MgKi8KLSAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7Ci0gICAgICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfUkVROwotICAgICAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICAgICAgICAgIGVlY2QgPSBlcjMyKEVFQ0QpOwotICAgICAgICAgICAgd2hpbGUgKCghKGVlY2QgJiBFMTAwMF9FRUNEX0dOVCkpICYmCi0gICAgICAgICAgICAgICAgICAoaSA8IEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUykpIHsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgdWRlbGF5KDUpOwotICAgICAgICAgICAgICAgIGVlY2QgPSBlcjMyKEVFQ0QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgewotICAgICAgICAgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfUkVROwotICAgICAgICAgICAgICAgIGV3MzIoRUVDRCwgZWVjZCk7Ci0gICAgICAgICAgICAgICAgREVCVUdPVVQoIkNvdWxkIG5vdCBhY3F1aXJlIEVFUFJPTSBncmFudFxuIik7Ci0gICAgICAgICAgICAgICAgZTEwMDBfc3dmd19zeW5jX3JlbGVhc2UoaHcsIEUxMDAwX1NXRldfRUVQX1NNKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJLyogUmVxdWVzdCBFRVBST00gQWNjZXNzICovCisJaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CisJCWVlY2QgfD0gRTEwMDBfRUVDRF9SRVE7CisJCWV3MzIoRUVDRCwgZWVjZCk7CisJCWVlY2QgPSBlcjMyKEVFQ0QpOworCQl3aGlsZSAoKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgJiYKKwkJICAgICAgIChpIDwgRTEwMDBfRUVQUk9NX0dSQU5UX0FUVEVNUFRTKSkgeworCQkJaSsrOworCQkJdWRlbGF5KDUpOworCQkJZWVjZCA9IGVyMzIoRUVDRCk7CisJCX0KKwkJaWYgKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgeworCQkJZWVjZCAmPSB+RTEwMDBfRUVDRF9SRVE7CisJCQlldzMyKEVFQ0QsIGVlY2QpOworCQkJREVCVUdPVVQoIkNvdWxkIG5vdCBhY3F1aXJlIEVFUFJPTSBncmFudFxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJCX0KKwl9CiAKLSAgICAvKiBTZXR1cCBFRVBST00gZm9yIFJlYWQvV3JpdGUgKi8KKwkvKiBTZXR1cCBFRVBST00gZm9yIFJlYWQvV3JpdGUgKi8KIAotICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgewotICAgICAgICAvKiBDbGVhciBTSyBhbmQgREkgKi8KLSAgICAgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfREkgfCBFMTAwMF9FRUNEX1NLKTsKLSAgICAgICAgZXczMihFRUNELCBlZWNkKTsKKwlpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKwkJLyogQ2xlYXIgU0sgYW5kIERJICovCisJCWVlY2QgJj0gfihFMTAwMF9FRUNEX0RJIHwgRTEwMDBfRUVDRF9TSyk7CisJCWV3MzIoRUVDRCwgZWVjZCk7CiAKLSAgICAgICAgLyogU2V0IENTICovCi0gICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9DUzsKLSAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICB9IGVsc2UgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7Ci0gICAgICAgIC8qIENsZWFyIFNLIGFuZCBDUyAqLwotICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9DUyB8IEUxMDAwX0VFQ0RfU0spOwotICAgICAgICBldzMyKEVFQ0QsIGVlY2QpOwotICAgICAgICB1ZGVsYXkoMSk7Ci0gICAgfQorCQkvKiBTZXQgQ1MgKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlldzMyKEVFQ0QsIGVlY2QpOworCX0gZWxzZSBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKwkJLyogQ2xlYXIgU0sgYW5kIENTICovCisJCWVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9TSyk7CisJCWV3MzIoRUVDRCwgZWVjZCk7CisJCXVkZWxheSgxKTsKKwl9CiAKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmV0dXJucyBFRVBST00gdG8gYSAic3RhbmRieSIgc3RhdGUKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9zdGFuZGJ5X2VlcHJvbSAtIFJldHVybnMgRUVQUk9NIHRvIGEgInN0YW5kYnkiIHN0YXRlCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICovCiBzdGF0aWMgdm9pZCBlMTAwMF9zdGFuZGJ5X2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207Ci0gICAgdTMyIGVlY2Q7CisJc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKwl1MzIgZWVjZDsKIAotICAgIGVlY2QgPSBlcjMyKEVFQ0QpOworCWVlY2QgPSBlcjMyKEVFQ0QpOwogCi0gICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7Ci0gICAgICAgIGVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9TSyk7Ci0gICAgICAgIGV3MzIoRUVDRCwgZWVjZCk7Ci0gICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgICAgIHVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCWlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworCQllZWNkICY9IH4oRTEwMDBfRUVDRF9DUyB8IEUxMDAwX0VFQ0RfU0spOworCQlldzMyKEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSCgpOworCQl1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKIAotICAgICAgICAvKiBDbG9jayBoaWdoICovCi0gICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9TSzsKLSAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisJCS8qIENsb2NrIGhpZ2ggKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX1NLOworCQlldzMyKEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSCgpOworCQl1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKIAotICAgICAgICAvKiBTZWxlY3QgRUVQUk9NICovCi0gICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9DUzsKLSAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisJCS8qIFNlbGVjdCBFRVBST00gKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlldzMyKEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSCgpOworCQl1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKIAotICAgICAgICAvKiBDbG9jayBsb3cgKi8KLSAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9TSzsKLSAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7Ci0gICAgfSBlbHNlIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgewotICAgICAgICAvKiBUb2dnbGUgQ1MgdG8gZmx1c2ggY29tbWFuZHMgKi8KLSAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0NTOwotICAgICAgICBldzMyKEVFQ0QsIGVlY2QpOwotICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKLSAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9DUzsKLSAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7Ci0gICAgfQorCQkvKiBDbG9jayBsb3cgKi8KKwkJZWVjZCAmPSB+RTEwMDBfRUVDRF9TSzsKKwkJZXczMihFRUNELCBlZWNkKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwkJdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisJfSBlbHNlIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworCQkvKiBUb2dnbGUgQ1MgdG8gZmx1c2ggY29tbWFuZHMgKi8KKwkJZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworCQlldzMyKEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSCgpOworCQl1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKwkJZWVjZCAmPSB+RTEwMDBfRUVDRF9DUzsKKwkJZXczMihFRUNELCBlZWNkKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwkJdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUZXJtaW5hdGVzIGEgY29tbWFuZCBieSBpbnZlcnRpbmcgdGhlIEVFUFJPTSdzIGNoaXAgc2VsZWN0IHBpbgorLyoqCisgKiBlMTAwMF9yZWxlYXNlX2VlcHJvbSAtIGRyb3AgY2hpcCBzZWxlY3QKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCiAgKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIFRlcm1pbmF0ZXMgYSBjb21tYW5kIGJ5IGludmVydGluZyB0aGUgRUVQUk9NJ3MgY2hpcCBzZWxlY3QgcGluCisgKi8KIHN0YXRpYyB2b2lkIGUxMDAwX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIGVlY2Q7CisJdTMyIGVlY2Q7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3JlbGVhc2VfZWVwcm9tIik7CisJREVCVUdGVU5DKCJlMTAwMF9yZWxlYXNlX2VlcHJvbSIpOwogCi0gICAgZWVjZCA9IGVyMzIoRUVDRCk7CisJZWVjZCA9IGVyMzIoRUVDRCk7CiAKLSAgICBpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKLSAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0NTOyAgLyogUHVsbCBDUyBoaWdoICovCi0gICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7IC8qIExvd2VyIFNDSyAqLworCWlmIChody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworCQllZWNkIHw9IEUxMDAwX0VFQ0RfQ1M7CS8qIFB1bGwgQ1MgaGlnaCAqLworCQllZWNkICY9IH5FMTAwMF9FRUNEX1NLOwkvKiBMb3dlciBTQ0sgKi8KIAotICAgICAgICBldzMyKEVFQ0QsIGVlY2QpOworCQlldzMyKEVFQ0QsIGVlY2QpOwogCi0gICAgICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOwotICAgIH0gZWxzZSBpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKLSAgICAgICAgLyogY2xlYW51cCBlZXByb20gKi8KKwkJdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisJfSBlbHNlIGlmIChody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworCQkvKiBjbGVhbnVwIGVlcHJvbSAqLwogCi0gICAgICAgIC8qIENTIG9uIE1pY3Jvd2lyZSBpcyBhY3RpdmUtaGlnaCAqLwotICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9DUyB8IEUxMDAwX0VFQ0RfREkpOworCQkvKiBDUyBvbiBNaWNyb3dpcmUgaXMgYWN0aXZlLWhpZ2ggKi8KKwkJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfQ1MgfCBFMTAwMF9FRUNEX0RJKTsKIAotICAgICAgICBldzMyKEVFQ0QsIGVlY2QpOworCQlldzMyKEVFQ0QsIGVlY2QpOwogCi0gICAgICAgIC8qIFJpc2luZyBlZGdlIG9mIGNsb2NrICovCi0gICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9TSzsKLSAgICAgICAgZXczMihFRUNELCBlZWNkKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICAgICAgdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CisJCS8qIFJpc2luZyBlZGdlIG9mIGNsb2NrICovCisJCWVlY2QgfD0gRTEwMDBfRUVDRF9TSzsKKwkJZXczMihFRUNELCBlZWNkKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwkJdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7CiAKLSAgICAgICAgLyogRmFsbGluZyBlZGdlIG9mIGNsb2NrICovCi0gICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7Ci0gICAgICAgIGV3MzIoRUVDRCwgZWVjZCk7Ci0gICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOwotICAgIH0KKwkJLyogRmFsbGluZyBlZGdlIG9mIGNsb2NrICovCisJCWVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7CisJCWV3MzIoRUVDRCwgZWVjZCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CisJCXVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworCX0KIAotICAgIC8qIFN0b3AgcmVxdWVzdGluZyBFRVBST00gYWNjZXNzICovCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7Ci0gICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfUkVROwotICAgICAgICBldzMyKEVFQ0QsIGVlY2QpOwotICAgIH0KLQotICAgIGUxMDAwX3N3Zndfc3luY19yZWxlYXNlKGh3LCBFMTAwMF9TV0ZXX0VFUF9TTSk7CisJLyogU3RvcCByZXF1ZXN0aW5nIEVFUFJPTSBhY2Nlc3MgKi8KKwlpZiAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKwkJZWVjZCAmPSB+RTEwMDBfRUVDRF9SRVE7CisJCWV3MzIoRUVDRCwgZWVjZCk7CisJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZWFkcyBhIDE2IGJpdCB3b3JkIGZyb20gdGhlIEVFUFJPTS4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9zcGlfZWVwcm9tX3JlYWR5IC0gUmVhZHMgYSAxNiBiaXQgd29yZCBmcm9tIHRoZSBFRVBST00uCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICovCiBzdGF0aWMgczMyIGUxMDAwX3NwaV9lZXByb21fcmVhZHkoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICB1MTYgcmV0cnlfY291bnQgPSAwOwotICAgIHU4IHNwaV9zdGF0X3JlZzsKKwl1MTYgcmV0cnlfY291bnQgPSAwOworCXU4IHNwaV9zdGF0X3JlZzsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfc3BpX2VlcHJvbV9yZWFkeSIpOworCURFQlVHRlVOQygiZTEwMDBfc3BpX2VlcHJvbV9yZWFkeSIpOwogCi0gICAgLyogUmVhZCAiU3RhdHVzIFJlZ2lzdGVyIiByZXBlYXRlZGx5IHVudGlsIHRoZSBMU0IgaXMgY2xlYXJlZC4gIFRoZQotICAgICAqIEVFUFJPTSB3aWxsIHNpZ25hbCB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSBjbGVhcmluZwotICAgICAqIGJpdCAwIG9mIHRoZSBpbnRlcm5hbCBzdGF0dXMgcmVnaXN0ZXIuICBJZiBpdCdzIG5vdCBjbGVhcmVkIHdpdGhpbgotICAgICAqIDUgbWlsbGlzZWNvbmRzLCB0aGVuIGVycm9yIG91dC4KLSAgICAgKi8KLSAgICByZXRyeV9jb3VudCA9IDA7Ci0gICAgZG8gewotICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1JEU1JfT1BDT0RFX1NQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHctPmVlcHJvbS5vcGNvZGVfYml0cyk7Ci0gICAgICAgIHNwaV9zdGF0X3JlZyA9ICh1OCllMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCA4KTsKLSAgICAgICAgaWYgKCEoc3BpX3N0YXRfcmVnICYgRUVQUk9NX1NUQVRVU19SRFlfU1BJKSkKLSAgICAgICAgICAgIGJyZWFrOworCS8qIFJlYWQgIlN0YXR1cyBSZWdpc3RlciIgcmVwZWF0ZWRseSB1bnRpbCB0aGUgTFNCIGlzIGNsZWFyZWQuICBUaGUKKwkgKiBFRVBST00gd2lsbCBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgY2xlYXJpbmcKKwkgKiBiaXQgMCBvZiB0aGUgaW50ZXJuYWwgc3RhdHVzIHJlZ2lzdGVyLiAgSWYgaXQncyBub3QgY2xlYXJlZCB3aXRoaW4KKwkgKiA1IG1pbGxpc2Vjb25kcywgdGhlbiBlcnJvciBvdXQuCisJICovCisJcmV0cnlfY291bnQgPSAwOworCWRvIHsKKwkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9SRFNSX09QQ09ERV9TUEksCisJCQkJCWh3LT5lZXByb20ub3Bjb2RlX2JpdHMpOworCQlzcGlfc3RhdF9yZWcgPSAodTgpIGUxMDAwX3NoaWZ0X2luX2VlX2JpdHMoaHcsIDgpOworCQlpZiAoIShzcGlfc3RhdF9yZWcgJiBFRVBST01fU1RBVFVTX1JEWV9TUEkpKQorCQkJYnJlYWs7CiAKLSAgICAgICAgdWRlbGF5KDUpOwotICAgICAgICByZXRyeV9jb3VudCArPSA1OworCQl1ZGVsYXkoNSk7CisJCXJldHJ5X2NvdW50ICs9IDU7CiAKLSAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOwotICAgIH0gd2hpbGUgKHJldHJ5X2NvdW50IDwgRUVQUk9NX01BWF9SRVRSWV9TUEkpOworCQllMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisJfSB3aGlsZSAocmV0cnlfY291bnQgPCBFRVBST01fTUFYX1JFVFJZX1NQSSk7CiAKLSAgICAvKiBBVE1FTCBTUEkgd3JpdGUgdGltZSBjb3VsZCB2YXJ5IGZyb20gMC0yMG1TZWMgb24gMy4zViBkZXZpY2VzIChhbmQKLSAgICAgKiBvbmx5IDAtNW1TZWMgb24gNVYgZGV2aWNlcykKLSAgICAgKi8KLSAgICBpZiAocmV0cnlfY291bnQgPj0gRUVQUk9NX01BWF9SRVRSWV9TUEkpIHsKLSAgICAgICAgREVCVUdPVVQoIlNQSSBFRVBST00gU3RhdHVzIGVycm9yXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwotICAgIH0KKwkvKiBBVE1FTCBTUEkgd3JpdGUgdGltZSBjb3VsZCB2YXJ5IGZyb20gMC0yMG1TZWMgb24gMy4zViBkZXZpY2VzIChhbmQKKwkgKiBvbmx5IDAtNW1TZWMgb24gNVYgZGV2aWNlcykKKwkgKi8KKwlpZiAocmV0cnlfY291bnQgPj0gRUVQUk9NX01BWF9SRVRSWV9TUEkpIHsKKwkJREVCVUdPVVQoIlNQSSBFRVBST00gU3RhdHVzIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCX0KIAotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZWFkcyBhIDE2IGJpdCB3b3JkIGZyb20gdGhlIEVFUFJPTS4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogb2Zmc2V0IC0gb2Zmc2V0IG9mICB3b3JkIGluIHRoZSBFRVBST00gdG8gcmVhZAotICogZGF0YSAtIHdvcmQgcmVhZCBmcm9tIHRoZSBFRVBST00KLSAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfcmVhZF9lZXByb20gLSBSZWFkcyBhIDE2IGJpdCB3b3JkIGZyb20gdGhlIEVFUFJPTS4KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAb2Zmc2V0OiBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCisgKiBAZGF0YTogd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQorICogQHdvcmRzOiBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAorICovCiBzMzIgZTEwMDBfcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG9mZnNldCwgdTE2IHdvcmRzLCB1MTYgKmRhdGEpCiB7Ci0gICAgczMyIHJldDsKLSAgICBzcGluX2xvY2soJmUxMDAwX2VlcHJvbV9sb2NrKTsKLSAgICByZXQgPSBlMTAwMF9kb19yZWFkX2VlcHJvbShodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7Ci0gICAgc3Bpbl91bmxvY2soJmUxMDAwX2VlcHJvbV9sb2NrKTsKLSAgICByZXR1cm4gcmV0OworCXMzMiByZXQ7CisJc3Bpbl9sb2NrKCZlMTAwMF9lZXByb21fbG9jayk7CisJcmV0ID0gZTEwMDBfZG9fcmVhZF9lZXByb20oaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworCXNwaW5fdW5sb2NrKCZlMTAwMF9lZXByb21fbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHMzMiBlMTAwMF9kb19yZWFkX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsIHUxNiAqZGF0YSkKK3N0YXRpYyBzMzIgZTEwMDBfZG9fcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG9mZnNldCwgdTE2IHdvcmRzLAorCQkJCXUxNiAqZGF0YSkKIHsKLSAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOwotICAgIHUzMiBpID0gMDsKKwlzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworCXUzMiBpID0gMDsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfcmVhZF9lZXByb20iKTsKKwlERUJVR0ZVTkMoImUxMDAwX3JlYWRfZWVwcm9tIik7CiAKLSAgICAvKiBJZiBlZXByb20gaXMgbm90IHlldCBkZXRlY3RlZCwgZG8gc28gbm93ICovCi0gICAgaWYgKGVlcHJvbS0+d29yZF9zaXplID09IDApCi0gICAgICAgIGUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhodyk7CisJLyogSWYgZWVwcm9tIGlzIG5vdCB5ZXQgZGV0ZWN0ZWQsIGRvIHNvIG5vdyAqLworCWlmIChlZXByb20tPndvcmRfc2l6ZSA9PSAwKQorCQllMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMoaHcpOwogCi0gICAgLyogQSBjaGVjayBmb3IgaW52YWxpZCB2YWx1ZXM6ICBvZmZzZXQgdG9vIGxhcmdlLCB0b28gbWFueSB3b3JkcywgYW5kIG5vdAotICAgICAqIGVub3VnaCB3b3Jkcy4KLSAgICAgKi8KLSAgICBpZiAoKG9mZnNldCA+PSBlZXByb20tPndvcmRfc2l6ZSkgfHwgKHdvcmRzID4gZWVwcm9tLT53b3JkX3NpemUgLSBvZmZzZXQpIHx8Ci0gICAgICAgKHdvcmRzID09IDApKSB7Ci0gICAgICAgIERFQlVHT1VUMigiXCJ3b3Jkc1wiIHBhcmFtZXRlciBvdXQgb2YgYm91bmRzLiBXb3JkcyA9ICVkLCBzaXplID0gJWRcbiIsIG9mZnNldCwgZWVwcm9tLT53b3JkX3NpemUpOwotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgfQorCS8qIEEgY2hlY2sgZm9yIGludmFsaWQgdmFsdWVzOiAgb2Zmc2V0IHRvbyBsYXJnZSwgdG9vIG1hbnkgd29yZHMsIGFuZCBub3QKKwkgKiBlbm91Z2ggd29yZHMuCisJICovCisJaWYgKChvZmZzZXQgPj0gZWVwcm9tLT53b3JkX3NpemUpCisJICAgIHx8ICh3b3JkcyA+IGVlcHJvbS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fCAod29yZHMgPT0gMCkpIHsKKwkJREVCVUdPVVQyCisJCSAgICAoIlwid29yZHNcIiBwYXJhbWV0ZXIgb3V0IG9mIGJvdW5kcy4gV29yZHMgPSAlZCwgc2l6ZSA9ICVkXG4iLAorCQkgICAgIG9mZnNldCwgZWVwcm9tLT53b3JkX3NpemUpOworCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJfQogCi0gICAgLyogRUVQUk9NJ3MgdGhhdCBkb24ndCB1c2UgRUVSRCB0byByZWFkIHJlcXVpcmUgdXMgdG8gYml0LWJhbmcgdGhlIFNQSQotICAgICAqIGRpcmVjdGx5LiBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gYWNxdWlyZSB0aGUgRUVQUk9NIHNvIHRoYXQKLSAgICAgKiBGVyBvciBvdGhlciBwb3J0IHNvZnR3YXJlIGRvZXMgbm90IGludGVycnVwdC4KLSAgICAgKi8KLSAgICBpZiAoZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tKGh3KSAmJiAhaHctPmVlcHJvbS51c2VfZWVyZCkgewotICAgICAgICAvKiBQcmVwYXJlIHRoZSBFRVBST00gZm9yIGJpdC1iYW5nIHJlYWRpbmcgKi8KLSAgICAgICAgaWYgKGUxMDAwX2FjcXVpcmVfZWVwcm9tKGh3KSAhPSBFMTAwMF9TVUNDRVNTKQotICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwotICAgIH0KKwkvKiBFRVBST00ncyB0aGF0IGRvbid0IHVzZSBFRVJEIHRvIHJlYWQgcmVxdWlyZSB1cyB0byBiaXQtYmFuZyB0aGUgU1BJCisJICogZGlyZWN0bHkuIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBhY3F1aXJlIHRoZSBFRVBST00gc28gdGhhdAorCSAqIEZXIG9yIG90aGVyIHBvcnQgc29mdHdhcmUgZG9lcyBub3QgaW50ZXJydXB0LgorCSAqLworCS8qIFByZXBhcmUgdGhlIEVFUFJPTSBmb3IgYml0LWJhbmcgcmVhZGluZyAqLworCWlmIChlMTAwMF9hY3F1aXJlX2VlcHJvbShodykgIT0gRTEwMDBfU1VDQ0VTUykKKwkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogCi0gICAgLyogRWVyZCByZWdpc3RlciBFRVBST00gYWNjZXNzIHJlcXVpcmVzIG5vIGVlcHJvbSBhcXVpcmUvcmVsZWFzZSAqLwotICAgIGlmIChlZXByb20tPnVzZV9lZXJkKQotICAgICAgICByZXR1cm4gZTEwMDBfcmVhZF9lZXByb21fZWVyZChodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisJLyogU2V0IHVwIHRoZSBTUEkgb3IgTWljcm93aXJlIEVFUFJPTSBmb3IgYml0LWJhbmcgcmVhZGluZy4gIFdlIGhhdmUKKwkgKiBhY3F1aXJlZCB0aGUgRUVQUk9NIGF0IHRoaXMgcG9pbnQsIHNvIGFueSByZXR1cm5zIHNob3VsZCByZWxlYXNlIGl0ICovCisJaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisJCXUxNiB3b3JkX2luOworCQl1OCByZWFkX29wY29kZSA9IEVFUFJPTV9SRUFEX09QQ09ERV9TUEk7CiAKLSAgICAvKiBJQ0ggRUVQUk9NIGFjY2VzcyBpcyBkb25lIHZpYSB0aGUgSUNIIGZsYXNoIGNvbnRyb2xsZXIgKi8KLSAgICBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9pY2g4KQotICAgICAgICByZXR1cm4gZTEwMDBfcmVhZF9lZXByb21faWNoOChodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisJCWlmIChlMTAwMF9zcGlfZWVwcm9tX3JlYWR5KGh3KSkgeworCQkJZTEwMDBfcmVsZWFzZV9lZXByb20oaHcpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCQl9CiAKLSAgICAvKiBTZXQgdXAgdGhlIFNQSSBvciBNaWNyb3dpcmUgRUVQUk9NIGZvciBiaXQtYmFuZyByZWFkaW5nLiAgV2UgaGF2ZQotICAgICAqIGFjcXVpcmVkIHRoZSBFRVBST00gYXQgdGhpcyBwb2ludCwgc28gYW55IHJldHVybnMgc2hvdWxkIHJlbGFzZSBpdCAqLwotICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgewotICAgICAgICB1MTYgd29yZF9pbjsKLSAgICAgICAgdTggcmVhZF9vcGNvZGUgPSBFRVBST01fUkVBRF9PUENPREVfU1BJOworCQllMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CiAKLSAgICAgICAgaWYgKGUxMDAwX3NwaV9lZXByb21fcmVhZHkoaHcpKSB7Ci0gICAgICAgICAgICBlMTAwMF9yZWxlYXNlX2VlcHJvbShodyk7Ci0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgICAgIH0KKwkJLyogU29tZSBTUEkgZWVwcm9tcyB1c2UgdGhlIDh0aCBhZGRyZXNzIGJpdCBlbWJlZGRlZCBpbiB0aGUgb3Bjb2RlICovCisJCWlmICgoZWVwcm9tLT5hZGRyZXNzX2JpdHMgPT0gOCkgJiYgKG9mZnNldCA+PSAxMjgpKQorCQkJcmVhZF9vcGNvZGUgfD0gRUVQUk9NX0E4X09QQ09ERV9TUEk7CiAKLSAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCQkvKiBTZW5kIHRoZSBSRUFEIGNvbW1hbmQgKG9wY29kZSArIGFkZHIpICAqLworCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgcmVhZF9vcGNvZGUsIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHUxNikgKG9mZnNldCAqIDIpLAorCQkJCQllZXByb20tPmFkZHJlc3NfYml0cyk7CiAKLSAgICAgICAgLyogU29tZSBTUEkgZWVwcm9tcyB1c2UgdGhlIDh0aCBhZGRyZXNzIGJpdCBlbWJlZGRlZCBpbiB0aGUgb3Bjb2RlICovCi0gICAgICAgIGlmICgoZWVwcm9tLT5hZGRyZXNzX2JpdHMgPT0gOCkgJiYgKG9mZnNldCA+PSAxMjgpKQotICAgICAgICAgICAgcmVhZF9vcGNvZGUgfD0gRUVQUk9NX0E4X09QQ09ERV9TUEk7CisJCS8qIFJlYWQgdGhlIGRhdGEuICBUaGUgYWRkcmVzcyBvZiB0aGUgZWVwcm9tIGludGVybmFsbHkgaW5jcmVtZW50cyB3aXRoCisJCSAqIGVhY2ggYnl0ZSAoc3BpKSBiZWluZyByZWFkLCBzYXZpbmcgb24gdGhlIG92ZXJoZWFkIG9mIGVlcHJvbSBzZXR1cAorCQkgKiBhbmQgdGVhci1kb3duLiAgVGhlIGFkZHJlc3MgY291bnRlciB3aWxsIHJvbGwgb3ZlciBpZiByZWFkaW5nIGJleW9uZAorCQkgKiB0aGUgc2l6ZSBvZiB0aGUgZWVwcm9tLCB0aHVzIGFsbG93aW5nIHRoZSBlbnRpcmUgbWVtb3J5IHRvIGJlIHJlYWQKKwkJICogc3RhcnRpbmcgZnJvbSBhbnkgb2Zmc2V0LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgeworCQkJd29yZF9pbiA9IGUxMDAwX3NoaWZ0X2luX2VlX2JpdHMoaHcsIDE2KTsKKwkJCWRhdGFbaV0gPSAod29yZF9pbiA+PiA4KSB8ICh3b3JkX2luIDw8IDgpOworCQl9CisJfSBlbHNlIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgeworCQkJLyogU2VuZCB0aGUgUkVBRCBjb21tYW5kIChvcGNvZGUgKyBhZGRyKSAgKi8KKwkJCWUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LAorCQkJCQkJRUVQUk9NX1JFQURfT1BDT0RFX01JQ1JPV0lSRSwKKwkJCQkJCWVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCQkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1MTYpIChvZmZzZXQgKyBpKSwKKwkJCQkJCWVlcHJvbS0+YWRkcmVzc19iaXRzKTsKIAotICAgICAgICAvKiBTZW5kIHRoZSBSRUFEIGNvbW1hbmQgKG9wY29kZSArIGFkZHIpICAqLwotICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgcmVhZF9vcGNvZGUsIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOwotICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHUxNikob2Zmc2V0KjIpLCBlZXByb20tPmFkZHJlc3NfYml0cyk7CisJCQkvKiBSZWFkIHRoZSBkYXRhLiAgRm9yIG1pY3Jvd2lyZSwgZWFjaCB3b3JkIHJlcXVpcmVzIHRoZSBvdmVyaGVhZAorCQkJICogb2YgZWVwcm9tIHNldHVwIGFuZCB0ZWFyLWRvd24uICovCisJCQlkYXRhW2ldID0gZTEwMDBfc2hpZnRfaW5fZWVfYml0cyhodywgMTYpOworCQkJZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCQl9CisJfQogCi0gICAgICAgIC8qIFJlYWQgdGhlIGRhdGEuICBUaGUgYWRkcmVzcyBvZiB0aGUgZWVwcm9tIGludGVybmFsbHkgaW5jcmVtZW50cyB3aXRoCi0gICAgICAgICAqIGVhY2ggYnl0ZSAoc3BpKSBiZWluZyByZWFkLCBzYXZpbmcgb24gdGhlIG92ZXJoZWFkIG9mIGVlcHJvbSBzZXR1cAotICAgICAgICAgKiBhbmQgdGVhci1kb3duLiAgVGhlIGFkZHJlc3MgY291bnRlciB3aWxsIHJvbGwgb3ZlciBpZiByZWFkaW5nIGJleW9uZAotICAgICAgICAgKiB0aGUgc2l6ZSBvZiB0aGUgZWVwcm9tLCB0aHVzIGFsbG93aW5nIHRoZSBlbnRpcmUgbWVtb3J5IHRvIGJlIHJlYWQKLSAgICAgICAgICogc3RhcnRpbmcgZnJvbSBhbnkgb2Zmc2V0LiAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewotICAgICAgICAgICAgd29yZF9pbiA9IGUxMDAwX3NoaWZ0X2luX2VlX2JpdHMoaHcsIDE2KTsKLSAgICAgICAgICAgIGRhdGFbaV0gPSAod29yZF9pbiA+PiA4KSB8ICh3b3JkX2luIDw8IDgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewotICAgICAgICAgICAgLyogU2VuZCB0aGUgUkVBRCBjb21tYW5kIChvcGNvZGUgKyBhZGRyKSAgKi8KLSAgICAgICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fUkVBRF9PUENPREVfTUlDUk9XSVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyk7Ci0gICAgICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHUxNikob2Zmc2V0ICsgaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyk7CisJLyogRW5kIHRoaXMgcmVhZCBvcGVyYXRpb24gKi8KKwllMTAwMF9yZWxlYXNlX2VlcHJvbShodyk7CiAKLSAgICAgICAgICAgIC8qIFJlYWQgdGhlIGRhdGEuICBGb3IgbWljcm93aXJlLCBlYWNoIHdvcmQgcmVxdWlyZXMgdGhlIG92ZXJoZWFkCi0gICAgICAgICAgICAgKiBvZiBlZXByb20gc2V0dXAgYW5kIHRlYXItZG93bi4gKi8KLSAgICAgICAgICAgIGRhdGFbaV0gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7Ci0gICAgICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBFbmQgdGhpcyByZWFkIG9wZXJhdGlvbiAqLwotICAgIGUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZWFkcyBhIDE2IGJpdCB3b3JkIGZyb20gdGhlIEVFUFJPTSB1c2luZyB0aGUgRUVSRCByZWdpc3Rlci4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogb2Zmc2V0IC0gb2Zmc2V0IG9mICB3b3JkIGluIHRoZSBFRVBST00gdG8gcmVhZAotICogZGF0YSAtIHdvcmQgcmVhZCBmcm9tIHRoZSBFRVBST00KLSAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfcmVhZF9lZXByb21fZWVyZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsCi0JCQkJICB1MTYgKmRhdGEpCi17Ci0gICAgdTMyIGksIGVlcmQgPSAwOwotICAgIHMzMiBlcnJvciA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewotICAgICAgICBlZXJkID0gKChvZmZzZXQraSkgPDwgRTEwMDBfRUVQUk9NX1JXX0FERFJfU0hJRlQpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9FRVBST01fUldfUkVHX1NUQVJUOwotCi0gICAgICAgIGV3MzIoRUVSRCwgZWVyZCk7Ci0gICAgICAgIGVycm9yID0gZTEwMDBfcG9sbF9lZXJkX2Vld3JfZG9uZShodywgRTEwMDBfRUVQUk9NX1BPTExfUkVBRCk7Ci0KLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkYXRhW2ldID0gKGVyMzIoRUVSRCkgPj4gRTEwMDBfRUVQUk9NX1JXX1JFR19EQVRBKTsKLQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogV3JpdGVzIGEgMTYgYml0IHdvcmQgZnJvbSB0aGUgRUVQUk9NIHVzaW5nIHRoZSBFRVdSIHJlZ2lzdGVyLgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiBvZmZzZXQgLSBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCi0gKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQotICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF93cml0ZV9lZXByb21fZWV3cihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsCi0JCQkJICAgdTE2ICpkYXRhKQotewotICAgIHUzMiAgICByZWdpc3Rlcl92YWx1ZSA9IDA7Ci0gICAgdTMyICAgIGkgICAgICAgICAgICAgID0gMDsKLSAgICBzMzIgICAgIGVycm9yICAgICAgICAgID0gMDsKLQotICAgIGlmIChlMTAwMF9zd2Z3X3N5bmNfYWNxdWlyZShodywgRTEwMDBfU1dGV19FRVBfU00pKQotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9TV0ZXX1NZTkM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewotICAgICAgICByZWdpc3Rlcl92YWx1ZSA9IChkYXRhW2ldIDw8IEUxMDAwX0VFUFJPTV9SV19SRUdfREFUQSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICgob2Zmc2V0K2kpIDw8IEUxMDAwX0VFUFJPTV9SV19BRERSX1NISUZUKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfRUVQUk9NX1JXX1JFR19TVEFSVDsKLQotICAgICAgICBlcnJvciA9IGUxMDAwX3BvbGxfZWVyZF9lZXdyX2RvbmUoaHcsIEUxMDAwX0VFUFJPTV9QT0xMX1dSSVRFKTsKLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGV3MzIoRUVXUiwgcmVnaXN0ZXJfdmFsdWUpOwotCi0gICAgICAgIGVycm9yID0gZTEwMDBfcG9sbF9lZXJkX2Vld3JfZG9uZShodywgRTEwMDBfRUVQUk9NX1BPTExfV1JJVEUpOwotCi0gICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlMTAwMF9zd2Z3X3N5bmNfcmVsZWFzZShodywgRTEwMDBfU1dGV19FRVBfU00pOwotICAgIHJldHVybiBlcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUG9sbHMgdGhlIHN0YXR1cyBiaXQgKGJpdCAxKSBvZiB0aGUgRUVSRCB0byBkZXRlcm1pbmUgd2hlbiB0aGUgcmVhZCBpcyBkb25lLgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgczMyIGUxMDAwX3BvbGxfZWVyZF9lZXdyX2RvbmUoc3RydWN0IGUxMDAwX2h3ICpodywgaW50IGVlcmQpCi17Ci0gICAgdTMyIGF0dGVtcHRzID0gMTAwMDAwOwotICAgIHUzMiBpLCByZWcgPSAwOwotICAgIHMzMiBkb25lID0gRTEwMDBfRVJSX0VFUFJPTTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBhdHRlbXB0czsgaSsrKSB7Ci0gICAgICAgIGlmIChlZXJkID09IEUxMDAwX0VFUFJPTV9QT0xMX1JFQUQpCi0gICAgICAgICAgICByZWcgPSBlcjMyKEVFUkQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZWcgPSBlcjMyKEVFV1IpOwotCi0gICAgICAgIGlmIChyZWcgJiBFMTAwMF9FRVBST01fUldfUkVHX0RPTkUpIHsKLSAgICAgICAgICAgIGRvbmUgPSBFMTAwMF9TVUNDRVNTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdWRlbGF5KDUpOwotICAgIH0KLQotICAgIHJldHVybiBkb25lOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIERlc2NyaXB0aW9uOiAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgb25ib2FyZCBOVk0gaXMgRkxBU0ggb3IgRUVQUk9NLgotKgotKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sIGUxMDAwX2lzX29uYm9hcmRfbnZtX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQotewotICAgIHUzMiBlZWNkID0gMDsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfaXNfb25ib2FyZF9udm1fZWVwcm9tIik7Ci0KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKLSAgICAgICAgZWVjZCA9IGVyMzIoRUVDRCk7Ci0KLSAgICAgICAgLyogSXNvbGF0ZSBiaXRzIDE1ICYgMTYgKi8KLSAgICAgICAgZWVjZCA9ICgoZWVjZCA+PiAxNSkgJiAweDAzKTsKLQotICAgICAgICAvKiBJZiBib3RoIGJpdHMgYXJlIHNldCwgZGV2aWNlIGlzIEZsYXNoIHR5cGUgKi8KLSAgICAgICAgaWYgKGVlY2QgPT0gMHgwMykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWZXJpZmllcyB0aGF0IHRoZSBFRVBST00gaGFzIGEgdmFsaWQgY2hlY2tzdW0KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorLyoqCisgKiBlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0gLSBWZXJpZmllcyB0aGF0IHRoZSBFRVBST00gaGFzIGEgdmFsaWQgY2hlY2tzdW0KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCiAgKgogICogUmVhZHMgdGhlIGZpcnN0IDY0IDE2IGJpdCB3b3JkcyBvZiB0aGUgRUVQUk9NIGFuZCBzdW1zIHRoZSB2YWx1ZXMgcmVhZC4KICAqIElmIHRoZSB0aGUgc3VtIG9mIHRoZSA2NCAxNiBiaXQgd29yZHMgaXMgMHhCQUJBLCB0aGUgRUVQUk9NJ3MgY2hlY2tzdW0gaXMKICAqIHZhbGlkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzMzIgZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTE2IGNoZWNrc3VtID0gMDsKLSAgICB1MTYgaSwgZWVwcm9tX2RhdGE7CisJdTE2IGNoZWNrc3VtID0gMDsKKwl1MTYgaSwgZWVwcm9tX2RhdGE7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bSIpOworCURFQlVHRlVOQygiZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtIik7CiAKLSAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykgJiYgIWUxMDAwX2lzX29uYm9hcmRfbnZtX2VlcHJvbShodykpIHsKLSAgICAgICAgLyogQ2hlY2sgYml0IDQgb2Ygd29yZCAxMGguICBJZiBpdCBpcyAwLCBmaXJtd2FyZSBpcyBkb25lIHVwZGF0aW5nCi0gICAgICAgICAqIDEwaC0xMmguICBDaGVja3N1bSBtYXkgbmVlZCB0byBiZSBmaXhlZC4gKi8KLSAgICAgICAgZTEwMDBfcmVhZF9lZXByb20oaHcsIDB4MTAsIDEsICZlZXByb21fZGF0YSk7Ci0gICAgICAgIGlmICgoZWVwcm9tX2RhdGEgJiAweDEwKSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBSZWFkIDB4MjMgYW5kIGNoZWNrIGJpdCAxNS4gIFRoaXMgYml0IGlzIGEgMSB3aGVuIHRoZSBjaGVja3N1bQotICAgICAgICAgICAgICogaGFzIGFscmVhZHkgYmVlbiBmaXhlZC4gIElmIHRoZSBjaGVja3N1bSBpcyBzdGlsbCB3cm9uZyBhbmQgdGhpcwotICAgICAgICAgICAgICogYml0IGlzIGEgMSwgd2UgbmVlZCB0byByZXR1cm4gYmFkIGNoZWNrc3VtLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkCi0gICAgICAgICAgICAgKiB0byBzZXQgdGhpcyBiaXQgdG8gYSAxIGFuZCB1cGRhdGUgdGhlIGNoZWNrc3VtLiAqLwotICAgICAgICAgICAgZTEwMDBfcmVhZF9lZXByb20oaHcsIDB4MjMsIDEsICZlZXByb21fZGF0YSk7Ci0gICAgICAgICAgICBpZiAoKGVlcHJvbV9kYXRhICYgMHg4MDAwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZWVwcm9tX2RhdGEgfD0gMHg4MDAwOwotICAgICAgICAgICAgICAgIGUxMDAwX3dyaXRlX2VlcHJvbShodywgMHgyMywgMSwgJmVlcHJvbV9kYXRhKTsKLSAgICAgICAgICAgICAgICBlMTAwMF91cGRhdGVfZWVwcm9tX2NoZWNrc3VtKGh3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9DSEVDS1NVTV9SRUcgKyAxKTsgaSsrKSB7CisJCWlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgaSwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKwkJCURFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJCX0KKwkJY2hlY2tzdW0gKz0gZWVwcm9tX2RhdGE7CisJfQogCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgIC8qIERyaXZlcnMgbXVzdCBhbGxvY2F0ZSB0aGUgc2hhZG93IHJhbSBzdHJ1Y3R1cmUgZm9yIHRoZQotICAgICAgICAgKiBFRVBST00gY2hlY2tzdW0gdG8gYmUgdXBkYXRlZC4gIE90aGVyd2lzZSwgdGhpcyBiaXQgYXMgd2VsbAotICAgICAgICAgKiBhcyB0aGUgY2hlY2tzdW0gbXVzdCBib3RoIGJlIHNldCBjb3JyZWN0bHkgZm9yIHRoaXMKLSAgICAgICAgICogdmFsaWRhdGlvbiB0byBwYXNzLgotICAgICAgICAgKi8KLSAgICAgICAgZTEwMDBfcmVhZF9lZXByb20oaHcsIDB4MTksIDEsICZlZXByb21fZGF0YSk7Ci0gICAgICAgIGlmICgoZWVwcm9tX2RhdGEgJiAweDQwKSA9PSAwKSB7Ci0gICAgICAgICAgICBlZXByb21fZGF0YSB8PSAweDQwOwotICAgICAgICAgICAgZTEwMDBfd3JpdGVfZWVwcm9tKGh3LCAweDE5LCAxLCAmZWVwcm9tX2RhdGEpOwotICAgICAgICAgICAgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShodyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9DSEVDS1NVTV9SRUcgKyAxKTsgaSsrKSB7Ci0gICAgICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgaSwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKLSAgICAgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tzdW0gKz0gZWVwcm9tX2RhdGE7Ci0gICAgfQotCi0gICAgaWYgKGNoZWNrc3VtID09ICh1MTYpRUVQUk9NX1NVTSkKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0gICAgZWxzZSB7Ci0gICAgICAgIERFQlVHT1VUKCJFRVBST00gQ2hlY2tzdW0gSW52YWxpZFxuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICB9CisJaWYgKGNoZWNrc3VtID09ICh1MTYpIEVFUFJPTV9TVU0pCisJCXJldHVybiBFMTAwMF9TVUNDRVNTOworCWVsc2UgeworCQlERUJVR09VVCgiRUVQUk9NIENoZWNrc3VtIEludmFsaWRcbiIpOworCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDYWxjdWxhdGVzIHRoZSBFRVBST00gY2hlY2tzdW0gYW5kIHdyaXRlcyBpdCB0byB0aGUgRUVQUk9NCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKy8qKgorICogZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSAtIENhbGN1bGF0ZXMvd3JpdGVzIHRoZSBFRVBST00gY2hlY2tzdW0KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCiAgKgogICogU3VtcyB0aGUgZmlyc3QgNjMgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00uIFN1YnRyYWN0cyB0aGUgc3VtIGZyb20gMHhCQUJBLgogICogV3JpdGVzIHRoZSBkaWZmZXJlbmNlIHRvIHdvcmQgb2Zmc2V0IDYzIG9mIHRoZSBFRVBST00uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIHMzMiBlMTAwMF91cGRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIGN0cmxfZXh0OwotICAgIHUxNiBjaGVja3N1bSA9IDA7Ci0gICAgdTE2IGksIGVlcHJvbV9kYXRhOworCXUxNiBjaGVja3N1bSA9IDA7CisJdTE2IGksIGVlcHJvbV9kYXRhOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF91cGRhdGVfZWVwcm9tX2NoZWNrc3VtIik7CisJREVCVUdGVU5DKCJlMTAwMF91cGRhdGVfZWVwcm9tX2NoZWNrc3VtIik7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgRUVQUk9NX0NIRUNLU1VNX1JFRzsgaSsrKSB7Ci0gICAgICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgaSwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKLSAgICAgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tzdW0gKz0gZWVwcm9tX2RhdGE7Ci0gICAgfQotICAgIGNoZWNrc3VtID0gKHUxNilFRVBST01fU1VNIC0gY2hlY2tzdW07Ci0gICAgaWYgKGUxMDAwX3dyaXRlX2VlcHJvbShodywgRUVQUk9NX0NIRUNLU1VNX1JFRywgMSwgJmNoZWNrc3VtKSA8IDApIHsKLSAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBXcml0ZSBFcnJvclxuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICB9IGVsc2UgaWYgKGh3LT5lZXByb20udHlwZSA9PSBlMTAwMF9lZXByb21fZmxhc2gpIHsKLSAgICAgICAgZTEwMDBfY29tbWl0X3NoYWRvd19yYW0oaHcpOwotICAgIH0gZWxzZSBpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9pY2g4KSB7Ci0gICAgICAgIGUxMDAwX2NvbW1pdF9zaGFkb3dfcmFtKGh3KTsKLSAgICAgICAgLyogUmVsb2FkIHRoZSBFRVBST00sIG9yIGVsc2UgbW9kaWZpY2F0aW9ucyB3aWxsIG5vdCBhcHBlYXIKLSAgICAgICAgICogdW50aWwgYWZ0ZXIgbmV4dCBhZGFwdGVyIHJlc2V0LiAqLwotICAgICAgICBjdHJsX2V4dCA9IGVyMzIoQ1RSTF9FWFQpOwotICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9FRV9SU1Q7Ci0gICAgICAgIGV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0KTsKLSAgICAgICAgbXNsZWVwKDEwKTsKLSAgICB9Ci0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJZm9yIChpID0gMDsgaSA8IEVFUFJPTV9DSEVDS1NVTV9SRUc7IGkrKykgeworCQlpZiAoZTEwMDBfcmVhZF9lZXByb20oaHcsIGksIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisJCQlERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCQl9CisJCWNoZWNrc3VtICs9IGVlcHJvbV9kYXRhOworCX0KKwljaGVja3N1bSA9ICh1MTYpIEVFUFJPTV9TVU0gLSBjaGVja3N1bTsKKwlpZiAoZTEwMDBfd3JpdGVfZWVwcm9tKGh3LCBFRVBST01fQ0hFQ0tTVU1fUkVHLCAxLCAmY2hlY2tzdW0pIDwgMCkgeworCQlERUJVR09VVCgiRUVQUk9NIFdyaXRlIEVycm9yXG4iKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCX0KKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGFyZW50IGZ1bmN0aW9uIGZvciB3cml0aW5nIHdvcmRzIHRvIHRoZSBkaWZmZXJlbnQgRUVQUk9NIHR5cGVzLgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiBvZmZzZXQgLSBvZmZzZXQgd2l0aGluIHRoZSBFRVBST00gdG8gYmUgd3JpdHRlbiB0bwotICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gd3JpdGUKLSAqIGRhdGEgLSAxNiBiaXQgd29yZCB0byBiZSB3cml0dGVuIHRvIHRoZSBFRVBST00KKy8qKgorICogZTEwMDBfd3JpdGVfZWVwcm9tIC0gd3JpdGUgd29yZHMgdG8gdGhlIGRpZmZlcmVudCBFRVBST00gdHlwZXMuCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQG9mZnNldDogb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KKyAqIEB3b3JkczogbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlCisgKiBAZGF0YTogMTYgYml0IHdvcmQgdG8gYmUgd3JpdHRlbiB0byB0aGUgRUVQUk9NCiAgKgogICogSWYgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSBpcyBub3QgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZQogICogRUVQUk9NIHdpbGwgbW9zdCBsaWtlbHkgY29udGFpbiBhbiBpbnZhbGlkIGNoZWNrc3VtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzMzIgZTEwMDBfd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywgdTE2ICpkYXRhKQogewotICAgIHMzMiByZXQ7Ci0gICAgc3Bpbl9sb2NrKCZlMTAwMF9lZXByb21fbG9jayk7Ci0gICAgcmV0ID0gZTEwMDBfZG9fd3JpdGVfZWVwcm9tKGh3LCBvZmZzZXQsIHdvcmRzLCBkYXRhKTsKLSAgICBzcGluX3VubG9jaygmZTEwMDBfZWVwcm9tX2xvY2spOwotICAgIHJldHVybiByZXQ7CisJczMyIHJldDsKKwlzcGluX2xvY2soJmUxMDAwX2VlcHJvbV9sb2NrKTsKKwlyZXQgPSBlMTAwMF9kb193cml0ZV9lZXByb20oaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworCXNwaW5fdW5sb2NrKCZlMTAwMF9lZXByb21fbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAotCi1zdGF0aWMgczMyIGUxMDAwX2RvX3dyaXRlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsIHUxNiAqZGF0YSkKK3N0YXRpYyBzMzIgZTEwMDBfZG9fd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKKwkJCQkgdTE2ICpkYXRhKQogewotICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207Ci0gICAgczMyIHN0YXR1cyA9IDA7CisJc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKwlzMzIgc3RhdHVzID0gMDsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfd3JpdGVfZWVwcm9tIik7CisJREVCVUdGVU5DKCJlMTAwMF93cml0ZV9lZXByb20iKTsKIAotICAgIC8qIElmIGVlcHJvbSBpcyBub3QgeWV0IGRldGVjdGVkLCBkbyBzbyBub3cgKi8KLSAgICBpZiAoZWVwcm9tLT53b3JkX3NpemUgPT0gMCkKLSAgICAgICAgZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKGh3KTsKKwkvKiBJZiBlZXByb20gaXMgbm90IHlldCBkZXRlY3RlZCwgZG8gc28gbm93ICovCisJaWYgKGVlcHJvbS0+d29yZF9zaXplID09IDApCisJCWUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhodyk7CiAKLSAgICAvKiBBIGNoZWNrIGZvciBpbnZhbGlkIHZhbHVlczogIG9mZnNldCB0b28gbGFyZ2UsIHRvbyBtYW55IHdvcmRzLCBhbmQgbm90Ci0gICAgICogZW5vdWdoIHdvcmRzLgotICAgICAqLwotICAgIGlmICgob2Zmc2V0ID49IGVlcHJvbS0+d29yZF9zaXplKSB8fCAod29yZHMgPiBlZXByb20tPndvcmRfc2l6ZSAtIG9mZnNldCkgfHwKLSAgICAgICAod29yZHMgPT0gMCkpIHsKLSAgICAgICAgREVCVUdPVVQoIlwid29yZHNcIiBwYXJhbWV0ZXIgb3V0IG9mIGJvdW5kc1xuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICB9CisJLyogQSBjaGVjayBmb3IgaW52YWxpZCB2YWx1ZXM6ICBvZmZzZXQgdG9vIGxhcmdlLCB0b28gbWFueSB3b3JkcywgYW5kIG5vdAorCSAqIGVub3VnaCB3b3Jkcy4KKwkgKi8KKwlpZiAoKG9mZnNldCA+PSBlZXByb20tPndvcmRfc2l6ZSkKKwkgICAgfHwgKHdvcmRzID4gZWVwcm9tLT53b3JkX3NpemUgLSBvZmZzZXQpIHx8ICh3b3JkcyA9PSAwKSkgeworCQlERUJVR09VVCgiXCJ3b3Jkc1wiIHBhcmFtZXRlciBvdXQgb2YgYm91bmRzXG4iKTsKKwkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCX0KIAotICAgIC8qIDgyNTczIHdyaXRlcyBvbmx5IHRocm91Z2ggZWV3ciAqLwotICAgIGlmIChlZXByb20tPnVzZV9lZXdyKQotICAgICAgICByZXR1cm4gZTEwMDBfd3JpdGVfZWVwcm9tX2Vld3IoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworCS8qIFByZXBhcmUgdGhlIEVFUFJPTSBmb3Igd3JpdGluZyAgKi8KKwlpZiAoZTEwMDBfYWNxdWlyZV9lZXByb20oaHcpICE9IEUxMDAwX1NVQ0NFU1MpCisJCXJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKIAotICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX2ljaDgpCi0gICAgICAgIHJldHVybiBlMTAwMF93cml0ZV9lZXByb21faWNoOChodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisJaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisJCXN0YXR1cyA9IGUxMDAwX3dyaXRlX2VlcHJvbV9taWNyb3dpcmUoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGUxMDAwX3dyaXRlX2VlcHJvbV9zcGkoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworCQltc2xlZXAoMTApOworCX0KIAotICAgIC8qIFByZXBhcmUgdGhlIEVFUFJPTSBmb3Igd3JpdGluZyAgKi8KLSAgICBpZiAoZTEwMDBfYWNxdWlyZV9lZXByb20oaHcpICE9IEUxMDAwX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKwkvKiBEb25lIHdpdGggd3JpdGluZyAqLworCWUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKIAotICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgewotICAgICAgICBzdGF0dXMgPSBlMTAwMF93cml0ZV9lZXByb21fbWljcm93aXJlKGh3LCBvZmZzZXQsIHdvcmRzLCBkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBlMTAwMF93cml0ZV9lZXByb21fc3BpKGh3LCBvZmZzZXQsIHdvcmRzLCBkYXRhKTsKLSAgICAgICAgbXNsZWVwKDEwKTsKLSAgICB9Ci0KLSAgICAvKiBEb25lIHdpdGggd3JpdGluZyAqLwotICAgIGUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKLQotICAgIHJldHVybiBzdGF0dXM7CisJcmV0dXJuIHN0YXR1czsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogV3JpdGVzIGEgMTYgYml0IHdvcmQgdG8gYSBnaXZlbiBvZmZzZXQgaW4gYW4gU1BJIEVFUFJPTS4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogb2Zmc2V0IC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KLSAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlCi0gKiBkYXRhIC0gcG9pbnRlciB0byBhcnJheSBvZiA4IGJpdCB3b3JkcyB0byBiZSB3cml0dGVuIHRvIHRoZSBFRVBST00KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX3dyaXRlX2VlcHJvbV9zcGkgLSBXcml0ZXMgYSAxNiBiaXQgd29yZCB0byBhIGdpdmVuIG9mZnNldCBpbiBhbiBTUEkgRUVQUk9NLgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIEBvZmZzZXQ6IG9mZnNldCB3aXRoaW4gdGhlIEVFUFJPTSB0byBiZSB3cml0dGVuIHRvCisgKiBAd29yZHM6IG51bWJlciBvZiB3b3JkcyB0byB3cml0ZQorICogQGRhdGE6IHBvaW50ZXIgdG8gYXJyYXkgb2YgOCBiaXQgd29yZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgRUVQUk9NCisgKi8KIHN0YXRpYyBzMzIgZTEwMDBfd3JpdGVfZWVwcm9tX3NwaShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsCiAJCQkJICB1MTYgKmRhdGEpCiB7Ci0gICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKLSAgICB1MTYgd2lkeCA9IDA7CisJc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKwl1MTYgd2lkeCA9IDA7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX2VlcHJvbV9zcGkiKTsKKwlERUJVR0ZVTkMoImUxMDAwX3dyaXRlX2VlcHJvbV9zcGkiKTsKIAotICAgIHdoaWxlICh3aWR4IDwgd29yZHMpIHsKLSAgICAgICAgdTggd3JpdGVfb3Bjb2RlID0gRUVQUk9NX1dSSVRFX09QQ09ERV9TUEk7CisJd2hpbGUgKHdpZHggPCB3b3JkcykgeworCQl1OCB3cml0ZV9vcGNvZGUgPSBFRVBST01fV1JJVEVfT1BDT0RFX1NQSTsKIAotICAgICAgICBpZiAoZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShodykpIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKwkJaWYgKGUxMDAwX3NwaV9lZXByb21fcmVhZHkoaHcpKQorCQkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwogCi0gICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKwkJZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOwogCi0gICAgICAgIC8qICBTZW5kIHRoZSBXUklURSBFTkFCTEUgY29tbWFuZCAoOCBiaXQgb3Bjb2RlICkgICovCi0gICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fV1JFTl9PUENPREVfU1BJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyk7CisJCS8qICBTZW5kIHRoZSBXUklURSBFTkFCTEUgY29tbWFuZCAoOCBiaXQgb3Bjb2RlICkgICovCisJCWUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fV1JFTl9PUENPREVfU1BJLAorCQkJCQllZXByb20tPm9wY29kZV9iaXRzKTsKIAotICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisJCWUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKIAotICAgICAgICAvKiBTb21lIFNQSSBlZXByb21zIHVzZSB0aGUgOHRoIGFkZHJlc3MgYml0IGVtYmVkZGVkIGluIHRoZSBvcGNvZGUgKi8KLSAgICAgICAgaWYgKChlZXByb20tPmFkZHJlc3NfYml0cyA9PSA4KSAmJiAob2Zmc2V0ID49IDEyOCkpCi0gICAgICAgICAgICB3cml0ZV9vcGNvZGUgfD0gRUVQUk9NX0E4X09QQ09ERV9TUEk7CisJCS8qIFNvbWUgU1BJIGVlcHJvbXMgdXNlIHRoZSA4dGggYWRkcmVzcyBiaXQgZW1iZWRkZWQgaW4gdGhlIG9wY29kZSAqLworCQlpZiAoKGVlcHJvbS0+YWRkcmVzc19iaXRzID09IDgpICYmIChvZmZzZXQgPj0gMTI4KSkKKwkJCXdyaXRlX29wY29kZSB8PSBFRVBST01fQThfT1BDT0RFX1NQSTsKIAotICAgICAgICAvKiBTZW5kIHRoZSBXcml0ZSBjb21tYW5kICg4LWJpdCBvcGNvZGUgKyBhZGRyKSAqLwotICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgd3JpdGVfb3Bjb2RlLCBlZXByb20tPm9wY29kZV9iaXRzKTsKKwkJLyogU2VuZCB0aGUgV3JpdGUgY29tbWFuZCAoOC1iaXQgb3Bjb2RlICsgYWRkcikgKi8KKwkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIHdyaXRlX29wY29kZSwgZWVwcm9tLT5vcGNvZGVfYml0cyk7CiAKLSAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1MTYpKChvZmZzZXQgKyB3aWR4KSoyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMpOworCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHUxNikgKChvZmZzZXQgKyB3aWR4KSAqIDIpLAorCQkJCQllZXByb20tPmFkZHJlc3NfYml0cyk7CiAKLSAgICAgICAgLyogU2VuZCB0aGUgZGF0YSAqLworCQkvKiBTZW5kIHRoZSBkYXRhICovCiAKLSAgICAgICAgLyogTG9vcCB0byBhbGxvdyBmb3IgdXAgdG8gd2hvbGUgcGFnZSB3cml0ZSAoMzIgYnl0ZXMpIG9mIGVlcHJvbSAqLwotICAgICAgICB3aGlsZSAod2lkeCA8IHdvcmRzKSB7Ci0gICAgICAgICAgICB1MTYgd29yZF9vdXQgPSBkYXRhW3dpZHhdOwotICAgICAgICAgICAgd29yZF9vdXQgPSAod29yZF9vdXQgPj4gOCkgfCAod29yZF9vdXQgPDwgOCk7Ci0gICAgICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgd29yZF9vdXQsIDE2KTsKLSAgICAgICAgICAgIHdpZHgrKzsKKwkJLyogTG9vcCB0byBhbGxvdyBmb3IgdXAgdG8gd2hvbGUgcGFnZSB3cml0ZSAoMzIgYnl0ZXMpIG9mIGVlcHJvbSAqLworCQl3aGlsZSAod2lkeCA8IHdvcmRzKSB7CisJCQl1MTYgd29yZF9vdXQgPSBkYXRhW3dpZHhdOworCQkJd29yZF9vdXQgPSAod29yZF9vdXQgPj4gOCkgfCAod29yZF9vdXQgPDwgOCk7CisJCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgd29yZF9vdXQsIDE2KTsKKwkJCXdpZHgrKzsKIAotICAgICAgICAgICAgLyogU29tZSBsYXJnZXIgZWVwcm9tIHNpemVzIGFyZSBjYXBhYmxlIG9mIGEgMzItYnl0ZSBQQUdFIFdSSVRFCi0gICAgICAgICAgICAgKiBvcGVyYXRpb24sIHdoaWxlIHRoZSBzbWFsbGVyIGVlcHJvbXMgYXJlIGNhcGFibGUgb2YgYW4gOC1ieXRlCi0gICAgICAgICAgICAgKiBQQUdFIFdSSVRFIG9wZXJhdGlvbi4gIEJyZWFrIHRoZSBpbm5lciBsb29wIHRvIHBhc3MgbmV3IGFkZHJlc3MKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCgoKG9mZnNldCArIHdpZHgpKjIpICUgZWVwcm9tLT5wYWdlX3NpemUpID09IDApIHsKLSAgICAgICAgICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJCQkvKiBTb21lIGxhcmdlciBlZXByb20gc2l6ZXMgYXJlIGNhcGFibGUgb2YgYSAzMi1ieXRlIFBBR0UgV1JJVEUKKwkJCSAqIG9wZXJhdGlvbiwgd2hpbGUgdGhlIHNtYWxsZXIgZWVwcm9tcyBhcmUgY2FwYWJsZSBvZiBhbiA4LWJ5dGUKKwkJCSAqIFBBR0UgV1JJVEUgb3BlcmF0aW9uLiAgQnJlYWsgdGhlIGlubmVyIGxvb3AgdG8gcGFzcyBuZXcgYWRkcmVzcworCQkJICovCisJCQlpZiAoKCgob2Zmc2V0ICsgd2lkeCkgKiAyKSAlIGVlcHJvbS0+cGFnZV9zaXplKSA9PSAwKSB7CisJCQkJZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQogCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdyaXRlcyBhIDE2IGJpdCB3b3JkIHRvIGEgZ2l2ZW4gb2Zmc2V0IGluIGEgTWljcm93aXJlIEVFUFJPTS4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogb2Zmc2V0IC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KLSAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlCi0gKiBkYXRhIC0gcG9pbnRlciB0byBhcnJheSBvZiAxNiBiaXQgd29yZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgRUVQUk9NCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF93cml0ZV9lZXByb21fbWljcm93aXJlIC0gV3JpdGVzIGEgMTYgYml0IHdvcmQgdG8gYSBnaXZlbiBvZmZzZXQgaW4gYSBNaWNyb3dpcmUgRUVQUk9NLgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIEBvZmZzZXQ6IG9mZnNldCB3aXRoaW4gdGhlIEVFUFJPTSB0byBiZSB3cml0dGVuIHRvCisgKiBAd29yZHM6IG51bWJlciBvZiB3b3JkcyB0byB3cml0ZQorICogQGRhdGE6IHBvaW50ZXIgdG8gYXJyYXkgb2YgOCBiaXQgd29yZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgRUVQUk9NCisgKi8KIHN0YXRpYyBzMzIgZTEwMDBfd3JpdGVfZWVwcm9tX21pY3Jvd2lyZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LAogCQkJCQl1MTYgd29yZHMsIHUxNiAqZGF0YSkKIHsKLSAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOwotICAgIHUzMiBlZWNkOwotICAgIHUxNiB3b3Jkc193cml0dGVuID0gMDsKLSAgICB1MTYgaSA9IDA7CisJc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKwl1MzIgZWVjZDsKKwl1MTYgd29yZHNfd3JpdHRlbiA9IDA7CisJdTE2IGkgPSAwOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9lZXByb21fbWljcm93aXJlIik7CisJREVCVUdGVU5DKCJlMTAwMF93cml0ZV9lZXByb21fbWljcm93aXJlIik7CiAKLSAgICAvKiBTZW5kIHRoZSB3cml0ZSBlbmFibGUgY29tbWFuZCB0byB0aGUgRUVQUk9NICgzLWJpdCBvcGNvZGUgcGx1cwotICAgICAqIDYvOC1iaXQgZHVtbXkgYWRkcmVzcyBiZWdpbm5pbmcgd2l0aCAxMSkuICBJdCdzIGxlc3Mgd29yayB0byBpbmNsdWRlCi0gICAgICogdGhlIDExIG9mIHRoZSBkdW1teSBhZGRyZXNzIGFzIHBhcnQgb2YgdGhlIG9wY29kZSB0aGFuIGl0IGlzIHRvIHNoaWZ0Ci0gICAgICogaXQgb3ZlciB0aGUgY29ycmVjdCBudW1iZXIgb2YgYml0cyBmb3IgdGhlIGFkZHJlc3MuICBUaGlzIHB1dHMgdGhlCi0gICAgICogRUVQUk9NIGludG8gd3JpdGUvZXJhc2UgbW9kZS4KLSAgICAgKi8KLSAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX0VXRU5fT1BDT0RFX01JQ1JPV0lSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2KShlZXByb20tPm9wY29kZV9iaXRzICsgMikpOworCS8qIFNlbmQgdGhlIHdyaXRlIGVuYWJsZSBjb21tYW5kIHRvIHRoZSBFRVBST00gKDMtYml0IG9wY29kZSBwbHVzCisJICogNi84LWJpdCBkdW1teSBhZGRyZXNzIGJlZ2lubmluZyB3aXRoIDExKS4gIEl0J3MgbGVzcyB3b3JrIHRvIGluY2x1ZGUKKwkgKiB0aGUgMTEgb2YgdGhlIGR1bW15IGFkZHJlc3MgYXMgcGFydCBvZiB0aGUgb3Bjb2RlIHRoYW4gaXQgaXMgdG8gc2hpZnQKKwkgKiBpdCBvdmVyIHRoZSBjb3JyZWN0IG51bWJlciBvZiBiaXRzIGZvciB0aGUgYWRkcmVzcy4gIFRoaXMgcHV0cyB0aGUKKwkgKiBFRVBST00gaW50byB3cml0ZS9lcmFzZSBtb2RlLgorCSAqLworCWUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fRVdFTl9PUENPREVfTUlDUk9XSVJFLAorCQkJCSh1MTYpIChlZXByb20tPm9wY29kZV9iaXRzICsgMikpOwogCi0gICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIDAsICh1MTYpKGVlcHJvbS0+YWRkcmVzc19iaXRzIC0gMikpOworCWUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCAwLCAodTE2KSAoZWVwcm9tLT5hZGRyZXNzX2JpdHMgLSAyKSk7CiAKLSAgICAvKiBQcmVwYXJlIHRoZSBFRVBST00gKi8KLSAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisJLyogUHJlcGFyZSB0aGUgRUVQUk9NICovCisJZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOwogCi0gICAgd2hpbGUgKHdvcmRzX3dyaXR0ZW4gPCB3b3JkcykgewotICAgICAgICAvKiBTZW5kIHRoZSBXcml0ZSBjb21tYW5kICgzLWJpdCBvcGNvZGUgKyBhZGRyKSAqLwotICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1dSSVRFX09QQ09ERV9NSUNST1dJUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCXdoaWxlICh3b3Jkc193cml0dGVuIDwgd29yZHMpIHsKKwkJLyogU2VuZCB0aGUgV3JpdGUgY29tbWFuZCAoMy1iaXQgb3Bjb2RlICsgYWRkcikgKi8KKwkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9XUklURV9PUENPREVfTUlDUk9XSVJFLAorCQkJCQllZXByb20tPm9wY29kZV9iaXRzKTsKIAotICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHUxNikob2Zmc2V0ICsgd29yZHNfd3JpdHRlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKwkJZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1MTYpIChvZmZzZXQgKyB3b3Jkc193cml0dGVuKSwKKwkJCQkJZWVwcm9tLT5hZGRyZXNzX2JpdHMpOwogCi0gICAgICAgIC8qIFNlbmQgdGhlIGRhdGEgKi8KLSAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIGRhdGFbd29yZHNfd3JpdHRlbl0sIDE2KTsKKwkJLyogU2VuZCB0aGUgZGF0YSAqLworCQllMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgZGF0YVt3b3Jkc193cml0dGVuXSwgMTYpOwogCi0gICAgICAgIC8qIFRvZ2dsZSB0aGUgQ1MgbGluZS4gIFRoaXMgaW4gZWZmZWN0IHRlbGxzIHRoZSBFRVBST00gdG8gZXhlY3V0ZQotICAgICAgICAgKiB0aGUgcHJldmlvdXMgY29tbWFuZC4KLSAgICAgICAgICovCi0gICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKwkJLyogVG9nZ2xlIHRoZSBDUyBsaW5lLiAgVGhpcyBpbiBlZmZlY3QgdGVsbHMgdGhlIEVFUFJPTSB0byBleGVjdXRlCisJCSAqIHRoZSBwcmV2aW91cyBjb21tYW5kLgorCQkgKi8KKwkJZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOwogCi0gICAgICAgIC8qIFJlYWQgRE8gcmVwZWF0ZWRseSB1bnRpbCBpdCBpcyBoaWdoIChlcXVhbCB0byAnMScpLiAgVGhlIEVFUFJPTSB3aWxsCi0gICAgICAgICAqIHNpZ25hbCB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSByYWlzaW5nIHRoZSBETyBzaWduYWwuCi0gICAgICAgICAqIElmIERPIGRvZXMgbm90IGdvIGhpZ2ggaW4gMTAgbWlsbGlzZWNvbmRzLCB0aGVuIGVycm9yIG91dC4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgewotICAgICAgICAgICAgZWVjZCA9IGVyMzIoRUVDRCk7Ci0gICAgICAgICAgICBpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfRE8pIGJyZWFrOwotICAgICAgICAgICAgdWRlbGF5KDUwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSAyMDApIHsKLSAgICAgICAgICAgIERFQlVHT1VUKCJFRVBST00gV3JpdGUgZGlkIG5vdCBjb21wbGV0ZVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgICAgIH0KKwkJLyogUmVhZCBETyByZXBlYXRlZGx5IHVudGlsIGl0IGlzIGhpZ2ggKGVxdWFsIHRvICcxJykuICBUaGUgRUVQUk9NIHdpbGwKKwkJICogc2lnbmFsIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGJlZW4gY29tcGxldGVkIGJ5IHJhaXNpbmcgdGhlIERPIHNpZ25hbC4KKwkJICogSWYgRE8gZG9lcyBub3QgZ28gaGlnaCBpbiAxMCBtaWxsaXNlY29uZHMsIHRoZW4gZXJyb3Igb3V0LgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisJCQllZWNkID0gZXIzMihFRUNEKTsKKwkJCWlmIChlZWNkICYgRTEwMDBfRUVDRF9ETykKKwkJCQlicmVhazsKKwkJCXVkZWxheSg1MCk7CisJCX0KKwkJaWYgKGkgPT0gMjAwKSB7CisJCQlERUJVR09VVCgiRUVQUk9NIFdyaXRlIGRpZCBub3QgY29tcGxldGVcbiIpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCQl9CiAKLSAgICAgICAgLyogUmVjb3ZlciBmcm9tIHdyaXRlICovCi0gICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKwkJLyogUmVjb3ZlciBmcm9tIHdyaXRlICovCisJCWUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKIAotICAgICAgICB3b3Jkc193cml0dGVuKys7Ci0gICAgfQorCQl3b3Jkc193cml0dGVuKys7CisJfQogCi0gICAgLyogU2VuZCB0aGUgd3JpdGUgZGlzYWJsZSBjb21tYW5kIHRvIHRoZSBFRVBST00gKDMtYml0IG9wY29kZSBwbHVzCi0gICAgICogNi84LWJpdCBkdW1teSBhZGRyZXNzIGJlZ2lubmluZyB3aXRoIDEwKS4gIEl0J3MgbGVzcyB3b3JrIHRvIGluY2x1ZGUKLSAgICAgKiB0aGUgMTAgb2YgdGhlIGR1bW15IGFkZHJlc3MgYXMgcGFydCBvZiB0aGUgb3Bjb2RlIHRoYW4gaXQgaXMgdG8gc2hpZnQKLSAgICAgKiBpdCBvdmVyIHRoZSBjb3JyZWN0IG51bWJlciBvZiBiaXRzIGZvciB0aGUgYWRkcmVzcy4gIFRoaXMgdGFrZXMgdGhlCi0gICAgICogRUVQUk9NIG91dCBvZiB3cml0ZS9lcmFzZSBtb2RlLgotICAgICAqLwotICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fRVdEU19PUENPREVfTUlDUk9XSVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MTYpKGVlcHJvbS0+b3Bjb2RlX2JpdHMgKyAyKSk7CisJLyogU2VuZCB0aGUgd3JpdGUgZGlzYWJsZSBjb21tYW5kIHRvIHRoZSBFRVBST00gKDMtYml0IG9wY29kZSBwbHVzCisJICogNi84LWJpdCBkdW1teSBhZGRyZXNzIGJlZ2lubmluZyB3aXRoIDEwKS4gIEl0J3MgbGVzcyB3b3JrIHRvIGluY2x1ZGUKKwkgKiB0aGUgMTAgb2YgdGhlIGR1bW15IGFkZHJlc3MgYXMgcGFydCBvZiB0aGUgb3Bjb2RlIHRoYW4gaXQgaXMgdG8gc2hpZnQKKwkgKiBpdCBvdmVyIHRoZSBjb3JyZWN0IG51bWJlciBvZiBiaXRzIGZvciB0aGUgYWRkcmVzcy4gIFRoaXMgdGFrZXMgdGhlCisJICogRUVQUk9NIG91dCBvZiB3cml0ZS9lcmFzZSBtb2RlLgorCSAqLworCWUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fRVdEU19PUENPREVfTUlDUk9XSVJFLAorCQkJCSh1MTYpIChlZXByb20tPm9wY29kZV9iaXRzICsgMikpOwogCi0gICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIDAsICh1MTYpKGVlcHJvbS0+YWRkcmVzc19iaXRzIC0gMikpOworCWUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCAwLCAodTE2KSAoZWVwcm9tLT5hZGRyZXNzX2JpdHMgLSAyKSk7CiAKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRmx1c2hlcyB0aGUgY2FjaGVkIGVlcHJvbSB0byBOVk0uIFRoaXMgaXMgZG9uZSBieSBzYXZpbmcgdGhlIG1vZGlmaWVkIHZhbHVlcwotICogaW4gdGhlIGVlcHJvbSBjYWNoZSBhbmQgdGhlIG5vbiBtb2RpZmllZCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgYmFuawotICogdG8gdGhlIG5ldyBiYW5rLgorLyoqCisgKiBlMTAwMF9yZWFkX21hY19hZGRyIC0gcmVhZCB0aGUgYWRhcHRlcnMgTUFDIGZyb20gZWVwcm9tCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQogICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiBvZmZzZXQgLSBvZmZzZXQgb2YgIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCi0gKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQotICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9jb21taXRfc2hhZG93X3JhbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQotewotICAgIHUzMiBhdHRlbXB0cyA9IDEwMDAwMDsKLSAgICB1MzIgZWVjZCA9IDA7Ci0gICAgdTMyIGZsb3AgPSAwOwotICAgIHUzMiBpID0gMDsKLSAgICBzMzIgZXJyb3IgPSBFMTAwMF9TVUNDRVNTOwotICAgIHUzMiBvbGRfYmFua19vZmZzZXQgPSAwOwotICAgIHUzMiBuZXdfYmFua19vZmZzZXQgPSAwOwotICAgIHU4IGxvd19ieXRlID0gMDsKLSAgICB1OCBoaWdoX2J5dGUgPSAwOwotICAgIGJvb2wgc2VjdG9yX3dyaXRlX2ZhaWxlZCA9IGZhbHNlOwotCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykgewotICAgICAgICAvKiBUaGUgZmxvcCByZWdpc3RlciB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGZsYXNoIHR5cGUgaXMgU1RNICovCi0gICAgICAgIGZsb3AgPSBlcjMyKEZMT1ApOwotICAgICAgICBmb3IgKGk9MDsgaSA8IGF0dGVtcHRzOyBpKyspIHsKLSAgICAgICAgICAgIGVlY2QgPSBlcjMyKEVFQ0QpOwotICAgICAgICAgICAgaWYgKChlZWNkICYgRTEwMDBfRUVDRF9GTFVQRCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWRlbGF5KDUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgPT0gYXR0ZW1wdHMpIHsKLSAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIFNUTSBvcGNvZGUgbG9jYXRlZCBpbiBiaXRzIDE1Ojggb2YgZmxvcCwgcmVzZXQgZmlybXdhcmUgKi8KLSAgICAgICAgaWYgKChmbG9wICYgMHhGRjAwKSA9PSBFMTAwMF9TVE1fT1BDT0RFKSB7Ci0gICAgICAgICAgICBldzMyKEhJQ1IsIEUxMDAwX0hJQ1JfRldfUkVTRVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUGVyZm9ybSB0aGUgZmxhc2ggdXBkYXRlICovCi0gICAgICAgIGV3MzIoRUVDRCwgZWVjZCB8IEUxMDAwX0VFQ0RfRkxVUEQpOwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgYXR0ZW1wdHM7IGkrKykgewotICAgICAgICAgICAgZWVjZCA9IGVyMzIoRUVDRCk7Ci0gICAgICAgICAgICBpZiAoKGVlY2QgJiBFMTAwMF9FRUNEX0ZMVVBEKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1ZGVsYXkoNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA9PSBhdHRlbXB0cykgewotICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuICYmIGh3LT5lZXByb21fc2hhZG93X3JhbSAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIFdlJ3JlIHdyaXRpbmcgdG8gdGhlIG9wcG9zaXRlIGJhbmsgc28gaWYgd2UncmUgb24gYmFuayAxLAotICAgICAgICAgKiB3cml0ZSB0byBiYW5rIDAgZXRjLiAgV2UgYWxzbyBuZWVkIHRvIGVyYXNlIHRoZSBzZWdtZW50IHRoYXQKLSAgICAgICAgICogaXMgZ29pbmcgdG8gYmUgd3JpdHRlbiAqLwotICAgICAgICBpZiAoIShlcjMyKEVFQ0QpICYgRTEwMDBfRUVDRF9TRUMxVkFMKSkgewotICAgICAgICAgICAgbmV3X2Jhbmtfb2Zmc2V0ID0gaHctPmZsYXNoX2Jhbmtfc2l6ZSAqIDI7Ci0gICAgICAgICAgICBvbGRfYmFua19vZmZzZXQgPSAwOwotICAgICAgICAgICAgZTEwMDBfZXJhc2VfaWNoOF80a19zZWdtZW50KGh3LCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9sZF9iYW5rX29mZnNldCA9IGh3LT5mbGFzaF9iYW5rX3NpemUgKiAyOwotICAgICAgICAgICAgbmV3X2Jhbmtfb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGUxMDAwX2VyYXNlX2ljaDhfNGtfc2VnbWVudChodywgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZWN0b3Jfd3JpdGVfZmFpbGVkID0gZmFsc2U7Ci0gICAgICAgIC8qIExvb3AgZm9yIGV2ZXJ5IGJ5dGUgaW4gdGhlIHNoYWRvdyBSQU0sCi0gICAgICAgICAqIHdoaWNoIGlzIGluIHVuaXRzIG9mIHdvcmRzLiAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRTEwMDBfU0hBRE9XX1JBTV9XT1JEUzsgaSsrKSB7Ci0gICAgICAgICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciB0byB3cml0ZSB0aGUgdmFsdWUgc3RvcmVkCi0gICAgICAgICAgICAgKiBpbiB0aGUgb3RoZXIgTlZNIGJhbmsgb3IgYSBtb2RpZmllZCB2YWx1ZSBzdG9yZWQKLSAgICAgICAgICAgICAqIGluIHRoZSBzaGFkb3cgUkFNICovCi0gICAgICAgICAgICBpZiAoaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLm1vZGlmaWVkKSB7Ci0gICAgICAgICAgICAgICAgbG93X2J5dGUgPSAodTgpaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLmVlcHJvbV93b3JkOwotICAgICAgICAgICAgICAgIHVkZWxheSgxMDApOwotICAgICAgICAgICAgICAgIGVycm9yID0gZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8PCAxKSArIG5ld19iYW5rX29mZnNldCwgbG93X2J5dGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IEUxMDAwX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgIHNlY3Rvcl93cml0ZV9mYWlsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoaWdoX2J5dGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKHU4KShody0+ZWVwcm9tX3NoYWRvd19yYW1baV0uZWVwcm9tX3dvcmQgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZTEwMDBfcmVhZF9pY2g4X2J5dGUoaHcsIChpIDw8IDEpICsgb2xkX2Jhbmtfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb3dfYnl0ZSk7Ci0gICAgICAgICAgICAgICAgdWRlbGF5KDEwMCk7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF92ZXJpZnlfd3JpdGVfaWNoOF9ieXRlKGh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpIDw8IDEpICsgbmV3X2Jhbmtfb2Zmc2V0LCBsb3dfYnl0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgc2VjdG9yX3dyaXRlX2ZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGUxMDAwX3JlYWRfaWNoOF9ieXRlKGh3LCAoaSA8PCAxKSArIG9sZF9iYW5rX29mZnNldCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWdoX2J5dGUpOwotICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIHRoZSB3cml0ZSBvZiB0aGUgbG93IGJ5dGUgd2FzIHN1Y2Nlc3NmdWwsIGdvIGFoZWFkIGFuZAotICAgICAgICAgICAgICogd3JpdGUgdGhlIGhpZ2ggYnl0ZSB3aGlsZSBjaGVja2luZyB0byBtYWtlIHN1cmUgdGhhdCBpZiBpdAotICAgICAgICAgICAgICogaXMgdGhlIHNpZ25hdHVyZSBieXRlLCB0aGVuIGl0IGlzIGhhbmRsZWQgcHJvcGVybHkgKi8KLSAgICAgICAgICAgIGlmICghc2VjdG9yX3dyaXRlX2ZhaWxlZCkgewotICAgICAgICAgICAgICAgIC8qIElmIHRoZSB3b3JkIGlzIDB4MTMsIHRoZW4gbWFrZSBzdXJlIHRoZSBzaWduYXR1cmUgYml0cwotICAgICAgICAgICAgICAgICAqICgxNToxNCkgYXJlIDExYiB1bnRpbCB0aGUgY29tbWl0IGhhcyBjb21wbGV0ZWQuCi0gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIGFsbG93IHVzIHRvIHdyaXRlIDEwYiB3aGljaCBpbmRpY2F0ZXMgdGhlCi0gICAgICAgICAgICAgICAgICogc2lnbmF0dXJlIGlzIHZhbGlkLiAgV2Ugd2FudCB0byBkbyB0aGlzIGFmdGVyIHRoZSB3cml0ZQotICAgICAgICAgICAgICAgICAqIGhhcyBjb21wbGV0ZWQgc28gdGhhdCB3ZSBkb24ndCBtYXJrIHRoZSBzZWdtZW50IHZhbGlkCi0gICAgICAgICAgICAgICAgICogd2hpbGUgdGhlIHdyaXRlIGlzIHN0aWxsIGluIHByb2dyZXNzICovCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gRTEwMDBfSUNIX05WTV9TSUdfV09SRCkKLSAgICAgICAgICAgICAgICAgICAgaGlnaF9ieXRlID0gRTEwMDBfSUNIX05WTV9TSUdfTUFTSyB8IGhpZ2hfYnl0ZTsKLQotICAgICAgICAgICAgICAgIGVycm9yID0gZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8PCAxKSArIG5ld19iYW5rX29mZnNldCArIDEsIGhpZ2hfYnl0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IEUxMDAwX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgIHNlY3Rvcl93cml0ZV9mYWlsZWQgPSB0cnVlOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIElmIHRoZSB3cml0ZSBmYWlsZWQgdGhlbiBicmVhayBmcm9tIHRoZSBsb29wIGFuZAotICAgICAgICAgICAgICAgICAqIHJldHVybiBhbiBlcnJvciAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRG9uJ3QgYm90aGVyIHdyaXRpbmcgdGhlIHNlZ21lbnQgdmFsaWQgYml0cyBpZiBzZWN0b3IKLSAgICAgICAgICogcHJvZ3JhbW1pbmcgZmFpbGVkLiAqLwotICAgICAgICBpZiAoIXNlY3Rvcl93cml0ZV9mYWlsZWQpIHsKLSAgICAgICAgICAgIC8qIEZpbmFsbHkgdmFsaWRhdGUgdGhlIG5ldyBzZWdtZW50IGJ5IHNldHRpbmcgYml0IDE1OjE0Ci0gICAgICAgICAgICAgKiB0byAxMGIgaW4gd29yZCAweDEzICwgdGhpcyBjYW4gYmUgZG9uZSB3aXRob3V0IGFuCi0gICAgICAgICAgICAgKiBlcmFzZSBhcyB3ZWxsIHNpbmNlIHRoZXNlIGJpdHMgYXJlIDExIHRvIHN0YXJ0IHdpdGgKLSAgICAgICAgICAgICAqIGFuZCB3ZSBuZWVkIHRvIGNoYW5nZSBiaXQgMTQgdG8gMGIgKi8KLSAgICAgICAgICAgIGUxMDAwX3JlYWRfaWNoOF9ieXRlKGh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfSUNIX05WTV9TSUdfV09SRCAqIDIgKyAxICsgbmV3X2Jhbmtfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpZ2hfYnl0ZSk7Ci0gICAgICAgICAgICBoaWdoX2J5dGUgJj0gMHhCRjsKLSAgICAgICAgICAgIGVycm9yID0gZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShodywKLSAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQgKiAyICsgMSArIG5ld19iYW5rX29mZnNldCwgaGlnaF9ieXRlKTsKLSAgICAgICAgICAgIC8qIEFuZCBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHZhbGlkIHNlZ21lbnQgYnkgc2V0dGluZwotICAgICAgICAgICAgICogaXRzIHNpZ25hdHVyZSB3b3JkICgweDEzKSBoaWdoX2J5dGUgdG8gMGIuIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgKiBkb25lIHdpdGhvdXQgYW4gZXJhc2UgYmVjYXVzZSBmbGFzaCBlcmFzZSBzZXRzIGFsbCBiaXRzCi0gICAgICAgICAgICAgKiB0byAxJ3MuIFdlIGNhbiB3cml0ZSAxJ3MgdG8gMCdzIHdpdGhvdXQgYW4gZXJhc2UgKi8KLSAgICAgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF92ZXJpZnlfd3JpdGVfaWNoOF9ieXRlKGh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQgKiAyICsgMSArIG9sZF9iYW5rX29mZnNldCwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIENsZWFyIHRoZSBub3cgbm90IHVzZWQgZW50cnkgaW4gdGhlIGNhY2hlICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRTEwMDBfU0hBRE9XX1JBTV9XT1JEUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLm1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaHctPmVlcHJvbV9zaGFkb3dfcmFtW2ldLmVlcHJvbV93b3JkID0gMHhGRkZGOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWFkcyB0aGUgYWRhcHRlcidzIE1BQyBhZGRyZXNzIGZyb20gdGhlIEVFUFJPTSBhbmQgaW52ZXJ0cyB0aGUgTFNCIGZvciB0aGUKICAqIHNlY29uZCBmdW5jdGlvbiBvZiBkdWFsIGZ1bmN0aW9uIGRldmljZXMKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzMzIgZTEwMDBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUxNiBvZmZzZXQ7Ci0gICAgdTE2IGVlcHJvbV9kYXRhLCBpOworCXUxNiBvZmZzZXQ7CisJdTE2IGVlcHJvbV9kYXRhLCBpOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX21hY19hZGRyIik7CisJREVCVUdGVU5DKCJlMTAwMF9yZWFkX21hY19hZGRyIik7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTk9ERV9BRERSRVNTX1NJWkU7IGkgKz0gMikgewotICAgICAgICBvZmZzZXQgPSBpID4+IDE7Ci0gICAgICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgb2Zmc2V0LCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICAgICAgfQotICAgICAgICBody0+cGVybV9tYWNfYWRkcltpXSA9ICh1OCkoZWVwcm9tX2RhdGEgJiAweDAwRkYpOwotICAgICAgICBody0+cGVybV9tYWNfYWRkcltpKzFdID0gKHU4KShlZXByb21fZGF0YSA+PiA4KTsKLSAgICB9CisJZm9yIChpID0gMDsgaSA8IE5PREVfQUREUkVTU19TSVpFOyBpICs9IDIpIHsKKwkJb2Zmc2V0ID0gaSA+PiAxOworCQlpZiAoZTEwMDBfcmVhZF9lZXByb20oaHcsIG9mZnNldCwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKwkJCURFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisJCX0KKwkJaHctPnBlcm1fbWFjX2FkZHJbaV0gPSAodTgpIChlZXByb21fZGF0YSAmIDB4MDBGRik7CisJCWh3LT5wZXJtX21hY19hZGRyW2kgKyAxXSA9ICh1OCkgKGVlcHJvbV9kYXRhID4+IDgpOworCX0KIAotICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF84MjU0NjoKLSAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgotICAgIGNhc2UgZTEwMDBfODI1NzE6Ci0gICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLSAgICAgICAgaWYgKGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCi0gICAgICAgICAgICBody0+cGVybV9tYWNfYWRkcls1XSBePSAweDAxOwotICAgICAgICBicmVhazsKLSAgICB9CisJc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQ2OgorCWNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisJCWlmIChlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKQorCQkJaHctPnBlcm1fbWFjX2FkZHJbNV0gXj0gMHgwMTsKKwkJYnJlYWs7CisJfQogCi0gICAgZm9yIChpID0gMDsgaSA8IE5PREVfQUREUkVTU19TSVpFOyBpKyspCi0gICAgICAgIGh3LT5tYWNfYWRkcltpXSA9IGh3LT5wZXJtX21hY19hZGRyW2ldOwotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCWZvciAoaSA9IDA7IGkgPCBOT0RFX0FERFJFU1NfU0laRTsgaSsrKQorCQlody0+bWFjX2FkZHJbaV0gPSBody0+cGVybV9tYWNfYWRkcltpXTsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5pdGlhbGl6ZXMgcmVjZWl2ZSBhZGRyZXNzIGZpbHRlcnMuCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKy8qKgorICogZTEwMDBfaW5pdF9yeF9hZGRycyAtIEluaXRpYWxpemVzIHJlY2VpdmUgYWRkcmVzcyBmaWx0ZXJzLgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICAqCiAgKiBQbGFjZXMgdGhlIE1BQyBhZGRyZXNzIGluIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciAwIGFuZCBjbGVhcnMgdGhlIHJlc3QKLSAqIG9mIHRoZSByZWNlaXZlIGFkZHJlc3NzIHJlZ2lzdGVycy4gQ2xlYXJzIHRoZSBtdWx0aWNhc3QgdGFibGUuIEFzc3VtZXMKKyAqIG9mIHRoZSByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXJzLiBDbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZS4gQXNzdW1lcwogICogdGhlIHJlY2VpdmVyIGlzIGluIHJlc2V0IHdoZW4gdGhlIHJvdXRpbmUgaXMgY2FsbGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzdGF0aWMgdm9pZCBlMTAwMF9pbml0X3J4X2FkZHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIGk7Ci0gICAgdTMyIHJhcl9udW07CisJdTMyIGk7CisJdTMyIHJhcl9udW07CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX2luaXRfcnhfYWRkcnMiKTsKKwlERUJVR0ZVTkMoImUxMDAwX2luaXRfcnhfYWRkcnMiKTsKIAotICAgIC8qIFNldHVwIHRoZSByZWNlaXZlIGFkZHJlc3MuICovCi0gICAgREVCVUdPVVQoIlByb2dyYW1taW5nIE1BQyBBZGRyZXNzIGludG8gUkFSWzBdXG4iKTsKKwkvKiBTZXR1cCB0aGUgcmVjZWl2ZSBhZGRyZXNzLiAqLworCURFQlVHT1VUKCJQcm9ncmFtbWluZyBNQUMgQWRkcmVzcyBpbnRvIFJBUlswXVxuIik7CiAKLSAgICBlMTAwMF9yYXJfc2V0KGh3LCBody0+bWFjX2FkZHIsIDApOworCWUxMDAwX3Jhcl9zZXQoaHcsIGh3LT5tYWNfYWRkciwgMCk7CiAKLSAgICByYXJfbnVtID0gRTEwMDBfUkFSX0VOVFJJRVM7CisJcmFyX251bSA9IEUxMDAwX1JBUl9FTlRSSUVTOwogCi0gICAgLyogUmVzZXJ2ZSBhIHNwb3QgZm9yIHRoZSBMb2NhbGx5IEFkbWluaXN0ZXJlZCBBZGRyZXNzIHRvIHdvcmsgYXJvdW5kCi0gICAgICogYW4gODI1NzEgaXNzdWUgaW4gd2hpY2ggYSByZXNldCBvbiBvbmUgcG9ydCB3aWxsIHJlbG9hZCB0aGUgTUFDIG9uCi0gICAgICogdGhlIG90aGVyIHBvcnQuICovCi0gICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzEpICYmIChody0+bGFhX2lzX3ByZXNlbnQpKQotICAgICAgICByYXJfbnVtIC09IDE7Ci0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKQotICAgICAgICByYXJfbnVtID0gRTEwMDBfUkFSX0VOVFJJRVNfSUNIOExBTjsKLQotICAgIC8qIFplcm8gb3V0IHRoZSBvdGhlciAxNSByZWNlaXZlIGFkZHJlc3Nlcy4gKi8KLSAgICBERUJVR09VVCgiQ2xlYXJpbmcgUkFSWzEtMTVdXG4iKTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgcmFyX251bTsgaSsrKSB7Ci0gICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsIChpIDw8IDEpLCAwKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKChpIDw8IDEpICsgMSksIDApOwotICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgIH0KKwkvKiBaZXJvIG91dCB0aGUgb3RoZXIgMTUgcmVjZWl2ZSBhZGRyZXNzZXMuICovCisJREVCVUdPVVQoIkNsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisJZm9yIChpID0gMTsgaSA8IHJhcl9udW07IGkrKykgeworCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoaSA8PCAxKSwgMCk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CisJCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwl9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEhhc2hlcyBhbiBhZGRyZXNzIHRvIGRldGVybWluZSBpdHMgbG9jYXRpb24gaW4gdGhlIG11bHRpY2FzdCB0YWJsZQotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiBtY19hZGRyIC0gdGhlIG11bHRpY2FzdCBhZGRyZXNzIHRvIGhhc2gKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfaGFzaF9tY19hZGRyIC0gSGFzaGVzIGFuIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIGl0cyBsb2NhdGlvbiBpbiB0aGUgbXVsdGljYXN0IHRhYmxlCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQG1jX2FkZHI6IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0byBoYXNoCisgKi8KIHUzMiBlMTAwMF9oYXNoX21jX2FkZHIoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKm1jX2FkZHIpCiB7Ci0gICAgdTMyIGhhc2hfdmFsdWUgPSAwOworCXUzMiBoYXNoX3ZhbHVlID0gMDsKIAotICAgIC8qIFRoZSBwb3J0aW9uIG9mIHRoZSBhZGRyZXNzIHRoYXQgaXMgdXNlZCBmb3IgdGhlIGhhc2ggdGFibGUgaXMKLSAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBtY19maWx0ZXJfdHlwZSBzZXR0aW5nLgotICAgICAqLwotICAgIHN3aXRjaCAoaHctPm1jX2ZpbHRlcl90eXBlKSB7Ci0gICAgLyogWzBdIFsxXSBbMl0gWzNdIFs0XSBbNV0KLSAgICAgKiAwMSAgQUEgIDAwICAxMiAgMzQgIDU2Ci0gICAgICogTFNCICAgICAgICAgICAgICAgICBNU0IKLSAgICAgKi8KLSAgICBjYXNlIDA6Ci0gICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgewotICAgICAgICAgICAgLyogWzQ3OjM4XSBpLmUuIDB4MTU4IGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KLSAgICAgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gNikgfCAoKCh1MTYpbWNfYWRkcls1XSkgPDwgMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogWzQ3OjM2XSBpLmUuIDB4NTYzIGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KLSAgICAgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gNCkgfCAoKCh1MTYpbWNfYWRkcls1XSkgPDwgNCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgICAgICAvKiBbNDY6MzddIGkuZS4gMHgyQjEgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLwotICAgICAgICAgICAgaGFzaF92YWx1ZSA9ICgobWNfYWRkcls0XSA+PiA1KSB8ICgoKHUxNiltY19hZGRyWzVdKSA8PCAzKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBbNDY6MzVdIGkuZS4gMHhBQzYgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLwotICAgICAgICAgICAgaGFzaF92YWx1ZSA9ICgobWNfYWRkcls0XSA+PiAzKSB8ICgoKHUxNiltY19hZGRyWzVdKSA8PCA1KSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKLSAgICAgICAgICAgIC8qWzQ1OjM2XSBpLmUuIDB4MTYzIGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KLSAgICAgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gNCkgfCAoKCh1MTYpbWNfYWRkcls1XSkgPDwgNCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogWzQ1OjM0XSBpLmUuIDB4NUQ4IGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KLSAgICAgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gMikgfCAoKCh1MTYpbWNfYWRkcls1XSkgPDwgNikpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgICAgICAvKiBbNDM6MzRdIGkuZS4gMHgxOEQgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLwotICAgICAgICAgICAgaGFzaF92YWx1ZSA9ICgobWNfYWRkcls0XSA+PiAyKSB8ICgoKHUxNiltY19hZGRyWzVdKSA8PCA2KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBbNDM6MzJdIGkuZS4gMHg2MzQgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLwotICAgICAgICAgICAgaGFzaF92YWx1ZSA9ICgobWNfYWRkcls0XSkgfCAoKCh1MTYpbWNfYWRkcls1XSkgPDwgOCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwkvKiBUaGUgcG9ydGlvbiBvZiB0aGUgYWRkcmVzcyB0aGF0IGlzIHVzZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGlzCisJICogZGV0ZXJtaW5lZCBieSB0aGUgbWNfZmlsdGVyX3R5cGUgc2V0dGluZy4KKwkgKi8KKwlzd2l0Y2ggKGh3LT5tY19maWx0ZXJfdHlwZSkgeworCQkvKiBbMF0gWzFdIFsyXSBbM10gWzRdIFs1XQorCQkgKiAwMSAgQUEgIDAwICAxMiAgMzQgIDU2CisJCSAqIExTQiAgICAgICAgICAgICAgICAgTVNCCisJCSAqLworCWNhc2UgMDoKKwkJLyogWzQ3OjM2XSBpLmUuIDB4NTYzIGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKwkJaGFzaF92YWx1ZSA9ICgobWNfYWRkcls0XSA+PiA0KSB8ICgoKHUxNikgbWNfYWRkcls1XSkgPDwgNCkpOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIFs0NjozNV0gaS5lLiAweEFDNiBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisJCWhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gMykgfCAoKCh1MTYpIG1jX2FkZHJbNV0pIDw8IDUpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBbNDU6MzRdIGkuZS4gMHg1RDggZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLworCQloYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdID4+IDIpIHwgKCgodTE2KSBtY19hZGRyWzVdKSA8PCA2KSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogWzQzOjMyXSBpLmUuIDB4NjM0IGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKwkJaGFzaF92YWx1ZSA9ICgobWNfYWRkcls0XSkgfCAoKCh1MTYpIG1jX2FkZHJbNV0pIDw8IDgpKTsKKwkJYnJlYWs7CisJfQogCi0gICAgaGFzaF92YWx1ZSAmPSAweEZGRjsKLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCi0gICAgICAgIGhhc2hfdmFsdWUgJj0gMHgzRkY7Ci0KLSAgICByZXR1cm4gaGFzaF92YWx1ZTsKKwloYXNoX3ZhbHVlICY9IDB4RkZGOworCXJldHVybiBoYXNoX3ZhbHVlOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQdXRzIGFuIGV0aGVybmV0IGFkZHJlc3MgaW50byBhIHJlY2VpdmUgYWRkcmVzcyByZWdpc3Rlci4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogYWRkciAtIEFkZHJlc3MgdG8gcHV0IGludG8gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyCi0gKiBpbmRleCAtIFJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciB0byB3cml0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9yYXJfc2V0IC0gUHV0cyBhbiBldGhlcm5ldCBhZGRyZXNzIGludG8gYSByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIuCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQGFkZHI6IEFkZHJlc3MgdG8gcHV0IGludG8gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyCisgKiBAaW5kZXg6IFJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciB0byB3cml0ZQorICovCiB2b2lkIGUxMDAwX3Jhcl9zZXQoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKmFkZHIsIHUzMiBpbmRleCkKIHsKLSAgICB1MzIgcmFyX2xvdywgcmFyX2hpZ2g7CisJdTMyIHJhcl9sb3csIHJhcl9oaWdoOwogCi0gICAgLyogSFcgZXhwZWN0cyB0aGVzZSBpbiBsaXR0bGUgZW5kaWFuIHNvIHdlIHJldmVyc2UgdGhlIGJ5dGUgb3JkZXIKLSAgICAgKiBmcm9tIG5ldHdvcmsgb3JkZXIgKGJpZyBlbmRpYW4pIHRvIGxpdHRsZSBlbmRpYW4KLSAgICAgKi8KLSAgICByYXJfbG93ID0gKCh1MzIpYWRkclswXSB8ICgodTMyKWFkZHJbMV0gPDwgOCkgfAotICAgICAgICAgICAgICAgKCh1MzIpYWRkclsyXSA8PCAxNikgfCAoKHUzMilhZGRyWzNdIDw8IDI0KSk7Ci0gICAgcmFyX2hpZ2ggPSAoKHUzMilhZGRyWzRdIHwgKCh1MzIpYWRkcls1XSA8PCA4KSk7CisJLyogSFcgZXhwZWN0cyB0aGVzZSBpbiBsaXR0bGUgZW5kaWFuIHNvIHdlIHJldmVyc2UgdGhlIGJ5dGUgb3JkZXIKKwkgKiBmcm9tIG5ldHdvcmsgb3JkZXIgKGJpZyBlbmRpYW4pIHRvIGxpdHRsZSBlbmRpYW4KKwkgKi8KKwlyYXJfbG93ID0gKCh1MzIpIGFkZHJbMF0gfCAoKHUzMikgYWRkclsxXSA8PCA4KSB8CisJCSAgICgodTMyKSBhZGRyWzJdIDw8IDE2KSB8ICgodTMyKSBhZGRyWzNdIDw8IDI0KSk7CisJcmFyX2hpZ2ggPSAoKHUzMikgYWRkcls0XSB8ICgodTMyKSBhZGRyWzVdIDw8IDgpKTsKIAotICAgIC8qIERpc2FibGUgUnggYW5kIGZsdXNoIGFsbCBSeCBmcmFtZXMgYmVmb3JlIGVuYWJsaW5nIFJTUyB0byBhdm9pZCBSeAotICAgICAqIHVuaXQgaGFuZy4KLSAgICAgKgotICAgICAqIERlc2NyaXB0aW9uOgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgUnggZnJhbWVzIHF1ZXVlZCB1cCBvciBvdGhlcndpc2UgcHJlc2VudCBpbiB0aGUgSFcKLSAgICAgKiBiZWZvcmUgUlNTIGlzIGVuYWJsZWQsIGFuZCB0aGVuIHdlIGVuYWJsZSBSU1MsIHRoZSBIVyBSeCB1bml0IHdpbGwKLSAgICAgKiBoYW5nLiAgVG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSwgd2UgaGF2ZSB0byBkaXNhYmxlIHJlY2VpdmVzIGFuZAotICAgICAqIGZsdXNoIG91dCBhbGwgUnggZnJhbWVzIGJlZm9yZSB3ZSBlbmFibGUgUlNTLiBUbyBkbyBzbywgd2UgbW9kaWZ5IHdlCi0gICAgICogcmVkaXJlY3QgYWxsIFJ4IHRyYWZmaWMgdG8gbWFuYWdlYWJpbGl0eSBhbmQgdGhlbiByZXNldCB0aGUgSFcuCi0gICAgICogVGhpcyBmbHVzaGVzIGF3YXkgUnggZnJhbWVzLCBhbmQgKHNpbmNlIHRoZSByZWRpcmVjdGlvbnMgdG8KLSAgICAgKiBtYW5hZ2VhYmlsaXR5IHBlcnNpc3RzIGFjcm9zcyByZXNldHMpIGtlZXBzIG5ldyBvbmVzIGZyb20gY29taW5nIGluCi0gICAgICogd2hpbGUgd2Ugd29yay4gIFRoZW4sIHdlIGNsZWFyIHRoZSBBZGRyZXNzIFZhbGlkIEFWIGJpdCBmb3IgYWxsIE1BQwotICAgICAqIGFkZHJlc3NlcyBhbmQgdW5kbyB0aGUgcmUtZGlyZWN0aW9uIHRvIG1hbmFnZWFiaWxpdHkuCi0gICAgICogTm93LCBmcmFtZXMgYXJlIGNvbWluZyBpbiBhZ2FpbiwgYnV0IHRoZSBNQUMgd29uJ3QgYWNjZXB0IHRoZW0sIHNvCi0gICAgICogZmFyIHNvIGdvb2QuICBXZSBub3cgcHJvY2VlZCB0byBpbml0aWFsaXplIFJTUyAoaWYgbmVjZXNzYXJ5KSBhbmQKLSAgICAgKiBjb25maWd1cmUgdGhlIFJ4IHVuaXQuICBMYXN0LCB3ZSByZS1lbmFibGUgdGhlIEFWIGJpdHMgYW5kIGNvbnRpbnVlCi0gICAgICogb24gb3VyIG1lcnJ5IHdheS4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotICAgIGNhc2UgZTEwMDBfODI1NzE6Ci0gICAgY2FzZSBlMTAwMF84MjU3MjoKLSAgICBjYXNlIGUxMDAwXzgwMDAzZXMybGFuOgotICAgICAgICBpZiAoaHctPmxlYXZlX2F2X2JpdF9vZmYpCi0gICAgICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAvKiBJbmRpY2F0ZSB0byBoYXJkd2FyZSB0aGUgQWRkcmVzcyBpcyBWYWxpZC4gKi8KLSAgICAgICAgcmFyX2hpZ2ggfD0gRTEwMDBfUkFIX0FWOwotICAgICAgICBicmVhazsKLSAgICB9CisJLyogRGlzYWJsZSBSeCBhbmQgZmx1c2ggYWxsIFJ4IGZyYW1lcyBiZWZvcmUgZW5hYmxpbmcgUlNTIHRvIGF2b2lkIFJ4CisJICogdW5pdCBoYW5nLgorCSAqCisJICogRGVzY3JpcHRpb246CisJICogSWYgdGhlcmUgYXJlIGFueSBSeCBmcmFtZXMgcXVldWVkIHVwIG9yIG90aGVyd2lzZSBwcmVzZW50IGluIHRoZSBIVworCSAqIGJlZm9yZSBSU1MgaXMgZW5hYmxlZCwgYW5kIHRoZW4gd2UgZW5hYmxlIFJTUywgdGhlIEhXIFJ4IHVuaXQgd2lsbAorCSAqIGhhbmcuICBUbyB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlLCB3ZSBoYXZlIHRvIGRpc2FibGUgcmVjZWl2ZXMgYW5kCisJICogZmx1c2ggb3V0IGFsbCBSeCBmcmFtZXMgYmVmb3JlIHdlIGVuYWJsZSBSU1MuIFRvIGRvIHNvLCB3ZSBtb2RpZnkgd2UKKwkgKiByZWRpcmVjdCBhbGwgUnggdHJhZmZpYyB0byBtYW5hZ2VhYmlsaXR5IGFuZCB0aGVuIHJlc2V0IHRoZSBIVy4KKwkgKiBUaGlzIGZsdXNoZXMgYXdheSBSeCBmcmFtZXMsIGFuZCAoc2luY2UgdGhlIHJlZGlyZWN0aW9ucyB0bworCSAqIG1hbmFnZWFiaWxpdHkgcGVyc2lzdHMgYWNyb3NzIHJlc2V0cykga2VlcHMgbmV3IG9uZXMgZnJvbSBjb21pbmcgaW4KKwkgKiB3aGlsZSB3ZSB3b3JrLiAgVGhlbiwgd2UgY2xlYXIgdGhlIEFkZHJlc3MgVmFsaWQgQVYgYml0IGZvciBhbGwgTUFDCisJICogYWRkcmVzc2VzIGFuZCB1bmRvIHRoZSByZS1kaXJlY3Rpb24gdG8gbWFuYWdlYWJpbGl0eS4KKwkgKiBOb3csIGZyYW1lcyBhcmUgY29taW5nIGluIGFnYWluLCBidXQgdGhlIE1BQyB3b24ndCBhY2NlcHQgdGhlbSwgc28KKwkgKiBmYXIgc28gZ29vZC4gIFdlIG5vdyBwcm9jZWVkIHRvIGluaXRpYWxpemUgUlNTIChpZiBuZWNlc3NhcnkpIGFuZAorCSAqIGNvbmZpZ3VyZSB0aGUgUnggdW5pdC4gIExhc3QsIHdlIHJlLWVuYWJsZSB0aGUgQVYgYml0cyBhbmQgY29udGludWUKKwkgKiBvbiBvdXIgbWVycnkgd2F5LgorCSAqLworCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CisJZGVmYXVsdDoKKwkJLyogSW5kaWNhdGUgdG8gaGFyZHdhcmUgdGhlIEFkZHJlc3MgaXMgVmFsaWQuICovCisJCXJhcl9oaWdoIHw9IEUxMDAwX1JBSF9BVjsKKwkJYnJlYWs7CisJfQogCi0gICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGluZGV4IDw8IDEpLCByYXJfbG93KTsKLSAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaW5kZXggPDwgMSkgKyAxKSwgcmFyX2hpZ2gpOwotICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7CisJRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGluZGV4IDw8IDEpLCByYXJfbG93KTsKKwlFMTAwMF9XUklURV9GTFVTSCgpOworCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaW5kZXggPDwgMSkgKyAxKSwgcmFyX2hpZ2gpOworCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdyaXRlcyBhIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGluIHRoZSBWTEFOIGZpbHRlciB0YWJsZS4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogb2Zmc2V0IC0gT2Zmc2V0IGluIFZMQU4gZmlsZXIgdGFibGUgdG8gd3JpdGUKLSAqIHZhbHVlIC0gVmFsdWUgdG8gd3JpdGUgaW50byBWTEFOIGZpbHRlciB0YWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF93cml0ZV92ZnRhIC0gV3JpdGVzIGEgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQgaW4gdGhlIFZMQU4gZmlsdGVyIHRhYmxlLgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIEBvZmZzZXQ6IE9mZnNldCBpbiBWTEFOIGZpbGVyIHRhYmxlIHRvIHdyaXRlCisgKiBAdmFsdWU6IFZhbHVlIHRvIHdyaXRlIGludG8gVkxBTiBmaWx0ZXIgdGFibGUKKyAqLwogdm9pZCBlMTAwMF93cml0ZV92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKIHsKLSAgICB1MzIgdGVtcDsKKwl1MzIgdGVtcDsKIAotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDQpICYmICgob2Zmc2V0ICYgMHgxKSA9PSAxKSkgewotICAgICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoaHcsIFZGVEEsIChvZmZzZXQgLSAxKSk7Ci0gICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCB2YWx1ZSk7Ci0gICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgKG9mZnNldCAtIDEpLCB0ZW1wKTsKLSAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgdmFsdWUpOwotICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgIH0KKwlpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCkgJiYgKChvZmZzZXQgJiAweDEpID09IDEpKSB7CisJCXRlbXAgPSBFMTAwMF9SRUFEX1JFR19BUlJBWShodywgVkZUQSwgKG9mZnNldCAtIDEpKTsKKwkJRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBWRlRBLCBvZmZzZXQsIHZhbHVlKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwkJRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBWRlRBLCAob2Zmc2V0IC0gMSksIHRlbXApOworCQlFMTAwMF9XUklURV9GTFVTSCgpOworCX0gZWxzZSB7CisJCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCB2YWx1ZSk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CisJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDbGVhcnMgdGhlIFZMQU4gZmlsZXIgdGFibGUKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9jbGVhcl92ZnRhIC0gQ2xlYXJzIHRoZSBWTEFOIGZpbGVyIHRhYmxlCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICovCiBzdGF0aWMgdm9pZCBlMTAwMF9jbGVhcl92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdTMyIG9mZnNldDsKLSAgICB1MzIgdmZ0YV92YWx1ZSA9IDA7Ci0gICAgdTMyIHZmdGFfb2Zmc2V0ID0gMDsKLSAgICB1MzIgdmZ0YV9iaXRfaW5fcmVnID0gMDsKKwl1MzIgb2Zmc2V0OworCXUzMiB2ZnRhX3ZhbHVlID0gMDsKKwl1MzIgdmZ0YV9vZmZzZXQgPSAwOworCXUzMiB2ZnRhX2JpdF9pbl9yZWcgPSAwOwogCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7Ci0gICAgICAgIGlmIChody0+bW5nX2Nvb2tpZS52bGFuX2lkICE9IDApIHsKLSAgICAgICAgICAgIC8qIFRoZSBWRlRBIGlzIGEgNDA5NmIgYml0LWZpZWxkLCBlYWNoIGlkZW50aWZ5aW5nIGEgc2luZ2xlIFZMQU4KLSAgICAgICAgICAgICAqIElELiAgVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGRldGVybWluZSB3aGljaCAzMmIgZW50cnkKLSAgICAgICAgICAgICAqIChpLmUuIG9mZnNldCkgaW50byB0aGUgYXJyYXkgd2Ugd2FudCB0byBzZXQgdGhlIFZMQU4gSUQKLSAgICAgICAgICAgICAqIChpLmUuIGJpdCkgb2YgdGhlIG1hbmFnZWFiaWxpdHkgdW5pdC4gKi8KLSAgICAgICAgICAgIHZmdGFfb2Zmc2V0ID0gKGh3LT5tbmdfY29va2llLnZsYW5faWQgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX1ZGVEFfRU5UUllfU0hJRlQpICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfVkZUQV9FTlRSWV9NQVNLOwotICAgICAgICAgICAgdmZ0YV9iaXRfaW5fcmVnID0gMSA8PCAoaHctPm1uZ19jb29raWUudmxhbl9pZCAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9WRlRBX0VOVFJZX0JJVF9TSElGVF9NQVNLKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IEUxMDAwX1ZMQU5fRklMVEVSX1RCTF9TSVpFOyBvZmZzZXQrKykgewotICAgICAgICAvKiBJZiB0aGUgb2Zmc2V0IHdlIHdhbnQgdG8gY2xlYXIgaXMgdGhlIHNhbWUgb2Zmc2V0IG9mIHRoZQotICAgICAgICAgKiBtYW5hZ2VhYmlsaXR5IFZMQU4gSUQsIHRoZW4gY2xlYXIgYWxsIGJpdHMgZXhjZXB0IHRoYXQgb2YgdGhlCi0gICAgICAgICAqIG1hbmFnZWFiaWxpdHkgdW5pdCAqLwotICAgICAgICB2ZnRhX3ZhbHVlID0gKG9mZnNldCA9PSB2ZnRhX29mZnNldCkgPyB2ZnRhX2JpdF9pbl9yZWcgOiAwOwotICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgdmZ0YV92YWx1ZSk7Ci0gICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0gICAgfQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgRTEwMDBfVkxBTl9GSUxURVJfVEJMX1NJWkU7IG9mZnNldCsrKSB7CisJCS8qIElmIHRoZSBvZmZzZXQgd2Ugd2FudCB0byBjbGVhciBpcyB0aGUgc2FtZSBvZmZzZXQgb2YgdGhlCisJCSAqIG1hbmFnZWFiaWxpdHkgVkxBTiBJRCwgdGhlbiBjbGVhciBhbGwgYml0cyBleGNlcHQgdGhhdCBvZiB0aGUKKwkJICogbWFuYWdlYWJpbGl0eSB1bml0ICovCisJCXZmdGFfdmFsdWUgPSAob2Zmc2V0ID09IHZmdGFfb2Zmc2V0KSA/IHZmdGFfYml0X2luX3JlZyA6IDA7CisJCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCB2ZnRhX3ZhbHVlKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwl9CiB9CiAKIHN0YXRpYyBzMzIgZTEwMDBfaWRfbGVkX2luaXQoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICB1MzIgbGVkY3RsOwotICAgIGNvbnN0IHUzMiBsZWRjdGxfbWFzayA9IDB4MDAwMDAwRkY7Ci0gICAgY29uc3QgdTMyIGxlZGN0bF9vbiA9IEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PTjsKLSAgICBjb25zdCB1MzIgbGVkY3RsX29mZiA9IEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PRkY7Ci0gICAgdTE2IGVlcHJvbV9kYXRhLCBpLCB0ZW1wOwotICAgIGNvbnN0IHUxNiBsZWRfbWFzayA9IDB4MEY7CisJdTMyIGxlZGN0bDsKKwljb25zdCB1MzIgbGVkY3RsX21hc2sgPSAweDAwMDAwMEZGOworCWNvbnN0IHUzMiBsZWRjdGxfb24gPSBFMTAwMF9MRURDVExfTU9ERV9MRURfT047CisJY29uc3QgdTMyIGxlZGN0bF9vZmYgPSBFMTAwMF9MRURDVExfTU9ERV9MRURfT0ZGOworCXUxNiBlZXByb21fZGF0YSwgaSwgdGVtcDsKKwljb25zdCB1MTYgbGVkX21hc2sgPSAweDBGOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9pZF9sZWRfaW5pdCIpOworCURFQlVHRlVOQygiZTEwMDBfaWRfbGVkX2luaXQiKTsKIAotICAgIGlmIChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU0MCkgewotICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCi0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotICAgIH0KKwlpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDApIHsKKwkJLyogTm90aGluZyB0byBkbyAqLworCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwl9CiAKLSAgICBsZWRjdGwgPSBlcjMyKExFRENUTCk7Ci0gICAgaHctPmxlZGN0bF9kZWZhdWx0ID0gbGVkY3RsOwotICAgIGh3LT5sZWRjdGxfbW9kZTEgPSBody0+bGVkY3RsX2RlZmF1bHQ7Ci0gICAgaHctPmxlZGN0bF9tb2RlMiA9IGh3LT5sZWRjdGxfZGVmYXVsdDsKKwlsZWRjdGwgPSBlcjMyKExFRENUTCk7CisJaHctPmxlZGN0bF9kZWZhdWx0ID0gbGVkY3RsOworCWh3LT5sZWRjdGxfbW9kZTEgPSBody0+bGVkY3RsX2RlZmF1bHQ7CisJaHctPmxlZGN0bF9tb2RlMiA9IGh3LT5sZWRjdGxfZGVmYXVsdDsKIAotICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0lEX0xFRF9TRVRUSU5HUywgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKLSAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOwotICAgIH0KKwlpZiAoZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9JRF9MRURfU0VUVElOR1MsIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisJCURFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisJCXJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKwl9CiAKLSAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykgJiYKLSAgICAgICAgKGVlcHJvbV9kYXRhID09IElEX0xFRF9SRVNFUlZFRF84MjU3MykpCi0gICAgICAgIGVlcHJvbV9kYXRhID0gSURfTEVEX0RFRkFVTFRfODI1NzM7Ci0gICAgZWxzZSBpZiAoKGVlcHJvbV9kYXRhID09IElEX0xFRF9SRVNFUlZFRF8wMDAwKSB8fAotICAgICAgICAgICAgKGVlcHJvbV9kYXRhID09IElEX0xFRF9SRVNFUlZFRF9GRkZGKSkgewotICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCi0gICAgICAgICAgICBlZXByb21fZGF0YSA9IElEX0xFRF9ERUZBVUxUX0lDSDhMQU47Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVlcHJvbV9kYXRhID0gSURfTEVEX0RFRkFVTFQ7Ci0gICAgfQorCWlmICgoZWVwcm9tX2RhdGEgPT0gSURfTEVEX1JFU0VSVkVEXzAwMDApIHx8CisJICAgIChlZXByb21fZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfRkZGRikpIHsKKwkJZWVwcm9tX2RhdGEgPSBJRF9MRURfREVGQVVMVDsKKwl9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIHRlbXAgPSAoZWVwcm9tX2RhdGEgPj4gKGkgPDwgMikpICYgbGVkX21hc2s7Ci0gICAgICAgIHN3aXRjaCAodGVtcCkgewotICAgICAgICBjYXNlIElEX0xFRF9PTjFfREVGMjoKLSAgICAgICAgY2FzZSBJRF9MRURfT04xX09OMjoKLSAgICAgICAgY2FzZSBJRF9MRURfT04xX09GRjI6Ci0gICAgICAgICAgICBody0+bGVkY3RsX21vZGUxICY9IH4obGVkY3RsX21hc2sgPDwgKGkgPDwgMykpOwotICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMSB8PSBsZWRjdGxfb24gPDwgKGkgPDwgMyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJRF9MRURfT0ZGMV9ERUYyOgotICAgICAgICBjYXNlIElEX0xFRF9PRkYxX09OMjoKLSAgICAgICAgY2FzZSBJRF9MRURfT0ZGMV9PRkYyOgotICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMSAmPSB+KGxlZGN0bF9tYXNrIDw8IChpIDw8IDMpKTsKLSAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTEgfD0gbGVkY3RsX29mZiA8PCAoaSA8PCAzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogRG8gbm90aGluZyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICh0ZW1wKSB7Ci0gICAgICAgIGNhc2UgSURfTEVEX0RFRjFfT04yOgotICAgICAgICBjYXNlIElEX0xFRF9PTjFfT04yOgotICAgICAgICBjYXNlIElEX0xFRF9PRkYxX09OMjoKLSAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTIgJj0gfihsZWRjdGxfbWFzayA8PCAoaSA8PCAzKSk7Ci0gICAgICAgICAgICBody0+bGVkY3RsX21vZGUyIHw9IGxlZGN0bF9vbiA8PCAoaSA8PCAzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElEX0xFRF9ERUYxX09GRjI6Ci0gICAgICAgIGNhc2UgSURfTEVEX09OMV9PRkYyOgotICAgICAgICBjYXNlIElEX0xFRF9PRkYxX09GRjI6Ci0gICAgICAgICAgICBody0+bGVkY3RsX21vZGUyICY9IH4obGVkY3RsX21hc2sgPDwgKGkgPDwgMykpOwotICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMiB8PSBsZWRjdGxfb2ZmIDw8IChpIDw8IDMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBEbyBub3RoaW5nICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXRlbXAgPSAoZWVwcm9tX2RhdGEgPj4gKGkgPDwgMikpICYgbGVkX21hc2s7CisJCXN3aXRjaCAodGVtcCkgeworCQljYXNlIElEX0xFRF9PTjFfREVGMjoKKwkJY2FzZSBJRF9MRURfT04xX09OMjoKKwkJY2FzZSBJRF9MRURfT04xX09GRjI6CisJCQlody0+bGVkY3RsX21vZGUxICY9IH4obGVkY3RsX21hc2sgPDwgKGkgPDwgMykpOworCQkJaHctPmxlZGN0bF9tb2RlMSB8PSBsZWRjdGxfb24gPDwgKGkgPDwgMyk7CisJCQlicmVhazsKKwkJY2FzZSBJRF9MRURfT0ZGMV9ERUYyOgorCQljYXNlIElEX0xFRF9PRkYxX09OMjoKKwkJY2FzZSBJRF9MRURfT0ZGMV9PRkYyOgorCQkJaHctPmxlZGN0bF9tb2RlMSAmPSB+KGxlZGN0bF9tYXNrIDw8IChpIDw8IDMpKTsKKwkJCWh3LT5sZWRjdGxfbW9kZTEgfD0gbGVkY3RsX29mZiA8PCAoaSA8PCAzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogRG8gbm90aGluZyAqLworCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoICh0ZW1wKSB7CisJCWNhc2UgSURfTEVEX0RFRjFfT04yOgorCQljYXNlIElEX0xFRF9PTjFfT04yOgorCQljYXNlIElEX0xFRF9PRkYxX09OMjoKKwkJCWh3LT5sZWRjdGxfbW9kZTIgJj0gfihsZWRjdGxfbWFzayA8PCAoaSA8PCAzKSk7CisJCQlody0+bGVkY3RsX21vZGUyIHw9IGxlZGN0bF9vbiA8PCAoaSA8PCAzKTsKKwkJCWJyZWFrOworCQljYXNlIElEX0xFRF9ERUYxX09GRjI6CisJCWNhc2UgSURfTEVEX09OMV9PRkYyOgorCQljYXNlIElEX0xFRF9PRkYxX09GRjI6CisJCQlody0+bGVkY3RsX21vZGUyICY9IH4obGVkY3RsX21hc2sgPDwgKGkgPDwgMykpOworCQkJaHctPmxlZGN0bF9tb2RlMiB8PSBsZWRjdGxfb2ZmIDw8IChpIDw8IDMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBEbyBub3RoaW5nICovCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUHJlcGFyZXMgU1cgY29udHJvbGFibGUgTEVEIGZvciB1c2UgYW5kIHNhdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBMRUQuCisvKioKKyAqIGUxMDAwX3NldHVwX2xlZAorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogUHJlcGFyZXMgU1cgY29udHJvbGFibGUgTEVEIGZvciB1c2UgYW5kIHNhdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBMRUQuCisgKi8KIHMzMiBlMTAwMF9zZXR1cF9sZWQoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICB1MzIgbGVkY3RsOwotICAgIHMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKwl1MzIgbGVkY3RsOworCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfc2V0dXBfbGVkIik7CisJREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9sZWQiKTsKIAotICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6Ci0gICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6Ci0gICAgY2FzZSBlMTAwMF84MjU0MzoKLSAgICBjYXNlIGUxMDAwXzgyNTQ0OgotICAgICAgICAvKiBObyBzZXR1cCBuZWNlc3NhcnkgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF84MjU0MToKLSAgICBjYXNlIGUxMDAwXzgyNTQ3OgotICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6Ci0gICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKLSAgICAgICAgLyogVHVybiBvZmYgUEhZIFNtYXJ0IFBvd2VyIERvd24gKGlmIGVuYWJsZWQpICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZody0+cGh5X3NwZF9kZWZhdWx0KTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2KShody0+cGh5X3NwZF9kZWZhdWx0ICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfklHUDAxRTEwMDBfR01JSV9TUEQpKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgLyogRmFsbCBUaHJvdWdoICovCi0gICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKLSAgICAgICAgICAgIGxlZGN0bCA9IGVyMzIoTEVEQ1RMKTsKLSAgICAgICAgICAgIC8qIFNhdmUgY3VycmVudCBMRURDVEwgc2V0dGluZ3MgKi8KLSAgICAgICAgICAgIGh3LT5sZWRjdGxfZGVmYXVsdCA9IGxlZGN0bDsKLSAgICAgICAgICAgIC8qIFR1cm4gb2ZmIExFRDAgKi8KLSAgICAgICAgICAgIGxlZGN0bCAmPSB+KEUxMDAwX0xFRENUTF9MRUQwX0lWUlQgfAotICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfTEVEQ1RMX0xFRDBfQkxJTksgfAotICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfTEVEQ1RMX0xFRDBfTU9ERV9NQVNLKTsKLSAgICAgICAgICAgIGxlZGN0bCB8PSAoRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRiA8PAotICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUKTsKLSAgICAgICAgICAgIGV3MzIoTEVEQ1RMLCBsZWRjdGwpOwotICAgICAgICB9IGVsc2UgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKQotICAgICAgICAgICAgZXczMihMRURDVEwsIGh3LT5sZWRjdGxfbW9kZTEpOwotICAgICAgICBicmVhazsKLSAgICB9CisJc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKwljYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKwljYXNlIGUxMDAwXzgyNTQzOgorCWNhc2UgZTEwMDBfODI1NDQ6CisJCS8qIE5vIHNldHVwIG5lY2Vzc2FyeSAqLworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQxOgorCWNhc2UgZTEwMDBfODI1NDc6CisJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwljYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorCQkvKiBUdXJuIG9mZiBQSFkgU21hcnQgUG93ZXIgRG93biAoaWYgZW5hYmxlZCkgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCisJCQkJCSAgICAgJmh3LT5waHlfc3BkX2RlZmF1bHQpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCisJCQkJCSAgICAgICh1MTYpIChody0+cGh5X3NwZF9kZWZhdWx0ICYKKwkJCQkJCSAgICAgfklHUDAxRTEwMDBfR01JSV9TUEQpKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJLyogRmFsbCBUaHJvdWdoICovCisJZGVmYXVsdDoKKwkJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKwkJCWxlZGN0bCA9IGVyMzIoTEVEQ1RMKTsKKwkJCS8qIFNhdmUgY3VycmVudCBMRURDVEwgc2V0dGluZ3MgKi8KKwkJCWh3LT5sZWRjdGxfZGVmYXVsdCA9IGxlZGN0bDsKKwkJCS8qIFR1cm4gb2ZmIExFRDAgKi8KKwkJCWxlZGN0bCAmPSB+KEUxMDAwX0xFRENUTF9MRUQwX0lWUlQgfAorCQkJCSAgICBFMTAwMF9MRURDVExfTEVEMF9CTElOSyB8CisJCQkJICAgIEUxMDAwX0xFRENUTF9MRUQwX01PREVfTUFTSyk7CisJCQlsZWRjdGwgfD0gKEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PRkYgPDwKKwkJCQkgICBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUKTsKKwkJCWV3MzIoTEVEQ1RMLCBsZWRjdGwpOworCQl9IGVsc2UgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKQorCQkJZXczMihMRURDVEwsIGh3LT5sZWRjdGxfbW9kZTEpOworCQlicmVhazsKKwl9CiAKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVc2VkIG9uIDgyNTcxIGFuZCBsYXRlciBTaSB0aGF0IGhhcyBMRUQgYmxpbmsgYml0cy4KLSAqIENhbGxlcnMgbXVzdCB1c2UgdGhlaXIgb3duIHRpbWVyIGFuZCBzaG91bGQgaGF2ZSBhbHJlYWR5IGNhbGxlZAotICogZTEwMDBfaWRfbGVkX2luaXQoKQotICogQ2FsbCBlMTAwMF9jbGVhbnVwIGxlZCgpIHRvIHN0b3AgYmxpbmtpbmcKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotczMyIGUxMDAwX2JsaW5rX2xlZF9zdGFydChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQotewotICAgIHMxNiAgaTsKLSAgICB1MzIgbGVkY3RsX2JsaW5rID0gMDsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfaWRfbGVkX2JsaW5rX29uIik7Ci0KLSAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NzEpIHsKLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLwotICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLSAgICB9Ci0gICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKLSAgICAgICAgLyogYWx3YXlzIGJsaW5rIExFRDAgZm9yIFBDSS1FIGZpYmVyICovCi0gICAgICAgIGxlZGN0bF9ibGluayA9IEUxMDAwX0xFRENUTF9MRUQwX0JMSU5LIHwKLSAgICAgICAgICAgICAgICAgICAgIChFMTAwMF9MRURDVExfTU9ERV9MRURfT04gPDwgRTEwMDBfTEVEQ1RMX0xFRDBfTU9ERV9TSElGVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogc2V0IHRoZSBibGluayBiaXQgZm9yIGVhY2ggTEVEIHRoYXQncyAib24iICgweDBFKSBpbiBsZWRjdGxfbW9kZTIgKi8KLSAgICAgICAgbGVkY3RsX2JsaW5rID0gaHctPmxlZGN0bF9tb2RlMjsKLSAgICAgICAgZm9yIChpPTA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICBpZiAoKChody0+bGVkY3RsX21vZGUyID4+IChpICogOCkpICYgMHhGRikgPT0KLSAgICAgICAgICAgICAgICBFMTAwMF9MRURDVExfTU9ERV9MRURfT04pCi0gICAgICAgICAgICAgICAgbGVkY3RsX2JsaW5rIHw9IChFMTAwMF9MRURDVExfTEVEMF9CTElOSyA8PCAoaSAqIDgpKTsKLSAgICB9Ci0KLSAgICBldzMyKExFRENUTCwgbGVkY3RsX2JsaW5rKTsKLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZXN0b3JlcyB0aGUgc2F2ZWQgc3RhdGUgb2YgdGhlIFNXIGNvbnRyb2xhYmxlIExFRC4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9jbGVhbnVwX2xlZCAtIFJlc3RvcmVzIHRoZSBzYXZlZCBzdGF0ZSBvZiB0aGUgU1cgY29udHJvbGFibGUgTEVELgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqLwogczMyIGUxMDAwX2NsZWFudXBfbGVkKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgczMyIHJldF92YWwgPSBFMTAwMF9TVUNDRVNTOworCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfY2xlYW51cF9sZWQiKTsKKwlERUJVR0ZVTkMoImUxMDAwX2NsZWFudXBfbGVkIik7CiAKLSAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgotICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgotICAgIGNhc2UgZTEwMDBfODI1NDM6Ci0gICAgY2FzZSBlMTAwMF84MjU0NDoKLSAgICAgICAgLyogTm8gY2xlYW51cCBuZWNlc3NhcnkgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF84MjU0MToKLSAgICBjYXNlIGUxMDAwXzgyNTQ3OgotICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6Ci0gICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKLSAgICAgICAgLyogVHVybiBvbiBQSFkgU21hcnQgUG93ZXIgRG93biAoaWYgcHJldmlvdXNseSBlbmFibGVkKSAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5waHlfc3BkX2RlZmF1bHQpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAvKiBGYWxsIFRocm91Z2ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKLSAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MX0xFRCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvKiBSZXN0b3JlIExFRENUTCBzZXR0aW5ncyAqLwotICAgICAgICBldzMyKExFRENUTCwgaHctPmxlZGN0bF9kZWZhdWx0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisJY2FzZSBlMTAwMF84MjU0MzoKKwljYXNlIGUxMDAwXzgyNTQ0OgorCQkvKiBObyBjbGVhbnVwIG5lY2Vzc2FyeSAqLworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQxOgorCWNhc2UgZTEwMDBfODI1NDc6CisJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwljYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorCQkvKiBUdXJuIG9uIFBIWSBTbWFydCBQb3dlciBEb3duIChpZiBwcmV2aW91c2x5IGVuYWJsZWQpICovCisJCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywKKwkJCQkJICAgICAgaHctPnBoeV9zcGRfZGVmYXVsdCk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCS8qIFJlc3RvcmUgTEVEQ1RMIHNldHRpbmdzICovCisJCWV3MzIoTEVEQ1RMLCBody0+bGVkY3RsX2RlZmF1bHQpOworCQlicmVhazsKKwl9CiAKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVHVybnMgb24gdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRUQKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBlMTAwMF9sZWRfb24gLSBUdXJucyBvbiB0aGUgc29mdHdhcmUgY29udHJvbGxhYmxlIExFRAorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqLwogczMyIGUxMDAwX2xlZF9vbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiBjdHJsID0gZXIzMihDVFJMKTsKKwl1MzIgY3RybCA9IGVyMzIoQ1RSTCk7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX2xlZF9vbiIpOworCURFQlVHRlVOQygiZTEwMDBfbGVkX29uIik7CiAKLSAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgotICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgotICAgIGNhc2UgZTEwMDBfODI1NDM6Ci0gICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLwotICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElOMDsKLSAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgZTEwMDBfODI1NDQ6Ci0gICAgICAgIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7Ci0gICAgICAgICAgICAvKiBTZXQgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9uIHRoZSBMRUQgKi8KLSAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOwotICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBDbGVhciBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLwotICAgICAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9TV0RQSU4wOwotICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKLSAgICAgICAgICAgIC8qIENsZWFyIFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvbiB0aGUgTEVEICovCi0gICAgICAgICAgICBjdHJsICY9IH5FMTAwMF9DVFJMX1NXRFBJTjA7Ci0gICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKLSAgICAgICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lmZSkgewotICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUZFX1BIWV9TUEVDSUFMX0NPTlRST0xfTEVELAotICAgICAgICAgICAgICAgICAoSUZFX1BTQ0xfUFJPQkVfTU9ERSB8IElGRV9QU0NMX1BST0JFX0xFRFNfT04pKTsKLSAgICAgICAgfSBlbHNlIGlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewotICAgICAgICAgICAgZXczMihMRURDVEwsIGh3LT5sZWRjdGxfbW9kZTIpOwotICAgICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisJY2FzZSBlMTAwMF84MjU0MzoKKwkJLyogU2V0IFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvbiB0aGUgTEVEICovCisJCWN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOworCQljdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0NDoKKwkJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKwkJCS8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLworCQkJY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTjA7CisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKwkJfSBlbHNlIHsKKwkJCS8qIENsZWFyIFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvbiB0aGUgTEVEICovCisJCQljdHJsICY9IH5FMTAwMF9DVFJMX1NXRFBJTjA7CisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworCQkJLyogQ2xlYXIgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9uIHRoZSBMRUQgKi8KKwkJCWN0cmwgJj0gfkUxMDAwX0NUUkxfU1dEUElOMDsKKwkJCWN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworCQl9IGVsc2UgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCQlldzMyKExFRENUTCwgaHctPmxlZGN0bF9tb2RlMik7CisJCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJfQorCQlicmVhazsKKwl9CiAKLSAgICBldzMyKENUUkwsIGN0cmwpOworCWV3MzIoQ1RSTCwgY3RybCk7CiAKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVHVybnMgb2ZmIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVECi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZTEwMDBfbGVkX29mZiAtIFR1cm5zIG9mZiB0aGUgc29mdHdhcmUgY29udHJvbGxhYmxlIExFRAorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqLwogczMyIGUxMDAwX2xlZF9vZmYoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICB1MzIgY3RybCA9IGVyMzIoQ1RSTCk7CisJdTMyIGN0cmwgPSBlcjMyKENUUkwpOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9sZWRfb2ZmIik7CisJREVCVUdGVU5DKCJlMTAwMF9sZWRfb2ZmIik7CiAKLSAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgotICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgotICAgIGNhc2UgZTEwMDBfODI1NDM6Ci0gICAgICAgIC8qIENsZWFyIFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvZmYgdGhlIExFRCAqLwotICAgICAgICBjdHJsICY9IH5FMTAwMF9DVFJMX1NXRFBJTjA7Ci0gICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwXzgyNTQ0OgotICAgICAgICBpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgewotICAgICAgICAgICAgLyogQ2xlYXIgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9mZiB0aGUgTEVEICovCi0gICAgICAgICAgICBjdHJsICY9IH5FMTAwMF9DVFJMX1NXRFBJTjA7Ci0gICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KLSAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOwotICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKLSAgICAgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KLSAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOwotICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7Ci0gICAgICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKLSAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MX0xFRCwKLSAgICAgICAgICAgICAgICAgKElGRV9QU0NMX1BST0JFX01PREUgfCBJRkVfUFNDTF9QUk9CRV9MRURTX09GRikpOwotICAgICAgICB9IGVsc2UgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7Ci0gICAgICAgICAgICBldzMyKExFRENUTCwgaHctPmxlZGN0bF9tb2RlMSk7Ci0gICAgICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9CisJc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKwljYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKwljYXNlIGUxMDAwXzgyNTQzOgorCQkvKiBDbGVhciBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KKwkJY3RybCAmPSB+RTEwMDBfQ1RSTF9TV0RQSU4wOworCQljdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0NDoKKwkJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKwkJCS8qIENsZWFyIFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvZmYgdGhlIExFRCAqLworCQkJY3RybCAmPSB+RTEwMDBfQ1RSTF9TV0RQSU4wOworCQkJY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisJCX0gZWxzZSB7CisJCQkvKiBTZXQgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9mZiB0aGUgTEVEICovCisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElOMDsKKwkJCWN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CisJCQkvKiBTZXQgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9mZiB0aGUgTEVEICovCisJCQljdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElOMDsKKwkJCWN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworCQl9IGVsc2UgaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCQlldzMyKExFRENUTCwgaHctPmxlZGN0bF9tb2RlMSk7CisJCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJfQorCQlicmVhazsKKwl9CiAKLSAgICBldzMyKENUUkwsIGN0cmwpOworCWV3MzIoQ1RSTCwgY3RybCk7CiAKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ2xlYXJzIGFsbCBoYXJkd2FyZSBzdGF0aXN0aWNzIGNvdW50ZXJzLgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGUxMDAwX2NsZWFyX2h3X2NudHJzIC0gQ2xlYXJzIGFsbCBoYXJkd2FyZSBzdGF0aXN0aWNzIGNvdW50ZXJzLgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqLwogc3RhdGljIHZvaWQgZTEwMDBfY2xlYXJfaHdfY250cnMoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICB2b2xhdGlsZSB1MzIgdGVtcDsKKwl2b2xhdGlsZSB1MzIgdGVtcDsKIAotICAgIHRlbXAgPSBlcjMyKENSQ0VSUlMpOwotICAgIHRlbXAgPSBlcjMyKFNZTUVSUlMpOwotICAgIHRlbXAgPSBlcjMyKE1QQyk7Ci0gICAgdGVtcCA9IGVyMzIoU0NDKTsKLSAgICB0ZW1wID0gZXIzMihFQ09MKTsKLSAgICB0ZW1wID0gZXIzMihNQ0MpOwotICAgIHRlbXAgPSBlcjMyKExBVEVDT0wpOwotICAgIHRlbXAgPSBlcjMyKENPTEMpOwotICAgIHRlbXAgPSBlcjMyKERDKTsKLSAgICB0ZW1wID0gZXIzMihTRUMpOwotICAgIHRlbXAgPSBlcjMyKFJMRUMpOwotICAgIHRlbXAgPSBlcjMyKFhPTlJYQyk7Ci0gICAgdGVtcCA9IGVyMzIoWE9OVFhDKTsKLSAgICB0ZW1wID0gZXIzMihYT0ZGUlhDKTsKLSAgICB0ZW1wID0gZXIzMihYT0ZGVFhDKTsKLSAgICB0ZW1wID0gZXIzMihGQ1JVQyk7CisJdGVtcCA9IGVyMzIoQ1JDRVJSUyk7CisJdGVtcCA9IGVyMzIoU1lNRVJSUyk7CisJdGVtcCA9IGVyMzIoTVBDKTsKKwl0ZW1wID0gZXIzMihTQ0MpOworCXRlbXAgPSBlcjMyKEVDT0wpOworCXRlbXAgPSBlcjMyKE1DQyk7CisJdGVtcCA9IGVyMzIoTEFURUNPTCk7CisJdGVtcCA9IGVyMzIoQ09MQyk7CisJdGVtcCA9IGVyMzIoREMpOworCXRlbXAgPSBlcjMyKFNFQyk7CisJdGVtcCA9IGVyMzIoUkxFQyk7CisJdGVtcCA9IGVyMzIoWE9OUlhDKTsKKwl0ZW1wID0gZXIzMihYT05UWEMpOworCXRlbXAgPSBlcjMyKFhPRkZSWEMpOworCXRlbXAgPSBlcjMyKFhPRkZUWEMpOworCXRlbXAgPSBlcjMyKEZDUlVDKTsKIAotICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewotICAgIHRlbXAgPSBlcjMyKFBSQzY0KTsKLSAgICB0ZW1wID0gZXIzMihQUkMxMjcpOwotICAgIHRlbXAgPSBlcjMyKFBSQzI1NSk7Ci0gICAgdGVtcCA9IGVyMzIoUFJDNTExKTsKLSAgICB0ZW1wID0gZXIzMihQUkMxMDIzKTsKLSAgICB0ZW1wID0gZXIzMihQUkMxNTIyKTsKLSAgICB9CisJdGVtcCA9IGVyMzIoUFJDNjQpOworCXRlbXAgPSBlcjMyKFBSQzEyNyk7CisJdGVtcCA9IGVyMzIoUFJDMjU1KTsKKwl0ZW1wID0gZXIzMihQUkM1MTEpOworCXRlbXAgPSBlcjMyKFBSQzEwMjMpOworCXRlbXAgPSBlcjMyKFBSQzE1MjIpOwogCi0gICAgdGVtcCA9IGVyMzIoR1BSQyk7Ci0gICAgdGVtcCA9IGVyMzIoQlBSQyk7Ci0gICAgdGVtcCA9IGVyMzIoTVBSQyk7Ci0gICAgdGVtcCA9IGVyMzIoR1BUQyk7Ci0gICAgdGVtcCA9IGVyMzIoR09SQ0wpOwotICAgIHRlbXAgPSBlcjMyKEdPUkNIKTsKLSAgICB0ZW1wID0gZXIzMihHT1RDTCk7Ci0gICAgdGVtcCA9IGVyMzIoR09UQ0gpOwotICAgIHRlbXAgPSBlcjMyKFJOQkMpOwotICAgIHRlbXAgPSBlcjMyKFJVQyk7Ci0gICAgdGVtcCA9IGVyMzIoUkZDKTsKLSAgICB0ZW1wID0gZXIzMihST0MpOwotICAgIHRlbXAgPSBlcjMyKFJKQyk7Ci0gICAgdGVtcCA9IGVyMzIoVE9STCk7Ci0gICAgdGVtcCA9IGVyMzIoVE9SSCk7Ci0gICAgdGVtcCA9IGVyMzIoVE9UTCk7Ci0gICAgdGVtcCA9IGVyMzIoVE9USCk7Ci0gICAgdGVtcCA9IGVyMzIoVFBSKTsKLSAgICB0ZW1wID0gZXIzMihUUFQpOworCXRlbXAgPSBlcjMyKEdQUkMpOworCXRlbXAgPSBlcjMyKEJQUkMpOworCXRlbXAgPSBlcjMyKE1QUkMpOworCXRlbXAgPSBlcjMyKEdQVEMpOworCXRlbXAgPSBlcjMyKEdPUkNMKTsKKwl0ZW1wID0gZXIzMihHT1JDSCk7CisJdGVtcCA9IGVyMzIoR09UQ0wpOworCXRlbXAgPSBlcjMyKEdPVENIKTsKKwl0ZW1wID0gZXIzMihSTkJDKTsKKwl0ZW1wID0gZXIzMihSVUMpOworCXRlbXAgPSBlcjMyKFJGQyk7CisJdGVtcCA9IGVyMzIoUk9DKTsKKwl0ZW1wID0gZXIzMihSSkMpOworCXRlbXAgPSBlcjMyKFRPUkwpOworCXRlbXAgPSBlcjMyKFRPUkgpOworCXRlbXAgPSBlcjMyKFRPVEwpOworCXRlbXAgPSBlcjMyKFRPVEgpOworCXRlbXAgPSBlcjMyKFRQUik7CisJdGVtcCA9IGVyMzIoVFBUKTsKIAotICAgIGlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewotICAgIHRlbXAgPSBlcjMyKFBUQzY0KTsKLSAgICB0ZW1wID0gZXIzMihQVEMxMjcpOwotICAgIHRlbXAgPSBlcjMyKFBUQzI1NSk7Ci0gICAgdGVtcCA9IGVyMzIoUFRDNTExKTsKLSAgICB0ZW1wID0gZXIzMihQVEMxMDIzKTsKLSAgICB0ZW1wID0gZXIzMihQVEMxNTIyKTsKLSAgICB9CisJdGVtcCA9IGVyMzIoUFRDNjQpOworCXRlbXAgPSBlcjMyKFBUQzEyNyk7CisJdGVtcCA9IGVyMzIoUFRDMjU1KTsKKwl0ZW1wID0gZXIzMihQVEM1MTEpOworCXRlbXAgPSBlcjMyKFBUQzEwMjMpOworCXRlbXAgPSBlcjMyKFBUQzE1MjIpOwogCi0gICAgdGVtcCA9IGVyMzIoTVBUQyk7Ci0gICAgdGVtcCA9IGVyMzIoQlBUQyk7CisJdGVtcCA9IGVyMzIoTVBUQyk7CisJdGVtcCA9IGVyMzIoQlBUQyk7CiAKLSAgICBpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHJldHVybjsKKwlpZiAoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpCisJCXJldHVybjsKIAotICAgIHRlbXAgPSBlcjMyKEFMR05FUlJDKTsKLSAgICB0ZW1wID0gZXIzMihSWEVSUkMpOwotICAgIHRlbXAgPSBlcjMyKFROQ1JTKTsKLSAgICB0ZW1wID0gZXIzMihDRVhURVJSKTsKLSAgICB0ZW1wID0gZXIzMihUU0NUQyk7Ci0gICAgdGVtcCA9IGVyMzIoVFNDVEZDKTsKKwl0ZW1wID0gZXIzMihBTEdORVJSQyk7CisJdGVtcCA9IGVyMzIoUlhFUlJDKTsKKwl0ZW1wID0gZXIzMihUTkNSUyk7CisJdGVtcCA9IGVyMzIoQ0VYVEVSUik7CisJdGVtcCA9IGVyMzIoVFNDVEMpOworCXRlbXAgPSBlcjMyKFRTQ1RGQyk7CiAKLSAgICBpZiAoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ0KSByZXR1cm47CisJaWYgKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0NCkKKwkJcmV0dXJuOwogCi0gICAgdGVtcCA9IGVyMzIoTUdUUFJDKTsKLSAgICB0ZW1wID0gZXIzMihNR1RQREMpOwotICAgIHRlbXAgPSBlcjMyKE1HVFBUQyk7Ci0KLSAgICBpZiAoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKSByZXR1cm47Ci0KLSAgICB0ZW1wID0gZXIzMihJQUMpOwotICAgIHRlbXAgPSBlcjMyKElDUlhPQyk7Ci0KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHJldHVybjsKLQotICAgIHRlbXAgPSBlcjMyKElDUlhQVEMpOwotICAgIHRlbXAgPSBlcjMyKElDUlhBVEMpOwotICAgIHRlbXAgPSBlcjMyKElDVFhQVEMpOwotICAgIHRlbXAgPSBlcjMyKElDVFhBVEMpOwotICAgIHRlbXAgPSBlcjMyKElDVFhRRUMpOwotICAgIHRlbXAgPSBlcjMyKElDVFhRTVRDKTsKLSAgICB0ZW1wID0gZXIzMihJQ1JYRE1UQyk7CisJdGVtcCA9IGVyMzIoTUdUUFJDKTsKKwl0ZW1wID0gZXIzMihNR1RQREMpOworCXRlbXAgPSBlcjMyKE1HVFBUQyk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJlc2V0cyBBZGFwdGl2ZSBJRlMgdG8gaXRzIGRlZmF1bHQgc3RhdGUuCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKy8qKgorICogZTEwMDBfcmVzZXRfYWRhcHRpdmUgLSBSZXNldHMgQWRhcHRpdmUgSUZTIHRvIGl0cyBkZWZhdWx0IHN0YXRlLgorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICAqCiAgKiBDYWxsIHRoaXMgYWZ0ZXIgZTEwMDBfaW5pdF9ody4gWW91IG1heSBvdmVycmlkZSB0aGUgSUZTIGRlZmF1bHRzIGJ5IHNldHRpbmcKICAqIGh3LT5pZnNfcGFyYW1zX2ZvcmNlZCB0byB0cnVlLiBIb3dldmVyLCB5b3UgbXVzdCBpbml0aWFsaXplIGh3LT4KICAqIGN1cnJlbnRfaWZzX3ZhbCwgaWZzX21pbl92YWwsIGlmc19tYXhfdmFsLCBpZnNfc3RlcF9zaXplLCBhbmQgaWZzX3JhdGlvCiAgKiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiB2b2lkIGUxMDAwX3Jlc2V0X2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgREVCVUdGVU5DKCJlMTAwMF9yZXNldF9hZGFwdGl2ZSIpOworCURFQlVHRlVOQygiZTEwMDBfcmVzZXRfYWRhcHRpdmUiKTsKIAotICAgIGlmIChody0+YWRhcHRpdmVfaWZzKSB7Ci0gICAgICAgIGlmICghaHctPmlmc19wYXJhbXNfZm9yY2VkKSB7Ci0gICAgICAgICAgICBody0+Y3VycmVudF9pZnNfdmFsID0gMDsKLSAgICAgICAgICAgIGh3LT5pZnNfbWluX3ZhbCA9IElGU19NSU47Ci0gICAgICAgICAgICBody0+aWZzX21heF92YWwgPSBJRlNfTUFYOwotICAgICAgICAgICAgaHctPmlmc19zdGVwX3NpemUgPSBJRlNfU1RFUDsKLSAgICAgICAgICAgIGh3LT5pZnNfcmF0aW8gPSBJRlNfUkFUSU87Ci0gICAgICAgIH0KLSAgICAgICAgaHctPmluX2lmc19tb2RlID0gZmFsc2U7Ci0gICAgICAgIGV3MzIoQUlULCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR09VVCgiTm90IGluIEFkYXB0aXZlIElGUyBtb2RlIVxuIik7Ci0gICAgfQorCWlmIChody0+YWRhcHRpdmVfaWZzKSB7CisJCWlmICghaHctPmlmc19wYXJhbXNfZm9yY2VkKSB7CisJCQlody0+Y3VycmVudF9pZnNfdmFsID0gMDsKKwkJCWh3LT5pZnNfbWluX3ZhbCA9IElGU19NSU47CisJCQlody0+aWZzX21heF92YWwgPSBJRlNfTUFYOworCQkJaHctPmlmc19zdGVwX3NpemUgPSBJRlNfU1RFUDsKKwkJCWh3LT5pZnNfcmF0aW8gPSBJRlNfUkFUSU87CisJCX0KKwkJaHctPmluX2lmc19tb2RlID0gZmFsc2U7CisJCWV3MzIoQUlULCAwKTsKKwl9IGVsc2UgeworCQlERUJVR09VVCgiTm90IGluIEFkYXB0aXZlIElGUyBtb2RlIVxuIik7CisJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioKKyAqIGUxMDAwX3VwZGF0ZV9hZGFwdGl2ZSAtIHVwZGF0ZSBhZGFwdGl2ZSBJRlMKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAdHhfcGFja2V0czogTnVtYmVyIG9mIHRyYW5zbWl0cyBzaW5jZSBsYXN0IGNhbGxiYWNrCisgKiBAdG90YWxfY29sbGlzaW9uczogTnVtYmVyIG9mIGNvbGxpc2lvbnMgc2luY2UgbGFzdCBjYWxsYmFjaworICoKICAqIENhbGxlZCBkdXJpbmcgdGhlIGNhbGxiYWNrL3dhdGNoZG9nIHJvdXRpbmUgdG8gdXBkYXRlIElGUyB2YWx1ZSBiYXNlZCBvbgogICogdGhlIHJhdGlvIG9mIHRyYW5zbWl0cyB0byBjb2xsaXNpb25zLgotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiB0eF9wYWNrZXRzIC0gTnVtYmVyIG9mIHRyYW5zbWl0cyBzaW5jZSBsYXN0IGNhbGxiYWNrCi0gKiB0b3RhbF9jb2xsaXNpb25zIC0gTnVtYmVyIG9mIGNvbGxpc2lvbnMgc2luY2UgbGFzdCBjYWxsYmFjawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiB2b2lkIGUxMDAwX3VwZGF0ZV9hZGFwdGl2ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIERFQlVHRlVOQygiZTEwMDBfdXBkYXRlX2FkYXB0aXZlIik7CisJREVCVUdGVU5DKCJlMTAwMF91cGRhdGVfYWRhcHRpdmUiKTsKIAotICAgIGlmIChody0+YWRhcHRpdmVfaWZzKSB7Ci0gICAgICAgIGlmICgoaHctPmNvbGxpc2lvbl9kZWx0YSAqIGh3LT5pZnNfcmF0aW8pID4gaHctPnR4X3BhY2tldF9kZWx0YSkgewotICAgICAgICAgICAgaWYgKGh3LT50eF9wYWNrZXRfZGVsdGEgPiBNSU5fTlVNX1hNSVRTKSB7Ci0gICAgICAgICAgICAgICAgaHctPmluX2lmc19tb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoaHctPmN1cnJlbnRfaWZzX3ZhbCA8IGh3LT5pZnNfbWF4X3ZhbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaHctPmN1cnJlbnRfaWZzX3ZhbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaHctPmN1cnJlbnRfaWZzX3ZhbCA9IGh3LT5pZnNfbWluX3ZhbDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaHctPmN1cnJlbnRfaWZzX3ZhbCArPSBody0+aWZzX3N0ZXBfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgZXczMihBSVQsIGh3LT5jdXJyZW50X2lmc192YWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChody0+aW5faWZzX21vZGUgJiYgKGh3LT50eF9wYWNrZXRfZGVsdGEgPD0gTUlOX05VTV9YTUlUUykpIHsKLSAgICAgICAgICAgICAgICBody0+Y3VycmVudF9pZnNfdmFsID0gMDsKLSAgICAgICAgICAgICAgICBody0+aW5faWZzX21vZGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBldzMyKEFJVCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBERUJVR09VVCgiTm90IGluIEFkYXB0aXZlIElGUyBtb2RlIVxuIik7Ci0gICAgfQorCWlmIChody0+YWRhcHRpdmVfaWZzKSB7CisJCWlmICgoaHctPmNvbGxpc2lvbl9kZWx0YSAqaHctPmlmc19yYXRpbykgPiBody0+dHhfcGFja2V0X2RlbHRhKSB7CisJCQlpZiAoaHctPnR4X3BhY2tldF9kZWx0YSA+IE1JTl9OVU1fWE1JVFMpIHsKKwkJCQlody0+aW5faWZzX21vZGUgPSB0cnVlOworCQkJCWlmIChody0+Y3VycmVudF9pZnNfdmFsIDwgaHctPmlmc19tYXhfdmFsKSB7CisJCQkJCWlmIChody0+Y3VycmVudF9pZnNfdmFsID09IDApCisJCQkJCQlody0+Y3VycmVudF9pZnNfdmFsID0KKwkJCQkJCSAgICBody0+aWZzX21pbl92YWw7CisJCQkJCWVsc2UKKwkJCQkJCWh3LT5jdXJyZW50X2lmc192YWwgKz0KKwkJCQkJCSAgICBody0+aWZzX3N0ZXBfc2l6ZTsKKwkJCQkJZXczMihBSVQsIGh3LT5jdXJyZW50X2lmc192YWwpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChody0+aW5faWZzX21vZGUKKwkJCSAgICAmJiAoaHctPnR4X3BhY2tldF9kZWx0YSA8PSBNSU5fTlVNX1hNSVRTKSkgeworCQkJCWh3LT5jdXJyZW50X2lmc192YWwgPSAwOworCQkJCWh3LT5pbl9pZnNfbW9kZSA9IGZhbHNlOworCQkJCWV3MzIoQUlULCAwKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCURFQlVHT1VUKCJOb3QgaW4gQWRhcHRpdmUgSUZTIG1vZGUhXG4iKTsKKwl9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFkanVzdHMgdGhlIHN0YXRpc3RpYyBjb3VudGVycyB3aGVuIGEgZnJhbWUgaXMgYWNjZXB0ZWQgYnkgVEJJX0FDQ0VQVAorLyoqCisgKiBlMTAwMF90YmlfYWRqdXN0X3N0YXRzCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQGZyYW1lX2xlbjogVGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgaW4gcXVlc3Rpb24KKyAqIEBtYWNfYWRkcjogVGhlIEV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIGZyYW1lIGluIHF1ZXN0aW9uCiAgKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqIGZyYW1lX2xlbiAtIFRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIGluIHF1ZXN0aW9uCi0gKiBtYWNfYWRkciAtIFRoZSBFdGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBmcmFtZSBpbiBxdWVzdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQWRqdXN0cyB0aGUgc3RhdGlzdGljIGNvdW50ZXJzIHdoZW4gYSBmcmFtZSBpcyBhY2NlcHRlZCBieSBUQklfQUNDRVBUCisgKi8KIHZvaWQgZTEwMDBfdGJpX2FkanVzdF9zdGF0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfaHdfc3RhdHMgKnN0YXRzLAogCQkJICAgIHUzMiBmcmFtZV9sZW4sIHU4ICptYWNfYWRkcikKIHsKLSAgICB1NjQgY2FycnlfYml0OworCXU2NCBjYXJyeV9iaXQ7CiAKLSAgICAvKiBGaXJzdCBhZGp1c3QgdGhlIGZyYW1lIGxlbmd0aC4gKi8KLSAgICBmcmFtZV9sZW4tLTsKLSAgICAvKiBXZSBuZWVkIHRvIGFkanVzdCB0aGUgc3RhdGlzdGljcyBjb3VudGVycywgc2luY2UgdGhlIGhhcmR3YXJlCi0gICAgICogY291bnRlcnMgb3ZlcmNvdW50IHRoaXMgcGFja2V0IGFzIGEgQ1JDIGVycm9yIGFuZCB1bmRlcmNvdW50Ci0gICAgICogdGhlIHBhY2tldCBhcyBhIGdvb2QgcGFja2V0Ci0gICAgICovCi0gICAgLyogVGhpcyBwYWNrZXQgc2hvdWxkIG5vdCBiZSBjb3VudGVkIGFzIGEgQ1JDIGVycm9yLiAgICAqLwotICAgIHN0YXRzLT5jcmNlcnJzLS07Ci0gICAgLyogVGhpcyBwYWNrZXQgZG9lcyBjb3VudCBhcyBhIEdvb2QgUGFja2V0IFJlY2VpdmVkLiAgICAqLwotICAgIHN0YXRzLT5ncHJjKys7CisJLyogRmlyc3QgYWRqdXN0IHRoZSBmcmFtZSBsZW5ndGguICovCisJZnJhbWVfbGVuLS07CisJLyogV2UgbmVlZCB0byBhZGp1c3QgdGhlIHN0YXRpc3RpY3MgY291bnRlcnMsIHNpbmNlIHRoZSBoYXJkd2FyZQorCSAqIGNvdW50ZXJzIG92ZXJjb3VudCB0aGlzIHBhY2tldCBhcyBhIENSQyBlcnJvciBhbmQgdW5kZXJjb3VudAorCSAqIHRoZSBwYWNrZXQgYXMgYSBnb29kIHBhY2tldAorCSAqLworCS8qIFRoaXMgcGFja2V0IHNob3VsZCBub3QgYmUgY291bnRlZCBhcyBhIENSQyBlcnJvci4gICAgKi8KKwlzdGF0cy0+Y3JjZXJycy0tOworCS8qIFRoaXMgcGFja2V0IGRvZXMgY291bnQgYXMgYSBHb29kIFBhY2tldCBSZWNlaXZlZC4gICAgKi8KKwlzdGF0cy0+Z3ByYysrOwogCi0gICAgLyogQWRqdXN0IHRoZSBHb29kIE9jdGV0cyByZWNlaXZlZCBjb3VudGVycyAgICAgICAgICAgICAqLwotICAgIGNhcnJ5X2JpdCA9IDB4ODAwMDAwMDAgJiBzdGF0cy0+Z29yY2w7Ci0gICAgc3RhdHMtPmdvcmNsICs9IGZyYW1lX2xlbjsKLSAgICAvKiBJZiB0aGUgaGlnaCBiaXQgb2YgR29yY2wgKHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgR29vZCBPY3RldHMKLSAgICAgKiBSZWNlaXZlZCBDb3VudCkgd2FzIG9uZSBiZWZvcmUgdGhlIGFkZGl0aW9uLAotICAgICAqIEFORCBpdCBpcyB6ZXJvIGFmdGVyLCB0aGVuIHdlIGxvc3QgdGhlIGNhcnJ5IG91dCwKLSAgICAgKiBuZWVkIHRvIGFkZCBvbmUgdG8gR29yY2ggKEdvb2QgT2N0ZXRzIFJlY2VpdmVkIENvdW50IEhpZ2gpLgotICAgICAqIFRoaXMgY291bGQgYmUgc2ltcGxpZmllZCBpZiBhbGwgZW52aXJvbm1lbnRzIHN1cHBvcnRlZAotICAgICAqIDY0LWJpdCBpbnRlZ2Vycy4KLSAgICAgKi8KLSAgICBpZiAoY2FycnlfYml0ICYmICgoc3RhdHMtPmdvcmNsICYgMHg4MDAwMDAwMCkgPT0gMCkpCi0gICAgICAgIHN0YXRzLT5nb3JjaCsrOwotICAgIC8qIElzIHRoaXMgYSBicm9hZGNhc3Qgb3IgbXVsdGljYXN0PyAgQ2hlY2sgYnJvYWRjYXN0IGZpcnN0LAotICAgICAqIHNpbmNlIHRoZSB0ZXN0IGZvciBhIG11bHRpY2FzdCBmcmFtZSB3aWxsIHRlc3QgcG9zaXRpdmUgb24KLSAgICAgKiBhIGJyb2FkY2FzdCBmcmFtZS4KLSAgICAgKi8KLSAgICBpZiAoKG1hY19hZGRyWzBdID09ICh1OCkweGZmKSAmJiAobWFjX2FkZHJbMV0gPT0gKHU4KTB4ZmYpKQotICAgICAgICAvKiBCcm9hZGNhc3QgcGFja2V0ICovCi0gICAgICAgIHN0YXRzLT5icHJjKys7Ci0gICAgZWxzZSBpZiAoKm1hY19hZGRyICYgMHgwMSkKLSAgICAgICAgLyogTXVsdGljYXN0IHBhY2tldCAqLwotICAgICAgICBzdGF0cy0+bXByYysrOworCS8qIEFkanVzdCB0aGUgR29vZCBPY3RldHMgcmVjZWl2ZWQgY291bnRlcnMgICAgICAgICAgICAgKi8KKwljYXJyeV9iaXQgPSAweDgwMDAwMDAwICYgc3RhdHMtPmdvcmNsOworCXN0YXRzLT5nb3JjbCArPSBmcmFtZV9sZW47CisJLyogSWYgdGhlIGhpZ2ggYml0IG9mIEdvcmNsICh0aGUgbG93IDMyIGJpdHMgb2YgdGhlIEdvb2QgT2N0ZXRzCisJICogUmVjZWl2ZWQgQ291bnQpIHdhcyBvbmUgYmVmb3JlIHRoZSBhZGRpdGlvbiwKKwkgKiBBTkQgaXQgaXMgemVybyBhZnRlciwgdGhlbiB3ZSBsb3N0IHRoZSBjYXJyeSBvdXQsCisJICogbmVlZCB0byBhZGQgb25lIHRvIEdvcmNoIChHb29kIE9jdGV0cyBSZWNlaXZlZCBDb3VudCBIaWdoKS4KKwkgKiBUaGlzIGNvdWxkIGJlIHNpbXBsaWZpZWQgaWYgYWxsIGVudmlyb25tZW50cyBzdXBwb3J0ZWQKKwkgKiA2NC1iaXQgaW50ZWdlcnMuCisJICovCisJaWYgKGNhcnJ5X2JpdCAmJiAoKHN0YXRzLT5nb3JjbCAmIDB4ODAwMDAwMDApID09IDApKQorCQlzdGF0cy0+Z29yY2grKzsKKwkvKiBJcyB0aGlzIGEgYnJvYWRjYXN0IG9yIG11bHRpY2FzdD8gIENoZWNrIGJyb2FkY2FzdCBmaXJzdCwKKwkgKiBzaW5jZSB0aGUgdGVzdCBmb3IgYSBtdWx0aWNhc3QgZnJhbWUgd2lsbCB0ZXN0IHBvc2l0aXZlIG9uCisJICogYSBicm9hZGNhc3QgZnJhbWUuCisJICovCisJaWYgKChtYWNfYWRkclswXSA9PSAodTgpIDB4ZmYpICYmIChtYWNfYWRkclsxXSA9PSAodTgpIDB4ZmYpKQorCQkvKiBCcm9hZGNhc3QgcGFja2V0ICovCisJCXN0YXRzLT5icHJjKys7CisJZWxzZSBpZiAoKm1hY19hZGRyICYgMHgwMSkKKwkJLyogTXVsdGljYXN0IHBhY2tldCAqLworCQlzdGF0cy0+bXByYysrOwogCi0gICAgaWYgKGZyYW1lX2xlbiA9PSBody0+bWF4X2ZyYW1lX3NpemUpIHsKLSAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgaGFyZHdhcmUgaGFzIG92ZXJjb3VudGVkIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICogb3ZlcnNpemUgZnJhbWVzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHN0YXRzLT5yb2MgPiAwKQotICAgICAgICAgICAgc3RhdHMtPnJvYy0tOwotICAgIH0KKwlpZiAoZnJhbWVfbGVuID09IGh3LT5tYXhfZnJhbWVfc2l6ZSkgeworCQkvKiBJbiB0aGlzIGNhc2UsIHRoZSBoYXJkd2FyZSBoYXMgb3ZlcmNvdW50ZWQgdGhlIG51bWJlciBvZgorCQkgKiBvdmVyc2l6ZSBmcmFtZXMuCisJCSAqLworCQlpZiAoc3RhdHMtPnJvYyA+IDApCisJCQlzdGF0cy0+cm9jLS07CisJfQogCi0gICAgLyogQWRqdXN0IHRoZSBiaW4gY291bnRlcnMgd2hlbiB0aGUgZXh0cmEgYnl0ZSBwdXQgdGhlIGZyYW1lIGluIHRoZQotICAgICAqIHdyb25nIGJpbi4gUmVtZW1iZXIgdGhhdCB0aGUgZnJhbWVfbGVuIHdhcyBhZGp1c3RlZCBhYm92ZS4KLSAgICAgKi8KLSAgICBpZiAoZnJhbWVfbGVuID09IDY0KSB7Ci0gICAgICAgIHN0YXRzLT5wcmM2NCsrOwotICAgICAgICBzdGF0cy0+cHJjMTI3LS07Ci0gICAgfSBlbHNlIGlmIChmcmFtZV9sZW4gPT0gMTI3KSB7Ci0gICAgICAgIHN0YXRzLT5wcmMxMjcrKzsKLSAgICAgICAgc3RhdHMtPnByYzI1NS0tOwotICAgIH0gZWxzZSBpZiAoZnJhbWVfbGVuID09IDI1NSkgewotICAgICAgICBzdGF0cy0+cHJjMjU1Kys7Ci0gICAgICAgIHN0YXRzLT5wcmM1MTEtLTsKLSAgICB9IGVsc2UgaWYgKGZyYW1lX2xlbiA9PSA1MTEpIHsKLSAgICAgICAgc3RhdHMtPnByYzUxMSsrOwotICAgICAgICBzdGF0cy0+cHJjMTAyMy0tOwotICAgIH0gZWxzZSBpZiAoZnJhbWVfbGVuID09IDEwMjMpIHsKLSAgICAgICAgc3RhdHMtPnByYzEwMjMrKzsKLSAgICAgICAgc3RhdHMtPnByYzE1MjItLTsKLSAgICB9IGVsc2UgaWYgKGZyYW1lX2xlbiA9PSAxNTIyKSB7Ci0gICAgICAgIHN0YXRzLT5wcmMxNTIyKys7Ci0gICAgfQorCS8qIEFkanVzdCB0aGUgYmluIGNvdW50ZXJzIHdoZW4gdGhlIGV4dHJhIGJ5dGUgcHV0IHRoZSBmcmFtZSBpbiB0aGUKKwkgKiB3cm9uZyBiaW4uIFJlbWVtYmVyIHRoYXQgdGhlIGZyYW1lX2xlbiB3YXMgYWRqdXN0ZWQgYWJvdmUuCisJICovCisJaWYgKGZyYW1lX2xlbiA9PSA2NCkgeworCQlzdGF0cy0+cHJjNjQrKzsKKwkJc3RhdHMtPnByYzEyNy0tOworCX0gZWxzZSBpZiAoZnJhbWVfbGVuID09IDEyNykgeworCQlzdGF0cy0+cHJjMTI3Kys7CisJCXN0YXRzLT5wcmMyNTUtLTsKKwl9IGVsc2UgaWYgKGZyYW1lX2xlbiA9PSAyNTUpIHsKKwkJc3RhdHMtPnByYzI1NSsrOworCQlzdGF0cy0+cHJjNTExLS07CisJfSBlbHNlIGlmIChmcmFtZV9sZW4gPT0gNTExKSB7CisJCXN0YXRzLT5wcmM1MTErKzsKKwkJc3RhdHMtPnByYzEwMjMtLTsKKwl9IGVsc2UgaWYgKGZyYW1lX2xlbiA9PSAxMDIzKSB7CisJCXN0YXRzLT5wcmMxMDIzKys7CisJCXN0YXRzLT5wcmMxNTIyLS07CisJfSBlbHNlIGlmIChmcmFtZV9sZW4gPT0gMTUyMikgeworCQlzdGF0cy0+cHJjMTUyMisrOworCX0KIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogR2V0cyB0aGUgY3VycmVudCBQQ0kgYnVzIHR5cGUsIHNwZWVkLCBhbmQgd2lkdGggb2YgdGhlIGhhcmR3YXJlCisvKioKKyAqIGUxMDAwX2dldF9idXNfaW5mbworICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogR2V0cyB0aGUgY3VycmVudCBQQ0kgYnVzIHR5cGUsIHNwZWVkLCBhbmQgd2lkdGggb2YgdGhlIGhhcmR3YXJlCisgKi8KIHZvaWQgZTEwMDBfZ2V0X2J1c19pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgczMyIHJldF92YWw7Ci0gICAgdTE2IHBjaV9leF9saW5rX3N0YXR1czsKLSAgICB1MzIgc3RhdHVzOworCXUzMiBzdGF0dXM7CiAKLSAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgotICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgotICAgICAgICBody0+YnVzX3R5cGUgPSBlMTAwMF9idXNfdHlwZV9wY2k7Ci0gICAgICAgIGh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfdW5rbm93bjsKLSAgICAgICAgaHctPmJ1c193aWR0aCA9IGUxMDAwX2J1c193aWR0aF91bmtub3duOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwXzgyNTcxOgotICAgIGNhc2UgZTEwMDBfODI1NzI6Ci0gICAgY2FzZSBlMTAwMF84MjU3MzoKLSAgICBjYXNlIGUxMDAwXzgwMDAzZXMybGFuOgotICAgICAgICBody0+YnVzX3R5cGUgPSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzczsKLSAgICAgICAgaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF8yNTAwOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9wY2llX2NhcF9yZWcoaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9FWF9MSU5LX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBjaV9leF9saW5rX3N0YXR1cyk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgaHctPmJ1c193aWR0aCA9IGUxMDAwX2J1c193aWR0aF91bmtub3duOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBody0+YnVzX3dpZHRoID0gKHBjaV9leF9saW5rX3N0YXR1cyAmIFBDSV9FWF9MSU5LX1dJRFRIX01BU0spID4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9FWF9MSU5LX1dJRFRIX1NISUZUOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwX2ljaDhsYW46Ci0gICAgICAgIGh3LT5idXNfdHlwZSA9IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzOwotICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkXzI1MDA7Ci0gICAgICAgIGh3LT5idXNfd2lkdGggPSBlMTAwMF9idXNfd2lkdGhfcGNpZXhfMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc3RhdHVzID0gZXIzMihTVEFUVVMpOwotICAgICAgICBody0+YnVzX3R5cGUgPSAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1BDSVhfTU9ERSkgPwotICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9idXNfdHlwZV9wY2l4IDogZTEwMDBfYnVzX3R5cGVfcGNpOworCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisJCWh3LT5idXNfdHlwZSA9IGUxMDAwX2J1c190eXBlX3BjaTsKKwkJaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF91bmtub3duOworCQlody0+YnVzX3dpZHRoID0gZTEwMDBfYnVzX3dpZHRoX3Vua25vd247CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IGVyMzIoU1RBVFVTKTsKKwkJaHctPmJ1c190eXBlID0gKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19QQ0lYX01PREUpID8KKwkJICAgIGUxMDAwX2J1c190eXBlX3BjaXggOiBlMTAwMF9idXNfdHlwZV9wY2k7CiAKLSAgICAgICAgaWYgKGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEXzgyNTQ2RUJfUVVBRF9DT1BQRVIpIHsKLSAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c19zcGVlZF82NiA6IGUxMDAwX2J1c19zcGVlZF8xMjA7Ci0gICAgICAgIH0gZWxzZSBpZiAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaSkgewotICAgICAgICAgICAgaHctPmJ1c19zcGVlZCA9IChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfUENJNjYpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9idXNfc3BlZWRfNjYgOiBlMTAwMF9idXNfc3BlZWRfMzM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEKSB7Ci0gICAgICAgICAgICBjYXNlIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzY2OgotICAgICAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfNjY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEwMDoKLSAgICAgICAgICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkXzEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfMTMzOgotICAgICAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfMTMzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkX3Jlc2VydmVkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGh3LT5idXNfd2lkdGggPSAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0JVUzY0KSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9idXNfd2lkdGhfNjQgOiBlMTAwMF9idXNfd2lkdGhfMzI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwkJaWYgKGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEXzgyNTQ2RUJfUVVBRF9DT1BQRVIpIHsKKwkJCWh3LT5idXNfc3BlZWQgPSAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaSkgPworCQkJICAgIGUxMDAwX2J1c19zcGVlZF82NiA6IGUxMDAwX2J1c19zcGVlZF8xMjA7CisJCX0gZWxzZSBpZiAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaSkgeworCQkJaHctPmJ1c19zcGVlZCA9IChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfUENJNjYpID8KKwkJCSAgICBlMTAwMF9idXNfc3BlZWRfNjYgOiBlMTAwMF9idXNfc3BlZWRfMzM7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEKSB7CisJCQljYXNlIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzY2OgorCQkJCWh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfNjY7CisJCQkJYnJlYWs7CisJCQljYXNlIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEwMDoKKwkJCQlody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkXzEwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfMTMzOgorCQkJCWh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfMTMzOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkX3Jlc2VydmVkOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWh3LT5idXNfd2lkdGggPSAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0JVUzY0KSA/CisJCSAgICBlMTAwMF9idXNfd2lkdGhfNjQgOiBlMTAwMF9idXNfd2lkdGhfMzI7CisJCWJyZWFrOworCX0KIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqCisgKiBlMTAwMF93cml0ZV9yZWdfaW8KKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAb2Zmc2V0OiBvZmZzZXQgdG8gd3JpdGUgdG8KKyAqIEB2YWx1ZTogdmFsdWUgdG8gd3JpdGUKKyAqCiAgKiBXcml0ZXMgYSB2YWx1ZSB0byBvbmUgb2YgdGhlIGRldmljZXMgcmVnaXN0ZXJzIHVzaW5nIHBvcnQgSS9PIChhcyBvcHBvc2VkIHRvCiAgKiBtZW1vcnkgbWFwcGVkIEkvTykuIE9ubHkgODI1NDQgYW5kIG5ld2VyIGRldmljZXMgc3VwcG9ydCBwb3J0IEkvTy4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogb2Zmc2V0IC0gb2Zmc2V0IHRvIHdyaXRlIHRvCi0gKiB2YWx1ZSAtIHZhbHVlIHRvIHdyaXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIHN0YXRpYyB2b2lkIGUxMDAwX3dyaXRlX3JlZ19pbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7Ci0gICAgdW5zaWduZWQgbG9uZyBpb19hZGRyID0gaHctPmlvX2Jhc2U7Ci0gICAgdW5zaWduZWQgbG9uZyBpb19kYXRhID0gaHctPmlvX2Jhc2UgKyA0OworCXVuc2lnbmVkIGxvbmcgaW9fYWRkciA9IGh3LT5pb19iYXNlOworCXVuc2lnbmVkIGxvbmcgaW9fZGF0YSA9IGh3LT5pb19iYXNlICsgNDsKIAotICAgIGUxMDAwX2lvX3dyaXRlKGh3LCBpb19hZGRyLCBvZmZzZXQpOwotICAgIGUxMDAwX2lvX3dyaXRlKGh3LCBpb19kYXRhLCB2YWx1ZSk7CisJZTEwMDBfaW9fd3JpdGUoaHcsIGlvX2FkZHIsIG9mZnNldCk7CisJZTEwMDBfaW9fd3JpdGUoaHcsIGlvX2RhdGEsIHZhbHVlKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXN0aW1hdGVzIHRoZSBjYWJsZSBsZW5ndGguCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqIG1pbl9sZW5ndGggLSBUaGUgZXN0aW1hdGVkIG1pbmltdW0gbGVuZ3RoCi0gKiBtYXhfbGVuZ3RoIC0gVGhlIGVzdGltYXRlZCBtYXhpbXVtIGxlbmd0aAorLyoqCisgKiBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoIC0gRXN0aW1hdGVzIHRoZSBjYWJsZSBsZW5ndGguCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQG1pbl9sZW5ndGg6IFRoZSBlc3RpbWF0ZWQgbWluaW11bSBsZW5ndGgKKyAqIEBtYXhfbGVuZ3RoOiBUaGUgZXN0aW1hdGVkIG1heGltdW0gbGVuZ3RoCiAgKgogICogcmV0dXJuczogLSBFMTAwMF9FUlJfWFhYCiAgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKQEAgLTY1MjgsMTg1ICs0ODQyLDExNSBAQAogICogU28gZm9yIE04OCBwaHkncywgdGhpcyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoZSBvbmUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUKICAqIHJlZ2lzdGVyIHRvIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHJhbmdlLgogICogRm9yIElHUCBwaHkncywgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHJhbmdlIGJ5IHRoZSBBR0MgcmVnaXN0ZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzdGF0aWMgczMyIGUxMDAwX2dldF9jYWJsZV9sZW5ndGgoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2ICptaW5fbGVuZ3RoLAogCQkJCSAgdTE2ICptYXhfbGVuZ3RoKQogewotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBhZ2NfdmFsdWUgPSAwOwotICAgIHUxNiBpLCBwaHlfZGF0YTsKLSAgICB1MTYgY2FibGVfbGVuZ3RoOworCXMzMiByZXRfdmFsOworCXUxNiBhZ2NfdmFsdWUgPSAwOworCXUxNiBpLCBwaHlfZGF0YTsKKwl1MTYgY2FibGVfbGVuZ3RoOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfY2FibGVfbGVuZ3RoIik7CisJREVCVUdGVU5DKCJlMTAwMF9nZXRfY2FibGVfbGVuZ3RoIik7CiAKLSAgICAqbWluX2xlbmd0aCA9ICptYXhfbGVuZ3RoID0gMDsKKwkqbWluX2xlbmd0aCA9ICptYXhfbGVuZ3RoID0gMDsKIAotICAgIC8qIFVzZSBvbGQgbWV0aG9kIGZvciBQaHkgb2xkZXIgdGhhbiBJR1AgKi8KLSAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKwkvKiBVc2Ugb2xkIG1ldGhvZCBmb3IgUGh5IG9sZGVyIHRoYW4gSUdQICovCisJaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CiAKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIGNhYmxlX2xlbmd0aCA9IChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIKSA+PgotICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVDsKKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAorCQkJCQkgICAgICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCWNhYmxlX2xlbmd0aCA9IChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIKSA+PgorCQkgICAgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQ7CiAKLSAgICAgICAgLyogQ29udmVydCB0aGUgZW51bSB2YWx1ZSB0byByYW5nZWQgdmFsdWVzICovCi0gICAgICAgIHN3aXRjaCAoY2FibGVfbGVuZ3RoKSB7Ci0gICAgICAgIGNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzUwOgotICAgICAgICAgICAgKm1pbl9sZW5ndGggPSAwOwotICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwOgotICAgICAgICAgICAgKm1pbl9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwOwotICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzgwXzExMDoKLSAgICAgICAgICAgICptaW5fbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF84MDsKLSAgICAgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfMTEwXzE0MDoKLSAgICAgICAgICAgICptaW5fbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTA7Ci0gICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzE0MDoKLSAgICAgICAgICAgICptaW5fbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNDA7Ci0gICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9nZzgyNTYzKSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIEdHODI1NjNfUEhZX0RTUF9ESVNUQU5DRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICBjYWJsZV9sZW5ndGggPSBwaHlfZGF0YSAmIEdHODI1NjNfRFNQRF9DQUJMRV9MRU5HVEg7CisJCS8qIENvbnZlcnQgdGhlIGVudW0gdmFsdWUgdG8gcmFuZ2VkIHZhbHVlcyAqLworCQlzd2l0Y2ggKGNhYmxlX2xlbmd0aCkgeworCQljYXNlIGUxMDAwX2NhYmxlX2xlbmd0aF81MDoKKwkJCSptaW5fbGVuZ3RoID0gMDsKKwkJCSptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MDsKKwkJCWJyZWFrOworCQljYXNlIGUxMDAwX2NhYmxlX2xlbmd0aF81MF84MDoKKwkJCSptaW5fbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MDsKKwkJCSptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF84MDsKKwkJCWJyZWFrOworCQljYXNlIGUxMDAwX2NhYmxlX2xlbmd0aF84MF8xMTA6CisJCQkqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfODA7CisJCQkqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTEwOworCQkJYnJlYWs7CisJCWNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzExMF8xNDA6CisJCQkqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTEwOworCQkJKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE0MDsKKwkJCWJyZWFrOworCQljYXNlIGUxMDAwX2NhYmxlX2xlbmd0aF8xNDA6CisJCQkqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwOworCQkJKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE3MDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CS8qIEZvciBJR1AgUEhZICovCisJCXUxNiBjdXJfYWdjX3ZhbHVlOworCQl1MTYgbWluX2FnY192YWx1ZSA9IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFOworCQl1MTYgYWdjX3JlZ19hcnJheVtJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTV0gPQorCQkgICAgeyBJR1AwMUUxMDAwX1BIWV9BR0NfQSwKKwkJCUlHUDAxRTEwMDBfUEhZX0FHQ19CLAorCQkJSUdQMDFFMTAwMF9QSFlfQUdDX0MsCisJCQlJR1AwMUUxMDAwX1BIWV9BR0NfRAorCQl9OworCQkvKiBSZWFkIHRoZSBBR0MgcmVnaXN0ZXJzIGZvciBhbGwgY2hhbm5lbHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKIAotICAgICAgICBzd2l0Y2ggKGNhYmxlX2xlbmd0aCkgewotICAgICAgICBjYXNlIGUxMDAwX2dnX2NhYmxlX2xlbmd0aF82MDoKLSAgICAgICAgICAgICptaW5fbGVuZ3RoID0gMDsKLSAgICAgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF82MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGUxMDAwX2dnX2NhYmxlX2xlbmd0aF82MF8xMTU6Ci0gICAgICAgICAgICAqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNjA7Ci0gICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTE1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZTEwMDBfZ2dfY2FibGVfbGVuZ3RoXzExNV8xNTA6Ci0gICAgICAgICAgICAqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTE1OwotICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE1MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGUxMDAwX2dnX2NhYmxlX2xlbmd0aF8xNTA6Ci0gICAgICAgICAgICAqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTUwOwotICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7IC8qIEZvciBJR1AgUEhZICovCi0gICAgICAgIHUxNiBjdXJfYWdjX3ZhbHVlOwotICAgICAgICB1MTYgbWluX2FnY192YWx1ZSA9IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFOwotICAgICAgICB1MTYgYWdjX3JlZ19hcnJheVtJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0lHUDAxRTEwMDBfUEhZX0FHQ19BLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19CLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19DLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19EfTsKLSAgICAgICAgLyogUmVhZCB0aGUgQUdDIHJlZ2lzdGVycyBmb3IgYWxsIGNoYW5uZWxzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTTsgaSsrKSB7CisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIGFnY19yZWdfYXJyYXlbaV0sICZwaHlfZGF0YSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgYWdjX3JlZ19hcnJheVtpXSwgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkJY3VyX2FnY192YWx1ZSA9IHBoeV9kYXRhID4+IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVDsKIAotICAgICAgICAgICAgY3VyX2FnY192YWx1ZSA9IHBoeV9kYXRhID4+IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVDsKKwkJCS8qIFZhbHVlIGJvdW5kIGNoZWNrLiAqLworCQkJaWYgKChjdXJfYWdjX3ZhbHVlID49CisJCQkgICAgIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFIC0gMSkKKwkJCSAgICB8fCAoY3VyX2FnY192YWx1ZSA9PSAwKSkKKwkJCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CiAKLSAgICAgICAgICAgIC8qIFZhbHVlIGJvdW5kIGNoZWNrLiAqLwotICAgICAgICAgICAgaWYgKChjdXJfYWdjX3ZhbHVlID49IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFIC0gMSkgfHwKLSAgICAgICAgICAgICAgICAoY3VyX2FnY192YWx1ZSA9PSAwKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisJCQlhZ2NfdmFsdWUgKz0gY3VyX2FnY192YWx1ZTsKIAotICAgICAgICAgICAgYWdjX3ZhbHVlICs9IGN1cl9hZ2NfdmFsdWU7CisJCQkvKiBVcGRhdGUgbWluaW1hbCBBR0MgdmFsdWUuICovCisJCQlpZiAobWluX2FnY192YWx1ZSA+IGN1cl9hZ2NfdmFsdWUpCisJCQkJbWluX2FnY192YWx1ZSA9IGN1cl9hZ2NfdmFsdWU7CisJCX0KIAotICAgICAgICAgICAgLyogVXBkYXRlIG1pbmltYWwgQUdDIHZhbHVlLiAqLwotICAgICAgICAgICAgaWYgKG1pbl9hZ2NfdmFsdWUgPiBjdXJfYWdjX3ZhbHVlKQotICAgICAgICAgICAgICAgIG1pbl9hZ2NfdmFsdWUgPSBjdXJfYWdjX3ZhbHVlOwotICAgICAgICB9CisJCS8qIFJlbW92ZSB0aGUgbWluaW1hbCBBR0MgcmVzdWx0IGZvciBsZW5ndGggPCA1MG0gKi8KKwkJaWYgKGFnY192YWx1ZSA8CisJCSAgICBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTSAqIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApIHsKKwkJCWFnY192YWx1ZSAtPSBtaW5fYWdjX3ZhbHVlOwogCi0gICAgICAgIC8qIFJlbW92ZSB0aGUgbWluaW1hbCBBR0MgcmVzdWx0IGZvciBsZW5ndGggPCA1MG0gKi8KLSAgICAgICAgaWYgKGFnY192YWx1ZSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNICogZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkgewotICAgICAgICAgICAgYWdjX3ZhbHVlIC09IG1pbl9hZ2NfdmFsdWU7CisJCQkvKiBHZXQgdGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgMyBjaGFubmVscyAqLworCQkJYWdjX3ZhbHVlIC89IChJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTSAtIDEpOworCQl9IGVsc2UgeworCQkJLyogR2V0IHRoZSBhdmVyYWdlIGxlbmd0aCBvZiBhbGwgdGhlIDQgY2hhbm5lbHMuICovCisJCQlhZ2NfdmFsdWUgLz0gSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU07CisJCX0KIAotICAgICAgICAgICAgLyogR2V0IHRoZSBhdmVyYWdlIGxlbmd0aCBvZiB0aGUgcmVtYWluaW5nIDMgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgIGFnY192YWx1ZSAvPSAoSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU0gLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIEdldCB0aGUgYXZlcmFnZSBsZW5ndGggb2YgYWxsIHRoZSA0IGNoYW5uZWxzLiAqLwotICAgICAgICAgICAgYWdjX3ZhbHVlIC89IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOwotICAgICAgICB9CisJCS8qIFNldCB0aGUgcmFuZ2Ugb2YgdGhlIGNhbGN1bGF0ZWQgbGVuZ3RoLiAqLworCQkqbWluX2xlbmd0aCA9ICgoZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF90YWJsZVthZ2NfdmFsdWVdIC0KKwkJCQlJR1AwMUUxMDAwX0FHQ19SQU5HRSkgPiAwKSA/CisJCSAgICAoZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF90YWJsZVthZ2NfdmFsdWVdIC0KKwkJICAgICBJR1AwMUUxMDAwX0FHQ19SQU5HRSkgOiAwOworCQkqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfdGFibGVbYWdjX3ZhbHVlXSArCisJCSAgICBJR1AwMUUxMDAwX0FHQ19SQU5HRTsKKwl9CiAKLSAgICAgICAgLyogU2V0IHRoZSByYW5nZSBvZiB0aGUgY2FsY3VsYXRlZCBsZW5ndGguICovCi0gICAgICAgICptaW5fbGVuZ3RoID0gKChlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoX3RhYmxlW2FnY192YWx1ZV0gLQotICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0FHQ19SQU5HRSkgPiAwKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgIChlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoX3RhYmxlW2FnY192YWx1ZV0gLQotICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0FHQ19SQU5HRSkgOiAwOwotICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfdGFibGVbYWdjX3ZhbHVlXSArCi0gICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9BR0NfUkFOR0U7Ci0gICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8yIHx8Ci0gICAgICAgICAgICAgICBody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8zKSB7Ci0gICAgICAgIHUxNiBjdXJfYWdjX2luZGV4LCBtYXhfYWdjX2luZGV4ID0gMDsKLSAgICAgICAgdTE2IG1pbl9hZ2NfaW5kZXggPSBJR1AwMkUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRSAtIDE7Ci0gICAgICAgIHUxNiBhZ2NfcmVnX2FycmF5W0lHUDAyRTEwMDBfUEhZX0NIQU5ORUxfTlVNXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7SUdQMDJFMTAwMF9QSFlfQUdDX0EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDJFMTAwMF9QSFlfQUdDX0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDJFMTAwMF9QSFlfQUdDX0MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDJFMTAwMF9QSFlfQUdDX0R9OwotICAgICAgICAvKiBSZWFkIHRoZSBBR0MgcmVnaXN0ZXJzIGZvciBhbGwgY2hhbm5lbHMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IElHUDAyRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIGFnY19yZWdfYXJyYXlbaV0sICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICAgICAgLyogR2V0dGluZyBiaXRzIDE1OjksIHdoaWNoIHJlcHJlc2VudCB0aGUgY29tYmluYXRpb24gb2YgY291cnNlIGFuZAotICAgICAgICAgICAgICogZmluZSBnYWluIHZhbHVlcy4gIFRoZSByZXN1bHQgaXMgYSBudW1iZXIgdGhhdCBjYW4gYmUgcHV0IGludG8KLSAgICAgICAgICAgICAqIHRoZSBsb29rdXAgdGFibGUgdG8gb2J0YWluIHRoZSBhcHByb3hpbWF0ZSBjYWJsZSBsZW5ndGguICovCi0gICAgICAgICAgICBjdXJfYWdjX2luZGV4ID0gKHBoeV9kYXRhID4+IElHUDAyRTEwMDBfQUdDX0xFTkdUSF9TSElGVCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAyRTEwMDBfQUdDX0xFTkdUSF9NQVNLOwotCi0gICAgICAgICAgICAvKiBBcnJheSBpbmRleCBib3VuZCBjaGVjay4gKi8KLSAgICAgICAgICAgIGlmICgoY3VyX2FnY19pbmRleCA+PSBJR1AwMkUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRSkgfHwKLSAgICAgICAgICAgICAgICAoY3VyX2FnY19pbmRleCA9PSAwKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7Ci0KLSAgICAgICAgICAgIC8qIFJlbW92ZSBtaW4gJiBtYXggQUdDIHZhbHVlcyBmcm9tIGNhbGN1bGF0aW9uLiAqLwotICAgICAgICAgICAgaWYgKGUxMDAwX2lncF8yX2NhYmxlX2xlbmd0aF90YWJsZVttaW5fYWdjX2luZGV4XSA+Ci0gICAgICAgICAgICAgICAgZTEwMDBfaWdwXzJfY2FibGVfbGVuZ3RoX3RhYmxlW2N1cl9hZ2NfaW5kZXhdKQotICAgICAgICAgICAgICAgIG1pbl9hZ2NfaW5kZXggPSBjdXJfYWdjX2luZGV4OwotICAgICAgICAgICAgaWYgKGUxMDAwX2lncF8yX2NhYmxlX2xlbmd0aF90YWJsZVttYXhfYWdjX2luZGV4XSA8Ci0gICAgICAgICAgICAgICAgZTEwMDBfaWdwXzJfY2FibGVfbGVuZ3RoX3RhYmxlW2N1cl9hZ2NfaW5kZXhdKQotICAgICAgICAgICAgICAgIG1heF9hZ2NfaW5kZXggPSBjdXJfYWdjX2luZGV4OwotCi0gICAgICAgICAgICBhZ2NfdmFsdWUgKz0gZTEwMDBfaWdwXzJfY2FibGVfbGVuZ3RoX3RhYmxlW2N1cl9hZ2NfaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgYWdjX3ZhbHVlIC09IChlMTAwMF9pZ3BfMl9jYWJsZV9sZW5ndGhfdGFibGVbbWluX2FnY19pbmRleF0gKwotICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2lncF8yX2NhYmxlX2xlbmd0aF90YWJsZVttYXhfYWdjX2luZGV4XSk7Ci0gICAgICAgIGFnY192YWx1ZSAvPSAoSUdQMDJFMTAwMF9QSFlfQ0hBTk5FTF9OVU0gLSAyKTsKLQotICAgICAgICAvKiBDYWxjdWxhdGUgY2FibGUgbGVuZ3RoIHdpdGggdGhlIGVycm9yIHJhbmdlIG9mICsvLSAxMCBtZXRlcnMuICovCi0gICAgICAgICptaW5fbGVuZ3RoID0gKChhZ2NfdmFsdWUgLSBJR1AwMkUxMDAwX0FHQ19SQU5HRSkgPiAwKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgIChhZ2NfdmFsdWUgLSBJR1AwMkUxMDAwX0FHQ19SQU5HRSkgOiAwOwotICAgICAgICAqbWF4X2xlbmd0aCA9IGFnY192YWx1ZSArIElHUDAyRTEwMDBfQUdDX1JBTkdFOwotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGVjayB0aGUgY2FibGUgcG9sYXJpdHkKLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogcG9sYXJpdHkgLSBvdXRwdXQgcGFyYW1ldGVyIDogMCAtIFBvbGFyaXR5IGlzIG5vdCByZXZlcnNlZAorLyoqCisgKiBlMTAwMF9jaGVja19wb2xhcml0eSAtIENoZWNrIHRoZSBjYWJsZSBwb2xhcml0eQorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIEBwb2xhcml0eTogb3V0cHV0IHBhcmFtZXRlciA6IDAgLSBQb2xhcml0eSBpcyBub3QgcmV2ZXJzZWQKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBQb2xhcml0eSBpcyByZXZlcnNlZC4KICAqCiAgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9YWFgKQEAgLTY3MTcsNzMgKzQ5NjEsNjUgQEAKICAqIDEwIE1icHMuICBJZiB0aGUgbGluayBzcGVlZCBpcyAxMDAgTWJwcyB0aGVyZSBpcyBubyBwb2xhcml0eSBzbyB0aGlzIGJpdCB3aWxsCiAgKiByZXR1cm4gMC4gIElmIHRoZSBsaW5rIHNwZWVkIGlzIDEwMDAgTWJwcyB0aGUgcG9sYXJpdHkgc3RhdHVzIGlzIGluIHRoZQogICogSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzdGF0aWMgczMyIGUxMDAwX2NoZWNrX3BvbGFyaXR5KHN0cnVjdCBlMTAwMF9odyAqaHcsCiAJCQkJZTEwMDBfcmV2X3BvbGFyaXR5ICpwb2xhcml0eSkKIHsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICB1MTYgcGh5X2RhdGE7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9kYXRhOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9jaGVja19wb2xhcml0eSIpOworCURFQlVHRlVOQygiZTEwMDBfY2hlY2tfcG9sYXJpdHkiKTsKIAotICAgIGlmICgoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHx8Ci0gICAgICAgIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpKSB7Ci0gICAgICAgIC8qIHJldHVybiB0aGUgUG9sYXJpdHkgYml0IGluIHRoZSBTdGF0dXMgcmVnaXN0ZXIuICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAqcG9sYXJpdHkgPSAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFkpID4+Ci0gICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX1JFVl9QT0xBUklUWV9TSElGVCkgPwotICAgICAgICAgICAgICAgICAgICAgZTEwMDBfcmV2X3BvbGFyaXR5X3JldmVyc2VkIDogZTEwMDBfcmV2X3BvbGFyaXR5X25vcm1hbDsKKwlpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKwkJLyogcmV0dXJuIHRoZSBQb2xhcml0eSBiaXQgaW4gdGhlIFN0YXR1cyByZWdpc3Rlci4gKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAorCQkJCQkgICAgICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCSpwb2xhcml0eSA9ICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1JFVl9QT0xBUklUWSkgPj4KKwkJCSAgICAgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFlfU0hJRlQpID8KKwkJICAgIGUxMDAwX3Jldl9wb2xhcml0eV9yZXZlcnNlZCA6IGUxMDAwX3Jldl9wb2xhcml0eV9ub3JtYWw7CiAKLSAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8Ci0gICAgICAgICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzMgfHwKLSAgICAgICAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMikgewotICAgICAgICAvKiBSZWFkIHRoZSBTdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHNwZWVkICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworCQkvKiBSZWFkIHRoZSBTdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHNwZWVkICovCisJCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTLAorCQkJCQkgICAgICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgLyogSWYgc3BlZWQgaXMgMTAwMCBNYnBzLCBtdXN0IHJlYWQgdGhlIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRyB0bwotICAgICAgICAgKiBmaW5kIHRoZSBwb2xhcml0eSBzdGF0dXMgKi8KLSAgICAgICAgaWYgKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQotICAgICAgICAgICBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwME1CUFMpIHsKKwkJLyogSWYgc3BlZWQgaXMgMTAwMCBNYnBzLCBtdXN0IHJlYWQgdGhlIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRyB0bworCQkgKiBmaW5kIHRoZSBwb2xhcml0eSBzdGF0dXMgKi8KKwkJaWYgKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQorCQkgICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTKSB7CiAKLSAgICAgICAgICAgIC8qIFJlYWQgdGhlIEdJRyBpbml0aWFsaXphdGlvbiBQQ1MgcmVnaXN0ZXIgKDB4MDBCNCkgKi8KLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkJLyogUmVhZCB0aGUgR0lHIGluaXRpYWxpemF0aW9uIFBDUyByZWdpc3RlciAoMHgwMEI0KSAqLworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QQ1NfSU5JVF9SRUcsCisJCQkJCSAgICAgICAmcGh5X2RhdGEpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgICAgIC8qIENoZWNrIHRoZSBwb2xhcml0eSBiaXRzICovCi0gICAgICAgICAgICAqcG9sYXJpdHkgPSAocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BIWV9QT0xBUklUWV9NQVNLKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfcmV2X3BvbGFyaXR5X3JldmVyc2VkIDogZTEwMDBfcmV2X3BvbGFyaXR5X25vcm1hbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIEZvciAxMCBNYnBzLCByZWFkIHRoZSBwb2xhcml0eSBiaXQgaW4gdGhlIHN0YXR1cyByZWdpc3Rlci4gKGZvcgotICAgICAgICAgICAgICogMTAwIE1icHMgdGhpcyBiaXQgaXMgYWx3YXlzIDApICovCi0gICAgICAgICAgICAqcG9sYXJpdHkgPSAocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfUE9MQVJJVFlfUkVWRVJTRUQpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9yZXZfcG9sYXJpdHlfcmV2ZXJzZWQgOiBlMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lmZSkgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJRkVfUEhZX0VYVEVOREVEX1NUQVRVU19DT05UUk9MLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICpwb2xhcml0eSA9ICgocGh5X2RhdGEgJiBJRkVfUEVTQ19QT0xBUklUWV9SRVZFUlNFRCkgPj4KLSAgICAgICAgICAgICAgICAgICAgIElGRV9QRVNDX1BPTEFSSVRZX1JFVkVSU0VEX1NISUZUKSA/Ci0gICAgICAgICAgICAgICAgICAgICBlMTAwMF9yZXZfcG9sYXJpdHlfcmV2ZXJzZWQgOiBlMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsOwotICAgIH0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJCS8qIENoZWNrIHRoZSBwb2xhcml0eSBiaXRzICovCisJCQkqcG9sYXJpdHkgPSAocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BIWV9QT0xBUklUWV9NQVNLKSA/CisJCQkgICAgZTEwMDBfcmV2X3BvbGFyaXR5X3JldmVyc2VkIDoKKwkJCSAgICBlMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsOworCQl9IGVsc2UgeworCQkJLyogRm9yIDEwIE1icHMsIHJlYWQgdGhlIHBvbGFyaXR5IGJpdCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyLiAoZm9yCisJCQkgKiAxMDAgTWJwcyB0aGlzIGJpdCBpcyBhbHdheXMgMCkgKi8KKwkJCSpwb2xhcml0eSA9CisJCQkgICAgKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1BPTEFSSVRZX1JFVkVSU0VEKSA/CisJCQkgICAgZTEwMDBfcmV2X3BvbGFyaXR5X3JldmVyc2VkIDoKKwkJCSAgICBlMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsOworCQl9CisJfQorCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGVjayBpZiBEb3duc2hpZnQgb2NjdXJlZAotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiBkb3duc2hpZnQgLSBvdXRwdXQgcGFyYW1ldGVyIDogMCAtIE5vIERvd25zaGlmdCBvY3VyZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIERvd25zaGlmdCBvY3VyZWQuCisvKioKKyAqIGUxMDAwX2NoZWNrX2Rvd25zaGlmdCAtIENoZWNrIGlmIERvd25zaGlmdCBvY2N1cnJlZAorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIEBkb3duc2hpZnQ6IG91dHB1dCBwYXJhbWV0ZXIgOiAwIC0gTm8gRG93bnNoaWZ0IG9jY3VycmVkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBEb3duc2hpZnQgb2NjdXJyZWQuCiAgKgogICogcmV0dXJuczogLSBFMTAwMF9FUlJfWFhYCiAgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKQEAgLTY3OTIsMjA0MSArNTAyOCw2MDcgQEAKICAqIFNwZWNpZmljIFN0YXR1cyByZWdpc3Rlci4gIEZvciBJR1AgcGh5J3MsIGl0IHJlYWRzIHRoZSBEb3duZ3JhZGUgYml0IGluIHRoZQogICogTGluayBIZWFsdGggcmVnaXN0ZXIuICBJbiBJR1AgdGhpcyBiaXQgaXMgbGF0Y2hlZCBoaWdoLCBzbyB0aGUgZHJpdmVyIG11c3QKICAqIHJlYWQgaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgbGluayBpcyBlc3RhYmxpc2hlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogc3RhdGljIHMzMiBlMTAwMF9jaGVja19kb3duc2hpZnQoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICBzMzIgcmV0X3ZhbDsKLSAgICB1MTYgcGh5X2RhdGE7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9kYXRhOwogCi0gICAgREVCVUdGVU5DKCJlMTAwMF9jaGVja19kb3duc2hpZnQiKTsKKwlERUJVR0ZVTkMoImUxMDAwX2NoZWNrX2Rvd25zaGlmdCIpOwogCi0gICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwIHx8Ci0gICAgICAgIGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzMgfHwKLSAgICAgICAgaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMikgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9MSU5LX0hFQUxUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCWlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9MSU5LX0hFQUxUSCwKKwkJCQkJICAgICAmcGh5X2RhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgIGh3LT5zcGVlZF9kb3duZ3JhZGVkID0gKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QTEhSX1NTX0RPV05HUkFERSkgPyAxIDogMDsKLSAgICB9IGVsc2UgaWYgKChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgfHwKLSAgICAgICAgICAgICAgIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2dnODI1NjMpKSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQlody0+c3BlZWRfZG93bmdyYWRlZCA9CisJCSAgICAocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BMSFJfU1NfRE9XTkdSQURFKSA/IDEgOiAwOworCX0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAorCQkJCQkgICAgICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgaHctPnNwZWVkX2Rvd25ncmFkZWQgPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RPV05TSElGVCkgPj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX0RPV05TSElGVF9TSElGVDsKLSAgICB9IGVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7Ci0gICAgICAgIC8qIGUxMDAwX3BoeV9pZmUgc3VwcG9ydHMgMTAvMTAwIHNwZWVkIG9ubHkgKi8KLSAgICAgICAgaHctPnNwZWVkX2Rvd25ncmFkZWQgPSBmYWxzZTsKLSAgICB9CisJCWh3LT5zcGVlZF9kb3duZ3JhZGVkID0gKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9ET1dOU0hJRlQpID4+CisJCSAgICBNODhFMTAwMF9QU1NSX0RPV05TSElGVF9TSElGVDsKKwl9CiAKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioKKyAqIGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAbGlua191cDogd2FzIGxpbmsgdXAgYXQgdGhlIHRpbWUgdGhpcyB3YXMgY2FsbGVkCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfUEhZIGlmIGZhaWwgdG8gcmVhZC93cml0ZSB0aGUgUEhZCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCiAgKgogICogODI1NDFfcmV2XzIgJiA4MjU0N19yZXZfMiBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIGNvbmZpZ3VyZSB0aGUgRFNQIHdoZW4gYQogICogZ2lnYWJpdCBsaW5rIGlzIGFjaGlldmVkIHRvIGltcHJvdmUgbGluayBxdWFsaXR5LgotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCi0gKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9QSFkgaWYgZmFpbCB0byByZWFkL3dyaXRlIHRoZSBQSFkKLSAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBhdCBhbnkgb3RoZXIgY2FzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCiBzdGF0aWMgczMyIGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2Uoc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbCBsaW5rX3VwKQogewotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBwaHlfZGF0YSwgcGh5X3NhdmVkX2RhdGEsIHNwZWVkLCBkdXBsZXgsIGk7Ci0gICAgdTE2IGRzcF9yZWdfYXJyYXlbSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU1dID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7SUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0R9OwotICAgIHUxNiBtaW5fbGVuZ3RoLCBtYXhfbGVuZ3RoOworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfZGF0YSwgcGh5X3NhdmVkX2RhdGEsIHNwZWVkLCBkdXBsZXgsIGk7CisJdTE2IGRzcF9yZWdfYXJyYXlbSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU1dID0KKwkgICAgeyBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQSwKKwkJSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0IsCisJCUlHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9DLAorCQlJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fRAorCX07CisJdTE2IG1pbl9sZW5ndGgsIG1heF9sZW5ndGg7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UiKTsKKwlERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UiKTsKIAotICAgIGlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncCkKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJaWYgKGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwKQorCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIAotICAgIGlmIChsaW5rX3VwKSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKLSAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBnZXR0aW5nIGxpbmsgc3BlZWQgYW5kIGR1cGxleFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQorCWlmIChsaW5rX3VwKSB7CisJCXJldF92YWwgPSBlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKKwkJaWYgKHJldF92YWwpIHsKKwkJCURFQlVHT1VUKCJFcnJvciBnZXR0aW5nIGxpbmsgc3BlZWQgYW5kIGR1cGxleFxuIik7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQogCi0gICAgICAgIGlmIChzcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisJCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAwKSB7CiAKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKGh3LCAmbWluX2xlbmd0aCwgJm1heF9sZW5ndGgpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKGh3LCAmbWluX2xlbmd0aCwKKwkJCQkJCSAgICZtYXhfbGVuZ3RoKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgICAgICBpZiAoKGh3LT5kc3BfY29uZmlnX3N0YXRlID09IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZCkgJiYKLSAgICAgICAgICAgICAgICBtaW5fbGVuZ3RoID49IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApIHsKKwkJCWlmICgoaHctPmRzcF9jb25maWdfc3RhdGUgPT0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkKQorCQkJICAgICYmIG1pbl9sZW5ndGggPj0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkgewogCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgZHNwX3JlZ19hcnJheVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkJCWZvciAoaSA9IDA7IGkgPCBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTTsgaSsrKSB7CisJCQkJCXJldF92YWwgPQorCQkJCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LAorCQkJCQkJCSAgICAgICBkc3BfcmVnX2FycmF5W2ldLAorCQkJCQkJCSAgICAgICAmcGh5X2RhdGEpOworCQkJCQlpZiAocmV0X3ZhbCkKKwkJCQkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BIWV9FREFDX01VX0lOREVYOworCQkJCQlwaHlfZGF0YSAmPQorCQkJCQkgICAgfklHUDAxRTEwMDBfUEhZX0VEQUNfTVVfSU5ERVg7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIGRzcF9yZWdfYXJyYXlbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZDsKLSAgICAgICAgICAgIH0KKwkJCQkJcmV0X3ZhbCA9CisJCQkJCSAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LAorCQkJCQkJCQlkc3BfcmVnX2FycmF5CisJCQkJCQkJCVtpXSwgcGh5X2RhdGEpOworCQkJCQlpZiAocmV0X3ZhbCkKKwkJCQkJCXJldHVybiByZXRfdmFsOworCQkJCX0KKwkJCQlody0+ZHNwX2NvbmZpZ19zdGF0ZSA9CisJCQkJICAgIGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkOworCQkJfQogCi0gICAgICAgICAgICBpZiAoKGh3LT5mZmVfY29uZmlnX3N0YXRlID09IGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZCkgJiYKLSAgICAgICAgICAgICAgIChtaW5fbGVuZ3RoIDwgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkpIHsKKwkJCWlmICgoaHctPmZmZV9jb25maWdfc3RhdGUgPT0gZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkKQorCQkJICAgICYmIChtaW5fbGVuZ3RoIDwgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkpIHsKIAotICAgICAgICAgICAgICAgIHUxNiBmZmVfaWRsZV9lcnJfdGltZW91dCA9IEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzIwOwotICAgICAgICAgICAgICAgIHUzMiBpZGxlX2VycnMgPSAwOworCQkJCXUxNiBmZmVfaWRsZV9lcnJfdGltZW91dCA9CisJCQkJICAgIEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzIwOworCQkJCXUzMiBpZGxlX2VycnMgPSAwOwogCi0gICAgICAgICAgICAgICAgLyogY2xlYXIgcHJldmlvdXMgaWRsZSBlcnJvciBjb3VudHMgKi8KLSAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCQkJLyogY2xlYXIgcHJldmlvdXMgaWRsZSBlcnJvciBjb3VudHMgKi8KKwkJCQlyZXRfdmFsID0KKwkJCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLAorCQkJCQkJICAgICAgICZwaHlfZGF0YSk7CisJCQkJaWYgKHJldF92YWwpCisJCQkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZmZV9pZGxlX2Vycl90aW1lb3V0OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwMDApOwotICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCQkJZm9yIChpID0gMDsgaSA8IGZmZV9pZGxlX2Vycl90aW1lb3V0OyBpKyspIHsKKwkJCQkJdWRlbGF5KDEwMDApOworCQkJCQlyZXRfdmFsID0KKwkJCQkJICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywKKwkJCQkJCQkgICAgICAgUEhZXzEwMDBUX1NUQVRVUywKKwkJCQkJCQkgICAgICAgJnBoeV9kYXRhKTsKKwkJCQkJaWYgKHJldF92YWwpCisJCQkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgICAgICAgICBpZGxlX2VycnMgKz0gKHBoeV9kYXRhICYgU1JfMTAwMFRfSURMRV9FUlJPUl9DTlQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWRsZV9lcnJzID4gU1JfMTAwMFRfUEhZX0VYQ0VTU0lWRV9JRExFX0VSUl9DT1VOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaHctPmZmZV9jb25maWdfc3RhdGUgPSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZTsKKwkJCQkJaWRsZV9lcnJzICs9CisJCQkJCSAgICAocGh5X2RhdGEgJgorCQkJCQkgICAgIFNSXzEwMDBUX0lETEVfRVJST1JfQ05UKTsKKwkJCQkJaWYgKGlkbGVfZXJycyA+CisJCQkJCSAgICBTUl8xMDAwVF9QSFlfRVhDRVNTSVZFX0lETEVfRVJSX0NPVU5UKQorCQkJCQl7CisJCQkJCQlody0+ZmZlX2NvbmZpZ19zdGF0ZSA9CisJCQkJCQkgICAgZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0RTUF9GRkVfQ01fQ1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkJcmV0X3ZhbCA9CisJCQkJCQkgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKwkJCQkJCQkJCUlHUDAxRTEwMDBfUEhZX0RTUF9GRkUsCisJCQkJCQkJCQlJR1AwMUUxMDAwX1BIWV9EU1BfRkZFX0NNX0NQKTsKKwkJCQkJCWlmIChyZXRfdmFsKQorCQkJCQkJCXJldHVybiByZXRfdmFsOworCQkJCQkJYnJlYWs7CisJCQkJCX0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoaWRsZV9lcnJzKQotICAgICAgICAgICAgICAgICAgICAgICAgZmZlX2lkbGVfZXJyX3RpbWVvdXQgPSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8xMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGh3LT5kc3BfY29uZmlnX3N0YXRlID09IGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkKSB7Ci0gICAgICAgICAgICAvKiBTYXZlIG9mZiB0aGUgY3VycmVudCB2YWx1ZSBvZiByZWdpc3RlciAweDJGNUIgdG8gYmUgcmVzdG9yZWQgYXQKLSAgICAgICAgICAgICAqIHRoZSBlbmQgb2YgdGhlIHJvdXRpbmVzLiAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgMHgyRjVCLCAmcGh5X3NhdmVkX2RhdGEpOworCQkJCQlpZiAoaWRsZV9lcnJzKQorCQkJCQkJZmZlX2lkbGVfZXJyX3RpbWVvdXQgPQorCQkJCQkJICAgIEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzEwMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaHctPmRzcF9jb25maWdfc3RhdGUgPT0gZTEwMDBfZHNwX2NvbmZpZ19hY3RpdmF0ZWQpIHsKKwkJCS8qIFNhdmUgb2ZmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHJlZ2lzdGVyIDB4MkY1QiB0byBiZSByZXN0b3JlZCBhdAorCQkJICogdGhlIGVuZCBvZiB0aGUgcm91dGluZXMuICovCisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIDB4MkY1QiwgJnBoeV9zYXZlZF9kYXRhKTsKIAotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgUEhZIHRyYW5zbWl0dGVyICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCAweDAwMDMpOworCQkJLyogRGlzYWJsZSB0aGUgUEhZIHRyYW5zbWl0dGVyICovCisJCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCAweDAwMDMpOwogCi0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgICAgICBtZGVsYXkoMjApOworCQkJbWRlbGF5KDIwKTsKIAotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBkc3BfcmVnX2FycmF5W2ldLCAmcGh5X2RhdGEpOwotICAgICAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkJCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsCisJCQkJCQkgICAgICBJR1AwMUUxMDAwX0lFRUVfRk9SQ0VfR0lHQSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCWZvciAoaSA9IDA7IGkgPCBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTTsgaSsrKSB7CisJCQkJcmV0X3ZhbCA9CisJCQkJICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgZHNwX3JlZ19hcnJheVtpXSwKKwkJCQkJCSAgICAgICAmcGh5X2RhdGEpOworCQkJCWlmIChyZXRfdmFsKQorCQkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BIWV9FREFDX01VX0lOREVYOwotICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9ICBJR1AwMUUxMDAwX1BIWV9FREFDX1NJR05fRVhUXzlfQklUUzsKKwkJCQlwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QSFlfRURBQ19NVV9JTkRFWDsKKwkJCQlwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BIWV9FREFDX1NJR05fRVhUXzlfQklUUzsKIAotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LGRzcF9yZWdfYXJyYXlbaV0sIHBoeV9kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9CisJCQkJcmV0X3ZhbCA9CisJCQkJICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIGRzcF9yZWdfYXJyYXlbaV0sCisJCQkJCQkJcGh5X2RhdGEpOworCQkJCWlmIChyZXRfdmFsKQorCQkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCX0KIAotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfSUVFRV9SRVNUQVJUX0FVVE9ORUcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAorCQkJCQkJICAgICAgSUdQMDFFMTAwMF9JRUVFX1JFU1RBUlRfQVVUT05FRyk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgbWRlbGF5KDIwKTsKKwkJCW1kZWxheSgyMCk7CiAKLSAgICAgICAgICAgIC8qIE5vdyBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CisJCQkvKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CiAKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOwotICAgICAgICB9CisJCQlody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZDsKKwkJfQogCi0gICAgICAgIGlmIChody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSkgewotICAgICAgICAgICAgLyogU2F2ZSBvZmYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmVnaXN0ZXIgMHgyRjVCIHRvIGJlIHJlc3RvcmVkIGF0Ci0gICAgICAgICAgICAgKiB0aGUgZW5kIG9mIHRoZSByb3V0aW5lcy4gKi8KLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIDB4MkY1QiwgJnBoeV9zYXZlZF9kYXRhKTsKKwkJaWYgKGh3LT5mZmVfY29uZmlnX3N0YXRlID09IGUxMDAwX2ZmZV9jb25maWdfYWN0aXZlKSB7CisJCQkvKiBTYXZlIG9mZiB0aGUgY3VycmVudCB2YWx1ZSBvZiByZWdpc3RlciAweDJGNUIgdG8gYmUgcmVzdG9yZWQgYXQKKwkJCSAqIHRoZSBlbmQgb2YgdGhlIHJvdXRpbmVzLiAqLworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCAweDJGNUIsICZwaHlfc2F2ZWRfZGF0YSk7CiAKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIFBIWSB0cmFuc21pdHRlciAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MkY1QiwgMHgwMDAzKTsKKwkJCS8qIERpc2FibGUgdGhlIFBIWSB0cmFuc21pdHRlciAqLworCQkJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MkY1QiwgMHgwMDAzKTsKIAotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgbWRlbGF5KDIwKTsKKwkJCW1kZWxheSgyMCk7CiAKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0lFRUVfRk9SQ0VfR0lHQSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRV9ERUZBVUxUKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKKwkJCQkJCSAgICAgIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRSwKKwkJCQkJCUlHUDAxRTEwMDBfUEhZX0RTUF9GRkVfREVGQVVMVCk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfSUVFRV9SRVNUQVJUX0FVVE9ORUcpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAorCQkJCQkJICAgICAgSUdQMDFFMTAwMF9JRUVFX1JFU1RBUlRfQVVUT05FRyk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgbWRlbGF5KDIwKTsKKwkJCW1kZWxheSgyMCk7CiAKLSAgICAgICAgICAgIC8qIE5vdyBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCi0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CisJCQkvKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CiAKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgICAgIGh3LT5mZmVfY29uZmlnX3N0YXRlID0gZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCQkJaHctPmZmZV9jb25maWdfc3RhdGUgPSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQ7CisJCX0KKwl9CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2V0IFBIWSB0byBjbGFzcyBBIG1vZGUKKy8qKgorICogZTEwMDBfc2V0X3BoeV9tb2RlIC0gU2V0IFBIWSB0byBjbGFzcyBBIG1vZGUKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgogICogQXNzdW1lcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgd2lsbCBmb2xsb3cgdG8gZW5hYmxlIHRoZSBuZXcgY2xhc3MgbW9kZS4KICAqICAxLiBEbyBhIFBIWSBzb2Z0IHJlc2V0CiAgKiAgMi4gUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIG9yIGZvcmNlIGxpbmsuCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzdGF0aWMgczMyIGUxMDAwX3NldF9waHlfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBlZXByb21fZGF0YTsKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgZWVwcm9tX2RhdGE7CiAKLSAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9waHlfbW9kZSIpOworCURFQlVHRlVOQygiZTEwMDBfc2V0X3BoeV9tb2RlIik7CiAKLSAgICBpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NV9yZXZfMykgJiYKLSAgICAgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSkgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9QSFlfQ0xBU1NfV09SRCwgMSwgJmVlcHJvbV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9CisJaWYgKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDVfcmV2XzMpICYmCisJICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikpIHsKKwkJcmV0X3ZhbCA9CisJCSAgICBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX1BIWV9DTEFTU19XT1JELCAxLAorCQkJCSAgICAgICZlZXByb21fZGF0YSk7CisJCWlmIChyZXRfdmFsKSB7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQogCi0gICAgICAgIGlmICgoZWVwcm9tX2RhdGEgIT0gRUVQUk9NX1JFU0VSVkVEX1dPUkQpICYmCi0gICAgICAgICAgICAoZWVwcm9tX2RhdGEgJiBFRVBST01fUEhZX0NMQVNTX0EpKSB7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMEIpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweDgxMDQpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCWlmICgoZWVwcm9tX2RhdGEgIT0gRUVQUk9NX1JFU0VSVkVEX1dPUkQpICYmCisJCSAgICAoZWVwcm9tX2RhdGEgJiBFRVBST01fUEhZX0NMQVNTX0EpKSB7CisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCisJCQkJCQkweDAwMEIpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsCisJCQkJCQkweDgxMDQpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgICAgIGh3LT5waHlfcmVzZXRfZGlzYWJsZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQorCQkJaHctPnBoeV9yZXNldF9kaXNhYmxlID0gZmFsc2U7CisJCX0KKwl9CiAKLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioKKyAqIGUxMDAwX3NldF9kM19scGx1X3N0YXRlIC0gc2V0IGQzIGxpbmsgcG93ZXIgc3RhdGUKKyAqIEBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBAYWN0aXZlOiB0cnVlIHRvIGVuYWJsZSBscGx1IGZhbHNlIHRvIGRpc2FibGUgbHBsdS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGxwbHUgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBhY3RpdmUgZmxhZy4gIFdoZW4KICAqIGFjdGl2YXRpbmcgbHBsdSB0aGlzIGZ1bmN0aW9uIGFsc28gZGlzYWJsZXMgc21hcnQgc3BlZWQgYW5kIHZpc2UgdmVyc2EuCi0gKiBscGx1IHdpbGwgbm90IGJlIGFjdGl2YXRlZCB1bmxlc3MgdGhlIGRldmljZSBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNtZW50CisgKiBscGx1IHdpbGwgbm90IGJlIGFjdGl2YXRlZCB1bmxlc3MgdGhlIGRldmljZSBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudAogICogbWVldHMgc3RhbmRhcmRzIG9mIGVpdGhlciAxMCBvciAxMC8xMDAgb3IgMTAvMTAwLzEwMDAgYXQgYWxsIGR1cGxleGVzLgotICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogYWN0aXZlIC0gdHJ1ZSB0byBlbmFibGUgbHBsdSBmYWxzZSB0byBkaXNhYmxlIGxwbHUuCiAgKgogICogcmV0dXJuczogLSBFMTAwMF9FUlJfUEhZIGlmIGZhaWwgdG8gcmVhZC93cml0ZSB0aGUgUEhZCiAgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyAqLwogc3RhdGljIHMzMiBlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGFjdGl2ZSkKIHsKLSAgICB1MzIgcGh5X2N0cmwgPSAwOwotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBwaHlfZGF0YTsKLSAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9kM19scGx1X3N0YXRlIik7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9kYXRhOworCURFQlVHRlVOQygiZTEwMDBfc2V0X2QzX2xwbHVfc3RhdGUiKTsKIAotICAgIGlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncCAmJiBody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncF8yCi0gICAgICAgICYmIGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwXzMpCi0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCWlmIChody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncCkKKwkJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiAKLSAgICAvKiBEdXJpbmcgZHJpdmVyIGFjdGl2aXR5IExQTFUgc2hvdWxkIG5vdCBiZSB1c2VkIG9yIGl0IHdpbGwgYXR0YWluIGxpbmsKLSAgICAgKiBmcm9tIHRoZSBsb3dlc3Qgc3BlZWRzIHN0YXJ0aW5nIGZyb20gMTBNYnBzLiBUaGUgY2FwYWJpbGl0eSBpcyB1c2VkIGZvcgotICAgICAqIER4IHRyYW5zaXRpb25zIGFuZCBzdGF0ZXMgKi8KLSAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9IGVsc2UgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgIC8qIE1BQyB3cml0ZXMgaW50byBQSFkgcmVnaXN0ZXIgYmFzZWQgb24gdGhlIHN0YXRlIHRyYW5zaXRpb24KLSAgICAgICAgICogYW5kIHN0YXJ0IGF1dG8tbmVnb3RpYXRpb24uIFNXIGRyaXZlciBjYW4gb3ZlcndyaXRlIHRoZSBzZXR0aW5ncwotICAgICAgICAgKiBpbiBDU1IgUEhZIHBvd2VyIGNvbnRyb2wgRTEwMDBfUEhZX0NUUkwgcmVnaXN0ZXIuICovCi0gICAgICAgIHBoeV9jdHJsID0gZXIzMihQSFlfQ1RSTCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICB9CisJLyogRHVyaW5nIGRyaXZlciBhY3Rpdml0eSBMUExVIHNob3VsZCBub3QgYmUgdXNlZCBvciBpdCB3aWxsIGF0dGFpbiBsaW5rCisJICogZnJvbSB0aGUgbG93ZXN0IHNwZWVkcyBzdGFydGluZyBmcm9tIDEwTWJwcy4gVGhlIGNhcGFiaWxpdHkgaXMgdXNlZCBmb3IKKwkgKiBEeCB0cmFuc2l0aW9ucyBhbmQgc3RhdGVzICovCisJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMgorCSAgICB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKwkJcmV0X3ZhbCA9CisJCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLCAmcGh5X2RhdGEpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCX0KIAotICAgIGlmICghYWN0aXZlKSB7Ci0gICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwKLSAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgewotICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfR01JSV9GTEVYX1NQRDsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pIHsKLSAgICAgICAgICAgICAgICBwaHlfY3RybCAmPSB+RTEwMDBfUEhZX0NUUkxfTk9ORDBBX0xQTFU7Ci0gICAgICAgICAgICAgICAgZXczMihQSFlfQ1RSTCwgcGh5X2N0cmwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDJFMTAwMF9QTV9EM19MUExVOwotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMkUxMDAwX1BIWV9QT1dFUl9NR01ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwlpZiAoIWFjdGl2ZSkgeworCQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8CisJCSAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKwkJCXBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX0dNSUlfRkxFWF9TUEQ7CisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywKKwkJCQkJCXBoeV9kYXRhKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCQl9CiAKLSAgICAgICAgLyogTFBMVSBhbmQgU21hcnRTcGVlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgTFBMVSBpcyB1c2VkIGR1cmluZwotICAgICAgICAgKiBEeCBzdGF0ZXMgd2hlcmUgdGhlIHBvd2VyIGNvbnNlcnZhdGlvbiBpcyBtb3N0IGltcG9ydGFudC4gIER1cmluZwotICAgICAgICAgKiBkcml2ZXIgYWN0aXZpdHkgd2Ugc2hvdWxkIGVuYWJsZSBTbWFydFNwZWVkLCBzbyBwZXJmb3JtYW5jZSBpcwotICAgICAgICAgKiBtYWludGFpbmVkLiAqLwotICAgICAgICBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29uKSB7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkvKiBMUExVIGFuZCBTbWFydFNwZWVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBMUExVIGlzIHVzZWQgZHVyaW5nCisJCSAqIER4IHN0YXRlcyB3aGVyZSB0aGUgcG93ZXIgY29uc2VydmF0aW9uIGlzIG1vc3QgaW1wb3J0YW50LiAgRHVyaW5nCisJCSAqIGRyaXZlciBhY3Rpdml0eSB3ZSBzaG91bGQgZW5hYmxlIFNtYXJ0U3BlZWQsIHNvIHBlcmZvcm1hbmNlIGlzCisJCSAqIG1haW50YWluZWQuICovCisJCWlmIChody0+c21hcnRfc3BlZWQgPT0gZTEwMDBfc21hcnRfc3BlZWRfb24pIHsKKwkJCXJldF92YWwgPQorCQkJICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisJCQkJCSAgICAgICAmcGh5X2RhdGEpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfSBlbHNlIGlmIChody0+c21hcnRfc3BlZWQgPT0gZTEwMDBfc21hcnRfc3BlZWRfb2ZmKSB7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQkJcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKKwkJCXJldF92YWwgPQorCQkJICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorCQkJCQkJcGh5X2RhdGEpOworCQkJaWYgKHJldF92YWwpCisJCQkJcmV0dXJuIHJldF92YWw7CisJCX0gZWxzZSBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29mZikgeworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKwkJCQkJICAgICAgICZwaHlfZGF0YSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQorCQkJcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisJCQlyZXRfdmFsID0KKwkJCSAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKwkJCQkJCXBoeV9kYXRhKTsKKwkJCWlmIChyZXRfdmFsKQorCQkJCXJldHVybiByZXRfdmFsOworCQl9CisJfSBlbHNlIGlmICgoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUKQorCQkgICB8fCAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBVVRPTkVHX0FEVkVSVElTRV8xMF9BTEwpCisJCSAgIHx8IChody0+YXV0b25lZ19hZHZlcnRpc2VkID09CisJCSAgICAgICBBVVRPTkVHX0FEVkVSVElTRV8xMF8xMDBfQUxMKSkgewogCi0gICAgfSBlbHNlIGlmICgoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUKSB8fAotICAgICAgICAgICAgICAgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQVVUT05FR19BRFZFUlRJU0VfMTBfQUxMICkgfHwKLSAgICAgICAgICAgICAgIChody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFVVE9ORUdfQURWRVJUSVNFXzEwXzEwMF9BTEwpKSB7CisJCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwKKwkJICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgeworCQkJcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEOworCQkJcmV0X3ZhbCA9CisJCQkgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCisJCQkJCQlwaHlfZGF0YSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQogCi0gICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIgfHwKLSAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikgewotICAgICAgICAgICAgcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEOwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLCBwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgewotICAgICAgICAgICAgICAgIHBoeV9jdHJsIHw9IEUxMDAwX1BIWV9DVFJMX05PTkQwQV9MUExVOwotICAgICAgICAgICAgICAgIGV3MzIoUEhZX0NUUkwsIHBoeV9jdHJsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gSUdQMDJFMTAwMF9QTV9EM19MUExVOwotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMkUxMDAwX1BIWV9QT1dFUl9NR01ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJLyogV2hlbiBMUExVIGlzIGVuYWJsZWQgd2Ugc2hvdWxkIGRpc2FibGUgU21hcnRTcGVlZCAqLworCQlyZXRfdmFsID0KKwkJICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisJCQkJICAgICAgICZwaHlfZGF0YSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgLyogV2hlbiBMUExVIGlzIGVuYWJsZWQgd2Ugc2hvdWxkIGRpc2FibGUgU21hcnRTcGVlZCAqLwotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywgJnBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkJcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisJCXJldF92YWwgPQorCQkgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisJCQkJCXBoeV9kYXRhKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLCBwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisJfQorCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKgorICogZTEwMDBfc2V0X3Zjb19zcGVlZAorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGxwbHUgZDAgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBhY3RpdmUgZmxhZy4gIFdoZW4KLSAqIGFjdGl2YXRpbmcgbHBsdSB0aGlzIGZ1bmN0aW9uIGFsc28gZGlzYWJsZXMgc21hcnQgc3BlZWQgYW5kIHZpc2UgdmVyc2EuCi0gKiBscGx1IHdpbGwgbm90IGJlIGFjdGl2YXRlZCB1bmxlc3MgdGhlIGRldmljZSBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNtZW50Ci0gKiBtZWV0cyBzdGFuZGFyZHMgb2YgZWl0aGVyIDEwIG9yIDEwLzEwMCBvciAxMC8xMDAvMTAwMCBhdCBhbGwgZHVwbGV4ZXMuCi0gKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKiBhY3RpdmUgLSB0cnVlIHRvIGVuYWJsZSBscGx1IGZhbHNlIHRvIGRpc2FibGUgbHBsdS4KLSAqCi0gKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9QSFkgaWYgZmFpbCB0byByZWFkL3dyaXRlIHRoZSBQSFkKLSAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBhdCBhbnkgb3RoZXIgY2FzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHMzMiBlMTAwMF9zZXRfZDBfbHBsdV9zdGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGFjdGl2ZSkKLXsKLSAgICB1MzIgcGh5X2N0cmwgPSAwOwotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBwaHlfZGF0YTsKLSAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9kMF9scGx1X3N0YXRlIik7Ci0KLSAgICBpZiAoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKQotICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLQotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgewotICAgICAgICBwaHlfY3RybCA9IGVyMzIoUEhZX0NUUkwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgfQotCi0gICAgaWYgKCFhY3RpdmUpIHsKLSAgICAgICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgICAgICBwaHlfY3RybCAmPSB+RTEwMDBfUEhZX0NUUkxfRDBBX0xQTFU7Ci0gICAgICAgICAgICBldzMyKFBIWV9DVFJMLCBwaHlfY3RybCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDJFMTAwMF9QTV9EMF9MUExVOwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsIHBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogTFBMVSBhbmQgU21hcnRTcGVlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgTFBMVSBpcyB1c2VkIGR1cmluZwotICAgICAgICAgKiBEeCBzdGF0ZXMgd2hlcmUgdGhlIHBvd2VyIGNvbnNlcnZhdGlvbiBpcyBtb3N0IGltcG9ydGFudC4gIER1cmluZwotICAgICAgICAgKiBkcml2ZXIgYWN0aXZpdHkgd2Ugc2hvdWxkIGVuYWJsZSBTbWFydFNwZWVkLCBzbyBwZXJmb3JtYW5jZSBpcwotICAgICAgICAgKiBtYWludGFpbmVkLiAqLwotICAgICAgICBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29uKSB7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0gZWxzZSBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29mZikgewotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQotCi0KLSAgICB9IGVsc2UgewotCi0gICAgICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgewotICAgICAgICAgICAgcGh5X2N0cmwgfD0gRTEwMDBfUEhZX0NUUkxfRDBBX0xQTFU7Ci0gICAgICAgICAgICBldzMyKFBIWV9DVFJMLCBwaHlfY3RybCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMkUxMDAwX1BNX0QwX0xQTFU7Ci0gICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgcGh5X2RhdGEpOwotICAgICAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXaGVuIExQTFUgaXMgZW5hYmxlZCB3ZSBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkICovCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLCAmcGh5X2RhdGEpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOwotCi0gICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOwotICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsIHBoeV9kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgIH0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQ2hhbmdlIFZDTyBzcGVlZCByZWdpc3RlciB0byBpbXByb3ZlIEJpdCBFcnJvciBSYXRlIHBlcmZvcm1hbmNlIG9mIFNFUkRFUy4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzdGF0aWMgczMyIGUxMDAwX3NldF92Y29fc3BlZWQoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICBzMzIgIHJldF92YWw7Ci0gICAgdTE2IGRlZmF1bHRfcGFnZSA9IDA7Ci0gICAgdTE2IHBoeV9kYXRhOworCXMzMiByZXRfdmFsOworCXUxNiBkZWZhdWx0X3BhZ2UgPSAwOworCXUxNiBwaHlfZGF0YTsKIAotICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X3Zjb19zcGVlZCIpOworCURFQlVHRlVOQygiZTEwMDBfc2V0X3Zjb19zcGVlZCIpOwogCi0gICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKLSAgICBjYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgotICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6Ci0gICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0gICAgfQorCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKwljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwl9CiAKLSAgICAvKiBTZXQgUEhZIHJlZ2lzdGVyIDMwLCBwYWdlIDUsIGJpdCA4IHRvIDAgKi8KKwkvKiBTZXQgUEhZIHJlZ2lzdGVyIDMwLCBwYWdlIDUsIGJpdCA4IHRvIDAgKi8KIAotICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJmRlZmF1bHRfcGFnZSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXJldF92YWwgPQorCSAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJmRlZmF1bHRfcGFnZSk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDA1KTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDA1KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsICZwaHlfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgJnBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUODsKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCBwaHlfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXBoeV9kYXRhICY9IH5NODhFMTAwMF9QSFlfVkNPX1JFR19CSVQ4OworCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIHBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAvKiBTZXQgUEhZIHJlZ2lzdGVyIDMwLCBwYWdlIDQsIGJpdCAxMSB0byAxICovCisJLyogU2V0IFBIWSByZWdpc3RlciAzMCwgcGFnZSA0LCBiaXQgMTEgdG8gMSAqLwogCi0gICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDA0KTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7CisJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDA0KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsICZwaHlfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgJnBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QSFlfVkNPX1JFR19CSVQxMTsKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCBwaHlfZGF0YSk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXBoeV9kYXRhIHw9IE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDExOworCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIHBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CiAKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCBkZWZhdWx0X3BhZ2UpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwlyZXRfdmFsID0KKwkgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCBkZWZhdWx0X3BhZ2UpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY29va2llIGZyb20gQVJDIHJhbS4KKy8qKgorICogZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUgLSBjaGVjayBmb3IgYm1jIHBhc3MgdGhyb3VnaAorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICAqCi0gKiByZXR1cm5zOiAtIEUxMDAwX1NVQ0NFU1MgLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgczMyIGUxMDAwX2hvc3RfaWZfcmVhZF9jb29raWUoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKmJ1ZmZlcikKLXsKLSAgICB1OCBpOwotICAgIHUzMiBvZmZzZXQgPSBFMTAwMF9NTkdfREhDUF9DT09LSUVfT0ZGU0VUOwotICAgIHU4IGxlbmd0aCA9IEUxMDAwX01OR19ESENQX0NPT0tJRV9MRU5HVEg7Ci0KLSAgICBsZW5ndGggPSAobGVuZ3RoID4+IDIpOwotICAgIG9mZnNldCA9IChvZmZzZXQgPj4gMik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgKigodTMyICopYnVmZmVyICsgaSkgPQotICAgICAgICAgICAgRTEwMDBfUkVBRF9SRUdfQVJSQVlfRFdPUkQoaHcsIEhPU1RfSUYsIG9mZnNldCArIGkpOwotICAgIH0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIEhPU1QgSUYgaXMgZW5hYmxlZCBmb3IgY29tbWFuZCBvcGVyYXRvbgotICogYW5kIGFsc28gY2hlY2tzIHdoZXRoZXIgdGhlIHByZXZpb3VzIGNvbW1hbmQgaXMgY29tcGxldGVkLgotICogSXQgYnVzeSB3YWl0cyBpbiBjYXNlIG9mIHByZXZpb3VzIGNvbW1hbmQgaXMgbm90IGNvbXBsZXRlZC4KLSAqCi0gKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9IT1NUX0lOVEVSRkFDRV9DT01NQU5EIGluIGNhc2UgaWYgaXMgbm90IHJlYWR5IG9yCi0gKiAgICAgICAgICAgIHRpbWVvdXQKLSAqICAgICAgICAgIC0gRTEwMDBfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9tbmdfZW5hYmxlX2hvc3RfaWYoc3RydWN0IGUxMDAwX2h3ICpodykKLXsKLSAgICB1MzIgaGljcjsKLSAgICB1OCBpOwotCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgaG9zdCBpbnRlcmZhY2UgaXMgZW5hYmxlZC4gKi8KLSAgICBoaWNyID0gZXIzMihISUNSKTsKLSAgICBpZiAoKGhpY3IgJiBFMTAwMF9ISUNSX0VOKSA9PSAwKSB7Ci0gICAgICAgIERFQlVHT1VUKCJFMTAwMF9IT1NUX0VOIGJpdCBkaXNhYmxlZC5cbiIpOwotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9IT1NUX0lOVEVSRkFDRV9DT01NQU5EOwotICAgIH0KLSAgICAvKiBjaGVjayB0aGUgcHJldmlvdXMgY29tbWFuZCBpcyBjb21wbGV0ZWQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgRTEwMDBfTU5HX0RIQ1BfQ09NTUFORF9USU1FT1VUOyBpKyspIHsKLSAgICAgICAgaGljciA9IGVyMzIoSElDUik7Ci0gICAgICAgIGlmICghKGhpY3IgJiBFMTAwMF9ISUNSX0MpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG1kZWxheSgxKTsKLSAgICB9Ci0KLSAgICBpZiAoaSA9PSBFMTAwMF9NTkdfREhDUF9DT01NQU5EX1RJTUVPVVQpIHsKLSAgICAgICAgREVCVUdPVVQoIlByZXZpb3VzIGNvbW1hbmQgdGltZW91dCBmYWlsZWQgLlxuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0hPU1RfSU5URVJGQUNFX0NPTU1BTkQ7Ci0gICAgfQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBidWZmZXIgY29udGVudCBhdCB0aGUgb2Zmc2V0IGdpdmVuIG9uIHRoZSBob3N0IGlmLgotICogSXQgYWxzbyBkb2VzIGFsaWdubWVudCBjb25zaWRlcmF0aW9ucyB0byBkbyB0aGUgd3JpdGVzIGluIG1vc3QgZWZmaWNpZW50IHdheS4KLSAqIEFsc28gZmlsbHMgdXAgdGhlIHN1bSBvZiB0aGUgYnVmZmVyIGluICpidWZmZXIgcGFyYW1ldGVyLgotICoKLSAqIHJldHVybnMgIC0gRTEwMDBfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9tbmdfaG9zdF9pZl93cml0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1OCAqYnVmZmVyLCB1MTYgbGVuZ3RoLAotCQkJCSAgIHUxNiBvZmZzZXQsIHU4ICpzdW0pCi17Ci0gICAgdTggKnRtcDsKLSAgICB1OCAqYnVmcHRyID0gYnVmZmVyOwotICAgIHUzMiBkYXRhID0gMDsKLSAgICB1MTYgcmVtYWluaW5nLCBpLCBqLCBwcmV2X2J5dGVzOwotCi0gICAgLyogc3VtID0gb25seSBzdW0gb2YgdGhlIGRhdGEgYW5kIGl0IGlzIG5vdCBjaGVja3N1bSAqLwotCi0gICAgaWYgKGxlbmd0aCA9PSAwIHx8IG9mZnNldCArIGxlbmd0aCA+IEUxMDAwX0hJX01BWF9NTkdfREFUQV9MRU5HVEgpIHsKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEFSQU07Ci0gICAgfQotCi0gICAgdG1wID0gKHU4ICopJmRhdGE7Ci0gICAgcHJldl9ieXRlcyA9IG9mZnNldCAmIDB4MzsKLSAgICBvZmZzZXQgJj0gMHhGRkZDOwotICAgIG9mZnNldCA+Pj0gMjsKLQotICAgIGlmIChwcmV2X2J5dGVzKSB7Ci0gICAgICAgIGRhdGEgPSBFMTAwMF9SRUFEX1JFR19BUlJBWV9EV09SRChodywgSE9TVF9JRiwgb2Zmc2V0KTsKLSAgICAgICAgZm9yIChqID0gcHJldl9ieXRlczsgaiA8IHNpemVvZih1MzIpOyBqKyspIHsKLSAgICAgICAgICAgICoodG1wICsgaikgPSAqYnVmcHRyKys7Ci0gICAgICAgICAgICAqc3VtICs9ICoodG1wICsgaik7Ci0gICAgICAgIH0KLSAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZX0RXT1JEKGh3LCBIT1NUX0lGLCBvZmZzZXQsIGRhdGEpOwotICAgICAgICBsZW5ndGggLT0gaiAtIHByZXZfYnl0ZXM7Ci0gICAgICAgIG9mZnNldCsrOwotICAgIH0KLQotICAgIHJlbWFpbmluZyA9IGxlbmd0aCAmIDB4MzsKLSAgICBsZW5ndGggLT0gcmVtYWluaW5nOwotCi0gICAgLyogQ2FsY3VsYXRlIGxlbmd0aCBpbiBEV09SRHMgKi8KLSAgICBsZW5ndGggPj49IDI7Ci0KLSAgICAvKiBUaGUgZGV2aWNlIGRyaXZlciB3cml0ZXMgdGhlIHJlbGV2YW50IGNvbW1hbmQgYmxvY2sgaW50byB0aGUKLSAgICAgKiByYW0gYXJlYS4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemVvZih1MzIpOyBqKyspIHsKLSAgICAgICAgICAgICoodG1wICsgaikgPSAqYnVmcHRyKys7Ci0gICAgICAgICAgICAqc3VtICs9ICoodG1wICsgaik7Ci0gICAgICAgIH0KLQotICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVlfRFdPUkQoaHcsIEhPU1RfSUYsIG9mZnNldCArIGksIGRhdGEpOwotICAgIH0KLSAgICBpZiAocmVtYWluaW5nKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplb2YodTMyKTsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoaiA8IHJlbWFpbmluZykKLSAgICAgICAgICAgICAgICAqKHRtcCArIGopID0gKmJ1ZnB0cisrOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICoodG1wICsgaikgPSAwOwotCi0gICAgICAgICAgICAqc3VtICs9ICoodG1wICsgaik7Ci0gICAgICAgIH0KLSAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZX0RXT1JEKGh3LCBIT1NUX0lGLCBvZmZzZXQgKyBpLCBkYXRhKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBjb21tYW5kIGhlYWRlciBhZnRlciBkb2VzIHRoZSBjaGVja3N1bSBjYWxjdWxhdGlvbi4KLSAqCi0gKiByZXR1cm5zICAtIEUxMDAwX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfbW5nX3dyaXRlX2NtZF9oZWFkZXIoc3RydWN0IGUxMDAwX2h3ICpodywKLQkJCQkgICAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIgKmhkcikKLXsKLSAgICB1MTYgaTsKLSAgICB1OCBzdW07Ci0gICAgdTggKmJ1ZmZlcjsKLQotICAgIC8qIFdyaXRlIHRoZSB3aG9sZSBjb21tYW5kIGhlYWRlciBzdHJ1Y3R1cmUgd2hpY2ggaW5jbHVkZXMgc3VtIG9mCi0gICAgICogdGhlIGJ1ZmZlciAqLwotCi0gICAgdTE2IGxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIpOwotCi0gICAgc3VtID0gaGRyLT5jaGVja3N1bTsKLSAgICBoZHItPmNoZWNrc3VtID0gMDsKLQotICAgIGJ1ZmZlciA9ICh1OCAqKWhkcjsKLSAgICBpID0gbGVuZ3RoOwotICAgIHdoaWxlIChpLS0pCi0gICAgICAgIHN1bSArPSBidWZmZXJbaV07Ci0KLSAgICBoZHItPmNoZWNrc3VtID0gMCAtIHN1bTsKLQotICAgIGxlbmd0aCA+Pj0gMjsKLSAgICAvKiBUaGUgZGV2aWNlIGRyaXZlciB3cml0ZXMgdGhlIHJlbGV2YW50IGNvbW1hbmQgYmxvY2sgaW50byB0aGUgcmFtIGFyZWEuICovCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWV9EV09SRChodywgSE9TVF9JRiwgaSwgKigodTMyICopaGRyICsgaSkpOwotICAgICAgICBFMTAwMF9XUklURV9GTFVTSCgpOwotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgdG8gQVJDIHRoYXQgYSBuZXcgY29tbWFuZCBpcyBwZW5kaW5nIHdoaWNoIGNvbXBsZXRlcwotICogb25lIHdyaXRlIG9wZXJhdGlvbiBieSB0aGUgZHJpdmVyLgotICoKLSAqIHJldHVybnMgIC0gRTEwMDBfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9tbmdfd3JpdGVfY29tbWl0KHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgdTMyIGhpY3I7Ci0KLSAgICBoaWNyID0gZXIzMihISUNSKTsKLSAgICAvKiBTZXR0aW5nIHRoaXMgYml0IHRlbGxzIHRoZSBBUkMgdGhhdCBhIG5ldyBjb21tYW5kIGlzIHBlbmRpbmcuICovCi0gICAgZXczMihISUNSLCBoaWNyIHwgRTEwMDBfSElDUl9DKTsKLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIG1vZGUgb2YgdGhlIGZpcm13YXJlLgotICoKLSAqIHJldHVybnMgIC0gdHJ1ZSB3aGVuIHRoZSBtb2RlIGlzIElBTVQgb3IgZmFsc2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZTEwMDBfY2hlY2tfbW5nX21vZGUoc3RydWN0IGUxMDAwX2h3ICpodykKLXsKLSAgICB1MzIgZndzbTsKLQotICAgIGZ3c20gPSBlcjMyKEZXU00pOwotCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgIGlmICgoZndzbSAmIEUxMDAwX0ZXU01fTU9ERV9NQVNLKSA9PQotICAgICAgICAgICAgKEUxMDAwX01OR19JQ0hfSUFNVF9NT0RFIDw8IEUxMDAwX0ZXU01fTU9ERV9TSElGVCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKChmd3NtICYgRTEwMDBfRldTTV9NT0RFX01BU0spID09Ci0gICAgICAgICAgICAgICAoRTEwMDBfTU5HX0lBTVRfTU9ERSA8PCBFMTAwMF9GV1NNX01PREVfU0hJRlQpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBkaGNwIGluZm8gLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zMzIgZTEwMDBfbW5nX3dyaXRlX2RoY3BfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1OCAqYnVmZmVyLCB1MTYgbGVuZ3RoKQotewotICAgIHMzMiByZXRfdmFsOwotICAgIHN0cnVjdCBlMTAwMF9ob3N0X21uZ19jb21tYW5kX2hlYWRlciBoZHI7Ci0KLSAgICBoZHIuY29tbWFuZF9pZCA9IEUxMDAwX01OR19ESENQX1RYX1BBWUxPQURfQ01EOwotICAgIGhkci5jb21tYW5kX2xlbmd0aCA9IGxlbmd0aDsKLSAgICBoZHIucmVzZXJ2ZWQxID0gMDsKLSAgICBoZHIucmVzZXJ2ZWQyID0gMDsKLSAgICBoZHIuY2hlY2tzdW0gPSAwOwotCi0gICAgcmV0X3ZhbCA9IGUxMDAwX21uZ19lbmFibGVfaG9zdF9pZihodyk7Ci0gICAgaWYgKHJldF92YWwgPT0gRTEwMDBfU1VDQ0VTUykgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfbW5nX2hvc3RfaWZfd3JpdGUoaHcsIGJ1ZmZlciwgbGVuZ3RoLCBzaXplb2YoaGRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaGRyLmNoZWNrc3VtKSk7Ci0gICAgICAgIGlmIChyZXRfdmFsID09IEUxMDAwX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9tbmdfd3JpdGVfY21kX2hlYWRlcihodywgJmhkcik7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCA9PSBFMTAwMF9TVUNDRVNTKQotICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9tbmdfd3JpdGVfY29tbWl0KGh3KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY2hlY2tzdW0uCi0gKgotICogcmV0dXJucyAgLSBjaGVja3N1bSBvZiBidWZmZXIgY29udGVudHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1OCBlMTAwMF9jYWxjdWxhdGVfbW5nX2NoZWNrc3VtKGNoYXIgKmJ1ZmZlciwgdTMyIGxlbmd0aCkKLXsKLSAgICB1OCBzdW0gPSAwOwotICAgIHUzMiBpOwotCi0gICAgaWYgKCFidWZmZXIpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9yIChpPTA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgc3VtICs9IGJ1ZmZlcltpXTsKLQotICAgIHJldHVybiAodTgpKDAgLSBzdW0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdHggcGt0IGZpbHRlcmluZyBuZWVkcyB0byBiZSBlbmFibGVkIG9yIG5vdC4KLSAqCi0gKiByZXR1cm5zICAtIHRydWUgZm9yIHBhY2tldCBmaWx0ZXJpbmcgb3IgZmFsc2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgZTEwMDBfZW5hYmxlX3R4X3BrdF9maWx0ZXJpbmcoc3RydWN0IGUxMDAwX2h3ICpodykKLXsKLSAgICAvKiBjYWxsZWQgaW4gaW5pdCBhcyB3ZWxsIGFzIHdhdGNoZG9nIHRpbWVyIGZ1bmN0aW9ucyAqLwotCi0gICAgczMyIHJldF92YWwsIGNoZWNrc3VtOwotICAgIGJvb2wgdHhfZmlsdGVyID0gZmFsc2U7Ci0gICAgc3RydWN0IGUxMDAwX2hvc3RfbW5nX2RoY3BfY29va2llICpoZHIgPSAmKGh3LT5tbmdfY29va2llKTsKLSAgICB1OCAqYnVmZmVyID0gKHU4ICopICYoaHctPm1uZ19jb29raWUpOwotCi0gICAgaWYgKGUxMDAwX2NoZWNrX21uZ19tb2RlKGh3KSkgewotICAgICAgICByZXRfdmFsID0gZTEwMDBfbW5nX2VuYWJsZV9ob3N0X2lmKGh3KTsKLSAgICAgICAgaWYgKHJldF92YWwgPT0gRTEwMDBfU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2hvc3RfaWZfcmVhZF9jb29raWUoaHcsIGJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCA9PSBFMTAwMF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tzdW0gPSBoZHItPmNoZWNrc3VtOwotICAgICAgICAgICAgICAgIGhkci0+Y2hlY2tzdW0gPSAwOwotICAgICAgICAgICAgICAgIGlmICgoaGRyLT5zaWduYXR1cmUgPT0gRTEwMDBfSUFNVF9TSUdOQVRVUkUpICYmCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtID09IGUxMDAwX2NhbGN1bGF0ZV9tbmdfY2hlY2tzdW0oKGNoYXIgKilidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX01OR19ESENQX0NPT0tJRV9MRU5HVEgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoZHItPnN0YXR1cyAmCi0gICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1BBUlNJTkdfU1VQUE9SVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X2ZpbHRlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHR4X2ZpbHRlciA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB0eF9maWx0ZXIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaHctPnR4X3BrdF9maWx0ZXJpbmcgPSB0eF9maWx0ZXI7Ci0gICAgcmV0dXJuIHR4X2ZpbHRlcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVmVyaWZpZXMgdGhlIGhhcmR3YXJlIG5lZWRzIHRvIGFsbG93IEFSUHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBob3N0Ci0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCiAgKiByZXR1cm5zOiAtIHRydWUvZmFsc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIHUzMiBlMTAwMF9lbmFibGVfbW5nX3Bhc3NfdGhydShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHUzMiBtYW5jOwotICAgIHUzMiBmd3NtLCBmYWN0cHM7CisJdTMyIG1hbmM7CiAKLSAgICBpZiAoaHctPmFzZl9maXJtd2FyZV9wcmVzZW50KSB7Ci0gICAgICAgIG1hbmMgPSBlcjMyKE1BTkMpOworCWlmIChody0+YXNmX2Zpcm13YXJlX3ByZXNlbnQpIHsKKwkJbWFuYyA9IGVyMzIoTUFOQyk7CiAKLSAgICAgICAgaWYgKCEobWFuYyAmIEUxMDAwX01BTkNfUkNWX1RDT19FTikgfHwKLSAgICAgICAgICAgICEobWFuYyAmIEUxMDAwX01BTkNfRU5fTUFDX0FERFJfRklMVEVSKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGUxMDAwX2FyY19zdWJzeXN0ZW1fdmFsaWQoaHcpKSB7Ci0gICAgICAgICAgICBmd3NtID0gZXIzMihGV1NNKTsKLSAgICAgICAgICAgIGZhY3RwcyA9IGVyMzIoRkFDVFBTKTsKLQotICAgICAgICAgICAgaWYgKCgoKGZ3c20gJiBFMTAwMF9GV1NNX01PREVfTUFTSykgPj4gRTEwMDBfRldTTV9NT0RFX1NISUZUKSA9PQotICAgICAgICAgICAgICAgICAgIGUxMDAwX21uZ19tb2RlX3B0KSAmJiAhKGZhY3RwcyAmIEUxMDAwX0ZBQ1RQU19NTkdDRykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKChtYW5jICYgRTEwMDBfTUFOQ19TTUJVU19FTikgJiYgIShtYW5jICYgRTEwMDBfTUFOQ19BU0ZfRU4pKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisJCWlmICghKG1hbmMgJiBFMTAwMF9NQU5DX1JDVl9UQ09fRU4pIHx8CisJCSAgICAhKG1hbmMgJiBFMTAwMF9NQU5DX0VOX01BQ19BRERSX0ZJTFRFUikpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICgobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pICYmICEobWFuYyAmIEUxMDAwX01BTkNfQVNGX0VOKSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBzMzIgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHMzMiByZXRfdmFsOwotICAgIHUxNiBtaWlfc3RhdHVzX3JlZzsKLSAgICB1MTYgaTsKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgbWlpX3N0YXR1c19yZWc7CisJdTE2IGk7CiAKLSAgICAvKiBQb2xhcml0eSByZXZlcnNhbCB3b3JrYXJvdW5kIGZvciBmb3JjZWQgMTBGLzEwSCBsaW5rcy4gKi8KKwkvKiBQb2xhcml0eSByZXZlcnNhbCB3b3JrYXJvdW5kIGZvciBmb3JjZWQgMTBGLzEwSCBsaW5rcy4gKi8KIAotICAgIC8qIERpc2FibGUgdGhlIHRyYW5zbWl0dGVyIG9uIHRoZSBQSFkgKi8KKwkvKiBEaXNhYmxlIHRoZSB0cmFuc21pdHRlciBvbiB0aGUgUEhZICovCiAKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweEZGRkYpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweEZGRkYpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwMCk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwMCk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBOTyBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICovCi0gICAgZm9yIChpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgTGluayBTdGF0dXMgYml0Ci0gICAgICAgICAqIHRvIGJlIGNsZWFyLgotICAgICAgICAgKi8KKwkvKiBUaGlzIGxvb3Agd2lsbCBlYXJseS1vdXQgaWYgdGhlIE5PIGxpbmsgY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gKi8KKwlmb3IgKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgeworCQkvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCB3YWl0IGZvciBMaW5rIFN0YXR1cyBiaXQKKwkJICogdG8gYmUgY2xlYXIuCisJCSAqLwogCi0gICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7Ci0gICAgICAgIGlmIChyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisJCXJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICBpZiAoKG1paV9zdGF0dXNfcmVnICYgfk1JSV9TUl9MSU5LX1NUQVRVUykgPT0gMCkgYnJlYWs7Ci0gICAgICAgIG1kZWxheSgxMDApOwotICAgIH0KKwkJaWYgKChtaWlfc3RhdHVzX3JlZyAmIH5NSUlfU1JfTElOS19TVEFUVVMpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEwMCk7CisJfQogCi0gICAgLyogUmVjb21tZW5kZWQgZGVsYXkgdGltZSBhZnRlciBsaW5rIGhhcyBiZWVuIGxvc3QgKi8KLSAgICBtZGVsYXkoMTAwMCk7CisJLyogUmVjb21tZW5kZWQgZGVsYXkgdGltZSBhZnRlciBsaW5rIGhhcyBiZWVuIGxvc3QgKi8KKwltZGVsYXkoMTAwMCk7CiAKLSAgICAvKiBOb3cgd2Ugd2lsbCByZS1lbmFibGUgdGggdHJhbnNtaXR0ZXIgb24gdGhlIFBIWSAqLworCS8qIE5vdyB3ZSB3aWxsIHJlLWVuYWJsZSB0aCB0cmFuc21pdHRlciBvbiB0aGUgUEhZICovCiAKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICBtZGVsYXkoNTApOwotICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4RkZGMCk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIG1kZWxheSg1MCk7Ci0gICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgMHhGRjAwKTsKLSAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgbWRlbGF5KDUwKTsKLSAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweDAwMDApOwotICAgIGlmIChyZXRfdmFsKQotICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwltZGVsYXkoNTApOworCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4RkZGMCk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCW1kZWxheSg1MCk7CisJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgMHhGRjAwKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisJbWRlbGF5KDUwKTsKKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweDAwMDApOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwMCk7Ci0gICAgaWYgKHJldF92YWwpCi0gICAgICAgIHJldHVybiByZXRfdmFsOworCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwMCk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOwogCi0gICAgLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICovCi0gICAgZm9yIChpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgTGluayBTdGF0dXMgYml0Ci0gICAgICAgICAqIHRvIGJlIHNldC4KLSAgICAgICAgICovCisJLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICovCisJZm9yIChpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKKwkJLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgTGluayBTdGF0dXMgYml0CisJCSAqIHRvIGJlIHNldC4KKwkJICovCiAKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKIAotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOwotICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOwogCi0gICAgICAgIGlmIChtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7Ci0gICAgICAgIG1kZWxheSgxMDApOwotICAgIH0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwkJaWYgKG1paV9zdGF0dXNfcmVnICYgTUlJX1NSX0xJTktfU1RBVFVTKQorCQkJYnJlYWs7CisJCW1kZWxheSgxMDApOworCX0KKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIERpc2FibGVzIFBDSS1FeHByZXNzIG1hc3RlciBhY2Nlc3MuCi0gKgotICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoKLSAqIHJldHVybnM6IC0gbm9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZTEwMDBfc2V0X3BjaV9leHByZXNzX21hc3Rlcl9kaXNhYmxlKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgdTMyIGN0cmw7Ci0KLSAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9wY2lfZXhwcmVzc19tYXN0ZXJfZGlzYWJsZSIpOwotCi0gICAgaWYgKGh3LT5idXNfdHlwZSAhPSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY3RybCA9IGVyMzIoQ1RSTCk7Ci0gICAgY3RybCB8PSBFMTAwMF9DVFJMX0dJT19NQVNURVJfRElTQUJMRTsKLSAgICBldzMyKENUUkwsIGN0cmwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIERpc2FibGVzIFBDSS1FeHByZXNzIG1hc3RlciBhY2Nlc3MgYW5kIHZlcmlmaWVzIHRoZXJlIGFyZSBubyBwZW5kaW5nIHJlcXVlc3RzCi0gKgotICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoKLSAqIHJldHVybnM6IC0gRTEwMDBfRVJSX01BU1RFUl9SRVFVRVNUU19QRU5ESU5HIGlmIG1hc3RlciBkaXNhYmxlIGJpdCBoYXNuJ3QKLSAqICAgICAgICAgICAgY2F1c2VkIHRoZSBtYXN0ZXIgcmVxdWVzdHMgdG8gYmUgZGlzYWJsZWQuCi0gKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgbWFzdGVyIHJlcXVlc3RzIGRpc2FibGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zMzIgZTEwMDBfZGlzYWJsZV9wY2lleF9tYXN0ZXIoc3RydWN0IGUxMDAwX2h3ICpodykKLXsKLSAgICBzMzIgdGltZW91dCA9IE1BU1RFUl9ESVNBQkxFX1RJTUVPVVQ7ICAgLyogODBtcyAqLwotCi0gICAgREVCVUdGVU5DKCJlMTAwMF9kaXNhYmxlX3BjaWV4X21hc3RlciIpOwotCi0gICAgaWYgKGh3LT5idXNfdHlwZSAhPSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzcykKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0KLSAgICBlMTAwMF9zZXRfcGNpX2V4cHJlc3NfbWFzdGVyX2Rpc2FibGUoaHcpOwotCi0gICAgd2hpbGUgKHRpbWVvdXQpIHsKLSAgICAgICAgaWYgKCEoZXIzMihTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0dJT19NQVNURVJfRU5BQkxFKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1ZGVsYXkoMTAwKTsKLSAgICAgICAgdGltZW91dC0tOwotICAgIH0KLQotICAgIGlmICghdGltZW91dCkgewotICAgICAgICBERUJVR09VVCgiTWFzdGVyIHJlcXVlc3RzIGFyZSBwZW5kaW5nLlxuIik7Ci0gICAgICAgIHJldHVybiAtRTEwMDBfRVJSX01BU1RFUl9SRVFVRVNUU19QRU5ESU5HOwotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqCisgKiBlMTAwMF9nZXRfYXV0b19yZF9kb25lCisgKiBAaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQogICoKICAqIENoZWNrIGZvciBFRVBST00gQXV0byBSZWFkIGJpdCBkb25lLgotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCiAgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9SRVNFVCBpZiBmYWlsIHRvIHJlc2V0IE1BQwogICogICAgICAgICAgICBFMTAwMF9TVUNDRVNTIGF0IGFueSBvdGhlciBjYXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIHN0YXRpYyBzMzIgZTEwMDBfZ2V0X2F1dG9fcmRfZG9uZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewotICAgIHMzMiB0aW1lb3V0ID0gQVVUT19SRUFEX0RPTkVfVElNRU9VVDsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfZ2V0X2F1dG9fcmRfZG9uZSIpOwotCi0gICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKLSAgICBkZWZhdWx0OgotICAgICAgICBtc2xlZXAoNSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgZTEwMDBfODI1NzE6Ci0gICAgY2FzZSBlMTAwMF84MjU3MjoKLSAgICBjYXNlIGUxMDAwXzgyNTczOgotICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0gICAgY2FzZSBlMTAwMF9pY2g4bGFuOgotICAgICAgICB3aGlsZSAodGltZW91dCkgewotICAgICAgICAgICAgaWYgKGVyMzIoRUVDRCkgJiBFMTAwMF9FRUNEX0FVVE9fUkQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBlbHNlIG1zbGVlcCgxKTsKLSAgICAgICAgICAgIHRpbWVvdXQtLTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdGltZW91dCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkF1dG8gcmVhZCBieSBIVyBmcm9tIEVFUFJPTSBoYXMgbm90IGNvbXBsZXRlZC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUkVTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogUEhZIGNvbmZpZ3VyYXRpb24gZnJvbSBOVk0ganVzdCBzdGFydHMgYWZ0ZXIgRUVDRF9BVVRPX1JEIHNldHMgdG8gaGlnaC4KLSAgICAgKiBOZWVkIHRvIHdhaXQgZm9yIFBIWSBjb25maWd1cmF0aW9uIGNvbXBsZXRpb24gYmVmb3JlIGFjY2Vzc2luZyBOVk0KLSAgICAgKiBhbmQgUEhZLiAqLwotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpCi0gICAgICAgIG1zbGVlcCgyNSk7Ci0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKwlERUJVR0ZVTkMoImUxMDAwX2dldF9hdXRvX3JkX2RvbmUiKTsKKwltc2xlZXAoNSk7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKgorICogZTEwMDBfZ2V0X3BoeV9jZmdfZG9uZQorICogQGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCiAgKiBDaGVja3MgaWYgdGhlIFBIWSBjb25maWd1cmF0aW9uIGlzIGRvbmUKLSAqCi0gKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCi0gKgogICogcmV0dXJuczogLSBFMTAwMF9FUlJfUkVTRVQgaWYgZmFpbCB0byByZXNldCBNQUMKICAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBhdCBhbnkgb3RoZXIgY2FzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiBzdGF0aWMgczMyIGUxMDAwX2dldF9waHlfY2ZnX2RvbmUoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKLSAgICBzMzIgdGltZW91dCA9IFBIWV9DRkdfVElNRU9VVDsKLSAgICB1MzIgY2ZnX21hc2sgPSBFMTAwMF9FRVBST01fQ0ZHX0RPTkU7Ci0KLSAgICBERUJVR0ZVTkMoImUxMDAwX2dldF9waHlfY2ZnX2RvbmUiKTsKLQotICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgbWRlbGF5KDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLSAgICAgICAgLyogU2VwYXJhdGUgKl9DRkdfRE9ORV8qIGJpdCBmb3IgZWFjaCBwb3J0ICovCi0gICAgICAgIGlmIChlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKQotICAgICAgICAgICAgY2ZnX21hc2sgPSBFMTAwMF9FRVBST01fQ0ZHX0RPTkVfUE9SVF8xOwotICAgICAgICAvKiBGYWxsIFRocm91Z2ggKi8KLSAgICBjYXNlIGUxMDAwXzgyNTcxOgotICAgIGNhc2UgZTEwMDBfODI1NzI6Ci0gICAgICAgIHdoaWxlICh0aW1lb3V0KSB7Ci0gICAgICAgICAgICBpZiAoZXIzMihFRU1OR0NUTCkgJiBjZmdfbWFzaykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtc2xlZXAoMSk7Ci0gICAgICAgICAgICB0aW1lb3V0LS07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF0aW1lb3V0KSB7Ci0gICAgICAgICAgICBERUJVR09VVCgiTU5HIGNvbmZpZ3VyYXRpb24gY3ljbGUgaGFzIG5vdCBjb21wbGV0ZWQuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1JFU0VUOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCURFQlVHRlVOQygiZTEwMDBfZ2V0X3BoeV9jZmdfZG9uZSIpOworCW1kZWxheSgxMCk7CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBVc2luZyB0aGUgY29tYmluYXRpb24gb2YgU01CSSBhbmQgU1dFU01CSSBzZW1hcGhvcmUgYml0cyB3aGVuIHJlc2V0dGluZwotICogYWRhcHRlciBvciBFZXByb20gYWNjZXNzLgotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCi0gKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9FRVBST00gaWYgZmFpbCB0byBhY2Nlc3MgRUVQUk9NLgotICogICAgICAgICAgICBFMTAwMF9TVUNDRVNTIGF0IGFueSBvdGhlciBjYXNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgczMyIGUxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgczMyIHRpbWVvdXQ7Ci0gICAgdTMyIHN3c207Ci0KLSAgICBERUJVR0ZVTkMoImUxMDAwX2dldF9od19lZXByb21fc2VtYXBob3JlIik7Ci0KLSAgICBpZiAoIWh3LT5lZXByb21fc2VtYXBob3JlX3ByZXNlbnQpCi0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikgewotICAgICAgICAvKiBHZXQgdGhlIFNXIHNlbWFwaG9yZS4gKi8KLSAgICAgICAgaWYgKGUxMDAwX2dldF9zb2Z0d2FyZV9zZW1hcGhvcmUoaHcpICE9IEUxMDAwX1NVQ0NFU1MpCi0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBGVyBzZW1hcGhvcmUuICovCi0gICAgdGltZW91dCA9IGh3LT5lZXByb20ud29yZF9zaXplICsgMTsKLSAgICB3aGlsZSAodGltZW91dCkgewotICAgICAgICBzd3NtID0gZXIzMihTV1NNKTsKLSAgICAgICAgc3dzbSB8PSBFMTAwMF9TV1NNX1NXRVNNQkk7Ci0gICAgICAgIGV3MzIoU1dTTSwgc3dzbSk7Ci0gICAgICAgIC8qIGlmIHdlIG1hbmFnZWQgdG8gc2V0IHRoZSBiaXQgd2UgZ290IHRoZSBzZW1hcGhvcmUuICovCi0gICAgICAgIHN3c20gPSBlcjMyKFNXU00pOwotICAgICAgICBpZiAoc3dzbSAmIEUxMDAwX1NXU01fU1dFU01CSSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHVkZWxheSg1MCk7Ci0gICAgICAgIHRpbWVvdXQtLTsKLSAgICB9Ci0KLSAgICBpZiAoIXRpbWVvdXQpIHsKLSAgICAgICAgLyogUmVsZWFzZSBzZW1hcGhvcmVzICovCi0gICAgICAgIGUxMDAwX3B1dF9od19lZXByb21fc2VtYXBob3JlKGh3KTsKLSAgICAgICAgREVCVUdPVVQoIkRyaXZlciBjYW4ndCBhY2Nlc3MgdGhlIEVlcHJvbSAtIFNXRVNNQkkgYml0IGlzIHNldC5cbiIpOwotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgfQotCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIEhXIHNlbWFwaG9yZSBiaXRzLgotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCi0gKiByZXR1cm5zOiAtIE5vbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGUxMDAwX3B1dF9od19lZXByb21fc2VtYXBob3JlKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgdTMyIHN3c207Ci0KLSAgICBERUJVR0ZVTkMoImUxMDAwX3B1dF9od19lZXByb21fc2VtYXBob3JlIik7Ci0KLSAgICBpZiAoIWh3LT5lZXByb21fc2VtYXBob3JlX3ByZXNlbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN3c20gPSBlcjMyKFNXU00pOwotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pIHsKLSAgICAgICAgLyogUmVsZWFzZSBib3RoIHNlbWFwaG9yZXMuICovCi0gICAgICAgIHN3c20gJj0gfihFMTAwMF9TV1NNX1NNQkkgfCBFMTAwMF9TV1NNX1NXRVNNQkkpOwotICAgIH0gZWxzZQotICAgICAgICBzd3NtICY9IH4oRTEwMDBfU1dTTV9TV0VTTUJJKTsKLSAgICBldzMyKFNXU00sIHN3c20pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogT2J0YWluaW5nIHNvZnR3YXJlIHNlbWFwaG9yZSBiaXQgKFNNQkkpIGJlZm9yZSByZXNldHRpbmcgUEhZLgotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCi0gKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9SRVNFVCBpZiBmYWlsIHRvIG9idGFpbiBzZW1hcGhvcmUuCi0gKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfZ2V0X3NvZnR3YXJlX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQotewotICAgIHMzMiB0aW1lb3V0ID0gaHctPmVlcHJvbS53b3JkX3NpemUgKyAxOwotICAgIHUzMiBzd3NtOwotCi0gICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfc29mdHdhcmVfc2VtYXBob3JlIik7Ci0KLSAgICBpZiAoaHctPm1hY190eXBlICE9IGUxMDAwXzgwMDAzZXMybGFuKSB7Ci0gICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotICAgIH0KLQotICAgIHdoaWxlICh0aW1lb3V0KSB7Ci0gICAgICAgIHN3c20gPSBlcjMyKFNXU00pOwotICAgICAgICAvKiBJZiBTTUJJIGJpdCBjbGVhcmVkLCBpdCBpcyBub3cgc2V0IGFuZCB3ZSBob2xkIHRoZSBzZW1hcGhvcmUgKi8KLSAgICAgICAgaWYgKCEoc3dzbSAmIEUxMDAwX1NXU01fU01CSSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbWRlbGF5KDEpOwotICAgICAgICB0aW1lb3V0LS07Ci0gICAgfQotCi0gICAgaWYgKCF0aW1lb3V0KSB7Ci0gICAgICAgIERFQlVHT1VUKCJEcml2ZXIgY2FuJ3QgYWNjZXNzIGRldmljZSAtIFNNQkkgYml0IGlzIHNldC5cbiIpOwotICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9SRVNFVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFJlbGVhc2Ugc2VtYXBob3JlIGJpdCAoU01CSSkuCi0gKgotICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQotewotICAgIHUzMiBzd3NtOwotCi0gICAgREVCVUdGVU5DKCJlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX3NlbWFwaG9yZSIpOwotCi0gICAgaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MDAwM2VzMmxhbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dzbSA9IGVyMzIoU1dTTSk7Ci0gICAgLyogUmVsZWFzZSB0aGUgU1cgc2VtYXBob3Jlcy4qLwotICAgIHN3c20gJj0gfkUxMDAwX1NXU01fU01CSTsKLSAgICBldzMyKFNXU00sIHN3c20pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGVja3MgaWYgUEhZIHJlc2V0IGlzIGJsb2NrZWQgZHVlIHRvIFNPTC9JREVSIHNlc3Npb24sIGZvciBleGFtcGxlLgotICogUmV0dXJuaW5nIEUxMDAwX0JMS19QSFlfUkVTRVQgaXNuJ3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IuICBCdXQgaXQncyB1cCB0bwotICogdGhlIGNhbGxlciB0byBmaWd1cmUgb3V0IGhvdyB0byBkZWFsIHdpdGggaXQuCi0gKgotICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCi0gKiByZXR1cm5zOiAtIEUxMDAwX0JMS19QSFlfUkVTRVQKLSAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXMzMiBlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soc3RydWN0IGUxMDAwX2h3ICpodykKLXsKLSAgICB1MzIgbWFuYyA9IDA7Ci0gICAgdTMyIGZ3c20gPSAwOwotCi0gICAgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSB7Ci0gICAgICAgIGZ3c20gPSBlcjMyKEZXU00pOwotICAgICAgICByZXR1cm4gKGZ3c20gJiBFMTAwMF9GV1NNX1JTUENJUEhZKSA/IEUxMDAwX1NVQ0NFU1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFMTAwMF9CTEtfUEhZX1JFU0VUOwotICAgIH0KLQotICAgIGlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikKLSAgICAgICAgbWFuYyA9IGVyMzIoTUFOQyk7Ci0gICAgcmV0dXJuIChtYW5jICYgRTEwMDBfTUFOQ19CTEtfUEhZX1JTVF9PTl9JREUpID8KLSAgICAgICAgRTEwMDBfQkxLX1BIWV9SRVNFVCA6IEUxMDAwX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB1OCBlMTAwMF9hcmNfc3Vic3lzdGVtX3ZhbGlkKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgdTMyIGZ3c207Ci0KLSAgICAvKiBPbiA4MjU3eCBzaWxpY29uLCByZWdpc3RlcnMgaW4gdGhlIHJhbmdlIG9mIDB4ODgwMCAtIDB4OEZGQwotICAgICAqIG1heSBub3QgYmUgcHJvdmlkZWQgYSBETUEgY2xvY2sgd2hlbiBubyBtYW5hZ2VhYmlsaXR5IGZlYXR1cmVzIGFyZQotICAgICAqIGVuYWJsZWQuICBXZSBkbyBub3Qgd2FudCB0byBwZXJmb3JtIGFueSByZWFkcy93cml0ZXMgdG8gdGhlc2UgcmVnaXN0ZXJzCi0gICAgICogaWYgdGhpcyBpcyB0aGUgY2FzZS4gIFdlIHJlYWQgRldTTSB0byBkZXRlcm1pbmUgdGhlIG1hbmFnZWFiaWxpdHkgbW9kZS4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotICAgIGNhc2UgZTEwMDBfODI1NzE6Ci0gICAgY2FzZSBlMTAwMF84MjU3MjoKLSAgICBjYXNlIGUxMDAwXzgyNTczOgotICAgIGNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0gICAgICAgIGZ3c20gPSBlcjMyKEZXU00pOwotICAgICAgICBpZiAoKGZ3c20gJiBFMTAwMF9GV1NNX01PREVfTUFTSykgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGUxMDAwX2ljaDhsYW46Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29uZmlndXJlIFBDSS1FeCBuby1zbm9vcAotICoKLSAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlLgotICogbm9fc25vb3AgLSBCaXRtYXAgb2Ygbm8tc25vb3AgZXZlbnRzLgotICoKLSAqIHJldHVybnM6IEUxMDAwX1NVQ0NFU1MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgczMyIGUxMDAwX3NldF9wY2lfZXhfbm9fc25vb3Aoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG5vX3Nub29wKQotewotICAgIHUzMiBnY3JfcmVnID0gMDsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X3BjaV9leF9ub19zbm9vcCIpOwotCi0gICAgaWYgKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV91bmtub3duKQotICAgICAgICBlMTAwMF9nZXRfYnVzX2luZm8oaHcpOwotCi0gICAgaWYgKGh3LT5idXNfdHlwZSAhPSBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzcykKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0KLSAgICBpZiAobm9fc25vb3ApIHsKLSAgICAgICAgZ2NyX3JlZyA9IGVyMzIoR0NSKTsKLSAgICAgICAgZ2NyX3JlZyAmPSB+KFBDSV9FWF9OT19TTk9PUF9BTEwpOwotICAgICAgICBnY3JfcmVnIHw9IG5vX3Nub29wOwotICAgICAgICBldzMyKEdDUiwgZ2NyX3JlZyk7Ci0gICAgfQotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgewotICAgICAgICB1MzIgY3RybF9leHQ7Ci0KLSAgICAgICAgZXczMihHQ1IsIFBDSV9FWF84MjU2Nl9TTk9PUF9BTEwpOwotCi0gICAgICAgIGN0cmxfZXh0ID0gZXIzMihDVFJMX0VYVCk7Ci0gICAgICAgIGN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX1JPX0RJUzsKLSAgICAgICAgZXczMihDVFJMX0VYVCwgY3RybF9leHQpOwotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR2V0IHNvZnR3YXJlIHNlbWFwaG9yZSBGTEFHIGJpdCAoU1dGTEFHKS4KLSAqIFNXRkxBRyBpcyB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBhY2Nlc3MgdG8gYWxsIHNoYXJlZCByZXNvdXJjZSBiZXR3ZWVuCi0gKiBTVywgRlcgYW5kIEhXLgotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9nZXRfc29mdHdhcmVfZmxhZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQotewotICAgIHMzMiB0aW1lb3V0ID0gUEhZX0NGR19USU1FT1VUOwotICAgIHUzMiBleHRjbmZfY3RybDsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfZ2V0X3NvZnR3YXJlX2ZsYWciKTsKLQotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgewotICAgICAgICB3aGlsZSAodGltZW91dCkgewotICAgICAgICAgICAgZXh0Y25mX2N0cmwgPSBlcjMyKEVYVENORl9DVFJMKTsKLSAgICAgICAgICAgIGV4dGNuZl9jdHJsIHw9IEUxMDAwX0VYVENORl9DVFJMX1NXRkxBRzsKLSAgICAgICAgICAgIGV3MzIoRVhUQ05GX0NUUkwsIGV4dGNuZl9jdHJsKTsKLQotICAgICAgICAgICAgZXh0Y25mX2N0cmwgPSBlcjMyKEVYVENORl9DVFJMKTsKLSAgICAgICAgICAgIGlmIChleHRjbmZfY3RybCAmIEUxMDAwX0VYVENORl9DVFJMX1NXRkxBRykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIG1kZWxheSgxKTsKLSAgICAgICAgICAgIHRpbWVvdXQtLTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdGltZW91dCkgewotICAgICAgICAgICAgREVCVUdPVVQoIkZXIG9yIEhXIGxvY2tzIHRoZSByZXNvdXJjZSB0b28gbG9uZy5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSZWxlYXNlIHNvZnR3YXJlIHNlbWFwaG9yZSBGTEFHIGJpdCAoU1dGTEFHKS4KLSAqIFNXRkxBRyBpcyB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBhY2Nlc3MgdG8gYWxsIHNoYXJlZCByZXNvdXJjZSBiZXR3ZWVuCi0gKiBTVywgRlcgYW5kIEhXLgotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZTEwMDBfcmVsZWFzZV9zb2Z0d2FyZV9mbGFnKHN0cnVjdCBlMTAwMF9odyAqaHcpCi17Ci0gICAgdTMyIGV4dGNuZl9jdHJsOwotCi0gICAgREVCVUdGVU5DKCJlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX2ZsYWciKTsKLQotICAgIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfaWNoOGxhbikgewotICAgICAgICBleHRjbmZfY3RybD0gZXIzMihFWFRDTkZfQ1RSTCk7Ci0gICAgICAgIGV4dGNuZl9jdHJsICY9IH5FMTAwMF9FWFRDTkZfQ1RSTF9TV0ZMQUc7Ci0gICAgICAgIGV3MzIoRVhUQ05GX0NUUkwsIGV4dGNuZl9jdHJsKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJlYWRzIGEgMTYgYml0IHdvcmQgb3Igd29yZHMgZnJvbSB0aGUgRUVQUk9NIHVzaW5nIHRoZSBJQ0g4J3MgZmxhc2ggYWNjZXNzCi0gKiByZWdpc3Rlci4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogb2Zmc2V0IC0gb2Zmc2V0IG9mIHdvcmQgaW4gdGhlIEVFUFJPTSB0byByZWFkCi0gKiBkYXRhIC0gd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQotICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9yZWFkX2VlcHJvbV9pY2g4KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKLQkJCQkgIHUxNiAqZGF0YSkKLXsKLSAgICBzMzIgIGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKLSAgICB1MzIgZmxhc2hfYmFuayA9IDA7Ci0gICAgdTMyIGFjdF9vZmZzZXQgPSAwOwotICAgIHUzMiBiYW5rX29mZnNldCA9IDA7Ci0gICAgdTE2IHdvcmQgPSAwOwotICAgIHUxNiBpID0gMDsKLQotICAgIC8qIFdlIG5lZWQgdG8ga25vdyB3aGljaCBpcyB0aGUgdmFsaWQgZmxhc2ggYmFuay4gIEluIHRoZSBldmVudAotICAgICAqIHRoYXQgd2UgZGlkbid0IGFsbG9jYXRlIGVlcHJvbV9zaGFkb3dfcmFtLCB3ZSBtYXkgbm90IGJlCi0gICAgICogbWFuYWdpbmcgZmxhc2hfYmFuay4gIFNvIGl0IGNhbm5vdCBiZSB0cnVzdGVkIGFuZCBuZWVkcwotICAgICAqIHRvIGJlIHVwZGF0ZWQgd2l0aCBlYWNoIHJlYWQuCi0gICAgICovCi0gICAgLyogVmFsdWUgb2YgYml0IDIyIGNvcnJlc3BvbmRzIHRvIHRoZSBmbGFzaCBiYW5rIHdlJ3JlIG9uLiAqLwotICAgIGZsYXNoX2JhbmsgPSAoZXIzMihFRUNEKSAmIEUxMDAwX0VFQ0RfU0VDMVZBTCkgPyAxIDogMDsKLQotICAgIC8qIEFkanVzdCBvZmZzZXQgYXBwcm9wcmlhdGVseSBpZiB3ZSdyZSBvbiBiYW5rIDEgLSBhZGp1c3QgZm9yIHdvcmQgc2l6ZSAqLwotICAgIGJhbmtfb2Zmc2V0ID0gZmxhc2hfYmFuayAqIChody0+Zmxhc2hfYmFua19zaXplICogMik7Ci0KLSAgICBlcnJvciA9IGUxMDAwX2dldF9zb2Z0d2FyZV9mbGFnKGh3KTsKLSAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKLSAgICAgICAgaWYgKGh3LT5lZXByb21fc2hhZG93X3JhbSAhPSBOVUxMICYmCi0gICAgICAgICAgICBody0+ZWVwcm9tX3NoYWRvd19yYW1bb2Zmc2V0K2ldLm1vZGlmaWVkKSB7Ci0gICAgICAgICAgICBkYXRhW2ldID0gaHctPmVlcHJvbV9zaGFkb3dfcmFtW29mZnNldCtpXS5lZXByb21fd29yZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIFRoZSBOVk0gcGFydCBuZWVkcyBhIGJ5dGUgb2Zmc2V0LCBoZW5jZSAqIDIgKi8KLSAgICAgICAgICAgIGFjdF9vZmZzZXQgPSBiYW5rX29mZnNldCArICgob2Zmc2V0ICsgaSkgKiAyKTsKLSAgICAgICAgICAgIGVycm9yID0gZTEwMDBfcmVhZF9pY2g4X3dvcmQoaHcsIGFjdF9vZmZzZXQsICZ3b3JkKTsKLSAgICAgICAgICAgIGlmIChlcnJvciAhPSBFMTAwMF9TVUNDRVNTKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGF0YVtpXSA9IHdvcmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX2ZsYWcoaHcpOwotCi0gICAgcmV0dXJuIGVycm9yOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBXcml0ZXMgYSAxNiBiaXQgd29yZCBvciB3b3JkcyB0byB0aGUgRUVQUk9NIHVzaW5nIHRoZSBJQ0g4J3MgZmxhc2ggYWNjZXNzCi0gKiByZWdpc3Rlci4gIEFjdHVhbGx5LCB3cml0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHNoYWRvdyByYW0gY2FjaGUgaW4gdGhlIGh3Ci0gKiBzdHJ1Y3R1cmUgaHctPmUxMDAwX3NoYWRvd19yYW0uICBlMTAwMF9jb21taXRfc2hhZG93X3JhbSBmbHVzaGVzIHRoaXMgdG8KLSAqIHRoZSBOVk0sIHdoaWNoIG9jY3VycyB3aGVuIHRoZSBOVk0gY2hlY2tzdW0gaXMgdXBkYXRlZC4KLSAqCi0gKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQotICogb2Zmc2V0IC0gb2Zmc2V0IG9mIHdvcmQgaW4gdGhlIEVFUFJPTSB0byB3cml0ZQotICogd29yZHMgLSBudW1iZXIgb2Ygd29yZHMgdG8gd3JpdGUKLSAqIGRhdGEgLSB3b3JkcyB0byB3cml0ZSB0byB0aGUgRUVQUk9NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgczMyIGUxMDAwX3dyaXRlX2VlcHJvbV9pY2g4KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKLQkJCQkgICB1MTYgKmRhdGEpCi17Ci0gICAgdTMyIGkgPSAwOwotICAgIHMzMiBlcnJvciA9IEUxMDAwX1NVQ0NFU1M7Ci0KLSAgICBlcnJvciA9IGUxMDAwX2dldF9zb2Z0d2FyZV9mbGFnKGh3KTsKLSAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogQSBkcml2ZXIgY2FuIHdyaXRlIHRvIHRoZSBOVk0gb25seSBpZiBpdCBoYXMgZWVwcm9tX3NoYWRvd19yYW0KLSAgICAgKiBhbGxvY2F0ZWQuICBTdWJzZXF1ZW50IHJlYWRzIHRvIHRoZSBtb2RpZmllZCB3b3JkcyBhcmUgcmVhZCBmcm9tCi0gICAgICogdGhpcyBjYWNoZWQgc3RydWN0dXJlIGFzIHdlbGwuICBXcml0ZXMgd2lsbCBvbmx5IGdvIGludG8gdGhpcwotICAgICAqIGNhY2hlZCBzdHJ1Y3R1cmUgdW5sZXNzIGl0J3MgZm9sbG93ZWQgYnkgYSBjYWxsIHRvCi0gICAgICogZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSgpIHdoZXJlIGl0IHdpbGwgY29tbWl0IHRoZSBjaGFuZ2VzCi0gICAgICogYW5kIGNsZWFyIHRoZSAibW9kaWZpZWQiIGZpZWxkLgotICAgICAqLwotICAgIGlmIChody0+ZWVwcm9tX3NoYWRvd19yYW0gIT0gTlVMTCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewotICAgICAgICAgICAgaWYgKChvZmZzZXQgKyBpKSA8IEUxMDAwX1NIQURPV19SQU1fV09SRFMpIHsKLSAgICAgICAgICAgICAgICBody0+ZWVwcm9tX3NoYWRvd19yYW1bb2Zmc2V0K2ldLm1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBody0+ZWVwcm9tX3NoYWRvd19yYW1bb2Zmc2V0K2ldLmVlcHJvbV93b3JkID0gZGF0YVtpXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIERyaXZlcnMgaGF2ZSB0aGUgb3B0aW9uIHRvIG5vdCBhbGxvY2F0ZSBlZXByb21fc2hhZG93X3JhbSBhcyBsb25nCi0gICAgICAgICAqIGFzIHRoZXkgZG9uJ3QgcGVyZm9ybSBhbnkgTlZNIHdyaXRlcy4gIEFuIGF0dGVtcHQgaW4gZG9pbmcgc28KLSAgICAgICAgICogd2lsbCByZXN1bHQgaW4gdGhpcyBlcnJvci4KLSAgICAgICAgICovCi0gICAgICAgIGVycm9yID0gLUUxMDAwX0VSUl9FRVBST007Ci0gICAgfQotCi0gICAgZTEwMDBfcmVsZWFzZV9zb2Z0d2FyZV9mbGFnKGh3KTsKLQotICAgIHJldHVybiBlcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIGluaXRpYWwgZmxhc2ggc2V0dXAgc28gdGhhdCBhIG5ldyByZWFkL3dyaXRlL2VyYXNlIGN5Y2xlCi0gKiBjYW4gYmUgc3RhcnRlZC4KLSAqCi0gKiBodyAtIFRoZSBwb2ludGVyIHRvIHRoZSBodyBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9pY2g4X2N5Y2xlX2luaXQoc3RydWN0IGUxMDAwX2h3ICpodykKLXsKLSAgICB1bmlvbiBpY2g4X2h3c19mbGFzaF9zdGF0dXMgaHNmc3RzOwotICAgIHMzMiBlcnJvciA9IEUxMDAwX0VSUl9FRVBST007Ci0gICAgczMyIGkgICAgID0gMDsKLQotICAgIERFQlVHRlVOQygiZTEwMDBfaWNoOF9jeWNsZV9pbml0Iik7Ci0KLSAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMpOwotCi0gICAgLyogTWF5IGJlIGNoZWNrIHRoZSBGbGFzaCBEZXMgVmFsaWQgYml0IGluIEh3IHN0YXR1cyAqLwotICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGRlc3ZhbGlkID09IDApIHsKLSAgICAgICAgREVCVUdPVVQoIkZsYXNoIGRlc2NyaXB0b3IgaW52YWxpZC4gIFNXIFNlcXVlbmNpbmcgbXVzdCBiZSB1c2VkLiIpOwotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgLyogQ2xlYXIgRkNFUlIgaW4gSHcgc3RhdHVzIGJ5IHdyaXRpbmcgMSAqLwotICAgIC8qIENsZWFyIERBRUwgaW4gSHcgc3RhdHVzIGJ5IHdyaXRpbmcgYSAxICovCi0gICAgaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyID0gMTsKLSAgICBoc2ZzdHMuaHNmX3N0YXR1cy5kYWVsID0gMTsKLQotICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7Ci0KLSAgICAvKiBFaXRoZXIgd2Ugc2hvdWxkIGhhdmUgYSBoYXJkd2FyZSBTUEkgY3ljbGUgaW4gcHJvZ3Jlc3MgYml0IHRvIGNoZWNrCi0gICAgICogYWdhaW5zdCwgaW4gb3JkZXIgdG8gc3RhcnQgYSBuZXcgY3ljbGUgb3IgRkRPTkUgYml0IHNob3VsZCBiZSBjaGFuZ2VkCi0gICAgICogaW4gdGhlIGhhcmR3YXJlIHNvIHRoYXQgaXQgaXMgMSBhZnRlciBoYXJ3YXJlIHJlc2V0LCB3aGljaCBjYW4gdGhlbiBiZQotICAgICAqIHVzZWQgYXMgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIGEgY3ljbGUgaXMgaW4gcHJvZ3Jlc3Mgb3IgaGFzIGJlZW4KLSAgICAgKiBjb21wbGV0ZWQgLi4gd2Ugc2hvdWxkIGFsc28gaGF2ZSBzb21lIHNvZnR3YXJlIHNlbWFwaG9yZSBtZWNoYW5pc20gdG8KLSAgICAgKiBndWFyZCBGRE9ORSBvciB0aGUgY3ljbGUgaW4gcHJvZ3Jlc3MgYml0IHNvIHRoYXQgdHdvIHRocmVhZHMgYWNjZXNzIHRvCi0gICAgICogdGhvc2UgYml0cyBjYW4gYmUgc2VxdWVudGlhbGxpemVkIG9yIGEgd2F5IHNvIHRoYXQgMiB0aHJlYWRzIGRvbnQKLSAgICAgKiBzdGFydCB0aGUgY3ljbGUgYXQgdGhlIHNhbWUgdGltZSAqLwotCi0gICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2lucHJvZyA9PSAwKSB7Ci0gICAgICAgIC8qIFRoZXJlIGlzIG5vIGN5Y2xlIHJ1bm5pbmcgYXQgcHJlc2VudCwgc28gd2UgY2FuIHN0YXJ0IGEgY3ljbGUgKi8KLSAgICAgICAgLyogQmVnaW4gYnkgc2V0dGluZyBGbGFzaCBDeWNsZSBEb25lLiAqLwotICAgICAgICBoc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID0gMTsKLSAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTLCBoc2ZzdHMucmVndmFsKTsKLSAgICAgICAgZXJyb3IgPSBFMTAwMF9TVUNDRVNTOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIG90aGVyd2lzZSBwb2xsIGZvciBzb21ldGltZSBzbyB0aGUgY3VycmVudCBjeWNsZSBoYXMgYSBjaGFuY2UKLSAgICAgICAgICogdG8gZW5kIGJlZm9yZSBnaXZpbmcgdXAuICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBJQ0hfRkxBU0hfQ09NTUFORF9USU1FT1VUOyBpKyspIHsKLSAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7Ci0gICAgICAgICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjaW5wcm9nID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnJvciA9IEUxMDAwX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1ZGVsYXkoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yID09IEUxMDAwX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgaW4gd2FpdGluZyBmb3IgcHJldmlvdXMgY3ljbGUgdG8gdGltZW91dCwKLSAgICAgICAgICAgICAqIG5vdyBzZXQgdGhlIEZsYXNoIEN5Y2xlIERvbmUuICovCi0gICAgICAgICAgICBoc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID0gMTsKLSAgICAgICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBERUJVR09VVCgiRmxhc2ggY29udHJvbGxlciBidXN5LCBjYW5ub3QgZ2V0IGFjY2VzcyIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBmdW5jdGlvbiBzdGFydHMgYSBmbGFzaCBjeWNsZSBhbmQgd2FpdHMgZm9yIGl0cyBjb21wbGV0aW9uCi0gKgotICogaHcgLSBUaGUgcG9pbnRlciB0byB0aGUgaHcgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgdGltZW91dCkKLXsKLSAgICB1bmlvbiBpY2g4X2h3c19mbGFzaF9jdHJsIGhzZmxjdGw7Ci0gICAgdW5pb24gaWNoOF9od3NfZmxhc2hfc3RhdHVzIGhzZnN0czsKLSAgICBzMzIgZXJyb3IgPSBFMTAwMF9FUlJfRUVQUk9NOwotICAgIHUzMiBpID0gMDsKLQotICAgIC8qIFN0YXJ0IGEgY3ljbGUgYnkgd3JpdGluZyAxIGluIEZsYXNoIEN5Y2xlIEdvIGluIEh3IEZsYXNoIENvbnRyb2wgKi8KLSAgICBoc2ZsY3RsLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMKTsKLSAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsY2dvID0gMTsKLSAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKLQotICAgIC8qIHdhaXQgdGlsbCBGRE9ORSBiaXQgaXMgc2V0IHRvIDEgKi8KLSAgICBkbyB7Ci0gICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7Ci0gICAgICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID09IDEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdWRlbGF5KDEpOwotICAgICAgICBpKys7Ci0gICAgfSB3aGlsZSAoaSA8IHRpbWVvdXQpOwotICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID09IDEgJiYgaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyID09IDApIHsKLSAgICAgICAgZXJyb3IgPSBFMTAwMF9TVUNDRVNTOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJlYWRzIGEgYnl0ZSBvciB3b3JkIGZyb20gdGhlIE5WTSB1c2luZyB0aGUgSUNIOCBmbGFzaCBhY2Nlc3MgcmVnaXN0ZXJzLgotICoKLSAqIGh3IC0gVGhlIHBvaW50ZXIgdG8gdGhlIGh3IHN0cnVjdHVyZQotICogaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGJ5dGUgb3Igd29yZCB0byByZWFkLgotICogc2l6ZSAtIFNpemUgb2YgZGF0YSB0byByZWFkLCAxPWJ5dGUgMj13b3JkCi0gKiBkYXRhIC0gUG9pbnRlciB0byB0aGUgd29yZCB0byBzdG9yZSB0aGUgdmFsdWUgcmVhZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfcmVhZF9pY2g4X2RhdGEoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGluZGV4LCB1MzIgc2l6ZSwKLQkJCQl1MTYgKmRhdGEpCi17Ci0gICAgdW5pb24gaWNoOF9od3NfZmxhc2hfc3RhdHVzIGhzZnN0czsKLSAgICB1bmlvbiBpY2g4X2h3c19mbGFzaF9jdHJsIGhzZmxjdGw7Ci0gICAgdTMyIGZsYXNoX2xpbmVhcl9hZGRyZXNzOwotICAgIHUzMiBmbGFzaF9kYXRhID0gMDsKLSAgICBzMzIgZXJyb3IgPSAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICBzMzIgY291bnQgPSAwOwotCi0gICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX2ljaDhfZGF0YSIpOwotCi0gICAgaWYgKHNpemUgPCAxICB8fCBzaXplID4gMiB8fCBkYXRhID09IE5VTEwgfHwKLSAgICAgICAgaW5kZXggPiBJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSykKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgPSAoSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0sgJiBpbmRleCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaHctPmZsYXNoX2Jhc2VfYWRkcjsKLQotICAgIGRvIHsKLSAgICAgICAgdWRlbGF5KDEpOwotICAgICAgICAvKiBTdGVwcyAqLwotICAgICAgICBlcnJvciA9IGUxMDAwX2ljaDhfY3ljbGVfaW5pdChodyk7Ci0gICAgICAgIGlmIChlcnJvciAhPSBFMTAwMF9TVUNDRVNTKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCk7Ci0gICAgICAgIC8qIDBiLzFiIGNvcnJlc3BvbmRzIHRvIDEgb3IgMiBieXRlIHNpemUsIHJlc3BlY3RpdmVseS4gKi8KLSAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGRiY291bnQgPSBzaXplIC0gMTsKLSAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIX0NZQ0xFX1JFQUQ7Ci0gICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOwotCi0gICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IDI0IGJpdHMgb2YgaW5kZXggaW50byBGbGFzaCBMaW5lYXIgYWRkcmVzcyBmaWVsZCBpbgotICAgICAgICAgKiBGbGFzaCBBZGRyZXNzICovCi0gICAgICAgIC8qIFRPRE86IFRCRCBtYXliZSBjaGVjayB0aGUgaW5kZXggYWdhaW5zdCB0aGUgc2l6ZSBvZiBmbGFzaCAqLwotCi0gICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcoaHcsIElDSF9GTEFTSF9GQUREUiwgZmxhc2hfbGluZWFyX2FkZHJlc3MpOwotCi0gICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShodywgSUNIX0ZMQVNIX0NPTU1BTkRfVElNRU9VVCk7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgRkNFUlIgaXMgc2V0IHRvIDEsIGlmIHNldCB0byAxLCBjbGVhciBpdCBhbmQgdHJ5IHRoZSB3aG9sZQotICAgICAgICAgKiBzZXF1ZW5jZSBhIGZldyBtb3JlIHRpbWVzLCBlbHNlIHJlYWQgaW4gKHNoaWZ0IGluKSB0aGUgRmxhc2ggRGF0YTAsCi0gICAgICAgICAqIHRoZSBvcmRlciBpcyBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IG1zYiB0byBsc2IgKi8KLSAgICAgICAgaWYgKGVycm9yID09IEUxMDAwX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGZsYXNoX2RhdGEgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcoaHcsIElDSF9GTEFTSF9GREFUQTApOwotICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgICAgICpkYXRhID0gKHU4KShmbGFzaF9kYXRhICYgMHgwMDAwMDBGRik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMikgewotICAgICAgICAgICAgICAgICpkYXRhID0gKHUxNikoZmxhc2hfZGF0YSAmIDB4MDAwMEZGRkYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gaGVyZSwgdGhlbiB0aGluZ3MgYXJlIHByb2JhYmx5IGNvbXBsZXRlbHkgaG9zZWQsCi0gICAgICAgICAgICAgKiBidXQgaWYgdGhlIGVycm9yIGNvbmRpdGlvbiBpcyBkZXRlY3RlZCwgaXQgd29uJ3QgaHVydCB0byBnaXZlCi0gICAgICAgICAgICAgKiBpdCBhbm90aGVyIHRyeS4uLklDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgdGltZXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7Ci0gICAgICAgICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyID09IDEpIHsKLSAgICAgICAgICAgICAgICAvKiBSZXBlYXQgZm9yIHNvbWUgdGltZSBiZWZvcmUgZ2l2aW5nIHVwLiAqLwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID09IDApIHsKLSAgICAgICAgICAgICAgICBERUJVR09VVCgiVGltZW91dCBlcnJvciAtIGZsYXNoIGN5Y2xlIGRpZCBub3QgY29tcGxldGUuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChjb3VudCsrIDwgSUNIX0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdyaXRlcyBPbmUgL3R3byBieXRlcyB0byB0aGUgTlZNIHVzaW5nIHRoZSBJQ0g4IGZsYXNoIGFjY2VzcyByZWdpc3RlcnMuCi0gKgotICogaHcgLSBUaGUgcG9pbnRlciB0byB0aGUgaHcgc3RydWN0dXJlCi0gKiBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgYnl0ZS93b3JkIHRvIHJlYWQuCi0gKiBzaXplIC0gU2l6ZSBvZiBkYXRhIHRvIHJlYWQsIDE9Ynl0ZSAyPXdvcmQKLSAqIGRhdGEgLSBUaGUgYnl0ZShzKSB0byB3cml0ZSB0byB0aGUgTlZNLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF93cml0ZV9pY2g4X2RhdGEoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGluZGV4LCB1MzIgc2l6ZSwKLQkJCQkgdTE2IGRhdGEpCi17Ci0gICAgdW5pb24gaWNoOF9od3NfZmxhc2hfc3RhdHVzIGhzZnN0czsKLSAgICB1bmlvbiBpY2g4X2h3c19mbGFzaF9jdHJsIGhzZmxjdGw7Ci0gICAgdTMyIGZsYXNoX2xpbmVhcl9hZGRyZXNzOwotICAgIHUzMiBmbGFzaF9kYXRhID0gMDsKLSAgICBzMzIgZXJyb3IgPSAtRTEwMDBfRVJSX0VFUFJPTTsKLSAgICBzMzIgY291bnQgPSAwOwotCi0gICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9pY2g4X2RhdGEiKTsKLQotICAgIGlmIChzaXplIDwgMSAgfHwgc2l6ZSA+IDIgfHwgZGF0YSA+IHNpemUgKiAweGZmIHx8Ci0gICAgICAgIGluZGV4ID4gSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0spCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGZsYXNoX2xpbmVhcl9hZGRyZXNzID0gKElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLICYgaW5kZXgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5mbGFzaF9iYXNlX2FkZHI7Ci0KLSAgICBkbyB7Ci0gICAgICAgIHVkZWxheSgxKTsKLSAgICAgICAgLyogU3RlcHMgKi8KLSAgICAgICAgZXJyb3IgPSBlMTAwMF9pY2g4X2N5Y2xlX2luaXQoaHcpOwotICAgICAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwpOwotICAgICAgICAvKiAwYi8xYiBjb3JyZXNwb25kcyB0byAxIG9yIDIgYnl0ZSBzaXplLCByZXNwZWN0aXZlbHkuICovCi0gICAgICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxkYmNvdW50ID0gc2l6ZSAtMTsKLSAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIX0NZQ0xFX1dSSVRFOwotICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKLQotICAgICAgICAvKiBXcml0ZSB0aGUgbGFzdCAyNCBiaXRzIG9mIGluZGV4IGludG8gRmxhc2ggTGluZWFyIGFkZHJlc3MgZmllbGQgaW4KLSAgICAgICAgICogRmxhc2ggQWRkcmVzcyAqLwotICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfRkFERFIsIGZsYXNoX2xpbmVhcl9hZGRyZXNzKTsKLQotICAgICAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgICAgICAgZmxhc2hfZGF0YSA9ICh1MzIpZGF0YSAmIDB4MDBGRjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmxhc2hfZGF0YSA9ICh1MzIpZGF0YTsKLQotICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfRkRBVEEwLCBmbGFzaF9kYXRhKTsKLQotICAgICAgICAvKiBjaGVjayBpZiBGQ0VSUiBpcyBzZXQgdG8gMSAsIGlmIHNldCB0byAxLCBjbGVhciBpdCBhbmQgdHJ5IHRoZSB3aG9sZQotICAgICAgICAgKiBzZXF1ZW5jZSBhIGZldyBtb3JlIHRpbWVzIGVsc2UgZG9uZSAqLwotICAgICAgICBlcnJvciA9IGUxMDAwX2ljaDhfZmxhc2hfY3ljbGUoaHcsIElDSF9GTEFTSF9DT01NQU5EX1RJTUVPVVQpOwotICAgICAgICBpZiAoZXJyb3IgPT0gRTEwMDBfU1VDQ0VTUykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSdyZSBoZXJlLCB0aGVuIHRoaW5ncyBhcmUgbW9zdCBsaWtlbHkgY29tcGxldGVseSBob3NlZCwKLSAgICAgICAgICAgICAqIGJ1dCBpZiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIGRldGVjdGVkLCBpdCB3b24ndCBodXJ0IHRvIGdpdmUKLSAgICAgICAgICAgICAqIGl0IGFub3RoZXIgdHJ5Li4uSUNIX0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCB0aW1lcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKLSAgICAgICAgICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNlcnIgPT0gMSkgewotICAgICAgICAgICAgICAgIC8qIFJlcGVhdCBmb3Igc29tZSB0aW1lIGJlZm9yZSBnaXZpbmcgdXAuICovCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUgPT0gMCkgewotICAgICAgICAgICAgICAgIERFQlVHT1VUKCJUaW1lb3V0IGVycm9yIC0gZmxhc2ggY3ljbGUgZGlkIG5vdCBjb21wbGV0ZS4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGNvdW50KysgPCBJQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UKTsKLQotICAgIHJldHVybiBlcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmVhZHMgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBOVk0gdXNpbmcgdGhlIElDSDggZmxhc2ggYWNjZXNzIHJlZ2lzdGVycy4KLSAqCi0gKiBodyAtIHBvaW50ZXIgdG8gZTEwMDBfaHcgc3RydWN0dXJlCi0gKiBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgYnl0ZSB0byByZWFkLgotICogZGF0YSAtIFBvaW50ZXIgdG8gYSBieXRlIHRvIHN0b3JlIHRoZSB2YWx1ZSByZWFkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHMzMiBlMTAwMF9yZWFkX2ljaDhfYnl0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgaW5kZXgsIHU4ICpkYXRhKQotewotICAgIHMzMiBzdGF0dXMgPSBFMTAwMF9TVUNDRVNTOwotICAgIHUxNiB3b3JkID0gMDsKLQotICAgIHN0YXR1cyA9IGUxMDAwX3JlYWRfaWNoOF9kYXRhKGh3LCBpbmRleCwgMSwgJndvcmQpOwotICAgIGlmIChzdGF0dXMgPT0gRTEwMDBfU1VDQ0VTUykgewotICAgICAgICAqZGF0YSA9ICh1OCl3b3JkOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBOVk0gdXNpbmcgdGhlIElDSDggZmxhc2ggYWNjZXNzIHJlZ2lzdGVycy4KLSAqIFBlcmZvcm1zIHZlcmlmaWNhdGlvbiBieSByZWFkaW5nIGJhY2sgdGhlIHZhbHVlIGFuZCB0aGVuIGdvaW5nIHRocm91Z2gKLSAqIGEgcmV0cnkgYWxnb3JpdGhtIGJlZm9yZSBnaXZpbmcgdXAuCi0gKgotICogaHcgLSBwb2ludGVyIHRvIGUxMDAwX2h3IHN0cnVjdHVyZQotICogaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGJ5dGUgdG8gd3JpdGUuCi0gKiBieXRlIC0gVGhlIGJ5dGUgdG8gd3JpdGUgdG8gdGhlIE5WTS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgaW5kZXgsIHU4IGJ5dGUpCi17Ci0gICAgczMyIGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKLSAgICBzMzIgcHJvZ3JhbV9yZXRyaWVzID0gMDsKLQotICAgIERFQlVHT1VUMigiQnl0ZSA6PSAlMi4yWCBPZmZzZXQgOj0gJWRcbiIsIGJ5dGUsIGluZGV4KTsKLQotICAgIGVycm9yID0gZTEwMDBfd3JpdGVfaWNoOF9ieXRlKGh3LCBpbmRleCwgYnl0ZSk7Ci0KLSAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykgewotICAgICAgICBmb3IgKHByb2dyYW1fcmV0cmllcyA9IDA7IHByb2dyYW1fcmV0cmllcyA8IDEwMDsgcHJvZ3JhbV9yZXRyaWVzKyspIHsKLSAgICAgICAgICAgIERFQlVHT1VUMigiUmV0cnlpbmcgXHQgQnl0ZSA6PSAlMi4yWCBPZmZzZXQgOj0gJWRcbiIsIGJ5dGUsIGluZGV4KTsKLSAgICAgICAgICAgIGVycm9yID0gZTEwMDBfd3JpdGVfaWNoOF9ieXRlKGh3LCBpbmRleCwgYnl0ZSk7Ci0gICAgICAgICAgICB1ZGVsYXkoMTAwKTsKLSAgICAgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHByb2dyYW1fcmV0cmllcyA9PSAxMDApCi0gICAgICAgIGVycm9yID0gRTEwMDBfRVJSX0VFUFJPTTsKLQotICAgIHJldHVybiBlcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIE5WTSB1c2luZyB0aGUgSUNIOCBmbGFzaCBhY2Nlc3MgcmVnaXN0ZXJzLgotICoKLSAqIGh3IC0gcG9pbnRlciB0byBlMTAwMF9odyBzdHJ1Y3R1cmUKLSAqIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBieXRlIHRvIHJlYWQuCi0gKiBkYXRhIC0gVGhlIGJ5dGUgdG8gd3JpdGUgdG8gdGhlIE5WTS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfd3JpdGVfaWNoOF9ieXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBpbmRleCwgdTggZGF0YSkKLXsKLSAgICBzMzIgc3RhdHVzID0gRTEwMDBfU1VDQ0VTUzsKLSAgICB1MTYgd29yZCA9ICh1MTYpZGF0YTsKLQotICAgIHN0YXR1cyA9IGUxMDAwX3dyaXRlX2ljaDhfZGF0YShodywgaW5kZXgsIDEsIHdvcmQpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmVhZHMgYSB3b3JkIGZyb20gdGhlIE5WTSB1c2luZyB0aGUgSUNIOCBmbGFzaCBhY2Nlc3MgcmVnaXN0ZXJzLgotICoKLSAqIGh3IC0gcG9pbnRlciB0byBlMTAwMF9odyBzdHJ1Y3R1cmUKLSAqIGluZGV4IC0gVGhlIHN0YXJ0aW5nIGJ5dGUgaW5kZXggb2YgdGhlIHdvcmQgdG8gcmVhZC4KLSAqIGRhdGEgLSBQb2ludGVyIHRvIGEgd29yZCB0byBzdG9yZSB0aGUgdmFsdWUgcmVhZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfcmVhZF9pY2g4X3dvcmQoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIGluZGV4LCB1MTYgKmRhdGEpCi17Ci0gICAgczMyIHN0YXR1cyA9IEUxMDAwX1NVQ0NFU1M7Ci0gICAgc3RhdHVzID0gZTEwMDBfcmVhZF9pY2g4X2RhdGEoaHcsIGluZGV4LCAyLCBkYXRhKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFcmFzZXMgdGhlIGJhbmsgc3BlY2lmaWVkLiBFYWNoIGJhbmsgbWF5IGJlIGEgNCwgOCBvciA2NGsgYmxvY2suIEJhbmtzIGFyZSAwCi0gKiBiYXNlZC4KLSAqCi0gKiBodyAtIHBvaW50ZXIgdG8gZTEwMDBfaHcgc3RydWN0dXJlCi0gKiBiYW5rIC0gMCBmb3IgZmlyc3QgYmFuaywgMSBmb3Igc2Vjb25kIGJhbmsKLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgYWN0dWFsbHkgZXJhc2UgYXMgbXVjaCBhcyA4IG9yIDY0IEtCeXRlcy4gIFRoZQotICogYW1vdW50IG9mIE5WTSB1c2VkIGluIGVhY2ggYmFuayBpcyBhICptaW5pbXVtKiBvZiA0IEtCeXRlcywgYnV0IGluIGZhY3QgdGhlCi0gKiBiYW5rIHNpemUgbWF5IGJlIDQsIDggb3IgNjQgS0J5dGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgczMyIGUxMDAwX2VyYXNlX2ljaDhfNGtfc2VnbWVudChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgYmFuaykKLXsKLSAgICB1bmlvbiBpY2g4X2h3c19mbGFzaF9zdGF0dXMgaHNmc3RzOwotICAgIHVuaW9uIGljaDhfaHdzX2ZsYXNoX2N0cmwgaHNmbGN0bDsKLSAgICB1MzIgZmxhc2hfbGluZWFyX2FkZHJlc3M7Ci0gICAgczMyICBjb3VudCA9IDA7Ci0gICAgczMyICBlcnJvciA9IEUxMDAwX0VSUl9FRVBST007Ci0gICAgczMyICBpdGVyYXRpb247Ci0gICAgczMyICBzdWJfc2VjdG9yX3NpemUgPSAwOwotICAgIHMzMiAgYmFua19zaXplOwotICAgIHMzMiAgaiA9IDA7Ci0gICAgczMyICBlcnJvcl9mbGFnID0gMDsKLQotICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7Ci0KLSAgICAvKiBEZXRlcm1pbmUgSFcgU2VjdG9yIHNpemU6IFJlYWQgQkVSQVNFIGJpdHMgb2YgSHcgZmxhc2ggU3RhdHVzIHJlZ2lzdGVyICovCi0gICAgLyogMDA6IFRoZSBIdyBzZWN0b3IgaXMgMjU2IGJ5dGVzLCBoZW5jZSB3ZSBuZWVkIHRvIGVyYXNlIDE2Ci0gICAgICogICAgIGNvbnNlY3V0aXZlIHNlY3RvcnMuICBUaGUgc3RhcnQgaW5kZXggZm9yIHRoZSBudGggSHcgc2VjdG9yIGNhbiBiZQotICAgICAqICAgICBjYWxjdWxhdGVkIGFzIGJhbmsgKiA0MDk2ICsgbiAqIDI1NgotICAgICAqIDAxOiBUaGUgSHcgc2VjdG9yIGlzIDRLIGJ5dGVzLCBoZW5jZSB3ZSBuZWVkIHRvIGVyYXNlIDEgc2VjdG9yLgotICAgICAqICAgICBUaGUgc3RhcnQgaW5kZXggZm9yIHRoZSBudGggSHcgc2VjdG9yIGNhbiBiZSBjYWxjdWxhdGVkCi0gICAgICogICAgIGFzIGJhbmsgKiA0MDk2Ci0gICAgICogMTA6IFRoZSBIVyBzZWN0b3IgaXMgOEsgYnl0ZXMKLSAgICAgKiAxMTogVGhlIEh3IHNlY3RvciBzaXplIGlzIDY0SyBieXRlcyAqLwotICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5iZXJhc2VzeiA9PSAweDApIHsKLSAgICAgICAgLyogSHcgc2VjdG9yIHNpemUgMjU2ICovCi0gICAgICAgIHN1Yl9zZWN0b3Jfc2l6ZSA9IElDSF9GTEFTSF9TRUdfU0laRV8yNTY7Ci0gICAgICAgIGJhbmtfc2l6ZSA9IElDSF9GTEFTSF9TRUNUT1JfU0laRTsKLSAgICAgICAgaXRlcmF0aW9uID0gSUNIX0ZMQVNIX1NFQ1RPUl9TSVpFIC8gSUNIX0ZMQVNIX1NFR19TSVpFXzI1NjsKLSAgICB9IGVsc2UgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmJlcmFzZXN6ID09IDB4MSkgewotICAgICAgICBiYW5rX3NpemUgPSBJQ0hfRkxBU0hfU0VHX1NJWkVfNEs7Ci0gICAgICAgIGl0ZXJhdGlvbiA9IDE7Ci0gICAgfSBlbHNlIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5iZXJhc2VzeiA9PSAweDMpIHsKLSAgICAgICAgYmFua19zaXplID0gSUNIX0ZMQVNIX1NFR19TSVpFXzY0SzsKLSAgICAgICAgaXRlcmF0aW9uID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgZm9yIChqID0gMDsgaiA8IGl0ZXJhdGlvbiA7IGorKykgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgLyogU3RlcHMgKi8KLSAgICAgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9jeWNsZV9pbml0KGh3KTsKLSAgICAgICAgICAgIGlmIChlcnJvciAhPSBFMTAwMF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JfZmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFdyaXRlIGEgdmFsdWUgMTEgKGJsb2NrIEVyYXNlKSBpbiBGbGFzaCBDeWNsZSBmaWVsZCBpbiBIdyBmbGFzaAotICAgICAgICAgICAgICogQ29udHJvbCAqLwotICAgICAgICAgICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCk7Ci0gICAgICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsY3ljbGUgPSBJQ0hfQ1lDTEVfRVJBU0U7Ci0gICAgICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKLQotICAgICAgICAgICAgLyogV3JpdGUgdGhlIGxhc3QgMjQgYml0cyBvZiBhbiBpbmRleCB3aXRoaW4gdGhlIGJsb2NrIGludG8gRmxhc2gKLSAgICAgICAgICAgICAqIExpbmVhciBhZGRyZXNzIGZpZWxkIGluIEZsYXNoIEFkZHJlc3MuICBUaGlzIHByb2JhYmx5IG5lZWRzIHRvCi0gICAgICAgICAgICAgKiBiZSBjYWxjdWxhdGVkIGhlcmUgYmFzZWQgb2ZmIHRoZSBvbi1jaGlwIGVyYXNlIHNlY3RvciBzaXplIGFuZAotICAgICAgICAgICAgICogdGhlIHNvZnR3YXJlIGJhbmsgc2l6ZSAoNCwgOCBvciA2NCBLQnl0ZXMpICovCi0gICAgICAgICAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyA9IGJhbmsgKiBiYW5rX3NpemUgKyBqICogc3ViX3NlY3Rvcl9zaXplOwotICAgICAgICAgICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgKz0gaHctPmZsYXNoX2Jhc2VfYWRkcjsKLSAgICAgICAgICAgIGZsYXNoX2xpbmVhcl9hZGRyZXNzICY9IElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLOwotCi0gICAgICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfRkFERFIsIGZsYXNoX2xpbmVhcl9hZGRyZXNzKTsKLQotICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKGh3LCBJQ0hfRkxBU0hfRVJBU0VfVElNRU9VVCk7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBGQ0VSUiBpcyBzZXQgdG8gMS4gIElmIDEsIGNsZWFyIGl0IGFuZCB0cnkgdGhlIHdob2xlCi0gICAgICAgICAgICAgKiBzZXF1ZW5jZSBhIGZldyBtb3JlIHRpbWVzIGVsc2UgRG9uZSAqLwotICAgICAgICAgICAgaWYgKGVycm9yID09IEUxMDAwX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKLSAgICAgICAgICAgICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogcmVwZWF0IGZvciBzb21lIHRpbWUgYmVmb3JlIGdpdmluZyB1cCAqLwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBlcnJvcl9mbGFnID0gMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICgoY291bnQgPCBJQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UKSAmJiAhZXJyb3JfZmxhZyk7Ci0gICAgICAgIGlmIChlcnJvcl9mbGFnID09IDEpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGVycm9yX2ZsYWcgIT0gMSkKLSAgICAgICAgZXJyb3IgPSBFMTAwMF9TVUNDRVNTOwotICAgIHJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHMzMiBlMTAwMF9pbml0X2xjZF9mcm9tX252bV9jb25maWdfcmVnaW9uKHN0cnVjdCBlMTAwMF9odyAqaHcsCi0JCQkJCQkgdTMyIGNuZl9iYXNlX2FkZHIsCi0JCQkJCQkgdTMyIGNuZl9zaXplKQotewotICAgIHUzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKLSAgICB1MTYgd29yZF9hZGRyLCByZWdfZGF0YSwgcmVnX2FkZHI7Ci0gICAgdTE2IGk7Ci0KLSAgICAvKiBjbmZfYmFzZV9hZGRyIGlzIGluIERXT1JEICovCi0gICAgd29yZF9hZGRyID0gKHUxNikoY25mX2Jhc2VfYWRkciA8PCAxKTsKLQotICAgIC8qIGNuZl9zaXplIGlzIHJldHVybmVkIGluIHNpemUgb2YgZHdvcmRzICovCi0gICAgZm9yIChpID0gMDsgaSA8IGNuZl9zaXplOyBpKyspIHsKLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCAod29yZF9hZGRyICsgaSoyKSwgMSwgJnJlZ19kYXRhKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsICh3b3JkX2FkZHIgKyBpKjIgKyAxKSwgMSwgJnJlZ19hZGRyKTsKLSAgICAgICAgaWYgKHJldF92YWwpCi0gICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLQotICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X3NvZnR3YXJlX2ZsYWcoaHcpOwotICAgICAgICBpZiAocmV0X3ZhbCAhPSBFMTAwMF9TVUNDRVNTKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsICh1MzIpcmVnX2FkZHIsIHJlZ19kYXRhKTsKLQotICAgICAgICBlMTAwMF9yZWxlYXNlX3NvZnR3YXJlX2ZsYWcoaHcpOwotICAgIH0KLQotICAgIHJldHVybiByZXRfdmFsOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFBIWSBmcm9tIHRoZSBOVk0gb24gSUNIOCBwbGF0Zm9ybXMuIFRoaXMKLSAqIGlzIG5lZWRlZCBkdWUgdG8gYW4gaXNzdWUgd2hlcmUgdGhlIE5WTSBjb25maWd1cmF0aW9uIGlzIG5vdCBwcm9wZXJseQotICogYXV0b2xvYWRlZCBhZnRlciBwb3dlciB0cmFuc2l0aW9ucy4gVGhlcmVmb3JlLCBhZnRlciBlYWNoIFBIWSByZXNldCwgd2UKLSAqIHdpbGwgbG9hZCB0aGUgY29uZmlndXJhdGlvbiBkYXRhIG91dCBvZiB0aGUgTlZNIG1hbnVhbGx5LgotICoKLSAqIGh3OiBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzMzIgZTEwMDBfaW5pdF9sY2RfZnJvbV9udm0oc3RydWN0IGUxMDAwX2h3ICpodykKLXsKLSAgICB1MzIgcmVnX2RhdGEsIGNuZl9iYXNlX2FkZHIsIGNuZl9zaXplLCByZXRfdmFsLCBsb29wOwotCi0gICAgaWYgKGh3LT5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwXzMpCi0gICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0KLSAgICAvKiBDaGVjayBpZiBTVyBuZWVkcyBjb25maWd1cmUgdGhlIFBIWSAqLwotICAgIHJlZ19kYXRhID0gZXIzMihGRVhUTlZNKTsKLSAgICBpZiAoIShyZWdfZGF0YSAmIEZFWFROVk1fU1dfQ09ORklHKSkKLSAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci0KLSAgICAvKiBXYWl0IGZvciBiYXNpYyBjb25maWd1cmF0aW9uIGNvbXBsZXRlcyBiZWZvcmUgcHJvY2VlZGluZyovCi0gICAgbG9vcCA9IDA7Ci0gICAgZG8gewotICAgICAgICByZWdfZGF0YSA9IGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MQU5fSU5JVF9ET05FOwotICAgICAgICB1ZGVsYXkoMTAwKTsKLSAgICAgICAgbG9vcCsrOwotICAgIH0gd2hpbGUgKCghcmVnX2RhdGEpICYmIChsb29wIDwgNTApKTsKLQotICAgIC8qIENsZWFyIHRoZSBJbml0IERvbmUgYml0IGZvciB0aGUgbmV4dCBpbml0IGV2ZW50ICovCi0gICAgcmVnX2RhdGEgPSBlcjMyKFNUQVRVUyk7Ci0gICAgcmVnX2RhdGEgJj0gfkUxMDAwX1NUQVRVU19MQU5fSU5JVF9ET05FOwotICAgIGV3MzIoU1RBVFVTLCByZWdfZGF0YSk7Ci0KLSAgICAvKiBNYWtlIHN1cmUgSFcgZG9lcyBub3QgY29uZmlndXJlIExDRCBmcm9tIFBIWSBleHRlbmRlZCBjb25maWd1cmF0aW9uCi0gICAgICAgYmVmb3JlIFNXIGNvbmZpZ3VyYXRpb24gKi8KLSAgICByZWdfZGF0YSA9IGVyMzIoRVhUQ05GX0NUUkwpOwotICAgIGlmICgocmVnX2RhdGEgJiBFMTAwMF9FWFRDTkZfQ1RSTF9MQ0RfV1JJVEVfRU5BQkxFKSA9PSAweDAwMDApIHsKLSAgICAgICAgcmVnX2RhdGEgPSBlcjMyKEVYVENORl9TSVpFKTsKLSAgICAgICAgY25mX3NpemUgPSByZWdfZGF0YSAmIEUxMDAwX0VYVENORl9TSVpFX0VYVF9QQ0lFX0xFTkdUSDsKLSAgICAgICAgY25mX3NpemUgPj49IDE2OwotICAgICAgICBpZiAoY25mX3NpemUpIHsKLSAgICAgICAgICAgIHJlZ19kYXRhID0gZXIzMihFWFRDTkZfQ1RSTCk7Ci0gICAgICAgICAgICBjbmZfYmFzZV9hZGRyID0gcmVnX2RhdGEgJiBFMTAwMF9FWFRDTkZfQ1RSTF9FWFRfQ05GX1BPSU5URVI7Ci0gICAgICAgICAgICAvKiBjbmZfYmFzZV9hZGRyIGlzIGluIERXT1JEICovCi0gICAgICAgICAgICBjbmZfYmFzZV9hZGRyID4+PSAxNjsKLQotICAgICAgICAgICAgLyogQ29uZmlndXJlIExDRCBmcm9tIGV4dGVuZGVkIGNvbmZpZ3VyYXRpb24gcmVnaW9uLiAqLwotICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2luaXRfbGNkX2Zyb21fbnZtX2NvbmZpZ19yZWdpb24oaHcsIGNuZl9iYXNlX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmZfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAocmV0X3ZhbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaAppbmRleCBhODg2NmJkLi45YWNmZGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKQEAgLTM1LDcgKzM1LDYgQEAKIAogI2luY2x1ZGUgImUxMDAwX29zZGVwLmgiCiAKLQogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgY29kZSAqLwogc3RydWN0IGUxMDAwX2h3Owogc3RydWN0IGUxMDAwX2h3X3N0YXRzOwpAQCAtNDMsMjUyICs0MiwyMzEgQEAKIC8qIEVudW1lcmF0ZWQgdHlwZXMgc3BlY2lmaWMgdG8gdGhlIGUxMDAwIGhhcmR3YXJlICovCiAvKiBNZWRpYSBBY2Nlc3MgQ29udHJvbGVycyAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBlMTAwMF91bmRlZmluZWQgPSAwLAotICAgIGUxMDAwXzgyNTQyX3JldjJfMCwKLSAgICBlMTAwMF84MjU0Ml9yZXYyXzEsCi0gICAgZTEwMDBfODI1NDMsCi0gICAgZTEwMDBfODI1NDQsCi0gICAgZTEwMDBfODI1NDAsCi0gICAgZTEwMDBfODI1NDUsCi0gICAgZTEwMDBfODI1NDVfcmV2XzMsCi0gICAgZTEwMDBfODI1NDYsCi0gICAgZTEwMDBfODI1NDZfcmV2XzMsCi0gICAgZTEwMDBfODI1NDEsCi0gICAgZTEwMDBfODI1NDFfcmV2XzIsCi0gICAgZTEwMDBfODI1NDcsCi0gICAgZTEwMDBfODI1NDdfcmV2XzIsCi0gICAgZTEwMDBfODI1NzEsCi0gICAgZTEwMDBfODI1NzIsCi0gICAgZTEwMDBfODI1NzMsCi0gICAgZTEwMDBfODAwMDNlczJsYW4sCi0gICAgZTEwMDBfaWNoOGxhbiwKLSAgICBlMTAwMF9udW1fbWFjcworCWUxMDAwX3VuZGVmaW5lZCA9IDAsCisJZTEwMDBfODI1NDJfcmV2Ml8wLAorCWUxMDAwXzgyNTQyX3JldjJfMSwKKwllMTAwMF84MjU0MywKKwllMTAwMF84MjU0NCwKKwllMTAwMF84MjU0MCwKKwllMTAwMF84MjU0NSwKKwllMTAwMF84MjU0NV9yZXZfMywKKwllMTAwMF84MjU0NiwKKwllMTAwMF84MjU0Nl9yZXZfMywKKwllMTAwMF84MjU0MSwKKwllMTAwMF84MjU0MV9yZXZfMiwKKwllMTAwMF84MjU0NywKKwllMTAwMF84MjU0N19yZXZfMiwKKwllMTAwMF9udW1fbWFjcwogfSBlMTAwMF9tYWNfdHlwZTsKIAogdHlwZWRlZiBlbnVtIHsKLSAgICBlMTAwMF9lZXByb21fdW5pbml0aWFsaXplZCA9IDAsCi0gICAgZTEwMDBfZWVwcm9tX3NwaSwKLSAgICBlMTAwMF9lZXByb21fbWljcm93aXJlLAotICAgIGUxMDAwX2VlcHJvbV9mbGFzaCwKLSAgICBlMTAwMF9lZXByb21faWNoOCwKLSAgICBlMTAwMF9lZXByb21fbm9uZSwgLyogTm8gTlZNIHN1cHBvcnQgKi8KLSAgICBlMTAwMF9udW1fZWVwcm9tX3R5cGVzCisJZTEwMDBfZWVwcm9tX3VuaW5pdGlhbGl6ZWQgPSAwLAorCWUxMDAwX2VlcHJvbV9zcGksCisJZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSwKKwllMTAwMF9lZXByb21fZmxhc2gsCisJZTEwMDBfZWVwcm9tX25vbmUsCS8qIE5vIE5WTSBzdXBwb3J0ICovCisJZTEwMDBfbnVtX2VlcHJvbV90eXBlcwogfSBlMTAwMF9lZXByb21fdHlwZTsKIAogLyogTWVkaWEgVHlwZXMgKi8KIHR5cGVkZWYgZW51bSB7Ci0gICAgZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIgPSAwLAotICAgIGUxMDAwX21lZGlhX3R5cGVfZmliZXIgPSAxLAotICAgIGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzID0gMiwKLSAgICBlMTAwMF9udW1fbWVkaWFfdHlwZXMKKwllMTAwMF9tZWRpYV90eXBlX2NvcHBlciA9IDAsCisJZTEwMDBfbWVkaWFfdHlwZV9maWJlciA9IDEsCisJZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMgPSAyLAorCWUxMDAwX251bV9tZWRpYV90eXBlcwogfSBlMTAwMF9tZWRpYV90eXBlOwogCiB0eXBlZGVmIGVudW0gewotICAgIGUxMDAwXzEwX2hhbGYgPSAwLAotICAgIGUxMDAwXzEwX2Z1bGwgPSAxLAotICAgIGUxMDAwXzEwMF9oYWxmID0gMiwKLSAgICBlMTAwMF8xMDBfZnVsbCA9IDMKKwllMTAwMF8xMF9oYWxmID0gMCwKKwllMTAwMF8xMF9mdWxsID0gMSwKKwllMTAwMF8xMDBfaGFsZiA9IDIsCisJZTEwMDBfMTAwX2Z1bGwgPSAzCiB9IGUxMDAwX3NwZWVkX2R1cGxleF90eXBlOwogCiAvKiBGbG93IENvbnRyb2wgU2V0dGluZ3MgKi8KIHR5cGVkZWYgZW51bSB7Ci0gICAgRTEwMDBfRkNfTk9ORSA9IDAsCi0gICAgRTEwMDBfRkNfUlhfUEFVU0UgPSAxLAotICAgIEUxMDAwX0ZDX1RYX1BBVVNFID0gMiwKLSAgICBFMTAwMF9GQ19GVUxMID0gMywKLSAgICBFMTAwMF9GQ19ERUZBVUxUID0gMHhGRgorCUUxMDAwX0ZDX05PTkUgPSAwLAorCUUxMDAwX0ZDX1JYX1BBVVNFID0gMSwKKwlFMTAwMF9GQ19UWF9QQVVTRSA9IDIsCisJRTEwMDBfRkNfRlVMTCA9IDMsCisJRTEwMDBfRkNfREVGQVVMVCA9IDB4RkYKIH0gZTEwMDBfZmNfdHlwZTsKIAogc3RydWN0IGUxMDAwX3NoYWRvd19yYW0gewotICAgIHUxNiBlZXByb21fd29yZDsKLSAgICBib29sIG1vZGlmaWVkOworCXUxNiBlZXByb21fd29yZDsKKwlib29sIG1vZGlmaWVkOwogfTsKIAogLyogUENJIGJ1cyB0eXBlcyAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBlMTAwMF9idXNfdHlwZV91bmtub3duID0gMCwKLSAgICBlMTAwMF9idXNfdHlwZV9wY2ksCi0gICAgZTEwMDBfYnVzX3R5cGVfcGNpeCwKLSAgICBlMTAwMF9idXNfdHlwZV9wY2lfZXhwcmVzcywKLSAgICBlMTAwMF9idXNfdHlwZV9yZXNlcnZlZAorCWUxMDAwX2J1c190eXBlX3Vua25vd24gPSAwLAorCWUxMDAwX2J1c190eXBlX3BjaSwKKwllMTAwMF9idXNfdHlwZV9wY2l4LAorCWUxMDAwX2J1c190eXBlX3Jlc2VydmVkCiB9IGUxMDAwX2J1c190eXBlOwogCiAvKiBQQ0kgYnVzIHNwZWVkcyAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBlMTAwMF9idXNfc3BlZWRfdW5rbm93biA9IDAsCi0gICAgZTEwMDBfYnVzX3NwZWVkXzMzLAotICAgIGUxMDAwX2J1c19zcGVlZF82NiwKLSAgICBlMTAwMF9idXNfc3BlZWRfMTAwLAotICAgIGUxMDAwX2J1c19zcGVlZF8xMjAsCi0gICAgZTEwMDBfYnVzX3NwZWVkXzEzMywKLSAgICBlMTAwMF9idXNfc3BlZWRfMjUwMCwKLSAgICBlMTAwMF9idXNfc3BlZWRfcmVzZXJ2ZWQKKwllMTAwMF9idXNfc3BlZWRfdW5rbm93biA9IDAsCisJZTEwMDBfYnVzX3NwZWVkXzMzLAorCWUxMDAwX2J1c19zcGVlZF82NiwKKwllMTAwMF9idXNfc3BlZWRfMTAwLAorCWUxMDAwX2J1c19zcGVlZF8xMjAsCisJZTEwMDBfYnVzX3NwZWVkXzEzMywKKwllMTAwMF9idXNfc3BlZWRfcmVzZXJ2ZWQKIH0gZTEwMDBfYnVzX3NwZWVkOwogCiAvKiBQQ0kgYnVzIHdpZHRocyAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBlMTAwMF9idXNfd2lkdGhfdW5rbm93biA9IDAsCi0gICAgLyogVGhlc2UgUENJZSB2YWx1ZXMgc2hvdWxkIGxpdGVyYWxseSBtYXRjaCB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcwotICAgICAqIGZyb20gY29uZmlnIHNwYWNlICovCi0gICAgZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzEgPSAxLAotICAgIGUxMDAwX2J1c193aWR0aF9wY2lleF8yID0gMiwKLSAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfNCA9IDQsCi0gICAgZTEwMDBfYnVzX3dpZHRoXzMyLAotICAgIGUxMDAwX2J1c193aWR0aF82NCwKLSAgICBlMTAwMF9idXNfd2lkdGhfcmVzZXJ2ZWQKKwllMTAwMF9idXNfd2lkdGhfdW5rbm93biA9IDAsCisJZTEwMDBfYnVzX3dpZHRoXzMyLAorCWUxMDAwX2J1c193aWR0aF82NCwKKwllMTAwMF9idXNfd2lkdGhfcmVzZXJ2ZWQKIH0gZTEwMDBfYnVzX3dpZHRoOwogCiAvKiBQSFkgc3RhdHVzIGluZm8gc3RydWN0dXJlIGFuZCBzdXBwb3J0aW5nIGVudW1zICovCiB0eXBlZGVmIGVudW0gewotICAgIGUxMDAwX2NhYmxlX2xlbmd0aF81MCA9IDAsCi0gICAgZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwLAotICAgIGUxMDAwX2NhYmxlX2xlbmd0aF84MF8xMTAsCi0gICAgZTEwMDBfY2FibGVfbGVuZ3RoXzExMF8xNDAsCi0gICAgZTEwMDBfY2FibGVfbGVuZ3RoXzE0MCwKLSAgICBlMTAwMF9jYWJsZV9sZW5ndGhfdW5kZWZpbmVkID0gMHhGRgorCWUxMDAwX2NhYmxlX2xlbmd0aF81MCA9IDAsCisJZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwLAorCWUxMDAwX2NhYmxlX2xlbmd0aF84MF8xMTAsCisJZTEwMDBfY2FibGVfbGVuZ3RoXzExMF8xNDAsCisJZTEwMDBfY2FibGVfbGVuZ3RoXzE0MCwKKwllMTAwMF9jYWJsZV9sZW5ndGhfdW5kZWZpbmVkID0gMHhGRgogfSBlMTAwMF9jYWJsZV9sZW5ndGg7CiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgZTEwMDBfZ2dfY2FibGVfbGVuZ3RoXzYwID0gMCwKLSAgICBlMTAwMF9nZ19jYWJsZV9sZW5ndGhfNjBfMTE1ID0gMSwKLSAgICBlMTAwMF9nZ19jYWJsZV9sZW5ndGhfMTE1XzE1MCA9IDIsCi0gICAgZTEwMDBfZ2dfY2FibGVfbGVuZ3RoXzE1MCA9IDQKKwllMTAwMF9nZ19jYWJsZV9sZW5ndGhfNjAgPSAwLAorCWUxMDAwX2dnX2NhYmxlX2xlbmd0aF82MF8xMTUgPSAxLAorCWUxMDAwX2dnX2NhYmxlX2xlbmd0aF8xMTVfMTUwID0gMiwKKwllMTAwMF9nZ19jYWJsZV9sZW5ndGhfMTUwID0gNAogfSBlMTAwMF9nZ19jYWJsZV9sZW5ndGg7CiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMCAgPSAxMCwKLSAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzIwICA9IDIwLAotICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMzAgID0gMzAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF80MCAgPSA0MCwKLSAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwICA9IDUwLAotICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNjAgID0gNjAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF83MCAgPSA3MCwKLSAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzgwICA9IDgwLAotICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfOTAgID0gOTAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMDAgPSAxMDAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTAgPSAxMTAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTUgPSAxMTUsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMjAgPSAxMjAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMzAgPSAxMzAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNDAgPSAxNDAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNTAgPSAxNTAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNjAgPSAxNjAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNzAgPSAxNzAsCi0gICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xODAgPSAxODAKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEwID0gMTAsCisJZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8yMCA9IDIwLAorCWUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMzAgPSAzMCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzQwID0gNDAsCisJZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCA9IDUwLAorCWUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNjAgPSA2MCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzcwID0gNzAsCisJZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF84MCA9IDgwLAorCWUxMDAwX2lncF9jYWJsZV9sZW5ndGhfOTAgPSA5MCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEwMCA9IDEwMCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMCA9IDExMCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExNSA9IDExNSwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEyMCA9IDEyMCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEzMCA9IDEzMCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE0MCA9IDE0MCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE1MCA9IDE1MCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE2MCA9IDE2MCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE3MCA9IDE3MCwKKwllMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE4MCA9IDE4MAogfSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoOwogCiB0eXBlZGVmIGVudW0gewotICAgIGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbCA9IDAsCi0gICAgZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbG93ZXIsCi0gICAgZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfdW5kZWZpbmVkID0gMHhGRgorCWUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbCA9IDAsCisJZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbG93ZXIsCisJZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfdW5kZWZpbmVkID0gMHhGRgogfSBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZTsKIAogdHlwZWRlZiBlbnVtIHsKLSAgICBlMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsID0gMCwKLSAgICBlMTAwMF9yZXZfcG9sYXJpdHlfcmV2ZXJzZWQsCi0gICAgZTEwMDBfcmV2X3BvbGFyaXR5X3VuZGVmaW5lZCA9IDB4RkYKKwllMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsID0gMCwKKwllMTAwMF9yZXZfcG9sYXJpdHlfcmV2ZXJzZWQsCisJZTEwMDBfcmV2X3BvbGFyaXR5X3VuZGVmaW5lZCA9IDB4RkYKIH0gZTEwMDBfcmV2X3BvbGFyaXR5OwogCiB0eXBlZGVmIGVudW0gewotICAgIGUxMDAwX2Rvd25zaGlmdF9ub3JtYWwgPSAwLAotICAgIGUxMDAwX2Rvd25zaGlmdF9hY3RpdmF0ZWQsCi0gICAgZTEwMDBfZG93bnNoaWZ0X3VuZGVmaW5lZCA9IDB4RkYKKwllMTAwMF9kb3duc2hpZnRfbm9ybWFsID0gMCwKKwllMTAwMF9kb3duc2hpZnRfYWN0aXZhdGVkLAorCWUxMDAwX2Rvd25zaGlmdF91bmRlZmluZWQgPSAweEZGCiB9IGUxMDAwX2Rvd25zaGlmdDsKIAogdHlwZWRlZiBlbnVtIHsKLSAgICBlMTAwMF9zbWFydF9zcGVlZF9kZWZhdWx0ID0gMCwKLSAgICBlMTAwMF9zbWFydF9zcGVlZF9vbiwKLSAgICBlMTAwMF9zbWFydF9zcGVlZF9vZmYKKwllMTAwMF9zbWFydF9zcGVlZF9kZWZhdWx0ID0gMCwKKwllMTAwMF9zbWFydF9zcGVlZF9vbiwKKwllMTAwMF9zbWFydF9zcGVlZF9vZmYKIH0gZTEwMDBfc21hcnRfc3BlZWQ7CiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZW5hYmxlZCA9IDAsCi0gICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZGlzYWJsZWQsCi0gICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfdW5kZWZpbmVkID0gMHhGRgorCWUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2VuYWJsZWQgPSAwLAorCWUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2Rpc2FibGVkLAorCWUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3VuZGVmaW5lZCA9IDB4RkYKIH0gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWw7CiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgZTEwMDBfYXV0b194X21vZGVfbWFudWFsX21kaSA9IDAsCi0gICAgZTEwMDBfYXV0b194X21vZGVfbWFudWFsX21kaXgsCi0gICAgZTEwMDBfYXV0b194X21vZGVfYXV0bzEsCi0gICAgZTEwMDBfYXV0b194X21vZGVfYXV0bzIsCi0gICAgZTEwMDBfYXV0b194X21vZGVfdW5kZWZpbmVkID0gMHhGRgorCWUxMDAwX2F1dG9feF9tb2RlX21hbnVhbF9tZGkgPSAwLAorCWUxMDAwX2F1dG9feF9tb2RlX21hbnVhbF9tZGl4LAorCWUxMDAwX2F1dG9feF9tb2RlX2F1dG8xLAorCWUxMDAwX2F1dG9feF9tb2RlX2F1dG8yLAorCWUxMDAwX2F1dG9feF9tb2RlX3VuZGVmaW5lZCA9IDB4RkYKIH0gZTEwMDBfYXV0b194X21vZGU7CiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vayA9IDAsCi0gICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rLAotICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQgPSAweEZGCisJZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vayA9IDAsCisJZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rLAorCWUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQgPSAweEZGCiB9IGUxMDAwXzEwMDB0X3J4X3N0YXR1czsKIAogdHlwZWRlZiBlbnVtIHsKICAgICBlMTAwMF9waHlfbTg4ID0gMCwKICAgICBlMTAwMF9waHlfaWdwLAotICAgIGUxMDAwX3BoeV9pZ3BfMiwKLSAgICBlMTAwMF9waHlfZ2c4MjU2MywKLSAgICBlMTAwMF9waHlfaWdwXzMsCi0gICAgZTEwMDBfcGh5X2lmZSwKICAgICBlMTAwMF9waHlfdW5kZWZpbmVkID0gMHhGRgogfSBlMTAwMF9waHlfdHlwZTsKIAogdHlwZWRlZiBlbnVtIHsKLSAgICBlMTAwMF9tc19od19kZWZhdWx0ID0gMCwKLSAgICBlMTAwMF9tc19mb3JjZV9tYXN0ZXIsCi0gICAgZTEwMDBfbXNfZm9yY2Vfc2xhdmUsCi0gICAgZTEwMDBfbXNfYXV0bworCWUxMDAwX21zX2h3X2RlZmF1bHQgPSAwLAorCWUxMDAwX21zX2ZvcmNlX21hc3RlciwKKwllMTAwMF9tc19mb3JjZV9zbGF2ZSwKKwllMTAwMF9tc19hdXRvCiB9IGUxMDAwX21zX3R5cGU7CiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkID0gMCwKLSAgICBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSwKLSAgICBlMTAwMF9mZmVfY29uZmlnX2Jsb2NrZWQKKwllMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQgPSAwLAorCWUxMDAwX2ZmZV9jb25maWdfYWN0aXZlLAorCWUxMDAwX2ZmZV9jb25maWdfYmxvY2tlZAogfSBlMTAwMF9mZmVfY29uZmlnOwogCiB0eXBlZGVmIGVudW0gewotICAgIGUxMDAwX2RzcF9jb25maWdfZGlzYWJsZWQgPSAwLAotICAgIGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZCwKLSAgICBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCwKLSAgICBlMTAwMF9kc3BfY29uZmlnX3VuZGVmaW5lZCA9IDB4RkYKKwllMTAwMF9kc3BfY29uZmlnX2Rpc2FibGVkID0gMCwKKwllMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQsCisJZTEwMDBfZHNwX2NvbmZpZ19hY3RpdmF0ZWQsCisJZTEwMDBfZHNwX2NvbmZpZ191bmRlZmluZWQgPSAweEZGCiB9IGUxMDAwX2RzcF9jb25maWc7CiAKIHN0cnVjdCBlMTAwMF9waHlfaW5mbyB7Ci0gICAgZTEwMDBfY2FibGVfbGVuZ3RoIGNhYmxlX2xlbmd0aDsKLSAgICBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZSBleHRlbmRlZF8xMGJ0X2Rpc3RhbmNlOwotICAgIGUxMDAwX3Jldl9wb2xhcml0eSBjYWJsZV9wb2xhcml0eTsKLSAgICBlMTAwMF9kb3duc2hpZnQgZG93bnNoaWZ0OwotICAgIGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsIHBvbGFyaXR5X2NvcnJlY3Rpb247Ci0gICAgZTEwMDBfYXV0b194X21vZGUgbWRpeF9tb2RlOwotICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1cyBsb2NhbF9yeDsKLSAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXMgcmVtb3RlX3J4OworCWUxMDAwX2NhYmxlX2xlbmd0aCBjYWJsZV9sZW5ndGg7CisJZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGUgZXh0ZW5kZWRfMTBidF9kaXN0YW5jZTsKKwllMTAwMF9yZXZfcG9sYXJpdHkgY2FibGVfcG9sYXJpdHk7CisJZTEwMDBfZG93bnNoaWZ0IGRvd25zaGlmdDsKKwllMTAwMF9wb2xhcml0eV9yZXZlcnNhbCBwb2xhcml0eV9jb3JyZWN0aW9uOworCWUxMDAwX2F1dG9feF9tb2RlIG1kaXhfbW9kZTsKKwllMTAwMF8xMDAwdF9yeF9zdGF0dXMgbG9jYWxfcng7CisJZTEwMDBfMTAwMHRfcnhfc3RhdHVzIHJlbW90ZV9yeDsKIH07CiAKIHN0cnVjdCBlMTAwMF9waHlfc3RhdHMgewotICAgIHUzMiBpZGxlX2Vycm9yczsKLSAgICB1MzIgcmVjZWl2ZV9lcnJvcnM7CisJdTMyIGlkbGVfZXJyb3JzOworCXUzMiByZWNlaXZlX2Vycm9yczsKIH07CiAKIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyB7Ci0gICAgZTEwMDBfZWVwcm9tX3R5cGUgdHlwZTsKLSAgICB1MTYgd29yZF9zaXplOwotICAgIHUxNiBvcGNvZGVfYml0czsKLSAgICB1MTYgYWRkcmVzc19iaXRzOwotICAgIHUxNiBkZWxheV91c2VjOwotICAgIHUxNiBwYWdlX3NpemU7Ci0gICAgYm9vbCB1c2VfZWVyZDsKLSAgICBib29sIHVzZV9lZXdyOworCWUxMDAwX2VlcHJvbV90eXBlIHR5cGU7CisJdTE2IHdvcmRfc2l6ZTsKKwl1MTYgb3Bjb2RlX2JpdHM7CisJdTE2IGFkZHJlc3NfYml0czsKKwl1MTYgZGVsYXlfdXNlYzsKKwl1MTYgcGFnZV9zaXplOwogfTsKIAogLyogRmxleCBBU0YgSW5mb3JtYXRpb24gKi8KICNkZWZpbmUgRTEwMDBfSE9TVF9JRl9NQVhfU0laRSAgMjA0OAogCiB0eXBlZGVmIGVudW0gewotICAgIGUxMDAwX2J5dGVfYWxpZ24gPSAwLAotICAgIGUxMDAwX3dvcmRfYWxpZ24gPSAxLAotICAgIGUxMDAwX2R3b3JkX2FsaWduID0gMgorCWUxMDAwX2J5dGVfYWxpZ24gPSAwLAorCWUxMDAwX3dvcmRfYWxpZ24gPSAxLAorCWUxMDAwX2R3b3JkX2FsaWduID0gMgogfSBlMTAwMF9hbGlnbl90eXBlOwogCi0KLQogLyogRXJyb3IgQ29kZXMgKi8KICNkZWZpbmUgRTEwMDBfU1VDQ0VTUyAgICAgIDAKICNkZWZpbmUgRTEwMDBfRVJSX0VFUFJPTSAgIDEKQEAgLTMwMSw3ICsyNzksNiBAQAogI2RlZmluZSBFMTAwMF9FUlJfTUFTVEVSX1JFUVVFU1RTX1BFTkRJTkcgMTAKICNkZWZpbmUgRTEwMDBfRVJSX0hPU1RfSU5URVJGQUNFX0NPTU1BTkQgMTEKICNkZWZpbmUgRTEwMDBfQkxLX1BIWV9SRVNFVCAgIDEyCi0jZGVmaW5lIEUxMDAwX0VSUl9TV0ZXX1NZTkMgMTMKIAogI2RlZmluZSBFMTAwMF9CWVRFX1NXQVBfV09SRChfdmFsdWUpICgoKChfdmFsdWUpICYgMHgwMGZmKSA8PCA4KSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfdmFsdWUpICYgMHhmZjAwKSA+PiA4KSkKQEAgLTMxOCwxOSArMjk1LDE3IEBACiBzMzIgZTEwMDBfcGh5X3NldHVwX2F1dG9uZWcoc3RydWN0IGUxMDAwX2h3ICpodyk7CiB2b2lkIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHMzMiBlMTAwMF9jaGVja19mb3JfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLXMzMiBlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgKnNwZWVkLCB1MTYgKmR1cGxleCk7CitzMzIgZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2ICogc3BlZWQsIHUxNiAqIGR1cGxleCk7CiBzMzIgZTEwMDBfZm9yY2VfbWFjX2ZjKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogCiAvKiBQSFkgKi8KLXMzMiBlMTAwMF9yZWFkX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZ19hZGRyLCB1MTYgKnBoeV9kYXRhKTsKK3MzMiBlMTAwMF9yZWFkX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZ19hZGRyLCB1MTYgKiBwaHlfZGF0YSk7CiBzMzIgZTEwMDBfd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgcmVnX2FkZHIsIHUxNiBkYXRhKTsKIHMzMiBlMTAwMF9waHlfaHdfcmVzZXQoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzMzIgZTEwMDBfcGh5X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpOwogczMyIGUxMDAwX3BoeV9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKTsKIHMzMiBlMTAwMF92YWxpZGF0ZV9tZGlfc2V0dGluZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIAotdm9pZCBlMTAwMF9waHlfcG93ZXJkb3duX3dvcmthcm91bmQoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci0KIC8qIEVFUFJPTSBGdW5jdGlvbnMgKi8KIHMzMiBlMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMoc3RydWN0IGUxMDAwX2h3ICpodyk7CiAKQEAgLTMzOCw2NiArMzEzLDYzIEBACiB1MzIgZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUoc3RydWN0IGUxMDAwX2h3ICpodyk7CiAKICNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfVFhfUEFZTE9BRF9DTUQgICA2NAotI2RlZmluZSBFMTAwMF9ISV9NQVhfTU5HX0RBVEFfTEVOR1RIICAgIDB4NkY4ICAgLyogSG9zdCBJbnRlcmZhY2UgZGF0YSBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfSElfTUFYX01OR19EQVRBX0xFTkdUSCAgICAweDZGOAkvKiBIb3N0IEludGVyZmFjZSBkYXRhIGxlbmd0aCAqLwogCi0jZGVmaW5lIEUxMDAwX01OR19ESENQX0NPTU1BTkRfVElNRU9VVCAgMTAgICAgICAvKiBUaW1lIGluIG1zIHRvIHByb2Nlc3MgTU5HIGNvbW1hbmQgKi8KLSNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX09GRlNFVCAgICAweDZGMCAgIC8qIENvb2tpZSBvZmZzZXQgKi8KLSNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX0xFTkdUSCAgICAweDEwICAgIC8qIENvb2tpZSBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09NTUFORF9USU1FT1VUICAxMAkvKiBUaW1lIGluIG1zIHRvIHByb2Nlc3MgTU5HIGNvbW1hbmQgKi8KKyNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX09GRlNFVCAgICAweDZGMAkvKiBDb29raWUgb2Zmc2V0ICovCisjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPT0tJRV9MRU5HVEggICAgMHgxMAkvKiBDb29raWUgbGVuZ3RoICovCiAjZGVmaW5lIEUxMDAwX01OR19JQU1UX01PREUgICAgICAgICAgICAgMHgzCiAjZGVmaW5lIEUxMDAwX01OR19JQ0hfSUFNVF9NT0RFICAgICAgICAgMHgyCi0jZGVmaW5lIEUxMDAwX0lBTVRfU0lHTkFUVVJFICAgICAgICAgICAgMHg1NDRENDE0OSAvKiBJbnRlbChSKSBBY3RpdmUgTWFuYWdlbWVudCBUZWNobm9sb2d5IHNpZ25hdHVyZSAqLworI2RlZmluZSBFMTAwMF9JQU1UX1NJR05BVFVSRSAgICAgICAgICAgIDB4NTQ0RDQxNDkJLyogSW50ZWwoUikgQWN0aXZlIE1hbmFnZW1lbnQgVGVjaG5vbG9neSBzaWduYXR1cmUgKi8KIAotI2RlZmluZSBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1BBUlNJTkdfU1VQUE9SVCAweDEgLyogREhDUCBwYXJzaW5nIGVuYWJsZWQgKi8KLSNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX1NUQVRVU19WTEFOX1NVUFBPUlQgICAgMHgyIC8qIERIQ1AgcGFyc2luZyBlbmFibGVkICovCisjZGVmaW5lIEUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfUEFSU0lOR19TVVBQT1JUIDB4MQkvKiBESENQIHBhcnNpbmcgZW5hYmxlZCAqLworI2RlZmluZSBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCAgICAweDIJLyogREhDUCBwYXJzaW5nIGVuYWJsZWQgKi8KICNkZWZpbmUgRTEwMDBfVkZUQV9FTlRSWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMHg1CiAjZGVmaW5lIEUxMDAwX1ZGVEFfRU5UUllfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YKICNkZWZpbmUgRTEwMDBfVkZUQV9FTlRSWV9CSVRfU0hJRlRfTUFTSyAgICAgICAgICAgICAgMHgxRgogCiBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIgewotICAgIHU4IGNvbW1hbmRfaWQ7Ci0gICAgdTggY2hlY2tzdW07Ci0gICAgdTE2IHJlc2VydmVkMTsKLSAgICB1MTYgcmVzZXJ2ZWQyOwotICAgIHUxNiBjb21tYW5kX2xlbmd0aDsKKwl1OCBjb21tYW5kX2lkOworCXU4IGNoZWNrc3VtOworCXUxNiByZXNlcnZlZDE7CisJdTE2IHJlc2VydmVkMjsKKwl1MTYgY29tbWFuZF9sZW5ndGg7CiB9OwogCiBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9pbmZvIHsKLSAgICBzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfY29tbWFuZF9oZWFkZXIgY29tbWFuZF9oZWFkZXI7ICAvKiBDb21tYW5kIEhlYWQvQ29tbWFuZCBSZXN1bHQgSGVhZCBoYXMgNCBieXRlcyAqLwotICAgIHU4IGNvbW1hbmRfZGF0YVtFMTAwMF9ISV9NQVhfTU5HX0RBVEFfTEVOR1RIXTsgICAvKiBDb21tYW5kIGRhdGEgY2FuIGxlbmd0aCAwLi4weDY1OCovCisJc3RydWN0IGUxMDAwX2hvc3RfbW5nX2NvbW1hbmRfaGVhZGVyIGNvbW1hbmRfaGVhZGVyOwkvKiBDb21tYW5kIEhlYWQvQ29tbWFuZCBSZXN1bHQgSGVhZCBoYXMgNCBieXRlcyAqLworCXU4IGNvbW1hbmRfZGF0YVtFMTAwMF9ISV9NQVhfTU5HX0RBVEFfTEVOR1RIXTsJLyogQ29tbWFuZCBkYXRhIGNhbiBsZW5ndGggMC4uMHg2NTggKi8KIH07CiAjaWZkZWYgX19CSUdfRU5ESUFOCi1zdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfZGhjcF9jb29raWV7Ci0gICAgdTMyIHNpZ25hdHVyZTsKLSAgICB1MTYgdmxhbl9pZDsKLSAgICB1OCByZXNlcnZlZDA7Ci0gICAgdTggc3RhdHVzOwotICAgIHUzMiByZXNlcnZlZDE7Ci0gICAgdTggY2hlY2tzdW07Ci0gICAgdTggcmVzZXJ2ZWQzOwotICAgIHUxNiByZXNlcnZlZDI7CitzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfZGhjcF9jb29raWUgeworCXUzMiBzaWduYXR1cmU7CisJdTE2IHZsYW5faWQ7CisJdTggcmVzZXJ2ZWQwOworCXU4IHN0YXR1czsKKwl1MzIgcmVzZXJ2ZWQxOworCXU4IGNoZWNrc3VtOworCXU4IHJlc2VydmVkMzsKKwl1MTYgcmVzZXJ2ZWQyOwogfTsKICNlbHNlCi1zdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfZGhjcF9jb29raWV7Ci0gICAgdTMyIHNpZ25hdHVyZTsKLSAgICB1OCBzdGF0dXM7Ci0gICAgdTggcmVzZXJ2ZWQwOwotICAgIHUxNiB2bGFuX2lkOwotICAgIHUzMiByZXNlcnZlZDE7Ci0gICAgdTE2IHJlc2VydmVkMjsKLSAgICB1OCByZXNlcnZlZDM7Ci0gICAgdTggY2hlY2tzdW07CitzdHJ1Y3QgZTEwMDBfaG9zdF9tbmdfZGhjcF9jb29raWUgeworCXUzMiBzaWduYXR1cmU7CisJdTggc3RhdHVzOworCXU4IHJlc2VydmVkMDsKKwl1MTYgdmxhbl9pZDsKKwl1MzIgcmVzZXJ2ZWQxOworCXUxNiByZXNlcnZlZDI7CisJdTggcmVzZXJ2ZWQzOworCXU4IGNoZWNrc3VtOwogfTsKICNlbmRpZgogCi1zMzIgZTEwMDBfbW5nX3dyaXRlX2RoY3BfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1OCAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBsZW5ndGgpOwogYm9vbCBlMTAwMF9jaGVja19tbmdfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLWJvb2wgZTEwMDBfZW5hYmxlX3R4X3BrdF9maWx0ZXJpbmcoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zMzIgZTEwMDBfcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IHJlZywgdTE2IHdvcmRzLCB1MTYgKmRhdGEpOworczMyIGUxMDAwX3JlYWRfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiByZWcsIHUxNiB3b3JkcywgdTE2ICogZGF0YSk7CiBzMzIgZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogczMyIGUxMDAwX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zMzIgZTEwMDBfd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiByZWcsIHUxNiB3b3JkcywgdTE2ICpkYXRhKTsKLXMzMiBlMTAwMF9yZWFkX21hY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqIGh3KTsKK3MzMiBlMTAwMF93cml0ZV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IHJlZywgdTE2IHdvcmRzLCB1MTYgKiBkYXRhKTsKK3MzMiBlMTAwMF9yZWFkX21hY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogCiAvKiBGaWx0ZXJzIChtdWx0aWNhc3QsIHZsYW4sIHJlY2VpdmUpICovCiB1MzIgZTEwMDBfaGFzaF9tY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICogbWNfYWRkcik7CkBAIC00MTcsMTggKzM4OSwxNSBAQAogLyogRXZlcnl0aGluZyBlbHNlICovCiB2b2lkIGUxMDAwX3Jlc2V0X2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogdm9pZCBlMTAwMF91cGRhdGVfYWRhcHRpdmUoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci12b2lkIGUxMDAwX3RiaV9hZGp1c3Rfc3RhdHMoc3RydWN0IGUxMDAwX2h3ICpodywgc3RydWN0IGUxMDAwX2h3X3N0YXRzICpzdGF0cywgdTMyIGZyYW1lX2xlbiwgdTggKiBtYWNfYWRkcik7Cit2b2lkIGUxMDAwX3RiaV9hZGp1c3Rfc3RhdHMoc3RydWN0IGUxMDAwX2h3ICpodywgc3RydWN0IGUxMDAwX2h3X3N0YXRzICpzdGF0cywKKwkJCSAgICB1MzIgZnJhbWVfbGVuLCB1OCAqIG1hY19hZGRyKTsKIHZvaWQgZTEwMDBfZ2V0X2J1c19pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogdm9pZCBlMTAwMF9wY2lfc2V0X213aShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHZvaWQgZTEwMDBfcGNpX2NsZWFyX213aShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLXMzMiBlMTAwMF9yZWFkX3BjaWVfY2FwX3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgcmVnLCB1MTYgKnZhbHVlKTsKIHZvaWQgZTEwMDBfcGNpeF9zZXRfbW1yYmMoc3RydWN0IGUxMDAwX2h3ICpodywgaW50IG1tcmJjKTsKIGludCBlMTAwMF9wY2l4X2dldF9tbXJiYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIC8qIFBvcnQgSS9PIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgyNTQ0IGFuZCBuZXdlciAqLwogdm9pZCBlMTAwMF9pb193cml0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHBvcnQsIHUzMiB2YWx1ZSk7Ci1zMzIgZTEwMDBfZGlzYWJsZV9wY2lleF9tYXN0ZXIoc3RydWN0IGUxMDAwX2h3ICpodyk7Ci1zMzIgZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKHN0cnVjdCBlMTAwMF9odyAqaHcpOwotCiAKICNkZWZpbmUgRTEwMDBfUkVBRF9SRUdfSU8oYSwgcmVnKSBcCiAgICAgZTEwMDBfcmVhZF9yZWdfaW8oKGEpLCBFMTAwMF8jI3JlZykKQEAgLTQ3MSwzNiArNDQwLDcgQEAKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVIgMHgxMDk5CiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0N0VJICAgICAgICAgICAgIDB4MTAxOQogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDdFSV9NT0JJTEUgICAgICAweDEwMUEKLSNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfQ09QUEVSICAgICAgMHgxMDVFCi0jZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MUVCX0ZJQkVSICAgICAgIDB4MTA1RgotI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9TRVJERVMgICAgICAweDEwNjAKLSNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVIgMHgxMEE0Ci0jZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MVBUX1FVQURfQ09QUEVSIDB4MTBENQotI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0ZJQkVSICAweDEwQTUKLSNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVJfTE9XUFJPRklMRSAgMHgxMEJDCi0jZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFU19EVUFMIDB4MTBEOQotI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9TRVJERVNfUVVBRCAweDEwREEKLSNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcyRUlfQ09QUEVSICAgICAgMHgxMDdECi0jZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MkVJX0ZJQkVSICAgICAgIDB4MTA3RQotI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzJFSV9TRVJERVMgICAgICAweDEwN0YKLSNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcyRUkgICAgICAgICAgICAgMHgxMEI5Ci0jZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3M0UgICAgICAgICAgICAgIDB4MTA4QgotI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzNFX0lBTVQgICAgICAgICAweDEwOEMKLSNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTczTCAgICAgICAgICAgICAgMHgxMDlBCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSX0tTUDMgMHgxMEI1Ci0jZGVmaW5lIEUxMDAwX0RFVl9JRF84MDAwM0VTMkxBTl9DT1BQRVJfRFBUICAgICAweDEwOTYKLSNkZWZpbmUgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX1NFUkRFU19EUFQgICAgIDB4MTA5OAotI2RlZmluZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fQ09QUEVSX1NQVCAgICAgMHgxMEJBCi0jZGVmaW5lIEUxMDAwX0RFVl9JRF84MDAwM0VTMkxBTl9TRVJERVNfU1BUICAgICAweDEwQkIKLQotI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTV9BTVQgICAgICAweDEwNDkKLSNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUdQX0FNVCAgICAgICAgMHgxMDRBCi0jZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9DICAgICAgICAgIDB4MTA0QgotI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JRkUgICAgICAgICAgICAweDEwNEMKLSNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0dUICAgICAgICAgMHgxMEM0Ci0jZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g4X0lGRV9HICAgICAgICAgIDB4MTBDNQotI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTSAgICAgICAgICAweDEwNEQKLQogCiAjZGVmaW5lIE5PREVfQUREUkVTU19TSVpFIDYKICNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTIDYKQEAgLTUyMywyMSArNDYzLDIwIEBACiAKIC8qIFRoZSBzaXplcyAoaW4gYnl0ZXMpIG9mIGEgZXRoZXJuZXQgcGFja2V0ICovCiAjZGVmaW5lIEVORVRfSEVBREVSX1NJWkUgICAgICAgICAgICAgMTQKLSNkZWZpbmUgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFICA2NCAgIC8qIFdpdGggRkNTICovCisjZGVmaW5lIE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAgNjQJLyogV2l0aCBGQ1MgKi8KICNkZWZpbmUgRVRIRVJORVRfRkNTX1NJWkUgICAgICAgICAgICA0CiAjZGVmaW5lIE1JTklNVU1fRVRIRVJORVRfUEFDS0VUX1NJWkUgXAogICAgIChNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUgLSBFVEhFUk5FVF9GQ1NfU0laRSkKICNkZWZpbmUgQ1JDX0xFTkdUSCAgICAgICAgICAgICAgICAgICBFVEhFUk5FVF9GQ1NfU0laRQogI2RlZmluZSBNQVhfSlVNQk9fRlJBTUVfU0laRSAgICAgICAgIDB4M0YwMAogCi0KIC8qIDgwMi4xcSBWTEFOIFBhY2tldCBTaXplcyAqLwotI2RlZmluZSBWTEFOX1RBR19TSVpFICA0ICAgICAvKiA4MDIuM2FjIHRhZyAobm90IERNQWVkKSAqLworI2RlZmluZSBWTEFOX1RBR19TSVpFICA0CS8qIDgwMi4zYWMgdGFnIChub3QgRE1BZWQpICovCiAKIC8qIEV0aGVydHlwZSBmaWVsZCB2YWx1ZXMgKi8KLSNkZWZpbmUgRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUgMHg4MTAwICAvKiA4MDIuM2FjIHBhY2tldCAqLwotI2RlZmluZSBFVEhFUk5FVF9JUF9UWVBFICAgICAgICAweDA4MDAgIC8qIElQIHBhY2tldHMgKi8KLSNkZWZpbmUgRVRIRVJORVRfQVJQX1RZUEUgICAgICAgMHgwODA2ICAvKiBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFSUCkgKi8KKyNkZWZpbmUgRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUgMHg4MTAwCS8qIDgwMi4zYWMgcGFja2V0ICovCisjZGVmaW5lIEVUSEVSTkVUX0lQX1RZUEUgICAgICAgIDB4MDgwMAkvKiBJUCBwYWNrZXRzICovCisjZGVmaW5lIEVUSEVSTkVUX0FSUF9UWVBFICAgICAgIDB4MDgwNgkvKiBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFSUCkgKi8KIAogLyogUGFja2V0IEhlYWRlciBkZWZpbmVzICovCiAjZGVmaW5lIElQX1BST1RPQ09MX1RDUCAgICA2CkBAIC01NjcsMTUgKzUwNiw2IEBACiAgICAgRTEwMDBfSU1TX1JYU0VRICB8ICAgIFwKICAgICBFMTAwMF9JTVNfTFNDKQogCi0vKiBBZGRpdGlvbmFsIGludGVycnVwdHMgbmVlZCB0byBiZSBoYW5kbGVkIGZvciBlMTAwMF9pY2g4bGFuOgotICAgIERTVyA9IFRoZSBGVyBjaGFuZ2VkIHRoZSBzdGF0dXMgb2YgdGhlIERJU1NXIGJpdCBpbiBGV1NNCi0gICAgUEhZSU5UID0gVGhlIExBTiBjb25uZWN0ZWQgZGV2aWNlIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQKLSAgICBFUFJTVCA9IE1hbmFnZWFiaWxpdHkgcmVzZXQgZXZlbnQgKi8KLSNkZWZpbmUgSU1TX0lDSDhMQU5fRU5BQkxFX01BU0sgKFwKLSAgICBFMTAwMF9JTVNfRFNXICAgfCBcCi0gICAgRTEwMDBfSU1TX1BIWUlOVCB8IFwKLSAgICBFMTAwMF9JTVNfRVBSU1QpCi0KIC8qIE51bWJlciBvZiBoaWdoL2xvdyByZWdpc3RlciBwYWlycyBpbiB0aGUgUkFSLiBUaGUgUkFSIChSZWNlaXZlIEFkZHJlc3MKICAqIFJlZ2lzdGVycykgaG9sZHMgdGhlIGRpcmVjdGVkIGFuZCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRoYXQgd2UgbW9uaXRvci4gV2UKICAqIHJlc2VydmUgb25lIG9mIHRoZXNlIHNwb3RzIGZvciBvdXIgZGlyZWN0ZWQgYWRkcmVzcywgYWxsb3dpbmcgdXMgcm9vbSBmb3IKQEAgLTU4MywxMDAgKzUxMyw5OCBAQAogICovCiAjZGVmaW5lIEUxMDAwX1JBUl9FTlRSSUVTIDE1CiAKLSNkZWZpbmUgRTEwMDBfUkFSX0VOVFJJRVNfSUNIOExBTiAgNgotCiAjZGVmaW5lIE1JTl9OVU1CRVJfT0ZfREVTQ1JJUFRPUlMgIDgKICNkZWZpbmUgTUFYX05VTUJFUl9PRl9ERVNDUklQVE9SUyAgMHhGRkY4CiAKIC8qIFJlY2VpdmUgRGVzY3JpcHRvciAqLwogc3RydWN0IGUxMDAwX3J4X2Rlc2MgewotICAgIF9fbGU2NCBidWZmZXJfYWRkcjsgLyogQWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcidzIGRhdGEgYnVmZmVyICovCi0gICAgX19sZTE2IGxlbmd0aDsgICAgIC8qIExlbmd0aCBvZiBkYXRhIERNQWVkIGludG8gZGF0YSBidWZmZXIgKi8KLSAgICBfX2xlMTYgY3N1bTsgICAgICAgLyogUGFja2V0IGNoZWNrc3VtICovCi0gICAgdTggc3RhdHVzOyAgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCi0gICAgdTggZXJyb3JzOyAgICAgIC8qIERlc2NyaXB0b3IgRXJyb3JzICovCi0gICAgX19sZTE2IHNwZWNpYWw7CisJX19sZTY0IGJ1ZmZlcl9hZGRyOwkvKiBBZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yJ3MgZGF0YSBidWZmZXIgKi8KKwlfX2xlMTYgbGVuZ3RoOwkJLyogTGVuZ3RoIG9mIGRhdGEgRE1BZWQgaW50byBkYXRhIGJ1ZmZlciAqLworCV9fbGUxNiBjc3VtOwkJLyogUGFja2V0IGNoZWNrc3VtICovCisJdTggc3RhdHVzOwkJLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKwl1OCBlcnJvcnM7CQkvKiBEZXNjcmlwdG9yIEVycm9ycyAqLworCV9fbGUxNiBzcGVjaWFsOwogfTsKIAogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIC0gRXh0ZW5kZWQgKi8KIHVuaW9uIGUxMDAwX3J4X2Rlc2NfZXh0ZW5kZWQgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIF9fbGU2NCBidWZmZXJfYWRkcjsKLSAgICAgICAgX19sZTY0IHJlc2VydmVkOwotICAgIH0gcmVhZDsKLSAgICBzdHJ1Y3QgewotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgX19sZTMyIG1ycTsgICAgICAgICAgICAgIC8qIE11bHRpcGxlIFJ4IFF1ZXVlcyAqLwotICAgICAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIF9fbGUzMiByc3M7ICAgICAgICAgIC8qIFJTUyBIYXNoICovCi0gICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgX19sZTE2IGlwX2lkOyAgICAvKiBJUCBpZCAqLwotICAgICAgICAgICAgICAgICAgICBfX2xlMTYgY3N1bTsgICAgIC8qIFBhY2tldCBDaGVja3N1bSAqLwotICAgICAgICAgICAgICAgIH0gY3N1bV9pcDsKLSAgICAgICAgICAgIH0gaGlfZHdvcmQ7Ci0gICAgICAgIH0gbG93ZXI7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBfX2xlMzIgc3RhdHVzX2Vycm9yOyAgICAgLyogZXh0IHN0YXR1cy9lcnJvciAqLwotICAgICAgICAgICAgX19sZTE2IGxlbmd0aDsKLSAgICAgICAgICAgIF9fbGUxNiB2bGFuOyAgICAgICAgICAgICAvKiBWTEFOIHRhZyAqLwotICAgICAgICB9IHVwcGVyOwotICAgIH0gd2I7ICAvKiB3cml0ZWJhY2sgKi8KKwlzdHJ1Y3QgeworCQlfX2xlNjQgYnVmZmVyX2FkZHI7CisJCV9fbGU2NCByZXNlcnZlZDsKKwl9IHJlYWQ7CisJc3RydWN0IHsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiBtcnE7CS8qIE11bHRpcGxlIFJ4IFF1ZXVlcyAqLworCQkJdW5pb24geworCQkJCV9fbGUzMiByc3M7CS8qIFJTUyBIYXNoICovCisJCQkJc3RydWN0IHsKKwkJCQkJX19sZTE2IGlwX2lkOwkvKiBJUCBpZCAqLworCQkJCQlfX2xlMTYgY3N1bTsJLyogUGFja2V0IENoZWNrc3VtICovCisJCQkJfSBjc3VtX2lwOworCQkJfSBoaV9kd29yZDsKKwkJfSBsb3dlcjsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiBzdGF0dXNfZXJyb3I7CS8qIGV4dCBzdGF0dXMvZXJyb3IgKi8KKwkJCV9fbGUxNiBsZW5ndGg7CisJCQlfX2xlMTYgdmxhbjsJLyogVkxBTiB0YWcgKi8KKwkJfSB1cHBlcjsKKwl9IHdiOwkJCS8qIHdyaXRlYmFjayAqLwogfTsKIAogI2RlZmluZSBNQVhfUFNfQlVGRkVSUyA0CiAvKiBSZWNlaXZlIERlc2NyaXB0b3IgLSBQYWNrZXQgU3BsaXQgKi8KIHVuaW9uIGUxMDAwX3J4X2Rlc2NfcGFja2V0X3NwbGl0IHsKLSAgICBzdHJ1Y3QgewotICAgICAgICAvKiBvbmUgYnVmZmVyIGZvciBwcm90b2NvbCBoZWFkZXIocyksIHRocmVlIGRhdGEgYnVmZmVycyAqLwotICAgICAgICBfX2xlNjQgYnVmZmVyX2FkZHJbTUFYX1BTX0JVRkZFUlNdOwotICAgIH0gcmVhZDsKLSAgICBzdHJ1Y3QgewotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgX19sZTMyIG1ycTsgICAgICAgICAgICAgIC8qIE11bHRpcGxlIFJ4IFF1ZXVlcyAqLwotICAgICAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIF9fbGUzMiByc3M7ICAgICAgICAgIC8qIFJTUyBIYXNoICovCi0gICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgX19sZTE2IGlwX2lkOyAgICAvKiBJUCBpZCAqLwotICAgICAgICAgICAgICAgICAgICBfX2xlMTYgY3N1bTsgICAgIC8qIFBhY2tldCBDaGVja3N1bSAqLwotICAgICAgICAgICAgICAgIH0gY3N1bV9pcDsKLSAgICAgICAgICAgIH0gaGlfZHdvcmQ7Ci0gICAgICAgIH0gbG93ZXI7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBfX2xlMzIgc3RhdHVzX2Vycm9yOyAgICAgLyogZXh0IHN0YXR1cy9lcnJvciAqLwotICAgICAgICAgICAgX19sZTE2IGxlbmd0aDA7ICAgICAgICAgIC8qIGxlbmd0aCBvZiBidWZmZXIgMCAqLwotICAgICAgICAgICAgX19sZTE2IHZsYW47ICAgICAgICAgICAgIC8qIFZMQU4gdGFnICovCi0gICAgICAgIH0gbWlkZGxlOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgX19sZTE2IGhlYWRlcl9zdGF0dXM7Ci0gICAgICAgICAgICBfX2xlMTYgbGVuZ3RoWzNdOyAgICAgICAgLyogbGVuZ3RoIG9mIGJ1ZmZlcnMgMS0zICovCi0gICAgICAgIH0gdXBwZXI7Ci0gICAgICAgIF9fbGU2NCByZXNlcnZlZDsKLSAgICB9IHdiOyAvKiB3cml0ZWJhY2sgKi8KKwlzdHJ1Y3QgeworCQkvKiBvbmUgYnVmZmVyIGZvciBwcm90b2NvbCBoZWFkZXIocyksIHRocmVlIGRhdGEgYnVmZmVycyAqLworCQlfX2xlNjQgYnVmZmVyX2FkZHJbTUFYX1BTX0JVRkZFUlNdOworCX0gcmVhZDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeworCQkJX19sZTMyIG1ycTsJLyogTXVsdGlwbGUgUnggUXVldWVzICovCisJCQl1bmlvbiB7CisJCQkJX19sZTMyIHJzczsJLyogUlNTIEhhc2ggKi8KKwkJCQlzdHJ1Y3QgeworCQkJCQlfX2xlMTYgaXBfaWQ7CS8qIElQIGlkICovCisJCQkJCV9fbGUxNiBjc3VtOwkvKiBQYWNrZXQgQ2hlY2tzdW0gKi8KKwkJCQl9IGNzdW1faXA7CisJCQl9IGhpX2R3b3JkOworCQl9IGxvd2VyOworCQlzdHJ1Y3QgeworCQkJX19sZTMyIHN0YXR1c19lcnJvcjsJLyogZXh0IHN0YXR1cy9lcnJvciAqLworCQkJX19sZTE2IGxlbmd0aDA7CS8qIGxlbmd0aCBvZiBidWZmZXIgMCAqLworCQkJX19sZTE2IHZsYW47CS8qIFZMQU4gdGFnICovCisJCX0gbWlkZGxlOworCQlzdHJ1Y3QgeworCQkJX19sZTE2IGhlYWRlcl9zdGF0dXM7CisJCQlfX2xlMTYgbGVuZ3RoWzNdOwkvKiBsZW5ndGggb2YgYnVmZmVycyAxLTMgKi8KKwkJfSB1cHBlcjsKKwkJX19sZTY0IHJlc2VydmVkOworCX0gd2I7CQkJLyogd3JpdGViYWNrICovCiB9OwogCi0vKiBSZWNlaXZlIERlY3JpcHRvciBiaXQgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfREQgICAgICAgMHgwMSAgICAvKiBEZXNjcmlwdG9yIERvbmUgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfRU9QICAgICAgMHgwMiAgICAvKiBFbmQgb2YgUGFja2V0ICovCi0jZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lYU00gICAgIDB4MDQgICAgLyogSWdub3JlIGNoZWNrc3VtICovCi0jZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1ZQICAgICAgIDB4MDggICAgLyogSUVFRSBWTEFOIFBhY2tldCAqLwotI2RlZmluZSBFMTAwMF9SWERfU1RBVF9VRFBDUyAgICAweDEwICAgIC8qIFVEUCB4c3VtIGNhY3VsYXRlZCAqLwotI2RlZmluZSBFMTAwMF9SWERfU1RBVF9UQ1BDUyAgICAweDIwICAgIC8qIFRDUCB4c3VtIGNhbGN1bGF0ZWQgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVBDUyAgICAgMHg0MCAgICAvKiBJUCB4c3VtIGNhbGN1bGF0ZWQgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfUElGICAgICAgMHg4MCAgICAvKiBwYXNzZWQgaW4tZXhhY3QgZmlsdGVyICovCi0jZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lQSURWICAgIDB4MjAwICAgLyogSVAgaWRlbnRpZmljYXRpb24gdmFsaWQgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVURQViAgICAgMHg0MDAgICAvKiBWYWxpZCBVRFAgY2hlY2tzdW0gKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfQUNLICAgICAgMHg4MDAwICAvKiBBQ0sgUGFja2V0IGluZGljYXRpb24gKi8KLSNkZWZpbmUgRTEwMDBfUlhEX0VSUl9DRSAgICAgICAgMHgwMSAgICAvKiBDUkMgRXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRSAgICAgICAgMHgwMiAgICAvKiBTeW1ib2wgRXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRVEgICAgICAgMHgwNCAgICAvKiBTZXF1ZW5jZSBFcnJvciAqLwotI2RlZmluZSBFMTAwMF9SWERfRVJSX0NYRSAgICAgICAweDEwICAgIC8qIENhcnJpZXIgRXh0ZW5zaW9uIEVycm9yICovCi0jZGVmaW5lIEUxMDAwX1JYRF9FUlJfVENQRSAgICAgIDB4MjAgICAgLyogVENQL1VEUCBDaGVja3N1bSBFcnJvciAqLwotI2RlZmluZSBFMTAwMF9SWERfRVJSX0lQRSAgICAgICAweDQwICAgIC8qIElQIENoZWNrc3VtIEVycm9yICovCi0jZGVmaW5lIEUxMDAwX1JYRF9FUlJfUlhFICAgICAgIDB4ODAgICAgLyogUnggRGF0YSBFcnJvciAqLwotI2RlZmluZSBFMTAwMF9SWERfU1BDX1ZMQU5fTUFTSyAweDBGRkYgIC8qIFZMQU4gSUQgaXMgaW4gbG93ZXIgMTIgYml0cyAqLwotI2RlZmluZSBFMTAwMF9SWERfU1BDX1BSSV9NQVNLICAweEUwMDAgIC8qIFByaW9yaXR5IGlzIGluIHVwcGVyIDMgYml0cyAqLworLyogUmVjZWl2ZSBEZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9ERCAgICAgICAweDAxCS8qIERlc2NyaXB0b3IgRG9uZSAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9FT1AgICAgICAweDAyCS8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVhTTSAgICAgMHgwNAkvKiBJZ25vcmUgY2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVlAgICAgICAgMHgwOAkvKiBJRUVFIFZMQU4gUGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1VEUENTICAgIDB4MTAJLyogVURQIHhzdW0gY2FsY3VsYXRlZCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9UQ1BDUyAgICAweDIwCS8qIFRDUCB4c3VtIGNhbGN1bGF0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVBDUyAgICAgMHg0MAkvKiBJUCB4c3VtIGNhbGN1bGF0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfUElGICAgICAgMHg4MAkvKiBwYXNzZWQgaW4tZXhhY3QgZmlsdGVyICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lQSURWICAgIDB4MjAwCS8qIElQIGlkZW50aWZpY2F0aW9uIHZhbGlkICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1VEUFYgICAgIDB4NDAwCS8qIFZhbGlkIFVEUCBjaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9BQ0sgICAgICAweDgwMDAJLyogQUNLIFBhY2tldCBpbmRpY2F0aW9uICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfQ0UgICAgICAgIDB4MDEJLyogQ1JDIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfU0UgICAgICAgIDB4MDIJLyogU3ltYm9sIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfU0VRICAgICAgIDB4MDQJLyogU2VxdWVuY2UgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9DWEUgICAgICAgMHgxMAkvKiBDYXJyaWVyIEV4dGVuc2lvbiBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX1RDUEUgICAgICAweDIwCS8qIFRDUC9VRFAgQ2hlY2tzdW0gRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9JUEUgICAgICAgMHg0MAkvKiBJUCBDaGVja3N1bSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX1JYRSAgICAgICAweDgwCS8qIFJ4IERhdGEgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19WTEFOX01BU0sgMHgwRkZGCS8qIFZMQU4gSUQgaXMgaW4gbG93ZXIgMTIgYml0cyAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX1BSSV9NQVNLICAweEUwMDAJLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBiaXRzICovCiAjZGVmaW5lIEUxMDAwX1JYRF9TUENfUFJJX1NISUZUIDEzCi0jZGVmaW5lIEUxMDAwX1JYRF9TUENfQ0ZJX01BU0sgIDB4MTAwMCAgLyogQ0ZJIGlzIGJpdCAxMiAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX0NGSV9NQVNLICAweDEwMDAJLyogQ0ZJIGlzIGJpdCAxMiAqLwogI2RlZmluZSBFMTAwMF9SWERfU1BDX0NGSV9TSElGVCAxMgogCiAjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX0NFICAgIDB4MDEwMDAwMDAKQEAgLTY5OCw3ICs2MjYsNiBAQAogICAgIEUxMDAwX1JYRF9FUlJfQ1hFIHwgICAgICAgICAgICAgICAgXAogICAgIEUxMDAwX1JYRF9FUlJfUlhFKQogCi0KIC8qIFNhbWUgbWFzaywgYnV0IGZvciBleHRlbmRlZCBhbmQgcGFja2V0IHNwbGl0IGRlc2NyaXB0b3JzICovCiAjZGVmaW5lIEUxMDAwX1JYREVYVF9FUlJfRlJBTUVfRVJSX01BU0sgKCBcCiAgICAgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ0UgIHwgICAgICAgICAgICBcCkBAIC03MDcsMTUyICs2MzQsMTQ1IEBACiAgICAgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ1hFIHwgICAgICAgICAgICBcCiAgICAgRTEwMDBfUlhERVhUX1NUQVRFUlJfUlhFKQogCi0KIC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgKi8KIHN0cnVjdCBlMTAwMF90eF9kZXNjIHsKLSAgICBfX2xlNjQgYnVmZmVyX2FkZHI7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgX19sZTMyIGRhdGE7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBfX2xlMTYgbGVuZ3RoOyAgICAvKiBEYXRhIGJ1ZmZlciBsZW5ndGggKi8KLSAgICAgICAgICAgIHU4IGNzbzsgICAgICAgIC8qIENoZWNrc3VtIG9mZnNldCAqLwotICAgICAgICAgICAgdTggY21kOyAgICAgICAgLyogRGVzY3JpcHRvciBjb250cm9sICovCi0gICAgICAgIH0gZmxhZ3M7Ci0gICAgfSBsb3dlcjsKLSAgICB1bmlvbiB7Ci0gICAgICAgIF9fbGUzMiBkYXRhOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdTggc3RhdHVzOyAgICAgLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KLSAgICAgICAgICAgIHU4IGNzczsgICAgICAgIC8qIENoZWNrc3VtIHN0YXJ0ICovCi0gICAgICAgICAgICBfX2xlMTYgc3BlY2lhbDsKLSAgICAgICAgfSBmaWVsZHM7Ci0gICAgfSB1cHBlcjsKKwlfX2xlNjQgYnVmZmVyX2FkZHI7CS8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLworCXVuaW9uIHsKKwkJX19sZTMyIGRhdGE7CisJCXN0cnVjdCB7CisJCQlfX2xlMTYgbGVuZ3RoOwkvKiBEYXRhIGJ1ZmZlciBsZW5ndGggKi8KKwkJCXU4IGNzbzsJLyogQ2hlY2tzdW0gb2Zmc2V0ICovCisJCQl1OCBjbWQ7CS8qIERlc2NyaXB0b3IgY29udHJvbCAqLworCQl9IGZsYWdzOworCX0gbG93ZXI7CisJdW5pb24geworCQlfX2xlMzIgZGF0YTsKKwkJc3RydWN0IHsKKwkJCXU4IHN0YXR1czsJLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKwkJCXU4IGNzczsJLyogQ2hlY2tzdW0gc3RhcnQgKi8KKwkJCV9fbGUxNiBzcGVjaWFsOworCQl9IGZpZWxkczsKKwl9IHVwcGVyOwogfTsKIAogLyogVHJhbnNtaXQgRGVzY3JpcHRvciBiaXQgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX0RUWVBfRCAgICAgMHgwMDEwMDAwMCAvKiBEYXRhIERlc2NyaXB0b3IgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX0RUWVBfQyAgICAgMHgwMDAwMDAwMCAvKiBDb250ZXh0IERlc2NyaXB0b3IgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX1BPUFRTX0lYU00gMHgwMSAgICAgICAvKiBJbnNlcnQgSVAgY2hlY2tzdW0gKi8KLSNkZWZpbmUgRTEwMDBfVFhEX1BPUFRTX1RYU00gMHgwMiAgICAgICAvKiBJbnNlcnQgVENQL1VEUCBjaGVja3N1bSAqLwotI2RlZmluZSBFMTAwMF9UWERfQ01EX0VPUCAgICAweDAxMDAwMDAwIC8qIEVuZCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JRkNTICAgMHgwMjAwMDAwMCAvKiBJbnNlcnQgRkNTIChFdGhlcm5ldCBDUkMpICovCi0jZGVmaW5lIEUxMDAwX1RYRF9DTURfSUMgICAgIDB4MDQwMDAwMDAgLyogSW5zZXJ0IENoZWNrc3VtICovCi0jZGVmaW5lIEUxMDAwX1RYRF9DTURfUlMgICAgIDB4MDgwMDAwMDAgLyogUmVwb3J0IFN0YXR1cyAqLwotI2RlZmluZSBFMTAwMF9UWERfQ01EX1JQUyAgICAweDEwMDAwMDAwIC8qIFJlcG9ydCBQYWNrZXQgU2VudCAqLwotI2RlZmluZSBFMTAwMF9UWERfQ01EX0RFWFQgICAweDIwMDAwMDAwIC8qIERlc2NyaXB0b3IgZXh0ZW5zaW9uICgwID0gbGVnYWN5KSAqLwotI2RlZmluZSBFMTAwMF9UWERfQ01EX1ZMRSAgICAweDQwMDAwMDAwIC8qIEFkZCBWTEFOIHRhZyAqLwotI2RlZmluZSBFMTAwMF9UWERfQ01EX0lERSAgICAweDgwMDAwMDAwIC8qIEVuYWJsZSBUaWR2IHJlZ2lzdGVyICovCi0jZGVmaW5lIEUxMDAwX1RYRF9TVEFUX0REICAgIDB4MDAwMDAwMDEgLyogRGVzY3JpcHRvciBEb25lICovCi0jZGVmaW5lIEUxMDAwX1RYRF9TVEFUX0VDICAgIDB4MDAwMDAwMDIgLyogRXhjZXNzIENvbGxpc2lvbnMgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfTEMgICAgMHgwMDAwMDAwNCAvKiBMYXRlIENvbGxpc2lvbnMgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfVFUgICAgMHgwMDAwMDAwOCAvKiBUcmFuc21pdCB1bmRlcnJ1biAqLwotI2RlZmluZSBFMTAwMF9UWERfQ01EX1RDUCAgICAweDAxMDAwMDAwIC8qIFRDUCBwYWNrZXQgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JUCAgICAgMHgwMjAwMDAwMCAvKiBJUCBwYWNrZXQgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX0NNRF9UU0UgICAgMHgwNDAwMDAwMCAvKiBUQ1AgU2VnIGVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9UWERfU1RBVF9UQyAgICAweDAwMDAwMDA0IC8qIFR4IFVuZGVycnVuICovCisjZGVmaW5lIEUxMDAwX1RYRF9EVFlQX0QgICAgIDB4MDAxMDAwMDAJLyogRGF0YSBEZXNjcmlwdG9yICovCisjZGVmaW5lIEUxMDAwX1RYRF9EVFlQX0MgICAgIDB4MDAwMDAwMDAJLyogQ29udGV4dCBEZXNjcmlwdG9yICovCisjZGVmaW5lIEUxMDAwX1RYRF9QT1BUU19JWFNNIDB4MDEJLyogSW5zZXJ0IElQIGNoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1RYRF9QT1BUU19UWFNNIDB4MDIJLyogSW5zZXJ0IFRDUC9VRFAgY2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9FT1AgICAgMHgwMTAwMDAwMAkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfSUZDUyAgIDB4MDIwMDAwMDAJLyogSW5zZXJ0IEZDUyAoRXRoZXJuZXQgQ1JDKSAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0lDICAgICAweDA0MDAwMDAwCS8qIEluc2VydCBDaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1JTICAgICAweDA4MDAwMDAwCS8qIFJlcG9ydCBTdGF0dXMgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9SUFMgICAgMHgxMDAwMDAwMAkvKiBSZXBvcnQgUGFja2V0IFNlbnQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9ERVhUICAgMHgyMDAwMDAwMAkvKiBEZXNjcmlwdG9yIGV4dGVuc2lvbiAoMCA9IGxlZ2FjeSkgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9WTEUgICAgMHg0MDAwMDAwMAkvKiBBZGQgVkxBTiB0YWcgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JREUgICAgMHg4MDAwMDAwMAkvKiBFbmFibGUgVGlkdiByZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9ERCAgICAweDAwMDAwMDAxCS8qIERlc2NyaXB0b3IgRG9uZSAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9FQyAgICAweDAwMDAwMDAyCS8qIEV4Y2VzcyBDb2xsaXNpb25zICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX0xDICAgIDB4MDAwMDAwMDQJLyogTGF0ZSBDb2xsaXNpb25zICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX1RVICAgIDB4MDAwMDAwMDgJLyogVHJhbnNtaXQgdW5kZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9UQ1AgICAgMHgwMTAwMDAwMAkvKiBUQ1AgcGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfSVAgICAgIDB4MDIwMDAwMDAJLyogSVAgcGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfVFNFICAgIDB4MDQwMDAwMDAJLyogVENQIFNlZyBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfVEMgICAgMHgwMDAwMDAwNAkvKiBUeCBVbmRlcnJ1biAqLwogCiAvKiBPZmZsb2FkIENvbnRleHQgRGVzY3JpcHRvciAqLwogc3RydWN0IGUxMDAwX2NvbnRleHRfZGVzYyB7Ci0gICAgdW5pb24gewotICAgICAgICBfX2xlMzIgaXBfY29uZmlnOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdTggaXBjc3M7ICAgICAgLyogSVAgY2hlY2tzdW0gc3RhcnQgKi8KLSAgICAgICAgICAgIHU4IGlwY3NvOyAgICAgIC8qIElQIGNoZWNrc3VtIG9mZnNldCAqLwotICAgICAgICAgICAgX19sZTE2IGlwY3NlOyAgICAgLyogSVAgY2hlY2tzdW0gZW5kICovCi0gICAgICAgIH0gaXBfZmllbGRzOwotICAgIH0gbG93ZXJfc2V0dXA7Ci0gICAgdW5pb24gewotICAgICAgICBfX2xlMzIgdGNwX2NvbmZpZzsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIHU4IHR1Y3NzOyAgICAgIC8qIFRDUCBjaGVja3N1bSBzdGFydCAqLwotICAgICAgICAgICAgdTggdHVjc287ICAgICAgLyogVENQIGNoZWNrc3VtIG9mZnNldCAqLwotICAgICAgICAgICAgX19sZTE2IHR1Y3NlOyAgICAgLyogVENQIGNoZWNrc3VtIGVuZCAqLwotICAgICAgICB9IHRjcF9maWVsZHM7Ci0gICAgfSB1cHBlcl9zZXR1cDsKLSAgICBfX2xlMzIgY21kX2FuZF9sZW5ndGg7ICAgIC8qICovCi0gICAgdW5pb24gewotICAgICAgICBfX2xlMzIgZGF0YTsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIHU4IHN0YXR1czsgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCi0gICAgICAgICAgICB1OCBoZHJfbGVuOyAgICAvKiBIZWFkZXIgbGVuZ3RoICovCi0gICAgICAgICAgICBfX2xlMTYgbXNzOyAgICAgICAvKiBNYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLwotICAgICAgICB9IGZpZWxkczsKLSAgICB9IHRjcF9zZWdfc2V0dXA7CisJdW5pb24geworCQlfX2xlMzIgaXBfY29uZmlnOworCQlzdHJ1Y3QgeworCQkJdTggaXBjc3M7CS8qIElQIGNoZWNrc3VtIHN0YXJ0ICovCisJCQl1OCBpcGNzbzsJLyogSVAgY2hlY2tzdW0gb2Zmc2V0ICovCisJCQlfX2xlMTYgaXBjc2U7CS8qIElQIGNoZWNrc3VtIGVuZCAqLworCQl9IGlwX2ZpZWxkczsKKwl9IGxvd2VyX3NldHVwOworCXVuaW9uIHsKKwkJX19sZTMyIHRjcF9jb25maWc7CisJCXN0cnVjdCB7CisJCQl1OCB0dWNzczsJLyogVENQIGNoZWNrc3VtIHN0YXJ0ICovCisJCQl1OCB0dWNzbzsJLyogVENQIGNoZWNrc3VtIG9mZnNldCAqLworCQkJX19sZTE2IHR1Y3NlOwkvKiBUQ1AgY2hlY2tzdW0gZW5kICovCisJCX0gdGNwX2ZpZWxkczsKKwl9IHVwcGVyX3NldHVwOworCV9fbGUzMiBjbWRfYW5kX2xlbmd0aDsJLyogKi8KKwl1bmlvbiB7CisJCV9fbGUzMiBkYXRhOworCQlzdHJ1Y3QgeworCQkJdTggc3RhdHVzOwkvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLworCQkJdTggaGRyX2xlbjsJLyogSGVhZGVyIGxlbmd0aCAqLworCQkJX19sZTE2IG1zczsJLyogTWF4aW11bSBzZWdtZW50IHNpemUgKi8KKwkJfSBmaWVsZHM7CisJfSB0Y3Bfc2VnX3NldHVwOwogfTsKIAogLyogT2ZmbG9hZCBkYXRhIGRlc2NyaXB0b3IgKi8KIHN0cnVjdCBlMTAwMF9kYXRhX2Rlc2MgewotICAgIF9fbGU2NCBidWZmZXJfYWRkcjsgICAgICAgLyogQWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcidzIGJ1ZmZlciBhZGRyZXNzICovCi0gICAgdW5pb24gewotICAgICAgICBfX2xlMzIgZGF0YTsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIF9fbGUxNiBsZW5ndGg7ICAgIC8qIERhdGEgYnVmZmVyIGxlbmd0aCAqLwotICAgICAgICAgICAgdTggdHlwX2xlbl9leHQ7ICAgICAgICAvKiAqLwotICAgICAgICAgICAgdTggY21kOyAgICAgICAgLyogKi8KLSAgICAgICAgfSBmbGFnczsKLSAgICB9IGxvd2VyOwotICAgIHVuaW9uIHsKLSAgICAgICAgX19sZTMyIGRhdGE7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICB1OCBzdGF0dXM7ICAgICAvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLwotICAgICAgICAgICAgdTggcG9wdHM7ICAgICAgLyogUGFja2V0IE9wdGlvbnMgKi8KLSAgICAgICAgICAgIF9fbGUxNiBzcGVjaWFsOyAgIC8qICovCi0gICAgICAgIH0gZmllbGRzOwotICAgIH0gdXBwZXI7CisJX19sZTY0IGJ1ZmZlcl9hZGRyOwkvKiBBZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yJ3MgYnVmZmVyIGFkZHJlc3MgKi8KKwl1bmlvbiB7CisJCV9fbGUzMiBkYXRhOworCQlzdHJ1Y3QgeworCQkJX19sZTE2IGxlbmd0aDsJLyogRGF0YSBidWZmZXIgbGVuZ3RoICovCisJCQl1OCB0eXBfbGVuX2V4dDsJLyogKi8KKwkJCXU4IGNtZDsJLyogKi8KKwkJfSBmbGFnczsKKwl9IGxvd2VyOworCXVuaW9uIHsKKwkJX19sZTMyIGRhdGE7CisJCXN0cnVjdCB7CisJCQl1OCBzdGF0dXM7CS8qIERlc2NyaXB0b3Igc3RhdHVzICovCisJCQl1OCBwb3B0czsJLyogUGFja2V0IE9wdGlvbnMgKi8KKwkJCV9fbGUxNiBzcGVjaWFsOwkvKiAqLworCQl9IGZpZWxkczsKKwl9IHVwcGVyOwogfTsKIAogLyogRmlsdGVycyAqLwotI2RlZmluZSBFMTAwMF9OVU1fVU5JQ0FTVCAgICAgICAgICAxNiAgIC8qIFVuaWNhc3QgZmlsdGVyIGVudHJpZXMgKi8KLSNkZWZpbmUgRTEwMDBfTUNfVEJMX1NJWkUgICAgICAgICAgMTI4ICAvKiBNdWx0aWNhc3QgRmlsdGVyIFRhYmxlICg0MDk2IGJpdHMpICovCi0jZGVmaW5lIEUxMDAwX1ZMQU5fRklMVEVSX1RCTF9TSVpFIDEyOCAgLyogVkxBTiBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KLQotI2RlZmluZSBFMTAwMF9OVU1fVU5JQ0FTVF9JQ0g4TEFOICA3Ci0jZGVmaW5lIEUxMDAwX01DX1RCTF9TSVpFX0lDSDhMQU4gIDMyCi0KKyNkZWZpbmUgRTEwMDBfTlVNX1VOSUNBU1QgICAgICAgICAgMTYJLyogVW5pY2FzdCBmaWx0ZXIgZW50cmllcyAqLworI2RlZmluZSBFMTAwMF9NQ19UQkxfU0laRSAgICAgICAgICAxMjgJLyogTXVsdGljYXN0IEZpbHRlciBUYWJsZSAoNDA5NiBiaXRzKSAqLworI2RlZmluZSBFMTAwMF9WTEFOX0ZJTFRFUl9UQkxfU0laRSAxMjgJLyogVkxBTiBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KIAogLyogUmVjZWl2ZSBBZGRyZXNzIFJlZ2lzdGVyICovCiBzdHJ1Y3QgZTEwMDBfcmFyIHsKLSAgICB2b2xhdGlsZSBfX2xlMzIgbG93OyAgICAgIC8qIHJlY2VpdmUgYWRkcmVzcyBsb3cgKi8KLSAgICB2b2xhdGlsZSBfX2xlMzIgaGlnaDsgICAgIC8qIHJlY2VpdmUgYWRkcmVzcyBoaWdoICovCisJdm9sYXRpbGUgX19sZTMyIGxvdzsJLyogcmVjZWl2ZSBhZGRyZXNzIGxvdyAqLworCXZvbGF0aWxlIF9fbGUzMiBoaWdoOwkvKiByZWNlaXZlIGFkZHJlc3MgaGlnaCAqLwogfTsKIAogLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIE11bHRpY2FzdCBUYWJsZSBBcnJheSAoTVRBKS4gKi8KICNkZWZpbmUgRTEwMDBfTlVNX01UQV9SRUdJU1RFUlMgMTI4Ci0jZGVmaW5lIEUxMDAwX05VTV9NVEFfUkVHSVNURVJTX0lDSDhMQU4gMzIKIAogLyogSVB2NCBBZGRyZXNzIFRhYmxlIEVudHJ5ICovCiBzdHJ1Y3QgZTEwMDBfaXB2NF9hdF9lbnRyeSB7Ci0gICAgdm9sYXRpbGUgdTMyIGlwdjRfYWRkcjsgICAgICAgIC8qIElQIEFkZHJlc3MgKFJXKSAqLwotICAgIHZvbGF0aWxlIHUzMiByZXNlcnZlZDsKKwl2b2xhdGlsZSB1MzIgaXB2NF9hZGRyOwkvKiBJUCBBZGRyZXNzIChSVykgKi8KKwl2b2xhdGlsZSB1MzIgcmVzZXJ2ZWQ7CiB9OwogCiAvKiBGb3VyIHdha2V1cCBJUCBhZGRyZXNzZXMgYXJlIHN1cHBvcnRlZCAqLwogI2RlZmluZSBFMTAwMF9XQUtFVVBfSVBfQUREUkVTU19DT1VOVF9NQVggNAogI2RlZmluZSBFMTAwMF9JUDRBVF9TSVpFICAgICAgICAgICAgICAgICAgRTEwMDBfV0FLRVVQX0lQX0FERFJFU1NfQ09VTlRfTUFYCi0jZGVmaW5lIEUxMDAwX0lQNEFUX1NJWkVfSUNIOExBTiAgICAgICAgICAzCiAjZGVmaW5lIEUxMDAwX0lQNkFUX1NJWkUgICAgICAgICAgICAgICAgICAxCiAKIC8qIElQdjYgQWRkcmVzcyBUYWJsZSBFbnRyeSAqLwogc3RydWN0IGUxMDAwX2lwdjZfYXRfZW50cnkgewotICAgIHZvbGF0aWxlIHU4IGlwdjZfYWRkclsxNl07CisJdm9sYXRpbGUgdTggaXB2Nl9hZGRyWzE2XTsKIH07CiAKIC8qIEZsZXhpYmxlIEZpbHRlciBMZW5ndGggVGFibGUgRW50cnkgKi8KIHN0cnVjdCBlMTAwMF9mZmx0X2VudHJ5IHsKLSAgICB2b2xhdGlsZSB1MzIgbGVuZ3RoOyAgIC8qIEZsZXhpYmxlIEZpbHRlciBMZW5ndGggKFJXKSAqLwotICAgIHZvbGF0aWxlIHUzMiByZXNlcnZlZDsKKwl2b2xhdGlsZSB1MzIgbGVuZ3RoOwkvKiBGbGV4aWJsZSBGaWx0ZXIgTGVuZ3RoIChSVykgKi8KKwl2b2xhdGlsZSB1MzIgcmVzZXJ2ZWQ7CiB9OwogCiAvKiBGbGV4aWJsZSBGaWx0ZXIgTWFzayBUYWJsZSBFbnRyeSAqLwogc3RydWN0IGUxMDAwX2ZmbXRfZW50cnkgewotICAgIHZvbGF0aWxlIHUzMiBtYXNrOyAgICAgLyogRmxleGlibGUgRmlsdGVyIE1hc2sgKFJXKSAqLwotICAgIHZvbGF0aWxlIHUzMiByZXNlcnZlZDsKKwl2b2xhdGlsZSB1MzIgbWFzazsJLyogRmxleGlibGUgRmlsdGVyIE1hc2sgKFJXKSAqLworCXZvbGF0aWxlIHUzMiByZXNlcnZlZDsKIH07CiAKIC8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSBUYWJsZSBFbnRyeSAqLwogc3RydWN0IGUxMDAwX2ZmdnRfZW50cnkgewotICAgIHZvbGF0aWxlIHUzMiB2YWx1ZTsgICAgLyogRmxleGlibGUgRmlsdGVyIFZhbHVlIChSVykgKi8KLSAgICB2b2xhdGlsZSB1MzIgcmVzZXJ2ZWQ7CisJdm9sYXRpbGUgdTMyIHZhbHVlOwkvKiBGbGV4aWJsZSBGaWx0ZXIgVmFsdWUgKFJXKSAqLworCXZvbGF0aWxlIHUzMiByZXNlcnZlZDsKIH07CiAKIC8qIEZvdXIgRmxleGlibGUgRmlsdGVycyBhcmUgc3VwcG9ydGVkICovCkBAIC04NzksMjExICs3OTksMjExIEBACiAgKiBSL2NsciAtIHJlZ2lzdGVyIGlzIHJlYWQgb25seSBhbmQgaXMgY2xlYXJlZCB3aGVuIHJlYWQKICAqIEEgLSByZWdpc3RlciBhcnJheQogICovCi0jZGVmaW5lIEUxMDAwX0NUUkwgICAgIDB4MDAwMDAgIC8qIERldmljZSBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9EVVAgMHgwMDAwNCAgLyogRGV2aWNlIENvbnRyb2wgRHVwbGljYXRlIChTaGFkb3cpIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTICAgMHgwMDAwOCAgLyogRGV2aWNlIFN0YXR1cyAtIFJPICovCi0jZGVmaW5lIEUxMDAwX0VFQ0QgICAgIDB4MDAwMTAgIC8qIEVFUFJPTS9GbGFzaCBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfRUVSRCAgICAgMHgwMDAxNCAgLyogRUVQUk9NIFJlYWQgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0VYVCAweDAwMDE4ICAvKiBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX0ZMQSAgICAgIDB4MDAwMUMgIC8qIEZsYXNoIEFjY2VzcyAtIFJXICovCi0jZGVmaW5lIEUxMDAwX01ESUMgICAgIDB4MDAwMjAgIC8qIE1ESSBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfU0NUTCAgICAgMHgwMDAyNCAgLyogU2VyRGVzIENvbnRyb2wgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9GRVhUTlZNICAweDAwMDI4ICAvKiBGdXR1cmUgRXh0ZW5kZWQgTlZNIHJlZ2lzdGVyICovCi0jZGVmaW5lIEUxMDAwX0ZDQUwgICAgIDB4MDAwMjggIC8qIEZsb3cgQ29udHJvbCBBZGRyZXNzIExvdyAtIFJXICovCi0jZGVmaW5lIEUxMDAwX0ZDQUggICAgIDB4MDAwMkMgIC8qIEZsb3cgQ29udHJvbCBBZGRyZXNzIEhpZ2ggLVJXICovCi0jZGVmaW5lIEUxMDAwX0ZDVCAgICAgIDB4MDAwMzAgIC8qIEZsb3cgQ29udHJvbCBUeXBlIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVkVUICAgICAgMHgwMDAzOCAgLyogVkxBTiBFdGhlciBUeXBlIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfSUNSICAgICAgMHgwMDBDMCAgLyogSW50ZXJydXB0IENhdXNlIFJlYWQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9JVFIgICAgICAweDAwMEM0ICAvKiBJbnRlcnJ1cHQgVGhyb3R0bGluZyBSYXRlIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfSUNTICAgICAgMHgwMDBDOCAgLyogSW50ZXJydXB0IENhdXNlIFNldCAtIFdPICovCi0jZGVmaW5lIEUxMDAwX0lNUyAgICAgIDB4MDAwRDAgIC8qIEludGVycnVwdCBNYXNrIFNldCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX0lNQyAgICAgIDB4MDAwRDggIC8qIEludGVycnVwdCBNYXNrIENsZWFyIC0gV08gKi8KLSNkZWZpbmUgRTEwMDBfSUFNICAgICAgMHgwMDBFMCAgLyogSW50ZXJydXB0IEFja25vd2xlZGdlIEF1dG8gTWFzayAqLwotI2RlZmluZSBFMTAwMF9SQ1RMICAgICAweDAwMTAwICAvKiBSWCBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRUUjEgICAgMHgwMjgyMCAgLyogUlggRGVsYXkgVGltZXIgKDEpIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRCQUwxICAgMHgwMjkwMCAgLyogUlggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgTG93ICgxKSAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1JEQkFIMSAgIDB4MDI5MDQgIC8qIFJYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIEhpZ2ggKDEpIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRMRU4xICAgMHgwMjkwOCAgLyogUlggRGVzY3JpcHRvciBMZW5ndGggKDEpIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRIMSAgICAgMHgwMjkxMCAgLyogUlggRGVzY3JpcHRvciBIZWFkICgxKSAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1JEVDEgICAgIDB4MDI5MTggIC8qIFJYIERlc2NyaXB0b3IgVGFpbCAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9GQ1RUViAgICAweDAwMTcwICAvKiBGbG93IENvbnRyb2wgVHJhbnNtaXQgVGltZXIgVmFsdWUgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UWENXICAgICAweDAwMTc4ICAvKiBUWCBDb25maWd1cmF0aW9uIFdvcmQgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9SWENXICAgICAweDAwMTgwICAvKiBSWCBDb25maWd1cmF0aW9uIFdvcmQgLSBSTyAqLwotI2RlZmluZSBFMTAwMF9UQ1RMICAgICAweDAwNDAwICAvKiBUWCBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVENUTF9FWFQgMHgwMDQwNCAgLyogRXh0ZW5kZWQgVFggQ29udHJvbCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1RJUEcgICAgIDB4MDA0MTAgIC8qIFRYIEludGVyLXBhY2tldCBnYXAgLVJXICovCi0jZGVmaW5lIEUxMDAwX1RCVCAgICAgIDB4MDA0NDggIC8qIFRYIEJ1cnN0IFRpbWVyIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfQUlUICAgICAgMHgwMDQ1OCAgLyogQWRhcHRpdmUgSW50ZXJmcmFtZSBTcGFjaW5nIFRocm90dGxlIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfTEVEQ1RMICAgMHgwMEUwMCAgLyogTEVEIENvbnRyb2wgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTCAgMHgwMEYwMCAgLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX0VYVENORl9TSVpFICAweDAwRjA4ICAvKiBFeHRlbmRlZCBDb25maWd1cmF0aW9uIFNpemUgKi8KLSNkZWZpbmUgRTEwMDBfUEhZX0NUUkwgICAgIDB4MDBGMTAgIC8qIFBIWSBDb250cm9sIFJlZ2lzdGVyIGluIENTUiAqLworI2RlZmluZSBFMTAwMF9DVFJMICAgICAweDAwMDAwCS8qIERldmljZSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9EVVAgMHgwMDAwNAkvKiBEZXZpY2UgQ29udHJvbCBEdXBsaWNhdGUgKFNoYWRvdykgLSBSVyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVMgICAweDAwMDA4CS8qIERldmljZSBTdGF0dXMgLSBSTyAqLworI2RlZmluZSBFMTAwMF9FRUNEICAgICAweDAwMDEwCS8qIEVFUFJPTS9GbGFzaCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRCAgICAgMHgwMDAxNAkvKiBFRVBST00gUmVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUIDB4MDAwMTgJLyogRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GTEEgICAgICAweDAwMDFDCS8qIEZsYXNoIEFjY2VzcyAtIFJXICovCisjZGVmaW5lIEUxMDAwX01ESUMgICAgIDB4MDAwMjAJLyogTURJIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9TQ1RMICAgICAweDAwMDI0CS8qIFNlckRlcyBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkVYVE5WTSAgMHgwMDAyOAkvKiBGdXR1cmUgRXh0ZW5kZWQgTlZNIHJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0ZDQUwgICAgIDB4MDAwMjgJLyogRmxvdyBDb250cm9sIEFkZHJlc3MgTG93IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNBSCAgICAgMHgwMDAyQwkvKiBGbG93IENvbnRyb2wgQWRkcmVzcyBIaWdoIC1SVyAqLworI2RlZmluZSBFMTAwMF9GQ1QgICAgICAweDAwMDMwCS8qIEZsb3cgQ29udHJvbCBUeXBlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVkVUICAgICAgMHgwMDAzOAkvKiBWTEFOIEV0aGVyIFR5cGUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JQ1IgICAgICAweDAwMEMwCS8qIEludGVycnVwdCBDYXVzZSBSZWFkIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfSVRSICAgICAgMHgwMDBDNAkvKiBJbnRlcnJ1cHQgVGhyb3R0bGluZyBSYXRlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSUNTICAgICAgMHgwMDBDOAkvKiBJbnRlcnJ1cHQgQ2F1c2UgU2V0IC0gV08gKi8KKyNkZWZpbmUgRTEwMDBfSU1TICAgICAgMHgwMDBEMAkvKiBJbnRlcnJ1cHQgTWFzayBTZXQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JTUMgICAgICAweDAwMEQ4CS8qIEludGVycnVwdCBNYXNrIENsZWFyIC0gV08gKi8KKyNkZWZpbmUgRTEwMDBfSUFNICAgICAgMHgwMDBFMAkvKiBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgQXV0byBNYXNrICovCisjZGVmaW5lIEUxMDAwX1JDVEwgICAgIDB4MDAxMDAJLyogUlggQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVFIxICAgIDB4MDI4MjAJLyogUlggRGVsYXkgVGltZXIgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRCQUwxICAgMHgwMjkwMAkvKiBSWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBMb3cgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRCQUgxICAgMHgwMjkwNAkvKiBSWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBIaWdoICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JETEVOMSAgIDB4MDI5MDgJLyogUlggRGVzY3JpcHRvciBMZW5ndGggKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRIMSAgICAgMHgwMjkxMAkvKiBSWCBEZXNjcmlwdG9yIEhlYWQgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRUMSAgICAgMHgwMjkxOAkvKiBSWCBEZXNjcmlwdG9yIFRhaWwgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNUVFYgICAgMHgwMDE3MAkvKiBGbG93IENvbnRyb2wgVHJhbnNtaXQgVGltZXIgVmFsdWUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWENXICAgICAweDAwMTc4CS8qIFRYIENvbmZpZ3VyYXRpb24gV29yZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JYQ1cgICAgIDB4MDAxODAJLyogUlggQ29uZmlndXJhdGlvbiBXb3JkIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfVENUTCAgICAgMHgwMDQwMAkvKiBUWCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9FWFQgMHgwMDQwNAkvKiBFeHRlbmRlZCBUWCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVElQRyAgICAgMHgwMDQxMAkvKiBUWCBJbnRlci1wYWNrZXQgZ2FwIC1SVyAqLworI2RlZmluZSBFMTAwMF9UQlQgICAgICAweDAwNDQ4CS8qIFRYIEJ1cnN0IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfQUlUICAgICAgMHgwMDQ1OAkvKiBBZGFwdGl2ZSBJbnRlcmZyYW1lIFNwYWNpbmcgVGhyb3R0bGUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9MRURDVEwgICAweDAwRTAwCS8qIExFRCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkwgIDB4MDBGMDAJLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0VYVENORl9TSVpFICAweDAwRjA4CS8qIEV4dGVuZGVkIENvbmZpZ3VyYXRpb24gU2l6ZSAqLworI2RlZmluZSBFMTAwMF9QSFlfQ1RSTCAgICAgMHgwMEYxMAkvKiBQSFkgQ29udHJvbCBSZWdpc3RlciBpbiBDU1IgKi8KICNkZWZpbmUgRkVYVE5WTV9TV19DT05GSUcgIDB4MDAwMQotI2RlZmluZSBFMTAwMF9QQkEgICAgICAweDAxMDAwICAvKiBQYWNrZXQgQnVmZmVyIEFsbG9jYXRpb24gLSBSVyAqLwotI2RlZmluZSBFMTAwMF9QQlMgICAgICAweDAxMDA4ICAvKiBQYWNrZXQgQnVmZmVyIFNpemUgKi8KLSNkZWZpbmUgRTEwMDBfRUVNTkdDVEwgMHgwMTAxMCAgLyogTU5HIEVFcHJvbSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1BCQSAgICAgIDB4MDEwMDAJLyogUGFja2V0IEJ1ZmZlciBBbGxvY2F0aW9uIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUEJTICAgICAgMHgwMTAwOAkvKiBQYWNrZXQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgRTEwMDBfRUVNTkdDVEwgMHgwMTAxMAkvKiBNTkcgRUVwcm9tIENvbnRyb2wgKi8KICNkZWZpbmUgRTEwMDBfRkxBU0hfVVBEQVRFUyAxMDAwCi0jZGVmaW5lIEUxMDAwX0VFQVJCQyAgIDB4MDEwMjQgIC8qIEVFUFJPTSBBdXRvIFJlYWQgQnVzIENvbnRyb2wgKi8KLSNkZWZpbmUgRTEwMDBfRkxBU0hUICAgMHgwMTAyOCAgLyogRkxBU0ggVGltZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRTEwMDBfRUVXUiAgICAgMHgwMTAyQyAgLyogRUVQUk9NIFdyaXRlIFJlZ2lzdGVyIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfRkxTV0NUTCAgMHgwMTAzMCAgLyogRkxBU0ggY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBFMTAwMF9GTFNXREFUQSAweDAxMDM0ICAvKiBGTEFTSCBkYXRhIHJlZ2lzdGVyICovCi0jZGVmaW5lIEUxMDAwX0ZMU1dDTlQgIDB4MDEwMzggIC8qIEZMQVNIIEFjY2VzcyBDb3VudGVyICovCi0jZGVmaW5lIEUxMDAwX0ZMT1AgICAgIDB4MDEwM0MgIC8qIEZMQVNIIE9wY29kZSBSZWdpc3RlciAqLwotI2RlZmluZSBFMTAwMF9FUlQgICAgICAweDAyMDA4ICAvKiBFYXJseSBSeCBUaHJlc2hvbGQgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9GQ1JUTCAgICAweDAyMTYwICAvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgTG93IC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfRkNSVEggICAgMHgwMjE2OCAgLyogRmxvdyBDb250cm9sIFJlY2VpdmUgVGhyZXNob2xkIEhpZ2ggLSBSVyAqLwotI2RlZmluZSBFMTAwMF9QU1JDVEwgICAweDAyMTcwICAvKiBQYWNrZXQgU3BsaXQgUmVjZWl2ZSBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRCQUwgICAgMHgwMjgwMCAgLyogUlggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgTG93IC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRCQUggICAgMHgwMjgwNCAgLyogUlggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgSGlnaCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1JETEVOICAgIDB4MDI4MDggIC8qIFJYIERlc2NyaXB0b3IgTGVuZ3RoIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRIICAgICAgMHgwMjgxMCAgLyogUlggRGVzY3JpcHRvciBIZWFkIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRUICAgICAgMHgwMjgxOCAgLyogUlggRGVzY3JpcHRvciBUYWlsIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRUUiAgICAgMHgwMjgyMCAgLyogUlggRGVsYXkgVGltZXIgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9SREJBTDAgICBFMTAwMF9SREJBTCAvKiBSWCBEZXNjIEJhc2UgQWRkcmVzcyBMb3cgKDApIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRCQUgwICAgRTEwMDBfUkRCQUggLyogUlggRGVzYyBCYXNlIEFkZHJlc3MgSGlnaCAoMCkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9SRExFTjAgICBFMTAwMF9SRExFTiAvKiBSWCBEZXNjIExlbmd0aCAoMCkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9SREgwICAgICBFMTAwMF9SREggICAvKiBSWCBEZXNjIEhlYWQgKDApIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkRUMCAgICAgRTEwMDBfUkRUICAgLyogUlggRGVzYyBUYWlsICgwKSAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1JEVFIwICAgIEUxMDAwX1JEVFIgIC8qIFJYIERlbGF5IFRpbWVyICgwKSAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1JYRENUTCAgIDB4MDI4MjggIC8qIFJYIERlc2NyaXB0b3IgQ29udHJvbCBxdWV1ZSAwIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUlhEQ1RMMSAgMHgwMjkyOCAgLyogUlggRGVzY3JpcHRvciBDb250cm9sIHF1ZXVlIDEgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9SQURWICAgICAweDAyODJDICAvKiBSWCBJbnRlcnJ1cHQgQWJzb2x1dGUgRGVsYXkgVGltZXIgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9SU1JQRCAgICAweDAyQzAwICAvKiBSWCBTbWFsbCBQYWNrZXQgRGV0ZWN0IC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkFJRCAgICAgMHgwMkMwOCAgLyogUmVjZWl2ZSBBY2sgSW50ZXJydXB0IERlbGF5IC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVFhETUFDICAgMHgwMzAwMCAgLyogVFggRE1BIENvbnRyb2wgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9LQUJHVFhEICAweDAzMDA0ICAvKiBBRkUgQmFuZCBHYXAgVHJhbnNtaXQgUmVmIERhdGEgKi8KLSNkZWZpbmUgRTEwMDBfVERGSCAgICAgMHgwMzQxMCAgLyogVFggRGF0YSBGSUZPIEhlYWQgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UREZUICAgICAweDAzNDE4ICAvKiBUWCBEYXRhIEZJRk8gVGFpbCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1RERkhTICAgIDB4MDM0MjAgIC8qIFRYIERhdGEgRklGTyBIZWFkIFNhdmVkIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVERGVFMgICAgMHgwMzQyOCAgLyogVFggRGF0YSBGSUZPIFRhaWwgU2F2ZWQgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UREZQQyAgICAweDAzNDMwICAvKiBUWCBEYXRhIEZJRk8gUGFja2V0IENvdW50IC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVERCQUwgICAgMHgwMzgwMCAgLyogVFggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgTG93IC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVERCQUggICAgMHgwMzgwNCAgLyogVFggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgSGlnaCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1RETEVOICAgIDB4MDM4MDggIC8qIFRYIERlc2NyaXB0b3IgTGVuZ3RoIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVERIICAgICAgMHgwMzgxMCAgLyogVFggRGVzY3JpcHRvciBIZWFkIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVERUICAgICAgMHgwMzgxOCAgLyogVFggRGVzY3JpcG90ciBUYWlsIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVElEViAgICAgMHgwMzgyMCAgLyogVFggSW50ZXJydXB0IERlbGF5IFZhbHVlIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVFhEQ1RMICAgMHgwMzgyOCAgLyogVFggRGVzY3JpcHRvciBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVEFEViAgICAgMHgwMzgyQyAgLyogVFggSW50ZXJydXB0IEFic29sdXRlIERlbGF5IFZhbCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1RTUE1UICAgIDB4MDM4MzAgIC8qIFRDUCBTZWdtZW50YXRpb24gUEFEICYgTWluIFRocmVzaG9sZCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1RBUkMwICAgIDB4MDM4NDAgIC8qIFRYIEFyYml0cmF0aW9uIENvdW50ICgwKSAqLwotI2RlZmluZSBFMTAwMF9UREJBTDEgICAweDAzOTAwICAvKiBUWCBEZXNjIEJhc2UgQWRkcmVzcyBMb3cgKDEpIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVERCQUgxICAgMHgwMzkwNCAgLyogVFggRGVzYyBCYXNlIEFkZHJlc3MgSGlnaCAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9URExFTjEgICAweDAzOTA4ICAvKiBUWCBEZXNjIExlbmd0aCAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UREgxICAgICAweDAzOTEwICAvKiBUWCBEZXNjIEhlYWQgKDEpIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVERUMSAgICAgMHgwMzkxOCAgLyogVFggRGVzYyBUYWlsICgxKSAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1RYRENUTDEgIDB4MDM5MjggIC8qIFRYIERlc2NyaXB0b3IgQ29udHJvbCAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UQVJDMSAgICAweDAzOTQwICAvKiBUWCBBcmJpdHJhdGlvbiBDb3VudCAoMSkgKi8KLSNkZWZpbmUgRTEwMDBfQ1JDRVJSUyAgMHgwNDAwMCAgLyogQ1JDIEVycm9yIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfQUxHTkVSUkMgMHgwNDAwNCAgLyogQWxpZ25tZW50IEVycm9yIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfU1lNRVJSUyAgMHgwNDAwOCAgLyogU3ltYm9sIEVycm9yIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUlhFUlJDICAgMHgwNDAwQyAgLyogUmVjZWl2ZSBFcnJvciBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX01QQyAgICAgIDB4MDQwMTAgIC8qIE1pc3NlZCBQYWNrZXQgQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9TQ0MgICAgICAweDA0MDE0ICAvKiBTaW5nbGUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfRUNPTCAgICAgMHgwNDAxOCAgLyogRXhjZXNzaXZlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX01DQyAgICAgIDB4MDQwMUMgIC8qIE11bHRpcGxlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX0xBVEVDT0wgIDB4MDQwMjAgIC8qIExhdGUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfQ09MQyAgICAgMHgwNDAyOCAgLyogQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfREMgICAgICAgMHgwNDAzMCAgLyogRGVmZXIgQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9UTkNSUyAgICAweDA0MDM0ICAvKiBUWC1ObyBDUlMgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9TRUMgICAgICAweDA0MDM4ICAvKiBTZXF1ZW5jZSBFcnJvciBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX0NFWFRFUlIgIDB4MDQwM0MgIC8qIENhcnJpZXIgRXh0ZW5zaW9uIEVycm9yIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUkxFQyAgICAgMHgwNDA0MCAgLyogUmVjZWl2ZSBMZW5ndGggRXJyb3IgQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9YT05SWEMgICAweDA0MDQ4ICAvKiBYT04gUlggQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9YT05UWEMgICAweDA0MDRDICAvKiBYT04gVFggQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9YT0ZGUlhDICAweDA0MDUwICAvKiBYT0ZGIFJYIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfWE9GRlRYQyAgMHgwNDA1NCAgLyogWE9GRiBUWCBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX0ZDUlVDICAgIDB4MDQwNTggIC8qIEZsb3cgQ29udHJvbCBSWCBVbnN1cHBvcnRlZCBDb3VudC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUFJDNjQgICAgMHgwNDA1QyAgLyogUGFja2V0cyBSWCAoNjQgYnl0ZXMpIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUFJDMTI3ICAgMHgwNDA2MCAgLyogUGFja2V0cyBSWCAoNjUtMTI3IGJ5dGVzKSAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1BSQzI1NSAgIDB4MDQwNjQgIC8qIFBhY2tldHMgUlggKDEyOC0yNTUgYnl0ZXMpIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUFJDNTExICAgMHgwNDA2OCAgLyogUGFja2V0cyBSWCAoMjU1LTUxMSBieXRlcykgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9QUkMxMDIzICAweDA0MDZDICAvKiBQYWNrZXRzIFJYICg1MTItMTAyMyBieXRlcykgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9QUkMxNTIyICAweDA0MDcwICAvKiBQYWNrZXRzIFJYICgxMDI0LTE1MjIgYnl0ZXMpIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfR1BSQyAgICAgMHgwNDA3NCAgLyogR29vZCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfQlBSQyAgICAgMHgwNDA3OCAgLyogQnJvYWRjYXN0IFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9NUFJDICAgICAweDA0MDdDICAvKiBNdWx0aWNhc3QgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX0dQVEMgICAgIDB4MDQwODAgIC8qIEdvb2QgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX0dPUkNMICAgIDB4MDQwODggIC8qIEdvb2QgT2N0ZXRzIFJYIENvdW50IExvdyAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX0dPUkNIICAgIDB4MDQwOEMgIC8qIEdvb2QgT2N0ZXRzIFJYIENvdW50IEhpZ2ggLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9HT1RDTCAgICAweDA0MDkwICAvKiBHb29kIE9jdGV0cyBUWCBDb3VudCBMb3cgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9HT1RDSCAgICAweDA0MDk0ICAvKiBHb29kIE9jdGV0cyBUWCBDb3VudCBIaWdoIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUk5CQyAgICAgMHgwNDBBMCAgLyogUlggTm8gQnVmZmVycyBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1JVQyAgICAgIDB4MDQwQTQgIC8qIFJYIFVuZGVyc2l6ZSBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1JGQyAgICAgIDB4MDQwQTggIC8qIFJYIEZyYWdtZW50IENvdW50IC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUk9DICAgICAgMHgwNDBBQyAgLyogUlggT3ZlcnNpemUgQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9SSkMgICAgICAweDA0MEIwICAvKiBSWCBKYWJiZXIgQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9NR1RQUkMgICAweDA0MEI0ICAvKiBNYW5hZ2VtZW50IFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9NR1RQREMgICAweDA0MEI4ICAvKiBNYW5hZ2VtZW50IFBhY2tldHMgRHJvcHBlZCBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX01HVFBUQyAgIDB4MDQwQkMgIC8qIE1hbmFnZW1lbnQgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1RPUkwgICAgIDB4MDQwQzAgIC8qIFRvdGFsIE9jdGV0cyBSWCBMb3cgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9UT1JIICAgICAweDA0MEM0ICAvKiBUb3RhbCBPY3RldHMgUlggSGlnaCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1RPVEwgICAgIDB4MDQwQzggIC8qIFRvdGFsIE9jdGV0cyBUWCBMb3cgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9UT1RIICAgICAweDA0MENDICAvKiBUb3RhbCBPY3RldHMgVFggSGlnaCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1RQUiAgICAgIDB4MDQwRDAgIC8qIFRvdGFsIFBhY2tldHMgUlggLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9UUFQgICAgICAweDA0MEQ0ICAvKiBUb3RhbCBQYWNrZXRzIFRYIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUFRDNjQgICAgMHgwNDBEOCAgLyogUGFja2V0cyBUWCAoNjQgYnl0ZXMpIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUFRDMTI3ICAgMHgwNDBEQyAgLyogUGFja2V0cyBUWCAoNjUtMTI3IGJ5dGVzKSAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1BUQzI1NSAgIDB4MDQwRTAgIC8qIFBhY2tldHMgVFggKDEyOC0yNTUgYnl0ZXMpIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfUFRDNTExICAgMHgwNDBFNCAgLyogUGFja2V0cyBUWCAoMjU2LTUxMSBieXRlcykgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9QVEMxMDIzICAweDA0MEU4ICAvKiBQYWNrZXRzIFRYICg1MTItMTAyMyBieXRlcykgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9QVEMxNTIyICAweDA0MEVDICAvKiBQYWNrZXRzIFRYICgxMDI0LTE1MjIgQnl0ZXMpIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfTVBUQyAgICAgMHgwNDBGMCAgLyogTXVsdGljYXN0IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9CUFRDICAgICAweDA0MEY0ICAvKiBCcm9hZGNhc3QgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1RTQ1RDICAgIDB4MDQwRjggIC8qIFRDUCBTZWdtZW50YXRpb24gQ29udGV4dCBUWCAtIFIvY2xyICovCi0jZGVmaW5lIEUxMDAwX1RTQ1RGQyAgIDB4MDQwRkMgIC8qIFRDUCBTZWdtZW50YXRpb24gQ29udGV4dCBUWCBGYWlsIC0gUi9jbHIgKi8KLSNkZWZpbmUgRTEwMDBfSUFDICAgICAgMHgwNDEwMCAgLyogSW50ZXJydXB0IEFzc2VydGlvbiBDb3VudCAqLwotI2RlZmluZSBFMTAwMF9JQ1JYUFRDICAweDA0MTA0ICAvKiBJbnRlcnJ1cHQgQ2F1c2UgUnggUGFja2V0IFRpbWVyIEV4cGlyZSBDb3VudCAqLwotI2RlZmluZSBFMTAwMF9JQ1JYQVRDICAweDA0MTA4ICAvKiBJbnRlcnJ1cHQgQ2F1c2UgUnggQWJzb2x1dGUgVGltZXIgRXhwaXJlIENvdW50ICovCi0jZGVmaW5lIEUxMDAwX0lDVFhQVEMgIDB4MDQxMEMgIC8qIEludGVycnVwdCBDYXVzZSBUeCBQYWNrZXQgVGltZXIgRXhwaXJlIENvdW50ICovCi0jZGVmaW5lIEUxMDAwX0lDVFhBVEMgIDB4MDQxMTAgIC8qIEludGVycnVwdCBDYXVzZSBUeCBBYnNvbHV0ZSBUaW1lciBFeHBpcmUgQ291bnQgKi8KLSNkZWZpbmUgRTEwMDBfSUNUWFFFQyAgMHgwNDExOCAgLyogSW50ZXJydXB0IENhdXNlIFR4IFF1ZXVlIEVtcHR5IENvdW50ICovCi0jZGVmaW5lIEUxMDAwX0lDVFhRTVRDIDB4MDQxMUMgIC8qIEludGVycnVwdCBDYXVzZSBUeCBRdWV1ZSBNaW5pbXVtIFRocmVzaG9sZCBDb3VudCAqLwotI2RlZmluZSBFMTAwMF9JQ1JYRE1UQyAweDA0MTIwICAvKiBJbnRlcnJ1cHQgQ2F1c2UgUnggRGVzY3JpcHRvciBNaW5pbXVtIFRocmVzaG9sZCBDb3VudCAqLwotI2RlZmluZSBFMTAwMF9JQ1JYT0MgICAweDA0MTI0ICAvKiBJbnRlcnJ1cHQgQ2F1c2UgUmVjZWl2ZXIgT3ZlcnJ1biBDb3VudCAqLwotI2RlZmluZSBFMTAwMF9SWENTVU0gICAweDA1MDAwICAvKiBSWCBDaGVja3N1bSBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfUkZDVEwgICAgMHgwNTAwOCAgLyogUmVjZWl2ZSBGaWx0ZXIgQ29udHJvbCovCi0jZGVmaW5lIEUxMDAwX01UQSAgICAgIDB4MDUyMDAgIC8qIE11bHRpY2FzdCBUYWJsZSBBcnJheSAtIFJXIEFycmF5ICovCi0jZGVmaW5lIEUxMDAwX1JBICAgICAgIDB4MDU0MDAgIC8qIFJlY2VpdmUgQWRkcmVzcyAtIFJXIEFycmF5ICovCi0jZGVmaW5lIEUxMDAwX1ZGVEEgICAgIDB4MDU2MDAgIC8qIFZMQU4gRmlsdGVyIFRhYmxlIEFycmF5IC0gUlcgQXJyYXkgKi8KLSNkZWZpbmUgRTEwMDBfV1VDICAgICAgMHgwNTgwMCAgLyogV2FrZXVwIENvbnRyb2wgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9XVUZDICAgICAweDA1ODA4ICAvKiBXYWtldXAgRmlsdGVyIENvbnRyb2wgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9XVVMgICAgICAweDA1ODEwICAvKiBXYWtldXAgU3RhdHVzIC0gUk8gKi8KLSNkZWZpbmUgRTEwMDBfTUFOQyAgICAgMHgwNTgyMCAgLyogTWFuYWdlbWVudCBDb250cm9sIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfSVBBViAgICAgMHgwNTgzOCAgLyogSVAgQWRkcmVzcyBWYWxpZCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX0lQNEFUICAgIDB4MDU4NDAgIC8qIElQdjQgQWRkcmVzcyBUYWJsZSAtIFJXIEFycmF5ICovCi0jZGVmaW5lIEUxMDAwX0lQNkFUICAgIDB4MDU4ODAgIC8qIElQdjYgQWRkcmVzcyBUYWJsZSAtIFJXIEFycmF5ICovCi0jZGVmaW5lIEUxMDAwX1dVUEwgICAgIDB4MDU5MDAgIC8qIFdha2V1cCBQYWNrZXQgTGVuZ3RoIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfV1VQTSAgICAgMHgwNUEwMCAgLyogV2FrZXVwIFBhY2tldCBNZW1vcnkgLSBSTyBBICovCi0jZGVmaW5lIEUxMDAwX0ZGTFQgICAgIDB4MDVGMDAgIC8qIEZsZXhpYmxlIEZpbHRlciBMZW5ndGggVGFibGUgLSBSVyBBcnJheSAqLwotI2RlZmluZSBFMTAwMF9IT1NUX0lGICAweDA4ODAwICAvKiBIb3N0IEludGVyZmFjZSAqLwotI2RlZmluZSBFMTAwMF9GRk1UICAgICAweDA5MDAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgTWFzayBUYWJsZSAtIFJXIEFycmF5ICovCi0jZGVmaW5lIEUxMDAwX0ZGVlQgICAgIDB4MDk4MDAgIC8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSBUYWJsZSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX0VFQVJCQyAgIDB4MDEwMjQJLyogRUVQUk9NIEF1dG8gUmVhZCBCdXMgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9GTEFTSFQgICAweDAxMDI4CS8qIEZMQVNIIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0VFV1IgICAgIDB4MDEwMkMJLyogRUVQUk9NIFdyaXRlIFJlZ2lzdGVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkxTV0NUTCAgMHgwMTAzMAkvKiBGTEFTSCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0ZMU1dEQVRBIDB4MDEwMzQJLyogRkxBU0ggZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9GTFNXQ05UICAweDAxMDM4CS8qIEZMQVNIIEFjY2VzcyBDb3VudGVyICovCisjZGVmaW5lIEUxMDAwX0ZMT1AgICAgIDB4MDEwM0MJLyogRkxBU0ggT3Bjb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0VSVCAgICAgIDB4MDIwMDgJLyogRWFybHkgUnggVGhyZXNob2xkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVEwgICAgMHgwMjE2MAkvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgTG93IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVEggICAgMHgwMjE2OAkvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgSGlnaCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1BTUkNUTCAgIDB4MDIxNzAJLyogUGFja2V0IFNwbGl0IFJlY2VpdmUgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFMICAgIDB4MDI4MDAJLyogUlggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgTG93IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRCQUggICAgMHgwMjgwNAkvKiBSWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBIaWdoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRMRU4gICAgMHgwMjgwOAkvKiBSWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JESCAgICAgIDB4MDI4MTAJLyogUlggRGVzY3JpcHRvciBIZWFkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRUICAgICAgMHgwMjgxOAkvKiBSWCBEZXNjcmlwdG9yIFRhaWwgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRFRSICAgICAweDAyODIwCS8qIFJYIERlbGF5IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRCQUwwICAgRTEwMDBfUkRCQUwJLyogUlggRGVzYyBCYXNlIEFkZHJlc3MgTG93ICgwKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFIMCAgIEUxMDAwX1JEQkFICS8qIFJYIERlc2MgQmFzZSBBZGRyZXNzIEhpZ2ggKDApIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRMRU4wICAgRTEwMDBfUkRMRU4JLyogUlggRGVzYyBMZW5ndGggKDApIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRIMCAgICAgRTEwMDBfUkRICS8qIFJYIERlc2MgSGVhZCAoMCkgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRFQwICAgICBFMTAwMF9SRFQJLyogUlggRGVzYyBUYWlsICgwKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVFIwICAgIEUxMDAwX1JEVFIJLyogUlggRGVsYXkgVGltZXIgKDApIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMICAgMHgwMjgyOAkvKiBSWCBEZXNjcmlwdG9yIENvbnRyb2wgcXVldWUgMCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JYRENUTDEgIDB4MDI5MjgJLyogUlggRGVzY3JpcHRvciBDb250cm9sIHF1ZXVlIDEgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SQURWICAgICAweDAyODJDCS8qIFJYIEludGVycnVwdCBBYnNvbHV0ZSBEZWxheSBUaW1lciAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JTUlBEICAgIDB4MDJDMDAJLyogUlggU21hbGwgUGFja2V0IERldGVjdCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JBSUQgICAgIDB4MDJDMDgJLyogUmVjZWl2ZSBBY2sgSW50ZXJydXB0IERlbGF5IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFhETUFDICAgMHgwMzAwMAkvKiBUWCBETUEgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0tBQkdUWEQgIDB4MDMwMDQJLyogQUZFIEJhbmQgR2FwIFRyYW5zbWl0IFJlZiBEYXRhICovCisjZGVmaW5lIEUxMDAwX1RERkggICAgIDB4MDM0MTAJLyogVFggRGF0YSBGSUZPIEhlYWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZUICAgICAweDAzNDE4CS8qIFRYIERhdGEgRklGTyBUYWlsIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGSFMgICAgMHgwMzQyMAkvKiBUWCBEYXRhIEZJRk8gSGVhZCBTYXZlZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RERlRTICAgIDB4MDM0MjgJLyogVFggRGF0YSBGSUZPIFRhaWwgU2F2ZWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZQQyAgICAweDAzNDMwCS8qIFRYIERhdGEgRklGTyBQYWNrZXQgQ291bnQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREJBTCAgICAweDAzODAwCS8qIFRYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REQkFIICAgIDB4MDM4MDQJLyogVFggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgSGlnaCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RETEVOICAgIDB4MDM4MDgJLyogVFggRGVzY3JpcHRvciBMZW5ndGggLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREggICAgICAweDAzODEwCS8qIFRYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REVCAgICAgIDB4MDM4MTgJLyogVFggRGVzY3JpcG90ciBUYWlsIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVElEViAgICAgMHgwMzgyMAkvKiBUWCBJbnRlcnJ1cHQgRGVsYXkgVmFsdWUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWERDVEwgICAweDAzODI4CS8qIFRYIERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RBRFYgICAgIDB4MDM4MkMJLyogVFggSW50ZXJydXB0IEFic29sdXRlIERlbGF5IFZhbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RTUE1UICAgIDB4MDM4MzAJLyogVENQIFNlZ21lbnRhdGlvbiBQQUQgJiBNaW4gVGhyZXNob2xkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEFSQzAgICAgMHgwMzg0MAkvKiBUWCBBcmJpdHJhdGlvbiBDb3VudCAoMCkgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUwxICAgMHgwMzkwMAkvKiBUWCBEZXNjIEJhc2UgQWRkcmVzcyBMb3cgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUgxICAgMHgwMzkwNAkvKiBUWCBEZXNjIEJhc2UgQWRkcmVzcyBIaWdoICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RETEVOMSAgIDB4MDM5MDgJLyogVFggRGVzYyBMZW5ndGggKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERIMSAgICAgMHgwMzkxMAkvKiBUWCBEZXNjIEhlYWQgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERUMSAgICAgMHgwMzkxOAkvKiBUWCBEZXNjIFRhaWwgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMMSAgMHgwMzkyOAkvKiBUWCBEZXNjcmlwdG9yIENvbnRyb2wgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEFSQzEgICAgMHgwMzk0MAkvKiBUWCBBcmJpdHJhdGlvbiBDb3VudCAoMSkgKi8KKyNkZWZpbmUgRTEwMDBfQ1JDRVJSUyAgMHgwNDAwMAkvKiBDUkMgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9BTEdORVJSQyAweDA0MDA0CS8qIEFsaWdubWVudCBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1NZTUVSUlMgIDB4MDQwMDgJLyogU3ltYm9sIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUlhFUlJDICAgMHgwNDAwQwkvKiBSZWNlaXZlIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTVBDICAgICAgMHgwNDAxMAkvKiBNaXNzZWQgUGFja2V0IENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfU0NDICAgICAgMHgwNDAxNAkvKiBTaW5nbGUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfRUNPTCAgICAgMHgwNDAxOAkvKiBFeGNlc3NpdmUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUNDICAgICAgMHgwNDAxQwkvKiBNdWx0aXBsZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9MQVRFQ09MICAweDA0MDIwCS8qIExhdGUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQ09MQyAgICAgMHgwNDAyOAkvKiBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9EQyAgICAgICAweDA0MDMwCS8qIERlZmVyIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE5DUlMgICAgMHgwNDAzNAkvKiBUWC1ObyBDUlMgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9TRUMgICAgICAweDA0MDM4CS8qIFNlcXVlbmNlIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQ0VYVEVSUiAgMHgwNDAzQwkvKiBDYXJyaWVyIEV4dGVuc2lvbiBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JMRUMgICAgIDB4MDQwNDAJLyogUmVjZWl2ZSBMZW5ndGggRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9YT05SWEMgICAweDA0MDQ4CS8qIFhPTiBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1hPTlRYQyAgIDB4MDQwNEMJLyogWE9OIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9GRlJYQyAgMHgwNDA1MAkvKiBYT0ZGIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9GRlRYQyAgMHgwNDA1NAkvKiBYT0ZGIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVUMgICAgMHgwNDA1OAkvKiBGbG93IENvbnRyb2wgUlggVW5zdXBwb3J0ZWQgQ291bnQtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzY0ICAgIDB4MDQwNUMJLyogUGFja2V0cyBSWCAoNjQgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMTI3ICAgMHgwNDA2MAkvKiBQYWNrZXRzIFJYICg2NS0xMjcgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMjU1ICAgMHgwNDA2NAkvKiBQYWNrZXRzIFJYICgxMjgtMjU1IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzUxMSAgIDB4MDQwNjgJLyogUGFja2V0cyBSWCAoMjU1LTUxMSBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkMxMDIzICAweDA0MDZDCS8qIFBhY2tldHMgUlggKDUxMi0xMDIzIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzE1MjIgIDB4MDQwNzAJLyogUGFja2V0cyBSWCAoMTAyNC0xNTIyIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dQUkMgICAgIDB4MDQwNzQJLyogR29vZCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQlBSQyAgICAgMHgwNDA3OAkvKiBCcm9hZGNhc3QgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01QUkMgICAgIDB4MDQwN0MJLyogTXVsdGljYXN0IFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HUFRDICAgICAweDA0MDgwCS8qIEdvb2QgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dPUkNMICAgIDB4MDQwODgJLyogR29vZCBPY3RldHMgUlggQ291bnQgTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09SQ0ggICAgMHgwNDA4QwkvKiBHb29kIE9jdGV0cyBSWCBDb3VudCBIaWdoIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09UQ0wgICAgMHgwNDA5MAkvKiBHb29kIE9jdGV0cyBUWCBDb3VudCBMb3cgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1RDSCAgICAweDA0MDk0CS8qIEdvb2QgT2N0ZXRzIFRYIENvdW50IEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9STkJDICAgICAweDA0MEEwCS8qIFJYIE5vIEJ1ZmZlcnMgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SVUMgICAgICAweDA0MEE0CS8qIFJYIFVuZGVyc2l6ZSBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JGQyAgICAgIDB4MDQwQTgJLyogUlggRnJhZ21lbnQgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9ST0MgICAgICAweDA0MEFDCS8qIFJYIE92ZXJzaXplIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUkpDICAgICAgMHgwNDBCMAkvKiBSWCBKYWJiZXIgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NR1RQUkMgICAweDA0MEI0CS8qIE1hbmFnZW1lbnQgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01HVFBEQyAgIDB4MDQwQjgJLyogTWFuYWdlbWVudCBQYWNrZXRzIERyb3BwZWQgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NR1RQVEMgICAweDA0MEJDCS8qIE1hbmFnZW1lbnQgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RPUkwgICAgIDB4MDQwQzAJLyogVG90YWwgT2N0ZXRzIFJYIExvdyAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RPUkggICAgIDB4MDQwQzQJLyogVG90YWwgT2N0ZXRzIFJYIEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1RMICAgICAweDA0MEM4CS8qIFRvdGFsIE9jdGV0cyBUWCBMb3cgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1RIICAgICAweDA0MENDCS8qIFRvdGFsIE9jdGV0cyBUWCBIaWdoIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVFBSICAgICAgMHgwNDBEMAkvKiBUb3RhbCBQYWNrZXRzIFJYIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVFBUICAgICAgMHgwNDBENAkvKiBUb3RhbCBQYWNrZXRzIFRYIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDNjQgICAgMHgwNDBEOAkvKiBQYWNrZXRzIFRYICg2NCBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEMxMjcgICAweDA0MERDCS8qIFBhY2tldHMgVFggKDY1LTEyNyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEMyNTUgICAweDA0MEUwCS8qIFBhY2tldHMgVFggKDEyOC0yNTUgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDNTExICAgMHgwNDBFNAkvKiBQYWNrZXRzIFRYICgyNTYtNTExIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzEwMjMgIDB4MDQwRTgJLyogUGFja2V0cyBUWCAoNTEyLTEwMjMgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMTUyMiAgMHgwNDBFQwkvKiBQYWNrZXRzIFRYICgxMDI0LTE1MjIgQnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTVBUQyAgICAgMHgwNDBGMAkvKiBNdWx0aWNhc3QgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0JQVEMgICAgIDB4MDQwRjQJLyogQnJvYWRjYXN0IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UU0NUQyAgICAweDA0MEY4CS8qIFRDUCBTZWdtZW50YXRpb24gQ29udGV4dCBUWCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RTQ1RGQyAgIDB4MDQwRkMJLyogVENQIFNlZ21lbnRhdGlvbiBDb250ZXh0IFRYIEZhaWwgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9JQUMgICAgICAweDA0MTAwCS8qIEludGVycnVwdCBBc3NlcnRpb24gQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWFBUQyAgMHgwNDEwNAkvKiBJbnRlcnJ1cHQgQ2F1c2UgUnggUGFja2V0IFRpbWVyIEV4cGlyZSBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1JYQVRDICAweDA0MTA4CS8qIEludGVycnVwdCBDYXVzZSBSeCBBYnNvbHV0ZSBUaW1lciBFeHBpcmUgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNUWFBUQyAgMHgwNDEwQwkvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggUGFja2V0IFRpbWVyIEV4cGlyZSBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1RYQVRDICAweDA0MTEwCS8qIEludGVycnVwdCBDYXVzZSBUeCBBYnNvbHV0ZSBUaW1lciBFeHBpcmUgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNUWFFFQyAgMHgwNDExOAkvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggUXVldWUgRW1wdHkgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNUWFFNVEMgMHgwNDExQwkvKiBJbnRlcnJ1cHQgQ2F1c2UgVHggUXVldWUgTWluaW11bSBUaHJlc2hvbGQgQ291bnQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSWERNVEMgMHgwNDEyMAkvKiBJbnRlcnJ1cHQgQ2F1c2UgUnggRGVzY3JpcHRvciBNaW5pbXVtIFRocmVzaG9sZCBDb3VudCAqLworI2RlZmluZSBFMTAwMF9JQ1JYT0MgICAweDA0MTI0CS8qIEludGVycnVwdCBDYXVzZSBSZWNlaXZlciBPdmVycnVuIENvdW50ICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTSAgIDB4MDUwMDAJLyogUlggQ2hlY2tzdW0gQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JGQ1RMICAgIDB4MDUwMDgJLyogUmVjZWl2ZSBGaWx0ZXIgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9NVEEgICAgICAweDA1MjAwCS8qIE11bHRpY2FzdCBUYWJsZSBBcnJheSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1JBICAgICAgIDB4MDU0MDAJLyogUmVjZWl2ZSBBZGRyZXNzIC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfVkZUQSAgICAgMHgwNTYwMAkvKiBWTEFOIEZpbHRlciBUYWJsZSBBcnJheSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1dVQyAgICAgIDB4MDU4MDAJLyogV2FrZXVwIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9XVUZDICAgICAweDA1ODA4CS8qIFdha2V1cCBGaWx0ZXIgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1dVUyAgICAgIDB4MDU4MTAJLyogV2FrZXVwIFN0YXR1cyAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkMgICAgIDB4MDU4MjAJLyogTWFuYWdlbWVudCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSVBBViAgICAgMHgwNTgzOAkvKiBJUCBBZGRyZXNzIFZhbGlkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSVA0QVQgICAgMHgwNTg0MAkvKiBJUHY0IEFkZHJlc3MgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9JUDZBVCAgICAweDA1ODgwCS8qIElQdjYgQWRkcmVzcyBUYWJsZSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1dVUEwgICAgIDB4MDU5MDAJLyogV2FrZXVwIFBhY2tldCBMZW5ndGggLSBSVyAqLworI2RlZmluZSBFMTAwMF9XVVBNICAgICAweDA1QTAwCS8qIFdha2V1cCBQYWNrZXQgTWVtb3J5IC0gUk8gQSAqLworI2RlZmluZSBFMTAwMF9GRkxUICAgICAweDA1RjAwCS8qIEZsZXhpYmxlIEZpbHRlciBMZW5ndGggVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9IT1NUX0lGICAweDA4ODAwCS8qIEhvc3QgSW50ZXJmYWNlICovCisjZGVmaW5lIEUxMDAwX0ZGTVQgICAgIDB4MDkwMDAJLyogRmxleGlibGUgRmlsdGVyIE1hc2sgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9GRlZUICAgICAweDA5ODAwCS8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSBUYWJsZSAtIFJXIEFycmF5ICovCiAKLSNkZWZpbmUgRTEwMDBfS1VNQ1RSTFNUQSAweDAwMDM0IC8qIE1BQy1QSFkgaW50ZXJmYWNlIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfTURQSFlBICAgICAweDAwMDNDICAvKiBQSFkgYWRkcmVzcyAtIFJXICovCi0jZGVmaW5lIEUxMDAwX01BTkMySCAgICAgMHgwNTg2MCAgLyogTWFuYWdtZW50IENvbnRyb2wgVG8gSG9zdCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1NXX0ZXX1NZTkMgMHgwNUI1QyAvKiBTb2Z0d2FyZS1GaXJtd2FyZSBTeW5jaHJvbml6YXRpb24gLSBSVyAqLworI2RlZmluZSBFMTAwMF9LVU1DVFJMU1RBIDB4MDAwMzQJLyogTUFDLVBIWSBpbnRlcmZhY2UgLSBSVyAqLworI2RlZmluZSBFMTAwMF9NRFBIWUEgICAgIDB4MDAwM0MJLyogUEhZIGFkZHJlc3MgLSBSVyAqLworI2RlZmluZSBFMTAwMF9NQU5DMkggICAgIDB4MDU4NjAJLyogTWFuYWdtZW50IENvbnRyb2wgVG8gSG9zdCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1NXX0ZXX1NZTkMgMHgwNUI1QwkvKiBTb2Z0d2FyZS1GaXJtd2FyZSBTeW5jaHJvbml6YXRpb24gLSBSVyAqLwogCi0jZGVmaW5lIEUxMDAwX0dDUiAgICAgICAweDA1QjAwIC8qIFBDSS1FeCBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX0dTQ0xfMSAgICAweDA1QjEwIC8qIFBDSS1FeCBTdGF0aXN0aWMgQ29udHJvbCAjMSAqLwotI2RlZmluZSBFMTAwMF9HU0NMXzIgICAgMHgwNUIxNCAvKiBQQ0ktRXggU3RhdGlzdGljIENvbnRyb2wgIzIgKi8KLSNkZWZpbmUgRTEwMDBfR1NDTF8zICAgIDB4MDVCMTggLyogUENJLUV4IFN0YXRpc3RpYyBDb250cm9sICMzICovCi0jZGVmaW5lIEUxMDAwX0dTQ0xfNCAgICAweDA1QjFDIC8qIFBDSS1FeCBTdGF0aXN0aWMgQ29udHJvbCAjNCAqLwotI2RlZmluZSBFMTAwMF9GQUNUUFMgICAgMHgwNUIzMCAvKiBGdW5jdGlvbiBBY3RpdmUgYW5kIFBvd2VyIFN0YXRlIHRvIE1ORyAqLwotI2RlZmluZSBFMTAwMF9TV1NNICAgICAgMHgwNUI1MCAvKiBTVyBTZW1hcGhvcmUgKi8KLSNkZWZpbmUgRTEwMDBfRldTTSAgICAgIDB4MDVCNTQgLyogRlcgU2VtYXBob3JlICovCi0jZGVmaW5lIEUxMDAwX0ZGTFRfREJHICAweDA1RjA0IC8qIERlYnVnIFJlZ2lzdGVyICovCi0jZGVmaW5lIEUxMDAwX0hJQ1IgICAgICAweDA4RjAwIC8qIEhvc3QgSW50ZWZhY2UgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9HQ1IgICAgICAgMHgwNUIwMAkvKiBQQ0ktRXggQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9HU0NMXzEgICAgMHgwNUIxMAkvKiBQQ0ktRXggU3RhdGlzdGljIENvbnRyb2wgIzEgKi8KKyNkZWZpbmUgRTEwMDBfR1NDTF8yICAgIDB4MDVCMTQJLyogUENJLUV4IFN0YXRpc3RpYyBDb250cm9sICMyICovCisjZGVmaW5lIEUxMDAwX0dTQ0xfMyAgICAweDA1QjE4CS8qIFBDSS1FeCBTdGF0aXN0aWMgQ29udHJvbCAjMyAqLworI2RlZmluZSBFMTAwMF9HU0NMXzQgICAgMHgwNUIxQwkvKiBQQ0ktRXggU3RhdGlzdGljIENvbnRyb2wgIzQgKi8KKyNkZWZpbmUgRTEwMDBfRkFDVFBTICAgIDB4MDVCMzAJLyogRnVuY3Rpb24gQWN0aXZlIGFuZCBQb3dlciBTdGF0ZSB0byBNTkcgKi8KKyNkZWZpbmUgRTEwMDBfU1dTTSAgICAgIDB4MDVCNTAJLyogU1cgU2VtYXBob3JlICovCisjZGVmaW5lIEUxMDAwX0ZXU00gICAgICAweDA1QjU0CS8qIEZXIFNlbWFwaG9yZSAqLworI2RlZmluZSBFMTAwMF9GRkxUX0RCRyAgMHgwNUYwNAkvKiBEZWJ1ZyBSZWdpc3RlciAqLworI2RlZmluZSBFMTAwMF9ISUNSICAgICAgMHgwOEYwMAkvKiBIb3N0IEludGVyZmFjZSBDb250cm9sICovCiAKIC8qIFJTUyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRTEwMDBfQ1BVVkVDICAgIDB4MDJDMTAgLyogQ1BVIFZlY3RvciBSZWdpc3RlciAtIFJXICovCi0jZGVmaW5lIEUxMDAwX01SUUMgICAgICAweDA1ODE4IC8qIE11bHRpcGxlIFJlY2VpdmUgQ29udHJvbCAtIFJXICovCi0jZGVmaW5lIEUxMDAwX1JFVEEgICAgICAweDA1QzAwIC8qIFJlZGlyZWN0aW9uIFRhYmxlIC0gUlcgQXJyYXkgKi8KLSNkZWZpbmUgRTEwMDBfUlNTUksgICAgIDB4MDVDODAgLyogUlNTIFJhbmRvbSBLZXkgLSBSVyBBcnJheSAqLwotI2RlZmluZSBFMTAwMF9SU1NJTSAgICAgMHgwNTg2NCAvKiBSU1MgSW50ZXJydXB0IE1hc2sgKi8KLSNkZWZpbmUgRTEwMDBfUlNTSVIgICAgIDB4MDU4NjggLyogUlNTIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lIEUxMDAwX0NQVVZFQyAgICAweDAyQzEwCS8qIENQVSBWZWN0b3IgUmVnaXN0ZXIgLSBSVyAqLworI2RlZmluZSBFMTAwMF9NUlFDICAgICAgMHgwNTgxOAkvKiBNdWx0aXBsZSBSZWNlaXZlIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRVRBICAgICAgMHgwNUMwMAkvKiBSZWRpcmVjdGlvbiBUYWJsZSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1JTU1JLICAgICAweDA1QzgwCS8qIFJTUyBSYW5kb20gS2V5IC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfUlNTSU0gICAgIDB4MDU4NjQJLyogUlNTIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIEUxMDAwX1JTU0lSICAgICAweDA1ODY4CS8qIFJTUyBJbnRlcnJ1cHQgUmVxdWVzdCAqLwogLyogUmVnaXN0ZXIgU2V0ICg4MjU0MikKICAqCiAgKiBTb21lIG9mIHRoZSA4MjU0MiByZWdpc3RlcnMgYXJlIGxvY2F0ZWQgYXQgZGlmZmVyZW50IG9mZnNldHMgdGhhbiB0aGV5IGFyZQpAQCAtMTEyMywxOSArMTA0MywxOSBAQAogI2RlZmluZSBFMTAwMF84MjU0Ml9SRExFTjAgICBFMTAwMF84MjU0Ml9SRExFTgogI2RlZmluZSBFMTAwMF84MjU0Ml9SREgwICAgICBFMTAwMF84MjU0Ml9SREgKICNkZWZpbmUgRTEwMDBfODI1NDJfUkRUMCAgICAgRTEwMDBfODI1NDJfUkRUCi0jZGVmaW5lIEUxMDAwXzgyNTQyX1NSUkNUTChfbikgKDB4MjgwQyArICgoX24pIDw8IDgpKSAvKiBTcGxpdCBhbmQgUmVwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9TUlJDVEwoX24pICgweDI4MEMgKyAoKF9uKSA8PCA4KSkJLyogU3BsaXQgYW5kIFJlcGxpY2F0aW9uCisJCQkJCQkJICogUlggQ29udHJvbCAtIFJXICovCiAjZGVmaW5lIEUxMDAwXzgyNTQyX0RDQV9SWENUUkwoX24pICgweDAyODE0ICsgKChfbikgPDwgOCkpCi0jZGVmaW5lIEUxMDAwXzgyNTQyX1JEQkFIMyAgIDB4MDJCMDQgLyogUlggRGVzYyBCYXNlIEhpZ2ggUXVldWUgMyAtIFJXICovCi0jZGVmaW5lIEUxMDAwXzgyNTQyX1JEQkFMMyAgIDB4MDJCMDAgLyogUlggRGVzYyBMb3cgUXVldWUgMyAtIFJXICovCi0jZGVmaW5lIEUxMDAwXzgyNTQyX1JETEVOMyAgIDB4MDJCMDggLyogUlggRGVzYyBMZW5ndGggUXVldWUgMyAtIFJXICovCi0jZGVmaW5lIEUxMDAwXzgyNTQyX1JESDMgICAgIDB4MDJCMTAgLyogUlggRGVzYyBIZWFkIFF1ZXVlIDMgLSBSVyAqLwotI2RlZmluZSBFMTAwMF84MjU0Ml9SRFQzICAgICAweDAyQjE4IC8qIFJYIERlc2MgVGFpbCBRdWV1ZSAzIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUwyICAgMHgwMkEwMCAvKiBSWCBEZXNjIEJhc2UgTG93IFF1ZXVlIDIgLSBSVyAqLwotI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBSDIgICAweDAyQTA0IC8qIFJYIERlc2MgQmFzZSBIaWdoIFF1ZXVlIDIgLSBSVyAqLwotI2RlZmluZSBFMTAwMF84MjU0Ml9SRExFTjIgICAweDAyQTA4IC8qIFJYIERlc2MgTGVuZ3RoIFF1ZXVlIDIgLSBSVyAqLwotI2RlZmluZSBFMTAwMF84MjU0Ml9SREgyICAgICAweDAyQTEwIC8qIFJYIERlc2MgSGVhZCBRdWV1ZSAyIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfODI1NDJfUkRUMiAgICAgMHgwMkExOCAvKiBSWCBEZXNjIFRhaWwgUXVldWUgMiAtIFJXICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEQkFIMyAgIDB4MDJCMDQJLyogUlggRGVzYyBCYXNlIEhpZ2ggUXVldWUgMyAtIFJXICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEQkFMMyAgIDB4MDJCMDAJLyogUlggRGVzYyBMb3cgUXVldWUgMyAtIFJXICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JETEVOMyAgIDB4MDJCMDgJLyogUlggRGVzYyBMZW5ndGggUXVldWUgMyAtIFJXICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JESDMgICAgIDB4MDJCMTAJLyogUlggRGVzYyBIZWFkIFF1ZXVlIDMgLSBSVyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9SRFQzICAgICAweDAyQjE4CS8qIFJYIERlc2MgVGFpbCBRdWV1ZSAzIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUwyICAgMHgwMkEwMAkvKiBSWCBEZXNjIEJhc2UgTG93IFF1ZXVlIDIgLSBSVyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBSDIgICAweDAyQTA0CS8qIFJYIERlc2MgQmFzZSBIaWdoIFF1ZXVlIDIgLSBSVyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9SRExFTjIgICAweDAyQTA4CS8qIFJYIERlc2MgTGVuZ3RoIFF1ZXVlIDIgLSBSVyAqLworI2RlZmluZSBFMTAwMF84MjU0Ml9SREgyICAgICAweDAyQTEwCS8qIFJYIERlc2MgSGVhZCBRdWV1ZSAyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRUMiAgICAgMHgwMkExOAkvKiBSWCBEZXNjIFRhaWwgUXVldWUgMiAtIFJXICovCiAjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVFIxICAgIDB4MDAxMzAKICNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUwxICAgMHgwMDEzOAogI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBSDEgICAweDAwMTNDCkBAIC0xMzAyLDI4OCArMTIyMiwyODEgQEAKICNkZWZpbmUgRTEwMDBfODI1NDJfUlNTSVIgICAgICAgRTEwMDBfUlNTSVIKICNkZWZpbmUgRTEwMDBfODI1NDJfS1VNQ1RSTFNUQSBFMTAwMF9LVU1DVFJMU1RBCiAjZGVmaW5lIEUxMDAwXzgyNTQyX1NXX0ZXX1NZTkMgRTEwMDBfU1dfRldfU1lOQwotI2RlZmluZSBFMTAwMF84MjU0Ml9NQU5DMkggICAgICBFMTAwMF9NQU5DMkgKIAogLyogU3RhdGlzdGljcyBjb3VudGVycyBjb2xsZWN0ZWQgYnkgdGhlIE1BQyAqLwogc3RydWN0IGUxMDAwX2h3X3N0YXRzIHsKLQl1NjQJCWNyY2VycnM7Ci0JdTY0CQlhbGduZXJyYzsKLQl1NjQJCXN5bWVycnM7Ci0JdTY0CQlyeGVycmM7Ci0JdTY0CQl0eGVycmM7Ci0JdTY0CQltcGM7Ci0JdTY0CQlzY2M7Ci0JdTY0CQllY29sOwotCXU2NAkJbWNjOwotCXU2NAkJbGF0ZWNvbDsKLQl1NjQJCWNvbGM7Ci0JdTY0CQlkYzsKLQl1NjQJCXRuY3JzOwotCXU2NAkJc2VjOwotCXU2NAkJY2V4dGVycjsKLQl1NjQJCXJsZWM7Ci0JdTY0CQl4b25yeGM7Ci0JdTY0CQl4b250eGM7Ci0JdTY0CQl4b2ZmcnhjOwotCXU2NAkJeG9mZnR4YzsKLQl1NjQJCWZjcnVjOwotCXU2NAkJcHJjNjQ7Ci0JdTY0CQlwcmMxMjc7Ci0JdTY0CQlwcmMyNTU7Ci0JdTY0CQlwcmM1MTE7Ci0JdTY0CQlwcmMxMDIzOwotCXU2NAkJcHJjMTUyMjsKLQl1NjQJCWdwcmM7Ci0JdTY0CQlicHJjOwotCXU2NAkJbXByYzsKLQl1NjQJCWdwdGM7Ci0JdTY0CQlnb3JjbDsKLQl1NjQJCWdvcmNoOwotCXU2NAkJZ290Y2w7Ci0JdTY0CQlnb3RjaDsKLQl1NjQJCXJuYmM7Ci0JdTY0CQlydWM7Ci0JdTY0CQlyZmM7Ci0JdTY0CQlyb2M7Ci0JdTY0CQlybGVycmM7Ci0JdTY0CQlyamM7Ci0JdTY0CQltZ3ByYzsKLQl1NjQJCW1ncGRjOwotCXU2NAkJbWdwdGM7Ci0JdTY0CQl0b3JsOwotCXU2NAkJdG9yaDsKLQl1NjQJCXRvdGw7Ci0JdTY0CQl0b3RoOwotCXU2NAkJdHByOwotCXU2NAkJdHB0OwotCXU2NAkJcHRjNjQ7Ci0JdTY0CQlwdGMxMjc7Ci0JdTY0CQlwdGMyNTU7Ci0JdTY0CQlwdGM1MTE7Ci0JdTY0CQlwdGMxMDIzOwotCXU2NAkJcHRjMTUyMjsKLQl1NjQJCW1wdGM7Ci0JdTY0CQlicHRjOwotCXU2NAkJdHNjdGM7Ci0JdTY0CQl0c2N0ZmM7Ci0JdTY0CQlpYWM7Ci0JdTY0CQlpY3J4cHRjOwotCXU2NAkJaWNyeGF0YzsKLQl1NjQJCWljdHhwdGM7Ci0JdTY0CQlpY3R4YXRjOwotCXU2NAkJaWN0eHFlYzsKLQl1NjQJCWljdHhxbXRjOwotCXU2NAkJaWNyeGRtdGM7Ci0JdTY0CQlpY3J4b2M7CisJdTY0IGNyY2VycnM7CisJdTY0IGFsZ25lcnJjOworCXU2NCBzeW1lcnJzOworCXU2NCByeGVycmM7CisJdTY0IHR4ZXJyYzsKKwl1NjQgbXBjOworCXU2NCBzY2M7CisJdTY0IGVjb2w7CisJdTY0IG1jYzsKKwl1NjQgbGF0ZWNvbDsKKwl1NjQgY29sYzsKKwl1NjQgZGM7CisJdTY0IHRuY3JzOworCXU2NCBzZWM7CisJdTY0IGNleHRlcnI7CisJdTY0IHJsZWM7CisJdTY0IHhvbnJ4YzsKKwl1NjQgeG9udHhjOworCXU2NCB4b2ZmcnhjOworCXU2NCB4b2ZmdHhjOworCXU2NCBmY3J1YzsKKwl1NjQgcHJjNjQ7CisJdTY0IHByYzEyNzsKKwl1NjQgcHJjMjU1OworCXU2NCBwcmM1MTE7CisJdTY0IHByYzEwMjM7CisJdTY0IHByYzE1MjI7CisJdTY0IGdwcmM7CisJdTY0IGJwcmM7CisJdTY0IG1wcmM7CisJdTY0IGdwdGM7CisJdTY0IGdvcmNsOworCXU2NCBnb3JjaDsKKwl1NjQgZ290Y2w7CisJdTY0IGdvdGNoOworCXU2NCBybmJjOworCXU2NCBydWM7CisJdTY0IHJmYzsKKwl1NjQgcm9jOworCXU2NCBybGVycmM7CisJdTY0IHJqYzsKKwl1NjQgbWdwcmM7CisJdTY0IG1ncGRjOworCXU2NCBtZ3B0YzsKKwl1NjQgdG9ybDsKKwl1NjQgdG9yaDsKKwl1NjQgdG90bDsKKwl1NjQgdG90aDsKKwl1NjQgdHByOworCXU2NCB0cHQ7CisJdTY0IHB0YzY0OworCXU2NCBwdGMxMjc7CisJdTY0IHB0YzI1NTsKKwl1NjQgcHRjNTExOworCXU2NCBwdGMxMDIzOworCXU2NCBwdGMxNTIyOworCXU2NCBtcHRjOworCXU2NCBicHRjOworCXU2NCB0c2N0YzsKKwl1NjQgdHNjdGZjOworCXU2NCBpYWM7CisJdTY0IGljcnhwdGM7CisJdTY0IGljcnhhdGM7CisJdTY0IGljdHhwdGM7CisJdTY0IGljdHhhdGM7CisJdTY0IGljdHhxZWM7CisJdTY0IGljdHhxbXRjOworCXU2NCBpY3J4ZG10YzsKKwl1NjQgaWNyeG9jOwogfTsKIAogLyogU3RydWN0dXJlIGNvbnRhaW5pbmcgdmFyaWFibGVzIHVzZWQgYnkgdGhlIHNoYXJlZCBjb2RlIChlMTAwMF9ody5jKSAqLwogc3RydWN0IGUxMDAwX2h3IHsKLQl1OCBfX2lvbWVtCQkqaHdfYWRkcjsKLQl1OCBfX2lvbWVtCQkqZmxhc2hfYWRkcmVzczsKLQllMTAwMF9tYWNfdHlwZQkJbWFjX3R5cGU7Ci0JZTEwMDBfcGh5X3R5cGUJCXBoeV90eXBlOwotCXUzMgkJcGh5X2luaXRfc2NyaXB0OwotCWUxMDAwX21lZGlhX3R5cGUJbWVkaWFfdHlwZTsKLQl2b2lkCQkJKmJhY2s7Ci0Jc3RydWN0IGUxMDAwX3NoYWRvd19yYW0JKmVlcHJvbV9zaGFkb3dfcmFtOwotCXUzMgkJZmxhc2hfYmFua19zaXplOwotCXUzMgkJZmxhc2hfYmFzZV9hZGRyOwotCWUxMDAwX2ZjX3R5cGUJCWZjOwotCWUxMDAwX2J1c19zcGVlZAkJYnVzX3NwZWVkOwotCWUxMDAwX2J1c193aWR0aAkJYnVzX3dpZHRoOwotCWUxMDAwX2J1c190eXBlCQlidXNfdHlwZTsKKwl1OCBfX2lvbWVtICpod19hZGRyOworCXU4IF9faW9tZW0gKmZsYXNoX2FkZHJlc3M7CisJZTEwMDBfbWFjX3R5cGUgbWFjX3R5cGU7CisJZTEwMDBfcGh5X3R5cGUgcGh5X3R5cGU7CisJdTMyIHBoeV9pbml0X3NjcmlwdDsKKwllMTAwMF9tZWRpYV90eXBlIG1lZGlhX3R5cGU7CisJdm9pZCAqYmFjazsKKwlzdHJ1Y3QgZTEwMDBfc2hhZG93X3JhbSAqZWVwcm9tX3NoYWRvd19yYW07CisJdTMyIGZsYXNoX2Jhbmtfc2l6ZTsKKwl1MzIgZmxhc2hfYmFzZV9hZGRyOworCWUxMDAwX2ZjX3R5cGUgZmM7CisJZTEwMDBfYnVzX3NwZWVkIGJ1c19zcGVlZDsKKwllMTAwMF9idXNfd2lkdGggYnVzX3dpZHRoOworCWUxMDAwX2J1c190eXBlIGJ1c190eXBlOwogCXN0cnVjdCBlMTAwMF9lZXByb21faW5mbyBlZXByb207Ci0JZTEwMDBfbXNfdHlwZQkJbWFzdGVyX3NsYXZlOwotCWUxMDAwX21zX3R5cGUJCW9yaWdpbmFsX21hc3Rlcl9zbGF2ZTsKLQllMTAwMF9mZmVfY29uZmlnCWZmZV9jb25maWdfc3RhdGU7Ci0JdTMyCQlhc2ZfZmlybXdhcmVfcHJlc2VudDsKLQl1MzIJCWVlcHJvbV9zZW1hcGhvcmVfcHJlc2VudDsKLQl1MzIJCXN3Zndfc3luY19wcmVzZW50OwotCXUzMgkJc3dmd2h3X3NlbWFwaG9yZV9wcmVzZW50OwotCXVuc2lnbmVkIGxvbmcJCWlvX2Jhc2U7Ci0JdTMyCQlwaHlfaWQ7Ci0JdTMyCQlwaHlfcmV2aXNpb247Ci0JdTMyCQlwaHlfYWRkcjsKLQl1MzIJCW9yaWdpbmFsX2ZjOwotCXUzMgkJdHhjdzsKLQl1MzIJCWF1dG9uZWdfZmFpbGVkOwotCXUzMgkJbWF4X2ZyYW1lX3NpemU7Ci0JdTMyCQltaW5fZnJhbWVfc2l6ZTsKLQl1MzIJCW1jX2ZpbHRlcl90eXBlOwotCXUzMgkJbnVtX21jX2FkZHJzOwotCXUzMgkJY29sbGlzaW9uX2RlbHRhOwotCXUzMgkJdHhfcGFja2V0X2RlbHRhOwotCXUzMgkJbGVkY3RsX2RlZmF1bHQ7Ci0JdTMyCQlsZWRjdGxfbW9kZTE7Ci0JdTMyCQlsZWRjdGxfbW9kZTI7Ci0JYm9vbAkJCXR4X3BrdF9maWx0ZXJpbmc7CisJZTEwMDBfbXNfdHlwZSBtYXN0ZXJfc2xhdmU7CisJZTEwMDBfbXNfdHlwZSBvcmlnaW5hbF9tYXN0ZXJfc2xhdmU7CisJZTEwMDBfZmZlX2NvbmZpZyBmZmVfY29uZmlnX3N0YXRlOworCXUzMiBhc2ZfZmlybXdhcmVfcHJlc2VudDsKKwl1MzIgZWVwcm9tX3NlbWFwaG9yZV9wcmVzZW50OworCXVuc2lnbmVkIGxvbmcgaW9fYmFzZTsKKwl1MzIgcGh5X2lkOworCXUzMiBwaHlfcmV2aXNpb247CisJdTMyIHBoeV9hZGRyOworCXUzMiBvcmlnaW5hbF9mYzsKKwl1MzIgdHhjdzsKKwl1MzIgYXV0b25lZ19mYWlsZWQ7CisJdTMyIG1heF9mcmFtZV9zaXplOworCXUzMiBtaW5fZnJhbWVfc2l6ZTsKKwl1MzIgbWNfZmlsdGVyX3R5cGU7CisJdTMyIG51bV9tY19hZGRyczsKKwl1MzIgY29sbGlzaW9uX2RlbHRhOworCXUzMiB0eF9wYWNrZXRfZGVsdGE7CisJdTMyIGxlZGN0bF9kZWZhdWx0OworCXUzMiBsZWRjdGxfbW9kZTE7CisJdTMyIGxlZGN0bF9tb2RlMjsKKwlib29sIHR4X3BrdF9maWx0ZXJpbmc7CiAJc3RydWN0IGUxMDAwX2hvc3RfbW5nX2RoY3BfY29va2llIG1uZ19jb29raWU7Ci0JdTE2CQlwaHlfc3BkX2RlZmF1bHQ7Ci0JdTE2CQlhdXRvbmVnX2FkdmVydGlzZWQ7Ci0JdTE2CQlwY2lfY21kX3dvcmQ7Ci0JdTE2CQlmY19oaWdoX3dhdGVyOwotCXUxNgkJZmNfbG93X3dhdGVyOwotCXUxNgkJZmNfcGF1c2VfdGltZTsKLQl1MTYJCWN1cnJlbnRfaWZzX3ZhbDsKLQl1MTYJCWlmc19taW5fdmFsOwotCXUxNgkJaWZzX21heF92YWw7Ci0JdTE2CQlpZnNfc3RlcF9zaXplOwotCXUxNgkJaWZzX3JhdGlvOwotCXUxNgkJZGV2aWNlX2lkOwotCXUxNgkJdmVuZG9yX2lkOwotCXUxNgkJc3Vic3lzdGVtX2lkOwotCXUxNgkJc3Vic3lzdGVtX3ZlbmRvcl9pZDsKLQl1OAkJCXJldmlzaW9uX2lkOwotCXU4CQkJYXV0b25lZzsKLQl1OAkJCW1kaXg7Ci0JdTgJCQlmb3JjZWRfc3BlZWRfZHVwbGV4OwotCXU4CQkJd2FpdF9hdXRvbmVnX2NvbXBsZXRlOwotCXU4CQkJZG1hX2ZhaXJuZXNzOwotCXU4CQkJbWFjX2FkZHJbTk9ERV9BRERSRVNTX1NJWkVdOwotCXU4CQkJcGVybV9tYWNfYWRkcltOT0RFX0FERFJFU1NfU0laRV07Ci0JYm9vbAkJCWRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbjsKLQlib29sCQkJc3BlZWRfZG93bmdyYWRlZDsKLQllMTAwMF9zbWFydF9zcGVlZAlzbWFydF9zcGVlZDsKLQllMTAwMF9kc3BfY29uZmlnCWRzcF9jb25maWdfc3RhdGU7Ci0JYm9vbAkJCWdldF9saW5rX3N0YXR1czsKLQlib29sCQkJc2VyZGVzX2xpbmtfZG93bjsKLQlib29sCQkJdGJpX2NvbXBhdGliaWxpdHlfZW47Ci0JYm9vbAkJCXRiaV9jb21wYXRpYmlsaXR5X29uOwotCWJvb2wJCQlsYWFfaXNfcHJlc2VudDsKLQlib29sCQkJcGh5X3Jlc2V0X2Rpc2FibGU7Ci0JYm9vbAkJCWluaXRpYWxpemVfaHdfYml0c19kaXNhYmxlOwotCWJvb2wJCQlmY19zZW5kX3hvbjsKLQlib29sCQkJZmNfc3RyaWN0X2llZWU7Ci0JYm9vbAkJCXJlcG9ydF90eF9lYXJseTsKLQlib29sCQkJYWRhcHRpdmVfaWZzOwotCWJvb2wJCQlpZnNfcGFyYW1zX2ZvcmNlZDsKLQlib29sCQkJaW5faWZzX21vZGU7Ci0JYm9vbAkJCW1uZ19yZWdfYWNjZXNzX2Rpc2FibGVkOwotCWJvb2wJCQlsZWF2ZV9hdl9iaXRfb2ZmOwotCWJvb2wJCQlrbXJuX2xvY2tfbG9zc193b3JrYXJvdW5kX2Rpc2FibGVkOwotCWJvb2wJCQliYWRfdHhfY2Fycl9zdGF0c19mZDsKLQlib29sCQkJaGFzX21hbmMyaDsKLQlib29sCQkJcnhfbmVlZHNfa2lja2luZzsKLQlib29sCQkJaGFzX3NtYnVzOworCXUxNiBwaHlfc3BkX2RlZmF1bHQ7CisJdTE2IGF1dG9uZWdfYWR2ZXJ0aXNlZDsKKwl1MTYgcGNpX2NtZF93b3JkOworCXUxNiBmY19oaWdoX3dhdGVyOworCXUxNiBmY19sb3dfd2F0ZXI7CisJdTE2IGZjX3BhdXNlX3RpbWU7CisJdTE2IGN1cnJlbnRfaWZzX3ZhbDsKKwl1MTYgaWZzX21pbl92YWw7CisJdTE2IGlmc19tYXhfdmFsOworCXUxNiBpZnNfc3RlcF9zaXplOworCXUxNiBpZnNfcmF0aW87CisJdTE2IGRldmljZV9pZDsKKwl1MTYgdmVuZG9yX2lkOworCXUxNiBzdWJzeXN0ZW1faWQ7CisJdTE2IHN1YnN5c3RlbV92ZW5kb3JfaWQ7CisJdTggcmV2aXNpb25faWQ7CisJdTggYXV0b25lZzsKKwl1OCBtZGl4OworCXU4IGZvcmNlZF9zcGVlZF9kdXBsZXg7CisJdTggd2FpdF9hdXRvbmVnX2NvbXBsZXRlOworCXU4IGRtYV9mYWlybmVzczsKKwl1OCBtYWNfYWRkcltOT0RFX0FERFJFU1NfU0laRV07CisJdTggcGVybV9tYWNfYWRkcltOT0RFX0FERFJFU1NfU0laRV07CisJYm9vbCBkaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb247CisJYm9vbCBzcGVlZF9kb3duZ3JhZGVkOworCWUxMDAwX3NtYXJ0X3NwZWVkIHNtYXJ0X3NwZWVkOworCWUxMDAwX2RzcF9jb25maWcgZHNwX2NvbmZpZ19zdGF0ZTsKKwlib29sIGdldF9saW5rX3N0YXR1czsKKwlib29sIHNlcmRlc19oYXNfbGluazsKKwlib29sIHRiaV9jb21wYXRpYmlsaXR5X2VuOworCWJvb2wgdGJpX2NvbXBhdGliaWxpdHlfb247CisJYm9vbCBsYWFfaXNfcHJlc2VudDsKKwlib29sIHBoeV9yZXNldF9kaXNhYmxlOworCWJvb2wgaW5pdGlhbGl6ZV9od19iaXRzX2Rpc2FibGU7CisJYm9vbCBmY19zZW5kX3hvbjsKKwlib29sIGZjX3N0cmljdF9pZWVlOworCWJvb2wgcmVwb3J0X3R4X2Vhcmx5OworCWJvb2wgYWRhcHRpdmVfaWZzOworCWJvb2wgaWZzX3BhcmFtc19mb3JjZWQ7CisJYm9vbCBpbl9pZnNfbW9kZTsKKwlib29sIG1uZ19yZWdfYWNjZXNzX2Rpc2FibGVkOworCWJvb2wgbGVhdmVfYXZfYml0X29mZjsKKwlib29sIGJhZF90eF9jYXJyX3N0YXRzX2ZkOworCWJvb2wgaGFzX3NtYnVzOwogfTsKIAotCi0jZGVmaW5lIEUxMDAwX0VFUFJPTV9TV0RQSU4wICAgMHgwMDAxICAgLyogU1dEUElOIDAgRUVQUk9NIFZhbHVlICovCi0jZGVmaW5lIEUxMDAwX0VFUFJPTV9MRURfTE9HSUMgMHgwMDIwICAgLyogTGVkIExvZ2ljIFdvcmQgKi8KLSNkZWZpbmUgRTEwMDBfRUVQUk9NX1JXX1JFR19EQVRBICAgMTYgICAvKiBPZmZzZXQgdG8gZGF0YSBpbiBFRVBST00gcmVhZC93cml0ZSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRTEwMDBfRUVQUk9NX1JXX1JFR19ET05FICAgMiAgICAvKiBPZmZzZXQgdG8gUkVBRC9XUklURSBkb25lIGJpdCAqLwotI2RlZmluZSBFMTAwMF9FRVBST01fUldfUkVHX1NUQVJUICAxICAgIC8qIEZpcnN0IGJpdCBmb3IgdGVsbGluZyBwYXJ0IHRvIHN0YXJ0IG9wZXJhdGlvbiAqLwotI2RlZmluZSBFMTAwMF9FRVBST01fUldfQUREUl9TSElGVCAyICAgIC8qIFNoaWZ0IHRvIHRoZSBhZGRyZXNzIGJpdHMgKi8KLSNkZWZpbmUgRTEwMDBfRUVQUk9NX1BPTExfV1JJVEUgICAgMSAgICAvKiBGbGFnIGZvciBwb2xsaW5nIGZvciB3cml0ZSBjb21wbGV0ZSAqLwotI2RlZmluZSBFMTAwMF9FRVBST01fUE9MTF9SRUFEICAgICAwICAgIC8qIEZsYWcgZm9yIHBvbGxpbmcgZm9yIHJlYWQgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX1NXRFBJTjAgICAweDAwMDEJLyogU1dEUElOIDAgRUVQUk9NIFZhbHVlICovCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9MRURfTE9HSUMgMHgwMDIwCS8qIExlZCBMb2dpYyBXb3JkICovCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9SV19SRUdfREFUQSAgIDE2CS8qIE9mZnNldCB0byBkYXRhIGluIEVFUFJPTSByZWFkL3dyaXRlIHJlZ2lzdGVycyAqLworI2RlZmluZSBFMTAwMF9FRVBST01fUldfUkVHX0RPTkUgICAyCS8qIE9mZnNldCB0byBSRUFEL1dSSVRFIGRvbmUgYml0ICovCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9SV19SRUdfU1RBUlQgIDEJLyogRmlyc3QgYml0IGZvciB0ZWxsaW5nIHBhcnQgdG8gc3RhcnQgb3BlcmF0aW9uICovCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9SV19BRERSX1NISUZUIDIJLyogU2hpZnQgdG8gdGhlIGFkZHJlc3MgYml0cyAqLworI2RlZmluZSBFMTAwMF9FRVBST01fUE9MTF9XUklURSAgICAxCS8qIEZsYWcgZm9yIHBvbGxpbmcgZm9yIHdyaXRlIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9QT0xMX1JFQUQgICAgIDAJLyogRmxhZyBmb3IgcG9sbGluZyBmb3IgcmVhZCBjb21wbGV0ZSAqLwogLyogUmVnaXN0ZXIgQml0IE1hc2tzICovCiAvKiBEZXZpY2UgQ29udHJvbCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0ZEICAgICAgIDB4MDAwMDAwMDEgIC8qIEZ1bGwgZHVwbGV4LjA9aGFsZjsgMT1mdWxsICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfQkVNICAgICAgMHgwMDAwMDAwMiAgLyogRW5kaWFuIE1vZGUuMD1saXR0bGUsMT1iaWcgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9QUklPUiAgICAweDAwMDAwMDA0ICAvKiBQcmlvcml0eSBvbiBQQ0kuIDA9cngsMT1mYWlyICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfR0lPX01BU1RFUl9ESVNBQkxFIDB4MDAwMDAwMDQgLypCbG9ja3MgbmV3IE1hc3RlciByZXF1ZXN0cyAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0xSU1QgICAgIDB4MDAwMDAwMDggIC8qIExpbmsgcmVzZXQuIDA9bm9ybWFsLDE9cmVzZXQgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9UTUUgICAgICAweDAwMDAwMDEwICAvKiBUZXN0IG1vZGUuIDA9bm9ybWFsLDE9dGVzdCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1NMRSAgICAgIDB4MDAwMDAwMjAgIC8qIFNlcmlhbCBMaW5rIG9uIDA9ZGlzLDE9ZW4gKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9BU0RFICAgICAweDAwMDAwMDIwICAvKiBBdXRvLXNwZWVkIGRldGVjdCBlbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9TTFUgICAgICAweDAwMDAwMDQwICAvKiBTZXQgbGluayB1cCAoRm9yY2UgTGluaykgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9JTE9TICAgICAweDAwMDAwMDgwICAvKiBJbnZlcnQgTG9zcy1PZiBTaWduYWwgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfU0VMICAweDAwMDAwMzAwICAvKiBTcGVlZCBTZWxlY3QgTWFzayAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1NQRF8xMCAgIDB4MDAwMDAwMDAgIC8qIEZvcmNlIDEwTWIgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAwICAweDAwMDAwMTAwICAvKiBGb3JjZSAxMDBNYiAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1NQRF8xMDAwIDB4MDAwMDAyMDAgIC8qIEZvcmNlIDFHYiAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0JFTTMyICAgIDB4MDAwMDA0MDAgIC8qIEJpZyBFbmRpYW4gMzIgbW9kZSAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0ZSQ1NQRCAgIDB4MDAwMDA4MDAgIC8qIEZvcmNlIFNwZWVkICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfRlJDRFBYICAgMHgwMDAwMTAwMCAgLyogRm9yY2UgRHVwbGV4ICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfRF9VRF9FTiAgMHgwMDAwMjAwMCAgLyogRG9jay9VbmRvY2sgZW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfRF9VRF9QT0xBUklUWSAweDAwMDA0MDAwIC8qIERlZmluZWQgcG9sYXJpdHkgb2YgRG9jay9VbmRvY2sgaW5kaWNhdGlvbiBpbiBTRFBbMF0gKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9GT1JDRV9QSFlfUkVTRVQgMHgwMDAwODAwMCAvKiBSZXNldCBib3RoIFBIWSBwb3J0cywgdGhyb3VnaCBQSFlSU1RfTiBwaW4gKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19FTiAweDAwMDEwMDAwIC8qIGVuYWJsZSBsaW5rIHN0YXR1cyBmcm9tIGV4dGVybmFsIExJTktfMCBhbmQgTElOS18xIHBpbnMgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4wICAweDAwMDQwMDAwICAvKiBTV0RQSU4gMCB2YWx1ZSAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjEgIDB4MDAwODAwMDAgIC8qIFNXRFBJTiAxIHZhbHVlICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMiAgMHgwMDEwMDAwMCAgLyogU1dEUElOIDIgdmFsdWUgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4zICAweDAwMjAwMDAwICAvKiBTV0RQSU4gMyB2YWx1ZSAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzAgIDB4MDA0MDAwMDAgIC8qIFNXRFBJTiAwIElucHV0IG9yIG91dHB1dCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzEgIDB4MDA4MDAwMDAgIC8qIFNXRFBJTiAxIGlucHV0IG9yIG91dHB1dCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzIgIDB4MDEwMDAwMDAgIC8qIFNXRFBJTiAyIGlucHV0IG9yIG91dHB1dCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzMgIDB4MDIwMDAwMDAgIC8qIFNXRFBJTiAzIGlucHV0IG9yIG91dHB1dCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1JTVCAgICAgIDB4MDQwMDAwMDAgIC8qIEdsb2JhbCByZXNldCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1JGQ0UgICAgIDB4MDgwMDAwMDAgIC8qIFJlY2VpdmUgRmxvdyBDb250cm9sIGVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1RGQ0UgICAgIDB4MTAwMDAwMDAgIC8qIFRyYW5zbWl0IGZsb3cgY29udHJvbCBlbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9SVEUgICAgICAweDIwMDAwMDAwICAvKiBSb3V0aW5nIHRhZyBlbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9WTUUgICAgICAweDQwMDAwMDAwICAvKiBJRUVFIFZMQU4gbW9kZSBlbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUlNUICAweDgwMDAwMDAwICAvKiBQSFkgUmVzZXQgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9TVzJGV19JTlQgMHgwMjAwMDAwMCAgLyogSW5pdGlhdGUgYW4gaW50ZXJydXB0IHRvIG1hbmFnZWFiaWxpdHkgZW5naW5lICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRkQgICAgICAgMHgwMDAwMDAwMQkvKiBGdWxsIGR1cGxleC4wPWhhbGY7IDE9ZnVsbCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0JFTSAgICAgIDB4MDAwMDAwMDIJLyogRW5kaWFuIE1vZGUuMD1saXR0bGUsMT1iaWcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9QUklPUiAgICAweDAwMDAwMDA0CS8qIFByaW9yaXR5IG9uIFBDSS4gMD1yeCwxPWZhaXIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9HSU9fTUFTVEVSX0RJU0FCTEUgMHgwMDAwMDAwNAkvKkJsb2NrcyBuZXcgTWFzdGVyIHJlcXVlc3RzICovCisjZGVmaW5lIEUxMDAwX0NUUkxfTFJTVCAgICAgMHgwMDAwMDAwOAkvKiBMaW5rIHJlc2V0LiAwPW5vcm1hbCwxPXJlc2V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVE1FICAgICAgMHgwMDAwMDAxMAkvKiBUZXN0IG1vZGUuIDA9bm9ybWFsLDE9dGVzdCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NMRSAgICAgIDB4MDAwMDAwMjAJLyogU2VyaWFsIExpbmsgb24gMD1kaXMsMT1lbiAqLworI2RlZmluZSBFMTAwMF9DVFJMX0FTREUgICAgIDB4MDAwMDAwMjAJLyogQXV0by1zcGVlZCBkZXRlY3QgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU0xVICAgICAgMHgwMDAwMDA0MAkvKiBTZXQgbGluayB1cCAoRm9yY2UgTGluaykgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9JTE9TICAgICAweDAwMDAwMDgwCS8qIEludmVydCBMb3NzLU9mIFNpZ25hbCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NQRF9TRUwgIDB4MDAwMDAzMDAJLyogU3BlZWQgU2VsZWN0IE1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAgICAweDAwMDAwMDAwCS8qIEZvcmNlIDEwTWIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAwICAweDAwMDAwMTAwCS8qIEZvcmNlIDEwME1iICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEXzEwMDAgMHgwMDAwMDIwMAkvKiBGb3JjZSAxR2IgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9CRU0zMiAgICAweDAwMDAwNDAwCS8qIEJpZyBFbmRpYW4gMzIgbW9kZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0ZSQ1NQRCAgIDB4MDAwMDA4MDAJLyogRm9yY2UgU3BlZWQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9GUkNEUFggICAweDAwMDAxMDAwCS8qIEZvcmNlIER1cGxleCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0RfVURfRU4gIDB4MDAwMDIwMDAJLyogRG9jay9VbmRvY2sgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRF9VRF9QT0xBUklUWSAweDAwMDA0MDAwCS8qIERlZmluZWQgcG9sYXJpdHkgb2YgRG9jay9VbmRvY2sgaW5kaWNhdGlvbiBpbiBTRFBbMF0gKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9GT1JDRV9QSFlfUkVTRVQgMHgwMDAwODAwMAkvKiBSZXNldCBib3RoIFBIWSBwb3J0cywgdGhyb3VnaCBQSFlSU1RfTiBwaW4gKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19FTiAweDAwMDEwMDAwCS8qIGVuYWJsZSBsaW5rIHN0YXR1cyBmcm9tIGV4dGVybmFsIExJTktfMCBhbmQgTElOS18xIHBpbnMgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4wICAweDAwMDQwMDAwCS8qIFNXRFBJTiAwIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMSAgMHgwMDA4MDAwMAkvKiBTV0RQSU4gMSB2YWx1ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjIgIDB4MDAxMDAwMDAJLyogU1dEUElOIDIgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4zICAweDAwMjAwMDAwCS8qIFNXRFBJTiAzIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMCAgMHgwMDQwMDAwMAkvKiBTV0RQSU4gMCBJbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8xICAweDAwODAwMDAwCS8qIFNXRFBJTiAxIGlucHV0IG9yIG91dHB1dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTzIgIDB4MDEwMDAwMDAJLyogU1dEUElOIDIgaW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMyAgMHgwMjAwMDAwMAkvKiBTV0RQSU4gMyBpbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9SU1QgICAgICAweDA0MDAwMDAwCS8qIEdsb2JhbCByZXNldCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1JGQ0UgICAgIDB4MDgwMDAwMDAJLyogUmVjZWl2ZSBGbG93IENvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVEZDRSAgICAgMHgxMDAwMDAwMAkvKiBUcmFuc21pdCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUlRFICAgICAgMHgyMDAwMDAwMAkvKiBSb3V0aW5nIHRhZyBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9WTUUgICAgICAweDQwMDAwMDAwCS8qIElFRUUgVkxBTiBtb2RlIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SU1QgIDB4ODAwMDAwMDAJLyogUEhZIFJlc2V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1cyRldfSU5UIDB4MDIwMDAwMDAJLyogSW5pdGlhdGUgYW4gaW50ZXJydXB0IHRvIG1hbmFnZWFiaWxpdHkgZW5naW5lICovCiAKIC8qIERldmljZSBTdGF0dXMgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZEICAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIEZ1bGwgZHVwbGV4LjA9aGFsZiwxPWZ1bGwgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0xVICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIExpbmsgdXAuMD1ubywxPWxpbmsgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZVTkNfTUFTSyAgMHgwMDAwMDAwQyAgICAgIC8qIFBDSSBGdW5jdGlvbiBNYXNrICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GRCAgICAgICAgIDB4MDAwMDAwMDEJLyogRnVsbCBkdXBsZXguMD1oYWxmLDE9ZnVsbCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfTFUgICAgICAgICAweDAwMDAwMDAyCS8qIExpbmsgdXAuMD1ubywxPWxpbmsgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZVTkNfTUFTSyAgMHgwMDAwMDAwQwkvKiBQQ0kgRnVuY3Rpb24gTWFzayAqLwogI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ19TSElGVCAyCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DXzAgICAgIDB4MDAwMDAwMDAgICAgICAvKiBGdW5jdGlvbiAwICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DXzEgICAgIDB4MDAwMDAwMDQgICAgICAvKiBGdW5jdGlvbiAxICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19UWE9GRiAgICAgIDB4MDAwMDAwMTAgICAgICAvKiB0cmFuc21pc3Npb24gcGF1c2VkICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19UQklNT0RFICAgIDB4MDAwMDAwMjAgICAgICAvKiBUQkkgbW9kZSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ18wICAgICAweDAwMDAwMDAwCS8qIEZ1bmN0aW9uIDAgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZVTkNfMSAgICAgMHgwMDAwMDAwNAkvKiBGdW5jdGlvbiAxICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19UWE9GRiAgICAgIDB4MDAwMDAwMTAJLyogdHJhbnNtaXNzaW9uIHBhdXNlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfVEJJTU9ERSAgICAweDAwMDAwMDIwCS8qIFRCSSBtb2RlICovCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF9NQVNLIDB4MDAwMDAwQzAKLSNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEXzEwICAgMHgwMDAwMDAwMCAgICAgIC8qIFNwZWVkIDEwTWIvcyAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwICAweDAwMDAwMDQwICAgICAgLyogU3BlZWQgMTAwTWIvcyAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCAweDAwMDAwMDgwICAgICAgLyogU3BlZWQgMTAwME1iL3MgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0xBTl9JTklUX0RPTkUgMHgwMDAwMDIwMCAgIC8qIExhbiBJbml0IENvbXBsZXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IEVFUFJPTS9GbGFzaCAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfQVNEViAgICAgICAweDAwMDAwMzAwICAgICAgLyogQXV0byBzcGVlZCBkZXRlY3QgdmFsdWUgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0RPQ0tfQ0kgICAgMHgwMDAwMDgwMCAgICAgIC8qIENoYW5nZSBpbiBEb2NrL1VuZG9jayBzdGF0ZS4gQ2xlYXIgb24gd3JpdGUgJzAnLiAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfR0lPX01BU1RFUl9FTkFCTEUgMHgwMDA4MDAwMCAvKiBTdGF0dXMgb2YgTWFzdGVyIHJlcXVlc3RzLiAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfTVRYQ0tPSyAgICAweDAwMDAwNDAwICAgICAgLyogTVRYIGNsb2NrIHJ1bm5pbmcgT0sgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSTY2ICAgICAgMHgwMDAwMDgwMCAgICAgIC8qIEluIDY2TWh6IHNsb3QgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0JVUzY0ICAgICAgMHgwMDAwMTAwMCAgICAgIC8qIEluIDY0IGJpdCBzbG90ICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX01PREUgIDB4MDAwMDIwMDAgICAgICAvKiBQQ0ktWCBtb2RlICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEIDB4MDAwMEMwMDAgICAgICAvKiBQQ0ktWCBidXMgc3BlZWQgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0JNQ19TS1VfMCAgMHgwMDEwMDAwMCAvKiBCTUMgVVNCIHJlZGlyZWN0IGRpc2FibGVkICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19CTUNfU0tVXzEgIDB4MDAyMDAwMDAgLyogQk1DIFNSQU0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0JNQ19TS1VfMiAgMHgwMDQwMDAwMCAvKiBCTUMgU0RSQU0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0JNQ19DUllQVE8gMHgwMDgwMDAwMCAvKiBCTUMgY3J5cHRvIGRpc2FibGVkICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19CTUNfTElURSAgIDB4MDEwMDAwMDAgLyogQk1DIGV4dGVybmFsIGNvZGUgZXhlY3V0aW9uIGRpc2FibGVkICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19SR01JSV9FTkFCTEUgMHgwMjAwMDAwMCAvKiBSR01JSSBkaXNhYmxlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAgICAweDAwMDAwMDAwCS8qIFNwZWVkIDEwTWIvcyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwICAweDAwMDAwMDQwCS8qIFNwZWVkIDEwME1iL3MgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMDAgMHgwMDAwMDA4MAkvKiBTcGVlZCAxMDAwTWIvcyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfTEFOX0lOSVRfRE9ORSAweDAwMDAwMjAwCS8qIExhbiBJbml0IENvbXBsZXRpb24KKwkJCQkJCSAgIGJ5IEVFUFJPTS9GbGFzaCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfQVNEViAgICAgICAweDAwMDAwMzAwCS8qIEF1dG8gc3BlZWQgZGV0ZWN0IHZhbHVlICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19ET0NLX0NJICAgIDB4MDAwMDA4MDAJLyogQ2hhbmdlIGluIERvY2svVW5kb2NrIHN0YXRlLiBDbGVhciBvbiB3cml0ZSAnMCcuICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19HSU9fTUFTVEVSX0VOQUJMRSAweDAwMDgwMDAwCS8qIFN0YXR1cyBvZiBNYXN0ZXIgcmVxdWVzdHMuICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19NVFhDS09LICAgIDB4MDAwMDA0MDAJLyogTVRYIGNsb2NrIHJ1bm5pbmcgT0sgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSTY2ICAgICAgMHgwMDAwMDgwMAkvKiBJbiA2Nk1oeiBzbG90ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CVVM2NCAgICAgIDB4MDAwMDEwMDAJLyogSW4gNjQgYml0IHNsb3QgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfTU9ERSAgMHgwMDAwMjAwMAkvKiBQQ0ktWCBtb2RlICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEIDB4MDAwMEMwMDAJLyogUENJLVggYnVzIHNwZWVkICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CTUNfU0tVXzAgIDB4MDAxMDAwMDAJLyogQk1DIFVTQiByZWRpcmVjdCBkaXNhYmxlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfQk1DX1NLVV8xICAweDAwMjAwMDAwCS8qIEJNQyBTUkFNIGRpc2FibGVkICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CTUNfU0tVXzIgIDB4MDA0MDAwMDAJLyogQk1DIFNEUkFNIGRpc2FibGVkICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CTUNfQ1JZUFRPIDB4MDA4MDAwMDAJLyogQk1DIGNyeXB0byBkaXNhYmxlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfQk1DX0xJVEUgICAweDAxMDAwMDAwCS8qIEJNQyBleHRlcm5hbCBjb2RlIGV4ZWN1dGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUkdNSUlfRU5BQkxFIDB4MDIwMDAwMDAJLyogUkdNSUkgZGlzYWJsZWQgKi8KICNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZVU0VfOCAgICAgICAweDA0MDAwMDAwCiAjZGVmaW5lIEUxMDAwX1NUQVRVU19GVVNFXzkgICAgICAgMHgwODAwMDAwMAotI2RlZmluZSBFMTAwMF9TVEFUVVNfU0VSREVTMF9ESVMgIDB4MTAwMDAwMDAgLyogU0VSREVTIGRpc2FibGVkIG9uIHBvcnQgMCAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfU0VSREVTMV9ESVMgIDB4MjAwMDAwMDAgLyogU0VSREVTIGRpc2FibGVkIG9uIHBvcnQgMSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU0VSREVTMF9ESVMgIDB4MTAwMDAwMDAJLyogU0VSREVTIGRpc2FibGVkIG9uIHBvcnQgMCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU0VSREVTMV9ESVMgIDB4MjAwMDAwMDAJLyogU0VSREVTIGRpc2FibGVkIG9uIHBvcnQgMSAqLwogCi0vKiBDb25zdGFudHMgdXNlZCB0byBpbnRyZXByZXQgdGhlIG1hc2tlZCBQQ0ktWCBidXMgc3BlZWQuICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzY2ICAweDAwMDAwMDAwIC8qIFBDSS1YIGJ1cyBzcGVlZCAgNTAtNjYgTUh6ICovCi0jZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEwMCAweDAwMDA0MDAwIC8qIFBDSS1YIGJ1cyBzcGVlZCAgNjYtMTAwIE1IeiAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRF8xMzMgMHgwMDAwODAwMCAvKiBQQ0ktWCBidXMgc3BlZWQgMTAwLTEzMyBNSHogKi8KKy8qIENvbnN0YW50cyB1c2VkIHRvIGludGVycHJldCB0aGUgbWFza2VkIFBDSS1YIGJ1cyBzcGVlZC4gKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfNjYgIDB4MDAwMDAwMDAJLyogUENJLVggYnVzIHNwZWVkICA1MC02NiBNSHogKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfMTAwIDB4MDAwMDQwMDAJLyogUENJLVggYnVzIHNwZWVkICA2Ni0xMDAgTUh6ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEzMyAweDAwMDA4MDAwCS8qIFBDSS1YIGJ1cyBzcGVlZCAxMDAtMTMzIE1IeiAqLwogCiAvKiBFRVBST00vRmxhc2ggQ29udHJvbCAqLwotI2RlZmluZSBFMTAwMF9FRUNEX1NLICAgICAgICAweDAwMDAwMDAxIC8qIEVFUFJPTSBDbG9jayAqLwotI2RlZmluZSBFMTAwMF9FRUNEX0NTICAgICAgICAweDAwMDAwMDAyIC8qIEVFUFJPTSBDaGlwIFNlbGVjdCAqLwotI2RlZmluZSBFMTAwMF9FRUNEX0RJICAgICAgICAweDAwMDAwMDA0IC8qIEVFUFJPTSBEYXRhIEluICovCi0jZGVmaW5lIEUxMDAwX0VFQ0RfRE8gICAgICAgIDB4MDAwMDAwMDggLyogRUVQUk9NIERhdGEgT3V0ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0sgICAgICAgIDB4MDAwMDAwMDEJLyogRUVQUk9NIENsb2NrICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfQ1MgICAgICAgIDB4MDAwMDAwMDIJLyogRUVQUk9NIENoaXAgU2VsZWN0ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfREkgICAgICAgIDB4MDAwMDAwMDQJLyogRUVQUk9NIERhdGEgSW4gKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9ETyAgICAgICAgMHgwMDAwMDAwOAkvKiBFRVBST00gRGF0YSBPdXQgKi8KICNkZWZpbmUgRTEwMDBfRUVDRF9GV0VfTUFTSyAgMHgwMDAwMDAzMAotI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9ESVMgICAweDAwMDAwMDEwIC8qIERpc2FibGUgRkxBU0ggd3JpdGVzICovCi0jZGVmaW5lIEUxMDAwX0VFQ0RfRldFX0VOICAgIDB4MDAwMDAwMjAgLyogRW5hYmxlIEZMQVNIIHdyaXRlcyAqLworI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9ESVMgICAweDAwMDAwMDEwCS8qIERpc2FibGUgRkxBU0ggd3JpdGVzICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX0VOICAgIDB4MDAwMDAwMjAJLyogRW5hYmxlIEZMQVNIIHdyaXRlcyAqLwogI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9TSElGVCA0Ci0jZGVmaW5lIEUxMDAwX0VFQ0RfUkVRICAgICAgIDB4MDAwMDAwNDAgLyogRUVQUk9NIEFjY2VzcyBSZXF1ZXN0ICovCi0jZGVmaW5lIEUxMDAwX0VFQ0RfR05UICAgICAgIDB4MDAwMDAwODAgLyogRUVQUk9NIEFjY2VzcyBHcmFudCAqLwotI2RlZmluZSBFMTAwMF9FRUNEX1BSRVMgICAgICAweDAwMDAwMTAwIC8qIEVFUFJPTSBQcmVzZW50ICovCi0jZGVmaW5lIEUxMDAwX0VFQ0RfU0laRSAgICAgIDB4MDAwMDAyMDAgLyogRUVQUk9NIFNpemUgKDA9NjQgd29yZCAxPTI1NiB3b3JkKSAqLwotI2RlZmluZSBFMTAwMF9FRUNEX0FERFJfQklUUyAweDAwMDAwNDAwIC8qIEVFUFJPTSBBZGRyZXNzaW5nIGJpdHMgYmFzZWQgb24gdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgwLXNtYWxsLCAxLWxhcmdlKSAqLwotI2RlZmluZSBFMTAwMF9FRUNEX1RZUEUgICAgICAweDAwMDAyMDAwIC8qIEVFUFJPTSBUeXBlICgxLVNQSSwgMC1NaWNyb3dpcmUpICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfUkVRICAgICAgIDB4MDAwMDAwNDAJLyogRUVQUk9NIEFjY2VzcyBSZXF1ZXN0ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfR05UICAgICAgIDB4MDAwMDAwODAJLyogRUVQUk9NIEFjY2VzcyBHcmFudCAqLworI2RlZmluZSBFMTAwMF9FRUNEX1BSRVMgICAgICAweDAwMDAwMTAwCS8qIEVFUFJPTSBQcmVzZW50ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0laRSAgICAgIDB4MDAwMDAyMDAJLyogRUVQUk9NIFNpemUgKDA9NjQgd29yZCAxPTI1NiB3b3JkKSAqLworI2RlZmluZSBFMTAwMF9FRUNEX0FERFJfQklUUyAweDAwMDAwNDAwCS8qIEVFUFJPTSBBZGRyZXNzaW5nIGJpdHMgYmFzZWQgb24gdHlwZQorCQkJCQkgKiAoMC1zbWFsbCwgMS1sYXJnZSkgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9UWVBFICAgICAgMHgwMDAwMjAwMAkvKiBFRVBST00gVHlwZSAoMS1TUEksIDAtTWljcm93aXJlKSAqLwogI2lmbmRlZiBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMKLSNkZWZpbmUgRTEwMDBfRUVQUk9NX0dSQU5UX0FUVEVNUFRTIDEwMDAgLyogRUVQUk9NICMgYXR0ZW1wdHMgdG8gZ2FpbiBncmFudCAqLworI2RlZmluZSBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMgMTAwMAkvKiBFRVBST00gIyBhdHRlbXB0cyB0byBnYWluIGdyYW50ICovCiAjZW5kaWYKLSNkZWZpbmUgRTEwMDBfRUVDRF9BVVRPX1JEICAgICAgICAgIDB4MDAwMDAyMDAgIC8qIEVFUFJPTSBBdXRvIFJlYWQgZG9uZSAqLwotI2RlZmluZSBFMTAwMF9FRUNEX1NJWkVfRVhfTUFTSyAgICAgMHgwMDAwNzgwMCAgLyogRUVwcm9tIFNpemUgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9BVVRPX1JEICAgICAgICAgIDB4MDAwMDAyMDAJLyogRUVQUk9NIEF1dG8gUmVhZCBkb25lICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0laRV9FWF9NQVNLICAgICAweDAwMDA3ODAwCS8qIEVFcHJvbSBTaXplICovCiAjZGVmaW5lIEUxMDAwX0VFQ0RfU0laRV9FWF9TSElGVCAgICAxMQotI2RlZmluZSBFMTAwMF9FRUNEX05WQUREUyAgICAweDAwMDE4MDAwIC8qIE5WTSBBZGRyZXNzIFNpemUgKi8KLSNkZWZpbmUgRTEwMDBfRUVDRF9TRUxTSEFEICAgMHgwMDAyMDAwMCAvKiBTZWxlY3QgU2hhZG93IFJBTSAqLwotI2RlZmluZSBFMTAwMF9FRUNEX0lOSVRTUkFNICAweDAwMDQwMDAwIC8qIEluaXRpYWxpemUgU2hhZG93IFJBTSAqLwotI2RlZmluZSBFMTAwMF9FRUNEX0ZMVVBEICAgICAweDAwMDgwMDAwIC8qIFVwZGF0ZSBGTEFTSCAqLwotI2RlZmluZSBFMTAwMF9FRUNEX0FVUERFTiAgICAweDAwMTAwMDAwIC8qIEVuYWJsZSBBdXRvbm9tb3VzIEZMQVNIIHVwZGF0ZSAqLwotI2RlZmluZSBFMTAwMF9FRUNEX1NIQURWICAgICAweDAwMjAwMDAwIC8qIFNoYWRvdyBSQU0gRGF0YSBWYWxpZCAqLwotI2RlZmluZSBFMTAwMF9FRUNEX1NFQzFWQUwgICAweDAwNDAwMDAwIC8qIFNlY3RvciBPbmUgVmFsaWQgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9OVkFERFMgICAgMHgwMDAxODAwMAkvKiBOVk0gQWRkcmVzcyBTaXplICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0VMU0hBRCAgIDB4MDAwMjAwMDAJLyogU2VsZWN0IFNoYWRvdyBSQU0gKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9JTklUU1JBTSAgMHgwMDA0MDAwMAkvKiBJbml0aWFsaXplIFNoYWRvdyBSQU0gKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9GTFVQRCAgICAgMHgwMDA4MDAwMAkvKiBVcGRhdGUgRkxBU0ggKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9BVVBERU4gICAgMHgwMDEwMDAwMAkvKiBFbmFibGUgQXV0b25vbW91cyBGTEFTSCB1cGRhdGUgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TSEFEViAgICAgMHgwMDIwMDAwMAkvKiBTaGFkb3cgUkFNIERhdGEgVmFsaWQgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9TRUMxVkFMICAgMHgwMDQwMDAwMAkvKiBTZWN0b3IgT25lIFZhbGlkICovCiAjZGVmaW5lIEUxMDAwX0VFQ0RfU0VDVkFMX1NISUZUICAgICAgMjIKICNkZWZpbmUgRTEwMDBfU1RNX09QQ09ERSAgICAgMHhEQjAwCiAjZGVmaW5lIEUxMDAwX0hJQ1JfRldfUkVTRVQgIDB4QzAKQEAgLTE1OTMsMTIgKzE1MDYsMTIgQEAKICNkZWZpbmUgRTEwMDBfSUNIX05WTV9TSUdfTUFTSyAgICAgMHhDMAogCiAvKiBFRVBST00gUmVhZCAqLwotI2RlZmluZSBFMTAwMF9FRVJEX1NUQVJUICAgICAgMHgwMDAwMDAwMSAvKiBTdGFydCBSZWFkICovCi0jZGVmaW5lIEUxMDAwX0VFUkRfRE9ORSAgICAgICAweDAwMDAwMDEwIC8qIFJlYWQgRG9uZSAqLworI2RlZmluZSBFMTAwMF9FRVJEX1NUQVJUICAgICAgMHgwMDAwMDAwMQkvKiBTdGFydCBSZWFkICovCisjZGVmaW5lIEUxMDAwX0VFUkRfRE9ORSAgICAgICAweDAwMDAwMDEwCS8qIFJlYWQgRG9uZSAqLwogI2RlZmluZSBFMTAwMF9FRVJEX0FERFJfU0hJRlQgOAotI2RlZmluZSBFMTAwMF9FRVJEX0FERFJfTUFTSyAgMHgwMDAwRkYwMCAvKiBSZWFkIEFkZHJlc3MgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9BRERSX01BU0sgIDB4MDAwMEZGMDAJLyogUmVhZCBBZGRyZXNzICovCiAjZGVmaW5lIEUxMDAwX0VFUkRfREFUQV9TSElGVCAxNgotI2RlZmluZSBFMTAwMF9FRVJEX0RBVEFfTUFTSyAgMHhGRkZGMDAwMCAvKiBSZWFkIERhdGEgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9EQVRBX01BU0sgIDB4RkZGRjAwMDAJLyogUmVhZCBEYXRhICovCiAKIC8qIFNQSSBFRVBST00gU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lIEVFUFJPTV9TVEFUVVNfUkRZX1NQSSAgMHgwMQpAQCAtMTYwOCwyNSArMTUyMSwyNSBAQAogI2RlZmluZSBFRVBST01fU1RBVFVTX1dQRU5fU1BJIDB4ODAKIAogLyogRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMF9FTiAgIDB4MDAwMDAwMDEgLyogTWFwcyBTRFA0IHRvIEdQSTAgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMV9FTiAgIDB4MDAwMDAwMDIgLyogTWFwcyBTRFA1IHRvIEdQSTEgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMF9FTiAgIDB4MDAwMDAwMDEJLyogTWFwcyBTRFA0IHRvIEdQSTAgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMV9FTiAgIDB4MDAwMDAwMDIJLyogTWFwcyBTRFA1IHRvIEdQSTEgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUEhZSU5UX0VOIEUxMDAwX0NUUkxfRVhUX0dQSTFfRU4KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMl9FTiAgIDB4MDAwMDAwMDQgLyogTWFwcyBTRFA2IHRvIEdQSTIgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJM19FTiAgIDB4MDAwMDAwMDggLyogTWFwcyBTRFA3IHRvIEdQSTMgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNF9EQVRBIDB4MDAwMDAwMTAgLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA1X0RBVEEgMHgwMDAwMDAyMCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA1ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0dQSTJfRU4gICAweDAwMDAwMDA0CS8qIE1hcHMgU0RQNiB0byBHUEkyICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0dQSTNfRU4gICAweDAwMDAwMDA4CS8qIE1hcHMgU0RQNyB0byBHUEkzICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDRfREFUQSAweDAwMDAwMDEwCS8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNV9EQVRBIDB4MDAwMDAwMjAJLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNSAqLwogI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9QSFlfSU5UICAgRTEwMDBfQ1RSTF9FWFRfU0RQNV9EQVRBCi0jZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDZfREFUQSAweDAwMDAwMDQwIC8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDYgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQN19EQVRBIDB4MDAwMDAwODAgLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNyAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RJUiAgMHgwMDAwMDEwMCAvKiBEaXJlY3Rpb24gb2YgU0RQNCAwPWluIDE9b3V0ICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDVfRElSICAweDAwMDAwMjAwIC8qIERpcmVjdGlvbiBvZiBTRFA1IDA9aW4gMT1vdXQgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNl9ESVIgIDB4MDAwMDA0MDAgLyogRGlyZWN0aW9uIG9mIFNEUDYgMD1pbiAxPW91dCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA3X0RJUiAgMHgwMDAwMDgwMCAvKiBEaXJlY3Rpb24gb2YgU0RQNyAwPWluIDE9b3V0ICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0FTRENISyAgICAweDAwMDAxMDAwIC8qIEluaXRpYXRlIGFuIEFTRCBzZXF1ZW5jZSAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9FRV9SU1QgICAgMHgwMDAwMjAwMCAvKiBSZWluaXRpYWxpemUgZnJvbSBFRVBST00gKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfSVBTICAgICAgIDB4MDAwMDQwMDAgLyogSW52ZXJ0IFBvd2VyIFN0YXRlICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NQRF9CWVBTICAweDAwMDA4MDAwIC8qIFNwZWVkIFNlbGVjdCBCeXBhc3MgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUk9fRElTICAgIDB4MDAwMjAwMDAgLyogUmVsYXhlZCBPcmRlcmluZyBkaXNhYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDZfREFUQSAweDAwMDAwMDQwCS8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDYgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQN19EQVRBIDB4MDAwMDAwODAJLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RJUiAgMHgwMDAwMDEwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNCAwPWluIDE9b3V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDVfRElSICAweDAwMDAwMjAwCS8qIERpcmVjdGlvbiBvZiBTRFA1IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNl9ESVIgIDB4MDAwMDA0MDAJLyogRGlyZWN0aW9uIG9mIFNEUDYgMD1pbiAxPW91dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA3X0RJUiAgMHgwMDAwMDgwMAkvKiBEaXJlY3Rpb24gb2YgU0RQNyAwPWluIDE9b3V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0FTRENISyAgICAweDAwMDAxMDAwCS8qIEluaXRpYXRlIGFuIEFTRCBzZXF1ZW5jZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9FRV9SU1QgICAgMHgwMDAwMjAwMAkvKiBSZWluaXRpYWxpemUgZnJvbSBFRVBST00gKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfSVBTICAgICAgIDB4MDAwMDQwMDAJLyogSW52ZXJ0IFBvd2VyIFN0YXRlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NQRF9CWVBTICAweDAwMDA4MDAwCS8qIFNwZWVkIFNlbGVjdCBCeXBhc3MgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUk9fRElTICAgIDB4MDAwMjAwMDAJLyogUmVsYXhlZCBPcmRlcmluZyBkaXNhYmxlICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9NQVNLIDB4MDBDMDAwMDAKICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX0dNSUkgMHgwMDAwMDAwMAogI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfVEJJICAweDAwQzAwMDAwCkBAIC0xNjM4LDExICsxNTUxLDExIEBACiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzMyMCAgIDB4MDEwMDAwMDAKICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfMzg0ICAgMHgwMjAwMDAwMAogI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS180NDggICAweDAzMDAwMDAwCi0jZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0RSVl9MT0FEICAgICAgIDB4MTAwMDAwMDAgLyogRHJpdmVyIGxvYWRlZCBiaXQgZm9yIEZXICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0lBTUUgICAgICAgICAgIDB4MDgwMDAwMDAgLyogSW50ZXJydXB0IGFja25vd2xlZGdlIEF1dG8tbWFzayAqLwotI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9JTlRfVElNRVJfQ0xSICAweDIwMDAwMDAwIC8qIENsZWFyIEludGVycnVwdCB0aW1lcnMgYWZ0ZXIgSU1TIGNsZWFyICovCi0jZGVmaW5lIEUxMDAwX0NSVExfRVhUX1BCX1BBUkVOICAgICAgIDB4MDEwMDAwMDAgLyogcGFja2V0IGJ1ZmZlciBwYXJpdHkgZXJyb3IgZGV0ZWN0aW9uIGVuYWJsZWQgKi8KLSNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfREZfUEFSRU4gICAgICAgMHgwMjAwMDAwMCAvKiBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yIGRldGVjdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQgICAgICAgMHgxMDAwMDAwMAkvKiBEcml2ZXIgbG9hZGVkIGJpdCBmb3IgRlcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfSUFNRSAgICAgICAgICAgMHgwODAwMDAwMAkvKiBJbnRlcnJ1cHQgYWNrbm93bGVkZ2UgQXV0by1tYXNrICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0lOVF9USU1FUl9DTFIgIDB4MjAwMDAwMDAJLyogQ2xlYXIgSW50ZXJydXB0IHRpbWVycyBhZnRlciBJTVMgY2xlYXIgKi8KKyNkZWZpbmUgRTEwMDBfQ1JUTF9FWFRfUEJfUEFSRU4gICAgICAgMHgwMTAwMDAwMAkvKiBwYWNrZXQgYnVmZmVyIHBhcml0eSBlcnJvciBkZXRlY3Rpb24gZW5hYmxlZCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9ERl9QQVJFTiAgICAgICAweDAyMDAwMDAwCS8qIGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgZGV0ZWN0aW9uIGVuYWJsZSAqLwogI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HSE9TVF9QQVJFTiAgICAweDQwMDAwMDAwCiAKIC8qIE1ESSBDb250cm9sICovCkBAIC0xNzQyLDE2NyArMTY1NSwxNjcgQEAKICNkZWZpbmUgRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRiAgICAgICAweEYKIAogLyogUmVjZWl2ZSBBZGRyZXNzICovCi0jZGVmaW5lIEUxMDAwX1JBSF9BViAgMHg4MDAwMDAwMCAgICAgICAgLyogUmVjZWl2ZSBkZXNjcmlwdG9yIHZhbGlkICovCisjZGVmaW5lIEUxMDAwX1JBSF9BViAgMHg4MDAwMDAwMAkvKiBSZWNlaXZlIGRlc2NyaXB0b3IgdmFsaWQgKi8KIAogLyogSW50ZXJydXB0IENhdXNlIFJlYWQgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX1RYRFcgICAgICAgICAgMHgwMDAwMDAwMSAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLwotI2RlZmluZSBFMTAwMF9JQ1JfVFhRRSAgICAgICAgICAweDAwMDAwMDAyIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCi0jZGVmaW5lIEUxMDAwX0lDUl9MU0MgICAgICAgICAgIDB4MDAwMDAwMDQgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCi0jZGVmaW5lIEUxMDAwX0lDUl9SWFNFUSAgICAgICAgIDB4MDAwMDAwMDggLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX1JYRE1UMCAgICAgICAgMHgwMDAwMDAxMCAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICgwKSAqLwotI2RlZmluZSBFMTAwMF9JQ1JfUlhPICAgICAgICAgICAweDAwMDAwMDQwIC8qIHJ4IG92ZXJydW4gKi8KLSNkZWZpbmUgRTEwMDBfSUNSX1JYVDAgICAgICAgICAgMHgwMDAwMDA4MCAvKiByeCB0aW1lciBpbnRyIChyaW5nIDApICovCi0jZGVmaW5lIEUxMDAwX0lDUl9NREFDICAgICAgICAgIDB4MDAwMDAyMDAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX1JYQ0ZHICAgICAgICAgMHgwMDAwMDQwMCAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjAgICAgICAgMHgwMDAwMDgwMCAvKiBHUCBJbnQgMCAqLwotI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMSAgICAgICAweDAwMDAxMDAwIC8qIEdQIEludCAxICovCi0jZGVmaW5lIEUxMDAwX0lDUl9HUElfRU4yICAgICAgIDB4MDAwMDIwMDAgLyogR1AgSW50IDIgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjMgICAgICAgMHgwMDAwNDAwMCAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhEVyAgICAgICAgICAweDAwMDAwMDAxCS8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lDUl9UWFFFICAgICAgICAgIDB4MDAwMDAwMDIJLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0xTQyAgICAgICAgICAgMHgwMDAwMDAwNAkvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYU0VRICAgICAgICAgMHgwMDAwMDAwOAkvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhETVQwICAgICAgICAweDAwMDAwMDEwCS8qIHJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKDApICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWE8gICAgICAgICAgIDB4MDAwMDAwNDAJLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhUMCAgICAgICAgICAweDAwMDAwMDgwCS8qIHJ4IHRpbWVyIGludHIgKHJpbmcgMCkgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX01EQUMgICAgICAgICAgMHgwMDAwMDIwMAkvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhDRkcgICAgICAgICAweDAwMDAwNDAwCS8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMCAgICAgICAweDAwMDAwODAwCS8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lDUl9HUElfRU4xICAgICAgIDB4MDAwMDEwMDAJLyogR1AgSW50IDEgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjIgICAgICAgMHgwMDAwMjAwMAkvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMyAgICAgICAweDAwMDA0MDAwCS8qIEdQIEludCAzICovCiAjZGVmaW5lIEUxMDAwX0lDUl9UWERfTE9XICAgICAgIDB4MDAwMDgwMDAKICNkZWZpbmUgRTEwMDBfSUNSX1NSUEQgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBFMTAwMF9JQ1JfQUNLICAgICAgICAgICAweDAwMDIwMDAwIC8qIFJlY2VpdmUgQWNrIGZyYW1lICovCi0jZGVmaW5lIEUxMDAwX0lDUl9NTkcgICAgICAgICAgIDB4MDAwNDAwMDAgLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLwotI2RlZmluZSBFMTAwMF9JQ1JfRE9DSyAgICAgICAgICAweDAwMDgwMDAwIC8qIERvY2svVW5kb2NrICovCi0jZGVmaW5lIEUxMDAwX0lDUl9JTlRfQVNTRVJURUQgIDB4ODAwMDAwMDAgLyogSWYgdGhpcyBiaXQgYXNzZXJ0ZWQsIHRoZSBkcml2ZXIgc2hvdWxkIGNsYWltIHRoZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX1JYRF9GSUZPX1BBUjAgMHgwMDEwMDAwMCAvKiBxdWV1ZSAwIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjAgMHgwMDIwMDAwMCAvKiBxdWV1ZSAwIFR4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX0hPU1RfQVJCX1BBUiAgMHgwMDQwMDAwMCAvKiBob3N0IGFyYiByZWFkIGJ1ZmZlciBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSUNSX1BCX1BBUiAgICAgICAgMHgwMDgwMDAwMCAvKiBwYWNrZXQgYnVmZmVyIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMSAweDAxMDAwMDAwIC8qIHF1ZXVlIDEgUnggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JQ1JfVFhEX0ZJRk9fUEFSMSAweDAyMDAwMDAwIC8qIHF1ZXVlIDEgVHggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JQ1JfQUxMX1BBUklUWSAgICAweDAzRjAwMDAwIC8qIGFsbCBwYXJpdHkgZXJyb3IgYml0cyAqLwotI2RlZmluZSBFMTAwMF9JQ1JfRFNXICAgICAgICAgICAweDAwMDAwMDIwIC8qIEZXIGNoYW5nZWQgdGhlIHN0YXR1cyBvZiBESVNTVyBiaXQgaW4gdGhlIEZXU00gKi8KLSNkZWZpbmUgRTEwMDBfSUNSX1BIWUlOVCAgICAgICAgMHgwMDAwMTAwMCAvKiBMQU4gY29ubmVjdGVkIGRldmljZSBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0ICovCi0jZGVmaW5lIEUxMDAwX0lDUl9FUFJTVCAgICAgICAgIDB4MDAxMDAwMDAgLyogTUUgaGFuZHdhcmUgcmVzZXQgb2NjdXJzICovCisjZGVmaW5lIEUxMDAwX0lDUl9BQ0sgICAgICAgICAgIDB4MDAwMjAwMDAJLyogUmVjZWl2ZSBBY2sgZnJhbWUgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX01ORyAgICAgICAgICAgMHgwMDA0MDAwMAkvKiBNYW5hZ2VhYmlsaXR5IGV2ZW50ICovCisjZGVmaW5lIEUxMDAwX0lDUl9ET0NLICAgICAgICAgIDB4MDAwODAwMDAJLyogRG9jay9VbmRvY2sgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0lOVF9BU1NFUlRFRCAgMHg4MDAwMDAwMAkvKiBJZiB0aGlzIGJpdCBhc3NlcnRlZCwgdGhlIGRyaXZlciBzaG91bGQgY2xhaW0gdGhlIGludGVycnVwdCAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMCAweDAwMTAwMDAwCS8qIHF1ZXVlIDAgUnggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhEX0ZJRk9fUEFSMCAweDAwMjAwMDAwCS8qIHF1ZXVlIDAgVHggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1JfSE9TVF9BUkJfUEFSICAweDAwNDAwMDAwCS8qIGhvc3QgYXJiIHJlYWQgYnVmZmVyIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1JfUEJfUEFSICAgICAgICAweDAwODAwMDAwCS8qIHBhY2tldCBidWZmZXIgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWERfRklGT19QQVIxIDB4MDEwMDAwMDAJLyogcXVldWUgMSBSeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDUl9UWERfRklGT19QQVIxIDB4MDIwMDAwMDAJLyogcXVldWUgMSBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDUl9BTExfUEFSSVRZICAgIDB4MDNGMDAwMDAJLyogYWxsIHBhcml0eSBlcnJvciBiaXRzICovCisjZGVmaW5lIEUxMDAwX0lDUl9EU1cgICAgICAgICAgIDB4MDAwMDAwMjAJLyogRlcgY2hhbmdlZCB0aGUgc3RhdHVzIG9mIERJU1NXIGJpdCBpbiB0aGUgRldTTSAqLworI2RlZmluZSBFMTAwMF9JQ1JfUEhZSU5UICAgICAgICAweDAwMDAxMDAwCS8qIExBTiBjb25uZWN0ZWQgZGV2aWNlIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0VQUlNUICAgICAgICAgMHgwMDEwMDAwMAkvKiBNRSBoYXJkd2FyZSByZXNldCBvY2N1cnMgKi8KIAogLyogSW50ZXJydXB0IENhdXNlIFNldCAqLwotI2RlZmluZSBFMTAwMF9JQ1NfVFhEVyAgICAgIEUxMDAwX0lDUl9UWERXICAgICAgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KLSNkZWZpbmUgRTEwMDBfSUNTX1RYUUUgICAgICBFMTAwMF9JQ1JfVFhRRSAgICAgIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCi0jZGVmaW5lIEUxMDAwX0lDU19MU0MgICAgICAgRTEwMDBfSUNSX0xTQyAgICAgICAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KLSNkZWZpbmUgRTEwMDBfSUNTX1JYU0VRICAgICBFMTAwMF9JQ1JfUlhTRVEgICAgIC8qIHJ4IHNlcXVlbmNlIGVycm9yICovCi0jZGVmaW5lIEUxMDAwX0lDU19SWERNVDAgICAgRTEwMDBfSUNSX1JYRE1UMCAgICAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX0lDU19SWE8gICAgICAgRTEwMDBfSUNSX1JYTyAgICAgICAvKiByeCBvdmVycnVuICovCi0jZGVmaW5lIEUxMDAwX0lDU19SWFQwICAgICAgRTEwMDBfSUNSX1JYVDAgICAgICAvKiByeCB0aW1lciBpbnRyICovCi0jZGVmaW5lIEUxMDAwX0lDU19NREFDICAgICAgRTEwMDBfSUNSX01EQUMgICAgICAvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLwotI2RlZmluZSBFMTAwMF9JQ1NfUlhDRkcgICAgIEUxMDAwX0lDUl9SWENGRyAgICAgLyogUlggL2MvIG9yZGVyZWQgc2V0ICovCi0jZGVmaW5lIEUxMDAwX0lDU19HUElfRU4wICAgRTEwMDBfSUNSX0dQSV9FTjAgICAvKiBHUCBJbnQgMCAqLwotI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMSAgIEUxMDAwX0lDUl9HUElfRU4xICAgLyogR1AgSW50IDEgKi8KLSNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjIgICBFMTAwMF9JQ1JfR1BJX0VOMiAgIC8qIEdQIEludCAyICovCi0jZGVmaW5lIEUxMDAwX0lDU19HUElfRU4zICAgRTEwMDBfSUNSX0dQSV9FTjMgICAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JQ1NfVFhEVyAgICAgIEUxMDAwX0lDUl9UWERXCS8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lDU19UWFFFICAgICAgRTEwMDBfSUNSX1RYUUUJLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0xTQyAgICAgICBFMTAwMF9JQ1JfTFNDCS8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhTRVEgICAgIEUxMDAwX0lDUl9SWFNFUQkvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhETVQwICAgIEUxMDAwX0lDUl9SWERNVDAJLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhPICAgICAgIEUxMDAwX0lDUl9SWE8JLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhUMCAgICAgIEUxMDAwX0lDUl9SWFQwCS8qIHJ4IHRpbWVyIGludHIgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX01EQUMgICAgICBFMTAwMF9JQ1JfTURBQwkvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhDRkcgICAgIEUxMDAwX0lDUl9SWENGRwkvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjAgICBFMTAwMF9JQ1JfR1BJX0VOMAkvKiBHUCBJbnQgMCAqLworI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMSAgIEUxMDAwX0lDUl9HUElfRU4xCS8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4yICAgRTEwMDBfSUNSX0dQSV9FTjIJLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjMgICBFMTAwMF9JQ1JfR1BJX0VOMwkvKiBHUCBJbnQgMyAqLwogI2RlZmluZSBFMTAwMF9JQ1NfVFhEX0xPVyAgIEUxMDAwX0lDUl9UWERfTE9XCiAjZGVmaW5lIEUxMDAwX0lDU19TUlBEICAgICAgRTEwMDBfSUNSX1NSUEQKLSNkZWZpbmUgRTEwMDBfSUNTX0FDSyAgICAgICBFMTAwMF9JQ1JfQUNLICAgICAgIC8qIFJlY2VpdmUgQWNrIGZyYW1lICovCi0jZGVmaW5lIEUxMDAwX0lDU19NTkcgICAgICAgRTEwMDBfSUNSX01ORyAgICAgICAvKiBNYW5hZ2VhYmlsaXR5IGV2ZW50ICovCi0jZGVmaW5lIEUxMDAwX0lDU19ET0NLICAgICAgRTEwMDBfSUNSX0RPQ0sgICAgICAvKiBEb2NrL1VuZG9jayAqLwotI2RlZmluZSBFMTAwMF9JQ1NfUlhEX0ZJRk9fUEFSMCBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMCAvKiBxdWV1ZSAwIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSUNTX1RYRF9GSUZPX1BBUjAgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjAgLyogcXVldWUgMCBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCi0jZGVmaW5lIEUxMDAwX0lDU19IT1NUX0FSQl9QQVIgIEUxMDAwX0lDUl9IT1NUX0FSQl9QQVIgIC8qIGhvc3QgYXJiIHJlYWQgYnVmZmVyIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JQ1NfUEJfUEFSICAgICAgICBFMTAwMF9JQ1JfUEJfUEFSICAgICAgICAvKiBwYWNrZXQgYnVmZmVyIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JQ1NfUlhEX0ZJRk9fUEFSMSBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMSAvKiBxdWV1ZSAxIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSUNTX1RYRF9GSUZPX1BBUjEgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjEgLyogcXVldWUgMSBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDU19BQ0sgICAgICAgRTEwMDBfSUNSX0FDSwkvKiBSZWNlaXZlIEFjayBmcmFtZSAqLworI2RlZmluZSBFMTAwMF9JQ1NfTU5HICAgICAgIEUxMDAwX0lDUl9NTkcJLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLworI2RlZmluZSBFMTAwMF9JQ1NfRE9DSyAgICAgIEUxMDAwX0lDUl9ET0NLCS8qIERvY2svVW5kb2NrICovCisjZGVmaW5lIEUxMDAwX0lDU19SWERfRklGT19QQVIwIEUxMDAwX0lDUl9SWERfRklGT19QQVIwCS8qIHF1ZXVlIDAgUnggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1NfVFhEX0ZJRk9fUEFSMCBFMTAwMF9JQ1JfVFhEX0ZJRk9fUEFSMAkvKiBxdWV1ZSAwIFR4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0hPU1RfQVJCX1BBUiAgRTEwMDBfSUNSX0hPU1RfQVJCX1BBUgkvKiBob3N0IGFyYiByZWFkIGJ1ZmZlciBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1BCX1BBUiAgICAgICAgRTEwMDBfSUNSX1BCX1BBUgkvKiBwYWNrZXQgYnVmZmVyIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhEX0ZJRk9fUEFSMSBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMQkvKiBxdWV1ZSAxIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1RYRF9GSUZPX1BBUjEgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjEJLyogcXVldWUgMSBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCiAjZGVmaW5lIEUxMDAwX0lDU19EU1cgICAgICAgRTEwMDBfSUNSX0RTVwogI2RlZmluZSBFMTAwMF9JQ1NfUEhZSU5UICAgIEUxMDAwX0lDUl9QSFlJTlQKICNkZWZpbmUgRTEwMDBfSUNTX0VQUlNUICAgICBFMTAwMF9JQ1JfRVBSU1QKIAogLyogSW50ZXJydXB0IE1hc2sgU2V0ICovCi0jZGVmaW5lIEUxMDAwX0lNU19UWERXICAgICAgRTEwMDBfSUNSX1RYRFcgICAgICAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLwotI2RlZmluZSBFMTAwMF9JTVNfVFhRRSAgICAgIEUxMDAwX0lDUl9UWFFFICAgICAgLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX0xTQyAgICAgICBFMTAwMF9JQ1JfTFNDICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLwotI2RlZmluZSBFMTAwMF9JTVNfUlhTRVEgICAgIEUxMDAwX0lDUl9SWFNFUSAgICAgLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX1JYRE1UMCAgICBFMTAwMF9JQ1JfUlhETVQwICAgIC8qIHJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX1JYTyAgICAgICBFMTAwMF9JQ1JfUlhPICAgICAgIC8qIHJ4IG92ZXJydW4gKi8KLSNkZWZpbmUgRTEwMDBfSU1TX1JYVDAgICAgICBFMTAwMF9JQ1JfUlhUMCAgICAgIC8qIHJ4IHRpbWVyIGludHIgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX01EQUMgICAgICBFMTAwMF9JQ1JfTURBQyAgICAgIC8qIE1ESU8gYWNjZXNzIGNvbXBsZXRlICovCi0jZGVmaW5lIEUxMDAwX0lNU19SWENGRyAgICAgRTEwMDBfSUNSX1JYQ0ZHICAgICAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjAgICBFMTAwMF9JQ1JfR1BJX0VOMCAgIC8qIEdQIEludCAwICovCi0jZGVmaW5lIEUxMDAwX0lNU19HUElfRU4xICAgRTEwMDBfSUNSX0dQSV9FTjEgICAvKiBHUCBJbnQgMSAqLwotI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMiAgIEUxMDAwX0lDUl9HUElfRU4yICAgLyogR1AgSW50IDIgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjMgICBFMTAwMF9JQ1JfR1BJX0VOMyAgIC8qIEdQIEludCAzICovCisjZGVmaW5lIEUxMDAwX0lNU19UWERXICAgICAgRTEwMDBfSUNSX1RYRFcJLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYUUUgICAgICBFMTAwMF9JQ1JfVFhRRQkvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JTVNfTFNDICAgICAgIEUxMDAwX0lDUl9MU0MJLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lNU19SWFNFUSAgICAgRTEwMDBfSUNSX1JYU0VRCS8qIHJ4IHNlcXVlbmNlIGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNU19SWERNVDAgICAgRTEwMDBfSUNSX1JYRE1UMAkvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX0lNU19SWE8gICAgICAgRTEwMDBfSUNSX1JYTwkvKiByeCBvdmVycnVuICovCisjZGVmaW5lIEUxMDAwX0lNU19SWFQwICAgICAgRTEwMDBfSUNSX1JYVDAJLyogcnggdGltZXIgaW50ciAqLworI2RlZmluZSBFMTAwMF9JTVNfTURBQyAgICAgIEUxMDAwX0lDUl9NREFDCS8qIE1ESU8gYWNjZXNzIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX0lNU19SWENGRyAgICAgRTEwMDBfSUNSX1JYQ0ZHCS8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMCAgIEUxMDAwX0lDUl9HUElfRU4wCS8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lNU19HUElfRU4xICAgRTEwMDBfSUNSX0dQSV9FTjEJLyogR1AgSW50IDEgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjIgICBFMTAwMF9JQ1JfR1BJX0VOMgkvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMyAgIEUxMDAwX0lDUl9HUElfRU4zCS8qIEdQIEludCAzICovCiAjZGVmaW5lIEUxMDAwX0lNU19UWERfTE9XICAgRTEwMDBfSUNSX1RYRF9MT1cKICNkZWZpbmUgRTEwMDBfSU1TX1NSUEQgICAgICBFMTAwMF9JQ1JfU1JQRAotI2RlZmluZSBFMTAwMF9JTVNfQUNLICAgICAgIEUxMDAwX0lDUl9BQ0sgICAgICAgLyogUmVjZWl2ZSBBY2sgZnJhbWUgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX01ORyAgICAgICBFMTAwMF9JQ1JfTU5HICAgICAgIC8qIE1hbmFnZWFiaWxpdHkgZXZlbnQgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX0RPQ0sgICAgICBFMTAwMF9JQ1JfRE9DSyAgICAgIC8qIERvY2svVW5kb2NrICovCi0jZGVmaW5lIEUxMDAwX0lNU19SWERfRklGT19QQVIwIEUxMDAwX0lDUl9SWERfRklGT19QQVIwIC8qIHF1ZXVlIDAgUnggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JTVNfVFhEX0ZJRk9fUEFSMCBFMTAwMF9JQ1JfVFhEX0ZJRk9fUEFSMCAvKiBxdWV1ZSAwIFR4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSU1TX0hPU1RfQVJCX1BBUiAgRTEwMDBfSUNSX0hPU1RfQVJCX1BBUiAgLyogaG9zdCBhcmIgcmVhZCBidWZmZXIgcGFyaXR5IGVycm9yICovCi0jZGVmaW5lIEUxMDAwX0lNU19QQl9QQVIgICAgICAgIEUxMDAwX0lDUl9QQl9QQVIgICAgICAgIC8qIHBhY2tldCBidWZmZXIgcGFyaXR5IGVycm9yICovCi0jZGVmaW5lIEUxMDAwX0lNU19SWERfRklGT19QQVIxIEUxMDAwX0lDUl9SWERfRklGT19QQVIxIC8qIHF1ZXVlIDEgUnggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JTVNfVFhEX0ZJRk9fUEFSMSBFMTAwMF9JQ1JfVFhEX0ZJRk9fUEFSMSAvKiBxdWV1ZSAxIFR4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0FDSyAgICAgICBFMTAwMF9JQ1JfQUNLCS8qIFJlY2VpdmUgQWNrIGZyYW1lICovCisjZGVmaW5lIEUxMDAwX0lNU19NTkcgICAgICAgRTEwMDBfSUNSX01ORwkvKiBNYW5hZ2VhYmlsaXR5IGV2ZW50ICovCisjZGVmaW5lIEUxMDAwX0lNU19ET0NLICAgICAgRTEwMDBfSUNSX0RPQ0sJLyogRG9jay9VbmRvY2sgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYRF9GSUZPX1BBUjAgRTEwMDBfSUNSX1JYRF9GSUZPX1BBUjAJLyogcXVldWUgMCBSeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNU19UWERfRklGT19QQVIwIEUxMDAwX0lDUl9UWERfRklGT19QQVIwCS8qIHF1ZXVlIDAgVHggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTVNfSE9TVF9BUkJfUEFSICBFMTAwMF9JQ1JfSE9TVF9BUkJfUEFSCS8qIGhvc3QgYXJiIHJlYWQgYnVmZmVyIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTVNfUEJfUEFSICAgICAgICBFMTAwMF9JQ1JfUEJfUEFSCS8qIHBhY2tldCBidWZmZXIgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNU19SWERfRklGT19QQVIxIEUxMDAwX0lDUl9SWERfRklGT19QQVIxCS8qIHF1ZXVlIDEgUnggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTVNfVFhEX0ZJRk9fUEFSMSBFMTAwMF9JQ1JfVFhEX0ZJRk9fUEFSMQkvKiBxdWV1ZSAxIFR4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KICNkZWZpbmUgRTEwMDBfSU1TX0RTVyAgICAgICBFMTAwMF9JQ1JfRFNXCiAjZGVmaW5lIEUxMDAwX0lNU19QSFlJTlQgICAgRTEwMDBfSUNSX1BIWUlOVAogI2RlZmluZSBFMTAwMF9JTVNfRVBSU1QgICAgIEUxMDAwX0lDUl9FUFJTVAogCiAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciAqLwotI2RlZmluZSBFMTAwMF9JTUNfVFhEVyAgICAgIEUxMDAwX0lDUl9UWERXICAgICAgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KLSNkZWZpbmUgRTEwMDBfSU1DX1RYUUUgICAgICBFMTAwMF9JQ1JfVFhRRSAgICAgIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCi0jZGVmaW5lIEUxMDAwX0lNQ19MU0MgICAgICAgRTEwMDBfSUNSX0xTQyAgICAgICAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KLSNkZWZpbmUgRTEwMDBfSU1DX1JYU0VRICAgICBFMTAwMF9JQ1JfUlhTRVEgICAgIC8qIHJ4IHNlcXVlbmNlIGVycm9yICovCi0jZGVmaW5lIEUxMDAwX0lNQ19SWERNVDAgICAgRTEwMDBfSUNSX1JYRE1UMCAgICAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX0lNQ19SWE8gICAgICAgRTEwMDBfSUNSX1JYTyAgICAgICAvKiByeCBvdmVycnVuICovCi0jZGVmaW5lIEUxMDAwX0lNQ19SWFQwICAgICAgRTEwMDBfSUNSX1JYVDAgICAgICAvKiByeCB0aW1lciBpbnRyICovCi0jZGVmaW5lIEUxMDAwX0lNQ19NREFDICAgICAgRTEwMDBfSUNSX01EQUMgICAgICAvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLwotI2RlZmluZSBFMTAwMF9JTUNfUlhDRkcgICAgIEUxMDAwX0lDUl9SWENGRyAgICAgLyogUlggL2MvIG9yZGVyZWQgc2V0ICovCi0jZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4wICAgRTEwMDBfSUNSX0dQSV9FTjAgICAvKiBHUCBJbnQgMCAqLwotI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMSAgIEUxMDAwX0lDUl9HUElfRU4xICAgLyogR1AgSW50IDEgKi8KLSNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjIgICBFMTAwMF9JQ1JfR1BJX0VOMiAgIC8qIEdQIEludCAyICovCi0jZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4zICAgRTEwMDBfSUNSX0dQSV9FTjMgICAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JTUNfVFhEVyAgICAgIEUxMDAwX0lDUl9UWERXCS8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWFFFICAgICAgRTEwMDBfSUNSX1RYUUUJLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0xTQyAgICAgICBFMTAwMF9JQ1JfTFNDCS8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhTRVEgICAgIEUxMDAwX0lDUl9SWFNFUQkvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhETVQwICAgIEUxMDAwX0lDUl9SWERNVDAJLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhPICAgICAgIEUxMDAwX0lDUl9SWE8JLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhUMCAgICAgIEUxMDAwX0lDUl9SWFQwCS8qIHJ4IHRpbWVyIGludHIgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX01EQUMgICAgICBFMTAwMF9JQ1JfTURBQwkvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhDRkcgICAgIEUxMDAwX0lDUl9SWENGRwkvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjAgICBFMTAwMF9JQ1JfR1BJX0VOMAkvKiBHUCBJbnQgMCAqLworI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMSAgIEUxMDAwX0lDUl9HUElfRU4xCS8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4yICAgRTEwMDBfSUNSX0dQSV9FTjIJLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjMgICBFMTAwMF9JQ1JfR1BJX0VOMwkvKiBHUCBJbnQgMyAqLwogI2RlZmluZSBFMTAwMF9JTUNfVFhEX0xPVyAgIEUxMDAwX0lDUl9UWERfTE9XCiAjZGVmaW5lIEUxMDAwX0lNQ19TUlBEICAgICAgRTEwMDBfSUNSX1NSUEQKLSNkZWZpbmUgRTEwMDBfSU1DX0FDSyAgICAgICBFMTAwMF9JQ1JfQUNLICAgICAgIC8qIFJlY2VpdmUgQWNrIGZyYW1lICovCi0jZGVmaW5lIEUxMDAwX0lNQ19NTkcgICAgICAgRTEwMDBfSUNSX01ORyAgICAgICAvKiBNYW5hZ2VhYmlsaXR5IGV2ZW50ICovCi0jZGVmaW5lIEUxMDAwX0lNQ19ET0NLICAgICAgRTEwMDBfSUNSX0RPQ0sgICAgICAvKiBEb2NrL1VuZG9jayAqLwotI2RlZmluZSBFMTAwMF9JTUNfUlhEX0ZJRk9fUEFSMCBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMCAvKiBxdWV1ZSAwIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSU1DX1RYRF9GSUZPX1BBUjAgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjAgLyogcXVldWUgMCBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCi0jZGVmaW5lIEUxMDAwX0lNQ19IT1NUX0FSQl9QQVIgIEUxMDAwX0lDUl9IT1NUX0FSQl9QQVIgIC8qIGhvc3QgYXJiIHJlYWQgYnVmZmVyIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JTUNfUEJfUEFSICAgICAgICBFMTAwMF9JQ1JfUEJfUEFSICAgICAgICAvKiBwYWNrZXQgYnVmZmVyIHBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFMTAwMF9JTUNfUlhEX0ZJRk9fUEFSMSBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMSAvKiBxdWV1ZSAxIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfSU1DX1RYRF9GSUZPX1BBUjEgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjEgLyogcXVldWUgMSBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNQ19BQ0sgICAgICAgRTEwMDBfSUNSX0FDSwkvKiBSZWNlaXZlIEFjayBmcmFtZSAqLworI2RlZmluZSBFMTAwMF9JTUNfTU5HICAgICAgIEUxMDAwX0lDUl9NTkcJLyogTWFuYWdlYWJpbGl0eSBldmVudCAqLworI2RlZmluZSBFMTAwMF9JTUNfRE9DSyAgICAgIEUxMDAwX0lDUl9ET0NLCS8qIERvY2svVW5kb2NrICovCisjZGVmaW5lIEUxMDAwX0lNQ19SWERfRklGT19QQVIwIEUxMDAwX0lDUl9SWERfRklGT19QQVIwCS8qIHF1ZXVlIDAgUnggZGVzY3JpcHRvciBGSUZPIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTUNfVFhEX0ZJRk9fUEFSMCBFMTAwMF9JQ1JfVFhEX0ZJRk9fUEFSMAkvKiBxdWV1ZSAwIFR4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0hPU1RfQVJCX1BBUiAgRTEwMDBfSUNSX0hPU1RfQVJCX1BBUgkvKiBob3N0IGFyYiByZWFkIGJ1ZmZlciBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1BCX1BBUiAgICAgICAgRTEwMDBfSUNSX1BCX1BBUgkvKiBwYWNrZXQgYnVmZmVyIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhEX0ZJRk9fUEFSMSBFMTAwMF9JQ1JfUlhEX0ZJRk9fUEFSMQkvKiBxdWV1ZSAxIFJ4IGRlc2NyaXB0b3IgRklGTyBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1RYRF9GSUZPX1BBUjEgRTEwMDBfSUNSX1RYRF9GSUZPX1BBUjEJLyogcXVldWUgMSBUeCBkZXNjcmlwdG9yIEZJRk8gcGFyaXR5IGVycm9yICovCiAjZGVmaW5lIEUxMDAwX0lNQ19EU1cgICAgICAgRTEwMDBfSUNSX0RTVwogI2RlZmluZSBFMTAwMF9JTUNfUEhZSU5UICAgIEUxMDAwX0lDUl9QSFlJTlQKICNkZWZpbmUgRTEwMDBfSU1DX0VQUlNUICAgICBFMTAwMF9JQ1JfRVBSU1QKIAogLyogUmVjZWl2ZSBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX1JDVExfUlNUICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBTb2Z0d2FyZSByZXNldCAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX0VOICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogZW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1JDVExfU0JQICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBzdG9yZSBiYWQgcGFja2V0ICovCi0jZGVmaW5lIEUxMDAwX1JDVExfVVBFICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiB1bmljYXN0IHByb21pc2N1b3VzIGVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX01QRSAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogbXVsdGljYXN0IHByb21pc2N1b3VzIGVuYWIgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9MUEUgICAgICAgICAgICAweDAwMDAwMDIwICAgIC8qIGxvbmcgcGFja2V0IGVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9OTyAgICAgICAgIDB4MDAwMDAwMDAgICAgLyogbm8gbG9vcGJhY2sgbW9kZSAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9NQUMgICAgICAgIDB4MDAwMDAwNDAgICAgLyogTUFDIGxvb3BiYWNrIG1vZGUgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fU0xQICAgICAgICAweDAwMDAwMDgwICAgIC8qIHNlcmlhbCBsaW5rIGxvb3BiYWNrIG1vZGUgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fVENWUiAgICAgICAweDAwMDAwMEMwICAgIC8qIHRjdnIgbG9vcGJhY2sgbW9kZSAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX0RUWVBfTUFTSyAgICAgIDB4MDAwMDBDMDAgICAgLyogRGVzY3JpcHRvciB0eXBlIG1hc2sgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9EVFlQX1BTICAgICAgICAweDAwMDAwNDAwICAgIC8qIFBhY2tldCBTcGxpdCBkZXNjcmlwdG9yICovCi0jZGVmaW5lIEUxMDAwX1JDVExfUkRNVFNfSEFMRiAgICAgMHgwMDAwMDAwMCAgICAvKiByeCBkZXNjIG1pbiB0aHJlc2hvbGQgc2l6ZSAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX1FVQVQgICAgIDB4MDAwMDAxMDAgICAgLyogcnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19FSUdUSCAgICAweDAwMDAwMjAwICAgIC8qIHJ4IGRlc2MgbWluIHRocmVzaG9sZCBzaXplICovCi0jZGVmaW5lIEUxMDAwX1JDVExfTU9fU0hJRlQgICAgICAgMTIgICAgICAgICAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IHNoaWZ0ICovCi0jZGVmaW5lIEUxMDAwX1JDVExfTU9fMCAgICAgICAgICAgMHgwMDAwMDAwMCAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDExOjAgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9NT18xICAgICAgICAgICAweDAwMDAxMDAwICAgIC8qIG11bHRpY2FzdCBvZmZzZXQgMTI6MSAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX01PXzIgICAgICAgICAgIDB4MDAwMDIwMDAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxMzoyICovCi0jZGVmaW5lIEUxMDAwX1JDVExfTU9fMyAgICAgICAgICAgMHgwMDAwMzAwMCAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDE1OjQgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9NRFIgICAgICAgICAgICAweDAwMDA0MDAwICAgIC8qIG11bHRpY2FzdCBkZXNjIHJpbmcgMCAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX0JBTSAgICAgICAgICAgIDB4MDAwMDgwMDAgICAgLyogYnJvYWRjYXN0IGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JTVCAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogU29mdHdhcmUgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9FTiAgICAgICAgICAgICAweDAwMDAwMDAyCS8qIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NCUCAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogc3RvcmUgYmFkIHBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1VQRSAgICAgICAgICAgIDB4MDAwMDAwMDgJLyogdW5pY2FzdCBwcm9taXNjdW91cyBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NUEUgICAgICAgICAgICAweDAwMDAwMDEwCS8qIG11bHRpY2FzdCBwcm9taXNjdW91cyBlbmFiICovCisjZGVmaW5lIEUxMDAwX1JDVExfTFBFICAgICAgICAgICAgMHgwMDAwMDAyMAkvKiBsb25nIHBhY2tldCBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fTk8gICAgICAgICAweDAwMDAwMDAwCS8qIG5vIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fTUFDICAgICAgICAweDAwMDAwMDQwCS8qIE1BQyBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTEJNX1NMUCAgICAgICAgMHgwMDAwMDA4MAkvKiBzZXJpYWwgbGluayBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTEJNX1RDVlIgICAgICAgMHgwMDAwMDBDMAkvKiB0Y3ZyIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9EVFlQX01BU0sgICAgICAweDAwMDAwQzAwCS8qIERlc2NyaXB0b3IgdHlwZSBtYXNrICovCisjZGVmaW5lIEUxMDAwX1JDVExfRFRZUF9QUyAgICAgICAgMHgwMDAwMDQwMAkvKiBQYWNrZXQgU3BsaXQgZGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX0hBTEYgICAgIDB4MDAwMDAwMDAJLyogcnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19RVUFUICAgICAweDAwMDAwMTAwCS8qIHJ4IGRlc2MgbWluIHRocmVzaG9sZCBzaXplICovCisjZGVmaW5lIEUxMDAwX1JDVExfUkRNVFNfRUlHVEggICAgMHgwMDAwMDIwMAkvKiByeCBkZXNjIG1pbiB0aHJlc2hvbGQgc2l6ZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PX1NISUZUICAgICAgIDEyCS8qIG11bHRpY2FzdCBvZmZzZXQgc2hpZnQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT18wICAgICAgICAgICAweDAwMDAwMDAwCS8qIG11bHRpY2FzdCBvZmZzZXQgMTE6MCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzEgICAgICAgICAgIDB4MDAwMDEwMDAJLyogbXVsdGljYXN0IG9mZnNldCAxMjoxICovCisjZGVmaW5lIEUxMDAwX1JDVExfTU9fMiAgICAgICAgICAgMHgwMDAwMjAwMAkvKiBtdWx0aWNhc3Qgb2Zmc2V0IDEzOjIgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT18zICAgICAgICAgICAweDAwMDAzMDAwCS8qIG11bHRpY2FzdCBvZmZzZXQgMTU6NCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01EUiAgICAgICAgICAgIDB4MDAwMDQwMDAJLyogbXVsdGljYXN0IGRlc2MgcmluZyAwICovCisjZGVmaW5lIEUxMDAwX1JDVExfQkFNICAgICAgICAgICAgMHgwMDAwODAwMAkvKiBicm9hZGNhc3QgZW5hYmxlICovCiAvKiB0aGVzZSBidWZmZXIgc2l6ZXMgYXJlIHZhbGlkIGlmIEUxMDAwX1JDVExfQlNFWCBpcyAwICovCi0jZGVmaW5lIEUxMDAwX1JDVExfU1pfMjA0OCAgICAgICAgMHgwMDAwMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSAyMDQ4ICovCi0jZGVmaW5lIEUxMDAwX1JDVExfU1pfMTAyNCAgICAgICAgMHgwMDAxMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSAxMDI0ICovCi0jZGVmaW5lIEUxMDAwX1JDVExfU1pfNTEyICAgICAgICAgMHgwMDAyMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSA1MTIgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9TWl8yNTYgICAgICAgICAweDAwMDMwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDI1NiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzIwNDggICAgICAgIDB4MDAwMDAwMDAJLyogcnggYnVmZmVyIHNpemUgMjA0OCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzEwMjQgICAgICAgIDB4MDAwMTAwMDAJLyogcnggYnVmZmVyIHNpemUgMTAyNCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzUxMiAgICAgICAgIDB4MDAwMjAwMDAJLyogcnggYnVmZmVyIHNpemUgNTEyICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfMjU2ICAgICAgICAgMHgwMDAzMDAwMAkvKiByeCBidWZmZXIgc2l6ZSAyNTYgKi8KIC8qIHRoZXNlIGJ1ZmZlciBzaXplcyBhcmUgdmFsaWQgaWYgRTEwMDBfUkNUTF9CU0VYIGlzIDEgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9TWl8xNjM4NCAgICAgICAweDAwMDEwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDE2Mzg0ICovCi0jZGVmaW5lIEUxMDAwX1JDVExfU1pfODE5MiAgICAgICAgMHgwMDAyMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSA4MTkyICovCi0jZGVmaW5lIEUxMDAwX1JDVExfU1pfNDA5NiAgICAgICAgMHgwMDAzMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSA0MDk2ICovCi0jZGVmaW5lIEUxMDAwX1JDVExfVkZFICAgICAgICAgICAgMHgwMDA0MDAwMCAgICAvKiB2bGFuIGZpbHRlciBlbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9DRklFTiAgICAgICAgICAweDAwMDgwMDAwICAgIC8qIGNhbm9uaWNhbCBmb3JtIGVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX0NGSSAgICAgICAgICAgIDB4MDAxMDAwMDAgICAgLyogY2Fub25pY2FsIGZvcm0gaW5kaWNhdG9yICovCi0jZGVmaW5lIEUxMDAwX1JDVExfRFBGICAgICAgICAgICAgMHgwMDQwMDAwMCAgICAvKiBkaXNjYXJkIHBhdXNlIGZyYW1lcyAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX1BNQ0YgICAgICAgICAgIDB4MDA4MDAwMDAgICAgLyogcGFzcyBNQUMgY29udHJvbCBmcmFtZXMgKi8KLSNkZWZpbmUgRTEwMDBfUkNUTF9CU0VYICAgICAgICAgICAweDAyMDAwMDAwICAgIC8qIEJ1ZmZlciBzaXplIGV4dGVuc2lvbiAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX1NFQ1JDICAgICAgICAgIDB4MDQwMDAwMDAgICAgLyogU3RyaXAgRXRoZXJuZXQgQ1JDICovCi0jZGVmaW5lIEUxMDAwX1JDVExfRkxYQlVGX01BU0sgICAgMHg3ODAwMDAwMCAgICAvKiBGbGV4aWJsZSBidWZmZXIgc2l6ZSAqLwotI2RlZmluZSBFMTAwMF9SQ1RMX0ZMWEJVRl9TSElGVCAgIDI3ICAgICAgICAgICAgLyogRmxleGlibGUgYnVmZmVyIHNoaWZ0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfMTYzODQgICAgICAgMHgwMDAxMDAwMAkvKiByeCBidWZmZXIgc2l6ZSAxNjM4NCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzgxOTIgICAgICAgIDB4MDAwMjAwMDAJLyogcnggYnVmZmVyIHNpemUgODE5MiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzQwOTYgICAgICAgIDB4MDAwMzAwMDAJLyogcnggYnVmZmVyIHNpemUgNDA5NiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1ZGRSAgICAgICAgICAgIDB4MDAwNDAwMDAJLyogdmxhbiBmaWx0ZXIgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfQ0ZJRU4gICAgICAgICAgMHgwMDA4MDAwMAkvKiBjYW5vbmljYWwgZm9ybSBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9DRkkgICAgICAgICAgICAweDAwMTAwMDAwCS8qIGNhbm9uaWNhbCBmb3JtIGluZGljYXRvciAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0RQRiAgICAgICAgICAgIDB4MDA0MDAwMDAJLyogZGlzY2FyZCBwYXVzZSBmcmFtZXMgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9QTUNGICAgICAgICAgICAweDAwODAwMDAwCS8qIHBhc3MgTUFDIGNvbnRyb2wgZnJhbWVzICovCisjZGVmaW5lIEUxMDAwX1JDVExfQlNFWCAgICAgICAgICAgMHgwMjAwMDAwMAkvKiBCdWZmZXIgc2l6ZSBleHRlbnNpb24gKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TRUNSQyAgICAgICAgICAweDA0MDAwMDAwCS8qIFN0cmlwIEV0aGVybmV0IENSQyAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0ZMWEJVRl9NQVNLICAgIDB4NzgwMDAwMDAJLyogRmxleGlibGUgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9GTFhCVUZfU0hJRlQgICAyNwkvKiBGbGV4aWJsZSBidWZmZXIgc2hpZnQgKi8KIAogLyogVXNlIGJ5dGUgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHNoaWZ0IHBhcmFtZXRlcnMKICAqIFVzYWdlOgpAQCAtMTkyNSwxMCArMTgzOCwxMCBAQAogI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUyX01BU0sgICAweDAwM0YwMDAwCiAjZGVmaW5lIEUxMDAwX1BTUkNUTF9CU0laRTNfTUFTSyAgIDB4M0YwMDAwMDAKIAotI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUwX1NISUZUICA3ICAgICAgICAgICAgLyogU2hpZnQgX3JpZ2h0XyA3ICovCi0jZGVmaW5lIEUxMDAwX1BTUkNUTF9CU0laRTFfU0hJRlQgIDIgICAgICAgICAgICAvKiBTaGlmdCBfcmlnaHRfIDIgKi8KLSNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFMl9TSElGVCAgNiAgICAgICAgICAgIC8qIFNoaWZ0IF9sZWZ0XyA2ICovCi0jZGVmaW5lIEUxMDAwX1BTUkNUTF9CU0laRTNfU0hJRlQgMTQgICAgICAgICAgICAvKiBTaGlmdCBfbGVmdF8gMTQgKi8KKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFMF9TSElGVCAgNwkvKiBTaGlmdCBfcmlnaHRfIDcgKi8KKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFMV9TSElGVCAgMgkvKiBTaGlmdCBfcmlnaHRfIDIgKi8KKyNkZWZpbmUgRTEwMDBfUFNSQ1RMX0JTSVpFMl9TSElGVCAgNgkvKiBTaGlmdCBfbGVmdF8gNiAqLworI2RlZmluZSBFMTAwMF9QU1JDVExfQlNJWkUzX1NISUZUIDE0CS8qIFNoaWZ0IF9sZWZ0XyAxNCAqLwogCiAvKiBTV19XX1NZTkMgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRTEwMDBfU1dGV19FRVBfU00gICAgIDB4MDAwMQpAQCAtMTkzNywxNyArMTg1MCwxNyBAQAogI2RlZmluZSBFMTAwMF9TV0ZXX01BQ19DU1JfU00gMHgwMDA4CiAKIC8qIFJlY2VpdmUgRGVzY3JpcHRvciAqLwotI2RlZmluZSBFMTAwMF9SRFRfREVMQVkgMHgwMDAwZmZmZiAgICAgIC8qIERlbGF5IHRpbWVyICgxPTEwMjR1cykgKi8KLSNkZWZpbmUgRTEwMDBfUkRUX0ZQREIgIDB4ODAwMDAwMDAgICAgICAvKiBGbHVzaCBkZXNjcmlwdG9yIGJsb2NrICovCi0jZGVmaW5lIEUxMDAwX1JETEVOX0xFTiAweDAwMDdmZjgwICAgICAgLyogZGVzY3JpcHRvciBsZW5ndGggKi8KLSNkZWZpbmUgRTEwMDBfUkRIX1JESCAgIDB4MDAwMGZmZmYgICAgICAvKiByZWNlaXZlIGRlc2NyaXB0b3IgaGVhZCAqLwotI2RlZmluZSBFMTAwMF9SRFRfUkRUICAgMHgwMDAwZmZmZiAgICAgIC8qIHJlY2VpdmUgZGVzY3JpcHRvciB0YWlsICovCisjZGVmaW5lIEUxMDAwX1JEVF9ERUxBWSAweDAwMDBmZmZmCS8qIERlbGF5IHRpbWVyICgxPTEwMjR1cykgKi8KKyNkZWZpbmUgRTEwMDBfUkRUX0ZQREIgIDB4ODAwMDAwMDAJLyogRmx1c2ggZGVzY3JpcHRvciBibG9jayAqLworI2RlZmluZSBFMTAwMF9SRExFTl9MRU4gMHgwMDA3ZmY4MAkvKiBkZXNjcmlwdG9yIGxlbmd0aCAqLworI2RlZmluZSBFMTAwMF9SREhfUkRIICAgMHgwMDAwZmZmZgkvKiByZWNlaXZlIGRlc2NyaXB0b3IgaGVhZCAqLworI2RlZmluZSBFMTAwMF9SRFRfUkRUICAgMHgwMDAwZmZmZgkvKiByZWNlaXZlIGRlc2NyaXB0b3IgdGFpbCAqLwogCiAvKiBGbG93IENvbnRyb2wgKi8KLSNkZWZpbmUgRTEwMDBfRkNSVEhfUlRIICAweDAwMDBGRkY4ICAgICAvKiBNYXNrIEJpdHNbMTU6M10gZm9yIFJUSCAqLwotI2RlZmluZSBFMTAwMF9GQ1JUSF9YRkNFIDB4ODAwMDAwMDAgICAgIC8qIEV4dGVybmFsIEZsb3cgQ29udHJvbCBFbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfRkNSVExfUlRMICAweDAwMDBGRkY4ICAgICAvKiBNYXNrIEJpdHNbMTU6M10gZm9yIFJUTCAqLwotI2RlZmluZSBFMTAwMF9GQ1JUTF9YT05FIDB4ODAwMDAwMDAgICAgIC8qIEVuYWJsZSBYT04gZnJhbWUgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIEUxMDAwX0ZDUlRIX1JUSCAgMHgwMDAwRkZGOAkvKiBNYXNrIEJpdHNbMTU6M10gZm9yIFJUSCAqLworI2RlZmluZSBFMTAwMF9GQ1JUSF9YRkNFIDB4ODAwMDAwMDAJLyogRXh0ZXJuYWwgRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9GQ1JUTF9SVEwgIDB4MDAwMEZGRjgJLyogTWFzayBCaXRzWzE1OjNdIGZvciBSVEwgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVExfWE9ORSAweDgwMDAwMDAwCS8qIEVuYWJsZSBYT04gZnJhbWUgdHJhbnNtaXNzaW9uICovCiAKIC8qIEhlYWRlciBzcGxpdCByZWNlaXZlICovCiAjZGVmaW5lIEUxMDAwX1JGQ1RMX0lTQ1NJX0RJUyAgICAgICAgICAgMHgwMDAwMDAwMQpAQCAtMTk2Nyw2NiArMTg4MCw2NCBAQAogI2RlZmluZSBFMTAwMF9SRkNUTF9ORVdfSVBWNl9FWFRfRElTICAgIDB4MDAwMjAwMDAKIAogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIENvbnRyb2wgKi8KLSNkZWZpbmUgRTEwMDBfUlhEQ1RMX1BUSFJFU0ggMHgwMDAwMDAzRiAvKiBSWERDVEwgUHJlZmV0Y2ggVGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX1JYRENUTF9IVEhSRVNIIDB4MDAwMDNGMDAgLyogUlhEQ1RMIEhvc3QgVGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX1JYRENUTF9XVEhSRVNIIDB4MDAzRjAwMDAgLyogUlhEQ1RMIFdyaXRlYmFjayBUaHJlc2hvbGQgKi8KLSNkZWZpbmUgRTEwMDBfUlhEQ1RMX0dSQU4gICAgMHgwMTAwMDAwMCAvKiBSWERDVEwgR3JhbnVsYXJpdHkgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX1BUSFJFU0ggMHgwMDAwMDAzRgkvKiBSWERDVEwgUHJlZmV0Y2ggVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9IVEhSRVNIIDB4MDAwMDNGMDAJLyogUlhEQ1RMIEhvc3QgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9XVEhSRVNIIDB4MDAzRjAwMDAJLyogUlhEQ1RMIFdyaXRlYmFjayBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX0dSQU4gICAgMHgwMTAwMDAwMAkvKiBSWERDVEwgR3JhbnVsYXJpdHkgKi8KIAogLyogVHJhbnNtaXQgRGVzY3JpcHRvciBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX1RYRENUTF9QVEhSRVNIIDB4MDAwMDAwM0YgLyogVFhEQ1RMIFByZWZldGNoIFRocmVzaG9sZCAqLwotI2RlZmluZSBFMTAwMF9UWERDVExfSFRIUkVTSCAweDAwMDAzRjAwIC8qIFRYRENUTCBIb3N0IFRocmVzaG9sZCAqLwotI2RlZmluZSBFMTAwMF9UWERDVExfV1RIUkVTSCAweDAwM0YwMDAwIC8qIFRYRENUTCBXcml0ZWJhY2sgVGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX1RYRENUTF9HUkFOICAgIDB4MDEwMDAwMDAgLyogVFhEQ1RMIEdyYW51bGFyaXR5ICovCi0jZGVmaW5lIEUxMDAwX1RYRENUTF9MV1RIUkVTSCAweEZFMDAwMDAwIC8qIFRYRENUTCBMb3cgVGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0IgMHgwMTAxMDAwMCAvKiBHUkFOPTEsIFdUSFJFU0g9MSAqLwotI2RlZmluZSBFMTAwMF9UWERDVExfQ09VTlRfREVTQyAweDAwNDAwMDAwIC8qIEVuYWJsZSB0aGUgY291bnRpbmcgb2YgZGVzYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCB0byBiZSBwcm9jZXNzZWQuICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9QVEhSRVNIIDB4MDAwMDAwM0YJLyogVFhEQ1RMIFByZWZldGNoIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfSFRIUkVTSCAweDAwMDAzRjAwCS8qIFRYRENUTCBIb3N0IFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfV1RIUkVTSCAweDAwM0YwMDAwCS8qIFRYRENUTCBXcml0ZWJhY2sgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9HUkFOICAgIDB4MDEwMDAwMDAJLyogVFhEQ1RMIEdyYW51bGFyaXR5ICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9MV1RIUkVTSCAweEZFMDAwMDAwCS8qIFRYRENUTCBMb3cgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0IgMHgwMTAxMDAwMAkvKiBHUkFOPTEsIFdUSFJFU0g9MSAqLworI2RlZmluZSBFMTAwMF9UWERDVExfQ09VTlRfREVTQyAweDAwNDAwMDAwCS8qIEVuYWJsZSB0aGUgY291bnRpbmcgb2YgZGVzYy4KKwkJCQkJCSAgIHN0aWxsIHRvIGJlIHByb2Nlc3NlZC4gKi8KIC8qIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gV29yZCAqLwotI2RlZmluZSBFMTAwMF9UWENXX0ZEICAgICAgICAgMHgwMDAwMDAyMCAgICAgICAgLyogVFhDVyBmdWxsIGR1cGxleCAqLwotI2RlZmluZSBFMTAwMF9UWENXX0hEICAgICAgICAgMHgwMDAwMDA0MCAgICAgICAgLyogVFhDVyBoYWxmIGR1cGxleCAqLwotI2RlZmluZSBFMTAwMF9UWENXX1BBVVNFICAgICAgMHgwMDAwMDA4MCAgICAgICAgLyogVFhDVyBzeW0gcGF1c2UgcmVxdWVzdCAqLwotI2RlZmluZSBFMTAwMF9UWENXX0FTTV9ESVIgICAgMHgwMDAwMDEwMCAgICAgICAgLyogVFhDVyBhc3RtIHBhdXNlIGRpcmVjdGlvbiAqLwotI2RlZmluZSBFMTAwMF9UWENXX1BBVVNFX01BU0sgMHgwMDAwMDE4MCAgICAgICAgLyogVFhDVyBwYXVzZSByZXF1ZXN0IG1hc2sgKi8KLSNkZWZpbmUgRTEwMDBfVFhDV19SRiAgICAgICAgIDB4MDAwMDMwMDAgICAgICAgIC8qIFRYQ1cgcmVtb3RlIGZhdWx0ICovCi0jZGVmaW5lIEUxMDAwX1RYQ1dfTlAgICAgICAgICAweDAwMDA4MDAwICAgICAgICAvKiBUWENXIG5leHQgcGFnZSAqLwotI2RlZmluZSBFMTAwMF9UWENXX0NXICAgICAgICAgMHgwMDAwZmZmZiAgICAgICAgLyogVHhDb25maWdXb3JkIG1hc2sgKi8KLSNkZWZpbmUgRTEwMDBfVFhDV19UWEMgICAgICAgIDB4NDAwMDAwMDAgICAgICAgIC8qIFRyYW5zbWl0IENvbmZpZyBjb250cm9sICovCi0jZGVmaW5lIEUxMDAwX1RYQ1dfQU5FICAgICAgICAweDgwMDAwMDAwICAgICAgICAvKiBBdXRvLW5lZyBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19GRCAgICAgICAgIDB4MDAwMDAwMjAJLyogVFhDVyBmdWxsIGR1cGxleCAqLworI2RlZmluZSBFMTAwMF9UWENXX0hEICAgICAgICAgMHgwMDAwMDA0MAkvKiBUWENXIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfUEFVU0UgICAgICAweDAwMDAwMDgwCS8qIFRYQ1cgc3ltIHBhdXNlIHJlcXVlc3QgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19BU01fRElSICAgIDB4MDAwMDAxMDAJLyogVFhDVyBhc3RtIHBhdXNlIGRpcmVjdGlvbiAqLworI2RlZmluZSBFMTAwMF9UWENXX1BBVVNFX01BU0sgMHgwMDAwMDE4MAkvKiBUWENXIHBhdXNlIHJlcXVlc3QgbWFzayAqLworI2RlZmluZSBFMTAwMF9UWENXX1JGICAgICAgICAgMHgwMDAwMzAwMAkvKiBUWENXIHJlbW90ZSBmYXVsdCAqLworI2RlZmluZSBFMTAwMF9UWENXX05QICAgICAgICAgMHgwMDAwODAwMAkvKiBUWENXIG5leHQgcGFnZSAqLworI2RlZmluZSBFMTAwMF9UWENXX0NXICAgICAgICAgMHgwMDAwZmZmZgkvKiBUeENvbmZpZ1dvcmQgbWFzayAqLworI2RlZmluZSBFMTAwMF9UWENXX1RYQyAgICAgICAgMHg0MDAwMDAwMAkvKiBUcmFuc21pdCBDb25maWcgY29udHJvbCAqLworI2RlZmluZSBFMTAwMF9UWENXX0FORSAgICAgICAgMHg4MDAwMDAwMAkvKiBBdXRvLW5lZyBlbmFibGUgKi8KIAogLyogUmVjZWl2ZSBDb25maWd1cmF0aW9uIFdvcmQgKi8KLSNkZWZpbmUgRTEwMDBfUlhDV19DVyAgICAweDAwMDBmZmZmICAgICAvKiBSeENvbmZpZ1dvcmQgbWFzayAqLwotI2RlZmluZSBFMTAwMF9SWENXX05DICAgIDB4MDQwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnIG5vIGNhcnJpZXIgKi8KLSNkZWZpbmUgRTEwMDBfUlhDV19JViAgICAweDA4MDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyBpbnZhbGlkICovCi0jZGVmaW5lIEUxMDAwX1JYQ1dfQ0MgICAgMHgxMDAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgY2hhbmdlICovCi0jZGVmaW5lIEUxMDAwX1JYQ1dfQyAgICAgMHgyMDAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgKi8KLSNkZWZpbmUgRTEwMDBfUlhDV19TWU5DSCAweDQwMDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyBzeW5jaCAqLwotI2RlZmluZSBFMTAwMF9SWENXX0FOQyAgIDB4ODAwMDAwMDAgICAgIC8qIEF1dG8tbmVnIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfQ1cgICAgMHgwMDAwZmZmZgkvKiBSeENvbmZpZ1dvcmQgbWFzayAqLworI2RlZmluZSBFMTAwMF9SWENXX05DICAgIDB4MDQwMDAwMDAJLyogUmVjZWl2ZSBjb25maWcgbm8gY2FycmllciAqLworI2RlZmluZSBFMTAwMF9SWENXX0lWICAgIDB4MDgwMDAwMDAJLyogUmVjZWl2ZSBjb25maWcgaW52YWxpZCAqLworI2RlZmluZSBFMTAwMF9SWENXX0NDICAgIDB4MTAwMDAwMDAJLyogUmVjZWl2ZSBjb25maWcgY2hhbmdlICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfQyAgICAgMHgyMDAwMDAwMAkvKiBSZWNlaXZlIGNvbmZpZyAqLworI2RlZmluZSBFMTAwMF9SWENXX1NZTkNIIDB4NDAwMDAwMDAJLyogUmVjZWl2ZSBjb25maWcgc3luY2ggKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19BTkMgICAweDgwMDAwMDAwCS8qIEF1dG8tbmVnIGNvbXBsZXRlICovCiAKIC8qIFRyYW5zbWl0IENvbnRyb2wgKi8KLSNkZWZpbmUgRTEwMDBfVENUTF9SU1QgICAgMHgwMDAwMDAwMSAgICAvKiBzb2Z0d2FyZSByZXNldCAqLwotI2RlZmluZSBFMTAwMF9UQ1RMX0VOICAgICAweDAwMDAwMDAyICAgIC8qIGVuYWJsZSB0eCAqLwotI2RlZmluZSBFMTAwMF9UQ1RMX0JDRSAgICAweDAwMDAwMDA0ICAgIC8qIGJ1c3kgY2hlY2sgZW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1RDVExfUFNQICAgIDB4MDAwMDAwMDggICAgLyogcGFkIHNob3J0IHBhY2tldHMgKi8KLSNkZWZpbmUgRTEwMDBfVENUTF9DVCAgICAgMHgwMDAwMGZmMCAgICAvKiBjb2xsaXNpb24gdGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX1RDVExfQ09MRCAgIDB4MDAzZmYwMDAgICAgLyogY29sbGlzaW9uIGRpc3RhbmNlICovCi0jZGVmaW5lIEUxMDAwX1RDVExfU1dYT0ZGIDB4MDA0MDAwMDAgICAgLyogU1cgWG9mZiB0cmFuc21pc3Npb24gKi8KLSNkZWZpbmUgRTEwMDBfVENUTF9QQkUgICAgMHgwMDgwMDAwMCAgICAvKiBQYWNrZXQgQnVyc3QgRW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1RDVExfUlRMQyAgIDB4MDEwMDAwMDAgICAgLyogUmUtdHJhbnNtaXQgb24gbGF0ZSBjb2xsaXNpb24gKi8KLSNkZWZpbmUgRTEwMDBfVENUTF9OUlRVICAgMHgwMjAwMDAwMCAgICAvKiBObyBSZS10cmFuc21pdCBvbiB1bmRlcnJ1biAqLwotI2RlZmluZSBFMTAwMF9UQ1RMX01VTFIgICAweDEwMDAwMDAwICAgIC8qIE11bHRpcGxlIHJlcXVlc3Qgc3VwcG9ydCAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1JTVCAgICAweDAwMDAwMDAxCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIEUxMDAwX1RDVExfRU4gICAgIDB4MDAwMDAwMDIJLyogZW5hYmxlIHR4ICovCisjZGVmaW5lIEUxMDAwX1RDVExfQkNFICAgIDB4MDAwMDAwMDQJLyogYnVzeSBjaGVjayBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9QU1AgICAgMHgwMDAwMDAwOAkvKiBwYWQgc2hvcnQgcGFja2V0cyAqLworI2RlZmluZSBFMTAwMF9UQ1RMX0NUICAgICAweDAwMDAwZmYwCS8qIGNvbGxpc2lvbiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9DT0xEICAgMHgwMDNmZjAwMAkvKiBjb2xsaXNpb24gZGlzdGFuY2UgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9TV1hPRkYgMHgwMDQwMDAwMAkvKiBTVyBYb2ZmIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1BCRSAgICAweDAwODAwMDAwCS8qIFBhY2tldCBCdXJzdCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9SVExDICAgMHgwMTAwMDAwMAkvKiBSZS10cmFuc21pdCBvbiBsYXRlIGNvbGxpc2lvbiAqLworI2RlZmluZSBFMTAwMF9UQ1RMX05SVFUgICAweDAyMDAwMDAwCS8qIE5vIFJlLXRyYW5zbWl0IG9uIHVuZGVycnVuICovCisjZGVmaW5lIEUxMDAwX1RDVExfTVVMUiAgIDB4MTAwMDAwMDAJLyogTXVsdGlwbGUgcmVxdWVzdCBzdXBwb3J0ICovCiAvKiBFeHRlbmRlZCBUcmFuc21pdCBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX1RDVExfRVhUX0JTVF9NQVNLICAweDAwMDAwM0ZGIC8qIEJhY2tvZmYgU2xvdCBUaW1lICovCi0jZGVmaW5lIEUxMDAwX1RDVExfRVhUX0dDRVhfTUFTSyAweDAwMEZGQzAwIC8qIEdpZ2FiaXQgQ2FycnkgRXh0ZW5kIFBhZGRpbmcgKi8KLQotI2RlZmluZSBERUZBVUxUXzgwMDAzRVMyTEFOX1RDVExfRVhUX0dDRVggICAweDAwMDEwMDAwCisjZGVmaW5lIEUxMDAwX1RDVExfRVhUX0JTVF9NQVNLICAweDAwMDAwM0ZGCS8qIEJhY2tvZmYgU2xvdCBUaW1lICovCisjZGVmaW5lIEUxMDAwX1RDVExfRVhUX0dDRVhfTUFTSyAweDAwMEZGQzAwCS8qIEdpZ2FiaXQgQ2FycnkgRXh0ZW5kIFBhZGRpbmcgKi8KIAogLyogUmVjZWl2ZSBDaGVja3N1bSBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX1JYQ1NVTV9QQ1NTX01BU0sgMHgwMDAwMDBGRiAgIC8qIFBhY2tldCBDaGVja3N1bSBTdGFydCAqLwotI2RlZmluZSBFMTAwMF9SWENTVU1fSVBPRkwgICAgIDB4MDAwMDAxMDAgICAvKiBJUHY0IGNoZWNrc3VtIG9mZmxvYWQgKi8KLSNkZWZpbmUgRTEwMDBfUlhDU1VNX1RVT0ZMICAgICAweDAwMDAwMjAwICAgLyogVENQIC8gVURQIGNoZWNrc3VtIG9mZmxvYWQgKi8KLSNkZWZpbmUgRTEwMDBfUlhDU1VNX0lQVjZPRkwgICAweDAwMDAwNDAwICAgLyogSVB2NiBjaGVja3N1bSBvZmZsb2FkICovCi0jZGVmaW5lIEUxMDAwX1JYQ1NVTV9JUFBDU0UgICAgMHgwMDAwMTAwMCAgIC8qIElQIHBheWxvYWQgY2hlY2tzdW0gZW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1JYQ1NVTV9QQ1NEICAgICAgMHgwMDAwMjAwMCAgIC8qIHBhY2tldCBjaGVja3N1bSBkaXNhYmxlZCAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fUENTU19NQVNLIDB4MDAwMDAwRkYJLyogUGFja2V0IENoZWNrc3VtIFN0YXJ0ICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9JUE9GTCAgICAgMHgwMDAwMDEwMAkvKiBJUHY0IGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX1RVT0ZMICAgICAweDAwMDAwMjAwCS8qIFRDUCAvIFVEUCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9JUFY2T0ZMICAgMHgwMDAwMDQwMAkvKiBJUHY2IGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX0lQUENTRSAgICAweDAwMDAxMDAwCS8qIElQIHBheWxvYWQgY2hlY2tzdW0gZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9QQ1NEICAgICAgMHgwMDAwMjAwMAkvKiBwYWNrZXQgY2hlY2tzdW0gZGlzYWJsZWQgKi8KIAogLyogTXVsdGlwbGUgUmVjZWl2ZSBRdWV1ZSBDb250cm9sICovCiAjZGVmaW5lIEUxMDAwX01SUUNfRU5BQkxFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDMKQEAgLTIwNDIsMTQxICsxOTUzLDE0MSBAQAogCiAvKiBEZWZpbml0aW9ucyBmb3IgcG93ZXIgbWFuYWdlbWVudCBhbmQgd2FrZXVwIHJlZ2lzdGVycyAqLwogLyogV2FrZSBVcCBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX1dVQ19BUE1FICAgICAgIDB4MDAwMDAwMDEgLyogQVBNIEVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9XVUNfUE1FX0VOICAgICAweDAwMDAwMDAyIC8qIFBNRSBFbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfV1VDX1BNRV9TVEFUVVMgMHgwMDAwMDAwNCAvKiBQTUUgU3RhdHVzICovCi0jZGVmaW5lIEUxMDAwX1dVQ19BUE1QTUUgICAgIDB4MDAwMDAwMDggLyogQXNzZXJ0IFBNRSBvbiBBUE0gV2FrZXVwICovCi0jZGVmaW5lIEUxMDAwX1dVQ19TUE0gICAgICAgIDB4ODAwMDAwMDAgLyogRW5hYmxlIFNQTSAqLworI2RlZmluZSBFMTAwMF9XVUNfQVBNRSAgICAgICAweDAwMDAwMDAxCS8qIEFQTSBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX1BNRV9FTiAgICAgMHgwMDAwMDAwMgkvKiBQTUUgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVQ19QTUVfU1RBVFVTIDB4MDAwMDAwMDQJLyogUE1FIFN0YXR1cyAqLworI2RlZmluZSBFMTAwMF9XVUNfQVBNUE1FICAgICAweDAwMDAwMDA4CS8qIEFzc2VydCBQTUUgb24gQVBNIFdha2V1cCAqLworI2RlZmluZSBFMTAwMF9XVUNfU1BNICAgICAgICAweDgwMDAwMDAwCS8qIEVuYWJsZSBTUE0gKi8KIAogLyogV2FrZSBVcCBGaWx0ZXIgQ29udHJvbCAqLwotI2RlZmluZSBFMTAwMF9XVUZDX0xOS0MgMHgwMDAwMDAwMSAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgV2FrZXVwIEVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9XVUZDX01BRyAgMHgwMDAwMDAwMiAvKiBNYWdpYyBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9XVUZDX0VYICAgMHgwMDAwMDAwNCAvKiBEaXJlY3RlZCBFeGFjdCBXYWtldXAgRW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1dVRkNfTUMgICAweDAwMDAwMDA4IC8qIERpcmVjdGVkIE11bHRpY2FzdCBXYWtldXAgRW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1dVRkNfQkMgICAweDAwMDAwMDEwIC8qIEJyb2FkY2FzdCBXYWtldXAgRW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1dVRkNfQVJQICAweDAwMDAwMDIwIC8qIEFSUCBSZXF1ZXN0IFBhY2tldCBXYWtldXAgRW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1dVRkNfSVBWNCAweDAwMDAwMDQwIC8qIERpcmVjdGVkIElQdjQgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfV1VGQ19JUFY2IDB4MDAwMDAwODAgLyogRGlyZWN0ZWQgSVB2NiBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9XVUZDX0lHTk9SRV9UQ08gICAgICAweDAwMDA4MDAwIC8qIElnbm9yZSBXYWtlT24gVENPIHBhY2tldHMgKi8KLSNkZWZpbmUgRTEwMDBfV1VGQ19GTFgwIDB4MDAwMTAwMDAgLyogRmxleGlibGUgRmlsdGVyIDAgRW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1dVRkNfRkxYMSAweDAwMDIwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAxIEVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDIgMHgwMDA0MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMiBFbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfV1VGQ19GTFgzIDB4MDAwODAwMDAgLyogRmxleGlibGUgRmlsdGVyIDMgRW5hYmxlICovCi0jZGVmaW5lIEUxMDAwX1dVRkNfQUxMX0ZJTFRFUlMgMHgwMDBGMDBGRiAvKiBNYXNrIGZvciBhbGwgd2FrZXVwIGZpbHRlcnMgKi8KLSNkZWZpbmUgRTEwMDBfV1VGQ19GTFhfT0ZGU0VUIDE2ICAgICAgIC8qIE9mZnNldCB0byB0aGUgRmxleGlibGUgRmlsdGVycyBiaXRzICovCi0jZGVmaW5lIEUxMDAwX1dVRkNfRkxYX0ZJTFRFUlMgMHgwMDBGMDAwMCAvKiBNYXNrIGZvciB0aGUgNCBmbGV4aWJsZSBmaWx0ZXJzICovCisjZGVmaW5lIEUxMDAwX1dVRkNfTE5LQyAweDAwMDAwMDAxCS8qIExpbmsgU3RhdHVzIENoYW5nZSBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfTUFHICAweDAwMDAwMDAyCS8qIE1hZ2ljIFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRVggICAweDAwMDAwMDA0CS8qIERpcmVjdGVkIEV4YWN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19NQyAgIDB4MDAwMDAwMDgJLyogRGlyZWN0ZWQgTXVsdGljYXN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19CQyAgIDB4MDAwMDAwMTAJLyogQnJvYWRjYXN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19BUlAgIDB4MDAwMDAwMjAJLyogQVJQIFJlcXVlc3QgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19JUFY0IDB4MDAwMDAwNDAJLyogRGlyZWN0ZWQgSVB2NCBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0lQVjYgMHgwMDAwMDA4MAkvKiBEaXJlY3RlZCBJUHY2IFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfSUdOT1JFX1RDTyAgICAgIDB4MDAwMDgwMDAJLyogSWdub3JlIFdha2VPbiBUQ08gcGFja2V0cyAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDAgMHgwMDAxMDAwMAkvKiBGbGV4aWJsZSBGaWx0ZXIgMCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFgxIDB4MDAwMjAwMDAJLyogRmxleGlibGUgRmlsdGVyIDEgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYMiAweDAwMDQwMDAwCS8qIEZsZXhpYmxlIEZpbHRlciAyIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDMgMHgwMDA4MDAwMAkvKiBGbGV4aWJsZSBGaWx0ZXIgMyBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19BTExfRklMVEVSUyAweDAwMEYwMEZGCS8qIE1hc2sgZm9yIGFsbCB3YWtldXAgZmlsdGVycyAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWF9PRkZTRVQgMTYJLyogT2Zmc2V0IHRvIHRoZSBGbGV4aWJsZSBGaWx0ZXJzIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFhfRklMVEVSUyAweDAwMEYwMDAwCS8qIE1hc2sgZm9yIHRoZSA0IGZsZXhpYmxlIGZpbHRlcnMgKi8KIAogLyogV2FrZSBVcCBTdGF0dXMgKi8KLSNkZWZpbmUgRTEwMDBfV1VTX0xOS0MgMHgwMDAwMDAwMSAvKiBMaW5rIFN0YXR1cyBDaGFuZ2VkICovCi0jZGVmaW5lIEUxMDAwX1dVU19NQUcgIDB4MDAwMDAwMDIgLyogTWFnaWMgUGFja2V0IFJlY2VpdmVkICovCi0jZGVmaW5lIEUxMDAwX1dVU19FWCAgIDB4MDAwMDAwMDQgLyogRGlyZWN0ZWQgRXhhY3QgUmVjZWl2ZWQgKi8KLSNkZWZpbmUgRTEwMDBfV1VTX01DICAgMHgwMDAwMDAwOCAvKiBEaXJlY3RlZCBNdWx0aWNhc3QgUmVjZWl2ZWQgKi8KLSNkZWZpbmUgRTEwMDBfV1VTX0JDICAgMHgwMDAwMDAxMCAvKiBCcm9hZGNhc3QgUmVjZWl2ZWQgKi8KLSNkZWZpbmUgRTEwMDBfV1VTX0FSUCAgMHgwMDAwMDAyMCAvKiBBUlAgUmVxdWVzdCBQYWNrZXQgUmVjZWl2ZWQgKi8KLSNkZWZpbmUgRTEwMDBfV1VTX0lQVjQgMHgwMDAwMDA0MCAvKiBEaXJlY3RlZCBJUHY0IFBhY2tldCBXYWtldXAgUmVjZWl2ZWQgKi8KLSNkZWZpbmUgRTEwMDBfV1VTX0lQVjYgMHgwMDAwMDA4MCAvKiBEaXJlY3RlZCBJUHY2IFBhY2tldCBXYWtldXAgUmVjZWl2ZWQgKi8KLSNkZWZpbmUgRTEwMDBfV1VTX0ZMWDAgMHgwMDAxMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMCBNYXRjaCAqLwotI2RlZmluZSBFMTAwMF9XVVNfRkxYMSAweDAwMDIwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAxIE1hdGNoICovCi0jZGVmaW5lIEUxMDAwX1dVU19GTFgyIDB4MDAwNDAwMDAgLyogRmxleGlibGUgRmlsdGVyIDIgTWF0Y2ggKi8KLSNkZWZpbmUgRTEwMDBfV1VTX0ZMWDMgMHgwMDA4MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMyBNYXRjaCAqLwotI2RlZmluZSBFMTAwMF9XVVNfRkxYX0ZJTFRFUlMgMHgwMDBGMDAwMCAvKiBNYXNrIGZvciB0aGUgNCBmbGV4aWJsZSBmaWx0ZXJzICovCisjZGVmaW5lIEUxMDAwX1dVU19MTktDIDB4MDAwMDAwMDEJLyogTGluayBTdGF0dXMgQ2hhbmdlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfTUFHICAweDAwMDAwMDAyCS8qIE1hZ2ljIFBhY2tldCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfRVggICAweDAwMDAwMDA0CS8qIERpcmVjdGVkIEV4YWN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19NQyAgIDB4MDAwMDAwMDgJLyogRGlyZWN0ZWQgTXVsdGljYXN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19CQyAgIDB4MDAwMDAwMTAJLyogQnJvYWRjYXN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19BUlAgIDB4MDAwMDAwMjAJLyogQVJQIFJlcXVlc3QgUGFja2V0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19JUFY0IDB4MDAwMDAwNDAJLyogRGlyZWN0ZWQgSVB2NCBQYWNrZXQgV2FrZXVwIFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19JUFY2IDB4MDAwMDAwODAJLyogRGlyZWN0ZWQgSVB2NiBQYWNrZXQgV2FrZXVwIFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgwIDB4MDAwMTAwMDAJLyogRmxleGlibGUgRmlsdGVyIDAgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWDEgMHgwMDAyMDAwMAkvKiBGbGV4aWJsZSBGaWx0ZXIgMSBNYXRjaCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYMiAweDAwMDQwMDAwCS8qIEZsZXhpYmxlIEZpbHRlciAyIE1hdGNoICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgzIDB4MDAwODAwMDAJLyogRmxleGlibGUgRmlsdGVyIDMgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWF9GSUxURVJTIDB4MDAwRjAwMDAJLyogTWFzayBmb3IgdGhlIDQgZmxleGlibGUgZmlsdGVycyAqLwogCiAvKiBNYW5hZ2VtZW50IENvbnRyb2wgKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19TTUJVU19FTiAgICAgIDB4MDAwMDAwMDEgLyogU01CdXMgRW5hYmxlZCAtIFJPICovCi0jZGVmaW5lIEUxMDAwX01BTkNfQVNGX0VOICAgICAgICAweDAwMDAwMDAyIC8qIEFTRiBFbmFibGVkIC0gUk8gKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19SX09OX0ZPUkNFICAgIDB4MDAwMDAwMDQgLyogUmVzZXQgb24gRm9yY2UgVENPIC0gUk8gKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19STUNQX0VOICAgICAgIDB4MDAwMDAxMDAgLyogRW5hYmxlIFJDTVAgMDI2RmggRmlsdGVyaW5nICovCi0jZGVmaW5lIEUxMDAwX01BTkNfMDI5OF9FTiAgICAgICAweDAwMDAwMjAwIC8qIEVuYWJsZSBSQ01QIDAyOThoIEZpbHRlcmluZyAqLwotI2RlZmluZSBFMTAwMF9NQU5DX0lQVjRfRU4gICAgICAgMHgwMDAwMDQwMCAvKiBFbmFibGUgSVB2NCAqLwotI2RlZmluZSBFMTAwMF9NQU5DX0lQVjZfRU4gICAgICAgMHgwMDAwMDgwMCAvKiBFbmFibGUgSVB2NiAqLwotI2RlZmluZSBFMTAwMF9NQU5DX1NOQVBfRU4gICAgICAgMHgwMDAwMTAwMCAvKiBBY2NlcHQgTExDL1NOQVAgKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19BUlBfRU4gICAgICAgIDB4MDAwMDIwMDAgLyogRW5hYmxlIEFSUCBSZXF1ZXN0IEZpbHRlcmluZyAqLwotI2RlZmluZSBFMTAwMF9NQU5DX05FSUdIQk9SX0VOICAgMHgwMDAwNDAwMCAvKiBFbmFibGUgTmVpZ2hib3IgRGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZpbHRlcmluZyAqLwotI2RlZmluZSBFMTAwMF9NQU5DX0FSUF9SRVNfRU4gICAgMHgwMDAwODAwMCAvKiBFbmFibGUgQVJQIHJlc3BvbnNlIEZpbHRlcmluZyAqLwotI2RlZmluZSBFMTAwMF9NQU5DX1RDT19SRVNFVCAgICAgMHgwMDAxMDAwMCAvKiBUQ08gUmVzZXQgT2NjdXJyZWQgKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19SQ1ZfVENPX0VOICAgIDB4MDAwMjAwMDAgLyogUmVjZWl2ZSBUQ08gUGFja2V0cyBFbmFibGVkICovCi0jZGVmaW5lIEUxMDAwX01BTkNfUkVQT1JUX1NUQVRVUyAweDAwMDQwMDAwIC8qIFN0YXR1cyBSZXBvcnRpbmcgRW5hYmxlZCAqLwotI2RlZmluZSBFMTAwMF9NQU5DX1JDVl9BTEwgICAgICAgMHgwMDA4MDAwMCAvKiBSZWNlaXZlIEFsbCBFbmFibGVkICovCi0jZGVmaW5lIEUxMDAwX01BTkNfQkxLX1BIWV9SU1RfT05fSURFICAgMHgwMDA0MDAwMCAvKiBCbG9jayBwaHkgcmVzZXRzICovCi0jZGVmaW5lIEUxMDAwX01BTkNfRU5fTUFDX0FERFJfRklMVEVSICAgMHgwMDEwMDAwMCAvKiBFbmFibGUgTUFDIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbHRlcmluZyAqLwotI2RlZmluZSBFMTAwMF9NQU5DX0VOX01ORzJIT1NUICAgMHgwMDIwMDAwMCAvKiBFbmFibGUgTU5HIHBhY2tldHMgdG8gaG9zdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtZW1vcnkgKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19FTl9JUF9BRERSX0ZJTFRFUiAgICAweDAwNDAwMDAwIC8qIEVuYWJsZSBJUCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWx0ZXJpbmcgKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19FTl9YU1VNX0ZJTFRFUiAgIDB4MDA4MDAwMDAgLyogRW5hYmxlIGNoZWNrc3VtIGZpbHRlcmluZyAqLwotI2RlZmluZSBFMTAwMF9NQU5DX0JSX0VOICAgICAgICAgMHgwMTAwMDAwMCAvKiBFbmFibGUgYnJvYWRjYXN0IGZpbHRlcmluZyAqLwotI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9SRVEgICAgICAgMHgwMTAwMDAwMCAvKiBTTUJ1cyBSZXF1ZXN0ICovCi0jZGVmaW5lIEUxMDAwX01BTkNfU01CX0dOVCAgICAgICAweDAyMDAwMDAwIC8qIFNNQnVzIEdyYW50ICovCi0jZGVmaW5lIEUxMDAwX01BTkNfU01CX0NMS19JTiAgICAweDA0MDAwMDAwIC8qIFNNQnVzIENsb2NrIEluICovCi0jZGVmaW5lIEUxMDAwX01BTkNfU01CX0RBVEFfSU4gICAweDA4MDAwMDAwIC8qIFNNQnVzIERhdGEgSW4gKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfREFUQV9PVVQgIDB4MTAwMDAwMDAgLyogU01CdXMgRGF0YSBPdXQgKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX09VVCAgIDB4MjAwMDAwMDAgLyogU01CdXMgQ2xvY2sgT3V0ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CVVNfRU4gICAgICAweDAwMDAwMDAxCS8qIFNNQnVzIEVuYWJsZWQgLSBSTyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0FTRl9FTiAgICAgICAgMHgwMDAwMDAwMgkvKiBBU0YgRW5hYmxlZCAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkNfUl9PTl9GT1JDRSAgICAweDAwMDAwMDA0CS8qIFJlc2V0IG9uIEZvcmNlIFRDTyAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkNfUk1DUF9FTiAgICAgICAweDAwMDAwMTAwCS8qIEVuYWJsZSBSQ01QIDAyNkZoIEZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DXzAyOThfRU4gICAgICAgMHgwMDAwMDIwMAkvKiBFbmFibGUgUkNNUCAwMjk4aCBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19JUFY0X0VOICAgICAgIDB4MDAwMDA0MDAJLyogRW5hYmxlIElQdjQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19JUFY2X0VOICAgICAgIDB4MDAwMDA4MDAJLyogRW5hYmxlIElQdjYgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTkFQX0VOICAgICAgIDB4MDAwMDEwMDAJLyogQWNjZXB0IExMQy9TTkFQICovCisjZGVmaW5lIEUxMDAwX01BTkNfQVJQX0VOICAgICAgICAweDAwMDAyMDAwCS8qIEVuYWJsZSBBUlAgUmVxdWVzdCBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19ORUlHSEJPUl9FTiAgIDB4MDAwMDQwMDAJLyogRW5hYmxlIE5laWdoYm9yIERpc2NvdmVyeQorCQkJCQkJICogRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfQVJQX1JFU19FTiAgICAweDAwMDA4MDAwCS8qIEVuYWJsZSBBUlAgcmVzcG9uc2UgRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfVENPX1JFU0VUICAgICAweDAwMDEwMDAwCS8qIFRDTyBSZXNldCBPY2N1cnJlZCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1JDVl9UQ09fRU4gICAgMHgwMDAyMDAwMAkvKiBSZWNlaXZlIFRDTyBQYWNrZXRzIEVuYWJsZWQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19SRVBPUlRfU1RBVFVTIDB4MDAwNDAwMDAJLyogU3RhdHVzIFJlcG9ydGluZyBFbmFibGVkICovCisjZGVmaW5lIEUxMDAwX01BTkNfUkNWX0FMTCAgICAgICAweDAwMDgwMDAwCS8qIFJlY2VpdmUgQWxsIEVuYWJsZWQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19CTEtfUEhZX1JTVF9PTl9JREUgICAweDAwMDQwMDAwCS8qIEJsb2NrIHBoeSByZXNldHMgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19FTl9NQUNfQUREUl9GSUxURVIgICAweDAwMTAwMDAwCS8qIEVuYWJsZSBNQUMgYWRkcmVzcworCQkJCQkJCSAqIGZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0VOX01ORzJIT1NUICAgMHgwMDIwMDAwMAkvKiBFbmFibGUgTU5HIHBhY2tldHMgdG8gaG9zdAorCQkJCQkJICogbWVtb3J5ICovCisjZGVmaW5lIEUxMDAwX01BTkNfRU5fSVBfQUREUl9GSUxURVIgICAgMHgwMDQwMDAwMAkvKiBFbmFibGUgSVAgYWRkcmVzcworCQkJCQkJCSAqIGZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0VOX1hTVU1fRklMVEVSICAgMHgwMDgwMDAwMAkvKiBFbmFibGUgY2hlY2tzdW0gZmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfQlJfRU4gICAgICAgICAweDAxMDAwMDAwCS8qIEVuYWJsZSBicm9hZGNhc3QgZmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX1JFUSAgICAgICAweDAxMDAwMDAwCS8qIFNNQnVzIFJlcXVlc3QgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfR05UICAgICAgIDB4MDIwMDAwMDAJLyogU01CdXMgR3JhbnQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX0lOICAgIDB4MDQwMDAwMDAJLyogU01CdXMgQ2xvY2sgSW4gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfREFUQV9JTiAgIDB4MDgwMDAwMDAJLyogU01CdXMgRGF0YSBJbiAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9EQVRBX09VVCAgMHgxMDAwMDAwMAkvKiBTTUJ1cyBEYXRhIE91dCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9DTEtfT1VUICAgMHgyMDAwMDAwMAkvKiBTTUJ1cyBDbG9jayBPdXQgKi8KIAotI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9EQVRBX09VVF9TSElGVCAgMjggLyogU01CdXMgRGF0YSBPdXQgU2hpZnQgKi8KLSNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX09VVF9TSElGVCAgIDI5IC8qIFNNQnVzIENsb2NrIE91dCBTaGlmdCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9EQVRBX09VVF9TSElGVCAgMjgJLyogU01CdXMgRGF0YSBPdXQgU2hpZnQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX09VVF9TSElGVCAgIDI5CS8qIFNNQnVzIENsb2NrIE91dCBTaGlmdCAqLwogCiAvKiBTVyBTZW1hcGhvcmUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRTEwMDBfU1dTTV9TTUJJICAgICAgICAgMHgwMDAwMDAwMSAvKiBEcml2ZXIgU2VtYXBob3JlIGJpdCAqLwotI2RlZmluZSBFMTAwMF9TV1NNX1NXRVNNQkkgICAgICAweDAwMDAwMDAyIC8qIEZXIFNlbWFwaG9yZSBiaXQgKi8KLSNkZWZpbmUgRTEwMDBfU1dTTV9XTU5HICAgICAgICAgMHgwMDAwMDAwNCAvKiBXYWtlIE1ORyBDbG9jayAqLwotI2RlZmluZSBFMTAwMF9TV1NNX0RSVl9MT0FEICAgICAweDAwMDAwMDA4IC8qIERyaXZlciBMb2FkZWQgQml0ICovCisjZGVmaW5lIEUxMDAwX1NXU01fU01CSSAgICAgICAgIDB4MDAwMDAwMDEJLyogRHJpdmVyIFNlbWFwaG9yZSBiaXQgKi8KKyNkZWZpbmUgRTEwMDBfU1dTTV9TV0VTTUJJICAgICAgMHgwMDAwMDAwMgkvKiBGVyBTZW1hcGhvcmUgYml0ICovCisjZGVmaW5lIEUxMDAwX1NXU01fV01ORyAgICAgICAgIDB4MDAwMDAwMDQJLyogV2FrZSBNTkcgQ2xvY2sgKi8KKyNkZWZpbmUgRTEwMDBfU1dTTV9EUlZfTE9BRCAgICAgMHgwMDAwMDAwOAkvKiBEcml2ZXIgTG9hZGVkIEJpdCAqLwogCiAvKiBGVyBTZW1hcGhvcmUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRTEwMDBfRldTTV9NT0RFX01BU0sgICAgMHgwMDAwMDAwRSAvKiBGVyBtb2RlICovCisjZGVmaW5lIEUxMDAwX0ZXU01fTU9ERV9NQVNLICAgIDB4MDAwMDAwMEUJLyogRlcgbW9kZSAqLwogI2RlZmluZSBFMTAwMF9GV1NNX01PREVfU0hJRlQgICAgICAgICAgICAxCi0jZGVmaW5lIEUxMDAwX0ZXU01fRldfVkFMSUQgICAgIDB4MDAwMDgwMDAgLyogRlcgZXN0YWJsaXNoZWQgYSB2YWxpZCBtb2RlICovCisjZGVmaW5lIEUxMDAwX0ZXU01fRldfVkFMSUQgICAgIDB4MDAwMDgwMDAJLyogRlcgZXN0YWJsaXNoZWQgYSB2YWxpZCBtb2RlICovCiAKLSNkZWZpbmUgRTEwMDBfRldTTV9SU1BDSVBIWSAgICAgICAgMHgwMDAwMDA0MCAvKiBSZXNldCBQSFkgb24gUENJIHJlc2V0ICovCi0jZGVmaW5lIEUxMDAwX0ZXU01fRElTU1cgICAgICAgICAgIDB4MTAwMDAwMDAgLyogRlcgZGlzYWJsZSBTVyBXcml0ZSBBY2Nlc3MgKi8KLSNkZWZpbmUgRTEwMDBfRldTTV9TS1VTRUxfTUFTSyAgICAgMHg2MDAwMDAwMCAvKiBMQU4gU0tVIHNlbGVjdCAqLworI2RlZmluZSBFMTAwMF9GV1NNX1JTUENJUEhZICAgICAgICAweDAwMDAwMDQwCS8qIFJlc2V0IFBIWSBvbiBQQ0kgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfRldTTV9ESVNTVyAgICAgICAgICAgMHgxMDAwMDAwMAkvKiBGVyBkaXNhYmxlIFNXIFdyaXRlIEFjY2VzcyAqLworI2RlZmluZSBFMTAwMF9GV1NNX1NLVVNFTF9NQVNLICAgICAweDYwMDAwMDAwCS8qIExBTiBTS1Ugc2VsZWN0ICovCiAjZGVmaW5lIEUxMDAwX0ZXU01fU0tVRUxfU0hJRlQgICAgIDI5Ci0jZGVmaW5lIEUxMDAwX0ZXU01fU0tVU0VMX0VNQiAgICAgIDB4MCAvKiBFbWJlZGRlZCBTS1UgKi8KLSNkZWZpbmUgRTEwMDBfRldTTV9TS1VTRUxfQ09OUyAgICAgMHgxIC8qIENvbnN1bWVyIFNLVSAqLwotI2RlZmluZSBFMTAwMF9GV1NNX1NLVVNFTF9QRVJGXzEwMCAweDIgLyogUGVyZiAmIENvcnAgMTAvMTAwIFNLVSAqLwotI2RlZmluZSBFMTAwMF9GV1NNX1NLVVNFTF9QRVJGX0dCRSAweDMgLyogUGVyZiAmIENvcHIgR2JFIFNLVSAqLworI2RlZmluZSBFMTAwMF9GV1NNX1NLVVNFTF9FTUIgICAgICAweDAJLyogRW1iZWRkZWQgU0tVICovCisjZGVmaW5lIEUxMDAwX0ZXU01fU0tVU0VMX0NPTlMgICAgIDB4MQkvKiBDb25zdW1lciBTS1UgKi8KKyNkZWZpbmUgRTEwMDBfRldTTV9TS1VTRUxfUEVSRl8xMDAgMHgyCS8qIFBlcmYgJiBDb3JwIDEwLzEwMCBTS1UgKi8KKyNkZWZpbmUgRTEwMDBfRldTTV9TS1VTRUxfUEVSRl9HQkUgMHgzCS8qIFBlcmYgJiBDb3ByIEdiRSBTS1UgKi8KIAogLyogRkZMVCBEZWJ1ZyBSZWdpc3RlciAqLwotI2RlZmluZSBFMTAwMF9GRkxUX0RCR19JTlZDICAgICAweDAwMTAwMDAwIC8qIEludmFsaWQgL0MvIGNvZGUgaGFuZGxpbmcgKi8KKyNkZWZpbmUgRTEwMDBfRkZMVF9EQkdfSU5WQyAgICAgMHgwMDEwMDAwMAkvKiBJbnZhbGlkIC9DLyBjb2RlIGhhbmRsaW5nICovCiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgZTEwMDBfbW5nX21vZGVfbm9uZSAgICAgPSAwLAotICAgIGUxMDAwX21uZ19tb2RlX2FzZiwKLSAgICBlMTAwMF9tbmdfbW9kZV9wdCwKLSAgICBlMTAwMF9tbmdfbW9kZV9pcG1pLAotICAgIGUxMDAwX21uZ19tb2RlX2hvc3RfaW50ZXJmYWNlX29ubHkKKwllMTAwMF9tbmdfbW9kZV9ub25lID0gMCwKKwllMTAwMF9tbmdfbW9kZV9hc2YsCisJZTEwMDBfbW5nX21vZGVfcHQsCisJZTEwMDBfbW5nX21vZGVfaXBtaSwKKwllMTAwMF9tbmdfbW9kZV9ob3N0X2ludGVyZmFjZV9vbmx5CiB9IGUxMDAwX21uZ19tb2RlOwogCi0vKiBIb3N0IEludGVmYWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRTEwMDBfSElDUl9FTiAgICAgICAgICAgMHgwMDAwMDAwMSAgLyogRW5hYmxlIEJpdCAtIFJPICovCi0jZGVmaW5lIEUxMDAwX0hJQ1JfQyAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8qIERyaXZlciBzZXRzIHRoaXMgYml0IHdoZW4gZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBwdXQgY29tbWFuZCBpbiBSQU0gKi8KLSNkZWZpbmUgRTEwMDBfSElDUl9TViAgICAgICAgICAgMHgwMDAwMDAwNCAgLyogU3RhdHVzIFZhbGlkaXR5ICovCi0jZGVmaW5lIEUxMDAwX0hJQ1JfRldSICAgICAgICAgIDB4MDAwMDAwODAgIC8qIEZXIHJlc2V0LiBTZXQgYnkgdGhlIEhvc3QgKi8KKy8qIEhvc3QgSW50ZXJmYWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfSElDUl9FTiAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBFbmFibGUgQml0IC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfSElDUl9DICAgICAgICAgICAgMHgwMDAwMDAwMgkvKiBEcml2ZXIgc2V0cyB0aGlzIGJpdCB3aGVuIGRvbmUKKwkJCQkJCSAqIHRvIHB1dCBjb21tYW5kIGluIFJBTSAqLworI2RlZmluZSBFMTAwMF9ISUNSX1NWICAgICAgICAgICAweDAwMDAwMDA0CS8qIFN0YXR1cyBWYWxpZGl0eSAqLworI2RlZmluZSBFMTAwMF9ISUNSX0ZXUiAgICAgICAgICAweDAwMDAwMDgwCS8qIEZXIHJlc2V0LiBTZXQgYnkgdGhlIEhvc3QgKi8KIAogLyogSG9zdCBJbnRlcmZhY2UgQ29tbWFuZCBJbnRlcmZhY2UgLSBBZGRyZXNzIHJhbmdlIDB4ODgwMC0weDhFRkYgKi8KLSNkZWZpbmUgRTEwMDBfSElfTUFYX0RBVEFfTEVOR1RIICAgICAgICAgMjUyIC8qIEhvc3QgSW50ZXJmYWNlIGRhdGEgbGVuZ3RoICovCi0jZGVmaW5lIEUxMDAwX0hJX01BWF9CTE9DS19CWVRFX0xFTkdUSCAgMTc5MiAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gcmFuZ2UgKi8KLSNkZWZpbmUgRTEwMDBfSElfTUFYX0JMT0NLX0RXT1JEX0xFTkdUSCAgNDQ4IC8qIE51bWJlciBvZiBkd29yZHMgaW4gcmFuZ2UgKi8KLSNkZWZpbmUgRTEwMDBfSElfQ09NTUFORF9USU1FT1VUICAgICAgICAgNTAwIC8qIFRpbWUgaW4gbXMgdG8gcHJvY2VzcyBISSBjb21tYW5kICovCisjZGVmaW5lIEUxMDAwX0hJX01BWF9EQVRBX0xFTkdUSCAgICAgICAgIDI1MgkvKiBIb3N0IEludGVyZmFjZSBkYXRhIGxlbmd0aCAqLworI2RlZmluZSBFMTAwMF9ISV9NQVhfQkxPQ0tfQllURV9MRU5HVEggIDE3OTIJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHJhbmdlICovCisjZGVmaW5lIEUxMDAwX0hJX01BWF9CTE9DS19EV09SRF9MRU5HVEggIDQ0OAkvKiBOdW1iZXIgb2YgZHdvcmRzIGluIHJhbmdlICovCisjZGVmaW5lIEUxMDAwX0hJX0NPTU1BTkRfVElNRU9VVCAgICAgICAgIDUwMAkvKiBUaW1lIGluIG1zIHRvIHByb2Nlc3MgSEkgY29tbWFuZCAqLwogCiBzdHJ1Y3QgZTEwMDBfaG9zdF9jb21tYW5kX2hlYWRlciB7Ci0gICAgdTggY29tbWFuZF9pZDsKLSAgICB1OCBjb21tYW5kX2xlbmd0aDsKLSAgICB1OCBjb21tYW5kX29wdGlvbnM7ICAgLyogSS9GIGJpdHMgZm9yIGNvbW1hbmQsIHN0YXR1cyBmb3IgcmV0dXJuICovCi0gICAgdTggY2hlY2tzdW07CisJdTggY29tbWFuZF9pZDsKKwl1OCBjb21tYW5kX2xlbmd0aDsKKwl1OCBjb21tYW5kX29wdGlvbnM7CS8qIEkvRiBiaXRzIGZvciBjb21tYW5kLCBzdGF0dXMgZm9yIHJldHVybiAqLworCXU4IGNoZWNrc3VtOwogfTsKIHN0cnVjdCBlMTAwMF9ob3N0X2NvbW1hbmRfaW5mbyB7Ci0gICAgc3RydWN0IGUxMDAwX2hvc3RfY29tbWFuZF9oZWFkZXIgY29tbWFuZF9oZWFkZXI7ICAvKiBDb21tYW5kIEhlYWQvQ29tbWFuZCBSZXN1bHQgSGVhZCBoYXMgNCBieXRlcyAqLwotICAgIHU4IGNvbW1hbmRfZGF0YVtFMTAwMF9ISV9NQVhfREFUQV9MRU5HVEhdOyAgIC8qIENvbW1hbmQgZGF0YSBjYW4gbGVuZ3RoIDAuLjI1MiAqLworCXN0cnVjdCBlMTAwMF9ob3N0X2NvbW1hbmRfaGVhZGVyIGNvbW1hbmRfaGVhZGVyOwkvKiBDb21tYW5kIEhlYWQvQ29tbWFuZCBSZXN1bHQgSGVhZCBoYXMgNCBieXRlcyAqLworCXU4IGNvbW1hbmRfZGF0YVtFMTAwMF9ISV9NQVhfREFUQV9MRU5HVEhdOwkvKiBDb21tYW5kIGRhdGEgY2FuIGxlbmd0aCAwLi4yNTIgKi8KIH07CiAKIC8qIEhvc3QgU01CIHJlZ2lzdGVyICMwICovCi0jZGVmaW5lIEUxMDAwX0hTTUMwUl9DTEtJTiAgICAgIDB4MDAwMDAwMDEgIC8qIFNNQiBDbG9jayBpbiAqLwotI2RlZmluZSBFMTAwMF9IU01DMFJfREFUQUlOICAgICAweDAwMDAwMDAyICAvKiBTTUIgRGF0YSBpbiAqLwotI2RlZmluZSBFMTAwMF9IU01DMFJfREFUQU9VVCAgICAweDAwMDAwMDA0ICAvKiBTTUIgRGF0YSBvdXQgKi8KLSNkZWZpbmUgRTEwMDBfSFNNQzBSX0NMS09VVCAgICAgMHgwMDAwMDAwOCAgLyogU01CIENsb2NrIG91dCAqLworI2RlZmluZSBFMTAwMF9IU01DMFJfQ0xLSU4gICAgICAweDAwMDAwMDAxCS8qIFNNQiBDbG9jayBpbiAqLworI2RlZmluZSBFMTAwMF9IU01DMFJfREFUQUlOICAgICAweDAwMDAwMDAyCS8qIFNNQiBEYXRhIGluICovCisjZGVmaW5lIEUxMDAwX0hTTUMwUl9EQVRBT1VUICAgIDB4MDAwMDAwMDQJLyogU01CIERhdGEgb3V0ICovCisjZGVmaW5lIEUxMDAwX0hTTUMwUl9DTEtPVVQgICAgIDB4MDAwMDAwMDgJLyogU01CIENsb2NrIG91dCAqLwogCiAvKiBIb3N0IFNNQiByZWdpc3RlciAjMSAqLwogI2RlZmluZSBFMTAwMF9IU01DMVJfQ0xLSU4gICAgICBFMTAwMF9IU01DMFJfQ0xLSU4KQEAgLTIxODUsMTAgKzIwOTYsMTAgQEAKICNkZWZpbmUgRTEwMDBfSFNNQzFSX0NMS09VVCAgICAgRTEwMDBfSFNNQzBSX0NMS09VVAogCiAvKiBGVyBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRTEwMDBfRldTVFNfRldTX01BU0sgICAgMHgwMDAwMDBGRiAgLyogRlcgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX0ZXU1RTX0ZXU19NQVNLICAgIDB4MDAwMDAwRkYJLyogRlcgU3RhdHVzICovCiAKIC8qIFdha2UgVXAgUGFja2V0IExlbmd0aCAqLwotI2RlZmluZSBFMTAwMF9XVVBMX0xFTkdUSF9NQVNLIDB4MEZGRiAgIC8qIE9ubHkgdGhlIGxvd2VyIDEyIGJpdHMgYXJlIHZhbGlkICovCisjZGVmaW5lIEUxMDAwX1dVUExfTEVOR1RIX01BU0sgMHgwRkZGCS8qIE9ubHkgdGhlIGxvd2VyIDEyIGJpdHMgYXJlIHZhbGlkICovCiAKICNkZWZpbmUgRTEwMDBfTURBTElHTiAgICAgICAgICA0MDk2CiAKQEAgLTIyNDIsMjQgKzIxNTMsMjQgQEAKICNkZWZpbmUgUENJX0VYX0xJTktfV0lEVEhfU0hJRlQgICAgICA0CiAKIC8qIEVFUFJPTSBDb21tYW5kcyAtIE1pY3Jvd2lyZSAqLwotI2RlZmluZSBFRVBST01fUkVBRF9PUENPREVfTUlDUk9XSVJFICAweDYgIC8qIEVFUFJPTSByZWFkIG9wY29kZSAqLwotI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFX01JQ1JPV0lSRSAweDUgIC8qIEVFUFJPTSB3cml0ZSBvcGNvZGUgKi8KLSNkZWZpbmUgRUVQUk9NX0VSQVNFX09QQ09ERV9NSUNST1dJUkUgMHg3ICAvKiBFRVBST00gZXJhc2Ugb3Bjb2RlICovCi0jZGVmaW5lIEVFUFJPTV9FV0VOX09QQ09ERV9NSUNST1dJUkUgIDB4MTMgLyogRUVQUk9NIGVyYXNlL3dyaXRlIGVuYWJsZSAqLwotI2RlZmluZSBFRVBST01fRVdEU19PUENPREVfTUlDUk9XSVJFICAweDEwIC8qIEVFUFJPTSBlcmFzdC93cml0ZSBkaXNhYmxlICovCisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERV9NSUNST1dJUkUgIDB4NgkvKiBFRVBST00gcmVhZCBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERV9NSUNST1dJUkUgMHg1CS8qIEVFUFJPTSB3cml0ZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VSQVNFX09QQ09ERV9NSUNST1dJUkUgMHg3CS8qIEVFUFJPTSBlcmFzZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFX01JQ1JPV0lSRSAgMHgxMwkvKiBFRVBST00gZXJhc2Uvd3JpdGUgZW5hYmxlICovCisjZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERV9NSUNST1dJUkUgIDB4MTAJLyogRUVQUk9NIGVyYXNlL3dyaXRlIGRpc2FibGUgKi8KIAogLyogRUVQUk9NIENvbW1hbmRzIC0gU1BJICovCi0jZGVmaW5lIEVFUFJPTV9NQVhfUkVUUllfU1BJICAgICAgICA1MDAwIC8qIE1heCB3YWl0IG9mIDVtcywgZm9yIFJEWSBzaWduYWwgKi8KLSNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFX1NQSSAgICAgIDB4MDMgIC8qIEVFUFJPTSByZWFkIG9wY29kZSAqLwotI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFX1NQSSAgICAgMHgwMiAgLyogRUVQUk9NIHdyaXRlIG9wY29kZSAqLwotI2RlZmluZSBFRVBST01fQThfT1BDT0RFX1NQSSAgICAgICAgMHgwOCAgLyogb3Bjb2RlIGJpdC0zID0gYWRkcmVzcyBiaXQtOCAqLwotI2RlZmluZSBFRVBST01fV1JFTl9PUENPREVfU1BJICAgICAgMHgwNiAgLyogRUVQUk9NIHNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KLSNkZWZpbmUgRUVQUk9NX1dSRElfT1BDT0RFX1NQSSAgICAgIDB4MDQgIC8qIEVFUFJPTSByZXNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KLSNkZWZpbmUgRUVQUk9NX1JEU1JfT1BDT0RFX1NQSSAgICAgIDB4MDUgIC8qIEVFUFJPTSByZWFkIFN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBFRVBST01fV1JTUl9PUENPREVfU1BJICAgICAgMHgwMSAgLyogRUVQUk9NIHdyaXRlIFN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBFRVBST01fRVJBU0U0S19PUENPREVfU1BJICAgMHgyMCAgLyogRUVQUk9NIEVSQVNFIDRLQiAqLwotI2RlZmluZSBFRVBST01fRVJBU0U2NEtfT1BDT0RFX1NQSSAgMHhEOCAgLyogRUVQUk9NIEVSQVNFIDY0S0IgKi8KLSNkZWZpbmUgRUVQUk9NX0VSQVNFMjU2X09QQ09ERV9TUEkgIDB4REIgIC8qIEVFUFJPTSBFUkFTRSAyNTZCICovCisjZGVmaW5lIEVFUFJPTV9NQVhfUkVUUllfU1BJICAgICAgICA1MDAwCS8qIE1heCB3YWl0IG9mIDVtcywgZm9yIFJEWSBzaWduYWwgKi8KKyNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFX1NQSSAgICAgIDB4MDMJLyogRUVQUk9NIHJlYWQgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREVfU1BJICAgICAweDAyCS8qIEVFUFJPTSB3cml0ZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0E4X09QQ09ERV9TUEkgICAgICAgIDB4MDgJLyogb3Bjb2RlIGJpdC0zID0gYWRkcmVzcyBiaXQtOCAqLworI2RlZmluZSBFRVBST01fV1JFTl9PUENPREVfU1BJICAgICAgMHgwNgkvKiBFRVBST00gc2V0IFdyaXRlIEVuYWJsZSBsYXRjaCAqLworI2RlZmluZSBFRVBST01fV1JESV9PUENPREVfU1BJICAgICAgMHgwNAkvKiBFRVBST00gcmVzZXQgV3JpdGUgRW5hYmxlIGxhdGNoICovCisjZGVmaW5lIEVFUFJPTV9SRFNSX09QQ09ERV9TUEkgICAgICAweDA1CS8qIEVFUFJPTSByZWFkIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFRVBST01fV1JTUl9PUENPREVfU1BJICAgICAgMHgwMQkvKiBFRVBST00gd3JpdGUgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVFUFJPTV9FUkFTRTRLX09QQ09ERV9TUEkgICAweDIwCS8qIEVFUFJPTSBFUkFTRSA0S0IgKi8KKyNkZWZpbmUgRUVQUk9NX0VSQVNFNjRLX09QQ09ERV9TUEkgIDB4RDgJLyogRUVQUk9NIEVSQVNFIDY0S0IgKi8KKyNkZWZpbmUgRUVQUk9NX0VSQVNFMjU2X09QQ09ERV9TUEkgIDB4REIJLyogRUVQUk9NIEVSQVNFIDI1NkIgKi8KIAogLyogRUVQUk9NIFNpemUgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRUVQUk9NX1dPUkRfU0laRV9TSElGVCAgNgpAQCAtMjI3MCw3ICsyMTgxLDcgQEAKICNkZWZpbmUgRUVQUk9NX0NPTVBBVCAgICAgICAgICAgICAgICAgMHgwMDAzCiAjZGVmaW5lIEVFUFJPTV9JRF9MRURfU0VUVElOR1MgICAgICAgIDB4MDAwNAogI2RlZmluZSBFRVBST01fVkVSU0lPTiAgICAgICAgICAgICAgICAweDAwMDUKLSNkZWZpbmUgRUVQUk9NX1NFUkRFU19BTVBMSVRVREUgICAgICAgMHgwMDA2IC8qIEZvciBTRVJERVMgb3V0cHV0IGFtcGxpdHVkZSBhZGp1c3RtZW50LiAqLworI2RlZmluZSBFRVBST01fU0VSREVTX0FNUExJVFVERSAgICAgICAweDAwMDYJLyogRm9yIFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGFkanVzdG1lbnQuICovCiAjZGVmaW5lIEVFUFJPTV9QSFlfQ0xBU1NfV09SRCAgICAgICAgIDB4MDAwNwogI2RlZmluZSBFRVBST01fSU5JVF9DT05UUk9MMV9SRUcgICAgICAweDAwMEEKICNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHICAgICAgMHgwMDBGCkBAIC0yMjgzLDIyICsyMTk0LDE2IEBACiAjZGVmaW5lIEVFUFJPTV9GTEFTSF9WRVJTSU9OICAgICAgICAgIDB4MDAzMgogI2RlZmluZSBFRVBST01fQ0hFQ0tTVU1fUkVHICAgICAgICAgICAweDAwM0YKIAotI2RlZmluZSBFMTAwMF9FRVBST01fQ0ZHX0RPTkUgICAgICAgICAweDAwMDQwMDAwICAgLyogTU5HIGNvbmZpZyBjeWNsZSBkb25lICovCi0jZGVmaW5lIEUxMDAwX0VFUFJPTV9DRkdfRE9ORV9QT1JUXzEgIDB4MDAwODAwMDAgICAvKiAuLi5mb3Igc2Vjb25kIHBvcnQgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX0NGR19ET05FICAgICAgICAgMHgwMDA0MDAwMAkvKiBNTkcgY29uZmlnIGN5Y2xlIGRvbmUgKi8KKyNkZWZpbmUgRTEwMDBfRUVQUk9NX0NGR19ET05FX1BPUlRfMSAgMHgwMDA4MDAwMAkvKiAuLi5mb3Igc2Vjb25kIHBvcnQgKi8KIAogLyogV29yZCBkZWZpbml0aW9ucyBmb3IgSUQgTEVEIFNldHRpbmdzICovCiAjZGVmaW5lIElEX0xFRF9SRVNFUlZFRF8wMDAwIDB4MDAwMAogI2RlZmluZSBJRF9MRURfUkVTRVJWRURfRkZGRiAweEZGRkYKLSNkZWZpbmUgSURfTEVEX1JFU0VSVkVEXzgyNTczICAweEY3NDYKLSNkZWZpbmUgSURfTEVEX0RFRkFVTFRfODI1NzMgICAweDE4MTEKICNkZWZpbmUgSURfTEVEX0RFRkFVTFQgICAgICAgKChJRF9MRURfT0ZGMV9PTjIgPDwgMTIpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9PRkYxX09GRjIgPDwgOCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURfTEVEX0RFRjFfREVGMiA8PCA0KSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9ERUYyKSkKLSNkZWZpbmUgSURfTEVEX0RFRkFVTFRfSUNIOExBTiAgKChJRF9MRURfREVGMV9ERUYyIDw8IDEyKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9PRkYyIDw8ICA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9PTjIgIDw8ICA0KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9ERUYyKSkKICNkZWZpbmUgSURfTEVEX0RFRjFfREVGMiAgICAgMHgxCiAjZGVmaW5lIElEX0xFRF9ERUYxX09OMiAgICAgIDB4MgogI2RlZmluZSBJRF9MRURfREVGMV9PRkYyICAgICAweDMKQEAgLTIzMTMsNyArMjIxOCw2IEBACiAjZGVmaW5lIElHUF9BQ1RJVklUWV9MRURfRU5BQkxFIDB4MDMwMAogI2RlZmluZSBJR1BfTEVEM19NT0RFICAgICAgICAgICAweDA3MDAwMDAwCiAKLQogLyogTWFzayBiaXRzIGZvciBTRVJERVMgYW1wbGl0dWRlIGFkanVzdG1lbnQgaW4gV29yZCA2IG9mIHRoZSBFRVBST00gKi8KICNkZWZpbmUgRUVQUk9NX1NFUkRFU19BTVBMSVRVREVfTUFTSyAgMHgwMDBGCiAKQEAgLTIzODQsMTEgKzIyODgsOCBAQAogCiAjZGVmaW5lIERFRkFVTFRfODI1NDJfVElQR19JUEdSMiAxMAogI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHUjIgNgotI2RlZmluZSBERUZBVUxUXzgwMDAzRVMyTEFOX1RJUEdfSVBHUjIgNwogI2RlZmluZSBFMTAwMF9USVBHX0lQR1IyX1NISUZUICAyMAogCi0jZGVmaW5lIERFRkFVTFRfODAwMDNFUzJMQU5fVElQR19JUEdUXzEwXzEwMCAweDAwMDAwMDA5Ci0jZGVmaW5lIERFRkFVTFRfODAwMDNFUzJMQU5fVElQR19JUEdUXzEwMDAgICAweDAwMDAwMDA4CiAjZGVmaW5lIEUxMDAwX1RYRE1BQ19EUFAgMHgwMDAwMDAwMQogCiAvKiBBZGFwdGl2ZSBJRlMgZGVmaW5lcyAqLwpAQCAtMjQyMSw5ICsyMzIyLDkgQEAKICNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfU1dGTEFHICAgICAgICAgICAgMHgwMDAwMDAyMAogCiAvKiBQQkEgY29uc3RhbnRzICovCi0jZGVmaW5lIEUxMDAwX1BCQV84SyAweDAwMDggICAgLyogOEtCLCBkZWZhdWx0IFJ4IGFsbG9jYXRpb24gKi8KLSNkZWZpbmUgRTEwMDBfUEJBXzEySyAweDAwMEMgICAgLyogMTJLQiwgZGVmYXVsdCBSeCBhbGxvY2F0aW9uICovCi0jZGVmaW5lIEUxMDAwX1BCQV8xNksgMHgwMDEwICAgIC8qIDE2S0IsIGRlZmF1bHQgVFggYWxsb2NhdGlvbiAqLworI2RlZmluZSBFMTAwMF9QQkFfOEsgMHgwMDA4CS8qIDhLQiwgZGVmYXVsdCBSeCBhbGxvY2F0aW9uICovCisjZGVmaW5lIEUxMDAwX1BCQV8xMksgMHgwMDBDCS8qIDEyS0IsIGRlZmF1bHQgUnggYWxsb2NhdGlvbiAqLworI2RlZmluZSBFMTAwMF9QQkFfMTZLIDB4MDAxMAkvKiAxNktCLCBkZWZhdWx0IFRYIGFsbG9jYXRpb24gKi8KICNkZWZpbmUgRTEwMDBfUEJBXzIwSyAweDAwMTQKICNkZWZpbmUgRTEwMDBfUEJBXzIySyAweDAwMTYKICNkZWZpbmUgRTEwMDBfUEJBXzI0SyAweDAwMTgKQEAgLTI0MzIsNyArMjMzMyw3IEBACiAjZGVmaW5lIEUxMDAwX1BCQV8zNEsgMHgwMDIyCiAjZGVmaW5lIEUxMDAwX1BCQV8zOEsgMHgwMDI2CiAjZGVmaW5lIEUxMDAwX1BCQV80MEsgMHgwMDI4Ci0jZGVmaW5lIEUxMDAwX1BCQV80OEsgMHgwMDMwICAgIC8qIDQ4S0IsIGRlZmF1bHQgUlggYWxsb2NhdGlvbiAqLworI2RlZmluZSBFMTAwMF9QQkFfNDhLIDB4MDAzMAkvKiA0OEtCLCBkZWZhdWx0IFJYIGFsbG9jYXRpb24gKi8KIAogI2RlZmluZSBFMTAwMF9QQlNfMTZLIEUxMDAwX1BCQV8xNksKIApAQCAtMjQ0Miw5ICsyMzQzLDkgQEAKICNkZWZpbmUgRkxPV19DT05UUk9MX1RZUEUgICAgICAgICAweDg4MDgKIAogLyogVGhlIGhpc3RvcmljYWwgZGVmYXVsdHMgZm9yIHRoZSBmbG93IGNvbnRyb2wgdmFsdWVzIGFyZSBnaXZlbiBiZWxvdy4gKi8KLSNkZWZpbmUgRkNfREVGQVVMVF9ISV9USFJFU0ggICAgICAgICgweDgwMDApICAgIC8qIDMyS0IgKi8KLSNkZWZpbmUgRkNfREVGQVVMVF9MT19USFJFU0ggICAgICAgICgweDQwMDApICAgIC8qIDE2S0IgKi8KLSNkZWZpbmUgRkNfREVGQVVMVF9UWF9USU1FUiAgICAgICAgICgweDEwMCkgICAgIC8qIH4xMzAgdXMgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9ISV9USFJFU0ggICAgICAgICgweDgwMDApCS8qIDMyS0IgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9MT19USFJFU0ggICAgICAgICgweDQwMDApCS8qIDE2S0IgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9UWF9USU1FUiAgICAgICAgICgweDEwMCkJLyogfjEzMCB1cyAqLwogCiAvKiBQQ0lYIENvbmZpZyBzcGFjZSAqLwogI2RlZmluZSBQQ0lYX0NPTU1BTkRfUkVHSVNURVIgICAgMHhFNgpAQCAtMjQ1OCw3ICsyMzU5LDYgQEAKICNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfNEsgICAgICAweDMKICNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfMksgICAgICAweDIKIAotCiAvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCByaWdodCB0aGUgInBhdXNlIiBiaXRzIGZyb20gdGhlCiAgKiBFRVBST00gKGJpdHMgMTM6MTIpIHRvIHRoZSAicGF1c2UiIChiaXRzIDg6NykgZmllbGQgaW4gdGhlIFRYQ1cgcmVnaXN0ZXIuCiAgKi8KQEAgLTI0NzksMTQgKzIzNzksMTEgQEAKICAqLwogI2RlZmluZSBJTE9TX1NISUZUICAzCiAKLQogI2RlZmluZSBSRUNFSVZFX0JVRkZFUl9BTElHTl9TSVpFICAoMjU2KQogCiAvKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdlIHdhaXQgZm9yIGF1dG8tbmVnb3RpYXRpb24gdG8gY29tcGxldGUgKi8KICNkZWZpbmUgTElOS19VUF9USU1FT1VUICAgICAgICAgICAgIDUwMAogCi0vKiBOdW1iZXIgb2YgMTAwIG1pY3Jvc2Vjb25kcyB3ZSB3YWl0IGZvciBQQ0kgRXhwcmVzcyBtYXN0ZXIgZGlzYWJsZSAqLwotI2RlZmluZSBNQVNURVJfRElTQUJMRV9USU1FT1VUICAgICAgODAwCiAvKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHdlIHdhaXQgZm9yIEVlcHJvbSBhdXRvIHJlYWQgYml0IGRvbmUgYWZ0ZXIgTUFDIHJlc2V0ICovCiAjZGVmaW5lIEFVVE9fUkVBRF9ET05FX1RJTUVPVVQgICAgICAxMAogLyogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3ZSB3YWl0IGZvciBQSFkgY29uZmlndXJhdGlvbiBkb25lIGFmdGVyIE1BQyByZXNldCAqLwpAQCAtMjUzNCw3ICsyNDMxLDYgQEAKICAgICAgICAgICAoKChsZW5ndGgpID4gKGFkYXB0ZXIpLT5taW5fZnJhbWVfc2l6ZSkgJiYgXAogICAgICAgICAgICAoKGxlbmd0aCkgPD0gKChhZGFwdGVyKS0+bWF4X2ZyYW1lX3NpemUgKyBWTEFOX1RBR19TSVpFICsgMSkpKSkpCiAKLQogLyogU3RydWN0dXJlcywgZW51bXMsIGFuZCBtYWNyb3MgZm9yIHRoZSBQSFkgKi8KIAogLyogQml0IGRlZmluaXRpb25zIGZvciB0aGUgTWFuYWdlbWVudCBEYXRhIElPIChNRElPKSBhbmQgTWFuYWdlbWVudCBEYXRhCkBAIC0yNTUxLDQ5ICsyNDQ3LDQ5IEBACiAKIC8qIFBIWSAxMDAwIE1JSSBSZWdpc3Rlci9CaXQgRGVmaW5pdGlvbnMgKi8KIC8qIFBIWSBSZWdpc3RlcnMgZGVmaW5lZCBieSBJRUVFICovCi0jZGVmaW5lIFBIWV9DVFJMICAgICAgICAgMHgwMCAvKiBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBIWV9TVEFUVVMgICAgICAgMHgwMSAvKiBTdGF0dXMgUmVnaXNlciAqLwotI2RlZmluZSBQSFlfSUQxICAgICAgICAgIDB4MDIgLyogUGh5IElkIFJlZyAod29yZCAxKSAqLwotI2RlZmluZSBQSFlfSUQyICAgICAgICAgIDB4MDMgLyogUGh5IElkIFJlZyAod29yZCAyKSAqLwotI2RlZmluZSBQSFlfQVVUT05FR19BRFYgIDB4MDQgLyogQXV0b25lZyBBZHZlcnRpc2VtZW50ICovCi0jZGVmaW5lIFBIWV9MUF9BQklMSVRZICAgMHgwNSAvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAoQmFzZSBQYWdlKSAqLwotI2RlZmluZSBQSFlfQVVUT05FR19FWFAgIDB4MDYgLyogQXV0b25lZyBFeHBhbnNpb24gUmVnICovCi0jZGVmaW5lIFBIWV9ORVhUX1BBR0VfVFggMHgwNyAvKiBOZXh0IFBhZ2UgVFggKi8KLSNkZWZpbmUgUEhZX0xQX05FWFRfUEFHRSAweDA4IC8qIExpbmsgUGFydG5lciBOZXh0IFBhZ2UgKi8KLSNkZWZpbmUgUEhZXzEwMDBUX0NUUkwgICAweDA5IC8qIDEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKi8KLSNkZWZpbmUgUEhZXzEwMDBUX1NUQVRVUyAweDBBIC8qIDEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqLwotI2RlZmluZSBQSFlfRVhUX1NUQVRVUyAgIDB4MEYgLyogRXh0ZW5kZWQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfQ1RSTCAgICAgICAgIDB4MDAJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfU1RBVFVTICAgICAgIDB4MDEJLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9JRDEgICAgICAgICAgMHgwMgkvKiBQaHkgSWQgUmVnICh3b3JkIDEpICovCisjZGVmaW5lIFBIWV9JRDIgICAgICAgICAgMHgwMwkvKiBQaHkgSWQgUmVnICh3b3JkIDIpICovCisjZGVmaW5lIFBIWV9BVVRPTkVHX0FEViAgMHgwNAkvKiBBdXRvbmVnIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgUEhZX0xQX0FCSUxJVFkgICAweDA1CS8qIExpbmsgUGFydG5lciBBYmlsaXR5IChCYXNlIFBhZ2UpICovCisjZGVmaW5lIFBIWV9BVVRPTkVHX0VYUCAgMHgwNgkvKiBBdXRvbmVnIEV4cGFuc2lvbiBSZWcgKi8KKyNkZWZpbmUgUEhZX05FWFRfUEFHRV9UWCAweDA3CS8qIE5leHQgUGFnZSBUWCAqLworI2RlZmluZSBQSFlfTFBfTkVYVF9QQUdFIDB4MDgJLyogTGluayBQYXJ0bmVyIE5leHQgUGFnZSAqLworI2RlZmluZSBQSFlfMTAwMFRfQ1RSTCAgIDB4MDkJLyogMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqLworI2RlZmluZSBQSFlfMTAwMFRfU1RBVFVTIDB4MEEJLyogMTAwMEJhc2UtVCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9FWFRfU1RBVFVTICAgMHgwRgkvKiBFeHRlbmRlZCBTdGF0dXMgUmVnICovCiAKLSNkZWZpbmUgTUFYX1BIWV9SRUdfQUREUkVTUyAgICAgICAgMHgxRiAgLyogNSBiaXQgYWRkcmVzcyBidXMgKDAtMHgxRikgKi8KLSNkZWZpbmUgTUFYX1BIWV9NVUxUSV9QQUdFX1JFRyAgICAgMHhGICAgLyogUmVnaXN0ZXJzIGVxdWFsIG9uIGFsbCBwYWdlcyAqLworI2RlZmluZSBNQVhfUEhZX1JFR19BRERSRVNTICAgICAgICAweDFGCS8qIDUgYml0IGFkZHJlc3MgYnVzICgwLTB4MUYpICovCisjZGVmaW5lIE1BWF9QSFlfTVVMVElfUEFHRV9SRUcgICAgIDB4RgkvKiBSZWdpc3RlcnMgZXF1YWwgb24gYWxsIHBhZ2VzICovCiAKIC8qIE04OEUxMDAwIFNwZWNpZmljIFJlZ2lzdGVycyAqLwotI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19DVFJMICAgICAweDEwICAvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMgICAweDExICAvKiBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIE04OEUxMDAwX0lOVF9FTkFCTEUgICAgICAgIDB4MTIgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTTg4RTEwMDBfSU5UX1NUQVRVUyAgICAgICAgMHgxMyAgLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCAweDE0ICAvKiBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCAqLwotI2RlZmluZSBNODhFMTAwMF9SWF9FUlJfQ05UUiAgICAgICAweDE1ICAvKiBSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCAgICAgMHgxMAkvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMgICAweDExCS8qIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfSU5UX0VOQUJMRSAgICAgICAgMHgxMgkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0lOVF9TVEFUVVMgICAgICAgIDB4MTMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCAweDE0CS8qIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sICovCisjZGVmaW5lIE04OEUxMDAwX1JYX0VSUl9DTlRSICAgICAgIDB4MTUJLyogUmVjZWl2ZSBFcnJvciBDb3VudGVyICovCiAKLSNkZWZpbmUgTTg4RTEwMDBfUEhZX0VYVF9DVFJMICAgICAgMHgxQSAgLyogUEhZIGV4dGVuZCBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCAgIDB4MUQgIC8qIFJlZyAyOSBmb3IgcGFnZSBudW1iZXIgc2V0dGluZyAqLwotI2RlZmluZSBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wgICAweDFFICAvKiBJdHMgbWVhbmluZyBkZXBlbmRzIG9uIHJlZyAyOSAqLwotI2RlZmluZSBNODhFMTAwMF9QSFlfVkNPX1JFR19CSVQ4ICAweDEwMCAvKiBCaXRzIDggJiAxMSBhcmUgYWRqdXN0ZWQgZm9yICovCi0jZGVmaW5lIE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDExIDB4ODAwICAgIC8qIGltcHJvdmVkIEJFUiBwZXJmb3JtYW5jZSAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfRVhUX0NUUkwgICAgICAweDFBCS8qIFBIWSBleHRlbmQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QgICAweDFECS8qIFJlZyAyOSBmb3IgcGFnZSBudW1iZXIgc2V0dGluZyAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wgICAweDFFCS8qIEl0cyBtZWFuaW5nIGRlcGVuZHMgb24gcmVnIDI5ICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDggIDB4MTAwCS8qIEJpdHMgOCAmIDExIGFyZSBhZGp1c3RlZCBmb3IgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUMTEgMHg4MDAJLyogaW1wcm92ZWQgQkVSIHBlcmZvcm1hbmNlICovCiAKICNkZWZpbmUgSUdQMDFFMTAwMF9JRUVFX1JFR1NfUEFHRSAgMHgwMDAwCiAjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9SRVNUQVJUX0FVVE9ORUcgMHgzMzAwCiAjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBICAgICAgMHgwMTQwCiAKIC8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUmVnaXN0ZXJzICovCi0jZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHIDB4MTAgLyogUEhZIFNwZWNpZmljIFBvcnQgQ29uZmlnIFJlZ2lzdGVyICovCi0jZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTIDB4MTEgLyogUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwgICAweDEyIC8qIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIElHUDAxRTEwMDBfUEhZX0xJTktfSEVBTFRIIDB4MTMgLyogUEhZIExpbmsgSGVhbHRoIFJlZ2lzdGVyICovCi0jZGVmaW5lIElHUDAxRTEwMDBfR01JSV9GSUZPICAgICAgIDB4MTQgLyogR01JSSBGSUZPIFJlZ2lzdGVyICovCi0jZGVmaW5lIElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfUVVBTElUWSAweDE1IC8qIFBIWSBDaGFubmVsIFF1YWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcgMHgxMAkvKiBQSFkgU3BlY2lmaWMgUG9ydCBDb25maWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMgMHgxMQkvKiBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCAgIDB4MTIJLyogUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfTElOS19IRUFMVEggMHgxMwkvKiBQSFkgTGluayBIZWFsdGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9HTUlJX0ZJRk8gICAgICAgMHgxNAkvKiBHTUlJIEZJRk8gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9RVUFMSVRZIDB4MTUJLyogUEhZIENoYW5uZWwgUXVhbGl0eSBSZWdpc3RlciAqLwogI2RlZmluZSBJR1AwMkUxMDAwX1BIWV9QT1dFUl9NR01UICAgICAgMHgxOQotI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCAgICAgMHgxRiAvKiBQSFkgUGFnZSBTZWxlY3QgQ29yZSBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCAgICAgMHgxRgkvKiBQSFkgUGFnZSBTZWxlY3QgQ29yZSBSZWdpc3RlciAqLwogCiAvKiBJR1AwMUUxMDAwIEFHQyBSZWdpc3RlcnMgLSBzdG9yZXMgdGhlIGNhYmxlIGxlbmd0aCB2YWx1ZXMqLwogI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfQSAgICAgICAgMHgxMTcyCkBAIC0yNjM2LDE5MiArMjUzMiwxMTkgQEAKIAogI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19SRUdTX1BBR0UgIDB4MjBDMAogCi0vKiBCaXRzLi4uCi0gKiAxNS01OiBwYWdlCi0gKiA0LTA6IHJlZ2lzdGVyIG9mZnNldAotICovCi0jZGVmaW5lIEdHODI1NjNfUEFHRV9TSElGVCAgICAgICAgNQotI2RlZmluZSBHRzgyNTYzX1JFRyhwYWdlLCByZWcpICAgIFwKLSAgICAgICAgKCgocGFnZSkgPDwgR0c4MjU2M19QQUdFX1NISUZUKSB8ICgocmVnKSAmIE1BWF9QSFlfUkVHX0FERFJFU1MpKQotI2RlZmluZSBHRzgyNTYzX01JTl9BTFRfUkVHICAgICAgIDMwCi0KLS8qIEdHODI1NjMgU3BlY2lmaWMgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEdHODI1NjNfUEhZX1NQRUNfQ1RSTCAgICAgICAgICAgXAotICAgICAgICBHRzgyNTYzX1JFRygwLCAxNikgLyogUEhZIFNwZWNpZmljIENvbnRyb2wgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfU1BFQ19TVEFUVVMgICAgICAgICBcCi0gICAgICAgIEdHODI1NjNfUkVHKDAsIDE3KSAvKiBQSFkgU3BlY2lmaWMgU3RhdHVzICovCi0jZGVmaW5lIEdHODI1NjNfUEhZX0lOVF9FTkFCTEUgICAgICAgICAgXAotICAgICAgICBHRzgyNTYzX1JFRygwLCAxOCkgLyogSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9TUEVDX1NUQVRVU18yICAgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMCwgMTkpIC8qIFBIWSBTcGVjaWZpYyBTdGF0dXMgMiAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9SWF9FUlJfQ05UUiAgICAgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMCwgMjEpIC8qIFJlY2VpdmUgRXJyb3IgQ291bnRlciAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9QQUdFX1NFTEVDVCAgICAgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMCwgMjIpIC8qIFBhZ2UgU2VsZWN0ICovCi0jZGVmaW5lIEdHODI1NjNfUEhZX1NQRUNfQ1RSTF8yICAgICAgICAgXAotICAgICAgICBHRzgyNTYzX1JFRygwLCAyNikgLyogUEhZIFNwZWNpZmljIENvbnRyb2wgMiAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9QQUdFX1NFTEVDVF9BTFQgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMCwgMjkpIC8qIEFsdGVybmF0ZSBQYWdlIFNlbGVjdCAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9URVNUX0NMS19DVFJMICAgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMCwgMzApIC8qIFRlc3QgQ2xvY2sgQ29udHJvbCAodXNlIHJlZy4gMjkgdG8gc2VsZWN0KSAqLwotCi0jZGVmaW5lIEdHODI1NjNfUEhZX01BQ19TUEVDX0NUUkwgICAgICAgXAotICAgICAgICBHRzgyNTYzX1JFRygyLCAyMSkgLyogTUFDIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfTUFDX1NQRUNfQ1RSTF8yICAgICBcCi0gICAgICAgIEdHODI1NjNfUkVHKDIsIDI2KSAvKiBNQUMgU3BlY2lmaWMgQ29udHJvbCAyICovCi0KLSNkZWZpbmUgR0c4MjU2M19QSFlfRFNQX0RJU1RBTkNFICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoNSwgMjYpIC8qIERTUCBEaXN0YW5jZSAqLwotCi0vKiBQYWdlIDE5MyAtIFBvcnQgQ29udHJvbCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfS01STl9NT0RFX0NUUkwgICBcCi0gICAgICAgIEdHODI1NjNfUkVHKDE5MywgMTYpIC8qIEt1bWVyYW4gTW9kZSBDb250cm9sICovCi0jZGVmaW5lIEdHODI1NjNfUEhZX1BPUlRfUkVTRVQgICAgICAgICAgXAotICAgICAgICBHRzgyNTYzX1JFRygxOTMsIDE3KSAvKiBQb3J0IFJlc2V0ICovCi0jZGVmaW5lIEdHODI1NjNfUEhZX1JFVklTSU9OX0lEICAgICAgICAgXAotICAgICAgICBHRzgyNTYzX1JFRygxOTMsIDE4KSAvKiBSZXZpc2lvbiBJRCAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9ERVZJQ0VfSUQgICAgICAgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMTkzLCAxOSkgLyogRGV2aWNlIElEICovCi0jZGVmaW5lIEdHODI1NjNfUEhZX1BXUl9NR01UX0NUUkwgICAgICAgXAotICAgICAgICBHRzgyNTYzX1JFRygxOTMsIDIwKSAvKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfUkFURV9BREFQVF9DVFJMICAgICBcCi0gICAgICAgIEdHODI1NjNfUkVHKDE5MywgMjUpIC8qIFJhdGUgQWRhcHRhdGlvbiBDb250cm9sICovCi0KLS8qIFBhZ2UgMTk0IC0gS01STiBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfS01STl9GSUZPX0NUUkxfU1RBVCBcCi0gICAgICAgIEdHODI1NjNfUkVHKDE5NCwgMTYpIC8qIEZJRk8ncyBDb250cm9sL1N0YXR1cyAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9LTVJOX0NUUkwgICAgICAgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMTk0LCAxNykgLyogQ29udHJvbCAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9JTkJBTkRfQ1RSTCAgICAgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMTk0LCAxOCkgLyogSW5iYW5kIENvbnRyb2wgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfS01STl9ESUFHTk9TVElDICAgICBcCi0gICAgICAgIEdHODI1NjNfUkVHKDE5NCwgMTkpIC8qIERpYWdub3N0aWMgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfQUNLX1RJTUVPVVRTICAgICAgICBcCi0gICAgICAgIEdHODI1NjNfUkVHKDE5NCwgMjApIC8qIEFja25vd2xlZGdlIFRpbWVvdXRzICovCi0jZGVmaW5lIEdHODI1NjNfUEhZX0FEVl9BQklMSVRZICAgICAgICAgXAotICAgICAgICBHRzgyNTYzX1JFRygxOTQsIDIxKSAvKiBBZHZlcnRpc2VkIEFiaWxpdHkgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfTElOS19QQVJUTkVSX0FEVl9BQklMSVRZIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMTk0LCAyMykgLyogTGluayBQYXJ0bmVyIEFkdmVydGlzZWQgQWJpbGl0eSAqLwotI2RlZmluZSBHRzgyNTYzX1BIWV9BRFZfTkVYVF9QQUdFICAgICAgIFwKLSAgICAgICAgR0c4MjU2M19SRUcoMTk0LCAyNCkgLyogQWR2ZXJ0aXNlZCBOZXh0IFBhZ2UgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfTElOS19QQVJUTkVSX0FEVl9ORVhUX1BBR0UgXAotICAgICAgICBHRzgyNTYzX1JFRygxOTQsIDI1KSAvKiBMaW5rIFBhcnRuZXIgQWR2ZXJ0aXNlZCBOZXh0IHBhZ2UgKi8KLSNkZWZpbmUgR0c4MjU2M19QSFlfS01STl9NSVNDICAgICAgICAgICBcCi0gICAgICAgIEdHODI1NjNfUkVHKDE5NCwgMjYpIC8qIE1pc2MuICovCi0KIC8qIFBIWSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1JSV9DUl9TUEVFRF9TRUxFQ1RfTVNCIDB4MDA0MCAgLyogYml0cyA2LDEzOiAxMD0xMDAwLCAwMT0xMDAsIDAwPTEwICovCi0jZGVmaW5lIE1JSV9DUl9DT0xMX1RFU1RfRU5BQkxFIDB4MDA4MCAgLyogQ29sbGlzaW9uIHRlc3QgZW5hYmxlICovCi0jZGVmaW5lIE1JSV9DUl9GVUxMX0RVUExFWCAgICAgIDB4MDEwMCAgLyogRkRYID0xLCBoYWxmIGR1cGxleCA9MCAqLwotI2RlZmluZSBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyAweDAyMDAgIC8qIFJlc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAqLwotI2RlZmluZSBNSUlfQ1JfSVNPTEFURSAgICAgICAgICAweDA0MDAgIC8qIElzb2xhdGUgUEhZIGZyb20gTUlJICovCi0jZGVmaW5lIE1JSV9DUl9QT1dFUl9ET1dOICAgICAgIDB4MDgwMCAgLyogUG93ZXIgZG93biAqLwotI2RlZmluZSBNSUlfQ1JfQVVUT19ORUdfRU4gICAgICAweDEwMDAgIC8qIEF1dG8gTmVnIEVuYWJsZSAqLwotI2RlZmluZSBNSUlfQ1JfU1BFRURfU0VMRUNUX0xTQiAweDIwMDAgIC8qIGJpdHMgNiwxMzogMTA9MTAwMCwgMDE9MTAwLCAwMD0xMCAqLwotI2RlZmluZSBNSUlfQ1JfTE9PUEJBQ0sgICAgICAgICAweDQwMDAgIC8qIDAgPSBub3JtYWwsIDEgPSBsb29wYmFjayAqLwotI2RlZmluZSBNSUlfQ1JfUkVTRVQgICAgICAgICAgICAweDgwMDAgIC8qIDAgPSBub3JtYWwsIDEgPSBQSFkgcmVzZXQgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX1NFTEVDVF9NU0IgMHgwMDQwCS8qIGJpdHMgNiwxMzogMTA9MTAwMCwgMDE9MTAwLCAwMD0xMCAqLworI2RlZmluZSBNSUlfQ1JfQ09MTF9URVNUX0VOQUJMRSAweDAwODAJLyogQ29sbGlzaW9uIHRlc3QgZW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9GVUxMX0RVUExFWCAgICAgIDB4MDEwMAkvKiBGRFggPTEsIGhhbGYgZHVwbGV4ID0wICovCisjZGVmaW5lIE1JSV9DUl9SRVNUQVJUX0FVVE9fTkVHIDB4MDIwMAkvKiBSZXN0YXJ0IGF1dG8gbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgTUlJX0NSX0lTT0xBVEUgICAgICAgICAgMHgwNDAwCS8qIElzb2xhdGUgUEhZIGZyb20gTUlJICovCisjZGVmaW5lIE1JSV9DUl9QT1dFUl9ET1dOICAgICAgIDB4MDgwMAkvKiBQb3dlciBkb3duICovCisjZGVmaW5lIE1JSV9DUl9BVVRPX05FR19FTiAgICAgIDB4MTAwMAkvKiBBdXRvIE5lZyBFbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX1NFTEVDVF9MU0IgMHgyMDAwCS8qIGJpdHMgNiwxMzogMTA9MTAwMCwgMDE9MTAwLCAwMD0xMCAqLworI2RlZmluZSBNSUlfQ1JfTE9PUEJBQ0sgICAgICAgICAweDQwMDAJLyogMCA9IG5vcm1hbCwgMSA9IGxvb3BiYWNrICovCisjZGVmaW5lIE1JSV9DUl9SRVNFVCAgICAgICAgICAgIDB4ODAwMAkvKiAwID0gbm9ybWFsLCAxID0gUEhZIHJlc2V0ICovCiAKIC8qIFBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX0NBUFMgICAgIDB4MDAwMSAvKiBFeHRlbmRlZCByZWdpc3RlciBjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgTUlJX1NSX0pBQkJFUl9ERVRFQ1QgICAgIDB4MDAwMiAvKiBKYWJiZXIgRGV0ZWN0ZWQgKi8KLSNkZWZpbmUgTUlJX1NSX0xJTktfU1RBVFVTICAgICAgIDB4MDAwNCAvKiBMaW5rIFN0YXR1cyAxID0gbGluayAqLwotI2RlZmluZSBNSUlfU1JfQVVUT05FR19DQVBTICAgICAgMHgwMDA4IC8qIEF1dG8gTmVnIENhcGFibGUgKi8KLSNkZWZpbmUgTUlJX1NSX1JFTU9URV9GQVVMVCAgICAgIDB4MDAxMCAvKiBSZW1vdGUgRmF1bHQgRGV0ZWN0ICovCi0jZGVmaW5lIE1JSV9TUl9BVVRPTkVHX0NPTVBMRVRFICAweDAwMjAgLyogQXV0byBOZWcgQ29tcGxldGUgKi8KLSNkZWZpbmUgTUlJX1NSX1BSRUFNQkxFX1NVUFBSRVNTIDB4MDA0MCAvKiBQcmVhbWJsZSBtYXkgYmUgc3VwcHJlc3NlZCAqLwotI2RlZmluZSBNSUlfU1JfRVhURU5ERURfU1RBVFVTICAgMHgwMTAwIC8qIEV4dC4gc3RhdHVzIGluZm8gaW4gUmVnIDB4MEYgKi8KLSNkZWZpbmUgTUlJX1NSXzEwMFQyX0hEX0NBUFMgICAgIDB4MDIwMCAvKiAxMDBUMiBIYWxmIER1cGxleCBDYXBhYmxlICovCi0jZGVmaW5lIE1JSV9TUl8xMDBUMl9GRF9DQVBTICAgICAweDA0MDAgLyogMTAwVDIgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLwotI2RlZmluZSBNSUlfU1JfMTBUX0hEX0NBUFMgICAgICAgMHgwODAwIC8qIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KLSNkZWZpbmUgTUlJX1NSXzEwVF9GRF9DQVBTICAgICAgIDB4MTAwMCAvKiAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCi0jZGVmaW5lIE1JSV9TUl8xMDBYX0hEX0NBUFMgICAgICAweDIwMDAgLyogMTAwWCAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLwotI2RlZmluZSBNSUlfU1JfMTAwWF9GRF9DQVBTICAgICAgMHg0MDAwIC8qIDEwMFggIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KLSNkZWZpbmUgTUlJX1NSXzEwMFQ0X0NBUFMgICAgICAgIDB4ODAwMCAvKiAxMDBUNCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9FWFRFTkRFRF9DQVBTICAgICAweDAwMDEJLyogRXh0ZW5kZWQgcmVnaXN0ZXIgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIE1JSV9TUl9KQUJCRVJfREVURUNUICAgICAweDAwMDIJLyogSmFiYmVyIERldGVjdGVkICovCisjZGVmaW5lIE1JSV9TUl9MSU5LX1NUQVRVUyAgICAgICAweDAwMDQJLyogTGluayBTdGF0dXMgMSA9IGxpbmsgKi8KKyNkZWZpbmUgTUlJX1NSX0FVVE9ORUdfQ0FQUyAgICAgIDB4MDAwOAkvKiBBdXRvIE5lZyBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9SRU1PVEVfRkFVTFQgICAgICAweDAwMTAJLyogUmVtb3RlIEZhdWx0IERldGVjdCAqLworI2RlZmluZSBNSUlfU1JfQVVUT05FR19DT01QTEVURSAgMHgwMDIwCS8qIEF1dG8gTmVnIENvbXBsZXRlICovCisjZGVmaW5lIE1JSV9TUl9QUkVBTUJMRV9TVVBQUkVTUyAweDAwNDAJLyogUHJlYW1ibGUgbWF5IGJlIHN1cHByZXNzZWQgKi8KKyNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX1NUQVRVUyAgIDB4MDEwMAkvKiBFeHQuIHN0YXR1cyBpbmZvIGluIFJlZyAweDBGICovCisjZGVmaW5lIE1JSV9TUl8xMDBUMl9IRF9DQVBTICAgICAweDAyMDAJLyogMTAwVDIgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwVDJfRkRfQ0FQUyAgICAgMHgwNDAwCS8qIDEwMFQyIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwVF9IRF9DQVBTICAgICAgIDB4MDgwMAkvKiAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMFRfRkRfQ0FQUyAgICAgICAweDEwMDAJLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwWF9IRF9DQVBTICAgICAgMHgyMDAwCS8qIDEwMFggIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFhfRkRfQ0FQUyAgICAgIDB4NDAwMAkvKiAxMDBYICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBUNF9DQVBTICAgICAgICAweDgwMDAJLyogMTAwVDQgQ2FwYWJsZSAqLwogCiAvKiBBdXRvbmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTldBWV9BUl9TRUxFQ1RPUl9GSUVMRCAweDAwMDEgICAvKiBpbmRpY2F0ZXMgSUVFRSA4MDIuMyBDU01BL0NEICovCi0jZGVmaW5lIE5XQVlfQVJfMTBUX0hEX0NBUFMgICAgMHgwMDIwICAgLyogMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLwotI2RlZmluZSBOV0FZX0FSXzEwVF9GRF9DQVBTICAgIDB4MDA0MCAgIC8qIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KLSNkZWZpbmUgTldBWV9BUl8xMDBUWF9IRF9DQVBTICAweDAwODAgICAvKiAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCi0jZGVmaW5lIE5XQVlfQVJfMTAwVFhfRkRfQ0FQUyAgMHgwMTAwICAgLyogMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLwotI2RlZmluZSBOV0FZX0FSXzEwMFQ0X0NBUFMgICAgIDB4MDIwMCAgIC8qIDEwMFQ0IENhcGFibGUgKi8KLSNkZWZpbmUgTldBWV9BUl9QQVVTRSAgICAgICAgICAweDA0MDAgICAvKiBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLwotI2RlZmluZSBOV0FZX0FSX0FTTV9ESVIgICAgICAgIDB4MDgwMCAgIC8qIEFzeW1tZXRyaWMgUGF1c2UgRGlyZWN0aW9uIGJpdCAqLwotI2RlZmluZSBOV0FZX0FSX1JFTU9URV9GQVVMVCAgIDB4MjAwMCAgIC8qIFJlbW90ZSBGYXVsdCBkZXRlY3RlZCAqLwotI2RlZmluZSBOV0FZX0FSX05FWFRfUEFHRSAgICAgIDB4ODAwMCAgIC8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLworI2RlZmluZSBOV0FZX0FSX1NFTEVDVE9SX0ZJRUxEIDB4MDAwMQkvKiBpbmRpY2F0ZXMgSUVFRSA4MDIuMyBDU01BL0NEICovCisjZGVmaW5lIE5XQVlfQVJfMTBUX0hEX0NBUFMgICAgMHgwMDIwCS8qIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl8xMFRfRkRfQ0FQUyAgICAweDAwNDAJLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSXzEwMFRYX0hEX0NBUFMgIDB4MDA4MAkvKiAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfMTAwVFhfRkRfQ0FQUyAgMHgwMTAwCS8qIDEwMFRYIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl8xMDBUNF9DQVBTICAgICAweDAyMDAJLyogMTAwVDQgQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSX1BBVVNFICAgICAgICAgIDB4MDQwMAkvKiBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLworI2RlZmluZSBOV0FZX0FSX0FTTV9ESVIgICAgICAgIDB4MDgwMAkvKiBBc3ltbWV0cmljIFBhdXNlIERpcmVjdGlvbiBiaXQgKi8KKyNkZWZpbmUgTldBWV9BUl9SRU1PVEVfRkFVTFQgICAweDIwMDAJLyogUmVtb3RlIEZhdWx0IGRldGVjdGVkICovCisjZGVmaW5lIE5XQVlfQVJfTkVYVF9QQUdFICAgICAgMHg4MDAwCS8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLwogCiAvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWdpc3RlciAoQmFzZSBQYWdlKSAqLwotI2RlZmluZSBOV0FZX0xQQVJfU0VMRUNUT1JfRklFTEQgMHgwMDAwIC8qIExQIHByb3RvY29sIHNlbGVjdG9yIGZpZWxkICovCi0jZGVmaW5lIE5XQVlfTFBBUl8xMFRfSERfQ0FQUyAgICAweDAwMjAgLyogTFAgaXMgMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLwotI2RlZmluZSBOV0FZX0xQQVJfMTBUX0ZEX0NBUFMgICAgMHgwMDQwIC8qIExQIGlzIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KLSNkZWZpbmUgTldBWV9MUEFSXzEwMFRYX0hEX0NBUFMgIDB4MDA4MCAvKiBMUCBpcyAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCi0jZGVmaW5lIE5XQVlfTFBBUl8xMDBUWF9GRF9DQVBTICAweDAxMDAgLyogTFAgaXMgMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLwotI2RlZmluZSBOV0FZX0xQQVJfMTAwVDRfQ0FQUyAgICAgMHgwMjAwIC8qIExQIGlzIDEwMFQ0IENhcGFibGUgKi8KLSNkZWZpbmUgTldBWV9MUEFSX1BBVVNFICAgICAgICAgIDB4MDQwMCAvKiBMUCBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLwotI2RlZmluZSBOV0FZX0xQQVJfQVNNX0RJUiAgICAgICAgMHgwODAwIC8qIExQIEFzeW1tZXRyaWMgUGF1c2UgRGlyZWN0aW9uIGJpdCAqLwotI2RlZmluZSBOV0FZX0xQQVJfUkVNT1RFX0ZBVUxUICAgMHgyMDAwIC8qIExQIGhhcyBkZXRlY3RlZCBSZW1vdGUgRmF1bHQgKi8KLSNkZWZpbmUgTldBWV9MUEFSX0FDS05PV0xFREdFICAgIDB4NDAwMCAvKiBMUCBoYXMgcngnZCBsaW5rIGNvZGUgd29yZCAqLwotI2RlZmluZSBOV0FZX0xQQVJfTkVYVF9QQUdFICAgICAgMHg4MDAwIC8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLworI2RlZmluZSBOV0FZX0xQQVJfU0VMRUNUT1JfRklFTEQgMHgwMDAwCS8qIExQIHByb3RvY29sIHNlbGVjdG9yIGZpZWxkICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMFRfSERfQ0FQUyAgICAweDAwMjAJLyogTFAgaXMgMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTBUX0ZEX0NBUFMgICAgMHgwMDQwCS8qIExQIGlzIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwMFRYX0hEX0NBUFMgIDB4MDA4MAkvKiBMUCBpcyAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMDBUWF9GRF9DQVBTICAweDAxMDAJLyogTFAgaXMgMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTAwVDRfQ0FQUyAgICAgMHgwMjAwCS8qIExQIGlzIDEwMFQ0IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSX1BBVVNFICAgICAgICAgIDB4MDQwMAkvKiBMUCBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLworI2RlZmluZSBOV0FZX0xQQVJfQVNNX0RJUiAgICAgICAgMHgwODAwCS8qIExQIEFzeW1tZXRyaWMgUGF1c2UgRGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBOV0FZX0xQQVJfUkVNT1RFX0ZBVUxUICAgMHgyMDAwCS8qIExQIGhhcyBkZXRlY3RlZCBSZW1vdGUgRmF1bHQgKi8KKyNkZWZpbmUgTldBWV9MUEFSX0FDS05PV0xFREdFICAgIDB4NDAwMAkvKiBMUCBoYXMgcngnZCBsaW5rIGNvZGUgd29yZCAqLworI2RlZmluZSBOV0FZX0xQQVJfTkVYVF9QQUdFICAgICAgMHg4MDAwCS8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLwogCiAvKiBBdXRvbmVnIEV4cGFuc2lvbiBSZWdpc3RlciAqLwotI2RlZmluZSBOV0FZX0VSX0xQX05XQVlfQ0FQUyAgICAgIDB4MDAwMSAvKiBMUCBoYXMgQXV0byBOZWcgQ2FwYWJpbGl0eSAqLwotI2RlZmluZSBOV0FZX0VSX1BBR0VfUlhEICAgICAgICAgIDB4MDAwMiAvKiBMUCBpcyAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCi0jZGVmaW5lIE5XQVlfRVJfTkVYVF9QQUdFX0NBUFMgICAgMHgwMDA0IC8qIExQIGlzIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KLSNkZWZpbmUgTldBWV9FUl9MUF9ORVhUX1BBR0VfQ0FQUyAweDAwMDggLyogTFAgaXMgMTAwVFggSGFsZiBEdXBsZXggQ2FwYWJsZSAqLwotI2RlZmluZSBOV0FZX0VSX1BBUl9ERVRFQ1RfRkFVTFQgIDB4MDAxMCAvKiBMUCBpcyAxMDBUWCBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfRVJfTFBfTldBWV9DQVBTICAgICAgMHgwMDAxCS8qIExQIGhhcyBBdXRvIE5lZyBDYXBhYmlsaXR5ICovCisjZGVmaW5lIE5XQVlfRVJfUEFHRV9SWEQgICAgICAgICAgMHgwMDAyCS8qIExQIGlzIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9FUl9ORVhUX1BBR0VfQ0FQUyAgICAweDAwMDQJLyogTFAgaXMgMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0VSX0xQX05FWFRfUEFHRV9DQVBTIDB4MDAwOAkvKiBMUCBpcyAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfRVJfUEFSX0RFVEVDVF9GQVVMVCAgMHgwMDEwCS8qIExQIGlzIDEwMFRYIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KIAogLyogTmV4dCBQYWdlIFRYIFJlZ2lzdGVyICovCi0jZGVmaW5lIE5QVFhfTVNHX0NPREVfRklFTEQgMHgwMDAxIC8qIE5QIG1zZyBjb2RlIG9yIHVuZm9ybWF0dGVkIGRhdGEgKi8KLSNkZWZpbmUgTlBUWF9UT0dHTEUgICAgICAgICAweDA4MDAgLyogVG9nZ2xlcyBiZXR3ZWVuIGV4Y2hhbmdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBkaWZmZXJlbnQgTlAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE5QVFhfQUNLTk9XTERHRTIgICAgMHgxMDAwIC8qIDEgPSB3aWxsIGNvbXBseSB3aXRoIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gY2Fubm90IGNvbXBseSB3aXRoIG1zZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTlBUWF9NU0dfUEFHRSAgICAgICAweDIwMDAgLyogZm9ybWF0dGVkKDEpL3VuZm9ybWF0dGVkKDApIHBnICovCi0jZGVmaW5lIE5QVFhfTkVYVF9QQUdFICAgICAgMHg4MDAwIC8qIDEgPSBhZGRpdGlvbiBOUCB3aWxsIGZvbGxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gc2VuZGluZyBsYXN0IE5QCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOUFRYX01TR19DT0RFX0ZJRUxEIDB4MDAwMQkvKiBOUCBtc2cgY29kZSBvciB1bmZvcm1hdHRlZCBkYXRhICovCisjZGVmaW5lIE5QVFhfVE9HR0xFICAgICAgICAgMHgwODAwCS8qIFRvZ2dsZXMgYmV0d2VlbiBleGNoYW5nZXMKKwkJCQkJICogb2YgZGlmZmVyZW50IE5QCisJCQkJCSAqLworI2RlZmluZSBOUFRYX0FDS05PV0xER0UyICAgIDB4MTAwMAkvKiAxID0gd2lsbCBjb21wbHkgd2l0aCBtc2cKKwkJCQkJICogMCA9IGNhbm5vdCBjb21wbHkgd2l0aCBtc2cKKwkJCQkJICovCisjZGVmaW5lIE5QVFhfTVNHX1BBR0UgICAgICAgMHgyMDAwCS8qIGZvcm1hdHRlZCgxKS91bmZvcm1hdHRlZCgwKSBwZyAqLworI2RlZmluZSBOUFRYX05FWFRfUEFHRSAgICAgIDB4ODAwMAkvKiAxID0gYWRkaXRpb24gTlAgd2lsbCBmb2xsb3cKKwkJCQkJICogMCA9IHNlbmRpbmcgbGFzdCBOUAorCQkJCQkgKi8KIAogLyogTGluayBQYXJ0bmVyIE5leHQgUGFnZSBSZWdpc3RlciAqLwotI2RlZmluZSBMUF9STlBSX01TR19DT0RFX0ZJRUxEIDB4MDAwMSAvKiBOUCBtc2cgY29kZSBvciB1bmZvcm1hdHRlZCBkYXRhICovCi0jZGVmaW5lIExQX1JOUFJfVE9HR0xFICAgICAgICAgMHgwODAwIC8qIFRvZ2dsZXMgYmV0d2VlbiBleGNoYW5nZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgZGlmZmVyZW50IE5QCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMUF9STlBSX0FDS05PV0xER0UyICAgIDB4MTAwMCAvKiAxID0gd2lsbCBjb21wbHkgd2l0aCBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCA9IGNhbm5vdCBjb21wbHkgd2l0aCBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExQX1JOUFJfTVNHX1BBR0UgICAgICAgMHgyMDAwICAvKiBmb3JtYXR0ZWQoMSkvdW5mb3JtYXR0ZWQoMCkgcGcgKi8KLSNkZWZpbmUgTFBfUk5QUl9BQ0tOT1dMREdFICAgICAweDQwMDAgIC8qIDEgPSBBQ0sgLyAwID0gTk8gQUNLICovCi0jZGVmaW5lIExQX1JOUFJfTkVYVF9QQUdFICAgICAgMHg4MDAwICAvKiAxID0gYWRkaXRpb24gTlAgd2lsbCBmb2xsb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgPSBzZW5kaW5nIGxhc3QgTlAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUF9STlBSX01TR19DT0RFX0ZJRUxEIDB4MDAwMQkvKiBOUCBtc2cgY29kZSBvciB1bmZvcm1hdHRlZCBkYXRhICovCisjZGVmaW5lIExQX1JOUFJfVE9HR0xFICAgICAgICAgMHgwODAwCS8qIFRvZ2dsZXMgYmV0d2VlbiBleGNoYW5nZXMKKwkJCQkJICogb2YgZGlmZmVyZW50IE5QCisJCQkJCSAqLworI2RlZmluZSBMUF9STlBSX0FDS05PV0xER0UyICAgIDB4MTAwMAkvKiAxID0gd2lsbCBjb21wbHkgd2l0aCBtc2cKKwkJCQkJICogMCA9IGNhbm5vdCBjb21wbHkgd2l0aCBtc2cKKwkJCQkJICovCisjZGVmaW5lIExQX1JOUFJfTVNHX1BBR0UgICAgICAgMHgyMDAwCS8qIGZvcm1hdHRlZCgxKS91bmZvcm1hdHRlZCgwKSBwZyAqLworI2RlZmluZSBMUF9STlBSX0FDS05PV0xER0UgICAgIDB4NDAwMAkvKiAxID0gQUNLIC8gMCA9IE5PIEFDSyAqLworI2RlZmluZSBMUF9STlBSX05FWFRfUEFHRSAgICAgIDB4ODAwMAkvKiAxID0gYWRkaXRpb24gTlAgd2lsbCBmb2xsb3cKKwkJCQkJICogMCA9IHNlbmRpbmcgbGFzdCBOUAorCQkJCQkgKi8KIAogLyogMTAwMEJBU0UtVCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIENSXzEwMDBUX0FTWU1fUEFVU0UgICAgICAweDAwODAgLyogQWR2ZXJ0aXNlIGFzeW1tZXRyaWMgcGF1c2UgYml0ICovCi0jZGVmaW5lIENSXzEwMDBUX0hEX0NBUFMgICAgICAgICAweDAxMDAgLyogQWR2ZXJ0aXNlIDEwMDBUIEhEIGNhcGFiaWxpdHkgKi8KLSNkZWZpbmUgQ1JfMTAwMFRfRkRfQ0FQUyAgICAgICAgIDB4MDIwMCAvKiBBZHZlcnRpc2UgMTAwMFQgRkQgY2FwYWJpbGl0eSAgKi8KLSNkZWZpbmUgQ1JfMTAwMFRfUkVQRUFURVJfRFRFICAgIDB4MDQwMCAvKiAxPVJlcGVhdGVyL3N3aXRjaCBkZXZpY2UgcG9ydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA9RFRFIGRldmljZSAqLwotI2RlZmluZSBDUl8xMDAwVF9NU19WQUxVRSAgICAgICAgMHgwODAwIC8qIDE9Q29uZmlndXJlIFBIWSBhcyBNYXN0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwPUNvbmZpZ3VyZSBQSFkgYXMgU2xhdmUgKi8KLSNkZWZpbmUgQ1JfMTAwMFRfTVNfRU5BQkxFICAgICAgIDB4MTAwMCAvKiAxPU1hc3Rlci9TbGF2ZSBtYW51YWwgY29uZmlnIHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMD1BdXRvbWF0aWMgTWFzdGVyL1NsYXZlIGNvbmZpZyAqLwotI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfTk9STUFMIDB4MDAwMCAvKiBOb3JtYWwgT3BlcmF0aW9uICovCi0jZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV8xICAgICAweDIwMDAgLyogVHJhbnNtaXQgV2F2ZWZvcm0gdGVzdCAqLwotI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfMiAgICAgMHg0MDAwIC8qIE1hc3RlciBUcmFuc21pdCBKaXR0ZXIgdGVzdCAqLwotI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfMyAgICAgMHg2MDAwIC8qIFNsYXZlIFRyYW5zbWl0IEppdHRlciB0ZXN0ICovCi0jZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV80ICAgICAweDgwMDAgLyogVHJhbnNtaXR0ZXIgRGlzdG9ydGlvbiB0ZXN0ICovCisjZGVmaW5lIENSXzEwMDBUX0FTWU1fUEFVU0UgICAgICAweDAwODAJLyogQWR2ZXJ0aXNlIGFzeW1tZXRyaWMgcGF1c2UgYml0ICovCisjZGVmaW5lIENSXzEwMDBUX0hEX0NBUFMgICAgICAgICAweDAxMDAJLyogQWR2ZXJ0aXNlIDEwMDBUIEhEIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfRkRfQ0FQUyAgICAgICAgIDB4MDIwMAkvKiBBZHZlcnRpc2UgMTAwMFQgRkQgY2FwYWJpbGl0eSAgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfUkVQRUFURVJfRFRFICAgIDB4MDQwMAkvKiAxPVJlcGVhdGVyL3N3aXRjaCBkZXZpY2UgcG9ydCAqLworCQkJCQkvKiAwPURURSBkZXZpY2UgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfTVNfVkFMVUUgICAgICAgIDB4MDgwMAkvKiAxPUNvbmZpZ3VyZSBQSFkgYXMgTWFzdGVyICovCisJCQkJCS8qIDA9Q29uZmlndXJlIFBIWSBhcyBTbGF2ZSAqLworI2RlZmluZSBDUl8xMDAwVF9NU19FTkFCTEUgICAgICAgMHgxMDAwCS8qIDE9TWFzdGVyL1NsYXZlIG1hbnVhbCBjb25maWcgdmFsdWUgKi8KKwkJCQkJLyogMD1BdXRvbWF0aWMgTWFzdGVyL1NsYXZlIGNvbmZpZyAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfTk9STUFMIDB4MDAwMAkvKiBOb3JtYWwgT3BlcmF0aW9uICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV8xICAgICAweDIwMDAJLyogVHJhbnNtaXQgV2F2ZWZvcm0gdGVzdCAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfMiAgICAgMHg0MDAwCS8qIE1hc3RlciBUcmFuc21pdCBKaXR0ZXIgdGVzdCAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfMyAgICAgMHg2MDAwCS8qIFNsYXZlIFRyYW5zbWl0IEppdHRlciB0ZXN0ICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV80ICAgICAweDgwMDAJLyogVHJhbnNtaXR0ZXIgRGlzdG9ydGlvbiB0ZXN0ICovCiAKIC8qIDEwMDBCQVNFLVQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNSXzEwMDBUX0lETEVfRVJST1JfQ05UICAgMHgwMEZGIC8qIE51bSBpZGxlIGVycm9ycyBzaW5jZSBsYXN0IHJlYWQgKi8KLSNkZWZpbmUgU1JfMTAwMFRfQVNZTV9QQVVTRV9ESVIgICAweDAxMDAgLyogTFAgYXN5bW1ldHJpYyBwYXVzZSBkaXJlY3Rpb24gYml0ICovCi0jZGVmaW5lIFNSXzEwMDBUX0xQX0hEX0NBUFMgICAgICAgMHgwNDAwIC8qIExQIGlzIDEwMDBUIEhEIGNhcGFibGUgKi8KLSNkZWZpbmUgU1JfMTAwMFRfTFBfRkRfQ0FQUyAgICAgICAweDA4MDAgLyogTFAgaXMgMTAwMFQgRkQgY2FwYWJsZSAqLwotI2RlZmluZSBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTIDB4MTAwMCAvKiBSZW1vdGUgcmVjZWl2ZXIgT0sgKi8KLSNkZWZpbmUgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTICAweDIwMDAgLyogTG9jYWwgcmVjZWl2ZXIgT0sgKi8KLSNkZWZpbmUgU1JfMTAwMFRfTVNfQ09ORklHX1JFUyAgICAweDQwMDAgLyogMT1Mb2NhbCBUWCBpcyBNYXN0ZXIsIDA9U2xhdmUgKi8KLSNkZWZpbmUgU1JfMTAwMFRfTVNfQ09ORklHX0ZBVUxUICAweDgwMDAgLyogTWFzdGVyL1NsYXZlIGNvbmZpZyBmYXVsdCAqLworI2RlZmluZSBTUl8xMDAwVF9JRExFX0VSUk9SX0NOVCAgIDB4MDBGRgkvKiBOdW0gaWRsZSBlcnJvcnMgc2luY2UgbGFzdCByZWFkICovCisjZGVmaW5lIFNSXzEwMDBUX0FTWU1fUEFVU0VfRElSICAgMHgwMTAwCS8qIExQIGFzeW1tZXRyaWMgcGF1c2UgZGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBTUl8xMDAwVF9MUF9IRF9DQVBTICAgICAgIDB4MDQwMAkvKiBMUCBpcyAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIFNSXzEwMDBUX0xQX0ZEX0NBUFMgICAgICAgMHgwODAwCS8qIExQIGlzIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVUyAweDEwMDAJLyogUmVtb3RlIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUyAgMHgyMDAwCS8qIExvY2FsIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIFNSXzEwMDBUX01TX0NPTkZJR19SRVMgICAgMHg0MDAwCS8qIDE9TG9jYWwgVFggaXMgTWFzdGVyLCAwPVNsYXZlICovCisjZGVmaW5lIFNSXzEwMDBUX01TX0NPTkZJR19GQVVMVCAgMHg4MDAwCS8qIE1hc3Rlci9TbGF2ZSBjb25maWcgZmF1bHQgKi8KICNkZWZpbmUgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVU19TSElGVCAgICAgICAgICAxMgogI2RlZmluZSBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVNfU0hJRlQgICAgICAgICAgIDEzCiAjZGVmaW5lIFNSXzEwMDBUX1BIWV9FWENFU1NJVkVfSURMRV9FUlJfQ09VTlQgICAgNQpAQCAtMjgyOSw2NCArMjY1Miw2NCBAQAogI2RlZmluZSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8xMDAgICAgICAgICAgIDEwMAogCiAvKiBFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUVFRV9FU1JfMTAwMFRfSERfQ0FQUyAweDEwMDAgLyogMTAwMFQgSEQgY2FwYWJsZSAqLwotI2RlZmluZSBJRUVFX0VTUl8xMDAwVF9GRF9DQVBTIDB4MjAwMCAvKiAxMDAwVCBGRCBjYXBhYmxlICovCi0jZGVmaW5lIElFRUVfRVNSXzEwMDBYX0hEX0NBUFMgMHg0MDAwIC8qIDEwMDBYIEhEIGNhcGFibGUgKi8KLSNkZWZpbmUgSUVFRV9FU1JfMTAwMFhfRkRfQ0FQUyAweDgwMDAgLyogMTAwMFggRkQgY2FwYWJsZSAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwVF9IRF9DQVBTIDB4MTAwMAkvKiAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIElFRUVfRVNSXzEwMDBUX0ZEX0NBUFMgMHgyMDAwCS8qIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgSUVFRV9FU1JfMTAwMFhfSERfQ0FQUyAweDQwMDAJLyogMTAwMFggSEQgY2FwYWJsZSAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwWF9GRF9DQVBTIDB4ODAwMAkvKiAxMDAwWCBGRCBjYXBhYmxlICovCiAKLSNkZWZpbmUgUEhZX1RYX1BPTEFSSVRZX01BU0sgICAweDAxMDAgLyogcmVnaXN0ZXIgMTBoIGJpdCA4IChwb2xhcml0eSBiaXQpICovCi0jZGVmaW5lIFBIWV9UWF9OT1JNQUxfUE9MQVJJVFkgMCAgICAgIC8qIHJlZ2lzdGVyIDEwaCBiaXQgOCAobm9ybWFsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQSFlfVFhfUE9MQVJJVFlfTUFTSyAgIDB4MDEwMAkvKiByZWdpc3RlciAxMGggYml0IDggKHBvbGFyaXR5IGJpdCkgKi8KKyNkZWZpbmUgUEhZX1RYX05PUk1BTF9QT0xBUklUWSAwCS8qIHJlZ2lzdGVyIDEwaCBiaXQgOCAobm9ybWFsIHBvbGFyaXR5KSAqLwogCi0jZGVmaW5lIEFVVE9fUE9MQVJJVFlfRElTQUJMRSAgMHgwMDEwIC8qIHJlZ2lzdGVyIDExaCBiaXQgNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoMD1lbmFibGUsIDE9ZGlzYWJsZSkgKi8KKyNkZWZpbmUgQVVUT19QT0xBUklUWV9ESVNBQkxFICAweDAwMTAJLyogcmVnaXN0ZXIgMTFoIGJpdCA0ICovCisJCQkJICAgICAgLyogKDA9ZW5hYmxlLCAxPWRpc2FibGUpICovCiAKIC8qIE04OEUxMDAwIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIE04OEUxMDAwX1BTQ1JfSkFCQkVSX0RJU0FCTEUgICAgMHgwMDAxIC8qIDE9SmFiYmVyIEZ1bmN0aW9uIGRpc2FibGVkICovCi0jZGVmaW5lIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUwgMHgwMDAyIC8qIDE9UG9sYXJpdHkgUmV2ZXJzYWwgZW5hYmxlZCAqLwotI2RlZmluZSBNODhFMTAwMF9QU0NSX1NRRV9URVNUICAgICAgICAgIDB4MDAwNCAvKiAxPVNRRSBUZXN0IGVuYWJsZWQgKi8KLSNkZWZpbmUgTTg4RTEwMDBfUFNDUl9DTEsxMjVfRElTQUJMRSAgICAweDAwMTAgLyogMT1DTEsxMjUgbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwPUNMSzEyNSB0b2dnbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREUgIDB4MDAwMCAgLyogTURJIENyb3Nzb3ZlciBNb2RlIGJpdHMgNjo1ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hbnVhbCBNREkgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBNODhFMTAwMF9QU0NSX01ESVhfTUFOVUFMX01PREUgMHgwMDIwICAvKiBNYW51YWwgTURJWCBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVVUT19YXzEwMDBUICAgICAweDAwNDAgIC8qIDEwMDBCQVNFLVQ6IEF1dG8gY3Jvc3NvdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgMTAwQkFTRS1UWC8xMEJBU0UtVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIE1ESSBNb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFICAgICAgMHgwMDYwICAvKiBBdXRvIGNyb3Nzb3ZlciBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbCBzcGVlZHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0pBQkJFUl9ESVNBQkxFICAgIDB4MDAwMQkvKiAxPUphYmJlciBGdW5jdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMIDB4MDAwMgkvKiAxPVBvbGFyaXR5IFJldmVyc2FsIGVuYWJsZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9TUUVfVEVTVCAgICAgICAgICAweDAwMDQJLyogMT1TUUUgVGVzdCBlbmFibGVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQ0xLMTI1X0RJU0FCTEUgICAgMHgwMDEwCS8qIDE9Q0xLMTI1IGxvdywKKwkJCQkJCSAqIDA9Q0xLMTI1IHRvZ2dsaW5nCisJCQkJCQkgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREUgIDB4MDAwMAkvKiBNREkgQ3Jvc3NvdmVyIE1vZGUgYml0cyA2OjUgKi8KKwkJCQkJICAgICAgIC8qIE1hbnVhbCBNREkgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX01ESVhfTUFOVUFMX01PREUgMHgwMDIwCS8qIE1hbnVhbCBNRElYIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9BVVRPX1hfMTAwMFQgICAgIDB4MDA0MAkvKiAxMDAwQkFTRS1UOiBBdXRvIGNyb3Nzb3ZlciwKKwkJCQkJCSAqICAxMDBCQVNFLVRYLzEwQkFTRS1UOgorCQkJCQkJICogIE1ESSBNb2RlCisJCQkJCQkgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERSAgICAgIDB4MDA2MAkvKiBBdXRvIGNyb3Nzb3ZlciBlbmFibGVkCisJCQkJCQkgKiBhbGwgc3BlZWRzLgorCQkJCQkJICovCiAjZGVmaW5lIE04OEUxMDAwX1BTQ1JfMTBCVF9FWFRfRElTVF9FTkFCTEUgMHgwMDgwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMT1FbmFibGUgRXh0ZW5kZWQgMTBCQVNFLVQgZGlzdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTG93ZXIgMTBCQVNFLVQgUlggVGhyZXNob2xkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDA9Tm9ybWFsIDEwQkFTRS1UIFJYIFRocmVzaG9sZCAqLworCQkJCQkvKiAxPUVuYWJsZSBFeHRlbmRlZCAxMEJBU0UtVCBkaXN0YW5jZQorCQkJCQkgKiAoTG93ZXIgMTBCQVNFLVQgUlggVGhyZXNob2xkKQorCQkJCQkgKiAwPU5vcm1hbCAxMEJBU0UtVCBSWCBUaHJlc2hvbGQgKi8KICNkZWZpbmUgTTg4RTEwMDBfUFNDUl9NSUlfNUJJVF9FTkFCTEUgICAgICAweDAxMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxPTUtQml0IGludGVyZmFjZSBpbiAxMDBCQVNFLVRYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMD1NSUkgaW50ZXJmYWNlIGluIDEwMEJBU0UtVFggKi8KLSNkZWZpbmUgTTg4RTEwMDBfUFNDUl9TQ1JBTUJMRVJfRElTQUJMRSAgICAweDAyMDAgLyogMT1TY3JhbWJsZXIgZGlzYWJsZSAqLwotI2RlZmluZSBNODhFMTAwMF9QU0NSX0ZPUkNFX0xJTktfR09PRCAgICAgIDB4MDQwMCAvKiAxPUZvcmNlIGxpbmsgZ29vZCAqLwotI2RlZmluZSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFggICAgIDB4MDgwMCAvKiAxPUFzc2VydCBDUlMgb24gVHJhbnNtaXQgKi8KKwkJCQkJLyogMT01LUJpdCBpbnRlcmZhY2UgaW4gMTAwQkFTRS1UWAorCQkJCQkgKiAwPU1JSSBpbnRlcmZhY2UgaW4gMTAwQkFTRS1UWCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX1NDUkFNQkxFUl9ESVNBQkxFICAgIDB4MDIwMAkvKiAxPVNjcmFtYmxlciBkaXNhYmxlICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfRk9SQ0VfTElOS19HT09EICAgICAgMHgwNDAwCS8qIDE9Rm9yY2UgbGluayBnb29kICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWCAgICAgMHgwODAwCS8qIDE9QXNzZXJ0IENSUyBvbiBUcmFuc21pdCAqLwogCiAjZGVmaW5lIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUxfU0hJRlQgICAgMQogI2RlZmluZSBNODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFX1NISUZUICAgICAgICAgIDUKICNkZWZpbmUgTTg4RTEwMDBfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRV9TSElGVCA3CiAKIC8qIE04OEUxMDAwIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTTg4RTEwMDBfUFNTUl9KQUJCRVIgICAgICAgICAgICAgMHgwMDAxIC8qIDE9SmFiYmVyICovCi0jZGVmaW5lIE04OEUxMDAwX1BTU1JfUkVWX1BPTEFSSVRZICAgICAgIDB4MDAwMiAvKiAxPVBvbGFyaXR5IHJldmVyc2VkICovCi0jZGVmaW5lIE04OEUxMDAwX1BTU1JfRE9XTlNISUZUICAgICAgICAgIDB4MDAyMCAvKiAxPURvd25zaGlmdGVkICovCi0jZGVmaW5lIE04OEUxMDAwX1BTU1JfTURJWCAgICAgICAgICAgICAgIDB4MDA0MCAvKiAxPU1ESVg7IDA9TURJICovCi0jZGVmaW5lIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIICAgICAgIDB4MDM4MCAvKiAwPTw1ME07MT01MC04ME07Mj04MC0xMTBNOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDM9MTEwLTE0ME07ND0+MTQwTSAqLwotI2RlZmluZSBNODhFMTAwMF9QU1NSX0xJTksgICAgICAgICAgICAgICAweDA0MDAgLyogMT1MaW5rIHVwLCAwPUxpbmsgZG93biAqLwotI2RlZmluZSBNODhFMTAwMF9QU1NSX1NQRF9EUExYX1JFU09MVkVEICAweDA4MDAgLyogMT1TcGVlZCAmIER1cGxleCByZXNvbHZlZCAqLwotI2RlZmluZSBNODhFMTAwMF9QU1NSX1BBR0VfUkNWRCAgICAgICAgICAweDEwMDAgLyogMT1QYWdlIHJlY2VpdmVkICovCi0jZGVmaW5lIE04OEUxMDAwX1BTU1JfRFBMWCAgICAgICAgICAgICAgIDB4MjAwMCAvKiAxPUR1cGxleCAwPUhhbGYgRHVwbGV4ICovCi0jZGVmaW5lIE04OEUxMDAwX1BTU1JfU1BFRUQgICAgICAgICAgICAgIDB4QzAwMCAvKiBTcGVlZCwgYml0cyAxNDoxNSAqLwotI2RlZmluZSBNODhFMTAwMF9QU1NSXzEwTUJTICAgICAgICAgICAgICAweDAwMDAgLyogMDA9MTBNYnMgKi8KLSNkZWZpbmUgTTg4RTEwMDBfUFNTUl8xMDBNQlMgICAgICAgICAgICAgMHg0MDAwIC8qIDAxPTEwME1icyAqLwotI2RlZmluZSBNODhFMTAwMF9QU1NSXzEwMDBNQlMgICAgICAgICAgICAweDgwMDAgLyogMTA9MTAwME1icyAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0pBQkJFUiAgICAgICAgICAgICAweDAwMDEJLyogMT1KYWJiZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFkgICAgICAgMHgwMDAyCS8qIDE9UG9sYXJpdHkgcmV2ZXJzZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9ET1dOU0hJRlQgICAgICAgICAgMHgwMDIwCS8qIDE9RG93bnNoaWZ0ZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9NRElYICAgICAgICAgICAgICAgMHgwMDQwCS8qIDE9TURJWDsgMD1NREkgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEggICAgICAgMHgwMzgwCS8qIDA9PDUwTTsxPTUwLTgwTTsyPTgwLTExME07CisJCQkJCQkgKiAzPTExMC0xNDBNOzQ9PjE0ME0gKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9MSU5LICAgICAgICAgICAgICAgMHgwNDAwCS8qIDE9TGluayB1cCwgMD1MaW5rIGRvd24gKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9TUERfRFBMWF9SRVNPTFZFRCAgMHgwODAwCS8qIDE9U3BlZWQgJiBEdXBsZXggcmVzb2x2ZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9QQUdFX1JDVkQgICAgICAgICAgMHgxMDAwCS8qIDE9UGFnZSByZWNlaXZlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0RQTFggICAgICAgICAgICAgICAweDIwMDAJLyogMT1EdXBsZXggMD1IYWxmIER1cGxleCAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX1NQRUVEICAgICAgICAgICAgICAweEMwMDAJLyogU3BlZWQsIGJpdHMgMTQ6MTUgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl8xME1CUyAgICAgICAgICAgICAgMHgwMDAwCS8qIDAwPTEwTWJzICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfMTAwTUJTICAgICAgICAgICAgIDB4NDAwMAkvKiAwMT0xMDBNYnMgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl8xMDAwTUJTICAgICAgICAgICAgMHg4MDAwCS8qIDEwPTEwMDBNYnMgKi8KIAogI2RlZmluZSBNODhFMTAwMF9QU1NSX1JFVl9QT0xBUklUWV9TSElGVCAxCiAjZGVmaW5lIE04OEUxMDAwX1BTU1JfRE9XTlNISUZUX1NISUZUICAgIDUKQEAgLTI4OTQsMTIgKzI3MTcsMTIgQEAKICNkZWZpbmUgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQgNwogCiAvKiBNODhFMTAwMCBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBNODhFMTAwMF9FUFNDUl9GSUJFUl9MT09QQkFDSyAweDQwMDAgLyogMT1GaWJlciBsb29wYmFjayAqLwotI2RlZmluZSBNODhFMTAwMF9FUFNDUl9ET1dOX05PX0lETEUgICAweDgwMDAgLyogMT1Mb3N0IGxvY2sgZGV0ZWN0IGVuYWJsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBXaWxsIGFzc2VydCBsb3N0IGxvY2sgYW5kIGJyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaW5rIGRvd24gaWYgaWRsZSBub3Qgc2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aGluIDFtcyBpbiAxMDAwQkFTRS1UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfRklCRVJfTE9PUEJBQ0sgMHg0MDAwCS8qIDE9RmliZXIgbG9vcGJhY2sgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfRE9XTl9OT19JRExFICAgMHg4MDAwCS8qIDE9TG9zdCBsb2NrIGRldGVjdCBlbmFibGVkLgorCQkJCQkJICogV2lsbCBhc3NlcnQgbG9zdCBsb2NrIGFuZCBicmluZworCQkJCQkJICogbGluayBkb3duIGlmIGlkbGUgbm90IHNlZW4KKwkJCQkJCSAqIHdpdGhpbiAxbXMgaW4gMTAwMEJBU0UtVAorCQkJCQkJICovCiAvKiBOdW1iZXIgb2YgdGltZXMgd2Ugd2lsbCBhdHRlbXB0IHRvIGF1dG9uZWdvdGlhdGUgYmVmb3JlIGRvd25zaGlmdGluZyBpZiB3ZQogICogYXJlIHRoZSBtYXN0ZXIgKi8KICNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF9NQVNLIDB4MEMwMApAQCAtMjkxNCw5ICsyNzM3LDkgQEAKICNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzFYICAgIDB4MDEwMAogI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfMlggICAgMHgwMjAwCiAjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF8zWCAgICAweDAzMDAKLSNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzJfNSAgICAgMHgwMDYwIC8qIDIuNSBNSHogVFhfQ0xLICovCi0jZGVmaW5lIE04OEUxMDAwX0VQU0NSX1RYX0NMS18yNSAgICAgIDB4MDA3MCAvKiAyNSAgTUh6IFRYX0NMSyAqLwotI2RlZmluZSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMCAgICAgICAweDAwMDAgLyogTk8gIFRYX0NMSyAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMl81ICAgICAweDAwNjAJLyogMi41IE1IeiBUWF9DTEsgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1ICAgICAgMHgwMDcwCS8qIDI1ICBNSHogVFhfQ0xLICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1RYX0NMS18wICAgICAgIDB4MDAwMAkvKiBOTyAgVFhfQ0xLICovCiAKIC8qIE04OEVDMDE4IFJldiAyIHNwZWNpZmljIERvd25TaGlmdCBzZXR0aW5ncyAqLwogI2RlZmluZSBNODhFQzAxOF9FUFNDUl9ET1dOU0hJRlRfQ09VTlRFUl9NQVNLICAweDBFMDAKQEAgLTI5MzgsMTggKzI3NjEsMTggQEAKICNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9ESVNBQkxFX1RSQU5TTUlUICAgICAgMHgyMDAwCiAKIC8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBTdGF0dXMgUmVnaXN0ZXIgLSBSL08gKi8KLSNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0FVVE9ORUdfRkFJTEVEICAgICAgICAgMHgwMDAxIC8qIFJPIExIIFNDICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9BVVRPTkVHX0ZBSUxFRCAgICAgICAgIDB4MDAwMQkvKiBSTyBMSCBTQyAqLwogI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfUE9MQVJJVFlfUkVWRVJTRUQgICAgICAweDAwMDIKICNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCAgICAgICAgICAgMHgwMDdDCiAjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9GVUxMX0RVUExFWCAgICAgICAgICAgIDB4MDIwMAogI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfTElOS19VUCAgICAgICAgICAgICAgICAweDA0MDAKICNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX01ESVggICAgICAgICAgICAgICAgICAgMHgwODAwCi0jZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLICAgICAgICAgICAgIDB4QzAwMCAvKiBzcGVlZCBiaXRzIG1hc2sgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0sgICAgICAgICAgICAgMHhDMDAwCS8qIHNwZWVkIGJpdHMgbWFzayAqLwogI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTBNQlBTICAgICAgICAgICAweDQwMDAKICNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwME1CUFMgICAgICAgICAgMHg4MDAwCiAjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xMDAwTUJQUyAgICAgICAgIDB4QzAwMAotI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIX1NISUZUICAgICAweDAwMDIgLyogc2hpZnQgcmlnaHQgMiAqLwotI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfTURJWF9TSElGVCAgICAgICAgICAgICAweDAwMEIgLyogc2hpZnQgcmlnaHQgMTEgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVCAgICAgMHgwMDAyCS8qIHNoaWZ0IHJpZ2h0IDIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX01ESVhfU0hJRlQgICAgICAgICAgICAgMHgwMDBCCS8qIHNoaWZ0IHJpZ2h0IDExICovCiAKIC8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBDb250cm9sIFJlZ2lzdGVyIC0gUi9XICovCiAjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9UUF9MT09QQkFDSyAgICAgICAgICAgIDB4MDAxMApAQCAtMjk1NywxNiArMjc4MCwxNiBAQAogI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfVEVOX0NSU19TRUxFQ1QgICAgICAgICAweDA0MDAKICNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX0ZMSVBfQ0hJUCAgICAgICAgICAgICAgMHgwODAwCiAjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVggICAgICAgICAgICAgIDB4MTAwMAotI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVggICAgICAgICAweDIwMDAgLyogMC1NREksIDEtTURJWCAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVggICAgICAgICAweDIwMDAJLyogMC1NREksIDEtTURJWCAqLwogCiAvKiBJR1AwMUUxMDAwIFNwZWNpZmljIFBvcnQgTGluayBIZWFsdGggUmVnaXN0ZXIgKi8KICNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX1NTX0RPV05HUkFERSAgICAgICAgICAgMHg4MDAwCiAjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9HSUdfU0NSQU1CTEVSX0VSUk9SICAgIDB4NDAwMAogI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfTUFTVEVSX0ZBVUxUICAgICAgICAgICAweDIwMDAKICNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX01BU1RFUl9SRVNPTFVUSU9OICAgICAgMHgxMDAwCi0jZGVmaW5lIElHUDAxRTEwMDBfUExIUl9HSUdfUkVNX1JDVlJfTk9LICAgICAgIDB4MDgwMCAvKiBMSCAqLwotI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfSURMRV9FUlJPUl9DTlRfT0ZMT1cgICAweDA0MDAgLyogTEggKi8KLSNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0RBVEFfRVJSXzEgICAgICAgICAgICAgMHgwMjAwIC8qIExIICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9HSUdfUkVNX1JDVlJfTk9LICAgICAgIDB4MDgwMAkvKiBMSCAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfSURMRV9FUlJPUl9DTlRfT0ZMT1cgICAweDA0MDAJLyogTEggKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0RBVEFfRVJSXzEgICAgICAgICAgICAgMHgwMjAwCS8qIExIICovCiAjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9EQVRBX0VSUl8wICAgICAgICAgICAgIDB4MDEwMAogI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfQVVUT05FR19GQVVMVCAgICAgICAgICAweDAwNDAKICNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0FVVE9ORUdfQUNUSVZFICAgICAgICAgMHgwMDEwCkBAIC0yOTgxLDkgKzI4MDQsOSBAQAogI2RlZmluZSBJR1AwMUUxMDAwX01TRV9DSEFOTkVMX0IgICAgICAgIDB4MEYwMAogI2RlZmluZSBJR1AwMUUxMDAwX01TRV9DSEFOTkVMX0EgICAgICAgIDB4RjAwMAogCi0jZGVmaW5lIElHUDAyRTEwMDBfUE1fU1BEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogU21hcnQgUG93ZXIgRG93biAqLwotI2RlZmluZSBJR1AwMkUxMDAwX1BNX0QzX0xQTFUgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEVuYWJsZSBMUExVIGluIG5vbi1EMGEgbW9kZXMgKi8KLSNkZWZpbmUgSUdQMDJFMTAwMF9QTV9EMF9MUExVICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBFbmFibGUgTFBMVSBpbiBEMGEgbW9kZSAqLworI2RlZmluZSBJR1AwMkUxMDAwX1BNX1NQRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogU21hcnQgUG93ZXIgRG93biAqLworI2RlZmluZSBJR1AwMkUxMDAwX1BNX0QzX0xQTFUgICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogRW5hYmxlIExQTFUgaW4gbm9uLUQwYSBtb2RlcyAqLworI2RlZmluZSBJR1AwMkUxMDAwX1BNX0QwX0xQTFUgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogRW5hYmxlIExQTFUgaW4gRDBhIG1vZGUgKi8KIAogLyogSUdQMDFFMTAwMCBEU1AgcmVzZXQgbWFjcm9zICovCiAjZGVmaW5lIERTUF9SRVNFVF9FTkFCTEUgICAgIDB4MApAQCAtMjk5Miw4ICsyODE1LDggQEAKIAogLyogSUdQMDFFMTAwMCAmIElHUDAyRTEwMDAgQUdDIFJlZ2lzdGVycyAqLwogCi0jZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA3ICAgICAgICAgLyogQ29hcnNlIC0gMTM6MTEsIEZpbmUgLSAxMDo3ICovCi0jZGVmaW5lIElHUDAyRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA5ICAgICAgICAgLyogQ29hcnNlIC0gMTU6MTMsIEZpbmUgLSAxMjo5ICovCisjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA3CS8qIENvYXJzZSAtIDEzOjExLCBGaW5lIC0gMTA6NyAqLworI2RlZmluZSBJR1AwMkUxMDAwX0FHQ19MRU5HVEhfU0hJRlQgOQkvKiBDb2Fyc2UgLSAxNToxMywgRmluZSAtIDEyOjkgKi8KIAogLyogSUdQMDJFMTAwMCBBR0MgUmVnaXN0ZXIgTGVuZ3RoIDktYml0IG1hc2sgKi8KICNkZWZpbmUgSUdQMDJFMTAwMF9BR0NfTEVOR1RIX01BU0sgIDB4N0YKQEAgLTMwMTEsOSArMjgzNCw5IEBACiAjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPTEFSSVRZX01BU0sgICAgMHgwMDc4CiAKIC8qIElHUDAxRTEwMDAgR01JSSBGSUZPIFJlZ2lzdGVyICovCi0jZGVmaW5lIElHUDAxRTEwMDBfR01JSV9GTEVYX1NQRCAgICAgICAgICAgICAgIDB4MTAgLyogRW5hYmxlIGZsZXhpYmxlIHNwZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb24gTGluay1VcCAqLwotI2RlZmluZSBJR1AwMUUxMDAwX0dNSUlfU1BEICAgICAgICAgICAgICAgICAgICAweDIwIC8qIEVuYWJsZSBTUEQgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9HTUlJX0ZMRVhfU1BEICAgICAgICAgICAgICAgMHgxMAkvKiBFbmFibGUgZmxleGlibGUgc3BlZWQKKwkJCQkJCQkgKiBvbiBMaW5rLVVwICovCisjZGVmaW5lIElHUDAxRTEwMDBfR01JSV9TUEQgICAgICAgICAgICAgICAgICAgIDB4MjAJLyogRW5hYmxlIFNQRCAqLwogCiAvKiBJR1AwMUUxMDAwIEFuYWxvZyBSZWdpc3RlciAqLwogI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19TUEFSRV9GVVNFX1NUQVRVUyAgICAgICAweDIwRDEKQEAgLTMwMzIsMTE0ICsyODU1LDYgQEAKICNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEgICAgICAgICAgICAgICAweDAwODAKICNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEwICAgICAgICAgICAgICAweDA1MDAKIAotLyogR0c4MjU2MyBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyIChQYWdlIDAsIFJlZ2lzdGVyIDE2ICovCi0jZGVmaW5lIEdHODI1NjNfUFNDUl9ESVNBQkxFX0pBQkJFUiAgICAgICAgICAgICAweDAwMDEgLyogMT1EaXNhYmxlIEphYmJlciAqLwotI2RlZmluZSBHRzgyNTYzX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUxfRElTQUJMRSAgMHgwMDAyIC8qIDE9UG9sYXJpdHkgUmV2ZXJzYWwgRGlzYWJsZWQgKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSX1BPV0VSX0RPV04gICAgICAgICAgICAgICAgIDB4MDAwNCAvKiAxPVBvd2VyIERvd24gKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSX0NPUFBFUl9UUkFOU01JVEVSX0RJU0FCTEUgIDB4MDAwOCAvKiAxPVRyYW5zbWl0dGVyIERpc2FibGVkICovCi0jZGVmaW5lIEdHODI1NjNfUFNDUl9DUk9TU09WRVJfTU9ERV9NQVNLICAgICAgICAweDAwNjAKLSNkZWZpbmUgR0c4MjU2M19QU0NSX0NST1NTT1ZFUl9NT0RFX01ESSAgICAgICAgIDB4MDAwMCAvKiAwMD1NYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSX0NST1NTT1ZFUl9NT0RFX01ESVggICAgICAgIDB4MDAyMCAvKiAwMT1NYW51YWwgTURJWCBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIEdHODI1NjNfUFNDUl9DUk9TU09WRVJfTU9ERV9BVVRPICAgICAgICAweDAwNjAgLyogMTE9QXV0b21hdGljIGNyb3Nzb3ZlciAqLwotI2RlZmluZSBHRzgyNTYzX1BTQ1JfRU5BTEJFX0VYVEVOREVEX0RJU1RBTkNFICAgMHgwMDgwIC8qIDE9RW5hYmxlIEV4dGVuZGVkIERpc3RhbmNlICovCi0jZGVmaW5lIEdHODI1NjNfUFNDUl9FTkVSR1lfREVURUNUX01BU0sgICAgICAgICAweDAzMDAKLSNkZWZpbmUgR0c4MjU2M19QU0NSX0VORVJHWV9ERVRFQ1RfT0ZGICAgICAgICAgIDB4MDAwMCAvKiAwMCwwMT1PZmYgKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSX0VORVJHWV9ERVRFQ1RfUlggICAgICAgICAgIDB4MDIwMCAvKiAxMD1TZW5zZSBvbiBSeCBvbmx5IChFbmVyZ3kgRGV0ZWN0KSAqLwotI2RlZmluZSBHRzgyNTYzX1BTQ1JfRU5FUkdZX0RFVEVDVF9SWF9UTSAgICAgICAgMHgwMzAwIC8qIDExPVNlbnNlIGFuZCBUeCBOTFAgKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSX0ZPUkNFX0xJTktfR09PRCAgICAgICAgICAgIDB4MDQwMCAvKiAxPUZvcmNlIExpbmsgR29vZCAqLwotI2RlZmluZSBHRzgyNTYzX1BTQ1JfRE9XTlNISUZUX0VOQUJMRSAgICAgICAgICAgMHgwODAwIC8qIDE9RW5hYmxlIERvd25zaGlmdCAqLwotI2RlZmluZSBHRzgyNTYzX1BTQ1JfRE9XTlNISUZUX0NPVU5URVJfTUFTSyAgICAgMHg3MDAwCi0jZGVmaW5lIEdHODI1NjNfUFNDUl9ET1dOU0hJRlRfQ09VTlRFUl9TSElGVCAgICAxMgotCi0vKiBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyIChQYWdlIDAsIFJlZ2lzdGVyIDE3KSAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfSkFCQkVSICAgICAgICAgICAgICAgIDB4MDAwMSAvKiAxPUphYmJlciAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfUE9MQVJJVFkgICAgICAgICAgICAgIDB4MDAwMiAvKiAxPVBvbGFyaXR5IFJldmVyc2VkICovCi0jZGVmaW5lIEdHODI1NjNfUFNTUl9MSU5LICAgICAgICAgICAgICAgICAgMHgwMDA4IC8qIDE9TGluayBpcyBVcCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfRU5FUkdZX0RFVEVDVCAgICAgICAgIDB4MDAxMCAvKiAxPVNsZWVwLCAwPUFjdGl2ZSAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfRE9XTlNISUZUICAgICAgICAgICAgIDB4MDAyMCAvKiAxPURvd25zaGlmdCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfQ1JPU1NPVkVSX1NUQVRVUyAgICAgIDB4MDA0MCAvKiAxPU1ESVgsIDA9TURJICovCi0jZGVmaW5lIEdHODI1NjNfUFNTUl9SWF9QQVVTRV9FTkFCTEVEICAgICAgMHgwMTAwIC8qIDE9UmVjZWl2ZSBQYXVzZSBFbmFibGVkICovCi0jZGVmaW5lIEdHODI1NjNfUFNTUl9UWF9QQVVTRV9FTkFCTEVEICAgICAgMHgwMjAwIC8qIDE9VHJhbnNtaXQgUGF1c2UgRW5hYmxlZCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfTElOS19VUCAgICAgICAgICAgICAgIDB4MDQwMCAvKiAxPUxpbmsgVXAgKi8KLSNkZWZpbmUgR0c4MjU2M19QU1NSX1NQRUVEX0RVUExFWF9SRVNPTFZFRCAweDA4MDAgLyogMT1SZXNvbHZlZCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfUEFHRV9SRUNFSVZFRCAgICAgICAgIDB4MTAwMCAvKiAxPVBhZ2UgUmVjZWl2ZWQgKi8KLSNkZWZpbmUgR0c4MjU2M19QU1NSX0RVUExFWCAgICAgICAgICAgICAgICAweDIwMDAgLyogMS1GdWxsLUR1cGxleCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfU1BFRURfTUFTSyAgICAgICAgICAgIDB4QzAwMAotI2RlZmluZSBHRzgyNTYzX1BTU1JfU1BFRURfMTBNQlBTICAgICAgICAgIDB4MDAwMCAvKiAwMD0xME1icHMgKi8KLSNkZWZpbmUgR0c4MjU2M19QU1NSX1NQRUVEXzEwME1CUFMgICAgICAgICAweDQwMDAgLyogMDE9MTAwTWJwcyAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1JfU1BFRURfMTAwME1CUFMgICAgICAgIDB4ODAwMCAvKiAxMD0xMDAwTWJwcyAqLwotCi0vKiBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyIDIgKFBhZ2UgMCwgUmVnaXN0ZXIgMTkpICovCi0jZGVmaW5lIEdHODI1NjNfUFNTUjJfSkFCQkVSICAgICAgICAgICAgICAgIDB4MDAwMSAvKiAxPUphYmJlciAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1IyX1BPTEFSSVRZX0NIQU5HRUQgICAgICAweDAwMDIgLyogMT1Qb2xhcml0eSBDaGFuZ2VkICovCi0jZGVmaW5lIEdHODI1NjNfUFNTUjJfRU5FUkdZX0RFVEVDVF9DSEFOR0VEIDB4MDAxMCAvKiAxPUVuZXJneSBEZXRlY3QgQ2hhbmdlZCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1IyX0RPV05TSElGVF9JTlRFUlJVUFQgICAweDAwMjAgLyogMT1Eb3duc2hpZnQgRGV0ZWN0ZWQgKi8KLSNkZWZpbmUgR0c4MjU2M19QU1NSMl9NRElfQ1JPU1NPVkVSX0NIQU5HRSAgMHgwMDQwIC8qIDE9Q3Jvc3NvdmVyIENoYW5nZWQgKi8KLSNkZWZpbmUgR0c4MjU2M19QU1NSMl9GQUxTRV9DQVJSSUVSICAgICAgICAgMHgwMTAwIC8qIDE9RmFsc2UgQ2FycmllciAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1IyX1NZTUJPTF9FUlJPUiAgICAgICAgICAweDAyMDAgLyogMT1TeW1ib2wgRXJyb3IgKi8KLSNkZWZpbmUgR0c4MjU2M19QU1NSMl9MSU5LX1NUQVRVU19DSEFOR0VEICAgMHgwNDAwIC8qIDE9TGluayBTdGF0dXMgQ2hhbmdlZCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1IyX0FVVE9fTkVHX0NPTVBMRVRFRCAgICAweDA4MDAgLyogMT1BdXRvLU5lZyBDb21wbGV0ZWQgKi8KLSNkZWZpbmUgR0c4MjU2M19QU1NSMl9QQUdFX1JFQ0VJVkVEICAgICAgICAgMHgxMDAwIC8qIDE9UGFnZSBSZWNlaXZlZCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1IyX0RVUExFWF9DSEFOR0VEICAgICAgICAweDIwMDAgLyogMT1EdXBsZXggQ2hhbmdlZCAqLwotI2RlZmluZSBHRzgyNTYzX1BTU1IyX1NQRUVEX0NIQU5HRUQgICAgICAgICAweDQwMDAgLyogMT1TcGVlZCBDaGFuZ2VkICovCi0jZGVmaW5lIEdHODI1NjNfUFNTUjJfQVVUT19ORUdfRVJST1IgICAgICAgIDB4ODAwMCAvKiAxPUF1dG8tTmVnIEVycm9yICovCi0KLS8qIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyIDIgKFBhZ2UgMCwgUmVnaXN0ZXIgMjYpICovCi0jZGVmaW5lIEdHODI1NjNfUFNDUjJfMTBCVF9QT0xBUklUWV9GT1JDRSAgICAgICAgICAgMHgwMDAyIC8qIDE9Rm9yY2UgTmVnYXRpdmUgUG9sYXJpdHkgKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSMl8xMDAwTUJfVEVTVF9TRUxFQ1RfTUFTSyAgICAgICAweDAwMEMKLSNkZWZpbmUgR0c4MjU2M19QU0NSMl8xMDAwTUJfVEVTVF9TRUxFQ1RfTk9STUFMICAgICAweDAwMDAgLyogMDAsMDE9Tm9ybWFsIE9wZXJhdGlvbiAqLwotI2RlZmluZSBHRzgyNTYzX1BTQ1IyXzEwMDBNQl9URVNUX1NFTEVDVF8xMTJOUyAgICAgIDB4MDAwOCAvKiAxMD1TZWxlY3QgMTEybnMgU2VxdWVuY2UgKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSMl8xMDAwTUJfVEVTVF9TRUxFQ1RfMTZOUyAgICAgICAweDAwMEMgLyogMTE9U2VsZWN0IDE2bnMgU2VxdWVuY2UgKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSMl9SRVZFUlNFX0FVVE9fTkVHICAgICAgICAgICAgICAweDIwMDAgLyogMT1SZXZlcnNlIEF1dG8tTmVnb3RpYXRpb24gKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSMl8xMDAwQlRfRElTQUJMRSAgICAgICAgICAgICAgICAweDQwMDAgLyogMT1EaXNhYmxlIDEwMDBCQVNFLVQgKi8KLSNkZWZpbmUgR0c4MjU2M19QU0NSMl9UUkFOU01JVEVSX1RZUEVfTUFTSyAgICAgICAgICAweDgwMDAKLSNkZWZpbmUgR0c4MjU2M19QU0NSMl9UUkFOU01JVFRFUl9UWVBFX0NMQVNTX0IgICAgICAweDAwMDAgLyogMD1DbGFzcyBCICovCi0jZGVmaW5lIEdHODI1NjNfUFNDUjJfVFJBTlNNSVRURVJfVFlQRV9DTEFTU19BICAgICAgMHg4MDAwIC8qIDE9Q2xhc3MgQSAqLwotCi0vKiBNQUMgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAoUGFnZSAyLCBSZWdpc3RlciAyMSkgKi8KLS8qIFR4IGNsb2NrIHNwZWVkIGZvciBMaW5rIERvd24gYW5kIDEwMDBCQVNFLVQgZm9yIHRoZSBmb2xsb3dpbmcgc3BlZWRzICovCi0jZGVmaW5lIEdHODI1NjNfTVNDUl9UWF9DTEtfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA3Ci0jZGVmaW5lIEdHODI1NjNfTVNDUl9UWF9DTEtfMTBNQlBTXzJfNU1IWiAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIEdHODI1NjNfTVNDUl9UWF9DTEtfMTAwTUJQU18yNU1IWiAgICAgICAgICAgMHgwMDA1Ci0jZGVmaW5lIEdHODI1NjNfTVNDUl9UWF9DTEtfMTAwME1CUFNfMl81TUhaICAgICAgICAgMHgwMDA2Ci0jZGVmaW5lIEdHODI1NjNfTVNDUl9UWF9DTEtfMTAwME1CUFNfMjVNSFogICAgICAgICAgMHgwMDA3Ci0KLSNkZWZpbmUgR0c4MjU2M19NU0NSX0FTU0VSVF9DUlNfT05fVFggICAgICAgICAgICAgICAweDAwMTAgLyogMT1Bc3NlcnQgKi8KLQotLyogRFNQIERpc3RhbmNlIFJlZ2lzdGVyIChQYWdlIDUsIFJlZ2lzdGVyIDI2KSAqLwotI2RlZmluZSBHRzgyNTYzX0RTUERfQ0FCTEVfTEVOR1RIICAgICAgICAgICAgICAgMHgwMDA3IC8qIDAgPSA8NTBNOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSA1MC04ME07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IDgwLTExME07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9IDExMC0xNDBNOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgPSA+MTQwTSAqLwotCi0vKiBLdW1lcmFuIE1vZGUgQ29udHJvbCBSZWdpc3RlciAoUGFnZSAxOTMsIFJlZ2lzdGVyIDE2KSAqLwotI2RlZmluZSBHRzgyNTYzX0tNQ1JfUEhZX0xFRFNfRU4gICAgICAgICAgICAgICAgICAgIDB4MDAyMCAvKiAxPVBIWSBMRURzLCAwPUt1bWVyYW4gSW5iYW5kIExFRHMgKi8KLSNkZWZpbmUgR0c4MjU2M19LTUNSX0ZPUkNFX0xJTktfVVAgICAgICAgICAgICAgICAgICAweDAwNDAgLyogMT1Gb3JjZSBMaW5rIFVwICovCi0jZGVmaW5lIEdHODI1NjNfS01DUl9TVVBQUkVTU19TR01JSV9FUERfRVhUICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIEdHODI1NjNfS01DUl9NRElPX0JVU19TUEVFRF9TRUxFQ1RfTUFTSyAgICAgMHgwNDAwCi0jZGVmaW5lIEdHODI1NjNfS01DUl9NRElPX0JVU19TUEVFRF9TRUxFQ1QgICAgICAgICAgMHgwNDAwIC8qIDE9Ni4yNU1IeiwgMD0wLjhNSHogKi8KLSNkZWZpbmUgR0c4MjU2M19LTUNSX1BBU1NfRkFMU0VfQ0FSUklFUiAgICAgICAgICAgICAweDA4MDAKLQotLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyIChQYWdlIDE5MywgUmVnaXN0ZXIgMjApICovCi0jZGVmaW5lIEdHODI1NjNfUE1DUl9FTkFCTEVfRUxFQ1RSSUNBTF9JRExFICAgICAgICAgMHgwMDAxIC8qIDE9RW5hbGJlIFNFUkRFUyBFbGVjdHJpY2FsIElkbGUgKi8KLSNkZWZpbmUgR0c4MjU2M19QTUNSX0RJU0FCTEVfUE9SVCAgICAgICAgICAgICAgICAgICAweDAwMDIgLyogMT1EaXNhYmxlIFBvcnQgKi8KLSNkZWZpbmUgR0c4MjU2M19QTUNSX0RJU0FCTEVfU0VSREVTICAgICAgICAgICAgICAgICAweDAwMDQgLyogMT1EaXNhYmxlIFNFUkRFUyAqLwotI2RlZmluZSBHRzgyNTYzX1BNQ1JfUkVWRVJTRV9BVVRPX05FRyAgICAgICAgICAgICAgIDB4MDAwOCAvKiAxPUVuYWJsZSBSZXZlcnNlIEF1dG8tTmVnb3RpYXRpb24gKi8KLSNkZWZpbmUgR0c4MjU2M19QTUNSX0RJU0FCTEVfMTAwMF9OT05fRDAgICAgICAgICAgICAweDAwMTAgLyogMT1EaXNhYmxlIDEwMDBNYnBzIEF1dG8tTmVnIGluIG5vbiBEMCAqLwotI2RlZmluZSBHRzgyNTYzX1BNQ1JfRElTQUJMRV8xMDAwICAgICAgICAgICAgICAgICAgIDB4MDAyMCAvKiAxPURpc2FibGUgMTAwME1icHMgQXV0by1OZWcgQWx3YXlzICovCi0jZGVmaW5lIEdHODI1NjNfUE1DUl9SRVZFUlNFX0FVVE9fTkVHX0QwQSAgICAgICAgICAgMHgwMDQwIC8qIDE9RW5hYmxlIEQwYSBSZXZlcnNlIEF1dG8tTmVnb3RpYXRpb24gKi8KLSNkZWZpbmUgR0c4MjU2M19QTUNSX0ZPUkNFX1BPV0VSX1NUQVRFICAgICAgICAgICAgICAweDAwODAgLyogMT1Gb3JjZSBQb3dlciBTdGF0ZSAqLwotI2RlZmluZSBHRzgyNTYzX1BNQ1JfUFJPR1JBTU1FRF9QT1dFUl9TVEFURV9NQVNLICAgIDB4MDMwMAotI2RlZmluZSBHRzgyNTYzX1BNQ1JfUFJPR1JBTU1FRF9QT1dFUl9TVEFURV9EUiAgICAgIDB4MDAwMCAvKiAwMD1EciAqLwotI2RlZmluZSBHRzgyNTYzX1BNQ1JfUFJPR1JBTU1FRF9QT1dFUl9TVEFURV9EMFUgICAgIDB4MDEwMCAvKiAwMT1EMHUgKi8KLSNkZWZpbmUgR0c4MjU2M19QTUNSX1BST0dSQU1NRURfUE9XRVJfU1RBVEVfRDBBICAgICAweDAyMDAgLyogMTA9RDBhICovCi0jZGVmaW5lIEdHODI1NjNfUE1DUl9QUk9HUkFNTUVEX1BPV0VSX1NUQVRFX0QzICAgICAgMHgwMzAwIC8qIDExPUQzICovCi0KLS8qIEluLUJhbmQgQ29udHJvbCBSZWdpc3RlciAoUGFnZSAxOTQsIFJlZ2lzdGVyIDE4KSAqLwotI2RlZmluZSBHRzgyNTYzX0lDUl9ESVNfUEFERElORyAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAvKiBEaXNhYmxlIFBhZGRpbmcgVXNlICovCi0KLQogLyogQml0IGRlZmluaXRpb25zIGZvciB2YWxpZCBQSFkgSURzLiAqLwogLyogSSA9IEludGVncmF0ZWQKICAqIEUgPSBFeHRlcm5hbApAQCAtMzE1NCw4ICsyODY5LDYgQEAKICNkZWZpbmUgTTg4RTEwMTFfSV9SRVZfNCAgIDB4MDQKICNkZWZpbmUgTTg4RTExMTFfSV9QSFlfSUQgIDB4MDE0MTBDQzAKICNkZWZpbmUgTDFMWFQ5NzFBX1BIWV9JRCAgIDB4MDAxMzc4RTAKLSNkZWZpbmUgR0c4MjU2M19FX1BIWV9JRCAgIDB4MDE0MTBDQTAKLQogCiAvKiBCaXRzLi4uCiAgKiAxNS01OiBwYWdlCkBAIC0zMTY2LDQxICsyODc5LDQxIEBACiAgICAgICAgICgoKHBhZ2UpIDw8IFBIWV9QQUdFX1NISUZUKSB8ICgocmVnKSAmIE1BWF9QSFlfUkVHX0FERFJFU1MpKQogCiAjZGVmaW5lIElHUDNfUEhZX1BPUlRfQ1RSTCAgICAgICAgICAgXAotICAgICAgICBQSFlfUkVHKDc2OSwgMTcpIC8qIFBvcnQgR2VuZXJhbCBDb25maWd1cmF0aW9uICovCisgICAgICAgIFBIWV9SRUcoNzY5LCAxNykJLyogUG9ydCBHZW5lcmFsIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgSUdQM19QSFlfUkFURV9BREFQVF9DVFJMIFwKLSAgICAgICAgUEhZX1JFRyg3NjksIDI1KSAvKiBSYXRlIEFkYXB0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworICAgICAgICBQSFlfUkVHKDc2OSwgMjUpCS8qIFJhdGUgQWRhcHRlciBDb250cm9sIFJlZ2lzdGVyICovCiAKICNkZWZpbmUgSUdQM19LTVJOX0ZJRk9fQ1RSTF9TVEFUUyBcCi0gICAgICAgIFBIWV9SRUcoNzcwLCAxNikgLyogS01STiBGSUZPJ3MgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgKi8KKyAgICAgICAgUEhZX1JFRyg3NzAsIDE2KQkvKiBLTVJOIEZJRk8ncyBjb250cm9sL3N0YXR1cyByZWdpc3RlciAqLwogI2RlZmluZSBJR1AzX0tNUk5fUE9XRVJfTU5HX0NUUkwgXAotICAgICAgICBQSFlfUkVHKDc3MCwgMTcpIC8qIEtNUk4gUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyICovCisgICAgICAgIFBIWV9SRUcoNzcwLCAxNykJLyogS01STiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSUdQM19LTVJOX0lOQkFORF9DVFJMIFwKLSAgICAgICAgUEhZX1JFRyg3NzAsIDE4KSAvKiBLTVJOIEluYmFuZCBDb250cm9sIFJlZ2lzdGVyICovCisgICAgICAgIFBIWV9SRUcoNzcwLCAxOCkJLyogS01STiBJbmJhbmQgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBJR1AzX0tNUk5fRElBRyBcCi0gICAgICAgIFBIWV9SRUcoNzcwLCAxOSkgLyogS01STiBEaWFnbm9zdGljIHJlZ2lzdGVyICovCi0jZGVmaW5lIElHUDNfS01STl9ESUFHX1BDU19MT0NLX0xPU1MgMHgwMDAyIC8qIFJYIFBDUyBpcyBub3Qgc3luY2VkICovCisgICAgICAgIFBIWV9SRUcoNzcwLCAxOSkJLyogS01STiBEaWFnbm9zdGljIHJlZ2lzdGVyICovCisjZGVmaW5lIElHUDNfS01STl9ESUFHX1BDU19MT0NLX0xPU1MgMHgwMDAyCS8qIFJYIFBDUyBpcyBub3Qgc3luY2VkICovCiAjZGVmaW5lIElHUDNfS01STl9BQ0tfVElNRU9VVCBcCi0gICAgICAgIFBIWV9SRUcoNzcwLCAyMCkgLyogS01STiBBY2tub3dsZWRnZSBUaW1lb3V0cyByZWdpc3RlciAqLworICAgICAgICBQSFlfUkVHKDc3MCwgMjApCS8qIEtNUk4gQWNrbm93bGVkZ2UgVGltZW91dHMgcmVnaXN0ZXIgKi8KIAogI2RlZmluZSBJR1AzX1ZSX0NUUkwgXAotICAgICAgICBQSFlfUkVHKDc3NiwgMTgpIC8qIFZvbHRhZ2UgcmVndWxhdG9yIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUdQM19WUl9DVFJMX01PREVfU0hVVCAgICAgICAweDAyMDAgLyogRW50ZXIgcG93ZXJkb3duLCBzaHV0ZG93biBWUnMgKi8KLSNkZWZpbmUgSUdQM19WUl9DVFJMX01PREVfTUFTSyAgICAgICAweDAzMDAgLyogU2h1dGRvd24gVlIgTWFzayAqLworICAgICAgICBQSFlfUkVHKDc3NiwgMTgpCS8qIFZvbHRhZ2UgcmVndWxhdG9yIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQM19WUl9DVFJMX01PREVfU0hVVCAgICAgICAweDAyMDAJLyogRW50ZXIgcG93ZXJkb3duLCBzaHV0ZG93biBWUnMgKi8KKyNkZWZpbmUgSUdQM19WUl9DVFJMX01PREVfTUFTSyAgICAgICAweDAzMDAJLyogU2h1dGRvd24gVlIgTWFzayAqLwogCiAjZGVmaW5lIElHUDNfQ0FQQUJJTElUWSBcCi0gICAgICAgIFBIWV9SRUcoNzc2LCAxOSkgLyogSUdQMyBDYXBhYmlsaXR5IFJlZ2lzdGVyICovCisgICAgICAgIFBIWV9SRUcoNzc2LCAxOSkJLyogSUdQMyBDYXBhYmlsaXR5IFJlZ2lzdGVyICovCiAKIC8qIENhcGFiaWxpdGllcyBmb3IgU0tVIENvbnRyb2wgICovCi0jZGVmaW5lIElHUDNfQ0FQX0lOSVRJQVRFX1RFQU0gICAgICAgMHgwMDAxIC8qIEFibGUgdG8gaW5pdGlhdGUgYSB0ZWFtICovCi0jZGVmaW5lIElHUDNfQ0FQX1dGTSAgICAgICAgICAgICAgICAgMHgwMDAyIC8qIFN1cHBvcnQgV29MIGFuZCBQWEUgKi8KLSNkZWZpbmUgSUdQM19DQVBfQVNGICAgICAgICAgICAgICAgICAweDAwMDQgLyogU3VwcG9ydCBBU0YgKi8KLSNkZWZpbmUgSUdQM19DQVBfTFBMVSAgICAgICAgICAgICAgICAweDAwMDggLyogU3VwcG9ydCBMb3cgUG93ZXIgTGluayBVcCAqLwotI2RlZmluZSBJR1AzX0NBUF9EQ19BVVRPX1NQRUVEICAgICAgIDB4MDAxMCAvKiBTdXBwb3J0IEFDL0RDIEF1dG8gTGluayBTcGVlZCAqLwotI2RlZmluZSBJR1AzX0NBUF9TUEQgICAgICAgICAgICAgICAgIDB4MDAyMCAvKiBTdXBwb3J0IFNtYXJ0IFBvd2VyIERvd24gKi8KLSNkZWZpbmUgSUdQM19DQVBfTVVMVF9RVUVVRSAgICAgICAgICAweDAwNDAgLyogU3VwcG9ydCAyIHR4ICYgMiByeCBxdWV1ZXMgKi8KLSNkZWZpbmUgSUdQM19DQVBfUlNTICAgICAgICAgICAgICAgICAweDAwODAgLyogU3VwcG9ydCBSU1MgKi8KLSNkZWZpbmUgSUdQM19DQVBfODAyMVBRICAgICAgICAgICAgICAweDAxMDAgLyogU3VwcG9ydCA4MDIuMVEgJiA4MDIuMXAgKi8KLSNkZWZpbmUgSUdQM19DQVBfQU1UX0NCICAgICAgICAgICAgICAweDAyMDAgLyogU3VwcG9ydCBhY3RpdmUgbWFuYWdlYWJpbGl0eSBhbmQgY2lyY3VpdCBicmVha2VyICovCisjZGVmaW5lIElHUDNfQ0FQX0lOSVRJQVRFX1RFQU0gICAgICAgMHgwMDAxCS8qIEFibGUgdG8gaW5pdGlhdGUgYSB0ZWFtICovCisjZGVmaW5lIElHUDNfQ0FQX1dGTSAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIFN1cHBvcnQgV29MIGFuZCBQWEUgKi8KKyNkZWZpbmUgSUdQM19DQVBfQVNGICAgICAgICAgICAgICAgICAweDAwMDQJLyogU3VwcG9ydCBBU0YgKi8KKyNkZWZpbmUgSUdQM19DQVBfTFBMVSAgICAgICAgICAgICAgICAweDAwMDgJLyogU3VwcG9ydCBMb3cgUG93ZXIgTGluayBVcCAqLworI2RlZmluZSBJR1AzX0NBUF9EQ19BVVRPX1NQRUVEICAgICAgIDB4MDAxMAkvKiBTdXBwb3J0IEFDL0RDIEF1dG8gTGluayBTcGVlZCAqLworI2RlZmluZSBJR1AzX0NBUF9TUEQgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBTdXBwb3J0IFNtYXJ0IFBvd2VyIERvd24gKi8KKyNkZWZpbmUgSUdQM19DQVBfTVVMVF9RVUVVRSAgICAgICAgICAweDAwNDAJLyogU3VwcG9ydCAyIHR4ICYgMiByeCBxdWV1ZXMgKi8KKyNkZWZpbmUgSUdQM19DQVBfUlNTICAgICAgICAgICAgICAgICAweDAwODAJLyogU3VwcG9ydCBSU1MgKi8KKyNkZWZpbmUgSUdQM19DQVBfODAyMVBRICAgICAgICAgICAgICAweDAxMDAJLyogU3VwcG9ydCA4MDIuMVEgJiA4MDIuMXAgKi8KKyNkZWZpbmUgSUdQM19DQVBfQU1UX0NCICAgICAgICAgICAgICAweDAyMDAJLyogU3VwcG9ydCBhY3RpdmUgbWFuYWdlYWJpbGl0eSBhbmQgY2lyY3VpdCBicmVha2VyICovCiAKICNkZWZpbmUgSUdQM19QUENfSk9SREFOX0VOICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgSUdQM19QUENfSk9SREFOX0dJR0FfU1BFRUQgICAweDAwMDIKQEAgLTMyMTAsNjkgKzI5MjMsNjkgQEAKICNkZWZpbmUgSUdQM19LTVJOX1BNQ19LMFNfTU9ERTFfRU5fR0lHQSAgICAgICAgMHgwMDIwCiAjZGVmaW5lIElHUDNfS01STl9QTUNfSzBTX01PREUxX0VOXzEwMCAgICAgICAgIDB4MDA0MAogCi0jZGVmaW5lIElHUDNFMTAwMF9QSFlfTUlTQ19DVFJMICAgICAgICAgICAgICAgIDB4MUIgICAvKiBNaXNjLiBDdHJsIHJlZ2lzdGVyICovCi0jZGVmaW5lIElHUDNfUEhZX01JU0NfRFVQTEVYX01BTlVBTF9TRVQgICAgICAgIDB4MTAwMCAvKiBEdXBsZXggTWFudWFsIFNldCAqLworI2RlZmluZSBJR1AzRTEwMDBfUEhZX01JU0NfQ1RSTCAgICAgICAgICAgICAgICAweDFCCS8qIE1pc2MuIEN0cmwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQM19QSFlfTUlTQ19EVVBMRVhfTUFOVUFMX1NFVCAgICAgICAgMHgxMDAwCS8qIER1cGxleCBNYW51YWwgU2V0ICovCiAKICNkZWZpbmUgSUdQM19LTVJOX0VYVF9DVFJMICBQSFlfUkVHKDc3MCwgMTgpCiAjZGVmaW5lIElHUDNfS01STl9FQ19ESVNfSU5CQU5EICAgIDB4MDA4MAogCiAjZGVmaW5lIElHUDAzRTEwMDBfRV9QSFlfSUQgIDB4MDJBODAzOTAKLSNkZWZpbmUgSUZFX0VfUEhZX0lEICAgICAgICAgMHgwMkE4MDMzMCAvKiAxMC8xMDAgUEhZICovCisjZGVmaW5lIElGRV9FX1BIWV9JRCAgICAgICAgIDB4MDJBODAzMzAJLyogMTAvMTAwIFBIWSAqLwogI2RlZmluZSBJRkVfUExVU19FX1BIWV9JRCAgICAweDAyQTgwMzIwCiAjZGVmaW5lIElGRV9DX0VfUEhZX0lEICAgICAgIDB4MDJBODAzMTAKIAotI2RlZmluZSBJRkVfUEhZX0VYVEVOREVEX1NUQVRVU19DT05UUk9MICAgMHgxMCAgLyogMTAwQmFzZVR4IEV4dGVuZGVkIFN0YXR1cywgQ29udHJvbCBhbmQgQWRkcmVzcyAqLwotI2RlZmluZSBJRkVfUEhZX1NQRUNJQUxfQ09OVFJPTCAgICAgICAgICAgMHgxMSAgLyogMTAwQmFzZVR4IFBIWSBzcGVjaWFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUZFX1BIWV9SQ1ZfRkFMU0VfQ0FSUklFUiAgICAgICAgIDB4MTMgIC8qIDEwMEJhc2VUeCBSZWNlaXZlIEZhbHNlIENhcnJpZXIgQ291bnRlciAqLwotI2RlZmluZSBJRkVfUEhZX1JDVl9ESVNDT05ORUNUICAgICAgICAgICAgMHgxNCAgLyogMTAwQmFzZVR4IFJlY2VpdmUgRGlzY29ubmV0IENvdW50ZXIgKi8KLSNkZWZpbmUgSUZFX1BIWV9SQ1ZfRVJST1RfRlJBTUUgICAgICAgICAgIDB4MTUgIC8qIDEwMEJhc2VUeCBSZWNlaXZlIEVycm9yIEZyYW1lIENvdW50ZXIgKi8KLSNkZWZpbmUgSUZFX1BIWV9SQ1ZfU1lNQk9MX0VSUiAgICAgICAgICAgIDB4MTYgIC8qIFJlY2VpdmUgU3ltYm9sIEVycm9yIENvdW50ZXIgKi8KLSNkZWZpbmUgSUZFX1BIWV9QUkVNX0VPRl9FUlIgICAgICAgICAgICAgIDB4MTcgIC8qIDEwMEJhc2VUeCBSZWNlaXZlIFByZW1hdHVyZSBFbmQgT2YgRnJhbWUgRXJyb3IgQ291bnRlciAqLwotI2RlZmluZSBJRkVfUEhZX1JDVl9FT0ZfRVJSICAgICAgICAgICAgICAgMHgxOCAgLyogMTBCYXNlVCBSZWNlaXZlIEVuZCBPZiBGcmFtZSBFcnJvciBDb3VudGVyICovCi0jZGVmaW5lIElGRV9QSFlfVFhfSkFCQkVSX0RFVEVDVCAgICAgICAgICAweDE5ICAvKiAxMEJhc2VUIFRyYW5zbWl0IEphYmJlciBEZXRlY3QgQ291bnRlciAqLwotI2RlZmluZSBJRkVfUEhZX0VRVUFMSVpFUiAgICAgICAgICAgICAgICAgMHgxQSAgLyogUEhZIEVxdWFsaXplciBDb250cm9sIGFuZCBTdGF0dXMgKi8KLSNkZWZpbmUgSUZFX1BIWV9TUEVDSUFMX0NPTlRST0xfTEVEICAgICAgIDB4MUIgIC8qIFBIWSBzcGVjaWFsIGNvbnRyb2wgYW5kIExFRCBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIElGRV9QSFlfTURJWF9DT05UUk9MICAgICAgICAgICAgICAweDFDICAvKiBNREkvTURJLVggQ29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBJRkVfUEhZX0hXSV9DT05UUk9MICAgICAgICAgICAgICAgMHgxRCAgLyogSGFyZHdhcmUgSW50ZWdyaXR5IENvbnRyb2wgKEhXSSkgKi8KKyNkZWZpbmUgSUZFX1BIWV9FWFRFTkRFRF9TVEFUVVNfQ09OVFJPTCAgIDB4MTAJLyogMTAwQmFzZVR4IEV4dGVuZGVkIFN0YXR1cywgQ29udHJvbCBhbmQgQWRkcmVzcyAqLworI2RlZmluZSBJRkVfUEhZX1NQRUNJQUxfQ09OVFJPTCAgICAgICAgICAgMHgxMQkvKiAxMDBCYXNlVHggUEhZIHNwZWNpYWwgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBJRkVfUEhZX1JDVl9GQUxTRV9DQVJSSUVSICAgICAgICAgMHgxMwkvKiAxMDBCYXNlVHggUmVjZWl2ZSBGYWxzZSBDYXJyaWVyIENvdW50ZXIgKi8KKyNkZWZpbmUgSUZFX1BIWV9SQ1ZfRElTQ09OTkVDVCAgICAgICAgICAgIDB4MTQJLyogMTAwQmFzZVR4IFJlY2VpdmUgRGlzY29ubmVjdCBDb3VudGVyICovCisjZGVmaW5lIElGRV9QSFlfUkNWX0VSUk9UX0ZSQU1FICAgICAgICAgICAweDE1CS8qIDEwMEJhc2VUeCBSZWNlaXZlIEVycm9yIEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgSUZFX1BIWV9SQ1ZfU1lNQk9MX0VSUiAgICAgICAgICAgIDB4MTYJLyogUmVjZWl2ZSBTeW1ib2wgRXJyb3IgQ291bnRlciAqLworI2RlZmluZSBJRkVfUEhZX1BSRU1fRU9GX0VSUiAgICAgICAgICAgICAgMHgxNwkvKiAxMDBCYXNlVHggUmVjZWl2ZSBQcmVtYXR1cmUgRW5kIE9mIEZyYW1lIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgSUZFX1BIWV9SQ1ZfRU9GX0VSUiAgICAgICAgICAgICAgIDB4MTgJLyogMTBCYXNlVCBSZWNlaXZlIEVuZCBPZiBGcmFtZSBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIElGRV9QSFlfVFhfSkFCQkVSX0RFVEVDVCAgICAgICAgICAweDE5CS8qIDEwQmFzZVQgVHJhbnNtaXQgSmFiYmVyIERldGVjdCBDb3VudGVyICovCisjZGVmaW5lIElGRV9QSFlfRVFVQUxJWkVSICAgICAgICAgICAgICAgICAweDFBCS8qIFBIWSBFcXVhbGl6ZXIgQ29udHJvbCBhbmQgU3RhdHVzICovCisjZGVmaW5lIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MX0xFRCAgICAgICAweDFCCS8qIFBIWSBzcGVjaWFsIGNvbnRyb2wgYW5kIExFRCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIElGRV9QSFlfTURJWF9DT05UUk9MICAgICAgICAgICAgICAweDFDCS8qIE1ESS9NREktWCBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIElGRV9QSFlfSFdJX0NPTlRST0wgICAgICAgICAgICAgICAweDFECS8qIEhhcmR3YXJlIEludGVncml0eSBDb250cm9sIChIV0kpICovCiAKLSNkZWZpbmUgSUZFX1BFU0NfUkVEVUNFRF9QT1dFUl9ET1dOX0RJU0FCTEUgIDB4MjAwMCAgLyogRGVmYXV0IDEgPSBEaXNhYmxlIGF1dG8gcmVkdWNlZCBwb3dlciBkb3duICovCi0jZGVmaW5lIElGRV9QRVNDXzEwMEJUWF9QT1dFUl9ET1dOICAgICAgICAgICAweDA0MDAgIC8qIEluZGljYXRlcyB0aGUgcG93ZXIgc3RhdGUgb2YgMTAwQkFTRS1UWCAqLwotI2RlZmluZSBJRkVfUEVTQ18xMEJUWF9QT1dFUl9ET1dOICAgICAgICAgICAgMHgwMjAwICAvKiBJbmRpY2F0ZXMgdGhlIHBvd2VyIHN0YXRlIG9mIDEwQkFTRS1UICovCi0jZGVmaW5lIElGRV9QRVNDX1BPTEFSSVRZX1JFVkVSU0VEICAgICAgICAgICAweDAxMDAgIC8qIEluZGljYXRlcyAxMEJBU0UtVCBwb2xhcml0eSAqLwotI2RlZmluZSBJRkVfUEVTQ19QSFlfQUREUl9NQVNLICAgICAgICAgICAgICAgMHgwMDdDICAvKiBCaXQgNjoyIGZvciBzYW1wbGVkIFBIWSBhZGRyZXNzICovCi0jZGVmaW5lIElGRV9QRVNDX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEF1dG8tbmVnb3RpYXRpb24gc3BlZWQgcmVzdWx0IDE9MTAwTWJzLCAwPTEwTWJzICovCi0jZGVmaW5lIElGRV9QRVNDX0RVUExFWCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEF1dG8tbmVnb3RpYXRpb24gZHVwbGV4IHJlc3VsdCAxPUZ1bGwsIDA9SGFsZiAqLworI2RlZmluZSBJRkVfUEVTQ19SRURVQ0VEX1BPV0VSX0RPV05fRElTQUJMRSAgMHgyMDAwCS8qIERlZmF1bHQgMSA9IERpc2FibGUgYXV0byByZWR1Y2VkIHBvd2VyIGRvd24gKi8KKyNkZWZpbmUgSUZFX1BFU0NfMTAwQlRYX1BPV0VSX0RPV04gICAgICAgICAgIDB4MDQwMAkvKiBJbmRpY2F0ZXMgdGhlIHBvd2VyIHN0YXRlIG9mIDEwMEJBU0UtVFggKi8KKyNkZWZpbmUgSUZFX1BFU0NfMTBCVFhfUE9XRVJfRE9XTiAgICAgICAgICAgIDB4MDIwMAkvKiBJbmRpY2F0ZXMgdGhlIHBvd2VyIHN0YXRlIG9mIDEwQkFTRS1UICovCisjZGVmaW5lIElGRV9QRVNDX1BPTEFSSVRZX1JFVkVSU0VEICAgICAgICAgICAweDAxMDAJLyogSW5kaWNhdGVzIDEwQkFTRS1UIHBvbGFyaXR5ICovCisjZGVmaW5lIElGRV9QRVNDX1BIWV9BRERSX01BU0sgICAgICAgICAgICAgICAweDAwN0MJLyogQml0IDY6MiBmb3Igc2FtcGxlZCBQSFkgYWRkcmVzcyAqLworI2RlZmluZSBJRkVfUEVTQ19TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEF1dG8tbmVnb3RpYXRpb24gc3BlZWQgcmVzdWx0IDE9MTAwTWJzLCAwPTEwTWJzICovCisjZGVmaW5lIElGRV9QRVNDX0RVUExFWCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogQXV0by1uZWdvdGlhdGlvbiBkdXBsZXggcmVzdWx0IDE9RnVsbCwgMD1IYWxmICovCiAjZGVmaW5lIElGRV9QRVNDX1BPTEFSSVRZX1JFVkVSU0VEX1NISUZUICAgICA4CiAKLSNkZWZpbmUgSUZFX1BTQ19ESVNBQkxFX0RZTkFNSUNfUE9XRVJfRE9XTiAgIDB4MDEwMCAgLyogMSA9IER5YW5taWMgUG93ZXIgRG93biBkaXNhYmxlZCAqLwotI2RlZmluZSBJRkVfUFNDX0ZPUkNFX1BPTEFSSVRZICAgICAgICAgICAgICAgMHgwMDIwICAvKiAxPVJldmVyc2VkIFBvbGFyaXR5LCAwPU5vcm1hbCAqLwotI2RlZmluZSBJRkVfUFNDX0FVVE9fUE9MQVJJVFlfRElTQUJMRSAgICAgICAgMHgwMDEwICAvKiAxPUF1dG8gUG9sYXJpdHkgRGlzYWJsZWQsIDA9RW5hYmxlZCAqLwotI2RlZmluZSBJRkVfUFNDX0pBQkJFUl9GVU5DX0RJU0FCTEUgICAgICAgICAgMHgwMDAxICAvKiAxPUphYmJlciBEaXNhYmxlZCwgMD1Ob3JtYWwgSmFiYmVyIE9wZXJhdGlvbiAqLworI2RlZmluZSBJRkVfUFNDX0RJU0FCTEVfRFlOQU1JQ19QT1dFUl9ET1dOICAgMHgwMTAwCS8qIDEgPSBEeW5hbWljIFBvd2VyIERvd24gZGlzYWJsZWQgKi8KKyNkZWZpbmUgSUZFX1BTQ19GT1JDRV9QT0xBUklUWSAgICAgICAgICAgICAgIDB4MDAyMAkvKiAxPVJldmVyc2VkIFBvbGFyaXR5LCAwPU5vcm1hbCAqLworI2RlZmluZSBJRkVfUFNDX0FVVE9fUE9MQVJJVFlfRElTQUJMRSAgICAgICAgMHgwMDEwCS8qIDE9QXV0byBQb2xhcml0eSBEaXNhYmxlZCwgMD1FbmFibGVkICovCisjZGVmaW5lIElGRV9QU0NfSkFCQkVSX0ZVTkNfRElTQUJMRSAgICAgICAgICAweDAwMDEJLyogMT1KYWJiZXIgRGlzYWJsZWQsIDA9Tm9ybWFsIEphYmJlciBPcGVyYXRpb24gKi8KICNkZWZpbmUgSUZFX1BTQ19GT1JDRV9QT0xBUklUWV9TSElGVCAgICAgICAgIDUKICNkZWZpbmUgSUZFX1BTQ19BVVRPX1BPTEFSSVRZX0RJU0FCTEVfU0hJRlQgIDQKIAotI2RlZmluZSBJRkVfUE1DX0FVVE9fTURJWCAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiAxPWVuYWJsZSBNREkvTURJLVggZmVhdHVyZSwgZGVmYXVsdCAwPWRpc2FibGVkICovCi0jZGVmaW5lIElGRV9QTUNfRk9SQ0VfTURJWCAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIDE9Zm9yY2UgTURJWC1YLCAwPWZvcmNlIE1ESSAqLwotI2RlZmluZSBJRkVfUE1DX01ESVhfU1RBVFVTICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiAxPU1ESS1YLCAwPU1ESSAqLwotI2RlZmluZSBJRkVfUE1DX0FVVE9fTURJWF9DT01QTEVURSAgICAgICAgICAgMHgwMDEwICAvKiBSZXNvbHV0aW9uIGFsZ29yaXRobSBpcyBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgSUZFX1BNQ19BVVRPX01ESVggICAgICAgICAgICAgICAgICAgIDB4MDA4MAkvKiAxPWVuYWJsZSBNREkvTURJLVggZmVhdHVyZSwgZGVmYXVsdCAwPWRpc2FibGVkICovCisjZGVmaW5lIElGRV9QTUNfRk9SQ0VfTURJWCAgICAgICAgICAgICAgICAgICAweDAwNDAJLyogMT1mb3JjZSBNRElYLVgsIDA9Zm9yY2UgTURJICovCisjZGVmaW5lIElGRV9QTUNfTURJWF9TVEFUVVMgICAgICAgICAgICAgICAgICAweDAwMjAJLyogMT1NREktWCwgMD1NREkgKi8KKyNkZWZpbmUgSUZFX1BNQ19BVVRPX01ESVhfQ09NUExFVEUgICAgICAgICAgIDB4MDAxMAkvKiBSZXNvbHV0aW9uIGFsZ29yaXRobSBpcyBjb21wbGV0ZWQgKi8KICNkZWZpbmUgSUZFX1BNQ19NRElYX01PREVfU0hJRlQgICAgICAgICAgICAgIDYKLSNkZWZpbmUgSUZFX1BIQ19NRElYX1JFU0VUX0FMTF9NQVNLICAgICAgICAgIDB4MDAwMCAgLyogRGlzYWJsZSBhdXRvIE1ESS1YICovCisjZGVmaW5lIElGRV9QSENfTURJWF9SRVNFVF9BTExfTUFTSyAgICAgICAgICAweDAwMDAJLyogRGlzYWJsZSBhdXRvIE1ESS1YICovCiAKLSNkZWZpbmUgSUZFX1BIQ19IV0lfRU5BQkxFICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogRW5hYmxlIHRoZSBIV0kgZmVhdHVyZSAqLwotI2RlZmluZSBJRkVfUEhDX0FCSUxJVFlfQ0hFQ0sgICAgICAgICAgICAgICAgMHg0MDAwICAvKiAxPSBUZXN0IFBhc3NlZCwgMD1mYWlsZWQgKi8KLSNkZWZpbmUgSUZFX1BIQ19URVNUX0VYRUMgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogUEhZIGxhdW5jaCB0ZXN0IHB1bHNlcyBvbiB0aGUgd2lyZSAqLwotI2RlZmluZSBJRkVfUEhDX0hJR0haICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiAxID0gT3BlbiBDaXJjdWl0ICovCi0jZGVmaW5lIElGRV9QSENfTE9XWiAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIDEgPSBTaG9ydCBDaXJjdWl0ICovCi0jZGVmaW5lIElGRV9QSENfTE9XX0hJR0hfWl9NQVNLICAgICAgICAgICAgICAweDA2MDAgIC8qIE1hc2sgZm9yIGluZGljYXRpb24gdHlwZSBvZiBwcm9ibGVtIG9uIHRoZSBsaW5lICovCi0jZGVmaW5lIElGRV9QSENfRElTVEFOQ0VfTUFTSyAgICAgICAgICAgICAgICAweDAxRkYgIC8qIE1hc2sgZm9yIGRpc3RhbmNlIHRvIHRoZSBjYWJsZSBwcm9ibGVtLCBpbiA4MGNtIGdyYW51bGFyaXR5ICovCi0jZGVmaW5lIElGRV9QSENfUkVTRVRfQUxMX01BU0sgICAgICAgICAgICAgICAweDAwMDAgIC8qIERpc2FibGUgSFdJICovCi0jZGVmaW5lIElGRV9QU0NMX1BST0JFX01PREUgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExFRCBQcm9iZSBtb2RlICovCi0jZGVmaW5lIElGRV9QU0NMX1BST0JFX0xFRFNfT0ZGICAgICAgICAgICAgICAweDAwMDYgIC8qIEZvcmNlIExFRHMgMCBhbmQgMiBvZmYgKi8KLSNkZWZpbmUgSUZFX1BTQ0xfUFJPQkVfTEVEU19PTiAgICAgICAgICAgICAgIDB4MDAwNyAgLyogRm9yY2UgTEVEcyAwIGFuZCAyIG9uICovCisjZGVmaW5lIElGRV9QSENfSFdJX0VOQUJMRSAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogRW5hYmxlIHRoZSBIV0kgZmVhdHVyZSAqLworI2RlZmluZSBJRkVfUEhDX0FCSUxJVFlfQ0hFQ0sgICAgICAgICAgICAgICAgMHg0MDAwCS8qIDE9IFRlc3QgUGFzc2VkLCAwPWZhaWxlZCAqLworI2RlZmluZSBJRkVfUEhDX1RFU1RfRVhFQyAgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIFBIWSBsYXVuY2ggdGVzdCBwdWxzZXMgb24gdGhlIHdpcmUgKi8KKyNkZWZpbmUgSUZFX1BIQ19ISUdIWiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiAxID0gT3BlbiBDaXJjdWl0ICovCisjZGVmaW5lIElGRV9QSENfTE9XWiAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogMSA9IFNob3J0IENpcmN1aXQgKi8KKyNkZWZpbmUgSUZFX1BIQ19MT1dfSElHSF9aX01BU0sgICAgICAgICAgICAgIDB4MDYwMAkvKiBNYXNrIGZvciBpbmRpY2F0aW9uIHR5cGUgb2YgcHJvYmxlbSBvbiB0aGUgbGluZSAqLworI2RlZmluZSBJRkVfUEhDX0RJU1RBTkNFX01BU0sgICAgICAgICAgICAgICAgMHgwMUZGCS8qIE1hc2sgZm9yIGRpc3RhbmNlIHRvIHRoZSBjYWJsZSBwcm9ibGVtLCBpbiA4MGNtIGdyYW51bGFyaXR5ICovCisjZGVmaW5lIElGRV9QSENfUkVTRVRfQUxMX01BU0sgICAgICAgICAgICAgICAweDAwMDAJLyogRGlzYWJsZSBIV0kgKi8KKyNkZWZpbmUgSUZFX1BTQ0xfUFJPQkVfTU9ERSAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBMRUQgUHJvYmUgbW9kZSAqLworI2RlZmluZSBJRkVfUFNDTF9QUk9CRV9MRURTX09GRiAgICAgICAgICAgICAgMHgwMDA2CS8qIEZvcmNlIExFRHMgMCBhbmQgMiBvZmYgKi8KKyNkZWZpbmUgSUZFX1BTQ0xfUFJPQkVfTEVEU19PTiAgICAgICAgICAgICAgIDB4MDAwNwkvKiBGb3JjZSBMRURzIDAgYW5kIDIgb24gKi8KIAotI2RlZmluZSBJQ0hfRkxBU0hfQ09NTUFORF9USU1FT1VUICAgICAgICAgICAgNTAwMCAgICAvKiA1MDAwIHVTZWNzIC0gYWRqdXN0ZWQgKi8KLSNkZWZpbmUgSUNIX0ZMQVNIX0VSQVNFX1RJTUVPVVQgICAgICAgICAgICAgIDMwMDAwMDAgLyogVXAgdG8gMyBzZWNvbmRzIC0gd29yc3QgY2FzZSAqLwotI2RlZmluZSBJQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UICAgICAgICAgMTAgICAgICAvKiAxMCBjeWNsZXMgKi8KKyNkZWZpbmUgSUNIX0ZMQVNIX0NPTU1BTkRfVElNRU9VVCAgICAgICAgICAgIDUwMDAJLyogNTAwMCB1U2VjcyAtIGFkanVzdGVkICovCisjZGVmaW5lIElDSF9GTEFTSF9FUkFTRV9USU1FT1VUICAgICAgICAgICAgICAzMDAwMDAwCS8qIFVwIHRvIDMgc2Vjb25kcyAtIHdvcnN0IGNhc2UgKi8KKyNkZWZpbmUgSUNIX0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCAgICAgICAgIDEwCS8qIDEwIGN5Y2xlcyAqLwogI2RlZmluZSBJQ0hfRkxBU0hfU0VHX1NJWkVfMjU2ICAgICAgICAgICAgICAgMjU2CiAjZGVmaW5lIElDSF9GTEFTSF9TRUdfU0laRV80SyAgICAgICAgICAgICAgICA0MDk2CiAjZGVmaW5lIElDSF9GTEFTSF9TRUdfU0laRV82NEsgICAgICAgICAgICAgICA2NTUzNgpAQCAtMzMwNSw3NCArMzAxOCw2IEBACiAjZGVmaW5lIElDSF9HRlBSRUdfQkFTRV9NQVNLICAgICAgIDB4MUZGRgogI2RlZmluZSBJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSyAweDAwRkZGRkZGCiAKLS8qIElDSDggR2JFIEZsYXNoIEhhcmR3YXJlIFNlcXVlbmNpbmcgRmxhc2ggU3RhdHVzIFJlZ2lzdGVyIGJpdCBicmVha2Rvd24gKi8KLS8qIE9mZnNldCAwNGggSFNGU1RTICovCi11bmlvbiBpY2g4X2h3c19mbGFzaF9zdGF0dXMgewotICAgIHN0cnVjdCBpY2g4X2hzZnN0cyB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0gICAgICAgIHUxNiByZXNlcnZlZDIgICAgICA6NjsKLSAgICAgICAgdTE2IGZsZGVzdmFsaWQgICAgIDoxOwotICAgICAgICB1MTYgZmxvY2tkbiAgICAgICAgOjE7Ci0gICAgICAgIHUxNiBmbGNkb25lICAgICAgICA6MTsKLSAgICAgICAgdTE2IGZsY2VyciAgICAgICAgIDoxOwotICAgICAgICB1MTYgZGFlbCAgICAgICAgICAgOjE7Ci0gICAgICAgIHUxNiBiZXJhc2VzeiAgICAgICA6MjsKLSAgICAgICAgdTE2IGZsY2lucHJvZyAgICAgIDoxOwotICAgICAgICB1MTYgcmVzZXJ2ZWQxICAgICAgOjI7Ci0jZWxzZQotICAgICAgICB1MTYgZmxjZG9uZSAgICAgICAgOjE7ICAgLyogYml0IDAgRmxhc2ggQ3ljbGUgRG9uZSAqLwotICAgICAgICB1MTYgZmxjZXJyICAgICAgICAgOjE7ICAgLyogYml0IDEgRmxhc2ggQ3ljbGUgRXJyb3IgKi8KLSAgICAgICAgdTE2IGRhZWwgICAgICAgICAgIDoxOyAgIC8qIGJpdCAyIERpcmVjdCBBY2Nlc3MgZXJyb3IgTG9nICovCi0gICAgICAgIHUxNiBiZXJhc2VzeiAgICAgICA6MjsgICAvKiBiaXQgNDozIEJsb2NrL1NlY3RvciBFcmFzZSBTaXplICovCi0gICAgICAgIHUxNiBmbGNpbnByb2cgICAgICA6MTsgICAvKiBiaXQgNSBmbGFzaCBTUEkgY3ljbGUgaW4gUHJvZ3Jlc3MgKi8KLSAgICAgICAgdTE2IHJlc2VydmVkMSAgICAgIDoyOyAgIC8qIGJpdCAxMzo2IFJlc2VydmVkICovCi0gICAgICAgIHUxNiByZXNlcnZlZDIgICAgICA6NjsgICAvKiBiaXQgMTM6NiBSZXNlcnZlZCAqLwotICAgICAgICB1MTYgZmxkZXN2YWxpZCAgICAgOjE7ICAgLyogYml0IDE0IEZsYXNoIERlc2NyaXB0b3IgVmFsaWQgKi8KLSAgICAgICAgdTE2IGZsb2NrZG4gICAgICAgIDoxOyAgIC8qIGJpdCAxNSBGbGFzaCBDb25maWd1cmF0aW9uIExvY2stRG93biAqLwotI2VuZGlmCi0gICAgfSBoc2Zfc3RhdHVzOwotICAgIHUxNiByZWd2YWw7Ci19OwotCi0vKiBJQ0g4IEdiRSBGbGFzaCBIYXJkd2FyZSBTZXF1ZW5jaW5nIEZsYXNoIGNvbnRyb2wgUmVnaXN0ZXIgYml0IGJyZWFrZG93biAqLwotLyogT2Zmc2V0IDA2aCBGTENUTCAqLwotdW5pb24gaWNoOF9od3NfZmxhc2hfY3RybCB7Ci0gICAgc3RydWN0IGljaDhfaHNmbGN0bCB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0gICAgICAgIHUxNiBmbGRiY291bnQgICAgICA6MjsKLSAgICAgICAgdTE2IGZsb2NrZG4gICAgICAgIDo2OwotICAgICAgICB1MTYgZmxjZ28gICAgICAgICAgOjE7Ci0gICAgICAgIHUxNiBmbGN5Y2xlICAgICAgICA6MjsKLSAgICAgICAgdTE2IHJlc2VydmVkICAgICAgIDo1OwotI2Vsc2UKLSAgICAgICAgdTE2IGZsY2dvICAgICAgICAgIDoxOyAgIC8qIDAgRmxhc2ggQ3ljbGUgR28gKi8KLSAgICAgICAgdTE2IGZsY3ljbGUgICAgICAgIDoyOyAgIC8qIDI6MSBGbGFzaCBDeWNsZSAqLwotICAgICAgICB1MTYgcmVzZXJ2ZWQgICAgICAgOjU7ICAgLyogNzozIFJlc2VydmVkICAqLwotICAgICAgICB1MTYgZmxkYmNvdW50ICAgICAgOjI7ICAgLyogOTo4IEZsYXNoIERhdGEgQnl0ZSBDb3VudCAqLwotICAgICAgICB1MTYgZmxvY2tkbiAgICAgICAgOjY7ICAgLyogMTU6MTAgUmVzZXJ2ZWQgKi8KLSNlbmRpZgotICAgIH0gaHNmX2N0cmw7Ci0gICAgdTE2IHJlZ3ZhbDsKLX07Ci0KLS8qIElDSDggRmxhc2ggUmVnaW9uIEFjY2VzcyBQZXJtaXNzaW9ucyAqLwotdW5pb24gaWNoOF9od3NfZmxhc2hfcmVnYWNjIHsKLSAgICBzdHJ1Y3QgaWNoOF9mbHJhY2MgewotI2lmZGVmIF9fQklHX0VORElBTgotICAgICAgICB1MzIgZ213YWcgICAgICAgICAgOjg7Ci0gICAgICAgIHUzMiBnbXJhZyAgICAgICAgICA6ODsKLSAgICAgICAgdTMyIGdyd2EgICAgICAgICAgIDo4OwotICAgICAgICB1MzIgZ3JyYSAgICAgICAgICAgOjg7Ci0jZWxzZQotICAgICAgICB1MzIgZ3JyYSAgICAgICAgICAgOjg7ICAgLyogMDo3IEdiRSByZWdpb24gUmVhZCBBY2Nlc3MgKi8KLSAgICAgICAgdTMyIGdyd2EgICAgICAgICAgIDo4OyAgIC8qIDg6MTUgR2JFIHJlZ2lvbiBXcml0ZSBBY2Nlc3MgKi8KLSAgICAgICAgdTMyIGdtcmFnICAgICAgICAgIDo4OyAgIC8qIDIzOjE2IEdiRSBNYXN0ZXIgUmVhZCBBY2Nlc3MgR3JhbnQgICovCi0gICAgICAgIHUzMiBnbXdhZyAgICAgICAgICA6ODsgICAvKiAzMToyNCBHYkUgTWFzdGVyIFdyaXRlIEFjY2VzcyBHcmFudCAqLwotI2VuZGlmCi0gICAgfSBoc2ZfZmxyZWdhY2M7Ci0gICAgdTE2IHJlZ3ZhbDsKLX07Ci0KIC8qIE1pc2NlbGxhbmVvdXMgUEhZIGJpdCBkZWZpbml0aW9ucy4gKi8KICNkZWZpbmUgUEhZX1BSRUFNQkxFICAgICAgICAweEZGRkZGRkZGCiAjZGVmaW5lIFBIWV9TT0YgICAgICAgICAgICAgMHgwMQpAQCAtMzM4NCwxMCArMzAyOSwxMCBAQAogI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAwICAgIDB4MjAwMAogI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAgICAgIDB4MDAwMAogI2RlZmluZSBFMTAwMF9QSFlfQUREUkVTUyAgIDB4MDEKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX1RJTUUgICA0NSAgLyogNC41IFNlY29uZHMgKi8KLSNkZWZpbmUgUEhZX0ZPUkNFX1RJTUUgICAgICAyMCAgLyogMi4wIFNlY29uZHMgKi8KKyNkZWZpbmUgUEhZX0FVVE9fTkVHX1RJTUUgICA0NQkvKiA0LjUgU2Vjb25kcyAqLworI2RlZmluZSBQSFlfRk9SQ0VfVElNRSAgICAgIDIwCS8qIDIuMCBTZWNvbmRzICovCiAjZGVmaW5lIFBIWV9SRVZJU0lPTl9NQVNLICAgMHhGRkZGRkZGMAotI2RlZmluZSBERVZJQ0VfU1BFRURfTUFTSyAgIDB4MDAwMDAzMDAgIC8qIERldmljZSBDdHJsIFJlZyBTcGVlZCBNYXNrICovCisjZGVmaW5lIERFVklDRV9TUEVFRF9NQVNLICAgMHgwMDAwMDMwMAkvKiBEZXZpY2UgQ3RybCBSZWcgU3BlZWQgTWFzayAqLwogI2RlZmluZSBSRUc0X1NQRUVEX01BU0sgICAgIDB4MDFFMAogI2RlZmluZSBSRUc5X1NQRUVEX01BU0sgICAgIDB4MDMwMAogI2RlZmluZSBBRFZFUlRJU0VfMTBfSEFMRiAgIDB4MDAwMQpAQCAtMzM5Niw4ICszMDQxLDggQEAKICNkZWZpbmUgQURWRVJUSVNFXzEwMF9GVUxMICAweDAwMDgKICNkZWZpbmUgQURWRVJUSVNFXzEwMDBfSEFMRiAweDAwMTAKICNkZWZpbmUgQURWRVJUSVNFXzEwMDBfRlVMTCAweDAwMjAKLSNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVCAweDAwMkYgIC8qIEV2ZXJ5dGhpbmcgYnV0IDEwMDAtSGFsZiAqLwotI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF8xMDBfQUxMICAgIDB4MDAwRiAvKiBBbGwgMTAvMTAwIHNwZWVkcyovCi0jZGVmaW5lIEFVVE9ORUdfQURWRVJUSVNFXzEwX0FMTCAgICAgICAgMHgwMDAzIC8qIDEwTWJwcyBGdWxsICYgSGFsZiBzcGVlZHMqLworI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUIDB4MDAyRgkvKiBFdmVyeXRoaW5nIGJ1dCAxMDAwLUhhbGYgKi8KKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfMTBfMTAwX0FMTCAgICAweDAwMEYJLyogQWxsIDEwLzEwMCBzcGVlZHMgKi8KKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfMTBfQUxMICAgICAgICAweDAwMDMJLyogMTBNYnBzIEZ1bGwgJiBIYWxmIHNwZWVkcyAqLwogCiAjZW5kaWYgLyogX0UxMDAwX0hXX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKaW5kZXggYzY2ZGQ0Zi4uYmNkMTkyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwpAQCAtMzEsNyArMzEsNyBAQAogCiBjaGFyIGUxMDAwX2RyaXZlcl9uYW1lW10gPSAiZTEwMDAiOwogc3RhdGljIGNoYXIgZTEwMDBfZHJpdmVyX3N0cmluZ1tdID0gIkludGVsKFIpIFBSTy8xMDAwIE5ldHdvcmsgRHJpdmVyIjsKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjcuMy4yMS1rMy1OQVBJIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiNy4zLjIxLWs1LU5BUEkiCiBjb25zdCBjaGFyIGUxMDAwX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjb25zdCBjaGFyIGUxMDAwX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA2IEludGVsIENvcnBvcmF0aW9uLiI7CiAKQEAgLTEzMSw3ICsxMzEsNiBAQAogc3RhdGljIGludCBlMTAwMF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KTsKIHN0YXRpYyBpbnQgZTEwMDBfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBlMTAwMF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpOwotc3RhdGljIGlycXJldHVybl90IGUxMDAwX2ludHJfbXNpKGludCBpcnEsIHZvaWQgKmRhdGEpOwogc3RhdGljIGJvb2wgZTEwMDBfY2xlYW5fdHhfaXJxKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgICAgIHN0cnVjdCBlMTAwMF90eF9yaW5nICp0eF9yaW5nKTsKIHN0YXRpYyBpbnQgZTEwMDBfY2xlYW4oc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KTsKQEAgLTI1OCwyNSArMjU3LDE0IEBACiAKIHN0YXRpYyBpbnQgZTEwMDBfcmVxdWVzdF9pcnEoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCWlycV9oYW5kbGVyX3QgaGFuZGxlciA9IGUxMDAwX2ludHI7CiAJaW50IGlycV9mbGFncyA9IElSUUZfU0hBUkVEOwogCWludCBlcnI7CiAKLQlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTcxKSB7Ci0JCWFkYXB0ZXItPmhhdmVfbXNpID0gIXBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpOwotCQlpZiAoYWRhcHRlci0+aGF2ZV9tc2kpIHsKLQkJCWhhbmRsZXIgPSBlMTAwMF9pbnRyX21zaTsKLQkJCWlycV9mbGFncyA9IDA7Ci0JCX0KLQl9Ci0KIAllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIGhhbmRsZXIsIGlycV9mbGFncywgbmV0ZGV2LT5uYW1lLAogCSAgICAgICAgICAgICAgICAgIG5ldGRldik7CiAJaWYgKGVycikgewotCQlpZiAoYWRhcHRlci0+aGF2ZV9tc2kpCi0JCQlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwKIAkJICAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCBFcnJvcjogJWRcbiIsIGVycik7CiAJfQpAQCAtMjg5LDkgKzI3Nyw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAogCWZyZWVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgbmV0ZGV2KTsKLQotCWlmIChhZGFwdGVyLT5oYXZlX21zaSkKLQkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOwogfQogCiAvKioKQEAgLTM0NSw3NiArMzMwLDYgQEAKIAl9CiB9CiAKLS8qKgotICogZTEwMDBfcmVsZWFzZV9od19jb250cm9sIC0gcmVsZWFzZSBjb250cm9sIG9mIHRoZSBoL3cgdG8gZi93Ci0gKiBAYWRhcHRlcjogYWRkcmVzcyBvZiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICoKLSAqIGUxMDAwX3JlbGVhc2VfaHdfY29udHJvbCByZXNldHMge0NUUkxfRVhUfEZXU019OkRSVl9MT0FEIGJpdC4KLSAqIEZvciBBU0YgYW5kIFBhc3MgVGhyb3VnaCB2ZXJzaW9ucyBvZiBmL3cgdGhpcyBtZWFucyB0aGF0IHRoZQotICogZHJpdmVyIGlzIG5vIGxvbmdlciBsb2FkZWQuIEZvciBBTVQgdmVyc2lvbiAob25seSB3aXRoIDgyNTczKSBpCi0gKiBvZiB0aGUgZi93IHRoaXMgbWVhbnMgdGhhdCB0aGUgbmV0d29yayBpL2YgaXMgY2xvc2VkLgotICoKLSAqKi8KLQotc3RhdGljIHZvaWQgZTEwMDBfcmVsZWFzZV9od19jb250cm9sKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBjdHJsX2V4dDsKLQl1MzIgc3dzbTsKLQlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCi0JLyogTGV0IGZpcm13YXJlIHRha2VuIG92ZXIgY29udHJvbCBvZiBoL3cgKi8KLQlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewotCWNhc2UgZTEwMDBfODI1NzM6Ci0JCXN3c20gPSBlcjMyKFNXU00pOwotCQlldzMyKFNXU00sIHN3c20gJiB+RTEwMDBfU1dTTV9EUlZfTE9BRCk7Ci0JCWJyZWFrOwotCWNhc2UgZTEwMDBfODI1NzE6Ci0JY2FzZSBlMTAwMF84MjU3MjoKLQljYXNlIGUxMDAwXzgwMDAzZXMybGFuOgotCWNhc2UgZTEwMDBfaWNoOGxhbjoKLQkJY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKLQkJZXczMihDVFJMX0VYVCwgY3RybF9leHQgJiB+RTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLS8qKgotICogZTEwMDBfZ2V0X2h3X2NvbnRyb2wgLSBnZXQgY29udHJvbCBvZiB0aGUgaC93IGZyb20gZi93Ci0gKiBAYWRhcHRlcjogYWRkcmVzcyBvZiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICoKLSAqIGUxMDAwX2dldF9od19jb250cm9sIHNldHMge0NUUkxfRVhUfEZXU019OkRSVl9MT0FEIGJpdC4KLSAqIEZvciBBU0YgYW5kIFBhc3MgVGhyb3VnaCB2ZXJzaW9ucyBvZiBmL3cgdGhpcyBtZWFucyB0aGF0Ci0gKiB0aGUgZHJpdmVyIGlzIGxvYWRlZC4gRm9yIEFNVCB2ZXJzaW9uIChvbmx5IHdpdGggODI1NzMpCi0gKiBvZiB0aGUgZi93IHRoaXMgbWVhbnMgdGhhdCB0aGUgbmV0d29yayBpL2YgaXMgb3Blbi4KLSAqCi0gKiovCi0KLXN0YXRpYyB2b2lkIGUxMDAwX2dldF9od19jb250cm9sKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBjdHJsX2V4dDsKLQl1MzIgc3dzbTsKLQlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCi0JLyogTGV0IGZpcm13YXJlIGtub3cgdGhlIGRyaXZlciBoYXMgdGFrZW4gb3ZlciAqLwotCXN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0JY2FzZSBlMTAwMF84MjU3MzoKLQkJc3dzbSA9IGVyMzIoU1dTTSk7Ci0JCWV3MzIoU1dTTSwgc3dzbSB8IEUxMDAwX1NXU01fRFJWX0xPQUQpOwotCQlicmVhazsKLQljYXNlIGUxMDAwXzgyNTcxOgotCWNhc2UgZTEwMDBfODI1NzI6Ci0JY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLQljYXNlIGUxMDAwX2ljaDhsYW46Ci0JCWN0cmxfZXh0ID0gZXIzMihDVFJMX0VYVCk7Ci0JCWV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0IHwgRTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGUxMDAwX2luaXRfbWFuYWdlYWJpbGl0eShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtNDI1LDIwICszNDAsNiBAQAogCQkvKiBkaXNhYmxlIGhhcmR3YXJlIGludGVyY2VwdGlvbiBvZiBBUlAgKi8KIAkJbWFuYyAmPSB+KEUxMDAwX01BTkNfQVJQX0VOKTsKIAotCQkvKiBlbmFibGUgcmVjZWl2aW5nIG1hbmFnZW1lbnQgcGFja2V0cyB0byB0aGUgaG9zdCAqLwotCQkvKiB0aGlzIHdpbGwgcHJvYmFibHkgZ2VuZXJhdGUgZGVzdGluYXRpb24gdW5yZWFjaGFibGUgbWVzc2FnZXMKLQkJICogZnJvbSB0aGUgaG9zdCBPUywgYnV0IHRoZSBwYWNrZXRzIHdpbGwgYmUgaGFuZGxlZCBvbiBTTUJVUyAqLwotCQlpZiAoaHctPmhhc19tYW5jMmgpIHsKLQkJCXUzMiBtYW5jMmggPSBlcjMyKE1BTkMySCk7Ci0KLQkJCW1hbmMgfD0gRTEwMDBfTUFOQ19FTl9NTkcySE9TVDsKLSNkZWZpbmUgRTEwMDBfTU5HMkhPU1RfUE9SVF82MjMgKDEgPDwgNSkKLSNkZWZpbmUgRTEwMDBfTU5HMkhPU1RfUE9SVF82NjQgKDEgPDwgNikKLQkJCW1hbmMyaCB8PSBFMTAwMF9NTkcySE9TVF9QT1JUXzYyMzsKLQkJCW1hbmMyaCB8PSBFMTAwMF9NTkcySE9TVF9QT1JUXzY2NDsKLQkJCWV3MzIoTUFOQzJILCBtYW5jMmgpOwotCQl9Ci0KIAkJZXczMihNQU5DLCBtYW5jKTsKIAl9CiB9CkBAIC00NTMsMTIgKzM1NCw2IEBACiAJCS8qIHJlLWVuYWJsZSBoYXJkd2FyZSBpbnRlcmNlcHRpb24gb2YgQVJQICovCiAJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CiAKLQkJaWYgKGh3LT5oYXNfbWFuYzJoKQotCQkJbWFuYyAmPSB+RTEwMDBfTUFOQ19FTl9NTkcySE9TVDsKLQotCQkvKiBkb24ndCBleHBsaWNpdGx5IGhhdmUgdG8gbWVzcyB3aXRoIE1BTkMySCBzaW5jZQotCQkgKiBNQU5DIGhhcyBhbiBlbmFibGUgZGlzYWJsZSB0aGF0IGdhdGVzIE1BTkMySCAqLwotCiAJCWV3MzIoTUFOQywgbWFuYyk7CiAJfQogfQpAQCAtNTYzLDE1ICs0NTgsNiBAQAogCQkJaWYgKGVyMzIoTUFOQykgJiBFMTAwMF9NQU5DX1NNQlVTX0VOKQogCQkJCWdvdG8gb3V0OwogCQkJYnJlYWs7Ci0JCWNhc2UgZTEwMDBfODI1NzE6Ci0JCWNhc2UgZTEwMDBfODI1NzI6Ci0JCWNhc2UgZTEwMDBfODI1NzM6Ci0JCWNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0JCWNhc2UgZTEwMDBfaWNoOGxhbjoKLQkJCWlmIChlMTAwMF9jaGVja19tbmdfbW9kZShodykgfHwKLQkJCSAgICBlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soaHcpKQotCQkJCWdvdG8gb3V0OwotCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNTk5LDggKzQ4NSw3IEBACiAJZXczMihSQ1RMLCByY3RsICYgfkUxMDAwX1JDVExfRU4pOwogCS8qIGZsdXNoIGFuZCBzbGVlcCBiZWxvdyAqLwogCi0JLyogY2FuIGJlIG5ldGlmX3R4X2Rpc2FibGUgd2hlbiBORVRJRl9GX0xMVFggaXMgcmVtb3ZlZCAqLwotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwluZXRpZl90eF9kaXNhYmxlKG5ldGRldik7CiAKIAkvKiBkaXNhYmxlIHRyYW5zbWl0cyBpbiB0aGUgaGFyZHdhcmUgKi8KIAl0Y3RsID0gZXIzMihUQ1RMKTsKQEAgLTY3MSwxNiArNTU2LDYgQEAKIAkJbGVnYWN5X3BiYV9hZGp1c3QgPSB0cnVlOwogCQlwYmEgPSBFMTAwMF9QQkFfMzBLOwogCQlicmVhazsKLQljYXNlIGUxMDAwXzgyNTcxOgotCWNhc2UgZTEwMDBfODI1NzI6Ci0JY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLQkJcGJhID0gRTEwMDBfUEJBXzM4SzsKLQkJYnJlYWs7Ci0JY2FzZSBlMTAwMF84MjU3MzoKLQkJcGJhID0gRTEwMDBfUEJBXzIwSzsKLQkJYnJlYWs7Ci0JY2FzZSBlMTAwMF9pY2g4bGFuOgotCQlwYmEgPSBFMTAwMF9QQkFfOEs7CiAJY2FzZSBlMTAwMF91bmRlZmluZWQ6CiAJY2FzZSBlMTAwMF9udW1fbWFjczoKIAkJYnJlYWs7CkBAIC03NDQsMTYgKzYxOSw4IEBACiAKIAkJCS8qIGlmIHNob3J0IG9uIHJ4IHNwYWNlLCByeCB3aW5zIGFuZCBtdXN0IHRydW1wIHR4CiAJCQkgKiBhZGp1c3RtZW50IG9yIHVzZSBFYXJseSBSZWNlaXZlIGlmIGF2YWlsYWJsZSAqLwotCQkJaWYgKHBiYSA8IG1pbl9yeF9zcGFjZSkgewotCQkJCXN3aXRjaCAoaHctPm1hY190eXBlKSB7Ci0JCQkJY2FzZSBlMTAwMF84MjU3MzoKLQkJCQkJLyogRVJUIGVuYWJsZWQgaW4gZTEwMDBfY29uZmlndXJlX3J4ICovCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBiYSA9IG1pbl9yeF9zcGFjZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQorCQkJaWYgKHBiYSA8IG1pbl9yeF9zcGFjZSkKKwkJCQlwYmEgPSBtaW5fcnhfc3BhY2U7CiAJCX0KIAl9CiAKQEAgLTc4OSw3ICs2NTYsNiBAQAogCiAJLyogaWYgKGFkYXB0ZXItPmh3ZmxhZ3MgJiBIV0ZMQUdTX1BIWV9QV1JfQklUKSB7ICovCiAJaWYgKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCAmJgotCSAgICBody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIgJiYKIAkgICAgaHctPmF1dG9uZWcgPT0gMSAmJgogCSAgICBody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFEVkVSVElTRV8xMDAwX0ZVTEwpIHsKIAkJdTMyIGN0cmwgPSBlcjMyKENUUkwpOwpAQCAtODA2LDIwICs2NzIsNiBAQAogCWUxMDAwX3Jlc2V0X2FkYXB0aXZlKGh3KTsKIAllMTAwMF9waHlfZ2V0X2luZm8oaHcsICZhZGFwdGVyLT5waHlfaW5mbyk7CiAKLQlpZiAoIWFkYXB0ZXItPnNtYXJ0X3Bvd2VyX2Rvd24gJiYKLQkgICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MSB8fAotCSAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcyKSkgewotCQl1MTYgcGh5X2RhdGEgPSAwOwotCQkvKiBzcGVlZCB1cCB0aW1lIHRvIGxpbmsgYnkgZGlzYWJsaW5nIHNtYXJ0IHBvd2VyIGRvd24sIGlnbm9yZQotCQkgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSB0aGVyZSBpcyBub3RoaW5nCi0JCSAqIGRpZmZlcmVudCB3ZSB3b3VsZCBkbyBpZiBpdCBmYWlsZWQgKi8KLQkJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMkUxMDAwX1BIWV9QT1dFUl9NR01ULAotCQkgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKLQkJcGh5X2RhdGEgJj0gfklHUDAyRTEwMDBfUE1fU1BEOwotCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMkUxMDAwX1BIWV9QT1dFUl9NR01ULAotCQkgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKLQl9Ci0KIAllMTAwMF9yZWxlYXNlX21hbmFnZWFiaWxpdHkoYWRhcHRlcik7CiB9CiAKQEAgLTEwNDYsMTcgKzg5OCw2IEBACiAJCWdvdG8gZXJyX3N3X2luaXQ7CiAKIAllcnIgPSAtRUlPOwotCS8qIEZsYXNoIEJBUiBtYXBwaW5nIG11c3QgaGFwcGVuIGFmdGVyIGUxMDAwX3N3X2luaXQKLQkgKiBiZWNhdXNlIGl0IGRlcGVuZHMgb24gbWFjX3R5cGUgKi8KLQlpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSAmJgotCSAgIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSkgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJaHctPmZsYXNoX2FkZHJlc3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMSk7Ci0JCWlmICghaHctPmZsYXNoX2FkZHJlc3MpCi0JCQlnb3RvIGVycl9mbGFzaG1hcDsKLQl9Ci0KLQlpZiAoZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKGh3KSkKLQkJRFBSSU5USyhQUk9CRSwgSU5GTywgIlBIWSByZXNldCBpcyBibG9ja2VkIGR1ZSB0byBTT0wvSURFUiBzZXNzaW9uLlxuIik7CiAKIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CiAJCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKQEAgLTEwNjQsMjEgKzkwNSwxNiBAQAogCQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9UWCB8CiAJCQkJICAgTkVUSUZfRl9IV19WTEFOX1JYIHwKIAkJCQkgICBORVRJRl9GX0hXX1ZMQU5fRklMVEVSOwotCQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCi0JCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX1ZMQU5fRklMVEVSOwogCX0KIAogCWlmICgoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KSAmJgogCSAgIChody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NDcpKQogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwogCi0JaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKQotCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKIAlpZiAocGNpX3VzaW5nX2RhYykKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKIAluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0JbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKIAluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOwogCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX1NHOwogCkBAIC0xMTUzLDE1ICs5ODksOCBAQAogCQkJRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHLCAxLCAmZWVwcm9tX2RhdGEpOwogCQllZXByb21fYXBtZV9tYXNrID0gRTEwMDBfRUVQUk9NXzgyNTQ0X0FQTTsKIAkJYnJlYWs7Ci0JY2FzZSBlMTAwMF9pY2g4bGFuOgotCQllMTAwMF9yZWFkX2VlcHJvbShodywKLQkJCUVFUFJPTV9JTklUX0NPTlRST0wxX1JFRywgMSwgJmVlcHJvbV9kYXRhKTsKLQkJZWVwcm9tX2FwbWVfbWFzayA9IEUxMDAwX0VFUFJPTV9JQ0g4X0FQTUU7Ci0JCWJyZWFrOwogCWNhc2UgZTEwMDBfODI1NDY6CiAJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKLQljYXNlIGUxMDAwXzgyNTcxOgotCWNhc2UgZTEwMDBfODAwMDNlczJsYW46CiAJCWlmIChlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKXsKIAkJCWUxMDAwX3JlYWRfZWVwcm9tKGh3LAogCQkJCUVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQiwgMSwgJmVlcHJvbV9kYXRhKTsKQEAgLTExODUsMTcgKzEwMTQsMTIgQEAKIAkJYnJlYWs7CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX0ZJQkVSOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfRklCRVI6CiAJCS8qIFdha2UgZXZlbnRzIG9ubHkgc3VwcG9ydGVkIG9uIHBvcnQgQSBmb3IgZHVhbCBmaWJlcgogCQkgKiByZWdhcmRsZXNzIG9mIGVlcHJvbSBzZXR0aW5nICovCiAJCWlmIChlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKQogCQkJYWRhcHRlci0+ZWVwcm9tX3dvbCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVJfS1NQMzoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSOgotCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9GSUJFUjoKLQljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSX0xPV1BST0ZJTEU6Ci0JY2FzZSBFMTAwMF9ERVZfSURfODI1NzFQVF9RVUFEX0NPUFBFUjoKIAkJLyogaWYgcXVhZCBwb3J0IGFkYXB0ZXIsIGRpc2FibGUgV29MIG9uIGFsbCBidXQgcG9ydCBBICovCiAJCWlmIChnbG9iYWxfcXVhZF9wb3J0X2EgIT0gMCkKIAkJCWFkYXB0ZXItPmVlcHJvbV93b2wgPSAwOwpAQCAtMTIxMywzOSArMTAzNywxOCBAQAogCiAJLyogcHJpbnQgYnVzIHR5cGUvc3BlZWQvd2lkdGggaW5mbyAqLwogCURQUklOVEsoUFJPQkUsIElORk8sICIoUENJJXM6JXM6JXMpICIsCi0JCSgoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpID8gIi1YIiA6Ci0JCSAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzID8gIiBFeHByZXNzIjoiIikpLAotCQkoKGh3LT5idXNfc3BlZWQgPT0gZTEwMDBfYnVzX3NwZWVkXzI1MDApID8gIjIuNUdiL3MiIDoKLQkJIChody0+YnVzX3NwZWVkID09IGUxMDAwX2J1c19zcGVlZF8xMzMpID8gIjEzM01IeiIgOgorCQkoKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KSA/ICItWCIgOiAiIiksCisJCSgoaHctPmJ1c19zcGVlZCA9PSBlMTAwMF9idXNfc3BlZWRfMTMzKSA/ICIxMzNNSHoiIDoKIAkJIChody0+YnVzX3NwZWVkID09IGUxMDAwX2J1c19zcGVlZF8xMjApID8gIjEyME1IeiIgOgogCQkgKGh3LT5idXNfc3BlZWQgPT0gZTEwMDBfYnVzX3NwZWVkXzEwMCkgPyAiMTAwTUh6IiA6CiAJCSAoaHctPmJ1c19zcGVlZCA9PSBlMTAwMF9idXNfc3BlZWRfNjYpID8gIjY2TUh6IiA6ICIzM01IeiIpLAotCQkoKGh3LT5idXNfd2lkdGggPT0gZTEwMDBfYnVzX3dpZHRoXzY0KSA/ICI2NC1iaXQiIDoKLQkJIChody0+YnVzX3dpZHRoID09IGUxMDAwX2J1c193aWR0aF9wY2lleF80KSA/ICJXaWR0aCB4NCIgOgotCQkgKGh3LT5idXNfd2lkdGggPT0gZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzEpID8gIldpZHRoIHgxIiA6Ci0JCSAiMzItYml0IikpOworCQkoKGh3LT5idXNfd2lkdGggPT0gZTEwMDBfYnVzX3dpZHRoXzY0KSA/ICI2NC1iaXQiIDogIjMyLWJpdCIpKTsKIAogCXByaW50aygiJXBNXG4iLCBuZXRkZXYtPmRldl9hZGRyKTsKIAotCWlmIChody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpX2V4cHJlc3MpIHsKLQkJRFBSSU5USyhQUk9CRSwgV0FSTklORywgIlRoaXMgZGV2aWNlIChpZCAlMDR4OiUwNHgpIHdpbGwgbm8gIgotCQkJImxvbmdlciBiZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgaW4gdGhlIGZ1dHVyZS5cbiIsCi0JCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSk7Ci0JCURQUklOVEsoUFJPQkUsIFdBUk5JTkcsICJwbGVhc2UgdXNlIHRoZSBcImUxMDAwZVwiICIKLQkJCSJkcml2ZXIgaW5zdGVhZC5cbiIpOwotCX0KLQogCS8qIHJlc2V0IHRoZSBoYXJkd2FyZSB3aXRoIHRoZSBuZXcgc2V0dGluZ3MgKi8KIAllMTAwMF9yZXNldChhZGFwdGVyKTsKIAotCS8qIElmIHRoZSBjb250cm9sbGVyIGlzIDgyNTczIGFuZCBmL3cgaXMgQU1ULCBkbyBub3Qgc2V0Ci0JICogRFJWX0xPQUQgdW50aWwgdGhlIGludGVyZmFjZSBpcyB1cC4gIEZvciBhbGwgb3RoZXIgY2FzZXMsCi0JICogbGV0IHRoZSBmL3cga25vdyB0aGF0IHRoZSBoL3cgaXMgbm93IHVuZGVyIHRoZSBjb250cm9sCi0JICogb2YgdGhlIGRyaXZlci4gKi8KLQlpZiAoaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTczIHx8Ci0JICAgICFlMTAwMF9jaGVja19tbmdfbW9kZShodykpCi0JCWUxMDAwX2dldF9od19jb250cm9sKGFkYXB0ZXIpOwotCiAJc3RyY3B5KG5ldGRldi0+bmFtZSwgImV0aCVkIik7CiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAJaWYgKGVycikKQEAgLTEyNjAsMTQgKzEwNjMsMTEgQEAKIAlyZXR1cm4gMDsKIAogZXJyX3JlZ2lzdGVyOgotCWUxMDAwX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKIGVycl9lZXByb206Ci0JaWYgKCFlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soaHcpKQotCQllMTAwMF9waHlfaHdfcmVzZXQoaHcpOworCWUxMDAwX3BoeV9od19yZXNldChodyk7CiAKIAlpZiAoaHctPmZsYXNoX2FkZHJlc3MpCiAJCWlvdW5tYXAoaHctPmZsYXNoX2FkZHJlc3MpOwotZXJyX2ZsYXNobWFwOgogCWtmcmVlKGFkYXB0ZXItPnR4X3JpbmcpOwogCWtmcmVlKGFkYXB0ZXItPnJ4X3JpbmcpOwogZXJyX3N3X2luaXQ6CkBAIC0xMjk4LDE4ICsxMDk4LDE4IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKKwlzZXRfYml0KF9fRTEwMDBfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKTsKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+dHhfZmlmb19zdGFsbF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+cGh5X2luZm9fdGltZXIpOworCiAJY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+cmVzZXRfdGFzayk7CiAKIAllMTAwMF9yZWxlYXNlX21hbmFnZWFiaWxpdHkoYWRhcHRlcik7CiAKLQkvKiBSZWxlYXNlIGNvbnRyb2wgb2YgaC93IHRvIGYvdy4gIElmIGYvdyBpcyBBTVQgZW5hYmxlZCwgdGhpcwotCSAqIHdvdWxkIGhhdmUgYWxyZWFkeSBoYXBwZW5lZCBpbiBjbG9zZSBhbmQgaXMgcmVkdW5kYW50LiAqLwotCWUxMDAwX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKLQogCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAKLQlpZiAoIWUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jayhodykpCi0JCWUxMDAwX3BoeV9od19yZXNldChodyk7CisJZTEwMDBfcGh5X2h3X3Jlc2V0KGh3KTsKIAogCWtmcmVlKGFkYXB0ZXItPnR4X3JpbmcpOwogCWtmcmVlKGFkYXB0ZXItPnJ4X3JpbmcpOwpAQCAtMTQ3MiwxMiArMTI3Miw2IEBACiAJCWUxMDAwX3VwZGF0ZV9tbmdfdmxhbihhZGFwdGVyKTsKIAl9CiAKLQkvKiBJZiBBTVQgaXMgZW5hYmxlZCwgbGV0IHRoZSBmaXJtd2FyZSBrbm93IHRoYXQgdGhlIG5ldHdvcmsKLQkgKiBpbnRlcmZhY2UgaXMgbm93IG9wZW4gKi8KLQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczICYmCi0JICAgIGUxMDAwX2NoZWNrX21uZ19tb2RlKGh3KSkKLQkJZTEwMDBfZ2V0X2h3X2NvbnRyb2woYWRhcHRlcik7Ci0KIAkvKiBiZWZvcmUgd2UgYWxsb2NhdGUgYW4gaW50ZXJydXB0LCB3ZSBtdXN0IGJlIHJlYWR5IHRvIGhhbmRsZSBpdC4KIAkgKiBTZXR0aW5nIERFQlVHX1NISVJRIGluIHRoZSBrZXJuZWwgbWFrZXMgaXQgZmlyZSBhbiBpbnRlcnJ1cHQKIAkgKiBhcyBzb29uIGFzIHdlIGNhbGwgcGNpX3JlcXVlc3RfaXJxLCBzbyB3ZSBoYXZlIHRvIHNldHVwIG91cgpAQCAtMTUwMyw3ICsxMjk3LDYgQEAKIAlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIAogZXJyX3JlcV9pcnE6Ci0JZTEwMDBfcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwogCWUxMDAwX3Bvd2VyX2Rvd25fcGh5KGFkYXB0ZXIpOwogCWUxMDAwX2ZyZWVfYWxsX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKIGVycl9zZXR1cF9yeDoKQEAgLTE1NDgsMTIgKzEzNDEsNiBAQAogCQllMTAwMF92bGFuX3J4X2tpbGxfdmlkKG5ldGRldiwgYWRhcHRlci0+bW5nX3ZsYW5faWQpOwogCX0KIAotCS8qIElmIEFNVCBpcyBlbmFibGVkLCBsZXQgdGhlIGZpcm13YXJlIGtub3cgdGhhdCB0aGUgbmV0d29yawotCSAqIGludGVyZmFjZSBpcyBub3cgY2xvc2VkICovCi0JaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MyAmJgotCSAgICBlMTAwMF9jaGVja19tbmdfbW9kZShodykpCi0JCWUxMDAwX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xNjkyLDcgKzE0NzksNyBAQAogewogCXU2NCB0ZGJhOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0JdTMyIHRkbGVuLCB0Y3RsLCB0aXBnLCB0YXJjOworCXUzMiB0ZGxlbiwgdGN0bCwgdGlwZzsKIAl1MzIgaXBncjEsIGlwZ3IyOwogCiAJLyogU2V0dXAgdGhlIEhXIFR4IEhlYWQgYW5kIFRhaWwgZGVzY3JpcHRvciBwb2ludGVycyAqLwpAQCAtMTcxNCw4ICsxNTAxLDcgQEAKIAl9CiAKIAkvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgVHggSW50ZXIgUGFja2V0IEdhcCB0aW1lciAqLwotCWlmIChody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIgJiYKLQkgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIgfHwKKwlpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIgfHwKIAkgICAgIGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkKIAkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdUX0ZJQkVSOwogCWVsc2UKQEAgLTE3MjgsMTAgKzE1MTQsNiBAQAogCQlpcGdyMSA9IERFRkFVTFRfODI1NDJfVElQR19JUEdSMTsKIAkJaXBncjIgPSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjI7CiAJCWJyZWFrOwotCWNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0JCWlwZ3IxID0gREVGQVVMVF84MjU0M19USVBHX0lQR1IxOwotCQlpcGdyMiA9IERFRkFVTFRfODAwMDNFUzJMQU5fVElQR19JUEdSMjsKLQkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJaXBncjEgPSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHUjE7CiAJCWlwZ3IyID0gREVGQVVMVF84MjU0M19USVBHX0lQR1IyOwpAQCAtMTc1NCwyMSArMTUzNiw2IEBACiAJdGN0bCB8PSBFMTAwMF9UQ1RMX1BTUCB8IEUxMDAwX1RDVExfUlRMQyB8CiAJCShFMTAwMF9DT0xMSVNJT05fVEhSRVNIT0xEIDw8IEUxMDAwX0NUX1NISUZUKTsKIAotCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzEgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcyKSB7Ci0JCXRhcmMgPSBlcjMyKFRBUkMwKTsKLQkJLyogc2V0IHRoZSBzcGVlZCBtb2RlIGJpdCwgd2UnbGwgY2xlYXIgaXQgaWYgd2UncmUgbm90IGF0Ci0JCSAqIGdpZ2FiaXQgbGluayBsYXRlciAqLwotCQl0YXJjIHw9ICgxIDw8IDIxKTsKLQkJZXczMihUQVJDMCwgdGFyYyk7Ci0JfSBlbHNlIGlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pIHsKLQkJdGFyYyA9IGVyMzIoVEFSQzApOwotCQl0YXJjIHw9IDE7Ci0JCWV3MzIoVEFSQzAsIHRhcmMpOwotCQl0YXJjID0gZXIzMihUQVJDMSk7Ci0JCXRhcmMgfD0gMTsKLQkJZXczMihUQVJDMSwgdGFyYyk7Ci0JfQotCiAJZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKIAogCS8qIFNldHVwIFRyYW5zbWl0IERlc2NyaXB0b3IgU2V0dGluZ3MgZm9yIGVvcCBkZXNjcmlwdG9yICovCkBAIC0xODA0LDcgKzE1NzEsNiBAQAogc3RhdGljIGludCBlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeGRyKQogewotCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCWludCBzaXplLCBkZXNjX2xlbjsKIApAQCAtMTgxNywxMCArMTU4Myw3IEBACiAJfQogCW1lbXNldChyeGRyLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CiAKLQlpZiAoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKQotCQlkZXNjX2xlbiA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYyk7Ci0JZWxzZQotCQlkZXNjX2xlbiA9IHNpemVvZih1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCk7CisJZGVzY19sZW4gPSBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOwogCiAJLyogUm91bmQgdXAgdG8gbmVhcmVzdCA0SyAqLwogCkBAIC0xOTc3LDcgKzE3NDAsNyBAQAogewogCXU2NCByZGJhOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0JdTMyIHJkbGVuLCByY3RsLCByeGNzdW0sIGN0cmxfZXh0OworCXUzMiByZGxlbiwgcmN0bCwgcnhjc3VtOwogCiAJaWYgKGFkYXB0ZXItPm5ldGRldi0+bXR1ID4gRVRIX0RBVEFfTEVOKSB7CiAJCXJkbGVuID0gYWRhcHRlci0+cnhfcmluZ1swXS5jb3VudCAqCkBAIC0yMDA0LDE3ICsxNzY3LDYgQEAKIAkJCWV3MzIoSVRSLCAxMDAwMDAwMDAwIC8gKGFkYXB0ZXItPml0ciAqIDI1NikpOwogCX0KIAotCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpIHsKLQkJY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKLQkJLyogUmVzZXQgZGVsYXkgdGltZXJzIGFmdGVyIGV2ZXJ5IGludGVycnVwdCAqLwotCQljdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9JTlRfVElNRVJfQ0xSOwotCQkvKiBBdXRvLU1hc2sgaW50ZXJydXB0cyB1cG9uIElDUiBhY2Nlc3MgKi8KLQkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfSUFNRTsKLQkJZXczMihJQU0sIDB4ZmZmZmZmZmYpOwotCQlldzMyKENUUkxfRVhULCBjdHJsX2V4dCk7Ci0JCUUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0JfQotCiAJLyogU2V0dXAgdGhlIEhXIFJ4IEhlYWQgYW5kIFRhaWwgRGVzY3JpcHRvciBQb2ludGVycyBhbmQKIAkgKiB0aGUgQmFzZSBhbmQgTGVuZ3RoIG9mIHRoZSBSeCBEZXNjcmlwdG9yIFJpbmcgKi8KIAlzd2l0Y2ggKGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpIHsKQEAgLTIzMjksMjIgKzIwODEsNiBAQAogCiAJZTEwMDBfcmFyX3NldChodywgaHctPm1hY19hZGRyLCAwKTsKIAotCS8qIFdpdGggODI1NzEgY29udHJvbGxlcnMsIExBQSBtYXkgYmUgb3ZlcndyaXR0ZW4gKHdpdGggdGhlIGRlZmF1bHQpCi0JICogZHVlIHRvIGNvbnRyb2xsZXIgcmVzZXQgZnJvbSB0aGUgb3RoZXIgcG9ydC4gKi8KLQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcxKSB7Ci0JCS8qIGFjdGl2YXRlIHRoZSB3b3JrIGFyb3VuZCAqLwotCQlody0+bGFhX2lzX3ByZXNlbnQgPSAxOwotCi0JCS8qIEhvbGQgYSBjb3B5IG9mIHRoZSBMQUEgaW4gUkFSWzE0XSBUaGlzIGlzIGRvbmUgc28gdGhhdAotCQkgKiBiZXR3ZWVuIHRoZSB0aW1lIFJBUlswXSBnZXRzIGNsb2JiZXJlZCAgYW5kIHRoZSB0aW1lIGl0Ci0JCSAqIGdldHMgZml4ZWQgKGluIGUxMDAwX3dhdGNoZG9nKSwgdGhlIGFjdHVhbCBMQUEgaXMgaW4gb25lCi0JCSAqIG9mIHRoZSBSQVJzIGFuZCBubyBpbmNvbWluZyBwYWNrZXRzIGRpcmVjdGVkIHRvIHRoaXMgcG9ydAotCQkgKiBhcmUgZHJvcHBlZC4gRXZlbnRhdWxseSB0aGUgTEFBIHdpbGwgYmUgaW4gUkFSWzBdIGFuZAotCQkgKiBSQVJbMTRdICovCi0JCWUxMDAwX3Jhcl9zZXQoaHcsIGh3LT5tYWNfYWRkciwKLQkJCQkJRTEwMDBfUkFSX0VOVFJJRVMgLSAxKTsKLQl9Ci0KIAlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKIAkJZTEwMDBfbGVhdmVfODI1NDJfcnN0KGFkYXB0ZXIpOwogCkBAIC0yMzcxLDkgKzIxMDcsNyBAQAogCXUzMiByY3RsOwogCXUzMiBoYXNoX3ZhbHVlOwogCWludCBpLCByYXJfZW50cmllcyA9IEUxMDAwX1JBUl9FTlRSSUVTOwotCWludCBtdGFfcmVnX2NvdW50ID0gKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuKSA/Ci0JCQkJRTEwMDBfTlVNX01UQV9SRUdJU1RFUlNfSUNIOExBTiA6Ci0JCQkJRTEwMDBfTlVNX01UQV9SRUdJU1RFUlM7CisJaW50IG10YV9yZWdfY291bnQgPSBFMTAwMF9OVU1fTVRBX1JFR0lTVEVSUzsKIAl1MzIgKm1jYXJyYXkgPSBrY2FsbG9jKG10YV9yZWdfY291bnQsIHNpemVvZih1MzIpLCBHRlBfQVRPTUlDKTsKIAogCWlmICghbWNhcnJheSkgewpAQCAtMjM4MSwxMyArMjExNSw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCi0JCXJhcl9lbnRyaWVzID0gRTEwMDBfUkFSX0VOVFJJRVNfSUNIOExBTjsKLQotCS8qIHJlc2VydmUgUkFSWzE0XSBmb3IgTEFBIG92ZXItd3JpdGUgd29yay1hcm91bmQgKi8KLQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcxKQotCQlyYXJfZW50cmllcy0tOwotCiAJLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCiAKIAlyY3RsID0gZXIzMihSQ1RMKTsKQEAgLTIzOTYsMTUgKzIxMjMsMTMgQEAKIAkJcmN0bCB8PSAoRTEwMDBfUkNUTF9VUEUgfCBFMTAwMF9SQ1RMX01QRSk7CiAJCXJjdGwgJj0gfkUxMDAwX1JDVExfVkZFOwogCX0gZWxzZSB7Ci0JCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQogCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX01QRTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJcmN0bCAmPSB+RTEwMDBfUkNUTF9NUEU7Ci0JCX0KLQkJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlICE9IGUxMDAwX2ljaDhsYW4pCi0JCQkvKiBFbmFibGUgVkxBTiBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBWTEFOICovCi0JCQlpZiAoYWRhcHRlci0+dmxncnApCi0JCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1ZGRTsKKwkJLyogRW5hYmxlIFZMQU4gZmlsdGVyIGlmIHRoZXJlIGlzIGEgVkxBTiAqLworCQlpZiAoYWRhcHRlci0+dmxncnApCisJCQlyY3RsIHw9IEUxMDAwX1JDVExfVkZFOwogCX0KIAogCWlmIChuZXRkZXYtPnVjLmNvdW50ID4gcmFyX2VudHJpZXMgLSAxKSB7CkBAIC0yNDI3LDcgKzIxNTIsNiBAQAogCSAqCiAJICogUkFSIDAgaXMgdXNlZCBmb3IgdGhlIHN0YXRpb24gTUFDIGFkZGRyZXNzCiAJICogaWYgdGhlcmUgYXJlIG5vdCAxNCBhZGRyZXNzZXMsIGdvIGFoZWFkIGFuZCBjbGVhciB0aGUgZmlsdGVycwotCSAqIC0tIHdpdGggODI1NzEgY29udHJvbGxlcnMgb25seSAwLTEzIGVudHJpZXMgYXJlIGZpbGxlZCBoZXJlCiAJICovCiAJaSA9IDE7CiAJaWYgKHVzZV91YykKQEAgLTI1MjEsMTIgKzIyNDUsNDYgQEAKIAkJCWFkYXB0ZXItPnR4X2ZpZm9faGVhZCA9IDA7CiAJCQlhdG9taWNfc2V0KCZhZGFwdGVyLT50eF9maWZvX3N0YWxsLCAwKTsKIAkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKLQkJfSBlbHNlIHsKKwkJfSBlbHNlIGlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKSB7CiAJCQltb2RfdGltZXIoJmFkYXB0ZXItPnR4X2ZpZm9fc3RhbGxfdGltZXIsIGppZmZpZXMgKyAxKTsKIAkJfQogCX0KIH0KIAorc3RhdGljIGJvb2wgZTEwMDBfaGFzX2xpbmsoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlib29sIGxpbmtfYWN0aXZlID0gZmFsc2U7CisKKwkvKiBnZXRfbGlua19zdGF0dXMgaXMgc2V0IG9uIExTQyAobGluayBzdGF0dXMpIGludGVycnVwdCBvcgorCSAqIHJ4IHNlcXVlbmNlIGVycm9yIGludGVycnVwdC4gIGdldF9saW5rX3N0YXR1cyB3aWxsIHN0YXkKKwkgKiBmYWxzZSB1bnRpbCB0aGUgZTEwMDBfY2hlY2tfZm9yX2xpbmsgZXN0YWJsaXNoZXMgbGluaworCSAqIGZvciBjb3BwZXIgYWRhcHRlcnMgT05MWQorCSAqLworCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwljYXNlIGUxMDAwX21lZGlhX3R5cGVfY29wcGVyOgorCQlpZiAoaHctPmdldF9saW5rX3N0YXR1cykgeworCQkJZTEwMDBfY2hlY2tfZm9yX2xpbmsoaHcpOworCQkJbGlua19hY3RpdmUgPSAhaHctPmdldF9saW5rX3N0YXR1czsKKwkJfSBlbHNlIHsKKwkJCWxpbmtfYWN0aXZlID0gdHJ1ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIGUxMDAwX21lZGlhX3R5cGVfZmliZXI6CisJCWUxMDAwX2NoZWNrX2Zvcl9saW5rKGh3KTsKKwkJbGlua19hY3RpdmUgPSAhIShlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfTFUpOworCQlicmVhazsKKwljYXNlIGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzOgorCQllMTAwMF9jaGVja19mb3JfbGluayhodyk7CisJCWxpbmtfYWN0aXZlID0gaHctPnNlcmRlc19oYXNfbGluazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxpbmtfYWN0aXZlOworfQorCiAvKioKICAqIGUxMDAwX3dhdGNoZG9nIC0gVGltZXIgQ2FsbC1iYWNrCiAgKiBAZGF0YTogcG9pbnRlciB0byBhZGFwdGVyIGNhc3QgaW50byBhbiB1bnNpZ25lZCBsb25nCkBAIC0yNTM4LDMzICsyMjk2LDE2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgZTEwMDBfdHhfcmluZyAqdHhkciA9IGFkYXB0ZXItPnR4X3Jpbmc7CiAJdTMyIGxpbmssIHRjdGw7Ci0JczMyIHJldF92YWw7CiAKLQlyZXRfdmFsID0gZTEwMDBfY2hlY2tfZm9yX2xpbmsoaHcpOwotCWlmICgocmV0X3ZhbCA9PSBFMTAwMF9FUlJfUEhZKSAmJgotCSAgICAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3BfMykgJiYKLQkgICAgKGVyMzIoQ1RSTCkgJiBFMTAwMF9QSFlfQ1RSTF9HQkVfRElTQUJMRSkpIHsKLQkJLyogU2VlIGUxMDAwX2t1bWVyYW5fbG9ja19sb3NzX3dvcmthcm91bmQoKSAqLwotCQlEUFJJTlRLKExJTkssIElORk8sCi0JCQkiR2lnYWJpdCBoYXMgYmVlbiBkaXNhYmxlZCwgZG93bmdyYWRpbmcgc3BlZWRcbiIpOwotCX0KLQotCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpIHsKLQkJZTEwMDBfZW5hYmxlX3R4X3BrdF9maWx0ZXJpbmcoaHcpOwotCQlpZiAoYWRhcHRlci0+bW5nX3ZsYW5faWQgIT0gaHctPm1uZ19jb29raWUudmxhbl9pZCkKLQkJCWUxMDAwX3VwZGF0ZV9tbmdfdmxhbihhZGFwdGVyKTsKLQl9Ci0KLQlpZiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgotCSAgICEoZXIzMihUWENXKSAmIEUxMDAwX1RYQ1dfQU5FKSkKLQkJbGluayA9ICFody0+c2VyZGVzX2xpbmtfZG93bjsKLQllbHNlCi0JCWxpbmsgPSBlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfTFU7CisJbGluayA9IGUxMDAwX2hhc19saW5rKGFkYXB0ZXIpOworCWlmICgobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSAmJiBsaW5rKQorCQlnb3RvIGxpbmtfdXA7CiAKIAlpZiAobGluaykgewogCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewogCQkJdTMyIGN0cmw7CiAJCQlib29sIHR4YjJiID0gdHJ1ZTsKKwkJCS8qIHVwZGF0ZSBzbmFwc2hvdCBvZiBQSFkgcmVnaXN0ZXJzIG9uIExTQyAqLwogCQkJZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsCiAJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRhcHRlci0+bGlua19zcGVlZCwKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGFwdGVyLT5saW5rX2R1cGxleCk7CkBAIC0yNTg5LDcgKzIzMzAsNyBAQAogCQkJY2FzZSBTUEVFRF8xMDoKIAkJCQl0eGIyYiA9IGZhbHNlOwogCQkJCW5ldGRldi0+dHhfcXVldWVfbGVuID0gMTA7Ci0JCQkJYWRhcHRlci0+dHhfdGltZW91dF9mYWN0b3IgPSA4OworCQkJCWFkYXB0ZXItPnR4X3RpbWVvdXRfZmFjdG9yID0gMTY7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNQRUVEXzEwMDoKIAkJCQl0eGIyYiA9IGZhbHNlOwpAQCAtMjU5OCw1MiArMjMzOSwxNiBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlpZiAoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MSB8fAotCQkJICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzIpICYmCi0JCQkgICAgIXR4YjJiKSB7Ci0JCQkJdTMyIHRhcmMwOwotCQkJCXRhcmMwID0gZXIzMihUQVJDMCk7Ci0JCQkJdGFyYzAgJj0gfigxIDw8IDIxKTsKLQkJCQlldzMyKFRBUkMwLCB0YXJjMCk7Ci0JCQl9Ci0KLQkJCS8qIGRpc2FibGUgVFNPIGZvciBwY2llIGFuZCAxMC8xMDAgc3BlZWRzLCB0byBhdm9pZAotCQkJICogc29tZSBoYXJkd2FyZSBpc3N1ZXMgKi8KLQkJCWlmICghYWRhcHRlci0+dHNvX2ZvcmNlICYmCi0JCQkgICAgaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaV9leHByZXNzKXsKLQkJCQlzd2l0Y2ggKGFkYXB0ZXItPmxpbmtfc3BlZWQpIHsKLQkJCQljYXNlIFNQRUVEXzEwOgotCQkJCWNhc2UgU1BFRURfMTAwOgotCQkJCQlEUFJJTlRLKFBST0JFLElORk8sCi0JCQkJICAgICAgICAiMTAvMTAwIHNwZWVkOiBkaXNhYmxpbmcgVFNPXG4iKTsKLQkJCQkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087Ci0JCQkJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPNjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTUEVFRF8xMDAwOgotCQkJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwotCQkJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJLyogb29wcyAqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIGVuYWJsZSB0cmFuc21pdHMgaW4gdGhlIGhhcmR3YXJlLCBuZWVkIHRvIGRvIHRoaXMKLQkJCSAqIGFmdGVyIHNldHRpbmcgVEFSQzAgKi8KKwkJCS8qIGVuYWJsZSB0cmFuc21pdHMgaW4gdGhlIGhhcmR3YXJlICovCiAJCQl0Y3RsID0gZXIzMihUQ1RMKTsKIAkJCXRjdGwgfD0gRTEwMDBfVENUTF9FTjsKIAkJCWV3MzIoVENUTCwgdGN0bCk7CiAKIAkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKLQkJCW1vZF90aW1lcigmYWRhcHRlci0+cGh5X2luZm9fdGltZXIsIHJvdW5kX2ppZmZpZXMoamlmZmllcyArIDIgKiBIWikpOworCQkJaWYgKCF0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5mbGFncykpCisJCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfaW5mb190aW1lciwKKwkJCQkgICAgICAgICAgcm91bmRfamlmZmllcyhqaWZmaWVzICsgMiAqIEhaKSk7CiAJCQlhZGFwdGVyLT5zbWFydHNwZWVkID0gMDsKLQkJfSBlbHNlIHsKLQkJCS8qIG1ha2Ugc3VyZSB0aGUgcmVjZWl2ZSB1bml0IGlzIHN0YXJ0ZWQgKi8KLQkJCWlmIChody0+cnhfbmVlZHNfa2lja2luZykgewotCQkJCXUzMiByY3RsID0gZXIzMihSQ1RMKTsKLQkJCQlldzMyKFJDVEwsIHJjdGwgfCBFMTAwMF9SQ1RMX0VOKTsKLQkJCX0KIAkJfQogCX0gZWxzZSB7CiAJCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKQEAgLTI2NTIsMjEgKzIzNTcsMTYgQEAKIAkJCXByaW50ayhLRVJOX0lORk8gImUxMDAwOiAlcyBOSUMgTGluayBpcyBEb3duXG4iLAogCQkJICAgICAgIG5ldGRldi0+bmFtZSk7CiAJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwotCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfaW5mb190aW1lciwgcm91bmRfamlmZmllcyhqaWZmaWVzICsgMiAqIEhaKSk7CiAKLQkJCS8qIDgwMDAzRVMyTEFOIHdvcmthcm91bmQtLQotCQkJICogRm9yIHBhY2tldCBidWZmZXIgd29yay1hcm91bmQgb24gbGluayBkb3duIGV2ZW50OwotCQkJICogZGlzYWJsZSByZWNlaXZlcyBpbiB0aGUgSVNSIGFuZAotCQkJICogcmVzZXQgZGV2aWNlIGhlcmUgaW4gdGhlIHdhdGNoZG9nCi0JCQkgKi8KLQkJCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pCi0JCQkJLyogcmVzZXQgZGV2aWNlICovCi0JCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cmVzZXRfdGFzayk7CisJCQlpZiAoIXRlc3RfYml0KF9fRTEwMDBfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKSkKKwkJCQltb2RfdGltZXIoJmFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyLAorCQkJCSAgICAgICAgICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyAyICogSFopKTsKIAkJfQogCiAJCWUxMDAwX3NtYXJ0c3BlZWQoYWRhcHRlcik7CiAJfQogCitsaW5rX3VwOgogCWUxMDAwX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKIAogCWh3LT50eF9wYWNrZXRfZGVsdGEgPSBhZGFwdGVyLT5zdGF0cy50cHQgLSBhZGFwdGVyLT50cHRfb2xkOwpAQCAtMjcwMCwxMyArMjQwMCwxMCBAQAogCS8qIEZvcmNlIGRldGVjdGlvbiBvZiBodW5nIGNvbnRyb2xsZXIgZXZlcnkgd2F0Y2hkb2cgcGVyaW9kICovCiAJYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcgPSB0cnVlOwogCi0JLyogV2l0aCA4MjU3MSBjb250cm9sbGVycywgTEFBIG1heSBiZSBvdmVyd3JpdHRlbiBkdWUgdG8gY29udHJvbGxlcgotCSAqIHJlc2V0IGZyb20gdGhlIG90aGVyIHBvcnQuIFNldCB0aGUgYXBwcm9wcmlhdGUgTEFBIGluIFJBUlswXSAqLwotCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzEgJiYgaHctPmxhYV9pc19wcmVzZW50KQotCQllMTAwMF9yYXJfc2V0KGh3LCBody0+bWFjX2FkZHIsIDApOwotCiAJLyogUmVzZXQgdGhlIHRpbWVyICovCi0JbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgcm91bmRfamlmZmllcyhqaWZmaWVzICsgMiAqIEhaKSk7CisJaWYgKCF0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5mbGFncykpCisJCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsCisJCSAgICAgICAgICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyAyICogSFopKTsKIH0KIAogZW51bSBsYXRlbmN5X3JhbmdlIHsKQEAgLTI3MTgsNiArMjQxNSwxMSBAQAogCiAvKioKICAqIGUxMDAwX3VwZGF0ZV9pdHIgLSB1cGRhdGUgdGhlIGR5bmFtaWMgSVRSIHZhbHVlIGJhc2VkIG9uIHN0YXRpc3RpY3MKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKKyAqIEBpdHJfc2V0dGluZzogY3VycmVudCBhZGFwdGVyLT5pdHIKKyAqIEBwYWNrZXRzOiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgZHVyaW5nIHRoaXMgbWVhc3VyZW1lbnQgaW50ZXJ2YWwKKyAqIEBieXRlczogdGhlIG51bWJlciBvZiBieXRlcyBkdXJpbmcgdGhpcyBtZWFzdXJlbWVudCBpbnRlcnZhbAorICoKICAqICAgICAgU3RvcmVzIGEgbmV3IElUUiB2YWx1ZSBiYXNlZCBvbiBwYWNrZXRzIGFuZCBieXRlCiAgKiAgICAgIGNvdW50cyBkdXJpbmcgdGhlIGxhc3QgaW50ZXJydXB0LiAgVGhlIGFkdmFudGFnZSBvZiBwZXIgaW50ZXJydXB0CiAgKiAgICAgIGNvbXB1dGF0aW9uIGlzIGZhc3RlciB1cGRhdGVzIGFuZCBtb3JlIGFjY3VyYXRlIElUUiBmb3IgdGhlIGN1cnJlbnQKQEAgLTI3MjcsMTAgKzI0MjksNiBAQAogICogICAgICB3aGlsZSBpbmNyZWFzaW5nIGJ1bGsgdGhyb3VnaHB1dC4KICAqICAgICAgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGNvbnRyb2xsZWQgYnkgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSBtb2R1bGUKICAqICAgICAgcGFyYW1ldGVyIChzZWUgZTEwMDBfcGFyYW0uYykKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKLSAqIEBpdHJfc2V0dGluZzogY3VycmVudCBhZGFwdGVyLT5pdHIKLSAqIEBwYWNrZXRzOiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgZHVyaW5nIHRoaXMgbWVhc3VyZW1lbnQgaW50ZXJ2YWwKLSAqIEBieXRlczogdGhlIG51bWJlciBvZiBieXRlcyBkdXJpbmcgdGhpcyBtZWFzdXJlbWVudCBpbnRlcnZhbAogICoqLwogc3RhdGljIHVuc2lnbmVkIGludCBlMTAwMF91cGRhdGVfaXRyKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAogCQkJCSAgICAgdTE2IGl0cl9zZXR0aW5nLCBpbnQgcGFja2V0cywgaW50IGJ5dGVzKQpAQCAtMzAzNSw4ICsyNzMzLDkgQEAKIAkJCXNpemUgLT0gNDsKIAogCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gc2l6ZTsKLQkJYnVmZmVyX2luZm8tPmRtYSA9IHNrYl9zaGluZm8oc2tiKS0+ZG1hX2hlYWQgKyBvZmZzZXQ7CisJCS8qIHNldCB0aW1lX3N0YW1wICpiZWZvcmUqIGRtYSB0byBoZWxwIGF2b2lkIGEgcG9zc2libGUgcmFjZSAqLwogCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBza2Jfc2hpbmZvKHNrYiktPmRtYV9oZWFkICsgb2Zmc2V0OwogCQlidWZmZXJfaW5mby0+bmV4dF90b193YXRjaCA9IGk7CiAKIAkJbGVuIC09IHNpemU7CkBAIC0zMDcxLDEzICsyNzcwLDE0IEBACiAJCQkgKiBBdm9pZCB0ZXJtaW5hdGluZyBidWZmZXJzIHdpdGhpbiBldmVubHktYWxpZ25lZAogCQkJICogZHdvcmRzLiAqLwogCQkJaWYgKHVubGlrZWx5KGFkYXB0ZXItPnBjaXhfODI1NDQgJiYKLQkJCSAgICEoKHVuc2lnbmVkIGxvbmcpKGZyYWctPnBhZ2Urb2Zmc2V0K3NpemUtMSkgJiA0KSAmJgotCQkJICAgc2l6ZSA+IDQpKQorCQkJICAgICEoKHVuc2lnbmVkIGxvbmcpKHBhZ2VfdG9fcGh5cyhmcmFnLT5wYWdlKSArIG9mZnNldAorCQkJICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZSAtIDEpICYgNCkgJiYKKwkJCSAgICBzaXplID4gNCkpCiAJCQkJc2l6ZSAtPSA0OwogCiAJCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gc2l6ZTsKLQkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBtYXBbZl0gKyBvZmZzZXQ7CiAJCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJCQlidWZmZXJfaW5mby0+ZG1hID0gbWFwW2ZdICsgb2Zmc2V0OwogCQkJYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2ggPSBpOwogCiAJCQlsZW4gLT0gc2l6ZTsKQEAgLTMxODYsNDEgKzI4ODYsNiBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIE1JTklNVU1fREhDUF9QQUNLRVRfU0laRSAyODIKLXN0YXRpYyBpbnQgZTEwMDBfdHJhbnNmZXJfZGhjcF9pbmZvKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAgJmFkYXB0ZXItPmh3OwotCXUxNiBsZW5ndGgsIG9mZnNldDsKLQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7Ci0JCWlmICghKCh2bGFuX3R4X3RhZ19nZXQoc2tiKSA9PSBody0+bW5nX2Nvb2tpZS52bGFuX2lkKSAmJgotCQkJKCBody0+bW5nX2Nvb2tpZS5zdGF0dXMgJgotCQkJICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkpICkKLQkJCXJldHVybiAwOwotCX0KLQlpZiAoc2tiLT5sZW4gPiBNSU5JTVVNX0RIQ1BfUEFDS0VUX1NJWkUpIHsKLQkJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0JCWlmICgoaHRvbnMoRVRIX1BfSVApID09IGV0aC0+aF9wcm90bykpIHsKLQkJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPQotCQkJCShzdHJ1Y3QgaXBoZHIgKikoKHU4ICopc2tiLT5kYXRhKzE0KTsKLQkJCWlmIChJUFBST1RPX1VEUCA9PSBpcC0+cHJvdG9jb2wpIHsKLQkJCQlzdHJ1Y3QgdWRwaGRyICp1ZHAgPQotCQkJCQkoc3RydWN0IHVkcGhkciAqKSgodTggKilpcCArCi0JCQkJCQkoaXAtPmlobCA8PCAyKSk7Ci0JCQkJaWYgKG50b2hzKHVkcC0+ZGVzdCkgPT0gNjcpIHsKLQkJCQkJb2Zmc2V0ID0gKHU4ICopdWRwICsgOCAtIHNrYi0+ZGF0YTsKLQkJCQkJbGVuZ3RoID0gc2tiLT5sZW4gLSBvZmZzZXQ7Ci0KLQkJCQkJcmV0dXJuIGUxMDAwX21uZ193cml0ZV9kaGNwX2luZm8oaHcsCi0JCQkJCQkJKHU4ICopdWRwICsgOCwKLQkJCQkJCQlsZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBfX2UxMDAwX21heWJlX3N0b3BfdHgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHNpemUpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMzI3OSwxMSArMjk0NCw2IEBACiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQogCi0JLyogODI1NzEgYW5kIG5ld2VyIGRvZXNuJ3QgbmVlZCB0aGUgd29ya2Fyb3VuZCB0aGF0IGxpbWl0ZWQgZGVzY3JpcHRvcgotCSAqIGxlbmd0aCB0byA0a0IgKi8KLQlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTcxKQotCQltYXhfcGVyX3R4ZCA9IDgxOTI7Ci0KIAltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCS8qIFRoZSBjb250cm9sbGVyIGRvZXMgYSBzaW1wbGUgY2FsY3VsYXRpb24gdG8KIAkgKiBtYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhlIEZJRk8gYmVmb3JlCkBAIC0zMjk2LDkgKzI5NTYsNiBAQAogCQltYXhfcGVyX3R4ZCA9IG1pbihtc3MgPDwgMiwgbWF4X3Blcl90eGQpOwogCQltYXhfdHhkX3B3ciA9IGZscyhtYXhfcGVyX3R4ZCkgLSAxOwogCi0JCS8qIFRTTyBXb3JrYXJvdW5kIGZvciA4MjU3MS8yLzMgQ29udHJvbGxlcnMgLS0gaWYgc2tiLT5kYXRhCi0JCSogcG9pbnRzIHRvIGp1c3QgaGVhZGVyLCBwdWxsIGEgZmV3IGJ5dGVzIG9mIHBheWxvYWQgZnJvbQotCQkqIGZyYWdzIGludG8gc2tiLT5kYXRhICovCiAJCWhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOwogCQlpZiAoc2tiLT5kYXRhX2xlbiAmJiBoZHJfbGVuID09IGxlbikgewogCQkJc3dpdGNoIChody0+bWFjX3R5cGUpIHsKQEAgLTMzMTMsMTAgKzI5NzAsNiBAQAogCQkJCWlmICgodW5zaWduZWQgbG9uZykoc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gMSkgJiA0KQogCQkJCQlicmVhazsKIAkJCQkvKiBmYWxsIHRocm91Z2ggKi8KLQkJCWNhc2UgZTEwMDBfODI1NzE6Ci0JCQljYXNlIGUxMDAwXzgyNTcyOgotCQkJY2FzZSBlMTAwMF84MjU3MzoKLQkJCWNhc2UgZTEwMDBfaWNoOGxhbjoKIAkJCQlwdWxsX3NpemUgPSBtaW4oKHVuc2lnbmVkIGludCk0LCBza2ItPmRhdGFfbGVuKTsKIAkJCQlpZiAoIV9fcHNrYl9wdWxsX3RhaWwoc2tiLCBwdWxsX3NpemUpKSB7CiAJCQkJCURQUklOVEsoRFJWLCBFUlIsCkBAIC0zMzYxLDExICszMDE0LDYgQEAKIAlpZiAoYWRhcHRlci0+cGNpeF84MjU0NCkKIAkJY291bnQgKz0gbnJfZnJhZ3M7CiAKLQotCWlmIChody0+dHhfcGt0X2ZpbHRlcmluZyAmJgotCSAgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKSkKLQkJZTEwMDBfdHJhbnNmZXJfZGhjcF9pbmZvKGFkYXB0ZXIsIHNrYik7Ci0KIAkvKiBuZWVkOiBjb3VudCArIDIgZGVzYyBnYXAgdG8ga2VlcCB0YWlsIGZyb20gdG91Y2hpbmcKIAkgKiBoZWFkLCBvdGhlcndpc2UgdHJ5IG5leHQgdGltZSAqLwogCWlmICh1bmxpa2VseShlMTAwMF9tYXliZV9zdG9wX3R4KG5ldGRldiwgdHhfcmluZywgY291bnQgKyAyKSkpCkBAIC0zMzc0LDcgKzMwMjIsOSBAQAogCWlmICh1bmxpa2VseShody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CiAJCWlmICh1bmxpa2VseShlMTAwMF84MjU0N19maWZvX3dvcmthcm91bmQoYWRhcHRlciwgc2tiKSkpIHsKIAkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJCW1vZF90aW1lcigmYWRhcHRlci0+dHhfZmlmb19zdGFsbF90aW1lciwgamlmZmllcyArIDEpOworCQkJaWYgKCF0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5mbGFncykpCisJCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsX3RpbWVyLAorCQkJCSAgICAgICAgICBqaWZmaWVzICsgMSk7CiAJCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJCX0KIAl9CkBAIC0zMzkzLDE0ICszMDQzLDEyIEBACiAJfQogCiAJaWYgKGxpa2VseSh0c28pKSB7Ci0JCXR4X3JpbmctPmxhc3RfdHhfdHNvID0gMTsKKwkJaWYgKGxpa2VseShody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NDQpKQorCQkJdHhfcmluZy0+bGFzdF90eF90c28gPSAxOwogCQl0eF9mbGFncyB8PSBFMTAwMF9UWF9GTEFHU19UU087CiAJfSBlbHNlIGlmIChsaWtlbHkoZTEwMDBfdHhfY3N1bShhZGFwdGVyLCB0eF9yaW5nLCBza2IpKSkKIAkJdHhfZmxhZ3MgfD0gRTEwMDBfVFhfRkxBR1NfQ1NVTTsKIAotCS8qIE9sZCBtZXRob2Qgd2FzIHRvIGFzc3VtZSBJUHY0IHBhY2tldCBieSBkZWZhdWx0IGlmIFRTTyB3YXMgZW5hYmxlZC4KLQkgKiA4MjU3MSBoYXJkd2FyZSBzdXBwb3J0cyBUU08gY2FwYWJpbGl0aWVzIGZvciBJUHY2IGFzIHdlbGwuLi4KLQkgKiBubyBsb25nZXIgYXNzdW1lLCB3ZSBtdXN0LiAqLwogCWlmIChsaWtlbHkoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpKQogCQl0eF9mbGFncyB8PSBFMTAwMF9UWF9GTEFHU19JUFY0OwogCkBAIC0zNDcyLDcgKzMxMjAsNiBAQAogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFOwotCXUxNiBlZXByb21fZGF0YSA9IDA7CiAKIAlpZiAoKG1heF9mcmFtZSA8IE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkgfHwKIAkgICAgKG1heF9mcmFtZSA+IE1BWF9KVU1CT19GUkFNRV9TSVpFKSkgewpAQCAtMzQ4Myw0NCArMzEzMCwyMyBAQAogCS8qIEFkYXB0ZXItc3BlY2lmaWMgbWF4IGZyYW1lIHNpemUgbGltaXRzLiAqLwogCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAJY2FzZSBlMTAwMF91bmRlZmluZWQgLi4uIGUxMDAwXzgyNTQyX3JldjJfMToKLQljYXNlIGUxMDAwX2ljaDhsYW46CiAJCWlmIChtYXhfZnJhbWUgPiAoRVRIX0ZSQU1FX0xFTiArIEVUSF9GQ1NfTEVOKSkgewogCQkJRFBSSU5USyhQUk9CRSwgRVJSLCAiSnVtYm8gRnJhbWVzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgZTEwMDBfODI1NzM6Ci0JCS8qIEp1bWJvIEZyYW1lcyBub3Qgc3VwcG9ydGVkIGlmOgotCQkgKiAtIHRoaXMgaXMgbm90IGFuIDgyNTczTCBkZXZpY2UKLQkJICogLSBBU1BNIGlzIGVuYWJsZWQgaW4gYW55IHdheSAoMHgxQSBiaXRzIDM6MikgKi8KLQkJZTEwMDBfcmVhZF9lZXByb20oaHcsIEVFUFJPTV9JTklUXzNHSU9fMywgMSwKLQkJICAgICAgICAgICAgICAgICAgJmVlcHJvbV9kYXRhKTsKLQkJaWYgKChody0+ZGV2aWNlX2lkICE9IEUxMDAwX0RFVl9JRF84MjU3M0wpIHx8Ci0JCSAgICAoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDFBX0FTUE1fTUFTSykpIHsKLQkJCWlmIChtYXhfZnJhbWUgPiAoRVRIX0ZSQU1FX0xFTiArIEVUSF9GQ1NfTEVOKSkgewotCQkJCURQUklOVEsoUFJPQkUsIEVSUiwKLQkJCSAgICAgICAgICAgIAkiSnVtYm8gRnJhbWVzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCS8qIEVSVCB3aWxsIGJlIGVuYWJsZWQgbGF0ZXIgdG8gZW5hYmxlIHdpcmUgc3BlZWQgcmVjZWl2ZXMgKi8KLQotCQkvKiBmYWxsIHRocm91Z2ggdG8gZ2V0IHN1cHBvcnQgKi8KLQljYXNlIGUxMDAwXzgyNTcxOgotCWNhc2UgZTEwMDBfODI1NzI6Ci0JY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKLSNkZWZpbmUgTUFYX1NURF9KVU1CT19GUkFNRV9TSVpFIDkyMzQKLQkJaWYgKG1heF9mcmFtZSA+IE1BWF9TVERfSlVNQk9fRlJBTUVfU0laRSkgewotCQkJRFBSSU5USyhQUk9CRSwgRVJSLCAiTVRVID4gOTIxNiBub3Qgc3VwcG9ydGVkLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBDYXBhYmxlIG9mIHN1cHBvcnRpbmcgdXAgdG8gTUFYX0pVTUJPX0ZSQU1FX1NJWkUgbGltaXQuICovCiAJCWJyZWFrOwogCX0KIAorCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fRTEwMDBfUkVTRVRUSU5HLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQltc2xlZXAoMSk7CisJLyogZTEwMDBfZG93biBoYXMgYSBkZXBlbmRlbmN5IG9uIG1heF9mcmFtZV9zaXplICovCisJaHctPm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWUxMDAwX2Rvd24oYWRhcHRlcik7CisKIAkvKiBOT1RFOiBuZXRkZXZfYWxsb2Nfc2tiIHJlc2VydmVzIDE2IGJ5dGVzLCBhbmQgdHlwaWNhbGx5IE5FVF9JUF9BTElHTgogCSAqIG1lYW5zIHdlIHJlc2VydmUgMiBtb3JlLCB0aGlzIHB1c2hlcyB1cyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBuZXh0CiAJICogbGFyZ2VyIHNsYWIgc2l6ZS4KQEAgLTM1NDksMTEgKzMxNzUsMTYgQEAKIAkgICAgIChtYXhfZnJhbWUgPT0gTUFYSU1VTV9FVEhFUk5FVF9WTEFOX1NJWkUpKSkKIAkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IE1BWElNVU1fRVRIRVJORVRfVkxBTl9TSVpFOwogCisJcHJpbnRrKEtFUk5fSU5GTyAiZTEwMDA6ICVzIGNoYW5naW5nIE1UVSBmcm9tICVkIHRvICVkXG4iLAorCSAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldi0+bXR1LCBuZXdfbXR1KTsKIAluZXRkZXYtPm10dSA9IG5ld19tdHU7Ci0JaHctPm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOwogCiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJZTEwMDBfcmVpbml0X2xvY2tlZChhZGFwdGVyKTsKKwkJZTEwMDBfdXAoYWRhcHRlcik7CisJZWxzZQorCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKworCWNsZWFyX2JpdChfX0UxMDAwX1JFU0VUVElORywgJmFkYXB0ZXItPmZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzU5NiwxNCArMzIyNywxMiBAQAogCWFkYXB0ZXItPnN0YXRzLm1wcmMgKz0gZXIzMihNUFJDKTsKIAlhZGFwdGVyLT5zdGF0cy5yb2MgKz0gZXIzMihST0MpOwogCi0JaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0JCWFkYXB0ZXItPnN0YXRzLnByYzY0ICs9IGVyMzIoUFJDNjQpOwotCQlhZGFwdGVyLT5zdGF0cy5wcmMxMjcgKz0gZXIzMihQUkMxMjcpOwotCQlhZGFwdGVyLT5zdGF0cy5wcmMyNTUgKz0gZXIzMihQUkMyNTUpOwotCQlhZGFwdGVyLT5zdGF0cy5wcmM1MTEgKz0gZXIzMihQUkM1MTEpOwotCQlhZGFwdGVyLT5zdGF0cy5wcmMxMDIzICs9IGVyMzIoUFJDMTAyMyk7Ci0JCWFkYXB0ZXItPnN0YXRzLnByYzE1MjIgKz0gZXIzMihQUkMxNTIyKTsKLQl9CisJYWRhcHRlci0+c3RhdHMucHJjNjQgKz0gZXIzMihQUkM2NCk7CisJYWRhcHRlci0+c3RhdHMucHJjMTI3ICs9IGVyMzIoUFJDMTI3KTsKKwlhZGFwdGVyLT5zdGF0cy5wcmMyNTUgKz0gZXIzMihQUkMyNTUpOworCWFkYXB0ZXItPnN0YXRzLnByYzUxMSArPSBlcjMyKFBSQzUxMSk7CisJYWRhcHRlci0+c3RhdHMucHJjMTAyMyArPSBlcjMyKFBSQzEwMjMpOworCWFkYXB0ZXItPnN0YXRzLnByYzE1MjIgKz0gZXIzMihQUkMxNTIyKTsKIAogCWFkYXB0ZXItPnN0YXRzLnN5bWVycnMgKz0gZXIzMihTWU1FUlJTKTsKIAlhZGFwdGVyLT5zdGF0cy5tcGMgKz0gZXIzMihNUEMpOwpAQCAtMzYzMiwxNCArMzI2MSwxMiBAQAogCWFkYXB0ZXItPnN0YXRzLnRvdGggKz0gZXIzMihUT1RIKTsKIAlhZGFwdGVyLT5zdGF0cy50cHIgKz0gZXIzMihUUFIpOwogCi0JaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0JCWFkYXB0ZXItPnN0YXRzLnB0YzY0ICs9IGVyMzIoUFRDNjQpOwotCQlhZGFwdGVyLT5zdGF0cy5wdGMxMjcgKz0gZXIzMihQVEMxMjcpOwotCQlhZGFwdGVyLT5zdGF0cy5wdGMyNTUgKz0gZXIzMihQVEMyNTUpOwotCQlhZGFwdGVyLT5zdGF0cy5wdGM1MTEgKz0gZXIzMihQVEM1MTEpOwotCQlhZGFwdGVyLT5zdGF0cy5wdGMxMDIzICs9IGVyMzIoUFRDMTAyMyk7Ci0JCWFkYXB0ZXItPnN0YXRzLnB0YzE1MjIgKz0gZXIzMihQVEMxNTIyKTsKLQl9CisJYWRhcHRlci0+c3RhdHMucHRjNjQgKz0gZXIzMihQVEM2NCk7CisJYWRhcHRlci0+c3RhdHMucHRjMTI3ICs9IGVyMzIoUFRDMTI3KTsKKwlhZGFwdGVyLT5zdGF0cy5wdGMyNTUgKz0gZXIzMihQVEMyNTUpOworCWFkYXB0ZXItPnN0YXRzLnB0YzUxMSArPSBlcjMyKFBUQzUxMSk7CisJYWRhcHRlci0+c3RhdHMucHRjMTAyMyArPSBlcjMyKFBUQzEwMjMpOworCWFkYXB0ZXItPnN0YXRzLnB0YzE1MjIgKz0gZXIzMihQVEMxNTIyKTsKIAogCWFkYXB0ZXItPnN0YXRzLm1wdGMgKz0gZXIzMihNUFRDKTsKIAlhZGFwdGVyLT5zdGF0cy5icHRjICs9IGVyMzIoQlBUQyk7CkBAIC0zNjU5LDIwICszMjg2LDYgQEAKIAkJYWRhcHRlci0+c3RhdHMudHNjdGMgKz0gZXIzMihUU0NUQyk7CiAJCWFkYXB0ZXItPnN0YXRzLnRzY3RmYyArPSBlcjMyKFRTQ1RGQyk7CiAJfQotCWlmIChody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikgewotCQlhZGFwdGVyLT5zdGF0cy5pYWMgKz0gZXIzMihJQUMpOwotCQlhZGFwdGVyLT5zdGF0cy5pY3J4b2MgKz0gZXIzMihJQ1JYT0MpOwotCi0JCWlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewotCQkJYWRhcHRlci0+c3RhdHMuaWNyeHB0YyArPSBlcjMyKElDUlhQVEMpOwotCQkJYWRhcHRlci0+c3RhdHMuaWNyeGF0YyArPSBlcjMyKElDUlhBVEMpOwotCQkJYWRhcHRlci0+c3RhdHMuaWN0eHB0YyArPSBlcjMyKElDVFhQVEMpOwotCQkJYWRhcHRlci0+c3RhdHMuaWN0eGF0YyArPSBlcjMyKElDVFhBVEMpOwotCQkJYWRhcHRlci0+c3RhdHMuaWN0eHFlYyArPSBlcjMyKElDVFhRRUMpOwotCQkJYWRhcHRlci0+c3RhdHMuaWN0eHFtdGMgKz0gZXIzMihJQ1RYUU1UQyk7Ci0JCQlhZGFwdGVyLT5zdGF0cy5pY3J4ZG10YyArPSBlcjMyKElDUlhETVRDKTsKLQkJfQotCX0KIAogCS8qIEZpbGwgb3V0IHRoZSBPUyBzdGF0aXN0aWNzIHN0cnVjdHVyZSAqLwogCWFkYXB0ZXItPm5ldF9zdGF0cy5tdWx0aWNhc3QgPSBhZGFwdGVyLT5zdGF0cy5tcHJjOwpAQCAtMzczMSw0OSArMzM0NCw2IEBACiB9CiAKIC8qKgotICogZTEwMDBfaW50cl9tc2kgLSBJbnRlcnJ1cHQgSGFuZGxlcgotICogQGlycTogaW50ZXJydXB0IG51bWJlcgotICogQGRhdGE6IHBvaW50ZXIgdG8gYSBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKiovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBlMTAwMF9pbnRyX21zaShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkYXRhOwotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXUzMiBpY3IgPSBlcjMyKElDUik7Ci0KLQkvKiBpbiBOQVBJIG1vZGUgcmVhZCBJQ1IgZGlzYWJsZXMgaW50ZXJydXB0cyB1c2luZyBJQU0gKi8KLQotCWlmIChpY3IgJiAoRTEwMDBfSUNSX1JYU0VRIHwgRTEwMDBfSUNSX0xTQykpIHsKLQkJaHctPmdldF9saW5rX3N0YXR1cyA9IDE7Ci0JCS8qIDgwMDAzRVMyTEFOIHdvcmthcm91bmQtLSBGb3IgcGFja2V0IGJ1ZmZlciB3b3JrLWFyb3VuZCBvbgotCQkgKiBsaW5rIGRvd24gZXZlbnQ7IGRpc2FibGUgcmVjZWl2ZXMgaGVyZSBpbiB0aGUgSVNSIGFuZCByZXNldAotCQkgKiBhZGFwdGVyIGluIHdhdGNoZG9nICovCi0JCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKLQkJICAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pKSB7Ci0JCQkvKiBkaXNhYmxlIHJlY2VpdmVzICovCi0JCQl1MzIgcmN0bCA9IGVyMzIoUkNUTCk7Ci0JCQlldzMyKFJDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTik7Ci0JCX0KLQkJLyogZ3VhcmQgYWdhaW5zdCBpbnRlcnJ1cHQgd2hlbiB3ZSdyZSBnb2luZyBkb3duICovCi0JCWlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKQotCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDEpOwotCX0KLQotCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZhZGFwdGVyLT5uYXBpKSkpIHsKLQkJYWRhcHRlci0+dG90YWxfdHhfYnl0ZXMgPSAwOwotCQlhZGFwdGVyLT50b3RhbF90eF9wYWNrZXRzID0gMDsKLQkJYWRhcHRlci0+dG90YWxfcnhfYnl0ZXMgPSAwOwotCQlhZGFwdGVyLT50b3RhbF9yeF9wYWNrZXRzID0gMDsKLQkJX19uYXBpX3NjaGVkdWxlKCZhZGFwdGVyLT5uYXBpKTsKLQl9IGVsc2UKLQkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoqCiAgKiBlMTAwMF9pbnRyIC0gSW50ZXJydXB0IEhhbmRsZXIKICAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKICAqIEBkYXRhOiBwb2ludGVyIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMzc4NCw0MyArMzM1NCwyMiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkYXRhOwogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXUzMiByY3RsLCBpY3IgPSBlcjMyKElDUik7CisJdTMyIGljciA9IGVyMzIoSUNSKTsKIAogCWlmICh1bmxpa2VseSgoIWljcikgfHwgdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKSkKIAkJcmV0dXJuIElSUV9OT05FOyAgLyogTm90IG91ciBpbnRlcnJ1cHQgKi8KIAotCS8qIElNUyB3aWxsIG5vdCBhdXRvLW1hc2sgaWYgSU5UX0FTU0VSVEVEIGlzIG5vdCBzZXQsIGFuZCBpZiBpdCBpcwotCSAqIG5vdCBzZXQsIHRoZW4gdGhlIGFkYXB0ZXIgZGlkbid0IHNlbmQgYW4gaW50ZXJydXB0ICovCi0JaWYgKHVubGlrZWx5KGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSAmJgotCSAgICAgICAgICAgICAhKGljciAmIEUxMDAwX0lDUl9JTlRfQVNTRVJURUQpKSkKLQkJcmV0dXJuIElSUV9OT05FOwotCi0JLyogSW50ZXJydXB0IEF1dG8tTWFzay4uLnVwb24gcmVhZGluZyBJQ1IsIGludGVycnVwdHMgYXJlIG1hc2tlZC4gIE5vCi0JICogbmVlZCBmb3IgdGhlIElNQyB3cml0ZSAqLwotCiAJaWYgKHVubGlrZWx5KGljciAmIChFMTAwMF9JQ1JfUlhTRVEgfCBFMTAwMF9JQ1JfTFNDKSkpIHsKIAkJaHctPmdldF9saW5rX3N0YXR1cyA9IDE7Ci0JCS8qIDgwMDAzRVMyTEFOIHdvcmthcm91bmQtLQotCQkgKiBGb3IgcGFja2V0IGJ1ZmZlciB3b3JrLWFyb3VuZCBvbiBsaW5rIGRvd24gZXZlbnQ7Ci0JCSAqIGRpc2FibGUgcmVjZWl2ZXMgaGVyZSBpbiB0aGUgSVNSIGFuZAotCQkgKiByZXNldCBhZGFwdGVyIGluIHdhdGNoZG9nCi0JCSAqLwotCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpICYmCi0JCSAgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSkgewotCQkJLyogZGlzYWJsZSByZWNlaXZlcyAqLwotCQkJcmN0bCA9IGVyMzIoUkNUTCk7Ci0JCQlldzMyKFJDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTik7Ci0JCX0KIAkJLyogZ3VhcmQgYWdhaW5zdCBpbnRlcnJ1cHQgd2hlbiB3ZSdyZSBnb2luZyBkb3duICovCiAJCWlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKQogCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDEpOwogCX0KIAotCWlmICh1bmxpa2VseShody0+bWFjX3R5cGUgPCBlMTAwMF84MjU3MSkpIHsKLQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzLCB3aXRob3V0IHRoZSBzeW5jaHJvbml6ZV9pcnEgYml0ICovCi0JCWV3MzIoSU1DLCB+MCk7Ci0JCUUxMDAwX1dSSVRFX0ZMVVNIKCk7Ci0JfQorCS8qIGRpc2FibGUgaW50ZXJydXB0cywgd2l0aG91dCB0aGUgc3luY2hyb25pemVfaXJxIGJpdCAqLworCWV3MzIoSU1DLCB+MCk7CisJRTEwMDBfV1JJVEVfRkxVU0goKTsKKwogCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZhZGFwdGVyLT5uYXBpKSkpIHsKIAkJYWRhcHRlci0+dG90YWxfdHhfYnl0ZXMgPSAwOwogCQlhZGFwdGVyLT50b3RhbF90eF9wYWNrZXRzID0gMDsKQEAgLTM4NDQsMTcgKzMzOTMsMTMgQEAKIHN0YXRpYyBpbnQgZTEwMDBfY2xlYW4oc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBlMTAwMF9hZGFwdGVyLCBuYXBpKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG9sbF9kZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0JaW50IHR4X2NsZWFuZWQgPSAwLCB3b3JrX2RvbmUgPSAwOworCWludCB0eF9jbGVhbl9jb21wbGV0ZSA9IDAsIHdvcmtfZG9uZSA9IDA7CiAKLQlhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG9sbF9kZXYpOworCXR4X2NsZWFuX2NvbXBsZXRlID0gZTEwMDBfY2xlYW5fdHhfaXJxKGFkYXB0ZXIsICZhZGFwdGVyLT50eF9yaW5nWzBdKTsKIAotCXR4X2NsZWFuZWQgPSBlMTAwMF9jbGVhbl90eF9pcnEoYWRhcHRlciwgJmFkYXB0ZXItPnR4X3JpbmdbMF0pOworCWFkYXB0ZXItPmNsZWFuX3J4KGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9yaW5nWzBdLCAmd29ya19kb25lLCBidWRnZXQpOwogCi0JYWRhcHRlci0+Y2xlYW5fcngoYWRhcHRlciwgJmFkYXB0ZXItPnJ4X3JpbmdbMF0sCi0JICAgICAgICAgICAgICAgICAgJndvcmtfZG9uZSwgYnVkZ2V0KTsKLQotCWlmICghdHhfY2xlYW5lZCkKKwlpZiAoIXR4X2NsZWFuX2NvbXBsZXRlKQogCQl3b3JrX2RvbmUgPSBidWRnZXQ7CiAKIAkvKiBJZiBidWRnZXQgbm90IGZ1bGx5IGNvbnN1bWVkLCBleGl0IHRoZSBwb2xsaW5nIG1vZGUgKi8KQEAgLTM5MjUsNyArMzQ3MCw5IEBACiAJCSAqIHNlZXMgdGhlIG5ldyBuZXh0X3RvX2NsZWFuLgogCQkgKi8KIAkJc21wX21iKCk7Ci0JCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikpIHsKKworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpICYmCisJCSAgICAhKHRlc3RfYml0KF9fRTEwMDBfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKSkpIHsKIAkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKIAkJCSsrYWRhcHRlci0+cmVzdGFydF9xdWV1ZTsKIAkJfQpAQCAtMzkzNSw4ICszNDgyLDggQEAKIAkJLyogRGV0ZWN0IGEgdHJhbnNtaXQgaGFuZyBpbiBoYXJkd2FyZSwgdGhpcyBzZXJpYWxpemVzIHRoZQogCQkgKiBjaGVjayB3aXRoIHRoZSBjbGVhcmluZyBvZiB0aW1lX3N0YW1wIGFuZCBtb3ZlbWVudCBvZiBpICovCiAJCWFkYXB0ZXItPmRldGVjdF90eF9odW5nID0gZmFsc2U7Ci0JCWlmICh0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS50aW1lX3N0YW1wICYmCi0JCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLnRpbWVfc3RhbXAgKworCQlpZiAodHhfcmluZy0+YnVmZmVyX2luZm9bZW9wXS50aW1lX3N0YW1wICYmCisJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2VvcF0udGltZV9zdGFtcCArCiAJCSAgICAgICAgICAgICAgIChhZGFwdGVyLT50eF90aW1lb3V0X2ZhY3RvciAqIEhaKSkKIAkJICAgICYmICEoZXIzMihTVEFUVVMpICYgRTEwMDBfU1RBVFVTX1RYT0ZGKSkgewogCkBAIC0zOTU4LDcgKzM1MDUsNyBAQAogCQkJCXJlYWRsKGh3LT5od19hZGRyICsgdHhfcmluZy0+dGR0KSwKIAkJCQl0eF9yaW5nLT5uZXh0X3RvX3VzZSwKIAkJCQl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuLAotCQkJCXR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLnRpbWVfc3RhbXAsCisJCQkJdHhfcmluZy0+YnVmZmVyX2luZm9bZW9wXS50aW1lX3N0YW1wLAogCQkJCWVvcCwKIAkJCQlqaWZmaWVzLAogCQkJCWVvcF9kZXNjLT51cHBlci5maWVsZHMuc3RhdHVzKTsKQEAgLTM5OTksMjUgKzM1NDYsMTMgQEAKIAkJcmV0dXJuOwogCX0KIAkvKiBUQ1AvVURQIENoZWNrc3VtIGhhcyBub3QgYmVlbiBjYWxjdWxhdGVkICovCi0JaWYgKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikgewotCQlpZiAoIShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9UQ1BDUykpCi0JCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJaWYgKCEoc3RhdHVzICYgKEUxMDAwX1JYRF9TVEFUX1RDUENTIHwgRTEwMDBfUlhEX1NUQVRfVURQQ1MpKSkKLQkJCXJldHVybjsKLQl9CisJaWYgKCEoc3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfVENQQ1MpKQorCQlyZXR1cm47CisKIAkvKiBJdCBtdXN0IGJlIGEgVENQIG9yIFVEUCBwYWNrZXQgd2l0aCBhIHZhbGlkIGNoZWNrc3VtICovCiAJaWYgKGxpa2VseShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9UQ1BDUykpIHsKIAkJLyogVENQIGNoZWNrc3VtIGlzIGdvb2QgKi8KIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQl9IGVsc2UgaWYgKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKSB7Ci0JCS8qIElQIGZyYWdtZW50IHdpdGggVURQIHBheWxvYWQgKi8KLQkJLyogSGFyZHdhcmUgY29tcGxlbWVudHMgdGhlIHBheWxvYWQgY2hlY2tzdW0sIHNvIHdlIHVuZG8gaXQKLQkJICogYW5kIHRoZW4gcHV0IHRoZSB2YWx1ZSBpbiBob3N0IG9yZGVyIGZvciBmdXJ0aGVyIHN0YWNrIHVzZS4KLQkJICovCi0JCV9fc3VtMTYgc3VtID0gKF9fZm9yY2UgX19zdW0xNilodG9ucyhjc3VtKTsKLQkJc2tiLT5jc3VtID0gY3N1bV91bmZvbGQofnN1bSk7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fQ09NUExFVEU7CiAJfQogCWFkYXB0ZXItPmh3X2NzdW1fZ29vZCsrOwogfQpAQCAtNDgxNCwyMCArNDM0OSw2IEBACiAJcGNpeF9zZXRfbW1yYmMoYWRhcHRlci0+cGRldiwgbW1yYmMpOwogfQogCi1zMzIgZTEwMDBfcmVhZF9wY2llX2NhcF9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIHJlZywgdTE2ICp2YWx1ZSkKLXsKLSAgICBzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5iYWNrOwotICAgIHUxNiBjYXBfb2Zmc2V0OwotCi0gICAgY2FwX29mZnNldCA9IHBjaV9maW5kX2NhcGFiaWxpdHkoYWRhcHRlci0+cGRldiwgUENJX0NBUF9JRF9FWFApOwotICAgIGlmICghY2FwX29mZnNldCkKLSAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOwotCi0gICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcHRlci0+cGRldiwgY2FwX29mZnNldCArIHJlZywgdmFsdWUpOwotCi0gICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Ci19Ci0KIHZvaWQgZTEwMDBfaW9fd3JpdGUoc3RydWN0IGUxMDAwX2h3ICpodywgdW5zaWduZWQgbG9uZyBwb3J0LCB1MzIgdmFsdWUpCiB7CiAJb3V0bCh2YWx1ZSwgcG9ydCk7CkBAIC00ODUwLDMzICs0MzcxLDI3IEBACiAJCWN0cmwgfD0gRTEwMDBfQ1RSTF9WTUU7CiAJCWV3MzIoQ1RSTCwgY3RybCk7CiAKLQkJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlICE9IGUxMDAwX2ljaDhsYW4pIHsKLQkJCS8qIGVuYWJsZSBWTEFOIHJlY2VpdmUgZmlsdGVyaW5nICovCi0JCQlyY3RsID0gZXIzMihSQ1RMKTsKLQkJCXJjdGwgJj0gfkUxMDAwX1JDVExfQ0ZJRU47Ci0JICAgICAgICAgICAgICAgIGlmICghKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykpCi0JCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1ZGRTsKLQkJCWV3MzIoUkNUTCwgcmN0bCk7Ci0JCQllMTAwMF91cGRhdGVfbW5nX3ZsYW4oYWRhcHRlcik7Ci0JCX0KKwkJLyogZW5hYmxlIFZMQU4gcmVjZWl2ZSBmaWx0ZXJpbmcgKi8KKwkJcmN0bCA9IGVyMzIoUkNUTCk7CisJCXJjdGwgJj0gfkUxMDAwX1JDVExfQ0ZJRU47CisJCWlmICghKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykpCisJCQlyY3RsIHw9IEUxMDAwX1JDVExfVkZFOworCQlldzMyKFJDVEwsIHJjdGwpOworCQllMTAwMF91cGRhdGVfbW5nX3ZsYW4oYWRhcHRlcik7CiAJfSBlbHNlIHsKIAkJLyogZGlzYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KIAkJY3RybCA9IGVyMzIoQ1RSTCk7CiAJCWN0cmwgJj0gfkUxMDAwX0NUUkxfVk1FOwogCQlldzMyKENUUkwsIGN0cmwpOwogCi0JCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuKSB7Ci0JCQkvKiBkaXNhYmxlIFZMQU4gcmVjZWl2ZSBmaWx0ZXJpbmcgKi8KLQkJCXJjdGwgPSBlcjMyKFJDVEwpOwotCQkJcmN0bCAmPSB+RTEwMDBfUkNUTF9WRkU7Ci0JCQlldzMyKFJDVEwsIHJjdGwpOworCQkvKiBkaXNhYmxlIFZMQU4gcmVjZWl2ZSBmaWx0ZXJpbmcgKi8KKwkJcmN0bCA9IGVyMzIoUkNUTCk7CisJCXJjdGwgJj0gfkUxMDAwX1JDVExfVkZFOworCQlldzMyKFJDVEwsIHJjdGwpOwogCi0JCQlpZiAoYWRhcHRlci0+bW5nX3ZsYW5faWQgIT0KLQkJCSAgICAodTE2KUUxMDAwX01OR19WTEFOX05PTkUpIHsKLQkJCQllMTAwMF92bGFuX3J4X2tpbGxfdmlkKG5ldGRldiwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPm1uZ192bGFuX2lkKTsKLQkJCQlhZGFwdGVyLT5tbmdfdmxhbl9pZCA9IEUxMDAwX01OR19WTEFOX05PTkU7Ci0JCQl9CisJCWlmIChhZGFwdGVyLT5tbmdfdmxhbl9pZCAhPSAodTE2KUUxMDAwX01OR19WTEFOX05PTkUpIHsKKwkJCWUxMDAwX3ZsYW5fcnhfa2lsbF92aWQobmV0ZGV2LCBhZGFwdGVyLT5tbmdfdmxhbl9pZCk7CisJCQlhZGFwdGVyLT5tbmdfdmxhbl9pZCA9IEUxMDAwX01OR19WTEFOX05PTkU7CiAJCX0KIAl9CiAKQEAgLTQ5MTMsMTQgKzQ0MjgsNiBAQAogCWlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKQogCQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOwogCi0JaWYgKChody0+bW5nX2Nvb2tpZS5zdGF0dXMgJgotCSAgICAgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX1NUQVRVU19WTEFOX1NVUFBPUlQpICYmCi0JICAgICh2aWQgPT0gYWRhcHRlci0+bW5nX3ZsYW5faWQpKSB7Ci0JCS8qIHJlbGVhc2UgY29udHJvbCB0byBmL3cgKi8KLQkJZTEwMDBfcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwotCQlyZXR1cm47Ci0JfQotCiAJLyogcmVtb3ZlIFZJRCBmcm9tIGZpbHRlciB0YWJsZSAqLwogCWluZGV4ID0gKHZpZCA+PiA1KSAmIDB4N0Y7CiAJdmZ0YSA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKGh3LCBWRlRBLCBpbmRleCk7CkBAIC01MDMxLDE2ICs0NTM4LDEzIEBACiAJCX0KIAogCQlpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAotCQkgICBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgeworCQkgICAgaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpIHsKIAkJCS8qIGtlZXAgdGhlIGxhc2VyIHJ1bm5pbmcgaW4gRDMgKi8KIAkJCWN0cmxfZXh0ID0gZXIzMihDVFJMX0VYVCk7CiAJCQljdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9TRFA3X0RBVEE7CiAJCQlldzMyKENUUkxfRVhULCBjdHJsX2V4dCk7CiAJCX0KIAotCQkvKiBBbGxvdyB0aW1lIGZvciBwZW5kaW5nIG1hc3RlciByZXF1ZXN0cyB0byBydW4gKi8KLQkJZTEwMDBfZGlzYWJsZV9wY2lleF9tYXN0ZXIoaHcpOwotCiAJCWV3MzIoV1VDLCBFMTAwMF9XVUNfUE1FX0VOKTsKIAkJZXczMihXVUZDLCB3dWZjKTsKIAl9IGVsc2UgewpAQCAtNTA1NiwxNiArNDU2MCw5IEBACiAJaWYgKGFkYXB0ZXItPmVuX21uZ19wdCkKIAkJKmVuYWJsZV93YWtlID0gdHJ1ZTsKIAotCWlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncF8zKQotCQllMTAwMF9waHlfcG93ZXJkb3duX3dvcmthcm91bmQoaHcpOwotCiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJZTEwMDBfZnJlZV9pcnEoYWRhcHRlcik7CiAKLQkvKiBSZWxlYXNlIGNvbnRyb2wgb2YgaC93IHRvIGYvdy4gIElmIGYvdyBpcyBBTVQgZW5hYmxlZCwgdGhpcwotCSAqIHdvdWxkIGhhdmUgYWxyZWFkeSBoYXBwZW5lZCBpbiBjbG9zZSBhbmQgaXMgcmVkdW5kYW50LiAqLwotCWUxMDAwX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKLQogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAogCXJldHVybiAwOwpAQCAtNTEzMSwxNCArNDYyOCw2IEBACiAKIAluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CiAKLQkvKiBJZiB0aGUgY29udHJvbGxlciBpcyA4MjU3MyBhbmQgZi93IGlzIEFNVCwgZG8gbm90IHNldAotCSAqIERSVl9MT0FEIHVudGlsIHRoZSBpbnRlcmZhY2UgaXMgdXAuICBGb3IgYWxsIG90aGVyIGNhc2VzLAotCSAqIGxldCB0aGUgZi93IGtub3cgdGhhdCB0aGUgaC93IGlzIG5vdyB1bmRlciB0aGUgY29udHJvbAotCSAqIG9mIHRoZSBkcml2ZXIuICovCi0JaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU3MyB8fAotCSAgICAhZTEwMDBfY2hlY2tfbW5nX21vZGUoaHcpKQotCQllMTAwMF9nZXRfaHdfY29udHJvbChhZGFwdGVyKTsKLQogCXJldHVybiAwOwogfQogI2VuZGlmCkBAIC01MTc0LDcgKzQ2NjMsNyBAQAogLyoqCiAgKiBlMTAwMF9pb19lcnJvcl9kZXRlY3RlZCAtIGNhbGxlZCB3aGVuIFBDSSBlcnJvciBpcyBkZXRlY3RlZAogICogQHBkZXY6IFBvaW50ZXIgdG8gUENJIGRldmljZQotICogQHN0YXRlOiBUaGUgY3VycmVudCBwY2kgY29ubmVlY3Rpb24gc3RhdGUKKyAqIEBzdGF0ZTogVGhlIGN1cnJlbnQgcGNpIGNvbm5lY3Rpb24gc3RhdGUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhIFBDSSBidXMgZXJyb3IgYWZmZWN0aW5nCiAgKiB0aGlzIGRldmljZSBoYXMgYmVlbiBkZXRlY3RlZC4KQEAgLTUyNDMsNyArNDczMiw2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCWUxMDAwX2luaXRfbWFuYWdlYWJpbGl0eShhZGFwdGVyKTsKIApAQCAtNTI1NSwxNSArNDc0Myw2IEBACiAJfQogCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwotCi0JLyogSWYgdGhlIGNvbnRyb2xsZXIgaXMgODI1NzMgYW5kIGYvdyBpcyBBTVQsIGRvIG5vdCBzZXQKLQkgKiBEUlZfTE9BRCB1bnRpbCB0aGUgaW50ZXJmYWNlIGlzIHVwLiAgRm9yIGFsbCBvdGhlciBjYXNlcywKLQkgKiBsZXQgdGhlIGYvdyBrbm93IHRoYXQgdGhlIGgvdyBpcyBub3cgdW5kZXIgdGhlIGNvbnRyb2wKLQkgKiBvZiB0aGUgZHJpdmVyLiAqLwotCWlmIChody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NzMgfHwKLQkgICAgIWUxMDAwX2NoZWNrX21uZ19tb2RlKGh3KSkKLQkJZTEwMDBfZ2V0X2h3X2NvbnRyb2woYWRhcHRlcik7Ci0KIH0KIAogLyogZTEwMDBfbWFpbi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYwppbmRleCAyMTM0MzdkLi4zOGQyNzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMKQEAgLTUxOCwyMiArNTE4LDYgQEAKIAkJCWFkYXB0ZXItPnNtYXJ0X3Bvd2VyX2Rvd24gPSBvcHQuZGVmOwogCQl9CiAJfQotCXsgLyogS3VtZXJhbiBMb2NrIExvc3MgV29ya2Fyb3VuZCAqLwotCQlvcHQgPSAoc3RydWN0IGUxMDAwX29wdGlvbikgewotCQkJLnR5cGUgPSBlbmFibGVfb3B0aW9uLAotCQkJLm5hbWUgPSAiS3VtZXJhbiBMb2NrIExvc3MgV29ya2Fyb3VuZCIsCi0JCQkuZXJyICA9ICJkZWZhdWx0aW5nIHRvIEVuYWJsZWQiLAotCQkJLmRlZiAgPSBPUFRJT05fRU5BQkxFRAotCQl9OwotCi0JCWlmIChudW1fS3VtZXJhbkxvY2tMb3NzID4gYmQpIHsKLQkJCXVuc2lnbmVkIGludCBrbXJuX2xvY2tfbG9zcyA9IEt1bWVyYW5Mb2NrTG9zc1tiZF07Ci0JCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmttcm5fbG9ja19sb3NzLCAmb3B0LCBhZGFwdGVyKTsKLQkJCWFkYXB0ZXItPmh3Lmttcm5fbG9ja19sb3NzX3dvcmthcm91bmRfZGlzYWJsZWQgPSAha21ybl9sb2NrX2xvc3M7Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyLT5ody5rbXJuX2xvY2tfbG9zc193b3JrYXJvdW5kX2Rpc2FibGVkID0gIW9wdC5kZWY7Ci0JCX0KLQl9CiAKIAlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUpIHsKIAljYXNlIGUxMDAwX21lZGlhX3R5cGVfZmliZXI6CkBAIC02MjYsMTIgKzYxMCw2IEBACiAJCQkJCSAucCA9IGRwbHhfbGlzdCB9fQogCQl9OwogCi0JCWlmIChlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soJmFkYXB0ZXItPmh3KSkgewotCQkJRFBSSU5USyhQUk9CRSwgSU5GTywKLQkJCQkiTGluayBhY3RpdmUgZHVlIHRvIFNvTC9JREVSIFNlc3Npb24uICIKLQkJCSAgICAgICAgIlNwZWVkL0R1cGxleC9BdXRvTmVnIHBhcmFtZXRlciBpZ25vcmVkLlxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJaWYgKG51bV9EdXBsZXggPiBiZCkgewogCQkJZHBseCA9IER1cGxleFtiZF07CiAJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmRwbHgsICZvcHQsIGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYwppbmRleCBiNTNiNDBiLi5kMWUwNTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYwpAQCAtMTgwMyw3ICsxODAzLDcgQEAKIAkJCQkgIHwgRkxBR19IQVNfQU1UCiAJCQkJICB8IEZMQUdfSEFTX0NUUkxFWFRfT05fTE9BRCwKIAkucGJhCQkJPSAyMCwKLQkubWF4X2h3X2ZyYW1lX3NpemUJPSBFVEhfRlJBTUVfTEVOICsgRVRIX0ZDU19MRU4sCisJLm1heF9od19mcmFtZV9zaXplCT0gREVGQVVMVF9KVU1CTywKIAkuZ2V0X3ZhcmlhbnRzCQk9IGUxMDAwX2dldF92YXJpYW50c184MjU3MSwKIAkubWFjX29wcwkJPSAmZTgyNTcxX21hY19vcHMsCiAJLnBoeV9vcHMJCT0gJmU4Ml9waHlfb3BzX2JtLApAQCAtMTgyMCw3ICsxODIwLDcgQEAKIAkJCQkgIHwgRkxBR19IQVNfQU1UCiAJCQkJICB8IEZMQUdfSEFTX0NUUkxFWFRfT05fTE9BRCwKIAkucGJhCQkJPSAyMCwKLQkubWF4X2h3X2ZyYW1lX3NpemUJPSBERUZBVUxUX0pVTUJPLAorCS5tYXhfaHdfZnJhbWVfc2l6ZQk9IEVUSF9GUkFNRV9MRU4gKyBFVEhfRkNTX0xFTiwKIAkuZ2V0X3ZhcmlhbnRzCQk9IGUxMDAwX2dldF92YXJpYW50c184MjU3MSwKIAkubWFjX29wcwkJPSAmZTgyNTcxX21hY19vcHMsCiAJLnBoeV9vcHMJCT0gJmU4Ml9waHlfb3BzX2JtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2RlZmluZXMuaCBiL2RyaXZlcnMvbmV0L2UxMDAwZS9kZWZpbmVzLmgKaW5kZXggYzBmMTg1Yi4uMTE5MDE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2RlZmluZXMuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvZGVmaW5lcy5oCkBAIC03Niw2ICs3Niw3IEBACiAvKiBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCAqLwogI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA3X0RBVEEgMHgwMDAwMDA4MCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmFibGUgUGluIDcgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfRUVfUlNUICAgIDB4MDAwMDIwMDAgLyogUmVpbml0aWFsaXplIGZyb20gRUVQUk9NICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NQRF9CWVBTICAweDAwMDA4MDAwIC8qIFNwZWVkIFNlbGVjdCBCeXBhc3MgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUk9fRElTICAgIDB4MDAwMjAwMDAgLyogUmVsYXhlZCBPcmRlcmluZyBkaXNhYmxlICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0RNQV9EWU5fQ0xLX0VOIDB4MDAwODAwMDAgLyogRE1BIER5bmFtaWMgQ2xvY2sgR2F0aW5nICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9NQVNLIDB4MDBDMDAwMDAKQEAgLTM0Nyw2ICszNDgsNyBAQAogLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBDb250cm9sIGFuZCBTaXplICovCiAjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX01ESU9fU1dfT1dORVJTSElQICAgICAgMHgwMDAwMDAyMAogI2RlZmluZSBFMTAwMF9FWFRDTkZfQ1RSTF9MQ0RfV1JJVEVfRU5BQkxFICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRTEwMDBfRVhUQ05GX0NUUkxfT0VNX1dSSVRFX0VOQUJMRSAgICAgICAweDAwMDAwMDA4CiAjZGVmaW5lIEUxMDAwX0VYVENORl9DVFJMX1NXRkxBRyAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAogI2RlZmluZSBFMTAwMF9FWFRDTkZfU0laRV9FWFRfUENJRV9MRU5HVEhfTUFTSyAgIDB4MDBGRjAwMDAKICNkZWZpbmUgRTEwMDBfRVhUQ05GX1NJWkVfRVhUX1BDSUVfTEVOR1RIX1NISUZUICAgICAgICAgIDE2CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvZTEwMDAuaCBiL2RyaXZlcnMvbmV0L2UxMDAwZS9lMTAwMC5oCmluZGV4IDk4MTkzNmMuLjE4OWRmYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9lMTAwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9lMTAwMC5oCkBAIC0xNDEsNiArMTQxLDIwIEBACiAjZGVmaW5lIEhWX1ROQ1JTX1VQUEVSCQlQSFlfUkVHKDc3OCwgMjkpIC8qIFRyYW5zbWl0IHdpdGggbm8gQ1JTICovCiAjZGVmaW5lIEhWX1ROQ1JTX0xPV0VSCQlQSFlfUkVHKDc3OCwgMzApCiAKKy8qIEJNIFBIWSBDb3BwZXIgU3BlY2lmaWMgU3RhdHVzICovCisjZGVmaW5lIEJNX0NTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBCTV9DU19TVEFUVVNfTElOS19VUCAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEJNX0NTX1NUQVRVU19SRVNPTFZFRCAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgQk1fQ1NfU1RBVFVTX1NQRUVEX01BU0sgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBCTV9DU19TVEFUVVNfU1BFRURfMTAwMCAgICAgICAgICAgMHg4MDAwCisKKy8qIDgyNTc3IE1vYmlsZSBQaHkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEhWX01fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBIVl9NX1NUQVRVU19BVVRPTkVHX0NPTVBMRVRFICAgICAgMHgxMDAwCisjZGVmaW5lIEhWX01fU1RBVFVTX1NQRUVEX01BU0sgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgSFZfTV9TVEFUVVNfU1BFRURfMTAwMCAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBIVl9NX1NUQVRVU19MSU5LX1VQICAgICAgICAgICAgICAgMHgwMDQwCisKIGVudW0gZTEwMDBfYm9hcmRzIHsKIAlib2FyZF84MjU3MSwKIAlib2FyZF84MjU3MiwKQEAgLTUxOSw5ICs1MzMsMTMgQEAKIGV4dGVybiBzMzIgZTEwMDBlX2dldF9jYWJsZV9sZW5ndGhfaWdwXzIoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBleHRlcm4gczMyIGUxMDAwZV9nZXRfcGh5X2luZm9faWdwKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHMzMiBlMTAwMGVfcmVhZF9waHlfcmVnX2lncChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpOworZXh0ZXJuIHMzMiBlMTAwMGVfcmVhZF9waHlfcmVnX2lncF9sb2NrZWQoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwZV9waHlfaHdfcmVzZXRfZ2VuZXJpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGV4dGVybiBzMzIgZTEwMDBlX3NldF9kM19scGx1X3N0YXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIGJvb2wgYWN0aXZlKTsKIGV4dGVybiBzMzIgZTEwMDBlX3dyaXRlX3BoeV9yZWdfaWdwKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKTsKK2V4dGVybiBzMzIgZTEwMDBlX3dyaXRlX3BoeV9yZWdfaWdwX2xvY2tlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBkYXRhKTsKIGV4dGVybiBzMzIgZTEwMDBlX3BoeV9zd19yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGV4dGVybiBzMzIgZTEwMDBlX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXhfbTg4KHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHMzMiBlMTAwMGVfZ2V0X2NmZ19kb25lKHN0cnVjdCBlMTAwMF9odyAqaHcpOwpAQCAtNTM4LDcgKzU1NiwxMSBAQAogZXh0ZXJuIHMzMiBlMTAwMGVfd3JpdGVfcGh5X3JlZ19ibTIoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpOwogZXh0ZXJuIHZvaWQgZTEwMDBlX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXhfc2V0dXAoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2ICpwaHlfY3RybCk7CiBleHRlcm4gczMyIGUxMDAwZV93cml0ZV9rbXJuX3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSk7CitleHRlcm4gczMyIGUxMDAwZV93cml0ZV9rbXJuX3JlZ19sb2NrZWQoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwZV9yZWFkX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSk7CitleHRlcm4gczMyIGUxMDAwZV9yZWFkX2ttcm5fcmVnX2xvY2tlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICpkYXRhKTsKIGV4dGVybiBzMzIgZTEwMDBlX3BoeV9oYXNfbGlua19nZW5lcmljKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBpdGVyYXRpb25zLAogCQkJICAgICAgIHUzMiB1c2VjX2ludGVydmFsLCBib29sICpzdWNjZXNzKTsKIGV4dGVybiBzMzIgZTEwMDBlX3BoeV9yZXNldF9kc3Aoc3RydWN0IGUxMDAwX2h3ICpodyk7CkBAIC01NDYsNyArNTY4LDExIEBACiBleHRlcm4gczMyIGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpOwogZXh0ZXJuIHMzMiBlMTAwMGVfY2hlY2tfZG93bnNoaWZ0KHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHMzMiBlMTAwMF9yZWFkX3BoeV9yZWdfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKTsKK2V4dGVybiBzMzIgZTEwMDBfcmVhZF9waHlfcmVnX2h2X2xvY2tlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwX3dyaXRlX3BoeV9yZWdfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpOworZXh0ZXJuIHMzMiBlMTAwMF93cml0ZV9waHlfcmVnX2h2X2xvY2tlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwX3NldF9tZGlvX3Nsb3dfbW9kZV9odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIHNsb3cpOwogZXh0ZXJuIHMzMiBlMTAwMF9saW5rX3N0YWxsX3dvcmthcm91bmRfaHYoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBleHRlcm4gczMyIGUxMDAwX2NvcHBlcl9saW5rX3NldHVwXzgyNTc3KHN0cnVjdCBlMTAwMF9odyAqaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmggYi9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaAppbmRleCBmZDQ0ZDlmLi5hYWVhNDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaApAQCAtNzY0LDExICs3NjQsMTMgQEAKIAlzMzIgICgqZ2V0X2NhYmxlX2xlbmd0aCkoc3RydWN0IGUxMDAwX2h3ICopOwogCXMzMiAgKCpnZXRfcGh5X2luZm8pKHN0cnVjdCBlMTAwMF9odyAqKTsKIAlzMzIgICgqcmVhZF9waHlfcmVnKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTMyLCB1MTYgKik7CisJczMyICAoKnJlYWRfcGh5X3JlZ19sb2NrZWQpKHN0cnVjdCBlMTAwMF9odyAqLCB1MzIsIHUxNiAqKTsKIAl2b2lkICgqcmVsZWFzZV9waHkpKHN0cnVjdCBlMTAwMF9odyAqKTsKIAlzMzIgICgqcmVzZXRfcGh5KShzdHJ1Y3QgZTEwMDBfaHcgKik7CiAJczMyICAoKnNldF9kMF9scGx1X3N0YXRlKShzdHJ1Y3QgZTEwMDBfaHcgKiwgYm9vbCk7CiAJczMyICAoKnNldF9kM19scGx1X3N0YXRlKShzdHJ1Y3QgZTEwMDBfaHcgKiwgYm9vbCk7CiAJczMyICAoKndyaXRlX3BoeV9yZWcpKHN0cnVjdCBlMTAwMF9odyAqLCB1MzIsIHUxNik7CisJczMyICAoKndyaXRlX3BoeV9yZWdfbG9ja2VkKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTMyLCB1MTYpOwogCXMzMiAgKCpjZmdfb25fbGlua191cCkoc3RydWN0IGUxMDAwX2h3ICopOwogfTsKIApAQCAtOTAxLDYgKzkwMyw3IEBACiBzdHJ1Y3QgZTEwMDBfZGV2X3NwZWNfaWNoOGxhbiB7CiAJYm9vbCBrbXJuX2xvY2tfbG9zc193b3JrYXJvdW5kX2VuYWJsZWQ7CiAJc3RydWN0IGUxMDAwX3NoYWRvd19yYW0gc2hhZG93X3JhbVtFMTAwMF9JQ0g4X1NIQURPV19SQU1fV09SRFNdOworCWJvb2wgbnZtX2sxX2VuYWJsZWQ7CiB9OwogCiBzdHJ1Y3QgZTEwMDBfaHcgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMKaW5kZXggOTlkZjJhYi4uNTFkZGIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvaWNoOGxhbi5jCkBAIC0xMjIsNiArMTIyLDI3IEBACiAKICNkZWZpbmUgSFZfTEVEX0NPTkZJRwkJUEhZX1JFRyg3NjgsIDMwKSAvKiBMRUQgQ29uZmlndXJhdGlvbiAqLwogCisjZGVmaW5lIFNXX0ZMQUdfVElNRU9VVCAgICAxMDAwIC8qIFNXIFNlbWFwaG9yZSBmbGFnIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCisKKy8qIFNNQnVzIEFkZHJlc3MgUGh5IFJlZ2lzdGVyICovCisjZGVmaW5lIEhWX1NNQl9BRERSICAgICAgICAgICAgUEhZX1JFRyg3NjgsIDI2KQorI2RlZmluZSBIVl9TTUJfQUREUl9QRUNfRU4gICAgIDB4MDIwMAorI2RlZmluZSBIVl9TTUJfQUREUl9WQUxJRCAgICAgIDB4MDA4MAorCisvKiBTdHJhcHBpbmcgT3B0aW9uIFJlZ2lzdGVyIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfU1RSQVAgICAgICAgICAgICAgICAgICAgICAweDAwMDBDCisjZGVmaW5lIEUxMDAwX1NUUkFQX1NNQlVTX0FERFJFU1NfTUFTSyAgMHgwMEZFMDAwMAorI2RlZmluZSBFMTAwMF9TVFJBUF9TTUJVU19BRERSRVNTX1NISUZUIDE3CisKKy8qIE9FTSBCaXRzIFBoeSBSZWdpc3RlciAqLworI2RlZmluZSBIVl9PRU1fQklUUyAgICAgICAgICAgIFBIWV9SRUcoNzY4LCAyNSkKKyNkZWZpbmUgSFZfT0VNX0JJVFNfTFBMVSAgICAgICAweDAwMDQgLyogTG93IFBvd2VyIExpbmsgVXAgKi8KKyNkZWZpbmUgSFZfT0VNX0JJVFNfR0JFX0RJUyAgICAweDAwNDAgLyogR2lnYWJpdCBEaXNhYmxlICovCisjZGVmaW5lIEhWX09FTV9CSVRTX1JFU1RBUlRfQU4gMHgwNDAwIC8qIFJlc3RhcnQgQXV0by1uZWdvdGlhdGlvbiAqLworCisjZGVmaW5lIEUxMDAwX05WTV9LMV9DT05GSUcgMHgxQiAvKiBOVk0gSzEgQ29uZmlnIFdvcmQgKi8KKyNkZWZpbmUgRTEwMDBfTlZNX0sxX0VOQUJMRSAweDEgIC8qIE5WTSBFbmFibGUgSzEgYml0ICovCisKIC8qIElDSCBHYkUgRmxhc2ggSGFyZHdhcmUgU2VxdWVuY2luZyBGbGFzaCBTdGF0dXMgUmVnaXN0ZXIgYml0IGJyZWFrZG93biAqLwogLyogT2Zmc2V0IDA0aCBIU0ZTVFMgKi8KIHVuaW9uIGljaDhfaHdzX2ZsYXNoX3N0YXR1cyB7CkBAIC0yMDAsNiArMjIxLDEwIEBACiBzdGF0aWMgczMyIGUxMDAwX2NsZWFudXBfbGVkX3BjaGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyBzMzIgZTEwMDBfbGVkX29uX3BjaGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyBzMzIgZTEwMDBfbGVkX29mZl9wY2hsYW4oc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgczMyIGUxMDAwX3NldF9scGx1X3N0YXRlX3BjaGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGFjdGl2ZSk7CitzdGF0aWMgdm9pZCBlMTAwMF9sYW5faW5pdF9kb25lX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgczMyICBlMTAwMF9rMV9naWdfd29ya2Fyb3VuZF9odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGxpbmspOworc3RhdGljIHMzMiBlMTAwMF9jb25maWd1cmVfazFfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGsxX2VuYWJsZSk7CiAKIHN0YXRpYyBpbmxpbmUgdTE2IF9fZXIxNmZsYXNoKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmVnKQogewpAQCAtMjQyLDcgKzI2NywxMSBAQAogCiAJcGh5LT5vcHMuY2hlY2tfcG9sYXJpdHkgICAgICAgPSBlMTAwMF9jaGVja19wb2xhcml0eV9pZmVfaWNoOGxhbjsKIAlwaHktPm9wcy5yZWFkX3BoeV9yZWcgICAgICAgICA9IGUxMDAwX3JlYWRfcGh5X3JlZ19odjsKKwlwaHktPm9wcy5yZWFkX3BoeV9yZWdfbG9ja2VkICA9IGUxMDAwX3JlYWRfcGh5X3JlZ19odl9sb2NrZWQ7CisJcGh5LT5vcHMuc2V0X2QwX2xwbHVfc3RhdGUgICAgPSBlMTAwMF9zZXRfbHBsdV9zdGF0ZV9wY2hsYW47CisJcGh5LT5vcHMuc2V0X2QzX2xwbHVfc3RhdGUgICAgPSBlMTAwMF9zZXRfbHBsdV9zdGF0ZV9wY2hsYW47CiAJcGh5LT5vcHMud3JpdGVfcGh5X3JlZyAgICAgICAgPSBlMTAwMF93cml0ZV9waHlfcmVnX2h2OworCXBoeS0+b3BzLndyaXRlX3BoeV9yZWdfbG9ja2VkID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19odl9sb2NrZWQ7CiAJcGh5LT5hdXRvbmVnX21hc2sgICAgICAgICAgICAgPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOwogCiAJcGh5LT5pZCA9IGUxMDAwX3BoeV91bmtub3duOwpAQCAtMzAzLDYgKzMzMiw4IEBACiAJY2FzZSBJR1AwM0UxMDAwX0VfUEhZX0lEOgogCQlwaHktPnR5cGUgPSBlMTAwMF9waHlfaWdwXzM7CiAJCXBoeS0+YXV0b25lZ19tYXNrID0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKKwkJcGh5LT5vcHMucmVhZF9waHlfcmVnX2xvY2tlZCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfaWdwX2xvY2tlZDsKKwkJcGh5LT5vcHMud3JpdGVfcGh5X3JlZ19sb2NrZWQgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19pZ3BfbG9ja2VkOwogCQlicmVhazsKIAljYXNlIElGRV9FX1BIWV9JRDoKIAljYXNlIElGRV9QTFVTX0VfUEhZX0lEOgpAQCAtNDY5LDE0ICs1MDAsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaGxhbikgewotCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX2ttcm5fcmVnKGh3LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0tNUk5DVFJMU1RBX0sxX0NPTkZJRywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9LTVJOQ1RSTFNUQV9LMV9FTkFCTEUpOwotCQlpZiAocmV0X3ZhbCkKLQkJCWdvdG8gb3V0OwotCX0KLQogCS8qCiAJICogRmlyc3Qgd2Ugd2FudCB0byBzZWUgaWYgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgcmVwb3J0cwogCSAqIGxpbmsuICBJZiBzbywgdGhlbiB3ZSB3YW50IHRvIGdldCB0aGUgY3VycmVudCBzcGVlZC9kdXBsZXgKQEAgLTQ4Niw2ICs1MDksMTIgQEAKIAlpZiAocmV0X3ZhbCkKIAkJZ290byBvdXQ7CiAKKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaGxhbikgeworCQlyZXRfdmFsID0gZTEwMDBfazFfZ2lnX3dvcmthcm91bmRfaHYoaHcsIGxpbmspOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCX0KKwogCWlmICghbGluaykKIAkJZ290byBvdXQ7IC8qIE5vIGxpbmsgZGV0ZWN0ZWQgKi8KIApAQCAtNTY4LDEyICs1OTcsMzkgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgobnZtX211dGV4KTsKIAogLyoqCisgKiAgZTEwMDBfYWNxdWlyZV9udm1faWNoOGxhbiAtIEFjcXVpcmUgTlZNIG11dGV4CisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqCisgKiAgQWNxdWlyZXMgdGhlIG11dGV4IGZvciBwZXJmb3JtaW5nIE5WTSBvcGVyYXRpb25zLgorICoqLworc3RhdGljIHMzMiBlMTAwMF9hY3F1aXJlX252bV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJbXV0ZXhfbG9jaygmbnZtX211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBlMTAwMF9yZWxlYXNlX252bV9pY2g4bGFuIC0gUmVsZWFzZSBOVk0gbXV0ZXgKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICoKKyAqICBSZWxlYXNlcyB0aGUgbXV0ZXggdXNlZCB3aGlsZSBwZXJmb3JtaW5nIE5WTSBvcGVyYXRpb25zLgorICoqLworc3RhdGljIHZvaWQgZTEwMDBfcmVsZWFzZV9udm1faWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCW11dGV4X3VubG9jaygmbnZtX211dGV4KTsKKworCXJldHVybjsKK30KKworc3RhdGljIERFRklORV9NVVRFWChzd2ZsYWdfbXV0ZXgpOworCisvKioKICAqICBlMTAwMF9hY3F1aXJlX3N3ZmxhZ19pY2g4bGFuIC0gQWNxdWlyZSBzb2Z0d2FyZSBjb250cm9sIGZsYWcKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICoKLSAqICBBY3F1aXJlcyB0aGUgc29mdHdhcmUgY29udHJvbCBmbGFnIGZvciBwZXJmb3JtaW5nIE5WTSBhbmQgUEhZCi0gKiAgb3BlcmF0aW9ucy4gIFRoaXMgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGVudHJ5IHBvaW50IG9ubHkgY2FsbGVkIGJ5Ci0gKiAgcmVhZC93cml0ZSByb3V0aW5lcyBmb3IgdGhlIFBIWSBhbmQgTlZNIHBhcnRzLgorICogIEFjcXVpcmVzIHRoZSBzb2Z0d2FyZSBjb250cm9sIGZsYWcgZm9yIHBlcmZvcm1pbmcgUEhZIGFuZCBzZWxlY3QKKyAqICBNQUMgQ1NSIGFjY2Vzc2VzLgogICoqLwogc3RhdGljIHMzMiBlMTAwMF9hY3F1aXJlX3N3ZmxhZ19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CkBAIC01ODIsNyArNjM4LDcgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKLQltdXRleF9sb2NrKCZudm1fbXV0ZXgpOworCW11dGV4X2xvY2soJnN3ZmxhZ19tdXRleCk7CiAKIAl3aGlsZSAodGltZW91dCkgewogCQlleHRjbmZfY3RybCA9IGVyMzIoRVhUQ05GX0NUUkwpOwpAQCAtNTk5LDcgKzY1NSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXRpbWVvdXQgPSBQSFlfQ0ZHX1RJTUVPVVQgKiAyOworCXRpbWVvdXQgPSBTV19GTEFHX1RJTUVPVVQ7CiAKIAlleHRjbmZfY3RybCB8PSBFMTAwMF9FWFRDTkZfQ1RSTF9TV0ZMQUc7CiAJZXczMihFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOwpAQCAtNjIzLDcgKzY3OSw3IEBACiAKIG91dDoKIAlpZiAocmV0X3ZhbCkKLQkJbXV0ZXhfdW5sb2NrKCZudm1fbXV0ZXgpOworCQltdXRleF91bmxvY2soJnN3ZmxhZ19tdXRleCk7CiAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KQEAgLTYzMiw5ICs2ODgsOCBAQAogICogIGUxMDAwX3JlbGVhc2Vfc3dmbGFnX2ljaDhsYW4gLSBSZWxlYXNlIHNvZnR3YXJlIGNvbnRyb2wgZmxhZwogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKgotICogIFJlbGVhc2VzIHRoZSBzb2Z0d2FyZSBjb250cm9sIGZsYWcgZm9yIHBlcmZvcm1pbmcgTlZNIGFuZCBQSFkgb3BlcmF0aW9ucy4KLSAqICBUaGlzIGlzIGEgZnVuY3Rpb24gcG9pbnRlciBlbnRyeSBwb2ludCBvbmx5IGNhbGxlZCBieSByZWFkL3dyaXRlCi0gKiAgcm91dGluZXMgZm9yIHRoZSBQSFkgYW5kIE5WTSBwYXJ0cy4KKyAqICBSZWxlYXNlcyB0aGUgc29mdHdhcmUgY29udHJvbCBmbGFnIGZvciBwZXJmb3JtaW5nIFBIWSBhbmQgc2VsZWN0CisgKiAgTUFDIENTUiBhY2Nlc3Nlcy4KICAqKi8KIHN0YXRpYyB2b2lkIGUxMDAwX3JlbGVhc2Vfc3dmbGFnX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodykKIHsKQEAgLTY0NCw3ICs2OTksOSBAQAogCWV4dGNuZl9jdHJsICY9IH5FMTAwMF9FWFRDTkZfQ1RSTF9TV0ZMQUc7CiAJZXczMihFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOwogCi0JbXV0ZXhfdW5sb2NrKCZudm1fbXV0ZXgpOworCW11dGV4X3VubG9jaygmc3dmbGFnX211dGV4KTsKKworCXJldHVybjsKIH0KIAogLyoqCkBAIC03NTIsNiArODA5LDMyNiBAQAogfQogCiAvKioKKyAqICBlMTAwMF9zd19sY2RfY29uZmlnX2ljaDhsYW4gLSBTVy1iYXNlZCBMQ0QgQ29uZmlndXJhdGlvbgorICogIEBodzogICBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqCisgKiAgU1cgc2hvdWxkIGNvbmZpZ3VyZSB0aGUgTENEIGZyb20gdGhlIE5WTSBleHRlbmRlZCBjb25maWd1cmF0aW9uIHJlZ2lvbgorICogIGFzIGEgd29ya2Fyb3VuZCBmb3IgY2VydGFpbiBwYXJ0cy4KKyAqKi8KK3N0YXRpYyBzMzIgZTEwMDBfc3dfbGNkX2NvbmZpZ19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHkgPSAmaHctPnBoeTsKKwl1MzIgaSwgZGF0YSwgY25mX3NpemUsIGNuZl9iYXNlX2FkZHIsIHN3X2NmZ19tYXNrOworCXMzMiByZXRfdmFsOworCXUxNiB3b3JkX2FkZHIsIHJlZ19kYXRhLCByZWdfYWRkciwgcGh5X3BhZ2UgPSAwOworCisJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIFBIWSBmcm9tIHRoZSBOVk0gb24gSUNIIHBsYXRmb3Jtcy4gIFRoaXMKKwkgKiBpcyBuZWVkZWQgZHVlIHRvIGFuIGlzc3VlIHdoZXJlIHRoZSBOVk0gY29uZmlndXJhdGlvbiBpcworCSAqIG5vdCBwcm9wZXJseSBhdXRvbG9hZGVkIGFmdGVyIHBvd2VyIHRyYW5zaXRpb25zLgorCSAqIFRoZXJlZm9yZSwgYWZ0ZXIgZWFjaCBQSFkgcmVzZXQsIHdlIHdpbGwgbG9hZCB0aGUKKwkgKiBjb25maWd1cmF0aW9uIGRhdGEgb3V0IG9mIHRoZSBOVk0gbWFudWFsbHkuCisJICovCisJaWYgKChody0+bWFjLnR5cGUgPT0gZTEwMDBfaWNoOGxhbiAmJiBwaHktPnR5cGUgPT0gZTEwMDBfcGh5X2lncF8zKSB8fAorCQkoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaGxhbikpIHsKKwkJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YWRhcHRlcjsKKworCQkvKiBDaGVjayBpZiBTVyBuZWVkcyB0byBjb25maWd1cmUgdGhlIFBIWSAqLworCQlpZiAoKGFkYXB0ZXItPnBkZXYtPmRldmljZSA9PSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTV9BTVQpIHx8CisJCSAgICAoYWRhcHRlci0+cGRldi0+ZGV2aWNlID09IEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NKSB8fAorCQkgICAgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hsYW4pKQorCQkJc3dfY2ZnX21hc2sgPSBFMTAwMF9GRVhUTlZNX1NXX0NPTkZJR19JQ0g4TTsKKwkJZWxzZQorCQkJc3dfY2ZnX21hc2sgPSBFMTAwMF9GRVhUTlZNX1NXX0NPTkZJRzsKKworCQlkYXRhID0gZXIzMihGRVhUTlZNKTsKKwkJaWYgKCEoZGF0YSAmIHN3X2NmZ19tYXNrKSkKKwkJCWdvdG8gb3V0OworCisJCS8qIFdhaXQgZm9yIGJhc2ljIGNvbmZpZ3VyYXRpb24gY29tcGxldGVzIGJlZm9yZSBwcm9jZWVkaW5nICovCisJCWUxMDAwX2xhbl9pbml0X2RvbmVfaWNoOGxhbihodyk7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIEhXIGRvZXMgbm90IGNvbmZpZ3VyZSBMQ0QgZnJvbSBQSFkKKwkJICogZXh0ZW5kZWQgY29uZmlndXJhdGlvbiBiZWZvcmUgU1cgY29uZmlndXJhdGlvbgorCQkgKi8KKwkJZGF0YSA9IGVyMzIoRVhUQ05GX0NUUkwpOworCQlpZiAoZGF0YSAmIEUxMDAwX0VYVENORl9DVFJMX0xDRF9XUklURV9FTkFCTEUpCisJCQlnb3RvIG91dDsKKworCQljbmZfc2l6ZSA9IGVyMzIoRVhUQ05GX1NJWkUpOworCQljbmZfc2l6ZSAmPSBFMTAwMF9FWFRDTkZfU0laRV9FWFRfUENJRV9MRU5HVEhfTUFTSzsKKwkJY25mX3NpemUgPj49IEUxMDAwX0VYVENORl9TSVpFX0VYVF9QQ0lFX0xFTkdUSF9TSElGVDsKKwkJaWYgKCFjbmZfc2l6ZSkKKwkJCWdvdG8gb3V0OworCisJCWNuZl9iYXNlX2FkZHIgPSBkYXRhICYgRTEwMDBfRVhUQ05GX0NUUkxfRVhUX0NORl9QT0lOVEVSX01BU0s7CisJCWNuZl9iYXNlX2FkZHIgPj49IEUxMDAwX0VYVENORl9DVFJMX0VYVF9DTkZfUE9JTlRFUl9TSElGVDsKKworCQlpZiAoIShkYXRhICYgRTEwMDBfRVhUQ05GX0NUUkxfT0VNX1dSSVRFX0VOQUJMRSkgJiYKKwkJICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKSkgeworCQkJLyoKKwkJCSAqIEhXIGNvbmZpZ3VyZXMgdGhlIFNNQnVzIGFkZHJlc3MgYW5kIExFRHMgd2hlbiB0aGUKKwkJCSAqIE9FTSBhbmQgTENEIFdyaXRlIEVuYWJsZSBiaXRzIGFyZSBzZXQgaW4gdGhlIE5WTS4KKwkJCSAqIFdoZW4gYm90aCBOVk0gYml0cyBhcmUgY2xlYXJlZCwgU1cgd2lsbCBjb25maWd1cmUKKwkJCSAqIHRoZW0gaW5zdGVhZC4KKwkJCSAqLworCQkJZGF0YSA9IGVyMzIoU1RSQVApOworCQkJZGF0YSAmPSBFMTAwMF9TVFJBUF9TTUJVU19BRERSRVNTX01BU0s7CisJCQlyZWdfZGF0YSA9IGRhdGEgPj4gRTEwMDBfU1RSQVBfU01CVVNfQUREUkVTU19TSElGVDsKKwkJCXJlZ19kYXRhIHw9IEhWX1NNQl9BRERSX1BFQ19FTiB8IEhWX1NNQl9BRERSX1ZBTElEOworCQkJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfaHZfbG9ja2VkKGh3LCBIVl9TTUJfQUREUiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfZGF0YSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlnb3RvIG91dDsKKworCQkJZGF0YSA9IGVyMzIoTEVEQ1RMKTsKKwkJCXJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2h2X2xvY2tlZChodywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVl9MRURfQ09ORklHLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MTYpZGF0YSk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQkvKiBDb25maWd1cmUgTENEIGZyb20gZXh0ZW5kZWQgY29uZmlndXJhdGlvbiByZWdpb24uICovCisKKwkJLyogY25mX2Jhc2VfYWRkciBpcyBpbiBEV09SRCAqLworCQl3b3JkX2FkZHIgPSAodTE2KShjbmZfYmFzZV9hZGRyIDw8IDEpOworCisJCWZvciAoaSA9IDA7IGkgPCBjbmZfc2l6ZTsgaSsrKSB7CisJCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9udm0oaHcsICh3b3JkX2FkZHIgKyBpICogMiksIDEsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnX2RhdGEpOworCQkJaWYgKHJldF92YWwpCisJCQkJZ290byBvdXQ7CisKKwkJCXJldF92YWwgPSBlMTAwMF9yZWFkX252bShodywgKHdvcmRfYWRkciArIGkgKiAyICsgMSksCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmcmVnX2FkZHIpOworCQkJaWYgKHJldF92YWwpCisJCQkJZ290byBvdXQ7CisKKwkJCS8qIFNhdmUgb2ZmIHRoZSBQSFkgcGFnZSBmb3IgZnV0dXJlIHdyaXRlcy4gKi8KKwkJCWlmIChyZWdfYWRkciA9PSBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCkgeworCQkJCXBoeV9wYWdlID0gcmVnX2RhdGE7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXJlZ19hZGRyICY9IFBIWV9SRUdfTUFTSzsKKwkJCXJlZ19hZGRyIHw9IHBoeV9wYWdlOworCisJCQlyZXRfdmFsID0gcGh5LT5vcHMud3JpdGVfcGh5X3JlZ19sb2NrZWQoaHcsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKXJlZ19hZGRyLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnX2RhdGEpOworCQkJaWYgKHJldF92YWwpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogIGUxMDAwX2sxX2dpZ193b3JrYXJvdW5kX2h2IC0gSzEgU2kgd29ya2Fyb3VuZAorICogIEBodzogICBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAbGluazogbGluayB1cCBib29sIGZsYWcKKyAqCisgKiAgSWYgSzEgaXMgZW5hYmxlZCBmb3IgMUdicHMsIHRoZSBNQUMgbWlnaHQgc3RhbGwgd2hlbiB0cmFuc2l0aW9uaW5nCisgKiAgZnJvbSBhIGxvd2VyIHNwZWVkLiAgVGhpcyB3b3JrYXJvdW5kIGRpc2FibGVzIEsxIHdoZW5ldmVyIGxpbmsgaXMgYXQgMUdpZworICogIElmIGxpbmsgaXMgZG93biwgdGhlIGZ1bmN0aW9uIHdpbGwgcmVzdG9yZSB0aGUgZGVmYXVsdCBLMSBzZXR0aW5nIGxvY2F0ZWQKKyAqICBpbiB0aGUgTlZNLgorICoqLworc3RhdGljIHMzMiBlMTAwMF9rMV9naWdfd29ya2Fyb3VuZF9odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGxpbmspCit7CisJczMyIHJldF92YWwgPSAwOworCXUxNiBzdGF0dXNfcmVnID0gMDsKKwlib29sIGsxX2VuYWJsZSA9IGh3LT5kZXZfc3BlYy5pY2g4bGFuLm52bV9rMV9lbmFibGVkOworCisJaWYgKGh3LT5tYWMudHlwZSAhPSBlMTAwMF9wY2hsYW4pCisJCWdvdG8gb3V0OworCisJLyogV3JhcCB0aGUgd2hvbGUgZmxvdyB3aXRoIHRoZSBzdyBmbGFnICovCisJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJZ290byBvdXQ7CisKKwkvKiBEaXNhYmxlIEsxIHdoZW4gbGluayBpcyAxR2Jwcywgb3RoZXJ3aXNlIHVzZSB0aGUgTlZNIHNldHRpbmcgKi8KKwlpZiAobGluaykgeworCQlpZiAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV84MjU3OCkgeworCQkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLnJlYWRfcGh5X3JlZ19sb2NrZWQoaHcsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTV9DU19TVEFUVVMsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzX3JlZyk7CisJCQlpZiAocmV0X3ZhbCkKKwkJCQlnb3RvIHJlbGVhc2U7CisKKwkJCXN0YXR1c19yZWcgJj0gQk1fQ1NfU1RBVFVTX0xJTktfVVAgfAorCQkJICAgICAgICAgICAgICBCTV9DU19TVEFUVVNfUkVTT0xWRUQgfAorCQkJICAgICAgICAgICAgICBCTV9DU19TVEFUVVNfU1BFRURfTUFTSzsKKworCQkJaWYgKHN0YXR1c19yZWcgPT0gKEJNX0NTX1NUQVRVU19MSU5LX1VQIHwKKwkJCSAgICAgICAgICAgICAgICAgICBCTV9DU19TVEFUVVNfUkVTT0xWRUQgfAorCQkJICAgICAgICAgICAgICAgICAgIEJNX0NTX1NUQVRVU19TUEVFRF8xMDAwKSkKKwkJCQlrMV9lbmFibGUgPSBmYWxzZTsKKwkJfQorCisJCWlmIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc3KSB7CisJCQlyZXRfdmFsID0gaHctPnBoeS5vcHMucmVhZF9waHlfcmVnX2xvY2tlZChodywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhWX01fU1RBVFVTLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1c19yZWcpOworCQkJaWYgKHJldF92YWwpCisJCQkJZ290byByZWxlYXNlOworCisJCQlzdGF0dXNfcmVnICY9IEhWX01fU1RBVFVTX0xJTktfVVAgfAorCQkJICAgICAgICAgICAgICBIVl9NX1NUQVRVU19BVVRPTkVHX0NPTVBMRVRFIHwKKwkJCSAgICAgICAgICAgICAgSFZfTV9TVEFUVVNfU1BFRURfTUFTSzsKKworCQkJaWYgKHN0YXR1c19yZWcgPT0gKEhWX01fU1RBVFVTX0xJTktfVVAgfAorCQkJICAgICAgICAgICAgICAgICAgIEhWX01fU1RBVFVTX0FVVE9ORUdfQ09NUExFVEUgfAorCQkJICAgICAgICAgICAgICAgICAgIEhWX01fU1RBVFVTX1NQRUVEXzEwMDApKQorCQkJCWsxX2VuYWJsZSA9IGZhbHNlOworCQl9CisKKwkJLyogTGluayBzdGFsbCBmaXggZm9yIGxpbmsgdXAgKi8KKwkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLndyaXRlX3BoeV9yZWdfbG9ja2VkKGh3LCBQSFlfUkVHKDc3MCwgMTkpLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwKTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIHJlbGVhc2U7CisKKwl9IGVsc2UgeworCQkvKiBMaW5rIHN0YWxsIGZpeCBmb3IgbGluayBkb3duICovCisJCXJldF92YWwgPSBody0+cGh5Lm9wcy53cml0ZV9waHlfcmVnX2xvY2tlZChodywgUEhZX1JFRyg3NzAsIDE5KSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMCk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byByZWxlYXNlOworCX0KKworCXJldF92YWwgPSBlMTAwMF9jb25maWd1cmVfazFfaWNoOGxhbihodywgazFfZW5hYmxlKTsKKworcmVsZWFzZToKKwlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CitvdXQ6CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogIGUxMDAwX2NvbmZpZ3VyZV9rMV9pY2g4bGFuIC0gQ29uZmlndXJlIEsxIHBvd2VyIHN0YXRlCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAZW5hYmxlOiBLMSBzdGF0ZSB0byBjb25maWd1cmUKKyAqCisgKiAgQ29uZmlndXJlIHRoZSBLMSBwb3dlciBzdGF0ZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyLgorICogIEFzc3VtZXMgc2VtYXBob3JlIGFscmVhZHkgYWNxdWlyZWQuCisgKgorICogIFN1Y2Nlc3MgcmV0dXJucyAwLCBGYWlsdXJlIHJldHVybnMgLUUxMDAwX0VSUl9QSFkgKC0yKQorICoqLworc3RhdGljIHMzMiBlMTAwMF9jb25maWd1cmVfazFfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIGsxX2VuYWJsZSkKK3sKKwlzMzIgcmV0X3ZhbCA9IDA7CisJdTMyIGN0cmxfcmVnID0gMDsKKwl1MzIgY3RybF9leHQgPSAwOworCXUzMiByZWcgPSAwOworCXUxNiBrbXJuX3JlZyA9IDA7CisKKwlyZXRfdmFsID0gZTEwMDBlX3JlYWRfa21ybl9yZWdfbG9ja2VkKGh3LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9LTVJOQ1RSTFNUQV9LMV9DT05GSUcsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrbXJuX3JlZyk7CisJaWYgKHJldF92YWwpCisJCWdvdG8gb3V0OworCisJaWYgKGsxX2VuYWJsZSkKKwkJa21ybl9yZWcgfD0gRTEwMDBfS01STkNUUkxTVEFfSzFfRU5BQkxFOworCWVsc2UKKwkJa21ybl9yZWcgJj0gfkUxMDAwX0tNUk5DVFJMU1RBX0sxX0VOQUJMRTsKKworCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfa21ybl9yZWdfbG9ja2VkKGh3LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfS01STkNUUkxTVEFfSzFfQ09ORklHLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21ybl9yZWcpOworCWlmIChyZXRfdmFsKQorCQlnb3RvIG91dDsKKworCXVkZWxheSgyMCk7CisJY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKKwljdHJsX3JlZyA9IGVyMzIoQ1RSTCk7CisKKwlyZWcgPSBjdHJsX3JlZyAmIH4oRTEwMDBfQ1RSTF9TUERfMTAwMCB8IEUxMDAwX0NUUkxfU1BEXzEwMCk7CisJcmVnIHw9IEUxMDAwX0NUUkxfRlJDU1BEOworCWV3MzIoQ1RSTCwgcmVnKTsKKworCWV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0IHwgRTEwMDBfQ1RSTF9FWFRfU1BEX0JZUFMpOworCXVkZWxheSgyMCk7CisJZXczMihDVFJMLCBjdHJsX3JlZyk7CisJZXczMihDVFJMX0VYVCwgY3RybF9leHQpOworCXVkZWxheSgyMCk7CisKK291dDoKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiAgZTEwMDBfb2VtX2JpdHNfY29uZmlnX2ljaDhsYW4gLSBTVy1iYXNlZCBMQ0QgQ29uZmlndXJhdGlvbgorICogIEBodzogICAgICAgcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQGQwX3N0YXRlOiBib29sZWFuIGlmIGVudGVyaW5nIGQwIG9yIGQzIGRldmljZSBzdGF0ZQorICoKKyAqICBTVyB3aWxsIGNvbmZpZ3VyZSBHYmUgRGlzYWJsZSBhbmQgTFBMVSBiYXNlZCBvbiB0aGUgTlZNLiBUaGUgZm91ciBiaXRzIGFyZQorICogIGNvbGxlY3RpdmVseSBjYWxsZWQgT0VNIGJpdHMuICBUaGUgT0VNIFdyaXRlIEVuYWJsZSBiaXQgYW5kIFNXIENvbmZpZyBiaXQKKyAqICBpbiBOVk0gZGV0ZXJtaW5lcyB3aGV0aGVyIEhXIHNob3VsZCBjb25maWd1cmUgTFBMVSBhbmQgR2JlIERpc2FibGUuCisgKiovCitzdGF0aWMgczMyIGUxMDAwX29lbV9iaXRzX2NvbmZpZ19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIGJvb2wgZDBfc3RhdGUpCit7CisJczMyIHJldF92YWwgPSAwOworCXUzMiBtYWNfcmVnOworCXUxNiBvZW1fcmVnOworCisJaWYgKGh3LT5tYWMudHlwZSAhPSBlMTAwMF9wY2hsYW4pCisJCXJldHVybiByZXRfdmFsOworCisJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwltYWNfcmVnID0gZXIzMihFWFRDTkZfQ1RSTCk7CisJaWYgKG1hY19yZWcgJiBFMTAwMF9FWFRDTkZfQ1RSTF9PRU1fV1JJVEVfRU5BQkxFKQorCQlnb3RvIG91dDsKKworCW1hY19yZWcgPSBlcjMyKEZFWFROVk0pOworCWlmICghKG1hY19yZWcgJiBFMTAwMF9GRVhUTlZNX1NXX0NPTkZJR19JQ0g4TSkpCisJCWdvdG8gb3V0OworCisJbWFjX3JlZyA9IGVyMzIoUEhZX0NUUkwpOworCisJcmV0X3ZhbCA9IGh3LT5waHkub3BzLnJlYWRfcGh5X3JlZ19sb2NrZWQoaHcsIEhWX09FTV9CSVRTLCAmb2VtX3JlZyk7CisJaWYgKHJldF92YWwpCisJCWdvdG8gb3V0OworCisJb2VtX3JlZyAmPSB+KEhWX09FTV9CSVRTX0dCRV9ESVMgfCBIVl9PRU1fQklUU19MUExVKTsKKworCWlmIChkMF9zdGF0ZSkgeworCQlpZiAobWFjX3JlZyAmIEUxMDAwX1BIWV9DVFJMX0dCRV9ESVNBQkxFKQorCQkJb2VtX3JlZyB8PSBIVl9PRU1fQklUU19HQkVfRElTOworCisJCWlmIChtYWNfcmVnICYgRTEwMDBfUEhZX0NUUkxfRDBBX0xQTFUpCisJCQlvZW1fcmVnIHw9IEhWX09FTV9CSVRTX0xQTFU7CisJfSBlbHNlIHsKKwkJaWYgKG1hY19yZWcgJiBFMTAwMF9QSFlfQ1RSTF9OT05EMEFfR0JFX0RJU0FCTEUpCisJCQlvZW1fcmVnIHw9IEhWX09FTV9CSVRTX0dCRV9ESVM7CisKKwkJaWYgKG1hY19yZWcgJiBFMTAwMF9QSFlfQ1RSTF9OT05EMEFfTFBMVSkKKwkJCW9lbV9yZWcgfD0gSFZfT0VNX0JJVFNfTFBMVTsKKwl9CisJLyogUmVzdGFydCBhdXRvLW5lZyB0byBhY3RpdmF0ZSB0aGUgYml0cyAqLworCW9lbV9yZWcgfD0gSFZfT0VNX0JJVFNfUkVTVEFSVF9BTjsKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMud3JpdGVfcGh5X3JlZ19sb2NrZWQoaHcsIEhWX09FTV9CSVRTLCBvZW1fcmVnKTsKKworb3V0OgorCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKworCXJldHVybiByZXRfdmFsOworfQorCisKKy8qKgogICogIGUxMDAwX2h2X3BoeV93b3JrYXJvdW5kc19pY2g4bGFuIC0gQSBzZXJpZXMgb2YgUGh5IHdvcmthcm91bmRzIHRvIGJlCiAgKiAgZG9uZSBhZnRlciBldmVyeSBQSFkgcmVzZXQuCiAgKiovCkBAIC03OTEsMTAgKzExNjgsMjAgQEAKIAlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOwogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKKwogCWh3LT5waHkuYWRkciA9IDE7Ci0JZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDApOworCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMCk7CisJaWYgKHJldF92YWwpCisJCWdvdG8gb3V0OwogCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKIAorCS8qCisJICogQ29uZmlndXJlIHRoZSBLMSBTaSB3b3JrYXJvdW5kIGR1cmluZyBwaHkgcmVzZXQgYXNzdW1pbmcgdGhlcmUgaXMKKwkgKiBsaW5rIHNvIHRoYXQgaXQgZGlzYWJsZXMgSzEgaWYgbGluayBpcyBpbiAxR2Jwcy4KKwkgKi8KKwlyZXRfdmFsID0gZTEwMDBfazFfZ2lnX3dvcmthcm91bmRfaHYoaHcsIHRydWUpOworCitvdXQ6CiAJcmV0dXJuIHJldF92YWw7CiB9CiAKQEAgLTg0MCwxMSArMTIyNyw4IEBACiAgKiovCiBzdGF0aWMgczMyIGUxMDAwX3BoeV9od19yZXNldF9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0Jc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHkgPSAmaHctPnBoeTsKLQl1MzIgaTsKLQl1MzIgZGF0YSwgY25mX3NpemUsIGNuZl9iYXNlX2FkZHIsIHN3X2NmZ19tYXNrOwotCXMzMiByZXRfdmFsOwotCXUxNiB3b3JkX2FkZHIsIHJlZ19kYXRhLCByZWdfYWRkciwgcGh5X3BhZ2UgPSAwOworCXMzMiByZXRfdmFsID0gMDsKKwl1MTYgcmVnOwogCiAJcmV0X3ZhbCA9IGUxMDAwZV9waHlfaHdfcmVzZXRfZ2VuZXJpYyhodyk7CiAJaWYgKHJldF92YWwpCkBAIC04NTksODEgKzEyNDMsMjAgQEAKIAkJCXJldHVybiByZXRfdmFsOwogCX0KIAotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgUEhZIGZyb20gdGhlIE5WTSBvbiBJQ0ggcGxhdGZvcm1zLiAgVGhpcwotCSAqIGlzIG5lZWRlZCBkdWUgdG8gYW4gaXNzdWUgd2hlcmUgdGhlIE5WTSBjb25maWd1cmF0aW9uIGlzCi0JICogbm90IHByb3Blcmx5IGF1dG9sb2FkZWQgYWZ0ZXIgcG93ZXIgdHJhbnNpdGlvbnMuCi0JICogVGhlcmVmb3JlLCBhZnRlciBlYWNoIFBIWSByZXNldCwgd2Ugd2lsbCBsb2FkIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gZGF0YSBvdXQgb2YgdGhlIE5WTSBtYW51YWxseS4KLQkgKi8KLQlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX2ljaDhsYW4gJiYgcGh5LT50eXBlID09IGUxMDAwX3BoeV9pZ3BfMykgewotCQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5hZGFwdGVyOworCS8qIER1bW15IHJlYWQgdG8gY2xlYXIgdGhlIHBoeSB3YWtldXAgYml0IGFmdGVyIGxjZCByZXNldCAqLworCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKQorCQllMWVfcnBoeShodywgQk1fV1VDLCAmcmVnKTsKIAotCQkvKiBDaGVjayBpZiBTVyBuZWVkcyBjb25maWd1cmUgdGhlIFBIWSAqLwotCQlpZiAoKGFkYXB0ZXItPnBkZXYtPmRldmljZSA9PSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTV9BTVQpIHx8Ci0JCSAgICAoYWRhcHRlci0+cGRldi0+ZGV2aWNlID09IEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NKSkKLQkJCXN3X2NmZ19tYXNrID0gRTEwMDBfRkVYVE5WTV9TV19DT05GSUdfSUNIOE07Ci0JCWVsc2UKLQkJCXN3X2NmZ19tYXNrID0gRTEwMDBfRkVYVE5WTV9TV19DT05GSUc7CisJLyogQ29uZmlndXJlIHRoZSBMQ0Qgd2l0aCB0aGUgZXh0ZW5kZWQgY29uZmlndXJhdGlvbiByZWdpb24gaW4gTlZNICovCisJcmV0X3ZhbCA9IGUxMDAwX3N3X2xjZF9jb25maWdfaWNoOGxhbihodyk7CisJaWYgKHJldF92YWwpCisJCWdvdG8gb3V0OwogCi0JCWRhdGEgPSBlcjMyKEZFWFROVk0pOwotCQlpZiAoIShkYXRhICYgc3dfY2ZnX21hc2spKQotCQkJcmV0dXJuIDA7CisJLyogQ29uZmlndXJlIHRoZSBMQ0Qgd2l0aCB0aGUgT0VNIGJpdHMgaW4gTlZNICovCisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hsYW4pCisJCXJldF92YWwgPSBlMTAwMF9vZW1fYml0c19jb25maWdfaWNoOGxhbihodywgdHJ1ZSk7CiAKLQkJLyogV2FpdCBmb3IgYmFzaWMgY29uZmlndXJhdGlvbiBjb21wbGV0ZXMgYmVmb3JlIHByb2NlZWRpbmcgKi8KLQkJZTEwMDBfbGFuX2luaXRfZG9uZV9pY2g4bGFuKGh3KTsKLQotCQkvKgotCQkgKiBNYWtlIHN1cmUgSFcgZG9lcyBub3QgY29uZmlndXJlIExDRCBmcm9tIFBIWQotCQkgKiBleHRlbmRlZCBjb25maWd1cmF0aW9uIGJlZm9yZSBTVyBjb25maWd1cmF0aW9uCi0JCSAqLwotCQlkYXRhID0gZXIzMihFWFRDTkZfQ1RSTCk7Ci0JCWlmIChkYXRhICYgRTEwMDBfRVhUQ05GX0NUUkxfTENEX1dSSVRFX0VOQUJMRSkKLQkJCXJldHVybiAwOwotCi0JCWNuZl9zaXplID0gZXIzMihFWFRDTkZfU0laRSk7Ci0JCWNuZl9zaXplICY9IEUxMDAwX0VYVENORl9TSVpFX0VYVF9QQ0lFX0xFTkdUSF9NQVNLOwotCQljbmZfc2l6ZSA+Pj0gRTEwMDBfRVhUQ05GX1NJWkVfRVhUX1BDSUVfTEVOR1RIX1NISUZUOwotCQlpZiAoIWNuZl9zaXplKQotCQkJcmV0dXJuIDA7Ci0KLQkJY25mX2Jhc2VfYWRkciA9IGRhdGEgJiBFMTAwMF9FWFRDTkZfQ1RSTF9FWFRfQ05GX1BPSU5URVJfTUFTSzsKLQkJY25mX2Jhc2VfYWRkciA+Pj0gRTEwMDBfRVhUQ05GX0NUUkxfRVhUX0NORl9QT0lOVEVSX1NISUZUOwotCi0JCS8qIENvbmZpZ3VyZSBMQ0QgZnJvbSBleHRlbmRlZCBjb25maWd1cmF0aW9uIHJlZ2lvbi4gKi8KLQotCQkvKiBjbmZfYmFzZV9hZGRyIGlzIGluIERXT1JEICovCi0JCXdvcmRfYWRkciA9ICh1MTYpKGNuZl9iYXNlX2FkZHIgPDwgMSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGNuZl9zaXplOyBpKyspIHsKLQkJCXJldF92YWwgPSBlMTAwMF9yZWFkX252bShodywKLQkJCQkJCSh3b3JkX2FkZHIgKyBpICogMiksCi0JCQkJCQkxLAotCQkJCQkJJnJlZ19kYXRhKTsKLQkJCWlmIChyZXRfdmFsKQotCQkJCXJldHVybiByZXRfdmFsOwotCi0JCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9udm0oaHcsCi0JCQkJCQkod29yZF9hZGRyICsgaSAqIDIgKyAxKSwKLQkJCQkJCTEsCi0JCQkJCQkmcmVnX2FkZHIpOwotCQkJaWYgKHJldF92YWwpCi0JCQkJcmV0dXJuIHJldF92YWw7Ci0KLQkJCS8qIFNhdmUgb2ZmIHRoZSBQSFkgcGFnZSBmb3IgZnV0dXJlIHdyaXRlcy4gKi8KLQkJCWlmIChyZWdfYWRkciA9PSBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCkgewotCQkJCXBoeV9wYWdlID0gcmVnX2RhdGE7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXJlZ19hZGRyIHw9IHBoeV9wYWdlOwotCi0JCQlyZXRfdmFsID0gZTFlX3dwaHkoaHcsICh1MzIpcmVnX2FkZHIsIHJlZ19kYXRhKTsKLQkJCWlmIChyZXRfdmFsKQotCQkJCXJldHVybiByZXRfdmFsOwotCQl9Ci0JfQotCitvdXQ6CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNTQsNiArMTM3NywzOCBAQAogfQogCiAvKioKKyAqICBlMTAwMF9zZXRfbHBsdV9zdGF0ZV9wY2hsYW4gLSBTZXQgTG93IFBvd2VyIExpbmsgVXAgc3RhdGUKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogIEBhY3RpdmU6IHRydWUgdG8gZW5hYmxlIExQTFUsIGZhbHNlIHRvIGRpc2FibGUKKyAqCisgKiAgU2V0cyB0aGUgTFBMVSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGFjdGl2ZSBmbGFnLiAgRm9yIFBDSCwgaWYgT0VNIHdyaXRlCisgKiAgYml0IGFyZSBkaXNhYmxlZCBpbiB0aGUgTlZNLCB3cml0aW5nIHRoZSBMUExVIGJpdHMgaW4gdGhlIE1BQyB3aWxsIG5vdCBzZXQKKyAqICB0aGUgcGh5IHNwZWVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbWFudWFsbHkgc2V0IHRoZSBMUExVIGJpdCBhbmQgcmVzdGFydAorICogIGF1dG8tbmVnIGFzIGh3IHdvdWxkIGRvLiBEMyBhbmQgRDAgTFBMVSB3aWxsIGNhbGwgdGhlIHNhbWUgZnVuY3Rpb24KKyAqICBzaW5jZSBpdCBjb25maWd1cmVzIHRoZSBzYW1lIGJpdC4KKyAqKi8KK3N0YXRpYyBzMzIgZTEwMDBfc2V0X2xwbHVfc3RhdGVfcGNobGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIGJvb2wgYWN0aXZlKQoreworCXMzMiByZXRfdmFsID0gMDsKKwl1MTYgb2VtX3JlZzsKKworCXJldF92YWwgPSBlMWVfcnBoeShodywgSFZfT0VNX0JJVFMsICZvZW1fcmVnKTsKKwlpZiAocmV0X3ZhbCkKKwkJZ290byBvdXQ7CisKKwlpZiAoYWN0aXZlKQorCQlvZW1fcmVnIHw9IEhWX09FTV9CSVRTX0xQTFU7CisJZWxzZQorCQlvZW1fcmVnICY9IH5IVl9PRU1fQklUU19MUExVOworCisJb2VtX3JlZyB8PSBIVl9PRU1fQklUU19SRVNUQVJUX0FOOworCXJldF92YWwgPSBlMWVfd3BoeShodywgSFZfT0VNX0JJVFMsIG9lbV9yZWcpOworCitvdXQ6CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgogICogIGUxMDAwX3NldF9kMF9scGx1X3N0YXRlX2ljaDhsYW4gLSBTZXQgTG93IFBvd2VyIExpbmt1cCBEMCBzdGF0ZQogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQGFjdGl2ZTogVFJVRSB0byBlbmFibGUgTFBMVSwgRkFMU0UgdG8gZGlzYWJsZQpAQCAtMTMxNCwxMiArMTY2OSwxMSBAQAogCWlmICgob2Zmc2V0ID49IG52bS0+d29yZF9zaXplKSB8fCAod29yZHMgPiBudm0tPndvcmRfc2l6ZSAtIG9mZnNldCkgfHwKIAkgICAgKHdvcmRzID09IDApKSB7CiAJCWh3X2RiZyhodywgIm52bSBwYXJhbWV0ZXIocykgb3V0IG9mIGJvdW5kc1xuIik7Ci0JCXJldHVybiAtRTEwMDBfRVJSX05WTTsKKwkJcmV0X3ZhbCA9IC1FMTAwMF9FUlJfTlZNOworCQlnb3RvIG91dDsKIAl9CiAKLQlyZXRfdmFsID0gZTEwMDBfYWNxdWlyZV9zd2ZsYWdfaWNoOGxhbihodyk7Ci0JaWYgKHJldF92YWwpCi0JCWdvdG8gb3V0OworCW52bS0+b3BzLmFjcXVpcmVfbnZtKGh3KTsKIAogCXJldF92YWwgPSBlMTAwMF92YWxpZF9udm1fYmFua19kZXRlY3RfaWNoOGxhbihodywgJmJhbmspOwogCWlmIChyZXRfdmFsKSB7CkBAIC0xMzQ1LDcgKzE2OTksNyBAQAogCQl9CiAJfQogCi0JZTEwMDBfcmVsZWFzZV9zd2ZsYWdfaWNoOGxhbihodyk7CisJbnZtLT5vcHMucmVsZWFzZV9udm0oaHcpOwogCiBvdXQ6CiAJaWYgKHJldF92YWwpCkBAIC0xNjAzLDExICsxOTU3LDE1IEBACiAJCXJldHVybiAtRTEwMDBfRVJSX05WTTsKIAl9CiAKKwludm0tPm9wcy5hY3F1aXJlX252bShodyk7CisKIAlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewogCQlkZXZfc3BlYy0+c2hhZG93X3JhbVtvZmZzZXQraV0ubW9kaWZpZWQgPSAxOwogCQlkZXZfc3BlYy0+c2hhZG93X3JhbVtvZmZzZXQraV0udmFsdWUgPSBkYXRhW2ldOwogCX0KIAorCW52bS0+b3BzLnJlbGVhc2VfbnZtKGh3KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNjM3LDkgKzE5OTUsNyBAQAogCWlmIChudm0tPnR5cGUgIT0gZTEwMDBfbnZtX2ZsYXNoX3N3KQogCQlnb3RvIG91dDsKIAotCXJldF92YWwgPSBlMTAwMF9hY3F1aXJlX3N3ZmxhZ19pY2g4bGFuKGh3KTsKLQlpZiAocmV0X3ZhbCkKLQkJZ290byBvdXQ7CisJbnZtLT5vcHMuYWNxdWlyZV9udm0oaHcpOwogCiAJLyoKIAkgKiBXZSdyZSB3cml0aW5nIHRvIHRoZSBvcHBvc2l0ZSBiYW5rIHNvIGlmIHdlJ3JlIG9uIGJhbmsgMSwKQEAgLTE2NTcsNyArMjAxMyw3IEBACiAJCW9sZF9iYW5rX29mZnNldCA9IDA7CiAJCXJldF92YWwgPSBlMTAwMF9lcmFzZV9mbGFzaF9iYW5rX2ljaDhsYW4oaHcsIDEpOwogCQlpZiAocmV0X3ZhbCkgewotCQkJZTEwMDBfcmVsZWFzZV9zd2ZsYWdfaWNoOGxhbihodyk7CisJCQludm0tPm9wcy5yZWxlYXNlX252bShodyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0gZWxzZSB7CkBAIC0xNjY1LDcgKzIwMjEsNyBAQAogCQluZXdfYmFua19vZmZzZXQgPSAwOwogCQlyZXRfdmFsID0gZTEwMDBfZXJhc2VfZmxhc2hfYmFua19pY2g4bGFuKGh3LCAwKTsKIAkJaWYgKHJldF92YWwpIHsKLQkJCWUxMDAwX3JlbGVhc2Vfc3dmbGFnX2ljaDhsYW4oaHcpOworCQkJbnZtLT5vcHMucmVsZWFzZV9udm0oaHcpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC0xNzIzLDcgKzIwNzksNyBAQAogCWlmIChyZXRfdmFsKSB7CiAJCS8qIFBvc3NpYmx5IHJlYWQtb25seSwgc2VlIGUxMDAwZV93cml0ZV9wcm90ZWN0X252bV9pY2g4bGFuKCkgKi8KIAkJaHdfZGJnKGh3LCAiRmxhc2ggY29tbWl0IGZhaWxlZC5cbiIpOwotCQllMTAwMF9yZWxlYXNlX3N3ZmxhZ19pY2g4bGFuKGh3KTsKKwkJbnZtLT5vcHMucmVsZWFzZV9udm0oaHcpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE3MzYsNyArMjA5Miw3IEBACiAJYWN0X29mZnNldCA9IG5ld19iYW5rX29mZnNldCArIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQ7CiAJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZmxhc2hfd29yZF9pY2g4bGFuKGh3LCBhY3Rfb2Zmc2V0LCAmZGF0YSk7CiAJaWYgKHJldF92YWwpIHsKLQkJZTEwMDBfcmVsZWFzZV9zd2ZsYWdfaWNoOGxhbihodyk7CisJCW52bS0+b3BzLnJlbGVhc2VfbnZtKGh3KTsKIAkJZ290byBvdXQ7CiAJfQogCWRhdGEgJj0gMHhCRkZGOwpAQCAtMTc0NCw3ICsyMTAwLDcgQEAKIAkJCQkJCSAgICAgICBhY3Rfb2Zmc2V0ICogMiArIDEsCiAJCQkJCQkgICAgICAgKHU4KShkYXRhID4+IDgpKTsKIAlpZiAocmV0X3ZhbCkgewotCQllMTAwMF9yZWxlYXNlX3N3ZmxhZ19pY2g4bGFuKGh3KTsKKwkJbnZtLT5vcHMucmVsZWFzZV9udm0oaHcpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE3NTcsNyArMjExMyw3IEBACiAJYWN0X29mZnNldCA9IChvbGRfYmFua19vZmZzZXQgKyBFMTAwMF9JQ0hfTlZNX1NJR19XT1JEKSAqIDIgKyAxOwogCXJldF92YWwgPSBlMTAwMF9yZXRyeV93cml0ZV9mbGFzaF9ieXRlX2ljaDhsYW4oaHcsIGFjdF9vZmZzZXQsIDApOwogCWlmIChyZXRfdmFsKSB7Ci0JCWUxMDAwX3JlbGVhc2Vfc3dmbGFnX2ljaDhsYW4oaHcpOworCQludm0tPm9wcy5yZWxlYXNlX252bShodyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTc2Nyw3ICsyMTIzLDcgQEAKIAkJZGV2X3NwZWMtPnNoYWRvd19yYW1baV0udmFsdWUgPSAweEZGRkY7CiAJfQogCi0JZTEwMDBfcmVsZWFzZV9zd2ZsYWdfaWNoOGxhbihodyk7CisJbnZtLT5vcHMucmVsZWFzZV9udm0oaHcpOwogCiAJLyoKIAkgKiBSZWxvYWQgdGhlIEVFUFJPTSwgb3IgZWxzZSBtb2RpZmljYXRpb25zIHdpbGwgbm90IGFwcGVhcgpAQCAtMTgzMSwxNCArMjE4NywxMiBAQAogICoqLwogdm9pZCBlMTAwMGVfd3JpdGVfcHJvdGVjdF9udm1faWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogeworCXN0cnVjdCBlMTAwMF9udm1faW5mbyAqbnZtID0gJmh3LT5udm07CiAJdW5pb24gaWNoOF9mbGFzaF9wcm90ZWN0ZWRfcmFuZ2UgcHIwOwogCXVuaW9uIGljaDhfaHdzX2ZsYXNoX3N0YXR1cyBoc2ZzdHM7CiAJdTMyIGdmcHJlZzsKLQlzMzIgcmV0X3ZhbDsKIAotCXJldF92YWwgPSBlMTAwMF9hY3F1aXJlX3N3ZmxhZ19pY2g4bGFuKGh3KTsKLQlpZiAocmV0X3ZhbCkKLQkJcmV0dXJuOworCW52bS0+b3BzLmFjcXVpcmVfbnZtKGh3KTsKIAogCWdmcHJlZyA9IGVyMzJmbGFzaChJQ0hfRkxBU0hfR0ZQUkVHKTsKIApAQCAtMTg1OSw3ICsyMjEzLDcgQEAKIAloc2ZzdHMuaHNmX3N0YXR1cy5mbG9ja2RuID0gdHJ1ZTsKIAlldzMyZmxhc2goSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CiAKLQllMTAwMF9yZWxlYXNlX3N3ZmxhZ19pY2g4bGFuKGh3KTsKKwludm0tPm9wcy5yZWxlYXNlX252bShodyk7CiB9CiAKIC8qKgpAQCAtMjIyOSw2ICsyNTgzLDggQEAKICAqKi8KIHN0YXRpYyBzMzIgZTEwMDBfcmVzZXRfaHdfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogeworCXN0cnVjdCBlMTAwMF9kZXZfc3BlY19pY2g4bGFuICpkZXZfc3BlYyA9ICZody0+ZGV2X3NwZWMuaWNoOGxhbjsKKwl1MTYgcmVnOwogCXUzMiBjdHJsLCBpY3IsIGthYjsKIAlzMzIgcmV0X3ZhbDsKIApAQCAtMjI2Myw2ICsyNjE5LDE4IEBACiAJCWV3MzIoUEJTLCBFMTAwMF9QQlNfMTZLKTsKIAl9CiAKKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaGxhbikgeworCQkvKiBTYXZlIHRoZSBOVk0gSzEgYml0IHNldHRpbmcqLworCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9udm0oaHcsIEUxMDAwX05WTV9LMV9DT05GSUcsIDEsICZyZWcpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCisJCWlmIChyZWcgJiBFMTAwMF9OVk1fSzFfRU5BQkxFKQorCQkJZGV2X3NwZWMtPm52bV9rMV9lbmFibGVkID0gdHJ1ZTsKKwkJZWxzZQorCQkJZGV2X3NwZWMtPm52bV9rMV9lbmFibGVkID0gZmFsc2U7CisJfQorCiAJY3RybCA9IGVyMzIoQ1RSTCk7CiAKIAlpZiAoIWUxMDAwX2NoZWNrX3Jlc2V0X2Jsb2NrKGh3KSkgewpAQCAtMjMwNCw3ICsyNjcyLDE5IEBACiAJCQlod19kYmcoaHcsICJBdXRvIFJlYWQgRG9uZSBkaWQgbm90IGNvbXBsZXRlXG4iKTsKIAkJfQogCX0KKwkvKiBEdW1teSByZWFkIHRvIGNsZWFyIHRoZSBwaHkgd2FrZXVwIGJpdCBhZnRlciBsY2QgcmVzZXQgKi8KKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaGxhbikKKwkJZTFlX3JwaHkoaHcsIEJNX1dVQywgJnJlZyk7CiAKKwlyZXRfdmFsID0gZTEwMDBfc3dfbGNkX2NvbmZpZ19pY2g4bGFuKGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaGxhbikgeworCQlyZXRfdmFsID0gZTEwMDBfb2VtX2JpdHNfY29uZmlnX2ljaDhsYW4oaHcsIHRydWUpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCX0KIAkvKgogCSAqIEZvciBQQ0gsIHRoaXMgd3JpdGUgd2lsbCBtYWtlIHN1cmUgdGhhdCBhbnkgbm9pc2UKIAkgKiB3aWxsIGJlIGRldGVjdGVkIGFzIGEgQ1JDIGVycm9yIGFuZCBiZSBkcm9wcGVkIHJhdGhlciB0aGFuIHNob3cgdXAKQEAgLTIzMjMsNiArMjcwMyw3IEBACiAJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hsYW4pCiAJCXJldF92YWwgPSBlMTAwMF9odl9waHlfd29ya2Fyb3VuZHNfaWNoOGxhbihodyk7CiAKK291dDoKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtMjYyNywxNCArMzAwOCw2IEBACiAJaWYgKHJldF92YWwpCiAJCXJldHVybiByZXRfdmFsOwogCi0JaWYgKChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKSAmJiAoKnNwZWVkID09IFNQRUVEXzEwMDApKSB7Ci0JCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfa21ybl9yZWcoaHcsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9LTVJOQ1RSTFNUQV9LMV9DT05GSUcsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9LTVJOQ1RSTFNUQV9LMV9ESVNBQkxFKTsKLQkJaWYgKHJldF92YWwpCi0JCQlyZXR1cm4gcmV0X3ZhbDsKLQl9Ci0KIAlpZiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9pY2g4bGFuKSAmJgogCSAgICAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9pZ3BfMykgJiYKIAkgICAgKCpzcGVlZCA9PSBTUEVFRF8xMDAwKSkgewpAQCAtMjg0Myw5ICszMjE2LDggQEAKIAkJICAgICAgICAgICAgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEU7CiAJCWV3MzIoUEhZX0NUUkwsIHBoeV9jdHJsKTsKIAotCQkvKiBXb3JrYXJvdW5kIFNXRkxBRyB1bmV4cGVjdGVkbHkgc2V0IGR1cmluZyBTMC0+U3ggKi8KIAkJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hsYW4pCi0JCQl1ZGVsYXkoNTAwKTsKKwkJCWUxMDAwX3BoeV9od19yZXNldF9pY2g4bGFuKGh3KTsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0zMTEzLDkgKzM0ODUsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBlMTAwMF9udm1fb3BlcmF0aW9ucyBpY2g4X252bV9vcHMgPSB7Ci0JLmFjcXVpcmVfbnZtCQk9IGUxMDAwX2FjcXVpcmVfc3dmbGFnX2ljaDhsYW4sCisJLmFjcXVpcmVfbnZtCQk9IGUxMDAwX2FjcXVpcmVfbnZtX2ljaDhsYW4sCiAJLnJlYWRfbnZtCSAJPSBlMTAwMF9yZWFkX252bV9pY2g4bGFuLAotCS5yZWxlYXNlX252bQkJPSBlMTAwMF9yZWxlYXNlX3N3ZmxhZ19pY2g4bGFuLAorCS5yZWxlYXNlX252bQkJPSBlMTAwMF9yZWxlYXNlX252bV9pY2g4bGFuLAogCS51cGRhdGVfbnZtCQk9IGUxMDAwX3VwZGF0ZV9udm1fY2hlY2tzdW1faWNoOGxhbiwKIAkudmFsaWRfbGVkX2RlZmF1bHQJPSBlMTAwMF92YWxpZF9sZWRfZGVmYXVsdF9pY2g4bGFuLAogCS52YWxpZGF0ZV9udm0JCT0gZTEwMDBfdmFsaWRhdGVfbnZtX2NoZWNrc3VtX2ljaDhsYW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKaW5kZXggMTZjMTkzYS4uMDY4N2M2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYwpAQCAtNDk4MiwxMiArNDk4Miw3IEBACiAJCWdvdG8gZXJyX3BjaV9yZWc7CiAKIAkvKiBBRVIgKEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZykgaG9va3MgKi8KLQllcnIgPSBwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyBmYWlsZWQgIgotCQkgICAgICAgICIweCV4XG4iLCBlcnIpOwotCQkvKiBub24tZmF0YWwsIGNvbnRpbnVlICovCi0JfQorCXBjaV9lbmFibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcocGRldik7CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAkvKiBQQ0kgY29uZmlnIHNwYWNlIGluZm8gKi8KQEAgLTUyNjMsNyArNTI1OCw2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IGVycjsKIAogCS8qCiAJICogZmx1c2hfc2NoZWR1bGVkIHdvcmsgbWF5IHJlc2NoZWR1bGUgb3VyIHdhdGNoZG9nIHRhc2ssIHNvCkBAIC01Mjk5LDEwICs1MjkzLDcgQEAKIAlmcmVlX25ldGRldihuZXRkZXYpOwogCiAJLyogQUVSIGRpc2FibGUgKi8KLQllcnIgPSBwY2lfZGlzYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwZGV2KTsKLQlpZiAoZXJyKQotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCSAgICAgICAgInBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nIGZhaWxlZCAweCV4XG4iLCBlcnIpOworCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jCmluZGV4IDk5NDQwMWYuLjAzMTc1YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9waHkuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMKQEAgLTk1LDEzICs5NSw2IEBACiAvKiBCTSBQSFkgQ29wcGVyIFNwZWNpZmljIENvbnRyb2wgMSAqLwogI2RlZmluZSBCTV9DU19DVFJMMSAgICAgICAgICAgICAgICAgICAgICAgMTYKIAotLyogQk0gUEhZIENvcHBlciBTcGVjaWZpYyBTdGF0dXMgKi8KLSNkZWZpbmUgQk1fQ1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIEJNX0NTX1NUQVRVU19MSU5LX1VQICAgICAgICAgICAgICAweDA0MDAKLSNkZWZpbmUgQk1fQ1NfU1RBVFVTX1JFU09MVkVEICAgICAgICAgICAgIDB4MDgwMAotI2RlZmluZSBCTV9DU19TVEFUVVNfU1BFRURfTUFTSyAgICAgICAgICAgMHhDMDAwCi0jZGVmaW5lIEJNX0NTX1NUQVRVU19TUEVFRF8xMDAwICAgICAgICAgICAweDgwMDAKLQogI2RlZmluZSBIVl9NVVhfREFUQV9DVFJMICAgICAgICAgICAgICAgUEhZX1JFRyg3NzYsIDE2KQogI2RlZmluZSBIVl9NVVhfREFUQV9DVFJMX0dFTl9UT19NQUMgICAgMHgwNDAwCiAjZGVmaW5lIEhWX01VWF9EQVRBX0NUUkxfRk9SQ0VfU1BFRUQgICAweDAwMDQKQEAgLTE2NCwxNiArMTU3LDI1IEBACiAJCSAqIE1ESUMgbW9kZS4gTm8gaGFybSBpbiB0cnlpbmcgYWdhaW4gaW4gdGhpcyBjYXNlIHNpbmNlCiAJCSAqIHRoZSBQSFkgSUQgaXMgdW5rbm93biBhdCB0aGlzIHBvaW50IGFueXdheQogCQkgKi8KKwkJcmV0X3ZhbCA9IHBoeS0+b3BzLmFjcXVpcmVfcGh5KGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIG91dDsKIAkJcmV0X3ZhbCA9IGUxMDAwX3NldF9tZGlvX3Nsb3dfbW9kZV9odihodywgdHJ1ZSk7CiAJCWlmIChyZXRfdmFsKQogCQkJZ290byBvdXQ7CisJCXBoeS0+b3BzLnJlbGVhc2VfcGh5KGh3KTsKIAogCQlyZXRyeV9jb3VudCsrOwogCX0KIG91dDoKIAkvKiBSZXZlcnQgdG8gTURJTyBmYXN0IG1vZGUsIGlmIGFwcGxpY2FibGUgKi8KLQlpZiAocmV0cnlfY291bnQpCisJaWYgKHJldHJ5X2NvdW50KSB7CisJCXJldF92YWwgPSBwaHktPm9wcy5hY3F1aXJlX3BoeShodyk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CiAJCXJldF92YWwgPSBlMTAwMF9zZXRfbWRpb19zbG93X21vZGVfaHYoaHcsIGZhbHNlKTsKKwkJcGh5LT5vcHMucmVsZWFzZV9waHkoaHcpOworCX0KIAogCXJldHVybiByZXRfdmFsOwogfQpAQCAtMzU0LDM4ICszNTYsMTE3IEBACiB9CiAKIC8qKgotICogIGUxMDAwZV9yZWFkX3BoeV9yZWdfaWdwIC0gUmVhZCBpZ3AgUEhZIHJlZ2lzdGVyCisgKiAgX19lMTAwMGVfcmVhZF9waHlfcmVnX2lncCAtIFJlYWQgaWdwIFBIWSByZWdpc3RlcgogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIGJlIHJlYWQKICAqICBAZGF0YTogcG9pbnRlciB0byB0aGUgcmVhZCBkYXRhCisgKiAgQGxvY2tlZDogc2VtYXBob3JlIGhhcyBhbHJlYWR5IGJlZW4gYWNxdWlyZWQgb3Igbm90CiAgKgogICogIEFjcXVpcmVzIHNlbWFwaG9yZSwgaWYgbmVjZXNzYXJ5LCB0aGVuIHJlYWRzIHRoZSBQSFkgcmVnaXN0ZXIgYXQgb2Zmc2V0Ci0gKiAgYW5kIHN0b3JpbmcgdGhlIHJldHJpZXZlZCBpbmZvcm1hdGlvbiBpbiBkYXRhLiAgUmVsZWFzZSBhbnkgYWNxdWlyZWQKKyAqICBhbmQgc3RvcmVzIHRoZSByZXRyaWV2ZWQgaW5mb3JtYXRpb24gaW4gZGF0YS4gIFJlbGVhc2UgYW55IGFjcXVpcmVkCiAgKiAgc2VtYXBob3JlcyBiZWZvcmUgZXhpdGluZy4KICAqKi8KLXMzMiBlMTAwMGVfcmVhZF9waHlfcmVnX2lncChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCitzdGF0aWMgczMyIF9fZTEwMDBlX3JlYWRfcGh5X3JlZ19pZ3Aoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NrZWQpCiB7Ci0JczMyIHJldF92YWw7CisJczMyIHJldF92YWwgPSAwOwogCi0JcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKLQlpZiAocmV0X3ZhbCkKLQkJcmV0dXJuIHJldF92YWw7CisJaWYgKCFsb2NrZWQpIHsKKwkJaWYgKCEoaHctPnBoeS5vcHMuYWNxdWlyZV9waHkpKQorCQkJZ290byBvdXQ7CisKKwkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAob2Zmc2V0ID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykgewogCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKIAkJCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKIAkJCQkJCSAgICAodTE2KW9mZnNldCk7Ci0JCWlmIChyZXRfdmFsKSB7Ci0JCQlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7Ci0JCQlyZXR1cm4gcmV0X3ZhbDsKLQkJfQorCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gcmVsZWFzZTsKIAl9CiAKIAlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgb2Zmc2V0LAotCQkJCQkgICBkYXRhKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CiAKLQlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CityZWxlYXNlOgorCWlmICghbG9ja2VkKQorCQlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CitvdXQ6CisJcmV0dXJuIHJldF92YWw7Cit9CiAKKy8qKgorICogIGUxMDAwZV9yZWFkX3BoeV9yZWdfaWdwIC0gUmVhZCBpZ3AgUEhZIHJlZ2lzdGVyCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgdG8gYmUgcmVhZAorICogIEBkYXRhOiBwb2ludGVyIHRvIHRoZSByZWFkIGRhdGEKKyAqCisgKiAgQWNxdWlyZXMgc2VtYXBob3JlIHRoZW4gcmVhZHMgdGhlIFBIWSByZWdpc3RlciBhdCBvZmZzZXQgYW5kIHN0b3JlcyB0aGUKKyAqICByZXRyaWV2ZWQgaW5mb3JtYXRpb24gaW4gZGF0YS4KKyAqICBSZWxlYXNlIHRoZSBhY3F1aXJlZCBzZW1hcGhvcmUgYmVmb3JlIGV4aXRpbmcuCisgKiovCitzMzIgZTEwMDBlX3JlYWRfcGh5X3JlZ19pZ3Aoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKQoreworCXJldHVybiBfX2UxMDAwZV9yZWFkX3BoeV9yZWdfaWdwKGh3LCBvZmZzZXQsIGRhdGEsIGZhbHNlKTsKK30KKworLyoqCisgKiAgZTEwMDBlX3JlYWRfcGh5X3JlZ19pZ3BfbG9ja2VkIC0gUmVhZCBpZ3AgUEhZIHJlZ2lzdGVyCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgdG8gYmUgcmVhZAorICogIEBkYXRhOiBwb2ludGVyIHRvIHRoZSByZWFkIGRhdGEKKyAqCisgKiAgUmVhZHMgdGhlIFBIWSByZWdpc3RlciBhdCBvZmZzZXQgYW5kIHN0b3JlcyB0aGUgcmV0cmlldmVkIGluZm9ybWF0aW9uCisgKiAgaW4gZGF0YS4gIEFzc3VtZXMgc2VtYXBob3JlIGFscmVhZHkgYWNxdWlyZWQuCisgKiovCitzMzIgZTEwMDBlX3JlYWRfcGh5X3JlZ19pZ3BfbG9ja2VkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSkKK3sKKwlyZXR1cm4gX19lMTAwMGVfcmVhZF9waHlfcmVnX2lncChodywgb2Zmc2V0LCBkYXRhLCB0cnVlKTsKK30KKworLyoqCisgKiAgZTEwMDBlX3dyaXRlX3BoeV9yZWdfaWdwIC0gV3JpdGUgaWdwIFBIWSByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiAgQGRhdGE6IGRhdGEgdG8gd3JpdGUgYXQgcmVnaXN0ZXIgb2Zmc2V0CisgKiAgQGxvY2tlZDogc2VtYXBob3JlIGhhcyBhbHJlYWR5IGJlZW4gYWNxdWlyZWQgb3Igbm90CisgKgorICogIEFjcXVpcmVzIHNlbWFwaG9yZSwgaWYgbmVjZXNzYXJ5LCB0aGVuIHdyaXRlcyB0aGUgZGF0YSB0byBQSFkgcmVnaXN0ZXIKKyAqICBhdCB0aGUgb2Zmc2V0LiAgUmVsZWFzZSBhbnkgYWNxdWlyZWQgc2VtYXBob3JlcyBiZWZvcmUgZXhpdGluZy4KKyAqKi8KK3N0YXRpYyBzMzIgX19lMTAwMGVfd3JpdGVfcGh5X3JlZ19pZ3Aoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NrZWQpCit7CisJczMyIHJldF92YWwgPSAwOworCisJaWYgKCFsb2NrZWQpIHsKKwkJaWYgKCEoaHctPnBoeS5vcHMuYWNxdWlyZV9waHkpKQorCQkJZ290byBvdXQ7CisKKwkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAob2Zmc2V0ID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykgeworCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKKwkJCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJCQkJCSAgICAodTE2KW9mZnNldCk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byByZWxlYXNlOworCX0KKworCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgb2Zmc2V0LAorCQkJCQkgICAgZGF0YSk7CisKK3JlbGVhc2U6CisJaWYgKCFsb2NrZWQpCisJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKworb3V0OgogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC0zOTUsNTMgKzQ3Niw1MyBAQAogICogIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldCB0byB3cml0ZSB0bwogICogIEBkYXRhOiBkYXRhIHRvIHdyaXRlIGF0IHJlZ2lzdGVyIG9mZnNldAogICoKLSAqICBBY3F1aXJlcyBzZW1hcGhvcmUsIGlmIG5lY2Vzc2FyeSwgdGhlbiB3cml0ZXMgdGhlIGRhdGEgdG8gUEhZIHJlZ2lzdGVyCisgKiAgQWNxdWlyZXMgc2VtYXBob3JlIHRoZW4gd3JpdGVzIHRoZSBkYXRhIHRvIFBIWSByZWdpc3RlcgogICogIGF0IHRoZSBvZmZzZXQuICBSZWxlYXNlIGFueSBhY3F1aXJlZCBzZW1hcGhvcmVzIGJlZm9yZSBleGl0aW5nLgogICoqLwogczMyIGUxMDAwZV93cml0ZV9waHlfcmVnX2lncChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSkKIHsKLQlzMzIgcmV0X3ZhbDsKLQotCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlX3BoeShodyk7Ci0JaWYgKHJldF92YWwpCi0JCXJldHVybiByZXRfdmFsOwotCi0JaWYgKG9mZnNldCA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpIHsKLQkJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsCi0JCQkJCQkgICAgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCi0JCQkJCQkgICAgKHUxNilvZmZzZXQpOwotCQlpZiAocmV0X3ZhbCkgewotCQkJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwotCQkJcmV0dXJuIHJldF92YWw7Ci0JCX0KLQl9Ci0KLQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIG9mZnNldCwKLQkJCQkJICAgIGRhdGEpOwotCi0JaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwotCi0JcmV0dXJuIHJldF92YWw7CisJcmV0dXJuIF9fZTEwMDBlX3dyaXRlX3BoeV9yZWdfaWdwKGh3LCBvZmZzZXQsIGRhdGEsIGZhbHNlKTsKIH0KIAogLyoqCi0gKiAgZTEwMDBlX3JlYWRfa21ybl9yZWcgLSBSZWFkIGt1bWVyYW4gcmVnaXN0ZXIKKyAqICBlMTAwMGVfd3JpdGVfcGh5X3JlZ19pZ3BfbG9ja2VkIC0gV3JpdGUgaWdwIFBIWSByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiAgQGRhdGE6IGRhdGEgdG8gd3JpdGUgYXQgcmVnaXN0ZXIgb2Zmc2V0CisgKgorICogIFdyaXRlcyB0aGUgZGF0YSB0byBQSFkgcmVnaXN0ZXIgYXQgdGhlIG9mZnNldC4KKyAqICBBc3N1bWVzIHNlbWFwaG9yZSBhbHJlYWR5IGFjcXVpcmVkLgorICoqLworczMyIGUxMDAwZV93cml0ZV9waHlfcmVnX2lncF9sb2NrZWQoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpCit7CisJcmV0dXJuIF9fZTEwMDBlX3dyaXRlX3BoeV9yZWdfaWdwKGh3LCBvZmZzZXQsIGRhdGEsIHRydWUpOworfQorCisvKioKKyAqICBfX2UxMDAwX3JlYWRfa21ybl9yZWcgLSBSZWFkIGt1bWVyYW4gcmVnaXN0ZXIKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldCB0byBiZSByZWFkCiAgKiAgQGRhdGE6IHBvaW50ZXIgdG8gdGhlIHJlYWQgZGF0YQorICogIEBsb2NrZWQ6IHNlbWFwaG9yZSBoYXMgYWxyZWFkeSBiZWVuIGFjcXVpcmVkIG9yIG5vdAogICoKICAqICBBY3F1aXJlcyBzZW1hcGhvcmUsIGlmIG5lY2Vzc2FyeS4gIFRoZW4gcmVhZHMgdGhlIFBIWSByZWdpc3RlciBhdCBvZmZzZXQKICAqICB1c2luZyB0aGUga3VtZXJhbiBpbnRlcmZhY2UuICBUaGUgaW5mb3JtYXRpb24gcmV0cmlldmVkIGlzIHN0b3JlZCBpbiBkYXRhLgogICogIFJlbGVhc2UgYW55IGFjcXVpcmVkIHNlbWFwaG9yZXMgYmVmb3JlIGV4aXRpbmcuCiAgKiovCi1zMzIgZTEwMDBlX3JlYWRfa21ybl9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKQorc3RhdGljIHMzMiBfX2UxMDAwX3JlYWRfa21ybl9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NrZWQpCiB7CiAJdTMyIGttcm5jdHJsc3RhOwotCXMzMiByZXRfdmFsOworCXMzMiByZXRfdmFsID0gMDsKIAotCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlX3BoeShodyk7Ci0JaWYgKHJldF92YWwpCi0JCXJldHVybiByZXRfdmFsOworCWlmICghbG9ja2VkKSB7CisJCWlmICghKGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KSkKKwkJCWdvdG8gb3V0OworCisJCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlX3BoeShodyk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CisJfQogCiAJa21ybmN0cmxzdGEgPSAoKG9mZnNldCA8PCBFMTAwMF9LTVJOQ1RSTFNUQV9PRkZTRVRfU0hJRlQpICYKIAkJICAgICAgIEUxMDAwX0tNUk5DVFJMU1RBX09GRlNFVCkgfCBFMTAwMF9LTVJOQ1RSTFNUQV9SRU47CkBAIC00NTIsNDEgKzUzMywxMTEgQEAKIAlrbXJuY3RybHN0YSA9IGVyMzIoS01STkNUUkxTVEEpOwogCSpkYXRhID0gKHUxNilrbXJuY3RybHN0YTsKIAotCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKwlpZiAoIWxvY2tlZCkKKwkJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwogCitvdXQ6CiAJcmV0dXJuIHJldF92YWw7CiB9CiAKIC8qKgotICogIGUxMDAwZV93cml0ZV9rbXJuX3JlZyAtIFdyaXRlIGt1bWVyYW4gcmVnaXN0ZXIKKyAqICBlMTAwMGVfcmVhZF9rbXJuX3JlZyAtICBSZWFkIGt1bWVyYW4gcmVnaXN0ZXIKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldCB0byBiZSByZWFkCisgKiAgQGRhdGE6IHBvaW50ZXIgdG8gdGhlIHJlYWQgZGF0YQorICoKKyAqICBBY3F1aXJlcyBzZW1hcGhvcmUgdGhlbiByZWFkcyB0aGUgUEhZIHJlZ2lzdGVyIGF0IG9mZnNldCB1c2luZyB0aGUKKyAqICBrdW1lcmFuIGludGVyZmFjZS4gIFRoZSBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgaXMgc3RvcmVkIGluIGRhdGEuCisgKiAgUmVsZWFzZSB0aGUgYWNxdWlyZWQgc2VtYXBob3JlIGJlZm9yZSBleGl0aW5nLgorICoqLworczMyIGUxMDAwZV9yZWFkX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSkKK3sKKwlyZXR1cm4gX19lMTAwMF9yZWFkX2ttcm5fcmVnKGh3LCBvZmZzZXQsIGRhdGEsIGZhbHNlKTsKK30KKworLyoqCisgKiAgZTEwMDBlX3JlYWRfa21ybl9yZWdfbG9ja2VkIC0gIFJlYWQga3VtZXJhbiByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIGJlIHJlYWQKKyAqICBAZGF0YTogcG9pbnRlciB0byB0aGUgcmVhZCBkYXRhCisgKgorICogIFJlYWRzIHRoZSBQSFkgcmVnaXN0ZXIgYXQgb2Zmc2V0IHVzaW5nIHRoZSBrdW1lcmFuIGludGVyZmFjZS4gIFRoZQorICogIGluZm9ybWF0aW9uIHJldHJpZXZlZCBpcyBzdG9yZWQgaW4gZGF0YS4KKyAqICBBc3N1bWVzIHNlbWFwaG9yZSBhbHJlYWR5IGFjcXVpcmVkLgorICoqLworczMyIGUxMDAwZV9yZWFkX2ttcm5fcmVnX2xvY2tlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCit7CisJcmV0dXJuIF9fZTEwMDBfcmVhZF9rbXJuX3JlZyhodywgb2Zmc2V0LCBkYXRhLCB0cnVlKTsKK30KKworLyoqCisgKiAgX19lMTAwMF93cml0ZV9rbXJuX3JlZyAtIFdyaXRlIGt1bWVyYW4gcmVnaXN0ZXIKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldCB0byB3cml0ZSB0bwogICogIEBkYXRhOiBkYXRhIHRvIHdyaXRlIGF0IHJlZ2lzdGVyIG9mZnNldAorICogIEBsb2NrZWQ6IHNlbWFwaG9yZSBoYXMgYWxyZWFkeSBiZWVuIGFjcXVpcmVkIG9yIG5vdAogICoKICAqICBBY3F1aXJlcyBzZW1hcGhvcmUsIGlmIG5lY2Vzc2FyeS4gIFRoZW4gd3JpdGUgdGhlIGRhdGEgdG8gUEhZIHJlZ2lzdGVyCiAgKiAgYXQgdGhlIG9mZnNldCB1c2luZyB0aGUga3VtZXJhbiBpbnRlcmZhY2UuICBSZWxlYXNlIGFueSBhY3F1aXJlZCBzZW1hcGhvcmVzCiAgKiAgYmVmb3JlIGV4aXRpbmcuCiAgKiovCi1zMzIgZTEwMDBlX3dyaXRlX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKQorc3RhdGljIHMzMiBfX2UxMDAwX3dyaXRlX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9ja2VkKQogewogCXUzMiBrbXJuY3RybHN0YTsKLQlzMzIgcmV0X3ZhbDsKKwlzMzIgcmV0X3ZhbCA9IDA7CiAKLQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOwotCWlmIChyZXRfdmFsKQotCQlyZXR1cm4gcmV0X3ZhbDsKKwlpZiAoIWxvY2tlZCkgeworCQlpZiAoIShody0+cGh5Lm9wcy5hY3F1aXJlX3BoeSkpCisJCQlnb3RvIG91dDsKKworCQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gb3V0OworCX0KIAogCWttcm5jdHJsc3RhID0gKChvZmZzZXQgPDwgRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUX1NISUZUKSAmCiAJCSAgICAgICBFMTAwMF9LTVJOQ1RSTFNUQV9PRkZTRVQpIHwgZGF0YTsKIAlldzMyKEtNUk5DVFJMU1RBLCBrbXJuY3RybHN0YSk7CiAKIAl1ZGVsYXkoMik7Ci0JaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwogCisJaWYgKCFsb2NrZWQpCisJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKworb3V0OgogCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKKyAqICBlMTAwMGVfd3JpdGVfa21ybl9yZWcgLSAgV3JpdGUga3VtZXJhbiByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiAgQGRhdGE6IGRhdGEgdG8gd3JpdGUgYXQgcmVnaXN0ZXIgb2Zmc2V0CisgKgorICogIEFjcXVpcmVzIHNlbWFwaG9yZSB0aGVuIHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgUEhZIHJlZ2lzdGVyIGF0IHRoZSBvZmZzZXQKKyAqICB1c2luZyB0aGUga3VtZXJhbiBpbnRlcmZhY2UuICBSZWxlYXNlIHRoZSBhY3F1aXJlZCBzZW1hcGhvcmUgYmVmb3JlIGV4aXRpbmcuCisgKiovCitzMzIgZTEwMDBlX3dyaXRlX2ttcm5fcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKQoreworCXJldHVybiBfX2UxMDAwX3dyaXRlX2ttcm5fcmVnKGh3LCBvZmZzZXQsIGRhdGEsIGZhbHNlKTsKK30KKworLyoqCisgKiAgZTEwMDBlX3dyaXRlX2ttcm5fcmVnX2xvY2tlZCAtICBXcml0ZSBrdW1lcmFuIHJlZ2lzdGVyCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgdG8gd3JpdGUgdG8KKyAqICBAZGF0YTogZGF0YSB0byB3cml0ZSBhdCByZWdpc3RlciBvZmZzZXQKKyAqCisgKiAgV3JpdGUgdGhlIGRhdGEgdG8gUEhZIHJlZ2lzdGVyIGF0IHRoZSBvZmZzZXQgdXNpbmcgdGhlIGt1bWVyYW4gaW50ZXJmYWNlLgorICogIEFzc3VtZXMgc2VtYXBob3JlIGFscmVhZHkgYWNxdWlyZWQuCisgKiovCitzMzIgZTEwMDBlX3dyaXRlX2ttcm5fcmVnX2xvY2tlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSkKK3sKKwlyZXR1cm4gX19lMTAwMF93cml0ZV9rbXJuX3JlZyhodywgb2Zmc2V0LCBkYXRhLCB0cnVlKTsKK30KKworLyoqCiAgKiAgZTEwMDBfY29wcGVyX2xpbmtfc2V0dXBfODI1NzcgLSBTZXR1cCA4MjU3NyBQSFkgZm9yIGNvcHBlciBsaW5rCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqCkBAIC0yMTA1LDYgKzIyNTYsMTAgQEAKIAl1MzIgcGFnZSA9IG9mZnNldCA+PiBJR1BfUEFHRV9TSElGVDsKIAl1MzIgcGFnZV9zaGlmdCA9IDA7CiAKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwogCS8qIFBhZ2UgODAwIHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gdGhlIHJlc3Qgc28gaXQgaGFzIGl0cyBvd24gZnVuYyAqLwogCWlmIChwYWdlID09IEJNX1dVQ19QQUdFKSB7CiAJCXJldF92YWwgPSBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0oaHcsIG9mZnNldCwgJmRhdGEsCkBAIC0yMTEyLDEwICsyMjY3LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKLQlpZiAocmV0X3ZhbCkKLQkJZ290byBvdXQ7Ci0KIAlody0+cGh5LmFkZHIgPSBlMTAwMF9nZXRfcGh5X2FkZHJfZm9yX2JtX3BhZ2UocGFnZSwgb2Zmc2V0KTsKIAogCWlmIChvZmZzZXQgPiBNQVhfUEhZX01VTFRJX1BBR0VfUkVHKSB7CkBAIC0yMTM1LDE4ICsyMjg2LDE1IEBACiAJCS8qIFBhZ2UgaXMgc2hpZnRlZCBsZWZ0LCBQSFkgZXhwZWN0cyAocGFnZSB4IDMyKSAqLwogCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgcGFnZV9zZWxlY3QsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlIDw8IHBhZ2Vfc2hpZnQpKTsKLQkJaWYgKHJldF92YWwpIHsKLQkJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKwkJaWYgKHJldF92YWwpCiAJCQlnb3RvIG91dDsKLQkJfQogCX0KIAogCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgb2Zmc2V0LAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwogCi0JaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwotCiBvdXQ6CisJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC0yMTY3LDYgKzIzMTUsMTAgQEAKIAl1MzIgcGFnZSA9IG9mZnNldCA+PiBJR1BfUEFHRV9TSElGVDsKIAl1MzIgcGFnZV9zaGlmdCA9IDA7CiAKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwogCS8qIFBhZ2UgODAwIHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gdGhlIHJlc3Qgc28gaXQgaGFzIGl0cyBvd24gZnVuYyAqLwogCWlmIChwYWdlID09IEJNX1dVQ19QQUdFKSB7CiAJCXJldF92YWwgPSBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0oaHcsIG9mZnNldCwgZGF0YSwKQEAgLTIxNzQsMTAgKzIzMjYsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOwotCWlmIChyZXRfdmFsKQotCQlnb3RvIG91dDsKLQogCWh3LT5waHkuYWRkciA9IGUxMDAwX2dldF9waHlfYWRkcl9mb3JfYm1fcGFnZShwYWdlLCBvZmZzZXQpOwogCiAJaWYgKG9mZnNldCA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpIHsKQEAgLTIxOTcsMTcgKzIzNDUsMTQgQEAKIAkJLyogUGFnZSBpcyBzaGlmdGVkIGxlZnQsIFBIWSBleHBlY3RzIChwYWdlIHggMzIpICovCiAJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBwYWdlX3NlbGVjdCwKIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UgPDwgcGFnZV9zaGlmdCkpOwotCQlpZiAocmV0X3ZhbCkgewotCQkJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOworCQlpZiAocmV0X3ZhbCkKIAkJCWdvdG8gb3V0OwotCQl9CiAJfQogCiAJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIG9mZnNldCwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwotCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKLQogb3V0OgorCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtMjIyNiwxNyArMjM3MSwxNyBAQAogCXMzMiByZXRfdmFsOwogCXUxNiBwYWdlID0gKHUxNikob2Zmc2V0ID4+IElHUF9QQUdFX1NISUZUKTsKIAorCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlX3BoeShodyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCiAJLyogUGFnZSA4MDAgd29ya3MgZGlmZmVyZW50bHkgdGhhbiB0aGUgcmVzdCBzbyBpdCBoYXMgaXRzIG93biBmdW5jICovCiAJaWYgKHBhZ2UgPT0gQk1fV1VDX1BBR0UpIHsKIAkJcmV0X3ZhbCA9IGUxMDAwX2FjY2Vzc19waHlfd2FrZXVwX3JlZ19ibShodywgb2Zmc2V0LCBkYXRhLAogCQkJCQkJCSB0cnVlKTsKLQkJcmV0dXJuIHJldF92YWw7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlX3BoeShodyk7Ci0JaWYgKHJldF92YWwpCi0JCXJldHVybiByZXRfdmFsOwotCiAJaHctPnBoeS5hZGRyID0gMTsKIAogCWlmIChvZmZzZXQgPiBNQVhfUEhZX01VTFRJX1BBR0VfUkVHKSB7CkBAIC0yMjQ1LDE2ICsyMzkwLDE0IEBACiAJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBCTV9QSFlfUEFHRV9TRUxFQ1QsCiAJCQkJCQkgICAgcGFnZSk7CiAKLQkJaWYgKHJldF92YWwpIHsKLQkJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKLQkJCXJldHVybiByZXRfdmFsOwotCQl9CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CiAJfQogCiAJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIG9mZnNldCwKIAkJCQkJICAgZGF0YSk7CitvdXQ6CiAJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwotCiAJcmV0dXJuIHJldF92YWw7CiB9CiAKQEAgLTIyNzIsMTcgKzI0MTUsMTcgQEAKIAlzMzIgcmV0X3ZhbDsKIAl1MTYgcGFnZSA9ICh1MTYpKG9mZnNldCA+PiBJR1BfUEFHRV9TSElGVCk7CiAKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwogCS8qIFBhZ2UgODAwIHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gdGhlIHJlc3Qgc28gaXQgaGFzIGl0cyBvd24gZnVuYyAqLwogCWlmIChwYWdlID09IEJNX1dVQ19QQUdFKSB7CiAJCXJldF92YWwgPSBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0oaHcsIG9mZnNldCwgJmRhdGEsCiAJCQkJCQkJIGZhbHNlKTsKLQkJcmV0dXJuIHJldF92YWw7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlX3BoeShodyk7Ci0JaWYgKHJldF92YWwpCi0JCXJldHVybiByZXRfdmFsOwotCiAJaHctPnBoeS5hZGRyID0gMTsKIAogCWlmIChvZmZzZXQgPiBNQVhfUEhZX01VTFRJX1BBR0VfUkVHKSB7CkBAIC0yMjkwLDE3ICsyNDMzLDE1IEBACiAJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBCTV9QSFlfUEFHRV9TRUxFQ1QsCiAJCQkJCQkgICAgcGFnZSk7CiAKLQkJaWYgKHJldF92YWwpIHsKLQkJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKLQkJCXJldHVybiByZXRfdmFsOwotCQl9CisJCWlmIChyZXRfdmFsKQorCQkJZ290byBvdXQ7CiAJfQogCiAJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCiAJCQkJCSAgICBkYXRhKTsKIAorb3V0OgogCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKLQogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC0yMzIwLDYgKzI0NjEsOCBAQAogICogIDMpIFdyaXRlIHRoZSBhZGRyZXNzIHVzaW5nIHRoZSBhZGRyZXNzIG9wY29kZSAoMHgxMSkKICAqICA0KSBSZWFkIG9yIHdyaXRlIHRoZSBkYXRhIHVzaW5nIHRoZSBkYXRhIG9wY29kZSAoMHgxMikKICAqICA1KSBSZXN0b3JlIDc2OV8xNy4yIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQorICoKKyAqICBBc3N1bWVzIHNlbWFwaG9yZSBhbHJlYWR5IGFjcXVpcmVkLgogICoqLwogc3RhdGljIHMzMiBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKIAkJCQkJICB1MTYgKmRhdGEsIGJvb2wgcmVhZCkKQEAgLTIzMjcsMjAgKzI0NzAsMTIgQEAKIAlzMzIgcmV0X3ZhbDsKIAl1MTYgcmVnID0gQk1fUEhZX1JFR19OVU0ob2Zmc2V0KTsKIAl1MTYgcGh5X3JlZyA9IDA7Ci0JdTggIHBoeV9hY3F1aXJlZCA9IDE7Ci0KIAogCS8qIEdpZyBtdXN0IGJlIGRpc2FibGVkIGZvciBNRElPIGFjY2Vzc2VzIHRvIHBhZ2UgODAwICovCiAJaWYgKChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKSAmJgogCSAgICghKGVyMzIoUEhZX0NUUkwpICYgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEUpKSkKIAkJaHdfZGJnKGh3LCAiQXR0ZW1wdGluZyB0byBhY2Nlc3MgcGFnZSA4MDAgd2hpbGUgZ2lnIGVuYWJsZWRcbiIpOwogCi0JcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKLQlpZiAocmV0X3ZhbCkgewotCQlwaHlfYWNxdWlyZWQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KIAkvKiBBbGwgb3BlcmF0aW9ucyBpbiB0aGlzIGZ1bmN0aW9uIGFyZSBwaHkgYWRkcmVzcyAxICovCiAJaHctPnBoeS5hZGRyID0gMTsKIApAQCAtMjM5Nyw4ICsyNTMyLDYgQEAKIAlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgQk1fV1VDX0VOQUJMRV9SRUcsIHBoeV9yZWcpOwogCiBvdXQ6Ci0JaWYgKHBoeV9hY3F1aXJlZCA9PSAxKQotCQlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CiAJcmV0dXJuIHJldF92YWw7CiB9CiAKQEAgLTI0MzksNTIgKzI1NzIsNjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiAgZTEwMDBfc2V0X21kaW9fc2xvd19tb2RlX2h2IC0gU2V0IHNsb3cgTURJTyBhY2Nlc3MgbW9kZQorICogIEBodzogICBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAc2xvdzogdHJ1ZSBmb3Igc2xvdyBtb2RlLCBmYWxzZSBmb3Igbm9ybWFsIG1vZGUKKyAqCisgKiAgQXNzdW1lcyBzZW1hcGhvcmUgYWxyZWFkeSBhY3F1aXJlZC4KKyAqKi8KIHMzMiBlMTAwMF9zZXRfbWRpb19zbG93X21vZGVfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbCBzbG93KQogewogCXMzMiByZXRfdmFsID0gMDsKIAl1MTYgZGF0YSA9IDA7CiAKLQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOwotCWlmIChyZXRfdmFsKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQogCS8qIFNldCBNRElPIG1vZGUgLSBwYWdlIDc2OSwgcmVnaXN0ZXIgMTY6IDB4MjU4MD09c2xvdywgMHgyMTgwPT1mYXN0ICovCiAJaHctPnBoeS5hZGRyID0gMTsKIAlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCiAJCQkJICAgICAgICAgKEJNX1BPUlRfQ1RSTF9QQUdFIDw8IElHUF9QQUdFX1NISUZUKSk7Ci0JaWYgKHJldF92YWwpIHsKLQkJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwotCQlyZXR1cm4gcmV0X3ZhbDsKLQl9CisJaWYgKHJldF92YWwpCisJCWdvdG8gb3V0OworCiAJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIEJNX0NTX0NUUkwxLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjE4MCB8IChzbG93IDw8IDEwKSkpOworCWlmIChyZXRfdmFsKQorCQlnb3RvIG91dDsKIAogCS8qIGR1bW15IHJlYWQgd2hlbiByZXZlcnRpbmcgdG8gZmFzdCBtb2RlIC0gdGhyb3cgYXdheSByZXN1bHQgKi8KIAlpZiAoIXNsb3cpCi0JCWUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgQk1fQ1NfQ1RSTDEsICZkYXRhKTsKKwkJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgQk1fQ1NfQ1RSTDEsICZkYXRhKTsKIAotCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKLQorb3V0OgogCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKLSAqICBlMTAwMF9yZWFkX3BoeV9yZWdfaHYgLSAgUmVhZCBIViBQSFkgcmVnaXN0ZXIKKyAqICBfX2UxMDAwX3JlYWRfcGh5X3JlZ19odiAtICBSZWFkIEhWIFBIWSByZWdpc3RlcgogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIGJlIHJlYWQKICAqICBAZGF0YTogcG9pbnRlciB0byB0aGUgcmVhZCBkYXRhCisgKiAgQGxvY2tlZDogc2VtYXBob3JlIGhhcyBhbHJlYWR5IGJlZW4gYWNxdWlyZWQgb3Igbm90CiAgKgogICogIEFjcXVpcmVzIHNlbWFwaG9yZSwgaWYgbmVjZXNzYXJ5LCB0aGVuIHJlYWRzIHRoZSBQSFkgcmVnaXN0ZXIgYXQgb2Zmc2V0Ci0gKiAgYW5kIHN0b3JpbmcgdGhlIHJldHJpZXZlZCBpbmZvcm1hdGlvbiBpbiBkYXRhLiAgUmVsZWFzZSBhbnkgYWNxdWlyZWQKKyAqICBhbmQgc3RvcmVzIHRoZSByZXRyaWV2ZWQgaW5mb3JtYXRpb24gaW4gZGF0YS4gIFJlbGVhc2UgYW55IGFjcXVpcmVkCiAgKiAgc2VtYXBob3JlIGJlZm9yZSBleGl0aW5nLgogICoqLwotczMyIGUxMDAwX3JlYWRfcGh5X3JlZ19odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCitzdGF0aWMgczMyIF9fZTEwMDBfcmVhZF9waHlfcmVnX2h2KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NrZWQpCiB7CiAJczMyIHJldF92YWw7CiAJdTE2IHBhZ2UgPSBCTV9QSFlfUkVHX1BBR0Uob2Zmc2V0KTsKIAl1MTYgcmVnID0gQk1fUEhZX1JFR19OVU0ob2Zmc2V0KTsKIAlib29sIGluX3Nsb3dfbW9kZSA9IGZhbHNlOwogCisJaWYgKCFsb2NrZWQpIHsKKwkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKIAkvKiBXb3JrYXJvdW5kIGZhaWx1cmUgaW4gTURJTyBhY2Nlc3Mgd2hpbGUgY2FibGUgaXMgZGlzY29ubmVjdGVkICovCiAJaWYgKChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc3KSAmJgogCSAgICAhKGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MVSkpIHsKQEAgLTI1MDgsMTAgKzI2NTIsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOwotCWlmIChyZXRfdmFsKQotCQlnb3RvIG91dDsKLQogCWh3LT5waHkuYWRkciA9IGUxMDAwX2dldF9waHlfYWRkcl9mb3JfaHZfcGFnZShwYWdlKTsKIAogCWlmIChwYWdlID09IEhWX0lOVENfRkNfUEFHRV9TVEFSVCkKQEAgLTI1MjksNDIgKzI2NjksNzYgQEAKIAkJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UgPDwgSUdQX1BBR0VfU0hJRlQpKTsKLQkJCWlmIChyZXRfdmFsKSB7Ci0JCQkJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwotCQkJCWdvdG8gb3V0OwotCQkJfQogCQkJaHctPnBoeS5hZGRyID0gcGh5X2FkZHI7CiAJCX0KIAl9CiAKIAlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgcmVnLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKLQlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7Ci0KIG91dDoKIAkvKiBSZXZlcnQgdG8gTURJTyBmYXN0IG1vZGUsIGlmIGFwcGxpY2FibGUgKi8KIAlpZiAoKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzcpICYmIGluX3Nsb3dfbW9kZSkKIAkJcmV0X3ZhbCA9IGUxMDAwX3NldF9tZGlvX3Nsb3dfbW9kZV9odihodywgZmFsc2UpOwogCisJaWYgKCFsb2NrZWQpCisJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKwogCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKLSAqICBlMTAwMF93cml0ZV9waHlfcmVnX2h2IC0gV3JpdGUgSFYgUEhZIHJlZ2lzdGVyCisgKiAgZTEwMDBfcmVhZF9waHlfcmVnX2h2IC0gIFJlYWQgSFYgUEhZIHJlZ2lzdGVyCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgdG8gYmUgcmVhZAorICogIEBkYXRhOiBwb2ludGVyIHRvIHRoZSByZWFkIGRhdGEKKyAqCisgKiAgQWNxdWlyZXMgc2VtYXBob3JlIHRoZW4gcmVhZHMgdGhlIFBIWSByZWdpc3RlciBhdCBvZmZzZXQgYW5kIHN0b3JlcworICogIHRoZSByZXRyaWV2ZWQgaW5mb3JtYXRpb24gaW4gZGF0YS4gIFJlbGVhc2UgdGhlIGFjcXVpcmVkIHNlbWFwaG9yZQorICogIGJlZm9yZSBleGl0aW5nLgorICoqLworczMyIGUxMDAwX3JlYWRfcGh5X3JlZ19odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCit7CisJcmV0dXJuIF9fZTEwMDBfcmVhZF9waHlfcmVnX2h2KGh3LCBvZmZzZXQsIGRhdGEsIGZhbHNlKTsKK30KKworLyoqCisgKiAgZTEwMDBfcmVhZF9waHlfcmVnX2h2X2xvY2tlZCAtICBSZWFkIEhWIFBIWSByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIGJlIHJlYWQKKyAqICBAZGF0YTogcG9pbnRlciB0byB0aGUgcmVhZCBkYXRhCisgKgorICogIFJlYWRzIHRoZSBQSFkgcmVnaXN0ZXIgYXQgb2Zmc2V0IGFuZCBzdG9yZXMgdGhlIHJldHJpZXZlZCBpbmZvcm1hdGlvbgorICogIGluIGRhdGEuICBBc3N1bWVzIHNlbWFwaG9yZSBhbHJlYWR5IGFjcXVpcmVkLgorICoqLworczMyIGUxMDAwX3JlYWRfcGh5X3JlZ19odl9sb2NrZWQoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKQoreworCXJldHVybiBfX2UxMDAwX3JlYWRfcGh5X3JlZ19odihodywgb2Zmc2V0LCBkYXRhLCB0cnVlKTsKK30KKworLyoqCisgKiAgX19lMTAwMF93cml0ZV9waHlfcmVnX2h2IC0gV3JpdGUgSFYgUEhZIHJlZ2lzdGVyCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqICBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgdG8gd3JpdGUgdG8KICAqICBAZGF0YTogZGF0YSB0byB3cml0ZSBhdCByZWdpc3RlciBvZmZzZXQKKyAqICBAbG9ja2VkOiBzZW1hcGhvcmUgaGFzIGFscmVhZHkgYmVlbiBhY3F1aXJlZCBvciBub3QKICAqCiAgKiAgQWNxdWlyZXMgc2VtYXBob3JlLCBpZiBuZWNlc3NhcnksIHRoZW4gd3JpdGVzIHRoZSBkYXRhIHRvIFBIWSByZWdpc3RlcgogICogIGF0IHRoZSBvZmZzZXQuICBSZWxlYXNlIGFueSBhY3F1aXJlZCBzZW1hcGhvcmVzIGJlZm9yZSBleGl0aW5nLgogICoqLwotczMyIGUxMDAwX3dyaXRlX3BoeV9yZWdfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpCitzdGF0aWMgczMyIF9fZTEwMDBfd3JpdGVfcGh5X3JlZ19odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9ja2VkKQogewogCXMzMiByZXRfdmFsOwogCXUxNiBwYWdlID0gQk1fUEhZX1JFR19QQUdFKG9mZnNldCk7CiAJdTE2IHJlZyA9IEJNX1BIWV9SRUdfTlVNKG9mZnNldCk7CiAJYm9vbCBpbl9zbG93X21vZGUgPSBmYWxzZTsKIAorCWlmICghbG9ja2VkKSB7CisJCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlX3BoeShodyk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCiAJLyogV29ya2Fyb3VuZCBmYWlsdXJlIGluIE1ESU8gYWNjZXNzIHdoaWxlIGNhYmxlIGlzIGRpc2Nvbm5lY3RlZCAqLwogCWlmICgoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV84MjU3NykgJiYKIAkgICAgIShlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfTFUpKSB7CkBAIC0yNTg4LDEwICsyNzYyLDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKLQlpZiAocmV0X3ZhbCkKLQkJZ290byBvdXQ7Ci0KIAlody0+cGh5LmFkZHIgPSBlMTAwMF9nZXRfcGh5X2FkZHJfZm9yX2h2X3BhZ2UocGFnZSk7CiAKIAlpZiAocGFnZSA9PSBIVl9JTlRDX0ZDX1BBR0VfU1RBUlQpCkBAIC0yNjA3LDE1ICsyNzc3LDEwIEBACiAJICAgICgoTUFYX1BIWV9SRUdfQUREUkVTUyAmIHJlZykgPT0gMCkgJiYKIAkgICAgKGRhdGEgJiAoMSA8PCAxMSkpKSB7CiAJCXUxNiBkYXRhMiA9IDB4N0VGRjsKLQkJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOwogCQlyZXRfdmFsID0gZTEwMDBfYWNjZXNzX3BoeV9kZWJ1Z19yZWdzX2h2KGh3LCAoMSA8PCA2KSB8IDB4MywKIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YTIsIGZhbHNlKTsKIAkJaWYgKHJldF92YWwpCiAJCQlnb3RvIG91dDsKLQotCQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOwotCQlpZiAocmV0X3ZhbCkKLQkJCWdvdG8gb3V0OwogCX0KIAogCWlmIChyZWcgPiBNQVhfUEhZX01VTFRJX1BBR0VfUkVHKSB7CkBAIC0yNjMwLDI3ICsyNzk1LDUzIEBACiAJCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCiAJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlIDw8IElHUF9QQUdFX1NISUZUKSk7Ci0JCQlpZiAocmV0X3ZhbCkgewotCQkJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KIAkJCWh3LT5waHkuYWRkciA9IHBoeV9hZGRyOwogCQl9CiAJfQogCiAJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiByZWcsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwotCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKIAogb3V0OgogCS8qIFJldmVydCB0byBNRElPIGZhc3QgbW9kZSwgaWYgYXBwbGljYWJsZSAqLwogCWlmICgoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV84MjU3NykgJiYgaW5fc2xvd19tb2RlKQogCQlyZXRfdmFsID0gZTEwMDBfc2V0X21kaW9fc2xvd19tb2RlX2h2KGh3LCBmYWxzZSk7CiAKKwlpZiAoIWxvY2tlZCkKKwkJaHctPnBoeS5vcHMucmVsZWFzZV9waHkoaHcpOworCiAJcmV0dXJuIHJldF92YWw7CiB9CiAKIC8qKgorICogIGUxMDAwX3dyaXRlX3BoeV9yZWdfaHYgLSBXcml0ZSBIViBQSFkgcmVnaXN0ZXIKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldCB0byB3cml0ZSB0bworICogIEBkYXRhOiBkYXRhIHRvIHdyaXRlIGF0IHJlZ2lzdGVyIG9mZnNldAorICoKKyAqICBBY3F1aXJlcyBzZW1hcGhvcmUgdGhlbiB3cml0ZXMgdGhlIGRhdGEgdG8gUEhZIHJlZ2lzdGVyIGF0IHRoZSBvZmZzZXQuCisgKiAgUmVsZWFzZSB0aGUgYWNxdWlyZWQgc2VtYXBob3JlcyBiZWZvcmUgZXhpdGluZy4KKyAqKi8KK3MzMiBlMTAwMF93cml0ZV9waHlfcmVnX2h2KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKQoreworCXJldHVybiBfX2UxMDAwX3dyaXRlX3BoeV9yZWdfaHYoaHcsIG9mZnNldCwgZGF0YSwgZmFsc2UpOworfQorCisvKioKKyAqICBlMTAwMF93cml0ZV9waHlfcmVnX2h2X2xvY2tlZCAtIFdyaXRlIEhWIFBIWSByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiAgQGRhdGE6IGRhdGEgdG8gd3JpdGUgYXQgcmVnaXN0ZXIgb2Zmc2V0CisgKgorICogIFdyaXRlcyB0aGUgZGF0YSB0byBQSFkgcmVnaXN0ZXIgYXQgdGhlIG9mZnNldC4gIEFzc3VtZXMgc2VtYXBob3JlCisgKiAgYWxyZWFkeSBhY3F1aXJlZC4KKyAqKi8KK3MzMiBlMTAwMF93cml0ZV9waHlfcmVnX2h2X2xvY2tlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSkKK3sKKwlyZXR1cm4gX19lMTAwMF93cml0ZV9waHlfcmVnX2h2KGh3LCBvZmZzZXQsIGRhdGEsIHRydWUpOworfQorCisvKioKICAqICBlMTAwMF9nZXRfcGh5X2FkZHJfZm9yX2h2X3BhZ2UgLSBHZXQgUEhZIGFkcnJlc3MgYmFzZWQgb24gcGFnZQogICogIEBwYWdlOiBwYWdlIHRvIGJlIGFjY2Vzc2VkCiAgKiovCkBAIC0yNjcxLDEwICsyODYyLDkgQEAKICAqICBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSByZWFkIG9yIHdyaXR0ZW4KICAqICBAcmVhZDogZGV0ZXJtaW5lcyBpZiBvcGVyYXRpb24gaXMgcmVhZCBvciB3cml0dGVuCiAgKgotICogIEFjcXVpcmVzIHNlbWFwaG9yZSwgaWYgbmVjZXNzYXJ5LCB0aGVuIHJlYWRzIHRoZSBQSFkgcmVnaXN0ZXIgYXQgb2Zmc2V0Ci0gKiAgYW5kIHN0b3JpbmcgdGhlIHJldHJlaXZlZCBpbmZvcm1hdGlvbiBpbiBkYXRhLiAgUmVsZWFzZSBhbnkgYWNxdWlyZWQKLSAqICBzZW1hcGhvcmVzIGJlZm9yZSBleGl0aW5nLiAgTm90ZSB0aGF0IHRoZSBwcm9jZWR1cmUgdG8gcmVhZCB0aGVzZSByZWdzCi0gKiAgdXNlcyB0aGUgYWRkcmVzcyBwb3J0IGFuZCBkYXRhIHBvcnQgdG8gcmVhZC93cml0ZS4KKyAqICBSZWFkcyB0aGUgUEhZIHJlZ2lzdGVyIGF0IG9mZnNldCBhbmQgc3RvcmVzIHRoZSByZXRyZWl2ZWQgaW5mb3JtYXRpb24KKyAqICBpbiBkYXRhLiAgQXNzdW1lcyBzZW1hcGhvcmUgYWxyZWFkeSBhY3F1aXJlZC4gIE5vdGUgdGhhdCB0aGUgcHJvY2VkdXJlCisgKiAgdG8gcmVhZCB0aGVzZSByZWdzIHVzZXMgdGhlIGFkZHJlc3MgcG9ydCBhbmQgZGF0YSBwb3J0IHRvIHJlYWQvd3JpdGUuCiAgKiovCiBzdGF0aWMgczMyIGUxMDAwX2FjY2Vzc19waHlfZGVidWdfcmVnc19odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICpkYXRhLCBib29sIHJlYWQpCkBAIC0yNjgyLDIwICsyODcyLDEyIEBACiAJczMyIHJldF92YWw7CiAJdTMyIGFkZHJfcmVnID0gMDsKIAl1MzIgZGF0YV9yZWcgPSAwOwotCXU4ICBwaHlfYWNxdWlyZWQgPSAxOwogCiAJLyogVGhpcyB0YWtlcyBjYXJlIG9mIHRoZSBkaWZmZXJlbmNlIHdpdGggZGVza3RvcCB2cyBtb2JpbGUgcGh5ICovCiAJYWRkcl9yZWcgPSAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV84MjU3OCkgPwogCSAgICAgICAgICAgSTgyNTc4X0FERFJfUkVHIDogSTgyNTc3X0FERFJfUkVHOwogCWRhdGFfcmVnID0gYWRkcl9yZWcgKyAxOwogCi0JcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKLQlpZiAocmV0X3ZhbCkgewotCQlod19kYmcoaHcsICJDb3VsZCBub3QgYWNxdWlyZSBQSFlcbiIpOwotCQlwaHlfYWNxdWlyZWQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KIAkvKiBBbGwgb3BlcmF0aW9ucyBpbiB0aGlzIGZ1bmN0aW9uIGFyZSBwaHkgYWRkcmVzcyAyICovCiAJaHctPnBoeS5hZGRyID0gMjsKIApAQCAtMjcxOCw4ICsyOTAwLDYgQEAKIAl9CiAKIG91dDoKLQlpZiAocGh5X2FjcXVpcmVkID09IDEpCi0JCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKaW5kZXggOTc3YzNkMy4uNDFiZDdhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCkBAIC0zMDgzLDcgKzMwODMsNiBAQAogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gZWhlYV9uZXRwb2xsLAogI2VuZGlmCiAJLm5kb19nZXRfc3RhdHMJCT0gZWhlYV9nZXRfc3RhdHMsCi0JLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZWhlYV9zZXRfbWFjX2FkZHIsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBlaGVhX3NldF9tdWx0aWNhc3RfbGlzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VxbC5jIGIvZHJpdmVycy9uZXQvZXFsLmMKaW5kZXggZDRkOWEzZS4uZjViOTZjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VxbC5jCisrKyBiL2RyaXZlcnMvbmV0L2VxbC5jCkBAIC0xMTEsNiArMTExLDcgQEAKICAqIFNvcnJ5LCBJIGhhZCB0byByZXdyaXRlIG1vc3Qgb2YgdGhpcyBmb3IgMi41LnggLURhdmVNCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhvYy5jIGIvZHJpdmVycy9uZXQvZXRob2MuYwppbmRleCBiNzMxMWJjLi5mN2Q5YWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhvYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aG9jLmMKQEAgLTE3LDggKzE3LDEzIEBACiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxuZXQvZXRob2MuaD4KIAorc3RhdGljIGludCBidWZmZXJfc2l6ZSA9IDB4ODAwMDsgLyogMzIgS0J5dGVzICovCittb2R1bGVfcGFyYW0oYnVmZmVyX3NpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9zaXplLCAiRE1BIGJ1ZmZlciBhbGxvY2F0aW9uIHNpemUiKTsKKwogLyogcmVnaXN0ZXIgb2Zmc2V0cyAqLwogI2RlZmluZQlNT0RFUgkJMHgwMAogI2RlZmluZQlJTlRfU09VUkNFCTB4MDQKQEAgLTE2Nyw2ICsxNzIsNyBAQAogICogc3RydWN0IGV0aG9jIC0gZHJpdmVyLXByaXZhdGUgZGV2aWNlIHN0cnVjdHVyZQogICogQGlvYmFzZToJcG9pbnRlciB0byBJL08gbWVtb3J5IHJlZ2lvbgogICogQG1lbWJhc2U6CXBvaW50ZXIgdG8gYnVmZmVyIG1lbW9yeSByZWdpb24KKyAqIEBkbWFfYWxsb2M6CWRtYSBhbGxvY2F0ZWQgYnVmZmVyIHNpemUKICAqIEBudW1fdHg6CW51bWJlciBvZiBzZW5kIGJ1ZmZlcnMKICAqIEBjdXJfdHg6CWxhc3Qgc2VuZCBidWZmZXIgd3JpdHRlbgogICogQGR0eV90eDoJbGFzdCBidWZmZXIgYWN0dWFsbHkgc2VudApAQCAtMTg1LDYgKzE5MSw3IEBACiBzdHJ1Y3QgZXRob2MgewogCXZvaWQgX19pb21lbSAqaW9iYXNlOwogCXZvaWQgX19pb21lbSAqbWVtYmFzZTsKKwlpbnQgZG1hX2FsbG9jOwogCiAJdW5zaWduZWQgaW50IG51bV90eDsKIAl1bnNpZ25lZCBpbnQgY3VyX3R4OwpAQCAtMjE2LDI0ICsyMjMsMjUgQEAKIAl1MzIgYWRkcjsKIH07CiAKLXN0YXRpYyB1MzIgZXRob2NfcmVhZChzdHJ1Y3QgZXRob2MgKmRldiwgbG9mZl90IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTMyIGV0aG9jX3JlYWQoc3RydWN0IGV0aG9jICpkZXYsIGxvZmZfdCBvZmZzZXQpCiB7CiAJcmV0dXJuIGlvcmVhZDMyKGRldi0+aW9iYXNlICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHZvaWQgZXRob2Nfd3JpdGUoc3RydWN0IGV0aG9jICpkZXYsIGxvZmZfdCBvZmZzZXQsIHUzMiBkYXRhKQorc3RhdGljIGlubGluZSB2b2lkIGV0aG9jX3dyaXRlKHN0cnVjdCBldGhvYyAqZGV2LCBsb2ZmX3Qgb2Zmc2V0LCB1MzIgZGF0YSkKIHsKIAlpb3dyaXRlMzIoZGF0YSwgZGV2LT5pb2Jhc2UgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBldGhvY19yZWFkX2JkKHN0cnVjdCBldGhvYyAqZGV2LCBpbnQgaW5kZXgsIHN0cnVjdCBldGhvY19iZCAqYmQpCitzdGF0aWMgaW5saW5lIHZvaWQgZXRob2NfcmVhZF9iZChzdHJ1Y3QgZXRob2MgKmRldiwgaW50IGluZGV4LAorCQlzdHJ1Y3QgZXRob2NfYmQgKmJkKQogewogCWxvZmZfdCBvZmZzZXQgPSBFVEhPQ19CRF9CQVNFICsgKGluZGV4ICogc2l6ZW9mKHN0cnVjdCBldGhvY19iZCkpOwogCWJkLT5zdGF0ID0gZXRob2NfcmVhZChkZXYsIG9mZnNldCArIDApOwogCWJkLT5hZGRyID0gZXRob2NfcmVhZChkZXYsIG9mZnNldCArIDQpOwogfQogCi1zdGF0aWMgdm9pZCBldGhvY193cml0ZV9iZChzdHJ1Y3QgZXRob2MgKmRldiwgaW50IGluZGV4LAorc3RhdGljIGlubGluZSB2b2lkIGV0aG9jX3dyaXRlX2JkKHN0cnVjdCBldGhvYyAqZGV2LCBpbnQgaW5kZXgsCiAJCWNvbnN0IHN0cnVjdCBldGhvY19iZCAqYmQpCiB7CiAJbG9mZl90IG9mZnNldCA9IEVUSE9DX0JEX0JBU0UgKyAoaW5kZXggKiBzaXplb2Yoc3RydWN0IGV0aG9jX2JkKSk7CkBAIC0yNDEsMzMgKzI0OSwzMyBAQAogCWV0aG9jX3dyaXRlKGRldiwgb2Zmc2V0ICsgNCwgYmQtPmFkZHIpOwogfQogCi1zdGF0aWMgdm9pZCBldGhvY19lbmFibGVfaXJxKHN0cnVjdCBldGhvYyAqZGV2LCB1MzIgbWFzaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhvY19lbmFibGVfaXJxKHN0cnVjdCBldGhvYyAqZGV2LCB1MzIgbWFzaykKIHsKIAl1MzIgaW1hc2sgPSBldGhvY19yZWFkKGRldiwgSU5UX01BU0spOwogCWltYXNrIHw9IG1hc2s7CiAJZXRob2Nfd3JpdGUoZGV2LCBJTlRfTUFTSywgaW1hc2spOwogfQogCi1zdGF0aWMgdm9pZCBldGhvY19kaXNhYmxlX2lycShzdHJ1Y3QgZXRob2MgKmRldiwgdTMyIG1hc2spCitzdGF0aWMgaW5saW5lIHZvaWQgZXRob2NfZGlzYWJsZV9pcnEoc3RydWN0IGV0aG9jICpkZXYsIHUzMiBtYXNrKQogewogCXUzMiBpbWFzayA9IGV0aG9jX3JlYWQoZGV2LCBJTlRfTUFTSyk7CiAJaW1hc2sgJj0gfm1hc2s7CiAJZXRob2Nfd3JpdGUoZGV2LCBJTlRfTUFTSywgaW1hc2spOwogfQogCi1zdGF0aWMgdm9pZCBldGhvY19hY2tfaXJxKHN0cnVjdCBldGhvYyAqZGV2LCB1MzIgbWFzaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhvY19hY2tfaXJxKHN0cnVjdCBldGhvYyAqZGV2LCB1MzIgbWFzaykKIHsKIAlldGhvY193cml0ZShkZXYsIElOVF9TT1VSQ0UsIG1hc2spOwogfQogCi1zdGF0aWMgdm9pZCBldGhvY19lbmFibGVfcnhfYW5kX3R4KHN0cnVjdCBldGhvYyAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGV0aG9jX2VuYWJsZV9yeF9hbmRfdHgoc3RydWN0IGV0aG9jICpkZXYpCiB7CiAJdTMyIG1vZGUgPSBldGhvY19yZWFkKGRldiwgTU9ERVIpOwogCW1vZGUgfD0gTU9ERVJfUlhFTiB8IE1PREVSX1RYRU47CiAJZXRob2Nfd3JpdGUoZGV2LCBNT0RFUiwgbW9kZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGV0aG9jX2Rpc2FibGVfcnhfYW5kX3R4KHN0cnVjdCBldGhvYyAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGV0aG9jX2Rpc2FibGVfcnhfYW5kX3R4KHN0cnVjdCBldGhvYyAqZGV2KQogewogCXUzMiBtb2RlID0gZXRob2NfcmVhZChkZXYsIE1PREVSKTsKIAltb2RlICY9IH4oTU9ERVJfUlhFTiB8IE1PREVSX1RYRU4pOwpAQCAtMjg0LDcgKzI5Miw3IEBACiAJZGV2LT5jdXJfcnggPSAwOwogCiAJLyogc2V0dXAgdHJhbnNtaXNzaW9uIGJ1ZmZlcnMgKi8KLQliZC5hZGRyID0gMDsKKwliZC5hZGRyID0gdmlydF90b19waHlzKGRldi0+bWVtYmFzZSk7CiAJYmQuc3RhdCA9IFRYX0JEX0lSUSB8IFRYX0JEX0NSQzsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV90eDsgaSsrKSB7CkBAIC0yOTUsNyArMzAzLDYgQEAKIAkJYmQuYWRkciArPSBFVEhPQ19CVUZTSVo7CiAJfQogCi0JYmQuYWRkciA9IGRldi0+bnVtX3R4ICogRVRIT0NfQlVGU0laOwogCWJkLnN0YXQgPSBSWF9CRF9FTVBUWSB8IFJYX0JEX0lSUTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9yeDsgaSsrKSB7CkBAIC00MDAsOCArNDA3LDEyIEBACiAJCWlmIChldGhvY191cGRhdGVfcnhfc3RhdHMocHJpdiwgJmJkKSA9PSAwKSB7CiAJCQlpbnQgc2l6ZSA9IGJkLnN0YXQgPj4gMTY7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIHNpemUpOworCisJCQlzaXplIC09IDQ7IC8qIHN0cmlwIHRoZSBDUkMgKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIGFsaWduIFRDUC9JUCBoZWFkZXIgKi8KKwogCQkJaWYgKGxpa2VseShza2IpKSB7Ci0JCQkJdm9pZCAqc3JjID0gcHJpdi0+bWVtYmFzZSArIGJkLmFkZHI7CisJCQkJdm9pZCAqc3JjID0gcGh5c190b192aXJ0KGJkLmFkZHIpOwogCQkJCW1lbWNweV9mcm9taW8oc2tiX3B1dChza2IsIHNpemUpLCBzcmMsIHNpemUpOwogCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOwpAQCAtNDk4LDcgKzUwOSw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKLQlldGhvY19hY2tfaXJxKHByaXYsIElOVF9NQVNLX0FMTCk7CisJZXRob2NfYWNrX2lycShwcml2LCBwZW5kaW5nKTsKIAogCWlmIChwZW5kaW5nICYgSU5UX01BU0tfQlVTWSkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgInBhY2tldCBkcm9wcGVkXG4iKTsKQEAgLTY1Myw5ICs2NjQsMTAgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgVFgvUlggYnVmZmVycyAqLwotCW51bV9iZCA9IChkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCArIDEpIC8gRVRIT0NfQlVGU0laOwotCXByaXYtPm51bV90eCA9IG1pbihtaW5fdHgsIG51bV9iZCAvIDQpOworCS8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIFRYL1JYIGJ1ZmZlcnMsIG1heGltdW0gMTI4IHN1cHBvcnRlZCAqLworCW51bV9iZCA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJMTI4LCAoZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQgKyAxKSAvIEVUSE9DX0JVRlNJWik7CisJcHJpdi0+bnVtX3R4ID0gbWF4KG1pbl90eCwgbnVtX2JkIC8gNCk7CiAJcHJpdi0+bnVtX3J4ID0gbnVtX2JkIC0gcHJpdi0+bnVtX3R4OwogCWV0aG9jX3dyaXRlKHByaXYsIFRYX0JEX05VTSwgcHJpdi0+bnVtX3R4KTsKIApAQCAtODIzLDcgKzgzNSw3IEBACiAJZWxzZQogCQliZC5zdGF0ICY9IH5UWF9CRF9QQUQ7CiAKLQlkZXN0ID0gcHJpdi0+bWVtYmFzZSArIGJkLmFkZHI7CisJZGVzdCA9IHBoeXNfdG9fdmlydChiZC5hZGRyKTsKIAltZW1jcHlfdG9pbyhkZXN0LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAogCWJkLnN0YXQgJj0gfihUWF9CRF9TVEFUUyB8IFRYX0JEX0xFTl9NQVNLKTsKQEAgLTkwMywyMiArOTE1LDE5IEBACiAKIAkvKiBvYnRhaW4gYnVmZmVyIG1lbW9yeSBzcGFjZSAqLwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG9idGFpbiBtZW1vcnkgc3BhY2VcbiIpOwotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gZnJlZTsKLQl9Ci0KLQltZW0gPSBkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCWlmIChyZXMpIHsKKwkJbWVtID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKIAkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsIHJlcy0+bmFtZSk7Ci0JaWYgKCFtZW0pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlcXVlc3QgbWVtb3J5IHNwYWNlXG4iKTsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGZyZWU7CisJCWlmICghbWVtKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVxdWVzdCBtZW1vcnkgc3BhY2VcbiIpOworCQkJcmV0ID0gLUVOWElPOworCQkJZ290byBmcmVlOworCQl9CisKKwkJbmV0ZGV2LT5tZW1fc3RhcnQgPSBtZW0tPnN0YXJ0OworCQluZXRkZXYtPm1lbV9lbmQgICA9IG1lbS0+ZW5kOwogCX0KIAotCW5ldGRldi0+bWVtX3N0YXJ0ID0gbWVtLT5zdGFydDsKLQluZXRkZXYtPm1lbV9lbmQgICA9IG1lbS0+ZW5kOwogCiAJLyogb2J0YWluIGRldmljZSBJUlEgbnVtYmVyICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKQEAgLTkzMyw2ICs5NDIsNyBAQAogCS8qIHNldHVwIGRyaXZlci1wcml2YXRlIGRhdGEgKi8KIAlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlwcml2LT5uZXRkZXYgPSBuZXRkZXY7CisJcHJpdi0+ZG1hX2FsbG9jID0gMDsKIAogCXByaXYtPmlvYmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIG5ldGRldi0+YmFzZV9hZGRyLAogCQkJbW1pby0+ZW5kIC0gbW1pby0+c3RhcnQgKyAxKTsKQEAgLTk0MiwxMiArOTUyLDI3IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JcHJpdi0+bWVtYmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIG5ldGRldi0+bWVtX3N0YXJ0LAotCQkJbWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSk7Ci0JaWYgKCFwcml2LT5tZW1iYXNlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZW1hcCBtZW1vcnkgc3BhY2VcbiIpOwotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gZXJyb3I7CisJaWYgKG5ldGRldi0+bWVtX2VuZCkgeworCQlwcml2LT5tZW1iYXNlID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoJnBkZXYtPmRldiwKKwkJCW5ldGRldi0+bWVtX3N0YXJ0LCBtZW0tPmVuZCAtIG1lbS0+c3RhcnQgKyAxKTsKKwkJaWYgKCFwcml2LT5tZW1iYXNlKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVtYXAgbWVtb3J5IHNwYWNlXG4iKTsKKwkJCXJldCA9IC1FTlhJTzsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IGVsc2UgeworCQkvKiBBbGxvY2F0ZSBidWZmZXIgbWVtb3J5ICovCisJCXByaXYtPm1lbWJhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwKKwkJCWJ1ZmZlcl9zaXplLCAodm9pZCAqKSZuZXRkZXYtPm1lbV9zdGFydCwKKwkJCUdGUF9LRVJORUwpOworCQlpZiAoIXByaXYtPm1lbWJhc2UpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSAlZEIgYnVmZmVyXG4iLAorCQkJCWJ1ZmZlcl9zaXplKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCW5ldGRldi0+bWVtX2VuZCA9IG5ldGRldi0+bWVtX3N0YXJ0ICsgYnVmZmVyX3NpemU7CisJCXByaXYtPmRtYV9hbGxvYyA9IGJ1ZmZlcl9zaXplOwogCX0KIAogCS8qIEFsbG93IHRoZSBwbGF0Zm9ybSBzZXR1cCBjb2RlIHRvIHBhc3MgaW4gYSBNQUMgYWRkcmVzcy4gKi8KQEAgLTEwMzQsNiArMTA1OSw5IEBACiAJa2ZyZWUocHJpdi0+bWRpby0+aXJxKTsKIAltZGlvYnVzX2ZyZWUocHJpdi0+bWRpbyk7CiBmcmVlOgorCWlmIChwcml2LT5kbWFfYWxsb2MpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHByaXYtPmRtYV9hbGxvYywgcHJpdi0+bWVtYmFzZSwKKwkJCW5ldGRldi0+bWVtX3N0YXJ0KTsKIAlmcmVlX25ldGRldihuZXRkZXYpOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC0xMDU5LDcgKzEwODcsOSBAQAogCQkJa2ZyZWUocHJpdi0+bWRpby0+aXJxKTsKIAkJCW1kaW9idXNfZnJlZShwcml2LT5tZGlvKTsKIAkJfQotCisJCWlmIChwcml2LT5kbWFfYWxsb2MpCisJCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBwcml2LT5kbWFfYWxsb2MsIHByaXYtPm1lbWJhc2UsCisJCQkJbmV0ZGV2LT5tZW1fc3RhcnQpOwogCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCQlmcmVlX25ldGRldihuZXRkZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V3cmszLmMgYi9kcml2ZXJzL25ldC9ld3JrMy5jCmluZGV4IGIyYTVlYzguLmRkNGJhMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V3cmszLmMKKysrIGIvZHJpdmVycy9uZXQvZXdyazMuYwpAQCAtMTQ1LDYgKzE0NSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWMuYyBiL2RyaXZlcnMvbmV0L2ZlYy5jCmluZGV4IDI5MjM0MzguLjE2YTFkNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYy5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYy5jCkBAIC0xNjU0LDcgKzE2NTQsNyBAQAogICAqCiAgICogaW5kZXggaXMgb25seSB1c2VkIGluIGxlZ2FjeSBjb2RlCiAgICovCi1pbnQgX19pbml0IGZlY19lbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZGV4KQorc3RhdGljIGludCBmZWNfZW5ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgYnVmZGVzYyAqY2JkX2Jhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWNfbXBjNTJ4eC5jIGIvZHJpdmVycy9uZXQvZmVjX21wYzUyeHguYwppbmRleCBjNDAxMTNmLi42NmRhY2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mZWNfbXBjNTJ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4LmMKQEAgLTc1OSwxMiArNzU5LDYgQEAKIAogCW1wYzUyeHhfZmVjX2h3X2luaXQoZGV2KTsKIAotCWlmIChwcml2LT5waHlkZXYpIHsKLQkJcGh5X3N0b3AocHJpdi0+cGh5ZGV2KTsKLQkJcGh5X3dyaXRlKHByaXYtPnBoeWRldiwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOwotCQlwaHlfc3RhcnQocHJpdi0+cGh5ZGV2KTsKLQl9Ci0KIAliY29tX2ZlY19yeF9yZXNldChwcml2LT5yeF9kbWF0c2spOwogCWJjb21fZmVjX3R4X3Jlc2V0KHByaXYtPnR4X2RtYXRzayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4X3BoeS5jIGIvZHJpdmVycy9uZXQvZmVjX21wYzUyeHhfcGh5LmMKaW5kZXggMzFlNmQ2Mi4uZWUwZjNjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVjX21wYzUyeHhfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvZmVjX21wYzUyeHhfcGh5LmMKQEAgLTE1NSw2ICsxNTUsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAibXBjNTIwMGItZmVjLXBoeSIsIH0sCiAJe30KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtcGM1Mnh4X2ZlY19tZGlvX21hdGNoKTsKIAogc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBtcGM1Mnh4X2ZlY19tZGlvX2RyaXZlciA9IHsKIAkubmFtZSA9ICJtcGM1MjAwYi1mZWMtcGh5IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggMGExYzJiYi4uZTFkYTQ2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKaW5kZXggMmJjMmQyYi4uZWMyZjUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYworKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCkBAIC0xMTEwLDYgKzExMTAsNyBAQAogI2VuZGlmCiAJe30KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc19lbmV0X21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZnNfZW5ldF9kcml2ZXIgPSB7CiAJLm5hbWUJPSAiZnNfZW5ldCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L21paS1iaXRiYW5nLmMgYi9kcml2ZXJzL25ldC9mc19lbmV0L21paS1iaXRiYW5nLmMKaW5kZXggOTNiNDgxYi4uMjRmZjlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZnNfZW5ldC9taWktYml0YmFuZy5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWJpdGJhbmcuYwpAQCAtMjIxLDYgKzIyMSw3IEBACiAJfSwKIAl7fSwKIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc19lbmV0X21kaW9fYmJfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBmc19lbmV0X2JiX21kaW9fZHJpdmVyID0gewogCS5uYW1lID0gImZzbC1iYi1tZGlvIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWZlYy5jIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9taWktZmVjLmMKaW5kZXggYTJkNjljMS4uOTZlYmE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZnNfZW5ldC9taWktZmVjLmMKKysrIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9taWktZmVjLmMKQEAgLTIxOSw2ICsyMTksNyBAQAogI2VuZGlmCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZnNfZW5ldF9tZGlvX2ZlY19tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGZzX2VuZXRfZmVjX21kaW9fZHJpdmVyID0gewogCS5uYW1lID0gImZzbC1mZWMtbWRpbyIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc2xfcHFfbWRpby5jIGIvZHJpdmVycy9uZXQvZnNsX3BxX21kaW8uYwppbmRleCBkMTY3MDkwLi42YWM0NjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc2xfcHFfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzbF9wcV9tZGlvLmMKQEAgLTQwNyw2ICs0MDcsNyBAQAogCX0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZnNsX3BxX21kaW9fbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBmc2xfcHFfbWRpb19kcml2ZXIgPSB7CiAJLm5hbWUgPSAiZnNsLXBxX21kaW8iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCmluZGV4IDFlNTI4OWYuLjViZjMxZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKQEAgLTIzMjUsOSArMjMyNSw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KLU1PRFVMRV9BTElBUygicGxhdGZvcm06ZnNsLWdpYW5mYXIiKTsKLQogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZ2Zhcl9tYXRjaFtdID0KIHsKIAl7CkBAIC0yMzM2LDYgKzIzMzMsNyBAQAogCX0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZ2Zhcl9tYXRjaCk7CiAKIC8qIFN0cnVjdHVyZSBmb3IgYSBkZXZpY2UgZHJpdmVyICovCiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBnZmFyX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbWFjaGkuYyBiL2RyaXZlcnMvbmV0L2hhbWFjaGkuYwppbmRleCAxZDUwNjRhLi5mNzUxOWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1hY2hpLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCkBAIC0xNDUsNiArMTQ1LDcgQEAKIC8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KICNkZWZpbmUgVFhfVElNRU9VVCAgKDUqSFopCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fZXBwLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fZXBwLmMKaW5kZXggN2JjYWY3Yy4uZTM0NGM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX2VwcC5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9lcHAuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9mZHguYwppbmRleCBhYTQ0ODhlLi5lZDYwZmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfZmR4LmMKQEAgLTcxLDYgKzcxLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9oZHguYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfaGR4LmMKaW5kZXggODhjNTkzNS4uMTY4NmY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9oZHguYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2hkeC5jCkBAIC02MSw2ICs2MSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2hkbGNkcnYuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2hkbGNkcnYuYwppbmRleCAwMDEzYzQwLi45MWM1NzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jCkBAIC00Miw2ICs0Miw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKaW5kZXggMzNiNTVmNy4uZGI0YjdmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkJCX0KIAkJCWlmIChheC0+Y3JjbW9kZSAhPSBDUkNfTU9ERV9TTUFDSyAmJiBheC0+Y3JjYXV0bykgewogCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgICAgIm1raXNzOiAlczogU3dpdGNodGluZyB0byBjcmMtc21hY2tcbiIsCisJCQkJICAgICAgICJta2lzczogJXM6IFN3aXRjaGluZyB0byBjcmMtc21hY2tcbiIsCiAJCQkJICAgICAgIGF4LT5kZXYtPm5hbWUpOwogCQkJCWF4LT5jcmNtb2RlID0gQ1JDX01PREVfU01BQ0s7CiAJCQl9CkBAIC0yNzIsNyArMjcyLDcgQEAKIAkJCX0KIAkJCWlmIChheC0+Y3JjbW9kZSAhPSBDUkNfTU9ERV9GTEVYICYmIGF4LT5jcmNhdXRvKSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSAgICAgICAibWtpc3M6ICVzOiBTd2l0Y2h0aW5nIHRvIGNyYy1mbGV4bmV0XG4iLAorCQkJCSAgICAgICAibWtpc3M6ICVzOiBTd2l0Y2hpbmcgdG8gY3JjLWZsZXhuZXRcbiIsCiAJCQkJICAgICAgIGF4LT5kZXYtPm5hbWUpOwogCQkJCWF4LT5jcmNtb2RlID0gQ1JDX01PREVfRkxFWDsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwMTAwLmMgYi9kcml2ZXJzL25ldC9ocDEwMC5jCmluZGV4IGE5YTFhOTkuLmRkODY2NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvaHAxMDAuYwpAQCAtOTgsNiArOTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jCmluZGV4IDg5YzgyYzUuLjNmYWU4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTQ0Myw3ICs0NDQsNyBAQAogCQlyZXQgfD0gRU1BQ19NUjFfVEZTXzJLOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5rbm93biBSeCBGSUZPIHNpemUgJWRcbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmtub3duIFR4IEZJRk8gc2l6ZSAlZFxuIiwKIAkJICAgICAgIGRldi0+bmRldi0+bmFtZSwgdHhfc2l6ZSk7CiAJfQogCkBAIC00NzAsNiArNDcxLDkgQEAKIAlEQkcyKGRldiwgIl9fZW1hYzRfY2FsY19iYXNlX21yMSIgTkwpOwogCiAJc3dpdGNoKHR4X3NpemUpIHsKKwljYXNlIDE2Mzg0OgorCQlyZXQgfD0gRU1BQzRfTVIxX1RGU18xNks7CisJCWJyZWFrOwogCWNhc2UgNDA5NjoKIAkJcmV0IHw9IEVNQUM0X01SMV9URlNfNEs7CiAJCWJyZWFrOwpAQCAtNDc3LDcgKzQ4MSw3IEBACiAJCXJldCB8PSBFTUFDNF9NUjFfVEZTXzJLOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5rbm93biBSeCBGSUZPIHNpemUgJWRcbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmtub3duIFR4IEZJRk8gc2l6ZSAlZFxuIiwKIAkJICAgICAgIGRldi0+bmRldi0+bmFtZSwgdHhfc2l6ZSk7CiAJfQogCkBAIC0yOTg1LDYgKzI5ODksNyBAQAogCX0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZW1hY19tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGVtYWNfZHJpdmVyID0gewogCS5uYW1lID0gImVtYWMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvZW1hYy5oIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvZW1hYy5oCmluZGV4IDBhZmMyY2YuLmQzNGFkZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2VtYWMuaAorKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9lbWFjLmgKQEAgLTE1Myw2ICsxNTMsNyBAQAogI2RlZmluZSBFTUFDNF9NUjFfUkZTXzE2SwkJMHgwMDI4MDAwMAogI2RlZmluZSBFTUFDNF9NUjFfVEZTXzJLICAgICAgIAkJMHgwMDAyMDAwMAogI2RlZmluZSBFTUFDNF9NUjFfVEZTXzRLCQkweDAwMDMwMDAwCisjZGVmaW5lIEVNQUM0X01SMV9URlNfMTZLCQkweDAwMDUwMDAwCiAjZGVmaW5lIEVNQUM0X01SMV9UUgkJCTB4MDAwMDgwMDAKICNkZWZpbmUgRU1BQzRfTVIxX01XU1dfMDAxCQkweDAwMDAxMDAwCiAjZGVmaW5lIEVNQUM0X01SMV9KUFNNCQkJMHgwMDAwMDgwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWZiLmMgYi9kcml2ZXJzL25ldC9pZmIuYwppbmRleCA4MDFmMDg4Li4wMzA5MTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZmIuYworKysgYi9kcml2ZXJzL25ldC9pZmIuYwpAQCAtOTgsMTIgKzk4LDEzIEBACiAJCXN0YXRzLT50eF9wYWNrZXRzKys7CiAJCXN0YXRzLT50eF9ieXRlcyArPXNrYi0+bGVuOwogCi0JCXNrYi0+ZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KCZpbml0X25ldCwgc2tiLT5paWYpOworCQlza2ItPmRldiA9IGRldl9nZXRfYnlfaW5kZXgoJmluaXRfbmV0LCBza2ItPmlpZik7CiAJCWlmICghc2tiLT5kZXYpIHsKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCXN0YXRzLT50eF9kcm9wcGVkKys7CiAJCQlicmVhazsKIAkJfQorCQlkZXZfcHV0KHNrYi0+ZGV2KTsKIAkJc2tiLT5paWYgPSBfZGV2LT5pZmluZGV4OwogCiAJCWlmIChmcm9tICYgQVRfRUdSRVNTKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbWFjLmMgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbWFjLmMKaW5kZXggYTAyMzFjZC4uN2Q3NmJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9tYWMuYwpAQCAtMjg2LDQxICsyODYsNiBAQAogfQogCiAvKioKLSAqICBpZ2JfdXBkYXRlX21jX2FkZHJfbGlzdCAtIFVwZGF0ZSBNdWx0aWNhc3QgYWRkcmVzc2VzCi0gKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKLSAqICBAbWNfYWRkcl9saXN0OiBhcnJheSBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIHByb2dyYW0KLSAqICBAbWNfYWRkcl9jb3VudDogbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gcHJvZ3JhbQotICoKLSAqICBVcGRhdGVzIGVudGlyZSBNdWx0aWNhc3QgVGFibGUgQXJyYXkuCi0gKiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgYSBwYWNrZWQgbWNfYWRkcl9saXN0IG9mIG11bHRpY2FzdCBhZGRyZXNzZXMuCi0gKiovCi12b2lkIGlnYl91cGRhdGVfbWNfYWRkcl9saXN0KHN0cnVjdCBlMTAwMF9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICptY19hZGRyX2xpc3QsIHUzMiBtY19hZGRyX2NvdW50KQotewotCXUzMiBoYXNoX3ZhbHVlLCBoYXNoX2JpdCwgaGFzaF9yZWc7Ci0JaW50IGk7Ci0KLQkvKiBjbGVhciBtdGFfc2hhZG93ICovCi0JbWVtc2V0KCZody0+bWFjLm10YV9zaGFkb3csIDAsIHNpemVvZihody0+bWFjLm10YV9zaGFkb3cpKTsKLQotCS8qIHVwZGF0ZSBtdGFfc2hhZG93IGZyb20gbWNfYWRkcl9saXN0ICovCi0JZm9yIChpID0gMDsgKHUzMikgaSA8IG1jX2FkZHJfY291bnQ7IGkrKykgewotCQloYXNoX3ZhbHVlID0gaWdiX2hhc2hfbWNfYWRkcihodywgbWNfYWRkcl9saXN0KTsKLQotCQloYXNoX3JlZyA9IChoYXNoX3ZhbHVlID4+IDUpICYgKGh3LT5tYWMubXRhX3JlZ19jb3VudCAtIDEpOwotCQloYXNoX2JpdCA9IGhhc2hfdmFsdWUgJiAweDFGOwotCi0JCWh3LT5tYWMubXRhX3NoYWRvd1toYXNoX3JlZ10gfD0gKDEgPDwgaGFzaF9iaXQpOwotCQltY19hZGRyX2xpc3QgKz0gKEVUSF9BTEVOKTsKLQl9Ci0KLQkvKiByZXBsYWNlIHRoZSBlbnRpcmUgTVRBIHRhYmxlICovCi0JZm9yIChpID0gaHctPm1hYy5tdGFfcmVnX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JCWFycmF5X3dyMzIoRTEwMDBfTVRBLCBpLCBody0+bWFjLm10YV9zaGFkb3dbaV0pOwotCXdyZmwoKTsKLX0KLQotLyoqCiAgKiAgaWdiX2hhc2hfbWNfYWRkciAtIEdlbmVyYXRlIGEgbXVsdGljYXN0IGhhc2ggdmFsdWUKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBtY19hZGRyOiBwb2ludGVyIHRvIGEgbXVsdGljYXN0IGFkZHJlc3MKQEAgLTMyOSw3ICsyOTQsNyBAQAogICogIHRoZSBtdWx0aWNhc3QgZmlsdGVyIHRhYmxlIGFycmF5IGFkZHJlc3MgYW5kIG5ldyB0YWJsZSB2YWx1ZS4gIFNlZQogICogIGlnYl9tdGFfc2V0KCkKICAqKi8KLXUzMiBpZ2JfaGFzaF9tY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICptY19hZGRyKQorc3RhdGljIHUzMiBpZ2JfaGFzaF9tY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICptY19hZGRyKQogewogCXUzMiBoYXNoX3ZhbHVlLCBoYXNoX21hc2s7CiAJdTggYml0X3NoaWZ0ID0gMDsKQEAgLTM5Miw2ICszNTcsNDEgQEAKIH0KIAogLyoqCisgKiAgaWdiX3VwZGF0ZV9tY19hZGRyX2xpc3QgLSBVcGRhdGUgTXVsdGljYXN0IGFkZHJlc3NlcworICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG1jX2FkZHJfbGlzdDogYXJyYXkgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBwcm9ncmFtCisgKiAgQG1jX2FkZHJfY291bnQ6IG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIHByb2dyYW0KKyAqCisgKiAgVXBkYXRlcyBlbnRpcmUgTXVsdGljYXN0IFRhYmxlIEFycmF5LgorICogIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgcGFja2VkIG1jX2FkZHJfbGlzdCBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzLgorICoqLwordm9pZCBpZ2JfdXBkYXRlX21jX2FkZHJfbGlzdChzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqbWNfYWRkcl9saXN0LCB1MzIgbWNfYWRkcl9jb3VudCkKK3sKKwl1MzIgaGFzaF92YWx1ZSwgaGFzaF9iaXQsIGhhc2hfcmVnOworCWludCBpOworCisJLyogY2xlYXIgbXRhX3NoYWRvdyAqLworCW1lbXNldCgmaHctPm1hYy5tdGFfc2hhZG93LCAwLCBzaXplb2YoaHctPm1hYy5tdGFfc2hhZG93KSk7CisKKwkvKiB1cGRhdGUgbXRhX3NoYWRvdyBmcm9tIG1jX2FkZHJfbGlzdCAqLworCWZvciAoaSA9IDA7ICh1MzIpIGkgPCBtY19hZGRyX2NvdW50OyBpKyspIHsKKwkJaGFzaF92YWx1ZSA9IGlnYl9oYXNoX21jX2FkZHIoaHcsIG1jX2FkZHJfbGlzdCk7CisKKwkJaGFzaF9yZWcgPSAoaGFzaF92YWx1ZSA+PiA1KSAmIChody0+bWFjLm10YV9yZWdfY291bnQgLSAxKTsKKwkJaGFzaF9iaXQgPSBoYXNoX3ZhbHVlICYgMHgxRjsKKworCQlody0+bWFjLm10YV9zaGFkb3dbaGFzaF9yZWddIHw9ICgxIDw8IGhhc2hfYml0KTsKKwkJbWNfYWRkcl9saXN0ICs9IChFVEhfQUxFTik7CisJfQorCisJLyogcmVwbGFjZSB0aGUgZW50aXJlIE1UQSB0YWJsZSAqLworCWZvciAoaSA9IGh3LT5tYWMubXRhX3JlZ19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKQorCQlhcnJheV93cjMyKEUxMDAwX01UQSwgaSwgaHctPm1hYy5tdGFfc2hhZG93W2ldKTsKKwl3cmZsKCk7Cit9CisKKy8qKgogICogIGlnYl9jbGVhcl9od19jbnRyc19iYXNlIC0gQ2xlYXIgYmFzZSBoYXJkd2FyZSBjb3VudGVycwogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX21hYy5oIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX21hYy5oCmluZGV4IDc1MThhZjguLmJjYTE3ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9tYWMuaAorKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbWFjLmgKQEAgLTg4LDYgKzg4LDUgQEAKICNkZWZpbmUgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX1NUQVRVU19WTEFOICAgIDB4MgogCiBleHRlcm4gdm9pZCBlMTAwMF9pbml0X2Z1bmN0aW9uX3BvaW50ZXJzXzgyNTc1KHN0cnVjdCBlMTAwMF9odyAqaHcpOwotZXh0ZXJuIHUzMiBpZ2JfaGFzaF9tY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICptY19hZGRyKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvaWdiX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfZXRodG9vbC5jCmluZGV4IGQwMDRjMzUuLmIyNDNlZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfZXRodG9vbC5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgImlnYi5oIgogCkBAIC03MzEsNyArNzMyLDcgQEAKIHsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpZ2JfcmluZyAqdGVtcF9yaW5nOwotCWludCBpLCBlcnI7CisJaW50IGksIGVyciA9IDA7CiAJdTMyIG5ld19yeF9jb3VudCwgbmV3X3R4X2NvdW50OwogCiAJaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkKQEAgLTc1MSwxOCArNzUyLDMwIEBACiAJCXJldHVybiAwOwogCX0KIAorCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fSUdCX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKKwkJbXNsZWVwKDEpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKKwkJCWFkYXB0ZXItPnR4X3JpbmdbaV0uY291bnQgPSBuZXdfdHhfY291bnQ7CisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCisJCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmNvdW50ID0gbmV3X3J4X2NvdW50OworCQlhZGFwdGVyLT50eF9yaW5nX2NvdW50ID0gbmV3X3R4X2NvdW50OworCQlhZGFwdGVyLT5yeF9yaW5nX2NvdW50ID0gbmV3X3J4X2NvdW50OworCQlnb3RvIGNsZWFyX3Jlc2V0OworCX0KKwogCWlmIChhZGFwdGVyLT5udW1fdHhfcXVldWVzID4gYWRhcHRlci0+bnVtX3J4X3F1ZXVlcykKIAkJdGVtcF9yaW5nID0gdm1hbGxvYyhhZGFwdGVyLT5udW1fdHhfcXVldWVzICogc2l6ZW9mKHN0cnVjdCBpZ2JfcmluZykpOwogCWVsc2UKIAkJdGVtcF9yaW5nID0gdm1hbGxvYyhhZGFwdGVyLT5udW1fcnhfcXVldWVzICogc2l6ZW9mKHN0cnVjdCBpZ2JfcmluZykpOwotCWlmICghdGVtcF9yaW5nKQotCQlyZXR1cm4gLUVOT01FTTsKIAotCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fSUdCX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKLQkJbXNsZWVwKDEpOworCWlmICghdGVtcF9yaW5nKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gY2xlYXJfcmVzZXQ7CisJfQogCi0JaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKLQkJaWdiX2Rvd24oYWRhcHRlcik7CisJaWdiX2Rvd24oYWRhcHRlcik7CiAKIAkvKgogCSAqIFdlIGNhbid0IGp1c3QgZnJlZSBldmVyeXRoaW5nIGFuZCB0aGVuIHNldHVwIGFnYWluLApAQCAtODE5LDE0ICs4MzIsMTEgQEAKIAogCQlhZGFwdGVyLT5yeF9yaW5nX2NvdW50ID0gbmV3X3J4X2NvdW50OwogCX0KLQotCWVyciA9IDA7CiBlcnJfc2V0dXA6Ci0JaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKLQkJaWdiX3VwKGFkYXB0ZXIpOwotCi0JY2xlYXJfYml0KF9fSUdCX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKKwlpZ2JfdXAoYWRhcHRlcik7CiAJdmZyZWUodGVtcF9yaW5nKTsKK2NsZWFyX3Jlc2V0OgorCWNsZWFyX2JpdChfX0lHQl9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwppbmRleCA1ZDZjMTUzLi43MTRjM2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwpAQCAtMTI0NiwxMiArMTI0Niw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfcGNpX3JlZzsKIAotCWVyciA9IHBjaV9lbmFibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcocGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nIGZhaWxlZCAiCi0JCSAgICAgICAgIjB4JXhcbiIsIGVycik7Ci0JCS8qIG5vbi1mYXRhbCwgY29udGludWUgKi8KLQl9CisJcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwZGV2KTsKIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwpAQCAtMTYyOCw3ICsxNjIzLDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlpbnQgZXJyOwogCiAJLyogZmx1c2hfc2NoZWR1bGVkIHdvcmsgbWF5IHJlc2NoZWR1bGUgb3VyIHdhdGNoZG9nIHRhc2ssIHNvCiAJICogZXhwbGljaXRseSBkaXNhYmxlIHdhdGNoZG9nIHRhc2tzIGZyb20gYmVpbmcgcmVzY2hlZHVsZWQgICovCkBAIC0xNjgyLDEwICsxNjc2LDcgQEAKIAogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAKLQllcnIgPSBwY2lfZGlzYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwZGV2KTsKLQlpZiAoZXJyKQotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCSAgICAgICAgInBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nIGZhaWxlZCAweCV4XG4iLCBlcnIpOworCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdidmYvZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvaWdidmYvZXRodG9vbC5jCmluZGV4IGVlMTdhMDkuLmM2ODI2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYnZmL2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9pZ2J2Zi9ldGh0b29sLmMKQEAgLTI3OSw3ICsyNzksNyBAQAogewogCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaWdidmZfcmluZyAqdGVtcF9yaW5nOwotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAJdTMyIG5ld19yeF9jb3VudCwgbmV3X3R4X2NvdW50OwogCiAJaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkKQEAgLTI5OSwxNSArMjk5LDIyIEBACiAJCXJldHVybiAwOwogCX0KIAotCXRlbXBfcmluZyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZ2J2Zl9yaW5nKSk7Ci0JaWYgKCF0ZW1wX3JpbmcpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19JR0JWRl9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCW1zbGVlcCgxKTsKIAotCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpCi0JCWlnYnZmX2Rvd24oYWRhcHRlcik7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJYWRhcHRlci0+dHhfcmluZy0+Y291bnQgPSBuZXdfdHhfY291bnQ7CisJCWFkYXB0ZXItPnJ4X3JpbmctPmNvdW50ID0gbmV3X3J4X2NvdW50OworCQlnb3RvIGNsZWFyX3Jlc2V0OworCX0KKworCXRlbXBfcmluZyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZ2J2Zl9yaW5nKSk7CisJaWYgKCF0ZW1wX3JpbmcpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBjbGVhcl9yZXNldDsKKwl9CisKKwlpZ2J2Zl9kb3duKGFkYXB0ZXIpOwogCiAJLyoKIAkgKiBXZSBjYW4ndCBqdXN0IGZyZWUgZXZlcnl0aGluZyBhbmQgdGhlbiBzZXR1cCBhZ2FpbiwKQEAgLTMzOSwxNCArMzQ2LDExIEBACiAKIAkJbWVtY3B5KGFkYXB0ZXItPnJ4X3JpbmcsIHRlbXBfcmluZyxzaXplb2Yoc3RydWN0IGlnYnZmX3JpbmcpKTsKIAl9Ci0KLQllcnIgPSAwOwogZXJyX3NldHVwOgotCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpCi0JCWlnYnZmX3VwKGFkYXB0ZXIpOwotCi0JY2xlYXJfYml0KF9fSUdCVkZfUkVTRVRUSU5HLCAmYWRhcHRlci0+c3RhdGUpOworCWlnYnZmX3VwKGFkYXB0ZXIpOwogCXZmcmVlKHRlbXBfcmluZyk7CitjbGVhcl9yZXNldDoKKwljbGVhcl9iaXQoX19JR0JWRl9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9raW5nc3VuLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9raW5nc3VuLXNpci5jCmluZGV4IDJmYzMwYjQuLmNiOTBkNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEva2luZ3N1bi1zaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2tpbmdzdW4tc2lyLmMKQEAgLTY2LDcgKzY2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2tzOTU5LXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9rczk1OS1zaXIuYwppbmRleCBmNGQxM2ZjLi5iNTRkM2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2tzOTU5LXNpci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEva3M5NTktc2lyLmMKQEAgLTExOCw3ICsxMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEva3NkYXp6bGUtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2tzZGF6emxlLXNpci5jCmluZGV4IDVmOWQ3MzMuLjhkNzEzZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEva3NkYXp6bGUtc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9rc2RhenpsZS1zaXIuYwpAQCAtODIsNyArODIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jIGIvZHJpdmVycy9uZXQvaXJkYS9tY3M3NzgwLmMKaW5kZXggYjNkMzBiYy4uYzBlMGJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9tY3M3NzgwLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9tY3M3NzgwLmMKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCmluZGV4IDE0NDVlNTguLjg0ZGIxNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KQEAgLTE2Myw2ICsxNjQsMjIgQEAKIH0KIAogLyoKKyAqIFNldCB0aGUgSXJEQSBjb21tdW5pY2F0aW9ucyBtb2RlLgorICovCitzdGF0aWMgdm9pZCBweGFfaXJkYV9zZXRfbW9kZShzdHJ1Y3QgcHhhX2lyZGEgKnNpLCBpbnQgbW9kZSkKK3sKKwlpZiAoc2ktPnBkYXRhLT50cmFuc2NlaXZlcl9tb2RlKQorCQlzaS0+cGRhdGEtPnRyYW5zY2VpdmVyX21vZGUoc2ktPmRldiwgbW9kZSk7CisJZWxzZSB7CisJCWlmIChncGlvX2lzX3ZhbGlkKHNpLT5wZGF0YS0+Z3Bpb19wd2Rvd24pKQorCQkJZ3Bpb19zZXRfdmFsdWUoc2ktPnBkYXRhLT5ncGlvX3B3ZG93biwKKwkJCQkJIShtb2RlICYgSVJfT0ZGKSBeCisJCQkJCSFzaS0+cGRhdGEtPmdwaW9fcHdkb3duX2ludmVydGVkKTsKKwkJcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoc2ktPmRldiwgbW9kZSk7CisJfQorfQorCisvKgogICogU2V0IHRoZSBJckRBIGNvbW11bmljYXRpb25zIHNwZWVkLgogICovCiBzdGF0aWMgaW50IHB4YV9pcmRhX3NldF9zcGVlZChzdHJ1Y3QgcHhhX2lyZGEgKnNpLCBpbnQgc3BlZWQpCkBAIC0xODgsNyArMjA1LDcgQEAKIAkJCXB4YV9pcmRhX2Rpc2FibGVfY2xrKHNpKTsKIAogCQkJLyogc2V0IGJvYXJkIHRyYW5zY2VpdmVyIHRvIFNJUiBtb2RlICovCi0JCQlzaS0+cGRhdGEtPnRyYW5zY2VpdmVyX21vZGUoc2ktPmRldiwgSVJfU0lSTU9ERSk7CisJCQlweGFfaXJkYV9zZXRfbW9kZShzaSwgSVJfU0lSTU9ERSk7CiAKIAkJCS8qIGVuYWJsZSB0aGUgU1RVQVJUIGNsb2NrICovCiAJCQlweGFfaXJkYV9lbmFibGVfc2lyY2xrKHNpKTsKQEAgLTIyMiw3ICsyMzksNyBAQAogCQlJQ0NSMCA9IDA7CiAKIAkJLyogc2V0IGJvYXJkIHRyYW5zY2VpdmVyIHRvIEZJUiBtb2RlICovCi0JCXNpLT5wZGF0YS0+dHJhbnNjZWl2ZXJfbW9kZShzaS0+ZGV2LCBJUl9GSVJNT0RFKTsKKwkJcHhhX2lyZGFfc2V0X21vZGUoc2ksIElSX0ZJUk1PREUpOwogCiAJCS8qIGVuYWJsZSB0aGUgRklDUCBjbG9jayAqLwogCQlweGFfaXJkYV9lbmFibGVfZmlyY2xrKHNpKTsKQEAgLTY0MSw3ICs2NTgsNyBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCS8qIHBvd2VyIG9mZiBib2FyZCB0cmFuc2NlaXZlciAqLwotCXNpLT5wZGF0YS0+dHJhbnNjZWl2ZXJfbW9kZShzaS0+ZGV2LCBJUl9PRkYpOworCXB4YV9pcmRhX3NldF9tb2RlKHNpLCBJUl9PRkYpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgInB4YV9pcjogaXJkYSBzaHV0ZG93blxuIik7CiB9CkBAIC04NDksMTAgKzg2NiwyNiBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX21lbV81OwogCi0JaWYgKHNpLT5wZGF0YS0+c3RhcnR1cCkKKwlpZiAoZ3Bpb19pc192YWxpZChzaS0+cGRhdGEtPmdwaW9fcHdkb3duKSkgeworCQllcnIgPSBncGlvX3JlcXVlc3Qoc2ktPnBkYXRhLT5ncGlvX3B3ZG93biwgIklyREEgc3dpdGNoIik7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9zdGFydHVwOworCQllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoc2ktPnBkYXRhLT5ncGlvX3B3ZG93biwKKwkJCQkJIXNpLT5wZGF0YS0+Z3Bpb19wd2Rvd25faW52ZXJ0ZWQpOworCQlpZiAoZXJyKSB7CisJCQlncGlvX2ZyZWUoc2ktPnBkYXRhLT5ncGlvX3B3ZG93bik7CisJCQlnb3RvIGVycl9zdGFydHVwOworCQl9CisJfQorCisJaWYgKHNpLT5wZGF0YS0+c3RhcnR1cCkgewogCQllcnIgPSBzaS0+cGRhdGEtPnN0YXJ0dXAoc2ktPmRldik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfc3RhcnR1cDsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3N0YXJ0dXA7CisJfQorCisJaWYgKGdwaW9faXNfdmFsaWQoc2ktPnBkYXRhLT5ncGlvX3B3ZG93bikgJiYgc2ktPnBkYXRhLT5zdGFydHVwKQorCQlkZXZfd2FybihzaS0+ZGV2LCAiZ3Bpb19wd2Rvd24gYW5kIHN0YXJ0dXAoKSBib3RoIGRlZmluZWQhXG4iKTsKIAogCWRldi0+bmV0ZGV2X29wcyA9ICZweGFfaXJkYV9uZXRkZXZfb3BzOwogCkBAIC05MDMsNiArOTM2LDggQEAKIAlpZiAoZGV2KSB7CiAJCXN0cnVjdCBweGFfaXJkYSAqc2kgPSBuZXRkZXZfcHJpdihkZXYpOwogCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpZiAoZ3Bpb19pc192YWxpZChzaS0+cGRhdGEtPmdwaW9fcHdkb3duKSkKKwkJCWdwaW9fZnJlZShzaS0+cGRhdGEtPmdwaW9fcHdkb3duKTsKIAkJaWYgKHNpLT5wZGF0YS0+c2h1dGRvd24pCiAJCQlzaS0+cGRhdGEtPnNodXRkb3duKHNpLT5kZXYpOwogCQlrZnJlZShzaS0+dHhfYnVmZi5oZWFkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCmluZGV4IDM4YmY3Y2YuLmM0MTJlODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYwpAQCAtMjMyLDggKzIzMiwxMSBAQAogCS8qCiAJICogRW5zdXJlIHRoYXQgdGhlIHBvcnRzIGZvciB0aGlzIGRldmljZSBhcmUgc2V0dXAgY29ycmVjdGx5LgogCSAqLwotCWlmIChzaS0+cGRhdGEtPnN0YXJ0dXApCi0JCXNpLT5wZGF0YS0+c3RhcnR1cChzaS0+ZGV2KTsKKwlpZiAoc2ktPnBkYXRhLT5zdGFydHVwKQl7CisJCXJldCA9IHNpLT5wZGF0YS0+c3RhcnR1cChzaS0+ZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJLyoKIAkgKiBDb25maWd1cmUgUFBDIGZvciBJUkRBIC0gd2Ugd2FudCB0byBkcml2ZSBUWEQyIGxvdy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdG9pbTMyMzItc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3RvaW0zMjMyLXNpci5jCmluZGV4IGZjZjI4N2IuLjk5ZTFlYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdG9pbTMyMzItc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS90b2ltMzIzMi1zaXIuYwpAQCAtMTIwLDYgKzEyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwppbmRleCBlMzZlOTUxLi5hYTcyODZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYworKysgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAJCQkgICBjbngtPnJlbW90ZV9scCk7CiAJfSBlbHNlIHsKIAkJbWVtY3B5KCZjbngtPmNhcF9hY2tfZXZlbnQsIGV2ZW50LAotCQkgICAgICAgc2l6ZW9mKCZjbngtPmNhcF9hY2tfZXZlbnQpKTsKKwkJICAgICAgIHNpemVvZihjbngtPmNhcF9hY2tfZXZlbnQpKTsKIAkJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX0dPVENBUEFDSzsKIAkJdmV0aF9raWNrX3N0YXRlbWFjaGluZShjbngpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlLmggYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZS5oCmluZGV4IGRkNjg4ZDQuLjM4NWJlNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlLmgKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmUuaApAQCAtMjY3LDcgKzI2Nyw4IEBACiAJZW51bSBpeGdiZV9mY19tb2RlIGxhc3RfbGZjX21vZGU7CiAKIAkvKiBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZSAqLwotCXUzMiBpdHJfc2V0dGluZzsKKwl1MzIgcnhfaXRyX3NldHRpbmc7CisJdTMyIHR4X2l0cl9zZXR0aW5nOwogCXUxNiBlaXRyX2xvdzsKIAl1MTYgZWl0cl9oaWdoOwogCkBAIC0zNTEsNyArMzUyLDggQEAKIAlzdHJ1Y3QgaXhnYmVfaHdfc3RhdHMgc3RhdHM7CiAKIAkvKiBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZSAqLwotCXUzMiBlaXRyX3BhcmFtOworCXUzMiByeF9laXRyX3BhcmFtOworCXUzMiB0eF9laXRyX3BhcmFtOwogCiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKIAl1NjQgdHhfYnVzeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk4LmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OC5jCmluZGV4IDU2YjEyZjMuLmUyZDUzNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk4LmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTguYwpAQCAtNDI1LDcgKzQyNSw3IEBACiAjZW5kaWYgLyogQ09ORklHX0RDQiAqLwogCWRlZmF1bHQ6CiAJCWh3X2RiZyhodywgIkZsb3cgY29udHJvbCBwYXJhbSBzZXQgaW5jb3JyZWN0bHlcbiIpOwotCQlyZXRfdmFsID0gLUlYR0JFX0VSUl9DT05GSUc7CisJCXJldF92YWwgPSBJWEdCRV9FUlJfQ09ORklHOwogCQlnb3RvIG91dDsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTkuYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk5LmMKaW5kZXggMmVjNThkYy4uMzRiMDQ5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTkuYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OS5jCkBAIC0zMzAsNiArMzMwLDggQEAKIAogCXN3aXRjaCAoaHctPmRldmljZV9pZCkgewogCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk5X0tYNDoKKwljYXNlIElYR0JFX0RFVl9JRF84MjU5OV9LWDRfTUVaWjoKKwljYXNlIElYR0JFX0RFVl9JRF84MjU5OV9DT01CT19CQUNLUExBTkU6CiAJY2FzZSBJWEdCRV9ERVZfSURfODI1OTlfWEFVSV9MT006CiAJCS8qIERlZmF1bHQgZGV2aWNlIElEIGlzIG1lenphbmluZSBjYXJkIEtYL0tYNCAqLwogCQltZWRpYV90eXBlID0gaXhnYmVfbWVkaWFfdHlwZV9iYWNrcGxhbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2NvbW1vbi5jCmluZGV4IDY2MjFlMTcuLjQwZmYxMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2NvbW1vbi5jCkBAIC0xMzU1LDkgKzEzNTUsNyBAQAogLyoqCiAgKiAgaXhnYmVfdXBkYXRlX3VjX2FkZHJfbGlzdF9nZW5lcmljIC0gVXBkYXRlcyBNQUMgbGlzdCBvZiBzZWNvbmRhcnkgYWRkcmVzc2VzCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQotICogIEBhZGRyX2xpc3Q6IHRoZSBsaXN0IG9mIG5ldyBhZGRyZXNzZXMKLSAqICBAYWRkcl9jb3VudDogbnVtYmVyIG9mIGFkZHJlc3NlcwotICogIEBuZXh0OiBpdGVyYXRvciBmdW5jdGlvbiB0byB3YWxrIHRoZSBhZGRyZXNzIGxpc3QKKyAqICBAdWNfbGlzdDogdGhlIGxpc3Qgb2YgbmV3IGFkZHJlc3NlcwogICoKICAqICBUaGUgZ2l2ZW4gbGlzdCByZXBsYWNlcyBhbnkgZXhpc3RpbmcgbGlzdC4gIENsZWFycyB0aGUgc2Vjb25kYXJ5IGFkZHJzIGZyb20KICAqICByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXJzLiAgVXNlcyB1bnVzZWQgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycyBmb3IgdGhlCkBAIC0xNjYzLDcgKzE2NjEsNyBAQAogI2VuZGlmIC8qIENPTkZJR19EQ0IgKi8KIAlkZWZhdWx0OgogCQlod19kYmcoaHcsICJGbG93IGNvbnRyb2wgcGFyYW0gc2V0IGluY29ycmVjdGx5XG4iKTsKLQkJcmV0X3ZhbCA9IC1JWEdCRV9FUlJfQ09ORklHOworCQlyZXRfdmFsID0gSVhHQkVfRVJSX0NPTkZJRzsKIAkJZ290byBvdXQ7CiAJCWJyZWFrOwogCX0KQEAgLTE3MzQsNzUgKzE3MzIsMTQwIEBACiAJczMyIHJldF92YWwgPSAwOwogCWl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQ7CiAJdTMyIHBjc19hbmFkdl9yZWcsIHBjc19scGFiX3JlZywgbGlua3N0YXQ7CisJdTMyIGxpbmtzMiwgYW5scDFfcmVnLCBhdXRvY19yZWcsIGxpbmtzOwogCWJvb2wgbGlua191cDsKIAogCS8qCiAJICogQU4gc2hvdWxkIGhhdmUgY29tcGxldGVkIHdoZW4gdGhlIGNhYmxlIHdhcyBwbHVnZ2VkIGluLgogCSAqIExvb2sgZm9yIHJlYXNvbnMgdG8gYmFpbCBvdXQuICBCYWlsIG91dCBpZjoKIAkgKiAtIEZDIGF1dG9uZWcgaXMgZGlzYWJsZWQsIG9yIGlmCi0JICogLSB3ZSBkb24ndCBoYXZlIG11bHRpc3BlZWQgZmliZXIsIG9yIGlmCi0JICogLSB3ZSdyZSBub3QgcnVubmluZyBhdCAxRywgb3IgaWYKLQkgKiAtIGxpbmsgaXMgbm90IHVwLCBvciBpZgotCSAqIC0gbGluayBpcyB1cCBidXQgQU4gZGlkIG5vdCBjb21wbGV0ZSwgb3IgaWYKLQkgKiAtIGxpbmsgaXMgdXAgYW5kIEFOIGNvbXBsZXRlZCBidXQgdGltZWQgb3V0CisJICogLSBsaW5rIGlzIG5vdCB1cC4KIAkgKgotCSAqIFNpbmNlIHdlJ3JlIGJlaW5nIGNhbGxlZCBmcm9tIGFuIExTQywgbGluayBpcyBhbHJlYWR5IGtub3cgdG8gYmUgdXAuCisJICogU2luY2Ugd2UncmUgYmVpbmcgY2FsbGVkIGZyb20gYW4gTFNDLCBsaW5rIGlzIGFscmVhZHkga25vd24gdG8gYmUgdXAuCiAJICogU28gdXNlIGxpbmtfdXBfd2FpdF90b19jb21wbGV0ZT1mYWxzZS4KIAkgKi8KIAlody0+bWFjLm9wcy5jaGVja19saW5rKGh3LCAmc3BlZWQsICZsaW5rX3VwLCBmYWxzZSk7Ci0JbGlua3N0YXQgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUENTMUdMU1RBKTsKIAotCWlmIChody0+ZmMuZGlzYWJsZV9mY19hdXRvbmVnIHx8Ci0JICAgICFody0+cGh5Lm11bHRpc3BlZWRfZmliZXIgfHwKLQkgICAgKHNwZWVkICE9IElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwpIHx8Ci0JICAgICFsaW5rX3VwIHx8Ci0JICAgICgobGlua3N0YXQgJiBJWEdCRV9QQ1MxR0xTVEFfQU5fQ09NUExFVEUpID09IDApIHx8Ci0JICAgICgobGlua3N0YXQgJiBJWEdCRV9QQ1MxR0xTVEFfQU5fVElNRURfT1VUKSA9PSAxKSkgeworCWlmIChody0+ZmMuZGlzYWJsZV9mY19hdXRvbmVnIHx8ICghbGlua191cCkpIHsKIAkJaHctPmZjLmZjX3dhc19hdXRvbmVnZ2VkID0gZmFsc2U7CiAJCWh3LT5mYy5jdXJyZW50X21vZGUgPSBody0+ZmMucmVxdWVzdGVkX21vZGU7Ci0JCWh3X2RiZyhodywgIkF1dG9uZWcgRkMgd2FzIHNraXBwZWQuXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJLyoKKwkgKiBPbiBiYWNrcGxhbmUsIGJhaWwgb3V0IGlmCisJICogLSBiYWNrcGxhbmUgYXV0b25lZyB3YXMgbm90IGNvbXBsZXRlZCwgb3IgaWYKKwkgKiAtIGxpbmsgcGFydG5lciBpcyBub3QgQU4gZW5hYmxlZAorCSAqLworCWlmIChody0+cGh5Lm1lZGlhX3R5cGUgPT0gaXhnYmVfbWVkaWFfdHlwZV9iYWNrcGxhbmUpIHsKKwkJbGlua3MgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTElOS1MpOworCQlsaW5rczIgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTElOS1MyKTsKKwkJaWYgKCgobGlua3MgJiBJWEdCRV9MSU5LU19LWF9BTl9DT01QKSA9PSAwKSB8fAorCQkgICAgKChsaW5rczIgJiBJWEdCRV9MSU5LUzJfQU5fU1VQUE9SVEVEKSA9PSAwKSkgeworCQkJaHctPmZjLmZjX3dhc19hdXRvbmVnZ2VkID0gZmFsc2U7CisJCQlody0+ZmMuY3VycmVudF9tb2RlID0gaHctPmZjLnJlcXVlc3RlZF9tb2RlOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIE9uIG11bHRpc3BlZWQgZmliZXIgYXQgMWcsIGJhaWwgb3V0IGlmCisJICogLSBsaW5rIGlzIHVwIGJ1dCBBTiBkaWQgbm90IGNvbXBsZXRlLCBvciBpZgorCSAqIC0gbGluayBpcyB1cCBhbmQgQU4gY29tcGxldGVkIGJ1dCB0aW1lZCBvdXQKKwkgKi8KKwlpZiAoaHctPnBoeS5tdWx0aXNwZWVkX2ZpYmVyICYmIChzcGVlZCA9PSBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMKSkgeworCQlsaW5rc3RhdCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9QQ1MxR0xTVEEpOworCQlpZiAoKChsaW5rc3RhdCAmIElYR0JFX1BDUzFHTFNUQV9BTl9DT01QTEVURSkgPT0gMCkgfHwKKwkJICAgICgobGlua3N0YXQgJiBJWEdCRV9QQ1MxR0xTVEFfQU5fVElNRURfT1VUKSA9PSAxKSkgeworCQkJaHctPmZjLmZjX3dhc19hdXRvbmVnZ2VkID0gZmFsc2U7CisJCQlody0+ZmMuY3VycmVudF9tb2RlID0gaHctPmZjLnJlcXVlc3RlZF9tb2RlOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKgogCSAqIFJlYWQgdGhlIEFOIGFkdmVydGlzZW1lbnQgYW5kIExQIGFiaWxpdHkgcmVnaXN0ZXJzIGFuZCByZXNvbHZlCiAJICogbG9jYWwgZmxvdyBjb250cm9sIHNldHRpbmdzIGFjY29yZGluZ2x5CiAJICovCi0JcGNzX2FuYWR2X3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9QQ1MxR0FOQSk7Ci0JcGNzX2xwYWJfcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1BDUzFHQU5MUCk7Ci0JaWYgKChwY3NfYW5hZHZfcmVnICYgSVhHQkVfUENTMUdBTkFfU1lNX1BBVVNFKSAmJgotCQkocGNzX2xwYWJfcmVnICYgSVhHQkVfUENTMUdBTkFfU1lNX1BBVVNFKSkgewotCQkvKgotCQkgKiBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgdXNlciBzZWxlY3RlZCBSeCBPTkxZCi0JCSAqIG9mIHBhdXNlIGZyYW1lcy4gIEluIHRoaXMgY2FzZSwgd2UgaGFkIHRvIGFkdmVydGlzZQotCQkgKiBGVUxMIGZsb3cgY29udHJvbCBiZWNhdXNlIHdlIGNvdWxkIG5vdCBhZHZlcnRpc2UgUlgKLQkJICogT05MWS4gSGVuY2UsIHdlIG11c3Qgbm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvCi0JCSAqIHR1cm4gT0ZGIHRoZSBUUkFOU01JU1NJT04gb2YgUEFVU0UgZnJhbWVzLgotCQkgKi8KLQkJaWYgKGh3LT5mYy5yZXF1ZXN0ZWRfbW9kZSA9PSBpeGdiZV9mY19mdWxsKSB7Ci0JCQlody0+ZmMuY3VycmVudF9tb2RlID0gaXhnYmVfZmNfZnVsbDsKLQkJCWh3X2RiZyhodywgIkZsb3cgQ29udHJvbCA9IEZVTEwuXG4iKTsKLQkJfSBlbHNlIHsKKwlpZiAoKHNwZWVkID09IElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwpICYmCisJICAgIChody0+cGh5Lm1lZGlhX3R5cGUgIT0gaXhnYmVfbWVkaWFfdHlwZV9iYWNrcGxhbmUpKSB7CisJCXBjc19hbmFkdl9yZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUENTMUdBTkEpOworCQlwY3NfbHBhYl9yZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUENTMUdBTkxQKTsKKwkJaWYgKChwY3NfYW5hZHZfcmVnICYgSVhHQkVfUENTMUdBTkFfU1lNX1BBVVNFKSAmJgorCQkgICAgKHBjc19scGFiX3JlZyAmIElYR0JFX1BDUzFHQU5BX1NZTV9QQVVTRSkpIHsKKwkJCS8qCisJCQkgKiBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgdXNlciBzZWxlY3RlZCBSeCBPTkxZCisJCQkgKiBvZiBwYXVzZSBmcmFtZXMuICBJbiB0aGlzIGNhc2UsIHdlIGhhZCB0byBhZHZlcnRpc2UKKwkJCSAqIEZVTEwgZmxvdyBjb250cm9sIGJlY2F1c2Ugd2UgY291bGQgbm90IGFkdmVydGlzZSBSWAorCQkJICogT05MWS4gSGVuY2UsIHdlIG11c3Qgbm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvCisJCQkgKiB0dXJuIE9GRiB0aGUgVFJBTlNNSVNTSU9OIG9mIFBBVVNFIGZyYW1lcy4KKwkJCSAqLworCQkJaWYgKGh3LT5mYy5yZXF1ZXN0ZWRfbW9kZSA9PSBpeGdiZV9mY19mdWxsKSB7CisJCQkJaHctPmZjLmN1cnJlbnRfbW9kZSA9IGl4Z2JlX2ZjX2Z1bGw7CisJCQkJaHdfZGJnKGh3LCAiRmxvdyBDb250cm9sID0gRlVMTC5cbiIpOworCQkJfSBlbHNlIHsKKwkJCQlody0+ZmMuY3VycmVudF9tb2RlID0gaXhnYmVfZmNfcnhfcGF1c2U7CisJCQkJaHdfZGJnKGh3LCAiRmxvdyBDb250cm9sPVJYIFBBVVNFIG9ubHlcbiIpOworCQkJfQorCQl9IGVsc2UgaWYgKCEocGNzX2FuYWR2X3JlZyAmIElYR0JFX1BDUzFHQU5BX1NZTV9QQVVTRSkgJiYKKwkJCSAgIChwY3NfYW5hZHZfcmVnICYgSVhHQkVfUENTMUdBTkFfQVNNX1BBVVNFKSAmJgorCQkJICAgKHBjc19scGFiX3JlZyAmIElYR0JFX1BDUzFHQU5BX1NZTV9QQVVTRSkgJiYKKwkJCSAgIChwY3NfbHBhYl9yZWcgJiBJWEdCRV9QQ1MxR0FOQV9BU01fUEFVU0UpKSB7CisJCQlody0+ZmMuY3VycmVudF9tb2RlID0gaXhnYmVfZmNfdHhfcGF1c2U7CisJCQlod19kYmcoaHcsICJGbG93IENvbnRyb2wgPSBUWCBQQVVTRSBmcmFtZXMgb25seS5cbiIpOworCQl9IGVsc2UgaWYgKChwY3NfYW5hZHZfcmVnICYgSVhHQkVfUENTMUdBTkFfU1lNX1BBVVNFKSAmJgorCQkJICAgKHBjc19hbmFkdl9yZWcgJiBJWEdCRV9QQ1MxR0FOQV9BU01fUEFVU0UpICYmCisJCQkgICAhKHBjc19scGFiX3JlZyAmIElYR0JFX1BDUzFHQU5BX1NZTV9QQVVTRSkgJiYKKwkJCSAgIChwY3NfbHBhYl9yZWcgJiBJWEdCRV9QQ1MxR0FOQV9BU01fUEFVU0UpKSB7CiAJCQlody0+ZmMuY3VycmVudF9tb2RlID0gaXhnYmVfZmNfcnhfcGF1c2U7CiAJCQlod19kYmcoaHcsICJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cbiIpOworCQl9IGVsc2UgeworCQkJaHctPmZjLmN1cnJlbnRfbW9kZSA9IGl4Z2JlX2ZjX25vbmU7CisJCQlod19kYmcoaHcsICJGbG93IENvbnRyb2wgPSBOT05FLlxuIik7CiAJCX0KLQl9IGVsc2UgaWYgKCEocGNzX2FuYWR2X3JlZyAmIElYR0JFX1BDUzFHQU5BX1NZTV9QQVVTRSkgJiYKLQkJICAgKHBjc19hbmFkdl9yZWcgJiBJWEdCRV9QQ1MxR0FOQV9BU01fUEFVU0UpICYmCi0JCSAgIChwY3NfbHBhYl9yZWcgJiBJWEdCRV9QQ1MxR0FOQV9TWU1fUEFVU0UpICYmCi0JCSAgIChwY3NfbHBhYl9yZWcgJiBJWEdCRV9QQ1MxR0FOQV9BU01fUEFVU0UpKSB7Ci0JCWh3LT5mYy5jdXJyZW50X21vZGUgPSBpeGdiZV9mY190eF9wYXVzZTsKLQkJaHdfZGJnKGh3LCAiRmxvdyBDb250cm9sID0gVFggUEFVU0UgZnJhbWVzIG9ubHkuXG4iKTsKLQl9IGVsc2UgaWYgKChwY3NfYW5hZHZfcmVnICYgSVhHQkVfUENTMUdBTkFfU1lNX1BBVVNFKSAmJgotCQkgICAocGNzX2FuYWR2X3JlZyAmIElYR0JFX1BDUzFHQU5BX0FTTV9QQVVTRSkgJiYKLQkJICAgIShwY3NfbHBhYl9yZWcgJiBJWEdCRV9QQ1MxR0FOQV9TWU1fUEFVU0UpICYmCi0JCSAgIChwY3NfbHBhYl9yZWcgJiBJWEdCRV9QQ1MxR0FOQV9BU01fUEFVU0UpKSB7Ci0JCWh3LT5mYy5jdXJyZW50X21vZGUgPSBpeGdiZV9mY19yeF9wYXVzZTsKLQkJaHdfZGJnKGh3LCAiRmxvdyBDb250cm9sID0gUlggUEFVU0UgZnJhbWVzIG9ubHkuXG4iKTsKLQl9IGVsc2UgewotCQlody0+ZmMuY3VycmVudF9tb2RlID0gaXhnYmVfZmNfbm9uZTsKLQkJaHdfZGJnKGh3LCAiRmxvdyBDb250cm9sID0gTk9ORS5cbiIpOwogCX0KIAorCWlmIChody0+cGh5Lm1lZGlhX3R5cGUgPT0gaXhnYmVfbWVkaWFfdHlwZV9iYWNrcGxhbmUpIHsKKwkJLyoKKwkJICogUmVhZCB0aGUgMTBnIEFOIGF1dG9jIGFuZCBMUCBhYmlsaXR5IHJlZ2lzdGVycyBhbmQgcmVzb2x2ZQorCQkgKiBsb2NhbCBmbG93IGNvbnRyb2wgc2V0dGluZ3MgYWNjb3JkaW5nbHkKKwkJICovCisJCWF1dG9jX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9BVVRPQyk7CisJCWFubHAxX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9BTkxQMSk7CisKKwkJaWYgKChhdXRvY19yZWcgJiBJWEdCRV9BVVRPQ19TWU1fUEFVU0UpICYmCisJCSAgICAoYW5scDFfcmVnICYgSVhHQkVfQU5MUDFfU1lNX1BBVVNFKSkgeworCQkJLyoKKwkJCSAqIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSB1c2VyIHNlbGVjdGVkIFJ4IE9OTFkKKwkJCSAqIG9mIHBhdXNlIGZyYW1lcy4gIEluIHRoaXMgY2FzZSwgd2UgaGFkIHRvIGFkdmVydGlzZQorCQkJICogRlVMTCBmbG93IGNvbnRyb2wgYmVjYXVzZSB3ZSBjb3VsZCBub3QgYWR2ZXJ0aXNlIFJYCisJCQkgKiBPTkxZLiBIZW5jZSwgd2UgbXVzdCBub3cgY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8KKwkJCSAqIHR1cm4gT0ZGIHRoZSBUUkFOU01JU1NJT04gb2YgUEFVU0UgZnJhbWVzLgorCQkJICovCisJCQlpZiAoaHctPmZjLnJlcXVlc3RlZF9tb2RlID09IGl4Z2JlX2ZjX2Z1bGwpIHsKKwkJCQlody0+ZmMuY3VycmVudF9tb2RlID0gaXhnYmVfZmNfZnVsbDsKKwkJCQlod19kYmcoaHcsICJGbG93IENvbnRyb2wgPSBGVUxMLlxuIik7CisJCQl9IGVsc2UgeworCQkJCWh3LT5mYy5jdXJyZW50X21vZGUgPSBpeGdiZV9mY19yeF9wYXVzZTsKKwkJCQlod19kYmcoaHcsICJGbG93IENvbnRyb2w9UlggUEFVU0Ugb25seVxuIik7CisJCQl9CisJCX0gZWxzZSBpZiAoIShhdXRvY19yZWcgJiBJWEdCRV9BVVRPQ19TWU1fUEFVU0UpICYmCisJCQkgICAoYXV0b2NfcmVnICYgSVhHQkVfQVVUT0NfQVNNX1BBVVNFKSAmJgorCQkJICAgKGFubHAxX3JlZyAmIElYR0JFX0FOTFAxX1NZTV9QQVVTRSkgJiYKKwkJCSAgIChhbmxwMV9yZWcgJiBJWEdCRV9BTkxQMV9BU01fUEFVU0UpKSB7CisJCQlody0+ZmMuY3VycmVudF9tb2RlID0gaXhnYmVfZmNfdHhfcGF1c2U7CisJCQlod19kYmcoaHcsICJGbG93IENvbnRyb2wgPSBUWCBQQVVTRSBmcmFtZXMgb25seS5cbiIpOworCQl9IGVsc2UgaWYgKChhdXRvY19yZWcgJiBJWEdCRV9BVVRPQ19TWU1fUEFVU0UpICYmCisJCQkgICAoYXV0b2NfcmVnICYgSVhHQkVfQVVUT0NfQVNNX1BBVVNFKSAmJgorCQkJICAgIShhbmxwMV9yZWcgJiBJWEdCRV9BTkxQMV9TWU1fUEFVU0UpICYmCisJCQkgICAoYW5scDFfcmVnICYgSVhHQkVfQU5MUDFfQVNNX1BBVVNFKSkgeworCQkJaHctPmZjLmN1cnJlbnRfbW9kZSA9IGl4Z2JlX2ZjX3J4X3BhdXNlOworCQkJaHdfZGJnKGh3LCAiRmxvdyBDb250cm9sID0gUlggUEFVU0UgZnJhbWVzIG9ubHkuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWh3LT5mYy5jdXJyZW50X21vZGUgPSBpeGdiZV9mY19ub25lOworCQkJaHdfZGJnKGh3LCAiRmxvdyBDb250cm9sID0gTk9ORS5cbiIpOworCQl9CisJfQogCS8qIFJlY29yZCB0aGF0IGN1cnJlbnRfbW9kZSBpcyB0aGUgcmVzdWx0IG9mIGEgc3VjY2Vzc2Z1bCBhdXRvbmVnICovCiAJaHctPmZjLmZjX3dhc19hdXRvbmVnZ2VkID0gdHJ1ZTsKIApAQCAtMTkxOSw3ICsxOTgyLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfRENCICovCiAJZGVmYXVsdDoKIAkJaHdfZGJnKGh3LCAiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7Ci0JCXJldF92YWwgPSAtSVhHQkVfRVJSX0NPTkZJRzsKKwkJcmV0X3ZhbCA9IElYR0JFX0VSUl9DT05GSUc7CiAJCWdvdG8gb3V0OwogCQlicmVhazsKIAl9CkBAIC0xOTI3LDkgKzE5OTAsNiBAQAogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUENTMUdBTkEsIHJlZyk7CiAJcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1BDUzFHTENUTCk7CiAKLQkvKiBFbmFibGUgYW5kIHJlc3RhcnQgYXV0b25lZyB0byBpbmZvcm0gdGhlIGxpbmsgcGFydG5lciAqLwotCXJlZyB8PSBJWEdCRV9QQ1MxR0xDVExfQU5fRU5BQkxFIHwgSVhHQkVfUENTMUdMQ1RMX0FOX1JFU1RBUlQ7Ci0KIAkvKiBEaXNhYmxlIEFOIHRpbWVvdXQgKi8KIAlpZiAoaHctPmZjLnN0cmljdF9pZWVlKQogCQlyZWcgJj0gfklYR0JFX1BDUzFHTENUTF9BTl8xR19USU1FT1VUX0VOOwpAQCAtMTkzNyw2ICsxOTk3LDcwIEBACiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9QQ1MxR0xDVEwsIHJlZyk7CiAJaHdfZGJnKGh3LCAiU2V0IHVwIEZDOyBQQ1MxR0xDVEwgPSAweCUwOFhcbiIsIHJlZyk7CiAKKwkvKgorCSAqIFNldCB1cCB0aGUgMTBHIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyBzbyB0aGUgSFcKKwkgKiBjYW4gZG8gZmMgYXV0b25lZyBvbmNlIHRoZSBjYWJsZSBpcyBwbHVnZ2VkIGluLiAgSWYgd2UgZW5kIHVwCisJICogdXNpbmcgMWcgaW5zdGVhZCwgdGhpcyBpcyBoYXJtbGVzcy4KKwkgKi8KKwlyZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfQVVUT0MpOworCisJLyoKKwkgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIGZjLnJlcXVlc3RlZF9tb2RlIGFyZToKKwkgKiAwOiBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAorCSAqIDE6IFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMsCisJICogICAgYnV0IG5vdCBzZW5kIHBhdXNlIGZyYW1lcykuCisJICogMjogVHggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiBzZW5kIHBhdXNlIGZyYW1lcyBidXQKKwkgKiAgICB3ZSBkbyBub3Qgc3VwcG9ydCByZWNlaXZpbmcgcGF1c2UgZnJhbWVzKS4KKwkgKiAzOiBCb3RoIFJ4IGFuZCBUeCBmbG93IGNvbnRyb2wgKHN5bW1ldHJpYykgYXJlIGVuYWJsZWQuCisJICogb3RoZXI6IEludmFsaWQuCisJICovCisJc3dpdGNoIChody0+ZmMucmVxdWVzdGVkX21vZGUpIHsKKwljYXNlIGl4Z2JlX2ZjX25vbmU6CisJCS8qIEZsb3cgY29udHJvbCBjb21wbGV0ZWx5IGRpc2FibGVkIGJ5IHNvZnR3YXJlIG92ZXJyaWRlLiAqLworCQlyZWcgJj0gfihJWEdCRV9BVVRPQ19TWU1fUEFVU0UgfCBJWEdCRV9BVVRPQ19BU01fUEFVU0UpOworCQlicmVhazsKKwljYXNlIGl4Z2JlX2ZjX3J4X3BhdXNlOgorCQkvKgorCQkgKiBSeCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCBhbmQgVHggRmxvdyBjb250cm9sIGlzCisJCSAqIGRpc2FibGVkIGJ5IHNvZnR3YXJlIG92ZXJyaWRlLiBTaW5jZSB0aGVyZSByZWFsbHkKKwkJICogaXNuJ3QgYSB3YXkgdG8gYWR2ZXJ0aXNlIHRoYXQgd2UgYXJlIGNhcGFibGUgb2YgUlgKKwkJICogUGF1c2UgT05MWSwgd2Ugd2lsbCBhZHZlcnRpc2UgdGhhdCB3ZSBzdXBwb3J0IGJvdGgKKwkJICogc3ltbWV0cmljIGFuZCBhc3ltbWV0cmljIFJ4IFBBVVNFLiAgTGF0ZXIsIHdlIHdpbGwKKwkJICogZGlzYWJsZSB0aGUgYWRhcHRlcidzIGFiaWxpdHkgdG8gc2VuZCBQQVVTRSBmcmFtZXMuCisJCSAqLworCQlyZWcgfD0gKElYR0JFX0FVVE9DX1NZTV9QQVVTRSB8IElYR0JFX0FVVE9DX0FTTV9QQVVTRSk7CisJCWJyZWFrOworCWNhc2UgaXhnYmVfZmNfdHhfcGF1c2U6CisJCS8qCisJCSAqIFR4IEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUnggRmxvdyBjb250cm9sIGlzCisJCSAqIGRpc2FibGVkIGJ5IHNvZnR3YXJlIG92ZXJyaWRlLgorCQkgKi8KKwkJcmVnIHw9IChJWEdCRV9BVVRPQ19BU01fUEFVU0UpOworCQlyZWcgJj0gfihJWEdCRV9BVVRPQ19TWU1fUEFVU0UpOworCQlicmVhazsKKwljYXNlIGl4Z2JlX2ZjX2Z1bGw6CisJCS8qIEZsb3cgY29udHJvbCAoYm90aCBSeCBhbmQgVHgpIGlzIGVuYWJsZWQgYnkgU1cgb3ZlcnJpZGUuICovCisJCXJlZyB8PSAoSVhHQkVfQVVUT0NfU1lNX1BBVVNFIHwgSVhHQkVfQVVUT0NfQVNNX1BBVVNFKTsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0RDQgorCWNhc2UgaXhnYmVfZmNfcGZjOgorCQlnb3RvIG91dDsKKwkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0RDQiAqLworCWRlZmF1bHQ6CisJCWh3X2RiZyhodywgIkZsb3cgY29udHJvbCBwYXJhbSBzZXQgaW5jb3JyZWN0bHlcbiIpOworCQlyZXRfdmFsID0gSVhHQkVfRVJSX0NPTkZJRzsKKwkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKwkvKgorCSAqIEFVVE9DIHJlc3RhcnQgaGFuZGxlcyBuZWdvdGlhdGlvbiBvZiAxRyBhbmQgMTBHLiBUaGVyZSBpcworCSAqIG5vIG5lZWQgdG8gc2V0IHRoZSBQQ1MxR0NUTCByZWdpc3Rlci4KKwkgKi8KKwlyZWcgfD0gSVhHQkVfQVVUT0NfQU5fUkVTVEFSVDsKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0FVVE9DLCByZWcpOworCWh3X2RiZyhodywgIlNldCB1cCBGQzsgSVhHQkVfQVVUT0MgPSAweCUwOFhcbiIsIHJlZyk7CisKIG91dDoKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KQEAgLTIwMDAsNyArMjEyNCw3IEBACiAKIAl3aGlsZSAodGltZW91dCkgewogCQlpZiAoaXhnYmVfZ2V0X2VlcHJvbV9zZW1hcGhvcmUoaHcpKQotCQkJcmV0dXJuIC1JWEdCRV9FUlJfU1dGV19TWU5DOworCQkJcmV0dXJuIElYR0JFX0VSUl9TV0ZXX1NZTkM7CiAKIAkJZ3NzciA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9HU1NSKTsKIAkJaWYgKCEoZ3NzciAmIChmd21hc2sgfCBzd21hc2spKSkKQEAgLTIwMTcsNyArMjE0MSw3IEBACiAKIAlpZiAoIXRpbWVvdXQpIHsKIAkJaHdfZGJnKGh3LCAiRHJpdmVyIGNhbid0IGFjY2VzcyByZXNvdXJjZSwgR1NTUiB0aW1lb3V0LlxuIik7Ci0JCXJldHVybiAtSVhHQkVfRVJSX1NXRldfU1lOQzsKKwkJcmV0dXJuIElYR0JFX0VSUl9TV0ZXX1NZTkM7CiAJfQogCiAJZ3NzciB8PSBzd21hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9ldGh0b29sLmMKaW5kZXggMDI2ZTk0YS4uODU2YzE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYwpAQCAtNTMsNiArNTMsMTAgQEAKIAl7InR4X3BhY2tldHMiLCBJWEdCRV9TVEFUKG5ldF9zdGF0cy50eF9wYWNrZXRzKX0sCiAJeyJyeF9ieXRlcyIsIElYR0JFX1NUQVQobmV0X3N0YXRzLnJ4X2J5dGVzKX0sCiAJeyJ0eF9ieXRlcyIsIElYR0JFX1NUQVQobmV0X3N0YXRzLnR4X2J5dGVzKX0sCisJeyJyeF9wa3RzX25pYyIsIElYR0JFX1NUQVQoc3RhdHMuZ3ByYyl9LAorCXsidHhfcGt0c19uaWMiLCBJWEdCRV9TVEFUKHN0YXRzLmdwdGMpfSwKKwl7InJ4X2J5dGVzX25pYyIsIElYR0JFX1NUQVQoc3RhdHMuZ29yYyl9LAorCXsidHhfYnl0ZXNfbmljIiwgSVhHQkVfU1RBVChzdGF0cy5nb3RjKX0sCiAJeyJsc2NfaW50IiwgSVhHQkVfU1RBVChsc2NfaW50KX0sCiAJeyJ0eF9idXN5IiwgSVhHQkVfU1RBVCh0eF9idXN5KX0sCiAJeyJub25fZW9wX2Rlc2NzIiwgSVhHQkVfU1RBVChub25fZW9wX2Rlc2NzKX0sCkBAIC03OTQsNyArNzk4LDcgQEAKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX3JpbmcgKnRlbXBfdHhfcmluZywgKnRlbXBfcnhfcmluZzsKLQlpbnQgaSwgZXJyOworCWludCBpLCBlcnIgPSAwOwogCXUzMiBuZXdfcnhfY291bnQsIG5ld190eF9jb3VudDsKIAlib29sIG5lZWRfdXBkYXRlID0gZmFsc2U7CiAKQEAgLTgxOCw2ICs4MjIsMTYgQEAKIAl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0lYR0JFX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKIAkJbXNsZWVwKDEpOwogCisJaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKKwkJCWFkYXB0ZXItPnR4X3JpbmdbaV0uY291bnQgPSBuZXdfdHhfY291bnQ7CisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCisJCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmNvdW50ID0gbmV3X3J4X2NvdW50OworCQlhZGFwdGVyLT50eF9yaW5nX2NvdW50ID0gbmV3X3R4X2NvdW50OworCQlhZGFwdGVyLT5yeF9yaW5nX2NvdW50ID0gbmV3X3J4X2NvdW50OworCQlnb3RvIGVycl9zZXR1cDsKKwl9CisKIAl0ZW1wX3R4X3JpbmcgPSBrY2FsbG9jKGFkYXB0ZXItPm51bV90eF9xdWV1ZXMsCiAJICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGl4Z2JlX3JpbmcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRlbXBfdHhfcmluZykgewpAQCAtODc1LDggKzg4OSw3IEBACiAKIAkvKiBpZiByaW5ncyBuZWVkIHRvIGJlIHVwZGF0ZWQsIGhlcmUncyB0aGUgcGxhY2UgdG8gZG8gaXQgaW4gb25lIHNob3QgKi8KIAlpZiAobmVlZF91cGRhdGUpIHsKLQkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJCWl4Z2JlX2Rvd24oYWRhcHRlcik7CisJCWl4Z2JlX2Rvd24oYWRhcHRlcik7CiAKIAkJLyogdHggKi8KIAkJaWYgKG5ld190eF9jb3VudCAhPSBhZGFwdGVyLT50eF9yaW5nX2NvdW50KSB7CkBAIC04OTMsMTMgKzkwNiw4IEBACiAJCQl0ZW1wX3J4X3JpbmcgPSBOVUxMOwogCQkJYWRhcHRlci0+cnhfcmluZ19jb3VudCA9IG5ld19yeF9jb3VudDsKIAkJfQotCX0KLQotCS8qIHN1Y2Nlc3MhICovCi0JZXJyID0gMDsKLQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQlpeGdiZV91cChhZGFwdGVyKTsKLQorCX0KIGVycl9zZXR1cDoKIAljbGVhcl9iaXQoX19JWEdCRV9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CiAJcmV0dXJuIGVycjsKQEAgLTE5MjksNyArMTkzNyw3IEBACiAJZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA9IGFkYXB0ZXItPnR4X3JpbmdbMF0ud29ya19saW1pdDsKIAogCS8qIG9ubHkgdmFsaWQgaWYgaW4gY29uc3RhbnQgSVRSIG1vZGUgKi8KLQlzd2l0Y2ggKGFkYXB0ZXItPml0cl9zZXR0aW5nKSB7CisJc3dpdGNoIChhZGFwdGVyLT5yeF9pdHJfc2V0dGluZykgewogCWNhc2UgMDoKIAkJLyogdGhyb3R0bGluZyBkaXNhYmxlZCAqLwogCQllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSAwOwpAQCAtMTk0MCw5ICsxOTQ4LDI1IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIGZpeGVkIGludGVycnVwdCByYXRlIG1vZGUgKi8KLQkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gMTAwMDAwMC9hZGFwdGVyLT5laXRyX3BhcmFtOworCQllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSAxMDAwMDAwL2FkYXB0ZXItPnJ4X2VpdHJfcGFyYW07CiAJCWJyZWFrOwogCX0KKworCS8qIG9ubHkgdmFsaWQgaWYgaW4gY29uc3RhbnQgSVRSIG1vZGUgKi8KKwlzd2l0Y2ggKGFkYXB0ZXItPnR4X2l0cl9zZXR0aW5nKSB7CisJY2FzZSAwOgorCQkvKiB0aHJvdHRsaW5nIGRpc2FibGVkICovCisJCWVjLT50eF9jb2FsZXNjZV91c2VjcyA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogZHluYW1pYyBJVFIgbW9kZSAqLworCQllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSAxMDAwMDAwL2FkYXB0ZXItPnR4X2VpdHJfcGFyYW07CisJCWJyZWFrOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xOTUzLDYgKzE5NzcsMTQgQEAKIAlzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IgKnFfdmVjdG9yOwogCWludCBpOwogCisJLyoKKwkgKiBkb24ndCBhY2NlcHQgdHggc3BlY2lmaWMgY2hhbmdlcyBpZiB3ZSd2ZSBnb3QgbWl4ZWQgUnhUeCB2ZWN0b3JzCisJICogdGVzdCBhbmQganVtcCBvdXQgaGVyZSBpZiBuZWVkZWQgYmVmb3JlIGNoYW5naW5nIHRoZSByeCBudW1iZXJzCisJICovCisJaWYgKCgxMDAwMDAwL2VjLT50eF9jb2FsZXNjZV91c2VjcykgIT0gYWRhcHRlci0+dHhfZWl0cl9wYXJhbSAmJgorCSAgICBhZGFwdGVyLT5xX3ZlY3RvclswXS0+dHhyX2NvdW50ICYmIGFkYXB0ZXItPnFfdmVjdG9yWzBdLT5yeHJfY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEpCiAJCWFkYXB0ZXItPnR4X3JpbmdbMF0ud29ya19saW1pdCA9IGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnE7CiAKQEAgLTE5NjMsMjYgKzE5OTUsNDkgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCS8qIHN0b3JlIHRoZSB2YWx1ZSBpbiBpbnRzL3NlY29uZCAqLwotCQlhZGFwdGVyLT5laXRyX3BhcmFtID0gMTAwMDAwMC9lYy0+cnhfY29hbGVzY2VfdXNlY3M7CisJCWFkYXB0ZXItPnJ4X2VpdHJfcGFyYW0gPSAxMDAwMDAwL2VjLT5yeF9jb2FsZXNjZV91c2VjczsKIAogCQkvKiBzdGF0aWMgdmFsdWUgb2YgaW50ZXJydXB0IHJhdGUgKi8KLQkJYWRhcHRlci0+aXRyX3NldHRpbmcgPSBhZGFwdGVyLT5laXRyX3BhcmFtOworCQlhZGFwdGVyLT5yeF9pdHJfc2V0dGluZyA9IGFkYXB0ZXItPnJ4X2VpdHJfcGFyYW07CiAJCS8qIGNsZWFyIHRoZSBsb3dlciBiaXQgYXMgaXRzIHVzZWQgZm9yIGR5bmFtaWMgc3RhdGUgKi8KLQkJYWRhcHRlci0+aXRyX3NldHRpbmcgJj0gfjE7CisJCWFkYXB0ZXItPnJ4X2l0cl9zZXR0aW5nICY9IH4xOwogCX0gZWxzZSBpZiAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID09IDEpIHsKIAkJLyogMSBtZWFucyBkeW5hbWljIG1vZGUgKi8KLQkJYWRhcHRlci0+ZWl0cl9wYXJhbSA9IDIwMDAwOwotCQlhZGFwdGVyLT5pdHJfc2V0dGluZyA9IDE7CisJCWFkYXB0ZXItPnJ4X2VpdHJfcGFyYW0gPSAyMDAwMDsKKwkJYWRhcHRlci0+cnhfaXRyX3NldHRpbmcgPSAxOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIGFueSBvdGhlciB2YWx1ZSBtZWFucyBkaXNhYmxlIGVpdHIsIHdoaWNoIGlzIGJlc3QKIAkJICogc2VydmVkIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCByYXRlIHZlcnkgaGlnaAogCQkgKi8KIAkJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1JTQ19FTkFCTEVEKQotCQkJYWRhcHRlci0+ZWl0cl9wYXJhbSA9IElYR0JFX01BWF9SU0NfSU5UX1JBVEU7CisJCQlhZGFwdGVyLT5yeF9laXRyX3BhcmFtID0gSVhHQkVfTUFYX1JTQ19JTlRfUkFURTsKIAkJZWxzZQotCQkJYWRhcHRlci0+ZWl0cl9wYXJhbSA9IElYR0JFX01BWF9JTlRfUkFURTsKLQkJYWRhcHRlci0+aXRyX3NldHRpbmcgPSAwOworCQkJYWRhcHRlci0+cnhfZWl0cl9wYXJhbSA9IElYR0JFX01BWF9JTlRfUkFURTsKKwkJYWRhcHRlci0+cnhfaXRyX3NldHRpbmcgPSAwOworCX0KKworCWlmIChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPiAxKSB7CisJCS8qIGNoZWNrIHRoZSBsaW1pdHMgKi8KKwkJaWYgKCgxMDAwMDAwL2VjLT50eF9jb2FsZXNjZV91c2VjcyA+IElYR0JFX01BWF9JTlRfUkFURSkgfHwKKwkJICAgICgxMDAwMDAwL2VjLT50eF9jb2FsZXNjZV91c2VjcyA8IElYR0JFX01JTl9JTlRfUkFURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBzdG9yZSB0aGUgdmFsdWUgaW4gaW50cy9zZWNvbmQgKi8KKwkJYWRhcHRlci0+dHhfZWl0cl9wYXJhbSA9IDEwMDAwMDAvZWMtPnR4X2NvYWxlc2NlX3VzZWNzOworCisJCS8qIHN0YXRpYyB2YWx1ZSBvZiBpbnRlcnJ1cHQgcmF0ZSAqLworCQlhZGFwdGVyLT50eF9pdHJfc2V0dGluZyA9IGFkYXB0ZXItPnR4X2VpdHJfcGFyYW07CisKKwkJLyogY2xlYXIgdGhlIGxvd2VyIGJpdCBhcyBpdHMgdXNlZCBmb3IgZHluYW1pYyBzdGF0ZSAqLworCQlhZGFwdGVyLT50eF9pdHJfc2V0dGluZyAmPSB+MTsKKwl9IGVsc2UgaWYgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA9PSAxKSB7CisJCS8qIDEgbWVhbnMgZHluYW1pYyBtb2RlICovCisJCWFkYXB0ZXItPnR4X2VpdHJfcGFyYW0gPSAxMDAwMDsKKwkJYWRhcHRlci0+dHhfaXRyX3NldHRpbmcgPSAxOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPnR4X2VpdHJfcGFyYW0gPSBJWEdCRV9NQVhfSU5UX1JBVEU7CisJCWFkYXB0ZXItPnR4X2l0cl9zZXR0aW5nID0gMDsKIAl9CiAKIAkvKiBNU0kvTVNJeCBJbnRlcnJ1cHQgTW9kZSAqLwpAQCAtMTk5MiwxNyArMjA0NywxNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZlY3RvcnM7IGkrKykgewogCQkJcV92ZWN0b3IgPSBhZGFwdGVyLT5xX3ZlY3RvcltpXTsKIAkJCWlmIChxX3ZlY3Rvci0+dHhyX2NvdW50ICYmICFxX3ZlY3Rvci0+cnhyX2NvdW50KQotCQkJCS8qIHR4IHZlY3RvciBnZXRzIGhhbGYgdGhlIHJhdGUgKi8KLQkJCQlxX3ZlY3Rvci0+ZWl0ciA9IChhZGFwdGVyLT5laXRyX3BhcmFtID4+IDEpOworCQkJCS8qIHR4IG9ubHkgKi8KKwkJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPnR4X2VpdHJfcGFyYW07CiAJCQllbHNlCiAJCQkJLyogcnggb25seSBvciBtaXhlZCAqLwotCQkJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+ZWl0cl9wYXJhbTsKKwkJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPnJ4X2VpdHJfcGFyYW07CiAJCQlpeGdiZV93cml0ZV9laXRyKHFfdmVjdG9yKTsKIAkJfQogCS8qIExlZ2FjeSBJbnRlcnJ1cHQgTW9kZSAqLwogCX0gZWxzZSB7CiAJCXFfdmVjdG9yID0gYWRhcHRlci0+cV92ZWN0b3JbMF07Ci0JCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+ZWl0cl9wYXJhbTsKKwkJcV92ZWN0b3ItPmVpdHIgPSBhZGFwdGVyLT5yeF9laXRyX3BhcmFtOwogCQlpeGdiZV93cml0ZV9laXRyKHFfdmVjdG9yKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYwppbmRleCA1OWFkOTU5Li5jYmIxNDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jCkBAIC00OSw3ICs0OSw3IEBACiBzdGF0aWMgY29uc3QgY2hhciBpeGdiZV9kcml2ZXJfc3RyaW5nW10gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVsKFIpIDEwIEdpZ2FiaXQgUENJIEV4cHJlc3MgTmV0d29yayBEcml2ZXIiOwogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMzctazIiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuNDQtazIiCiBjb25zdCBjaGFyIGl4Z2JlX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjaGFyIGl4Z2JlX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA5IEludGVsIENvcnBvcmF0aW9uLiI7CiAKQEAgLTk3LDggKzk3LDEyIEBACiAJIGJvYXJkXzgyNTk5IH0sCiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfODI1OTlfU0ZQKSwKIAkgYm9hcmRfODI1OTkgfSwKKwl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF84MjU5OV9LWDRfTUVaWiksCisJIGJvYXJkXzgyNTk5IH0sCiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfODI1OTlfQ1g0KSwKIAkgYm9hcmRfODI1OTkgfSwKKwl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF84MjU5OV9DT01CT19CQUNLUExBTkUpLAorCSBib2FyZF84MjU5OSB9LAogCiAJLyogcmVxdWlyZWQgbGFzdCBlbnRyeSAqLwogCXswLCB9CkBAIC05MjYsMTIgKzkzMCwxMiBAQAogCQkJICAgICAgICAgICAgICAgICAgICAgIHJfaWR4ICsgMSk7CiAJCX0KIAotCQkvKiBpZiB0aGlzIGlzIGEgdHggb25seSB2ZWN0b3IgaGFsdmUgdGhlIGludGVycnVwdCByYXRlICovCiAJCWlmIChxX3ZlY3Rvci0+dHhyX2NvdW50ICYmICFxX3ZlY3Rvci0+cnhyX2NvdW50KQotCQkJcV92ZWN0b3ItPmVpdHIgPSAoYWRhcHRlci0+ZWl0cl9wYXJhbSA+PiAxKTsKKwkJCS8qIHR4IG9ubHkgKi8KKwkJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+dHhfZWl0cl9wYXJhbTsKIAkJZWxzZSBpZiAocV92ZWN0b3ItPnJ4cl9jb3VudCkKLQkJCS8qIHJ4IG9ubHkgKi8KLQkJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+ZWl0cl9wYXJhbTsKKwkJCS8qIHJ4IG9yIG1peGVkICovCisJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPnJ4X2VpdHJfcGFyYW07CiAKIAkJaXhnYmVfd3JpdGVfZWl0cihxX3ZlY3Rvcik7CiAJfQpAQCAtMTM1OSw3ICsxMzYzLDcgQEAKIAkvKiBJZiBhbGwgUnggd29yayBkb25lLCBleGl0IHRoZSBwb2xsaW5nIG1vZGUgKi8KIAlpZiAod29ya19kb25lIDwgYnVkZ2V0KSB7CiAJCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JCWlmIChhZGFwdGVyLT5pdHJfc2V0dGluZyAmIDEpCisJCWlmIChhZGFwdGVyLT5yeF9pdHJfc2V0dGluZyAmIDEpCiAJCQlpeGdiZV9zZXRfaXRyX21zaXgocV92ZWN0b3IpOwogCQlpZiAoIXRlc3RfYml0KF9fSVhHQkVfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJCWl4Z2JlX2lycV9lbmFibGVfcXVldWVzKGFkYXB0ZXIsCkBAIC0xNDIwLDcgKzE0MjQsNyBAQAogCS8qIElmIGFsbCBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLwogCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJaWYgKGFkYXB0ZXItPml0cl9zZXR0aW5nICYgMSkKKwkJaWYgKGFkYXB0ZXItPnJ4X2l0cl9zZXR0aW5nICYgMSkKIAkJCWl4Z2JlX3NldF9pdHJfbXNpeChxX3ZlY3Rvcik7CiAJCWlmICghdGVzdF9iaXQoX19JWEdCRV9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKQogCQkJaXhnYmVfaXJxX2VuYWJsZV9xdWV1ZXMoYWRhcHRlciwKQEAgLTE0NTgsMTAgKzE0NjIsMTAgQEAKIAlpZiAoIWl4Z2JlX2NsZWFuX3R4X2lycShxX3ZlY3RvciwgdHhfcmluZykpCiAJCXdvcmtfZG9uZSA9IGJ1ZGdldDsKIAotCS8qIElmIGFsbCBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLworCS8qIElmIGFsbCBUeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLwogCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJaWYgKGFkYXB0ZXItPml0cl9zZXR0aW5nICYgMSkKKwkJaWYgKGFkYXB0ZXItPnR4X2l0cl9zZXR0aW5nICYgMSkKIAkJCWl4Z2JlX3NldF9pdHJfbXNpeChxX3ZlY3Rvcik7CiAJCWlmICghdGVzdF9iaXQoX19JWEdCRV9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKQogCQkJaXhnYmVfaXJxX2VuYWJsZV9xdWV1ZXMoYWRhcHRlciwgKCh1NjQpMSA8PCBxX3ZlY3Rvci0+dl9pZHgpKTsKQEAgLTE4NDgsNyArMTg1Miw3IEBACiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlUUigwKSwKLQkgICAgICAgICAgICAgICAgRUlUUl9JTlRTX1BFUl9TRUNfVE9fUkVHKGFkYXB0ZXItPmVpdHJfcGFyYW0pKTsKKwkgICAgICAgICAgICAgICAgRUlUUl9JTlRTX1BFUl9TRUNfVE9fUkVHKGFkYXB0ZXItPnJ4X2VpdHJfcGFyYW0pKTsKIAogCWl4Z2JlX3NldF9pdmFyKGFkYXB0ZXIsIDAsIDAsIDApOwogCWl4Z2JlX3NldF9pdmFyKGFkYXB0ZXIsIDEsIDAsIDApOwpAQCAtMTg4NSwxMiArMTg4OSwyOSBAQAogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1REVChqKSwgMCk7CiAJCWFkYXB0ZXItPnR4X3JpbmdbaV0uaGVhZCA9IElYR0JFX1RESChqKTsKIAkJYWRhcHRlci0+dHhfcmluZ1tpXS50YWlsID0gSVhHQkVfVERUKGopOwotCQkvKiBEaXNhYmxlIFR4IEhlYWQgV3JpdGViYWNrIFJPIGJpdCwgc2luY2UgdGhpcyBob3NlcworCQkvKgorCQkgKiBEaXNhYmxlIFR4IEhlYWQgV3JpdGViYWNrIFJPIGJpdCwgc2luY2UgdGhpcyBob3NlcwogCQkgKiBib29ra2VlcGluZyBpZiB0aGluZ3MgYXJlbid0IGRlbGl2ZXJlZCBpbiBvcmRlci4KIAkJICovCi0JCXR4Y3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9EQ0FfVFhDVFJMKGopKTsKKwkJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKKwkJY2FzZSBpeGdiZV9tYWNfODI1OThFQjoKKwkJCXR4Y3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9EQ0FfVFhDVFJMKGopKTsKKwkJCWJyZWFrOworCQljYXNlIGl4Z2JlX21hY184MjU5OUVCOgorCQlkZWZhdWx0OgorCQkJdHhjdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0RDQV9UWENUUkxfODI1OTkoaikpOworCQkJYnJlYWs7CisJCX0KIAkJdHhjdHJsICY9IH5JWEdCRV9EQ0FfVFhDVFJMX1RYX1dCX1JPX0VOOwotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0RDQV9UWENUUkwoaiksIHR4Y3RybCk7CisJCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7CisJCWNhc2UgaXhnYmVfbWFjXzgyNTk4RUI6CisJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0RDQV9UWENUUkwoaiksIHR4Y3RybCk7CisJCQlicmVhazsKKwkJY2FzZSBpeGdiZV9tYWNfODI1OTlFQjoKKwkJZGVmYXVsdDoKKwkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRENBX1RYQ1RSTF84MjU5OShqKSwgdHhjdHJsKTsKKwkJCWJyZWFrOworCQl9CiAJfQogCWlmIChody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk5RUIpIHsKIAkJLyogV2UgZW5hYmxlIDggdHJhZmZpYyBjbGFzc2VzLCBEQ0Igb25seSAqLwpAQCAtMTk3MCw2ICsxOTkxLDUwIEBACiB9CiAKIC8qKgorICogaXhnYmVfY29uZmlndXJlX3JzY2N0bCAtIGVuYWJsZSBSU0MgZm9yIHRoZSBpbmRpY2F0ZWQgcmluZworICogQGFkYXB0ZXI6ICAgIGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqIEBpbmRleDogICAgICBpbmRleCBvZiByaW5nIHRvIHNldAorICogQHJ4X2J1Zl9sZW46IHJ4IGJ1ZmZlciBsZW5ndGgKKyAqKi8KK3N0YXRpYyB2b2lkIGl4Z2JlX2NvbmZpZ3VyZV9yc2NjdGwoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ4X2J1Zl9sZW4pCit7CisJc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3Jpbmc7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlpbnQgajsKKwl1MzIgcnNjY3RybDsKKworCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1tpbmRleF07CisJaiA9IHJ4X3JpbmctPnJlZ19pZHg7CisJcnNjY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SU0NDVEwoaikpOworCXJzY2N0cmwgfD0gSVhHQkVfUlNDQ1RMX1JTQ0VOOworCS8qCisJICogd2UgbXVzdCBsaW1pdCB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHNvIHRoYXQgdGhlCisJICogdG90YWwgc2l6ZSBvZiBtYXggZGVzYyAqIGJ1Zl9sZW4gaXMgbm90IGdyZWF0ZXIKKwkgKiB0aGFuIDY1NTM1CisJICovCisJaWYgKHJ4X3JpbmctPmZsYWdzICYgSVhHQkVfUklOR19SWF9QU19FTkFCTEVEKSB7CisjaWYgKE1BWF9TS0JfRlJBR1MgPiAxNikKKwkJcnNjY3RybCB8PSBJWEdCRV9SU0NDVExfTUFYREVTQ18xNjsKKyNlbGlmIChNQVhfU0tCX0ZSQUdTID4gOCkKKwkJcnNjY3RybCB8PSBJWEdCRV9SU0NDVExfTUFYREVTQ184OworI2VsaWYgKE1BWF9TS0JfRlJBR1MgPiA0KQorCQlyc2NjdHJsIHw9IElYR0JFX1JTQ0NUTF9NQVhERVNDXzQ7CisjZWxzZQorCQlyc2NjdHJsIHw9IElYR0JFX1JTQ0NUTF9NQVhERVNDXzE7CisjZW5kaWYKKwl9IGVsc2UgeworCQlpZiAocnhfYnVmX2xlbiA8IElYR0JFX1JYQlVGRkVSXzQwOTYpCisJCQlyc2NjdHJsIHw9IElYR0JFX1JTQ0NUTF9NQVhERVNDXzE2OworCQllbHNlIGlmIChyeF9idWZfbGVuIDwgSVhHQkVfUlhCVUZGRVJfODE5MikKKwkJCXJzY2N0cmwgfD0gSVhHQkVfUlNDQ1RMX01BWERFU0NfODsKKwkJZWxzZQorCQkJcnNjY3RybCB8PSBJWEdCRV9SU0NDVExfTUFYREVTQ180OworCX0KKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JTQ0NUTChqKSwgcnNjY3RybCk7Cit9CisKKy8qKgogICogaXhnYmVfY29uZmlndXJlX3J4IC0gQ29uZmlndXJlIDgyNTl4IFJlY2VpdmUgVW5pdCBhZnRlciBSZXNldAogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKgpAQCAtMTk5MCw3ICsyMDU1LDYgQEAKIAl1MzIgZmN0cmwsIGhscmVnMDsKIAl1MzIgcmV0YSA9IDAsIG1ycWMgPSAwOwogCXUzMiByZHJ4Y3RsOwotCXUzMiByc2NjdHJsOwogCWludCByeF9idWZfbGVuOwogCiAJLyogRGVjaWRlIHdoZXRoZXIgdG8gdXNlIHBhY2tldCBzcGxpdCBtb2RlIG9yIG5vdCAqLwpAQCAtMjE0OCwzNiArMjIxMiw5IEBACiAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfUlNDX0VOQUJMRUQpIHsKIAkJLyogRW5hYmxlIDgyNTk5IEhXLVJTQyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7Ci0JCQlyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbaV07Ci0JCQlqID0gcnhfcmluZy0+cmVnX2lkeDsKLQkJCXJzY2N0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlNDQ1RMKGopKTsKLQkJCXJzY2N0cmwgfD0gSVhHQkVfUlNDQ1RMX1JTQ0VOOwotCQkJLyoKLQkJCSAqIHdlIG11c3QgbGltaXQgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBzbyB0aGF0IHRoZQotCQkJICogdG90YWwgc2l6ZSBvZiBtYXggZGVzYyAqIGJ1Zl9sZW4gaXMgbm90IGdyZWF0ZXIKLQkJCSAqIHRoYW4gNjU1MzUKLQkJCSAqLwotCQkJaWYgKHJ4X3JpbmctPmZsYWdzICYgSVhHQkVfUklOR19SWF9QU19FTkFCTEVEKSB7Ci0jaWYgKE1BWF9TS0JfRlJBR1MgPiAxNikKLQkJCQlyc2NjdHJsIHw9IElYR0JFX1JTQ0NUTF9NQVhERVNDXzE2OwotI2VsaWYgKE1BWF9TS0JfRlJBR1MgPiA4KQotCQkJCXJzY2N0cmwgfD0gSVhHQkVfUlNDQ1RMX01BWERFU0NfODsKLSNlbGlmIChNQVhfU0tCX0ZSQUdTID4gNCkKLQkJCQlyc2NjdHJsIHw9IElYR0JFX1JTQ0NUTF9NQVhERVNDXzQ7Ci0jZWxzZQotCQkJCXJzY2N0cmwgfD0gSVhHQkVfUlNDQ1RMX01BWERFU0NfMTsKLSNlbmRpZgotCQkJfSBlbHNlIHsKLQkJCQlpZiAocnhfYnVmX2xlbiA8IElYR0JFX1JYQlVGRkVSXzQwOTYpCi0JCQkJCXJzY2N0cmwgfD0gSVhHQkVfUlNDQ1RMX01BWERFU0NfMTY7Ci0JCQkJZWxzZSBpZiAocnhfYnVmX2xlbiA8IElYR0JFX1JYQlVGRkVSXzgxOTIpCi0JCQkJCXJzY2N0cmwgfD0gSVhHQkVfUlNDQ1RMX01BWERFU0NfODsKLQkJCQllbHNlCi0JCQkJCXJzY2N0cmwgfD0gSVhHQkVfUlNDQ1RMX01BWERFU0NfNDsKLQkJCX0KLQkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlNDQ1RMKGopLCByc2NjdHJsKTsKLQkJfQorCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKQorCQkJaXhnYmVfY29uZmlndXJlX3JzY2N0bChhZGFwdGVyLCBpLCByeF9idWZfbGVuKTsKKwogCQkvKiBEaXNhYmxlIFJTQyBmb3IgQUNLIHBhY2tldHMgKi8KIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SU0NEQlUsCiAJCSAgIChJWEdCRV9SU0NEQlVfUlNDQUNLRElTIHwgSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JTQ0RCVSkpKTsKQEAgLTI5MjYsNiArMjk2Myw4IEBACiAKIAlpeGdiZV9uYXBpX2Rpc2FibGVfYWxsKGFkYXB0ZXIpOwogCisJY2xlYXJfYml0KF9fSVhHQkVfU0ZQX01PRFVMRV9OT1RfRk9VTkQsICZhZGFwdGVyLT5zdGF0ZSk7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnNmcF90aW1lcik7CiAJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKIAljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190YXNrKTsKIApAQCAtMjk4OSw3ICszMDI4LDcgQEAKIAkvKiBJZiBidWRnZXQgbm90IGZ1bGx5IGNvbnN1bWVkLCBleGl0IHRoZSBwb2xsaW5nIG1vZGUgKi8KIAlpZiAod29ya19kb25lIDwgYnVkZ2V0KSB7CiAJCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JCWlmIChhZGFwdGVyLT5pdHJfc2V0dGluZyAmIDEpCisJCWlmIChhZGFwdGVyLT5yeF9pdHJfc2V0dGluZyAmIDEpCiAJCQlpeGdiZV9zZXRfaXRyKGFkYXB0ZXIpOwogCQlpZiAoIXRlc3RfYml0KF9fSVhHQkVfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJCWl4Z2JlX2lycV9lbmFibGVfcXVldWVzKGFkYXB0ZXIsIElYR0JFX0VJTVNfUlRYX1FVRVVFKTsKQEAgLTM1OTksNyArMzYzOCwxMCBAQAogCQlpZiAoIXFfdmVjdG9yKQogCQkJZ290byBlcnJfb3V0OwogCQlxX3ZlY3Rvci0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+ZWl0cl9wYXJhbTsKKwkJaWYgKHFfdmVjdG9yLT50eHJfY291bnQgJiYgIXFfdmVjdG9yLT5yeHJfY291bnQpCisJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPnR4X2VpdHJfcGFyYW07CisJCWVsc2UKKwkJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+cnhfZWl0cl9wYXJhbTsKIAkJcV92ZWN0b3ItPnZfaWR4ID0gcV9pZHg7CiAJCW5ldGlmX25hcGlfYWRkKGFkYXB0ZXItPm5ldGRldiwgJnFfdmVjdG9yLT5uYXBpLCAoKnBvbGwpLCA2NCk7CiAJCWFkYXB0ZXItPnFfdmVjdG9yW3FfaWR4XSA9IHFfdmVjdG9yOwpAQCAtMzg2OCw4ICszOTEwLDEwIEBACiAJaHctPmZjLmRpc2FibGVfZmNfYXV0b25lZyA9IGZhbHNlOwogCiAJLyogZW5hYmxlIGl0ciBieSBkZWZhdWx0IGluIGR5bmFtaWMgbW9kZSAqLwotCWFkYXB0ZXItPml0cl9zZXR0aW5nID0gMTsKLQlhZGFwdGVyLT5laXRyX3BhcmFtID0gMjAwMDA7CisJYWRhcHRlci0+cnhfaXRyX3NldHRpbmcgPSAxOworCWFkYXB0ZXItPnJ4X2VpdHJfcGFyYW0gPSAyMDAwMDsKKwlhZGFwdGVyLT50eF9pdHJfc2V0dGluZyA9IDE7CisJYWRhcHRlci0+dHhfZWl0cl9wYXJhbSA9IDEwMDAwOwogCiAJLyogc2V0IGRlZmF1bHRzIGZvciBlaXRyIGluIE1lZ2FCeXRlcyAqLwogCWFkYXB0ZXItPmVpdHJfbG93ID0gMTA7CkBAIC00NDA5LDEwICs0NDUzLDEzIEBACiAKIAkvKiA4MjU5OCBoYXJkd2FyZSBvbmx5IGhhcyBhIDMyIGJpdCBjb3VudGVyIGluIHRoZSBoaWdoIHJlZ2lzdGVyICovCiAJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OTlFQikgeworCQl1NjQgdG1wOwogCQlhZGFwdGVyLT5zdGF0cy5nb3JjICs9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9HT1JDTCk7Ci0JCUlYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9HT1JDSCk7IC8qIHRvIGNsZWFyICovCisJCXRtcCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9HT1JDSCkgJiAweEY7IC8qIDQgaGlnaCBiaXRzIG9mIEdPUkMgKi8KKwkJYWRhcHRlci0+c3RhdHMuZ29yYyArPSAodG1wIDw8IDMyKTsKIAkJYWRhcHRlci0+c3RhdHMuZ290YyArPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfR09UQ0wpOwotCQlJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfR09UQ0gpOyAvKiB0byBjbGVhciAqLworCQl0bXAgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfR09UQ0gpICYgMHhGOyAvKiA0IGhpZ2ggYml0cyBvZiBHT1RDICovCisJCWFkYXB0ZXItPnN0YXRzLmdvdGMgKz0gKHRtcCA8PCAzMik7CiAJCWFkYXB0ZXItPnN0YXRzLnRvciArPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVE9STCk7CiAJCUlYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9UT1JIKTsgLyogdG8gY2xlYXIgKi8KIAkJYWRhcHRlci0+c3RhdHMubHhvbnJ4YyArPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTFhPTlJYQ05UKTsKQEAgLTUwNDgsNyArNTA5NSw2IEBACiAJLyogUmlnaHQgbm93LCB3ZSBzdXBwb3J0IElQdjQgb25seSAqLwogCXN0cnVjdCBpeGdiZV9hdHJfaW5wdXQgYXRyX2lucHV0OwogCXN0cnVjdCB0Y3BoZHIgKnRoOwotCXN0cnVjdCB1ZHBoZHIgKnVoOwogCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CiAJdTE2IHZsYW5faWQsIHNyY19wb3J0LCBkc3RfcG9ydCwgZmxleF9ieXRlczsKQEAgLTUwNjIsMTIgKzUxMDgsNiBAQAogCQlkc3RfcG9ydCA9IHRoLT5kZXN0OwogCQlsNHR5cGUgfD0gSVhHQkVfQVRSX0w0VFlQRV9UQ1A7CiAJCS8qIGw0dHlwZSBJUHY0IHR5cGUgaXMgMCwgbm8gbmVlZCB0byBhc3NpZ24gKi8KLQl9IGVsc2UgaWYoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgewotCQl1aCA9IHVkcF9oZHIoc2tiKTsKLQkJc3JjX3BvcnQgPSB1aC0+c291cmNlOwotCQlkc3RfcG9ydCA9IHVoLT5kZXN0OwotCQlsNHR5cGUgfD0gSVhHQkVfQVRSX0w0VFlQRV9VRFA7Ci0JCS8qIGw0dHlwZSBJUHY0IHR5cGUgaXMgMCwgbm8gbmVlZCB0byBhc3NpZ24gKi8KIAl9IGVsc2UgewogCQkvKiBVbnN1cHBvcnRlZCBMNCBoZWFkZXIsIGp1c3QgYmFpbCBoZXJlICovCiAJCXJldHVybjsKQEAgLTU0NzEsMTIgKzU1MTEsNyBAQAogCQlnb3RvIGVycl9wY2lfcmVnOwogCX0KIAotCWVyciA9IHBjaV9lbmFibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcocGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nIGZhaWxlZCAiCi0JCSAgICAgICAgICAgICAgICAgICAgIjB4JXhcbiIsIGVycik7Ci0JCS8qIG5vbi1mYXRhbCwgY29udGludWUgKi8KLQl9CisJcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwZGV2KTsKIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwpAQCAtNTc4NSw3ICs1ODIwLDYgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgZXJyOwogCiAJc2V0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSk7CiAJLyogY2xlYXIgdGhlIG1vZHVsZSBub3QgZm91bmQgYml0IHRvIG1ha2Ugc3VyZSB0aGUgd29ya2VyIHdvbid0CkBAIC01ODM2LDEwICs1ODcwLDcgQEAKIAogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAKLQllcnIgPSBwY2lfZGlzYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwZGV2KTsKLQlpZiAoZXJyKQotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCSAgICAgICAgInBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nIGZhaWxlZCAweCV4XG4iLCBlcnIpOworCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oCmluZGV4IDg3NjFkNzguLmVmNGJkZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV90eXBlLmgKQEAgLTQ5LDkgKzQ5LDExIEBACiAjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OF9TUl9EVUFMX1BPUlRfRU0gICAgICAweDEwRTEKICNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk4RUJfWEZfTFIgICAgICAgMHgxMEY0CiAjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OV9LWDQgICAgICAgICAgIDB4MTBGNworI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OTlfS1g0X01FWlogICAgICAweDE1MTQKICNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk5X0NYNCAgICAgICAgICAgMHgxMEY5CiAjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OV9TRlAgICAgICAgICAgIDB4MTBGQgogI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OTlfWEFVSV9MT00gICAgICAweDEwRkMKKyNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk5X0NPTUJPX0JBQ0tQTEFORSAweDEwRjgKIAogLyogR2VuZXJhbCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgSVhHQkVfQ1RSTCAgICAgIDB4MDAwMDAKQEAgLTEzMzYsNiArMTMzOCw4IEBACiAjZGVmaW5lIElYR0JFX0FVVE9DX0tYNF9TVVBQICAgIDB4ODAwMDAwMDAKICNkZWZpbmUgSVhHQkVfQVVUT0NfS1hfU1VQUCAgICAgMHg0MDAwMDAwMAogI2RlZmluZSBJWEdCRV9BVVRPQ19QQVVTRSAgICAgICAweDMwMDAwMDAwCisjZGVmaW5lIElYR0JFX0FVVE9DX0FTTV9QQVVTRSAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgSVhHQkVfQVVUT0NfU1lNX1BBVVNFICAgMHgxMDAwMDAwMAogI2RlZmluZSBJWEdCRV9BVVRPQ19SRiAgICAgICAgICAweDA4MDAwMDAwCiAjZGVmaW5lIElYR0JFX0FVVE9DX1BEX1RNUiAgICAgIDB4MDYwMDAwMDAKICNkZWZpbmUgSVhHQkVfQVVUT0NfQU5fUlhfTE9PU0UgMHgwMTAwMDAwMApAQCAtMTQwNCw2ICsxNDA4LDggQEAKICNkZWZpbmUgSVhHQkVfTElOS19VUF9USU1FICAgICAgOTAgLyogOS4wIFNlY29uZHMgKi8KICNkZWZpbmUgSVhHQkVfQVVUT19ORUdfVElNRSAgICAgNDUgLyogNC41IFNlY29uZHMgKi8KIAorI2RlZmluZSBJWEdCRV9MSU5LUzJfQU5fU1VQUE9SVEVEICAgMHgwMDAwMDA0MAorCiAvKiBQQ1MxR0xTVEEgQml0IE1hc2tzICovCiAjZGVmaW5lIElYR0JFX1BDUzFHTFNUQV9MSU5LX09LICAgICAgICAgMQogI2RlZmluZSBJWEdCRV9QQ1MxR0xTVEFfU1lOS19PSyAgICAgICAgIDB4MTAKQEAgLTE0MjQsNiArMTQzMCwxMSBAQAogI2RlZmluZSBJWEdCRV9QQ1MxR0xDVExfQU5fRU5BQkxFICAgICAgIDB4MTAwMDAKICNkZWZpbmUgSVhHQkVfUENTMUdMQ1RMX0FOX1JFU1RBUlQgICAgICAweDIwMDAwCiAKKy8qIEFOTFAxIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCRV9BTkxQMV9QQVVTRSAgICAgICAgICAgICAgIDB4MEMwMAorI2RlZmluZSBJWEdCRV9BTkxQMV9TWU1fUEFVU0UgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJWEdCRV9BTkxQMV9BU01fUEFVU0UgICAgICAgICAgIDB4MDgwMAorCiAvKiBTVyBTZW1hcGhvcmUgUmVnaXN0ZXIgYml0bWFza3MgKi8KICNkZWZpbmUgSVhHQkVfU1dTTV9TTUJJIDB4MDAwMDAwMDEgLyogRHJpdmVyIFNlbWFwaG9yZSBiaXQgKi8KICNkZWZpbmUgSVhHQkVfU1dTTV9TV0VTTUJJIDB4MDAwMDAwMDIgLyogRlcgU2VtYXBob3JlIGJpdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhwMjAwMC9lbnAyNjExLmMgYi9kcml2ZXJzL25ldC9peHAyMDAwL2VucDI2MTEuYwppbmRleCBiMDJhOTgxLi4zNGE2Y2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peHAyMDAwL2VucDI2MTEuYworKysgYi9kcml2ZXJzL25ldC9peHAyMDAwL2VucDI2MTEuYwpAQCAtMTE5LDI0ICsxMTksOSBAQAogCX0KIH07CiAKLXN0cnVjdCBlbnAyNjExX2l4cGRldl9wcml2Ci17Ci0Jc3RydWN0IGl4cGRldl9wcml2CQlpeHBkZXZfcHJpdjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJc3RhdHM7Ci19OwotCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm5kc1szXTsKIHN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBsaW5rX2NoZWNrX3RpbWVyOwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVucDI2MTFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGVucDI2MTFfaXhwZGV2X3ByaXYgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXBtMzM4Nl9nZXRfc3RhdHMoaXAtPml4cGRldl9wcml2LmNoYW5uZWwsICYoaXAtPnN0YXRzKSk7Ci0KLQlyZXR1cm4gJihpcC0+c3RhdHMpOwotfQotCiAvKiBAQEAgUG9sbCB0aGUgU0ZQIG1vZGRlZjAgbGluZSB0b28uICAqLwogLyogQEBAIFRyeSB0byB1c2UgdGhlIHBtMzM4NiBET09MIGludGVycnVwdCBhcyB3ZWxsLiAgKi8KIHN0YXRpYyB2b2lkIGVucDI2MTFfY2hlY2tfbGlua19zdGF0dXModW5zaWduZWQgbG9uZyBfX2R1bW15KQpAQCAtMjAzLDE0ICsxODgsMTMgQEAKIAogCXBvcnRzID0gcG0zMzg2X3BvcnRfY291bnQoKTsKIAlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykgewotCQluZHNbaV0gPSBpeHBkZXZfYWxsb2MoaSwgc2l6ZW9mKHN0cnVjdCBlbnAyNjExX2l4cGRldl9wcml2KSk7CisJCW5kc1tpXSA9IGl4cGRldl9hbGxvYyhpLCBzaXplb2Yoc3RydWN0IGl4cGRldl9wcml2KSk7CiAJCWlmIChuZHNbaV0gPT0gTlVMTCkgewogCQkJd2hpbGUgKC0taSA+PSAwKQogCQkJCWZyZWVfbmV0ZGV2KG5kc1tpXSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCW5kc1tpXS0+Z2V0X3N0YXRzID0gZW5wMjYxMV9nZXRfc3RhdHM7CiAJCXBtMzM4Nl9pbml0X3BvcnQoaSk7CiAJCXBtMzM4Nl9nZXRfbWFjKGksIG5kc1tpXS0+ZGV2X2FkZHIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4cDIwMDAvaXhwZGV2LmMgYi9kcml2ZXJzL25ldC9peHAyMDAwL2l4cGRldi5jCmluZGV4IDEyNzI0MzQuLjlhZWUwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4cDIwMDAvaXhwZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaXhwMjAwMC9peHBkZXYuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgIml4cDI0MDBfdHgudWNvZGUiCiAjaW5jbHVkZSAiaXhwZGV2X3ByaXYuaCIKICNpbmNsdWRlICJpeHBkZXYuaCIKKyNpbmNsdWRlICJwbTMzODYuaCIKIAogI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjAuMiIKIApAQCAtMjcxLDYgKzI3MiwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKml4cGRldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXhwZGV2X3ByaXYgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXBtMzM4Nl9nZXRfc3RhdHMoaXAtPmNoYW5uZWwsICYoZGV2LT5zdGF0cykpOworCisJcmV0dXJuICYoZGV2LT5zdGF0cyk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaXhwZGV2X25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IGl4cGRldl9vcGVuLAogCS5uZG9fc3RvcAkJPSBpeHBkZXZfY2xvc2UsCkBAIC0yNzgsNiArMjg4LDcgQEAKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb19nZXRfc3RhdHMJCT0gaXhwZGV2X2dldF9zdGF0cywKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gaXhwZGV2X3BvbGxfY29udHJvbGxlciwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQva3M4ODUxLmMgYi9kcml2ZXJzL25ldC9rczg4NTEuYwppbmRleCAyMzc4MzU4Li5hMjNmNzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9rczg4NTEuYworKysgYi9kcml2ZXJzL25ldC9rczg4NTEuYwpAQCAtMTcxLDYgKzE3MSwzNiBAQAogfQogCiAvKioKKyAqIGtzODg1MV93cnJlZzggLSB3cml0ZSA4Yml0IHJlZ2lzdGVyIHZhbHVlIHRvIGNoaXAKKyAqIEBrczogVGhlIGNoaXAgc3RhdGUKKyAqIEByZWc6IFRoZSByZWdpc3RlciBhZGRyZXNzCisgKiBAdmFsOiBUaGUgdmFsdWUgdG8gd3JpdGUKKyAqCisgKiBJc3N1ZSBhIHdyaXRlIHRvIHB1dCB0aGUgdmFsdWUgQHZhbCBpbnRvIHRoZSByZWdpc3RlciBzcGVjaWZpZWQgaW4gQHJlZy4KKyAqLworc3RhdGljIHZvaWQga3M4ODUxX3dycmVnOChzdHJ1Y3Qga3M4ODUxX25ldCAqa3MsIHVuc2lnbmVkIHJlZywgdW5zaWduZWQgdmFsKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIgPSAma3MtPnNwaV94ZmVyMTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9ICZrcy0+c3BpX21zZzE7CisJX19sZTE2IHR4YlsyXTsKKwlpbnQgcmV0OworCWludCBiaXQ7CisKKwliaXQgPSAxIDw8IChyZWcgJiAzKTsKKworCXR4YlswXSA9IGNwdV90b19sZTE2KE1LX09QKGJpdCwgcmVnKSB8IEtTX1NQSU9QX1dSKTsKKwl0eGJbMV0gPSB2YWw7CisKKwl4ZmVyLT50eF9idWYgPSB0eGI7CisJeGZlci0+cnhfYnVmID0gTlVMTDsKKwl4ZmVyLT5sZW4gPSAzOworCisJcmV0ID0gc3BpX3N5bmMoa3MtPnNwaWRldiwgbXNnKTsKKwlpZiAocmV0IDwgMCkKKwkJa3NfZXJyKGtzLCAic3BpX3N5bmMoKSBmYWlsZWRcbiIpOworfQorCisvKioKICAqIGtzODg1MV9yeF8xbXNnIC0gc2VsZWN0IHdoZXRoZXIgdG8gdXNlIG9uZSBvciB0d28gbWVzc2FnZXMgZm9yIHNwaSByZWFkCiAgKiBAa3M6IFRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKgpAQCAtMzIyLDEzICszNTIsMTIgQEAKIHN0YXRpYyBpbnQga3M4ODUxX3dyaXRlX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGtzODg1MV9uZXQgKmtzID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MTYgKm1jcCA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCWludCBpOwogCiAJbXV0ZXhfbG9jaygma3MtPmxvY2spOwogCi0Ja3M4ODUxX3dycmVnMTYoa3MsIEtTX01BUkwsIG1jcFswXSk7Ci0Ja3M4ODUxX3dycmVnMTYoa3MsIEtTX01BUk0sIG1jcFsxXSk7Ci0Ja3M4ODUxX3dycmVnMTYoa3MsIEtTX01BUkgsIG1jcFsyXSk7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCWtzODg1MV93cnJlZzgoa3MsIEtTX01BUihpKSwgZGV2LT5kZXZfYWRkcltpXSk7CiAKIAltdXRleF91bmxvY2soJmtzLT5sb2NrKTsKIApAQCAtOTUxLDcgKzk4MCw3IEBACiAJCQltY3B0ciA9IG1jcHRyLT5uZXh0OwogCQl9CiAKLQkJcnhjdHJsLnJ4Y3IxID0gUlhDUjFfUlhNRSB8IFJYQ1IxX1JYQUUgfCBSWENSMV9SWFBBRk1BOworCQlyeGN0cmwucnhjcjEgPSBSWENSMV9SWE1FIHwgUlhDUjFfUlhQQUZNQTsKIAl9IGVsc2UgewogCQkvKiBqdXN0IGFjY2VwdCBicm9hZGNhc3QgLyB1bmljYXN0ICovCiAJCXJ4Y3RybC5yeGNyMSA9IFJYQ1IxX1JYUEFGTUE7CkBAIC0xMjM5LDYgKzEyNjgsOSBAQAogCW5kZXYtPm5ldGRldl9vcHMgPSAma3M4ODUxX25ldGRldl9vcHM7CiAJbmRldi0+aXJxID0gc3BpLT5pcnE7CiAKKwkvKiBpc3N1ZSBhIGdsb2JhbCBzb2Z0IHJlc2V0IHRvIHJlc2V0IHRoZSBkZXZpY2UuICovCisJa3M4ODUxX3NvZnRfcmVzZXQoa3MsIEdSUl9HU1IpOworCiAJLyogc2ltcGxlIGNoZWNrIGZvciBhIHZhbGlkIGNoaXAgYmVpbmcgY29ubmVjdGVkIHRvIHRoZSBidXMgKi8KIAogCWlmICgoa3M4ODUxX3JkcmVnMTYoa3MsIEtTX0NJREVSKSAmIH5DSURFUl9SRVZfTUFTSykgIT0gQ0lERVJfSUQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2tzODg1MS5oIGIvZHJpdmVycy9uZXQva3M4ODUxLmgKaW5kZXggODVhYmUxNC4uZjUyYzMxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQva3M4ODUxLmgKKysrIGIvZHJpdmVycy9uZXQva3M4ODUxLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNkZWZpbmUgQ0NSXzMyUElOCQkJCSgxIDw8IDApCiAKIC8qIE1BQyBhZGRyZXNzIHJlZ2lzdGVycyAqLworI2RlZmluZSBLU19NQVIoX20pCQkJCTB4MTUgLSAoX20pCiAjZGVmaW5lIEtTX01BUkwJCQkJCTB4MTAKICNkZWZpbmUgS1NfTUFSTQkJCQkJMHgxMgogI2RlZmluZSBLU19NQVJICQkJCQkweDE0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9rczg4NTFfbWxsLmMgYi9kcml2ZXJzL25ldC9rczg4NTFfbWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlMTRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2tzODg1MV9tbGwuYwpAQCAtMCwwICsxLDE2OTcgQEAKKy8qKgorICogZHJpdmVycy9uZXQva3M4ODUxX21sbC5jCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWljcmVsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKioKKyAqIFN1cHBvcnRzOgorICogS1M4ODUxIDE2Yml0IE1MTCBjaGlwIGZyb20gTWljcmVsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUJRFJWX05BTUUJImtzODg1MV9tbGwiCisKK3N0YXRpYyB1OCBLU19ERUZBVUxUX01BQ19BRERSRVNTW10gPSB7IDB4MDAsIDB4MTAsIDB4QTEsIDB4ODYsIDB4OTUsIDB4MTEgfTsKKyNkZWZpbmUgTUFYX1JFQ1ZfRlJBTUVTCQkJMzIKKyNkZWZpbmUgTUFYX0JVRl9TSVpFCQkJMjA0OAorI2RlZmluZSBUWF9CVUZfU0laRQkJCTIwMDAKKyNkZWZpbmUgUlhfQlVGX1NJWkUJCQkyMDAwCisKKyNkZWZpbmUgS1NfQ0NSCQkJCTB4MDgKKyNkZWZpbmUgQ0NSX0VFUFJPTQkJCSgxIDw8IDkpCisjZGVmaW5lIENDUl9TUEkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgQ0NSXzhCSVQJCQkoMSA8PCA3KQorI2RlZmluZSBDQ1JfMTZCSVQJCQkoMSA8PCA2KQorI2RlZmluZSBDQ1JfMzJCSVQJCQkoMSA8PCA1KQorI2RlZmluZSBDQ1JfU0hBUkVECQkJKDEgPDwgNCkKKyNkZWZpbmUgQ0NSXzMyUElOCQkJKDEgPDwgMCkKKworLyogTUFDIGFkZHJlc3MgcmVnaXN0ZXJzICovCisjZGVmaW5lIEtTX01BUkwJCQkJMHgxMAorI2RlZmluZSBLU19NQVJNCQkJCTB4MTIKKyNkZWZpbmUgS1NfTUFSSAkJCQkweDE0CisKKyNkZWZpbmUgS1NfT0JDUgkJCQkweDIwCisjZGVmaW5lIE9CQ1JfT0RTXzE2TUEJCQkoMSA8PCA2KQorCisjZGVmaW5lIEtTX0VFUENSCQkJMHgyMgorI2RlZmluZSBFRVBDUl9FRVNBCQkJKDEgPDwgNCkKKyNkZWZpbmUgRUVQQ1JfRUVTQgkJCSgxIDw8IDMpCisjZGVmaW5lIEVFUENSX0VFRE8JCQkoMSA8PCAyKQorI2RlZmluZSBFRVBDUl9FRVNDSwkJCSgxIDw8IDEpCisjZGVmaW5lIEVFUENSX0VFQ1MJCQkoMSA8PCAwKQorCisjZGVmaW5lIEtTX01CSVIJCQkJMHgyNAorI2RlZmluZSBNQklSX1RYTUJGCQkJKDEgPDwgMTIpCisjZGVmaW5lIE1CSVJfVFhNQkZBCQkJKDEgPDwgMTEpCisjZGVmaW5lIE1CSVJfUlhNQkYJCQkoMSA8PCA0KQorI2RlZmluZSBNQklSX1JYTUJGQQkJCSgxIDw8IDMpCisKKyNkZWZpbmUgS1NfR1JSCQkJCTB4MjYKKyNkZWZpbmUgR1JSX1FNVQkJCQkoMSA8PCAxKQorI2RlZmluZSBHUlJfR1NSCQkJCSgxIDw8IDApCisKKyNkZWZpbmUgS1NfV0ZDUgkJCQkweDJBCisjZGVmaW5lIFdGQ1JfTVBSWEUJCQkoMSA8PCA3KQorI2RlZmluZSBXRkNSX1dGM0UJCQkoMSA8PCAzKQorI2RlZmluZSBXRkNSX1dGMkUJCQkoMSA8PCAyKQorI2RlZmluZSBXRkNSX1dGMUUJCQkoMSA8PCAxKQorI2RlZmluZSBXRkNSX1dGMEUJCQkoMSA8PCAwKQorCisjZGVmaW5lIEtTX1dGMENSQzAJCQkweDMwCisjZGVmaW5lIEtTX1dGMENSQzEJCQkweDMyCisjZGVmaW5lIEtTX1dGMEJNMAkJCTB4MzQKKyNkZWZpbmUgS1NfV0YwQk0xCQkJMHgzNgorI2RlZmluZSBLU19XRjBCTTIJCQkweDM4CisjZGVmaW5lIEtTX1dGMEJNMwkJCTB4M0EKKworI2RlZmluZSBLU19XRjFDUkMwCQkJMHg0MAorI2RlZmluZSBLU19XRjFDUkMxCQkJMHg0MgorI2RlZmluZSBLU19XRjFCTTAJCQkweDQ0CisjZGVmaW5lIEtTX1dGMUJNMQkJCTB4NDYKKyNkZWZpbmUgS1NfV0YxQk0yCQkJMHg0OAorI2RlZmluZSBLU19XRjFCTTMJCQkweDRBCisKKyNkZWZpbmUgS1NfV0YyQ1JDMAkJCTB4NTAKKyNkZWZpbmUgS1NfV0YyQ1JDMQkJCTB4NTIKKyNkZWZpbmUgS1NfV0YyQk0wCQkJMHg1NAorI2RlZmluZSBLU19XRjJCTTEJCQkweDU2CisjZGVmaW5lIEtTX1dGMkJNMgkJCTB4NTgKKyNkZWZpbmUgS1NfV0YyQk0zCQkJMHg1QQorCisjZGVmaW5lIEtTX1dGM0NSQzAJCQkweDYwCisjZGVmaW5lIEtTX1dGM0NSQzEJCQkweDYyCisjZGVmaW5lIEtTX1dGM0JNMAkJCTB4NjQKKyNkZWZpbmUgS1NfV0YzQk0xCQkJMHg2NgorI2RlZmluZSBLU19XRjNCTTIJCQkweDY4CisjZGVmaW5lIEtTX1dGM0JNMwkJCTB4NkEKKworI2RlZmluZSBLU19UWENSCQkJCTB4NzAKKyNkZWZpbmUgVFhDUl9UQ0dJQ01QCQkJKDEgPDwgOCkKKyNkZWZpbmUgVFhDUl9UQ0dVRFAJCQkoMSA8PCA3KQorI2RlZmluZSBUWENSX1RDR1RDUAkJCSgxIDw8IDYpCisjZGVmaW5lIFRYQ1JfVENHSVAJCQkoMSA8PCA1KQorI2RlZmluZSBUWENSX0ZUWFEJCQkoMSA8PCA0KQorI2RlZmluZSBUWENSX1RYRkNFCQkJKDEgPDwgMykKKyNkZWZpbmUgVFhDUl9UWFBFCQkJKDEgPDwgMikKKyNkZWZpbmUgVFhDUl9UWENSQwkJCSgxIDw8IDEpCisjZGVmaW5lIFRYQ1JfVFhFCQkJKDEgPDwgMCkKKworI2RlZmluZSBLU19UWFNSCQkJCTB4NzIKKyNkZWZpbmUgVFhTUl9UWExDCQkJKDEgPDwgMTMpCisjZGVmaW5lIFRYU1JfVFhNQwkJCSgxIDw8IDEyKQorI2RlZmluZSBUWFNSX1RYRklEX01BU0sJCQkoMHgzZiA8PCAwKQorI2RlZmluZSBUWFNSX1RYRklEX1NISUZUCQkoMCkKKyNkZWZpbmUgVFhTUl9UWEZJRF9HRVQoX3YpCQkoKChfdikgPj4gMCkgJiAweDNmKQorCisKKyNkZWZpbmUgS1NfUlhDUjEJCQkweDc0CisjZGVmaW5lIFJYQ1IxX0ZSWFEJCQkoMSA8PCAxNSkKKyNkZWZpbmUgUlhDUjFfUlhVRFBGQ0MJCQkoMSA8PCAxNCkKKyNkZWZpbmUgUlhDUjFfUlhUQ1BGQ0MJCQkoMSA8PCAxMykKKyNkZWZpbmUgUlhDUjFfUlhJUEZDQwkJCSgxIDw8IDEyKQorI2RlZmluZSBSWENSMV9SWFBBRk1BCQkJKDEgPDwgMTEpCisjZGVmaW5lIFJYQ1IxX1JYRkNFCQkJKDEgPDwgMTApCisjZGVmaW5lIFJYQ1IxX1JYRUZFCQkJKDEgPDwgOSkKKyNkZWZpbmUgUlhDUjFfUlhNQUZNQQkJCSgxIDw8IDgpCisjZGVmaW5lIFJYQ1IxX1JYQkUJCQkoMSA8PCA3KQorI2RlZmluZSBSWENSMV9SWE1FCQkJKDEgPDwgNikKKyNkZWZpbmUgUlhDUjFfUlhVRQkJCSgxIDw8IDUpCisjZGVmaW5lIFJYQ1IxX1JYQUUJCQkoMSA8PCA0KQorI2RlZmluZSBSWENSMV9SWElOVkYJCQkoMSA8PCAxKQorI2RlZmluZSBSWENSMV9SWEUJCQkoMSA8PCAwKQorI2RlZmluZSBSWENSMV9GSUxURVJfTUFTSyAgICAJCShSWENSMV9SWElOVkYgfCBSWENSMV9SWEFFIHwgXAorCQkJCQkgUlhDUjFfUlhNQUZNQSB8IFJYQ1IxX1JYUEFGTUEpCisKKyNkZWZpbmUgS1NfUlhDUjIJCQkweDc2CisjZGVmaW5lIFJYQ1IyX1NSREJMX01BU0sJCSgweDcgPDwgNSkKKyNkZWZpbmUgUlhDUjJfU1JEQkxfU0hJRlQJCSg1KQorI2RlZmluZSBSWENSMl9TUkRCTF80QgkJCSgweDAgPDwgNSkKKyNkZWZpbmUgUlhDUjJfU1JEQkxfOEIJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJYQ1IyX1NSREJMXzE2QgkJCSgweDIgPDwgNSkKKyNkZWZpbmUgUlhDUjJfU1JEQkxfMzJCCQkJKDB4MyA8PCA1KQorLyogI2RlZmluZSBSWENSMl9TUkRCTF9GUkFNRQkJKDB4NCA8PCA1KSAqLworI2RlZmluZSBSWENSMl9JVUZGUAkJCSgxIDw8IDQpCisjZGVmaW5lIFJYQ1IyX1JYSVVGQ0VaCQkJKDEgPDwgMykKKyNkZWZpbmUgUlhDUjJfVURQTEZFCQkJKDEgPDwgMikKKyNkZWZpbmUgUlhDUjJfUlhJQ01QRkNDCQkJKDEgPDwgMSkKKyNkZWZpbmUgUlhDUjJfUlhTQUYJCQkoMSA8PCAwKQorCisjZGVmaW5lIEtTX1RYTUlSCQkJMHg3OAorCisjZGVmaW5lIEtTX1JYRkhTUgkJCTB4N0MKKyNkZWZpbmUgUlhGU0hSX1JYRlYJCQkoMSA8PCAxNSkKKyNkZWZpbmUgUlhGU0hSX1JYSUNNUEZDUwkJKDEgPDwgMTMpCisjZGVmaW5lIFJYRlNIUl9SWElQRkNTCQkJKDEgPDwgMTIpCisjZGVmaW5lIFJYRlNIUl9SWFRDUEZDUwkJCSgxIDw8IDExKQorI2RlZmluZSBSWEZTSFJfUlhVRFBGQ1MJCQkoMSA8PCAxMCkKKyNkZWZpbmUgUlhGU0hSX1JYQkYJCQkoMSA8PCA3KQorI2RlZmluZSBSWEZTSFJfUlhNRgkJCSgxIDw8IDYpCisjZGVmaW5lIFJYRlNIUl9SWFVGCQkJKDEgPDwgNSkKKyNkZWZpbmUgUlhGU0hSX1JYTVIJCQkoMSA8PCA0KQorI2RlZmluZSBSWEZTSFJfUlhGVAkJCSgxIDw8IDMpCisjZGVmaW5lIFJYRlNIUl9SWEZUTAkJCSgxIDw8IDIpCisjZGVmaW5lIFJYRlNIUl9SWFJGCQkJKDEgPDwgMSkKKyNkZWZpbmUgUlhGU0hSX1JYQ0UJCQkoMSA8PCAwKQorI2RlZmluZQlSWEZTSFJfRVJSCQkJKFJYRlNIUl9SWENFIHwgUlhGU0hSX1JYUkYgfFwKKwkJCQkJUlhGU0hSX1JYRlRMIHwgUlhGU0hSX1JYTVIgfFwKKwkJCQkJUlhGU0hSX1JYSUNNUEZDUyB8IFJYRlNIUl9SWElQRkNTIHxcCisJCQkJCVJYRlNIUl9SWFRDUEZDUykKKyNkZWZpbmUgS1NfUlhGSEJDUgkJCTB4N0UKKyNkZWZpbmUgUlhGSEJDUl9DTlRfTUFTSwkJMHgwRkZGCisKKyNkZWZpbmUgS1NfVFhRQ1IJCQkweDgwCisjZGVmaW5lIFRYUUNSX0FFVEZFCQkJKDEgPDwgMikKKyNkZWZpbmUgVFhRQ1JfVFhRTUFNCQkJKDEgPDwgMSkKKyNkZWZpbmUgVFhRQ1JfTUVURkUJCQkoMSA8PCAwKQorCisjZGVmaW5lIEtTX1JYUUNSCQkJMHg4MgorI2RlZmluZSBSWFFDUl9SWERUVFMJCQkoMSA8PCAxMikKKyNkZWZpbmUgUlhRQ1JfUlhEQkNUUwkJCSgxIDw8IDExKQorI2RlZmluZSBSWFFDUl9SWEZDVFMJCQkoMSA8PCAxMCkKKyNkZWZpbmUgUlhRQ1JfUlhJUEhUT0UJCQkoMSA8PCA5KQorI2RlZmluZSBSWFFDUl9SWERUVEUJCQkoMSA8PCA3KQorI2RlZmluZSBSWFFDUl9SWERCQ1RFCQkJKDEgPDwgNikKKyNkZWZpbmUgUlhRQ1JfUlhGQ1RFCQkJKDEgPDwgNSkKKyNkZWZpbmUgUlhRQ1JfQURSRkUJCQkoMSA8PCA0KQorI2RlZmluZSBSWFFDUl9TREEJCQkoMSA8PCAzKQorI2RlZmluZSBSWFFDUl9SUlhFRgkJCSgxIDw8IDApCisjZGVmaW5lIFJYUUNSX0NNRF9DTlRMICAgICAgICAgICAgICAgIAkoUlhRQ1JfUlhGQ1RFfFJYUUNSX0FEUkZFKQorCisjZGVmaW5lIEtTX1RYRkRQUgkJCTB4ODQKKyNkZWZpbmUgVFhGRFBSX1RYRlBBSQkJCSgxIDw8IDE0KQorI2RlZmluZSBUWEZEUFJfVFhGUF9NQVNLCQkoMHg3ZmYgPDwgMCkKKyNkZWZpbmUgVFhGRFBSX1RYRlBfU0hJRlQJCSgwKQorCisjZGVmaW5lIEtTX1JYRkRQUgkJCTB4ODYKKyNkZWZpbmUgUlhGRFBSX1JYRlBBSQkJCSgxIDw8IDE0KQorCisjZGVmaW5lIEtTX1JYRFRUUgkJCTB4OEMKKyNkZWZpbmUgS1NfUlhEQkNUUgkJCTB4OEUKKworI2RlZmluZSBLU19JRVIJCQkJMHg5MAorI2RlZmluZSBLU19JU1IJCQkJMHg5MgorI2RlZmluZSBJUlFfTENJCQkJCSgxIDw8IDE1KQorI2RlZmluZSBJUlFfVFhJCQkJCSgxIDw8IDE0KQorI2RlZmluZSBJUlFfUlhJCQkJCSgxIDw8IDEzKQorI2RlZmluZSBJUlFfUlhPSQkJCSgxIDw8IDExKQorI2RlZmluZSBJUlFfVFhQU0kJCQkoMSA8PCA5KQorI2RlZmluZSBJUlFfUlhQU0kJCQkoMSA8PCA4KQorI2RlZmluZSBJUlFfVFhTQUkJCQkoMSA8PCA2KQorI2RlZmluZSBJUlFfUlhXRkRJCQkJKDEgPDwgNSkKKyNkZWZpbmUgSVJRX1JYTVBESQkJCSgxIDw8IDQpCisjZGVmaW5lIElSUV9MREkJCQkJKDEgPDwgMykKKyNkZWZpbmUgSVJRX0VESQkJCQkoMSA8PCAyKQorI2RlZmluZSBJUlFfU1BJQkVJCQkJKDEgPDwgMSkKKyNkZWZpbmUgSVJRX0RFREkJCQkoMSA8PCAwKQorCisjZGVmaW5lIEtTX1JYRkNUUgkJCTB4OUMKKyNkZWZpbmUgUlhGQ1RSX1RIUkVTSE9MRF9NQVNLICAgICAJMHgwMEZGCisKKyNkZWZpbmUgS1NfUlhGQwkJCQkweDlECisjZGVmaW5lIFJYRkNUUl9SWEZDX01BU0sJCSgweGZmIDw8IDgpCisjZGVmaW5lIFJYRkNUUl9SWEZDX1NISUZUCQkoOCkKKyNkZWZpbmUgUlhGQ1RSX1JYRkNfR0VUKF92KQkJKCgoX3YpID4+IDgpICYgMHhmZikKKyNkZWZpbmUgUlhGQ1RSX1JYRkNUX01BU0sJCSgweGZmIDw8IDApCisjZGVmaW5lIFJYRkNUUl9SWEZDVF9TSElGVAkJKDApCisKKyNkZWZpbmUgS1NfVFhOVEZTUgkJCTB4OUUKKworI2RlZmluZSBLU19NQUhUUjAJCQkweEEwCisjZGVmaW5lIEtTX01BSFRSMQkJCTB4QTIKKyNkZWZpbmUgS1NfTUFIVFIyCQkJMHhBNAorI2RlZmluZSBLU19NQUhUUjMJCQkweEE2CisKKyNkZWZpbmUgS1NfRkNMV1IJCQkweEIwCisjZGVmaW5lIEtTX0ZDSFdSCQkJMHhCMgorI2RlZmluZSBLU19GQ09XUgkJCTB4QjQKKworI2RlZmluZSBLU19DSURFUgkJCTB4QzAKKyNkZWZpbmUgQ0lERVJfSUQJCQkweDg4NzAKKyNkZWZpbmUgQ0lERVJfUkVWX01BU0sJCQkoMHg3IDw8IDEpCisjZGVmaW5lIENJREVSX1JFVl9TSElGVAkJCSgxKQorI2RlZmluZSBDSURFUl9SRVZfR0VUKF92KQkJKCgoX3YpID4+IDEpICYgMHg3KQorCisjZGVmaW5lIEtTX0NHQ1IJCQkJMHhDNgorI2RlZmluZSBLU19JQUNSCQkJCTB4QzgKKyNkZWZpbmUgSUFDUl9SREVOCQkJKDEgPDwgMTIpCisjZGVmaW5lIElBQ1JfVFNFTF9NQVNLCQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgSUFDUl9UU0VMX1NISUZUCQkJKDEwKQorI2RlZmluZSBJQUNSX1RTRUxfTUlCCQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgSUFDUl9BRERSX01BU0sJCQkoMHgxZiA8PCAwKQorI2RlZmluZSBJQUNSX0FERFJfU0hJRlQJCQkoMCkKKworI2RlZmluZSBLU19JQURMUgkJCTB4RDAKKyNkZWZpbmUgS1NfSUFIRFIJCQkweEQyCisKKyNkZWZpbmUgS1NfUE1FQ1IJCQkweEQ0CisjZGVmaW5lIFBNRUNSX1BNRV9ERUxBWQkJCSgxIDw8IDE0KQorI2RlZmluZSBQTUVDUl9QTUVfUE9MCQkJKDEgPDwgMTIpCisjZGVmaW5lIFBNRUNSX1dPTF9XQUtFVVAJCSgxIDw8IDExKQorI2RlZmluZSBQTUVDUl9XT0xfTUFHSUNQS1QJCSgxIDw8IDEwKQorI2RlZmluZSBQTUVDUl9XT0xfTElOS1VQCQkoMSA8PCA5KQorI2RlZmluZSBQTUVDUl9XT0xfRU5FUkdZCQkoMSA8PCA4KQorI2RlZmluZSBQTUVDUl9BVVRPX1dBS0VfRU4JCSgxIDw8IDcpCisjZGVmaW5lIFBNRUNSX1dBS0VVUF9OT1JNQUwJCSgxIDw8IDYpCisjZGVmaW5lIFBNRUNSX1dLRVZUX01BU0sJCSgweGYgPDwgMikKKyNkZWZpbmUgUE1FQ1JfV0tFVlRfU0hJRlQJCSgyKQorI2RlZmluZSBQTUVDUl9XS0VWVF9HRVQoX3YpCQkoKChfdikgPj4gMikgJiAweGYpCisjZGVmaW5lIFBNRUNSX1dLRVZUX0VORVJHWQkJKDB4MSA8PCAyKQorI2RlZmluZSBQTUVDUl9XS0VWVF9MSU5LCQkoMHgyIDw8IDIpCisjZGVmaW5lIFBNRUNSX1dLRVZUX01BR0lDUEtUCQkoMHg0IDw8IDIpCisjZGVmaW5lIFBNRUNSX1dLRVZUX0ZSQU1FCQkoMHg4IDw8IDIpCisjZGVmaW5lIFBNRUNSX1BNX01BU0sJCQkoMHgzIDw8IDApCisjZGVmaW5lIFBNRUNSX1BNX1NISUZUCQkJKDApCisjZGVmaW5lIFBNRUNSX1BNX05PUk1BTAkJCSgweDAgPDwgMCkKKyNkZWZpbmUgUE1FQ1JfUE1fRU5FUkdZCQkJKDB4MSA8PCAwKQorI2RlZmluZSBQTUVDUl9QTV9TT0ZURE9XTgkJKDB4MiA8PCAwKQorI2RlZmluZSBQTUVDUl9QTV9QT1dFUlNBVkUJCSgweDMgPDwgMCkKKworLyogU3RhbmRhcmQgTUlJIFBIWSBkYXRhICovCisjZGVmaW5lIEtTX1AxTUJDUgkJCTB4RTQKKyNkZWZpbmUgUDFNQkNSX0ZPUkNFX0ZEWAkJKDEgPDwgOCkKKworI2RlZmluZSBLU19QMU1CU1IJCQkweEU2CisjZGVmaW5lIFAxTUJTUl9BTl9DT01QTEVURQkJKDEgPDwgNSkKKyNkZWZpbmUgUDFNQlNSX0FOX0NBUEFCTEUJCSgxIDw8IDMpCisjZGVmaW5lIFAxTUJTUl9MSU5LX1VQCQkJKDEgPDwgMikKKworI2RlZmluZSBLU19QSFkxSUxSCQkJMHhFOAorI2RlZmluZSBLU19QSFkxSUhSCQkJMHhFQQorI2RlZmluZSBLU19QMUFOQVIJCQkweEVDCisjZGVmaW5lIEtTX1AxQU5MUFIJCQkweEVFCisKKyNkZWZpbmUgS1NfUDFTQ0xNRAkJCTB4RjQKKyNkZWZpbmUgUDFTQ0xNRF9MRURPRkYJCQkoMSA8PCAxNSkKKyNkZWZpbmUgUDFTQ0xNRF9UWElEUwkJCSgxIDw8IDE0KQorI2RlZmluZSBQMVNDTE1EX1JFU1RBUlRBTgkJKDEgPDwgMTMpCisjZGVmaW5lIFAxU0NMTURfRElTQVVUT01ESVgJCSgxIDw8IDEwKQorI2RlZmluZSBQMVNDTE1EX0ZPUkNFTURJWAkJKDEgPDwgOSkKKyNkZWZpbmUgUDFTQ0xNRF9BVVRPTkVHRU4JCSgxIDw8IDcpCisjZGVmaW5lIFAxU0NMTURfRk9SQ0UxMDAJCSgxIDw8IDYpCisjZGVmaW5lIFAxU0NMTURfRk9SQ0VGRFgJCSgxIDw8IDUpCisjZGVmaW5lIFAxU0NMTURfQURWX0ZMT1cJCSgxIDw8IDQpCisjZGVmaW5lIFAxU0NMTURfQURWXzEwMEJUX0ZEWAkJKDEgPDwgMykKKyNkZWZpbmUgUDFTQ0xNRF9BRFZfMTAwQlRfSERYCQkoMSA8PCAyKQorI2RlZmluZSBQMVNDTE1EX0FEVl8xMEJUX0ZEWAkJKDEgPDwgMSkKKyNkZWZpbmUgUDFTQ0xNRF9BRFZfMTBCVF9IRFgJCSgxIDw8IDApCisKKyNkZWZpbmUgS1NfUDFDUgkJCQkweEY2CisjZGVmaW5lIFAxQ1JfSFBfTURJWAkJCSgxIDw8IDE1KQorI2RlZmluZSBQMUNSX1JFVl9QT0wJCQkoMSA8PCAxMykKKyNkZWZpbmUgUDFDUl9PUF8xMDBNCQkJKDEgPDwgMTApCisjZGVmaW5lIFAxQ1JfT1BfRkRYCQkJKDEgPDwgOSkKKyNkZWZpbmUgUDFDUl9PUF9NREkJCQkoMSA8PCA3KQorI2RlZmluZSBQMUNSX0FOX0RPTkUJCQkoMSA8PCA2KQorI2RlZmluZSBQMUNSX0xJTktfR09PRAkJCSgxIDw8IDUpCisjZGVmaW5lIFAxQ1JfUE5UUl9GTE9XCQkJKDEgPDwgNCkKKyNkZWZpbmUgUDFDUl9QTlRSXzEwMEJUX0ZEWAkJKDEgPDwgMykKKyNkZWZpbmUgUDFDUl9QTlRSXzEwMEJUX0hEWAkJKDEgPDwgMikKKyNkZWZpbmUgUDFDUl9QTlRSXzEwQlRfRkRYCQkoMSA8PCAxKQorI2RlZmluZSBQMUNSX1BOVFJfMTBCVF9IRFgJCSgxIDw8IDApCisKKy8qIFRYIEZyYW1lIGNvbnRyb2wgKi8KKworI2RlZmluZSBUWEZSX1RYSUMJCQkoMSA8PCAxNSkKKyNkZWZpbmUgVFhGUl9UWEZJRF9NQVNLCQkJKDB4M2YgPDwgMCkKKyNkZWZpbmUgVFhGUl9UWEZJRF9TSElGVAkJKDApCisKKyNkZWZpbmUgS1NfUDFTUgkJCQkweEY4CisjZGVmaW5lIFAxU1JfSFBfTURJWAkJCSgxIDw8IDE1KQorI2RlZmluZSBQMVNSX1JFVl9QT0wJCQkoMSA8PCAxMykKKyNkZWZpbmUgUDFTUl9PUF8xMDBNCQkJKDEgPDwgMTApCisjZGVmaW5lIFAxU1JfT1BfRkRYCQkJKDEgPDwgOSkKKyNkZWZpbmUgUDFTUl9PUF9NREkJCQkoMSA8PCA3KQorI2RlZmluZSBQMVNSX0FOX0RPTkUJCQkoMSA8PCA2KQorI2RlZmluZSBQMVNSX0xJTktfR09PRAkJCSgxIDw8IDUpCisjZGVmaW5lIFAxU1JfUE5UUl9GTE9XCQkJKDEgPDwgNCkKKyNkZWZpbmUgUDFTUl9QTlRSXzEwMEJUX0ZEWAkJKDEgPDwgMykKKyNkZWZpbmUgUDFTUl9QTlRSXzEwMEJUX0hEWAkJKDEgPDwgMikKKyNkZWZpbmUgUDFTUl9QTlRSXzEwQlRfRkRYCQkoMSA8PCAxKQorI2RlZmluZSBQMVNSX1BOVFJfMTBCVF9IRFgJCSgxIDw8IDApCisKKyNkZWZpbmUJRU5VTV9CVVNfTk9ORQkJCTAKKyNkZWZpbmUJRU5VTV9CVVNfOEJJVAkJCTEKKyNkZWZpbmUJRU5VTV9CVVNfMTZCSVQJCQkyCisjZGVmaW5lCUVOVU1fQlVTXzMyQklUCQkJMworCisjZGVmaW5lIE1BWF9NQ0FTVF9MU1QJCQkzMgorI2RlZmluZSBIV19NQ0FTVF9TSVpFCQkJOAorI2RlZmluZSBNQUNfQUREUl9MRU4JCQk2CisKKy8qKgorICogdW5pb24ga3NfdHhfaGRyIC0gdHggaGVhZGVyIGRhdGEKKyAqIEB0eGI6IFRoZSBoZWFkZXIgYXMgYnl0ZXMKKyAqIEB0eHc6IFRoZSBoZWFkZXIgYXMgMTZiaXQsIGxpdHRsZS1lbmRpYW4gd29yZHMKKyAqCisgKiBBIGR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR4IGhlYWRlciBkYXRhIHRvIGFsbG93CisgKiBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBieXRlcywgYW5kIHRvIGFsbG93IDE2Yml0IGFjY2Vzc2VzCisgKiB3aXRoIDE2Yml0IGFsaWdubWVudC4KKyAqLwordW5pb24ga3NfdHhfaGRyIHsKKwl1OCAgICAgIHR4Yls0XTsKKwlfX2xlMTYgIHR4d1syXTsKK307CisKKy8qKgorICogc3RydWN0IGtzX25ldCAtIEtTODg1MSBkcml2ZXIgcHJpdmF0ZSBkYXRhCisgKiBAbmV0X2RldmljZSAJOiBUaGUgbmV0d29yayBkZXZpY2Ugd2UncmUgYm91bmQgdG8KKyAqIEBod19hZGRyCTogc3RhcnQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyLgorICogQGh3X2FkZHJfY21kCTogc3RhcnQgYWRkcmVzcyBvZiBjb21tYW5kIHJlZ2lzdGVyLgorICogQHR4aCAgICAJOiB0ZW1wb3JhbHkgYnVmZmVyIHRvIHNhdmUgc3RhdHVzL2xlbmd0aC4KKyAqIEBsb2NrCTogTG9jayB0byBlbnN1cmUgdGhhdCB0aGUgZGV2aWNlIGlzIG5vdCBhY2Nlc3NlZCB3aGVuIGJ1c3kuCisgKiBAcGRldgk6IFBvaW50ZXIgdG8gcGxhdGZvcm0gZGV2aWNlLgorICogQG1paQkJOiBUaGUgTUlJIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgbWlpIGNhbGxzLgorICogQGZyYW1lX2hlYWRfaW5mbyAgIAk6IGZyYW1lIGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgbXVsdGktcGt0IHJ4LgorICogQHN0YXRlbG9jawk6IExvY2sgb24gdGhpcyBzdHJ1Y3R1cmUgZm9yIHR4IGxpc3QuCisgKiBAbXNnX2VuYWJsZQk6IFRoZSBtZXNzYWdlIGZsYWdzIGNvbnRyb2xsaW5nIGRyaXZlciBvdXRwdXQgKHNlZSBldGh0b29sKS4KKyAqIEBmcmFtZV9jbnQgIAk6IG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQuCisgKiBAYnVzX3dpZHRoICAJOiBpL28gYnVzIHdpZHRoLgorICogQGlycSAgICAJOiBpcnEgbnVtYmVyIGFzc2lnbmVkIHRvIHRoaXMgZGV2aWNlLgorICogQHJjX3J4cWNyCTogQ2FjaGVkIGNvcHkgb2YgS1NfUlhRQ1IuCisgKiBAcmNfdHhjcgk6IENhY2hlZCBjb3B5IG9mIEtTX1RYQ1IuCisgKiBAcmNfaWVyCTogQ2FjaGVkIGNvcHkgb2YgS1NfSUVSLgorICogQHNoYXJlZGJ1cyAgCTogTXVsdGlwZXgoYWRkciBhbmQgZGF0YSBidXMpIG1vZGUgaW5kaWNhdG9yLgorICogQGNtZF9yZWdfY2FjaGUJOiBjb21tYW5kIHJlZ2lzdGVyIGNhY2hlZC4KKyAqIEBjbWRfcmVnX2NhY2hlX2ludAk6IGNvbW1hbmQgcmVnaXN0ZXIgY2FjaGVkLiBVc2VkIGluIHRoZSBpcnEgaGFuZGxlci4KKyAqIEBwcm9taXNjdW91cwk6IHByb21pc2N1b3VzIG1vZGUgaW5kaWNhdG9yLgorICogQGFsbF9tY2FzdCAgCTogbXV0bGljYXN0IGluZGljYXRvci4KKyAqIEBtY2FzdF9sc3Rfc2l6ZSAgIAk6IHNpemUgb2YgbXVsdGljYXN0IGxpc3QuCisgKiBAbWNhc3RfbHN0ICAgIAk6IG11bHRpY2FzdCBsaXN0LgorICogQG1jYXN0X2JpdHMgICAgCTogbXVsdGljYXN0IGVuYWJlZC4KKyAqIEBtYWNfYWRkciAgIAkJOiBNQUMgYWRkcmVzcyBhc3NpZ25lZCB0byB0aGlzIGRldmljZS4KKyAqIEBmaWQgICAgCQk6IGZyYW1lIGlkLgorICogQGV4dHJhX2J5dGUgICAgCTogbnVtYmVyIG9mIGV4dHJhIGJ5dGUgcHJlcGVuZGVkIHJ4IHBrdC4KKyAqIEBlbmFibGVkICAgIAkJOiBpbmRpY2F0b3IgdGhpcyBkZXZpY2Ugd29ya3MuCisgKgorICogVGhlIEBsb2NrIGVuc3VyZXMgdGhhdCB0aGUgY2hpcCBpcyBwcm90ZWN0ZWQgd2hlbiBjZXJ0YWluIG9wZXJhdGlvbnMgYXJlCisgKiBpbiBwcm9ncmVzcy4gV2hlbiB0aGUgcmVhZCBvciB3cml0ZSBwYWNrZXQgdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MsIG1vc3QKKyAqIG9mIHRoZSBjaGlwIHJlZ2lzdGVycyBhcmUgbm90IGFjY2Vzc2libGUgdW50aWwgdGhlIHRyYW5zZmVyIGlzIGZpbmlzaGVkIGFuZAorICogdGhlIERNQSBoYXMgYmVlbiBkZS1hc3NlcnRlZC4KKyAqCisgKiBUaGUgQHN0YXRlbG9jayBpcyB1c2VkIHRvIHByb3RlY3QgaW5mb3JtYXRpb24gaW4gdGhlIHN0cnVjdHVyZSB3aGljaCBtYXkKKyAqIG5lZWQgdG8gYmUgYWNjZXNzZWQgdmlhIHNldmVyYWwgc291cmNlcywgc3VjaCBhcyB0aGUgbmV0d29yayBkcml2ZXIgbGF5ZXIKKyAqIG9yIG9uZSBvZiB0aGUgd29yayBxdWV1ZXMuCisgKgorICovCisKKy8qIFJlY2VpdmUgbXVsdGlwbGV4IGZyYW1lciBoZWFkZXIgaW5mbyAqLworc3RydWN0IHR5cGVfZnJhbWVfaGVhZCB7CisJdTE2CXN0czsgICAgICAgICAvKiBGcmFtZSBzdGF0dXMgKi8KKwl1MTYJbGVuOyAgICAgICAgIC8qIEJ5dGUgY291bnQgKi8KK307CisKK3N0cnVjdCBrc19uZXQgeworCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRkZXY7CisJdm9pZCBfX2lvbWVtICAgIAkqaHdfYWRkcjsKKwl2b2lkIF9faW9tZW0gICAgCSpod19hZGRyX2NtZDsKKwl1bmlvbiBrc190eF9oZHIJCXR4aCBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IG11dGV4ICAgICAgCWxvY2s7IC8qIHNwaW5sb2NrIHRvIGJlIGludGVycnVwdCBzYWZlICovCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8JbWlpOworCXN0cnVjdCB0eXBlX2ZyYW1lX2hlYWQJKmZyYW1lX2hlYWRfaW5mbzsKKwlzcGlubG9ja190CQlzdGF0ZWxvY2s7CisJdTMyCQkJbXNnX2VuYWJsZTsKKwl1MzIJCQlmcmFtZV9jbnQ7CisJaW50CQkJYnVzX3dpZHRoOworCWludCAgICAgICAgICAgICAJaXJxOworCisJdTE2CQkJcmNfcnhxY3I7CisJdTE2CQkJcmNfdHhjcjsKKwl1MTYJCQlyY19pZXI7CisJdTE2CQkJc2hhcmVkYnVzOworCXUxNgkJCWNtZF9yZWdfY2FjaGU7CisJdTE2CQkJY21kX3JlZ19jYWNoZV9pbnQ7CisJdTE2CQkJcHJvbWlzY3VvdXM7CisJdTE2CQkJYWxsX21jYXN0OworCXUxNgkJCW1jYXN0X2xzdF9zaXplOworCXU4CQkJbWNhc3RfbHN0W01BWF9NQ0FTVF9MU1RdW01BQ19BRERSX0xFTl07CisJdTgJCQltY2FzdF9iaXRzW0hXX01DQVNUX1NJWkVdOworCXU4CQkJbWFjX2FkZHJbNl07CisJdTggICAgICAgICAgICAgICAgICAgICAgZmlkOworCXU4CQkJZXh0cmFfYnl0ZTsKKwl1OAkJCWVuYWJsZWQ7Cit9OworCitzdGF0aWMgaW50IG1zZ19lbmFibGU7CisKKyNkZWZpbmUga3NfaW5mbyhfa3MsIF9tc2cuLi4pIGRldl9pbmZvKCYoX2tzKS0+cGRldi0+ZGV2LCBfbXNnKQorI2RlZmluZSBrc193YXJuKF9rcywgX21zZy4uLikgZGV2X3dhcm4oJihfa3MpLT5wZGV2LT5kZXYsIF9tc2cpCisjZGVmaW5lIGtzX2RiZyhfa3MsIF9tc2cuLi4pIGRldl9kYmcoJihfa3MpLT5wZGV2LT5kZXYsIF9tc2cpCisjZGVmaW5lIGtzX2Vycihfa3MsIF9tc2cuLi4pIGRldl9lcnIoJihfa3MpLT5wZGV2LT5kZXYsIF9tc2cpCisKKyNkZWZpbmUgQkUzICAgICAgICAgICAgIDB4ODAwMCAgICAgIC8qIEJ5dGUgRW5hYmxlIDMgKi8KKyNkZWZpbmUgQkUyICAgICAgICAgICAgIDB4NDAwMCAgICAgIC8qIEJ5dGUgRW5hYmxlIDIgKi8KKyNkZWZpbmUgQkUxICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIEJ5dGUgRW5hYmxlIDEgKi8KKyNkZWZpbmUgQkUwICAgICAgICAgICAgIDB4MTAwMCAgICAgIC8qIEJ5dGUgRW5hYmxlIDAgKi8KKworLyoqCisgKiByZWdpc3RlciByZWFkL3dyaXRlIGNhbGxzLgorICoKKyAqIEFsbCB0aGVzZSBjYWxscyBpc3N1ZSB0cmFuc2FjdGlvbnMgdG8gYWNjZXNzIHRoZSBjaGlwJ3MgcmVnaXN0ZXJzLiBUaGV5CisgKiBhbGwgcmVxdWlyZSB0aGF0IHRoZSBuZWNlc3NhcnkgbG9jayBpcyBoZWxkIHRvIHByZXZlbnQgYWNjZXNzZXMgd2hlbiB0aGUKKyAqIGNoaXAgaXMgYnVzeSB0cmFuc2ZlcmluZyBwYWNrZXQgZGF0YSAoUlgvVFggRklGTyBhY2Nlc3NlcykuCisgKi8KKworLyoqCisgKiBrc19yZHJlZzggLSByZWFkIDggYml0IHJlZ2lzdGVyIGZyb20gZGV2aWNlCisgKiBAa3MJICA6IFRoZSBjaGlwIGluZm9ybWF0aW9uCisgKiBAb2Zmc2V0OiBUaGUgcmVnaXN0ZXIgYWRkcmVzcworICoKKyAqIFJlYWQgYSA4Yml0IHJlZ2lzdGVyIGZyb20gdGhlIGNoaXAsIHJldHVybmluZyB0aGUgcmVzdWx0CisgKi8KK3N0YXRpYyB1OCBrc19yZHJlZzgoc3RydWN0IGtzX25ldCAqa3MsIGludCBvZmZzZXQpCit7CisJdTE2IGRhdGE7CisJdTggc2hpZnRfYml0ID0gb2Zmc2V0ICYgMHgwMzsKKwl1OCBzaGlmdF9kYXRhID0gKG9mZnNldCAmIDEpIDw8IDM7CisJa3MtPmNtZF9yZWdfY2FjaGUgPSAodTE2KSBvZmZzZXQgfCAodTE2KShCRTAgPDwgc2hpZnRfYml0KTsKKwlpb3dyaXRlMTYoa3MtPmNtZF9yZWdfY2FjaGUsIGtzLT5od19hZGRyX2NtZCk7CisJZGF0YSAgPSBpb3JlYWQxNihrcy0+aHdfYWRkcik7CisJcmV0dXJuICh1OCkoZGF0YSA+PiBzaGlmdF9kYXRhKTsKK30KKworLyoqCisgKiBrc19yZHJlZzE2IC0gcmVhZCAxNiBiaXQgcmVnaXN0ZXIgZnJvbSBkZXZpY2UKKyAqIEBrcwkgIDogVGhlIGNoaXAgaW5mb3JtYXRpb24KKyAqIEBvZmZzZXQ6IFRoZSByZWdpc3RlciBhZGRyZXNzCisgKgorICogUmVhZCBhIDE2Yml0IHJlZ2lzdGVyIGZyb20gdGhlIGNoaXAsIHJldHVybmluZyB0aGUgcmVzdWx0CisgKi8KKworc3RhdGljIHUxNiBrc19yZHJlZzE2KHN0cnVjdCBrc19uZXQgKmtzLCBpbnQgb2Zmc2V0KQoreworCWtzLT5jbWRfcmVnX2NhY2hlID0gKHUxNilvZmZzZXQgfCAoKEJFMSB8IEJFMCkgPDwgKG9mZnNldCAmIDB4MDIpKTsKKwlpb3dyaXRlMTYoa3MtPmNtZF9yZWdfY2FjaGUsIGtzLT5od19hZGRyX2NtZCk7CisJcmV0dXJuIGlvcmVhZDE2KGtzLT5od19hZGRyKTsKK30KKworLyoqCisgKiBrc193cnJlZzggLSB3cml0ZSA4Yml0IHJlZ2lzdGVyIHZhbHVlIHRvIGNoaXAKKyAqIEBrczogVGhlIGNoaXAgaW5mb3JtYXRpb24KKyAqIEBvZmZzZXQ6IFRoZSByZWdpc3RlciBhZGRyZXNzCisgKiBAdmFsdWU6IFRoZSB2YWx1ZSB0byB3cml0ZQorICoKKyAqLworc3RhdGljIHZvaWQga3Nfd3JyZWc4KHN0cnVjdCBrc19uZXQgKmtzLCBpbnQgb2Zmc2V0LCB1OCB2YWx1ZSkKK3sKKwl1OCAgc2hpZnRfYml0ID0gKG9mZnNldCAmIDB4MDMpOworCXUxNiB2YWx1ZV93cml0ZSA9ICh1MTYpKHZhbHVlIDw8ICgob2Zmc2V0ICYgMSkgPDwgMykpOworCWtzLT5jbWRfcmVnX2NhY2hlID0gKHUxNilvZmZzZXQgfCAoQkUwIDw8IHNoaWZ0X2JpdCk7CisJaW93cml0ZTE2KGtzLT5jbWRfcmVnX2NhY2hlLCBrcy0+aHdfYWRkcl9jbWQpOworCWlvd3JpdGUxNih2YWx1ZV93cml0ZSwga3MtPmh3X2FkZHIpOworfQorCisvKioKKyAqIGtzX3dycmVnMTYgLSB3cml0ZSAxNmJpdCByZWdpc3RlciB2YWx1ZSB0byBjaGlwCisgKiBAa3M6IFRoZSBjaGlwIGluZm9ybWF0aW9uCisgKiBAb2Zmc2V0OiBUaGUgcmVnaXN0ZXIgYWRkcmVzcworICogQHZhbHVlOiBUaGUgdmFsdWUgdG8gd3JpdGUKKyAqCisgKi8KKworc3RhdGljIHZvaWQga3Nfd3JyZWcxNihzdHJ1Y3Qga3NfbmV0ICprcywgaW50IG9mZnNldCwgdTE2IHZhbHVlKQoreworCWtzLT5jbWRfcmVnX2NhY2hlID0gKHUxNilvZmZzZXQgfCAoKEJFMSB8IEJFMCkgPDwgKG9mZnNldCAmIDB4MDIpKTsKKwlpb3dyaXRlMTYoa3MtPmNtZF9yZWdfY2FjaGUsIGtzLT5od19hZGRyX2NtZCk7CisJaW93cml0ZTE2KHZhbHVlLCBrcy0+aHdfYWRkcik7Cit9CisKKy8qKgorICoga3NfaW5ibGsgLSByZWFkIGEgYmxvY2sgb2YgZGF0YSBmcm9tIFFNVS4gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc3VkbyBETUEgbW9kZSBlbmFibGVkLgorICogQGtzOiBUaGUgY2hpcCBzdGF0ZQorICogQHdwdHI6IGJ1ZmZlciBhZGRyZXNzIHRvIHNhdmUgZGF0YQorICogQGxlbjogbGVuZ3RoIGluIGJ5dGUgdG8gcmVhZAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGtzX2luYmxrKHN0cnVjdCBrc19uZXQgKmtzLCB1MTYgKndwdHIsIHUzMiBsZW4pCit7CisJbGVuID4+PSAxOworCXdoaWxlIChsZW4tLSkKKwkJKndwdHIrKyA9ICh1MTYpaW9yZWFkMTYoa3MtPmh3X2FkZHIpOworfQorCisvKioKKyAqIGtzX291dGJsayAtIHdyaXRlIGRhdGEgdG8gUU1VLiBUaGlzIGlzIGNhbGxlZCBhZnRlciBzdWRvIERNQSBtb2RlIGVuYWJsZWQuCisgKiBAa3M6IFRoZSBjaGlwIGluZm9ybWF0aW9uCisgKiBAd3B0cjogYnVmZmVyIGFkZHJlc3MKKyAqIEBsZW46IGxlbmd0aCBpbiBieXRlIHRvIHdyaXRlCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQga3Nfb3V0YmxrKHN0cnVjdCBrc19uZXQgKmtzLCB1MTYgKndwdHIsIHUzMiBsZW4pCit7CisJbGVuID4+PSAxOworCXdoaWxlIChsZW4tLSkKKwkJaW93cml0ZTE2KCp3cHRyKyssIGtzLT5od19hZGRyKTsKK30KKworLyoqCisgKiBrc190eF9maWZvX3NwYWNlIC0gcmV0dXJuIHRoZSBhdmFpbGFibGUgaGFyZHdhcmUgYnVmZmVyIHNpemUuCisgKiBAa3M6IFRoZSBjaGlwIGluZm9ybWF0aW9uCisgKgorICovCitzdGF0aWMgaW5saW5lIHUxNiBrc190eF9maWZvX3NwYWNlKHN0cnVjdCBrc19uZXQgKmtzKQoreworCXJldHVybiBrc19yZHJlZzE2KGtzLCBLU19UWE1JUikgJiAweDFmZmY7Cit9CisKKy8qKgorICoga3Nfc2F2ZV9jbWRfcmVnIC0gc2F2ZSB0aGUgY29tbWFuZCByZWdpc3RlciBmcm9tIHRoZSBjYWNoZS4KKyAqIEBrczogVGhlIGNoaXAgaW5mb3JtYXRpb24KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBrc19zYXZlX2NtZF9yZWcoc3RydWN0IGtzX25ldCAqa3MpCit7CisJLyprczg4NTEgTUxMIGhhcyBhIGJ1ZyB0byByZWFkIGJhY2sgdGhlIGNvbW1hbmQgcmVnaXN0ZXIuCisJKiBTbyByZWx5IG9uIHNvZnR3YXJlIHRvIHNhdmUgdGhlIGNvbnRlbnQgb2YgY29tbWFuZCByZWdpc3Rlci4KKwkqLworCWtzLT5jbWRfcmVnX2NhY2hlX2ludCA9IGtzLT5jbWRfcmVnX2NhY2hlOworfQorCisvKioKKyAqIGtzX3Jlc3RvcmVfY21kX3JlZyAtIHJlc3RvcmUgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgZnJvbSB0aGUgY2FjaGUgYW5kCisgKiAJd3JpdGUgdG8gaGFyZHdhcmUgcmVnaXN0ZXIuCisgKiBAa3M6IFRoZSBjaGlwIGluZm9ybWF0aW9uCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQga3NfcmVzdG9yZV9jbWRfcmVnKHN0cnVjdCBrc19uZXQgKmtzKQoreworCWtzLT5jbWRfcmVnX2NhY2hlID0ga3MtPmNtZF9yZWdfY2FjaGVfaW50OworCWlvd3JpdGUxNihrcy0+Y21kX3JlZ19jYWNoZSwga3MtPmh3X2FkZHJfY21kKTsKK30KKworLyoqCisgKiBrc19zZXRfcG93ZXJtb2RlIC0gc2V0IHBvd2VyIG1vZGUgb2YgdGhlIGRldmljZQorICogQGtzOiBUaGUgY2hpcCBpbmZvcm1hdGlvbgorICogQHB3cm1vZGU6IFRoZSBwb3dlciBtb2RlIHZhbHVlIHRvIHdyaXRlIHRvIEtTX1BNRUNSLgorICoKKyAqIENoYW5nZSB0aGUgcG93ZXIgbW9kZSBvZiB0aGUgY2hpcC4KKyAqLworc3RhdGljIHZvaWQga3Nfc2V0X3Bvd2VybW9kZShzdHJ1Y3Qga3NfbmV0ICprcywgdW5zaWduZWQgcHdybW9kZSkKK3sKKwl1bnNpZ25lZCBwbWVjcjsKKworCWlmIChuZXRpZl9tc2dfaHcoa3MpKQorCQlrc19kYmcoa3MsICJzZXR0aW5nIHBvd2VyIG1vZGUgJWRcbiIsIHB3cm1vZGUpOworCisJa3NfcmRyZWcxNihrcywgS1NfR1JSKTsKKwlwbWVjciA9IGtzX3JkcmVnMTYoa3MsIEtTX1BNRUNSKTsKKwlwbWVjciAmPSB+UE1FQ1JfUE1fTUFTSzsKKwlwbWVjciB8PSBwd3Jtb2RlOworCisJa3Nfd3JyZWcxNihrcywgS1NfUE1FQ1IsIHBtZWNyKTsKK30KKworLyoqCisgKiBrc19yZWFkX2NvbmZpZyAtIHJlYWQgY2hpcCBjb25maWd1cmF0aW9uIG9mIGJ1cyB3aWR0aC4KKyAqIEBrczogVGhlIGNoaXAgaW5mb3JtYXRpb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGtzX3JlYWRfY29uZmlnKHN0cnVjdCBrc19uZXQgKmtzKQoreworCXUxNiByZWdfZGF0YSA9IDA7CisKKwkvKiBSZWdhcmRsZXNzIG9mIGJ1cyB3aWR0aCwgOCBiaXQgcmVhZCBzaG91bGQgYWx3YXlzIHdvcmsuKi8KKwlyZWdfZGF0YSA9IGtzX3JkcmVnOChrcywgS1NfQ0NSKSAmIDB4MDBGRjsKKwlyZWdfZGF0YSB8PSBrc19yZHJlZzgoa3MsIEtTX0NDUisxKSA8PCA4OworCisJLyogYWRkci9kYXRhIGJ1cyBhcmUgbXVsdGlwbGV4ZWQgKi8KKwlrcy0+c2hhcmVkYnVzID0gKHJlZ19kYXRhICYgQ0NSX1NIQVJFRCkgPT0gQ0NSX1NIQVJFRDsKKworCS8qIFRoZXJlIGFyZSBnYXJiYWdlIGRhdGEgd2hlbiByZWFkaW5nIGRhdGEgZnJvbSBRTVUsCisJZGVwZW5kaW5nIG9uIGJ1cy13aWR0aC4KKwkqLworCisJaWYgKHJlZ19kYXRhICYgQ0NSXzhCSVQpIHsKKwkJa3MtPmJ1c193aWR0aCA9IEVOVU1fQlVTXzhCSVQ7CisJCWtzLT5leHRyYV9ieXRlID0gMTsKKwl9IGVsc2UgaWYgKHJlZ19kYXRhICYgQ0NSXzE2QklUKSB7CisJCWtzLT5idXNfd2lkdGggPSBFTlVNX0JVU18xNkJJVDsKKwkJa3MtPmV4dHJhX2J5dGUgPSAyOworCX0gZWxzZSB7CisJCWtzLT5idXNfd2lkdGggPSBFTlVNX0JVU18zMkJJVDsKKwkJa3MtPmV4dHJhX2J5dGUgPSA0OworCX0KK30KKworLyoqCisgKiBrc19zb2Z0X3Jlc2V0IC0gaXNzdWUgb25lIG9mIHRoZSBzb2Z0IHJlc2V0IHRvIHRoZSBkZXZpY2UKKyAqIEBrczogVGhlIGRldmljZSBzdGF0ZS4KKyAqIEBvcDogVGhlIGJpdChzKSB0byBzZXQgaW4gdGhlIEdSUgorICoKKyAqIElzc3VlIHRoZSByZWxldmFudCBzb2Z0LXJlc2V0IGNvbW1hbmQgdG8gdGhlIGRldmljZSdzIEdSUiByZWdpc3RlcgorICogc3BlY2lmaWVkIGJ5IEBvcC4KKyAqCisgKiBOb3RlLCB0aGUgZGVsYXlzIGFyZSBpbiB0aGVyZSBhcyBhIGNhdXRpb24gdG8gZW5zdXJlIHRoYXQgdGhlIHJlc2V0CisgKiBoYXMgdGltZSB0byB0YWtlIGVmZmVjdCBhbmQgdGhlbiBjb21wbGV0ZS4gU2luY2UgdGhlIGRhdGFzaGVldCBkb2VzCisgKiBub3QgY3VycmVudGx5IHNwZWNpZnkgdGhlIGV4YWN0IHNlcXVlbmNlLCB3ZSBoYXZlIGNob3NlbiBzb21ldGhpbmcKKyAqIHRoYXQgc2VlbXMgdG8gd29yayB3aXRoIG91ciBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGtzX3NvZnRfcmVzZXQoc3RydWN0IGtzX25ldCAqa3MsIHVuc2lnbmVkIG9wKQoreworCS8qIERpc2FibGUgaW50ZXJydXB0IGZpcnN0ICovCisJa3Nfd3JyZWcxNihrcywgS1NfSUVSLCAweDAwMDApOworCWtzX3dycmVnMTYoa3MsIEtTX0dSUiwgb3ApOworCW1kZWxheSgxMCk7CS8qIHdhaXQgYSBzaG9ydCB0aW1lIHRvIGVmZmVjdCByZXNldCAqLworCWtzX3dycmVnMTYoa3MsIEtTX0dSUiwgMCk7CisJbWRlbGF5KDEpOwkvKiB3YWl0IGZvciBjb25kaXRpb24gdG8gY2xlYXIgKi8KK30KKworCisvKioKKyAqIGtzX3JlYWRfcW11IC0gcmVhZCAxIHBrdCBkYXRhIGZyb20gdGhlIFFNVS4KKyAqIEBrczogVGhlIGNoaXAgaW5mb3JtYXRpb24KKyAqIEBidWY6IGJ1ZmZlciBhZGRyZXNzIHRvIHNhdmUgMSBwa3QKKyAqIEBsZW46IFBrdCBsZW5ndGgKKyAqIEhlcmUgaXMgdGhlIHNlcXVlbmNlIHRvIHJlYWQgMSBwa3Q6CisgKgkxLiBzZXQgc3VkbyBETUEgbW9kZQorICoJMi4gcmVhZCBwcmVwZW5kIGRhdGEKKyAqCTMuIHJlYWQgcGt0IGRhdGEKKyAqCTQuIHJlc2V0IHN1ZG8gRE1BIE1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGtzX3JlYWRfcW11KHN0cnVjdCBrc19uZXQgKmtzLCB1MTYgKmJ1ZiwgdTMyIGxlbikKK3sKKwl1MzIgciA9ICBrcy0+ZXh0cmFfYnl0ZSAmIDB4MSA7CisJdTMyIHcgPSBrcy0+ZXh0cmFfYnl0ZSAtIHI7CisKKwkvKiAxLiBzZXQgc3VkbyBETUEgbW9kZSAqLworCWtzX3dycmVnMTYoa3MsIEtTX1JYRkRQUiwgUlhGRFBSX1JYRlBBSSk7CisJa3Nfd3JyZWc4KGtzLCBLU19SWFFDUiwgKGtzLT5yY19yeHFjciB8IFJYUUNSX1NEQSkgJiAweGZmKTsKKworCS8qIDIuIHJlYWQgcHJlcGVuZCBkYXRhICovCisJLyoqCisJICogcmVhZCA0ICsgZXh0cmEgYnl0ZXMgYW5kIGRpc2NhcmQgdGhlbS4KKwkgKiBleHRyYSBieXRlcyBmb3IgZHVtbXksIDIgZm9yIHN0YXR1cywgMiBmb3IgbGVuCisJICovCisKKwkvKiB1c2UgbGlrZWx5KHIpIGZvciA4IGJpdCBhY2Nlc3MgZm9yIHBlcmZvcm1hbmNlICovCisJaWYgKHVubGlrZWx5KHIpKQorCQlpb3JlYWQ4KGtzLT5od19hZGRyKTsKKwlrc19pbmJsayhrcywgYnVmLCB3ICsgMiArIDIpOworCisJLyogMy4gcmVhZCBwa3QgZGF0YSAqLworCWtzX2luYmxrKGtzLCBidWYsIEFMSUdOKGxlbiwgNCkpOworCisJLyogNC4gcmVzZXQgc3VkbyBETUEgTW9kZSAqLworCWtzX3dycmVnOChrcywgS1NfUlhRQ1IsIGtzLT5yY19yeHFjcik7Cit9CisKKy8qKgorICoga3NfcmN2IC0gcmVhZCBtdWx0aXBsZSBwa3RzIGRhdGEgZnJvbSB0aGUgUU1VLgorICogQGtzOiBUaGUgY2hpcCBpbmZvcm1hdGlvbgorICogQG5ldGRldjogVGhlIG5ldHdvcmsgZGV2aWNlIGJlaW5nIG9wZW5lZC4KKyAqCisgKiBSZWFkIGFsbCBvZiBoZWFkZXIgaW5mb3JtYXRpb24gYmVmb3JlIHJlYWRpbmcgcGt0IGNvbnRlbnQuCisgKiBJdCBpcyBub3QgYWxsb3dlZCBvbmx5IHBvcnQgb2YgcGt0cyBpbiBRTVUgYWZ0ZXIgaXNzdWluZworICogaW50ZXJydXB0IGFjay4KKyAqLworc3RhdGljIHZvaWQga3NfcmN2KHN0cnVjdCBrc19uZXQgKmtzLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXUzMglpOworCXN0cnVjdCB0eXBlX2ZyYW1lX2hlYWQgKmZyYW1lX2hkciA9IGtzLT5mcmFtZV9oZWFkX2luZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWtzLT5mcmFtZV9jbnQgPSBrc19yZHJlZzE2KGtzLCBLU19SWEZDVFIpID4+IDg7CisKKwkvKiByZWFkIGFsbCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwga3MtPmZyYW1lX2NudDsgaSsrKSB7CisJCS8qIENoZWNraW5nIFJlY2VpdmVkIHBhY2tldCBzdGF0dXMgKi8KKwkJZnJhbWVfaGRyLT5zdHMgPSBrc19yZHJlZzE2KGtzLCBLU19SWEZIU1IpOworCQkvKiBHZXQgcGFja2V0IGxlbiBmcm9tIGhhcmR3YXJlICovCisJCWZyYW1lX2hkci0+bGVuID0ga3NfcmRyZWcxNihrcywgS1NfUlhGSEJDUik7CisJCWZyYW1lX2hkcisrOworCX0KKworCWZyYW1lX2hkciA9IGtzLT5mcmFtZV9oZWFkX2luZm87CisJd2hpbGUgKGtzLT5mcmFtZV9jbnQtLSkgeworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGZyYW1lX2hkci0+bGVuICsgMTYpOworCQlpZiAobGlrZWx5KHNrYiAmJiAoZnJhbWVfaGRyLT5zdHMgJiBSWEZTSFJfUlhGVikgJiYKKwkJCShmcmFtZV9oZHItPmxlbiA8IFJYX0JVRl9TSVpFKSAmJiBmcmFtZV9oZHItPmxlbikpIHsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQkvKiByZWFkIGRhdGEgYmxvY2sgaW5jbHVkaW5nIENSQyA0IGJ5dGVzICovCisJCQlrc19yZWFkX3FtdShrcywgKHUxNiAqKXNrYi0+ZGF0YSwgZnJhbWVfaGRyLT5sZW4gKyA0KTsKKwkJCXNrYl9wdXQoc2tiLCBmcmFtZV9oZHItPmxlbik7CisJCQlza2ItPmRldiA9IG5ldGRldjsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CisJCQluZXRpZl9yeChza2IpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyOnNrYiBhbGxvY1xuIiwgX19mdW5jX18pOworCQkJa3Nfd3JyZWcxNihrcywgS1NfUlhRQ1IsIChrcy0+cmNfcnhxY3IgfCBSWFFDUl9SUlhFRikpOworCQkJaWYgKHNrYikKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQl9CisJCWZyYW1lX2hkcisrOworCX0KK30KKworLyoqCisgKiBrc191cGRhdGVfbGlua19zdGF0dXMgLSBsaW5rIHN0YXR1cyB1cGRhdGUuCisgKiBAbmV0ZGV2OiBUaGUgbmV0d29yayBkZXZpY2UgYmVpbmcgb3BlbmVkLgorICogQGtzOiBUaGUgY2hpcCBpbmZvcm1hdGlvbgorICoKKyAqLworCitzdGF0aWMgdm9pZCBrc191cGRhdGVfbGlua19zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGtzX25ldCAqa3MpCit7CisJLyogY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgbGluayAqLworCXUzMiBsaW5rX3VwX3N0YXR1czsKKwlpZiAoa3NfcmRyZWcxNihrcywgS1NfUDFTUikgJiBQMVNSX0xJTktfR09PRCkgeworCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCWxpbmtfdXBfc3RhdHVzID0gdHJ1ZTsKKwl9IGVsc2UgeworCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQlsaW5rX3VwX3N0YXR1cyA9IGZhbHNlOworCX0KKwlpZiAobmV0aWZfbXNnX2xpbmsoa3MpKQorCQlrc19kYmcoa3MsICIlczogJXNcbiIsCisJCQlfX2Z1bmNfXywgbGlua191cF9zdGF0dXMgPyAiVVAiIDogIkRPV04iKTsKK30KKworLyoqCisgKiBrc19pcnEgLSBkZXZpY2UgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IEludGVycnVwdCBudW1iZXIgcGFzc2VkIGZyb20gdGhlIElSUSBobmFsZGVyLgorICogQHB3OiBUaGUgcHJpdmF0ZSB3b3JkIHBhc3NlZCB0byByZWdpc3Rlcl9pcnEoKSwgb3VyIHN0cnVjdCBrc19uZXQuCisgKgorICogVGhpcyBpcyB0aGUgaGFuZGxlciBpbnZva2VkIHRvIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQKKyAqCisgKiBSZWFkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzLCB3b3JrIG91dCB3aGF0IG5lZWRzIHRvIGJlIGRvbmUgYW5kIHRoZW4gY2xlYXIKKyAqIGFueSBvZiB0aGUgaW50ZXJydXB0cyB0aGF0IGFyZSBub3QgbmVlZGVkLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBrc19pcnEoaW50IGlycSwgdm9pZCAqcHcpCit7CisJc3RydWN0IGtzX25ldCAqa3MgPSBwdzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0ga3MtPm5ldGRldjsKKwl1MTYgc3RhdHVzOworCisJLyp0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3QgaW4gSVJRIGhhbmRsZXIgKi8KKwlrc19zYXZlX2NtZF9yZWcoa3MpOworCisJc3RhdHVzID0ga3NfcmRyZWcxNihrcywgS1NfSVNSKTsKKwlpZiAodW5saWtlbHkoIXN0YXR1cykpIHsKKwkJa3NfcmVzdG9yZV9jbWRfcmVnKGtzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWtzX3dycmVnMTYoa3MsIEtTX0lTUiwgc3RhdHVzKTsKKworCWlmIChsaWtlbHkoc3RhdHVzICYgSVJRX1JYSSkpCisJCWtzX3JjdihrcywgbmV0ZGV2KTsKKworCWlmICh1bmxpa2VseShzdGF0dXMgJiBJUlFfTENJKSkKKwkJa3NfdXBkYXRlX2xpbmtfc3RhdHVzKG5ldGRldiwga3MpOworCisJaWYgKHVubGlrZWx5KHN0YXR1cyAmIElSUV9UWEkpKQorCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisKKwlpZiAodW5saWtlbHkoc3RhdHVzICYgSVJRX0xESSkpIHsKKworCQl1MTYgcG1lY3IgPSBrc19yZHJlZzE2KGtzLCBLU19QTUVDUik7CisJCXBtZWNyICY9IH5QTUVDUl9XS0VWVF9NQVNLOworCQlrc193cnJlZzE2KGtzLCBLU19QTUVDUiwgcG1lY3IgfCBQTUVDUl9XS0VWVF9MSU5LKTsKKwl9CisKKwkvKiB0aGlzIHNob3VsZCBiZSB0aGUgbGFzdCBpbiBJUlEgaGFuZGxlciovCisJa3NfcmVzdG9yZV9jbWRfcmVnKGtzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgKiBrc19uZXRfb3BlbiAtIG9wZW4gbmV0d29yayBkZXZpY2UKKyAqIEBuZXRkZXY6IFRoZSBuZXR3b3JrIGRldmljZSBiZWluZyBvcGVuZWQuCisgKgorICogQ2FsbGVkIHdoZW4gdGhlIG5ldHdvcmsgZGV2aWNlIGlzIG1hcmtlZCBhY3RpdmUsIHN1Y2ggYXMgYSB1c2VyIGV4ZWN1dGluZworICogJ2lmY29uZmlnIHVwJyBvbiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGtzX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtzX25ldCAqa3MgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnI7CisKKyNkZWZpbmUJS1NfSU5UX0ZMQUdTCShJUlFGX0RJU0FCTEVEfElSUUZfVFJJR0dFUl9MT1cpCisJLyogbG9jayB0aGUgY2FyZCwgZXZlbiBpZiB3ZSBtYXkgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nCisJICogZWxzZSBhdCB0aGUgbW9tZW50LgorCSAqLworCisJaWYgKG5ldGlmX21zZ19pZnVwKGtzKSkKKwkJa3NfZGJnKGtzLCAiJXMgLSBlbnRyeVxuIiwgX19mdW5jX18pOworCisJLyogcmVzZXQgdGhlIEhXICovCisJZXJyID0gcmVxdWVzdF9pcnEoa3MtPmlycSwga3NfaXJxLCBLU19JTlRfRkxBR1MsIERSVl9OQU1FLCBrcyk7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlcXVlc3QgSVJROiAlZDogJWRcbiIsCisJCQlrcy0+aXJxLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChuZXRpZl9tc2dfaWZ1cChrcykpCisJCWtzX2RiZyhrcywgIm5ldHdvcmsgZGV2aWNlICVzIHVwXG4iLCBuZXRkZXYtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoga3NfbmV0X3N0b3AgLSBjbG9zZSBuZXR3b3JrIGRldmljZQorICogQG5ldGRldjogVGhlIGRldmljZSBiZWluZyBjbG9zZWQuCisgKgorICogQ2FsbGVkIHRvIGNsb3NlIGRvd24gYSBuZXR3b3JrIGRldmljZSB3aGljaCBoYXMgYmVlbiBhY3RpdmUuIENhbmNlbGwgYW55CisgKiB3b3JrLCBzaHV0ZG93biB0aGUgUlggYW5kIFRYIHByb2Nlc3MgYW5kIHRoZW4gcGxhY2UgdGhlIGNoaXAgaW50byBhIGxvdworICogcG93ZXIgc3RhdGUgd2hpbHN0IGl0IGlzIG5vdCBiZWluZyB1c2VkLgorICovCitzdGF0aWMgaW50IGtzX25ldF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtzX25ldCAqa3MgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKG5ldGlmX21zZ19pZmRvd24oa3MpKQorCQlrc19pbmZvKGtzLCAiJXM6IHNodXR0aW5nIGRvd25cbiIsIG5ldGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwlrZnJlZShrcy0+ZnJhbWVfaGVhZF9pbmZvKTsKKworCW11dGV4X2xvY2soJmtzLT5sb2NrKTsKKworCS8qIHR1cm4gb2ZmIHRoZSBJUlFzIGFuZCBhY2sgYW55IG91dHN0YW5kaW5nICovCisJa3Nfd3JyZWcxNihrcywgS1NfSUVSLCAweDAwMDApOworCWtzX3dycmVnMTYoa3MsIEtTX0lTUiwgMHhmZmZmKTsKKworCS8qIHNodXRkb3duIFJYIHByb2Nlc3MgKi8KKwlrc193cnJlZzE2KGtzLCBLU19SWENSMSwgMHgwMDAwKTsKKworCS8qIHNodXRkb3duIFRYIHByb2Nlc3MgKi8KKwlrc193cnJlZzE2KGtzLCBLU19UWENSLCAweDAwMDApOworCisJLyogc2V0IHBvd2VybW9kZSB0byBzb2Z0IHBvd2VyIGRvd24gdG8gc2F2ZSBwb3dlciAqLworCWtzX3NldF9wb3dlcm1vZGUoa3MsIFBNRUNSX1BNX1NPRlRET1dOKTsKKwlmcmVlX2lycShrcy0+aXJxLCBuZXRkZXYpOworCW11dGV4X3VubG9jaygma3MtPmxvY2spOworCXJldHVybiAwOworfQorCisKKy8qKgorICoga3Nfd3JpdGVfcW11IC0gd3JpdGUgMSBwa3QgZGF0YSB0byB0aGUgUU1VLgorICogQGtzOiBUaGUgY2hpcCBpbmZvcm1hdGlvbgorICogQHBkYXRhOiBidWZmZXIgYWRkcmVzcyB0byBzYXZlIDEgcGt0CisgKiBAbGVuOiBQa3QgbGVuZ3RoIGluIGJ5dGUKKyAqIEhlcmUgaXMgdGhlIHNlcXVlbmNlIHRvIHdyaXRlIDEgcGt0OgorICoJMS4gc2V0IHN1ZG8gRE1BIG1vZGUKKyAqCTIuIHdyaXRlIHN0YXR1cy9sZW5ndGgKKyAqCTMuIHdyaXRlIHBrdCBkYXRhCisgKgk0LiByZXNldCBzdWRvIERNQSBNb2RlCisgKgk1LiByZXNldCBzdWRvIERNQSBtb2RlCisgKgk2LiBXYWl0IHVudGlsIHBrdCBpcyBvdXQKKyAqLworc3RhdGljIHZvaWQga3Nfd3JpdGVfcW11KHN0cnVjdCBrc19uZXQgKmtzLCB1OCAqcGRhdGEsIHUxNiBsZW4pCit7CisJdW5zaWduZWQgZmlkID0ga3MtPmZpZDsKKworCWZpZCA9IGtzLT5maWQ7CisJa3MtPmZpZCA9IChrcy0+ZmlkICsgMSkgJiBUWEZSX1RYRklEX01BU0s7CisKKwkvKiByZWR1Y2UgdGhlIHR4IGludGVycnVwdCBvY2N1cnJhbmNlcy4gKi8KKwlpZiAoIWZpZCkKKwkJZmlkIHw9IFRYRlJfVFhJQzsgICAgICAgLyogaXJxIG9uIGNvbXBsZXRpb24gKi8KKworCS8qIHN0YXJ0IGhlYWRlciBhdCB0eGJbMF0gdG8gYWxpZ24gdHh3IGVudHJpZXMgKi8KKwlrcy0+dHhoLnR4d1swXSA9IGNwdV90b19sZTE2KGZpZCk7CisJa3MtPnR4aC50eHdbMV0gPSBjcHVfdG9fbGUxNihsZW4pOworCisJLyogMS4gc2V0IHN1ZG8tRE1BIG1vZGUgKi8KKwlrc193cnJlZzgoa3MsIEtTX1JYUUNSLCAoa3MtPnJjX3J4cWNyIHwgUlhRQ1JfU0RBKSAmIDB4ZmYpOworCS8qIDIuIHdyaXRlIHN0YXR1cy9sZW50aCBpbmZvICovCisJa3Nfb3V0YmxrKGtzLCBrcy0+dHhoLnR4dywgNCk7CisJLyogMy4gd3JpdGUgcGt0IGRhdGEgKi8KKwlrc19vdXRibGsoa3MsICh1MTYgKilwZGF0YSwgQUxJR04obGVuLCA0KSk7CisJLyogNC4gcmVzZXQgc3Vkby1ETUEgbW9kZSAqLworCWtzX3dycmVnOChrcywgS1NfUlhRQ1IsIGtzLT5yY19yeHFjcik7CisJLyogNS4gRW5xdWV1ZSBUeChtb3ZlIHRoZSBwa3QgZnJvbSBUWCBidWZmZXIgaW50byBUWFEpICovCisJa3Nfd3JyZWcxNihrcywgS1NfVFhRQ1IsIFRYUUNSX01FVEZFKTsKKwkvKiA2LiB3YWl0IHVudGlsIFRYUUNSX01FVEZFIGlzIGF1dG8tY2xlYXJlZCAqLworCXdoaWxlIChrc19yZHJlZzE2KGtzLCBLU19UWFFDUikgJiBUWFFDUl9NRVRGRSkKKwkJOworfQorCitzdGF0aWMgdm9pZCBrc19kaXNhYmxlX2ludChzdHJ1Y3Qga3NfbmV0ICprcykKK3sKKwlrc193cnJlZzE2KGtzLCBLU19JRVIsIDB4MDAwMCk7Cit9ICAvKiBrc19kaXNhYmxlX2ludCAqLworCitzdGF0aWMgdm9pZCBrc19lbmFibGVfaW50KHN0cnVjdCBrc19uZXQgKmtzKQoreworCWtzX3dycmVnMTYoa3MsIEtTX0lFUiwga3MtPnJjX2llcik7Cit9ICAvKiBrc19lbmFibGVfaW50ICovCisKKy8qKgorICoga3Nfc3RhcnRfeG1pdCAtIHRyYW5zbWl0IHBhY2tldAorICogQHNrYgkJOiBUaGUgYnVmZmVyIHRvIHRyYW5zbWl0CisgKiBAbmV0ZGV2CTogVGhlIGRldmljZSB1c2VkIHRvIHRyYW5zbWl0IHRoZSBwYWNrZXQuCisgKgorICogQ2FsbGVkIGJ5IHRoZSBuZXR3b3JrIGxheWVyIHRvIHRyYW5zbWl0IHRoZSBAc2tiLgorICogc3Bpbl9sb2NrX2lycXNhdmUgaXMgcmVxdWlyZWQgYmVjYXVzZSB0eCBhbmQgcnggc2hvdWxkIGJlIG11dHVhbCBleGNsdXNpdmUuCisgKiBTbyB3aGlsZSB0eCBpcyBpbi1wcm9ncmVzcywgcHJldmVudCBJUlEgaW50ZXJydXB0IGZyb20gaGFwcGVubmluZy4KKyAqLworc3RhdGljIGludCBrc19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaW50IHJldHYgPSBORVRERVZfVFhfT0s7CisJc3RydWN0IGtzX25ldCAqa3MgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJZGlzYWJsZV9pcnEobmV0ZGV2LT5pcnEpOworCWtzX2Rpc2FibGVfaW50KGtzKTsKKwlzcGluX2xvY2soJmtzLT5zdGF0ZWxvY2spOworCisJLyogRXh0cmEgc3BhY2UgYXJlIHJlcXVpcmVkOgorCSogIDQgYnl0ZSBmb3IgYWxpZ25tZW50LCA0IGZvciBzdGF0dXMvbGVuZ3RoLCA0IGZvciBDUkMKKwkqLworCisJaWYgKGxpa2VseShrc190eF9maWZvX3NwYWNlKGtzKSA+PSBza2ItPmxlbiArIDEyKSkgeworCQlrc193cml0ZV9xbXUoa3MsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlCisJCXJldHYgPSBORVRERVZfVFhfQlVTWTsKKwlzcGluX3VubG9jaygma3MtPnN0YXRlbG9jayk7CisJa3NfZW5hYmxlX2ludChrcyk7CisJZW5hYmxlX2lycShuZXRkZXYtPmlycSk7CisJcmV0dXJuIHJldHY7Cit9CisKKy8qKgorICoga3Nfc3RhcnRfcnggLSByZWFkeSB0byBzZXJ2ZSBwa3RzCisgKiBAa3MJCTogVGhlIGNoaXAgaW5mb3JtYXRpb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGtzX3N0YXJ0X3J4KHN0cnVjdCBrc19uZXQgKmtzKQoreworCXUxNiBjbnRsOworCisJLyogRW5hYmxlcyBRTVUgUmVjZWl2ZSAoUlhDUjEpLiAqLworCWNudGwgPSBrc19yZHJlZzE2KGtzLCBLU19SWENSMSk7CisJY250bCB8PSBSWENSMV9SWEUgOworCWtzX3dycmVnMTYoa3MsIEtTX1JYQ1IxLCBjbnRsKTsKK30gIC8qIGtzX3N0YXJ0X3J4ICovCisKKy8qKgorICoga3Nfc3RvcF9yeCAtIHN0b3AgdG8gc2VydmUgcGt0cworICogQGtzCQk6IFRoZSBjaGlwIGluZm9ybWF0aW9uCisgKgorICovCitzdGF0aWMgdm9pZCBrc19zdG9wX3J4KHN0cnVjdCBrc19uZXQgKmtzKQoreworCXUxNiBjbnRsOworCisJLyogRGlzYWJsZXMgUU1VIFJlY2VpdmUgKFJYQ1IxKS4gKi8KKwljbnRsID0ga3NfcmRyZWcxNihrcywgS1NfUlhDUjEpOworCWNudGwgJj0gflJYQ1IxX1JYRSA7CisJa3Nfd3JyZWcxNihrcywgS1NfUlhDUjEsIGNudGwpOworCit9ICAvKiBrc19zdG9wX3J4ICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvbnN0IGV0aGVybmV0X3BvbHlub21pYWwgPSAweDA0YzExZGI3VTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXRoZXJfZ2VuX2NyYyhpbnQgbGVuZ3RoLCB1OCAqZGF0YSkKK3sKKwlsb25nIGNyYyA9IC0xOworCXdoaWxlICgtLWxlbmd0aCA+PSAwKSB7CisJCXU4IGN1cnJlbnRfb2N0ZXQgPSAqZGF0YSsrOworCQlpbnQgYml0OworCisJCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyssIGN1cnJlbnRfb2N0ZXQgPj49IDEpIHsKKwkJCWNyYyA9IChjcmMgPDwgMSkgXgorCQkJCSgoY3JjIDwgMCkgXiAoY3VycmVudF9vY3RldCAmIDEpID8KKwkJCWV0aGVybmV0X3BvbHlub21pYWwgOiAwKTsKKwkJfQorCX0KKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpY3JjOworfSAgLyogZXRoZXJfZ2VuX2NyYyAqLworCisvKioKKyoga3Nfc2V0X2dycGFkZHIgLSBzZXQgbXVsdGljYXN0IGluZm9ybWF0aW9uCisqIEBrcyA6IFRoZSBjaGlwIGluZm9ybWF0aW9uCisqLworCitzdGF0aWMgdm9pZCBrc19zZXRfZ3JwYWRkcihzdHJ1Y3Qga3NfbmV0ICprcykKK3sKKwl1OAlpOworCXUzMglpbmRleCwgcG9zaXRpb24sIHZhbHVlOworCisJbWVtc2V0KGtzLT5tY2FzdF9iaXRzLCAwLCBzaXplb2YodTgpICogSFdfTUNBU1RfU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwga3MtPm1jYXN0X2xzdF9zaXplOyBpKyspIHsKKwkJcG9zaXRpb24gPSAoZXRoZXJfZ2VuX2NyYyg2LCBrcy0+bWNhc3RfbHN0W2ldKSA+PiAyNikgJiAweDNmOworCQlpbmRleCA9IHBvc2l0aW9uID4+IDM7CisJCXZhbHVlID0gMSA8PCAocG9zaXRpb24gJiA3KTsKKwkJa3MtPm1jYXN0X2JpdHNbaW5kZXhdIHw9ICh1OCl2YWx1ZTsKKwl9CisKKwlmb3IgKGkgID0gMDsgaSA8IEhXX01DQVNUX1NJWkU7IGkrKykgeworCQlpZiAoaSAmIDEpIHsKKwkJCWtzX3dycmVnMTYoa3MsICh1MTYpKChLU19NQUhUUjAgKyBpKSAmIH4xKSwKKwkJCQkoa3MtPm1jYXN0X2JpdHNbaV0gPDwgOCkgfAorCQkJCWtzLT5tY2FzdF9iaXRzW2kgLSAxXSk7CisJCX0KKwl9Cit9ICAvKiBrc19zZXRfZ3JwYWRkciAqLworCisvKgorKiBrc19jbGVhcl9tY2FzdCAtIGNsZWFyIG11bHRpY2FzdCBpbmZvcm1hdGlvbgorKgorKiBAa3MgOiBUaGUgY2hpcCBpbmZvcm1hdGlvbgorKiBUaGlzIHJvdXRpbmUgcmVtb3ZlcyBhbGwgbWNhc3QgYWRkcmVzc2VzIHNldCBpbiB0aGUgaGFyZHdhcmUuCisqLworCitzdGF0aWMgdm9pZCBrc19jbGVhcl9tY2FzdChzdHJ1Y3Qga3NfbmV0ICprcykKK3sKKwl1MTYJaSwgbWNhc3Rfc2l6ZTsKKwlmb3IgKGkgPSAwOyBpIDwgSFdfTUNBU1RfU0laRTsgaSsrKQorCQlrcy0+bWNhc3RfYml0c1tpXSA9IDA7CisKKwltY2FzdF9zaXplID0gSFdfTUNBU1RfU0laRSA+PiAyOworCWZvciAoaSA9IDA7IGkgPCBtY2FzdF9zaXplOyBpKyspCisJCWtzX3dycmVnMTYoa3MsIEtTX01BSFRSMCArICgyKmkpLCAwKTsKK30KKworc3RhdGljIHZvaWQga3Nfc2V0X3Byb21pcyhzdHJ1Y3Qga3NfbmV0ICprcywgdTE2IHByb21pc2N1b3VzX21vZGUpCit7CisJdTE2CQljbnRsOworCWtzLT5wcm9taXNjdW91cyA9IHByb21pc2N1b3VzX21vZGU7CisJa3Nfc3RvcF9yeChrcyk7ICAvKiBTdG9wIHJlY2VpdmluZyBmb3IgcmVjb25maWd1cmF0aW9uICovCisJY250bCA9IGtzX3JkcmVnMTYoa3MsIEtTX1JYQ1IxKTsKKworCWNudGwgJj0gflJYQ1IxX0ZJTFRFUl9NQVNLOworCWlmIChwcm9taXNjdW91c19tb2RlKQorCQkvKiBFbmFibGUgUHJvbWlzY3VvdXMgbW9kZSAqLworCQljbnRsIHw9IFJYQ1IxX1JYQUUgfCBSWENSMV9SWElOVkY7CisJZWxzZQorCQkvKiBEaXNhYmxlIFByb21pc2N1b3VzIG1vZGUgKGRlZmF1bHQgbm9ybWFsIG1vZGUpICovCisJCWNudGwgfD0gUlhDUjFfUlhQQUZNQTsKKworCWtzX3dycmVnMTYoa3MsIEtTX1JYQ1IxLCBjbnRsKTsKKworCWlmIChrcy0+ZW5hYmxlZCkKKwkJa3Nfc3RhcnRfcngoa3MpOworCit9ICAvKiBrc19zZXRfcHJvbWlzICovCisKK3N0YXRpYyB2b2lkIGtzX3NldF9tY2FzdChzdHJ1Y3Qga3NfbmV0ICprcywgdTE2IG1jYXN0KQoreworCXUxNgljbnRsOworCisJa3MtPmFsbF9tY2FzdCA9IG1jYXN0OworCWtzX3N0b3Bfcngoa3MpOyAgLyogU3RvcCByZWNlaXZpbmcgZm9yIHJlY29uZmlndXJhdGlvbiAqLworCWNudGwgPSBrc19yZHJlZzE2KGtzLCBLU19SWENSMSk7CisJY250bCAmPSB+UlhDUjFfRklMVEVSX01BU0s7CisJaWYgKG1jYXN0KQorCQkvKiBFbmFibGUgIlBlcmZlY3Qgd2l0aCBNdWx0aWNhc3QgYWRkcmVzcyBwYXNzZWQgbW9kZSIgKi8KKwkJY250bCB8PSAoUlhDUjFfUlhBRSB8IFJYQ1IxX1JYTUFGTUEgfCBSWENSMV9SWFBBRk1BKTsKKwllbHNlCisJCS8qKgorCQkgKiBEaXNhYmxlICJQZXJmZWN0IHdpdGggTXVsdGljYXN0IGFkZHJlc3MgcGFzc2VkCisJCSAqIG1vZGUiIChub3JtYWwgbW9kZSkuCisJCSAqLworCQljbnRsIHw9IFJYQ1IxX1JYUEFGTUE7CisKKwlrc193cnJlZzE2KGtzLCBLU19SWENSMSwgY250bCk7CisKKwlpZiAoa3MtPmVuYWJsZWQpCisJCWtzX3N0YXJ0X3J4KGtzKTsKK30gIC8qIGtzX3NldF9tY2FzdCAqLworCitzdGF0aWMgdm9pZCBrc19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBrc19uZXQgKmtzID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKnB0cjsKKworCS8qIFR1cm4gb24vb2ZmIHByb21pc2N1b3VzIG1vZGUuICovCisJaWYgKChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID09IElGRl9QUk9NSVNDKQorCQlrc19zZXRfcHJvbWlzKGtzLAorCQkJKHUxNikoKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPT0gSUZGX1BST01JU0MpKTsKKwkvKiBUdXJuIG9uL29mZiBhbGwgbWNhc3QgbW9kZS4gKi8KKwllbHNlIGlmICgobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgPT0gSUZGX0FMTE1VTFRJKQorCQlrc19zZXRfbWNhc3Qoa3MsCisJCQkodTE2KSgobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgPT0gSUZGX0FMTE1VTFRJKSk7CisJZWxzZQorCQlrc19zZXRfcHJvbWlzKGtzLCBmYWxzZSk7CisKKwlpZiAoKG5ldGRldi0+ZmxhZ3MgJiBJRkZfTVVMVElDQVNUKSAmJiBuZXRkZXYtPm1jX2NvdW50KSB7CisJCWlmIChuZXRkZXYtPm1jX2NvdW50IDw9IE1BWF9NQ0FTVF9MU1QpIHsKKwkJCWludCBpID0gMDsKKwkJCWZvciAocHRyID0gbmV0ZGV2LT5tY19saXN0OyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkgeworCQkJCWlmICghKCpwdHItPmRtaV9hZGRyICYgMSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChpID49IE1BWF9NQ0FTVF9MU1QpCisJCQkJCWJyZWFrOworCQkJCW1lbWNweShrcy0+bWNhc3RfbHN0W2krK10sIHB0ci0+ZG1pX2FkZHIsCisJCQkJTUFDX0FERFJfTEVOKTsKKwkJCX0KKwkJCWtzLT5tY2FzdF9sc3Rfc2l6ZSA9ICh1OClpOworCQkJa3Nfc2V0X2dycGFkZHIoa3MpOworCQl9IGVsc2UgeworCQkJLyoqCisJCQkgKiBMaXN0IHRvbyBiaWcgdG8gc3VwcG9ydCBzbworCQkJICogdHVybiBvbiBhbGwgbWNhc3QgbW9kZS4KKwkJCSAqLworCQkJa3MtPm1jYXN0X2xzdF9zaXplID0gTUFYX01DQVNUX0xTVDsKKwkJCWtzX3NldF9tY2FzdChrcywgdHJ1ZSk7CisJCX0KKwl9IGVsc2UgeworCQlrcy0+bWNhc3RfbHN0X3NpemUgPSAwOworCQlrc19jbGVhcl9tY2FzdChrcyk7CisJfQorfSAvKiBrc19zZXRfcnhfbW9kZSAqLworCitzdGF0aWMgdm9pZCBrc19zZXRfbWFjKHN0cnVjdCBrc19uZXQgKmtzLCB1OCAqZGF0YSkKK3sKKwl1MTYgKnB3ID0gKHUxNiAqKWRhdGE7CisJdTE2IHcsIHU7CisKKwlrc19zdG9wX3J4KGtzKTsgIC8qIFN0b3AgcmVjZWl2aW5nIGZvciByZWNvbmZpZ3VyYXRpb24gKi8KKworCXUgPSAqcHcrKzsKKwl3ID0gKCh1ICYgMHhGRikgPDwgOCkgfCAoKHUgPj4gOCkgJiAweEZGKTsKKwlrc193cnJlZzE2KGtzLCBLU19NQVJILCB3KTsKKworCXUgPSAqcHcrKzsKKwl3ID0gKCh1ICYgMHhGRikgPDwgOCkgfCAoKHUgPj4gOCkgJiAweEZGKTsKKwlrc193cnJlZzE2KGtzLCBLU19NQVJNLCB3KTsKKworCXUgPSAqcHc7CisJdyA9ICgodSAmIDB4RkYpIDw8IDgpIHwgKCh1ID4+IDgpICYgMHhGRik7CisJa3Nfd3JyZWcxNihrcywgS1NfTUFSTCwgdyk7CisKKwltZW1jcHkoa3MtPm1hY19hZGRyLCBkYXRhLCA2KTsKKworCWlmIChrcy0+ZW5hYmxlZCkKKwkJa3Nfc3RhcnRfcngoa3MpOworfQorCitzdGF0aWMgaW50IGtzX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwYWRkcikKK3sKKwlzdHJ1Y3Qga3NfbmV0ICprcyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcGFkZHI7CisJdTggKmRhOworCisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCisJZGEgPSAodTggKiluZXRkZXYtPmRldl9hZGRyOworCisJa3Nfc2V0X21hYyhrcywgZGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtzX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKnJlcSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qga3NfbmV0ICprcyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZ2VuZXJpY19taWlfaW9jdGwoJmtzLT5taWksIGlmX21paShyZXEpLCBjbWQsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGtzX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGtzX25ldF9vcGVuLAorCS5uZG9fc3RvcAkJPSBrc19uZXRfc3RvcCwKKwkubmRvX2RvX2lvY3RsCQk9IGtzX25ldF9pb2N0bCwKKwkubmRvX3N0YXJ0X3htaXQJCT0ga3Nfc3RhcnRfeG1pdCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGtzX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX3NldF9yeF9tb2RlCT0ga3Nfc2V0X3J4X21vZGUsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKworLyogZXRodG9vbCBzdXBwb3J0ICovCisKK3N0YXRpYyB2b2lkIGtzX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZGkpCit7CisJc3RybGNweShkaS0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGRpLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRpLT52ZXJzaW9uLCAiMS4wMCIsIHNpemVvZihkaS0+dmVyc2lvbikpOworCXN0cmxjcHkoZGktPmJ1c19pbmZvLCBkZXZfbmFtZShuZXRkZXYtPmRldi5wYXJlbnQpLAorCQlzaXplb2YoZGktPmJ1c19pbmZvKSk7Cit9CisKK3N0YXRpYyB1MzIga3NfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtzX25ldCAqa3MgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBrcy0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQga3Nfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiB0bykKK3sKKwlzdHJ1Y3Qga3NfbmV0ICprcyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJa3MtPm1zZ19lbmFibGUgPSB0bzsKK30KKworc3RhdGljIGludCBrc19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGtzX25ldCAqa3MgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBtaWlfZXRodG9vbF9nc2V0KCZrcy0+bWlpLCBjbWQpOworfQorCitzdGF0aWMgaW50IGtzX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qga3NfbmV0ICprcyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuIG1paV9ldGh0b29sX3NzZXQoJmtzLT5taWksIGNtZCk7Cit9CisKK3N0YXRpYyB1MzIga3NfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qga3NfbmV0ICprcyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuIG1paV9saW5rX29rKCZrcy0+bWlpKTsKK30KKworc3RhdGljIGludCBrc19ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtzX25ldCAqa3MgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZrcy0+bWlpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBrc19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JPSBrc19nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCT0ga3NfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJPSBrc19zZXRfbXNnbGV2ZWwsCisJLmdldF9zZXR0aW5ncwk9IGtzX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCT0ga3Nfc2V0X3NldHRpbmdzLAorCS5nZXRfbGluawk9IGtzX2dldF9saW5rLAorCS5ud2F5X3Jlc2V0CT0ga3NfbndheV9yZXNldCwKK307CisKKy8qIE1JSSBpbnRlcmZhY2UgY29udHJvbHMgKi8KKworLyoqCisgKiBrc19waHlfcmVnIC0gY29udmVydCBNSUkgcmVnaXN0ZXIgaW50byBhIEtTODg1MSByZWdpc3RlcgorICogQHJlZzogTUlJIHJlZ2lzdGVyIG51bWJlci4KKyAqCisgKiBSZXR1cm4gdGhlIEtTODg1MSByZWdpc3RlciBudW1iZXIgZm9yIHRoZSBjb3JyZXNwb25kaW5nIE1JSSBQSFkgcmVnaXN0ZXIKKyAqIGlmIHBvc3NpYmxlLiBSZXR1cm4gemVybyBpZiB0aGUgTUlJIHJlZ2lzdGVyIGhhcyBubyBkaXJlY3QgbWFwcGluZyB0byB0aGUKKyAqIEtTODg1MSByZWdpc3RlciBzZXQuCisgKi8KK3N0YXRpYyBpbnQga3NfcGh5X3JlZyhpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBNSUlfQk1DUjoKKwkJcmV0dXJuIEtTX1AxTUJDUjsKKwljYXNlIE1JSV9CTVNSOgorCQlyZXR1cm4gS1NfUDFNQlNSOworCWNhc2UgTUlJX1BIWVNJRDE6CisJCXJldHVybiBLU19QSFkxSUxSOworCWNhc2UgTUlJX1BIWVNJRDI6CisJCXJldHVybiBLU19QSFkxSUhSOworCWNhc2UgTUlJX0FEVkVSVElTRToKKwkJcmV0dXJuIEtTX1AxQU5BUjsKKwljYXNlIE1JSV9MUEE6CisJCXJldHVybiBLU19QMUFOTFBSOworCX0KKworCXJldHVybiAweDA7Cit9CisKKy8qKgorICoga3NfcGh5X3JlYWQgLSBNSUkgaW50ZXJmYWNlIFBIWSByZWdpc3RlciByZWFkLgorICogQG5ldGRldjogVGhlIG5ldHdvcmsgZGV2aWNlIHRoZSBQSFkgaXMgb24uCisgKiBAcGh5X2FkZHI6IEFkZHJlc3Mgb2YgUEhZIChpZ25vcmVkIGFzIHdlIG9ubHkgaGF2ZSBvbmUpCisgKiBAcmVnOiBUaGUgcmVnaXN0ZXIgdG8gcmVhZC4KKyAqCisgKiBUaGlzIGNhbGwgcmVhZHMgZGF0YSBmcm9tIHRoZSBQSFkgcmVnaXN0ZXIgc3BlY2lmaWVkIGluIEByZWcuIFNpbmNlIHRoZQorICogZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgYWxsIHRoZSBNSUkgcmVnaXN0ZXJzLCB0aGUgbm9uLWV4aXN0YW50IHZhbHVlcworICogYXJlIGFsd2F5cyByZXR1cm5lZCBhcyB6ZXJvLgorICoKKyAqIFdlIHJldHVybiB6ZXJvIGZvciB1bnN1cHBvcnRlZCByZWdpc3RlcnMgYXMgdGhlIE1JSSBjb2RlIGRvZXMgbm90IGNoZWNrCisgKiB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIGFueSBlcnJvciBzdGF0dXMsIGFuZCBzaW1wbHkgcmV0dXJucyBpdCB0byB0aGUKKyAqIGNhbGxlci4gVGhlIG1paS10b29sIHRoYXQgdGhlIGRyaXZlciB3YXMgdGVzdGVkIHdpdGggdGFrZXMgYW55IC12ZSBlcnJvcgorICogYXMgcmVhbCBQSFkgY2FwYWJpbGl0aWVzLCB0aHVzIGRpc3BsYXlpbmcgaW5jb3JyZWN0IGRhdGEgdG8gdGhlIHVzZXIuCisgKi8KK3N0YXRpYyBpbnQga3NfcGh5X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9hZGRyLCBpbnQgcmVnKQoreworCXN0cnVjdCBrc19uZXQgKmtzID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQga3NyZWc7CisJaW50IHJlc3VsdDsKKworCWtzcmVnID0ga3NfcGh5X3JlZyhyZWcpOworCWlmICgha3NyZWcpCisJCXJldHVybiAweDA7CS8qIG5vIGVycm9yIHJldHVybiBhbGxvd2VkLCBzbyB1c2UgemVybyAqLworCisJbXV0ZXhfbG9jaygma3MtPmxvY2spOworCXJlc3VsdCA9IGtzX3JkcmVnMTYoa3MsIGtzcmVnKTsKKwltdXRleF91bmxvY2soJmtzLT5sb2NrKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGtzX3BoeV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBpbnQgcGh5LCBpbnQgcmVnLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGtzX25ldCAqa3MgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBrc3JlZzsKKworCWtzcmVnID0ga3NfcGh5X3JlZyhyZWcpOworCWlmIChrc3JlZykgeworCQltdXRleF9sb2NrKCZrcy0+bG9jayk7CisJCWtzX3dycmVnMTYoa3MsIGtzcmVnLCB2YWx1ZSk7CisJCW11dGV4X3VubG9jaygma3MtPmxvY2spOworCX0KK30KKworLyoqCisgKiBrc19yZWFkX3NlbGZ0ZXN0IC0gcmVhZCB0aGUgc2VsZnRlc3QgbWVtb3J5IGluZm8uCisgKiBAa3M6IFRoZSBkZXZpY2Ugc3RhdGUKKyAqCisgKiBSZWFkIGFuZCBjaGVjayB0aGUgVFgvUlggbWVtb3J5IHNlbGZ0ZXN0IGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgaW50IGtzX3JlYWRfc2VsZnRlc3Qoc3RydWN0IGtzX25ldCAqa3MpCit7CisJdW5zaWduZWQgYm90aF9kb25lID0gTUJJUl9UWE1CRiB8IE1CSVJfUlhNQkY7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgcmQ7CisKKwlyZCA9IGtzX3JkcmVnMTYoa3MsIEtTX01CSVIpOworCisJaWYgKChyZCAmIGJvdGhfZG9uZSkgIT0gYm90aF9kb25lKSB7CisJCWtzX3dhcm4oa3MsICJNZW1vcnkgc2VsZnRlc3Qgbm90IGZpbmlzaGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJkICYgTUJJUl9UWE1CRkEpIHsKKwkJa3NfZXJyKGtzLCAiVFggbWVtb3J5IHNlbGZ0ZXN0IGZhaWxzXG4iKTsKKwkJcmV0IHw9IDE7CisJfQorCisJaWYgKHJkICYgTUJJUl9SWE1CRkEpIHsKKwkJa3NfZXJyKGtzLCAiUlggbWVtb3J5IHNlbGZ0ZXN0IGZhaWxzXG4iKTsKKwkJcmV0IHw9IDI7CisJfQorCisJa3NfaW5mbyhrcywgInRoZSBzZWxmdGVzdCBwYXNzZXNcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGtzX2Rpc2FibGUoc3RydWN0IGtzX25ldCAqa3MpCit7CisJdTE2CXc7CisKKwl3ID0ga3NfcmRyZWcxNihrcywgS1NfVFhDUik7CisKKwkvKiBEaXNhYmxlcyBRTVUgVHJhbnNtaXQgKFRYQ1IpLiAqLworCXcgICY9IH5UWENSX1RYRTsKKwlrc193cnJlZzE2KGtzLCBLU19UWENSLCB3KTsKKworCS8qIERpc2FibGVzIFFNVSBSZWNlaXZlIChSWENSMSkuICovCisJdyA9IGtzX3JkcmVnMTYoa3MsIEtTX1JYQ1IxKTsKKwl3ICY9IH5SWENSMV9SWEUgOworCWtzX3dycmVnMTYoa3MsIEtTX1JYQ1IxLCB3KTsKKworCWtzLT5lbmFibGVkID0gZmFsc2U7CisKK30gIC8qIGtzX2Rpc2FibGUgKi8KKworc3RhdGljIHZvaWQga3Nfc2V0dXAoc3RydWN0IGtzX25ldCAqa3MpCit7CisJdTE2CXc7CisKKwkvKioKKwkgKiBDb25maWd1cmUgUU1VIFRyYW5zbWl0CisJICovCisKKwkvKiBTZXR1cCBUcmFuc21pdCBGcmFtZSBEYXRhIFBvaW50ZXIgQXV0by1JbmNyZW1lbnQgKFRYRkRQUikgKi8KKwlrc193cnJlZzE2KGtzLCBLU19UWEZEUFIsIFRYRkRQUl9UWEZQQUkpOworCisJLyogU2V0dXAgUmVjZWl2ZSBGcmFtZSBEYXRhIFBvaW50ZXIgQXV0by1JbmNyZW1lbnQgKi8KKwlrc193cnJlZzE2KGtzLCBLU19SWEZEUFIsIFJYRkRQUl9SWEZQQUkpOworCisJLyogU2V0dXAgUmVjZWl2ZSBGcmFtZSBUaHJlc2hvbGQgLSAxIGZyYW1lIChSWEZDVEZDKSAqLworCWtzX3dycmVnMTYoa3MsIEtTX1JYRkNUUiwgMSAmIFJYRkNUUl9USFJFU0hPTERfTUFTSyk7CisKKwkvKiBTZXR1cCBSeFEgQ29tbWFuZCBDb250cm9sIChSWFFDUikgKi8KKwlrcy0+cmNfcnhxY3IgPSBSWFFDUl9DTURfQ05UTDsKKwlrc193cnJlZzE2KGtzLCBLU19SWFFDUiwga3MtPnJjX3J4cWNyKTsKKworCS8qKgorCSAqIHNldCB0aGUgZm9yY2UgbW9kZSB0byBoYWxmIGR1cGxleCwgZGVmYXVsdCBpcyBmdWxsIGR1cGxleAorCSAqICBiZWNhdXNlIGlmIHRoZSBhdXRvLW5lZ290aWF0aW9uIGZhaWxzLCBtb3N0IHN3aXRjaCB1c2VzCisJICogIGhhbGYtZHVwbGV4LgorCSAqLworCisJdyA9IGtzX3JkcmVnMTYoa3MsIEtTX1AxTUJDUik7CisJdyAmPSB+UDFNQkNSX0ZPUkNFX0ZEWDsKKwlrc193cnJlZzE2KGtzLCBLU19QMU1CQ1IsIHcpOworCisJdyA9IFRYQ1JfVFhGQ0UgfCBUWENSX1RYUEUgfCBUWENSX1RYQ1JDIHwgVFhDUl9UQ0dJUDsKKwlrc193cnJlZzE2KGtzLCBLU19UWENSLCB3KTsKKworCXcgPSBSWENSMV9SWEZDRSB8IFJYQ1IxX1JYQkUgfCBSWENSMV9SWFVFOworCisJaWYgKGtzLT5wcm9taXNjdW91cykgICAgICAgICAvKiBiUHJvbWlzY3VvdXMgKi8KKwkJdyB8PSAoUlhDUjFfUlhBRSB8IFJYQ1IxX1JYSU5WRik7CisJZWxzZSBpZiAoa3MtPmFsbF9tY2FzdCkgLyogTXVsdGljYXN0IGFkZHJlc3MgcGFzc2VkIG1vZGUgKi8KKwkJdyB8PSAoUlhDUjFfUlhBRSB8IFJYQ1IxX1JYTUFGTUEgfCBSWENSMV9SWFBBRk1BKTsKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgbW9kZSAqLworCQl3IHw9IFJYQ1IxX1JYUEFGTUE7CisKKwlrc193cnJlZzE2KGtzLCBLU19SWENSMSwgdyk7Cit9ICAvKmtzX3NldHVwICovCisKKworc3RhdGljIHZvaWQga3Nfc2V0dXBfaW50KHN0cnVjdCBrc19uZXQgKmtzKQoreworCWtzLT5yY19pZXIgPSAweDAwOworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIHN0YXR1cyBvZiB0aGUgaGFyZHdhcmUuICovCisJa3Nfd3JyZWcxNihrcywgS1NfSVNSLCAweGZmZmYpOworCisJLyogRW5hYmxlcyB0aGUgaW50ZXJydXB0cyBvZiB0aGUgaGFyZHdhcmUuICovCisJa3MtPnJjX2llciA9IChJUlFfTENJIHwgSVJRX1RYSSB8IElSUV9SWEkpOworfSAgLyoga3Nfc2V0dXBfaW50ICovCisKK3ZvaWQga3NfZW5hYmxlKHN0cnVjdCBrc19uZXQgKmtzKQoreworCXUxNiB3OworCisJdyA9IGtzX3JkcmVnMTYoa3MsIEtTX1RYQ1IpOworCS8qIEVuYWJsZXMgUU1VIFRyYW5zbWl0IChUWENSKS4gKi8KKwlrc193cnJlZzE2KGtzLCBLU19UWENSLCB3IHwgVFhDUl9UWEUpOworCisJLyoKKwkgKiBSWCBGcmFtZSBDb3VudCBUaHJlc2hvbGQgRW5hYmxlIGFuZCBBdXRvLURlcXVldWUgUlhRIEZyYW1lCisJICogRW5hYmxlCisJICovCisKKwl3ID0ga3NfcmRyZWcxNihrcywgS1NfUlhRQ1IpOworCWtzX3dycmVnMTYoa3MsIEtTX1JYUUNSLCB3IHwgUlhRQ1JfUlhGQ1RFKTsKKworCS8qIEVuYWJsZXMgUU1VIFJlY2VpdmUgKFJYQ1IxKS4gKi8KKwl3ID0ga3NfcmRyZWcxNihrcywgS1NfUlhDUjEpOworCWtzX3dycmVnMTYoa3MsIEtTX1JYQ1IxLCB3IHwgUlhDUjFfUlhFKTsKKwlrcy0+ZW5hYmxlZCA9IHRydWU7Cit9ICAvKiBrc19lbmFibGUgKi8KKworc3RhdGljIGludCBrc19od19pbml0KHN0cnVjdCBrc19uZXQgKmtzKQoreworI2RlZmluZQlNSEVBREVSX1NJWkUJKHNpemVvZihzdHJ1Y3QgdHlwZV9mcmFtZV9oZWFkKSAqIE1BWF9SRUNWX0ZSQU1FUykKKwlrcy0+cHJvbWlzY3VvdXMgPSAwOworCWtzLT5hbGxfbWNhc3QgPSAwOworCWtzLT5tY2FzdF9sc3Rfc2l6ZSA9IDA7CisKKwlrcy0+ZnJhbWVfaGVhZF9pbmZvID0gKHN0cnVjdCB0eXBlX2ZyYW1lX2hlYWQgKikgXAorCQlrbWFsbG9jKE1IRUFERVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrcy0+ZnJhbWVfaGVhZF9pbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IEZhaWwgdG8gYWxsb2NhdGUgZnJhbWUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWtzX3NldF9tYWMoa3MsIEtTX0RFRkFVTFRfTUFDX0FERFJFU1MpOworCXJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGtzODg1MV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBlcnIgPSAtRU5PTUVNOworCXN0cnVjdCByZXNvdXJjZSAqaW9fZCwgKmlvX2M7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3Qga3NfbmV0ICprczsKKwl1MTYgaWQsIGRhdGE7CisKKwlpb19kID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpb19jID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvX2QtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvX2QpLCBEUlZfTkFNRSkpCisJCWdvdG8gZXJyX21lbV9yZWdpb247CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpb19jLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb19jKSwgRFJWX05BTUUpKQorCQlnb3RvIGVycl9tZW1fcmVnaW9uMTsKKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qga3NfbmV0KSk7CisJaWYgKCFuZXRkZXYpCisJCWdvdG8gZXJyX2FsbG9jX2V0aGVyZGV2OworCisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCWtzID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlrcy0+bmV0ZGV2ID0gbmV0ZGV2OworCWtzLT5od19hZGRyID0gaW9yZW1hcChpb19kLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb19kKSk7CisKKwlpZiAoIWtzLT5od19hZGRyKQorCQlnb3RvIGVycl9pb3JlbWFwOworCisJa3MtPmh3X2FkZHJfY21kID0gaW9yZW1hcChpb19jLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb19jKSk7CisJaWYgKCFrcy0+aHdfYWRkcl9jbWQpCisJCWdvdG8gZXJyX2lvcmVtYXAxOworCisJa3MtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwlpZiAoa3MtPmlycSA8IDApIHsKKwkJZXJyID0ga3MtPmlycTsKKwkJZ290byBlcnJfZ2V0X2lycTsKKwl9CisKKwlrcy0+cGRldiA9IHBkZXY7CisKKwltdXRleF9pbml0KCZrcy0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmtzLT5zdGF0ZWxvY2spOworCisJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmtzX25ldGRldl9vcHM7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZrc19ldGh0b29sX29wczsKKworCS8qIHNldHVwIG1paSBzdGF0ZSAqLworCWtzLT5taWkuZGV2ICAgICAgICAgICAgID0gbmV0ZGV2OworCWtzLT5taWkucGh5X2lkICAgICAgICAgID0gMSwKKwlrcy0+bWlpLnBoeV9pZF9tYXNrICAgICA9IDE7CisJa3MtPm1paS5yZWdfbnVtX21hc2sgICAgPSAweGY7CisJa3MtPm1paS5tZGlvX3JlYWQgICAgICAgPSBrc19waHlfcmVhZDsKKwlrcy0+bWlpLm1kaW9fd3JpdGUgICAgICA9IGtzX3BoeV93cml0ZTsKKworCWtzX2luZm8oa3MsICJtZXNzYWdlIGVuYWJsZSBpcyAlZFxuIiwgbXNnX2VuYWJsZSk7CisJLyogc2V0IHRoZSBkZWZhdWx0IG1lc3NhZ2UgZW5hYmxlICovCisJa3MtPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChtc2dfZW5hYmxlLCAoTkVUSUZfTVNHX0RSViB8CisJCQkJCQkgICAgIE5FVElGX01TR19QUk9CRSB8CisJCQkJCQkgICAgIE5FVElGX01TR19MSU5LKSk7CisJa3NfcmVhZF9jb25maWcoa3MpOworCisJLyogc2ltcGxlIGNoZWNrIGZvciBhIHZhbGlkIGNoaXAgYmVpbmcgY29ubmVjdGVkIHRvIHRoZSBidXMgKi8KKwlpZiAoKGtzX3JkcmVnMTYoa3MsIEtTX0NJREVSKSAmIH5DSURFUl9SRVZfTUFTSykgIT0gQ0lERVJfSUQpIHsKKwkJa3NfZXJyKGtzLCAiZmFpbGVkIHRvIHJlYWQgZGV2aWNlIElEXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisJfQorCisJaWYgKGtzX3JlYWRfc2VsZnRlc3Qoa3MpKSB7CisJCWtzX2VycihrcywgImZhaWxlZCB0byByZWFkIGRldmljZSBJRFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlZ2lzdGVyOworCX0KKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlZ2lzdGVyOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKKworCWtzX3NvZnRfcmVzZXQoa3MsIEdSUl9HU1IpOworCWtzX2h3X2luaXQoa3MpOworCWtzX2Rpc2FibGUoa3MpOworCWtzX3NldHVwKGtzKTsKKwlrc19zZXR1cF9pbnQoa3MpOworCWtzX2VuYWJsZV9pbnQoa3MpOworCWtzX2VuYWJsZShrcyk7CisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGtzLT5tYWNfYWRkciwgNik7CisKKwlkYXRhID0ga3NfcmRyZWcxNihrcywgS1NfT0JDUik7CisJa3Nfd3JyZWcxNihrcywgS1NfT0JDUiwgZGF0YSB8IE9CQ1JfT0RTXzE2TUEpOworCisJLyoqCisJICogSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IE1BQyBhZGRyLAorCSAqIGNvbW1lbnQgb3V0IHRoZSAyIGZ1bmN0aW9ucyBiZWxvdy4KKwkgKi8KKworCXJhbmRvbV9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpOworCWtzX3NldF9tYWMoa3MsIG5ldGRldi0+ZGV2X2FkZHIpOworCisJaWQgPSBrc19yZHJlZzE2KGtzLCBLU19DSURFUik7CisKKwlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCSIgRm91bmQgY2hpcCwgZmFtaWx5OiAweCV4LCBpZDogMHgleCwgcmV2OiAweCV4XG4iLAorCQkoaWQgPj4gOCkgJiAweGZmLCAoaWQgPj4gNCkgJiAweGYsIChpZCA+PiAxKSAmIDB4Nyk7CisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3RlcjoKK2Vycl9nZXRfaXJxOgorCWlvdW5tYXAoa3MtPmh3X2FkZHJfY21kKTsKK2Vycl9pb3JlbWFwMToKKwlpb3VubWFwKGtzLT5od19hZGRyKTsKK2Vycl9pb3JlbWFwOgorCWZyZWVfbmV0ZGV2KG5ldGRldik7CitlcnJfYWxsb2NfZXRoZXJkZXY6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvX2MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvX2MpKTsKK2Vycl9tZW1fcmVnaW9uMToKKwlyZWxlYXNlX21lbV9yZWdpb24oaW9fZC0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9fZCkpOworZXJyX21lbV9yZWdpb246CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQga3M4ODUxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qga3NfbmV0ICprcyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHJlc291cmNlICppb21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlvdW5tYXAoa3MtPmh3X2FkZHIpOworCWZyZWVfbmV0ZGV2KG5ldGRldik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb21lbSkpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGtzODg1MV9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBrczg4NTFfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGtzODg1MV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQga3M4ODUxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZrczg4NTFfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGtzODg1MV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmtzODg1MV9wbGF0Zm9ybV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChrczg4NTFfaW5pdCk7Cittb2R1bGVfZXhpdChrczg4NTFfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiS1M4ODUxIE1MTCBOZXR3b3JrIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgQ2hvaSA8ZGF2aWQuY2hvaUBtaWNyZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtX25hbWVkKG1lc3NhZ2UsIG1zZ19lbmFibGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lc3NhZ2UsICJNZXNzYWdlIHZlcmJvc2l0eSBsZXZlbCAoMD1ub25lLCAzMT1hbGwpIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21ldGguYyBiL2RyaXZlcnMvbmV0L21ldGguYwppbmRleCA5MmNlYjY4Li4yYWY4MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbWV0aC5jCkBAIC04MjgsNyArODI4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWV0aF9kcml2ZXIgPSB7CiAJLnByb2JlCT0gbWV0aF9wcm9iZSwKLQkucmVtb3ZlCT0gX19kZXZleGl0X3AobWV0aF9yZW1vdmUpLAorCS5yZW1vdmUJPSBfX2V4aXRfcChtZXRoX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAibWV0aCIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9mdy5jIGIvZHJpdmVycy9uZXQvbWx4NC9mdy5jCmluZGV4IGNlZTE5OWMuLjNjMTY2MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZncuYworKysgYi9kcml2ZXJzL25ldC9tbHg0L2Z3LmMKQEAgLTMzLDYgKzMzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogCiAjaW5jbHVkZSAiZncuaCIKICNpbmNsdWRlICJpY20uaCIKQEAgLTY5OCw2ICs2OTksNyBAQAogI2RlZmluZSBJTklUX0hDQV9JTl9TSVpFCQkgMHgyMDAKICNkZWZpbmUgSU5JVF9IQ0FfVkVSU0lPTl9PRkZTRVQJCSAweDAwMAogI2RlZmluZQkgSU5JVF9IQ0FfVkVSU0lPTgkJIDIKKyNkZWZpbmUgSU5JVF9IQ0FfQ0FDSEVMSU5FX1NaX09GRlNFVAkgMHgwZQogI2RlZmluZSBJTklUX0hDQV9GTEFHU19PRkZTRVQJCSAweDAxNAogI2RlZmluZSBJTklUX0hDQV9RUENfT0ZGU0VUCQkgMHgwMjAKICNkZWZpbmUJIElOSVRfSENBX1FQQ19CQVNFX09GRlNFVAkgKElOSVRfSENBX1FQQ19PRkZTRVQgKyAweDEwKQpAQCAtNzM1LDYgKzczNyw5IEBACiAKIAkqKCh1OCAqKSBtYWlsYm94LT5idWYgKyBJTklUX0hDQV9WRVJTSU9OX09GRlNFVCkgPSBJTklUX0hDQV9WRVJTSU9OOwogCisJKigodTggKikgbWFpbGJveC0+YnVmICsgSU5JVF9IQ0FfQ0FDSEVMSU5FX1NaX09GRlNFVCkgPQorCQkoaWxvZzIoY2FjaGVfbGluZV9zaXplKCkpIC0gNCkgPDwgNTsKKwogI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCSooaW5ib3ggKyBJTklUX0hDQV9GTEFHU19PRkZTRVQgLyA0KSAmPSB+Y3B1X3RvX2JlMzIoMSA8PCAxKTsKICNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9tYWluLmMgYi9kcml2ZXJzL25ldC9tbHg0L21haW4uYwppbmRleCAzZGQ0ODFlLi4yOTFhNTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL25ldC9tbHg0L21haW4uYwpAQCAtMTI4Miw2ICsxMjgyLDggQEAKIAl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDYzNzIpIH0sIC8qIE1UMjU0NTggQ29ubmVjdFggRU4gMTBHQkFTRS1UIDEwR2lnRSAqLwogCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4Njc1YSkgfSwgLyogTVQyNTQ1OCBDb25uZWN0WCBFTiAxMEdCQVNFLVQrR2VuMiAxMEdpZ0UgKi8KIAl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDY3NjQpIH0sIC8qIE1UMjY0NjggQ29ubmVjdFggRU4gMTBHaWdFIFBDSWUgZ2VuMiovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2NzQ2KSB9LCAvKiBNVDI2NDM4IENvbm5lY3RYIEVOIDQwR2lnRSBQQ0llIGdlbjIgNUdUL3MgKi8KKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDY3NmUpIH0sIC8qIE1UMjY0NzggQ29ubmVjdFgyIDQwR2lnRSBQQ0llIGdlbjIgKi8KIAl7IDAsIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCmluZGV4IDY5MzBjODcuLmYzNjI0NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKKysrIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwpAQCAtNzUsNyArNzUsNyBAQAogI2luY2x1ZGUgIm15cmkxMGdlX21jcC5oIgogI2luY2x1ZGUgIm15cmkxMGdlX21jcF9nZW5faGVhZGVyLmgiCiAKLSNkZWZpbmUgTVlSSTEwR0VfVkVSU0lPTl9TVFIgIjEuNS4wLTEuNDMyIgorI2RlZmluZSBNWVJJMTBHRV9WRVJTSU9OX1NUUiAiMS41LjEtMS40NTEiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiTXlyaWNvbSAxMEcgZHJpdmVyICgxMEdiRSkiKTsKIE1PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IGhlbHBAbXlyaS5jb20iKTsKQEAgLTE2MjQsMTAgKzE2MjQsMjEgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCWlmICgqcHRyID09ICdSJyB8fCAqcHRyID09ICdRJykgewotCQkvKiBXZSd2ZSBmb3VuZCBlaXRoZXIgYW4gWEZQIG9yIHF1YWQgcmliYm9uIGZpYmVyICovCisJaWYgKCpwdHIgPT0gJzInKQorCQlwdHIrKzsKKwlpZiAoKnB0ciA9PSAnUicgfHwgKnB0ciA9PSAnUScgfHwgKnB0ciA9PSAnUycpIHsKKwkJLyogV2UndmUgZm91bmQgZWl0aGVyIGFuIFhGUCwgcXVhZCByaWJib24gZmliZXIsIG9yIFNGUCsgKi8KIAkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwkJY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0ZJQlJFOworCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfRklCUkU7CisJfSBlbHNlIHsKKwkJY21kLT5wb3J0ID0gUE9SVF9PVEhFUjsKIAl9CisJaWYgKCpwdHIgPT0gJ1InIHx8ICpwdHIgPT0gJ1MnKQorCQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwllbHNlCisJCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2hkci5oIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaGRyLmgKaW5kZXggN2E3MTc3NC4uMWM0NmRhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaGRyLmgKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaGRyLmgKQEAgLTQxOSw2ICs0MTksNyBAQAogI2RlZmluZSBORVRYRU5fQ1JCX1JPTVVTQglcCiAJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX1JPTVVTQikKICNkZWZpbmUgTkVUWEVOX0NSQl9JMlEJCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9JMlEpCisjZGVmaW5lIE5FVFhFTl9DUkJfSTJDMAkJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX0kyQzApCiAjZGVmaW5lIE5FVFhFTl9DUkJfU01CCQlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfU01CKQogI2RlZmluZSBORVRYRU5fQ1JCX01BWAkJTkVUWEVOX1BDSV9DUkJfV0lORE9XKDY0KQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYwppbmRleCAzMjMxNDAwLi4zMTg1YTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMKQEAgLTE5MDEsMjIgKzE5MDEsMTYgQEAKIAogaW50IG5ldHhlbl9uaWNfZ2V0X2JvYXJkX2luZm8oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQogewotCWludCBvZmZzZXQsIGJvYXJkX3R5cGUsIG1hZ2ljLCBoZWFkZXJfdmVyc2lvbjsKKwlpbnQgb2Zmc2V0LCBib2FyZF90eXBlLCBtYWdpYzsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAKIAlvZmZzZXQgPSBOWF9GV19NQUdJQ19PRkZTRVQ7CiAJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIG9mZnNldCwgJm1hZ2ljKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlvZmZzZXQgPSBOWF9IRFJfVkVSU0lPTl9PRkZTRVQ7Ci0JaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIG9mZnNldCwgJmhlYWRlcl92ZXJzaW9uKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAobWFnaWMgIT0gTkVUWEVOX0JESU5GT19NQUdJQyB8fAotCQkJaGVhZGVyX3ZlcnNpb24gIT0gTkVUWEVOX0JESU5GT19WRVJTSU9OKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJpbnZhbGlkIGJvYXJkIGNvbmZpZywgbWFnaWM9JTA4eCwgdmVyc2lvbj0lMDh4XG4iLAotCQkJbWFnaWMsIGhlYWRlcl92ZXJzaW9uKTsKKwlpZiAobWFnaWMgIT0gTkVUWEVOX0JESU5GT19NQUdJQykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGJvYXJkIGNvbmZpZywgbWFnaWM9JTA4eFxuIiwKKwkJCW1hZ2ljKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMKaW5kZXggOTFjMmJjNi4uZTQwYjkxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYwpAQCAtNTMxLDYgKzUzMSw4IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoTlhfSVNfUkVWSVNJT05fUDMoYWRhcHRlci0+YWh3LnJldmlzaW9uX2lkKSkgeworCQkJaWYgKG9mZiA9PSAoTkVUWEVOX0NSQl9JMkMwICsgMHgxYykpCisJCQkJY29udGludWU7CiAJCQkvKiBkbyBub3QgcmVzZXQgUENJICovCiAJCQlpZiAob2ZmID09IChST01VU0JfR0xCICsgMHhiYykpCiAJCQkJY29udGludWU7CkBAIC01NTMsMTIgKzU1NSw2IEBACiAJCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAob2ZmID09IE5FVFhFTl9BRERSX0VSUk9SKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnI6IFVua25vd24gYWRkcjogMHglMDh4XG4iLAotCQkJCQluZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBidWZbaV0uYWRkcik7Ci0JCQljb250aW51ZTsKLQkJfQotCiAJCWluaXRfZGVsYXkgPSAxOwogCQkvKiBBZnRlciB3cml0aW5nIHRoaXMgcmVnaXN0ZXIsIEhXIG5lZWRzIHRpbWUgZm9yIENSQiAqLwogCQkvKiB0byBxdWlldCBkb3duIChlbHNlIGNyYl93aW5kb3cgcmV0dXJucyAweGZmZmZmZmZmKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCmluZGV4IGY3YmRkZTEuLjBiNGE1NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKQEAgLTU5NSw3ICs1OTUsOCBAQAogCXZvaWQgX19pb21lbSAqbWVtX3B0cjIgPSBOVUxMOwogCXZvaWQgX19pb21lbSAqZGJfcHRyID0gTlVMTDsKIAotCXVuc2lnbmVkIGxvbmcgbWVtX2Jhc2UsIG1lbV9sZW4sIGRiX2Jhc2UsIGRiX2xlbiA9IDAsIHBjaV9sZW4wID0gMDsKKwlyZXNvdXJjZV9zaXplX3QgbWVtX2Jhc2UsIGRiX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBtZW1fbGVuLCBkYl9sZW4gPSAwLCBwY2lfbGVuMCA9IDA7CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAJaW50IHBjaV9mdW5jID0gYWRhcHRlci0+YWh3LnBjaV9mdW5jOwpAQCAtMTQ2OSw2ICsxNDcwLDcgQEAKIAl9CiAKIAluZXR4ZW5fc2NoZWR1bGVfd29yayhhZGFwdGVyLCBuZXR4ZW5fZndfcG9sbF93b3JrLCBGV19QT0xMX0RFTEFZKTsKKwlyZXR1cm4gMDsKIAogZXJyX291dF9kZXRhY2g6CiAJbmV0eGVuX25pY19kZXRhY2goYWRhcHRlcik7CkBAIC0xNzEzLDcgKzE3MTUsNyBAQAogCS8qIDQgZnJhZ21lbnRzIHBlciBjbWQgZGVzICovCiAJbm9fb2ZfZGVzYyA9IChmcmFnX2NvdW50ICsgMykgPj4gMjsKIAotCWlmICh1bmxpa2VseShub19vZl9kZXNjICsgMikgPiBuZXR4ZW5fdHhfYXZhaWwodHhfcmluZykpIHsKKwlpZiAodW5saWtlbHkobm9fb2ZfZGVzYyArIDIgPiBuZXR4ZW5fdHhfYXZhaWwodHhfcmluZykpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KQEAgLTE5MDMsMTIgKzE5MDUsMTMgQEAKIAogCQluZXRpZl93YWtlX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7CiAKLQkJZ290byBkb25lOworCQljbGVhcl9iaXQoX19OWF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CiAKIAl9IGVsc2UgeworCQljbGVhcl9iaXQoX19OWF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CiAJCWlmICghbmV0eGVuX25pY19yZXNldF9jb250ZXh0KGFkYXB0ZXIpKSB7CiAJCQlhZGFwdGVyLT5uZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQkJCWdvdG8gZG9uZTsKKwkJCXJldHVybjsKIAkJfQogCiAJCS8qIGNvbnRleHQgcmVzZXQgZmFpbGVkLCBmYWxsIHRocm91Z2ggZm9yIGZ3IHJlc2V0ICovCkBAIC0xOTE2LDcgKzE5MTksNiBAQAogCiByZXF1ZXN0X3Jlc2V0OgogCWFkYXB0ZXItPm5lZWRfZndfcmVzZXQgPSAxOwotZG9uZToKIAljbGVhcl9iaXQoX19OWF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pdS5jIGIvZHJpdmVycy9uZXQvbml1LmMKaW5kZXggZjkzNjRkMC4uZDZjN2FjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbml1LmMKKysrIGIvZHJpdmVycy9uZXQvbml1LmMKQEAgLTM1NDUsNyArMzU0NSw3IEBACiAJcnAtPnJjcl9pbmRleCA9IGluZGV4OwogCiAJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOwotCV9fcHNrYl9wdWxsX3RhaWwoc2tiLCBtaW4obGVuLCBOSVVfUlhQVUxMX01BWCkpOworCV9fcHNrYl9wdWxsX3RhaWwoc2tiLCBtaW4obGVuLCBWTEFOX0VUSF9ITEVOKSk7CiAKIAlycC0+cnhfcGFja2V0cysrOwogCXJwLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25zODM4MjAuYyBiL2RyaXZlcnMvbmV0L25zODM4MjAuYwppbmRleCBjNTk0ZTE5Li41N2ZkNDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uczgzODIwLmMKKysrIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCkBAIC0xMTEsNiArMTExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wYXNlbWlfbWFjX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWNfZXRodG9vbC5jCmluZGV4IDA2NGE0ZmUuLjI4YTg2MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWNfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWNfZXRodG9vbC5jCkBAIC03MSw2ICs3MSw5IEBACiAJc3RydWN0IHBhc2VtaV9tYWMgKm1hYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG1hYy0+cGh5ZGV2OwogCisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHBoeWRldiwgY21kKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYwppbmRleCBlZThhZDNlLi5iNTg5NjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYwpAQCAtMjUxLDYgKzI1MSw3IEBACiBzdGF0aWMgaW50IGVsM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOwogc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIHN0YXRpYyB2b2lkIHRjNTc0X2RldGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOwogCkBAIC0yNjYsNyArMjY3LDcgQEAKIAkubmRvX3R4X3RpbWVvdXQgCT0gZWwzX3R4X3RpbWVvdXQsCiAJLm5kb19nZXRfc3RhdHMJCT0gZWwzX2dldF9zdGF0cywKIAkubmRvX2RvX2lvY3RsCQk9IGVsM19pb2N0bCwKLQkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0LAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKIAkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCkBAIC0xMTYxLDYgKzExNjIsMTYgQEAKIAkJb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0LCBpb2FkZHIgKyBFTDNfQ01EKTsKIH0KIAorc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwlzZXRfcnhfbW9kZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaW50IGVsM19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKaW5kZXggOTdkYjFjNy4uOTRjOWFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKQEAgLTM0MCwxMiArMzQwLDExIEBACiAJYmFzZSA9ICZ2aXJ0W2h3X2luZm9baV0ub2Zmc2V0ICYgKHJlcS5TaXplLTEpXTsKIAlpZiAoKHJlYWRiKGJhc2UrMCkgPT0gaHdfaW5mb1tpXS5hMCkgJiYKIAkgICAgKHJlYWRiKGJhc2UrMikgPT0gaHdfaW5mb1tpXS5hMSkgJiYKLQkgICAgKHJlYWRiKGJhc2UrNCkgPT0gaHdfaW5mb1tpXS5hMikpCi0JICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaSA8IE5SX0lORk8pIHsKLQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQotCSAgICBkZXYtPmRldl9hZGRyW2pdID0gcmVhZGIoYmFzZSArIChqPDwxKSk7CisJICAgIChyZWFkYihiYXNlKzQpID09IGh3X2luZm9baV0uYTIpKSB7CisJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCisJCSAgICBkZXYtPmRldl9hZGRyW2pdID0gcmVhZGIoYmFzZSArIChqPDwxKSk7CisJCWJyZWFrOworCX0KICAgICB9CiAKICAgICBpb3VubWFwKHZpcnQpOwpAQCAtMTc1NSwxNCArMTc1NCwxNCBAQAogCVBDTUNJQV9QRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMCwgIlBzaW9uIERhY29tIiwgIkdvbGQgQ2FyZCBWMzQgRXRoZXJuZXQiLCAweGY1ZjAyNWMyLCAweDMzOGU4MTU1LCAiY2lzL1BDTUxNMjguY2lzIiksCiAJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigwLCAiUHNpb24gRGFjb20iLCAiR29sZCBDYXJkIFYzNCBFdGhlcm5ldCBHU00iLCAweGY1ZjAyNWMyLCAweDRhZTg1ZDM1LCAiY2lzL1BDTUxNMjguY2lzIiksCiAJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigwLCAiTElOS1NZUyIsICJQQ01MTTI4IiwgMHhmN2NiMGIwNywgMHg2Njg4MTg3NCwgImNpcy9QQ01MTTI4LmNpcyIpLAotCVBDTUNJQV9NRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMCwgIkRBWU5BIENPTU1VTklDQVRJT05TIiwgIkxBTiBBTkQgTU9ERU0gTVVMVElGVU5DVElPTiIsIDB4OGZkZjhmODksIDB4ZGQ1ZWQ5ZTgsICJEUDgzOTAzLmNpcyIpLAotCVBDTUNJQV9NRkNfREVWSUNFX0NJU19QUk9EX0lENCgwLCAiTlNDIE1GIExBTi9Nb2RlbSIsIDB4NThmYzYwNTYsICJEUDgzOTAzLmNpcyIpLAotCVBDTUNJQV9NRkNfREVWSUNFX0NJU19NQU5GX0NBUkQoMCwgMHgwMTc1LCAweDAwMDAsICJEUDgzOTAzLmNpcyIpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMCwgIkRBWU5BIENPTU1VTklDQVRJT05TIiwgIkxBTiBBTkQgTU9ERU0gTVVMVElGVU5DVElPTiIsIDB4OGZkZjhmODksIDB4ZGQ1ZWQ5ZTgsICJjaXMvRFA4MzkwMy5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfUFJPRF9JRDQoMCwgIk5TQyBNRiBMQU4vTW9kZW0iLCAweDU4ZmM2MDU2LCAiY2lzL0RQODM5MDMuY2lzIiksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgwLCAweDAxNzUsIDB4MDAwMCwgImNpcy9EUDgzOTAzLmNpcyIpLAogCVBDTUNJQV9ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgweGMwMGYsIDB4MDAwMiwgImNpcy9MQS1QQ00uY2lzIiksCiAJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJLVEkiLCAiUEU1MjAgUExVUyIsIDB4YWQxODAzNDUsIDB4OWQ1OGQzOTIsICJQRTUyMC5jaXMiKSwKLQlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIk5EQyIsICJFdGhlcm5ldCIsIDB4MDFjNDNhZTEsIDB4MDBiMmU5NDEsICJORTJLLmNpcyIpLAotCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiUE1YICAgIiwgIlBFLTIwMCIsIDB4MzRmM2YxYzgsIDB4MTBiNTlmOGMsICJQRS0yMDAuY2lzIiksCi0JUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJUQU1BUkFDSyIsICJFdGhlcm5ldCIsIDB4Y2Y0MzRmYmEsIDB4MDBiMmU5NDEsICJ0YW1hcmFjay5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIk5EQyIsICJFdGhlcm5ldCIsIDB4MDFjNDNhZTEsIDB4MDBiMmU5NDEsICJjaXMvTkUySy5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIlBNWCAgICIsICJQRS0yMDAiLCAweDM0ZjNmMWM4LCAweDEwYjU5ZjhjLCAiY2lzL1BFLTIwMC5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIlRBTUFSQUNLIiwgIkV0aGVybmV0IiwgMHhjZjQzNGZiYSwgMHgwMGIyZTk0MSwgImNpcy90YW1hcmFjay5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRXRoZXJuZXQiLCAiQ0YgU2l6ZSBQQyBDYXJkIiwgMHgwMGIyZTk0MSwgMHg0M2FjMjM5YiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJGYXN0IEV0aGVybmV0IiwgIkNGIFNpemUgUEMgQ2FyZCIsICIxLjAiLAogCQkweGI0YmUxNGUzLCAweDQzYWMyMzliLCAweDA4NzdiNjI3KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwppbmRleCA2ZDI4YjE4Li5jMWIzZjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY25ldDMyLmMKKysrIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpby1ncGlvLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpby1ncGlvLmMKaW5kZXggMjUwZTEwZi4uODY1OWQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21kaW8tZ3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLWdwaW8uYwpAQCAtMjM4LDYgKzIzOCw3IEBACiAJfSwKIAl7fSwKIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtZGlvX29mZ3Bpb19tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIG1kaW9fb2ZncGlvX2RyaXZlciA9IHsKIAkubmFtZSA9ICJtZGlvLWdwaW8iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb2UuYyBiL2RyaXZlcnMvbmV0L3BwcG9lLmMKaW5kZXggN2NiZjZmOS4uMjU1OTk5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwb2UuYworKysgYi9kcml2ZXJzL25ldC9wcHBvZS5jCkBAIC0xMTEsOSArMTExLDYgQEAKIAlyd2xvY2tfdCBoYXNoX2xvY2s7CiB9OwogCi0vKiB0byBlbGltaW5hdGUgYSByYWNlIGJ0dyBwcHBvZV9mbHVzaF9kZXYgYW5kIHBwcG9lX3JlbGVhc2UgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZmx1c2hfbG9jayk7Ci0KIC8qCiAgKiBQUFBvRSBjb3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIHN0YWdlczoKICAqIDEpIERpc2NvdmVyeSBzdGFnZSAodG8gb2J0YWluIHJlbW90ZSBNQUMgYW5kIFNlc3Npb24gSUQpCkBAIC0zMDMsNDUgKzMwMCw0OCBAQAogCXdyaXRlX2xvY2tfYmgoJnBuLT5oYXNoX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCBQUFBPRV9IQVNIX1NJWkU7IGkrKykgewogCQlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwbi0+aGFzaF90YWJsZVtpXTsKKwkJc3RydWN0IHNvY2sgKnNrOwogCi0JCXdoaWxlIChwbyAhPSBOVUxMKSB7Ci0JCQlzdHJ1Y3Qgc29jayAqc2s7Ci0JCQlpZiAocG8tPnBwcG9lX2RldiAhPSBkZXYpIHsKKwkJd2hpbGUgKHBvKSB7CisJCQl3aGlsZSAocG8gJiYgcG8tPnBwcG9lX2RldiAhPSBkZXYpIHsKIAkJCQlwbyA9IHBvLT5uZXh0OwotCQkJCWNvbnRpbnVlOwogCQkJfQorCisJCQlpZiAoIXBvKQorCQkJCWJyZWFrOworCiAJCQlzayA9IHNrX3BwcG94KHBvKTsKLQkJCXNwaW5fbG9jaygmZmx1c2hfbG9jayk7Ci0JCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKLQkJCXNwaW5fdW5sb2NrKCZmbHVzaF9sb2NrKTsKLQkJCWRldl9wdXQoZGV2KTsKIAogCQkJLyogV2UgYWx3YXlzIGdyYWIgdGhlIHNvY2tldCBsb2NrLCBmb2xsb3dlZCBieSB0aGUKLQkJCSAqIGhhc2hfbG9jaywgaW4gdGhhdCBvcmRlci4gIFNpbmNlIHdlIHNob3VsZAotCQkJICogaG9sZCB0aGUgc29jayBsb2NrIHdoaWxlIGRvaW5nIGFueSB1bmJpbmRpbmcsCi0JCQkgKiB3ZSBuZWVkIHRvIHJlbGVhc2UgdGhlIGxvY2sgd2UncmUgaG9sZGluZy4KLQkJCSAqIEhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIHNvY2sgc28gaXQgZG9lc24ndCBkaXNhcHBlYXIKLQkJCSAqIGFzIHdlJ3JlIGp1bXBpbmcgYmV0d2VlbiBsb2Nrcy4KKwkJCSAqIGhhc2hfbG9jaywgaW4gdGhhdCBvcmRlci4gIFNpbmNlIHdlIHNob3VsZCBob2xkIHRoZQorCQkJICogc29jayBsb2NrIHdoaWxlIGRvaW5nIGFueSB1bmJpbmRpbmcsIHdlIG5lZWQgdG8KKwkJCSAqIHJlbGVhc2UgdGhlIGxvY2sgd2UncmUgaG9sZGluZy4gIEhvbGQgYSByZWZlcmVuY2UgdG8KKwkJCSAqIHRoZSBzb2NrIHNvIGl0IGRvZXNuJ3QgZGlzYXBwZWFyIGFzIHdlJ3JlIGp1bXBpbmcKKwkJCSAqIGJldHdlZW4gbG9ja3MuCiAJCQkgKi8KIAogCQkJc29ja19ob2xkKHNrKTsKLQogCQkJd3JpdGVfdW5sb2NrX2JoKCZwbi0+aGFzaF9sb2NrKTsKIAkJCWxvY2tfc29jayhzayk7CiAKLQkJCWlmIChzay0+c2tfc3RhdGUgJiAoUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfQk9VTkQpKSB7CisJCQlpZiAocG8tPnBwcG9lX2RldiA9PSBkZXYKKwkJCSAgICAmJiBzay0+c2tfc3RhdGUgJiAoUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfQk9VTkQpKSB7CiAJCQkJcHBwb3hfdW5iaW5kX3NvY2soc2spOwogCQkJCXNrLT5za19zdGF0ZSA9IFBQUE9YX1pPTUJJRTsKIAkJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKwkJCQlkZXZfcHV0KGRldik7CiAJCQl9CiAKIAkJCXJlbGVhc2Vfc29jayhzayk7CiAJCQlzb2NrX3B1dChzayk7CiAKLQkJCS8qIFJlc3RhcnQgc2NhbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgaGFzaCBjaGFpbi4KLQkJCSAqIFdoaWxlIHRoZSBsb2NrIHdhcyBkcm9wcGVkIHRoZSBjaGFpbiBjb250ZW50cyBtYXkKLQkJCSAqIGhhdmUgY2hhbmdlZC4KKwkJCS8qIFJlc3RhcnQgdGhlIHByb2Nlc3MgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKKwkJCSAqIGhhc2ggY2hhaW4uIFdlIGRyb3BwZWQgbG9ja3Mgc28gdGhlIHdvcmxkIG1heSBoYXZlCisJCQkgKiBjaGFuZ2UgZnJvbSB1bmRlcm5lYXRoIHVzLgogCQkJICovCisKKwkJCUJVR19PTihwcHBvZV9wZXJuZXQoZGV2X25ldChkZXYpKSA9PSBOVUxMKTsKIAkJCXdyaXRlX2xvY2tfYmgoJnBuLT5oYXNoX2xvY2spOwogCQkJcG8gPSBwbi0+aGFzaF90YWJsZVtpXTsKIAkJfQpAQCAtMzg4LDExICszODgsMTYgQEAKIAlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7CiAJc3RydWN0IHBwcG94X3NvY2sgKnJlbGF5X3BvOwogCisJLyogQmFja2xvZyByZWNlaXZlLiBTZW1hbnRpY3Mgb2YgYmFja2xvZyByY3YgcHJlY2x1ZGUgYW55IGNvZGUgZnJvbQorCSAqIGV4ZWN1dGluZyBpbiBsb2NrX3NvY2soKS9yZWxlYXNlX3NvY2soKSBib3VuZHM7IG1lYW5pbmcgc2stPnNrX3N0YXRlCisJICogY2FuJ3QgY2hhbmdlLgorCSAqLworCiAJaWYgKHNrLT5za19zdGF0ZSAmIFBQUE9YX0JPVU5EKSB7CiAJCXBwcF9pbnB1dCgmcG8tPmNoYW4sIHNrYik7CiAJfSBlbHNlIGlmIChzay0+c2tfc3RhdGUgJiBQUFBPWF9SRUxBWSkgewotCQlyZWxheV9wbyA9IGdldF9pdGVtX2J5X2FkZHIoZGV2X25ldChwby0+cHBwb2VfZGV2KSwKLQkJCQkJCSZwby0+cHBwb2VfcmVsYXkpOworCQlyZWxheV9wbyA9IGdldF9pdGVtX2J5X2FkZHIoc29ja19uZXQoc2spLAorCQkJCQkgICAgJnBvLT5wcHBvZV9yZWxheSk7CiAJCWlmIChyZWxheV9wbyA9PSBOVUxMKQogCQkJZ290byBhYm9ydF9rZnJlZTsKIApAQCAtNDQ3LDYgKzQ1MiwxMCBAQAogCQlnb3RvIGRyb3A7CiAKIAlwbiA9IHBwcG9lX3Blcm5ldChkZXZfbmV0KGRldikpOworCisJLyogTm90ZSB0aGF0IGdldF9pdGVtIGRvZXMgYSBzb2NrX2hvbGQoKSwgc28gc2tfcHBwb3gocG8pCisJICogaXMga25vd24gdG8gYmUgc2FmZS4KKwkgKi8KIAlwbyA9IGdldF9pdGVtKHBuLCBwaC0+c2lkLCBldGhfaGRyKHNrYiktPmhfc291cmNlLCBkZXYtPmlmaW5kZXgpOwogCWlmICghcG8pCiAJCWdvdG8gZHJvcDsKQEAgLTU2MSw2ICs1NzAsNyBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBwcHBveF9zb2NrICpwbzsKIAlzdHJ1Y3QgcHBwb2VfbmV0ICpwbjsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBOVUxMOwogCiAJaWYgKCFzaykKIAkJcmV0dXJuIDA7CkBAIC01NzEsNDQgKzU4MSwyOCBAQAogCQlyZXR1cm4gLUVCQURGOwogCX0KIAorCXBvID0gcHBwb3hfc2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAmIChQUFBPWF9DT05ORUNURUQgfCBQUFBPWF9CT1VORCkpIHsKKwkJZGV2X3B1dChwby0+cHBwb2VfZGV2KTsKKwkJcG8tPnBwcG9lX2RldiA9IE5VTEw7CisJfQorCiAJcHBwb3hfdW5iaW5kX3NvY2soc2spOwogCiAJLyogU2lnbmFsIHRoZSBkZWF0aCBvZiB0aGUgc29ja2V0LiAqLwogCXNrLT5za19zdGF0ZSA9IFBQUE9YX0RFQUQ7CiAKLQkvKgotCSAqIHBwcG9lX2ZsdXNoX2RldiBjb3VsZCBsZWFkIHRvIGEgcmFjZSB3aXRoCi0JICogdGhpcyByb3V0aW5lIHNvIHdlIHVzZSBmbHVzaF9sb2NrIHRvIGVsaW1pbmF0ZQotCSAqIHN1Y2ggYSBjYXNlICh3ZSBvbmx5IG5lZWQgcGVyLW5ldCBzcGVjaWZpYyBkYXRhKQotCSAqLwotCXNwaW5fbG9jaygmZmx1c2hfbG9jayk7Ci0JcG8gPSBwcHBveF9zayhzayk7Ci0JaWYgKCFwby0+cHBwb2VfZGV2KSB7Ci0JCXNwaW5fdW5sb2NrKCZmbHVzaF9sb2NrKTsKLQkJZ290byBvdXQ7Ci0JfQotCXBuID0gcHBwb2VfcGVybmV0KGRldl9uZXQocG8tPnBwcG9lX2RldikpOwotCXNwaW5fdW5sb2NrKCZmbHVzaF9sb2NrKTsKKwluZXQgPSBzb2NrX25ldChzayk7CisJcG4gPSBwcHBvZV9wZXJuZXQobmV0KTsKIAogCS8qCiAJICogcHJvdGVjdCAicG8iIGZyb20gY29uY3VycmVudCB1cGRhdGVzCiAJICogb24gcHBwb2VfZmx1c2hfZGV2CiAJICovCi0Jd3JpdGVfbG9ja19iaCgmcG4tPmhhc2hfbG9jayk7CisJZGVsZXRlX2l0ZW0ocG4sIHBvLT5wcHBvZV9wYS5zaWQsIHBvLT5wcHBvZV9wYS5yZW1vdGUsCisJCSAgICBwby0+cHBwb2VfaWZpbmRleCk7CiAKLQlwbyA9IHBwcG94X3NrKHNrKTsKLQlpZiAoc3RhZ2Vfc2Vzc2lvbihwby0+cHBwb2VfcGEuc2lkKSkKLQkJX19kZWxldGVfaXRlbShwbiwgcG8tPnBwcG9lX3BhLnNpZCwgcG8tPnBwcG9lX3BhLnJlbW90ZSwKLQkJCQlwby0+cHBwb2VfaWZpbmRleCk7Ci0KLQlpZiAocG8tPnBwcG9lX2RldikgewotCQlkZXZfcHV0KHBvLT5wcHBvZV9kZXYpOwotCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKLQl9Ci0KLQl3cml0ZV91bmxvY2tfYmgoJnBuLT5oYXNoX2xvY2spOwotCi1vdXQ6CiAJc29ja19vcnBoYW4oc2spOwogCXNvY2stPnNrID0gTlVMTDsKIApAQCAtNjI1LDggKzYxOSw5IEBACiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHNvY2thZGRyX3BwcG94ICpzcCA9IChzdHJ1Y3Qgc29ja2FkZHJfcHBwb3ggKil1c2VydmFkZHI7CiAJc3RydWN0IHBwcG94X3NvY2sgKnBvID0gcHBwb3hfc2soc2spOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CiAJc3RydWN0IHBwcG9lX25ldCAqcG47CisJc3RydWN0IG5ldCAqbmV0ID0gTlVMTDsKIAlpbnQgZXJyb3I7CiAKIAlsb2NrX3NvY2soc2spOwpAQCAtNjUyLDEyICs2NDcsMTQgQEAKIAkvKiBEZWxldGUgdGhlIG9sZCBiaW5kaW5nICovCiAJaWYgKHN0YWdlX3Nlc3Npb24ocG8tPnBwcG9lX3BhLnNpZCkpIHsKIAkJcHBwb3hfdW5iaW5kX3NvY2soc2spOworCQlwbiA9IHBwcG9lX3Blcm5ldChzb2NrX25ldChzaykpOworCQlkZWxldGVfaXRlbShwbiwgcG8tPnBwcG9lX3BhLnNpZCwKKwkJCSAgICBwby0+cHBwb2VfcGEucmVtb3RlLCBwby0+cHBwb2VfaWZpbmRleCk7CiAJCWlmIChwby0+cHBwb2VfZGV2KSB7Ci0JCQlwbiA9IHBwcG9lX3Blcm5ldChkZXZfbmV0KHBvLT5wcHBvZV9kZXYpKTsKLQkJCWRlbGV0ZV9pdGVtKHBuLCBwby0+cHBwb2VfcGEuc2lkLAotCQkJCXBvLT5wcHBvZV9wYS5yZW1vdGUsIHBvLT5wcHBvZV9pZmluZGV4KTsKIAkJCWRldl9wdXQocG8tPnBwcG9lX2Rldik7CisJCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKIAkJfQorCiAJCW1lbXNldChza19wcHBveChwbykgKyAxLCAwLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwcHBveF9zb2NrKSAtIHNpemVvZihzdHJ1Y3Qgc29jaykpOwogCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9OT05FOwpAQCAtNjY2LDE2ICs2NjMsMTUgQEAKIAkvKiBSZS1iaW5kIGluIHNlc3Npb24gc3RhZ2Ugb25seSAqLwogCWlmIChzdGFnZV9zZXNzaW9uKHNwLT5zYV9hZGRyLnBwcG9lLnNpZCkpIHsKIAkJZXJyb3IgPSAtRU5PREVWOwotCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUoc29ja19uZXQoc2spLCBzcC0+c2FfYWRkci5wcHBvZS5kZXYpOworCQluZXQgPSBzb2NrX25ldChzayk7CisJCWRldiA9IGRldl9nZXRfYnlfbmFtZShuZXQsIHNwLT5zYV9hZGRyLnBwcG9lLmRldik7CiAJCWlmICghZGV2KQotCQkJZ290byBlbmQ7CisJCQlnb3RvIGVycl9wdXQ7CiAKIAkJcG8tPnBwcG9lX2RldiA9IGRldjsKIAkJcG8tPnBwcG9lX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7Ci0JCXBuID0gcHBwb2VfcGVybmV0KGRldl9uZXQoZGV2KSk7Ci0JCXdyaXRlX2xvY2tfYmgoJnBuLT5oYXNoX2xvY2spOworCQlwbiA9IHBwcG9lX3Blcm5ldChuZXQpOwogCQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkgewotCQkJd3JpdGVfdW5sb2NrX2JoKCZwbi0+aGFzaF9sb2NrKTsKIAkJCWdvdG8gZXJyX3B1dDsKIAkJfQogCkBAIC02ODMsNiArNjc5LDcgQEAKIAkJICAgICAgICZzcC0+c2FfYWRkci5wcHBvZSwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgcHBwb2VfYWRkcikpOwogCisJCXdyaXRlX2xvY2tfYmgoJnBuLT5oYXNoX2xvY2spOwogCQllcnJvciA9IF9fc2V0X2l0ZW0ocG4sIHBvKTsKIAkJd3JpdGVfdW5sb2NrX2JoKCZwbi0+aGFzaF9sb2NrKTsKIAkJaWYgKGVycm9yIDwgMCkKQEAgLTY5Niw4ICs2OTMsMTEgQEAKIAkJcG8tPmNoYW4ub3BzID0gJnBwcG9lX2NoYW5fb3BzOwogCiAJCWVycm9yID0gcHBwX3JlZ2lzdGVyX25ldF9jaGFubmVsKGRldl9uZXQoZGV2KSwgJnBvLT5jaGFuKTsKLQkJaWYgKGVycm9yKQorCQlpZiAoZXJyb3IpIHsKKwkJCWRlbGV0ZV9pdGVtKHBuLCBwby0+cHBwb2VfcGEuc2lkLAorCQkJCSAgICBwby0+cHBwb2VfcGEucmVtb3RlLCBwby0+cHBwb2VfaWZpbmRleCk7CiAJCQlnb3RvIGVycl9wdXQ7CisJCX0KIAogCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9DT05ORUNURUQ7CiAJfQpAQCAtOTE1LDYgKzkxNSwxNCBAQAogCXN0cnVjdCBwcHBvZV9oZHIgKnBoOwogCWludCBkYXRhX2xlbiA9IHNrYi0+bGVuOwogCisJLyogVGhlIGhpZ2hlci1sZXZlbCBQUFAgY29kZSAocHBwX3VucmVnaXN0ZXJfY2hhbm5lbCgpKSBlbnN1cmVzIHRoZSBQUFAKKwkgKiB4bWl0IG9wZXJhdGlvbnMgY29uY2x1ZGUgcHJpb3IgdG8gYW4gdW5yZWdpc3RyYXRpb24gY2FsbC4gIFRodXMKKwkgKiBzay0+c2tfc3RhdGUgY2Fubm90IGNoYW5nZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBsb2NrX3NvY2soKS4KKwkgKiBCdXQsIHdlIGFsc28gY2FuJ3QgZG8gYSBsb2NrX3NvY2sgc2luY2UgdGhhdCBpbnRyb2R1Y2VzIGEgcG90ZW50aWFsCisJICogZGVhZGxvY2sgYXMgd2UnZCByZXZlcnNlIHRoZSBsb2NrIG9yZGVyaW5nIHVzZWQgd2hlbiBjYWxsaW5nCisJICogcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCgpLgorCSAqLworCiAJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSB8fCAhKHNrLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCiAJCWdvdG8gYWJvcnQ7CiAKQEAgLTk0NCw3ICs5NTIsNiBAQAogCQkJcG8tPnBwcG9lX3BhLnJlbW90ZSwgTlVMTCwgZGF0YV9sZW4pOwogCiAJZGV2X3F1ZXVlX3htaXQoc2tiKTsKLQogCXJldHVybiAxOwogCiBhYm9ydDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcG9sMnRwLmMgYi9kcml2ZXJzL25ldC9wcHBvbDJ0cC5jCmluZGV4IGNjMzk0ZDAuLjU5MTBkZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcG9sMnRwLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwb2wydHAuYwpAQCAtMjE3OSw3ICsyMTc5LDcgQEAKICAqIHNlc3Npb24gb3IgdGhlIHNwZWNpYWwgdHVubmVsIHR5cGUuCiAgKi8KIHN0YXRpYyBpbnQgcHBwb2wydHBfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgcHBwb2wydHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IHNrLT5za191c2VyX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaCBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCmluZGV4IGE5ODQ1YTIuLmMyMzgzYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAKIC8qCiAgKiBHZW5lcmFsIGRlZmluaXRpb25zLi4uCkBAIC05NCw2ICs5NSw3IEBACiAKIAkvKiBNaXNjLiBzdHVmZiAqLwogCU1BSUxCT1hfQ09VTlQgPSAxNiwKKwlNQUlMQk9YX1RJTUVPVVQgPSA1LAogCiAJUFJPQ19BRERSX1JEWSA9ICgxIDw8IDMxKSwKIAlQUk9DX0FERFJfUiA9ICgxIDw8IDMwKSwKQEAgLTEzNSw5ICsxMzcsOSBAQAogCVJTVF9GT19URk8gPSAoMSA8PCAwKSwKIAlSU1RfRk9fUlJfTUFTSyA9IDB4MDAwNjAwMDAsCiAJUlNUX0ZPX1JSX0NRX0NBTSA9IDB4MDAwMDAwMDAsCi0JUlNUX0ZPX1JSX0RST1AgPSAweDAwMDAwMDAxLAotCVJTVF9GT19SUl9EUSA9IDB4MDAwMDAwMDIsCi0JUlNUX0ZPX1JSX1JDVl9GVU5DX0NRID0gMHgwMDAwMDAwMywKKwlSU1RfRk9fUlJfRFJPUCA9IDB4MDAwMDAwMDIsCisJUlNUX0ZPX1JSX0RRID0gMHgwMDAwMDAwNCwKKwlSU1RfRk9fUlJfUkNWX0ZVTkNfQ1EgPSAweDAwMDAwMDA2LAogCVJTVF9GT19GUkIgPSAoMSA8PCAxMiksCiAJUlNUX0ZPX01PUCA9ICgxIDw8IDEzKSwKIAlSU1RfRk9fUkVHID0gKDEgPDwgMTQpLApAQCAtODAyLDYgKzgwNCwxMiBAQAogCU1CX0NNRF9TRVRfUE9SVF9DRkcgPSAweDAwMDAwMTIyLAogCU1CX0NNRF9HRVRfUE9SVF9DRkcgPSAweDAwMDAwMTIzLAogCU1CX0NNRF9HRVRfTElOS19TVFMgPSAweDAwMDAwMTI0LAorCU1CX0NNRF9TRVRfTUdNTlRfVEZLX0NUTCA9IDB4MDAwMDAxNjAsIC8qIFNldCBNZ21udCBUcmFmZmljIENvbnRyb2wgKi8KKwlNQl9TRVRfTVBJX1RGS19TVE9QID0gKDEgPDwgMCksCisJTUJfU0VUX01QSV9URktfUkVTVU1FID0gKDEgPDwgMSksCisJTUJfQ01EX0dFVF9NR01OVF9URktfQ1RMID0gMHgwMDAwMDE2MSwgLyogR2V0IE1nbW50IFRyYWZmaWMgQ29udHJvbCAqLworCU1CX0dFVF9NUElfVEZLX1NUT1BQRUQgPSAoMSA8PCAwKSwKKwlNQl9HRVRfTVBJX1RGS19GSUZPX0VNUFRZID0gKDEgPDwgMSksCiAKIAkvKiBNYWlsYm94IENvbW1hbmQgU3RhdHVzLiAqLwogCU1CX0NNRF9TVFNfR09PRCA9IDB4MDAwMDQwMDAsCS8qIFN1Y2Nlc3MuICovCkBAIC0xMTY3LDcgKzExNzUsNyBAQAogI2RlZmluZSBSU1NfUkk2IDB4NDAKICNkZWZpbmUgUlNTX1JUNiAweDgwCiAJX19sZTE2IG1hc2s7Ci0JX19sZTMyIGhhc2hfY3FfaWRbMjU2XTsKKwl1OCBoYXNoX2NxX2lkWzEwMjRdOwogCV9fbGUzMiBpcHY2X2hhc2hfa2V5WzEwXTsKIAlfX2xlMzIgaXB2NF9oYXNoX2tleVs0XTsKIH0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwpAQCAtMTM4MSwxNSArMTM4OSwxNSBAQAogCiAvKiBhZGFwdGVyIGZsYWdzIGRlZmluaXRpb25zLiAqLwogZW51bSB7Ci0JUUxfQURBUFRFUl9VUCA9ICgxIDw8IDApLAkvKiBBZGFwdGVyIGhhcyBiZWVuIGJyb3VnaHQgdXAuICovCi0JUUxfTEVHQUNZX0VOQUJMRUQgPSAoMSA8PCAzKSwKLQlRTF9NU0lfRU5BQkxFRCA9ICgxIDw8IDMpLAotCVFMX01TSVhfRU5BQkxFRCA9ICgxIDw8IDQpLAotCVFMX0RNQTY0ID0gKDEgPDwgNSksCi0JUUxfUFJPTUlTQ1VPVVMgPSAoMSA8PCA2KSwKLQlRTF9BTExNVUxUSSA9ICgxIDw8IDcpLAotCVFMX1BPUlRfQ0ZHID0gKDEgPDwgOCksCi0JUUxfQ0FNX1JUX1NFVCA9ICgxIDw8IDkpLAorCVFMX0FEQVBURVJfVVAgPSAwLAkvKiBBZGFwdGVyIGhhcyBiZWVuIGJyb3VnaHQgdXAuICovCisJUUxfTEVHQUNZX0VOQUJMRUQgPSAxLAorCVFMX01TSV9FTkFCTEVEID0gMiwKKwlRTF9NU0lYX0VOQUJMRUQgPSAzLAorCVFMX0RNQTY0ID0gNCwKKwlRTF9QUk9NSVNDVU9VUyA9IDUsCisJUUxfQUxMTVVMVEkgPSA2LAorCVFMX1BPUlRfQ0ZHID0gNywKKwlRTF9DQU1fUlRfU0VUID0gOCwKIH07CiAKIC8qIGxpbmtfc3RhdHVzIGJpdCBkZWZpbml0aW9ucyAqLwpAQCAtMTQ3Nyw3ICsxNDg1LDYgQEAKIAl1MzIgbWFpbGJveF9pbjsKIAl1MzIgbWFpbGJveF9vdXQ7CiAJc3RydWN0IG1ib3hfcGFyYW1zIGlkY19tYmM7Ci0Jc3RydWN0IG11dGV4CW1waV9tdXRleDsKIAogCWludCB0eF9yaW5nX3NpemU7CiAJaW50IHJ4X3Jpbmdfc2l6ZTsKQEAgLTE2MDYsNiArMTYxMyw4IEBACiBpbnQgcWxfbWJfYWJvdXRfZncoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpOwogdm9pZCBxbF9saW5rX29uKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KTsKIHZvaWQgcWxfbGlua19vZmYoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpOworaW50IHFsX21iX3NldF9tZ21udF90cmFmZmljX2N0bChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgdTMyIGNvbnRyb2wpOworaW50IHFsX3dhaXRfZmlmb19lbXB0eShzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldik7CiAKICNpZiAxCiAjZGVmaW5lIFFMX0FMTF9EVU1QCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2V0aHRvb2wuYwppbmRleCA2OGY5YmQyLi41MjA3Mzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9ldGh0b29sLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcocWRldi0+bmRldikpCiAJCXJldHVybiBzdGF0dXM7CiAKLQlzcGluX2xvY2soJnFkZXYtPmh3X2xvY2spOwogCS8qIFNraXAgdGhlIGRlZmF1bHQgcXVldWUsIGFuZCB1cGRhdGUgdGhlIG91dGJvdW5kIGhhbmRsZXIKIAkgKiBxdWV1ZXMgaWYgdGhleSBjaGFuZ2VkLgogCSAqLwpAQCAtOTIsNyArOTEsNiBAQAogCQl9CiAJfQogZXhpdDoKLQlzcGluX3VubG9jaygmcWRldi0+aHdfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKaW5kZXggNzc4M2M1ZC4uY2VhNzUzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTMyMSw2ICszMjAsMzcgQEAKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgTUFDX0FERFJfVFlQRV9NVUxUSV9NQUM6CisJCXsKKwkJCXUzMiB1cHBlciA9IChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXTsKKwkJCXUzMiBsb3dlciA9IChhZGRyWzJdIDw8IDI0KSB8IChhZGRyWzNdIDw8IDE2KSB8CisJCQkJCShhZGRyWzRdIDw8IDgpIHwgKGFkZHJbNV0pOworCisJCQlzdGF0dXMgPQorCQkJCXFsX3dhaXRfcmVnX3JkeShxZGV2LAorCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIDApOworCQkJaWYgKHN0YXR1cykKKwkJCQlnb3RvIGV4aXQ7CisJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgKG9mZnNldCsrKSB8CisJCQkJKGluZGV4IDw8IE1BQ19BRERSX0lEWF9TSElGVCkgfAorCQkJCXR5cGUgfCBNQUNfQUREUl9FKTsKKwkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfREFUQSwgbG93ZXIpOworCQkJc3RhdHVzID0KKwkJCQlxbF93YWl0X3JlZ19yZHkocWRldiwKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCAwKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBleGl0OworCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9JRFgsIChvZmZzZXQrKykgfAorCQkJCShpbmRleCA8PCBNQUNfQUREUl9JRFhfU0hJRlQpIHwKKwkJCQl0eXBlIHwgTUFDX0FERFJfRSk7CisKKwkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfREFUQSwgdXBwZXIpOworCQkJc3RhdHVzID0KKwkJCQlxbF93YWl0X3JlZ19yZHkocWRldiwKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCAwKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBleGl0OworCQkJYnJlYWs7CisJCX0KIAljYXNlIE1BQ19BRERSX1RZUEVfQ0FNX01BQzoKIAkJewogCQkJdTMyIGNhbV9vdXRwdXQ7CkBAIC0zNjYsMTYgKzM5NiwxNCBAQAogCQkJICAgYW5kIHBvc3NpYmx5IHRoZSBmdW5jdGlvbiBpZC4gIFJpZ2h0IG5vdyB3ZSBoYXJkY29kZQogCQkJICAgdGhlIHJvdXRlIGZpZWxkIHRvIE5JQyBjb3JlLgogCQkJICovCi0JCQlpZiAodHlwZSA9PSBNQUNfQUREUl9UWVBFX0NBTV9NQUMpIHsKLQkJCQljYW1fb3V0cHV0ID0gKENBTV9PVVRfUk9VVEVfTklDIHwKLQkJCQkJICAgICAgKHFkZXYtPgotCQkJCQkgICAgICAgZnVuYyA8PCBDQU1fT1VUX0ZVTkNfU0hJRlQpIHwKLQkJCQkJCSgwIDw8IENBTV9PVVRfQ1FfSURfU0hJRlQpKTsKLQkJCQlpZiAocWRldi0+dmxncnApCi0JCQkJCWNhbV9vdXRwdXQgfD0gQ0FNX09VVF9SVjsKLQkJCQkvKiByb3V0ZSB0byBOSUMgY29yZSAqLwotCQkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfREFUQSwgY2FtX291dHB1dCk7Ci0JCQl9CisJCQljYW1fb3V0cHV0ID0gKENBTV9PVVRfUk9VVEVfTklDIHwKKwkJCQkgICAgICAocWRldi0+CisJCQkJICAgICAgIGZ1bmMgPDwgQ0FNX09VVF9GVU5DX1NISUZUKSB8CisJCQkJCSgwIDw8IENBTV9PVVRfQ1FfSURfU0hJRlQpKTsKKwkJCWlmIChxZGV2LT52bGdycCkKKwkJCQljYW1fb3V0cHV0IHw9IENBTV9PVVRfUlY7CisJCQkvKiByb3V0ZSB0byBOSUMgY29yZSAqLworCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9EQVRBLCBjYW1fb3V0cHV0KTsKIAkJCWJyZWFrOwogCQl9CiAJY2FzZSBNQUNfQUREUl9UWVBFX1ZMQU46CkBAIC01NDcsMTQgKzU3NSwxNCBAQAogCQl9CiAJY2FzZSBSVF9JRFhfTUNBU1Q6CS8qIFBhc3MgdXAgQWxsIE11bHRpY2FzdCBmcmFtZXMuICovCiAJCXsKLQkJCXZhbHVlID0gUlRfSURYX0RTVF9DQU1fUSB8CS8qIGRlc3QgKi8KKwkJCXZhbHVlID0gUlRfSURYX0RTVF9ERkxUX1EgfAkvKiBkZXN0ICovCiAJCQkgICAgUlRfSURYX1RZUEVfTklDUSB8CS8qIHR5cGUgKi8KIAkJCSAgICAoUlRfSURYX0FMTE1VTFRJX1NMT1QgPDwgUlRfSURYX0lEWF9TSElGVCk7LyogaW5kZXggKi8KIAkJCWJyZWFrOwogCQl9CiAJY2FzZSBSVF9JRFhfTUNBU1RfTUFUQ0g6CS8qIFBhc3MgdXAgbWF0Y2hlZCBNdWx0aWNhc3QgZnJhbWVzLiAqLwogCQl7Ci0JCQl2YWx1ZSA9IFJUX0lEWF9EU1RfQ0FNX1EgfAkvKiBkZXN0ICovCisJCQl2YWx1ZSA9IFJUX0lEWF9EU1RfREZMVF9RIHwJLyogZGVzdCAqLwogCQkJICAgIFJUX0lEWF9UWVBFX05JQ1EgfAkvKiB0eXBlICovCiAJCQkgICAgKFJUX0lEWF9NQ0FTVF9NQVRDSF9TTE9UIDw8IFJUX0lEWF9JRFhfU0hJRlQpOy8qIGluZGV4ICovCiAJCQlicmVhazsKQEAgLTE5MjYsMTIgKzE5NTQsMTAgQEAKIAlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX01BQ19BRERSX01BU0spOwogCWlmIChzdGF0dXMpCiAJCXJldHVybjsKLQlzcGluX2xvY2soJnFkZXYtPmh3X2xvY2spOwogCWlmIChxbF9zZXRfbWFjX2FkZHJfcmVnCiAJICAgIChxZGV2LCAodTggKikgJmVuYWJsZV9iaXQsIE1BQ19BRERSX1RZUEVfVkxBTiwgdmlkKSkgewogCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgIkZhaWxlZCB0byBpbml0IHZsYW4gYWRkcmVzcy5cbiIpOwogCX0KLQlzcGluX3VubG9jaygmcWRldi0+aHdfbG9jayk7CiAJcWxfc2VtX3VubG9jayhxZGV2LCBTRU1fTUFDX0FERFJfTUFTSyk7CiB9CiAKQEAgLTE5NDUsMTIgKzE5NzEsMTAgQEAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soJnFkZXYtPmh3X2xvY2spOwogCWlmIChxbF9zZXRfbWFjX2FkZHJfcmVnCiAJICAgIChxZGV2LCAodTggKikgJmVuYWJsZV9iaXQsIE1BQ19BRERSX1RZUEVfVkxBTiwgdmlkKSkgewogCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgIkZhaWxlZCB0byBjbGVhciB2bGFuIGFkZHJlc3MuXG4iKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnFkZXYtPmh3X2xvY2spOwogCXFsX3NlbV91bmxvY2socWRldiwgU0VNX01BQ19BRERSX01BU0spOwogCiB9CkBAIC0yMDAxLDE1ICsyMDI1LDE3IEBACiAJLyoKIAkgKiBDaGVjayBNUEkgcHJvY2Vzc29yIGFjdGl2aXR5LgogCSAqLwotCWlmICh2YXIgJiBTVFNfUEkpIHsKKwlpZiAoKHZhciAmIFNUU19QSSkgJiYKKwkJKHFsX3JlYWQzMihxZGV2LCBJTlRSX01BU0spICYgSU5UUl9NQVNLX1BJKSkgewogCQkvKgogCQkgKiBXZSd2ZSBnb3QgYW4gYXN5bmMgZXZlbnQgb3IgbWFpbGJveCBjb21wbGV0aW9uLgogCQkgKiBIYW5kbGUgaXQgYW5kIGNsZWFyIHRoZSBzb3VyY2Ugb2YgdGhlIGludGVycnVwdC4KIAkJICovCiAJCVFQUklOVEsocWRldiwgSU5UUiwgRVJSLCAiR290IE1QSSBwcm9jZXNzb3IgaW50ZXJydXB0LlxuIik7CiAJCXFsX2Rpc2FibGVfY29tcGxldGlvbl9pbnRlcnJ1cHQocWRldiwgaW50cl9jb250ZXh0LT5pbnRyKTsKLQkJcXVldWVfZGVsYXllZF93b3JrX29uKHNtcF9wcm9jZXNzb3JfaWQoKSwgcWRldi0+d29ya3F1ZXVlLAotCQkJCSAgICAgICZxZGV2LT5tcGlfd29yaywgMCk7CisJCXFsX3dyaXRlMzIocWRldiwgSU5UUl9NQVNLLCAoSU5UUl9NQVNLX1BJIDw8IDE2KSk7CisJCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihzbXBfcHJvY2Vzc29yX2lkKCksCisJCQkJcWRldi0+d29ya3F1ZXVlLCAmcWRldi0+bXBpX3dvcmssIDApOwogCQl3b3JrX2RvbmUrKzsKIAl9CiAKQEAgLTMwODAsNiArMzEwNiwxMiBAQAogCiBzdGF0aWMgaW50IHFsX3N0YXJ0X3JzcyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKIHsKKwl1OCBpbml0X2hhc2hfc2VlZFtdID0gezB4NmQsIDB4NWEsIDB4NTYsIDB4ZGEsIDB4MjUsIDB4NWIsIDB4MGUsIDB4YzIsCisJCQkJMHg0MSwgMHg2NywgMHgyNSwgMHgzZCwgMHg0MywgMHhhMywgMHg4ZiwKKwkJCQkweGIwLCAweGQwLCAweGNhLCAweDJiLCAweGNiLCAweGFlLCAweDdiLAorCQkJCTB4MzAsIDB4YjQsIDB4NzcsIDB4Y2IsIDB4MmQsIDB4YTMsIDB4ODAsCisJCQkJMHgzMCwgMHhmMiwgMHgwYywgMHg2YSwgMHg0MiwgMHhiNywgMHgzYiwKKwkJCQkweGJlLCAweGFjLCAweDAxLCAweGZhfTsKIAlzdHJ1Y3QgcmljYiAqcmljYiA9ICZxZGV2LT5yaWNiOwogCWludCBzdGF0dXMgPSAwOwogCWludCBpOwpAQCAtMzA4OSwyMSArMzEyMSwxNyBAQAogCiAJcmljYi0+YmFzZV9jcSA9IFJTU19MNEs7CiAJcmljYi0+ZmxhZ3MgPQotCSAgICAoUlNTX0w2SyB8IFJTU19MSSB8IFJTU19MQiB8IFJTU19MTSB8IFJTU19SSTQgfCBSU1NfUkk2IHwgUlNTX1JUNCB8Ci0JICAgICBSU1NfUlQ2KTsKLQlyaWNiLT5tYXNrID0gY3B1X3RvX2xlMTYocWRldi0+cnNzX3JpbmdfY291bnQgLSAxKTsKKwkJKFJTU19MNksgfCBSU1NfTEkgfCBSU1NfTEIgfCBSU1NfTE0gfCBSU1NfUlQ0IHwgUlNTX1JUNik7CisJcmljYi0+bWFzayA9IGNwdV90b19sZTE2KCh1MTYpKDB4M2ZmKSk7CiAKIAkvKgogCSAqIEZpbGwgb3V0IHRoZSBJbmRpcmVjdGlvbiBUYWJsZS4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCWhhc2hfaWRbaV0gPSBpICYgKHFkZXYtPnJzc19yaW5nX2NvdW50IC0gMSk7CisJZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKwkJaGFzaF9pZFtpXSA9IChpICYgKHFkZXYtPnJzc19yaW5nX2NvdW50IC0gMSkpOwogCi0JLyoKLQkgKiBSYW5kb20gdmFsdWVzIGZvciB0aGUgSVB2NiBhbmQgSVB2NCBIYXNoIEtleXMuCi0JICovCi0JZ2V0X3JhbmRvbV9ieXRlcygodm9pZCAqKSZyaWNiLT5pcHY2X2hhc2hfa2V5WzBdLCA0MCk7Ci0JZ2V0X3JhbmRvbV9ieXRlcygodm9pZCAqKSZyaWNiLT5pcHY0X2hhc2hfa2V5WzBdLCAxNik7CisJbWVtY3B5KCh2b2lkICopJnJpY2ItPmlwdjZfaGFzaF9rZXlbMF0sIGluaXRfaGFzaF9zZWVkLCA0MCk7CisJbWVtY3B5KCh2b2lkICopJnJpY2ItPmlwdjRfaGFzaF9rZXlbMF0sIGluaXRfaGFzaF9zZWVkLCAxNik7CiAKIAlRUFJJTlRLKHFkZXYsIElGVVAsIERFQlVHLCAiSW5pdGlhbGl6aW5nIFJTUy5cbiIpOwogCkBAIC0zMTQyLDE0ICszMTcwLDE0IEBACiB7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX1JUX0lEWF9NQVNLKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gc3RhdHVzOwotCiAJLyogQ2xlYXIgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSByb3V0aW5nIHRhYmxlLiAqLwogCXN0YXR1cyA9IHFsX2NsZWFyX3JvdXRpbmdfZW50cmllcyhxZGV2KTsKIAlpZiAoc3RhdHVzKQotCQlnb3RvIGV4aXQ7CisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX1JUX0lEWF9NQVNLKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOwogCiAJc3RhdHVzID0gcWxfc2V0X3JvdXRpbmdfcmVnKHFkZXYsIFJUX0lEWF9BTExfRVJSX1NMT1QsIFJUX0lEWF9FUlIsIDEpOwogCWlmIChzdGF0dXMpIHsKQEAgLTMyNDIsNiArMzI3MCwxMyBAQAogCXFsX3dyaXRlMzIocWRldiwgU1BMVF9IRFIsIFNQTFRfSERSX0VQIHwKIAkJbWluKFNNQUxMX0JVRkZFUl9TSVpFLCBNQVhfU1BMSVRfU0laRSkpOwogCisJLyogU2V0IFJYIHBhY2tldCByb3V0aW5nIHRvIHVzZSBwb3J0L3BjaSBmdW5jdGlvbiBvbiB3aGljaCB0aGUKKwkgKiBwYWNrZXQgYXJyaXZlZCBvbiBpbiBhZGRpdGlvbiB0byB1c3VhbCBmcmFtZSByb3V0aW5nLgorCSAqIFRoaXMgaXMgaGVscGZ1bCBvbiBib25kaW5nIHdoZXJlIGJvdGggaW50ZXJmYWNlcyBjYW4gaGF2ZQorCSAqIHRoZSBzYW1lIE1BQyBhZGRyZXNzLgorCSAqLworCXFsX3dyaXRlMzIocWRldiwgUlNUX0ZPLCBSU1RfRk9fUlJfTUFTSyB8IFJTVF9GT19SUl9SQ1ZfRlVOQ19DUSk7CisKIAkvKiBTdGFydCB1cCB0aGUgcnggcXVldWVzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspIHsKIAkJc3RhdHVzID0gcWxfc3RhcnRfcnhfcmluZyhxZGV2LCAmcWRldi0+cnhfcmluZ1tpXSk7CkBAIC0zMzE0LDYgKzMzNDksMTMgQEAKIAogCWVuZF9qaWZmaWVzID0gamlmZmllcyArCiAJCW1heCgodW5zaWduZWQgbG9uZykxLCB1c2Vjc190b19qaWZmaWVzKDMwKSk7CisKKwkvKiBTdG9wIG1hbmFnZW1lbnQgdHJhZmZpYy4gKi8KKwlxbF9tYl9zZXRfbWdtbnRfdHJhZmZpY19jdGwocWRldiwgTUJfU0VUX01QSV9URktfU1RPUCk7CisKKwkvKiBXYWl0IGZvciB0aGUgTklDIGFuZCBNR01OVCBGSUZPcyB0byBlbXB0eS4gKi8KKwlxbF93YWl0X2ZpZm9fZW1wdHkocWRldik7CisKIAlxbF93cml0ZTMyKHFkZXYsIFJTVF9GTywgKFJTVF9GT19GUiA8PCAxNikgfCBSU1RfRk9fRlIpOwogCiAJZG8gewpAQCAtMzMyOSw2ICszMzcxLDggQEAKIAkJc3RhdHVzID0gLUVUSU1FRE9VVDsKIAl9CiAKKwkvKiBSZXN1bWUgbWFuYWdlbWVudCB0cmFmZmljLiAqLworCXFsX21iX3NldF9tZ21udF90cmFmZmljX2N0bChxZGV2LCBNQl9TRVRfTVBJX1RGS19SRVNVTUUpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMzODAsMTIgKzM0MjQsMTAgQEAKIAogCXFsX2ZyZWVfcnhfYnVmZmVycyhxZGV2KTsKIAotCXNwaW5fbG9jaygmcWRldi0+aHdfbG9jayk7CiAJc3RhdHVzID0gcWxfYWRhcHRlcl9yZXNldChxZGV2KTsKIAlpZiAoc3RhdHVzKQogCQlRUFJJTlRLKHFkZXYsIElGRE9XTiwgRVJSLCAicmVzZXQoZnVuYyAjJWQpIEZBSUxFRCFcbiIsCiAJCQlxZGV2LT5mdW5jKTsKLQlzcGluX3VubG9jaygmcWRldi0+aHdfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzU4Nyw3ICszNjI5LDYgQEAKIAlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX1JUX0lEWF9NQVNLKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm47Ci0Jc3Bpbl9sb2NrKCZxZGV2LT5od19sb2NrKTsKIAkvKgogCSAqIFNldCBvciBjbGVhciBwcm9taXNjdW91cyBtb2RlIGlmIGEKIAkgKiB0cmFuc2l0aW9uIGlzIHRha2luZyBwbGFjZS4KQEAgLTM2NjQsNyArMzcwNSw2IEBACiAJCX0KIAl9CiBleGl0OgotCXNwaW5fdW5sb2NrKCZxZGV2LT5od19sb2NrKTsKIAlxbF9zZW1fdW5sb2NrKHFkZXYsIFNFTV9SVF9JRFhfTUFTSyk7CiB9CiAKQEAgLTM2ODQsMTAgKzM3MjQsOCBAQAogCXN0YXR1cyA9IHFsX3NlbV9zcGlubG9jayhxZGV2LCBTRU1fTUFDX0FERFJfTUFTSyk7CiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKLQlzcGluX2xvY2soJnFkZXYtPmh3X2xvY2spOwogCXN0YXR1cyA9IHFsX3NldF9tYWNfYWRkcl9yZWcocWRldiwgKHU4ICopIG5kZXYtPmRldl9hZGRyLAogCQkJTUFDX0FERFJfVFlQRV9DQU1fTUFDLCBxZGV2LT5mdW5jICogTUFYX0NRKTsKLQlzcGluX3VubG9jaygmcWRldi0+aHdfbG9jayk7CiAJaWYgKHN0YXR1cykKIAkJUVBSSU5USyhxZGV2LCBIVywgRVJSLCAiRmFpbGVkIHRvIGxvYWQgTUFDIGFkZHJlc3MuXG4iKTsKIAlxbF9zZW1fdW5sb2NrKHFkZXYsIFNFTV9NQUNfQUREUl9NQVNLKTsKQEAgLTM3MDUsNyArMzc0Myw3IEBACiAJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPQogCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHFsX2FkYXB0ZXIsIGFzaWNfcmVzZXRfd29yay53b3JrKTsKIAlpbnQgc3RhdHVzOwotCisJcnRubF9sb2NrKCk7CiAJc3RhdHVzID0gcWxfYWRhcHRlcl9kb3duKHFkZXYpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyb3I7CkBAIC0zNzE0LDExICszNzUyLDE3IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJvcjsKIAorCS8qIFJlc3RvcmUgcnggbW9kZS4gKi8KKwljbGVhcl9iaXQoUUxfQUxMTVVMVEksICZxZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KFFMX1BST01JU0NVT1VTLCAmcWRldi0+ZmxhZ3MpOworCXFsZ2Vfc2V0X211bHRpY2FzdF9saXN0KHFkZXYtPm5kZXYpOworCisJcnRubF91bmxvY2soKTsKIAlyZXR1cm47CiBlcnJvcjoKIAlRUFJJTlRLKHFkZXYsIElGVVAsIEFMRVJULAogCQkiRHJpdmVyIHVwL2Rvd24gY3ljbGUgZmFpbGVkLCBjbG9zaW5nIGRldmljZVxuIik7Ci0JcnRubF9sb2NrKCk7CisKIAlzZXRfYml0KFFMX0FEQVBURVJfVVAsICZxZGV2LT5mbGFncyk7CiAJZGV2X2Nsb3NlKHFkZXYtPm5kZXYpOwogCXJ0bmxfdW5sb2NrKCk7CkBAIC0zODM0LDExICszODc4LDE0IEBACiAJCXJldHVybiBlcnI7CiAJfQogCisJcWRldi0+bmRldiA9IG5kZXY7CisJcWRldi0+cGRldiA9IHBkZXY7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOwogCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApOwogCWlmIChwb3MgPD0gMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsIFBGWCAiQ2Fubm90IGZpbmQgUENJIEV4cHJlc3MgY2FwYWJpbGl0eSwgIgogCQkJImFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX291dDsKKwkJcmV0dXJuIHBvczsKIAl9IGVsc2UgewogCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0RFVkNUTCwgJnZhbDE2KTsKIAkJdmFsMTYgJj0gflBDSV9FWFBfREVWQ1RMX05PU05PT1BfRU47CkBAIC0zODUxLDcgKzM4OTgsNyBAQAogCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiUENJIHJlZ2lvbiByZXF1ZXN0IGZhaWxlZC5cbiIpOwotCQlnb3RvIGVycl9vdXQ7CisJCXJldHVybiBlcnI7CiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CkBAIC0zODY5LDcgKzM5MTYsNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCXFkZXYtPnJlZ19iYXNlID0KIAkgICAgaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwKIAkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpKTsKQEAgLTM4ODksOCArMzkzNiw2IEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQlxZGV2LT5uZGV2ID0gbmRldjsKLQlxZGV2LT5wZGV2ID0gcGRldjsKIAllcnIgPSBxbF9nZXRfYm9hcmRfaW5mbyhxZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlZ2lzdGVyIGFjY2VzcyBmYWlsZWQuXG4iKTsKQEAgLTM5MzAsNyArMzk3NSw2IEBACiAJSU5JVF9ERUxBWUVEX1dPUksoJnFkZXYtPm1waV93b3JrLCBxbF9tcGlfd29yayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnFkZXYtPm1waV9wb3J0X2NmZ193b3JrLCBxbF9tcGlfcG9ydF9jZmdfd29yayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnFkZXYtPm1waV9pZGNfd29yaywgcWxfbXBpX2lkY193b3JrKTsKLQltdXRleF9pbml0KCZxZGV2LT5tcGlfbXV0ZXgpOwogCWluaXRfY29tcGxldGlvbigmcWRldi0+aWRlX2NvbXBsZXRpb24pOwogCiAJaWYgKCFjYXJkc19mb3VuZCkgewpAQCAtNDAyNyw2ICs0MDcxLDMzIEBACiAJZnJlZV9uZXRkZXYobmRldik7CiB9CiAKKy8qIENsZWFuIHVwIHJlc291cmNlcyB3aXRob3V0IHRvdWNoaW5nIGhhcmR3YXJlLiAqLworc3RhdGljIHZvaWQgcWxfZWVoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCWludCBpOworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZGV2KSkgeworCQluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwl9CisKKwlpZiAodGVzdF9iaXQoUUxfQURBUFRFUl9VUCwgJnFkZXYtPmZsYWdzKSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZxZGV2LT5hc2ljX3Jlc2V0X3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcWRldi0+bXBpX3Jlc2V0X3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcWRldi0+bXBpX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcWRldi0+bXBpX2lkY193b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnFkZXYtPm1waV9wb3J0X2NmZ193b3JrKTsKKworCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5yc3NfcmluZ19jb3VudDsgaSsrKQorCQluZXRpZl9uYXBpX2RlbCgmcWRldi0+cnhfcmluZ1tpXS5uYXBpKTsKKworCWNsZWFyX2JpdChRTF9BREFQVEVSX1VQLCAmcWRldi0+ZmxhZ3MpOworCXFsX3R4X3JpbmdfY2xlYW4ocWRldik7CisJcWxfZnJlZV9yeF9idWZmZXJzKHFkZXYpOworCXFsX3JlbGVhc2VfYWRhcHRlcl9yZXNvdXJjZXMocWRldik7Cit9CisKIC8qCiAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBieSB0aGUgUENJIHN1YnN5c3RlbSB3aGVuZXZlcgogICogYSBQQ0kgYnVzIGVycm9yIGlzIGRldGVjdGVkLgpAQCAtNDAzNSwxNyArNDEwNiwyMSBAQAogCQkJCQkgICAgICAgZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwogCi0JbmV0aWZfZGV2aWNlX2RldGFjaChuZGV2KTsKLQotCWlmIChzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgcGNpX2NoYW5uZWxfaW9fbm9ybWFsOgorCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfQ0FOX1JFQ09WRVI7CisJY2FzZSBwY2lfY2hhbm5lbF9pb19mcm96ZW46CisJCW5ldGlmX2RldmljZV9kZXRhY2gobmRldik7CisJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQkJcWxfZWVoX2Nsb3NlKG5kZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOworCWNhc2UgcGNpX2NoYW5uZWxfaW9fcGVybV9mYWlsdXJlOgorCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IHBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZS5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkKLQkJcWxfYWRhcHRlcl9kb3duKHFkZXYpOwotCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCX0KIAogCS8qIFJlcXVlc3QgYSBzbG90IHJlc2V0LiAqLwogCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOwpAQCAtNDA2MiwyNSArNDEzNywxNSBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAKKwlwZGV2LT5lcnJvcl9zdGF0ZSA9IHBjaV9jaGFubmVsX2lvX25vcm1hbDsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgewogCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKIAkJCSJDYW5ub3QgcmUtZW5hYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgcmVzZXQuXG4iKTsKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CiAJfQotCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKLQlxbF9hZGFwdGVyX3Jlc2V0KHFkZXYpOwotCi0JLyogTWFrZSBzdXJlIHRoZSBFRVBST00gaXMgZ29vZCAqLwotCW1lbWNweShuZGV2LT5wZXJtX2FkZHIsIG5kZXYtPmRldl9hZGRyLCBuZGV2LT5hZGRyX2xlbik7Ci0KLQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmRldi0+cGVybV9hZGRyKSkgewotCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgIkFmdGVyIHJlc2V0LCBpbnZhbGlkIE1BQyBhZGRyZXNzLlxuIik7Ci0JCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOwotCX0KLQogCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7CiB9CiAKQEAgLTQwODgsMTcgKzQxNTMsMjEgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBlcnIgPSAwOwogCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KKwlpZiAocWxfYWRhcHRlcl9yZXNldChxZGV2KSkKKwkJUVBSSU5USyhxZGV2LCBEUlYsIEVSUiwgInJlc2V0IEZBSUxFRCFcbiIpOwogCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7Ci0JCWlmIChxbF9hZGFwdGVyX3VwKHFkZXYpKSB7CisJCWVyciA9IHFsZ2Vfb3BlbihuZGV2KTsKKwkJaWYgKGVycikgewogCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCiAJCQkJIkRldmljZSBpbml0aWFsaXphdGlvbiBmYWlsZWQgYWZ0ZXIgcmVzZXQuXG4iKTsKIAkJCXJldHVybjsKIAkJfQorCX0gZWxzZSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJIkRldmljZSB3YXMgbm90IHJ1bm5pbmcgcHJpb3IgdG8gRUVILlxuIik7CiAJfQotCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21waS5jIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21waS5jCmluZGV4IDY2ODViZDkuLmJjZjEzYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tcGkuYworKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbXBpLmMKQEAgLTQ3MCw5ICs0NzAsOSBAQAogICovCiBzdGF0aWMgaW50IHFsX21haWxib3hfY29tbWFuZChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgc3RydWN0IG1ib3hfcGFyYW1zICptYmNwKQogewotCWludCBzdGF0dXMsIGNvdW50OworCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKIAotCW11dGV4X2xvY2soJnFkZXYtPm1waV9tdXRleCk7CiAKIAkvKiBCZWdpbiBwb2xsZWQgbW9kZSBmb3IgTVBJICovCiAJcWxfd3JpdGUzMihxZGV2LCBJTlRSX01BU0ssIChJTlRSX01BU0tfUEkgPDwgMTYpKTsKQEAgLTQ5Miw5ICs0OTIsOSBAQAogCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlLiBXZSBsb29wCiAJICogaGVyZSBiZWNhdXNlIHNvbWUgQUVOIG1pZ2h0IGFycml2ZSB3aGlsZQogCSAqIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBtYWlsYm94IGNvbW1hbmQgdG8KLQkgKiBjb21wbGV0ZS4gSWYgbW9yZSB0aGFuIDUgYXJyaXZlIHRoZW4gd2UgY2FuCisJICogY29tcGxldGUuIElmIG1vcmUgdGhhbiA1IHNlY29uZHMgZXhwaXJlIHdlIGNhbgogCSAqIGFzc3VtZSBzb21ldGhpbmcgaXMgd3JvbmcuICovCi0JY291bnQgPSA1OworCWNvdW50ID0gamlmZmllcyArIEhaICogTUFJTEJPWF9USU1FT1VUOwogCWRvIHsKIAkJLyogV2FpdCBmb3IgdGhlIGludGVycnVwdCB0byBjb21lIGluLiAqLwogCQlzdGF0dXMgPSBxbF93YWl0X21ieF9jbWRfY21wbHQocWRldik7CkBAIC01MTgsMTUgKzUxOCwxNSBAQAogCQkJCQlNQl9DTURfU1RTX0dPT0QpIHx8CiAJCQkoKG1iY3AtPm1ib3hfb3V0WzBdICYgMHgwMDAwZjAwMCkgPT0KIAkJCQkJTUJfQ01EX1NUU19JTlRSTURUKSkKLQkJCWJyZWFrOwotCX0gd2hpbGUgKC0tY291bnQpOworCQkJZ290byBkb25lOworCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGNvdW50KSk7CiAKLQlpZiAoIWNvdW50KSB7Ci0JCVFQUklOVEsocWRldiwgRFJWLCBFUlIsCi0JCQkiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG1haWxib3ggY29tcGxldGUuXG4iKTsKLQkJc3RhdHVzID0gLUVUSU1FRE9VVDsKLQkJZ290byBlbmQ7Ci0JfQorCVFQUklOVEsocWRldiwgRFJWLCBFUlIsCisJCSJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbWFpbGJveCBjb21wbGV0ZS5cbiIpOworCXN0YXR1cyA9IC1FVElNRURPVVQ7CisJZ290byBlbmQ7CisKK2RvbmU6CiAKIAkvKiBOb3cgd2UgY2FuIGNsZWFyIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9uCiAJICogYW5kIGxvb2sgYXQgb3VyIHN0YXR1cy4KQEAgLTU0MSw3ICs1NDEsNiBAQAogCQlzdGF0dXMgPSAtRUlPOwogCX0KIGVuZDoKLQltdXRleF91bmxvY2soJnFkZXYtPm1waV9tdXRleCk7CiAJLyogRW5kIHBvbGxlZCBtb2RlIGZvciBNUEkgKi8KIAlxbF93cml0ZTMyKHFkZXYsIElOVFJfTUFTSywgKElOVFJfTUFTS19QSSA8PCAxNikgfCBJTlRSX01BU0tfUEkpOwogCXJldHVybiBzdGF0dXM7CkBAIC03NzAsMTMgKzc2OSwxMDQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitpbnQgcWxfbWJfc2V0X21nbW50X3RyYWZmaWNfY3RsKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgY29udHJvbCkKK3sKKwlzdHJ1Y3QgbWJveF9wYXJhbXMgbWJjOworCXN0cnVjdCBtYm94X3BhcmFtcyAqbWJjcCA9ICZtYmM7CisJaW50IHN0YXR1czsKKworCW1lbXNldChtYmNwLCAwLCBzaXplb2Yoc3RydWN0IG1ib3hfcGFyYW1zKSk7CisKKwltYmNwLT5pbl9jb3VudCA9IDE7CisJbWJjcC0+b3V0X2NvdW50ID0gMjsKKworCW1iY3AtPm1ib3hfaW5bMF0gPSBNQl9DTURfU0VUX01HTU5UX1RGS19DVEw7CisJbWJjcC0+bWJveF9pblsxXSA9IGNvbnRyb2w7CisKKwlzdGF0dXMgPSBxbF9tYWlsYm94X2NvbW1hbmQocWRldiwgbWJjcCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChtYmNwLT5tYm94X291dFswXSA9PSBNQl9DTURfU1RTX0dPT0QpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAobWJjcC0+bWJveF9vdXRbMF0gPT0gTUJfQ01EX1NUU19JTlZMRF9DTUQpIHsKKwkJUVBSSU5USyhxZGV2LCBEUlYsIEVSUiwKKwkJCSJDb21tYW5kIG5vdCBzdXBwb3J0ZWQgYnkgZmlybXdhcmUuXG4iKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKG1iY3AtPm1ib3hfb3V0WzBdID09IE1CX0NNRF9TVFNfRVJSKSB7CisJCS8qIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGZpcm13YXJlIGlzCisJCSAqIGFscmVhZHkgaW4gdGhlIHN0YXRlIHdlIGFyZSB0cnlpbmcgdG8KKwkJICogY2hhbmdlIGl0IHRvLgorCQkgKi8KKwkJUVBSSU5USyhxZGV2LCBEUlYsIEVSUiwKKwkJCSJDb21tYW5kIHBhcmFtZXRlcnMgbWFrZSBubyBjaGFuZ2UuXG4iKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgdGhlIG1haWxib3ggY29tbWFuZCBzdGF0dXMuICovCitzdGF0aWMgaW50IHFsX21iX2dldF9tZ21udF90cmFmZmljX2N0bChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgdTMyICpjb250cm9sKQoreworCXN0cnVjdCBtYm94X3BhcmFtcyBtYmM7CisJc3RydWN0IG1ib3hfcGFyYW1zICptYmNwID0gJm1iYzsKKwlpbnQgc3RhdHVzOworCisJbWVtc2V0KG1iY3AsIDAsIHNpemVvZihzdHJ1Y3QgbWJveF9wYXJhbXMpKTsKKwkqY29udHJvbCA9IDA7CisKKwltYmNwLT5pbl9jb3VudCA9IDE7CisJbWJjcC0+b3V0X2NvdW50ID0gMTsKKworCW1iY3AtPm1ib3hfaW5bMF0gPSBNQl9DTURfR0VUX01HTU5UX1RGS19DVEw7CisKKwlzdGF0dXMgPSBxbF9tYWlsYm94X2NvbW1hbmQocWRldiwgbWJjcCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChtYmNwLT5tYm94X291dFswXSA9PSBNQl9DTURfU1RTX0dPT0QpIHsKKwkJKmNvbnRyb2wgPSBtYmNwLT5tYm94X2luWzFdOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmIChtYmNwLT5tYm94X291dFswXSA9PSBNQl9DTURfU1RTX0lOVkxEX0NNRCkgeworCQlRUFJJTlRLKHFkZXYsIERSViwgRVJSLAorCQkJIkNvbW1hbmQgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZS5cbiIpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAobWJjcC0+bWJveF9vdXRbMF0gPT0gTUJfQ01EX1NUU19FUlIpIHsKKwkJUVBSSU5USyhxZGV2LCBEUlYsIEVSUiwKKwkJCSJGYWlsZWQgdG8gZ2V0IE1QSSB0cmFmZmljIGNvbnRyb2wuXG4iKTsKKwkJc3RhdHVzID0gLUVJTzsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHFsX3dhaXRfZmlmb19lbXB0eShzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgY291bnQgPSA1OworCXUzMiBtZ21udF9maWZvX2VtcHR5OworCXUzMiBuaWNfZmlmb19lbXB0eTsKKworCWRvIHsKKwkJbmljX2ZpZm9fZW1wdHkgPSBxbF9yZWFkMzIocWRldiwgU1RTKSAmIFNUU19ORkU7CisJCXFsX21iX2dldF9tZ21udF90cmFmZmljX2N0bChxZGV2LCAmbWdtbnRfZmlmb19lbXB0eSk7CisJCW1nbW50X2ZpZm9fZW1wdHkgJj0gTUJfR0VUX01QSV9URktfRklGT19FTVBUWTsKKwkJaWYgKG5pY19maWZvX2VtcHR5ICYmIG1nbW50X2ZpZm9fZW1wdHkpCisJCQlyZXR1cm4gMDsKKwkJbXNsZWVwKDEwMCk7CisJfSB3aGlsZSAoY291bnQtLSA+IDApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCiAvKiBBUEkgY2FsbGVkIGluIHdvcmsgdGhyZWFkIGNvbnRleHQgdG8gc2V0IG5ldyBUWC9SWAogICogbWF4aW11bSBmcmFtZSBzaXplIHZhbHVlcyB0byBtYXRjaCBNVFUuCiAgKi8KIHN0YXRpYyBpbnQgcWxfc2V0X3BvcnRfY2ZnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQogewogCWludCBzdGF0dXM7CisJcnRubF9sb2NrKCk7CiAJc3RhdHVzID0gcWxfbWJfc2V0X3BvcnRfY2ZnKHFkZXYpOworCXJ0bmxfdW5sb2NrKCk7CiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAlzdGF0dXMgPSBxbF9pZGNfd2FpdChxZGV2KTsKQEAgLTc5Nyw3ICs4ODcsOSBAQAogCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHFsX2FkYXB0ZXIsIG1waV9wb3J0X2NmZ193b3JrLndvcmspOwogCWludCBzdGF0dXM7CiAKKwlydG5sX2xvY2soKTsKIAlzdGF0dXMgPSBxbF9tYl9nZXRfcG9ydF9jZmcocWRldik7CisJcnRubF91bmxvY2soKTsKIAlpZiAoc3RhdHVzKSB7CiAJCVFQUklOVEsocWRldiwgRFJWLCBFUlIsCiAJCQkiQnVnOiBGYWlsZWQgdG8gZ2V0IHBvcnQgY29uZmlnIGRhdGEuXG4iKTsKQEAgLTg1NSw3ICs5NDcsOSBAQAogCQkgKiBuZWVkcyB0byBiZSBzZXQuCiAJCSAqICovCiAJCXNldF9iaXQoUUxfQ0FNX1JUX1NFVCwgJnFkZXYtPmZsYWdzKTsKKwkJcnRubF9sb2NrKCk7CiAJCXN0YXR1cyA9IHFsX21iX2lkY19hY2socWRldik7CisJCXJ0bmxfdW5sb2NrKCk7CiAJCWlmIChzdGF0dXMpIHsKIAkJCVFQUklOVEsocWRldiwgRFJWLCBFUlIsCiAJCQkiQnVnOiBObyBwZW5kaW5nIElEQyFcbiIpOwpAQCAtODcxLDcgKzk2NSw5IEBACiAJc3RydWN0IG1ib3hfcGFyYW1zICptYmNwID0gJm1iYzsKIAlpbnQgZXJyID0gMDsKIAotCW11dGV4X2xvY2soJnFkZXYtPm1waV9tdXRleCk7CisJcnRubF9sb2NrKCk7CisJLyogQmVnaW4gcG9sbGVkIG1vZGUgZm9yIE1QSSAqLworCXFsX3dyaXRlMzIocWRldiwgSU5UUl9NQVNLLCAoSU5UUl9NQVNLX1BJIDw8IDE2KSk7CiAKIAl3aGlsZSAocWxfcmVhZDMyKHFkZXYsIFNUUykgJiBTVFNfUEkpIHsKIAkJbWVtc2V0KG1iY3AsIDAsIHNpemVvZihzdHJ1Y3QgbWJveF9wYXJhbXMpKTsKQEAgLTg4NCw3ICs5ODAsOSBAQAogCQkJYnJlYWs7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZxZGV2LT5tcGlfbXV0ZXgpOworCS8qIEVuZCBwb2xsZWQgbW9kZSBmb3IgTVBJICovCisJcWxfd3JpdGUzMihxZGV2LCBJTlRSX01BU0ssIChJTlRSX01BU0tfUEkgPDwgMTYpIHwgSU5UUl9NQVNLX1BJKTsKKwlydG5sX3VubG9jaygpOwogCXFsX2VuYWJsZV9jb21wbGV0aW9uX2ludGVycnVwdChxZGV2LCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKaW5kZXggNTBjNmEzYy4uZmE0OTM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjgxNjkuYworKysgYi9kcml2ZXJzL25ldC9yODE2OS5jCkBAIC0xMTUsNyArMTE1LDkgQEAKIAlSVExfR0lHQV9NQUNfVkVSXzIyID0gMHgxNiwgLy8gODE2OEMKIAlSVExfR0lHQV9NQUNfVkVSXzIzID0gMHgxNywgLy8gODE2OENQCiAJUlRMX0dJR0FfTUFDX1ZFUl8yNCA9IDB4MTgsIC8vIDgxNjhDUAotCVJUTF9HSUdBX01BQ19WRVJfMjUgPSAweDE5ICAvLyA4MTY4RAorCVJUTF9HSUdBX01BQ19WRVJfMjUgPSAweDE5LCAvLyA4MTY4RAorCVJUTF9HSUdBX01BQ19WRVJfMjYgPSAweDFhLCAvLyA4MTY4RAorCVJUTF9HSUdBX01BQ19WRVJfMjcgPSAweDFiICAvLyA4MTY4RFAKIH07CiAKICNkZWZpbmUgX1IoTkFNRSxNQUMsTUFTSykgXApAQCAtMTUwLDcgKzE1Miw5IEBACiAJX1IoIlJUTDgxNjhjLzgxMTFjIiwJUlRMX0dJR0FfTUFDX1ZFUl8yMiwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCiAJX1IoIlJUTDgxNjhjcC84MTExY3AiLAlSVExfR0lHQV9NQUNfVkVSXzIzLCAweGZmN2UxODgwKSwgLy8gUENJLUUKIAlfUigiUlRMODE2OGNwLzgxMTFjcCIsCVJUTF9HSUdBX01BQ19WRVJfMjQsIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRQotCV9SKCJSVEw4MTY4ZC84MTExZCIsCVJUTF9HSUdBX01BQ19WRVJfMjUsIDB4ZmY3ZTE4ODApICAvLyBQQ0ktRQorCV9SKCJSVEw4MTY4ZC84MTExZCIsCVJUTF9HSUdBX01BQ19WRVJfMjUsIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRQorCV9SKCJSVEw4MTY4ZC84MTExZCIsCVJUTF9HSUdBX01BQ19WRVJfMjYsIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRQorCV9SKCJSVEw4MTY4ZHAvODExMWRwIiwJUlRMX0dJR0FfTUFDX1ZFUl8yNywgMHhmZjdlMTg4MCkgIC8vIFBDSS1FCiB9OwogI3VuZGVmIF9SCiAKQEAgLTI1Myw2ICsyNTcsMTMgQEAKIAlEQkdfUkVHCQkJPSAweGQxLAogI2RlZmluZQlGSVhfTkFLXzEJCQkoMSA8PCA0KQogI2RlZmluZQlGSVhfTkFLXzIJCQkoMSA8PCAzKQorCUVGVVNFQVIJCQk9IDB4ZGMsCisjZGVmaW5lCUVGVVNFQVJfRkxBRwkJCTB4ODAwMDAwMDAKKyNkZWZpbmUJRUZVU0VBUl9XUklURV9DTUQJCTB4ODAwMDAwMDAKKyNkZWZpbmUJRUZVU0VBUl9SRUFEX0NNRAkJMHgwMDAwMDAwMAorI2RlZmluZQlFRlVTRUFSX1JFR19NQVNLCQkweDAzZmYKKyNkZWZpbmUJRUZVU0VBUl9SRUdfU0hJRlQJCTgKKyNkZWZpbmUJRUZVU0VBUl9EQVRBX01BU0sJCTB4ZmYKIH07CiAKIGVudW0gcnRsX3JlZ2lzdGVyX2NvbnRlbnQgewpAQCAtNTY4LDYgKzU3OSwxNCBAQAogCW1kaW9fd3JpdGUoaW9hZGRyLCByZWdfYWRkciwgbWRpb19yZWFkKGlvYWRkciwgcmVnX2FkZHIpIHwgdmFsdWUpOwogfQogCitzdGF0aWMgdm9pZCBtZGlvX3BsdXNfbWludXModm9pZCBfX2lvbWVtICppb2FkZHIsIGludCByZWdfYWRkciwgaW50IHAsIGludCBtKQoreworCWludCB2YWw7CisKKwl2YWwgPSBtZGlvX3JlYWQoaW9hZGRyLCByZWdfYWRkcik7CisJbWRpb193cml0ZShpb2FkZHIsIHJlZ19hZGRyLCAodmFsIHwgcCkgJiB+bSk7Cit9CisKIHN0YXRpYyB2b2lkIHJ0bF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwKIAkJCSAgIGludCB2YWwpCiB7CkBAIC02NTEsNiArNjcwLDI0IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCitzdGF0aWMgdTggcnRsODE2OGRfZWZ1c2VfcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IHJlZ19hZGRyKQoreworCXU4IHZhbHVlID0gMHhmZjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCVJUTF9XMzIoRUZVU0VBUiwgKHJlZ19hZGRyICYgRUZVU0VBUl9SRUdfTUFTSykgPDwgRUZVU0VBUl9SRUdfU0hJRlQpOworCisJZm9yIChpID0gMDsgaSA8IDMwMDsgaSsrKSB7CisJCWlmIChSVExfUjMyKEVGVVNFQVIpICYgRUZVU0VBUl9GTEFHKSB7CisJCQl2YWx1ZSA9IFJUTF9SMzIoRUZVU0VBUikgJiBFRlVTRUFSX0RBVEFfTUFTSzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDApOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKwogc3RhdGljIHZvaWQgcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKHZvaWQgX19pb21lbSAqaW9hZGRyKQogewogCVJUTF9XMTYoSW50ck1hc2ssIDB4MDAwMCk7CkBAIC05OTIsNyArMTAyOSwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CiAJdHAtPnZsZ3JwID0gZ3JwOwotCWlmICh0cC0+dmxncnApCisJLyoKKwkgKiBEbyBub3QgZGlzYWJsZSBSeFZsYW4gb24gODExMFNDZC4KKwkgKi8KKwlpZiAodHAtPnZsZ3JwIHx8ICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wNSkpCiAJCXRwLT5jcF9jbWQgfD0gUnhWbGFuOwogCWVsc2UKIAkJdHAtPmNwX2NtZCAmPSB+UnhWbGFuOwpAQCAtMTI0Myw3ICsxMjgzLDEwIEBACiAJCWludCBtYWNfdmVyc2lvbjsKIAl9IG1hY19pbmZvW10gPSB7CiAJCS8qIDgxNjhEIGZhbWlseS4gKi8KLQkJeyAweDdjODAwMDAwLCAweDI4MDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzI1IH0sCisJCXsgMHg3Y2YwMDAwMCwgMHgyODMwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8yNiB9LAorCQl7IDB4N2NmMDAwMDAsIDB4MjgxMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMjUgfSwKKwkJeyAweDdjODAwMDAwLCAweDI4ODAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzI3IH0sCisJCXsgMHg3YzgwMDAwMCwgMHgyODAwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8yNiB9LAogCiAJCS8qIDgxNjhDIGZhbWlseS4gKi8KIAkJeyAweDdjZjAwMDAwLCAweDNjYTAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzI0IH0sCkBAIC0xNjQ4LDc0ICsxNjkxLDkwMyBAQAogCXJ0bDgxNjhjXzNfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTY4ZF9od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQorc3RhdGljIHZvaWQgcnRsODE2OGRfMV9od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQogewotCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdF8wW10gPSB7CisJc3RhdGljIHN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdF8wW10gPSB7CiAJCXsgMHgxZiwgMHgwMDAxIH0sCi0JCXsgMHgwOSwgMHgyNzcwIH0sCi0JCXsgMHgwOCwgMHgwNGQwIH0sCi0JCXsgMHgwYiwgMHhhZDE1IH0sCi0JCXsgMHgwYywgMHg1YmYwIH0sCi0JCXsgMHgxYywgMHhmMTAxIH0sCisJCXsgMHgwNiwgMHg0MDY0IH0sCisJCXsgMHgwNywgMHgyODYzIH0sCisJCXsgMHgwOCwgMHgwNTljIH0sCisJCXsgMHgwOSwgMHgyNmI0IH0sCisJCXsgMHgwYSwgMHg2YTE5IH0sCisJCXsgMHgwYiwgMHhkY2M4IH0sCisJCXsgMHgxMCwgMHhmMDZkIH0sCisJCXsgMHgxNCwgMHg3ZjY4IH0sCisJCXsgMHgxOCwgMHg3ZmQ5IH0sCisJCXsgMHgxYywgMHhmMGZmIH0sCisJCXsgMHgxZCwgMHgzZDljIH0sCiAJCXsgMHgxZiwgMHgwMDAzIH0sCi0JCXsgMHgxNCwgMHg5NGQ3IH0sCi0JCXsgMHgxMiwgMHhmNGQ2IH0sCi0JCXsgMHgwOSwgMHhjYTBmIH0sCisJCXsgMHgxMiwgMHhmNDlmIH0sCisJCXsgMHgxMywgMHgwNzBiIH0sCisJCXsgMHgxYSwgMHgwNWFkIH0sCisJCXsgMHgxNCwgMHg5NGMwIH0KKwl9OworCXN0YXRpYyBzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRfMVtdID0gewogCQl7IDB4MWYsIDB4MDAwMiB9LAotCQl7IDB4MGIsIDB4MGIxMCB9LAotCQl7IDB4MGMsIDB4ZDFmNyB9LAotCQl7IDB4MWYsIDB4MDAwMiB9LAotCQl7IDB4MDYsIDB4NTQ2MSB9LAotCQl7IDB4MWYsIDB4MDAwMiB9LAotCQl7IDB4MDUsIDB4NjY2MiB9LAotCQl7IDB4MWYsIDB4MDAwMCB9LAotCQl7IDB4MTQsIDB4MDA2MCB9LAotCQl7IDB4MWYsIDB4MDAwMCB9LAotCQl7IDB4MGQsIDB4ZjhhMCB9LAorCQl7IDB4MDYsIDB4NTU2MSB9LAogCQl7IDB4MWYsIDB4MDAwNSB9LAotCQl7IDB4MDUsIDB4ZmZjMiB9CisJCXsgMHgwNSwgMHg4MzMyIH0sCisJCXsgMHgwNiwgMHg1NTYxIH0KKwl9OworCXN0YXRpYyBzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRfMltdID0geworCQl7IDB4MWYsIDB4MDAwNSB9LAorCQl7IDB4MDUsIDB4ZmZjMiB9LAorCQl7IDB4MWYsIDB4MDAwNSB9LAorCQl7IDB4MDUsIDB4ODAwMCB9LAorCQl7IDB4MDYsIDB4ZjhmOSB9LAorCQl7IDB4MDYsIDB4ZmFlZiB9LAorCQl7IDB4MDYsIDB4NTllZSB9LAorCQl7IDB4MDYsIDB4ZjhlYSB9LAorCQl7IDB4MDYsIDB4MDBlZSB9LAorCQl7IDB4MDYsIDB4ZjhlYiB9LAorCQl7IDB4MDYsIDB4MDBlMCB9LAorCQl7IDB4MDYsIDB4Zjg3YyB9LAorCQl7IDB4MDYsIDB4ZTFmOCB9LAorCQl7IDB4MDYsIDB4N2Q1OSB9LAorCQl7IDB4MDYsIDB4MGZlZiB9LAorCQl7IDB4MDYsIDB4MDEzOSB9LAorCQl7IDB4MDYsIDB4MDI5ZSB9LAorCQl7IDB4MDYsIDB4MDZlZiB9LAorCQl7IDB4MDYsIDB4MTAzOSB9LAorCQl7IDB4MDYsIDB4MDg5ZiB9LAorCQl7IDB4MDYsIDB4MmFlZSB9LAorCQl7IDB4MDYsIDB4ZjhlYSB9LAorCQl7IDB4MDYsIDB4MDBlZSB9LAorCQl7IDB4MDYsIDB4ZjhlYiB9LAorCQl7IDB4MDYsIDB4MDFlMCB9LAorCQl7IDB4MDYsIDB4Zjg3YyB9LAorCQl7IDB4MDYsIDB4ZTFmOCB9LAorCQl7IDB4MDYsIDB4N2Q1OCB9LAorCQl7IDB4MDYsIDB4NDA5ZSB9LAorCQl7IDB4MDYsIDB4MGYzOSB9LAorCQl7IDB4MDYsIDB4NDZhYSB9LAorCQl7IDB4MDYsIDB4MGJiZiB9LAorCQl7IDB4MDYsIDB4ODI5MCB9LAorCQl7IDB4MDYsIDB4ZDY4MiB9LAorCQl7IDB4MDYsIDB4OTgwMiB9LAorCQl7IDB4MDYsIDB4MDE0ZiB9LAorCQl7IDB4MDYsIDB4YWUwOSB9LAorCQl7IDB4MDYsIDB4YmY4MiB9LAorCQl7IDB4MDYsIDB4OThkNiB9LAorCQl7IDB4MDYsIDB4ODJhMCB9LAorCQl7IDB4MDYsIDB4MDIwMSB9LAorCQl7IDB4MDYsIDB4NGZlZiB9LAorCQl7IDB4MDYsIDB4OTVmZSB9LAorCQl7IDB4MDYsIDB4ZmRmYyB9LAorCQl7IDB4MDYsIDB4MDVmOCB9LAorCQl7IDB4MDYsIDB4ZjlmYSB9LAorCQl7IDB4MDYsIDB4ZWVmOCB9LAorCQl7IDB4MDYsIDB4ZWEwMCB9LAorCQl7IDB4MDYsIDB4ZWVmOCB9LAorCQl7IDB4MDYsIDB4ZWIwMCB9LAorCQl7IDB4MDYsIDB4ZTJmOCB9LAorCQl7IDB4MDYsIDB4N2NlMyB9LAorCQl7IDB4MDYsIDB4Zjg3ZCB9LAorCQl7IDB4MDYsIDB4YTUxMSB9LAorCQl7IDB4MDYsIDB4MTExMiB9LAorCQl7IDB4MDYsIDB4ZDI0MCB9LAorCQl7IDB4MDYsIDB4ZDY0NCB9LAorCQl7IDB4MDYsIDB4NDQwMiB9LAorCQl7IDB4MDYsIDB4ODIxNyB9LAorCQl7IDB4MDYsIDB4ZDJhMCB9LAorCQl7IDB4MDYsIDB4ZDZhYSB9LAorCQl7IDB4MDYsIDB4YWEwMiB9LAorCQl7IDB4MDYsIDB4ODIxNyB9LAorCQl7IDB4MDYsIDB4YWUwZiB9LAorCQl7IDB4MDYsIDB4YTU0NCB9LAorCQl7IDB4MDYsIDB4NDQwMiB9LAorCQl7IDB4MDYsIDB4YWU0ZCB9LAorCQl7IDB4MDYsIDB4YTVhYSB9LAorCQl7IDB4MDYsIDB4YWEwMiB9LAorCQl7IDB4MDYsIDB4YWU0NyB9LAorCQl7IDB4MDYsIDB4YWY4MiB9LAorCQl7IDB4MDYsIDB4MTNlZSB9LAorCQl7IDB4MDYsIDB4ODM0ZSB9LAorCQl7IDB4MDYsIDB4MDBlZSB9LAorCQl7IDB4MDYsIDB4ODM0ZCB9LAorCQl7IDB4MDYsIDB4MGZlZSB9LAorCQl7IDB4MDYsIDB4ODM0YyB9LAorCQl7IDB4MDYsIDB4MGZlZSB9LAorCQl7IDB4MDYsIDB4ODM0ZiB9LAorCQl7IDB4MDYsIDB4MDBlZSB9LAorCQl7IDB4MDYsIDB4ODM1MSB9LAorCQl7IDB4MDYsIDB4MDBlZSB9LAorCQl7IDB4MDYsIDB4ODM0YSB9LAorCQl7IDB4MDYsIDB4ZmZlZSB9LAorCQl7IDB4MDYsIDB4ODM0YiB9LAorCQl7IDB4MDYsIDB4ZmZlMCB9LAorCQl7IDB4MDYsIDB4ODMzMCB9LAorCQl7IDB4MDYsIDB4ZTE4MyB9LAorCQl7IDB4MDYsIDB4MzE1OCB9LAorCQl7IDB4MDYsIDB4ZmVlNCB9LAorCQl7IDB4MDYsIDB4Zjg4YSB9LAorCQl7IDB4MDYsIDB4ZTVmOCB9LAorCQl7IDB4MDYsIDB4OGJlMCB9LAorCQl7IDB4MDYsIDB4ODMzMiB9LAorCQl7IDB4MDYsIDB4ZTE4MyB9LAorCQl7IDB4MDYsIDB4MzM1OSB9LAorCQl7IDB4MDYsIDB4MGZlMiB9LAorCQl7IDB4MDYsIDB4ODM0ZCB9LAorCQl7IDB4MDYsIDB4MGMyNCB9LAorCQl7IDB4MDYsIDB4NWFmMCB9LAorCQl7IDB4MDYsIDB4MWUxMiB9LAorCQl7IDB4MDYsIDB4ZTRmOCB9LAorCQl7IDB4MDYsIDB4OGNlNSB9LAorCQl7IDB4MDYsIDB4Zjg4ZCB9LAorCQl7IDB4MDYsIDB4YWY4MiB9LAorCQl7IDB4MDYsIDB4MTNlMCB9LAorCQl7IDB4MDYsIDB4ODM0ZiB9LAorCQl7IDB4MDYsIDB4MTBlNCB9LAorCQl7IDB4MDYsIDB4ODM0ZiB9LAorCQl7IDB4MDYsIDB4ZTA4MyB9LAorCQl7IDB4MDYsIDB4NGU3OCB9LAorCQl7IDB4MDYsIDB4MDA5ZiB9LAorCQl7IDB4MDYsIDB4MGFlMCB9LAorCQl7IDB4MDYsIDB4ODM0ZiB9LAorCQl7IDB4MDYsIDB4YTAxMCB9LAorCQl7IDB4MDYsIDB4YTVlZSB9LAorCQl7IDB4MDYsIDB4ODM0ZSB9LAorCQl7IDB4MDYsIDB4MDFlMCB9LAorCQl7IDB4MDYsIDB4ODM0ZSB9LAorCQl7IDB4MDYsIDB4NzgwNSB9LAorCQl7IDB4MDYsIDB4OWU5YSB9LAorCQl7IDB4MDYsIDB4ZTA4MyB9LAorCQl7IDB4MDYsIDB4NGU3OCB9LAorCQl7IDB4MDYsIDB4MDQ5ZSB9LAorCQl7IDB4MDYsIDB4MTBlMCB9LAorCQl7IDB4MDYsIDB4ODM0ZSB9LAorCQl7IDB4MDYsIDB4NzgwMyB9LAorCQl7IDB4MDYsIDB4OWUwZiB9LAorCQl7IDB4MDYsIDB4ZTA4MyB9LAorCQl7IDB4MDYsIDB4NGU3OCB9LAorCQl7IDB4MDYsIDB4MDE5ZSB9LAorCQl7IDB4MDYsIDB4MDVhZSB9LAorCQl7IDB4MDYsIDB4MGNhZiB9LAorCQl7IDB4MDYsIDB4ODFmOCB9LAorCQl7IDB4MDYsIDB4YWY4MSB9LAorCQl7IDB4MDYsIDB4YTNhZiB9LAorCQl7IDB4MDYsIDB4ODFkYyB9LAorCQl7IDB4MDYsIDB4YWY4MiB9LAorCQl7IDB4MDYsIDB4MTNlZSB9LAorCQl7IDB4MDYsIDB4ODM0OCB9LAorCQl7IDB4MDYsIDB4MDBlZSB9LAorCQl7IDB4MDYsIDB4ODM0OSB9LAorCQl7IDB4MDYsIDB4MDBlMCB9LAorCQl7IDB4MDYsIDB4ODM1MSB9LAorCQl7IDB4MDYsIDB4MTBlNCB9LAorCQl7IDB4MDYsIDB4ODM1MSB9LAorCQl7IDB4MDYsIDB4NTgwMSB9LAorCQl7IDB4MDYsIDB4OWZlYSB9LAorCQl7IDB4MDYsIDB4ZDAwMCB9LAorCQl7IDB4MDYsIDB4ZDE4MCB9LAorCQl7IDB4MDYsIDB4MWY2NiB9LAorCQl7IDB4MDYsIDB4ZTJmOCB9LAorCQl7IDB4MDYsIDB4ZWFlMyB9LAorCQl7IDB4MDYsIDB4ZjhlYiB9LAorCQl7IDB4MDYsIDB4NWFmOCB9LAorCQl7IDB4MDYsIDB4MWUyMCB9LAorCQl7IDB4MDYsIDB4ZTZmOCB9LAorCQl7IDB4MDYsIDB4ZWFlNSB9LAorCQl7IDB4MDYsIDB4ZjhlYiB9LAorCQl7IDB4MDYsIDB4ZDMwMiB9LAorCQl7IDB4MDYsIDB4YjNmZSB9LAorCQl7IDB4MDYsIDB4ZTJmOCB9LAorCQl7IDB4MDYsIDB4N2NlZiB9LAorCQl7IDB4MDYsIDB4MzI1YiB9LAorCQl7IDB4MDYsIDB4ODBlMyB9LAorCQl7IDB4MDYsIDB4Zjg3ZCB9LAorCQl7IDB4MDYsIDB4OWUwMyB9LAorCQl7IDB4MDYsIDB4N2RmZiB9LAorCQl7IDB4MDYsIDB4ZmYwZCB9LAorCQl7IDB4MDYsIDB4NTgxYyB9LAorCQl7IDB4MDYsIDB4NTUxYSB9LAorCQl7IDB4MDYsIDB4NjUxMSB9LAorCQl7IDB4MDYsIDB4YTE5MCB9LAorCQl7IDB4MDYsIDB4ZDNlMiB9LAorCQl7IDB4MDYsIDB4ODM0OCB9LAorCQl7IDB4MDYsIDB4ZTM4MyB9LAorCQl7IDB4MDYsIDB4NDkxYiB9LAorCQl7IDB4MDYsIDB4NTZhYiB9LAorCQl7IDB4MDYsIDB4MDhlZiB9LAorCQl7IDB4MDYsIDB4NTZlNiB9LAorCQl7IDB4MDYsIDB4ODM0OCB9LAorCQl7IDB4MDYsIDB4ZTc4MyB9LAorCQl7IDB4MDYsIDB4NDkxMCB9LAorCQl7IDB4MDYsIDB4ZDE4MCB9LAorCQl7IDB4MDYsIDB4MWY2NiB9LAorCQl7IDB4MDYsIDB4YTAwNCB9LAorCQl7IDB4MDYsIDB4YjllMiB9LAorCQl7IDB4MDYsIDB4ODM0OCB9LAorCQl7IDB4MDYsIDB4ZTM4MyB9LAorCQl7IDB4MDYsIDB4NDllZiB9LAorCQl7IDB4MDYsIDB4NjVlMiB9LAorCQl7IDB4MDYsIDB4ODM0YSB9LAorCQl7IDB4MDYsIDB4ZTM4MyB9LAorCQl7IDB4MDYsIDB4NGIxYiB9LAorCQl7IDB4MDYsIDB4NTZhYSB9LAorCQl7IDB4MDYsIDB4MGVlZiB9LAorCQl7IDB4MDYsIDB4NTZlNiB9LAorCQl7IDB4MDYsIDB4ODM0YSB9LAorCQl7IDB4MDYsIDB4ZTc4MyB9LAorCQl7IDB4MDYsIDB4NGJlMiB9LAorCQl7IDB4MDYsIDB4ODM0ZCB9LAorCQl7IDB4MDYsIDB4ZTY4MyB9LAorCQl7IDB4MDYsIDB4NGNlMCB9LAorCQl7IDB4MDYsIDB4ODM0ZCB9LAorCQl7IDB4MDYsIDB4YTAwMCB9LAorCQl7IDB4MDYsIDB4MGNhZiB9LAorCQl7IDB4MDYsIDB4ODFkYyB9LAorCQl7IDB4MDYsIDB4ZTA4MyB9LAorCQl7IDB4MDYsIDB4NGQxMCB9LAorCQl7IDB4MDYsIDB4ZTQ4MyB9LAorCQl7IDB4MDYsIDB4NGRhZSB9LAorCQl7IDB4MDYsIDB4MDQ4MCB9LAorCQl7IDB4MDYsIDB4ZTQ4MyB9LAorCQl7IDB4MDYsIDB4NGRlMCB9LAorCQl7IDB4MDYsIDB4ODM0ZSB9LAorCQl7IDB4MDYsIDB4NzgwMyB9LAorCQl7IDB4MDYsIDB4OWUwYiB9LAorCQl7IDB4MDYsIDB4ZTA4MyB9LAorCQl7IDB4MDYsIDB4NGU3OCB9LAorCQl7IDB4MDYsIDB4MDQ5ZSB9LAorCQl7IDB4MDYsIDB4MDRlZSB9LAorCQl7IDB4MDYsIDB4ODM0ZSB9LAorCQl7IDB4MDYsIDB4MDJlMCB9LAorCQl7IDB4MDYsIDB4ODMzMiB9LAorCQl7IDB4MDYsIDB4ZTE4MyB9LAorCQl7IDB4MDYsIDB4MzM1OSB9LAorCQl7IDB4MDYsIDB4MGZlMiB9LAorCQl7IDB4MDYsIDB4ODM0ZCB9LAorCQl7IDB4MDYsIDB4MGMyNCB9LAorCQl7IDB4MDYsIDB4NWFmMCB9LAorCQl7IDB4MDYsIDB4MWUxMiB9LAorCQl7IDB4MDYsIDB4ZTRmOCB9LAorCQl7IDB4MDYsIDB4OGNlNSB9LAorCQl7IDB4MDYsIDB4Zjg4ZCB9LAorCQl7IDB4MDYsIDB4ZTA4MyB9LAorCQl7IDB4MDYsIDB4MzBlMSB9LAorCQl7IDB4MDYsIDB4ODMzMSB9LAorCQl7IDB4MDYsIDB4NjgwMSB9LAorCQl7IDB4MDYsIDB4ZTRmOCB9LAorCQl7IDB4MDYsIDB4OGFlNSB9LAorCQl7IDB4MDYsIDB4Zjg4YiB9LAorCQl7IDB4MDYsIDB4YWUzNyB9LAorCQl7IDB4MDYsIDB4ZWU4MyB9LAorCQl7IDB4MDYsIDB4NGUwMyB9LAorCQl7IDB4MDYsIDB4ZTA4MyB9LAorCQl7IDB4MDYsIDB4NGNlMSB9LAorCQl7IDB4MDYsIDB4ODM0ZCB9LAorCQl7IDB4MDYsIDB4MWIwMSB9LAorCQl7IDB4MDYsIDB4OWUwNCB9LAorCQl7IDB4MDYsIDB4YWFhMSB9LAorCQl7IDB4MDYsIDB4YWVhOCB9LAorCQl7IDB4MDYsIDB4ZWU4MyB9LAorCQl7IDB4MDYsIDB4NGUwNCB9LAorCQl7IDB4MDYsIDB4ZWU4MyB9LAorCQl7IDB4MDYsIDB4NGYwMCB9LAorCQl7IDB4MDYsIDB4YWVhYiB9LAorCQl7IDB4MDYsIDB4ZTA4MyB9LAorCQl7IDB4MDYsIDB4NGY3OCB9LAorCQl7IDB4MDYsIDB4MDM5ZiB9LAorCQl7IDB4MDYsIDB4MTRlZSB9LAorCQl7IDB4MDYsIDB4ODM0ZSB9LAorCQl7IDB4MDYsIDB4MDVkMiB9LAorCQl7IDB4MDYsIDB4NDBkNiB9LAorCQl7IDB4MDYsIDB4NTU1NCB9LAorCQl7IDB4MDYsIDB4MDI4MiB9LAorCQl7IDB4MDYsIDB4MTdkMiB9LAorCQl7IDB4MDYsIDB4YTBkNiB9LAorCQl7IDB4MDYsIDB4YmEwMCB9LAorCQl7IDB4MDYsIDB4MDI4MiB9LAorCQl7IDB4MDYsIDB4MTdmZSB9LAorCQl7IDB4MDYsIDB4ZmRmYyB9LAorCQl7IDB4MDYsIDB4MDVmOCB9LAorCQl7IDB4MDYsIDB4ZTBmOCB9LAorCQl7IDB4MDYsIDB4NjBlMSB9LAorCQl7IDB4MDYsIDB4Zjg2MSB9LAorCQl7IDB4MDYsIDB4NjgwMiB9LAorCQl7IDB4MDYsIDB4ZTRmOCB9LAorCQl7IDB4MDYsIDB4NjBlNSB9LAorCQl7IDB4MDYsIDB4Zjg2MSB9LAorCQl7IDB4MDYsIDB4ZTBmOCB9LAorCQl7IDB4MDYsIDB4NDhlMSB9LAorCQl7IDB4MDYsIDB4Zjg0OSB9LAorCQl7IDB4MDYsIDB4NTgwZiB9LAorCQl7IDB4MDYsIDB4MWUwMiB9LAorCQl7IDB4MDYsIDB4ZTRmOCB9LAorCQl7IDB4MDYsIDB4NDhlNSB9LAorCQl7IDB4MDYsIDB4Zjg0OSB9LAorCQl7IDB4MDYsIDB4ZDAwMCB9LAorCQl7IDB4MDYsIDB4MDI4MiB9LAorCQl7IDB4MDYsIDB4NWJiZiB9LAorCQl7IDB4MDYsIDB4ODM1MCB9LAorCQl7IDB4MDYsIDB4ZWY0NiB9LAorCQl7IDB4MDYsIDB4ZGMxOSB9LAorCQl7IDB4MDYsIDB4ZGRkMCB9LAorCQl7IDB4MDYsIDB4MDEwMiB9LAorCQl7IDB4MDYsIDB4ODI1YiB9LAorCQl7IDB4MDYsIDB4MDI4MiB9LAorCQl7IDB4MDYsIDB4NzdlMCB9LAorCQl7IDB4MDYsIDB4Zjg2MCB9LAorCQl7IDB4MDYsIDB4ZTFmOCB9LAorCQl7IDB4MDYsIDB4NjE1OCB9LAorCQl7IDB4MDYsIDB4ZmRlNCB9LAorCQl7IDB4MDYsIDB4Zjg2MCB9LAorCQl7IDB4MDYsIDB4ZTVmOCB9LAorCQl7IDB4MDYsIDB4NjFmYyB9LAorCQl7IDB4MDYsIDB4MDRmOSB9LAorCQl7IDB4MDYsIDB4ZmFmYiB9LAorCQl7IDB4MDYsIDB4YzZiZiB9LAorCQl7IDB4MDYsIDB4Zjg0MCB9LAorCQl7IDB4MDYsIDB4YmU4MyB9LAorCQl7IDB4MDYsIDB4NTBhMCB9LAorCQl7IDB4MDYsIDB4MDEwMSB9LAorCQl7IDB4MDYsIDB4MDcxYiB9LAorCQl7IDB4MDYsIDB4ODljZiB9LAorCQl7IDB4MDYsIDB4ZDIwOCB9LAorCQl7IDB4MDYsIDB4ZWJkYiB9LAorCQl7IDB4MDYsIDB4MTliMiB9LAorCQl7IDB4MDYsIDB4ZmJmZiB9LAorCQl7IDB4MDYsIDB4ZmVmZCB9LAorCQl7IDB4MDYsIDB4MDRmOCB9LAorCQl7IDB4MDYsIDB4ZTBmOCB9LAorCQl7IDB4MDYsIDB4NDhlMSB9LAorCQl7IDB4MDYsIDB4Zjg0OSB9LAorCQl7IDB4MDYsIDB4NjgwOCB9LAorCQl7IDB4MDYsIDB4ZTRmOCB9LAorCQl7IDB4MDYsIDB4NDhlNSB9LAorCQl7IDB4MDYsIDB4Zjg0OSB9LAorCQl7IDB4MDYsIDB4NThmNyB9LAorCQl7IDB4MDYsIDB4ZTRmOCB9LAorCQl7IDB4MDYsIDB4NDhlNSB9LAorCQl7IDB4MDYsIDB4Zjg0OSB9LAorCQl7IDB4MDYsIDB4ZmMwNCB9LAorCQl7IDB4MDYsIDB4NGQyMCB9LAorCQl7IDB4MDYsIDB4MDAwMiB9LAorCQl7IDB4MDYsIDB4NGUyMiB9LAorCQl7IDB4MDYsIDB4MDAwMiB9LAorCQl7IDB4MDYsIDB4NGRkZiB9LAorCQl7IDB4MDYsIDB4ZmYwMSB9LAorCQl7IDB4MDYsIDB4NGVkZCB9LAorCQl7IDB4MDYsIDB4ZmYwMSB9LAorCQl7IDB4MDUsIDB4ODNkNCB9LAorCQl7IDB4MDYsIDB4ODAwMCB9LAorCQl7IDB4MDUsIDB4ODNkOCB9LAorCQl7IDB4MDYsIDB4ODA1MSB9LAorCQl7IDB4MDIsIDB4NjAxMCB9LAorCQl7IDB4MDMsIDB4ZGMwMCB9LAorCQl7IDB4MDUsIDB4ZmZmNiB9LAorCQl7IDB4MDYsIDB4MDBmYyB9LAorCQl7IDB4MWYsIDB4MDAwMCB9LAorCisJCXsgMHgxZiwgMHgwMDAwIH0sCisJCXsgMHgwZCwgMHhmODgwIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0KIAl9OwogCiAJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdF8wLCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdF8wKSk7CiAKLQlpZiAobWRpb19yZWFkKGlvYWRkciwgMHgwNikgPT0gMHhjNDAwKSB7Ci0JCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdF8xW10gPSB7CisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMik7CisJbWRpb19wbHVzX21pbnVzKGlvYWRkciwgMHgwYiwgMHgwMDEwLCAweDAwZWYpOworCW1kaW9fcGx1c19taW51cyhpb2FkZHIsIDB4MGMsIDB4YTIwMCwgMHg1ZDAwKTsKKworCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXRfMSwgQVJSQVlfU0laRShwaHlfcmVnX2luaXRfMSkpOworCisJaWYgKHJ0bDgxNjhkX2VmdXNlX3JlYWQoaW9hZGRyLCAweDAxKSA9PSAweGIxKSB7CisJCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0geworCQkJeyAweDFmLCAweDAwMDIgfSwKKwkJCXsgMHgwNSwgMHg2NjlhIH0sCiAJCQl7IDB4MWYsIDB4MDAwNSB9LAotCQkJeyAweDAxLCAweDAzMDAgfSwKLQkJCXsgMHgxZiwgMHgwMDAwIH0sCi0JCQl7IDB4MTEsIDB4NDAxYyB9LAotCQkJeyAweDE2LCAweDQxMDAgfSwKKwkJCXsgMHgwNSwgMHg4MzMwIH0sCisJCQl7IDB4MDYsIDB4NjY5YSB9LAorCQkJeyAweDFmLCAweDAwMDIgfQorCQl9OworCQlpbnQgdmFsOworCisJCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXQsIEFSUkFZX1NJWkUocGh5X3JlZ19pbml0KSk7CisKKwkJdmFsID0gbWRpb19yZWFkKGlvYWRkciwgMHgwZCk7CisKKwkJaWYgKCh2YWwgJiAweDAwZmYpICE9IDB4MDA2YykgeworCQkJdTMyIHNldFtdID0geworCQkJCTB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwKKwkJCQkweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMKKwkJCX07CisJCQlpbnQgaTsKKworCQkJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMik7CisKKwkJCXZhbCAmPSAweGZmMDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZXQpOyBpKyspCisJCQkJbWRpb193cml0ZShpb2FkZHIsIDB4MGQsIHZhbCB8IHNldFtpXSk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKKwkJCXsgMHgxZiwgMHgwMDAyIH0sCisJCQl7IDB4MDUsIDB4NjY2MiB9LAogCQkJeyAweDFmLCAweDAwMDUgfSwKLQkJCXsgMHgwNywgMHgwMDEwIH0sCi0JCQl7IDB4MDUsIDB4ODNkYyB9LAotCQkJeyAweDA2LCAweDA4N2QgfSwKLQkJCXsgMHgwNSwgMHg4MzAwIH0sCi0JCQl7IDB4MDYsIDB4MDEwMSB9LAotCQkJeyAweDA2LCAweDA1ZjggfSwKLQkJCXsgMHgwNiwgMHhmOWZhIH0sCi0JCQl7IDB4MDYsIDB4ZmJlZiB9LAotCQkJeyAweDA2LCAweDc5ZTIgfSwKLQkJCXsgMHgwNiwgMHg4MzVmIH0sCi0JCQl7IDB4MDYsIDB4ZTBmOCB9LAotCQkJeyAweDA2LCAweDlhZTEgfSwKLQkJCXsgMHgwNiwgMHhmODliIH0sCi0JCQl7IDB4MDYsIDB4ZWYzMSB9LAotCQkJeyAweDA2LCAweDNiNjUgfSwKLQkJCXsgMHgwNiwgMHhhYTA3IH0sCi0JCQl7IDB4MDYsIDB4ODFlNCB9LAotCQkJeyAweDA2LCAweGY4OWEgfSwKLQkJCXsgMHgwNiwgMHhlNWY4IH0sCi0JCQl7IDB4MDYsIDB4OWJhZiB9LAotCQkJeyAweDA2LCAweDA2YWUgfSwKLQkJCXsgMHgwNSwgMHg4M2RjIH0sCi0JCQl7IDB4MDYsIDB4ODMwMCB9LAorCQkJeyAweDA1LCAweDgzMzAgfSwKKwkJCXsgMHgwNiwgMHg2NjYyIH0KIAkJfTsKIAotCQlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0XzEsCi0JCQkgICAgICBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdF8xKSk7CisJCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXQsIEFSUkFZX1NJWkUocGh5X3JlZ19pbml0KSk7CiAJfQogCi0JbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMCk7CisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMik7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MGQsIDB4MDMwMCk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MGYsIDB4MDAxMCk7CisKKwltZGlvX3dyaXRlKGlvYWRkciwgMHgxZiwgMHgwMDAyKTsKKwltZGlvX3BsdXNfbWludXMoaW9hZGRyLCAweDAyLCAweDAxMDAsIDB4MDYwMCk7CisJbWRpb19wbHVzX21pbnVzKGlvYWRkciwgMHgwMywgMHgwMDAwLCAweGUwMDApOworCisJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdF8yLCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdF8yKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjhkXzJfaHdfcGh5X2NvbmZpZyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlzdGF0aWMgc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0XzBbXSA9IHsKKwkJeyAweDFmLCAweDAwMDEgfSwKKwkJeyAweDA2LCAweDQwNjQgfSwKKwkJeyAweDA3LCAweDI4NjMgfSwKKwkJeyAweDA4LCAweDA1OWMgfSwKKwkJeyAweDA5LCAweDI2YjQgfSwKKwkJeyAweDBhLCAweDZhMTkgfSwKKwkJeyAweDBiLCAweGRjYzggfSwKKwkJeyAweDEwLCAweGYwNmQgfSwKKwkJeyAweDE0LCAweDdmNjggfSwKKwkJeyAweDE4LCAweDdmZDkgfSwKKwkJeyAweDFjLCAweGYwZmYgfSwKKwkJeyAweDFkLCAweDNkOWMgfSwKKwkJeyAweDFmLCAweDAwMDMgfSwKKwkJeyAweDEyLCAweGY0OWYgfSwKKwkJeyAweDEzLCAweDA3MGIgfSwKKwkJeyAweDFhLCAweDA1YWQgfSwKKwkJeyAweDE0LCAweDk0YzAgfSwKKworCQl7IDB4MWYsIDB4MDAwMiB9LAorCQl7IDB4MDYsIDB4NTU2MSB9LAorCQl7IDB4MWYsIDB4MDAwNSB9LAorCQl7IDB4MDUsIDB4ODMzMiB9LAorCQl7IDB4MDYsIDB4NTU2MSB9CisJfTsKKwlzdGF0aWMgc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0XzFbXSA9IHsKKwkJeyAweDFmLCAweDAwMDUgfSwKKwkJeyAweDA1LCAweGZmYzIgfSwKKwkJeyAweDFmLCAweDAwMDUgfSwKKwkJeyAweDA1LCAweDgwMDAgfSwKKwkJeyAweDA2LCAweGY4ZjkgfSwKKwkJeyAweDA2LCAweGZhZWUgfSwKKwkJeyAweDA2LCAweGY4ZWEgfSwKKwkJeyAweDA2LCAweDAwZWUgfSwKKwkJeyAweDA2LCAweGY4ZWIgfSwKKwkJeyAweDA2LCAweDAwZTIgfSwKKwkJeyAweDA2LCAweGY4N2MgfSwKKwkJeyAweDA2LCAweGUzZjggfSwKKwkJeyAweDA2LCAweDdkYTUgfSwKKwkJeyAweDA2LCAweDExMTEgfSwKKwkJeyAweDA2LCAweDEyZDIgfSwKKwkJeyAweDA2LCAweDQwZDYgfSwKKwkJeyAweDA2LCAweDQ0NDQgfSwKKwkJeyAweDA2LCAweDAyODEgfSwKKwkJeyAweDA2LCAweGM2ZDIgfSwKKwkJeyAweDA2LCAweGEwZDYgfSwKKwkJeyAweDA2LCAweGFhYWEgfSwKKwkJeyAweDA2LCAweDAyODEgfSwKKwkJeyAweDA2LCAweGM2YWUgfSwKKwkJeyAweDA2LCAweDBmYTUgfSwKKwkJeyAweDA2LCAweDQ0NDQgfSwKKwkJeyAweDA2LCAweDAyYWUgfSwKKwkJeyAweDA2LCAweDRkYTUgfSwKKwkJeyAweDA2LCAweGFhYWEgfSwKKwkJeyAweDA2LCAweDAyYWUgfSwKKwkJeyAweDA2LCAweDQ3YWYgfSwKKwkJeyAweDA2LCAweDgxYzIgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRlMDAgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRkMGYgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRjMGYgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRmMDAgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDUxMDAgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRhZmYgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRiZmYgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDMwZTEgfSwKKwkJeyAweDA2LCAweDgzMzEgfSwKKwkJeyAweDA2LCAweDU4ZmUgfSwKKwkJeyAweDA2LCAweGU0ZjggfSwKKwkJeyAweDA2LCAweDhhZTUgfSwKKwkJeyAweDA2LCAweGY4OGIgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDMyZTEgfSwKKwkJeyAweDA2LCAweDgzMzMgfSwKKwkJeyAweDA2LCAweDU5MGYgfSwKKwkJeyAweDA2LCAweGUyODMgfSwKKwkJeyAweDA2LCAweDRkMGMgfSwKKwkJeyAweDA2LCAweDI0NWEgfSwKKwkJeyAweDA2LCAweGYwMWUgfSwKKwkJeyAweDA2LCAweDEyZTQgfSwKKwkJeyAweDA2LCAweGY4OGMgfSwKKwkJeyAweDA2LCAweGU1ZjggfSwKKwkJeyAweDA2LCAweDhkYWYgfSwKKwkJeyAweDA2LCAweDgxYzIgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDRmMTAgfSwKKwkJeyAweDA2LCAweGU0ODMgfSwKKwkJeyAweDA2LCAweDRmZTAgfSwKKwkJeyAweDA2LCAweDgzNGUgfSwKKwkJeyAweDA2LCAweDc4MDAgfSwKKwkJeyAweDA2LCAweDlmMGEgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDRmYTAgfSwKKwkJeyAweDA2LCAweDEwYTUgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRlMDEgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDRlNzggfSwKKwkJeyAweDA2LCAweDA1OWUgfSwKKwkJeyAweDA2LCAweDlhZTAgfSwKKwkJeyAweDA2LCAweDgzNGUgfSwKKwkJeyAweDA2LCAweDc4MDQgfSwKKwkJeyAweDA2LCAweDllMTAgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDRlNzggfSwKKwkJeyAweDA2LCAweDAzOWUgfSwKKwkJeyAweDA2LCAweDBmZTAgfSwKKwkJeyAweDA2LCAweDgzNGUgfSwKKwkJeyAweDA2LCAweDc4MDEgfSwKKwkJeyAweDA2LCAweDllMDUgfSwKKwkJeyAweDA2LCAweGFlMGMgfSwKKwkJeyAweDA2LCAweGFmODEgfSwKKwkJeyAweDA2LCAweGE3YWYgfSwKKwkJeyAweDA2LCAweDgxNTIgfSwKKwkJeyAweDA2LCAweGFmODEgfSwKKwkJeyAweDA2LCAweDhiYWYgfSwKKwkJeyAweDA2LCAweDgxYzIgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDQ4MDAgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDQ5MDAgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDUxMTAgfSwKKwkJeyAweDA2LCAweGU0ODMgfSwKKwkJeyAweDA2LCAweDUxNTggfSwKKwkJeyAweDA2LCAweDAxOWYgfSwKKwkJeyAweDA2LCAweGVhZDAgfSwKKwkJeyAweDA2LCAweDAwZDEgfSwKKwkJeyAweDA2LCAweDgwMWYgfSwKKwkJeyAweDA2LCAweDY2ZTIgfSwKKwkJeyAweDA2LCAweGY4ZWEgfSwKKwkJeyAweDA2LCAweGUzZjggfSwKKwkJeyAweDA2LCAweGViNWEgfSwKKwkJeyAweDA2LCAweGY4MWUgfSwKKwkJeyAweDA2LCAweDIwZTYgfSwKKwkJeyAweDA2LCAweGY4ZWEgfSwKKwkJeyAweDA2LCAweGU1ZjggfSwKKwkJeyAweDA2LCAweGViZDMgfSwKKwkJeyAweDA2LCAweDAyYjMgfSwKKwkJeyAweDA2LCAweGZlZTIgfSwKKwkJeyAweDA2LCAweGY4N2MgfSwKKwkJeyAweDA2LCAweGVmMzIgfSwKKwkJeyAweDA2LCAweDViODAgfSwKKwkJeyAweDA2LCAweGUzZjggfSwKKwkJeyAweDA2LCAweDdkOWUgfSwKKwkJeyAweDA2LCAweDAzN2QgfSwKKwkJeyAweDA2LCAweGZmZmYgfSwKKwkJeyAweDA2LCAweDBkNTggfSwKKwkJeyAweDA2LCAweDFjNTUgfSwKKwkJeyAweDA2LCAweDFhNjUgfSwKKwkJeyAweDA2LCAweDExYTEgfSwKKwkJeyAweDA2LCAweDkwZDMgfSwKKwkJeyAweDA2LCAweGUyODMgfSwKKwkJeyAweDA2LCAweDQ4ZTMgfSwKKwkJeyAweDA2LCAweDgzNDkgfSwKKwkJeyAweDA2LCAweDFiNTYgfSwKKwkJeyAweDA2LCAweGFiMDggfSwKKwkJeyAweDA2LCAweGVmNTYgfSwKKwkJeyAweDA2LCAweGU2ODMgfSwKKwkJeyAweDA2LCAweDQ4ZTcgfSwKKwkJeyAweDA2LCAweDgzNDkgfSwKKwkJeyAweDA2LCAweDEwZDEgfSwKKwkJeyAweDA2LCAweDgwMWYgfSwKKwkJeyAweDA2LCAweDY2YTAgfSwKKwkJeyAweDA2LCAweDA0YjkgfSwKKwkJeyAweDA2LCAweGUyODMgfSwKKwkJeyAweDA2LCAweDQ4ZTMgfSwKKwkJeyAweDA2LCAweDgzNDkgfSwKKwkJeyAweDA2LCAweGVmNjUgfSwKKwkJeyAweDA2LCAweGUyODMgfSwKKwkJeyAweDA2LCAweDRhZTMgfSwKKwkJeyAweDA2LCAweDgzNGIgfSwKKwkJeyAweDA2LCAweDFiNTYgfSwKKwkJeyAweDA2LCAweGFhMGUgfSwKKwkJeyAweDA2LCAweGVmNTYgfSwKKwkJeyAweDA2LCAweGU2ODMgfSwKKwkJeyAweDA2LCAweDRhZTcgfSwKKwkJeyAweDA2LCAweDgzNGIgfSwKKwkJeyAweDA2LCAweGUyODMgfSwKKwkJeyAweDA2LCAweDRkZTYgfSwKKwkJeyAweDA2LCAweDgzNGMgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDRkYTAgfSwKKwkJeyAweDA2LCAweDAwMGMgfSwKKwkJeyAweDA2LCAweGFmODEgfSwKKwkJeyAweDA2LCAweDhiZTAgfSwKKwkJeyAweDA2LCAweDgzNGQgfSwKKwkJeyAweDA2LCAweDEwZTQgfSwKKwkJeyAweDA2LCAweDgzNGQgfSwKKwkJeyAweDA2LCAweGFlMDQgfSwKKwkJeyAweDA2LCAweDgwZTQgfSwKKwkJeyAweDA2LCAweDgzNGQgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDRlNzggfSwKKwkJeyAweDA2LCAweDAzOWUgfSwKKwkJeyAweDA2LCAweDBiZTAgfSwKKwkJeyAweDA2LCAweDgzNGUgfSwKKwkJeyAweDA2LCAweDc4MDQgfSwKKwkJeyAweDA2LCAweDllMDQgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRlMDIgfSwKKwkJeyAweDA2LCAweGUwODMgfSwKKwkJeyAweDA2LCAweDMyZTEgfSwKKwkJeyAweDA2LCAweDgzMzMgfSwKKwkJeyAweDA2LCAweDU5MGYgfSwKKwkJeyAweDA2LCAweGUyODMgfSwKKwkJeyAweDA2LCAweDRkMGMgfSwKKwkJeyAweDA2LCAweDI0NWEgfSwKKwkJeyAweDA2LCAweGYwMWUgfSwKKwkJeyAweDA2LCAweDEyZTQgfSwKKwkJeyAweDA2LCAweGY4OGMgfSwKKwkJeyAweDA2LCAweGU1ZjggfSwKKwkJeyAweDA2LCAweDhkZTAgfSwKKwkJeyAweDA2LCAweDgzMzAgfSwKKwkJeyAweDA2LCAweGUxODMgfSwKKwkJeyAweDA2LCAweDMxNjggfSwKKwkJeyAweDA2LCAweDAxZTQgfSwKKwkJeyAweDA2LCAweGY4OGEgfSwKKwkJeyAweDA2LCAweGU1ZjggfSwKKwkJeyAweDA2LCAweDhiYWUgfSwKKwkJeyAweDA2LCAweDM3ZWUgfSwKKwkJeyAweDA2LCAweDgzNGUgfSwKKwkJeyAweDA2LCAweDAzZTAgfSwKKwkJeyAweDA2LCAweDgzNGMgfSwKKwkJeyAweDA2LCAweGUxODMgfSwKKwkJeyAweDA2LCAweDRkMWIgfSwKKwkJeyAweDA2LCAweDAxOWUgfSwKKwkJeyAweDA2LCAweDA0YWEgfSwKKwkJeyAweDA2LCAweGExYWUgfSwKKwkJeyAweDA2LCAweGE4ZWUgfSwKKwkJeyAweDA2LCAweDgzNGUgfSwKKwkJeyAweDA2LCAweDA0ZWUgfSwKKwkJeyAweDA2LCAweDgzNGYgfSwKKwkJeyAweDA2LCAweDAwYWUgfSwKKwkJeyAweDA2LCAweGFiZTAgfSwKKwkJeyAweDA2LCAweDgzNGYgfSwKKwkJeyAweDA2LCAweDc4MDMgfSwKKwkJeyAweDA2LCAweDlmMTQgfSwKKwkJeyAweDA2LCAweGVlODMgfSwKKwkJeyAweDA2LCAweDRlMDUgfSwKKwkJeyAweDA2LCAweGQyNDAgfSwKKwkJeyAweDA2LCAweGQ2NTUgfSwKKwkJeyAweDA2LCAweDU0MDIgfSwKKwkJeyAweDA2LCAweDgxYzYgfSwKKwkJeyAweDA2LCAweGQyYTAgfSwKKwkJeyAweDA2LCAweGQ2YmEgfSwKKwkJeyAweDA2LCAweDAwMDIgfSwKKwkJeyAweDA2LCAweDgxYzYgfSwKKwkJeyAweDA2LCAweGZlZmQgfSwKKwkJeyAweDA2LCAweGZjMDUgfSwKKwkJeyAweDA2LCAweGY4ZTAgfSwKKwkJeyAweDA2LCAweGY4NjAgfSwKKwkJeyAweDA2LCAweGUxZjggfSwKKwkJeyAweDA2LCAweDYxNjggfSwKKwkJeyAweDA2LCAweDAyZTQgfSwKKwkJeyAweDA2LCAweGY4NjAgfSwKKwkJeyAweDA2LCAweGU1ZjggfSwKKwkJeyAweDA2LCAweDYxZTAgfSwKKwkJeyAweDA2LCAweGY4NDggfSwKKwkJeyAweDA2LCAweGUxZjggfSwKKwkJeyAweDA2LCAweDQ5NTggfSwKKwkJeyAweDA2LCAweDBmMWUgfSwKKwkJeyAweDA2LCAweDAyZTQgfSwKKwkJeyAweDA2LCAweGY4NDggfSwKKwkJeyAweDA2LCAweGU1ZjggfSwKKwkJeyAweDA2LCAweDQ5ZDAgfSwKKwkJeyAweDA2LCAweDAwMDIgfSwKKwkJeyAweDA2LCAweDgyMGEgfSwKKwkJeyAweDA2LCAweGJmODMgfSwKKwkJeyAweDA2LCAweDUwZWYgfSwKKwkJeyAweDA2LCAweDQ2ZGMgfSwKKwkJeyAweDA2LCAweDE5ZGQgfSwKKwkJeyAweDA2LCAweGQwMDEgfSwKKwkJeyAweDA2LCAweDAyODIgfSwKKwkJeyAweDA2LCAweDBhMDIgfSwKKwkJeyAweDA2LCAweDgyMjYgfSwKKwkJeyAweDA2LCAweGUwZjggfSwKKwkJeyAweDA2LCAweDYwZTEgfSwKKwkJeyAweDA2LCAweGY4NjEgfSwKKwkJeyAweDA2LCAweDU4ZmQgfSwKKwkJeyAweDA2LCAweGU0ZjggfSwKKwkJeyAweDA2LCAweDYwZTUgfSwKKwkJeyAweDA2LCAweGY4NjEgfSwKKwkJeyAweDA2LCAweGZjMDQgfSwKKwkJeyAweDA2LCAweGY5ZmEgfSwKKwkJeyAweDA2LCAweGZiYzYgfSwKKwkJeyAweDA2LCAweGJmZjggfSwKKwkJeyAweDA2LCAweDQwYmUgfSwKKwkJeyAweDA2LCAweDgzNTAgfSwKKwkJeyAweDA2LCAweGEwMDEgfSwKKwkJeyAweDA2LCAweDAxMDcgfSwKKwkJeyAweDA2LCAweDFiODkgfSwKKwkJeyAweDA2LCAweGNmZDIgfSwKKwkJeyAweDA2LCAweDA4ZWIgfSwKKwkJeyAweDA2LCAweGRiMTkgfSwKKwkJeyAweDA2LCAweGIyZmIgfSwKKwkJeyAweDA2LCAweGZmZmUgfSwKKwkJeyAweDA2LCAweGZkMDQgfSwKKwkJeyAweDA2LCAweGY4ZTAgfSwKKwkJeyAweDA2LCAweGY4NDggfSwKKwkJeyAweDA2LCAweGUxZjggfSwKKwkJeyAweDA2LCAweDQ5NjggfSwKKwkJeyAweDA2LCAweDA4ZTQgfSwKKwkJeyAweDA2LCAweGY4NDggfSwKKwkJeyAweDA2LCAweGU1ZjggfSwKKwkJeyAweDA2LCAweDQ5NTggfSwKKwkJeyAweDA2LCAweGY3ZTQgfSwKKwkJeyAweDA2LCAweGY4NDggfSwKKwkJeyAweDA2LCAweGU1ZjggfSwKKwkJeyAweDA2LCAweDQ5ZmMgfSwKKwkJeyAweDA2LCAweDA0NGQgfSwKKwkJeyAweDA2LCAweDIwMDAgfSwKKwkJeyAweDA2LCAweDAyNGUgfSwKKwkJeyAweDA2LCAweDIyMDAgfSwKKwkJeyAweDA2LCAweDAyNGQgfSwKKwkJeyAweDA2LCAweGRmZmYgfSwKKwkJeyAweDA2LCAweDAxNGUgfSwKKwkJeyAweDA2LCAweGRkZmYgfSwKKwkJeyAweDA2LCAweDAxMDAgfSwKKwkJeyAweDA1LCAweDgzZDggfSwKKwkJeyAweDA2LCAweDgwMDAgfSwKKwkJeyAweDAzLCAweGRjMDAgfSwKKwkJeyAweDA1LCAweGZmZjYgfSwKKwkJeyAweDA2LCAweDAwZmMgfSwKKwkJeyAweDFmLCAweDAwMDAgfSwKKworCQl7IDB4MWYsIDB4MDAwMCB9LAorCQl7IDB4MGQsIDB4Zjg4MCB9LAorCQl7IDB4MWYsIDB4MDAwMCB9CisJfTsKKworCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXRfMCwgQVJSQVlfU0laRShwaHlfcmVnX2luaXRfMCkpOworCisJaWYgKHJ0bDgxNjhkX2VmdXNlX3JlYWQoaW9hZGRyLCAweDAxKSA9PSAweGIxKSB7CisJCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0geworCQkJeyAweDFmLCAweDAwMDIgfSwKKwkJCXsgMHgwNSwgMHg2NjlhIH0sCisJCQl7IDB4MWYsIDB4MDAwNSB9LAorCQkJeyAweDA1LCAweDgzMzAgfSwKKwkJCXsgMHgwNiwgMHg2NjlhIH0sCisKKwkJCXsgMHgxZiwgMHgwMDAyIH0KKwkJfTsKKwkJaW50IHZhbDsKKworCQlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworCisJCXZhbCA9IG1kaW9fcmVhZChpb2FkZHIsIDB4MGQpOworCQlpZiAoKHZhbCAmIDB4MDBmZikgIT0gMHgwMDZjKSB7CisJCQl1MzIgc2V0W10gPSB7CisJCQkJMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LAorCQkJCTB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YworCQkJfTsKKwkJCWludCBpOworCisJCQltZGlvX3dyaXRlKGlvYWRkciwgMHgxZiwgMHgwMDAyKTsKKworCQkJdmFsICY9IDB4ZmYwMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNldCk7IGkrKykKKwkJCQltZGlvX3dyaXRlKGlvYWRkciwgMHgwZCwgdmFsIHwgc2V0W2ldKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0geworCQkJeyAweDFmLCAweDAwMDIgfSwKKwkJCXsgMHgwNSwgMHgyNjQyIH0sCisJCQl7IDB4MWYsIDB4MDAwNSB9LAorCQkJeyAweDA1LCAweDgzMzAgfSwKKwkJCXsgMHgwNiwgMHgyNjQyIH0KKwkJfTsKKworCQlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworCX0KKworCW1kaW9fd3JpdGUoaW9hZGRyLCAweDFmLCAweDAwMDIpOworCW1kaW9fcGx1c19taW51cyhpb2FkZHIsIDB4MDIsIDB4MDEwMCwgMHgwNjAwKTsKKwltZGlvX3BsdXNfbWludXMoaW9hZGRyLCAweDAzLCAweDAwMDAsIDB4ZTAwMCk7CisKKwltZGlvX3dyaXRlKGlvYWRkciwgMHgxZiwgMHgwMDAxKTsKKwltZGlvX3dyaXRlKGlvYWRkciwgMHgxNywgMHgwY2MwKTsKKworCW1kaW9fd3JpdGUoaW9hZGRyLCAweDFmLCAweDAwMDIpOworCW1kaW9fcGF0Y2goaW9hZGRyLCAweDBmLCAweDAwMTcpOworCisJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdF8xLCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdF8xKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjhkXzNfaHdfcGh5X2NvbmZpZyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKKwkJeyAweDFmLCAweDAwMDIgfSwKKwkJeyAweDEwLCAweDAwMDggfSwKKwkJeyAweDBkLCAweDAwNmMgfSwKKworCQl7IDB4MWYsIDB4MDAwMCB9LAorCQl7IDB4MGQsIDB4Zjg4MCB9LAorCisJCXsgMHgxZiwgMHgwMDAxIH0sCisJCXsgMHgxNywgMHgwY2MwIH0sCisKKwkJeyAweDFmLCAweDAwMDEgfSwKKwkJeyAweDBiLCAweGE0ZDggfSwKKwkJeyAweDA5LCAweDI4MWMgfSwKKwkJeyAweDA3LCAweDI4ODMgfSwKKwkJeyAweDBhLCAweDZiMzUgfSwKKwkJeyAweDFkLCAweDNkYTQgfSwKKwkJeyAweDFjLCAweGVmZmQgfSwKKwkJeyAweDE0LCAweDdmNTIgfSwKKwkJeyAweDE4LCAweDdmYzYgfSwKKwkJeyAweDA4LCAweDA2MDEgfSwKKwkJeyAweDA2LCAweDQwNjMgfSwKKwkJeyAweDEwLCAweGYwNzQgfSwKKwkJeyAweDFmLCAweDAwMDMgfSwKKwkJeyAweDEzLCAweDA3ODkgfSwKKwkJeyAweDEyLCAweGY0YmQgfSwKKwkJeyAweDFhLCAweDA0ZmQgfSwKKwkJeyAweDE0LCAweDg0YjAgfSwKKwkJeyAweDFmLCAweDAwMDAgfSwKKwkJeyAweDAwLCAweDkyMDAgfSwKKworCQl7IDB4MWYsIDB4MDAwNSB9LAorCQl7IDB4MDEsIDB4MDM0MCB9LAorCQl7IDB4MWYsIDB4MDAwMSB9LAorCQl7IDB4MDQsIDB4NDAwMCB9LAorCQl7IDB4MDMsIDB4MWQyMSB9LAorCQl7IDB4MDIsIDB4MGMzMiB9LAorCQl7IDB4MDEsIDB4MDIwMCB9LAorCQl7IDB4MDAsIDB4NTU1NCB9LAorCQl7IDB4MDQsIDB4NDgwMCB9LAorCQl7IDB4MDQsIDB4NDAwMCB9LAorCQl7IDB4MDQsIDB4ZjAwMCB9LAorCQl7IDB4MDMsIDB4ZGYwMSB9LAorCQl7IDB4MDIsIDB4ZGYyMCB9LAorCQl7IDB4MDEsIDB4MTAxYSB9LAorCQl7IDB4MDAsIDB4YTBmZiB9LAorCQl7IDB4MDQsIDB4ZjgwMCB9LAorCQl7IDB4MDQsIDB4ZjAwMCB9LAorCQl7IDB4MWYsIDB4MDAwMCB9LAorCisJCXsgMHgxZiwgMHgwMDA3IH0sCisJCXsgMHgxZSwgMHgwMDIzIH0sCisJCXsgMHgxNiwgMHgwMDAwIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0KKwl9OworCisJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdCwgQVJSQVlfU0laRShwaHlfcmVnX2luaXQpKTsKIH0KIAogc3RhdGljIHZvaWQgcnRsODEwMmVfaHdfcGh5X2NvbmZpZyh2b2lkIF9faW9tZW0gKmlvYWRkcikKQEAgLTE3OTIsNyArMjY2NCwxMyBAQAogCQlydGw4MTY4Y3BfMl9od19waHlfY29uZmlnKGlvYWRkcik7CiAJCWJyZWFrOwogCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yNToKLQkJcnRsODE2OGRfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOworCQlydGw4MTY4ZF8xX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI2OgorCQlydGw4MTY4ZF8yX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI3OgorCQlydGw4MTY4ZF8zX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjMyMiw2ICszMjAwLDE0IEBACiAJfQogCiAJcnRsODE2OV9pbml0X3BoeShkZXYsIHRwKTsKKworCS8qCisJICogUHJldGVuZCB3ZSBhcmUgdXNpbmcgVkxBTnM7IFRoaXMgYnlwYXNzZXMgYSBuYXN0eSBidWcgd2hlcmUKKwkgKiBJbnRlcnJ1cHRzIHN0b3AgZmxvd2luZyBvbiBoaWdoIGxvYWQgb24gODExMFNDZCBjb250cm9sbGVycy4KKwkgKi8KKwlpZiAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDUpCisJCVJUTF9XMTYoQ1BsdXNDbWQsIFJUTF9SMTYoQ1BsdXNDbWQpIHwgUnhWbGFuKTsKKwogCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmcGRldi0+ZGV2LCB0cC0+ZmVhdHVyZXMgJiBSVExfRkVBVFVSRV9XT0wpOwogCiBvdXQ6CkBAIC0yNDkzLDcgKzMzNzksNyBAQAogc3RhdGljIHZvaWQgcnRsX3NldF9yeF9tYXhfc2l6ZSh2b2lkIF9faW9tZW0gKmlvYWRkciwgdW5zaWduZWQgaW50IHJ4X2J1Zl9zeikKIHsKIAkvKiBMb3cgaHVydHMuIExldCdzIGRpc2FibGUgdGhlIGZpbHRlcmluZy4gKi8KLQlSVExfVzE2KFJ4TWF4U2l6ZSwgcnhfYnVmX3N6KTsKKwlSVExfVzE2KFJ4TWF4U2l6ZSwgcnhfYnVmX3N6ICsgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bDgxNjlfc2V0X21hZ2ljX3JlZyh2b2lkIF9faW9tZW0gKmlvYWRkciwgdW5zaWduZWQgbWFjX3ZlcnNpb24pCkBAIC0yODYzLDYgKzM3NDksOCBAQAogCWJyZWFrOwogCiAJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI1OgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yNjoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjc6CiAJCXJ0bF9od19zdGFydF84MTY4ZChpb2FkZHIsIHBkZXYpOwogCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEwMDAuYyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCmluZGV4IGVlMzY2YzUuLmM5YzcwYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZWZ4LmMgYi9kcml2ZXJzL25ldC9zZmMvZWZ4LmMKaW5kZXggMDdhN2U0Yi4uY2M0YjJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2VmeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9lZnguYwpAQCAtODg0LDEzICs4ODQsMTIgQEAKIAlpbnQgY291bnQ7CiAJaW50IGNwdTsKIAotCWlmICh1bmxpa2VseSghYWxsb2NfY3B1bWFza192YXIoJmNvcmVfbWFzaywgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKHVubGlrZWx5KCF6YWxsb2NfY3B1bWFza192YXIoJmNvcmVfbWFzaywgR0ZQX0tFUk5FTCkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJzZmM6IFJTUyBkaXNhYmxlZCBkdWUgdG8gYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JY3B1bWFza19jbGVhcihjb3JlX21hc2spOwogCWNvdW50ID0gMDsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjb3JlX21hc2spKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvcnguYyBiL2RyaXZlcnMvbmV0L3NmYy9yeC5jCmluZGV4IDAxZjk0MzIuLjk4YmZmNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9yeC5jCkBAIC00NDQsNyArNDQ0LDggQEAKICAqIHRoZSBhcHByb3ByaWF0ZSBMUk8gbWV0aG9kCiAgKi8KIHN0YXRpYyB2b2lkIGVmeF9yeF9wYWNrZXRfbHJvKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwKLQkJCSAgICAgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCisJCQkgICAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmLAorCQkJICAgICAgYm9vbCBjaGVja3N1bW1lZCkKIHsKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGkgPSAmY2hhbm5lbC0+bmFwaV9zdHI7CiAKQEAgLTQ2Niw3ICs0NjcsOCBAQAogCQlza2ItPmxlbiA9IHJ4X2J1Zi0+bGVuOwogCQlza2ItPmRhdGFfbGVuID0gcnhfYnVmLT5sZW47CiAJCXNrYi0+dHJ1ZXNpemUgKz0gcnhfYnVmLT5sZW47Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCXNrYi0+aXBfc3VtbWVkID0KKwkJCWNoZWNrc3VtbWVkID8gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgOiBDSEVDS1NVTV9OT05FOwogCiAJCW5hcGlfZ3JvX2ZyYWdzKG5hcGkpOwogCkBAIC00NzUsNiArNDc3LDcgQEAKIAkJcnhfYnVmLT5wYWdlID0gTlVMTDsKIAl9IGVsc2UgewogCQlFRlhfQlVHX09OX1BBUkFOT0lEKCFyeF9idWYtPnNrYik7CisJCUVGWF9CVUdfT05fUEFSQU5PSUQoIWNoZWNrc3VtbWVkKTsKIAogCQluYXBpX2dyb19yZWNlaXZlKG5hcGksIHJ4X2J1Zi0+c2tiKTsKIAkJcnhfYnVmLT5za2IgPSBOVUxMOwpAQCAtNTcwLDcgKzU3Myw3IEBACiAJfQogCiAJaWYgKGxpa2VseShjaGVja3N1bW1lZCB8fCByeF9idWYtPnBhZ2UpKSB7Ci0JCWVmeF9yeF9wYWNrZXRfbHJvKGNoYW5uZWwsIHJ4X2J1Zik7CisJCWVmeF9yeF9wYWNrZXRfbHJvKGNoYW5uZWwsIHJ4X2J1ZiwgY2hlY2tzdW1tZWQpOwogCQlnb3RvIGRvbmU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZ2lzZWVxLmMgYi9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKaW5kZXggZWNmMzI3OWYuLmY0ZGZkMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NnaXNlZXEuYworKysgYi9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKQEAgLTgyNiw3ICs4MjYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZ2lzZWVxX2RyaXZlciA9IHsKIAkucHJvYmUJPSBzZ2lzZWVxX3Byb2JlLAotCS5yZW1vdmUJPSBfX2RldmV4aXRfcChzZ2lzZWVxX3JlbW92ZSksCisJLnJlbW92ZQk9IF9fZXhpdF9wKHNnaXNlZXFfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJzZ2lzZWVxIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaF9ldGguYyBiL2RyaXZlcnMvbmV0L3NoX2V0aC5jCmluZGV4IGY0OWQwODAuLjUyOGI5MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NoX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3NoX2V0aC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNpbmNsdWRlICJzaF9ldGguaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzOTAwLmMgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwppbmRleCA5Nzk0OWQwLi5jMDcyZjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaXM5MDAuYworKysgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jIGIvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYwppbmRleCAzOGE1MDhiLi5iMjcxNTZlYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYwpAQCAtNzMsNiArNzMsNyBAQAogCiAvKiBJbmNsdWRlIGZpbGVzICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwppbmRleCA1NWJhZDQwLi44ZjU0MTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMzkzNSwxMSArMzkzNiwxNCBAQAogI2VuZGlmCiAKIAllcnIgPSAtRU5PTUVNOwotCWh3ID0ga3phbGxvYyhzaXplb2YoKmh3KSwgR0ZQX0tFUk5FTCk7CisJLyogc3BhY2UgZm9yIHNrZ2VAcGNpOjAwMDA6MDQ6MDAuMCAqLworCWh3ID0ga3phbGxvYyhzaXplb2YoKmh3KSArIHN0cmxlbihEUlZfTkFNRSAiQHBjaToiICkKKwkJICAgICArIHN0cmxlbihwY2lfbmFtZShwZGV2KSkgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWh3KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBzdHJ1Y3RcbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOwogCX0KKwlzcHJpbnRmKGh3LT5pcnFfbmFtZSwgRFJWX05BTUUgIkBwY2k6JXMiLCBwY2lfbmFtZShwZGV2KSk7CiAKIAlody0+cGRldiA9IHBkZXY7CiAJc3Bpbl9sb2NrX2luaXQoJmh3LT5od19sb2NrKTsKQEAgLTM5NzQsNyArMzk3OCw3IEBACiAJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKIAl9CiAKLQllcnIgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNrZ2VfaW50ciwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgaHcpOworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2tnZV9pbnRyLCBJUlFGX1NIQVJFRCwgaHctPmlycV9uYW1lLCBodyk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIHBkZXYtPmlycSk7CkBAIC0zOTgyLDE0ICszOTg2LDE3IEBACiAJfQogCXNrZ2Vfc2hvd19hZGRyKGRldik7CiAKLQlpZiAoaHctPnBvcnRzID4gMSAmJiAoZGV2MSA9IHNrZ2VfZGV2aW5pdChodywgMSwgdXNpbmdfZGFjKSkpIHsKLQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYxKSA9PSAwKQorCWlmIChody0+cG9ydHMgPiAxKSB7CisJCWRldjEgPSBza2dlX2RldmluaXQoaHcsIDEsIHVzaW5nX2RhYyk7CisJCWlmIChkZXYxICYmIHJlZ2lzdGVyX25ldGRldihkZXYxKSA9PSAwKQogCQkJc2tnZV9zaG93X2FkZHIoZGV2MSk7CiAJCWVsc2UgewogCQkJLyogRmFpbHVyZSB0byByZWdpc3RlciBzZWNvbmQgcG9ydCBuZWVkIG5vdCBiZSBmYXRhbCAqLwogCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInJlZ2lzdGVyIG9mIHNlY29uZCBwb3J0IGZhaWxlZFxuIik7CiAJCQlody0+ZGV2WzFdID0gTlVMTDsKLQkJCWZyZWVfbmV0ZGV2KGRldjEpOworCQkJaHctPnBvcnRzID0gMTsKKwkJCWlmIChkZXYxKQorCQkJCWZyZWVfbmV0ZGV2KGRldjEpOwogCQl9CiAJfQogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2dlLmggYi9kcml2ZXJzL25ldC9za2dlLmgKaW5kZXggMTdjYWNjYi4uODMxZGUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tnZS5oCisrKyBiL2RyaXZlcnMvbmV0L3NrZ2UuaApAQCAtMjQyMyw2ICsyNDIzLDggQEAKIAl1MTYJCSAgICAgcGh5X2FkZHI7CiAJc3BpbmxvY2tfdAkgICAgIHBoeV9sb2NrOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwaHlfdGFzazsKKworCWNoYXIJCSAgICAgaXJxX25hbWVbMF07IC8qIHNrZ2VAcGNpOjAwMDowNDowMC4wICovCiB9OwogCiBlbnVtIHBhdXNlX2NvbnRyb2wgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5jIGIvZHJpdmVycy9uZXQvc2t5Mi5jCmluZGV4IDE1MTQwZjkuLjZhMTBkN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NreTIuYworKysgYi9kcml2ZXJzL25ldC9za3kyLmMKQEAgLTE0OTcsNyArMTQ5Nyw2IEBACiAJaWYgKHJhbXNpemUgPiAwKSB7CiAJCXUzMiByeHNwYWNlOwogCi0JCWh3LT5mbGFncyB8PSBTS1kyX0hXX1JBTV9CVUZGRVI7CiAJCXByX2RlYnVnKFBGWCAiJXM6IHJhbSBidWZmZXIgJWRLXG4iLCBkZXYtPm5hbWUsIHJhbXNpemUpOwogCQlpZiAocmFtc2l6ZSA8IDE2KQogCQkJcnhzcGFjZSA9IHJhbXNpemUgLyAyOwpAQCAtMjkyNiw2ICsyOTI1LDkgQEAKIAkJCSsraHctPnBvcnRzOwogCX0KIAorCWlmIChza3kyX3JlYWQ4KGh3LCBCMl9FXzApKQorCQlody0+ZmxhZ3MgfD0gU0tZMl9IV19SQU1fQlVGRkVSOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ0ODUsMTMgKzQ0ODcsMTYgQEAKIAl3b2xfZGVmYXVsdCA9IGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpID8gV0FLRV9NQUdJQyA6IDA7CiAKIAllcnIgPSAtRU5PTUVNOwotCWh3ID0ga3phbGxvYyhzaXplb2YoKmh3KSwgR0ZQX0tFUk5FTCk7CisKKwlodyA9IGt6YWxsb2Moc2l6ZW9mKCpodykgKyBzdHJsZW4oRFJWX05BTUUgIkBwY2k6IikKKwkJICAgICArIHN0cmxlbihwY2lfbmFtZShwZGV2KSkgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWh3KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBzdHJ1Y3RcbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOwogCX0KIAogCWh3LT5wZGV2ID0gcGRldjsKKwlzcHJpbnRmKGh3LT5pcnFfbmFtZSwgRFJWX05BTUUgIkBwY2k6JXMiLCBwY2lfbmFtZShwZGV2KSk7CiAKIAlody0+cmVncyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIDB4NDAwMCk7CiAJaWYgKCFody0+cmVncykgewpAQCAtNDUzMywxMSArNDUzOCwxMyBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CiAJfQogCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwogCW5ldGlmX25hcGlfYWRkKGRldiwgJmh3LT5uYXBpLCBza3kyX3BvbGwsIE5BUElfV0VJR0hUKTsKIAogCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2t5Ml9pbnRyLAogCQkJICAoaHctPmZsYWdzICYgU0tZMl9IV19VU0VfTVNJKSA/IDAgOiBJUlFGX1NIQVJFRCwKLQkJCSAgZGV2LT5uYW1lLCBodyk7CisJCQkgIGh3LT5pcnFfbmFtZSwgaHcpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsIHBkZXYtPmlycSk7CiAJCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5oIGIvZHJpdmVycy9uZXQvc2t5Mi5oCmluZGV4IGUwZjIzYTEuLmVkNTQxMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NreTIuaAorKysgYi9kcml2ZXJzL25ldC9za3kyLmgKQEAgLTIwODUsNiArMjA4NSw4IEBACiAJc3RydWN0IHRpbWVyX2xpc3QgICAgd2F0Y2hkb2dfdGltZXI7CiAJc3RydWN0IHdvcmtfc3RydWN0ICAgcmVzdGFydF93b3JrOwogCXdhaXRfcXVldWVfaGVhZF90ICAgIG1zaV93YWl0OworCisJY2hhcgkJICAgICBpcnFfbmFtZVswXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNreTJfaXNfY29wcGVyKGNvbnN0IHN0cnVjdCBza3kyX2h3ICpodykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaXAuYyBiL2RyaXZlcnMvbmV0L3NsaXAuYwppbmRleCBlMTdjNTM1Li5mZTNjZWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbGlwLmMKKysrIGIvZHJpdmVycy9uZXQvc2xpcC5jCkBAIC02Nyw2ICs2Nyw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL0tjb25maWcgYi9kcml2ZXJzL25ldC9zdG1tYWMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVhYTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL0tjb25maWcKQEAgLTAsMCArMSw1MyBAQAorY29uZmlnIFNUTU1BQ19FVEgKKwl0cmlzdGF0ZSAiU1RNaWNyb2VsZWN0cm9uaWNzIDEwLzEwMC8xMDAwIEV0aGVybmV0IGRyaXZlciIKKwlzZWxlY3QgTUlJCisJc2VsZWN0IFBIWUxJQgorCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiBDUFVfU1VCVFlQRV9TVDQwCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgU1QgTUFDIDEwLzEwMC8xMDAwIG9uLWNoaXAgRXRoZXJuZXQKKwkgIGNvbnRyb2xsZXJzLiBTVCBFdGhlcm5ldCBJUHMgYXJlIGJ1aWx0IGFyb3VuZCBhIFN5bm9wc3lzIElQIENvcmUuCisKK2lmIFNUTU1BQ19FVEgKKworY29uZmlnIFNUTU1BQ19EQQorCWJvb2wgIlNUTU1BQyBETUEgYXJiaXRyYXRpb24gc2NoZW1lIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiwgcnggaGFzIHByaW9yaXR5IG92ZXIgVHggKG9ubHkgZm9yIEdpZ2EKKwkgIEV0aGVybmV0IGRldmljZSkuCisJICBCeSBkZWZhdWx0LCB0aGUgRE1BIGFyYml0cmF0aW9uIHNjaGVtZSBpcyBiYXNlZCBvbiBSb3VuZC1yb2JpbgorCSAgKHJ4OnR4IHByaW9yaXR5IGlzIDE6MSkuCisKK2NvbmZpZyBTVE1NQUNfRFVBTF9NQUMKKwlib29sICJTVE1NQUM6IGR1YWwgbWFjIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVmYXVsdCBuCisgICAgICAgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFNUTU1BQ19FVEggJiYgIVNUTU1BQ19USU1FUgorCWhlbHAKKwkgIFNvbWUgU1QgU29DcyAoZm9yIGV4YW1wbGUgdGhlIHN0eDcxNDEgYW5kIHN0eDcyMDBjMikgaGF2ZSB0d28KKwkgIEV0aGVybmV0IENvbnRyb2xsZXJzLiBUaGlzIG9wdGlvbiB0dXJucyBvbiB0aGUgc2Vjb25kIEV0aGVybmV0CisJICBkZXZpY2Ugb24gdGhpcyBraW5kIG9mIHBsYXRmb3Jtcy4KKworY29uZmlnIFNUTU1BQ19USU1FUgorCWJvb2wgIlNUTU1BQyBUaW1lciBvcHRpbWlzYXRpb24iCisJZGVmYXVsdCBuCisJaGVscAorCSAgVXNlIGFuIGV4dGVybmFsIHRpbWVyIGZvciBtaXRpZ2F0aW5nIHRoZSBudW1iZXIgb2YgbmV0d29yaworCSAgaW50ZXJydXB0cy4KKworY2hvaWNlCisgICAgICAgIHByb21wdCAiU2VsZWN0IFRpbWVyIGRldmljZSIKKyAgICAgICAgZGVwZW5kcyBvbiBTVE1NQUNfVElNRVIKKworY29uZmlnIFNUTU1BQ19UTVVfVElNRVIKKyAgICAgICAgYm9vbCAiVE1VIGNoYW5uZWwgMiIKKyAgICAgICAgZGVwZW5kcyBvbiBDUFVfU0g0CisJaGVscAorCitjb25maWcgU1RNTUFDX1JUQ19USU1FUgorICAgICAgICBib29sICJSZWFsIHRpbWUgY2xvY2siCisgICAgICAgIGRlcGVuZHMgb24gUlRDX0NMQVNTCisJaGVscAorCitlbmRjaG9pY2UKKworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bW1hYy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3N0bW1hYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQ3YTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorb2JqLSQoQ09ORklHX1NUTU1BQ19FVEgpICs9IHN0bW1hYy5vCitzdG1tYWMtJChDT05GSUdfU1RNTUFDX1RJTUVSKSArPSBzdG1tYWNfdGltZXIubworc3RtbWFjLW9ianM6PSBzdG1tYWNfbWFpbi5vIHN0bW1hY19ldGh0b29sLm8gc3RtbWFjX21kaW8ubyBcCisJCW1hYzEwMC5vICBnbWFjLm8gJChzdG1tYWMteSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bW1hYy9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3N0bW1hYy9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDllNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2NvbW1vbi5oCkBAIC0wLDAgKzEsMzMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBTVE1NQUMgQ29tbW9uIEhlYWRlciBGaWxlCisKKyAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIFNUTWljcm9lbGVjdHJvbmljcyBMdGQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkZXNjcy5oIgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRE1BIENSUyBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgTWFwcGluZworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBETUFfQlVTX01PREUJCTB4MDAwMDEwMDAJLyogQnVzIE1vZGUgKi8KKyNkZWZpbmUgRE1BX1hNVF9QT0xMX0RFTUFORAkweDAwMDAxMDA0CS8qIFRyYW5zbWl0IFBvbGwgRGVtYW5kICovCisjZGVmaW5lIERNQV9SQ1ZfUE9MTF9ERU1BTkQJMHgwMDAwMTAwOAkvKiBSZWNlaXZlZCBQb2xsIERlbWFuZCAqLworI2RlZmluZSBETUFfUkNWX0JBU0VfQUREUgkweDAwMDAxMDBjCS8qIFJlY2VpdmUgTGlzdCBCYXNlICovCisjZGVmaW5lIERNQV9UWF9CQVNFX0FERFIJMHgwMDAwMTAxMAkvKiBUcmFuc21pdCBMaXN0IEJhc2UgKi8KKyNkZWZpbmUgRE1BX1NUQVRVUwkJMHgwMDAwMTAxNAkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0NPTlRST0wJCTB4MDAwMDEwMTgJLyogQ3RybCAoT3BlcmF0aW9uYWwgTW9kZSkgKi8KKyNkZWZpbmUgRE1BX0lOVFJfRU5BCQkweDAwMDAxMDFjCS8qIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgRE1BX01JU1NFRF9GUkFNRV9DVFIJMHgwMDAwMTAyMAkvKiBNaXNzZWQgRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBETUFfQ1VSX1RYX0JVRl9BRERSCTB4MDAwMDEwNTAJLyogQ3VycmVudCBIb3N0IFR4IEJ1ZmZlciAqLworI2RlZmluZSBETUFfQ1VSX1JYX0JVRl9BRERSCTB4MDAwMDEwNTQJLyogQ3VycmVudCBIb3N0IFJ4IEJ1ZmZlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRE1BIENvbnRyb2wgcmVnaXN0ZXIgZGVmaW5lcworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERNQV9DT05UUk9MX1NUCQkweDAwMDAyMDAwCS8qIFN0YXJ0L1N0b3AgVHJhbnNtaXNzaW9uICovCisjZGVmaW5lIERNQV9DT05UUk9MX1NSCQkweDAwMDAwMDAyCS8qIFN0YXJ0L1N0b3AgUmVjZWl2ZSAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRE1BIEludGVycnVwdCBFbmFibGUgcmVnaXN0ZXIgZGVmaW5lcworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKiBOT1JNQUwgSU5URVJSVVBUICoqKiovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9OSUUgMHgwMDAxMDAwMAkvKiBOb3JtYWwgU3VtbWFyeSAqLworI2RlZmluZSBETUFfSU5UUl9FTkFfVElFIDB4MDAwMDAwMDEJLyogVHJhbnNtaXQgSW50ZXJydXB0ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9UVUUgMHgwMDAwMDAwNAkvKiBUcmFuc21pdCBCdWZmZXIgVW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgRE1BX0lOVFJfRU5BX1JJRSAweDAwMDAwMDQwCS8qIFJlY2VpdmUgSW50ZXJydXB0ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9FUkUgMHgwMDAwNDAwMAkvKiBFYXJseSBSZWNlaXZlICovCisKKyNkZWZpbmUgRE1BX0lOVFJfTk9STUFMCShETUFfSU5UUl9FTkFfTklFIHwgRE1BX0lOVFJfRU5BX1JJRSB8IFwKKwkJCURNQV9JTlRSX0VOQV9USUUpCisKKy8qKioqIEFCTk9STUFMIElOVEVSUlVQVCAqKioqLworI2RlZmluZSBETUFfSU5UUl9FTkFfQUlFIDB4MDAwMDgwMDAJLyogQWJub3JtYWwgU3VtbWFyeSAqLworI2RlZmluZSBETUFfSU5UUl9FTkFfRkJFIDB4MDAwMDIwMDAJLyogRmF0YWwgQnVzIEVycm9yICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9FVEUgMHgwMDAwMDQwMAkvKiBFYXJseSBUcmFuc21pdCAqLworI2RlZmluZSBETUFfSU5UUl9FTkFfUldFIDB4MDAwMDAyMDAJLyogUmVjZWl2ZSBXYXRjaGRvZyAqLworI2RlZmluZSBETUFfSU5UUl9FTkFfUlNFIDB4MDAwMDAxMDAJLyogUmVjZWl2ZSBTdG9wcGVkICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9SVUUgMHgwMDAwMDA4MAkvKiBSZWNlaXZlIEJ1ZmZlciBVbmF2YWlsYWJsZSAqLworI2RlZmluZSBETUFfSU5UUl9FTkFfVU5FIDB4MDAwMDAwMjAJLyogVHggVW5kZXJmbG93ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9PVkUgMHgwMDAwMDAxMAkvKiBSZWNlaXZlIE92ZXJmbG93ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9USkUgMHgwMDAwMDAwOAkvKiBUcmFuc21pdCBKYWJiZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfRU5BX1RTRSAweDAwMDAwMDAyCS8qIFRyYW5zbWl0IFN0b3BwZWQgKi8KKworI2RlZmluZSBETUFfSU5UUl9BQk5PUk1BTAkoRE1BX0lOVFJfRU5BX0FJRSB8IERNQV9JTlRSX0VOQV9GQkUgfCBcCisJCQkJRE1BX0lOVFJfRU5BX1VORSkKKworLyogRE1BIGRlZmF1bHQgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgRE1BX0lOVFJfREVGQVVMVF9NQVNLCShETUFfSU5UUl9OT1JNQUwgfCBETUFfSU5UUl9BQk5PUk1BTCkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIERNQSBTdGF0dXMgcmVnaXN0ZXIgZGVmaW5lcworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19HUEkJCTB4MTAwMDAwMDAJLyogUE1UIGludGVycnVwdCAqLworI2RlZmluZSBETUFfU1RBVFVTX0dNSQkJMHgwODAwMDAwMAkvKiBNTUMgaW50ZXJydXB0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfR0xJCQkweDA0MDAwMDAwCS8qIEdNQUMgTGluZSBpbnRlcmZhY2UgaW50LiAqLworI2RlZmluZSBETUFfU1RBVFVTX0dNSQkJMHgwODAwMDAwMAorI2RlZmluZSBETUFfU1RBVFVTX0dMSQkJMHgwNDAwMDAwMAorI2RlZmluZSBETUFfU1RBVFVTX0VCX01BU0sJMHgwMDM4MDAwMAkvKiBFcnJvciBCaXRzIE1hc2sgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19FQl9UWF9BQk9SVAkweDAwMDgwMDAwCS8qIEVycm9yIEJpdHMgLSBUWCBBYm9ydCAqLworI2RlZmluZSBETUFfU1RBVFVTX0VCX1JYX0FCT1JUCTB4MDAxMDAwMDAJLyogRXJyb3IgQml0cyAtIFJYIEFib3J0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfVFNfTUFTSwkweDAwNzAwMDAwCS8qIFRyYW5zbWl0IFByb2Nlc3MgU3RhdGUgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19UU19TSElGVAkyMAorI2RlZmluZSBETUFfU1RBVFVTX1JTX01BU0sJMHgwMDBlMDAwMAkvKiBSZWNlaXZlIFByb2Nlc3MgU3RhdGUgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19SU19TSElGVAkxNworI2RlZmluZSBETUFfU1RBVFVTX05JUwkweDAwMDEwMDAwCS8qIE5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSAqLworI2RlZmluZSBETUFfU1RBVFVTX0FJUwkweDAwMDA4MDAwCS8qIEFibm9ybWFsIEludGVycnVwdCBTdW1tYXJ5ICovCisjZGVmaW5lIERNQV9TVEFUVVNfRVJJCTB4MDAwMDQwMDAJLyogRWFybHkgUmVjZWl2ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19GQkkJMHgwMDAwMjAwMAkvKiBGYXRhbCBCdXMgRXJyb3IgSW50ZXJydXB0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfRVRJCTB4MDAwMDA0MDAJLyogRWFybHkgVHJhbnNtaXQgSW50ZXJydXB0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfUldUCTB4MDAwMDAyMDAJLyogUmVjZWl2ZSBXYXRjaGRvZyBUaW1lb3V0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfUlBTCTB4MDAwMDAxMDAJLyogUmVjZWl2ZSBQcm9jZXNzIFN0b3BwZWQgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19SVQkweDAwMDAwMDgwCS8qIFJlY2VpdmUgQnVmZmVyIFVuYXZhaWxhYmxlICovCisjZGVmaW5lIERNQV9TVEFUVVNfUkkJMHgwMDAwMDA0MAkvKiBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBETUFfU1RBVFVTX1VORgkweDAwMDAwMDIwCS8qIFRyYW5zbWl0IFVuZGVyZmxvdyAqLworI2RlZmluZSBETUFfU1RBVFVTX09WRgkweDAwMDAwMDEwCS8qIFJlY2VpdmUgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19USlQJMHgwMDAwMDAwOAkvKiBUcmFuc21pdCBKYWJiZXIgVGltZW91dCAqLworI2RlZmluZSBETUFfU1RBVFVTX1RVCTB4MDAwMDAwMDQJLyogVHJhbnNtaXQgQnVmZmVyIFVuYXZhaWxhYmxlICovCisjZGVmaW5lIERNQV9TVEFUVVNfVFBTCTB4MDAwMDAwMDIJLyogVHJhbnNtaXQgUHJvY2VzcyBTdG9wcGVkICovCisjZGVmaW5lIERNQV9TVEFUVVNfVEkJMHgwMDAwMDAwMQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKworLyogT3RoZXIgZGVmaW5lcyAqLworI2RlZmluZSBIQVNIX1RBQkxFX1NJWkUgNjQKKyNkZWZpbmUgUEFVU0VfVElNRSAweDIwMAorCisvKiBGbG93IENvbnRyb2wgZGVmaW5lcyAqLworI2RlZmluZSBGTE9XX09GRgkwCisjZGVmaW5lIEZMT1dfUlgJCTEKKyNkZWZpbmUgRkxPV19UWAkJMgorI2RlZmluZSBGTE9XX0FVVE8JKEZMT1dfVFggfCBGTE9XX1JYKQorCisvKiBETUEgU1RPUkUtQU5ELUZPUldBUkQgT3BlcmF0aW9uIE1vZGUgKi8KKyNkZWZpbmUgU0ZfRE1BX01PREUgMQorCisjZGVmaW5lIEhXX0NTVU0gMQorI2RlZmluZSBOT19IV19DU1VNIDAKKworLyogR01BQyBUWCBGSUZPIGlzIDhLLCBSeCBGSUZPIGlzIDE2SyAqLworI2RlZmluZSBCVUZfU0laRV8xNktpQiAxNjM4NAorI2RlZmluZSBCVUZfU0laRV84S2lCIDgxOTIKKyNkZWZpbmUgQlVGX1NJWkVfNEtpQiA0MDk2CisjZGVmaW5lIEJVRl9TSVpFXzJLaUIgMjA0OAorCisvKiBQb3dlciBEb3duIGFuZCBXT0wgKi8KKyNkZWZpbmUgUE1UX05PVF9TVVBQT1JURUQgMAorI2RlZmluZSBQTVRfU1VQUE9SVEVEIDEKKworLyogQ29tbW9uIE1BQyBkZWZpbmVzICovCisjZGVmaW5lIE1BQ19DVFJMX1JFRwkJMHgwMDAwMDAwMAkvKiBNQUMgQ29udHJvbCAqLworI2RlZmluZSBNQUNfRU5BQkxFX1RYCQkweDAwMDAwMDA4CS8qIFRyYW5zbWl0dGVyIEVuYWJsZSAqLworI2RlZmluZSBNQUNfUk5BQkxFX1JYCQkweDAwMDAwMDA0CS8qIFJlY2VpdmVyIEVuYWJsZSAqLworCisvKiBNQUMgTWFuYWdlbWVudCBDb3VudGVycyByZWdpc3RlciAqLworI2RlZmluZSBNTUNfQ09OVFJPTAkJMHgwMDAwMDEwMAkvKiBNTUMgQ29udHJvbCAqLworI2RlZmluZSBNTUNfSElHSF9JTlRSCQkweDAwMDAwMTA0CS8qIE1NQyBIaWdoIEludGVycnVwdCAqLworI2RlZmluZSBNTUNfTE9XX0lOVFIJCTB4MDAwMDAxMDgJLyogTU1DIExvdyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTU1DX0hJR0hfSU5UUl9NQVNLCTB4MDAwMDAxMGMJLyogTU1DIEhpZ2ggSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgTU1DX0xPV19JTlRSX01BU0sJMHgwMDAwMDExMAkvKiBNTUMgTG93IEludGVycnVwdCBNYXNrICovCisKKyNkZWZpbmUgTU1DX0NPTlRST0xfTUFYX0ZSTV9NQVNLCTB4MDAwM2ZmOAkvKiBNYXhpbXVtIEZyYW1lIFNpemUgKi8KKyNkZWZpbmUgTU1DX0NPTlRST0xfTUFYX0ZSTV9TSElGVAkzCisjZGVmaW5lIE1NQ19DT05UUk9MX01BWF9GUkFNRQkJMHg3RkYKKworc3RydWN0IHN0bW1hY19leHRyYV9zdGF0cyB7CisJLyogVHJhbnNtaXQgZXJyb3JzICovCisJdW5zaWduZWQgbG9uZyB0eF91bmRlcmZsb3cgX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXVuc2lnbmVkIGxvbmcgdHhfY2FycmllcjsKKwl1bnNpZ25lZCBsb25nIHR4X2xvc3NjYXJyaWVyOworCXVuc2lnbmVkIGxvbmcgdHhfaGVhcnRiZWF0OworCXVuc2lnbmVkIGxvbmcgdHhfZGVmZXJyZWQ7CisJdW5zaWduZWQgbG9uZyB0eF92bGFuOworCXVuc2lnbmVkIGxvbmcgdHhfamFiYmVyOworCXVuc2lnbmVkIGxvbmcgdHhfZnJhbWVfZmx1c2hlZDsKKwl1bnNpZ25lZCBsb25nIHR4X3BheWxvYWRfZXJyb3I7CisJdW5zaWduZWQgbG9uZyB0eF9pcF9oZWFkZXJfZXJyb3I7CisJLyogUmVjZWl2ZSBlcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Rlc2M7CisJdW5zaWduZWQgbG9uZyByeF9wYXJ0aWFsOworCXVuc2lnbmVkIGxvbmcgcnhfcnVudDsKKwl1bnNpZ25lZCBsb25nIHJ4X3Rvb2xvbmc7CisJdW5zaWduZWQgbG9uZyByeF9jb2xsaXNpb247CisJdW5zaWduZWQgbG9uZyByeF9jcmM7CisJdW5zaWduZWQgbG9uZyByeF9sZW5naHQ7CisJdW5zaWduZWQgbG9uZyByeF9taWk7CisJdW5zaWduZWQgbG9uZyByeF9tdWx0aWNhc3Q7CisJdW5zaWduZWQgbG9uZyByeF9nbWFjX292ZXJmbG93OworCXVuc2lnbmVkIGxvbmcgcnhfd2F0Y2hkb2c7CisJdW5zaWduZWQgbG9uZyBkYV9yeF9maWx0ZXJfZmFpbDsKKwl1bnNpZ25lZCBsb25nIHNhX3J4X2ZpbHRlcl9mYWlsOworCXVuc2lnbmVkIGxvbmcgcnhfbWlzc2VkX2NudHI7CisJdW5zaWduZWQgbG9uZyByeF9vdmVyZmxvd19jbnRyOworCXVuc2lnbmVkIGxvbmcgcnhfdmxhbjsKKwkvKiBUeC9SeCBJUlEgZXJyb3JzICovCisJdW5zaWduZWQgbG9uZyB0eF91bmRlZmxvd19pcnE7CisJdW5zaWduZWQgbG9uZyB0eF9wcm9jZXNzX3N0b3BwZWRfaXJxOworCXVuc2lnbmVkIGxvbmcgdHhfamFiYmVyX2lycTsKKwl1bnNpZ25lZCBsb25nIHJ4X292ZXJmbG93X2lycTsKKwl1bnNpZ25lZCBsb25nIHJ4X2J1Zl91bmF2X2lycTsKKwl1bnNpZ25lZCBsb25nIHJ4X3Byb2Nlc3Nfc3RvcHBlZF9pcnE7CisJdW5zaWduZWQgbG9uZyByeF93YXRjaGRvZ19pcnE7CisJdW5zaWduZWQgbG9uZyB0eF9lYXJseV9pcnE7CisJdW5zaWduZWQgbG9uZyBmYXRhbF9idXNfZXJyb3JfaXJxOworCS8qIEV4dHJhIGluZm8gKi8KKwl1bnNpZ25lZCBsb25nIHRocmVzaG9sZDsKKwl1bnNpZ25lZCBsb25nIHR4X3BrdF9uOworCXVuc2lnbmVkIGxvbmcgcnhfcGt0X247CisJdW5zaWduZWQgbG9uZyBwb2xsX247CisJdW5zaWduZWQgbG9uZyBzY2hlZF90aW1lcl9uOworCXVuc2lnbmVkIGxvbmcgbm9ybWFsX2lycV9uOworfTsKKworLyogR01BQyBjb3JlIGNhbiBjb21wdXRlIHRoZSBjaGVja3N1bXMgaW4gSFcuICovCitlbnVtIHJ4X2ZyYW1lX3N0YXR1cyB7CisJZ29vZF9mcmFtZSA9IDAsCisJZGlzY2FyZF9mcmFtZSA9IDEsCisJY3N1bV9ub25lID0gMiwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG1tYWNfc2V0X21hY19hZGRyKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1OCBhZGRyWzZdLAorCQkJIHVuc2lnbmVkIGludCBoaWdoLCB1bnNpZ25lZCBpbnQgbG93KQoreworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKworCWRhdGEgPSAoYWRkcls1XSA8PCA4KSB8IGFkZHJbNF07CisJd3JpdGVsKGRhdGEsIGlvYWRkciArIGhpZ2gpOworCWRhdGEgPSAoYWRkclszXSA8PCAyNCkgfCAoYWRkclsyXSA8PCAxNikgfCAoYWRkclsxXSA8PCA4KSB8IGFkZHJbMF07CisJd3JpdGVsKGRhdGEsIGlvYWRkciArIGxvdyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG1tYWNfZ2V0X21hY19hZGRyKHVuc2lnbmVkIGxvbmcgaW9hZGRyLAorCQkJCXVuc2lnbmVkIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGludCBoaWdoLAorCQkJCXVuc2lnbmVkIGludCBsb3cpCit7CisJdW5zaWduZWQgaW50IGhpX2FkZHIsIGxvX2FkZHI7CisKKwkvKiBSZWFkIHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBoYXJkd2FyZSAqLworCWhpX2FkZHIgPSByZWFkbChpb2FkZHIgKyBoaWdoKTsKKwlsb19hZGRyID0gcmVhZGwoaW9hZGRyICsgbG93KTsKKworCS8qIEV4dHJhY3QgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIGhpZ2ggYW5kIGxvdyB3b3JkcyAqLworCWFkZHJbMF0gPSBsb19hZGRyICYgMHhmZjsKKwlhZGRyWzFdID0gKGxvX2FkZHIgPj4gOCkgJiAweGZmOworCWFkZHJbMl0gPSAobG9fYWRkciA+PiAxNikgJiAweGZmOworCWFkZHJbM10gPSAobG9fYWRkciA+PiAyNCkgJiAweGZmOworCWFkZHJbNF0gPSBoaV9hZGRyICYgMHhmZjsKKwlhZGRyWzVdID0gKGhpX2FkZHIgPj4gOCkgJiAweGZmOworCisJcmV0dXJuOworfQorCitzdHJ1Y3Qgc3RtbWFjX29wcyB7CisJLyogTUFDIGNvcmUgaW5pdGlhbGl6YXRpb24gKi8KKwl2b2lkICgqY29yZV9pbml0KSAodW5zaWduZWQgbG9uZyBpb2FkZHIpIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwkvKiBETUEgY29yZSBpbml0aWFsaXphdGlvbiAqLworCWludCAoKmRtYV9pbml0KSAodW5zaWduZWQgbG9uZyBpb2FkZHIsIGludCBwYmwsIHUzMiBkbWFfdHgsIHUzMiBkbWFfcngpOworCS8qIER1bXAgTUFDIHJlZ2lzdGVycyAqLworCXZvaWQgKCpkdW1wX21hY19yZWdzKSAodW5zaWduZWQgbG9uZyBpb2FkZHIpOworCS8qIER1bXAgRE1BIHJlZ2lzdGVycyAqLworCXZvaWQgKCpkdW1wX2RtYV9yZWdzKSAodW5zaWduZWQgbG9uZyBpb2FkZHIpOworCS8qIFNldCB0eC9yeCB0aHJlc2hvbGQgaW4gdGhlIGNzcjYgcmVnaXN0ZXIKKwkgKiBBbiBpbnZhbGlkIHZhbHVlIGVuYWJsZXMgdGhlIHN0b3JlLWFuZC1mb3J3YXJkIG1vZGUgKi8KKwl2b2lkICgqZG1hX21vZGUpICh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IHR4bW9kZSwgaW50IHJ4bW9kZSk7CisJLyogVG8gdHJhY2sgZXh0cmEgc3RhdGlzdGljIChpZiBzdXBwb3J0ZWQpICovCisJdm9pZCAoKmRtYV9kaWFnbm9zdGljX2ZyKSAodm9pZCAqZGF0YSwgc3RydWN0IHN0bW1hY19leHRyYV9zdGF0cyAqeCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGlvYWRkcik7CisJLyogUlggZGVzY3JpcHRvciByaW5nIGluaXRpYWxpemF0aW9uICovCisJdm9pZCAoKmluaXRfcnhfZGVzYykgKHN0cnVjdCBkbWFfZGVzYyAqcCwgdW5zaWduZWQgaW50IHJpbmdfc2l6ZSwKKwkJCQlpbnQgZGlzYWJsZV9yeF9pYyk7CisJLyogVFggZGVzY3JpcHRvciByaW5nIGluaXRpYWxpemF0aW9uICovCisJdm9pZCAoKmluaXRfdHhfZGVzYykgKHN0cnVjdCBkbWFfZGVzYyAqcCwgdW5zaWduZWQgaW50IHJpbmdfc2l6ZSk7CisKKwkvKiBJbnZva2VkIGJ5IHRoZSB4bWl0IGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIHR4IGRlc2NyaXB0b3IgKi8KKwl2b2lkICgqcHJlcGFyZV90eF9kZXNjKSAoc3RydWN0IGRtYV9kZXNjICpwLCBpbnQgaXNfZnMsIGludCBsZW4sCisJCQkJIGludCBjc3VtX2ZsYWcpOworCS8qIFNldC9nZXQgdGhlIG93bmVyIG9mIHRoZSBkZXNjcmlwdG9yICovCisJdm9pZCAoKnNldF90eF9vd25lcikgKHN0cnVjdCBkbWFfZGVzYyAqcCk7CisJaW50ICgqZ2V0X3R4X293bmVyKSAoc3RydWN0IGRtYV9kZXNjICpwKTsKKwkvKiBJbnZva2VkIGJ5IHRoZSB4bWl0IGZ1bmN0aW9uIHRvIGNsb3NlIHRoZSB0eCBkZXNjcmlwdG9yICovCisJdm9pZCAoKmNsb3NlX3R4X2Rlc2MpIChzdHJ1Y3QgZG1hX2Rlc2MgKnApOworCS8qIENsZWFuIHRoZSB0eCBkZXNjcmlwdG9yIGFzIHNvb24gYXMgdGhlIHR4IGlycSBpcyByZWNlaXZlZCAqLworCXZvaWQgKCpyZWxlYXNlX3R4X2Rlc2MpIChzdHJ1Y3QgZG1hX2Rlc2MgKnApOworCS8qIENsZWFyIGludGVycnVwdCBvbiB0eCBmcmFtZSBjb21wbGV0aW9uLiBXaGVuIHRoaXMgYml0IGlzCisJICogc2V0IGFuIGludGVycnVwdCBoYXBwZW5zIGFzIHNvb24gYXMgdGhlIGZyYW1lIGlzIHRyYW5zbWl0dGVkICovCisJdm9pZCAoKmNsZWFyX3R4X2ljKSAoc3RydWN0IGRtYV9kZXNjICpwKTsKKwkvKiBMYXN0IHR4IHNlZ21lbnQgcmVwb3J0cyB0aGUgdHJhbnNtaXQgc3RhdHVzICovCisJaW50ICgqZ2V0X3R4X2xzKSAoc3RydWN0IGRtYV9kZXNjICpwKTsKKwkvKiBSZXR1cm4gdGhlIHRyYW5zbWl0IHN0YXR1cyBsb29raW5nIGF0IHRoZSBUREVTMSAqLworCWludCAoKnR4X3N0YXR1cykgKHZvaWQgKmRhdGEsIHN0cnVjdCBzdG1tYWNfZXh0cmFfc3RhdHMgKngsCisJCQkgIHN0cnVjdCBkbWFfZGVzYyAqcCwgdW5zaWduZWQgbG9uZyBpb2FkZHIpOworCS8qIEdldCB0aGUgYnVmZmVyIHNpemUgZnJvbSB0aGUgZGVzY3JpcHRvciAqLworCWludCAoKmdldF90eF9sZW4pIChzdHJ1Y3QgZG1hX2Rlc2MgKnApOworCS8qIEhhbmRsZSBleHRyYSBldmVudHMgb24gc3BlY2lmaWMgaW50ZXJydXB0cyBodyBkZXBlbmRlbnQgKi8KKwl2b2lkICgqaG9zdF9pcnFfc3RhdHVzKSAodW5zaWduZWQgbG9uZyBpb2FkZHIpOworCWludCAoKmdldF9yeF9vd25lcikgKHN0cnVjdCBkbWFfZGVzYyAqcCk7CisJdm9pZCAoKnNldF9yeF9vd25lcikgKHN0cnVjdCBkbWFfZGVzYyAqcCk7CisJLyogR2V0IHRoZSByZWNlaXZlIGZyYW1lIHNpemUgKi8KKwlpbnQgKCpnZXRfcnhfZnJhbWVfbGVuKSAoc3RydWN0IGRtYV9kZXNjICpwKTsKKwkvKiBSZXR1cm4gdGhlIHJlY2VwdGlvbiBzdGF0dXMgbG9va2luZyBhdCB0aGUgUkRFUzEgKi8KKwlpbnQgKCpyeF9zdGF0dXMpICh2b2lkICpkYXRhLCBzdHJ1Y3Qgc3RtbWFjX2V4dHJhX3N0YXRzICp4LAorCQkJICBzdHJ1Y3QgZG1hX2Rlc2MgKnApOworCS8qIE11bHRpY2FzdCBmaWx0ZXIgc2V0dGluZyAqLworCXZvaWQgKCpzZXRfZmlsdGVyKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJLyogRmxvdyBjb250cm9sIHNldHRpbmcgKi8KKwl2b2lkICgqZmxvd19jdHJsKSAodW5zaWduZWQgbG9uZyBpb2FkZHIsIHVuc2lnbmVkIGludCBkdXBsZXgsCisJCQkgICB1bnNpZ25lZCBpbnQgZmMsIHVuc2lnbmVkIGludCBwYXVzZV90aW1lKTsKKwkvKiBTZXQgcG93ZXIgbWFuYWdlbWVudCBtb2RlIChlLmcuIG1hZ2ljIGZyYW1lKSAqLworCXZvaWQgKCpwbXQpICh1bnNpZ25lZCBsb25nIGlvYWRkciwgdW5zaWduZWQgbG9uZyBtb2RlKTsKKwkvKiBTZXQvR2V0IFVuaWNhc3QgTUFDIGFkZHJlc3NlcyAqLworCXZvaWQgKCpzZXRfdW1hY19hZGRyKSAodW5zaWduZWQgbG9uZyBpb2FkZHIsIHVuc2lnbmVkIGNoYXIgKmFkZHIsCisJCQkgICAgIHVuc2lnbmVkIGludCByZWdfbik7CisJdm9pZCAoKmdldF91bWFjX2FkZHIpICh1bnNpZ25lZCBsb25nIGlvYWRkciwgdW5zaWduZWQgY2hhciAqYWRkciwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlZ19uKTsKK307CisKK3N0cnVjdCBtYWNfbGluayB7CisJaW50IHBvcnQ7CisJaW50IGR1cGxleDsKKwlpbnQgc3BlZWQ7Cit9OworCitzdHJ1Y3QgbWlpX3JlZ3MgeworCXVuc2lnbmVkIGludCBhZGRyOwkvKiBNSUkgQWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBkYXRhOwkvKiBNSUkgRGF0YSAqLworfTsKKworc3RydWN0IGh3X2NhcCB7CisJdW5zaWduZWQgaW50IHZlcnNpb247CS8qIENvcmUgVmVyc2lvbiByZWdpc3RlciAoR01BQykgKi8KKwl1bnNpZ25lZCBpbnQgcG10OwkvKiBQb3dlci1Eb3duIG1vZGUgKEdNQUMpICovCisJc3RydWN0IG1hY19saW5rIGxpbms7CisJc3RydWN0IG1paV9yZWdzIG1paTsKK307CisKK3N0cnVjdCBtYWNfZGV2aWNlX2luZm8geworCXN0cnVjdCBod19jYXAgaHc7CisJc3RydWN0IHN0bW1hY19vcHMgKm9wczsKK307CisKK3N0cnVjdCBtYWNfZGV2aWNlX2luZm8gKmdtYWNfc2V0dXAodW5zaWduZWQgbG9uZyBhZGRyKTsKK3N0cnVjdCBtYWNfZGV2aWNlX2luZm8gKm1hYzEwMF9zZXR1cCh1bnNpZ25lZCBsb25nIGFkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL2Rlc2NzLmggYi9kcml2ZXJzL25ldC9zdG1tYWMvZGVzY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJhMGIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2Rlc2NzLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEhlYWRlciBGaWxlIHRvIGRlc2NyaWJlIHRoZSBETUEgZGVzY3JpcHRvcnMKKyAgVXNlIGVuaGFuY2VkIGRlc2NyaXB0b3JzIGluIGNhc2Ugb2YgR01BQyBDb3Jlcy4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZG1hX2Rlc2MgeworCS8qIFJlY2VpdmUgZGVzY3JpcHRvciAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIFJERVMwICovCisJCQl1MzIgcmVzZXJ2ZWQxOjE7CisJCQl1MzIgY3JjX2Vycm9yOjE7CisJCQl1MzIgZHJpYmJsaW5nOjE7CisJCQl1MzIgbWlpX2Vycm9yOjE7CisJCQl1MzIgcmVjZWl2ZV93YXRjaGRvZzoxOworCQkJdTMyIGZyYW1lX3R5cGU6MTsKKwkJCXUzMiBjb2xsaXNpb246MTsKKwkJCXUzMiBmcmFtZV90b29fbG9uZzoxOworCQkJdTMyIGxhc3RfZGVzY3JpcHRvcjoxOworCQkJdTMyIGZpcnN0X2Rlc2NyaXB0b3I6MTsKKwkJCXUzMiBtdWx0aWNhc3RfZnJhbWU6MTsKKwkJCXUzMiBydW5fZnJhbWU6MTsKKwkJCXUzMiBsZW5ndGhfZXJyb3I6MTsKKwkJCXUzMiBwYXJ0aWFsX2ZyYW1lX2Vycm9yOjE7CisJCQl1MzIgZGVzY3JpcHRvcl9lcnJvcjoxOworCQkJdTMyIGVycm9yX3N1bW1hcnk6MTsKKwkJCXUzMiBmcmFtZV9sZW5ndGg6MTQ7CisJCQl1MzIgZmlsdGVyaW5nX2ZhaWw6MTsKKwkJCXUzMiBvd246MTsKKwkJCS8qIFJERVMxICovCisJCQl1MzIgYnVmZmVyMV9zaXplOjExOworCQkJdTMyIGJ1ZmZlcjJfc2l6ZToxMTsKKwkJCXUzMiByZXNlcnZlZDI6MjsKKwkJCXUzMiBzZWNvbmRfYWRkcmVzc19jaGFpbmVkOjE7CisJCQl1MzIgZW5kX3Jpbmc6MTsKKwkJCXUzMiByZXNlcnZlZDM6NTsKKwkJCXUzMiBkaXNhYmxlX2ljOjE7CisJCX0gcng7CisJCXN0cnVjdCB7CisJCQkvKiBSREVTMCAqLworCQkJdTMyIHBheWxvYWRfY3N1bV9lcnJvcjoxOworCQkJdTMyIGNyY19lcnJvcjoxOworCQkJdTMyIGRyaWJibGluZzoxOworCQkJdTMyIGVycm9yX2dtaWk6MTsKKwkJCXUzMiByZWNlaXZlX3dhdGNoZG9nOjE7CisJCQl1MzIgZnJhbWVfdHlwZToxOworCQkJdTMyIGxhdGVfY29sbGlzaW9uOjE7CisJCQl1MzIgaXBjX2NzdW1fZXJyb3I6MTsKKwkJCXUzMiBsYXN0X2Rlc2NyaXB0b3I6MTsKKwkJCXUzMiBmaXJzdF9kZXNjcmlwdG9yOjE7CisJCQl1MzIgdmxhbl90YWc6MTsKKwkJCXUzMiBvdmVyZmxvd19lcnJvcjoxOworCQkJdTMyIGxlbmd0aF9lcnJvcjoxOworCQkJdTMyIHNhX2ZpbHRlcl9mYWlsOjE7CisJCQl1MzIgZGVzY3JpcHRvcl9lcnJvcjoxOworCQkJdTMyIGVycm9yX3N1bW1hcnk6MTsKKwkJCXUzMiBmcmFtZV9sZW5ndGg6MTQ7CisJCQl1MzIgZGFfZmlsdGVyX2ZhaWw6MTsKKwkJCXUzMiBvd246MTsKKwkJCS8qIFJERVMxICovCisJCQl1MzIgYnVmZmVyMV9zaXplOjEzOworCQkJdTMyIHJlc2VydmVkMToxOworCQkJdTMyIHNlY29uZF9hZGRyZXNzX2NoYWluZWQ6MTsKKwkJCXUzMiBlbmRfcmluZzoxOworCQkJdTMyIGJ1ZmZlcjJfc2l6ZToxMzsKKwkJCXUzMiByZXNlcnZlZDI6MjsKKwkJCXUzMiBkaXNhYmxlX2ljOjE7CisJCX0gZXJ4OwkJLyogLS0gZW5oYW5jZWQgLS0gKi8KKworCQkvKiBUcmFuc21pdCBkZXNjcmlwdG9yICovCisJCXN0cnVjdCB7CisJCQkvKiBUREVTMCAqLworCQkJdTMyIGRlZmVycmVkOjE7CisJCQl1MzIgdW5kZXJmbG93X2Vycm9yOjE7CisJCQl1MzIgZXhjZXNzaXZlX2RlZmVycmFsOjE7CisJCQl1MzIgY29sbGlzaW9uX2NvdW50OjQ7CisJCQl1MzIgaGVhcnRiZWF0X2ZhaWw6MTsKKwkJCXUzMiBleGNlc3NpdmVfY29sbGlzaW9uczoxOworCQkJdTMyIGxhdGVfY29sbGlzaW9uOjE7CisJCQl1MzIgbm9fY2FycmllcjoxOworCQkJdTMyIGxvc3NfY2FycmllcjoxOworCQkJdTMyIHJlc2VydmVkMTozOworCQkJdTMyIGVycm9yX3N1bW1hcnk6MTsKKwkJCXUzMiByZXNlcnZlZDI6MTU7CisJCQl1MzIgb3duOjE7CisJCQkvKiBUREVTMSAqLworCQkJdTMyIGJ1ZmZlcjFfc2l6ZToxMTsKKwkJCXUzMiBidWZmZXIyX3NpemU6MTE7CisJCQl1MzIgcmVzZXJ2ZWQzOjE7CisJCQl1MzIgZGlzYWJsZV9wYWRkaW5nOjE7CisJCQl1MzIgc2Vjb25kX2FkZHJlc3NfY2hhaW5lZDoxOworCQkJdTMyIGVuZF9yaW5nOjE7CisJCQl1MzIgY3JjX2Rpc2FibGU6MTsKKwkJCXUzMiByZXNlcnZlZDQ6MjsKKwkJCXUzMiBmaXJzdF9zZWdtZW50OjE7CisJCQl1MzIgbGFzdF9zZWdtZW50OjE7CisJCQl1MzIgaW50ZXJydXB0OjE7CisJCX0gdHg7CisJCXN0cnVjdCB7CisJCQkvKiBUREVTMCAqLworCQkJdTMyIGRlZmVycmVkOjE7CisJCQl1MzIgdW5kZXJmbG93X2Vycm9yOjE7CisJCQl1MzIgZXhjZXNzaXZlX2RlZmVycmFsOjE7CisJCQl1MzIgY29sbGlzaW9uX2NvdW50OjQ7CisJCQl1MzIgdmxhbl9mcmFtZToxOworCQkJdTMyIGV4Y2Vzc2l2ZV9jb2xsaXNpb25zOjE7CisJCQl1MzIgbGF0ZV9jb2xsaXNpb246MTsKKwkJCXUzMiBub19jYXJyaWVyOjE7CisJCQl1MzIgbG9zc19jYXJyaWVyOjE7CisJCQl1MzIgcGF5bG9hZF9lcnJvcjoxOworCQkJdTMyIGZyYW1lX2ZsdXNoZWQ6MTsKKwkJCXUzMiBqYWJiZXJfdGltZW91dDoxOworCQkJdTMyIGVycm9yX3N1bW1hcnk6MTsKKwkJCXUzMiBpcF9oZWFkZXJfZXJyb3I6MTsKKwkJCXUzMiB0aW1lX3N0YW1wX3N0YXR1czoxOworCQkJdTMyIHJlc2VydmVkMToyOworCQkJdTMyIHNlY29uZF9hZGRyZXNzX2NoYWluZWQ6MTsKKwkJCXUzMiBlbmRfcmluZzoxOworCQkJdTMyIGNoZWNrc3VtX2luc2VydGlvbjoyOworCQkJdTMyIHJlc2VydmVkMjoxOworCQkJdTMyIHRpbWVfc3RhbXBfZW5hYmxlOjE7CisJCQl1MzIgZGlzYWJsZV9wYWRkaW5nOjE7CisJCQl1MzIgY3JjX2Rpc2FibGU6MTsKKwkJCXUzMiBmaXJzdF9zZWdtZW50OjE7CisJCQl1MzIgbGFzdF9zZWdtZW50OjE7CisJCQl1MzIgaW50ZXJydXB0OjE7CisJCQl1MzIgb3duOjE7CisJCQkvKiBUREVTMSAqLworCQkJdTMyIGJ1ZmZlcjFfc2l6ZToxMzsKKwkJCXUzMiByZXNlcnZlZDM6MzsKKwkJCXUzMiBidWZmZXIyX3NpemU6MTM7CisJCQl1MzIgcmVzZXJ2ZWQ0OjM7CisJCX0gZXR4OwkJLyogLS0gZW5oYW5jZWQgLS0gKi8KKwl9IGRlczAxOworCXVuc2lnbmVkIGludCBkZXMyOworCXVuc2lnbmVkIGludCBkZXMzOworfTsKKworLyogVHJhbnNtaXQgY2hlY2tzdW0gaW5zZXJ0aW9uIGNvbnRyb2wgKi8KK2VudW0gdGRlc19jc3VtX2luc2VydGlvbiB7CisJY2ljX2Rpc2FibGVkID0gMCwJLyogQ2hlY2tzdW0gSW5zZXJ0aW9uIENvbnRyb2wgKi8KKwljaWNfb25seV9pcCA9IDEsCS8qIE9ubHkgSVAgaGVhZGVyICovCisJY2ljX25vX3BzZXVkb2hlYWRlciA9IDIsCS8qIElQIGhlYWRlciBidXQgcHNldWRvaGVhZGVyCisJCQkJCSAqIGlzIG5vdCBjYWxjdWxhdGVkICovCisJY2ljX2Z1bGwgPSAzLAkJLyogSVAgaGVhZGVyIGFuZCBwc2V1ZG9oZWFkZXIgKi8KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvZ21hYy5jIGIvZHJpdmVycy9uZXQvc3RtbWFjL2dtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjI0YmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2dtYWMuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgR01BQyBvbi1jaGlwIEV0aGVybmV0IGNvbnRyb2xsZXIgZm9yIFNUIFNvQ3MuCisgIERXQyBFdGhlciBNQUMgMTAvMTAwLzEwMDAgVW5pdmVyc2FsIHZlcnNpb24gMy40MWEgIGhhcyBiZWVuIHVzZWQgZm9yCisgIGRldmVsb3BpbmcgdGhpcyBjb2RlLgorCisgIENvcHlyaWdodCAoQykgMjAwNy0yMDA5ICBTVE1pY3JvZWxlY3Ryb25pY3MgTHRkCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisKKyAgQXV0aG9yOiBHaXVzZXBwZSBDYXZhbGxhcm8gPHBlcHBlLmNhdmFsbGFyb0BzdC5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworI2luY2x1ZGUgInN0bW1hYy5oIgorI2luY2x1ZGUgImdtYWMuaCIKKworI3VuZGVmIEdNQUNfREVCVUcKKy8qI2RlZmluZSBHTUFDX0RFQlVHKi8KKyN1bmRlZiBGUkFNRV9GSUxURVJfREVCVUcKKy8qI2RlZmluZSBGUkFNRV9GSUxURVJfREVCVUcqLworI2lmZGVmIEdNQUNfREVCVUcKKyNkZWZpbmUgREJHKGZtdCwgYXJncy4uLikgIHByaW50ayhmbXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKSAgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdtYWNfZHVtcF9yZWdzKHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCWludCBpOworCXByX2luZm8oIlx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCSAgICAgICAiXHQgIEdNQUMgcmVnaXN0ZXJzIChiYXNlIGFkZHIgPSAweCU4eClcbiIKKwkgICAgICAgIlx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClpb2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDU1OyBpKyspIHsKKwkJaW50IG9mZnNldCA9IGkgKiA0OworCQlwcl9pbmZvKCJcdFJlZyBOby4gJWQgKG9mZnNldCAweCV4KTogMHglMDh4XG4iLCBpLAorCQkgICAgICAgb2Zmc2V0LCByZWFkbChpb2FkZHIgKyBvZmZzZXQpKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGdtYWNfZG1hX2luaXQodW5zaWduZWQgbG9uZyBpb2FkZHIsIGludCBwYmwsIHUzMiBkbWFfdHgsIHUzMiBkbWFfcngpCit7CisJdTMyIHZhbHVlID0gcmVhZGwoaW9hZGRyICsgRE1BX0JVU19NT0RFKTsKKwkvKiBETUEgU1cgcmVzZXQgKi8KKwl2YWx1ZSB8PSBETUFfQlVTX01PREVfU0ZUX1JFU0VUOworCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgRE1BX0JVU19NT0RFKTsKKwlkbyB7fSB3aGlsZSAoKHJlYWRsKGlvYWRkciArIERNQV9CVVNfTU9ERSkgJiBETUFfQlVTX01PREVfU0ZUX1JFU0VUKSk7CisKKwl2YWx1ZSA9IC8qIERNQV9CVVNfTU9ERV9GQiB8ICovIERNQV9CVVNfTU9ERV80UEJMIHwKKwkgICAgKChwYmwgPDwgRE1BX0JVU19NT0RFX1BCTF9TSElGVCkgfAorCSAgICAgKHBibCA8PCBETUFfQlVTX01PREVfUlBCTF9TSElGVCkpOworCisjaWZkZWYgQ09ORklHX1NUTU1BQ19EQQorCXZhbHVlIHw9IERNQV9CVVNfTU9ERV9EQTsJLyogUnggaGFzIHByaW9yaXR5IG92ZXIgdHggKi8KKyNlbmRpZgorCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgRE1BX0JVU19NT0RFKTsKKworCS8qIE1hc2sgaW50ZXJydXB0cyBieSB3cml0aW5nIHRvIENTUjcgKi8KKwl3cml0ZWwoRE1BX0lOVFJfREVGQVVMVF9NQVNLLCBpb2FkZHIgKyBETUFfSU5UUl9FTkEpOworCisJLyogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgUlgvVFggZGVzY3JpcHRvciBsaXN0cyBtdXN0IGJlIHdyaXR0ZW4gaW50bworCSAqIERNQSBDU1IzIGFuZCBDU1I0LCByZXNwZWN0aXZlbHkuICovCisJd3JpdGVsKGRtYV90eCwgaW9hZGRyICsgRE1BX1RYX0JBU0VfQUREUik7CisJd3JpdGVsKGRtYV9yeCwgaW9hZGRyICsgRE1BX1JDVl9CQVNFX0FERFIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRyYW5zbWl0IEZJRk8gZmx1c2ggb3BlcmF0aW9uICovCitzdGF0aWMgdm9pZCBnbWFjX2ZsdXNoX3R4X2ZpZm8odW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJdTMyIGNzcjYgPSByZWFkbChpb2FkZHIgKyBETUFfQ09OVFJPTCk7CisJd3JpdGVsKChjc3I2IHwgRE1BX0NPTlRST0xfRlRGKSwgaW9hZGRyICsgRE1BX0NPTlRST0wpOworCisJZG8ge30gd2hpbGUgKChyZWFkbChpb2FkZHIgKyBETUFfQ09OVFJPTCkgJiBETUFfQ09OVFJPTF9GVEYpKTsKK30KKworc3RhdGljIHZvaWQgZ21hY19kbWFfb3BlcmF0aW9uX21vZGUodW5zaWduZWQgbG9uZyBpb2FkZHIsIGludCB0eG1vZGUsCisJCQkJICAgIGludCByeG1vZGUpCit7CisJdTMyIGNzcjYgPSByZWFkbChpb2FkZHIgKyBETUFfQ09OVFJPTCk7CisKKwlpZiAodHhtb2RlID09IFNGX0RNQV9NT0RFKSB7CisJCURCRyhLRVJOX0RFQlVHICJHTUFDOiBlbmFibGluZyBUWCBzdG9yZSBhbmQgZm9yd2FyZCBtb2RlXG4iKTsKKwkJLyogVHJhbnNtaXQgQ09FIHR5cGUgMiBjYW5ub3QgYmUgZG9uZSBpbiBjdXQtdGhyb3VnaCBtb2RlLiAqLworCQljc3I2IHw9IERNQV9DT05UUk9MX1RTRjsKKwkJLyogT3BlcmF0aW5nIG9uIHNlY29uZCBmcmFtZSBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2UKKwkJICogZXNwZWNpYWxseSB3aGVuIHRyYW5zbWl0IHN0b3JlLWFuZC1mb3J3YXJkIGlzIHVzZWQuKi8KKwkJY3NyNiB8PSBETUFfQ09OVFJPTF9PU0Y7CisJfSBlbHNlIHsKKwkJREJHKEtFUk5fREVCVUcgIkdNQUM6IGRpc2FibGluZyBUWCBzdG9yZSBhbmQgZm9yd2FyZCBtb2RlIgorCQkJICAgICAgIiAodGhyZXNob2xkID0gJWQpXG4iLCB0eG1vZGUpOworCQljc3I2ICY9IH5ETUFfQ09OVFJPTF9UU0Y7CisJCWNzcjYgJj0gRE1BX0NPTlRST0xfVENfVFhfTUFTSzsKKwkJLyogU2V0IHRoZSB0cmFuc21pdCB0aHJlYXNob2xkICovCisJCWlmICh0eG1vZGUgPD0gMzIpCisJCQljc3I2IHw9IERNQV9DT05UUk9MX1RUQ18zMjsKKwkJZWxzZSBpZiAodHhtb2RlIDw9IDY0KQorCQkJY3NyNiB8PSBETUFfQ09OVFJPTF9UVENfNjQ7CisJCWVsc2UgaWYgKHR4bW9kZSA8PSAxMjgpCisJCQljc3I2IHw9IERNQV9DT05UUk9MX1RUQ18xMjg7CisJCWVsc2UgaWYgKHR4bW9kZSA8PSAxOTIpCisJCQljc3I2IHw9IERNQV9DT05UUk9MX1RUQ18xOTI7CisJCWVsc2UKKwkJCWNzcjYgfD0gRE1BX0NPTlRST0xfVFRDXzI1NjsKKwl9CisKKwlpZiAocnhtb2RlID09IFNGX0RNQV9NT0RFKSB7CisJCURCRyhLRVJOX0RFQlVHICJHTUFDOiBlbmFibGluZyBSWCBzdG9yZSBhbmQgZm9yd2FyZCBtb2RlXG4iKTsKKwkJY3NyNiB8PSBETUFfQ09OVFJPTF9SU0Y7CisJfSBlbHNlIHsKKwkJREJHKEtFUk5fREVCVUcgIkdNQUM6IGRpc2FibGluZyBSWCBzdG9yZSBhbmQgZm9yd2FyZCBtb2RlIgorCQkJICAgICAgIiAodGhyZXNob2xkID0gJWQpXG4iLCByeG1vZGUpOworCQljc3I2ICY9IH5ETUFfQ09OVFJPTF9SU0Y7CisJCWNzcjYgJj0gRE1BX0NPTlRST0xfVENfUlhfTUFTSzsKKwkJaWYgKHJ4bW9kZSA8PSAzMikKKwkJCWNzcjYgfD0gRE1BX0NPTlRST0xfUlRDXzMyOworCQllbHNlIGlmIChyeG1vZGUgPD0gNjQpCisJCQljc3I2IHw9IERNQV9DT05UUk9MX1JUQ182NDsKKwkJZWxzZSBpZiAocnhtb2RlIDw9IDk2KQorCQkJY3NyNiB8PSBETUFfQ09OVFJPTF9SVENfOTY7CisJCWVsc2UKKwkJCWNzcjYgfD0gRE1BX0NPTlRST0xfUlRDXzEyODsKKwl9CisKKwl3cml0ZWwoY3NyNiwgaW9hZGRyICsgRE1BX0NPTlRST0wpOworCXJldHVybjsKK30KKworLyogTm90IHlldCBpbXBsZW1lbnRlZCAtLS0gbm8gUk1PTiBtb2R1bGUgKi8KK3N0YXRpYyB2b2lkIGdtYWNfZG1hX2RpYWdub3N0aWNfZnIodm9pZCAqZGF0YSwgc3RydWN0IHN0bW1hY19leHRyYV9zdGF0cyAqeCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGdtYWNfZHVtcF9kbWFfcmVncyh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlpbnQgaTsKKwlwcl9pbmZvKCIgRE1BIHJlZ2lzdGVyc1xuIik7CisJZm9yIChpID0gMDsgaSA8IDIyOyBpKyspIHsKKwkJaWYgKChpIDwgOSkgfHwgKGkgPiAxNykpIHsKKwkJCWludCBvZmZzZXQgPSBpICogNDsKKwkJCXByX2VycigiXHQgUmVnIE5vLiAlZCAob2Zmc2V0IDB4JXgpOiAweCUwOHhcbiIsIGksCisJCQkgICAgICAgKERNQV9CVVNfTU9ERSArIG9mZnNldCksCisJCQkgICAgICAgcmVhZGwoaW9hZGRyICsgRE1BX0JVU19NT0RFICsgb2Zmc2V0KSk7CisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGdtYWNfZ2V0X3R4X2ZyYW1lX3N0YXR1cyh2b2lkICpkYXRhLCBzdHJ1Y3Qgc3RtbWFjX2V4dHJhX3N0YXRzICp4LAorCQkJCSAgICBzdHJ1Y3QgZG1hX2Rlc2MgKnAsIHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKWRhdGE7CisKKwlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXR4LmVycm9yX3N1bW1hcnkpKSB7CisJCURCRyhLRVJOX0VSUiAiR01BQyBUWCBlcnJvci4uLiAweCUwOHhcbiIsIHAtPmRlczAxLmV0eCk7CisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5ldHguamFiYmVyX3RpbWVvdXQpKSB7CisJCQlEQkcoS0VSTl9FUlIgIlx0amFiYmVyX3RpbWVvdXQgZXJyb3JcbiIpOworCQkJeC0+dHhfamFiYmVyKys7CisJCX0KKworCQlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXR4LmZyYW1lX2ZsdXNoZWQpKSB7CisJCQlEQkcoS0VSTl9FUlIgIlx0ZnJhbWVfZmx1c2hlZCBlcnJvclxuIik7CisJCQl4LT50eF9mcmFtZV9mbHVzaGVkKys7CisJCQlnbWFjX2ZsdXNoX3R4X2ZpZm8oaW9hZGRyKTsKKwkJfQorCisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5ldHgubG9zc19jYXJyaWVyKSkgeworCQkJREJHKEtFUk5fRVJSICJcdGxvc3NfY2FycmllciBlcnJvclxuIik7CisJCQl4LT50eF9sb3NzY2FycmllcisrOworCQkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCX0KKwkJaWYgKHVubGlrZWx5KHAtPmRlczAxLmV0eC5ub19jYXJyaWVyKSkgeworCQkJREJHKEtFUk5fRVJSICJcdG5vX2NhcnJpZXIgZXJyb3JcbiIpOworCQkJeC0+dHhfY2FycmllcisrOworCQkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCX0KKwkJaWYgKHVubGlrZWx5KHAtPmRlczAxLmV0eC5sYXRlX2NvbGxpc2lvbikpIHsKKwkJCURCRyhLRVJOX0VSUiAiXHRsYXRlX2NvbGxpc2lvbiBlcnJvclxuIik7CisJCQlzdGF0cy0+Y29sbGlzaW9ucyArPSBwLT5kZXMwMS5ldHguY29sbGlzaW9uX2NvdW50OworCQl9CisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5ldHguZXhjZXNzaXZlX2NvbGxpc2lvbnMpKSB7CisJCQlEQkcoS0VSTl9FUlIgIlx0ZXhjZXNzaXZlX2NvbGxpc2lvbnNcbiIpOworCQkJc3RhdHMtPmNvbGxpc2lvbnMgKz0gcC0+ZGVzMDEuZXR4LmNvbGxpc2lvbl9jb3VudDsKKwkJfQorCQlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXR4LmV4Y2Vzc2l2ZV9kZWZlcnJhbCkpIHsKKwkJCURCRyhLRVJOX0lORk8gIlx0ZXhjZXNzaXZlIHR4X2RlZmVycmFsXG4iKTsKKwkJCXgtPnR4X2RlZmVycmVkKys7CisJCX0KKworCQlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXR4LnVuZGVyZmxvd19lcnJvcikpIHsKKwkJCURCRyhLRVJOX0VSUiAiXHR1bmRlcmZsb3cgZXJyb3JcbiIpOworCQkJZ21hY19mbHVzaF90eF9maWZvKGlvYWRkcik7CisJCQl4LT50eF91bmRlcmZsb3crKzsKKwkJfQorCisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5ldHguaXBfaGVhZGVyX2Vycm9yKSkgeworCQkJREJHKEtFUk5fRVJSICJcdFRYIElQIGhlYWRlciBjc3VtIGVycm9yXG4iKTsKKwkJCXgtPnR4X2lwX2hlYWRlcl9lcnJvcisrOworCQl9CisKKwkJaWYgKHVubGlrZWx5KHAtPmRlczAxLmV0eC5wYXlsb2FkX2Vycm9yKSkgeworCQkJREJHKEtFUk5fRVJSICJcdEFkZHIvUGF5bG9hZCBjc3VtIGVycm9yXG4iKTsKKwkJCXgtPnR4X3BheWxvYWRfZXJyb3IrKzsKKwkJCWdtYWNfZmx1c2hfdHhfZmlmbyhpb2FkZHIpOworCQl9CisKKwkJcmV0ID0gLTE7CisJfQorCisJaWYgKHVubGlrZWx5KHAtPmRlczAxLmV0eC5kZWZlcnJlZCkpIHsKKwkJREJHKEtFUk5fSU5GTyAiR01BQyBUWCBzdGF0dXM6IHR4IGRlZmVycmVkXG4iKTsKKwkJeC0+dHhfZGVmZXJyZWQrKzsKKwl9CisjaWZkZWYgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKKwlpZiAocC0+ZGVzMDEuZXR4LnZsYW5fZnJhbWUpIHsKKwkJREJHKEtFUk5fSU5GTyAiR01BQyBUWCBzdGF0dXM6IFZMQU4gZnJhbWVcbiIpOworCQl4LT50eF92bGFuKys7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdtYWNfZ2V0X3R4X2xlbihzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJcmV0dXJuIHAtPmRlczAxLmV0eC5idWZmZXIxX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgZ21hY19jb2VfcmRlczAoaW50IGlwY19lcnIsIGludCB0eXBlLCBpbnQgcGF5bG9hZF9lcnIpCit7CisJaW50IHJldCA9IGdvb2RfZnJhbWU7CisJdTMyIHN0YXR1cyA9ICh0eXBlIDw8IDIgfCBpcGNfZXJyIDw8IDEgfCBwYXlsb2FkX2VycikgJiAweDc7CisKKwkvKiBiaXRzIDUgNyAwIHwgRnJhbWUgc3RhdHVzCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqICAgICAgMCAwIDAgfCBJRUVFIDgwMi4zIFR5cGUgZnJhbWUgKGxlbmdodCA8IDE1MzYgb2N0ZWN0cykKKwkgKiAgICAgIDEgMCAwIHwgSVB2NC82IE5vIENTVU0gZXJyb3JTLgorCSAqICAgICAgMSAwIDEgfCBJUHY0LzYgQ1NVTSBQQVlMT0FEIGVycm9yCisJICogICAgICAxIDEgMCB8IElQdjQvNiBDU1VNIElQIEhSIGVycm9yCisJICogICAgICAxIDEgMSB8IElQdjQvNiBJUCBQQVlMT0FEIEFORCBIRUFERVIgZXJyb3JTCisJICogICAgICAwIDAgMSB8IElQdjQvNiB1bnN1cHBvcnRlZCBJUCBQQVlMT0FECisJICogICAgICAwIDEgMSB8IENPRSBieXBhc3NlZC4uIG5vIElQdjQvNiBmcmFtZQorCSAqICAgICAgMCAxIDAgfCBSZXNlcnZlZC4KKwkgKi8KKwlpZiAoc3RhdHVzID09IDB4MCkgeworCQlEQkcoS0VSTl9JTkZPICJSWCBEZXMwIHN0YXR1czogSUVFRSA4MDIuMyBUeXBlIGZyYW1lLlxuIik7CisJCXJldCA9IGdvb2RfZnJhbWU7CisJfSBlbHNlIGlmIChzdGF0dXMgPT0gMHg0KSB7CisJCURCRyhLRVJOX0lORk8gIlJYIERlczAgc3RhdHVzOiBJUHY0LzYgTm8gQ1NVTSBlcnJvclMuXG4iKTsKKwkJcmV0ID0gZ29vZF9mcmFtZTsKKwl9IGVsc2UgaWYgKHN0YXR1cyA9PSAweDUpIHsKKwkJREJHKEtFUk5fRVJSICJSWCBEZXMwIHN0YXR1czogSVB2NC82IFBheWxvYWQgRXJyb3IuXG4iKTsKKwkJcmV0ID0gY3N1bV9ub25lOworCX0gZWxzZSBpZiAoc3RhdHVzID09IDB4NikgeworCQlEQkcoS0VSTl9FUlIgIlJYIERlczAgc3RhdHVzOiBJUHY0LzYgSGVhZGVyIEVycm9yLlxuIik7CisJCXJldCA9IGNzdW1fbm9uZTsKKwl9IGVsc2UgaWYgKHN0YXR1cyA9PSAweDcpIHsKKwkJREJHKEtFUk5fRVJSCisJCSAgICAiUlggRGVzMCBzdGF0dXM6IElQdjQvNiBIZWFkZXIgYW5kIFBheWxvYWQgRXJyb3IuXG4iKTsKKwkJcmV0ID0gY3N1bV9ub25lOworCX0gZWxzZSBpZiAoc3RhdHVzID09IDB4MSkgeworCQlEQkcoS0VSTl9FUlIKKwkJICAgICJSWCBEZXMwIHN0YXR1czogSVB2NC82IHVuc3VwcG9ydGVkIElQIFBBWUxPQUQuXG4iKTsKKwkJcmV0ID0gZGlzY2FyZF9mcmFtZTsKKwl9IGVsc2UgaWYgKHN0YXR1cyA9PSAweDMpIHsKKwkJREJHKEtFUk5fRVJSICJSWCBEZXMwIHN0YXR1czogTm8gSVB2NCwgSVB2NiBmcmFtZS5cbiIpOworCQlyZXQgPSBkaXNjYXJkX2ZyYW1lOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdtYWNfZ2V0X3J4X2ZyYW1lX3N0YXR1cyh2b2lkICpkYXRhLCBzdHJ1Y3Qgc3RtbWFjX2V4dHJhX3N0YXRzICp4LAorCQkJCSAgICBzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJaW50IHJldCA9IGdvb2RfZnJhbWU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopZGF0YTsKKworCWlmICh1bmxpa2VseShwLT5kZXMwMS5lcnguZXJyb3Jfc3VtbWFyeSkpIHsKKwkJREJHKEtFUk5fRVJSICJHTUFDIFJYIEVycm9yIFN1bW1hcnkuLi4gMHglMDh4XG4iLCBwLT5kZXMwMS5lcngpOworCQlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXJ4LmRlc2NyaXB0b3JfZXJyb3IpKSB7CisJCQlEQkcoS0VSTl9FUlIgIlx0ZGVzY3JpcHRvciBlcnJvclxuIik7CisJCQl4LT5yeF9kZXNjKys7CisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQl9CisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5lcngub3ZlcmZsb3dfZXJyb3IpKSB7CisJCQlEQkcoS0VSTl9FUlIgIlx0b3ZlcmZsb3cgZXJyb3JcbiIpOworCQkJeC0+cnhfZ21hY19vdmVyZmxvdysrOworCQl9CisKKwkJaWYgKHVubGlrZWx5KHAtPmRlczAxLmVyeC5pcGNfY3N1bV9lcnJvcikpCisJCQlEQkcoS0VSTl9FUlIgIlx0SVBDIENzdW0gRXJyb3IvR2lhbnQgZnJhbWVcbiIpOworCisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5lcngubGF0ZV9jb2xsaXNpb24pKSB7CisJCQlEQkcoS0VSTl9FUlIgIlx0bGF0ZV9jb2xsaXNpb24gZXJyb3JcbiIpOworCQkJc3RhdHMtPmNvbGxpc2lvbnMrKzsKKwkJCXN0YXRzLT5jb2xsaXNpb25zKys7CisJCX0KKwkJaWYgKHVubGlrZWx5KHAtPmRlczAxLmVyeC5yZWNlaXZlX3dhdGNoZG9nKSkgeworCQkJREJHKEtFUk5fRVJSICJcdHJlY2VpdmVfd2F0Y2hkb2cgZXJyb3JcbiIpOworCQkJeC0+cnhfd2F0Y2hkb2crKzsKKwkJfQorCQlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXJ4LmVycm9yX2dtaWkpKSB7CisJCQlEQkcoS0VSTl9FUlIgIlx0UmVjZWl2ZSBFcnJvclxuIik7CisJCQl4LT5yeF9taWkrKzsKKwkJfQorCQlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXJ4LmNyY19lcnJvcikpIHsKKwkJCURCRyhLRVJOX0VSUiAiXHRDUkMgZXJyb3JcbiIpOworCQkJeC0+cnhfY3JjKys7CisJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQl9CisJCXJldCA9IGRpc2NhcmRfZnJhbWU7CisJfQorCisJLyogQWZ0ZXIgYSBwYXlsb2FkIGNzdW0gZXJyb3IsIHRoZSBFUyBiaXQgaXMgc2V0LgorCSAqIEl0IGRvZXNuJ3QgbWF0Y2ggd2l0aCB0aGUgaW5mb3JtYXRpb24gcmVwb3J0ZWQgaW50byB0aGUgZGF0YWJvb2suCisJICogQXQgYW55IHJhdGUsIHdlIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGUgQ1NVTSBodyBjb21wdXRhdGlvbiBpcyBvaworCSAqIGFuZCByZXBvcnQgdGhpcyBpbmZvIHRvIHRoZSB1cHBlciBsYXllcnMuICovCisJcmV0ID0gZ21hY19jb2VfcmRlczAocC0+ZGVzMDEuZXJ4LmlwY19jc3VtX2Vycm9yLAorCQlwLT5kZXMwMS5lcnguZnJhbWVfdHlwZSwgcC0+ZGVzMDEuZXJ4LnBheWxvYWRfY3N1bV9lcnJvcik7CisKKwlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXJ4LmRyaWJibGluZykpIHsKKwkJREJHKEtFUk5fRVJSICJHTUFDIFJYOiBkcmliYmxpbmcgZXJyb3JcbiIpOworCQlyZXQgPSBkaXNjYXJkX2ZyYW1lOworCX0KKwlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXJ4LnNhX2ZpbHRlcl9mYWlsKSkgeworCQlEQkcoS0VSTl9FUlIgIkdNQUMgUlggOiBTb3VyY2UgQWRkcmVzcyBmaWx0ZXIgZmFpbFxuIik7CisJCXgtPnNhX3J4X2ZpbHRlcl9mYWlsKys7CisJCXJldCA9IGRpc2NhcmRfZnJhbWU7CisJfQorCWlmICh1bmxpa2VseShwLT5kZXMwMS5lcnguZGFfZmlsdGVyX2ZhaWwpKSB7CisJCURCRyhLRVJOX0VSUiAiR01BQyBSWCA6IERlc3RpbmF0aW9uIEFkZHJlc3MgZmlsdGVyIGZhaWxcbiIpOworCQl4LT5kYV9yeF9maWx0ZXJfZmFpbCsrOworCQlyZXQgPSBkaXNjYXJkX2ZyYW1lOworCX0KKwlpZiAodW5saWtlbHkocC0+ZGVzMDEuZXJ4Lmxlbmd0aF9lcnJvcikpIHsKKwkJREJHKEtFUk5fRVJSICJHTUFDIFJYOiBsZW5ndGhfZXJyb3IgZXJyb3JcbiIpOworCQl4LT5yeF9sZW5naHQrKzsKKwkJcmV0ID0gZGlzY2FyZF9mcmFtZTsKKwl9CisjaWZkZWYgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKKwlpZiAocC0+ZGVzMDEuZXJ4LnZsYW5fdGFnKSB7CisJCURCRyhLRVJOX0lORk8gIkdNQUMgUlg6IFZMQU4gZnJhbWUgdGFnZ2VkXG4iKTsKKwkJeC0+cnhfdmxhbisrOworCX0KKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdtYWNfaXJxX3N0YXR1cyh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwl1MzIgaW50cl9zdGF0dXMgPSByZWFkbChpb2FkZHIgKyBHTUFDX0lOVF9TVEFUVVMpOworCisJLyogTm90IHVzZWQgZXZlbnRzIChlLmcuIE1NQyBpbnRlcnJ1cHRzKSBhcmUgbm90IGhhbmRsZWQuICovCisJaWYgKChpbnRyX3N0YXR1cyAmIG1tY190eF9pcnEpKQorCQlEQkcoS0VSTl9ERUJVRyAiR01BQzogTU1DIHR4IGludGVycnVwdDogMHglMDh4XG4iLAorCQkgICAgcmVhZGwoaW9hZGRyICsgR01BQ19NTUNfVFhfSU5UUikpOworCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmIG1tY19yeF9pcnEpKQorCQlEQkcoS0VSTl9ERUJVRyAiR01BQzogTU1DIHJ4IGludGVycnVwdDogMHglMDh4XG4iLAorCQkgICAgcmVhZGwoaW9hZGRyICsgR01BQ19NTUNfUlhfSU5UUikpOworCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmIG1tY19yeF9jc3VtX29mZmxvYWRfaXJxKSkKKwkJREJHKEtFUk5fREVCVUcgIkdNQUM6IE1NQyByeCBjc3VtIG9mZmxvYWQ6IDB4JTA4eFxuIiwKKwkJICAgIHJlYWRsKGlvYWRkciArIEdNQUNfTU1DX1JYX0NTVU1fT0ZGTE9BRCkpOworCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmIHBtdF9pcnEpKSB7CisJCURCRyhLRVJOX0RFQlVHICJHTUFDOiByZWNlaXZlZCBNYWdpYyBmcmFtZVxuIik7CisJCS8qIGNsZWFyIHRoZSBQTVQgYml0cyA1IGFuZCA2IGJ5IHJlYWRpbmcgdGhlIFBNVAorCQkgKiBzdGF0dXMgcmVnaXN0ZXIuICovCisJCXJlYWRsKGlvYWRkciArIEdNQUNfUE1UKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGdtYWNfY29yZV9pbml0KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIEdNQUNfQ09OVFJPTCk7CisJdmFsdWUgfD0gR01BQ19DT1JFX0lOSVQ7CisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBHTUFDX0NPTlRST0wpOworCisJLyogU1RCdXMgQnJpZGdlIENvbmZpZ3VyYXRpb24gKi8KKwkvKndyaXRlbCgweGM1NjA4LCBpb2FkZHIgKyAweDAwMDA3MDAwKTsqLworCisJLyogRnJlZXplIE1NQyBjb3VudGVycyAqLworCXdyaXRlbCgweDgsIGlvYWRkciArIEdNQUNfTU1DX0NUUkwpOworCS8qIE1hc2sgR01BQyBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDB4MjA3LCBpb2FkZHIgKyBHTUFDX0lOVF9NQVNLKTsKKworI2lmZGVmIFNUTU1BQ19WTEFOX1RBR19VU0VECisJLyogVGFnIGRldGVjdGlvbiB3aXRob3V0IGZpbHRlcmluZyAqLworCXdyaXRlbCgweDAsIGlvYWRkciArIEdNQUNfVkxBTl9UQUcpOworI2VuZGlmCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBnbWFjX3NldF91bWFjX2FkZHIodW5zaWduZWQgbG9uZyBpb2FkZHIsIHVuc2lnbmVkIGNoYXIgKmFkZHIsCisJCQkJdW5zaWduZWQgaW50IHJlZ19uKQoreworCXN0bW1hY19zZXRfbWFjX2FkZHIoaW9hZGRyLCBhZGRyLCBHTUFDX0FERFJfSElHSChyZWdfbiksCisJCQkJR01BQ19BRERSX0xPVyhyZWdfbikpOworfQorCitzdGF0aWMgdm9pZCBnbWFjX2dldF91bWFjX2FkZHIodW5zaWduZWQgbG9uZyBpb2FkZHIsIHVuc2lnbmVkIGNoYXIgKmFkZHIsCisJCQkJdW5zaWduZWQgaW50IHJlZ19uKQoreworCXN0bW1hY19nZXRfbWFjX2FkZHIoaW9hZGRyLCBhZGRyLCBHTUFDX0FERFJfSElHSChyZWdfbiksCisJCQkJR01BQ19BRERSX0xPVyhyZWdfbikpOworfQorCitzdGF0aWMgdm9pZCBnbWFjX3NldF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCB2YWx1ZSA9IDA7CisKKwlEQkcoS0VSTl9JTkZPICIlczogIyBtY2FzdHMgJWQsICMgdW5pY2FzdCAlZFxuIiwKKwkgICAgX19mdW5jX18sIGRldi0+bWNfY291bnQsIGRldi0+dWNfY291bnQpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJdmFsdWUgPSBHTUFDX0ZSQU1FX0ZJTFRFUl9QUjsKKwllbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IEhBU0hfVEFCTEVfU0laRSkKKwkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCXZhbHVlID0gR01BQ19GUkFNRV9GSUxURVJfUE07CS8qIHBhc3MgYWxsIG11bHRpICovCisJCXdyaXRlbCgweGZmZmZmZmZmLCBpb2FkZHIgKyBHTUFDX0hBU0hfSElHSCk7CisJCXdyaXRlbCgweGZmZmZmZmZmLCBpb2FkZHIgKyBHTUFDX0hBU0hfTE9XKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiAwKSB7CisJCWludCBpOworCQl1MzIgbWNfZmlsdGVyWzJdOworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKworCQkvKiBIYXNoIGZpbHRlciBmb3IgbXVsdGljYXN0ICovCisJCXZhbHVlID0gR01BQ19GUkFNRV9GSUxURVJfSE1DOworCisJCW1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OworCQkgICAgIG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCS8qIFRoZSB1cHBlciA2IGJpdHMgb2YgdGhlIGNhbGN1bGF0ZWQgQ1JDIGFyZSB1c2VkIHRvCisJCQkgICBpbmRleCB0aGUgY29udGVucyBvZiB0aGUgaGFzaCB0YWJsZSAqLworCQkJaW50IGJpdF9uciA9CisJCQkgICAgYml0cmV2MzIofmNyYzMyX2xlKH4wLCBtY2xpc3QtPmRtaV9hZGRyLCA2KSkgPj4gMjY7CisJCQkvKiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgZGV0ZXJtaW5lcyB0aGUgcmVnaXN0ZXIgdG8KKwkJCSAqIHVzZSAoSC9MKSB3aGlsZSB0aGUgb3RoZXIgNSBiaXRzIGRldGVybWluZSB0aGUgYml0CisJCQkgKiB3aXRoaW4gdGhlIHJlZ2lzdGVyLiAqLworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7CisJCX0KKwkJd3JpdGVsKG1jX2ZpbHRlclswXSwgaW9hZGRyICsgR01BQ19IQVNIX0xPVyk7CisJCXdyaXRlbChtY19maWx0ZXJbMV0sIGlvYWRkciArIEdNQUNfSEFTSF9ISUdIKTsKKwl9CisKKwkvKiBIYW5kbGUgbXVsdGlwbGUgdW5pY2FzdCBhZGRyZXNzZXMgKHBlcmZlY3QgZmlsdGVyaW5nKSovCisJaWYgKGRldi0+dWNfY291bnQgPiBHTUFDX01BWF9VTklDQVNUX0FERFJFU1NFUykKKwkJLyogU3dpdGNoIHRvIHByb21pc2N1b3VzIG1vZGUgaXMgbW9yZSB0aGFuIDE2IGFkZHJzCisJCSAgIGFyZSByZXF1aXJlZCAqLworCQl2YWx1ZSB8PSBHTUFDX0ZSQU1FX0ZJTFRFUl9QUjsKKwllbHNlIHsKKwkJaW50IGk7CisJCXN0cnVjdCBkZXZfYWRkcl9saXN0ICp1Y19wdHIgPSBkZXYtPnVjX2xpc3Q7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBkZXYtPnVjX2NvdW50OyBpKyspIHsKKwkJCQlnbWFjX3NldF91bWFjX2FkZHIoaW9hZGRyLCB1Y19wdHItPmRhX2FkZHIsCisJCQkJCQlpICsgMSk7CisKKwkJCQlEQkcoS0VSTl9JTkZPICJcdCVkICIKKwkJCQkiLSBVbmljYXN0IGFkZHIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiIKKwkJCQkiJTAyeFxuIiwgaSArIDEsCisJCQkJdWNfcHRyLT5kYV9hZGRyWzBdLCB1Y19wdHItPmRhX2FkZHJbMV0sCisJCQkJdWNfcHRyLT5kYV9hZGRyWzJdLCB1Y19wdHItPmRhX2FkZHJbM10sCisJCQkJdWNfcHRyLT5kYV9hZGRyWzRdLCB1Y19wdHItPmRhX2FkZHJbNV0pOworCQkJCXVjX3B0ciA9IHVjX3B0ci0+bmV4dDsKKwkJfQorCX0KKworI2lmZGVmIEZSQU1FX0ZJTFRFUl9ERUJVRworCS8qIEVuYWJsZSBSZWNlaXZlIGFsbCBtb2RlICh0byBkZWJ1ZyBmaWx0ZXJpbmdfZmFpbCBlcnJvcnMpICovCisJdmFsdWUgfD0gR01BQ19GUkFNRV9GSUxURVJfUkE7CisjZW5kaWYKKwl3cml0ZWwodmFsdWUsIGlvYWRkciArIEdNQUNfRlJBTUVfRklMVEVSKTsKKworCURCRyhLRVJOX0lORk8gIlx0RnJhbWUgRmlsdGVyIHJlZzogMHglMDh4XG5cdEhhc2ggcmVnczogIgorCSAgICAiSEkgMHglMDh4LCBMTyAweCUwOHhcbiIsIHJlYWRsKGlvYWRkciArIEdNQUNfRlJBTUVfRklMVEVSKSwKKwkgICAgcmVhZGwoaW9hZGRyICsgR01BQ19IQVNIX0hJR0gpLCByZWFkbChpb2FkZHIgKyBHTUFDX0hBU0hfTE9XKSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGdtYWNfZmxvd19jdHJsKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1bnNpZ25lZCBpbnQgZHVwbGV4LAorCQkJICAgdW5zaWduZWQgaW50IGZjLCB1bnNpZ25lZCBpbnQgcGF1c2VfdGltZSkKK3sKKwl1bnNpZ25lZCBpbnQgZmxvdyA9IDA7CisKKwlEQkcoS0VSTl9ERUJVRyAiR01BQyBGbG93LUNvbnRyb2w6XG4iKTsKKwlpZiAoZmMgJiBGTE9XX1JYKSB7CisJCURCRyhLRVJOX0RFQlVHICJcdFJlY2VpdmUgRmxvdy1Db250cm9sIE9OXG4iKTsKKwkJZmxvdyB8PSBHTUFDX0ZMT1dfQ1RSTF9SRkU7CisJfQorCWlmIChmYyAmIEZMT1dfVFgpIHsKKwkJREJHKEtFUk5fREVCVUcgIlx0VHJhbnNtaXQgRmxvdy1Db250cm9sIE9OXG4iKTsKKwkJZmxvdyB8PSBHTUFDX0ZMT1dfQ1RSTF9URkU7CisJfQorCisJaWYgKGR1cGxleCkgeworCQlEQkcoS0VSTl9ERUJVRyAiXHRkdXBsZXggbW9kZTogcGF1c2UgdGltZTogJWRcbiIsIHBhdXNlX3RpbWUpOworCQlmbG93IHw9IChwYXVzZV90aW1lIDw8IEdNQUNfRkxPV19DVFJMX1BUX1NISUZUKTsKKwl9CisKKwl3cml0ZWwoZmxvdywgaW9hZGRyICsgR01BQ19GTE9XX0NUUkwpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZ21hY19wbXQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgcG10ID0gMDsKKworCWlmIChtb2RlID09IFdBS0VfTUFHSUMpIHsKKwkJREJHKEtFUk5fREVCVUcgIkdNQUM6IFdPTCBNYWdpYyBmcmFtZVxuIik7CisJCXBtdCB8PSBwb3dlcl9kb3duIHwgbWFnaWNfcGt0X2VuOworCX0gZWxzZSBpZiAobW9kZSA9PSBXQUtFX1VDQVNUKSB7CisJCURCRyhLRVJOX0RFQlVHICJHTUFDOiBXT0wgb24gZ2xvYmFsIHVuaWNhc3RcbiIpOworCQlwbXQgfD0gZ2xvYmFsX3VuaWNhc3Q7CisJfQorCisJd3JpdGVsKHBtdCwgaW9hZGRyICsgR01BQ19QTVQpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZ21hY19pbml0X3J4X2Rlc2Moc3RydWN0IGRtYV9kZXNjICpwLCB1bnNpZ25lZCBpbnQgcmluZ19zaXplLAorCQkJCWludCBkaXNhYmxlX3J4X2ljKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCByaW5nX3NpemU7IGkrKykgeworCQlwLT5kZXMwMS5lcngub3duID0gMTsKKwkJcC0+ZGVzMDEuZXJ4LmJ1ZmZlcjFfc2l6ZSA9IEJVRl9TSVpFXzhLaUIgLSAxOworCQkvKiBUbyBzdXBwb3J0IGp1bWJvIGZyYW1lcyAqLworCQlwLT5kZXMwMS5lcnguYnVmZmVyMl9zaXplID0gQlVGX1NJWkVfOEtpQiAtIDE7CisJCWlmIChpID09IHJpbmdfc2l6ZSAtIDEpCisJCQlwLT5kZXMwMS5lcnguZW5kX3JpbmcgPSAxOworCQlpZiAoZGlzYWJsZV9yeF9pYykKKwkJCXAtPmRlczAxLmVyeC5kaXNhYmxlX2ljID0gMTsKKwkJcCsrOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGdtYWNfaW5pdF90eF9kZXNjKHN0cnVjdCBkbWFfZGVzYyAqcCwgdW5zaWduZWQgaW50IHJpbmdfc2l6ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCByaW5nX3NpemU7IGkrKykgeworCQlwLT5kZXMwMS5ldHgub3duID0gMDsKKwkJaWYgKGkgPT0gcmluZ19zaXplIC0gMSkKKwkJCXAtPmRlczAxLmV0eC5lbmRfcmluZyA9IDE7CisJCXArKzsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZ21hY19nZXRfdHhfb3duZXIoc3RydWN0IGRtYV9kZXNjICpwKQoreworCXJldHVybiBwLT5kZXMwMS5ldHgub3duOworfQorCitzdGF0aWMgaW50IGdtYWNfZ2V0X3J4X293bmVyKHN0cnVjdCBkbWFfZGVzYyAqcCkKK3sKKwlyZXR1cm4gcC0+ZGVzMDEuZXJ4Lm93bjsKK30KKworc3RhdGljIHZvaWQgZ21hY19zZXRfdHhfb3duZXIoc3RydWN0IGRtYV9kZXNjICpwKQoreworCXAtPmRlczAxLmV0eC5vd24gPSAxOworfQorCitzdGF0aWMgdm9pZCBnbWFjX3NldF9yeF9vd25lcihzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJcC0+ZGVzMDEuZXJ4Lm93biA9IDE7Cit9CisKK3N0YXRpYyBpbnQgZ21hY19nZXRfdHhfbHMoc3RydWN0IGRtYV9kZXNjICpwKQoreworCXJldHVybiBwLT5kZXMwMS5ldHgubGFzdF9zZWdtZW50OworfQorCitzdGF0aWMgdm9pZCBnbWFjX3JlbGVhc2VfdHhfZGVzYyhzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJaW50IHRlciA9IHAtPmRlczAxLmV0eC5lbmRfcmluZzsKKworCW1lbXNldChwLCAwLCBzaXplb2Yoc3RydWN0IGRtYV9kZXNjKSk7CisJcC0+ZGVzMDEuZXR4LmVuZF9yaW5nID0gdGVyOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBnbWFjX3ByZXBhcmVfdHhfZGVzYyhzdHJ1Y3QgZG1hX2Rlc2MgKnAsIGludCBpc19mcywgaW50IGxlbiwKKwkJCQkgaW50IGNzdW1fZmxhZykKK3sKKwlwLT5kZXMwMS5ldHguZmlyc3Rfc2VnbWVudCA9IGlzX2ZzOworCWlmICh1bmxpa2VseShsZW4gPiBCVUZfU0laRV80S2lCKSkgeworCQlwLT5kZXMwMS5ldHguYnVmZmVyMV9zaXplID0gQlVGX1NJWkVfNEtpQjsKKwkJcC0+ZGVzMDEuZXR4LmJ1ZmZlcjJfc2l6ZSA9IGxlbiAtIEJVRl9TSVpFXzRLaUI7CisJfSBlbHNlIHsKKwkJcC0+ZGVzMDEuZXR4LmJ1ZmZlcjFfc2l6ZSA9IGxlbjsKKwl9CisJaWYgKGxpa2VseShjc3VtX2ZsYWcpKQorCQlwLT5kZXMwMS5ldHguY2hlY2tzdW1faW5zZXJ0aW9uID0gY2ljX2Z1bGw7Cit9CisKK3N0YXRpYyB2b2lkIGdtYWNfY2xlYXJfdHhfaWMoc3RydWN0IGRtYV9kZXNjICpwKQoreworCXAtPmRlczAxLmV0eC5pbnRlcnJ1cHQgPSAwOworfQorCitzdGF0aWMgdm9pZCBnbWFjX2Nsb3NlX3R4X2Rlc2Moc3RydWN0IGRtYV9kZXNjICpwKQoreworCXAtPmRlczAxLmV0eC5sYXN0X3NlZ21lbnQgPSAxOworCXAtPmRlczAxLmV0eC5pbnRlcnJ1cHQgPSAxOworfQorCitzdGF0aWMgaW50IGdtYWNfZ2V0X3J4X2ZyYW1lX2xlbihzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJcmV0dXJuIHAtPmRlczAxLmVyeC5mcmFtZV9sZW5ndGg7Cit9CisKK3N0cnVjdCBzdG1tYWNfb3BzIGdtYWNfZHJpdmVyID0geworCS5jb3JlX2luaXQgPSBnbWFjX2NvcmVfaW5pdCwKKwkuZHVtcF9tYWNfcmVncyA9IGdtYWNfZHVtcF9yZWdzLAorCS5kbWFfaW5pdCA9IGdtYWNfZG1hX2luaXQsCisJLmR1bXBfZG1hX3JlZ3MgPSBnbWFjX2R1bXBfZG1hX3JlZ3MsCisJLmRtYV9tb2RlID0gZ21hY19kbWFfb3BlcmF0aW9uX21vZGUsCisJLmRtYV9kaWFnbm9zdGljX2ZyID0gZ21hY19kbWFfZGlhZ25vc3RpY19mciwKKwkudHhfc3RhdHVzID0gZ21hY19nZXRfdHhfZnJhbWVfc3RhdHVzLAorCS5yeF9zdGF0dXMgPSBnbWFjX2dldF9yeF9mcmFtZV9zdGF0dXMsCisJLmdldF90eF9sZW4gPSBnbWFjX2dldF90eF9sZW4sCisJLnNldF9maWx0ZXIgPSBnbWFjX3NldF9maWx0ZXIsCisJLmZsb3dfY3RybCA9IGdtYWNfZmxvd19jdHJsLAorCS5wbXQgPSBnbWFjX3BtdCwKKwkuaW5pdF9yeF9kZXNjID0gZ21hY19pbml0X3J4X2Rlc2MsCisJLmluaXRfdHhfZGVzYyA9IGdtYWNfaW5pdF90eF9kZXNjLAorCS5nZXRfdHhfb3duZXIgPSBnbWFjX2dldF90eF9vd25lciwKKwkuZ2V0X3J4X293bmVyID0gZ21hY19nZXRfcnhfb3duZXIsCisJLnJlbGVhc2VfdHhfZGVzYyA9IGdtYWNfcmVsZWFzZV90eF9kZXNjLAorCS5wcmVwYXJlX3R4X2Rlc2MgPSBnbWFjX3ByZXBhcmVfdHhfZGVzYywKKwkuY2xlYXJfdHhfaWMgPSBnbWFjX2NsZWFyX3R4X2ljLAorCS5jbG9zZV90eF9kZXNjID0gZ21hY19jbG9zZV90eF9kZXNjLAorCS5nZXRfdHhfbHMgPSBnbWFjX2dldF90eF9scywKKwkuc2V0X3R4X293bmVyID0gZ21hY19zZXRfdHhfb3duZXIsCisJLnNldF9yeF9vd25lciA9IGdtYWNfc2V0X3J4X293bmVyLAorCS5nZXRfcnhfZnJhbWVfbGVuID0gZ21hY19nZXRfcnhfZnJhbWVfbGVuLAorCS5ob3N0X2lycV9zdGF0dXMgPSBnbWFjX2lycV9zdGF0dXMsCisJLnNldF91bWFjX2FkZHIgPSBnbWFjX3NldF91bWFjX2FkZHIsCisJLmdldF91bWFjX2FkZHIgPSBnbWFjX2dldF91bWFjX2FkZHIsCit9OworCitzdHJ1Y3QgbWFjX2RldmljZV9pbmZvICpnbWFjX3NldHVwKHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXN0cnVjdCBtYWNfZGV2aWNlX2luZm8gKm1hYzsKKwl1MzIgdWlkID0gcmVhZGwoaW9hZGRyICsgR01BQ19WRVJTSU9OKTsKKworCXByX2luZm8oIlx0R01BQyAtIHVzZXIgSUQ6IDB4JXgsIFN5bm9wc3lzIElEOiAweCV4XG4iLAorCSAgICAgICAoKHVpZCAmIDB4MDAwMGZmMDApID4+IDgpLCAodWlkICYgMHgwMDAwMDBmZikpOworCisJbWFjID0ga3phbGxvYyhzaXplb2YoY29uc3Qgc3RydWN0IG1hY19kZXZpY2VfaW5mbyksIEdGUF9LRVJORUwpOworCisJbWFjLT5vcHMgPSAmZ21hY19kcml2ZXI7CisJbWFjLT5ody5wbXQgPSBQTVRfU1VQUE9SVEVEOworCW1hYy0+aHcubGluay5wb3J0ID0gR01BQ19DT05UUk9MX1BTOworCW1hYy0+aHcubGluay5kdXBsZXggPSBHTUFDX0NPTlRST0xfRE07CisJbWFjLT5ody5saW5rLnNwZWVkID0gR01BQ19DT05UUk9MX0ZFUzsKKwltYWMtPmh3Lm1paS5hZGRyID0gR01BQ19NSUlfQUREUjsKKwltYWMtPmh3Lm1paS5kYXRhID0gR01BQ19NSUlfREFUQTsKKworCXJldHVybiBtYWM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvZ21hYy5oIGIvZHJpdmVycy9uZXQvc3RtbWFjL2dtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODRhMzYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2dtYWMuaApAQCAtMCwwICsxLDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIFNUTWljcm9lbGVjdHJvbmljcyBMdGQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgR01BQ19DT05UUk9MCQkweDAwMDAwMDAwCS8qIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgR01BQ19GUkFNRV9GSUxURVIJMHgwMDAwMDAwNAkvKiBGcmFtZSBGaWx0ZXIgKi8KKyNkZWZpbmUgR01BQ19IQVNIX0hJR0gJCTB4MDAwMDAwMDgJLyogTXVsdGljYXN0IEhhc2ggVGFibGUgSGlnaCAqLworI2RlZmluZSBHTUFDX0hBU0hfTE9XCQkweDAwMDAwMDBjCS8qIE11bHRpY2FzdCBIYXNoIFRhYmxlIExvdyAqLworI2RlZmluZSBHTUFDX01JSV9BRERSCQkweDAwMDAwMDEwCS8qIE1JSSBBZGRyZXNzICovCisjZGVmaW5lIEdNQUNfTUlJX0RBVEEJCTB4MDAwMDAwMTQJLyogTUlJIERhdGEgKi8KKyNkZWZpbmUgR01BQ19GTE9XX0NUUkwJCTB4MDAwMDAwMTgJLyogRmxvdyBDb250cm9sICovCisjZGVmaW5lIEdNQUNfVkxBTl9UQUcJCTB4MDAwMDAwMWMJLyogVkxBTiBUYWcgKi8KKyNkZWZpbmUgR01BQ19WRVJTSU9OCQkweDAwMDAwMDIwCS8qIEdNQUMgQ09SRSBWZXJzaW9uICovCisjZGVmaW5lIEdNQUNfV0FLRVVQX0ZJTFRFUgkweDAwMDAwMDI4CS8qIFdha2UtdXAgRnJhbWUgRmlsdGVyICovCisKKyNkZWZpbmUgR01BQ19JTlRfU1RBVFVTCQkweDAwMDAwMDM4CS8qIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KK2VudW0gZ21hY19pcnFfc3RhdHVzIHsKKwl0aW1lX3N0YW1wX2lycSA9IDB4MDIwMCwKKwltbWNfcnhfY3N1bV9vZmZsb2FkX2lycSA9IDB4MDA4MCwKKwltbWNfdHhfaXJxID0gMHgwMDQwLAorCW1tY19yeF9pcnEgPSAweDAwMjAsCisJbW1jX2lycSA9IDB4MDAxMCwKKwlwbXRfaXJxID0gMHgwMDA4LAorCXBjc19hbmVfaXJxID0gMHgwMDA0LAorCXBjc19saW5rX2lycSA9IDB4MDAwMiwKKwlyZ21paV9pcnEgPSAweDAwMDEsCit9OworI2RlZmluZSBHTUFDX0lOVF9NQVNLCQkweDAwMDAwMDNjCS8qIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisKKy8qIFBNVCBDb250cm9sIGFuZCBTdGF0dXMgKi8KKyNkZWZpbmUgR01BQ19QTVQJCTB4MDAwMDAwMmMKK2VudW0gcG93ZXJfZXZlbnQgeworCXBvaW50ZXJfcmVzZXQgPSAweDgwMDAwMDAwLAorCWdsb2JhbF91bmljYXN0ID0gMHgwMDAwMDIwMCwKKwl3YWtlX3VwX3J4X2ZyYW1lID0gMHgwMDAwMDA0MCwKKwltYWdpY19mcmFtZSA9IDB4MDAwMDAwMjAsCisJd2FrZV91cF9mcmFtZV9lbiA9IDB4MDAwMDAwMDQsCisJbWFnaWNfcGt0X2VuID0gMHgwMDAwMDAwMiwKKwlwb3dlcl9kb3duID0gMHgwMDAwMDAwMSwKK307CisKKy8qIEdNQUMgSFcgQUREUiByZWdzICovCisjZGVmaW5lIEdNQUNfQUREUl9ISUdIKHJlZykJCSgweDAwMDAwMDQwKyhyZWcgKiA4KSkKKyNkZWZpbmUgR01BQ19BRERSX0xPVyhyZWcpCQkoMHgwMDAwMDA0NCsocmVnICogOCkpCisjZGVmaW5lIEdNQUNfTUFYX1VOSUNBU1RfQUREUkVTU0VTCTE2CisKKyNkZWZpbmUgR01BQ19BTl9DVFJMCTB4MDAwMDAwYzAJLyogQU4gY29udHJvbCAqLworI2RlZmluZSBHTUFDX0FOX1NUQVRVUwkweDAwMDAwMGM0CS8qIEFOIHN0YXR1cyAqLworI2RlZmluZSBHTUFDX0FORV9BRFYJMHgwMDAwMDBjOAkvKiBBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBHTUFDX0FORV9MSU5LCTB4MDAwMDAwY2MJLyogQXV0by1OZWcuIGxpbmsgcGFydGVuZXIgYWJpbGl0eSAqLworI2RlZmluZSBHTUFDX0FORV9FWFAJMHgwMDAwMDBkMAkvKiBBTkUgZXhwYW5zaW9uICovCisjZGVmaW5lIEdNQUNfVEJJCTB4MDAwMDAwZDQJLyogVEJJIGV4dGVuZCBzdGF0dXMgKi8KKyNkZWZpbmUgR01BQ19HTUlJX1NUQVRVUyAweDAwMDAwMGQ4CS8qIFMvUi1HTUlJIHN0YXR1cyAqLworCisvKiBHTUFDIENvbmZpZ3VyYXRpb24gZGVmaW5lcyAqLworI2RlZmluZSBHTUFDX0NPTlRST0xfVEMJMHgwMTAwMDAwMAkvKiBUcmFuc21pdCBDb25mLiBpbiBSR01JSS9TR01JSSAqLworI2RlZmluZSBHTUFDX0NPTlRST0xfV0QJMHgwMDgwMDAwMAkvKiBEaXNhYmxlIFdhdGNoZG9nIG9uIHJlY2VpdmUgKi8KKyNkZWZpbmUgR01BQ19DT05UUk9MX0pECTB4MDA0MDAwMDAJLyogSmFiYmVyIGRpc2FibGUgKi8KKyNkZWZpbmUgR01BQ19DT05UUk9MX0JFCTB4MDAyMDAwMDAJLyogRnJhbWUgQnVyc3QgRW5hYmxlICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9KRQkweDAwMTAwMDAwCS8qIEp1bWJvIGZyYW1lICovCitlbnVtIGludGVyX2ZyYW1lX2dhcCB7CisJR01BQ19DT05UUk9MX0lGR184OCA9IDB4MDAwNDAwMDAsCisJR01BQ19DT05UUk9MX0lGR184MCA9IDB4MDAwMjAwMDAsCisJR01BQ19DT05UUk9MX0lGR180MCA9IDB4MDAwZTAwMDAsCit9OworI2RlZmluZSBHTUFDX0NPTlRST0xfRENSUwkweDAwMDEwMDAwIC8qIERpc2FibGUgY2FycmllciBzZW5zZSBkdXJpbmcgdHggKi8KKyNkZWZpbmUgR01BQ19DT05UUk9MX1BTCQkweDAwMDA4MDAwIC8qIFBvcnQgU2VsZWN0IDA6R01JIDE6TUlJICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9GRVMJMHgwMDAwNDAwMCAvKiBTcGVlZCAwOjEwIDE6MTAwICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9ETwkJMHgwMDAwMjAwMCAvKiBEaXNhYmxlIFJ4IE93biAqLworI2RlZmluZSBHTUFDX0NPTlRST0xfTE0JCTB4MDAwMDEwMDAgLyogTG9vcC1iYWNrIG1vZGUgKi8KKyNkZWZpbmUgR01BQ19DT05UUk9MX0RNCQkweDAwMDAwODAwIC8qIER1cGxleCBNb2RlICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9JUEMJMHgwMDAwMDQwMCAvKiBDaGVja3N1bSBPZmZsb2FkICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9EUgkJMHgwMDAwMDIwMCAvKiBEaXNhYmxlIFJldHJ5ICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9MVUQJMHgwMDAwMDEwMCAvKiBMaW5rIHVwL2Rvd24gKi8KKyNkZWZpbmUgR01BQ19DT05UUk9MX0FDUwkweDAwMDAwMDgwIC8qIEF1dG9tYXRpYyBQYWQgU3RyaXBwaW5nICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9EQwkJMHgwMDAwMDAxMCAvKiBEZWZlcnJhbCBDaGVjayAqLworI2RlZmluZSBHTUFDX0NPTlRST0xfVEUJCTB4MDAwMDAwMDggLyogVHJhbnNtaXR0ZXIgRW5hYmxlICovCisjZGVmaW5lIEdNQUNfQ09OVFJPTF9SRQkJMHgwMDAwMDAwNCAvKiBSZWNlaXZlciBFbmFibGUgKi8KKworI2RlZmluZSBHTUFDX0NPUkVfSU5JVCAoR01BQ19DT05UUk9MX0pEIHwgR01BQ19DT05UUk9MX1BTIHwgR01BQ19DT05UUk9MX0FDUyB8IFwKKwkJCUdNQUNfQ09OVFJPTF9JUEMgfCBHTUFDX0NPTlRST0xfSkUgfCBHTUFDX0NPTlRST0xfQkUpCisKKy8qIEdNQUMgRnJhbWUgRmlsdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgR01BQ19GUkFNRV9GSUxURVJfUFIJMHgwMDAwMDAwMQkvKiBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIEdNQUNfRlJBTUVfRklMVEVSX0hVQwkweDAwMDAwMDAyCS8qIEhhc2ggVW5pY2FzdCAqLworI2RlZmluZSBHTUFDX0ZSQU1FX0ZJTFRFUl9ITUMJMHgwMDAwMDAwNAkvKiBIYXNoIE11bHRpY2FzdCAqLworI2RlZmluZSBHTUFDX0ZSQU1FX0ZJTFRFUl9EQUlGCTB4MDAwMDAwMDgJLyogREEgSW52ZXJzZSBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgR01BQ19GUkFNRV9GSUxURVJfUE0JMHgwMDAwMDAxMAkvKiBQYXNzIGFsbCBtdWx0aWNhc3QgKi8KKyNkZWZpbmUgR01BQ19GUkFNRV9GSUxURVJfREJGCTB4MDAwMDAwMjAJLyogRGlzYWJsZSBCcm9hZGNhc3QgZnJhbWVzICovCisjZGVmaW5lIEdNQUNfRlJBTUVfRklMVEVSX1NBSUYJMHgwMDAwMDEwMAkvKiBJbnZlcnNlIEZpbHRlcmluZyAqLworI2RlZmluZSBHTUFDX0ZSQU1FX0ZJTFRFUl9TQUYJMHgwMDAwMDIwMAkvKiBTb3VyY2UgQWRkcmVzcyBGaWx0ZXIgKi8KKyNkZWZpbmUgR01BQ19GUkFNRV9GSUxURVJfSFBGCTB4MDAwMDA0MDAJLyogSGFzaCBvciBwZXJmZWN0IEZpbHRlciAqLworI2RlZmluZSBHTUFDX0ZSQU1FX0ZJTFRFUl9SQQkweDgwMDAwMDAwCS8qIFJlY2VpdmUgYWxsIG1vZGUgKi8KKy8qIEdNSUkgQUREUiAgZGVmaW5lcyAqLworI2RlZmluZSBHTUFDX01JSV9BRERSX1dSSVRFCTB4MDAwMDAwMDIJLyogTUlJIFdyaXRlICovCisjZGVmaW5lIEdNQUNfTUlJX0FERFJfQlVTWQkweDAwMDAwMDAxCS8qIE1JSSBCdXN5ICovCisvKiBHTUFDIEZMT1cgQ1RSTCBkZWZpbmVzICovCisjZGVmaW5lIEdNQUNfRkxPV19DVFJMX1BUX01BU0sJMHhmZmZmMDAwMAkvKiBQYXVzZSBUaW1lIE1hc2sgKi8KKyNkZWZpbmUgR01BQ19GTE9XX0NUUkxfUFRfU0hJRlQJMTYKKyNkZWZpbmUgR01BQ19GTE9XX0NUUkxfUkZFCTB4MDAwMDAwMDQJLyogUnggRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSBHTUFDX0ZMT1dfQ1RSTF9URkUJMHgwMDAwMDAwMgkvKiBUeCBGbG93IENvbnRyb2wgRW5hYmxlICovCisjZGVmaW5lIEdNQUNfRkxPV19DVFJMX0ZDQl9CUEEJMHgwMDAwMDAwMQkvKiBGbG93IENvbnRyb2wgQnVzeSAuLi4gKi8KKworLyotLS0gRE1BIEJMT0NLIGRlZmluZXMgLS0tKi8KKy8qIERNQSBCdXMgTW9kZSByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIERNQV9CVVNfTU9ERV9TRlRfUkVTRVQJMHgwMDAwMDAwMQkvKiBTb2Z0d2FyZSBSZXNldCAqLworI2RlZmluZSBETUFfQlVTX01PREVfREEJCTB4MDAwMDAwMDIJLyogQXJiaXRyYXRpb24gc2NoZW1lICovCisjZGVmaW5lIERNQV9CVVNfTU9ERV9EU0xfTUFTSwkweDAwMDAwMDdjCS8qIERlc2NyaXB0b3IgU2tpcCBMZW5ndGggKi8KKyNkZWZpbmUgRE1BX0JVU19NT0RFX0RTTF9TSElGVAkyCS8qICAgKGluIERXT1JEUykgICAgICAqLworLyogUHJvZ3JhbW1hYmxlIGJ1cnN0IGxlbmd0aCAocGFzc2VkIHRob3J1Z2ggcGxhdGZvcm0pKi8KKyNkZWZpbmUgRE1BX0JVU19NT0RFX1BCTF9NQVNLCTB4MDAwMDNmMDAJLyogUHJvZ3JhbW1hYmxlIEJ1cnN0IExlbiAqLworI2RlZmluZSBETUFfQlVTX01PREVfUEJMX1NISUZUCTgKKworZW51bSByeF90eF9wcmlvcml0eV9yYXRpbyB7CisJZG91YmxlX3JhdGlvID0gMHgwMDAwNDAwMCwJLyoyOjEgKi8KKwl0cmlwbGVfcmF0aW8gPSAweDAwMDA4MDAwLAkvKjM6MSAqLworCXF1YWRydXBsZV9yYXRpbyA9IDB4MDAwMGMwMDAsCS8qNDoxICovCit9OworCisjZGVmaW5lIERNQV9CVVNfTU9ERV9GQgkJMHgwMDAxMDAwMAkvKiBGaXhlZCBidXJzdCAqLworI2RlZmluZSBETUFfQlVTX01PREVfUlBCTF9NQVNLCTB4MDAzZTAwMDAJLyogUngtUHJvZ3JhbW1hYmxlIEJ1cnN0IExlbiAqLworI2RlZmluZSBETUFfQlVTX01PREVfUlBCTF9TSElGVAkxNworI2RlZmluZSBETUFfQlVTX01PREVfVVNQCTB4MDA4MDAwMDAKKyNkZWZpbmUgRE1BX0JVU19NT0RFXzRQQkwJMHgwMTAwMDAwMAorI2RlZmluZSBETUFfQlVTX01PREVfQUFMCTB4MDIwMDAwMDAKKworLyogRE1BIENSUyBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgTWFwcGluZyAqLworI2RlZmluZSBETUFfSE9TVF9UWF9ERVNDCSAgMHgwMDAwMTA0OAkvKiBDdXJyZW50IEhvc3QgVHggZGVzY3JpcHRvciAqLworI2RlZmluZSBETUFfSE9TVF9SWF9ERVNDCSAgMHgwMDAwMTA0YwkvKiBDdXJyZW50IEhvc3QgUnggZGVzY3JpcHRvciAqLworLyogIERNQSBCdXMgTW9kZSByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIERNQV9CVVNfUFJfUkFUSU9fTUFTSwkgIDB4MDAwMGMwMDAJLyogUngvVHggcHJpb3JpdHkgcmF0aW8gKi8KKyNkZWZpbmUgRE1BX0JVU19QUl9SQVRJT19TSElGVAkgIDE0CisjZGVmaW5lIERNQV9CVVNfRkIJICAJICAweDAwMDEwMDAwCS8qIEZpeGVkIEJ1cnN0ICovCisKKy8qIERNQSBvcGVyYXRpb24gbW9kZSBkZWZpbmVzIChzdGFydC9zdG9wIHR4L3J4IGFyZSBwbGFjZWQgaW4gY29tbW9uIGhlYWRlcikqLworI2RlZmluZSBETUFfQ09OVFJPTF9EVAkJMHgwNDAwMDAwMCAvKiBEaXNhYmxlIERyb3AgVENQL0lQIGNzdW0gZXJyb3IgKi8KKyNkZWZpbmUgRE1BX0NPTlRST0xfUlNGCQkweDAyMDAwMDAwIC8qIFJlY2VpdmUgU3RvcmUgYW5kIEZvcndhcmQgKi8KKyNkZWZpbmUgRE1BX0NPTlRST0xfREZGCQkweDAxMDAwMDAwIC8qIERpc2FhYmxlIGZsdXNoaW5nICovCisvKiBUaGVzaG9sZCBmb3IgQWN0aXZhdGluZyB0aGUgRkMgKi8KK2VudW0gcmZhIHsKKwlhY3RfZnVsbF9taW51c18xID0gMHgwMDgwMDAwMCwKKwlhY3RfZnVsbF9taW51c18yID0gMHgwMDgwMDIwMCwKKwlhY3RfZnVsbF9taW51c18zID0gMHgwMDgwMDQwMCwKKwlhY3RfZnVsbF9taW51c180ID0gMHgwMDgwMDYwMCwKK307CisvKiBUaGVzaG9sZCBmb3IgRGVhY3RpdmF0aW5nIHRoZSBGQyAqLworZW51bSByZmQgeworCWRlYWNfZnVsbF9taW51c18xID0gMHgwMDQwMDAwMCwKKwlkZWFjX2Z1bGxfbWludXNfMiA9IDB4MDA0MDA4MDAsCisJZGVhY19mdWxsX21pbnVzXzMgPSAweDAwNDAxMDAwLAorCWRlYWNfZnVsbF9taW51c180ID0gMHgwMDQwMTgwMCwKK307CisjZGVmaW5lIERNQV9DT05UUk9MX1RTRgkJMHgwMDIwMDAwMCAvKiBUcmFuc21pdCAgU3RvcmUgYW5kIEZvcndhcmQgKi8KKyNkZWZpbmUgRE1BX0NPTlRST0xfRlRGCQkweDAwMTAwMDAwIC8qIEZsdXNoIHRyYW5zbWl0IEZJRk8gKi8KKworZW51bSB0dGNfY29udHJvbCB7CisJRE1BX0NPTlRST0xfVFRDXzY0ID0gMHgwMDAwMDAwMCwKKwlETUFfQ09OVFJPTF9UVENfMTI4ID0gMHgwMDAwNDAwMCwKKwlETUFfQ09OVFJPTF9UVENfMTkyID0gMHgwMDAwODAwMCwKKwlETUFfQ09OVFJPTF9UVENfMjU2ID0gMHgwMDAwYzAwMCwKKwlETUFfQ09OVFJPTF9UVENfNDAgPSAweDAwMDEwMDAwLAorCURNQV9DT05UUk9MX1RUQ18zMiA9IDB4MDAwMTQwMDAsCisJRE1BX0NPTlRST0xfVFRDXzI0ID0gMHgwMDAxODAwMCwKKwlETUFfQ09OVFJPTF9UVENfMTYgPSAweDAwMDFjMDAwLAorfTsKKyNkZWZpbmUgRE1BX0NPTlRST0xfVENfVFhfTUFTSwkweGZmZmUzZmZmCisKKyNkZWZpbmUgRE1BX0NPTlRST0xfRUZDCQkweDAwMDAwMTAwCisjZGVmaW5lIERNQV9DT05UUk9MX0ZFRgkJMHgwMDAwMDA4MAorI2RlZmluZSBETUFfQ09OVFJPTF9GVUYJCTB4MDAwMDAwNDAKKworZW51bSBydGNfY29udHJvbCB7CisJRE1BX0NPTlRST0xfUlRDXzY0ID0gMHgwMDAwMDAwMCwKKwlETUFfQ09OVFJPTF9SVENfMzIgPSAweDAwMDAwMDA4LAorCURNQV9DT05UUk9MX1JUQ185NiA9IDB4MDAwMDAwMTAsCisJRE1BX0NPTlRST0xfUlRDXzEyOCA9IDB4MDAwMDAwMTgsCit9OworI2RlZmluZSBETUFfQ09OVFJPTF9UQ19SWF9NQVNLCTB4ZmZmZmZmZTcKKworI2RlZmluZSBETUFfQ09OVFJPTF9PU0YJMHgwMDAwMDAwNAkvKiBPcGVyYXRlIG9uIHNlY29uZCBmcmFtZSAqLworCisvKiBNTUMgcmVnaXN0ZXJzIG9mZnNldCAqLworI2RlZmluZSBHTUFDX01NQ19DVFJMICAgICAgMHgxMDAKKyNkZWZpbmUgR01BQ19NTUNfUlhfSU5UUiAgIDB4MTA0CisjZGVmaW5lIEdNQUNfTU1DX1RYX0lOVFIgICAweDEwOAorI2RlZmluZSBHTUFDX01NQ19SWF9DU1VNX09GRkxPQUQgICAweDIwOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL21hYzEwMC5jIGIvZHJpdmVycy9uZXQvc3RtbWFjL21hYzEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTE3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvbWFjMTAwLmMKQEAgLTAsMCArMSw1MTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIE1BQyAxMC8xMDAgb24tY2hpcCBFdGhlcm5ldCBjb250cm9sbGVyCisgIGN1cnJlbnRseSB0ZXN0ZWQgb24gYWxsIHRoZSBTVCBib2FyZHMgYmFzZWQgb24gU1RiNzEwOSBhbmQgc3R4NzIwMCBTb0NzLgorCisgIERXQyBFdGhlciBNQUMgMTAvMTAwIFVuaXZlcnNhbCB2ZXJzaW9uIDQuMCBoYXMgYmVlbiB1c2VkIGZvciBkZXZlbG9waW5nCisgIHRoaXMgY29kZS4KKworICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSAgU1RNaWNyb2VsZWN0cm9uaWNzIEx0ZAorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorCisgIEF1dGhvcjogR2l1c2VwcGUgQ2F2YWxsYXJvIDxwZXBwZS5jYXZhbGxhcm9Ac3QuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJtYWMxMDAuaCIKKworI3VuZGVmIE1BQzEwMF9ERUJVRworLyojZGVmaW5lIE1BQzEwMF9ERUJVRyovCisjaWZkZWYgTUFDMTAwX0RFQlVHCisjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pICBwcmludGsoZm10LCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtdCwgYXJncy4uLikgIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBtYWMxMDBfY29yZV9pbml0KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIE1BQ19DT05UUk9MKTsKKworCXdyaXRlbCgodmFsdWUgfCBNQUNfQ09SRV9JTklUKSwgaW9hZGRyICsgTUFDX0NPTlRST0wpOworCisjaWZkZWYgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKKwl3cml0ZWwoRVRIX1BfODAyMVEsIGlvYWRkciArIE1BQ19WTEFOMSk7CisjZW5kaWYKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9kdW1wX21hY19yZWdzKHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXByX2luZm8oIlx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCSAgICAgICAiXHQgIE1BQzEwMCBDU1IgKGJhc2UgYWRkciA9IDB4JTh4KVxuIgorCSAgICAgICAiXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWlvYWRkcik7CisJcHJfaW5mbygiXHRjb250cm9sIHJlZyAob2Zmc2V0IDB4JXgpOiAweCUwOHhcbiIsIE1BQ19DT05UUk9MLAorCSAgICAgICByZWFkbChpb2FkZHIgKyBNQUNfQ09OVFJPTCkpOworCXByX2luZm8oIlx0YWRkciBISSAob2Zmc2V0IDB4JXgpOiAweCUwOHhcbiAiLCBNQUNfQUREUl9ISUdILAorCSAgICAgICByZWFkbChpb2FkZHIgKyBNQUNfQUREUl9ISUdIKSk7CisJcHJfaW5mbygiXHRhZGRyIExPIChvZmZzZXQgMHgleCk6IDB4JTA4eFxuIiwgTUFDX0FERFJfTE9XLAorCSAgICAgICByZWFkbChpb2FkZHIgKyBNQUNfQUREUl9MT1cpKTsKKwlwcl9pbmZvKCJcdG11bHRpY2FzdCBoYXNoIEhJIChvZmZzZXQgMHgleCk6IDB4JTA4eFxuIiwKKwkJCU1BQ19IQVNIX0hJR0gsIHJlYWRsKGlvYWRkciArIE1BQ19IQVNIX0hJR0gpKTsKKwlwcl9pbmZvKCJcdG11bHRpY2FzdCBoYXNoIExPIChvZmZzZXQgMHgleCk6IDB4JTA4eFxuIiwKKwkJCU1BQ19IQVNIX0xPVywgcmVhZGwoaW9hZGRyICsgTUFDX0hBU0hfTE9XKSk7CisJcHJfaW5mbygiXHRmbG93IGNvbnRyb2wgKG9mZnNldCAweCV4KTogMHglMDh4XG4iLAorCQlNQUNfRkxPV19DVFJMLCByZWFkbChpb2FkZHIgKyBNQUNfRkxPV19DVFJMKSk7CisJcHJfaW5mbygiXHRWTEFOMSB0YWcgKG9mZnNldCAweCV4KTogMHglMDh4XG4iLCBNQUNfVkxBTjEsCisJICAgICAgIHJlYWRsKGlvYWRkciArIE1BQ19WTEFOMSkpOworCXByX2luZm8oIlx0VkxBTjIgdGFnIChvZmZzZXQgMHgleCk6IDB4JTA4eFxuIiwgTUFDX1ZMQU4yLAorCSAgICAgICByZWFkbChpb2FkZHIgKyBNQUNfVkxBTjIpKTsKKwlwcl9pbmZvKCJcblx0TUFDIG1hbmFnZW1lbnQgY291bnRlciByZWdpc3RlcnNcbiIpOworCXByX2luZm8oIlx0IE1NQyBjcnRsIChvZmZzZXQgMHgleCk6IDB4JTA4eFxuIiwKKwkgICAgICAgTU1DX0NPTlRST0wsIHJlYWRsKGlvYWRkciArIE1NQ19DT05UUk9MKSk7CisJcHJfaW5mbygiXHQgTU1DIEhpZ2ggSW50ZXJydXB0IChvZmZzZXQgMHgleCk6IDB4JTA4eFxuIiwKKwkgICAgICAgTU1DX0hJR0hfSU5UUiwgcmVhZGwoaW9hZGRyICsgTU1DX0hJR0hfSU5UUikpOworCXByX2luZm8oIlx0IE1NQyBMb3cgSW50ZXJydXB0IChvZmZzZXQgMHgleCk6IDB4JTA4eFxuIiwKKwkgICAgICAgTU1DX0xPV19JTlRSLCByZWFkbChpb2FkZHIgKyBNTUNfTE9XX0lOVFIpKTsKKwlwcl9pbmZvKCJcdCBNTUMgSGlnaCBJbnRlcnJ1cHQgTWFzayAob2Zmc2V0IDB4JXgpOiAweCUwOHhcbiIsCisJICAgICAgIE1NQ19ISUdIX0lOVFJfTUFTSywgcmVhZGwoaW9hZGRyICsgTU1DX0hJR0hfSU5UUl9NQVNLKSk7CisJcHJfaW5mbygiXHQgTU1DIExvdyBJbnRlcnJ1cHQgTWFzayAob2Zmc2V0IDB4JXgpOiAweCUwOHhcbiIsCisJICAgICAgIE1NQ19MT1dfSU5UUl9NQVNLLCByZWFkbChpb2FkZHIgKyBNTUNfTE9XX0lOVFJfTUFTSykpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBtYWMxMDBfZG1hX2luaXQodW5zaWduZWQgbG9uZyBpb2FkZHIsIGludCBwYmwsIHUzMiBkbWFfdHgsCisJCQkgICB1MzIgZG1hX3J4KQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIERNQV9CVVNfTU9ERSk7CisJLyogRE1BIFNXIHJlc2V0ICovCisJdmFsdWUgfD0gRE1BX0JVU19NT0RFX1NGVF9SRVNFVDsKKwl3cml0ZWwodmFsdWUsIGlvYWRkciArIERNQV9CVVNfTU9ERSk7CisJZG8ge30gd2hpbGUgKChyZWFkbChpb2FkZHIgKyBETUFfQlVTX01PREUpICYgRE1BX0JVU19NT0RFX1NGVF9SRVNFVCkpOworCisJLyogRW5hYmxlIEFwcGxpY2F0aW9uIEFjY2VzcyBieSB3cml0aW5nIHRvIERNQSBDU1IwICovCisJd3JpdGVsKERNQV9CVVNfTU9ERV9ERUZBVUxUIHwgKHBibCA8PCBETUFfQlVTX01PREVfUEJMX1NISUZUKSwKKwkgICAgICAgaW9hZGRyICsgRE1BX0JVU19NT0RFKTsKKworCS8qIE1hc2sgaW50ZXJydXB0cyBieSB3cml0aW5nIHRvIENTUjcgKi8KKwl3cml0ZWwoRE1BX0lOVFJfREVGQVVMVF9NQVNLLCBpb2FkZHIgKyBETUFfSU5UUl9FTkEpOworCisJLyogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgUlgvVFggZGVzY3JpcHRvciBsaXN0cyBtdXN0IGJlIHdyaXR0ZW4gaW50bworCSAqIERNQSBDU1IzIGFuZCBDU1I0LCByZXNwZWN0aXZlbHkuICovCisJd3JpdGVsKGRtYV90eCwgaW9hZGRyICsgRE1BX1RYX0JBU0VfQUREUik7CisJd3JpdGVsKGRtYV9yeCwgaW9hZGRyICsgRE1BX1JDVl9CQVNFX0FERFIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFN0b3JlIGFuZCBGb3J3YXJkIGNhcGFiaWxpdHkgaXMgbm90IHVzZWQgYXQgYWxsLi4KKyAqIFRoZSB0cmFuc21pdCB0aHJlc2hvbGQgY2FuIGJlIHByb2dyYW1tZWQgYnkKKyAqIHNldHRpbmcgdGhlIFRUQyBiaXRzIGluIHRoZSBETUEgY29udHJvbCByZWdpc3Rlci4qLworc3RhdGljIHZvaWQgbWFjMTAwX2RtYV9vcGVyYXRpb25fbW9kZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IHR4bW9kZSwKKwkJCQkgICAgICBpbnQgcnhtb2RlKQoreworCXUzMiBjc3I2ID0gcmVhZGwoaW9hZGRyICsgRE1BX0NPTlRST0wpOworCisJaWYgKHR4bW9kZSA8PSAzMikKKwkJY3NyNiB8PSBETUFfQ09OVFJPTF9UVENfMzI7CisJZWxzZSBpZiAodHhtb2RlIDw9IDY0KQorCQljc3I2IHw9IERNQV9DT05UUk9MX1RUQ182NDsKKwllbHNlCisJCWNzcjYgfD0gRE1BX0NPTlRST0xfVFRDXzEyODsKKworCXdyaXRlbChjc3I2LCBpb2FkZHIgKyBETUFfQ09OVFJPTCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9kdW1wX2RtYV9yZWdzKHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCWludCBpOworCisJREJHKEtFUk5fREVCVUcgIk1BQzEwMCBETUEgQ1NSIFxuIik7CisJZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKwkJcHJfZGVidWcoIlx0IENTUiVkIChvZmZzZXQgMHgleCk6IDB4JTA4eFxuIiwgaSwKKwkJICAgICAgIChETUFfQlVTX01PREUgKyBpICogNCksCisJCSAgICAgICByZWFkbChpb2FkZHIgKyBETUFfQlVTX01PREUgKyBpICogNCkpOworCURCRyhLRVJOX0RFQlVHICJcdCBDU1IyMCAob2Zmc2V0IDB4JXgpOiAweCUwOHhcbiIsCisJICAgIERNQV9DVVJfVFhfQlVGX0FERFIsIHJlYWRsKGlvYWRkciArIERNQV9DVVJfVFhfQlVGX0FERFIpKTsKKwlEQkcoS0VSTl9ERUJVRyAiXHQgQ1NSMjEgKG9mZnNldCAweCV4KTogMHglMDh4XG4iLAorCSAgICBETUFfQ1VSX1JYX0JVRl9BRERSLCByZWFkbChpb2FkZHIgKyBETUFfQ1VSX1JYX0JVRl9BRERSKSk7CisJcmV0dXJuOworfQorCisvKiBETUEgY29udHJvbGxlciBoYXMgdHdvIGNvdW50ZXJzIHRvIHRyYWNrIHRoZSBudW1iZXIgb2YKKyAgIHRoZSByZWNlaXZlIG1pc3NlZCBmcmFtZXMuICovCitzdGF0aWMgdm9pZCBtYWMxMDBfZG1hX2RpYWdub3N0aWNfZnIodm9pZCAqZGF0YSwgc3RydWN0IHN0bW1hY19leHRyYV9zdGF0cyAqeCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKWRhdGE7CisJdTMyIGNzcjggPSByZWFkbChpb2FkZHIgKyBETUFfTUlTU0VEX0ZSQU1FX0NUUik7CisKKwlpZiAodW5saWtlbHkoY3NyOCkpIHsKKwkJaWYgKGNzcjggJiBETUFfTUlTU0VEX0ZSQU1FX09WRSkgeworCQkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzICs9IDB4ODAwOworCQkJeC0+cnhfb3ZlcmZsb3dfY250ciArPSAweDgwMDsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGludCBvdmVfY250cjsKKwkJCW92ZV9jbnRyID0gKChjc3I4ICYgRE1BX01JU1NFRF9GUkFNRV9PVkVfQ05UUikgPj4gMTcpOworCQkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzICs9IG92ZV9jbnRyOworCQkJeC0+cnhfb3ZlcmZsb3dfY250ciArPSBvdmVfY250cjsKKwkJfQorCisJCWlmIChjc3I4ICYgRE1BX01JU1NFRF9GUkFNRV9PVkVfTSkgeworCQkJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgKz0gMHhmZmZmOworCQkJeC0+cnhfbWlzc2VkX2NudHIgKz0gMHhmZmZmOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IG1pc3NfZiA9IChjc3I4ICYgRE1BX01JU1NFRF9GUkFNRV9NX0NOVFIpOworCQkJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgKz0gbWlzc19mOworCQkJeC0+cnhfbWlzc2VkX2NudHIgKz0gbWlzc19mOworCQl9CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBtYWMxMDBfZ2V0X3R4X2ZyYW1lX3N0YXR1cyh2b2lkICpkYXRhLCBzdHJ1Y3Qgc3RtbWFjX2V4dHJhX3N0YXRzICp4LAorCQkJCSAgICAgIHN0cnVjdCBkbWFfZGVzYyAqcCwgdW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopZGF0YTsKKworCWlmICh1bmxpa2VseShwLT5kZXMwMS50eC5lcnJvcl9zdW1tYXJ5KSkgeworCQlpZiAodW5saWtlbHkocC0+ZGVzMDEudHgudW5kZXJmbG93X2Vycm9yKSkgeworCQkJeC0+dHhfdW5kZXJmbG93Kys7CisJCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMrKzsKKwkJfQorCQlpZiAodW5saWtlbHkocC0+ZGVzMDEudHgubm9fY2FycmllcikpIHsKKwkJCXgtPnR4X2NhcnJpZXIrKzsKKwkJCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOworCQl9CisJCWlmICh1bmxpa2VseShwLT5kZXMwMS50eC5sb3NzX2NhcnJpZXIpKSB7CisJCQl4LT50eF9sb3NzY2FycmllcisrOworCQkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCX0KKwkJaWYgKHVubGlrZWx5KChwLT5kZXMwMS50eC5leGNlc3NpdmVfZGVmZXJyYWwpIHx8CisJCQkgICAgIChwLT5kZXMwMS50eC5leGNlc3NpdmVfY29sbGlzaW9ucykgfHwKKwkJCSAgICAgKHAtPmRlczAxLnR4LmxhdGVfY29sbGlzaW9uKSkpCisJCQlzdGF0cy0+Y29sbGlzaW9ucyArPSBwLT5kZXMwMS50eC5jb2xsaXNpb25fY291bnQ7CisJCXJldCA9IC0xOworCX0KKwlpZiAodW5saWtlbHkocC0+ZGVzMDEudHguaGVhcnRiZWF0X2ZhaWwpKSB7CisJCXgtPnR4X2hlYXJ0YmVhdCsrOworCQlzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQlyZXQgPSAtMTsKKwl9CisJaWYgKHVubGlrZWx5KHAtPmRlczAxLnR4LmRlZmVycmVkKSkKKwkJeC0+dHhfZGVmZXJyZWQrKzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWFjMTAwX2dldF90eF9sZW4oc3RydWN0IGRtYV9kZXNjICpwKQoreworCXJldHVybiBwLT5kZXMwMS50eC5idWZmZXIxX3NpemU7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgaWYgZWFjaCBpbmNvbWluZyBmcmFtZSBoYXMgc29tZSBlcnJvcnMKKyAqIGFuZCwgaWYgcmVxdWlyZWQsIHVwZGF0ZXMgdGhlIG11bHRpY2FzdCBzdGF0aXN0aWNzLgorICogSW4gY2FzZSBvZiBzdWNjZXNzLCBpdCByZXR1cm5zIGNzdW1fbm9uZSBiZWNhc3VlIHRoZSBkZXZpY2UKKyAqIGlzIG5vdCBhYmxlIHRvIGNvbXB1dGUgdGhlIGNzdW0gaW4gSFcuICovCitzdGF0aWMgaW50IG1hYzEwMF9nZXRfcnhfZnJhbWVfc3RhdHVzKHZvaWQgKmRhdGEsIHN0cnVjdCBzdG1tYWNfZXh0cmFfc3RhdHMgKngsCisJCQkJICAgICAgc3RydWN0IGRtYV9kZXNjICpwKQoreworCWludCByZXQgPSBjc3VtX25vbmU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopZGF0YTsKKworCWlmICh1bmxpa2VseShwLT5kZXMwMS5yeC5sYXN0X2Rlc2NyaXB0b3IgPT0gMCkpIHsKKwkJcHJfd2FybmluZygibWFjMTAwIEVycm9yOiBPdmVyc2l6ZWQgRXRoZXJuZXQgIgorCQkJICAgImZyYW1lIHNwYW5uZWQgbXVsdGlwbGUgYnVmZmVyc1xuIik7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXJldHVybiBkaXNjYXJkX2ZyYW1lOworCX0KKworCWlmICh1bmxpa2VseShwLT5kZXMwMS5yeC5lcnJvcl9zdW1tYXJ5KSkgeworCQlpZiAodW5saWtlbHkocC0+ZGVzMDEucnguZGVzY3JpcHRvcl9lcnJvcikpCisJCQl4LT5yeF9kZXNjKys7CisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5yeC5wYXJ0aWFsX2ZyYW1lX2Vycm9yKSkKKwkJCXgtPnJ4X3BhcnRpYWwrKzsKKwkJaWYgKHVubGlrZWx5KHAtPmRlczAxLnJ4LnJ1bl9mcmFtZSkpCisJCQl4LT5yeF9ydW50Kys7CisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5yeC5mcmFtZV90b29fbG9uZykpCisJCQl4LT5yeF90b29sb25nKys7CisJCWlmICh1bmxpa2VseShwLT5kZXMwMS5yeC5jb2xsaXNpb24pKSB7CisJCQl4LT5yeF9jb2xsaXNpb24rKzsKKwkJCXN0YXRzLT5jb2xsaXNpb25zKys7CisJCX0KKwkJaWYgKHVubGlrZWx5KHAtPmRlczAxLnJ4LmNyY19lcnJvcikpIHsKKwkJCXgtPnJ4X2NyYysrOworCQkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJfQorCQlyZXQgPSBkaXNjYXJkX2ZyYW1lOworCX0KKwlpZiAodW5saWtlbHkocC0+ZGVzMDEucnguZHJpYmJsaW5nKSkKKwkJcmV0ID0gZGlzY2FyZF9mcmFtZTsKKworCWlmICh1bmxpa2VseShwLT5kZXMwMS5yeC5sZW5ndGhfZXJyb3IpKSB7CisJCXgtPnJ4X2xlbmdodCsrOworCQlyZXQgPSBkaXNjYXJkX2ZyYW1lOworCX0KKwlpZiAodW5saWtlbHkocC0+ZGVzMDEucngubWlpX2Vycm9yKSkgeworCQl4LT5yeF9taWkrKzsKKwkJcmV0ID0gZGlzY2FyZF9mcmFtZTsKKwl9CisJaWYgKHAtPmRlczAxLnJ4Lm11bHRpY2FzdF9mcmFtZSkgeworCQl4LT5yeF9tdWx0aWNhc3QrKzsKKwkJc3RhdHMtPm11bHRpY2FzdCsrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtYWMxMDBfaXJxX3N0YXR1cyh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9zZXRfdW1hY19hZGRyKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1bnNpZ25lZCBjaGFyICphZGRyLAorCQkJICB1bnNpZ25lZCBpbnQgcmVnX24pCit7CisJc3RtbWFjX3NldF9tYWNfYWRkcihpb2FkZHIsIGFkZHIsIE1BQ19BRERSX0hJR0gsIE1BQ19BRERSX0xPVyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9nZXRfdW1hY19hZGRyKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1bnNpZ25lZCBjaGFyICphZGRyLAorCQkJICB1bnNpZ25lZCBpbnQgcmVnX24pCit7CisJc3RtbWFjX2dldF9tYWNfYWRkcihpb2FkZHIsIGFkZHIsIE1BQ19BRERSX0hJR0gsIE1BQ19BRERSX0xPVyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9zZXRfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MzIgdmFsdWUgPSByZWFkbChpb2FkZHIgKyBNQUNfQ09OVFJPTCk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXZhbHVlIHw9IE1BQ19DT05UUk9MX1BSOworCQl2YWx1ZSAmPSB+KE1BQ19DT05UUk9MX1BNIHwgTUFDX0NPTlRST0xfSUYgfCBNQUNfQ09OVFJPTF9ITyB8CisJCQkgICBNQUNfQ09OVFJPTF9IUCk7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IEhBU0hfVEFCTEVfU0laRSkKKwkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCXZhbHVlIHw9IE1BQ19DT05UUk9MX1BNOworCQl2YWx1ZSAmPSB+KE1BQ19DT05UUk9MX1BSIHwgTUFDX0NPTlRST0xfSUYgfCBNQUNfQ09OVFJPTF9ITyk7CisJCXdyaXRlbCgweGZmZmZmZmZmLCBpb2FkZHIgKyBNQUNfSEFTSF9ISUdIKTsKKwkJd3JpdGVsKDB4ZmZmZmZmZmYsIGlvYWRkciArIE1BQ19IQVNIX0xPVyk7CisJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID09IDApIHsJLyogbm8gbXVsdGljYXN0ICovCisJCXZhbHVlICY9IH4oTUFDX0NPTlRST0xfUE0gfCBNQUNfQ09OVFJPTF9QUiB8IE1BQ19DT05UUk9MX0lGIHwKKwkJCSAgIE1BQ19DT05UUk9MX0hPIHwgTUFDX0NPTlRST0xfSFApOworCX0gZWxzZSB7CisJCWludCBpOworCQl1MzIgbWNfZmlsdGVyWzJdOworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKworCQkvKiBQZXJmZWN0IGZpbHRlciBtb2RlIGZvciBwaHlzaWNhbCBhZGRyZXNzIGFuZCBIYXNoCisJCSAgIGZpbHRlciBmb3IgbXVsdGljYXN0ICovCisJCXZhbHVlIHw9IE1BQ19DT05UUk9MX0hQOworCQl2YWx1ZSAmPSB+KE1BQ19DT05UUk9MX1BNIHwgTUFDX0NPTlRST0xfUFIgfCBNQUNfQ09OVFJPTF9JRgorCQkJICAgfCBNQUNfQ09OVFJPTF9ITyk7CisKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7CisJCSAgICAgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OyBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJLyogVGhlIHVwcGVyIDYgYml0cyBvZiB0aGUgY2FsY3VsYXRlZCBDUkMgYXJlIHVzZWQgdG8KKwkJCSAqIGluZGV4IHRoZSBjb250ZW5zIG9mIHRoZSBoYXNoIHRhYmxlICovCisJCQlpbnQgYml0X25yID0KKwkJCSAgICBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCQkJLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGRldGVybWluZXMgdGhlIHJlZ2lzdGVyIHRvCisJCQkgKiB1c2UgKEgvTCkgd2hpbGUgdGhlIG90aGVyIDUgYml0cyBkZXRlcm1pbmUgdGhlIGJpdAorCQkJICogd2l0aGluIHRoZSByZWdpc3Rlci4gKi8KKwkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworCQl9CisJCXdyaXRlbChtY19maWx0ZXJbMF0sIGlvYWRkciArIE1BQ19IQVNIX0xPVyk7CisJCXdyaXRlbChtY19maWx0ZXJbMV0sIGlvYWRkciArIE1BQ19IQVNIX0hJR0gpOworCX0KKworCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgTUFDX0NPTlRST0wpOworCisJREJHKEtFUk5fSU5GTyAiJXM6IENUUkwgcmVnOiAweCUwOHggSGFzaCByZWdzOiAiCisJICAgICJISSAweCUwOHgsIExPIDB4JTA4eFxuIiwKKwkgICAgX19mdW5jX18sIHJlYWRsKGlvYWRkciArIE1BQ19DT05UUk9MKSwKKwkgICAgcmVhZGwoaW9hZGRyICsgTUFDX0hBU0hfSElHSCksIHJlYWRsKGlvYWRkciArIE1BQ19IQVNIX0xPVykpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbWFjMTAwX2Zsb3dfY3RybCh1bnNpZ25lZCBsb25nIGlvYWRkciwgdW5zaWduZWQgaW50IGR1cGxleCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGZjLCB1bnNpZ25lZCBpbnQgcGF1c2VfdGltZSkKK3sKKwl1bnNpZ25lZCBpbnQgZmxvdyA9IE1BQ19GTE9XX0NUUkxfRU5BQkxFOworCisJaWYgKGR1cGxleCkKKwkJZmxvdyB8PSAocGF1c2VfdGltZSA8PCBNQUNfRkxPV19DVFJMX1BUX1NISUZUKTsKKwl3cml0ZWwoZmxvdywgaW9hZGRyICsgTUFDX0ZMT1dfQ1RSTCk7CisKKwlyZXR1cm47Cit9CisKKy8qIE5vIFBNVCBtb2R1bGUgc3VwcG9ydGVkIGluIG91ciBTb0MgIGZvciB0aGUgRXRoZXJuZXQgQ29udHJvbGxlci4gKi8KK3N0YXRpYyB2b2lkIG1hYzEwMF9wbXQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9pbml0X3J4X2Rlc2Moc3RydWN0IGRtYV9kZXNjICpwLCB1bnNpZ25lZCBpbnQgcmluZ19zaXplLAorCQkJCWludCBkaXNhYmxlX3J4X2ljKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCByaW5nX3NpemU7IGkrKykgeworCQlwLT5kZXMwMS5yeC5vd24gPSAxOworCQlwLT5kZXMwMS5yeC5idWZmZXIxX3NpemUgPSBCVUZfU0laRV8yS2lCIC0gMTsKKwkJaWYgKGkgPT0gcmluZ19zaXplIC0gMSkKKwkJCXAtPmRlczAxLnJ4LmVuZF9yaW5nID0gMTsKKwkJaWYgKGRpc2FibGVfcnhfaWMpCisJCQlwLT5kZXMwMS5yeC5kaXNhYmxlX2ljID0gMTsKKwkJcCsrOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9pbml0X3R4X2Rlc2Moc3RydWN0IGRtYV9kZXNjICpwLCB1bnNpZ25lZCBpbnQgcmluZ19zaXplKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCByaW5nX3NpemU7IGkrKykgeworCQlwLT5kZXMwMS50eC5vd24gPSAwOworCQlpZiAoaSA9PSByaW5nX3NpemUgLSAxKQorCQkJcC0+ZGVzMDEudHguZW5kX3JpbmcgPSAxOworCQlwKys7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBtYWMxMDBfZ2V0X3R4X293bmVyKHN0cnVjdCBkbWFfZGVzYyAqcCkKK3sKKwlyZXR1cm4gcC0+ZGVzMDEudHgub3duOworfQorCitzdGF0aWMgaW50IG1hYzEwMF9nZXRfcnhfb3duZXIoc3RydWN0IGRtYV9kZXNjICpwKQoreworCXJldHVybiBwLT5kZXMwMS5yeC5vd247Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9zZXRfdHhfb3duZXIoc3RydWN0IGRtYV9kZXNjICpwKQoreworCXAtPmRlczAxLnR4Lm93biA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9zZXRfcnhfb3duZXIoc3RydWN0IGRtYV9kZXNjICpwKQoreworCXAtPmRlczAxLnJ4Lm93biA9IDE7Cit9CisKK3N0YXRpYyBpbnQgbWFjMTAwX2dldF90eF9scyhzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJcmV0dXJuIHAtPmRlczAxLnR4Lmxhc3Rfc2VnbWVudDsKK30KKworc3RhdGljIHZvaWQgbWFjMTAwX3JlbGVhc2VfdHhfZGVzYyhzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJaW50IHRlciA9IHAtPmRlczAxLnR4LmVuZF9yaW5nOworCisJLyogY2xlYW4gZmllbGQgdXNlZCB3aXRoaW4gdGhlIHhtaXQgKi8KKwlwLT5kZXMwMS50eC5maXJzdF9zZWdtZW50ID0gMDsKKwlwLT5kZXMwMS50eC5sYXN0X3NlZ21lbnQgPSAwOworCXAtPmRlczAxLnR4LmJ1ZmZlcjFfc2l6ZSA9IDA7CisKKwkvKiBjbGVhbiBzdGF0dXMgcmVwb3J0ZWQgKi8KKwlwLT5kZXMwMS50eC5lcnJvcl9zdW1tYXJ5ID0gMDsKKwlwLT5kZXMwMS50eC51bmRlcmZsb3dfZXJyb3IgPSAwOworCXAtPmRlczAxLnR4Lm5vX2NhcnJpZXIgPSAwOworCXAtPmRlczAxLnR4Lmxvc3NfY2FycmllciA9IDA7CisJcC0+ZGVzMDEudHguZXhjZXNzaXZlX2RlZmVycmFsID0gMDsKKwlwLT5kZXMwMS50eC5leGNlc3NpdmVfY29sbGlzaW9ucyA9IDA7CisJcC0+ZGVzMDEudHgubGF0ZV9jb2xsaXNpb24gPSAwOworCXAtPmRlczAxLnR4LmhlYXJ0YmVhdF9mYWlsID0gMDsKKwlwLT5kZXMwMS50eC5kZWZlcnJlZCA9IDA7CisKKwkvKiBzZXQgdGVybWluYXRpb24gZmllbGQgKi8KKwlwLT5kZXMwMS50eC5lbmRfcmluZyA9IHRlcjsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbWFjMTAwX3ByZXBhcmVfdHhfZGVzYyhzdHJ1Y3QgZG1hX2Rlc2MgKnAsIGludCBpc19mcywgaW50IGxlbiwKKwkJCQkgICBpbnQgY3N1bV9mbGFnKQoreworCXAtPmRlczAxLnR4LmZpcnN0X3NlZ21lbnQgPSBpc19mczsKKwlwLT5kZXMwMS50eC5idWZmZXIxX3NpemUgPSBsZW47Cit9CisKK3N0YXRpYyB2b2lkIG1hYzEwMF9jbGVhcl90eF9pYyhzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJcC0+ZGVzMDEudHguaW50ZXJydXB0ID0gMDsKK30KKworc3RhdGljIHZvaWQgbWFjMTAwX2Nsb3NlX3R4X2Rlc2Moc3RydWN0IGRtYV9kZXNjICpwKQoreworCXAtPmRlczAxLnR4Lmxhc3Rfc2VnbWVudCA9IDE7CisJcC0+ZGVzMDEudHguaW50ZXJydXB0ID0gMTsKK30KKworc3RhdGljIGludCBtYWMxMDBfZ2V0X3J4X2ZyYW1lX2xlbihzdHJ1Y3QgZG1hX2Rlc2MgKnApCit7CisJcmV0dXJuIHAtPmRlczAxLnJ4LmZyYW1lX2xlbmd0aDsKK30KKworc3RydWN0IHN0bW1hY19vcHMgbWFjMTAwX2RyaXZlciA9IHsKKwkuY29yZV9pbml0ID0gbWFjMTAwX2NvcmVfaW5pdCwKKwkuZHVtcF9tYWNfcmVncyA9IG1hYzEwMF9kdW1wX21hY19yZWdzLAorCS5kbWFfaW5pdCA9IG1hYzEwMF9kbWFfaW5pdCwKKwkuZHVtcF9kbWFfcmVncyA9IG1hYzEwMF9kdW1wX2RtYV9yZWdzLAorCS5kbWFfbW9kZSA9IG1hYzEwMF9kbWFfb3BlcmF0aW9uX21vZGUsCisJLmRtYV9kaWFnbm9zdGljX2ZyID0gbWFjMTAwX2RtYV9kaWFnbm9zdGljX2ZyLAorCS50eF9zdGF0dXMgPSBtYWMxMDBfZ2V0X3R4X2ZyYW1lX3N0YXR1cywKKwkucnhfc3RhdHVzID0gbWFjMTAwX2dldF9yeF9mcmFtZV9zdGF0dXMsCisJLmdldF90eF9sZW4gPSBtYWMxMDBfZ2V0X3R4X2xlbiwKKwkuc2V0X2ZpbHRlciA9IG1hYzEwMF9zZXRfZmlsdGVyLAorCS5mbG93X2N0cmwgPSBtYWMxMDBfZmxvd19jdHJsLAorCS5wbXQgPSBtYWMxMDBfcG10LAorCS5pbml0X3J4X2Rlc2MgPSBtYWMxMDBfaW5pdF9yeF9kZXNjLAorCS5pbml0X3R4X2Rlc2MgPSBtYWMxMDBfaW5pdF90eF9kZXNjLAorCS5nZXRfdHhfb3duZXIgPSBtYWMxMDBfZ2V0X3R4X293bmVyLAorCS5nZXRfcnhfb3duZXIgPSBtYWMxMDBfZ2V0X3J4X293bmVyLAorCS5yZWxlYXNlX3R4X2Rlc2MgPSBtYWMxMDBfcmVsZWFzZV90eF9kZXNjLAorCS5wcmVwYXJlX3R4X2Rlc2MgPSBtYWMxMDBfcHJlcGFyZV90eF9kZXNjLAorCS5jbGVhcl90eF9pYyA9IG1hYzEwMF9jbGVhcl90eF9pYywKKwkuY2xvc2VfdHhfZGVzYyA9IG1hYzEwMF9jbG9zZV90eF9kZXNjLAorCS5nZXRfdHhfbHMgPSBtYWMxMDBfZ2V0X3R4X2xzLAorCS5zZXRfdHhfb3duZXIgPSBtYWMxMDBfc2V0X3R4X293bmVyLAorCS5zZXRfcnhfb3duZXIgPSBtYWMxMDBfc2V0X3J4X293bmVyLAorCS5nZXRfcnhfZnJhbWVfbGVuID0gbWFjMTAwX2dldF9yeF9mcmFtZV9sZW4sCisJLmhvc3RfaXJxX3N0YXR1cyA9IG1hYzEwMF9pcnFfc3RhdHVzLAorCS5zZXRfdW1hY19hZGRyID0gbWFjMTAwX3NldF91bWFjX2FkZHIsCisJLmdldF91bWFjX2FkZHIgPSBtYWMxMDBfZ2V0X3VtYWNfYWRkciwKK307CisKK3N0cnVjdCBtYWNfZGV2aWNlX2luZm8gKm1hYzEwMF9zZXR1cCh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlzdHJ1Y3QgbWFjX2RldmljZV9pbmZvICptYWM7CisKKwltYWMgPSBremFsbG9jKHNpemVvZihjb25zdCBzdHJ1Y3QgbWFjX2RldmljZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlwcl9pbmZvKCJcdE1BQyAxMC8xMDBcbiIpOworCisJbWFjLT5vcHMgPSAmbWFjMTAwX2RyaXZlcjsKKwltYWMtPmh3LnBtdCA9IFBNVF9OT1RfU1VQUE9SVEVEOworCW1hYy0+aHcubGluay5wb3J0ID0gTUFDX0NPTlRST0xfUFM7CisJbWFjLT5ody5saW5rLmR1cGxleCA9IE1BQ19DT05UUk9MX0Y7CisJbWFjLT5ody5saW5rLnNwZWVkID0gMDsKKwltYWMtPmh3Lm1paS5hZGRyID0gTUFDX01JSV9BRERSOworCW1hYy0+aHcubWlpLmRhdGEgPSBNQUNfTUlJX0RBVEE7CisKKwlyZXR1cm4gbWFjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL21hYzEwMC5oIGIvZHJpdmVycy9uZXQvc3RtbWFjL21hYzEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGYxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvbWFjMTAwLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIE1BQyAxMC8xMDAgSGVhZGVyIEZpbGUKKworICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSAgU1RNaWNyb2VsZWN0cm9uaWNzIEx0ZAorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorCisgIEF1dGhvcjogR2l1c2VwcGUgQ2F2YWxsYXJvIDxwZXBwZS5jYXZhbGxhcm9Ac3QuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkgCQkJTUFDIEJMT0NLIGRlZmluZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIE1BQyBDU1Igb2Zmc2V0ICovCisjZGVmaW5lIE1BQ19DT05UUk9MCTB4MDAwMDAwMDAJLyogTUFDIENvbnRyb2wgKi8KKyNkZWZpbmUgTUFDX0FERFJfSElHSAkweDAwMDAwMDA0CS8qIE1BQyBBZGRyZXNzIEhpZ2ggKi8KKyNkZWZpbmUgTUFDX0FERFJfTE9XCTB4MDAwMDAwMDgJLyogTUFDIEFkZHJlc3MgTG93ICovCisjZGVmaW5lIE1BQ19IQVNIX0hJR0gJMHgwMDAwMDAwYwkvKiBNdWx0aWNhc3QgSGFzaCBUYWJsZSBIaWdoICovCisjZGVmaW5lIE1BQ19IQVNIX0xPVwkweDAwMDAwMDEwCS8qIE11bHRpY2FzdCBIYXNoIFRhYmxlIExvdyAqLworI2RlZmluZSBNQUNfTUlJX0FERFIJMHgwMDAwMDAxNAkvKiBNSUkgQWRkcmVzcyAqLworI2RlZmluZSBNQUNfTUlJX0RBVEEJMHgwMDAwMDAxOAkvKiBNSUkgRGF0YSAqLworI2RlZmluZSBNQUNfRkxPV19DVFJMCTB4MDAwMDAwMWMJLyogRmxvdyBDb250cm9sICovCisjZGVmaW5lIE1BQ19WTEFOMQkweDAwMDAwMDIwCS8qIFZMQU4xIFRhZyAqLworI2RlZmluZSBNQUNfVkxBTjIJMHgwMDAwMDAyNAkvKiBWTEFOMiBUYWcgKi8KKworLyogTUFDIENUUkwgZGVmaW5lcyAqLworI2RlZmluZSBNQUNfQ09OVFJPTF9SQQkweDgwMDAwMDAwCS8qIFJlY2VpdmUgQWxsIE1vZGUgKi8KKyNkZWZpbmUgTUFDX0NPTlRST0xfQkxFCTB4NDAwMDAwMDAJLyogRW5kaWFuIE1vZGUgKi8KKyNkZWZpbmUgTUFDX0NPTlRST0xfSEJECTB4MTAwMDAwMDAJLyogSGVhcnRiZWF0IERpc2FibGUgKi8KKyNkZWZpbmUgTUFDX0NPTlRST0xfUFMJMHgwODAwMDAwMAkvKiBQb3J0IFNlbGVjdCAqLworI2RlZmluZSBNQUNfQ09OVFJPTF9EUk8JMHgwMDgwMDAwMAkvKiBEaXNhYmxlIFJlY2VpdmUgT3duICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0VYVF9MT09QQkFDSyAweDAwNDAwMDAwCS8qIFJlc2VydmVkIChleHQgbG9vcGJhY2s/KSAqLworI2RlZmluZSBNQUNfQ09OVFJPTF9PTQkweDAwMjAwMDAwCS8qIExvb3BiYWNrIE9wZXJhdGluZyBNb2RlICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0YJMHgwMDEwMDAwMAkvKiBGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIE1BQ19DT05UUk9MX1BNCTB4MDAwODAwMDAJLyogUGFzcyBBbGwgTXVsdGljYXN0ICovCisjZGVmaW5lIE1BQ19DT05UUk9MX1BSCTB4MDAwNDAwMDAJLyogUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBNQUNfQ09OVFJPTF9JRgkweDAwMDIwMDAwCS8qIEludmVyc2UgRmlsdGVyaW5nICovCisjZGVmaW5lIE1BQ19DT05UUk9MX1BCCTB4MDAwMTAwMDAJLyogUGFzcyBCYWQgRnJhbWVzICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0hPCTB4MDAwMDgwMDAJLyogSGFzaCBPbmx5IEZpbHRlcmluZyBNb2RlICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0hQCTB4MDAwMDIwMDAJLyogSGFzaC9QZXJmZWN0IEZpbHRlcmluZyBNb2RlICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0xDQwkweDAwMDAxMDAwCS8qIExhdGUgQ29sbGlzaW9uIENvbnRyb2wgKi8KKyNkZWZpbmUgTUFDX0NPTlRST0xfREJGCTB4MDAwMDA4MDAJLyogRGlzYWJsZSBCcm9hZGNhc3QgRnJhbWVzICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0RSVFkJMHgwMDAwMDQwMAkvKiBEaXNhYmxlIFJldHJ5ICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0FTVFAJMHgwMDAwMDEwMAkvKiBBdXRvbWF0aWMgUGFkIFN0cmlwcGluZyAqLworI2RlZmluZSBNQUNfQ09OVFJPTF9CT0xNVF8xMAkweDAwMDAwMDAwCS8qIEJhY2sgT2ZmIExpbWl0IDEwICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0JPTE1UXzgJMHgwMDAwMDA0MAkvKiBCYWNrIE9mZiBMaW1pdCA4ICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0JPTE1UXzQJMHgwMDAwMDA4MAkvKiBCYWNrIE9mZiBMaW1pdCA0ICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0JPTE1UXzEJMHgwMDAwMDBjMAkvKiBCYWNrIE9mZiBMaW1pdCAxICovCisjZGVmaW5lIE1BQ19DT05UUk9MX0RDCQkweDAwMDAwMDIwCS8qIERlZmVycmFsIENoZWNrICovCisjZGVmaW5lIE1BQ19DT05UUk9MX1RFCQkweDAwMDAwMDA4CS8qIFRyYW5zbWl0dGVyIEVuYWJsZSAqLworI2RlZmluZSBNQUNfQ09OVFJPTF9SRQkJMHgwMDAwMDAwNAkvKiBSZWNlaXZlciBFbmFibGUgKi8KKworI2RlZmluZSBNQUNfQ09SRV9JTklUIChNQUNfQ09OVFJPTF9IQkQgfCBNQUNfQ09OVFJPTF9BU1RQKQorCisvKiBNQUMgRkxPVyBDVFJMIGRlZmluZXMgKi8KKyNkZWZpbmUgTUFDX0ZMT1dfQ1RSTF9QVF9NQVNLCTB4ZmZmZjAwMDAJLyogUGF1c2UgVGltZSBNYXNrICovCisjZGVmaW5lIE1BQ19GTE9XX0NUUkxfUFRfU0hJRlQJMTYKKyNkZWZpbmUgTUFDX0ZMT1dfQ1RSTF9QQVNTCTB4MDAwMDAwMDQJLyogUGFzcyBDb250cm9sIEZyYW1lcyAqLworI2RlZmluZSBNQUNfRkxPV19DVFJMX0VOQUJMRQkweDAwMDAwMDAyCS8qIEZsb3cgQ29udHJvbCBFbmFibGUgKi8KKyNkZWZpbmUgTUFDX0ZMT1dfQ1RSTF9QQVVTRQkweDAwMDAwMDAxCS8qIEZsb3cgQ29udHJvbCBCdXN5IC4uLiAqLworCisvKiBNSUkgQUREUiAgZGVmaW5lcyAqLworI2RlZmluZSBNQUNfTUlJX0FERFJfV1JJVEUJMHgwMDAwMDAwMgkvKiBNSUkgV3JpdGUgKi8KKyNkZWZpbmUgTUFDX01JSV9BRERSX0JVU1kJMHgwMDAwMDAwMQkvKiBNSUkgQnVzeSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAkJCQlETUEgQkxPQ0sgZGVmaW5lcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBETUEgQnVzIE1vZGUgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBETUFfQlVTX01PREVfREJPCTB4MDAxMDAwMDAJLyogRGVzY3JpcHRvciBCeXRlIE9yZGVyaW5nICovCisjZGVmaW5lIERNQV9CVVNfTU9ERV9CTEUJMHgwMDAwMDA4MAkvKiBCaWcgRW5kaWFuL0xpdHRsZSBFbmRpYW4gKi8KKyNkZWZpbmUgRE1BX0JVU19NT0RFX1BCTF9NQVNLCTB4MDAwMDNmMDAJLyogUHJvZ3JhbW1hYmxlIEJ1cnN0IExlbiAqLworI2RlZmluZSBETUFfQlVTX01PREVfUEJMX1NISUZUCTgKKyNkZWZpbmUgRE1BX0JVU19NT0RFX0RTTF9NQVNLCTB4MDAwMDAwN2MJLyogRGVzY3JpcHRvciBTa2lwIExlbmd0aCAqLworI2RlZmluZSBETUFfQlVTX01PREVfRFNMX1NISUZUCTIJLyogICAoaW4gRFdPUkRTKSAgICAgICovCisjZGVmaW5lIERNQV9CVVNfTU9ERV9CQVJfQlVTCTB4MDAwMDAwMDIJLyogQmFyLUJ1cyBBcmJpdHJhdGlvbiAqLworI2RlZmluZSBETUFfQlVTX01PREVfU0ZUX1JFU0VUCTB4MDAwMDAwMDEJLyogU29mdHdhcmUgUmVzZXQgKi8KKyNkZWZpbmUgRE1BX0JVU19NT0RFX0RFRkFVTFQJMHgwMDAwMDAwMAorCisvKiBETUEgQ29udHJvbCByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIERNQV9DT05UUk9MX1NGCQkweDAwMjAwMDAwCS8qIFN0b3JlIEFuZCBGb3J3YXJkICovCisKKy8qIFRyYW5zbWl0IFRocmVzaG9sZCBDb250cm9sICovCitlbnVtIHR0Y19jb250cm9sIHsKKwlETUFfQ09OVFJPTF9UVENfREVGQVVMVCA9IDB4MDAwMDAwMDAsCS8qIFRocmVzaG9sZCBpcyAzMiBEV09SRFMgKi8KKwlETUFfQ09OVFJPTF9UVENfNjQgPSAweDAwMDA0MDAwLAkvKiBUaHJlc2hvbGQgaXMgNjQgRFdPUkRTICovCisJRE1BX0NPTlRST0xfVFRDXzEyOCA9IDB4MDAwMDgwMDAsCS8qIFRocmVzaG9sZCBpcyAxMjggRFdPUkRTICovCisJRE1BX0NPTlRST0xfVFRDXzI1NiA9IDB4MDAwMGMwMDAsCS8qIFRocmVzaG9sZCBpcyAyNTYgRFdPUkRTICovCisJRE1BX0NPTlRST0xfVFRDXzE4ID0gMHgwMDQwMDAwMCwJLyogVGhyZXNob2xkIGlzIDE4IERXT1JEUyAqLworCURNQV9DT05UUk9MX1RUQ18yNCA9IDB4MDA0MDQwMDAsCS8qIFRocmVzaG9sZCBpcyAyNCBEV09SRFMgKi8KKwlETUFfQ09OVFJPTF9UVENfMzIgPSAweDAwNDA4MDAwLAkvKiBUaHJlc2hvbGQgaXMgMzIgRFdPUkRTICovCisJRE1BX0NPTlRST0xfVFRDXzQwID0gMHgwMDQwYzAwMCwJLyogVGhyZXNob2xkIGlzIDQwIERXT1JEUyAqLworCURNQV9DT05UUk9MX1NFID0gMHgwMDAwMDAwOCwJLyogU3RvcCBPbiBFbXB0eSAqLworCURNQV9DT05UUk9MX09TRiA9IDB4MDAwMDAwMDQsCS8qIE9wZXJhdGUgT24gMm5kIEZyYW1lICovCit9OworCisvKiBTVE1BQzExMCBETUEgTWlzc2VkIEZyYW1lIENvdW50ZXIgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBETUFfTUlTU0VEX0ZSQU1FX09WRQkweDEwMDAwMDAwCS8qIEZJRk8gT3ZlcmZsb3cgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgRE1BX01JU1NFRF9GUkFNRV9PVkVfQ05UUiAweDBmZmUwMDAwCS8qIE92ZXJmbG93IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgRE1BX01JU1NFRF9GUkFNRV9PVkVfTQkweDAwMDEwMDAwCS8qIE1pc3NlZCBGcmFtZSBPdmVyZmxvdyAqLworI2RlZmluZSBETUFfTUlTU0VEX0ZSQU1FX01fQ05UUgkweDAwMDBmZmZmCS8qIE1pc3NlZCBGcmFtZSBDb3VpbnRlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hYy5oIGIvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMmVhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjLmgKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIFNUTWljcm9lbGVjdHJvbmljcyBMdGQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSJPY3RfMDkiCisKKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNkZWZpbmUgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2lmZGVmIENPTkZJR19TVE1NQUNfVElNRVIKKyNpbmNsdWRlICJzdG1tYWNfdGltZXIuaCIKKyNlbmRpZgorCitzdHJ1Y3Qgc3RtbWFjX3ByaXYgeworCS8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXMgYXJlIGtlcHQgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdCAqLworCXN0cnVjdCBkbWFfZGVzYyAqZG1hX3R4IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlkbWFfYWRkcl90IGRtYV90eF9waHk7CisJc3RydWN0IHNrX2J1ZmYgKip0eF9za2J1ZmY7CisJdW5zaWduZWQgaW50IGN1cl90eDsKKwl1bnNpZ25lZCBpbnQgZGlydHlfdHg7CisJdW5zaWduZWQgaW50IGRtYV90eF9zaXplOworCWludCB0eF9jb2U7CisJaW50IHR4X2NvYWxlc2NlOworCisJc3RydWN0IGRtYV9kZXNjICpkbWFfcnggOworCXVuc2lnbmVkIGludCBjdXJfcng7CisJdW5zaWduZWQgaW50IGRpcnR5X3J4OworCXN0cnVjdCBza19idWZmICoqcnhfc2tidWZmOworCWRtYV9hZGRyX3QgKnJ4X3NrYnVmZl9kbWE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCByeF9yZWN5Y2xlOworCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaXNfZ21hYzsKKwlkbWFfYWRkcl90IGRtYV9yeF9waHk7CisJdW5zaWduZWQgaW50IGRtYV9yeF9zaXplOworCWludCByeF9jc3VtOworCXVuc2lnbmVkIGludCBkbWFfYnVmX3N6OworCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgbWFjX2RldmljZV9pbmZvICptYWNfdHlwZTsKKworCXN0cnVjdCBzdG1tYWNfZXh0cmFfc3RhdHMgeHN0YXRzOworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworCisJcGh5X2ludGVyZmFjZV90IHBoeV9pbnRlcmZhY2U7CisJaW50IHBibDsKKwlpbnQgYnVzX2lkOworCWludCBwaHlfYWRkcjsKKwlpbnQgcGh5X21hc2s7CisJaW50ICgqcGh5X3Jlc2V0KSAodm9pZCAqcHJpdik7CisJdm9pZCAoKmZpeF9tYWNfc3BlZWQpICh2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgc3BlZWQpOworCXZvaWQgKmJzcF9wcml2OworCisJaW50IHBoeV9pcnE7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwlpbnQgb2xkbGluazsKKwlpbnQgc3BlZWQ7CisJaW50IG9sZGR1cGxleDsKKwl1bnNpZ25lZCBpbnQgZmxvd19jdHJsOworCXVuc2lnbmVkIGludCBwYXVzZTsKKwlzdHJ1Y3QgbWlpX2J1cyAqbWlpOworCisJdTMyIG1zZ19lbmFibGU7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCB3b2xvcHRzOworCWludCB3b2xlbmFibGVkOworCWludCBzaHV0ZG93bjsKKyNpZmRlZiBDT05GSUdfU1RNTUFDX1RJTUVSCisJc3RydWN0IHN0bW1hY190aW1lciAqdG07CisjZW5kaWYKKyNpZmRlZiBTVE1NQUNfVkxBTl9UQUdfVVNFRAorCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKKyNlbmRpZgorfTsKKworZXh0ZXJuIGludCBzdG1tYWNfbWRpb191bnJlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKK2V4dGVybiBpbnQgc3RtbWFjX21kaW9fcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOworZXh0ZXJuIHZvaWQgc3RtbWFjX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hY19ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0ZWJlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfZXRodG9vbC5jCkBAIC0wLDAgKzEsMzk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBTVE1NQUMgRXRodG9vbCBzdXBwb3J0CisKKyAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIFNUTWljcm9lbGVjdHJvbmljcyBMdGQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworI2luY2x1ZGUgInN0bW1hYy5oIgorCisjZGVmaW5lIFJFR19TUEFDRV9TSVpFCTB4MTA1NAorI2RlZmluZSBNQUMxMDBfRVRIVE9PTF9OQU1FCSJzdF9tYWMxMDAiCisjZGVmaW5lIEdNQUNfRVRIVE9PTF9OQU1FCSJzdF9nbWFjIgorCitzdHJ1Y3Qgc3RtbWFjX3N0YXRzIHsKKwljaGFyIHN0YXRfc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07CisJaW50IHNpemVvZl9zdGF0OworCWludCBzdGF0X29mZnNldDsKK307CisKKyNkZWZpbmUgU1RNTUFDX1NUQVQobSkJXAorCXsgI20sIEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc3RtbWFjX2V4dHJhX3N0YXRzLCBtKSwJXAorCW9mZnNldG9mKHN0cnVjdCBzdG1tYWNfcHJpdiwgeHN0YXRzLm0pfQorCitzdGF0aWMgY29uc3Qgc3RydWN0ICBzdG1tYWNfc3RhdHMgc3RtbWFjX2dzdHJpbmdzX3N0YXRzW10gPSB7CisJU1RNTUFDX1NUQVQodHhfdW5kZXJmbG93KSwKKwlTVE1NQUNfU1RBVCh0eF9jYXJyaWVyKSwKKwlTVE1NQUNfU1RBVCh0eF9sb3NzY2FycmllciksCisJU1RNTUFDX1NUQVQodHhfaGVhcnRiZWF0KSwKKwlTVE1NQUNfU1RBVCh0eF9kZWZlcnJlZCksCisJU1RNTUFDX1NUQVQodHhfdmxhbiksCisJU1RNTUFDX1NUQVQocnhfdmxhbiksCisJU1RNTUFDX1NUQVQodHhfamFiYmVyKSwKKwlTVE1NQUNfU1RBVCh0eF9mcmFtZV9mbHVzaGVkKSwKKwlTVE1NQUNfU1RBVCh0eF9wYXlsb2FkX2Vycm9yKSwKKwlTVE1NQUNfU1RBVCh0eF9pcF9oZWFkZXJfZXJyb3IpLAorCVNUTU1BQ19TVEFUKHJ4X2Rlc2MpLAorCVNUTU1BQ19TVEFUKHJ4X3BhcnRpYWwpLAorCVNUTU1BQ19TVEFUKHJ4X3J1bnQpLAorCVNUTU1BQ19TVEFUKHJ4X3Rvb2xvbmcpLAorCVNUTU1BQ19TVEFUKHJ4X2NvbGxpc2lvbiksCisJU1RNTUFDX1NUQVQocnhfY3JjKSwKKwlTVE1NQUNfU1RBVChyeF9sZW5naHQpLAorCVNUTU1BQ19TVEFUKHJ4X21paSksCisJU1RNTUFDX1NUQVQocnhfbXVsdGljYXN0KSwKKwlTVE1NQUNfU1RBVChyeF9nbWFjX292ZXJmbG93KSwKKwlTVE1NQUNfU1RBVChyeF93YXRjaGRvZyksCisJU1RNTUFDX1NUQVQoZGFfcnhfZmlsdGVyX2ZhaWwpLAorCVNUTU1BQ19TVEFUKHNhX3J4X2ZpbHRlcl9mYWlsKSwKKwlTVE1NQUNfU1RBVChyeF9taXNzZWRfY250ciksCisJU1RNTUFDX1NUQVQocnhfb3ZlcmZsb3dfY250ciksCisJU1RNTUFDX1NUQVQodHhfdW5kZWZsb3dfaXJxKSwKKwlTVE1NQUNfU1RBVCh0eF9wcm9jZXNzX3N0b3BwZWRfaXJxKSwKKwlTVE1NQUNfU1RBVCh0eF9qYWJiZXJfaXJxKSwKKwlTVE1NQUNfU1RBVChyeF9vdmVyZmxvd19pcnEpLAorCVNUTU1BQ19TVEFUKHJ4X2J1Zl91bmF2X2lycSksCisJU1RNTUFDX1NUQVQocnhfcHJvY2Vzc19zdG9wcGVkX2lycSksCisJU1RNTUFDX1NUQVQocnhfd2F0Y2hkb2dfaXJxKSwKKwlTVE1NQUNfU1RBVCh0eF9lYXJseV9pcnEpLAorCVNUTU1BQ19TVEFUKGZhdGFsX2J1c19lcnJvcl9pcnEpLAorCVNUTU1BQ19TVEFUKHRocmVzaG9sZCksCisJU1RNTUFDX1NUQVQodHhfcGt0X24pLAorCVNUTU1BQ19TVEFUKHJ4X3BrdF9uKSwKKwlTVE1NQUNfU1RBVChwb2xsX24pLAorCVNUTU1BQ19TVEFUKHNjaGVkX3RpbWVyX24pLAorCVNUTU1BQ19TVEFUKG5vcm1hbF9pcnFfbiksCit9OworI2RlZmluZSBTVE1NQUNfU1RBVFNfTEVOIEFSUkFZX1NJWkUoc3RtbWFjX2dzdHJpbmdzX3N0YXRzKQorCit2b2lkIHN0bW1hY19ldGh0b29sX2dldGRydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIXByaXYtPmlzX2dtYWMpCisJCXN0cmNweShpbmZvLT5kcml2ZXIsIE1BQzEwMF9FVEhUT09MX05BTUUpOworCWVsc2UKKwkJc3RyY3B5KGluZm8tPmRyaXZlciwgR01BQ19FVEhUT09MX05BTUUpOworCisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9NT0RVTEVfVkVSU0lPTik7CisJaW5mby0+ZndfdmVyc2lvblswXSA9ICdcMCc7CisJaW5mby0+bl9zdGF0cyA9IFNUTU1BQ19TVEFUU19MRU47CisJcmV0dXJuOworfQorCitpbnQgc3RtbWFjX2V0aHRvb2xfZ2V0c2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ID0gcHJpdi0+cGh5ZGV2OworCWludCByYzsKKwlpZiAocGh5ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogJXM6IFBIWSBpcyBub3QgcmVnaXN0ZXJlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcHJfZXJyKCIlczogaW50ZXJmYWNlIGlzIGRpc2FibGVkOiB3ZSBjYW5ub3QgdHJhY2sgIgorCQkibGluayBzcGVlZCAvIGR1cGxleCBzZXR0aW5nXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKKwlyYyA9IHBoeV9ldGh0b29sX2dzZXQocGh5LCBjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitpbnQgc3RtbWFjX2V0aHRvb2xfc2V0c2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ID0gcHJpdi0+cGh5ZGV2OworCWludCByYzsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJcmMgPSBwaHlfZXRodG9vbF9zc2V0KHBoeSwgY21kKTsKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3UzMiBzdG1tYWNfZXRodG9vbF9nZXRtc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIHByaXYtPm1zZ19lbmFibGU7Cit9CisKK3ZvaWQgc3RtbWFjX2V0aHRvb2xfc2V0bXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+bXNnX2VuYWJsZSA9IGxldmVsOworCit9CisKK2ludCBzdG1tYWNfY2hlY2tfaWZfcnVubmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCXJldHVybiAwOworfQorCitpbnQgc3RtbWFjX2V0aHRvb2xfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIFJFR19TUEFDRV9TSVpFOworfQorCit2b2lkIHN0bW1hY19ldGh0b29sX2dyZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnNwYWNlKQoreworCWludCBpOworCXUzMiAqcmVnX3NwYWNlID0gKHUzMiAqKSBzcGFjZTsKKworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwltZW1zZXQocmVnX3NwYWNlLCAweDAsIFJFR19TUEFDRV9TSVpFKTsKKworCWlmICghcHJpdi0+aXNfZ21hYykgeworCQkvKiBNQUMgcmVnaXN0ZXJzICovCisJCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQorCQkJcmVnX3NwYWNlW2ldID0gcmVhZGwoZGV2LT5iYXNlX2FkZHIgKyAoaSAqIDQpKTsKKwkJLyogRE1BIHJlZ2lzdGVycyAqLworCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQkJcmVnX3NwYWNlW2kgKyAxMl0gPQorCQkJICAgIHJlYWRsKGRldi0+YmFzZV9hZGRyICsgKERNQV9CVVNfTU9ERSArIChpICogNCkpKTsKKwkJcmVnX3NwYWNlWzIyXSA9IHJlYWRsKGRldi0+YmFzZV9hZGRyICsgRE1BX0NVUl9UWF9CVUZfQUREUik7CisJCXJlZ19zcGFjZVsyM10gPSByZWFkbChkZXYtPmJhc2VfYWRkciArIERNQV9DVVJfUlhfQlVGX0FERFIpOworCX0gZWxzZSB7CisJCS8qIE1BQyByZWdpc3RlcnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDU1OyBpKyspCisJCQlyZWdfc3BhY2VbaV0gPSByZWFkbChkZXYtPmJhc2VfYWRkciArIChpICogNCkpOworCQkvKiBETUEgcmVnaXN0ZXJzICovCisJCWZvciAoaSA9IDA7IGkgPCAyMjsgaSsrKQorCQkJcmVnX3NwYWNlW2kgKyA1NV0gPQorCQkJICAgIHJlYWRsKGRldi0+YmFzZV9hZGRyICsgKERNQV9CVVNfTU9ERSArIChpICogNCkpKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK2ludCBzdG1tYWNfZXRodG9vbF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKK3sKKwlpZiAoZGF0YSkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU07CisJZWxzZQorCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX0NTVU07CisKKwlyZXR1cm4gMDsKK30KKwordTMyIHN0bW1hY19ldGh0b29sX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBwcml2LT5yeF9jc3VtOworfQorCitzdGF0aWMgdm9pZAorc3RtbWFjX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJcGF1c2UtPnJ4X3BhdXNlID0gMDsKKwlwYXVzZS0+dHhfcGF1c2UgPSAwOworCXBhdXNlLT5hdXRvbmVnID0gcHJpdi0+cGh5ZGV2LT5hdXRvbmVnOworCisJaWYgKHByaXYtPmZsb3dfY3RybCAmIEZMT1dfUlgpCisJCXBhdXNlLT5yeF9wYXVzZSA9IDE7CisJaWYgKHByaXYtPmZsb3dfY3RybCAmIEZMT1dfVFgpCisJCXBhdXNlLT50eF9wYXVzZSA9IDE7CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CitzdG1tYWNfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ID0gcHJpdi0+cGh5ZGV2OworCWludCBuZXdfcGF1c2UgPSBGTE9XX09GRjsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKwlpZiAocGF1c2UtPnJ4X3BhdXNlKQorCQluZXdfcGF1c2UgfD0gRkxPV19SWDsKKwlpZiAocGF1c2UtPnR4X3BhdXNlKQorCQluZXdfcGF1c2UgfD0gRkxPV19UWDsKKworCXByaXYtPmZsb3dfY3RybCA9IG5ld19wYXVzZTsKKworCWlmIChwaHktPmF1dG9uZWcpIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQkJc3RydWN0IGV0aHRvb2xfY21kIGNtZDsKKwkJCS8qIGF1dG8tbmVnb3RpYXRpb24gYXV0b21hdGljYWxseSByZXN0YXJ0ZWQgKi8KKwkJCWNtZC5jbWQgPSBFVEhUT09MX05XQVlfUlNUOworCQkJY21kLnN1cHBvcnRlZCA9IHBoeS0+c3VwcG9ydGVkOworCQkJY21kLmFkdmVydGlzaW5nID0gcGh5LT5hZHZlcnRpc2luZzsKKwkJCWNtZC5hdXRvbmVnID0gcGh5LT5hdXRvbmVnOworCQkJY21kLnNwZWVkID0gcGh5LT5zcGVlZDsKKwkJCWNtZC5kdXBsZXggPSBwaHktPmR1cGxleDsKKwkJCWNtZC5waHlfYWRkcmVzcyA9IHBoeS0+YWRkcjsKKwkJCXJldCA9IHBoeV9ldGh0b29sX3NzZXQocGh5LCAmY21kKTsKKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gbmV0ZGV2LT5iYXNlX2FkZHI7CisJCXByaXYtPm1hY190eXBlLT5vcHMtPmZsb3dfY3RybChpb2FkZHIsIHBoeS0+ZHVwbGV4LAorCQkJCQkgICAgICAgcHJpdi0+Zmxvd19jdHJsLCBwcml2LT5wYXVzZSk7CisJfQorCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzdG1tYWNfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGV0aHRvb2xfc3RhdHMgKmR1bW15LCB1NjQgKmRhdGEpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJLyogVXBkYXRlIEhXIHN0YXRzIGlmIHN1cHBvcnRlZCAqLworCXByaXYtPm1hY190eXBlLT5vcHMtPmRtYV9kaWFnbm9zdGljX2ZyKCZkZXYtPnN0YXRzLCAmcHJpdi0+eHN0YXRzLAorCQkJCQkgICAgICAgaW9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBTVE1NQUNfU1RBVFNfTEVOOyBpKyspIHsKKwkJY2hhciAqcCA9IChjaGFyICopcHJpdiArIHN0bW1hY19nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldDsKKwkJZGF0YVtpXSA9IChzdG1tYWNfZ3N0cmluZ3Nfc3RhdHNbaV0uc2l6ZW9mX3N0YXQgPT0KKwkJc2l6ZW9mKHU2NCkpID8gKCoodTY0ICopcCkgOiAoKih1MzIgKilwKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgc3RtbWFjX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBzc2V0KQoreworCXN3aXRjaCAoc3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlyZXR1cm4gU1RNTUFDX1NUQVRTX0xFTjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdG1tYWNfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCit7CisJaW50IGk7CisJdTggKnAgPSBkYXRhOworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpID0gMDsgaSA8IFNUTU1BQ19TVEFUU19MRU47IGkrKykgeworCQkJbWVtY3B5KHAsIHN0bW1hY19nc3RyaW5nc19zdGF0c1tpXS5zdGF0X3N0cmluZywKKwkJCQlFVEhfR1NUUklOR19MRU4pOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLyogQ3VycmVudGx5IG9ubHkgc3VwcG9ydCBXT0wgdGhyb3VnaCBNYWdpYyBwYWNrZXQuICovCitzdGF0aWMgdm9pZCBzdG1tYWNfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCWlmIChwcml2LT53b2xlbmFibGVkID09IFBNVF9TVVBQT1JURUQpIHsKKwkJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX01BR0lDOworCQl3b2wtPndvbG9wdHMgPSBwcml2LT53b2xvcHRzOworCX0KKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOworfQorCitzdGF0aWMgaW50IHN0bW1hY19zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBzdXBwb3J0ID0gV0FLRV9NQUdJQzsKKworCWlmIChwcml2LT53b2xlbmFibGVkID09IFBNVF9OT1RfU1VQUE9SVEVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3b2wtPndvbG9wdHMgJiB+c3VwcG9ydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod29sLT53b2xvcHRzID09IDApCisJCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShwcml2LT5kZXZpY2UsIDApOworCWVsc2UKKwkJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKHByaXYtPmRldmljZSwgMSk7CisKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKKwlwcml2LT53b2xvcHRzID0gd29sLT53b2xvcHRzOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBzdG1tYWNfZXRodG9vbF9vcHMgPSB7CisJLmJlZ2luID0gc3RtbWFjX2NoZWNrX2lmX3J1bm5pbmcsCisJLmdldF9kcnZpbmZvID0gc3RtbWFjX2V0aHRvb2xfZ2V0ZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gc3RtbWFjX2V0aHRvb2xfZ2V0c2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IHN0bW1hY19ldGh0b29sX3NldHNldHRpbmdzLAorCS5nZXRfbXNnbGV2ZWwgPSBzdG1tYWNfZXRodG9vbF9nZXRtc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gc3RtbWFjX2V0aHRvb2xfc2V0bXNnbGV2ZWwsCisJLmdldF9yZWdzID0gc3RtbWFjX2V0aHRvb2xfZ3JlZ3MsCisJLmdldF9yZWdzX2xlbiA9IHN0bW1hY19ldGh0b29sX2dldF9yZWdzX2xlbiwKKwkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfcnhfY3N1bSA9IHN0bW1hY19ldGh0b29sX2dldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtID0gc3RtbWFjX2V0aHRvb2xfc2V0X3R4X2NzdW0sCisJLmdldF9zZyA9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cgPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3BhdXNlcGFyYW0gPSBzdG1tYWNfZ2V0X3BhdXNlcGFyYW0sCisJLnNldF9wYXVzZXBhcmFtID0gc3RtbWFjX3NldF9wYXVzZXBhcmFtLAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IHN0bW1hY19nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3N0cmluZ3MgPSBzdG1tYWNfZ2V0X3N0cmluZ3MsCisJLmdldF93b2wgPSBzdG1tYWNfZ2V0X3dvbCwKKwkuc2V0X3dvbCA9IHN0bW1hY19zZXRfd29sLAorCS5nZXRfc3NldF9jb3VudAk9IHN0bW1hY19nZXRfc3NldF9jb3VudCwKKyNpZmRlZiBORVRJRl9GX1RTTworCS5nZXRfdHNvID0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5zZXRfdHNvID0gZXRodG9vbF9vcF9zZXRfdHNvLAorI2VuZGlmCit9OworCit2b2lkIHN0bW1hY19zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmc3RtbWFjX2V0aHRvb2xfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hY19tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmMTRkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWFpbi5jCkBAIC0wLDAgKzEsMjIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgU1QgTUFDIDEwLzEwMC8xMDAwIG9uLWNoaXAgRXRoZXJuZXQgY29udHJvbGxlcnMuCisgIFNUIEV0aGVybmV0IElQcyBhcmUgYnVpbHQgYXJvdW5kIGEgU3lub3BzeXMgSVAgQ29yZS4KKworICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSAgU1RNaWNyb2VsZWN0cm9uaWNzIEx0ZAorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorCisgIEF1dGhvcjogR2l1c2VwcGUgQ2F2YWxsYXJvIDxwZXBwZS5jYXZhbGxhcm9Ac3QuY29tPgorCisgIERvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0OgorCWh0dHA6Ly93d3cuc3RsaW51eC5jb20KKyAgU3VwcG9ydCBhdmFpbGFibGUgYXQ6CisJaHR0cHM6Ly9idWd6aWxsYS5zdGxpbnV4LmNvbS8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RtL3NvYy5oPgorI2luY2x1ZGUgInN0bW1hYy5oIgorCisjZGVmaW5lIFNUTU1BQ19SRVNPVVJDRV9OQU1FCSJzdG1tYWNldGgiCisjZGVmaW5lIFBIWV9SRVNPVVJDRV9OQU1FCSJzdG1tYWNwaHkiCisKKyN1bmRlZiBTVE1NQUNfREVCVUcKKy8qI2RlZmluZSBTVE1NQUNfREVCVUcqLworI2lmZGVmIFNUTU1BQ19ERUJVRworI2RlZmluZSBEQkcobmxldmVsLCBrbGV2ZWwsIGZtdCwgYXJncy4uLikgXAorCQkoKHZvaWQpKG5ldGlmX21zZ18jI25sZXZlbChwcml2KSAmJiBcCisJCXByaW50ayhLRVJOXyMja2xldmVsIGZtdCwgIyMgYXJncykpKQorI2Vsc2UKKyNkZWZpbmUgREJHKG5sZXZlbCwga2xldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjdW5kZWYgU1RNTUFDX1JYX0RFQlVHCisvKiNkZWZpbmUgU1RNTUFDX1JYX0RFQlVHKi8KKyNpZmRlZiBTVE1NQUNfUlhfREVCVUcKKyNkZWZpbmUgUlhfREJHKGZtdCwgYXJncy4uLikgIHByaW50ayhmbXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBSWF9EQkcoZm10LCBhcmdzLi4uKSAgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyN1bmRlZiBTVE1NQUNfWE1JVF9ERUJVRworLyojZGVmaW5lIFNUTU1BQ19YTUlUX0RFQlVHKi8KKyNpZmRlZiBTVE1NQUNfVFhfREVCVUcKKyNkZWZpbmUgVFhfREJHKGZtdCwgYXJncy4uLikgIHByaW50ayhmbXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBUWF9EQkcoZm10LCBhcmdzLi4uKSAgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgU1RNTUFDX0FMSUdOKHgpCUwxX0NBQ0hFX0FMSUdOKHgpCisjZGVmaW5lIEpVTUJPX0xFTgk5MDAwCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFRYX1RJTUVPIDUwMDAgLyogZGVmYXVsdCA1IHNlY29uZHMgKi8KK3N0YXRpYyBpbnQgd2F0Y2hkb2cgPSBUWF9USU1FTzsKK21vZHVsZV9wYXJhbSh3YXRjaGRvZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHdhdGNoZG9nLCAiVHJhbnNtaXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiKTsKKworc3RhdGljIGludCBkZWJ1ZyA9IC0xOwkJLyogLTE6IGRlZmF1bHQsIDA6IG5vIG91dHB1dCwgMTY6ICBhbGwgKi8KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiTWVzc2FnZSBMZXZlbCAoMDogbm8gb3V0cHV0LCAxNjogYWxsKSIpOworCitzdGF0aWMgaW50IHBoeWFkZHIgPSAtMTsKK21vZHVsZV9wYXJhbShwaHlhZGRyLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhwaHlhZGRyLCAiUGh5c2ljYWwgZGV2aWNlIGFkZHJlc3MiKTsKKworI2RlZmluZSBETUFfVFhfU0laRSAyNTYKK3N0YXRpYyBpbnQgZG1hX3R4c2l6ZSA9IERNQV9UWF9TSVpFOworbW9kdWxlX3BhcmFtKGRtYV90eHNpemUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkbWFfdHhzaXplLCAiTnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSBUWCBsaXN0Iik7CisKKyNkZWZpbmUgRE1BX1JYX1NJWkUgMjU2CitzdGF0aWMgaW50IGRtYV9yeHNpemUgPSBETUFfUlhfU0laRTsKK21vZHVsZV9wYXJhbShkbWFfcnhzaXplLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hX3J4c2l6ZSwgIk51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgUlggbGlzdCIpOworCitzdGF0aWMgaW50IGZsb3dfY3RybCA9IEZMT1dfT0ZGOworbW9kdWxlX3BhcmFtKGZsb3dfY3RybCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGZsb3dfY3RybCwgIkZsb3cgY29udHJvbCBhYmlsaXR5IFtvbi9vZmZdIik7CisKK3N0YXRpYyBpbnQgcGF1c2UgPSBQQVVTRV9USU1FOworbW9kdWxlX3BhcmFtKHBhdXNlLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocGF1c2UsICJGbG93IENvbnRyb2wgUGF1c2UgVGltZSIpOworCisjZGVmaW5lIFRDX0RFRkFVTFQgNjQKK3N0YXRpYyBpbnQgdGMgPSBUQ19ERUZBVUxUOworbW9kdWxlX3BhcmFtKHRjLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0ModGMsICJETUEgdGhyZXNob2xkIGNvbnRyb2wgdmFsdWUiKTsKKworI2RlZmluZSBSWF9OT19DT0FMRVNDRQkxCS8qIEFsd2F5cyBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLworI2RlZmluZSBUWF9OT19DT0FMRVNDRQktMQkvKiBObyBtb2RlcmF0aW9uIGJ5IGRlZmF1bHQgKi8KKworLyogUGF5IGF0dGVudGlvbiB0byB0dW5lIHRoaXMgcGFyYW1ldGVyOyB0YWtlIGNhcmUgb2YgYm90aAorICogaGFyZHdhcmUgY2FwYWJpbGl0eSBhbmQgbmV0d29yayBzdGFiaXRpbHkvcGVyZm9ybWFuY2UgaW1wYWN0LgorICogTWFueSB0ZXN0cyBzaG93ZWQgdGhhdCB+NG1zIGxhdGVuY3kgc2VlbXMgdG8gYmUgZ29vZCBlbm91Z2guICovCisjaWZkZWYgQ09ORklHX1NUTU1BQ19USU1FUgorI2RlZmluZSBERUZBVUxUX1BFUklPRElDX1JBVEUJMjU2CitzdGF0aWMgaW50IHRtcmF0ZSA9IERFRkFVTFRfUEVSSU9ESUNfUkFURTsKK21vZHVsZV9wYXJhbSh0bXJhdGUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyh0bXJhdGUsICJFeHRlcm5hbCB0aW1lciBmcmVxLiAoZGVmYXVsdDogMjU2SHopIik7CisjZW5kaWYKKworI2RlZmluZSBETUFfQlVGRkVSX1NJWkUJQlVGX1NJWkVfMktpQgorc3RhdGljIGludCBidWZfc3ogPSBETUFfQlVGRkVSX1NJWkU7Cittb2R1bGVfcGFyYW0oYnVmX3N6LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmX3N6LCAiRE1BIGJ1ZmZlciBzaXplIik7CisKKy8qIEluIGNhc2Ugb2YgR2lnYSBFVEgsIHdlIGNhbiBlbmFibGUvZGlzYWJsZSB0aGUgQ09FIGZvciB0aGUKKyAqIHRyYW5zbWl0IEhXIGNoZWNrc3VtIGNvbXB1dGF0aW9uLgorICogTm90ZSB0aGF0LCBpZiB0eCBjc3VtIGlzIG9mZiBpbiBIVywgU0cgd2lsbCBiZSBzdGlsbCBzdXBwb3J0ZWQuICovCitzdGF0aWMgaW50IHR4X2NvZSA9IEhXX0NTVU07Cittb2R1bGVfcGFyYW0odHhfY29lLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0ModHhfY29lLCAiR01BQyBDT0UgdHlwZSAyIFtvbi9vZmZdIik7CisKK3N0YXRpYyBjb25zdCB1MzIgZGVmYXVsdF9tc2dfbGV2ZWwgPSAoTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8CisJCQkJICAgICAgTkVUSUZfTVNHX0xJTksgfCBORVRJRl9NU0dfSUZVUCB8CisJCQkJICAgICAgTkVUSUZfTVNHX0lGRE9XTiB8IE5FVElGX01TR19USU1FUik7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdG1tYWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CitzdGF0aWMgbmV0ZGV2X3R4X3Qgc3RtbWFjX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKgorICogc3RtbWFjX3ZlcmlmeV9hcmdzIC0gdmVyaWZ5IHRoZSBkcml2ZXIgcGFyYW1ldGVycy4KKyAqIERlc2NyaXB0aW9uOiBpdCB2ZXJpZmllcyBpZiBzb21lIHdyb25nIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gdGhlIGRyaXZlci4KKyAqIE5vdGUgdGhhdCB3cm9uZyBwYXJhbWV0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcy4KKyAqLworc3RhdGljIHZvaWQgc3RtbWFjX3ZlcmlmeV9hcmdzKHZvaWQpCit7CisJaWYgKHVubGlrZWx5KHdhdGNoZG9nIDwgMCkpCisJCXdhdGNoZG9nID0gVFhfVElNRU87CisJaWYgKHVubGlrZWx5KGRtYV9yeHNpemUgPCAwKSkKKwkJZG1hX3J4c2l6ZSA9IERNQV9SWF9TSVpFOworCWlmICh1bmxpa2VseShkbWFfdHhzaXplIDwgMCkpCisJCWRtYV90eHNpemUgPSBETUFfVFhfU0laRTsKKwlpZiAodW5saWtlbHkoKGJ1Zl9zeiA8IERNQV9CVUZGRVJfU0laRSkgfHwgKGJ1Zl9zeiA+IEJVRl9TSVpFXzE2S2lCKSkpCisJCWJ1Zl9zeiA9IERNQV9CVUZGRVJfU0laRTsKKwlpZiAodW5saWtlbHkoZmxvd19jdHJsID4gMSkpCisJCWZsb3dfY3RybCA9IEZMT1dfQVVUTzsKKwllbHNlIGlmIChsaWtlbHkoZmxvd19jdHJsIDwgMCkpCisJCWZsb3dfY3RybCA9IEZMT1dfT0ZGOworCWlmICh1bmxpa2VseSgocGF1c2UgPCAwKSB8fCAocGF1c2UgPiAweGZmZmYpKSkKKwkJcGF1c2UgPSBQQVVTRV9USU1FOworCisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZChTVE1NQUNfWE1JVF9ERUJVRykgfHwgZGVmaW5lZChTVE1NQUNfUlhfREVCVUcpCitzdGF0aWMgdm9pZCBwcmludF9wa3QodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBqOworCXByX2luZm8oImxlbiA9ICVkIGJ5dGUsIGJ1ZiBhZGRyOiAweCVwIiwgbGVuLCBidWYpOworCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworCQlpZiAoKGogJSAxNikgPT0gMCkKKwkJCXByX2luZm8oIlxuICUwM3g6Iiwgaik7CisJCXByX2luZm8oIiAlMDJ4IiwgYnVmW2pdKTsKKwl9CisJcHJfaW5mbygiXG4iKTsKKwlyZXR1cm47Cit9CisjZW5kaWYKKworLyogbWluaW11bSBudW1iZXIgb2YgZnJlZSBUWCBkZXNjcmlwdG9ycyByZXF1aXJlZCB0byB3YWtlIHVwIFRYIHByb2Nlc3MgKi8KKyNkZWZpbmUgU1RNTUFDX1RYX1RIUkVTSCh4KQkoeC0+ZG1hX3R4X3NpemUvNCkKKworc3RhdGljIGlubGluZSB1MzIgc3RtbWFjX3R4X2F2YWlsKHN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gcHJpdi0+ZGlydHlfdHggKyBwcml2LT5kbWFfdHhfc2l6ZSAtIHByaXYtPmN1cl90eCAtIDE7Cit9CisKKy8qKgorICogc3RtbWFjX2FkanVzdF9saW5rCisgKiBAZGV2OiBuZXQgZGV2aWNlIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb246IGl0IGFkanVzdHMgdGhlIGxpbmsgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQgc3RtbWFjX2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbmV3X3N0YXRlID0gMDsKKwl1bnNpZ25lZCBpbnQgZmMgPSBwcml2LT5mbG93X2N0cmwsIHBhdXNlX3RpbWUgPSBwcml2LT5wYXVzZTsKKworCWlmIChwaHlkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJREJHKHByb2JlLCBERUJVRywgInN0bW1hY19hZGp1c3RfbGluazogY2FsbGVkLiAgYWRkcmVzcyAlZCBsaW5rICVkXG4iLAorCSAgICBwaHlkZXYtPmFkZHIsIHBoeWRldi0+bGluayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmIChwaHlkZXYtPmxpbmspIHsKKwkJdTMyIGN0cmwgPSByZWFkbChpb2FkZHIgKyBNQUNfQ1RSTF9SRUcpOworCisJCS8qIE5vdyB3ZSBtYWtlIHN1cmUgdGhhdCB3ZSBjYW4gYmUgaW4gZnVsbCBkdXBsZXggbW9kZS4KKwkJICogSWYgbm90LCB3ZSBvcGVyYXRlIGluIGhhbGYtZHVwbGV4IG1vZGUuICovCisJCWlmIChwaHlkZXYtPmR1cGxleCAhPSBwcml2LT5vbGRkdXBsZXgpIHsKKwkJCW5ld19zdGF0ZSA9IDE7CisJCQlpZiAoIShwaHlkZXYtPmR1cGxleCkpCisJCQkJY3RybCAmPSB+cHJpdi0+bWFjX3R5cGUtPmh3LmxpbmsuZHVwbGV4OworCQkJZWxzZQorCQkJCWN0cmwgfD0gcHJpdi0+bWFjX3R5cGUtPmh3LmxpbmsuZHVwbGV4OworCQkJcHJpdi0+b2xkZHVwbGV4ID0gcGh5ZGV2LT5kdXBsZXg7CisJCX0KKwkJLyogRmxvdyBDb250cm9sIG9wZXJhdGlvbiAqLworCQlpZiAocGh5ZGV2LT5wYXVzZSkKKwkJCXByaXYtPm1hY190eXBlLT5vcHMtPmZsb3dfY3RybChpb2FkZHIsIHBoeWRldi0+ZHVwbGV4LAorCQkJCQkJICAgICAgIGZjLCBwYXVzZV90aW1lKTsKKworCQlpZiAocGh5ZGV2LT5zcGVlZCAhPSBwcml2LT5zcGVlZCkgeworCQkJbmV3X3N0YXRlID0gMTsKKwkJCXN3aXRjaCAocGh5ZGV2LT5zcGVlZCkgeworCQkJY2FzZSAxMDAwOgorCQkJCWlmIChsaWtlbHkocHJpdi0+aXNfZ21hYykpCisJCQkJCWN0cmwgJj0gfnByaXYtPm1hY190eXBlLT5ody5saW5rLnBvcnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDEwMDoKKwkJCWNhc2UgMTA6CisJCQkJaWYgKHByaXYtPmlzX2dtYWMpIHsKKwkJCQkJY3RybCB8PSBwcml2LT5tYWNfdHlwZS0+aHcubGluay5wb3J0OworCQkJCQlpZiAocGh5ZGV2LT5zcGVlZCA9PSBTUEVFRF8xMDApIHsKKwkJCQkJCWN0cmwgfD0KKwkJCQkJCSAgICBwcml2LT5tYWNfdHlwZS0+aHcubGluay4KKwkJCQkJCSAgICBzcGVlZDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWN0cmwgJj0KKwkJCQkJCSAgICB+KHByaXYtPm1hY190eXBlLT5ody4KKwkJCQkJCSAgICAgIGxpbmsuc3BlZWQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJY3RybCAmPSB+cHJpdi0+bWFjX3R5cGUtPmh3LmxpbmsucG9ydDsKKwkJCQl9CisJCQkJcHJpdi0+Zml4X21hY19zcGVlZChwcml2LT5ic3BfcHJpdiwKKwkJCQkJCSAgICBwaHlkZXYtPnNwZWVkKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKG5ldGlmX21zZ19saW5rKHByaXYpKQorCQkJCQlwcl93YXJuaW5nKCIlczogU3BlZWQgKCVkKSBpcyBub3QgMTAiCisJCQkJICAgICAgICIgb3IgMTAwIVxuIiwgZGV2LT5uYW1lLCBwaHlkZXYtPnNwZWVkKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHJpdi0+c3BlZWQgPSBwaHlkZXYtPnNwZWVkOworCQl9CisKKwkJd3JpdGVsKGN0cmwsIGlvYWRkciArIE1BQ19DVFJMX1JFRyk7CisKKwkJaWYgKCFwcml2LT5vbGRsaW5rKSB7CisJCQluZXdfc3RhdGUgPSAxOworCQkJcHJpdi0+b2xkbGluayA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKHByaXYtPm9sZGxpbmspIHsKKwkJbmV3X3N0YXRlID0gMTsKKwkJcHJpdi0+b2xkbGluayA9IDA7CisJCXByaXYtPnNwZWVkID0gMDsKKwkJcHJpdi0+b2xkZHVwbGV4ID0gLTE7CisJfQorCisJaWYgKG5ld19zdGF0ZSAmJiBuZXRpZl9tc2dfbGluayhwcml2KSkKKwkJcGh5X3ByaW50X3N0YXR1cyhwaHlkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJREJHKHByb2JlLCBERUJVRywgInN0bW1hY19hZGp1c3RfbGluazogZXhpdGluZ1xuIik7Cit9CisKKy8qKgorICogc3RtbWFjX2luaXRfcGh5IC0gUEhZIGluaXRpYWxpemF0aW9uCisgKiBAZGV2OiBuZXQgZGV2aWNlIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb246IGl0IGluaXRpYWxpemVzIHRoZSBkcml2ZXIncyBQSFkgc3RhdGUsIGFuZCBhdHRhY2hlcyB0aGUgUEhZCisgKiB0byB0aGUgbWFjIGRyaXZlci4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgc3RtbWFjX2luaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OworCWNoYXIgcGh5X2lkW0JVU19JRF9TSVpFXTsJLyogUEhZIHRvIGNvbm5lY3QgKi8KKwljaGFyIGJ1c19pZFtCVVNfSURfU0laRV07CisKKwlwcml2LT5vbGRsaW5rID0gMDsKKwlwcml2LT5zcGVlZCA9IDA7CisJcHJpdi0+b2xkZHVwbGV4ID0gLTE7CisKKwlpZiAocHJpdi0+cGh5X2FkZHIgPT0gLTEpIHsKKwkJLyogV2UgZG9uJ3QgaGF2ZSBhIFBIWSwgc28gZG8gbm90aGluZyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlzbnByaW50ZihidXNfaWQsIE1JSV9CVVNfSURfU0laRSwgIiV4IiwgcHJpdi0+YnVzX2lkKTsKKwlzbnByaW50ZihwaHlfaWQsIEJVU19JRF9TSVpFLCBQSFlfSURfRk1ULCBidXNfaWQsIHByaXYtPnBoeV9hZGRyKTsKKwlwcl9kZWJ1Zygic3RtbWFjX2luaXRfcGh5OiAgdHJ5aW5nIHRvIGF0dGFjaCB0byAlc1xuIiwgcGh5X2lkKTsKKworCXBoeWRldiA9IHBoeV9jb25uZWN0KGRldiwgcGh5X2lkLCAmc3RtbWFjX2FkanVzdF9saW5rLCAwLAorCQkJcHJpdi0+cGh5X2ludGVyZmFjZSk7CisKKwlpZiAoSVNfRVJSKHBoeWRldikpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGF0dGFjaCB0byBQSFlcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiBQVFJfRVJSKHBoeWRldik7CisJfQorCisJLyoKKwkgKiBCcm9rZW4gSFcgaXMgc29tZXRpbWVzIG1pc3NpbmcgdGhlIHB1bGwtdXAgcmVzaXN0b3Igb24gdGhlCisJICogTURJTyBsaW5lLCB3aGljaCByZXN1bHRzIGluIHJlYWRzIHRvIG5vbi1leGlzdGVudCBkZXZpY2VzIHJldHVybmluZworCSAqIDAgcmF0aGVyIHRoYW4gMHhmZmZmLiBDYXRjaCB0aGlzIGhlcmUgYW5kIHRyZWF0IDAgYXMgYSBub24tZXhpc3RlbnQKKwkgKiBkZXZpY2UgYXMgd2VsbC4KKwkgKiBOb3RlOiBwaHlkZXYtPnBoeV9pZCBpcyB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgdGhlIFVJRCBQSFkgcmVnaXN0ZXJzLgorCSAqLworCWlmIChwaHlkZXYtPnBoeV9pZCA9PSAwKSB7CisJCXBoeV9kaXNjb25uZWN0KHBoeWRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwcl9kZWJ1Zygic3RtbWFjX2luaXRfcGh5OiAgJXM6IGF0dGFjaGVkIHRvIFBIWSAoVUlEIDB4JXgpIgorCSAgICAgICAiIExpbmsgPSAlZFxuIiwgZGV2LT5uYW1lLCBwaHlkZXYtPnBoeV9pZCwgcGh5ZGV2LT5saW5rKTsKKworCXByaXYtPnBoeWRldiA9IHBoeWRldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RtbWFjX21hY19lbmFibGVfcngodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJdTMyIHZhbHVlID0gcmVhZGwoaW9hZGRyICsgTUFDX0NUUkxfUkVHKTsKKwl2YWx1ZSB8PSBNQUNfUk5BQkxFX1JYOworCS8qIFNldCB0aGUgUkUgKHJlY2VpdmUgZW5hYmxlIGJpdCBpbnRvIHRoZSBNQUMgQ1RSTCByZWdpc3RlcikuICAqLworCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgTUFDX0NUUkxfUkVHKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0bW1hY19tYWNfZW5hYmxlX3R4KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIE1BQ19DVFJMX1JFRyk7CisJdmFsdWUgfD0gTUFDX0VOQUJMRV9UWDsKKwkvKiBTZXQgdGhlIFRFICh0cmFuc21pdCBlbmFibGUgYml0IGludG8gdGhlIE1BQyBDVFJMIHJlZ2lzdGVyKS4gICovCisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBNQUNfQ1RSTF9SRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RtbWFjX21hY19kaXNhYmxlX3J4KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIE1BQ19DVFJMX1JFRyk7CisJdmFsdWUgJj0gfk1BQ19STkFCTEVfUlg7CisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBNQUNfQ1RSTF9SRUcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RtbWFjX21hY19kaXNhYmxlX3R4KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIE1BQ19DVFJMX1JFRyk7CisJdmFsdWUgJj0gfk1BQ19FTkFCTEVfVFg7CisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBNQUNfQ1RSTF9SRUcpOworfQorCisvKioKKyAqIGRpc3BsYXlfcmluZworICogQHA6IHBvaW50ZXIgdG8gdGhlIHJpbmcuCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgcmluZy4KKyAqIERlc2NyaXB0aW9uOiBkaXNwbGF5IGFsbCB0aGUgZGVzY3JpcHRvcnMgd2l0aGluIHRoZSByaW5nLgorICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X3Jpbmcoc3RydWN0IGRtYV9kZXNjICpwLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgdG1wX3MgeworCQl1NjQgYTsKKwkJdW5zaWduZWQgaW50IGI7CisJCXVuc2lnbmVkIGludCBjOworCX07CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlzdHJ1Y3QgdG1wX3MgKnggPSAoc3RydWN0IHRtcF9zICopKHAgKyBpKTsKKwkJcHJfaW5mbygiXHQlZCBbMHgleF06IERFUzA9MHgleCBERVMxPTB4JXggQlVGMT0weCV4IEJVRjI9MHgleCIsCisJCSAgICAgICBpLCAodW5zaWduZWQgaW50KXZpcnRfdG9fcGh5cygmcFtpXSksCisJCSAgICAgICAodW5zaWduZWQgaW50KSh4LT5hKSwgKHVuc2lnbmVkIGludCkoKHgtPmEpID4+IDMyKSwKKwkJICAgICAgIHgtPmIsIHgtPmMpOworCQlwcl9pbmZvKCJcbiIpOworCX0KK30KKworLyoqCisgKiBpbml0X2RtYV9kZXNjX3JpbmdzIC0gaW5pdCB0aGUgUlgvVFggZGVzY3JpcHRvciByaW5ncworICogQGRldjogbmV0IGRldmljZSBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uOiAgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgRE1BIFJYL1RYIGRlc2NyaXB0b3JzCisgKiBhbmQgYWxsb2NhdGVzIHRoZSBzb2NrZXQgYnVmZmVycy4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9kbWFfZGVzY19yaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgdHhzaXplID0gcHJpdi0+ZG1hX3R4X3NpemU7CisJdW5zaWduZWQgaW50IHJ4c2l6ZSA9IHByaXYtPmRtYV9yeF9zaXplOworCXVuc2lnbmVkIGludCBiZnNpemUgPSBwcml2LT5kbWFfYnVmX3N6OworCWludCBidWZmMl9uZWVkZWQgPSAwOworCWludCBkaXNfaWMgPSAwOworCisjaWZkZWYgQ09ORklHX1NUTU1BQ19USU1FUgorCS8qIFVzaW5nIFRpbWVycyBkaXNhYmxlIGludGVycnVwdHMgb24gY29tcGxldGlvbiBmb3IgdGhlIHJlY2VwdGlvbiAqLworCWRpc19pYyA9IDE7CisjZW5kaWYKKwkvKiBTZXQgdGhlIEJ1ZmZlciBzaXplIGFjY29yZGluZyB0byB0aGUgTVRVOworCSAqIGluZGVlZCwgaW4gY2FzZSBvZiBqdW1ibyB3ZSBuZWVkIHRvIGJ1bXAtdXAgdGhlIGJ1ZmZlciBzaXplcy4KKwkgKi8KKwlpZiAodW5saWtlbHkoZGV2LT5tdHUgPj0gQlVGX1NJWkVfOEtpQikpCisJCWJmc2l6ZSA9IEJVRl9TSVpFXzE2S2lCOworCWVsc2UgaWYgKHVubGlrZWx5KGRldi0+bXR1ID49IEJVRl9TSVpFXzRLaUIpKQorCQliZnNpemUgPSBCVUZfU0laRV84S2lCOworCWVsc2UgaWYgKHVubGlrZWx5KGRldi0+bXR1ID49IEJVRl9TSVpFXzJLaUIpKQorCQliZnNpemUgPSBCVUZfU0laRV80S2lCOworCWVsc2UgaWYgKHVubGlrZWx5KGRldi0+bXR1ID49IERNQV9CVUZGRVJfU0laRSkpCisJCWJmc2l6ZSA9IEJVRl9TSVpFXzJLaUI7CisJZWxzZQorCQliZnNpemUgPSBETUFfQlVGRkVSX1NJWkU7CisKKwkvKiBJZiB0aGUgTVRVIGV4Y2VlZHMgOGsgc28gdXNlIHRoZSBzZWNvbmQgYnVmZmVyIGluIHRoZSBjaGFpbiAqLworCWlmIChiZnNpemUgPj0gQlVGX1NJWkVfOEtpQikKKwkJYnVmZjJfbmVlZGVkID0gMTsKKworCURCRyhwcm9iZSwgSU5GTywgInN0bW1hYzogdHhzaXplICVkLCByeHNpemUgJWQsIGJmc2l6ZSAlZFxuIiwKKwkgICAgdHhzaXplLCByeHNpemUsIGJmc2l6ZSk7CisKKwlwcml2LT5yeF9za2J1ZmZfZG1hID0ga21hbGxvYyhyeHNpemUgKiBzaXplb2YoZG1hX2FkZHJfdCksIEdGUF9LRVJORUwpOworCXByaXYtPnJ4X3NrYnVmZiA9CisJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBza19idWZmICopICogcnhzaXplLCBHRlBfS0VSTkVMKTsKKwlwcml2LT5kbWFfcnggPQorCSAgICAoc3RydWN0IGRtYV9kZXNjICopZG1hX2FsbG9jX2NvaGVyZW50KHByaXYtPmRldmljZSwKKwkJCQkJCSAgcnhzaXplICoKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYyksCisJCQkJCQkgICZwcml2LT5kbWFfcnhfcGh5LAorCQkJCQkJICBHRlBfS0VSTkVMKTsKKwlwcml2LT50eF9za2J1ZmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSAqIHR4c2l6ZSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJcHJpdi0+ZG1hX3R4ID0KKwkgICAgKHN0cnVjdCBkbWFfZGVzYyAqKWRtYV9hbGxvY19jb2hlcmVudChwcml2LT5kZXZpY2UsCisJCQkJCQkgIHR4c2l6ZSAqCisJCQkJCQkgIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpLAorCQkJCQkJICAmcHJpdi0+ZG1hX3R4X3BoeSwKKwkJCQkJCSAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoKHByaXYtPmRtYV9yeCA9PSBOVUxMKSB8fCAocHJpdi0+ZG1hX3R4ID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6RVJST1IgYWxsb2NhdGluZyB0aGUgRE1BIFR4L1J4IGRlc2NcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCURCRyhwcm9iZSwgSU5GTywgInN0bW1hYyAoJXMpIERNQSBkZXNjIHJpbmdzOiB2aXJ0IGFkZHIgKFJ4ICVwLCAiCisJICAgICJUeCAlcClcblx0RE1BIHBoeSBhZGRyIChSeCAweCUwOHgsIFR4IDB4JTA4eClcbiIsCisJICAgIGRldi0+bmFtZSwgcHJpdi0+ZG1hX3J4LCBwcml2LT5kbWFfdHgsCisJICAgICh1bnNpZ25lZCBpbnQpcHJpdi0+ZG1hX3J4X3BoeSwgKHVuc2lnbmVkIGludClwcml2LT5kbWFfdHhfcGh5KTsKKworCS8qIFJYIElOSVRJQUxJWkFUSU9OICovCisJREJHKHByb2JlLCBJTkZPLCAic3RtbWFjOiBTS0IgYWRkcmVzc2VzOlxuIgorCQkJICJza2JcdFx0c2tiIGRhdGFcdGRtYSBkYXRhXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCByeHNpemU7IGkrKykgeworCQlzdHJ1Y3QgZG1hX2Rlc2MgKnAgPSBwcml2LT5kbWFfcnggKyBpOworCisJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24oZGV2LCBiZnNpemUpOworCQlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKSB7CisJCQlwcl9lcnIoIiVzOiBSeCBpbml0IGZhaWxzOyBza2IgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwkJcHJpdi0+cnhfc2tidWZmW2ldID0gc2tiOworCQlwcml2LT5yeF9za2J1ZmZfZG1hW2ldID0gZG1hX21hcF9zaW5nbGUocHJpdi0+ZGV2aWNlLCBza2ItPmRhdGEsCisJCQkJCQliZnNpemUsIERNQV9GUk9NX0RFVklDRSk7CisKKwkJcC0+ZGVzMiA9IHByaXYtPnJ4X3NrYnVmZl9kbWFbaV07CisJCWlmICh1bmxpa2VseShidWZmMl9uZWVkZWQpKQorCQkJcC0+ZGVzMyA9IHAtPmRlczIgKyBCVUZfU0laRV84S2lCOworCQlEQkcocHJvYmUsIElORk8sICJbJXBdXHRbJXBdXHRbJXhdXG4iLCBwcml2LT5yeF9za2J1ZmZbaV0sCisJCQlwcml2LT5yeF9za2J1ZmZbaV0tPmRhdGEsIHByaXYtPnJ4X3NrYnVmZl9kbWFbaV0pOworCX0KKwlwcml2LT5jdXJfcnggPSAwOworCXByaXYtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIHJ4c2l6ZSk7CisJcHJpdi0+ZG1hX2J1Zl9zeiA9IGJmc2l6ZTsKKwlidWZfc3ogPSBiZnNpemU7CisKKwkvKiBUWCBJTklUSUFMSVpBVElPTiAqLworCWZvciAoaSA9IDA7IGkgPCB0eHNpemU7IGkrKykgeworCQlwcml2LT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlwcml2LT5kbWFfdHhbaV0uZGVzMiA9IDA7CisJfQorCXByaXYtPmRpcnR5X3R4ID0gMDsKKwlwcml2LT5jdXJfdHggPSAwOworCisJLyogQ2xlYXIgdGhlIFJ4L1R4IGRlc2NyaXB0b3JzICovCisJcHJpdi0+bWFjX3R5cGUtPm9wcy0+aW5pdF9yeF9kZXNjKHByaXYtPmRtYV9yeCwgcnhzaXplLCBkaXNfaWMpOworCXByaXYtPm1hY190eXBlLT5vcHMtPmluaXRfdHhfZGVzYyhwcml2LT5kbWFfdHgsIHR4c2l6ZSk7CisKKwlpZiAobmV0aWZfbXNnX2h3KHByaXYpKSB7CisJCXByX2luZm8oIlJYIGRlc2NyaXB0b3IgcmluZzpcbiIpOworCQlkaXNwbGF5X3JpbmcocHJpdi0+ZG1hX3J4LCByeHNpemUpOworCQlwcl9pbmZvKCJUWCBkZXNjcmlwdG9yIHJpbmc6XG4iKTsKKwkJZGlzcGxheV9yaW5nKHByaXYtPmRtYV90eCwgdHhzaXplKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkbWFfZnJlZV9yeF9za2J1ZnMoc3RydWN0IHN0bW1hY19wcml2ICpwcml2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHByaXYtPmRtYV9yeF9zaXplOyBpKyspIHsKKwkJaWYgKHByaXYtPnJ4X3NrYnVmZltpXSkgeworCQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5kZXZpY2UsIHByaXYtPnJ4X3NrYnVmZl9kbWFbaV0sCisJCQkJCSBwcml2LT5kbWFfYnVmX3N6LCBETUFfRlJPTV9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tidWZmW2ldKTsKKwkJfQorCQlwcml2LT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9mcmVlX3R4X3NrYnVmcyhzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZG1hX3R4X3NpemU7IGkrKykgeworCQlpZiAocHJpdi0+dHhfc2tidWZmW2ldICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBkbWFfZGVzYyAqcCA9IHByaXYtPmRtYV90eCArIGk7CisJCQlpZiAocC0+ZGVzMikKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldmljZSwgcC0+ZGVzMiwKKwkJCQkgcHJpdi0+bWFjX3R5cGUtPm9wcy0+Z2V0X3R4X2xlbihwKSwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT50eF9za2J1ZmZbaV0pOworCQkJcHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZG1hX2Rlc2NfcmVzb3VyY2VzKHN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdikKK3sKKwkvKiBSZWxlYXNlIHRoZSBETUEgVFgvUlggc29ja2V0IGJ1ZmZlcnMgKi8KKwlkbWFfZnJlZV9yeF9za2J1ZnMocHJpdik7CisJZG1hX2ZyZWVfdHhfc2tidWZzKHByaXYpOworCisJLyogRnJlZSB0aGUgcmVnaW9uIG9mIGNvbnNpc3RlbnQgbWVtb3J5IHByZXZpb3VzbHkgYWxsb2NhdGVkIGZvcgorCSAqIHRoZSBETUEgKi8KKwlkbWFfZnJlZV9jb2hlcmVudChwcml2LT5kZXZpY2UsCisJCQkgIHByaXYtPmRtYV90eF9zaXplICogc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYyksCisJCQkgIHByaXYtPmRtYV90eCwgcHJpdi0+ZG1hX3R4X3BoeSk7CisJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2aWNlLAorCQkJICBwcml2LT5kbWFfcnhfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpLAorCQkJICBwcml2LT5kbWFfcngsIHByaXYtPmRtYV9yeF9waHkpOworCWtmcmVlKHByaXYtPnJ4X3NrYnVmZl9kbWEpOworCWtmcmVlKHByaXYtPnJ4X3NrYnVmZik7CisJa2ZyZWUocHJpdi0+dHhfc2tidWZmKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBzdG1tYWNfZG1hX3N0YXJ0X3R4CisgKiBAaW9hZGRyOiBkZXZpY2UgSS9PIGFkZHJlc3MKKyAqIERlc2NyaXB0aW9uOiAgdGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIERNQSB0eCBwcm9jZXNzLgorICovCitzdGF0aWMgdm9pZCBzdG1tYWNfZG1hX3N0YXJ0X3R4KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIERNQV9DT05UUk9MKTsKKwl2YWx1ZSB8PSBETUFfQ09OVFJPTF9TVDsKKwl3cml0ZWwodmFsdWUsIGlvYWRkciArIERNQV9DT05UUk9MKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHN0bW1hY19kbWFfc3RvcF90eCh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwl1MzIgdmFsdWUgPSByZWFkbChpb2FkZHIgKyBETUFfQ09OVFJPTCk7CisJdmFsdWUgJj0gfkRNQV9DT05UUk9MX1NUOworCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgRE1BX0NPTlRST0wpOworCXJldHVybjsKK30KKworLyoqCisgKiBzdG1tYWNfZG1hX3N0YXJ0X3J4CisgKiBAaW9hZGRyOiBkZXZpY2UgSS9PIGFkZHJlc3MKKyAqIERlc2NyaXB0aW9uOiAgdGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIERNQSByeCBwcm9jZXNzLgorICovCitzdGF0aWMgdm9pZCBzdG1tYWNfZG1hX3N0YXJ0X3J4KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIERNQV9DT05UUk9MKTsKKwl2YWx1ZSB8PSBETUFfQ09OVFJPTF9TUjsKKwl3cml0ZWwodmFsdWUsIGlvYWRkciArIERNQV9DT05UUk9MKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc3RtbWFjX2RtYV9zdG9wX3J4KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIERNQV9DT05UUk9MKTsKKwl2YWx1ZSAmPSB+RE1BX0NPTlRST0xfU1I7CisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBETUFfQ09OVFJPTCk7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogIHN0bW1hY19kbWFfb3BlcmF0aW9uX21vZGUgLSBIVyBETUEgb3BlcmF0aW9uIG1vZGUKKyAqICBAcHJpdiA6IHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjogaXQgc2V0cyB0aGUgRE1BIG9wZXJhdGlvbiBtb2RlOiB0eC9yeCBETUEgdGhyZXNob2xkcworICogIG9yIFN0b3JlLUFuZC1Gb3J3YXJkIGNhcGFiaWxpdHkuIEl0IGFsc28gdmVyaWZpZXMgdGhlIENPRSBmb3IgdGhlCisgKiAgdHJhbnNtaXNzaW9uIGluIGNhc2Ugb2YgR2lnYSBFVEguCisgKi8KK3N0YXRpYyB2b2lkIHN0bW1hY19kbWFfb3BlcmF0aW9uX21vZGUoc3RydWN0IHN0bW1hY19wcml2ICpwcml2KQoreworCWlmICghcHJpdi0+aXNfZ21hYykgeworCQkvKiBNQUMgMTAvMTAwICovCisJCXByaXYtPm1hY190eXBlLT5vcHMtPmRtYV9tb2RlKHByaXYtPmRldi0+YmFzZV9hZGRyLCB0YywgMCk7CisJCXByaXYtPnR4X2NvZSA9IE5PX0hXX0NTVU07CisJfSBlbHNlIHsKKwkJaWYgKChwcml2LT5kZXYtPm10dSA8PSBFVEhfREFUQV9MRU4pICYmICh0eF9jb2UpKSB7CisJCQlwcml2LT5tYWNfdHlwZS0+b3BzLT5kbWFfbW9kZShwcml2LT5kZXYtPmJhc2VfYWRkciwKKwkJCQkJCSAgICAgIFNGX0RNQV9NT0RFLCBTRl9ETUFfTU9ERSk7CisJCQl0YyA9IFNGX0RNQV9NT0RFOworCQkJcHJpdi0+dHhfY29lID0gSFdfQ1NVTTsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrc3VtIGNvbXB1dGF0aW9uIGlzIHBlcmZvcm1lZCBpbiBzb2Z0d2FyZS4gKi8KKwkJCXByaXYtPm1hY190eXBlLT5vcHMtPmRtYV9tb2RlKHByaXYtPmRldi0+YmFzZV9hZGRyLCB0YywKKwkJCQkJCSAgICAgIFNGX0RNQV9NT0RFKTsKKwkJCXByaXYtPnR4X2NvZSA9IE5PX0hXX0NTVU07CisJCX0KKwl9CisJdHhfY29lID0gcHJpdi0+dHhfY29lOworCisJcmV0dXJuOworfQorCisjaWZkZWYgU1RNTUFDX0RFQlVHCisvKioKKyAqIHNob3dfdHhfcHJvY2Vzc19zdGF0ZQorICogQHN0YXR1czogdHggZGVzY3JpcHRvciBzdGF0dXMgZmllbGQKKyAqIERlc2NyaXB0aW9uOiBpdCBzaG93cyB0aGUgVHJhbnNtaXQgUHJvY2VzcyBTdGF0ZSBmb3IgQ1NSNVsyMjoyMF0KKyAqLworc3RhdGljIHZvaWQgc2hvd190eF9wcm9jZXNzX3N0YXRlKHVuc2lnbmVkIGludCBzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IHN0YXRlOworCXN0YXRlID0gKHN0YXR1cyAmIERNQV9TVEFUVVNfVFNfTUFTSykgPj4gRE1BX1NUQVRVU19UU19TSElGVDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIDA6CisJCXByX2luZm8oIi0gVFggKFN0b3BwZWQpOiBSZXNldCBvciBTdG9wIGNvbW1hbmRcbiIpOworCQlicmVhazsKKwljYXNlIDE6CisJCXByX2luZm8oIi0gVFggKFJ1bm5pbmcpOkZldGNoaW5nIHRoZSBUeCBkZXNjXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcl9pbmZvKCItIFRYIChSdW5uaW5nKTogV2FpdGluZyBmb3IgZW5kIG9mIHR4XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwcl9pbmZvKCItIFRYIChSdW5uaW5nKTogUmVhZGluZyB0aGUgZGF0YSAiCisJCSAgICAgICAiYW5kIHF1ZXVpbmcgdGhlIGRhdGEgaW50byB0aGUgVHggYnVmXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlwcl9pbmZvKCItIFRYIChTdXNwZW5kZWQpOiBUeCBCdWZmIFVuZGVyZmxvdyAiCisJCSAgICAgICAib3IgYW4gdW5hdmFpbGFibGUgVHJhbnNtaXQgZGVzY3JpcHRvclxuIik7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJcHJfaW5mbygiLSBUWCAoUnVubmluZyk6IENsb3NpbmcgVHggZGVzY3JpcHRvclxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogc2hvd19yeF9wcm9jZXNzX3N0YXRlCisgKiBAc3RhdHVzOiByeCBkZXNjcmlwdG9yIHN0YXR1cyBmaWVsZAorICogRGVzY3JpcHRpb246IGl0IHNob3dzIHRoZSAgUmVjZWl2ZSBQcm9jZXNzIFN0YXRlIGZvciBDU1I1WzE5OjE3XQorICovCitzdGF0aWMgdm9pZCBzaG93X3J4X3Byb2Nlc3Nfc3RhdGUodW5zaWduZWQgaW50IHN0YXR1cykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdGU7CisJc3RhdGUgPSAoc3RhdHVzICYgRE1BX1NUQVRVU19SU19NQVNLKSA+PiBETUFfU1RBVFVTX1JTX1NISUZUOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgMDoKKwkJcHJfaW5mbygiLSBSWCAoU3RvcHBlZCk6IFJlc2V0IG9yIFN0b3AgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcHJfaW5mbygiLSBSWCAoUnVubmluZyk6IEZldGNoaW5nIHRoZSBSeCBkZXNjXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcl9pbmZvKCItIFJYIChSdW5uaW5nKTpDaGVja2luZyBmb3IgZW5kIG9mIHBrdFxuIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcHJfaW5mbygiLSBSWCAoUnVubmluZyk6IFdhaXRpbmcgZm9yIFJ4IHBrdFxuIik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcHJfaW5mbygiLSBSWCAoU3VzcGVuZGVkKTogVW5hdmFpbGFibGUgUnggYnVmXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlwcl9pbmZvKCItIFJYIChSdW5uaW5nKTogQ2xvc2luZyBSeCBkZXNjcmlwdG9yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlwcl9pbmZvKCItIFJYKFJ1bm5pbmcpOiBGbHVzaGluZyB0aGUgY3VycmVudCBmcmFtZSIKKwkJICAgICAgICIgZnJvbSB0aGUgUnggYnVmXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlwcl9pbmZvKCItIFJYIChSdW5uaW5nKTogUXVldWluZyB0aGUgUnggZnJhbWUiCisJCSAgICAgICAiIGZyb20gdGhlIFJ4IGJ1ZiBpbnRvIG1lbW9yeVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisjZW5kaWYKKworLyoqCisgKiBzdG1tYWNfdHg6CisgKiBAcHJpdjogcHJpdmF0ZSBkcml2ZXIgc3RydWN0dXJlCisgKiBEZXNjcmlwdGlvbjogaXQgcmVjbGFpbXMgcmVzb3VyY2VzIGFmdGVyIHRyYW5zbWlzc2lvbiBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyB2b2lkIHN0bW1hY190eChzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IHR4c2l6ZSA9IHByaXYtPmRtYV90eF9zaXplOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gcHJpdi0+ZGV2LT5iYXNlX2FkZHI7CisKKwl3aGlsZSAocHJpdi0+ZGlydHlfdHggIT0gcHJpdi0+Y3VyX3R4KSB7CisJCWludCBsYXN0OworCQl1bnNpZ25lZCBpbnQgZW50cnkgPSBwcml2LT5kaXJ0eV90eCAlIHR4c2l6ZTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnR4X3NrYnVmZltlbnRyeV07CisJCXN0cnVjdCBkbWFfZGVzYyAqcCA9IHByaXYtPmRtYV90eCArIGVudHJ5OworCisJCS8qIENoZWNrIGlmIHRoZSBkZXNjcmlwdG9yIGlzIG93bmVkIGJ5IHRoZSBETUEuICovCisJCWlmIChwcml2LT5tYWNfdHlwZS0+b3BzLT5nZXRfdHhfb3duZXIocCkpCisJCQlicmVhazsKKworCQkvKiBWZXJpZnkgdHggZXJyb3IgYnkgbG9va2luZyBhdCB0aGUgbGFzdCBzZWdtZW50ICovCisJCWxhc3QgPSBwcml2LT5tYWNfdHlwZS0+b3BzLT5nZXRfdHhfbHMocCk7CisJCWlmIChsaWtlbHkobGFzdCkpIHsKKwkJCWludCB0eF9lcnJvciA9CisJCQkgICAgcHJpdi0+bWFjX3R5cGUtPm9wcy0+dHhfc3RhdHVzKCZwcml2LT5kZXYtPnN0YXRzLAorCQkJCQkJCSAgICZwcml2LT54c3RhdHMsCisJCQkJCQkJICAgcCwgaW9hZGRyKTsKKwkJCWlmIChsaWtlbHkodHhfZXJyb3IgPT0gMCkpIHsKKwkJCQlwcml2LT5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQlwcml2LT54c3RhdHMudHhfcGt0X24rKzsKKwkJCX0gZWxzZQorCQkJCXByaXYtPmRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCX0KKwkJVFhfREJHKCIlczogY3VyciAlZCwgZGlydHkgJWRcbiIsIF9fZnVuY19fLAorCQkJcHJpdi0+Y3VyX3R4LCBwcml2LT5kaXJ0eV90eCk7CisKKwkJaWYgKGxpa2VseShwLT5kZXMyKSkKKwkJCWRtYV91bm1hcF9zaW5nbGUocHJpdi0+ZGV2aWNlLCBwLT5kZXMyLAorCQkJCQkgcHJpdi0+bWFjX3R5cGUtPm9wcy0+Z2V0X3R4X2xlbihwKSwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCQlpZiAodW5saWtlbHkocC0+ZGVzMykpCisJCQlwLT5kZXMzID0gMDsKKworCQlpZiAobGlrZWx5KHNrYiAhPSBOVUxMKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZXJlJ3Mgcm9vbSBpbiB0aGUgcXVldWUgKGxpbWl0IGl0IHRvIHNpemUpCisJCQkgKiB3ZSBhZGQgdGhpcyBza2IgYmFjayBpbnRvIHRoZSBwb29sLAorCQkJICogaWYgaXQncyB0aGUgcmlnaHQgc2l6ZS4KKwkJCSAqLworCQkJaWYgKChza2JfcXVldWVfbGVuKCZwcml2LT5yeF9yZWN5Y2xlKSA8CisJCQkJcHJpdi0+ZG1hX3J4X3NpemUpICYmCisJCQkJc2tiX3JlY3ljbGVfY2hlY2soc2tiLCBwcml2LT5kbWFfYnVmX3N6KSkKKwkJCQlfX3NrYl9xdWV1ZV9oZWFkKCZwcml2LT5yeF9yZWN5Y2xlLCBza2IpOworCQkJZWxzZQorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCQkJcHJpdi0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCX0KKworCQlwcml2LT5tYWNfdHlwZS0+b3BzLT5yZWxlYXNlX3R4X2Rlc2MocCk7CisKKwkJZW50cnkgPSAoKytwcml2LT5kaXJ0eV90eCkgJSB0eHNpemU7CisJfQorCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPmRldikgJiYKKwkJICAgICBzdG1tYWNfdHhfYXZhaWwocHJpdikgPiBTVE1NQUNfVFhfVEhSRVNIKHByaXYpKSkgeworCQluZXRpZl90eF9sb2NrKHByaXYtPmRldik7CisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPmRldikgJiYKKwkJICAgICBzdG1tYWNfdHhfYXZhaWwocHJpdikgPiBTVE1NQUNfVFhfVEhSRVNIKHByaXYpKSB7CisJCQlUWF9EQkcoIiVzOiByZXN0YXJ0IHRyYW5zbWl0XG4iLCBfX2Z1bmNfXyk7CisJCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPmRldik7CisJCX0KKwkJbmV0aWZfdHhfdW5sb2NrKHByaXYtPmRldik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0bW1hY19lbmFibGVfaXJxKHN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdikKK3sKKyNpZm5kZWYgQ09ORklHX1NUTU1BQ19USU1FUgorCXdyaXRlbChETUFfSU5UUl9ERUZBVUxUX01BU0ssIHByaXYtPmRldi0+YmFzZV9hZGRyICsgRE1BX0lOVFJfRU5BKTsKKyNlbHNlCisJcHJpdi0+dG0tPnRpbWVyX3N0YXJ0KHRtcmF0ZSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0bW1hY19kaXNhYmxlX2lycShzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYpCit7CisjaWZuZGVmIENPTkZJR19TVE1NQUNfVElNRVIKKwl3cml0ZWwoMCwgcHJpdi0+ZGV2LT5iYXNlX2FkZHIgKyBETUFfSU5UUl9FTkEpOworI2Vsc2UKKwlwcml2LT50bS0+dGltZXJfc3RvcCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RtbWFjX2hhc193b3JrKHN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgaGFzX3dvcmsgPSAwOworCWludCByeHJldCwgdHhfd29yayA9IDA7CisKKwlyeHJldCA9IHByaXYtPm1hY190eXBlLT5vcHMtPmdldF9yeF9vd25lcihwcml2LT5kbWFfcnggKworCQkocHJpdi0+Y3VyX3J4ICUgcHJpdi0+ZG1hX3J4X3NpemUpKTsKKworCWlmIChwcml2LT5kaXJ0eV90eCAhPSBwcml2LT5jdXJfdHgpCisJCXR4X3dvcmsgPSAxOworCisJaWYgKGxpa2VseSghcnhyZXQgfHwgdHhfd29yaykpCisJCWhhc193b3JrID0gMTsKKworCXJldHVybiBoYXNfd29yazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9zdG1tYWNfc2NoZWR1bGUoc3RydWN0IHN0bW1hY19wcml2ICpwcml2KQoreworCWlmIChsaWtlbHkoc3RtbWFjX2hhc193b3JrKHByaXYpKSkgeworCQlzdG1tYWNfZGlzYWJsZV9pcnEocHJpdik7CisJCW5hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGkpOworCX0KK30KKworI2lmZGVmIENPTkZJR19TVE1NQUNfVElNRVIKK3ZvaWQgc3RtbWFjX3NjaGVkdWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaXYtPnhzdGF0cy5zY2hlZF90aW1lcl9uKys7CisKKwlfc3RtbWFjX3NjaGVkdWxlKHByaXYpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzdG1tYWNfbm9fdGltZXJfc3RhcnRlZCh1bnNpZ25lZCBpbnQgeCkKK3s7Cit9OworCitzdGF0aWMgdm9pZCBzdG1tYWNfbm9fdGltZXJfc3RvcHBlZCh2b2lkKQorezsKK307CisjZW5kaWYKKworLyoqCisgKiBzdG1tYWNfdHhfZXJyOgorICogQHByaXY6IHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgZGV2aWNlIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb246IGl0IGNsZWFucyB0aGUgZGVzY3JpcHRvcnMgYW5kIHJlc3RhcnRzIHRoZSB0cmFuc21pc3Npb24KKyAqIGluIGNhc2Ugb2YgZXJyb3JzLgorICovCitzdGF0aWMgdm9pZCBzdG1tYWNfdHhfZXJyKHN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPmRldik7CisKKwlzdG1tYWNfZG1hX3N0b3BfdHgocHJpdi0+ZGV2LT5iYXNlX2FkZHIpOworCWRtYV9mcmVlX3R4X3NrYnVmcyhwcml2KTsKKwlwcml2LT5tYWNfdHlwZS0+b3BzLT5pbml0X3R4X2Rlc2MocHJpdi0+ZG1hX3R4LCBwcml2LT5kbWFfdHhfc2l6ZSk7CisJcHJpdi0+ZGlydHlfdHggPSAwOworCXByaXYtPmN1cl90eCA9IDA7CisJc3RtbWFjX2RtYV9zdGFydF90eChwcml2LT5kZXYtPmJhc2VfYWRkcik7CisKKwlwcml2LT5kZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCW5ldGlmX3dha2VfcXVldWUocHJpdi0+ZGV2KTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBzdG1tYWNfZG1hX2ludGVycnVwdCAtIEludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgZHJpdmVyCisgKiBAZGV2OiBuZXQgZGV2aWNlIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb246IEludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgZHJpdmVyIChETUEpLgorICovCitzdGF0aWMgdm9pZCBzdG1tYWNfZG1hX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkvKiByZWFkIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKENTUjUpICovCisJdTMyIGludHJfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgRE1BX1NUQVRVUyk7CisKKwlEQkcoaW50ciwgSU5GTywgIiVzOiBbQ1NSNTogMHglMDh4XVxuIiwgX19mdW5jX18sIGludHJfc3RhdHVzKTsKKworI2lmZGVmIFNUTU1BQ19ERUJVRworCS8qIEl0IGRpc3BsYXlzIHRoZSBETUEgdHJhbnNtaXQgcHJvY2VzcyBzdGF0ZSAoQ1NSNSByZWdpc3RlcikgKi8KKwlpZiAobmV0aWZfbXNnX3R4X2RvbmUocHJpdikpCisJCXNob3dfdHhfcHJvY2Vzc19zdGF0ZShpbnRyX3N0YXR1cyk7CisJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMocHJpdikpCisJCXNob3dfcnhfcHJvY2Vzc19zdGF0ZShpbnRyX3N0YXR1cyk7CisjZW5kaWYKKwkvKiBBQk5PUk1BTCBpbnRlcnJ1cHRzICovCisJaWYgKHVubGlrZWx5KGludHJfc3RhdHVzICYgRE1BX1NUQVRVU19BSVMpKSB7CisJCURCRyhpbnRyLCBJTkZPLCAiQ1NSNVsxNV0gRE1BIEFCTk9STUFMIElSUTogIik7CisJCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmIERNQV9TVEFUVVNfVU5GKSkgeworCQkJREJHKGludHIsIElORk8sICJ0cmFuc21pdCB1bmRlcmZsb3dcbiIpOworCQkJaWYgKHVubGlrZWx5KHRjICE9IFNGX0RNQV9NT0RFKQorCQkJICAgICYmICh0YyA8PSAyNTYpKSB7CisJCQkJLyogVHJ5IHRvIGJ1bXAgdXAgdGhlIHRocmVzaG9sZCAqLworCQkJCXRjICs9IDY0OworCQkJCXByaXYtPm1hY190eXBlLT5vcHMtPmRtYV9tb2RlKGlvYWRkciwgdGMsCisJCQkJCSAgICAgIFNGX0RNQV9NT0RFKTsKKwkJCQlwcml2LT54c3RhdHMudGhyZXNob2xkID0gdGM7CisJCQl9CisJCQlzdG1tYWNfdHhfZXJyKHByaXYpOworCQkJcHJpdi0+eHN0YXRzLnR4X3VuZGVmbG93X2lycSsrOworCQl9CisJCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmIERNQV9TVEFUVVNfVEpUKSkgeworCQkJREJHKGludHIsIElORk8sICJ0cmFuc21pdCBqYWJiZXJcbiIpOworCQkJcHJpdi0+eHN0YXRzLnR4X2phYmJlcl9pcnErKzsKKwkJfQorCQlpZiAodW5saWtlbHkoaW50cl9zdGF0dXMgJiBETUFfU1RBVFVTX09WRikpIHsKKwkJCURCRyhpbnRyLCBJTkZPLCAicmVjdiBvdmVyZmxvd1xuIik7CisJCQlwcml2LT54c3RhdHMucnhfb3ZlcmZsb3dfaXJxKys7CisJCX0KKwkJaWYgKHVubGlrZWx5KGludHJfc3RhdHVzICYgRE1BX1NUQVRVU19SVSkpIHsKKwkJCURCRyhpbnRyLCBJTkZPLCAicmVjZWl2ZSBidWZmZXIgdW5hdmFpbGFibGVcbiIpOworCQkJcHJpdi0+eHN0YXRzLnJ4X2J1Zl91bmF2X2lycSsrOworCQl9CisJCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmIERNQV9TVEFUVVNfUlBTKSkgeworCQkJREJHKGludHIsIElORk8sICJyZWNlaXZlIHByb2Nlc3Mgc3RvcHBlZFxuIik7CisJCQlwcml2LT54c3RhdHMucnhfcHJvY2Vzc19zdG9wcGVkX2lycSsrOworCQl9CisJCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmIERNQV9TVEFUVVNfUldUKSkgeworCQkJREJHKGludHIsIElORk8sICJyZWNlaXZlIHdhdGNoZG9nXG4iKTsKKwkJCXByaXYtPnhzdGF0cy5yeF93YXRjaGRvZ19pcnErKzsKKwkJfQorCQlpZiAodW5saWtlbHkoaW50cl9zdGF0dXMgJiBETUFfU1RBVFVTX0VUSSkpIHsKKwkJCURCRyhpbnRyLCBJTkZPLCAidHJhbnNtaXQgZWFybHkgaW50ZXJydXB0XG4iKTsKKwkJCXByaXYtPnhzdGF0cy50eF9lYXJseV9pcnErKzsKKwkJfQorCQlpZiAodW5saWtlbHkoaW50cl9zdGF0dXMgJiBETUFfU1RBVFVTX1RQUykpIHsKKwkJCURCRyhpbnRyLCBJTkZPLCAidHJhbnNtaXQgcHJvY2VzcyBzdG9wcGVkXG4iKTsKKwkJCXByaXYtPnhzdGF0cy50eF9wcm9jZXNzX3N0b3BwZWRfaXJxKys7CisJCQlzdG1tYWNfdHhfZXJyKHByaXYpOworCQl9CisJCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmIERNQV9TVEFUVVNfRkJJKSkgeworCQkJREJHKGludHIsIElORk8sICJmYXRhbCBidXMgZXJyb3JcbiIpOworCQkJcHJpdi0+eHN0YXRzLmZhdGFsX2J1c19lcnJvcl9pcnErKzsKKwkJCXN0bW1hY190eF9lcnIocHJpdik7CisJCX0KKwl9CisKKwkvKiBUWC9SWCBOT1JNQUwgaW50ZXJydXB0cyAqLworCWlmIChpbnRyX3N0YXR1cyAmIERNQV9TVEFUVVNfTklTKSB7CisJCXByaXYtPnhzdGF0cy5ub3JtYWxfaXJxX24rKzsKKwkJaWYgKGxpa2VseSgoaW50cl9zdGF0dXMgJiBETUFfU1RBVFVTX1JJKSB8fAorCQkJIChpbnRyX3N0YXR1cyAmIChETUFfU1RBVFVTX1RJKSkpKQorCQkJCV9zdG1tYWNfc2NoZWR1bGUocHJpdik7CisJfQorCisJLyogT3B0aW9uYWwgaGFyZHdhcmUgYmxvY2tzLCBpbnRlcnJ1cHRzIHNob3VsZCBiZSBkaXNhYmxlZCAqLworCWlmICh1bmxpa2VseShpbnRyX3N0YXR1cyAmCisJCSAgICAgKERNQV9TVEFUVVNfR1BJIHwgRE1BX1NUQVRVU19HTUkgfCBETUFfU1RBVFVTX0dMSSkpKQorCQlwcl9pbmZvKCIlczogdW5leHBlY3RlZCBzdGF0dXMgJTA4eFxuIiwgX19mdW5jX18sIGludHJfc3RhdHVzKTsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgYnkgd3JpdGluZyBhIGxvZ2ljIDEgdG8gdGhlIENTUjVbMTUtMF0gKi8KKwl3cml0ZWwoKGludHJfc3RhdHVzICYgMHgxZmZmZiksIGlvYWRkciArIERNQV9TVEFUVVMpOworCisJREJHKGludHIsIElORk8sICJcblxuIik7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogIHN0bW1hY19vcGVuIC0gb3BlbiBlbnRyeSBwb2ludCBvZiB0aGUgZHJpdmVyCisgKiAgQGRldiA6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgb3BlbiBlbnRyeSBwb2ludCBvZiB0aGUgZHJpdmVyLgorICogIFJldHVybiB2YWx1ZToKKyAqICAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlICgtKXZlIGludGVnZXIgYXMgZGVmaW5lZCBpbiBlcnJuby5oCisgKiAgZmlsZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHN0bW1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByZXQ7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBNQUMgYWRkcmVzcyBpcyB2YWxpZC4gIElmIGl0cyBub3QsIHJlZnVzZQorCSAqIHRvIGJyaW5nIHRoZSBkZXZpY2UgdXAuIFRoZSB1c2VyIG11c3Qgc3BlY2lmeSBhbgorCSAqIGFkZHJlc3MgdXNpbmcgdGhlIGZvbGxvd2luZyBsaW51eCBjb21tYW5kOgorCSAqICAgICAgaWZjb25maWcgZXRoMCBodyBldGhlciB4eDp4eDp4eDp4eDp4eDp4eCAgKi8KKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7CisJCXByX3dhcm5pbmcoIiVzOiBnZW5lcmF0ZWQgcmFuZG9tIE1BQyBhZGRyZXNzICVwTVxuIiwgZGV2LT5uYW1lLAorCQkJZGV2LT5kZXZfYWRkcik7CisJfQorCisJc3RtbWFjX3ZlcmlmeV9hcmdzKCk7CisKKwlyZXQgPSBzdG1tYWNfaW5pdF9waHkoZGV2KTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIiVzOiBDYW5ub3QgYXR0YWNoIHRvIFBIWSAoZXJyb3I6ICVkKVxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVxdWVzdCB0aGUgSVJRIGxpbmVzICovCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzdG1tYWNfaW50ZXJydXB0LAorCQkJICBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQlwcl9lcnIoIiVzOiBFUlJPUjogYWxsb2NhdGluZyB0aGUgSVJRICVkIChlcnJvcjogJWQpXG4iLAorCQkgICAgICAgX19mdW5jX18sIGRldi0+aXJxLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworI2lmZGVmIENPTkZJR19TVE1NQUNfVElNRVIKKwlwcml2LT50bSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdG1tYWNfdGltZXIgKiksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShwcml2LT50bSA9PSBOVUxMKSkgeworCQlwcl9lcnIoIiVzOiBFUlJPUjogdGltZXIgbWVtb3J5IGFsbG9jIGZhaWxlZCBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXByaXYtPnRtLT5mcmVxID0gdG1yYXRlOworCisJLyogVGVzdCBpZiB0aGUgSFcgdGltZXIgY2FuIGJlIGFjdHVhbGx5IHVzZWQuCisJICogSW4gY2FzZSBvZiBmYWlsdXJlIGNvbnRpbnVlIHdpdGggbm8gdGltZXIuICovCisJaWYgKHVubGlrZWx5KChzdG1tYWNfb3Blbl9leHRfdGltZXIoZGV2LCBwcml2LT50bSkpIDwgMCkpIHsKKwkJcHJfd2FybmluZygic3RtbWFjZXRoOiBjYW5ub3QgYXR0YWNoIHRoZSBIVyB0aW1lclxuIik7CisJCXRtcmF0ZSA9IDA7CisJCXByaXYtPnRtLT5mcmVxID0gMDsKKwkJcHJpdi0+dG0tPnRpbWVyX3N0YXJ0ID0gc3RtbWFjX25vX3RpbWVyX3N0YXJ0ZWQ7CisJCXByaXYtPnRtLT50aW1lcl9zdG9wID0gc3RtbWFjX25vX3RpbWVyX3N0b3BwZWQ7CisJfQorI2VuZGlmCisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIFRYL1JYIGRlc2NyaXB0b3JzIGNoYWlucy4gKi8KKwlwcml2LT5kbWFfdHhfc2l6ZSA9IFNUTU1BQ19BTElHTihkbWFfdHhzaXplKTsKKwlwcml2LT5kbWFfcnhfc2l6ZSA9IFNUTU1BQ19BTElHTihkbWFfcnhzaXplKTsKKwlwcml2LT5kbWFfYnVmX3N6ID0gU1RNTUFDX0FMSUdOKGJ1Zl9zeik7CisJaW5pdF9kbWFfZGVzY19yaW5ncyhkZXYpOworCisJLyogRE1BIGluaXRpYWxpemF0aW9uIGFuZCBTVyByZXNldCAqLworCWlmICh1bmxpa2VseShwcml2LT5tYWNfdHlwZS0+b3BzLT5kbWFfaW5pdChpb2FkZHIsCisJCXByaXYtPnBibCwgcHJpdi0+ZG1hX3R4X3BoeSwgcHJpdi0+ZG1hX3J4X3BoeSkgPCAwKSkgeworCisJCXByX2VycigiJXM6IERNQSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENvcHkgdGhlIE1BQyBhZGRyIGludG8gdGhlIEhXICAqLworCXByaXYtPm1hY190eXBlLT5vcHMtPnNldF91bWFjX2FkZHIoaW9hZGRyLCBkZXYtPmRldl9hZGRyLCAwKTsKKwkvKiBJbml0aWFsaXplIHRoZSBNQUMgQ29yZSAqLworCXByaXYtPm1hY190eXBlLT5vcHMtPmNvcmVfaW5pdChpb2FkZHIpOworCisJcHJpdi0+c2h1dGRvd24gPSAwOworCisJLyogSW5pdGlhbGlzZSB0aGUgTU1DIChpZiBwcmVzZW50KSB0byBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLiAqLworCXdyaXRlbCgweGZmZmZmZmZmLCBpb2FkZHIgKyBNTUNfSElHSF9JTlRSX01BU0spOworCXdyaXRlbCgweGZmZmZmZmZmLCBpb2FkZHIgKyBNTUNfTE9XX0lOVFJfTUFTSyk7CisKKwkvKiBFbmFibGUgdGhlIE1BQyBSeC9UeCAqLworCXN0bW1hY19tYWNfZW5hYmxlX3J4KGlvYWRkcik7CisJc3RtbWFjX21hY19lbmFibGVfdHgoaW9hZGRyKTsKKworCS8qIFNldCB0aGUgSFcgRE1BIG1vZGUgYW5kIHRoZSBDT0UgKi8KKwlzdG1tYWNfZG1hX29wZXJhdGlvbl9tb2RlKHByaXYpOworCisJLyogRXh0cmEgc3RhdGlzdGljcyAqLworCW1lbXNldCgmcHJpdi0+eHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHN0bW1hY19leHRyYV9zdGF0cykpOworCXByaXYtPnhzdGF0cy50aHJlc2hvbGQgPSB0YzsKKworCS8qIFN0YXJ0IHRoZSBiYWxsIHJvbGxpbmcuLi4gKi8KKwlEQkcocHJvYmUsIERFQlVHLCAiJXM6IERNQSBSWC9UWCBwcm9jZXNzZXMgc3RhcnRlZC4uLlxuIiwgZGV2LT5uYW1lKTsKKwlzdG1tYWNfZG1hX3N0YXJ0X3R4KGlvYWRkcik7CisJc3RtbWFjX2RtYV9zdGFydF9yeChpb2FkZHIpOworCisjaWZkZWYgQ09ORklHX1NUTU1BQ19USU1FUgorCXByaXYtPnRtLT50aW1lcl9zdGFydCh0bXJhdGUpOworI2VuZGlmCisJLyogRHVtcCBETUEvTUFDIHJlZ2lzdGVycyAqLworCWlmIChuZXRpZl9tc2dfaHcocHJpdikpIHsKKwkJcHJpdi0+bWFjX3R5cGUtPm9wcy0+ZHVtcF9tYWNfcmVncyhpb2FkZHIpOworCQlwcml2LT5tYWNfdHlwZS0+b3BzLT5kdW1wX2RtYV9yZWdzKGlvYWRkcik7CisJfQorCisJaWYgKHByaXYtPnBoeWRldikKKwkJcGh5X3N0YXJ0KHByaXYtPnBoeWRldik7CisKKwluYXBpX2VuYWJsZSgmcHJpdi0+bmFwaSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+cnhfcmVjeWNsZSk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgc3RtbWFjX3JlbGVhc2UgLSBjbG9zZSBlbnRyeSBwb2ludCBvZiB0aGUgZHJpdmVyCisgKiAgQGRldiA6IGRldmljZSBwb2ludGVyLgorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgaXMgdGhlIHN0b3AgZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCBzdG1tYWNfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTdG9wIGFuZCBkaXNjb25uZWN0IHRoZSBQSFkgKi8KKwlpZiAocHJpdi0+cGh5ZGV2KSB7CisJCXBoeV9zdG9wKHByaXYtPnBoeWRldik7CisJCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7CisJCXByaXYtPnBoeWRldiA9IE5VTEw7CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisjaWZkZWYgQ09ORklHX1NUTU1BQ19USU1FUgorCS8qIFN0b3AgYW5kIHJlbGVhc2UgdGhlIHRpbWVyICovCisJc3RtbWFjX2Nsb3NlX2V4dF90aW1lcigpOworCWlmIChwcml2LT50bSAhPSBOVUxMKQorCQlrZnJlZShwcml2LT50bSk7CisjZW5kaWYKKwluYXBpX2Rpc2FibGUoJnByaXYtPm5hcGkpOworCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+cnhfcmVjeWNsZSk7CisKKwkvKiBGcmVlIHRoZSBJUlEgbGluZXMgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIFN0b3AgVFgvUlggRE1BIGFuZCBjbGVhciB0aGUgZGVzY3JpcHRvcnMgKi8KKwlzdG1tYWNfZG1hX3N0b3BfdHgoZGV2LT5iYXNlX2FkZHIpOworCXN0bW1hY19kbWFfc3RvcF9yeChkZXYtPmJhc2VfYWRkcik7CisKKwkvKiBSZWxlYXNlIGFuZCBmcmVlIHRoZSBSeC9UeCByZXNvdXJjZXMgKi8KKwlmcmVlX2RtYV9kZXNjX3Jlc291cmNlcyhwcml2KTsKKworCS8qIERpc2FibGUgdGhlIE1BQyBjb3JlICovCisJc3RtbWFjX21hY19kaXNhYmxlX3R4KGRldi0+YmFzZV9hZGRyKTsKKwlzdG1tYWNfbWFjX2Rpc2FibGVfcngoZGV2LT5iYXNlX2FkZHIpOworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogVG8gcGVyZm9ybSBlbXVsYXRlZCBoYXJkd2FyZSBzZWdtZW50YXRpb24gb24gc2tiLgorICovCitzdGF0aWMgaW50IHN0bW1hY19zd190c28oc3RydWN0IHN0bW1hY19wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpzZWdzLCAqY3Vycl9za2I7CisJaW50IGdzb19zZWdzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2VnczsKKworCS8qIEVzdGltYXRlIHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIGluIHRoZSB3b3JzdCBjYXNlICovCisJaWYgKHVubGlrZWx5KHN0bW1hY190eF9hdmFpbChwcml2KSA8IGdzb19zZWdzKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPmRldik7CisJCVRYX0RCRyhLRVJOX0VSUiAiJXM6IFRTTyBCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlpZiAoc3RtbWFjX3R4X2F2YWlsKHByaXYpIDwgZ3NvX3NlZ3MpCisJCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisKKwkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5kZXYpOworCX0KKwlUWF9EQkcoIlx0c3RtbWFjX3N3X3Rzbzogc2VnbWVudGluZzogc2tiICVwIChsZW4gJWQpXG4iLAorCSAgICAgICBza2IsIHNrYi0+bGVuKTsKKworCXNlZ3MgPSBza2JfZ3NvX3NlZ21lbnQoc2tiLCBwcml2LT5kZXYtPmZlYXR1cmVzICYgfk5FVElGX0ZfVFNPKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHNlZ3MpKSkKKwkJZ290byBzd190c29fZW5kOworCisJZG8geworCQljdXJyX3NrYiA9IHNlZ3M7CisJCXNlZ3MgPSBzZWdzLT5uZXh0OworCQlUWF9EQkcoIlx0XHRjdXJyZW50IHNrYi0+bGVuOiAlZCwgKmN1cnIgJXAsIgorCQkgICAgICAgIipuZXh0ICVwXG4iLCBjdXJyX3NrYi0+bGVuLCBjdXJyX3NrYiwgc2Vncyk7CisJCWN1cnJfc2tiLT5uZXh0ID0gTlVMTDsKKwkJc3RtbWFjX3htaXQoY3Vycl9za2IsIHByaXYtPmRldik7CisJfSB3aGlsZSAoc2Vncyk7CisKK3N3X3Rzb19lbmQ6CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzdG1tYWNfaGFuZGxlX2p1bWJvX2ZyYW1lcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIGludCBjc3VtX2luc2VydGlvbikKK3sKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBub3BhZ2VkX2xlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJdW5zaWduZWQgaW50IHR4c2l6ZSA9IHByaXYtPmRtYV90eF9zaXplOworCXVuc2lnbmVkIGludCBlbnRyeSA9IHByaXYtPmN1cl90eCAlIHR4c2l6ZTsKKwlzdHJ1Y3QgZG1hX2Rlc2MgKmRlc2MgPSBwcml2LT5kbWFfdHggKyBlbnRyeTsKKworCWlmIChub3BhZ2VkX2xlbiA+IEJVRl9TSVpFXzhLaUIpIHsKKworCQlpbnQgYnVmMl9zaXplID0gbm9wYWdlZF9sZW4gLSBCVUZfU0laRV84S2lCOworCisJCWRlc2MtPmRlczIgPSBkbWFfbWFwX3NpbmdsZShwcml2LT5kZXZpY2UsIHNrYi0+ZGF0YSwKKwkJCQkJICAgIEJVRl9TSVpFXzhLaUIsIERNQV9UT19ERVZJQ0UpOworCQlkZXNjLT5kZXMzID0gZGVzYy0+ZGVzMiArIEJVRl9TSVpFXzRLaUI7CisJCXByaXYtPm1hY190eXBlLT5vcHMtPnByZXBhcmVfdHhfZGVzYyhkZXNjLCAxLCBCVUZfU0laRV84S2lCLAorCQkJCQkJICAgICBjc3VtX2luc2VydGlvbik7CisKKwkJZW50cnkgPSAoKytwcml2LT5jdXJfdHgpICUgdHhzaXplOworCQlkZXNjID0gcHJpdi0+ZG1hX3R4ICsgZW50cnk7CisKKwkJZGVzYy0+ZGVzMiA9IGRtYV9tYXBfc2luZ2xlKHByaXYtPmRldmljZSwKKwkJCQkJc2tiLT5kYXRhICsgQlVGX1NJWkVfOEtpQiwKKwkJCQkJYnVmMl9zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJZGVzYy0+ZGVzMyA9IGRlc2MtPmRlczIgKyBCVUZfU0laRV80S2lCOworCQlwcml2LT5tYWNfdHlwZS0+b3BzLT5wcmVwYXJlX3R4X2Rlc2MoZGVzYywgMCwKKwkJCQkJCSAgICAgYnVmMl9zaXplLCBjc3VtX2luc2VydGlvbik7CisJCXByaXYtPm1hY190eXBlLT5vcHMtPnNldF90eF9vd25lcihkZXNjKTsKKwkJcHJpdi0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJZGVzYy0+ZGVzMiA9IGRtYV9tYXBfc2luZ2xlKHByaXYtPmRldmljZSwgc2tiLT5kYXRhLAorCQkJCQlub3BhZ2VkX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJCWRlc2MtPmRlczMgPSBkZXNjLT5kZXMyICsgQlVGX1NJWkVfNEtpQjsKKwkJcHJpdi0+bWFjX3R5cGUtPm9wcy0+cHJlcGFyZV90eF9kZXNjKGRlc2MsIDEsIG5vcGFnZWRfbGVuLAorCQkJCQkJICAgICBjc3VtX2luc2VydGlvbik7CisJfQorCXJldHVybiBlbnRyeTsKK30KKworLyoqCisgKiAgc3RtbWFjX3htaXQ6CisgKiAgQHNrYiA6IHRoZSBzb2NrZXQgYnVmZmVyCisgKiAgQGRldiA6IGRldmljZSBwb2ludGVyCisgKiAgRGVzY3JpcHRpb24gOiBUeCBlbnRyeSBwb2ludCBvZiB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgbmV0ZGV2X3R4X3Qgc3RtbWFjX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCB0eHNpemUgPSBwcml2LT5kbWFfdHhfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZW50cnk7CisJaW50IGksIGNzdW1faW5zZXJ0aW9uID0gMDsKKwlpbnQgbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwlzdHJ1Y3QgZG1hX2Rlc2MgKmRlc2MsICpmaXJzdDsKKworCWlmICh1bmxpa2VseShzdG1tYWNfdHhfYXZhaWwocHJpdikgPCBuZnJhZ3MgKyAxKSkgeworCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJLyogVGhpcyBpcyBhIGhhcmQgZXJyb3IsIGxvZyBpdC4gKi8KKwkJCXByX2VycigiJXM6IEJVRyEgVHggUmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2VcbiIsCisJCQkJX19mdW5jX18pOworCQl9CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwllbnRyeSA9IHByaXYtPmN1cl90eCAlIHR4c2l6ZTsKKworI2lmZGVmIFNUTU1BQ19YTUlUX0RFQlVHCisJaWYgKChza2ItPmxlbiA+IEVUSF9GUkFNRV9MRU4pIHx8IG5mcmFncykKKwkJcHJfaW5mbygic3RtbWFjIHhtaXQ6XG4iCisJCSAgICAgICAiXHRza2IgYWRkciAlcCAtIGxlbjogJWQgLSBub3BhZ2VkX2xlbjogJWRcbiIKKwkJICAgICAgICJcdG5fZnJhZ3M6ICVkIC0gaXBfc3VtbWVkOiAlZCAtICVzIGdzb1xuIiwKKwkJICAgICAgIHNrYiwgc2tiLT5sZW4sIHNrYl9oZWFkbGVuKHNrYiksIG5mcmFncywgc2tiLT5pcF9zdW1tZWQsCisJCSAgICAgICAhc2tiX2lzX2dzbyhza2IpID8gImlzbid0IiA6ICJpcyIpOworI2VuZGlmCisKKwlpZiAodW5saWtlbHkoc2tiX2lzX2dzbyhza2IpKSkKKwkJcmV0dXJuIHN0bW1hY19zd190c28ocHJpdiwgc2tiKTsKKworCWlmIChsaWtlbHkoKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSkgeworCQlpZiAobGlrZWx5KHByaXYtPnR4X2NvZSA9PSBOT19IV19DU1VNKSkKKwkJCXNrYl9jaGVja3N1bV9oZWxwKHNrYik7CisJCWVsc2UKKwkJCWNzdW1faW5zZXJ0aW9uID0gMTsKKwl9CisKKwlkZXNjID0gcHJpdi0+ZG1hX3R4ICsgZW50cnk7CisJZmlyc3QgPSBkZXNjOworCisjaWZkZWYgU1RNTUFDX1hNSVRfREVCVUcKKwlpZiAoKG5mcmFncyA+IDApIHx8IChza2ItPmxlbiA+IEVUSF9GUkFNRV9MRU4pKQorCQlwcl9kZWJ1Zygic3RtbWFjIHhtaXQ6IHNrYiBsZW46ICVkLCBub3BhZ2VkX2xlbjogJWQsXG4iCisJCSAgICAgICAiXHRcdG5fZnJhZ3M6ICVkLCBpcF9zdW1tZWQ6ICVkXG4iLAorCQkgICAgICAgc2tiLT5sZW4sIHNrYl9oZWFkbGVuKHNrYiksIG5mcmFncywgc2tiLT5pcF9zdW1tZWQpOworI2VuZGlmCisJcHJpdi0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPj0gQlVGX1NJWkVfNEtpQikpIHsKKwkJZW50cnkgPSBzdG1tYWNfaGFuZGxlX2p1bWJvX2ZyYW1lcyhza2IsIGRldiwgY3N1bV9pbnNlcnRpb24pOworCQlkZXNjID0gcHJpdi0+ZG1hX3R4ICsgZW50cnk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IG5vcGFnZWRfbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJZGVzYy0+ZGVzMiA9IGRtYV9tYXBfc2luZ2xlKHByaXYtPmRldmljZSwgc2tiLT5kYXRhLAorCQkJCQlub3BhZ2VkX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJCXByaXYtPm1hY190eXBlLT5vcHMtPnByZXBhcmVfdHhfZGVzYyhkZXNjLCAxLCBub3BhZ2VkX2xlbiwKKwkJCQkJCSAgICAgY3N1bV9pbnNlcnRpb24pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuZnJhZ3M7IGkrKykgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCWludCBsZW4gPSBmcmFnLT5zaXplOworCisJCWVudHJ5ID0gKCsrcHJpdi0+Y3VyX3R4KSAlIHR4c2l6ZTsKKwkJZGVzYyA9IHByaXYtPmRtYV90eCArIGVudHJ5OworCisJCVRYX0RCRygiXHRbZW50cnkgJWRdIHNlZ21lbnQgbGVuOiAlZFxuIiwgZW50cnksIGxlbik7CisJCWRlc2MtPmRlczIgPSBkbWFfbWFwX3BhZ2UocHJpdi0+ZGV2aWNlLCBmcmFnLT5wYWdlLAorCQkJCQkgIGZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkJCQkgIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJCXByaXYtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQlwcml2LT5tYWNfdHlwZS0+b3BzLT5wcmVwYXJlX3R4X2Rlc2MoZGVzYywgMCwgbGVuLAorCQkJCQkJICAgICBjc3VtX2luc2VydGlvbik7CisJCXByaXYtPm1hY190eXBlLT5vcHMtPnNldF90eF9vd25lcihkZXNjKTsKKwl9CisKKwkvKiBJbnRlcnJ1cHQgb24gY29tcGxldGl0aW9uIG9ubHkgZm9yIHRoZSBsYXRlc3Qgc2VnbWVudCAqLworCXByaXYtPm1hY190eXBlLT5vcHMtPmNsb3NlX3R4X2Rlc2MoZGVzYyk7CisjaWZkZWYgQ09ORklHX1NUTU1BQ19USU1FUgorCS8qIENsZWFuIElDIHdoaWxlIHVzaW5nIHRpbWVycyAqLworCXByaXYtPm1hY190eXBlLT5vcHMtPmNsZWFyX3R4X2ljKGRlc2MpOworI2VuZGlmCisJLyogVG8gYXZvaWQgcmFpc2UgY29uZGl0aW9uICovCisJcHJpdi0+bWFjX3R5cGUtPm9wcy0+c2V0X3R4X293bmVyKGZpcnN0KTsKKworCXByaXYtPmN1cl90eCsrOworCisjaWZkZWYgU1RNTUFDX1hNSVRfREVCVUcKKwlpZiAobmV0aWZfbXNnX3BrdGRhdGEocHJpdikpIHsKKwkJcHJfaW5mbygic3RtbWFjIHhtaXQ6IGN1cnJlbnQ9JWQsIGRpcnR5PSVkLCBlbnRyeT0lZCwgIgorCQkgICAgICAgImZpcnN0PSVwLCBuZnJhZ3M9JWRcbiIsCisJCSAgICAgICAocHJpdi0+Y3VyX3R4ICUgdHhzaXplKSwgKHByaXYtPmRpcnR5X3R4ICUgdHhzaXplKSwKKwkJICAgICAgIGVudHJ5LCBmaXJzdCwgbmZyYWdzKTsKKwkJZGlzcGxheV9yaW5nKHByaXYtPmRtYV90eCwgdHhzaXplKTsKKwkJcHJfaW5mbygiPj4+IGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkOiAiKTsKKwkJcHJpbnRfcGt0KHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCX0KKyNlbmRpZgorCWlmICh1bmxpa2VseShzdG1tYWNfdHhfYXZhaWwocHJpdikgPD0gKE1BWF9TS0JfRlJBR1MgKyAxKSkpIHsKKwkJVFhfREJHKCIlczogc3RvcCB0cmFuc21pdHRlZCBwYWNrZXRzXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJLyogQ1NSMSBlbmFibGVzIHRoZSB0cmFuc21pdCBETUEgdG8gY2hlY2sgZm9yIG5ldyBkZXNjcmlwdG9yICovCisJd3JpdGVsKDEsIGRldi0+YmFzZV9hZGRyICsgRE1BX1hNVF9QT0xMX0RFTUFORCk7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RtbWFjX3J4X3JlZmlsbChzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IHJ4c2l6ZSA9IHByaXYtPmRtYV9yeF9zaXplOworCWludCBiZnNpemUgPSBwcml2LT5kbWFfYnVmX3N6OworCXN0cnVjdCBkbWFfZGVzYyAqcCA9IHByaXYtPmRtYV9yeDsKKworCWZvciAoOyBwcml2LT5jdXJfcnggLSBwcml2LT5kaXJ0eV9yeCA+IDA7IHByaXYtPmRpcnR5X3J4KyspIHsKKwkJdW5zaWduZWQgaW50IGVudHJ5ID0gcHJpdi0+ZGlydHlfcnggJSByeHNpemU7CisJCWlmIChsaWtlbHkocHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJc2tiID0gX19za2JfZGVxdWV1ZSgmcHJpdi0+cnhfcmVjeWNsZSk7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihwcml2LT5kZXYsCisJCQkJCQkJCWJmc2l6ZSk7CisKKwkJCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpCisJCQkJYnJlYWs7CisKKwkJCXByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCQlwcml2LT5yeF9za2J1ZmZfZG1hW2VudHJ5XSA9CisJCQkgICAgZG1hX21hcF9zaW5nbGUocHJpdi0+ZGV2aWNlLCBza2ItPmRhdGEsIGJmc2l6ZSwKKwkJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKKworCQkJKHAgKyBlbnRyeSktPmRlczIgPSBwcml2LT5yeF9za2J1ZmZfZG1hW2VudHJ5XTsKKwkJCWlmICh1bmxpa2VseShwcml2LT5pc19nbWFjKSkgeworCQkJCWlmIChiZnNpemUgPj0gQlVGX1NJWkVfOEtpQikKKwkJCQkJKHAgKyBlbnRyeSktPmRlczMgPQorCQkJCQkgICAgKHAgKyBlbnRyeSktPmRlczIgKyBCVUZfU0laRV84S2lCOworCQkJfQorCQkJUlhfREJHKEtFUk5fSU5GTyAiXHRyZWZpbGwgZW50cnkgIyVkXG4iLCBlbnRyeSk7CisJCX0KKwkJcHJpdi0+bWFjX3R5cGUtPm9wcy0+c2V0X3J4X293bmVyKHAgKyBlbnRyeSk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBzdG1tYWNfcngoc3RydWN0IHN0bW1hY19wcml2ICpwcml2LCBpbnQgbGltaXQpCit7CisJdW5zaWduZWQgaW50IHJ4c2l6ZSA9IHByaXYtPmRtYV9yeF9zaXplOworCXVuc2lnbmVkIGludCBlbnRyeSA9IHByaXYtPmN1cl9yeCAlIHJ4c2l6ZTsKKwl1bnNpZ25lZCBpbnQgbmV4dF9lbnRyeTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXN0cnVjdCBkbWFfZGVzYyAqcCA9IHByaXYtPmRtYV9yeCArIGVudHJ5OworCXN0cnVjdCBkbWFfZGVzYyAqcF9uZXh0OworCisjaWZkZWYgU1RNTUFDX1JYX0RFQlVHCisJaWYgKG5ldGlmX21zZ19odyhwcml2KSkgeworCQlwcl9kZWJ1ZygiPj4+IHN0bW1hY19yeDogZGVzY3JpcHRvciByaW5nOlxuIik7CisJCWRpc3BsYXlfcmluZyhwcml2LT5kbWFfcngsIHJ4c2l6ZSk7CisJfQorI2VuZGlmCisJY291bnQgPSAwOworCXdoaWxlICghcHJpdi0+bWFjX3R5cGUtPm9wcy0+Z2V0X3J4X293bmVyKHApKSB7CisJCWludCBzdGF0dXM7CisKKwkJaWYgKGNvdW50ID49IGxpbWl0KQorCQkJYnJlYWs7CisKKwkJY291bnQrKzsKKworCQluZXh0X2VudHJ5ID0gKCsrcHJpdi0+Y3VyX3J4KSAlIHJ4c2l6ZTsKKwkJcF9uZXh0ID0gcHJpdi0+ZG1hX3J4ICsgbmV4dF9lbnRyeTsKKwkJcHJlZmV0Y2gocF9uZXh0KTsKKworCQkvKiByZWFkIHRoZSBzdGF0dXMgb2YgdGhlIGluY29taW5nIGZyYW1lICovCisJCXN0YXR1cyA9IChwcml2LT5tYWNfdHlwZS0+b3BzLT5yeF9zdGF0dXMoJnByaXYtPmRldi0+c3RhdHMsCisJCQkJCQkJICZwcml2LT54c3RhdHMsIHApKTsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyA9PSBkaXNjYXJkX2ZyYW1lKSkKKwkJCXByaXYtPmRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCWVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCS8qIExlbmd0aCBzaG91bGQgb21pdCB0aGUgQ1JDICovCisJCQlpbnQgZnJhbWVfbGVuID0KKwkJCSAgICBwcml2LT5tYWNfdHlwZS0+b3BzLT5nZXRfcnhfZnJhbWVfbGVuKHApIC0gNDsKKworI2lmZGVmIFNUTU1BQ19SWF9ERUJVRworCQkJaWYgKGZyYW1lX2xlbiA+IEVUSF9GUkFNRV9MRU4pCisJCQkJcHJfZGVidWcoIlx0UlggZnJhbWUgc2l6ZSAlZCwgQ09FIHN0YXR1czogJWRcbiIsCisJCQkJCWZyYW1lX2xlbiwgc3RhdHVzKTsKKworCQkJaWYgKG5ldGlmX21zZ19odyhwcml2KSkKKwkJCQlwcl9kZWJ1ZygiXHRkZXNjOiAlcCBbZW50cnkgJWRdIGJ1ZmY9MHgleFxuIiwKKwkJCQkJcCwgZW50cnksIHAtPmRlczIpOworI2VuZGlmCisJCQlza2IgPSBwcml2LT5yeF9za2J1ZmZbZW50cnldOworCQkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQkJcHJfZXJyKCIlczogSW5jb25zaXN0ZW50IFJ4IGRlc2NyaXB0b3IgY2hhaW5cbiIsCisJCQkJCXByaXYtPmRldi0+bmFtZSk7CisJCQkJcHJpdi0+ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmVmZXRjaChza2ItPmRhdGEgLSBORVRfSVBfQUxJR04pOworCQkJcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisKKwkJCXNrYl9wdXQoc2tiLCBmcmFtZV9sZW4pOworCQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5kZXZpY2UsCisJCQkJCSBwcml2LT5yeF9za2J1ZmZfZG1hW2VudHJ5XSwKKwkJCQkJIHByaXYtPmRtYV9idWZfc3osIERNQV9GUk9NX0RFVklDRSk7CisjaWZkZWYgU1RNTUFDX1JYX0RFQlVHCisJCQlpZiAobmV0aWZfbXNnX3BrdGRhdGEocHJpdikpIHsKKwkJCQlwcl9pbmZvKCIgZnJhbWUgcmVjZWl2ZWQgKCVkYnl0ZXMpIiwgZnJhbWVfbGVuKTsKKwkJCQlwcmludF9wa3Qoc2tiLT5kYXRhLCBmcmFtZV9sZW4pOworCQkJfQorI2VuZGlmCisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwcml2LT5kZXYpOworCisJCQlpZiAodW5saWtlbHkoc3RhdHVzID09IGNzdW1fbm9uZSkpIHsKKwkJCQkvKiBhbHdheXMgZm9yIHRoZSBvbGQgbWFjIDEwLzEwMCAqLworCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQkJfSBlbHNlIHsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJCW5hcGlfZ3JvX3JlY2VpdmUoJnByaXYtPm5hcGksIHNrYik7CisJCQl9CisKKwkJCXByaXYtPmRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJcHJpdi0+ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBmcmFtZV9sZW47CisJCQlwcml2LT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9CisJCWVudHJ5ID0gbmV4dF9lbnRyeTsKKwkJcCA9IHBfbmV4dDsJLyogdXNlIHByZWZldGNoZWQgdmFsdWVzICovCisJfQorCisJc3RtbWFjX3J4X3JlZmlsbChwcml2KTsKKworCXByaXYtPnhzdGF0cy5yeF9wa3RfbiArPSBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiAgc3RtbWFjX3BvbGwgLSBzdG1tYWMgcG9sbCBtZXRob2QgKE5BUEkpCisgKiAgQG5hcGkgOiBwb2ludGVyIHRvIHRoZSBuYXBpIHN0cnVjdHVyZS4KKyAqICBAYnVkZ2V0IDogbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHRoZSBjdXJyZW50IENQVSBjYW4gcmVjZWl2ZSBmcm9tCisgKgkgICAgICBhbGwgaW50ZXJmYWNlcy4KKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdGhlIHJlY2VwdGlvbiBwcm9jZXNzLgorICogICBBbHNvIGl0IHJ1bnMgdGhlIFRYIGNvbXBsZXRpb24gdGhyZWFkCisgKi8KK3N0YXRpYyBpbnQgc3RtbWFjX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3Qgc3RtbWFjX3ByaXYsIG5hcGkpOworCWludCB3b3JrX2RvbmUgPSAwOworCisJcHJpdi0+eHN0YXRzLnBvbGxfbisrOworCXN0bW1hY190eChwcml2KTsKKwl3b3JrX2RvbmUgPSBzdG1tYWNfcngocHJpdiwgYnVkZ2V0KTsKKworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJc3RtbWFjX2VuYWJsZV9pcnEocHJpdik7CisJfQorCXJldHVybiB3b3JrX2RvbmU7Cit9CisKKy8qKgorICogIHN0bW1hY190eF90aW1lb3V0CisgKiAgQGRldiA6IFBvaW50ZXIgdG8gbmV0IGRldmljZSBzdHJ1Y3R1cmUKKyAqICBEZXNjcmlwdGlvbjogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHBhY2tldCB0cmFuc21pc3Npb24gZmFpbHMgdG8KKyAqICAgY29tcGxldGUgd2l0aGluIGEgcmVhc29uYWJsZSB0bXJhdGUuIFRoZSBkcml2ZXIgd2lsbCBtYXJrIHRoZSBlcnJvciBpbiB0aGUKKyAqICAgbmV0ZGV2IHN0cnVjdHVyZSBhbmQgYXJyYW5nZSBmb3IgdGhlIGRldmljZSB0byBiZSByZXNldCB0byBhIHNhbmUgc3RhdGUKKyAqICAgaW4gb3JkZXIgdG8gdHJhbnNtaXQgYSBuZXcgcGFja2V0LgorICovCitzdGF0aWMgdm9pZCBzdG1tYWNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBDbGVhciBUeCByZXNvdXJjZXMgYW5kIHJlc3RhcnQgdHJhbnNtaXR0aW5nIGFnYWluICovCisJc3RtbWFjX3R4X2Vycihwcml2KTsKKwlyZXR1cm47Cit9CisKKy8qIENvbmZpZ3VyYXRpb24gY2hhbmdlcyAocGFzc2VkIG9uIGJ5IGlmY29uZmlnKSAqLworc3RhdGljIGludCBzdG1tYWNfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQkvKiBjYW4ndCBhY3Qgb24gYSBydW5uaW5nIGludGVyZmFjZSAqLworCQlyZXR1cm4gLUVCVVNZOworCisJLyogRG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhlIEkvTyBhZGRyZXNzICovCisJaWYgKG1hcC0+YmFzZV9hZGRyICE9IGRldi0+YmFzZV9hZGRyKSB7CisJCXByX3dhcm5pbmcoIiVzOiBjYW4ndCBjaGFuZ2UgSS9PIGFkZHJlc3NcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBEb24ndCBhbGxvdyBjaGFuZ2luZyB0aGUgSVJRICovCisJaWYgKG1hcC0+aXJxICE9IGRldi0+aXJxKSB7CisJCXByX3dhcm5pbmcoIiVzOiBjYW4ndCBjaGFuZ2UgSVJRIG51bWJlciAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJLyogaWdub3JlIG90aGVyIGZpZWxkcyAqLworCXJldHVybiAwOworfQorCisvKioKKyAqICBzdG1tYWNfbXVsdGljYXN0X2xpc3QgLSBlbnRyeSBwb2ludCBmb3IgbXVsdGljYXN0IGFkZHJlc3NpbmcKKyAqICBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gaXMgYSBkcml2ZXIgZW50cnkgcG9pbnQgd2hpY2ggZ2V0cyBjYWxsZWQgYnkgdGhlIGtlcm5lbAorICogIHdoZW5ldmVyIG11bHRpY2FzdCBhZGRyZXNzZXMgbXVzdCBiZSBlbmFibGVkL2Rpc2FibGVkLgorICogIFJldHVybiB2YWx1ZToKKyAqICB2b2lkLgorICovCitzdGF0aWMgdm9pZCBzdG1tYWNfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwlwcml2LT5tYWNfdHlwZS0+b3BzLT5zZXRfZmlsdGVyKGRldik7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXJldHVybjsKK30KKworLyoqCisgKiAgc3RtbWFjX2NoYW5nZV9tdHUgLSBlbnRyeSBwb2ludCB0byBjaGFuZ2UgTVRVIHNpemUgZm9yIHRoZSBkZXZpY2UuCisgKiAgQGRldiA6IGRldmljZSBwb2ludGVyLgorICogIEBuZXdfbXR1IDogdGhlIG5ldyBNVFUgc2l6ZSBmb3IgdGhlIGRldmljZS4KKyAqICBEZXNjcmlwdGlvbjogdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdCAoTVRVKSBpcyB1c2VkIGJ5IHRoZSBuZXR3b3JrIGxheWVyCisgKiAgdG8gZHJpdmUgcGFja2V0IHRyYW5zbWlzc2lvbi4gRXRoZXJuZXQgaGFzIGFuIE1UVSBvZiAxNTAwIG9jdGV0cworICogIChFVEhfREFUQV9MRU4pLiBUaGlzIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIHdpdGggaWZjb25maWcuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgKC0pdmUgaW50ZWdlciBhcyBkZWZpbmVkIGluIGVycm5vLmgKKyAqICBmaWxlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgc3RtbWFjX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgbWF4X210dTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcHJfZXJyKCIlczogbXVzdCBiZSBzdG9wcGVkIHRvIGNoYW5nZSBpdHMgTVRVXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChwcml2LT5pc19nbWFjKQorCQltYXhfbXR1ID0gSlVNQk9fTEVOOworCWVsc2UKKwkJbWF4X210dSA9IEVUSF9EQVRBX0xFTjsKKworCWlmICgobmV3X210dSA8IDQ2KSB8fCAobmV3X210dSA+IG1heF9tdHUpKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgTVRVLCBtYXggTVRVIGlzOiAlZFxuIiwgZGV2LT5uYW1lLCBtYXhfbXR1KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdG1tYWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAodW5saWtlbHkoIWRldikpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBkZXYgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKHByaXYtPmlzX2dtYWMpIHsKKwkJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkJLyogVG8gaGFuZGxlIEdNQUMgb3duIGludGVycnVwdHMgKi8KKwkJcHJpdi0+bWFjX3R5cGUtPm9wcy0+aG9zdF9pcnFfc3RhdHVzKGlvYWRkcik7CisJfQorCXN0bW1hY19kbWFfaW50ZXJydXB0KGRldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyogUG9sbGluZyByZWNlaXZlIC0gdXNlZCBieSBORVRDT05TT0xFIGFuZCBvdGhlciBkaWFnbm9zdGljIHRvb2xzCisgKiB0byBhbGxvdyBuZXR3b3JrIEkvTyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICovCitzdGF0aWMgdm9pZCBzdG1tYWNfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXN0bW1hY19pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldik7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyoqCisgKiAgc3RtbWFjX2lvY3RsIC0gRW50cnkgcG9pbnQgZm9yIHRoZSBJb2N0bAorICogIEBkZXY6IERldmljZSBwb2ludGVyLgorICogIEBycTogQW4gSU9DVEwgc3BlY2VmaWMgc3RydWN0dXJlLCB0aGF0IGNhbiBjb250YWluIGEgcG9pbnRlciB0bworICogIGEgcHJvcHJpZXRhcnkgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byB0aGUgZHJpdmVyLgorICogIEBjbWQ6IElPQ1RMIGNvbW1hbmQKKyAqICBEZXNjcmlwdGlvbjoKKyAqICBDdXJyZW50bHkgdGhlcmUgYXJlIG5vIHNwZWNpYWwgZnVuY3Rpb25hbGl0eSBzdXBwb3J0ZWQgaW4gSU9DVEwsIGp1c3QgdGhlCisgKiAgcGh5X21paV9pb2N0bCguLi4pIGNhbiBiZSBpbnZva2VkLgorICovCitzdGF0aWMgaW50IHN0bW1hY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCWNhc2UgU0lPQ0dNSUlSRUc6CisJY2FzZSBTSU9DU01JSVJFRzoKKwkJaWYgKCFwcml2LT5waHlkZXYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2soJnByaXYtPmxvY2spOworCQlyZXQgPSBwaHlfbWlpX2lvY3RsKHByaXYtPnBoeWRldiwgaWZfbWlpKHJxKSwgY21kKTsKKwkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKK3N0YXRpYyB2b2lkIHN0bW1hY192bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCURCRyhwcm9iZSwgSU5GTywgIiVzOiBTZXR0aW5nIHZsZ3JwIHRvICVwXG4iLCBkZXYtPm5hbWUsIGdycCk7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCXByaXYtPnZsZ3JwID0gZ3JwOworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCXJldHVybjsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHN0bW1hY19uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiA9IHN0bW1hY19vcGVuLAorCS5uZG9fc3RhcnRfeG1pdCA9IHN0bW1hY194bWl0LAorCS5uZG9fc3RvcCA9IHN0bW1hY19yZWxlYXNlLAorCS5uZG9fY2hhbmdlX210dSA9IHN0bW1hY19jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc3RtbWFjX211bHRpY2FzdF9saXN0LAorCS5uZG9fdHhfdGltZW91dCA9IHN0bW1hY190eF90aW1lb3V0LAorCS5uZG9fZG9faW9jdGwgPSBzdG1tYWNfaW9jdGwsCisJLm5kb19zZXRfY29uZmlnID0gc3RtbWFjX2NvbmZpZywKKyNpZmRlZiBTVE1NQUNfVkxBTl9UQUdfVVNFRAorCS5uZG9fdmxhbl9yeF9yZWdpc3RlciA9IHN0bW1hY192bGFuX3J4X3JlZ2lzdGVyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlciA9IHN0bW1hY19wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKKwkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGV0aF9tYWNfYWRkciwKK307CisKKy8qKgorICogc3RtbWFjX3Byb2JlIC0gSW5pdGlhbGl6YXRpb24gb2YgdGhlIGFkYXB0ZXIgLgorICogQGRldiA6IGRldmljZSBwb2ludGVyCisgKiBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgZm9yCisgKiB0aGUgU1RNTUFDIGRyaXZlci4gSXQgYWxzbyBjYWxscyB0aGUgbG93IGxldmVsIHJvdXRpbmVzCisgKiBpbiBvcmRlciB0byBpbml0IHRoZSBIVyAoaS5lLiB0aGUgRE1BIGVuZ2luZSkKKyAqLworc3RhdGljIGludCBzdG1tYWNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZXRoZXJfc2V0dXAoZGV2KTsKKworCWRldi0+bmV0ZGV2X29wcyA9ICZzdG1tYWNfbmV0ZGV2X29wczsKKwlzdG1tYWNfc2V0X2V0aHRvb2xfb3BzKGRldik7CisKKwlkZXYtPmZlYXR1cmVzIHw9IChORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9ISUdIRE1BKTsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gbXNlY3NfdG9famlmZmllcyh3YXRjaGRvZyk7CisjaWZkZWYgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKKwkvKiBCb3RoIG1hYzEwMCBhbmQgZ21hYyBzdXBwb3J0IHJlY2VpdmUgVkxBTiB0YWcgZGV0ZWN0aW9uICovCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fUlg7CisjZW5kaWYKKwlwcml2LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcsIGRlZmF1bHRfbXNnX2xldmVsKTsKKworCWlmIChwcml2LT5pc19nbWFjKQorCQlwcml2LT5yeF9jc3VtID0gMTsKKworCWlmIChmbG93X2N0cmwpCisJCXByaXYtPmZsb3dfY3RybCA9IEZMT1dfQVVUTzsJLyogUlgvVFggcGF1c2Ugb24gKi8KKworCXByaXYtPnBhdXNlID0gcGF1c2U7CisJbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHJpdi0+bmFwaSwgc3RtbWFjX3BvbGwsIDY0KTsKKworCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KKwlwcml2LT5tYWNfdHlwZS0+b3BzLT5nZXRfdW1hY19hZGRyKGRldi0+YmFzZV9hZGRyLCBkZXYtPmRldl9hZGRyLCAwKTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKKwkJcHJfd2FybmluZygiXHRubyB2YWxpZCBNQUMgYWRkcmVzczsiCisJCQkicGxlYXNlLCB1c2UgaWZjb25maWcgb3Igbndod2NvbmZpZyFcbiIpOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBFUlJPUiAlaSByZWdpc3RlcmluZyB0aGUgZGV2aWNlXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCURCRyhwcm9iZSwgREVCVUcsICIlczogU2NhdHRlci9HYXRoZXI6ICVzIC0gSFcgY2hlY2tzdW1zOiAlc1xuIiwKKwkgICAgZGV2LT5uYW1lLCAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0cpID8gIm9uIiA6ICJvZmYiLAorCSAgICAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfQ1NVTSkgPyAib24iIDogIm9mZiIpOworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzdG1tYWNfbWFjX2RldmljZV9zZXR1cAorICogQGRldiA6IGRldmljZSBwb2ludGVyCisgKiBEZXNjcmlwdGlvbjogc2VsZWN0IGFuZCBpbml0aWFsaXNlIHRoZSBtYWMgZGV2aWNlIChtYWMxMDAgb3IgR21hYykuCisgKi8KK3N0YXRpYyBpbnQgc3RtbWFjX21hY19kZXZpY2Vfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlzdHJ1Y3QgbWFjX2RldmljZV9pbmZvICpkZXZpY2U7CisKKwlpZiAocHJpdi0+aXNfZ21hYykKKwkJZGV2aWNlID0gZ21hY19zZXR1cChpb2FkZHIpOworCWVsc2UKKwkJZGV2aWNlID0gbWFjMTAwX3NldHVwKGlvYWRkcik7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5tYWNfdHlwZSA9IGRldmljZTsKKworCXByaXYtPndvbGVuYWJsZWQgPSBwcml2LT5tYWNfdHlwZS0+aHcucG10OwkvKiBQTVQgc3VwcG9ydGVkICovCisJaWYgKHByaXYtPndvbGVuYWJsZWQgPT0gUE1UX1NVUFBPUlRFRCkKKwkJcHJpdi0+d29sb3B0cyA9IFdBS0VfTUFHSUM7CQkvKiBNYWdpYyBGcmFtZSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RtbWFjcGh5X2R2cl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbGF0X3N0bW1hY3BoeV9kYXRhICpwbGF0X2RhdDsKKwlwbGF0X2RhdCA9IChzdHJ1Y3QgcGxhdF9zdG1tYWNwaHlfZGF0YSAqKSgocGRldi0+ZGV2KS5wbGF0Zm9ybV9kYXRhKTsKKworCXByX2RlYnVnKCJzdG1tYWNwaHlfZHZyX3Byb2JlOiBhZGRlZCBwaHkgZm9yIGJ1cyAlZFxuIiwKKwkgICAgICAgcGxhdF9kYXQtPmJ1c19pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG1tYWNwaHlfZHZyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdG1tYWNwaHlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gUEhZX1JFU09VUkNFX05BTUUsCisJCSAgIH0sCisJLnByb2JlID0gc3RtbWFjcGh5X2R2cl9wcm9iZSwKKwkucmVtb3ZlID0gc3RtbWFjcGh5X2R2cl9yZW1vdmUsCit9OworCisvKioKKyAqIHN0bW1hY19hc3NvY2lhdGVfcGh5CisgKiBAZGV2OiBwb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiBwb2ludHMgdG8gdGhlIHByaXZhdGUgc3RydWN0dXJlLgorICogRGVzY3JpcHRpb246IFNjYW5zIHRocm91Z2ggYWxsIHRoZSBQSFlzIHdlIGhhdmUgcmVnaXN0ZXJlZCBhbmQgY2hlY2tzIGlmCisgKiBhbnkgYXJlIGFzc29jaWF0ZWQgd2l0aCBvdXIgTUFDLiAgSWYgc28sIHRoZW4ganVzdCBmaWxsIGluCisgKiB0aGUgYmxhbmtzIGluIG91ciBsb2NhbCBjb250ZXh0IHN0cnVjdHVyZQorICovCitzdGF0aWMgaW50IHN0bW1hY19hc3NvY2lhdGVfcGh5KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSAoc3RydWN0IHN0bW1hY19wcml2ICopZGF0YTsKKwlzdHJ1Y3QgcGxhdF9zdG1tYWNwaHlfZGF0YSAqcGxhdF9kYXQ7CisKKwlwbGF0X2RhdCA9IChzdHJ1Y3QgcGxhdF9zdG1tYWNwaHlfZGF0YSAqKShkZXYtPnBsYXRmb3JtX2RhdGEpOworCisJREJHKHByb2JlLCBERUJVRywgIiVzOiBjaGVja2luZyBwaHkgZm9yIGJ1cyAlZFxuIiwgX19mdW5jX18sCisJCXBsYXRfZGF0LT5idXNfaWQpOworCisJLyogQ2hlY2sgdGhhdCB0aGlzIHBoeSBpcyBmb3IgdGhlIE1BQyBiZWluZyBpbml0aWFsaXNlZCAqLworCWlmIChwcml2LT5idXNfaWQgIT0gcGxhdF9kYXQtPmJ1c19pZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBPSywgdGhpcyBQSFkgaXMgY29ubmVjdGVkIHRvIHRoZSBNQUMuCisJICAgR28gYWhlYWQgYW5kIGdldCB0aGUgcGFyYW1ldGVycyAqLworCURCRyhwcm9iZSwgREVCVUcsICIlczogT0suIEZvdW5kIFBIWSBjb25maWdcbiIsIF9fZnVuY19fKTsKKwlwcml2LT5waHlfaXJxID0KKwkgICAgcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUodG9fcGxhdGZvcm1fZGV2aWNlKGRldiksICJwaHlpcnEiKTsKKwlEQkcocHJvYmUsIERFQlVHLCAiJXM6IFBIWSBpcnEgb24gYnVzICVkIGlzICVkXG4iLCBfX2Z1bmNfXywKKwkgICAgcGxhdF9kYXQtPmJ1c19pZCwgcHJpdi0+cGh5X2lycSk7CisKKwkvKiBPdmVycmlkZSB3aXRoIGtlcm5lbCBwYXJhbWV0ZXJzIGlmIHN1cHBsaWVkIFhYWCBDUlMgWFhYCisJICogdGhpcyBuZWVkcyB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyAqLworCWlmICgocGh5YWRkciA+PSAwKSAmJiAocGh5YWRkciA8PSAzMSkpCisJCXBsYXRfZGF0LT5waHlfYWRkciA9IHBoeWFkZHI7CisKKwlwcml2LT5waHlfYWRkciA9IHBsYXRfZGF0LT5waHlfYWRkcjsKKwlwcml2LT5waHlfbWFzayA9IHBsYXRfZGF0LT5waHlfbWFzazsKKwlwcml2LT5waHlfaW50ZXJmYWNlID0gcGxhdF9kYXQtPmludGVyZmFjZTsKKwlwcml2LT5waHlfcmVzZXQgPSBwbGF0X2RhdC0+cGh5X3Jlc2V0OworCisJREJHKHByb2JlLCBERUJVRywgIiVzOiBleGl0aW5nXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDE7CS8qIGZvcmNlcyBleGl0IG9mIGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoKSAqLworfQorCisvKioKKyAqIHN0bW1hY19kdnJfcHJvYmUKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgcG9pbnRlcgorICogRGVzY3JpcHRpb246IHRoZSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBwbGF0Zm9ybV9kZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgc3RtbWFjX2R2cl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGludCAqYWRkciA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEgKnBsYXRfZGF0OworCisJcHJfaW5mbygiU1RNTUFDIGRyaXZlcjpcblx0cGxhdGZvcm0gcmVnaXN0cmF0aW9uLi4uICIpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCXByX2luZm8oImRvbmUhXG4iKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIChyZXMtPmVuZCAtIHJlcy0+c3RhcnQpLAorCQkJCXBkZXYtPm5hbWUpKSB7CisJCXByX2VycigiJXM6IEVSUk9SOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiCisJCSAgICAgICAiY2Fubm90IGdldCB0aGUgSS9PIGFkZHIgMHgleFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCAodW5zaWduZWQgaW50KXJlcy0+c3RhcnQpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWFkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIChyZXMtPmVuZCAtIHJlcy0+c3RhcnQpKTsKKwlpZiAoIWFkZHIpIHsKKwkJcHJfZXJyKCIlczogRVJST1I6IG1lbW9yeSBtYXBwaW5nIGZhaWxlZCBcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc3RtbWFjX3ByaXYpKTsKKwlpZiAoIW5kZXYpIHsKKwkJcHJfZXJyKCIlczogRVJST1I6IGFsbG9jYXRpbmcgdGhlIGRldmljZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKKworCS8qIEdldCB0aGUgTUFDIGluZm9ybWF0aW9uICovCisJbmRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIm1hY2lycSIpOworCWlmIChuZGV2LT5pcnEgPT0gLUVOWElPKSB7CisJCXByX2VycigiJXM6IEVSUk9SOiBNQUMgSVJRIGNvbmZpZ3VyYXRpb24gIgorCQkgICAgICAgImluZm9ybWF0aW9uIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJcHJpdi0+ZGV2aWNlID0gJihwZGV2LT5kZXYpOworCXByaXYtPmRldiA9IG5kZXY7CisJcGxhdF9kYXQgPSAoc3RydWN0IHBsYXRfc3RtbWFjZW5ldF9kYXRhICopKChwZGV2LT5kZXYpLnBsYXRmb3JtX2RhdGEpOworCXByaXYtPmJ1c19pZCA9IHBsYXRfZGF0LT5idXNfaWQ7CisJcHJpdi0+cGJsID0gcGxhdF9kYXQtPnBibDsJLyogVExJICovCisJcHJpdi0+aXNfZ21hYyA9IHBsYXRfZGF0LT5oYXNfZ21hYzsJLyogR01BQyBpcyBvbiBib2FyZCAqLworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRldik7CisKKwkvKiBTZXQgdGhlIEkvTyBiYXNlIGFkZHIgKi8KKwluZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylhZGRyOworCisJLyogTUFDIEhXIHJldmljZSBkZXRlY3Rpb24gKi8KKwlyZXQgPSBzdG1tYWNfbWFjX2RldmljZV9zZXR1cChuZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBOZXR3b3JrIERldmljZSBSZWdpc3RyYXRpb24gKi8KKwlyZXQgPSBzdG1tYWNfcHJvYmUobmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyogYXNzb2NpYXRlIGEgUEhZIC0gaXQgaXMgcHJvdmlkZWQgYnkgYW5vdGhlciBwbGF0Zm9ybSBidXMgKi8KKwlpZiAoIWRyaXZlcl9mb3JfZWFjaF9kZXZpY2UKKwkgICAgKCYoc3RtbWFjcGh5X2RyaXZlci5kcml2ZXIpLCBOVUxMLCAodm9pZCAqKXByaXYsCisJICAgICBzdG1tYWNfYXNzb2NpYXRlX3BoeSkpIHsKKwkJcHJfZXJyKCJObyBQSFkgZGV2aWNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1BQyFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlwcml2LT5maXhfbWFjX3NwZWVkID0gcGxhdF9kYXQtPmZpeF9tYWNfc3BlZWQ7CisJcHJpdi0+YnNwX3ByaXYgPSBwbGF0X2RhdC0+YnNwX3ByaXY7CisKKwlwcl9pbmZvKCJcdCVzIC0gKGRldi4gbmFtZTogJXMgLSBpZDogJWQsIElSUSAjJWRcbiIKKwkgICAgICAgIlx0SU8gYmFzZSBhZGRyOiAweCUwOHgpXG4iLCBuZGV2LT5uYW1lLCBwZGV2LT5uYW1lLAorCSAgICAgICBwZGV2LT5pZCwgbmRldi0+aXJxLCAodW5zaWduZWQgaW50KWFkZHIpOworCisJLyogTURJTyBidXMgUmVnaXN0cmF0aW9uICovCisJcHJfZGVidWcoIlx0TURJTyBidXMgKGlkOiAlZCkuLi4iLCBwcml2LT5idXNfaWQpOworCXJldCA9IHN0bW1hY19tZGlvX3JlZ2lzdGVyKG5kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlwcl9kZWJ1ZygicmVnaXN0ZXJlZCFcbiIpOworCitvdXQ6CisJaWYgKHJldCA8IDApIHsKKwkJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCAocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSk7CisJCWlmIChhZGRyICE9IE5VTEwpCisJCQlpb3VubWFwKGFkZHIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogc3RtbWFjX2R2cl9yZW1vdmUKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgcG9pbnRlcgorICogRGVzY3JpcHRpb246IHRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBUWC9SWCBwcm9jZXNzZXMsIGRpc2FibGVzIHRoZSBNQUMgUlgvVFgKKyAqIGNoYW5nZXMgdGhlIGxpbmsgc3RhdHVzLCByZWxlYXNlcyB0aGUgRE1BIGRlc2NyaXB0b3IgcmluZ3MsCisgKiB1bnJlZ2lzdGVycyB0aGUgTURJTyBidXMgYW5kIHVubWFwcyB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKyAqLworc3RhdGljIGludCBzdG1tYWNfZHZyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlwcl9pbmZvKCIlczpcblx0cmVtb3ZpbmcgZHJpdmVyIiwgX19mdW5jX18pOworCisJc3RtbWFjX2RtYV9zdG9wX3J4KG5kZXYtPmJhc2VfYWRkcik7CisJc3RtbWFjX2RtYV9zdG9wX3R4KG5kZXYtPmJhc2VfYWRkcik7CisKKwlzdG1tYWNfbWFjX2Rpc2FibGVfcngobmRldi0+YmFzZV9hZGRyKTsKKwlzdG1tYWNfbWFjX2Rpc2FibGVfdHgobmRldi0+YmFzZV9hZGRyKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOworCisJc3RtbWFjX21kaW9fdW5yZWdpc3RlcihuZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCisJaW91bm1hcCgodm9pZCAqKW5kZXYtPmJhc2VfYWRkcik7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgKHJlcy0+ZW5kIC0gcmVzLT5zdGFydCkpOworCisJZnJlZV9uZXRkZXYobmRldik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzdG1tYWNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGRpc19pYyA9IDA7CisKKwlpZiAoIWRldiB8fCAhbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKwlpZiAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgeworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJaWYgKHByaXYtPnBoeWRldikKKwkJCXBoeV9zdG9wKHByaXYtPnBoeWRldik7CisKKyNpZmRlZiBDT05GSUdfU1RNTUFDX1RJTUVSCisJCXByaXYtPnRtLT50aW1lcl9zdG9wKCk7CisJCWRpc19pYyA9IDE7CisjZW5kaWYKKwkJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKKworCQkvKiBTdG9wIFRYL1JYIERNQSAqLworCQlzdG1tYWNfZG1hX3N0b3BfdHgoZGV2LT5iYXNlX2FkZHIpOworCQlzdG1tYWNfZG1hX3N0b3BfcngoZGV2LT5iYXNlX2FkZHIpOworCQkvKiBDbGVhciB0aGUgUngvVHggZGVzY3JpcHRvcnMgKi8KKwkJcHJpdi0+bWFjX3R5cGUtPm9wcy0+aW5pdF9yeF9kZXNjKHByaXYtPmRtYV9yeCwKKwkJCQkJCSAgcHJpdi0+ZG1hX3J4X3NpemUsIGRpc19pYyk7CisJCXByaXYtPm1hY190eXBlLT5vcHMtPmluaXRfdHhfZGVzYyhwcml2LT5kbWFfdHgsCisJCQkJCQkgIHByaXYtPmRtYV90eF9zaXplKTsKKworCQlzdG1tYWNfbWFjX2Rpc2FibGVfdHgoZGV2LT5iYXNlX2FkZHIpOworCisJCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmKHBkZXYtPmRldikpKSB7CisJCQkvKiBFbmFibGUgUG93ZXIgZG93biBtb2RlIGJ5IHByb2dyYW1taW5nIHRoZSBQTVQgcmVncyAqLworCQkJaWYgKHByaXYtPndvbGVuYWJsZWQgPT0gUE1UX1NVUFBPUlRFRCkKKwkJCQlwcml2LT5tYWNfdHlwZS0+b3BzLT5wbXQoZGV2LT5iYXNlX2FkZHIsCisJCQkJCQkJIHByaXYtPndvbG9wdHMpOworCQl9IGVsc2UgeworCQkJc3RtbWFjX21hY19kaXNhYmxlX3J4KGRldi0+YmFzZV9hZGRyKTsKKwkJfQorCX0gZWxzZSB7CisJCXByaXYtPnNodXRkb3duID0gMTsKKwkJLyogQWx0aG91Z2ggdGhpcyBjYW4gYXBwZWFyIHNsaWdodGx5IHJlZHVuZGFudCBpdCBhY3R1YWxseQorCQkgKiBtYWtlcyBmYXN0IHRoZSBzdGFuZGJ5IG9wZXJhdGlvbiBhbmQgZ3VhcmFudGVlcyB0aGUgZHJpdmVyCisJCSAqIHdvcmtpbmcgaWYgaGliZXJuYXRpb24gaXMgb24gbWVkaWEuICovCisJCXN0bW1hY19yZWxlYXNlKGRldik7CisJfQorCisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0bW1hY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmIChwcml2LT5zaHV0ZG93bikgeworCQkvKiBSZS1vcGVuIHRoZSBpbnRlcmZhY2UgYW5kIHJlLWluaXQgdGhlIE1BQy9ETUEKKwkJICAgYW5kIHRoZSByaW5ncy4gKi8KKwkJc3RtbWFjX29wZW4oZGV2KTsKKwkJZ290byBvdXRfcmVzdW1lOworCX0KKworCS8qIFBvd2VyIERvd24gYml0LCBpbnRvIHRoZSBQTSByZWdpc3RlciwgaXMgY2xlYXJlZAorCSAqIGF1dG9tYXRpY2FsbHkgYXMgc29vbiBhcyBhIG1hZ2ljIHBhY2tldCBvciBhIFdha2UtdXAgZnJhbWUKKwkgKiBpcyByZWNlaXZlZC4gQW55d2F5LCBpdCdzIGJldHRlciB0byBtYW51YWxseSBjbGVhcgorCSAqIHRoaXMgYml0IGJlY2F1c2UgaXQgY2FuIGdlbmVyYXRlIHByb2JsZW1zIHdoaWxlIHJlc3VtaW5nCisJICogZnJvbSBhbm90aGVyIGRldmljZXMgKGUuZy4gc2VyaWFsIGNvbnNvbGUpLiAqLworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmKHBkZXYtPmRldikpKQorCQlpZiAocHJpdi0+d29sZW5hYmxlZCA9PSBQTVRfU1VQUE9SVEVEKQorCQkJcHJpdi0+bWFjX3R5cGUtPm9wcy0+cG10KGRldi0+YmFzZV9hZGRyLCAwKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCS8qIEVuYWJsZSB0aGUgTUFDIGFuZCBETUEgKi8KKwlzdG1tYWNfbWFjX2VuYWJsZV9yeChpb2FkZHIpOworCXN0bW1hY19tYWNfZW5hYmxlX3R4KGlvYWRkcik7CisJc3RtbWFjX2RtYV9zdGFydF90eChpb2FkZHIpOworCXN0bW1hY19kbWFfc3RhcnRfcngoaW9hZGRyKTsKKworI2lmZGVmIENPTkZJR19TVE1NQUNfVElNRVIKKwlwcml2LT50bS0+dGltZXJfc3RhcnQodG1yYXRlKTsKKyNlbmRpZgorCW5hcGlfZW5hYmxlKCZwcml2LT5uYXBpKTsKKworCWlmIChwcml2LT5waHlkZXYpCisJCXBoeV9zdGFydChwcml2LT5waHlkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworb3V0X3Jlc3VtZToKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3RtbWFjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9IFNUTU1BQ19SRVNPVVJDRV9OQU1FLAorCQkgICB9LAorCS5wcm9iZSA9IHN0bW1hY19kdnJfcHJvYmUsCisJLnJlbW92ZSA9IHN0bW1hY19kdnJfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gc3RtbWFjX3N1c3BlbmQsCisJLnJlc3VtZSA9IHN0bW1hY19yZXN1bWUsCisjZW5kaWYKKworfTsKKworLyoqCisgKiBzdG1tYWNfaW5pdF9tb2R1bGUgLSBFbnRyeSBwb2ludCBmb3IgdGhlIGRyaXZlcgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzdG1tYWNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3RtbWFjcGh5X2RyaXZlcikpIHsKKwkJcHJfZXJyKCJObyBQSFkgZGV2aWNlcyByZWdpc3RlcmVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3RtbWFjX2RyaXZlcik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzdG1tYWNfY2xlYW51cF9tb2R1bGUgLSBDbGVhbnVwIHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjbGVhbnVwIHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzdG1tYWNfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3RtbWFjcGh5X2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN0bW1hY19kcml2ZXIpOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc3RtbWFjX2NtZGxpbmVfb3B0KGNoYXIgKnN0cikKK3sKKwljaGFyICpvcHQ7CisKKwlpZiAoIXN0ciB8fCAhKnN0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJd2hpbGUgKChvcHQgPSBzdHJzZXAoJnN0ciwgIiwiKSkgIT0gTlVMTCkgeworCQlpZiAoIXN0cm5jbXAob3B0LCAiZGVidWc6IiwgNikpCisJCQlzdHJpY3Rfc3RydG91bChvcHQgKyA2LCAwLCAodW5zaWduZWQgbG9uZyAqKSZkZWJ1Zyk7CisJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgInBoeWFkZHI6IiwgOCkpCisJCQlzdHJpY3Rfc3RydG91bChvcHQgKyA4LCAwLCAodW5zaWduZWQgbG9uZyAqKSZwaHlhZGRyKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAiZG1hX3R4c2l6ZToiLCAxMSkpCisJCQlzdHJpY3Rfc3RydG91bChvcHQgKyAxMSwgMCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgKikmZG1hX3R4c2l6ZSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgImRtYV9yeHNpemU6IiwgMTEpKQorCQkJc3RyaWN0X3N0cnRvdWwob3B0ICsgMTEsIDAsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nICopJmRtYV9yeHNpemUpOworCQllbHNlIGlmICghc3RybmNtcChvcHQsICJidWZfc3o6IiwgNykpCisJCQlzdHJpY3Rfc3RydG91bChvcHQgKyA3LCAwLCAodW5zaWduZWQgbG9uZyAqKSZidWZfc3opOworCQllbHNlIGlmICghc3RybmNtcChvcHQsICJ0YzoiLCAzKSkKKwkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDMsIDAsICh1bnNpZ25lZCBsb25nICopJnRjKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAidHhfY29lOiIsIDcpKQorCQkJc3RyaWN0X3N0cnRvdWwob3B0ICsgNywgMCwgKHVuc2lnbmVkIGxvbmcgKikmdHhfY29lKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAid2F0Y2hkb2c6IiwgOSkpCisJCQlzdHJpY3Rfc3RydG91bChvcHQgKyA5LCAwLCAodW5zaWduZWQgbG9uZyAqKSZ3YXRjaGRvZyk7CisJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgImZsb3dfY3RybDoiLCAxMCkpCisJCQlzdHJpY3Rfc3RydG91bChvcHQgKyAxMCwgMCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgKikmZmxvd19jdHJsKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAicGF1c2U6IiwgNikpCisJCQlzdHJpY3Rfc3RydG91bChvcHQgKyA2LCAwLCAodW5zaWduZWQgbG9uZyAqKSZwYXVzZSk7CisjaWZkZWYgQ09ORklHX1NUTU1BQ19USU1FUgorCQllbHNlIGlmICghc3RybmNtcChvcHQsICJ0bXJhdGU6IiwgNykpCisJCQlzdHJpY3Rfc3RydG91bChvcHQgKyA3LCAwLCAodW5zaWduZWQgbG9uZyAqKSZ0bXJhdGUpOworI2VuZGlmCisJfQorCXJldHVybiAwOworfQorCitfX3NldHVwKCJzdG1tYWNldGg9Iiwgc3RtbWFjX2NtZGxpbmVfb3B0KTsKKyNlbmRpZgorCittb2R1bGVfaW5pdChzdG1tYWNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc3RtbWFjX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVE1NQUMgMTAvMTAwLzEwMDAgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJHaXVzZXBwZSBDYXZhbGxhcm8gPHBlcHBlLmNhdmFsbGFyb0BzdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX21kaW8uYyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTg1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX21kaW8uYwpAQCAtMCwwICsxLDIxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgU1RNTUFDIEV0aGVybmV0IERyaXZlciAtLSBNRElPIGJ1cyBpbXBsZW1lbnRhdGlvbgorICBQcm92aWRlcyBCdXMgaW50ZXJmYWNlIGZvciBNSUkgcmVnaXN0ZXJzCisKKyAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIFNUTWljcm9lbGVjdHJvbmljcyBMdGQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBBdXRob3I6IENhcmwgU2hhdyA8Y2FybC5zaGF3QHN0LmNvbT4KKyAgTWFpbnRhaW5lcjogR2l1c2VwcGUgQ2F2YWxsYXJvIDxwZXBwZS5jYXZhbGxhcm9Ac3QuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCisjaW5jbHVkZSAic3RtbWFjLmgiCisKKyNkZWZpbmUgTUlJX0JVU1kgMHgwMDAwMDAwMQorI2RlZmluZSBNSUlfV1JJVEUgMHgwMDAwMDAwMgorCisvKioKKyAqIHN0bW1hY19tZGlvX3JlYWQKKyAqIEBidXM6IHBvaW50cyB0byB0aGUgbWlpX2J1cyBzdHJ1Y3R1cmUKKyAqIEBwaHlhZGRyOiBNSUkgYWRkciByZWcgYml0cyAxNS0xMQorICogQHBoeXJlZzogTUlJIGFkZHIgcmVnIGJpdHMgMTAtNgorICogRGVzY3JpcHRpb246IGl0IHJlYWRzIGRhdGEgZnJvbSB0aGUgTUlJIHJlZ2lzdGVyIGZyb20gd2l0aGluIHRoZSBwaHkgZGV2aWNlLgorICogRm9yIHRoZSA3MTExIEdNQUMsIHdlIG11c3Qgc2V0IHRoZSBiaXQgMCBpbiB0aGUgTUlJIGFkZHJlc3MgcmVnaXN0ZXIgd2hpbGUKKyAqIGFjY2Vzc2luZyB0aGUgUEhZIHJlZ2lzdGVycy4KKyAqIEZvcnR1bmF0ZWx5LCBpdCBzZWVtcyB0aGlzIGhhcyBubyBkcmF3YmFjayBmb3IgdGhlIDcxMDkgTUFDLgorICovCitzdGF0aWMgaW50IHN0bW1hY19tZGlvX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeWFkZHIsIGludCBwaHlyZWcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBidXMtPnByaXY7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBuZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgaW50IG1paV9hZGRyZXNzID0gcHJpdi0+bWFjX3R5cGUtPmh3Lm1paS5hZGRyOworCXVuc2lnbmVkIGludCBtaWlfZGF0YSA9IHByaXYtPm1hY190eXBlLT5ody5taWkuZGF0YTsKKworCWludCBkYXRhOworCXUxNiByZWdWYWx1ZSA9ICgoKHBoeWFkZHIgPDwgMTEpICYgKDB4MDAwMEY4MDApKSB8CisJCQkoKHBoeXJlZyA8PCA2KSAmICgweDAwMDAwN0MwKSkpOworCXJlZ1ZhbHVlIHw9IE1JSV9CVVNZOwkvKiBpbiBjYXNlIG9mIEdNQUMgKi8KKworCWRvIHt9IHdoaWxlICgoKHJlYWRsKGlvYWRkciArIG1paV9hZGRyZXNzKSkgJiBNSUlfQlVTWSkgPT0gMSk7CisJd3JpdGVsKHJlZ1ZhbHVlLCBpb2FkZHIgKyBtaWlfYWRkcmVzcyk7CisJZG8ge30gd2hpbGUgKCgocmVhZGwoaW9hZGRyICsgbWlpX2FkZHJlc3MpKSAmIE1JSV9CVVNZKSA9PSAxKTsKKworCS8qIFJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgTUlJIGRhdGEgcmVnaXN0ZXIgKi8KKwlkYXRhID0gKGludClyZWFkbChpb2FkZHIgKyBtaWlfZGF0YSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyoqCisgKiBzdG1tYWNfbWRpb193cml0ZQorICogQGJ1czogcG9pbnRzIHRvIHRoZSBtaWlfYnVzIHN0cnVjdHVyZQorICogQHBoeWFkZHI6IE1JSSBhZGRyIHJlZyBiaXRzIDE1LTExCisgKiBAcGh5cmVnOiBNSUkgYWRkciByZWcgYml0cyAxMC02CisgKiBAcGh5ZGF0YTogcGh5IGRhdGEKKyAqIERlc2NyaXB0aW9uOiBpdCB3cml0ZXMgdGhlIGRhdGEgaW50byB0aGUgTUlJIHJlZ2lzdGVyIGZyb20gd2l0aGluIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgc3RtbWFjX21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeWFkZHIsIGludCBwaHlyZWcsCisJCQkgICAgIHUxNiBwaHlkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gYnVzLT5wcml2OworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gbmRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCBtaWlfYWRkcmVzcyA9IHByaXYtPm1hY190eXBlLT5ody5taWkuYWRkcjsKKwl1bnNpZ25lZCBpbnQgbWlpX2RhdGEgPSBwcml2LT5tYWNfdHlwZS0+aHcubWlpLmRhdGE7CisKKwl1MTYgdmFsdWUgPQorCSAgICAoKChwaHlhZGRyIDw8IDExKSAmICgweDAwMDBGODAwKSkgfCAoKHBoeXJlZyA8PCA2KSAmICgweDAwMDAwN0MwKSkpCisJICAgIHwgTUlJX1dSSVRFOworCisJdmFsdWUgfD0gTUlJX0JVU1k7CisKKwkvKiBXYWl0IHVudGlsIGFueSBleGlzdGluZyBNSUkgb3BlcmF0aW9uIGlzIGNvbXBsZXRlICovCisJZG8ge30gd2hpbGUgKCgocmVhZGwoaW9hZGRyICsgbWlpX2FkZHJlc3MpKSAmIE1JSV9CVVNZKSA9PSAxKTsKKworCS8qIFNldCB0aGUgTUlJIGFkZHJlc3MgcmVnaXN0ZXIgdG8gd3JpdGUgKi8KKwl3cml0ZWwocGh5ZGF0YSwgaW9hZGRyICsgbWlpX2RhdGEpOworCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgbWlpX2FkZHJlc3MpOworCisJLyogV2FpdCB1bnRpbCBhbnkgZXhpc3RpbmcgTUlJIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAqLworCWRvIHt9IHdoaWxlICgoKHJlYWRsKGlvYWRkciArIG1paV9hZGRyZXNzKSkgJiBNSUlfQlVTWSkgPT0gMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzdG1tYWNfbWRpb19yZXNldAorICogQGJ1czogcG9pbnRzIHRvIHRoZSBtaWlfYnVzIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb246IHJlc2V0IHRoZSBNSUkgYnVzCisgKi8KK3N0YXRpYyBpbnQgc3RtbWFjX21kaW9fcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGJ1cy0+cHJpdjsKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IG5kZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbWlpX2FkZHJlc3MgPSBwcml2LT5tYWNfdHlwZS0+aHcubWlpLmFkZHI7CisKKwlpZiAocHJpdi0+cGh5X3Jlc2V0KSB7CisJCXByX2RlYnVnKCJzdG1tYWNfbWRpb19yZXNldDogY2FsbGluZyBwaHlfcmVzZXRcbiIpOworCQlwcml2LT5waHlfcmVzZXQocHJpdi0+YnNwX3ByaXYpOworCX0KKworCS8qIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBwcm9ibGVtcyB3aXRoIHRoZSBTVEUxMDFQIFBIWS4KKwkgKiBJdCBkb2Vzbid0IGNvbXBsZXRlIGl0cyByZXNldCB1bnRpbCBhdCBsZWFzdCBvbmUgY2xvY2sgY3ljbGUKKwkgKiBvbiBNREMsIHNvIHBlcmZvcm0gYSBkdW1teSBtZGlvIHJlYWQuCisJICovCisJd3JpdGVsKDAsIGlvYWRkciArIG1paV9hZGRyZXNzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHN0bW1hY19tZGlvX3JlZ2lzdGVyCisgKiBAbmRldjogbmV0IGRldmljZSBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uOiBpdCByZWdpc3RlcnMgdGhlIE1JSSBidXMKKyAqLworaW50IHN0bW1hY19tZGlvX3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBtaWlfYnVzICpuZXdfYnVzOworCWludCAqaXJxbGlzdDsKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgYWRkciwgZm91bmQ7CisKKwluZXdfYnVzID0gbWRpb2J1c19hbGxvYygpOworCWlmIChuZXdfYnVzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaXJxbGlzdCA9IGt6YWxsb2Moc2l6ZW9mKGludCkgKiBQSFlfTUFYX0FERFIsIEdGUF9LRVJORUwpOworCWlmIChpcnFsaXN0ID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBpcnFsaXN0X2FsbG9jX2ZhaWw7CisJfQorCisJLyogQXNzaWduIElSUSB0byBwaHkgYXQgYWRkcmVzcyBwaHlfYWRkciAqLworCWlmIChwcml2LT5waHlfYWRkciAhPSAtMSkKKwkJaXJxbGlzdFtwcml2LT5waHlfYWRkcl0gPSBwcml2LT5waHlfaXJxOworCisJbmV3X2J1cy0+bmFtZSA9ICJTVE1NQUMgTUlJIEJ1cyI7CisJbmV3X2J1cy0+cmVhZCA9ICZzdG1tYWNfbWRpb19yZWFkOworCW5ld19idXMtPndyaXRlID0gJnN0bW1hY19tZGlvX3dyaXRlOworCW5ld19idXMtPnJlc2V0ID0gJnN0bW1hY19tZGlvX3Jlc2V0OworCXNucHJpbnRmKG5ld19idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsIHByaXYtPmJ1c19pZCk7CisJbmV3X2J1cy0+cHJpdiA9IG5kZXY7CisJbmV3X2J1cy0+aXJxID0gaXJxbGlzdDsKKwluZXdfYnVzLT5waHlfbWFzayA9IHByaXYtPnBoeV9tYXNrOworCW5ld19idXMtPnBhcmVudCA9IHByaXYtPmRldmljZTsKKwllcnIgPSBtZGlvYnVzX3JlZ2lzdGVyKG5ld19idXMpOworCWlmIChlcnIgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBDYW5ub3QgcmVnaXN0ZXIgYXMgTURJTyBidXNcbiIsIG5ld19idXMtPm5hbWUpOworCQlnb3RvIGJ1c19yZWdpc3Rlcl9mYWlsOworCX0KKworCXByaXYtPm1paSA9IG5ld19idXM7CisKKwlmb3VuZCA9IDA7CisJZm9yIChhZGRyID0gMDsgYWRkciA8IDMyOyBhZGRyKyspIHsKKwkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5ld19idXMtPnBoeV9tYXBbYWRkcl07CisJCWlmIChwaHlkZXYpIHsKKwkJCWlmIChwcml2LT5waHlfYWRkciA9PSAtMSkgeworCQkJCXByaXYtPnBoeV9hZGRyID0gYWRkcjsKKwkJCQlwaHlkZXYtPmlycSA9IHByaXYtPnBoeV9pcnE7CisJCQkJaXJxbGlzdFthZGRyXSA9IHByaXYtPnBoeV9pcnE7CisJCQl9CisJCQlwcl9pbmZvKCIlczogUEhZIElEICUwOHggYXQgJWQgSVJRICVkICglcyklc1xuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lLCBwaHlkZXYtPnBoeV9pZCwgYWRkciwKKwkJCSAgICAgICBwaHlkZXYtPmlycSwgZGV2X25hbWUoJnBoeWRldi0+ZGV2KSwKKwkJCSAgICAgICAoYWRkciA9PSBwcml2LT5waHlfYWRkcikgPyAiIGFjdGl2ZSIgOiAiIik7CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCQlwcl93YXJuaW5nKCIlczogTm8gUEhZIGZvdW5kXG4iLCBuZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworYnVzX3JlZ2lzdGVyX2ZhaWw6CisJa2ZyZWUoaXJxbGlzdCk7CitpcnFsaXN0X2FsbG9jX2ZhaWw6CisJa2ZyZWUobmV3X2J1cyk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBzdG1tYWNfbWRpb191bnJlZ2lzdGVyCisgKiBAbmRldjogbmV0IGRldmljZSBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uOiBpdCB1bnJlZ2lzdGVycyB0aGUgTUlJIGJ1cworICovCitpbnQgc3RtbWFjX21kaW9fdW5yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCW1kaW9idXNfdW5yZWdpc3Rlcihwcml2LT5taWkpOworCXByaXYtPm1paS0+cHJpdiA9IE5VTEw7CisJa2ZyZWUocHJpdi0+bWlpKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hY190aW1lci5jIGIvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hY190aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzhjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX3RpbWVyLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFNUTU1BQyBleHRlcm5hbCB0aW1lciBzdXBwb3J0LgorCisgIENvcHlyaWdodCAoQykgMjAwNy0yMDA5ICBTVE1pY3JvZWxlY3Ryb25pY3MgTHRkCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisKKyAgQXV0aG9yOiBHaXVzZXBwZSBDYXZhbGxhcm8gPHBlcHBlLmNhdmFsbGFyb0BzdC5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlICJzdG1tYWNfdGltZXIuaCIKKworc3RhdGljIHZvaWQgc3RtbWFjX3RpbWVyX2hhbmRsZXIodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKworCXN0bW1hY19zY2hlZHVsZShkZXYpOworCisJcmV0dXJuOworfQorCisjZGVmaW5lIFNUTU1BQ19USU1FUl9NU0codGltZXIsIGZyZXEpIFwKK3ByaW50ayhLRVJOX0lORk8gInN0bW1hY190aW1lcjogJXMgVGltZXIgT04gKGZyZXEgJWRIeilcbiIsIHRpbWVyLCBmcmVxKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NUTU1BQ19SVENfVElNRVIpCisjaW5jbHVkZSA8bGludXgvcnRjLmg+CitzdGF0aWMgc3RydWN0IHJ0Y19kZXZpY2UgKnN0bW1hY19ydGM7CitzdGF0aWMgcnRjX3Rhc2tfdCBzdG1tYWNfdGFzazsKKworc3RhdGljIHZvaWQgc3RtbWFjX3J0Y19zdGFydCh1bnNpZ25lZCBpbnQgbmV3X2ZyZXEpCit7CisJcnRjX2lycV9zZXRfZnJlcShzdG1tYWNfcnRjLCAmc3RtbWFjX3Rhc2ssIG5ld19mcmVxKTsKKwlydGNfaXJxX3NldF9zdGF0ZShzdG1tYWNfcnRjLCAmc3RtbWFjX3Rhc2ssIDEpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc3RtbWFjX3J0Y19zdG9wKHZvaWQpCit7CisJcnRjX2lycV9zZXRfc3RhdGUoc3RtbWFjX3J0YywgJnN0bW1hY190YXNrLCAwKTsKKwlyZXR1cm47Cit9CisKK2ludCBzdG1tYWNfb3Blbl9leHRfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHN0bW1hY190aW1lciAqdG0pCit7CisJc3RtbWFjX3Rhc2sucHJpdmF0ZV9kYXRhID0gZGV2OworCXN0bW1hY190YXNrLmZ1bmMgPSBzdG1tYWNfdGltZXJfaGFuZGxlcjsKKworCXN0bW1hY19ydGMgPSBydGNfY2xhc3Nfb3BlbihDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKTsKKwlpZiAoc3RtbWFjX3J0YyA9PSBOVUxMKSB7CisJCXByX2Vycm9yKCJvcGVuIHJ0YyBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcnRjX2lycV9yZWdpc3RlcihzdG1tYWNfcnRjLCAmc3RtbWFjX3Rhc2spOworCisJLyogUGVyaW9kaWMgbW9kZSBpcyBub3Qgc3VwcG9ydGVkICovCisJaWYgKChydGNfaXJxX3NldF9mcmVxKHN0bW1hY19ydGMsICZzdG1tYWNfdGFzaywgdG0tPmZyZXEpIDwgMCkpIHsKKwkJcHJfZXJyb3IoInNldCBwZXJpb2RpYyBmYWlsZWRcbiIpOworCQlydGNfaXJxX3VucmVnaXN0ZXIoc3RtbWFjX3J0YywgJnN0bW1hY190YXNrKTsKKwkJcnRjX2NsYXNzX2Nsb3NlKHN0bW1hY19ydGMpOworCQlyZXR1cm4gLTE7CisJfQorCisJU1RNTUFDX1RJTUVSX01TRyhDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFLCB0bS0+ZnJlcSk7CisKKwl0bS0+dGltZXJfc3RhcnQgPSBzdG1tYWNfcnRjX3N0YXJ0OworCXRtLT50aW1lcl9zdG9wID0gc3RtbWFjX3J0Y19zdG9wOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzdG1tYWNfY2xvc2VfZXh0X3RpbWVyKHZvaWQpCit7CisJcnRjX2lycV9zZXRfc3RhdGUoc3RtbWFjX3J0YywgJnN0bW1hY190YXNrLCAwKTsKKwlydGNfaXJxX3VucmVnaXN0ZXIoc3RtbWFjX3J0YywgJnN0bW1hY190YXNrKTsKKwlydGNfY2xhc3NfY2xvc2Uoc3RtbWFjX3J0Yyk7CisJcmV0dXJuIDA7Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NUTU1BQ19UTVVfVElNRVIpCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjZGVmaW5lIFRNVV9DSEFOTkVMICJ0bXUyX2NsayIKK3N0YXRpYyBzdHJ1Y3QgY2xrICp0aW1lcl9jbG9jazsKKworc3RhdGljIHZvaWQgc3RtbWFjX3RtdV9zdGFydCh1bnNpZ25lZCBpbnQgbmV3X2ZyZXEpCit7CisJY2xrX3NldF9yYXRlKHRpbWVyX2Nsb2NrLCBuZXdfZnJlcSk7CisJY2xrX2VuYWJsZSh0aW1lcl9jbG9jayk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzdG1tYWNfdG11X3N0b3Aodm9pZCkKK3sKKwljbGtfZGlzYWJsZSh0aW1lcl9jbG9jayk7CisJcmV0dXJuOworfQorCitpbnQgc3RtbWFjX29wZW5fZXh0X3RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzdG1tYWNfdGltZXIgKnRtKQoreworCXRpbWVyX2Nsb2NrID0gY2xrX2dldChOVUxMLCBUTVVfQ0hBTk5FTCk7CisKKwlpZiAodGltZXJfY2xvY2sgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHRtdTJfcmVnaXN0ZXJfdXNlcihzdG1tYWNfdGltZXJfaGFuZGxlciwgKHZvaWQgKilkZXYpIDwgMCkgeworCQl0aW1lcl9jbG9jayA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlTVE1NQUNfVElNRVJfTVNHKCJUTVUyIiwgdG0tPmZyZXEpOworCXRtLT50aW1lcl9zdGFydCA9IHN0bW1hY190bXVfc3RhcnQ7CisJdG0tPnRpbWVyX3N0b3AgPSBzdG1tYWNfdG11X3N0b3A7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHN0bW1hY19jbG9zZV9leHRfdGltZXIodm9pZCkKK3sKKwljbGtfZGlzYWJsZSh0aW1lcl9jbG9jayk7CisJdG11Ml91bnJlZ2lzdGVyX3VzZXIoKTsKKwljbGtfcHV0KHRpbWVyX2Nsb2NrKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hY190aW1lci5oIGIvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hY190aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OTVjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX3RpbWVyLmgKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgU1RNTUFDIGV4dGVybmFsIHRpbWVyIEhlYWRlciBGaWxlLgorCisgIENvcHlyaWdodCAoQykgMjAwNy0yMDA5ICBTVE1pY3JvZWxlY3Ryb25pY3MgTHRkCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCisgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisKKyAgQXV0aG9yOiBHaXVzZXBwZSBDYXZhbGxhcm8gPHBlcHBlLmNhdmFsbGFyb0BzdC5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc3RtbWFjX3RpbWVyIHsKKwl2b2lkICgqdGltZXJfc3RhcnQpICh1bnNpZ25lZCBpbnQgbmV3X2ZyZXEpOworCXZvaWQgKCp0aW1lcl9zdG9wKSAodm9pZCk7CisJdW5zaWduZWQgaW50IGZyZXE7Cit9OworCisvKiBPcGVuIHRoZSBIVyB0aW1lciBkZXZpY2UgYW5kIHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyAqLworaW50IHN0bW1hY19vcGVuX2V4dF90aW1lcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc3RtbWFjX3RpbWVyICp0bSk7CisvKiBTdG9wIHRoZSB0aW1lciBhbmQgcmVsZWFzZSBpdCAqLworaW50IHN0bW1hY19jbG9zZV9leHRfdGltZXIodm9pZCk7CisvKiBGdW5jdGlvbiB1c2VkIGZvciBzY2hlZHVsaW5nIHRhc2sgd2l0aGluIHRoZSBzdG1tYWMgKi8KK3ZvaWQgc3RtbWFjX3NjaGVkdWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1RNTUFDX1RNVV9USU1FUikKK2V4dGVybiBpbnQgdG11Ml9yZWdpc3Rlcl91c2VyKHZvaWQgKmZudCwgdm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCB0bXUyX3VucmVnaXN0ZXJfdXNlcih2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwppbmRleCAzMDVlYzNkLi43MDE5YTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uYworKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnZuZXQuYyBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuYwppbmRleCBmMWU1ZTQ1Li5iYzc0ZGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW52bmV0LmMKKysrIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5jCkBAIC0xMDE2LDcgKzEwMTYsNiBAQAogCS5uZG9fb3BlbgkJPSB2bmV0X29wZW4sCiAJLm5kb19zdG9wCQk9IHZuZXRfY2xvc2UsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSB2bmV0X3NldF9yeF9tb2RlLAotCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHZuZXRfc2V0X21hY19hZGRyLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fdHhfdGltZW91dAkJPSB2bmV0X3R4X3RpbWVvdXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCmluZGV4IGYwOWJjNWQuLmJhNWQzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC05MDIsMTEgKzkwMiwxMiBAQAogCXN0cnVjdCB0ZzMgKnRwID0gYnAtPnByaXY7CiAJdTMyIHZhbDsKIAotCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX01ESU9CVVNfUEFVU0VEKQotCQlyZXR1cm4gLUVBR0FJTjsKKwlzcGluX2xvY2tfYmgoJnRwLT5sb2NrKTsKIAogCWlmICh0ZzNfcmVhZHBoeSh0cCwgcmVnLCAmdmFsKSkKLQkJcmV0dXJuIC1FSU87CisJCXZhbCA9IC1FSU87CisKKwlzcGluX3VubG9ja19iaCgmdHAtPmxvY2spOwogCiAJcmV0dXJuIHZhbDsKIH0KQEAgLTkxNCwxNCArOTE1LDE2IEBACiBzdGF0aWMgaW50IHRnM19tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpicCwgaW50IG1paV9pZCwgaW50IHJlZywgdTE2IHZhbCkKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IGJwLT5wcml2OworCXUzMiByZXQgPSAwOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfTURJT0JVU19QQVVTRUQpCi0JCXJldHVybiAtRUFHQUlOOworCXNwaW5fbG9ja19iaCgmdHAtPmxvY2spOwogCiAJaWYgKHRnM193cml0ZXBoeSh0cCwgcmVnLCB2YWwpKQotCQlyZXR1cm4gLUVJTzsKKwkJcmV0ID0gLUVJTzsKIAotCXJldHVybiAwOworCXNwaW5fdW5sb2NrX2JoKCZ0cC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHRnM19tZGlvX3Jlc2V0KHN0cnVjdCBtaWlfYnVzICpicCkKQEAgLTEwMTEsMTIgKzEwMTQsNiBAQAogCiBzdGF0aWMgdm9pZCB0ZzNfbWRpb19zdGFydChzdHJ1Y3QgdGczICp0cCkKIHsKLQlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19NRElPQlVTX0lOSVRFRCkgewotCQltdXRleF9sb2NrKCZ0cC0+bWRpb19idXMtPm1kaW9fbG9jayk7Ci0JCXRwLT50ZzNfZmxhZ3MzICY9IH5URzNfRkxHM19NRElPQlVTX1BBVVNFRDsKLQkJbXV0ZXhfdW5sb2NrKCZ0cC0+bWRpb19idXMtPm1kaW9fbG9jayk7Ci0JfQotCiAJdHAtPm1pX21vZGUgJj0gfk1BQ19NSV9NT0RFX0FVVE9fUE9MTDsKIAl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKIAl1ZGVsYXkoODApOwpAQCAtMTA0MSwxNSArMTAzOCw2IEBACiAJCXRnM19tZGlvX2NvbmZpZ181Nzg1KHRwKTsKIH0KIAotc3RhdGljIHZvaWQgdGczX21kaW9fc3RvcChzdHJ1Y3QgdGczICp0cCkKLXsKLQlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19NRElPQlVTX0lOSVRFRCkgewotCQltdXRleF9sb2NrKCZ0cC0+bWRpb19idXMtPm1kaW9fbG9jayk7Ci0JCXRwLT50ZzNfZmxhZ3MzIHw9IFRHM19GTEczX01ESU9CVVNfUEFVU0VEOwotCQltdXRleF91bmxvY2soJnRwLT5tZGlvX2J1cy0+bWRpb19sb2NrKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgdGczX21kaW9faW5pdChzdHJ1Y3QgdGczICp0cCkKIHsKIAlpbnQgaTsKQEAgLTExNDEsNyArMTEyOSw2IEBACiAJCXRwLT50ZzNfZmxhZ3MzICY9IH5URzNfRkxHM19NRElPQlVTX0lOSVRFRDsKIAkJbWRpb2J1c191bnJlZ2lzdGVyKHRwLT5tZGlvX2J1cyk7CiAJCW1kaW9idXNfZnJlZSh0cC0+bWRpb19idXMpOwotCQl0cC0+dGczX2ZsYWdzMyAmPSB+VEczX0ZMRzNfTURJT0JVU19QQVVTRUQ7CiAJfQogfQogCkBAIC0xMzYzLDcgKzEzNTAsNyBAQAogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gdHAtPm1kaW9fYnVzLT5waHlfbWFwW1BIWV9BRERSXTsKIAotCXNwaW5fbG9jaygmdHAtPmxvY2spOworCXNwaW5fbG9ja19iaCgmdHAtPmxvY2spOwogCiAJbWFjX21vZGUgPSB0cC0+bWFjX21vZGUgJiB+KE1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLIHwKIAkJCQkgICAgTUFDX01PREVfSEFMRl9EVVBMRVgpOwpAQCAtMTQzMSw3ICsxNDE4LDcgQEAKIAl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gcGh5ZGV2LT5zcGVlZDsKIAl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IHBoeWRldi0+ZHVwbGV4OwogCi0Jc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmdHAtPmxvY2spOwogCiAJaWYgKGxpbmttZXNnKQogCQl0ZzNfbGlua19yZXBvcnQodHApOwpAQCAtNjM5Miw4ICs2Mzc5LDYgQEAKIAogCXRnM19udnJhbV9sb2NrKHRwKTsKIAotCXRnM19tZGlvX3N0b3AodHApOwotCiAJdGczX2FwZV9sb2NrKHRwLCBURzNfQVBFX0xPQ0tfR1JDKTsKIAogCS8qIE5vIG1hdGNoaW5nIHRnM19udnJhbV91bmxvY2soKSBhZnRlciB0aGlzIGJlY2F1c2UKQEAgLTg2OTgsNiArODY4Myw4IEBACiAKIAlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKIAorCXRnM19waHlfc3RvcCh0cCk7CisKIAl0ZzNfZnVsbF9sb2NrKHRwLCAxKTsKICNpZiAwCiAJdGczX2R1bXBfc3RhdGUodHApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmggYi9kcml2ZXJzL25ldC90ZzMuaAppbmRleCA4MmI0NWQ4Li5iYWI3OTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuaAorKysgYi9kcml2ZXJzL25ldC90ZzMuaApAQCAtMjQxMiw3ICsyNDEyLDYgQEAKIAogc3RydWN0IHR4X3JpbmdfaW5mbyB7CiAJc3RydWN0IHNrX2J1ZmYJCQkqc2tiOwotCXUzMgkJCQlwcmV2X3ZsYW5fdGFnOwogfTsKIAogc3RydWN0IHRnM19jb25maWdfaW5mbyB7CkBAIC0yNzQ5LDcgKzI3NDgsNiBAQAogI2RlZmluZSBURzNfRkxHM181NzAxX0RNQV9CVUcJCTB4MDAwMDAwMDgKICNkZWZpbmUgVEczX0ZMRzNfVVNFX1BIWUxJQgkJMHgwMDAwMDAxMAogI2RlZmluZSBURzNfRkxHM19NRElPQlVTX0lOSVRFRAkJMHgwMDAwMDAyMAotI2RlZmluZSBURzNfRkxHM19NRElPQlVTX1BBVVNFRAkJMHgwMDAwMDA0MAogI2RlZmluZSBURzNfRkxHM19QSFlfQ09OTkVDVEVECQkweDAwMDAwMDgwCiAjZGVmaW5lIFRHM19GTEczX1JHTUlJX1NURF9JQk5EX0RJU0FCTEUJMHgwMDAwMDEwMAogI2RlZmluZSBURzNfRkxHM19SR01JSV9FWFRfSUJORF9SWF9FTgkweDAwMDAwMjAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCmluZGV4IDUyNWJiYzUuLjc1ZmEzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCkBAIC0xMDgsNiArMTA4LDcgQEAKICNkZWZpbmUgSUJNVFJfREVCVUdfTUVTU0FHRVMgMAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2lmZGVmIFBDTUNJQQkJLyogcmVxdWlyZWQgZm9yIGlibXRyX2NzLmMgdG8gYnVpbGQgKi8KICN1bmRlZiBNT0RVTEUJCS8qIHllcywgcmVhbGx5ICovCkBAIC0xMTQzLDkgKzExNDQsMTYgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogCQkJY2hhciAqKnBycGhhc2UgPSBwcmludHBoYXNlOwogCQkJY2hhciAqKnByZXJyb3IgPSBwcmludGVycm9yOworCQkJaW50IHBuciA9IGVyciAvIDE2IC0gMTsKKwkJCWludCBlbnIgPSBlcnIgJSAxNiAtIDE7CiAJCQlEUFJJTlRLKCJUUiBBZGFwdGVyIG1pc2Mgb3BlbiBmYWlsdXJlLCBlcnJvciBjb2RlID0gIik7Ci0JCQlwcmludGsoIjB4JXgsIFBoYXNlOiAlcywgRXJyb3I6ICVzXG4iLAotCQkJCWVyciwgcHJwaGFzZVtlcnIvMTYgLTFdLCBwcmVycm9yW2VyciUxNiAtMV0pOworCQkJaWYgKHBuciA8IDAgfHwgcG5yID49IEFSUkFZX1NJWkUocHJpbnRwaGFzZSkgfHwKKwkJCQkJZW5yIDwgMCB8fAorCQkJCQllbnIgPj0gQVJSQVlfU0laRShwcmludGVycm9yKSkKKwkJCQlwcmludGsoIjB4JXgsIGludmFsaWQgUGhhc2UvRXJyb3IuIiwgZXJyKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIjB4JXgsIFBoYXNlOiAlcywgRXJyb3I6ICVzXG4iLCBlcnIsCisJCQkJCQlwcnBoYXNlW3Bucl0sIHByZXJyb3JbZW5yXSk7CiAJCQlwcmludGsoIiByZXRyeWluZyBhZnRlciAlZHMgZGVsYXkuLi5cbiIsCiAJCQkJCVRSX1JFVFJZX0lOVEVSVkFML0haKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IGQzZWUxOTkuLjRmZGZhMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC05NDYsOCArOTQ2LDYgQEAKIAkJY2hhciAqbmFtZTsKIAkJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKLQkJZXJyID0gLUVJTlZBTDsKLQogCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwogCQllcnIgPSBzZWN1cml0eV90dW5fZGV2X2NyZWF0ZSgpOwpAQCAtOTY0LDcgKzk2Miw3IEBACiAJCQlmbGFncyB8PSBUVU5fVEFQX0RFVjsKIAkJCW5hbWUgPSAidGFwJWQiOwogCQl9IGVsc2UKLQkJCWdvdG8gZmFpbGVkOworCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKCppZnItPmlmcl9uYW1lKQogCQkJbmFtZSA9IGlmci0+aWZyX25hbWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKaW5kZXggZDZkMzQ1Mi4uNTkyMWY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMTA4LDYgKzEwOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9kbTk2MDEuYyBiL2RyaXZlcnMvbmV0L3VzYi9kbTk2MDEuYwppbmRleCA3MjQ3MGY3Li5hMmIzMGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvZG05NjAxLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2RtOTYwMS5jCkBAIC02NDksNiArNjQ5LDEwIEBACiAJVVNCX0RFVklDRSgweDBmZTYsIDB4ODEwMSksCS8qIERNOTYwMSBVU0IgdG8gRmFzdCBFdGhlcm5ldCBBZGFwdGVyICovCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJmRtOTYwMV9pbmZvLAogCSB9LAorCXsKKwkgVVNCX0RFVklDRSgweDBhNDYsIDB4OTAwMCksCS8qIERNOTAwMEUgKi8KKwkgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJmRtOTYwMV9pbmZvLAorCSB9LAogCXt9LAkJCS8vIEVORAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jIGIvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCmluZGV4IGUyYTM5YjkuLmUzOTFlZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYworKysgYi9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKQEAgLTI2Myw2ICsyNjMsNyBAQAogCQkJICBpbnQgdGltZW91dCkKIHsKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKKwlpbnQgcmV0dmFsOwogCiAJZGJnKCJrYXdldGhfY29udHJvbCgpIik7CiAKQEAgLTI3OCwxOCArMjc5LDIxIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWRyLT5iUmVxdWVzdFR5cGU9IHJlcXVlc3R0eXBlOworCWRyLT5iUmVxdWVzdFR5cGUgPSByZXF1ZXN0dHlwZTsKIAlkci0+YlJlcXVlc3QgPSByZXF1ZXN0OwogCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CiAJZHItPndJbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKIAlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwogCi0JcmV0dXJuIGthd2V0aF9pbnRlcm5hbF9jb250cm9sX21zZyhrYXdldGgtPmRldiwKLQkJCQkJcGlwZSwKLQkJCQkJZHIsCi0JCQkJCWRhdGEsCi0JCQkJCXNpemUsCi0JCQkJCXRpbWVvdXQpOworCXJldHZhbCA9IGthd2V0aF9pbnRlcm5hbF9jb250cm9sX21zZyhrYXdldGgtPmRldiwKKwkJCQkJICAgICBwaXBlLAorCQkJCQkgICAgIGRyLAorCQkJCQkgICAgIGRhdGEsCisJCQkJCSAgICAgc2l6ZSwKKwkJCQkJICAgICB0aW1lb3V0KTsKKworCWtmcmVlKGRyKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKaW5kZXggNmZkYWJhOC4uZWQ0YTUwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYworKysgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCkBAIC02Miw4ICs2MiwxMSBAQAogc3RhdGljIHN0cnVjdCB1c2JfZXRoX2RldiB1c2JfZGV2X2lkW10gPSB7CiAjZGVmaW5lCVBFR0FTVVNfREVWKHBuLCB2aWQsIHBpZCwgZmxhZ3MpCVwKIAl7Lm5hbWUgPSBwbiwgLnZlbmRvciA9IHZpZCwgLmRldmljZSA9IHBpZCwgLnByaXZhdGUgPSBmbGFnc30sCisjZGVmaW5lIFBFR0FTVVNfREVWX0NMQVNTKHBuLCB2aWQsIHBpZCwgZGNsYXNzLCBmbGFncykgXAorCVBFR0FTVVNfREVWKHBuLCB2aWQsIHBpZCwgZmxhZ3MpCiAjaW5jbHVkZSAicGVnYXN1cy5oIgogI3VuZGVmCVBFR0FTVVNfREVWCisjdW5kZWYJUEVHQVNVU19ERVZfQ0xBU1MKIAl7TlVMTCwgMCwgMCwgMH0sCiAJe05VTEwsIDAsIDAsIDB9CiB9OwpAQCAtNzEsOCArNzQsMTggQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwZWdhc3VzX2lkc1tdID0gewogI2RlZmluZQlQRUdBU1VTX0RFVihwbiwgdmlkLCBwaWQsIGZsYWdzKSBcCiAJey5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLCAuaWRWZW5kb3IgPSB2aWQsIC5pZFByb2R1Y3QgPSBwaWR9LAorLyoKKyAqIFRoZSBCZWxraW4gRjhUMDEyeHgxIGJsdWV0b290aCBhZGFwdG9yIGhhcyB0aGUgc2FtZSB2ZW5kb3IgYW5kIHByb2R1Y3QKKyAqIElEcyBhcyB0aGUgQmVsa2luIEY1RDUwNTAsIHNvIHdlIG5lZWQgdG8gdGVhY2ggdGhlIHBlZ2FzdXMgZHJpdmVyIHRvCisgKiBpZ25vcmUgYWRhcHRvcnMgYmVsb25naW5nIHRvIHRoZSAiV2lyZWxlc3MiIGNsYXNzIDB4RTAuIEZvciB0aGlzIG9uZQorICogY2FzZSBhbnl3YXksIHNlZWluZyBhcyB0aGUgcGVnYXN1cyBpcyBmb3IgIldpcmVkIiBhZGFwdG9ycy4KKyAqLworI2RlZmluZSBQRUdBU1VTX0RFVl9DTEFTUyhwbiwgdmlkLCBwaWQsIGRjbGFzcywgZmxhZ3MpIFwKKwl7Lm1hdGNoX2ZsYWdzID0gKFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZfQ0xBU1MpLCBcCisJLmlkVmVuZG9yID0gdmlkLCAuaWRQcm9kdWN0ID0gcGlkLCAuYkRldmljZUNsYXNzID0gZGNsYXNzfSwKICNpbmNsdWRlICJwZWdhc3VzLmgiCiAjdW5kZWYJUEVHQVNVU19ERVYKKyN1bmRlZglQRUdBU1VTX0RFVl9DTEFTUwogCXt9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuaCBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmgKaW5kZXggZjk2OGM4My4uNWQwMmYwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuaAorKysgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5oCkBAIC0yMDIsNyArMjAyLDExIEBACiAJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQogUEVHQVNVU19ERVYoICJBbGxpZWQgVGVsZXN5biBJbnQuIEFULVVTQjEwMCIsIFZFTkRPUl9BTExJRURURUwsIDB4YjEwMCwKIAkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCi1QRUdBU1VTX0RFViggIkJlbGtpbiBGNUQ1MDUwIFVTQiBFdGhlcm5ldCIsIFZFTkRPUl9CRUxLSU4sIDB4MDEyMSwKKy8qCisgKiBEaXN0aW5ndWlzaCBiZXR3ZWVuIHRoaXMgQmVsa2luIGFkYXB0b3IgYW5kIHRoZSBCZWxraW4gYmx1ZXRvb3RoIGFkYXB0b3JzCisgKiB3aXRoIHRoZSBzYW1lIHByb2R1Y3QgSURzIGJ5IGNoZWNraW5nIHRoZSBkZXZpY2UgY2xhc3MgdG9vLgorICovCitQRUdBU1VTX0RFVl9DTEFTUyggIkJlbGtpbiBGNUQ1MDUwIFVTQiBFdGhlcm5ldCIsIFZFTkRPUl9CRUxLSU4sIDB4MDEyMSwgMHgwMCwKIAkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCiBQRUdBU1VTX0RFViggIkJpbGxpb250b24gVVNCLTEwMCIsIFZFTkRPUl9CSUxMSU9OVE9OLCAweDA5ODYsCiAJCURFRkFVTFRfR1BJT19SRVNFVCApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivcm5kaXNfaG9zdC5jIGIvZHJpdmVycy9uZXQvdXNiL3JuZGlzX2hvc3QuYwppbmRleCBkMDMyYmJhLi5mNTZkZWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2Ivcm5kaXNfaG9zdC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9ybmRpc19ob3N0LmMKQEAgLTM2MiwxMiArMzYyLDEyIEBACiAJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJZ290byBoYWx0X2ZhaWxfYW5kX3JlbGVhc2U7CiAJCX0KLQkJZGV2LT5oYXJkX210dSA9IHRtcDsKLQkJbmV0LT5tdHUgPSBkZXYtPmhhcmRfbXR1IC0gbmV0LT5oYXJkX2hlYWRlcl9sZW47CiAJCWRldl93YXJuKCZpbnRmLT5kZXYsCiAJCQkgImRldiBjYW4ndCB0YWtlICV1IGJ5dGUgcGFja2V0cyAobWF4ICV1KSwgIgogCQkJICJhZGp1c3RpbmcgTVRVIHRvICV1XG4iLAotCQkJIGRldi0+aGFyZF9tdHUsIHRtcCwgbmV0LT5tdHUpOworCQkJIGRldi0+aGFyZF9tdHUsIHRtcCwgdG1wIC0gbmV0LT5oYXJkX2hlYWRlcl9sZW4pOworCQlkZXYtPmhhcmRfbXR1ID0gdG1wOworCQluZXQtPm10dSA9IGRldi0+aGFyZF9tdHUgLSBuZXQtPmhhcmRfaGVhZGVyX2xlbjsKIAl9CiAKIAkvKiBSRVZJU0lUOiAgcGVyaXBoZXJhbCAiYWxpZ25tZW50IiByZXF1ZXN0IGlzIGlnbm9yZWQgLi4uICovCkBAIC00MTgsNiArNDE4LDcgQEAKIAkJZ290byBoYWx0X2ZhaWxfYW5kX3JlbGVhc2U7CiAJfQogCW1lbWNweShuZXQtPmRldl9hZGRyLCBicCwgRVRIX0FMRU4pOworCW1lbWNweShuZXQtPnBlcm1fYWRkciwgYnAsIEVUSF9BTEVOKTsKIAogCS8qIHNldCBhIG5vbnplcm8gZmlsdGVyIHRvIGVuYWJsZSBkYXRhIHRyYW5zZmVycyAqLwogCW1lbXNldCh1LnNldCwgMCwgc2l6ZW9mICp1LnNldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivc21zYzk1eHguYyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCmluZGV4IDkzOGZiMzUuLmM2YzkyMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogCS5yeF9maXh1cAk9IHNtc2M5NXh4X3J4X2ZpeHVwLAogCS50eF9maXh1cAk9IHNtc2M5NXh4X3R4X2ZpeHVwLAogCS5zdGF0dXMJCT0gc21zYzk1eHhfc3RhdHVzLAotCS5mbGFncwkJPSBGTEFHX0VUSEVSLAorCS5mbGFncwkJPSBGTEFHX0VUSEVSIHwgRkxBR19TRU5EX1pMUCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwcm9kdWN0c1tdID0gewpAQCAtMTIzNywxMCArMTIzNyw3NSBAQAogCQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnNtc2M5NXh4X2luZm8sCiAJfSwKIAl7CisJCS8qIFNNU0M5NTA1IFVTQiBFdGhlcm5ldCBEZXZpY2UgKi8KKwkJVVNCX0RFVklDRSgweDA0MjQsIDB4OTUwNSksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmc21zYzk1eHhfaW5mbywKKwl9LAorCXsKKwkJLyogU01TQzk1MDBBIFVTQiBFdGhlcm5ldCBEZXZpY2UgKi8KKwkJVVNCX0RFVklDRSgweDA0MjQsIDB4OUUwMCksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmc21zYzk1eHhfaW5mbywKKwl9LAorCXsKKwkJLyogU01TQzk1MDVBIFVTQiBFdGhlcm5ldCBEZXZpY2UgKi8KKwkJVVNCX0RFVklDRSgweDA0MjQsIDB4OUUwMSksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmc21zYzk1eHhfaW5mbywKKwl9LAorCXsKIAkJLyogU01TQzk1MTIvOTUxNCBVU0IgSHViICYgRXRoZXJuZXQgRGV2aWNlICovCiAJCVVTQl9ERVZJQ0UoMHgwNDI0LCAweGVjMDApLAogCQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnNtc2M5NXh4X2luZm8sCiAJfSwKKwl7CisJCS8qIFNNU0M5NTAwIFVTQiBFdGhlcm5ldCBEZXZpY2UgKFNBTDEwKSAqLworCQlVU0JfREVWSUNFKDB4MDQyNCwgMHg5OTAwKSwKKwkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZzbXNjOTV4eF9pbmZvLAorCX0sCisJeworCQkvKiBTTVNDOTUwNSBVU0IgRXRoZXJuZXQgRGV2aWNlIChTQUwxMCkgKi8KKwkJVVNCX0RFVklDRSgweDA0MjQsIDB4OTkwMSksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmc21zYzk1eHhfaW5mbywKKwl9LAorCXsKKwkJLyogU01TQzk1MDBBIFVTQiBFdGhlcm5ldCBEZXZpY2UgKFNBTDEwKSAqLworCQlVU0JfREVWSUNFKDB4MDQyNCwgMHg5OTAyKSwKKwkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZzbXNjOTV4eF9pbmZvLAorCX0sCisJeworCQkvKiBTTVNDOTUwNUEgVVNCIEV0aGVybmV0IERldmljZSAoU0FMMTApICovCisJCVVTQl9ERVZJQ0UoMHgwNDI0LCAweDk5MDMpLAorCQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnNtc2M5NXh4X2luZm8sCisJfSwKKwl7CisJCS8qIFNNU0M5NTEyLzk1MTQgVVNCIEh1YiAmIEV0aGVybmV0IERldmljZSAoU0FMMTApICovCisJCVVTQl9ERVZJQ0UoMHgwNDI0LCAweDk5MDQpLAorCQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnNtc2M5NXh4X2luZm8sCisJfSwKKwl7CisJCS8qIFNNU0M5NTAwQSBVU0IgRXRoZXJuZXQgRGV2aWNlIChIQUwpICovCisJCVVTQl9ERVZJQ0UoMHgwNDI0LCAweDk5MDUpLAorCQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnNtc2M5NXh4X2luZm8sCisJfSwKKwl7CisJCS8qIFNNU0M5NTA1QSBVU0IgRXRoZXJuZXQgRGV2aWNlIChIQUwpICovCisJCVVTQl9ERVZJQ0UoMHgwNDI0LCAweDk5MDYpLAorCQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnNtc2M5NXh4X2luZm8sCisJfSwKKwl7CisJCS8qIFNNU0M5NTAwIFVTQiBFdGhlcm5ldCBEZXZpY2UgKEFsdGVybmF0ZSBJRCkgKi8KKwkJVVNCX0RFVklDRSgweDA0MjQsIDB4OTkwNyksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmc21zYzk1eHhfaW5mbywKKwl9LAorCXsKKwkJLyogU01TQzk1MDBBIFVTQiBFdGhlcm5ldCBEZXZpY2UgKEFsdGVybmF0ZSBJRCkgKi8KKwkJVVNCX0RFVklDRSgweDA0MjQsIDB4OTkwOCksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmc21zYzk1eHhfaW5mbywKKwl9LAorCXsKKwkJLyogU01TQzk1MTIvOTUxNCBVU0IgSHViICYgRXRoZXJuZXQgRGV2aWNlIChBbHRlcm5hdGUgSUQpICovCisJCVVTQl9ERVZJQ0UoMHgwNDI0LCAweDk5MDkpLAorCQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJnNtc2M5NXh4X2luZm8sCisJfSwKIAl7IH0sCQkvKiBFTkQgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcHJvZHVjdHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCmluZGV4IDI0YjM2ZjcuLmNhNWNhNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYworKysgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKQEAgLTEwNDksNyArMTA0OSw3IEBACiAJICogTk9URTogIHN0cmljdGx5IGNvbmZvcm1pbmcgY2RjLWV0aGVyIGRldmljZXMgc2hvdWxkIGV4cGVjdAogCSAqIHRoZSBaTFAgaGVyZSwgYnV0IGlnbm9yZSB0aGUgb25lLWJ5dGUgcGFja2V0LgogCSAqLwotCWlmICgobGVuZ3RoICUgZGV2LT5tYXhwYWNrZXQpID09IDApIHsKKwlpZiAoIShpbmZvLT5mbGFncyAmIEZMQUdfU0VORF9aTFApICYmIChsZW5ndGggJSBkZXYtPm1heHBhY2tldCkgPT0gMCkgewogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgrKzsKIAkJaWYgKHNrYl90YWlscm9vbShza2IpKSB7CiAJCQlza2ItPmRhdGFbc2tiLT5sZW5dID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCA1YzQ5OGQyLi4wNTYzMGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC0xLDQgKzEsNCBAQAotLyogQSBzaW1wbGUgbmV0d29yayBkcml2ZXIgdXNpbmcgdmlydGlvLgorLyogQSBuZXR3b3JrIGRyaXZlciB1c2luZyB2aXJ0aW8uCiAgKgogICogQ29weXJpZ2h0IDIwMDcgUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiBJQk0gQ29ycG9yYXRpb24KICAqCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpby5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CkBAIC00OCwxOSArNDcsOSBAQAogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwogCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLQkvKiBUaGUgc2tiIHdlIGNvdWxkbid0IHNlbmQgYmVjYXVzZSBidWZmZXJzIHdlcmUgZnVsbC4gKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqbGFzdF94bWl0X3NrYjsKLQotCS8qIElmIHdlIG5lZWQgdG8gZnJlZSBpbiBhIHRpbWVyLCB0aGlzIGlzIGl0LiAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHhtaXRfZnJlZV90aW1lcjsKLQogCS8qIE51bWJlciBvZiBpbnB1dCBidWZmZXJzLCBhbmQgbWF4IHdlJ3ZlIGV2ZXIgaGFkLiAqLwogCXVuc2lnbmVkIGludCBudW0sIG1heDsKIAotCS8qIEZvciBjbGVhbmluZyB1cCBhZnRlciB0cmFuc21pc3Npb24uICovCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7Ci0JYm9vbCBmcmVlX2luX3Rhc2tsZXQ7Ci0KIAkvKiBJIGxpa2UuLi4gYmlnIHBhY2tldHMgYW5kIEkgY2Fubm90IGxpZSEgKi8KIAlib29sIGJpZ19wYWNrZXRzOwogCkBAIC03OCw5ICs2NywxNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlczsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqc2tiX3ZuZXRfaGRyKHN0cnVjdCBza19idWZmICpza2IpCitzdHJ1Y3Qgc2tiX3ZuZXRfaGRyIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB2aXJ0aW9fbmV0X2hkciBoZHI7CisJCXN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYgbWhkcjsKKwl9OworCXVuc2lnbmVkIGludCBudW1fc2c7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza2Jfdm5ldF9oZHIgKnNrYl92bmV0X2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IHZpcnRpb19uZXRfaGRyICopc2tiLT5jYjsKKwlyZXR1cm4gKHN0cnVjdCBza2Jfdm5ldF9oZHIgKilza2ItPmNiOwogfQogCiBzdGF0aWMgdm9pZCBnaXZlX2FfcGFnZShzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSwgc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0xMTksMTcgKzExNiwxMyBAQAogCiAJLyogV2Ugd2VyZSBwcm9iYWJseSB3YWl0aW5nIGZvciBtb3JlIG91dHB1dCBidWZmZXJzLiAqLwogCW5ldGlmX3dha2VfcXVldWUodmktPmRldik7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgcmUteG1pdCBsYXN0X3htaXRfc2tiOiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwYWNrZXRzCi0JICogcXVldWVkLCBzdGFydF94bWl0IHdvbid0IGJlIGNhbGxlZC4gKi8KLQl0YXNrbGV0X3NjaGVkdWxlKCZ2aS0+dGFza2xldCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlY2VpdmVfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQl1bnNpZ25lZCBsZW4pCiB7CiAJc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCB2aXJ0aW9fbmV0X2hkciAqaGRyID0gc2tiX3ZuZXRfaGRyKHNrYik7CisJc3RydWN0IHNrYl92bmV0X2hkciAqaGRyID0gc2tiX3ZuZXRfaGRyKHNrYik7CiAJaW50IGVycjsKIAlpbnQgaTsKIApAQCAtMTQwLDcgKzEzMyw2IEBACiAJfQogCiAJaWYgKHZpLT5tZXJnZWFibGVfcnhfYnVmcykgewotCQlzdHJ1Y3QgdmlydGlvX25ldF9oZHJfbXJnX3J4YnVmICptaGRyID0gc2tiX3ZuZXRfaGRyKHNrYik7CiAJCXVuc2lnbmVkIGludCBjb3B5OwogCQljaGFyICpwID0gcGFnZV9hZGRyZXNzKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbMF0ucGFnZSk7CiAKQEAgLTE0OCw4ICsxNDAsOCBAQAogCQkJbGVuID0gUEFHRV9TSVpFOwogCQlsZW4gLT0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYpOwogCi0JCW1lbWNweShoZHIsIHAsIHNpemVvZigqbWhkcikpOwotCQlwICs9IHNpemVvZigqbWhkcik7CisJCW1lbWNweSgmaGRyLT5taGRyLCBwLCBzaXplb2YoaGRyLT5taGRyKSk7CisJCXAgKz0gc2l6ZW9mKGhkci0+bWhkcik7CiAKIAkJY29weSA9IGxlbjsKIAkJaWYgKGNvcHkgPiBza2JfdGFpbHJvb20oc2tiKSkKQEAgLTE2NCwxMyArMTU2LDEzIEBACiAJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLS07CiAJCX0gZWxzZSB7CiAJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ICs9Ci0JCQkJc2l6ZW9mKCptaGRyKSArIGNvcHk7CisJCQkJc2l6ZW9mKGhkci0+bWhkcikgKyBjb3B5OwogCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5zaXplID0gbGVuOwogCQkJc2tiLT5kYXRhX2xlbiArPSBsZW47CiAJCQlza2ItPmxlbiArPSBsZW47CiAJCX0KIAotCQl3aGlsZSAoLS1taGRyLT5udW1fYnVmZmVycykgeworCQl3aGlsZSAoLS1oZHItPm1oZHIubnVtX2J1ZmZlcnMpIHsKIAkJCXN0cnVjdCBza19idWZmICpuc2tiOwogCiAJCQlpID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKQEAgLTE4NCw3ICsxNzYsNyBAQAogCQkJbnNrYiA9IHZpLT5ydnEtPnZxX29wcy0+Z2V0X2J1Zih2aS0+cnZxLCAmbGVuKTsKIAkJCWlmICghbnNrYikgewogCQkJCXByX2RlYnVnKCIlczogcnggZXJyb3I6ICVkIGJ1ZmZlcnMgbWlzc2luZ1xuIiwKLQkJCQkJIGRldi0+bmFtZSwgbWhkci0+bnVtX2J1ZmZlcnMpOworCQkJCQkgZGV2LT5uYW1lLCBoZHItPm1oZHIubnVtX2J1ZmZlcnMpOwogCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJCWdvdG8gZHJvcDsKIAkJCX0KQEAgLTIwNSw3ICsxOTcsNyBAQAogCQkJc2tiLT5sZW4gKz0gbGVuOwogCQl9CiAJfSBlbHNlIHsKLQkJbGVuIC09IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHIpOworCQlsZW4gLT0gc2l6ZW9mKGhkci0+aGRyKTsKIAogCQlpZiAobGVuIDw9IE1BWF9QQUNLRVRfTEVOKQogCQkJdHJpbV9wYWdlcyh2aSwgc2tiKTsKQEAgLTIyMyw5ICsyMTUsMTEgQEAKIAlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCi0JaWYgKGhkci0+ZmxhZ3MgJiBWSVJUSU9fTkVUX0hEUl9GX05FRURTX0NTVU0pIHsKKwlpZiAoaGRyLT5oZHIuZmxhZ3MgJiBWSVJUSU9fTkVUX0hEUl9GX05FRURTX0NTVU0pIHsKIAkJcHJfZGVidWcoIk5lZWRzIGNzdW0hXG4iKTsKLQkJaWYgKCFza2JfcGFydGlhbF9jc3VtX3NldChza2IsaGRyLT5jc3VtX3N0YXJ0LGhkci0+Y3N1bV9vZmZzZXQpKQorCQlpZiAoIXNrYl9wYXJ0aWFsX2NzdW1fc2V0KHNrYiwKKwkJCQkJICBoZHItPmhkci5jc3VtX3N0YXJ0LAorCQkJCQkgIGhkci0+aGRyLmNzdW1fb2Zmc2V0KSkKIAkJCWdvdG8gZnJhbWVfZXJyOwogCX0KIApAQCAtMjMzLDkgKzIyNyw5IEBACiAJcHJfZGVidWcoIlJlY2VpdmluZyBza2IgcHJvdG8gMHglMDR4IGxlbiAlaSB0eXBlICVpXG4iLAogCQkgbnRvaHMoc2tiLT5wcm90b2NvbCksIHNrYi0+bGVuLCBza2ItPnBrdF90eXBlKTsKIAotCWlmIChoZHItPmdzb190eXBlICE9IFZJUlRJT19ORVRfSERSX0dTT19OT05FKSB7CisJaWYgKGhkci0+aGRyLmdzb190eXBlICE9IFZJUlRJT19ORVRfSERSX0dTT19OT05FKSB7CiAJCXByX2RlYnVnKCJHU08hXG4iKTsKLQkJc3dpdGNoIChoZHItPmdzb190eXBlICYgflZJUlRJT19ORVRfSERSX0dTT19FQ04pIHsKKwkJc3dpdGNoIChoZHItPmhkci5nc29fdHlwZSAmIH5WSVJUSU9fTkVUX0hEUl9HU09fRUNOKSB7CiAJCWNhc2UgVklSVElPX05FVF9IRFJfR1NPX1RDUFY0OgogCQkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVENQVjQ7CiAJCQlicmVhazsKQEAgLTI0OCwxNCArMjQyLDE0IEBACiAJCWRlZmF1bHQ6CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBiYWQgZ3NvIHR5cGUgJXUuXG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUsIGhkci0+Z3NvX3R5cGUpOworCQkJCSAgICAgICBkZXYtPm5hbWUsIGhkci0+aGRyLmdzb190eXBlKTsKIAkJCWdvdG8gZnJhbWVfZXJyOwogCQl9CiAKLQkJaWYgKGhkci0+Z3NvX3R5cGUgJiBWSVJUSU9fTkVUX0hEUl9HU09fRUNOKQorCQlpZiAoaGRyLT5oZHIuZ3NvX3R5cGUgJiBWSVJUSU9fTkVUX0hEUl9HU09fRUNOKQogCQkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSB8PSBTS0JfR1NPX1RDUF9FQ047CiAKLQkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IGhkci0+Z3NvX3NpemU7CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSBoZHItPmhkci5nc29fc2l6ZTsKIAkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPT0gMCkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogemVybyBnc28gc2l6ZS5cbiIsCkBAIC0yODUsOCArMjc5LDggQEAKIAlib29sIG9vbSA9IGZhbHNlOwogCiAJc2dfaW5pdF90YWJsZShzZywgMitNQVhfU0tCX0ZSQUdTKTsKLQlmb3IgKDs7KSB7Ci0JCXN0cnVjdCB2aXJ0aW9fbmV0X2hkciAqaGRyOworCWRvIHsKKwkJc3RydWN0IHNrYl92bmV0X2hkciAqaGRyOwogCiAJCXNrYiA9IG5ldGRldl9hbGxvY19za2IodmktPmRldiwgTUFYX1BBQ0tFVF9MRU4gKyBORVRfSVBfQUxJR04pOwogCQlpZiAodW5saWtlbHkoIXNrYikpIHsKQEAgLTI5OCw3ICsyOTIsNyBAQAogCQlza2JfcHV0KHNrYiwgTUFYX1BBQ0tFVF9MRU4pOwogCiAJCWhkciA9IHNrYl92bmV0X2hkcihza2IpOwotCQlzZ19zZXRfYnVmKHNnLCBoZHIsIHNpemVvZigqaGRyKSk7CisJCXNnX3NldF9idWYoc2csICZoZHItPmhkciwgc2l6ZW9mKGhkci0+aGRyKSk7CiAKIAkJaWYgKHZpLT5iaWdfcGFja2V0cykgewogCQkJZm9yIChpID0gMDsgaSA8IE1BWF9TS0JfRlJBR1M7IGkrKykgewpAQCAtMzI4LDcgKzMyMiw3IEBACiAJCQlicmVhazsKIAkJfQogCQl2aS0+bnVtKys7Ci0JfQorCX0gd2hpbGUgKGVyciA+PSBudW0pOwogCWlmICh1bmxpa2VseSh2aS0+bnVtID4gdmktPm1heCkpCiAJCXZpLT5tYXggPSB2aS0+bnVtOwogCXZpLT5ydnEtPnZxX29wcy0+a2ljayh2aS0+cnZxKTsKQEAgLTM0Niw3ICszNDAsNyBAQAogCWlmICghdmktPm1lcmdlYWJsZV9yeF9idWZzKQogCQlyZXR1cm4gdHJ5X2ZpbGxfcmVjdl9tYXhidWZzKHZpLCBnZnApOwogCi0JZm9yICg7OykgeworCWRvIHsKIAkJc2tiX2ZyYWdfdCAqZjsKIAogCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHZpLT5kZXYsIEdPT0RfQ09QWV9MRU4gKyBORVRfSVBfQUxJR04pOwpAQCAtMzgwLDcgKzM3NCw3IEBACiAJCQlicmVhazsKIAkJfQogCQl2aS0+bnVtKys7Ci0JfQorCX0gd2hpbGUgKGVyciA+IDApOwogCWlmICh1bmxpa2VseSh2aS0+bnVtID4gdmktPm1heCkpCiAJCXZpLT5tYXggPSB2aS0+bnVtOwogCXZpLT5ydnEtPnZxX29wcy0+a2ljayh2aS0+cnZxKTsKQEAgLTQ0OCw0MiArNDQyLDI2IEBACiAJcmV0dXJuIHJlY2VpdmVkOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX29sZF94bWl0X3NrYnMoc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkpCitzdGF0aWMgdW5zaWduZWQgaW50IGZyZWVfb2xkX3htaXRfc2ticyhzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgaW50IGxlbiwgdG90X3NncyA9IDA7CiAKIAl3aGlsZSAoKHNrYiA9IHZpLT5zdnEtPnZxX29wcy0+Z2V0X2J1Zih2aS0+c3ZxLCAmbGVuKSkgIT0gTlVMTCkgewogCQlwcl9kZWJ1ZygiU2VudCBza2IgJXBcbiIsIHNrYik7CiAJCV9fc2tiX3VubGluayhza2IsICZ2aS0+c2VuZCk7CiAJCXZpLT5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCQl2aS0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWtmcmVlX3NrYihza2IpOworCQl0b3Rfc2dzICs9IHNrYl92bmV0X2hkcihza2IpLT5udW1fc2c7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQotfQotCi0vKiBJZiB0aGUgdmlydGlvIHRyYW5zcG9ydCBkb2Vzbid0IGFsd2F5cyBub3RpZnkgdXMgd2hlbiBhbGwgaW4tZmxpZ2h0IHBhY2tldHMKLSAqIGFyZSBjb25zdW1lZCwgd2UgZmFsbCBiYWNrIHRvIHVzaW5nIHRoaXMgZnVuY3Rpb24gb24gYSB0aW1lciB0byBmcmVlIHRoZW0uICovCi1zdGF0aWMgdm9pZCB4bWl0X2ZyZWUodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gKHZvaWQgKilkYXRhOwotCi0JbmV0aWZfdHhfbG9jayh2aS0+ZGV2KTsKLQotCWZyZWVfb2xkX3htaXRfc2ticyh2aSk7Ci0KLQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdmktPnNlbmQpKQotCQltb2RfdGltZXIoJnZpLT54bWl0X2ZyZWVfdGltZXIsIGppZmZpZXMgKyAoSFovMTApKTsKLQotCW5ldGlmX3R4X3VubG9jayh2aS0+ZGV2KTsKKwlyZXR1cm4gdG90X3NnczsKIH0KIAogc3RhdGljIGludCB4bWl0X3NrYihzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgbnVtLCBlcnI7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzIrTUFYX1NLQl9GUkFHU107Ci0Jc3RydWN0IHZpcnRpb19uZXRfaGRyX21yZ19yeGJ1ZiAqbWhkciA9IHNrYl92bmV0X2hkcihza2IpOwotCXN0cnVjdCB2aXJ0aW9fbmV0X2hkciAqaGRyID0gc2tiX3ZuZXRfaGRyKHNrYik7CisJc3RydWN0IHNrYl92bmV0X2hkciAqaGRyID0gc2tiX3ZuZXRfaGRyKHNrYik7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCA9ICgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfZGVzdDsKIAogCXNnX2luaXRfdGFibGUoc2csIDIrTUFYX1NLQl9GUkFHUyk7CkBAIC00OTEsMTA4ICs0NjksOTcgQEAKIAlwcl9kZWJ1ZygiJXM6IHhtaXQgJXAgJXBNXG4iLCB2aS0+ZGV2LT5uYW1lLCBza2IsIGRlc3QpOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJaGRyLT5mbGFncyA9IFZJUlRJT19ORVRfSERSX0ZfTkVFRFNfQ1NVTTsKLQkJaGRyLT5jc3VtX3N0YXJ0ID0gc2tiLT5jc3VtX3N0YXJ0IC0gc2tiX2hlYWRyb29tKHNrYik7Ci0JCWhkci0+Y3N1bV9vZmZzZXQgPSBza2ItPmNzdW1fb2Zmc2V0OworCQloZHItPmhkci5mbGFncyA9IFZJUlRJT19ORVRfSERSX0ZfTkVFRFNfQ1NVTTsKKwkJaGRyLT5oZHIuY3N1bV9zdGFydCA9IHNrYi0+Y3N1bV9zdGFydCAtIHNrYl9oZWFkcm9vbShza2IpOworCQloZHItPmhkci5jc3VtX29mZnNldCA9IHNrYi0+Y3N1bV9vZmZzZXQ7CiAJfSBlbHNlIHsKLQkJaGRyLT5mbGFncyA9IDA7Ci0JCWhkci0+Y3N1bV9vZmZzZXQgPSBoZHItPmNzdW1fc3RhcnQgPSAwOworCQloZHItPmhkci5mbGFncyA9IDA7CisJCWhkci0+aGRyLmNzdW1fb2Zmc2V0ID0gaGRyLT5oZHIuY3N1bV9zdGFydCA9IDA7CiAJfQogCiAJaWYgKHNrYl9pc19nc28oc2tiKSkgewotCQloZHItPmhkcl9sZW4gPSBza2JfaGVhZGxlbihza2IpOwotCQloZHItPmdzb19zaXplID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwkJaGRyLT5oZHIuaGRyX2xlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJCWhkci0+aGRyLmdzb19zaXplID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY0KQotCQkJaGRyLT5nc29fdHlwZSA9IFZJUlRJT19ORVRfSERSX0dTT19UQ1BWNDsKKwkJCWhkci0+aGRyLmdzb190eXBlID0gVklSVElPX05FVF9IRFJfR1NPX1RDUFY0OwogCQllbHNlIGlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19UQ1BWNikKLQkJCWhkci0+Z3NvX3R5cGUgPSBWSVJUSU9fTkVUX0hEUl9HU09fVENQVjY7CisJCQloZHItPmhkci5nc29fdHlwZSA9IFZJUlRJT19ORVRfSERSX0dTT19UQ1BWNjsKIAkJZWxzZSBpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVURQKQotCQkJaGRyLT5nc29fdHlwZSA9IFZJUlRJT19ORVRfSERSX0dTT19VRFA7CisJCQloZHItPmhkci5nc29fdHlwZSA9IFZJUlRJT19ORVRfSERSX0dTT19VRFA7CiAJCWVsc2UKIAkJCUJVRygpOwogCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVENQX0VDTikKLQkJCWhkci0+Z3NvX3R5cGUgfD0gVklSVElPX05FVF9IRFJfR1NPX0VDTjsKKwkJCWhkci0+aGRyLmdzb190eXBlIHw9IFZJUlRJT19ORVRfSERSX0dTT19FQ047CiAJfSBlbHNlIHsKLQkJaGRyLT5nc29fdHlwZSA9IFZJUlRJT19ORVRfSERSX0dTT19OT05FOwotCQloZHItPmdzb19zaXplID0gaGRyLT5oZHJfbGVuID0gMDsKKwkJaGRyLT5oZHIuZ3NvX3R5cGUgPSBWSVJUSU9fTkVUX0hEUl9HU09fTk9ORTsKKwkJaGRyLT5oZHIuZ3NvX3NpemUgPSBoZHItPmhkci5oZHJfbGVuID0gMDsKIAl9CiAKLQltaGRyLT5udW1fYnVmZmVycyA9IDA7CisJaGRyLT5taGRyLm51bV9idWZmZXJzID0gMDsKIAogCS8qIEVuY29kZSBtZXRhZGF0YSBoZWFkZXIgYXQgZnJvbnQuICovCiAJaWYgKHZpLT5tZXJnZWFibGVfcnhfYnVmcykKLQkJc2dfc2V0X2J1ZihzZywgbWhkciwgc2l6ZW9mKCptaGRyKSk7CisJCXNnX3NldF9idWYoc2csICZoZHItPm1oZHIsIHNpemVvZihoZHItPm1oZHIpKTsKIAllbHNlCi0JCXNnX3NldF9idWYoc2csIGhkciwgc2l6ZW9mKCpoZHIpKTsKKwkJc2dfc2V0X2J1ZihzZywgJmhkci0+aGRyLCBzaXplb2YoaGRyLT5oZHIpKTsKIAotCW51bSA9IHNrYl90b19zZ3ZlYyhza2IsIHNnKzEsIDAsIHNrYi0+bGVuKSArIDE7Ci0KLQllcnIgPSB2aS0+c3ZxLT52cV9vcHMtPmFkZF9idWYodmktPnN2cSwgc2csIG51bSwgMCwgc2tiKTsKLQlpZiAoZXJyID49IDAgJiYgIXZpLT5mcmVlX2luX3Rhc2tsZXQpCi0JCW1vZF90aW1lcigmdmktPnhtaXRfZnJlZV90aW1lciwgamlmZmllcyArIChIWi8xMCkpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgeG1pdF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9ICh2b2lkICopZGF0YTsKLQotCW5ldGlmX3R4X2xvY2tfYmgodmktPmRldik7Ci0JaWYgKHZpLT5sYXN0X3htaXRfc2tiICYmIHhtaXRfc2tiKHZpLCB2aS0+bGFzdF94bWl0X3NrYikgPj0gMCkgewotCQl2aS0+c3ZxLT52cV9vcHMtPmtpY2sodmktPnN2cSk7Ci0JCXZpLT5sYXN0X3htaXRfc2tiID0gTlVMTDsKLQl9Ci0JaWYgKHZpLT5mcmVlX2luX3Rhc2tsZXQpCi0JCWZyZWVfb2xkX3htaXRfc2ticyh2aSk7Ci0JbmV0aWZfdHhfdW5sb2NrX2JoKHZpLT5kZXYpOworCWhkci0+bnVtX3NnID0gc2tiX3RvX3NndmVjKHNrYiwgc2crMSwgMCwgc2tiLT5sZW4pICsgMTsKKwlyZXR1cm4gdmktPnN2cS0+dnFfb3BzLT5hZGRfYnVmKHZpLT5zdnEsIHNnLCBoZHItPm51bV9zZywgMCwgc2tiKTsKIH0KIAogc3RhdGljIG5ldGRldl90eF90IHN0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNhcGFjaXR5OwogCiBhZ2FpbjoKIAkvKiBGcmVlIHVwIGFueSBwZW5kaW5nIG9sZCBidWZmZXJzIGJlZm9yZSBxdWV1ZWluZyBuZXcgb25lcy4gKi8KIAlmcmVlX29sZF94bWl0X3NrYnModmkpOwogCi0JLyogSWYgd2UgaGFzIGEgYnVmZmVyIGxlZnQgb3ZlciBmcm9tIGxhc3QgdGltZSwgc2VuZCBpdCBub3cuICovCi0JaWYgKHVubGlrZWx5KHZpLT5sYXN0X3htaXRfc2tiKSAmJgotCSAgICB4bWl0X3NrYih2aSwgdmktPmxhc3RfeG1pdF9za2IpIDwgMCkKLQkJZ290byBzdG9wX3F1ZXVlOworCS8qIFRyeSB0byB0cmFuc21pdCAqLworCWNhcGFjaXR5ID0geG1pdF9za2IodmksIHNrYik7CiAKLQl2aS0+bGFzdF94bWl0X3NrYiA9IE5VTEw7CisJLyogVGhpcyBjYW4gaGFwcGVuIHdpdGggT09NIGFuZCBpbmRpcmVjdCBidWZmZXJzLiAqLworCWlmICh1bmxpa2VseShjYXBhY2l0eSA8IDApKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiVW5leHBlY3RlZCBmdWxsIHF1ZXVlXG4iKTsKKwkJaWYgKHVubGlrZWx5KCF2aS0+c3ZxLT52cV9vcHMtPmVuYWJsZV9jYih2aS0+c3ZxKSkpIHsKKwkJCXZpLT5zdnEtPnZxX29wcy0+ZGlzYWJsZV9jYih2aS0+c3ZxKTsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQlnb3RvIGFnYWluOworCQl9CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisJdmktPnN2cS0+dnFfb3BzLT5raWNrKHZpLT5zdnEpOwogCi0JLyogUHV0IG5ldyBvbmUgaW4gc2VuZCBxdWV1ZSBhbmQgZG8gdHJhbnNtaXQgKi8KLQlpZiAobGlrZWx5KHNrYikpIHsKLQkJX19za2JfcXVldWVfaGVhZCgmdmktPnNlbmQsIHNrYik7Ci0JCWlmICh4bWl0X3NrYih2aSwgc2tiKSA8IDApIHsKLQkJCXZpLT5sYXN0X3htaXRfc2tiID0gc2tiOwotCQkJc2tiID0gTlVMTDsKLQkJCWdvdG8gc3RvcF9xdWV1ZTsKKwkvKgorCSAqIFB1dCBuZXcgb25lIGluIHNlbmQgcXVldWUuICBZb3UnZCBleHBlY3Qgd2UnZCBuZWVkIHRoaXMgYmVmb3JlCisJICogeG1pdF9za2IgY2FsbHMgYWRkX2J1ZigpLCBzaW5jZSB0aGUgY2FsbGJhY2sgY2FuIGJlIHRyaWdnZXJlZAorCSAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoYXQuICBCdXQgc2luY2UgdGhlIGNhbGxiYWNrIGp1c3QgdHJpZ2dlcnMKKwkgKiBhbm90aGVyIGNhbGwgYmFjayBoZXJlLCBub3JtYWwgbmV0d29yayB4bWl0IGxvY2tpbmcgcHJldmVudHMgdGhlCisJICogcmFjZS4KKwkgKi8KKwlfX3NrYl9xdWV1ZV9oZWFkKCZ2aS0+c2VuZCwgc2tiKTsKKworCS8qIERvbid0IHdhaXQgdXAgZm9yIHRyYW5zbWl0dGVkIHNrYnMgdG8gYmUgZnJlZWQuICovCisJc2tiX29ycGhhbihza2IpOworCW5mX3Jlc2V0KHNrYik7CisKKwkvKiBBcHBhcmVudGx5IG5pY2UgZ2lybHMgZG9uJ3QgcmV0dXJuIFRYX0JVU1k7IHN0b3AgdGhlIHF1ZXVlCisJICogYmVmb3JlIGl0IGdldHMgb3V0IG9mIGhhbmQuICBOYXR1cmFsbHksIHRoaXMgd2FzdGVzIGVudHJpZXMuICovCisJaWYgKGNhcGFjaXR5IDwgMitNQVhfU0tCX0ZSQUdTKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJaWYgKHVubGlrZWx5KCF2aS0+c3ZxLT52cV9vcHMtPmVuYWJsZV9jYih2aS0+c3ZxKSkpIHsKKwkJCS8qIE1vcmUganVzdCBnb3QgdXNlZCwgZnJlZSB0aGVtIHRoZW4gcmVjaGVjay4gKi8KKwkJCWNhcGFjaXR5ICs9IGZyZWVfb2xkX3htaXRfc2ticyh2aSk7CisJCQlpZiAoY2FwYWNpdHkgPj0gMitNQVhfU0tCX0ZSQUdTKSB7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCQl2aS0+c3ZxLT52cV9vcHMtPmRpc2FibGVfY2IodmktPnN2cSk7CisJCQl9CiAJCX0KIAl9Ci1kb25lOgotCXZpLT5zdnEtPnZxX29wcy0+a2ljayh2aS0+c3ZxKTsKKwogCXJldHVybiBORVRERVZfVFhfT0s7Ci0KLXN0b3BfcXVldWU6Ci0JcHJfZGVidWcoIiVzOiB2aXJ0aW8gbm90IHByZXBhcmVkIHRvIHNlbmRcbiIsIGRldi0+bmFtZSk7Ci0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCi0JLyogQWN0aXZhdGUgY2FsbGJhY2sgZm9yIHVzaW5nIHNrYnM6IGlmIHRoaXMgcmV0dXJucyBmYWxzZSBpdAotCSAqIG1lYW5zIHNvbWUgd2VyZSB1c2VkIGluIHRoZSBtZWFudGltZS4gKi8KLQlpZiAodW5saWtlbHkoIXZpLT5zdnEtPnZxX29wcy0+ZW5hYmxlX2NiKHZpLT5zdnEpKSkgewotCQl2aS0+c3ZxLT52cV9vcHMtPmRpc2FibGVfY2IodmktPnN2cSk7Ci0JCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCWlmIChza2IpIHsKLQkJLyogRHJvcCB0aGlzIHNrYjogd2Ugb25seSBxdWV1ZSBvbmUuICovCi0JCXZpLT5kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JfQotCWdvdG8gZG9uZTsKIH0KIAogc3RhdGljIGludCB2aXJ0bmV0X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQpAQCAtOTI1LDEwICs4OTIsNiBAQAogCXZpLT5wYWdlcyA9IE5VTEw7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnZpLT5yZWZpbGwsIHJlZmlsbF93b3JrKTsKIAotCS8qIElmIHRoZXkgZ2l2ZSB1cyBhIGNhbGxiYWNrIHdoZW4gYWxsIGJ1ZmZlcnMgYXJlIGRvbmUsIHdlIGRvbid0IG5lZWQKLQkgKiB0aGUgdGltZXIuICovCi0JdmktPmZyZWVfaW5fdGFza2xldCA9IHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LFZJUlRJT19GX05PVElGWV9PTl9FTVBUWSk7Ci0KIAkvKiBJZiB3ZSBjYW4gcmVjZWl2ZSBBTlkgR1NPIHBhY2tldHMsIHdlIG11c3QgYWxsb2NhdGUgbGFyZ2Ugb25lcy4gKi8KIAlpZiAodmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19ORVRfRl9HVUVTVF9UU080KQogCSAgICB8fCB2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX05FVF9GX0dVRVNUX1RTTzYpCkBAIC05NjAsMTEgKzkyMyw2IEBACiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdmktPnJlY3YpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnZpLT5zZW5kKTsKIAotCXRhc2tsZXRfaW5pdCgmdmktPnRhc2tsZXQsIHhtaXRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpdmkpOwotCi0JaWYgKCF2aS0+ZnJlZV9pbl90YXNrbGV0KQotCQlzZXR1cF90aW1lcigmdmktPnhtaXRfZnJlZV90aW1lciwgeG1pdF9mcmVlLCAodW5zaWduZWQgbG9uZyl2aSk7Ci0KIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByX2RlYnVnKCJ2aXJ0aW9fbmV0OiByZWdpc3RlcmluZyBkZXZpY2UgZmFpbGVkXG4iKTsKQEAgLTk5Nyw3ICs5NTUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHZpcnRuZXRfcmVtb3ZlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQorc3RhdGljIHZvaWQgX19kZXZleGl0IHZpcnRuZXRfcmVtb3ZlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQogewogCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gdmRldi0+cHJpdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTAwNSw5ICs5NjMsNiBAQAogCS8qIFN0b3AgYWxsIHRoZSB2aXJ0cXVldWVzLiAqLwogCXZkZXYtPmNvbmZpZy0+cmVzZXQodmRldik7CiAKLQlpZiAoIXZpLT5mcmVlX2luX3Rhc2tsZXQpCi0JCWRlbF90aW1lcl9zeW5jKCZ2aS0+eG1pdF9mcmVlX3RpbWVyKTsKLQogCS8qIEZyZWUgb3VyIHNrYnMgaW4gc2VuZCBhbmQgcmVjdiBxdWV1ZXMsIGlmIGFueS4gKi8KIAl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnZpLT5yZWN2KSkgIT0gTlVMTCkgewogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTEwNDEsNyArOTk2LDYgQEAKIAlWSVJUSU9fTkVUX0ZfR1VFU1RfRUNOLCBWSVJUSU9fTkVUX0ZfR1VFU1RfVUZPLAogCVZJUlRJT19ORVRfRl9NUkdfUlhCVUYsIFZJUlRJT19ORVRfRl9TVEFUVVMsIFZJUlRJT19ORVRfRl9DVFJMX1ZRLAogCVZJUlRJT19ORVRfRl9DVFJMX1JYLCBWSVJUSU9fTkVUX0ZfQ1RSTF9WTEFOLAotCVZJUlRJT19GX05PVElGWV9PTl9FTVBUWSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlydGlvX2RyaXZlciB2aXJ0aW9fbmV0ID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZjUwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTGludXggZHJpdmVyIGZvciBWTXdhcmUncyB2bXhuZXQzIGV0aGVybmV0IE5JQy4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDksIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UgYW5kIG5vIGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyMgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyMgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorIyB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgorIworIyBNYWludGFpbmVkIGJ5OiBTaHJleWFzIEJoYXRld2FyYSA8cHYtZHJpdmVyc0B2bXdhcmUuY29tPgorIworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIworIyBNYWtlZmlsZSBmb3IgdGhlIFZNd2FyZSB2bXhuZXQzIGV0aGVybmV0IE5JQyBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX1ZNWE5FVDMpICs9IHZteG5ldDMubworCit2bXhuZXQzLW9ianMgOj0gdm14bmV0M19kcnYubyB2bXhuZXQzX2V0aHRvb2wubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My91cHQxX2RlZnMuaCBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdXB0MV9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxMDhmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdXB0MV9kZWZzLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpbnV4IGRyaXZlciBmb3IgVk13YXJlJ3Mgdm14bmV0MyBldGhlcm5ldCBOSUMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDksIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlIGFuZCBubyBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogTWFpbnRhaW5lZCBieTogU2hyZXlhcyBCaGF0ZXdhcmEgPHB2LWRyaXZlcnNAdm13YXJlLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfVVBUMV9ERUZTX0gKKyNkZWZpbmUgX1VQVDFfREVGU19ICisKK3N0cnVjdCBVUFQxX1R4U3RhdHMgeworCXU2NAkJCVRTT1BrdHNUeE9LOyAgLyogVFNPIHBrdHMgcG9zdC1zZWdtZW50YXRpb24gKi8KKwl1NjQJCQlUU09CeXRlc1R4T0s7CisJdTY0CQkJdWNhc3RQa3RzVHhPSzsKKwl1NjQJCQl1Y2FzdEJ5dGVzVHhPSzsKKwl1NjQJCQltY2FzdFBrdHNUeE9LOworCXU2NAkJCW1jYXN0Qnl0ZXNUeE9LOworCXU2NAkJCWJjYXN0UGt0c1R4T0s7CisJdTY0CQkJYmNhc3RCeXRlc1R4T0s7CisJdTY0CQkJcGt0c1R4RXJyb3I7CisJdTY0CQkJcGt0c1R4RGlzY2FyZDsKK307CisKK3N0cnVjdCBVUFQxX1J4U3RhdHMgeworCXU2NAkJCUxST1BrdHNSeE9LOyAgICAvKiBMUk8gcGt0cyAqLworCXU2NAkJCUxST0J5dGVzUnhPSzsgICAvKiBieXRlcyBmcm9tIExSTyBwa3RzICovCisJLyogdGhlIGZvbGxvd2luZyBjb3VudGVycyBhcmUgZm9yIHBrdHMgZnJvbSB0aGUgd2lyZSwgaS5lLiwgcHJlLUxSTyAqLworCXU2NAkJCXVjYXN0UGt0c1J4T0s7CisJdTY0CQkJdWNhc3RCeXRlc1J4T0s7CisJdTY0CQkJbWNhc3RQa3RzUnhPSzsKKwl1NjQJCQltY2FzdEJ5dGVzUnhPSzsKKwl1NjQJCQliY2FzdFBrdHNSeE9LOworCXU2NAkJCWJjYXN0Qnl0ZXNSeE9LOworCXU2NAkJCXBrdHNSeE91dE9mQnVmOworCXU2NAkJCXBrdHNSeEVycm9yOworfTsKKworLyogaW50ZXJydXB0IG1vZGVyYXRpb24gbGV2ZWwgKi8KK2VudW0geworCVVQVDFfSU1MX05PTkUJCT0gMCwgLyogbm8gaW50ZXJydXB0IG1vZGVyYXRpb24gKi8KKwlVUFQxX0lNTF9ISUdIRVNUCT0gNywgLyogbGVhc3QgaW50ciBnZW5lcmF0ZWQgKi8KKwlVUFQxX0lNTF9BREFQVElWRQk9IDgsIC8qIGFkcGF0aXZlIGludHIgbW9kZXJhdGlvbiAqLworfTsKKy8qIHZhbHVlcyBmb3IgVVBUMV9SU1NDb25mLmhhc2hGdW5jICovCitlbnVtIHsKKwlVUFQxX1JTU19IQVNIX1RZUEVfTk9ORSAgICAgID0gMHgwLAorCVVQVDFfUlNTX0hBU0hfVFlQRV9JUFY0ICAgICAgPSAweDAxLAorCVVQVDFfUlNTX0hBU0hfVFlQRV9UQ1BfSVBWNCAgPSAweDAyLAorCVVQVDFfUlNTX0hBU0hfVFlQRV9JUFY2ICAgICAgPSAweDA0LAorCVVQVDFfUlNTX0hBU0hfVFlQRV9UQ1BfSVBWNiAgPSAweDA4LAorfTsKKworZW51bSB7CisJVVBUMV9SU1NfSEFTSF9GVU5DX05PTkUgICAgICA9IDB4MCwKKwlVUFQxX1JTU19IQVNIX0ZVTkNfVE9FUExJVFogID0gMHgwMSwKK307CisKKyNkZWZpbmUgVVBUMV9SU1NfTUFYX0tFWV9TSVpFICAgICAgICA0MAorI2RlZmluZSBVUFQxX1JTU19NQVhfSU5EX1RBQkxFX1NJWkUgIDEyOAorCitzdHJ1Y3QgVVBUMV9SU1NDb25mIHsKKwl1MTYJCQloYXNoVHlwZTsKKwl1MTYJCQloYXNoRnVuYzsKKwl1MTYJCQloYXNoS2V5U2l6ZTsKKwl1MTYJCQlpbmRUYWJsZVNpemU7CisJdTgJCQloYXNoS2V5W1VQVDFfUlNTX01BWF9LRVlfU0laRV07CisJdTgJCQlpbmRUYWJsZVtVUFQxX1JTU19NQVhfSU5EX1RBQkxFX1NJWkVdOworfTsKKworLyogZmVhdHVyZXMgKi8KK2VudW0geworCVVQVDFfRl9SWENTVU0JCT0gMHgwMDAxLCAgIC8qIHJ4IGNzdW0gdmVyaWZpY2F0aW9uICovCisJVVBUMV9GX1JTUwkJPSAweDAwMDIsCisJVVBUMV9GX1JYVkxBTgkJPSAweDAwMDQsICAgLyogVkxBTiB0YWcgc3RyaXBwaW5nICovCisJVVBUMV9GX0xSTwkJPSAweDAwMDgsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZGVmcy5oIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzhlZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2RlZnMuaApAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqIExpbnV4IGRyaXZlciBmb3IgVk13YXJlJ3Mgdm14bmV0MyBldGhlcm5ldCBOSUMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDksIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlIGFuZCBubyBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogTWFpbnRhaW5lZCBieTogU2hyZXlhcyBCaGF0ZXdhcmEgPHB2LWRyaXZlcnNAdm13YXJlLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfVk1YTkVUM19ERUZTX0hfCisjZGVmaW5lIF9WTVhORVQzX0RFRlNfSF8KKworI2luY2x1ZGUgInVwdDFfZGVmcy5oIgorCisvKiBhbGwgcmVnaXN0ZXJzIGFyZSAzMiBiaXQgd2lkZSAqLworLyogQkFSIDEgKi8KK2VudW0geworCVZNWE5FVDNfUkVHX1ZSUlMJPSAweDAsCS8qIFZteG5ldDMgUmV2aXNpb24gUmVwb3J0IFNlbGVjdGlvbiAqLworCVZNWE5FVDNfUkVHX1VWUlMJPSAweDgsCS8qIFVQVCBWZXJzaW9uIFJlcG9ydCBTZWxlY3Rpb24gKi8KKwlWTVhORVQzX1JFR19EU0FMCT0gMHgxMCwJLyogRHJpdmVyIFNoYXJlZCBBZGRyZXNzIExvdyAqLworCVZNWE5FVDNfUkVHX0RTQUgJPSAweDE4LAkvKiBEcml2ZXIgU2hhcmVkIEFkZHJlc3MgSGlnaCAqLworCVZNWE5FVDNfUkVHX0NNRAkJPSAweDIwLAkvKiBDb21tYW5kICovCisJVk1YTkVUM19SRUdfTUFDTAk9IDB4MjgsCS8qIE1BQyBBZGRyZXNzIExvdyAqLworCVZNWE5FVDNfUkVHX01BQ0gJPSAweDMwLAkvKiBNQUMgQWRkcmVzcyBIaWdoICovCisJVk1YTkVUM19SRUdfSUNSCQk9IDB4MzgsCS8qIEludGVycnVwdCBDYXVzZSBSZWdpc3RlciAqLworCVZNWE5FVDNfUkVHX0VDUgkJPSAweDQwCS8qIEV2ZW50IENhdXNlIFJlZ2lzdGVyICovCit9OworCisvKiBCQVIgMCAqLworZW51bSB7CisJVk1YTkVUM19SRUdfSU1SCQk9IDB4MCwJIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisJVk1YTkVUM19SRUdfVFhQUk9ECT0gMHg2MDAsIC8qIFR4IFByb2R1Y2VyIEluZGV4ICovCisJVk1YTkVUM19SRUdfUlhQUk9ECT0gMHg4MDAsIC8qIFJ4IFByb2R1Y2VyIEluZGV4IGZvciByaW5nIDEgKi8KKwlWTVhORVQzX1JFR19SWFBST0QyCT0gMHhBMDAJIC8qIFJ4IFByb2R1Y2VyIEluZGV4IGZvciByaW5nIDIgKi8KK307CisKKyNkZWZpbmUgVk1YTkVUM19QVF9SRUdfU0laRSAgICAgNDA5NgkvKiBCQVIgMCAqLworI2RlZmluZSBWTVhORVQzX1ZEX1JFR19TSVpFICAgICA0MDk2CS8qIEJBUiAxICovCisKKyNkZWZpbmUgVk1YTkVUM19SRUdfQUxJR04gICAgICAgOAkvKiBBbGwgcmVnaXN0ZXJzIGFyZSA4LWJ5dGUgYWxpZ25lZC4gKi8KKyNkZWZpbmUgVk1YTkVUM19SRUdfQUxJR05fTUFTSyAgMHg3CisKKy8qIEkvTyBNYXBwZWQgYWNjZXNzIHRvIHJlZ2lzdGVycyAqLworI2RlZmluZSBWTVhORVQzX0lPX1RZUEVfUFQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVk1YTkVUM19JT19UWVBFX1ZEICAgICAgICAgICAgICAxCisjZGVmaW5lIFZNWE5FVDNfSU9fQUREUih0eXBlLCByZWcpICAgICAgKCgodHlwZSkgPDwgMjQpIHwgKChyZWcpICYgMHhGRkZGRkYpKQorI2RlZmluZSBWTVhORVQzX0lPX1RZUEUoYWRkcikgICAgICAgICAgICgoYWRkcikgPj4gMjQpCisjZGVmaW5lIFZNWE5FVDNfSU9fUkVHKGFkZHIpICAgICAgICAgICAgKChhZGRyKSAmIDB4RkZGRkZGKQorCitlbnVtIHsKKwlWTVhORVQzX0NNRF9GSVJTVF9TRVQgPSAweENBRkUwMDAwLAorCVZNWE5FVDNfQ01EX0FDVElWQVRFX0RFViA9IFZNWE5FVDNfQ01EX0ZJUlNUX1NFVCwKKwlWTVhORVQzX0NNRF9RVUlFU0NFX0RFViwKKwlWTVhORVQzX0NNRF9SRVNFVF9ERVYsCisJVk1YTkVUM19DTURfVVBEQVRFX1JYX01PREUsCisJVk1YTkVUM19DTURfVVBEQVRFX01BQ19GSUxURVJTLAorCVZNWE5FVDNfQ01EX1VQREFURV9WTEFOX0ZJTFRFUlMsCisJVk1YTkVUM19DTURfVVBEQVRFX1JTU0lEVCwKKwlWTVhORVQzX0NNRF9VUERBVEVfSU1MLAorCVZNWE5FVDNfQ01EX1VQREFURV9QTUNGRywKKwlWTVhORVQzX0NNRF9VUERBVEVfRkVBVFVSRSwKKwlWTVhORVQzX0NNRF9MT0FEX1BMVUdJTiwKKworCVZNWE5FVDNfQ01EX0ZJUlNUX0dFVCA9IDB4RjAwRDAwMDAsCisJVk1YTkVUM19DTURfR0VUX1FVRVVFX1NUQVRVUyA9IFZNWE5FVDNfQ01EX0ZJUlNUX0dFVCwKKwlWTVhORVQzX0NNRF9HRVRfU1RBVFMsCisJVk1YTkVUM19DTURfR0VUX0xJTkssCisJVk1YTkVUM19DTURfR0VUX1BFUk1fTUFDX0xPLAorCVZNWE5FVDNfQ01EX0dFVF9QRVJNX01BQ19ISSwKKwlWTVhORVQzX0NNRF9HRVRfRElEX0xPLAorCVZNWE5FVDNfQ01EX0dFVF9ESURfSEksCisJVk1YTkVUM19DTURfR0VUX0RFVl9FWFRSQV9JTkZPLAorCVZNWE5FVDNfQ01EX0dFVF9DT05GX0lOVFIKK307CisKK3N0cnVjdCBWbXhuZXQzX1R4RGVzYyB7CisJdTY0CQlhZGRyOworCisJdTMyCQlsZW46MTQ7CisJdTMyCQlnZW46MTsgICAgICAvKiBnZW5lcmF0aW9uIGJpdCAqLworCXUzMgkJcnN2ZDoxOworCXUzMgkJZHR5cGU6MTsgICAgLyogZGVzY3JpcHRvciB0eXBlICovCisJdTMyCQlleHQxOjE7CisJdTMyCQltc3Njb2Y6MTQ7ICAvKiBNU1MsIGNoZWNrc3VtIG9mZnNldCwgZmxhZ3MgKi8KKworCXUzMgkJaGxlbjoxMDsgICAgLyogaGVhZGVyIGxlbiAqLworCXUzMgkJb206MjsgICAgICAgLyogb2ZmbG9hZCBtb2RlICovCisJdTMyCQllb3A6MTsgICAgICAvKiBFbmQgT2YgUGFja2V0ICovCisJdTMyCQljcToxOyAgICAgICAvKiBjb21wbGV0aW9uIHJlcXVlc3QgKi8KKwl1MzIJCWV4dDI6MTsKKwl1MzIJCXRpOjE7ICAgICAgIC8qIFZMQU4gVGFnIEluc2VydGlvbiAqLworCXUzMgkJdGNpOjE2OyAgICAgLyogVGFnIHRvIEluc2VydCAqLworfTsKKworLyogVHhEZXNjLk9NIHZhbHVlcyAqLworI2RlZmluZSBWTVhORVQzX09NX05PTkUJCTAKKyNkZWZpbmUgVk1YTkVUM19PTV9DU1VNCQkyCisjZGVmaW5lIFZNWE5FVDNfT01fVFNPCQkzCisKKy8qIGZpZWxkcyBpbiBUeERlc2Mgd2UgYWNjZXNzIHcvbyB1c2luZyBiaXQgZmllbGRzICovCisjZGVmaW5lIFZNWE5FVDNfVFhEX0VPUF9TSElGVAkxMgorI2RlZmluZSBWTVhORVQzX1RYRF9DUV9TSElGVAkxMworI2RlZmluZSBWTVhORVQzX1RYRF9HRU5fU0hJRlQJMTQKKworI2RlZmluZSBWTVhORVQzX1RYRF9DUQkJKDEgPDwgVk1YTkVUM19UWERfQ1FfU0hJRlQpCisjZGVmaW5lIFZNWE5FVDNfVFhEX0VPUAkJKDEgPDwgVk1YTkVUM19UWERfRU9QX1NISUZUKQorI2RlZmluZSBWTVhORVQzX1RYRF9HRU4JCSgxIDw8IFZNWE5FVDNfVFhEX0dFTl9TSElGVCkKKworI2RlZmluZSBWTVhORVQzX0hEUl9DT1BZX1NJWkUgICAxMjgKKworCitzdHJ1Y3QgVm14bmV0M19UeERhdGFEZXNjIHsKKwl1OAkJZGF0YVtWTVhORVQzX0hEUl9DT1BZX1NJWkVdOworfTsKKworCitzdHJ1Y3QgVm14bmV0M19UeENvbXBEZXNjIHsKKwl1MzIJCXR4ZElkeDoxMjsgICAgLyogSW5kZXggb2YgdGhlIEVPUCBUeERlc2MgKi8KKwl1MzIJCWV4dDE6MjA7CisKKwl1MzIJCWV4dDI7CisJdTMyCQlleHQzOworCisJdTMyCQlyc3ZkOjI0OworCXUzMgkJdHlwZTo3OyAgICAgICAvKiBjb21wbGV0aW9uIHR5cGUgKi8KKwl1MzIJCWdlbjoxOyAgICAgICAgLyogZ2VuZXJhdGlvbiBiaXQgKi8KK307CisKKworc3RydWN0IFZteG5ldDNfUnhEZXNjIHsKKwl1NjQJCWFkZHI7CisKKwl1MzIJCWxlbjoxNDsKKwl1MzIJCWJ0eXBlOjE7ICAgICAgLyogQnVmZmVyIFR5cGUgKi8KKwl1MzIJCWR0eXBlOjE7ICAgICAgLyogRGVzY3JpcHRvciB0eXBlICovCisJdTMyCQlyc3ZkOjE1OworCXUzMgkJZ2VuOjE7ICAgICAgICAvKiBHZW5lcmF0aW9uIGJpdCAqLworCisJdTMyCQlleHQxOworfTsKKworLyogdmFsdWVzIG9mIFJYRC5CVFlQRSAqLworI2RlZmluZSBWTVhORVQzX1JYRF9CVFlQRV9IRUFEICAgMCAgICAvKiBoZWFkIG9ubHkgKi8KKyNkZWZpbmUgVk1YTkVUM19SWERfQlRZUEVfQk9EWSAgIDEgICAgLyogYm9keSBvbmx5ICovCisKKy8qIGZpZWxkcyBpbiBSeERlc2Mgd2UgYWNjZXNzIHcvbyB1c2luZyBiaXQgZmllbGRzICovCisjZGVmaW5lIFZNWE5FVDNfUlhEX0JUWVBFX1NISUZUICAxNAorI2RlZmluZSBWTVhORVQzX1JYRF9HRU5fU0hJRlQgICAgMzEKKworCitzdHJ1Y3QgVm14bmV0M19SeENvbXBEZXNjIHsKKwl1MzIJCXJ4ZElkeDoxMjsgICAgLyogSW5kZXggb2YgdGhlIFJ4RGVzYyAqLworCXUzMgkJZXh0MToyOworCXUzMgkJZW9wOjE7ICAgICAgICAvKiBFbmQgb2YgUGFja2V0ICovCisJdTMyCQlzb3A6MTsgICAgICAgIC8qIFN0YXJ0IG9mIFBhY2tldCAqLworCXUzMgkJcnFJRDoxMDsgICAgICAvKiByeCBxdWV1ZS9yaW5nIElEICovCisJdTMyCQlyc3NUeXBlOjQ7ICAgIC8qIFJTUyBoYXNoIHR5cGUgdXNlZCAqLworCXUzMgkJY25jOjE7ICAgICAgICAvKiBDaGVja3N1bSBOb3QgQ2FsY3VsYXRlZCAqLworCXUzMgkJZXh0MjoxOworCisJdTMyCQlyc3NIYXNoOyAgICAgIC8qIFJTUyBoYXNoIHZhbHVlICovCisKKwl1MzIJCWxlbjoxNDsgICAgICAgLyogZGF0YSBsZW5ndGggKi8KKwl1MzIJCWVycjoxOyAgICAgICAgLyogRXJyb3IgKi8KKwl1MzIJCXRzOjE7ICAgICAgICAgLyogVGFnIGlzIHN0cmlwcGVkICovCisJdTMyCQl0Y2k6MTY7ICAgICAgIC8qIFRhZyBzdHJpcHBlZCAqLworCisJdTMyCQljc3VtOjE2OworCXUzMgkJdHVjOjE7ICAgICAgICAvKiBUQ1AvVURQIENoZWNrc3VtIENvcnJlY3QgKi8KKwl1MzIJCXVkcDoxOyAgICAgICAgLyogVURQIHBhY2tldCAqLworCXUzMgkJdGNwOjE7ICAgICAgICAvKiBUQ1AgcGFja2V0ICovCisJdTMyCQlpcGM6MTsgICAgICAgIC8qIElQIENoZWNrc3VtIENvcnJlY3QgKi8KKwl1MzIJCXY2OjE7ICAgICAgICAgLyogSVB2NiAqLworCXUzMgkJdjQ6MTsgICAgICAgICAvKiBJUHY0ICovCisJdTMyCQlmcmc6MTsgICAgICAgIC8qIElQIEZyYWdtZW50ICovCisJdTMyCQlmY3M6MTsgICAgICAgIC8qIEZyYW1lIENSQyBjb3JyZWN0ICovCisJdTMyCQl0eXBlOjc7ICAgICAgIC8qIGNvbXBsZXRpb24gdHlwZSAqLworCXUzMgkJZ2VuOjE7ICAgICAgICAvKiBnZW5lcmF0aW9uIGJpdCAqLworfTsKKworLyogZmllbGRzIGluIFJ4Q29tcERlc2Mgd2UgYWNjZXNzIHZpYSBWbXhuZXQzX0dlbmVyaWNEZXNjLmR3b3JkWzNdICovCisjZGVmaW5lIFZNWE5FVDNfUkNEX1RVQ19TSElGVAkxNgorI2RlZmluZSBWTVhORVQzX1JDRF9JUENfU0hJRlQJMTkKKworLyogZmllbGRzIGluIFJ4Q29tcERlc2Mgd2UgYWNjZXNzIHZpYSBWbXhuZXQzX0dlbmVyaWNEZXNjLnF3b3JkWzFdICovCisjZGVmaW5lIFZNWE5FVDNfUkNEX1RZUEVfU0hJRlQJNTYKKyNkZWZpbmUgVk1YTkVUM19SQ0RfR0VOX1NISUZUCTYzCisKKy8qIGNzdW0gT0sgZm9yIFRDUC9VRFAgcGt0cyBvdmVyIElQICovCisjZGVmaW5lIFZNWE5FVDNfUkNEX0NTVU1fT0sgKDEgPDwgVk1YTkVUM19SQ0RfVFVDX1NISUZUIHwgXAorCQkJICAgICAxIDw8IFZNWE5FVDNfUkNEX0lQQ19TSElGVCkKKworLyogdmFsdWUgb2YgUnhDb21wRGVzYy5yc3NUeXBlICovCitlbnVtIHsKKwlWTVhORVQzX1JDRF9SU1NfVFlQRV9OT05FICAgICA9IDAsCisJVk1YTkVUM19SQ0RfUlNTX1RZUEVfSVBWNCAgICAgPSAxLAorCVZNWE5FVDNfUkNEX1JTU19UWVBFX1RDUElQVjQgID0gMiwKKwlWTVhORVQzX1JDRF9SU1NfVFlQRV9JUFY2ICAgICA9IDMsCisJVk1YTkVUM19SQ0RfUlNTX1RZUEVfVENQSVBWNiAgPSA0LAorfTsKKworCisvKiBhIHVuaW9uIGZvciBhY2Nlc3NpbmcgYWxsIGNtZC9jb21wbGV0aW9uIGRlc2NyaXB0b3JzICovCit1bmlvbiBWbXhuZXQzX0dlbmVyaWNEZXNjIHsKKwl1NjQJCQkJcXdvcmRbMl07CisJdTMyCQkJCWR3b3JkWzRdOworCXUxNgkJCQl3b3JkWzhdOworCXN0cnVjdCBWbXhuZXQzX1R4RGVzYwkJdHhkOworCXN0cnVjdCBWbXhuZXQzX1J4RGVzYwkJcnhkOworCXN0cnVjdCBWbXhuZXQzX1R4Q29tcERlc2MJdGNkOworCXN0cnVjdCBWbXhuZXQzX1J4Q29tcERlc2MJcmNkOworfTsKKworI2RlZmluZSBWTVhORVQzX0lOSVRfR0VOICAgICAgIDEKKworLyogTWF4IHNpemUgb2YgYSBzaW5nbGUgdHggYnVmZmVyICovCisjZGVmaW5lIFZNWE5FVDNfTUFYX1RYX0JVRl9TSVpFICAoMSA8PCAxNCkKKworLyogIyBvZiB0eCBkZXNjIG5lZWRlZCBmb3IgYSB0eCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBWTVhORVQzX1RYRF9ORUVERUQoc2l6ZSkgKCgoc2l6ZSkgKyBWTVhORVQzX01BWF9UWF9CVUZfU0laRSAtIDEpIC8gXAorCQkJCSAgVk1YTkVUM19NQVhfVFhfQlVGX1NJWkUpCisKKy8qIG1heCAjIG9mIHR4IGRlc2NzIGZvciBhIG5vbi10c28gcGt0ICovCisjZGVmaW5lIFZNWE5FVDNfTUFYX1RYRF9QRVJfUEtUIDE2CisKKy8qIE1heCBzaXplIG9mIGEgc2luZ2xlIHJ4IGJ1ZmZlciAqLworI2RlZmluZSBWTVhORVQzX01BWF9SWF9CVUZfU0laRSAgKCgxIDw8IDE0KSAtIDEpCisvKiBNaW5pbXVtIHNpemUgb2YgYSB0eXBlIDAgYnVmZmVyICovCisjZGVmaW5lIFZNWE5FVDNfTUlOX1QwX0JVRl9TSVpFICAxMjgKKyNkZWZpbmUgVk1YTkVUM19NQVhfQ1NVTV9PRkZTRVQgIDEwMjQKKworLyogUmluZyBiYXNlIGFkZHJlc3MgYWxpZ25tZW50ICovCisjZGVmaW5lIFZNWE5FVDNfUklOR19CQV9BTElHTiAgIDUxMgorI2RlZmluZSBWTVhORVQzX1JJTkdfQkFfTUFTSyAgICAoVk1YTkVUM19SSU5HX0JBX0FMSUdOIC0gMSkKKworLyogUmluZyBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMiAqLworI2RlZmluZSBWTVhORVQzX1JJTkdfU0laRV9BTElHTiAzMgorI2RlZmluZSBWTVhORVQzX1JJTkdfU0laRV9NQVNLICAoVk1YTkVUM19SSU5HX1NJWkVfQUxJR04gLSAxKQorCisvKiBNYXggcmluZyBzaXplICovCisjZGVmaW5lIFZNWE5FVDNfVFhfUklOR19NQVhfU0laRSAgIDQwOTYKKyNkZWZpbmUgVk1YTkVUM19UQ19SSU5HX01BWF9TSVpFICAgNDA5NgorI2RlZmluZSBWTVhORVQzX1JYX1JJTkdfTUFYX1NJWkUgICA0MDk2CisjZGVmaW5lIFZNWE5FVDNfUkNfUklOR19NQVhfU0laRSAgIDgxOTIKKworLyogYSBsaXN0IG9mIHJlYXNvbnMgZm9yIHF1ZXVlIHN0b3AgKi8KKworZW51bSB7CisgVk1YTkVUM19FUlJfTk9FT1AgICAgICAgID0gMHg4MDAwMDAwMCwgIC8qIGNhbm5vdCBmaW5kIHRoZSBFT1AgZGVzYyBvZiBhIHBrdCAqLworIFZNWE5FVDNfRVJSX1RYRF9SRVVTRSAgICA9IDB4ODAwMDAwMDEsICAvKiByZXVzZSBUeERlc2MgYmVmb3JlIHR4IGNvbXBsZXRpb24gKi8KKyBWTVhORVQzX0VSUl9CSUdfUEtUICAgICAgPSAweDgwMDAwMDAyLCAgLyogdG9vIG1hbnkgVHhEZXNjIGZvciBhIHBrdCAqLworIFZNWE5FVDNfRVJSX0RFU0NfTk9UX1NQVCA9IDB4ODAwMDAwMDMsICAvKiBkZXNjcmlwdG9yIHR5cGUgbm90IHN1cHBvcnRlZCAqLworIFZNWE5FVDNfRVJSX1NNQUxMX0JVRiAgICA9IDB4ODAwMDAwMDQsICAvKiB0eXBlIDAgYnVmZmVyIHRvbyBzbWFsbCAqLworIFZNWE5FVDNfRVJSX1NUUkVTUyAgICAgICA9IDB4ODAwMDAwMDUsICAvKiBzdHJlc3Mgb3B0aW9uIGZpcmluZyBpbiB2bWtlcm5lbCAqLworIFZNWE5FVDNfRVJSX1NXSVRDSCAgICAgICA9IDB4ODAwMDAwMDYsICAvKiBtb2RlIHN3aXRjaCBmYWlsdXJlICovCisgVk1YTkVUM19FUlJfVFhEX0lOVkFMSUQgID0gMHg4MDAwMDAwNywgIC8qIGludmFsaWQgVHhEZXNjICovCit9OworCisvKiBjb21wbGV0aW9uIGRlc2NyaXB0b3IgdHlwZXMgKi8KKyNkZWZpbmUgVk1YTkVUM19DRFRZUEVfVFhDT01QICAgICAgMCAgICAvKiBUeCBDb21wbGV0aW9uIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVk1YTkVUM19DRFRZUEVfUlhDT01QICAgICAgMyAgICAvKiBSeCBDb21wbGV0aW9uIERlc2NyaXB0b3IgKi8KKworZW51bSB7CisJVk1YTkVUM19HT1NfQklUU19VTksgICAgPSAwLCAgIC8qIHVua25vd24gKi8KKwlWTVhORVQzX0dPU19CSVRTXzMyICAgICA9IDEsCisJVk1YTkVUM19HT1NfQklUU182NCAgICAgPSAyLAorfTsKKworI2RlZmluZSBWTVhORVQzX0dPU19UWVBFX0xJTlVYCTEKKworCitzdHJ1Y3QgVm14bmV0M19HT1NJbmZvIHsKKwl1MzIJCQkJZ29zQml0czoyOwkvKiAzMi1iaXQgb3IgNjQtYml0PyAqLworCXUzMgkJCQlnb3NUeXBlOjQ7ICAgLyogd2hpY2ggZ3Vlc3QgKi8KKwl1MzIJCQkJZ29zVmVyOjE2OyAgIC8qIGdvcyB2ZXJzaW9uICovCisJdTMyCQkJCWdvc01pc2M6MTA7ICAvKiBvdGhlciBpbmZvIGFib3V0IGdvcyAqLworfTsKKworCitzdHJ1Y3QgVm14bmV0M19Ecml2ZXJJbmZvIHsKKwl1MzIJCQkJdmVyc2lvbjsKKwlzdHJ1Y3QgVm14bmV0M19HT1NJbmZvCQlnb3M7CisJdTMyCQkJCXZteG5ldDNSZXZTcHQ7CisJdTMyCQkJCXVwdFZlclNwdDsKK307CisKKworI2RlZmluZSBWTVhORVQzX1JFVjFfTUFHSUMgIDB4YmFiZWZlZTEKKworLyoKKyAqIFF1ZXVlRGVzY1BBIG11c3QgYmUgMTI4IGJ5dGVzIGFsaWduZWQuIEl0IHBvaW50cyB0byBhbiBhcnJheSBvZgorICogVm14bmV0M19UeFF1ZXVlRGVzYyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZiBWbXhuZXQzX1J4UXVldWVEZXNjLgorICogVGhlIG51bWJlciBvZiBWbXhuZXQzX1R4UXVldWVEZXNjL1ZteG5ldDNfUnhRdWV1ZURlc2MgYXJlIHNwZWNpZmllZCBieQorICogVm14bmV0M19NaXNjQ29uZi5udW1UeFF1ZXVlcy9udW1SeFF1ZXVlcywgcmVzcGVjdGl2ZWx5LgorICovCisjZGVmaW5lIFZNWE5FVDNfUVVFVUVfREVTQ19BTElHTiAgMTI4CisKKworc3RydWN0IFZteG5ldDNfTWlzY0NvbmYgeworCXN0cnVjdCBWbXhuZXQzX0RyaXZlckluZm8gZHJpdmVySW5mbzsKKwl1NjQJCXVwdEZlYXR1cmVzOworCXU2NAkJZGRQQTsgICAgICAgICAvKiBkcml2ZXIgZGF0YSBQQSAqLworCXU2NAkJcXVldWVEZXNjUEE7ICAvKiBxdWV1ZSBkZXNjcmlwdG9yIHRhYmxlIFBBICovCisJdTMyCQlkZExlbjsgICAgICAgIC8qIGRyaXZlciBkYXRhIGxlbiAqLworCXUzMgkJcXVldWVEZXNjTGVuOyAvKiBxdWV1ZSBkZXNjLiB0YWJsZSBsZW4gaW4gYnl0ZXMgKi8KKwl1MzIJCW10dTsKKwl1MTYJCW1heE51bVJ4U0c7CisJdTgJCW51bVR4UXVldWVzOworCXU4CQludW1SeFF1ZXVlczsKKwl1MzIJCXJlc2VydmVkWzRdOworfTsKKworCitzdHJ1Y3QgVm14bmV0M19UeFF1ZXVlQ29uZiB7CisJdTY0CQl0eFJpbmdCYXNlUEE7CisJdTY0CQlkYXRhUmluZ0Jhc2VQQTsKKwl1NjQJCWNvbXBSaW5nQmFzZVBBOworCXU2NAkJZGRQQTsgICAgICAgICAvKiBkcml2ZXIgZGF0YSAqLworCXU2NAkJcmVzZXJ2ZWQ7CisJdTMyCQl0eFJpbmdTaXplOyAgIC8qICMgb2YgdHggZGVzYyAqLworCXUzMgkJZGF0YVJpbmdTaXplOyAvKiAjIG9mIGRhdGEgZGVzYyAqLworCXUzMgkJY29tcFJpbmdTaXplOyAvKiAjIG9mIGNvbXAgZGVzYyAqLworCXUzMgkJZGRMZW47ICAgICAgICAvKiBzaXplIG9mIGRyaXZlciBkYXRhICovCisJdTgJCWludHJJZHg7CisJdTgJCV9wYWRbN107Cit9OworCisKK3N0cnVjdCBWbXhuZXQzX1J4UXVldWVDb25mIHsKKwl1NjQJCXJ4UmluZ0Jhc2VQQVsyXTsKKwl1NjQJCWNvbXBSaW5nQmFzZVBBOworCXU2NAkJZGRQQTsgICAgICAgICAgICAvKiBkcml2ZXIgZGF0YSAqLworCXU2NAkJcmVzZXJ2ZWQ7CisJdTMyCQlyeFJpbmdTaXplWzJdOyAgIC8qICMgb2YgcnggZGVzYyAqLworCXUzMgkJY29tcFJpbmdTaXplOyAgICAvKiAjIG9mIHJ4IGNvbXAgZGVzYyAqLworCXUzMgkJZGRMZW47ICAgICAgICAgICAvKiBzaXplIG9mIGRyaXZlciBkYXRhICovCisJdTgJCWludHJJZHg7CisJdTgJCV9wYWRbN107Cit9OworCisKK2VudW0gdm14bmV0M19pbnRyX21hc2tfbW9kZSB7CisJVk1YTkVUM19JTU1fQVVUTyAgID0gMCwKKwlWTVhORVQzX0lNTV9BQ1RJVkUgPSAxLAorCVZNWE5FVDNfSU1NX0xBWlkgICA9IDIKK307CisKK2VudW0gdm14bmV0M19pbnRyX3R5cGUgeworCVZNWE5FVDNfSVRfQVVUTyA9IDAsCisJVk1YTkVUM19JVF9JTlRYID0gMSwKKwlWTVhORVQzX0lUX01TSSAgPSAyLAorCVZNWE5FVDNfSVRfTVNJWCA9IDMKK307CisKKyNkZWZpbmUgVk1YTkVUM19NQVhfVFhfUVVFVUVTICA4CisjZGVmaW5lIFZNWE5FVDNfTUFYX1JYX1FVRVVFUyAgMTYKKy8qIGFkZGl0aW9uIDEgZm9yIGV2ZW50cyAqLworI2RlZmluZSBWTVhORVQzX01BWF9JTlRSUyAgICAgIDI1CisKKworc3RydWN0IFZteG5ldDNfSW50ckNvbmYgeworCWJvb2wJCWF1dG9NYXNrOworCXU4CQludW1JbnRyczsgICAgICAvKiAjIG9mIGludGVycnVwdHMgKi8KKwl1OAkJZXZlbnRJbnRySWR4OworCXU4CQltb2RMZXZlbHNbVk1YTkVUM19NQVhfSU5UUlNdOwkvKiBtb2RlcmF0aW9uIGxldmVsIGZvcgorCQkJCQkJCSAqIGVhY2ggaW50ciAqLworCXUzMgkJcmVzZXJ2ZWRbM107Cit9OworCisvKiBvbmUgYml0IHBlciBWTEFOIElELCB0aGUgc2l6ZSBpcyBpbiB0aGUgdW5pdHMgb2YgdTMyCSovCisjZGVmaW5lIFZNWE5FVDNfVkZUX1NJWkUgICg0MDk2IC8gKHNpemVvZih1MzIpICogOCkpCisKKworc3RydWN0IFZteG5ldDNfUXVldWVTdGF0dXMgeworCWJvb2wJCXN0b3BwZWQ7CisJdTgJCV9wYWRbM107CisJdTMyCQllcnJvcjsKK307CisKKworc3RydWN0IFZteG5ldDNfVHhRdWV1ZUN0cmwgeworCXUzMgkJdHhOdW1EZWZlcnJlZDsKKwl1MzIJCXR4VGhyZXNob2xkOworCXU2NAkJcmVzZXJ2ZWQ7Cit9OworCisKK3N0cnVjdCBWbXhuZXQzX1J4UXVldWVDdHJsIHsKKwlib29sCQl1cGRhdGVSeFByb2Q7CisJdTgJCV9wYWRbN107CisJdTY0CQlyZXNlcnZlZDsKK307CisKK2VudW0geworCVZNWE5FVDNfUlhNX1VDQVNUICAgICA9IDB4MDEsICAvKiB1bmljYXN0IG9ubHkgKi8KKwlWTVhORVQzX1JYTV9NQ0FTVCAgICAgPSAweDAyLCAgLyogbXVsdGljYXN0IHBhc3NpbmcgdGhlIGZpbHRlcnMgKi8KKwlWTVhORVQzX1JYTV9CQ0FTVCAgICAgPSAweDA0LCAgLyogYnJvYWRjYXN0IG9ubHkgKi8KKwlWTVhORVQzX1JYTV9BTExfTVVMVEkgPSAweDA4LCAgLyogYWxsIG11bHRpY2FzdCAqLworCVZNWE5FVDNfUlhNX1BST01JU0MgICA9IDB4MTAgIC8qIHByb21pc2N1b3VzICovCit9OworCitzdHJ1Y3QgVm14bmV0M19SeEZpbHRlckNvbmYgeworCXUzMgkJcnhNb2RlOyAgICAgICAvKiBWTVhORVQzX1JYTV94eHggKi8KKwl1MTYJCW1mVGFibGVMZW47ICAgLyogc2l6ZSBvZiB0aGUgbXVsdGljYXN0IGZpbHRlciB0YWJsZSAqLworCXUxNgkJX3BhZDE7CisJdTY0CQltZlRhYmxlUEE7ICAgIC8qIFBBIG9mIHRoZSBtdWx0aWNhc3QgZmlsdGVycyB0YWJsZSAqLworCXUzMgkJdmZUYWJsZVtWTVhORVQzX1ZGVF9TSVpFXTsgLyogdmxhbiBmaWx0ZXIgKi8KK307CisKKworI2RlZmluZSBWTVhORVQzX1BNX01BWF9GSUxURVJTICAgICAgICA2CisjZGVmaW5lIFZNWE5FVDNfUE1fTUFYX1BBVFRFUk5fU0laRSAgIDEyOAorI2RlZmluZSBWTVhORVQzX1BNX01BWF9NQVNLX1NJWkUgICAgICAoVk1YTkVUM19QTV9NQVhfUEFUVEVSTl9TSVpFIC8gOCkKKworI2RlZmluZSBWTVhORVQzX1BNX1dBS0VVUF9NQUdJQyAgICAgICAweDAxICAvKiB3YWtlIHVwIG9uIG1hZ2ljIHBrdHMgKi8KKyNkZWZpbmUgVk1YTkVUM19QTV9XQUtFVVBfRklMVEVSICAgICAgMHgwMiAgLyogd2FrZSB1cCBvbiBwa3RzIG1hdGNoaW5nCisJCQkJCSAgICAgKiBmaWx0ZXJzICovCisKKworc3RydWN0IFZteG5ldDNfUE1fUGt0RmlsdGVyIHsKKwl1OAkJbWFza1NpemU7CisJdTgJCXBhdHRlcm5TaXplOworCXU4CQltYXNrW1ZNWE5FVDNfUE1fTUFYX01BU0tfU0laRV07CisJdTgJCXBhdHRlcm5bVk1YTkVUM19QTV9NQVhfUEFUVEVSTl9TSVpFXTsKKwl1OAkJcGFkWzZdOworfTsKKworCitzdHJ1Y3QgVm14bmV0M19QTUNvbmYgeworCXUxNgkJd2FrZVVwRXZlbnRzOyAgLyogVk1YTkVUM19QTV9XQUtFVVBfeHh4ICovCisJdTgJCW51bUZpbHRlcnM7CisJdTgJCXBhZFs1XTsKKwlzdHJ1Y3QgVm14bmV0M19QTV9Qa3RGaWx0ZXIgZmlsdGVyc1tWTVhORVQzX1BNX01BWF9GSUxURVJTXTsKK307CisKKworc3RydWN0IFZteG5ldDNfVmFyaWFibGVMZW5Db25mRGVzYyB7CisJdTMyCQljb25mVmVyOworCXUzMgkJY29uZkxlbjsKKwl1NjQJCWNvbmZQQTsKK307CisKKworc3RydWN0IFZteG5ldDNfVHhRdWV1ZURlc2MgeworCXN0cnVjdCBWbXhuZXQzX1R4UXVldWVDdHJsCQljdHJsOworCXN0cnVjdCBWbXhuZXQzX1R4UXVldWVDb25mCQljb25mOworCisJLyogRHJpdmVyIHJlYWQgYWZ0ZXIgYSBHRVQgY29tbWFuZCAqLworCXN0cnVjdCBWbXhuZXQzX1F1ZXVlU3RhdHVzCQlzdGF0dXM7CisJc3RydWN0IFVQVDFfVHhTdGF0cwkJCXN0YXRzOworCXU4CQkJCQlfcGFkWzg4XTsgLyogMTI4IGFsaWduZWQgKi8KK307CisKKworc3RydWN0IFZteG5ldDNfUnhRdWV1ZURlc2MgeworCXN0cnVjdCBWbXhuZXQzX1J4UXVldWVDdHJsCQljdHJsOworCXN0cnVjdCBWbXhuZXQzX1J4UXVldWVDb25mCQljb25mOworCS8qIERyaXZlciByZWFkIGFmdGVyIGEgR0VUIGNvbW1hZCAqLworCXN0cnVjdCBWbXhuZXQzX1F1ZXVlU3RhdHVzCQlzdGF0dXM7CisJc3RydWN0IFVQVDFfUnhTdGF0cwkJCXN0YXRzOworCXU4CQkJCSAgICAgIF9fcGFkWzg4XTsgLyogMTI4IGFsaWduZWQgKi8KK307CisKKworc3RydWN0IFZteG5ldDNfRFNEZXZSZWFkIHsKKwkvKiByZWFkLW9ubHkgcmVnaW9uIGZvciBkZXZpY2UsIHJlYWQgYnkgZGV2IGluIHJlc3BvbnNlIHRvIGEgU0VUIGNtZCAqLworCXN0cnVjdCBWbXhuZXQzX01pc2NDb25mCQkJbWlzYzsKKwlzdHJ1Y3QgVm14bmV0M19JbnRyQ29uZgkJCWludHJDb25mOworCXN0cnVjdCBWbXhuZXQzX1J4RmlsdGVyQ29uZgkJcnhGaWx0ZXJDb25mOworCXN0cnVjdCBWbXhuZXQzX1ZhcmlhYmxlTGVuQ29uZkRlc2MJcnNzQ29uZkRlc2M7CisJc3RydWN0IFZteG5ldDNfVmFyaWFibGVMZW5Db25mRGVzYwlwbUNvbmZEZXNjOworCXN0cnVjdCBWbXhuZXQzX1ZhcmlhYmxlTGVuQ29uZkRlc2MJcGx1Z2luQ29uZkRlc2M7Cit9OworCisvKiBBbGwgc3RydWN0dXJlcyBpbiBEcml2ZXJTaGFyZWQgYXJlIHBhZGRlZCB0byBtdWx0aXBsZXMgb2YgOCBieXRlcyAqLworc3RydWN0IFZteG5ldDNfRHJpdmVyU2hhcmVkIHsKKwl1MzIJCQkJbWFnaWM7CisJLyogbWFrZSBkZXZSZWFkIHN0YXJ0IGF0IDY0Yml0IGJvdW5kYXJpZXMgKi8KKwl1MzIJCQkJCXBhZDsKKwlzdHJ1Y3QgVm14bmV0M19EU0RldlJlYWQJCWRldlJlYWQ7CisJdTMyCQkJCQllY3I7CisJdTMyCQkJCQlyZXNlcnZlZFs1XTsKK307CisKKworI2RlZmluZSBWTVhORVQzX0VDUl9SUUVSUiAgICAgICAoMSA8PCAwKQorI2RlZmluZSBWTVhORVQzX0VDUl9UUUVSUiAgICAgICAoMSA8PCAxKQorI2RlZmluZSBWTVhORVQzX0VDUl9MSU5LICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBWTVhORVQzX0VDUl9ESUMgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBWTVhORVQzX0VDUl9ERUJVRyAgICAgICAoMSA8PCA0KQorCisvKiBmbGlwIHRoZSBnZW4gYml0IG9mIGEgcmluZyAqLworI2RlZmluZSBWTVhORVQzX0ZMSVBfUklOR19HRU4oZ2VuKSAoKGdlbikgPSAoZ2VuKSBeIDB4MSkKKworLyogb25seSB1c2UgdGhpcyBpZiBtb3ZpbmcgdGhlIGlkeCB3b24ndCBhZmZlY3QgdGhlIGdlbiBiaXQgKi8KKyNkZWZpbmUgVk1YTkVUM19JTkNfUklOR19JRFhfT05MWShpZHgsIHJpbmdfc2l6ZSkgXAorCWRvIHtcCisJCShpZHgpKys7XAorCQlpZiAodW5saWtlbHkoKGlkeCkgPT0gKHJpbmdfc2l6ZSkpKSB7XAorCQkJKGlkeCkgPSAwO1wKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBWTVhORVQzX1NFVF9WRlRBQkxFX0VOVFJZKHZmVGFibGUsIHZpZCkgXAorCSh2ZlRhYmxlW3ZpZCA+PiA1XSB8PSAoMSA8PCAodmlkICYgMzEpKSkKKyNkZWZpbmUgVk1YTkVUM19DTEVBUl9WRlRBQkxFX0VOVFJZKHZmVGFibGUsIHZpZCkgXAorCSh2ZlRhYmxlW3ZpZCA+PiA1XSAmPSB+KDEgPDwgKHZpZCAmIDMxKSkpCisKKyNkZWZpbmUgVk1YTkVUM19WRlRBQkxFX0VOVFJZX0lTX1NFVCh2ZlRhYmxlLCB2aWQpIFwKKwkoKHZmVGFibGVbdmlkID4+IDVdICYgKDEgPDwgKHZpZCAmIDMxKSkpICE9IDApCisKKyNkZWZpbmUgVk1YTkVUM19NQVhfTVRVICAgICA5MDAwCisjZGVmaW5lIFZNWE5FVDNfTUlOX01UVSAgICAgNjAKKworI2RlZmluZSBWTVhORVQzX0xJTktfVVAgICAgICAgICAoMTAwMDAgPDwgMTYgfCAxKSAgICAvKiAxMCBHYnBzLCB1cCAqLworI2RlZmluZSBWTVhORVQzX0xJTktfRE9XTiAgICAgICAwCisKKyNlbmRpZiAvKiBfVk1YTkVUM19ERUZTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0MzUzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwpAQCAtMCwwICsxLDI1NzQgQEAKKy8qCisgKiBMaW51eCBkcml2ZXIgZm9yIFZNd2FyZSdzIHZteG5ldDMgZXRoZXJuZXQgTklDLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSBhbmQgbm8gbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogTWFpbnRhaW5lZCBieTogU2hyZXlhcyBCaGF0ZXdhcmEgPHB2LWRyaXZlcnNAdm13YXJlLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgInZteG5ldDNfaW50LmgiCisKK2NoYXIgdm14bmV0M19kcml2ZXJfbmFtZVtdID0gInZteG5ldDMiOworI2RlZmluZSBWTVhORVQzX0RSSVZFUl9ERVNDICJWTXdhcmUgdm14bmV0MyB2aXJ0dWFsIE5JQyBkcml2ZXIiCisKKworLyoKKyAqIFBDSSBEZXZpY2UgSUQgVGFibGUKKyAqIExhc3QgZW50cnkgbXVzdCBiZSBhbGwgMHMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZteG5ldDNfcGNpaWRfdGFibGVbXSA9IHsKKwl7UENJX1ZERVZJQ0UoVk1XQVJFLCBQQ0lfREVWSUNFX0lEX1ZNV0FSRV9WTVhORVQzKX0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdm14bmV0M19wY2lpZF90YWJsZSk7CisKK3N0YXRpYyBhdG9taWNfdCBkZXZpY2VzX2ZvdW5kOworCisKKy8qCisgKiAgICBFbmFibGUvRGlzYWJsZSB0aGUgZ2l2ZW4gaW50cgorICovCitzdGF0aWMgdm9pZAordm14bmV0M19lbmFibGVfaW50cihzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnRyX2lkeCkKK3sKKwlWTVhORVQzX1dSSVRFX0JBUjBfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0lNUiArIGludHJfaWR4ICogOCwgMCk7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZGlzYWJsZV9pbnRyKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludHJfaWR4KQoreworCVZNWE5FVDNfV1JJVEVfQkFSMF9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfSU1SICsgaW50cl9pZHggKiA4LCAxKTsKK30KKworCisvKgorICogICAgRW5hYmxlL0Rpc2FibGUgYWxsIGludHJzIHVzZWQgYnkgdGhlIGRldmljZQorICovCitzdGF0aWMgdm9pZAordm14bmV0M19lbmFibGVfYWxsX2ludHJzKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+aW50ci5udW1faW50cnM7IGkrKykKKwkJdm14bmV0M19lbmFibGVfaW50cihhZGFwdGVyLCBpKTsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19kaXNhYmxlX2FsbF9pbnRycyhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPmludHIubnVtX2ludHJzOyBpKyspCisJCXZteG5ldDNfZGlzYWJsZV9pbnRyKGFkYXB0ZXIsIGkpOworfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX2Fja19ldmVudHMoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciwgdTMyIGV2ZW50cykKK3sKKwlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0VDUiwgZXZlbnRzKTsKK30KKworCitzdGF0aWMgYm9vbAordm14bmV0M190cV9zdG9wcGVkKHN0cnVjdCB2bXhuZXQzX3R4X3F1ZXVlICp0cSwgc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gbmV0aWZfcXVldWVfc3RvcHBlZChhZGFwdGVyLT5uZXRkZXYpOworfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX3RxX3N0YXJ0KHN0cnVjdCB2bXhuZXQzX3R4X3F1ZXVlICp0cSwgc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl0cS0+c3RvcHBlZCA9IGZhbHNlOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfdHFfd2FrZShzdHJ1Y3Qgdm14bmV0M190eF9xdWV1ZSAqdHEsIHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdHEtPnN0b3BwZWQgPSBmYWxzZTsKKwluZXRpZl93YWtlX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfdHFfc3RvcChzdHJ1Y3Qgdm14bmV0M190eF9xdWV1ZSAqdHEsIHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdHEtPnN0b3BwZWQgPSB0cnVlOworCXRxLT5udW1fc3RvcCsrOworCW5ldGlmX3N0b3BfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKK30KKworCisvKgorICogQ2hlY2sgdGhlIGxpbmsgc3RhdGUuIFRoaXMgbWF5IHN0YXJ0IG9yIHN0b3AgdGhlIHR4IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZAordm14bmV0M19jaGVja19saW5rKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHJldDsKKworCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELCBWTVhORVQzX0NNRF9HRVRfTElOSyk7CisJcmV0ID0gVk1YTkVUM19SRUFEX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCk7CisJYWRhcHRlci0+bGlua19zcGVlZCA9IHJldCA+PiAxNjsKKwlpZiAocmV0ICYgMSkgeyAvKiBMaW5rIGlzIHVwLiAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogTklDIExpbmsgaXMgVXAgJWQgTWJwc1xuIiwKKwkJICAgICAgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgYWRhcHRlci0+bGlua19zcGVlZCk7CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhhZGFwdGVyLT5uZXRkZXYpKQorCQkJbmV0aWZfY2Fycmllcl9vbihhZGFwdGVyLT5uZXRkZXYpOworCisJCXZteG5ldDNfdHFfc3RhcnQoJmFkYXB0ZXItPnR4X3F1ZXVlLCBhZGFwdGVyKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTklDIExpbmsgaXMgRG93blxuIiwKKwkJICAgICAgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9jYXJyaWVyX29rKGFkYXB0ZXItPm5ldGRldikpCisJCQluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5uZXRkZXYpOworCisJCXZteG5ldDNfdHFfc3RvcCgmYWRhcHRlci0+dHhfcXVldWUsIGFkYXB0ZXIpOworCX0KK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19wcm9jZXNzX2V2ZW50cyhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBldmVudHMgPSBhZGFwdGVyLT5zaGFyZWQtPmVjcjsKKwlpZiAoIWV2ZW50cykKKwkJcmV0dXJuOworCisJdm14bmV0M19hY2tfZXZlbnRzKGFkYXB0ZXIsIGV2ZW50cyk7CisKKwkvKiBDaGVjayBpZiBsaW5rIHN0YXRlIGhhcyBjaGFuZ2VkICovCisJaWYgKGV2ZW50cyAmIFZNWE5FVDNfRUNSX0xJTkspCisJCXZteG5ldDNfY2hlY2tfbGluayhhZGFwdGVyKTsKKworCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9uIHhtaXQvcmVjdiBxdWV1ZXMgKi8KKwlpZiAoZXZlbnRzICYgKFZNWE5FVDNfRUNSX1RRRVJSIHwgVk1YTkVUM19FQ1JfUlFFUlIpKSB7CisJCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELAorCQkJCSAgICAgICBWTVhORVQzX0NNRF9HRVRfUVVFVUVfU1RBVFVTKTsKKworCQlpZiAoYWRhcHRlci0+dHFkX3N0YXJ0LT5zdGF0dXMuc3RvcHBlZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdHEgZXJyb3IgMHgleFxuIiwKKwkJCSAgICAgICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsCisJCQkgICAgICAgYWRhcHRlci0+dHFkX3N0YXJ0LT5zdGF0dXMuZXJyb3IpOworCQl9CisJCWlmIChhZGFwdGVyLT5ycWRfc3RhcnQtPnN0YXR1cy5zdG9wcGVkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBycSBlcnJvciAweCV4XG4iLAorCQkJICAgICAgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwKKwkJCSAgICAgICBhZGFwdGVyLT5ycWRfc3RhcnQtPnN0YXR1cy5lcnJvcik7CisJCX0KKworCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT53b3JrKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfdW5tYXBfdHhfYnVmKHN0cnVjdCB2bXhuZXQzX3R4X2J1Zl9pbmZvICp0YmksCisJCSAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHRiaS0+bWFwX3R5cGUgPT0gVk1YTkVUM19NQVBfU0lOR0xFKQorCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIHRiaS0+ZG1hX2FkZHIsIHRiaS0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwllbHNlIGlmICh0YmktPm1hcF90eXBlID09IFZNWE5FVDNfTUFQX1BBR0UpCisJCXBjaV91bm1hcF9wYWdlKHBkZXYsIHRiaS0+ZG1hX2FkZHIsIHRiaS0+bGVuLAorCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCWVsc2UKKwkJQlVHX09OKHRiaS0+bWFwX3R5cGUgIT0gVk1YTkVUM19NQVBfTk9ORSk7CisKKwl0YmktPm1hcF90eXBlID0gVk1YTkVUM19NQVBfTk9ORTsgLyogdG8gaGVscCBkZWJ1Z2dpbmcgKi8KK30KKworCitzdGF0aWMgaW50Cit2bXhuZXQzX3VubWFwX3BrdCh1MzIgZW9wX2lkeCwgc3RydWN0IHZteG5ldDNfdHhfcXVldWUgKnRxLAorCQkgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVudHJpZXMgPSAwOworCisJLyogbm8gb3V0IG9mIG9yZGVyIGNvbXBsZXRpb24gKi8KKwlCVUdfT04odHEtPmJ1Zl9pbmZvW2VvcF9pZHhdLnNvcF9pZHggIT0gdHEtPnR4X3JpbmcubmV4dDJjb21wKTsKKwlCVUdfT04odHEtPnR4X3JpbmcuYmFzZVtlb3BfaWR4XS50eGQuZW9wICE9IDEpOworCisJc2tiID0gdHEtPmJ1Zl9pbmZvW2VvcF9pZHhdLnNrYjsKKwlCVUdfT04oc2tiID09IE5VTEwpOworCXRxLT5idWZfaW5mb1tlb3BfaWR4XS5za2IgPSBOVUxMOworCisJVk1YTkVUM19JTkNfUklOR19JRFhfT05MWShlb3BfaWR4LCB0cS0+dHhfcmluZy5zaXplKTsKKworCXdoaWxlICh0cS0+dHhfcmluZy5uZXh0MmNvbXAgIT0gZW9wX2lkeCkgeworCQl2bXhuZXQzX3VubWFwX3R4X2J1Zih0cS0+YnVmX2luZm8gKyB0cS0+dHhfcmluZy5uZXh0MmNvbXAsCisJCQkJICAgICBwZGV2KTsKKworCQkvKiB1cGRhdGUgbmV4dDJjb21wIHcvbyB0eF9sb2NrLiBTaW5jZSB3ZSBhcmUgbWFya2luZyBtb3JlLAorCQkgKiBpbnN0ZWFkIG9mIGxlc3MsIHR4IHJpbmcgZW50cmllcyBhdmFpbCwgdGhlIHdvcnN0IGNhc2UgaXMKKwkJICogdGhhdCB0aGUgdHggcm91dGluZSBpbmNvcnJlY3RseSByZS1xdWV1ZXMgYSBwa3QgZHVlIHRvCisJCSAqIGluc3VmZmljaWVudCB0eCByaW5nIGVudHJpZXMuCisJCSAqLworCQl2bXhuZXQzX2NtZF9yaW5nX2Fkdl9uZXh0MmNvbXAoJnRxLT50eF9yaW5nKTsKKwkJZW50cmllcysrOworCX0KKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIGVudHJpZXM7Cit9CisKKworc3RhdGljIGludAordm14bmV0M190cV90eF9jb21wbGV0ZShzdHJ1Y3Qgdm14bmV0M190eF9xdWV1ZSAqdHEsCisJCQlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBjb21wbGV0ZWQgPSAwOworCXVuaW9uIFZteG5ldDNfR2VuZXJpY0Rlc2MgKmdkZXNjOworCisJZ2Rlc2MgPSB0cS0+Y29tcF9yaW5nLmJhc2UgKyB0cS0+Y29tcF9yaW5nLm5leHQycHJvYzsKKwl3aGlsZSAoZ2Rlc2MtPnRjZC5nZW4gPT0gdHEtPmNvbXBfcmluZy5nZW4pIHsKKwkJY29tcGxldGVkICs9IHZteG5ldDNfdW5tYXBfcGt0KGdkZXNjLT50Y2QudHhkSWR4LCB0cSwKKwkJCQkJICAgICAgIGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXIpOworCisJCXZteG5ldDNfY29tcF9yaW5nX2Fkdl9uZXh0MnByb2MoJnRxLT5jb21wX3JpbmcpOworCQlnZGVzYyA9IHRxLT5jb21wX3JpbmcuYmFzZSArIHRxLT5jb21wX3JpbmcubmV4dDJwcm9jOworCX0KKworCWlmIChjb21wbGV0ZWQpIHsKKwkJc3Bpbl9sb2NrKCZ0cS0+dHhfbG9jayk7CisJCWlmICh1bmxpa2VseSh2bXhuZXQzX3RxX3N0b3BwZWQodHEsIGFkYXB0ZXIpICYmCisJCQkgICAgIHZteG5ldDNfY21kX3JpbmdfZGVzY19hdmFpbCgmdHEtPnR4X3JpbmcpID4KKwkJCSAgICAgVk1YTkVUM19XQUtFX1FVRVVFX1RIUkVTSE9MRCh0cSkgJiYKKwkJCSAgICAgbmV0aWZfY2Fycmllcl9vayhhZGFwdGVyLT5uZXRkZXYpKSkgeworCQkJdm14bmV0M190cV93YWtlKHRxLCBhZGFwdGVyKTsKKwkJfQorCQlzcGluX3VubG9jaygmdHEtPnR4X2xvY2spOworCX0KKwlyZXR1cm4gY29tcGxldGVkOworfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX3RxX2NsZWFudXAoc3RydWN0IHZteG5ldDNfdHhfcXVldWUgKnRxLAorCQkgICBzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJd2hpbGUgKHRxLT50eF9yaW5nLm5leHQyY29tcCAhPSB0cS0+dHhfcmluZy5uZXh0MmZpbGwpIHsKKwkJc3RydWN0IHZteG5ldDNfdHhfYnVmX2luZm8gKnRiaTsKKwkJdW5pb24gVm14bmV0M19HZW5lcmljRGVzYyAqZ2Rlc2M7CisKKwkJdGJpID0gdHEtPmJ1Zl9pbmZvICsgdHEtPnR4X3JpbmcubmV4dDJjb21wOworCQlnZGVzYyA9IHRxLT50eF9yaW5nLmJhc2UgKyB0cS0+dHhfcmluZy5uZXh0MmNvbXA7CisKKwkJdm14bmV0M191bm1hcF90eF9idWYodGJpLCBhZGFwdGVyLT5wZGV2KTsKKwkJaWYgKHRiaS0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueSh0YmktPnNrYik7CisJCQl0YmktPnNrYiA9IE5VTEw7CisJCX0KKwkJdm14bmV0M19jbWRfcmluZ19hZHZfbmV4dDJjb21wKCZ0cS0+dHhfcmluZyk7CisJfQorCisJLyogc2FuaXR5IGNoZWNrLCB2ZXJpZnkgYWxsIGJ1ZmZlcnMgYXJlIGluZGVlZCB1bm1hcHBlZCBhbmQgZnJlZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdHEtPnR4X3Jpbmcuc2l6ZTsgaSsrKSB7CisJCUJVR19PTih0cS0+YnVmX2luZm9baV0uc2tiICE9IE5VTEwgfHwKKwkJICAgICAgIHRxLT5idWZfaW5mb1tpXS5tYXBfdHlwZSAhPSBWTVhORVQzX01BUF9OT05FKTsKKwl9CisKKwl0cS0+dHhfcmluZy5nZW4gPSBWTVhORVQzX0lOSVRfR0VOOworCXRxLT50eF9yaW5nLm5leHQyZmlsbCA9IHRxLT50eF9yaW5nLm5leHQyY29tcCA9IDA7CisKKwl0cS0+Y29tcF9yaW5nLmdlbiA9IFZNWE5FVDNfSU5JVF9HRU47CisJdHEtPmNvbXBfcmluZy5uZXh0MnByb2MgPSAwOworfQorCisKK3ZvaWQKK3ZteG5ldDNfdHFfZGVzdHJveShzdHJ1Y3Qgdm14bmV0M190eF9xdWV1ZSAqdHEsCisJCSAgIHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKHRxLT50eF9yaW5nLmJhc2UpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCB0cS0+dHhfcmluZy5zaXplICoKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1R4RGVzYyksCisJCQkJICAgIHRxLT50eF9yaW5nLmJhc2UsIHRxLT50eF9yaW5nLmJhc2VQQSk7CisJCXRxLT50eF9yaW5nLmJhc2UgPSBOVUxMOworCX0KKwlpZiAodHEtPmRhdGFfcmluZy5iYXNlKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgdHEtPmRhdGFfcmluZy5zaXplICoKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1R4RGF0YURlc2MpLAorCQkJCSAgICB0cS0+ZGF0YV9yaW5nLmJhc2UsIHRxLT5kYXRhX3JpbmcuYmFzZVBBKTsKKwkJdHEtPmRhdGFfcmluZy5iYXNlID0gTlVMTDsKKwl9CisJaWYgKHRxLT5jb21wX3JpbmcuYmFzZSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHRxLT5jb21wX3Jpbmcuc2l6ZSAqCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgVm14bmV0M19UeENvbXBEZXNjKSwKKwkJCQkgICAgdHEtPmNvbXBfcmluZy5iYXNlLCB0cS0+Y29tcF9yaW5nLmJhc2VQQSk7CisJCXRxLT5jb21wX3JpbmcuYmFzZSA9IE5VTEw7CisJfQorCWtmcmVlKHRxLT5idWZfaW5mbyk7CisJdHEtPmJ1Zl9pbmZvID0gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M190cV9pbml0KHN0cnVjdCB2bXhuZXQzX3R4X3F1ZXVlICp0cSwKKwkJc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCS8qIHJlc2V0IHRoZSB0eCByaW5nIGNvbnRlbnRzIHRvIDAgYW5kIHJlc2V0IHRoZSB0eCByaW5nIHN0YXRlcyAqLworCW1lbXNldCh0cS0+dHhfcmluZy5iYXNlLCAwLCB0cS0+dHhfcmluZy5zaXplICoKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1R4RGVzYykpOworCXRxLT50eF9yaW5nLm5leHQyZmlsbCA9IHRxLT50eF9yaW5nLm5leHQyY29tcCA9IDA7CisJdHEtPnR4X3JpbmcuZ2VuID0gVk1YTkVUM19JTklUX0dFTjsKKworCW1lbXNldCh0cS0+ZGF0YV9yaW5nLmJhc2UsIDAsIHRxLT5kYXRhX3Jpbmcuc2l6ZSAqCisJICAgICAgIHNpemVvZihzdHJ1Y3QgVm14bmV0M19UeERhdGFEZXNjKSk7CisKKwkvKiByZXNldCB0aGUgdHggY29tcCByaW5nIGNvbnRlbnRzIHRvIDAgYW5kIHJlc2V0IGNvbXAgcmluZyBzdGF0ZXMgKi8KKwltZW1zZXQodHEtPmNvbXBfcmluZy5iYXNlLCAwLCB0cS0+Y29tcF9yaW5nLnNpemUgKgorCSAgICAgICBzaXplb2Yoc3RydWN0IFZteG5ldDNfVHhDb21wRGVzYykpOworCXRxLT5jb21wX3JpbmcubmV4dDJwcm9jID0gMDsKKwl0cS0+Y29tcF9yaW5nLmdlbiA9IFZNWE5FVDNfSU5JVF9HRU47CisKKwkvKiByZXNldCB0aGUgYm9va2tlZXBpbmcgZGF0YSAqLworCW1lbXNldCh0cS0+YnVmX2luZm8sIDAsIHNpemVvZih0cS0+YnVmX2luZm9bMF0pICogdHEtPnR4X3Jpbmcuc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IHRxLT50eF9yaW5nLnNpemU7IGkrKykKKwkJdHEtPmJ1Zl9pbmZvW2ldLm1hcF90eXBlID0gVk1YTkVUM19NQVBfTk9ORTsKKworCS8qIHN0YXRzIGFyZSBub3QgcmVzZXQgKi8KK30KKworCitzdGF0aWMgaW50Cit2bXhuZXQzX3RxX2NyZWF0ZShzdHJ1Y3Qgdm14bmV0M190eF9xdWV1ZSAqdHEsCisJCSAgc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlCVUdfT04odHEtPnR4X3JpbmcuYmFzZSB8fCB0cS0+ZGF0YV9yaW5nLmJhc2UgfHwKKwkgICAgICAgdHEtPmNvbXBfcmluZy5iYXNlIHx8IHRxLT5idWZfaW5mbyk7CisKKwl0cS0+dHhfcmluZy5iYXNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgdHEtPnR4X3Jpbmcuc2l6ZQorCQkJICAgKiBzaXplb2Yoc3RydWN0IFZteG5ldDNfVHhEZXNjKSwKKwkJCSAgICZ0cS0+dHhfcmluZy5iYXNlUEEpOworCWlmICghdHEtPnR4X3JpbmcuYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgdHggcmluZ1xuIiwKKwkJICAgICAgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CisJCWdvdG8gZXJyOworCX0KKworCXRxLT5kYXRhX3JpbmcuYmFzZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCisJCQkgICAgIHRxLT5kYXRhX3Jpbmcuc2l6ZSAqCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgVm14bmV0M19UeERhdGFEZXNjKSwKKwkJCSAgICAgJnRxLT5kYXRhX3JpbmcuYmFzZVBBKTsKKwlpZiAoIXRxLT5kYXRhX3JpbmcuYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSByaW5nXG4iLAorCQkgICAgICAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKKwkJZ290byBlcnI7CisJfQorCisJdHEtPmNvbXBfcmluZy5iYXNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKKwkJCSAgICAgdHEtPmNvbXBfcmluZy5zaXplICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1R4Q29tcERlc2MpLAorCQkJICAgICAmdHEtPmNvbXBfcmluZy5iYXNlUEEpOworCWlmICghdHEtPmNvbXBfcmluZy5iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSB0eCBjb21wIHJpbmdcbiIsCisJCSAgICAgICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUpOworCQlnb3RvIGVycjsKKwl9CisKKwl0cS0+YnVmX2luZm8gPSBrY2FsbG9jKHRxLT50eF9yaW5nLnNpemUsIHNpemVvZih0cS0+YnVmX2luZm9bMF0pLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghdHEtPmJ1Zl9pbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSB0eCBidWZpbmZvXG4iLAorCQkgICAgICAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwl2bXhuZXQzX3RxX2Rlc3Ryb3kodHEsIGFkYXB0ZXIpOworCXJldHVybiAtRU5PTUVNOworfQorCisKKy8qCisgKiAgICBzdGFydGluZyBmcm9tIHJpbmctPm5leHQyZmlsbCwgYWxsb2NhdGUgcnggYnVmZmVycyBmb3IgdGhlIGdpdmVuIHJpbmcKKyAqICAgIG9mIHRoZSByeCBxdWV1ZSBhbmQgdXBkYXRlIHRoZSByeCBkZXNjLiBzdG9wIGFmdGVyIEBudW1fdG9fYWxsb2MgYnVmZmVycworICogICAgYXJlIGFsbG9jYXRlZCBvciBhbGxvY2F0aW9uIGZhaWxzCisgKi8KKworc3RhdGljIGludAordm14bmV0M19ycV9hbGxvY19yeF9idWYoc3RydWN0IHZteG5ldDNfcnhfcXVldWUgKnJxLCB1MzIgcmluZ19pZHgsCisJCQlpbnQgbnVtX3RvX2FsbG9jLCBzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBudW1fYWxsb2NhdGVkID0gMDsKKwlzdHJ1Y3Qgdm14bmV0M19yeF9idWZfaW5mbyAqcmJpX2Jhc2UgPSBycS0+YnVmX2luZm9bcmluZ19pZHhdOworCXN0cnVjdCB2bXhuZXQzX2NtZF9yaW5nICpyaW5nID0gJnJxLT5yeF9yaW5nW3JpbmdfaWR4XTsKKwl1MzIgdmFsOworCisJd2hpbGUgKG51bV9hbGxvY2F0ZWQgPCBudW1fdG9fYWxsb2MpIHsKKwkJc3RydWN0IHZteG5ldDNfcnhfYnVmX2luZm8gKnJiaTsKKwkJdW5pb24gVm14bmV0M19HZW5lcmljRGVzYyAqZ2Q7CisKKwkJcmJpID0gcmJpX2Jhc2UgKyByaW5nLT5uZXh0MmZpbGw7CisJCWdkID0gcmluZy0+YmFzZSArIHJpbmctPm5leHQyZmlsbDsKKworCQlpZiAocmJpLT5idWZfdHlwZSA9PSBWTVhORVQzX1JYX0JVRl9TS0IpIHsKKwkJCWlmIChyYmktPnNrYiA9PSBOVUxMKSB7CisJCQkJcmJpLT5za2IgPSBkZXZfYWxsb2Nfc2tiKHJiaS0+bGVuICsKKwkJCQkJCQkgTkVUX0lQX0FMSUdOKTsKKwkJCQlpZiAodW5saWtlbHkocmJpLT5za2IgPT0gTlVMTCkpIHsKKwkJCQkJcnEtPnN0YXRzLnJ4X2J1Zl9hbGxvY19mYWlsdXJlKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyYmktPnNrYi0+ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJCQkJc2tiX3Jlc2VydmUocmJpLT5za2IsIE5FVF9JUF9BTElHTik7CisJCQkJcmJpLT5kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsCisJCQkJCQlyYmktPnNrYi0+ZGF0YSwgcmJpLT5sZW4sCisJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQkvKiByeCBidWZmZXIgc2tpcHBlZCBieSB0aGUgZGV2aWNlICovCisJCQl9CisJCQl2YWwgPSBWTVhORVQzX1JYRF9CVFlQRV9IRUFEIDw8IFZNWE5FVDNfUlhEX0JUWVBFX1NISUZUOworCQl9IGVsc2UgeworCQkJQlVHX09OKHJiaS0+YnVmX3R5cGUgIT0gVk1YTkVUM19SWF9CVUZfUEFHRSB8fAorCQkJICAgICAgIHJiaS0+bGVuICAhPSBQQUdFX1NJWkUpOworCisJCQlpZiAocmJpLT5wYWdlID09IE5VTEwpIHsKKwkJCQlyYmktPnBhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOworCQkJCWlmICh1bmxpa2VseShyYmktPnBhZ2UgPT0gTlVMTCkpIHsKKwkJCQkJcnEtPnN0YXRzLnJ4X2J1Zl9hbGxvY19mYWlsdXJlKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyYmktPmRtYV9hZGRyID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJCQlyYmktPnBhZ2UsIDAsIFBBR0VfU0laRSwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl9IGVsc2UgeworCQkJCS8qIHJ4IGJ1ZmZlcnMgc2tpcHBlZCBieSB0aGUgZGV2aWNlICovCisJCQl9CisJCQl2YWwgPSBWTVhORVQzX1JYRF9CVFlQRV9CT0RZIDw8IFZNWE5FVDNfUlhEX0JUWVBFX1NISUZUOworCQl9CisKKwkJQlVHX09OKHJiaS0+ZG1hX2FkZHIgPT0gMCk7CisJCWdkLT5yeGQuYWRkciA9IHJiaS0+ZG1hX2FkZHI7CisJCWdkLT5kd29yZFsyXSA9IChyaW5nLT5nZW4gPDwgVk1YTkVUM19SWERfR0VOX1NISUZUKSB8IHZhbCB8CisJCQkJcmJpLT5sZW47CisKKwkJbnVtX2FsbG9jYXRlZCsrOworCQl2bXhuZXQzX2NtZF9yaW5nX2Fkdl9uZXh0MmZpbGwocmluZyk7CisJfQorCXJxLT51bmNvbW1pdHRlZFtyaW5nX2lkeF0gKz0gbnVtX2FsbG9jYXRlZDsKKworCWRldl9kYmcoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAorCQkiYWxsb2NfcnhfYnVmOiAlZCBhbGxvY2F0ZWQsIG5leHQyZmlsbCAldSwgbmV4dDJjb21wICIKKwkJIiV1LCB1bmNvbW1pdGVkICV1XG4iLCBudW1fYWxsb2NhdGVkLCByaW5nLT5uZXh0MmZpbGwsCisJCXJpbmctPm5leHQyY29tcCwgcnEtPnVuY29tbWl0dGVkW3JpbmdfaWR4XSk7CisKKwkvKiBzbyB0aGF0IHRoZSBkZXZpY2UgY2FuIGRpc3Rpbmd1aXNoIGEgZnVsbCByaW5nIGFuZCBhbiBlbXB0eSByaW5nICovCisJQlVHX09OKG51bV9hbGxvY2F0ZWQgIT0gMCAmJiByaW5nLT5uZXh0MmZpbGwgPT0gcmluZy0+bmV4dDJjb21wKTsKKworCXJldHVybiBudW1fYWxsb2NhdGVkOworfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX2FwcGVuZF9mcmFnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBWbXhuZXQzX1J4Q29tcERlc2MgKnJjZCwKKwkJICAgIHN0cnVjdCB2bXhuZXQzX3J4X2J1Zl9pbmZvICpyYmkpCit7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3MgKworCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCisJQlVHX09OKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPj0gTUFYX1NLQl9GUkFHUyk7CisKKwlmcmFnLT5wYWdlID0gcmJpLT5wYWdlOworCWZyYWctPnBhZ2Vfb2Zmc2V0ID0gMDsKKwlmcmFnLT5zaXplID0gcmNkLT5sZW47CisJc2tiLT5kYXRhX2xlbiArPSBmcmFnLT5zaXplOworCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MrKzsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19tYXBfcGt0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB2bXhuZXQzX3R4X2N0eCAqY3R4LAorCQlzdHJ1Y3Qgdm14bmV0M190eF9xdWV1ZSAqdHEsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBkdzIsIGxlbjsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9vZmZzZXQ7CisJaW50IGk7CisJdW5pb24gVm14bmV0M19HZW5lcmljRGVzYyAqZ2Rlc2M7CisJc3RydWN0IHZteG5ldDNfdHhfYnVmX2luZm8gKnRiaSA9IE5VTEw7CisKKwlCVUdfT04oY3R4LT5jb3B5X3NpemUgPiBza2JfaGVhZGxlbihza2IpKTsKKworCS8qIHVzZSB0aGUgcHJldmlvdXMgZ2VuIGJpdCBmb3IgdGhlIFNPUCBkZXNjICovCisJZHcyID0gKHRxLT50eF9yaW5nLmdlbiBeIDB4MSkgPDwgVk1YTkVUM19UWERfR0VOX1NISUZUOworCisJY3R4LT5zb3BfdHhkID0gdHEtPnR4X3JpbmcuYmFzZSArIHRxLT50eF9yaW5nLm5leHQyZmlsbDsKKwlnZGVzYyA9IGN0eC0+c29wX3R4ZDsgLyogYm90aCBsb29wcyBiZWxvdyBjYW4gYmUgc2tpcHBlZCAqLworCisJLyogbm8gbmVlZCB0byBtYXAgdGhlIGJ1ZmZlciBpZiBoZWFkZXJzIGFyZSBjb3BpZWQgKi8KKwlpZiAoY3R4LT5jb3B5X3NpemUpIHsKKwkJY3R4LT5zb3BfdHhkLT50eGQuYWRkciA9IHRxLT5kYXRhX3JpbmcuYmFzZVBBICsKKwkJCQkJdHEtPnR4X3JpbmcubmV4dDJmaWxsICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1R4RGF0YURlc2MpOworCQljdHgtPnNvcF90eGQtPmR3b3JkWzJdID0gZHcyIHwgY3R4LT5jb3B5X3NpemU7CisJCWN0eC0+c29wX3R4ZC0+ZHdvcmRbM10gPSAwOworCisJCXRiaSA9IHRxLT5idWZfaW5mbyArIHRxLT50eF9yaW5nLm5leHQyZmlsbDsKKwkJdGJpLT5tYXBfdHlwZSA9IFZNWE5FVDNfTUFQX05PTkU7CisKKwkJZGV2X2RiZygmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCisJCQkidHhkWyV1XTogMHglTHggMHgleCAweCV4XG4iLAorCQkJdHEtPnR4X3JpbmcubmV4dDJmaWxsLCBjdHgtPnNvcF90eGQtPnR4ZC5hZGRyLAorCQkJY3R4LT5zb3BfdHhkLT5kd29yZFsyXSwgY3R4LT5zb3BfdHhkLT5kd29yZFszXSk7CisJCXZteG5ldDNfY21kX3JpbmdfYWR2X25leHQyZmlsbCgmdHEtPnR4X3JpbmcpOworCisJCS8qIHVzZSB0aGUgcmlnaHQgZ2VuIGZvciBub24tU09QIGRlc2MgKi8KKwkJZHcyID0gdHEtPnR4X3JpbmcuZ2VuIDw8IFZNWE5FVDNfVFhEX0dFTl9TSElGVDsKKwl9CisKKwkvKiBsaW5lYXIgcGFydCBjYW4gdXNlIG11bHRpcGxlIHR4IGRlc2MgaWYgaXQncyBiaWcgKi8KKwlsZW4gPSBza2JfaGVhZGxlbihza2IpIC0gY3R4LT5jb3B5X3NpemU7CisJYnVmX29mZnNldCA9IGN0eC0+Y29weV9zaXplOworCXdoaWxlIChsZW4pIHsKKwkJdTMyIGJ1Zl9zaXplOworCisJCWJ1Zl9zaXplID0gbGVuID4gVk1YTkVUM19NQVhfVFhfQlVGX1NJWkUgPworCQkJICAgVk1YTkVUM19NQVhfVFhfQlVGX1NJWkUgOiBsZW47CisKKwkJdGJpID0gdHEtPmJ1Zl9pbmZvICsgdHEtPnR4X3JpbmcubmV4dDJmaWxsOworCQl0YmktPm1hcF90eXBlID0gVk1YTkVUM19NQVBfU0lOR0xFOworCQl0YmktPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwKKwkJCQlza2ItPmRhdGEgKyBidWZfb2Zmc2V0LCBidWZfc2l6ZSwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKworCQl0YmktPmxlbiA9IGJ1Zl9zaXplOyAvKiB0aGlzIGF1dG9tYXRpY2FsbHkgY29udmVydCAyXjE0IHRvIDAgKi8KKworCQlnZGVzYyA9IHRxLT50eF9yaW5nLmJhc2UgKyB0cS0+dHhfcmluZy5uZXh0MmZpbGw7CisJCUJVR19PTihnZGVzYy0+dHhkLmdlbiA9PSB0cS0+dHhfcmluZy5nZW4pOworCisJCWdkZXNjLT50eGQuYWRkciA9IHRiaS0+ZG1hX2FkZHI7CisJCWdkZXNjLT5kd29yZFsyXSA9IGR3MiB8IGJ1Zl9zaXplOworCQlnZGVzYy0+ZHdvcmRbM10gPSAwOworCisJCWRldl9kYmcoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAorCQkJInR4ZFsldV06IDB4JUx4IDB4JXggMHgleFxuIiwKKwkJCXRxLT50eF9yaW5nLm5leHQyZmlsbCwgZ2Rlc2MtPnR4ZC5hZGRyLAorCQkJZ2Rlc2MtPmR3b3JkWzJdLCBnZGVzYy0+ZHdvcmRbM10pOworCQl2bXhuZXQzX2NtZF9yaW5nX2Fkdl9uZXh0MmZpbGwoJnRxLT50eF9yaW5nKTsKKwkJZHcyID0gdHEtPnR4X3JpbmcuZ2VuIDw8IFZNWE5FVDNfVFhEX0dFTl9TSElGVDsKKworCQlsZW4gLT0gYnVmX3NpemU7CisJCWJ1Zl9vZmZzZXQgKz0gYnVmX3NpemU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisKKwkJdGJpID0gdHEtPmJ1Zl9pbmZvICsgdHEtPnR4X3JpbmcubmV4dDJmaWxsOworCQl0YmktPm1hcF90eXBlID0gVk1YTkVUM19NQVBfUEFHRTsKKwkJdGJpLT5kbWFfYWRkciA9IHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBmcmFnLT5wYWdlLAorCQkJCQkgICAgIGZyYWctPnBhZ2Vfb2Zmc2V0LCBmcmFnLT5zaXplLAorCQkJCQkgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCXRiaS0+bGVuID0gZnJhZy0+c2l6ZTsKKworCQlnZGVzYyA9IHRxLT50eF9yaW5nLmJhc2UgKyB0cS0+dHhfcmluZy5uZXh0MmZpbGw7CisJCUJVR19PTihnZGVzYy0+dHhkLmdlbiA9PSB0cS0+dHhfcmluZy5nZW4pOworCisJCWdkZXNjLT50eGQuYWRkciA9IHRiaS0+ZG1hX2FkZHI7CisJCWdkZXNjLT5kd29yZFsyXSA9IGR3MiB8IGZyYWctPnNpemU7CisJCWdkZXNjLT5kd29yZFszXSA9IDA7CisKKwkJZGV2X2RiZygmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCisJCQkidHhkWyV1XTogMHglbGx1ICV1ICV1XG4iLAorCQkJdHEtPnR4X3JpbmcubmV4dDJmaWxsLCBnZGVzYy0+dHhkLmFkZHIsCisJCQlnZGVzYy0+ZHdvcmRbMl0sIGdkZXNjLT5kd29yZFszXSk7CisJCXZteG5ldDNfY21kX3JpbmdfYWR2X25leHQyZmlsbCgmdHEtPnR4X3JpbmcpOworCQlkdzIgPSB0cS0+dHhfcmluZy5nZW4gPDwgVk1YTkVUM19UWERfR0VOX1NISUZUOworCX0KKworCWN0eC0+ZW9wX3R4ZCA9IGdkZXNjOworCisJLyogc2V0IHRoZSBsYXN0IGJ1Zl9pbmZvIGZvciB0aGUgcGt0ICovCisJdGJpLT5za2IgPSBza2I7CisJdGJpLT5zb3BfaWR4ID0gY3R4LT5zb3BfdHhkIC0gdHEtPnR4X3JpbmcuYmFzZTsKK30KKworCisvKgorICogICAgcGFyc2UgYW5kIGNvcHkgcmVsZXZhbnQgcHJvdG9jb2wgaGVhZGVyczoKKyAqICAgICAgRm9yIGEgdHNvIHBrdCwgcmVsZXZhbnQgaGVhZGVycyBhcmUgTDIvMy80IGluY2x1ZGluZyBvcHRpb25zCisgKiAgICAgIEZvciBhIHBrdCByZXF1ZXN0aW5nIGNzdW0gb2ZmbG9hZGluZywgdGhleSBhcmUgTDIvMyBhbmQgbWF5IGluY2x1ZGUgTDQKKyAqICAgICAgaWYgaXQncyBhIFRDUC9VRFAgcGt0CisgKgorICogUmV0dXJuczoKKyAqICAgIC0xOiAgZXJyb3IgaGFwcGVucyBkdXJpbmcgcGFyc2luZworICogICAgIDA6ICBwcm90b2NvbCBoZWFkZXJzIHBhcnNlZCwgYnV0IHRvbyBiaWcgdG8gYmUgY29waWVkCisgKiAgICAgMTogIHByb3RvY29sIGhlYWRlcnMgcGFyc2VkIGFuZCBjb3BpZWQKKyAqCisgKiBPdGhlciBlZmZlY3RzOgorICogICAgMS4gcmVsYXRlZCAqY3R4IGZpZWxkcyBhcmUgdXBkYXRlZC4KKyAqICAgIDIuIGN0eC0+Y29weV9zaXplIGlzICMgb2YgYnl0ZXMgY29waWVkCisgKiAgICAzLiB0aGUgcG9ydGlvbiBjb3BpZWQgaXMgZ3VhcmFudGVlZCB0byBiZSBpbiB0aGUgbGluZWFyIHBhcnQKKyAqCisgKi8KK3N0YXRpYyBpbnQKK3ZteG5ldDNfcGFyc2VfYW5kX2NvcHlfaGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB2bXhuZXQzX3R4X3F1ZXVlICp0cSwKKwkJCSAgIHN0cnVjdCB2bXhuZXQzX3R4X2N0eCAqY3R4LAorCQkJICAgc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgVm14bmV0M19UeERhdGFEZXNjICp0ZGQ7CisKKwlpZiAoY3R4LT5tc3MpIHsKKwkJY3R4LT5ldGhfaXBfaGRyX3NpemUgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCQljdHgtPmw0X2hkcl9zaXplID0gKChzdHJ1Y3QgdGNwaGRyICopCisJCQkJICAgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSktPmRvZmYgKiA0OworCQljdHgtPmNvcHlfc2l6ZSA9IGN0eC0+ZXRoX2lwX2hkcl9zaXplICsgY3R4LT5sNF9oZHJfc2l6ZTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgcHVsbF9zaXplOworCisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCQljdHgtPmV0aF9pcF9oZHJfc2l6ZSA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisKKwkJCWlmIChjdHgtPmlwdjQpIHsKKwkJCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikKKwkJCQkJCSAgICBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkJCQlpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQkJCQlwdWxsX3NpemUgPSBjdHgtPmV0aF9pcF9oZHJfc2l6ZSArCisJCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCisJCQkJCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsCisJCQkJCQkJCXB1bGxfc2l6ZSkpKSB7CisJCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCQljdHgtPmw0X2hkcl9zaXplID0gKChzdHJ1Y3QgdGNwaGRyICopCisJCQkJCSAgIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikpLT5kb2ZmICogNDsKKwkJCQl9IGVsc2UgaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJCQkJY3R4LT5sNF9oZHJfc2l6ZSA9CisJCQkJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQkJCX0gZWxzZSB7CisJCQkJCWN0eC0+bDRfaGRyX3NpemUgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogZm9yIHNpbXBsaWNpdHksIGRvbid0IGNvcHkgTDQgaGVhZGVycyAqLworCQkJCWN0eC0+bDRfaGRyX3NpemUgPSAwOworCQkJfQorCQkJY3R4LT5jb3B5X3NpemUgPSBjdHgtPmV0aF9pcF9oZHJfc2l6ZSArCisJCQkJCSBjdHgtPmw0X2hkcl9zaXplOworCQl9IGVsc2UgeworCQkJY3R4LT5ldGhfaXBfaGRyX3NpemUgPSAwOworCQkJY3R4LT5sNF9oZHJfc2l6ZSA9IDA7CisJCQkvKiBjb3B5IGFzIG11Y2ggYXMgYWxsb3dlZCAqLworCQkJY3R4LT5jb3B5X3NpemUgPSBtaW4oKHVuc2lnbmVkIGludClWTVhORVQzX0hEUl9DT1BZX1NJWkUKKwkJCQkJICAgICAsIHNrYl9oZWFkbGVuKHNrYikpOworCQl9CisKKwkJLyogbWFrZSBzdXJlIGhlYWRlcnMgYXJlIGFjY2Vzc2libGUgZGlyZWN0bHkgKi8KKwkJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgY3R4LT5jb3B5X3NpemUpKSkKKwkJCWdvdG8gZXJyOworCX0KKworCWlmICh1bmxpa2VseShjdHgtPmNvcHlfc2l6ZSA+IFZNWE5FVDNfSERSX0NPUFlfU0laRSkpIHsKKwkJdHEtPnN0YXRzLm92ZXJzaXplZF9oZHIrKzsKKwkJY3R4LT5jb3B5X3NpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwl0ZGQgPSB0cS0+ZGF0YV9yaW5nLmJhc2UgKyB0cS0+dHhfcmluZy5uZXh0MmZpbGw7CisKKwltZW1jcHkodGRkLT5kYXRhLCBza2ItPmRhdGEsIGN0eC0+Y29weV9zaXplKTsKKwlkZXZfZGJnKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKKwkJImNvcHkgJXUgYnl0ZXMgdG8gZGF0YVJpbmdbJXVdXG4iLAorCQljdHgtPmNvcHlfc2l6ZSwgdHEtPnR4X3JpbmcubmV4dDJmaWxsKTsKKwlyZXR1cm4gMTsKKworZXJyOgorCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19wcmVwYXJlX3RzbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgc3RydWN0IHZteG5ldDNfdHhfY3R4ICpjdHgpCit7CisJc3RydWN0IHRjcGhkciAqdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlpZiAoY3R4LT5pcHY0KSB7CisJCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCQlpcGgtPmNoZWNrID0gMDsKKwkJdGNwaC0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgMCwKKwkJCQkJCSBJUFBST1RPX1RDUCwgMCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCQl0Y3BoLT5jaGVjayA9IH5jc3VtX2lwdjZfbWFnaWMoJmlwaC0+c2FkZHIsICZpcGgtPmRhZGRyLCAwLAorCQkJCQkgICAgICAgSVBQUk9UT19UQ1AsIDApOworCX0KK30KKworCisvKgorICogVHJhbnNtaXRzIGEgcGt0IHRocnUgYSBnaXZlbiB0cQorICogUmV0dXJuczoKKyAqICAgIE5FVERFVl9UWF9PSzogICAgICBkZXNjcmlwdG9ycyBhcmUgc2V0dXAgc3VjY2Vzc2Z1bGx5CisgKiAgICBORVRERVZfVFhfT0s6ICAgICAgZXJyb3Igb2NjdXJlZCwgdGhlIHBrdCBpcyBkcm9wcGVkCisgKiAgICBORVRERVZfVFhfQlVTWTogICAgdHggcmluZyBpcyBmdWxsLCBxdWV1ZSBpcyBzdG9wcGVkCisgKgorICogU2lkZS1lZmZlY3RzOgorICogICAgMS4gdHggcmluZyBtYXkgYmUgY2hhbmdlZAorICogICAgMi4gdHEgc3RhdHMgbWF5IGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkKKyAqICAgIDMuIHNoYXJlZC0+dHhOdW1EZWZlcnJlZCBtYXkgYmUgdXBkYXRlZAorICovCisKK3N0YXRpYyBpbnQKK3ZteG5ldDNfdHFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgdm14bmV0M190eF9xdWV1ZSAqdHEsCisJCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaW50IHJldDsKKwl1MzIgY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgdm14bmV0M190eF9jdHggY3R4OworCXVuaW9uIFZteG5ldDNfR2VuZXJpY0Rlc2MgKmdkZXNjOworCisJLyogY29uc2VydmF0aXZlbHkgZXN0aW1hdGUgIyBvZiBkZXNjcmlwdG9ycyB0byB1c2UgKi8KKwljb3VudCA9IFZNWE5FVDNfVFhEX05FRURFRChza2JfaGVhZGxlbihza2IpKSArCisJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxOworCisJY3R4LmlwdjQgPSAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X250b2hzKEVUSF9QX0lQKSk7CisKKwljdHgubXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwlpZiAoY3R4Lm1zcykgeworCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgeworCQkJaWYgKHVubGlrZWx5KHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLAorCQkJCQkJICAgICAgR0ZQX0FUT01JQykgIT0gMCkpIHsKKwkJCQl0cS0+c3RhdHMuZHJvcF90c28rKzsKKwkJCQlnb3RvIGRyb3BfcGt0OworCQkJfQorCQkJdHEtPnN0YXRzLmNvcHlfc2tiX2hlYWRlcisrOworCQl9CisJCXZteG5ldDNfcHJlcGFyZV90c28oc2tiLCAmY3R4KTsKKwl9IGVsc2UgeworCQlpZiAodW5saWtlbHkoY291bnQgPiBWTVhORVQzX01BWF9UWERfUEVSX1BLVCkpIHsKKworCQkJLyogbm9uLXRzbyBwa3RzIG11c3Qgbm90IHVzZSBtb3JlIHRoYW4KKwkJCSAqIFZNWE5FVDNfTUFYX1RYRF9QRVJfUEtUIGVudHJpZXMKKwkJCSAqLworCQkJaWYgKHNrYl9saW5lYXJpemUoc2tiKSAhPSAwKSB7CisJCQkJdHEtPnN0YXRzLmRyb3BfdG9vX21hbnlfZnJhZ3MrKzsKKwkJCQlnb3RvIGRyb3BfcGt0OworCQkJfQorCQkJdHEtPnN0YXRzLmxpbmVhcml6ZWQrKzsKKworCQkJLyogcmVjYWxjdWxhdGUgdGhlICMgb2YgZGVzY3JpcHRvcnMgdG8gdXNlICovCisJCQljb3VudCA9IFZNWE5FVDNfVFhEX05FRURFRChza2JfaGVhZGxlbihza2IpKSArIDE7CisJCX0KKwl9CisKKwlyZXQgPSB2bXhuZXQzX3BhcnNlX2FuZF9jb3B5X2hkcihza2IsIHRxLCAmY3R4LCBhZGFwdGVyKTsKKwlpZiAocmV0ID49IDApIHsKKwkJQlVHX09OKHJldCA8PSAwICYmIGN0eC5jb3B5X3NpemUgIT0gMCk7CisJCS8qIGhkcnMgcGFyc2VkLCBjaGVjayBhZ2FpbnN0IG90aGVyIGxpbWl0cyAqLworCQlpZiAoY3R4Lm1zcykgeworCQkJaWYgKHVubGlrZWx5KGN0eC5ldGhfaXBfaGRyX3NpemUgKyBjdHgubDRfaGRyX3NpemUgPgorCQkJCSAgICAgVk1YTkVUM19NQVhfVFhfQlVGX1NJWkUpKSB7CisJCQkJZ290byBoZHJfdG9vX2JpZzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCQkJaWYgKHVubGlrZWx5KGN0eC5ldGhfaXBfaGRyX3NpemUgKworCQkJCQkgICAgIHNrYi0+Y3N1bV9vZmZzZXQgPgorCQkJCQkgICAgIFZNWE5FVDNfTUFYX0NTVU1fT0ZGU0VUKSkgeworCQkJCQlnb3RvIGhkcl90b29fYmlnOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXRxLT5zdGF0cy5kcm9wX2hkcl9pbnNwZWN0X2VycisrOworCQlnb3RvIGRyb3BfcGt0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cS0+dHhfbG9jaywgZmxhZ3MpOworCisJaWYgKGNvdW50ID4gdm14bmV0M19jbWRfcmluZ19kZXNjX2F2YWlsKCZ0cS0+dHhfcmluZykpIHsKKwkJdHEtPnN0YXRzLnR4X3JpbmdfZnVsbCsrOworCQlkZXZfZGJnKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKKwkJCSJ0eCBxdWV1ZSBzdG9wcGVkIG9uICVzLCBuZXh0MmNvbXAgJXUiCisJCQkiIG5leHQyZmlsbCAldVxuIiwgYWRhcHRlci0+bmV0ZGV2LT5uYW1lLAorCQkJdHEtPnR4X3JpbmcubmV4dDJjb21wLCB0cS0+dHhfcmluZy5uZXh0MmZpbGwpOworCisJCXZteG5ldDNfdHFfc3RvcCh0cSwgYWRhcHRlcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRxLT50eF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwkvKiBmaWxsIHR4IGRlc2NzIHJlbGF0ZWQgdG8gYWRkciAmIGxlbiAqLworCXZteG5ldDNfbWFwX3BrdChza2IsICZjdHgsIHRxLCBhZGFwdGVyLT5wZGV2LCBhZGFwdGVyKTsKKworCS8qIHNldHVwIHRoZSBFT1AgZGVzYyAqLworCWN0eC5lb3BfdHhkLT5kd29yZFszXSA9IFZNWE5FVDNfVFhEX0NRIHwgVk1YTkVUM19UWERfRU9QOworCisJLyogc2V0dXAgdGhlIFNPUCBkZXNjICovCisJZ2Rlc2MgPSBjdHguc29wX3R4ZDsKKwlpZiAoY3R4Lm1zcykgeworCQlnZGVzYy0+dHhkLmhsZW4gPSBjdHguZXRoX2lwX2hkcl9zaXplICsgY3R4Lmw0X2hkcl9zaXplOworCQlnZGVzYy0+dHhkLm9tID0gVk1YTkVUM19PTV9UU087CisJCWdkZXNjLT50eGQubXNzY29mID0gY3R4Lm1zczsKKwkJdHEtPnNoYXJlZC0+dHhOdW1EZWZlcnJlZCArPSAoc2tiLT5sZW4gLSBnZGVzYy0+dHhkLmhsZW4gKworCQkJCQkgICAgIGN0eC5tc3MgLSAxKSAvIGN0eC5tc3M7CisJfSBlbHNlIHsKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJCWdkZXNjLT50eGQuaGxlbiA9IGN0eC5ldGhfaXBfaGRyX3NpemU7CisJCQlnZGVzYy0+dHhkLm9tID0gVk1YTkVUM19PTV9DU1VNOworCQkJZ2Rlc2MtPnR4ZC5tc3Njb2YgPSBjdHguZXRoX2lwX2hkcl9zaXplICsKKwkJCQkJICAgIHNrYi0+Y3N1bV9vZmZzZXQ7CisJCX0gZWxzZSB7CisJCQlnZGVzYy0+dHhkLm9tID0gMDsKKwkJCWdkZXNjLT50eGQubXNzY29mID0gMDsKKwkJfQorCQl0cS0+c2hhcmVkLT50eE51bURlZmVycmVkKys7CisJfQorCisJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQlnZGVzYy0+dHhkLnRpID0gMTsKKwkJZ2Rlc2MtPnR4ZC50Y2kgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwl9CisKKwl3bWIoKTsKKworCS8qIGZpbmFsbHkgZmxpcHMgdGhlIEdFTiBiaXQgb2YgdGhlIFNPUCBkZXNjICovCisJZ2Rlc2MtPmR3b3JkWzJdIF49IFZNWE5FVDNfVFhEX0dFTjsKKwlkZXZfZGJnKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKKwkJInR4ZFsldV06IFNPUCAweCVMeCAweCV4IDB4JXhcbiIsCisJCSh1MzIpKCh1bmlvbiBWbXhuZXQzX0dlbmVyaWNEZXNjICopY3R4LnNvcF90eGQgLQorCQl0cS0+dHhfcmluZy5iYXNlKSwgZ2Rlc2MtPnR4ZC5hZGRyLCBnZGVzYy0+ZHdvcmRbMl0sCisJCWdkZXNjLT5kd29yZFszXSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cS0+dHhfbG9jaywgZmxhZ3MpOworCisJaWYgKHRxLT5zaGFyZWQtPnR4TnVtRGVmZXJyZWQgPj0gdHEtPnNoYXJlZC0+dHhUaHJlc2hvbGQpIHsKKwkJdHEtPnNoYXJlZC0+dHhOdW1EZWZlcnJlZCA9IDA7CisJCVZNWE5FVDNfV1JJVEVfQkFSMF9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfVFhQUk9ELAorCQkJCSAgICAgICB0cS0+dHhfcmluZy5uZXh0MmZpbGwpOworCX0KKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiBORVRERVZfVFhfT0s7CisKK2hkcl90b29fYmlnOgorCXRxLT5zdGF0cy5kcm9wX292ZXJzaXplZF9oZHIrKzsKK2Ryb3BfcGt0OgorCXRxLT5zdGF0cy5kcm9wX3RvdGFsKys7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKworc3RhdGljIG5ldGRldl90eF90Cit2bXhuZXQzX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgdm14bmV0M190eF9xdWV1ZSAqdHEgPSAmYWRhcHRlci0+dHhfcXVldWU7CisKKwlyZXR1cm4gdm14bmV0M190cV94bWl0KHNrYiwgdHEsIGFkYXB0ZXIsIG5ldGRldik7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfcnhfY3N1bShzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyLAorCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQl1bmlvbiBWbXhuZXQzX0dlbmVyaWNEZXNjICpnZGVzYykKK3sKKwlpZiAoIWdkZXNjLT5yY2QuY25jICYmIGFkYXB0ZXItPnJ4Y3N1bSkgeworCQkvKiB0eXBpY2FsIGNhc2U6IFRDUC9VRFAgb3ZlciBJUCBhbmQgYm90aCBjc3VtcyBhcmUgY29ycmVjdCAqLworCQlpZiAoKGdkZXNjLT5kd29yZFszXSAmIFZNWE5FVDNfUkNEX0NTVU1fT0spID09CisJCQkJCQkJVk1YTkVUM19SQ0RfQ1NVTV9PSykgeworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCUJVR19PTighKGdkZXNjLT5yY2QudGNwIHx8IGdkZXNjLT5yY2QudWRwKSk7CisJCQlCVUdfT04oIShnZGVzYy0+cmNkLnY0ICB8fCBnZGVzYy0+cmNkLnY2KSk7CisJCQlCVUdfT04oZ2Rlc2MtPnJjZC5mcmcpOworCQl9IGVsc2UgeworCQkJaWYgKGdkZXNjLT5yY2QuY3N1bSkgeworCQkJCXNrYi0+Y3N1bSA9IGh0b25zKGdkZXNjLT5yY2QuY3N1bSk7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOworCQkJfSBlbHNlIHsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfQorfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX3J4X2Vycm9yKHN0cnVjdCB2bXhuZXQzX3J4X3F1ZXVlICpycSwgc3RydWN0IFZteG5ldDNfUnhDb21wRGVzYyAqcmNkLAorCQkgc3RydWN0IHZteG5ldDNfcnhfY3R4ICpjdHgsICBzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCXJxLT5zdGF0cy5kcm9wX2VycisrOworCWlmICghcmNkLT5mY3MpCisJCXJxLT5zdGF0cy5kcm9wX2ZjcysrOworCisJcnEtPnN0YXRzLmRyb3BfdG90YWwrKzsKKworCS8qCisJICogV2UgZG8gbm90IHVubWFwIGFuZCBjaGFpbiB0aGUgcnggYnVmZmVyIHRvIHRoZSBza2IuCisJICogV2UgYmFzaWNhbGx5IHByZXRlbmQgdGhpcyBidWZmZXIgaXMgbm90IHVzZWQgYW5kIHdpbGwgYmUgcmVjeWNsZWQKKwkgKiBieSB2bXhuZXQzX3JxX2FsbG9jX3J4X2J1ZigpCisJICovCisKKwkvKgorCSAqIGN0eC0+c2tiIG1heSBiZSBOVUxMIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFuZCB0aGUgb25seSBvbmUKKwkgKiBkZXNjIGZvciB0aGUgcGt0CisJICovCisJaWYgKGN0eC0+c2tiKQorCQlkZXZfa2ZyZWVfc2tiX2lycShjdHgtPnNrYik7CisKKwljdHgtPnNrYiA9IE5VTEw7Cit9CisKKworc3RhdGljIGludAordm14bmV0M19ycV9yeF9jb21wbGV0ZShzdHJ1Y3Qgdm14bmV0M19yeF9xdWV1ZSAqcnEsCisJCSAgICAgICBzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyLCBpbnQgcXVvdGEpCit7CisJc3RhdGljIHUzMiByeHByb2RfcmVnWzJdID0ge1ZNWE5FVDNfUkVHX1JYUFJPRCwgVk1YTkVUM19SRUdfUlhQUk9EMn07CisJdTMyIG51bV9yeGQgPSAwOworCXN0cnVjdCBWbXhuZXQzX1J4Q29tcERlc2MgKnJjZDsKKwlzdHJ1Y3Qgdm14bmV0M19yeF9jdHggKmN0eCA9ICZycS0+cnhfY3R4OworCisJcmNkID0gJnJxLT5jb21wX3JpbmcuYmFzZVtycS0+Y29tcF9yaW5nLm5leHQycHJvY10ucmNkOworCXdoaWxlIChyY2QtPmdlbiA9PSBycS0+Y29tcF9yaW5nLmdlbikgeworCQlzdHJ1Y3Qgdm14bmV0M19yeF9idWZfaW5mbyAqcmJpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgbnVtX3RvX2FsbG9jOworCQlzdHJ1Y3QgVm14bmV0M19SeERlc2MgKnJ4ZDsKKwkJdTMyIGlkeCwgcmluZ19pZHg7CisKKwkJaWYgKG51bV9yeGQgPj0gcXVvdGEpIHsKKwkJCS8qIHdlIG1heSBzdG9wIGV2ZW4gYmVmb3JlIHdlIHNlZSB0aGUgRU9QIGRlc2Mgb2YKKwkJCSAqIHRoZSBjdXJyZW50IHBrdAorCQkJICovCisJCQlicmVhazsKKwkJfQorCQludW1fcnhkKys7CisKKwkJaWR4ID0gcmNkLT5yeGRJZHg7CisJCXJpbmdfaWR4ID0gcmNkLT5ycUlEID09IHJxLT5xaWQgPyAwIDogMTsKKworCQlyeGQgPSAmcnEtPnJ4X3JpbmdbcmluZ19pZHhdLmJhc2VbaWR4XS5yeGQ7CisJCXJiaSA9IHJxLT5idWZfaW5mb1tyaW5nX2lkeF0gKyBpZHg7CisKKwkJQlVHX09OKHJ4ZC0+YWRkciAhPSByYmktPmRtYV9hZGRyIHx8IHJ4ZC0+bGVuICE9IHJiaS0+bGVuKTsKKworCQlpZiAodW5saWtlbHkocmNkLT5lb3AgJiYgcmNkLT5lcnIpKSB7CisJCQl2bXhuZXQzX3J4X2Vycm9yKHJxLCByY2QsIGN0eCwgYWRhcHRlcik7CisJCQlnb3RvIHJjZF9kb25lOworCQl9CisKKwkJaWYgKHJjZC0+c29wKSB7IC8qIGZpcnN0IGJ1ZiBvZiB0aGUgcGt0ICovCisJCQlCVUdfT04ocnhkLT5idHlwZSAhPSBWTVhORVQzX1JYRF9CVFlQRV9IRUFEIHx8CisJCQkgICAgICAgcmNkLT5ycUlEICE9IHJxLT5xaWQpOworCisJCQlCVUdfT04ocmJpLT5idWZfdHlwZSAhPSBWTVhORVQzX1JYX0JVRl9TS0IpOworCQkJQlVHX09OKGN0eC0+c2tiICE9IE5VTEwgfHwgcmJpLT5za2IgPT0gTlVMTCk7CisKKwkJCWlmICh1bmxpa2VseShyY2QtPmxlbiA9PSAwKSkgeworCQkJCS8qIFByZXRlbmQgdGhlIHJ4IGJ1ZmZlciBpcyBza2lwcGVkLiAqLworCQkJCUJVR19PTighKHJjZC0+c29wICYmIHJjZC0+ZW9wKSk7CisJCQkJZGV2X2RiZygmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCisJCQkJCSJyeFJpbmdbJXVdWyV1XSAwIGxlbmd0aFxuIiwKKwkJCQkJcmluZ19pZHgsIGlkeCk7CisJCQkJZ290byByY2RfZG9uZTsKKwkJCX0KKworCQkJY3R4LT5za2IgPSByYmktPnNrYjsKKwkJCXJiaS0+c2tiID0gTlVMTDsKKworCQkJcGNpX3VubWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LCByYmktPmRtYV9hZGRyLCByYmktPmxlbiwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCXNrYl9wdXQoY3R4LT5za2IsIHJjZC0+bGVuKTsKKwkJfSBlbHNlIHsKKwkJCUJVR19PTihjdHgtPnNrYiA9PSBOVUxMKTsKKwkJCS8qIG5vbiBTT1AgYnVmZmVyIG11c3QgYmUgdHlwZSAxIGluIG1vc3QgY2FzZXMgKi8KKwkJCWlmIChyYmktPmJ1Zl90eXBlID09IFZNWE5FVDNfUlhfQlVGX1BBR0UpIHsKKwkJCQlCVUdfT04ocnhkLT5idHlwZSAhPSBWTVhORVQzX1JYRF9CVFlQRV9CT0RZKTsKKworCQkJCWlmIChyY2QtPmxlbikgeworCQkJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCQkJICAgICAgIHJiaS0+ZG1hX2FkZHIsIHJiaS0+bGVuLAorCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCQkJdm14bmV0M19hcHBlbmRfZnJhZyhjdHgtPnNrYiwgcmNkLCByYmkpOworCQkJCQlyYmktPnBhZ2UgPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgb25seSB0aW1lIGEgbm9uLVNPUCBidWZmZXIgaXMgdHlwZSAwIGlzCisJCQkJICogd2hlbiBpdCdzIEVPUCBhbmQgZXJyb3IgZmxhZyBpcyByYWlzZWQsIHdoaWNoCisJCQkJICogaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkLgorCQkJCSAqLworCQkJCUJVR19PTih0cnVlKTsKKwkJCX0KKwkJfQorCisJCXNrYiA9IGN0eC0+c2tiOworCQlpZiAocmNkLT5lb3ApIHsKKwkJCXNrYi0+bGVuICs9IHNrYi0+ZGF0YV9sZW47CisJCQlza2ItPnRydWVzaXplICs9IHNrYi0+ZGF0YV9sZW47CisKKwkJCXZteG5ldDNfcnhfY3N1bShhZGFwdGVyLCBza2IsCisJCQkJCSh1bmlvbiBWbXhuZXQzX0dlbmVyaWNEZXNjICopcmNkKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGFkYXB0ZXItPm5ldGRldik7CisKKwkJCWlmICh1bmxpa2VseShhZGFwdGVyLT52bGFuX2dycCAmJiByY2QtPnRzKSkgeworCQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsCisJCQkJCQlhZGFwdGVyLT52bGFuX2dycCwgcmNkLT50Y2kpOworCQkJfSBlbHNlIHsKKwkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQkJfQorCisJCQlhZGFwdGVyLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJY3R4LT5za2IgPSBOVUxMOworCQl9CisKK3JjZF9kb25lOgorCQkvKiBkZXZpY2UgbWF5IHNraXAgc29tZSByeCBkZXNjcyAqLworCQlycS0+cnhfcmluZ1tyaW5nX2lkeF0ubmV4dDJjb21wID0gaWR4OworCQlWTVhORVQzX0lOQ19SSU5HX0lEWF9PTkxZKHJxLT5yeF9yaW5nW3JpbmdfaWR4XS5uZXh0MmNvbXAsCisJCQkJCSAgcnEtPnJ4X3JpbmdbcmluZ19pZHhdLnNpemUpOworCisJCS8qIHJlZmlsbCByeCBidWZmZXJzIGZyZXF1ZW50bHkgdG8gYXZvaWQgc3RhcnZpbmcgdGhlIGgvdyAqLworCQludW1fdG9fYWxsb2MgPSB2bXhuZXQzX2NtZF9yaW5nX2Rlc2NfYXZhaWwocnEtPnJ4X3JpbmcgKworCQkJCQkJCSAgIHJpbmdfaWR4KTsKKwkJaWYgKHVubGlrZWx5KG51bV90b19hbGxvYyA+IFZNWE5FVDNfUlhfQUxMT0NfVEhSRVNIT0xEKHJxLAorCQkJCQkJCXJpbmdfaWR4LCBhZGFwdGVyKSkpIHsKKwkJCXZteG5ldDNfcnFfYWxsb2NfcnhfYnVmKHJxLCByaW5nX2lkeCwgbnVtX3RvX2FsbG9jLAorCQkJCQkJYWRhcHRlcik7CisKKwkJCS8qIGlmIG5lZWRlZCwgdXBkYXRlIHRoZSByZWdpc3RlciAqLworCQkJaWYgKHVubGlrZWx5KHJxLT5zaGFyZWQtPnVwZGF0ZVJ4UHJvZCkpIHsKKwkJCQlWTVhORVQzX1dSSVRFX0JBUjBfUkVHKGFkYXB0ZXIsCisJCQkJCXJ4cHJvZF9yZWdbcmluZ19pZHhdICsgcnEtPnFpZCAqIDgsCisJCQkJCXJxLT5yeF9yaW5nW3JpbmdfaWR4XS5uZXh0MmZpbGwpOworCQkJCXJxLT51bmNvbW1pdHRlZFtyaW5nX2lkeF0gPSAwOworCQkJfQorCQl9CisKKwkJdm14bmV0M19jb21wX3JpbmdfYWR2X25leHQycHJvYygmcnEtPmNvbXBfcmluZyk7CisJCXJjZCA9ICZycS0+Y29tcF9yaW5nLmJhc2VbcnEtPmNvbXBfcmluZy5uZXh0MnByb2NdLnJjZDsKKwl9CisKKwlyZXR1cm4gbnVtX3J4ZDsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19ycV9jbGVhbnVwKHN0cnVjdCB2bXhuZXQzX3J4X3F1ZXVlICpycSwKKwkJICAgc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgaSwgcmluZ19pZHg7CisJc3RydWN0IFZteG5ldDNfUnhEZXNjICpyeGQ7CisKKwlmb3IgKHJpbmdfaWR4ID0gMDsgcmluZ19pZHggPCAyOyByaW5nX2lkeCsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBycS0+cnhfcmluZ1tyaW5nX2lkeF0uc2l6ZTsgaSsrKSB7CisJCQlyeGQgPSAmcnEtPnJ4X3JpbmdbcmluZ19pZHhdLmJhc2VbaV0ucnhkOworCisJCQlpZiAocnhkLT5idHlwZSA9PSBWTVhORVQzX1JYRF9CVFlQRV9IRUFEICYmCisJCQkJCXJxLT5idWZfaW5mb1tyaW5nX2lkeF1baV0uc2tiKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LCByeGQtPmFkZHIsCisJCQkJCQkgcnhkLT5sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYihycS0+YnVmX2luZm9bcmluZ19pZHhdW2ldLnNrYik7CisJCQkJcnEtPmJ1Zl9pbmZvW3JpbmdfaWR4XVtpXS5za2IgPSBOVUxMOworCQkJfSBlbHNlIGlmIChyeGQtPmJ0eXBlID09IFZNWE5FVDNfUlhEX0JUWVBFX0JPRFkgJiYKKwkJCQkJcnEtPmJ1Zl9pbmZvW3JpbmdfaWR4XVtpXS5wYWdlKSB7CisJCQkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgcnhkLT5hZGRyLAorCQkJCQkgICAgICAgcnhkLT5sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJcHV0X3BhZ2UocnEtPmJ1Zl9pbmZvW3JpbmdfaWR4XVtpXS5wYWdlKTsKKwkJCQlycS0+YnVmX2luZm9bcmluZ19pZHhdW2ldLnBhZ2UgPSBOVUxMOworCQkJfQorCQl9CisKKwkJcnEtPnJ4X3JpbmdbcmluZ19pZHhdLmdlbiA9IFZNWE5FVDNfSU5JVF9HRU47CisJCXJxLT5yeF9yaW5nW3JpbmdfaWR4XS5uZXh0MmZpbGwgPQorCQkJCQlycS0+cnhfcmluZ1tyaW5nX2lkeF0ubmV4dDJjb21wID0gMDsKKwkJcnEtPnVuY29tbWl0dGVkW3JpbmdfaWR4XSA9IDA7CisJfQorCisJcnEtPmNvbXBfcmluZy5nZW4gPSBWTVhORVQzX0lOSVRfR0VOOworCXJxLT5jb21wX3JpbmcubmV4dDJwcm9jID0gMDsKK30KKworCit2b2lkIHZteG5ldDNfcnFfZGVzdHJveShzdHJ1Y3Qgdm14bmV0M19yeF9xdWV1ZSAqcnEsCisJCQlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCWludCBqOworCisJLyogYWxsIHJ4IGJ1ZmZlcnMgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBmcmVlZCAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKHJxLT5idWZfaW5mb1tpXSkgeworCQkJZm9yIChqID0gMDsgaiA8IHJxLT5yeF9yaW5nW2ldLnNpemU7IGorKykKKwkJCQlCVUdfT04ocnEtPmJ1Zl9pbmZvW2ldW2pdLnBhZ2UgIT0gTlVMTCk7CisJCX0KKwl9CisKKworCWtmcmVlKHJxLT5idWZfaW5mb1swXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmIChycS0+cnhfcmluZ1tpXS5iYXNlKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHJxLT5yeF9yaW5nW2ldLnNpemUKKwkJCQkJICAgICogc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1J4RGVzYyksCisJCQkJCSAgICBycS0+cnhfcmluZ1tpXS5iYXNlLAorCQkJCQkgICAgcnEtPnJ4X3JpbmdbaV0uYmFzZVBBKTsKKwkJCXJxLT5yeF9yaW5nW2ldLmJhc2UgPSBOVUxMOworCQl9CisJCXJxLT5idWZfaW5mb1tpXSA9IE5VTEw7CisJfQorCisJaWYgKHJxLT5jb21wX3JpbmcuYmFzZSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHJxLT5jb21wX3Jpbmcuc2l6ZSAqCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgVm14bmV0M19SeENvbXBEZXNjKSwKKwkJCQkgICAgcnEtPmNvbXBfcmluZy5iYXNlLCBycS0+Y29tcF9yaW5nLmJhc2VQQSk7CisJCXJxLT5jb21wX3JpbmcuYmFzZSA9IE5VTEw7CisJfQorfQorCisKK3N0YXRpYyBpbnQKK3ZteG5ldDNfcnFfaW5pdChzdHJ1Y3Qgdm14bmV0M19yeF9xdWV1ZSAqcnEsCisJCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgICphZGFwdGVyKQoreworCWludCBpOworCisJLyogaW5pdGlhbGl6ZSBidWZfaW5mbyAqLworCWZvciAoaSA9IDA7IGkgPCBycS0+cnhfcmluZ1swXS5zaXplOyBpKyspIHsKKworCQkvKiAxc3QgYnVmIGZvciBhIHBrdCBpcyBza2J1ZmYgKi8KKwkJaWYgKGkgJSBhZGFwdGVyLT5yeF9idWZfcGVyX3BrdCA9PSAwKSB7CisJCQlycS0+YnVmX2luZm9bMF1baV0uYnVmX3R5cGUgPSBWTVhORVQzX1JYX0JVRl9TS0I7CisJCQlycS0+YnVmX2luZm9bMF1baV0ubGVuID0gYWRhcHRlci0+c2tiX2J1Zl9zaXplOworCQl9IGVsc2UgeyAvKiBzdWJzZXF1ZW50IGJ1ZnMgZm9yIGEgcGt0IGlzIGZyYWcgKi8KKwkJCXJxLT5idWZfaW5mb1swXVtpXS5idWZfdHlwZSA9IFZNWE5FVDNfUlhfQlVGX1BBR0U7CisJCQlycS0+YnVmX2luZm9bMF1baV0ubGVuID0gUEFHRV9TSVpFOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBycS0+cnhfcmluZ1sxXS5zaXplOyBpKyspIHsKKwkJcnEtPmJ1Zl9pbmZvWzFdW2ldLmJ1Zl90eXBlID0gVk1YTkVUM19SWF9CVUZfUEFHRTsKKwkJcnEtPmJ1Zl9pbmZvWzFdW2ldLmxlbiA9IFBBR0VfU0laRTsKKwl9CisKKwkvKiByZXNldCBpbnRlcm5hbCBzdGF0ZSBhbmQgYWxsb2NhdGUgYnVmZmVycyBmb3IgYm90aCByaW5ncyAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcnEtPnJ4X3JpbmdbaV0ubmV4dDJmaWxsID0gcnEtPnJ4X3JpbmdbaV0ubmV4dDJjb21wID0gMDsKKwkJcnEtPnVuY29tbWl0dGVkW2ldID0gMDsKKworCQltZW1zZXQocnEtPnJ4X3JpbmdbaV0uYmFzZSwgMCwgcnEtPnJ4X3JpbmdbaV0uc2l6ZSAqCisJCSAgICAgICBzaXplb2Yoc3RydWN0IFZteG5ldDNfUnhEZXNjKSk7CisJCXJxLT5yeF9yaW5nW2ldLmdlbiA9IFZNWE5FVDNfSU5JVF9HRU47CisJfQorCWlmICh2bXhuZXQzX3JxX2FsbG9jX3J4X2J1ZihycSwgMCwgcnEtPnJ4X3JpbmdbMF0uc2l6ZSAtIDEsCisJCQkJICAgIGFkYXB0ZXIpID09IDApIHsKKwkJLyogYXQgbGVhc3QgaGFzIDEgcnggYnVmZmVyIGZvciB0aGUgMXN0IHJpbmcgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXZteG5ldDNfcnFfYWxsb2NfcnhfYnVmKHJxLCAxLCBycS0+cnhfcmluZ1sxXS5zaXplIC0gMSwgYWRhcHRlcik7CisKKwkvKiByZXNldCB0aGUgY29tcCByaW5nICovCisJcnEtPmNvbXBfcmluZy5uZXh0MnByb2MgPSAwOworCW1lbXNldChycS0+Y29tcF9yaW5nLmJhc2UsIDAsIHJxLT5jb21wX3Jpbmcuc2l6ZSAqCisJICAgICAgIHNpemVvZihzdHJ1Y3QgVm14bmV0M19SeENvbXBEZXNjKSk7CisJcnEtPmNvbXBfcmluZy5nZW4gPSBWTVhORVQzX0lOSVRfR0VOOworCisJLyogcmVzZXQgcnhjdHggKi8KKwlycS0+cnhfY3R4LnNrYiA9IE5VTEw7CisKKwkvKiBzdGF0cyBhcmUgbm90IHJlc2V0ICovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAordm14bmV0M19ycV9jcmVhdGUoc3RydWN0IHZteG5ldDNfcnhfcXVldWUgKnJxLCBzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCXNpemVfdCBzejsKKwlzdHJ1Y3Qgdm14bmV0M19yeF9idWZfaW5mbyAqYmk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisKKwkJc3ogPSBycS0+cnhfcmluZ1tpXS5zaXplICogc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1J4RGVzYyk7CisJCXJxLT5yeF9yaW5nW2ldLmJhc2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBzeiwKKwkJCQkJCQkmcnEtPnJ4X3JpbmdbaV0uYmFzZVBBKTsKKwkJaWYgKCFycS0+cnhfcmluZ1tpXS5iYXNlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgcnggcmluZyAlZFxuIiwKKwkJCSAgICAgICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsIGkpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlzeiA9IHJxLT5jb21wX3Jpbmcuc2l6ZSAqIHNpemVvZihzdHJ1Y3QgVm14bmV0M19SeENvbXBEZXNjKTsKKwlycS0+Y29tcF9yaW5nLmJhc2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBzeiwKKwkJCQkJCSAgJnJxLT5jb21wX3JpbmcuYmFzZVBBKTsKKwlpZiAoIXJxLT5jb21wX3JpbmcuYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgcnggY29tcCByaW5nXG4iLAorCQkgICAgICAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKKwkJZ290byBlcnI7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IHZteG5ldDNfcnhfYnVmX2luZm8pICogKHJxLT5yeF9yaW5nWzBdLnNpemUgKworCQkJCQkJICAgcnEtPnJ4X3JpbmdbMV0uc2l6ZSk7CisJYmkgPSBrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSByeCBidWZpbmZvXG4iLAorCQkgICAgICAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKKwkJZ290byBlcnI7CisJfQorCW1lbXNldChiaSwgMCwgc3opOworCXJxLT5idWZfaW5mb1swXSA9IGJpOworCXJxLT5idWZfaW5mb1sxXSA9IGJpICsgcnEtPnJ4X3JpbmdbMF0uc2l6ZTsKKworCXJldHVybiAwOworCitlcnI6CisJdm14bmV0M19ycV9kZXN0cm95KHJxLCBhZGFwdGVyKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCitzdGF0aWMgaW50Cit2bXhuZXQzX2RvX3BvbGwoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciwgaW50IGJ1ZGdldCkKK3sKKwlpZiAodW5saWtlbHkoYWRhcHRlci0+c2hhcmVkLT5lY3IpKQorCQl2bXhuZXQzX3Byb2Nlc3NfZXZlbnRzKGFkYXB0ZXIpOworCisJdm14bmV0M190cV90eF9jb21wbGV0ZSgmYWRhcHRlci0+dHhfcXVldWUsIGFkYXB0ZXIpOworCXJldHVybiB2bXhuZXQzX3JxX3J4X2NvbXBsZXRlKCZhZGFwdGVyLT5yeF9xdWV1ZSwgYWRhcHRlciwgYnVkZ2V0KTsKK30KKworCitzdGF0aWMgaW50Cit2bXhuZXQzX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2YobmFwaSwKKwkJCQkJICBzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyLCBuYXBpKTsKKwlpbnQgcnhkX2RvbmU7CisKKwlyeGRfZG9uZSA9IHZteG5ldDNfZG9fcG9sbChhZGFwdGVyLCBidWRnZXQpOworCisJaWYgKHJ4ZF9kb25lIDwgYnVkZ2V0KSB7CisJCW5hcGlfY29tcGxldGUobmFwaSk7CisJCXZteG5ldDNfZW5hYmxlX2ludHIoYWRhcHRlciwgMCk7CisJfQorCXJldHVybiByeGRfZG9uZTsKK30KKworCisvKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3Igdm14bmV0MyAgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAordm14bmV0M19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHVubGlrZWx5KGFkYXB0ZXItPmludHIudHlwZSA9PSBWTVhORVQzX0lUX0lOVFgpKSB7CisJCXUzMiBpY3IgPSBWTVhORVQzX1JFQURfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfSUNSKTsKKwkJaWYgKHVubGlrZWx5KGljciA9PSAwKSkKKwkJCS8qIG5vdCBvdXJzICovCisJCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisKKwkvKiBkaXNhYmxlIGludHIgaWYgbmVlZGVkICovCisJaWYgKGFkYXB0ZXItPmludHIubWFza19tb2RlID09IFZNWE5FVDNfSU1NX0FDVElWRSkKKwkJdm14bmV0M19kaXNhYmxlX2ludHIoYWRhcHRlciwgMCk7CisKKwluYXBpX3NjaGVkdWxlKCZhZGFwdGVyLT5uYXBpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisKKworLyogbmV0cG9sbCBjYWxsYmFjay4gKi8KK3N0YXRpYyB2b2lkCit2bXhuZXQzX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgaXJxOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAoYWRhcHRlci0+aW50ci50eXBlID09IFZNWE5FVDNfSVRfTVNJWCkKKwkJaXJxID0gYWRhcHRlci0+aW50ci5tc2l4X2VudHJpZXNbMF0udmVjdG9yOworCWVsc2UKKyNlbmRpZgorCQlpcnEgPSBhZGFwdGVyLT5wZGV2LT5pcnE7CisKKwlkaXNhYmxlX2lycShpcnEpOworCXZteG5ldDNfaW50cihpcnEsIG5ldGRldik7CisJZW5hYmxlX2lycShpcnEpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3ZteG5ldDNfcmVxdWVzdF9pcnFzKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGVycjsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJaWYgKGFkYXB0ZXItPmludHIudHlwZSA9PSBWTVhORVQzX0lUX01TSVgpIHsKKwkJLyogd2Ugb25seSB1c2UgMSBNU0ktWCB2ZWN0b3IgKi8KKwkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+aW50ci5tc2l4X2VudHJpZXNbMF0udmVjdG9yLAorCQkJCSAgdm14bmV0M19pbnRyLCAwLCBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsCisJCQkJICBhZGFwdGVyLT5uZXRkZXYpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKGFkYXB0ZXItPmludHIudHlwZSA9PSBWTVhORVQzX0lUX01TSSkgeworCQllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIHZteG5ldDNfaW50ciwgMCwKKwkJCQkgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgYWRhcHRlci0+bmV0ZGV2KTsKKwl9IGVsc2UgeworCQllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIHZteG5ldDNfaW50ciwKKwkJCQkgIElSUUZfU0hBUkVELCBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsCisJCQkJICBhZGFwdGVyLT5uZXRkZXYpOworCX0KKworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVzIChpbnRyIHR5cGU6JWQpLCBlcnJvciIKKwkJICAgICAgICI6JWRcbiIsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgYWRhcHRlci0+aW50ci50eXBlLCBlcnIpOworCisKKwlpZiAoIWVycikgeworCQlpbnQgaTsKKwkJLyogaW5pdCBvdXIgaW50ciBzZXR0aW5ncyAqLworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+aW50ci5udW1faW50cnM7IGkrKykKKwkJCWFkYXB0ZXItPmludHIubW9kX2xldmVsc1tpXSA9IFVQVDFfSU1MX0FEQVBUSVZFOworCisJCS8qIG5leHQgc2V0dXAgaW50ciBpbmRleCBmb3IgYWxsIGludHIgc291cmNlcyAqLworCQlhZGFwdGVyLT50eF9xdWV1ZS5jb21wX3JpbmcuaW50cl9pZHggPSAwOworCQlhZGFwdGVyLT5yeF9xdWV1ZS5jb21wX3JpbmcuaW50cl9pZHggPSAwOworCQlhZGFwdGVyLT5pbnRyLmV2ZW50X2ludHJfaWR4ID0gMDsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ciB0eXBlICV1LCBtb2RlICV1LCAldSB2ZWN0b3JzICIKKwkJICAgICAgICJhbGxvY2F0ZWRcbiIsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgYWRhcHRlci0+aW50ci50eXBlLAorCQkgICAgICAgYWRhcHRlci0+aW50ci5tYXNrX21vZGUsIGFkYXB0ZXItPmludHIubnVtX2ludHJzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX2ZyZWVfaXJxcyhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCUJVR19PTihhZGFwdGVyLT5pbnRyLnR5cGUgPT0gVk1YTkVUM19JVF9BVVRPIHx8CisJICAgICAgIGFkYXB0ZXItPmludHIubnVtX2ludHJzIDw9IDApOworCisJc3dpdGNoIChhZGFwdGVyLT5pbnRyLnR5cGUpIHsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWNhc2UgVk1YTkVUM19JVF9NU0lYOgorCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPmludHIubnVtX2ludHJzOyBpKyspCisJCQlmcmVlX2lycShhZGFwdGVyLT5pbnRyLm1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJIGFkYXB0ZXItPm5ldGRldik7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCWNhc2UgVk1YTkVUM19JVF9NU0k6CisJCWZyZWVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgYWRhcHRlci0+bmV0ZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBWTVhORVQzX0lUX0lOVFg6CisJCWZyZWVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgYWRhcHRlci0+bmV0ZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHX09OKHRydWUpOworCX0KK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M192bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IFZteG5ldDNfRHJpdmVyU2hhcmVkICpzaGFyZWQgPSBhZGFwdGVyLT5zaGFyZWQ7CisJdTMyICp2ZlRhYmxlID0gYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLnJ4RmlsdGVyQ29uZi52ZlRhYmxlOworCisJaWYgKGdycCkgeworCQkvKiBhZGQgdmxhbiByeCBzdHJpcHBpbmcuICovCisJCWlmIChhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSB7CisJCQlpbnQgaTsKKwkJCXN0cnVjdCBWbXhuZXQzX0RTRGV2UmVhZCAqZGV2UmVhZCA9ICZzaGFyZWQtPmRldlJlYWQ7CisJCQlhZGFwdGVyLT52bGFuX2dycCA9IGdycDsKKworCQkJLyogdXBkYXRlIEZFQVRVUkVTIHRvIGRldmljZSAqLworCQkJZGV2UmVhZC0+bWlzYy51cHRGZWF0dXJlcyB8PSBVUFQxX0ZfUlhWTEFOOworCQkJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCisJCQkJCSAgICAgICBWTVhORVQzX0NNRF9VUERBVEVfRkVBVFVSRSk7CisJCQkvKgorCQkJICogIENsZWFyIGVudGlyZSB2ZlRhYmxlOyB0aGVuIGVuYWJsZSB1bnRhZ2dlZCBwa3RzLgorCQkJICogIE5vdGU6IHNldHRpbmcgb25lIGVudHJ5IGluIHZmVGFibGUgdG8gbm9uLXplcm8gdHVybnMKKwkJCSAqICBvbiBWTEFOIHJ4IGZpbHRlcmluZy4KKwkJCSAqLworCQkJZm9yIChpID0gMDsgaSA8IFZNWE5FVDNfVkZUX1NJWkU7IGkrKykKKwkJCQl2ZlRhYmxlW2ldID0gMDsKKworCQkJVk1YTkVUM19TRVRfVkZUQUJMRV9FTlRSWSh2ZlRhYmxlLCAwKTsKKwkJCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELAorCQkJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX1ZMQU5fRklMVEVSUyk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB2bGFuX3J4X3JlZ2lzdGVyIHdoZW4gZGV2aWNlIGhhcyAiCisJCQkgICAgICAgIm5vIE5FVElGX0ZfSFdfVkxBTl9SWFxuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHJlbW92ZSB2bGFuIHJ4IHN0cmlwcGluZy4gKi8KKwkJc3RydWN0IFZteG5ldDNfRFNEZXZSZWFkICpkZXZSZWFkID0gJnNoYXJlZC0+ZGV2UmVhZDsKKwkJYWRhcHRlci0+dmxhbl9ncnAgPSBOVUxMOworCisJCWlmIChkZXZSZWFkLT5taXNjLnVwdEZlYXR1cmVzICYgVVBUMV9GX1JYVkxBTikgeworCQkJaW50IGk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBWTVhORVQzX1ZGVF9TSVpFOyBpKyspIHsKKwkJCQkvKiBjbGVhciBlbnRpcmUgdmZUYWJsZTsgdGhpcyBhbHNvIGRpc2FibGVzCisJCQkJICogVkxBTiByeCBmaWx0ZXJpbmcKKwkJCQkgKi8KKwkJCQl2ZlRhYmxlW2ldID0gMDsKKwkJCX0KKwkJCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELAorCQkJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX1ZMQU5fRklMVEVSUyk7CisKKwkJCS8qIHVwZGF0ZSBGRUFUVVJFUyB0byBkZXZpY2UgKi8KKwkJCWRldlJlYWQtPm1pc2MudXB0RmVhdHVyZXMgJj0gflVQVDFfRl9SWFZMQU47CisJCQlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwKKwkJCQkJICAgICAgIFZNWE5FVDNfQ01EX1VQREFURV9GRUFUVVJFKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19yZXN0b3JlX3ZsYW4oc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+dmxhbl9ncnApIHsKKwkJdTE2IHZpZDsKKwkJdTMyICp2ZlRhYmxlID0gYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLnJ4RmlsdGVyQ29uZi52ZlRhYmxlOworCQlib29sIGFjdGl2ZVZsYW4gPSBmYWxzZTsKKworCQlmb3IgKHZpZCA9IDA7IHZpZCA8IFZMQU5fR1JPVVBfQVJSQVlfTEVOOyB2aWQrKykgeworCQkJaWYgKHZsYW5fZ3JvdXBfZ2V0X2RldmljZShhZGFwdGVyLT52bGFuX2dycCwgdmlkKSkgeworCQkJCVZNWE5FVDNfU0VUX1ZGVEFCTEVfRU5UUlkodmZUYWJsZSwgdmlkKTsKKwkJCQlhY3RpdmVWbGFuID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpZiAoYWN0aXZlVmxhbikgeworCQkJLyogY29udGludWUgdG8gYWxsb3cgdW50YWdnZWQgcGt0cyAqLworCQkJVk1YTkVUM19TRVRfVkZUQUJMRV9FTlRSWSh2ZlRhYmxlLCAwKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M192bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgKnZmVGFibGUgPSBhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQucnhGaWx0ZXJDb25mLnZmVGFibGU7CisKKwlWTVhORVQzX1NFVF9WRlRBQkxFX0VOVFJZKHZmVGFibGUsIHZpZCk7CisJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCisJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX1ZMQU5fRklMVEVSUyk7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQoreworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiAqdmZUYWJsZSA9IGFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5yeEZpbHRlckNvbmYudmZUYWJsZTsKKworCVZNWE5FVDNfQ0xFQVJfVkZUQUJMRV9FTlRSWSh2ZlRhYmxlLCB2aWQpOworCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELAorCQkJICAgICAgIFZNWE5FVDNfQ01EX1VQREFURV9WTEFOX0ZJTFRFUlMpOworfQorCisKK3N0YXRpYyB1OCAqCit2bXhuZXQzX2NvcHlfbWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwl1OCAqYnVmID0gTlVMTDsKKwl1MzIgc3ogPSBuZXRkZXYtPm1jX2NvdW50ICogRVRIX0FMRU47CisKKwkvKiBzdHJ1Y3QgVm14bmV0M19SeEZpbHRlckNvbmYubWZUYWJsZUxlbiBpcyB1MTYuICovCisJaWYgKHN6IDw9IDB4ZmZmZikgeworCQkvKiBXZSBtYXkgYmUgY2FsbGVkIHdpdGggQkggZGlzYWJsZWQgKi8KKwkJYnVmID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7CisJCWlmIChidWYpIHsKKwkJCWludCBpOworCQkJc3RydWN0IGRldl9tY19saXN0ICptYyA9IG5ldGRldi0+bWNfbGlzdDsKKworCQkJZm9yIChpID0gMDsgaSA8IG5ldGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJCUJVR19PTighbWMpOworCQkJCW1lbWNweShidWYgKyBpICogRVRIX0FMRU4sIG1jLT5kbWlfYWRkciwKKwkJCQkgICAgICAgRVRIX0FMRU4pOworCQkJCW1jID0gbWMtPm5leHQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19zZXRfbWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgVm14bmV0M19SeEZpbHRlckNvbmYgKnJ4Q29uZiA9CisJCQkJCSZhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQucnhGaWx0ZXJDb25mOworCXU4ICpuZXdfdGFibGUgPSBOVUxMOworCXUzMiBuZXdfbW9kZSA9IFZNWE5FVDNfUlhNX1VDQVNUOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJbmV3X21vZGUgfD0gVk1YTkVUM19SWE1fUFJPTUlTQzsKKworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkKKwkJbmV3X21vZGUgfD0gVk1YTkVUM19SWE1fQkNBU1Q7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJbmV3X21vZGUgfD0gVk1YTkVUM19SWE1fQUxMX01VTFRJOworCWVsc2UKKwkJaWYgKG5ldGRldi0+bWNfY291bnQgPiAwKSB7CisJCQluZXdfdGFibGUgPSB2bXhuZXQzX2NvcHlfbWMobmV0ZGV2KTsKKwkJCWlmIChuZXdfdGFibGUpIHsKKwkJCQluZXdfbW9kZSB8PSBWTVhORVQzX1JYTV9NQ0FTVDsKKwkJCQlyeENvbmYtPm1mVGFibGVMZW4gPSBuZXRkZXYtPm1jX2NvdW50ICoKKwkJCQkJCSAgICAgRVRIX0FMRU47CisJCQkJcnhDb25mLT5tZlRhYmxlUEEgPSB2aXJ0X3RvX3BoeXMobmV3X3RhYmxlKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZhaWxlZCB0byBjb3B5IG1jYXN0IGxpc3QiCisJCQkJICAgICAgICIsIHNldHRpbmcgQUxMX01VTFRJXG4iLCBuZXRkZXYtPm5hbWUpOworCQkJCW5ld19tb2RlIHw9IFZNWE5FVDNfUlhNX0FMTF9NVUxUSTsKKwkJCX0KKwkJfQorCisKKwlpZiAoIShuZXdfbW9kZSAmIFZNWE5FVDNfUlhNX01DQVNUKSkgeworCQlyeENvbmYtPm1mVGFibGVMZW4gPSAwOworCQlyeENvbmYtPm1mVGFibGVQQSA9IDA7CisJfQorCisJaWYgKG5ld19tb2RlICE9IHJ4Q29uZi0+cnhNb2RlKSB7CisJCXJ4Q29uZi0+cnhNb2RlID0gbmV3X21vZGU7CisJCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELAorCQkJCSAgICAgICBWTVhORVQzX0NNRF9VUERBVEVfUlhfTU9ERSk7CisJfQorCisJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCisJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX01BQ19GSUxURVJTKTsKKworCWtmcmVlKG5ld190YWJsZSk7Cit9CisKKworLyoKKyAqICAgU2V0IHVwIGRyaXZlcl9zaGFyZWQgYmFzZWQgb24gc2V0dGluZ3MgaW4gYWRhcHRlci4KKyAqLworCitzdGF0aWMgdm9pZAordm14bmV0M19zZXR1cF9kcml2ZXJfc2hhcmVkKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IFZteG5ldDNfRHJpdmVyU2hhcmVkICpzaGFyZWQgPSBhZGFwdGVyLT5zaGFyZWQ7CisJc3RydWN0IFZteG5ldDNfRFNEZXZSZWFkICpkZXZSZWFkID0gJnNoYXJlZC0+ZGV2UmVhZDsKKwlzdHJ1Y3QgVm14bmV0M19UeFF1ZXVlQ29uZiAqdHFjOworCXN0cnVjdCBWbXhuZXQzX1J4UXVldWVDb25mICpycWM7CisJaW50IGk7CisKKwltZW1zZXQoc2hhcmVkLCAwLCBzaXplb2YoKnNoYXJlZCkpOworCisJLyogZHJpdmVyIHNldHRpbmdzICovCisJc2hhcmVkLT5tYWdpYyA9IFZNWE5FVDNfUkVWMV9NQUdJQzsKKwlkZXZSZWFkLT5taXNjLmRyaXZlckluZm8udmVyc2lvbiA9IFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fTlVNOworCWRldlJlYWQtPm1pc2MuZHJpdmVySW5mby5nb3MuZ29zQml0cyA9IChzaXplb2Yodm9pZCAqKSA9PSA0ID8KKwkJCQlWTVhORVQzX0dPU19CSVRTXzMyIDogVk1YTkVUM19HT1NfQklUU182NCk7CisJZGV2UmVhZC0+bWlzYy5kcml2ZXJJbmZvLmdvcy5nb3NUeXBlID0gVk1YTkVUM19HT1NfVFlQRV9MSU5VWDsKKwlkZXZSZWFkLT5taXNjLmRyaXZlckluZm8udm14bmV0M1JldlNwdCA9IDE7CisJZGV2UmVhZC0+bWlzYy5kcml2ZXJJbmZvLnVwdFZlclNwdCA9IDE7CisKKwlkZXZSZWFkLT5taXNjLmRkUEEgPSB2aXJ0X3RvX3BoeXMoYWRhcHRlcik7CisJZGV2UmVhZC0+bWlzYy5kZExlbiA9IHNpemVvZihzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyKTsKKworCS8qIHNldCB1cCBmZWF0dXJlIGZsYWdzICovCisJaWYgKGFkYXB0ZXItPnJ4Y3N1bSkKKwkJZGV2UmVhZC0+bWlzYy51cHRGZWF0dXJlcyB8PSBVUFQxX0ZfUlhDU1VNOworCisJaWYgKGFkYXB0ZXItPmxybykgeworCQlkZXZSZWFkLT5taXNjLnVwdEZlYXR1cmVzIHw9IFVQVDFfRl9MUk87CisJCWRldlJlYWQtPm1pc2MubWF4TnVtUnhTRyA9IDEgKyBNQVhfU0tCX0ZSQUdTOworCX0KKwlpZiAoKGFkYXB0ZXItPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpCisJCQkmJiBhZGFwdGVyLT52bGFuX2dycCkgeworCQlkZXZSZWFkLT5taXNjLnVwdEZlYXR1cmVzIHw9IFVQVDFfRl9SWFZMQU47CisJfQorCisJZGV2UmVhZC0+bWlzYy5tdHUgPSBhZGFwdGVyLT5uZXRkZXYtPm10dTsKKwlkZXZSZWFkLT5taXNjLnF1ZXVlRGVzY1BBID0gYWRhcHRlci0+cXVldWVfZGVzY19wYTsKKwlkZXZSZWFkLT5taXNjLnF1ZXVlRGVzY0xlbiA9IHNpemVvZihzdHJ1Y3QgVm14bmV0M19UeFF1ZXVlRGVzYykgKworCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1J4UXVldWVEZXNjKTsKKworCS8qIHR4IHF1ZXVlIHNldHRpbmdzICovCisJQlVHX09OKGFkYXB0ZXItPnR4X3F1ZXVlLnR4X3JpbmcuYmFzZSA9PSBOVUxMKTsKKworCWRldlJlYWQtPm1pc2MubnVtVHhRdWV1ZXMgPSAxOworCXRxYyA9ICZhZGFwdGVyLT50cWRfc3RhcnQtPmNvbmY7CisJdHFjLT50eFJpbmdCYXNlUEEgICA9IGFkYXB0ZXItPnR4X3F1ZXVlLnR4X3JpbmcuYmFzZVBBOworCXRxYy0+ZGF0YVJpbmdCYXNlUEEgPSBhZGFwdGVyLT50eF9xdWV1ZS5kYXRhX3JpbmcuYmFzZVBBOworCXRxYy0+Y29tcFJpbmdCYXNlUEEgPSBhZGFwdGVyLT50eF9xdWV1ZS5jb21wX3JpbmcuYmFzZVBBOworCXRxYy0+ZGRQQSAgICAgICAgICAgPSB2aXJ0X3RvX3BoeXMoYWRhcHRlci0+dHhfcXVldWUuYnVmX2luZm8pOworCXRxYy0+dHhSaW5nU2l6ZSAgICAgPSBhZGFwdGVyLT50eF9xdWV1ZS50eF9yaW5nLnNpemU7CisJdHFjLT5kYXRhUmluZ1NpemUgICA9IGFkYXB0ZXItPnR4X3F1ZXVlLmRhdGFfcmluZy5zaXplOworCXRxYy0+Y29tcFJpbmdTaXplICAgPSBhZGFwdGVyLT50eF9xdWV1ZS5jb21wX3Jpbmcuc2l6ZTsKKwl0cWMtPmRkTGVuICAgICAgICAgID0gc2l6ZW9mKHN0cnVjdCB2bXhuZXQzX3R4X2J1Zl9pbmZvKSAqCisJCQkgICAgICB0cWMtPnR4UmluZ1NpemU7CisJdHFjLT5pbnRySWR4ICAgICAgICA9IGFkYXB0ZXItPnR4X3F1ZXVlLmNvbXBfcmluZy5pbnRyX2lkeDsKKworCS8qIHJ4IHF1ZXVlIHNldHRpbmdzICovCisJZGV2UmVhZC0+bWlzYy5udW1SeFF1ZXVlcyA9IDE7CisJcnFjID0gJmFkYXB0ZXItPnJxZF9zdGFydC0+Y29uZjsKKwlycWMtPnJ4UmluZ0Jhc2VQQVswXSA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnJ4X3JpbmdbMF0uYmFzZVBBOworCXJxYy0+cnhSaW5nQmFzZVBBWzFdID0gYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1sxXS5iYXNlUEE7CisJcnFjLT5jb21wUmluZ0Jhc2VQQSAgPSBhZGFwdGVyLT5yeF9xdWV1ZS5jb21wX3JpbmcuYmFzZVBBOworCXJxYy0+ZGRQQSAgICAgICAgICAgID0gdmlydF90b19waHlzKGFkYXB0ZXItPnJ4X3F1ZXVlLmJ1Zl9pbmZvKTsKKwlycWMtPnJ4UmluZ1NpemVbMF0gICA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnJ4X3JpbmdbMF0uc2l6ZTsKKwlycWMtPnJ4UmluZ1NpemVbMV0gICA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnJ4X3JpbmdbMV0uc2l6ZTsKKwlycWMtPmNvbXBSaW5nU2l6ZSAgICA9IGFkYXB0ZXItPnJ4X3F1ZXVlLmNvbXBfcmluZy5zaXplOworCXJxYy0+ZGRMZW4gICAgICAgICAgID0gc2l6ZW9mKHN0cnVjdCB2bXhuZXQzX3J4X2J1Zl9pbmZvKSAqCisJCQkgICAgICAgKHJxYy0+cnhSaW5nU2l6ZVswXSArIHJxYy0+cnhSaW5nU2l6ZVsxXSk7CisJcnFjLT5pbnRySWR4ICAgICAgICAgPSBhZGFwdGVyLT5yeF9xdWV1ZS5jb21wX3JpbmcuaW50cl9pZHg7CisKKwkvKiBpbnRyIHNldHRpbmdzICovCisJZGV2UmVhZC0+aW50ckNvbmYuYXV0b01hc2sgPSBhZGFwdGVyLT5pbnRyLm1hc2tfbW9kZSA9PQorCQkJCSAgICAgVk1YTkVUM19JTU1fQVVUTzsKKwlkZXZSZWFkLT5pbnRyQ29uZi5udW1JbnRycyA9IGFkYXB0ZXItPmludHIubnVtX2ludHJzOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5pbnRyLm51bV9pbnRyczsgaSsrKQorCQlkZXZSZWFkLT5pbnRyQ29uZi5tb2RMZXZlbHNbaV0gPSBhZGFwdGVyLT5pbnRyLm1vZF9sZXZlbHNbaV07CisKKwlkZXZSZWFkLT5pbnRyQ29uZi5ldmVudEludHJJZHggPSBhZGFwdGVyLT5pbnRyLmV2ZW50X2ludHJfaWR4OworCisJLyogcnggZmlsdGVyIHNldHRpbmdzICovCisJZGV2UmVhZC0+cnhGaWx0ZXJDb25mLnJ4TW9kZSA9IDA7CisJdm14bmV0M19yZXN0b3JlX3ZsYW4oYWRhcHRlcik7CisJLyogdGhlIHJlc3QgYXJlIGFscmVhZHkgemVyb2VkICovCit9CisKKworaW50Cit2bXhuZXQzX2FjdGl2YXRlX2RldihzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCWludCBlcnI7CisJdTMyIHJldDsKKworCWRldl9kYmcoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAorCQkiJXM6IHNrYl9idWZfc2l6ZSAlZCwgcnhfYnVmX3Blcl9wa3QgJWQsIHJpbmcgc2l6ZXMiCisJCSIgJXUgJXUgJXVcbiIsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgYWRhcHRlci0+c2tiX2J1Zl9zaXplLAorCQlhZGFwdGVyLT5yeF9idWZfcGVyX3BrdCwgYWRhcHRlci0+dHhfcXVldWUudHhfcmluZy5zaXplLAorCQlhZGFwdGVyLT5yeF9xdWV1ZS5yeF9yaW5nWzBdLnNpemUsCisJCWFkYXB0ZXItPnJ4X3F1ZXVlLnJ4X3JpbmdbMV0uc2l6ZSk7CisKKwl2bXhuZXQzX3RxX2luaXQoJmFkYXB0ZXItPnR4X3F1ZXVlLCBhZGFwdGVyKTsKKwllcnIgPSB2bXhuZXQzX3JxX2luaXQoJmFkYXB0ZXItPnJ4X3F1ZXVlLCBhZGFwdGVyKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGluaXQgcnggcXVldWUgZm9yICVzOiBlcnJvciAlZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgZXJyKTsKKwkJZ290byBycV9lcnI7CisJfQorCisJZXJyID0gdm14bmV0M19yZXF1ZXN0X2lycXMoYWRhcHRlcik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZXR1cCBpcnEgZm9yICVzOiBlcnJvciAlZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgZXJyKTsKKwkJZ290byBpcnFfZXJyOworCX0KKworCXZteG5ldDNfc2V0dXBfZHJpdmVyX3NoYXJlZChhZGFwdGVyKTsKKworCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfRFNBTCwKKwkJCSAgICAgICBWTVhORVQzX0dFVF9BRERSX0xPKGFkYXB0ZXItPnNoYXJlZF9wYSkpOworCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfRFNBSCwKKwkJCSAgICAgICBWTVhORVQzX0dFVF9BRERSX0hJKGFkYXB0ZXItPnNoYXJlZF9wYSkpOworCisJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCisJCQkgICAgICAgVk1YTkVUM19DTURfQUNUSVZBVEVfREVWKTsKKwlyZXQgPSBWTVhORVQzX1JFQURfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01EKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhY3RpdmF0ZSBkZXYgJXM6IGVycm9yICV1XG4iLAorCQkgICAgICAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGFjdGl2YXRlX2VycjsKKwl9CisJVk1YTkVUM19XUklURV9CQVIwX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19SWFBST0QsCisJCQkgICAgICAgYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1swXS5uZXh0MmZpbGwpOworCVZNWE5FVDNfV1JJVEVfQkFSMF9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfUlhQUk9EMiwKKwkJCSAgICAgICBhZGFwdGVyLT5yeF9xdWV1ZS5yeF9yaW5nWzFdLm5leHQyZmlsbCk7CisKKwkvKiBBcHBseSB0aGUgcnggZmlsdGVyIHNldHRpbnMgbGFzdC4gKi8KKwl2bXhuZXQzX3NldF9tYyhhZGFwdGVyLT5uZXRkZXYpOworCisJLyoKKwkgKiBDaGVjayBsaW5rIHN0YXRlIHdoZW4gZmlyc3QgYWN0aXZhdGluZyBkZXZpY2UuIEl0IHdpbGwgc3RhcnQgdGhlCisJICogdHggcXVldWUgaWYgdGhlIGxpbmsgaXMgdXAuCisJICovCisJdm14bmV0M19jaGVja19saW5rKGFkYXB0ZXIpOworCisJbmFwaV9lbmFibGUoJmFkYXB0ZXItPm5hcGkpOworCXZteG5ldDNfZW5hYmxlX2FsbF9pbnRycyhhZGFwdGVyKTsKKwljbGVhcl9iaXQoVk1YTkVUM19TVEFURV9CSVRfUVVJRVNDRUQsICZhZGFwdGVyLT5zdGF0ZSk7CisJcmV0dXJuIDA7CisKK2FjdGl2YXRlX2VycjoKKwlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0RTQUwsIDApOworCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfRFNBSCwgMCk7CisJdm14bmV0M19mcmVlX2lycXMoYWRhcHRlcik7CitpcnFfZXJyOgorcnFfZXJyOgorCS8qIGZyZWUgdXAgYnVmZmVycyB3ZSBhbGxvY2F0ZWQgKi8KKwl2bXhuZXQzX3JxX2NsZWFudXAoJmFkYXB0ZXItPnJ4X3F1ZXVlLCBhZGFwdGVyKTsKKwlyZXR1cm4gZXJyOworfQorCisKK3ZvaWQKK3ZteG5ldDNfcmVzZXRfZGV2KHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsIFZNWE5FVDNfQ01EX1JFU0VUX0RFVik7Cit9CisKKworaW50Cit2bXhuZXQzX3F1aWVzY2VfZGV2KHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoVk1YTkVUM19TVEFURV9CSVRfUVVJRVNDRUQsICZhZGFwdGVyLT5zdGF0ZSkpCisJCXJldHVybiAwOworCisKKwlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwKKwkJCSAgICAgICBWTVhORVQzX0NNRF9RVUlFU0NFX0RFVik7CisJdm14bmV0M19kaXNhYmxlX2FsbF9pbnRycyhhZGFwdGVyKTsKKworCW5hcGlfZGlzYWJsZSgmYWRhcHRlci0+bmFwaSk7CisJbmV0aWZfdHhfZGlzYWJsZShhZGFwdGVyLT5uZXRkZXYpOworCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAwOworCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPm5ldGRldik7CisKKwl2bXhuZXQzX3RxX2NsZWFudXAoJmFkYXB0ZXItPnR4X3F1ZXVlLCBhZGFwdGVyKTsKKwl2bXhuZXQzX3JxX2NsZWFudXAoJmFkYXB0ZXItPnJ4X3F1ZXVlLCBhZGFwdGVyKTsKKwl2bXhuZXQzX2ZyZWVfaXJxcyhhZGFwdGVyKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M193cml0ZV9tYWNfYWRkcihzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyLCB1OCAqbWFjKQoreworCXUzMiB0bXA7CisKKwl0bXAgPSAqKHUzMiAqKW1hYzsKKwlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX01BQ0wsIHRtcCk7CisKKwl0bXAgPSAobWFjWzVdIDw8IDgpIHwgbWFjWzRdOworCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfTUFDSCwgdG1wKTsKK30KKworCitzdGF0aWMgaW50Cit2bXhuZXQzX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisJc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisJdm14bmV0M193cml0ZV9tYWNfYWRkcihhZGFwdGVyLCBhZGRyLT5zYV9kYXRhKTsKKworCXJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09IGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwIHJvdXRpbmVzID09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50Cit2bXhuZXQzX2FsbG9jX3BjaV9yZXNvdXJjZXMoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciwgYm9vbCAqZG1hNjQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnQsIG1taW9fbGVuOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZW5hYmxlIGFkYXB0ZXIgJXM6IGVycm9yICVkXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldiksIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkgPT0gMCkgeworCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrIGZhaWxlZCAiCisJCQkgICAgICAgImZvciBhZGFwdGVyICVzXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBlcnJfc2V0X21hc2s7CisJCX0KKwkJKmRtYTY0ID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBjaV9zZXRfZG1hX21hc2sgZmFpbGVkIGZvciBhZGFwdGVyICIKKwkJCSAgICAgICAiJXNcbiIsCXBjaV9uYW1lKHBkZXYpKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGVycl9zZXRfbWFzazsKKwkJfQorCQkqZG1hNjQgPSBmYWxzZTsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHBkZXYsICgxIDw8IDIpIC0gMSwKKwkJCQkJICAgdm14bmV0M19kcml2ZXJfbmFtZSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXF1ZXN0IHJlZ2lvbiBmb3IgYWRhcHRlciAlczogIgorCQkgICAgICAgImVycm9yICVkXG4iLCBwY2lfbmFtZShwZGV2KSwgZXJyKTsKKwkJZ290byBlcnJfc2V0X21hc2s7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwlhZGFwdGVyLT5od19hZGRyMCA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCWlmICghYWRhcHRlci0+aHdfYWRkcjApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIGJhcjAgZm9yIGFkYXB0ZXIgJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJbW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CisJYWRhcHRlci0+aHdfYWRkcjEgPSBpb3JlbWFwKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwlpZiAoIWFkYXB0ZXItPmh3X2FkZHIxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBiYXIxIGZvciBhZGFwdGVyICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9iYXIxOworCX0KKwlyZXR1cm4gMDsKKworZXJyX2JhcjE6CisJaW91bm1hcChhZGFwdGVyLT5od19hZGRyMCk7CitlcnJfaW9yZW1hcDoKKwlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKHBkZXYsICgxIDw8IDIpIC0gMSk7CitlcnJfc2V0X21hc2s6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZnJlZV9wY2lfcmVzb3VyY2VzKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJQlVHX09OKCFhZGFwdGVyLT5wZGV2KTsKKworCWlvdW5tYXAoYWRhcHRlci0+aHdfYWRkcjApOworCWlvdW5tYXAoYWRhcHRlci0+aHdfYWRkcjEpOworCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMoYWRhcHRlci0+cGRldiwgKDEgPDwgMikgLSAxKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoYWRhcHRlci0+cGRldik7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfYWRqdXN0X3J4X3Jpbmdfc2l6ZShzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCXNpemVfdCBzejsKKworCWlmIChhZGFwdGVyLT5uZXRkZXYtPm10dSA8PSBWTVhORVQzX01BWF9TS0JfQlVGX1NJWkUgLQorCQkJCSAgICBWTVhORVQzX01BWF9FVEhfSERSX1NJWkUpIHsKKwkJYWRhcHRlci0+c2tiX2J1Zl9zaXplID0gYWRhcHRlci0+bmV0ZGV2LT5tdHUgKworCQkJCQlWTVhORVQzX01BWF9FVEhfSERSX1NJWkU7CisJCWlmIChhZGFwdGVyLT5za2JfYnVmX3NpemUgPCBWTVhORVQzX01JTl9UMF9CVUZfU0laRSkKKwkJCWFkYXB0ZXItPnNrYl9idWZfc2l6ZSA9IFZNWE5FVDNfTUlOX1QwX0JVRl9TSVpFOworCisJCWFkYXB0ZXItPnJ4X2J1Zl9wZXJfcGt0ID0gMTsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5za2JfYnVmX3NpemUgPSBWTVhORVQzX01BWF9TS0JfQlVGX1NJWkU7CisJCXN6ID0gYWRhcHRlci0+bmV0ZGV2LT5tdHUgLSBWTVhORVQzX01BWF9TS0JfQlVGX1NJWkUgKworCQkJCQkgICAgVk1YTkVUM19NQVhfRVRIX0hEUl9TSVpFOworCQlhZGFwdGVyLT5yeF9idWZfcGVyX3BrdCA9IDEgKyAoc3ogKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKKwl9CisKKwkvKgorCSAqIGZvciBzaW1wbGljaXR5LCBmb3JjZSB0aGUgcmluZzAgc2l6ZSB0byBiZSBhIG11bHRpcGxlIG9mCisJICogcnhfYnVmX3Blcl9wa3QgKiBWTVhORVQzX1JJTkdfU0laRV9BTElHTgorCSAqLworCXN6ID0gYWRhcHRlci0+cnhfYnVmX3Blcl9wa3QgKiBWTVhORVQzX1JJTkdfU0laRV9BTElHTjsKKwlhZGFwdGVyLT5yeF9xdWV1ZS5yeF9yaW5nWzBdLnNpemUgPSAoYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1swXS5zaXplICsKKwkJCQkJICAgICBzeiAtIDEpIC8gc3ogKiBzejsKKwlhZGFwdGVyLT5yeF9xdWV1ZS5yeF9yaW5nWzBdLnNpemUgPSBtaW5fdCh1MzIsCisJCQkJCSAgICBhZGFwdGVyLT5yeF9xdWV1ZS5yeF9yaW5nWzBdLnNpemUsCisJCQkJCSAgICBWTVhORVQzX1JYX1JJTkdfTUFYX1NJWkUgLyBzeiAqIHN6KTsKK30KKworCitpbnQKK3ZteG5ldDNfY3JlYXRlX3F1ZXVlcyhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyLCB1MzIgdHhfcmluZ19zaXplLAorCQkgICAgICB1MzIgcnhfcmluZ19zaXplLCB1MzIgcnhfcmluZzJfc2l6ZSkKK3sKKwlpbnQgZXJyOworCisJYWRhcHRlci0+dHhfcXVldWUudHhfcmluZy5zaXplICAgPSB0eF9yaW5nX3NpemU7CisJYWRhcHRlci0+dHhfcXVldWUuZGF0YV9yaW5nLnNpemUgPSB0eF9yaW5nX3NpemU7CisJYWRhcHRlci0+dHhfcXVldWUuY29tcF9yaW5nLnNpemUgPSB0eF9yaW5nX3NpemU7CisJYWRhcHRlci0+dHhfcXVldWUuc2hhcmVkID0gJmFkYXB0ZXItPnRxZF9zdGFydC0+Y3RybDsKKwlhZGFwdGVyLT50eF9xdWV1ZS5zdG9wcGVkID0gdHJ1ZTsKKwllcnIgPSB2bXhuZXQzX3RxX2NyZWF0ZSgmYWRhcHRlci0+dHhfcXVldWUsIGFkYXB0ZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlhZGFwdGVyLT5yeF9xdWV1ZS5yeF9yaW5nWzBdLnNpemUgPSByeF9yaW5nX3NpemU7CisJYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1sxXS5zaXplID0gcnhfcmluZzJfc2l6ZTsKKwl2bXhuZXQzX2FkanVzdF9yeF9yaW5nX3NpemUoYWRhcHRlcik7CisJYWRhcHRlci0+cnhfcXVldWUuY29tcF9yaW5nLnNpemUgID0gYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1swXS5zaXplICsKKwkJCQkJICAgIGFkYXB0ZXItPnJ4X3F1ZXVlLnJ4X3JpbmdbMV0uc2l6ZTsKKwlhZGFwdGVyLT5yeF9xdWV1ZS5xaWQgID0gMDsKKwlhZGFwdGVyLT5yeF9xdWV1ZS5xaWQyID0gMTsKKwlhZGFwdGVyLT5yeF9xdWV1ZS5zaGFyZWQgPSAmYWRhcHRlci0+cnFkX3N0YXJ0LT5jdHJsOworCWVyciA9IHZteG5ldDNfcnFfY3JlYXRlKCZhZGFwdGVyLT5yeF9xdWV1ZSwgYWRhcHRlcik7CisJaWYgKGVycikKKwkJdm14bmV0M190cV9kZXN0cm95KCZhZGFwdGVyLT50eF9xdWV1ZSwgYWRhcHRlcik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit2bXhuZXQzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyOworCWludCBlcnI7CisKKwlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50eF9xdWV1ZS50eF9sb2NrKTsKKworCWVyciA9IHZteG5ldDNfY3JlYXRlX3F1ZXVlcyhhZGFwdGVyLCBWTVhORVQzX0RFRl9UWF9SSU5HX1NJWkUsCisJCQkJICAgIFZNWE5FVDNfREVGX1JYX1JJTkdfU0laRSwKKwkJCQkgICAgVk1YTkVUM19ERUZfUlhfUklOR19TSVpFKTsKKwlpZiAoZXJyKQorCQlnb3RvIHF1ZXVlX2VycjsKKworCWVyciA9IHZteG5ldDNfYWN0aXZhdGVfZGV2KGFkYXB0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gYWN0aXZhdGVfZXJyOworCisJcmV0dXJuIDA7CisKK2FjdGl2YXRlX2VycjoKKwl2bXhuZXQzX3JxX2Rlc3Ryb3koJmFkYXB0ZXItPnJ4X3F1ZXVlLCBhZGFwdGVyKTsKKwl2bXhuZXQzX3RxX2Rlc3Ryb3koJmFkYXB0ZXItPnR4X3F1ZXVlLCBhZGFwdGVyKTsKK3F1ZXVlX2VycjoKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQKK3ZteG5ldDNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qCisJICogUmVzZXRfd29yayBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiByZXNldHRpbmcgdGhlIGRldmljZSwgd2FpdCBmb3IgaXRzCisJICogY29tcGxldGlvbi4KKwkgKi8KKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChWTVhORVQzX1NUQVRFX0JJVF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSkpCisJCW1zbGVlcCgxKTsKKworCXZteG5ldDNfcXVpZXNjZV9kZXYoYWRhcHRlcik7CisKKwl2bXhuZXQzX3JxX2Rlc3Ryb3koJmFkYXB0ZXItPnJ4X3F1ZXVlLCBhZGFwdGVyKTsKKwl2bXhuZXQzX3RxX2Rlc3Ryb3koJmFkYXB0ZXItPnR4X3F1ZXVlLCBhZGFwdGVyKTsKKworCWNsZWFyX2JpdChWTVhORVQzX1NUQVRFX0JJVF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CisKKworCXJldHVybiAwOworfQorCisKK3ZvaWQKK3ZteG5ldDNfZm9yY2VfY2xvc2Uoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKgorCSAqIHdlIG11c3QgY2xlYXIgVk1YTkVUM19TVEFURV9CSVRfUkVTRVRUSU5HLCBvdGhlcndpc2UKKwkgKiB2bXhuZXQzX2Nsb3NlKCkgd2lsbCBkZWFkbG9jay4KKwkgKi8KKwlCVUdfT04odGVzdF9iaXQoVk1YTkVUM19TVEFURV9CSVRfUkVTRVRUSU5HLCAmYWRhcHRlci0+c3RhdGUpKTsKKworCS8qIHdlIG5lZWQgdG8gZW5hYmxlIE5BUEksIG90aGVyd2lzZSBkZXZfY2xvc2Ugd2lsbCBkZWFkbG9jayAqLworCW5hcGlfZW5hYmxlKCZhZGFwdGVyLT5uYXBpKTsKKwlkZXZfY2xvc2UoYWRhcHRlci0+bmV0ZGV2KTsKK30KKworCitzdGF0aWMgaW50Cit2bXhuZXQzX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGVyciA9IDA7CisKKwlpZiAobmV3X210dSA8IFZNWE5FVDNfTUlOX01UVSB8fCBuZXdfbXR1ID4gVk1YTkVUM19NQVhfTVRVKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZXdfbXR1ID4gMTUwMCAmJiAhYWRhcHRlci0+anVtYm9fZnJhbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCisJLyoKKwkgKiBSZXNldF93b3JrIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIHJlc2V0dGluZyB0aGUgZGV2aWNlLCB3YWl0IGZvciBpdHMKKwkgKiBjb21wbGV0aW9uLgorCSAqLworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KFZNWE5FVDNfU1RBVEVfQklUX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKKwkJbXNsZWVwKDEpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQl2bXhuZXQzX3F1aWVzY2VfZGV2KGFkYXB0ZXIpOworCQl2bXhuZXQzX3Jlc2V0X2RldihhZGFwdGVyKTsKKworCQkvKiB3ZSBuZWVkIHRvIHJlLWNyZWF0ZSB0aGUgcnggcXVldWUgYmFzZWQgb24gdGhlIG5ldyBtdHUgKi8KKwkJdm14bmV0M19ycV9kZXN0cm95KCZhZGFwdGVyLT5yeF9xdWV1ZSwgYWRhcHRlcik7CisJCXZteG5ldDNfYWRqdXN0X3J4X3Jpbmdfc2l6ZShhZGFwdGVyKTsKKwkJYWRhcHRlci0+cnhfcXVldWUuY29tcF9yaW5nLnNpemUgID0KKwkJCQkJYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1swXS5zaXplICsKKwkJCQkJYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1sxXS5zaXplOworCQllcnIgPSB2bXhuZXQzX3JxX2NyZWF0ZSgmYWRhcHRlci0+cnhfcXVldWUsIGFkYXB0ZXIpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmUtY3JlYXRlIHJ4IHF1ZXVlLCIKKwkJCQkiIGVycm9yICVkLiBDbG9zaW5nIGl0LlxuIiwgbmV0ZGV2LT5uYW1lLCBlcnIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllcnIgPSB2bXhuZXQzX2FjdGl2YXRlX2RldihhZGFwdGVyKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlLWFjdGl2YXRlLCBlcnJvciAlZC4gIgorCQkJCSJDbG9zaW5nIGl0XG4iLCBuZXRkZXYtPm5hbWUsIGVycik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCWNsZWFyX2JpdChWTVhORVQzX1NUQVRFX0JJVF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CisJaWYgKGVycikKKwkJdm14bmV0M19mb3JjZV9jbG9zZShhZGFwdGVyKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZGVjbGFyZV9mZWF0dXJlcyhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyLCBib29sIGRtYTY0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TRyB8CisJCU5FVElGX0ZfSFdfQ1NVTSB8CisJCU5FVElGX0ZfSFdfVkxBTl9UWCB8CisJCU5FVElGX0ZfSFdfVkxBTl9SWCB8CisJCU5FVElGX0ZfSFdfVkxBTl9GSUxURVIgfAorCQlORVRJRl9GX1RTTyB8CisJCU5FVElGX0ZfVFNPNiB8CisJCU5FVElGX0ZfTFJPOworCisJcHJpbnRrKEtFUk5fSU5GTyAiZmVhdHVyZXM6IHNnIGNzdW0gdmxhbiBqZiB0c28gdHNvSVB2NiBscm8iKTsKKworCWFkYXB0ZXItPnJ4Y3N1bSA9IHRydWU7CisJYWRhcHRlci0+anVtYm9fZnJhbWUgPSB0cnVlOworCWFkYXB0ZXItPmxybyA9IHRydWU7CisKKwlpZiAoZG1hNjQpIHsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJCXByaW50aygiIGhpZ2hETUEiKTsKKwl9CisKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgPSBuZXRkZXYtPmZlYXR1cmVzOworCXByaW50aygiXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19yZWFkX21hY19hZGRyKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWMpCit7CisJdTMyIHRtcDsKKworCXRtcCA9IFZNWE5FVDNfUkVBRF9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19NQUNMKTsKKwkqKHUzMiAqKW1hYyA9IHRtcDsKKworCXRtcCA9IFZNWE5FVDNfUkVBRF9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19NQUNIKTsKKwltYWNbNF0gPSB0bXAgJiAweGZmOworCW1hY1s1XSA9ICh0bXAgPj4gOCkgJiAweGZmOworfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX2FsbG9jX2ludHJfcmVzb3VyY2VzKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIGNmZzsKKworCS8qIGludHIgc2V0dGluZ3MgKi8KKwlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwKKwkJCSAgICAgICBWTVhORVQzX0NNRF9HRVRfQ09ORl9JTlRSKTsKKwljZmcgPSBWTVhORVQzX1JFQURfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01EKTsKKwlhZGFwdGVyLT5pbnRyLnR5cGUgPSBjZmcgJiAweDM7CisJYWRhcHRlci0+aW50ci5tYXNrX21vZGUgPSAoY2ZnID4+IDIpICYgMHgzOworCisJaWYgKGFkYXB0ZXItPmludHIudHlwZSA9PSBWTVhORVQzX0lUX0FVVE8pIHsKKwkJaW50IGVycjsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJCWFkYXB0ZXItPmludHIubXNpeF9lbnRyaWVzWzBdLmVudHJ5ID0gMDsKKwkJZXJyID0gcGNpX2VuYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPmludHIubXNpeF9lbnRyaWVzLAorCQkJCSAgICAgIFZNWE5FVDNfTElOVVhfTUFYX01TSVhfVkVDVCk7CisJCWlmICghZXJyKSB7CisJCQlhZGFwdGVyLT5pbnRyLm51bV9pbnRycyA9IDE7CisJCQlhZGFwdGVyLT5pbnRyLnR5cGUgPSBWTVhORVQzX0lUX01TSVg7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZgorCisJCWVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworCQlpZiAoIWVycikgeworCQkJYWRhcHRlci0+aW50ci5udW1faW50cnMgPSAxOworCQkJYWRhcHRlci0+aW50ci50eXBlID0gVk1YTkVUM19JVF9NU0k7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlhZGFwdGVyLT5pbnRyLnR5cGUgPSBWTVhORVQzX0lUX0lOVFg7CisKKwkvKiBJTlQtWCByZWxhdGVkIHNldHRpbmcgKi8KKwlhZGFwdGVyLT5pbnRyLm51bV9pbnRycyA9IDE7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZnJlZV9pbnRyX3Jlc291cmNlcyhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQoreworCWlmIChhZGFwdGVyLT5pbnRyLnR5cGUgPT0gVk1YTkVUM19JVF9NU0lYKQorCQlwY2lfZGlzYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYpOworCWVsc2UgaWYgKGFkYXB0ZXItPmludHIudHlwZSA9PSBWTVhORVQzX0lUX01TSSkKKwkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworCWVsc2UKKwkJQlVHX09OKGFkYXB0ZXItPmludHIudHlwZSAhPSBWTVhORVQzX0lUX0lOVFgpOworfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlhZGFwdGVyLT50eF90aW1lb3V0X2NvdW50Kys7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0eCBoYW5nXG4iLCBhZGFwdGVyLT5uZXRkZXYtPm5hbWUpOworCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPndvcmspOworfQorCisKK3N0YXRpYyB2b2lkCit2bXhuZXQzX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXI7CisKKwlhZGFwdGVyID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIsIHdvcmspOworCisJLyogaWYgYW5vdGhlciB0aHJlYWQgaXMgcmVzZXR0aW5nIHRoZSBkZXZpY2UsIG5vIG5lZWQgdG8gcHJvY2VlZCAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFZNWE5FVDNfU1RBVEVfQklUX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKKwkJcmV0dXJuOworCisJLyogaWYgdGhlIGRldmljZSBpcyBjbG9zZWQsIHdlIG11c3QgbGVhdmUgaXQgYWxvbmUgKi8KKwlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZXNldHRpbmdcbiIsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CisJCXZteG5ldDNfcXVpZXNjZV9kZXYoYWRhcHRlcik7CisJCXZteG5ldDNfcmVzZXRfZGV2KGFkYXB0ZXIpOworCQl2bXhuZXQzX2FjdGl2YXRlX2RldihhZGFwdGVyKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogYWxyZWFkeSBjbG9zZWRcbiIsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CisJfQorCisJY2xlYXJfYml0KFZNWE5FVDNfU1RBVEVfQklUX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdAordm14bmV0M19wcm9iZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdm14bmV0M19uZXRkZXZfb3BzID0geworCQkubmRvX29wZW4gPSB2bXhuZXQzX29wZW4sCisJCS5uZG9fc3RvcCA9IHZteG5ldDNfY2xvc2UsCisJCS5uZG9fc3RhcnRfeG1pdCA9IHZteG5ldDNfeG1pdF9mcmFtZSwKKwkJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSB2bXhuZXQzX3NldF9tYWNfYWRkciwKKwkJLm5kb19jaGFuZ2VfbXR1ID0gdm14bmV0M19jaGFuZ2VfbXR1LAorCQkubmRvX2dldF9zdGF0cyA9IHZteG5ldDNfZ2V0X3N0YXRzLAorCQkubmRvX3R4X3RpbWVvdXQgPSB2bXhuZXQzX3R4X3RpbWVvdXQsCisJCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gdm14bmV0M19zZXRfbWMsCisJCS5uZG9fdmxhbl9yeF9yZWdpc3RlciA9IHZteG5ldDNfdmxhbl9yeF9yZWdpc3RlciwKKwkJLm5kb192bGFuX3J4X2FkZF92aWQgPSB2bXhuZXQzX3ZsYW5fcnhfYWRkX3ZpZCwKKwkJLm5kb192bGFuX3J4X2tpbGxfdmlkID0gdm14bmV0M192bGFuX3J4X2tpbGxfdmlkLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJCS5uZG9fcG9sbF9jb250cm9sbGVyID0gdm14bmV0M19uZXRwb2xsLAorI2VuZGlmCisJfTsKKwlpbnQgZXJyOworCWJvb2wgZG1hNjQgPSBmYWxzZTsgLyogc3R1cGlkIGdjYyAqLworCXUzMiB2ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyOworCXU4IG1hY1tFVEhfQUxFTl07CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHZteG5ldDNfYWRhcHRlcikpOworCWlmICghbmV0ZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jIGV0aGVybmV0IGRldmljZSBmb3IgYWRhcHRlciAiCisJCQkiJXNcbiIsCXBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OworCWFkYXB0ZXItPnBkZXYgPSBwZGV2OworCisJYWRhcHRlci0+c2hhcmVkID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX0RyaXZlclNoYXJlZCksCisJCQkgICZhZGFwdGVyLT5zaGFyZWRfcGEpOworCWlmICghYWRhcHRlci0+c2hhcmVkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJXNcbiIsCisJCQlwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX3NoYXJlZDsKKwl9CisKKwlhZGFwdGVyLT50cWRfc3RhcnQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAorCQkJICAgICBzaXplb2Yoc3RydWN0IFZteG5ldDNfVHhRdWV1ZURlc2MpICsKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1J4UXVldWVEZXNjKSwKKwkJCSAgICAgJmFkYXB0ZXItPnF1ZXVlX2Rlc2NfcGEpOworCisJaWYgKCFhZGFwdGVyLT50cWRfc3RhcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlc1xuIiwKKwkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfcXVldWVfZGVzYzsKKwl9CisJYWRhcHRlci0+cnFkX3N0YXJ0ID0gKHN0cnVjdCBWbXhuZXQzX1J4UXVldWVEZXNjICopKGFkYXB0ZXItPnRxZF9zdGFydAorCQkJCQkJCSAgICArIDEpOworCisJYWRhcHRlci0+cG1fY29uZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1BNQ29uZiksIEdGUF9LRVJORUwpOworCWlmIChhZGFwdGVyLT5wbV9jb25mID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlc1xuIiwKKwkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfcG07CisJfQorCisJZXJyID0gdm14bmV0M19hbGxvY19wY2lfcmVzb3VyY2VzKGFkYXB0ZXIsICZkbWE2NCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX2FsbG9jX3BjaTsKKworCXZlciA9IFZNWE5FVDNfUkVBRF9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19WUlJTKTsKKwlpZiAodmVyICYgMSkgeworCQlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX1ZSUlMsIDEpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW5jb21wYXRpYmxlIGgvdyB2ZXJzaW9uICgweCV4KSBmb3IgYWRhcHRlciIKKwkJICAgICAgICIgJXNcbiIsCXZlciwgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3ZlcjsKKwl9CisKKwl2ZXIgPSBWTVhORVQzX1JFQURfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfVVZSUyk7CisJaWYgKHZlciAmIDEpIHsKKwkJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19VVlJTLCAxKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIkluY29tcGF0aWJsZSB1cHQgdmVyc2lvbiAoMHgleCkgZm9yICIKKwkJICAgICAgICJhZGFwdGVyICVzXG4iLCB2ZXIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGVycl92ZXI7CisJfQorCisJdm14bmV0M19kZWNsYXJlX2ZlYXR1cmVzKGFkYXB0ZXIsIGRtYTY0KTsKKworCWFkYXB0ZXItPmRldl9udW1iZXIgPSBhdG9taWNfcmVhZCgmZGV2aWNlc19mb3VuZCk7CisJdm14bmV0M19hbGxvY19pbnRyX3Jlc291cmNlcyhhZGFwdGVyKTsKKworCXZteG5ldDNfcmVhZF9tYWNfYWRkcihhZGFwdGVyLCBtYWMpOworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCAgbWFjLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZ2bXhuZXQzX25ldGRldl9vcHM7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsKKwl2bXhuZXQzX3NldF9ldGh0b29sX29wcyhuZXRkZXYpOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT53b3JrLCB2bXhuZXQzX3Jlc2V0X3dvcmspOworCisJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCAmYWRhcHRlci0+bmFwaSwgdm14bmV0M19wb2xsLCA2NCk7CisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgYWRhcHRlciAlc1xuIiwKKwkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisJfQorCisJc2V0X2JpdChWTVhORVQzX1NUQVRFX0JJVF9RVUlFU0NFRCwgJmFkYXB0ZXItPnN0YXRlKTsKKwlhdG9taWNfaW5jKCZkZXZpY2VzX2ZvdW5kKTsKKwlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyOgorCXZteG5ldDNfZnJlZV9pbnRyX3Jlc291cmNlcyhhZGFwdGVyKTsKK2Vycl92ZXI6CisJdm14bmV0M19mcmVlX3BjaV9yZXNvdXJjZXMoYWRhcHRlcik7CitlcnJfYWxsb2NfcGNpOgorCWtmcmVlKGFkYXB0ZXItPnBtX2NvbmYpOworZXJyX2FsbG9jX3BtOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1R4UXVldWVEZXNjKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1J4UXVldWVEZXNjKSwKKwkJCSAgICBhZGFwdGVyLT50cWRfc3RhcnQsIGFkYXB0ZXItPnF1ZXVlX2Rlc2NfcGEpOworZXJyX2FsbG9jX3F1ZXVlX2Rlc2M6CisJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBzaXplb2Yoc3RydWN0IFZteG5ldDNfRHJpdmVyU2hhcmVkKSwKKwkJCSAgICBhZGFwdGVyLT5zaGFyZWQsIGFkYXB0ZXItPnNoYXJlZF9wYSk7CitlcnJfYWxsb2Nfc2hhcmVkOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0Cit2bXhuZXQzX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCisJdm14bmV0M19mcmVlX2ludHJfcmVzb3VyY2VzKGFkYXB0ZXIpOworCXZteG5ldDNfZnJlZV9wY2lfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWtmcmVlKGFkYXB0ZXItPnBtX2NvbmYpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1R4UXVldWVEZXNjKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX1J4UXVldWVEZXNjKSwKKwkJCSAgICBhZGFwdGVyLT50cWRfc3RhcnQsIGFkYXB0ZXItPnF1ZXVlX2Rlc2NfcGEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgc2l6ZW9mKHN0cnVjdCBWbXhuZXQzX0RyaXZlclNoYXJlZCksCisJCQkgICAgYWRhcHRlci0+c2hhcmVkLCBhZGFwdGVyLT5zaGFyZWRfcGEpOworCWZyZWVfbmV0ZGV2KG5ldGRldik7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50Cit2bXhuZXQzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IFZteG5ldDNfUE1Db25mICpwbUNvbmY7CisJc3RydWN0IGV0aGhkciAqZWhkcjsKKwlzdHJ1Y3QgYXJwaGRyICphaGRyOworCXU4ICphcnByZXE7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIDA7CisKKwl2bXhuZXQzX2Rpc2FibGVfYWxsX2ludHJzKGFkYXB0ZXIpOworCXZteG5ldDNfZnJlZV9pcnFzKGFkYXB0ZXIpOworCXZteG5ldDNfZnJlZV9pbnRyX3Jlc291cmNlcyhhZGFwdGVyKTsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiBDcmVhdGUgd2FrZS11cCBmaWx0ZXJzLiAqLworCXBtQ29uZiA9IGFkYXB0ZXItPnBtX2NvbmY7CisJbWVtc2V0KHBtQ29uZiwgMCwgc2l6ZW9mKCpwbUNvbmYpKTsKKworCWlmIChhZGFwdGVyLT53b2wgJiBXQUtFX1VDQVNUKSB7CisJCXBtQ29uZi0+ZmlsdGVyc1tpXS5wYXR0ZXJuU2l6ZSA9IEVUSF9BTEVOOworCQlwbUNvbmYtPmZpbHRlcnNbaV0ubWFza1NpemUgPSAxOworCQltZW1jcHkocG1Db25mLT5maWx0ZXJzW2ldLnBhdHRlcm4sIG5ldGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwkJcG1Db25mLT5maWx0ZXJzW2ldLm1hc2tbMF0gPSAweDNGOyAvKiBMU0IgRVRIX0FMRU4gYml0cyAqLworCisJCXBtQ29uZi0+d2FrZVVwRXZlbnRzIHw9IFZNWE5FVDNfUE1fV0FLRVVQX0ZJTFRFUjsKKwkJaSsrOworCX0KKworCWlmIChhZGFwdGVyLT53b2wgJiBXQUtFX0FSUCkgeworCQlpbl9kZXYgPSBpbl9kZXZfZ2V0KG5ldGRldik7CisJCWlmICghaW5fZGV2KQorCQkJZ290byBza2lwX2FycDsKKworCQlpZmEgPSAoc3RydWN0IGluX2lmYWRkciAqKWluX2Rldi0+aWZhX2xpc3Q7CisJCWlmICghaWZhKQorCQkJZ290byBza2lwX2FycDsKKworCQlwbUNvbmYtPmZpbHRlcnNbaV0ucGF0dGVyblNpemUgPSBFVEhfSExFTiArIC8qIEV0aGVybmV0IGhlYWRlciovCisJCQlzaXplb2Yoc3RydWN0IGFycGhkcikgKwkJLyogQVJQIGhlYWRlciAqLworCQkJMiAqIEVUSF9BTEVOICsJCS8qIDIgRXRoZXJuZXQgYWRkcmVzc2VzKi8KKwkJCTIgKiBzaXplb2YodTMyKTsJLyoyIElQdjQgYWRkcmVzc2VzICovCisJCXBtQ29uZi0+ZmlsdGVyc1tpXS5tYXNrU2l6ZSA9CisJCQkocG1Db25mLT5maWx0ZXJzW2ldLnBhdHRlcm5TaXplIC0gMSkgLyA4ICsgMTsKKworCQkvKiBFVEhfUF9BUlAgaW4gRXRoZXJuZXQgaGVhZGVyLiAqLworCQllaGRyID0gKHN0cnVjdCBldGhoZHIgKilwbUNvbmYtPmZpbHRlcnNbaV0ucGF0dGVybjsKKwkJZWhkci0+aF9wcm90byA9IGh0b25zKEVUSF9QX0FSUCk7CisKKwkJLyogQVJQT1BfUkVRVUVTVCBpbiBBUlAgaGVhZGVyLiAqLworCQlhaGRyID0gKHN0cnVjdCBhcnBoZHIgKikmcG1Db25mLT5maWx0ZXJzW2ldLnBhdHRlcm5bRVRIX0hMRU5dOworCQlhaGRyLT5hcl9vcCA9IGh0b25zKEFSUE9QX1JFUVVFU1QpOworCQlhcnByZXEgPSAodTggKikoYWhkciArIDEpOworCisJCS8qIFRoZSBVbmljYXN0IElQdjQgYWRkcmVzcyBpbiAndGlwJyBmaWVsZC4gKi8KKwkJYXJwcmVxICs9IDIgKiBFVEhfQUxFTiArIHNpemVvZih1MzIpOworCQkqKHUzMiAqKWFycHJlcSA9IGlmYS0+aWZhX2FkZHJlc3M7CisKKwkJLyogVGhlIG1hc2sgZm9yIHRoZSByZWxldmFudCBiaXRzLiAqLworCQlwbUNvbmYtPmZpbHRlcnNbaV0ubWFza1swXSA9IDB4MDA7CisJCXBtQ29uZi0+ZmlsdGVyc1tpXS5tYXNrWzFdID0gMHgzMDsgLyogRVRIX1BfQVJQICovCisJCXBtQ29uZi0+ZmlsdGVyc1tpXS5tYXNrWzJdID0gMHgzMDsgLyogQVJQT1BfUkVRVUVTVCAqLworCQlwbUNvbmYtPmZpbHRlcnNbaV0ubWFza1szXSA9IDB4MDA7CisJCXBtQ29uZi0+ZmlsdGVyc1tpXS5tYXNrWzRdID0gMHhDMDsgLyogSVB2NCBUSVAgKi8KKwkJcG1Db25mLT5maWx0ZXJzW2ldLm1hc2tbNV0gPSAweDAzOyAvKiBJUHY0IFRJUCAqLworCQlpbl9kZXZfcHV0KGluX2Rldik7CisKKwkJcG1Db25mLT53YWtlVXBFdmVudHMgfD0gVk1YTkVUM19QTV9XQUtFVVBfRklMVEVSOworCQlpKys7CisJfQorCitza2lwX2FycDoKKwlpZiAoYWRhcHRlci0+d29sICYgV0FLRV9NQUdJQykKKwkJcG1Db25mLT53YWtlVXBFdmVudHMgfD0gVk1YTkVUM19QTV9XQUtFVVBfTUFHSUM7CisKKwlwbUNvbmYtPm51bUZpbHRlcnMgPSBpOworCisJYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLnBtQ29uZkRlc2MuY29uZlZlciA9IDE7CisJYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLnBtQ29uZkRlc2MuY29uZkxlbiA9IHNpemVvZigqcG1Db25mKTsKKwlhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQucG1Db25mRGVzYy5jb25mUEEgPSB2aXJ0X3RvX3BoeXMocG1Db25mKTsKKworCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELAorCQkJICAgICAgIFZNWE5FVDNfQ01EX1VQREFURV9QTUNGRyk7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBQTVNHX1NVU1BFTkQpLAorCQkJYWRhcHRlci0+d29sKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIFBNU0dfU1VTUEVORCkpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAordm14bmV0M19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWludCBlcnI7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgVm14bmV0M19QTUNvbmYgKnBtQ29uZjsKKworCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gMDsKKworCS8qIERlc3Ryb3kgd2FrZS11cCBmaWx0ZXJzLiAqLworCXBtQ29uZiA9IGFkYXB0ZXItPnBtX2NvbmY7CisJbWVtc2V0KHBtQ29uZiwgMCwgc2l6ZW9mKCpwbUNvbmYpKTsKKworCWFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5wbUNvbmZEZXNjLmNvbmZWZXIgPSAxOworCWFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5wbUNvbmZEZXNjLmNvbmZMZW4gPSBzaXplb2YoKnBtQ29uZik7CisJYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLnBtQ29uZkRlc2MuY29uZlBBID0gdmlydF90b19waHlzKHBtQ29uZik7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlX21lbShwZGV2KTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiBlcnI7CisKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKKworCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELAorCQkJICAgICAgIFZNWE5FVDNfQ01EX1VQREFURV9QTUNGRyk7CisJdm14bmV0M19hbGxvY19pbnRyX3Jlc291cmNlcyhhZGFwdGVyKTsKKwl2bXhuZXQzX3JlcXVlc3RfaXJxcyhhZGFwdGVyKTsKKwl2bXhuZXQzX2VuYWJsZV9hbGxfaW50cnMoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHZteG5ldDNfcG1fb3BzID0geworCS5zdXNwZW5kID0gdm14bmV0M19zdXNwZW5kLAorCS5yZXN1bWUgPSB2bXhuZXQzX3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZteG5ldDNfZHJpdmVyID0geworCS5uYW1lCQk9IHZteG5ldDNfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gdm14bmV0M19wY2lpZF90YWJsZSwKKwkucHJvYmUJCT0gdm14bmV0M19wcm9iZV9kZXZpY2UsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh2bXhuZXQzX3JlbW92ZV9kZXZpY2UpLAorI2lmZGVmIENPTkZJR19QTQorCS5kcml2ZXIucG0JPSAmdm14bmV0M19wbV9vcHMsCisjZW5kaWYKK307CisKKworc3RhdGljIGludCBfX2luaXQKK3ZteG5ldDNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyAtIHZlcnNpb24gJXNcbiIsIFZNWE5FVDNfRFJJVkVSX0RFU0MsCisJCVZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fUkVQT1JUKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdm14bmV0M19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh2bXhuZXQzX2luaXRfbW9kdWxlKTsKKworCitzdGF0aWMgdm9pZAordm14bmV0M19leGl0X21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdm14bmV0M19kcml2ZXIpOworfQorCittb2R1bGVfZXhpdCh2bXhuZXQzX2V4aXRfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiVk13YXJlLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oVk1YTkVUM19EUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfVkVSU0lPTihWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1NUUklORyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmMxNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYwpAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIExpbnV4IGRyaXZlciBmb3IgVk13YXJlJ3Mgdm14bmV0MyBldGhlcm5ldCBOSUMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDksIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlIGFuZCBubyBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogTWFpbnRhaW5lZCBieTogU2hyZXlhcyBCaGF0ZXdhcmEgPHB2LWRyaXZlcnNAdm13YXJlLmNvbT4KKyAqCisgKi8KKworCisjaW5jbHVkZSAidm14bmV0M19pbnQuaCIKKworc3RydWN0IHZteG5ldDNfc3RhdF9kZXNjIHsKKwljaGFyIGRlc2NbRVRIX0dTVFJJTkdfTEVOXTsKKwlpbnQgIG9mZnNldDsKK307CisKKworc3RhdGljIHUzMgordm14bmV0M19nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBhZGFwdGVyLT5yeGNzdW07Cit9CisKKworc3RhdGljIGludAordm14bmV0M19zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgdmFsKQoreworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKGFkYXB0ZXItPnJ4Y3N1bSAhPSB2YWwpIHsKKwkJYWRhcHRlci0+cnhjc3VtID0gdmFsOworCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCQlpZiAodmFsKQorCQkJCWFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5taXNjLnVwdEZlYXR1cmVzIHw9CisJCQkJCQkJCVVQVDFfRl9SWENTVU07CisJCQllbHNlCisJCQkJYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLm1pc2MudXB0RmVhdHVyZXMgJj0KKwkJCQkJCQkJflVQVDFfRl9SWENTVU07CisKKwkJCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELAorCQkJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX0ZFQVRVUkUpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qIHBlciB0cSBzdGF0cyBtYWludGFpbmVkIGJ5IHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm14bmV0M19zdGF0X2Rlc2MKK3ZteG5ldDNfdHFfZGV2X3N0YXRzW10gPSB7CisJLyogZGVzY3JpcHRpb24sICAgICAgICAgb2Zmc2V0ICovCisJeyAiVFNPIHBrdHMgdHgiLCAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IFVQVDFfVHhTdGF0cywgVFNPUGt0c1R4T0spIH0sCisJeyAiVFNPIGJ5dGVzIHR4IiwgICAgICAgb2Zmc2V0b2Yoc3RydWN0IFVQVDFfVHhTdGF0cywgVFNPQnl0ZXNUeE9LKSB9LAorCXsgInVjYXN0IHBrdHMgdHgiLCAgICAgIG9mZnNldG9mKHN0cnVjdCBVUFQxX1R4U3RhdHMsIHVjYXN0UGt0c1R4T0spIH0sCisJeyAidWNhc3QgYnl0ZXMgdHgiLCAgICAgb2Zmc2V0b2Yoc3RydWN0IFVQVDFfVHhTdGF0cywgdWNhc3RCeXRlc1R4T0spIH0sCisJeyAibWNhc3QgcGt0cyB0eCIsICAgICAgb2Zmc2V0b2Yoc3RydWN0IFVQVDFfVHhTdGF0cywgbWNhc3RQa3RzVHhPSykgfSwKKwl7ICJtY2FzdCBieXRlcyB0eCIsICAgICBvZmZzZXRvZihzdHJ1Y3QgVVBUMV9UeFN0YXRzLCBtY2FzdEJ5dGVzVHhPSykgfSwKKwl7ICJiY2FzdCBwa3RzIHR4IiwgICAgICBvZmZzZXRvZihzdHJ1Y3QgVVBUMV9UeFN0YXRzLCBiY2FzdFBrdHNUeE9LKSB9LAorCXsgImJjYXN0IGJ5dGVzIHR4IiwgICAgIG9mZnNldG9mKHN0cnVjdCBVUFQxX1R4U3RhdHMsIGJjYXN0Qnl0ZXNUeE9LKSB9LAorCXsgInBrdHMgdHggZXJyIiwgICAgICAgIG9mZnNldG9mKHN0cnVjdCBVUFQxX1R4U3RhdHMsIHBrdHNUeEVycm9yKSB9LAorCXsgInBrdHMgdHggZGlzY2FyZCIsICAgIG9mZnNldG9mKHN0cnVjdCBVUFQxX1R4U3RhdHMsIHBrdHNUeERpc2NhcmQpIH0sCit9OworCisvKiBwZXIgdHEgc3RhdHMgbWFpbnRhaW5lZCBieSB0aGUgZHJpdmVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZteG5ldDNfc3RhdF9kZXNjCit2bXhuZXQzX3RxX2RyaXZlcl9zdGF0c1tdID0geworCS8qIGRlc2NyaXB0aW9uLCAgICAgICAgIG9mZnNldCAqLworCXsiZHJ2IGRyb3BwZWQgdHggdG90YWwiLCBvZmZzZXRvZihzdHJ1Y3Qgdm14bmV0M190cV9kcml2ZXJfc3RhdHMsCisJCQkJCWRyb3BfdG90YWwpIH0sCisJeyAiICAgdG9vIG1hbnkgZnJhZ3MiLCAgb2Zmc2V0b2Yoc3RydWN0IHZteG5ldDNfdHFfZHJpdmVyX3N0YXRzLAorCQkJCQlkcm9wX3Rvb19tYW55X2ZyYWdzKSB9LAorCXsgIiAgIGdpYW50IGhkciIsICAgICAgIG9mZnNldG9mKHN0cnVjdCB2bXhuZXQzX3RxX2RyaXZlcl9zdGF0cywKKwkJCQkJZHJvcF9vdmVyc2l6ZWRfaGRyKSB9LAorCXsgIiAgIGhkciBlcnIiLCAgICAgICAgIG9mZnNldG9mKHN0cnVjdCB2bXhuZXQzX3RxX2RyaXZlcl9zdGF0cywKKwkJCQkJZHJvcF9oZHJfaW5zcGVjdF9lcnIpIH0sCisJeyAiICAgdHNvIiwgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHZteG5ldDNfdHFfZHJpdmVyX3N0YXRzLAorCQkJCQlkcm9wX3RzbykgfSwKKwl7ICJyaW5nIGZ1bGwiLCAgICAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgdm14bmV0M190cV9kcml2ZXJfc3RhdHMsCisJCQkJCXR4X3JpbmdfZnVsbCkgfSwKKwl7ICJwa3RzIGxpbmVhcml6ZWQiLCAgICBvZmZzZXRvZihzdHJ1Y3Qgdm14bmV0M190cV9kcml2ZXJfc3RhdHMsCisJCQkJCWxpbmVhcml6ZWQpIH0sCisJeyAiaGRyIGNsb25lZCIsICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHZteG5ldDNfdHFfZHJpdmVyX3N0YXRzLAorCQkJCQljb3B5X3NrYl9oZWFkZXIpIH0sCisJeyAiZ2lhbnQgaGRyIiwgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHZteG5ldDNfdHFfZHJpdmVyX3N0YXRzLAorCQkJCQlvdmVyc2l6ZWRfaGRyKSB9LAorfTsKKworLyogcGVyIHJxIHN0YXRzIG1haW50YWluZWQgYnkgdGhlIGRldmljZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2bXhuZXQzX3N0YXRfZGVzYwordm14bmV0M19ycV9kZXZfc3RhdHNbXSA9IHsKKwl7ICJMUk8gcGt0cyByeCIsICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgVVBUMV9SeFN0YXRzLCBMUk9Qa3RzUnhPSykgfSwKKwl7ICJMUk8gYnl0ZSByeCIsICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgVVBUMV9SeFN0YXRzLCBMUk9CeXRlc1J4T0spIH0sCisJeyAidWNhc3QgcGt0cyByeCIsICAgICAgb2Zmc2V0b2Yoc3RydWN0IFVQVDFfUnhTdGF0cywgdWNhc3RQa3RzUnhPSykgfSwKKwl7ICJ1Y2FzdCBieXRlcyByeCIsICAgICBvZmZzZXRvZihzdHJ1Y3QgVVBUMV9SeFN0YXRzLCB1Y2FzdEJ5dGVzUnhPSykgfSwKKwl7ICJtY2FzdCBwa3RzIHJ4IiwgICAgICBvZmZzZXRvZihzdHJ1Y3QgVVBUMV9SeFN0YXRzLCBtY2FzdFBrdHNSeE9LKSB9LAorCXsgIm1jYXN0IGJ5dGVzIHJ4IiwgICAgIG9mZnNldG9mKHN0cnVjdCBVUFQxX1J4U3RhdHMsIG1jYXN0Qnl0ZXNSeE9LKSB9LAorCXsgImJjYXN0IHBrdHMgcngiLCAgICAgIG9mZnNldG9mKHN0cnVjdCBVUFQxX1J4U3RhdHMsIGJjYXN0UGt0c1J4T0spIH0sCisJeyAiYmNhc3QgYnl0ZXMgcngiLCAgICAgb2Zmc2V0b2Yoc3RydWN0IFVQVDFfUnhTdGF0cywgYmNhc3RCeXRlc1J4T0spIH0sCisJeyAicGt0cyByeCBvdXQgb2YgYnVmIiwgb2Zmc2V0b2Yoc3RydWN0IFVQVDFfUnhTdGF0cywgcGt0c1J4T3V0T2ZCdWYpIH0sCisJeyAicGt0cyByeCBlcnIiLCAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IFVQVDFfUnhTdGF0cywgcGt0c1J4RXJyb3IpIH0sCit9OworCisvKiBwZXIgcnEgc3RhdHMgbWFpbnRhaW5lZCBieSB0aGUgZHJpdmVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZteG5ldDNfc3RhdF9kZXNjCit2bXhuZXQzX3JxX2RyaXZlcl9zdGF0c1tdID0geworCS8qIGRlc2NyaXB0aW9uLCAgICAgICAgIG9mZnNldCAqLworCXsgImRydiBkcm9wcGVkIHJ4IHRvdGFsIiwgb2Zmc2V0b2Yoc3RydWN0IHZteG5ldDNfcnFfZHJpdmVyX3N0YXRzLAorCQkJCQkgICBkcm9wX3RvdGFsKSB9LAorCXsgIiAgIGVyciIsICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHZteG5ldDNfcnFfZHJpdmVyX3N0YXRzLAorCQkJCQlkcm9wX2VycikgfSwKKwl7ICIgICBmY3MiLCAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCB2bXhuZXQzX3JxX2RyaXZlcl9zdGF0cywKKwkJCQkJZHJvcF9mY3MpIH0sCisJeyAicnggYnVmIGFsbG9jIGZhaWwiLCBvZmZzZXRvZihzdHJ1Y3Qgdm14bmV0M19ycV9kcml2ZXJfc3RhdHMsCisJCQkJCXJ4X2J1Zl9hbGxvY19mYWlsdXJlKSB9LAorfTsKKworLyogZ2xvYWJsIHN0YXRzIG1haW50YWluZWQgYnkgdGhlIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2bXhuZXQzX3N0YXRfZGVzYwordm14bmV0M19nbG9iYWxfc3RhdHNbXSA9IHsKKwkvKiBkZXNjcmlwdGlvbiwgICAgICAgICBvZmZzZXQgKi8KKwl7ICJ0eCB0aW1lb3V0IGNvdW50IiwgICBvZmZzZXRvZihzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyLAorCQkJCQkgdHhfdGltZW91dF9jb3VudCkgfQorfTsKKworCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCit2bXhuZXQzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IHZteG5ldDNfdHFfZHJpdmVyX3N0YXRzICpkcnZUeFN0YXRzOworCXN0cnVjdCB2bXhuZXQzX3JxX2RyaXZlcl9zdGF0cyAqZHJ2UnhTdGF0czsKKwlzdHJ1Y3QgVVBUMV9UeFN0YXRzICpkZXZUeFN0YXRzOworCXN0cnVjdCBVUFQxX1J4U3RhdHMgKmRldlJ4U3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9zdGF0cyA9ICZuZXRkZXYtPnN0YXRzOworCisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwkvKiBDb2xsZWN0IHRoZSBkZXYgc3RhdHMgaW50byB0aGUgc2hhcmVkIGFyZWEgKi8KKwlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwgVk1YTkVUM19DTURfR0VUX1NUQVRTKTsKKworCS8qIEFzc3VtaW5nIHRoYXQgd2UgaGF2ZSBhIHNpbmdsZSBxdWV1ZSBkZXZpY2UgKi8KKwlkZXZUeFN0YXRzID0gJmFkYXB0ZXItPnRxZF9zdGFydC0+c3RhdHM7CisJZGV2UnhTdGF0cyA9ICZhZGFwdGVyLT5ycWRfc3RhcnQtPnN0YXRzOworCisJLyogR2V0IGFjY2VzcyB0byB0aGUgZHJpdmVyIHN0YXRzIHBlciBxdWV1ZSAqLworCWRydlR4U3RhdHMgPSAmYWRhcHRlci0+dHhfcXVldWUuc3RhdHM7CisJZHJ2UnhTdGF0cyA9ICZhZGFwdGVyLT5yeF9xdWV1ZS5zdGF0czsKKworCW1lbXNldChuZXRfc3RhdHMsIDAsIHNpemVvZigqbmV0X3N0YXRzKSk7CisKKwluZXRfc3RhdHMtPnJ4X3BhY2tldHMgPSBkZXZSeFN0YXRzLT51Y2FzdFBrdHNSeE9LICsKKwkJCQlkZXZSeFN0YXRzLT5tY2FzdFBrdHNSeE9LICsKKwkJCQlkZXZSeFN0YXRzLT5iY2FzdFBrdHNSeE9LOworCisJbmV0X3N0YXRzLT50eF9wYWNrZXRzID0gZGV2VHhTdGF0cy0+dWNhc3RQa3RzVHhPSyArCisJCQkJZGV2VHhTdGF0cy0+bWNhc3RQa3RzVHhPSyArCisJCQkJZGV2VHhTdGF0cy0+YmNhc3RQa3RzVHhPSzsKKworCW5ldF9zdGF0cy0+cnhfYnl0ZXMgPSBkZXZSeFN0YXRzLT51Y2FzdEJ5dGVzUnhPSyArCisJCQkgICAgICBkZXZSeFN0YXRzLT5tY2FzdEJ5dGVzUnhPSyArCisJCQkgICAgICBkZXZSeFN0YXRzLT5iY2FzdEJ5dGVzUnhPSzsKKworCW5ldF9zdGF0cy0+dHhfYnl0ZXMgPSBkZXZUeFN0YXRzLT51Y2FzdEJ5dGVzVHhPSyArCisJCQkgICAgICBkZXZUeFN0YXRzLT5tY2FzdEJ5dGVzVHhPSyArCisJCQkgICAgICBkZXZUeFN0YXRzLT5iY2FzdEJ5dGVzVHhPSzsKKworCW5ldF9zdGF0cy0+cnhfZXJyb3JzID0gZGV2UnhTdGF0cy0+cGt0c1J4RXJyb3I7CisJbmV0X3N0YXRzLT50eF9lcnJvcnMgPSBkZXZUeFN0YXRzLT5wa3RzVHhFcnJvcjsKKwluZXRfc3RhdHMtPnJ4X2Ryb3BwZWQgPSBkcnZSeFN0YXRzLT5kcm9wX3RvdGFsOworCW5ldF9zdGF0cy0+dHhfZHJvcHBlZCA9IGRydlR4U3RhdHMtPmRyb3BfdG90YWw7CisJbmV0X3N0YXRzLT5tdWx0aWNhc3QgPSAgZGV2UnhTdGF0cy0+bWNhc3RQa3RzUnhPSzsKKworCXJldHVybiBuZXRfc3RhdHM7Cit9CisKK3N0YXRpYyBpbnQKK3ZteG5ldDNfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHNzZXQpCit7CisJc3dpdGNoIChzc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCXJldHVybiBBUlJBWV9TSVpFKHZteG5ldDNfdHFfZGV2X3N0YXRzKSArCisJCQlBUlJBWV9TSVpFKHZteG5ldDNfdHFfZHJpdmVyX3N0YXRzKSArCisJCQlBUlJBWV9TSVpFKHZteG5ldDNfcnFfZGV2X3N0YXRzKSArCisJCQlBUlJBWV9TSVpFKHZteG5ldDNfcnFfZHJpdmVyX3N0YXRzKSArCisJCQlBUlJBWV9TSVpFKHZteG5ldDNfZ2xvYmFsX3N0YXRzKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisKK3N0YXRpYyBpbnQKK3ZteG5ldDNfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIDIwICogc2l6ZW9mKHUzMik7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCB2bXhuZXQzX2RyaXZlcl9uYW1lLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJZHJ2aW5mby0+ZHJpdmVyW3NpemVvZihkcnZpbmZvLT5kcml2ZXIpIC0gMV0gPSAnXDAnOworCisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1JFUE9SVCwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlkcnZpbmZvLT5kcml2ZXJbc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pIC0gMV0gPSAnXDAnOworCisJc3RybGNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgc2l6ZW9mKGRydmluZm8tPmZ3X3ZlcnNpb24pKTsKKwlkcnZpbmZvLT5md192ZXJzaW9uW3NpemVvZihkcnZpbmZvLT5md192ZXJzaW9uKSAtIDFdID0gJ1wwJzsKKworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlFVEhUT09MX0JVU0lORk9fTEVOKTsKKwlkcnZpbmZvLT5uX3N0YXRzID0gdm14bmV0M19nZXRfc3NldF9jb3VudChuZXRkZXYsIEVUSF9TU19TVEFUUyk7CisJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gMDsKKwlkcnZpbmZvLT5lZWR1bXBfbGVuICAgPSAwOworCWRydmluZm8tPnJlZ2R1bXBfbGVuICA9IHZteG5ldDNfZ2V0X3JlZ3NfbGVuKG5ldGRldik7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwgdTggKmJ1ZikKK3sKKwlpZiAoc3RyaW5nc2V0ID09IEVUSF9TU19TVEFUUykgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bXhuZXQzX3RxX2Rldl9zdGF0cyk7IGkrKykgeworCQkJbWVtY3B5KGJ1Ziwgdm14bmV0M190cV9kZXZfc3RhdHNbaV0uZGVzYywKKwkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOworCQkJYnVmICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bXhuZXQzX3RxX2RyaXZlcl9zdGF0cyk7IGkrKykgeworCQkJbWVtY3B5KGJ1Ziwgdm14bmV0M190cV9kcml2ZXJfc3RhdHNbaV0uZGVzYywKKwkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOworCQkJYnVmICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bXhuZXQzX3JxX2Rldl9zdGF0cyk7IGkrKykgeworCQkJbWVtY3B5KGJ1Ziwgdm14bmV0M19ycV9kZXZfc3RhdHNbaV0uZGVzYywKKwkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOworCQkJYnVmICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bXhuZXQzX3JxX2RyaXZlcl9zdGF0cyk7IGkrKykgeworCQkJbWVtY3B5KGJ1Ziwgdm14bmV0M19ycV9kcml2ZXJfc3RhdHNbaV0uZGVzYywKKwkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOworCQkJYnVmICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bXhuZXQzX2dsb2JhbF9zdGF0cyk7IGkrKykgeworCQkJbWVtY3B5KGJ1Ziwgdm14bmV0M19nbG9iYWxfc3RhdHNbaV0uZGVzYywKKwkJCQlFVEhfR1NUUklOR19MRU4pOworCQkJYnVmICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCX0KK30KKworc3RhdGljIHUzMgordm14bmV0M19nZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikgeworCXJldHVybiBuZXRkZXYtPmZlYXR1cmVzOworfQorCitzdGF0aWMgaW50Cit2bXhuZXQzX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkgeworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXU4IGxyb19yZXF1ZXN0ZWQgPSAoZGF0YSAmIEVUSF9GTEFHX0xSTykgPT0gMCA/IDAgOiAxOworCXU4IGxyb19wcmVzZW50ID0gKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykgPT0gMCA/IDAgOiAxOworCisJaWYgKGxyb19yZXF1ZXN0ZWQgXiBscm9fcHJlc2VudCkgeworCQkvKiB0b2dnbGUgdGhlIExSTyBmZWF0dXJlKi8KKwkJbmV0ZGV2LT5mZWF0dXJlcyBePSBORVRJRl9GX0xSTzsKKworCQkvKiB1cGRhdGUgaGFyd2FyZSBMUk8gY2FwYWJpbGl0eSBhY2NvcmRpbmdseSAqLworCQlpZiAobHJvX3JlcXVlc3RlZCkKKwkJCWFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5taXNjLnVwdEZlYXR1cmVzICY9IFVQVDFfRl9MUk87CisJCWVsc2UKKwkJCWFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5taXNjLnVwdEZlYXR1cmVzICY9CisJCQkJCQkJCX5VUFQxX0ZfTFJPOworCQlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwKKwkJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX0ZFQVRVUkUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgICpidWYpCit7CisJc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTggKmJhc2U7CisJaW50IGk7CisKKwlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwgVk1YTkVUM19DTURfR0VUX1NUQVRTKTsKKworCS8qIHRoaXMgZG9lcyBhc3N1bWUgZWFjaCBjb3VudGVyIGlzIDY0LWJpdCB3aWRlICovCisKKwliYXNlID0gKHU4ICopJmFkYXB0ZXItPnRxZF9zdGFydC0+c3RhdHM7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodm14bmV0M190cV9kZXZfc3RhdHMpOyBpKyspCisJCSpidWYrKyA9ICoodTY0ICopKGJhc2UgKyB2bXhuZXQzX3RxX2Rldl9zdGF0c1tpXS5vZmZzZXQpOworCisJYmFzZSA9ICh1OCAqKSZhZGFwdGVyLT50eF9xdWV1ZS5zdGF0czsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bXhuZXQzX3RxX2RyaXZlcl9zdGF0cyk7IGkrKykKKwkJKmJ1ZisrID0gKih1NjQgKikoYmFzZSArIHZteG5ldDNfdHFfZHJpdmVyX3N0YXRzW2ldLm9mZnNldCk7CisKKwliYXNlID0gKHU4ICopJmFkYXB0ZXItPnJxZF9zdGFydC0+c3RhdHM7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodm14bmV0M19ycV9kZXZfc3RhdHMpOyBpKyspCisJCSpidWYrKyA9ICoodTY0ICopKGJhc2UgKyB2bXhuZXQzX3JxX2Rldl9zdGF0c1tpXS5vZmZzZXQpOworCisJYmFzZSA9ICh1OCAqKSZhZGFwdGVyLT5yeF9xdWV1ZS5zdGF0czsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bXhuZXQzX3JxX2RyaXZlcl9zdGF0cyk7IGkrKykKKwkJKmJ1ZisrID0gKih1NjQgKikoYmFzZSArIHZteG5ldDNfcnFfZHJpdmVyX3N0YXRzW2ldLm9mZnNldCk7CisKKwliYXNlID0gKHU4ICopYWRhcHRlcjsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bXhuZXQzX2dsb2JhbF9zdGF0cyk7IGkrKykKKwkJKmJ1ZisrID0gKih1NjQgKikoYmFzZSArIHZteG5ldDNfZ2xvYmFsX3N0YXRzW2ldLm9mZnNldCk7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgKmJ1ZiA9IHA7CisKKwltZW1zZXQocCwgMCwgdm14bmV0M19nZXRfcmVnc19sZW4obmV0ZGV2KSk7CisKKwlyZWdzLT52ZXJzaW9uID0gMTsKKworCS8qIFVwZGF0ZSB2bXhuZXQzX2dldF9yZWdzX2xlbiBpZiB3ZSB3YW50IHRvIGR1bXAgbW9yZSByZWdpc3RlcnMgKi8KKworCS8qIG1ha2UgZWFjaCByaW5nIHVzZSBtdWx0aXBsZSBvZiAxNiBieXRlcyAqLworCWJ1ZlswXSA9IGFkYXB0ZXItPnR4X3F1ZXVlLnR4X3JpbmcubmV4dDJmaWxsOworCWJ1ZlsxXSA9IGFkYXB0ZXItPnR4X3F1ZXVlLnR4X3JpbmcubmV4dDJjb21wOworCWJ1ZlsyXSA9IGFkYXB0ZXItPnR4X3F1ZXVlLnR4X3JpbmcuZ2VuOworCWJ1ZlszXSA9IDA7CisKKwlidWZbNF0gPSBhZGFwdGVyLT50eF9xdWV1ZS5jb21wX3JpbmcubmV4dDJwcm9jOworCWJ1Zls1XSA9IGFkYXB0ZXItPnR4X3F1ZXVlLmNvbXBfcmluZy5nZW47CisJYnVmWzZdID0gYWRhcHRlci0+dHhfcXVldWUuc3RvcHBlZDsKKwlidWZbN10gPSAwOworCisJYnVmWzhdID0gYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1swXS5uZXh0MmZpbGw7CisJYnVmWzldID0gYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1swXS5uZXh0MmNvbXA7CisJYnVmWzEwXSA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnJ4X3JpbmdbMF0uZ2VuOworCWJ1ZlsxMV0gPSAwOworCisJYnVmWzEyXSA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnJ4X3JpbmdbMV0ubmV4dDJmaWxsOworCWJ1ZlsxM10gPSBhZGFwdGVyLT5yeF9xdWV1ZS5yeF9yaW5nWzFdLm5leHQyY29tcDsKKwlidWZbMTRdID0gYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1sxXS5nZW47CisJYnVmWzE1XSA9IDA7CisKKwlidWZbMTZdID0gYWRhcHRlci0+cnhfcXVldWUuY29tcF9yaW5nLm5leHQycHJvYzsKKwlidWZbMTddID0gYWRhcHRlci0+cnhfcXVldWUuY29tcF9yaW5nLmdlbjsKKwlidWZbMThdID0gMDsKKwlidWZbMTldID0gMDsKK30KKworCitzdGF0aWMgdm9pZAordm14bmV0M19nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9VQ0FTVCB8IFdBS0VfQVJQIHwgV0FLRV9NQUdJQzsKKwl3b2wtPndvbG9wdHMgPSBhZGFwdGVyLT53b2w7Cit9CisKKworc3RhdGljIGludAordm14bmV0M19zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmICh3b2wtPndvbG9wdHMgJiAoV0FLRV9QSFkgfCBXQUtFX01DQVNUIHwgV0FLRV9CQ0FTVCB8CisJCQkgICAgV0FLRV9NQUdJQ1NFQ1VSRSkpIHsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWFkYXB0ZXItPndvbCA9IHdvbC0+d29sb3B0czsKKworCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmYWRhcHRlci0+cGRldi0+ZGV2LCBhZGFwdGVyLT53b2wpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAordm14bmV0M19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgIFNVUFBPUlRFRF9UUDsKKwllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfVFA7CisJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCisJaWYgKGFkYXB0ZXItPmxpbmtfc3BlZWQpIHsKKwkJZWNtZC0+c3BlZWQgPSBhZGFwdGVyLT5saW5rX3NwZWVkOworCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl9IGVsc2UgeworCQllY21kLT5zcGVlZCA9IC0xOworCQllY21kLT5kdXBsZXggPSAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK3ZteG5ldDNfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnBhcmFtKQoreworCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcGFyYW0tPnJ4X21heF9wZW5kaW5nID0gVk1YTkVUM19SWF9SSU5HX01BWF9TSVpFOworCXBhcmFtLT50eF9tYXhfcGVuZGluZyA9IFZNWE5FVDNfVFhfUklOR19NQVhfU0laRTsKKwlwYXJhbS0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJcGFyYW0tPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKworCXBhcmFtLT5yeF9wZW5kaW5nID0gYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1swXS5zaXplOworCXBhcmFtLT50eF9wZW5kaW5nID0gYWRhcHRlci0+dHhfcXVldWUudHhfcmluZy5zaXplOworCXBhcmFtLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCXBhcmFtLT5yeF9qdW1ib19wZW5kaW5nID0gMDsKK30KKworCitzdGF0aWMgaW50Cit2bXhuZXQzX3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgbmV3X3R4X3Jpbmdfc2l6ZSwgbmV3X3J4X3Jpbmdfc2l6ZTsKKwl1MzIgc3o7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGFyYW0tPnR4X3BlbmRpbmcgPT0gMCB8fCBwYXJhbS0+dHhfcGVuZGluZyA+CisJCQkJCQlWTVhORVQzX1RYX1JJTkdfTUFYX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBhcmFtLT5yeF9wZW5kaW5nID09IDAgfHwgcGFyYW0tPnJ4X3BlbmRpbmcgPgorCQkJCQkJVk1YTkVUM19SWF9SSU5HX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCisJLyogcm91bmQgaXQgdXAgdG8gYSBtdWx0aXBsZSBvZiBWTVhORVQzX1JJTkdfU0laRV9BTElHTiAqLworCW5ld190eF9yaW5nX3NpemUgPSAocGFyYW0tPnR4X3BlbmRpbmcgKyBWTVhORVQzX1JJTkdfU0laRV9NQVNLKSAmCisJCQkJCQkJflZNWE5FVDNfUklOR19TSVpFX01BU0s7CisJbmV3X3R4X3Jpbmdfc2l6ZSA9IG1pbl90KHUzMiwgbmV3X3R4X3Jpbmdfc2l6ZSwKKwkJCQkgVk1YTkVUM19UWF9SSU5HX01BWF9TSVpFKTsKKwlpZiAobmV3X3R4X3Jpbmdfc2l6ZSA+IFZNWE5FVDNfVFhfUklOR19NQVhfU0laRSB8fCAobmV3X3R4X3Jpbmdfc2l6ZSAlCisJCQkJCQlWTVhORVQzX1JJTkdfU0laRV9BTElHTikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByaW5nMCBoYXMgdG8gYmUgYSBtdWx0aXBsZSBvZgorCSAqIHJ4X2J1Zl9wZXJfcGt0ICogVk1YTkVUM19SSU5HX1NJWkVfQUxJR04KKwkgKi8KKwlzeiA9IGFkYXB0ZXItPnJ4X2J1Zl9wZXJfcGt0ICogVk1YTkVUM19SSU5HX1NJWkVfQUxJR047CisJbmV3X3J4X3Jpbmdfc2l6ZSA9IChwYXJhbS0+cnhfcGVuZGluZyArIHN6IC0gMSkgLyBzeiAqIHN6OworCW5ld19yeF9yaW5nX3NpemUgPSBtaW5fdCh1MzIsIG5ld19yeF9yaW5nX3NpemUsCisJCQkJIFZNWE5FVDNfUlhfUklOR19NQVhfU0laRSAvIHN6ICogc3opOworCWlmIChuZXdfcnhfcmluZ19zaXplID4gVk1YTkVUM19SWF9SSU5HX01BWF9TSVpFIHx8IChuZXdfcnhfcmluZ19zaXplICUKKwkJCQkJCQkgICBzeikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmV3X3R4X3Jpbmdfc2l6ZSA9PSBhZGFwdGVyLT50eF9xdWV1ZS50eF9yaW5nLnNpemUgJiYKKwkJCW5ld19yeF9yaW5nX3NpemUgPT0gYWRhcHRlci0+cnhfcXVldWUucnhfcmluZ1swXS5zaXplKSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogUmVzZXRfd29yayBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiByZXNldHRpbmcgdGhlIGRldmljZSwgd2FpdCBmb3IgaXRzCisJICogY29tcGxldGlvbi4KKwkgKi8KKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChWTVhORVQzX1NUQVRFX0JJVF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSkpCisJCW1zbGVlcCgxKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJdm14bmV0M19xdWllc2NlX2RldihhZGFwdGVyKTsKKwkJdm14bmV0M19yZXNldF9kZXYoYWRhcHRlcik7CisKKwkJLyogcmVjcmVhdGUgdGhlIHJ4IHF1ZXVlIGFuZCB0aGUgdHggcXVldWUgYmFzZWQgb24gdGhlCisJCSAqIG5ldyBzaXplcyAqLworCQl2bXhuZXQzX3RxX2Rlc3Ryb3koJmFkYXB0ZXItPnR4X3F1ZXVlLCBhZGFwdGVyKTsKKwkJdm14bmV0M19ycV9kZXN0cm95KCZhZGFwdGVyLT5yeF9xdWV1ZSwgYWRhcHRlcik7CisKKwkJZXJyID0gdm14bmV0M19jcmVhdGVfcXVldWVzKGFkYXB0ZXIsIG5ld190eF9yaW5nX3NpemUsCisJCQluZXdfcnhfcmluZ19zaXplLCBWTVhORVQzX0RFRl9SWF9SSU5HX1NJWkUpOworCQlpZiAoZXJyKSB7CisJCQkvKiBmYWlsZWQsIG1vc3QgbGlrZWx5IGJlY2F1c2Ugb2YgT09NLCB0cnkgZGVmYXVsdAorCQkJICogc2l6ZSAqLworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFwcGx5IG5ldyBzaXplcywgdHJ5IHRoZSIKKwkJCQkiIGRlZmF1bHQgb25lc1xuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJCWVyciA9IHZteG5ldDNfY3JlYXRlX3F1ZXVlcyhhZGFwdGVyLAorCQkJCQkJICAgIFZNWE5FVDNfREVGX1RYX1JJTkdfU0laRSwKKwkJCQkJCSAgICBWTVhORVQzX0RFRl9SWF9SSU5HX1NJWkUsCisJCQkJCQkgICAgVk1YTkVUM19ERUZfUlhfUklOR19TSVpFKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIHF1ZXVlcyAiCisJCQkJCSJ3aXRoIGRlZmF1bHQgc2l6ZXMuIENsb3NpbmcgaXRcbiIsCisJCQkJCW5ldGRldi0+bmFtZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQllcnIgPSB2bXhuZXQzX2FjdGl2YXRlX2RldihhZGFwdGVyKTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZS1hY3RpdmF0ZSwgZXJyb3IgJWQuIgorCQkJCSIgQ2xvc2luZyBpdFxuIiwgbmV0ZGV2LT5uYW1lLCBlcnIpOworCX0KKworb3V0OgorCWNsZWFyX2JpdChWTVhORVQzX1NUQVRFX0JJVF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CisJaWYgKGVycikKKwkJdm14bmV0M19mb3JjZV9jbG9zZShhZGFwdGVyKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB2bXhuZXQzX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgICAgICA9IHZteG5ldDNfZ2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyAgICAgICA9IHZteG5ldDNfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbiAgICAgID0gdm14bmV0M19nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzICAgICAgICAgID0gdm14bmV0M19nZXRfcmVncywKKwkuZ2V0X3dvbCAgICAgICAgICAgPSB2bXhuZXQzX2dldF93b2wsCisJLnNldF93b2wgICAgICAgICAgID0gdm14bmV0M19zZXRfd29sLAorCS5nZXRfbGluayAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9yeF9jc3VtICAgICAgID0gdm14bmV0M19nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gICAgICAgPSB2bXhuZXQzX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtICAgICAgID0gZXRodG9vbF9vcF9zZXRfdHhfaHdfY3N1bSwKKwkuZ2V0X3NnICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnICAgICAgICAgICAgPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbyAgICAgICAgICAgPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28gICAgICAgICAgID0gZXRodG9vbF9vcF9zZXRfdHNvLAorCS5nZXRfc3RyaW5ncyAgICAgICA9IHZteG5ldDNfZ2V0X3N0cmluZ3MsCisJLmdldF9mbGFncwkgICA9IHZteG5ldDNfZ2V0X2ZsYWdzLAorCS5zZXRfZmxhZ3MJICAgPSB2bXhuZXQzX3NldF9mbGFncywKKwkuZ2V0X3NzZXRfY291bnQJICAgPSB2bXhuZXQzX2dldF9zc2V0X2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IHZteG5ldDNfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9yaW5ncGFyYW0gICAgID0gdm14bmV0M19nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtICAgICA9IHZteG5ldDNfc2V0X3JpbmdwYXJhbSwKK307CisKK3ZvaWQgdm14bmV0M19zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmdm14bmV0M19ldGh0b29sX29wcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmggYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwZDcwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaApAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIExpbnV4IGRyaXZlciBmb3IgVk13YXJlJ3Mgdm14bmV0MyBldGhlcm5ldCBOSUMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDksIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlIGFuZCBubyBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAqIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICogTWFpbnRhaW5lZCBieTogU2hyZXlhcyBCaGF0ZXdhcmEgPHB2LWRyaXZlcnNAdm13YXJlLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfVk1YTkVUM19JTlRfSAorI2RlZmluZSBfVk1YTkVUM19JTlRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgInZteG5ldDNfZGVmcy5oIgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fUkVQT1JUIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HIi1OQVBJKGRlYnVnKSIKKyNlbHNlCisjIGRlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1JFUE9SVCBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1NUUklORyItTkFQSSIKKyNlbmRpZgorCisKKy8qCisgKiBWZXJzaW9uIG51bWJlcnMKKyAqLworI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1NUUklORyAgICIxLjAuNS4wLWsiCisKKy8qIGEgMzItYml0IGludCwgZWFjaCBieXRlIGVuY29kZSBhIHZlcmlvbiBudW1iZXIgaW4gVk1YTkVUM19EUklWRVJfVkVSU0lPTiAqLworI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX05VTSAgICAgIDB4MDEwMDA1MDAKKworCisvKgorICogQ2FwYWJpbGl0aWVzCisgKi8KKworZW51bSB7CisJVk1ORVRfQ0FQX1NHCSAgICAgICAgPSAweDAwMDEsIC8qIENhbiBkbyBzY2F0dGVyLWdhdGhlciB0cmFuc21pdHMuICovCisJVk1ORVRfQ0FQX0lQNF9DU1VNICAgICAgPSAweDAwMDIsIC8qIENhbiBjaGVja3N1bSBvbmx5IFRDUC9VRFAgb3ZlcgorCQkJCQkgICAqIElQdjQgKi8KKwlWTU5FVF9DQVBfSFdfQ1NVTSAgICAgICA9IDB4MDAwNCwgLyogQ2FuIGNoZWNrc3VtIGFsbCBwYWNrZXRzLiAqLworCVZNTkVUX0NBUF9ISUdIX0RNQSAgICAgID0gMHgwMDA4LCAvKiBDYW4gRE1BIHRvIGhpZ2ggbWVtb3J5LiAqLworCVZNTkVUX0NBUF9UT0UJICAgICAgICA9IDB4MDAxMCwgLyogU3VwcG9ydHMgVENQL0lQIG9mZmxvYWQuICovCisJVk1ORVRfQ0FQX1RTTwkgICAgICAgID0gMHgwMDIwLCAvKiBTdXBwb3J0cyBUQ1AgU2VnbWVudGF0aW9uCisJCQkJCSAgICogb2ZmbG9hZCAqLworCVZNTkVUX0NBUF9TV19UU08gICAgICAgID0gMHgwMDQwLCAvKiBTdXBwb3J0cyBTVyBUQ1AgU2VnbWVudGF0aW9uICovCisJVk1ORVRfQ0FQX1ZNWE5FVF9BUFJPTSAgPSAweDAwODAsIC8qIFZteG5ldCBBUFJPTSBzdXBwb3J0ICovCisJVk1ORVRfQ0FQX0hXX1RYX1ZMQU4gICAgPSAweDAxMDAsIC8qIENhbiB3ZSBkbyBWTEFOIHRhZ2dpbmcgaW4gSFcgKi8KKwlWTU5FVF9DQVBfSFdfUlhfVkxBTiAgICA9IDB4MDIwMCwgLyogQ2FuIHdlIGRvIFZMQU4gdW50YWdnaW5nIGluIEhXICovCisJVk1ORVRfQ0FQX1NXX1ZMQU4gICAgICAgPSAweDA0MDAsIC8qIFZMQU4gdGFnZ2luZy91bnRhZ2dpbmcgaW4gU1cgKi8KKwlWTU5FVF9DQVBfV0FLRV9QQ0tUX1JDViA9IDB4MDgwMCwgLyogQ2FuIHdha2Ugb24gbmV0d29yayBwYWNrZXQgcmVjdj8gKi8KKwlWTU5FVF9DQVBfRU5BQkxFX0lOVF9JTkxJTkUgPSAweDEwMDAsICAvKiBFbmFibGUgSW50ZXJydXB0IElubGluZSAqLworCVZNTkVUX0NBUF9FTkFCTEVfSEVBREVSX0NPUFkgPSAweDIwMDAsICAvKiBjb3B5IGhlYWRlciBmb3Igdm1rZXJuZWwgKi8KKwlWTU5FVF9DQVBfVFhfQ0hBSU4gICAgICA9IDB4NDAwMCwgLyogR3Vlc3QgY2FuIHVzZSBtdWx0aXBsZSB0eCBlbnRyaWVzCisJCQkJCSAgKiBmb3IgYSBwa3QgKi8KKwlWTU5FVF9DQVBfUlhfQ0hBSU4gICAgICA9IDB4ODAwMCwgLyogcGt0IGNhbiBzcGFuIG11bHRpcGxlIHJ4IGVudHJpZXMgKi8KKwlWTU5FVF9DQVBfTFBEICAgICAgICAgICA9IDB4MTAwMDAsIC8qIGxhcmdlIHBrdCBkZWxpdmVyeSAqLworCVZNTkVUX0NBUF9CUEYgICAgICAgICAgID0gMHgyMDAwMCwgLyogQlBGIFN1cHBvcnQgaW4gVk1YTkVUIFZpcnR1YWwgSFcqLworCVZNTkVUX0NBUF9TR19TUEFOX1BBR0VTID0gMHg0MDAwMCwgLyogU2NhdHRlci1nYXRoZXIgY2FuIHNwYW4gbXVsdGlwbGUqLworCQkJCQkgICAvKiBwYWdlcyB0cmFuc21pdHMgKi8KKwlWTU5FVF9DQVBfSVA2X0NTVU0gICAgICA9IDB4ODAwMDAsIC8qIENhbiBkbyBJUHY2IGNzdW0gb2ZmbG9hZC4gKi8KKwlWTU5FVF9DQVBfVFNPNiAgICAgICAgID0gMHgxMDAwMDAsIC8qIFRTTyBzZWcuIG9mZmxvYWQgZm9yIElQdjYgcGt0cy4gKi8KKwlWTU5FVF9DQVBfVFNPMjU2ayAgICAgID0gMHgyMDAwMDAsIC8qIENhbiBkbyBUU08gc2VnIG9mZmxvYWQgZm9yICovCisJCQkJCSAgIC8qIHBrdHMgdXAgdG8gMjU2a0IuICovCisJVk1ORVRfQ0FQX1VQVCAgICAgICAgICA9IDB4NDAwMDAwICAvKiBTdXBwb3J0IFVQVCAqLworfTsKKworLyoKKyAqIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuCisgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WTVdBUkUgICAgICAgICAgICAweDE1QUQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTVdBUkVfVk1YTkVUMyAgICAweDA3QjAKKyNkZWZpbmUgTUFYX0VUSEVSTkVUX0NBUkRTCQkxMAorI2RlZmluZSBNQVhfUENJX1BBU1NUSFJVX0RFVklDRQkJNgorCitzdHJ1Y3Qgdm14bmV0M19jbWRfcmluZyB7CisJdW5pb24gVm14bmV0M19HZW5lcmljRGVzYyAqYmFzZTsKKwl1MzIJCXNpemU7CisJdTMyCQluZXh0MmZpbGw7CisJdTMyCQluZXh0MmNvbXA7CisJdTgJCWdlbjsKKwlkbWFfYWRkcl90CWJhc2VQQTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordm14bmV0M19jbWRfcmluZ19hZHZfbmV4dDJmaWxsKHN0cnVjdCB2bXhuZXQzX2NtZF9yaW5nICpyaW5nKQoreworCXJpbmctPm5leHQyZmlsbCsrOworCWlmICh1bmxpa2VseShyaW5nLT5uZXh0MmZpbGwgPT0gcmluZy0+c2l6ZSkpIHsKKwkJcmluZy0+bmV4dDJmaWxsID0gMDsKKwkJVk1YTkVUM19GTElQX1JJTkdfR0VOKHJpbmctPmdlbik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3ZteG5ldDNfY21kX3JpbmdfYWR2X25leHQyY29tcChzdHJ1Y3Qgdm14bmV0M19jbWRfcmluZyAqcmluZykKK3sKKwlWTVhORVQzX0lOQ19SSU5HX0lEWF9PTkxZKHJpbmctPm5leHQyY29tcCwgcmluZy0+c2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit2bXhuZXQzX2NtZF9yaW5nX2Rlc2NfYXZhaWwoc3RydWN0IHZteG5ldDNfY21kX3JpbmcgKnJpbmcpCit7CisJcmV0dXJuIChyaW5nLT5uZXh0MmNvbXAgPiByaW5nLT5uZXh0MmZpbGwgPyAwIDogcmluZy0+c2l6ZSkgKworCQlyaW5nLT5uZXh0MmNvbXAgLSByaW5nLT5uZXh0MmZpbGwgLSAxOworfQorCitzdHJ1Y3Qgdm14bmV0M19jb21wX3JpbmcgeworCXVuaW9uIFZteG5ldDNfR2VuZXJpY0Rlc2MgKmJhc2U7CisJdTMyICAgICAgICAgICAgICAgc2l6ZTsKKwl1MzIgICAgICAgICAgICAgICBuZXh0MnByb2M7CisJdTggICAgICAgICAgICAgICAgZ2VuOworCXU4ICAgICAgICAgICAgICAgIGludHJfaWR4OworCWRtYV9hZGRyX3QgICAgICAgICAgIGJhc2VQQTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordm14bmV0M19jb21wX3JpbmdfYWR2X25leHQycHJvYyhzdHJ1Y3Qgdm14bmV0M19jb21wX3JpbmcgKnJpbmcpCit7CisJcmluZy0+bmV4dDJwcm9jKys7CisJaWYgKHVubGlrZWx5KHJpbmctPm5leHQycHJvYyA9PSByaW5nLT5zaXplKSkgeworCQlyaW5nLT5uZXh0MnByb2MgPSAwOworCQlWTVhORVQzX0ZMSVBfUklOR19HRU4ocmluZy0+Z2VuKTsKKwl9Cit9CisKK3N0cnVjdCB2bXhuZXQzX3R4X2RhdGFfcmluZyB7CisJc3RydWN0IFZteG5ldDNfVHhEYXRhRGVzYyAqYmFzZTsKKwl1MzIgICAgICAgICAgICAgIHNpemU7CisJZG1hX2FkZHJfdCAgICAgICAgICBiYXNlUEE7Cit9OworCitlbnVtIHZteG5ldDNfYnVmX21hcF90eXBlIHsKKwlWTVhORVQzX01BUF9JTlZBTElEID0gMCwKKwlWTVhORVQzX01BUF9OT05FLAorCVZNWE5FVDNfTUFQX1NJTkdMRSwKKwlWTVhORVQzX01BUF9QQUdFLAorfTsKKworc3RydWN0IHZteG5ldDNfdHhfYnVmX2luZm8geworCXUzMiAgICAgIG1hcF90eXBlOworCXUxNiAgICAgIGxlbjsKKwl1MTYgICAgICBzb3BfaWR4OworCWRtYV9hZGRyX3QgIGRtYV9hZGRyOworCXN0cnVjdCBza19idWZmICpza2I7Cit9OworCitzdHJ1Y3Qgdm14bmV0M190cV9kcml2ZXJfc3RhdHMgeworCXU2NCBkcm9wX3RvdGFsOyAgICAgLyogIyBvZiBwa3RzIGRyb3BwZWQgYnkgdGhlIGRyaXZlciwgdGhlCisJCQkJKiBjb3VudGVycyBiZWxvdyB0cmFjayBkcm9wcGluZ3MgZHVlIHRvCisJCQkJKiBkaWZmZXJlbnQgcmVhc29ucworCQkJCSovCisJdTY0IGRyb3BfdG9vX21hbnlfZnJhZ3M7CisJdTY0IGRyb3Bfb3ZlcnNpemVkX2hkcjsKKwl1NjQgZHJvcF9oZHJfaW5zcGVjdF9lcnI7CisJdTY0IGRyb3BfdHNvOworCisJdTY0IHR4X3JpbmdfZnVsbDsKKwl1NjQgbGluZWFyaXplZDsgICAgICAgICAvKiAjIG9mIHBrdHMgbGluZWFyaXplZCAqLworCXU2NCBjb3B5X3NrYl9oZWFkZXI7ICAgIC8qICMgb2YgdGltZXMgd2UgaGF2ZSB0byBjb3B5IHNrYiBoZWFkZXIgKi8KKwl1NjQgb3ZlcnNpemVkX2hkcjsKK307CisKK3N0cnVjdCB2bXhuZXQzX3R4X2N0eCB7CisJYm9vbCAgIGlwdjQ7CisJdTE2IG1zczsKKwl1MzIgZXRoX2lwX2hkcl9zaXplOyAvKiBvbmx5IHZhbGlkIGZvciBwa3RzIHJlcXVlc3RpbmcgdHNvIG9yIGNzdW0KKwkJCQkgKiBvZmZsb2FkaW5nCisJCQkJICovCisJdTMyIGw0X2hkcl9zaXplOyAgICAgLyogb25seSB2YWxpZCBpZiBtc3MgIT0gMCAqLworCXUzMiBjb3B5X3NpemU7ICAgICAgIC8qICMgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIGRhdGEgcmluZyAqLworCXVuaW9uIFZteG5ldDNfR2VuZXJpY0Rlc2MgKnNvcF90eGQ7CisJdW5pb24gVm14bmV0M19HZW5lcmljRGVzYyAqZW9wX3R4ZDsKK307CisKK3N0cnVjdCB2bXhuZXQzX3R4X3F1ZXVlIHsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgICAgIHR4X2xvY2s7CisJc3RydWN0IHZteG5ldDNfY21kX3JpbmcgICAgICAgICB0eF9yaW5nOworCXN0cnVjdCB2bXhuZXQzX3R4X2J1Zl9pbmZvICAgICAqYnVmX2luZm87CisJc3RydWN0IHZteG5ldDNfdHhfZGF0YV9yaW5nICAgICBkYXRhX3Jpbmc7CisJc3RydWN0IHZteG5ldDNfY29tcF9yaW5nICAgICAgICBjb21wX3Jpbmc7CisJc3RydWN0IFZteG5ldDNfVHhRdWV1ZUN0cmwgICAgICAgICAgICAqc2hhcmVkOworCXN0cnVjdCB2bXhuZXQzX3RxX2RyaXZlcl9zdGF0cyAgc3RhdHM7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGVkOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3N0b3A7ICAvKiAjIG9mIHRpbWVzIHRoZSBxdWV1ZSBpcworCQkJCQkJICAgICogc3RvcHBlZCAqLworfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhTTVBfQ0FDSEVfQllURVMpKSk7CisKK2VudW0gdm14bmV0M19yeF9idWZfdHlwZSB7CisJVk1YTkVUM19SWF9CVUZfTk9ORSA9IDAsCisJVk1YTkVUM19SWF9CVUZfU0tCID0gMSwKKwlWTVhORVQzX1JYX0JVRl9QQUdFID0gMgorfTsKKworc3RydWN0IHZteG5ldDNfcnhfYnVmX2luZm8geworCWVudW0gdm14bmV0M19yeF9idWZfdHlwZSBidWZfdHlwZTsKKwl1MTYgICAgIGxlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCBwYWdlICAgICpwYWdlOworCX07CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKK307CisKK3N0cnVjdCB2bXhuZXQzX3J4X2N0eCB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgc29wX2lkeDsKK307CisKK3N0cnVjdCB2bXhuZXQzX3JxX2RyaXZlcl9zdGF0cyB7CisJdTY0IGRyb3BfdG90YWw7CisJdTY0IGRyb3BfZXJyOworCXU2NCBkcm9wX2ZjczsKKwl1NjQgcnhfYnVmX2FsbG9jX2ZhaWx1cmU7Cit9OworCitzdHJ1Y3Qgdm14bmV0M19yeF9xdWV1ZSB7CisJc3RydWN0IHZteG5ldDNfY21kX3JpbmcgICByeF9yaW5nWzJdOworCXN0cnVjdCB2bXhuZXQzX2NvbXBfcmluZyAgY29tcF9yaW5nOworCXN0cnVjdCB2bXhuZXQzX3J4X2N0eCAgICAgcnhfY3R4OworCXUzMiBxaWQ7ICAgICAgICAgICAgLyogcnFJRCBpbiBSQ0QgZm9yIGJ1ZmZlciBmcm9tIDFzdCByaW5nICovCisJdTMyIHFpZDI7ICAgICAgICAgICAvKiBycUlEIGluIFJDRCBmb3IgYnVmZmVyIGZyb20gMm5kIHJpbmcgKi8KKwl1MzIgdW5jb21taXR0ZWRbMl07IC8qICMgb2YgYnVmZmVycyBhbGxvY2F0ZWQgc2luY2UgbGFzdCBSWFBST0QKKwkJCQkqIHVwZGF0ZSAqLworCXN0cnVjdCB2bXhuZXQzX3J4X2J1Zl9pbmZvICAgICAqYnVmX2luZm9bMl07CisJc3RydWN0IFZteG5ldDNfUnhRdWV1ZUN0cmwgICAgICAgICAgICAqc2hhcmVkOworCXN0cnVjdCB2bXhuZXQzX3JxX2RyaXZlcl9zdGF0cyAgc3RhdHM7Cit9IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKFNNUF9DQUNIRV9CWVRFUykpKTsKKworI2RlZmluZSBWTVhORVQzX0xJTlVYX01BWF9NU0lYX1ZFQ1QgICAgIDEKKworc3RydWN0IHZteG5ldDNfaW50ciB7CisJZW51bSB2bXhuZXQzX2ludHJfbWFza19tb2RlICBtYXNrX21vZGU7CisJZW51bSB2bXhuZXQzX2ludHJfdHlwZSAgICAgICB0eXBlOwkvKiBNU0ktWCwgTVNJLCBvciBJTlR4PyAqLworCXU4ICBudW1faW50cnM7CQkJLyogIyBvZiBpbnRyIHZlY3RvcnMgKi8KKwl1OCAgZXZlbnRfaW50cl9pZHg7CQkvKiBpZHggb2YgdGhlIGludHIgdmVjdG9yIGZvciBldmVudCAqLworCXU4ICBtb2RfbGV2ZWxzW1ZNWE5FVDNfTElOVVhfTUFYX01TSVhfVkVDVF07IC8qIG1vZGVyYXRpb24gbGV2ZWwgKi8KKyNpZmRlZiBDT05GSUdfUENJX01TSQorCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tWTVhORVQzX0xJTlVYX01BWF9NU0lYX1ZFQ1RdOworI2VuZGlmCit9OworCisjZGVmaW5lIFZNWE5FVDNfU1RBVEVfQklUX1JFU0VUVElORyAgIDAKKyNkZWZpbmUgVk1YTkVUM19TVEFURV9CSVRfUVVJRVNDRUQgICAgMQorc3RydWN0IHZteG5ldDNfYWRhcHRlciB7CisJc3RydWN0IHZteG5ldDNfdHhfcXVldWUgICAgICAgICB0eF9xdWV1ZTsKKwlzdHJ1Y3Qgdm14bmV0M19yeF9xdWV1ZSAgICAgICAgIHJ4X3F1ZXVlOworCXN0cnVjdCBuYXBpX3N0cnVjdCAgICAgICAgICAgICAgbmFwaTsKKwlzdHJ1Y3Qgdmxhbl9ncm91cCAgICAgICAgICAgICAgKnZsYW5fZ3JwOworCisJc3RydWN0IHZteG5ldDNfaW50ciAgICAgICAgICAgICBpbnRyOworCisJc3RydWN0IFZteG5ldDNfRHJpdmVyU2hhcmVkICAgICpzaGFyZWQ7CisJc3RydWN0IFZteG5ldDNfUE1Db25mICAgICAgICAgICpwbV9jb25mOworCXN0cnVjdCBWbXhuZXQzX1R4UXVldWVEZXNjICAgICAqdHFkX3N0YXJ0OyAgICAgLyogZmlyc3QgdHggcXVldWUgZGVzYyAqLworCXN0cnVjdCBWbXhuZXQzX1J4UXVldWVEZXNjICAgICAqcnFkX3N0YXJ0OyAgICAgLyogZmlyc3QgcnggcXVldWUgZGVzYyAqLworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgICAgICAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgICAgICAqcGRldjsKKworCXU4CQkJCSpod19hZGRyMDsgLyogZm9yIEJBUiAwICovCisJdTgJCQkJKmh3X2FkZHIxOyAvKiBmb3IgQkFSIDEgKi8KKworCS8qIGZlYXR1cmUgY29udHJvbCAqLworCWJvb2wJCQkJcnhjc3VtOworCWJvb2wJCQkJbHJvOworCWJvb2wJCQkJanVtYm9fZnJhbWU7CisKKwkvKiByeCBidWZmZXIgcmVsYXRlZCAqLworCXVuc2lnbmVkCQkJc2tiX2J1Zl9zaXplOworCWludAkJcnhfYnVmX3Blcl9wa3Q7ICAvKiBvbmx5IGFwcGx5IHRvIHRoZSAxc3QgcmluZyAqLworCWRtYV9hZGRyX3QJCQlzaGFyZWRfcGE7CisJZG1hX2FkZHJfdCBxdWV1ZV9kZXNjX3BhOworCisJLyogV2FrZS1vbi1MQU4gKi8KKwl1MzIgICAgIHdvbDsKKworCS8qIExpbmsgc3BlZWQgKi8KKwl1MzIgICAgIGxpbmtfc3BlZWQ7IC8qIGluIG1icHMgKi8KKworCXU2NCAgICAgdHhfdGltZW91dF9jb3VudDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKworCXVuc2lnbmVkIGxvbmcgIHN0YXRlOyAgICAvKiBWTVhORVQzX1NUQVRFX0JJVF94eHggKi8KKworCWludCBkZXZfbnVtYmVyOworfTsKKworI2RlZmluZSBWTVhORVQzX1dSSVRFX0JBUjBfUkVHKGFkYXB0ZXIsIHJlZywgdmFsKSAgXAorCXdyaXRlbCgodmFsKSwgKGFkYXB0ZXIpLT5od19hZGRyMCArIChyZWcpKQorI2RlZmluZSBWTVhORVQzX1JFQURfQkFSMF9SRUcoYWRhcHRlciwgcmVnKSAgICAgICAgXAorCXJlYWRsKChhZGFwdGVyKS0+aHdfYWRkcjAgKyAocmVnKSkKKworI2RlZmluZSBWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIHJlZywgdmFsKSAgXAorCXdyaXRlbCgodmFsKSwgKGFkYXB0ZXIpLT5od19hZGRyMSArIChyZWcpKQorI2RlZmluZSBWTVhORVQzX1JFQURfQkFSMV9SRUcoYWRhcHRlciwgcmVnKSAgICAgICAgXAorCXJlYWRsKChhZGFwdGVyKS0+aHdfYWRkcjEgKyAocmVnKSkKKworI2RlZmluZSBWTVhORVQzX1dBS0VfUVVFVUVfVEhSRVNIT0xEKHRxKSAgKDUpCisjZGVmaW5lIFZNWE5FVDNfUlhfQUxMT0NfVEhSRVNIT0xEKHJxLCByaW5nX2lkeCwgYWRhcHRlcikgXAorCSgocnEpLT5yeF9yaW5nW3JpbmdfaWR4XS5zaXplID4+IDMpCisKKyNkZWZpbmUgVk1YTkVUM19HRVRfQUREUl9MTyhkbWEpICAgKCh1MzIpKGRtYSkpCisjZGVmaW5lIFZNWE5FVDNfR0VUX0FERFJfSEkoZG1hKSAgICgodTMyKSgoKHU2NCkoZG1hKSkgPj4gMzIpKQorCisvKiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgVk1YTkVUM19SSU5HX1NJWkVfQUxJR04gKi8KKyNkZWZpbmUgVk1YTkVUM19ERUZfVFhfUklOR19TSVpFICAgIDUxMgorI2RlZmluZSBWTVhORVQzX0RFRl9SWF9SSU5HX1NJWkUgICAgMjU2CisKKyNkZWZpbmUgVk1YTkVUM19NQVhfRVRIX0hEUl9TSVpFICAgIDIyCisjZGVmaW5lIFZNWE5FVDNfTUFYX1NLQl9CVUZfU0laRSAgICAoMyoxMDI0KQorCitpbnQKK3ZteG5ldDNfcXVpZXNjZV9kZXYoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcik7CisKK2ludAordm14bmV0M19hY3RpdmF0ZV9kZXYoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcik7CisKK3ZvaWQKK3ZteG5ldDNfZm9yY2VfY2xvc2Uoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcik7CisKK3ZvaWQKK3ZteG5ldDNfcmVzZXRfZGV2KHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpOworCit2b2lkCit2bXhuZXQzX3RxX2Rlc3Ryb3koc3RydWN0IHZteG5ldDNfdHhfcXVldWUgKnRxLAorCQkgICBzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKTsKKwordm9pZAordm14bmV0M19ycV9kZXN0cm95KHN0cnVjdCB2bXhuZXQzX3J4X3F1ZXVlICpycSwKKwkJICAgc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcik7CisKK2ludAordm14bmV0M19jcmVhdGVfcXVldWVzKHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCSAgICAgIHUzMiB0eF9yaW5nX3NpemUsIHUzMiByeF9yaW5nX3NpemUsIHUzMiByeF9yaW5nMl9zaXplKTsKKworZXh0ZXJuIHZvaWQgdm14bmV0M19zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZteG5ldDNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworCitleHRlcm4gY2hhciB2bXhuZXQzX2RyaXZlcl9uYW1lW107CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMgYi9kcml2ZXJzL25ldC93YW4vYzEwMS5jCmluZGV4IDk2OTNiMGYuLjBiZDg5OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2MxMDEuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYyBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMKaW5kZXggNjYzNjBhMi4uZTJjMzNjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYworKysgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCkBAIC03Niw2ICs3Niw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jeWN4X3gyNS5jIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfeDI1LmMKaW5kZXggMjU3M2MxOC4uY2Q4Y2I5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfeDI1LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfeDI1LmMKQEAgLTg0LDYgKzg0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLwogI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIGRlZmluaXRpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZHNjYzQuYyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCmluZGV4IDgxYzhhZWMuLjA3ZDAwYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCkBAIC04MSw2ICs4MSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCmluZGV4IDNlOTBlYjguLmJlZGEzODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKaW5kZXggY2Y1ZmQxNy4uZjFiZmY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jCkBAIC01OCw4ICs1OCw3IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9wb2xsOwogCWludCB1cDsKLQlpbnQgcmVxdWVzdF9zZW50OwotCXUzMiB0eHNlcTsgLyogVFggc2VxdWVuY2UgbnVtYmVyICovCisJdTMyIHR4c2VxOyAvKiBUWCBzZXF1ZW5jZSBudW1iZXIsIDAgPSBub25lICovCiAJdTMyIHJ4c2VxOyAvKiBSWCBzZXF1ZW5jZSBudW1iZXIgKi8KIH07CiAKQEAgLTE2Myw2ICsxNjIsNyBAQAogCXN0cnVjdCBjaXNjb19wYWNrZXQgKmNpc2NvX2RhdGE7CiAJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwogCV9fYmUzMiBhZGRyLCBtYXNrOworCXUzMiBhY2s7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGhkbGNfaGVhZGVyKSkKIAkJZ290byByeF9lcnJvcjsKQEAgLTIyMyw4ICsyMjMsMTAgQEAKIAkJY2FzZSBDSVNDT19LRUVQQUxJVkVfUkVROgogCQkJc3Bpbl9sb2NrKCZzdC0+bG9jayk7CiAJCQlzdC0+cnhzZXEgPSBudG9obChjaXNjb19kYXRhLT5wYXIxKTsKLQkJCWlmIChzdC0+cmVxdWVzdF9zZW50ICYmCi0JCQkgICAgbnRvaGwoY2lzY29fZGF0YS0+cGFyMikgPT0gc3QtPnR4c2VxKSB7CisJCQlhY2sgPSBudG9obChjaXNjb19kYXRhLT5wYXIyKTsKKwkJCWlmIChhY2sgJiYgKGFjayA9PSBzdC0+dHhzZXEgfHwKKwkJCQkgICAgLyogb3VyIGN1cnJlbnQgUkVRIG1heSBiZSBpbiB0cmFuc2l0ICovCisJCQkJICAgIGFjayA9PSBzdC0+dHhzZXEgLSAxKSkgewogCQkJCXN0LT5sYXN0X3BvbGwgPSBqaWZmaWVzOwogCQkJCWlmICghc3QtPnVwKSB7CiAJCQkJCXUzMiBzZWMsIG1pbiwgaHJzLCBkYXlzOwpAQCAtMjc1LDcgKzI3Nyw2IEBACiAKIAljaXNjb19rZWVwYWxpdmVfc2VuZChkZXYsIENJU0NPX0tFRVBBTElWRV9SRVEsIGh0b25sKCsrc3QtPnR4c2VxKSwKIAkJCSAgICAgaHRvbmwoc3QtPnJ4c2VxKSk7Ci0Jc3QtPnJlcXVlc3Rfc2VudCA9IDE7CiAJc3Bpbl91bmxvY2soJnN0LT5sb2NrKTsKIAogCXN0LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHN0LT5zZXR0aW5ncy5pbnRlcnZhbCAqIEhaOwpAQCAtMjkzLDkgKzI5NCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzdC0+bG9jaywgZmxhZ3MpOwotCXN0LT51cCA9IDA7Ci0Jc3QtPnJlcXVlc3Rfc2VudCA9IDA7Ci0Jc3QtPnR4c2VxID0gc3QtPnJ4c2VxID0gMDsKKwlzdC0+dXAgPSBzdC0+dHhzZXEgPSBzdC0+cnhzZXEgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0LT5sb2NrLCBmbGFncyk7CiAKIAlpbml0X3RpbWVyKCZzdC0+dGltZXIpOwpAQCAtMzE3LDggKzMxNiw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3QtPmxvY2ssIGZsYWdzKTsKIAluZXRpZl9kb3JtYW50X29uKGRldik7Ci0Jc3QtPnVwID0gMDsKLQlzdC0+cmVxdWVzdF9zZW50ID0gMDsKKwlzdC0+dXAgPSBzdC0+dHhzZXEgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0LT5sb2NrLCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9uMi5jIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKaW5kZXggODNkYTU5Ni4uNThjNjY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL24yLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jIGIvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jCmluZGV4IGE1MmYyOWMuLmYxMzQwZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wY2kyMDBzeW4uYworKysgYi9kcml2ZXJzL25ldC93YW4vcGNpMjAwc3luLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKaW5kZXggNDllYTljOS4uZDdhNzY0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCkBAIC0zMSwxMyArMzEsMTIgQEAKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBpZiB5b3UgaGF2ZSBhIE1ldHJpY29tIHJhZGlvIGFuZCBpbnRlbmQgdG8gdXNlIFN0YXJtb2RlIFJhZGlvCiAJICBJUC4gU1RSSVAgaXMgYSByYWRpbyBwcm90b2NvbCBkZXZlbG9wZWQgZm9yIHRoZSBNb3NxdWl0b05ldCBwcm9qZWN0Ci0JICAob24gdGhlIFdXVyBhdCA8aHR0cDovL21vc3F1aXRvbmV0LnN0YW5mb3JkLmVkdS8+KSB0byBzZW5kIEludGVybmV0Ci0JICB0cmFmZmljIHVzaW5nIE1ldHJpY29tIHJhZGlvcy4gIE1ldHJpY29tIHJhZGlvcyBhcmUgc21hbGwsIGJhdHRlcnkKLQkgIHBvd2VyZWQsIDEwMGtiaXQvc2VjIHBhY2tldCByYWRpbyB0cmFuc2NlaXZlcnMsIGFib3V0IHRoZSBzaXplIGFuZAotCSAgd2VpZ2h0IG9mIGEgY2VsbHVsYXIgdGVsZXBob25lLiAoWW91IG1heSBhbHNvIGhhdmUgaGVhcmQgdGhlbSBjYWxsZWQKLQkgICJNZXRyaWNvbSBtb2RlbXMiIGJ1dCB3ZSBhdm9pZCB0aGUgdGVybSAibW9kZW0iIGJlY2F1c2UgaXQgbWlzbGVhZHMKLQkgIG1hbnkgcGVvcGxlIGludG8gdGhpbmtpbmcgdGhhdCB5b3UgY2FuIHBsdWcgYSBNZXRyaWNvbSBtb2RlbSBpbnRvIGEKLQkgIHBob25lIGxpbmUgYW5kIHVzZSBpdCBhcyBhIG1vZGVtLikKKwkgIHRvIHNlbmQgSW50ZXJuZXQgdHJhZmZpYyB1c2luZyBNZXRyaWNvbSByYWRpb3MuICBNZXRyaWNvbSByYWRpb3MgYXJlCisJICBzbWFsbCwgYmF0dGVyeSBwb3dlcmVkLCAxMDBrYml0L3NlYyBwYWNrZXQgcmFkaW8gdHJhbnNjZWl2ZXJzLCBhYm91dAorCSAgdGhlIHNpemUgYW5kIHdlaWdodCBvZiBhIGNlbGx1bGFyIHRlbGVwaG9uZS4gKFlvdSBtYXkgYWxzbyBoYXZlIGhlYXJkCisJICB0aGVtIGNhbGxlZCAiTWV0cmljb20gbW9kZW1zIiBidXQgd2UgYXZvaWQgdGhlIHRlcm0gIm1vZGVtIiBiZWNhdXNlCisJICBpdCBtaXNsZWFkcyBtYW55IHBlb3BsZSBpbnRvIHRoaW5raW5nIHRoYXQgeW91IGNhbiBwbHVnIGEgTWV0cmljb20KKwkgIG1vZGVtIGludG8gYSBwaG9uZSBsaW5lIGFuZCB1c2UgaXQgYXMgYSBtb2RlbS4pCiAKIAkgIFlvdSBjYW4gdXNlIFNUUklQIG9uIGFueSBMaW51eCBtYWNoaW5lIHdpdGggYSBzZXJpYWwgcG9ydCwgYWx0aG91Z2gKIAkgIGl0IGlzIG9idmlvdXNseSBtb3N0IHVzZWZ1bCBmb3IgcGVvcGxlIHdpdGggbGFwdG9wIGNvbXB1dGVycy4gSWYgeW91CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hZG04MjExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hZG04MjExLmgKaW5kZXggNGY2YWIxMy4uYjA3ZTRkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuaApAQCAtMjY2LDcgKzI2Niw3IEBACiAjZGVmaW5lIEFETTgyMTFfU1lOQ1RMX0NTMQkoMSA8PCAyOCkKICNkZWZpbmUgQURNODIxMV9TWU5DVExfQ0FMCSgxIDw8IDI3KQogI2RlZmluZSBBRE04MjExX1NZTkNUTF9TRUxDQUwJKDEgPDwgMjYpCi0jZGVmaW5lIEFETTgyMTFfU1lOQ1RMX1JGdHlwZQkoKDEgPDwgMjQpIHx8ICgxIDw8IDIzKSB8fCAoMSA8PCAyMikpCisjZGVmaW5lIEFETTgyMTFfU1lOQ1RMX1JGdHlwZQkoKDEgPDwgMjQpIHwgKDEgPDwgMjMpIHwgKDEgPDwgMjIpKQogI2RlZmluZSBBRE04MjExX1NZTkNUTF9SRk1ECSgxIDw8IDIyKQogI2RlZmluZSBBRE04MjExX1NZTkNUTF9HRU5FUkFMCSgweDcgPDwgMjIpCiAvKiBTWU5DVEwgMjE6MCBEYXRhIChTaTQxMjY6IDE4LWJpdCBkYXRhLCA0LWJpdCBhZGRyZXNzKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCmluZGV4IDcxMTZhMWEuLmFiZjg5NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTQ3OTAsOSArNDc5MCw4IEBACiBzdGF0aWMgaW50IGdldF9kZWNfdTE2KCBjaGFyICpidWZmZXIsIGludCAqc3RhcnQsIGludCBsaW1pdCApIHsKIAl1MTYgdmFsdWU7CiAJaW50IHZhbGlkID0gMDsKLQlmb3IoIHZhbHVlID0gMDsgYnVmZmVyWypzdGFydF0gPj0gJzAnICYmCi0JCSAgICAgYnVmZmVyWypzdGFydF0gPD0gJzknICYmCi0JCSAgICAgKnN0YXJ0IDwgbGltaXQ7ICgqc3RhcnQpKysgKSB7CisJZm9yICh2YWx1ZSA9IDA7ICpzdGFydCA8IGxpbWl0ICYmIGJ1ZmZlclsqc3RhcnRdID49ICcwJyAmJgorCQkJYnVmZmVyWypzdGFydF0gPD0gJzknOyAoKnN0YXJ0KSsrKSB7CiAJCXZhbGlkID0gMTsKIAkJdmFsdWUgKj0gMTA7CiAJCXZhbHVlICs9IGJ1ZmZlclsqc3RhcnRdIC0gJzAnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tcHJvYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tcHJvYy5jCmluZGV4IDJhYjFkNTkuLmE4YjY4OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLXByb2MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1wcm9jLmMKQEAgLTQwMiw3ICs0MDIsNyBAQAogCiBzdGF0aWMgY2hhciBhcmxhbl9kcml2ZV9pbmZvW0FSTEFOX1NUUl9TSVpFXSA9ICJBNjU1XG5cMCI7CiAKLXN0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm8oY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mbyhjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwKIAkJICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQogewogCWludCBpOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJKmxlbnAgPSBwb3M7CiAKIAlpZiAoIXdyaXRlKQotCQlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCQlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWVsc2UKIAl7CiAJCSpsZW5wID0gMDsKQEAgLTYzOSw3ICs2MzksNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm8xNjE3MTkoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOShjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwKIAkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IGk7CkBAIC02NjksMTEgKzY2OSwxMSBAQAogCiBmaW5hbDoKIAkqbGVucCA9IHBvczsKLQlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJcmV0dXJuIHJldHY7CiB9CiAKLXN0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm90eFJpbmcoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mb3R4UmluZyhjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwKIAkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IGk7CkBAIC02OTgsMTEgKzY5OCwxMSBAQAogCVNBUkxCTnBsbih1X2NoYXIsIHR4QnVmZmVyLCAweDgwMCk7CiBmaW5hbDoKIAkqbGVucCA9IHBvczsKLQlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJcmV0dXJuIHJldHY7CiB9CiAKLXN0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm9yeFJpbmcoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mb3J4UmluZyhjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwKIAkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IGk7CkBAIC03MjYsMTEgKzcyNiwxMSBAQAogCVNBUkxCTnBsbih1X2NoYXIsIHJ4QnVmZmVyLCAweDgwMCk7CiBmaW5hbDoKIAkqbGVucCA9IHBvczsKLQlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJcmV0dXJuIHJldHY7CiB9CiAKLXN0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm8xOChjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9pbmZvMTgoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsCiAJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IGk7CkBAIC03NTYsNyArNzU2LDcgQEAKIAogZmluYWw6CiAJKmxlbnAgPSBwb3M7Ci0JcmV0diA9IHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCXJldHVybiByZXR2OwogfQogCkBAIC03NjYsNyArNzY2LDcgQEAKIAogc3RhdGljIGNoYXIgY29uZl9yZXNldF9yZXN1bHRbMjAwXTsKIAotc3RhdGljIGludCBhcmxhbl9jb25maWd1cmUoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBhcmxhbl9jb25maWd1cmUoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsCiAJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IHBvcyA9IDA7CkBAIC03ODgsMTAgKzc4OCwxMCBAQAogCQlyZXR1cm4gLTE7CiAKIAkqbGVucCA9IHBvczsKLQlyZXR1cm4gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiB9CiAKLXN0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX3Jlc2V0KGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX3Jlc2V0KGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLAogCQkgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQogewogCWludCBwb3MgPSAwOwpAQCAtODExLDcgKzgxMSw3IEBACiAJfSBlbHNlCiAJCXJldHVybiAtMTsKIAkqbGVucCA9IHBvcyArIDM7Ci0JcmV0dXJuIHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXR1cm4gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjkxNzAvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL3BoeS5jCmluZGV4IGIzZTVjZjMuLmRiZDQ4OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjkxNzAvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyOTE3MC9waHkuYwpAQCAtMTE0MSw3ICsxMTQxLDggQEAKIAl1OCB2cGRzWzJdW0FSNTQxNl9QRF9HQUlOX0lDRVBUU107CiAJdTggcHdyc1syXVtBUjU0MTZfUERfR0FJTl9JQ0VQVFNdOwogCWludCBjaGFpbiwgaWR4LCBpOwotCXU4IGY7CisJdTMyIHBoeV9kYXRhID0gMDsKKwl1OCBmLCB0bXA7CiAKIAlzd2l0Y2ggKGNoYW5uZWwtPmJhbmQpIHsKIAljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6CkBAIC0xMjA4LDkgKzEyMDksNiBAQAogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IDc2OyBpKyspIHsKLQkJCXUzMiBwaHlfZGF0YTsKLQkJCXU4IHRtcDsKLQogCQkJaWYgKGkgPCAyNSkgewogCQkJCXRtcCA9IGFyOTE3MF9pbnRlcnBvbGF0ZV92YWwoaSwgJnB3cnNbMF1bMF0sCiAJCQkJCQkJICAgICAmdnBkc1swXVswXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyOTE3MC91c2IuYwppbmRleCBlMDEzOGFjLi5lOTc0ZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI5MTcwL3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjkxNzAvdXNiLmMKQEAgLTY0LDYgKzY0LDggQEAKIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDkxNzApIH0sCiAJLyogQXRoZXJvcyBURzEyMU4gKi8KIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDEwMDEpIH0sCisJLyogVFAtTGluayBUTC1XTjgyMU4gdjIgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDEwMDIpIH0sCiAJLyogQ2FjZSBBaXJwY2FwIE5YICovCiAJeyBVU0JfREVWSUNFKDB4Y2FjZSwgMHgwMzAwKSB9LAogCS8qIEQtTGluayBEV0EgMTYwQSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwppbmRleCAzMjM0OTk1Li4wYWQ2ZDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwpAQCAtNjA5LDE0ICs2MDksMjQgQEAKIAkJQVJfUEhZX0NIMV9FWFRfQ0NBLAogCQlBUl9QSFlfQ0gyX0VYVF9DQ0EKIAl9OwotCXU4IGNoYWlubWFzazsKKwl1OCBjaGFpbm1hc2ssIHJ4X2NoYWluX3N0YXR1czsKIAorCXJ4X2NoYWluX3N0YXR1cyA9IFJFR19SRUFEKGFoLCBBUl9QSFlfUlhfQ0hBSU5NQVNLKTsKIAlpZiAoQVJfU1JFVl85Mjg1KGFoKSkKIAkJY2hhaW5tYXNrID0gMHg5OwotCWVsc2UgaWYgKEFSX1NSRVZfOTI4MChhaCkgfHwgQVJfU1JFVl85Mjg3KGFoKSkKLQkJY2hhaW5tYXNrID0gMHgxQjsKLQllbHNlCi0JCWNoYWlubWFzayA9IDB4M0Y7CisJZWxzZSBpZiAoQVJfU1JFVl85MjgwKGFoKSB8fCBBUl9TUkVWXzkyODcoYWgpKSB7CisJCWlmICgocnhfY2hhaW5fc3RhdHVzICYgMHgyKSB8fCAocnhfY2hhaW5fc3RhdHVzICYgMHg0KSkKKwkJCWNoYWlubWFzayA9IDB4MUI7CisJCWVsc2UKKwkJCWNoYWlubWFzayA9IDB4MDk7CisJfSBlbHNlIHsKKwkJaWYgKHJ4X2NoYWluX3N0YXR1cyAmIDB4NCkKKwkJCWNoYWlubWFzayA9IDB4M0Y7CisJCWVsc2UgaWYgKHJ4X2NoYWluX3N0YXR1cyAmIDB4MikKKwkJCWNoYWlubWFzayA9IDB4MUI7CisJCWVsc2UKKwkJCWNoYWlubWFzayA9IDB4MDk7CisJfQogCiAJaCA9IGFoLT5uZkNhbEhpc3Q7CiAKQEAgLTY5Nyw2ICs3MDcsOCBAQAogCQlub2lzZV9mbG9vciA9IEFSX1BIWV9DQ0FfTUFYX0FSOTI4MF9HT09EX1ZBTFVFOwogCWVsc2UgaWYgKEFSX1NSRVZfOTI4NShhaCkpCiAJCW5vaXNlX2Zsb29yID0gQVJfUEhZX0NDQV9NQVhfQVI5Mjg1X0dPT0RfVkFMVUU7CisJZWxzZSBpZiAoQVJfU1JFVl85Mjg3KGFoKSkKKwkJbm9pc2VfZmxvb3IgPSBBUl9QSFlfQ0NBX01BWF9BUjkyODdfR09PRF9WQUxVRTsKIAllbHNlCiAJCW5vaXNlX2Zsb29yID0gQVJfUEhZX0NDQV9NQVhfQVI1NDE2X0dPT0RfVkFMVUU7CiAKQEAgLTkyNCw2ICs5MzYsNyBAQAogCQlyZWdWYWwgfD0gKDEgPDwgKDE5ICsgaSkpOwogCQlSRUdfV1JJVEUoYWgsIDB4NzgzNCwgcmVnVmFsKTsKIAkJdWRlbGF5KDEpOworCQlyZWdWYWwgPSBSRUdfUkVBRChhaCwgMHg3ODM0KTsKIAkJcmVnVmFsICY9ICh+KDB4MSA8PCAoMTkgKyBpKSkpOwogCQlyZWdfZmllbGQgPSBNUyhSRUdfUkVBRChhaCwgMHg3ODQwKSwgQVI5Mjg1X0FOX1JYVFhCQjFfU1BBUkU5KTsKIAkJcmVnVmFsIHw9IChyZWdfZmllbGQgPDwgKDE5ICsgaSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NhbGliLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuaAppbmRleCAwMTliY2JiLi45MDI4YWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBBUl9QSFlfQ0NBX01BWF9BUjU0MTZfR09PRF9WQUxVRQktODUKICNkZWZpbmUgQVJfUEhZX0NDQV9NQVhfQVI5MjgwX0dPT0RfVkFMVUUJLTExMgogI2RlZmluZSBBUl9QSFlfQ0NBX01BWF9BUjkyODVfR09PRF9WQUxVRQktMTE4CisjZGVmaW5lIEFSX1BIWV9DQ0FfTUFYX0FSOTI4N19HT09EX1ZBTFVFCS0xMTgKICNkZWZpbmUgQVJfUEhZX0NDQV9NQVhfSElHSF9WQUxVRSAgICAgIAkJLTYyCiAjZGVmaW5lIEFSX1BIWV9DQ0FfTUlOX0JBRF9WQUxVRSAgICAgICAJCS0xNDAKICNkZWZpbmUgQVJfUEhZX0NDQV9GSUxURVJXSU5ET1dfTEVOR1RIX0lOSVQgICAgIDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tX2RlZi5jCmluZGV4IGFlN2ZiNWQuLjQwNzFmYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYwpAQCAtNTA5LDYgKzUwOSw4IEBACiAJCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9BTl9UT1AxLCBBUl9BTl9UT1AxX0RBQ0lQTU9ERSwKIAkJCQkgICAgICBlZXAtPmJhc2VFZXBIZWFkZXIuZGFjTHBNb2RlKTsKIAorCQl1ZGVsYXkoMTAwKTsKKwogCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfRlJBTUVfQ1RMLCBBUl9QSFlfRlJBTUVfQ1RMX1RYX0NMSVAsCiAJCQkgICAgICBwTW9kYWwtPm1pc2NCaXRzID4+IDIpOwogCkBAIC05MDIsNyArOTA0LDcgQEAKIAkJCQkJCSAgdTE2IHBvd2VyTGltaXQpCiB7CiAjZGVmaW5lIFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVFdPX0NIQUlOICAgICA2ICAvKiAxMCpsb2cxMCgyKSoyICovCi0jZGVmaW5lIFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU4gICAxMCAvKiAxMCpsb2cxMCgzKSoyICovCisjZGVmaW5lIFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU4gICA5IC8qIDEwKmxvZzEwKDMpKjIgKi8KIAogCXN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVndWxhdG9yeSA9IGF0aDlrX2h3X3JlZ3VsYXRvcnkoYWgpOwogCXN0cnVjdCBhcjU0MTZfZWVwcm9tX2RlZiAqcEVlcERhdGEgPSAmYWgtPmVlcHJvbS5kZWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCmluZGV4IGI2YzZjY2EuLmNhNzY5NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCkBAIC04NDIsNyArODQyLDcgQEAKIAogc3RhdGljIHZvaWQgYXRoOWtfaHdfaW5pdF9tb2RlX2dhaW5fcmVncyhzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKLQlpZiAoQVJfU1JFVl85Mjg3XzExKGFoKSkKKwlpZiAoQVJfU1JFVl85Mjg3XzExX09SX0xBVEVSKGFoKSkKIAkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1J4R2FpbiwKIAkJYXI5Mjg3TW9kZXNfcnhfZ2Fpbl85Mjg3XzFfMSwKIAkJQVJSQVlfU0laRShhcjkyODdNb2Rlc19yeF9nYWluXzkyODdfMV8xKSwgNik7CkBAIC04NTMsNyArODUzLDcgQEAKIAllbHNlIGlmIChBUl9TUkVWXzkyODBfMjAoYWgpKQogCQlhdGg5a19od19pbml0X3J4Z2Fpbl9pbmkoYWgpOwogCi0JaWYgKEFSX1NSRVZfOTI4N18xMShhaCkpIHsKKwlpZiAoQVJfU1JFVl85Mjg3XzExX09SX0xBVEVSKGFoKSkgewogCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAogCQlhcjkyODdNb2Rlc190eF9nYWluXzkyODdfMV8xLAogCQlBUlJBWV9TSVpFKGFyOTI4N01vZGVzX3R4X2dhaW5fOTI4N18xXzEpLCA2KTsKQEAgLTk2NSw3ICs5NjUsNyBAQAogCWF0aDlrX2h3X2luaXRfbW9kZV9yZWdzKGFoKTsKIAogCWlmIChhaC0+aXNfcGNpZXhwcmVzcykKLQkJYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCAwKTsKKwkJYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCAwLCAwKTsKIAllbHNlCiAJCWF0aDlrX2h3X2Rpc2FibGVwY2llKGFoKTsKIApAQCAtMTI3Myw2ICsxMjczLDE1IEBACiAJICovCiAJUkVHX1NFVF9CSVQoYWgsIEFSX0RJQUdfU1csIChBUl9ESUFHX1JYX0RJUyB8IEFSX0RJQUdfUlhfQUJPUlQpKTsKIAorCWlmIChBUl9TUkVWXzkyODBfMTBfT1JfTEFURVIoYWgpKSB7CisJCXZhbCA9IFJFR19SRUFEKGFoLCBBUl9QQ1VfTUlTQ19NT0RFMikgJgorCQkJICAgICAgICh+QVJfUENVX01JU0NfTU9ERTJfSFdXQVIxKTsKKworCQlpZiAoQVJfU1JFVl85Mjg3XzEwX09SX0xBVEVSKGFoKSkKKwkJCXZhbCA9IHZhbCAmICh+QVJfUENVX01JU0NfTU9ERTJfSFdXQVIyKTsKKworCQlSRUdfV1JJVEUoYWgsIEFSX1BDVV9NSVNDX01PREUyLCB2YWwpOworCX0KIAogCWlmICghQVJfU1JFVl81NDE2XzIwX09SX0xBVEVSKGFoKSB8fAogCSAgICBBUl9TUkVWXzkyODBfMTBfT1JfTEFURVIoYWgpKQpAQCAtMTc4NCw3ICsxNzkzLDcgQEAKIHN0YXRpYyBib29sIGF0aDlrX2h3X2NoaXBfcmVzZXQoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCiB7Ci0JaWYgKE9MQ19GT1JfQVI5MjgwXzIwX0xBVEVSKSB7CisJaWYgKEFSX1NSRVZfOTI4MChhaCkgJiYgYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9PTF9QV1JDVFJMKSkgewogCQlpZiAoIWF0aDlrX2h3X3NldF9yZXNldF9yZWcoYWgsIEFUSDlLX1JFU0VUX1BPV0VSX09OKSkKIAkJCXJldHVybiBmYWxzZTsKIAl9IGVsc2UgaWYgKCFhdGg5a19od19zZXRfcmVzZXRfcmVnKGFoLCBBVEg5S19SRVNFVF9XQVJNKSkKQEAgLTIzMzgsNiArMjM0Nyw3IEBACiAJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmN1cmNoYW4gPSBhaC0+Y3VyY2hhbjsKIAl1MzIgc2F2ZURlZkFudGVubmE7CiAJdTMyIG1hY1N0YUlkMTsKKwl1NjQgdHNmID0gMDsKIAlpbnQgaSwgcnhfY2hhaW5tYXNrLCByOwogCiAJYWgtPmV4dHByb3RzcGFjaW5nID0gc2MtPmh0X2V4dHByb3RzcGFjaW5nOwpAQCAtMjM0Nyw3ICsyMzU3LDcgQEAKIAlpZiAoIWF0aDlrX2h3X3NldHBvd2VyKGFoLCBBVEg5S19QTV9BV0FLRSkpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKGN1cmNoYW4pCisJaWYgKGN1cmNoYW4gJiYgIWFoLT5jaGlwX2Z1bGxzbGVlcCkKIAkJYXRoOWtfaHdfZ2V0bmYoYWgsIGN1cmNoYW4pOwogCiAJaWYgKGJDaGFubmVsQ2hhbmdlICYmCkBAIC0yMzU2LDggKzIzNjYsOCBAQAogCSAgICAoY2hhbi0+Y2hhbm5lbCAhPSBhaC0+Y3VyY2hhbi0+Y2hhbm5lbCkgJiYKIAkgICAgKChjaGFuLT5jaGFubmVsRmxhZ3MgJiBDSEFOTkVMX0FMTCkgPT0KIAkgICAgIChhaC0+Y3VyY2hhbi0+Y2hhbm5lbEZsYWdzICYgQ0hBTk5FTF9BTEwpKSAmJgotCSAgICAoIUFSX1NSRVZfOTI4MChhaCkgfHwgKCFJU19DSEFOX0FfNU1IWl9TUEFDRUQoY2hhbikgJiYKLQkJCQkgICAhSVNfQ0hBTl9BXzVNSFpfU1BBQ0VEKGFoLT5jdXJjaGFuKSkpKSB7CisJICAgICAhKEFSX1NSRVZfOTI4MChhaCkgfHwgSVNfQ0hBTl9BXzVNSFpfU1BBQ0VEKGNoYW4pIHx8CisJICAgICBJU19DSEFOX0FfNU1IWl9TUEFDRUQoYWgtPmN1cmNoYW4pKSkgewogCiAJCWlmIChhdGg5a19od19jaGFubmVsX2NoYW5nZShhaCwgY2hhbiwgc2MtPnR4X2NoYW5fd2lkdGgpKSB7CiAJCQlhdGg5a19od19sb2FkbmYoYWgsIGFoLT5jdXJjaGFuKTsKQEAgLTIzNzIsNiArMjM4MiwxMCBAQAogCiAJbWFjU3RhSWQxID0gUkVHX1JFQUQoYWgsIEFSX1NUQV9JRDEpICYgQVJfU1RBX0lEMV9CQVNFX1JBVEVfMTFCOwogCisJLyogRm9yIGNoaXBzIG9uIHdoaWNoIFJUQyByZXNldCBpcyBkb25lLCBzYXZlIFRTRiBiZWZvcmUgaXQgZ2V0cyBjbGVhcmVkICovCisJaWYgKEFSX1NSRVZfOTI4MChhaCkgJiYgYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9PTF9QV1JDVFJMKSkKKwkJdHNmID0gYXRoOWtfaHdfZ2V0dHNmNjQoYWgpOworCiAJc2F2ZUxlZFN0YXRlID0gUkVHX1JFQUQoYWgsIEFSX0NGR19MRUQpICYKIAkJKEFSX0NGR19MRURfQVNTT0NfQ1RMIHwgQVJfQ0ZHX0xFRF9NT0RFX1NFTCB8CiAJCSBBUl9DRkdfTEVEX0JMSU5LX1RIUkVTSF9TRUwgfCBBUl9DRkdfTEVEX0JMSU5LX1NMT1cpOwpAQCAtMjM5OCw2ICsyNDEyLDEwIEBACiAJCXVkZWxheSg1MCk7CiAJfQogCisJLyogUmVzdG9yZSBUU0YgKi8KKwlpZiAodHNmICYmIEFSX1NSRVZfOTI4MChhaCkgJiYgYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9PTF9QV1JDVFJMKSkKKwkJYXRoOWtfaHdfc2V0dHNmNjQoYWgsIHRzZik7CisKIAlpZiAoQVJfU1JFVl85MjgwXzEwX09SX0xBVEVSKGFoKSkKIAkJUkVHX1NFVF9CSVQoYWgsIEFSX0dQSU9fSU5QVVRfRU5fVkFMLCBBUl9HUElPX0pUQUdfRElTQUJMRSk7CiAKQEAgLTMwMDUsOSArMzAyMywxMCBAQAogICogUHJvZ3JhbW1pbmcgdGhlIFNlckRlcyBtdXN0IGdvIHRocm91Z2ggdGhlIHNhbWUgMjg4IGJpdCBzZXJpYWwgc2hpZnQKICAqIHJlZ2lzdGVyIGFzIHRoZSBvdGhlciBhbmFsb2cgcmVnaXN0ZXJzLiAgSGVuY2UgdGhlIDkgd3JpdGVzLgogICovCi12b2lkIGF0aDlrX2h3X2NvbmZpZ3BjaXBvd2Vyc2F2ZShzdHJ1Y3QgYXRoX2h3ICphaCwgaW50IHJlc3RvcmUpCit2b2lkIGF0aDlrX2h3X2NvbmZpZ3BjaXBvd2Vyc2F2ZShzdHJ1Y3QgYXRoX2h3ICphaCwgaW50IHJlc3RvcmUsIGludCBwb3dlcl9vZmYpCiB7CiAJdTggaTsKKwl1MzIgdmFsOwogCiAJaWYgKGFoLT5pc19wY2lleHByZXNzICE9IHRydWUpCiAJCXJldHVybjsKQEAgLTMwMTcsODQgKzMwMzYsMTEzIEBACiAJCXJldHVybjsKIAogCS8qIE5vdGhpbmcgdG8gZG8gb24gcmVzdG9yZSBmb3IgMTFOICovCi0JaWYgKHJlc3RvcmUpCi0JCXJldHVybjsKKwlpZiAoIXJlc3RvcmUpIHsKKwkJaWYgKEFSX1NSRVZfOTI4MF8yMF9PUl9MQVRFUihhaCkpIHsKKwkJCS8qCisJCQkgKiBBUjkyODAgMi4wIG9yIGxhdGVyIGNoaXBzIHVzZSBTZXJEZXMgdmFsdWVzIGZyb20gdGhlCisJCQkgKiBpbml0dmFscy5oIGluaXRpYWxpemVkIGRlcGVuZGluZyBvbiBjaGlwc2V0IGR1cmluZworCQkJICogYXRoOWtfaHdfaW5pdCgpCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBhaC0+aW5pUGNpZVNlcmRlcy5pYV9yb3dzOyBpKyspIHsKKwkJCQlSRUdfV1JJVEUoYWgsIElOSV9SQSgmYWgtPmluaVBjaWVTZXJkZXMsIGksIDApLAorCQkJCQkgIElOSV9SQSgmYWgtPmluaVBjaWVTZXJkZXMsIGksIDEpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChBUl9TUkVWXzkyODAoYWgpICYmCisJCQkgICAoYWgtPmh3X3ZlcnNpb24ubWFjUmV2ID09IEFSX1NSRVZfUkVWSVNJT05fOTI4MF8xMCkpIHsKKwkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4OTI0OGZkMDApOworCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHgyNDkyNDkyNCk7CiAKLQlpZiAoQVJfU1JFVl85MjgwXzIwX09SX0xBVEVSKGFoKSkgewotCQkvKgotCQkgKiBBUjkyODAgMi4wIG9yIGxhdGVyIGNoaXBzIHVzZSBTZXJEZXMgdmFsdWVzIGZyb20gdGhlCi0JCSAqIGluaXR2YWxzLmggaW5pdGlhbGl6ZWQgZGVwZW5kaW5nIG9uIGNoaXBzZXQgZHVyaW5nCi0JCSAqIGF0aDlrX2h3X2luaXQoKQotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IGFoLT5pbmlQY2llU2VyZGVzLmlhX3Jvd3M7IGkrKykgewotCQkJUkVHX1dSSVRFKGFoLCBJTklfUkEoJmFoLT5pbmlQY2llU2VyZGVzLCBpLCAwKSwKLQkJCQkgIElOSV9SQSgmYWgtPmluaVBjaWVTZXJkZXMsIGksIDEpKTsKKwkJCS8qIFJYIHNodXQgb2ZmIHdoZW4gZWxlY2lkbGUgaXMgYXNzZXJ0ZWQgKi8KKwkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4YTgwMDAwMTkpOworCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHgxMzE2MDgyMCk7CisJCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweGU1OTgwNTYwKTsKKworCQkJLyogU2h1dCBvZmYgQ0xLUkVRIGFjdGl2ZSBpbiBMMSAqLworCQkJaWYgKGFoLT5jb25maWcucGNpZV9jbG9ja19yZXEpCisJCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHg0MDFkZWZmYyk7CisJCQllbHNlCisJCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHg0MDFkZWZmZCk7CisKKwkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4MWFhYWJlNDApOworCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHhiZTEwNTU1NCk7CisJCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDAwMDQzMDA3KTsKKworCQkJLyogTG9hZCB0aGUgbmV3IHNldHRpbmdzICovCisJCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTMiwgMHgwMDAwMDAwMCk7CisKKwkJfSBlbHNlIHsKKwkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4OTI0OGZjMDApOworCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHgyNDkyNDkyNCk7CisKKwkJCS8qIFJYIHNodXQgb2ZmIHdoZW4gZWxlY2lkbGUgaXMgYXNzZXJ0ZWQgKi8KKwkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4MjgwMDAwMzkpOworCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHg1MzE2MDgyNCk7CisJCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweGU1OTgwNTc5KTsKKworCQkJLyoKKwkJCSAqIElnbm9yZSBhaC0+YWhfY29uZmlnLnBjaWVfY2xvY2tfcmVxIHNldHRpbmcgZm9yCisJCQkgKiBwcmUtQVI5MjgwIDExbgorCQkJICovCisJCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDAwMWRlZmZmKTsKKworCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHgxYWFhYmU0MCk7CisJCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweGJlMTA1NTU0KTsKKwkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4MDAwZTMwMDcpOworCisJCQkvKiBMb2FkIHRoZSBuZXcgc2V0dGluZ3MgKi8KKwkJCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMyLCAweDAwMDAwMDAwKTsKIAkJfQotCX0gZWxzZSBpZiAoQVJfU1JFVl85MjgwKGFoKSAmJgotCQkgICAoYWgtPmh3X3ZlcnNpb24ubWFjUmV2ID09IEFSX1NSRVZfUkVWSVNJT05fOTI4MF8xMCkpIHsKLQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHg5MjQ4ZmQwMCk7Ci0JCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4MjQ5MjQ5MjQpOwogCi0JCS8qIFJYIHNodXQgb2ZmIHdoZW4gZWxlY2lkbGUgaXMgYXNzZXJ0ZWQgKi8KLQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHhhODAwMDAxOSk7Ci0JCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4MTMxNjA4MjApOwotCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweGU1OTgwNTYwKTsKKwkJdWRlbGF5KDEwMDApOwogCi0JCS8qIFNodXQgb2ZmIENMS1JFUSBhY3RpdmUgaW4gTDEgKi8KLQkJaWYgKGFoLT5jb25maWcucGNpZV9jbG9ja19yZXEpCi0JCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDQwMWRlZmZjKTsKLQkJZWxzZQotCQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHg0MDFkZWZmZCk7CisJCS8qIHNldCBiaXQgMTkgdG8gYWxsb3cgZm9yY2luZyBvZiBwY2llIGNvcmUgaW50byBMMSBzdGF0ZSAqLworCQlSRUdfU0VUX0JJVChhaCwgQVJfUENJRV9QTV9DVFJMLCBBUl9QQ0lFX1BNX0NUUkxfRU5BKTsKIAotCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDFhYWFiZTQwKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHhiZTEwNTU1NCk7Ci0JCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4MDAwNDMwMDcpOworCQkvKiBTZXZlcmFsIFBDSWUgbWFzc2FnZXMgdG8gZW5zdXJlIHByb3BlciBiZWhhdmlvdXIgKi8KKwkJaWYgKGFoLT5jb25maWcucGNpZV93YWVuKSB7CisJCQl2YWwgPSBhaC0+Y29uZmlnLnBjaWVfd2FlbjsKKwkJCWlmICghcG93ZXJfb2ZmKQorCQkJCXZhbCAmPSAofkFSX1dBX0QzX0wxX0RJU0FCTEUpOworCQl9IGVsc2UgeworCQkJaWYgKEFSX1NSRVZfOTI4NShhaCkgfHwgQVJfU1JFVl85MjcxKGFoKSB8fAorCQkJICAgIEFSX1NSRVZfOTI4NyhhaCkpIHsKKwkJCQl2YWwgPSBBUjkyODVfV0FfREVGQVVMVDsKKwkJCQlpZiAoIXBvd2VyX29mZikKKwkJCQkJdmFsICY9ICh+QVJfV0FfRDNfTDFfRElTQUJMRSk7CisJCQl9IGVsc2UgaWYgKEFSX1NSRVZfOTI4MChhaCkpIHsKKwkJCQkvKgorCQkJCSAqIE9uIEFSOTI4MCBjaGlwcyBiaXQgMjIgb2YgMHg0MDA0IG5lZWRzIHRvIGJlCisJCQkJICogc2V0IG90aGVyd2lzZSBjYXJkIG1heSBkaXNhcHBlYXIuCisJCQkJICovCisJCQkJdmFsID0gQVI5MjgwX1dBX0RFRkFVTFQ7CisJCQkJaWYgKCFwb3dlcl9vZmYpCisJCQkJCXZhbCAmPSAofkFSX1dBX0QzX0wxX0RJU0FCTEUpOworCQkJfSBlbHNlCisJCQkJdmFsID0gQVJfV0FfREVGQVVMVDsKKwkJfQogCi0JCS8qIExvYWQgdGhlIG5ldyBzZXR0aW5ncyAqLwotCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTMiwgMHgwMDAwMDAwMCk7Ci0KLQl9IGVsc2UgewotCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDkyNDhmYzAwKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHgyNDkyNDkyNCk7Ci0KLQkJLyogUlggc2h1dCBvZmYgd2hlbiBlbGVjaWRsZSBpcyBhc3NlcnRlZCAqLwotCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDI4MDAwMDM5KTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHg1MzE2MDgyNCk7Ci0JCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4ZTU5ODA1NzkpOwotCi0JCS8qCi0JCSAqIElnbm9yZSBhaC0+YWhfY29uZmlnLnBjaWVfY2xvY2tfcmVxIHNldHRpbmcgZm9yCi0JCSAqIHByZS1BUjkyODAgMTFuCi0JCSAqLwotCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDAwMWRlZmZmKTsKLQotCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTLCAweDFhYWFiZTQwKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9QQ0lFX1NFUkRFUywgMHhiZTEwNTU1NCk7Ci0JCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMsIDB4MDAwZTMwMDcpOwotCi0JCS8qIExvYWQgdGhlIG5ldyBzZXR0aW5ncyAqLwotCQlSRUdfV1JJVEUoYWgsIEFSX1BDSUVfU0VSREVTMiwgMHgwMDAwMDAwMCk7CisJCVJFR19XUklURShhaCwgQVJfV0EsIHZhbCk7CiAJfQogCi0JdWRlbGF5KDEwMDApOwotCi0JLyogc2V0IGJpdCAxOSB0byBhbGxvdyBmb3JjaW5nIG9mIHBjaWUgY29yZSBpbnRvIEwxIHN0YXRlICovCi0JUkVHX1NFVF9CSVQoYWgsIEFSX1BDSUVfUE1fQ1RSTCwgQVJfUENJRV9QTV9DVFJMX0VOQSk7Ci0KLQkvKiBTZXZlcmFsIFBDSWUgbWFzc2FnZXMgdG8gZW5zdXJlIHByb3BlciBiZWhhdmlvdXIgKi8KLQlpZiAoYWgtPmNvbmZpZy5wY2llX3dhZW4pIHsKLQkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgYWgtPmNvbmZpZy5wY2llX3dhZW4pOwotCX0gZWxzZSB7Ci0JCWlmIChBUl9TUkVWXzkyODUoYWgpIHx8IEFSX1NSRVZfOTI3MShhaCkgfHwgQVJfU1JFVl85Mjg3KGFoKSkKLQkJCVJFR19XUklURShhaCwgQVJfV0EsIEFSOTI4NV9XQV9ERUZBVUxUKTsKKwlpZiAocG93ZXJfb2ZmKSB7CiAJCS8qCi0JCSAqIE9uIEFSOTI4MCBjaGlwcyBiaXQgMjIgb2YgMHg0MDA0IG5lZWRzIHRvIGJlIHNldCB0bwotCQkgKiBvdGhlcndpc2UgY2FyZCBtYXkgZGlzYXBwZWFyLgorCQkgKiBTZXQgUENJZSB3b3JrYXJvdW5kIGJpdHMKKwkJICogYml0IDE0IGluIFdBIHJlZ2lzdGVyIChkaXNhYmxlIEwxKSBzaG91bGQgb25seQorCQkgKiBiZSBzZXQgd2hlbiBkZXZpY2UgZW50ZXJzIEQzIGFuZCBiZSBjbGVhcmVkCisJCSAqIHdoZW4gZGV2aWNlIGNvbWVzIGJhY2sgdG8gRDAuCiAJCSAqLwotCQllbHNlIGlmIChBUl9TUkVWXzkyODAoYWgpKQotCQkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgQVI5MjgwX1dBX0RFRkFVTFQpOwotCQllbHNlCi0JCQlSRUdfV1JJVEUoYWgsIEFSX1dBLCBBUl9XQV9ERUZBVUxUKTsKKwkJaWYgKGFoLT5jb25maWcucGNpZV93YWVuKSB7CisJCQlpZiAoYWgtPmNvbmZpZy5wY2llX3dhZW4gJiBBUl9XQV9EM19MMV9ESVNBQkxFKQorCQkJCVJFR19TRVRfQklUKGFoLCBBUl9XQSwgQVJfV0FfRDNfTDFfRElTQUJMRSk7CisJCX0gZWxzZSB7CisJCQlpZiAoKChBUl9TUkVWXzkyODUoYWgpIHx8IEFSX1NSRVZfOTI3MShhaCkgfHwKKwkJCSAgICAgIEFSX1NSRVZfOTI4NyhhaCkpICYmCisJCQkgICAgIChBUjkyODVfV0FfREVGQVVMVCAmIEFSX1dBX0QzX0wxX0RJU0FCTEUpKSB8fAorCQkJICAgIChBUl9TUkVWXzkyODAoYWgpICYmCisJCQkgICAgIChBUjkyODBfV0FfREVGQVVMVCAmIEFSX1dBX0QzX0wxX0RJU0FCTEUpKSkgeworCQkJCVJFR19TRVRfQklUKGFoLCBBUl9XQSwgQVJfV0FfRDNfTDFfRElTQUJMRSk7CisJCQl9CisJCX0KIAl9CiB9CiAKQEAgLTM2NTIsMTUgKzM3MDAsNyBAQAogCX0KICNlbmRpZgogCi0JaWYgKChhaC0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl81NDE2X1BDSSkgfHwKLQkgICAgKGFoLT5od192ZXJzaW9uLm1hY1ZlcnNpb24gPT0gQVJfU1JFVl9WRVJTSU9OXzU0MTZfUENJRSkgfHwKLQkgICAgKGFoLT5od192ZXJzaW9uLm1hY1ZlcnNpb24gPT0gQVJfU1JFVl9WRVJTSU9OXzkxNjApIHx8Ci0JICAgIChhaC0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl85MTAwKSB8fAotCSAgICAoYWgtPmh3X3ZlcnNpb24ubWFjVmVyc2lvbiA9PSBBUl9TUkVWX1ZFUlNJT05fOTI4MCkgfHwKLQkgICAgKGFoLT5od192ZXJzaW9uLm1hY1ZlcnNpb24gPT0gQVJfU1JFVl9WRVJTSU9OXzkyODUpKQotCQlwQ2FwLT5od19jYXBzICY9IH5BVEg5S19IV19DQVBfQVVUT1NMRUVQOwotCWVsc2UKLQkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfQVVUT1NMRUVQOworCXBDYXAtPmh3X2NhcHMgJj0gfkFUSDlLX0hXX0NBUF9BVVRPU0xFRVA7CiAKIAlpZiAoQVJfU1JFVl85MjgwKGFoKSB8fCBBUl9TUkVWXzkyODUoYWgpKQogCQlwQ2FwLT5od19jYXBzICY9IH5BVEg5S19IV19DQVBfNEtCX1NQTElUVFJBTlM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCmluZGV4IDkxMDZhMGIuLmI4OTIzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCkBAIC0xMDYsNyArMTA2LDcgQEAKICNkZWZpbmUgQUhfVFNGX1dSSVRFX1RJTUVPVVQgICAgICAgIDEwMCAgICAvKiAodXMpICovCiAjZGVmaW5lIEFIX1RJTUVfUVVBTlRVTSAgICAgICAgICAgICAxMAogI2RlZmluZSBBUl9LRVlUQUJMRV9TSVpFICAgICAgICAgICAgMTI4Ci0jZGVmaW5lIFBPV0VSX1VQX1RJTUUgICAgICAgICAgICAgICAyMDAwMDAKKyNkZWZpbmUgUE9XRVJfVVBfVElNRSAgICAgICAgICAgICAgIDEwMDAwCiAjZGVmaW5lIFNQVVJfUlNTSV9USFJFU0ggICAgICAgICAgICA0MAogCiAjZGVmaW5lIENBQl9USU1FT1VUX1ZBTCAgICAgICAgICAgICAxMApAQCAtNjUwLDcgKzY1MCw3IEBACiAJCQkJICAgIGNvbnN0IHN0cnVjdCBhdGg5a19iZWFjb25fc3RhdGUgKmJzKTsKIGJvb2wgYXRoOWtfaHdfc2V0cG93ZXIoc3RydWN0IGF0aF9odyAqYWgsCiAJCSAgICAgICBlbnVtIGF0aDlrX3Bvd2VyX21vZGUgbW9kZSk7Ci12b2lkIGF0aDlrX2h3X2NvbmZpZ3BjaXBvd2Vyc2F2ZShzdHJ1Y3QgYXRoX2h3ICphaCwgaW50IHJlc3RvcmUpOwordm9pZCBhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoc3RydWN0IGF0aF9odyAqYWgsIGludCByZXN0b3JlLCBpbnQgcG93ZXJfb2ZmKTsKIAogLyogSW50ZXJydXB0IEhhbmRsaW5nICovCiBib29sIGF0aDlrX2h3X2ludHJwZW5kKHN0cnVjdCBhdGhfaHcgKmFoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCmluZGV4IDNkYzdiNWEuLjUyYmVkODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwpAQCAtMTEzMSw3ICsxMTMxLDcgQEAKIAlpbnQgcjsKIAogCWF0aDlrX3BzX3dha2V1cChzYyk7Ci0JYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCAwKTsKKwlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoYWgsIDAsIDApOwogCiAJaWYgKCFhaC0+Y3VyY2hhbikKIAkJYWgtPmN1cmNoYW4gPSBhdGhfZ2V0X2N1cmNoYW5uZWwoc2MsIHNjLT5odyk7CkBAIC0xMjAyLDcgKzEyMDIsNyBAQAogCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcmVzZXRsb2NrKTsKIAogCWF0aDlrX2h3X3BoeV9kaXNhYmxlKGFoKTsKLQlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoYWgsIDEpOworCWF0aDlrX2h3X2NvbmZpZ3BjaXBvd2Vyc2F2ZShhaCwgMSwgMSk7CiAJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiAJYXRoOWtfaHdfc2V0cG93ZXIoYWgsIEFUSDlLX1BNX0ZVTExfU0xFRVApOwogfQpAQCAtMTIyNiwxMSArMTIyNiw2IEBACiAJYm9vbCBibG9ja2VkID0gISFhdGhfaXNfcmZraWxsX3NldChzYyk7CiAKIAl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGh3LT53aXBoeSwgYmxvY2tlZCk7Ci0KLQlpZiAoYmxvY2tlZCkKLQkJYXRoX3JhZGlvX2Rpc2FibGUoc2MpOwotCWVsc2UKLQkJYXRoX3JhZGlvX2VuYWJsZShzYyk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aF9zdGFydF9yZmtpbGxfcG9sbChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKQEAgLTEyNjAsNiArMTI1NSw3IEBACiAJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICJEZXRhY2ggQVRIIGh3XG4iKTsKIAogCWF0aF9kZWluaXRfbGVkcyhzYyk7CisJd2lwaHlfcmZraWxsX3N0b3BfcG9sbGluZyhzYy0+aHctPndpcGh5KTsKIAogCWZvciAoaSA9IDA7IGkgPCBzYy0+bnVtX3NlY193aXBoeTsgaSsrKSB7CiAJCXN0cnVjdCBhdGhfd2lwaHkgKmFwaHkgPSBzYy0+c2VjX3dpcGh5W2ldOwpAQCAtMTk0Miw3ICsxOTM4LDcgQEAKIAlpbml0X2NoYW5uZWwgPSBhdGhfZ2V0X2N1cmNoYW5uZWwoc2MsIGh3KTsKIAogCS8qIFJlc2V0IFNFUkRFUyByZWdpc3RlcnMgKi8KLQlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoc2MtPnNjX2FoLCAwKTsKKwlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoc2MtPnNjX2FoLCAwLCAwKTsKIAogCS8qCiAJICogVGhlIGJhc2ljIGludGVyZmFjZSB0byBzZXR0aW5nIHRoZSBoYXJkd2FyZSBpbiBhIGdvb2QKQEAgLTIxNjYsMTEgKzIxNjIsOSBAQAogCX0gZWxzZQogCQlzYy0+cngucnhsaW5rID0gTlVMTDsKIAotCXdpcGh5X3Jma2lsbF9zdG9wX3BvbGxpbmcoc2MtPmh3LT53aXBoeSk7Ci0KIAkvKiBkaXNhYmxlIEhBTCBhbmQgcHV0IGgvdyB0byBzbGVlcCAqLwogCWF0aDlrX2h3X2Rpc2FibGUoc2MtPnNjX2FoKTsKLQlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoc2MtPnNjX2FoLCAxKTsKKwlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoc2MtPnNjX2FoLCAxLCAxKTsKIAlhdGg5a19od19zZXRwb3dlcihzYy0+c2NfYWgsIEFUSDlLX1BNX0ZVTExfU0xFRVApOwogCiAJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX0lOVkFMSUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCmluZGV4IDE2YTI3MTcuLjE4OTVkNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCkBAIC02NzksNyArNjc5LDcgQEAKIAkJcmV0dXJuIHJhdGU7CiAKIAlpZiAocmF0ZV90YWJsZS0+aW5mb1tyYXRlXS52YWxpZF9zaW5nbGVfc3RyZWFtICYmCi0JICAgICEoYXRoX3JjX3ByaXYtPmh0X2NhcCAmIFdMQU5fUkNfRFNfRkxBRykpOworCSAgICAhKGF0aF9yY19wcml2LT5odF9jYXAgJiBXTEFOX1JDX0RTX0ZMQUcpKQogCQlyZXR1cm4gcmF0ZTsKIAogCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaAppbmRleCBlNWMyOWViLi5kODNiNzdmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaApAQCAtNjc2LDggKzY3Niw5IEBACiAjZGVmaW5lIEFSX1JDX0hPU1RJRiAgICAgICAgIDB4MDAwMDAxMDAKIAogI2RlZmluZSBBUl9XQSAgICAgICAgICAgICAgICAJCTB4NDAwNAorI2RlZmluZSBBUl9XQV9EM19MMV9ESVNBQkxFCQkoMSA8PCAxNCkKICNkZWZpbmUgQVI5Mjg1X1dBX0RFRkFVTFQgCQkweDAwNGEwNWNiCi0jZGVmaW5lIEFSOTI4MF9XQV9ERUZBVUxUICAgICAgICAgICAJMHgwMDQwMDczZgorI2RlZmluZSBBUjkyODBfV0FfREVGQVVMVCAgICAgICAgICAgCTB4MDA0MDA3M2IKICNkZWZpbmUgQVJfV0FfREVGQVVMVCAgICAgICAgICAgICAgIAkweDAwMDAwNzNmCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvS2NvbmZpZwppbmRleCA4M2UzODEzLi41NGVhNjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvS2NvbmZpZwpAQCAtNjEsMTEgKzYxLDI4IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBCNDNfU0RJTworCWJvb2wgIkJyb2FkY29tIDQzeHggU0RJTyBkZXZpY2Ugc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEI0MyAmJiBTU0JfU0RJT0hPU1RfUE9TU0lCTEUgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNTQl9TRElPSE9TVAorCS0tLWhlbHAtLS0KKwkgIEJyb2FkY29tIDQzeHggZGV2aWNlIHN1cHBvcnQgZm9yIFNvZnQtTUFDIFNESU8gZGV2aWNlcy4KKworCSAgV2l0aCB0aGlzIGNvbmZpZyBvcHRpb24geW91IGNhbiBkcml2ZSBTb2Z0LU1BQyBiNDMgY2FyZHMgd2l0aCBhCisJICBTZWN1cmUgRGlnaXRhbCBJL08gaW50ZXJmYWNlLgorCSAgVGhpcyBpbmNsdWRlcyB0aGUgV0xBTiBkYXVnaHRlciBjYXJkIGZvdW5kIG9uIHRoZSBOaW50ZW5kbyBXaWkKKwkgIHZpZGVvIGdhbWUgY29uc29sZS4KKwkgIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHN1cHBvcnQgQnJvYWRjb20gNDN4eCBGdWxsLU1BQyBkZXZpY2VzLgorCisJICBJdCdzIHNhZmUgdG8gc2VsZWN0IFkgaGVyZSwgZXZlbiBpZiB5b3UgZG9uJ3QgaGF2ZSBhIEI0MyBTRElPIGRldmljZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogIyBEYXRhIHRyYW5zZmVycyB0byB0aGUgZGV2aWNlIHZpYSBQSU8KLSMgVGhpcyBpcyBvbmx5IG5lZWRlZCBvbiBQQ01DSUEgZGV2aWNlcy4gQWxsIG90aGVycyBjYW4gZG8gRE1BIHByb3Blcmx5LgorIyBUaGlzIGlzIG9ubHkgbmVlZGVkIG9uIFBDTUNJQSBhbmQgU0RJTyBkZXZpY2VzLiBBbGwgb3RoZXJzIGNhbiBkbyBETUEgcHJvcGVybHkuCiBjb25maWcgQjQzX1BJTwogCWJvb2wKLQlkZXBlbmRzIG9uIEI0MyAmJiAoQjQzX1BDTUNJQSB8fCBCNDNfRk9SQ0VfUElPKQorCWRlcGVuZHMgb24gQjQzICYmIChCNDNfU0RJTyB8fCBCNDNfUENNQ0lBIHx8IEI0M19GT1JDRV9QSU8pCiAJc2VsZWN0IFNTQl9CTE9DS0lPCiAJZGVmYXVsdCB5CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9NYWtlZmlsZQppbmRleCBkYTM3OWY0Li44NDc3MmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL01ha2VmaWxlCkBAIC0xNiw2ICsxNiw3IEBACiBiNDMteQkJCQkrPSByZmtpbGwubwogYjQzLSQoQ09ORklHX0I0M19MRURTKQkJKz0gbGVkcy5vCiBiNDMtJChDT05GSUdfQjQzX1BDTUNJQSkJKz0gcGNtY2lhLm8KK2I0My0kKENPTkZJR19CNDNfU0RJTykJCSs9IHNkaW8ubwogYjQzLSQoQ09ORklHX0I0M19ERUJVRykJCSs9IGRlYnVnZnMubwogCiBvYmotJChDT05GSUdfQjQzKQkJKz0gYjQzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaAppbmRleCAwOWNmZTY4Li42NjA3MTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCkBAIC02MDcsODYgKzYwNyw3IEBACiAJc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgcDsKIH07CiAKLXN0cnVjdCBiNDNfd2xkZXY7Ci0KLS8qIERhdGEgc3RydWN0dXJlIGZvciB0aGUgV0xBTiBwYXJ0cyAoODAyLjExIGNvcmVzKSBvZiB0aGUgYjQzIGNoaXAuICovCi1zdHJ1Y3QgYjQzX3dsIHsKLQkvKiBQb2ludGVyIHRvIHRoZSBhY3RpdmUgd2lyZWxlc3MgZGV2aWNlIG9uIHRoaXMgY2hpcCAqLwotCXN0cnVjdCBiNDNfd2xkZXYgKmN1cnJlbnRfZGV2OwotCS8qIFBvaW50ZXIgdG8gdGhlIGllZWU4MDIxMSBoYXJkd2FyZSBkYXRhIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCi0JLyogR2xvYmFsIGRyaXZlciBtdXRleC4gRXZlcnkgb3BlcmF0aW9uIG11c3QgcnVuIHdpdGggdGhpcyBtdXRleCBsb2NrZWQuICovCi0Jc3RydWN0IG11dGV4IG11dGV4OwotCS8qIEhhcmQtSVJRIHNwaW5sb2NrLiBUaGlzIGxvY2sgcHJvdGVjdHMgdGhpbmdzIHVzZWQgaW4gdGhlIGhhcmQtSVJRCi0JICogaGFuZGxlciwgb25seS4gVGhpcyBiYXNpY2FsbHkgaXMganVzdCB0aGUgSVJRIG1hc2sgcmVnaXN0ZXIuICovCi0Jc3BpbmxvY2tfdCBoYXJkaXJxX2xvY2s7Ci0KLQkvKiBUaGUgbnVtYmVyIG9mIHF1ZXVlcyB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBtYWM4MDIxMSBzdWJzeXN0ZW0KLQkgKiBpbml0aWFsbHkuIFRoaXMgaXMgYSBiYWNrdXAgY29weSBvZiBody0+cXVldWVzIGluIGNhc2UgaHctPnF1ZXVlcyBoYXMKLQkgKiB0byBiZSBkeW5hbWljYWxseSBsb3dlcmVkIGF0IHJ1bnRpbWUgKEZpcm13YXJlIGRvZXMgbm90IHN1cHBvcnQgUW9TKS4KLQkgKiBody0+cXVldWVzIGhhcyB0byBiZSByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwgdmFsdWUgYmVmb3JlIHVucmVnaXN0ZXJpbmcKLQkgKiBmcm9tIHRoZSBtYWM4MDIxMSBzdWJzeXN0ZW0uICovCi0JdTE2IG1hYzgwMjExX2luaXRpYWxseV9yZWdpc3RlcmVkX3F1ZXVlczsKLQotCS8qIFIvVyBsb2NrIGZvciBkYXRhIHRyYW5zbWlzc2lvbi4KLQkgKiBUcmFuc21pc3Npb25zIG9uIDIrIHF1ZXVlcyBjYW4gcnVuIGNvbmN1cnJlbnRseSwgYnV0IHNvbWVib2R5IGVsc2UKLQkgKiBtaWdodCBzeW5jIHdpdGggVFggYnkgd3JpdGVfbG9ja19pcnFzYXZlKCknaW5nLiAqLwotCXJ3bG9ja190IHR4X2xvY2s7Ci0JLyogTG9jayBmb3IgTEVEcyBhY2Nlc3MuICovCi0Jc3BpbmxvY2tfdCBsZWRzX2xvY2s7Ci0KLQkvKiBXZSBjYW4gb25seSBoYXZlIG9uZSBvcGVyYXRpbmcgaW50ZXJmYWNlICg4MDIuMTEgY29yZSkKLQkgKiBhdCBhIHRpbWUuIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbnRlcmZhY2UgZm9sbG93cy4KLQkgKi8KLQotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7Ci0JLyogVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBvcGVyYXRpbmcgaW50ZXJmYWNlLiAqLwotCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKLQkvKiBDdXJyZW50IEJTU0lEICovCi0JdTggYnNzaWRbRVRIX0FMRU5dOwotCS8qIEludGVyZmFjZSB0eXBlLiAoTkw4MDIxMV9JRlRZUEVfWFhYKSAqLwotCWludCBpZl90eXBlOwotCS8qIElzIHRoZSBjYXJkIG9wZXJhdGluZyBpbiBBUCwgU1RBIG9yIElCU1MgbW9kZT8gKi8KLQlib29sIG9wZXJhdGluZzsKLQkvKiBmaWx0ZXIgZmxhZ3MgKi8KLQl1bnNpZ25lZCBpbnQgZmlsdGVyX2ZsYWdzOwotCS8qIFN0YXRzIGFib3V0IHRoZSB3aXJlbGVzcyBpbnRlcmZhY2UgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyBpZWVlX3N0YXRzOwotCi0jaWZkZWYgQ09ORklHX0I0M19IV1JORwotCXN0cnVjdCBod3JuZyBybmc7Ci0JYm9vbCBybmdfaW5pdGlhbGl6ZWQ7Ci0JY2hhciBybmdfbmFtZVszMCArIDFdOwotI2VuZGlmIC8qIENPTkZJR19CNDNfSFdSTkcgKi8KLQotCS8qIExpc3Qgb2YgYWxsIHdpcmVsZXNzIGRldmljZXMgb24gdGhpcyBjaGlwICovCi0Jc3RydWN0IGxpc3RfaGVhZCBkZXZsaXN0OwotCXU4IG5yX2RldnM7Ci0KLQlib29sIHJhZGlvdGFwX2VuYWJsZWQ7Ci0JYm9vbCByYWRpb19lbmFibGVkOwotCi0JLyogVGhlIGJlYWNvbiB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIChBUCBvciBJQlNTIG1vZGUpLiAqLwotCXN0cnVjdCBza19idWZmICpjdXJyZW50X2JlYWNvbjsKLQlib29sIGJlYWNvbjBfdXBsb2FkZWQ7Ci0JYm9vbCBiZWFjb24xX3VwbG9hZGVkOwotCWJvb2wgYmVhY29uX3RlbXBsYXRlc192aXJnaW47IC8qIE5ldmVyIHdyb3RlIHRoZSB0ZW1wbGF0ZXM/ICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IGJlYWNvbl91cGRhdGVfdHJpZ2dlcjsKLQotCS8qIFRoZSBjdXJyZW50IFFPUyBwYXJhbWV0ZXJzIGZvciB0aGUgNCBxdWV1ZXMuICovCi0Jc3RydWN0IGI0M19xb3NfcGFyYW1zIHFvc19wYXJhbXNbNF07Ci0KLQkvKiBXb3JrIGZvciBhZGp1c3RtZW50IG9mIHRoZSB0cmFuc21pc3Npb24gcG93ZXIuCi0JICogVGhpcyBpcyBzY2hlZHVsZWQgd2hlbiB3ZSBkZXRlcm1pbmUgdGhhdCB0aGUgYWN0dWFsIFRYIG91dHB1dAotCSAqIHBvd2VyIGRvZXNuJ3QgbWF0Y2ggd2hhdCB3ZSB3YW50LiAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCB0eHBvd2VyX2FkanVzdF93b3JrOwotCi0JLyogUGFja2V0IHRyYW5zbWl0IHdvcmsgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfd29yazsKLQkvKiBRdWV1ZSBvZiBwYWNrZXRzIHRvIGJlIHRyYW5zbWl0dGVkLiAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgdHhfcXVldWU7Ci19Oworc3RydWN0IGI0M193bDsKIAogLyogVGhlIHR5cGUgb2YgdGhlIGZpcm13YXJlIGZpbGUuICovCiBlbnVtIGI0M19maXJtd2FyZV9maWxlX3R5cGUgewpAQCAtNzY4LDEzICs2ODksMTAgQEAKIAkvKiBUaGUgZGV2aWNlIGluaXRpYWxpemF0aW9uIHN0YXR1cy4KIAkgKiBVc2UgYjQzX3N0YXR1cygpIHRvIHF1ZXJ5LiAqLwogCWF0b21pY190IF9faW5pdF9zdGF0dXM7Ci0JLyogU2F2ZWQgaW5pdCBzdGF0dXMgZm9yIGhhbmRsaW5nIHN1c3BlbmQuICovCi0JaW50IHN1c3BlbmRfaW5pdF9zdGF0dXM7CiAKIAlib29sIGJhZF9mcmFtZXNfcHJlZW1wdDsJLyogVXNlICJCYWQgRnJhbWVzIFByZWVtcHRpb24iIChkZWZhdWx0IG9mZikgKi8KIAlib29sIGRmcV92YWxpZDsJCS8qIERpcmVjdGVkIGZyYW1lIHF1ZXVlIHZhbGlkIChJQlNTIFBTIG1vZGUsIEFUSU0pICovCiAJYm9vbCByYWRpb19od19lbmFibGU7CS8qIHNhdmVkIHN0YXRlIG9mIHJhZGlvIGhhcmR3YXJlIGVuYWJsZWQgc3RhdGUgKi8KLQlib29sIHN1c3BlbmRfaW5fcHJvZ3Jlc3M7CS8qIFRSVUUsIGlmIHdlIGFyZSBpbiBhIHN1c3BlbmQvcmVzdW1lIGN5Y2xlICovCiAJYm9vbCBxb3NfZW5hYmxlZDsJCS8qIFRSVUUsIGlmIFFvUyBpcyB1c2VkLiAqLwogCWJvb2wgaHdjcnlwdG9fZW5hYmxlZDsJCS8qIFRSVUUsIGlmIEhXIGNyeXB0byBhY2NlbGVyYXRpb24gaXMgZW5hYmxlZC4gKi8KIApAQCAtNzk0LDEyICs3MTIsNiBAQAogCS8qIFZhcmlvdXMgc3RhdGlzdGljcyBhYm91dCB0aGUgcGh5c2ljYWwgZGV2aWNlLiAqLwogCXN0cnVjdCBiNDNfc3RhdHMgc3RhdHM7CiAKLQkvKiBUaGUgZGV2aWNlIExFRHMuICovCi0Jc3RydWN0IGI0M19sZWQgbGVkX3R4OwotCXN0cnVjdCBiNDNfbGVkIGxlZF9yeDsKLQlzdHJ1Y3QgYjQzX2xlZCBsZWRfYXNzb2M7Ci0Jc3RydWN0IGI0M19sZWQgbGVkX3JhZGlvOwotCiAJLyogUmVhc29uIGNvZGUgb2YgdGhlIGxhc3QgaW50ZXJydXB0LiAqLwogCXUzMiBpcnFfcmVhc29uOwogCXUzMiBkbWFfcmVhc29uWzZdOwpAQCAtODMwLDkgKzc0MiwxMDQgQEAKIAkvKiBEZWJ1Z2dpbmcgc3R1ZmYgZm9sbG93cy4gKi8KICNpZmRlZiBDT05GSUdfQjQzX0RFQlVHCiAJc3RydWN0IGI0M19kZnNlbnRyeSAqZGZzZW50cnk7CisJdW5zaWduZWQgaW50IGlycV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgaXJxX2JpdF9jb3VudFszMl07CisJdW5zaWduZWQgaW50IHR4X2NvdW50OworCXVuc2lnbmVkIGludCByeF9jb3VudDsKICNlbmRpZgogfTsKIAorLyoKKyAqIEluY2x1ZGUgZ29lcyBoZXJlIHRvIGF2b2lkIGEgZGVwZW5kZW5jeSBwcm9ibGVtLgorICogQSBiZXR0ZXIgZml4IHdvdWxkIGJlIHRvIGludGVncmF0ZSB4bWl0LmggaW50byBiNDMuaC4KKyAqLworI2luY2x1ZGUgInhtaXQuaCIKKworLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBXTEFOIHBhcnRzICg4MDIuMTEgY29yZXMpIG9mIHRoZSBiNDMgY2hpcC4gKi8KK3N0cnVjdCBiNDNfd2wgeworCS8qIFBvaW50ZXIgdG8gdGhlIGFjdGl2ZSB3aXJlbGVzcyBkZXZpY2Ugb24gdGhpcyBjaGlwICovCisJc3RydWN0IGI0M193bGRldiAqY3VycmVudF9kZXY7CisJLyogUG9pbnRlciB0byB0aGUgaWVlZTgwMjExIGhhcmR3YXJlIGRhdGEgc3RydWN0dXJlICovCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisKKwkvKiBHbG9iYWwgZHJpdmVyIG11dGV4LiBFdmVyeSBvcGVyYXRpb24gbXVzdCBydW4gd2l0aCB0aGlzIG11dGV4IGxvY2tlZC4gKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJLyogSGFyZC1JUlEgc3BpbmxvY2suIFRoaXMgbG9jayBwcm90ZWN0cyB0aGluZ3MgdXNlZCBpbiB0aGUgaGFyZC1JUlEKKwkgKiBoYW5kbGVyLCBvbmx5LiBUaGlzIGJhc2ljYWxseSBpcyBqdXN0IHRoZSBJUlEgbWFzayByZWdpc3Rlci4gKi8KKwlzcGlubG9ja190IGhhcmRpcnFfbG9jazsKKworCS8qIFRoZSBudW1iZXIgb2YgcXVldWVzIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGggdGhlIG1hYzgwMjExIHN1YnN5c3RlbQorCSAqIGluaXRpYWxseS4gVGhpcyBpcyBhIGJhY2t1cCBjb3B5IG9mIGh3LT5xdWV1ZXMgaW4gY2FzZSBody0+cXVldWVzIGhhcworCSAqIHRvIGJlIGR5bmFtaWNhbGx5IGxvd2VyZWQgYXQgcnVudGltZSAoRmlybXdhcmUgZG9lcyBub3Qgc3VwcG9ydCBRb1MpLgorCSAqIGh3LT5xdWV1ZXMgaGFzIHRvIGJlIHJlc3RvcmVkIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSBiZWZvcmUgdW5yZWdpc3RlcmluZworCSAqIGZyb20gdGhlIG1hYzgwMjExIHN1YnN5c3RlbS4gKi8KKwl1MTYgbWFjODAyMTFfaW5pdGlhbGx5X3JlZ2lzdGVyZWRfcXVldWVzOworCisJLyogV2UgY2FuIG9ubHkgaGF2ZSBvbmUgb3BlcmF0aW5nIGludGVyZmFjZSAoODAyLjExIGNvcmUpCisJICogYXQgYSB0aW1lLiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW50ZXJmYWNlIGZvbGxvd3MuCisJICovCisKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCS8qIFRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgb3BlcmF0aW5nIGludGVyZmFjZS4gKi8KKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07CisJLyogQ3VycmVudCBCU1NJRCAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwkvKiBJbnRlcmZhY2UgdHlwZS4gKE5MODAyMTFfSUZUWVBFX1hYWCkgKi8KKwlpbnQgaWZfdHlwZTsKKwkvKiBJcyB0aGUgY2FyZCBvcGVyYXRpbmcgaW4gQVAsIFNUQSBvciBJQlNTIG1vZGU/ICovCisJYm9vbCBvcGVyYXRpbmc7CisJLyogZmlsdGVyIGZsYWdzICovCisJdW5zaWduZWQgaW50IGZpbHRlcl9mbGFnczsKKwkvKiBTdGF0cyBhYm91dCB0aGUgd2lyZWxlc3MgaW50ZXJmYWNlICovCisJc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgaWVlZV9zdGF0czsKKworI2lmZGVmIENPTkZJR19CNDNfSFdSTkcKKwlzdHJ1Y3QgaHdybmcgcm5nOworCWJvb2wgcm5nX2luaXRpYWxpemVkOworCWNoYXIgcm5nX25hbWVbMzAgKyAxXTsKKyNlbmRpZiAvKiBDT05GSUdfQjQzX0hXUk5HICovCisKKwkvKiBMaXN0IG9mIGFsbCB3aXJlbGVzcyBkZXZpY2VzIG9uIHRoaXMgY2hpcCAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2bGlzdDsKKwl1OCBucl9kZXZzOworCisJYm9vbCByYWRpb3RhcF9lbmFibGVkOworCWJvb2wgcmFkaW9fZW5hYmxlZDsKKworCS8qIFRoZSBiZWFjb24gd2UgYXJlIGN1cnJlbnRseSB1c2luZyAoQVAgb3IgSUJTUyBtb2RlKS4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqY3VycmVudF9iZWFjb247CisJYm9vbCBiZWFjb24wX3VwbG9hZGVkOworCWJvb2wgYmVhY29uMV91cGxvYWRlZDsKKwlib29sIGJlYWNvbl90ZW1wbGF0ZXNfdmlyZ2luOyAvKiBOZXZlciB3cm90ZSB0aGUgdGVtcGxhdGVzPyAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBiZWFjb25fdXBkYXRlX3RyaWdnZXI7CisKKwkvKiBUaGUgY3VycmVudCBRT1MgcGFyYW1ldGVycyBmb3IgdGhlIDQgcXVldWVzLiAqLworCXN0cnVjdCBiNDNfcW9zX3BhcmFtcyBxb3NfcGFyYW1zWzRdOworCisJLyogV29yayBmb3IgYWRqdXN0bWVudCBvZiB0aGUgdHJhbnNtaXNzaW9uIHBvd2VyLgorCSAqIFRoaXMgaXMgc2NoZWR1bGVkIHdoZW4gd2UgZGV0ZXJtaW5lIHRoYXQgdGhlIGFjdHVhbCBUWCBvdXRwdXQKKwkgKiBwb3dlciBkb2Vzbid0IG1hdGNoIHdoYXQgd2Ugd2FudC4gKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhwb3dlcl9hZGp1c3Rfd29yazsKKworCS8qIFBhY2tldCB0cmFuc21pdCB3b3JrICovCisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3dvcms7CisJLyogUXVldWUgb2YgcGFja2V0cyB0byBiZSB0cmFuc21pdHRlZC4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlOworCisJLyogVGhlIGRldmljZSBMRURzLiAqLworCXN0cnVjdCBiNDNfbGVkcyBsZWRzOworCisjaWZkZWYgQ09ORklHX0I0M19QSU8KKwkvKgorCSAqIFJYL1RYIGhlYWRlci90YWlsIGJ1ZmZlcnMgdXNlZCBieSB0aGUgZnJhbWUgdHJhbnNtaXQgZnVuY3Rpb25zLgorCSAqLworCXN0cnVjdCBiNDNfcnhoZHJfZnc0IHJ4aGRyOworCXN0cnVjdCBiNDNfdHhoZHIgdHhoZHI7CisJdTggcnhfdGFpbFs0XTsKKwl1OCB0eF90YWlsWzRdOworI2VuZGlmIC8qIENPTkZJR19CNDNfUElPICovCit9OworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBiNDNfd2wgKmh3X3RvX2I0M193bChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlyZXR1cm4gaHctPnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RlYnVnZnMuYwppbmRleCA4ZjY0OTQzLi44MGIxOWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kZWJ1Z2ZzLmMKQEAgLTY4OSw2ICs2ODksNyBAQAogCWFkZF9keW5fZGJnKCJkZWJ1Z19sbyIsIEI0M19EQkdfTE8sIDApOwogCWFkZF9keW5fZGJnKCJkZWJ1Z19maXJtd2FyZSIsIEI0M19EQkdfRklSTVdBUkUsIDApOwogCWFkZF9keW5fZGJnKCJkZWJ1Z19rZXlzIiwgQjQzX0RCR19LRVlTLCAwKTsKKwlhZGRfZHluX2RiZygiZGVidWdfdmVyYm9zZV9zdGF0cyIsIEI0M19EQkdfVkVSQk9TRVNUQVRTLCAwKTsKIAogI3VuZGVmIGFkZF9keW5fZGJnCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZGVidWdmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RlYnVnZnMuaAppbmRleCBlNDdiNGI0Li44MjJhYWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZGVidWdmcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kZWJ1Z2ZzLmgKQEAgLTEzLDYgKzEzLDcgQEAKIAlCNDNfREJHX0xPLAogCUI0M19EQkdfRklSTVdBUkUsCiAJQjQzX0RCR19LRVlTLAorCUI0M19EQkdfVkVSQk9TRVNUQVRTLAogCV9fQjQzX05SX0RZTkRCRywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuYwppbmRleCBhNDY3ZWUyLi5kZTRlODA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5jCkBAIC0xMTU3LDggKzExNTcsOSBAQAogfQogCiBzdGF0aWMgaW50IGRtYV90eF9mcmFnbWVudChzdHJ1Y3QgYjQzX2RtYXJpbmcgKnJpbmcsCi0JCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkJICAgc3RydWN0IHNrX2J1ZmYgKippbl9za2IpCiB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICppbl9za2I7CiAJY29uc3Qgc3RydWN0IGI0M19kbWFfb3BzICpvcHMgPSByaW5nLT5vcHM7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCXU4ICpoZWFkZXI7CkBAIC0xMjI0LDggKzEyMjUsMTQgQEAKIAkJfQogCiAJCW1lbWNweShza2JfcHV0KGJvdW5jZV9za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCW1lbWNweShib3VuY2Vfc2tiLT5jYiwgc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwkJYm91bmNlX3NrYi0+ZGV2ID0gc2tiLT5kZXY7CisJCXNrYl9zZXRfcXVldWVfbWFwcGluZyhib3VuY2Vfc2tiLCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisJCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKGJvdW5jZV9za2IpOworCiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXNrYiA9IGJvdW5jZV9za2I7CisJCSppbl9za2IgPSBib3VuY2Vfc2tiOwogCQltZXRhLT5za2IgPSBza2I7CiAJCW1ldGEtPmRtYWFkZHIgPSBtYXBfZGVzY2J1ZmZlcihyaW5nLCBza2ItPmRhdGEsIHNrYi0+bGVuLCAxKTsKIAkJaWYgKGI0M19kbWFfbWFwcGluZ19lcnJvcihyaW5nLCBtZXRhLT5kbWFhZGRyLCBza2ItPmxlbiwgMSkpIHsKQEAgLTEzNTUsNyArMTM2MiwxMSBAQAogCSAqIHN0YXRpYywgc28gd2UgZG9uJ3QgbmVlZCB0byBzdG9yZSBpdCBwZXIgZnJhbWUuICovCiAJcmluZy0+cXVldWVfcHJpbyA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwogCi0JZXJyID0gZG1hX3R4X2ZyYWdtZW50KHJpbmcsIHNrYik7CisJLyogZG1hX3R4X2ZyYWdtZW50IG1pZ2h0IHJlYWxsb2NhdGUgdGhlIHNrYiwgc28gaW52YWxpZGF0ZSBwb2ludGVycyBwb2ludGluZworCSAqIGludG8gdGhlIHNrYiBkYXRhIG9yIGNiIG5vdy4gKi8KKwloZHIgPSBOVUxMOworCWluZm8gPSBOVUxMOworCWVyciA9IGRtYV90eF9mcmFnbWVudChyaW5nLCAmc2tiKTsKIAlpZiAodW5saWtlbHkoZXJyID09IC1FTk9LRVkpKSB7CiAJCS8qIERyb3AgdGhpcyBwYWNrZXQsIGFzIHdlIGRvbid0IGhhdmUgdGhlIGVuY3J5cHRpb24ga2V5CiAJCSAqIGFueW1vcmUgYW5kIG11c3Qgbm90IHRyYW5zbWl0IGl0IHVuZW5jcnlwdGVkLiAqLwpAQCAtMTQyOCw5ICsxNDM5LDkgQEAKIAkJCQlyaW5nLT5ucl9mYWlsZWRfdHhfcGFja2V0cysrOwogCQkJcmluZy0+bnJfdG90YWxfcGFja2V0X3RyaWVzICs9IHN0YXR1cy0+ZnJhbWVfY291bnQ7CiAjZW5kaWYgLyogREVCVUcgKi8KLQkJCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShkZXYtPndsLT5odywgbWV0YS0+c2tiKTsKKwkJCWllZWU4MDIxMV90eF9zdGF0dXMoZGV2LT53bC0+aHcsIG1ldGEtPnNrYik7CiAKLQkJCS8qIHNrYiBpcyBmcmVlZCBieSBpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUoKSAqLworCQkJLyogc2tiIGlzIGZyZWVkIGJ5IGllZWU4MDIxMV90eF9zdGF0dXMoKSAqLwogCQkJbWV0YS0+c2tiID0gTlVMTDsKIAkJfSBlbHNlIHsKIAkJCS8qIE5vIG5lZWQgdG8gY2FsbCBmcmVlX2Rlc2NyaXB0b3JfYnVmZmVyIGhlcmUsIGFzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbGVkcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xlZHMuYwppbmRleCBjOGIzMTcwLi4xZThkYmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbGVkcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sZWRzLmMKQEAgLTM0LDM1ICszNCw3NSBAQAogc3RhdGljIHZvaWQgYjQzX2xlZF90dXJuX29uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggbGVkX2luZGV4LAogCQkJICAgIGJvb2wgYWN0aXZlbG93KQogewotCXN0cnVjdCBiNDNfd2wgKndsID0gZGV2LT53bDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBjdGw7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPmxlZHNfbG9jaywgZmxhZ3MpOwogCWN0bCA9IGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19HUElPX0NPTlRST0wpOwogCWlmIChhY3RpdmVsb3cpCiAJCWN0bCAmPSB+KDEgPDwgbGVkX2luZGV4KTsKIAllbHNlCiAJCWN0bCB8PSAoMSA8PCBsZWRfaW5kZXgpOwogCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fR1BJT19DT05UUk9MLCBjdGwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT5sZWRzX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgYjQzX2xlZF90dXJuX29mZihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHU4IGxlZF9pbmRleCwKIAkJCSAgICAgYm9vbCBhY3RpdmVsb3cpCiB7Ci0Jc3RydWN0IGI0M193bCAqd2wgPSBkZXYtPndsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IGN0bDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+bGVkc19sb2NrLCBmbGFncyk7CiAJY3RsID0gYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX0dQSU9fQ09OVFJPTCk7CiAJaWYgKGFjdGl2ZWxvdykKIAkJY3RsIHw9ICgxIDw8IGxlZF9pbmRleCk7CiAJZWxzZQogCQljdGwgJj0gfigxIDw8IGxlZF9pbmRleCk7CiAJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19HUElPX0NPTlRST0wsIGN0bCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPmxlZHNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBiNDNfbGVkX3VwZGF0ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkgICBzdHJ1Y3QgYjQzX2xlZCAqbGVkKQoreworCWJvb2wgcmFkaW9fZW5hYmxlZDsKKwlib29sIHR1cm5fb247CisKKwlpZiAoIWxlZC0+d2wpCisJCXJldHVybjsKKworCXJhZGlvX2VuYWJsZWQgPSAoZGV2LT5waHkucmFkaW9fb24gJiYgZGV2LT5yYWRpb19od19lbmFibGUpOworCisJLyogVGhlIGxlZC0+c3RhdGUgcmVhZCBpcyByYWN5LCBidXQgd2UgZG9uJ3QgY2FyZS4gSW4gY2FzZSB3ZSByYWNlZAorCSAqIHdpdGggdGhlIGJyaWdodG5lc3Nfc2V0IGhhbmRsZXIsIHdlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHNvb24KKwkgKiB0byBmaXh1cCBvdXIgc3RhdGUuICovCisJaWYgKHJhZGlvX2VuYWJsZWQpCisJCXR1cm5fb24gPSBhdG9taWNfcmVhZCgmbGVkLT5zdGF0ZSkgIT0gTEVEX09GRjsKKwllbHNlCisJCXR1cm5fb24gPSAwOworCWlmICh0dXJuX29uID09IGxlZC0+aHdfc3RhdGUpCisJCXJldHVybjsKKwlsZWQtPmh3X3N0YXRlID0gdHVybl9vbjsKKworCWlmICh0dXJuX29uKQorCQliNDNfbGVkX3R1cm5fb24oZGV2LCBsZWQtPmluZGV4LCBsZWQtPmFjdGl2ZWxvdyk7CisJZWxzZQorCQliNDNfbGVkX3R1cm5fb2ZmKGRldiwgbGVkLT5pbmRleCwgbGVkLT5hY3RpdmVsb3cpOworfQorCitzdGF0aWMgdm9pZCBiNDNfbGVkc193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYjQzX2xlZHMgKmxlZHMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGI0M19sZWRzLCB3b3JrKTsKKwlzdHJ1Y3QgYjQzX3dsICp3bCA9IGNvbnRhaW5lcl9vZihsZWRzLCBzdHJ1Y3QgYjQzX3dsLCBsZWRzKTsKKwlzdHJ1Y3QgYjQzX3dsZGV2ICpkZXY7CisKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCWRldiA9IHdsLT5jdXJyZW50X2RldjsKKwlpZiAodW5saWtlbHkoIWRldiB8fCBiNDNfc3RhdHVzKGRldikgPCBCNDNfU1RBVF9TVEFSVEVEKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJYjQzX2xlZF91cGRhdGUoZGV2LCAmd2wtPmxlZHMubGVkX3R4KTsKKwliNDNfbGVkX3VwZGF0ZShkZXYsICZ3bC0+bGVkcy5sZWRfcngpOworCWI0M19sZWRfdXBkYXRlKGRldiwgJndsLT5sZWRzLmxlZF9yYWRpbyk7CisJYjQzX2xlZF91cGRhdGUoZGV2LCAmd2wtPmxlZHMubGVkX2Fzc29jKTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiB9CiAKIC8qIENhbGxiYWNrIGZyb20gdGhlIExFRCBzdWJzeXN0ZW0uICovCkBAIC03MCwyMSArMTEwLDEyIEBACiAJCQkJICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQogewogCXN0cnVjdCBiNDNfbGVkICpsZWQgPSBjb250YWluZXJfb2YobGVkX2Rldiwgc3RydWN0IGI0M19sZWQsIGxlZF9kZXYpOwotCXN0cnVjdCBiNDNfd2xkZXYgKmRldiA9IGxlZC0+ZGV2OwotCWJvb2wgcmFkaW9fZW5hYmxlZDsKKwlzdHJ1Y3QgYjQzX3dsICp3bCA9IGxlZC0+d2w7CiAKLQlpZiAodW5saWtlbHkoYjQzX3N0YXR1cyhkZXYpIDwgQjQzX1NUQVRfSU5JVElBTElaRUQpKQotCQlyZXR1cm47Ci0KLQkvKiBDaGVja2luZyB0aGUgcmFkaW8tZW5hYmxlZCBzdGF0dXMgaGVyZSBpcyBzbGlnaHRseSByYWN5LAotCSAqIGJ1dCB3ZSB3YW50IHRvIGF2b2lkIHRoZSBsb2NraW5nIG92ZXJoZWFkIGFuZCB3ZSBkb24ndCBjYXJlCi0JICogd2hldGhlciB0aGUgTEVEIGhhcyB0aGUgd3Jvbmcgc3RhdGUgZm9yIGEgc2Vjb25kLiAqLwotCXJhZGlvX2VuYWJsZWQgPSAoZGV2LT5waHkucmFkaW9fb24gJiYgZGV2LT5yYWRpb19od19lbmFibGUpOwotCi0JaWYgKGJyaWdodG5lc3MgPT0gTEVEX09GRiB8fCAhcmFkaW9fZW5hYmxlZCkKLQkJYjQzX2xlZF90dXJuX29mZihkZXYsIGxlZC0+aW5kZXgsIGxlZC0+YWN0aXZlbG93KTsKLQllbHNlCi0JCWI0M19sZWRfdHVybl9vbihkZXYsIGxlZC0+aW5kZXgsIGxlZC0+YWN0aXZlbG93KTsKKwlpZiAobGlrZWx5KCF3bC0+bGVkcy5zdG9wKSkgeworCQlhdG9taWNfc2V0KCZsZWQtPnN0YXRlLCBicmlnaHRuZXNzKTsKKwkJaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LCAmd2wtPmxlZHMud29yayk7CisJfQogfQogCiBzdGF0aWMgaW50IGI0M19yZWdpc3Rlcl9sZWQoc3RydWN0IGI0M193bGRldiAqZGV2LCBzdHJ1Y3QgYjQzX2xlZCAqbGVkLApAQCAtOTMsMTUgKzEyNCwxNSBAQAogewogCWludCBlcnI7CiAKLQliNDNfbGVkX3R1cm5fb2ZmKGRldiwgbGVkX2luZGV4LCBhY3RpdmVsb3cpOwotCWlmIChsZWQtPmRldikKKwlpZiAobGVkLT53bCkKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJaWYgKCFkZWZhdWx0X3RyaWdnZXIpCiAJCXJldHVybiAtRUlOVkFMOwotCWxlZC0+ZGV2ID0gZGV2OworCWxlZC0+d2wgPSBkZXYtPndsOwogCWxlZC0+aW5kZXggPSBsZWRfaW5kZXg7CiAJbGVkLT5hY3RpdmVsb3cgPSBhY3RpdmVsb3c7CiAJc3RybmNweShsZWQtPm5hbWUsIG5hbWUsIHNpemVvZihsZWQtPm5hbWUpKTsKKwlhdG9taWNfc2V0KCZsZWQtPnN0YXRlLCAwKTsKIAogCWxlZC0+bGVkX2Rldi5uYW1lID0gbGVkLT5uYW1lOwogCWxlZC0+bGVkX2Rldi5kZWZhdWx0X3RyaWdnZXIgPSBkZWZhdWx0X3RyaWdnZXI7CkBAIC0xMTAsMTkgKzE0MSwxOSBAQAogCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcihkZXYtPmRldi0+ZGV2LCAmbGVkLT5sZWRfZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWI0M3dhcm4oZGV2LT53bCwgIkxFRHM6IEZhaWxlZCB0byByZWdpc3RlciAlc1xuIiwgbmFtZSk7Ci0JCWxlZC0+ZGV2ID0gTlVMTDsKKwkJbGVkLT53bCA9IE5VTEw7CiAJCXJldHVybiBlcnI7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGI0M191bnJlZ2lzdGVyX2xlZChzdHJ1Y3QgYjQzX2xlZCAqbGVkKQogewotCWlmICghbGVkLT5kZXYpCisJaWYgKCFsZWQtPndsKQogCQlyZXR1cm47CiAJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmxlZC0+bGVkX2Rldik7Ci0JYjQzX2xlZF90dXJuX29mZihsZWQtPmRldiwgbGVkLT5pbmRleCwgbGVkLT5hY3RpdmVsb3cpOwotCWxlZC0+ZGV2ID0gTlVMTDsKKwlsZWQtPndsID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgYjQzX21hcF9sZWQoc3RydWN0IGI0M193bGRldiAqZGV2LApAQCAtMTM3LDI0ICsxNjgsMjAgQEAKIAkgKiBnZW5lcmljIExFRCB0cmlnZ2Vycy4gKi8KIAlzd2l0Y2ggKGJlaGF2aW91cikgewogCWNhc2UgQjQzX0xFRF9JTkFDVElWRToKLQkJYnJlYWs7CiAJY2FzZSBCNDNfTEVEX09GRjoKLQkJYjQzX2xlZF90dXJuX29mZihkZXYsIGxlZF9pbmRleCwgYWN0aXZlbG93KTsKLQkJYnJlYWs7CiAJY2FzZSBCNDNfTEVEX09OOgotCQliNDNfbGVkX3R1cm5fb24oZGV2LCBsZWRfaW5kZXgsIGFjdGl2ZWxvdyk7CiAJCWJyZWFrOwogCWNhc2UgQjQzX0xFRF9BQ1RJVklUWToKIAljYXNlIEI0M19MRURfVFJBTlNGRVI6CiAJY2FzZSBCNDNfTEVEX0FQVFJBTlNGRVI6CiAJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKIAkJCSAiYjQzLSVzOjp0eCIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7Ci0JCWI0M19yZWdpc3Rlcl9sZWQoZGV2LCAmZGV2LT5sZWRfdHgsIG5hbWUsCisJCWI0M19yZWdpc3Rlcl9sZWQoZGV2LCAmZGV2LT53bC0+bGVkcy5sZWRfdHgsIG5hbWUsCiAJCQkJIGllZWU4MDIxMV9nZXRfdHhfbGVkX25hbWUoaHcpLAogCQkJCSBsZWRfaW5kZXgsIGFjdGl2ZWxvdyk7CiAJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKIAkJCSAiYjQzLSVzOjpyeCIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7Ci0JCWI0M19yZWdpc3Rlcl9sZWQoZGV2LCAmZGV2LT5sZWRfcngsIG5hbWUsCisJCWI0M19yZWdpc3Rlcl9sZWQoZGV2LCAmZGV2LT53bC0+bGVkcy5sZWRfcngsIG5hbWUsCiAJCQkJIGllZWU4MDIxMV9nZXRfcnhfbGVkX25hbWUoaHcpLAogCQkJCSBsZWRfaW5kZXgsIGFjdGl2ZWxvdyk7CiAJCWJyZWFrOwpAQCAtMTY0LDE4ICsxOTEsMTUgQEAKIAljYXNlIEI0M19MRURfTU9ERV9CRzoKIAkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLAogCQkJICJiNDMtJXM6OnJhZGlvIiwgd2lwaHlfbmFtZShody0+d2lwaHkpKTsKLQkJYjQzX3JlZ2lzdGVyX2xlZChkZXYsICZkZXYtPmxlZF9yYWRpbywgbmFtZSwKKwkJYjQzX3JlZ2lzdGVyX2xlZChkZXYsICZkZXYtPndsLT5sZWRzLmxlZF9yYWRpbywgbmFtZSwKIAkJCQkgaWVlZTgwMjExX2dldF9yYWRpb19sZWRfbmFtZShodyksCiAJCQkJIGxlZF9pbmRleCwgYWN0aXZlbG93KTsKLQkJLyogU3luYyB0aGUgUkYta2lsbCBMRUQgc3RhdGUgd2l0aCByYWRpbyBhbmQgc3dpdGNoIHN0YXRlcy4gKi8KLQkJaWYgKGRldi0+cGh5LnJhZGlvX29uICYmIGI0M19pc19od19yYWRpb19lbmFibGVkKGRldikpCi0JCQliNDNfbGVkX3R1cm5fb24oZGV2LCBsZWRfaW5kZXgsIGFjdGl2ZWxvdyk7CiAJCWJyZWFrOwogCWNhc2UgQjQzX0xFRF9XRUlSRDoKIAljYXNlIEI0M19MRURfQVNTT0M6CiAJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKIAkJCSAiYjQzLSVzOjphc3NvYyIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7Ci0JCWI0M19yZWdpc3Rlcl9sZWQoZGV2LCAmZGV2LT5sZWRfYXNzb2MsIG5hbWUsCisJCWI0M19yZWdpc3Rlcl9sZWQoZGV2LCAmZGV2LT53bC0+bGVkcy5sZWRfYXNzb2MsIG5hbWUsCiAJCQkJIGllZWU4MDIxMV9nZXRfYXNzb2NfbGVkX25hbWUoaHcpLAogCQkJCSBsZWRfaW5kZXgsIGFjdGl2ZWxvdyk7CiAJCWJyZWFrOwpAQCAtMTg2LDU4ICsyMTAsMTUwIEBACiAJfQogfQogCi12b2lkIGI0M19sZWRzX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQorc3RhdGljIHZvaWQgYjQzX2xlZF9nZXRfc3Byb21pbmZvKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkgIHVuc2lnbmVkIGludCBsZWRfaW5kZXgsCisJCQkJICBlbnVtIGI0M19sZWRfYmVoYXZpb3VyICpiZWhhdmlvdXIsCisJCQkJICBib29sICphY3RpdmVsb3cpCiB7CiAJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+ZGV2LT5idXM7CiAJdTggc3Byb21bNF07Ci0JaW50IGk7Ci0JZW51bSBiNDNfbGVkX2JlaGF2aW91ciBiZWhhdmlvdXI7Ci0JYm9vbCBhY3RpdmVsb3c7CiAKIAlzcHJvbVswXSA9IGJ1cy0+c3Byb20uZ3BpbzA7CiAJc3Byb21bMV0gPSBidXMtPnNwcm9tLmdwaW8xOwogCXNwcm9tWzJdID0gYnVzLT5zcHJvbS5ncGlvMjsKIAlzcHJvbVszXSA9IGJ1cy0+c3Byb20uZ3BpbzM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmIChzcHJvbVtpXSA9PSAweEZGKSB7Ci0JCQkvKiBUaGVyZSBpcyBubyBMRUQgaW5mb3JtYXRpb24gaW4gdGhlIFNQUk9NCi0JCQkgKiBmb3IgdGhpcyBMRUQuIEhhcmRjb2RlIGl0IGhlcmUuICovCi0JCQlhY3RpdmVsb3cgPSAwOwotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJYmVoYXZpb3VyID0gQjQzX0xFRF9BQ1RJVklUWTsKLQkJCQlhY3RpdmVsb3cgPSAxOwotCQkJCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpCi0JCQkJCWJlaGF2aW91ciA9IEI0M19MRURfUkFESU9fQUxMOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCWJlaGF2aW91ciA9IEI0M19MRURfUkFESU9fQjsKLQkJCQlpZiAoYnVzLT5ib2FyZGluZm8udmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVNVU1RFSykKLQkJCQkJYmVoYXZpb3VyID0gQjQzX0xFRF9BU1NPQzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQliZWhhdmlvdXIgPSBCNDNfTEVEX1JBRElPX0E7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJYmVoYXZpb3VyID0gQjQzX0xFRF9PRkY7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUI0M19XQVJOX09OKDEpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJlaGF2aW91ciA9IHNwcm9tW2ldICYgQjQzX0xFRF9CRUhBVklPVVI7Ci0JCQlhY3RpdmVsb3cgPSAhIShzcHJvbVtpXSAmIEI0M19MRURfQUNUSVZFTE9XKTsKKwlpZiAoc3Byb21bbGVkX2luZGV4XSA9PSAweEZGKSB7CisJCS8qIFRoZXJlIGlzIG5vIExFRCBpbmZvcm1hdGlvbiBpbiB0aGUgU1BST00KKwkJICogZm9yIHRoaXMgTEVELiBIYXJkY29kZSBpdCBoZXJlLiAqLworCQkqYWN0aXZlbG93ID0gMDsKKwkJc3dpdGNoIChsZWRfaW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJKmJlaGF2aW91ciA9IEI0M19MRURfQUNUSVZJVFk7CisJCQkqYWN0aXZlbG93ID0gMTsKKwkJCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpCisJCQkJKmJlaGF2aW91ciA9IEI0M19MRURfUkFESU9fQUxMOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCSpiZWhhdmlvdXIgPSBCNDNfTEVEX1JBRElPX0I7CisJCQlpZiAoYnVzLT5ib2FyZGluZm8udmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVNVU1RFSykKKwkJCQkqYmVoYXZpb3VyID0gQjQzX0xFRF9BU1NPQzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkqYmVoYXZpb3VyID0gQjQzX0xFRF9SQURJT19BOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCSpiZWhhdmlvdXIgPSBCNDNfTEVEX09GRjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQjQzX1dBUk5fT04oMSk7CisJCQlyZXR1cm47CiAJCX0KLQkJYjQzX21hcF9sZWQoZGV2LCBpLCBiZWhhdmlvdXIsIGFjdGl2ZWxvdyk7CisJfSBlbHNlIHsKKwkJKmJlaGF2aW91ciA9IHNwcm9tW2xlZF9pbmRleF0gJiBCNDNfTEVEX0JFSEFWSU9VUjsKKwkJKmFjdGl2ZWxvdyA9ICEhKHNwcm9tW2xlZF9pbmRleF0gJiBCNDNfTEVEX0FDVElWRUxPVyk7CiAJfQogfQogCit2b2lkIGI0M19sZWRzX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfbGVkICpsZWQ7CisJdW5zaWduZWQgaW50IGk7CisJZW51bSBiNDNfbGVkX2JlaGF2aW91ciBiZWhhdmlvdXI7CisJYm9vbCBhY3RpdmVsb3c7CisKKwkvKiBTeW5jIHRoZSBSRi1raWxsIExFRCBzdGF0ZSAoaWYgd2UgaGF2ZSBvbmUpIHdpdGggcmFkaW8gYW5kIHN3aXRjaCBzdGF0ZXMuICovCisJbGVkID0gJmRldi0+d2wtPmxlZHMubGVkX3JhZGlvOworCWlmIChsZWQtPndsKSB7CisJCWlmIChkZXYtPnBoeS5yYWRpb19vbiAmJiBiNDNfaXNfaHdfcmFkaW9fZW5hYmxlZChkZXYpKSB7CisJCQliNDNfbGVkX3R1cm5fb24oZGV2LCBsZWQtPmluZGV4LCBsZWQtPmFjdGl2ZWxvdyk7CisJCQlsZWQtPmh3X3N0YXRlID0gMTsKKwkJCWF0b21pY19zZXQoJmxlZC0+c3RhdGUsIDEpOworCQl9IGVsc2UgeworCQkJYjQzX2xlZF90dXJuX29mZihkZXYsIGxlZC0+aW5kZXgsIGxlZC0+YWN0aXZlbG93KTsKKwkJCWxlZC0+aHdfc3RhdGUgPSAwOworCQkJYXRvbWljX3NldCgmbGVkLT5zdGF0ZSwgMCk7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIFRYL1JYL0FTU09DIGxlZHMgKi8KKwlsZWQgPSAmZGV2LT53bC0+bGVkcy5sZWRfdHg7CisJaWYgKGxlZC0+d2wpIHsKKwkJYjQzX2xlZF90dXJuX29mZihkZXYsIGxlZC0+aW5kZXgsIGxlZC0+YWN0aXZlbG93KTsKKwkJbGVkLT5od19zdGF0ZSA9IDA7CisJCWF0b21pY19zZXQoJmxlZC0+c3RhdGUsIDApOworCX0KKwlsZWQgPSAmZGV2LT53bC0+bGVkcy5sZWRfcng7CisJaWYgKGxlZC0+d2wpIHsKKwkJYjQzX2xlZF90dXJuX29mZihkZXYsIGxlZC0+aW5kZXgsIGxlZC0+YWN0aXZlbG93KTsKKwkJbGVkLT5od19zdGF0ZSA9IDA7CisJCWF0b21pY19zZXQoJmxlZC0+c3RhdGUsIDApOworCX0KKwlsZWQgPSAmZGV2LT53bC0+bGVkcy5sZWRfYXNzb2M7CisJaWYgKGxlZC0+d2wpIHsKKwkJYjQzX2xlZF90dXJuX29mZihkZXYsIGxlZC0+aW5kZXgsIGxlZC0+YWN0aXZlbG93KTsKKwkJbGVkLT5od19zdGF0ZSA9IDA7CisJCWF0b21pY19zZXQoJmxlZC0+c3RhdGUsIDApOworCX0KKworCS8qIEluaXRpYWxpemUgb3RoZXIgTEVEIHN0YXRlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQjQzX01BWF9OUl9MRURTOyBpKyspIHsKKwkJYjQzX2xlZF9nZXRfc3Byb21pbmZvKGRldiwgaSwgJmJlaGF2aW91ciwgJmFjdGl2ZWxvdyk7CisJCXN3aXRjaCAoYmVoYXZpb3VyKSB7CisJCWNhc2UgQjQzX0xFRF9PRkY6CisJCQliNDNfbGVkX3R1cm5fb2ZmKGRldiwgaSwgYWN0aXZlbG93KTsKKwkJCWJyZWFrOworCQljYXNlIEI0M19MRURfT046CisJCQliNDNfbGVkX3R1cm5fb24oZGV2LCBpLCBhY3RpdmVsb3cpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBMZWF2ZSBvdGhlcnMgYXMtaXMuICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWRldi0+d2wtPmxlZHMuc3RvcCA9IDA7Cit9CisKIHZvaWQgYjQzX2xlZHNfZXhpdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0JYjQzX3VucmVnaXN0ZXJfbGVkKCZkZXYtPmxlZF90eCk7Ci0JYjQzX3VucmVnaXN0ZXJfbGVkKCZkZXYtPmxlZF9yeCk7Ci0JYjQzX3VucmVnaXN0ZXJfbGVkKCZkZXYtPmxlZF9hc3NvYyk7Ci0JYjQzX3VucmVnaXN0ZXJfbGVkKCZkZXYtPmxlZF9yYWRpbyk7CisJc3RydWN0IGI0M19sZWRzICpsZWRzID0gJmRldi0+d2wtPmxlZHM7CisKKwliNDNfbGVkX3R1cm5fb2ZmKGRldiwgbGVkcy0+bGVkX3R4LmluZGV4LCBsZWRzLT5sZWRfdHguYWN0aXZlbG93KTsKKwliNDNfbGVkX3R1cm5fb2ZmKGRldiwgbGVkcy0+bGVkX3J4LmluZGV4LCBsZWRzLT5sZWRfcnguYWN0aXZlbG93KTsKKwliNDNfbGVkX3R1cm5fb2ZmKGRldiwgbGVkcy0+bGVkX2Fzc29jLmluZGV4LCBsZWRzLT5sZWRfYXNzb2MuYWN0aXZlbG93KTsKKwliNDNfbGVkX3R1cm5fb2ZmKGRldiwgbGVkcy0+bGVkX3JhZGlvLmluZGV4LCBsZWRzLT5sZWRfcmFkaW8uYWN0aXZlbG93KTsKK30KKwordm9pZCBiNDNfbGVkc19zdG9wKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX2xlZHMgKmxlZHMgPSAmZGV2LT53bC0+bGVkczsKKworCWxlZHMtPnN0b3AgPSAxOworCWNhbmNlbF93b3JrX3N5bmMoJmxlZHMtPndvcmspOworfQorCit2b2lkIGI0M19sZWRzX3JlZ2lzdGVyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwllbnVtIGI0M19sZWRfYmVoYXZpb3VyIGJlaGF2aW91cjsKKwlib29sIGFjdGl2ZWxvdzsKKworCUlOSVRfV09SSygmZGV2LT53bC0+bGVkcy53b3JrLCBiNDNfbGVkc193b3JrKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBMRURzIHRvIHRoZSBMRUQgc3Vic3lzdGVtLiAqLworCWZvciAoaSA9IDA7IGkgPCBCNDNfTUFYX05SX0xFRFM7IGkrKykgeworCQliNDNfbGVkX2dldF9zcHJvbWluZm8oZGV2LCBpLCAmYmVoYXZpb3VyLCAmYWN0aXZlbG93KTsKKwkJYjQzX21hcF9sZWQoZGV2LCBpLCBiZWhhdmlvdXIsIGFjdGl2ZWxvdyk7CisJfQorfQorCit2b2lkIGI0M19sZWRzX3VucmVnaXN0ZXIoc3RydWN0IGI0M193bCAqd2wpCit7CisJc3RydWN0IGI0M19sZWRzICpsZWRzID0gJndsLT5sZWRzOworCisJYjQzX3VucmVnaXN0ZXJfbGVkKCZsZWRzLT5sZWRfdHgpOworCWI0M191bnJlZ2lzdGVyX2xlZCgmbGVkcy0+bGVkX3J4KTsKKwliNDNfdW5yZWdpc3Rlcl9sZWQoJmxlZHMtPmxlZF9hc3NvYyk7CisJYjQzX3VucmVnaXN0ZXJfbGVkKCZsZWRzLT5sZWRfcmFkaW8pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xlZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sZWRzLmgKaW5kZXggYjhiMWRkNS4uMzJiNjZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xlZHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbGVkcy5oCkBAIC0xLDE4ICsxLDIwIEBACiAjaWZuZGVmIEI0M19MRURTX0hfCiAjZGVmaW5lIEI0M19MRURTX0hfCiAKK3N0cnVjdCBiNDNfd2w7CiBzdHJ1Y3QgYjQzX3dsZGV2OwogCiAjaWZkZWYgQ09ORklHX0I0M19MRURTCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogCiAjZGVmaW5lIEI0M19MRURfTUFYX05BTUVfTEVOCTMxCiAKIHN0cnVjdCBiNDNfbGVkIHsKLQlzdHJ1Y3QgYjQzX3dsZGV2ICpkZXY7CisJc3RydWN0IGI0M193bCAqd2w7CiAJLyogVGhlIExFRCBjbGFzcyBkZXZpY2UgKi8KIAlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxlZF9kZXY7CiAJLyogVGhlIGluZGV4IG51bWJlciBvZiB0aGUgTEVELiAqLwpAQCAtMjIsOCArMjQsMjQgQEAKIAlib29sIGFjdGl2ZWxvdzsKIAkvKiBUaGUgdW5pcXVlIG5hbWUgc3RyaW5nIGZvciB0aGlzIExFRCBkZXZpY2UuICovCiAJY2hhciBuYW1lW0I0M19MRURfTUFYX05BTUVfTEVOICsgMV07CisJLyogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBMRUQuIFRoaXMgaXMgdXBkYXRlZCBsb2NrbGVzc2x5LiAqLworCWF0b21pY190IHN0YXRlOworCS8qIFRoZSBhY3RpdmUgc3RhdGUgaW4gaGFyZHdhcmUuICovCisJYm9vbCBod19zdGF0ZTsKIH07CiAKK3N0cnVjdCBiNDNfbGVkcyB7CisJc3RydWN0IGI0M19sZWQgbGVkX3R4OworCXN0cnVjdCBiNDNfbGVkIGxlZF9yeDsKKwlzdHJ1Y3QgYjQzX2xlZCBsZWRfcmFkaW87CisJc3RydWN0IGI0M19sZWQgbGVkX2Fzc29jOworCisJYm9vbCBzdG9wOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworfTsKKworI2RlZmluZSBCNDNfTUFYX05SX0xFRFMJCQk0CisKICNkZWZpbmUgQjQzX0xFRF9CRUhBVklPVVIJCTB4N0YKICNkZWZpbmUgQjQzX0xFRF9BQ1RJVkVMT1cJCTB4ODAKIC8qIExFRCBiZWhhdmlvdXIgdmFsdWVzICovCkBAIC00MiwyMyArNjAsMzUgQEAKIAlCNDNfTEVEX0lOQUNUSVZFLAogfTsKIAordm9pZCBiNDNfbGVkc19yZWdpc3RlcihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwordm9pZCBiNDNfbGVkc191bnJlZ2lzdGVyKHN0cnVjdCBiNDNfd2wgKndsKTsKIHZvaWQgYjQzX2xlZHNfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwogdm9pZCBiNDNfbGVkc19leGl0KHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Cit2b2lkIGI0M19sZWRzX3N0b3Aoc3RydWN0IGI0M193bGRldiAqZGV2KTsKIAogCiAjZWxzZSAvKiBDT05GSUdfQjQzX0xFRFMgKi8KIC8qIExFRCBzdXBwb3J0IGRpc2FibGVkICovCiAKLXN0cnVjdCBiNDNfbGVkIHsKK3N0cnVjdCBiNDNfbGVkcyB7CiAJLyogZW1wdHkgKi8KIH07CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBiNDNfbGVkc19yZWdpc3RlcihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYjQzX2xlZHNfdW5yZWdpc3RlcihzdHJ1Y3QgYjQzX3dsICp3bCkKK3sKK30KIHN0YXRpYyBpbmxpbmUgdm9pZCBiNDNfbGVkc19pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBiNDNfbGVkc19leGl0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBiNDNfbGVkc19zdG9wKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKK30KICNlbmRpZiAvKiBDT05GSUdfQjQzX0xFRFMgKi8KIAogI2VuZGlmIC8qIEI0M19MRURTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwppbmRleCBlNzg5NzkyLi44NmYzNTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKQEAgLTgsNiArOCw5IEBACiAgIENvcHlyaWdodCAoYykgMjAwNSBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KICAgQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgogCisgIFNESU8gc3VwcG9ydAorICBDb3B5cmlnaHQgKGMpIDIwMDkgQWxiZXJ0IEhlcnJhbnogPGFsYmVydF9oZXJyYW56QHlhaG9vLmVzPgorCiAgIFNvbWUgcGFydHMgb2YgdGhlIGNvZGUgaW4gdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzIyMDAKICAgZHJpdmVyICBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uCiAKQEAgLTUzLDYgKzU2LDggQEAKICNpbmNsdWRlICJ4bWl0LmgiCiAjaW5jbHVkZSAibG8uaCIKICNpbmNsdWRlICJwY21jaWEuaCIKKyNpbmNsdWRlICJzZGlvLmgiCisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkJyb2FkY29tIEI0MyB3aXJlbGVzcyBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcnRpbiBMYW5nZXIiKTsKQEAgLTE1ODcsNyArMTU5Miw3IEBACiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAlkZXYgPSB3bC0+Y3VycmVudF9kZXY7CiAJaWYgKGxpa2VseShkZXYgJiYgKGI0M19zdGF0dXMoZGV2KSA+PSBCNDNfU1RBVF9JTklUSUFMSVpFRCkpKSB7Ci0JCWlmICgwIC8qRklYTUUgZGV2LT5kZXYtPmJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9TRElPKi8pIHsKKwkJaWYgKGRldi0+ZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfU0RJTykgewogCQkJLyogd2wtPm11dGV4IGlzIGVub3VnaC4gKi8KIAkJCWI0M19kb19iZWFjb25fdXBkYXRlX3RyaWdnZXJfd29yayhkZXYpOwogCQkJbW1pb3diKCk7CkBAIC0xODI1LDYgKzE4MzAsMTYgQEAKIAogCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBkZXZpY2UgYnkgcmVzdG9yaW5nIHRoZSBjdXJyZW50IGludGVycnVwdCBtYXNrLiAqLwogCWI0M193cml0ZTMyKGRldiwgQjQzX01NSU9fR0VOX0lSUV9NQVNLLCBkZXYtPmlycV9tYXNrKTsKKworI2lmIEI0M19ERUJVRworCWlmIChiNDNfZGVidWcoZGV2LCBCNDNfREJHX1ZFUkJPU0VTVEFUUykpIHsKKwkJZGV2LT5pcnFfY291bnQrKzsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2LT5pcnFfYml0X2NvdW50KTsgaSsrKSB7CisJCQlpZiAocmVhc29uICYgKDEgPDwgaSkpCisJCQkJZGV2LT5pcnFfYml0X2NvdW50W2ldKys7CisJCX0KKwl9CisjZW5kaWYKIH0KIAogLyogSW50ZXJydXB0IHRocmVhZCBoYW5kbGVyLiBIYW5kbGVzIGRldmljZSBpbnRlcnJ1cHRzIGluIHRocmVhZCBjb250ZXh0LiAqLwpAQCAtMTkwNSw2ICsxOTIwLDIxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyogU0RJTyBpbnRlcnJ1cHQgaGFuZGxlci4gVGhpcyBydW5zIGluIHByb2Nlc3MgY29udGV4dC4gKi8KK3N0YXRpYyB2b2lkIGI0M19zZGlvX2ludGVycnVwdF9oYW5kbGVyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3dsICp3bCA9IGRldi0+d2w7CisJaXJxcmV0dXJuX3QgcmV0OworCisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKworCXJldCA9IGI0M19kb19pbnRlcnJ1cHQoZGV2KTsKKwlpZiAocmV0ID09IElSUV9XQUtFX1RIUkVBRCkKKwkJYjQzX2RvX2ludGVycnVwdF90aHJlYWQoZGV2KTsKKworCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKK30KKwogdm9pZCBiNDNfZG9fcmVsZWFzZV9mdyhzdHJ1Y3QgYjQzX2Zpcm13YXJlX2ZpbGUgKmZ3KQogewogCXJlbGVhc2VfZmlybXdhcmUoZnctPmRhdGEpOwpAQCAtMjY0NSw2ICsyNjc1LDIwIEBACiAJCQljZnBfcHJldGJ0dCA9IDUwOwogCX0KIAliNDNfd3JpdGUxNihkZXYsIDB4NjEyLCBjZnBfcHJldGJ0dCk7CisKKwkvKiBGSVhNRTogV2UgZG9uJ3QgY3VycmVudGx5IGltcGxlbWVudCB0aGUgUE1RIG1lY2hhbmlzbSwKKwkgKiAgICAgICAgc28gYWx3YXlzIGRpc2FibGUgaXQuIElmIHdlIHdhbnQgdG8gaW1wbGVtZW50IFBNUSwKKwkgKiAgICAgICAgd2UgbmVlZCB0byBlbmFibGUgaXQgaGVyZSAoY2xlYXIgRElTQ1BNUSkgaW4gQVAgbW9kZS4KKwkgKi8KKwlpZiAoMCAgLyogY3RsICYgQjQzX01BQ0NUTF9BUCAqLykgeworCQliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX01BQ0NUTCwKKwkJCSAgICBiNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKQorCQkJICAgICYgfkI0M19NQUNDVExfRElTQ1BNUSk7CisJfSBlbHNlIHsKKwkJYjQzX3dyaXRlMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwsCisJCQkgICAgYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCkKKwkJCSAgICB8IEI0M19NQUNDVExfRElTQ1BNUSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBiNDNfcmF0ZV9tZW1vcnlfd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgcmF0ZSwgaW50IGlzX29mZG0pCkBAIC0yODczLDYgKzI5MTcsMjcgQEAKIAogCWF0b21pY19zZXQoJnBoeS0+dHhlcnJfY250LCBCNDNfUEhZX1RYX0JBRE5FU1NfTElNSVQpOwogCXdtYigpOworCisjaWYgQjQzX0RFQlVHCisJaWYgKGI0M19kZWJ1ZyhkZXYsIEI0M19EQkdfVkVSQk9TRVNUQVRTKSkgeworCQl1bnNpZ25lZCBpbnQgaTsKKworCQliNDNkYmcoZGV2LT53bCwgIlN0YXRzOiAlN3UgSVJRcy9zZWMsICU3dSBUWC9zZWMsICU3dSBSWC9zZWNcbiIsCisJCSAgICAgICBkZXYtPmlycV9jb3VudCAvIDE1LAorCQkgICAgICAgZGV2LT50eF9jb3VudCAvIDE1LAorCQkgICAgICAgZGV2LT5yeF9jb3VudCAvIDE1KTsKKwkJZGV2LT5pcnFfY291bnQgPSAwOworCQlkZXYtPnR4X2NvdW50ID0gMDsKKwkJZGV2LT5yeF9jb3VudCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldi0+aXJxX2JpdF9jb3VudCk7IGkrKykgeworCQkJaWYgKGRldi0+aXJxX2JpdF9jb3VudFtpXSkgeworCQkJCWI0M2RiZyhkZXYtPndsLCAiU3RhdHM6ICU3dSBJUlEtJTAydS9zZWMgKDB4JTA4WClcbiIsCisJCQkJICAgICAgIGRldi0+aXJxX2JpdF9jb3VudFtpXSAvIDE1LCBpLCAoMSA8PCBpKSk7CisJCQkJZGV2LT5pcnFfYml0X2NvdW50W2ldID0gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBkb19wZXJpb2RpY193b3JrKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKQEAgLTMwMDIsMTQgKzMwNjcsMTggQEAKIHN0YXRpYyBpbnQgYjQzX3JuZ19yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB1MzIgKmRhdGEpCiB7CiAJc3RydWN0IGI0M193bCAqd2wgPSAoc3RydWN0IGI0M193bCAqKXJuZy0+cHJpdjsKKwlzdHJ1Y3QgYjQzX3dsZGV2ICpkZXY7CisJaW50IGNvdW50ID0gLUVOT0RFVjsKIAotCS8qIEZJWE1FOiBXZSBuZWVkIHRvIHRha2Ugd2wtPm11dGV4IGhlcmUgdG8gbWFrZSBzdXJlIHRoZSBkZXZpY2UKLQkgKiBpcyBub3QgZ29pbmcgYXdheSBmcm9tIHVuZGVyIG91ciBhc3MuIEhvd2V2ZXIgaXQgY291bGQgZGVhZGxvY2sKLQkgKiB3aXRoIGh3cm5nIGludGVybmFsIGxvY2tpbmcuICovCisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKwlkZXYgPSB3bC0+Y3VycmVudF9kZXY7CisJaWYgKGxpa2VseShkZXYgJiYgYjQzX3N0YXR1cyhkZXYpID49IEI0M19TVEFUX0lOSVRJQUxJWkVEKSkgeworCQkqZGF0YSA9IGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19STkcpOworCQljb3VudCA9IHNpemVvZih1MTYpOworCX0KKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiAKLQkqZGF0YSA9IGI0M19yZWFkMTYod2wtPmN1cnJlbnRfZGV2LCBCNDNfTU1JT19STkcpOwotCi0JcmV0dXJuIChzaXplb2YodTE2KSk7CisJcmV0dXJuIGNvdW50OwogfQogI2VuZGlmIC8qIENPTkZJR19CNDNfSFdSTkcgKi8KIApAQCAtMzA2OCw2ICszMTM3LDkgQEAKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsgLyogRHJvcCBpdCAqLwogCX0KIAorI2lmIEI0M19ERUJVRworCWRldi0+dHhfY291bnQrKzsKKyNlbmRpZgogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIH0KIApAQCAtMzgwMiw2ICszODc0LDcgQEAKIHsKIAlzdHJ1Y3QgYjQzX3dsICp3bCA9IGRldi0+d2w7CiAJc3RydWN0IGI0M193bGRldiAqb3JpZ19kZXY7CisJdTMyIG1hc2s7CiAKIHJlZG86CiAJaWYgKCFkZXYgfHwgYjQzX3N0YXR1cyhkZXYpIDwgQjQzX1NUQVRfU1RBUlRFRCkKQEAgLTM4MjAsNyArMzg5Myw3IEBACiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIGRldmljZS4gKi8KIAliNDNfc2V0X3N0YXR1cyhkZXYsIEI0M19TVEFUX0lOSVRJQUxJWkVEKTsKLQlpZiAoMCAvKkZJWE1FIGRldi0+ZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfU0RJTyovKSB7CisJaWYgKGRldi0+ZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfU0RJTykgewogCQkvKiB3bC0+bXV0ZXggaXMgbG9ja2VkLiBUaGF0IGlzIGVub3VnaC4gKi8KIAkJYjQzX3dyaXRlMzIoZGV2LCBCNDNfTU1JT19HRU5fSVJRX01BU0ssIDApOwogCQliNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fR0VOX0lSUV9NQVNLKTsJLyogRmx1c2ggKi8KQEAgLTM4MzAsMTAgKzM5MDMsMTUgQEAKIAkJYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX0dFTl9JUlFfTUFTSyk7CS8qIEZsdXNoICovCiAJCXNwaW5fdW5sb2NrX2lycSgmd2wtPmhhcmRpcnFfbG9jayk7CiAJfQotCS8qIFN5bmNocm9uaXplIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMuIFVubG9jayB0byBhdm9pZCBkZWFkbG9ja3MuICovCisJLyogU3luY2hyb25pemUgYW5kIGZyZWUgdGhlIGludGVycnVwdCBoYW5kbGVycy4gVW5sb2NrIHRvIGF2b2lkIGRlYWRsb2Nrcy4gKi8KIAlvcmlnX2RldiA9IGRldjsKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7Ci0Jc3luY2hyb25pemVfaXJxKGRldi0+ZGV2LT5pcnEpOworCWlmIChkZXYtPmRldi0+YnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1NESU8pIHsKKwkJYjQzX3NkaW9fZnJlZV9pcnEoZGV2KTsKKwl9IGVsc2UgeworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5kZXYtPmlycSk7CisJCWZyZWVfaXJxKGRldi0+ZGV2LT5pcnEsIGRldik7CisJfQogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAJZGV2ID0gd2wtPmN1cnJlbnRfZGV2OwogCWlmICghZGV2KQpAQCAtMzg0MywxNCArMzkyMSwxNSBAQAogCQkJZ290byByZWRvOwogCQlyZXR1cm4gZGV2OwogCX0KLQlCNDNfV0FSTl9PTihiNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fR0VOX0lSUV9NQVNLKSk7CisJbWFzayA9IGI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19HRU5fSVJRX01BU0spOworCUI0M19XQVJOX09OKG1hc2sgIT0gMHhGRkZGRkZGRiAmJiBtYXNrKTsKIAogCS8qIERyYWluIHRoZSBUWCBxdWV1ZSAqLwogCXdoaWxlIChza2JfcXVldWVfbGVuKCZ3bC0+dHhfcXVldWUpKQogCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWUpKTsKIAogCWI0M19tYWNfc3VzcGVuZChkZXYpOwotCWZyZWVfaXJxKGRldi0+ZGV2LT5pcnEsIGRldik7CisJYjQzX2xlZHNfZXhpdChkZXYpOwogCWI0M2RiZyh3bCwgIldpcmVsZXNzIGludGVyZmFjZSBzdG9wcGVkXG4iKTsKIAogCXJldHVybiBkZXY7CkBAIC0zODY0LDEyICszOTQzLDIwIEBACiAJQjQzX1dBUk5fT04oYjQzX3N0YXR1cyhkZXYpICE9IEI0M19TVEFUX0lOSVRJQUxJWkVEKTsKIAogCWRyYWluX3R4c3RhdHVzX3F1ZXVlKGRldik7Ci0JZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LT5kZXYtPmlycSwgYjQzX2ludGVycnVwdF9oYW5kbGVyLAotCQkJCSAgIGI0M19pbnRlcnJ1cHRfdGhyZWFkX2hhbmRsZXIsCi0JCQkJICAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBkZXYpOwotCWlmIChlcnIpIHsKLQkJYjQzZXJyKGRldi0+d2wsICJDYW5ub3QgcmVxdWVzdCBJUlEtJWRcbiIsIGRldi0+ZGV2LT5pcnEpOwotCQlnb3RvIG91dDsKKwlpZiAoZGV2LT5kZXYtPmJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9TRElPKSB7CisJCWVyciA9IGI0M19zZGlvX3JlcXVlc3RfaXJxKGRldiwgYjQzX3NkaW9faW50ZXJydXB0X2hhbmRsZXIpOworCQlpZiAoZXJyKSB7CisJCQliNDNlcnIoZGV2LT53bCwgIkNhbm5vdCByZXF1ZXN0IFNESU8gSVJRXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LT5kZXYtPmlycSwgYjQzX2ludGVycnVwdF9oYW5kbGVyLAorCQkJCQkgICBiNDNfaW50ZXJydXB0X3RocmVhZF9oYW5kbGVyLAorCQkJCQkgICBJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGRldik7CisJCWlmIChlcnIpIHsKKwkJCWI0M2VycihkZXYtPndsLCAiQ2Fubm90IHJlcXVlc3QgSVJRLSVkXG4iLCBkZXYtPmRldi0+aXJxKTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJLyogV2UgYXJlIHJlYWR5IHRvIHJ1bi4gKi8KQEAgLTM4ODIsOCArMzk2OSwxMCBAQAogCS8qIFN0YXJ0IG1haW50YWluYW5jZSB3b3JrICovCiAJYjQzX3BlcmlvZGljX3Rhc2tzX3NldHVwKGRldik7CiAKKwliNDNfbGVkc19pbml0KGRldik7CisKIAliNDNkYmcoZGV2LT53bCwgIldpcmVsZXNzIGludGVyZmFjZSBzdGFydGVkXG4iKTsKLSAgICAgIG91dDoKK291dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00MTYwLDEwICs0MjQ5LDYgQEAKIAltYWNjdGwgfD0gQjQzX01BQ0NUTF9QU01fSk1QMDsKIAliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX01BQ0NUTCwgbWFjY3RsKTsKIAotCWlmICghZGV2LT5zdXNwZW5kX2luX3Byb2dyZXNzKSB7Ci0JCWI0M19sZWRzX2V4aXQoZGV2KTsKLQkJYjQzX3JuZ19leGl0KGRldi0+d2wpOwotCX0KIAliNDNfZG1hX2ZyZWUoZGV2KTsKIAliNDNfcGlvX2ZyZWUoZGV2KTsKIAliNDNfY2hpcF9leGl0KGRldik7CkBAIC00MTgwLDcgKzQyNjUsNiBAQAogLyogSW5pdGlhbGl6ZSBhIHdpcmVsZXNzIGNvcmUgKi8KIHN0YXRpYyBpbnQgYjQzX3dpcmVsZXNzX2NvcmVfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGI0M193bCAqd2wgPSBkZXYtPndsOwogCXN0cnVjdCBzc2JfYnVzICpidXMgPSBkZXYtPmRldi0+YnVzOwogCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gJmJ1cy0+c3Byb207CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKQEAgLTQyNjQsNyArNDM0OCw5IEBACiAJLyogTWF4aW11bSBDb250ZW50aW9uIFdpbmRvdyAqLwogCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0NSQVRDSCwgQjQzX1NITV9TQ19NQVhDT05ULCAweDNGRik7CiAKLQlpZiAoKGRldi0+ZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfUENNQ0lBKSB8fCBCNDNfRk9SQ0VfUElPKSB7CisJaWYgKChkZXYtPmRldi0+YnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDTUNJQSkgfHwKKwkgICAgKGRldi0+ZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfU0RJTykgfHwKKwkgICAgQjQzX0ZPUkNFX1BJTykgewogCQlkZXYtPl9fdXNpbmdfcGlvX3RyYW5zZmVycyA9IDE7CiAJCWVyciA9IGI0M19waW9faW5pdChkZXYpOwogCX0gZWxzZSB7CkBAIC00MjgwLDE1ICs0MzY2LDEzIEBACiAJc3NiX2J1c19wb3dlcnVwKGJ1cywgIShzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfWFRBTF9OT1NMT1cpKTsKIAliNDNfdXBsb2FkX2NhcmRfbWFjYWRkcmVzcyhkZXYpOwogCWI0M19zZWN1cml0eV9pbml0KGRldik7Ci0JaWYgKCFkZXYtPnN1c3BlbmRfaW5fcHJvZ3Jlc3MpCi0JCWI0M19ybmdfaW5pdCh3bCk7CisKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoZGV2LT53bC0+aHcpOwogCiAJaWVlZTgwMjExX3dha2VfcXVldWVzKGRldi0+d2wtPmh3KTsKIAogCWI0M19zZXRfc3RhdHVzKGRldiwgQjQzX1NUQVRfSU5JVElBTElaRUQpOwogCi0JaWYgKCFkZXYtPnN1c3BlbmRfaW5fcHJvZ3Jlc3MpCi0JCWI0M19sZWRzX2luaXQoZGV2KTsKIG91dDoKIAlyZXR1cm4gZXJyOwogCkBAIC00ODM3LDcgKzQ5MjEsNiBAQAogCiAJLyogSW5pdGlhbGl6ZSBzdHJ1Y3QgYjQzX3dsICovCiAJd2wtPmh3ID0gaHc7Ci0Jc3Bpbl9sb2NrX2luaXQoJndsLT5sZWRzX2xvY2spOwogCW11dGV4X2luaXQoJndsLT5tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJndsLT5oYXJkaXJxX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZ3bC0+ZGV2bGlzdCk7CkBAIC00ODc4LDYgKzQ5NjEsOCBAQAogCQllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcod2wtPmh3KTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyX29uZV9jb3JlX2RldGFjaDsKKwkJYjQzX2xlZHNfcmVnaXN0ZXIod2wtPmN1cnJlbnRfZGV2KTsKKwkJYjQzX3JuZ19pbml0KHdsKTsKIAl9CiAKICAgICAgIG91dDoKQEAgLTQ5MDYsMTIgKzQ5OTEsMTUgQEAKIAkJICogbWlnaHQgaGF2ZSBtb2RpZmllZCBpdC4gUmVzdG9yaW5nIGlzIGltcG9ydGFudCwgc28gdGhlIG5ldHdvcmtpbmcKIAkJICogc3RhY2sgY2FuIHByb3Blcmx5IGZyZWUgcmVzb3VyY2VzLiAqLwogCQl3bC0+aHctPnF1ZXVlcyA9IHdsLT5tYWM4MDIxMV9pbml0aWFsbHlfcmVnaXN0ZXJlZF9xdWV1ZXM7CisJCWI0M19sZWRzX3N0b3Aod2xkZXYpOwogCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyh3bC0+aHcpOwogCX0KIAogCWI0M19vbmVfY29yZV9kZXRhY2goZGV2KTsKIAogCWlmIChsaXN0X2VtcHR5KCZ3bC0+ZGV2bGlzdCkpIHsKKwkJYjQzX3JuZ19leGl0KHdsKTsKKwkJYjQzX2xlZHNfdW5yZWdpc3Rlcih3bCk7CiAJCS8qIExhc3QgY29yZSBvbiB0aGUgY2hpcCB1bnJlZ2lzdGVyZWQuCiAJCSAqIFdlIGNhbiBkZXN0cm95IGNvbW1vbiBzdHJ1Y3QgYjQzX3dsLgogCQkgKi8KQEAgLTQ5MjksODAgKzUwMTcsMTcgQEAKIAlpZWVlODAyMTFfcXVldWVfd29yayhkZXYtPndsLT5odywgJmRldi0+cmVzdGFydF93b3JrKTsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgaW50IGI0M19zdXNwZW5kKHN0cnVjdCBzc2JfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgYjQzX3dsZGV2ICp3bGRldiA9IHNzYl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBiNDNfd2wgKndsID0gd2xkZXYtPndsOwotCi0JYjQzZGJnKHdsLCAiU3VzcGVuZGluZy4uLlxuIik7Ci0KLQltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwotCXdsZGV2LT5zdXNwZW5kX2luX3Byb2dyZXNzID0gdHJ1ZTsKLQl3bGRldi0+c3VzcGVuZF9pbml0X3N0YXR1cyA9IGI0M19zdGF0dXMod2xkZXYpOwotCWlmICh3bGRldi0+c3VzcGVuZF9pbml0X3N0YXR1cyA+PSBCNDNfU1RBVF9TVEFSVEVEKQotCQl3bGRldiA9IGI0M193aXJlbGVzc19jb3JlX3N0b3Aod2xkZXYpOwotCWlmICh3bGRldiAmJiB3bGRldi0+c3VzcGVuZF9pbml0X3N0YXR1cyA+PSBCNDNfU1RBVF9JTklUSUFMSVpFRCkKLQkJYjQzX3dpcmVsZXNzX2NvcmVfZXhpdCh3bGRldik7Ci0JbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwotCi0JYjQzZGJnKHdsLCAiRGV2aWNlIHN1c3BlbmRlZC5cbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYjQzX3Jlc3VtZShzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBiNDNfd2xkZXYgKndsZGV2ID0gc3NiX2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGI0M193bCAqd2wgPSB3bGRldi0+d2w7Ci0JaW50IGVyciA9IDA7Ci0KLQliNDNkYmcod2wsICJSZXN1bWluZy4uLlxuIik7Ci0KLQltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwotCWlmICh3bGRldi0+c3VzcGVuZF9pbml0X3N0YXR1cyA+PSBCNDNfU1RBVF9JTklUSUFMSVpFRCkgewotCQllcnIgPSBiNDNfd2lyZWxlc3NfY29yZV9pbml0KHdsZGV2KTsKLQkJaWYgKGVycikgewotCQkJYjQzZXJyKHdsLCAiUmVzdW1lIGZhaWxlZCBhdCBjb3JlIGluaXRcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JaWYgKHdsZGV2LT5zdXNwZW5kX2luaXRfc3RhdHVzID49IEI0M19TVEFUX1NUQVJURUQpIHsKLQkJZXJyID0gYjQzX3dpcmVsZXNzX2NvcmVfc3RhcnQod2xkZXYpOwotCQlpZiAoZXJyKSB7Ci0JCQliNDNfbGVkc19leGl0KHdsZGV2KTsKLQkJCWI0M19ybmdfZXhpdCh3bGRldi0+d2wpOwotCQkJYjQzX3dpcmVsZXNzX2NvcmVfZXhpdCh3bGRldik7Ci0JCQliNDNlcnIod2wsICJSZXN1bWUgZmFpbGVkIGF0IGNvcmUgc3RhcnRcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JYjQzZGJnKHdsLCAiRGV2aWNlIHJlc3VtZWQuXG4iKTsKLSBvdXQ6Ci0Jd2xkZXYtPnN1c3BlbmRfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQltdXRleF91bmxvY2soJndsLT5tdXRleCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotI2Vsc2UgLyogQ09ORklHX1BNICovCi0jIGRlZmluZSBiNDNfc3VzcGVuZAlOVUxMCi0jIGRlZmluZSBiNDNfcmVzdW1lCU5VTEwKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQogc3RhdGljIHN0cnVjdCBzc2JfZHJpdmVyIGI0M19zc2JfZHJpdmVyID0gewogCS5uYW1lCQk9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZQk9IGI0M19zc2JfdGJsLAogCS5wcm9iZQkJPSBiNDNfcHJvYmUsCiAJLnJlbW92ZQkJPSBiNDNfcmVtb3ZlLAotCS5zdXNwZW5kCT0gYjQzX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBiNDNfcmVzdW1lLAogfTsKIAogc3RhdGljIHZvaWQgYjQzX3ByaW50X2RyaXZlcmluZm8odm9pZCkKIHsKIAljb25zdCBjaGFyICpmZWF0X3BjaSA9ICIiLCAqZmVhdF9wY21jaWEgPSAiIiwgKmZlYXRfbnBoeSA9ICIiLAotCQkgICAqZmVhdF9sZWRzID0gIiI7CisJCSAgICpmZWF0X2xlZHMgPSAiIiwgKmZlYXRfc2RpbyA9ICIiOwogCiAjaWZkZWYgQ09ORklHX0I0M19QQ0lfQVVUT1NFTEVDVAogCWZlYXRfcGNpID0gIlAiOwpAQCAtNTAxNiwxMSArNTA0MSwxNCBAQAogI2lmZGVmIENPTkZJR19CNDNfTEVEUwogCWZlYXRfbGVkcyA9ICJMIjsKICNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU0RJTworCWZlYXRfc2RpbyA9ICJTIjsKKyNlbmRpZgogCXByaW50ayhLRVJOX0lORk8gIkJyb2FkY29tIDQzeHggZHJpdmVyIGxvYWRlZCAiCi0JICAgICAgICJbIEZlYXR1cmVzOiAlcyVzJXMlcywgRmlybXdhcmUtSUQ6ICIKKwkgICAgICAgIlsgRmVhdHVyZXM6ICVzJXMlcyVzJXMsIEZpcm13YXJlLUlEOiAiCiAJICAgICAgIEI0M19TVVBQT1JURURfRklSTVdBUkVfSUQgIiBdXG4iLAogCSAgICAgICBmZWF0X3BjaSwgZmVhdF9wY21jaWEsIGZlYXRfbnBoeSwKLQkgICAgICAgZmVhdF9sZWRzKTsKKwkgICAgICAgZmVhdF9sZWRzLCBmZWF0X3NkaW8pOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBiNDNfaW5pdCh2b2lkKQpAQCAtNTAzMSwxMyArNTA1OSwxOCBAQAogCWVyciA9IGI0M19wY21jaWFfaW5pdCgpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2Rmc19leGl0OwotCWVyciA9IHNzYl9kcml2ZXJfcmVnaXN0ZXIoJmI0M19zc2JfZHJpdmVyKTsKKwllcnIgPSBiNDNfc2Rpb19pbml0KCk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfcGNtY2lhX2V4aXQ7CisJZXJyID0gc3NiX2RyaXZlcl9yZWdpc3RlcigmYjQzX3NzYl9kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3NkaW9fZXhpdDsKIAliNDNfcHJpbnRfZHJpdmVyaW5mbygpOwogCiAJcmV0dXJuIGVycjsKIAorZXJyX3NkaW9fZXhpdDoKKwliNDNfc2Rpb19leGl0KCk7CiBlcnJfcGNtY2lhX2V4aXQ6CiAJYjQzX3BjbWNpYV9leGl0KCk7CiBlcnJfZGZzX2V4aXQ6CkBAIC01MDQ4LDYgKzUwODEsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGI0M19leGl0KHZvaWQpCiB7CiAJc3NiX2RyaXZlcl91bnJlZ2lzdGVyKCZiNDNfc3NiX2RyaXZlcik7CisJYjQzX3NkaW9fZXhpdCgpOwogCWI0M19wY21jaWFfZXhpdCgpOwogCWI0M19kZWJ1Z2ZzX2V4aXQoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuYwppbmRleCAzZTAyZDk2Li4xZTMxOGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2xwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9scC5jCkBAIC0yMjI4LDYgKzIyMjgsMTYgQEAKIAlyZXR1cm4gQjQzX1RYUFdSX1JFU19ET05FOwogfQogCit2b2lkIGI0M19scHBoeV9vcF9zd2l0Y2hfYW5hbG9nKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBvbikKK3sKKyAgICAgICBpZiAob24pIHsKKyAgICAgICAgICAgICAgIGI0M19waHlfbWFzayhkZXYsIEI0M19MUFBIWV9BRkVfQ1RMX09WUiwgMHhmZmY4KTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgYjQzX3BoeV9zZXQoZGV2LCBCNDNfTFBQSFlfQUZFX0NUTF9PVlJWQUwsIDB4MDAwNyk7CisgICAgICAgICAgICAgICBiNDNfcGh5X3NldChkZXYsIEI0M19MUFBIWV9BRkVfQ1RMX09WUiwgMHgwMDA3KTsKKyAgICAgICB9Cit9CisKIGNvbnN0IHN0cnVjdCBiNDNfcGh5X29wZXJhdGlvbnMgYjQzX3BoeW9wc19scCA9IHsKIAkuYWxsb2NhdGUJCT0gYjQzX2xwcGh5X29wX2FsbG9jYXRlLAogCS5mcmVlCQkJPSBiNDNfbHBwaHlfb3BfZnJlZSwKQEAgLTIyMzksNyArMjI0OSw3IEBACiAJLnJhZGlvX3JlYWQJCT0gYjQzX2xwcGh5X29wX3JhZGlvX3JlYWQsCiAJLnJhZGlvX3dyaXRlCQk9IGI0M19scHBoeV9vcF9yYWRpb193cml0ZSwKIAkuc29mdHdhcmVfcmZraWxsCT0gYjQzX2xwcGh5X29wX3NvZnR3YXJlX3Jma2lsbCwKLQkuc3dpdGNoX2FuYWxvZwkJPSBiNDNfcGh5b3Bfc3dpdGNoX2FuYWxvZ19nZW5lcmljLAorCS5zd2l0Y2hfYW5hbG9nCQk9IGI0M19scHBoeV9vcF9zd2l0Y2hfYW5hbG9nLAogCS5zd2l0Y2hfY2hhbm5lbAkJPSBiNDNfbHBwaHlfb3Bfc3dpdGNoX2NoYW5uZWwsCiAJLmdldF9kZWZhdWx0X2NoYW4JPSBiNDNfbHBwaHlfb3BfZ2V0X2RlZmF1bHRfY2hhbiwKIAkuc2V0X3J4X2FudGVubmEJCT0gYjQzX2xwcGh5X29wX3NldF9yeF9hbnRlbm5hLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3Bpby5jCmluZGV4IDM0OThiNjguLjliOTA0NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGlvLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJ4bWl0LmgiCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKIAogc3RhdGljIHUxNiBnZW5lcmF0ZV9jb29raWUoc3RydWN0IGI0M19waW9fdHhxdWV1ZSAqcSwKQEAgLTMzMSw2ICszMzIsNyBAQAogCQkJCXVuc2lnbmVkIGludCBkYXRhX2xlbikKIHsKIAlzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYgPSBxLT5kZXY7CisJc3RydWN0IGI0M193bCAqd2wgPSBkZXYtPndsOwogCWNvbnN0IHU4ICpkYXRhID0gX2RhdGE7CiAKIAljdGwgfD0gQjQzX1BJT19UWENUTF9XUklURUxPIHwgQjQzX1BJT19UWENUTF9XUklURUhJOwpAQCAtMzQzLDcgKzM0NSwxMSBAQAogCQkvKiBXcml0ZSB0aGUgbGFzdCBieXRlLiAqLwogCQljdGwgJj0gfkI0M19QSU9fVFhDVExfV1JJVEVISTsKIAkJYjQzX3Bpb3R4X3dyaXRlMTYocSwgQjQzX1BJT19UWENUTCwgY3RsKTsKLQkJYjQzX3Bpb3R4X3dyaXRlMTYocSwgQjQzX1BJT19UWERBVEEsIGRhdGFbZGF0YV9sZW4gLSAxXSk7CisJCXdsLT50eF90YWlsWzBdID0gZGF0YVtkYXRhX2xlbiAtIDFdOworCQl3bC0+dHhfdGFpbFsxXSA9IDA7CisJCXNzYl9ibG9ja193cml0ZShkZXYtPmRldiwgd2wtPnR4X3RhaWwsIDIsCisJCQkJcS0+bW1pb19iYXNlICsgQjQzX1BJT19UWERBVEEsCisJCQkJc2l6ZW9mKHUxNikpOwogCX0KIAogCXJldHVybiBjdGw7CkBAIC0zNzYsNiArMzgyLDcgQEAKIAkJCQl1bnNpZ25lZCBpbnQgZGF0YV9sZW4pCiB7CiAJc3RydWN0IGI0M193bGRldiAqZGV2ID0gcS0+ZGV2OworCXN0cnVjdCBiNDNfd2wgKndsID0gZGV2LT53bDsKIAljb25zdCB1OCAqZGF0YSA9IF9kYXRhOwogCiAJY3RsIHw9IEI0M19QSU84X1RYQ1RMXzBfNyB8IEI0M19QSU84X1RYQ1RMXzhfMTUgfApAQCAtMzg2LDI2ICszOTMsMzMgQEAKIAkJCXEtPm1taW9fYmFzZSArIEI0M19QSU84X1RYREFUQSwKIAkJCXNpemVvZih1MzIpKTsKIAlpZiAoZGF0YV9sZW4gJiAzKSB7Ci0JCXUzMiB2YWx1ZSA9IDA7Ci0KKwkJd2wtPnR4X3RhaWxbM10gPSAwOwogCQkvKiBXcml0ZSB0aGUgbGFzdCBmZXcgYnl0ZXMuICovCiAJCWN0bCAmPSB+KEI0M19QSU84X1RYQ1RMXzhfMTUgfCBCNDNfUElPOF9UWENUTF8xNl8yMyB8CiAJCQkgQjQzX1BJTzhfVFhDVExfMjRfMzEpOwotCQlkYXRhID0gJihkYXRhW2RhdGFfbGVuIC0gMV0pOwogCQlzd2l0Y2ggKGRhdGFfbGVuICYgMykgewogCQljYXNlIDM6Ci0JCQljdGwgfD0gQjQzX1BJTzhfVFhDVExfMTZfMjM7Ci0JCQl2YWx1ZSB8PSAodTMyKSgqZGF0YSkgPDwgMTY7Ci0JCQlkYXRhLS07CisJCQljdGwgfD0gQjQzX1BJTzhfVFhDVExfMTZfMjMgfCBCNDNfUElPOF9UWENUTF84XzE1OworCQkJd2wtPnR4X3RhaWxbMF0gPSBkYXRhW2RhdGFfbGVuIC0gM107CisJCQl3bC0+dHhfdGFpbFsxXSA9IGRhdGFbZGF0YV9sZW4gLSAyXTsKKwkJCXdsLT50eF90YWlsWzJdID0gZGF0YVtkYXRhX2xlbiAtIDFdOworCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAkJCWN0bCB8PSBCNDNfUElPOF9UWENUTF84XzE1OwotCQkJdmFsdWUgfD0gKHUzMikoKmRhdGEpIDw8IDg7Ci0JCQlkYXRhLS07CisJCQl3bC0+dHhfdGFpbFswXSA9IGRhdGFbZGF0YV9sZW4gLSAyXTsKKwkJCXdsLT50eF90YWlsWzFdID0gZGF0YVtkYXRhX2xlbiAtIDFdOworCQkJd2wtPnR4X3RhaWxbMl0gPSAwOworCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCXZhbHVlIHw9ICh1MzIpKCpkYXRhKTsKKwkJCXdsLT50eF90YWlsWzBdID0gZGF0YVtkYXRhX2xlbiAtIDFdOworCQkJd2wtPnR4X3RhaWxbMV0gPSAwOworCQkJd2wtPnR4X3RhaWxbMl0gPSAwOworCQkJYnJlYWs7CiAJCX0KIAkJYjQzX3Bpb3R4X3dyaXRlMzIocSwgQjQzX1BJTzhfVFhDVEwsIGN0bCk7Ci0JCWI0M19waW90eF93cml0ZTMyKHEsIEI0M19QSU84X1RYREFUQSwgdmFsdWUpOworCQlzc2JfYmxvY2tfd3JpdGUoZGV2LT5kZXYsIHdsLT50eF90YWlsLCA0LAorCQkJCXEtPm1taW9fYmFzZSArIEI0M19QSU84X1RYREFUQSwKKwkJCQlzaXplb2YodTMyKSk7CiAJfQogCiAJcmV0dXJuIGN0bDsKQEAgLTQzNSw4ICs0NDksOSBAQAogc3RhdGljIGludCBwaW9fdHhfZnJhbWUoc3RydWN0IGI0M19waW9fdHhxdWV1ZSAqcSwKIAkJCXN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IGI0M193bGRldiAqZGV2ID0gcS0+ZGV2OworCXN0cnVjdCBiNDNfd2wgKndsID0gZGV2LT53bDsKIAlzdHJ1Y3QgYjQzX3Bpb190eHBhY2tldCAqcGFjazsKLQlzdHJ1Y3QgYjQzX3R4aGRyIHR4aGRyOwogCXUxNiBjb29raWU7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgaGRybGVuOwpAQCAtNDQ3LDggKzQ2Miw4IEBACiAJCQkgIHN0cnVjdCBiNDNfcGlvX3R4cGFja2V0LCBsaXN0KTsKIAogCWNvb2tpZSA9IGdlbmVyYXRlX2Nvb2tpZShxLCBwYWNrKTsKLQloZHJsZW4gPSBiNDNfdHhoZHJfc2l6ZShxLT5kZXYpOwotCWVyciA9IGI0M19nZW5lcmF0ZV90eGhkcihxLT5kZXYsICh1OCAqKSZ0eGhkciwgc2tiLAorCWhkcmxlbiA9IGI0M190eGhkcl9zaXplKGRldik7CisJZXJyID0gYjQzX2dlbmVyYXRlX3R4aGRyKGRldiwgKHU4ICopJndsLT50eGhkciwgc2tiLAogCQkJCSBpbmZvLCBjb29raWUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC00NTYsMTUgKzQ3MSwxNSBAQAogCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfU0VORF9BRlRFUl9EVElNKSB7CiAJCS8qIFRlbGwgdGhlIGZpcm13YXJlIGFib3V0IHRoZSBjb29raWUgb2YgdGhlIGxhc3QKIAkJICogbWNhc3QgZnJhbWUsIHNvIGl0IGNhbiBjbGVhciB0aGUgbW9yZS1kYXRhIGJpdCBpbiBpdC4gKi8KLQkJYjQzX3NobV93cml0ZTE2KHEtPmRldiwgQjQzX1NITV9TSEFSRUQsCisJCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELAogCQkJCUI0M19TSE1fU0hfTUNBU1RDT09LSUUsIGNvb2tpZSk7CiAJfQogCiAJcGFjay0+c2tiID0gc2tiOwogCWlmIChxLT5yZXYgPj0gOCkKLQkJcGlvX3R4X2ZyYW1lXzRieXRlX3F1ZXVlKHBhY2ssIChjb25zdCB1OCAqKSZ0eGhkciwgaGRybGVuKTsKKwkJcGlvX3R4X2ZyYW1lXzRieXRlX3F1ZXVlKHBhY2ssIChjb25zdCB1OCAqKSZ3bC0+dHhoZHIsIGhkcmxlbik7CiAJZWxzZQotCQlwaW9fdHhfZnJhbWVfMmJ5dGVfcXVldWUocGFjaywgKGNvbnN0IHU4ICopJnR4aGRyLCBoZHJsZW4pOworCQlwaW9fdHhfZnJhbWVfMmJ5dGVfcXVldWUocGFjaywgKGNvbnN0IHU4ICopJndsLT50eGhkciwgaGRybGVuKTsKIAogCS8qIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBwYWNrZXQgc2xvdHMuCiAJICogSXQgd2lsbCBiZSBwdXQgYmFjayB3aGVuIHdlIHJlY2VpdmUgdGhlIHN0YXR1cyByZXBvcnQuICovCkBAIC01NzQsNyArNTg5LDcgQEAKIAlxLT5idWZmZXJfdXNlZCAtPSB0b3RhbF9sZW47CiAJcS0+ZnJlZV9wYWNrZXRfc2xvdHMgKz0gMTsKIAotCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShkZXYtPndsLT5odywgcGFjay0+c2tiKTsKKwlpZWVlODAyMTFfdHhfc3RhdHVzKGRldi0+d2wtPmh3LCBwYWNrLT5za2IpOwogCXBhY2stPnNrYiA9IE5VTEw7CiAJbGlzdF9hZGQoJnBhY2stPmxpc3QsICZxLT5wYWNrZXRzX2xpc3QpOwogCkBAIC02MDQsMTQgKzYxOSwxNCBAQAogc3RhdGljIGJvb2wgcGlvX3J4X2ZyYW1lKHN0cnVjdCBiNDNfcGlvX3J4cXVldWUgKnEpCiB7CiAJc3RydWN0IGI0M193bGRldiAqZGV2ID0gcS0+ZGV2OwotCXN0cnVjdCBiNDNfcnhoZHJfZnc0IHJ4aGRyOworCXN0cnVjdCBiNDNfd2wgKndsID0gZGV2LT53bDsKIAl1MTYgbGVuOwogCXUzMiBtYWNzdGF0OwogCXVuc2lnbmVkIGludCBpLCBwYWRkaW5nOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJY29uc3QgY2hhciAqZXJyX21zZyA9IE5VTEw7CiAKLQltZW1zZXQoJnJ4aGRyLCAwLCBzaXplb2YocnhoZHIpKTsKKwltZW1zZXQoJndsLT5yeGhkciwgMCwgc2l6ZW9mKHdsLT5yeGhkcikpOwogCiAJLyogQ2hlY2sgaWYgd2UgaGF2ZSBkYXRhIGFuZCB3YWl0IGZvciBpdCB0byBnZXQgcmVhZHkuICovCiAJaWYgKHEtPnJldiA+PSA4KSB7CkBAIC02NDksMTYgKzY2NCwxNiBAQAogCiAJLyogR2V0IHRoZSBwcmVhbWJsZSAoUlggaGVhZGVyKSAqLwogCWlmIChxLT5yZXYgPj0gOCkgewotCQlzc2JfYmxvY2tfcmVhZChkZXYtPmRldiwgJnJ4aGRyLCBzaXplb2YocnhoZHIpLAorCQlzc2JfYmxvY2tfcmVhZChkZXYtPmRldiwgJndsLT5yeGhkciwgc2l6ZW9mKHdsLT5yeGhkciksCiAJCQkgICAgICAgcS0+bW1pb19iYXNlICsgQjQzX1BJTzhfUlhEQVRBLAogCQkJICAgICAgIHNpemVvZih1MzIpKTsKIAl9IGVsc2UgewotCQlzc2JfYmxvY2tfcmVhZChkZXYtPmRldiwgJnJ4aGRyLCBzaXplb2YocnhoZHIpLAorCQlzc2JfYmxvY2tfcmVhZChkZXYtPmRldiwgJndsLT5yeGhkciwgc2l6ZW9mKHdsLT5yeGhkciksCiAJCQkgICAgICAgcS0+bW1pb19iYXNlICsgQjQzX1BJT19SWERBVEEsCiAJCQkgICAgICAgc2l6ZW9mKHUxNikpOwogCX0KIAkvKiBTYW5pdHkgY2hlY2tzLiAqLwotCWxlbiA9IGxlMTZfdG9fY3B1KHJ4aGRyLmZyYW1lX2xlbik7CisJbGVuID0gbGUxNl90b19jcHUod2wtPnJ4aGRyLmZyYW1lX2xlbik7CiAJaWYgKHVubGlrZWx5KGxlbiA+IDB4NzAwKSkgewogCQllcnJfbXNnID0gImxlbiA+IDB4NzAwIjsKIAkJZ290byByeF9lcnJvcjsKQEAgLTY2OCw3ICs2ODMsNyBAQAogCQlnb3RvIHJ4X2Vycm9yOwogCX0KIAotCW1hY3N0YXQgPSBsZTMyX3RvX2NwdShyeGhkci5tYWNfc3RhdHVzKTsKKwltYWNzdGF0ID0gbGUzMl90b19jcHUod2wtPnJ4aGRyLm1hY19zdGF0dXMpOwogCWlmIChtYWNzdGF0ICYgQjQzX1JYX01BQ19GQ1NFUlIpIHsKIAkJaWYgKCEocS0+ZGV2LT53bC0+ZmlsdGVyX2ZsYWdzICYgRklGX0ZDU0ZBSUwpKSB7CiAJCQkvKiBEcm9wIGZyYW1lcyB3aXRoIGZhaWxlZCBGQ1MuICovCkBAIC02OTMsMjEgKzcwOCwyMyBAQAogCQkJICAgICAgIHEtPm1taW9fYmFzZSArIEI0M19QSU84X1JYREFUQSwKIAkJCSAgICAgICBzaXplb2YodTMyKSk7CiAJCWlmIChsZW4gJiAzKSB7Ci0JCQl1MzIgdmFsdWU7Ci0JCQljaGFyICpkYXRhOwotCiAJCQkvKiBSZWFkIHRoZSBsYXN0IGZldyBieXRlcy4gKi8KLQkJCXZhbHVlID0gYjQzX3Bpb3J4X3JlYWQzMihxLCBCNDNfUElPOF9SWERBVEEpOwotCQkJZGF0YSA9ICYoc2tiLT5kYXRhW2xlbiArIHBhZGRpbmcgLSAxXSk7CisJCQlzc2JfYmxvY2tfcmVhZChkZXYtPmRldiwgd2wtPnJ4X3RhaWwsIDQsCisJCQkJICAgICAgIHEtPm1taW9fYmFzZSArIEI0M19QSU84X1JYREFUQSwKKwkJCQkgICAgICAgc2l6ZW9mKHUzMikpOwogCQkJc3dpdGNoIChsZW4gJiAzKSB7CiAJCQljYXNlIDM6Ci0JCQkJKmRhdGEgPSAodmFsdWUgPj4gMTYpOwotCQkJCWRhdGEtLTsKKwkJCQlza2ItPmRhdGFbbGVuICsgcGFkZGluZyAtIDNdID0gd2wtPnJ4X3RhaWxbMF07CisJCQkJc2tiLT5kYXRhW2xlbiArIHBhZGRpbmcgLSAyXSA9IHdsLT5yeF90YWlsWzFdOworCQkJCXNrYi0+ZGF0YVtsZW4gKyBwYWRkaW5nIC0gMV0gPSB3bC0+cnhfdGFpbFsyXTsKKwkJCQlicmVhazsKIAkJCWNhc2UgMjoKLQkJCQkqZGF0YSA9ICh2YWx1ZSA+PiA4KTsKLQkJCQlkYXRhLS07CisJCQkJc2tiLT5kYXRhW2xlbiArIHBhZGRpbmcgLSAyXSA9IHdsLT5yeF90YWlsWzBdOworCQkJCXNrYi0+ZGF0YVtsZW4gKyBwYWRkaW5nIC0gMV0gPSB3bC0+cnhfdGFpbFsxXTsKKwkJCQlicmVhazsKIAkJCWNhc2UgMToKLQkJCQkqZGF0YSA9IHZhbHVlOworCQkJCXNrYi0+ZGF0YVtsZW4gKyBwYWRkaW5nIC0gMV0gPSB3bC0+cnhfdGFpbFswXTsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CkBAIC03MTUsMTUgKzczMiwxNSBAQAogCQkJICAgICAgIHEtPm1taW9fYmFzZSArIEI0M19QSU9fUlhEQVRBLAogCQkJICAgICAgIHNpemVvZih1MTYpKTsKIAkJaWYgKGxlbiAmIDEpIHsKLQkJCXUxNiB2YWx1ZTsKLQogCQkJLyogUmVhZCB0aGUgbGFzdCBieXRlLiAqLwotCQkJdmFsdWUgPSBiNDNfcGlvcnhfcmVhZDE2KHEsIEI0M19QSU9fUlhEQVRBKTsKLQkJCXNrYi0+ZGF0YVtsZW4gKyBwYWRkaW5nIC0gMV0gPSB2YWx1ZTsKKwkJCXNzYl9ibG9ja19yZWFkKGRldi0+ZGV2LCB3bC0+cnhfdGFpbCwgMiwKKwkJCQkgICAgICAgcS0+bW1pb19iYXNlICsgQjQzX1BJT19SWERBVEEsCisJCQkJICAgICAgIHNpemVvZih1MTYpKTsKKwkJCXNrYi0+ZGF0YVtsZW4gKyBwYWRkaW5nIC0gMV0gPSB3bC0+cnhfdGFpbFswXTsKIAkJfQogCX0KIAotCWI0M19yeChxLT5kZXYsIHNrYiwgJnJ4aGRyKTsKKwliNDNfcngocS0+ZGV2LCBza2IsICZ3bC0+cnhoZHIpOwogCiAJcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yZmtpbGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yZmtpbGwuYwppbmRleCAzMWU1NTk5Li5mZmRjZTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmZraWxsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3Jma2lsbC5jCkBAIC0yOCwxMiArMjgsMTMgQEAKIC8qIFJldHVybnMgVFJVRSwgaWYgdGhlIHJhZGlvIGlzIGVuYWJsZWQgaW4gaGFyZHdhcmUuICovCiBib29sIGI0M19pc19od19yYWRpb19lbmFibGVkKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKKwlpZiAoZGV2LT5waHkucmV2ID49IDMgfHwgZGV2LT5waHkudHlwZSA9PSBCNDNfUEhZVFlQRV9MUCkgewogCQlpZiAoIShiNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fUkFESU9fSFdFTkFCTEVEX0hJKQogCQkgICAgICAmIEI0M19NTUlPX1JBRElPX0hXRU5BQkxFRF9ISV9NQVNLKSkKIAkJCXJldHVybiAxOwogCX0gZWxzZSB7Ci0JCWlmIChiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUkFESU9fSFdFTkFCTEVEX0xPKQorCQlpZiAoYjQzX3N0YXR1cyhkZXYpID49IEI0M19TVEFUX1NUQVJURUQgJiYKKwkJICAgIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19SQURJT19IV0VOQUJMRURfTE8pCiAJCSAgICAmIEI0M19NTUlPX1JBRElPX0hXRU5BQkxFRF9MT19NQVNLKQogCQkJcmV0dXJuIDE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9zZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzYWM2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9zZGlvLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCisgKgorICogU0RJTyBvdmVyIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZSBidXMgZ2x1ZSBmb3IgYjQzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBbGJlcnQgSGVycmFuegorICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9faWRzLmg+CisjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgorCisjaW5jbHVkZSAic2Rpby5oIgorI2luY2x1ZGUgImI0My5oIgorCisKKyNkZWZpbmUgSE5CVV9DSElQSUQJCTB4MDEJLyogdmVuZG9yICYgZGV2aWNlIGlkICovCisKKyNkZWZpbmUgQjQzX1NESU9fQkxPQ0tfU0laRQk2NAkvKiByeCBmaWZvIG1heCBzaXplIGluIGJ5dGVzICovCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBiNDNfc2Rpb19xdWlyayB7CisJdTE2IHZlbmRvcjsKKwl1MTYgZGV2aWNlOworCXVuc2lnbmVkIGludCBxdWlya3M7Cit9IGI0M19zZGlvX3F1aXJrc1tdID0geworCXsgMHgxNEU0LCAweDQzMTgsIFNTQl9RVUlSS19TRElPX1JFQURfQUZURVJfV1JJVEUzMiwgfSwKKwl7IH0sCit9OworCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYjQzX3NkaW9fZ2V0X3F1aXJrcyh1MTYgdmVuZG9yLCB1MTYgZGV2aWNlKQoreworCWNvbnN0IHN0cnVjdCBiNDNfc2Rpb19xdWlyayAqcTsKKworCWZvciAocSA9IGI0M19zZGlvX3F1aXJrczsgcS0+cXVpcmtzOyBxKyspIHsKKwkJaWYgKHZlbmRvciA9PSBxLT52ZW5kb3IgJiYgZGV2aWNlID09IHEtPmRldmljZSkKKwkJCXJldHVybiBxLT5xdWlya3M7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19zZGlvX2ludGVycnVwdF9kaXNwYXRjaGVyKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCit7CisJc3RydWN0IGI0M19zZGlvICpzZGlvID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYgPSBzZGlvLT5pcnFfaGFuZGxlcl9vcGFxdWU7CisKKwlpZiAodW5saWtlbHkoYjQzX3N0YXR1cyhkZXYpIDwgQjQzX1NUQVRfU1RBUlRFRCkpCisJCXJldHVybjsKKworCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCXNkaW8tPmlycV9oYW5kbGVyKGRldik7CisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworfQorCitpbnQgYjQzX3NkaW9fcmVxdWVzdF9pcnEoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJIHZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpKQoreworCXN0cnVjdCBzc2JfYnVzICpidXMgPSBkZXYtPmRldi0+YnVzOworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBidXMtPmhvc3Rfc2RpbzsKKwlzdHJ1Y3QgYjQzX3NkaW8gKnNkaW8gPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOworCWludCBlcnI7CisKKwlzZGlvLT5pcnFfaGFuZGxlcl9vcGFxdWUgPSBkZXY7CisJc2Rpby0+aXJxX2hhbmRsZXIgPSBoYW5kbGVyOworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwllcnIgPSBzZGlvX2NsYWltX2lycShmdW5jLCBiNDNfc2Rpb19pbnRlcnJ1cHRfZGlzcGF0Y2hlcik7CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGI0M19zZGlvX2ZyZWVfaXJxKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPmJ1czsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gYnVzLT5ob3N0X3NkaW87CisJc3RydWN0IGI0M19zZGlvICpzZGlvID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwlzZGlvX3JlbGVhc2VfaXJxKGZ1bmMpOworCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCXNkaW8tPmlycV9oYW5kbGVyX29wYXF1ZSA9IE5VTEw7CisJc2Rpby0+aXJxX2hhbmRsZXIgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGI0M19zZGlvX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCisJCQkgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGI0M19zZGlvICpzZGlvOworCXN0cnVjdCBzZGlvX2Z1bmNfdHVwbGUgKnR1cGxlOworCXUxNiB2ZW5kb3IgPSAwLCBkZXZpY2UgPSAwOworCWludCBlcnJvcjsKKworCS8qIExvb2sgZm9yIHRoZSBjYXJkIGNoaXAgaWRlbnRpZmllci4gKi8KKwl0dXBsZSA9IGZ1bmMtPnR1cGxlczsKKwl3aGlsZSAodHVwbGUpIHsKKwkJc3dpdGNoICh0dXBsZS0+Y29kZSkgeworCQljYXNlIDB4ODA6CisJCQlzd2l0Y2ggKHR1cGxlLT5kYXRhWzBdKSB7CisJCQljYXNlIEhOQlVfQ0hJUElEOgorCQkJCWlmICh0dXBsZS0+c2l6ZSAhPSA1KQorCQkJCQlicmVhazsKKwkJCQl2ZW5kb3IgPSB0dXBsZS0+ZGF0YVsxXSB8ICh0dXBsZS0+ZGF0YVsyXTw8OCk7CisJCQkJZGV2aWNlID0gdHVwbGUtPmRhdGFbM10gfCAodHVwbGUtPmRhdGFbNF08PDgpOworCQkJCWRldl9pbmZvKCZmdW5jLT5kZXYsICJDaGlwIElEICUwNHg6JTA0eFxuIiwKKwkJCQkJIHZlbmRvciwgZGV2aWNlKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXR1cGxlID0gdHVwbGUtPm5leHQ7CisJfQorCWlmICghdmVuZG9yIHx8ICFkZXZpY2UpIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJZXJyb3IgPSBzZGlvX3NldF9ibG9ja19zaXplKGZ1bmMsIEI0M19TRElPX0JMT0NLX1NJWkUpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZmdW5jLT5kZXYsICJmYWlsZWQgdG8gc2V0IGJsb2NrIHNpemUgdG8gJXUgYnl0ZXMsIgorCQkJIiBlcnJvciAlZFxuIiwgQjQzX1NESU9fQkxPQ0tfU0laRSwgZXJyb3IpOworCQlnb3RvIGVycl9yZWxlYXNlX2hvc3Q7CisJfQorCWVycm9yID0gc2Rpb19lbmFibGVfZnVuYyhmdW5jKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmZnVuYy0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBmdW5jLCBlcnJvciAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycl9yZWxlYXNlX2hvc3Q7CisJfQorCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCisJc2RpbyA9IGt6YWxsb2Moc2l6ZW9mKCpzZGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZGlvKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZGV2X2VycigmZnVuYy0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHNzYiBidXNcbiIpOworCQlnb3RvIGVycl9kaXNhYmxlX2Z1bmM7CisJfQorCWVycm9yID0gc3NiX2J1c19zZGlvYnVzX3JlZ2lzdGVyKCZzZGlvLT5zc2IsIGZ1bmMsCisJCQkJCSBiNDNfc2Rpb19nZXRfcXVpcmtzKHZlbmRvciwgZGV2aWNlKSk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmZ1bmMtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBzc2Igc2RpbyBidXMsIgorCQkJIiBlcnJvciAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycl9mcmVlX3NzYjsKKwl9CisJc2Rpb19zZXRfZHJ2ZGF0YShmdW5jLCBzZGlvKTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9zc2I6CisJa2ZyZWUoc2Rpbyk7CitlcnJfZGlzYWJsZV9mdW5jOgorCXNkaW9fZGlzYWJsZV9mdW5jKGZ1bmMpOworZXJyX3JlbGVhc2VfaG9zdDoKKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19zZGlvX3JlbW92ZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQoreworCXN0cnVjdCBiNDNfc2RpbyAqc2RpbyA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CisKKwlzc2JfYnVzX3VucmVnaXN0ZXIoJnNkaW8tPnNzYik7CisJc2Rpb19kaXNhYmxlX2Z1bmMoZnVuYyk7CisJa2ZyZWUoc2Rpbyk7CisJc2Rpb19zZXRfZHJ2ZGF0YShmdW5jLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCBiNDNfc2Rpb19pZHNbXSA9IHsKKwl7IFNESU9fREVWSUNFKDB4MDJkMCwgMHgwNDRiKSB9LCAvKiBOaW50ZW5kbyBXaWkgV0xBTiBkYXVnaHRlciBjYXJkICovCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzZGlvX2RyaXZlciBiNDNfc2Rpb19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImI0My1zZGlvIiwKKwkuaWRfdGFibGUJPSBiNDNfc2Rpb19pZHMsCisJLnByb2JlCQk9IGI0M19zZGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gYjQzX3NkaW9fcmVtb3ZlLAorfTsKKworaW50IGI0M19zZGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc2Rpb19yZWdpc3Rlcl9kcml2ZXIoJmI0M19zZGlvX2RyaXZlcik7Cit9CisKK3ZvaWQgYjQzX3NkaW9fZXhpdCh2b2lkKQoreworCXNkaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmI0M19zZGlvX2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvc2Rpby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3NkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjYzMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3NkaW8uaApAQCAtMCwwICsxLDQ1IEBACisjaWZuZGVmIEI0M19TRElPX0hfCisjZGVmaW5lIEI0M19TRElPX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CisKK3N0cnVjdCBiNDNfd2xkZXY7CisKKworI2lmZGVmIENPTkZJR19CNDNfU0RJTworCitzdHJ1Y3QgYjQzX3NkaW8geworCXN0cnVjdCBzc2JfYnVzIHNzYjsKKwl2b2lkICppcnFfaGFuZGxlcl9vcGFxdWU7CisJdm9pZCAoKmlycV9oYW5kbGVyKShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworfTsKKworaW50IGI0M19zZGlvX3JlcXVlc3RfaXJxKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCSB2b2lkICgqaGFuZGxlcikoc3RydWN0IGI0M193bGRldiAqZGV2KSk7Cit2b2lkIGI0M19zZGlvX2ZyZWVfaXJxKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7CisKK2ludCBiNDNfc2Rpb19pbml0KHZvaWQpOwordm9pZCBiNDNfc2Rpb19leGl0KHZvaWQpOworCisKKyNlbHNlIC8qIENPTkZJR19CNDNfU0RJTyAqLworCisKK2ludCBiNDNfc2Rpb19yZXF1ZXN0X2lycShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkgdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBiNDNfd2xkZXYgKmRldikpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9Cit2b2lkIGI0M19zZGlvX2ZyZWVfaXJxKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGI0M19zZGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBiNDNfc2Rpb19leGl0KHZvaWQpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQjQzX1NESU8gKi8KKyNlbmRpZiAvKiBCNDNfU0RJT19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmMKaW5kZXggMTRmNTQxMi4uZjRlOTY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMveG1pdC5jCkBAIC0yNyw3ICsyNyw3IEBACiAKICovCiAKLSNpbmNsdWRlICJ4bWl0LmgiCisjaW5jbHVkZSAiYjQzLmgiCiAjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgogI2luY2x1ZGUgImRtYS5oIgogI2luY2x1ZGUgInBpby5oIgpAQCAtNjkwLDggKzY5MCwxNCBAQAogCX0KIAogCW1lbWNweShJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKSwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOwotCWllZWU4MDIxMV9yeF9pcnFzYWZlKGRldi0+d2wtPmh3LCBza2IpOwogCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWllZWU4MDIxMV9yeChkZXYtPndsLT5odywgc2tiKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKworI2lmIEI0M19ERUJVRworCWRldi0+cnhfY291bnQrKzsKKyNlbmRpZgogCXJldHVybjsKIGRyb3A6CiAJYjQzZGJnKGRldi0+d2wsICJSWDogUGFja2V0IGRyb3BwZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKaW5kZXggMWQ5MjIzYi4uNGI2MDE0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxuZXQvZHN0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcGh5LmMKaW5kZXggMTEzMTllYy4uYWFmMjI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9waHkuYwpAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlICJiNDNsZWdhY3kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW5mby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKaW5kZXggNmZhMTRhNC4uNGRmYjQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKQEAgLTEsNiArMSw3IEBACiAvKiBIb3N0IEFQIGRyaXZlciBJbmZvIEZyYW1lIHByb2Nlc3NpbmcgKHBhcnQgb2YgaG9zdGFwLm8gbW9kdWxlKSAqLwogCiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJob3N0YXBfd2xhbi5oIgogI2luY2x1ZGUgImhvc3RhcC5oIgogI2luY2x1ZGUgImhvc3RhcF9hcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCmluZGV4IDNmMmJkYTguLjk0MTljZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKQEAgLTEsNiArMSw3IEBACiAvKiBpb2N0bCgpIChtb3N0bHkgTGludXggV2lyZWxlc3MgRXh0ZW5zaW9ucykgcm91dGluZXMgZm9yIEhvc3QgQVAgZHJpdmVyICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPG5ldC9saWI4MDIxMS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwppbmRleCAyNDBjZmYxLi5hNzQxZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwpAQCAtNjMyNSw4ICs2MzI1LDEwIEBACiAKICAgICAgIGZhaWw6CiAJaWYgKGRldikgewotCQlpZiAocmVnaXN0ZXJlZCkKKwkJaWYgKHJlZ2lzdGVyZWQpIHsKKwkJCXVucmVnaXN0ZXJfaWVlZTgwMjExKHByaXYtPmllZWUpOwogCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJfQogCiAJCWlwdzIxMDBfaHdfc3RvcF9hZGFwdGVyKHByaXYpOwogCkBAIC02MzgzLDYgKzYzODUsNyBAQAogCQkvKiBVbnJlZ2lzdGVyIHRoZSBkZXZpY2UgZmlyc3QgLSB0aGlzIHJlc3VsdHMgaW4gY2xvc2UoKQogCQkgKiBiZWluZyBjYWxsZWQgaWYgdGhlIGRldmljZSBpcyBvcGVuLiAgSWYgd2UgZnJlZSBzdG9yYWdlCiAJCSAqIGZpcnN0LCB0aGVuIGNsb3NlKCkgd2lsbCBjcmFzaC4gKi8KKwkJdW5yZWdpc3Rlcl9pZWVlODAyMTEocHJpdi0+aWVlZSk7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAKIAkJLyogaXB3MjEwMF9kb3duIHdpbGwgZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gbW9yZSBwZW5kaW5nIHdvcmsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKaW5kZXggOGQ1OGU2ZS4uOWIwZjJjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKQEAgLTMwLDYgKzMwLDcgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJpcHcyMjAwLmgiCiAKIApAQCAtMTE4MjEsNiArMTE4MjIsNyBAQAogCQlpZiAoZXJyKSB7CiAJCQlJUFdfRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBwcm9taXNjdW91cyBuZXR3b3JrICIKIAkJCQkgICJkZXZpY2UgKGVycm9yICVkKS5cbiIsIGVycik7CisJCQl1bnJlZ2lzdGVyX2llZWU4MDIxMShwcml2LT5pZWVlKTsKIAkJCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPm5ldF9kZXYpOwogCQkJZ290byBvdXRfcmVtb3ZlX3N5c2ZzOwogCQl9CkBAIC0xMTg3MSw2ICsxMTg3Myw3IEBACiAKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIAorCXVucmVnaXN0ZXJfaWVlZTgwMjExKHByaXYtPmllZWUpOwogCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPm5ldF9kZXYpOwogCiAJaWYgKHByaXYtPnJ4cSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3LmgKaW5kZXggYmY0NTM5MS4uZjQyYWRlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwdy5oCkBAIC0xMDIwLDYgKzEwMjAsNyBAQAogLyogaWVlZTgwMjExLmMgKi8KIGV4dGVybiB2b2lkIGZyZWVfaWVlZTgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtb25pdG9yKTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaWVlZTgwMjExKGludCBzaXplb2ZfcHJpdiwgaW50IG1vbml0b3IpOworZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9pZWVlODAyMTEoc3RydWN0IGxpYmlwd19kZXZpY2UgKmllZWUpOwogZXh0ZXJuIGludCBsaWJpcHdfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CiAKIGV4dGVybiB2b2lkIGxpYmlwd19uZXR3b3Jrc19hZ2Uoc3RydWN0IGxpYmlwd19kZXZpY2UgKmllZWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd19tb2R1bGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X21vZHVsZS5jCmluZGV4IGEwZTlmNmEuLmJlNWI4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X21vZHVsZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X21vZHVsZS5jCkBAIC0yMzUsMTYgKzIzNSwxOSBAQAogCWxpYmlwd19uZXR3b3Jrc19mcmVlKGllZWUpOwogCiAJLyogZnJlZSBjZmc4MDIxMSByZXNvdXJjZXMgKi8KLQlpZiAoIW1vbml0b3IpIHsKLQkJd2lwaHlfdW5yZWdpc3RlcihpZWVlLT53ZGV2LndpcGh5KTsKLQkJa2ZyZWUoaWVlZS0+YV9iYW5kLmNoYW5uZWxzKTsKLQkJa2ZyZWUoaWVlZS0+YmdfYmFuZC5jaGFubmVscyk7CisJaWYgKCFtb25pdG9yKQogCQl3aXBoeV9mcmVlKGllZWUtPndkZXYud2lwaHkpOwotCX0KIAogCWZyZWVfbmV0ZGV2KGRldik7CiB9CiAKK3ZvaWQgdW5yZWdpc3Rlcl9pZWVlODAyMTEoc3RydWN0IGxpYmlwd19kZXZpY2UgKmllZWUpCit7CisJd2lwaHlfdW5yZWdpc3RlcihpZWVlLT53ZGV2LndpcGh5KTsKKwlrZnJlZShpZWVlLT5hX2JhbmQuY2hhbm5lbHMpOworCWtmcmVlKGllZWUtPmJnX2JhbmQuY2hhbm5lbHMpOworfQorCiAjaWZkZWYgQ09ORklHX0xJQklQV19ERUJVRwogCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKQEAgLTMzMCwzICszMzMsNCBAQAogCiBFWFBPUlRfU1lNQk9MKGFsbG9jX2llZWU4MDIxMSk7CiBFWFBPUlRfU1lNQk9MKGZyZWVfaWVlZTgwMjExKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9pZWVlODAyMTEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCmluZGV4IGE5NWNhYTAuLjI3MTZiOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKQEAgLTk5LDYgKzk5LDggQEAKIAkuc2V0dXBfZGVmZXJyZWRfd29yayA9IGl3bDUwMDBfc2V0dXBfZGVmZXJyZWRfd29yaywKIAkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGl3bDUwMDBfaHdfdmFsaWRfcnRjX2RhdGFfYWRkciwKIAkubG9hZF91Y29kZSA9IGl3bDUwMDBfbG9hZF91Y29kZSwKKwkuZHVtcF9uaWNfZXZlbnRfbG9nID0gaXdsX2R1bXBfbmljX2V2ZW50X2xvZywKKwkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsX2R1bXBfbmljX2Vycm9yX2xvZywKIAkuaW5pdF9hbGl2ZV9zdGFydCA9IGl3bDUwMDBfaW5pdF9hbGl2ZV9zdGFydCwKIAkuYWxpdmVfbm90aWZ5ID0gaXdsNTAwMF9hbGl2ZV9ub3RpZnksCiAJLnNlbmRfdHhfcG93ZXIgPSBpd2w1MDAwX3NlbmRfdHhfcG93ZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LXJzLmMKaW5kZXggYTE2YmQ0MS4uY2JiMDU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1ycy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtcnMuYwpAQCAtNzAyLDcgKzcwMiw3IEBACiAJCXU4IHN0YV9pZCA9IGl3bF9maW5kX3N0YXRpb24ocHJpdiwgaGRyLT5hZGRyMSk7CiAKIAkJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IEFERCBzdGF0aW9uICVwbVxuIiwKKwkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogQUREIHN0YXRpb24gJXBNXG4iLAogCQkJCSAgICAgICBoZHItPmFkZHIxKTsKIAkJCXN0YV9pZCA9IGl3bF9hZGRfc3RhdGlvbihwcml2LCBoZHItPmFkZHIxLCBmYWxzZSwKIAkJCQlDTURfQVNZTkMsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5jCmluZGV4IGU5YTY4NWQuLmYwNTliNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgpAQCAtNjEwLDcgKzYxMSw3IEBACiAJaWYgKHJ4X3N0YXR1cy5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCiAJCXJ4X3N0YXR1cy5yYXRlX2lkeCAtPSBJV0xfRklSU1RfT0ZETV9SQVRFOwogCi0Jcnhfc3RhdHVzLmFudGVubmEgPSBsZTE2X3RvX2NwdShyeF9oZHItPnBoeV9mbGFncyAmCisJcnhfc3RhdHVzLmFudGVubmEgPSAobGUxNl90b19jcHUocnhfaGRyLT5waHlfZmxhZ3MpICYKIAkJCQkJUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX01TSykgPj4gNDsKIAogCS8qIHNldCB0aGUgcHJlYW1ibGUgZmxhZyBpZiBhcHByb3ByaWF0ZSAqLwpAQCAtMjgzOSw2ICsyODQwLDggQEAKIAkudHhxX2ZyZWVfdGZkID0gaXdsMzk0NV9od190eHFfZnJlZV90ZmQsCiAJLnR4cV9pbml0ID0gaXdsMzk0NV9od190eF9xdWV1ZV9pbml0LAogCS5sb2FkX3Vjb2RlID0gaXdsMzk0NV9sb2FkX2JzbSwKKwkuZHVtcF9uaWNfZXZlbnRfbG9nID0gaXdsMzk0NV9kdW1wX25pY19ldmVudF9sb2csCisJLmR1bXBfbmljX2Vycm9yX2xvZyA9IGl3bDM5NDVfZHVtcF9uaWNfZXJyb3JfbG9nLAogCS5hcG1fb3BzID0gewogCQkuaW5pdCA9IGl3bDM5NDVfYXBtX2luaXQsCiAJCS5yZXNldCA9IGl3bDM5NDVfYXBtX3Jlc2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5oCmluZGV4IGYyNDAzNjkuLjIxNjc5YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LmgKQEAgLTIwOSw2ICsyMDksOCBAQAogCQkJCQkgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgaXdsMzk0NV9maWxsX2JlYWNvbl9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsaW50IGxlZnQpOworZXh0ZXJuIHZvaWQgaXdsMzk0NV9kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIGl3bDM5NDVfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAKIC8qCiAgKiBDdXJyZW50bHkgdXNlZCBieSBpd2wtMzk0NS1ycy4uLiBsb29rIGF0IHJlc3RydWN0dXJpbmcgc28gdGhhdCBpdCBkb2Vzbid0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LmMKaW5kZXggY2E2MWQzNy4uNmY3MDNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNDk2NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTQ5NjUuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CkBAIC0yMDIxLDYgKzIwMjIsMTIgQEAKIAkJCQkJICAgYWdnLT5mcmFtZV9jb3VudCwgdHhxX2lkLCBpZHgpOwogCiAJCQloZHIgPSBpd2xfdHhfcXVldWVfZ2V0X2hkcihwcml2LCB0eHFfaWQsIGlkeCk7CisJCQlpZiAoIWhkcikgeworCQkJCUlXTF9FUlIocHJpdiwKKwkJCQkJIkJVR19PTiBpZHggZG9lc24ndCBwb2ludCB0byB2YWxpZCBza2IiCisJCQkJCSIgaWR4PSVkLCB0eHFfaWQ9JWRcbiIsIGlkeCwgdHhxX2lkKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CiAKIAkJCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCk7CiAJCQlpZiAoaWR4ICE9IChTRVFfVE9fU04oc2MpICYgMHhmZikpIHsKQEAgLTIyOTIsNiArMjI5OSw4IEBACiAJLmFsaXZlX25vdGlmeSA9IGl3bDQ5NjVfYWxpdmVfbm90aWZ5LAogCS5pbml0X2FsaXZlX3N0YXJ0ID0gaXdsNDk2NV9pbml0X2FsaXZlX3N0YXJ0LAogCS5sb2FkX3Vjb2RlID0gaXdsNDk2NV9sb2FkX2JzbSwKKwkuZHVtcF9uaWNfZXZlbnRfbG9nID0gaXdsX2R1bXBfbmljX2V2ZW50X2xvZywKKwkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsX2R1bXBfbmljX2Vycm9yX2xvZywKIAkuYXBtX29wcyA9IHsKIAkJLmluaXQgPSBpd2w0OTY1X2FwbV9pbml0LAogCQkucmVzZXQgPSBpd2w0OTY1X2FwbV9yZXNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYwppbmRleCAxZDUzOWUzLi42ZTZmNTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KQEAgLTMxNyw3ICszMTgsNyBAQAogCQkJKHMzMilhdmVyYWdlX25vaXNlW2ldKSkgLyAxNTAwOwogCQkvKiBib3VuZCBnYWluIGJ5IDIgYml0cyB2YWx1ZSBtYXgsIDNyZCBiaXQgaXMgc2lnbiAqLwogCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0gPQotCQkJbWluKGFicyhkZWx0YV9nKSwgQ0hBSU5fTk9JU0VfTUFYX0RFTFRBX0dBSU5fQ09ERSk7CisJCQltaW4oYWJzKGRlbHRhX2cpLCAobG9uZykgQ0hBSU5fTk9JU0VfTUFYX0RFTFRBX0dBSU5fQ09ERSk7CiAKIAkJaWYgKGRlbHRhX2cgPCAwKQogCQkJLyogc2V0IG5lZ2F0aXZlIHNpZ24gKi8KQEAgLTExNjMsNiArMTE2NCwxMiBAQAogCQkJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCB0eHFfaWQsIGlkeCk7CiAKIAkJCWhkciA9IGl3bF90eF9xdWV1ZV9nZXRfaGRyKHByaXYsIHR4cV9pZCwgaWR4KTsKKwkJCWlmICghaGRyKSB7CisJCQkJSVdMX0VSUihwcml2LAorCQkJCQkiQlVHX09OIGlkeCBkb2Vzbid0IHBvaW50IHRvIHZhbGlkIHNrYiIKKwkJCQkJIiBpZHg9JWQsIHR4cV9pZD0lZFxuIiwgaWR4LCB0eHFfaWQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KIAogCQkJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKTsKIAkJCWlmIChpZHggIT0gKFNFUV9UT19TTihzYykgJiAweGZmKSkgewpAQCAtMTUyOSw2ICsxNTM2LDggQEAKIAkucnhfaGFuZGxlcl9zZXR1cCA9IGl3bDUwMDBfcnhfaGFuZGxlcl9zZXR1cCwKIAkuc2V0dXBfZGVmZXJyZWRfd29yayA9IGl3bDUwMDBfc2V0dXBfZGVmZXJyZWRfd29yaywKIAkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGl3bDUwMDBfaHdfdmFsaWRfcnRjX2RhdGFfYWRkciwKKwkuZHVtcF9uaWNfZXZlbnRfbG9nID0gaXdsX2R1bXBfbmljX2V2ZW50X2xvZywKKwkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsX2R1bXBfbmljX2Vycm9yX2xvZywKIAkubG9hZF91Y29kZSA9IGl3bDUwMDBfbG9hZF91Y29kZSwKIAkuaW5pdF9hbGl2ZV9zdGFydCA9IGl3bDUwMDBfaW5pdF9hbGl2ZV9zdGFydCwKIAkuYWxpdmVfbm90aWZ5ID0gaXdsNTAwMF9hbGl2ZV9ub3RpZnksCkBAIC0xNTc5LDYgKzE1ODgsOCBAQAogCS5yeF9oYW5kbGVyX3NldHVwID0gaXdsNTAwMF9yeF9oYW5kbGVyX3NldHVwLAogCS5zZXR1cF9kZWZlcnJlZF93b3JrID0gaXdsNTAwMF9zZXR1cF9kZWZlcnJlZF93b3JrLAogCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaXdsNTAwMF9od192YWxpZF9ydGNfZGF0YV9hZGRyLAorCS5kdW1wX25pY19ldmVudF9sb2cgPSBpd2xfZHVtcF9uaWNfZXZlbnRfbG9nLAorCS5kdW1wX25pY19lcnJvcl9sb2cgPSBpd2xfZHVtcF9uaWNfZXJyb3JfbG9nLAogCS5sb2FkX3Vjb2RlID0gaXdsNTAwMF9sb2FkX3Vjb2RlLAogCS5pbml0X2FsaXZlX3N0YXJ0ID0gaXdsNTAwMF9pbml0X2FsaXZlX3N0YXJ0LAogCS5hbGl2ZV9ub3RpZnkgPSBpd2w1MDAwX2FsaXZlX25vdGlmeSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYwppbmRleCA4MmI5YzkzLi5jMjk1YjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCkBAIC0xMDAsNiArMTAwLDggQEAKIAkuc2V0dXBfZGVmZXJyZWRfd29yayA9IGl3bDUwMDBfc2V0dXBfZGVmZXJyZWRfd29yaywKIAkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGl3bDUwMDBfaHdfdmFsaWRfcnRjX2RhdGFfYWRkciwKIAkubG9hZF91Y29kZSA9IGl3bDUwMDBfbG9hZF91Y29kZSwKKwkuZHVtcF9uaWNfZXZlbnRfbG9nID0gaXdsX2R1bXBfbmljX2V2ZW50X2xvZywKKwkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsX2R1bXBfbmljX2Vycm9yX2xvZywKIAkuaW5pdF9hbGl2ZV9zdGFydCA9IGl3bDUwMDBfaW5pdF9hbGl2ZV9zdGFydCwKIAkuYWxpdmVfbm90aWZ5ID0gaXdsNTAwMF9hbGl2ZV9ub3RpZnksCiAJLnNlbmRfdHhfcG93ZXIgPSBpd2w1MDAwX3NlbmRfdHhfcG93ZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCmluZGV4IDAwNDU3YmYuLmVhYWZhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KQEAgLTE1MjYsNiArMTUyNywxOTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpkZXNjX2xvb2t1cF90ZXh0W10gPSB7CisJIk9LIiwKKwkiRkFJTCIsCisJIkJBRF9QQVJBTSIsCisJIkJBRF9DSEVDS1NVTSIsCisJIk5NSV9JTlRFUlJVUFRfV0RHIiwKKwkiU1lTQVNTRVJUIiwKKwkiRkFUQUxfRVJST1IiLAorCSJCQURfQ09NTUFORCIsCisJIkhXX0VSUk9SX1RVTkVfTE9DSyIsCisJIkhXX0VSUk9SX1RFTVBFUkFUVVJFIiwKKwkiSUxMRUdBTF9DSEFOX0ZSRVEiLAorCSJWQ0NfTk9UX1NUQUJMRSIsCisJIkZIX0VSUk9SIiwKKwkiTk1JX0lOVEVSUlVQVF9IT1NUIiwKKwkiTk1JX0lOVEVSUlVQVF9BQ1RJT05fUFQiLAorCSJOTUlfSU5URVJSVVBUX1VOS05PV04iLAorCSJVQ09ERV9WRVJTSU9OX01JU01BVENIIiwKKwkiSFdfRVJST1JfQUJTX0xPQ0siLAorCSJIV19FUlJPUl9DQUxfTE9DS19GQUlMIiwKKwkiTk1JX0lOVEVSUlVQVF9JTlNUX0FDVElPTl9QVCIsCisJIk5NSV9JTlRFUlJVUFRfREFUQV9BQ1RJT05fUFQiLAorCSJOTUlfVFJNX0hXX0VSIiwKKwkiTk1JX0lOVEVSUlVQVF9UUk0iLAorCSJOTUlfSU5URVJSVVBUX0JSRUFLX1BPSU5UIgorCSJERUJVR18wIiwKKwkiREVCVUdfMSIsCisJIkRFQlVHXzIiLAorCSJERUJVR18zIiwKKwkiVU5LTk9XTiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXNjX2xvb2t1cChpbnQgaSkKK3sKKwlpbnQgbWF4ID0gQVJSQVlfU0laRShkZXNjX2xvb2t1cF90ZXh0KSAtIDE7CisKKwlpZiAoaSA8IDAgfHwgaSA+IG1heCkKKwkJaSA9IG1heDsKKworCXJldHVybiBkZXNjX2xvb2t1cF90ZXh0W2ldOworfQorCisjZGVmaW5lIEVSUk9SX1NUQVJUX09GRlNFVCAgKDEgKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgRVJST1JfRUxFTV9TSVpFICAgICAoNyAqIHNpemVvZih1MzIpKQorCit2b2lkIGl3bF9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXUzMiBkYXRhMiwgbGluZTsKKwl1MzIgZGVzYywgdGltZSwgY291bnQsIGJhc2UsIGRhdGExOworCXUzMiBibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazI7CisKKwlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKQorCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LmVycm9yX2V2ZW50X3RhYmxlX3B0cik7CisJZWxzZQorCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5lcnJvcl9ldmVudF90YWJsZV9wdHIpOworCisJaWYgKCFwcml2LT5jZmctPm9wcy0+bGliLT5pc192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CisJCUlXTF9FUlIocHJpdiwgIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFhcbiIsIGJhc2UpOworCQlyZXR1cm47CisJfQorCisJY291bnQgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBiYXNlKTsKKworCWlmIChFUlJPUl9TVEFSVF9PRkZTRVQgPD0gY291bnQgKiBFUlJPUl9FTEVNX1NJWkUpIHsKKwkJSVdMX0VSUihwcml2LCAiU3RhcnQgSVdMIEVycm9yIExvZyBEdW1wOlxuIik7CisJCUlXTF9FUlIocHJpdiwgIlN0YXR1czogMHglMDhsWCwgY291bnQ6ICVkXG4iLAorCQkJcHJpdi0+c3RhdHVzLCBjb3VudCk7CisJfQorCisJZGVzYyA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAxICogc2l6ZW9mKHUzMikpOworCWJsaW5rMSA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAzICogc2l6ZW9mKHUzMikpOworCWJsaW5rMiA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA0ICogc2l6ZW9mKHUzMikpOworCWlsaW5rMSA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA1ICogc2l6ZW9mKHUzMikpOworCWlsaW5rMiA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA2ICogc2l6ZW9mKHUzMikpOworCWRhdGExID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDcgKiBzaXplb2YodTMyKSk7CisJZGF0YTIgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgOCAqIHNpemVvZih1MzIpKTsKKwlsaW5lID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDkgKiBzaXplb2YodTMyKSk7CisJdGltZSA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAxMSAqIHNpemVvZih1MzIpKTsKKworCUlXTF9FUlIocHJpdiwgIkRlc2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZSAgICAgICAiCisJCSJkYXRhMSAgICAgIGRhdGEyICAgICAgbGluZVxuIik7CisJSVdMX0VSUihwcml2LCAiJS0yOHMgKCMlMDJkKSAlMDEwdSAweCUwOFggMHglMDhYICV1XG4iLAorCQlkZXNjX2xvb2t1cChkZXNjKSwgZGVzYywgdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lKTsKKwlJV0xfRVJSKHByaXYsICJibGluazEgIGJsaW5rMiAgaWxpbmsxICBpbGluazJcbiIpOworCUlXTF9FUlIocHJpdiwgIjB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WFxuIiwgYmxpbmsxLCBibGluazIsCisJCWlsaW5rMSwgaWxpbmsyKTsKKworfQorCisjZGVmaW5lIEVWRU5UX1NUQVJUX09GRlNFVCAgKDQgKiBzaXplb2YodTMyKSkKKworLyoqCisgKiBpd2xfcHJpbnRfZXZlbnRfbG9nIC0gRHVtcCBlcnJvciBldmVudCBsb2cgdG8gc3lzbG9nCisgKgorICovCitzdGF0aWMgdm9pZCBpd2xfcHJpbnRfZXZlbnRfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHN0YXJ0X2lkeCwKKwkJCQl1MzIgbnVtX2V2ZW50cywgdTMyIG1vZGUpCit7CisJdTMyIGk7CisJdTMyIGJhc2U7ICAgICAgIC8qIFNSQU0gYnl0ZSBhZGRyZXNzIG9mIGV2ZW50IGxvZyBoZWFkZXIgKi8KKwl1MzIgZXZlbnRfc2l6ZTsgLyogMiB1MzJzLCBvciAzIHUzMnMgaWYgdGltZXN0YW1wIHJlY29yZGVkICovCisJdTMyIHB0cjsgICAgICAgIC8qIFNSQU0gYnl0ZSBhZGRyZXNzIG9mIGxvZyBkYXRhICovCisJdTMyIGV2LCB0aW1lLCBkYXRhOyAvKiBldmVudCBsb2cgZGF0YSAqLworCisJaWYgKG51bV9ldmVudHMgPT0gMCkKKwkJcmV0dXJuOworCWlmIChwcml2LT51Y29kZV90eXBlID09IFVDT0RFX0lOSVQpCisJCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQubG9nX2V2ZW50X3RhYmxlX3B0cik7CisJZWxzZQorCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5sb2dfZXZlbnRfdGFibGVfcHRyKTsKKworCWlmIChtb2RlID09IDApCisJCWV2ZW50X3NpemUgPSAyICogc2l6ZW9mKHUzMik7CisJZWxzZQorCQlldmVudF9zaXplID0gMyAqIHNpemVvZih1MzIpOworCisJcHRyID0gYmFzZSArIEVWRU5UX1NUQVJUX09GRlNFVCArIChzdGFydF9pZHggKiBldmVudF9zaXplKTsKKworCS8qICJ0aW1lIiBpcyBhY3R1YWxseSAiZGF0YSIgZm9yIG1vZGUgMCAobm8gdGltZXN0YW1wKS4KKwkqIHBsYWNlIGV2ZW50IGlkICMgYXQgZmFyIHJpZ2h0IGZvciBlYXNpZXIgdmlzdWFsIHBhcnNpbmcuICovCisJZm9yIChpID0gMDsgaSA8IG51bV9ldmVudHM7IGkrKykgeworCQlldiA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIHB0cik7CisJCXB0ciArPSBzaXplb2YodTMyKTsKKwkJdGltZSA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIHB0cik7CisJCXB0ciArPSBzaXplb2YodTMyKTsKKwkJaWYgKG1vZGUgPT0gMCkgeworCQkJLyogZGF0YSwgZXYgKi8KKwkJCUlXTF9FUlIocHJpdiwgIkVWVF9MT0c6MHglMDh4OiUwNHVcbiIsIHRpbWUsIGV2KTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBwdHIpOworCQkJcHRyICs9IHNpemVvZih1MzIpOworCQkJSVdMX0VSUihwcml2LCAiRVZUX0xPR1Q6JTAxMHU6MHglMDh4OiUwNHVcbiIsCisJCQkJCXRpbWUsIGRhdGEsIGV2KTsKKwkJfQorCX0KK30KKwordm9pZCBpd2xfZHVtcF9uaWNfZXZlbnRfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwl1MzIgYmFzZTsgICAgICAgLyogU1JBTSBieXRlIGFkZHJlc3Mgb2YgZXZlbnQgbG9nIGhlYWRlciAqLworCXUzMiBjYXBhY2l0eTsgICAvKiBldmVudCBsb2cgY2FwYWNpdHkgaW4gIyBlbnRyaWVzICovCisJdTMyIG1vZGU7ICAgICAgIC8qIDAgLSBubyB0aW1lc3RhbXAsIDEgLSB0aW1lc3RhbXAgcmVjb3JkZWQgKi8KKwl1MzIgbnVtX3dyYXBzOyAgLyogIyB0aW1lcyB1Q29kZSB3cmFwcGVkIHRvIHRvcCBvZiBsb2cgKi8KKwl1MzIgbmV4dF9lbnRyeTsgLyogaW5kZXggb2YgbmV4dCBlbnRyeSB0byBiZSB3cml0dGVuIGJ5IHVDb2RlICovCisJdTMyIHNpemU7ICAgICAgIC8qICMgZW50cmllcyB0aGF0IHdlJ2xsIHByaW50ICovCisKKwlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKQorCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LmxvZ19ldmVudF90YWJsZV9wdHIpOworCWVsc2UKKwkJYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmUubG9nX2V2ZW50X3RhYmxlX3B0cik7CisKKwlpZiAoIXByaXYtPmNmZy0+b3BzLT5saWItPmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKKwkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBldmVudCBsb2cgcG9pbnRlciAweCUwOFhcbiIsIGJhc2UpOworCQlyZXR1cm47CisJfQorCisJLyogZXZlbnQgbG9nIGhlYWRlciAqLworCWNhcGFjaXR5ID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSk7CisJbW9kZSA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAoMSAqIHNpemVvZih1MzIpKSk7CisJbnVtX3dyYXBzID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICgyICogc2l6ZW9mKHUzMikpKTsKKwluZXh0X2VudHJ5ID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICgzICogc2l6ZW9mKHUzMikpKTsKKworCXNpemUgPSBudW1fd3JhcHMgPyBjYXBhY2l0eSA6IG5leHRfZW50cnk7CisKKwkvKiBiYWlsIG91dCBpZiBub3RoaW5nIGluIGxvZyAqLworCWlmIChzaXplID09IDApIHsKKwkJSVdMX0VSUihwcml2LCAiU3RhcnQgSVdMIEV2ZW50IExvZyBEdW1wOiBub3RoaW5nIGluIGxvZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwlJV0xfRVJSKHByaXYsICJTdGFydCBJV0wgRXZlbnQgTG9nIER1bXA6IGRpc3BsYXkgY291bnQgJWQsIHdyYXBzICVkXG4iLAorCQkJc2l6ZSwgbnVtX3dyYXBzKTsKKworCS8qIGlmIHVDb2RlIGhhcyB3cmFwcGVkIGJhY2sgdG8gdG9wIG9mIGxvZywgc3RhcnQgYXQgdGhlIG9sZGVzdCBlbnRyeSwKKwkgKiBpLmUgdGhlIG5leHQgb25lIHRoYXQgdUNvZGUgd291bGQgZmlsbC4gKi8KKwlpZiAobnVtX3dyYXBzKQorCQlpd2xfcHJpbnRfZXZlbnRfbG9nKHByaXYsIG5leHRfZW50cnksCisJCQkJCWNhcGFjaXR5IC0gbmV4dF9lbnRyeSwgbW9kZSk7CisJLyogKHRoZW4vZWxzZSkgc3RhcnQgYXQgdG9wIG9mIGxvZyAqLworCWl3bF9wcmludF9ldmVudF9sb2cocHJpdiwgMCwgbmV4dF9lbnRyeSwgbW9kZSk7CisKK30KKyNlbmRpZgorCiAvKioKICAqIGl3bF9hbGl2ZV9zdGFydCAtIGNhbGxlZCBhZnRlciBSRVBMWV9BTElWRSBub3RpZmljYXRpb24gcmVjZWl2ZWQKICAqICAgICAgICAgICAgICAgICAgIGZyb20gcHJvdG9jb2wvcnVudGltZSB1Q29kZSAoaW5pdGlhbGl6YXRpb24gdUNvZGUncwpAQCAtMjkyMCw4ICszMTA2LDggQEAKICBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKICBvdXRfaWVlZTgwMjExX2ZyZWVfaHc6Ci0JaWVlZTgwMjExX2ZyZWVfaHcocHJpdi0+aHcpOwogCWl3bF9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOworCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKICBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oCmluZGV4IDJjNWM4OGYuLjRhZmFmNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaApAQCAtMTE1NCw3ICsxMTU0LDcgQEAKICNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19NT0RfQ0NLX01TSwkJY3B1X3RvX2xlMTYoMSA8PCAxKQogI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX1NIT1JUX1BSRUFNQkxFX01TSwljcHVfdG9fbGUxNigxIDw8IDIpCiAjZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfTkFSUk9XX0JBTkRfTVNLCWNwdV90b19sZTE2KDEgPDwgMykKLSNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX01TSwkJY3B1X3RvX2xlMTYoMHhmMCkKKyNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX01TSwkJMHhmMAogI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX0FOVEVOTkFfUE9TCQk0CiAKICNkZWZpbmUgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0sJKDB4NyA8PCA4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCmluZGV4IGZkMjZjMGQuLjJkYzkyODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCkBAIC0xMzA5LDE4OSArMTMxMCw2IEBACiAJSVdMX0RFQlVHX1JBRElPKHByaXYsICJ1OFs2XSBic3NpZF9hZGRyOiAlcE1cbiIsIHJ4b24tPmJzc2lkX2FkZHIpOwogCUlXTF9ERUJVR19SQURJTyhwcml2LCAidTE2IGFzc29jX2lkOiAweCV4XG4iLCBsZTE2X3RvX2NwdShyeG9uLT5hc3NvY19pZCkpOwogfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZGVzY19sb29rdXBfdGV4dFtdID0gewotCSJPSyIsCi0JIkZBSUwiLAotCSJCQURfUEFSQU0iLAotCSJCQURfQ0hFQ0tTVU0iLAotCSJOTUlfSU5URVJSVVBUX1dERyIsCi0JIlNZU0FTU0VSVCIsCi0JIkZBVEFMX0VSUk9SIiwKLQkiQkFEX0NPTU1BTkQiLAotCSJIV19FUlJPUl9UVU5FX0xPQ0siLAotCSJIV19FUlJPUl9URU1QRVJBVFVSRSIsCi0JIklMTEVHQUxfQ0hBTl9GUkVRIiwKLQkiVkNDX05PVF9TVEFCTEUiLAotCSJGSF9FUlJPUiIsCi0JIk5NSV9JTlRFUlJVUFRfSE9TVCIsCi0JIk5NSV9JTlRFUlJVUFRfQUNUSU9OX1BUIiwKLQkiTk1JX0lOVEVSUlVQVF9VTktOT1dOIiwKLQkiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsCi0JIkhXX0VSUk9SX0FCU19MT0NLIiwKLQkiSFdfRVJST1JfQ0FMX0xPQ0tfRkFJTCIsCi0JIk5NSV9JTlRFUlJVUFRfSU5TVF9BQ1RJT05fUFQiLAotCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwKLQkiTk1JX1RSTV9IV19FUiIsCi0JIk5NSV9JTlRFUlJVUFRfVFJNIiwKLQkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIKLQkiREVCVUdfMCIsCi0JIkRFQlVHXzEiLAotCSJERUJVR18yIiwKLQkiREVCVUdfMyIsCi0JIlVOS05PV04iCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZGVzY19sb29rdXAoaW50IGkpCi17Ci0JaW50IG1heCA9IEFSUkFZX1NJWkUoZGVzY19sb29rdXBfdGV4dCkgLSAxOwotCi0JaWYgKGkgPCAwIHx8IGkgPiBtYXgpCi0JCWkgPSBtYXg7Ci0KLQlyZXR1cm4gZGVzY19sb29rdXBfdGV4dFtpXTsKLX0KLQotI2RlZmluZSBFUlJPUl9TVEFSVF9PRkZTRVQgICgxICogc2l6ZW9mKHUzMikpCi0jZGVmaW5lIEVSUk9SX0VMRU1fU0laRSAgICAgKDcgKiBzaXplb2YodTMyKSkKLQotc3RhdGljIHZvaWQgaXdsX2R1bXBfbmljX2Vycm9yX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGRhdGEyLCBsaW5lOwotCXUzMiBkZXNjLCB0aW1lLCBjb3VudCwgYmFzZSwgZGF0YTE7Ci0JdTMyIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMjsKLQotCWlmIChwcml2LT51Y29kZV90eXBlID09IFVDT0RFX0lOSVQpCi0JCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQuZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKLQllbHNlCi0JCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlLmVycm9yX2V2ZW50X3RhYmxlX3B0cik7Ci0KLQlpZiAoIXByaXYtPmNmZy0+b3BzLT5saWItPmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKLQkJSVdMX0VSUihwcml2LCAiTm90IHZhbGlkIGVycm9yIGxvZyBwb2ludGVyIDB4JTA4WFxuIiwgYmFzZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQljb3VudCA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UpOwotCi0JaWYgKEVSUk9SX1NUQVJUX09GRlNFVCA8PSBjb3VudCAqIEVSUk9SX0VMRU1fU0laRSkgewotCQlJV0xfRVJSKHByaXYsICJTdGFydCBJV0wgRXJyb3IgTG9nIER1bXA6XG4iKTsKLQkJSVdMX0VSUihwcml2LCAiU3RhdHVzOiAweCUwOGxYLCBjb3VudDogJWRcbiIsCi0JCQlwcml2LT5zdGF0dXMsIGNvdW50KTsKLQl9Ci0KLQlkZXNjID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDEgKiBzaXplb2YodTMyKSk7Ci0JYmxpbmsxID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDMgKiBzaXplb2YodTMyKSk7Ci0JYmxpbmsyID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDQgKiBzaXplb2YodTMyKSk7Ci0JaWxpbmsxID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDUgKiBzaXplb2YodTMyKSk7Ci0JaWxpbmsyID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDYgKiBzaXplb2YodTMyKSk7Ci0JZGF0YTEgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgNyAqIHNpemVvZih1MzIpKTsKLQlkYXRhMiA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA4ICogc2l6ZW9mKHUzMikpOwotCWxpbmUgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgOSAqIHNpemVvZih1MzIpKTsKLQl0aW1lID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDExICogc2l6ZW9mKHUzMikpOwotCi0JSVdMX0VSUihwcml2LCAiRGVzYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgICIKLQkJImRhdGExICAgICAgZGF0YTIgICAgICBsaW5lXG4iKTsKLQlJV0xfRVJSKHByaXYsICIlLTI4cyAoIyUwMmQpICUwMTB1IDB4JTA4WCAweCUwOFggJXVcbiIsCi0JCWRlc2NfbG9va3VwKGRlc2MpLCBkZXNjLCB0aW1lLCBkYXRhMSwgZGF0YTIsIGxpbmUpOwotCUlXTF9FUlIocHJpdiwgImJsaW5rMSAgYmxpbmsyICBpbGluazEgIGlsaW5rMlxuIik7Ci0JSVdMX0VSUihwcml2LCAiMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYXG4iLCBibGluazEsIGJsaW5rMiwKLQkJaWxpbmsxLCBpbGluazIpOwotCi19Ci0KLSNkZWZpbmUgRVZFTlRfU1RBUlRfT0ZGU0VUICAoNCAqIHNpemVvZih1MzIpKQotCi0vKioKLSAqIGl3bF9wcmludF9ldmVudF9sb2cgLSBEdW1wIGVycm9yIGV2ZW50IGxvZyB0byBzeXNsb2cKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGl3bF9wcmludF9ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgc3RhcnRfaWR4LAotCQkJCXUzMiBudW1fZXZlbnRzLCB1MzIgbW9kZSkKLXsKLQl1MzIgaTsKLQl1MzIgYmFzZTsgICAgICAgLyogU1JBTSBieXRlIGFkZHJlc3Mgb2YgZXZlbnQgbG9nIGhlYWRlciAqLwotCXUzMiBldmVudF9zaXplOyAvKiAyIHUzMnMsIG9yIDMgdTMycyBpZiB0aW1lc3RhbXAgcmVjb3JkZWQgKi8KLQl1MzIgcHRyOyAgICAgICAgLyogU1JBTSBieXRlIGFkZHJlc3Mgb2YgbG9nIGRhdGEgKi8KLQl1MzIgZXYsIHRpbWUsIGRhdGE7IC8qIGV2ZW50IGxvZyBkYXRhICovCi0KLQlpZiAobnVtX2V2ZW50cyA9PSAwKQotCQlyZXR1cm47Ci0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkKLQkJYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC5sb2dfZXZlbnRfdGFibGVfcHRyKTsKLQllbHNlCi0JCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlLmxvZ19ldmVudF90YWJsZV9wdHIpOwotCi0JaWYgKG1vZGUgPT0gMCkKLQkJZXZlbnRfc2l6ZSA9IDIgKiBzaXplb2YodTMyKTsKLQllbHNlCi0JCWV2ZW50X3NpemUgPSAzICogc2l6ZW9mKHUzMik7Ci0KLQlwdHIgPSBiYXNlICsgRVZFTlRfU1RBUlRfT0ZGU0VUICsgKHN0YXJ0X2lkeCAqIGV2ZW50X3NpemUpOwotCi0JLyogInRpbWUiIGlzIGFjdHVhbGx5ICJkYXRhIiBmb3IgbW9kZSAwIChubyB0aW1lc3RhbXApLgotCSogcGxhY2UgZXZlbnQgaWQgIyBhdCBmYXIgcmlnaHQgZm9yIGVhc2llciB2aXN1YWwgcGFyc2luZy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2V2ZW50czsgaSsrKSB7Ci0JCWV2ID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgcHRyKTsKLQkJcHRyICs9IHNpemVvZih1MzIpOwotCQl0aW1lID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgcHRyKTsKLQkJcHRyICs9IHNpemVvZih1MzIpOwotCQlpZiAobW9kZSA9PSAwKSB7Ci0JCQkvKiBkYXRhLCBldiAqLwotCQkJSVdMX0VSUihwcml2LCAiRVZUX0xPRzoweCUwOHg6JTA0dVxuIiwgdGltZSwgZXYpOwotCQl9IGVsc2UgewotCQkJZGF0YSA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIHB0cik7Ci0JCQlwdHIgKz0gc2l6ZW9mKHUzMik7Ci0JCQlJV0xfRVJSKHByaXYsICJFVlRfTE9HVDolMDEwdToweCUwOHg6JTA0dVxuIiwKLQkJCQkJdGltZSwgZGF0YSwgZXYpOwotCQl9Ci0JfQotfQotCi12b2lkIGl3bF9kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBiYXNlOyAgICAgICAvKiBTUkFNIGJ5dGUgYWRkcmVzcyBvZiBldmVudCBsb2cgaGVhZGVyICovCi0JdTMyIGNhcGFjaXR5OyAgIC8qIGV2ZW50IGxvZyBjYXBhY2l0eSBpbiAjIGVudHJpZXMgKi8KLQl1MzIgbW9kZTsgICAgICAgLyogMCAtIG5vIHRpbWVzdGFtcCwgMSAtIHRpbWVzdGFtcCByZWNvcmRlZCAqLwotCXUzMiBudW1fd3JhcHM7ICAvKiAjIHRpbWVzIHVDb2RlIHdyYXBwZWQgdG8gdG9wIG9mIGxvZyAqLwotCXUzMiBuZXh0X2VudHJ5OyAvKiBpbmRleCBvZiBuZXh0IGVudHJ5IHRvIGJlIHdyaXR0ZW4gYnkgdUNvZGUgKi8KLQl1MzIgc2l6ZTsgICAgICAgLyogIyBlbnRyaWVzIHRoYXQgd2UnbGwgcHJpbnQgKi8KLQotCWlmIChwcml2LT51Y29kZV90eXBlID09IFVDT0RFX0lOSVQpCi0JCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQubG9nX2V2ZW50X3RhYmxlX3B0cik7Ci0JZWxzZQotCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5sb2dfZXZlbnRfdGFibGVfcHRyKTsKLQotCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+aXNfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIGV2ZW50IGxvZyBwb2ludGVyIDB4JTA4WFxuIiwgYmFzZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBldmVudCBsb2cgaGVhZGVyICovCi0JY2FwYWNpdHkgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBiYXNlKTsKLQltb2RlID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICgxICogc2l6ZW9mKHUzMikpKTsKLQludW1fd3JhcHMgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgKDIgKiBzaXplb2YodTMyKSkpOwotCW5leHRfZW50cnkgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgKDMgKiBzaXplb2YodTMyKSkpOwotCi0Jc2l6ZSA9IG51bV93cmFwcyA/IGNhcGFjaXR5IDogbmV4dF9lbnRyeTsKLQotCS8qIGJhaWwgb3V0IGlmIG5vdGhpbmcgaW4gbG9nICovCi0JaWYgKHNpemUgPT0gMCkgewotCQlJV0xfRVJSKHByaXYsICJTdGFydCBJV0wgRXZlbnQgTG9nIER1bXA6IG5vdGhpbmcgaW4gbG9nXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCUlXTF9FUlIocHJpdiwgIlN0YXJ0IElXTCBFdmVudCBMb2cgRHVtcDogZGlzcGxheSBjb3VudCAlZCwgd3JhcHMgJWRcbiIsCi0JCQlzaXplLCBudW1fd3JhcHMpOwotCi0JLyogaWYgdUNvZGUgaGFzIHdyYXBwZWQgYmFjayB0byB0b3Agb2YgbG9nLCBzdGFydCBhdCB0aGUgb2xkZXN0IGVudHJ5LAotCSAqIGkuZSB0aGUgbmV4dCBvbmUgdGhhdCB1Q29kZSB3b3VsZCBmaWxsLiAqLwotCWlmIChudW1fd3JhcHMpCi0JCWl3bF9wcmludF9ldmVudF9sb2cocHJpdiwgbmV4dF9lbnRyeSwKLQkJCQkJY2FwYWNpdHkgLSBuZXh0X2VudHJ5LCBtb2RlKTsKLQkvKiAodGhlbi9lbHNlKSBzdGFydCBhdCB0b3Agb2YgbG9nICovCi0JaXdsX3ByaW50X2V2ZW50X2xvZyhwcml2LCAwLCBuZXh0X2VudHJ5LCBtb2RlKTsKLQotfQogI2VuZGlmCiAvKioKICAqIGl3bF9pcnFfaGFuZGxlX2Vycm9yIC0gY2FsbGVkIGZvciBIVyBvciBTVyBlcnJvciBpbnRlcnJ1cHQgZnJvbSBjYXJkCkBAIC0xNTA2LDggKzEzMjQsOCBAQAogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKIAlpZiAoaXdsX2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIElXTF9ETF9GV19FUlJPUlMpIHsKLQkJaXdsX2R1bXBfbmljX2Vycm9yX2xvZyhwcml2KTsKLQkJaXdsX2R1bXBfbmljX2V2ZW50X2xvZyhwcml2KTsKKwkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9uaWNfZXJyb3JfbG9nKHByaXYpOworCQlwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX25pY19ldmVudF9sb2cocHJpdik7CiAJCWl3bF9wcmludF9yeF9jb25maWdfY21kKHByaXYpOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCmluZGV4IDdmZjlmZmIuLmU1MDEwM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKQEAgLTE2Niw2ICsxNjYsOCBAQAogCWludCAoKmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIpKHUzMiBhZGRyKTsKIAkvKiAxc3QgdWNvZGUgbG9hZCAqLwogCWludCAoKmxvYWRfdWNvZGUpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisJdm9pZCAoKmR1bXBfbmljX2V2ZW50X2xvZykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKKwl2b2lkICgqZHVtcF9uaWNfZXJyb3JfbG9nKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KIAlzdHJ1Y3QgaXdsX2FwbV9vcHMgYXBtX29wczsKIApAQCAtNTQwLDcgKzU0MiwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBFcnJvciBIYW5kbGluZyBEZWJ1Z2dpbmcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRwogdm9pZCBpd2xfZHVtcF9uaWNfZXZlbnRfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Cit2b2lkIGl3bF9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX2R1bXBfbmljX2V2ZW50X2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpd2xfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKK30KKyNlbmRpZgorCiB2b2lkIGl3bF9jbGVhcl9pc3Jfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMKaW5kZXggZmI4NDQ4NS4uYTE5OGJjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnZnMuYwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZfc2l6ZSAtIHBvcywgIjB4JS40eCAiLCBvZnMpOwogCQloZXhfZHVtcF90b19idWZmZXIocHRyICsgb2ZzLCAxNiAsIDE2LCAyLCBidWYgKyBwb3MsCiAJCQkJICAgYnVmX3NpemUgLSBwb3MsIDApOwotCQlwb3MgKz0gc3RybGVuKGJ1Zik7CisJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKIAkJaWYgKGJ1Zl9zaXplIC0gcG9zID4gMCkKIAkJCWJ1Zltwb3MrK10gPSAnXG4nOwogCX0KQEAgLTQzNiw3ICs0MzYsNyBAQAogCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmZXZlbnRfbG9nX2ZsYWcpICE9IDEpCiAJCXJldHVybiAtRUZBVUxUOwogCWlmIChldmVudF9sb2dfZmxhZyA9PSAxKQotCQlpd2xfZHVtcF9uaWNfZXZlbnRfbG9nKHByaXYpOworCQlwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX25pY19ldmVudF9sb2cocHJpdik7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC05MDksNyArOTA5LDcgQEAKIAkJCQkJCSIweCUuNHggIiwgb2ZzKTsKIAkJCQloZXhfZHVtcF90b19idWZmZXIocHRyICsgb2ZzLCAxNiwgMTYsIDIsCiAJCQkJCQkgICBidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAwKTsKLQkJCQlwb3MgKz0gc3RybGVuKGJ1Zik7CisJCQkJcG9zICs9IHN0cmxlbihidWYgKyBwb3MpOwogCQkJCWlmIChidWZzeiAtIHBvcyA+IDApCiAJCQkJCWJ1Zltwb3MrK10gPSAnXG4nOwogCQkJfQpAQCAtOTMyLDcgKzkzMiw3IEBACiAJCQkJCQkiMHglLjR4ICIsIG9mcyk7CiAJCQkJaGV4X2R1bXBfdG9fYnVmZmVyKHB0ciArIG9mcywgMTYsIDE2LCAyLAogCQkJCQkJICAgYnVmICsgcG9zLCBidWZzeiAtIHBvcywgMCk7Ci0JCQkJcG9zICs9IHN0cmxlbihidWYpOworCQkJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKIAkJCQlpZiAoYnVmc3ogLSBwb3MgPiAwKQogCQkJCQlidWZbcG9zKytdID0gJ1xuJzsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKaW5kZXggM2QyYjkzYS4uZTE0Yzk5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKQEAgLTQxMCw3ICs0MTAsNiBAQAogCQkJCQl1MTYgKnZhbGlkYmxvY2thZGRyKQogewogCXUxNiBuZXh0X2xpbmtfYWRkciA9IDAsIGxpbmtfdmFsdWUgPSAwLCB2YWxpZF9hZGRyOwotCWludCByZXQgPSAwOwogCWludCB1c2VkYmxvY2tzID0gMDsKIAogCS8qIHNldCBhZGRyZXNzaW5nIG1vZGUgdG8gYWJzb2x1dGUgdG8gdHJhdmVyc2UgdGhlIGxpbmsgbGlzdCAqLwpAQCAtNDMwLDI5ICs0MjksMjkgQEAKIAkJICogY2hlY2sgZm9yIG1vcmUgYmxvY2sgb24gdGhlIGxpbmsgbGlzdAogCQkgKi8KIAkJdmFsaWRfYWRkciA9IG5leHRfbGlua19hZGRyOwotCQluZXh0X2xpbmtfYWRkciA9IGxpbmtfdmFsdWU7CisJCW5leHRfbGlua19hZGRyID0gbGlua192YWx1ZSAqIHNpemVvZih1MTYpOwogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiT1RQIGJsb2NrcyAlZCBhZGRyIDB4JXhcbiIsCiAJCQkgICAgICAgdXNlZGJsb2NrcywgbmV4dF9saW5rX2FkZHIpOwogCQlpZiAoaXdsX3JlYWRfb3RwX3dvcmQocHJpdiwgbmV4dF9saW5rX2FkZHIsICZsaW5rX3ZhbHVlKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoIWxpbmtfdmFsdWUpIHsKIAkJCS8qCi0JCQkgKiByZWFjaCB0aGUgZW5kIG9mIGxpbmsgbGlzdCwKKwkJCSAqIHJlYWNoIHRoZSBlbmQgb2YgbGluayBsaXN0LCByZXR1cm4gc3VjY2VzcyBhbmQKIAkJCSAqIHNldCBhZGRyZXNzIHBvaW50IHRvIHRoZSBzdGFydGluZyBhZGRyZXNzCiAJCQkgKiBvZiB0aGUgaW1hZ2UKIAkJCSAqLwotCQkJZ290byBkb25lOworCQkJKnZhbGlkYmxvY2thZGRyID0gdmFsaWRfYWRkcjsKKwkJCS8qIHNraXAgZmlyc3QgMiBieXRlcyAobGluayBsaXN0IHBvaW50ZXIpICovCisJCQkqdmFsaWRibG9ja2FkZHIgKz0gMjsKKwkJCXJldHVybiAwOwogCQl9CiAJCS8qIG1vcmUgaW4gdGhlIGxpbmsgbGlzdCwgY29udGludWUgKi8KIAkJdXNlZGJsb2NrcysrOwotCX0gd2hpbGUgKHVzZWRibG9ja3MgPCBwcml2LT5jZmctPm1heF9sbF9pdGVtcyk7Ci0JLyogT1RQIGZ1bGwsIHVzZSBsYXN0IGJsb2NrICovCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIk9UUCBpcyBmdWxsLCB1c2UgbGFzdCBibG9ja1xuIik7Ci1kb25lOgotCSp2YWxpZGJsb2NrYWRkciA9IHZhbGlkX2FkZHI7Ci0JLyogc2tpcCBmaXJzdCAyIGJ5dGVzIChsaW5rIGxpc3QgcG9pbnRlcikgKi8KLQkqdmFsaWRibG9ja2FkZHIgKz0gMjsKLQlyZXR1cm4gcmV0OworCX0gd2hpbGUgKHVzZWRibG9ja3MgPD0gcHJpdi0+Y2ZnLT5tYXhfbGxfaXRlbXMpOworCisJLyogT1RQIGhhcyBubyB2YWxpZCBibG9ja3MgKi8KKwlJV0xfREVCVUdfSU5GTyhwcml2LCAiT1RQIGhhcyBubyB2YWxpZCBibG9ja3NcbiIpOworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKaW5kZXggNmI2OGRiNy4uODBiOWU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKQEAgLTIyMCwzNSArMjIwLDM1IEBACiAgKiBTZWN0aW9uIDEwOiAyLjQgR0h6IDQwTUh6IGNoYW5uZWxzOiAxMzIsIDQ0IChfYWJvdmVfKQogICovCiAvKiAyLjQgR0h6IGJhbmQ6IENDSyAqLwotI2RlZmluZSBFRVBST01fTEJfQ0NLXzIwX0NPTU1PTiAgICAgICAoKDB4QUEpXAorI2RlZmluZSBFRVBST01fTEJfQ0NLXzIwX0NPTU1PTiAgICAgICAoKDB4QTgpXAogCQl8IElORElSRUNUX0FERFJFU1MgfCBJTkRJUkVDVF9SRUdVTEFUT1JZKSAgIC8qIDggYnl0ZXMgKi8KIC8qIDIuNCBHSHogYmFuZDogMjBNSHotTGVnYWN5LCAyME1Iei1IVCwgNDBNSHotSFQgKi8KLSNkZWZpbmUgRUVQUk9NX0xCX09GRE1fQ09NTU9OICAgICAgICgoMHhCMilcCisjZGVmaW5lIEVFUFJPTV9MQl9PRkRNX0NPTU1PTiAgICAgICAoKDB4QjApXAogCQl8IElORElSRUNUX0FERFJFU1MgfCBJTkRJUkVDVF9SRUdVTEFUT1JZKSAgIC8qIDI0IGJ5dGVzICovCiAvKiA1LjIgR0h6IGJhbmQ6IDIwTUh6LUxlZ2FjeSwgMjBNSHotSFQsIDQwTUh6LUhUICovCi0jZGVmaW5lIEVFUFJPTV9IQl9PRkRNX0NPTU1PTiAgICAgICAoKDB4Q0EpXAorI2RlZmluZSBFRVBST01fSEJfT0ZETV9DT01NT04gICAgICAgKCgweEM4KVwKIAkJfCBJTkRJUkVDVF9BRERSRVNTIHwgSU5ESVJFQ1RfUkVHVUxBVE9SWSkgICAvKiAyNCBieXRlcyAqLwogLyogMi40R0h6IGJhbmQgY2hhbm5lbHM6CiAgKgkxTGVnYWN5LCAxSFQsIDJMZWdhY3ksIDJIVCwgMTBMZWdhY3ksIDEwSFQsIDExTGVnYWN5LCAxMUhUICovCi0jZGVmaW5lIEVFUFJPTV9MQl9PRkRNXzIwX0JBTkQgICAgICAgKCgweEUyKVwKKyNkZWZpbmUgRUVQUk9NX0xCX09GRE1fMjBfQkFORCAgICAgICAoKDB4RTApXAogCQl8IElORElSRUNUX0FERFJFU1MgfCBJTkRJUkVDVF9SRUdVTEFUT1JZKSAgIC8qIDY0IGJ5dGVzICovCiAvKiAyLjQgR0h6IGJhbmQgSFQ0MCBjaGFubmVsczogKDEsKzEpICgyLCsxKSAoNiwrMSkgKDcsKzEpICg5LCsxKSAqLwotI2RlZmluZSBFRVBST01fTEJfT0ZETV9IVDQwX0JBTkQgICAgICAgKCgweDEyMilcCisjZGVmaW5lIEVFUFJPTV9MQl9PRkRNX0hUNDBfQkFORCAgICAgICAoKDB4MTIwKVwKIAkJfCBJTkRJUkVDVF9BRERSRVNTIHwgSU5ESVJFQ1RfUkVHVUxBVE9SWSkgICAvKiA0MCBieXRlcyAqLwogLyogNS4yR0h6IGJhbmQgY2hhbm5lbHM6IDM2TGVnYWN5LCAzNkhULCA2NExlZ2FjeSwgNjRIVCwgMTAwTGVnYWN5LCAxMDBIVCAqLwotI2RlZmluZSBFRVBST01fSEJfT0ZETV8yMF9CQU5EICAgICAgICgoMHgxNEEpXAorI2RlZmluZSBFRVBST01fSEJfT0ZETV8yMF9CQU5EICAgICAgICgoMHgxNDgpXAogCQl8IElORElSRUNUX0FERFJFU1MgfCBJTkRJUkVDVF9SRUdVTEFUT1JZKSAgIC8qIDQ4IGJ5dGVzICovCiAvKiA1LjIgR0h6IGJhbmQgSFQ0MCBjaGFubmVsczogKDM2LCsxKSAoNjAsKzEpICgxMDAsKzEpICovCi0jZGVmaW5lIEVFUFJPTV9IQl9PRkRNX0hUNDBfQkFORCAgICAgICAoKDB4MTdBKVwKKyNkZWZpbmUgRUVQUk9NX0hCX09GRE1fSFQ0MF9CQU5EICAgICAgICgoMHgxNzgpXAogCQl8IElORElSRUNUX0FERFJFU1MgfCBJTkRJUkVDVF9SRUdVTEFUT1JZKSAgIC8qIDI0IGJ5dGVzICovCiAvKiAyLjQgR0h6IGJhbmQsIGNoYW5ubmVsIDEzOiBMZWdhY3ksIEhUICovCi0jZGVmaW5lIEVFUFJPTV9MQl9PRkRNXzIwX0NIQU5ORUxfMTMgICAgICAgKCgweDE5MilcCisjZGVmaW5lIEVFUFJPTV9MQl9PRkRNXzIwX0NIQU5ORUxfMTMgICAgICAgKCgweDE5MClcCiAJCXwgSU5ESVJFQ1RfQUREUkVTUyB8IElORElSRUNUX1JFR1VMQVRPUlkpICAgLyogMTYgYnl0ZXMgKi8KIC8qIDUuMiBHSHogYmFuZCwgY2hhbm5uZWwgMTQwOiBMZWdhY3ksIEhUICovCi0jZGVmaW5lIEVFUFJPTV9IQl9PRkRNXzIwX0NIQU5ORUxfMTQwICAgICAgICgoMHgxQTIpXAorI2RlZmluZSBFRVBST01fSEJfT0ZETV8yMF9DSEFOTkVMXzE0MCAgICAgICAoKDB4MUEwKVwKIAkJfCBJTkRJUkVDVF9BRERSRVNTIHwgSU5ESVJFQ1RfUkVHVUxBVE9SWSkgICAvKiAxNiBieXRlcyAqLwogLyogNS4yIEdIeiBiYW5kLCBIVDQwIGNoYW5ubmVscyAoMTMyLCsxKSAoNDQsKzEpICovCi0jZGVmaW5lIEVFUFJPTV9IQl9PRkRNX0hUNDBfQkFORF8xICAgICAgICgoMHgxQjIpXAorI2RlZmluZSBFRVBST01fSEJfT0ZETV9IVDQwX0JBTkRfMSAgICAgICAoKDB4MUIwKVwKIAkJfCBJTkRJUkVDVF9BRERSRVNTIHwgSU5ESVJFQ1RfUkVHVUxBVE9SWSkgICAvKiAxNiBieXRlcyAqLwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhjbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhjbWQuYwppbmRleCA1MzJjOGQ2Li5hNjg1NmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1oY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGNtZC5jCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCiAjaW5jbHVkZSAiaXdsLWRldi5oIiAvKiBGSVhNRTogcmVtb3ZlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYwppbmRleCBiOTBhZGNiLi40OTM2MjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXJ4LmMKQEAgLTI1MCwxMiArMjUwLDIwIEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CiAKKwkJaWYgKHJ4cS0+ZnJlZV9jb3VudCA+IFJYX0xPV19XQVRFUk1BUkspCisJCQlwcmlvcml0eSB8PSBfX0dGUF9OT1dBUk47CiAJCS8qIEFsbG9jIGEgbmV3IHJlY2VpdmUgYnVmZmVyICovCiAJCXNrYiA9IGFsbG9jX3NrYihwcml2LT5od19wYXJhbXMucnhfYnVmX3NpemUgKyAyNTYsCiAJCQkJCQlwcmlvcml0eSk7CiAKIAkJaWYgKCFza2IpIHsKLQkJCUlXTF9DUklUKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIFNLQiBidWZmZXJzXG4iKTsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBTS0IgYnVmZmVyLlxuIik7CisJCQlpZiAoKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKSAmJgorCQkJICAgIG5ldF9yYXRlbGltaXQoKSkKKwkJCQlJV0xfQ1JJVChwcml2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFNLQiBidWZmZXIgd2l0aCAlcy4gT25seSAldSBmcmVlIGJ1ZmZlcnMgcmVtYWluaW5nLlxuIiwKKwkJCQkJIHByaW9yaXR5ID09IEdGUF9BVE9NSUMgPyAgIkdGUF9BVE9NSUMiIDogIkdGUF9LRVJORUwiLAorCQkJCQkgcnhxLT5mcmVlX2NvdW50KTsKIAkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCiAJCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKIAkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLwpAQCAtMTAzNiw3ICsxMDQ0LDcgQEAKIAkgKiBhcyBhIGJpdG1hc2suCiAJICovCiAJcnhfc3RhdHVzLmFudGVubmEgPQotCQlsZTE2X3RvX2NwdShwaHlfcmVzLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX0FOVEVOTkFfTVNLKQorCQkobGUxNl90b19jcHUocGh5X3Jlcy0+cGh5X2ZsYWdzKSAmIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spCiAJCT4+IFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9QT1M7CiAKIAkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKaW5kZXggYTJiOWVjOC4uYzY2MzNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBSRVBMWV9XRVBLRVksCiAJCS5kYXRhID0gd2VwX2NtZCwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCisJCS5mbGFncyA9IENNRF9BU1lOQywKIAl9OwogCiAJbWVtc2V0KHdlcF9jbWQsIDAsIGNtZF9zaXplICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10eC5jCmluZGV4IGE3NDIyZTUuLmZiOWJjZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYwpAQCAtMjgsNiArMjgsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgIml3bC1lZXByb20uaCIKICNpbmNsdWRlICJpd2wtZGV2LmgiCkBAIC0xOTcsNiArMTk4LDEyIEBACiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCBwcml2LT5od19wYXJhbXMudGZkX3NpemUgKgogCQkJCSAgICB0eHEtPnEubl9iZCwgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOwogCisJLyogZGVhbGxvY2F0ZSBhcnJheXMgKi8KKwlrZnJlZSh0eHEtPmNtZCk7CisJa2ZyZWUodHhxLT5tZXRhKTsKKwl0eHEtPmNtZCA9IE5VTEw7CisJdHhxLT5tZXRhID0gTlVMTDsKKwogCS8qIDAtZmlsbCBxdWV1ZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwogCW1lbXNldCh0eHEsIDAsIHNpemVvZigqdHhxKSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bDM5NDUtYmFzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wzOTQ1LWJhc2UuYwppbmRleCAwOTA5NjY4Li5kMDBhODAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bDM5NDUtYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsMzk0NS1iYXNlLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgpAQCAtMTE0NiwxMSArMTE0NywxOCBAQAogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwogCisJCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQorCQkJcHJpb3JpdHkgfD0gX19HRlBfTk9XQVJOOwogCQkvKiBBbGxvYyBhIG5ldyByZWNlaXZlIGJ1ZmZlciAqLwogCQlza2IgPSBhbGxvY19za2IocHJpdi0+aHdfcGFyYW1zLnJ4X2J1Zl9zaXplLCBwcmlvcml0eSk7CiAJCWlmICghc2tiKSB7CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCUlXTF9DUklUKHByaXYsICI6IENhbiBub3QgYWxsb2NhdGUgU0tCIGJ1ZmZlcnNcbiIpOworCQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgU0tCIGJ1ZmZlci5cbiIpOworCQkJaWYgKChyeHEtPmZyZWVfY291bnQgPD0gUlhfTE9XX1dBVEVSTUFSSykgJiYKKwkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpCisJCQkJSVdMX0NSSVQocHJpdiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBTS0IgYnVmZmVyIHdpdGggJXMuIE9ubHkgJXUgZnJlZSBidWZmZXJzIHJlbWFpbmluZy5cbiIsCisJCQkJCSBwcmlvcml0eSA9PSBHRlBfQVRPTUlDID8gICJHRlBfQVRPTUlDIiA6ICJHRlBfS0VSTkVMIiwKKwkJCQkJIHJ4cS0+ZnJlZV9jb3VudCk7CiAJCQkvKiBXZSBkb24ndCByZXNjaGVkdWxlIHJlcGxlbmlzaCB3b3JrIGhlcmUgLS0gd2Ugd2lsbAogCQkJICogY2FsbCB0aGUgcmVzdG9jayBtZXRob2QgYW5kIGlmIGl0IHN0aWxsIG5lZWRzCiAJCQkgKiBtb3JlIGJ1ZmZlcnMgaXQgd2lsbCBzY2hlZHVsZSByZXBsZW5pc2ggKi8KQEAgLTE0NzQsNiArMTQ4Miw3IEBACiAJdGFza2xldF9raWxsKCZwcml2LT5pcnFfdGFza2xldCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRwogc3RhdGljIGNvbnN0IGNoYXIgKmRlc2NfbG9va3VwKGludCBpKQogewogCXN3aXRjaCAoaSkgewpAQCAtMTQ5Nyw3ICsxNTA2LDcgQEAKICNkZWZpbmUgRVJST1JfU1RBUlRfT0ZGU0VUICAoMSAqIHNpemVvZih1MzIpKQogI2RlZmluZSBFUlJPUl9FTEVNX1NJWkUgICAgICg3ICogc2l6ZW9mKHUzMikpCiAKLXN0YXRpYyB2b2lkIGl3bDM5NDVfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3ZvaWQgaXdsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCXUzMiBpOwogCXUzMiBkZXNjLCB0aW1lLCBjb3VudCwgYmFzZSwgZGF0YTE7CkBAIC0xNTkxLDcgKzE2MDAsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaXdsMzk0NV9kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQordm9pZCBpd2wzOTQ1X2R1bXBfbmljX2V2ZW50X2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJdTMyIGJhc2U7ICAgICAgIC8qIFNSQU0gYnl0ZSBhZGRyZXNzIG9mIGV2ZW50IGxvZyBoZWFkZXIgKi8KIAl1MzIgY2FwYWNpdHk7ICAgLyogZXZlbnQgbG9nIGNhcGFjaXR5IGluICMgZW50cmllcyAqLwpAQCAtMTYzMyw2ICsxNjQyLDE2IEBACiAJaXdsMzk0NV9wcmludF9ldmVudF9sb2cocHJpdiwgMCwgbmV4dF9lbnRyeSwgbW9kZSk7CiAKIH0KKyNlbHNlCit2b2lkIGl3bDM5NDVfZHVtcF9uaWNfZXZlbnRfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKK30KKwordm9pZCBpd2wzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7Cit9CisKKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBpd2wzOTQ1X2lycV90YXNrbGV0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKQEAgLTM2NzYsMjEgKzM2OTUsNiBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoZHVtcF9lcnJvcnMsIFNfSVdVU1IsIE5VTEwsIGR1bXBfZXJyb3JfbG9nKTsKIAotc3RhdGljIHNzaXplX3QgZHVtcF9ldmVudF9sb2coc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKLQotCWlmIChwWzBdID09ICcxJykKLQkJaXdsMzk0NV9kdW1wX25pY19ldmVudF9sb2cocHJpdik7Ci0KLQlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGR1bXBfZXZlbnRzLCBTX0lXVVNSLCBOVUxMLCBkdW1wX2V2ZW50X2xvZyk7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIGRyaXZlciBzZXR1cCBhbmQgdGVhciBkb3duCkBAIC0zNzM1LDcgKzM3MzksNiBAQAogCSZkZXZfYXR0cl9hbnRlbm5hLmF0dHIsCiAJJmRldl9hdHRyX2NoYW5uZWxzLmF0dHIsCiAJJmRldl9hdHRyX2R1bXBfZXJyb3JzLmF0dHIsCi0JJmRldl9hdHRyX2R1bXBfZXZlbnRzLmF0dHIsCiAJJmRldl9hdHRyX2ZsYWdzLmF0dHIsCiAJJmRldl9hdHRyX2ZpbHRlcl9mbGFncy5hdHRyLAogI2lmZGVmIENPTkZJR19JV0wzOTQ1X1NQRUNUUlVNX01FQVNVUkVNRU5UCkBAIC00MDk0LDggKzQwOTcsOCBAQAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAgb3V0X2llZWU4MDIxMV9mcmVlX2h3OgotCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKIAlpd2xfZnJlZV90cmFmZmljX21lbShwcml2KTsKKwlpZWVlODAyMTFfZnJlZV9odyhwcml2LT5odyk7CiAgb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCmluZGV4IGE1NmEyYjAuLmYzYzU1NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jb21tYW5kcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NvbW1hbmRzLmMKaW5kZXggMjNiNTJmYS4uODQxNThiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NvbW1hbmRzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NvbW1hbmRzLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgIml3bS5oIgogI2luY2x1ZGUgImJ1cy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9tYWluLmMKaW5kZXggZDY2OGU0Ny4uMjIyZWIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvbWFpbi5jCkBAIC0zOCw2ICszOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMKaW5kZXggNDBkYmNiYy4uNzcxYTMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMKQEAgLTM4LDYgKzM4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwppbmRleCA2ODUwOTgxLi4wYTMyNGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgPG5ldC9saWI4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJob3N0LmgiCiAjaW5jbHVkZSAiaG9zdGNtZC5oIgogI2luY2x1ZGUgImRlY2wuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYwppbmRleCBjNDJkM2ZhLi4yM2Y2ODQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kcmVzcC5jCkBAIC0zLDYgKzMsNyBAQAogICAqIHJlc3BvbnNlcyBhcyB3ZWxsIGFzIGV2ZW50cyBnZW5lcmF0ZWQgYnkgZmlybXdhcmUuCiAgICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKaW5kZXggY2I4YmU4ZC4uNWIzNjcyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogc3RhdGljIGludCBzcHVfd3JpdGUoc3RydWN0IGlmX3NwaV9jYXJkICpjYXJkLCB1MTYgcmVnLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQogewogCWludCBlcnIgPSAwOwotCXUxNiByZWdfb3V0ID0gY3B1X3RvX2xlMTYocmVnIHwgSUZfU1BJX1dSSVRFX09QRVJBVElPTl9NQVNLKTsKKwlfX2xlMTYgcmVnX291dCA9IGNwdV90b19sZTE2KHJlZyB8IElGX1NQSV9XUklURV9PUEVSQVRJT05fTUFTSyk7CiAJc3RydWN0IHNwaV9tZXNzYWdlIG07CiAJc3RydWN0IHNwaV90cmFuc2ZlciByZWdfdHJhbnM7CiAJc3RydWN0IHNwaV90cmFuc2ZlciBkYXRhX3RyYW5zOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHNwdV93cml0ZV91MTYoc3RydWN0IGlmX3NwaV9jYXJkICpjYXJkLCB1MTYgcmVnLCB1MTYgdmFsKQogewotCXUxNiBidWZmOworCV9fbGUxNiBidWZmOwogCiAJYnVmZiA9IGNwdV90b19sZTE2KHZhbCk7CiAJcmV0dXJuIHNwdV93cml0ZShjYXJkLCByZWcsICh1OCAqKSZidWZmLCBzaXplb2YodTE2KSk7CkBAIC0xODgsNyArMTg4LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgZGVsYXk7CiAJaW50IGVyciA9IDA7Ci0JdTE2IHJlZ19vdXQgPSBjcHVfdG9fbGUxNihyZWcgfCBJRl9TUElfUkVBRF9PUEVSQVRJT05fTUFTSyk7CisJX19sZTE2IHJlZ19vdXQgPSBjcHVfdG9fbGUxNihyZWcgfCBJRl9TUElfUkVBRF9PUEVSQVRJT05fTUFTSyk7CiAJc3RydWN0IHNwaV9tZXNzYWdlIG07CiAJc3RydWN0IHNwaV90cmFuc2ZlciByZWdfdHJhbnM7CiAJc3RydWN0IHNwaV90cmFuc2ZlciBkdW1teV90cmFuczsKQEAgLTIzNSw3ICsyMzUsNyBAQAogLyogUmVhZCAxNiBiaXRzIGZyb20gYW4gU1BJIHJlZ2lzdGVyICovCiBzdGF0aWMgaW5saW5lIGludCBzcHVfcmVhZF91MTYoc3RydWN0IGlmX3NwaV9jYXJkICpjYXJkLCB1MTYgcmVnLCB1MTYgKnZhbCkKIHsKLQl1MTYgYnVmOworCV9fbGUxNiBidWY7CiAJaW50IHJldDsKIAogCXJldCA9IHNwdV9yZWFkKGNhcmQsIHJlZywgKHU4ICopJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAgKiBUaGUgbG93IDE2IGJpdHMgYXJlIHJlYWQgZmlyc3QuICovCiBzdGF0aWMgaW50IHNwdV9yZWFkX3UzMihzdHJ1Y3QgaWZfc3BpX2NhcmQgKmNhcmQsIHUxNiByZWcsIHUzMiAqdmFsKQogewotCXUzMiBidWY7CisJX19sZTMyIGJ1ZjsKIAlpbnQgZXJyOwogCiAJZXJyID0gc3B1X3JlYWQoY2FyZCwgcmVnLCAodTggKikmYnVmLCBzaXplb2YoYnVmKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCmluZGV4IDkyYmM4YzUuLjNmYWM0ZWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl91c2IuYwpAQCAtNTA4LDcgKzUwOCw3IEBACiAJLyogRmlsbCB0aGUgcmVjZWl2ZSBjb25maWd1cmF0aW9uIFVSQiBhbmQgaW5pdGlhbGlzZSB0aGUgUnggY2FsbCBiYWNrICovCiAJdXNiX2ZpbGxfYnVsa191cmIoY2FyZHAtPnJ4X3VyYiwgY2FyZHAtPnVkZXYsCiAJCQkgIHVzYl9yY3ZidWxrcGlwZShjYXJkcC0+dWRldiwgY2FyZHAtPmVwX2luKSwKLQkJCSAgKHZvaWQgKikgKHNrYi0+dGFpbCArIChzaXplX3QpIElQRklFTERfQUxJR05fT0ZGU0VUKSwKKwkJCSAgc2tiLT5kYXRhICsgSVBGSUVMRF9BTElHTl9PRkZTRVQsCiAJCQkgIE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFLCBjYWxsYmFja2ZuLAogCQkJICBjYXJkcCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eC5jCmluZGV4IDRjMDE4ZjcuLjhjMzc2NmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKQEAgLTMsNiArMyw3IEBACiAgICovCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAiaG9zdGNtZC5oIgogI2luY2x1ZGUgInJhZGlvdGFwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYwppbmRleCA4OTZmNTMyLi4zOGNmZDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKQEAgLTYzMSw2ICs2MzEsOSBAQAogCQlkYXRhLT5iZWFjb25faW50ID0gMTAyNCAqIGluZm8tPmJlYWNvbl9pbnQgLyAxMDAwICogSFogLyAxMDAwOwogCQlpZiAoV0FSTl9PTighZGF0YS0+YmVhY29uX2ludCkpCiAJCQlkYXRhLT5iZWFjb25faW50ID0gMTsKKwkJaWYgKGRhdGEtPnN0YXJ0ZWQpCisJCQltb2RfdGltZXIoJmRhdGEtPmJlYWNvbl90aW1lciwKKwkJCQkgIGppZmZpZXMgKyBkYXRhLT5iZWFjb25faW50KTsKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKaW5kZXggNGM5N2M2YS4uYmMwODQ2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jCmluZGV4IGUyNmQ3YjMuLjI1MDViZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwppbmRleCBmN2M2NzdlLi42OWQyZjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCmluZGV4IDg4Y2Q1OGUuLjFjODhjMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCkBAIC0yODc5LDcgKzI4NzksNyBAQAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKIAlzdGF0aWMgY2hhciBwcm9jX2Vzc2lkWzMzXTsKLQlpbnQgbGVuID0gY291bnQ7CisJdW5zaWduZWQgaW50IGxlbiA9IGNvdW50OwogCiAJaWYgKGxlbiA+IDMyKQogCQlsZW4gPSAzMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYwppbmRleCBhMDg0MDc3Li45ZmU3NzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jCkBAIC0xOTk0LDcgKzE5OTQsNyBAQAogCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhXSV9XMV9CV19XSU5fU0laRSwgdHhkZXNjLT5iYV9zaXplKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYV0lfVzFfV0lSRUxFU1NfQ0xJX0lELAogCQkJICAgdGVzdF9iaXQoRU5UUllfVFhEX0VOQ1JZUFQsICZ0eGRlc2MtPmZsYWdzKSA/Ci0JCQkgICAgICAgKHNrYmRlc2MtPmVudHJ5LT5lbnRyeV9pZHggKyAxKSA6IDB4ZmYpOworCQkJICAgdHhkZXNjLT5rZXlfaWR4IDogMHhmZik7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWFdJX1cxX01QRFVfVE9UQUxfQllURV9DT1VOVCwKIAkJCSAgIHNrYi0+bGVuIC0gdHhkZXNjLT5sMnBhZCk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWFdJX1cxX1BBQ0tFVElELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGVidWcuYwppbmRleCA3YjNlZThjLi42OGJjOWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGVidWcuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgInJ0MngwMC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGxpYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGxpYi5oCmluZGV4IDU0NjJjYjUuLjU2N2YwMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaWIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmgKQEAgLTM4MCw3ICszODAsNyBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnQyeDAwY3J5cHRvX3J4X2luc2VydF9pdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGwycGFkLAorc3RhdGljIGlubGluZSB2b2lkIHJ0MngwMGNyeXB0b19yeF9pbnNlcnRfaXYoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgICB1bnNpZ25lZCBpbnQgaGVhZGVyX2xlbmd0aCwKIAkJCQkJICAgICBzdHJ1Y3Qgcnhkb25lX2VudHJ5X2Rlc2MgKnJ4ZGVzYykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCmluZGV4IDFjYmQ5YjQuLjE0ZTdiYjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMKQEAgLTIzODEsNiArMjM4MSw3IEBACiAJLyogSHVhd2VpLTNDb20gKi8KIAl7IFVTQl9ERVZJQ0UoMHgxNDcyLCAweDAwMDkpLCBVU0JfREVWSUNFX0RBVEEoJnJ0NzN1c2Jfb3BzKSB9LAogCS8qIEhlcmN1bGVzICovCisJeyBVU0JfREVWSUNFKDB4MDZmOCwgMHhlMDAyKSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNmY4LCAweGUwMTApLCBVU0JfREVWSUNFX0RBVEEoJnJ0NzN1c2Jfb3BzKSB9LAogCXsgVVNCX0RFVklDRSgweDA2ZjgsIDB4ZTAyMCksIFVTQl9ERVZJQ0VfREFUQSgmcnQ3M3VzYl9vcHMpIH0sCiAJLyogTGlua3N5cyAqLwpAQCAtMjM4OCwxMCArMjM4OSwxMyBAQAogCXsgVVNCX0RFVklDRSgweDEzYjEsIDB4MDAyMyksIFVTQl9ERVZJQ0VfREFUQSgmcnQ3M3VzYl9vcHMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MTNiMSwgMHgwMDI4KSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKIAkvKiBNU0kgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwZGIwLCAweDQ2MDApLCBVU0JfREVWSUNFX0RBVEEoJnJ0NzN1c2Jfb3BzKSB9LAogCXsgVVNCX0RFVklDRSgweDBkYjAsIDB4Njg3NyksIFVTQl9ERVZJQ0VfREFUQSgmcnQ3M3VzYl9vcHMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MGRiMCwgMHg2ODc0KSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwZGIwLCAweGE4NjEpLCBVU0JfREVWSUNFX0RBVEEoJnJ0NzN1c2Jfb3BzKSB9LAogCXsgVVNCX0RFVklDRSgweDBkYjAsIDB4YTg3NCksIFVTQl9ERVZJQ0VfREFUQSgmcnQ3M3VzYl9vcHMpIH0sCisJLyogT3Zpc2xpbmsgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxYjc1LCAweDczMTgpLCBVU0JfREVWSUNFX0RBVEEoJnJ0NzN1c2Jfb3BzKSB9LAogCS8qIFJhbGluayAqLwogCXsgVVNCX0RFVklDRSgweDA0YmIsIDB4MDkzZCksIFVTQl9ERVZJQ0VfREFUQSgmcnQ3M3VzYl9vcHMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MTQ4ZiwgMHgyNTczKSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKQEAgLTI0MTksNiArMjQyMyw4IEBACiAJLyogUGxhbmV4ICovCiAJeyBVU0JfREVWSUNFKDB4MjAxOSwgMHhhYjAxKSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKIAl7IFVTQl9ERVZJQ0UoMHgyMDE5LCAweGFiNTApLCBVU0JfREVWSUNFX0RBVEEoJnJ0NzN1c2Jfb3BzKSB9LAorCS8qIFdpZGVUZWxsICovCisJeyBVU0JfREVWSUNFKDB4NzE2NywgMHgzODQwKSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKIAkvKiBaY29tICovCiAJeyBVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDFjKSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKIAkvKiBaeVhFTCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZwppbmRleCA3YjE0ZDViLi44ODA2MGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKIG1lbnVjb25maWcgV0wxMlhYCi0JYm9vbGVhbiAiVEkgd2wxMnh4IGRyaXZlciBzdXBwb3J0IgorCXRyaXN0YXRlICJUSSB3bDEyeHggZHJpdmVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBXTEFOXzgwMjExICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgd2lsbCBlbmFibGUgVEkgd2wxMnh4IGRyaXZlciBzdXBwb3J0LiBUaGUgZHJpdmVycyBtYWtlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCmluZGV4IDM4Njg4ODQuLjIzYTZhNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCkBAIC0xMDcwLDcgKzEwNzAsNyBAQAogCiAJLyogRmluZCBidWxrIG91dCBlbmRwb2ludCAqLwogCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50WzFdLmRlc2M7Ci0JaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9UWVBFX01BU0spID09IFVTQl9ESVJfT1VUICYmCisJaWYgKHVzYl9lbmRwb2ludF9kaXJfb3V0KGVuZHBvaW50KSAmJgogCSAgICB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVuZHBvaW50KSkgewogCQlidWxrX291dF9lcCA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94aWxpbnhfZW1hY2xpdGUuYyBiL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCmluZGV4IGRjMjI3ODIuLjgzYTA0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCisrKyBiL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCkBAIC0xMzQsMTggKzEzNCwxNSBAQAogCX0KIAogCS8qIEVuYWJsZSB0aGUgUnggaW50ZXJydXB0cyBmb3IgdGhlIGZpcnN0IGJ1ZmZlciAqLwotCXJlZ19kYXRhID0gaW5fYmUzMihkcnZkYXRhLT5iYXNlX2FkZHIgKyBYRUxfUlNSX09GRlNFVCk7CiAJb3V0X2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyICsgWEVMX1JTUl9PRkZTRVQsCi0JCSByZWdfZGF0YSB8IFhFTF9SU1JfUkVDVl9JRV9NQVNLKTsKKwkJIFhFTF9SU1JfUkVDVl9JRV9NQVNLKTsKIAogCS8qIEVuYWJsZSB0aGUgUnggaW50ZXJydXB0cyBmb3IgdGhlIHNlY29uZCBCdWZmZXIgaWYKIAkgKiBjb25maWd1cmVkIGluIEhXICovCiAJaWYgKGRydmRhdGEtPnJ4X3BpbmdfcG9uZyAhPSAwKSB7Ci0JCXJlZ19kYXRhID0gaW5fYmUzMihkcnZkYXRhLT5iYXNlX2FkZHIgKyBYRUxfQlVGRkVSX09GRlNFVCArCi0JCQkJICAgWEVMX1JTUl9PRkZTRVQpOwogCQlvdXRfYmUzMihkcnZkYXRhLT5iYXNlX2FkZHIgKyBYRUxfQlVGRkVSX09GRlNFVCArCiAJCQkgWEVMX1JTUl9PRkZTRVQsCi0JCQkgcmVnX2RhdGEgfCBYRUxfUlNSX1JFQ1ZfSUVfTUFTSyk7CisJCQkgWEVMX1JTUl9SRUNWX0lFX01BU0spOwogCX0KIAogCS8qIEVuYWJsZSB0aGUgR2xvYmFsIEludGVycnVwdCBFbmFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3puZXQuYyBiL2RyaXZlcnMvbmV0L3puZXQuYwppbmRleCBhMDM4NGI2Li5iNDIzNDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC96bmV0LmMKKysrIGIvZHJpdmVycy9uZXQvem5ldC5jCkBAIC0xNjksNyArMTY5LDYgQEAKIHN0YXRpYyBpbnQgem5ldF9yZXF1ZXN0X3Jlc291cmNlcyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHJlcXVlc3RfaXJxIChkZXYtPmlycSwgJnpuZXRfaW50ZXJydXB0LCAwLCAiWk5ldCIsIGRldikpCiAJCWdvdG8gZmFpbGVkOwpAQCAtMTg3LDEzICsxODYsOSBAQAogIGZyZWVfc2lhOgogCXJlbGVhc2VfcmVnaW9uICh6bmV0LT5zaWFfYmFzZSwgem5ldC0+c2lhX3NpemUpOwogIGZyZWVfdHhfZG1hOgotCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKIAlmcmVlX2RtYSAoem5ldC0+dHhfZG1hKTsKLQlyZWxlYXNlX2RtYV9sb2NrIChmbGFncyk7CiAgZnJlZV9yeF9kbWE6Ci0JZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwogCWZyZWVfZG1hICh6bmV0LT5yeF9kbWEpOwotCXJlbGVhc2VfZG1hX2xvY2sgKGZsYWdzKTsKICBmcmVlX2lycToKIAlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CiAgZmFpbGVkOgpAQCAtMjAzLDE0ICsxOTgsMTEgQEAKIHN0YXRpYyB2b2lkIHpuZXRfcmVsZWFzZV9yZXNvdXJjZXMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJlbGVhc2VfcmVnaW9uICh6bmV0LT5zaWFfYmFzZSwgem5ldC0+c2lhX3NpemUpOwogCXJlbGVhc2VfcmVnaW9uIChkZXYtPmJhc2VfYWRkciwgem5ldC0+aW9fc2l6ZSk7Ci0JZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwogCWZyZWVfZG1hICh6bmV0LT50eF9kbWEpOwogCWZyZWVfZG1hICh6bmV0LT5yeF9kbWEpOwotCXJlbGVhc2VfZG1hX2xvY2sgKGZsYWdzKTsKIAlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfbWRpby5jIGIvZHJpdmVycy9vZi9vZl9tZGlvLmMKaW5kZXggYmFjYWE1My4uNGIyMmJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9vZl9tZGlvLmMKKysrIGIvZHJpdmVycy9vZi9vZl9tZGlvLmMKQEAgLTk3LDYgKzk3LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX21kaW9idXNfcmVnaXN0ZXIpOwogCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIG9mX3BoeV9maW5kX2RldmljZSAqLworc3RhdGljIGludCBvZl9waHlfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwaHlfbnApCit7CisJcmV0dXJuIGRldl9hcmNoZGF0YV9nZXRfbm9kZSgmZGV2LT5hcmNoZGF0YSkgPT0gcGh5X25wOworfQorCiAvKioKICAqIG9mX3BoeV9maW5kX2RldmljZSAtIEdpdmUgYSBQSFkgbm9kZSwgZmluZCB0aGUgcGh5X2RldmljZQogICogQHBoeV9ucDogUG9pbnRlciB0byB0aGUgcGh5J3MgZGV2aWNlIHRyZWUgbm9kZQpAQCAtMTA2LDE1ICsxMTIsMTAgQEAKIHN0cnVjdCBwaHlfZGV2aWNlICpvZl9waHlfZmluZF9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlICpwaHlfbnApCiB7CiAJc3RydWN0IGRldmljZSAqZDsKLQlpbnQgbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwaHlfbnApCi0JewotCQlyZXR1cm4gZGV2X2FyY2hkYXRhX2dldF9ub2RlKCZkZXYtPmFyY2hkYXRhKSA9PSBwaHlfbnA7Ci0JfQotCiAJaWYgKCFwaHlfbnApCiAJCXJldHVybiBOVUxMOwogCi0JZCA9IGJ1c19maW5kX2RldmljZSgmbWRpb19idXNfdHlwZSwgTlVMTCwgcGh5X25wLCBtYXRjaCk7CisJZCA9IGJ1c19maW5kX2RldmljZSgmbWRpb19idXNfdHlwZSwgTlVMTCwgcGh5X25wLCBvZl9waHlfbWF0Y2gpOwogCXJldHVybiBkID8gdG9fcGh5X2RldmljZShkKSA6IE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKG9mX3BoeV9maW5kX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMgYi9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKaW5kZXggODU3NDYyMi4uYzllMmFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwpAQCAtMTU0LDkgKzE1NCw4IEBACiB7CiAJaW50IGVycjsKIAotCWlmICghYWxsb2NfY3B1bWFza192YXIoJm1hcmtlZF9jcHVzLCBHRlBfS0VSTkVMKSkKKwlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmbWFya2VkX2NwdXMsIEdGUF9LRVJORUwpKQogCQlyZXR1cm4gLUVOT01FTTsKLQljcHVtYXNrX2NsZWFyKG1hcmtlZF9jcHVzKTsKIAogCXN0YXJ0X2NwdV93b3JrKCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMgYi9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5jCmluZGV4IDJiN2FlMzYuLjVkZjYwYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuYwpAQCAtMzUsMTIgKzM1LDIzIEBACiAvKiBhdG9taWNfdCBiZWNhdXNlIHdhaXRfZXZlbnQgY2hlY2tzIGl0IG91dHNpZGUgb2YgYnVmZmVyX211dGV4ICovCiBzdGF0aWMgYXRvbWljX3QgYnVmZmVyX3JlYWR5ID0gQVRPTUlDX0lOSVQoMCk7CiAKLS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgZXZlbnQgYnVmZmVyLiBXaGVuIHdlCi0gKiBnZXQgbmVhciB0byB0aGUgZW5kIHdlIHdha2UgdXAgdGhlIHByb2Nlc3MKLSAqIHNsZWVwaW5nIG9uIHRoZSByZWFkKCkgb2YgdGhlIGZpbGUuCisvKgorICogQWRkIGFuIGVudHJ5IHRvIHRoZSBldmVudCBidWZmZXIuIFdoZW4gd2UgZ2V0IG5lYXIgdG8gdGhlIGVuZCB3ZQorICogd2FrZSB1cCB0aGUgcHJvY2VzcyBzbGVlcGluZyBvbiB0aGUgcmVhZCgpIG9mIHRoZSBmaWxlLiBUbyBwcm90ZWN0CisgKiB0aGUgZXZlbnRfYnVmZmVyIHRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gYnVmZmVyX211dGV4CisgKiBpcyBzZXQuCiAgKi8KIHZvaWQgYWRkX2V2ZW50X2VudHJ5KHVuc2lnbmVkIGxvbmcgdmFsdWUpCiB7CisJLyoKKwkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2UgYWxsIHdvcmtxdWV1ZXMgb3IgaGFuZGxlcnMgYXJlCisJICogY2FuY2VsZWQgb3IgZmx1c2hlZCBiZWZvcmUgdGhlIGV2ZW50IGJ1ZmZlciBpcyBmcmVlZC4KKwkgKi8KKwlpZiAoIWV2ZW50X2J1ZmZlcikgeworCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybjsKKwl9CisKIAlpZiAoYnVmZmVyX3BvcyA9PSBidWZmZXJfc2l6ZSkgewogCQlhdG9taWNfaW5jKCZvcHJvZmlsZV9zdGF0cy5ldmVudF9sb3N0X292ZXJmbG93KTsKIAkJcmV0dXJuOwpAQCAtNjksNyArODAsNiBAQAogCiBpbnQgYWxsb2NfZXZlbnRfYnVmZmVyKHZvaWQpCiB7Ci0JaW50IGVyciA9IC1FTk9NRU07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZvcHJvZmlsZWZzX2xvY2ssIGZsYWdzKTsKQEAgLTgwLDIxICs5MCwyMiBAQAogCWlmIChidWZmZXJfd2F0ZXJzaGVkID49IGJ1ZmZlcl9zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWJ1ZmZlcl9wb3MgPSAwOwogCWV2ZW50X2J1ZmZlciA9IHZtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogYnVmZmVyX3NpemUpOwogCWlmICghZXZlbnRfYnVmZmVyKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQllcnIgPSAwOwotb3V0OgotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIAogdm9pZCBmcmVlX2V2ZW50X2J1ZmZlcih2b2lkKQogeworCW11dGV4X2xvY2soJmJ1ZmZlcl9tdXRleCk7CiAJdmZyZWUoZXZlbnRfYnVmZmVyKTsKLQorCWJ1ZmZlcl9wb3MgPSAwOwogCWV2ZW50X2J1ZmZlciA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZidWZmZXJfbXV0ZXgpOwogfQogCiAKQEAgLTE2Nyw2ICsxNzgsMTIgQEAKIAogCW11dGV4X2xvY2soJmJ1ZmZlcl9tdXRleCk7CiAKKwkvKiBNYXkgaGFwcGVuIGlmIHRoZSBidWZmZXIgaXMgZnJlZWQgZHVyaW5nIHBlbmRpbmcgcmVhZHMuICovCisJaWYgKCFldmVudF9idWZmZXIpIHsKKwkJcmV0dmFsID0gLUVJTlRSOworCQlnb3RvIG91dDsKKwl9CisKIAlhdG9taWNfc2V0KCZidWZmZXJfcmVhZHksIDApOwogCiAJcmV0dmFsID0gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wcm9jZnMuYyBiL2RyaXZlcnMvcGFycG9ydC9wcm9jZnMuYwppbmRleCA1NTRlMTFmLi44ZWVmZTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcHJvY2ZzLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3Byb2Nmcy5jCkBAIC0zMSw3ICszMSw3IEBACiAjZGVmaW5lIFBBUlBPUlRfTUlOX1NQSU5USU1FX1ZBTFVFIDEKICNkZWZpbmUgUEFSUE9SVF9NQVhfU1BJTlRJTUVfVkFMVUUgMTAwMAogCi1zdGF0aWMgaW50IGRvX2FjdGl2ZV9kZXZpY2UoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgZG9fYWN0aXZlX2RldmljZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgICAgIHZvaWQgX191c2VyICpyZXN1bHQsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0gKHN0cnVjdCBwYXJwb3J0ICopdGFibGUtPmV4dHJhMTsKQEAgLTY4LDcgKzY4LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QQVJQT1JUXzEyODQKLXN0YXRpYyBpbnQgZG9fYXV0b3Byb2JlKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IGRvX2F1dG9wcm9iZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQl2b2lkIF9fdXNlciAqcmVzdWx0LCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgcGFycG9ydF9kZXZpY2VfaW5mbyAqaW5mbyA9IHRhYmxlLT5leHRyYTI7CkBAIC0xMTEsNyArMTExLDcgQEAKICNlbmRpZiAvKiBJRUVFMTI4NC4zIHN1cHBvcnQuICovCiAKIHN0YXRpYyBpbnQgZG9faGFyZHdhcmVfYmFzZV9hZGRyIChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJICBzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKnJlc3VsdCwKKwkJCQkgIHZvaWQgX191c2VyICpyZXN1bHQsCiAJCQkJICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IChzdHJ1Y3QgcGFycG9ydCAqKXRhYmxlLT5leHRyYTE7CkBAIC0xMzksNyArMTM5LDcgQEAKIH0KIAogc3RhdGljIGludCBkb19oYXJkd2FyZV9pcnEgKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKnJlc3VsdCwKKwkJCSAgICB2b2lkIF9fdXNlciAqcmVzdWx0LAogCQkJICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0gKHN0cnVjdCBwYXJwb3J0ICopdGFibGUtPmV4dHJhMTsKQEAgLTE2Nyw3ICsxNjcsNyBAQAogfQogCiBzdGF0aWMgaW50IGRvX2hhcmR3YXJlX2RtYSAoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJICAgIHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqcmVzdWx0LAorCQkJICAgIHZvaWQgX191c2VyICpyZXN1bHQsCiAJCQkgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHBhcnBvcnQgKnBvcnQgPSAoc3RydWN0IHBhcnBvcnQgKil0YWJsZS0+ZXh0cmExOwpAQCAtMTk1LDcgKzE5NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZG9faGFyZHdhcmVfbW9kZXMgKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqcmVzdWx0LAorCQkJICAgICAgdm9pZCBfX3VzZXIgKnJlc3VsdCwKIAkJCSAgICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0gKHN0cnVjdCBwYXJwb3J0ICopdGFibGUtPmV4dHJhMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2RtYXIuYyBiL2RyaXZlcnMvcGNpL2RtYXIuYwppbmRleCAxNGJiYWExLi4yMmIwMmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9kbWFyLmMKKysrIGIvZHJpdmVycy9wY2kvZG1hci5jCkBAIC0zNTQsNiArMzU0LDcgQEAKIAlzdHJ1Y3QgYWNwaV9kbWFyX2hhcmR3YXJlX3VuaXQgKmRyaGQ7CiAJc3RydWN0IGFjcGlfZG1hcl9yZXNlcnZlZF9tZW1vcnkgKnJtcnI7CiAJc3RydWN0IGFjcGlfZG1hcl9hdHNyICphdHNyOworCXN0cnVjdCBhY3BpX2RtYXJfcmhzYSAqcmhzYTsKIAogCXN3aXRjaCAoaGVhZGVyLT50eXBlKSB7CiAJY2FzZSBBQ1BJX0RNQVJfVFlQRV9IQVJEV0FSRV9VTklUOgpAQCAtMzc1LDYgKzM3NiwxMiBAQAogCQlhdHNyID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IGFjcGlfZG1hcl9hdHNyLCBoZWFkZXIpOwogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiQVRTUiBmbGFnczogJSN4XG4iLCBhdHNyLT5mbGFncyk7CiAJCWJyZWFrOworCWNhc2UgQUNQSV9ETUFSX0hBUkRXQVJFX0FGRklOSVRZOgorCQlyaHNhID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IGFjcGlfZG1hcl9yaHNhLCBoZWFkZXIpOworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiUkhTQSBiYXNlOiAlIzAxNkx4IHByb3hpbWl0eSBkb21haW46ICUjeFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmhzYS0+YmFzZV9hZGRyZXNzLAorCQkgICAgICAgcmhzYS0+cHJveGltaXR5X2RvbWFpbik7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtNDU5LDkgKzQ2NiwxMyBAQAogCQkJcmV0ID0gZG1hcl9wYXJzZV9vbmVfYXRzcihlbnRyeV9oZWFkZXIpOwogI2VuZGlmCiAJCQlicmVhazsKKwkJY2FzZSBBQ1BJX0RNQVJfSEFSRFdBUkVfQUZGSU5JVFk6CisJCQkvKiBXZSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIFJIU0EgKHlldD8pICovCisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCi0JCQkJIlVua25vd24gRE1BUiBzdHJ1Y3R1cmUgdHlwZVxuIik7CisJCQkJIlVua25vd24gRE1BUiBzdHJ1Y3R1cmUgdHlwZSAlZFxuIiwKKwkJCQllbnRyeV9oZWFkZXItPnR5cGUpOwogCQkJcmV0ID0gMDsgLyogZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eSAqLwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYwppbmRleCBhOWQ5MjZiLi5lN2JlNjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jCkBAIC00MDYsNyArNDA2LDYgQEAKIAkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlpbmZvLT5oYXJkd2FyZV9pZC5zdHJpbmdbc2l6ZW9mKGluZm8tPmhhcmR3YXJlX2lkLmxlbmd0aCkgLSAxXSA9ICdcMCc7CiAKIAlpZiAoaW5mby0+Y3VycmVudF9zdGF0dXMgJiYgKGluZm8tPnZhbGlkICYgQUNQSV9WQUxJRF9ISUQpICYmCiAJCQkoIXN0cmNtcChpbmZvLT5oYXJkd2FyZV9pZC5zdHJpbmcsIElCTV9IQVJEV0FSRV9JRDEpIHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHAuaAppbmRleCA1MzgzNjAwLi45YzZhOWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIGZvciByZWFkPyBhbmQgd3JpdGU/IGZ1bmN0aW9ucyAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIGZvciBkZWxheXMgKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBzaWduYWxfcGVuZGluZygpICovCiAKICNkZWZpbmUgTVlfTkFNRQkiY3BxcGhwIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCAzNmZhYTlhLi4zMDcwZjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTcyLDE1ICs3Miw5IEBACiAKICNkZWZpbmUgU0xPVF9OQU1FX1NJWkUgMTAKIHN0cnVjdCBzbG90IHsKLQl1OCBidXM7Ci0JdTggZGV2aWNlOwogCXU4IHN0YXRlOwotCXU4IGhwX3Nsb3Q7Ci0JdTMyIG51bWJlcjsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybDsKLQlzdHJ1Y3QgaHBjX29wcyAqaHBjX29wczsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAlzbG90X2xpc3Q7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwkvKiB3b3JrIGZvciBidXR0b24gZXZlbnQgKi8KIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIH07CkBAIC05MiwxOCArODYsMTAgQEAKIH07CiAKIHN0cnVjdCBjb250cm9sbGVyIHsKLQlzdHJ1Y3QgbXV0ZXggY3JpdF9zZWN0OwkJLyogY3JpdGljYWwgc2VjdGlvbiBtdXRleCAqLwogCXN0cnVjdCBtdXRleCBjdHJsX2xvY2s7CQkvKiBjb250cm9sbGVyIGxvY2sgKi8KLQlpbnQgbnVtX3Nsb3RzOwkJCS8qIE51bWJlciBvZiBzbG90cyBvbiBjdGxyICovCi0JaW50IHNsb3RfbnVtX2luYzsJCS8qIDEgb3IgLTEgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKIAlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWU7CS8qIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2xvdF9saXN0OwotCXN0cnVjdCBocGNfb3BzICpocGNfb3BzOworCXN0cnVjdCBzbG90ICpzbG90OwogCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwkvKiBzbGVlcCAmIHdha2UgcHJvY2VzcyAqLwotCXU4IHNsb3RfZGV2aWNlX29mZnNldDsKLQl1MzIgZmlyc3Rfc2xvdDsJCS8qIEZpcnN0IHBoeXNpY2FsIHNsb3QgbnVtYmVyICovICAvKiBQQ0lFIG9ubHkgaGFzIDEgc2xvdCAqLwotCXU4IHNsb3RfYnVzOwkJLyogQnVzIHdoZXJlIHRoZSBzbG90cyBoYW5kbGVkIGJ5IHRoaXMgY29udHJvbGxlciBzaXQgKi8KIAl1MzIgc2xvdF9jYXA7CiAJdTggY2FwX2Jhc2U7CiAJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lcjsKQEAgLTEzMSw0MCArMTE3LDIwIEBACiAjZGVmaW5lIFBPV0VST05fU1RBVEUJCQkzCiAjZGVmaW5lIFBPV0VST0ZGX1NUQVRFCQkJNAogCi0vKiBFcnJvciBtZXNzYWdlcyAqLwotI2RlZmluZSBJTlRFUkxPQ0tfT1BFTgkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgQUREX05PVF9TVVBQT1JURUQJCTB4MDAwMDAwMDMKLSNkZWZpbmUgQ0FSRF9GVU5DVElPTklORwkJMHgwMDAwMDAwNQotI2RlZmluZSBBREFQVEVSX05PVF9TQU1FCQkweDAwMDAwMDA2Ci0jZGVmaW5lIE5PX0FEQVBURVJfUFJFU0VOVAkJMHgwMDAwMDAwOQotI2RlZmluZSBOT1RfRU5PVUdIX1JFU09VUkNFUwkJMHgwMDAwMDAwQgotI2RlZmluZSBERVZJQ0VfVFlQRV9OT1RfU1VQUE9SVEVECTB4MDAwMDAwMEMKLSNkZWZpbmUgV1JPTkdfQlVTX0ZSRVFVRU5DWQkJMHgwMDAwMDAwRAotI2RlZmluZSBQT1dFUl9GQUlMVVJFCQkJMHgwMDAwMDAwRQotCi0vKiBGaWVsZCBkZWZpbml0aW9ucyBpbiBTbG90IENhcGFiaWxpdGllcyBSZWdpc3RlciAqLwotI2RlZmluZSBBVFROX0JVVFROX1BSU04JMHgwMDAwMDAwMQotI2RlZmluZQlQV1JfQ1RSTF9QUlNOCTB4MDAwMDAwMDIKLSNkZWZpbmUgTVJMX1NFTlNfUFJTTgkweDAwMDAwMDA0Ci0jZGVmaW5lIEFUVE5fTEVEX1BSU04JMHgwMDAwMDAwOAotI2RlZmluZSBQV1JfTEVEX1BSU04JMHgwMDAwMDAxMAotI2RlZmluZSBIUF9TVVBSX1JNX1NVUAkweDAwMDAwMDIwCi0jZGVmaW5lIEVNSV9QUlNOCTB4MDAwMjAwMDAKLSNkZWZpbmUgTk9fQ01EX0NNUExfU1VQCTB4MDAwNDAwMDAKLQotI2RlZmluZSBBVFROX0JVVFROKGN0cmwpCSgoY3RybCktPnNsb3RfY2FwICYgQVRUTl9CVVRUTl9QUlNOKQotI2RlZmluZSBQT1dFUl9DVFJMKGN0cmwpCSgoY3RybCktPnNsb3RfY2FwICYgUFdSX0NUUkxfUFJTTikKLSNkZWZpbmUgTVJMX1NFTlMoY3RybCkJCSgoY3RybCktPnNsb3RfY2FwICYgTVJMX1NFTlNfUFJTTikKLSNkZWZpbmUgQVRUTl9MRUQoY3RybCkJCSgoY3RybCktPnNsb3RfY2FwICYgQVRUTl9MRURfUFJTTikKLSNkZWZpbmUgUFdSX0xFRChjdHJsKQkJKChjdHJsKS0+c2xvdF9jYXAgJiBQV1JfTEVEX1BSU04pCi0jZGVmaW5lIEhQX1NVUFJfUk0oY3RybCkJKChjdHJsKS0+c2xvdF9jYXAgJiBIUF9TVVBSX1JNX1NVUCkKLSNkZWZpbmUgRU1JKGN0cmwpCQkoKGN0cmwpLT5zbG90X2NhcCAmIEVNSV9QUlNOKQotI2RlZmluZSBOT19DTURfQ01QTChjdHJsKQkoKGN0cmwpLT5zbG90X2NhcCAmIE5PX0NNRF9DTVBMX1NVUCkKKyNkZWZpbmUgQVRUTl9CVVRUTihjdHJsKQkoKGN0cmwpLT5zbG90X2NhcCAmIFBDSV9FWFBfU0xUQ0FQX0FCUCkKKyNkZWZpbmUgUE9XRVJfQ1RSTChjdHJsKQkoKGN0cmwpLT5zbG90X2NhcCAmIFBDSV9FWFBfU0xUQ0FQX1BDUCkKKyNkZWZpbmUgTVJMX1NFTlMoY3RybCkJCSgoY3RybCktPnNsb3RfY2FwICYgUENJX0VYUF9TTFRDQVBfTVJMU1ApCisjZGVmaW5lIEFUVE5fTEVEKGN0cmwpCQkoKGN0cmwpLT5zbG90X2NhcCAmIFBDSV9FWFBfU0xUQ0FQX0FJUCkKKyNkZWZpbmUgUFdSX0xFRChjdHJsKQkJKChjdHJsKS0+c2xvdF9jYXAgJiBQQ0lfRVhQX1NMVENBUF9QSVApCisjZGVmaW5lIEhQX1NVUFJfUk0oY3RybCkJKChjdHJsKS0+c2xvdF9jYXAgJiBQQ0lfRVhQX1NMVENBUF9IUFMpCisjZGVmaW5lIEVNSShjdHJsKQkJKChjdHJsKS0+c2xvdF9jYXAgJiBQQ0lfRVhQX1NMVENBUF9FSVApCisjZGVmaW5lIE5PX0NNRF9DTVBMKGN0cmwpCSgoY3RybCktPnNsb3RfY2FwICYgUENJX0VYUF9TTFRDQVBfTkNDUykKKyNkZWZpbmUgUFNOKGN0cmwpCQkoKGN0cmwpLT5zbG90X2NhcCA+PiAxOSkKIAogZXh0ZXJuIGludCBwY2llaHBfc3lzZnNfZW5hYmxlX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpOwogZXh0ZXJuIGludCBwY2llaHBfc3lzZnNfZGlzYWJsZV9zbG90KHN0cnVjdCBzbG90ICpzbG90KTsKIGV4dGVybiB1OCBwY2llaHBfaGFuZGxlX2F0dGVudGlvbl9idXR0b24oc3RydWN0IHNsb3QgKnBfc2xvdCk7Ci0gIGV4dGVybiB1OCBwY2llaHBfaGFuZGxlX3N3aXRjaF9jaGFuZ2Uoc3RydWN0IHNsb3QgKnBfc2xvdCk7CitleHRlcm4gdTggcGNpZWhwX2hhbmRsZV9zd2l0Y2hfY2hhbmdlKHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogZXh0ZXJuIHU4IHBjaWVocF9oYW5kbGVfcHJlc2VuY2VfY2hhbmdlKHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogZXh0ZXJuIHU4IHBjaWVocF9oYW5kbGVfcG93ZXJfZmF1bHQoc3RydWN0IHNsb3QgKnBfc2xvdCk7CiBleHRlcm4gaW50IHBjaWVocF9jb25maWd1cmVfZGV2aWNlKHN0cnVjdCBzbG90ICpwX3Nsb3QpOwpAQCAtMTc1LDQ1ICsxNDEsMzAgQEAKIGludCBwY2llaHBfZW5hYmxlX3Nsb3Qoc3RydWN0IHNsb3QgKnBfc2xvdCk7CiBpbnQgcGNpZWhwX2Rpc2FibGVfc2xvdChzdHJ1Y3Qgc2xvdCAqcF9zbG90KTsKIGludCBwY2llX2VuYWJsZV9ub3RpZmljYXRpb24oc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOworaW50IHBjaWVocF9wb3dlcl9vbl9zbG90KHN0cnVjdCBzbG90ICpzbG90KTsKK2ludCBwY2llaHBfcG93ZXJfb2ZmX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpOworaW50IHBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCB1OCAqc3RhdHVzKTsKK2ludCBwY2llaHBfZ2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIHU4ICpzdGF0dXMpOworCitpbnQgcGNpZWhwX3NldF9hdHRlbnRpb25fc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCB1OCBzdGF0dXMpOworaW50IHBjaWVocF9nZXRfbGF0Y2hfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCB1OCAqc3RhdHVzKTsKK2ludCBwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCB1OCAqc3RhdHVzKTsKK2ludCBwY2llaHBfZ2V0X21heF9saW5rX3NwZWVkKHN0cnVjdCBzbG90ICpzbG90LCBlbnVtIHBjaV9idXNfc3BlZWQgKnNwZWVkKTsKK2ludCBwY2llaHBfZ2V0X21heF9saW5rX3dpZHRoKHN0cnVjdCBzbG90ICpzbG90LCBlbnVtIHBjaWVfbGlua193aWR0aCAqdmFsKTsKK2ludCBwY2llaHBfZ2V0X2N1cl9saW5rX3NwZWVkKHN0cnVjdCBzbG90ICpzbG90LCBlbnVtIHBjaV9idXNfc3BlZWQgKnNwZWVkKTsKK2ludCBwY2llaHBfZ2V0X2N1cl9saW5rX3dpZHRoKHN0cnVjdCBzbG90ICpzbG90LCBlbnVtIHBjaWVfbGlua193aWR0aCAqdmFsKTsKK2ludCBwY2llaHBfcXVlcnlfcG93ZXJfZmF1bHQoc3RydWN0IHNsb3QgKnNsb3QpOwordm9pZCBwY2llaHBfZ3JlZW5fbGVkX29uKHN0cnVjdCBzbG90ICpzbG90KTsKK3ZvaWQgcGNpZWhwX2dyZWVuX2xlZF9vZmYoc3RydWN0IHNsb3QgKnNsb3QpOwordm9pZCBwY2llaHBfZ3JlZW5fbGVkX2JsaW5rKHN0cnVjdCBzbG90ICpzbG90KTsKK2ludCBwY2llaHBfY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOwordm9pZCBwY2llaHBfcmVsZWFzZV9jdHJsKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKTsKIAogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpzbG90X25hbWUoc3RydWN0IHNsb3QgKnNsb3QpCiB7CiAJcmV0dXJuIGhvdHBsdWdfc2xvdF9uYW1lKHNsb3QtPmhvdHBsdWdfc2xvdCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNsb3QgKnBjaWVocF9maW5kX3Nsb3Qoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIHU4IGRldmljZSkKLXsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2xvdCwgJmN0cmwtPnNsb3RfbGlzdCwgc2xvdF9saXN0KSB7Ci0JCWlmIChzbG90LT5kZXZpY2UgPT0gZGV2aWNlKQotCQkJcmV0dXJuIHNsb3Q7Ci0JfQotCi0JY3RybF9lcnIoY3RybCwgIlNsb3QgKGRldmljZT0weCUwMngpIG5vdCBmb3VuZFxuIiwgZGV2aWNlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IGhwY19vcHMgewotCWludCAoKnBvd2VyX29uX3Nsb3QpKHN0cnVjdCBzbG90ICpzbG90KTsKLQlpbnQgKCpwb3dlcl9vZmZfc2xvdCkoc3RydWN0IHNsb3QgKnNsb3QpOwotCWludCAoKmdldF9wb3dlcl9zdGF0dXMpKHN0cnVjdCBzbG90ICpzbG90LCB1OCAqc3RhdHVzKTsKLQlpbnQgKCpnZXRfYXR0ZW50aW9uX3N0YXR1cykoc3RydWN0IHNsb3QgKnNsb3QsIHU4ICpzdGF0dXMpOwotCWludCAoKnNldF9hdHRlbnRpb25fc3RhdHVzKShzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggc3RhdHVzKTsKLQlpbnQgKCpnZXRfbGF0Y2hfc3RhdHVzKShzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cyk7Ci0JaW50ICgqZ2V0X2FkYXB0ZXJfc3RhdHVzKShzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cyk7Ci0JaW50ICgqZ2V0X21heF9idXNfc3BlZWQpKHN0cnVjdCBzbG90ICpzbG90LCBlbnVtIHBjaV9idXNfc3BlZWQgKnNwZWVkKTsKLQlpbnQgKCpnZXRfY3VyX2J1c19zcGVlZCkoc3RydWN0IHNsb3QgKnNsb3QsIGVudW0gcGNpX2J1c19zcGVlZCAqc3BlZWQpOwotCWludCAoKmdldF9tYXhfbG5rX3dpZHRoKShzdHJ1Y3Qgc2xvdCAqc2xvdCwgZW51bSBwY2llX2xpbmtfd2lkdGggKnZhbCk7Ci0JaW50ICgqZ2V0X2N1cl9sbmtfd2lkdGgpKHN0cnVjdCBzbG90ICpzbG90LCBlbnVtIHBjaWVfbGlua193aWR0aCAqdmFsKTsKLQlpbnQgKCpxdWVyeV9wb3dlcl9mYXVsdCkoc3RydWN0IHNsb3QgKnNsb3QpOwotCXZvaWQgKCpncmVlbl9sZWRfb24pKHN0cnVjdCBzbG90ICpzbG90KTsKLQl2b2lkICgqZ3JlZW5fbGVkX29mZikoc3RydWN0IHNsb3QgKnNsb3QpOwotCXZvaWQgKCpncmVlbl9sZWRfYmxpbmspKHN0cnVjdCBzbG90ICpzbG90KTsKLQl2b2lkICgqcmVsZWFzZV9jdGxyKShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCk7Ci0JaW50ICgqY2hlY2tfbG5rX3N0YXR1cykoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOwotfTsKLQogI2lmZGVmIENPTkZJR19BQ1BJCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCmluZGV4IDcxNjNlNmEuLjM3YzhkM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKQEAgLTMzLDYgKzMzLDExIEBACiAjZGVmaW5lIFBDSUVIUF9ERVRFQ1RfQVVUTwkoMikKICNkZWZpbmUgUENJRUhQX0RFVEVDVF9ERUZBVUxUCVBDSUVIUF9ERVRFQ1RfQVVUTwogCitzdHJ1Y3QgZHVtbXlfc2xvdCB7CisJdTMyIG51bWJlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCiBzdGF0aWMgaW50IHNsb3RfZGV0ZWN0aW9uX21vZGU7CiBzdGF0aWMgY2hhciAqcGNpZWhwX2RldGVjdF9tb2RlOwogbW9kdWxlX3BhcmFtKHBjaWVocF9kZXRlY3RfbW9kZSwgY2hhcnAsIDA0NDQpOwpAQCAtNzcsNyArODIsNyBAQAogCWludCBwb3M7CiAJdTMyIHNsb3RfY2FwOwogCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdCwgKnRtcDsKKwlzdHJ1Y3QgZHVtbXlfc2xvdCAqc2xvdCwgKnRtcDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cG9ydDsKIAkvKiBOb3RlOiBwY2llaHBfZGV0ZWN0X21vZGUgIT0gUENJRUhQX0RFVEVDVF9BQ1BJIGhlcmUgKi8KIAlpZiAocGNpZWhwX2dldF9ocF9od19jb250cm9sX2Zyb21fZmlybXdhcmUocGRldikpCkBAIC04OSwxMSArOTQsMTEgQEAKIAlpZiAoIXNsb3QpCiAJCXJldHVybiAtRU5PTUVNOwogCXNsb3QtPm51bWJlciA9IHNsb3RfY2FwID4+IDE5OwotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmZHVtbXlfc2xvdHMsIHNsb3RfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmZHVtbXlfc2xvdHMsIGxpc3QpIHsKIAkJaWYgKHRtcC0+bnVtYmVyID09IHNsb3QtPm51bWJlcikKIAkJCWR1cF9zbG90X2lkKys7CiAJfQotCWxpc3RfYWRkX3RhaWwoJnNsb3QtPnNsb3RfbGlzdCwgJmR1bW15X3Nsb3RzKTsKKwlsaXN0X2FkZF90YWlsKCZzbG90LT5saXN0LCAmZHVtbXlfc2xvdHMpOwogCWhhbmRsZSA9IERFVklDRV9BQ1BJX0hBTkRMRSgmcGRldi0+ZGV2KTsKIAlpZiAoIWFjcGlfc2xvdF9kZXRlY3RlZCAmJiBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKGhhbmRsZSkpCiAJCWFjcGlfc2xvdF9kZXRlY3RlZCA9IDE7CkBAIC0xMDksMTEgKzExNCwxMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzZWxlY3RfZGV0ZWN0aW9uX21vZGUodm9pZCkKIHsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdCwgKnRtcDsKKwlzdHJ1Y3QgZHVtbXlfc2xvdCAqc2xvdCwgKnRtcDsKIAlwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcigmZHVtbXlfZHJpdmVyKTsKIAlwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyKCZkdW1teV9kcml2ZXIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbG90LCB0bXAsICZkdW1teV9zbG90cywgc2xvdF9saXN0KSB7Ci0JCWxpc3RfZGVsKCZzbG90LT5zbG90X2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbG90LCB0bXAsICZkdW1teV9zbG90cywgbGlzdCkgeworCQlsaXN0X2RlbCgmc2xvdC0+bGlzdCk7CiAJCWtmcmVlKHNsb3QpOwogCX0KIAlpZiAoYWNwaV9zbG90X2RldGVjdGVkICYmIGR1cF9zbG90X2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCmluZGV4IDIzMTc1NTcuLmJjMjM0NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKQEAgLTk5LDY1ICs5OSw1NSBAQAogCWtmcmVlKGhvdHBsdWdfc2xvdCk7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9zbG90cyhzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKK3N0YXRpYyBpbnQgaW5pdF9zbG90KHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewotCXN0cnVjdCBzbG90ICpzbG90OwotCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdDsKLQlzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gKmluZm87CisJc3RydWN0IHNsb3QgKnNsb3QgPSBjdHJsLT5zbG90OworCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWcgPSBOVUxMOworCXN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyAqaW5mbyA9IE5VTEw7CiAJY2hhciBuYW1lW1NMT1RfTkFNRV9TSVpFXTsKIAlpbnQgcmV0dmFsID0gLUVOT01FTTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2xvdCwgJmN0cmwtPnNsb3RfbGlzdCwgc2xvdF9saXN0KSB7Ci0JCWhvdHBsdWdfc2xvdCA9IGt6YWxsb2Moc2l6ZW9mKCpob3RwbHVnX3Nsb3QpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFob3RwbHVnX3Nsb3QpCi0JCQlnb3RvIGVycm9yOworCWhvdHBsdWcgPSBremFsbG9jKHNpemVvZigqaG90cGx1ZyksIEdGUF9LRVJORUwpOworCWlmICghaG90cGx1ZykKKwkJZ290byBvdXQ7CiAKLQkJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghaW5mbykKLQkJCWdvdG8gZXJyb3JfaHBzbG90OworCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJZ290byBvdXQ7CiAKLQkJLyogcmVnaXN0ZXIgdGhpcyBzbG90IHdpdGggdGhlIGhvdHBsdWcgcGNpIGNvcmUgKi8KLQkJaG90cGx1Z19zbG90LT5pbmZvID0gaW5mbzsKLQkJaG90cGx1Z19zbG90LT5wcml2YXRlID0gc2xvdDsKLQkJaG90cGx1Z19zbG90LT5yZWxlYXNlID0gJnJlbGVhc2Vfc2xvdDsKLQkJaG90cGx1Z19zbG90LT5vcHMgPSAmcGNpZWhwX2hvdHBsdWdfc2xvdF9vcHM7Ci0JCXNsb3QtPmhvdHBsdWdfc2xvdCA9IGhvdHBsdWdfc2xvdDsKLQkJc25wcmludGYobmFtZSwgU0xPVF9OQU1FX1NJWkUsICIldSIsIHNsb3QtPm51bWJlcik7CisJLyogcmVnaXN0ZXIgdGhpcyBzbG90IHdpdGggdGhlIGhvdHBsdWcgcGNpIGNvcmUgKi8KKwlob3RwbHVnLT5pbmZvID0gaW5mbzsKKwlob3RwbHVnLT5wcml2YXRlID0gc2xvdDsKKwlob3RwbHVnLT5yZWxlYXNlID0gJnJlbGVhc2Vfc2xvdDsKKwlob3RwbHVnLT5vcHMgPSAmcGNpZWhwX2hvdHBsdWdfc2xvdF9vcHM7CisJc2xvdC0+aG90cGx1Z19zbG90ID0gaG90cGx1ZzsKKwlzbnByaW50ZihuYW1lLCBTTE9UX05BTUVfU0laRSwgIiV1IiwgUFNOKGN0cmwpKTsKIAotIAkJY3RybF9kYmcoY3RybCwgIlJlZ2lzdGVyaW5nIGRvbWFpbjpidXM6ZGV2PSUwNHg6JTAyeDolMDJ4ICIKLSAJCQkgImhwX3Nsb3Q9JXggc3VuPSV4IHNsb3RfZGV2aWNlX29mZnNldD0leFxuIiwKLSAJCQkgcGNpX2RvbWFpbl9ucihjdHJsLT5wY2lfZGV2LT5zdWJvcmRpbmF0ZSksCi0gCQkJIHNsb3QtPmJ1cywgc2xvdC0+ZGV2aWNlLCBzbG90LT5ocF9zbG90LCBzbG90LT5udW1iZXIsCi0gCQkJIGN0cmwtPnNsb3RfZGV2aWNlX29mZnNldCk7Ci0JCXJldHZhbCA9IHBjaV9ocF9yZWdpc3Rlcihob3RwbHVnX3Nsb3QsCi0JCQkJCSBjdHJsLT5wY2lfZGV2LT5zdWJvcmRpbmF0ZSwKLQkJCQkJIHNsb3QtPmRldmljZSwKLQkJCQkJIG5hbWUpOwotCQlpZiAocmV0dmFsKSB7Ci0JCQljdHJsX2VycihjdHJsLCAicGNpX2hwX3JlZ2lzdGVyIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLAotCQkJCSByZXR2YWwpOwotCQkJZ290byBlcnJvcl9pbmZvOwotCQl9Ci0JCWdldF9wb3dlcl9zdGF0dXMoaG90cGx1Z19zbG90LCAmaW5mby0+cG93ZXJfc3RhdHVzKTsKLQkJZ2V0X2F0dGVudGlvbl9zdGF0dXMoaG90cGx1Z19zbG90LCAmaW5mby0+YXR0ZW50aW9uX3N0YXR1cyk7Ci0JCWdldF9sYXRjaF9zdGF0dXMoaG90cGx1Z19zbG90LCAmaW5mby0+bGF0Y2hfc3RhdHVzKTsKLQkJZ2V0X2FkYXB0ZXJfc3RhdHVzKGhvdHBsdWdfc2xvdCwgJmluZm8tPmFkYXB0ZXJfc3RhdHVzKTsKKwljdHJsX2RiZyhjdHJsLCAiUmVnaXN0ZXJpbmcgZG9tYWluOmJ1czpkZXY9JTA0eDolMDJ4OjAwIHN1bj0leFxuIiwKKwkJIHBjaV9kb21haW5fbnIoY3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGUpLAorCQkgY3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGUtPm51bWJlciwgUFNOKGN0cmwpKTsKKwlyZXR2YWwgPSBwY2lfaHBfcmVnaXN0ZXIoaG90cGx1ZywKKwkJCQkgY3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGUsIDAsIG5hbWUpOworCWlmIChyZXR2YWwpIHsKKwkJY3RybF9lcnIoY3RybCwKKwkJCSAicGNpX2hwX3JlZ2lzdGVyIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCByZXR2YWwpOworCQlnb3RvIG91dDsKIAl9Ci0KLQlyZXR1cm4gMDsKLWVycm9yX2luZm86Ci0Ja2ZyZWUoaW5mbyk7Ci1lcnJvcl9ocHNsb3Q6Ci0Ja2ZyZWUoaG90cGx1Z19zbG90KTsKLWVycm9yOgorCWdldF9wb3dlcl9zdGF0dXMoaG90cGx1ZywgJmluZm8tPnBvd2VyX3N0YXR1cyk7CisJZ2V0X2F0dGVudGlvbl9zdGF0dXMoaG90cGx1ZywgJmluZm8tPmF0dGVudGlvbl9zdGF0dXMpOworCWdldF9sYXRjaF9zdGF0dXMoaG90cGx1ZywgJmluZm8tPmxhdGNoX3N0YXR1cyk7CisJZ2V0X2FkYXB0ZXJfc3RhdHVzKGhvdHBsdWcsICZpbmZvLT5hZGFwdGVyX3N0YXR1cyk7CitvdXQ6CisJaWYgKHJldHZhbCkgeworCQlrZnJlZShpbmZvKTsKKwkJa2ZyZWUoaG90cGx1Zyk7CisJfQogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFudXBfc2xvdHMoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCitzdGF0aWMgdm9pZCBjbGVhbnVwX3Nsb3Qoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7Ci0Jc3RydWN0IHNsb3QgKnNsb3Q7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShzbG90LCAmY3RybC0+c2xvdF9saXN0LCBzbG90X2xpc3QpCi0JCXBjaV9ocF9kZXJlZ2lzdGVyKHNsb3QtPmhvdHBsdWdfc2xvdCk7CisJcGNpX2hwX2RlcmVnaXN0ZXIoY3RybC0+c2xvdC0+aG90cGx1Z19zbG90KTsKIH0KIAogLyoKQEAgLTE3Myw3ICsxNjMsNyBAQAogCWhvdHBsdWdfc2xvdC0+aW5mby0+YXR0ZW50aW9uX3N0YXR1cyA9IHN0YXR1czsKIAogCWlmIChBVFROX0xFRChzbG90LT5jdHJsKSkKLQkJc2xvdC0+aHBjX29wcy0+c2V0X2F0dGVudGlvbl9zdGF0dXMoc2xvdCwgc3RhdHVzKTsKKwkJcGNpZWhwX3NldF9hdHRlbnRpb25fc3RhdHVzKHNsb3QsIHN0YXR1cyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwOCw3ICsxOTgsNyBAQAogCWN0cmxfZGJnKHNsb3QtPmN0cmwsICIlczogcGh5c2ljYWxfc2xvdCA9ICVzXG4iLAogCQkgIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gc2xvdC0+aHBjX29wcy0+Z2V0X3Bvd2VyX3N0YXR1cyhzbG90LCB2YWx1ZSk7CisJcmV0dmFsID0gcGNpZWhwX2dldF9wb3dlcl9zdGF0dXMoc2xvdCwgdmFsdWUpOwogCWlmIChyZXR2YWwgPCAwKQogCQkqdmFsdWUgPSBob3RwbHVnX3Nsb3QtPmluZm8tPnBvd2VyX3N0YXR1czsKIApAQCAtMjIzLDcgKzIxMyw3IEBACiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSAgX19mdW5jX18sIHNsb3RfbmFtZShzbG90KSk7CiAKLQlyZXR2YWwgPSBzbG90LT5ocGNfb3BzLT5nZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCB2YWx1ZSk7CisJcmV0dmFsID0gcGNpZWhwX2dldF9hdHRlbnRpb25fc3RhdHVzKHNsb3QsIHZhbHVlKTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJKnZhbHVlID0gaG90cGx1Z19zbG90LT5pbmZvLT5hdHRlbnRpb25fc3RhdHVzOwogCkBAIC0yMzgsNyArMjI4LDcgQEAKIAljdHJsX2RiZyhzbG90LT5jdHJsLCAiJXM6IHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwKIAkJIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gc2xvdC0+aHBjX29wcy0+Z2V0X2xhdGNoX3N0YXR1cyhzbG90LCB2YWx1ZSk7CisJcmV0dmFsID0gcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMoc2xvdCwgdmFsdWUpOwogCWlmIChyZXR2YWwgPCAwKQogCQkqdmFsdWUgPSBob3RwbHVnX3Nsb3QtPmluZm8tPmxhdGNoX3N0YXR1czsKIApAQCAtMjUzLDcgKzI0Myw3IEBACiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSBfX2Z1bmNfXywgc2xvdF9uYW1lKHNsb3QpKTsKIAotCXJldHZhbCA9IHNsb3QtPmhwY19vcHMtPmdldF9hZGFwdGVyX3N0YXR1cyhzbG90LCB2YWx1ZSk7CisJcmV0dmFsID0gcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCB2YWx1ZSk7CiAJaWYgKHJldHZhbCA8IDApCiAJCSp2YWx1ZSA9IGhvdHBsdWdfc2xvdC0+aW5mby0+YWRhcHRlcl9zdGF0dXM7CiAKQEAgLTI2OSw3ICsyNTksNyBAQAogCWN0cmxfZGJnKHNsb3QtPmN0cmwsICIlczogcGh5c2ljYWxfc2xvdCA9ICVzXG4iLAogCQkgX19mdW5jX18sIHNsb3RfbmFtZShzbG90KSk7CiAKLQlyZXR2YWwgPSBzbG90LT5ocGNfb3BzLT5nZXRfbWF4X2J1c19zcGVlZChzbG90LCB2YWx1ZSk7CisJcmV0dmFsID0gcGNpZWhwX2dldF9tYXhfbGlua19zcGVlZChzbG90LCB2YWx1ZSk7CiAJaWYgKHJldHZhbCA8IDApCiAJCSp2YWx1ZSA9IFBDSV9TUEVFRF9VTktOT1dOOwogCkBAIC0yODQsNyArMjc0LDcgQEAKIAljdHJsX2RiZyhzbG90LT5jdHJsLCAiJXM6IHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwKIAkJIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gc2xvdC0+aHBjX29wcy0+Z2V0X2N1cl9idXNfc3BlZWQoc2xvdCwgdmFsdWUpOworCXJldHZhbCA9IHBjaWVocF9nZXRfY3VyX2xpbmtfc3BlZWQoc2xvdCwgdmFsdWUpOwogCWlmIChyZXR2YWwgPCAwKQogCQkqdmFsdWUgPSBQQ0lfU1BFRURfVU5LTk9XTjsKIApAQCAtMjk1LDcgKzI4NSw3IEBACiB7CiAJaW50IHJjOwogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsOwotCXN0cnVjdCBzbG90ICp0X3Nsb3Q7CisJc3RydWN0IHNsb3QgKnNsb3Q7CiAJdTggdmFsdWU7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBvcnQ7CiAKQEAgLTMxNCw3ICszMDQsNyBAQAogCXNldF9zZXJ2aWNlX2RhdGEoZGV2LCBjdHJsKTsKIAogCS8qIFNldHVwIHRoZSBzbG90IGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgKi8KLQlyYyA9IGluaXRfc2xvdHMoY3RybCk7CisJcmMgPSBpbml0X3Nsb3QoY3RybCk7CiAJaWYgKHJjKSB7CiAJCWlmIChyYyA9PSAtRUJVU1kpCiAJCQljdHJsX3dhcm4oY3RybCwgIlNsb3QgYWxyZWFkeSByZWdpc3RlcmVkIGJ5IGFub3RoZXIgIgpAQCAtMzMyLDE1ICszMjIsMTUgQEAKIAl9CiAKIAkvKiBDaGVjayBpZiBzbG90IGlzIG9jY3VwaWVkICovCi0JdF9zbG90ID0gcGNpZWhwX2ZpbmRfc2xvdChjdHJsLCBjdHJsLT5zbG90X2RldmljZV9vZmZzZXQpOwotCXRfc2xvdC0+aHBjX29wcy0+Z2V0X2FkYXB0ZXJfc3RhdHVzKHRfc2xvdCwgJnZhbHVlKTsKKwlzbG90ID0gY3RybC0+c2xvdDsKKwlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHNsb3QsICZ2YWx1ZSk7CiAJaWYgKHZhbHVlKSB7CiAJCWlmIChwY2llaHBfZm9yY2UpCi0JCQlwY2llaHBfZW5hYmxlX3Nsb3QodF9zbG90KTsKKwkJCXBjaWVocF9lbmFibGVfc2xvdChzbG90KTsKIAl9IGVsc2UgewogCQkvKiBQb3dlciBvZmYgc2xvdCBpZiBub3Qgb2NjdXBpZWQgKi8KIAkJaWYgKFBPV0VSX0NUUkwoY3RybCkpIHsKLQkJCXJjID0gdF9zbG90LT5ocGNfb3BzLT5wb3dlcl9vZmZfc2xvdCh0X3Nsb3QpOworCQkJcmMgPSBwY2llaHBfcG93ZXJfb2ZmX3Nsb3Qoc2xvdCk7CiAJCQlpZiAocmMpCiAJCQkJZ290byBlcnJfb3V0X2ZyZWVfY3RybF9zbG90OwogCQl9CkBAIC0zNDksMTkgKzMzOSwxOSBAQAogCXJldHVybiAwOwogCiBlcnJfb3V0X2ZyZWVfY3RybF9zbG90OgotCWNsZWFudXBfc2xvdHMoY3RybCk7CisJY2xlYW51cF9zbG90KGN0cmwpOwogZXJyX291dF9yZWxlYXNlX2N0bHI6Ci0JY3RybC0+aHBjX29wcy0+cmVsZWFzZV9jdGxyKGN0cmwpOworCXBjaWVocF9yZWxlYXNlX2N0cmwoY3RybCk7CiBlcnJfb3V0X25vbmU6CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaWVocF9yZW1vdmUgKHN0cnVjdCBwY2llX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcGNpZWhwX3JlbW92ZShzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IGdldF9zZXJ2aWNlX2RhdGEoZGV2KTsKIAotCWNsZWFudXBfc2xvdHMoY3RybCk7Ci0JY3RybC0+aHBjX29wcy0+cmVsZWFzZV9jdGxyKGN0cmwpOworCWNsZWFudXBfc2xvdChjdHJsKTsKKwlwY2llaHBfcmVsZWFzZV9jdHJsKGN0cmwpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0zNzYsMjAgKzM2NiwyMCBAQAogCWRldl9pbmZvKCZkZXYtPmRldmljZSwgIiVzIEVOVFJZXG4iLCBfX2Z1bmNfXyk7CiAJaWYgKHBjaWVocF9mb3JjZSkgewogCQlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IGdldF9zZXJ2aWNlX2RhdGEoZGV2KTsKLQkJc3RydWN0IHNsb3QgKnRfc2xvdDsKKwkJc3RydWN0IHNsb3QgKnNsb3Q7CiAJCXU4IHN0YXR1czsKIAogCQkvKiByZWluaXRpYWxpemUgdGhlIGNoaXBzZXQncyBldmVudCBkZXRlY3Rpb24gbG9naWMgKi8KIAkJcGNpZV9lbmFibGVfbm90aWZpY2F0aW9uKGN0cmwpOwogCi0JCXRfc2xvdCA9IHBjaWVocF9maW5kX3Nsb3QoY3RybCwgY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0KTsKKwkJc2xvdCA9IGN0cmwtPnNsb3Q7CiAKIAkJLyogQ2hlY2sgaWYgc2xvdCBpcyBvY2N1cGllZCAqLwotCQl0X3Nsb3QtPmhwY19vcHMtPmdldF9hZGFwdGVyX3N0YXR1cyh0X3Nsb3QsICZzdGF0dXMpOworCQlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHNsb3QsICZzdGF0dXMpOwogCQlpZiAoc3RhdHVzKQotCQkJcGNpZWhwX2VuYWJsZV9zbG90KHRfc2xvdCk7CisJCQlwY2llaHBfZW5hYmxlX3Nsb3Qoc2xvdCk7CiAJCWVsc2UKLQkJCXBjaWVocF9kaXNhYmxlX3Nsb3QodF9zbG90KTsKKwkJCXBjaWVocF9kaXNhYmxlX3Nsb3Qoc2xvdCk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCmluZGV4IGI5N2NiNGMuLjg0NDg3ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkvKiBTd2l0Y2ggQ2hhbmdlICovCiAJY3RybF9kYmcoY3RybCwgIlN3aXRjaCBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOwogCi0JcF9zbG90LT5ocGNfb3BzLT5nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CisJcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAlpZiAoZ2V0c3RhdHVzKSB7CiAJCS8qCiAJCSAqIFN3aXRjaCBvcGVuZWQKQEAgLTExNCw3ICsxMTQsNyBAQAogCS8qIFN3aXRjaCBpcyBvcGVuLCBhc3N1bWUgYSBwcmVzZW5jZSBjaGFuZ2UKIAkgKiBTYXZlIHRoZSBwcmVzZW5jZSBzdGF0ZQogCSAqLwotCXBfc2xvdC0+aHBjX29wcy0+Z2V0X2FkYXB0ZXJfc3RhdHVzKHBfc2xvdCwgJnByZXNlbmNlX3NhdmUpOworCXBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMocF9zbG90LCAmcHJlc2VuY2Vfc2F2ZSk7CiAJaWYgKHByZXNlbmNlX3NhdmUpIHsKIAkJLyoKIAkJICogQ2FyZCBQcmVzZW50CkBAIC0xNDMsNyArMTQzLDcgQEAKIAkvKiBwb3dlciBmYXVsdCAqLwogCWN0cmxfZGJnKGN0cmwsICJQb3dlciBmYXVsdCBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOwogCi0JaWYgKCAhKHBfc2xvdC0+aHBjX29wcy0+cXVlcnlfcG93ZXJfZmF1bHQocF9zbG90KSkpIHsKKwlpZiAoIXBjaWVocF9xdWVyeV9wb3dlcl9mYXVsdChwX3Nsb3QpKSB7CiAJCS8qCiAJCSAqIHBvd2VyIGZhdWx0IENsZWFyZWQKIAkJICovCkBAIC0xNzIsNyArMTcyLDcgQEAKIHsKIAkvKiB0dXJuIG9mZiBzbG90LCB0dXJuIG9uIEFtYmVyIExFRCwgdHVybiBvZmYgR3JlZW4gTEVEIGlmIHN1cHBvcnRlZCovCiAJaWYgKFBPV0VSX0NUUkwoY3RybCkpIHsKLQkJaWYgKHBzbG90LT5ocGNfb3BzLT5wb3dlcl9vZmZfc2xvdChwc2xvdCkpIHsKKwkJaWYgKHBjaWVocF9wb3dlcl9vZmZfc2xvdChwc2xvdCkpIHsKIAkJCWN0cmxfZXJyKGN0cmwsCiAJCQkJICJJc3N1ZSBvZiBTbG90IFBvd2VyIE9mZiBjb21tYW5kIGZhaWxlZFxuIik7CiAJCQlyZXR1cm47CkBAIC0xODYsMTAgKzE4NiwxMCBAQAogCX0KIAogCWlmIChQV1JfTEVEKGN0cmwpKQotCQlwc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29mZihwc2xvdCk7CisJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBzbG90KTsKIAogCWlmIChBVFROX0xFRChjdHJsKSkgewotCQlpZiAocHNsb3QtPmhwY19vcHMtPnNldF9hdHRlbnRpb25fc3RhdHVzKHBzbG90LCAxKSkgeworCQlpZiAocGNpZWhwX3NldF9hdHRlbnRpb25fc3RhdHVzKHBzbG90LCAxKSkgewogCQkJY3RybF9lcnIoY3RybCwKIAkJCQkgIklzc3VlIG9mIFNldCBBdHRlbnRpb24gTGVkIGNvbW1hbmQgZmFpbGVkXG4iKTsKIAkJCXJldHVybjsKQEAgLTIwOCwyNCArMjA4LDIwIEBACiB7CiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBwX3Nsb3QtPmN0cmw7Ci0Jc3RydWN0IHBjaV9idXMgKnBhcmVudCA9IGN0cmwtPnBjaV9kZXYtPnN1Ym9yZGluYXRlOwotCi0JY3RybF9kYmcoY3RybCwgIiVzOiBzbG90IGRldmljZSwgc2xvdCBvZmZzZXQsIGhwIHNsb3QgPSAlZCwgJWQsICVkXG4iLAotCQkgX19mdW5jX18sIHBfc2xvdC0+ZGV2aWNlLCBjdHJsLT5zbG90X2RldmljZV9vZmZzZXQsCi0JCSBwX3Nsb3QtPmhwX3Nsb3QpOworCXN0cnVjdCBwY2lfYnVzICpwYXJlbnQgPSBjdHJsLT5wY2llLT5wb3J0LT5zdWJvcmRpbmF0ZTsKIAogCWlmIChQT1dFUl9DVFJMKGN0cmwpKSB7CiAJCS8qIFBvd2VyIG9uIHNsb3QgKi8KLQkJcmV0dmFsID0gcF9zbG90LT5ocGNfb3BzLT5wb3dlcl9vbl9zbG90KHBfc2xvdCk7CisJCXJldHZhbCA9IHBjaWVocF9wb3dlcl9vbl9zbG90KHBfc2xvdCk7CiAJCWlmIChyZXR2YWwpCiAJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAogCWlmIChQV1JfTEVEKGN0cmwpKQotCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9ibGluayhwX3Nsb3QpOworCQlwY2llaHBfZ3JlZW5fbGVkX2JsaW5rKHBfc2xvdCk7CiAKIAkvKiBDaGVjayBsaW5rIHRyYWluaW5nIHN0YXR1cyAqLwotCXJldHZhbCA9IHBfc2xvdC0+aHBjX29wcy0+Y2hlY2tfbG5rX3N0YXR1cyhjdHJsKTsKKwlyZXR2YWwgPSBwY2llaHBfY2hlY2tfbGlua19zdGF0dXMoY3RybCk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiRmFpbGVkIHRvIGNoZWNrIGxpbmsgc3RhdHVzXG4iKTsKIAkJc2V0X3Nsb3Rfb2ZmKGN0cmwsIHBfc2xvdCk7CkBAIC0yMzMsMjEgKzIyOSwyMSBAQAogCX0KIAogCS8qIENoZWNrIGZvciBhIHBvd2VyIGZhdWx0ICovCi0JaWYgKHBfc2xvdC0+aHBjX29wcy0+cXVlcnlfcG93ZXJfZmF1bHQocF9zbG90KSkgeworCWlmIChwY2llaHBfcXVlcnlfcG93ZXJfZmF1bHQocF9zbG90KSkgewogCQljdHJsX2RiZyhjdHJsLCAiUG93ZXIgZmF1bHQgZGV0ZWN0ZWRcbiIpOwotCQlyZXR2YWwgPSBQT1dFUl9GQUlMVVJFOworCQlyZXR2YWwgPSAtRUlPOwogCQlnb3RvIGVycl9leGl0OwogCX0KIAogCXJldHZhbCA9IHBjaWVocF9jb25maWd1cmVfZGV2aWNlKHBfc2xvdCk7CiAJaWYgKHJldHZhbCkgewotCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGFkZCBkZXZpY2UgYXQgJTA0eDolMDJ4OiUwMnhcbiIsCi0JCQkgcGNpX2RvbWFpbl9ucihwYXJlbnQpLCBwX3Nsb3QtPmJ1cywgcF9zbG90LT5kZXZpY2UpOworCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGFkZCBkZXZpY2UgYXQgJTA0eDolMDJ4OjAwXG4iLAorCQkJIHBjaV9kb21haW5fbnIocGFyZW50KSwgcGFyZW50LT5udW1iZXIpOwogCQlnb3RvIGVycl9leGl0OwogCX0KIAogCWlmIChQV1JfTEVEKGN0cmwpKQotICAJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29uKHBfc2xvdCk7CisJCXBjaWVocF9ncmVlbl9sZWRfb24ocF9zbG90KTsKIAogCXJldHVybiAwOwogCkBAIC0yNjksMTEgKzI2NSw5IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCWN0cmxfZGJnKGN0cmwsICIlczogaHBfc2xvdCA9ICVkXG4iLCBfX2Z1bmNfXywgcF9zbG90LT5ocF9zbG90KTsKLQogCWlmIChQT1dFUl9DVFJMKGN0cmwpKSB7CiAJCS8qIHBvd2VyIG9mZiBzbG90ICovCi0JCXJldHZhbCA9IHBfc2xvdC0+aHBjX29wcy0+cG93ZXJfb2ZmX3Nsb3QocF9zbG90KTsKKwkJcmV0dmFsID0gcGNpZWhwX3Bvd2VyX29mZl9zbG90KHBfc2xvdCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWN0cmxfZXJyKGN0cmwsCiAJCQkJICJJc3N1ZSBvZiBTbG90IERpc2FibGUgY29tbWFuZCBmYWlsZWRcbiIpOwpAQCAtMjg3LDkgKzI4MSw5IEBACiAJCW1zbGVlcCgxMDAwKTsKIAl9CiAKKwkvKiB0dXJuIG9mZiBHcmVlbiBMRUQgKi8KIAlpZiAoUFdSX0xFRChjdHJsKSkKLQkJLyogdHVybiBvZmYgR3JlZW4gTEVEICovCi0JCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29mZihwX3Nsb3QpOworCQlwY2llaHBfZ3JlZW5fbGVkX29mZihwX3Nsb3QpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTcsMTggKzMxMSwxNyBAQAogCWNhc2UgUE9XRVJPRkZfU1RBVEU6CiAJCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKIAkJY3RybF9kYmcocF9zbG90LT5jdHJsLAotCQkJICJEaXNhYmxpbmcgZG9tYWluOmJ1czpkZXZpY2U9JTA0eDolMDJ4OiUwMnhcbiIsCi0JCQkgcGNpX2RvbWFpbl9ucihwX3Nsb3QtPmN0cmwtPnBjaV9kZXYtPnN1Ym9yZGluYXRlKSwKLQkJCSBwX3Nsb3QtPmJ1cywgcF9zbG90LT5kZXZpY2UpOworCQkJICJEaXNhYmxpbmcgZG9tYWluOmJ1czpkZXZpY2U9JTA0eDolMDJ4OjAwXG4iLAorCQkJIHBjaV9kb21haW5fbnIocF9zbG90LT5jdHJsLT5wY2llLT5wb3J0LT5zdWJvcmRpbmF0ZSksCisJCQkgcF9zbG90LT5jdHJsLT5wY2llLT5wb3J0LT5zdWJvcmRpbmF0ZS0+bnVtYmVyKTsKIAkJcGNpZWhwX2Rpc2FibGVfc2xvdChwX3Nsb3QpOwogCQltdXRleF9sb2NrKCZwX3Nsb3QtPmxvY2spOwogCQlwX3Nsb3QtPnN0YXRlID0gU1RBVElDX1NUQVRFOwogCQlicmVhazsKIAljYXNlIFBPV0VST05fU1RBVEU6CiAJCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKLQkJaWYgKHBjaWVocF9lbmFibGVfc2xvdChwX3Nsb3QpICYmCi0JCSAgICBQV1JfTEVEKHBfc2xvdC0+Y3RybCkpCi0JCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9vZmYocF9zbG90KTsKKwkJaWYgKHBjaWVocF9lbmFibGVfc2xvdChwX3Nsb3QpICYmIFBXUl9MRUQocF9zbG90LT5jdHJsKSkKKwkJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAJCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CiAJCWJyZWFrOwpAQCAtMzc5LDEwICszNzIsMTAgQEAKIAlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2xvdC0+aHBjX29wcy0+Z2V0X3Bvd2VyX3N0YXR1cyhzbG90LCAmKGluZm8tPnBvd2VyX3N0YXR1cykpOwotCXNsb3QtPmhwY19vcHMtPmdldF9hdHRlbnRpb25fc3RhdHVzKHNsb3QsICYoaW5mby0+YXR0ZW50aW9uX3N0YXR1cykpOwotCXNsb3QtPmhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMoc2xvdCwgJihpbmZvLT5sYXRjaF9zdGF0dXMpKTsKLQlzbG90LT5ocGNfb3BzLT5nZXRfYWRhcHRlcl9zdGF0dXMoc2xvdCwgJihpbmZvLT5hZGFwdGVyX3N0YXR1cykpOworCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHNsb3QsICZpbmZvLT5wb3dlcl9zdGF0dXMpOworCXBjaWVocF9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCAmaW5mby0+YXR0ZW50aW9uX3N0YXR1cyk7CisJcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMoc2xvdCwgJmluZm8tPmxhdGNoX3N0YXR1cyk7CisJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmaW5mby0+YWRhcHRlcl9zdGF0dXMpOwogCiAJcmVzdWx0ID0gcGNpX2hwX2NoYW5nZV9zbG90X2luZm8oc2xvdC0+aG90cGx1Z19zbG90LCBpbmZvKTsKIAlrZnJlZSAoaW5mbyk7CkBAIC0zOTksNyArMzkyLDcgQEAKIAogCXN3aXRjaCAocF9zbG90LT5zdGF0ZSkgewogCWNhc2UgU1RBVElDX1NUQVRFOgotCQlwX3Nsb3QtPmhwY19vcHMtPmdldF9wb3dlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKKwkJcGNpZWhwX2dldF9wb3dlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKGdldHN0YXR1cykgewogCQkJcF9zbG90LT5zdGF0ZSA9IEJMSU5LSU5HT0ZGX1NUQVRFOwogCQkJY3RybF9pbmZvKGN0cmwsCkBAIC00MTMsOSArNDA2LDkgQEAKIAkJfQogCQkvKiBibGluayBncmVlbiBMRUQgYW5kIHR1cm4gb2ZmIGFtYmVyICovCiAJCWlmIChQV1JfTEVEKGN0cmwpKQotCQkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfYmxpbmsocF9zbG90KTsKKwkJCXBjaWVocF9ncmVlbl9sZWRfYmxpbmsocF9zbG90KTsKIAkJaWYgKEFUVE5fTEVEKGN0cmwpKQotCQkJcF9zbG90LT5ocGNfb3BzLT5zZXRfYXR0ZW50aW9uX3N0YXR1cyhwX3Nsb3QsIDApOworCQkJcGNpZWhwX3NldF9hdHRlbnRpb25fc3RhdHVzKHBfc2xvdCwgMCk7CiAKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwX3Nsb3QtPndvcmssIDUqSFopOwogCQlicmVhazsKQEAgLTQzMCwxMyArNDIzLDEzIEBACiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnBfc2xvdC0+d29yayk7CiAJCWlmIChwX3Nsb3QtPnN0YXRlID09IEJMSU5LSU5HT0ZGX1NUQVRFKSB7CiAJCQlpZiAoUFdSX0xFRChjdHJsKSkKLQkJCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9vbihwX3Nsb3QpOworCQkJCXBjaWVocF9ncmVlbl9sZWRfb24ocF9zbG90KTsKIAkJfSBlbHNlIHsKIAkJCWlmIChQV1JfTEVEKGN0cmwpKQotCQkJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29mZihwX3Nsb3QpOworCQkJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAJCX0KIAkJaWYgKEFUVE5fTEVEKGN0cmwpKQotCQkJcF9zbG90LT5ocGNfb3BzLT5zZXRfYXR0ZW50aW9uX3N0YXR1cyhwX3Nsb3QsIDApOworCQkJcGNpZWhwX3NldF9hdHRlbnRpb25fc3RhdHVzKHBfc2xvdCwgMCk7CiAJCWN0cmxfaW5mbyhjdHJsLCAiUENJIHNsb3QgIyVzIC0gYWN0aW9uIGNhbmNlbGVkICIKIAkJCSAgImR1ZSB0byBidXR0b24gcHJlc3NcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJcF9zbG90LT5zdGF0ZSA9IFNUQVRJQ19TVEFURTsKQEAgLTQ3NCw3ICs0NjcsNyBAQAogCWluZm8tPnBfc2xvdCA9IHBfc2xvdDsKIAlJTklUX1dPUksoJmluZm8tPndvcmssIHBjaWVocF9wb3dlcl90aHJlYWQpOwogCi0JcF9zbG90LT5ocGNfb3BzLT5nZXRfYWRhcHRlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKKwlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJaWYgKCFnZXRzdGF0dXMpCiAJCXBfc2xvdC0+c3RhdGUgPSBQT1dFUk9GRl9TVEFURTsKIAllbHNlCkBAIC00OTgsOSArNDkxLDkgQEAKIAkJaWYgKCFQT1dFUl9DVFJMKGN0cmwpKQogCQkJYnJlYWs7CiAJCWlmIChBVFROX0xFRChjdHJsKSkKLQkJCXBfc2xvdC0+aHBjX29wcy0+c2V0X2F0dGVudGlvbl9zdGF0dXMocF9zbG90LCAxKTsKKwkJCXBjaWVocF9zZXRfYXR0ZW50aW9uX3N0YXR1cyhwX3Nsb3QsIDEpOwogCQlpZiAoUFdSX0xFRChjdHJsKSkKLQkJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29mZihwX3Nsb3QpOworCQkJcGNpZWhwX2dyZWVuX2xlZF9vZmYocF9zbG90KTsKIAkJYnJlYWs7CiAJY2FzZSBJTlRfUFJFU0VOQ0VfT046CiAJY2FzZSBJTlRfUFJFU0VOQ0VfT0ZGOgpAQCAtNTI1LDQ1ICs1MTgsMzggQEAKIAlpbnQgcmM7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBwX3Nsb3QtPmN0cmw7CiAKLQkvKiBDaGVjayB0byBzZWUgaWYgKGxhdGNoIGNsb3NlZCwgY2FyZCBwcmVzZW50LCBwb3dlciBvZmYpICovCi0JbXV0ZXhfbG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCi0JcmMgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOworCXJjID0gcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCWlmIChyYyB8fCAhZ2V0c3RhdHVzKSB7CiAJCWN0cmxfaW5mbyhjdHJsLCAiTm8gYWRhcHRlciBvbiBzbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwotCQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWlmIChNUkxfU0VOUyhwX3Nsb3QtPmN0cmwpKSB7Ci0JCXJjID0gcF9zbG90LT5ocGNfb3BzLT5nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CisJCXJjID0gcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKHJjIHx8IGdldHN0YXR1cykgewogCQkJY3RybF9pbmZvKGN0cmwsICJMYXRjaCBvcGVuIG9uIHNsb3QoJXMpXG4iLAogCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwotCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KIAogCWlmIChQT1dFUl9DVFJMKHBfc2xvdC0+Y3RybCkpIHsKLQkJcmMgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9wb3dlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKKwkJcmMgPSBwY2llaHBfZ2V0X3Bvd2VyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAocmMgfHwgZ2V0c3RhdHVzKSB7CiAJCQljdHJsX2luZm8oY3RybCwgIkFscmVhZHkgZW5hYmxlZCBvbiBzbG90KCVzKVxuIiwKIAkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKLQlwX3Nsb3QtPmhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKKwlwY2llaHBfZ2V0X2xhdGNoX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCiAJcmMgPSBib2FyZF9hZGRlZChwX3Nsb3QpOwogCWlmIChyYykgewotCQlwX3Nsb3QtPmhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKKwkJcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAl9CiAKIAl1cGRhdGVfc2xvdF9pbmZvKHBfc2xvdCk7CiAKLQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTU3NywzNSArNTYzLDI5IEBACiAJaWYgKCFwX3Nsb3QtPmN0cmwpCiAJCXJldHVybiAxOwogCi0JLyogQ2hlY2sgdG8gc2VlIGlmIChsYXRjaCBjbG9zZWQsIGNhcmQgcHJlc2VudCwgcG93ZXIgb24pICovCi0JbXV0ZXhfbG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCiAJaWYgKCFIUF9TVVBSX1JNKHBfc2xvdC0+Y3RybCkpIHsKLQkJcmV0ID0gcF9zbG90LT5ocGNfb3BzLT5nZXRfYWRhcHRlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKKwkJcmV0ID0gcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAocmV0IHx8ICFnZXRzdGF0dXMpIHsKIAkJCWN0cmxfaW5mbyhjdHJsLCAiTm8gYWRhcHRlciBvbiBzbG90KCVzKVxuIiwKIAkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CiAKIAlpZiAoTVJMX1NFTlMocF9zbG90LT5jdHJsKSkgewotCQlyZXQgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKKwkJcmV0ID0gcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKHJldCB8fCBnZXRzdGF0dXMpIHsKIAkJCWN0cmxfaW5mbyhjdHJsLCAiTGF0Y2ggb3BlbiBvbiBzbG90KCVzKVxuIiwKIAkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CiAKIAlpZiAoUE9XRVJfQ1RSTChwX3Nsb3QtPmN0cmwpKSB7Ci0JCXJldCA9IHBfc2xvdC0+aHBjX29wcy0+Z2V0X3Bvd2VyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOworCQlyZXQgPSBwY2llaHBfZ2V0X3Bvd2VyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAocmV0IHx8ICFnZXRzdGF0dXMpIHsKIAkJCWN0cmxfaW5mbyhjdHJsLCAiQWxyZWFkeSBkaXNhYmxlZCBvbiBzbG90KCVzKVxuIiwKIAkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC02MTMsNyArNTkzLDYgQEAKIAlyZXQgPSByZW1vdmVfYm9hcmQocF9zbG90KTsKIAl1cGRhdGVfc2xvdF9pbmZvKHBfc2xvdCk7CiAKLQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCmluZGV4IDI3MWY5MTcuLjllZjQ2MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCkBAIC00NCwyNSArNDQsMjUgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcGNpZWhwX3JlYWR3KHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBpbnQgcmVnLCB1MTYgKnZhbHVlKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2lfZGV2OworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2llLT5wb3J0OwogCXJldHVybiBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGN0cmwtPmNhcF9iYXNlICsgcmVnLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBjaWVocF9yZWFkbChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgaW50IHJlZywgdTMyICp2YWx1ZSkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gY3RybC0+cGNpX2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gY3RybC0+cGNpZS0+cG9ydDsKIAlyZXR1cm4gcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgY3RybC0+Y2FwX2Jhc2UgKyByZWcsIHZhbHVlKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcGNpZWhwX3dyaXRldyhzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgaW50IHJlZywgdTE2IHZhbHVlKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2lfZGV2OworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2llLT5wb3J0OwogCXJldHVybiBwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBjdHJsLT5jYXBfYmFzZSArIHJlZywgdmFsdWUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwY2llaHBfd3JpdGVsKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBpbnQgcmVnLCB1MzIgdmFsdWUpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaV9kZXY7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaWUtPnBvcnQ7CiAJcmV0dXJuIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBjdHJsLT5jYXBfYmFzZSArIHJlZywgdmFsdWUpOwogfQogCkBAIC0yNjYsNyArMjY2LDcgQEAKIAljdHJsX2RiZyhjdHJsLCAiRGF0YSBMaW5rIExheWVyIExpbmsgQWN0aXZlIG5vdCBzZXQgaW4gMTAwMCBtc2VjXG4iKTsKIH0KIAotc3RhdGljIGludCBocGNfY2hlY2tfbG5rX3N0YXR1cyhzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKK2ludCBwY2llaHBfY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7CiAJdTE2IGxua19zdGF0dXM7CiAJaW50IHJldHZhbCA9IDA7CkBAIC0zMDUsNyArMzA1LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGhwY19nZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cykKK2ludCBwY2llaHBfZ2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIHU4ICpzdGF0dXMpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X2N0cmw7CkBAIC0zNDQsNyArMzQ0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBocGNfZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cykKK2ludCBwY2llaHBfZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cykKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3RfY3RybDsKQEAgLTM3Niw3ICszNzYsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgaHBjX2dldF9sYXRjaF9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIHU4ICpzdGF0dXMpCitpbnQgcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIHU4ICpzdGF0dXMpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X3N0YXR1czsKQEAgLTM5Miw3ICszOTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhwY19nZXRfYWRhcHRlcl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIHU4ICpzdGF0dXMpCitpbnQgcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cykKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3Rfc3RhdHVzOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaHBjX3F1ZXJ5X3Bvd2VyX2ZhdWx0KHN0cnVjdCBzbG90ICpzbG90KQoraW50IHBjaWVocF9xdWVyeV9wb3dlcl9mYXVsdChzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3Rfc3RhdHVzOwpAQCAtNDIyLDcgKzQyMiw3IEBACiAJcmV0dXJuICEhKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfUEZEKTsKIH0KIAotc3RhdGljIGludCBocGNfc2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIHU4IHZhbHVlKQoraW50IHBjaWVocF9zZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggdmFsdWUpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X2NtZDsKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgaHBjX3NldF9ncmVlbl9sZWRfb24oc3RydWN0IHNsb3QgKnNsb3QpCit2b2lkIHBjaWVocF9ncmVlbl9sZWRfb24oc3RydWN0IHNsb3QgKnNsb3QpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X2NtZDsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIH0KIAotc3RhdGljIHZvaWQgaHBjX3NldF9ncmVlbl9sZWRfb2ZmKHN0cnVjdCBzbG90ICpzbG90KQordm9pZCBwY2llaHBfZ3JlZW5fbGVkX29mZihzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3RfY21kOwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogfQogCi1zdGF0aWMgdm9pZCBocGNfc2V0X2dyZWVuX2xlZF9ibGluayhzdHJ1Y3Qgc2xvdCAqc2xvdCkKK3ZvaWQgcGNpZWhwX2dyZWVuX2xlZF9ibGluayhzdHJ1Y3Qgc2xvdCAqc2xvdCkKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3RfY21kOwpAQCAtNDg5LDcgKzQ4OSw3IEBACiAJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogfQogCi1zdGF0aWMgaW50IGhwY19wb3dlcl9vbl9zbG90KHN0cnVjdCBzbG90ICogc2xvdCkKK2ludCBwY2llaHBfcG93ZXJfb25fc2xvdChzdHJ1Y3Qgc2xvdCAqIHNsb3QpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X2NtZDsKQEAgLTQ5Nyw4ICs0OTcsNiBAQAogCXUxNiBzbG90X3N0YXR1czsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWN0cmxfZGJnKGN0cmwsICIlczogc2xvdC0+aHBfc2xvdCAleFxuIiwgX19mdW5jX18sIHNsb3QtPmhwX3Nsb3QpOwotCiAJLyogQ2xlYXIgc3RpY2t5IHBvd2VyLWZhdWx0IGJpdCBmcm9tIHByZXZpb3VzIHBvd2VyIGZhaWx1cmVzICovCiAJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKQEAgLTUzOSw3ICs1MzcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwY2llX21hc2tfYmFkX2RsbHAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaV9kZXY7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaWUtPnBvcnQ7CiAJaW50IHBvczsKIAl1MzIgcmVnOwogCkBAIC01NTYsNyArNTU0LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHBjaWVfdW5tYXNrX2JhZF9kbGxwKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2lfZGV2OworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2llLT5wb3J0OwogCXUzMiByZWc7CiAJaW50IHBvczsKIApAQCAtNTcwLDcgKzU2OCw3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfQ09SX01BU0ssIHJlZyk7CiB9CiAKLXN0YXRpYyBpbnQgaHBjX3Bvd2VyX29mZl9zbG90KHN0cnVjdCBzbG90ICogc2xvdCkKK2ludCBwY2llaHBfcG93ZXJfb2ZmX3Nsb3Qoc3RydWN0IHNsb3QgKiBzbG90KQogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKIAl1MTYgc2xvdF9jbWQ7CkBAIC01NzgsOCArNTc2LDYgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAlpbnQgY2hhbmdlZDsKIAotCWN0cmxfZGJnKGN0cmwsICIlczogc2xvdC0+aHBfc2xvdCAleFxuIiwgX19mdW5jX18sIHNsb3QtPmhwX3Nsb3QpOwotCiAJLyoKIAkgKiBTZXQgQmFkIERMTFAgTWFzayBiaXQgaW4gQ29ycmVjdGFibGUgRXJyb3IgTWFzawogCSAqIFJlZ2lzdGVyLiBUaGlzIGlzIHRoZSB3b3JrYXJvdW5kIGFnYWluc3QgQmFkIERMTFAgZXJyb3IKQEAgLTYxNCw4ICs2MTAsOCBAQAogc3RhdGljIGlycXJldHVybl90IHBjaWVfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IChzdHJ1Y3QgY29udHJvbGxlciAqKWRldl9pZDsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGN0cmwtPnNsb3Q7CiAJdTE2IGRldGVjdGVkLCBpbnRyX2xvYzsKLQlzdHJ1Y3Qgc2xvdCAqcF9zbG90OwogCiAJLyoKIAkgKiBJbiBvcmRlciB0byBndWFyYW50ZWUgdGhhdCBhbGwgaW50ZXJydXB0IGV2ZW50cyBhcmUKQEAgLTY1NiwyOSArNjUyLDI3IEBACiAJaWYgKCEoaW50cl9sb2MgJiB+UENJX0VYUF9TTFRTVEFfQ0MpKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKLQlwX3Nsb3QgPSBwY2llaHBfZmluZF9zbG90KGN0cmwsIGN0cmwtPnNsb3RfZGV2aWNlX29mZnNldCk7Ci0KIAkvKiBDaGVjayBNUkwgU2Vuc29yIENoYW5nZWQgKi8KIAlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9NUkxTQykKLQkJcGNpZWhwX2hhbmRsZV9zd2l0Y2hfY2hhbmdlKHBfc2xvdCk7CisJCXBjaWVocF9oYW5kbGVfc3dpdGNoX2NoYW5nZShzbG90KTsKIAogCS8qIENoZWNrIEF0dGVudGlvbiBCdXR0b24gUHJlc3NlZCAqLwogCWlmIChpbnRyX2xvYyAmIFBDSV9FWFBfU0xUU1RBX0FCUCkKLQkJcGNpZWhwX2hhbmRsZV9hdHRlbnRpb25fYnV0dG9uKHBfc2xvdCk7CisJCXBjaWVocF9oYW5kbGVfYXR0ZW50aW9uX2J1dHRvbihzbG90KTsKIAogCS8qIENoZWNrIFByZXNlbmNlIERldGVjdCBDaGFuZ2VkICovCiAJaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfUERDKQotCQlwY2llaHBfaGFuZGxlX3ByZXNlbmNlX2NoYW5nZShwX3Nsb3QpOworCQlwY2llaHBfaGFuZGxlX3ByZXNlbmNlX2NoYW5nZShzbG90KTsKIAogCS8qIENoZWNrIFBvd2VyIEZhdWx0IERldGVjdGVkICovCiAJaWYgKChpbnRyX2xvYyAmIFBDSV9FWFBfU0xUU1RBX1BGRCkgJiYgIWN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkKSB7CiAJCWN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkID0gMTsKLQkJcGNpZWhwX2hhbmRsZV9wb3dlcl9mYXVsdChwX3Nsb3QpOworCQlwY2llaHBfaGFuZGxlX3Bvd2VyX2ZhdWx0KHNsb3QpOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgaHBjX2dldF9tYXhfbG5rX3NwZWVkKHN0cnVjdCBzbG90ICpzbG90LCBlbnVtIHBjaV9idXNfc3BlZWQgKnZhbHVlKQoraW50IHBjaWVocF9nZXRfbWF4X2xpbmtfc3BlZWQoc3RydWN0IHNsb3QgKnNsb3QsIGVudW0gcGNpX2J1c19zcGVlZCAqdmFsdWUpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCWVudW0gcGNpZV9saW5rX3NwZWVkIGxua19zcGVlZDsKQEAgLTcwOSw3ICs3MDMsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgaHBjX2dldF9tYXhfbG5rX3dpZHRoKHN0cnVjdCBzbG90ICpzbG90LAoraW50IHBjaWVocF9nZXRfbWF4X2xua193aWR0aChzdHJ1Y3Qgc2xvdCAqc2xvdCwKIAkJCQkgZW51bSBwY2llX2xpbmtfd2lkdGggKnZhbHVlKQogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKQEAgLTc1OSw3ICs3NTMsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgaHBjX2dldF9jdXJfbG5rX3NwZWVkKHN0cnVjdCBzbG90ICpzbG90LCBlbnVtIHBjaV9idXNfc3BlZWQgKnZhbHVlKQoraW50IHBjaWVocF9nZXRfY3VyX2xpbmtfc3BlZWQoc3RydWN0IHNsb3QgKnNsb3QsIGVudW0gcGNpX2J1c19zcGVlZCAqdmFsdWUpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCWVudW0gcGNpZV9saW5rX3NwZWVkIGxua19zcGVlZCA9IFBDSV9TUEVFRF9VTktOT1dOOwpAQCAtNzkxLDcgKzc4NSw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBocGNfZ2V0X2N1cl9sbmtfd2lkdGgoc3RydWN0IHNsb3QgKnNsb3QsCitpbnQgcGNpZWhwX2dldF9jdXJfbG5rX3dpZHRoKHN0cnVjdCBzbG90ICpzbG90LAogCQkJCSBlbnVtIHBjaWVfbGlua193aWR0aCAqdmFsdWUpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwpAQCAtODQyLDMwICs4MzYsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaWVfcmVsZWFzZV9jdHJsKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKTsKLXN0YXRpYyBzdHJ1Y3QgaHBjX29wcyBwY2llaHBfaHBjX29wcyA9IHsKLQkucG93ZXJfb25fc2xvdAkJCT0gaHBjX3Bvd2VyX29uX3Nsb3QsCi0JLnBvd2VyX29mZl9zbG90CQkJPSBocGNfcG93ZXJfb2ZmX3Nsb3QsCi0JLnNldF9hdHRlbnRpb25fc3RhdHVzCQk9IGhwY19zZXRfYXR0ZW50aW9uX3N0YXR1cywKLQkuZ2V0X3Bvd2VyX3N0YXR1cwkJPSBocGNfZ2V0X3Bvd2VyX3N0YXR1cywKLQkuZ2V0X2F0dGVudGlvbl9zdGF0dXMJCT0gaHBjX2dldF9hdHRlbnRpb25fc3RhdHVzLAotCS5nZXRfbGF0Y2hfc3RhdHVzCQk9IGhwY19nZXRfbGF0Y2hfc3RhdHVzLAotCS5nZXRfYWRhcHRlcl9zdGF0dXMJCT0gaHBjX2dldF9hZGFwdGVyX3N0YXR1cywKLQotCS5nZXRfbWF4X2J1c19zcGVlZAkJPSBocGNfZ2V0X21heF9sbmtfc3BlZWQsCi0JLmdldF9jdXJfYnVzX3NwZWVkCQk9IGhwY19nZXRfY3VyX2xua19zcGVlZCwKLQkuZ2V0X21heF9sbmtfd2lkdGgJCT0gaHBjX2dldF9tYXhfbG5rX3dpZHRoLAotCS5nZXRfY3VyX2xua193aWR0aAkJPSBocGNfZ2V0X2N1cl9sbmtfd2lkdGgsCi0KLQkucXVlcnlfcG93ZXJfZmF1bHQJCT0gaHBjX3F1ZXJ5X3Bvd2VyX2ZhdWx0LAotCS5ncmVlbl9sZWRfb24JCQk9IGhwY19zZXRfZ3JlZW5fbGVkX29uLAotCS5ncmVlbl9sZWRfb2ZmCQkJPSBocGNfc2V0X2dyZWVuX2xlZF9vZmYsCi0JLmdyZWVuX2xlZF9ibGluawkJPSBocGNfc2V0X2dyZWVuX2xlZF9ibGluaywKLQotCS5yZWxlYXNlX2N0bHIJCQk9IHBjaWVfcmVsZWFzZV9jdHJsLAotCS5jaGVja19sbmtfc3RhdHVzCQk9IGhwY19jaGVja19sbmtfc3RhdHVzLAotfTsKLQogaW50IHBjaWVfZW5hYmxlX25vdGlmaWNhdGlvbihzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKIAl1MTYgY21kLCBtYXNrOwpAQCAtOTMwLDIzICs5MDAsMTYgQEAKIAlpZiAoIXNsb3QpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2xvdC0+aHBfc2xvdCA9IDA7CiAJc2xvdC0+Y3RybCA9IGN0cmw7Ci0Jc2xvdC0+YnVzID0gY3RybC0+cGNpX2Rldi0+c3Vib3JkaW5hdGUtPm51bWJlcjsKLQlzbG90LT5kZXZpY2UgPSBjdHJsLT5zbG90X2RldmljZV9vZmZzZXQgKyBzbG90LT5ocF9zbG90OwotCXNsb3QtPmhwY19vcHMgPSBjdHJsLT5ocGNfb3BzOwotCXNsb3QtPm51bWJlciA9IGN0cmwtPmZpcnN0X3Nsb3Q7CiAJbXV0ZXhfaW5pdCgmc2xvdC0+bG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnNsb3QtPndvcmssIHBjaWVocF9xdWV1ZV9wdXNoYnV0dG9uX3dvcmspOwotCWxpc3RfYWRkKCZzbG90LT5zbG90X2xpc3QsICZjdHJsLT5zbG90X2xpc3QpOworCWN0cmwtPnNsb3QgPSBzbG90OwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBwY2llX2NsZWFudXBfc2xvdChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKLQlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQlzbG90ID0gbGlzdF9maXJzdF9lbnRyeSgmY3RybC0+c2xvdF9saXN0LCBzdHJ1Y3Qgc2xvdCwgc2xvdF9saXN0KTsKLQlsaXN0X2RlbCgmc2xvdC0+c2xvdF9saXN0KTsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGN0cmwtPnNsb3Q7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmc2xvdC0+d29yayk7CiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAlmbHVzaF93b3JrcXVldWUocGNpZWhwX3dxKTsKQEAgLTk1Nyw3ICs5MjAsNyBAQAogewogCWludCBpOwogCXUxNiByZWcxNjsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGN0cmwtPnBjaV9kZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjdHJsLT5wY2llLT5wb3J0OwogCiAJaWYgKCFwY2llaHBfZGVidWcpCiAJCXJldHVybjsKQEAgLTk4MCw3ICs5NDMsNyBAQAogCQkJICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKSk7CiAJfQogCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCBDYXBhYmlsaXRpZXMgICAgICA6IDB4JTA4eFxuIiwgY3RybC0+c2xvdF9jYXApOwotCWN0cmxfaW5mbyhjdHJsLCAiICBQaHlzaWNhbCBTbG90IE51bWJlciA6ICVkXG4iLCBjdHJsLT5maXJzdF9zbG90KTsKKwljdHJsX2luZm8oY3RybCwgIiAgUGh5c2ljYWwgU2xvdCBOdW1iZXIgOiAlZFxuIiwgUFNOKGN0cmwpKTsKIAljdHJsX2luZm8oY3RybCwgIiAgQXR0ZW50aW9uIEJ1dHRvbiAgICAgOiAlM3NcbiIsCiAJCSAgQVRUTl9CVVRUTihjdHJsKSA/ICJ5ZXMiIDogIm5vIik7CiAJY3RybF9pbmZvKGN0cmwsICIgIFBvd2VyIENvbnRyb2xsZXIgICAgIDogJTNzXG4iLApAQCAtMTAxNCwxMCArOTc3LDcgQEAKIAkJZGV2X2VycigmZGV2LT5kZXZpY2UsICIlczogT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlnb3RvIGFib3J0OwogCX0KLQlJTklUX0xJU1RfSEVBRCgmY3RybC0+c2xvdF9saXN0KTsKLQogCWN0cmwtPnBjaWUgPSBkZXY7Ci0JY3RybC0+cGNpX2RldiA9IHBkZXY7CiAJY3RybC0+Y2FwX2Jhc2UgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKIAlpZiAoIWN0cmwtPmNhcF9iYXNlKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgZmluZCBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5XG4iKTsKQEAgLTEwMjksMTEgKzk4OSw2IEBACiAJfQogCiAJY3RybC0+c2xvdF9jYXAgPSBzbG90X2NhcDsKLQljdHJsLT5maXJzdF9zbG90ID0gc2xvdF9jYXAgPj4gMTk7Ci0JY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0ID0gMDsKLQljdHJsLT5udW1fc2xvdHMgPSAxOwotCWN0cmwtPmhwY19vcHMgPSAmcGNpZWhwX2hwY19vcHM7Ci0JbXV0ZXhfaW5pdCgmY3RybC0+Y3JpdF9zZWN0KTsKIAltdXRleF9pbml0KCZjdHJsLT5jdHJsX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0cmwtPnF1ZXVlKTsKIAlkYmdfY3RybChjdHJsKTsKQEAgLTEwODksNyArMTA0NCw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgcGNpZV9yZWxlYXNlX2N0cmwoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCit2b2lkIHBjaWVocF9yZWxlYXNlX2N0cmwoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7CiAJcGNpZV9zaHV0ZG93bl9ub3RpZmljYXRpb24oY3RybCk7CiAJcGNpZV9jbGVhbnVwX3Nsb3QoY3RybCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jCmluZGV4IDAyZTI0ZDYuLjIxNzMzMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jCkBAIC02MywyNyArNjMsMjcgQEAKIGludCBwY2llaHBfY29uZmlndXJlX2RldmljZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IHBjaV9idXMgKnBhcmVudCA9IHBfc2xvdC0+Y3RybC0+cGNpX2Rldi0+c3Vib3JkaW5hdGU7CisJc3RydWN0IHBjaV9idXMgKnBhcmVudCA9IHBfc2xvdC0+Y3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGU7CiAJaW50IG51bSwgZm47CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBwX3Nsb3QtPmN0cmw7CiAKLQlkZXYgPSBwY2lfZ2V0X3Nsb3QocGFyZW50LCBQQ0lfREVWRk4ocF9zbG90LT5kZXZpY2UsIDApKTsKKwlkZXYgPSBwY2lfZ2V0X3Nsb3QocGFyZW50LCBQQ0lfREVWRk4oMCwgMCkpOwogCWlmIChkZXYpIHsKIAkJY3RybF9lcnIoY3RybCwgIkRldmljZSAlcyBhbHJlYWR5IGV4aXN0cyAiCi0JCQkgImF0ICUwNHg6JTAyeDolMDJ4LCBjYW5ub3QgaG90LWFkZFxuIiwgcGNpX25hbWUoZGV2KSwKLQkJCSBwY2lfZG9tYWluX25yKHBhcmVudCksIHBfc2xvdC0+YnVzLCBwX3Nsb3QtPmRldmljZSk7CisJCQkgImF0ICUwNHg6JTAyeDowMCwgY2Fubm90IGhvdC1hZGRcbiIsIHBjaV9uYW1lKGRldiksCisJCQkgcGNpX2RvbWFpbl9ucihwYXJlbnQpLCBwYXJlbnQtPm51bWJlcik7CiAJCXBjaV9kZXZfcHV0KGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW51bSA9IHBjaV9zY2FuX3Nsb3QocGFyZW50LCBQQ0lfREVWRk4ocF9zbG90LT5kZXZpY2UsIDApKTsKKwludW0gPSBwY2lfc2Nhbl9zbG90KHBhcmVudCwgUENJX0RFVkZOKDAsIDApKTsKIAlpZiAobnVtID09IDApIHsKIAkJY3RybF9lcnIoY3RybCwgIk5vIG5ldyBkZXZpY2UgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlmb3IgKGZuID0gMDsgZm4gPCA4OyBmbisrKSB7Ci0JCWRldiA9IHBjaV9nZXRfc2xvdChwYXJlbnQsIFBDSV9ERVZGTihwX3Nsb3QtPmRldmljZSwgZm4pKTsKKwkJZGV2ID0gcGNpX2dldF9zbG90KHBhcmVudCwgUENJX0RFVkZOKDAsIGZuKSk7CiAJCWlmICghZGV2KQogCQkJY29udGludWU7CiAJCWlmICgoZGV2LT5jbGFzcyA+PiAxNikgPT0gUENJX0JBU0VfQ0xBU1NfRElTUExBWSkgewpAQCAtMTExLDE5ICsxMTEsMTggQEAKIAlpbnQgajsKIAl1OCBiY3RsID0gMDsKIAl1OCBwcmVzZW5jZSA9IDA7Ci0Jc3RydWN0IHBjaV9idXMgKnBhcmVudCA9IHBfc2xvdC0+Y3RybC0+cGNpX2Rldi0+c3Vib3JkaW5hdGU7CisJc3RydWN0IHBjaV9idXMgKnBhcmVudCA9IHBfc2xvdC0+Y3RybC0+cGNpZS0+cG9ydC0+c3Vib3JkaW5hdGU7CiAJdTE2IGNvbW1hbmQ7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBwX3Nsb3QtPmN0cmw7CiAKLQljdHJsX2RiZyhjdHJsLCAiJXM6IGRvbWFpbjpidXM6ZGV2ID0gJTA0eDolMDJ4OiUwMnhcbiIsCi0JCSBfX2Z1bmNfXywgcGNpX2RvbWFpbl9ucihwYXJlbnQpLCBwX3Nsb3QtPmJ1cywgcF9zbG90LT5kZXZpY2UpOwotCXJldCA9IHBfc2xvdC0+aHBjX29wcy0+Z2V0X2FkYXB0ZXJfc3RhdHVzKHBfc2xvdCwgJnByZXNlbmNlKTsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IGRvbWFpbjpidXM6ZGV2ID0gJTA0eDolMDJ4OjAwXG4iLAorCQkgX19mdW5jX18sIHBjaV9kb21haW5fbnIocGFyZW50KSwgcGFyZW50LT5udW1iZXIpOworCXJldCA9IHBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMocF9zbG90LCAmcHJlc2VuY2UpOwogCWlmIChyZXQpCiAJCXByZXNlbmNlID0gMDsKIAogCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLQkJc3RydWN0IHBjaV9kZXYqIHRlbXAgPSBwY2lfZ2V0X3Nsb3QocGFyZW50LAotCQkJCShwX3Nsb3QtPmRldmljZSA8PCAzKSB8IGopOworCQlzdHJ1Y3QgcGNpX2RldiogdGVtcCA9IHBjaV9nZXRfc2xvdChwYXJlbnQsIFBDSV9ERVZGTigwLCBqKSk7CiAJCWlmICghdGVtcCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKHRlbXAtPmNsYXNzID4+IDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwppbmRleCA4NTVkZDdjLi5iMWU5N2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKQEAgLTQ4LDYgKzQ4LDcgQEAKIAogI2RlZmluZSBJU19HRlhfREVWSUNFKHBkZXYpICgocGRldi0+Y2xhc3MgPj4gMTYpID09IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkpCiAjZGVmaW5lIElTX0lTQV9ERVZJQ0UocGRldikgKChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX0lTQSkKKyNkZWZpbmUgSVNfQVpBTElBKHBkZXYpICgocGRldiktPnZlbmRvciA9PSAweDgwODYgJiYgKHBkZXYpLT5kZXZpY2UgPT0gMHgzYTNlKQogCiAjZGVmaW5lIElPQVBJQ19SQU5HRV9TVEFSVAkoMHhmZWUwMDAwMCkKICNkZWZpbmUgSU9BUElDX1JBTkdFX0VORAkoMHhmZWVmZmZmZikKQEAgLTk0LDYgKzk1LDcgQEAKIC8qIGdsb2JhbCBpb21tdSBsaXN0LCBzZXQgTlVMTCBmb3IgaWdub3JlZCBETUFSIHVuaXRzICovCiBzdGF0aWMgc3RydWN0IGludGVsX2lvbW11ICoqZ19pb21tdXM7CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja190eWxlcnNidXJnX2lzb2NoKHZvaWQpOwogc3RhdGljIGludCByd2JmX3F1aXJrOwogCiAvKgpAQCAtMTkzNCw2ICsxOTM2LDkgQEAKIH0KIAogc3RhdGljIGludCBpb21tdV9pZGVudGl0eV9tYXBwaW5nOworI2RlZmluZSBJREVOVE1BUF9BTEwJCTEKKyNkZWZpbmUgSURFTlRNQVBfR0ZYCQkyCisjZGVmaW5lIElERU5UTUFQX0FaQUxJQQkJNAogCiBzdGF0aWMgaW50IGlvbW11X2RvbWFpbl9pZGVudGl0eV9tYXAoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCkBAIC0yMTUxLDggKzIxNTYsMTQgQEAKIAogc3RhdGljIGludCBpb21tdV9zaG91bGRfaWRlbnRpdHlfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgc3RhcnR1cCkKIHsKLQlpZiAoaW9tbXVfaWRlbnRpdHlfbWFwcGluZyA9PSAyKQotCQlyZXR1cm4gSVNfR0ZYX0RFVklDRShwZGV2KTsKKwlpZiAoKGlvbW11X2lkZW50aXR5X21hcHBpbmcgJiBJREVOVE1BUF9BWkFMSUEpICYmIElTX0FaQUxJQShwZGV2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGlvbW11X2lkZW50aXR5X21hcHBpbmcgJiBJREVOVE1BUF9HRlgpICYmIElTX0dGWF9ERVZJQ0UocGRldikpCisJCXJldHVybiAxOworCisJaWYgKCEoaW9tbXVfaWRlbnRpdHlfbWFwcGluZyAmIElERU5UTUFQX0FMTCkpCisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBXZSB3YW50IHRvIHN0YXJ0IG9mZiB3aXRoIGFsbCBkZXZpY2VzIGluIHRoZSAxOjEgZG9tYWluLCBhbmQKQEAgLTIzMzIsMTEgKzIzNDMsMTQgQEAKIAl9CiAKIAlpZiAoaW9tbXVfcGFzc190aHJvdWdoKQotCQlpb21tdV9pZGVudGl0eV9tYXBwaW5nID0gMTsKKwkJaW9tbXVfaWRlbnRpdHlfbWFwcGluZyB8PSBJREVOVE1BUF9BTEw7CisKICNpZmRlZiBDT05GSUdfRE1BUl9CUk9LRU5fR0ZYX1dBCi0JZWxzZQotCQlpb21tdV9pZGVudGl0eV9tYXBwaW5nID0gMjsKKwlpb21tdV9pZGVudGl0eV9tYXBwaW5nIHw9IElERU5UTUFQX0dGWDsKICNlbmRpZgorCisJY2hlY2tfdHlsZXJzYnVyZ19pc29jaCgpOworCiAJLyoKIAkgKiBJZiBwYXNzIHRocm91Z2ggaXMgbm90IHNldCBvciBub3QgZW5hYmxlZCwgc2V0dXAgY29udGV4dCBlbnRyaWVzIGZvcgogCSAqIGlkZW50aXR5IG1hcHBpbmdzIGZvciBybXJyLCBnZngsIGFuZCBpc2EgYW5kIG1heSBmYWxsIGJhY2sgdG8gc3RhdGljCkBAIC0zNjcwLDMgKzM2ODQsNjEgQEAKIH0KIAogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MmE0MCwgcXVpcmtfaW9tbXVfcndiZik7CisKKy8qIE9uIFR5bGVyc2J1cmcgY2hpcHNldHMsIHNvbWUgQklPU2VzIGhhdmUgYmVlbiBrbm93biB0byBlbmFibGUgdGhlCisgICBJU09DSCBETUFSIHVuaXQgZm9yIHRoZSBBemFsaWEgc291bmQgZGV2aWNlLCBidXQgbm90IGdpdmUgaXQgYW55CisgICBUTEIgZW50cmllcywgd2hpY2ggY2F1c2VzIGl0IHRvIGRlYWRsb2NrLiBDaGVjayBmb3IgdGhhdC4gIFdlIGRvCisgICB0aGlzIGluIGEgZnVuY3Rpb24gY2FsbGVkIGZyb20gaW5pdF9kbWFycygpLCBpbnN0ZWFkIG9mIGluIGEgUENJCisgICBxdWlyaywgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHByaW50IHRoZSBvYm5veGlvdXMgIkJJT1MgYnJva2VuIgorICAgbWVzc2FnZSBpZiBWVC1kIGlzIGFjdHVhbGx5IGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja190eWxlcnNidXJnX2lzb2NoKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdWludDMyX3QgdnRpc29jaGN0cmw7CisKKwkvKiBJZiB0aGVyZSdzIG5vIEF6YWxpYSBpbiB0aGUgc3lzdGVtIGFueXdheSwgZm9yZ2V0IGl0LiAqLworCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDNhM2UsIE5VTEwpOworCWlmICghcGRldikKKwkJcmV0dXJuOworCXBjaV9kZXZfcHV0KHBkZXYpOworCisJLyogU3lzdGVtIE1hbmFnZW1lbnQgUmVnaXN0ZXJzLiBNaWdodCBiZSBoaWRkZW4sIGluIHdoaWNoIGNhc2UKKwkgICB3ZSBjYW4ndCBkbyB0aGUgc2FuaXR5IGNoZWNrLiBCdXQgdGhhdCdzIE9LLCBiZWNhdXNlIHRoZQorCSAgIGtub3duLWJyb2tlbiBCSU9TZXMgX2Rvbid0XyBhY3R1YWxseSBoaWRlIGl0LCBzbyBmYXIuICovCisJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MzQyZSwgTlVMTCk7CisJaWYgKCFwZGV2KQorCQlyZXR1cm47CisKKwlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4MTg4LCAmdnRpc29jaGN0cmwpKSB7CisJCXBjaV9kZXZfcHV0KHBkZXYpOworCQlyZXR1cm47CisJfQorCisJcGNpX2Rldl9wdXQocGRldik7CisKKwkvKiBJZiBBemFsaWEgRE1BIGlzIHJvdXRlZCB0byB0aGUgbm9uLWlzb2NoIERNQVIgdW5pdCwgZmluZS4gKi8KKwlpZiAodnRpc29jaGN0cmwgJiAxKQorCQlyZXR1cm47CisKKwkvKiBEcm9wIGFsbCBiaXRzIG90aGVyIHRoYW4gdGhlIG51bWJlciBvZiBUTEIgZW50cmllcyAqLworCXZ0aXNvY2hjdHJsICY9IDB4MWM7CisKKwkvKiBJZiB3ZSBoYXZlIHRoZSByZWNvbW1lbmRlZCBudW1iZXIgb2YgVExCIGVudHJpZXMgKDE2KSwgZmluZS4gKi8KKwlpZiAodnRpc29jaGN0cmwgPT0gMHgxMCkKKwkJcmV0dXJuOworCisJLyogWmVybyBUTEIgZW50cmllcz8gWW91IGdldCB0byByaWRlIHRoZSBzaG9ydCBidXMgdG8gc2Nob29sLiAqLworCWlmICghdnRpc29jaGN0cmwpIHsKKwkJV0FSTigxLCAiWW91ciBCSU9TIGlzIGJyb2tlbjsgRE1BIHJvdXRlZCB0byBJU09DSCBETUFSIHVuaXQgYnV0IG5vIFRMQiBzcGFjZS5cbiIKKwkJICAgICAiQklPUyB2ZW5kb3I6ICVzOyBWZXI6ICVzOyBQcm9kdWN0IFZlcnNpb246ICVzXG4iLAorCQkgICAgIGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfVkVORE9SKSwKKwkJICAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CSU9TX1ZFUlNJT04pLAorCQkgICAgIGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfVkVSU0lPTikpOworCQlpb21tdV9pZGVudGl0eV9tYXBwaW5nIHw9IElERU5UTUFQX0FaQUxJQTsKKwkJcmV0dXJuOworCX0KKwkKKwlwcmludGsoS0VSTl9XQVJOSU5HICJETUFSOiBSZWNvbW1lbmRlZCBUTEIgZW50cmllcyBmb3IgSVNPQ0ggdW5pdCBpcyAxNjsgeW91ciBCSU9TIHNldCAlZFxuIiwKKwkgICAgICAgdnRpc29jaGN0cmwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCA2ZWRlY2ZmLi40ZTRjMjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtNTEzLDcgKzUxMywxMSBAQAogCWVsc2UgaWYgKHN0YXRlID09IFBDSV9EMiB8fCBkZXYtPmN1cnJlbnRfc3RhdGUgPT0gUENJX0QyKQogCQl1ZGVsYXkoUENJX1BNX0QyX0RFTEFZKTsKIAotCWRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgZGV2LT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgJnBtY3NyKTsKKwlkZXYtPmN1cnJlbnRfc3RhdGUgPSAocG1jc3IgJiBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLKTsKKwlpZiAoZGV2LT5jdXJyZW50X3N0YXRlICE9IHN0YXRlICYmIHByaW50a19yYXRlbGltaXQoKSkKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiUmVmdXNlZCB0byBjaGFuZ2UgcG93ZXIgc3RhdGUsICIKKwkJCSJjdXJyZW50bHkgaW4gRCVkXG4iLCBkZXYtPmN1cnJlbnRfc3RhdGUpOwogCiAJLyogQWNjb3JkaW5nIHRvIHNlY3Rpb24gNS40LjEgb2YgdGhlICJQQ0kgQlVTIFBPV0VSIE1BTkFHRU1FTlQKIAkgKiBJTlRFUkZBQ0UgU1BFQ0lGSUNBVElPTiwgUkVWLiAxLjIiLCBhIGRldmljZSB0cmFuc2l0aW9uaW5nCkBAIC0yNTQyLDEwICsyNTQ2LDEwIEBACiAKIC8qKgogICogcGNpX3NldF92Z2Ffc3RhdGUgLSBzZXQgVkdBIGRlY29kZSBzdGF0ZSBvbiBkZXZpY2UgYW5kIHBhcmVudHMgaWYgcmVxdWVzdGVkCi0gKiBAZGV2IHRoZSBQQ0kgZGV2aWNlCi0gKiBAZGVjb2RlIC0gdHJ1ZSA9IGVuYWJsZSBkZWNvZGluZywgZmFsc2UgPSBkaXNhYmxlIGRlY29kaW5nCi0gKiBAY29tbWFuZF9iaXRzIFBDSV9DT01NQU5EX0lPIGFuZC9vciBQQ0lfQ09NTUFORF9NRU1PUlkKLSAqIEBjaGFuZ2VfYnJpZGdlIC0gdHJhdmVyc2UgYW5jZXN0b3JzIGFuZCBjaGFuZ2UgYnJpZGdlcworICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqIEBkZWNvZGU6IHRydWUgPSBlbmFibGUgZGVjb2RpbmcsIGZhbHNlID0gZGlzYWJsZSBkZWNvZGluZworICogQGNvbW1hbmRfYml0czogUENJX0NPTU1BTkRfSU8gYW5kL29yIFBDSV9DT01NQU5EX01FTU9SWQorICogQGNoYW5nZV9icmlkZ2U6IHRyYXZlcnNlIGFuY2VzdG9ycyBhbmQgY2hhbmdlIGJyaWRnZXMKICAqLwogaW50IHBjaV9zZXRfdmdhX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGJvb2wgZGVjb2RlLAogCQkgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZF9iaXRzLCBib29sIGNoYW5nZV9icmlkZ2UpCkBAIC0yNzE5LDE3ICsyNzIzLDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgcGNpX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQotCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgewotCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9maW5hbCwgZGV2KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBfX2luaXQgcGNpX3NldHVwKGNoYXIgKnN0cikKIHsKIAl3aGlsZSAoc3RyKSB7CkBAIC0yNzY3LDggKzI3NjAsNiBAQAogfQogZWFybHlfcGFyYW0oInBjaSIsIHBjaV9zZXR1cCk7CiAKLWRldmljZV9pbml0Y2FsbChwY2lfaW5pdCk7Ci0KIEVYUE9SVF9TWU1CT0wocGNpX3JlZW5hYmxlX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9lbmFibGVfZGV2aWNlX2lvKTsKIEVYUE9SVF9TWU1CT0wocGNpX2VuYWJsZV9kZXZpY2VfbWVtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydi5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMKaW5kZXggMTBjMGU2Mi4uNDBjM2NjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgpAQCAtNTIsNyArNTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciBhZXJkcml2ZXIgPSB7CiAJLm5hbWUJCT0gImFlciIsCi0JLnBvcnRfdHlwZQk9IFBDSUVfQU5ZX1BPUlQsCisJLnBvcnRfdHlwZQk9IFBDSUVfUkNfUE9SVCwKIAkuc2VydmljZQk9IFBDSUVfUE9SVF9TRVJWSUNFX0FFUiwKIAogCS5wcm9iZQkJPSBhZXJfcHJvYmUsCkBAIC0zMTgsNiArMzE5LDggQEAKIHsKIAlpZiAocGNpZV9hZXJfZGlzYWJsZSkKIAkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXBjaV9tc2lfZW5hYmxlZCgpKQorCQlyZXR1cm4gLUVOWElPOwogCXJldHVybiBwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcigmYWVyZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMgYi9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYwppbmRleCBmMjg5Y2E5Li43NDU0MDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYwpAQCAtMzAzLDkgKzMwMyw2IEBACiAJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHBvcyArIFBDSV9FWFBfTE5LQ0FQLCAmcmVnMzIpOwogCWluZm8tPnN1cHBvcnQgPSAocmVnMzIgJiBQQ0lfRVhQX0xOS0NBUF9BU1BNUykgPj4gMTA7Ci0JLyogMDBiIGFuZCAxMGIgYXJlIGRlZmluZWQgYXMgIlJlc2VydmVkIi4gKi8KLQlpZiAoaW5mby0+c3VwcG9ydCA9PSBQQ0lFX0xJTktfU1RBVEVfTDEpCi0JCWluZm8tPnN1cHBvcnQgPSAwOwogCWluZm8tPmxhdGVuY3lfZW5jb2RpbmdfbDBzID0gKHJlZzMyICYgUENJX0VYUF9MTktDQVBfTDBTRUwpID4+IDEyOwogCWluZm8tPmxhdGVuY3lfZW5jb2RpbmdfbDEgID0gKHJlZzMyICYgUENJX0VYUF9MTktDQVBfTDFFTCkgPj4gMTU7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZyZWcxNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKaW5kZXggNmRmNWM5OC4uZjYzNWU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwpAQCAtMzAsNyArMzAsNiBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAvKiBnbG9iYWwgZGF0YSAqLwotc3RhdGljIGNvbnN0IGNoYXIgZGV2aWNlX25hbWVbXSA9ICJwY2llcG9ydC1kcml2ZXIiOwogCiBzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewpAQCAtMjYyLDcgKzI2MSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNpZV9wb3J0ZHJpdmVyID0gewotCS5uYW1lCQk9IChjaGFyICopZGV2aWNlX25hbWUsCisJLm5hbWUJCT0gInBjaWVwb3J0IiwKIAkuaWRfdGFibGUJPSAmcG9ydF9wY2lfaWRzWzBdLAogCiAJLnByb2JlCQk9IHBjaWVfcG9ydGRydl9wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggNjA5OWZhYy4uMjQ1ZDJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTY3MCw2ICs2NzAsMjUgQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1ZJQSwJUENJX0RFVklDRV9JRF9WSUFfODIzNSwJcXVpcmtfdnQ4MjM1X2FjcGkpOwogCisvKgorICogVEkgWElPMjAwMGEgUENJZS1QQ0kgQnJpZGdlIGVycm9uZW91c2x5IHJlcG9ydHMgaXQgc3VwcG9ydHMgZmFzdCBiYWNrLXRvLWJhY2s6CisgKglEaXNhYmxlIGZhc3QgYmFjay10by1iYWNrIG9uIHRoZSBzZWNvbmRhcnkgYnVzIHNlZ21lbnQKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX3hpbzIwMDBhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdTE2IGNvbW1hbmQ7CisKKwlkZXZfd2FybigmZGV2LT5kZXYsICJUSSBYSU8yMDAwYSBxdWlyayBkZXRlY3RlZDsgIgorCQkic2Vjb25kYXJ5IGJ1cyBmYXN0IGJhY2stdG8tYmFjayB0cmFuc2ZlcnMgZGlzYWJsZWRcbiIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGRldiwgJmRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisJCWlmIChjb21tYW5kICYgUENJX0NPTU1BTkRfRkFTVF9CQUNLKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjb21tYW5kICYgflBDSV9DT01NQU5EX0ZBU1RfQkFDSyk7CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9USSwgUENJX0RFVklDRV9JRF9USV9YSU8yMDAwQSwKKwkJCXF1aXJrX3hpbzIwMDBhKTsKIAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQyAKIApAQCAtOTkwLDcgKzEwMDksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfYW1kX2lkZV9tb2RlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCS8qIHNldCBTQlgwMCBTQVRBIGluIElERSBtb2RlIHRvIEFIQ0kgbW9kZSAqLworCS8qIHNldCBTQlgwMC9IdWRzb24tMiBTQVRBIGluIElERSBtb2RlIHRvIEFIQ0kgbW9kZSAqLwogCXU4IHRtcDsKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19ERVZJQ0UsICZ0bXApOwpAQCAtMTAwOSw4ICsxMDI4LDggQEAKIERFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRV9FQVJMWShQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0RFVklDRV9JRF9BVElfSVhQNjAwX1NBVEEsIHF1aXJrX2FtZF9pZGVfbW9kZSk7CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDcwMF9TQVRBLCBxdWlya19hbWRfaWRlX21vZGUpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfQVRJLCBQQ0lfREVWSUNFX0lEX0FUSV9JWFA3MDBfU0FUQSwgcXVpcmtfYW1kX2lkZV9tb2RlKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfU0I5MDBfU0FUQV9JREUsIHF1aXJrX2FtZF9pZGVfbW9kZSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9SRVNVTUVfRUFSTFkoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX1NCOTAwX1NBVEFfSURFLCBxdWlya19hbWRfaWRlX21vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9IVURTT04yX1NBVEFfSURFLCBxdWlya19hbWRfaWRlX21vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9IVURTT04yX1NBVEFfSURFLCBxdWlya19hbWRfaWRlX21vZGUpOwogCiAvKgogICoJU2VydmVyd29ya3MgQ1NCNSBJREUgZG9lcyBub3QgZnVsbHkgc3VwcG9ydCBuYXRpdmUgbW9kZQpAQCAtMjU3Miw2ICsyNTkxLDE5IEBACiAJfQogCXBjaV9kb19maXh1cHMoZGV2LCBzdGFydCwgZW5kKTsKIH0KKworc3RhdGljIGludCBfX2luaXQgcGNpX2FwcGx5X2ZpbmFsX3F1aXJrcyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCisJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CisJCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX2ZpbmFsLCBkZXYpOworCX0KKworCXJldHVybiAwOworfQorCitmc19pbml0Y2FsbF9zeW5jKHBjaV9hcHBseV9maW5hbF9xdWlya3MpOwogI2Vsc2UKIHZvaWQgcGNpX2ZpeHVwX2RldmljZShlbnVtIHBjaV9maXh1cF9wYXNzIHBhc3MsIHN0cnVjdCBwY2lfZGV2ICpkZXYpIHt9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggNzA2ZjgyZC4uYzU0NTI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTIwNSw0MyArMjA1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jaWYgMAotaW50IHBjaV9hc3NpZ25fcmVzb3VyY2VfZml4ZWQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vKQotewotCXN0cnVjdCBwY2lfYnVzICpidXMgPSBkZXYtPmJ1czsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGRldi0+cmVzb3VyY2UgKyByZXNubzsKLQl1bnNpZ25lZCBpbnQgdHlwZV9tYXNrOwotCWludCBpLCByZXQgPSAtRUJVU1k7Ci0KLQl0eXBlX21hc2sgPSBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1BSRUZFVENIOwotCi0JZm9yIChpID0gMDsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqciA9IGJ1cy0+cmVzb3VyY2VbaV07Ci0JCWlmICghcikKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHR5cGVfbWFzayBtdXN0IG1hdGNoICovCi0JCWlmICgocmVzLT5mbGFncyBeIHItPmZsYWdzKSAmIHR5cGVfbWFzaykKLQkJCWNvbnRpbnVlOwotCi0JCXJldCA9IHJlcXVlc3RfcmVzb3VyY2UociwgcmVzKTsKLQotCQlpZiAocmV0ID09IDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSAlcyByZXNvdXJjZSAlcFJcbiIsCi0JCQlyZXNubywgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8gPyAiSS9PIiA6ICJtZW0iLCByZXMpOwotCX0gZWxzZSBpZiAocmVzbm8gPCBQQ0lfQlJJREdFX1JFU09VUkNFUykgewotCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgcmVzbm8pOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwY2lfYXNzaWduX3Jlc291cmNlX2ZpeGVkKTsKLSNlbmRpZgotCiAvKiBTb3J0IHJlc291cmNlcyBieSBhbGlnbm1lbnQgKi8KIHZvaWQgcGRldl9zb3J0X3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2VfbGlzdCAqaGVhZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcgYi9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCmluZGV4IGZiZjk2NWIuLjE3ZjM4YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKKysrIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwpAQCAtMTkyLDYgKzE5MiwxMCBAQAogCXRyaXN0YXRlICJBdTF4MDAgcGNtY2lhIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTT0NfQVUxWDAwICYmIFBDTUNJQQogCitjb25maWcgUENNQ0lBX0JDTTYzWFgKKwl0cmlzdGF0ZSAiYmNtNjN4eCBwY21jaWEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJDTTYzWFggJiYgUENNQ0lBCisKIGNvbmZpZyBQQ01DSUFfU0ExMTAwCiAJdHJpc3RhdGUgIlNBMTEwMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfU0ExMTAwICYmIFBDTUNJQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUgYi9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQppbmRleCAwNDczOTRkLi5hMDNhMzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQpAQCAtMjcsNiArMjcsNyBAQAogb2JqLSQoQ09ORklHX00zMlJfUENDKQkJCQkrPSBtMzJyX3BjYy5vCiBvYmotJChDT05GSUdfTTMyUl9DRkMpCQkJCSs9IG0zMnJfY2ZjLm8KIG9iai0kKENPTkZJR19QQ01DSUFfQVUxWDAwKQkJCSs9IGF1MXgwMF9zcy5vCitvYmotJChDT05GSUdfUENNQ0lBX0JDTTYzWFgpCQkJKz0gYmNtNjN4eF9wY21jaWEubwogb2JqLSQoQ09ORklHX1BDTUNJQV9WUkM0MTcxKQkJCSs9IHZyYzQxNzFfY2FyZC5vCiBvYmotJChDT05GSUdfUENNQ0lBX1ZSQzQxNzMpCQkJKz0gdnJjNDE3M19jYXJkdS5vCiBvYmotJChDT05GSUdfT01BUF9DRikJCQkJKz0gb21hcF9jZi5vCkBAIC03MSw2ICs3Miw3IEBACiBweGEyeHgtb2JqLSQoQ09ORklHX0FSQ0hfVklQRVIpCQkJKz0gcHhhMnh4X3ZpcGVyLm8KIHB4YTJ4eC1vYmotJChDT05GSUdfVFJJWkVQU19QQ01DSUEpCQkrPSBweGEyeHhfdHJpemVwczQubwogcHhhMnh4LW9iai0kKENPTkZJR19NQUNIX1BBTE1UWCkJCSs9IHB4YTJ4eF9wYWxtdHgubworcHhhMnh4LW9iai0kKENPTkZJR19NQUNIX1BBTE1UQykJCSs9IHB4YTJ4eF9wYWxtdGMubwogcHhhMnh4LW9iai0kKENPTkZJR19NQUNIX1BBTE1MRCkJCSs9IHB4YTJ4eF9wYWxtbGQubwogcHhhMnh4LW9iai0kKENPTkZJR19NQUNIX0U3NDApCQkJKz0gcHhhMnh4X2U3NDAubwogcHhhMnh4LW9iai0kKENPTkZJR19NQUNIX1NUQVJHQVRFMikJCSs9IHB4YTJ4eF9zdGFyZ2F0ZTIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXQ5MV9jZi5jIGIvZHJpdmVycy9wY21jaWEvYXQ5MV9jZi5jCmluZGV4IDllMTE0MGYuLmUxZGNjZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2F0OTFfY2YuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdDkxX2NmLmMKQEAgLTM2Myw3ICszNjMsNyBAQAogCXN0cnVjdCBhdDkxX2NmX3NvY2tldAkqY2YgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYXQ5MV9jZl9kYXRhCSpib2FyZCA9IGNmLT5ib2FyZDsKIAotCXBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJnBkZXYtPmRldiwgbWVzZyk7CisJcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCgmcGRldi0+ZGV2KTsKIAlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpIHsKIAkJZW5hYmxlX2lycV93YWtlKGJvYXJkLT5kZXRfcGluKTsKIAkJaWYgKGJvYXJkLT5pcnFfcGluKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX2dlbmVyaWMuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmMKaW5kZXggOTAwMTMzNC4uMDIwODg3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5jCkBAIC01MTUsNyArNTE1LDcgQEAKIHN0YXRpYyBpbnQgYXUxeDAwX2Rydl9wY21jaWFfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCBhdTF4MDBfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYmNtNjN4eF9wY21jaWEuYyBiL2RyaXZlcnMvcGNtY2lhL2JjbTYzeHhfcGNtY2lhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4OGEzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNtY2lhL2JjbTYzeHhfcGNtY2lhLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWF4aW1lIEJpem9uIDxtYml6b25AZnJlZWJveC5mcj4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgPGJjbTYzeHhfcmVncy5oPgorI2luY2x1ZGUgPGJjbTYzeHhfaW8uaD4KKyNpbmNsdWRlICJiY202M3h4X3BjbWNpYS5oIgorCisjZGVmaW5lIFBGWAkiYmNtNjN4eF9wY21jaWE6ICIKKworI2lmZGVmIENPTkZJR19DQVJEQlVTCisvKiBpZiBjYXJkYnVzIGlzIHVzZWQsIHBsYXRmb3JtIGRldmljZSBuZWVkcyByZWZlcmVuY2UgdG8gYWN0dWFsIHBjaQorICogZGV2aWNlICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmJjbTYzeHhfY2JfZGV2OworI2VuZGlmCisKKy8qCisgKiByZWFkL3dyaXRlIGhlbHBlciBmb3IgcGNtY2lhIHJlZ3MKKyAqLworc3RhdGljIGlubGluZSB1MzIgcGNtY2lhX3JlYWRsKHN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKnNrdCwgdTMyIG9mZikKK3sKKwlyZXR1cm4gYmNtX3JlYWRsKHNrdC0+YmFzZSArIG9mZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY21jaWFfd3JpdGVsKHN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKnNrdCwKKwkJCQkgdTMyIHZhbCwgdTMyIG9mZikKK3sKKwliY21fd3JpdGVsKHZhbCwgc2t0LT5iYXNlICsgb2ZmKTsKK30KKworLyoKKyAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIChyZS0paW5pdGlhbGlzZSB0aGUgc29ja2V0LCB0dXJuIG9uIHN0YXR1cworICogaW50ZXJydXB0cyBhbmQgUENNQ0lBIGJ1cywgYW5kIHdhaXQgZm9yIHBvd2VyIHRvIHN0YWJpbGlzZSBzbyB0aGF0CisgKiB0aGUgY2FyZCBzdGF0dXMgc2lnbmFscyByZXBvcnQgY29ycmVjdGx5LgorICoKKyAqIEhhcmR3YXJlIGNhbm5vdCBkbyB0aGF0LgorICovCitzdGF0aWMgaW50IGJjbTYzeHhfcGNtY2lhX3NvY2tfaW5pdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIHJlbW92ZSBwb3dlciBvbiB0aGUgc29ja2V0LCBkaXNhYmxlIElSUXMgZnJvbQorICogdGhlIGNhcmQsIHR1cm4gb2ZmIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgZGlzYWJsZSB0aGUgUENNQ0lBIGJ1cy4KKyAqCisgKiBIYXJkd2FyZSBjYW5ub3QgZG8gdGhhdC4KKyAqLworc3RhdGljIGludCBiY202M3h4X3BjbWNpYV9zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrKQoreworCXJldHVybiAwOworfQorCisvKgorICogSW1wbGVtZW50cyB0aGUgc2V0X3NvY2tldCgpIG9wZXJhdGlvbiBmb3IgdGhlIGluLWtlcm5lbCBQQ01DSUEKKyAqIHNlcnZpY2UgKGZvcm1lcmx5IFNTX1NldFNvY2tldCBpbiBDYXJkIFNlcnZpY2VzKS4gV2UgbW9yZSBvcgorICogbGVzcyBwdW50IGFsbCBvZiB0aGlzIHdvcmsgYW5kIGxldCB0aGUga2VybmVsIGhhbmRsZSB0aGUgZGV0YWlscworICogb2YgcG93ZXIgY29uZmlndXJhdGlvbiwgcmVzZXQsICZjLiBXZSBhbHNvIHJlY29yZCB0aGUgdmFsdWUgb2YKKyAqIGBzdGF0ZScgaW4gb3JkZXIgdG8gcmVndXJnaXRhdGUgaXQgdG8gdGhlIFBDTUNJQSBjb3JlIGxhdGVyLgorICovCitzdGF0aWMgaW50IGJjbTYzeHhfcGNtY2lhX3NldF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2ssCisJCQkJICAgICBzb2NrZXRfc3RhdGVfdCAqc3RhdGUpCit7CisJc3RydWN0IGJjbTYzeHhfcGNtY2lhX3NvY2tldCAqc2t0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXNrdCA9IHNvY2stPmRyaXZlcl9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNrdC0+bG9jaywgZmxhZ3MpOworCisJLyogbm90ZTogaGFyZHdhcmUgY2Fubm90IGNvbnRyb2wgc29ja2V0IHBvd2VyLCBzbyB3ZSB3aWxsCisJICogYWx3YXlzIHJlcG9ydCBTU19QT1dFUk9OICovCisKKwkvKiBhcHBseSBzb2NrZXQgcmVzZXQgKi8KKwl2YWwgPSBwY21jaWFfcmVhZGwoc2t0LCBQQ01DSUFfQzFfUkVHKTsKKwlpZiAoc3RhdGUtPmZsYWdzICYgU1NfUkVTRVQpCisJCXZhbCB8PSBQQ01DSUFfQzFfUkVTRVRfTUFTSzsKKwllbHNlCisJCXZhbCAmPSB+UENNQ0lBX0MxX1JFU0VUX01BU0s7CisKKwkvKiByZXZlcnNlIHJlc2V0IGxvZ2ljIGZvciBjYXJkYnVzIGNhcmQgKi8KKwlpZiAoc2t0LT5jYXJkX2RldGVjdGVkICYmIChza3QtPmNhcmRfdHlwZSAmIENBUkRfQ0FSREJVUykpCisJCXZhbCBePSBQQ01DSUFfQzFfUkVTRVRfTUFTSzsKKworCXBjbWNpYV93cml0ZWwoc2t0LCB2YWwsIFBDTUNJQV9DMV9SRUcpOworCisJLyoga2VlcCByZXF1ZXN0ZWQgc3RhdGUgZm9yIGV2ZW50IHJlcG9ydGluZyAqLworCXNrdC0+cmVxdWVzdGVkX3N0YXRlID0gKnN0YXRlOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2t0LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGlkZW50aXR5IGNhcmR0eXBlIGZyb20gVlNbMTJdIGlucHV0LCBDRFsxMl0gaW5wdXQgd2hpbGUgb25seSBWUzIgaXMKKyAqIGZsb2F0aW5nLCBhbmQgQ0RbMTJdIGlucHV0IHdoaWxlIG9ubHkgVlMxIGlzIGZsb2F0aW5nCisgKi8KK2VudW0geworCUlOX1ZTMSA9ICgxIDw8IDApLAorCUlOX1ZTMiA9ICgxIDw8IDEpLAorCUlOX0NEMV9WUzJIID0gKDEgPDwgMiksCisJSU5fQ0QyX1ZTMkggPSAoMSA8PCAzKSwKKwlJTl9DRDFfVlMxSCA9ICgxIDw8IDQpLAorCUlOX0NEMl9WUzFIID0gKDEgPDwgNSksCit9OworCitzdGF0aWMgY29uc3QgdTggdnNjZF90b19jYXJkdHlwZVtdID0geworCisJLyogVlMxIGZsb2F0LCBWUzIgZmxvYXQgKi8KKwlbSU5fVlMxIHwgSU5fVlMyXSA9IChDQVJEX1BDQ0FSRCB8IENBUkRfNVYpLAorCisJLyogVlMxIGdyb3VuZGVkLCBWUzIgZmxvYXQgKi8KKwlbSU5fVlMyXSA9IChDQVJEX1BDQ0FSRCB8IENBUkRfNVYgfCBDQVJEXzNWKSwKKworCS8qIFZTMSBncm91bmRlZCwgVlMyIGdyb3VuZGVkICovCisJWzBdID0gKENBUkRfUENDQVJEIHwgQ0FSRF81ViB8IENBUkRfM1YgfCBDQVJEX1hWKSwKKworCS8qIFZTMSB0aWVkIHRvIENEMSwgVlMyIGZsb2F0ICovCisJW0lOX1ZTMSB8IElOX1ZTMiB8IElOX0NEMV9WUzFIXSA9IChDQVJEX0NBUkRCVVMgfCBDQVJEXzNWKSwKKworCS8qIFZTMSBncm91bmRlZCwgVlMyIHRpZWQgdG8gQ0QyICovCisJW0lOX1ZTMiB8IElOX0NEMl9WUzJIXSA9IChDQVJEX0NBUkRCVVMgfCBDQVJEXzNWIHwgQ0FSRF9YViksCisKKwkvKiBWUzEgdGllZCB0byBDRDIsIFZTMiBncm91bmRlZCAqLworCVtJTl9WUzEgfCBJTl9DRDJfVlMxSF0gPSAoQ0FSRF9DQVJEQlVTIHwgQ0FSRF8zViB8IENBUkRfWFYgfCBDQVJEX1lWKSwKKworCS8qIFZTMSBmbG9hdCwgVlMyIGdyb3VuZGVkICovCisJW0lOX1ZTMV0gPSAoQ0FSRF9QQ0NBUkQgfCBDQVJEX1hWKSwKKworCS8qIFZTMSBmbG9hdCwgVlMyIHRpZWQgdG8gQ0QyICovCisJW0lOX1ZTMSB8IElOX1ZTMiB8IElOX0NEMl9WUzJIXSA9IChDQVJEX0NBUkRCVVMgfCBDQVJEXzNWKSwKKworCS8qIFZTMSBmbG9hdCwgVlMyIHRpZWQgdG8gQ0QxICovCisJW0lOX1ZTMSB8IElOX1ZTMiB8IElOX0NEMV9WUzJIXSA9IChDQVJEX0NBUkRCVVMgfCBDQVJEX1hWIHwgQ0FSRF9ZViksCisKKwkvKiBWUzEgdGllZCB0byBDRDIsIFZTMiBmbG9hdCAqLworCVtJTl9WUzEgfCBJTl9WUzIgfCBJTl9DRDJfVlMxSF0gPSAoQ0FSRF9DQVJEQlVTIHwgQ0FSRF9ZViksCisKKwkvKiBWUzIgZ3JvdW5kZWQsIFZTMSBpcyB0aWVkIHRvIENEMSwgQ0QyIGlzIGdyb3VuZGVkICovCisJW0lOX1ZTMSB8IElOX0NEMV9WUzFIXSA9IDAsIC8qIGlnbm9yZSBjYXJkYmF5ICovCit9OworCisvKgorICogcG9sbCBoYXJkd2FyZSB0byBjaGVjayBjYXJkIGluc2VydGlvbiBzdGF0dXMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBfX2dldF9zb2NrZXRfc3RhdHVzKHN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKnNrdCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdDsKKwl1MzIgdmFsOworCisJc3RhdCA9IDA7CisKKwkvKiBjaGVjayBDRCBmb3IgY2FyZCBwcmVzZW5jZSAqLworCXZhbCA9IHBjbWNpYV9yZWFkbChza3QsIFBDTUNJQV9DMV9SRUcpOworCisJaWYgKCEodmFsICYgUENNQ0lBX0MxX0NEMV9NQVNLKSAmJiAhKHZhbCAmIFBDTUNJQV9DMV9DRDJfTUFTSykpCisJCXN0YXQgfD0gU1NfREVURUNUOworCisJLyogaWYgbmV3IGluc2VydGlvbiwgZGV0ZWN0IGNhcmR0eXBlICovCisJaWYgKChzdGF0ICYgU1NfREVURUNUKSAmJiAhc2t0LT5jYXJkX2RldGVjdGVkKSB7CisJCXVuc2lnbmVkIGludCBzdGF0ID0gMDsKKworCQkvKiBmbG9hdCBWUzEsIGZsb2F0IFZTMiAqLworCQl2YWwgfD0gUENNQ0lBX0MxX1ZTMU9FX01BU0s7CisJCXZhbCB8PSBQQ01DSUFfQzFfVlMyT0VfTUFTSzsKKwkJcGNtY2lhX3dyaXRlbChza3QsIHZhbCwgUENNQ0lBX0MxX1JFRyk7CisKKwkJLyogd2FpdCBmb3Igb3V0cHV0IHRvIHN0YWJpbGl6ZSBhbmQgcmVhZCBWU1sxMl0gKi8KKwkJdWRlbGF5KDEwKTsKKwkJdmFsID0gcGNtY2lhX3JlYWRsKHNrdCwgUENNQ0lBX0MxX1JFRyk7CisJCXN0YXQgfD0gKHZhbCAmIFBDTUNJQV9DMV9WUzFfTUFTSykgPyBJTl9WUzEgOiAwOworCQlzdGF0IHw9ICh2YWwgJiBQQ01DSUFfQzFfVlMyX01BU0spID8gSU5fVlMyIDogMDsKKworCQkvKiBkcml2ZSBWUzEgbG93LCBmbG9hdCBWUzIgKi8KKwkJdmFsICY9IH5QQ01DSUFfQzFfVlMxT0VfTUFTSzsKKwkJdmFsIHw9IFBDTUNJQV9DMV9WUzJPRV9NQVNLOworCQlwY21jaWFfd3JpdGVsKHNrdCwgdmFsLCBQQ01DSUFfQzFfUkVHKTsKKworCQkvKiB3YWl0IGZvciBvdXRwdXQgdG8gc3RhYmlsaXplIGFuZCByZWFkIENEWzEyXSAqLworCQl1ZGVsYXkoMTApOworCQl2YWwgPSBwY21jaWFfcmVhZGwoc2t0LCBQQ01DSUFfQzFfUkVHKTsKKwkJc3RhdCB8PSAodmFsICYgUENNQ0lBX0MxX0NEMV9NQVNLKSA/IElOX0NEMV9WUzJIIDogMDsKKwkJc3RhdCB8PSAodmFsICYgUENNQ0lBX0MxX0NEMl9NQVNLKSA/IElOX0NEMl9WUzJIIDogMDsKKworCQkvKiBmbG9hdCBWUzEsIGRyaXZlIFZTMiBsb3cgKi8KKwkJdmFsIHw9IFBDTUNJQV9DMV9WUzFPRV9NQVNLOworCQl2YWwgJj0gflBDTUNJQV9DMV9WUzJPRV9NQVNLOworCQlwY21jaWFfd3JpdGVsKHNrdCwgdmFsLCBQQ01DSUFfQzFfUkVHKTsKKworCQkvKiB3YWl0IGZvciBvdXRwdXQgdG8gc3RhYmlsaXplIGFuZCByZWFkIENEWzEyXSAqLworCQl1ZGVsYXkoMTApOworCQl2YWwgPSBwY21jaWFfcmVhZGwoc2t0LCBQQ01DSUFfQzFfUkVHKTsKKwkJc3RhdCB8PSAodmFsICYgUENNQ0lBX0MxX0NEMV9NQVNLKSA/IElOX0NEMV9WUzFIIDogMDsKKwkJc3RhdCB8PSAodmFsICYgUENNQ0lBX0MxX0NEMl9NQVNLKSA/IElOX0NEMl9WUzFIIDogMDsKKworCQkvKiBndWVzcyBjYXJkdHlwZSBmcm9tIGFsbCB0aGlzICovCisJCXNrdC0+Y2FyZF90eXBlID0gdnNjZF90b19jYXJkdHlwZVtzdGF0XTsKKwkJaWYgKCFza3QtPmNhcmRfdHlwZSkKKwkJCWRldl9lcnIoJnNrdC0+c29ja2V0LmRldiwgInVuc3VwcG9ydGVkIGNhcmQgdHlwZVxuIik7CisKKwkJLyogZHJpdmUgYm90aCBWUyBwaW4gdG8gMCBhZ2FpbiAqLworCQl2YWwgJj0gfihQQ01DSUFfQzFfVlMxT0VfTUFTSyB8IFBDTUNJQV9DMV9WUzJPRV9NQVNLKTsKKworCQkvKiBlbmFibGUgY29ycmVjdCBsb2dpYyAqLworCQl2YWwgJj0gfihQQ01DSUFfQzFfRU5fUENNQ0lBX01BU0sgfCBQQ01DSUFfQzFfRU5fQ0FSREJVU19NQVNLKTsKKwkJaWYgKHNrdC0+Y2FyZF90eXBlICYgQ0FSRF9QQ0NBUkQpCisJCQl2YWwgfD0gUENNQ0lBX0MxX0VOX1BDTUNJQV9NQVNLOworCQllbHNlCisJCQl2YWwgfD0gUENNQ0lBX0MxX0VOX0NBUkRCVVNfTUFTSzsKKworCQlwY21jaWFfd3JpdGVsKHNrdCwgdmFsLCBQQ01DSUFfQzFfUkVHKTsKKwl9CisJc2t0LT5jYXJkX2RldGVjdGVkID0gKHN0YXQgJiBTU19ERVRFQ1QpID8gMSA6IDA7CisKKwkvKiByZXBvcnQgY2FyZCB0eXBlL3ZvbHRhZ2UgKi8KKwlpZiAoc2t0LT5jYXJkX3R5cGUgJiBDQVJEX0NBUkRCVVMpCisJCXN0YXQgfD0gU1NfQ0FSREJVUzsKKwlpZiAoc2t0LT5jYXJkX3R5cGUgJiBDQVJEXzNWKQorCQlzdGF0IHw9IFNTXzNWQ0FSRDsKKwlpZiAoc2t0LT5jYXJkX3R5cGUgJiBDQVJEX1hWKQorCQlzdGF0IHw9IFNTX1hWQ0FSRDsKKwlzdGF0IHw9IFNTX1BPV0VST047CisKKwlpZiAoZ3Bpb19nZXRfdmFsdWUoc2t0LT5wZC0+cmVhZHlfZ3BpbykpCisJCXN0YXQgfD0gU1NfUkVBRFk7CisKKwlyZXR1cm4gc3RhdDsKK30KKworLyoKKyAqIGNvcmUgcmVxdWVzdCB0byBnZXQgY3VycmVudCBzb2NrZXQgc3RhdHVzCisgKi8KK3N0YXRpYyBpbnQgYmNtNjN4eF9wY21jaWFfZ2V0X3N0YXR1cyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqc3RhdHVzKQoreworCXN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKnNrdDsKKworCXNrdCA9IHNvY2stPmRyaXZlcl9kYXRhOworCisJc3Bpbl9sb2NrX2JoKCZza3QtPmxvY2spOworCSpzdGF0dXMgPSBfX2dldF9zb2NrZXRfc3RhdHVzKHNrdCk7CisJc3Bpbl91bmxvY2tfYmgoJnNrdC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNvY2tldCBwb2xsaW5nIHRpbWVyIGNhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIGJjbTYzeHhfcGNtY2lhX3BvbGwodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKnNrdDsKKwl1bnNpZ25lZCBpbnQgc3RhdCwgZXZlbnRzOworCisJc2t0ID0gKHN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKilkYXRhOworCisJc3Bpbl9sb2NrX2JoKCZza3QtPmxvY2spOworCisJc3RhdCA9IF9fZ2V0X3NvY2tldF9zdGF0dXMoc2t0KTsKKworCS8qIGtlZXAgb25seSBjaGFuZ2VkIGJpdHMsIGFuZCBtYXNrIHdpdGggcmVxdWlyZWQgb25lIGZyb20gdGhlCisJICogY29yZSAqLworCWV2ZW50cyA9IChzdGF0IF4gc2t0LT5vbGRfc3RhdHVzKSAmIHNrdC0+cmVxdWVzdGVkX3N0YXRlLmNzY19tYXNrOworCXNrdC0+b2xkX3N0YXR1cyA9IHN0YXQ7CisJc3Bpbl91bmxvY2tfYmgoJnNrdC0+bG9jayk7CisKKwlpZiAoZXZlbnRzKQorCQlwY21jaWFfcGFyc2VfZXZlbnRzKCZza3QtPnNvY2tldCwgZXZlbnRzKTsKKworCW1vZF90aW1lcigmc2t0LT50aW1lciwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhCQ002M1hYX1BDTUNJQV9QT0xMX1JBVEUpKTsKK30KKworc3RhdGljIGludCBiY202M3h4X3BjbWNpYV9zZXRfaW9fbWFwKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLAorCQkJCSAgICAgc3RydWN0IHBjY2FyZF9pb19tYXAgKm1hcCkKK3sKKwkvKiB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSBjYWxsZWQgYnkgcGNtY2lhIGxheWVyIGlmIHN0YXRpYworCSAqIG1hcHBpbmcgaXMgdXNlZCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTYzeHhfcGNtY2lhX3NldF9tZW1fbWFwKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLAorCQkJCSAgICAgIHN0cnVjdCBwY2NhcmRfbWVtX21hcCAqbWFwKQoreworCXN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKnNrdDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXNrdCA9IHNvY2stPmRyaXZlcl9kYXRhOworCWlmIChtYXAtPmZsYWdzICYgTUFQX0FUVFJJQikKKwkJcmVzID0gc2t0LT5hdHRyX3JlczsKKwllbHNlCisJCXJlcyA9IHNrdC0+Y29tbW9uX3JlczsKKworCW1hcC0+c3RhdGljX3N0YXJ0ID0gcmVzLT5zdGFydCArIG1hcC0+Y2FyZF9zdGFydDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2NhcmRfb3BlcmF0aW9ucyBiY202M3h4X3BjbWNpYV9vcGVyYXRpb25zID0geworCS5pbml0CQkJPSBiY202M3h4X3BjbWNpYV9zb2NrX2luaXQsCisJLnN1c3BlbmQJCT0gYmNtNjN4eF9wY21jaWFfc3VzcGVuZCwKKwkuZ2V0X3N0YXR1cwkJPSBiY202M3h4X3BjbWNpYV9nZXRfc3RhdHVzLAorCS5zZXRfc29ja2V0CQk9IGJjbTYzeHhfcGNtY2lhX3NldF9zb2NrZXQsCisJLnNldF9pb19tYXAJCT0gYmNtNjN4eF9wY21jaWFfc2V0X2lvX21hcCwKKwkuc2V0X21lbV9tYXAJCT0gYmNtNjN4eF9wY21jaWFfc2V0X21lbV9tYXAsCit9OworCisvKgorICogcmVnaXN0ZXIgcGNtY2lhIHNvY2tldCB0byBjb3JlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGJjbTYzeHhfZHJ2X3BjbWNpYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKnNrdDsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jazsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgKmlycV9yZXM7CisJdW5zaWduZWQgaW50IHJlZ21lbV9zaXplID0gMCwgaW9tZW1fc2l6ZSA9IDA7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJc2t0ID0ga3phbGxvYyhzaXplb2YoKnNrdCksIEdGUF9LRVJORUwpOworCWlmICghc2t0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2tfaW5pdCgmc2t0LT5sb2NrKTsKKwlzb2NrID0gJnNrdC0+c29ja2V0OworCXNvY2stPmRyaXZlcl9kYXRhID0gc2t0OworCisJLyogbWFrZSBzdXJlIHdlIGhhdmUgYWxsIHJlc291cmNlcyB3ZSBuZWVkICovCisJc2t0LT5jb21tb25fcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlza3QtPmF0dHJfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAyKTsKKwlpcnFfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlza3QtPnBkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFza3QtPmNvbW1vbl9yZXMgfHwgIXNrdC0+YXR0cl9yZXMgfHwgIWlycV9yZXMgfHwgIXNrdC0+cGQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJLyogcmVtYXAgcGNtY2lhIHJlZ2lzdGVycyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVnbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVnbWVtX3NpemUsICJiY202M3h4X3BjbWNpYSIpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwlza3QtPnJlZ19yZXMgPSByZXM7CisKKwlza3QtPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlZ21lbV9zaXplKTsKKwlpZiAoIXNrdC0+YmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiByZW1hcCBpbyByZWdpc3RlcnMgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDMpOworCWlvbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJc2t0LT5pb19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBpb21lbV9zaXplKTsKKwlpZiAoIXNrdC0+aW9fYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiByZXNvdXJjZXMgYXJlIHN0YXRpYyAqLworCXNvY2stPnJlc291cmNlX29wcyA9ICZwY2NhcmRfc3RhdGljX29wczsKKwlzb2NrLT5vcHMgPSAmYmNtNjN4eF9wY21jaWFfb3BlcmF0aW9uczsKKwlzb2NrLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNvY2stPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXNvY2stPmZlYXR1cmVzID0gU1NfQ0FQX1NUQVRJQ19NQVAgfCBTU19DQVBfUENDQVJEOworCXNvY2stPmlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKXNrdC0+aW9fYmFzZTsKKwlzb2NrLT5wY2lfaXJxID0gaXJxX3Jlcy0+c3RhcnQ7CisKKyNpZmRlZiBDT05GSUdfQ0FSREJVUworCXNvY2stPmNiX2RldiA9IGJjbTYzeHhfY2JfZGV2OworCWlmIChiY202M3h4X2NiX2RldikKKwkJc29jay0+ZmVhdHVyZXMgfD0gU1NfQ0FQX0NBUkRCVVM7CisjZW5kaWYKKworCS8qIGFzc3VtZSBjb21tb24gJiBhdHRyaWJ1dGUgbWVtb3J5IGhhdmUgdGhlIHNhbWUgc2l6ZSAqLworCXNvY2stPm1hcF9zaXplID0gcmVzb3VyY2Vfc2l6ZShza3QtPmNvbW1vbl9yZXMpOworCisJLyogaW5pdGlhbGl6ZSBwb2xsaW5nIHRpbWVyICovCisJc2V0dXBfdGltZXIoJnNrdC0+dGltZXIsIGJjbTYzeHhfcGNtY2lhX3BvbGwsICh1bnNpZ25lZCBsb25nKXNrdCk7CisKKwkvKiBpbml0aWFsaXplICBwY21jaWEgIGNvbnRyb2wgcmVnaXN0ZXIsICBkcml2ZSAgVlNbMTJdIHRvICAwLAorCSAqIGxlYXZlIENCIElEU0VMIHRvIHRoZSBvbGQgIHZhbHVlIHNpbmNlIGl0IGlzIHNldCBieSB0aGUgUENJCisJICogbGF5ZXIgKi8KKwl2YWwgPSBwY21jaWFfcmVhZGwoc2t0LCBQQ01DSUFfQzFfUkVHKTsKKwl2YWwgJj0gUENNQ0lBX0MxX0NCSURTRUxfTUFTSzsKKwl2YWwgfD0gUENNQ0lBX0MxX0VOX1BDTUNJQV9HUElPX01BU0s7CisJcGNtY2lhX3dyaXRlbChza3QsIHZhbCwgUENNQ0lBX0MxX1JFRyk7CisKKwkvKgorCSAqIEhhcmR3YXJlIGhhcyBvbmx5IG9uZSBzZXQgb2YgdGltaW5ncyByZWdpc3RlcnMsIG5vdCBvbmUgZm9yCisJICogZWFjaCBtZW1vcnkgYWNjZXNzIHR5cGUsIHNvIHdlIGNvbmZpZ3VyZSB0aGVtIGZvciB0aGUKKwkgKiBzbG93ZXN0IG9uZTogYXR0cmlidXRlIG1lbW9yeS4KKwkgKi8KKwl2YWwgPSBQQ01DSUFfQzJfREFUQTE2X01BU0s7CisJdmFsIHw9IDEwIDw8IFBDTUNJQV9DMl9SV0NPVU5UX1NISUZUOworCXZhbCB8PSA2IDw8IFBDTUNJQV9DMl9JTkFDVElWRV9TSElGVDsKKwl2YWwgfD0gMyA8PCBQQ01DSUFfQzJfU0VUVVBfU0hJRlQ7CisJdmFsIHw9IDMgPDwgUENNQ0lBX0MyX0hPTERfU0hJRlQ7CisJcGNtY2lhX3dyaXRlbChza3QsIHZhbCwgUENNQ0lBX0MyX1JFRyk7CisKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfc29ja2V0KHNvY2spOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJLyogc3RhcnQgcG9sbGluZyBzb2NrZXQgKi8KKwltb2RfdGltZXIoJnNrdC0+dGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQkNNNjNYWF9QQ01DSUFfUE9MTF9SQVRFKSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBza3QpOworCXJldHVybiAwOworCitlcnI6CisJaWYgKHNrdC0+aW9fYmFzZSkKKwkJaW91bm1hcChza3QtPmlvX2Jhc2UpOworCWlmIChza3QtPmJhc2UpCisJCWlvdW5tYXAoc2t0LT5iYXNlKTsKKwlpZiAoc2t0LT5yZWdfcmVzKQorCQlyZWxlYXNlX21lbV9yZWdpb24oc2t0LT5yZWdfcmVzLT5zdGFydCwgcmVnbWVtX3NpemUpOworCWtmcmVlKHNrdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYmNtNjN4eF9kcnZfcGNtY2lhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgKnNrdDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXNrdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWRlbF90aW1lcl9zeW5jKCZza3QtPnRpbWVyKTsKKwlpb3VubWFwKHNrdC0+YmFzZSk7CisJaW91bm1hcChza3QtPmlvX2Jhc2UpOworCXJlcyA9IHNrdC0+cmVnX3JlczsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlrZnJlZShza3QpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbTYzeHhfcGNtY2lhX2RyaXZlciA9IHsKKwkucHJvYmUJPSBiY202M3h4X2Rydl9wY21jaWFfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGJjbTYzeHhfZHJ2X3BjbWNpYV9yZW1vdmUpLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImJjbTYzeHhfcGNtY2lhIiwKKwkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCisjaWZkZWYgQ09ORklHX0NBUkRCVVMKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJjbTYzeHhfY2JfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJLyoga2VlcCBwY2kgZGV2aWNlICovCisJYmNtNjN4eF9jYl9kZXYgPSBkZXY7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmNtNjN4eF9wY21jaWFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGJjbTYzeHhfY2JfZXhpdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZiY202M3h4X3BjbWNpYV9kcml2ZXIpOworCWJjbTYzeHhfY2JfZGV2ID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJjbTYzeHhfY2JfdGFibGVbXSA9IHsKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwKKwkJLmRldmljZQkJPSBCQ002MzQ4X0NQVV9JRCwKKwkJLnN1YnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfQlJPQURDT00sCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuY2xhc3MJCT0gUENJX0NMQVNTX0JSSURHRV9DQVJEQlVTIDw8IDgsCisJCS5jbGFzc19tYXNrCT0gfjAsCisJfSwKKworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLAorCQkuZGV2aWNlCQk9IEJDTTYzNThfQ1BVX0lELAorCQkuc3VidmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5jbGFzcwkJPSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMgPDwgOCwKKwkJLmNsYXNzX21hc2sJPSB+MCwKKwl9LAorCisJeyB9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJjbTYzeHhfY2JfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYmNtNjN4eF9jYXJkYnVzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYmNtNjN4eF9jYXJkYnVzIiwKKwkuaWRfdGFibGUJPSBiY202M3h4X2NiX3RhYmxlLAorCS5wcm9iZQkJPSBiY202M3h4X2NiX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYmNtNjN4eF9jYl9leGl0KSwKK307CisjZW5kaWYKKworLyoKKyAqIGlmIGNhcmRidXMgc3VwcG9ydCBpcyBlbmFibGVkLCByZWdpc3RlciBvdXIgcGxhdGZvcm0gZGV2aWNlIGFmdGVyCisgKiBvdXIgZmFrZSBjYXJkYnVzIGJyaWRnZSBoYXMgYmVlbiByZWdpc3RlcmVkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJjbTYzeHhfcGNtY2lhX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ0FSREJVUworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZiY202M3h4X2NhcmRidXNfZHJpdmVyKTsKKyNlbHNlCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmNtNjN4eF9wY21jaWFfZHJpdmVyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYmNtNjN4eF9wY21jaWFfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19DQVJEQlVTCisJcmV0dXJuIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYmNtNjN4eF9jYXJkYnVzX2RyaXZlcik7CisjZWxzZQorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZiY202M3h4X3BjbWNpYV9kcml2ZXIpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KGJjbTYzeHhfcGNtY2lhX2luaXQpOworbW9kdWxlX2V4aXQoYmNtNjN4eF9wY21jaWFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1heGltZSBCaXpvbiA8bWJpem9uQGZyZWVib3guZnI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxpbnV4IFBDTUNJQSBDYXJkIFNlcnZpY2VzOiBiY202M3h4IFNvY2tldCBDb250cm9sbGVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9iY202M3h4X3BjbWNpYS5oIGIvZHJpdmVycy9wY21jaWEvYmNtNjN4eF9wY21jaWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDk1NzM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY21jaWEvYmNtNjN4eF9wY21jaWEuaApAQCAtMCwwICsxLDYwIEBACisjaWZuZGVmIEJDTTYzWFhfUENNQ0lBX0hfCisjZGVmaW5lIEJDTTYzWFhfUENNQ0lBX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CisjaW5jbHVkZSA8YmNtNjN4eF9kZXZfcGNtY2lhLmg+CisKKy8qIHNvY2tldCBwb2xsaW5nIHJhdGUgaW4gbXMgKi8KKyNkZWZpbmUgQkNNNjNYWF9QQ01DSUFfUE9MTF9SQVRFCTUwMAorCitlbnVtIHsKKwlDQVJEX0NBUkRCVVMgPSAoMSA8PCAwKSwKKwlDQVJEX1BDQ0FSRCA9ICgxIDw8IDEpLAorCUNBUkRfNVYgPSAoMSA8PCAyKSwKKwlDQVJEXzNWID0gKDEgPDwgMyksCisJQ0FSRF9YViA9ICgxIDw8IDQpLAorCUNBUkRfWVYgPSAoMSA8PCA1KSwKK307CisKK3N0cnVjdCBiY202M3h4X3BjbWNpYV9zb2NrZXQgeworCXN0cnVjdCBwY21jaWFfc29ja2V0IHNvY2tldDsKKworCS8qIHBsYXRmb3JtIHNwZWNpZmljIGRhdGEgKi8KKwlzdHJ1Y3QgYmNtNjN4eF9wY21jaWFfcGxhdGZvcm1fZGF0YSAqcGQ7CisKKwkvKiBhbGwgcmVncyBhY2Nlc3MgYXJlIHByb3RlY3RlZCBieSB0aGlzIHNwaW5sb2NrICovCisJc3BpbmxvY2tfdCBsb2NrOworCisJLyogcGNtY2lhIHJlZ2lzdGVycyByZXNvdXJjZSAqLworCXN0cnVjdCByZXNvdXJjZSAqcmVnX3JlczsKKworCS8qIGJhc2UgcmVtYXBwZWQgYWRkcmVzcyBvZiByZWdpc3RlcnMgKi8KKwl2b2lkIF9faW9tZW0gKmJhc2U7CisKKwkvKiB3aGV0aGVyIGEgY2FyZCBpcyBkZXRlY3RlZCBhdCB0aGUgbW9tZW50ICovCisJaW50IGNhcmRfZGV0ZWN0ZWQ7CisKKwkvKiB0eXBlIG9mIGRldGVjdGVkIGNhcmQgKG1hc2sgb2YgYWJvdmUgZW51bSkgKi8KKwl1OCBjYXJkX3R5cGU7CisKKwkvKiBrZWVwIGxhc3Qgc29ja2V0IHN0YXR1cyB0byBpbXBsZW1lbnQgZXZlbnQgcmVwb3J0aW5nICovCisJdW5zaWduZWQgaW50IG9sZF9zdGF0dXM7CisKKwkvKiBiYWNrdXAgb2YgcmVxdWVzdGVkIHNvY2tldCBzdGF0ZSAqLworCXNvY2tldF9zdGF0ZV90IHJlcXVlc3RlZF9zdGF0ZTsKKworCS8qIHRpbWVyIHVzZWQgZm9yIHNvY2tldCBzdGF0dXMgcG9sbGluZyAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJLyogYXR0cmlidXRlL2NvbW1vbiBtZW1vcnkgcmVzb3VyY2VzICovCisJc3RydWN0IHJlc291cmNlICphdHRyX3JlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmNvbW1vbl9yZXM7CisJc3RydWN0IHJlc291cmNlICppb19yZXM7CisKKwkvKiBiYXNlIGFkZHJlc3Mgb2YgaW8gbWVtb3J5ICovCisJdm9pZCBfX2lvbWVtICppb19iYXNlOworfTsKKworI2VuZGlmIC8qIEJDTTYzWFhfUENNQ0lBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9iZmluX2NmX3BjbWNpYS5jIGIvZHJpdmVycy9wY21jaWEvYmZpbl9jZl9wY21jaWEuYwppbmRleCBiNTlkNDExLi4zMDBiMzY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9iZmluX2NmX3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2JmaW5fY2ZfcGNtY2lhLmMKQEAgLTMwMiw3ICszMDIsNyBAQAogCiBzdGF0aWMgaW50IGJmaW5fY2Zfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKLQlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCgmcGRldi0+ZGV2LCBtZXNnKTsKKwlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCgmcGRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCBiZmluX2NmX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMgYi9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYwppbmRleCA0YTExMGI3Li42YzRhNGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYwpAQCAtMTQ2Myw3ICsxNDYzLDkgQEAKIAkgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgfQogICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IGNvZGU7Ci0gICAgdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047CisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgaWYgKGZ1bmN0aW9uID09IEJJTkRfRk5fQUxMKQorCSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKICAgICByZXQgPSBwY2NhcmRfZ2V0X2ZpcnN0X3R1cGxlKHMsIGZ1bmN0aW9uLCAmdHVwbGUpOwogICAgIGlmIChyZXQgIT0gMCkKIAkgICAgZ290byBkb25lOwpAQCAtMTQ5MCw3ICsxNDkyLDcgQEAKICAgICAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1pbnQgcGNjYXJkX3ZhbGlkYXRlX2NpcyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGZ1bmN0aW9uLCB1bnNpZ25lZCBpbnQgKmluZm8pCitpbnQgcGNjYXJkX3ZhbGlkYXRlX2NpcyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50ICppbmZvKQogewogICAgIHR1cGxlX3QgKnR1cGxlOwogICAgIGNpc3BhcnNlX3QgKnA7CkBAIC0xNTE1LDMwICsxNTE3LDMwIEBACiAgICAgY291bnQgPSByZXNlcnZlZCA9IDA7CiAgICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IFJFVFVSTl9GSVJTVF9UVVBMRTsKICAgICB0dXBsZS0+QXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047Ci0gICAgcmV0ID0gcGNjYXJkX2dldF9maXJzdF90dXBsZShzLCBmdW5jdGlvbiwgdHVwbGUpOworICAgIHJldCA9IHBjY2FyZF9nZXRfZmlyc3RfdHVwbGUocywgQklORF9GTl9BTEwsIHR1cGxlKTsKICAgICBpZiAocmV0ICE9IDApCiAJZ290byBkb25lOwogCiAgICAgLyogRmlyc3QgdHVwbGUgc2hvdWxkIGJlIERFVklDRTsgd2Ugc2hvdWxkIHJlYWxseSBoYXZlIGVpdGhlciB0aGF0CiAgICAgICAgb3IgYSBDRlRBQkxFX0VOVFJZIG9mIHNvbWUgc29ydCAqLwogICAgIGlmICgodHVwbGUtPlR1cGxlQ29kZSA9PSBDSVNUUExfREVWSUNFKSB8fAotCShwY2NhcmRfcmVhZF90dXBsZShzLCBmdW5jdGlvbiwgQ0lTVFBMX0NGVEFCTEVfRU5UUlksIHApID09IDApIHx8Ci0JKHBjY2FyZF9yZWFkX3R1cGxlKHMsIGZ1bmN0aW9uLCBDSVNUUExfQ0ZUQUJMRV9FTlRSWV9DQiwgcCkgPT0gMCkpCisJKHBjY2FyZF9yZWFkX3R1cGxlKHMsIEJJTkRfRk5fQUxMLCBDSVNUUExfQ0ZUQUJMRV9FTlRSWSwgcCkgPT0gMCkgfHwKKwkocGNjYXJkX3JlYWRfdHVwbGUocywgQklORF9GTl9BTEwsIENJU1RQTF9DRlRBQkxFX0VOVFJZX0NCLCBwKSA9PSAwKSkKIAlkZXZfb2srKzsKIAogICAgIC8qIEFsbCBjYXJkcyBzaG91bGQgaGF2ZSBhIE1BTkZJRCB0dXBsZSwgYW5kL29yIGEgVkVSU18xIG9yIFZFUlNfMgogICAgICAgIHR1cGxlLCBmb3IgY2FyZCBpZGVudGlmaWNhdGlvbi4gIENlcnRhaW4gb2xkIEQtTGluayBhbmQgTGlua3N5cwogICAgICAgIGNhcmRzIGhhdmUgb25seSBhIGJyb2tlbiBWRVJTXzIgdHVwbGU7IGhlbmNlIHRoZSBib2d1cyB0ZXN0LiAqLwotICAgIGlmICgocGNjYXJkX3JlYWRfdHVwbGUocywgZnVuY3Rpb24sIENJU1RQTF9NQU5GSUQsIHApID09IDApIHx8Ci0JKHBjY2FyZF9yZWFkX3R1cGxlKHMsIGZ1bmN0aW9uLCBDSVNUUExfVkVSU18xLCBwKSA9PSAwKSB8fAotCShwY2NhcmRfcmVhZF90dXBsZShzLCBmdW5jdGlvbiwgQ0lTVFBMX1ZFUlNfMiwgcCkgIT0gLUVOT1NQQykpCisgICAgaWYgKChwY2NhcmRfcmVhZF90dXBsZShzLCBCSU5EX0ZOX0FMTCwgQ0lTVFBMX01BTkZJRCwgcCkgPT0gMCkgfHwKKwkocGNjYXJkX3JlYWRfdHVwbGUocywgQklORF9GTl9BTEwsIENJU1RQTF9WRVJTXzEsIHApID09IDApIHx8CisJKHBjY2FyZF9yZWFkX3R1cGxlKHMsIEJJTkRfRk5fQUxMLCBDSVNUUExfVkVSU18yLCBwKSAhPSAtRU5PU1BDKSkKIAlpZGVudF9vaysrOwogCiAgICAgaWYgKCFkZXZfb2sgJiYgIWlkZW50X29rKQogCWdvdG8gZG9uZTsKIAogICAgIGZvciAoY291bnQgPSAxOyBjb3VudCA8IE1BWF9UVVBMRVM7IGNvdW50KyspIHsKLQlyZXQgPSBwY2NhcmRfZ2V0X25leHRfdHVwbGUocywgZnVuY3Rpb24sIHR1cGxlKTsKKwlyZXQgPSBwY2NhcmRfZ2V0X25leHRfdHVwbGUocywgQklORF9GTl9BTEwsIHR1cGxlKTsKIAlpZiAocmV0ICE9IDApCiAJCWJyZWFrOwogCWlmICgoKHR1cGxlLT5UdXBsZUNvZGUgPiAweDIzKSAmJiAodHVwbGUtPlR1cGxlQ29kZSA8IDB4NDApKSB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY3MuYyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKaW5kZXggMDY2MGFkMS4uNjk4ZDc1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvY3MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jcy5jCkBAIC05OCwxMCArOTgsMTMgQEAKICAqIFRoZXNlIGZ1bmN0aW9ucyBjaGVjayBmb3IgdGhlIGFwcHJvcHJpYXRlIHN0cnVjdCBwY21jaWFfc29rZXQgYXJyYXlzLAogICogYW5kIHBhc3MgdGhlbSB0byB0aGUgbG93LWxldmVsIGZ1bmN0aW9ucyBwY21jaWFfe3N1c3BlbmQscmVzdW1lfV9zb2NrZXQKICAqLworc3RhdGljIGludCBzb2NrZXRfZWFybHlfcmVzdW1lKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOworc3RhdGljIGludCBzb2NrZXRfbGF0ZV9yZXN1bWUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7CiBzdGF0aWMgaW50IHNvY2tldF9yZXN1bWUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7CiBzdGF0aWMgaW50IHNvY2tldF9zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOwogCi1pbnQgcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyB2b2lkIHBjbWNpYV9zb2NrZXRfZGV2X3J1bihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBpbnQgKCpjYikoc3RydWN0IHBjbWNpYV9zb2NrZXQgKikpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2tldDsKIApAQCAtMTEwLDI5ICsxMTMsMzQgQEAKIAkJaWYgKHNvY2tldC0+ZGV2LnBhcmVudCAhPSBkZXYpCiAJCQljb250aW51ZTsKIAkJbXV0ZXhfbG9jaygmc29ja2V0LT5za3RfbXV0ZXgpOwotCQlzb2NrZXRfc3VzcGVuZChzb2NrZXQpOworCQljYihzb2NrZXQpOwogCQltdXRleF91bmxvY2soJnNvY2tldC0+c2t0X211dGV4KTsKIAl9CiAJdXBfcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKK30KIAoraW50IHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXBjbWNpYV9zb2NrZXRfZGV2X3J1bihkZXYsIHNvY2tldF9zdXNwZW5kKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCk7CiAKK3ZvaWQgcGNtY2lhX3NvY2tldF9kZXZfZWFybHlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwY21jaWFfc29ja2V0X2Rldl9ydW4oZGV2LCBzb2NrZXRfZWFybHlfcmVzdW1lKTsKK30KK0VYUE9SVF9TWU1CT0wocGNtY2lhX3NvY2tldF9kZXZfZWFybHlfcmVzdW1lKTsKKwordm9pZCBwY21jaWFfc29ja2V0X2Rldl9sYXRlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcGNtY2lhX3NvY2tldF9kZXZfcnVuKGRldiwgc29ja2V0X2xhdGVfcmVzdW1lKTsKK30KK0VYUE9SVF9TWU1CT0wocGNtY2lhX3NvY2tldF9kZXZfbGF0ZV9yZXN1bWUpOworCiBpbnQgcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29ja2V0OwotCi0JZG93bl9yZWFkKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc29ja2V0LCAmcGNtY2lhX3NvY2tldF9saXN0LCBzb2NrZXRfbGlzdCkgewotCQlpZiAoc29ja2V0LT5kZXYucGFyZW50ICE9IGRldikKLQkJCWNvbnRpbnVlOwotCQltdXRleF9sb2NrKCZzb2NrZXQtPnNrdF9tdXRleCk7Ci0JCXNvY2tldF9yZXN1bWUoc29ja2V0KTsKLQkJbXV0ZXhfdW5sb2NrKCZzb2NrZXQtPnNrdF9tdXRleCk7Ci0JfQotCXVwX3JlYWQoJnBjbWNpYV9zb2NrZXRfbGlzdF9yd3NlbSk7Ci0KKwlwY21jaWFfc29ja2V0X2Rldl9ydW4oZGV2LCBzb2NrZXRfcmVzdW1lKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lKTsKQEAgLTU0NiwyOSArNTU0LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBSZXN1bWUgYSBzb2NrZXQuICBJZiBhIGNhcmQgaXMgcHJlc2VudCwgdmVyaWZ5IGl0cyBDSVMgYWdhaW5zdAotICogb3VyIGNhY2hlZCBjb3B5LiAgSWYgdGhleSBhcmUgZGlmZmVyZW50LCB0aGUgY2FyZCBoYXMgYmVlbgotICogcmVwbGFjZWQsIGFuZCB3ZSBuZWVkIHRvIHRlbGwgdGhlIGRyaXZlcnMuCi0gKi8KLXN0YXRpYyBpbnQgc29ja2V0X3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQorc3RhdGljIGludCBzb2NrZXRfZWFybHlfcmVzdW1lKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7Ci0JaW50IHJldDsKLQotCWlmICghKHNrdC0+c3RhdGUgJiBTT0NLRVRfU1VTUEVORCkpCi0JCXJldHVybiAtRUJVU1k7Ci0KIAlza3QtPnNvY2tldCA9IGRlYWRfc29ja2V0OwogCXNrdC0+b3BzLT5pbml0KHNrdCk7CiAJc2t0LT5vcHMtPnNldF9zb2NrZXQoc2t0LCAmc2t0LT5zb2NrZXQpOworCWlmIChza3QtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpCisJCXNrdC0+cmVzdW1lX3N0YXR1cyA9IHNvY2tldF9zZXR1cChza3QsIHJlc3VtZV9kZWxheSk7CisJcmV0dXJuIDA7Cit9CiAKK3N0YXRpYyBpbnQgc29ja2V0X2xhdGVfcmVzdW1lKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCit7CiAJaWYgKCEoc2t0LT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkgewogCQlza3QtPnN0YXRlICY9IH5TT0NLRVRfU1VTUEVORDsKIAkJcmV0dXJuIHNvY2tldF9pbnNlcnQoc2t0KTsKIAl9CiAKLQlyZXQgPSBzb2NrZXRfc2V0dXAoc2t0LCByZXN1bWVfZGVsYXkpOwotCWlmIChyZXQgPT0gMCkgeworCWlmIChza3QtPnJlc3VtZV9zdGF0dXMgPT0gMCkgewogCQkvKgogCQkgKiBGSVhNRTogbmVlZCBhIGJldHRlciBjaGVjayBoZXJlIGZvciBjYXJkYnVzIGNhcmRzLgogCQkgKi8KQEAgLTU5Niw2ICs1OTksMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFJlc3VtZSBhIHNvY2tldC4gIElmIGEgY2FyZCBpcyBwcmVzZW50LCB2ZXJpZnkgaXRzIENJUyBhZ2FpbnN0CisgKiBvdXIgY2FjaGVkIGNvcHkuICBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHRoZSBjYXJkIGhhcyBiZWVuCisgKiByZXBsYWNlZCwgYW5kIHdlIG5lZWQgdG8gdGVsbCB0aGUgZHJpdmVycy4KKyAqLworc3RhdGljIGludCBzb2NrZXRfcmVzdW1lKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCit7CisJaWYgKCEoc2t0LT5zdGF0ZSAmIFNPQ0tFVF9TVVNQRU5EKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNvY2tldF9lYXJseV9yZXN1bWUoc2t0KTsKKwlyZXR1cm4gc29ja2V0X2xhdGVfcmVzdW1lKHNrdCk7Cit9CisKIHN0YXRpYyB2b2lkIHNvY2tldF9yZW1vdmUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCAmc2t0LT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaAppbmRleCA3OTYxNWU2Li4xZjQwOThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKQEAgLTE5Nyw4ICsxOTcsNyBAQAogCQkgICAgICBjaXNkYXRhX3QgY29kZSwgdm9pZCAqcGFyc2UpOwogaW50IHBjbWNpYV9yZXBsYWNlX2NpcyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywKIAkJICAgICAgIGNvbnN0IHU4ICpkYXRhLCBjb25zdCBzaXplX3QgbGVuKTsKLWludCBwY2NhcmRfdmFsaWRhdGVfY2lzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCi0JCQl1bnNpZ25lZCBpbnQgKmNvdW50KTsKK2ludCBwY2NhcmRfdmFsaWRhdGVfY2lzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgKmNvdW50KTsKIAogLyogcnNyY19tZ3IuYyAqLwogaW50IHBjbWNpYV92YWxpZGF0ZV9tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvZHMuYyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKaW5kZXggOWYzMDBkMy4uZjViNzA3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZHMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCkBAIC01NDcsNyArNTQ3LDcgQEAKIAlpZiAoIXZlcnMxKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICghcGNjYXJkX3JlYWRfdHVwbGUocF9kZXYtPnNvY2tldCwgcF9kZXYtPmZ1bmMsCisJaWYgKCFwY2NhcmRfcmVhZF90dXBsZShwX2Rldi0+c29ja2V0LCBCSU5EX0ZOX0FMTCwKIAkJCSAgICAgICBDSVNUUExfTUFORklELCAmbWFuZl9pZCkpIHsKIAkJcF9kZXYtPm1hbmZfaWQgPSBtYW5mX2lkLm1hbmY7CiAJCXBfZGV2LT5jYXJkX2lkID0gbWFuZl9pZC5jYXJkOwpAQCAtNTgxLDkgKzU4MSw5IEBACiAJCWtmcmVlKGRldmdlbyk7CiAJfQogCi0JaWYgKCFwY2NhcmRfcmVhZF90dXBsZShwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywgQ0lTVFBMX1ZFUlNfMSwKKwlpZiAoIXBjY2FyZF9yZWFkX3R1cGxlKHBfZGV2LT5zb2NrZXQsIEJJTkRfRk5fQUxMLCBDSVNUUExfVkVSU18xLAogCQkJICAgICAgIHZlcnMxKSkgewotCQlmb3IgKGk9MDsgaSA8IHZlcnMxLT5uczsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtaW5fdCh1bnNpZ25lZCBpbnQsIDQsIHZlcnMxLT5ucyk7IGkrKykgewogCQkJY2hhciAqdG1wOwogCQkJdW5zaWduZWQgaW50IGxlbmd0aDsKIApAQCAtNzMzLDcgKzczMyw3IEBACiAJCXJldHVybiAtRUFHQUlOOyAvKiB0cnkgYWdhaW4sIGJ1dCBsYXRlci4uLiAqLwogCX0KIAotCXJldCA9IHBjY2FyZF92YWxpZGF0ZV9jaXMocywgQklORF9GTl9BTEwsICZub19jaGFpbnMpOworCXJldCA9IHBjY2FyZF92YWxpZGF0ZV9jaXMocywgJm5vX2NoYWlucyk7CiAJaWYgKHJldCB8fCAhbm9fY2hhaW5zKSB7CiAJCWRzX2Rldl9kYmcoMCwgJnMtPmRldiwgImludmFsaWQgQ0lTIG9yIGludmFsaWQgcmVzb3VyY2VzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYyBiL2RyaXZlcnMvcGNtY2lhL2k4MjA5Mi5jCmluZGV4IDQ2NTYxZmEuLmEwNGYyMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2k4MjA5Mi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2k4MjA5Mi5jCkBAIC00Miw3ICs0Miw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGk4MjA5MmFhX3NvY2tldF9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCBpODIwOTJhYV9zb2NrZXRfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvaTgyMzY1LmMgYi9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYwppbmRleCA0MGQ0OTUzLi5hNGFhY2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYworKysgYi9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYwpAQCAtMTA1Myw4ICsxMDUzLDggQEAKICAgICB1X2NoYXIgbWFwLCBpb2N0bDsKICAgICAKICAgICBkZWJ1ZygxLCAiU2V0SU9NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCi0JICAiJSN4LSUjeClcbiIsIHNvY2ssIGlvLT5tYXAsIGlvLT5mbGFncywKLQkgIGlvLT5zcGVlZCwgaW8tPnN0YXJ0LCBpby0+c3RvcCk7CisJICAiJSNsbHgtJSNsbHgpXG4iLCBzb2NrLCBpby0+bWFwLCBpby0+ZmxhZ3MsIGlvLT5zcGVlZCwKKwkgICh1bnNpZ25lZCBsb25nIGxvbmcpaW8tPnN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKWlvLT5zdG9wKTsKICAgICBtYXAgPSBpby0+bWFwOwogICAgIGlmICgobWFwID4gMSkgfHwgKGlvLT5zdGFydCA+IDB4ZmZmZikgfHwgKGlvLT5zdG9wID4gMHhmZmZmKSB8fAogCShpby0+c3RvcCA8IGlvLT5zdGFydCkpIHJldHVybiAtRUlOVkFMOwpAQCAtMTI0MSw3ICsxMjQxLDcgQEAKIHN0YXRpYyBpbnQgaTgyMzY1X2Rydl9wY21jaWFfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCBpODIzNjVfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMKaW5kZXggNjJiNGVjYy4uN2RmYmVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jCkBAIC01MzcsOCArNTM3LDkgQEAKIAl1X2NoYXIgbWFwOwogCiAJZGVidWcoMywgIm0zMnJfY2ZjOiBTZXRJT01hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkJICAiJSNseC0lI2x4KVxuIiwgc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAotCQkgIGlvLT5zcGVlZCwgaW8tPnN0YXJ0LCBpby0+c3RvcCk7CisJCSAgIiUjbGx4LSUjbGx4KVxuIiwgc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAorCQkgIGlvLT5zcGVlZCwgKHVuc2lnbmVkIGxvbmcgbG9uZylpby0+c3RhcnQsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylpby0+c3RvcCk7CiAJbWFwID0gaW8tPm1hcDsKIAogCXJldHVybiAwOwpAQCAtNTU0LDggKzU1NSw5IEBACiAJcGNjX3NvY2tldF90ICp0ID0gJnNvY2tldFtzb2NrXTsKIAogCWRlYnVnKDMsICJtMzJyX2NmYzogU2V0TWVtTWFwKCVkLCAlZCwgJSMyLjJ4LCAlZCBucywgIgotCQkgIiUjbHgsICUjeClcbiIsIHNvY2ssIG1hcCwgbWVtLT5mbGFncywKLQkJIG1lbS0+c3BlZWQsIG1lbS0+c3RhdGljX3N0YXJ0LCBtZW0tPmNhcmRfc3RhcnQpOworCQkgIiUjbGx4LCAlI3gpXG4iLCBzb2NrLCBtYXAsIG1lbS0+ZmxhZ3MsCisJCSBtZW0tPnNwZWVkLCAodW5zaWduZWQgbG9uZyBsb25nKW1lbS0+c3RhdGljX3N0YXJ0LAorCQkgbWVtLT5jYXJkX3N0YXJ0KTsKIAogCS8qCiAJICogc2FuaXR5IGNoZWNrCkBAIC02OTksNyArNzAxLDcgQEAKIHN0YXRpYyBpbnQgY2ZjX2Rydl9wY21jaWFfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCBjZmNfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMKaW5kZXggMTIwMzRiNC4uYzY1MjRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jCkBAIC00OTIsOCArNDkyLDkgQEAKIAl1X2NoYXIgbWFwOwogCiAJZGVidWcoMywgIm0zMnItcGNjOiBTZXRJT01hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkJICAiJSN4LSUjeClcbiIsIHNvY2ssIGlvLT5tYXAsIGlvLT5mbGFncywKLQkJICBpby0+c3BlZWQsIGlvLT5zdGFydCwgaW8tPnN0b3ApOworCQkgICIlI2xseC0lI2xseClcbiIsIHNvY2ssIGlvLT5tYXAsIGlvLT5mbGFncywKKwkJICBpby0+c3BlZWQsICh1bnNpZ25lZCBsb25nIGxvbmcpaW8tPnN0YXJ0LAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaW8tPnN0b3ApOwogCW1hcCA9IGlvLT5tYXA7CiAKIAlyZXR1cm4gMDsKQEAgLTUxNSw4ICs1MTYsOSBAQAogI2VuZGlmCiAKIAlkZWJ1ZygzLCAibTMyci1wY2M6IFNldE1lbU1hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkJICIlI2x4LCAgJSN4KVxuIiwgc29jaywgbWFwLCBtZW0tPmZsYWdzLAotCQkgbWVtLT5zcGVlZCwgbWVtLT5zdGF0aWNfc3RhcnQsIG1lbS0+Y2FyZF9zdGFydCk7CisJCSAiJSNsbHgsICAlI3gpXG4iLCBzb2NrLCBtYXAsIG1lbS0+ZmxhZ3MsCisJCSBtZW0tPnNwZWVkLCAodW5zaWduZWQgbG9uZyBsb25nKW1lbS0+c3RhdGljX3N0YXJ0LAorCQkgbWVtLT5jYXJkX3N0YXJ0KTsKIAogCS8qCiAJICogc2FuaXR5IGNoZWNrCkBAIC02NzUsNyArNjc3LDcgQEAKIHN0YXRpYyBpbnQgcGNjX2Rydl9wY21jaWFfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCBwY2NfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYyBiL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKaW5kZXggZDFhZDA5Ni4uNDAzNTU5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCkBAIC05NzUsOCArOTc1LDkgQEAKICNkZWZpbmUgTThYWF9CQVNFIChQQ01DSUFfSU9fV0lOX0JBU0UgKyBpby0+c3RhcnQpCiAKIAlkcHJpbnRrKCJTZXRJT01hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkJIiUjNC40eC0lIzQuNHgpXG4iLCBsc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAotCQlpby0+c3BlZWQsIGlvLT5zdGFydCwgaW8tPnN0b3ApOworCQkiJSM0LjRsbHgtJSM0LjRsbHgpXG4iLCBsc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAorCQlpby0+c3BlZWQsICh1bnNpZ25lZCBsb25nIGxvbmcpaW8tPnN0YXJ0LAorCQkodW5zaWduZWQgbG9uZyBsb25nKWlvLT5zdG9wKTsKIAogCWlmICgoaW8tPm1hcCA+PSBQQ01DSUFfSU9fV0lOX05PKSB8fCAoaW8tPnN0YXJ0ID4gMHhmZmZmKQogCSAgICB8fCAoaW8tPnN0b3AgPiAweGZmZmYpIHx8IChpby0+c3RvcCA8IGlvLT5zdGFydCkpCkBAIC0xMDU1LDggKzEwNTYsOSBAQAogCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gcy0+cGNtY2lhOwogCiAJZHByaW50aygiU2V0TWVtTWFwKCVkLCAlZCwgJSMyLjJ4LCAlZCBucywgIgotCQkiJSM1LjVseCwgJSM1LjV4KVxuIiwgbHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLAotCQltZW0tPnNwZWVkLCBtZW0tPnN0YXRpY19zdGFydCwgbWVtLT5jYXJkX3N0YXJ0KTsKKwkJIiUjNS41bGx4LCAlIzUuNXgpXG4iLCBsc29jaywgbWVtLT5tYXAsIG1lbS0+ZmxhZ3MsCisJCW1lbS0+c3BlZWQsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVtLT5zdGF0aWNfc3RhcnQsCisJCW1lbS0+Y2FyZF9zdGFydCk7CiAKIAlpZiAoKG1lbS0+bWFwID49IFBDTUNJQV9NRU1fV0lOX05PKQogLy8gICAgICAgICAgfHwgKChtZW0tPnMpID49IFBDTUNJQV9NRU1fV0lOX1NJWkUpCkBAIC0xMTA3LDggKzExMDksOSBAQAogCX0KIAogCWRwcmludGsoIlNldE1lbU1hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkJIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKLQkJbWVtLT5zcGVlZCwgbWVtLT5zdGF0aWNfc3RhcnQsIG1lbS0+Y2FyZF9zdGFydCk7CisJCSIlIzUuNWxseCwgJSM1LjV4KVxuIiwgbHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLAorCQltZW0tPnNwZWVkLCAodW5zaWduZWQgbG9uZyBsb25nKW1lbS0+c3RhdGljX3N0YXJ0LAorCQltZW0tPmNhcmRfc3RhcnQpOwogCiAJLyogY29weSB0aGUgc3RydWN0IGFuZCBtb2RpZnkgdGhlIGNvcHkgKi8KIApAQCAtMTI5Niw3ICsxMjk5LDcgQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgbTh4eF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCgmcGRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJnBkZXYtPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgbTh4eF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL29tYXBfY2YuYyBiL2RyaXZlcnMvcGNtY2lhL29tYXBfY2YuYwppbmRleCBmMzczNjM5Li42ODU3MGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9vbWFwX2NmLmMKKysrIGIvZHJpdmVycy9wY21jaWEvb21hcF9jZi5jCkBAIC0zMzQsNyArMzM0LDcgQEAKIAogc3RhdGljIGludCBvbWFwX2NmX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJnBkZXYtPmRldiwgbWVzZyk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJnBkZXYtPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9jZl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKaW5kZXggMzJjNDQwNC4uMzBjZjcxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKQEAgLTg4MSw3ICs4ODEsNyBAQAogCW11dGV4X2xvY2soJnMtPnNrdF9tdXRleCk7CiAJcGNtY2lhX3ZhbGlkYXRlX21lbShzKTsKIAltdXRleF91bmxvY2soJnMtPnNrdF9tdXRleCk7Ci0JcmV0ID0gcGNjYXJkX3ZhbGlkYXRlX2NpcyhzLCBCSU5EX0ZOX0FMTCwgJmJ1Zi0+Y2lzaW5mby5DaGFpbnMpOworCXJldCA9IHBjY2FyZF92YWxpZGF0ZV9jaXMocywgJmJ1Zi0+Y2lzaW5mby5DaGFpbnMpOwogCWJyZWFrOwogICAgIGNhc2UgRFNfU1VTUEVORF9DQVJEOgogCXJldCA9IHBjbWNpYV9zdXNwZW5kX2NhcmQocyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wZDY3MjkuYyBiL2RyaXZlcnMvcGNtY2lhL3BkNjcyOS5jCmluZGV4IDhiZWQxZGEuLjcwYTMzNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3BkNjcyOS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BkNjcyOS5jCkBAIC02NDEsNiArNjQxLDEyIEBACiAJaWYgKChyZXQgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpKSkKIAkJZ290byBlcnJfb3V0X2ZyZWVfbWVtOwogCisJaWYgKCFwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJwZDY3Mjk6IHJlZnVzaW5nIHRvIGxvYWQgdGhlIGRyaXZlciAiCisJCQkJICJhcyB0aGUgaW9fYmFzZSBpcyAwLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX21lbTsKKwl9CisKIAlwcmludGsoS0VSTl9JTkZPICJwZDY3Mjk6IENpcnJ1cyBQRDY3MjkgUENJIHRvIFBDTUNJQSBCcmlkZ2UgIgogCQkiYXQgMHglbGx4IG9uIGlycSAlZFxuIiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwgZGV2LT5pcnEpOwpAQCAtNzU4LDcgKzc2NCw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHBkNjcyOV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCBwZDY3Mjlfc29ja2V0X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKaW5kZXggYzQ5YTcyNi4uMGUzNWFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCkBAIC0zMDAsMjUgKzMwMCwyOSBAQAogCXJldHVybiBzb2NfY29tbW9uX2Rydl9wY21jaWFfcmVtb3ZlKCZkZXYtPmRldik7CiB9CiAKLXN0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoZGV2KTsKIH0KIAotc3RhdGljIGludCBweGEyeHhfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBweGEyeHhfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXB4YTJ4eF9jb25maWd1cmVfc29ja2V0cygmZGV2LT5kZXYpOwotCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUoJmRldi0+ZGV2KTsKKwlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoZGV2KTsKKwlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lKGRldik7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyAgcHhhMnh4X2Rydl9wY21jaWFfcG1fb3BzID0geworCS5zdXNwZW5kCT0gcHhhMnh4X2Rydl9wY21jaWFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHB4YTJ4eF9kcnZfcGNtY2lhX3Jlc3VtZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB4YTJ4eF9wY21jaWFfZHJpdmVyID0gewogCS5wcm9iZQkJPSBweGEyeHhfZHJ2X3BjbWNpYV9wcm9iZSwKIAkucmVtb3ZlCQk9IHB4YTJ4eF9kcnZfcGNtY2lhX3JlbW92ZSwKLQkuc3VzcGVuZCAJPSBweGEyeHhfZHJ2X3BjbWNpYV9zdXNwZW5kLAotCS5yZXN1bWUgCT0gcHhhMnh4X2Rydl9wY21jaWFfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJweGEyeHgtcGNtY2lhIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQk9ICZweGEyeHhfZHJ2X3BjbWNpYV9wbV9vcHMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTg5OTNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10Yy5jCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogbGludXgvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10Yy5jCisgKgorICogRHJpdmVyIGZvciBQYWxtIFR1bmdzdGVufEMgUENNQ0lBCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFsZXggT3Nib3JuZSA8YXRvQG1lc2h5Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8bWFjaC9wYWxtdGMuaD4KKyNpbmNsdWRlICJzb2NfY29tbW9uLmgiCisKK3N0YXRpYyBpbnQgcGFsbXRjX3BjbWNpYV9od19pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNVENfUENNQ0lBX1BPV0VSMSwgIlBDTUNJQSBQV1IxIik7CisJaWYgKHJldCkKKwkJZ290byBlcnIxOworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1UQ19QQ01DSUFfUE9XRVIxLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjI7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNVENfUENNQ0lBX1BPV0VSMiwgIlBDTUNJQSBQV1IyIik7CisJaWYgKHJldCkKKwkJZ290byBlcnIyOworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1UQ19QQ01DSUFfUE9XRVIyLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjM7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNVENfUENNQ0lBX1BPV0VSMywgIlBDTUNJQSBQV1IzIik7CisJaWYgKHJldCkKKwkJZ290byBlcnIzOworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1UQ19QQ01DSUFfUE9XRVIzLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjQ7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNVENfUENNQ0lBX1JFU0VULCAiUENNQ0lBIFJTVCIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyNDsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNVENfUENNQ0lBX1JFU0VULCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjU7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNVENfUENNQ0lBX1JFQURZLCAiUENNQ0lBIFJEWSIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyNTsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX05SX1BBTE1UQ19QQ01DSUFfUkVBRFkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyNjsKKworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1UQ19QQ01DSUFfUFdSUkVBRFksICJQQ01DSUEgUFdSUkRZIik7CisJaWYgKHJldCkKKwkJZ290byBlcnI2OworCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9QV1JSRUFEWSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI3OworCisJc2t0LT5pcnEgPSBJUlFfR1BJTyhHUElPX05SX1BBTE1UQ19QQ01DSUFfUkVBRFkpOworCXJldHVybiAwOworCitlcnI3OgorCWdwaW9fZnJlZShHUElPX05SX1BBTE1UQ19QQ01DSUFfUFdSUkVBRFkpOworZXJyNjoKKwlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVENfUENNQ0lBX1JFQURZKTsKK2VycjU6CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9SRVNFVCk7CitlcnI0OgorCWdwaW9fZnJlZShHUElPX05SX1BBTE1UQ19QQ01DSUFfUE9XRVIzKTsKK2VycjM6CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9QT1dFUjIpOworZXJyMjoKKwlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVENfUENNQ0lBX1BPV0VSMSk7CitlcnIxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10Y19wY21jaWFfaHdfc2h1dGRvd24oc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9QV1JSRUFEWSk7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9SRUFEWSk7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9SRVNFVCk7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9QT1dFUjMpOworCWdwaW9fZnJlZShHUElPX05SX1BBTE1UQ19QQ01DSUFfUE9XRVIyKTsKKwlncGlvX2ZyZWUoR1BJT19OUl9QQUxNVENfUENNQ0lBX1BPV0VSMSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10Y19wY21jaWFfc29ja2V0X3N0YXRlKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0LAorCQkJCQlzdHJ1Y3QgcGNtY2lhX3N0YXRlICpzdGF0ZSkKK3sKKwlzdGF0ZS0+ZGV0ZWN0ID0gMTsgLyogYWx3YXlzIGluc2VydGVkICovCisJc3RhdGUtPnJlYWR5ICA9ICEhZ3Bpb19nZXRfdmFsdWUoR1BJT19OUl9QQUxNVENfUENNQ0lBX1JFQURZKTsKKwlzdGF0ZS0+YnZkMSAgID0gMTsKKwlzdGF0ZS0+YnZkMiAgID0gMTsKKwlzdGF0ZS0+d3Jwcm90ID0gMDsKKwlzdGF0ZS0+dnNfM3YgID0gMTsKKwlzdGF0ZS0+dnNfWHYgID0gMDsKK30KKworc3RhdGljIGludCBwYWxtdGNfd2lmaV9wb3dlcmRvd24odm9pZCkKK3sKKwlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1UQ19QQ01DSUFfUkVTRVQsIDEpOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9QT1dFUjIsIDApOworCW1kZWxheSg0MCk7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9QQUxNVENfUENNQ0lBX1BPV0VSMSwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXRjX3dpZmlfcG93ZXJ1cCh2b2lkKQoreworCWludCB0aW1lb3V0ID0gNTA7CisKKwlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1UQ19QQ01DSUFfUE9XRVIzLCAxKTsKKwltZGVsYXkoNTApOworCisJLyogUG93ZXIgdXAgdGhlIGNhcmQsIDEuOFYgZmlyc3QsIGFmdGVyIGEgd2hpbGUgMy4zViAqLworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9QT1dFUjEsIDEpOworCW1kZWxheSgxMDApOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9QT1dFUjIsIDEpOworCisJLyogV2FpdCB0aWxsIHRoZSBjYXJkIGlzIHJlYWR5ICovCisJd2hpbGUgKCFncGlvX2dldF92YWx1ZShHUElPX05SX1BBTE1UQ19QQ01DSUFfUFdSUkVBRFkpICYmCisJCXRpbWVvdXQpIHsKKwkJbWRlbGF5KDEpOworCQl0aW1lb3V0LS07CisJfQorCisJLyogUG93ZXIgZG93biB0aGUgV2lGaSBpbiBjYXNlIG9mIGVycm9yICovCisJaWYgKCF0aW1lb3V0KSB7CisJCXBhbG10Y193aWZpX3Bvd2VyZG93bigpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBSZXNldCB0aGUgY2FyZCAqLworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVRDX1BDTUNJQV9SRVNFVCwgMSk7CisJbWRlbGF5KDIwKTsKKwlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1UQ19QQ01DSUFfUkVTRVQsIDApOworCW1kZWxheSgyNSk7CisKKwlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1UQ19QQ01DSUFfUE9XRVIzLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10Y19wY21jaWFfY29uZmlndXJlX3NvY2tldChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCwKKwkJCQkJY29uc3Qgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQoreworCWludCByZXQgPSAxOworCisJaWYgKHN0YXRlLT5WY2MgPT0gMCkKKwkJcmV0ID0gcGFsbXRjX3dpZmlfcG93ZXJkb3duKCk7CisJZWxzZSBpZiAoc3RhdGUtPlZjYyA9PSAzMykKKwkJcmV0ID0gcGFsbXRjX3dpZmlfcG93ZXJ1cCgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcGFsbXRjX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKK3sKK30KKworc3RhdGljIHZvaWQgcGFsbXRjX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIHBhbG10Y19wY21jaWFfb3BzID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisKKwkuZmlyc3QJCQk9IDAsCisJLm5yCQkJPSAxLAorCisJLmh3X2luaXQJCT0gcGFsbXRjX3BjbWNpYV9od19pbml0LAorCS5od19zaHV0ZG93bgkJPSBwYWxtdGNfcGNtY2lhX2h3X3NodXRkb3duLAorCisJLnNvY2tldF9zdGF0ZQkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9zdGF0ZSwKKwkuY29uZmlndXJlX3NvY2tldAk9IHBhbG10Y19wY21jaWFfY29uZmlndXJlX3NvY2tldCwKKworCS5zb2NrZXRfaW5pdAkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9pbml0LAorCS5zb2NrZXRfc3VzcGVuZAkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBhbG10Y19wY21jaWFfZGV2aWNlOworCitzdGF0aWMgaW50IF9faW5pdCBwYWxtdGNfcGNtY2lhX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFtYWNoaW5lX2lzX3BhbG10YygpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBhbG10Y19wY21jaWFfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJweGEyeHgtcGNtY2lhIiwgLTEpOworCWlmICghcGFsbXRjX3BjbWNpYV9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBhbG10Y19wY21jaWFfZGV2aWNlLCAmcGFsbXRjX3BjbWNpYV9vcHMsCisJCQkJCXNpemVvZihwYWxtdGNfcGNtY2lhX29wcykpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGFsbXRjX3BjbWNpYV9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwYWxtdGNfcGNtY2lhX2RldmljZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGFsbXRjX3BjbWNpYV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGFsbXRjX3BjbWNpYV9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChwYWxtdGNfcGNtY2lhX2luaXQpOworbW9kdWxlX2V4aXQocGFsbXRjX3BjbWNpYV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQWxleCBPc2Jvcm5lIDxhdG9AbWVzaHkub3JnPiwiCisJICAgICIgTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENNQ0lBIHN1cHBvcnQgZm9yIFBhbG0gVHVuZ3N0ZW58QyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpweGEyeHgtcGNtY2lhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jIGIvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYwppbmRleCA5Y2EyMmM3Li43MDM5ZjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMKQEAgLTIwNiw2ICsyMDYsNyBAQAogICAgIC8qIEZpcnN0LCB3aGF0IGRvZXMgYSBmbG9hdGluZyBwb3J0IGxvb2sgbGlrZT8gKi8KICAgICBiID0ga3phbGxvYygyNTYsIEdGUF9LRVJORUwpOwogICAgIGlmICghYikgeworCSAgICBwcmludGsoIlxuIik7CiAJICAgIGRldl9wcmludGsoS0VSTl9FUlIsICZzLT5kZXYsCiAJCSAgICJkb19pb19wcm9iZTogdW5hYmxlIHRvIGttYWxsb2MgMjU2IGJ5dGVzIik7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0yNzUsNyArMjc2LDcgQEAKIAlzLT5jaXNfbWVtLnJlcyA9IHJlczsKIAlzLT5jaXNfdmlydCA9IGlvcmVtYXAocmVzLT5zdGFydCwgcy0+bWFwX3NpemUpOwogCWlmIChzLT5jaXNfdmlydCkgewotCQlyZXQgPSBwY2NhcmRfdmFsaWRhdGVfY2lzKHMsIEJJTkRfRk5fQUxMLCBjb3VudCk7CisJCXJldCA9IHBjY2FyZF92YWxpZGF0ZV9jaXMocywgY291bnQpOwogCQkvKiBpbnZhbGlkYXRlIG1hcHBpbmcgYW5kIENJUyBjYWNoZSAqLwogCQlpb3VubWFwKHMtPmNpc192aXJ0KTsKIAkJcy0+Y2lzX3ZpcnQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX2Fzc2FiZXQuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTEwMF9hc3NhYmV0LmMKaW5kZXggZjQyNDE0Ni4uYWM4YWEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX2Fzc2FiZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMDBfYXNzYWJldC5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkuc29ja2V0X3N1c3BlbmQJCT0gYXNzYWJldF9wY21jaWFfc29ja2V0X3N1c3BlbmQsCiB9OwogCi1pbnQgX19pbml0IHBjbWNpYV9hc3NhYmV0X2luaXQoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBjbWNpYV9hc3NhYmV0X2luaXQoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCByZXQgPSAtRU5PREVWOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zYTExMDBfZ2VuZXJpYy5jIGIvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYwppbmRleCBkOGRhNWFjLi4yZDBlOTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMDBfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NhMTEwMF9nZW5lcmljLmMKQEAgLTg5LDcgKzg5LDcgQEAKIHN0YXRpYyBpbnQgc2ExMXgwX2Rydl9wY21jaWFfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCBzYTExeDBfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTAwX25lcG9uc2V0LmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMDBfbmVwb25zZXQuYwppbmRleCA0YzQxZTg2Li4wYzc2ZDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMDBfbmVwb25zZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMDBfbmVwb25zZXQuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJLnNvY2tldF9zdXNwZW5kIAk9IHNhMTExMV9wY21jaWFfc29ja2V0X3N1c3BlbmQsCiB9OwogCi1pbnQgX19pbml0IHBjbWNpYV9uZXBvbnNldF9pbml0KHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKK2ludCBwY21jaWFfbmVwb25zZXRfaW5pdChzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYpCiB7CiAJaW50IHJldCA9IC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfZ2VuZXJpYy5jCmluZGV4IDQwMTA1MmEuLjRiZTRlMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2dlbmVyaWMuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAKIHN0YXRpYyBpbnQgcGNtY2lhX3N1c3BlbmQoc3RydWN0IHNhMTExMV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKCZkZXYtPmRldiwgc3RhdGUpOworCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKCZkZXYtPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgcGNtY2lhX3Jlc3VtZShzdHJ1Y3Qgc2ExMTExX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCmluZGV4IDE2M2NmOTguLmVmN2U5ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYworKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKQEAgLTMzNiw4ICszMzYsOSBAQAogCXN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0ID0gdG9fc29jX3BjbWNpYV9zb2NrZXQoc29jayk7CiAJdW5zaWduZWQgc2hvcnQgc3BlZWQgPSBtYXAtPnNwZWVkOwogCi0JZGVidWcoc2t0LCAyLCAibWFwICV1ICBzcGVlZCAldSBzdGFydCAweCUwOHggc3RvcCAweCUwOHhcbiIsCi0JCW1hcC0+bWFwLCBtYXAtPnNwZWVkLCBtYXAtPnN0YXJ0LCBtYXAtPnN0b3ApOworCWRlYnVnKHNrdCwgMiwgIm1hcCAldSAgc3BlZWQgJXUgc3RhcnQgMHglMDhsbHggc3RvcCAweCUwOGxseFxuIiwKKwkJbWFwLT5tYXAsIG1hcC0+c3BlZWQsICh1bnNpZ25lZCBsb25nIGxvbmcpbWFwLT5zdGFydCwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyltYXAtPnN0b3ApOwogCWRlYnVnKHNrdCwgMiwgImZsYWdzOiAlcyVzJXMlcyVzJXMlcyVzXG4iLAogCQkobWFwLT5mbGFncz09MCk/IjxOT05FPiI6IiIsCiAJCShtYXAtPmZsYWdzJk1BUF9BQ1RJVkUpPyJBQ1RJVkUgIjoiIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jIGIvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKaW5kZXggZmY5YTNiYi4uNzhkNWFhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKQEAgLTMwMCw3ICszMDAsNyBAQAogCiAJCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWlmIChwY2NhcmRfdmFsaWRhdGVfY2lzKHMsIEJJTkRfRk5fQUxMLCAmY2hhaW5zKSkKKwkJaWYgKHBjY2FyZF92YWxpZGF0ZV9jaXMocywgJmNoYWlucykpCiAJCQlyZXR1cm4gLUVJTzsKIAkJaWYgKCFjaGFpbnMpCiAJCQlyZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS90Y2ljLmMgYi9kcml2ZXJzL3BjbWNpYS90Y2ljLmMKaW5kZXggOGViMDQyMy4uNjkxODg0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvdGNpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3RjaWMuYwpAQCAtMzY2LDcgKzM2Niw3IEBACiBzdGF0aWMgaW50IHRjaWNfZHJ2X3BjbWNpYV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCgmZGV2LT5kZXYsIHN0YXRlKTsKKwlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCgmZGV2LT5kZXYpOwogfQogCiBzdGF0aWMgaW50IHRjaWNfZHJ2X3BjbWNpYV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpAQCAtNzMyLDggKzczMiw4IEBACiAgICAgdV9zaG9ydCBiYXNlLCBsZW4sIGlvY3RsOwogICAgIAogICAgIGRlYnVnKDEsICJTZXRJT01hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkgICIlI3gtJSN4KVxuIiwgcHNvY2ssIGlvLT5tYXAsIGlvLT5mbGFncywKLQkgIGlvLT5zcGVlZCwgaW8tPnN0YXJ0LCBpby0+c3RvcCk7CisJICAiJSNsbHgtJSNsbHgpXG4iLCBwc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLCBpby0+c3BlZWQsCisJICAodW5zaWduZWQgbG9uZyBsb25nKWlvLT5zdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZylpby0+c3RvcCk7CiAgICAgaWYgKChpby0+bWFwID4gMSkgfHwgKGlvLT5zdGFydCA+IDB4ZmZmZikgfHwgKGlvLT5zdG9wID4gMHhmZmZmKSB8fAogCShpby0+c3RvcCA8IGlvLT5zdGFydCkpIHJldHVybiAtRUlOVkFMOwogICAgIHRjaWNfc2V0dyhUQ0lDX0FERFIrMiwgVENJQ19BRFIyX0lORFJFRyB8IChwc29jayA8PCBUQ0lDX1NTX1NIRlQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3ZyYzQxNzFfY2FyZC5jIGIvZHJpdmVycy9wY21jaWEvdnJjNDE3MV9jYXJkLmMKaW5kZXggZDRhZDUwZC4uYzlmY2JkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvdnJjNDE3MV9jYXJkLmMKKysrIGIvZHJpdmVycy9wY21jaWEvdnJjNDE3MV9jYXJkLmMKQEAgLTcwNyw3ICs3MDcsNyBAQAogc3RhdGljIGludCB2cmM0MTcxX2NhcmRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGludCB2cmM0MTcxX2NhcmRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jIGIvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKaW5kZXggYjQ1OWU4Ny4uOGJlNGNjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKKysrIGIvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKQEAgLTEyMjUsNjAgKzEyMjUsODEgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB5ZW50YV9kZXZfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCB5ZW50YV9kZXZfc3VzcGVuZF9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCByZXQ7CiAKLQlyZXQgPSBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKCZkZXYtPmRldiwgc3RhdGUpOworCXJldCA9IHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoZGV2KTsKIAotCWlmIChzb2NrZXQpIHsKLQkJaWYgKHNvY2tldC0+dHlwZSAmJiBzb2NrZXQtPnR5cGUtPnNhdmVfc3RhdGUpCi0JCQlzb2NrZXQtPnR5cGUtPnNhdmVfc3RhdGUoc29ja2V0KTsKKwlpZiAoIXNvY2tldCkKKwkJcmV0dXJuIHJldDsKIAotCQkvKiBGSVhNRTogcGNpX3NhdmVfc3RhdGUgbmVlZHMgdG8gaGF2ZSBhIGJldHRlciBpbnRlcmZhY2UgKi8KLQkJcGNpX3NhdmVfc3RhdGUoZGV2KTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMTYqNCwgJnNvY2tldC0+c2F2ZWRfc3RhdGVbMF0pOwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAxNyo0LCAmc29ja2V0LT5zYXZlZF9zdGF0ZVsxXSk7Ci0JCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCWlmIChzb2NrZXQtPnR5cGUgJiYgc29ja2V0LT50eXBlLT5zYXZlX3N0YXRlKQorCQlzb2NrZXQtPnR5cGUtPnNhdmVfc3RhdGUoc29ja2V0KTsKIAotCQkvKgotCQkgKiBTb21lIGxhcHRvcHMgKElCTSBUMjIpIGRvIG5vdCBsaWtlIHVzIHB1dHRpbmcgdGhlIENhcmRidXMKLQkJICogYnJpZGdlIGludG8gRDMuICBBdCBhIGd1ZXNzLCBzb21lIG90aGVyIGxhcHRvcCB3aWxsCi0JCSAqIHByb2JhYmx5IHJlcXVpcmUgdGhpcywgc28gbGVhdmUgaXQgY29tbWVudGVkIG91dCBmb3Igbm93LgotCQkgKi8KLQkJLyogcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIDMpOyAqLwotCX0KKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMTYqNCwgJnNvY2tldC0+c2F2ZWRfc3RhdGVbMF0pOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAxNyo0LCAmc29ja2V0LT5zYXZlZF9zdGF0ZVsxXSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJLyoKKwkgKiBTb21lIGxhcHRvcHMgKElCTSBUMjIpIGRvIG5vdCBsaWtlIHVzIHB1dHRpbmcgdGhlIENhcmRidXMKKwkgKiBicmlkZ2UgaW50byBEMy4gIEF0IGEgZ3Vlc3MsIHNvbWUgb3RoZXIgbGFwdG9wIHdpbGwKKwkgKiBwcm9iYWJseSByZXF1aXJlIHRoaXMsIHNvIGxlYXZlIGl0IGNvbW1lbnRlZCBvdXQgZm9yIG5vdy4KKwkgKi8KKwkvKiBwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgMyk7ICovCiAKIAlyZXR1cm4gcmV0OwogfQogCi0KLXN0YXRpYyBpbnQgeWVudGFfZGV2X3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyBpbnQgeWVudGFfZGV2X3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CiAKLQlpZiAoc29ja2V0KSB7Ci0JCWludCByYzsKKwlpZiAoIXNvY2tldCkKKwkJcmV0dXJuIDA7CiAKLQkJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIDApOwotCQkvKiBGSVhNRTogcGNpX3Jlc3RvcmVfc3RhdGUgbmVlZHMgdG8gaGF2ZSBhIGJldHRlciBpbnRlcmZhY2UgKi8KLQkJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDE2KjQsIHNvY2tldC0+c2F2ZWRfc3RhdGVbMF0pOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMTcqNCwgc29ja2V0LT5zYXZlZF9zdGF0ZVsxXSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAxNio0LCBzb2NrZXQtPnNhdmVkX3N0YXRlWzBdKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDE3KjQsIHNvY2tldC0+c2F2ZWRfc3RhdGVbMV0pOwogCi0JCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQkJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAotCQlpZiAoc29ja2V0LT50eXBlICYmIHNvY2tldC0+dHlwZS0+cmVzdG9yZV9zdGF0ZSkKLQkJCXNvY2tldC0+dHlwZS0+cmVzdG9yZV9zdGF0ZShzb2NrZXQpOwotCX0KKwlpZiAoc29ja2V0LT50eXBlICYmIHNvY2tldC0+dHlwZS0+cmVzdG9yZV9zdGF0ZSkKKwkJc29ja2V0LT50eXBlLT5yZXN0b3JlX3N0YXRlKHNvY2tldCk7CiAKLQlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lKCZkZXYtPmRldik7CisJcGNtY2lhX3NvY2tldF9kZXZfZWFybHlfcmVzdW1lKGRldik7CisJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgeWVudGFfZGV2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcGNtY2lhX3NvY2tldF9kZXZfbGF0ZV9yZXN1bWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHllbnRhX3BtX29wcyA9IHsKKwkuc3VzcGVuZF9ub2lycSA9IHllbnRhX2Rldl9zdXNwZW5kX25vaXJxLAorCS5yZXN1bWVfbm9pcnEgPSB5ZW50YV9kZXZfcmVzdW1lX25vaXJxLAorCS5yZXN1bWUgPSB5ZW50YV9kZXZfcmVzdW1lLAorCS5mcmVlemVfbm9pcnEgPSB5ZW50YV9kZXZfc3VzcGVuZF9ub2lycSwKKwkudGhhd19ub2lycSA9IHllbnRhX2Rldl9yZXN1bWVfbm9pcnEsCisJLnRoYXcgPSB5ZW50YV9kZXZfcmVzdW1lLAorCS5wb3dlcm9mZl9ub2lycSA9IHllbnRhX2Rldl9zdXNwZW5kX25vaXJxLAorCS5yZXN0b3JlX25vaXJxID0geWVudGFfZGV2X3Jlc3VtZV9ub2lycSwKKwkucmVzdG9yZSA9IHllbnRhX2Rldl9yZXN1bWUsCit9OworCisjZGVmaW5lIFlFTlRBX1BNX09QUwkoJnllbnRhX3BtX29wcykKKyNlbHNlCisjZGVmaW5lIFlFTlRBX1BNX09QUwlOVUxMCiAjZW5kaWYKIAogI2RlZmluZSBDQl9JRCh2ZW5kLGRldix0eXBlKQkJCQlcCkBAIC0xMzc2LDEwICsxMzk3LDcgQEAKIAkuaWRfdGFibGUJPSB5ZW50YV90YWJsZSwKIAkucHJvYmUJCT0geWVudGFfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh5ZW50YV9jbG9zZSksCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSB5ZW50YV9kZXZfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHllbnRhX2Rldl9yZXN1bWUsCi0jZW5kaWYKKwkuZHJpdmVyLnBtCT0gWUVOVEFfUE1fT1BTLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYwppbmRleCBmYjQ1ZjVlLi40NTQ5NzBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKQEAgLTc0Niw3ICs3NDYsOSBAQAogCQkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAJCWlmIChxdWlya3MtPm1haWxsZWQgPT0gMSkgewogCQkJcGFyYW0gPSB2YWx1ZSA/IDB4OTIgOiAweDkzOworCQkJaTgwNDJfbG9ja19jaGlwKCk7CiAJCQlpODA0Ml9jb21tYW5kKCZwYXJhbSwgMHgxMDU5KTsKKwkJCWk4MDQyX3VubG9ja19jaGlwKCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKaW5kZXggZGEzYzA4Yi4uZDM3OWU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKQEAgLTE1MCw2ICsxNTAsOCBAQAogLyogVGhlIGFjdHVhbCBkZXZpY2UgdGhlIGRyaXZlciBiaW5kcyB0byAqLwogc3RhdGljIHN0cnVjdCBlZWVwY19ob3RrICplaG90azsKIAorc3RhdGljIHZvaWQgZWVlcGNfcmZraWxsX2hvdHBsdWcoYm9vbCByZWFsKTsKKwogLyogUGxhdGZvcm0gZGV2aWNlL2RyaXZlciAqLwogc3RhdGljIGludCBlZWVwY19ob3RrX3RoYXcoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgZWVlcGNfaG90a19yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CkBAIC0zNDMsMTQgKzM0NSwyMyBAQAogc3RhdGljIGludCBlZWVwY19yZmtpbGxfc2V0KHZvaWQgKmRhdGEsIGJvb2wgYmxvY2tlZCkKIHsKIAl1bnNpZ25lZCBsb25nIGFzbCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7Ci0JcmV0dXJuIHNldF9hY3BpKGFzbCwgIWJsb2NrZWQpOworCWludCByZXQ7CisKKwlpZiAoYXNsICE9IENNX0FTTF9XTEFOKQorCQlyZXR1cm4gc2V0X2FjcGkoYXNsLCAhYmxvY2tlZCk7CisKKwkvKiBoYWNrIHRvIGF2b2lkIHBhbmljIHdpdGggcnQyODYwc3RhICovCisJaWYgKGJsb2NrZWQpCisJCWVlZXBjX3Jma2lsbF9ob3RwbHVnKGZhbHNlKTsKKwlyZXQgPSBzZXRfYWNwaShhc2wsICFibG9ja2VkKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJma2lsbF9vcHMgZWVlcGNfcmZraWxsX29wcyA9IHsKIAkuc2V0X2Jsb2NrID0gZWVlcGNfcmZraWxsX3NldCwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBlZWVwY19lbmFibGVfY2FtZXJhKHZvaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZWVlcGNfZW5hYmxlX2NhbWVyYSh2b2lkKQogewogCS8qCiAJICogSWYgdGhlIGZvbGxvd2luZyBjYWxsIHRvIHNldF9hY3BpKCkgZmFpbHMsIGl0J3MgYmVjYXVzZSB0aGVyZSdzIG5vCkBAIC02MjQsNyArNjM1LDcgQEAKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBlZWVwY19iYWNrbGlnaHRfZGV2aWNlOwogCWlmIChiZCkgewogCQlpbnQgb2xkID0gYmQtPnByb3BzLmJyaWdodG5lc3M7Ci0JCWJkLT5wcm9wcy5icmlnaHRuZXNzID0gcmVhZF9icmlnaHRuZXNzKGJkKTsKKwkJYmFja2xpZ2h0X2ZvcmNlX3VwZGF0ZShiZCwgQkFDS0xJR0hUX1VQREFURV9IT1RLRVkpOwogCQlyZXR1cm4gb2xkOwogCX0KIAlyZXR1cm4gLTE7CkBAIC02NDMsMTMgKzY1NCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBlZWVwY19yZmtpbGxfaG90cGx1Zyh2b2lkKQorc3RhdGljIHZvaWQgZWVlcGNfcmZraWxsX2hvdHBsdWcoYm9vbCByZWFsKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKLQlib29sIGJsb2NrZWQgPSBlZWVwY193bGFuX3Jma2lsbF9ibG9ja2VkKCk7CisJYm9vbCBibG9ja2VkID0gcmVhbCA/IGVlZXBjX3dsYW5fcmZraWxsX2Jsb2NrZWQoKSA6IHRydWU7CiAKLQlpZiAoZWhvdGstPndsYW5fcmZraWxsKQorCWlmIChyZWFsICYmIGVob3RrLT53bGFuX3Jma2lsbCkKIAkJcmZraWxsX3NldF9zd19zdGF0ZShlaG90ay0+d2xhbl9yZmtpbGwsIGJsb2NrZWQpOwogCiAJbXV0ZXhfbG9jaygmZWhvdGstPmhvdHBsdWdfbG9jayk7CkBAIC02OTIsNyArNzAzLDcgQEAKIAlpZiAoZXZlbnQgIT0gQUNQSV9OT1RJRllfQlVTX0NIRUNLKQogCQlyZXR1cm47CiAKLQllZWVwY19yZmtpbGxfaG90cGx1ZygpOworCWVlZXBjX3Jma2lsbF9ob3RwbHVnKHRydWUpOwogfQogCiBzdGF0aWMgdm9pZCBlZWVwY19ob3RrX25vdGlmeShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgdTMyIGV2ZW50KQpAQCAtODUwLDcgKzg2MSw3IEBACiB7CiAJLyogUmVmcmVzaCBib3RoIHdsYW4gcmZraWxsIHN0YXRlIGFuZCBwY2kgaG90cGx1ZyAqLwogCWlmIChlaG90ay0+d2xhbl9yZmtpbGwpCi0JCWVlZXBjX3Jma2lsbF9ob3RwbHVnKCk7CisJCWVlZXBjX3Jma2lsbF9ob3RwbHVnKHRydWUpOwogCiAJaWYgKGVob3RrLT5ibHVldG9vdGhfcmZraWxsKQogCQlyZmtpbGxfc2V0X3N3X3N0YXRlKGVob3RrLT5ibHVldG9vdGhfcmZraWxsLApAQCAtOTkzLDcgKzEwMDQsNyBAQAogCSAqIFJlZnJlc2ggcGNpIGhvdHBsdWcgaW4gY2FzZSB0aGUgcmZraWxsIHN0YXRlIHdhcyBjaGFuZ2VkIGFmdGVyCiAJICogZWVlcGNfdW5yZWdpc3Rlcl9yZmtpbGxfbm90aWZpZXIoKQogCSAqLwotCWVlZXBjX3Jma2lsbF9ob3RwbHVnKCk7CisJZWVlcGNfcmZraWxsX2hvdHBsdWcodHJ1ZSk7CiAJaWYgKGVob3RrLT5ob3RwbHVnX3Nsb3QpCiAJCXBjaV9ocF9kZXJlZ2lzdGVyKGVob3RrLT5ob3RwbHVnX3Nsb3QpOwogCkBAIC0xMTA5LDcgKzExMjAsNyBAQAogCSAqIFJlZnJlc2ggcGNpIGhvdHBsdWcgaW4gY2FzZSB0aGUgcmZraWxsIHN0YXRlIHdhcyBjaGFuZ2VkIGR1cmluZwogCSAqIHNldHVwLgogCSAqLwotCWVlZXBjX3Jma2lsbF9ob3RwbHVnKCk7CisJZWVlcGNfcmZraWxsX2hvdHBsdWcodHJ1ZSk7CiAKIGV4aXQ6CiAJaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gLUVOT0RFVikKQEAgLTExODksNyArMTIwMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZWVlcGNfaG90a19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlZWVwY19ob3RrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IHJlc3VsdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LWxhcHRvcC5jCmluZGV4IGYzNWFlZTUuLmJjZDRiYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYwpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJc3RydWN0IGZ1aml0c3VfaG90a2V5X3QgKmZ1aml0c3VfaG90a2V5ID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gZnVqaXRzdV9ob3RrZXktPmlucHV0OwogCi0jaWZkZWYgQ09ORklHX0xFRFNfQ0xBU1MKKyNpZiBkZWZpbmVkKENPTkZJR19MRURTX0NMQVNTKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0NMQVNTX01PRFVMRSkKIAlpZiAoZnVqaXRzdV9ob3RrZXktPmxvZ29sYW1wX3JlZ2lzdGVyZWQpCiAJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZsb2dvbGFtcF9sZWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYwppbmRleCBmOWY2OGUwLi5hMmE3NDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKQEAgLTEwNDEsNiArMTA0MSw5IEBACiAJCQlzb255X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzKHNvbnlfYmFja2xpZ2h0X2RldmljZSkgPCAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggInVuYWJsZSB0byByZXN0b3JlIGJyaWdodG5lc3MgbGV2ZWxcbiIpOwogCisJLyogcmUtcmVhZCByZmtpbGwgc3RhdGUgKi8KKwlzb255X25jX3Jma2lsbF91cGRhdGUoKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMDc4LDYgKzEwODEsOCBAQAogCXN0cnVjdCByZmtpbGwgKnJmazsKIAllbnVtIHJma2lsbF90eXBlIHR5cGU7CiAJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgcmVzdWx0OworCWJvb2wgaHdibG9jazsKIAogCXN3aXRjaCAobmNfdHlwZSkgewogCWNhc2UgU09OWV9XSUZJOgpAQCAtMTEwNSw2ICsxMTEwLDEwIEBACiAJaWYgKCFyZmspCiAJCXJldHVybiAtRU5PTUVNOwogCisJc29ueV9jYWxsX3NuY19oYW5kbGUoMHgxMjQsIDB4MjAwLCAmcmVzdWx0KTsKKwlod2Jsb2NrID0gIShyZXN1bHQgJiAweDEpOworCXJma2lsbF9zZXRfaHdfc3RhdGUocmZrLCBod2Jsb2NrKTsKKwogCWVyciA9IHJma2lsbF9yZWdpc3RlcihyZmspOwogCWlmIChlcnIpIHsKIAkJcmZraWxsX2Rlc3Ryb3kocmZrKTsKQEAgLTEyMDIsMTUgKzEyMTEsNiBAQAogCQl9CiAJfQogCi0JLyogdHJ5IHRvIF9JTkkgdGhlIGRldmljZSBpZiBzdWNoIG1ldGhvZCBleGlzdHMgKEFDUEkgc3BlYyAzLjAtNi41LjEKLQkgKiBzaG91bGQgYmUgcmVzcGVjdGVkIGFzIHdlIGFscmVhZHkgY2hlY2tlZCBmb3IgdGhlIGRldmljZSBwcmVzZW5jZSBhYm92ZSAqLwotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHNvbnlfbmNfYWNwaV9oYW5kbGUsIE1FVEhPRF9OQU1FX19JTkksICZoYW5kbGUpKSkgewotCQlkcHJpbnRrKCJJbnZva2luZyBfSU5JXG4iKTsKLQkJaWYgKEFDUElfRkFJTFVSRShhY3BpX2V2YWx1YXRlX29iamVjdChzb255X25jX2FjcGlfaGFuZGxlLCBNRVRIT0RfTkFNRV9fSU5JLAotCQkJCQkJTlVMTCwgTlVMTCkpKQotCQkJZHByaW50aygiX0lOSSBNZXRob2QgZmFpbGVkXG4iKTsKLQl9Ci0KIAlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShzb255X25jX2FjcGlfaGFuZGxlLCAiRUNPTiIsCiAJCQkJCSAmaGFuZGxlKSkpIHsKIAkJaWYgKGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIkVDT04iLCAxLCBOVUxMKSkKQEAgLTEzOTAsMjcgKzEzOTAsMjAgQEAKIAlzdHJ1Y3Qgc29ueXBpX2V2ZW50CSpldmVudHM7CiB9OwogCi1zdHJ1Y3QgZGV2aWNlX2N0cmwgewotCWludAkJCQltb2RlbDsKLQlpbnQJCQkJKCpoYW5kbGVfaXJxKShjb25zdCB1OCwgY29uc3QgdTgpOwotCXUxNgkJCQlldnBvcnRfb2Zmc2V0OwotCXU4CQkJCWhhc19jYW1lcmE7Ci0JdTgJCQkJaGFzX2JsdWV0b290aDsKLQl1OAkJCQloYXNfd3dhbjsKLQlzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMJKmV2ZW50X3R5cGVzOwotfTsKLQogc3RydWN0IHNvbnlfcGljX2RldiB7Ci0Jc3RydWN0IGRldmljZV9jdHJsCSpjb250cm9sOwotCXN0cnVjdCBhY3BpX2RldmljZQkqYWNwaV9kZXY7Ci0Jc3RydWN0IHNvbnlfcGljX2lycQkqY3VyX2lycTsKLQlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0CSpjdXJfaW9wb3J0OwotCXN0cnVjdCBsaXN0X2hlYWQJaW50ZXJydXB0czsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWlvcG9ydHM7Ci0Jc3RydWN0IG11dGV4CQlsb2NrOwotCXU4CQkJY2FtZXJhX3Bvd2VyOwotCXU4CQkJYmx1ZXRvb3RoX3Bvd2VyOwotCXU4CQkJd3dhbl9wb3dlcjsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UJCSphY3BpX2RldjsKKwlzdHJ1Y3Qgc29ueV9waWNfaXJxCQkqY3VyX2lycTsKKwlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0CQkqY3VyX2lvcG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlpbnRlcnJ1cHRzOworCXN0cnVjdCBsaXN0X2hlYWQJCWlvcG9ydHM7CisJc3RydWN0IG11dGV4CQkJbG9jazsKKwlzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMJKmV2ZW50X3R5cGVzOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpoYW5kbGVfaXJxKShjb25zdCB1OCwgY29uc3QgdTgpOworCWludAkJCQltb2RlbDsKKwl1MTYJCQkJZXZwb3J0X29mZnNldDsKKwl1OAkJCQljYW1lcmFfcG93ZXI7CisJdTgJCQkJYmx1ZXRvb3RoX3Bvd2VyOworCXU4CQkJCXd3YW5fcG93ZXI7CiB9OwogCiBzdGF0aWMgc3RydWN0IHNvbnlfcGljX2RldiBzcGljX2RldiA9IHsKQEAgLTE0MTgsNiArMTQxMSw4IEBACiAJLmlvcG9ydHMJPSBMSVNUX0hFQURfSU5JVChzcGljX2Rldi5pb3BvcnRzKSwKIH07CiAKK3N0YXRpYyBpbnQgc3BpY19kcnZfcmVnaXN0ZXJlZDsKKwogLyogRXZlbnQgbWFza3MgKi8KICNkZWZpbmUgU09OWVBJX0pPR0dFUl9NQVNLCQkJMHgwMDAwMDAwMQogI2RlZmluZSBTT05ZUElfQ0FQVFVSRV9NQVNLCQkJMHgwMDAwMDAwMgpAQCAtMTcxNSwyNyArMTcxMCw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2N0cmwgc3BpY190eXBlc1tdID0gewotCXsKLQkJLm1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMSwKLQkJLmhhbmRsZV9pcnEgPSBOVUxMLAotCQkuZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFMV9PRkZTRVQsCi0JCS5ldmVudF90eXBlcyA9IHR5cGUxX2V2ZW50cywKLQl9LAotCXsKLQkJLm1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMiwKLQkJLmhhbmRsZV9pcnEgPSBOVUxMLAotCQkuZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFMl9PRkZTRVQsCi0JCS5ldmVudF90eXBlcyA9IHR5cGUyX2V2ZW50cywKLQl9LAotCXsKLQkJLm1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMywKLQkJLmhhbmRsZV9pcnEgPSB0eXBlM19oYW5kbGVfaXJxLAotCQkuZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFM19PRkZTRVQsCi0JCS5ldmVudF90eXBlcyA9IHR5cGUzX2V2ZW50cywKLQl9LAotfTsKLQogc3RhdGljIHZvaWQgc29ueV9waWNfZGV0ZWN0X2RldmljZV90eXBlKHN0cnVjdCBzb255X3BpY19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwpAQCAtMTc0Myw0OCArMTcxNyw2MyBAQAogCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgTlVMTCk7CiAJaWYgKHBjaWRldikgewotCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1swXTsKKwkJZGV2LT5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTE7CisJCWRldi0+ZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFMV9PRkZTRVQ7CisJCWRldi0+ZXZlbnRfdHlwZXMgPSB0eXBlMV9ldmVudHM7CiAJCWdvdG8gb3V0OwogCX0KIAogCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMSwgTlVMTCk7CiAJaWYgKHBjaWRldikgewotCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1syXTsKKwkJZGV2LT5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTI7CisJCWRldi0+ZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFMl9PRkZTRVQ7CisJCWRldi0+ZXZlbnRfdHlwZXMgPSB0eXBlMl9ldmVudHM7CiAJCWdvdG8gb3V0OwogCX0KIAogCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwgTlVMTCk7CiAJaWYgKHBjaWRldikgewotCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1syXTsKKwkJZGV2LT5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTM7CisJCWRldi0+aGFuZGxlX2lycSA9IHR5cGUzX2hhbmRsZV9pcnE7CisJCWRldi0+ZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFM19PRkZTRVQ7CisJCWRldi0+ZXZlbnRfdHlwZXMgPSB0eXBlM19ldmVudHM7CiAJCWdvdG8gb3V0OwogCX0KIAogCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNCwgTlVMTCk7CiAJaWYgKHBjaWRldikgewotCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1syXTsKKwkJZGV2LT5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTM7CisJCWRldi0+aGFuZGxlX2lycSA9IHR5cGUzX2hhbmRsZV9pcnE7CisJCWRldi0+ZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFM19PRkZTRVQ7CisJCWRldi0+ZXZlbnRfdHlwZXMgPSB0eXBlM19ldmVudHM7CiAJCWdvdG8gb3V0OwogCX0KIAogCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfMSwgTlVMTCk7CiAJaWYgKHBjaWRldikgewotCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1syXTsKKwkJZGV2LT5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTM7CisJCWRldi0+aGFuZGxlX2lycSA9IHR5cGUzX2hhbmRsZV9pcnE7CisJCWRldi0+ZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFM19PRkZTRVQ7CisJCWRldi0+ZXZlbnRfdHlwZXMgPSB0eXBlM19ldmVudHM7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIGRlZmF1bHQgKi8KLQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1sxXTsKKwlkZXYtPm1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMjsKKwlkZXYtPmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTJfT0ZGU0VUOworCWRldi0+ZXZlbnRfdHlwZXMgPSB0eXBlMl9ldmVudHM7CiAKIG91dDoKIAlpZiAocGNpZGV2KQogCQlwY2lfZGV2X3B1dChwY2lkZXYpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICJkZXRlY3RlZCBUeXBlJWQgbW9kZWxcbiIsCi0JCQlkZXYtPmNvbnRyb2wtPm1vZGVsID09IFNPTllQSV9ERVZJQ0VfVFlQRTEgPyAxIDoKLQkJCWRldi0+Y29udHJvbC0+bW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMiA/IDIgOiAzKTsKKwkJCWRldi0+bW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMSA/IDEgOgorCQkJZGV2LT5tb2RlbCA9PSBTT05ZUElfREVWSUNFX1RZUEUyID8gMiA6IDMpOwogfQogCiAvKiBjYW1lcmEgdGVzdHMgYW5kIHBvd2Vyb24vcG93ZXJvZmYgKi8KQEAgLTI1NTcsNyArMjU0Niw3IEBACiAJYnVmZmVyLnBvaW50ZXIgPSByZXNvdXJjZTsKIAogCS8qIHNldHVwIFR5cGUgMSByZXNvdXJjZXMgKi8KLQlpZiAoc3BpY19kZXYuY29udHJvbC0+bW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMSkgeworCWlmIChzcGljX2Rldi5tb2RlbCA9PSBTT05ZUElfREVWSUNFX1RZUEUxKSB7CiAKIAkJLyogc2V0dXAgaW8gcmVzb3VyY2VzICovCiAJCXJlc291cmNlLT5yZXMxLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSU87CkBAIC0yNjQwLDI5ICsyNjI5LDI4IEBACiAJCWRhdGFfbWFzayA9IGluYl9wKGRldi0+Y3VyX2lvcG9ydC0+aW8yLm1pbmltdW0pOwogCWVsc2UKIAkJZGF0YV9tYXNrID0gaW5iX3AoZGV2LT5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArCi0JCQkJZGV2LT5jb250cm9sLT5ldnBvcnRfb2Zmc2V0KTsKKwkJCQlkZXYtPmV2cG9ydF9vZmZzZXQpOwogCiAJZHByaW50aygiZXZlbnQgKFslLjJ4XSBbJS4yeF0pIGF0IHBvcnQgMHglLjR4KCsweCUuMngpXG4iLAogCQkJZXYsIGRhdGFfbWFzaywgZGV2LT5jdXJfaW9wb3J0LT5pbzEubWluaW11bSwKLQkJCWRldi0+Y29udHJvbC0+ZXZwb3J0X29mZnNldCk7CisJCQlkZXYtPmV2cG9ydF9vZmZzZXQpOwogCiAJaWYgKGV2ID09IDB4MDAgfHwgZXYgPT0gMHhmZikKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCi0JZm9yIChpID0gMDsgZGV2LT5jb250cm9sLT5ldmVudF90eXBlc1tpXS5tYXNrOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBkZXYtPmV2ZW50X3R5cGVzW2ldLm1hc2s7IGkrKykgewogCi0JCWlmICgoZGF0YV9tYXNrICYgZGV2LT5jb250cm9sLT5ldmVudF90eXBlc1tpXS5kYXRhKSAhPQotCQkgICAgZGV2LT5jb250cm9sLT5ldmVudF90eXBlc1tpXS5kYXRhKQorCQlpZiAoKGRhdGFfbWFzayAmIGRldi0+ZXZlbnRfdHlwZXNbaV0uZGF0YSkgIT0KKwkJICAgIGRldi0+ZXZlbnRfdHlwZXNbaV0uZGF0YSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICghKG1hc2sgJiBkZXYtPmNvbnRyb2wtPmV2ZW50X3R5cGVzW2ldLm1hc2spKQorCQlpZiAoIShtYXNrICYgZGV2LT5ldmVudF90eXBlc1tpXS5tYXNrKSkKIAkJCWNvbnRpbnVlOwogCi0JCWZvciAoaiA9IDA7IGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OyBqKyspIHsKLQkJCWlmIChldiA9PSBkZXYtPmNvbnRyb2wtPmV2ZW50X3R5cGVzW2ldLmV2ZW50c1tqXS5kYXRhKSB7CisJCWZvciAoaiA9IDA7IGRldi0+ZXZlbnRfdHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OyBqKyspIHsKKwkJCWlmIChldiA9PSBkZXYtPmV2ZW50X3R5cGVzW2ldLmV2ZW50c1tqXS5kYXRhKSB7CiAJCQkJZGV2aWNlX2V2ZW50ID0KLQkJCQkJZGV2LT5jb250cm9sLT4KLQkJCQkJCWV2ZW50X3R5cGVzW2ldLmV2ZW50c1tqXS5ldmVudDsKKwkJCQkJZGV2LT5ldmVudF90eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7CiAJCQkJZ290byBmb3VuZDsKIAkJCX0KIAkJfQpAQCAtMjY3MCwxMyArMjY1OCwxMiBAQAogCS8qIFN0aWxsIG5vdCBhYmxlIHRvIGRlY29kZSB0aGUgZXZlbnQgdHJ5IHRvIHBhc3MKIAkgKiBpdCBvdmVyIHRvIHRoZSBtaW5pZHJpdmVyCiAJICovCi0JaWYgKGRldi0+Y29udHJvbC0+aGFuZGxlX2lycSAmJgotCQkJZGV2LT5jb250cm9sLT5oYW5kbGVfaXJxKGRhdGFfbWFzaywgZXYpID09IDApCisJaWYgKGRldi0+aGFuZGxlX2lycSAmJiBkZXYtPmhhbmRsZV9pcnEoZGF0YV9tYXNrLCBldikgPT0gMCkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCiAJZHByaW50aygidW5rbm93biBldmVudCAoWyUuMnhdIFslLjJ4XSkgYXQgcG9ydCAweCUuNHgoKzB4JS4yeClcbiIsCiAJCQlldiwgZGF0YV9tYXNrLCBkZXYtPmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtLAotCQkJZGV2LT5jb250cm9sLT5ldnBvcnRfb2Zmc2V0KTsKKwkJCWRldi0+ZXZwb3J0X29mZnNldCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogCiBmb3VuZDoKQEAgLTI4MDcsNyArMjc5NCw3IEBACiAJLyogcmVxdWVzdCBJUlEgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaXJxLCAmc3BpY19kZXYuaW50ZXJydXB0cywgbGlzdCkgewogCQlpZiAoIXJlcXVlc3RfaXJxKGlycS0+aXJxLmludGVycnVwdHNbMF0sIHNvbnlfcGljX2lycSwKLQkJCQkJSVJRRl9TSEFSRUQsICJzb255LWxhcHRvcCIsICZzcGljX2RldikpIHsKKwkJCQkJSVJRRl9ESVNBQkxFRCwgInNvbnktbGFwdG9wIiwgJnNwaWNfZGV2KSkgewogCQkJZHByaW50aygiSVJROiAlZCAtIHRyaWdnZXJpbmc6ICVkIC0gIgogCQkJCQkicG9sYXJpdHk6ICVkIC0gc2hyOiAlZFxuIiwKIAkJCQkJaXJxLT5pcnEuaW50ZXJydXB0c1swXSwKQEAgLTI5NDAsNiArMjkyNyw3IEBACiAJCQkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgU1BJQyBkcml2ZXIuIik7CiAJCQlnb3RvIG91dDsKIAkJfQorCQlzcGljX2Rydl9yZWdpc3RlcmVkID0gMTsKIAl9CiAKIAlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJnNvbnlfbmNfZHJpdmVyKTsKQEAgLTI5NTEsNyArMjkzOSw3IEBACiAJcmV0dXJuIDA7CiAKIG91dF91bnJlZ2lzdGVyX3BpYzoKLQlpZiAoIW5vX3NwaWMpCisJaWYgKHNwaWNfZHJ2X3JlZ2lzdGVyZWQpCiAJCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255X3BpY19kcml2ZXIpOwogb3V0OgogCXJldHVybiByZXN1bHQ7CkBAIC0yOTYwLDcgKzI5NDgsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHNvbnlfbGFwdG9wX2V4aXQodm9pZCkKIHsKIAlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9uY19kcml2ZXIpOwotCWlmICghbm9fc3BpYykKKwlpZiAoc3BpY19kcnZfcmVnaXN0ZXJlZCkKIAkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJnNvbnlfcGljX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwppbmRleCBmNzhkMjc1Li5kOTMxMDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCkBAIC0yMiw3ICsyMiw3IEBACiAgKi8KIAogI2RlZmluZSBUUEFDUElfVkVSU0lPTiAiMC4yMyIKLSNkZWZpbmUgVFBBQ1BJX1NZU0ZTX1ZFUlNJT04gMHgwMjA0MDAKKyNkZWZpbmUgVFBBQ1BJX1NZU0ZTX1ZFUlNJT04gMHgwMjA1MDAKIAogLyoKICAqICBDaGFuZ2Vsb2c6CkBAIC0xNDUsNiArMTQ1LDUxIEBACiAJVFBfQUNQSV9XR1NWX1NUQVRFX1VXQlBXUgk9IDB4MDAyMCwgLyogVVdCIHJhZGlvIGVuYWJsZWQgKi8KIH07CiAKKy8qIEhLRVkgZXZlbnRzICovCitlbnVtIHRwYWNwaV9oa2V5X2V2ZW50X3QgeworCS8qIEhvdGtleS1yZWxhdGVkICovCisJVFBfSEtFWV9FVl9IT1RLRVlfQkFTRQkJPSAweDEwMDEsIC8qIGZpcnN0IGhvdGtleSAoRk4rRjEpICovCisJVFBfSEtFWV9FVl9CUkdIVF9VUAkJPSAweDEwMTAsIC8qIEJyaWdodG5lc3MgdXAgKi8KKwlUUF9IS0VZX0VWX0JSR0hUX0RPV04JCT0gMHgxMDExLCAvKiBCcmlnaHRuZXNzIGRvd24gKi8KKwlUUF9IS0VZX0VWX1ZPTF9VUAkJPSAweDEwMTUsIC8qIFZvbHVtZSB1cCBvciB1bm11dGUgKi8KKwlUUF9IS0VZX0VWX1ZPTF9ET1dOCQk9IDB4MTAxNiwgLyogVm9sdW1lIGRvd24gb3IgdW5tdXRlICovCisJVFBfSEtFWV9FVl9WT0xfTVVURQkJPSAweDEwMTcsIC8qIE1peGVyIG91dHB1dCBtdXRlICovCisKKwkvKiBSZWFzb25zIGZvciB3YWtpbmcgdXAgZnJvbSBTMy9TNCAqLworCVRQX0hLRVlfRVZfV0tVUF9TM19VTkRPQ0sJPSAweDIzMDQsIC8qIHVuZG9jayByZXF1ZXN0ZWQsIFMzICovCisJVFBfSEtFWV9FVl9XS1VQX1M0X1VORE9DSwk9IDB4MjQwNCwgLyogdW5kb2NrIHJlcXVlc3RlZCwgUzQgKi8KKwlUUF9IS0VZX0VWX1dLVVBfUzNfQkFZRUoJPSAweDIzMDUsIC8qIGJheSBlamVjdGlvbiByZXEsIFMzICovCisJVFBfSEtFWV9FVl9XS1VQX1M0X0JBWUVKCT0gMHgyNDA1LCAvKiBiYXkgZWplY3Rpb24gcmVxLCBTNCAqLworCVRQX0hLRVlfRVZfV0tVUF9TM19CQVRMT1cJPSAweDIzMTMsIC8qIGJhdHRlcnkgZW1wdHksIFMzICovCisJVFBfSEtFWV9FVl9XS1VQX1M0X0JBVExPVwk9IDB4MjQxMywgLyogYmF0dGVyeSBlbXB0eSwgUzQgKi8KKworCS8qIEF1dG8tc2xlZXAgYWZ0ZXIgZWplY3QgcmVxdWVzdCAqLworCVRQX0hLRVlfRVZfQkFZRUpfQUNLCQk9IDB4MzAwMywgLyogYmF5IGVqZWN0aW9uIGNvbXBsZXRlICovCisJVFBfSEtFWV9FVl9VTkRPQ0tfQUNLCQk9IDB4NDAwMywgLyogdW5kb2NrIGNvbXBsZXRlICovCisKKwkvKiBNaXNjIGJheSBldmVudHMgKi8KKwlUUF9IS0VZX0VWX09QVERSVl9FSgkJPSAweDMwMDYsIC8qIG9wdC4gZHJpdmUgdHJheSBlamVjdGVkICovCisKKwkvKiBVc2VyLWludGVyZmFjZSBldmVudHMgKi8KKwlUUF9IS0VZX0VWX0xJRF9DTE9TRQkJPSAweDUwMDEsIC8qIGxhcHRvcCBsaWQgY2xvc2VkICovCisJVFBfSEtFWV9FVl9MSURfT1BFTgkJPSAweDUwMDIsIC8qIGxhcHRvcCBsaWQgb3BlbmVkICovCisJVFBfSEtFWV9FVl9UQUJMRVRfVEFCTEVUCT0gMHg1MDA5LCAvKiB0YWJsZXQgc3dpdmVsIHVwICovCisJVFBfSEtFWV9FVl9UQUJMRVRfTk9URUJPT0sJPSAweDUwMGEsIC8qIHRhYmxldCBzd2l2ZWwgZG93biAqLworCVRQX0hLRVlfRVZfUEVOX0lOU0VSVEVECQk9IDB4NTAwYiwgLyogdGFibGV0IHBlbiBpbnNlcnRlZCAqLworCVRQX0hLRVlfRVZfUEVOX1JFTU9WRUQJCT0gMHg1MDBjLCAvKiB0YWJsZXQgcGVuIHJlbW92ZWQgKi8KKwlUUF9IS0VZX0VWX0JSR0hUX0NIQU5HRUQJPSAweDUwMTAsIC8qIGJhY2tsaWdodCBjb250cm9sIGV2ZW50ICovCisKKwkvKiBUaGVybWFsIGV2ZW50cyAqLworCVRQX0hLRVlfRVZfQUxBUk1fQkFUX0hPVAk9IDB4NjAxMSwgLyogYmF0dGVyeSB0b28gaG90ICovCisJVFBfSEtFWV9FVl9BTEFSTV9CQVRfWEhPVAk9IDB4NjAxMiwgLyogYmF0dGVyeSBjcml0aWNhbGx5IGhvdCAqLworCVRQX0hLRVlfRVZfQUxBUk1fU0VOU09SX0hPVAk9IDB4NjAyMSwgLyogc2Vuc29yIHRvbyBob3QgKi8KKwlUUF9IS0VZX0VWX0FMQVJNX1NFTlNPUl9YSE9UCT0gMHg2MDIyLCAvKiBzZW5zb3IgY3JpdGljYWxseSBob3QgKi8KKwlUUF9IS0VZX0VWX1RITV9UQUJMRV9DSEFOR0VECT0gMHg2MDMwLCAvKiB0aGVybWFsIHRhYmxlIGNoYW5nZWQgKi8KKworCS8qIE1pc2MgKi8KKwlUUF9IS0VZX0VWX1JGS0lMTF9DSEFOR0VECT0gMHg3MDAwLCAvKiByZmtpbGwgc3dpdGNoIGNoYW5nZWQgKi8KK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYWluIGRyaXZlcgogICovCkBAIC0xODQ4LDYgKzE4OTMsMjcgQEAKICAqIEhvdGtleSBzdWJkcml2ZXIKICAqLwogCisvKgorICogVGhpbmtQYWQgZmlybXdhcmUgZXZlbnQgbW9kZWwKKyAqCisgKiBUaGUgVGhpbmtQYWQgZmlybXdhcmUgaGFzIHR3byBtYWluIGV2ZW50IGludGVyZmFjZXM6IG5vcm1hbCBBQ1BJCisgKiBub3RpZmljYXRpb25zICh3aGljaCBmb2xsb3cgdGhlIEFDUEkgc3RhbmRhcmQpLCBhbmQgYSBwcml2YXRlIGV2ZW50CisgKiBpbnRlcmZhY2UuCisgKgorICogVGhlIHByaXZhdGUgZXZlbnQgaW50ZXJmYWNlIGFsc28gaXNzdWVzIGV2ZW50cyBmb3IgdGhlIGhvdGtleXMuICBBcworICogdGhlIGRyaXZlciBnYWluZWQgZmVhdHVyZXMsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlIGVuZGVkIHVwIGJlaW5nCisgKiBidWlsdCBhcm91bmQgdGhlIGhvdGtleSBzdWJkcml2ZXIuICBUaGlzIHdpbGwgbmVlZCB0byBiZSByZWZhY3RvcmVkCisgKiB0byBhIG1vcmUgZm9ybWFsIGV2ZW50IEFQSSBldmVudHVhbGx5LgorICoKKyAqIFNvbWUgImhvdGtleXMiIGFyZSBhY3R1YWxseSBzdXBwb3NlZCB0byBiZSB1c2VkIGFzIGV2ZW50IHJlcG9ydHMsCisgKiBzdWNoIGFzICJicmlnaHRuZXNzIGhhcyBjaGFuZ2VkIiwgInZvbHVtZSBoYXMgY2hhbmdlZCIsIGRlcGVuZGluZyBvbgorICogdGhlIFRoaW5rUGFkIG1vZGVsIGFuZCBob3cgdGhlIGZpcm13YXJlIGlzIG9wZXJhdGluZy4KKyAqCisgKiBVbmxpa2Ugb3RoZXIgY2xhc3NlcywgaG90a2V5LWNsYXNzIGV2ZW50cyBoYXZlIG1hc2svdW5tYXNrIGNvbnRyb2wgb24KKyAqIG5vbi1hbmNpZW50IGZpcm13YXJlLiAgSG93ZXZlciwgaG93IGl0IGJlaGF2ZXMgY2hhbmdlcyBhIGxvdCB3aXRoIHRoZQorICogZmlybXdhcmUgbW9kZWwgYW5kIHZlcnNpb24uCisgKi8KKwogZW51bSB7CS8qIGhvdCBrZXkgc2NhbiBjb2RlcyAoZGVyaXZlZCBmcm9tIEFDUEkgRFNEVCkgKi8KIAlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMQkJPSAwLAogCVRQX0FDUElfSE9US0VZU0NBTl9GTkYyLApAQCAtMTg3NSw3ICsxOTQxLDcgQEAKIAlUUF9BQ1BJX0hPVEtFWVNDQU5fVEhJTktQQUQsCiB9OwogCi1lbnVtIHsJLyogS2V5cyBhdmFpbGFibGUgdGhyb3VnaCBOVlJBTSBwb2xsaW5nICovCitlbnVtIHsJLyogS2V5cy9ldmVudHMgYXZhaWxhYmxlIHRocm91Z2ggTlZSQU0gcG9sbGluZyAqLwogCVRQQUNQSV9IS0VZX05WUkFNX0tOT1dOX01BU0sgPSAweDAwZmI4OGMwVSwKIAlUUEFDUElfSEtFWV9OVlJBTV9HT09EX01BU0sgID0gMHgwMGZiODAwMFUsCiB9OwpAQCAtMTkzMCw4ICsxOTk2LDExIEBACiBzdGF0aWMgc3RydWN0IG11dGV4IGhvdGtleV90aHJlYWRfbXV0ZXg7CiAKIC8qCi0gKiBBY3F1aXJlIG11dGV4IHRvIHdyaXRlIHBvbGxlciBjb250cm9sIHZhcmlhYmxlcy4KLSAqIEluY3JlbWVudCBob3RrZXlfY29uZmlnX2NoYW5nZSB3aGVuIGNoYW5naW5nIHRoZW0uCisgKiBBY3F1aXJlIG11dGV4IHRvIHdyaXRlIHBvbGxlciBjb250cm9sIHZhcmlhYmxlcyBhcyBhbgorICogYXRvbWljIGJsb2NrLgorICoKKyAqIEluY3JlbWVudCBob3RrZXlfY29uZmlnX2NoYW5nZSB3aGVuIGNoYW5naW5nIHRoZW0gaWYgeW91CisgKiB3YW50IHRoZSBrdGhyZWFkIHRvIGZvcmdldCBvbGQgc3RhdGUuCiAgKgogICogU2VlIEhPVEtFWV9DT05GSUdfQ1JJVElDQUxfU1RBUlQvSE9US0VZX0NPTkZJR19DUklUSUNBTF9FTkQKICAqLwpAQCAtMTk0Miw2ICsyMDExLDExIEBACiAgKiBob3RrZXkgcG9sbGVyIGNvbnRyb2wgdmFyaWFibGVzCiAgKgogICogTXVzdCBiZSBhdG9taWMgb3IgcmVhZGVycyB3aWxsIGFsc28gbmVlZCB0byBhY3F1aXJlIG11dGV4CisgKgorICogSE9US0VZX0NPTkZJR19DUklUSUNBTF9TVEFSVC9IT1RLRVlfQ09ORklHX0NSSVRJQ0FMX0VORAorICogc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHRoZSBjaGFuZ2VzIG5lZWQgdG8gYmUgdGFrZW4gYXMKKyAqIGEgYmxvY2ssIE9SIHdoZW4gb25lIG5lZWRzIHRvIGZvcmNlIHRoZSBrdGhyZWFkIHRvIGZvcmdldAorICogb2xkIHN0YXRlLgogICovCiBzdGF0aWMgdTMyIGhvdGtleV9zb3VyY2VfbWFzazsJCS8qIGJpdCBtYXNrIDA9QUNQSSwxPU5WUkFNICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGhvdGtleV9wb2xsX2ZyZXEgPSAxMDsgLyogSHogKi8KQEAgLTE5NzIsMTAgKzIwNDYsMTIgQEAKIAogc3RhdGljIGludCBob3RrZXlfYXV0b3NsZWVwX2FjazsKIAotc3RhdGljIHUzMiBob3RrZXlfb3JpZ19tYXNrOwotc3RhdGljIHUzMiBob3RrZXlfYWxsX21hc2s7Ci1zdGF0aWMgdTMyIGhvdGtleV9yZXNlcnZlZF9tYXNrOwotc3RhdGljIHUzMiBob3RrZXlfbWFzazsKK3N0YXRpYyB1MzIgaG90a2V5X29yaWdfbWFzazsJCS8qIGV2ZW50cyB0aGUgQklPUyBoYWQgZW5hYmxlZCAqLworc3RhdGljIHUzMiBob3RrZXlfYWxsX21hc2s7CQkvKiBhbGwgZXZlbnRzIHN1cHBvcnRlZCBpbiBmdyAqLworc3RhdGljIHUzMiBob3RrZXlfcmVzZXJ2ZWRfbWFzazsJLyogZXZlbnRzIGJldHRlciBsZWZ0IGRpc2FibGVkICovCitzdGF0aWMgdTMyIGhvdGtleV9kcml2ZXJfbWFzazsJCS8qIGV2ZW50cyBuZWVkZWQgYnkgdGhlIGRyaXZlciAqLworc3RhdGljIHUzMiBob3RrZXlfdXNlcl9tYXNrOwkJLyogZXZlbnRzIHZpc2libGUgdG8gdXNlcnNwYWNlICovCitzdGF0aWMgdTMyIGhvdGtleV9hY3BpX21hc2s7CQkvKiBldmVudHMgZW5hYmxlZCBpbiBmaXJtd2FyZSAqLwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGhvdGtleV9yZXBvcnRfbW9kZTsKIApAQCAtMTk4Myw2ICsyMDU5LDkgQEAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfc2V0ICpob3RrZXlfZGV2X2F0dHJpYnV0ZXM7CiAKK3N0YXRpYyB2b2lkIHRwYWNwaV9kcml2ZXJfZXZlbnQoY29uc3QgdW5zaWduZWQgaW50IGhrZXlfZXZlbnQpOworc3RhdGljIHZvaWQgaG90a2V5X2RyaXZlcl9ldmVudChjb25zdCB1bnNpZ25lZCBpbnQgc2NhbmNvZGUpOworCiAvKiBIS0VZLk1IS0coKSByZXR1cm4gYml0cyAqLwogI2RlZmluZSBUUF9IT1RLRVlfVEFCTEVUX01BU0sgKDEgPDwgMykKIApAQCAtMjAxNywyNCArMjA5Niw1MyBAQAogfQogCiAvKgorICogUmVhZHMgY3VycmVudCBldmVudCBtYXNrIGZyb20gZmlybXdhcmUsIGFuZCB1cGRhdGVzCisgKiBob3RrZXlfYWNwaV9tYXNrIGFjY29yZGluZ2x5LiAgQWxzbyByZXNldHMgYW55IGJpdHMKKyAqIGZyb20gaG90a2V5X3VzZXJfbWFzayB0aGF0IGFyZSB1bmF2YWlsYWJsZSB0byBiZQorICogZGVsaXZlcmVkIChzaGFkb3cgcmVxdWlyZW1lbnQgb2YgdGhlIHVzZXJzcGFjZSBBQkkpLgorICoKICAqIENhbGwgd2l0aCBob3RrZXlfbXV0ZXggaGVsZAogICovCiBzdGF0aWMgaW50IGhvdGtleV9tYXNrX2dldCh2b2lkKQogewotCXUzMiBtID0gMDsKLQogCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgeworCQl1MzIgbSA9IDA7CisKIAkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmbSwgIkRIS04iLCAiZCIpKQogCQkJcmV0dXJuIC1FSU87CisKKwkJaG90a2V5X2FjcGlfbWFzayA9IG07CisJfSBlbHNlIHsKKwkJLyogbm8gbWFzayBzdXBwb3J0IGRvZXNuJ3QgbWVhbiBubyBldmVudCBzdXBwb3J0Li4uICovCisJCWhvdGtleV9hY3BpX21hc2sgPSBob3RrZXlfYWxsX21hc2s7CiAJfQotCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfU1RBUlQKLQlob3RrZXlfbWFzayA9IG0gfCAoaG90a2V5X3NvdXJjZV9tYXNrICYgaG90a2V5X21hc2spOwotCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5ECisKKwkvKiBzeW5jIHVzZXJzcGFjZS12aXNpYmxlIG1hc2sgKi8KKwlob3RrZXlfdXNlcl9tYXNrICY9IChob3RrZXlfYWNwaV9tYXNrIHwgaG90a2V5X3NvdXJjZV9tYXNrKTsKIAogCXJldHVybiAwOwogfQogCit2b2lkIHN0YXRpYyBob3RrZXlfbWFza193YXJuX2luY29tcGxldGVfbWFzayh2b2lkKQoreworCS8qIGxvZyBvbmx5IHdoYXQgdGhlIHVzZXIgY2FuIGZpeC4uLiAqLworCWNvbnN0IHUzMiB3YW50ZWRtYXNrID0gaG90a2V5X2RyaXZlcl9tYXNrICYKKwkJfihob3RrZXlfYWNwaV9tYXNrIHwgaG90a2V5X3NvdXJjZV9tYXNrKSAmCisJCShob3RrZXlfYWxsX21hc2sgfCBUUEFDUElfSEtFWV9OVlJBTV9LTk9XTl9NQVNLKTsKKworCWlmICh3YW50ZWRtYXNrKQorCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJInJlcXVpcmVkIGV2ZW50cyAweCUwOHggbm90IGVuYWJsZWQhXG4iLAorCQkJd2FudGVkbWFzayk7Cit9CisKIC8qCisgKiBTZXQgdGhlIGZpcm13YXJlIG1hc2sgd2hlbiBzdXBwb3J0ZWQKKyAqCisgKiBBbHNvIGNhbGxzIGhvdGtleV9tYXNrX2dldCB0byB1cGRhdGUgaG90a2V5X2FjcGlfbWFzay4KKyAqCisgKiBOT1RFOiBkb2VzIG5vdCBzZXQgYml0cyBpbiBob3RrZXlfdXNlcl9tYXNrLCBidXQgbWF5IHJlc2V0IHRoZW0uCisgKgogICogQ2FsbCB3aXRoIGhvdGtleV9tdXRleCBoZWxkCiAgKi8KIHN0YXRpYyBpbnQgaG90a2V5X21hc2tfc2V0KHUzMiBtYXNrKQpAQCAtMjA0Miw2NiArMjE1MCwxMDAgQEAKIAlpbnQgaTsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7Ci0JCWlmICghdHBfd2FybmVkLmhvdGtleV9tYXNrX2ZmICYmCi0JCSAgICAobWFzayA9PSAweGZmZmYgfHwgbWFzayA9PSAweGZmZmZmZiB8fAotCQkgICAgIG1hc2sgPT0gMHhmZmZmZmZmZikpIHsKLQkJCXRwX3dhcm5lZC5ob3RrZXlfbWFza19mZiA9IDE7Ci0JCQlwcmludGsoVFBBQ1BJX05PVElDRQotCQkJICAgICAgICJzZXR0aW5nIHRoZSBob3RrZXkgbWFzayB0byAweCUwOHggaXMgbGlrZWx5ICIKLQkJCSAgICAgICAibm90IHRoZSBiZXN0IHdheSB0byBnbyBhYm91dCBpdFxuIiwgbWFzayk7Ci0JCQlwcmludGsoVFBBQ1BJX05PVElDRQotCQkJICAgICAgICJwbGVhc2UgY29uc2lkZXIgdXNpbmcgdGhlIGRyaXZlciBkZWZhdWx0cywgIgotCQkJICAgICAgICJhbmQgcmVmZXIgdG8gdXAtdG8tZGF0ZSB0aGlua3BhZC1hY3BpICIKLQkJCSAgICAgICAiZG9jdW1lbnRhdGlvblxuIik7Ci0JCX0KKwljb25zdCB1MzIgZndtYXNrID0gbWFzayAmIH5ob3RrZXlfc291cmNlX21hc2s7CiAKLQkJSE9US0VZX0NPTkZJR19DUklUSUNBTF9TVEFSVAorCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgewogCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJdTMyIG0gPSAxIDw8IGk7Ci0JCQkvKiBlbmFibGUgaW4gZmlybXdhcmUgbWFzayBvbmx5IGtleXMgbm90IGluIE5WUkFNCi0JCQkgKiBtb2RlLCBidXQgZW5hYmxlIHRoZSBrZXkgaW4gdGhlIGNhY2hlZCBob3RrZXlfbWFzawotCQkJICogcmVnYXJkbGVzcyBvZiBtb2RlLCBvciB0aGUga2V5IHdpbGwgZW5kIHVwCi0JCQkgKiBkaXNhYmxlZCBieSBob3RrZXlfbWFza19nZXQoKSAqLwogCQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLAogCQkJCQlOVUxMLCAiTUhLTSIsICJ2ZGQiLCBpICsgMSwKLQkJCQkJISEoKG1hc2sgJiB+aG90a2V5X3NvdXJjZV9tYXNrKSAmIG0pKSkgeworCQkJCQkhIShtYXNrICYgKDEgPDwgaSkpKSkgewogCQkJCXJjID0gLUVJTzsKIAkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaG90a2V5X21hc2sgPSAoaG90a2V5X21hc2sgJiB+bSkgfCAobWFzayAmIG0pOwogCQkJfQogCQl9Ci0JCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5ECi0KLQkJLyogaG90a2V5X21hc2tfZ2V0IG11c3QgYmUgY2FsbGVkIHVuY29uZGl0aW9uYWxseSBiZWxvdyAqLwotCQlpZiAoIWhvdGtleV9tYXNrX2dldCgpICYmICFyYyAmJgotCQkgICAgKGhvdGtleV9tYXNrICYgfmhvdGtleV9zb3VyY2VfbWFzaykgIT0KLQkJICAgICAobWFzayAmIH5ob3RrZXlfc291cmNlX21hc2spKSB7Ci0JCQlwcmludGsoVFBBQ1BJX05PVElDRQotCQkJICAgICAgICJyZXF1ZXN0ZWQgaG90IGtleSBtYXNrIDB4JTA4eCwgYnV0ICIKLQkJCSAgICAgICAiZmlybXdhcmUgZm9yY2VkIGl0IHRvIDB4JTA4eFxuIiwKLQkJCSAgICAgICBtYXNrLCBob3RrZXlfbWFzayk7Ci0JCX0KLQl9IGVsc2UgewotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCi0JCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfU1RBUlQKLQkJaG90a2V5X21hc2sgPSBtYXNrICYgaG90a2V5X3NvdXJjZV9tYXNrOwotCQlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX0VORAotCQlob3RrZXlfbWFza19nZXQoKTsKLQkJaWYgKGhvdGtleV9tYXNrICE9IG1hc2spIHsKLQkJCXByaW50ayhUUEFDUElfTk9USUNFCi0JCQkgICAgICAgInJlcXVlc3RlZCBob3Qga2V5IG1hc2sgMHglMDh4LCAiCi0JCQkgICAgICAgImZvcmNlZCB0byAweCUwOHggKE5WUkFNIHBvbGwgbWFzayBpcyAiCi0JCQkgICAgICAgIjB4JTA4eCk6IG5vIGZpcm13YXJlIG1hc2sgc3VwcG9ydFxuIiwKLQkJCSAgICAgICBtYXNrLCBob3RrZXlfbWFzaywgaG90a2V5X3NvdXJjZV9tYXNrKTsKLQkJfQotI2Vsc2UKLQkJaG90a2V5X21hc2tfZ2V0KCk7Ci0JCXJjID0gLUVOWElPOwotI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMICovCiAJfQogCisJLyoKKwkgKiBXZSAqbXVzdCogbWFrZSBhbiBpbmNvbmRpdGlvbmFsIGNhbGwgdG8gaG90a2V5X21hc2tfZ2V0IHRvCisJICogcmVmcmVzaCBob3RrZXlfYWNwaV9tYXNrIGFuZCB1cGRhdGUgaG90a2V5X3VzZXJfbWFzaworCSAqCisJICogVGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gYWxzbyBsb2cgd2hlbiB3ZSBjYW5ub3QgX2VuYWJsZV8KKwkgKiBhIGdpdmVuIGV2ZW50LgorCSAqLworCWlmICghaG90a2V5X21hc2tfZ2V0KCkgJiYgIXJjICYmIChmd21hc2sgJiB+aG90a2V5X2FjcGlfbWFzaykpIHsKKwkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKKwkJICAgICAgICJhc2tlZCBmb3IgaG90a2V5IG1hc2sgMHglMDh4LCBidXQgIgorCQkgICAgICAgImZpcm13YXJlIGZvcmNlZCBpdCB0byAweCUwOHhcbiIsCisJCSAgICAgICBmd21hc2ssIGhvdGtleV9hY3BpX21hc2spOworCX0KKworCWhvdGtleV9tYXNrX3dhcm5faW5jb21wbGV0ZV9tYXNrKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBTZXRzIGhvdGtleV91c2VyX21hc2sgYW5kIHRyaWVzIHRvIHNldCB0aGUgZmlybXdhcmUgbWFzaworICoKKyAqIENhbGwgd2l0aCBob3RrZXlfbXV0ZXggaGVsZAorICovCitzdGF0aWMgaW50IGhvdGtleV91c2VyX21hc2tfc2V0KGNvbnN0IHUzMiBtYXNrKQoreworCWludCByYzsKKworCS8qIEdpdmUgcGVvcGxlIGEgY2hhbmNlIHRvIG5vdGljZSB0aGV5IGFyZSBkb2luZyBzb21ldGhpbmcgdGhhdAorCSAqIGlzIGJvdW5kIHRvIGdvIGJvb20gb24gdGhlaXIgdXNlcnMgc29vbmVyIG9yIGxhdGVyICovCisJaWYgKCF0cF93YXJuZWQuaG90a2V5X21hc2tfZmYgJiYKKwkgICAgKG1hc2sgPT0gMHhmZmZmIHx8IG1hc2sgPT0gMHhmZmZmZmYgfHwKKwkgICAgIG1hc2sgPT0gMHhmZmZmZmZmZikpIHsKKwkJdHBfd2FybmVkLmhvdGtleV9tYXNrX2ZmID0gMTsKKwkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKKwkJICAgICAgICJzZXR0aW5nIHRoZSBob3RrZXkgbWFzayB0byAweCUwOHggaXMgbGlrZWx5ICIKKwkJICAgICAgICJub3QgdGhlIGJlc3Qgd2F5IHRvIGdvIGFib3V0IGl0XG4iLCBtYXNrKTsKKwkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKKwkJICAgICAgICJwbGVhc2UgY29uc2lkZXIgdXNpbmcgdGhlIGRyaXZlciBkZWZhdWx0cywgIgorCQkgICAgICAgImFuZCByZWZlciB0byB1cC10by1kYXRlIHRoaW5rcGFkLWFjcGkgIgorCQkgICAgICAgImRvY3VtZW50YXRpb25cbiIpOworCX0KKworCS8qIFRyeSB0byBlbmFibGUgd2hhdCB0aGUgdXNlciBhc2tlZCBmb3IsIHBsdXMgd2hhdGV2ZXIgd2UgbmVlZC4KKwkgKiB0aGlzIHN5bmNzIGV2ZXJ5dGhpbmcgYnV0IHdvbid0IGVuYWJsZSBiaXRzIGluIGhvdGtleV91c2VyX21hc2sgKi8KKwlyYyA9IGhvdGtleV9tYXNrX3NldCgobWFzayB8IGhvdGtleV9kcml2ZXJfbWFzaykgJiB+aG90a2V5X3NvdXJjZV9tYXNrKTsKKworCS8qIEVuYWJsZSB0aGUgYXZhaWxhYmxlIGJpdHMgaW4gaG90a2V5X3VzZXJfbWFzayAqLworCWhvdGtleV91c2VyX21hc2sgPSBtYXNrICYgKGhvdGtleV9hY3BpX21hc2sgfCBob3RrZXlfc291cmNlX21hc2spOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogU2V0cyB0aGUgZHJpdmVyIGhvdGtleSBtYXNrLgorICoKKyAqIENhbiBiZSBjYWxsZWQgZXZlbiBpZiB0aGUgaG90a2V5IHN1YmRyaXZlciBpcyBpbmFjdGl2ZQorICovCitzdGF0aWMgaW50IHRwYWNwaV9ob3RrZXlfZHJpdmVyX21hc2tfc2V0KGNvbnN0IHUzMiBtYXNrKQoreworCWludCByYzsKKworCS8qIERvIHRoZSByaWdodCB0aGluZyBpZiBob3RrZXlfaW5pdCBoYXMgbm90IGJlZW4gY2FsbGVkIHlldCAqLworCWlmICghdHBfZmVhdHVyZXMuaG90a2V5KSB7CisJCWhvdGtleV9kcml2ZXJfbWFzayA9IG1hc2s7CisJCXJldHVybiAwOworCX0KKworCW11dGV4X2xvY2soJmhvdGtleV9tdXRleCk7CisKKwlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX1NUQVJUCisJaG90a2V5X2RyaXZlcl9tYXNrID0gbWFzazsKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAorCWhvdGtleV9zb3VyY2VfbWFzayB8PSAobWFzayAmIH5ob3RrZXlfYWxsX21hc2spOworI2VuZGlmCisJSE9US0VZX0NPTkZJR19DUklUSUNBTF9FTkQKKworCXJjID0gaG90a2V5X21hc2tfc2V0KChob3RrZXlfYWNwaV9tYXNrIHwgaG90a2V5X2RyaXZlcl9tYXNrKSAmCisJCQkJCQkJfmhvdGtleV9zb3VyY2VfbWFzayk7CisJbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0yMTM3LDExICsyMjc5LDEwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB0cGFjcGlfaW5wdXRfc2VuZF9rZXkodW5zaWduZWQgaW50IHNjYW5jb2RlKQorLyogRG8gTk9UIGNhbGwgd2l0aG91dCB2YWxpZGF0aW5nIHNjYW5jb2RlIGZpcnN0ICovCitzdGF0aWMgdm9pZCB0cGFjcGlfaW5wdXRfc2VuZF9rZXkoY29uc3QgdW5zaWduZWQgaW50IHNjYW5jb2RlKQogewotCXVuc2lnbmVkIGludCBrZXljb2RlOwotCi0Ja2V5Y29kZSA9IGhvdGtleV9rZXljb2RlX21hcFtzY2FuY29kZV07CisJY29uc3QgdW5zaWduZWQgaW50IGtleWNvZGUgPSBob3RrZXlfa2V5Y29kZV9tYXBbc2NhbmNvZGVdOwogCiAJaWYgKGtleWNvZGUgIT0gS0VZX1JFU0VSVkVEKSB7CiAJCW11dGV4X2xvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKQEAgLTIxNjIsMTkgKzIzMDMsMjggQEAKIAl9CiB9CiAKKy8qIERvIE5PVCBjYWxsIHdpdGhvdXQgdmFsaWRhdGluZyBzY2FuY29kZSBmaXJzdCAqLworc3RhdGljIHZvaWQgdHBhY3BpX2lucHV0X3NlbmRfa2V5X21hc2tlZChjb25zdCB1bnNpZ25lZCBpbnQgc2NhbmNvZGUpCit7CisJaG90a2V5X2RyaXZlcl9ldmVudChzY2FuY29kZSk7CisJaWYgKGhvdGtleV91c2VyX21hc2sgJiAoMSA8PCBzY2FuY29kZSkpCisJCXRwYWNwaV9pbnB1dF9zZW5kX2tleShzY2FuY29kZSk7Cit9CisKICNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAogc3RhdGljIHN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgaWJtX2hvdGtleV9hY3BpZHJpdmVyOwogCisvKiBEbyBOT1QgY2FsbCB3aXRob3V0IHZhbGlkYXRpbmcgc2NhbmNvZGUgZmlyc3QgKi8KIHN0YXRpYyB2b2lkIHRwYWNwaV9ob3RrZXlfc2VuZF9rZXkodW5zaWduZWQgaW50IHNjYW5jb2RlKQogewotCXRwYWNwaV9pbnB1dF9zZW5kX2tleShzY2FuY29kZSk7CisJdHBhY3BpX2lucHV0X3NlbmRfa2V5X21hc2tlZChzY2FuY29kZSk7CiAJaWYgKGhvdGtleV9yZXBvcnRfbW9kZSA8IDIpIHsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChpYm1faG90a2V5X2FjcGlkcml2ZXIuZGV2aWNlLAotCQkJCQkJMHg4MCwgMHgxMDAxICsgc2NhbmNvZGUpOworCQkJCTB4ODAsIFRQX0hLRVlfRVZfSE9US0VZX0JBU0UgKyBzY2FuY29kZSk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBob3RrZXlfcmVhZF9udnJhbShzdHJ1Y3QgdHBfbnZyYW1fc3RhdGUgKm4sIHUzMiBtKQorc3RhdGljIHZvaWQgaG90a2V5X3JlYWRfbnZyYW0oc3RydWN0IHRwX252cmFtX3N0YXRlICpuLCBjb25zdCB1MzIgbSkKIHsKIAl1OCBkOwogCkBAIC0yMjEwLDIxICsyMzYwLDI0IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBob3RrZXlfY29tcGFyZV9hbmRfaXNzdWVfZXZlbnQoc3RydWN0IHRwX252cmFtX3N0YXRlICpvbGRuLAorCQkJCQkgICBzdHJ1Y3QgdHBfbnZyYW1fc3RhdGUgKm5ld24sCisJCQkJCSAgIGNvbnN0IHUzMiBldmVudF9tYXNrKQoreworCiAjZGVmaW5lIFRQQUNQSV9DT01QQVJFX0tFWShfX3NjYW5jb2RlLCBfX21lbWJlcikgXAogCWRvIHsgXAotCQlpZiAoKG1hc2sgJiAoMSA8PCBfX3NjYW5jb2RlKSkgJiYgXAorCQlpZiAoKGV2ZW50X21hc2sgJiAoMSA8PCBfX3NjYW5jb2RlKSkgJiYgXAogCQkgICAgb2xkbi0+X19tZW1iZXIgIT0gbmV3bi0+X19tZW1iZXIpIFwKLQkJdHBhY3BpX2hvdGtleV9zZW5kX2tleShfX3NjYW5jb2RlKTsgXAorCQkJdHBhY3BpX2hvdGtleV9zZW5kX2tleShfX3NjYW5jb2RlKTsgXAogCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgVFBBQ1BJX01BWV9TRU5EX0tFWShfX3NjYW5jb2RlKSBcCi0JZG8geyBpZiAobWFzayAmICgxIDw8IF9fc2NhbmNvZGUpKSBcCi0JCXRwYWNwaV9ob3RrZXlfc2VuZF9rZXkoX19zY2FuY29kZSk7IH0gd2hpbGUgKDApCisJZG8geyBcCisJCWlmIChldmVudF9tYXNrICYgKDEgPDwgX19zY2FuY29kZSkpIFwKKwkJCXRwYWNwaV9ob3RrZXlfc2VuZF9rZXkoX19zY2FuY29kZSk7IFwKKwl9IHdoaWxlICgwKQogCi1zdGF0aWMgdm9pZCBob3RrZXlfY29tcGFyZV9hbmRfaXNzdWVfZXZlbnQoc3RydWN0IHRwX252cmFtX3N0YXRlICpvbGRuLAotCQkJCQkgICBzdHJ1Y3QgdHBfbnZyYW1fc3RhdGUgKm5ld24sCi0JCQkJCSAgIHUzMiBtYXNrKQotewogCVRQQUNQSV9DT01QQVJFX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fVEhJTktQQUQsIHRoaW5rcGFkX3RvZ2dsZSk7CiAJVFBBQ1BJX0NPTVBBUkVfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9GTlNQQUNFLCB6b29tX3RvZ2dsZSk7CiAJVFBBQ1BJX0NPTVBBUkVfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9GTkY3LCBkaXNwbGF5X3RvZ2dsZSk7CkBAIC0yMjcwLDE1ICsyNDIzLDIyIEBACiAJCQl9CiAJCX0KIAl9Ci19CiAKICN1bmRlZiBUUEFDUElfQ09NUEFSRV9LRVkKICN1bmRlZiBUUEFDUElfTUFZX1NFTkRfS0VZCit9CiAKKy8qCisgKiBQb2xsaW5nIGRyaXZlcgorICoKKyAqIFdlIHRyYWNrIGFsbCBldmVudHMgaW4gaG90a2V5X3NvdXJjZV9tYXNrIGFsbCB0aGUgdGltZSwgc2luY2UKKyAqIG1vc3Qgb2YgdGhlbSBhcmUgZWRnZS1iYXNlZC4gIFdlIG9ubHkgaXNzdWUgdGhvc2UgcmVxdWVzdGVkIGJ5CisgKiBob3RrZXlfdXNlcl9tYXNrIG9yIGhvdGtleV9kcml2ZXJfbWFzaywgdGhvdWdoLgorICovCiBzdGF0aWMgaW50IGhvdGtleV9rdGhyZWFkKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHRwX252cmFtX3N0YXRlIHNbMl07Ci0JdTMyIG1hc2s7CisJdTMyIHBvbGxfbWFzaywgZXZlbnRfbWFzazsKIAl1bnNpZ25lZCBpbnQgc2ksIHNvOwogCXVuc2lnbmVkIGxvbmcgdDsKIAl1bnNpZ25lZCBpbnQgY2hhbmdlX2RldGVjdG9yLCBtdXN0X3Jlc2V0OwpAQCAtMjI5OCwxMCArMjQ1OCwxMiBAQAogCS8qIEluaXRpYWwgc3RhdGUgZm9yIGNvbXBhcmVzICovCiAJbXV0ZXhfbG9jaygmaG90a2V5X3RocmVhZF9kYXRhX211dGV4KTsKIAljaGFuZ2VfZGV0ZWN0b3IgPSBob3RrZXlfY29uZmlnX2NoYW5nZTsKLQltYXNrID0gaG90a2V5X3NvdXJjZV9tYXNrICYgaG90a2V5X21hc2s7CisJcG9sbF9tYXNrID0gaG90a2V5X3NvdXJjZV9tYXNrOworCWV2ZW50X21hc2sgPSBob3RrZXlfc291cmNlX21hc2sgJgorCQkJKGhvdGtleV9kcml2ZXJfbWFzayB8IGhvdGtleV91c2VyX21hc2spOwogCXBvbGxfZnJlcSA9IGhvdGtleV9wb2xsX2ZyZXE7CiAJbXV0ZXhfdW5sb2NrKCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOwotCWhvdGtleV9yZWFkX252cmFtKCZzW3NvXSwgbWFzayk7CisJaG90a2V5X3JlYWRfbnZyYW0oJnNbc29dLCBwb2xsX21hc2spOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJaWYgKHQgPT0gMCkgewpAQCAtMjMyNCwxNSArMjQ4NiwxNyBAQAogCQkJdCA9IDA7CiAJCQljaGFuZ2VfZGV0ZWN0b3IgPSBob3RrZXlfY29uZmlnX2NoYW5nZTsKIAkJfQotCQltYXNrID0gaG90a2V5X3NvdXJjZV9tYXNrICYgaG90a2V5X21hc2s7CisJCXBvbGxfbWFzayA9IGhvdGtleV9zb3VyY2VfbWFzazsKKwkJZXZlbnRfbWFzayA9IGhvdGtleV9zb3VyY2VfbWFzayAmCisJCQkJKGhvdGtleV9kcml2ZXJfbWFzayB8IGhvdGtleV91c2VyX21hc2spOwogCQlwb2xsX2ZyZXEgPSBob3RrZXlfcG9sbF9mcmVxOwogCQltdXRleF91bmxvY2soJmhvdGtleV90aHJlYWRfZGF0YV9tdXRleCk7CiAKLQkJaWYgKGxpa2VseShtYXNrKSkgewotCQkJaG90a2V5X3JlYWRfbnZyYW0oJnNbc2ldLCBtYXNrKTsKKwkJaWYgKGxpa2VseShwb2xsX21hc2spKSB7CisJCQlob3RrZXlfcmVhZF9udnJhbSgmc1tzaV0sIHBvbGxfbWFzayk7CiAJCQlpZiAobGlrZWx5KHNpICE9IHNvKSkgewogCQkJCWhvdGtleV9jb21wYXJlX2FuZF9pc3N1ZV9ldmVudCgmc1tzb10sICZzW3NpXSwKLQkJCQkJCQkJbWFzayk7CisJCQkJCQkJCWV2ZW50X21hc2spOwogCQkJfQogCQl9CiAKQEAgLTIzNjQsMTAgKzI1MjgsMTIgQEAKIC8qIGNhbGwgd2l0aCBob3RrZXlfbXV0ZXggaGVsZCAqLwogc3RhdGljIHZvaWQgaG90a2V5X3BvbGxfc2V0dXAoYm9vbCBtYXlfd2FybikKIHsKLQl1MzIgaG90a2V5c190b19wb2xsID0gaG90a2V5X3NvdXJjZV9tYXNrICYgaG90a2V5X21hc2s7CisJY29uc3QgdTMyIHBvbGxfZHJpdmVyX21hc2sgPSBob3RrZXlfZHJpdmVyX21hc2sgJiBob3RrZXlfc291cmNlX21hc2s7CisJY29uc3QgdTMyIHBvbGxfdXNlcl9tYXNrID0gaG90a2V5X3VzZXJfbWFzayAmIGhvdGtleV9zb3VyY2VfbWFzazsKIAotCWlmIChob3RrZXlzX3RvX3BvbGwgIT0gMCAmJiBob3RrZXlfcG9sbF9mcmVxID4gMCAmJgotCSAgICAodHBhY3BpX2lucHV0ZGV2LT51c2VycyA+IDAgfHwgaG90a2V5X3JlcG9ydF9tb2RlIDwgMikpIHsKKwlpZiAoaG90a2V5X3BvbGxfZnJlcSA+IDAgJiYKKwkgICAgKHBvbGxfZHJpdmVyX21hc2sgfHwKKwkgICAgIChwb2xsX3VzZXJfbWFzayAmJiB0cGFjcGlfaW5wdXRkZXYtPnVzZXJzID4gMCkpKSB7CiAJCWlmICghdHBhY3BpX2hvdGtleV90YXNrKSB7CiAJCQl0cGFjcGlfaG90a2V5X3Rhc2sgPSBrdGhyZWFkX3J1bihob3RrZXlfa3RocmVhZCwKIAkJCQkJTlVMTCwgVFBBQ1BJX05WUkFNX0tUSFJFQURfTkFNRSk7CkBAIC0yMzgwLDEyICsyNTQ2LDEzIEBACiAJCX0KIAl9IGVsc2UgewogCQlob3RrZXlfcG9sbF9zdG9wX3N5bmMoKTsKLQkJaWYgKG1heV93YXJuICYmIGhvdGtleXNfdG9fcG9sbCAhPSAwICYmCisJCWlmIChtYXlfd2FybiAmJiAocG9sbF9kcml2ZXJfbWFzayB8fCBwb2xsX3VzZXJfbWFzaykgJiYKIAkJICAgIGhvdGtleV9wb2xsX2ZyZXEgPT0gMCkgewogCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKLQkJCQkiaG90IGtleXMgMHglMDh4IHJlcXVpcmUgcG9sbGluZywgIgotCQkJCSJ3aGljaCBpcyBjdXJyZW50bHkgZGlzYWJsZWRcbiIsCi0JCQkJaG90a2V5c190b19wb2xsKTsKKwkJCQkiaG90IGtleXMgMHglMDh4IGFuZC9vciBldmVudHMgMHglMDh4ICIKKwkJCQkicmVxdWlyZSBwb2xsaW5nLCB3aGljaCBpcyBjdXJyZW50bHkgIgorCQkJCSJkaXNhYmxlZFxuIiwKKwkJCQlwb2xsX3VzZXJfbWFzaywgcG9sbF9kcml2ZXJfbWFzayk7CiAJCX0KIAl9CiB9CkBAIC0yNDAzLDkgKzI1NzAsNyBAQAogCWlmICghZnJlcSkKIAkJaG90a2V5X3BvbGxfc3RvcF9zeW5jKCk7CiAKLQlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX1NUQVJUCiAJaG90a2V5X3BvbGxfZnJlcSA9IGZyZXE7Ci0JSE9US0VZX0NPTkZJR19DUklUSUNBTF9FTkQKIH0KIAogI2Vsc2UgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KQEAgLTI0NDAsNyArMjYwNSw4IEBACiBzdGF0aWMgdm9pZCBob3RrZXlfaW5wdXRkZXZfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewogCS8qIGRpc2FibGUgaG90a2V5IHBvbGxpbmcgd2hlbiBwb3NzaWJsZSAqLwotCWlmICh0cGFjcGlfbGlmZWN5Y2xlID09IFRQQUNQSV9MSUZFX1JVTk5JTkcpCisJaWYgKHRwYWNwaV9saWZlY3ljbGUgPT0gVFBBQ1BJX0xJRkVfUlVOTklORyAmJgorCSAgICAhKGhvdGtleV9zb3VyY2VfbWFzayAmIGhvdGtleV9kcml2ZXJfbWFzaykpCiAJCWhvdGtleV9wb2xsX3NldHVwX3NhZmUoZmFsc2UpOwogfQogCkBAIC0yNDg4LDE1ICsyNjU0LDcgQEAKIAkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgY2hhciAqYnVmKQogewotCWludCByZXM7Ci0KLQlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmaG90a2V5X211dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlyZXMgPSBob3RrZXlfbWFza19nZXQoKTsKLQltdXRleF91bmxvY2soJmhvdGtleV9tdXRleCk7Ci0KLQlyZXR1cm4gKHJlcyk/Ci0JCXJlcyA6IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLCBob3RrZXlfbWFzayk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLCBob3RrZXlfdXNlcl9tYXNrKTsKIH0KIAogc3RhdGljIHNzaXplX3QgaG90a2V5X21hc2tfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMjUxMiw3ICsyNjcwLDcgQEAKIAlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmaG90a2V5X211dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCXJlcyA9IGhvdGtleV9tYXNrX3NldCh0KTsKKwlyZXMgPSBob3RrZXlfdXNlcl9tYXNrX3NldCh0KTsKIAogI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCiAJaG90a2V5X3BvbGxfc2V0dXAodHJ1ZSk7CkBAIC0yNTk0LDYgKzI3NTIsOCBAQAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdDsKKwl1MzIgcl9ldjsKKwlpbnQgcmM7CiAKIAlpZiAocGFyc2Vfc3RydG91bChidWYsIDB4ZmZmZmZmZmZVTCwgJnQpIHx8CiAJCSgodCAmIH5UUEFDUElfSEtFWV9OVlJBTV9LTk9XTl9NQVNLKSAhPSAwKSkKQEAgLTI2MDYsMTQgKzI3NjYsMjggQEAKIAlob3RrZXlfc291cmNlX21hc2sgPSB0OwogCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5ECiAKKwlyYyA9IGhvdGtleV9tYXNrX3NldCgoaG90a2V5X3VzZXJfbWFzayB8IGhvdGtleV9kcml2ZXJfbWFzaykgJgorCQkJfmhvdGtleV9zb3VyY2VfbWFzayk7CiAJaG90a2V5X3BvbGxfc2V0dXAodHJ1ZSk7Ci0JaG90a2V5X21hc2tfc2V0KGhvdGtleV9tYXNrKTsKKworCS8qIGNoZWNrIGlmIGV2ZW50cyBuZWVkZWQgYnkgdGhlIGRyaXZlciBnb3QgZGlzYWJsZWQgKi8KKwlyX2V2ID0gaG90a2V5X2RyaXZlcl9tYXNrICYgfihob3RrZXlfYWNwaV9tYXNrICYgaG90a2V5X2FsbF9tYXNrKQorCQkmIH5ob3RrZXlfc291cmNlX21hc2sgJiBUUEFDUElfSEtFWV9OVlJBTV9LTk9XTl9NQVNLOwogCiAJbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOwogCisJaWYgKHJjIDwgMCkKKwkJcHJpbnRrKFRQQUNQSV9FUlIgImhvdGtleV9zb3VyY2VfbWFzazogZmFpbGVkIHRvIHVwZGF0ZSB0aGUiCisJCQkiZmlybXdhcmUgZXZlbnQgbWFzayFcbiIpOworCisJaWYgKHJfZXYpCisJCXByaW50ayhUUEFDUElfTk9USUNFICJob3RrZXlfc291cmNlX21hc2s6ICIKKwkJCSJzb21lIGltcG9ydGFudCBldmVudHMgd2VyZSBkaXNhYmxlZDogIgorCQkJIjB4JTA0eFxuIiwgcl9ldik7CisKIAl0cGFjcGlfZGlzY2xvc2VfdXNlcnRhc2soImhvdGtleV9zb3VyY2VfbWFzayIsICJzZXQgdG8gMHglMDhseFxuIiwgdCk7CiAKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIChyYyA8IDApID8gcmMgOiBjb3VudDsKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9zb3VyY2VfbWFzayA9CkBAIC0yNzMxLDkgKzI5MDUsOCBAQAogCiBzdGF0aWMgdm9pZCBob3RrZXlfd2FrZXVwX3JlYXNvbl9ub3RpZnlfY2hhbmdlKHZvaWQpCiB7Ci0JaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKQotCQlzeXNmc19ub3RpZnkoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwgTlVMTCwKLQkJCSAgICAgIndha2V1cF9yZWFzb24iKTsKKwlzeXNmc19ub3RpZnkoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwgTlVMTCwKKwkJICAgICAid2FrZXVwX3JlYXNvbiIpOwogfQogCiAvKiBzeXNmcyB3YWtldXAgaG90dW5wbHVnX2NvbXBsZXRlIChwb2xsYWJsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI3NTAsOSArMjkyMyw4IEBACiAKIHN0YXRpYyB2b2lkIGhvdGtleV93YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlX25vdGlmeV9jaGFuZ2Uodm9pZCkKIHsKLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5X21hc2spCi0JCXN5c2ZzX25vdGlmeSgmdHBhY3BpX3BkZXYtPmRldi5rb2JqLCBOVUxMLAotCQkJICAgICAid2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZSIpOworCXN5c2ZzX25vdGlmeSgmdHBhY3BpX3BkZXYtPmRldi5rb2JqLCBOVUxMLAorCQkgICAgICJ3YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlIik7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjc2MCwyNyArMjkzMiwxOSBAQAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmhvdGtleV9hdHRyaWJ1dGVzW10gX19pbml0ZGF0YSA9IHsKIAkmZGV2X2F0dHJfaG90a2V5X2VuYWJsZS5hdHRyLAogCSZkZXZfYXR0cl9ob3RrZXlfYmlvc19lbmFibGVkLmF0dHIsCisJJmRldl9hdHRyX2hvdGtleV9iaW9zX21hc2suYXR0ciwKIAkmZGV2X2F0dHJfaG90a2V5X3JlcG9ydF9tb2RlLmF0dHIsCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKKwkmZGV2X2F0dHJfaG90a2V5X3dha2V1cF9yZWFzb24uYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGUuYXR0ciwKIAkmZGV2X2F0dHJfaG90a2V5X21hc2suYXR0ciwKIAkmZGV2X2F0dHJfaG90a2V5X2FsbF9tYXNrLmF0dHIsCiAJJmRldl9hdHRyX2hvdGtleV9yZWNvbW1lbmRlZF9tYXNrLmF0dHIsCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKIAkmZGV2X2F0dHJfaG90a2V5X3NvdXJjZV9tYXNrLmF0dHIsCiAJJmRldl9hdHRyX2hvdGtleV9wb2xsX2ZyZXEuYXR0ciwKICNlbmRpZgogfTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmhvdGtleV9tYXNrX2F0dHJpYnV0ZXNbXSBfX2luaXRkYXRhID0gewotCSZkZXZfYXR0cl9ob3RrZXlfYmlvc19tYXNrLmF0dHIsCi0jaWZuZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCi0JJmRldl9hdHRyX2hvdGtleV9tYXNrLmF0dHIsCi0JJmRldl9hdHRyX2hvdGtleV9hbGxfbWFzay5hdHRyLAotCSZkZXZfYXR0cl9ob3RrZXlfcmVjb21tZW5kZWRfbWFzay5hdHRyLAotI2VuZGlmCi0JJmRldl9hdHRyX2hvdGtleV93YWtldXBfcmVhc29uLmF0dHIsCi0JJmRldl9hdHRyX2hvdGtleV93YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlLmF0dHIsCi19OwotCiAvKgogICogU3luYyBib3RoIHRoZSBodyBhbmQgc3cgYmxvY2tpbmcgc3RhdGUgb2YgYWxsIHN3aXRjaGVzCiAgKi8KQEAgLTI4NDMsMTYgKzMwMDcsMTYgQEAKIAogCWtmcmVlKGhvdGtleV9rZXljb2RlX21hcCk7CiAKLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5KSB7Ci0JCWRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElUIHwgVFBBQ1BJX0RCR19IS0VZLAotCQkJICAgInJlc3RvcmluZyBvcmlnaW5hbCBob3Qga2V5IG1hc2tcbiIpOwotCQkvKiBubyBzaG9ydC1jaXJjdWl0IGJvb2xlYW4gb3BlcmF0b3IgYmVsb3chICovCi0JCWlmICgoaG90a2V5X21hc2tfc2V0KGhvdGtleV9vcmlnX21hc2spIHwKLQkJICAgICBob3RrZXlfc3RhdHVzX3NldChmYWxzZSkpICE9IDApCi0JCQlwcmludGsoVFBBQ1BJX0VSUgotCQkJICAgICAgICJmYWlsZWQgdG8gcmVzdG9yZSBob3Qga2V5IG1hc2sgIgotCQkJICAgICAgICJ0byBCSU9TIGRlZmF1bHRzXG4iKTsKLQl9CisJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQgfCBUUEFDUElfREJHX0hLRVksCisJCSAgICJyZXN0b3Jpbmcgb3JpZ2luYWwgSEtFWSBzdGF0dXMgYW5kIG1hc2tcbiIpOworCS8qIHllcywgdGhlcmUgaXMgYSBiaXR3aXNlIG9yIGJlbG93LCB3ZSB3YW50IHRoZQorCSAqIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgZXZlbiBpZiBvbmUgb2YgdGhlbSBmYWlsICovCisJaWYgKCgodHBfZmVhdHVyZXMuaG90a2V5X21hc2sgJiYKKwkgICAgICBob3RrZXlfbWFza19zZXQoaG90a2V5X29yaWdfbWFzaykpIHwKKwkgICAgIGhvdGtleV9zdGF0dXNfc2V0KGZhbHNlKSkgIT0gMCkKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJmYWlsZWQgdG8gcmVzdG9yZSBob3Qga2V5IG1hc2sgIgorCQkgICAgICAgInRvIEJJT1MgZGVmYXVsdHNcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaG90a2V5X3VubWFwKGNvbnN0IHVuc2lnbmVkIGludCBzY2FuY29kZSkKQEAgLTI4NjQsNiArMzAyOCwzNSBAQAogCX0KIH0KIAorLyoKKyAqIEhLRVkgcXVpcmtzOgorICogICBUUEFDUElfSEtfUV9JTklNQVNLOglTdXBwb3J0cyBGTitGMyxGTitGNCxGTitGMTIKKyAqLworCisjZGVmaW5lCVRQQUNQSV9IS19RX0lOSU1BU0sJMHgwMDAxCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHBhY3BpX3F1aXJrIHRwYWNwaV9ob3RrZXlfcXRhYmxlW10gX19pbml0Y29uc3QgPSB7CisJVFBBQ1BJX1FfSUJNKCdJJywgJ0gnLCBUUEFDUElfSEtfUV9JTklNQVNLKSwgLyogNjAwRSAqLworCVRQQUNQSV9RX0lCTSgnSScsICdOJywgVFBBQ1BJX0hLX1FfSU5JTUFTSyksIC8qIDYwMEUgKi8KKwlUUEFDUElfUV9JQk0oJ0knLCAnRCcsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiA3NzAsIDc3MEUsIDc3MEVEICovCisJVFBBQ1BJX1FfSUJNKCdJJywgJ1cnLCBUUEFDUElfSEtfUV9JTklNQVNLKSwgLyogQTIwbSAqLworCVRQQUNQSV9RX0lCTSgnSScsICdWJywgVFBBQ1BJX0hLX1FfSU5JTUFTSyksIC8qIEEyMHAgKi8KKwlUUEFDUElfUV9JQk0oJzEnLCAnMCcsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBBMjFlLCBBMjJlICovCisJVFBBQ1BJX1FfSUJNKCdLJywgJ1UnLCBUUEFDUElfSEtfUV9JTklNQVNLKSwgLyogQTIxZSAqLworCVRQQUNQSV9RX0lCTSgnSycsICdYJywgVFBBQ1BJX0hLX1FfSU5JTUFTSyksIC8qIEEyMW0sIEEyMm0gKi8KKwlUUEFDUElfUV9JQk0oJ0snLCAnWScsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBBMjFwLCBBMjJwICovCisJVFBBQ1BJX1FfSUJNKCcxJywgJ0InLCBUUEFDUElfSEtfUV9JTklNQVNLKSwgLyogQTIyZSAqLworCVRQQUNQSV9RX0lCTSgnMScsICczJywgVFBBQ1BJX0hLX1FfSU5JTUFTSyksIC8qIEEyMm0gKi8KKwlUUEFDUElfUV9JQk0oJzEnLCAnRScsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBBMzAvcCAoMCkgKi8KKwlUUEFDUElfUV9JQk0oJzEnLCAnQycsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBSMzAgKi8KKwlUUEFDUElfUV9JQk0oJzEnLCAnRicsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBSMzEgKi8KKwlUUEFDUElfUV9JQk0oJ0knLCAnWScsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBUMjAgKi8KKwlUUEFDUElfUV9JQk0oJ0snLCAnWicsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBUMjEgKi8KKwlUUEFDUElfUV9JQk0oJzEnLCAnNicsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBUMjIgKi8KKwlUUEFDUElfUV9JQk0oJ0knLCAnWicsIFRQQUNQSV9IS19RX0lOSU1BU0spLCAvKiBYMjAsIFgyMSAqLworCVRQQUNQSV9RX0lCTSgnMScsICdEJywgVFBBQ1BJX0hLX1FfSU5JTUFTSyksIC8qIFgyMiwgWDIzLCBYMjQgKi8KK307CisKIHN0YXRpYyBpbnQgX19pbml0IGhvdGtleV9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCiB7CiAJLyogUmVxdWlyZW1lbnRzIGZvciBjaGFuZ2luZyB0aGUgZGVmYXVsdCBrZXltYXBzOgpAQCAtMjkwNiw5ICszMDk5LDcgQEAKIAkJS0VZX1VOS05PV04sCS8qIDB4MEQ6IEZOK0lOU0VSVCAqLwogCQlLRVlfVU5LTk9XTiwJLyogMHgwRTogRk4rREVMRVRFICovCiAKLQkJLyogYnJpZ2h0bmVzczogZmlybXdhcmUgYWx3YXlzIHJlYWN0cyB0byB0aGVtLCB1bmxlc3MKLQkJICogWC5vcmcgZGlkIHNvbWUgdHJpY2tzIGluIHRoZSByYWRlb24gQklPUyBzY3JhdGNoCi0JCSAqIHJlZ2lzdGVycyBvZiAqc29tZSogbW9kZWxzICovCisJCS8qIGJyaWdodG5lc3M6IGZpcm13YXJlIGFsd2F5cyByZWFjdHMgdG8gdGhlbSAqLwogCQlLRVlfUkVTRVJWRUQsCS8qIDB4MEY6IEZOK0hPTUUgKGJyaWdodG5lc3MgdXApICovCiAJCUtFWV9SRVNFUlZFRCwJLyogMHgxMDogRk4rRU5EIChicmlnaHRuZXNzIGRvd24pICovCiAKQEAgLTI5ODMsNiArMzE3NCw4IEBACiAJaW50IHN0YXR1czsKIAlpbnQgaGtleXY7CiAKKwl1bnNpZ25lZCBsb25nIHF1aXJrczsKKwogCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCB8IFRQQUNQSV9EQkdfSEtFWSwKIAkJCSJpbml0aWFsaXppbmcgaG90a2V5IHN1YmRyaXZlclxuIik7CiAKQEAgLTMwMDgsOSArMzIwMSwxNiBAQAogCWlmICghdHBfZmVhdHVyZXMuaG90a2V5KQogCQlyZXR1cm4gMTsKIAorCXF1aXJrcyA9IHRwYWNwaV9jaGVja19xdWlya3ModHBhY3BpX2hvdGtleV9xdGFibGUsCisJCQkJICAgICBBUlJBWV9TSVpFKHRwYWNwaV9ob3RrZXlfcXRhYmxlKSk7CisKIAl0cGFjcGlfZGlzYWJsZV9icmlnaHRuZXNzX2RlbGF5KCk7CiAKLQlob3RrZXlfZGV2X2F0dHJpYnV0ZXMgPSBjcmVhdGVfYXR0cl9zZXQoMTMsIE5VTEwpOworCS8qIE1VU1QgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCBhdHRyaWJ1dGVzIHRvIGJlIGFkZGVkIHRvCisJICogaG90a2V5X2Rldl9hdHRyaWJ1dGVzICovCisJaG90a2V5X2Rldl9hdHRyaWJ1dGVzID0gY3JlYXRlX2F0dHJfc2V0KAorCQkJCQlBUlJBWV9TSVpFKGhvdGtleV9hdHRyaWJ1dGVzKSArIDIsCisJCQkJCU5VTEwpOwogCWlmICghaG90a2V5X2Rldl9hdHRyaWJ1dGVzKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXMgPSBhZGRfbWFueV90b19hdHRyX3NldChob3RrZXlfZGV2X2F0dHJpYnV0ZXMsCkBAIC0zMDE5LDcgKzMyMTksNyBAQAogCWlmIChyZXMpCiAJCWdvdG8gZXJyX2V4aXQ7CiAKLQkvKiBtYXNrIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKKwkvKiBtYXNrIG5vdCBzdXBwb3J0ZWQgb24gNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsCiAJICAgQTMwLCBSMzAsIFIzMSwgVDIwLTIyLCBYMjAtMjEsIFgyMi0yNC4gIERldGVjdGVkIGJ5IGNoZWNraW5nCiAJICAgZm9yIEhLRVkgaW50ZXJmYWNlIHZlcnNpb24gMHgxMDAgKi8KIAlpZiAoYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJmhrZXl2LCAiTUhLViIsICJxZCIpKSB7CkBAIC0zMDMzLDEwICszMjMzLDIyIEBACiAJCQkgKiBNSEtWIDB4MTAwIGluIEEzMSwgUjQwLCBSNDBlLAogCQkJICogVDR4LCBYMzEsIGFuZCBsYXRlcgogCQkJICovCi0JCQl0cF9mZWF0dXJlcy5ob3RrZXlfbWFzayA9IDE7CiAJCQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQgfCBUUEFDUElfREJHX0hLRVksCiAJCQkJImZpcm13YXJlIEhLRVkgaW50ZXJmYWNlIHZlcnNpb246IDB4JXhcbiIsCiAJCQkJaGtleXYpOworCisJCQkvKiBQYXJhbm9pYSBjaGVjayBBTkQgaW5pdCBob3RrZXlfYWxsX21hc2sgKi8KKwkJCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJmhvdGtleV9hbGxfbWFzaywKKwkJCQkJIk1IS0EiLCAicWQiKSkgeworCQkJCXByaW50ayhUUEFDUElfRVJSCisJCQkJICAgICAgICJtaXNzaW5nIE1IS0EgaGFuZGxlciwgIgorCQkJCSAgICAgICAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICVzXG4iLAorCQkJCSAgICAgICBUUEFDUElfTUFJTCk7CisJCQkJLyogRmFsbGJhY2s6IHByZS1pbml0IGZvciBGTitGMyxGNCxGMTIgKi8KKwkJCQlob3RrZXlfYWxsX21hc2sgPSAweDA4MGNVOworCQkJfSBlbHNlIHsKKwkJCQl0cF9mZWF0dXJlcy5ob3RrZXlfbWFzayA9IDE7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTMwNDQsMzIgKzMyNTYsMjMgQEAKIAkJImhvdGtleSBtYXNrcyBhcmUgJXNcbiIsCiAJCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMuaG90a2V5X21hc2spKTsKIAotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgewotCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZob3RrZXlfYWxsX21hc2ssCi0JCQkJIk1IS0EiLCAicWQiKSkgewotCQkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJCSAgICAgICAibWlzc2luZyBNSEtBIGhhbmRsZXIsICIKLQkJCSAgICAgICAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICVzXG4iLAotCQkJICAgICAgIFRQQUNQSV9NQUlMKTsKLQkJCS8qIEZOK0YxMiwgRk4rRjQsIEZOK0YzICovCi0JCQlob3RrZXlfYWxsX21hc2sgPSAweDA4MGNVOwotCQl9Ci0JfQorCS8qIEluaXQgaG90a2V5X2FsbF9tYXNrIGlmIG5vdCBpbml0aWFsaXplZCB5ZXQgKi8KKwlpZiAoIXRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrICYmICFob3RrZXlfYWxsX21hc2sgJiYKKwkgICAgKHF1aXJrcyAmIFRQQUNQSV9IS19RX0lOSU1BU0spKQorCQlob3RrZXlfYWxsX21hc2sgPSAweDA4MGNVOyAgLyogRk4rRjEyLCBGTitGNCwgRk4rRjMgKi8KIAotCS8qIGhvdGtleV9zb3VyY2VfbWFzayAqbXVzdCogYmUgemVybyBmb3IKLQkgKiB0aGUgZmlyc3QgaG90a2V5X21hc2tfZ2V0ICovCisJLyogSW5pdCBob3RrZXlfYWNwaV9tYXNrIGFuZCBob3RrZXlfb3JpZ19tYXNrICovCiAJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7CisJCS8qIGhvdGtleV9zb3VyY2VfbWFzayAqbXVzdCogYmUgemVybyBmb3IKKwkJICogdGhlIGZpcnN0IGhvdGtleV9tYXNrX2dldCB0byByZXR1cm4gaG90a2V5X29yaWdfbWFzayAqLwogCQlyZXMgPSBob3RrZXlfbWFza19nZXQoKTsKIAkJaWYgKHJlcykKIAkJCWdvdG8gZXJyX2V4aXQ7CiAKLQkJaG90a2V5X29yaWdfbWFzayA9IGhvdGtleV9tYXNrOwotCQlyZXMgPSBhZGRfbWFueV90b19hdHRyX3NldCgKLQkJCQlob3RrZXlfZGV2X2F0dHJpYnV0ZXMsCi0JCQkJaG90a2V5X21hc2tfYXR0cmlidXRlcywKLQkJCQlBUlJBWV9TSVpFKGhvdGtleV9tYXNrX2F0dHJpYnV0ZXMpKTsKLQkJaWYgKHJlcykKLQkJCWdvdG8gZXJyX2V4aXQ7CisJCWhvdGtleV9vcmlnX21hc2sgPSBob3RrZXlfYWNwaV9tYXNrOworCX0gZWxzZSB7CisJCWhvdGtleV9vcmlnX21hc2sgPSBob3RrZXlfYWxsX21hc2s7CisJCWhvdGtleV9hY3BpX21hc2sgPSBob3RrZXlfYWxsX21hc2s7CiAJfQogCiAjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUdGQUNJTElUSUVTCkBAIC0zMTgzLDE0ICszMzg2LDkgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgewotCQlob3RrZXlfc291cmNlX21hc2sgPSBUUEFDUElfSEtFWV9OVlJBTV9HT09EX01BU0sKLQkJCQkJJiB+aG90a2V5X2FsbF9tYXNrCi0JCQkJCSYgfmhvdGtleV9yZXNlcnZlZF9tYXNrOwotCX0gZWxzZSB7Ci0JCWhvdGtleV9zb3VyY2VfbWFzayA9IFRQQUNQSV9IS0VZX05WUkFNX0dPT0RfTUFTSwotCQkJCQkmIH5ob3RrZXlfcmVzZXJ2ZWRfbWFzazsKLQl9CisJaG90a2V5X3NvdXJjZV9tYXNrID0gVFBBQ1BJX0hLRVlfTlZSQU1fR09PRF9NQVNLCisJCQkJJiB+aG90a2V5X2FsbF9tYXNrCisJCQkJJiB+aG90a2V5X3Jlc2VydmVkX21hc2s7CiAKIAl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQgfCBUUEFDUElfREJHX0hLRVksCiAJCSAgICAiaG90a2V5IHNvdXJjZSBtYXNrIDB4JTA4eCwgcG9sbGluZyBmcmVxICV1XG4iLApAQCAtMzIwNCwxMyArMzQwMiwxOCBAQAogCQlob3RrZXlfZXhpdCgpOwogCQlyZXR1cm4gcmVzOwogCX0KLQlyZXMgPSBob3RrZXlfbWFza19zZXQoKChob3RrZXlfYWxsX21hc2sgfCBob3RrZXlfc291cmNlX21hc2spCi0JCQkJJiB+aG90a2V5X3Jlc2VydmVkX21hc2spCi0JCQkJfCBob3RrZXlfb3JpZ19tYXNrKTsKKwlyZXMgPSBob3RrZXlfbWFza19zZXQoKChob3RrZXlfYWxsX21hc2sgJiB+aG90a2V5X3Jlc2VydmVkX21hc2spCisJCQkgICAgICAgfCBob3RrZXlfZHJpdmVyX21hc2spCisJCQkgICAgICAmIH5ob3RrZXlfc291cmNlX21hc2spOwogCWlmIChyZXMgPCAwICYmIHJlcyAhPSAtRU5YSU8pIHsKIAkJaG90a2V5X2V4aXQoKTsKIAkJcmV0dXJuIHJlczsKIAl9CisJaG90a2V5X3VzZXJfbWFzayA9IChob3RrZXlfYWNwaV9tYXNrIHwgaG90a2V5X3NvdXJjZV9tYXNrKQorCQkJCSYgfmhvdGtleV9yZXNlcnZlZF9tYXNrOworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCB8IFRQQUNQSV9EQkdfSEtFWSwKKwkJImluaXRpYWwgbWFza3M6IHVzZXI9MHglMDh4LCBmdz0weCUwOHgsIHBvbGw9MHglMDh4XG4iLAorCQlob3RrZXlfdXNlcl9tYXNrLCBob3RrZXlfYWNwaV9tYXNrLCBob3RrZXlfc291cmNlX21hc2spOwogCiAJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQgfCBUUEFDUElfREJHX0hLRVksCiAJCQkibGVnYWN5IGlibS9ob3RrZXkgZXZlbnQgcmVwb3J0aW5nIG92ZXIgcHJvY2ZzICVzXG4iLApAQCAtMzI0NSw3ICszNDQ4LDcgQEAKIAlpZiAoc2NhbmNvZGUgPiAwICYmIHNjYW5jb2RlIDwgMHgyMSkgewogCQlzY2FuY29kZS0tOwogCQlpZiAoIShob3RrZXlfc291cmNlX21hc2sgJiAoMSA8PCBzY2FuY29kZSkpKSB7Ci0JCQl0cGFjcGlfaW5wdXRfc2VuZF9rZXkoc2NhbmNvZGUpOworCQkJdHBhY3BpX2lucHV0X3NlbmRfa2V5X21hc2tlZChzY2FuY29kZSk7CiAJCQkqc2VuZF9hY3BpX2V2ID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQkqaWdub3JlX2FjcGlfZXYgPSB0cnVlOwpAQCAtMzI2NCwyMCArMzQ2NywyMCBAQAogCSppZ25vcmVfYWNwaV9ldiA9IGZhbHNlOwogCiAJc3dpdGNoIChoa2V5KSB7Ci0JY2FzZSAweDIzMDQ6IC8qIHN1c3BlbmQsIHVuZG9jayAqLwotCWNhc2UgMHgyNDA0OiAvKiBoaWJlcm5hdGlvbiwgdW5kb2NrICovCisJY2FzZSBUUF9IS0VZX0VWX1dLVVBfUzNfVU5ET0NLOiAvKiBzdXNwZW5kLCB1bmRvY2sgKi8KKwljYXNlIFRQX0hLRVlfRVZfV0tVUF9TNF9VTkRPQ0s6IC8qIGhpYmVybmF0aW9uLCB1bmRvY2sgKi8KIAkJaG90a2V5X3dha2V1cF9yZWFzb24gPSBUUF9BQ1BJX1dBS0VVUF9VTkRPQ0s7CiAJCSppZ25vcmVfYWNwaV9ldiA9IHRydWU7CiAJCWJyZWFrOwogCi0JY2FzZSAweDIzMDU6IC8qIHN1c3BlbmQsIGJheSBlamVjdCAqLwotCWNhc2UgMHgyNDA1OiAvKiBoaWJlcm5hdGlvbiwgYmF5IGVqZWN0ICovCisJY2FzZSBUUF9IS0VZX0VWX1dLVVBfUzNfQkFZRUo6IC8qIHN1c3BlbmQsIGJheSBlamVjdCAqLworCWNhc2UgVFBfSEtFWV9FVl9XS1VQX1M0X0JBWUVKOiAvKiBoaWJlcm5hdGlvbiwgYmF5IGVqZWN0ICovCiAJCWhvdGtleV93YWtldXBfcmVhc29uID0gVFBfQUNQSV9XQUtFVVBfQkFZRUo7CiAJCSppZ25vcmVfYWNwaV9ldiA9IHRydWU7CiAJCWJyZWFrOwogCi0JY2FzZSAweDIzMTM6IC8qIEJhdHRlcnkgb24gY3JpdGljYWwgbG93IGxldmVsIChTMykgKi8KLQljYXNlIDB4MjQxMzogLyogQmF0dGVyeSBvbiBjcml0aWNhbCBsb3cgbGV2ZWwgKFM0KSAqLworCWNhc2UgVFBfSEtFWV9FVl9XS1VQX1MzX0JBVExPVzogLyogQmF0dGVyeSBvbiBjcml0aWNhbCBsb3cgbGV2ZWwvUzMgKi8KKwljYXNlIFRQX0hLRVlfRVZfV0tVUF9TNF9CQVRMT1c6IC8qIEJhdHRlcnkgb24gY3JpdGljYWwgbG93IGxldmVsL1M0ICovCiAJCXByaW50ayhUUEFDUElfQUxFUlQKIAkJCSJFTUVSR0VOQ1kgV0FLRVVQOiBiYXR0ZXJ5IGFsbW9zdCBlbXB0eVxuIik7CiAJCS8qIGhvdyB0byBhdXRvLWhlYWw6ICovCkBAIC0zMzA3LDIxICszNTEwLDIxIEBACiAJKmlnbm9yZV9hY3BpX2V2ID0gZmFsc2U7CiAKIAlzd2l0Y2ggKGhrZXkpIHsKLQljYXNlIDB4NTAxMDogLyogTGVub3ZvIG5ldyBCSU9TOiBicmlnaHRuZXNzIGNoYW5nZWQgKi8KLQljYXNlIDB4NTAwYjogLyogWDYxdDogdGFibGV0IHBlbiBpbnNlcnRlZCBpbnRvIGJheSAqLwotCWNhc2UgMHg1MDBjOiAvKiBYNjF0OiB0YWJsZXQgcGVuIHJlbW92ZWQgZnJvbSBiYXkgKi8KKwljYXNlIFRQX0hLRVlfRVZfUEVOX0lOU0VSVEVEOiAgLyogWDYxdDogdGFibGV0IHBlbiBpbnNlcnRlZCBpbnRvIGJheSAqLworCWNhc2UgVFBfSEtFWV9FVl9QRU5fUkVNT1ZFRDogICAvKiBYNjF0OiB0YWJsZXQgcGVuIHJlbW92ZWQgZnJvbSBiYXkgKi8KIAkJcmV0dXJuIHRydWU7CiAKLQljYXNlIDB4NTAwOTogLyogWDQxdC1YNjF0OiBzd2l2ZWwgdXAgKHRhYmxldCBtb2RlKSAqLwotCWNhc2UgMHg1MDBhOiAvKiBYNDF0LVg2MXQ6IHN3aXZlbCBkb3duIChub3JtYWwgbW9kZSkgKi8KKwljYXNlIFRQX0hLRVlfRVZfVEFCTEVUX1RBQkxFVDogICAvKiBYNDF0LVg2MXQ6IHRhYmxldCBtb2RlICovCisJY2FzZSBUUF9IS0VZX0VWX1RBQkxFVF9OT1RFQk9PSzogLyogWDQxdC1YNjF0OiBub3JtYWwgbW9kZSAqLwogCQl0cGFjcGlfaW5wdXRfc2VuZF90YWJsZXRzdygpOwogCQlob3RrZXlfdGFibGV0X21vZGVfbm90aWZ5X2NoYW5nZSgpOwogCQkqc2VuZF9hY3BpX2V2ID0gZmFsc2U7CiAJCXJldHVybiB0cnVlOwogCi0JY2FzZSAweDUwMDE6Ci0JY2FzZSAweDUwMDI6Ci0JCS8qIExJRCBzd2l0Y2ggZXZlbnRzLiAgRG8gbm90IHByb3BhZ2F0ZSAqLworCWNhc2UgVFBfSEtFWV9FVl9MSURfQ0xPU0U6CS8qIExpZCBjbG9zZWQgKi8KKwljYXNlIFRQX0hLRVlfRVZfTElEX09QRU46CS8qIExpZCBvcGVuZWQgKi8KKwljYXNlIFRQX0hLRVlfRVZfQlJHSFRfQ0hBTkdFRDoJLyogYnJpZ2h0bmVzcyBjaGFuZ2VkICovCisJCS8qIGRvIG5vdCBwcm9wYWdhdGUgdGhlc2UgZXZlbnRzICovCiAJCSppZ25vcmVfYWNwaV9ldiA9IHRydWU7CiAJCXJldHVybiB0cnVlOwogCkBAIC0zMzM5LDMwICszNTQyLDMwIEBACiAJKmlnbm9yZV9hY3BpX2V2ID0gZmFsc2U7CiAKIAlzd2l0Y2ggKGhrZXkpIHsKLQljYXNlIDB4NjAxMToKKwljYXNlIFRQX0hLRVlfRVZfQUxBUk1fQkFUX0hPVDoKIAkJcHJpbnRrKFRQQUNQSV9DUklUCiAJCQkiVEhFUk1BTCBBTEFSTTogYmF0dGVyeSBpcyB0b28gaG90IVxuIik7CiAJCS8qIHJlY29tbWVuZGVkIGFjdGlvbjogd2FybiB1c2VyIHRocm91Z2ggZ3VpICovCiAJCXJldHVybiB0cnVlOwotCWNhc2UgMHg2MDEyOgorCWNhc2UgVFBfSEtFWV9FVl9BTEFSTV9CQVRfWEhPVDoKIAkJcHJpbnRrKFRQQUNQSV9BTEVSVAogCQkJIlRIRVJNQUwgRU1FUkdFTkNZOiBiYXR0ZXJ5IGlzIGV4dHJlbWVseSBob3QhXG4iKTsKIAkJLyogcmVjb21tZW5kZWQgYWN0aW9uOiBpbW1lZGlhdGUgc2xlZXAvaGliZXJuYXRlICovCiAJCXJldHVybiB0cnVlOwotCWNhc2UgMHg2MDIxOgorCWNhc2UgVFBfSEtFWV9FVl9BTEFSTV9TRU5TT1JfSE9UOgogCQlwcmludGsoVFBBQ1BJX0NSSVQKIAkJCSJUSEVSTUFMIEFMQVJNOiAiCiAJCQkiYSBzZW5zb3IgcmVwb3J0cyBzb21ldGhpbmcgaXMgdG9vIGhvdCFcbiIpOwogCQkvKiByZWNvbW1lbmRlZCBhY3Rpb246IHdhcm4gdXNlciB0aHJvdWdoIGd1aSwgdGhhdCAqLwogCQkvKiBzb21lIGludGVybmFsIGNvbXBvbmVudCBpcyB0b28gaG90ICovCiAJCXJldHVybiB0cnVlOwotCWNhc2UgMHg2MDIyOgorCWNhc2UgVFBfSEtFWV9FVl9BTEFSTV9TRU5TT1JfWEhPVDoKIAkJcHJpbnRrKFRQQUNQSV9BTEVSVAogCQkJIlRIRVJNQUwgRU1FUkdFTkNZOiAiCiAJCQkiYSBzZW5zb3IgcmVwb3J0cyBzb21ldGhpbmcgaXMgZXh0cmVtZWx5IGhvdCFcbiIpOwogCQkvKiByZWNvbW1lbmRlZCBhY3Rpb246IGltbWVkaWF0ZSBzbGVlcC9oaWJlcm5hdGUgKi8KIAkJcmV0dXJuIHRydWU7Ci0JY2FzZSAweDYwMzA6CisJY2FzZSBUUF9IS0VZX0VWX1RITV9UQUJMRV9DSEFOR0VEOgogCQlwcmludGsoVFBBQ1BJX0lORk8KIAkJCSJFQyByZXBvcnRzIHRoYXQgVGhlcm1hbCBUYWJsZSBoYXMgY2hhbmdlZFxuIik7CiAJCS8qIHJlY29tbWVuZGVkIGFjdGlvbjogZG8gbm90aGluZywgd2UgZG9uJ3QgaGF2ZQpAQCAtMzQyMCw3ICszNjIzLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIDM6CiAJCQkvKiAweDMwMDAtMHgzRkZGOiBiYXktcmVsYXRlZCB3YWtldXBzICovCi0JCQlpZiAoaGtleSA9PSAweDMwMDMpIHsKKwkJCWlmIChoa2V5ID09IFRQX0hLRVlfRVZfQkFZRUpfQUNLKSB7CiAJCQkJaG90a2V5X2F1dG9zbGVlcF9hY2sgPSAxOwogCQkJCXByaW50ayhUUEFDUElfSU5GTwogCQkJCSAgICAgICAiYmF5IGVqZWN0ZWRcbiIpOwpAQCAtMzQzMiw3ICszNjM1LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIDQ6CiAJCQkvKiAweDQwMDAtMHg0RkZGOiBkb2NrLXJlbGF0ZWQgd2FrZXVwcyAqLwotCQkJaWYgKGhrZXkgPT0gMHg0MDAzKSB7CisJCQlpZiAoaGtleSA9PSBUUF9IS0VZX0VWX1VORE9DS19BQ0spIHsKIAkJCQlob3RrZXlfYXV0b3NsZWVwX2FjayA9IDE7CiAJCQkJcHJpbnRrKFRQQUNQSV9JTkZPCiAJCQkJICAgICAgICJ1bmRvY2tlZFxuIik7CkBAIC0zNDU0LDcgKzM2NTcsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgNzoKIAkJCS8qIDB4NzAwMC0weDdGRkY6IG1pc2MgKi8KLQkJCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyAmJiBoa2V5ID09IDB4NzAwMCkgeworCQkJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ICYmCisJCQkJCWhrZXkgPT0gVFBfSEtFWV9FVl9SRktJTExfQ0hBTkdFRCkgewogCQkJCXRwYWNwaV9zZW5kX3JhZGlvc3dfdXBkYXRlKCk7CiAJCQkJc2VuZF9hY3BpX2V2ID0gMDsKIAkJCQlrbm93bl9ldiA9IHRydWU7CkBAIC0zNTAwLDEwICszNzA0LDEyIEBACiB7CiAJdHBhY3BpX2Rpc2FibGVfYnJpZ2h0bmVzc19kZWxheSgpOwogCi0JaWYgKGhvdGtleV9tYXNrX2dldCgpKQorCWlmIChob3RrZXlfc3RhdHVzX3NldCh0cnVlKSA8IDAgfHwKKwkgICAgaG90a2V5X21hc2tfc2V0KGhvdGtleV9hY3BpX21hc2spIDwgMCkKIAkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJICAgICAgICJlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCBob3Qga2V5IG1hc2sgIgotCQkgICAgICAgImZyb20gZmlybXdhcmVcbiIpOworCQkgICAgICAgImVycm9yIHdoaWxlIGF0dGVtcHRpbmcgdG8gcmVzZXQgdGhlIGV2ZW50ICIKKwkJICAgICAgICJmaXJtd2FyZSBpbnRlcmZhY2VcbiIpOworCiAJdHBhY3BpX3NlbmRfcmFkaW9zd191cGRhdGUoKTsKIAlob3RrZXlfdGFibGV0X21vZGVfbm90aWZ5X2NoYW5nZSgpOwogCWhvdGtleV93YWtldXBfcmVhc29uX25vdGlmeV9jaGFuZ2UoKTsKQEAgLTM1MzIsOCArMzczOCw4IEBACiAJCXJldHVybiByZXM7CiAKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDApKTsKLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5X21hc2spIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIm1hc2s6XHRcdDB4JTA4eFxuIiwgaG90a2V5X21hc2spOworCWlmIChob3RrZXlfYWxsX21hc2spIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIm1hc2s6XHRcdDB4JTA4eFxuIiwgaG90a2V5X3VzZXJfbWFzayk7CiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sCiAJCQkgICAgICAgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlLCByZXNldCwgPG1hc2s+XG4iKTsKIAl9IGVsc2UgewpAQCAtMzU3MCw3ICszNzc2LDcgQEAKIAlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmaG90a2V5X211dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCW1hc2sgPSBob3RrZXlfbWFzazsKKwltYXNrID0gaG90a2V5X3VzZXJfbWFzazsKIAogCXJlcyA9IDA7CiAJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKQEAgLTM1OTIsMTIgKzM3OTgsMTEgQEAKIAkJfQogCX0KIAotCWlmICghcmVzKQorCWlmICghcmVzKSB7CiAJCXRwYWNwaV9kaXNjbG9zZV91c2VydGFzaygicHJvY2ZzIGhvdGtleSIsCiAJCQkic2V0IG1hc2sgdG8gMHglMDh4XG4iLCBtYXNrKTsKLQotCWlmICghcmVzICYmIG1hc2sgIT0gaG90a2V5X21hc2spCi0JCXJlcyA9IGhvdGtleV9tYXNrX3NldChtYXNrKTsKKwkJcmVzID0gaG90a2V5X3VzZXJfbWFza19zZXQobWFzayk7CisJfQogCiBlcnJleGl0OgogCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKQEAgLTYwMTAsOCArNjIxNSwxMCBAQAogCQkJCQlUUEFDUElfQkFDS0xJR0hUX0RFVl9OQU1FLCBOVUxMLCBOVUxMLAogCQkJCQkmaWJtX2JhY2tsaWdodF9kYXRhKTsKIAlpZiAoSVNfRVJSKGlibV9iYWNrbGlnaHRfZGV2aWNlKSkgeworCQlpbnQgcmMgPSBQVFJfRVJSKGlibV9iYWNrbGlnaHRfZGV2aWNlKTsKKwkJaWJtX2JhY2tsaWdodF9kZXZpY2UgPSBOVUxMOwogCQlwcmludGsoVFBBQ1BJX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIGJhY2tsaWdodCBkZXZpY2VcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihpYm1fYmFja2xpZ2h0X2RldmljZSk7CisJCXJldHVybiByYzsKIAl9CiAJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklUIHwgVFBBQ1BJX0RCR19CUkdIVCwKIAkJCSJicmlnaHRuZXNzIGlzIHN1cHBvcnRlZFxuIik7CkBAIC03NDk5LDYgKzc3MDYsMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyoKKyAqIEhLRVkgZXZlbnQgY2FsbG91dCBmb3Igb3RoZXIgc3ViZHJpdmVycyBnbyBoZXJlCisgKiAoeWVzLCBpdCBpcyB1Z2x5LCBidXQgaXQgaXMgcXVpY2ssIHNhZmUsIGFuZCBnZXRzIHRoZSBqb2IgZG9uZQorICovCitzdGF0aWMgdm9pZCB0cGFjcGlfZHJpdmVyX2V2ZW50KGNvbnN0IHVuc2lnbmVkIGludCBoa2V5X2V2ZW50KQoreworfQorCisKKworc3RhdGljIHZvaWQgaG90a2V5X2RyaXZlcl9ldmVudChjb25zdCB1bnNpZ25lZCBpbnQgc2NhbmNvZGUpCit7CisJdHBhY3BpX2RyaXZlcl9ldmVudChUUF9IS0VZX0VWX0hPVEtFWV9CQVNFICsgc2NhbmNvZGUpOworfQorCiAvKiBzeXNmcyBuYW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBzc2l6ZV90IHRoaW5rcGFkX2FjcGlfcGRldl9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCmluZGV4IGMwN2ZkYjkuLjgzYjhiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCkBAIC0xNTMsNiArMTUzLDcgQEAKIAlhY3BpX2hhbmRsZSB0ZW1wID0gTlVMTDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IHBucF9kZXYgKmRldjsKKwlzdHJ1Y3QgYWNwaV9oYXJkd2FyZV9pZCAqaWQ7CiAKIAkvKgogCSAqIElmIGEgUG5QYWNwaSBkZXZpY2UgaXMgbm90IHByZXNlbnQgLCB0aGUgZGV2aWNlCkBAIC0xOTMsMTUgKzE5NCwxMiBAQAogCWlmIChkZXYtPmNhcGFiaWxpdGllcyAmIFBOUF9DT05GSUdVUkFCTEUpCiAJCXBucGFjcGlfcGFyc2VfcmVzb3VyY2Vfb3B0aW9uX2RhdGEoZGV2KTsKIAotCWlmIChkZXZpY2UtPmZsYWdzLmNvbXBhdGlibGVfaWRzKSB7Ci0JCXN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkX2xpc3QgKmNpZF9saXN0ID0gZGV2aWNlLT5wbnAuY2lkX2xpc3Q7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjaWRfbGlzdC0+Y291bnQ7IGkrKykgewotCQkJaWYgKCFpc3BucGlkYWNwaShjaWRfbGlzdC0+aWRzW2ldLnN0cmluZykpCi0JCQkJY29udGludWU7Ci0JCQlwbnBfYWRkX2lkKGRldiwgY2lkX2xpc3QtPmlkc1tpXS5zdHJpbmcpOwotCQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpZCwgJmRldmljZS0+cG5wLmlkcywgbGlzdCkgeworCQlpZiAoIXN0cmNtcChpZC0+aWQsIGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWlzcG5waWRhY3BpKGlkLT5pZCkpCisJCQljb250aW51ZTsKKwkJcG5wX2FkZF9pZChkZXYsIGlkLT5pZCk7CiAJfQogCiAJLyogY2xlYXIgb3V0IHRoZSBkYW1hZ2VkIGZsYWdzICovCkBAIC0yMzIsOSArMjMwLDggQEAKIAlzdHJ1Y3QgcG5wX2RldiAqcG5wID0gX3BucDsKIAogCS8qIHRydWUgbWVhbnMgaXQgbWF0Y2hlZCAqLwotCXJldHVybiBhY3BpLT5mbGFncy5oYXJkd2FyZV9pZAotCSAgICAmJiAhYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGFjcGktPmhhbmRsZSkKLQkgICAgJiYgY29tcGFyZV9wbnBfaWQocG5wLT5pZCwgYWNwaS0+cG5wLmhhcmR3YXJlX2lkKTsKKwlyZXR1cm4gIWFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShhY3BpLT5oYW5kbGUpCisJICAgICYmIGNvbXBhcmVfcG5wX2lkKHBucC0+aWQsIGFjcGlfZGV2aWNlX2hpZChhY3BpKSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfcG5wX2ZpbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgYWNwaV9oYW5kbGUgKiBoYW5kbGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL0tjb25maWcgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKaW5kZXggYmRiYzRmNy4uY2VhNmNlZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKQEAgLTI5LDYgKzI5LDEzIEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IEFQTSBzdGF0dXMgZW11bGF0aW9uIHVzaW5nCiAJICBiYXR0ZXJ5IGNsYXNzIGRldmljZXMuCiAKK2NvbmZpZyBXTTgzMVhfUE9XRVIKKwl0cmlzdGF0ZSAiV004MzFYIFBNVSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUZEX1dNODMxWAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBwb3dlciBtYW5hZ2VtZW50IHVuaXQKKwkgIHByb3ZpZGVkIGJ5IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTgzMXggUE1JQ3MuCisKIGNvbmZpZyBXTTgzNTBfUE9XRVIKICAgICAgICAgdHJpc3RhdGUgIldNODM1MCBQTVUgc3VwcG9ydCIKICAgICAgICAgZGVwZW5kcyBvbiBNRkRfV004MzUwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQppbmRleCAzODBkMTdjLi5iOTZmMjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDcgQEAKIAogb2JqLSQoQ09ORklHX1BEQV9QT1dFUikJCSs9IHBkYV9wb3dlci5vCiBvYmotJChDT05GSUdfQVBNX1BPV0VSKQkJKz0gYXBtX3Bvd2VyLm8KK29iai0kKENPTkZJR19XTTgzMVhfUE9XRVIpCSs9IHdtODMxeF9wb3dlci5vCiBvYmotJChDT05GSUdfV004MzUwX1BPV0VSKQkrPSB3bTgzNTBfcG93ZXIubwogCiBvYmotJChDT05GSUdfQkFUVEVSWV9EUzI3NjApCSs9IGRzMjc2MF9iYXR0ZXJ5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYwppbmRleCA1MjBiNWM0Li42ZjFkYmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jCkBAIC01Niw2ICs1Niw3IEBACiAJc3RydWN0IGRldmljZSAqdzFfZGV2OwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptb25pdG9yX3dxdWV1ZTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIG1vbml0b3Jfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHNldF9jaGFyZ2VkX3dvcms7CiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGNhY2hlX3RpbWUgPSAxMDAwOwpAQCAtNjYsNiArNjcsMTQgQEAKIG1vZHVsZV9wYXJhbShwbW9kX2VuYWJsZWQsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwbW9kX2VuYWJsZWQsICJQTU9EIGVuYWJsZSBiaXQiKTsKIAorc3RhdGljIHVuc2lnbmVkIGludCByYXRlZF9jYXBhY2l0eTsKK21vZHVsZV9wYXJhbShyYXRlZF9jYXBhY2l0eSwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJhdGVkX2NhcGFjaXR5LCAicmF0ZWQgYmF0dGVyeSBjYXBhY2l0eSwgMTAqbUFoIG9yIGluZGV4Iik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3VycmVudF9hY2N1bTsKK21vZHVsZV9wYXJhbShjdXJyZW50X2FjY3VtLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY3VycmVudF9hY2N1bSwgImN1cnJlbnQgYWNjdW11bGF0b3IgdmFsdWUiKTsKKwogLyogU29tZSBiYXR0ZXJpZXMgaGF2ZSB0aGVpciByYXRlZCBjYXBhY2l0eSBzdG9yZWQgYSBOICogMTAgbUFoLCB3aGlsZQogICogb3RoZXJzIHVzZSBhbiBpbmRleCBpbnRvIHRoaXMgdGFibGUuICovCiBzdGF0aWMgaW50IHJhdGVkX2NhcGFjaXRpZXNbXSA9IHsKQEAgLTE2OCw4ICsxNzcsMTMgQEAKIAlkaS0+ZnVsbF9hY3RpdmVfdUFoID0gZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTExdIDw8IDggfAogCQkJICAgICAgZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTEwgKyAxXTsKIAotCXNjYWxlWzBdID0gZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTExdIDw8IDggfAotCQkgICBkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTCArIDFdOworCS8qIElmIHRoZSBmdWxsX2FjdGl2ZV91QWggdmFsdWUgaXMgbm90IGdpdmVuLCBmYWxsIGJhY2sgdG8gdGhlIHJhdGVkCisJICogY2FwYWNpdHkuIFRoaXMgaXMgbGlrZWx5IHRvIGhhcHBlbiB3aGVuIGNoaXBzIGFyZSBub3QgcGFydCBvZiB0aGUKKwkgKiBiYXR0ZXJ5IHBhY2sgYW5kIGlzIHRoZXJlZm9yZSBub3QgYm9vdHN0cmFwcGVkLiAqLworCWlmIChkaS0+ZnVsbF9hY3RpdmVfdUFoID09IDApCisJCWRpLT5mdWxsX2FjdGl2ZV91QWggPSBkaS0+cmF0ZWRfY2FwYWNpdHkgLyAxMDAwTDsKKworCXNjYWxlWzBdID0gZGktPmZ1bGxfYWN0aXZlX3VBaDsKIAlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQogCQlzY2FsZVtpXSA9IHNjYWxlW2kgLSAxXSArIGRpLT5yYXdbRFMyNzYwX0FDVElWRV9GVUxMICsgMiArIGldOwogCkBAIC0xOTcsMTUgKzIxMSwzMSBAQAogCWlmIChkaS0+cmVtX2NhcGFjaXR5ID4gMTAwKQogCQlkaS0+cmVtX2NhcGFjaXR5ID0gMTAwOwogCi0JaWYgKGRpLT5jdXJyZW50X3VBKQotCQlkaS0+bGlmZV9zZWMgPSAtKChkaS0+YWNjdW1fY3VycmVudF91QWggLSBkaS0+ZW1wdHlfdUFoKSAqCi0JCQkJIDM2MDBMKSAvIGRpLT5jdXJyZW50X3VBOworCWlmIChkaS0+Y3VycmVudF91QSA+PSAxMDBMKQorCQlkaS0+bGlmZV9zZWMgPSAtKChkaS0+YWNjdW1fY3VycmVudF91QWggLSBkaS0+ZW1wdHlfdUFoKSAqIDM2TCkKKwkJCQkJLyAoZGktPmN1cnJlbnRfdUEgLyAxMDBMKTsKIAllbHNlCiAJCWRpLT5saWZlX3NlYyA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfc2V0X2N1cnJlbnRfYWNjdW0oc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGksCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFjcl92YWwpCit7CisJdW5zaWduZWQgY2hhciBhY3JbMl07CisKKwkvKiBhY3IgaXMgaW4gdW5pdHMgb2YgMC4yNSBtQWggKi8KKwlhY3JfdmFsICo9IDRMOworCWFjcl92YWwgLz0gMTAwMDsKKworCWFjclswXSA9IGFjcl92YWwgPj4gODsKKwlhY3JbMV0gPSBhY3JfdmFsICYgMHhmZjsKKworCWlmICh3MV9kczI3NjBfd3JpdGUoZGktPncxX2RldiwgYWNyLCBEUzI3NjBfQ1VSUkVOVF9BQ0NVTV9NU0IsIDIpIDwgMikKKwkJZGV2X3dhcm4oZGktPmRldiwgIkFDUiB3cml0ZSBmYWlsZWRcbiIpOworfQorCiBzdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV91cGRhdGVfc3RhdHVzKHN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpKQogewogCWludCBvbGRfY2hhcmdlX3N0YXR1cyA9IGRpLT5jaGFyZ2Vfc3RhdHVzOwpAQCAtMjM3LDIxICsyNjcsOSBAQAogCQkJaWYgKGRpLT5mdWxsX2NvdW50ZXIgPCAyKSB7CiAJCQkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwogCQkJfSBlbHNlIHsKLQkJCQl1bnNpZ25lZCBjaGFyIGFjclsyXTsKLQkJCQlpbnQgYWNyX3ZhbDsKLQotCQkJCS8qIGFjciBpcyBpbiB1bml0cyBvZiAwLjI1IG1BaCAqLwotCQkJCWFjcl92YWwgPSBkaS0+ZnVsbF9hY3RpdmVfdUFoICogNEwgLyAxMDAwOwotCi0JCQkJYWNyWzBdID0gYWNyX3ZhbCA+PiA4OwotCQkJCWFjclsxXSA9IGFjcl92YWwgJiAweGZmOwotCi0JCQkJaWYgKHcxX2RzMjc2MF93cml0ZShkaS0+dzFfZGV2LCBhY3IsCi0JCQkJICAgIERTMjc2MF9DVVJSRU5UX0FDQ1VNX01TQiwgMikgPCAyKQotCQkJCQlkZXZfd2FybihkaS0+ZGV2LAotCQkJCQkJICJBQ1IgcmVzZXQgZmFpbGVkXG4iKTsKLQogCQkJCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQkJCWRzMjc2MF9iYXR0ZXJ5X3NldF9jdXJyZW50X2FjY3VtKGRpLAorCQkJCQkJZGktPmZ1bGxfYWN0aXZlX3VBaCk7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewpAQCAtMjc0LDYgKzI5MiwxNyBAQAogCXcxX2RzMjc2MF9yZWNhbGxfZWVwcm9tKGRpLT53MV9kZXYsIERTMjc2MF9FRVBST01fQkxPQ0sxKTsKIH0KIAorc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfd3JpdGVfcmF0ZWRfY2FwYWNpdHkoc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGksCisJCQkJCQl1bnNpZ25lZCBjaGFyIHJhdGVkX2NhcGFjaXR5KQoreworCWlmIChyYXRlZF9jYXBhY2l0eSA9PSBkaS0+cmF3W0RTMjc2MF9SQVRFRF9DQVBBQ0lUWV0pCisJCXJldHVybjsKKworCXcxX2RzMjc2MF93cml0ZShkaS0+dzFfZGV2LCAmcmF0ZWRfY2FwYWNpdHksIERTMjc2MF9SQVRFRF9DQVBBQ0lUWSwgMSk7CisJdzFfZHMyNzYwX3N0b3JlX2VlcHJvbShkaS0+dzFfZGV2LCBEUzI3NjBfRUVQUk9NX0JMT0NLMSk7CisJdzFfZHMyNzYwX3JlY2FsbF9lZXByb20oZGktPncxX2RldiwgRFMyNzYwX0VFUFJPTV9CTE9DSzEpOworfQorCiBzdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLApAQCAtMjk5LDYgKzMyOCw1MiBAQAogCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+bW9uaXRvcl93cXVldWUsICZkaS0+bW9uaXRvcl93b3JrLCBIWi8xMCk7CiB9CiAKKworc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfc2V0X2NoYXJnZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJY2hhciBiaWFzOworCXN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8sIHNldF9jaGFyZ2VkX3dvcmsud29yayk7CisKKwlkZXZfZGJnKGRpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJZHMyNzYwX2JhdHRlcnlfcmVhZF9zdGF0dXMoZGkpOworCisJLyogV2hlbiB3ZSBnZXQgbm90aWZpZWQgYnkgZXh0ZXJuYWwgY2lyY3VpdHJ5IHRoYXQgdGhlIGJhdHRlcnkgaXMKKwkgKiBjb25zaWRlcmVkIGZ1bGx5IGNoYXJnZWQgbm93LCB3ZSBrbm93IHRoYXQgdGhlcmUgaXMgbm8gY3VycmVudAorCSAqIGZsb3cgYW55IG1vcmUuIEhvd2V2ZXIsIHRoZSBkczI3NjAncyBpbnRlcm5hbCBjdXJyZW50IG1ldGVyIGlzCisJICogdG9vIGluYWNjdXJhdGUgdG8gcmVseSBvbiAtIHNwZWMgc2F5IHNvbWV0aGluZyB+MTUlIGZhaWx1cmUuCisJICogSGVuY2UsIHdlIHVzZSB0aGUgY3VycmVudCBvZmZzZXQgYmlhcyByZWdpc3RlciB0byBjb21wZW5zYXRlCisJICogdGhhdCBlcnJvci4KKwkgKi8KKworCWlmICghcG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQoJmRpLT5iYXQpKQorCQlyZXR1cm47CisKKwliaWFzID0gKHNpZ25lZCBjaGFyKSBkaS0+Y3VycmVudF9yYXcgKworCQkoc2lnbmVkIGNoYXIpIGRpLT5yYXdbRFMyNzYwX0NVUlJFTlRfT0ZGU0VUX0JJQVNdOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiJXM6IGJpYXMgPSAlZFxuIiwgX19mdW5jX18sIGJpYXMpOworCisJdzFfZHMyNzYwX3dyaXRlKGRpLT53MV9kZXYsICZiaWFzLCBEUzI3NjBfQ1VSUkVOVF9PRkZTRVRfQklBUywgMSk7CisJdzFfZHMyNzYwX3N0b3JlX2VlcHJvbShkaS0+dzFfZGV2LCBEUzI3NjBfRUVQUk9NX0JMT0NLMSk7CisJdzFfZHMyNzYwX3JlY2FsbF9lZXByb20oZGktPncxX2RldiwgRFMyNzYwX0VFUFJPTV9CTE9DSzEpOworCisJLyogV3JpdGUgdG8gdGhlIGRpLT5yYXdbXSBidWZmZXIgZGlyZWN0bHkgLSB0aGUgQ1VSUkVOVF9PRkZTRVRfQklBUworCSAqIHZhbHVlIHdvbid0IGJlIHJlYWQgYmFjayBieSBkczI3NjBfYmF0dGVyeV9yZWFkX3N0YXR1cygpICovCisJZGktPnJhd1tEUzI3NjBfQ1VSUkVOVF9PRkZTRVRfQklBU10gPSBiaWFzOworfQorCitzdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV9zZXRfY2hhcmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSB0b19kczI3NjBfZGV2aWNlX2luZm8ocHN5KTsKKworCS8qIHBvc3Rwb25lIHRoZSBhY3R1YWwgd29yayBieSAyMCBzZWNzLiBUaGlzIGlzIGZvciBkZWJvdW5jaW5nIEdQSU8KKwkgKiBzaWduYWxzIGFuZCB0byBsZXQgdGhlIGN1cnJlbnQgdmFsdWUgc2V0dGxlLiBTZWUgQU40MTg4LiAqLworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpLT5zZXRfY2hhcmdlZF93b3JrKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPm1vbml0b3Jfd3F1ZXVlLCAmZGktPnNldF9jaGFyZ2VkX3dvcmssIEhaICogMjApOworfQorCiBzdGF0aWMgaW50IGRzMjc2MF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCiAJCQkJICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKQEAgLTMzNyw2ICs0MTIsMTIgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CiAJCXZhbC0+aW50dmFsID0gZGktPnRlbXBfQzsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBkaS0+bGlmZV9zZWM7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXZhbC0+aW50dmFsID0gZGktPnJlbV9jYXBhY2l0eTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzUzLDYgKzQzNCw4IEBACiAJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0VNUFRZLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCiAJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKIH07CiAKIHN0YXRpYyBpbnQgZHMyNzYwX2JhdHRlcnlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM3NiwxNyArNDU5LDEyIEBACiAJZGktPmJhdC5wcm9wZXJ0aWVzCT0gZHMyNzYwX2JhdHRlcnlfcHJvcHM7CiAJZGktPmJhdC5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoZHMyNzYwX2JhdHRlcnlfcHJvcHMpOwogCWRpLT5iYXQuZ2V0X3Byb3BlcnR5CT0gZHMyNzYwX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCWRpLT5iYXQuc2V0X2NoYXJnZWQJPSBkczI3NjBfYmF0dGVyeV9zZXRfY2hhcmdlZDsKIAlkaS0+YmF0LmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPQogCQkJCSAgZHMyNzYwX2JhdHRlcnlfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZDsKIAogCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwogCi0JcmV0dmFsID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkaS0+YmF0KTsKLQlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKLQkJZ290byBiYXR0X2ZhaWxlZDsKLQl9Ci0KIAkvKiBlbmFibGUgc2xlZXAgbW9kZSBmZWF0dXJlICovCiAJZHMyNzYwX2JhdHRlcnlfcmVhZF9zdGF0dXMoZGkpOwogCXN0YXR1cyA9IGRpLT5yYXdbRFMyNzYwX1NUQVRVU19SRUddOwpAQCAtMzk3LDcgKzQ3NSwyNCBAQAogCiAJZHMyNzYwX2JhdHRlcnlfd3JpdGVfc3RhdHVzKGRpLCBzdGF0dXMpOwogCisJLyogc2V0IHJhdGVkIGNhcGFjaXR5IGZyb20gbW9kdWxlIHBhcmFtICovCisJaWYgKHJhdGVkX2NhcGFjaXR5KQorCQlkczI3NjBfYmF0dGVyeV93cml0ZV9yYXRlZF9jYXBhY2l0eShkaSwgcmF0ZWRfY2FwYWNpdHkpOworCisJLyogc2V0IGN1cnJlbnQgYWNjdW11bGF0b3IgaWYgZ2l2ZW4gYXMgcGFyYW1ldGVyLgorCSAqIHRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBmb3IgYm9vdHN0cmFwcGluZyB0aGUgdmFsdWUgKi8KKwlpZiAoY3VycmVudF9hY2N1bSkKKwkJZHMyNzYwX2JhdHRlcnlfc2V0X2N1cnJlbnRfYWNjdW0oZGksIGN1cnJlbnRfYWNjdW0pOworCisJcmV0dmFsID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkaS0+YmF0KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKKwkJZ290byBiYXR0X2ZhaWxlZDsKKwl9CisKIAlJTklUX0RFTEFZRURfV09SSygmZGktPm1vbml0b3Jfd29yaywgZHMyNzYwX2JhdHRlcnlfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmRpLT5zZXRfY2hhcmdlZF93b3JrLAorCQkJICBkczI3NjBfYmF0dGVyeV9zZXRfY2hhcmdlZF93b3JrKTsKIAlkaS0+bW9uaXRvcl93cXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CiAJaWYgKCFkaS0+bW9uaXRvcl93cXVldWUpIHsKIAkJcmV0dmFsID0gLUVTUkNIOwpAQCAtNDIyLDYgKzUxNyw4IEBACiAKIAljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrcXVldWUoZGktPm1vbml0b3Jfd3F1ZXVlLAogCQkJCQkgICZkaS0+bW9uaXRvcl93b3JrKTsKKwljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrcXVldWUoZGktPm1vbml0b3Jfd3F1ZXVlLAorCQkJCQkgICZkaS0+c2V0X2NoYXJnZWRfd29yayk7CiAJZGVzdHJveV93b3JrcXVldWUoZGktPm1vbml0b3Jfd3F1ZXVlKTsKIAlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmZGktPmJhdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvb2xwY19iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL29scGNfYmF0dGVyeS5jCmluZGV4IDU4ZTQxOTIuLjhmZWZlNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvb2xwY19iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9vbHBjX2JhdHRlcnkuYwpAQCAtMTAsNyArMTAsOSBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CkBAIC0yMzEsNiArMjMzLDE0IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFOgorCQlpZiAoZWNfYnl0ZSAmIEJBVF9TVEFUX1RSSUNLTEUpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UUklDS0xFOworCQllbHNlIGlmIChlY19ieXRlICYgQkFUX1NUQVRfQ0hBUkdJTkcpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FOworCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CiAJCXZhbC0+aW50dmFsID0gISEoZWNfYnl0ZSAmIChCQVRfU1RBVF9QUkVTRU5UIHwKIAkJCQkJICAgIEJBVF9TVEFUX1RSSUNLTEUpKTsKQEAgLTI3Niw2ICsyODYsMTQgQEAKIAkJCXJldHVybiByZXQ7CiAJCXZhbC0+aW50dmFsID0gZWNfYnl0ZTsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTDoKKwkJaWYgKGVjX2J5dGUgJiBCQVRfU1RBVF9GVUxMKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfRlVMTDsKKwkJZWxzZSBpZiAoZWNfYnl0ZSAmIEJBVF9TVEFUX0xPVykKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0xPVzsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTk9STUFMOworCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CiAJCXJldCA9IG9scGNfZWNfY21kKEVDX0JBVF9URU1QLCBOVUxMLCAwLCAodm9pZCAqKSZlY193b3JkLCAyKTsKIAkJaWYgKHJldCkKQEAgLTMxNSwxMiArMzMzLDE0IEBACiAKIHN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBvbHBjX2JhdF9wcm9wc1tdID0gewogCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAogCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAogCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCiAJUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5ULAogCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKQEAgLTM3MCw2ICszOTAsMjkgQEAKIAkucmVhZCA9IG9scGNfYmF0X2VlcHJvbV9yZWFkLAogfTsKIAorLyogQWxsb3cgdXNlcnNwYWNlIHRvIHNlZSB0aGUgc3BlY2lmaWMgZXJyb3IgdmFsdWUgcHVsbGVkIGZyb20gdGhlIEVDICovCisKK3N0YXRpYyBzc2l6ZV90IG9scGNfYmF0X2Vycm9yX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVpbnQ4X3QgZWNfYnl0ZTsKKwlzc2l6ZV90IHJldDsKKworCXJldCA9IG9scGNfZWNfY21kKEVDX0JBVF9FUlJDT0RFLCBOVUxMLCAwLCAmZWNfYnl0ZSwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZWNfYnl0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBvbHBjX2JhdF9lcnJvciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAiZXJyb3IiLAorCQkubW9kZSA9IFNfSVJVR08sCisJfSwKKwkuc2hvdyA9IG9scGNfYmF0X2Vycm9yX3JlYWQsCit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJSW5pdGlhbGlzYXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MzMsOCArNDc2LDE0IEBACiAJaWYgKHJldCkKIAkJZ290byBlZXByb21fZmFpbGVkOwogCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKG9scGNfYmF0LmRldiwgJm9scGNfYmF0X2Vycm9yKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZhaWxlZDsKKwogCWdvdG8gc3VjY2VzczsKIAorZXJyb3JfZmFpbGVkOgorCWRldmljZV9yZW1vdmVfYmluX2ZpbGUob2xwY19iYXQuZGV2LCAmb2xwY19iYXRfZWVwcm9tKTsKIGVlcHJvbV9mYWlsZWQ6CiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm9scGNfYmF0KTsKIGJhdHRlcnlfZmFpbGVkOgpAQCAtNDQ3LDYgKzQ5Niw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBvbHBjX2JhdF9leGl0KHZvaWQpCiB7CisJZGV2aWNlX3JlbW92ZV9maWxlKG9scGNfYmF0LmRldiwgJm9scGNfYmF0X2Vycm9yKTsKIAlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKG9scGNfYmF0LmRldiwgJm9scGNfYmF0X2VlcHJvbSk7CiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm9scGNfYmF0KTsKIAlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmb2xwY19hYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9jb3JlLmMgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9jb3JlLmMKaW5kZXggNTUyMDA0MC4uY2NlNzViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfY29yZS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X2NvcmUuYwpAQCAtMTgsNyArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogI2luY2x1ZGUgInBvd2VyX3N1cHBseS5oIgogCisvKiBleHBvcnRlZCBmb3IgdGhlIEFQTSBQb3dlciBkcml2ZXIsIEFQTSBlbXVsYXRpb24gKi8KIHN0cnVjdCBjbGFzcyAqcG93ZXJfc3VwcGx5X2NsYXNzOworRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X2NsYXNzKTsKIAogc3RhdGljIGludCBfX3Bvd2VyX3N1cHBseV9jaGFuZ2VkX3dvcmsoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewpAQCAtNTUsNiArNTcsNyBAQAogCiAJc2NoZWR1bGVfd29yaygmcHN5LT5jaGFuZ2VkX3dvcmspOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X2NoYW5nZWQpOwogCiBzdGF0aWMgaW50IF9fcG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewpAQCAtODYsNiArODksNyBAQAogCiAJcmV0dXJuIGVycm9yOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQpOwogCiBzdGF0aWMgaW50IF9fcG93ZXJfc3VwcGx5X2lzX3N5c3RlbV9zdXBwbGllZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CkBAIC0xMTAsNiArMTE0LDM1IEBACiAKIAlyZXR1cm4gZXJyb3I7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwb3dlcl9zdXBwbHlfaXNfc3lzdGVtX3N1cHBsaWVkKTsKKworaW50IHBvd2VyX3N1cHBseV9zZXRfYmF0dGVyeV9jaGFyZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKK3sKKwlpZiAocHN5LT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlkgJiYgcHN5LT5zZXRfY2hhcmdlZCkgeworCQlwc3ktPnNldF9jaGFyZ2VkKHBzeSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X3NldF9iYXR0ZXJ5X2NoYXJnZWQpOworCitzdGF0aWMgaW50IHBvd2VyX3N1cHBseV9tYXRjaF9kZXZpY2VfYnlfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRhdGE7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3RyY21wKHBzeS0+bmFtZSwgbmFtZSkgPT0gMDsKK30KKworc3RydWN0IHBvd2VyX3N1cHBseSAqcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY2xhc3NfZmluZF9kZXZpY2UocG93ZXJfc3VwcGx5X2NsYXNzLCBOVUxMLCBuYW1lLAorCQkJCQlwb3dlcl9zdXBwbHlfbWF0Y2hfZGV2aWNlX2J5X25hbWUpOworCisJcmV0dXJuIGRldiA/IGRldl9nZXRfZHJ2ZGF0YShkZXYpIDogTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBvd2VyX3N1cHBseV9nZXRfYnlfbmFtZSk7CiAKIGludCBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7CkBAIC0xNDQsNiArMTc3LDcgQEAKIHN1Y2Nlc3M6CiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X3JlZ2lzdGVyKTsKIAogdm9pZCBwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7CkBAIC0xNTIsNiArMTg2LDcgQEAKIAlwb3dlcl9zdXBwbHlfcmVtb3ZlX2F0dHJzKHBzeSk7CiAJZGV2aWNlX3VucmVnaXN0ZXIocHN5LT5kZXYpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIpOwogCiBzdGF0aWMgaW50IF9faW5pdCBwb3dlcl9zdXBwbHlfY2xhc3NfaW5pdCh2b2lkKQogewpAQCAtMTcwLDE1ICsyMDUsNiBAQAogCWNsYXNzX2Rlc3Ryb3kocG93ZXJfc3VwcGx5X2NsYXNzKTsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X2NoYW5nZWQpOwotRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQpOwotRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X2lzX3N5c3RlbV9zdXBwbGllZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChwb3dlcl9zdXBwbHlfcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIpOwotCi0vKiBleHBvcnRlZCBmb3IgdGhlIEFQTSBQb3dlciBkcml2ZXIsIEFQTSBlbXVsYXRpb24gKi8KLUVYUE9SVF9TWU1CT0xfR1BMKHBvd2VyX3N1cHBseV9jbGFzcyk7Ci0KIHN1YnN5c19pbml0Y2FsbChwb3dlcl9zdXBwbHlfY2xhc3NfaW5pdCk7CiBtb2R1bGVfZXhpdChwb3dlcl9zdXBwbHlfY2xhc3NfZXhpdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCmluZGV4IGRhNzM1OTEuLjA4MTQ0MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYwpAQCAtNDMsNiArNDMsOSBAQAogCXN0YXRpYyBjaGFyICpzdGF0dXNfdGV4dFtdID0gewogCQkiVW5rbm93biIsICJDaGFyZ2luZyIsICJEaXNjaGFyZ2luZyIsICJOb3QgY2hhcmdpbmciLCAiRnVsbCIKIAl9OworCXN0YXRpYyBjaGFyICpjaGFyZ2VfdHlwZVtdID0geworCQkiVW5rbm93biIsICJOL0EiLCAiVHJpY2tsZSIsICJGYXN0IgorCX07CiAJc3RhdGljIGNoYXIgKmhlYWx0aF90ZXh0W10gPSB7CiAJCSJVbmtub3duIiwgIkdvb2QiLCAiT3ZlcmhlYXQiLCAiRGVhZCIsICJPdmVyIHZvbHRhZ2UiLAogCQkiVW5zcGVjaWZpZWQgZmFpbHVyZSIsICJDb2xkIiwKQEAgLTUxLDYgKzU0LDkgQEAKIAkJIlVua25vd24iLCAiTmlNSCIsICJMaS1pb24iLCAiTGktcG9seSIsICJMaUZlIiwgIk5pQ2QiLAogCQkiTGlNbiIKIAl9OworCXN0YXRpYyBjaGFyICpjYXBhY2l0eV9sZXZlbF90ZXh0W10gPSB7CisJCSJVbmtub3duIiwgIkNyaXRpY2FsIiwgIkxvdyIsICJOb3JtYWwiLCAiSGlnaCIsICJGdWxsIgorCX07CiAJc3NpemVfdCByZXQ7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJY29uc3QgcHRyZGlmZl90IG9mZiA9IGF0dHIgLSBwb3dlcl9zdXBwbHlfYXR0cnM7CkBAIC02NywxMCArNzMsMTQgQEAKIAogCWlmIChvZmYgPT0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3RhdHVzX3RleHRbdmFsdWUuaW50dmFsXSk7CisJZWxzZSBpZiAob2ZmID09IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hhcmdlX3R5cGVbdmFsdWUuaW50dmFsXSk7CiAJZWxzZSBpZiAob2ZmID09IFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGhlYWx0aF90ZXh0W3ZhbHVlLmludHZhbF0pOwogCWVsc2UgaWYgKG9mZiA9PSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgdGVjaG5vbG9neV90ZXh0W3ZhbHVlLmludHZhbF0pOworCWVsc2UgaWYgKG9mZiA9PSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNhcGFjaXR5X2xldmVsX3RleHRbdmFsdWUuaW50dmFsXSk7CiAJZWxzZSBpZiAob2ZmID49IFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB2YWx1ZS5zdHJ2YWwpOwogCkBAIC04MSw2ICs5MSw3IEBACiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcG93ZXJfc3VwcGx5X2F0dHJzW10gPSB7CiAJLyogUHJvcGVydGllcyBvZiB0eXBlIGBpbnQnICovCiAJUE9XRVJfU1VQUExZX0FUVFIoc3RhdHVzKSwKKwlQT1dFUl9TVVBQTFlfQVRUUihjaGFyZ2VfdHlwZSksCiAJUE9XRVJfU1VQUExZX0FUVFIoaGVhbHRoKSwKIAlQT1dFUl9TVVBQTFlfQVRUUihwcmVzZW50KSwKIAlQT1dFUl9TVVBQTFlfQVRUUihvbmxpbmUpLApAQCAtMTA5LDYgKzEyMCw3IEBACiAJUE9XRVJfU1VQUExZX0FUVFIoZW5lcmd5X25vdyksCiAJUE9XRVJfU1VQUExZX0FUVFIoZW5lcmd5X2F2ZyksCiAJUE9XRVJfU1VQUExZX0FUVFIoY2FwYWNpdHkpLAorCVBPV0VSX1NVUFBMWV9BVFRSKGNhcGFjaXR5X2xldmVsKSwKIAlQT1dFUl9TVVBQTFlfQVRUUih0ZW1wKSwKIAlQT1dFUl9TVVBQTFlfQVRUUih0ZW1wX2FtYmllbnQpLAogCVBPV0VSX1NVUFBMWV9BVFRSKHRpbWVfdG9fZW1wdHlfbm93KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd204MzF4X3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGM4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jCkBAIC0wLDAgKzEsNzc5IEBACisvKgorICogUE1VIGRyaXZlciBmb3IgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHdtODMxeCBQTUlDcworICoKKyAqIENvcHlyaWdodCAyMDA5IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2F1eGFkYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvcG11Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9wZGF0YS5oPgorCitzdHJ1Y3Qgd204MzF4X3Bvd2VyIHsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXg7CisJc3RydWN0IHBvd2VyX3N1cHBseSB3YWxsOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmFja3VwOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgdXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKK307CisKK3N0YXRpYyBpbnQgd204MzF4X3Bvd2VyX2NoZWNrX29ubGluZShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGludCBzdXBwbHksCisJCQkJICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfU1lTVEVNX1NUQVRVUyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocmV0ICYgc3VwcGx5KQorCQl2YWwtPmludHZhbCA9IDE7CisJZWxzZQorCQl2YWwtPmludHZhbCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzMXhfcG93ZXJfcmVhZF92b2x0YWdlKHN0cnVjdCB3bTgzMXggKndtODMxeCwKKwkJCQkgICAgIGVudW0gd204MzF4X2F1eGFkYyBzcmMsCisJCQkJICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSB3bTgzMXhfYXV4YWRjX3JlYWRfdXYod204MzF4LCBzcmMpOworCWlmIChyZXQgPj0gMCkKKwkJdmFsLT5pbnR2YWwgPSByZXQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJV0FMTCBQb3dlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd204MzF4X3dhbGxfZ2V0X3Byb3Aoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCB3bTgzMXhfcG93ZXIgKndtODMxeF9wb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfcG93ZXItPndtODMxeDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXJldCA9IHdtODMxeF9wb3dlcl9jaGVja19vbmxpbmUod204MzF4LCBXTTgzMVhfUFdSX1dBTEwsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXJldCA9IHdtODMxeF9wb3dlcl9yZWFkX3ZvbHRhZ2Uod204MzF4LCBXTTgzMVhfQVVYX1dBTEwsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSB3bTgzMXhfd2FsbF9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlVU0IgUG93ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdtODMxeF91c2JfZ2V0X3Byb3Aoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCB3bTgzMXhfcG93ZXIgKndtODMxeF9wb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfcG93ZXItPndtODMxeDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXJldCA9IHdtODMxeF9wb3dlcl9jaGVja19vbmxpbmUod204MzF4LCBXTTgzMVhfUFdSX1VTQiwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJcmV0ID0gd204MzF4X3Bvd2VyX3JlYWRfdm9sdGFnZSh3bTgzMXgsIFdNODMxWF9BVVhfVVNCLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgd204MzF4X3VzYl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlCYXR0ZXJ5IHByb3BlcnRpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBjaGdfbWFwIHsKKwlpbnQgdmFsOworCWludCByZWdfdmFsOworfTsKKworc3RhdGljIHN0cnVjdCBjaGdfbWFwIHRyaWNrbGVfaWxpbXNbXSA9IHsKKwl7ICA1MCwgMCA8PCBXTTgzMVhfQ0hHX1RSS0xfSUxJTV9TSElGVCB9LAorCXsgMTAwLCAxIDw8IFdNODMxWF9DSEdfVFJLTF9JTElNX1NISUZUIH0sCisJeyAxNTAsIDIgPDwgV004MzFYX0NIR19UUktMX0lMSU1fU0hJRlQgfSwKKwl7IDIwMCwgMyA8PCBXTTgzMVhfQ0hHX1RSS0xfSUxJTV9TSElGVCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaGdfbWFwIHZzZWxzW10gPSB7CisJeyA0MDUwLCAwIDw8IFdNODMxWF9DSEdfVlNFTF9TSElGVCB9LAorCXsgNDEwMCwgMSA8PCBXTTgzMVhfQ0hHX1ZTRUxfU0hJRlQgfSwKKwl7IDQxNTAsIDIgPDwgV004MzFYX0NIR19WU0VMX1NISUZUIH0sCisJeyA0MjAwLCAzIDw8IFdNODMxWF9DSEdfVlNFTF9TSElGVCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaGdfbWFwIGZhc3RfaWxpbXNbXSA9IHsKKwl7ICAgIDAsICAwIDw8IFdNODMxWF9DSEdfRkFTVF9JTElNX1NISUZUIH0sCisJeyAgIDUwLCAgMSA8PCBXTTgzMVhfQ0hHX0ZBU1RfSUxJTV9TSElGVCB9LAorCXsgIDEwMCwgIDIgPDwgV004MzFYX0NIR19GQVNUX0lMSU1fU0hJRlQgfSwKKwl7ICAxNTAsICAzIDw8IFdNODMxWF9DSEdfRkFTVF9JTElNX1NISUZUIH0sCisJeyAgMjAwLCAgNCA8PCBXTTgzMVhfQ0hHX0ZBU1RfSUxJTV9TSElGVCB9LAorCXsgIDI1MCwgIDUgPDwgV004MzFYX0NIR19GQVNUX0lMSU1fU0hJRlQgfSwKKwl7ICAzMDAsICA2IDw8IFdNODMxWF9DSEdfRkFTVF9JTElNX1NISUZUIH0sCisJeyAgMzUwLCAgNyA8PCBXTTgzMVhfQ0hHX0ZBU1RfSUxJTV9TSElGVCB9LAorCXsgIDQwMCwgIDggPDwgV004MzFYX0NIR19GQVNUX0lMSU1fU0hJRlQgfSwKKwl7ICA0NTAsICA5IDw8IFdNODMxWF9DSEdfRkFTVF9JTElNX1NISUZUIH0sCisJeyAgNTAwLCAxMCA8PCBXTTgzMVhfQ0hHX0ZBU1RfSUxJTV9TSElGVCB9LAorCXsgIDYwMCwgMTEgPDwgV004MzFYX0NIR19GQVNUX0lMSU1fU0hJRlQgfSwKKwl7ICA3MDAsIDEyIDw8IFdNODMxWF9DSEdfRkFTVF9JTElNX1NISUZUIH0sCisJeyAgODAwLCAxMyA8PCBXTTgzMVhfQ0hHX0ZBU1RfSUxJTV9TSElGVCB9LAorCXsgIDkwMCwgMTQgPDwgV004MzFYX0NIR19GQVNUX0lMSU1fU0hJRlQgfSwKKwl7IDEwMDAsIDE1IDw8IFdNODMxWF9DSEdfRkFTVF9JTElNX1NISUZUIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNoZ19tYXAgZW9jX2l0ZXJtc1tdID0geworCXsgMjAsIDAgPDwgV004MzFYX0NIR19JVEVSTV9TSElGVCB9LAorCXsgMzAsIDEgPDwgV004MzFYX0NIR19JVEVSTV9TSElGVCB9LAorCXsgNDAsIDIgPDwgV004MzFYX0NIR19JVEVSTV9TSElGVCB9LAorCXsgNTAsIDMgPDwgV004MzFYX0NIR19JVEVSTV9TSElGVCB9LAorCXsgNjAsIDQgPDwgV004MzFYX0NIR19JVEVSTV9TSElGVCB9LAorCXsgNzAsIDUgPDwgV004MzFYX0NIR19JVEVSTV9TSElGVCB9LAorCXsgODAsIDYgPDwgV004MzFYX0NIR19JVEVSTV9TSElGVCB9LAorCXsgOTAsIDcgPDwgV004MzFYX0NIR19JVEVSTV9TSElGVCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaGdfbWFwIGNoZ190aW1lc1tdID0geworCXsgIDYwLCAgMCA8PCBXTTgzMVhfQ0hHX1RJTUVfU0hJRlQgfSwKKwl7ICA5MCwgIDEgPDwgV004MzFYX0NIR19USU1FX1NISUZUIH0sCisJeyAxMjAsICAyIDw8IFdNODMxWF9DSEdfVElNRV9TSElGVCB9LAorCXsgMTUwLCAgMyA8PCBXTTgzMVhfQ0hHX1RJTUVfU0hJRlQgfSwKKwl7IDE4MCwgIDQgPDwgV004MzFYX0NIR19USU1FX1NISUZUIH0sCisJeyAyMTAsICA1IDw8IFdNODMxWF9DSEdfVElNRV9TSElGVCB9LAorCXsgMjQwLCAgNiA8PCBXTTgzMVhfQ0hHX1RJTUVfU0hJRlQgfSwKKwl7IDI3MCwgIDcgPDwgV004MzFYX0NIR19USU1FX1NISUZUIH0sCisJeyAzMDAsICA4IDw8IFdNODMxWF9DSEdfVElNRV9TSElGVCB9LAorCXsgMzMwLCAgOSA8PCBXTTgzMVhfQ0hHX1RJTUVfU0hJRlQgfSwKKwl7IDM2MCwgMTAgPDwgV004MzFYX0NIR19USU1FX1NISUZUIH0sCisJeyAzOTAsIDExIDw8IFdNODMxWF9DSEdfVElNRV9TSElGVCB9LAorCXsgNDIwLCAxMiA8PCBXTTgzMVhfQ0hHX1RJTUVfU0hJRlQgfSwKKwl7IDQ1MCwgMTMgPDwgV004MzFYX0NIR19USU1FX1NISUZUIH0sCisJeyA0ODAsIDE0IDw8IFdNODMxWF9DSEdfVElNRV9TSElGVCB9LAorCXsgNTEwLCAxNSA8PCBXTTgzMVhfQ0hHX1RJTUVfU0hJRlQgfSwKK307CisKK3N0YXRpYyB2b2lkIHdtODMxeF9iYXR0ZXlfYXBwbHlfY29uZmlnKHN0cnVjdCB3bTgzMXggKndtODMxeCwKKwkJCQkgICAgICAgc3RydWN0IGNoZ19tYXAgKm1hcCwgaW50IGNvdW50LCBpbnQgdmFsLAorCQkJCSAgICAgICBpbnQgKnJlZywgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJaWYgKHZhbCA9PSBtYXBbaV0udmFsKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gY291bnQpIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkludmFsaWQgJXMgJWQlc1xuIiwKKwkJCW5hbWUsIHZhbCwgdW5pdHMpOworCX0gZWxzZSB7CisJCSpyZWcgfD0gbWFwW2ldLnJlZ192YWw7CisJCWRldl9kYmcod204MzF4LT5kZXYsICJTZXQgJXMgb2YgJWQlc1xuIiwgbmFtZSwgdmFsLCB1bml0cyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3bTgzMXhfY29uZmlnX2JhdHRlcnkoc3RydWN0IHdtODMxeCAqd204MzF4KQoreworCXN0cnVjdCB3bTgzMXhfcGRhdGEgKndtODMxeF9wZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTgzMXhfYmF0dGVyeV9wZGF0YSAqcGRhdGE7CisJaW50IHJldCwgcmVnMSwgcmVnMjsKKworCWlmICghd204MzF4X3BkYXRhIHx8ICF3bTgzMXhfcGRhdGEtPmJhdHRlcnkpIHsKKwkJZGV2X3dhcm4od204MzF4LT5kZXYsCisJCQkgIk5vIGJhdHRlcnkgY2hhcmdlciBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBkYXRhID0gd204MzF4X3BkYXRhLT5iYXR0ZXJ5OworCisJcmVnMSA9IDA7CisJcmVnMiA9IDA7CisKKwlpZiAoIXBkYXRhLT5lbmFibGUpIHsKKwkJZGV2X2luZm8od204MzF4LT5kZXYsICJCYXR0ZXJ5IGNoYXJnZXIgZGlzYWJsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJcmVnMSB8PSBXTTgzMVhfQ0hHX0VOQTsKKwlpZiAocGRhdGEtPm9mZl9tYXNrKQorCQlyZWcyIHw9IFdNODMxWF9DSEdfT0ZGX01TSzsKKwlpZiAocGRhdGEtPmZhc3RfZW5hYmxlKQorCQlyZWcxIHw9IFdNODMxWF9DSEdfRkFTVDsKKworCXdtODMxeF9iYXR0ZXlfYXBwbHlfY29uZmlnKHdtODMxeCwgdHJpY2tsZV9pbGltcywKKwkJCQkgICBBUlJBWV9TSVpFKHRyaWNrbGVfaWxpbXMpLAorCQkJCSAgIHBkYXRhLT50cmlja2xlX2lsaW0sICZyZWcyLAorCQkJCSAgICJ0cmlja2xlIGNoYXJnZSBjdXJyZW50IGxpbWl0IiwgIm1BIik7CisKKwl3bTgzMXhfYmF0dGV5X2FwcGx5X2NvbmZpZyh3bTgzMXgsIHZzZWxzLCBBUlJBWV9TSVpFKHZzZWxzKSwKKwkJCQkgICBwZGF0YS0+dnNlbCwgJnJlZzIsCisJCQkJICAgInRhcmdldCB2b2x0YWdlIiwgIm1WIik7CisKKwl3bTgzMXhfYmF0dGV5X2FwcGx5X2NvbmZpZyh3bTgzMXgsIGZhc3RfaWxpbXMsIEFSUkFZX1NJWkUoZmFzdF9pbGltcyksCisJCQkJICAgcGRhdGEtPmZhc3RfaWxpbSwgJnJlZzIsCisJCQkJICAgImZhc3QgY2hhcmdlIGN1cnJlbnQgbGltaXQiLCAibUEiKTsKKworCXdtODMxeF9iYXR0ZXlfYXBwbHlfY29uZmlnKHdtODMxeCwgZW9jX2l0ZXJtcywgQVJSQVlfU0laRShlb2NfaXRlcm1zKSwKKwkJCQkgICBwZGF0YS0+ZW9jX2l0ZXJtLCAmcmVnMSwKKwkJCQkgICAiZW5kIG9mIGNoYXJnZSBjdXJyZW50IHRocmVzaG9sZCIsICJtQSIpOworCisJd204MzF4X2JhdHRleV9hcHBseV9jb25maWcod204MzF4LCBjaGdfdGltZXMsIEFSUkFZX1NJWkUoY2hnX3RpbWVzKSwKKwkJCQkgICBwZGF0YS0+dGltZW91dCwgJnJlZzIsCisJCQkJICAgImNoYXJnZXIgdGltZW91dCIsICJtaW4iKTsKKworCXJldCA9IHdtODMxeF9yZWdfdW5sb2NrKHdtODMxeCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gdW5sb2NrIHJlZ2lzdGVyczogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQ0hBUkdFUl9DT05UUk9MXzEsCisJCQkgICAgICBXTTgzMVhfQ0hHX0VOQV9NQVNLIHwKKwkJCSAgICAgIFdNODMxWF9DSEdfRkFTVF9NQVNLIHwKKwkJCSAgICAgIFdNODMxWF9DSEdfSVRFUk1fTUFTSyB8CisJCQkgICAgICBXTTgzMVhfQ0hHX0lURVJNX01BU0ssCisJCQkgICAgICByZWcxKTsKKwlpZiAocmV0ICE9IDApCisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gc2V0IGNoYXJnZXIgY29udHJvbCAxOiAlZFxuIiwKKwkJCXJldCk7CisKKwlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQ0hBUkdFUl9DT05UUk9MXzIsCisJCQkgICAgICBXTTgzMVhfQ0hHX09GRl9NU0sgfAorCQkJICAgICAgV004MzFYX0NIR19USU1FX01BU0sgfAorCQkJICAgICAgV004MzFYX0NIR19GQVNUX0lMSU1fTUFTSyB8CisJCQkgICAgICBXTTgzMVhfQ0hHX1RSS0xfSUxJTV9NQVNLIHwKKwkJCSAgICAgIFdNODMxWF9DSEdfVlNFTF9NQVNLLAorCQkJICAgICAgcmVnMik7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjaGFyZ2VyIGNvbnRyb2wgMjogJWRcbiIsCisJCQlyZXQpOworCisJd204MzF4X3JlZ19sb2NrKHdtODMxeCk7Cit9CisKK3N0YXRpYyBpbnQgd204MzF4X2JhdF9jaGVja19zdGF0dXMoc3RydWN0IHdtODMxeCAqd204MzF4LCBpbnQgKnN0YXR1cykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX1NZU1RFTV9TVEFUVVMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJldCAmIFdNODMxWF9QV1JfU1JDX0JBVFQpIHsKKwkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9DSEFSR0VSX1NUQVRVUyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHJldCAmIFdNODMxWF9DSEdfU1RBVEVfTUFTSykgeworCWNhc2UgV004MzFYX0NIR19TVEFURV9PRkY6CisJCSpzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJYnJlYWs7CisJY2FzZSBXTTgzMVhfQ0hHX1NUQVRFX1RSSUNLTEU6CisJY2FzZSBXTTgzMVhfQ0hHX1NUQVRFX0ZBU1Q6CisJCSpzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCSpzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODMxeF9iYXRfY2hlY2tfdHlwZShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGludCAqdHlwZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX0NIQVJHRVJfU1RBVFVTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAocmV0ICYgV004MzFYX0NIR19TVEFURV9NQVNLKSB7CisJY2FzZSBXTTgzMVhfQ0hHX1NUQVRFX1RSSUNLTEU6CisJY2FzZSBXTTgzMVhfQ0hHX1NUQVRFX1RSSUNLTEVfT1Q6CisJCSp0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1RSSUNLTEU7CisJCWJyZWFrOworCWNhc2UgV004MzFYX0NIR19TVEFURV9GQVNUOgorCWNhc2UgV004MzFYX0NIR19TVEFURV9GQVNUX09UOgorCQkqdHlwZSA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqdHlwZSA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzMXhfYmF0X2NoZWNrX2hlYWx0aChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGludCAqaGVhbHRoKQoreworCWludCByZXQ7CisKKwlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfQ0hBUkdFUl9TVEFUVVMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJldCAmIFdNODMxWF9CQVRUX0hPVF9TVFMpIHsKKwkJKmhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXQgJiBXTTgzMVhfQkFUVF9DT0xEX1NUUykgeworCQkqaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9DT0xEOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmV0ICYgV004MzFYX0JBVFRfT1ZfU1RTKSB7CisJCSpoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHJldCAmIFdNODMxWF9DSEdfU1RBVEVfTUFTSykgeworCWNhc2UgV004MzFYX0NIR19TVEFURV9UUklDS0xFX09UOgorCWNhc2UgV004MzFYX0NIR19TVEFURV9GQVNUX09UOgorCQkqaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKKwkJYnJlYWs7CisJY2FzZSBXTTgzMVhfQ0hHX1NUQVRFX0RFRkVDVElWRToKKwkJKmhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODMxeF9iYXRfZ2V0X3Byb3Aoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCB3bTgzMXhfcG93ZXIgKndtODMxeF9wb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfcG93ZXItPndtODMxeDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXJldCA9IHdtODMxeF9iYXRfY2hlY2tfc3RhdHVzKHdtODMxeCwgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXJldCA9IHdtODMxeF9wb3dlcl9jaGVja19vbmxpbmUod204MzF4LCBXTTgzMVhfUFdSX1NSQ19CQVRULAorCQkJCQkJdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJcmV0ID0gd204MzF4X3Bvd2VyX3JlYWRfdm9sdGFnZSh3bTgzMXgsIFdNODMxWF9BVVhfQkFUVCwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisJCXJldCA9IHdtODMxeF9iYXRfY2hlY2tfaGVhbHRoKHdtODMxeCwgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRToKKwkJcmV0ID0gd204MzF4X2JhdF9jaGVja190eXBlKHdtODMxeCwgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHdtODMxeF9iYXRfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp3bTgzMXhfYmF0X2lycXNbXSA9IHsKKwkiQkFUVCBIT1QiLAorCSJCQVRUIENPTEQiLAorCSJCQVRUIEZBSUwiLAorCSJPViIsCisJIkVORCIsCisJIlRPIiwKKwkiTU9ERSIsCisJIlNUQVJUIiwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTgzMXhfYmF0X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3bTgzMXhfcG93ZXIgKndtODMxeF9wb3dlciA9IGRhdGE7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X3Bvd2VyLT53bTgzMXg7CisKKwlkZXZfZGJnKHdtODMxeC0+ZGV2LCAiQmF0dGVyeSBzdGF0dXMgY2hhbmdlZDogJWRcbiIsIGlycSk7CisKKwkvKiBUaGUgYmF0dGVyeSBjaGFyZ2VyIGlzIGF1dG9ub21vdXMgc28gd2UgZG9uJ3QgbmVlZCB0byBkbworCSAqIGFueXRoaW5nIGV4Y2VwdCBraWNrIHVzZXIgc3BhY2UgKi8KKwlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmd204MzF4X3Bvd2VyLT5iYXR0ZXJ5KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJQmFja3VwIHN1cHBseSBwcm9wZXJ0aWVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB3bTgzMXhfY29uZmlnX2JhY2t1cChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgpCit7CisJc3RydWN0IHdtODMxeF9wZGF0YSAqd204MzF4X3BkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtODMxeF9iYWNrdXBfcGRhdGEgKnBkYXRhOworCWludCByZXQsIHJlZzsKKworCWlmICghd204MzF4X3BkYXRhIHx8ICF3bTgzMXhfcGRhdGEtPmJhY2t1cCkgeworCQlkZXZfd2Fybih3bTgzMXgtPmRldiwKKwkJCSAiTm8gYmFja3VwIGJhdHRlcnkgY2hhcmdlciBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBkYXRhID0gd204MzF4X3BkYXRhLT5iYWNrdXA7CisKKwlyZWcgPSAwOworCisJaWYgKHBkYXRhLT5jaGFyZ2VyX2VuYWJsZSkKKwkJcmVnIHw9IFdNODMxWF9CS1VQX0NIR19FTkEgfCBXTTgzMVhfQktVUF9CQVRUX0RFVF9FTkE7CisJaWYgKHBkYXRhLT5ub19jb25zdGFudF92b2x0YWdlKQorCQlyZWcgfD0gV004MzFYX0JLVVBfQ0hHX01PREU7CisKKwlzd2l0Y2ggKHBkYXRhLT52bGltKSB7CisJY2FzZSAyNTAwOgorCQlicmVhazsKKwljYXNlIDMxMDA6CisJCXJlZyB8PSBXTTgzMVhfQktVUF9DSEdfVkxJTTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkludmFsaWQgYmFja3VwIHZvbHRhZ2UgbGltaXQgJWRtVlxuIiwKKwkJCXBkYXRhLT52bGltKTsKKwl9CisKKwlzd2l0Y2ggKHBkYXRhLT5pbGltKSB7CisJY2FzZSAxMDA6CisJCWJyZWFrOworCWNhc2UgMjAwOgorCQlyZWcgfD0gMTsKKwkJYnJlYWs7CisJY2FzZSAzMDA6CisJCXJlZyB8PSAyOworCQlicmVhazsKKwljYXNlIDQwMDoKKwkJcmVnIHw9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIod204MzF4LT5kZXYsICJJbnZhbGlkIGJhY2t1cCBjdXJyZW50IGxpbWl0ICVkdUFcbiIsCisJCQlwZGF0YS0+aWxpbSk7CisJfQorCisJcmV0ID0gd204MzF4X3JlZ191bmxvY2sod204MzF4KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byB1bmxvY2sgcmVnaXN0ZXJzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIFdNODMxWF9CQUNLVVBfQ0hBUkdFUl9DT05UUk9MLAorCQkJICAgICAgV004MzFYX0JLVVBfQ0hHX0VOQV9NQVNLIHwKKwkJCSAgICAgIFdNODMxWF9CS1VQX0NIR19NT0RFX01BU0sgfAorCQkJICAgICAgV004MzFYX0JLVVBfQkFUVF9ERVRfRU5BX01BU0sgfAorCQkJICAgICAgV004MzFYX0JLVVBfQ0hHX1ZMSU1fTUFTSyB8CisJCQkgICAgICBXTTgzMVhfQktVUF9DSEdfSUxJTV9NQVNLLAorCQkJICAgICAgcmVnKTsKKwlpZiAocmV0ICE9IDApCisJCWRldl9lcnIod204MzF4LT5kZXYsCisJCQkiRmFpbGVkIHRvIHNldCBiYWNrdXAgY2hhcmdlciBjb25maWc6ICVkXG4iLCByZXQpOworCisJd204MzF4X3JlZ19sb2NrKHdtODMxeCk7Cit9CisKK3N0YXRpYyBpbnQgd204MzF4X2JhY2t1cF9nZXRfcHJvcChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCB3bTgzMXhfcG93ZXIgKndtODMxeF9wb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfcG93ZXItPndtODMxeDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9CQUNLVVBfQ0hBUkdFUl9DT05UUk9MKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCWlmIChyZXQgJiBXTTgzMVhfQktVUF9DSEdfU1RTKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXJldCA9IHdtODMxeF9wb3dlcl9yZWFkX3ZvbHRhZ2Uod204MzF4LCBXTTgzMVhfQVVYX0JLVVBfQkFUVCwKKwkJCQkJCXZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQlpZiAocmV0ICYgV004MzFYX0JLVVBfQ0hHX1NUUykKKwkJCXZhbC0+aW50dmFsID0gMTsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSB3bTgzMXhfYmFja3VwX3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJSW5pdGlhbGlzYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTgzMXhfc3lzbG9faXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdtODMxeF9wb3dlciAqd204MzF4X3Bvd2VyID0gZGF0YTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfcG93ZXItPndtODMxeDsKKworCS8qIE5vdCBtdWNoIHdlIGNhbiBhY3R1YWxseSAqZG8qIGJ1dCB0ZWxsIHBlb3BsZSBmb3IKKwkgKiBwb3N0ZXJpdHksIHdlJ3JlIHByb2JhYmx5IGFib3V0IHRvIHJ1biBvdXQgb2YgcG93ZXIuICovCisJZGV2X2NyaXQod204MzF4LT5kZXYsICJTWVNWREQgdW5kZXIgdm9sdGFnZVxuIik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTgzMXhfcHdyX3NyY19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd204MzF4X3Bvd2VyICp3bTgzMXhfcG93ZXIgPSBkYXRhOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IHdtODMxeF9wb3dlci0+d204MzF4OworCisJZGV2X2RiZyh3bTgzMXgtPmRldiwgIlBvd2VyIHNvdXJjZSBjaGFuZ2VkXG4iKTsKKworCS8qIEp1c3Qgbm90aWZ5IGZvciBldmVyeXRoaW5nIC0gbGl0dGxlIGhhcm0gaW4gb3Zlcm5vdGlmeWluZy4KKwkgKiBUaGUgYmFja3VwIGJhdHRlcnkgaXMgbm90IGEgcG93ZXIgc291cmNlIHdoaWxlIHRoZSBzeXN0ZW0KKwkgKiBpcyBydW5uaW5nIHNvIHNraXAgdGhhdC4KKwkgKi8KKwlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmd204MzF4X3Bvd2VyLT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmd204MzF4X3Bvd2VyLT51c2IpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZ3bTgzMXhfcG93ZXItPndhbGwpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgX19kZXZpbml0IGludCB3bTgzMXhfcG93ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHdtODMxeF9wb3dlciAqcG93ZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqdXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqd2FsbDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYWNrdXA7CisJaW50IHJldCwgaXJxLCBpOworCisJcG93ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204MzF4X3Bvd2VyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBvd2VyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcG93ZXItPndtODMxeCA9IHdtODMxeDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwb3dlcik7CisKKwl1c2IgPSAmcG93ZXItPnVzYjsKKwliYXR0ZXJ5ID0gJnBvd2VyLT5iYXR0ZXJ5OworCXdhbGwgPSAmcG93ZXItPndhbGw7CisJYmFja3VwID0gJnBvd2VyLT5iYWNrdXA7CisKKwkvKiBXZSBpZ25vcmUgY29uZmlndXJhdGlvbiBmYWlsdXJlcyBzaW5jZSB3ZSBjYW4gc3RpbGwgcmVhZCBiYWNrCisJICogdGhlIHN0YXR1cyB3aXRob3V0IGVuYWJsaW5nIGVpdGhlciBvZiB0aGUgY2hhcmdlcnMuCisJICovCisJd204MzF4X2NvbmZpZ19iYXR0ZXJ5KHdtODMxeCk7CisJd204MzF4X2NvbmZpZ19iYWNrdXAod204MzF4KTsKKworCXdhbGwtPm5hbWUgPSAid204MzF4LXdhbGwiOworCXdhbGwtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKKwl3YWxsLT5wcm9wZXJ0aWVzID0gd204MzF4X3dhbGxfcHJvcHM7CisJd2FsbC0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODMxeF93YWxsX3Byb3BzKTsKKwl3YWxsLT5nZXRfcHJvcGVydHkgPSB3bTgzMXhfd2FsbF9nZXRfcHJvcDsKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgd2FsbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfa21hbGxvYzsKKworCWJhdHRlcnktPm5hbWUgPSAid204MzF4LWJhdHRlcnkiOworCWJhdHRlcnktPnByb3BlcnRpZXMgPSB3bTgzMXhfYmF0X3Byb3BzOworCWJhdHRlcnktPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3bTgzMXhfYmF0X3Byb3BzKTsKKwliYXR0ZXJ5LT5nZXRfcHJvcGVydHkgPSB3bTgzMXhfYmF0X2dldF9wcm9wOworCWJhdHRlcnktPnVzZV9mb3JfYXBtID0gMTsKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgYmF0dGVyeSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfd2FsbDsKKworCXVzYi0+bmFtZSA9ICJ3bTgzMXgtdXNiIiwKKwl1c2ItPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJdXNiLT5wcm9wZXJ0aWVzID0gd204MzF4X3VzYl9wcm9wczsKKwl1c2ItPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3bTgzMXhfdXNiX3Byb3BzKTsKKwl1c2ItPmdldF9wcm9wZXJ0eSA9IHdtODMxeF91c2JfZ2V0X3Byb3A7CisJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsIHVzYik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfYmF0dGVyeTsKKworCWJhY2t1cC0+bmFtZSA9ICJ3bTgzMXgtYmFja3VwIjsKKwliYWNrdXAtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWJhY2t1cC0+cHJvcGVydGllcyA9IHdtODMxeF9iYWNrdXBfcHJvcHM7CisJYmFja3VwLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X2JhY2t1cF9wcm9wcyk7CisJYmFja3VwLT5nZXRfcHJvcGVydHkgPSB3bTgzMXhfYmFja3VwX2dldF9wcm9wOworCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCBiYWNrdXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VzYjsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJTWVNMTyIpOworCXJldCA9IHdtODMxeF9yZXF1ZXN0X2lycSh3bTgzMXgsIGlycSwgd204MzF4X3N5c2xvX2lycSwKKwkJCQkgSVJRRl9UUklHR0VSX1JJU0lORywgIlNZU0xPIiwKKwkJCQkgcG93ZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBTWVNMTyBJUlEgJWQ6ICVkXG4iLAorCQkJaXJxLCByZXQpOworCQlnb3RvIGVycl9iYWNrdXA7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIlBXUiBTUkMiKTsKKwlyZXQgPSB3bTgzMXhfcmVxdWVzdF9pcnEod204MzF4LCBpcnEsIHdtODMxeF9wd3Jfc3JjX2lycSwKKwkJCQkgSVJRRl9UUklHR0VSX1JJU0lORywgIlBvd2VyIHNvdXJjZSIsCisJCQkJIHBvd2VyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgUFdSIFNSQyBJUlEgJWQ6ICVkXG4iLAorCQkJaXJxLCByZXQpOworCQlnb3RvIGVycl9zeXNsbzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXhfYmF0X2lycXMpOyBpKyspIHsKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgd204MzF4X2JhdF9pcnFzW2ldKTsKKwkJcmV0ID0gd204MzF4X3JlcXVlc3RfaXJxKHdtODMxeCwgaXJxLCB3bTgzMXhfYmF0X2lycSwKKwkJCQkJIElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJCSB3bTgzMXhfYmF0X2lycXNbaV0sCisJCQkJCSBwb3dlcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCAlcyBJUlEgJWQ6ICVkXG4iLAorCQkJCXdtODMxeF9iYXRfaXJxc1tpXSwgaXJxLCByZXQpOworCQkJZ290byBlcnJfYmF0X2lycTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7CisKK2Vycl9iYXRfaXJxOgorCWZvciAoOyBpID49IDA7IGktLSkgeworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCB3bTgzMXhfYmF0X2lycXNbaV0pOworCQl3bTgzMXhfZnJlZV9pcnEod204MzF4LCBpcnEsIHBvd2VyKTsKKwl9CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIlBXUiBTUkMiKTsKKwl3bTgzMXhfZnJlZV9pcnEod204MzF4LCBpcnEsIHBvd2VyKTsKK2Vycl9zeXNsbzoKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiU1lTTE8iKTsKKwl3bTgzMXhfZnJlZV9pcnEod204MzF4LCBpcnEsIHBvd2VyKTsKK2Vycl9iYWNrdXA6CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmFja3VwKTsKK2Vycl91c2I6CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIodXNiKTsKK2Vycl9iYXR0ZXJ5OgorCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJhdHRlcnkpOworZXJyX3dhbGw6CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIod2FsbCk7CitlcnJfa21hbGxvYzoKKwlrZnJlZShwb3dlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fZGV2ZXhpdCBpbnQgd204MzF4X3Bvd2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bTgzMXhfcG93ZXIgKndtODMxeF9wb3dlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IHdtODMxeF9wb3dlci0+d204MzF4OworCWludCBpcnEsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXhfYmF0X2lycXMpOyBpKyspIHsKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgd204MzF4X2JhdF9pcnFzW2ldKTsKKwkJd204MzF4X2ZyZWVfaXJxKHdtODMxeCwgaXJxLCB3bTgzMXhfcG93ZXIpOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJQV1IgU1JDIik7CisJd204MzF4X2ZyZWVfaXJxKHdtODMxeCwgaXJxLCB3bTgzMXhfcG93ZXIpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIlNZU0xPIik7CisJd204MzF4X2ZyZWVfaXJxKHdtODMxeCwgaXJxLCB3bTgzMXhfcG93ZXIpOworCisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJndtODMxeF9wb3dlci0+YmFja3VwKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmd204MzF4X3Bvd2VyLT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmd204MzF4X3Bvd2VyLT53YWxsKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmd204MzF4X3Bvd2VyLT51c2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3bTgzMXhfcG93ZXJfZHJpdmVyID0geworCS5wcm9iZSA9IHdtODMxeF9wb3dlcl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aod204MzF4X3Bvd2VyX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid204MzF4LXBvd2VyIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgd204MzF4X3Bvd2VyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ3bTgzMXhfcG93ZXJfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHdtODMxeF9wb3dlcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdtODMxeF9wb3dlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndtODMxeF9wb3dlcl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQod204MzF4X3Bvd2VyX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBvd2VyIHN1cHBseSBkcml2ZXIgZm9yIFdNODMxeCBQTUlDcyIpOworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODMxeC1wb3dlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci93bTgzNTBfcG93ZXIuYyBiL2RyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMKaW5kZXggMWIxNmJmMy4uMjhiMDI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci93bTgzNTBfcG93ZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3dtODM1MF9wb3dlci5jCkBAIC0zMjEsNiArMzIxLDI0IEBACiAJcmV0dXJuIFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKIH0KIAorc3RhdGljIGludCB3bTgzNTBfYmF0X2dldF9jaGFyZ2VfdHlwZShzdHJ1Y3Qgd204MzUwICp3bTgzNTApCit7CisJaW50IHN0YXRlOworCisJc3RhdGUgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfQkFUVEVSWV9DSEFSR0VSX0NPTlRST0xfMikgJgorCSAgICBXTTgzNTBfQ0hHX1NUU19NQVNLOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFdNODM1MF9DSEdfU1RTX09GRjoKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FOworCWNhc2UgV004MzUwX0NIR19TVFNfVFJJQ0tMRToKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UUklDS0xFOworCWNhc2UgV004MzUwX0NIR19TVFNfRkFTVDoKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUOworCWRlZmF1bHQ6CisJCXJldHVybiBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVU5LTk9XTjsKKwl9Cit9CisKIHN0YXRpYyBpbnQgd204MzUwX2JhdF9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAogCQkJCSAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQpAQCAtMzQyLDYgKzM2MCw5IEBACiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CiAJCXZhbC0+aW50dmFsID0gd204MzUwX2JhdF9jaGVja19oZWFsdGgod204MzUwKTsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRToKKwkJdmFsLT5pbnR2YWwgPSB3bTgzNTBfYmF0X2dldF9jaGFyZ2VfdHlwZSh3bTgzNTApOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKQEAgLTM1NSw2ICszNzYsNyBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKIAlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3dtOTd4eF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3dtOTd4eF9iYXR0ZXJ5LmMKaW5kZXggYjc4NzMzNS4uZjJiZmQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci93bTk3eHhfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvd205N3h4X2JhdHRlcnkuYwpAQCAtMjIsMTcgKzIyLDIwIEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvd205N3h4X2JhdHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogc3RhdGljIERFRklORV9NVVRFWChiYXRfbG9jayk7CiBzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGJhdF93b3JrOwogc3RydWN0IG11dGV4IHdvcmtfbG9jazsKIHN0YXRpYyBpbnQgYmF0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKLXN0YXRpYyBzdHJ1Y3Qgd205N3h4X2JhdHRfaW5mbyAqcGRhdGE7CitzdGF0aWMgc3RydWN0IHdtOTd4eF9iYXR0X2luZm8gKmdwZGF0YTsKIHN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSAqcHJvcDsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgd205N3h4X3JlYWRfYmF0KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKIHsKKwlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7CisKIAlyZXR1cm4gd205N3h4X3JlYWRfYXV4X2FkYyhkZXZfZ2V0X2RydmRhdGEoYmF0X3BzLT5kZXYtPnBhcmVudCksCiAJCQkJCXBkYXRhLT5iYXR0X2F1eCkgKiBwZGF0YS0+YmF0dF9tdWx0IC8KIAkJCQkJcGRhdGEtPmJhdHRfZGl2OwpAQCAtNDAsNiArNDMsOSBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB3bTk3eHhfcmVhZF90ZW1wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKIHsKKwlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7CisKIAlyZXR1cm4gd205N3h4X3JlYWRfYXV4X2FkYyhkZXZfZ2V0X2RydmRhdGEoYmF0X3BzLT5kZXYtPnBhcmVudCksCiAJCQkJCXBkYXRhLT50ZW1wX2F1eCkgKiBwZGF0YS0+dGVtcF9tdWx0IC8KIAkJCQkJcGRhdGEtPnRlbXBfZGl2OwpAQCAtNDksNiArNTUsOSBAQAogCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogeworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LT5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKKwogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CiAJCXZhbC0+aW50dmFsID0gYmF0X3N0YXR1czsKQEAgLTk3LDYgKzEwNiw4IEBACiBzdGF0aWMgdm9pZCB3bTk3eHhfYmF0X3VwZGF0ZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCiB7CiAJaW50IG9sZF9zdGF0dXMgPSBiYXRfc3RhdHVzOworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LT5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKIAogCW11dGV4X2xvY2soJndvcmtfbG9jayk7CiAKQEAgLTEyNywyMSArMTM4LDI5IEBACiAJd205N3h4X2JhdF91cGRhdGUoJmJhdF9wcyk7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTk3eHhfY2hyZ19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzY2hlZHVsZV93b3JrKCZiYXRfd29yayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHdtOTd4eF9iYXRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgd205N3h4X2JhdF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtOTd4eF9iYXRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgd205N3h4X2JhdF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXNjaGVkdWxlX3dvcmsoJmJhdF93b3JrKTsKIAlyZXR1cm4gMDsKIH0KLSNlbHNlCi0jZGVmaW5lIHdtOTd4eF9iYXRfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHdtOTd4eF9iYXRfcmVzdW1lIE5VTEwKKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHdtOTd4eF9iYXRfcG1fb3BzID0geworCS5zdXNwZW5kCT0gd205N3h4X2JhdF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gd205N3h4X2JhdF9yZXN1bWUsCit9OwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHdtOTd4eF9iYXRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpAQCAtMTQ5LDYgKzE2OCwxNSBAQAogCWludCByZXQgPSAwOwogCWludCBwcm9wcyA9IDE7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQgKi8KIAlpbnQgaSA9IDA7CisJc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhOworCisJaWYgKGdwZGF0YSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkRvIG5vdCBwYXNzIHBsYXRmb3JtX2RhdGEgdGhyb3VnaCAiCisJCQkid205N3h4X2JhdF9zZXRfcGRhdGEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlCisJCXBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOwogCiAJaWYgKGRldi0+aWQgIT0gLTEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTU2LDE3ICsxODQsMjIgQEAKIAltdXRleF9pbml0KCZ3b3JrX2xvY2spOwogCiAJaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIlBsZWFzZSB1c2Ugd205N3h4X2JhdF9zZXRfcGRhdGFcbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgIk5vIHBsYXRmb3JtX2RhdGEgc3VwcGxpZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAocGRhdGEtPmNoYXJnZV9ncGlvID49IDAgJiYgZ3Bpb19pc192YWxpZChwZGF0YS0+Y2hhcmdlX2dwaW8pKSB7CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmNoYXJnZV9ncGlvKSkgewogCQlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPmNoYXJnZV9ncGlvLCAiQkFUVCBDSFJHIik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycjsKIAkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQocGRhdGEtPmNoYXJnZV9ncGlvKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyMjsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEocGRhdGEtPmNoYXJnZV9ncGlvKSwKKwkJCQl3bTk3eHhfY2hyZ19pcnEsIElSUUZfRElTQUJMRUQsCisJCQkJIkFDIERldGVjdCIsIDApOworCQlpZiAocmV0KQorCQkJZ290byBlcnIyOwogCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMgKi8KIAl9CiAKQEAgLTE4Myw3ICsyMTYsNyBAQAogCiAJcHJvcCA9IGt6YWxsb2MocHJvcHMgKiBzaXplb2YoKnByb3ApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByb3ApCi0JCWdvdG8gZXJyMjsKKwkJZ290byBlcnIzOwogCiAJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDsKIAlpZiAocGRhdGEtPmNoYXJnZV9ncGlvID49IDApCkBAIC0yMTYsMjEgKzI0OSwzMCBAQAogCWlmICghcmV0KQogCQlzY2hlZHVsZV93b3JrKCZiYXRfd29yayk7CiAJZWxzZQotCQlnb3RvIGVycjM7CisJCWdvdG8gZXJyNDsKIAogCXJldHVybiAwOwotZXJyMzoKK2VycjQ6CiAJa2ZyZWUocHJvcCk7CitlcnIzOgorCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpCisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5jaGFyZ2VfZ3BpbyksIGRldik7CiBlcnIyOgotCWdwaW9fZnJlZShwZGF0YS0+Y2hhcmdlX2dwaW8pOworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpCisJCWdwaW9fZnJlZShwZGF0YS0+Y2hhcmdlX2dwaW8pOwogZXJyOgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IHdtOTd4eF9iYXRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQlpZiAocGRhdGEgJiYgcGRhdGEtPmNoYXJnZV9ncGlvICYmIHBkYXRhLT5jaGFyZ2VfZ3BpbyA+PSAwKQorCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKKworCWlmIChwZGF0YSAmJiBncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpIHsKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEocGRhdGEtPmNoYXJnZV9ncGlvKSwgZGV2KTsKIAkJZ3Bpb19mcmVlKHBkYXRhLT5jaGFyZ2VfZ3Bpbyk7CisJfQogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJhdF9wcyk7CiAJa2ZyZWUocHJvcCk7CkBAIC0yNDEsMTEgKzI4MywxMiBAQAogCS5kcml2ZXIJPSB7CiAJCS5uYW1lCT0gIndtOTd4eC1iYXR0ZXJ5IiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9ICZ3bTk3eHhfYmF0X3BtX29wcywKKyNlbmRpZgogCX0sCiAJLnByb2JlCQk9IHdtOTd4eF9iYXRfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTk3eHhfYmF0X3JlbW92ZSksCi0JLnN1c3BlbmQJPSB3bTk3eHhfYmF0X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSB3bTk3eHhfYmF0X3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHdtOTd4eF9iYXRfaW5pdCh2b2lkKQpAQCAtMjU4LDkgKzMwMSw5IEBACiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndtOTd4eF9iYXRfZHJpdmVyKTsKIH0KIAotdm9pZCBfX2luaXQgd205N3h4X2JhdF9zZXRfcGRhdGEoc3RydWN0IHdtOTd4eF9iYXR0X2luZm8gKmRhdGEpCit2b2lkIHdtOTd4eF9iYXRfc2V0X3BkYXRhKHN0cnVjdCB3bTk3eHhfYmF0dF9pbmZvICpkYXRhKQogewotCXBkYXRhID0gZGF0YTsKKwlncGRhdGEgPSBkYXRhOwogfQogRVhQT1JUX1NZTUJPTF9HUEwod205N3h4X2JhdF9zZXRfcGRhdGEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCmluZGV4IDRjZGIzMWEuLmEwYzgxNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCkBAIC0xMiw2ICsxMiw3IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKIGludCBydGNfcmVhZF90aW1lKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZSAqdG0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKaW5kZXggOGExMWRlOS4uNjIyMjdjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRldi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJydGMtY29yZS5oIgogCiBzdGF0aWMgZGV2X3QgcnRjX2RldnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcHhhLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcHhhLmMKaW5kZXggYmI4Y2MwNS4uNzQ3Y2ExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXB4YS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1weGEuYwpAQCAtNDM4LDM0ICs0MzgsMzcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBweGFfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBweGFfcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKIAkJZW5hYmxlX2lycV93YWtlKHB4YV9ydGMtPmlycV9BbHJtKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBweGFfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBweGFfcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQogCQlkaXNhYmxlX2lycV93YWtlKHB4YV9ydGMtPmlycV9BbHJtKTsKIAlyZXR1cm4gMDsKIH0KLSNlbHNlCi0jZGVmaW5lIHB4YV9ydGNfc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHB4YV9ydGNfcmVzdW1lCU5VTEwKKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHB4YV9ydGNfcG1fb3BzID0geworCS5zdXNwZW5kCT0gcHhhX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHhhX3J0Y19yZXN1bWUsCit9OwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB4YV9ydGNfZHJpdmVyID0gewogCS5yZW1vdmUJCT0gX19leGl0X3AocHhhX3J0Y19yZW1vdmUpLAotCS5zdXNwZW5kCT0gcHhhX3J0Y19zdXNwZW5kLAotCS5yZXN1bWUJCT0gcHhhX3J0Y19yZXN1bWUsCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCQk9ICJweGEtcnRjIiwKKwkJLm5hbWUJPSAicHhhLXJ0YyIsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9ICZweGFfcnRjX3BtX29wcywKKyNlbmRpZgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMKaW5kZXggMDIxYjI5Mi4uMjlmOThhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zYTExMDAuYwpAQCAtMzkzLDMxICszOTMsMzQgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzYTExMDBfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzYTExMDBfcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKIAkJZW5hYmxlX2lycV93YWtlKElSUV9SVENBbHJtKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYTExMDBfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBzYTExMDBfcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQogCQlkaXNhYmxlX2lycV93YWtlKElSUV9SVENBbHJtKTsKIAlyZXR1cm4gMDsKIH0KLSNlbHNlCi0jZGVmaW5lIHNhMTEwMF9ydGNfc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHNhMTEwMF9ydGNfcmVzdW1lCU5VTEwKKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHNhMTEwMF9ydGNfcG1fb3BzID0geworCS5zdXNwZW5kCT0gc2ExMTAwX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2ExMTAwX3J0Y19yZXN1bWUsCit9OwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNhMTEwMF9ydGNfZHJpdmVyID0gewogCS5wcm9iZQkJPSBzYTExMDBfcnRjX3Byb2JlLAogCS5yZW1vdmUJCT0gc2ExMTAwX3J0Y19yZW1vdmUsCi0JLnN1c3BlbmQJPSBzYTExMDBfcnRjX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzYTExMDBfcnRjX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJCT0gInNhMTEwMC1ydGMiLAorCQkubmFtZQk9ICJzYTExMDAtcnRjIiwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtCT0gJnNhMTEwMF9ydGNfcG1fb3BzLAorI2VuZGlmCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCmluZGV4IGRhZDA0NDkuLmFhY2NjOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwpAQCAtMjUwOCw4ICsyNTA4LDYgQEAKIAlkZXZpY2UtPnN0b3BwZWQgJj0gfkRBU0RfVU5SRVNVTUVEX1BNOwogCiAJZGFzZF9zY2hlZHVsZV9kZXZpY2VfYmgoZGV2aWNlKTsKLQlpZiAoZGV2aWNlLT5ibG9jaykKLQkJZGFzZF9zY2hlZHVsZV9ibG9ja19iaChkZXZpY2UtPmJsb2NrKTsKIAogCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPnJlc3RvcmUpCiAJCXJjID0gZGV2aWNlLT5kaXNjaXBsaW5lLT5yZXN0b3JlKGRldmljZSk7CkBAIC0yNTIwLDYgKzI1MTgsOSBAQAogCQkgKi8KIAkJZGV2aWNlLT5zdG9wcGVkIHw9IERBU0RfVU5SRVNVTUVEX1BNOwogCisJaWYgKGRldmljZS0+YmxvY2spCisJCWRhc2Rfc2NoZWR1bGVfYmxvY2tfYmgoZGV2aWNlLT5ibG9jayk7CisKIAlkYXNkX3B1dF9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1MzIsNiArMjUzMyw3IEBACiB7CiAJc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyOwogCXN0cnVjdCBjY3cxICpjY3c7CisJdW5zaWduZWQgbG9uZyAqaWRhdzsKIAogCWNxciA9IGRhc2Rfc21hbGxvY19yZXF1ZXN0KG1hZ2ljLCAxIC8qIFJEQyAqLywgcmRjX2J1ZmZlcl9zaXplLCBkZXZpY2UpOwogCkBAIC0yNTQ1LDkgKzI1NDcsMTcgQEAKIAogCWNjdyA9IGNxci0+Y3BhZGRyOwogCWNjdy0+Y21kX2NvZGUgPSBDQ1dfQ01EX1JEQzsKLQljY3ctPmNkYSA9IChfX3UzMikoYWRkcl90KXJkY19idWZmZXI7Ci0JY2N3LT5jb3VudCA9IHJkY19idWZmZXJfc2l6ZTsKKwlpZiAoaWRhbF9pc19uZWVkZWQocmRjX2J1ZmZlciwgcmRjX2J1ZmZlcl9zaXplKSkgeworCQlpZGF3ID0gKHVuc2lnbmVkIGxvbmcgKikgKGNxci0+ZGF0YSk7CisJCWNjdy0+Y2RhID0gKF9fdTMyKShhZGRyX3QpIGlkYXc7CisJCWNjdy0+ZmxhZ3MgPSBDQ1dfRkxBR19JREE7CisJCWlkYXcgPSBpZGFsX2NyZWF0ZV93b3JkcyhpZGF3LCByZGNfYnVmZmVyLCByZGNfYnVmZmVyX3NpemUpOworCX0gZWxzZSB7CisJCWNjdy0+Y2RhID0gKF9fdTMyKShhZGRyX3QpIHJkY19idWZmZXI7CisJCWNjdy0+ZmxhZ3MgPSAwOworCX0KIAorCWNjdy0+Y291bnQgPSByZGNfYnVmZmVyX3NpemU7CiAJY3FyLT5zdGFydGRldiA9IGRldmljZTsKIAljcXItPm1lbWRldiA9IGRldmljZTsKIAljcXItPmV4cGlyZXMgPSAxMCpIWjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwppbmRleCBhYjM1MjE3Li40MTdiOTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCkBAIC0yMzM4LDYgKzIzMzgsOCBAQAogCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzL3JlY29yZHMgcGVyIHRyYWNrLiAqLwogCWJsa3NpemUgPSBibG9jay0+YnBfYmxvY2s7CiAJYmxrX3Blcl90cmsgPSByZWNzX3Blcl90cmFjaygmcHJpdmF0ZS0+cmRjX2RhdGEsIDAsIGJsa3NpemUpOworCWlmIChibGtfcGVyX3RyayA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkvKiBDYWxjdWxhdGUgcmVjb3JkIGlkIG9mIGZpcnN0IGFuZCBsYXN0IGJsb2NrLiAqLwogCWZpcnN0X3JlYyA9IGZpcnN0X3RyayA9IGJsa19ycV9wb3MocmVxKSA+PiBibG9jay0+czJiX3NoaWZ0OwogCWZpcnN0X29mZnMgPSBzZWN0b3JfZGl2KGZpcnN0X3RyaywgYmxrX3Blcl90cmspOwpAQCAtMzIxMSw4ICszMjEzLDEwIEBACiBpbnQgZGFzZF9lY2tkX3Jlc3RvcmVfZGV2aWNlKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBkYXNkX2Vja2RfcHJpdmF0ZSAqcHJpdmF0ZTsKKwlzdHJ1Y3QgZGFzZF9lY2tkX2NoYXJhY3RlcmlzdGljcyB0ZW1wX3JkY19kYXRhOwogCWludCBpc19rbm93biwgcmM7CiAJc3RydWN0IGRhc2RfdWlkIHRlbXBfdWlkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcml2YXRlID0gKHN0cnVjdCBkYXNkX2Vja2RfcHJpdmF0ZSAqKSBkZXZpY2UtPnByaXZhdGU7CiAKQEAgLTMyMjUsNyArMzIyOSw4IEBACiAJcmMgPSBkYXNkX2Vja2RfZ2VuZXJhdGVfdWlkKGRldmljZSwgJnByaXZhdGUtPnVpZCk7CiAJZGFzZF9nZXRfdWlkKGRldmljZS0+Y2RldiwgJnRlbXBfdWlkKTsKIAlpZiAobWVtY21wKCZwcml2YXRlLT51aWQsICZ0ZW1wX3VpZCwgc2l6ZW9mKHN0cnVjdCBkYXNkX3VpZCkpICE9IDApCi0JCWRldl9lcnIoJmRldmljZS0+Y2Rldi0+ZGV2LCAiVGhlIFVJRCBvZiB0aGUgREFTRCBoYXMgY2hhbmdlZFxuIik7CisJCWRldl9lcnIoJmRldmljZS0+Y2Rldi0+ZGV2LCAiVGhlIFVJRCBvZiB0aGUgREFTRCBoYXMgIgorCQkJImNoYW5nZWRcbiIpOwogCWlmIChyYykKIAkJZ290byBvdXRfZXJyOwogCWRhc2Rfc2V0X3VpZChkZXZpY2UtPmNkZXYsICZwcml2YXRlLT51aWQpOwpAQCAtMzI0NSwxNSArMzI1MCwxNyBAQAogCWRhc2RfZWNrZF9yZWFkX2ZlYXR1cmVzKGRldmljZSk7CiAKIAkvKiBSZWFkIERldmljZSBDaGFyYWN0ZXJpc3RpY3MgKi8KLQltZW1zZXQoJnByaXZhdGUtPnJkY19kYXRhLCAwLCBzaXplb2YocHJpdmF0ZS0+cmRjX2RhdGEpKTsKIAlyYyA9IGRhc2RfZ2VuZXJpY19yZWFkX2Rldl9jaGFycyhkZXZpY2UsIERBU0RfRUNLRF9NQUdJQywKLQkJCQkJICZwcml2YXRlLT5yZGNfZGF0YSwgNjQpOworCQkJCQkgJnRlbXBfcmRjX2RhdGEsIDY0KTsKIAlpZiAocmMpIHsKIAkJREJGX0VWRU5UKERCRl9XQVJOSU5HLAogCQkJICAiUmVhZCBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIGZhaWxlZCwgcmM9JWQgZm9yICIKIAkJCSAgImRldmljZTogJXMiLCByYywgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CisJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGRldmljZS0+Y2RldiksIGZsYWdzKTsKKwltZW1jcHkoJnByaXZhdGUtPnJkY19kYXRhLCAmdGVtcF9yZGNfZGF0YSwgc2l6ZW9mKHRlbXBfcmRjX2RhdGEpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpLCBmbGFncyk7CiAKIAkvKiBhZGQgZGV2aWNlIHRvIGFsaWFzIG1hbmFnZW1lbnQgKi8KIAlkYXNkX2FsaWFzX2FkZF9kZXZpY2UoZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYwppbmRleCBkNmEwMjJmLi42MmRkZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jCkBAIC0xMzYxLDExICsxMzYxLDEzIEBACiAKIHZvaWQgcmF3MzI3MF9wbV91bmZyZWV6ZShzdHJ1Y3QgcmF3MzI3MF92aWV3ICp2aWV3KQogeworI2lmZGVmIENPTkZJR19UTjMyNzBfQ09OU09MRQogCXN0cnVjdCByYXczMjcwICpycDsKIAogCXJwID0gdmlldy0+ZGV2OwogCWlmIChycCAmJiB0ZXN0X2JpdChSQVczMjcwX0ZMQUdTX0ZST1pFTiwgJnJwLT5mbGFncykpCiAJCWNjd19kZXZpY2VfZm9yY2VfY29uc29sZSgpOworI2VuZGlmCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2N3X2RldmljZV9pZCByYXczMjcwX2lkW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2FzeW5jLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2FzeW5jLmMKaW5kZXggZGFhZWMxOC4uYjQ0NDYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9hc3luYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfYXN5bmMuYwpAQCAtMjYsNyArMjYsNiBAQAogc3RhdGljIGludCBzY2xwX2FzeW5jX3NlbmRfd2FpdChjaGFyICptZXNzYWdlKTsKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqY2FsbGhvbWVfc3lzY3RsX2hlYWRlcjsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2NscF9hc3luY19sb2NrKTsKLXN0YXRpYyBjaGFyIG5vZGVuYW1lWzY0XTsKICNkZWZpbmUgU0NMUF9OT1JNQUxfV1JJVEUJMHgwMAogCiBzdHJ1Y3QgYXN5bmNfZXZidWYgewpAQCAtNTIsOSArNTEsMTAgQEAKIHN0YXRpYyBpbnQgY2FsbF9ob21lX29uX3BhbmljKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCiB7Ci0JCXN0cm5jYXQoZGF0YSwgbm9kZW5hbWUsIHN0cmxlbihub2RlbmFtZSkpOwotCQlzY2xwX2FzeW5jX3NlbmRfd2FpdChkYXRhKTsKLQkJcmV0dXJuIE5PVElGWV9ET05FOworCXN0cm5jYXQoZGF0YSwgaW5pdF91dHNuYW1lKCktPm5vZGVuYW1lLAorCQlzaXplb2YoaW5pdF91dHNuYW1lKCktPm5vZGVuYW1lKSk7CisJc2NscF9hc3luY19zZW5kX3dhaXQoZGF0YSk7CisJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNhbGxfaG9tZV9wYW5pY19uYiA9IHsKQEAgLTYyLDIxICs2MiwyMCBAQAogCS5wcmlvcml0eSA9IElOVF9NQVgsCiB9OwogCi1zdGF0aWMgaW50IHByb2NfaGFuZGxlcl9jYWxsaG9tZShjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgcHJvY19oYW5kbGVyX2NhbGxob21lKHN0cnVjdCBjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAogCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmNvdW50LAogCQkJCSBsb2ZmX3QgKnBwb3MpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IGxlbiwgcmM7Ci0JY2hhciBidWZbMl07CisJY2hhciBidWZbM107CiAKLQlpZiAoISpjb3VudCB8ICgqcHBvcyAmJiAhd3JpdGUpKSB7CisJaWYgKCEqY291bnQgfHwgKCpwcG9zICYmICF3cml0ZSkpIHsKIAkJKmNvdW50ID0gMDsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghd3JpdGUpIHsKLQkJbGVuID0gIHNwcmludGYoYnVmLCAiJWRcbiIsIGNhbGxob21lX2VuYWJsZWQpOwotCQlidWZbbGVuXSA9ICdcMCc7CisJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZFxuIiwgY2FsbGhvbWVfZW5hYmxlZCk7CiAJCXJjID0gY29weV90b191c2VyKGJ1ZmZlciwgYnVmLCBzaXplb2YoYnVmKSk7CiAJCWlmIChyYyAhPSAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMDAsNyArOTksNyBAQAogCXsKIAkJLnByb2NuYW1lCT0gImNhbGxob21lIiwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2hhbmRsZXJfY2FsbGhvbWUsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2hhbmRsZXJfY2FsbGhvbWUsCiAJfSwKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKQEAgLTE3MSwzOSArMTcwLDI5IEBACiAJcmMgPSBzY2xwX3JlZ2lzdGVyKCZzY2xwX2FzeW5jX3JlZ2lzdGVyKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQljYWxsaG9tZV9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGtlcm5fZGlyX3RhYmxlKTsKLQlpZiAoIWNhbGxob21lX3N5c2N0bF9oZWFkZXIpIHsKLQkJcmMgPSAtRU5PTUVNOworCXJjID0gLUVPUE5PVFNVUFA7CisJaWYgKCEoc2NscF9hc3luY19yZWdpc3Rlci5zY2xwX3JlY2VpdmVfbWFzayAmIEVWVFlQX0FTWU5DX01BU0spKQogCQlnb3RvIG91dF9zY2xwOwotCX0KLQlpZiAoIShzY2xwX2FzeW5jX3JlZ2lzdGVyLnNjbHBfcmVjZWl2ZV9tYXNrICYgRVZUWVBfQVNZTkNfTUFTSykpIHsKLQkJcmMgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXRfc2NscDsKLQl9CiAJcmMgPSAtRU5PTUVNOworCWNhbGxob21lX3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoa2Vybl9kaXJfdGFibGUpOworCWlmICghY2FsbGhvbWVfc3lzY3RsX2hlYWRlcikKKwkJZ290byBvdXRfc2NscDsKIAlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNjbHBfcmVxKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXF1ZXN0KQotCQlnb3RvIG91dF9zeXM7CiAJc2NjYiA9IChzdHJ1Y3Qgc2NscF9hc3luY19zY2NiICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JaWYgKCFzY2NiKQorCWlmICghcmVxdWVzdCB8fCAhc2NjYikKIAkJZ290byBvdXRfbWVtOwotCXJjID0gIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwKLQkJCQkJICAgICAmY2FsbF9ob21lX3BhbmljX25iKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0X21lbTsKLQotCXN0cm5jcHkobm9kZW5hbWUsIGluaXRfdXRzbmFtZSgpLT5ub2RlbmFtZSwgNjQpOwotCXJldHVybiAwOwotCisJcmMgPSBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsCisJCQkJCSAgICAmY2FsbF9ob21lX3BhbmljX25iKTsKKwlpZiAoIXJjKQorCQlnb3RvIG91dDsKIG91dF9tZW06CiAJa2ZyZWUocmVxdWVzdCk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBzY2NiKTsKLW91dF9zeXM6CiAJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoY2FsbGhvbWVfc3lzY3RsX2hlYWRlcik7CiBvdXRfc2NscDoKIAlzY2xwX3VucmVnaXN0ZXIoJnNjbHBfYXN5bmNfcmVnaXN0ZXIpOworb3V0OgogCXJldHVybiByYzsKLQogfQogbW9kdWxlX2luaXQoc2NscF9hc3luY19pbml0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jCmluZGV4IDE3ODcyNGYuLmI5ZDJhMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdnQyMjAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3Z0MjIwLmMKQEAgLTcwNSwyMSArNzA1LDYgQEAKIH0KIF9faW5pdGNhbGwoc2NscF92dDIyMF90dHlfaW5pdCk7CiAKLSNpZmRlZiBDT05GSUdfU0NMUF9WVDIyMF9DT05TT0xFCi0KLXN0YXRpYyB2b2lkCi1zY2xwX3Z0MjIwX2Nvbl93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlfX3NjbHBfdnQyMjBfd3JpdGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgYnVmLCBjb3VudCwgMSwgMSwgMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqCi1zY2xwX3Z0MjIwX2Nvbl9kZXZpY2Uoc3RydWN0IGNvbnNvbGUgKmMsIGludCAqaW5kZXgpCi17Ci0JKmluZGV4ID0gMDsKLQlyZXR1cm4gc2NscF92dDIyMF9kcml2ZXI7Ci19Ci0KIHN0YXRpYyB2b2lkIF9fc2NscF92dDIyMF9mbHVzaF9idWZmZXIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNzc2LDYgKzc2MSwyMSBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19TQ0xQX1ZUMjIwX0NPTlNPTEUKKworc3RhdGljIHZvaWQKK3NjbHBfdnQyMjBfY29uX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGNvdW50KQoreworCV9fc2NscF92dDIyMF93cml0ZSgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBidWYsIGNvdW50LCAxLCAxLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICoKK3NjbHBfdnQyMjBfY29uX2RldmljZShzdHJ1Y3QgY29uc29sZSAqYywgaW50ICppbmRleCkKK3sKKwkqaW5kZXggPSAwOworCXJldHVybiBzY2xwX3Z0MjIwX2RyaXZlcjsKK30KKwogc3RhdGljIGludAogc2NscF92dDIyMF9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9ibG9jay5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9ibG9jay5jCmluZGV4IDY0ZjU3ZWYuLjBjMDcwNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfYmxvY2suYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMKQEAgLTE2Miw5ICsxNjIsMTAgQEAKIAlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmJsa19kYXRhLnJlcXVlc3RfcXVldWVfbG9jayk7CiAJd2hpbGUgKAogCQkhYmxrX3F1ZXVlX3BsdWdnZWQocXVldWUpICYmCi0JCShyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxdWV1ZSkpICYmCisJCWJsa19wZWVrX3JlcXVlc3QocXVldWUpICYmCiAJCW5yX3F1ZXVlZCA8IFRBUEVCTE9DS19NSU5fUkVRVUVVRQogCSkgeworCQlyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxdWV1ZSk7CiAJCWlmIChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKSB7CiAJCQlEQkZfRVZFTlQoMSwgIlRCTE9DSzogUmVqZWN0aW5nIHdyaXRlIHJlcXVlc3RcbiIpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXZpY2UtPmJsa19kYXRhLnJlcXVlc3RfcXVldWVfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvemNvcmUuYwppbmRleCBjNDMxMTk4Li44MmRhYTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3pjb3JlLmMKQEAgLTE0LDcgKzE0LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxhc20vaXBsLmg+CiAjaW5jbHVkZSA8YXNtL3NjbHAuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMgYi9kcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jCmluZGV4IDY1NjVmMDIuLjdlYWI5YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9ibGFja2xpc3QuYwpAQCAtMjY1LDEzICsyNjUsMTEgQEAKIHN0YXRpYyB2b2lkICoKIGNpb19pZ25vcmVfcHJvY19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgY2N3ZGV2X2l0ZXIgKml0ZXI7CisJc3RydWN0IGNjd2Rldl9pdGVyICppdGVyID0gcy0+cHJpdmF0ZTsKIAogCWlmICgqb2Zmc2V0ID49IChfX01BWF9TVUJDSEFOTkVMICsgMSkgKiAoX19NQVhfU1NJRCArIDEpKQogCQlyZXR1cm4gTlVMTDsKLQlpdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNjd2Rldl9pdGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpdGVyKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwltZW1zZXQoaXRlciwgMCwgc2l6ZW9mKCppdGVyKSk7CiAJaXRlci0+c3NpZCA9ICpvZmZzZXQgLyAoX19NQVhfU1VCQ0hBTk5FTCArIDEpOwogCWl0ZXItPmRldm5vID0gKm9mZnNldCAlIChfX01BWF9TVUJDSEFOTkVMICsgMSk7CiAJcmV0dXJuIGl0ZXI7CkBAIC0yODAsOCArMjc4LDYgQEAKIHN0YXRpYyB2b2lkCiBjaW9faWdub3JlX3Byb2Nfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCkKIHsKLQlpZiAoIUlTX0VSUihpdCkpCi0JCWtmcmVlKGl0KTsKIH0KIAogc3RhdGljIHZvaWQgKgpAQCAtMzc4LDE0ICszNzQsMTUgQEAKIHN0YXRpYyBpbnQKIGNpb19pZ25vcmVfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzZXFfb3BlbihmaWxlLCAmY2lvX2lnbm9yZV9wcm9jX3NlcV9vcHMpOworCXJldHVybiBzZXFfb3Blbl9wcml2YXRlKGZpbGUsICZjaW9faWdub3JlX3Byb2Nfc2VxX29wcywKKwkJCQlzaXplb2Yoc3RydWN0IGNjd2Rldl9pdGVyKSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpb19pZ25vcmVfcHJvY19mb3BzID0gewogCS5vcGVuICAgID0gY2lvX2lnbm9yZV9wcm9jX29wZW4sCiAJLnJlYWQgICAgPSBzZXFfcmVhZCwKIAkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKIAkud3JpdGUgICA9IGNpb19pZ25vcmVfd3JpdGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuYwppbmRleCA0MDAwMjgzLi44YWI1MTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hwLmMKQEAgLTM5Myw3ICszOTMsNiBAQAogCWNocC0+c3RhdGUgPSAxOwogCWNocC0+ZGV2LnBhcmVudCA9ICZjaGFubmVsX3N1YnN5c3RlbXNbY2hwaWQuY3NzaWRdLT5kZXZpY2U7CiAJY2hwLT5kZXYucmVsZWFzZSA9IGNocF9yZWxlYXNlOwotCWRldl9zZXRfbmFtZSgmY2hwLT5kZXYsICJjaHAleC4lMDJ4IiwgY2hwaWQuY3NzaWQsIGNocGlkLmlkKTsKIAogCS8qIE9idGFpbiBjaGFubmVsIHBhdGggZGVzY3JpcHRpb24gYW5kIGZpbGwgaXQgaW4uICovCiAJcmV0ID0gY2hzY19kZXRlcm1pbmVfYmFzZV9jaGFubmVsX3BhdGhfZGVzYyhjaHBpZCwgJmNocC0+ZGVzYyk7CkBAIC00MTEsNiArNDEwLDcgQEAKIAl9IGVsc2UgewogCQljaHAtPmNtZyA9IC0xOwogCX0KKwlkZXZfc2V0X25hbWUoJmNocC0+ZGV2LCAiY2hwJXguJTAyeCIsIGNocGlkLmNzc2lkLCBjaHBpZC5pZCk7CiAKIAkvKiBtYWtlIGl0IGtub3duIHRvIHRoZSBzeXN0ZW0gKi8KIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmNocC0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCmluZGV4IGY3ODBiZGQuLjI0OTBiNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtMTI1MCw4ICsxMjUwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsKIAotCWNkZXYgPSBzY2hfZ2V0X2NkZXYoc2NoKTsKLQlpZiAoY2RldikgeworCWlmIChjaW9faXNfY29uc29sZShzY2gtPnNjaGlkKSkgewogCQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc2NoLT5kZXYua29iaiwKIAkJCQkJJmlvX3N1YmNoYW5uZWxfYXR0cl9ncm91cCk7CiAJCWlmIChyYykKQEAgLTEyNjAsMTMgKzEyNTksMTMgQEAKIAkJCQkgICAgICAiMC4leC4lMDR4IChyYz0lZClcbiIsCiAJCQkJICAgICAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubywgcmMpOwogCQkvKgotCQkgKiBUaGlzIHN1YmNoYW5uZWwgYWxyZWFkeSBoYXMgYW4gYXNzb2NpYXRlZCBjY3dfZGV2aWNlLgorCQkgKiBUaGUgY29uc29sZSBzdWJjaGFubmVsIGFscmVhZHkgaGFzIGFuIGFzc29jaWF0ZWQgY2N3X2RldmljZS4KIAkJICogVGhyb3cgdGhlIGRlbGF5ZWQgdWV2ZW50IGZvciB0aGUgc3ViY2hhbm5lbCwgcmVnaXN0ZXIKLQkJICogdGhlIGNjd19kZXZpY2UgYW5kIGV4aXQuIFRoaXMgaGFwcGVucyBmb3IgYWxsIGVhcmx5Ci0JCSAqIGRldmljZXMsIGUuZy4gdGhlIGNvbnNvbGUuCisJCSAqIHRoZSBjY3dfZGV2aWNlIGFuZCBleGl0LgogCQkgKi8KIAkJZGV2X3NldF91ZXZlbnRfc3VwcHJlc3MoJnNjaC0+ZGV2LCAwKTsKIAkJa29iamVjdF91ZXZlbnQoJnNjaC0+ZGV2LmtvYmosIEtPQkpfQUREKTsKKwkJY2RldiA9IHNjaF9nZXRfY2RldihzY2gpOwogCQljZGV2LT5kZXYuZ3JvdXBzID0gY2N3ZGV2X2F0dHJfZ3JvdXBzOwogCQlkZXZpY2VfaW5pdGlhbGl6ZSgmY2Rldi0+ZGV2KTsKIAkJY2N3X2RldmljZV9yZWdpc3RlcihjZGV2KTsKQEAgLTE2MDksNyArMTYwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRldmljZV9zZXRfZGlzY29ubmVjdGVkKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQordm9pZCBjY3dfZGV2aWNlX3NldF9kaXNjb25uZWN0ZWQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7CiAJaWYgKCFjZGV2KQogCQlyZXR1cm47CkBAIC0xNzA1LDcgKzE3MDQsNyBAQAogCQljY3dfZGV2aWNlX3RyaWdnZXJfcmVwcm9iZShjZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBESVNDOgotCQlkZXZpY2Vfc2V0X2Rpc2Nvbm5lY3RlZChjZGV2KTsKKwkJY2N3X2RldmljZV9zZXRfZGlzY29ubmVjdGVkKGNkZXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmggYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oCmluZGV4IGVkMzlhMmMuLjI0NmM2NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaApAQCAtMTI1LDYgKzEyNSw3IEBACiB2b2lkIGNjd19kZXZpY2VfdHJpZ2dlcl9yZXByb2JlKHN0cnVjdCBjY3dfZGV2aWNlICopOwogdm9pZCBjY3dfZGV2aWNlX2tpbGxfaW8oc3RydWN0IGNjd19kZXZpY2UgKik7CiBpbnQgY2N3X2RldmljZV9ub3RpZnkoc3RydWN0IGNjd19kZXZpY2UgKiwgaW50KTsKK3ZvaWQgY2N3X2RldmljZV9zZXRfZGlzY29ubmVjdGVkKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KTsKIHZvaWQgY2N3X2RldmljZV9zZXRfbm90b3BlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldik7CiAKIC8qIHFkaW8gbmVlZHMgdGhpcy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKaW5kZXggZTcyOGNlNC4uYjk2MTNkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKQEAgLTM4NywxOSArMzg3LDM1IEBACiAKIAljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IHN0YXRlOwogCi0JaWYgKHN0YXRlID09IERFVl9TVEFURV9CT1hFRCkgeworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIERFVl9TVEFURV9CT1hFRDoKIAkJQ0lPX01TR19FVkVOVCgwLCAiQm94ZWQgZGV2aWNlICUwNHggb24gc3ViY2hhbm5lbCAlMDR4XG4iLAogCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJCWlmIChjZGV2LT5vbmxpbmUgJiYgIWNjd19kZXZpY2Vfbm90aWZ5KGNkZXYsIENJT19CT1hFRCkpCiAJCQljY3dfZGV2aWNlX3NjaGVkdWxlX3NjaF91bnJlZ2lzdGVyKGNkZXYpOwogCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7Ci0JfQotCWlmIChzdGF0ZSA9PSBERVZfU1RBVEVfTk9UX09QRVIpIHsKKwkJYnJlYWs7CisJY2FzZSBERVZfU1RBVEVfTk9UX09QRVI6CiAJCUNJT19NU0dfRVZFTlQoMCwgIkRldmljZSAlMDR4IGdvbmUgb24gc3ViY2hhbm5lbCAlMDR4XG4iLAogCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAJCWlmICghY2N3X2RldmljZV9ub3RpZnkoY2RldiwgQ0lPX0dPTkUpKQogCQkJY2N3X2RldmljZV9zY2hlZHVsZV9zY2hfdW5yZWdpc3RlcihjZGV2KTsKKwkJZWxzZQorCQkJY2N3X2RldmljZV9zZXRfZGlzY29ubmVjdGVkKGNkZXYpOwogCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7CisJCWJyZWFrOworCWNhc2UgREVWX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKwkJQ0lPX01TR19FVkVOVCgwLCAiRGlzY29ubmVjdGVkIGRldmljZSAlMDR4IG9uIHN1YmNoYW5uZWwgIgorCQkJICAgICAgIiUwNHhcbiIsIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywKKwkJCSAgICAgIHNjaC0+c2NoaWQuc2NoX25vKTsKKwkJaWYgKCFjY3dfZGV2aWNlX25vdGlmeShjZGV2LCBDSU9fTk9fUEFUSCkpCisJCQljY3dfZGV2aWNlX3NjaGVkdWxlX3NjaF91bnJlZ2lzdGVyKGNkZXYpOworCQllbHNlCisJCQljY3dfZGV2aWNlX3NldF9kaXNjb25uZWN0ZWQoY2Rldik7CisJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvbm90aWZ5ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCiAJaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLmRvbm90aWZ5KSB7CkBAIC02NzEsNiArNjg3LDEwIEBACiAJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfTk9UX09QRVIpOwogCQlyZXR1cm4gMDsKIAl9CisJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9CT1hFRCkgeworCQljY3dfZGV2aWNlX2RvbmUoY2RldiwgREVWX1NUQVRFX0JPWEVEKTsKKwkJcmV0dXJuIDA7CisJfQogCWlmIChjY3dfZGV2aWNlX2lzX29ycGhhbihjZGV2KSkgewogCQljY3dfZGV2aWNlX2RvbmUoY2RldiwgREVWX1NUQVRFX09GRkxJTkUpOwogCQlyZXR1cm4gMDsKQEAgLTczMCwxMSArNzUwLDEwIEBACiBzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX2dlbmVyaWNfbm90b3BlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwKIAkJCQkgICAgICAgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0KLQljY3dfZGV2aWNlX3NldF9ub3RvcGVyKGNkZXYpOwotCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7Ci0JY3NzX3NjaGVkdWxlX2V2YWwoc2NoLT5zY2hpZCk7CisJaWYgKCFjY3dfZGV2aWNlX25vdGlmeShjZGV2LCBDSU9fR09ORSkpCisJCWNjd19kZXZpY2Vfc2NoZWR1bGVfc2NoX3VucmVnaXN0ZXIoY2Rldik7CisJZWxzZQorCQljY3dfZGV2aWNlX3NldF9kaXNjb25uZWN0ZWQoY2Rldik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCmluZGV4IDFiNzhmNjMuLjc2NzY5OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkJCSAgIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfZm9wcyA9IHsKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCiAJLm9wZW4JID0gcXN0YXRfc2VxX29wZW4sCiAJLnJlYWQJID0gc2VxX3JlYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fcGVyZi5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX3BlcmYuYwppbmRleCBlZmY5NDM5Li45NjhlM2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fcGVyZi5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19wZXJmLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgcWRpb19wZXJmX3Byb2Nfc2hvdywgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHFkaW9fcGVyZl9wcm9jX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxZGlvX3BlcmZfcHJvY19mb3BzID0gewogCS5vd25lcgkgPSBUSElTX01PRFVMRSwKIAkub3BlbgkgPSBxZGlvX3BlcmZfc2VxX29wZW4sCiAJLnJlYWQJID0gc2VxX3JlYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9wY2l4Y2MuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaXhjYy5jCmluZGV4IGMyMGQ0NzkuLjU2NzdiNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaXhjYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaXhjYy5jCkBAIC0zNjEsNyArMzYxLDcgQEAKIAkJLlRvQ2FyZExlbjEJPSBzaXplb2YgKm1zZyAtIHNpemVvZihtc2ctPmhkciksCiAJCS5Gcm9tQ2FyZExlbjEJPSBzaXplb2YgKm1zZyAtIHNpemVvZihtc2ctPmhkciksCiAJfTsKLQlzdGF0aWMgc3RydWN0IENQUkJYIHN0YXRpY19jcHJieCA9IHsKKwlzdGF0aWMgc3RydWN0IENQUkJYIGxvY2FsX2NwcmJ4ID0gewogCQkuY3ByYl9sZW4JPSAweDAwZGMsCiAJCS5jcHJiX3Zlcl9pZAk9IDB4MDIsCiAJCS5mdW5jX2lkCT0gezB4NTQsIDB4MzJ9LApAQCAtMzcyLDcgKzM3Miw3IEBACiAKIAltc2ctPmhkciA9IHN0YXRpY190eXBlNl9oZHJYOwogCW1zZy0+aGRyLkZyb21DYXJkTGVuMiA9IHJhbmRvbV9udW1iZXJfbGVuZ3RoLAotCW1zZy0+Y3ByYnggPSBzdGF0aWNfY3ByYng7CisJbXNnLT5jcHJieCA9IGxvY2FsX2NwcmJ4OwogCW1zZy0+Y3ByYngucnBsX2RhdGFsID0gcmFuZG9tX251bWJlcl9sZW5ndGgsCiAJbXNnLT5jcHJieC5kb21haW4gPSBBUF9RSURfUVVFVUUoYXBfZGV2LT5xaWQpOwogCW1lbWNweShtc2ctPmZ1bmN0aW9uX2NvZGUsIG1zZy0+aGRyLmZ1bmN0aW9uX2NvZGUsIDB4MDIpOwpAQCAtNTYxLDcgKzU2MSw4IEBACiAJCWlmIChtc2ctPmNwcmJ4LmNwcmJfdmVyX2lkID09IDB4MDIpCiAJCQlyZXR1cm4gY29udmVydF90eXBlODZfaWNhKHpkZXYsIHJlcGx5LAogCQkJCQkJICBvdXRwdXRkYXRhLCBvdXRwdXRkYXRhbGVuZ3RoKTsKLQkJLyogbm8gYnJlYWssIGluY29ycmVjdCBjcHJiIHZlcnNpb24gaXMgYW4gdW5rbm93biByZXNwb25zZSAqLworCQkvKiBGYWxsIHRocm91Z2gsIG5vIGJyZWFrLCBpbmNvcnJlY3QgY3ByYiB2ZXJzaW9uIGlzIGFuIHVua25vd24KKwkJICogcmVzcG9uc2UgKi8KIAlkZWZhdWx0OiAvKiBVbmtub3duIHJlc3BvbnNlIHR5cGUsIHRoaXMgc2hvdWxkIE5FVkVSIEVWRVIgaGFwcGVuICovCiAJCXpkZXYtPm9ubGluZSA9IDA7CiAJCXJldHVybiAtRUFHQUlOOwkvKiByZXBlYXQgdGhlIHJlcXVlc3Qgb24gYSBkaWZmZXJlbnQgZGV2aWNlLiAqLwpAQCAtNTg3LDcgKzU4OCw4IEBACiAJCX0KIAkJaWYgKG1zZy0+Y3ByYnguY3ByYl92ZXJfaWQgPT0gMHgwMikKIAkJCXJldHVybiBjb252ZXJ0X3R5cGU4Nl94Y3JiKHpkZXYsIHJlcGx5LCB4Y1JCKTsKLQkJLyogbm8gYnJlYWssIGluY29ycmVjdCBjcHJiIHZlcnNpb24gaXMgYW4gdW5rbm93biByZXNwb25zZSAqLworCQkvKiBGYWxsIHRocm91Z2gsIG5vIGJyZWFrLCBpbmNvcnJlY3QgY3ByYiB2ZXJzaW9uIGlzIGFuIHVua25vd24KKwkJICogcmVzcG9uc2UgKi8KIAlkZWZhdWx0OiAvKiBVbmtub3duIHJlc3BvbnNlIHR5cGUsIHRoaXMgc2hvdWxkIE5FVkVSIEVWRVIgaGFwcGVuICovCiAJCXhjUkItPnN0YXR1cyA9IDB4MDAwODA0NERMOyAvKiBIRERfSW52YWxpZFBhcm0gKi8KIAkJemRldi0+b25saW5lID0gMDsKQEAgLTYxMCw3ICs2MTIsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChtc2ctPmNwcmJ4LmNwcmJfdmVyX2lkID09IDB4MDIpCiAJCQlyZXR1cm4gY29udmVydF90eXBlODZfcm5nKHpkZXYsIHJlcGx5LCBkYXRhKTsKLQkJLyogbm8gYnJlYWssIGluY29ycmVjdCBjcHJiIHZlcnNpb24gaXMgYW4gdW5rbm93biByZXNwb25zZSAqLworCQkvKiBGYWxsIHRocm91Z2gsIG5vIGJyZWFrLCBpbmNvcnJlY3QgY3ByYiB2ZXJzaW9uIGlzIGFuIHVua25vd24KKwkJICogcmVzcG9uc2UgKi8KIAlkZWZhdWx0OiAvKiBVbmtub3duIHJlc3BvbnNlIHR5cGUsIHRoaXMgc2hvdWxkIE5FVkVSIEVWRVIgaGFwcGVuICovCiAJCXpkZXYtPm9ubGluZSA9IDA7CiAJCXJldHVybiAtRUFHQUlOOwkvKiByZXBlYXQgdGhlIHJlcXVlc3Qgb24gYSBkaWZmZXJlbnQgZGV2aWNlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9zbXNnaXVjdi5jIGIvZHJpdmVycy9zMzkwL25ldC9zbXNnaXVjdi5jCmluZGV4IDEwMjAwMGQuLjMwMTIzNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvc21zZ2l1Y3YuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3Ntc2dpdWN2LmMKQEAgLTE1OCw3ICsxNTgsMTIgQEAKIAkJc21zZ19wYXRoLT5mbGFncyA9IDA7CiAJCXJjID0gaXVjdl9wYXRoX2Nvbm5lY3Qoc21zZ19wYXRoLCAmc21zZ19oYW5kbGVyLCAiKk1TRyAgICAiLAogCQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJpdWN2X3BhdGhfY29ubmVjdCByZXR1cm5lZCB3aXRoIHJjICVpXG4iLCByYyk7CisjaWZkZWYgQ09ORklHX1BNX0RFQlVHCisJCWlmIChyYykKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJpdWN2X3BhdGhfY29ubmVjdCByZXR1cm5lZCB3aXRoIHJjICVpXG4iLCByYyk7CisjZW5kaWYKKwkJY3BjbWQoIlNFVCBTTVNHIElVQ1YiLCBOVUxMLCAwLCBOVUxMKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYwppbmRleCAxYmU2YmY3Li4yODg5ZTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKQEAgLTgwLDI4ICs4MCwzNSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgemZjcF9pbml0X2RldmljZV9jb25maWd1cmUoY2hhciAqYnVzaWQsIHU2NCB3d3BuLCB1NjQgbHVuKQogeworCXN0cnVjdCBjY3dfZGV2aWNlICpjY3dkZXY7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7CiAKLQltdXRleF9sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKLQlyZWFkX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCWFkYXB0ZXIgPSB6ZmNwX2dldF9hZGFwdGVyX2J5X2J1c2lkKGJ1c2lkKTsKLQlpZiAoYWRhcHRlcikKLQkJemZjcF9hZGFwdGVyX2dldChhZGFwdGVyKTsKLQlyZWFkX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7CisJY2N3ZGV2ID0gZ2V0X2Njd2Rldl9ieV9idXNpZCgmemZjcF9jY3dfZHJpdmVyLCBidXNpZCk7CisJaWYgKCFjY3dkZXYpCisJCXJldHVybjsKIAorCWlmIChjY3dfZGV2aWNlX3NldF9vbmxpbmUoY2N3ZGV2KSkKKwkJZ290byBvdXRfY2N3ZGV2OworCisJbXV0ZXhfbG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CisJYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YSgmY2N3ZGV2LT5kZXYpOwogCWlmICghYWRhcHRlcikKLQkJZ290byBvdXRfYWRhcHRlcjsKLQlwb3J0ID0gemZjcF9wb3J0X2VucXVldWUoYWRhcHRlciwgd3dwbiwgMCwgMCk7Ci0JaWYgKElTX0VSUihwb3J0KSkKKwkJZ290byBvdXRfdW5sb2NrOworCXpmY3BfYWRhcHRlcl9nZXQoYWRhcHRlcik7CisKKwlwb3J0ID0gemZjcF9nZXRfcG9ydF9ieV93d3BuKGFkYXB0ZXIsIHd3cG4pOworCWlmICghcG9ydCkKIAkJZ290byBvdXRfcG9ydDsKKworCXpmY3BfcG9ydF9nZXQocG9ydCk7CiAJdW5pdCA9IHpmY3BfdW5pdF9lbnF1ZXVlKHBvcnQsIGx1bik7CiAJaWYgKElTX0VSUih1bml0KSkKIAkJZ290byBvdXRfdW5pdDsKIAltdXRleF91bmxvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwotCWNjd19kZXZpY2Vfc2V0X29ubGluZShhZGFwdGVyLT5jY3dfZGV2aWNlKTsKIAorCXpmY3BfZXJwX3VuaXRfcmVvcGVuKHVuaXQsIDAsICJhdWlkY18xIiwgTlVMTCk7CiAJemZjcF9lcnBfd2FpdChhZGFwdGVyKTsKIAlmbHVzaF93b3JrKCZ1bml0LT5zY3NpX3dvcmspOwogCkBAIC0xMTEsMjAgKzExOCwyMyBAQAogCXpmY3BfcG9ydF9wdXQocG9ydCk7CiBvdXRfcG9ydDoKIAl6ZmNwX2FkYXB0ZXJfcHV0KGFkYXB0ZXIpOwotb3V0X2FkYXB0ZXI6CitvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CitvdXRfY2N3ZGV2OgorCXB1dF9kZXZpY2UoJmNjd2Rldi0+ZGV2KTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB6ZmNwX2luaXRfZGV2aWNlX3NldHVwKGNoYXIgKmRldnN0cikKIHsKIAljaGFyICp0b2tlbjsKLQljaGFyICpzdHI7CisJY2hhciAqc3RyLCAqc3RyX3NhdmVkOwogCWNoYXIgYnVzaWRbWkZDUF9CVVNfSURfU0laRV07CiAJdTY0IHd3cG4sIGx1bjsKIAogCS8qIGR1cGxpY2F0ZSBkZXZzdHIgYW5kIGtlZXAgdGhlIG9yaWdpbmFsIGZvciBzeXNmcyBwcmVzZW50YXRpb24qLwotCXN0ciA9IGttYWxsb2Moc3RybGVuKGRldnN0cikgKyAxLCBHRlBfS0VSTkVMKTsKKwlzdHJfc2F2ZWQgPSBrbWFsbG9jKHN0cmxlbihkZXZzdHIpICsgMSwgR0ZQX0tFUk5FTCk7CisJc3RyID0gc3RyX3NhdmVkOwogCWlmICghc3RyKQogCQlyZXR1cm47CiAKQEAgLTE0MywxMiArMTUzLDEyIEBACiAJaWYgKCF0b2tlbiB8fCBzdHJpY3Rfc3RydG91bGwodG9rZW4sIDAsICh1bnNpZ25lZCBsb25nIGxvbmcgKikgJmx1bikpCiAJCWdvdG8gZXJyX291dDsKIAotCWtmcmVlKHN0cik7CisJa2ZyZWUoc3RyX3NhdmVkKTsKIAl6ZmNwX2luaXRfZGV2aWNlX2NvbmZpZ3VyZShidXNpZCwgd3dwbiwgbHVuKTsKIAlyZXR1cm47CiAKLSBlcnJfb3V0OgotCWtmcmVlKHN0cik7CitlcnJfb3V0OgorCWtmcmVlKHN0cl9zYXZlZCk7CiAJcHJfZXJyKCIlcyBpcyBub3QgYSB2YWxpZCBTQ1NJIGRldmljZVxuIiwgZGV2c3RyKTsKIH0KIApAQCAtNTkzLDEwICs2MDMsOCBAQAogCWludCByZXR2YWwgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5zY2FuX3dvcmspOwogCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPnN0YXRfd29yayk7CiAJemZjcF9mY193a2FfcG9ydHNfZm9yY2Vfb2ZmbGluZShhZGFwdGVyLT5ncyk7Ci0JemZjcF9hZGFwdGVyX3Njc2lfdW5yZWdpc3RlcihhZGFwdGVyKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldi5rb2JqLAogCQkJICAgJnpmY3Bfc3lzZnNfYWRhcHRlcl9hdHRycyk7CiAJZGV2X3NldF9kcnZkYXRhKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2N3LmMKaW5kZXggMGM5MGY4ZS4uZTA4MzM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2Njdy5jCkBAIC0xMDIsNiArMTAyLDE0IEBACiAJYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YSgmY2N3X2RldmljZS0+ZGV2KTsKIAlpZiAoIWFkYXB0ZXIpCiAJCWdvdG8gb3V0OworCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CisKKwljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5zY2FuX3dvcmspOworCisJbXV0ZXhfbG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CisKKwkvKiB0aGlzIGFsc28gcmVtb3ZlcyB0aGUgc2NzaSBkZXZpY2VzLCBzbyBjYWxsIGl0IGZpcnN0ICovCisJemZjcF9hZGFwdGVyX3Njc2lfdW5yZWdpc3RlcihhZGFwdGVyKTsKIAogCXdyaXRlX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCBwLCAmYWRhcHRlci0+cG9ydF9saXN0X2hlYWQsIGxpc3QpIHsKQEAgLTExNywxMSArMTI1LDggQEAKIAl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcnQsIHAsICZwb3J0X3JlbW92ZV9saCwgbGlzdCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW5pdCwgdSwgJnVuaXRfcmVtb3ZlX2xoLCBsaXN0KSB7Ci0JCQlpZiAodW5pdC0+ZGV2aWNlKQotCQkJCXNjc2lfcmVtb3ZlX2RldmljZSh1bml0LT5kZXZpY2UpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW5pdCwgdSwgJnVuaXRfcmVtb3ZlX2xoLCBsaXN0KQogCQkJemZjcF91bml0X2RlcXVldWUodW5pdCk7Ci0JCX0KIAkJemZjcF9wb3J0X2RlcXVldWUocG9ydCk7CiAJfQogCXdhaXRfZXZlbnQoYWRhcHRlci0+cmVtb3ZlX3dxLCBhdG9taWNfcmVhZCgmYWRhcHRlci0+cmVmY291bnQpID09IDApOwpAQCAtMTkyLDEzICsxOTcsOSBAQAogCiAJbXV0ZXhfbG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CiAJYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YSgmY2N3X2RldmljZS0+ZGV2KTsKLQlpZiAoIWFkYXB0ZXIpCi0JCWdvdG8gb3V0OwotCiAJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwLCAiY2Nzb2ZmMSIsIE5VTEwpOwogCXpmY3BfZXJwX3dhaXQoYWRhcHRlcik7CiAJbXV0ZXhfdW5sb2NrKCZ6ZmNwX2RhdGEuY29uZmlnX211dGV4KTsKLW91dDoKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjUzLDEzICsyNTQsMTcgQEAKIAogCW11dGV4X2xvY2soJnpmY3BfZGF0YS5jb25maWdfbXV0ZXgpOwogCWFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJmNkZXYtPmRldik7CisJaWYgKCFhZGFwdGVyKQorCQlnb3RvIG91dDsKKwogCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCwgImNjc2h1dDEiLCBOVUxMKTsKIAl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOwogCXpmY3BfZXJwX3RocmVhZF9raWxsKGFkYXB0ZXIpOworb3V0OgogCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2N3X2RyaXZlciB6ZmNwX2Njd19kcml2ZXIgPSB7CitzdHJ1Y3QgY2N3X2RyaXZlciB6ZmNwX2Njd19kcml2ZXIgPSB7CiAJLm93bmVyICAgICAgID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgICAgICAgID0gInpmY3AiLAogCS5pZHMgICAgICAgICA9IHpmY3BfY2N3X2RldmljZV9pZCwKQEAgLTI4NCwyMCArMjg5LDMgQEAKIHsKIAlyZXR1cm4gY2N3X2RyaXZlcl9yZWdpc3RlcigmemZjcF9jY3dfZHJpdmVyKTsKIH0KLQotLyoqCi0gKiB6ZmNwX2dldF9hZGFwdGVyX2J5X2J1c2lkIC0gZmluZCB6ZmNwX2FkYXB0ZXIgc3RydWN0Ci0gKiBAYnVzaWQ6IGJ1cyBpZCBzdHJpbmcgb2YgemZjcCBhZGFwdGVyIHRvIGZpbmQKLSAqLwotc3RydWN0IHpmY3BfYWRhcHRlciAqemZjcF9nZXRfYWRhcHRlcl9ieV9idXNpZChjaGFyICpidXNpZCkKLXsKLQlzdHJ1Y3QgY2N3X2RldmljZSAqY2N3X2RldmljZTsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gTlVMTDsKLQotCWNjd19kZXZpY2UgPSBnZXRfY2N3ZGV2X2J5X2J1c2lkKCZ6ZmNwX2Njd19kcml2ZXIsIGJ1c2lkKTsKLQlpZiAoY2N3X2RldmljZSkgewotCQlhZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYpOwotCQlwdXRfZGV2aWNlKCZjY3dfZGV2aWNlLT5kZXYpOwotCX0KLQlyZXR1cm4gYWRhcHRlcjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2ZkYy5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jZmRjLmMKaW5kZXggODMwNWM4Ny4uZWY2ODFkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jZmRjLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jZmRjLmMKQEAgLTg2LDggKzg2LDIzIEBACiBzdGF0aWMgc3RydWN0IHpmY3BfYWRhcHRlciAqemZjcF9jZmRjX2dldF9hZGFwdGVyKHUzMiBkZXZubykKIHsKIAljaGFyIGJ1c2lkWzldOworCXN0cnVjdCBjY3dfZGV2aWNlICpjY3dkZXY7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IE5VTEw7CisKIAlzbnByaW50ZihidXNpZCwgc2l6ZW9mKGJ1c2lkKSwgIjAuMC4lMDR4IiwgZGV2bm8pOwotCXJldHVybiB6ZmNwX2dldF9hZGFwdGVyX2J5X2J1c2lkKGJ1c2lkKTsKKwljY3dkZXYgPSBnZXRfY2N3ZGV2X2J5X2J1c2lkKCZ6ZmNwX2Njd19kcml2ZXIsIGJ1c2lkKTsKKwlpZiAoIWNjd2RldikKKwkJZ290byBvdXQ7CisKKwlhZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjY3dkZXYtPmRldik7CisJaWYgKCFhZGFwdGVyKQorCQlnb3RvIG91dF9wdXQ7CisKKwl6ZmNwX2FkYXB0ZXJfZ2V0KGFkYXB0ZXIpOworb3V0X3B1dDoKKwlwdXRfZGV2aWNlKCZjY3dkZXYtPmRldik7CitvdXQ6CisJcmV0dXJuIGFkYXB0ZXI7CiB9CiAKIHN0YXRpYyBpbnQgemZjcF9jZmRjX3NldF9mc2Yoc3RydWN0IHpmY3BfZnNmX2NmZGMgKmZzZl9jZmRjLCBpbnQgY29tbWFuZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCmluZGV4IDczZDM2NmIuLmY3M2UyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYwpAQCAtODU4LDEwICs4NTgsNyBAQAogCQlpZiAoZmNfaG9zdF9wb3J0X3R5cGUoYWRhcHRlci0+c2NzaV9ob3N0KSA9PSBGQ19QT1JUVFlQRV9QVFApCiAJCQlyZXR1cm4gemZjcF9lcnBfb3Blbl9wdHBfcG9ydChhY3QpOwogCQlpZiAoIXBvcnQtPmRfaWQpIHsKLQkJCXpmY3BfcG9ydF9nZXQocG9ydCk7Ci0JCQlpZiAoIXF1ZXVlX3dvcmsoYWRhcHRlci0+d29ya19xdWV1ZSwKLQkJCQkJJnBvcnQtPmdpZF9wbl93b3JrKSkKLQkJCQl6ZmNwX3BvcnRfcHV0KHBvcnQpOworCQkJemZjcF9mY190cmlnZ2VyX2RpZF9sb29rdXAocG9ydCk7CiAJCQlyZXR1cm4gWkZDUF9FUlBfRVhJVDsKIAkJfQogCQlyZXR1cm4gemZjcF9lcnBfcG9ydF9zdHJhdGVneV9vcGVuX3BvcnQoYWN0KTsKQEAgLTg2OSwxMiArODY2LDExIEBACiAJY2FzZSBaRkNQX0VSUF9TVEVQX1BPUlRfT1BFTklORzoKIAkJLyogRF9JRCBtaWdodCBoYXZlIGNoYW5nZWQgZHVyaW5nIG9wZW4gKi8KIAkJaWYgKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4pIHsKLQkJCWlmIChwb3J0LT5kX2lkKQotCQkJCXJldHVybiBaRkNQX0VSUF9TVUNDRUVERUQ7Ci0JCQllbHNlIHsKLQkJCQlhY3QtPnN0ZXAgPSBaRkNQX0VSUF9TVEVQX1BPUlRfQ0xPU0lORzsKLQkJCQlyZXR1cm4gWkZDUF9FUlBfQ09OVElOVUVTOworCQkJaWYgKCFwb3J0LT5kX2lkKSB7CisJCQkJemZjcF9mY190cmlnZ2VyX2RpZF9sb29rdXAocG9ydCk7CisJCQkJcmV0dXJuIFpGQ1BfRVJQX0VYSVQ7CiAJCQl9CisJCQlyZXR1cm4gWkZDUF9FUlBfU1VDQ0VFREVEOwogCQl9CiAJCWlmIChwb3J0LT5kX2lkICYmICEocF9zdGF0dXMgJiBaRkNQX1NUQVRVU19DT01NT05fTk9FU0MpKSB7CiAJCQlwb3J0LT5kX2lkID0gMDsKQEAgLTg4OSwxOSArODg1LDIxIEBACiBzdGF0aWMgaW50IHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3koc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqZXJwX2FjdGlvbikKIHsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0ID0gZXJwX2FjdGlvbi0+cG9ydDsKKwlpbnQgcF9zdGF0dXMgPSBhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKTsKIAotCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9OT0VTQykKKwlpZiAoKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfQ09NTU9OX05PRVNDKSAmJgorCSAgICAhKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4pKQogCQlnb3RvIGNsb3NlX2luaXRfZG9uZTsKIAogCXN3aXRjaCAoZXJwX2FjdGlvbi0+c3RlcCkgewogCWNhc2UgWkZDUF9FUlBfU1RFUF9VTklOSVRJQUxJWkVEOgogCQl6ZmNwX2VycF9wb3J0X3N0cmF0ZWd5X2NsZWFyc3RhdGkocG9ydCk7Ci0JCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9PUEVOKQorCQlpZiAocF9zdGF0dXMgJiBaRkNQX1NUQVRVU19DT01NT05fT1BFTikKIAkJCXJldHVybiB6ZmNwX2VycF9wb3J0X3N0cmF0ZWd5X2Nsb3NlKGVycF9hY3Rpb24pOwogCQlicmVhazsKIAogCWNhc2UgWkZDUF9FUlBfU1RFUF9QT1JUX0NMT1NJTkc6Ci0JCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9PUEVOKQorCQlpZiAocF9zdGF0dXMgJiBaRkNQX1NUQVRVU19DT01NT05fT1BFTikKIAkJCXJldHVybiBaRkNQX0VSUF9GQUlMRUQ7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oCmluZGV4IDM2OTM1YmMuLmIzZjI4ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9leHQuaApAQCAtMjgsNyArMjgsNyBAQAogLyogemZjcF9jY3cuYyAqLwogZXh0ZXJuIGludCB6ZmNwX2Njd19yZWdpc3Rlcih2b2lkKTsKIGV4dGVybiBpbnQgemZjcF9jY3dfcHJpdl9zY2goc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKLWV4dGVybiBzdHJ1Y3QgemZjcF9hZGFwdGVyICp6ZmNwX2dldF9hZGFwdGVyX2J5X2J1c2lkKGNoYXIgKik7CitleHRlcm4gc3RydWN0IGNjd19kcml2ZXIgemZjcF9jY3dfZHJpdmVyOwogCiAvKiB6ZmNwX2NmZGMuYyAqLwogZXh0ZXJuIHN0cnVjdCBtaXNjZGV2aWNlIHpmY3BfY2ZkY19taXNjOwpAQCAtOTYsNiArOTYsNyBAQAogZXh0ZXJuIHZvaWQgX3pmY3BfZmNfc2Nhbl9wb3J0c19sYXRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2ZjX2luY29taW5nX2VscyhzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwogZXh0ZXJuIHZvaWQgemZjcF9mY19wb3J0X2RpZF9sb29rdXAoc3RydWN0IHdvcmtfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgemZjcF9mY190cmlnZ2VyX2RpZF9sb29rdXAoc3RydWN0IHpmY3BfcG9ydCAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZmNfcGxvZ2lfZXZhbHVhdGUoc3RydWN0IHpmY3BfcG9ydCAqLCBzdHJ1Y3QgZnNmX3Bsb2dpICopOwogZXh0ZXJuIHZvaWQgemZjcF9mY190ZXN0X2xpbmsoc3RydWN0IHpmY3BfcG9ydCAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZmNfbGlua190ZXN0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jCmluZGV4IDcyMmYyMmQuLmRmMjNiY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZjLmMKQEAgLTM2MSw2ICszNjEsMTcgQEAKIH0KIAogLyoqCisgKiB6ZmNwX2ZjX3RyaWdnZXJfZGlkX2xvb2t1cCAtIHRyaWdnZXIgdGhlIGRfaWQgbG9va3VwIHVzaW5nIGEgR0lEX1BOIHJlcXVlc3QKKyAqIEBwb3J0OiBUaGUgemZjcF9wb3J0IHRvIGxvb2t1cCB0aGUgZF9pZCBmb3IuCisgKi8KK3ZvaWQgemZjcF9mY190cmlnZ2VyX2RpZF9sb29rdXAoc3RydWN0IHpmY3BfcG9ydCAqcG9ydCkKK3sKKwl6ZmNwX3BvcnRfZ2V0KHBvcnQpOworCWlmICghcXVldWVfd29yayhwb3J0LT5hZGFwdGVyLT53b3JrX3F1ZXVlLCAmcG9ydC0+Z2lkX3BuX3dvcmspKQorCQl6ZmNwX3BvcnRfcHV0KHBvcnQpOworfQorCisvKioKICAqIHpmY3BfZmNfcGxvZ2lfZXZhbHVhdGUgLSBldmFsdWF0ZSBQTE9HSSBwbGF5bG9hZAogICogQHBvcnQ6IHpmY3BfcG9ydCBzdHJ1Y3R1cmUKICAqIEBwbG9naTogcGxvZ2kgcGF5bG9hZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKaW5kZXggZjA5Yzg2My4uNGU0MWJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCkBAIC0xMDU4LDE0ICsxMDU4LDI4IEBACiAJYnl0ZXMgPSB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhhZGFwdGVyLT5xZGlvLCAmcmVxLT5xdWV1ZV9yZXEsCiAJCQkJCVNCQUxfRkxBR1MwX1RZUEVfV1JJVEVfUkVBRCwKIAkJCQkJc2dfcmVzcCwgbWF4X3NiYWxzKTsKKwlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnJlc3BfYnVmX2xlbmd0aCA9IGJ5dGVzOwogCWlmIChieXRlcyA8PSAwKQogCQlyZXR1cm4gLUVJTzsKIAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpmY3BfZnNmX3NldHVwX2N0X2VscyhzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEsCisJCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcmVxLAorCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3Jlc3AsCisJCQkJIGludCBtYXhfc2JhbHMpCit7CisJaW50IHJldDsKKworCXJldCA9IHpmY3BfZnNmX3NldHVwX2N0X2Vsc19zYmFscyhyZXEsIHNnX3JlcSwgc2dfcmVzcCwgbWF4X3NiYWxzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJLyogY29tbW9uIHNldHRpbmdzIGZvciBjdC9ncyBhbmQgZWxzIHJlcXVlc3RzICovCi0JcmVxLT5xdGNiLT5ib3R0b20uc3VwcG9ydC5yZXNwX2J1Zl9sZW5ndGggPSBieXRlczsKIAlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnNlcnZpY2VfY2xhc3MgPSBGU0ZfQ0xBU1NfMzsKIAlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnRpbWVvdXQgPSAyICogUl9BX1RPVjsKLQl6ZmNwX2ZzZl9zdGFydF90aW1lcihyZXEsIDIgKiBSX0FfVE9WICsgMTApOworCXpmY3BfZnNmX3N0YXJ0X3RpbWVyKHJlcSwgKDIgKiBSX0FfVE9WICsgMTApICogSFopOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDk0LDggKzExMDgsOCBAQAogCX0KIAogCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9DTEVBTlVQOwotCXJldCA9IHpmY3BfZnNmX3NldHVwX2N0X2Vsc19zYmFscyhyZXEsIGN0LT5yZXEsIGN0LT5yZXNwLAotCQkJCQkgIEZTRl9NQVhfU0JBTFNfUEVSX1JFUSk7CisJcmV0ID0gemZjcF9mc2Zfc2V0dXBfY3RfZWxzKHJlcSwgY3QtPnJlcSwgY3QtPnJlc3AsCisJCQkJICAgIEZTRl9NQVhfU0JBTFNfUEVSX1JFUSk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWRfc2VuZDsKIApAQCAtMTE5Miw3ICsxMjA2LDcgQEAKIAl9CiAKIAlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfQ0xFQU5VUDsKLQlyZXQgPSB6ZmNwX2ZzZl9zZXR1cF9jdF9lbHNfc2JhbHMocmVxLCBlbHMtPnJlcSwgZWxzLT5yZXNwLCAyKTsKKwlyZXQgPSB6ZmNwX2ZzZl9zZXR1cF9jdF9lbHMocmVxLCBlbHMtPnJlcSwgZWxzLT5yZXNwLCAyKTsKIAogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkX3NlbmQ7CkBAIC0xNDYxLDkgKzE0NzUsMTYgQEAKIAkJcGxvZ2kgPSAoc3RydWN0IGZzZl9wbG9naSAqKSByZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LmVsczsKIAkJaWYgKHJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZWxzMV9sZW5ndGggPj0KIAkJICAgIEZTRl9QTE9HSV9NSU5fTEVOKSB7Ci0JCQlpZiAocGxvZ2ktPnNlcnZfcGFyYW0ud3dwbiAhPSBwb3J0LT53d3BuKQorCQkJaWYgKHBsb2dpLT5zZXJ2X3BhcmFtLnd3cG4gIT0gcG9ydC0+d3dwbikgewogCQkJCXBvcnQtPmRfaWQgPSAwOwotCQkJZWxzZSB7CisJCQkJZGV2X3dhcm4oJnBvcnQtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKKwkJCQkJICJBIHBvcnQgb3BlbmVkIHdpdGggV1dQTiAweCUwMTZMeCAiCisJCQkJCSAicmV0dXJuZWQgZGF0YSB0aGF0IGlkZW50aWZpZXMgaXQgYXMgIgorCQkJCQkgIldXUE4gMHglMDE2THhcbiIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBwb3J0LT53d3BuLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJICBwbG9naS0+c2Vydl9wYXJhbS53d3BuKTsKKwkJCX0gZWxzZSB7CiAJCQkJcG9ydC0+d3dubiA9IHBsb2dpLT5zZXJ2X3BhcmFtLnd3bm47CiAJCQkJemZjcF9mY19wbG9naV9ldmFsdWF0ZShwb3J0LCBwbG9naSk7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzLmMKaW5kZXggMDc5YThjZi4uZDMxMDAwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnMuYwpAQCAtMjI0LDYgKzIyNCw3IEBACiAKIAl6ZmNwX2VycF91bml0X3Jlb3Blbih1bml0LCAwLCAic3l1YXNfMSIsIE5VTEwpOwogCXpmY3BfZXJwX3dhaXQodW5pdC0+cG9ydC0+YWRhcHRlcik7CisJZmx1c2hfd29yaygmdW5pdC0+c2NzaV93b3JrKTsKIAl6ZmNwX3VuaXRfcHV0KHVuaXQpOwogb3V0OgogCW11dGV4X3VubG9jaygmemZjcF9kYXRhLmNvbmZpZ19tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDgyYmIzYjIuLmUxMWNjYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC0zNjYsNiArMzY2LDcgQEAKIAogc291cmNlICJkcml2ZXJzL3Njc2kvY3hnYjNpL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc2NzaS9ibngyaS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3Njc2kvYmUyaXNjc2kvS2NvbmZpZyIKIAogY29uZmlnIFNHSVdEOTNfU0NTSQogCXRyaXN0YXRlICJTR0kgV0Q5M0M5MyBTQ1NJIERyaXZlciIKQEAgLTE4MjcsNiArMTgyOCwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbGlic3JwLgogCitjb25maWcgU0NTSV9CRkFfRkMKKwl0cmlzdGF0ZSAiQnJvY2FkZSBCRkEgRmlicmUgQ2hhbm5lbCBTdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwlzZWxlY3QgU0NTSV9GQ19BVFRSUworCWhlbHAKKwkgIFRoaXMgYmZhIGRyaXZlciBzdXBwb3J0cyBhbGwgQnJvY2FkZSBQQ0llIEZDL0ZDT0UgaG9zdCBhZGFwdGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYmZhLgorCiBlbmRpZiAjIFNDU0lfTE9XTEVWRUwKIAogc291cmNlICJkcml2ZXJzL3Njc2kvcGNtY2lhL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKaW5kZXggNjFhOTRhZi4uM2FkNjFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQpAQCAtODYsNiArODYsNyBAQAogb2JqLSQoQ09ORklHX1NDU0lfUUxBX0ZDKQkrPSBxbGEyeHh4Lwogb2JqLSQoQ09ORklHX1NDU0lfUUxBX0lTQ1NJKQkrPSBxbGE0eHh4Lwogb2JqLSQoQ09ORklHX1NDU0lfTFBGQykJCSs9IGxwZmMvCitvYmotJChDT05GSUdfU0NTSV9CRkFfRkMpCSs9IGJmYS8KIG9iai0kKENPTkZJR19TQ1NJX1BBUzE2KQkrPSBwYXMxNi5vCiBvYmotJChDT05GSUdfU0NTSV9UMTI4KQkJKz0gdDEyOC5vCiBvYmotJChDT05GSUdfU0NTSV9ETVgzMTkxRCkJKz0gZG14MzE5MWQubwpAQCAtMTMwLDYgKzEzMSw3IEBACiBvYmotJChDT05GSUdfUFMzX1JPTSkJCSs9IHBzM3JvbS5vCiBvYmotJChDT05GSUdfU0NTSV9DWEdCM19JU0NTSSkJKz0gbGliaXNjc2kubyBsaWJpc2NzaV90Y3AubyBjeGdiM2kvCiBvYmotJChDT05GSUdfU0NTSV9CTlgyX0lTQ1NJKQkrPSBsaWJpc2NzaS5vIGJueDJpLworb2JqLSQoQ09ORklHX0JFMklTQ1NJKQkJKz0gbGliaXNjc2kubyBiZTJpc2NzaS8KIG9iai0kKENPTkZJR19TQ1NJX1BNQ1JBSUQpCSs9IHBtY3JhaWQubwogCiBvYmotJChDT05GSUdfQVJNKQkJKz0gYXJtLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUyZmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL0tjb25maWcKQEAgLTAsMCArMSw4IEBACitjb25maWcgQkUySVNDU0kKKwl0cmlzdGF0ZSAiU2VydmVyRW5naW5lcycgMTBHYnBzIGlTQ1NJIC0gQmxhZGVFbmdpbmUgMiIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJc2VsZWN0IFNDU0lfSVNDU0lfQVRUUlMKKworCWhlbHAKKwlUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBpU0NTSSBmdW5jdGlvbmFsaXR5IGZvciBTZXJ2ZXJFbmdpbmVzJworCTEwR2JwcyBTdG9yYWdlIGFkYXB0ZXIgLSBCbGFkZUVuZ2luZSAyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMWY0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjIE1ha2VmaWxlIHRvIGJ1aWxkIHRoZSBpU0NTSSBkcml2ZXIgZm9yIFNlcnZlckVuZ2luZSdzIEJsYWRlRW5naW5lLgorIworIworCitvYmotJChDT05GSUdfQkUySVNDU0kpICs9IGJlMmlzY3NpLm8KKworYmUyaXNjc2kteSA6PSBiZV9pc2NzaS5vIGJlX21haW4ubyBiZV9tZ210Lm8gYmVfY21kcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjAyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmUuaApAQCAtMCwwICsxLDE4MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA5IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKworI2lmbmRlZiBCRUlTQ1NJX0gKKyNkZWZpbmUgQkVJU0NTSV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNkZWZpbmUgRldfVkVSX0xFTiAzMgorCitzdHJ1Y3QgYmVfZG1hX21lbSB7CisJdm9pZCAqdmE7CisJZG1hX2FkZHJfdCBkbWE7CisJdTMyIHNpemU7Cit9OworCitzdHJ1Y3QgYmVfcXVldWVfaW5mbyB7CisJc3RydWN0IGJlX2RtYV9tZW0gZG1hX21lbTsKKwl1MTYgbGVuOworCXUxNiBlbnRyeV9zaXplOwkJLyogU2l6ZSBvZiBhbiBlbGVtZW50IGluIHRoZSBxdWV1ZSAqLworCXUxNiBpZDsKKwl1MTYgdGFpbCwgaGVhZDsKKwlib29sIGNyZWF0ZWQ7CisJYXRvbWljX3QgdXNlZDsJCS8qIE51bWJlciBvZiB2YWxpZCBlbGVtZW50cyBpbiB0aGUgcXVldWUgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIE1PRFVMTyh1MTYgdmFsLCB1MTYgbGltaXQpCit7CisJV0FSTl9PTihsaW1pdCAmIChsaW1pdCAtIDEpKTsKKwlyZXR1cm4gdmFsICYgKGxpbWl0IC0gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmRleF9pbmModTE2ICppbmRleCwgdTE2IGxpbWl0KQoreworCSppbmRleCA9IE1PRFVMTygoKmluZGV4ICsgMSksIGxpbWl0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpxdWV1ZV9oZWFkX25vZGUoc3RydWN0IGJlX3F1ZXVlX2luZm8gKnEpCit7CisJcmV0dXJuIHEtPmRtYV9tZW0udmEgKyBxLT5oZWFkICogcS0+ZW50cnlfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpxdWV1ZV90YWlsX25vZGUoc3RydWN0IGJlX3F1ZXVlX2luZm8gKnEpCit7CisJcmV0dXJuIHEtPmRtYV9tZW0udmEgKyBxLT50YWlsICogcS0+ZW50cnlfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHF1ZXVlX2hlYWRfaW5jKHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxKQoreworCWluZGV4X2luYygmcS0+aGVhZCwgcS0+bGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHF1ZXVlX3RhaWxfaW5jKHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxKQoreworCWluZGV4X2luYygmcS0+dGFpbCwgcS0+bGVuKTsKK30KKworLypJU0NTSSAqLworCitzdHJ1Y3QgYmVfZXFfb2JqIHsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBxOworCWNoYXIgZGVzY1szMl07CisKKwkvKiBBZGFwdGl2ZSBpbnRlcnJ1cHQgY29hbGVzY2luZyAoQUlDKSBpbmZvICovCisJYm9vbCBlbmFibGVfYWljOworCXUxNiBtaW5fZXFkOwkJLyogaW4gdXNlY3MgKi8KKwl1MTYgbWF4X2VxZDsJCS8qIGluIHVzZWNzICovCisJdTE2IGN1cl9lcWQ7CQkvKiBpbiB1c2VjcyAqLworfTsKKworc3RydWN0IGJlX21jY19vYmogeworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcTsKK307CisKK3N0cnVjdCBiZV9jdHJsX2luZm8geworCXU4IF9faW9tZW0gKmNzcjsKKwl1OCBfX2lvbWVtICpkYjsJCS8qIERvb3IgQmVsbCAqLworCXU4IF9faW9tZW0gKnBjaWNmZzsJLyogUENJIGNvbmZpZyBzcGFjZSAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJLyogTWJveCB1c2VkIGZvciBjbWQgcmVxdWVzdC9yZXNwb25zZSAqLworCXNwaW5sb2NrX3QgbWJveF9sb2NrOwkvKiBGb3Igc2VyaWFsaXppbmcgbWJveCBjbWRzIHRvIEJFIGNhcmQgKi8KKwlzdHJ1Y3QgYmVfZG1hX21lbSBtYm94X21lbTsKKwkvKiBNYm94IG1lbSBpcyBhZGp1c3RlZCB0byBhbGlnbiB0byAxNiBieXRlcy4gVGhlIGFsbG9jYXRlZCBhZGRyCisJICogaXMgc3RvcmVkIGZvciBmcmVlaW5nIHB1cnBvc2UgKi8KKwlzdHJ1Y3QgYmVfZG1hX21lbSBtYm94X21lbV9hbGxvY2VkOworCisJLyogTUNDIFJpbmdzICovCisJc3RydWN0IGJlX21jY19vYmogbWNjX29iajsKKwlzcGlubG9ja190IG1jY19sb2NrOwkvKiBGb3Igc2VyaWFsaXppbmcgbWNjIGNtZHMgdG8gQkUgY2FyZCAqLworCXNwaW5sb2NrX3QgbWNjX2NxX2xvY2s7CisKKwkvKiBNQ0MgQXN5bmMgY2FsbGJhY2sgKi8KKwl2b2lkICgqYXN5bmNfY2IpICh2b2lkICphZGFwdGVyLCBib29sIGxpbmtfdXApOworCXZvaWQgKmFkYXB0ZXJfY3R4dDsKK307CisKKyNpbmNsdWRlICJiZV9jbWRzLmgiCisKKyNkZWZpbmUgUEFHRV9TSElGVF80SyAxMgorI2RlZmluZSBQQUdFX1NJWkVfNEsgKDEgPDwgUEFHRV9TSElGVF80SykKKworLyogUmV0dXJucyBudW1iZXIgb2YgcGFnZXMgc3Bhbm5lZCBieSB0aGUgZGF0YSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYWRkciAqLworI2RlZmluZSBQQUdFU180S19TUEFOTkVEKF9hZGRyZXNzLCBzaXplKSAJCQkJXAorCQkoKHUzMikoKCgoc2l6ZV90KShfYWRkcmVzcykgJiAoUEFHRV9TSVpFXzRLIC0gMSkpICsgCVwKKwkJCShzaXplKSArIChQQUdFX1NJWkVfNEsgLSAxKSkgPj4gUEFHRV9TSElGVF80SykpCisKKy8qIEJ5dGUgb2Zmc2V0IGludG8gdGhlIHBhZ2UgY29ycmVzcG9uZGluZyB0byBnaXZlbiBhZGRyZXNzICovCisjZGVmaW5lIE9GRlNFVF9JTl9QQUdFKGFkZHIpCQkJCQkJXAorCQkoKHNpemVfdCkoYWRkcikgJiAoUEFHRV9TSVpFXzRLLTEpKQorCisvKiBSZXR1cm5zIGJpdCBvZmZzZXQgd2l0aGluIGEgRFdPUkQgb2YgYSBiaXRmaWVsZCAqLworI2RlZmluZSBBTUFQX0JJVF9PRkZTRVQoX3N0cnVjdCwgZmllbGQpICAJCQkJXAorCQkoKChzaXplX3QpJigoKF9zdHJ1Y3QgKikwKS0+ZmllbGQpKSUzMikKKworLyogUmV0dXJucyB0aGUgYml0IG1hc2sgb2YgdGhlIGZpZWxkIHRoYXQgaXMgTk9UIHNoaWZ0ZWQgaW50byBsb2NhdGlvbi4gKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGFtYXBfbWFzayh1MzIgYml0c2l6ZSkKK3sKKwlyZXR1cm4gKGJpdHNpemUgPT0gMzIgPyAweEZGRkZGRkZGIDogKDEgPDwgYml0c2l6ZSkgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFtYXBfc2V0KHZvaWQgKnB0ciwgdTMyIGR3X29mZnNldCwgdTMyIG1hc2ssCisJCQkJCXUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgKmR3ID0gKHUzMiAqKSBwdHIgKyBkd19vZmZzZXQ7CisJKmR3ICY9IH4obWFzayA8PCBvZmZzZXQpOworCSpkdyB8PSAobWFzayAmIHZhbHVlKSA8PCBvZmZzZXQ7Cit9CisKKyNkZWZpbmUgQU1BUF9TRVRfQklUUyhfc3RydWN0LCBmaWVsZCwgcHRyLCB2YWwpCQkJCVwKKwkJYW1hcF9zZXQocHRyLAkJCQkJCVwKKwkJCW9mZnNldG9mKF9zdHJ1Y3QsIGZpZWxkKS8zMiwJCQlcCisJCQlhbWFwX21hc2soc2l6ZW9mKCgoX3N0cnVjdCAqKTApLT5maWVsZCkpLAlcCisJCQlBTUFQX0JJVF9PRkZTRVQoX3N0cnVjdCwgZmllbGQpLAkJXAorCQkJdmFsKQorCitzdGF0aWMgaW5saW5lIHUzMiBhbWFwX2dldCh2b2lkICpwdHIsIHUzMiBkd19vZmZzZXQsIHUzMiBtYXNrLCB1MzIgb2Zmc2V0KQoreworCXUzMiAqZHcgPSBwdHI7CisJcmV0dXJuIG1hc2sgJiAoKihkdyArIGR3X29mZnNldCkgPj4gb2Zmc2V0KTsKK30KKworI2RlZmluZSBBTUFQX0dFVF9CSVRTKF9zdHJ1Y3QsIGZpZWxkLCBwdHIpCQkJCVwKKwkJYW1hcF9nZXQocHRyLAkJCQkJCVwKKwkJCW9mZnNldG9mKF9zdHJ1Y3QsIGZpZWxkKS8zMiwJCQlcCisJCQlhbWFwX21hc2soc2l6ZW9mKCgoX3N0cnVjdCAqKTApLT5maWVsZCkpLAlcCisJCQlBTUFQX0JJVF9PRkZTRVQoX3N0cnVjdCwgZmllbGQpKQorCisjZGVmaW5lIGJlX2R3c19jcHVfdG9fbGUod3JiLCBsZW4pIHN3YXBfZHdzKHdyYiwgbGVuKQorI2RlZmluZSBiZV9kd3NfbGVfdG9fY3B1KHdyYiwgbGVuKSBzd2FwX2R3cyh3cmIsIGxlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2R3cyh2b2lkICp3cmIsIGludCBsZW4pCit7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTMyICpkdyA9IHdyYjsKKwlXQVJOX09OKGxlbiAlIDQpOworCWRvIHsKKwkJKmR3ID0gY3B1X3RvX2xlMzIoKmR3KTsKKwkJZHcrKzsKKwkJbGVuIC09IDQ7CisJfSB3aGlsZSAobGVuKTsKKyNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KK30KKworZXh0ZXJuIHZvaWQgYmVpc2NzaV9jcV9ub3RpZnkoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwgdTE2IHFpZCwgYm9vbCBhcm0sCisJCQkgICAgICB1MTYgbnVtX3BvcHBlZCk7CisKKyNlbmRpZiAvKiBCRUlTQ1NJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDA3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCkBAIC0wLDAgKzEsNTIzIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDkgU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworCisjaW5jbHVkZSAiYmUuaCIKKyNpbmNsdWRlICJiZV9tZ210LmgiCisjaW5jbHVkZSAiYmVfbWFpbi5oIgorCitzdGF0aWMgaW5saW5lIGJvb2wgYmVfbWNjX2NvbXBsX2lzX25ldyhzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbCkKK3sKKwlpZiAoY29tcGwtPmZsYWdzICE9IDApIHsKKwkJY29tcGwtPmZsYWdzID0gbGUzMl90b19jcHUoY29tcGwtPmZsYWdzKTsKKwkJV0FSTl9PTigoY29tcGwtPmZsYWdzICYgQ1FFX0ZMQUdTX1ZBTElEX01BU0spID09IDApOworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfbWNjX2NvbXBsX3VzZShzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbCkKK3sKKwljb21wbC0+ZmxhZ3MgPSAwOworfQorCitzdGF0aWMgaW50IGJlX21jY19jb21wbF9wcm9jZXNzKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCisJCQkJc3RydWN0IGJlX21jY19jb21wbCAqY29tcGwpCit7CisJdTE2IGNvbXBsX3N0YXR1cywgZXh0ZF9zdGF0dXM7CisKKwliZV9kd3NfbGVfdG9fY3B1KGNvbXBsLCA0KTsKKworCWNvbXBsX3N0YXR1cyA9IChjb21wbC0+c3RhdHVzID4+IENRRV9TVEFUVVNfQ09NUExfU0hJRlQpICYKKwkJCQkJQ1FFX1NUQVRVU19DT01QTF9NQVNLOworCWlmIChjb21wbF9zdGF0dXMgIT0gTUNDX1NUQVRVU19TVUNDRVNTKSB7CisJCWV4dGRfc3RhdHVzID0gKGNvbXBsLT5zdGF0dXMgPj4gQ1FFX1NUQVRVU19FWFREX1NISUZUKSAmCisJCQkJCQlDUUVfU1RBVFVTX0VYVERfTUFTSzsKKwkJZGV2X2VycigmY3RybC0+cGRldi0+ZGV2LAorCQkJImVycm9yIGluIGNtZCBjb21wbGV0aW9uOiBzdGF0dXMoY29tcGwvZXh0ZCk9JWQvJWRcbiIsCisJCQljb21wbF9zdGF0dXMsIGV4dGRfc3RhdHVzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2xpbmtfc3RhdGVfZXZ0KHUzMiB0cmFpbGVyKQoreworCXJldHVybiAoKCh0cmFpbGVyID4+IEFTWU5DX1RSQUlMRVJfRVZFTlRfQ09ERV9TSElGVCkgJgorCQlBU1lOQ19UUkFJTEVSX0VWRU5UX0NPREVfTUFTSykgPT0gQVNZTkNfRVZFTlRfQ09ERV9MSU5LX1NUQVRFKTsKK30KKwordm9pZCBiZWlzY3NpX2NxX25vdGlmeShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCB1MTYgcWlkLCBib29sIGFybSwKKwkJICAgICAgIHUxNiBudW1fcG9wcGVkKQoreworCXUzMiB2YWwgPSAwOworCXZhbCB8PSBxaWQgJiBEQl9DUV9SSU5HX0lEX01BU0s7CisJaWYgKGFybSkKKwkJdmFsIHw9IDEgPDwgREJfQ1FfUkVBUk1fU0hJRlQ7CisJdmFsIHw9IG51bV9wb3BwZWQgPDwgREJfQ1FfTlVNX1BPUFBFRF9TSElGVDsKKwlpb3dyaXRlMzIodmFsLCBjdHJsLT5kYiArIERCX0NRX09GRlNFVCk7Cit9CisKK3N0YXRpYyBpbnQgYmVfbWJveF9kYl9yZWFkeV93YWl0KHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpCit7CisjZGVmaW5lIGxvbmdfZGVsYXkgMjAwMAorCXZvaWQgX19pb21lbSAqZGIgPSBjdHJsLT5kYiArIE1QVV9NQUlMQk9YX0RCX09GRlNFVDsKKwlpbnQgY250ID0gMCwgd2FpdCA9IDU7CS8qIGluIHVzZWNzICovCisJdTMyIHJlYWR5OworCisJZG8geworCQlyZWFkeSA9IGlvcmVhZDMyKGRiKSAmIE1QVV9NQUlMQk9YX0RCX1JEWV9NQVNLOworCQlpZiAocmVhZHkpCisJCQlicmVhazsKKworCQlpZiAoY250ID4gNjAwMDAwMCkgeworCQkJZGV2X2VycigmY3RybC0+cGRldi0+ZGV2LCAibWJveF9kYiBwb2xsIHRpbWVkIG91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoY250ID4gNTApIHsKKwkJCXdhaXQgPSBsb25nX2RlbGF5OworCQkJbWRlbGF5KGxvbmdfZGVsYXkgLyAxMDAwKTsKKwkJfSBlbHNlCisJCQl1ZGVsYXkod2FpdCk7CisJCWNudCArPSB3YWl0OworCX0gd2hpbGUgKHRydWUpOworCXJldHVybiAwOworfQorCitpbnQgYmVfbWJveF9ub3RpZnkoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCkKK3sKKwlpbnQgc3RhdHVzOworCXUzMiB2YWwgPSAwOworCXZvaWQgX19pb21lbSAqZGIgPSBjdHJsLT5kYiArIE1QVV9NQUlMQk9YX0RCX09GRlNFVDsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqbWJveF9tZW0gPSAmY3RybC0+bWJveF9tZW07CisJc3RydWN0IGJlX21jY19tYWlsYm94ICptYm94ID0gbWJveF9tZW0tPnZhOworCXN0cnVjdCBiZV9tY2NfY29tcGwgKmNvbXBsID0gJm1ib3gtPmNvbXBsOworCisJdmFsICY9IH5NUFVfTUFJTEJPWF9EQl9SRFlfTUFTSzsKKwl2YWwgfD0gTVBVX01BSUxCT1hfREJfSElfTUFTSzsKKwl2YWwgfD0gKHVwcGVyXzMyX2JpdHMobWJveF9tZW0tPmRtYSkgPj4gMikgPDwgMjsKKwlpb3dyaXRlMzIodmFsLCBkYik7CisKKwlzdGF0dXMgPSBiZV9tYm94X2RiX3JlYWR5X3dhaXQoY3RybCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVNFX0RFQlVHKERCR19MVkxfMSwgIiBiZV9tYm94X2RiX3JlYWR5X3dhaXQgZmFpbGVkIDFcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwl2YWwgPSAwOworCXZhbCAmPSB+TVBVX01BSUxCT1hfREJfUkRZX01BU0s7CisJdmFsICY9IH5NUFVfTUFJTEJPWF9EQl9ISV9NQVNLOworCXZhbCB8PSAodTMyKSAobWJveF9tZW0tPmRtYSA+PiA0KSA8PCAyOworCWlvd3JpdGUzMih2YWwsIGRiKTsKKworCXN0YXR1cyA9IGJlX21ib3hfZGJfcmVhZHlfd2FpdChjdHJsKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiIGJlX21ib3hfZGJfcmVhZHlfd2FpdCBmYWlsZWQgMlxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChiZV9tY2NfY29tcGxfaXNfbmV3KGNvbXBsKSkgeworCQlzdGF0dXMgPSBiZV9tY2NfY29tcGxfcHJvY2VzcyhjdHJsLCAmbWJveC0+Y29tcGwpOworCQliZV9tY2NfY29tcGxfdXNlKGNvbXBsKTsKKwkJaWYgKHN0YXR1cykgeworCQkJU0VfREVCVUcoREJHX0xWTF8xLCAiQWZ0ZXIgYmVfbWNjX2NvbXBsX3Byb2Nlc3MgXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZXJyKCZjdHJsLT5wZGV2LT5kZXYsICJpbnZhbGlkIG1haWxib3ggY29tcGxldGlvblxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmVfd3JiX2hkcl9wcmVwYXJlKHN0cnVjdCBiZV9tY2Nfd3JiICp3cmIsIGludCBwYXlsb2FkX2xlbiwKKwkJCQlib29sIGVtYmVkZGVkLCB1OCBzZ2VfY250KQoreworCWlmIChlbWJlZGRlZCkKKwkJd3JiLT5lbWJlZGRlZCB8PSBNQ0NfV1JCX0VNQkVEREVEX01BU0s7CisJZWxzZQorCQl3cmItPmVtYmVkZGVkIHw9IChzZ2VfY250ICYgTUNDX1dSQl9TR0VfQ05UX01BU0spIDw8CisJCQkJCQlNQ0NfV1JCX1NHRV9DTlRfU0hJRlQ7CisJd3JiLT5wYXlsb2FkX2xlbmd0aCA9IHBheWxvYWRfbGVuOworCWJlX2R3c19jcHVfdG9fbGUod3JiLCA4KTsKK30KKwordm9pZCBiZV9jbWRfaGRyX3ByZXBhcmUoc3RydWN0IGJlX2NtZF9yZXFfaGRyICpyZXFfaGRyLAorCQkJdTggc3Vic3lzdGVtLCB1OCBvcGNvZGUsIGludCBjbWRfbGVuKQoreworCXJlcV9oZHItPm9wY29kZSA9IG9wY29kZTsKKwlyZXFfaGRyLT5zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07CisJcmVxX2hkci0+cmVxdWVzdF9sZW5ndGggPSBjcHVfdG9fbGUzMihjbWRfbGVuIC0gc2l6ZW9mKCpyZXFfaGRyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGJlX2NtZF9wYWdlX2FkZHJzX3ByZXBhcmUoc3RydWN0IHBoeXNfYWRkciAqcGFnZXMsIHUzMiBtYXhfcGFnZXMsCisJCQkJCQkJc3RydWN0IGJlX2RtYV9tZW0gKm1lbSkKK3sKKwlpbnQgaSwgYnVmX3BhZ2VzOworCXU2NCBkbWEgPSAodTY0KSBtZW0tPmRtYTsKKworCWJ1Zl9wYWdlcyA9IG1pbihQQUdFU180S19TUEFOTkVEKG1lbS0+dmEsIG1lbS0+c2l6ZSksIG1heF9wYWdlcyk7CisJZm9yIChpID0gMDsgaSA8IGJ1Zl9wYWdlczsgaSsrKSB7CisJCXBhZ2VzW2ldLmxvID0gY3B1X3RvX2xlMzIoZG1hICYgMHhGRkZGRkZGRik7CisJCXBhZ2VzW2ldLmhpID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhkbWEpKTsKKwkJZG1hICs9IFBBR0VfU0laRV80SzsKKwl9Cit9CisKK3N0YXRpYyB1MzIgZXFfZGVsYXlfdG9fbXVsdCh1MzIgdXNlY19kZWxheSkKK3sKKyNkZWZpbmUgTUFYX0lOVFJfUkFURSA2NTEwNDIKKwljb25zdCB1MzIgcm91bmQgPSAxMDsKKwl1MzIgbXVsdGlwbGllcjsKKworCWlmICh1c2VjX2RlbGF5ID09IDApCisJCW11bHRpcGxpZXIgPSAwOworCWVsc2UgeworCQl1MzIgaW50ZXJydXB0X3JhdGUgPSAxMDAwMDAwIC8gdXNlY19kZWxheTsKKwkJaWYgKGludGVycnVwdF9yYXRlID09IDApCisJCQltdWx0aXBsaWVyID0gMTAyMzsKKwkJZWxzZSB7CisJCQltdWx0aXBsaWVyID0gKE1BWF9JTlRSX1JBVEUgLSBpbnRlcnJ1cHRfcmF0ZSkgKiByb3VuZDsKKwkJCW11bHRpcGxpZXIgLz0gaW50ZXJydXB0X3JhdGU7CisJCQltdWx0aXBsaWVyID0gKG11bHRpcGxpZXIgKyByb3VuZCAvIDIpIC8gcm91bmQ7CisJCQltdWx0aXBsaWVyID0gbWluKG11bHRpcGxpZXIsICh1MzIpIDEwMjMpOworCQl9CisJfQorCXJldHVybiBtdWx0aXBsaWVyOworfQorCitzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiX2Zyb21fbWJveChzdHJ1Y3QgYmVfZG1hX21lbSAqbWJveF9tZW0pCit7CisJcmV0dXJuICYoKHN0cnVjdCBiZV9tY2NfbWFpbGJveCAqKShtYm94X21lbS0+dmEpKS0+d3JiOworfQorCitpbnQgYmVpc2NzaV9jbWRfZXFfY3JlYXRlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCisJCQkgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcSwgaW50IGVxX2RlbGF5KQoreworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7CisJc3RydWN0IGJlX2NtZF9yZXFfZXFfY3JlYXRlICpyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisJc3RydWN0IGJlX2NtZF9yZXNwX2VxX2NyZWF0ZSAqcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqcV9tZW0gPSAmZXEtPmRtYV9tZW07CisJaW50IHN0YXR1czsKKworCXNwaW5fbG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwltZW1zZXQod3JiLCAwLCBzaXplb2YoKndyYikpOworCisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKKworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAorCQkJT1BDT0RFX0NPTU1PTl9FUV9DUkVBVEUsIHNpemVvZigqcmVxKSk7CisKKwlyZXEtPm51bV9wYWdlcyA9IGNwdV90b19sZTE2KFBBR0VTXzRLX1NQQU5ORUQocV9tZW0tPnZhLCBxX21lbS0+c2l6ZSkpOworCisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9jb250ZXh0LCBmdW5jLCByZXEtPmNvbnRleHQsCisJCQkJCQlQQ0lfRlVOQyhjdHJsLT5wZGV2LT5kZXZmbikpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfY29udGV4dCwgdmFsaWQsIHJlcS0+Y29udGV4dCwgMSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9jb250ZXh0LCBzaXplLCByZXEtPmNvbnRleHQsIDApOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfY29udGV4dCwgY291bnQsIHJlcS0+Y29udGV4dCwKKwkJCQkJX19pbG9nMl91MzIoZXEtPmxlbiAvIDI1NikpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfY29udGV4dCwgZGVsYXltdWx0LCByZXEtPmNvbnRleHQsCisJCQkJCWVxX2RlbGF5X3RvX211bHQoZXFfZGVsYXkpKTsKKwliZV9kd3NfY3B1X3RvX2xlKHJlcS0+Y29udGV4dCwgc2l6ZW9mKHJlcS0+Y29udGV4dCkpOworCisJYmVfY21kX3BhZ2VfYWRkcnNfcHJlcGFyZShyZXEtPnBhZ2VzLCBBUlJBWV9TSVpFKHJlcS0+cGFnZXMpLCBxX21lbSk7CisKKwlzdGF0dXMgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKKwlpZiAoIXN0YXR1cykgeworCQllcS0+aWQgPSBsZTE2X3RvX2NwdShyZXNwLT5lcV9pZCk7CisJCWVxLT5jcmVhdGVkID0gdHJ1ZTsKKwl9CisJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGJlX2NtZF9md19pbml0aWFsaXplKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpCit7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlpbnQgc3RhdHVzOworCXU4ICplbmRpYW5fY2hlY2s7CisKKwlzcGluX2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKKworCWVuZGlhbl9jaGVjayA9ICh1OCAqKSB3cmI7CisJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwkqZW5kaWFuX2NoZWNrKysgPSAweDEyOworCSplbmRpYW5fY2hlY2srKyA9IDB4MzQ7CisJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwkqZW5kaWFuX2NoZWNrKysgPSAweEZGOworCSplbmRpYW5fY2hlY2srKyA9IDB4NTY7CisJKmVuZGlhbl9jaGVjaysrID0gMHg3ODsKKwkqZW5kaWFuX2NoZWNrKysgPSAweEZGOworCWJlX2R3c19jcHVfdG9fbGUod3JiLCBzaXplb2YoKndyYikpOworCisJc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJaWYgKHN0YXR1cykKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiYmVfY21kX2Z3X2luaXRpYWxpemUgRmFpbGVkIFxuIik7CisKKwlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYmVpc2NzaV9jbWRfY3FfY3JlYXRlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCisJCQkgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSwgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxLAorCQkJICBib29sIHNvbF9ldnRzLCBib29sIG5vX2RlbGF5LCBpbnQgY29hbGVzY2Vfd20pCit7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9jcV9jcmVhdGUgKnJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwlzdHJ1Y3QgYmVfY21kX3Jlc3BfY3FfY3JlYXRlICpyZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCXN0cnVjdCBiZV9kbWFfbWVtICpxX21lbSA9ICZjcS0+ZG1hX21lbTsKKwl2b2lkICpjdHh0ID0gJnJlcS0+Y29udGV4dDsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCisJCQlPUENPREVfQ09NTU9OX0NRX0NSRUFURSwgc2l6ZW9mKCpyZXEpKTsKKworCWlmICghcV9tZW0tPnZhKQorCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJ1bmluaXRpYWxpemVkIHFfbWVtLT52YVxuIik7CisKKwlyZXEtPm51bV9wYWdlcyA9IGNwdV90b19sZTE2KFBBR0VTXzRLX1NQQU5ORUQocV9tZW0tPnZhLCBxX21lbS0+c2l6ZSkpOworCisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0LCBjb2FsZXNjd20sIGN0eHQsIGNvYWxlc2NlX3dtKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2NxX2NvbnRleHQsIG5vZGVsYXksIGN0eHQsIG5vX2RlbGF5KTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2NxX2NvbnRleHQsIGNvdW50LCBjdHh0LAorCQkgICAgICBfX2lsb2cyX3UzMihjcS0+bGVuIC8gMjU2KSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0LCB2YWxpZCwgY3R4dCwgMSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0LCBzb2xldmVudCwgY3R4dCwgc29sX2V2dHMpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfY3FfY29udGV4dCwgZXZlbnRhYmxlLCBjdHh0LCAxKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2NxX2NvbnRleHQsIGVxaWQsIGN0eHQsIGVxLT5pZCk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0LCBhcm1lZCwgY3R4dCwgMSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0LCBmdW5jLCBjdHh0LAorCQkgICAgICBQQ0lfRlVOQyhjdHJsLT5wZGV2LT5kZXZmbikpOworCWJlX2R3c19jcHVfdG9fbGUoY3R4dCwgc2l6ZW9mKHJlcS0+Y29udGV4dCkpOworCisJYmVfY21kX3BhZ2VfYWRkcnNfcHJlcGFyZShyZXEtPnBhZ2VzLCBBUlJBWV9TSVpFKHJlcS0+cGFnZXMpLCBxX21lbSk7CisKKwlzdGF0dXMgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKKwlpZiAoIXN0YXR1cykgeworCQljcS0+aWQgPSBsZTE2X3RvX2NwdShyZXNwLT5jcV9pZCk7CisJCWNxLT5jcmVhdGVkID0gdHJ1ZTsKKwl9IGVsc2UKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiSW4gYmVfY21kX2NxX2NyZWF0ZSwgc3RhdHVzPW94JTA4eCBcbiIsCisJCQlzdGF0dXMpOworCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHUzMiBiZV9lbmNvZGVkX3FfbGVuKGludCBxX2xlbikKK3sKKwl1MzIgbGVuX2VuY29kZWQgPSBmbHMocV9sZW4pOwkvKiBsb2cyKGxlbikgKyAxICovCisJaWYgKGxlbl9lbmNvZGVkID09IDE2KQorCQlsZW5fZW5jb2RlZCA9IDA7CisJcmV0dXJuIGxlbl9lbmNvZGVkOworfQoraW50IGJlaXNjc2lfY21kX3FfZGVzdHJveShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcSwKKwkJCSAgaW50IHF1ZXVlX3R5cGUpCit7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9xX2Rlc3Ryb3kgKnJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwl1OCBzdWJzeXMgPSAwLCBvcGNvZGUgPSAwOworCWludCBzdGF0dXM7CisKKwlzcGluX2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCisJc3dpdGNoIChxdWV1ZV90eXBlKSB7CisJY2FzZSBRVFlQRV9FUToKKwkJc3Vic3lzID0gQ01EX1NVQlNZU1RFTV9DT01NT047CisJCW9wY29kZSA9IE9QQ09ERV9DT01NT05fRVFfREVTVFJPWTsKKwkJYnJlYWs7CisJY2FzZSBRVFlQRV9DUToKKwkJc3Vic3lzID0gQ01EX1NVQlNZU1RFTV9DT01NT047CisJCW9wY29kZSA9IE9QQ09ERV9DT01NT05fQ1FfREVTVFJPWTsKKwkJYnJlYWs7CisJY2FzZSBRVFlQRV9XUkJROgorCQlzdWJzeXMgPSBDTURfU1VCU1lTVEVNX0lTQ1NJOworCQlvcGNvZGUgPSBPUENPREVfQ09NTU9OX0lTQ1NJX1dSQlFfREVTVFJPWTsKKwkJYnJlYWs7CisJY2FzZSBRVFlQRV9EUERVUToKKwkJc3Vic3lzID0gQ01EX1NVQlNZU1RFTV9JU0NTSTsKKwkJb3Bjb2RlID0gT1BDT0RFX0NPTU1PTl9JU0NTSV9ERUZRX0RFU1RST1k7CisJCWJyZWFrOworCWNhc2UgUVRZUEVfU0dMOgorCQlzdWJzeXMgPSBDTURfU1VCU1lTVEVNX0lTQ1NJOworCQlvcGNvZGUgPSBPUENPREVfQ09NTU9OX0lTQ1NJX0NGR19SRU1PVkVfU0dMX1BBR0VTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwkJQlVHKCk7CisJCXJldHVybiAtMTsKKwl9CisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgc3Vic3lzLCBvcGNvZGUsIHNpemVvZigqcmVxKSk7CisJaWYgKHF1ZXVlX3R5cGUgIT0gUVRZUEVfU0dMKQorCQlyZXEtPmlkID0gY3B1X3RvX2xlMTYocS0+aWQpOworCisJc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisKKwlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYmVfY21kX2dldF9tYWNfYWRkcihzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCB1OCAqbWFjX2FkZHIpCit7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfbWFjX2FkZHIgKnJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0lTQ1NJLAorCQkJICAgT1BDT0RFX0NPTU1PTl9JU0NTSV9OVFdLX0dFVF9OSUNfQ09ORklHLAorCQkJICAgc2l6ZW9mKCpyZXEpKTsKKworCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBiZV9jbWRfcmVzcF9nZXRfbWFjX2FkZHIgKnJlc3AgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisKKwkJbWVtY3B5KG1hY19hZGRyLCByZXNwLT5tYWNfYWRkcmVzcywgRVRIX0FMRU4pOworCX0KKworCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBiZV9jbWRfY3JlYXRlX2RlZmF1bHRfcGR1X3F1ZXVlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCisJCQkJICAgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSwKKwkJCQkgICAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmRxLCBpbnQgbGVuZ3RoLAorCQkJCSAgICBpbnQgZW50cnlfc2l6ZSkKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCBiZV9kZWZxX2NyZWF0ZV9yZXEgKnJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqcV9tZW0gPSAmZHEtPmRtYV9tZW07CisJdm9pZCAqY3R4dCA9ICZyZXEtPmNvbnRleHQ7CisJaW50IHN0YXR1czsKKworCXNwaW5fbG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwltZW1zZXQod3JiLCAwLCBzaXplb2YoKndyYikpOworCisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKKworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0ksCisJCQkgICBPUENPREVfQ09NTU9OX0lTQ1NJX0RFRlFfQ1JFQVRFLCBzaXplb2YoKnJlcSkpOworCisJcmVxLT5udW1fcGFnZXMgPSBQQUdFU180S19TUEFOTkVEKHFfbWVtLT52YSwgcV9tZW0tPnNpemUpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfYmVfZGVmYXVsdF9wZHVfY29udGV4dCwgcnhfcGRpZCwgY3R4dCwgMCk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9iZV9kZWZhdWx0X3BkdV9jb250ZXh0LCByeF9wZGlkX3ZhbGlkLCBjdHh0LAorCQkgICAgICAxKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2JlX2RlZmF1bHRfcGR1X2NvbnRleHQsIHBjaV9mdW5jX2lkLCBjdHh0LAorCQkgICAgICBQQ0lfRlVOQyhjdHJsLT5wZGV2LT5kZXZmbikpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfYmVfZGVmYXVsdF9wZHVfY29udGV4dCwgcmluZ19zaXplLCBjdHh0LAorCQkgICAgICBiZV9lbmNvZGVkX3FfbGVuKGxlbmd0aCAvIHNpemVvZihzdHJ1Y3QgcGh5c19hZGRyKSkpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfYmVfZGVmYXVsdF9wZHVfY29udGV4dCwgZGVmYXVsdF9idWZmZXJfc2l6ZSwKKwkJICAgICAgY3R4dCwgZW50cnlfc2l6ZSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9iZV9kZWZhdWx0X3BkdV9jb250ZXh0LCBjcV9pZF9yZWN2LCBjdHh0LAorCQkgICAgICBjcS0+aWQpOworCisJYmVfZHdzX2NwdV90b19sZShjdHh0LCBzaXplb2YocmVxLT5jb250ZXh0KSk7CisKKwliZV9jbWRfcGFnZV9hZGRyc19wcmVwYXJlKHJlcS0+cGFnZXMsIEFSUkFZX1NJWkUocmVxLT5wYWdlcyksIHFfbWVtKTsKKworCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBiZV9kZWZxX2NyZWF0ZV9yZXNwICpyZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCisJCWRxLT5pZCA9IGxlMTZfdG9fY3B1KHJlc3AtPmlkKTsKKwkJZHEtPmNyZWF0ZWQgPSB0cnVlOworCX0KKwlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBiZV9jbWRfd3JicV9jcmVhdGUoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwgc3RydWN0IGJlX2RtYV9tZW0gKnFfbWVtLAorCQkgICAgICAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKndyYnEpCit7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfd3JicV9jcmVhdGVfcmVxICpyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisJc3RydWN0IGJlX3dyYnFfY3JlYXRlX3Jlc3AgKnJlc3AgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisJaW50IHN0YXR1czsKKworCXNwaW5fbG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwltZW1zZXQod3JiLCAwLCBzaXplb2YoKndyYikpOworCisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKKworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0ksCisJCU9QQ09ERV9DT01NT05fSVNDU0lfV1JCUV9DUkVBVEUsIHNpemVvZigqcmVxKSk7CisJcmVxLT5udW1fcGFnZXMgPSBQQUdFU180S19TUEFOTkVEKHFfbWVtLT52YSwgcV9tZW0tPnNpemUpOworCWJlX2NtZF9wYWdlX2FkZHJzX3ByZXBhcmUocmVxLT5wYWdlcywgQVJSQVlfU0laRShyZXEtPnBhZ2VzKSwgcV9tZW0pOworCisJc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJaWYgKCFzdGF0dXMpCisJCXdyYnEtPmlkID0gbGUxNl90b19jcHUocmVzcC0+Y2lkKTsKKwlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYmVfY21kX2lzY3NpX3Bvc3Rfc2dsX3BhZ2VzKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCisJCQkJc3RydWN0IGJlX2RtYV9tZW0gKnFfbWVtLAorCQkJCXUzMiBwYWdlX29mZnNldCwgdTMyIG51bV9wYWdlcykKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCBiZV9wb3N0X3NnbF9wYWdlc19yZXEgKnJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBjdXJyX3BhZ2VzOworCXUzMiBpbnRlcm5hbF9wYWdlX29mZnNldCA9IDA7CisJdTMyIHRlbXBfbnVtX3BhZ2VzID0gbnVtX3BhZ2VzOworCisJaWYgKG51bV9wYWdlcyA9PSAweGZmKQorCQludW1fcGFnZXMgPSAxOworCisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCWRvIHsKKwkJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKKwkJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKKwkJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9JU0NTSSwKKwkJCQkgICBPUENPREVfQ09NTU9OX0lTQ1NJX0NGR19QT1NUX1NHTF9QQUdFUywKKwkJCQkgICBzaXplb2YoKnJlcSkpOworCQljdXJyX3BhZ2VzID0gQkVfTlVNQkVSX09GX0ZJRUxEKHN0cnVjdCBiZV9wb3N0X3NnbF9wYWdlc19yZXEsCisJCQkJCQlwYWdlcyk7CisJCXJlcS0+bnVtX3BhZ2VzID0gbWluKG51bV9wYWdlcywgY3Vycl9wYWdlcyk7CisJCXJlcS0+cGFnZV9vZmZzZXQgPSBwYWdlX29mZnNldDsKKwkJYmVfY21kX3BhZ2VfYWRkcnNfcHJlcGFyZShyZXEtPnBhZ2VzLCByZXEtPm51bV9wYWdlcywgcV9tZW0pOworCQlxX21lbS0+ZG1hID0gcV9tZW0tPmRtYSArIChyZXEtPm51bV9wYWdlcyAqIFBBR0VfU0laRSk7CisJCWludGVybmFsX3BhZ2Vfb2Zmc2V0ICs9IHJlcS0+bnVtX3BhZ2VzOworCQlwYWdlX29mZnNldCArPSByZXEtPm51bV9wYWdlczsKKwkJbnVtX3BhZ2VzIC09IHJlcS0+bnVtX3BhZ2VzOworCisJCWlmICh0ZW1wX251bV9wYWdlcyA9PSAweGZmKQorCQkJcmVxLT5udW1fcGFnZXMgPSB0ZW1wX251bV9wYWdlczsKKworCQlzdGF0dXMgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKKwkJaWYgKHN0YXR1cykgeworCQkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJCSAiRlcgQ01EIHRvIG1hcCBpc2NzaSBmcmFncyBmYWlsZWQuXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IHdoaWxlIChudW1fcGFnZXMgPiAwKTsKK2Vycm9yOgorCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCWlmIChzdGF0dXMgIT0gMCkKKwkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIE5VTEwsIFFUWVBFX1NHTCk7CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGQ2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCkBAIC0wLDAgKzEsODc3IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDkgU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworCisjaWZuZGVmIEJFSVNDU0lfQ01EU19ICisjZGVmaW5lIEJFSVNDU0lfQ01EU19ICisKKy8qKgorICogVGhlIGRyaXZlciBzZW5kcyBjb25maWd1cmF0aW9uIGFuZCBtYW5hZ2VtZW50cyBjb21tYW5kIHJlcXVlc3RzIHRvIHRoZQorICogZmlybXdhcmUgaW4gdGhlIEJFLiBUaGVzZSByZXF1ZXN0cyBhcmUgY29tbXVuaWNhdGVkIHRvIHRoZSBwcm9jZXNzb3IKKyAqIHVzaW5nIFdvcmsgUmVxdWVzdCBCbG9ja3MgKFdSQnMpIHN1Ym1pdHRlZCB0byB0aGUgTUNDLVdSQiByaW5nIG9yIHZpYSBvbmUKKyAqIFdSQiBpbnNpZGUgYSBNQUlMQk9YLgorICogVGhlIGNvbW1hbmRzIGFyZSBzZXJ2aWNlZCBieSB0aGUgQVJNIHByb2Nlc3NvciBpbiB0aGUgQmxhZGVFbmdpbmUncyBNUFUuCisgKi8KK3N0cnVjdCBiZV9zZ2UgeworCXUzMiBwYV9sbzsKKwl1MzIgcGFfaGk7CisJdTMyIGxlbjsKK307CisKKyNkZWZpbmUgTUNDX1dSQl9TR0VfQ05UX1NISUZUIDMJLyogYml0cyAzIC0gNyBvZiBkd29yZCAwICovCisjZGVmaW5lIE1DQ19XUkJfU0dFX0NOVF9NQVNLIDB4MUYJLyogYml0cyAzIC0gNyBvZiBkd29yZCAwICovCitzdHJ1Y3QgYmVfbWNjX3dyYiB7CisJdTMyIGVtYmVkZGVkOwkJLyogZHdvcmQgMCAqLworCXUzMiBwYXlsb2FkX2xlbmd0aDsJLyogZHdvcmQgMSAqLworCXUzMiB0YWcwOwkJLyogZHdvcmQgMiAqLworCXUzMiB0YWcxOwkJLyogZHdvcmQgMyAqLworCXUzMiByc3ZkOwkJLyogZHdvcmQgNCAqLworCXVuaW9uIHsKKwkJdTggZW1iZWRkZWRfcGF5bG9hZFsyMzZdOwkvKiB1c2VkIGJ5IGVtYmVkZGVkIGNtZHMgKi8KKwkJc3RydWN0IGJlX3NnZSBzZ2xbMTldOwkvKiB1c2VkIGJ5IG5vbi1lbWJlZGRlZCBjbWRzICovCisJfSBwYXlsb2FkOworfTsKKworI2RlZmluZSBDUUVfRkxBR1NfVkFMSURfTUFTSyAoMSA8PCAzMSkKKyNkZWZpbmUgQ1FFX0ZMQUdTX0FTWU5DX01BU0sgKDEgPDwgMzApCisKKy8qIENvbXBsZXRpb24gU3RhdHVzICovCisjZGVmaW5lIE1DQ19TVEFUVVNfU1VDQ0VTUyAweDAKKworI2RlZmluZSBDUUVfU1RBVFVTX0NPTVBMX01BU0sgMHhGRkZGCisjZGVmaW5lIENRRV9TVEFUVVNfQ09NUExfU0hJRlQgMAkvKiBiaXRzIDAgLSAxNSAqLworI2RlZmluZSBDUUVfU1RBVFVTX0VYVERfTUFTSyAweEZGRkYKKyNkZWZpbmUgQ1FFX1NUQVRVU19FWFREX1NISUZUIDAJCS8qIGJpdHMgMCAtIDE1ICovCisKK3N0cnVjdCBiZV9tY2NfY29tcGwgeworCXUzMiBzdGF0dXM7CQkvKiBkd29yZCAwICovCisJdTMyIHRhZzA7CQkvKiBkd29yZCAxICovCisJdTMyIHRhZzE7CQkvKiBkd29yZCAyICovCisJdTMyIGZsYWdzOwkJLyogZHdvcmQgMyAqLworfTsKKworLyoqKioqKioqKiBNYWlsYm94IGRvb3IgYmVsbCAqKioqKioqKioqKioqLworLyoqCisgKiBVc2VkIGZvciBkcml2ZXIgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBGVy4KKyAqIFRoZSBzb2Z0d2FyZSBtdXN0IHdyaXRlIHRoaXMgcmVnaXN0ZXIgdHdpY2UgdG8gcG9zdCBhbnkgY29tbWFuZC4gRmlyc3QsCisgKiBpdCB3cml0ZXMgdGhlIHJlZ2lzdGVyIHdpdGggaGk9MSBhbmQgdGhlIHVwcGVyIGJpdHMgb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKyAqIGZvciB0aGUgTUFJTEJPWCBzdHJ1Y3R1cmUuIFNvZnR3YXJlIG11c3QgcG9sbCB0aGUgcmVhZHkgYml0IHVudGlsIHRoaXMKKyAqIGlzIGFja25vd2xlZGdlZC4gVGhlbiwgc290d2FyZSB3cml0ZXMgdGhlIHJlZ2lzdGVyIHdpdGggaGk9MCB3aXRoIHRoZSBsb3dlcgorICogYml0cyBpbiB0aGUgYWRkcmVzcy4gSXQgbXVzdCBwb2xsIHRoZSByZWFkeSBiaXQgdW50aWwgdGhlIGNvbW1hbmQgaXMKKyAqIGNvbXBsZXRlLiBVcG9uIGNvbXBsZXRpb24sIHRoZSBNQUlMQk9YIHdpbGwgY29udGFpbiBhIHZhbGlkIGNvbXBsZXRpb24KKyAqIHF1ZXVlIGVudHJ5LgorICovCisjZGVmaW5lIE1QVV9NQUlMQk9YX0RCX09GRlNFVAkweDE2MAorI2RlZmluZSBNUFVfTUFJTEJPWF9EQl9SRFlfTUFTSwkweDEJLyogYml0IDAgKi8KKyNkZWZpbmUgTVBVX01BSUxCT1hfREJfSElfTUFTSwkweDIJLyogYml0IDEgKi8KKworLyoqKioqKioqKiogTVBVIHNlbXBob3JlICoqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVBVX0VQX1NFTUFQSE9SRV9PRkZTRVQgMHhhYworI2RlZmluZSBFUF9TRU1BUEhPUkVfUE9TVF9TVEFHRV9NQVNLIDB4MDAwMEZGRkYKKyNkZWZpbmUgRVBfU0VNQVBIT1JFX1BPU1RfRVJSX01BU0sgMHgxCisjZGVmaW5lIEVQX1NFTUFQSE9SRV9QT1NUX0VSUl9TSElGVCAzMQorCisvKioqKioqKioqKiBNQ0MgZG9vciBiZWxsICoqKioqKioqKioqKi8KKyNkZWZpbmUgREJfTUNDUV9PRkZTRVQgMHgxNDAKKyNkZWZpbmUgREJfTUNDUV9SSU5HX0lEX01BU0sgMHg3RkYJCS8qIGJpdHMgMCAtIDEwICovCisvKiBOdW1iZXIgb2YgZW50cmllcyBwb3N0ZWQgKi8KKyNkZWZpbmUgREJfTUNDUV9OVU1fUE9TVEVEX1NISUZUIDE2CQkvKiBiaXRzIDE2IC0gMjkgKi8KKworLyogTVBVIHNlbXBob3JlIFBPU1Qgc3RhZ2UgdmFsdWVzICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQVJNRldfUkRZCQkweGMwMDAJLyogRlcgaXMgZG9uZSB3aXRoIFBPU1QgKi8KKworLyoqCisgKiBXaGVuIHRoZSBhc3luYyBiaXQgb2YgbWNjX2NvbXBsIGlzIHNldCwgdGhlIGxhc3QgNCBieXRlcyBvZgorICogbWNjX2NvbXBsIGlzIGludGVycHJldGVkIGFzIGZvbGxvd3M6CisgKi8KKyNkZWZpbmUgQVNZTkNfVFJBSUxFUl9FVkVOVF9DT0RFX1NISUZUCTgJLyogYml0cyA4IC0gMTUgKi8KKyNkZWZpbmUgQVNZTkNfVFJBSUxFUl9FVkVOVF9DT0RFX01BU0sJMHhGRgorI2RlZmluZSBBU1lOQ19FVkVOVF9DT0RFX0xJTktfU1RBVEUJMHgxCitzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfdHJhaWxlciB7CisJdTMyIGNvZGU7Cit9OworCitlbnVtIHsKKwlBU1lOQ19FVkVOVF9MSU5LX0RPV04gPSAweDAsCisJQVNZTkNfRVZFTlRfTElOS19VUCA9IDB4MQorfTsKKworLyoqCisgKiBXaGVuIHRoZSBldmVudCBjb2RlIG9mIGFuIGFzeW5jIHRyYWlsZXIgaXMgbGluay1zdGF0ZSwgdGhlIG1jY19jb21wbAorICogbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzCisgKi8KK3N0cnVjdCBiZV9hc3luY19ldmVudF9saW5rX3N0YXRlIHsKKwl1OCBwaHlzaWNhbF9wb3J0OworCXU4IHBvcnRfbGlua19zdGF0dXM7CisJdTggcG9ydF9kdXBsZXg7CisJdTggcG9ydF9zcGVlZDsKKwl1OCBwb3J0X2ZhdWx0OworCXU4IHJzdmQwWzddOworCXN0cnVjdCBiZV9hc3luY19ldmVudF90cmFpbGVyIHRyYWlsZXI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYmVfbWNjX21haWxib3ggeworCXN0cnVjdCBiZV9tY2Nfd3JiIHdyYjsKKwlzdHJ1Y3QgYmVfbWNjX2NvbXBsIGNvbXBsOworfTsKKworLyogVHlwZSBvZiBzdWJzeXN0ZW1zIHN1cHBvcnRlZCBieSBGVyAqLworI2RlZmluZSBDTURfU1VCU1lTVEVNX0NPTU1PTiAgICAweDEKKyNkZWZpbmUgQ01EX1NVQlNZU1RFTV9JU0NTSSAgICAgMHgyCisjZGVmaW5lIENNRF9TVUJTWVNURU1fRVRIICAgICAgIDB4MworI2RlZmluZSBDTURfU1VCU1lTVEVNX0lTQ1NJX0lOSSAweDYKKyNkZWZpbmUgQ01EX0NPTU1PTl9UQ1BfVVBMT0FEICAgMHgxCisKKy8qKgorICogTGlzdCBvZiBjb21tb24gb3Bjb2RlcyBzdWJzeXN0ZW0gIENNRF9TVUJTWVNURU1fQ09NTU9OCisgKiBUaGVzZSBvcGNvZGVzIGFyZSB1bmlxdWUgZm9yIGVhY2ggc3Vic3lzdGVtIGRlZmluZWQgYWJvdmUKKyAqLworI2RlZmluZSBPUENPREVfQ09NTU9OX0NRX0NSRUFURQkJCQkxMgorI2RlZmluZSBPUENPREVfQ09NTU9OX0VRX0NSRUFURQkJCQkxMworI2RlZmluZSBPUENPREVfQ09NTU9OX01DQ19DUkVBVEUgICAgICAgIAkJMjEKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRldfVkVSU0lPTgkJCTM1CisjZGVmaW5lIE9QQ09ERV9DT01NT05fTU9ESUZZX0VRX0RFTEFZCQkJNDEKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9GSVJNV0FSRV9DT05GSUcJCQk0MgorI2RlZmluZSBPUENPREVfQ09NTU9OX01DQ19ERVNUUk9ZICAgICAgICAJCTUzCisjZGVmaW5lIE9QQ09ERV9DT01NT05fQ1FfREVTVFJPWSAgICAgICAgCQk1NAorI2RlZmluZSBPUENPREVfQ09NTU9OX0VRX0RFU1RST1kgICAgICAgIAkJNTUKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9RVUVSWV9GSVJNV0FSRV9DT05GSUcJCTU4CisjZGVmaW5lIE9QQ09ERV9DT01NT05fRlVOQ1RJT05fUkVTRVQJCQk2MQorCisvKioKKyAqIExJU1Qgb2Ygb3Bjb2RlcyB0aGF0IGFyZSBjb21tb24gYmV0d2VlbiBJbml0aWF0b3IgYW5kIFRhcmdldAorICogdXNlZCBieSBDTURfU1VCU1lTVEVNX0lTQ1NJCisgKiBUaGVzZSBvcGNvZGVzIGFyZSB1bmlxdWUgZm9yIGVhY2ggc3Vic3lzdGVtIGRlZmluZWQgYWJvdmUKKyAqLworI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX0NGR19QT1NUX1NHTF9QQUdFUwkJMgorI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX0NGR19SRU1PVkVfU0dMX1BBR0VTICAgICAgICAzCisjZGVmaW5lIE9QQ09ERV9DT01NT05fSVNDU0lfTlRXS19HRVRfTklDX0NPTkZJRwkJNworI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX1NFVF9GUkFHTlVNX0JJVFNfRk9SX1NHTF9DUkEgNjEKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9ERUZRX0NSRUFURSAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9ERUZRX0RFU1RST1kgCQk2NQorI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX1dSQlFfQ1JFQVRFCQkJNjYKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9XUkJRX0RFU1RST1kgCQk2NworCitzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgeworCXU4IG9wY29kZTsJCS8qIGR3b3JkIDAgKi8KKwl1OCBzdWJzeXN0ZW07CQkvKiBkd29yZCAwICovCisJdTggcG9ydF9udW1iZXI7CQkvKiBkd29yZCAwICovCisJdTggZG9tYWluOwkJLyogZHdvcmQgMCAqLworCXUzMiB0aW1lb3V0OwkJLyogZHdvcmQgMSAqLworCXUzMiByZXF1ZXN0X2xlbmd0aDsJLyogZHdvcmQgMiAqLworCXUzMiByc3ZkOwkJLyogZHdvcmQgMyAqLworfTsKKworc3RydWN0IGJlX2NtZF9yZXNwX2hkciB7CisJdTMyIGluZm87CQkvKiBkd29yZCAwICovCisJdTMyIHN0YXR1czsJCS8qIGR3b3JkIDEgKi8KKwl1MzIgcmVzcG9uc2VfbGVuZ3RoOwkvKiBkd29yZCAyICovCisJdTMyIGFjdHVhbF9yZXNwX2xlbjsJLyogZHdvcmQgMyAqLworfTsKKworc3RydWN0IHBoeXNfYWRkciB7CisJdTMyIGxvOworCXUzMiBoaTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQkUgQ29tbWFuZCBkZWZpbml0aW9ucyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogUHNldWRvIGFtYXAgZGVmaW5pdGlvbiBpbiB3aGljaCBlYWNoIGJpdCBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkCisgKiBhcyBhIGJ5dGUgLSB1c2VkIHRvIGNhbGN1bGF0ZSBvZmZzZXQvc2hpZnQvbWFzayBvZiBlYWNoIGZpZWxkCisgKi8KK3N0cnVjdCBhbWFwX2VxX2NvbnRleHQgeworCXU4IGNpZHhbMTNdOwkJLyogZHdvcmQgMCAqLworCXU4IHJzdmQwWzNdOwkJLyogZHdvcmQgMCAqLworCXU4IGVwaWR4WzEzXTsJCS8qIGR3b3JkIDAgKi8KKwl1OCB2YWxpZDsJCS8qIGR3b3JkIDAgKi8KKwl1OCByc3ZkMTsJCS8qIGR3b3JkIDAgKi8KKwl1OCBzaXplOwkJLyogZHdvcmQgMCAqLworCXU4IHBpZHhbMTNdOwkJLyogZHdvcmQgMSAqLworCXU4IHJzdmQyWzNdOwkJLyogZHdvcmQgMSAqLworCXU4IHBkWzEwXTsJCS8qIGR3b3JkIDEgKi8KKwl1OCBjb3VudFszXTsJCS8qIGR3b3JkIDEgKi8KKwl1OCBzb2xldmVudDsJCS8qIGR3b3JkIDEgKi8KKwl1OCBzdGFsbGVkOwkJLyogZHdvcmQgMSAqLworCXU4IGFybWVkOwkJLyogZHdvcmQgMSAqLworCXU4IHJzdmQzWzRdOwkJLyogZHdvcmQgMiAqLworCXU4IGZ1bmNbOF07CQkvKiBkd29yZCAyICovCisJdTggcnN2ZDQ7CQkvKiBkd29yZCAyICovCisJdTggZGVsYXltdWx0WzEwXTsJLyogZHdvcmQgMiAqLworCXU4IHJzdmQ1WzJdOwkJLyogZHdvcmQgMiAqLworCXU4IHBoYXNlWzJdOwkJLyogZHdvcmQgMiAqLworCXU4IG5vZGVsYXk7CQkvKiBkd29yZCAyICovCisJdTggcnN2ZDZbNF07CQkvKiBkd29yZCAyICovCisJdTggcnN2ZDdbMzJdOwkJLyogZHdvcmQgMyAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGJlX2NtZF9yZXFfZXFfY3JlYXRlIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOwkvKiBkd1s0XSAqLworCXUxNiBudW1fcGFnZXM7CQkvKiBzd29yZCAqLworCXUxNiByc3ZkMDsJCS8qIHN3b3JkICovCisJdTggY29udGV4dFtzaXplb2Yoc3RydWN0IGFtYXBfZXFfY29udGV4dCkgLyA4XTsJLyogZHdbNF0gKi8KKwlzdHJ1Y3QgcGh5c19hZGRyIHBhZ2VzWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJlX2NtZF9yZXNwX2VxX2NyZWF0ZSB7CisJc3RydWN0IGJlX2NtZF9yZXNwX2hkciByZXNwX2hkcjsKKwl1MTYgZXFfaWQ7CQkvKiBzd29yZCAqLworCXUxNiByc3ZkMDsJCS8qIHN3b3JkICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgbWFjX2FkZHIgeworCXUxNiBzaXplX29mX3N0cnVjdDsKKwl1OCBhZGRyW0VUSF9BTEVOXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9jbWRfcmVxX21hY19xdWVyeSB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwl1OCB0eXBlOworCXU4IHBlcm1hbmVudDsKKwl1MTYgaWZfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYmVfY21kX3Jlc3BfbWFjX3F1ZXJ5IHsKKwlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyIGhkcjsKKwlzdHJ1Y3QgbWFjX2FkZHIgbWFjOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqIENyZWF0ZSBDUSAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIFBzZXVkbyBhbWFwIGRlZmluaXRpb24gaW4gd2hpY2ggZWFjaCBiaXQgb2YgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZAorICogYXMgYSBieXRlIC0gdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9jcV9jb250ZXh0IHsKKwl1OCBjaWR4WzExXTsJCS8qIGR3b3JkIDAgKi8KKwl1OCByc3ZkMDsJCS8qIGR3b3JkIDAgKi8KKwl1OCBjb2FsZXNjd21bMl07CS8qIGR3b3JkIDAgKi8KKwl1OCBub2RlbGF5OwkJLyogZHdvcmQgMCAqLworCXU4IGVwaWR4WzExXTsJCS8qIGR3b3JkIDAgKi8KKwl1OCByc3ZkMTsJCS8qIGR3b3JkIDAgKi8KKwl1OCBjb3VudFsyXTsJCS8qIGR3b3JkIDAgKi8KKwl1OCB2YWxpZDsJCS8qIGR3b3JkIDAgKi8KKwl1OCBzb2xldmVudDsJCS8qIGR3b3JkIDAgKi8KKwl1OCBldmVudGFibGU7CQkvKiBkd29yZCAwICovCisJdTggcGlkeFsxMV07CQkvKiBkd29yZCAxICovCisJdTggcnN2ZDI7CQkvKiBkd29yZCAxICovCisJdTggcGRbMTBdOwkJLyogZHdvcmQgMSAqLworCXU4IGVxaWRbOF07CQkvKiBkd29yZCAxICovCisJdTggc3RhbGxlZDsJCS8qIGR3b3JkIDEgKi8KKwl1OCBhcm1lZDsJCS8qIGR3b3JkIDEgKi8KKwl1OCByc3ZkM1s0XTsJCS8qIGR3b3JkIDIgKi8KKwl1OCBmdW5jWzhdOwkJLyogZHdvcmQgMiAqLworCXU4IHJzdmQ0WzIwXTsJCS8qIGR3b3JkIDIgKi8KKwl1OCByc3ZkNVszMl07CQkvKiBkd29yZCAzICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYmVfY21kX3JlcV9jcV9jcmVhdGUgeworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgcnN2ZDA7CisJdTggY29udGV4dFtzaXplb2Yoc3RydWN0IGFtYXBfY3FfY29udGV4dCkgLyA4XTsKKwlzdHJ1Y3QgcGh5c19hZGRyIHBhZ2VzWzRdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJlX2NtZF9yZXNwX2NxX2NyZWF0ZSB7CisJc3RydWN0IGJlX2NtZF9yZXNwX2hkciBoZHI7CisJdTE2IGNxX2lkOworCXUxNiByc3ZkMDsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKiBDcmVhdGUgTUNDUSAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIFBzZXVkbyBhbWFwIGRlZmluaXRpb24gaW4gd2hpY2ggZWFjaCBiaXQgb2YgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZAorICogYXMgYSBieXRlIC0gdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9tY2NfY29udGV4dCB7CisJdTggY29uX2luZGV4WzE0XTsKKwl1OCByc3ZkMFsyXTsKKwl1OCByaW5nX3NpemVbNF07CisJdTggZmV0Y2hfd3JiOworCXU4IGZldGNoX3IydDsKKwl1OCBjcV9pZFsxMF07CisJdTggcHJvZF9pbmRleFsxNF07CisJdTggZmlkWzhdOworCXU4IHBkaWRbOV07CisJdTggdmFsaWQ7CisJdTggcnN2ZDFbMzJdOworCXU4IHJzdmQyWzMyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9jbWRfcmVxX21jY19jcmVhdGUgeworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgcnN2ZDA7CisJdTggY29udGV4dFtzaXplb2Yoc3RydWN0IGFtYXBfbWNjX2NvbnRleHQpIC8gOF07CisJc3RydWN0IHBoeXNfYWRkciBwYWdlc1s4XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9jbWRfcmVzcF9tY2NfY3JlYXRlIHsKKwlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyIGhkcjsKKwl1MTYgaWQ7CisJdTE2IHJzdmQwOworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqIFEgRGVzdHJveSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVHlwZSBvZiBRdWV1ZSB0byBiZSBkZXN0cm95ZWQgKi8KK2VudW0geworCVFUWVBFX0VRID0gMSwKKwlRVFlQRV9DUSwKKwlRVFlQRV9NQ0NRLAorCVFUWVBFX1dSQlEsCisJUVRZUEVfRFBEVVEsCisJUVRZUEVfU0dMCit9OworCitzdHJ1Y3QgYmVfY21kX3JlcV9xX2Rlc3Ryb3kgeworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTE2IGlkOworCXUxNiBieXBhc3NfZmx1c2g7CS8qIHZhbGlkIG9ubHkgZm9yIHJ4IHEgZGVzdHJveSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IG1hY2FkZHIgeworCXU4IGJ5dGVbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGJlX2NtZF9yZXFfbWNhc3RfbWFjX2NvbmZpZyB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwl1MTYgbnVtX21hYzsKKwl1OCBwcm9taXNjdW91czsKKwl1OCBpbnRlcmZhY2VfaWQ7CisJc3RydWN0IG1hY2FkZHIgbWFjWzMyXTsKK30gX19wYWNrZWQ7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZW1iZWRkZWRfcGF5bG9hZChzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiKQoreworCXJldHVybiB3cmItPnBheWxvYWQuZW1iZWRkZWRfcGF5bG9hZDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmVfc2dlICpub25lbWJlZGRlZF9zZ2woc3RydWN0IGJlX21jY193cmIgKndyYikKK3sKKwlyZXR1cm4gJndyYi0+cGF5bG9hZC5zZ2xbMF07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiBNb2RpZnkgRVEgRGVsYXkgKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBiZV9jbWRfcmVxX21vZGlmeV9lcV9kZWxheSB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwl1MzIgbnVtX2VxOworCXN0cnVjdCB7CisJCXUzMiBlcV9pZDsKKwkJdTMyIHBoYXNlOworCQl1MzIgZGVsYXlfbXVsdGlwbGllcjsKKwl9IGRlbGF5WzhdOworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqIEdldCBNQUMgQUREUiAqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVUSF9BTEVOCTYKKworCitzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfbWFjX2FkZHIgeworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTMyIG5pY19wb3J0X2NvdW50OworCXUzMiBzcGVlZDsKKwl1MzIgbWF4X3NwZWVkOworCXUzMiBsaW5rX3N0YXRlOworCXUzMiBtYXhfZnJhbWVfc2l6ZTsKKwl1MTYgc2l6ZV9vZl9zdHJ1Y3R1cmU7CisJdTggbWFjX2FkZHJlc3NbRVRIX0FMRU5dOworCXUzMiByc3ZkWzIzXTsKK307CisKK3N0cnVjdCBiZV9jbWRfcmVzcF9nZXRfbWFjX2FkZHIgeworCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgaGRyOworCXUzMiBuaWNfcG9ydF9jb3VudDsKKwl1MzIgc3BlZWQ7CisJdTMyIG1heF9zcGVlZDsKKwl1MzIgbGlua19zdGF0ZTsKKwl1MzIgbWF4X2ZyYW1lX3NpemU7CisJdTE2IHNpemVfb2Zfc3RydWN0dXJlOworCXU4IG1hY19hZGRyZXNzWzZdOworCXUzMiByc3ZkWzIzXTsKK307CisKK2ludCBiZWlzY3NpX2NtZF9lcV9jcmVhdGUoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKKwkJCSAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxLCBpbnQgZXFfZGVsYXkpOworCitpbnQgYmVpc2NzaV9jbWRfY3FfY3JlYXRlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCisJCQkgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSwgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxLAorCQkJICBib29sIHNvbF9ldnRzLCBib29sIG5vX2RlbGF5LAorCQkJICBpbnQgbnVtX2NxZV9kbWFfY29hbGVzY2UpOworCitpbnQgYmVpc2NzaV9jbWRfcV9kZXN0cm95KHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxLAorCQkJICBpbnQgdHlwZSk7CitpbnQgYmVfcG9sbF9tY2Moc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCk7Cit1bnNpZ25lZCBjaGFyIG1nbXRfY2hlY2tfc3VwcG9ydGVkX2Z3KHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpOworaW50IGJlX2NtZF9nZXRfbWFjX2FkZHIoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwgdTggKm1hY19hZGRyKTsKKworLypJU0NTSSBGdW5jdHVpb25zICovCitpbnQgYmVfY21kX2Z3X2luaXRpYWxpemUoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCk7CisKK3N0cnVjdCBiZV9tY2Nfd3JiICp3cmJfZnJvbV9tYm94KHN0cnVjdCBiZV9kbWFfbWVtICptYm94X21lbSk7CisKK2ludCBiZV9tYm94X25vdGlmeShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKTsKKworaW50IGJlX2NtZF9jcmVhdGVfZGVmYXVsdF9wZHVfcXVldWUoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKKwkJCQkgICAgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxLAorCQkJCSAgICBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZHEsIGludCBsZW5ndGgsCisJCQkJICAgIGludCBlbnRyeV9zaXplKTsKKworaW50IGJlX2NtZF9pc2NzaV9wb3N0X3NnbF9wYWdlcyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAorCQkJCXN0cnVjdCBiZV9kbWFfbWVtICpxX21lbSwgdTMyIHBhZ2Vfb2Zmc2V0LAorCQkJCXUzMiBudW1fcGFnZXMpOworCitpbnQgYmVfY21kX3dyYnFfY3JlYXRlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHN0cnVjdCBiZV9kbWFfbWVtICpxX21lbSwKKwkJICAgICAgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICp3cmJxKTsKKworc3RydWN0IGJlX2RlZmF1bHRfcGR1X2NvbnRleHQgeworCXUzMiBkd1s0XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhbWFwX2JlX2RlZmF1bHRfcGR1X2NvbnRleHQgeworCXU4IGRidWZfY2luZGV4WzEzXTsJLyogZHdvcmQgMCAqLworCXU4IHJzdmQwWzNdOwkJLyogZHdvcmQgMCAqLworCXU4IHJpbmdfc2l6ZVs0XTsJLyogZHdvcmQgMCAqLworCXU4IHJpbmdfc3RhdGVbNF07CS8qIGR3b3JkIDAgKi8KKwl1OCByc3ZkMVs4XTsJCS8qIGR3b3JkIDAgKi8KKwl1OCBkYnVmX3BpbmRleFsxM107CS8qIGR3b3JkIDEgKi8KKwl1OCByc3ZkMjsJCS8qIGR3b3JkIDEgKi8KKwl1OCBwY2lfZnVuY19pZFs4XTsJLyogZHdvcmQgMSAqLworCXU4IHJ4X3BkaWRbOV07CQkvKiBkd29yZCAxICovCisJdTggcnhfcGRpZF92YWxpZDsJLyogZHdvcmQgMSAqLworCXU4IGRlZmF1bHRfYnVmZmVyX3NpemVbMTZdOwkvKiBkd29yZCAyICovCisJdTggY3FfaWRfcmVjdlsxMF07CS8qIGR3b3JkIDIgKi8KKwl1OCByeF9wZGlkX25vdF92YWxpZDsJLyogZHdvcmQgMiAqLworCXU4IHJzdmQzWzVdOwkJLyogZHdvcmQgMiAqLworCXU4IHJzdmQ0WzMyXTsJCS8qIGR3b3JkIDMgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9kZWZxX2NyZWF0ZV9yZXEgeworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTE2IG51bV9wYWdlczsKKwl1OCB1bHBfbnVtOworCXU4IHJzdmQwOworCXN0cnVjdCBiZV9kZWZhdWx0X3BkdV9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IHBoeXNfYWRkciBwYWdlc1s4XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9kZWZxX2NyZWF0ZV9yZXNwIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXUxNiBpZDsKKwl1MTYgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYmVfcG9zdF9zZ2xfcGFnZXNfcmVxIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXUxNiBudW1fcGFnZXM7CisJdTE2IHBhZ2Vfb2Zmc2V0OworCXUzMiByc3ZkMDsKKwlzdHJ1Y3QgcGh5c19hZGRyIHBhZ2VzWzI2XTsKKwl1MzIgcnN2ZDE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYmVfd3JicV9jcmVhdGVfcmVxIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXUxNiBudW1fcGFnZXM7CisJdTggdWxwX251bTsKKwl1OCByc3ZkMDsKKwlzdHJ1Y3QgcGh5c19hZGRyIHBhZ2VzWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJlX3dyYnFfY3JlYXRlX3Jlc3AgeworCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgcmVzcF9oZHI7CisJdTE2IGNpZDsKKwl1MTYgcnN2ZDA7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFNPTF9DSURfTUFTSwkJMHgwMDAwRkZDMAorI2RlZmluZSBTT0xfQ09ERV9NQVNLCQkweDAwMDAwMDNGCisjZGVmaW5lIFNPTF9XUkJfSU5ERVhfTUFTSwkweDAwRkYwMDAwCisjZGVmaW5lIFNPTF9DTURfV05EX01BU0sJMHhGRjAwMDAwMAorI2RlZmluZSBTT0xfUkVTX0NOVF9NQVNLCTB4N0ZGRkZGRkYKKyNkZWZpbmUgU09MX0VYUF9DTURfU05fTUFTSwkweEZGRkZGRkZGCisjZGVmaW5lIFNPTF9IV19TVFNfTUFTSwkJMHgwMDAwMDBGRgorI2RlZmluZSBTT0xfU1RTX01BU0sJCTB4MDAwMEZGMDAKKyNkZWZpbmUgU09MX1JFU1BfTUFTSwkJMHgwMEZGMDAwMAorI2RlZmluZSBTT0xfRkxBR1NfTUFTSwkJMHg3RjAwMDAwMAorI2RlZmluZSBTT0xfU19NQVNLCQkweDgwMDAwMDAwCisKK3N0cnVjdCBzb2xfY3FlIHsKKwl1MzIgZHdbNF07Cit9OworCitzdHJ1Y3QgYW1hcF9zb2xfY3FlIHsKKwl1OCBod19zdHNbOF07CQkvKiBkd29yZCAwICovCisJdTggaV9zdHNbOF07CQkvKiBkd29yZCAwICovCisJdTggaV9yZXNwWzhdOwkJLyogZHdvcmQgMCAqLworCXU4IGlfZmxhZ3NbN107CQkvKiBkd29yZCAwICovCisJdTggczsJCQkvKiBkd29yZCAwICovCisJdTggaV9leHBfY21kX3NuWzMyXTsJLyogZHdvcmQgMSAqLworCXU4IGNvZGVbNl07CQkvKiBkd29yZCAyICovCisJdTggY2lkWzEwXTsJCS8qIGR3b3JkIDIgKi8KKwl1OCB3cmJfaW5kZXhbOF07CS8qIGR3b3JkIDIgKi8KKwl1OCBpX2NtZF93bmRbOF07CS8qIGR3b3JkIDIgKi8KKwl1OCBpX3Jlc19jbnRbMzFdOwkvKiBkd29yZCAzICovCisJdTggdmFsaWQ7CQkvKiBkd29yZCAzICovCit9IF9fcGFja2VkOworCisKKy8qKgorICogUG9zdCBXUkIgUXVldWUgRG9vcmJlbGwgUmVnaXN0ZXIgdXNlZCBieSB0aGUgaG9zdCBTdG9yYWdlCisgKiBzdGFjayB0byBub3RpZnkgdGhlCisgKiBjb250cm9sbGVyIG9mIGEgcG9zdGVkIFdvcmsgUmVxdWVzdCBCbG9jaworICovCisjZGVmaW5lIERCX1dSQl9QT1NUX0NJRF9NQVNLCQkweDNGRgkvKiBiaXRzIDAgLSA5ICovCisjZGVmaW5lIERCX0RFRl9QRFVfV1JCX0lOREVYX01BU0sJMHhGRgkvKiBiaXRzIDAgLSA5ICovCisKKyNkZWZpbmUgREJfREVGX1BEVV9XUkJfSU5ERVhfU0hJRlQJMTYKKyNkZWZpbmUgREJfREVGX1BEVV9OVU1fUE9TVEVEX1NISUZUCTI0CisKK3N0cnVjdCBmcmFnbnVtX2JpdHNfZm9yX3NnbF9jcmFfaW4geworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTMyIG51bV9iaXRzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlzY3NpX2NsZWFudXBfcmVxIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXUxNiBjaHV0ZTsKKwl1OCBoZHJfcmluZ19pZDsKKwl1OCBkYXRhX3JpbmdfaWQ7CisKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlcV9kZWxheSB7CisJdTMyIGVxX2lkOworCXUzMiBwaGFzZTsKKwl1MzIgZGVsYXlfbXVsdGlwbGllcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9lcV9kZWxheV9wYXJhbXNfaW4geworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTMyIG51bV9lcTsKKwlzdHJ1Y3QgZXFfZGVsYXkgZGVsYXlbOF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXBfYWRkcmVzc19mb3JtYXQgeworCXUxNiBzaXplX29mX3N0cnVjdHVyZTsKKwl1OCByZXNlcnZlZDsKKwl1OCBpcF90eXBlOworCXU4IGlwX2FkZHJlc3NbMTZdOworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB0Y3BfY29ubmVjdF9hbmRfb2ZmbG9hZF9pbiB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwlzdHJ1Y3QgaXBfYWRkcmVzc19mb3JtYXQgaXBfYWRkcmVzczsKKwl1MTYgdGNwX3BvcnQ7CisJdTE2IGNpZDsKKwl1MTYgY3FfaWQ7CisJdTE2IGRlZnFfaWQ7CisJc3RydWN0IHBoeXNfYWRkciBkYXRhb3V0X3RlbXBsYXRlX3BhOworCXUxNiBoZHJfcmluZ19pZDsKKwl1MTYgZGF0YV9yaW5nX2lkOworCXU4IGRvX29mZmxvYWQ7CisJdTggcnN2ZDBbM107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgdGNwX2Nvbm5lY3RfYW5kX29mZmxvYWRfb3V0IHsKKwlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyIGhkcjsKKwl1MzIgY29ubmVjdGlvbl9oYW5kbGU7CisJdTE2IGNpZDsKKwl1MTYgcnN2ZDA7CisKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgeworCXN0cnVjdCBNQ0NfV1JCICp3cmI7CisJaW50ICp1c2Vyc19maW5hbF9zdGF0dXM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIERCX0RFRl9QRFVfUklOR19JRF9NQVNLCQkweDNGRgkvKiBiaXRzIDAgLSA5ICovCisjZGVmaW5lIERCX0RFRl9QRFVfQ1FQUk9DX01BU0sJCTB4M0ZGRgkvKiBiaXRzIDAgLSA5ICovCisjZGVmaW5lIERCX0RFRl9QRFVfUkVBUk1fU0hJRlQJCTE0CisjZGVmaW5lIERCX0RFRl9QRFVfRVZFTlRfU0hJRlQJCTE1CisjZGVmaW5lIERCX0RFRl9QRFVfQ1FQUk9DX1NISUZUCQkxNgorCitzdHJ1Y3QgZG1zZ19jcWUgeworCXUzMiBkd1s0XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB0Y3BfdXBsb2FkX3BhcmFtc19pbiB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwl1MTYgaWQ7CisJdTE2IHVwbG9hZF90eXBlOworCXUzMiByZXNldF9zZXE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgdGNwX3VwbG9hZF9wYXJhbXNfb3V0IHsKKwl1MzIgZHdbMzJdOworfSBfX3BhY2tlZDsKKwordW5pb24gdGNwX3VwbG9hZF9wYXJhbXMgeworCXN0cnVjdCB0Y3BfdXBsb2FkX3BhcmFtc19pbiByZXF1ZXN0OworCXN0cnVjdCB0Y3BfdXBsb2FkX3BhcmFtc19vdXQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYmVfdWxwX2Z3X2NmZyB7CisJdTMyIHVscF9tb2RlOworCXUzMiBldHhfYmFzZTsKKwl1MzIgZXR4X2NvdW50OworCXUzMiBzcV9iYXNlOworCXUzMiBzcV9jb3VudDsKKwl1MzIgcnFfYmFzZTsKKwl1MzIgcnFfY291bnQ7CisJdTMyIGRxX2Jhc2U7CisJdTMyIGRxX2NvdW50OworCXUzMiBscm9fYmFzZTsKKwl1MzIgbHJvX2NvdW50OworCXUzMiBpY2RfYmFzZTsKKwl1MzIgaWNkX2NvdW50OworfTsKKworc3RydWN0IGJlX2Z3X2NmZyB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwl1MzIgYmVfY29uZmlnX251bWJlcjsKKwl1MzIgYXNpY19yZXZpc2lvbjsKKwl1MzIgcGh5c19wb3J0OworCXUzMiBmdW5jdGlvbl9tb2RlOworCXN0cnVjdCBiZV91bHBfZndfY2ZnIHVscFsyXTsKKwl1MzIgZnVuY3Rpb25fY2FwczsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQ01EX0lTQ1NJX0NPTU1BTkRfSU5WQUxJREFURSAgMQorI2RlZmluZSBJU0NTSV9PUENPREVfU0NTSV9EQVRBX09VVCAgICAgIDUKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9UQ1BfQ09OTkVDVF9BTkRfT0ZGTE9BRCA3MAorI2RlZmluZSBPUENPREVfSVNDU0lfSU5JX0RSSVZFUl9PRkZMT0FEX1NFU1NJT04gNDEKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9NT0RJRllfRVFfREVMQVkJNDEKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9DTEVBTlVQCTU5CisjZGVmaW5lCU9QQ09ERV9DT01NT05fVENQX1VQTE9BRAk1NgorI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX0VSUk9SX1JFQ09WRVJZX0lOVkFMSURBVEVfQ09NTUFORFMgMQorLyogLS0tIENNRF9JU0NTSV9JTlZBTElEQVRFX0NPTk5FQ1RJT05fVFlQRSAtLS0gKi8KKyNkZWZpbmUgQ01EX0lTQ1NJX0NPTk5FQ1RJT05fSU5WQUxJREFURSAxCisjZGVmaW5lIENNRF9JU0NTSV9DT05ORUNUSU9OX0lTU1VFX1RDUF9SU1QgMgorI2RlZmluZSBPUENPREVfSVNDU0lfSU5JX0RSSVZFUl9JTlZBTElEQVRFX0NPTk5FQ1RJT04gNDIKKworI2RlZmluZSBJTklfV1JfQ01ECQkJMQkvKiBJbml0aWF0b3Igd3JpdGUgY29tbWFuZCAqLworI2RlZmluZSBJTklfVE1GX0NNRAkJCTIJLyogSW5pdGlhdG9yIFRNRiBjb21tYW5kICovCisjZGVmaW5lIElOSV9OT1BPVVRfQ01ECQkJMwkvKiBJbml0aWF0b3I7IFNlbmQgYSBOT1AtT1VUICovCisjZGVmaW5lIElOSV9SRF9DTUQJCQk1CS8qIEluaXRpYXRvciByZXF1ZXN0aW5nIHRvIHNlbmQKKwkJCQkJCSAqIGEgcmVhZCBjb21tYW5kCisJCQkJCQkgKi8KKyNkZWZpbmUgVEdUX0NUWF9VUERUX0NNRAkJNwkvKiBUYXJnZXQgY29udGV4dCB1cGRhdGUgKi8KKyNkZWZpbmUgVEdUX1NUU19DTUQJCQk4CS8qIFRhcmdldCBSMlQgYW5kIG90aGVyIEJIUworCQkJCQkJICogd2hlcmUgb25seSB0aGUgc3RhdHVzIG51bWJlcgorCQkJCQkJICogbmVlZCB0byBiZSB1cGRhdGVkCisJCQkJCQkgKi8KKyNkZWZpbmUgVEdUX0RBVEFJTl9DTUQJCQk5CS8qIFRhcmdldCBEYXRhLUlucyBpbiByZXNwb25zZQorCQkJCQkJICogdG8gcmVhZCBjb21tYW5kCisJCQkJCQkgKi8KKyNkZWZpbmUgVEdUX1NPU19QRFUJCQkxMAkvKiBUYXJnZXQ6c3RhbmRhbG9uZSBzdGF0dXMKKwkJCQkJCSAqIHJlc3BvbnNlCisJCQkJCQkgKi8KKyNkZWZpbmUgVEdUX0RNX0NNRAkJCTExCS8qIEluZGljYXRlcyB0aGF0IHRoZSBiaHMKKwkJCQkJCSAqICBwcmVwYXJlZGJ5CisJCQkJCQkgKiBkcml2ZXIgc2hvdWxkIG5vdCBiZSB0b3VjaGVkCisJCQkJCQkgKi8KKy8qIC0tLSBDTURfQ0hVVEVfVFlQRSAtLS0gKi8KKyNkZWZpbmUgQ01EX0NPTk5FQ1RJT05fQ0hVVEVfMAkJMQorI2RlZmluZSBDTURfQ09OTkVDVElPTl9DSFVURV8xCQkyCisjZGVmaW5lIENNRF9DT05ORUNUSU9OX0NIVVRFXzIJCTMKKworI2RlZmluZSBFUV9NQUpPUl9DT0RFX0NPTVBMRVRJT04JMAorCisjZGVmaW5lIENNRF9JU0NTSV9TRVNTSU9OX0RFTF9DRkdfRlJPTV9GTEFTSCAwCisjZGVmaW5lIENNRF9JU0NTSV9TRVNTSU9OX1NBVkVfQ0ZHX09OX0ZMQVNIIDEKKworLyogLS0tIENPTk5FQ1RJT05fVVBMT0FEX1BBUkFNUyAtLS0gKi8KKy8qIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSB0eXBlIG9mIHVwbG9hZCBkZXNpcmVkLiAgKi8KKyNkZWZpbmUgQ09OTkVDVElPTl9VUExPQURfR1JBQ0VGVUwgICAgICAxCS8qIEdyYWNlZnVsIHVwbG9hZCAgKi8KKyNkZWZpbmUgQ09OTkVDVElPTl9VUExPQURfQUJPUlRfUkVTRVQgICAyCS8qIEFib3J0aXZlIHVwbG9hZCB3aXRoCisJCQkJCQkgKiByZXNldAorCQkJCQkJICovCisjZGVmaW5lIENPTk5FQ1RJT05fVVBMT0FEX0FCT1JUCQkzCS8qIEFib3J0aXZlIHVwbG9hZCB3aXRob3V0CisJCQkJCQkgKiByZXNldAorCQkJCQkJICovCisjZGVmaW5lIENPTk5FQ1RJT05fVVBMT0FEX0FCT1JUX1dJVEhfU0VRIDQJLyogQWJvcnRpdmUgdXBsb2FkIHdpdGggcmVzZXQsCisJCQkJCQkgKiBzZXF1ZW5jZSBudW1iZXIgYnkgZHJpdmVyICAqLworCisvKiBSZXR1cm5zIGJ5dGUgc2l6ZSBvZiBnaXZlbiBmaWVsZCB3aXRoIGEgc3RydWN0dXJlLiAqLworCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGZpZWxkIGFycmF5LiAqLworI2RlZmluZSBCRV9OVU1CRVJfT0ZfRklFTEQoX3R5cGVfLCBfZmllbGRfKQlcCisJKEZJRUxEX1NJWkVPRihfdHlwZV8sIF9maWVsZF8pL3NpemVvZigoKChfdHlwZV8gKikwKS0+X2ZpZWxkX1swXSkpKVwKKworLyoqCisgKiBEaWZmZXJlbnQgdHlwZXMgb2YgaVNDU0kgY29tcGxldGlvbnMgdG8gaG9zdCBkcml2ZXIgZm9yIGJvdGggaW5pdGlhdG9yCisgKiBhbmQgdGFnZXQgbW9kZQorICogb2Ygb3BlcmF0aW9uLgorICovCisjZGVmaW5lIFNPTF9DTURfQ09NUExFVEUJCTEJLyogU29saWNpdGVkIGNvbW1hbmQgY29tcGxldGVkCisJCQkJCQkgKiBub3JtYWxseQorCQkJCQkJICovCisjZGVmaW5lIFNPTF9DTURfS0lMTEVEX0RBVEFfRElHRVNUX0VSUiAgMgkvKiBTb2xpY2l0ZWQgY29tbWFuZCBnb3QKKwkJCQkJCSAqIGludmFsaWRhdGVkIGludGVybmFsbHkgZHVlCisJCQkJCQkgKiB0byBEYXRhIERpZ2VzdCBlcnJvcgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfUERVX1NJWkVfRVhDRUVEU19EU0wgMwkvKiBDb25uZWN0aW9uIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseQorCQkJCQkJICogZHVlIHRvIGEgcmVjaWV2ZWQgUERVCisJCQkJCQkgKiBzaXplID4gRFNMCisJCQkJCQkgKi8KKyNkZWZpbmUgQ1hOX0tJTExFRF9CVVJTVF9MRU5fTUlTTUFUQ0ggICA0CS8qIENvbm5lY3Rpb24gZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0aSByZWNlaXZlZAorCQkJCQkJICogUERVIHNlcXVlbmNlIHNpemUgPgorCQkJCQkJICogRkJML01CTC4KKwkJCQkJCSAqLworI2RlZmluZSBDWE5fS0lMTEVEX0FIU19SQ1ZECQk1CS8qIENvbm5lY3Rpb24gZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0byBhIHJlY2lldmVkCisJCQkJCQkgKiBQRFUgSGRyIHRoYXQgaGFzCisJCQkJCQkgKiBBSFMgKi8KKyNkZWZpbmUgQ1hOX0tJTExFRF9IRFJfRElHRVNUX0VSUgk2CS8qIENvbm5lY3Rpb24gZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0byBIZHIgRGlnZXN0CisJCQkJCQkgKiBlcnJvcgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfVU5LTk9XTl9IRFIJCTcJLyogQ29ubmVjdGlvbiBnb3QgaW52YWxpZGF0ZWQKKwkJCQkJCSAqICBpbnRlcm5hbGx5CisJCQkJCQkgKiBkdWUgdG8gYSBiYWQgb3Bjb2RlIGluIHRoZQorCQkJCQkJICogcGR1IGhkcgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfU1RBTEVfSVRUX1RUVF9SQ1ZECTgJLyogQ29ubmVjdGlvbiBnb3QgaW52YWxpZGF0ZWQKKwkJCQkJCSAqIGludGVybmFsbHkgZHVlIHRvIGEgcmVjaWV2ZWQKKwkJCQkJCSAqIElUVC9UVFQgdGhhdCBkb2VzIG5vdCBiZWxvbmcKKwkJCQkJCSAqIHRvIHRoaXMgQ29ubmVjdGlvbgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfSU5WQUxJRF9JVFRfVFRUX1JDVkQgOQkvKiBDb25uZWN0aW9uIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseSBkdWUgdG8gcmVjaWV2ZWQKKwkJCQkJCSAqIElUVC9UVFQgdmFsdWUgPiBNYXgKKwkJCQkJCSAqIFN1cHBvcnRlZCBJVFRzL1RUVHMKKwkJCQkJCSAqLworI2RlZmluZSBDWE5fS0lMTEVEX1JTVF9SQ1ZECQkxMAkvKiBDb25uZWN0aW9uIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseSBkdWUgdG8gYW4KKwkJCQkJCSAqIGluY29taW5nIFRDUCBSU1QKKwkJCQkJCSAqLworI2RlZmluZSBDWE5fS0lMTEVEX1RJTUVEX09VVAkJMTEJLyogQ29ubmVjdGlvbiBnb3QgaW52YWxpZGF0ZWQKKwkJCQkJCSAqIGludGVybmFsbHkgZHVlIHRvIHRpbWVvdXQgb24KKwkJCQkJCSAqIHRjcCBzZWdtZW50IDEyIHJldHJhbnNtaXQKKwkJCQkJCSAqIGF0dGVtcHRzIGZhaWxlZAorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfUlNUX1NFTlQJCTEyCS8qIENvbm5lY3Rpb24gZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0byBUQ1AgUlNUCisJCQkJCQkgKiBzZW50IGJ5IHRoZSBUeCBzaWRlCisJCQkJCQkgKi8KKyNkZWZpbmUgQ1hOX0tJTExFRF9GSU5fUkNWRAkJMTMJLyogQ29ubmVjdGlvbiBnb3QgaW52YWxpZGF0ZWQKKwkJCQkJCSAqIGludGVybmFsbHkgZHVlIHRvIGFuCisJCQkJCQkgKiBpbmNvbWluZyBUQ1AgRklOLgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfQkFEX1VOU09MX1BEVV9SQ1ZECTE0CS8qIENvbm5lY3Rpb24gZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0byBiYWQKKwkJCQkJCSAqIHVuc29saWNpdGVkIFBEVSBVbnNvbGljaXRlZAorCQkJCQkJICogUERVcyBhcmUgUERVcyB3aXRoCisJCQkJCQkgKiBJVFQ9MHhmZmZmZmZmZgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfQkFEX1dSQl9JTkRFWF9FUlJPUgkxNQkvKiBDb25uZWN0aW9uIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseSBkdWUgdG8gYmFkIFdSQgorCQkJCQkJICogaW5kZXguCisJCQkJCQkgKi8KKyNkZWZpbmUgQ1hOX0tJTExFRF9PVkVSX1JVTl9SRVNJRFVBTAkxNgkvKiBDb21tYW5kIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseSBkdWUgdG8gcmVjaXZlZAorCQkJCQkJICogY29tbWFuZCBoYXMgcmVzaWR1YWwKKwkJCQkJCSAqIG92ZXIgcnVuIGJ5dGVzLgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfVU5ERVJfUlVOX1JFU0lEVUFMCTE3CS8qIENvbW1hbmQgZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0byByZWNpdmVkCisJCQkJCQkgKiBjb21tYW5kIGhhcyByZXNpZHVhbCB1bmRlcgorCQkJCQkJICogcnVuIGJ5dGVzLgorCQkJCQkJICovCisjZGVmaW5lIENNRF9LSUxMRURfSU5WQUxJRF9TVEFUU05fUkNWRAkxOAkvKiBDb21tYW5kIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseSBkdWUgdG8gYSByZWNpZXZlZAorCQkJCQkJICogUERVIGhhcyBhbiBpbnZhbGlkIFN0YXR1c1NOCisJCQkJCQkgKi8KKyNkZWZpbmUgQ01EX0tJTExFRF9JTlZBTElEX1IyVF9SQ1ZECTE5CS8qIENvbW1hbmQgZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0byBhIHJlY2lldmVkCisJCQkJCQkgKiBhbiBSMlQgd2l0aCBzb21lIGludmFsaWQKKwkJCQkJCSAqIGZpZWxkcyBpbiBpdAorCQkJCQkJICovCisjZGVmaW5lIENNRF9DWE5fS0lMTEVEX0xVTl9JTlZBTElECTIwCS8qIENvbW1hbmQgZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0byByZWNlaXZlZAorCQkJCQkJICogUERVIGhhcyBhbiBpbnZhbGlkIExVTi4KKwkJCQkJCSAqLworI2RlZmluZSBDTURfQ1hOX0tJTExFRF9JQ0RfSU5WQUxJRAkyMQkvKiBDb21tYW5kIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseSBkdWUgdG8gdGhlCisJCQkJCQkgKiBjb3JyZXNwb25kaW5nIElDRCBub3QgaW4gYQorCQkJCQkJICogdmFsaWQgc3RhdGUKKwkJCQkJCSAqLworI2RlZmluZSBDTURfQ1hOX0tJTExFRF9JVFRfSU5WQUxJRAkyMgkvKiBDb21tYW5kIGdvdCBpbnZhbGlkYXRlZCBkdWUKKwkJCQkJCSAqICB0byByZWNlaXZlZCBQRFUgaGFzIGFuCisJCQkJCQkgKiAgaW52YWxpZCBJVFQuCisJCQkJCQkgKi8KKyNkZWZpbmUgQ01EX0NYTl9LSUxMRURfU0VRX09VVE9GT1JERVIJMjMJLyogQ29tbWFuZCBnb3QgaW52YWxpZGF0ZWQgZHVlCisJCQkJCQkgKiB0byByZWNlaXZlZCBzZXF1ZW5jZSBidWZmZXIKKwkJCQkJCSAqIG9mZnNldCBpcyBvdXQgb2Ygb3JkZXIuCisJCQkJCQkgKi8KKyNkZWZpbmUgQ01EX0NYTl9LSUxMRURfSU5WQUxJRF9EQVRBU05fUkNWRCAyNAkvKiBDb21tYW5kIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseSBkdWUgdG8gYQorCQkJCQkJICogcmVjaWV2ZWQgUERVIGhhcyBhbiBpbnZhbGlkCisJCQkJCQkgKiBEYXRhU04KKwkJCQkJCSAqLworI2RlZmluZSBDWE5fSU5WQUxJREFURV9OT1RJRlkJCTI1CS8qIENvbm5lY3Rpb24gaW52YWxpZGF0aW9uCisJCQkJCQkgKiBjb21wbGV0aW9uIG5vdGlmeS4KKwkJCQkJCSAqLworI2RlZmluZSBDWE5fSU5WQUxJREFURV9JTkRFWF9OT1RJRlkJMjYJLyogQ29ubmVjdGlvbiBpbnZhbGlkYXRpb24KKwkJCQkJCSAqIGNvbXBsZXRpb24KKwkJCQkJCSAqIHdpdGggZGF0YSBQRFUgaW5kZXguCisJCQkJCQkgKi8KKyNkZWZpbmUgQ01EX0lOVkFMSURBVEVEX05PVElGWQkJMjcJLyogQ29tbWFuZCBpbnZhbGlkYXRpb24KKwkJCQkJCSAqIGNvbXBsZXRpb25ub3RpZmlmeS4KKwkJCQkJCSAqLworI2RlZmluZSBVTlNPTF9IRFJfTk9USUZZCQkyOAkvKiBVbnNvbGljaXRlZCBoZWFkZXIgbm90aWZ5LiovCisjZGVmaW5lIFVOU09MX0RBVEFfTk9USUZZCQkyOQkvKiBVbnNvbGljaXRlZCBkYXRhIG5vdGlmeS4qLworI2RlZmluZSBVTlNPTF9EQVRBX0RJR0VTVF9FUlJPUl9OT1RJRlkgCTMwCS8qIFVuc29saWNpdGVkIGRhdGEgZGlnZXN0CisJCQkJCQkgKiBlcnJvciBub3RpZnkuCisJCQkJCQkgKi8KKyNkZWZpbmUgRFJJVkVSTVNHX05PVElGWQkJMzEJLyogVENQIGFja25vd2xlZGdlIGJhc2VkCisJCQkJCQkgKiBub3RpZmljYXRpb24uCisJCQkJCQkgKi8KKyNkZWZpbmUgQ1hOX0tJTExFRF9DTU5EX0RBVEFfTk9UX09OX1NBTUVfQ09OTiAzMiAvKiBDb25uZWN0aW9uIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICAqIGludGVybmFsbHkgZHVlIHRvIGNvbW1hbmQKKwkJCQkJCSAgKiBhbmQgZGF0YSBhcmUgbm90IG9uIHNhbWUKKwkJCQkJCSAgKiBjb25uZWN0aW9uLgorCQkJCQkJICAqLworI2RlZmluZSBTT0xfQ01EX0tJTExFRF9ESUZfRVJSCQkzMwkvKiBTb2xpY2l0ZWQgY29tbWFuZCBnb3QKKwkJCQkJCSAqICBpbnZhbGlkYXRlZCBpbnRlcm5hbGx5IGR1ZQorCQkJCQkJICogIHRvIERJRiBlcnJvcgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfU1lOX1JDVkQJCTM0CS8qIENvbm5lY3Rpb24gZ290IGludmFsaWRhdGVkCisJCQkJCQkgKiBpbnRlcm5hbGx5IGR1ZSB0byBpbmNvbWluZworCQkJCQkJICogVENQIFNZTgorCQkJCQkJICovCisjZGVmaW5lIENYTl9LSUxMRURfSU1NX0RBVEFfUkNWRAkzNQkvKiBDb25uZWN0aW9uIGdvdCBpbnZhbGlkYXRlZAorCQkJCQkJICogaW50ZXJuYWxseSBkdWUgdG8gYW4KKwkJCQkJCSAqIGluY29taW5nIFVuc29saWNpdGVkIFBEVQorCQkJCQkJICogdGhhdCBoYXMgaW1tZWRpYXRlIGRhdGEgb24KKwkJCQkJCSAqIHRoZSBjeG4KKwkJCQkJCSAqLworCit2b2lkIGJlX3dyYl9oZHJfcHJlcGFyZShzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiLCBpbnQgcGF5bG9hZF9sZW4sCisJCQlib29sIGVtYmVkZGVkLCB1OCBzZ2VfY250KTsKKwordm9pZCBiZV9jbWRfaGRyX3ByZXBhcmUoc3RydWN0IGJlX2NtZF9yZXFfaGRyICpyZXFfaGRyLAorCQkJdTggc3Vic3lzdGVtLCB1OCBvcGNvZGUsIGludCBjbWRfbGVuKTsKKworI2VuZGlmIC8qICFCRUlTQ1NJX0NNRFNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQyNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKQEAgLTAsMCArMSw2MzggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOSBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFua0BzZXJ2ZXJlbmdpbmVzLmNvbSkKKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKgorICovCisKKyNpbmNsdWRlIDxzY3NpL2xpYmlzY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorCisjaW5jbHVkZSAiYmVfaXNjc2kuaCIKKworZXh0ZXJuIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgYmVpc2NzaV9pc2NzaV90cmFuc3BvcnQ7CisKKy8qKgorICogYmVpc2NzaV9zZXNzaW9uX2NyZWF0ZSAtIGNyZWF0ZXMgYSBuZXcgaXNjc2kgc2Vzc2lvbgorICogQGNtZHNfbWF4OiBtYXggY29tbWFuZHMgc3VwcG9ydGVkCisgKiBAcWRlcHRoOiBtYXggcXVldWUgZGVwdGggc3VwcG9ydGVkCisgKiBAaW5pdGlhbF9jbWRzbjogaW5pdGlhbCBpc2NzaSBDTURTTgorICovCitzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmJlaXNjc2lfc2Vzc2lvbl9jcmVhdGUoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwKKwkJCQkJCSB1MTYgY21kc19tYXgsCisJCQkJCQkgdTE2IHFkZXB0aCwKKwkJCQkJCSB1MzIgaW5pdGlhbF9jbWRzbikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcDsKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgYmVpc2NzaV9zZXNzaW9uICpiZWlzY3NpX3Nlc3M7CisJc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqaW9fdGFzazsKKworCVNFX0RFQlVHKERCR19MVkxfOCwgIkluIGJlaXNjc2lfc2Vzc2lvbl9jcmVhdGVcbiIpOworCisJaWYgKCFlcCkgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJiZWlzY3NpX3Nlc3Npb25fY3JlYXRlOiBpbnZhbGlkIGVwIFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwliZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CisJcGhiYSA9IGJlaXNjc2lfZXAtPnBoYmE7CisJc2hvc3QgPSBwaGJhLT5zaG9zdDsKKwlpZiAoY21kc19tYXggPiBiZWlzY3NpX2VwLT5waGJhLT5wYXJhbXMud3Jic19wZXJfY3huKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgc2hvc3QsICJDYW5ub3QgaGFuZGxlICVkIGNtZHMuIgorCQkJICAgICAiTWF4IGNtZHMgcGVyIHNlc3Npb24gc3VwcG9ydGVkIGlzICVkLiBVc2luZyAlZC4gIgorCQkJICAgICAiXG4iLCBjbWRzX21heCwKKwkJCSAgICAgIGJlaXNjc2lfZXAtPnBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4sCisJCQkgICAgICBiZWlzY3NpX2VwLT5waGJhLT5wYXJhbXMud3Jic19wZXJfY3huKTsKKwkJY21kc19tYXggPSBiZWlzY3NpX2VwLT5waGJhLT5wYXJhbXMud3Jic19wZXJfY3huOworCX0KKworCSBjbHNfc2Vzc2lvbiA9IGlzY3NpX3Nlc3Npb25fc2V0dXAoJmJlaXNjc2lfaXNjc2lfdHJhbnNwb3J0LAorCQkJCQkgICBzaG9zdCwgY21kc19tYXgsCisJCQkJCSAgIHNpemVvZigqYmVpc2NzaV9zZXNzKSwKKwkJCQkJICAgc2l6ZW9mKCppb190YXNrKSwKKwkJCQkJICAgaW5pdGlhbF9jbWRzbiwgSVNDU0lfTUFYX1RBUkdFVCk7CisJaWYgKCFjbHNfc2Vzc2lvbikKKwkJcmV0dXJuIE5VTEw7CisJc2VzcyA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOworCWJlaXNjc2lfc2VzcyA9IHNlc3MtPmRkX2RhdGE7CisJYmVpc2NzaV9zZXNzLT5iaHNfcG9vbCA9ICBwY2lfcG9vbF9jcmVhdGUoImJlaXNjc2lfYmhzX3Bvb2wiLAorCQkJCQkJICAgcGhiYS0+cGNpZGV2LAorCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBiZV9jbWRfYmhzKSwKKwkJCQkJCSAgIDY0LCAwKTsKKwlpZiAoIWJlaXNjc2lfc2Vzcy0+YmhzX3Bvb2wpCisJCWdvdG8gZGVzdHJveV9zZXNzOworCisJcmV0dXJuIGNsc19zZXNzaW9uOworZGVzdHJveV9zZXNzOgorCWlzY3NpX3Nlc3Npb25fdGVhcmRvd24oY2xzX3Nlc3Npb24pOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGJlaXNjc2lfc2Vzc2lvbl9kZXN0cm95IC0gZGVzdHJveXMgaXNjc2kgc2Vzc2lvbgorICogQGNsc19zZXNzaW9uOglwb2ludGVyIHRvIGlzY3NpIGNscyBzZXNzaW9uCisgKgorICogRGVzdHJveXMgaVNDU0kgc2Vzc2lvbiBpbnN0YW5jZSBhbmQgcmVsZWFzZXMKKyAqIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGl0LgorICovCit2b2lkIGJlaXNjc2lfc2Vzc2lvbl9kZXN0cm95KHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCit7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3MgPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgYmVpc2NzaV9zZXNzaW9uICpiZWlzY3NpX3Nlc3MgPSBzZXNzLT5kZF9kYXRhOworCisJcGNpX3Bvb2xfZGVzdHJveShiZWlzY3NpX3Nlc3MtPmJoc19wb29sKTsKKwlpc2NzaV9zZXNzaW9uX3RlYXJkb3duKGNsc19zZXNzaW9uKTsKK30KKworLyoqCisgKiBiZWlzY3NpX2Nvbm5fY3JlYXRlIC0gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGlzY3NpIGNvbm5lY3Rpb24KKyAqIEBjbHNfc2Vzc2lvbjogcHRyIHRvIGlzY3NpX2Nsc19zZXNzaW9uCisgKiBAY2lkOiBpc2NzaSBjaWQKKyAqLworc3RydWN0IGlzY3NpX2Nsc19jb25uICoKK2JlaXNjc2lfY29ubl9jcmVhdGUoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbiwgdTMyIGNpZCkKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmE7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubjsKKwlzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm47CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGJlaXNjc2lfc2Vzc2lvbiAqYmVpc2NzaV9zZXNzOworCisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9jb25uX2NyZWF0ZSAsY2lkIgorCQkgImZyb20gaXNjc2kgbGF5ZXI9JWRcbiIsIGNpZCk7CisJc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KGNsc19zZXNzaW9uKTsKKwlwaGJhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKKworCWNsc19jb25uID0gaXNjc2lfY29ubl9zZXR1cChjbHNfc2Vzc2lvbiwgc2l6ZW9mKCpiZWlzY3NpX2Nvbm4pLCBjaWQpOworCWlmICghY2xzX2Nvbm4pCisJCXJldHVybiBOVUxMOworCisJY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCWJlaXNjc2lfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJYmVpc2NzaV9jb25uLT5lcCA9IE5VTEw7CisJYmVpc2NzaV9jb25uLT5waGJhID0gcGhiYTsKKwliZWlzY3NpX2Nvbm4tPmNvbm4gPSBjb25uOworCXNlc3MgPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKKwliZWlzY3NpX3Nlc3MgPSBzZXNzLT5kZF9kYXRhOworCWJlaXNjc2lfY29ubi0+YmVpc2NzaV9zZXNzID0gYmVpc2NzaV9zZXNzOworCXJldHVybiBjbHNfY29ubjsKK30KKworLyoqCisgKiBiZWlzY3NpX2JpbmRjb25uX2NpZCAtIEJpbmQgdGhlIGJlaXNjc2lfY29ubiB3aXRoIHBoYmEgY29ubmVjdGlvbiB0YWJsZQorICogQGJlaXNjc2lfY29ubjogVGhlIHBvaW50ZXIgdG8gIGJlaXNjc2lfY29ubiBzdHJ1Y3R1cmUKKyAqIEBwaGJhOiBUaGUgcGhiYSBpbnN0YW5jZQorICogQGNpZDogVGhlIGNpZCB0byBmcmVlCisgKi8KK3N0YXRpYyBpbnQgYmVpc2NzaV9iaW5kY29ubl9jaWQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJCXN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKKwkJCQl1bnNpZ25lZCBpbnQgY2lkKQoreworCWlmIChwaGJhLT5jb25uX3RhYmxlW2NpZF0pIHsKKwkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJICJDb25uZWN0aW9uIHRhYmxlIGFscmVhZHkgb2NjdXBpZWQuIERldGVjdGVkIGNsYXNoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJU0VfREVCVUcoREJHX0xWTF84LCAicGhiYS0+Y29ubl90YWJsZVslZF09JXAoYmVpc2NzaV9jb25uKSBcbiIsCisJCQkgY2lkLCBiZWlzY3NpX2Nvbm4pOworCQlwaGJhLT5jb25uX3RhYmxlW2NpZF0gPSBiZWlzY3NpX2Nvbm47CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGJlaXNjc2lfY29ubl9iaW5kIC0gQmluZHMgaXNjc2kgc2Vzc2lvbi9jb25uZWN0aW9uIHdpdGggVENQIGNvbm5lY3Rpb24KKyAqIEBjbHNfc2Vzc2lvbjogcG9pbnRlciB0byBpc2NzaSBjbHMgc2Vzc2lvbgorICogQGNsc19jb25uOiBwb2ludGVyIHRvIGlzY3NpIGNscyBjb25uCisgKiBAdHJhbnNwb3J0X2ZkOiBFUCBoYW5kbGUoNjQgYml0KQorICoKKyAqIFRoaXMgZnVuY3Rpb24gYmluZHMgdGhlIFRDUCBDb25uIHdpdGggaVNDU0kgQ29ubmVjdGlvbiBhbmQgU2Vzc2lvbi4KKyAqLworaW50IGJlaXNjc2lfY29ubl9iaW5kKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24sCisJCSAgICAgIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCSAgICAgIHU2NCB0cmFuc3BvcnRfZmQsIGludCBpc19sZWFkaW5nKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9CisJCShzdHJ1Y3QgU2NzaV9Ib3N0ICopaXNjc2lfc2Vzc2lvbl90b19zaG9zdChjbHNfc2Vzc2lvbik7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gKHN0cnVjdCBiZWlzY3NpX2hiYSAqKWlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisJc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXA7CisJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKKworCVNFX0RFQlVHKERCR19MVkxfOCwgIkluIGJlaXNjc2lfY29ubl9iaW5kXG4iKTsKKwllcCA9IGlzY3NpX2xvb2t1cF9lbmRwb2ludCh0cmFuc3BvcnRfZmQpOworCWlmICghZXApCisJCXJldHVybiAtRUlOVkFMOworCisJYmVpc2NzaV9lcCA9IGVwLT5kZF9kYXRhOworCisJaWYgKGlzY3NpX2Nvbm5fYmluZChjbHNfc2Vzc2lvbiwgY2xzX2Nvbm4sIGlzX2xlYWRpbmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChiZWlzY3NpX2VwLT5waGJhICE9IHBoYmEpIHsKKwkJU0VfREVCVUcoREJHX0xWTF84LAorCQkJICJiZWlzY3NpX2VwLT5oYmE9JXAgbm90IGVxdWFsIHRvIHBoYmE9JXAgXG4iLAorCQkJIGJlaXNjc2lfZXAtPnBoYmEsIHBoYmEpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwliZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQgPSBiZWlzY3NpX2VwLT5lcF9jaWQ7CisJYmVpc2NzaV9jb25uLT5lcCA9IGJlaXNjc2lfZXA7CisJYmVpc2NzaV9lcC0+Y29ubiA9IGJlaXNjc2lfY29ubjsKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJiZWlzY3NpX2Nvbm49JXAgY29ubj0lcCBlcF9jaWQ9JWQgXG4iLAorCQkgYmVpc2NzaV9jb25uLCBjb25uLCBiZWlzY3NpX2VwLT5lcF9jaWQpOworCXJldHVybiBiZWlzY3NpX2JpbmRjb25uX2NpZChwaGJhLCBiZWlzY3NpX2Nvbm4sIGJlaXNjc2lfZXAtPmVwX2NpZCk7Cit9CisKKy8qKgorICogYmVpc2NzaV9jb25uX2dldF9wYXJhbSAtIGdldCB0aGUgaXNjc2kgcGFyYW1ldGVyCisgKiBAY2xzX2Nvbm46IHBvaW50ZXIgdG8gaXNjc2kgY2xzIGNvbm4KKyAqIEBwYXJhbTogcGFyYW1ldGVyIHR5cGUgaWRlbnRpZmllcgorICogQGJ1ZjogYnVmZmVyIHBvaW50ZXIKKyAqCisgKiByZXR1cm5zIGlzY3NpIHBhcmFtZXRlcgorICovCitpbnQgYmVpc2NzaV9jb25uX2dldF9wYXJhbShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLAorCQkJICAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlpbnQgbGVuID0gMDsKKworCWJlaXNjc2lfZXAgPSBiZWlzY3NpX2Nvbm4tPmVwOworCWlmICghYmVpc2NzaV9lcCkgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsCisJCQkgIkluIGJlaXNjc2lfY29ubl9nZXRfcGFyYW0gLCBubyBiZWlzY3NpX2VwXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlaHVcbiIsIGJlaXNjc2lfZXAtPmRzdF90Y3Bwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1M6CisJCWlmIChiZWlzY3NpX2VwLT5pcF90eXBlID09IEJFMl9JUFY0KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlcEk0XG4iLCAmYmVpc2NzaV9lcC0+ZHN0X2FkZHIpOworCQllbHNlCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVwSTZcbiIsICZiZWlzY3NpX2VwLT5kc3Q2X2FkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gaXNjc2lfY29ubl9nZXRfcGFyYW0oY2xzX2Nvbm4sIHBhcmFtLCBidWYpOworCX0KKwlyZXR1cm4gbGVuOworfQorCitpbnQgYmVpc2NzaV9zZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJICAgICAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOworCWludCByZXQ7CisKKwlyZXQgPSBpc2NzaV9zZXRfcGFyYW0oY2xzX2Nvbm4sIHBhcmFtLCBidWYsIGJ1Zmxlbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIElmIHVzZXJzcGFjZSB0cmllZCB0byBzZXQgdGhlIHZhbHVlIHRvIGhpZ2hlciB0aGFuIHdlIGNhbgorCSAqIHN1cHBvcnQgb3ZlcnJpZGUgaGVyZS4KKwkgKi8KKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9QQVJBTV9GSVJTVF9CVVJTVDoKKwkJaWYgKHNlc3Npb24tPmZpcnN0X2J1cnN0ID4gODE5MikKKwkJCXNlc3Npb24tPmZpcnN0X2J1cnN0ID0gODE5MjsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUkVDVl9ETEVOR1RIOgorCQlpZiAoY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCA+IDY1NTM2KQorCQkJY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCA9IDY1NTM2OworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX01BWF9CVVJTVDoKKwkJaWYgKHNlc3Npb24tPmZpcnN0X2J1cnN0ID4gMjYyMTQ0KQorCQkJc2Vzc2lvbi0+Zmlyc3RfYnVyc3QgPSAyNjIxNDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJlaXNjc2lfZ2V0X2hvc3RfcGFyYW0gLSBnZXQgdGhlIGlzY3NpIHBhcmFtZXRlcgorICogQHNob3N0OiBwb2ludGVyIHRvIHNjc2lfaG9zdCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbTogcGFyYW1ldGVyIHR5cGUgaWRlbnRpZmllcgorICogQGJ1ZjogYnVmZmVyIHBvaW50ZXIKKyAqCisgKiByZXR1cm5zIGhvc3QgcGFyYW1ldGVyCisgKi8KK2ludCBiZWlzY3NpX2dldF9ob3N0X3BhcmFtKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJICAgZW51bSBpc2NzaV9ob3N0X3BhcmFtIHBhcmFtLCBjaGFyICpidWYpCit7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gKHN0cnVjdCBiZWlzY3NpX2hiYSAqKWlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisJaW50IGxlbiA9IDA7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUzoKKwkJYmVfY21kX2dldF9tYWNfYWRkcigmcGhiYS0+Y3RybCwgcGhiYS0+bWFjX2FkZHJlc3MpOworCQlsZW4gPSBzeXNmc19mb3JtYXRfbWFjKGJ1ZiwgcGhiYS0+bWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGlzY3NpX2hvc3RfZ2V0X3BhcmFtKHNob3N0LCBwYXJhbSwgYnVmKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBiZWlzY3NpX2Nvbm5fZ2V0X3N0YXRzIC0gZ2V0IHRoZSBpc2NzaSBzdGF0cworICogQGNsc19jb25uOiBwb2ludGVyIHRvIGlzY3NpIGNscyBjb25uCisgKiBAc3RhdHM6IHBvaW50ZXIgdG8gaXNjc2lfc3RhdHMgc3RydWN0dXJlCisgKgorICogcmV0dXJucyBpc2NzaSBzdGF0cworICovCit2b2lkIGJlaXNjc2lfY29ubl9nZXRfc3RhdHMoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCSAgICBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2Nvbm5fZ2V0X3N0YXRzXG4iKTsKKwlzdGF0cy0+dHhkYXRhX29jdGV0cyA9IGNvbm4tPnR4ZGF0YV9vY3RldHM7CisJc3RhdHMtPnJ4ZGF0YV9vY3RldHMgPSBjb25uLT5yeGRhdGFfb2N0ZXRzOworCXN0YXRzLT5kYXRhb3V0X3BkdXMgPSBjb25uLT5kYXRhb3V0X3BkdXNfY250OworCXN0YXRzLT5zY3NpcnNwX3BkdXMgPSBjb25uLT5zY3NpcnNwX3BkdXNfY250OworCXN0YXRzLT5zY3NpY21kX3BkdXMgPSBjb25uLT5zY3NpY21kX3BkdXNfY250OworCXN0YXRzLT5kYXRhaW5fcGR1cyA9IGNvbm4tPmRhdGFpbl9wZHVzX2NudDsKKwlzdGF0cy0+dG1mcnNwX3BkdXMgPSBjb25uLT50bWZyc3BfcGR1c19jbnQ7CisJc3RhdHMtPnRtZmNtZF9wZHVzID0gY29ubi0+dG1mY21kX3BkdXNfY250OworCXN0YXRzLT5yMnRfcGR1cyA9IGNvbm4tPnIydF9wZHVzX2NudDsKKwlzdGF0cy0+ZGlnZXN0X2VyciA9IDA7CisJc3RhdHMtPnRpbWVvdXRfZXJyID0gMDsKKwlzdGF0cy0+Y3VzdG9tX2xlbmd0aCA9IDA7CisJc3RyY3B5KHN0YXRzLT5jdXN0b21bMF0uZGVzYywgImVoX2Fib3J0X2NudCIpOworCXN0YXRzLT5jdXN0b21bMF0udmFsdWUgPSBjb25uLT5laF9hYm9ydF9jbnQ7Cit9CisKKy8qKgorICogYmVpc2NzaV9zZXRfcGFyYW1zX2Zvcl9vZmZsZCAtIGdldCB0aGUgcGFyYW1ldGVycyBmb3Igb2ZmbG9hZAorICogQGJlaXNjc2lfY29ubjogcG9pbnRlciB0byBiZWlzY3NpX2Nvbm4KKyAqIEBwYXJhbXM6IHBvaW50ZXIgdG8gb2ZmbG9hZF9wYXJhbXMgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkICBiZWlzY3NpX3NldF9wYXJhbXNfZm9yX29mZmxkKHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKKwkJCQkJICBzdHJ1Y3QgYmVpc2NzaV9vZmZsb2FkX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKKworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfYmVpc2NzaV9vZmZsb2FkX3BhcmFtcywgbWF4X2J1cnN0X2xlbmd0aCwKKwkJICAgICAgcGFyYW1zLCBzZXNzaW9uLT5tYXhfYnVyc3QpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfYmVpc2NzaV9vZmZsb2FkX3BhcmFtcywKKwkJICAgICAgbWF4X3NlbmRfZGF0YV9zZWdtZW50X2xlbmd0aCwgcGFyYW1zLAorCQkgICAgICBjb25uLT5tYXhfeG1pdF9kbGVuZ3RoKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2JlaXNjc2lfb2ZmbG9hZF9wYXJhbXMsIGZpcnN0X2J1cnN0X2xlbmd0aCwKKwkJICAgICAgcGFyYW1zLCBzZXNzaW9uLT5maXJzdF9idXJzdCk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLCBlcmwsIHBhcmFtcywKKwkJICAgICAgc2Vzc2lvbi0+ZXJsKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2JlaXNjc2lfb2ZmbG9hZF9wYXJhbXMsIGRkZSwgcGFyYW1zLAorCQkgICAgICBjb25uLT5kYXRhZGdzdF9lbik7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLCBoZGUsIHBhcmFtcywKKwkJICAgICAgY29ubi0+aGRyZGdzdF9lbik7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLCBpcjJ0LCBwYXJhbXMsCisJCSAgICAgIHNlc3Npb24tPmluaXRpYWxfcjJ0X2VuKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2JlaXNjc2lfb2ZmbG9hZF9wYXJhbXMsIGltZCwgcGFyYW1zLAorCQkgICAgICBzZXNzaW9uLT5pbW1fZGF0YV9lbik7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLCBleHBfc3RhdHNuLCBwYXJhbXMsCisJCSAgICAgIChjb25uLT5leHBfc3RhdHNuIC0gMSkpOworfQorCisvKioKKyAqIGJlaXNjc2lfY29ubl9zdGFydCAtIG9mZmxvYWQgb2Ygc2Vzc2lvbiB0byBjaGlwCisgKiBAY2xzX2Nvbm46IHBvaW50ZXIgdG8gYmVpc2NzaV9jb25uCisgKi8KK2ludCBiZWlzY3NpX2Nvbm5fc3RhcnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubikKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCXN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXA7CisJc3RydWN0IGJlaXNjc2lfb2ZmbG9hZF9wYXJhbXMgcGFyYW1zOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbi0+Y2xzX3Nlc3Npb24pOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisKKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCBiZWlzY3NpX29mZmxvYWRfcGFyYW1zKSk7CisJYmVpc2NzaV9lcCA9IGJlaXNjc2lfY29ubi0+ZXA7CisJaWYgKCFiZWlzY3NpX2VwKQorCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJJbiBiZWlzY3NpX2Nvbm5fc3RhcnQgLCBubyBiZWlzY3NpX2VwXG4iKTsKKworCWZyZWVfbWdtdF9zZ2xfaGFuZGxlKHBoYmEsIGJlaXNjc2lfY29ubi0+cGxvZ2luX3NnbF9oYW5kbGUpOworCWJlaXNjc2lfY29ubi0+bG9naW5faW5fcHJvZ3Jlc3MgPSAwOworCWJlaXNjc2lfc2V0X3BhcmFtc19mb3Jfb2ZmbGQoYmVpc2NzaV9jb25uLCAmcGFyYW1zKTsKKwliZWlzY3NpX29mZmxvYWRfY29ubmVjdGlvbihiZWlzY3NpX2Nvbm4sICZwYXJhbXMpOworCWlzY3NpX2Nvbm5fc3RhcnQoY2xzX2Nvbm4pOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJlaXNjc2lfZ2V0X2NpZCAtIEFsbG9jYXRlIGEgY2lkCisgKiBAcGhiYTogVGhlIHBoYmEgaW5zdGFuY2UKKyAqLworc3RhdGljIGludCBiZWlzY3NpX2dldF9jaWQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXVuc2lnbmVkIHNob3J0IGNpZCA9IDB4RkZGRjsKKworCWlmICghcGhiYS0+YXZsYmxfY2lkcykKKwkJcmV0dXJuIGNpZDsKKworCWNpZCA9IHBoYmEtPmNpZF9hcnJheVtwaGJhLT5jaWRfYWxsb2MrK107CisJaWYgKHBoYmEtPmNpZF9hbGxvYyA9PSBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybCkKKwkJcGhiYS0+Y2lkX2FsbG9jID0gMDsKKwlwaGJhLT5hdmxibF9jaWRzLS07CisJcmV0dXJuIGNpZDsKK30KKworLyoqCisgKiBiZWlzY3NpX29wZW5fY29ubiAtIEFzayBGVyB0byBvcGVuIGEgVENQIGNvbm5lY3Rpb24KKyAqIEBlcDoJZW5kcG9pbnQgdG8gYmUgdXNlZAorICogQHNyY19hZGRyOiBUaGUgc291cmNlIElQIGFkZHJlc3MKKyAqIEBkc3RfYWRkcjogVGhlIERlc3RpbmF0aW9uICBJUCBhZGRyZXNzCisgKgorICogQXNrcyB0aGUgRlcgdG8gb3BlbiBhIFRDUCBjb25uZWN0aW9uCisgKi8KK3N0YXRpYyBpbnQgYmVpc2NzaV9vcGVuX2Nvbm4oc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwKKwkJCSAgICAgc3RydWN0IHNvY2thZGRyICpzcmNfYWRkciwKKwkJCSAgICAgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwgaW50IG5vbl9ibG9ja2luZykKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCA9IGVwLT5kZF9kYXRhOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGJlaXNjc2lfZXAtPnBoYmE7CisJaW50IHJldCA9IC0xOworCisJYmVpc2NzaV9lcC0+ZXBfY2lkID0gYmVpc2NzaV9nZXRfY2lkKHBoYmEpOworCWlmIChiZWlzY3NpX2VwLT5lcF9jaWQgPT0gMHhGRkZGKSB7CisJCVNFX0RFQlVHKERCR19MVkxfMSwgIk5vIGZyZWUgY2lkIGF2YWlsYWJsZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCVNFX0RFQlVHKERCR19MVkxfOCwgIkluIGJlaXNjc2lfb3Blbl9jb25uLCBlcF9jaWQ9JWQgIiwKKwkJIGJlaXNjc2lfZXAtPmVwX2NpZCk7CisJcGhiYS0+ZXBfYXJyYXlbYmVpc2NzaV9lcC0+ZXBfY2lkXSA9IGVwOworCWlmIChiZWlzY3NpX2VwLT5lcF9jaWQgPgorCSAgICAocGhiYS0+ZndfY29uZmlnLmlzY3NpX2NpZF9zdGFydCArIHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsKSkgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJGYWlsZWQgaW4gYWxsb2NhdGUgaXNjc2kgY2lkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwliZWlzY3NpX2VwLT5jaWRfdmxkID0gMDsKKwlyZXR1cm4gbWdtdF9vcGVuX2Nvbm5lY3Rpb24ocGhiYSwgZHN0X2FkZHIsIGJlaXNjc2lfZXApOworfQorCisvKioKKyAqIGJlaXNjc2lfcHV0X2NpZCAtIEZyZWUgdGhlIGNpZAorICogQHBoYmE6IFRoZSBwaGJhIGZvciB3aGljaCB0aGUgY2lkIGlzIGJlaW5nIGZyZWVkCisgKiBAY2lkOiBUaGUgY2lkIHRvIGZyZWUKKyAqLworc3RhdGljIHZvaWQgYmVpc2NzaV9wdXRfY2lkKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgc2hvcnQgY2lkKQoreworCXBoYmEtPmF2bGJsX2NpZHMrKzsKKwlwaGJhLT5jaWRfYXJyYXlbcGhiYS0+Y2lkX2ZyZWUrK10gPSBjaWQ7CisJaWYgKHBoYmEtPmNpZF9mcmVlID09IHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsKQorCQlwaGJhLT5jaWRfZnJlZSA9IDA7Cit9CisKKy8qKgorICogYmVpc2NzaV9mcmVlX2VwIC0gZnJlZSBlbmRwb2ludAorICogQGVwOglwb2ludGVyIHRvIGlzY3NpIGVuZHBvaW50IHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBiZWlzY3NpX2ZyZWVfZXAoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCkKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCA9IGVwLT5kZF9kYXRhOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGJlaXNjc2lfZXAtPnBoYmE7CisKKwliZWlzY3NpX3B1dF9jaWQocGhiYSwgYmVpc2NzaV9lcC0+ZXBfY2lkKTsKKwliZWlzY3NpX2VwLT5waGJhID0gTlVMTDsKKwlpc2NzaV9kZXN0cm95X2VuZHBvaW50KGVwKTsKK30KKworLyoqCisgKiBiZWlzY3NpX2VwX2Nvbm5lY3QgLSBBc2sgY2hpcCB0byBjcmVhdGUgVENQIENvbm4KKyAqIEBzY3NpX2hvc3Q6IFBvaW50ZXIgdG8gc2NzaV9ob3N0IHN0cnVjdHVyZQorICogQGRzdF9hZGRyOiBUaGUgSVAgYWRkcmVzcyBvZiBUYXJnZXQKKyAqIEBub25fYmxvY2tpbmc6IGJsb2NraW5nIG9yIG5vbi1ibG9ja2luZyBjYWxsCisgKgorICogVGhpcyByb3V0aW5lcyBmaXJzdCBhc2tzIGNoaXAgdG8gY3JlYXRlIGEgY29ubmVjdGlvbiBhbmQgdGhlbiBhbGxvY2F0ZXMgYW4gRVAKKyAqLworc3RydWN0IGlzY3NpX2VuZHBvaW50ICoKK2JlaXNjc2lfZXBfY29ubmVjdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKKwkJICAgaW50IG5vbl9ibG9ja2luZykKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmE7CisJc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXA7CisJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKKwlpbnQgcmV0OworCisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9lcF9jb25uZWN0IFxuIik7CisJaWYgKHNob3N0KQorCQlwaGJhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKKwllbHNlIHsKKwkJcmV0ID0gLUVOWElPOworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJzaG9zdCBpcyBOVUxMIFxuIik7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCWVwID0gaXNjc2lfY3JlYXRlX2VuZHBvaW50KHNpemVvZihzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCkpOworCWlmICghZXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwliZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CisJYmVpc2NzaV9lcC0+cGhiYSA9IHBoYmE7CisKKwlpZiAoYmVpc2NzaV9vcGVuX2Nvbm4oZXAsIE5VTEwsIGRzdF9hZGRyLCBub25fYmxvY2tpbmcpKSB7CisJCVNFX0RFQlVHKERCR19MVkxfMSwgIkZhaWxlZCBpbiBhbGxvY2F0ZSBpc2NzaSBjaWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfZXA7CisJfQorCisJcmV0dXJuIGVwOworCitmcmVlX2VwOgorCWJlaXNjc2lfZnJlZV9lcChlcCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworLyoqCisgKiBiZWlzY3NpX2VwX3BvbGwgLSBQb2xsIHRvIHNlZSBpZiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkCisgKiBAZXA6CWVuZHBvaW50IHRvIGJlIHVzZWQKKyAqIEB0aW1lb3V0X21zOiB0aW1lb3V0IHNwZWNpZmllZCBpbiBtaWxsaXNlY3MKKyAqCisgKiBQb2xsIHRvIHNlZSBpZiBUQ1AgY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorICovCitpbnQgYmVpc2NzaV9lcF9wb2xsKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXAsIGludCB0aW1lb3V0X21zKQoreworCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CisKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiAgYmVpc2NzaV9lcF9wb2xsXG4iKTsKKwlpZiAoYmVpc2NzaV9lcC0+Y2lkX3ZsZCA9PSAxKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKioKKyAqIGJlaXNjc2lfY2xvc2VfY29ubiAtIFVwbG9hZCB0aGUgIGNvbm5lY3Rpb24KKyAqIEBlcDogVGhlIGlzY3NpIGVuZHBvaW50CisgKiBAZmxhZzogVGhlIHR5cGUgb2YgY29ubmVjdGlvbiBjbG9zdXJlCisgKi8KK3N0YXRpYyBpbnQgYmVpc2NzaV9jbG9zZV9jb25uKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXAsIGludCBmbGFnKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gYmVpc2NzaV9lcC0+cGhiYTsKKworCWlmIChNR01UX1NUQVRVU19TVUNDRVNTICE9CisJICAgIG1nbXRfdXBsb2FkX2Nvbm5lY3Rpb24ocGhiYSwgYmVpc2NzaV9lcC0+ZXBfY2lkLAorCQlDT05ORUNUSU9OX1VQTE9BRF9HUkFDRUZVTCkpIHsKKwkJU0VfREVCVUcoREJHX0xWTF84LCAidXBsb2FkIGZhaWxlZCBmb3IgY2lkIDB4JXgiLAorCQkJIGJlaXNjc2lfZXAtPmVwX2NpZCk7CisJCXJldCA9IC0xOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmVpc2NzaV9lcF9kaXNjb25uZWN0IC0gVGVhcnMgZG93biB0aGUgVENQIGNvbm5lY3Rpb24KKyAqIEBlcDoJZW5kcG9pbnQgdG8gYmUgdXNlZAorICoKKyAqIFRlYXJzIGRvd24gdGhlIFRDUCBjb25uZWN0aW9uCisgKi8KK3ZvaWQgYmVpc2NzaV9lcF9kaXNjb25uZWN0KHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXApCit7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uOworCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKwlpbnQgZmxhZyA9IDA7CisKKwliZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CisJcGhiYSA9IGJlaXNjc2lfZXAtPnBoYmE7CisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9lcF9kaXNjb25uZWN0XG4iKTsKKworCWlmIChiZWlzY3NpX2VwLT5jb25uKSB7CisJCWJlaXNjc2lfY29ubiA9IGJlaXNjc2lfZXAtPmNvbm47CisJCWlzY3NpX3N1c3BlbmRfcXVldWUoYmVpc2NzaV9jb25uLT5jb25uKTsKKwkJYmVpc2NzaV9jbG9zZV9jb25uKGVwLCBmbGFnKTsKKwl9CisKKwliZWlzY3NpX2ZyZWVfZXAoZXApOworfQorCisvKioKKyAqIGJlaXNjc2lfdW5iaW5kX2Nvbm5fdG9fY2lkIC0gVW5iaW5kIHRoZSBiZWlzY3NpX2Nvbm4gZnJvbSBwaGJhIGNvbm4gdGFibGUKKyAqIEBwaGJhOiBUaGUgcGhiYSBpbnN0YW5jZQorICogQGNpZDogVGhlIGNpZCB0byBmcmVlCisgKi8KK3N0YXRpYyBpbnQgYmVpc2NzaV91bmJpbmRfY29ubl90b19jaWQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjaWQpCit7CisJaWYgKHBoYmEtPmNvbm5fdGFibGVbY2lkXSkKKwkJcGhiYS0+Y29ubl90YWJsZVtjaWRdID0gTlVMTDsKKwllbHNlIHsKKwkJU0VfREVCVUcoREJHX0xWTF84LCAiQ29ubmVjdGlvbiB0YWJsZSBOb3Qgb2NjdXBpZWQuIFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiZWlzY3NpX2Nvbm5fc3RvcCAtIEludmFsaWRhdGUgYW5kIHN0b3AgdGhlIGNvbm5lY3Rpb24KKyAqIEBjbHNfY29ubjogcG9pbnRlciB0byBnZXQgaXNjc2lfY29ubgorICogQGZsYWc6IFRoZSB0eXBlIG9mIGNvbm5lY3Rpb24gY2xvc3VyZQorICovCit2b2lkIGJlaXNjc2lfY29ubl9zdG9wKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sIGludCBmbGFnKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcDsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24tPmNsc19zZXNzaW9uKTsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgc2F2ZWNmZ19mbGFnID0gQ01EX0lTQ1NJX1NFU1NJT05fU0FWRV9DRkdfT05fRkxBU0g7CisKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2Nvbm5fc3RvcFxuIik7CisJYmVpc2NzaV9lcCA9IGJlaXNjc2lfY29ubi0+ZXA7CisJaWYgKCFiZWlzY3NpX2VwKSB7CisJCVNFX0RFQlVHKERCR19MVkxfOCwgIkluIGJlaXNjc2lfY29ubl9zdG9wICwgbm8gYmVpc2NzaV9lcFxuIik7CisJCXJldHVybjsKKwl9CisJc3RhdHVzID0gbWdtdF9pbnZhbGlkYXRlX2Nvbm5lY3Rpb24ocGhiYSwgYmVpc2NzaV9lcCwKKwkJCQkJICAgIGJlaXNjc2lfZXAtPmVwX2NpZCwgMSwKKwkJCQkJICAgIHNhdmVjZmdfZmxhZyk7CisJaWYgKHN0YXR1cyAhPSBNR01UX1NUQVRVU19TVUNDRVNTKSB7CisJCVNFX0RFQlVHKERCR19MVkxfMSwKKwkJCSAibWdtdF9pbnZhbGlkYXRlX2Nvbm5lY3Rpb24gRmFpbGVkIGZvciBjaWQ9JWQgXG4iLAorCQkJIGJlaXNjc2lfZXAtPmVwX2NpZCk7CisJfQorCWJlaXNjc2lfdW5iaW5kX2Nvbm5fdG9fY2lkKHBoYmEsIGJlaXNjc2lfZXAtPmVwX2NpZCk7CisJaXNjc2lfY29ubl9zdG9wKGNsc19jb25uLCBmbGFnKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyZmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOSBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFua0BzZXJ2ZXJlbmdpbmVzLmNvbSkKKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKgorICovCisKKyNpZm5kZWYgX0JFX0lTQ1NJXworI2RlZmluZSBfQkVfSVNDU0lfCisKKyNpbmNsdWRlICJiZV9tYWluLmgiCisjaW5jbHVkZSAiYmVfbWdtdC5oIgorCisjZGVmaW5lIEJFMl9JUFY0ICAweDEKKyNkZWZpbmUgQkUyX0lQVjYgIDB4MTAKKwordm9pZCBiZWlzY3NpX29mZmxvYWRfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCQkJc3RydWN0IGJlaXNjc2lfb2ZmbG9hZF9wYXJhbXMgKnBhcmFtcyk7CisKK3ZvaWQgYmVpc2NzaV9vZmZsb2FkX2lzY3NpKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sCisJCQkgICBzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCQkgICB1bnNpZ25lZCBpbnQgZndfaGFuZGxlKTsKKworc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpiZWlzY3NpX3Nlc3Npb25fY3JlYXRlKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXAsCisJCQkJCQkgdWludDE2X3QgY21kc19tYXgsCisJCQkJCQkgdWludDE2X3QgcWRlcHRoLAorCQkJCQkJIHVpbnQzMl90IGluaXRpYWxfY21kc24pOworCit2b2lkIGJlaXNjc2lfc2Vzc2lvbl9kZXN0cm95KHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pOworCitzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmJlaXNjc2lfY29ubl9jcmVhdGUoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uCisJCQkJCSAgICpjbHNfc2Vzc2lvbiwgdWludDMyX3QgY2lkKTsKKworaW50IGJlaXNjc2lfY29ubl9iaW5kKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24sCisJCSAgICAgIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCSAgICAgIHVpbnQ2NF90IHRyYW5zcG9ydF9mZCwgaW50IGlzX2xlYWRpbmcpOworCitpbnQgYmVpc2NzaV9jb25uX2dldF9wYXJhbShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLAorCQkJICAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKTsKKworaW50IGJlaXNjc2lfZ2V0X2hvc3RfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkgICBlbnVtIGlzY3NpX2hvc3RfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1Zik7CisKK2ludCBiZWlzY3NpX3NldF9wYXJhbShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLAorCQkgICAgICBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCBjaGFyICpidWYsIGludCBidWZsZW4pOworCitpbnQgYmVpc2NzaV9jb25uX3N0YXJ0KHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4pOworCit2b2lkIGJlaXNjc2lfY29ubl9zdG9wKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sIGludCBmbGFnKTsKKworc3RydWN0IGlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwX2Nvbm5lY3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkJCSAgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKKwkJCQkJICBpbnQgbm9uX2Jsb2NraW5nKTsKKworaW50IGJlaXNjc2lfZXBfcG9sbChzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLCBpbnQgdGltZW91dF9tcyk7CisKK3ZvaWQgYmVpc2NzaV9lcF9kaXNjb25uZWN0KHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXApOworCit2b2lkIGJlaXNjc2lfY29ubl9nZXRfc3RhdHMoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCSAgICBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFhY2EzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYwpAQCAtMCwwICsxLDMzOTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOSBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFua0BzZXJ2ZXJlbmdpbmVzLmNvbSkKKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqICBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxzY3NpL2xpYmlzY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgImJlX21haW4uaCIKKyNpbmNsdWRlICJiZV9pc2NzaS5oIgorI2luY2x1ZGUgImJlX21nbXQuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBiZV9pb3BvbGxfYnVkZ2V0ID0gMTA7CitzdGF0aWMgdW5zaWduZWQgaW50IGJlX21heF9waHlzX3NpemUgPSA2NDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZW5hYmxlX21zaXg7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBiZWlzY3NpX3BjaV9pZF90YWJsZSk7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0MgIiAiIEJVSUxEX1NUUik7CitNT0RVTEVfQVVUSE9SKCJTZXJ2ZXJFbmdpbmVzIENvcnBvcmF0aW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oYmVfaW9wb2xsX2J1ZGdldCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShlbmFibGVfbXNpeCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShiZV9tYXhfcGh5c19zaXplLCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoYmVfbWF4X3BoeXNfc2l6ZSwgIk1heGltdW0gU2l6ZSAoSW4gS2lsb2J5dGVzKSBvZiBwaHlzaWNhbGx5IgorCQkJCSAgICJjb250aWd1b3VzIG1lbW9yeSB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQuIgorCQkJCSAgICJSYW5nZSBpcyAxNiAtIDEyOCIpOworCitzdGF0aWMgaW50IGJlaXNjc2lfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlLCA2NTUzNik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGJlaXNjc2lfc2h0ID0geworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJTZXJ2ZXJFbmdpbmVzIDEwR2JlIG9wZW4taXNjc2kgSW5pdGlhdG9yIERyaXZlciIsCisJLnByb2NfbmFtZSA9IERSVl9OQU1FLAorCS5xdWV1ZWNvbW1hbmQgPSBpc2NzaV9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgPSBpc2NzaV9laF9hYm9ydCwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoID0gaXNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoLAorCS5zbGF2ZV9jb25maWd1cmUgPSBiZWlzY3NpX3NsYXZlX2NvbmZpZ3VyZSwKKwkudGFyZ2V0X2FsbG9jID0gaXNjc2lfdGFyZ2V0X2FsbG9jLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IGlzY3NpX2VoX2RldmljZV9yZXNldCwKKwkuZWhfdGFyZ2V0X3Jlc2V0X2hhbmRsZXIgPSBpc2NzaV9laF90YXJnZXRfcmVzZXQsCisJLnNnX3RhYmxlc2l6ZSA9IEJFSVNDU0lfU0dMSVNUX0VMRU1FTlRTLAorCS5jYW5fcXVldWUgPSBCRTJfSU9fREVQVEgsCisJLnRoaXNfaWQgPSAtMSwKKwkubWF4X3NlY3RvcnMgPSBCRUlTQ1NJX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1biA9IEJFSVNDU0lfQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCit9Oworc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqYmVpc2NzaV9zY3NpX3RyYW5zcG9ydDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tIFBDSSBEcml2ZXIgb3BlcmF0aW9ucyBhbmQgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJlaXNjc2lfcGNpX2lkX3RhYmxlKSA9IHsKKwl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBCRV9ERVZJQ0VfSUQxKSB9LAorCXsgUENJX0RFVklDRShCRV9WRU5ET1JfSUQsIE9DX0RFVklDRV9JRDEpIH0sCisJeyBQQ0lfREVWSUNFKEJFX1ZFTkRPUl9JRCwgT0NfREVWSUNFX0lEMikgfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBiZWlzY3NpX3BjaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYmVpc2NzaV9oYmEgKmJlaXNjc2lfaGJhX2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCisJc2hvc3QgPSBpc2NzaV9ob3N0X2FsbG9jKCZiZWlzY3NpX3NodCwgc2l6ZW9mKCpwaGJhKSwgMCk7CisJaWYgKCFzaG9zdCkgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImJlaXNjc2lfaGJhX2FsbG9jIC0iCisJCQkiaXNjc2lfaG9zdF9hbGxvYyBmYWlsZWQgXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNob3N0LT5kbWFfYm91bmRhcnkgPSBwY2lkZXYtPmRtYV9tYXNrOworCXNob3N0LT5tYXhfaWQgPSBCRTJfTUFYX1NFU1NJT05TOworCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisJc2hvc3QtPm1heF9jbWRfbGVuID0gQkVJU0NTSV9NQVhfQ01EX0xFTjsKKwlzaG9zdC0+bWF4X2x1biA9IEJFSVNDU0lfTlVNX01BWF9MVU47CisJc2hvc3QtPnRyYW5zcG9ydHQgPSBiZWlzY3NpX3Njc2lfdHJhbnNwb3J0OworCisJcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisJbWVtc2V0KHBoYmEsIDAsIHNpemVvZigqcGhiYSkpOworCXBoYmEtPnNob3N0ID0gc2hvc3Q7CisJcGhiYS0+cGNpZGV2ID0gcGNpX2Rldl9nZXQocGNpZGV2KTsKKworCWlmIChpc2NzaV9ob3N0X2FkZChzaG9zdCwgJnBoYmEtPnBjaWRldi0+ZGV2KSkKKwkJZ290byBmcmVlX2RldmljZXM7CisJcmV0dXJuIHBoYmE7CisKK2ZyZWVfZGV2aWNlczoKKwlwY2lfZGV2X3B1dChwaGJhLT5wY2lkZXYpOworCWlzY3NpX2hvc3RfZnJlZShwaGJhLT5zaG9zdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGJlaXNjc2lfdW5tYXBfcGNpX2Z1bmN0aW9uKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlpZiAocGhiYS0+Y3NyX3ZhKSB7CisJCWlvdW5tYXAocGhiYS0+Y3NyX3ZhKTsKKwkJcGhiYS0+Y3NyX3ZhID0gTlVMTDsKKwl9CisJaWYgKHBoYmEtPmRiX3ZhKSB7CisJCWlvdW5tYXAocGhiYS0+ZGJfdmEpOworCQlwaGJhLT5kYl92YSA9IE5VTEw7CisJfQorCWlmIChwaGJhLT5wY2lfdmEpIHsKKwkJaW91bm1hcChwaGJhLT5wY2lfdmEpOworCQlwaGJhLT5wY2lfdmEgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBiZWlzY3NpX21hcF9wY2lfYmFycyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkJc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKwl1OCBfX2lvbWVtICphZGRyOworCisJYWRkciA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKSwKKwkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwgMikpOworCWlmIChhZGRyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXBoYmEtPmN0cmwuY3NyID0gYWRkcjsKKwlwaGJhLT5jc3JfdmEgPSBhZGRyOworCXBoYmEtPmNzcl9wYS51LmE2NC5hZGRyZXNzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMik7CisKKwlhZGRyID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDQpLCAxMjggKiAxMDI0KTsKKwlpZiAoYWRkciA9PSBOVUxMKQorCQlnb3RvIHBjaV9tYXBfZXJyOworCXBoYmEtPmN0cmwuZGIgPSBhZGRyOworCXBoYmEtPmRiX3ZhID0gYWRkcjsKKwlwaGJhLT5kYl9wYS51LmE2NC5hZGRyZXNzID0gIHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDQpOworCisJYWRkciA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAxKSwKKwkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwgMSkpOworCWlmIChhZGRyID09IE5VTEwpCisJCWdvdG8gcGNpX21hcF9lcnI7CisJcGhiYS0+Y3RybC5wY2ljZmcgPSBhZGRyOworCXBoYmEtPnBjaV92YSA9IGFkZHI7CisJcGhiYS0+cGNpX3BhLnUuYTY0LmFkZHJlc3MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAxKTsKKwlyZXR1cm4gMDsKKworcGNpX21hcF9lcnI6CisJYmVpc2NzaV91bm1hcF9wY2lfZnVuY3Rpb24ocGhiYSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgYmVpc2NzaV9lbmFibGVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImJlaXNjc2lfZW5hYmxlX3BjaSAtIGVuYWJsZSBkZXZpY2UgIgorCQkJImZhaWxlZC4gUmV0dXJuaW5nIC1FTk9ERVZcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpZGV2LCBETUFfQklUX01BU0soNjQpKSkgeworCQlyZXQgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJDb3VsZCBub3Qgc2V0IFBDSSBETUEgTWFza1xuIik7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmVfY3RybF9pbml0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBiZV9kbWFfbWVtICptYm94X21lbV9hbGxvYyA9ICZjdHJsLT5tYm94X21lbV9hbGxvY2VkOworCXN0cnVjdCBiZV9kbWFfbWVtICptYm94X21lbV9hbGlnbiA9ICZjdHJsLT5tYm94X21lbTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWN0cmwtPnBkZXYgPSBwZGV2OworCXN0YXR1cyA9IGJlaXNjc2lfbWFwX3BjaV9iYXJzKHBoYmEsIHBkZXYpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwltYm94X21lbV9hbGxvYy0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfbWNjX21haWxib3gpICsgMTY7CisJbWJveF9tZW1fYWxsb2MtPnZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCSAgbWJveF9tZW1fYWxsb2MtPnNpemUsCisJCQkJCQkgICZtYm94X21lbV9hbGxvYy0+ZG1hKTsKKwlpZiAoIW1ib3hfbWVtX2FsbG9jLT52YSkgeworCQliZWlzY3NpX3VubWFwX3BjaV9mdW5jdGlvbihwaGJhKTsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwltYm94X21lbV9hbGlnbi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfbWNjX21haWxib3gpOworCW1ib3hfbWVtX2FsaWduLT52YSA9IFBUUl9BTElHTihtYm94X21lbV9hbGxvYy0+dmEsIDE2KTsKKwltYm94X21lbV9hbGlnbi0+ZG1hID0gUFRSX0FMSUdOKG1ib3hfbWVtX2FsbG9jLT5kbWEsIDE2KTsKKwltZW1zZXQobWJveF9tZW1fYWxpZ24tPnZhLCAwLCBzaXplb2Yoc3RydWN0IGJlX21jY19tYWlsYm94KSk7CisJc3Bpbl9sb2NrX2luaXQoJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgYmVpc2NzaV9nZXRfcGFyYW1zKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlwaGJhLT5wYXJhbXMuaW9zX3Blcl9jdHJsID0gQkUyX0lPX0RFUFRIOworCXBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsID0gQkUyX01BWF9TRVNTSU9OUzsKKwlwaGJhLT5wYXJhbXMuYXN5bmNwZHVzX3Blcl9jdHJsID0gQkUyX0FTWU5DUERVUzsKKwlwaGJhLT5wYXJhbXMuaWNkc19wZXJfY3RybCA9IEJFMl9NQVhfSUNEUyAvIDI7CisJcGhiYS0+cGFyYW1zLm51bV9zZ2VfcGVyX2lvID0gQkUyX1NHRTsKKwlwaGJhLT5wYXJhbXMuZGVmcGR1X2hkcl9zeiA9IEJFMl9ERUZQRFVfSERSX1NaOworCXBoYmEtPnBhcmFtcy5kZWZwZHVfZGF0YV9zeiA9IEJFMl9ERUZQRFVfREFUQV9TWjsKKwlwaGJhLT5wYXJhbXMuZXFfdGltZXIgPSA2NDsKKwlwaGJhLT5wYXJhbXMubnVtX2VxX2VudHJpZXMgPQorCSAgICAoKChCRTJfQ01EU19QRVJfQ1hOICogMiArIEJFMl9MT0dPVVRTICsgQkUyX1RNRlMgKyBCRTJfQVNZTkNQRFVTKSAvCisJCQkJCQkJCTUxMikgKyAxKSAqIDUxMjsKKwlwaGJhLT5wYXJhbXMubnVtX2VxX2VudHJpZXMgPSAocGhiYS0+cGFyYW1zLm51bV9lcV9lbnRyaWVzIDwgMTAyNCkKKwkJCQk/IDEwMjQgOiBwaGJhLT5wYXJhbXMubnVtX2VxX2VudHJpZXM7CisJU0VfREVCVUcoREJHX0xWTF84LCAicGhiYS0+cGFyYW1zLm51bV9lcV9lbnRyaWVzPSVkIFxuIiwKKwkJIHBoYmEtPnBhcmFtcy5udW1fZXFfZW50cmllcyk7CisJcGhiYS0+cGFyYW1zLm51bV9jcV9lbnRyaWVzID0KKwkgICAgKCgoQkUyX0NNRFNfUEVSX0NYTiAqIDIgKyBCRTJfTE9HT1VUUyArIEJFMl9UTUZTICsgQkUyX0FTWU5DUERVUykgLworCQkJCQkJCQk1MTIpICsgMSkgKiA1MTI7CisJU0VfREVCVUcoREJHX0xWTF84LAorCQkicGhiYS0+cGFyYW1zLm51bV9jcV9lbnRyaWVzPSVkIEJFMl9DTURTX1BFUl9DWE49JWQiCisJCSJCRTJfTE9HT1VUUz0lZCBCRTJfVE1GUz0lZCBCRTJfQVNZTkNQRFVTPSVkIFxuIiwKKwkJcGhiYS0+cGFyYW1zLm51bV9jcV9lbnRyaWVzLCBCRTJfQ01EU19QRVJfQ1hOLAorCQlCRTJfTE9HT1VUUywgQkUyX1RNRlMsIEJFMl9BU1lOQ1BEVVMpOworCXBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4gPSAyNTY7Cit9CisKK3N0YXRpYyB2b2lkIGh3aV9yaW5nX2VxX2RiKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJCSAgIHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IGNscl9pbnRlcnJ1cHQsCisJCQkgICB1bnNpZ25lZCBpbnQgbnVtX3Byb2Nlc3NlZCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgcmVhcm0sIHVuc2lnbmVkIGNoYXIgZXZlbnQpCit7CisJdTMyIHZhbCA9IDA7CisJdmFsIHw9IGlkICYgREJfRVFfUklOR19JRF9NQVNLOworCWlmIChyZWFybSkKKwkJdmFsIHw9IDEgPDwgREJfRVFfUkVBUk1fU0hJRlQ7CisJaWYgKGNscl9pbnRlcnJ1cHQpCisJCXZhbCB8PSAxIDw8IERCX0VRX0NMUl9TSElGVDsKKwlpZiAoZXZlbnQpCisJCXZhbCB8PSAxIDw8IERCX0VRX0VWTlRfU0hJRlQ7CisJdmFsIHw9IG51bV9wcm9jZXNzZWQgPDwgREJfRVFfTlVNX1BPUFBFRF9TSElGVDsKKwlpb3dyaXRlMzIodmFsLCBwaGJhLT5kYl92YSArIERCX0VRX09GRlNFVCk7Cit9CisKKy8qKgorICogYmVfaXNyIC0gVGhlIGlzciByb3V0aW5lIG9mIHRoZSBkcml2ZXIuCisgKiBAaXJxOiBOb3QgdXNlZAorICogQGRldl9pZDogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBiZV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OworCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlID0gTlVMTDsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGluZGV4OworCXVuc2lnbmVkIGludCBudW1fZXFfcHJvY2Vzc2VkOworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmw7CisJaW50IGlzcjsKKworCXBoYmEgPSBkZXZfaWQ7CisJaWYgKCFlbmFibGVfbXNpeCkgeworCQljdHJsID0gJnBoYmEtPmN0cmw7OworCQlpc3IgPSBpb3JlYWQzMihjdHJsLT5jc3IgKyBDRVZfSVNSMF9PRkZTRVQgKworCQkJICAgICAgIChQQ0lfRlVOQyhjdHJsLT5wZGV2LT5kZXZmbikgKiBDRVZfSVNSX1NJWkUpKTsKKwkJaWYgKCFpc3IpCisJCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OworCWVxID0gJnBod2lfY29udGV4dC0+YmVfZXEucTsKKwljcSA9ICZwaHdpX2NvbnRleHQtPmJlX2NxOworCWluZGV4ID0gMDsKKwllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCWlmICghZXFlKQorCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJlcWUgaXMgTlVMTFxuIik7CisKKwludW1fZXFfcHJvY2Vzc2VkID0gMDsKKwlpZiAoYmxrX2lvcG9sbF9lbmFibGVkKSB7CisJCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KKwkJCQkJJiBFUUVfVkFMSURfTUFTSykgeworCQkJaWYgKCFibGtfaW9wb2xsX3NjaGVkX3ByZXAoJnBoYmEtPmlvcG9sbCkpCisJCQkJYmxrX2lvcG9sbF9zY2hlZCgmcGhiYS0+aW9wb2xsKTsKKworCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7CisJCQlxdWV1ZV90YWlsX2luYyhlcSk7CisJCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCQkJbnVtX2VxX3Byb2Nlc3NlZCsrOworCQkJU0VfREVCVUcoREJHX0xWTF84LCAiVmFsaWQgRVFFXG4iKTsKKwkJfQorCQlpZiAobnVtX2VxX3Byb2Nlc3NlZCkgeworCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLAludW1fZXFfcHJvY2Vzc2VkLCAwLCAxKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gSVJRX05PTkU7CisJfSBlbHNlIHsKKwkJd2hpbGUgKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkKSAvIDMyXQorCQkJCQkJJiBFUUVfVkFMSURfTUFTSykgeworCisJCQlpZiAoKChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LAorCQkJICAgICByZXNvdXJjZV9pZCkgLyAzMl0gJgorCQkJICAgICBFUUVfUkVTSURfTUFTSykgPj4gMTYpICE9IGNxLT5pZCkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOworCQkJCXBoYmEtPnRvZG9fbWNjX2NxID0gMTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOworCQkJfSBlbHNlIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKKwkJCQlwaGJhLT50b2RvX2NxID0gMTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOworCQkJfQorCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7CisJCQlxdWV1ZV90YWlsX2luYyhlcSk7CisJCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCQkJbnVtX2VxX3Byb2Nlc3NlZCsrOworCQl9CisJCWlmIChwaGJhLT50b2RvX2NxIHx8IHBoYmEtPnRvZG9fbWNjX2NxKQorCQkJcXVldWVfd29yayhwaGJhLT53cSwgJnBoYmEtPndvcmtfY3FzKTsKKworCQlpZiAobnVtX2VxX3Byb2Nlc3NlZCkgeworCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLCBudW1fZXFfcHJvY2Vzc2VkLCAxLCAxKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gSVJRX05PTkU7CisJfQorfQorCitzdGF0aWMgaW50IGJlaXNjc2lfaW5pdF9pcnFzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gcGhiYS0+cGNpZGV2OworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgYmVfaXNyLCBJUlFGX1NIQVJFRCwgImJlaXNjc2kiLCBwaGJhKTsKKwlpZiAocmV0KSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJiZWlzY3NpX2luaXRfaXJxcy0iCisJCQkgICAgICJGYWlsZWQgdG8gcmVnaXN0ZXIgaXJxXFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBod2lfcmluZ19jcV9kYihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkgICB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBudW1fcHJvY2Vzc2VkLAorCQkJICAgdW5zaWduZWQgY2hhciByZWFybSwgdW5zaWduZWQgY2hhciBldmVudCkKK3sKKwl1MzIgdmFsID0gMDsKKwl2YWwgfD0gaWQgJiBEQl9DUV9SSU5HX0lEX01BU0s7CisJaWYgKHJlYXJtKQorCQl2YWwgfD0gMSA8PCBEQl9DUV9SRUFSTV9TSElGVDsKKwl2YWwgfD0gbnVtX3Byb2Nlc3NlZCA8PCBEQl9DUV9OVU1fUE9QUEVEX1NISUZUOworCWlvd3JpdGUzMih2YWwsIHBoYmEtPmRiX3ZhICsgREJfQ1FfT0ZGU0VUKTsKK30KKworLyoKKyAqIGFzeW5jIHBkdXMgaW5jbHVkZQorICogYS4gdW5zb2xpY2l0ZWQgTk9QLUluICh0YXJnZXQgaW5pdGlhdGVkIE5PUC1JbikKKyAqIGIuIEFzeW5jIE1lc3NhZ2VzCisgKiBjLiBSZWplY3QgUERVCisgKiBkLiBMb2dpbiByZXNwb25zZQorICogVGhlc2UgaGVhZGVycyBhcnJpdmUgdW5wcm9jZXNzZWQgYnkgdGhlIEVQIGZpcm13YXJlIGFuZCBpU0NTSSBsYXllcgorICogcHJvY2VzcyB0aGVtCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2JlaXNjc2lfcHJvY2Vzc19hc3luY19wZHUoc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uLAorCQkJICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkgIHVuc2lnbmVkIHNob3J0IGNpZCwKKwkJCSAgc3RydWN0IHBkdV9iYXNlICpwcGR1LAorCQkJICB1bnNpZ25lZCBsb25nIHBkdV9sZW4sCisJCQkgIHZvaWQgKnBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX2xlbikKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGJlaXNjc2lfY29ubi0+Y29ubjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CisKKwlzd2l0Y2ggKHBwZHUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3BkdV9iYXNlLCBvcGNvZGUpIC8gMzJdICYKKwkJCQkJCVBEVUJBU0VfT1BDT0RFX01BU0spIHsKKwljYXNlIElTQ1NJX09QX05PT1BfSU46CisJCXBidWZmZXIgPSBOVUxMOworCQlidWZfbGVuID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9PUF9BU1lOQ19FVkVOVDoKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9PUF9SRUpFQ1Q6CisJCVdBUk5fT04oIXBidWZmZXIpOworCQlXQVJOX09OKCEoYnVmX2xlbiA9PSA0OCkpOworCQlTRV9ERUJVRyhEQkdfTFZMXzEsICJJbiBJU0NTSV9PUF9SRUpFQ1RcbiIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX09QX0xPR0lOX1JTUDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgICJVbnJlY29nbml6ZWQgb3Bjb2RlIDB4JXggaW4gYXN5bmMgbXNnIFxuIiwKKwkJCSAgICAgKHBwZHUtPgorCQkJICAgICBkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9wZHVfYmFzZSwgb3Bjb2RlKSAvIDMyXQorCQkJCQkJJiBQRFVCQVNFX09QQ09ERV9NQVNLKSk7CisJCXJldHVybiAxOworCX0KKworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKilwcGR1LCBwYnVmZmVyLCBidWZfbGVuKTsKKwlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2dsX2hhbmRsZSAqYWxsb2NfaW9fc2dsX2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IHNnbF9oYW5kbGUgKnBzZ2xfaGFuZGxlOworCisJaWYgKHBoYmEtPmlvX3NnbF9obmRsX2F2YmwpIHsKKwkJU0VfREVCVUcoREJHX0xWTF84LAorCQkJICJJbiBhbGxvY19pb19zZ2xfaGFuZGxlLGlvX3NnbF9hbGxvY19pbmRleD0lZCBcbiIsCisJCQkgcGhiYS0+aW9fc2dsX2FsbG9jX2luZGV4KTsKKwkJcHNnbF9oYW5kbGUgPSBwaGJhLT5pb19zZ2xfaG5kbF9iYXNlW3BoYmEtPgorCQkJCQkJaW9fc2dsX2FsbG9jX2luZGV4XTsKKwkJcGhiYS0+aW9fc2dsX2huZGxfYmFzZVtwaGJhLT5pb19zZ2xfYWxsb2NfaW5kZXhdID0gTlVMTDsKKwkJcGhiYS0+aW9fc2dsX2huZGxfYXZibC0tOworCQlpZiAocGhiYS0+aW9fc2dsX2FsbG9jX2luZGV4ID09IChwaGJhLT5wYXJhbXMuaW9zX3Blcl9jdHJsIC0gMSkpCisJCQlwaGJhLT5pb19zZ2xfYWxsb2NfaW5kZXggPSAwOworCQllbHNlCisJCQlwaGJhLT5pb19zZ2xfYWxsb2NfaW5kZXgrKzsKKwl9IGVsc2UKKwkJcHNnbF9oYW5kbGUgPSBOVUxMOworCXJldHVybiBwc2dsX2hhbmRsZTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfaW9fc2dsX2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHN0cnVjdCBzZ2xfaGFuZGxlICpwc2dsX2hhbmRsZSkKK3sKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBmcmVlXyxpb19zZ2xfZnJlZV9pbmRleD0lZCBcbiIsCisJCSBwaGJhLT5pb19zZ2xfZnJlZV9pbmRleCk7CisJaWYgKHBoYmEtPmlvX3NnbF9obmRsX2Jhc2VbcGhiYS0+aW9fc2dsX2ZyZWVfaW5kZXhdKSB7CisJCS8qCisJCSAqIHRoaXMgY2FuIGhhcHBlbiBpZiBjbGVhbl90YXNrIGlzIGNhbGxlZCBvbiBhIHRhc2sgdGhhdAorCQkgKiBmYWlsZWQgaW4geG1pdF90YXNrIG9yIGFsbG9jX3BkdS4KKwkJICovCisJCSBTRV9ERUJVRyhEQkdfTFZMXzgsCisJCQkgIkRvdWJsZSBGcmVlIGluIElPIFNHTCBpb19zZ2xfZnJlZV9pbmRleD0lZCwiCisJCQkgInZhbHVlIHRoZXJlPSVwIFxuIiwgcGhiYS0+aW9fc2dsX2ZyZWVfaW5kZXgsCisJCQkgcGhiYS0+aW9fc2dsX2huZGxfYmFzZVtwaGJhLT5pb19zZ2xfZnJlZV9pbmRleF0pOworCQlyZXR1cm47CisJfQorCXBoYmEtPmlvX3NnbF9obmRsX2Jhc2VbcGhiYS0+aW9fc2dsX2ZyZWVfaW5kZXhdID0gcHNnbF9oYW5kbGU7CisJcGhiYS0+aW9fc2dsX2huZGxfYXZibCsrOworCWlmIChwaGJhLT5pb19zZ2xfZnJlZV9pbmRleCA9PSAocGhiYS0+cGFyYW1zLmlvc19wZXJfY3RybCAtIDEpKQorCQlwaGJhLT5pb19zZ2xfZnJlZV9pbmRleCA9IDA7CisJZWxzZQorCQlwaGJhLT5pb19zZ2xfZnJlZV9pbmRleCsrOworfQorCisvKioKKyAqIGFsbG9jX3dyYl9oYW5kbGUgLSBUbyBhbGxvY2F0ZSBhIHdyYiBoYW5kbGUKKyAqIEBwaGJhOiBUaGUgaGJhIHBvaW50ZXIKKyAqIEBjaWQ6IFRoZSBjaWQgdG8gdXNlIGZvciBhbGxvY2F0aW9uCisgKiBAaW5kZXg6IGluZGV4IGFsbG9jYXRpb24gYW5kIHdyYiBpbmRleAorICoKKyAqIFRoaXMgaGFwcGVucyB1bmRlciBzZXNzaW9uX2xvY2sgdW50aWwgc3VibWlzc2lvbiB0byBjaGlwCisgKi8KK3N0cnVjdCB3cmJfaGFuZGxlICphbGxvY193cmJfaGFuZGxlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgaW50IGNpZCwKKwkJCQkgICAgaW50IGluZGV4KQoreworCXN0cnVjdCBod2lfd3JiX2NvbnRleHQgKnB3cmJfY29udGV4dDsKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IHdyYl9oYW5kbGUgKnB3cmJfaGFuZGxlOworCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcHdyYl9jb250ZXh0ID0gJnBod2lfY3RybHItPndyYl9jb250ZXh0W2NpZF07CisJcHdyYl9oYW5kbGUgPSBwd3JiX2NvbnRleHQtPnB3cmJfaGFuZGxlX2Jhc2VbaW5kZXhdOworCXB3cmJfaGFuZGxlLT53cmJfaW5kZXggPSBpbmRleDsKKwlwd3JiX2hhbmRsZS0+bnh0X3dyYl9pbmRleCA9IGluZGV4OworCXJldHVybiBwd3JiX2hhbmRsZTsKK30KKworLyoqCisgKiBmcmVlX3dyYl9oYW5kbGUgLSBUbyBmcmVlIHRoZSB3cmIgaGFuZGxlIGJhY2sgdG8gcG9vbAorICogQHBoYmE6IFRoZSBoYmEgcG9pbnRlcgorICogQHB3cmJfY29udGV4dDogVGhlIGNvbnRleHQgdG8gZnJlZSBmcm9tCisgKiBAcHdyYl9oYW5kbGU6IFRoZSB3cmJfaGFuZGxlIHRvIGZyZWUKKyAqCisgKiBUaGlzIGhhcHBlbnMgdW5kZXIgc2Vzc2lvbl9sb2NrIHVudGlsIHN1Ym1pc3Npb24gdG8gY2hpcAorICovCitzdGF0aWMgdm9pZAorZnJlZV93cmJfaGFuZGxlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgc3RydWN0IGh3aV93cmJfY29udGV4dCAqcHdyYl9jb250ZXh0LAorCQlzdHJ1Y3Qgd3JiX2hhbmRsZSAqcHdyYl9oYW5kbGUpCit7CisJU0VfREVCVUcoREJHX0xWTF84LAorCQkgIkZSRUUgV1JCOiBwd3JiX2hhbmRsZT0lcCBmcmVlX2luZGV4PSVkPTB4JXgiCisJCSAid3JiX2hhbmRsZXNfYXZhaWxhYmxlPSVkIFxuIiwKKwkJIHB3cmJfaGFuZGxlLCBwd3JiX2NvbnRleHQtPmZyZWVfaW5kZXgsCisJCSBwd3JiX2NvbnRleHQtPmZyZWVfaW5kZXgsIHB3cmJfY29udGV4dC0+d3JiX2hhbmRsZXNfYXZhaWxhYmxlKTsKK30KKworc3RhdGljIHN0cnVjdCBzZ2xfaGFuZGxlICphbGxvY19tZ210X3NnbF9oYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBzZ2xfaGFuZGxlICpwc2dsX2hhbmRsZTsKKworCWlmIChwaGJhLT5laF9zZ2xfaG5kbF9hdmJsKSB7CisJCXBzZ2xfaGFuZGxlID0gcGhiYS0+ZWhfc2dsX2huZGxfYmFzZVtwaGJhLT5laF9zZ2xfYWxsb2NfaW5kZXhdOworCQlwaGJhLT5laF9zZ2xfaG5kbF9iYXNlW3BoYmEtPmVoX3NnbF9hbGxvY19pbmRleF0gPSBOVUxMOworCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJtZ210X3NnbF9hbGxvY19pbmRleD0lZD0weCV4IFxuIiwKKwkJCSBwaGJhLT5laF9zZ2xfYWxsb2NfaW5kZXgsIHBoYmEtPmVoX3NnbF9hbGxvY19pbmRleCk7CisJCXBoYmEtPmVoX3NnbF9obmRsX2F2YmwtLTsKKwkJaWYgKHBoYmEtPmVoX3NnbF9hbGxvY19pbmRleCA9PQorCQkgICAgKHBoYmEtPnBhcmFtcy5pY2RzX3Blcl9jdHJsIC0gcGhiYS0+cGFyYW1zLmlvc19wZXJfY3RybCAtCisJCSAgICAgMSkpCisJCQlwaGJhLT5laF9zZ2xfYWxsb2NfaW5kZXggPSAwOworCQllbHNlCisJCQlwaGJhLT5laF9zZ2xfYWxsb2NfaW5kZXgrKzsKKwl9IGVsc2UKKwkJcHNnbF9oYW5kbGUgPSBOVUxMOworCXJldHVybiBwc2dsX2hhbmRsZTsKK30KKwordm9pZAorZnJlZV9tZ210X3NnbF9oYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBzdHJ1Y3Qgc2dsX2hhbmRsZSAqcHNnbF9oYW5kbGUpCit7CisKKwlpZiAocGhiYS0+ZWhfc2dsX2huZGxfYmFzZVtwaGJhLT5laF9zZ2xfZnJlZV9pbmRleF0pIHsKKwkJLyoKKwkJICogdGhpcyBjYW4gaGFwcGVuIGlmIGNsZWFuX3Rhc2sgaXMgY2FsbGVkIG9uIGEgdGFzayB0aGF0CisJCSAqIGZhaWxlZCBpbiB4bWl0X3Rhc2sgb3IgYWxsb2NfcGR1LgorCQkgKi8KKwkJU0VfREVCVUcoREJHX0xWTF84LAorCQkJICJEb3VibGUgRnJlZSBpbiBlaCBTR0wgLGVoX3NnbF9mcmVlX2luZGV4PSVkIFxuIiwKKwkJCSBwaGJhLT5laF9zZ2xfZnJlZV9pbmRleCk7CisJCXJldHVybjsKKwl9CisJcGhiYS0+ZWhfc2dsX2huZGxfYmFzZVtwaGJhLT5laF9zZ2xfZnJlZV9pbmRleF0gPSBwc2dsX2hhbmRsZTsKKwlwaGJhLT5laF9zZ2xfaG5kbF9hdmJsKys7CisJaWYgKHBoYmEtPmVoX3NnbF9mcmVlX2luZGV4ID09CisJICAgIChwaGJhLT5wYXJhbXMuaWNkc19wZXJfY3RybCAtIHBoYmEtPnBhcmFtcy5pb3NfcGVyX2N0cmwgLSAxKSkKKwkJcGhiYS0+ZWhfc2dsX2ZyZWVfaW5kZXggPSAwOworCWVsc2UKKwkJcGhiYS0+ZWhfc2dsX2ZyZWVfaW5kZXgrKzsKK30KKworc3RhdGljIHZvaWQKK2JlX2NvbXBsZXRlX2lvKHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKKwkgICAgICAgc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssIHN0cnVjdCBzb2xfY3FlICpwc29sKQoreworCXN0cnVjdCBiZWlzY3NpX2lvX3Rhc2sgKmlvX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCXN0cnVjdCBiZV9zdGF0dXNfYmhzICpzdHNfYmhzID0KKwkJCQkoc3RydWN0IGJlX3N0YXR1c19iaHMgKilpb190YXNrLT5jbWRfYmhzOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOworCXVuc2lnbmVkIGludCBzZW5zZV9sZW47CisJdW5zaWduZWQgY2hhciAqc2Vuc2U7CisJdTMyIHJlc2lkID0gMCwgZXhwX2NtZHNuLCBtYXhfY21kc247CisJdTggcnNwLCBzdGF0dXMsIGZsYWdzOworCisJZXhwX2NtZHNuID0gYmUzMl90b19jcHUocHNvbC0+CisJCQlkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX2V4cF9jbWRfc24pIC8gMzJdCisJCQkmIFNPTF9FWFBfQ01EX1NOX01BU0spOworCW1heF9jbWRzbiA9IGJlMzJfdG9fY3B1KChwc29sLT4KKwkJCWR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfZXhwX2NtZF9zbikgLyAzMl0KKwkJCSYgU09MX0VYUF9DTURfU05fTUFTSykgKworCQkJKChwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX2NtZF93bmQpCisJCQkJLyAzMl0gJiBTT0xfQ01EX1dORF9NQVNLKSA+PiAyNCkgLSAxKTsKKwlyc3AgPSAoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfcmVzcCkgLyAzMl0KKwkJCQkJCSYgU09MX1JFU1BfTUFTSykgPj4gMTYpOworCXN0YXR1cyA9ICgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9zdHMpIC8gMzJdCisJCQkJCQkmIFNPTF9TVFNfTUFTSykgPj4gOCk7CisJZmxhZ3MgPSAoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfZmxhZ3MpIC8gMzJdCisJCQkJCSYgU09MX0ZMQUdTX01BU0spID4+IDI0KSB8IDB4ODA7CisKKwl0YXNrLT5zYy0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBzdGF0dXM7CisJaWYgKHJzcCAhPSBJU0NTSV9TVEFUVVNfQ01EX0NPTVBMRVRFRCkgeworCQl0YXNrLT5zYy0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlnb3RvIHVubWFwOworCX0KKworCS8qIGJpZGkgbm90IGluaXRpYWxseSBzdXBwb3J0ZWQgKi8KKwlpZiAoZmxhZ3MgJiAoSVNDU0lfRkxBR19DTURfVU5ERVJGTE9XIHwgSVNDU0lfRkxBR19DTURfT1ZFUkZMT1cpKSB7CisJCXJlc2lkID0gKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfcmVzX2NudCkgLworCQkJCTMyXSAmIFNPTF9SRVNfQ05UX01BU0spOworCisJCWlmICghc3RhdHVzICYmIChmbGFncyAmIElTQ1NJX0ZMQUdfQ01EX09WRVJGTE9XKSkKKwkJCXRhc2stPnNjLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisKKwkJaWYgKGZsYWdzICYgSVNDU0lfRkxBR19DTURfVU5ERVJGTE9XKSB7CisJCQlzY3NpX3NldF9yZXNpZCh0YXNrLT5zYywgcmVzaWQpOworCQkJaWYgKCFzdGF0dXMgJiYgKHNjc2lfYnVmZmxlbih0YXNrLT5zYykgLSByZXNpZCA8CisJCQkgICAgdGFzay0+c2MtPnVuZGVyZmxvdykpCisJCQkJdGFzay0+c2MtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKSB7CisJCXNlbnNlID0gc3RzX2Jocy0+c2Vuc2VfaW5mbyArIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJCXNlbnNlX2xlbiA9CisJCSAgICBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpKHN0c19iaHMtPnNlbnNlX2luZm9bMF0pKTsKKwkJbWVtY3B5KHRhc2stPnNjLT5zZW5zZV9idWZmZXIsIHNlbnNlLAorCQkgICAgICAgbWluX3QodTE2LCBzZW5zZV9sZW4sIFNDU0lfU0VOU0VfQlVGRkVSU0laRSkpOworCX0KKwlpZiAoaW9fdGFzay0+Y21kX2Jocy0+aXNjc2lfaGRyLmZsYWdzICYgSVNDU0lfRkxBR19DTURfUkVBRCkgeworCQlpZiAocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9yZXNfY250KSAvIDMyXQorCQkJCQkJCSYgU09MX1JFU19DTlRfTUFTSykKKwkJCSBjb25uLT5yeGRhdGFfb2N0ZXRzICs9IChwc29sLT4KKwkJCSAgICAgIGR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfcmVzX2NudCkgLyAzMl0KKwkJCQkJCQkmIFNPTF9SRVNfQ05UX01BU0spOworCX0KK3VubWFwOgorCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CisJaXNjc2lfY29tcGxldGVfc2NzaV90YXNrKHRhc2ssIGV4cF9jbWRzbiwgbWF4X2NtZHNuKTsKK30KKworc3RhdGljIHZvaWQKK2JlX2NvbXBsZXRlX2xvZ291dChzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCSAgIHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLCBzdHJ1Y3Qgc29sX2NxZSAqcHNvbCkKK3sKKwlzdHJ1Y3QgaXNjc2lfbG9nb3V0X3JzcCAqaGRyOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOworCisJaGRyID0gKHN0cnVjdCBpc2NzaV9sb2dvdXRfcnNwICopdGFzay0+aGRyOworCWhkci0+dDJ3YWl0ID0gNTsKKwloZHItPnQycmV0YWluID0gMDsKKwloZHItPmZsYWdzID0gKChwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX2ZsYWdzKSAvIDMyXQorCQkJCQkmIFNPTF9GTEFHU19NQVNLKSA+PiAyNCkgfCAweDgwOworCWhkci0+cmVzcG9uc2UgPSAocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9yZXNwKSAvCisJCQkJCTMyXSAmIFNPTF9SRVNQX01BU0spOworCWhkci0+ZXhwX2NtZHNuID0gY3B1X3RvX2JlMzIocHNvbC0+CisJCQlkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX2V4cF9jbWRfc24pIC8gMzJdCisJCQkJCSYgU09MX0VYUF9DTURfU05fTUFTSyk7CisJaGRyLT5tYXhfY21kc24gPSBiZTMyX3RvX2NwdSgocHNvbC0+CisJCQkgZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9leHBfY21kX3NuKSAvIDMyXQorCQkJCQkmIFNPTF9FWFBfQ01EX1NOX01BU0spICsKKwkJCSgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9jbWRfd25kKQorCQkJCQkvIDMyXSAmIFNPTF9DTURfV05EX01BU0spID4+IDI0KSAtIDEpOworCWhkci0+aGxlbmd0aCA9IDA7CisKKwlfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCAoc3RydWN0IGlzY3NpX2hkciAqKWhkciwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZV9jb21wbGV0ZV90bWYoc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uLAorCQlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgc3RydWN0IHNvbF9jcWUgKnBzb2wpCit7CisJc3RydWN0IGlzY3NpX3RtX3JzcCAqaGRyOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOworCisJaGRyID0gKHN0cnVjdCBpc2NzaV90bV9yc3AgKil0YXNrLT5oZHI7CisJaGRyLT5mbGFncyA9ICgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9mbGFncykgLyAzMl0KKwkJCQkJJiBTT0xfRkxBR1NfTUFTSykgPj4gMjQpIHwgMHg4MDsKKwloZHItPnJlc3BvbnNlID0gKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfcmVzcCkgLworCQkJCQkzMl0gJiBTT0xfUkVTUF9NQVNLKTsKKwloZHItPmV4cF9jbWRzbiA9IGNwdV90b19iZTMyKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsCisJCQkJICAgICBpX2V4cF9jbWRfc24pIC8gMzJdICYgU09MX0VYUF9DTURfU05fTUFTSyk7CisJaGRyLT5tYXhfY21kc24gPSBiZTMyX3RvX2NwdSgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwKKwkJCWlfZXhwX2NtZF9zbikgLyAzMl0gJiBTT0xfRVhQX0NNRF9TTl9NQVNLKSArCisJCQkoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfY21kX3duZCkKKwkJCS8gMzJdICYgU09MX0NNRF9XTkRfTUFTSykgPj4gMjQpIC0gMSk7CisJX19pc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKiloZHIsIE5VTEwsIDApOworfQorCitzdGF0aWMgdm9pZAoraHdpX2NvbXBsZXRlX2RydnJfbXNncyhzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCSAgICAgICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHN0cnVjdCBzb2xfY3FlICpwc29sKQoreworCXN0cnVjdCBod2lfd3JiX2NvbnRleHQgKnB3cmJfY29udGV4dDsKKwlzdHJ1Y3Qgd3JiX2hhbmRsZSAqcHdyYl9oYW5kbGU7CisJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKKworCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT53cmJfY29udGV4dFsoKHBzb2wtPgorCQkJCWR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNpZCkgLyAzMl0gJgorCQkJCVNPTF9DSURfTUFTSykgPj4gNildOworCXB3cmJfaGFuZGxlID0gcHdyYl9jb250ZXh0LT5wd3JiX2hhbmRsZV9iYXNlc3RkWygocHNvbC0+CisJCQkJZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgd3JiX2luZGV4KSAvCisJCQkJMzJdICYgU09MX1dSQl9JTkRFWF9NQVNLKSA+PiAxNildOworCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CisJZnJlZV93cmJfaGFuZGxlKHBoYmEsIHB3cmJfY29udGV4dCwgcHdyYl9oYW5kbGUpOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2JlX2NvbXBsZXRlX25vcGluX3Jlc3Aoc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uLAorCQkgICAgICAgc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssIHN0cnVjdCBzb2xfY3FlICpwc29sKQoreworCXN0cnVjdCBpc2NzaV9ub3BpbiAqaGRyOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOworCisJaGRyID0gKHN0cnVjdCBpc2NzaV9ub3BpbiAqKXRhc2stPmhkcjsKKwloZHItPmZsYWdzID0gKChwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX2ZsYWdzKSAvIDMyXQorCQkJJiBTT0xfRkxBR1NfTUFTSykgPj4gMjQpIHwgMHg4MDsKKwloZHItPmV4cF9jbWRzbiA9IGNwdV90b19iZTMyKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsCisJCQkJICAgICBpX2V4cF9jbWRfc24pIC8gMzJdICYgU09MX0VYUF9DTURfU05fTUFTSyk7CisJaGRyLT5tYXhfY21kc24gPSBiZTMyX3RvX2NwdSgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwKKwkJCWlfZXhwX2NtZF9zbikgLyAzMl0gJiBTT0xfRVhQX0NNRF9TTl9NQVNLKSArCisJCQkoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGlfY21kX3duZCkKKwkJCS8gMzJdICYgU09MX0NNRF9XTkRfTUFTSykgPj4gMjQpIC0gMSk7CisJaGRyLT5vcGNvZGUgPSBJU0NTSV9PUF9OT09QX0lOOworCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopaGRyLCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQgaHdpX2NvbXBsZXRlX2NtZChzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCQkgICAgIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgc3RydWN0IHNvbF9jcWUgKnBzb2wpCit7CisJc3RydWN0IGh3aV93cmJfY29udGV4dCAqcHdyYl9jb250ZXh0OworCXN0cnVjdCB3cmJfaGFuZGxlICpwd3JiX2hhbmRsZTsKKwlzdHJ1Y3QgaXNjc2lfd3JiICpwd3JiID0gTlVMTDsKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CisJc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqaW9fdGFzazsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGJlaXNjc2lfY29ubi0+Y29ubjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CisKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKworCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT4KKwkJd3JiX2NvbnRleHRbKChwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBjaWQpIC8gMzJdCisJCSYgU09MX0NJRF9NQVNLKSA+PiA2KV07CisJcHdyYl9oYW5kbGUgPSBwd3JiX2NvbnRleHQtPnB3cmJfaGFuZGxlX2Jhc2VzdGRbKChwc29sLT4KKwkJCQlkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCB3cmJfaW5kZXgpIC8KKwkJCQkzMl0gJiBTT0xfV1JCX0lOREVYX01BU0spID4+IDE2KV07CisKKwl0YXNrID0gcHdyYl9oYW5kbGUtPnBpb19oYW5kbGU7CisJaW9fdGFzayA9IHRhc2stPmRkX2RhdGE7CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwlwd3JiID0gcHdyYl9oYW5kbGUtPnB3cmI7CisJc3dpdGNoICgocHdyYi0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlKSAvIDMyXSAmCisJCSBXUkJfVFlQRV9NQVNLKSA+PiAyOCkgeworCWNhc2UgSFdIX1RZUEVfSU86CisJY2FzZSBIV0hfVFlQRV9JT19SRDoKKwkJaWYgKCh0YXNrLT5oZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLKSA9PQorCQkgICAgSVNDU0lfT1BfTk9PUF9PVVQpIHsKKwkJCWJlX2NvbXBsZXRlX25vcGluX3Jlc3AoYmVpc2NzaV9jb25uLCB0YXNrLCBwc29sKTsKKwkJfSBlbHNlCisJCQliZV9jb21wbGV0ZV9pbyhiZWlzY3NpX2Nvbm4sIHRhc2ssIHBzb2wpOworCQlicmVhazsKKworCWNhc2UgSFdIX1RZUEVfTE9HT1VUOgorCQliZV9jb21wbGV0ZV9sb2dvdXQoYmVpc2NzaV9jb25uLCB0YXNrLCBwc29sKTsKKwkJYnJlYWs7CisKKwljYXNlIEhXSF9UWVBFX0xPR0lOOgorCQlTRV9ERUJVRyhEQkdfTFZMXzEsCisJCQkgIlx0XHQgTm8gSFdIX1RZUEVfTE9HSU4gRXhwZWN0ZWQgaW4gaHdpX2NvbXBsZXRlX2NtZCIKKwkJCSAiLSBTb2xpY2l0ZWQgcGF0aCBcbiIpOworCQlicmVhazsKKworCWNhc2UgSFdIX1RZUEVfVE1GOgorCQliZV9jb21wbGV0ZV90bWYoYmVpc2NzaV9jb25uLCB0YXNrLCBwc29sKTsKKwkJYnJlYWs7CisKKwljYXNlIEhXSF9UWVBFX05PUDoKKwkJYmVfY29tcGxldGVfbm9waW5fcmVzcChiZWlzY3NpX2Nvbm4sIHRhc2ssIHBzb2wpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAorCQkJICAgICJ3cmJfaW5kZXggMHgleCBDSUQgMHgleFxuIiwKKwkJCSAgICAoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgdHlwZSkgLworCQkJCQkzMl0gJiBTT0xfV1JCX0lOREVYX01BU0spID4+IDE2KSwKKwkJCSAgICAoKHBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNpZCkgLyAzMl0KKwkJCQkJJiBTT0xfQ0lEX01BU0spID4+IDYpKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqaHdpX2dldF9hc3luY19idXN5X2xpc3Qoc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dAorCQkJCQkgICpwYXN5bmNfY3R4LCB1bnNpZ25lZCBpbnQgaXNfaGVhZGVyLAorCQkJCQkgIHVuc2lnbmVkIGludCBob3N0X3dyaXRlX3B0cikKK3sKKwlpZiAoaXNfaGVhZGVyKQorCQlyZXR1cm4gJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2hvc3Rfd3JpdGVfcHRyXS4KKwkJICAgIGhlYWRlcl9idXN5X2xpc3Q7CisJZWxzZQorCQlyZXR1cm4gJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2hvc3Rfd3JpdGVfcHRyXS5kYXRhX2J1c3lfbGlzdDsKK30KKworc3RhdGljIHN0cnVjdCBhc3luY19wZHVfaGFuZGxlICoKK2h3aV9nZXRfYXN5bmNfaGFuZGxlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJICAgICBzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCSAgICAgc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eCwKKwkJICAgICBzdHJ1Y3QgaV90X2RwZHVfY3FlICpwZHBkdV9jcWUsIHVuc2lnbmVkIGludCAqcGNxX2luZGV4KQoreworCXN0cnVjdCBiZV9idXNfYWRkcmVzcyBwaHlzX2FkZHI7CisJc3RydWN0IGxpc3RfaGVhZCAqcGJ1c3lfbGlzdDsKKwlzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hhbmRsZSA9IE5VTEw7CisJaW50IGJ1ZmZlcl9sZW4gPSAwOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyX2luZGV4ID0gLTE7CisJdW5zaWduZWQgY2hhciBpc19oZWFkZXIgPSAwOworCisJcGh5c19hZGRyLnUuYTMyLmFkZHJlc3NfbG8gPQorCSAgICBwZHBkdV9jcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZSwgZGJfYWRkcl9sbykgLyAzMl0gLQorCSAgICAoKHBkcGR1X2NxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfaV90X2RwZHVfY3FlLCBkcGwpIC8gMzJdCisJCQkJCQkmIFBEVUNRRV9EUExfTUFTSykgPj4gMTYpOworCXBoeXNfYWRkci51LmEzMi5hZGRyZXNzX2hpID0KKwkgICAgcGRwZHVfY3FlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWUsIGRiX2FkZHJfaGkpIC8gMzJdOworCisJcGh5c19hZGRyLnUuYTY0LmFkZHJlc3MgPQorCQkJKigodW5zaWduZWQgbG9uZyBsb25nICopKCZwaHlzX2FkZHIudS5hNjQuYWRkcmVzcykpOworCisJc3dpdGNoIChwZHBkdV9jcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZSwgY29kZSkgLyAzMl0KKwkJCSYgUERVQ1FFX0NPREVfTUFTSykgeworCWNhc2UgVU5TT0xfSERSX05PVElGWToKKwkJaXNfaGVhZGVyID0gMTsKKworCQlwYnVzeV9saXN0ID0gaHdpX2dldF9hc3luY19idXN5X2xpc3QocGFzeW5jX2N0eCwgMSwKKwkJCShwZHBkdV9jcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZSwKKwkJCWluZGV4KSAvIDMyXSAmIFBEVUNRRV9JTkRFWF9NQVNLKSk7CisKKwkJYnVmZmVyX2xlbiA9ICh1bnNpZ25lZCBpbnQpKHBoeXNfYWRkci51LmE2NC5hZGRyZXNzIC0KKwkJCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIucGFfYmFzZS51LmE2NC5hZGRyZXNzKTsKKworCQlidWZmZXJfaW5kZXggPSBidWZmZXJfbGVuIC8KKwkJCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuYnVmZmVyX3NpemU7CisKKwkJYnJlYWs7CisJY2FzZSBVTlNPTF9EQVRBX05PVElGWToKKwkJcGJ1c3lfbGlzdCA9IGh3aV9nZXRfYXN5bmNfYnVzeV9saXN0KHBhc3luY19jdHgsIDAsIChwZHBkdV9jcWUtPgorCQkJCQlkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWUsCisJCQkJCWluZGV4KSAvIDMyXSAmIFBEVUNRRV9JTkRFWF9NQVNLKSk7CisJCWJ1ZmZlcl9sZW4gPSAodW5zaWduZWQgbG9uZykocGh5c19hZGRyLnUuYTY0LmFkZHJlc3MgLQorCQkJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLnBhX2Jhc2UudS4KKwkJCQkJYTY0LmFkZHJlc3MpOworCQlidWZmZXJfaW5kZXggPSBidWZmZXJfbGVuIC8gcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5idWZmZXJfc2l6ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGJ1c3lfbGlzdCA9IE5VTEw7CisJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAorCQkJIlVuZXhwZWN0ZWQgY29kZT0lZCBcbiIsCisJCQkgcGRwZHVfY3FlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWUsCisJCQkJCWNvZGUpIC8gMzJdICYgUERVQ1FFX0NPREVfTUFTSyk7CisJCXJldHVybiBOVUxMOworCX0KKworCVdBUk5fT04oIShidWZmZXJfaW5kZXggPD0gcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5udW1fZW50cmllcykpOworCVdBUk5fT04obGlzdF9lbXB0eShwYnVzeV9saXN0KSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXN5bmNfaGFuZGxlLCBwYnVzeV9saXN0LCBsaW5rKSB7CisJCVdBUk5fT04ocGFzeW5jX2hhbmRsZS0+Y29uc3VtZWQpOworCQlpZiAocGFzeW5jX2hhbmRsZS0+aW5kZXggPT0gYnVmZmVyX2luZGV4KQorCQkJYnJlYWs7CisJfQorCisJV0FSTl9PTighcGFzeW5jX2hhbmRsZSk7CisKKwlwYXN5bmNfaGFuZGxlLT5jcmkgPSAodW5zaWduZWQgc2hvcnQpYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkOworCXBhc3luY19oYW5kbGUtPmlzX2hlYWRlciA9IGlzX2hlYWRlcjsKKwlwYXN5bmNfaGFuZGxlLT5idWZmZXJfbGVuID0gKChwZHBkdV9jcWUtPgorCQkJZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfaV90X2RwZHVfY3FlLCBkcGwpIC8gMzJdCisJCQkmIFBEVUNRRV9EUExfTUFTSykgPj4gMTYpOworCisJKnBjcV9pbmRleCA9IChwZHBkdV9jcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZSwKKwkJCWluZGV4KSAvIDMyXSAmIFBEVUNRRV9JTkRFWF9NQVNLKTsKKwlyZXR1cm4gcGFzeW5jX2hhbmRsZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraHdpX3VwZGF0ZV9hc3luY193cml0YWJsZXMoc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eCwKKwkJCSAgIHVuc2lnbmVkIGludCBpc19oZWFkZXIsIHVuc2lnbmVkIGludCBjcV9pbmRleCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwYnVzeV9saXN0OworCXN0cnVjdCBhc3luY19wZHVfaGFuZGxlICpwYXN5bmNfaGFuZGxlOworCXVuc2lnbmVkIGludCBudW1fZW50cmllcywgd3JpdGFibGVzID0gMDsKKwl1bnNpZ25lZCBpbnQgKnBlcF9yZWFkX3B0ciwgKnB3cml0YWJsZXM7CisKKworCWlmIChpc19oZWFkZXIpIHsKKwkJcGVwX3JlYWRfcHRyID0gJnBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5lcF9yZWFkX3B0cjsKKwkJcHdyaXRhYmxlcyA9ICZwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIud3JpdGFibGVzOworCQludW1fZW50cmllcyA9IHBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5udW1fZW50cmllczsKKwl9IGVsc2UgeworCQlwZXBfcmVhZF9wdHIgPSAmcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5lcF9yZWFkX3B0cjsKKwkJcHdyaXRhYmxlcyA9ICZwYXN5bmNfY3R4LT5hc3luY19kYXRhLndyaXRhYmxlczsKKwkJbnVtX2VudHJpZXMgPSBwYXN5bmNfY3R4LT5hc3luY19kYXRhLm51bV9lbnRyaWVzOworCX0KKworCXdoaWxlICgoKnBlcF9yZWFkX3B0cikgIT0gY3FfaW5kZXgpIHsKKwkJKCpwZXBfcmVhZF9wdHIpKys7CisJCSpwZXBfcmVhZF9wdHIgPSAoKnBlcF9yZWFkX3B0cikgJSBudW1fZW50cmllczsKKworCQlwYnVzeV9saXN0ID0gaHdpX2dldF9hc3luY19idXN5X2xpc3QocGFzeW5jX2N0eCwgaXNfaGVhZGVyLAorCQkJCQkJICAgICAqcGVwX3JlYWRfcHRyKTsKKwkJaWYgKHdyaXRhYmxlcyA9PSAwKQorCQkJV0FSTl9PTihsaXN0X2VtcHR5KHBidXN5X2xpc3QpKTsKKworCQlpZiAoIWxpc3RfZW1wdHkocGJ1c3lfbGlzdCkpIHsKKwkJCXBhc3luY19oYW5kbGUgPSBsaXN0X2VudHJ5KHBidXN5X2xpc3QtPm5leHQsCisJCQkJCQkgICBzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSwKKwkJCQkJCSAgIGxpbmspOworCQkJV0FSTl9PTighcGFzeW5jX2hhbmRsZSk7CisJCQlwYXN5bmNfaGFuZGxlLT5jb25zdW1lZCA9IDE7CisJCX0KKworCQl3cml0YWJsZXMrKzsKKwl9CisKKwlpZiAoIXdyaXRhYmxlcykgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsCisJCQkgIkR1cGxpY2F0ZSBub3RpZmljYXRpb24gcmVjZWl2ZWQgLSBpbmRleCAweCV4ISFcbiIsCisJCQkgY3FfaW5kZXgpOworCQlXQVJOX09OKDEpOworCX0KKworCSpwd3JpdGFibGVzID0gKnB3cml0YWJsZXMgKyB3cml0YWJsZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHdpX2ZyZWVfYXN5bmNfbXNnKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNyaSkKK3sKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eDsKKwlzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hhbmRsZSwgKnRtcF9oYW5kbGU7CisJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3Q7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcGFzeW5jX2N0eCA9IEhXSV9HRVRfQVNZTkNfUERVX0NUWChwaHdpX2N0cmxyKTsKKworCXBsaXN0ICA9ICZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUubGlzdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXN5bmNfaGFuZGxlLCB0bXBfaGFuZGxlLCBwbGlzdCwgbGluaykgeworCQlsaXN0X2RlbCgmcGFzeW5jX2hhbmRsZS0+bGluayk7CisKKwkJaWYgKGkgPT0gMCkgeworCQkJbGlzdF9hZGRfdGFpbCgmcGFzeW5jX2hhbmRsZS0+bGluaywKKwkJCQkgICAgICAmcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLmZyZWVfbGlzdCk7CisJCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9lbnRyaWVzKys7CisJCQlpKys7CisJCX0gZWxzZSB7CisJCQlsaXN0X2FkZF90YWlsKCZwYXN5bmNfaGFuZGxlLT5saW5rLAorCQkJCSAgICAgICZwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfbGlzdCk7CisJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfZW50cmllcysrOworCQkJaSsrOworCQl9CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS5saXN0KTsKKwlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuaGRyX3JlY2VpdmVkID0gMDsKKwlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuYnl0ZXNfcmVjZWl2ZWQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBoeXNfYWRkciAqCitod2lfZ2V0X3JpbmdfYWRkcmVzcyhzdHJ1Y3QgaHdpX2FzeW5jX3BkdV9jb250ZXh0ICpwYXN5bmNfY3R4LAorCQkgICAgIHVuc2lnbmVkIGludCBpc19oZWFkZXIsIHVuc2lnbmVkIGludCBob3N0X3dyaXRlX3B0cikKK3sKKwlzdHJ1Y3QgcGh5c19hZGRyICpwYXN5bmNfc2dlID0gTlVMTDsKKworCWlmIChpc19oZWFkZXIpCisJCXBhc3luY19zZ2UgPSBwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIucmluZ19iYXNlOworCWVsc2UKKwkJcGFzeW5jX3NnZSA9IHBhc3luY19jdHgtPmFzeW5jX2RhdGEucmluZ19iYXNlOworCisJcmV0dXJuIHBhc3luY19zZ2UgKyBob3N0X3dyaXRlX3B0cjsKK30KKworc3RhdGljIHZvaWQgaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkJICAgdW5zaWduZWQgaW50IGlzX2hlYWRlcikKK3sKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eDsKKwlzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hhbmRsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwZnJlZV9saW5rLCAqcGJ1c3lfbGlzdDsKKwlzdHJ1Y3QgcGh5c19hZGRyICpwYXN5bmNfc2dlOworCXVuc2lnbmVkIGludCByaW5nX2lkLCBudW1fZW50cmllczsKKwl1bnNpZ25lZCBpbnQgaG9zdF93cml0ZV9udW07CisJdW5zaWduZWQgaW50IHdyaXRhYmxlczsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJdTMyIGRvb3JiZWxsID0gMDsKKworCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCXBhc3luY19jdHggPSBIV0lfR0VUX0FTWU5DX1BEVV9DVFgocGh3aV9jdHJscik7CisKKwlpZiAoaXNfaGVhZGVyKSB7CisJCW51bV9lbnRyaWVzID0gcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLm51bV9lbnRyaWVzOworCQl3cml0YWJsZXMgPSBtaW4ocGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLndyaXRhYmxlcywKKwkJCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9lbnRyaWVzKTsKKwkJcGZyZWVfbGluayA9IHBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5mcmVlX2xpc3QubmV4dDsKKwkJaG9zdF93cml0ZV9udW0gPSBwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuaG9zdF93cml0ZV9wdHI7CisJCXJpbmdfaWQgPSBwaHdpX2N0cmxyLT5kZWZhdWx0X3BkdV9oZHIuaWQ7CisJfSBlbHNlIHsKKwkJbnVtX2VudHJpZXMgPSBwYXN5bmNfY3R4LT5hc3luY19kYXRhLm51bV9lbnRyaWVzOworCQl3cml0YWJsZXMgPSBtaW4ocGFzeW5jX2N0eC0+YXN5bmNfZGF0YS53cml0YWJsZXMsCisJCQkJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5mcmVlX2VudHJpZXMpOworCQlwZnJlZV9saW5rID0gcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5mcmVlX2xpc3QubmV4dDsKKwkJaG9zdF93cml0ZV9udW0gPSBwYXN5bmNfY3R4LT5hc3luY19kYXRhLmhvc3Rfd3JpdGVfcHRyOworCQlyaW5nX2lkID0gcGh3aV9jdHJsci0+ZGVmYXVsdF9wZHVfZGF0YS5pZDsKKwl9CisKKwl3cml0YWJsZXMgPSAod3JpdGFibGVzIC8gOCkgKiA4OworCWlmICh3cml0YWJsZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHdyaXRhYmxlczsgaSsrKSB7CisJCQlwYnVzeV9saXN0ID0KKwkJCSAgICBod2lfZ2V0X2FzeW5jX2J1c3lfbGlzdChwYXN5bmNfY3R4LCBpc19oZWFkZXIsCisJCQkJCQkgICAgaG9zdF93cml0ZV9udW0pOworCQkJcGFzeW5jX2hhbmRsZSA9CisJCQkgICAgbGlzdF9lbnRyeShwZnJlZV9saW5rLCBzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSwKKwkJCQkJCQkJbGluayk7CisJCQlXQVJOX09OKCFwYXN5bmNfaGFuZGxlKTsKKwkJCXBhc3luY19oYW5kbGUtPmNvbnN1bWVkID0gMDsKKworCQkJcGZyZWVfbGluayA9IHBmcmVlX2xpbmstPm5leHQ7CisKKwkJCXBhc3luY19zZ2UgPSBod2lfZ2V0X3JpbmdfYWRkcmVzcyhwYXN5bmNfY3R4LAorCQkJCQkJaXNfaGVhZGVyLCBob3N0X3dyaXRlX251bSk7CisKKwkJCXBhc3luY19zZ2UtPmhpID0gcGFzeW5jX2hhbmRsZS0+cGEudS5hMzIuYWRkcmVzc19sbzsKKwkJCXBhc3luY19zZ2UtPmxvID0gcGFzeW5jX2hhbmRsZS0+cGEudS5hMzIuYWRkcmVzc19oaTsKKworCQkJbGlzdF9tb3ZlKCZwYXN5bmNfaGFuZGxlLT5saW5rLCBwYnVzeV9saXN0KTsKKworCQkJaG9zdF93cml0ZV9udW0rKzsKKwkJCWhvc3Rfd3JpdGVfbnVtID0gaG9zdF93cml0ZV9udW0gJSBudW1fZW50cmllczsKKwkJfQorCisJCWlmIChpc19oZWFkZXIpIHsKKwkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5ob3N0X3dyaXRlX3B0ciA9CisJCQkJCQkJaG9zdF93cml0ZV9udW07CisJCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9lbnRyaWVzIC09IHdyaXRhYmxlczsKKwkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci53cml0YWJsZXMgLT0gd3JpdGFibGVzOworCQkJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLmJ1c3lfZW50cmllcyArPSB3cml0YWJsZXM7CisJCX0gZWxzZSB7CisJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmhvc3Rfd3JpdGVfcHRyID0gaG9zdF93cml0ZV9udW07CisJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfZW50cmllcyAtPSB3cml0YWJsZXM7CisJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLndyaXRhYmxlcyAtPSB3cml0YWJsZXM7CisJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmJ1c3lfZW50cmllcyArPSB3cml0YWJsZXM7CisJCX0KKworCQlkb29yYmVsbCB8PSByaW5nX2lkICYgREJfREVGX1BEVV9SSU5HX0lEX01BU0s7CisJCWRvb3JiZWxsIHw9IDEgPDwgREJfREVGX1BEVV9SRUFSTV9TSElGVDsKKwkJZG9vcmJlbGwgfD0gMCA8PCBEQl9ERUZfUERVX0VWRU5UX1NISUZUOworCQlkb29yYmVsbCB8PSAod3JpdGFibGVzICYgREJfREVGX1BEVV9DUVBST0NfTUFTSykKKwkJCQkJPDwgREJfREVGX1BEVV9DUVBST0NfU0hJRlQ7CisKKwkJaW93cml0ZTMyKGRvb3JiZWxsLCBwaGJhLT5kYl92YSArIERCX1JYVUxQMF9PRkZTRVQpOworCX0KK30KKworc3RhdGljIHZvaWQgaHdpX2ZsdXNoX2RlZmF1bHRfcGR1X2J1ZmZlcihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkJCSBzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCQkJCSBzdHJ1Y3QgaV90X2RwZHVfY3FlICpwZHBkdV9jcWUpCit7CisJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOworCXN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHg7CisJc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKnBhc3luY19oYW5kbGUgPSBOVUxMOworCXVuc2lnbmVkIGludCBjcV9pbmRleCA9IC0xOworCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcGFzeW5jX2N0eCA9IEhXSV9HRVRfQVNZTkNfUERVX0NUWChwaHdpX2N0cmxyKTsKKworCXBhc3luY19oYW5kbGUgPSBod2lfZ2V0X2FzeW5jX2hhbmRsZShwaGJhLCBiZWlzY3NpX2Nvbm4sIHBhc3luY19jdHgsCisJCQkJCSAgICAgcGRwZHVfY3FlLCAmY3FfaW5kZXgpOworCUJVR19PTihwYXN5bmNfaGFuZGxlLT5pc19oZWFkZXIgIT0gMCk7CisJaWYgKHBhc3luY19oYW5kbGUtPmNvbnN1bWVkID09IDApCisJCWh3aV91cGRhdGVfYXN5bmNfd3JpdGFibGVzKHBhc3luY19jdHgsIHBhc3luY19oYW5kbGUtPmlzX2hlYWRlciwKKwkJCQkJICAgY3FfaW5kZXgpOworCisJaHdpX2ZyZWVfYXN5bmNfbXNnKHBoYmEsIHBhc3luY19oYW5kbGUtPmNyaSk7CisJaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhwaGJhLCBwYXN5bmNfaGFuZGxlLT5pc19oZWFkZXIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citod2lfZndkX2FzeW5jX21zZyhzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCSAgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkgIHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHgsIHVuc2lnbmVkIHNob3J0IGNyaSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdDsKKwlzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hhbmRsZTsKKwl2b2lkICpwaGRyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaGRyX2xlbiA9IDAsIGJ1Zl9sZW4gPSAwOworCXVuc2lnbmVkIGludCBzdGF0dXMsIGluZGV4ID0gMCwgb2Zmc2V0ID0gMDsKKwl2b2lkICpwZmlyc3RfYnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbnVtX2J1ZiA9IDA7CisKKwlwbGlzdCA9ICZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUubGlzdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGFzeW5jX2hhbmRsZSwgcGxpc3QsIGxpbmspIHsKKwkJaWYgKGluZGV4ID09IDApIHsKKwkJCXBoZHIgPSBwYXN5bmNfaGFuZGxlLT5wYnVmZmVyOworCQkJaGRyX2xlbiA9IHBhc3luY19oYW5kbGUtPmJ1ZmZlcl9sZW47CisJCX0gZWxzZSB7CisJCQlidWZfbGVuID0gcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbjsKKwkJCWlmICghbnVtX2J1ZikgeworCQkJCXBmaXJzdF9idWZmZXIgPSBwYXN5bmNfaGFuZGxlLT5wYnVmZmVyOworCQkJCW51bV9idWYrKzsKKwkJCX0KKwkJCW1lbWNweShwZmlyc3RfYnVmZmVyICsgb2Zmc2V0LAorCQkJICAgICAgIHBhc3luY19oYW5kbGUtPnBidWZmZXIsIGJ1Zl9sZW4pOworCQkJb2Zmc2V0ID0gYnVmX2xlbjsKKwkJfQorCQlpbmRleCsrOworCX0KKworCXN0YXR1cyA9IGJlaXNjc2lfcHJvY2Vzc19hc3luY19wZHUoYmVpc2NzaV9jb25uLCBwaGJhLAorCQkJCQkgICBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQsCisJCQkJCSAgIHBoZHIsIGhkcl9sZW4sIHBmaXJzdF9idWZmZXIsCisJCQkJCSAgIGJ1Zl9sZW4pOworCisJaWYgKHN0YXR1cyA9PSAwKQorCQlod2lfZnJlZV9hc3luY19tc2cocGhiYSwgY3JpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraHdpX2dhdGhlcl9hc3luY19wZHUoc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uLAorCQkgICAgIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJICAgICBzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgaHdpX2FzeW5jX3BkdV9jb250ZXh0ICpwYXN5bmNfY3R4OworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNfbmVlZGVkID0gMCwgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBjcmkgPSBwYXN5bmNfaGFuZGxlLT5jcmk7CisJc3RydWN0IHBkdV9iYXNlICpwcGR1OworCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcGFzeW5jX2N0eCA9IEhXSV9HRVRfQVNZTkNfUERVX0NUWChwaHdpX2N0cmxyKTsKKworCWxpc3RfZGVsKCZwYXN5bmNfaGFuZGxlLT5saW5rKTsKKwlpZiAocGFzeW5jX2hhbmRsZS0+aXNfaGVhZGVyKSB7CisJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5idXN5X2VudHJpZXMtLTsKKwkJaWYgKHBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS5oZHJfcmVjZWl2ZWQpIHsKKwkJCWh3aV9mcmVlX2FzeW5jX21zZyhwaGJhLCBjcmkpOworCQkJQlVHKCk7CisJCX0KKworCQlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuYnl0ZXNfcmVjZWl2ZWQgPSAwOworCQlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuaGRyX3JlY2VpdmVkID0gMTsKKwkJcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53YWl0X3F1ZXVlLmhkcl9sZW4gPQorCQkJCSh1bnNpZ25lZCBzaG9ydClwYXN5bmNfaGFuZGxlLT5idWZmZXJfbGVuOworCQlsaXN0X2FkZF90YWlsKCZwYXN5bmNfaGFuZGxlLT5saW5rLAorCQkJICAgICAgJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS5saXN0KTsKKworCQlwcGR1ID0gcGFzeW5jX2hhbmRsZS0+cGJ1ZmZlcjsKKwkJYnl0ZXNfbmVlZGVkID0gKCgoKHBwZHUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3BkdV9iYXNlLAorCQkJZGF0YV9sZW5faGkpIC8gMzJdICYgUERVQkFTRV9EQVRBTEVOSElfTUFTSykgPDwgOCkgJgorCQkJMHhGRkZGMDAwMCkgfCAoKGJlMTZfdG9fY3B1KChwcGR1LT4KKwkJCWR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3BkdV9iYXNlLCBkYXRhX2xlbl9sbykgLyAzMl0KKwkJCSYgUERVQkFTRV9EQVRBTEVOTE9fTUFTSykgPj4gMTYpKSAmIDB4MDAwMEZGRkYpKTsKKworCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCXBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS5ieXRlc19uZWVkZWQgPQorCQkJICAgIGJ5dGVzX25lZWRlZDsKKworCQkJaWYgKGJ5dGVzX25lZWRlZCA9PSAwKQorCQkJCXN0YXR1cyA9IGh3aV9md2RfYXN5bmNfbXNnKGJlaXNjc2lfY29ubiwgcGhiYSwKKwkJCQkJCQkgICBwYXN5bmNfY3R4LCBjcmkpOworCQl9CisJfSBlbHNlIHsKKwkJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5idXN5X2VudHJpZXMtLTsKKwkJaWYgKHBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS5oZHJfcmVjZWl2ZWQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJnBhc3luY19oYW5kbGUtPmxpbmssCisJCQkJICAgICAgJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS4KKwkJCQkgICAgICBsaXN0KTsKKwkJCXBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS4KKwkJCQlieXRlc19yZWNlaXZlZCArPQorCQkJCSh1bnNpZ25lZCBzaG9ydClwYXN5bmNfaGFuZGxlLT5idWZmZXJfbGVuOworCisJCQlpZiAocGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53YWl0X3F1ZXVlLgorCQkJICAgIGJ5dGVzX3JlY2VpdmVkID49CisJCQkgICAgcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53YWl0X3F1ZXVlLgorCQkJICAgIGJ5dGVzX25lZWRlZCkKKwkJCQlzdGF0dXMgPSBod2lfZndkX2FzeW5jX21zZyhiZWlzY3NpX2Nvbm4sIHBoYmEsCisJCQkJCQkJICAgcGFzeW5jX2N0eCwgY3JpKTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBod2lfcHJvY2Vzc19kZWZhdWx0X3BkdV9yaW5nKHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKKwkJCQkJIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJCQkJIHN0cnVjdCBpX3RfZHBkdV9jcWUgKnBkcGR1X2NxZSkKK3sKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eDsKKwlzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hhbmRsZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNxX2luZGV4ID0gLTE7CisKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKwlwYXN5bmNfY3R4ID0gSFdJX0dFVF9BU1lOQ19QRFVfQ1RYKHBod2lfY3RybHIpOworCXBhc3luY19oYW5kbGUgPSBod2lfZ2V0X2FzeW5jX2hhbmRsZShwaGJhLCBiZWlzY3NpX2Nvbm4sIHBhc3luY19jdHgsCisJCQkJCSAgICAgcGRwZHVfY3FlLCAmY3FfaW5kZXgpOworCisJaWYgKHBhc3luY19oYW5kbGUtPmNvbnN1bWVkID09IDApCisJCWh3aV91cGRhdGVfYXN5bmNfd3JpdGFibGVzKHBhc3luY19jdHgsIHBhc3luY19oYW5kbGUtPmlzX2hlYWRlciwKKwkJCQkJICAgY3FfaW5kZXgpOworCWh3aV9nYXRoZXJfYXN5bmNfcGR1KGJlaXNjc2lfY29ubiwgcGhiYSwgcGFzeW5jX2hhbmRsZSk7CisJaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhwaGJhLCBwYXN5bmNfaGFuZGxlLT5pc19oZWFkZXIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJlaXNjc2lfcHJvY2Vzc19jcShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOworCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3E7CisJc3RydWN0IHNvbF9jcWUgKnNvbDsKKwlzdHJ1Y3QgZG1zZ19jcWUgKmRtc2c7CisJdW5zaWduZWQgaW50IG51bV9wcm9jZXNzZWQgPSAwOworCXVuc2lnbmVkIGludCB0b3RfbnVtcCA9IDA7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uOworCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OworCWNxID0gJnBod2lfY29udGV4dC0+YmVfY3E7CisJc29sID0gcXVldWVfdGFpbF9ub2RlKGNxKTsKKworCXdoaWxlIChzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIHZhbGlkKSAvIDMyXSAmCisJICAgICAgIENRRV9WQUxJRF9NQVNLKSB7CisJCWJlX2R3c19sZV90b19jcHUoc29sLCBzaXplb2Yoc3RydWN0IHNvbF9jcWUpKTsKKworCQliZWlzY3NpX2Nvbm4gPSBwaGJhLT5jb25uX3RhYmxlWyh1MzIpIChzb2wtPgorCQkJCSBkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBjaWQpIC8gMzJdICYKKwkJCQkgU09MX0NJRF9NQVNLKSA+PiA2XTsKKworCQlpZiAoIWJlaXNjc2lfY29ubiB8fCAhYmVpc2NzaV9jb25uLT5lcCkgeworCQkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkJICAgICAiQ29ubmVjdGlvbiB0YWJsZSBlbXB0eSBmb3IgY2lkID0gJWRcbiIsCisJCQkJICAgICAodTMyKShzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsCisJCQkJICAgICBjaWQpIC8gMzJdICYgU09MX0NJRF9NQVNLKSA+PiA2KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKG51bV9wcm9jZXNzZWQgPj0gMzIpIHsKKwkJCWh3aV9yaW5nX2NxX2RiKHBoYmEsIHBod2lfY29udGV4dC0+YmVfY3EuaWQsCisJCQkJCW51bV9wcm9jZXNzZWQsIDAsIDApOworCQkJdG90X251bXAgKz0gbnVtX3Byb2Nlc3NlZDsKKwkJCW51bV9wcm9jZXNzZWQgPSAwOworCQl9CisKKwkJc3dpdGNoICgodTMyKSBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNvZGUpIC8KKwkJCTMyXSAmIENRRV9DT0RFX01BU0spIHsKKwkJY2FzZSBTT0xfQ01EX0NPTVBMRVRFOgorCQkJaHdpX2NvbXBsZXRlX2NtZChiZWlzY3NpX2Nvbm4sIHBoYmEsIHNvbCk7CisJCQlicmVhazsKKwkJY2FzZSBEUklWRVJNU0dfTk9USUZZOgorCQkJU0VfREVCVUcoREJHX0xWTF84LCAiUmVjZWl2ZWQgRFJJVkVSTVNHX05PVElGWSBcbiIpOworCQkJZG1zZyA9IChzdHJ1Y3QgZG1zZ19jcWUgKilzb2w7CisJCQlod2lfY29tcGxldGVfZHJ2cl9tc2dzKGJlaXNjc2lfY29ubiwgcGhiYSwgc29sKTsKKwkJCWJyZWFrOworCQljYXNlIFVOU09MX0hEUl9OT1RJRlk6CisJCWNhc2UgVU5TT0xfREFUQV9OT1RJRlk6CisJCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJSZWNlaXZlZCBVTlNPTF9IRFIvREFUQV9OT1RJRllcbiIpOworCQkJaHdpX3Byb2Nlc3NfZGVmYXVsdF9wZHVfcmluZyhiZWlzY3NpX2Nvbm4sIHBoYmEsCisJCQkJCSAgICAgKHN0cnVjdCBpX3RfZHBkdV9jcWUgKilzb2wpOworCQkJYnJlYWs7CisJCWNhc2UgQ1hOX0lOVkFMSURBVEVfSU5ERVhfTk9USUZZOgorCQljYXNlIENNRF9JTlZBTElEQVRFRF9OT1RJRlk6CisJCWNhc2UgQ1hOX0lOVkFMSURBVEVfTk9USUZZOgorCQkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJCSAiSWdub3JpbmcgQ1EgRXJyb3Igbm90aWZpY2F0aW9uIGZvciBjbWQvY3huIgorCQkJCSAiaW52YWxpZGF0ZVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTT0xfQ01EX0tJTExFRF9EQVRBX0RJR0VTVF9FUlI6CisJCWNhc2UgQ01EX0tJTExFRF9JTlZBTElEX1NUQVRTTl9SQ1ZEOgorCQljYXNlIENNRF9LSUxMRURfSU5WQUxJRF9SMlRfUkNWRDoKKwkJY2FzZSBDTURfQ1hOX0tJTExFRF9MVU5fSU5WQUxJRDoKKwkJY2FzZSBDTURfQ1hOX0tJTExFRF9JQ0RfSU5WQUxJRDoKKwkJY2FzZSBDTURfQ1hOX0tJTExFRF9JVFRfSU5WQUxJRDoKKwkJY2FzZSBDTURfQ1hOX0tJTExFRF9TRVFfT1VUT0ZPUkRFUjoKKwkJY2FzZSBDTURfQ1hOX0tJTExFRF9JTlZBTElEX0RBVEFTTl9SQ1ZEOgorCQkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJCSAiQ1EgRXJyb3Igbm90aWZpY2F0aW9uIGZvciBjbWQuLiAiCisJCQkJICJjb2RlICVkIGNpZCAweCV4XG4iLAorCQkJCSBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNvZGUpIC8KKwkJCQkgMzJdICYgQ1FFX0NPREVfTUFTSywKKwkJCQkgKHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY2lkKSAvCisJCQkJIDMyXSAmIFNPTF9DSURfTUFTSykpOworCQkJYnJlYWs7CisJCWNhc2UgVU5TT0xfREFUQV9ESUdFU1RfRVJST1JfTk9USUZZOgorCQkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJCSAiRGlnZXN0IGVycm9yIG9uIGRlZiBwZHUgcmluZywgZHJvcHBpbmcuLlxuIik7CisJCQlod2lfZmx1c2hfZGVmYXVsdF9wZHVfYnVmZmVyKHBoYmEsIGJlaXNjc2lfY29ubiwKKwkJCQkJICAgICAoc3RydWN0IGlfdF9kcGR1X2NxZSAqKSBzb2wpOworCQkJYnJlYWs7CisJCWNhc2UgQ1hOX0tJTExFRF9QRFVfU0laRV9FWENFRURTX0RTTDoKKwkJY2FzZSBDWE5fS0lMTEVEX0JVUlNUX0xFTl9NSVNNQVRDSDoKKwkJY2FzZSBDWE5fS0lMTEVEX0FIU19SQ1ZEOgorCQljYXNlIENYTl9LSUxMRURfSERSX0RJR0VTVF9FUlI6CisJCWNhc2UgQ1hOX0tJTExFRF9VTktOT1dOX0hEUjoKKwkJY2FzZSBDWE5fS0lMTEVEX1NUQUxFX0lUVF9UVFRfUkNWRDoKKwkJY2FzZSBDWE5fS0lMTEVEX0lOVkFMSURfSVRUX1RUVF9SQ1ZEOgorCQljYXNlIENYTl9LSUxMRURfVElNRURfT1VUOgorCQljYXNlIENYTl9LSUxMRURfRklOX1JDVkQ6CisJCWNhc2UgQ1hOX0tJTExFRF9CQURfVU5TT0xfUERVX1JDVkQ6CisJCWNhc2UgQ1hOX0tJTExFRF9CQURfV1JCX0lOREVYX0VSUk9SOgorCQljYXNlIENYTl9LSUxMRURfT1ZFUl9SVU5fUkVTSURVQUw6CisJCWNhc2UgQ1hOX0tJTExFRF9VTkRFUl9SVU5fUkVTSURVQUw6CisJCWNhc2UgQ1hOX0tJTExFRF9DTU5EX0RBVEFfTk9UX09OX1NBTUVfQ09OTjoKKwkJCVNFX0RFQlVHKERCR19MVkxfMSwgIkNRIEVycm9yICVkLCByZXNldHRpbmcgQ0lEICIKKwkJCQkgIjB4JXguLi5cbiIsCisJCQkJIHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY29kZSkgLworCQkJCSAzMl0gJiBDUUVfQ09ERV9NQVNLLAorCQkJCSBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNpZCkgLworCQkJCSAzMl0gJiBDUUVfQ0lEX01BU0spOworCQkJaXNjc2lfY29ubl9mYWlsdXJlKGJlaXNjc2lfY29ubi0+Y29ubiwKKwkJCQkJICAgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKKwkJCWJyZWFrOworCQljYXNlIENYTl9LSUxMRURfUlNUX1NFTlQ6CisJCWNhc2UgQ1hOX0tJTExFRF9SU1RfUkNWRDoKKwkJCVNFX0RFQlVHKERCR19MVkxfMSwgIkNRIEVycm9yICVkLCByZXNldCByZWNlaXZlZC9zZW50ICIKKwkJCQkgIm9uIENJRCAweCV4Li4uXG4iLAorCQkJCSBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNvZGUpIC8KKwkJCQkgMzJdICYgQ1FFX0NPREVfTUFTSywKKwkJCQkgc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBjaWQpIC8KKwkJCQkgMzJdICYgQ1FFX0NJRF9NQVNLKTsKKwkJCWlzY3NpX2Nvbm5fZmFpbHVyZShiZWlzY3NpX2Nvbm4tPmNvbm4sCisJCQkJCSAgIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNFX0RFQlVHKERCR19MVkxfMSwgIkNRIEVycm9yIEludmFsaWQgY29kZT0gJWQgIgorCQkJCSAicmVjZWl2ZWQgb24gQ0lEIDB4JXguLi5cbiIsCisJCQkJIHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY29kZSkgLworCQkJCSAzMl0gJiBDUUVfQ09ERV9NQVNLLAorCQkJCSBzb2wtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3NvbF9jcWUsIGNpZCkgLworCQkJCSAzMl0gJiBDUUVfQ0lEX01BU0spOworCQkJYnJlYWs7CisJCX0KKworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX3NvbF9jcWUsIHZhbGlkLCBzb2wsIDApOworCQlxdWV1ZV90YWlsX2luYyhjcSk7CisJCXNvbCA9IHF1ZXVlX3RhaWxfbm9kZShjcSk7CisJCW51bV9wcm9jZXNzZWQrKzsKKwl9CisKKwlpZiAobnVtX3Byb2Nlc3NlZCA+IDApIHsKKwkJdG90X251bXAgKz0gbnVtX3Byb2Nlc3NlZDsKKwkJaHdpX3JpbmdfY3FfZGIocGhiYSwgcGh3aV9jb250ZXh0LT5iZV9jcS5pZCwgbnVtX3Byb2Nlc3NlZCwKKwkJCSAgICAgICAxLCAwKTsKKwl9CisJcmV0dXJuIHRvdF9udW1wOworfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX3Byb2Nlc3NfYWxsX2NxcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPQorCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJlaXNjc2lfaGJhLCB3b3JrX2Nxcyk7CisKKwlpZiAocGhiYS0+dG9kb19tY2NfY3EpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCXBoYmEtPnRvZG9fbWNjX2NxID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiTUNDIEludGVycnVwdCBOb3QgZXhwZWN0ZWQgXG4iKTsKKwl9CisKKwlpZiAocGhiYS0+dG9kb19jcSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKKwkJcGhiYS0+dG9kb19jcSA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCWJlaXNjc2lfcHJvY2Vzc19jcShwaGJhKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmVfaW9wb2xsKHN0cnVjdCBibGtfaW9wb2xsICppb3AsIGludCBidWRnZXQpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCByZXQ7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOworCisJcGhiYSA9IGNvbnRhaW5lcl9vZihpb3AsIHN0cnVjdCBiZWlzY3NpX2hiYSwgaW9wb2xsKTsKKworCXJldCA9IGJlaXNjc2lfcHJvY2Vzc19jcShwaGJhKTsKKwlpZiAocmV0IDwgYnVkZ2V0KSB7CisJCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwkJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OworCisJCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCQlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CisJCWJsa19pb3BvbGxfY29tcGxldGUoaW9wKTsKKwkJaHdpX3JpbmdfZXFfZGIocGhiYSwgcGh3aV9jb250ZXh0LT5iZV9lcS5xLmlkLCAwLAorCQkJCQkJCTAsIDEsIDEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraHdpX3dyaXRlX3NnbChzdHJ1Y3QgaXNjc2lfd3JiICpwd3JiLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCSAgICAgIHVuc2lnbmVkIGludCBudW1fc2csIHN0cnVjdCBiZWlzY3NpX2lvX3Rhc2sgKmlvX3Rhc2spCit7CisJc3RydWN0IGlzY3NpX3NnZSAqcHNnbDsKKwl1bnNpZ25lZCBzaG9ydCBzZ19sZW4sIGluZGV4OworCXVuc2lnbmVkIGludCBzZ2VfbGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmxfc2c7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBpc2NzaV9iaHNfYWRkcl9sbywgcHdyYiwKKwkJCQkgICAgICBpb190YXNrLT5iaHNfcGEudS5hMzIuYWRkcmVzc19sbyk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGlzY3NpX2Joc19hZGRyX2hpLCBwd3JiLAorCQkJCSAgICAgIGlvX3Rhc2stPmJoc19wYS51LmEzMi5hZGRyZXNzX2hpKTsKKworCWxfc2cgPSBzZzsKKwlmb3IgKGluZGV4ID0gMDsgKGluZGV4IDwgbnVtX3NnKSAmJiAoaW5kZXggPCAyKTsgaW5kZXgrKywgc2dfbmV4dChzZykpIHsKKwkJaWYgKGluZGV4ID09IDApIHsKKwkJCXNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCQkJYWRkciA9ICh1NjQpIHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBzZ2UwX2FkZHJfbG8sIHB3cmIsCisJCQkJCQkJKGFkZHIgJiAweEZGRkZGRkZGKSk7CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dlMF9hZGRyX2hpLCBwd3JiLAorCQkJCQkJCShhZGRyID4+IDMyKSk7CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dlMF9sZW4sIHB3cmIsCisJCQkJCQkJc2dfbGVuKTsKKwkJCXNnZV9sZW4gPSBzZ19sZW47CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dlMF9sYXN0LCBwd3JiLAorCQkJCQkJCTEpOworCQl9IGVsc2UgeworCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHNnZTBfbGFzdCwgcHdyYiwKKwkJCQkJCQkwKTsKKwkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBzZ2UxX3IydF9vZmZzZXQsCisJCQkJCQkJcHdyYiwgc2dlX2xlbik7CisJCQlzZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKwkJCWFkZHIgPSAodTY0KSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dlMV9hZGRyX2xvLCBwd3JiLAorCQkJCQkJCShhZGRyICYgMHhGRkZGRkZGRikpOworCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHNnZTFfYWRkcl9oaSwgcHdyYiwKKwkJCQkJCQkoYWRkciA+PiAzMikpOworCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHNnZTFfbGVuLCBwd3JiLAorCQkJCQkJCXNnX2xlbik7CisJCX0KKwl9CisJcHNnbCA9IChzdHJ1Y3QgaXNjc2lfc2dlICopaW9fdGFzay0+cHNnbF9oYW5kbGUtPnBmcmFnOworCW1lbXNldChwc2dsLCAwLCBzaXplb2YoKnBzZ2wpICogQkUyX1NHRSk7CisKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgbGVuLCBwc2dsLCBpb190YXNrLT5iaHNfbGVuIC0gMik7CisKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgYWRkcl9oaSwgcHNnbCwKKwkJCWlvX3Rhc2stPmJoc19wYS51LmEzMi5hZGRyZXNzX2hpKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgYWRkcl9sbywgcHNnbCwKKwkJCWlvX3Rhc2stPmJoc19wYS51LmEzMi5hZGRyZXNzX2xvKTsKKworCWlmIChudW1fc2cgPT0gMikKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHNnZTFfbGFzdCwgcHdyYiwgMSk7CisJc2cgPSBsX3NnOworCXBzZ2wrKzsKKwlwc2dsKys7CisJb2Zmc2V0ID0gMDsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1fc2c7IGluZGV4KyssIHNnX25leHQoc2cpLCBwc2dsKyspIHsKKwkJc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCWFkZHIgPSAodTY0KSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfc2dlLCBhZGRyX2xvLCBwc2dsLAorCQkJCQkJKGFkZHIgJiAweEZGRkZGRkZGKSk7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfc2dlLCBhZGRyX2hpLCBwc2dsLAorCQkJCQkJKGFkZHIgPj4gMzIpKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV9zZ2UsIGxlbiwgcHNnbCwgc2dfbGVuKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV9zZ2UsIHNnZV9vZmZzZXQsIHBzZ2wsIG9mZnNldCk7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfc2dlLCBsYXN0X3NnZSwgcHNnbCwgMCk7CisJCW9mZnNldCArPSBzZ19sZW47CisJfQorCXBzZ2wtLTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgbGFzdF9zZ2UsIHBzZ2wsIDEpOworfQorCitzdGF0aWMgdm9pZCBod2lfd3JpdGVfYnVmZmVyKHN0cnVjdCBpc2NzaV93cmIgKnB3cmIsIHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQoreworCXN0cnVjdCBpc2NzaV9zZ2UgKnBzZ2w7CisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7CisJc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqaW9fdGFzayA9IHRhc2stPmRkX2RhdGE7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uID0gaW9fdGFzay0+Y29ubjsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBiZWlzY3NpX2Nvbm4tPnBoYmE7CisKKwlpb190YXNrLT5iaHNfbGVuID0gc2l6ZW9mKHN0cnVjdCBiZV9ub25pb19iaHMpIC0gMjsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgaXNjc2lfYmhzX2FkZHJfbG8sIHB3cmIsCisJCQkJaW9fdGFzay0+YmhzX3BhLnUuYTMyLmFkZHJlc3NfbG8pOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBpc2NzaV9iaHNfYWRkcl9oaSwgcHdyYiwKKwkJCQlpb190YXNrLT5iaHNfcGEudS5hMzIuYWRkcmVzc19oaSk7CisKKwlpZiAodGFzay0+ZGF0YSkgeworCQlpZiAodGFzay0+ZGF0YV9jb3VudCkgeworCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGRzcCwgcHdyYiwgMSk7CisJCQlhZGRyID0gKHU2NCkgcGNpX21hcF9zaW5nbGUocGhiYS0+cGNpZGV2LAorCQkJCQkJICAgIHRhc2stPmRhdGEsCisJCQkJCQkgICAgdGFzay0+ZGF0YV9jb3VudCwgMSk7CisJCX0gZWxzZSB7CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgZHNwLCBwd3JiLCAwKTsKKwkJCWFkZHIgPSAwOworCQl9CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBzZ2UwX2FkZHJfbG8sIHB3cmIsCisJCQkJCQkoYWRkciAmIDB4RkZGRkZGRkYpKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHNnZTBfYWRkcl9oaSwgcHdyYiwKKwkJCQkJCShhZGRyID4+IDMyKSk7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBzZ2UwX2xlbiwgcHdyYiwKKwkJCQkJCXRhc2stPmRhdGFfY291bnQpOworCisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBzZ2UwX2xhc3QsIHB3cmIsIDEpOworCX0gZWxzZSB7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkc3AsIHB3cmIsIDApOworCQlhZGRyID0gMDsKKwl9CisKKwlwc2dsID0gKHN0cnVjdCBpc2NzaV9zZ2UgKilpb190YXNrLT5wc2dsX2hhbmRsZS0+cGZyYWc7CisKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgbGVuLCBwc2dsLCBpb190YXNrLT5iaHNfbGVuKTsKKworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfc2dlLCBhZGRyX2hpLCBwc2dsLAorCQkgICAgICBpb190YXNrLT5iaHNfcGEudS5hMzIuYWRkcmVzc19oaSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV9zZ2UsIGFkZHJfbG8sIHBzZ2wsCisJCSAgICAgIGlvX3Rhc2stPmJoc19wYS51LmEzMi5hZGRyZXNzX2xvKTsKKwlpZiAodGFzay0+ZGF0YSkgeworCQlwc2dsKys7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfc2dlLCBhZGRyX2hpLCBwc2dsLCAwKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV9zZ2UsIGFkZHJfbG8sIHBzZ2wsIDApOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgbGVuLCBwc2dsLCAwKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV9zZ2UsIHNnZV9vZmZzZXQsIHBzZ2wsIDApOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgcnN2ZDAsIHBzZ2wsIDApOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgbGFzdF9zZ2UsIHBzZ2wsIDApOworCisJCXBzZ2wrKzsKKwkJaWYgKHRhc2stPmRhdGEpIHsKKwkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfc2dlLCBhZGRyX2xvLCBwc2dsLAorCQkJCQkJKGFkZHIgJiAweEZGRkZGRkZGKSk7CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgYWRkcl9oaSwgcHNnbCwKKwkJCQkJCShhZGRyID4+IDMyKSk7CisJCX0KKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV9zZ2UsIGxlbiwgcHNnbCwgMHgxMDYpOworCX0KKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgbGFzdF9zZ2UsIHBzZ2wsIDEpOworfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX2ZpbmRfbWVtX3JlcShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJdW5zaWduZWQgaW50IG51bV9jcV9wYWdlcywgbnVtX2VxX3BhZ2VzLCBudW1fYXN5bmNfcGR1X2J1Zl9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbnVtX2FzeW5jX3BkdV9kYXRhX3BhZ2VzLCB3cmJfc3pfcGVyX2N4bjsKKwl1bnNpZ25lZCBpbnQgbnVtX2FzeW5jX3BkdV9idWZfc2dsX3BhZ2VzLCBudW1fYXN5bmNfcGR1X2RhdGFfc2dsX3BhZ2VzOworCisJbnVtX2NxX3BhZ2VzID0gUEFHRVNfUkVRVUlSRUQocGhiYS0+cGFyYW1zLm51bV9jcV9lbnRyaWVzICogXAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc29sX2NxZSkpOworCW51bV9lcV9wYWdlcyA9IFBBR0VTX1JFUVVJUkVEKHBoYmEtPnBhcmFtcy5udW1fZXFfZW50cmllcyAqIFwKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGJlX2VxX2VudHJ5KSk7CisJbnVtX2FzeW5jX3BkdV9idWZfcGFnZXMgPQorCQkJUEFHRVNfUkVRVUlSRUQocGhiYS0+cGFyYW1zLmFzeW5jcGR1c19wZXJfY3RybCAqIFwKKwkJCQkgICAgICAgcGhiYS0+cGFyYW1zLmRlZnBkdV9oZHJfc3opOworCW51bV9hc3luY19wZHVfYnVmX3NnbF9wYWdlcyA9CisJCQlQQUdFU19SRVFVSVJFRChwaGJhLT5wYXJhbXMuYXN5bmNwZHVzX3Blcl9jdHJsICogXAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHBoeXNfYWRkcikpOworCW51bV9hc3luY19wZHVfZGF0YV9wYWdlcyA9CisJCQlQQUdFU19SRVFVSVJFRChwaGJhLT5wYXJhbXMuYXN5bmNwZHVzX3Blcl9jdHJsICogXAorCQkJCSAgICAgICBwaGJhLT5wYXJhbXMuZGVmcGR1X2RhdGFfc3opOworCW51bV9hc3luY19wZHVfZGF0YV9zZ2xfcGFnZXMgPQorCQkJUEFHRVNfUkVRVUlSRUQocGhiYS0+cGFyYW1zLmFzeW5jcGR1c19wZXJfY3RybCAqIFwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwaHlzX2FkZHIpKTsKKworCXBoYmEtPnBhcmFtcy5od2lfd3Nfc3ogPSBzaXplb2Yoc3RydWN0IGh3aV9jb250cm9sbGVyKTsKKworCXBoYmEtPm1lbV9yZXFbSVNDU0lfTUVNX0dMT0JBTF9IRUFERVJdID0gMiAqCisJCQkJCQkgQkVfSVNDU0lfUERVX0hFQURFUl9TSVpFOworCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9BREROX0NPTlRFWFRdID0KKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5KTsKKworCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9DUV0gPSBudW1fY3FfcGFnZXMgKiBQQUdFX1NJWkU7CisJcGhiYS0+bWVtX3JlcVtIV0lfTUVNX0VRXSA9IG51bV9lcV9wYWdlcyAqIFBBR0VfU0laRTsKKworCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9XUkJdID0gc2l6ZW9mKHN0cnVjdCBpc2NzaV93cmIpCisJICAgICogKHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4pCisJICAgICogcGhiYS0+cGFyYW1zLmN4bnNfcGVyX2N0cmw7CisJd3JiX3N6X3Blcl9jeG4gPSAgc2l6ZW9mKHN0cnVjdCB3cmJfaGFuZGxlKSAqCisJCQkJIChwaGJhLT5wYXJhbXMud3Jic19wZXJfY3huKTsKKwlwaGJhLT5tZW1fcmVxW0hXSV9NRU1fV1JCSF0gPSByb3VuZHVwX3Bvd19vZl90d28oKHdyYl9zel9wZXJfY3huKSAqCisJCQkJcGhiYS0+cGFyYW1zLmN4bnNfcGVyX2N0cmwpOworCisJcGhiYS0+bWVtX3JlcVtIV0lfTUVNX1NHTEhdID0gc2l6ZW9mKHN0cnVjdCBzZ2xfaGFuZGxlKSAqCisJCXBoYmEtPnBhcmFtcy5pY2RzX3Blcl9jdHJsOworCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9TR0VdID0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9zZ2UpICoKKwkJcGhiYS0+cGFyYW1zLm51bV9zZ2VfcGVyX2lvICogcGhiYS0+cGFyYW1zLmljZHNfcGVyX2N0cmw7CisKKwlwaGJhLT5tZW1fcmVxW0hXSV9NRU1fQVNZTkNfSEVBREVSX0JVRl0gPQorCQludW1fYXN5bmNfcGR1X2J1Zl9wYWdlcyAqIFBBR0VfU0laRTsKKwlwaGJhLT5tZW1fcmVxW0hXSV9NRU1fQVNZTkNfREFUQV9CVUZdID0KKwkJbnVtX2FzeW5jX3BkdV9kYXRhX3BhZ2VzICogUEFHRV9TSVpFOworCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9BU1lOQ19IRUFERVJfUklOR10gPQorCQludW1fYXN5bmNfcGR1X2J1Zl9zZ2xfcGFnZXMgKiBQQUdFX1NJWkU7CisJcGhiYS0+bWVtX3JlcVtIV0lfTUVNX0FTWU5DX0RBVEFfUklOR10gPQorCQludW1fYXN5bmNfcGR1X2RhdGFfc2dsX3BhZ2VzICogUEFHRV9TSVpFOworCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9BU1lOQ19IRUFERVJfSEFORExFXSA9CisJCXBoYmEtPnBhcmFtcy5hc3luY3BkdXNfcGVyX2N0cmwgKgorCQlzaXplb2Yoc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUpOworCXBoYmEtPm1lbV9yZXFbSFdJX01FTV9BU1lOQ19EQVRBX0hBTkRMRV0gPQorCQlwaGJhLT5wYXJhbXMuYXN5bmNwZHVzX3Blcl9jdHJsICoKKwkJc2l6ZW9mKHN0cnVjdCBhc3luY19wZHVfaGFuZGxlKTsKKwlwaGJhLT5tZW1fcmVxW0hXSV9NRU1fQVNZTkNfUERVX0NPTlRFWFRdID0KKwkJc2l6ZW9mKHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQpICsKKwkJKHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsICogc2l6ZW9mKHN0cnVjdCBod2lfYXN5bmNfZW50cnkpKTsKK30KKworc3RhdGljIGludCBiZWlzY3NpX2FsbG9jX21lbShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGJlX21lbV9kZXNjcmlwdG9yICptZW1fZGVzY3I7CisJZG1hX2FkZHJfdCBidXNfYWRkOworCXN0cnVjdCBtZW1fYXJyYXkgKm1lbV9hcnIsICptZW1fYXJyX29yaWc7CisJdW5zaWduZWQgaW50IGksIGosIGFsbG9jX3NpemUsIGN1cnJfYWxsb2Nfc2l6ZTsKKworCXBoYmEtPnBod2lfY3RybHIgPSBrbWFsbG9jKHBoYmEtPnBhcmFtcy5od2lfd3Nfc3osIEdGUF9LRVJORUwpOworCWlmICghcGhiYS0+cGh3aV9jdHJscikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwaGJhLT5pbml0X21lbSA9IGtjYWxsb2MoU0VfTUVNX01BWCwgc2l6ZW9mKCptZW1fZGVzY3IpLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIXBoYmEtPmluaXRfbWVtKSB7CisJCWtmcmVlKHBoYmEtPnBod2lfY3RybHIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1fYXJyX29yaWcgPSBrbWFsbG9jKHNpemVvZigqbWVtX2Fycl9vcmlnKSAqIEJFSVNDU0lfTUFYX0ZSQUdTX0lOSVQsCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZW1fYXJyX29yaWcpIHsKKwkJa2ZyZWUocGhiYS0+aW5pdF9tZW0pOworCQlrZnJlZShwaGJhLT5waHdpX2N0cmxyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtX2Rlc2NyID0gcGhiYS0+aW5pdF9tZW07CisJZm9yIChpID0gMDsgaSA8IFNFX01FTV9NQVg7IGkrKykgeworCQlqID0gMDsKKwkJbWVtX2FyciA9IG1lbV9hcnJfb3JpZzsKKwkJYWxsb2Nfc2l6ZSA9IHBoYmEtPm1lbV9yZXFbaV07CisJCW1lbXNldChtZW1fYXJyLCAwLCBzaXplb2Yoc3RydWN0IG1lbV9hcnJheSkgKgorCQkgICAgICAgQkVJU0NTSV9NQVhfRlJBR1NfSU5JVCk7CisJCWN1cnJfYWxsb2Nfc2l6ZSA9IG1pbihiZV9tYXhfcGh5c19zaXplICogMTAyNCwgYWxsb2Nfc2l6ZSk7CisJCWRvIHsKKwkJCW1lbV9hcnItPnZpcnR1YWxfYWRkcmVzcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KAorCQkJCQkJCXBoYmEtPnBjaWRldiwKKwkJCQkJCQljdXJyX2FsbG9jX3NpemUsCisJCQkJCQkJJmJ1c19hZGQpOworCQkJaWYgKCFtZW1fYXJyLT52aXJ0dWFsX2FkZHJlc3MpIHsKKwkJCQlpZiAoY3Vycl9hbGxvY19zaXplIDw9IEJFX01JTl9NRU1fU0laRSkKKwkJCQkJZ290byBmcmVlX21lbTsKKwkJCQlpZiAoY3Vycl9hbGxvY19zaXplIC0KKwkJCQkJcm91bmRkb3duX3Bvd19vZl90d28oY3Vycl9hbGxvY19zaXplKSkKKwkJCQkJY3Vycl9hbGxvY19zaXplID0gcm91bmRkb3duX3Bvd19vZl90d28KKwkJCQkJCQkgICAgIChjdXJyX2FsbG9jX3NpemUpOworCQkJCWVsc2UKKwkJCQkJY3Vycl9hbGxvY19zaXplID0gY3Vycl9hbGxvY19zaXplIC8gMjsKKwkJCX0gZWxzZSB7CisJCQkJbWVtX2Fyci0+YnVzX2FkZHJlc3MudS4KKwkJCQkgICAgYTY0LmFkZHJlc3MgPSAoX191NjQpIGJ1c19hZGQ7CisJCQkJbWVtX2Fyci0+c2l6ZSA9IGN1cnJfYWxsb2Nfc2l6ZTsKKwkJCQlhbGxvY19zaXplIC09IGN1cnJfYWxsb2Nfc2l6ZTsKKwkJCQljdXJyX2FsbG9jX3NpemUgPSBtaW4oYmVfbWF4X3BoeXNfc2l6ZSAqCisJCQkJCQkgICAgICAxMDI0LCBhbGxvY19zaXplKTsKKwkJCQlqKys7CisJCQkJbWVtX2FycisrOworCQkJfQorCQl9IHdoaWxlIChhbGxvY19zaXplKTsKKwkJbWVtX2Rlc2NyLT5udW1fZWxlbWVudHMgPSBqOworCQltZW1fZGVzY3ItPnNpemVfaW5fYnl0ZXMgPSBwaGJhLT5tZW1fcmVxW2ldOworCQltZW1fZGVzY3ItPm1lbV9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKCptZW1fYXJyKSAqIGosCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtZW1fZGVzY3ItPm1lbV9hcnJheSkKKwkJCWdvdG8gZnJlZV9tZW07CisKKwkJbWVtY3B5KG1lbV9kZXNjci0+bWVtX2FycmF5LCBtZW1fYXJyX29yaWcsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG1lbV9hcnJheSkgKiBqKTsKKwkJbWVtX2Rlc2NyKys7CisJfQorCWtmcmVlKG1lbV9hcnJfb3JpZyk7CisJcmV0dXJuIDA7CitmcmVlX21lbToKKwltZW1fZGVzY3ItPm51bV9lbGVtZW50cyA9IGo7CisJd2hpbGUgKChpKSB8fCAoaikpIHsKKwkJZm9yIChqID0gbWVtX2Rlc2NyLT5udW1fZWxlbWVudHM7IGogPiAwOyBqLS0pIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LAorCQkJCQkgICAgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaiAtIDFdLnNpemUsCisJCQkJCSAgICBtZW1fZGVzY3ItPm1lbV9hcnJheVtqIC0gMV0uCisJCQkJCSAgICB2aXJ0dWFsX2FkZHJlc3MsCisJCQkJCSAgICBtZW1fZGVzY3ItPm1lbV9hcnJheVtqIC0gMV0uCisJCQkJCSAgICBidXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzKTsKKwkJfQorCQlpZiAoaSkgeworCQkJaS0tOworCQkJa2ZyZWUobWVtX2Rlc2NyLT5tZW1fYXJyYXkpOworCQkJbWVtX2Rlc2NyLS07CisJCX0KKwl9CisJa2ZyZWUobWVtX2Fycl9vcmlnKTsKKwlrZnJlZShwaGJhLT5pbml0X21lbSk7CisJa2ZyZWUocGhiYS0+cGh3aV9jdHJscik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgYmVpc2NzaV9nZXRfbWVtb3J5KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwliZWlzY3NpX2ZpbmRfbWVtX3JlcShwaGJhKTsKKwlyZXR1cm4gYmVpc2NzaV9hbGxvY19tZW0ocGhiYSk7Cit9CisKK3N0YXRpYyB2b2lkIGlzY3NpX2luaXRfZ2xvYmFsX3RlbXBsYXRlcyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IHBkdV9kYXRhX291dCAqcGRhdGFfb3V0OworCXN0cnVjdCBwZHVfbm9wX291dCAqcG5vcF9vdXQ7CisJc3RydWN0IGJlX21lbV9kZXNjcmlwdG9yICptZW1fZGVzY3I7CisKKwltZW1fZGVzY3IgPSBwaGJhLT5pbml0X21lbTsKKwltZW1fZGVzY3IgKz0gSVNDU0lfTUVNX0dMT0JBTF9IRUFERVI7CisJcGRhdGFfb3V0ID0KKwkgICAgKHN0cnVjdCBwZHVfZGF0YV9vdXQgKiltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CisJbWVtc2V0KHBkYXRhX291dCwgMCwgQkVfSVNDU0lfUERVX0hFQURFUl9TSVpFKTsKKworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfcGR1X2RhdGFfb3V0LCBvcGNvZGUsIHBkYXRhX291dCwKKwkJICAgICAgSUlPQ19TQ1NJX0RBVEEpOworCisJcG5vcF9vdXQgPQorCSAgICAoc3RydWN0IHBkdV9ub3Bfb3V0ICopKCh1bnNpZ25lZCBjaGFyICopbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0uCisJCQkJICAgdmlydHVhbF9hZGRyZXNzICsgQkVfSVNDU0lfUERVX0hFQURFUl9TSVpFKTsKKworCW1lbXNldChwbm9wX291dCwgMCwgQkVfSVNDU0lfUERVX0hFQURFUl9TSVpFKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX3BkdV9ub3Bfb3V0LCB0dHQsIHBub3Bfb3V0LCAweEZGRkZGRkZGKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX3BkdV9ub3Bfb3V0LCBmX2JpdCwgcG5vcF9vdXQsIDEpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfcGR1X25vcF9vdXQsIGlfYml0LCBwbm9wX291dCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJlaXNjc2lfaW5pdF93cmJfaGFuZGxlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKm1lbV9kZXNjcl93cmJoLCAqbWVtX2Rlc2NyX3dyYjsKKwlzdHJ1Y3Qgd3JiX2hhbmRsZSAqcHdyYl9oYW5kbGU7CisJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOworCXN0cnVjdCBod2lfd3JiX2NvbnRleHQgKnB3cmJfY29udGV4dDsKKwlzdHJ1Y3QgaXNjc2lfd3JiICpwd3JiOworCXVuc2lnbmVkIGludCBudW1fY3huX3dyYmg7CisJdW5zaWduZWQgaW50IG51bV9jeG5fd3JiLCBqLCBpZHgsIGluZGV4OworCisJbWVtX2Rlc2NyX3dyYmggPSBwaGJhLT5pbml0X21lbTsKKwltZW1fZGVzY3Jfd3JiaCArPSBIV0lfTUVNX1dSQkg7CisKKwltZW1fZGVzY3Jfd3JiID0gcGhiYS0+aW5pdF9tZW07CisJbWVtX2Rlc2NyX3dyYiArPSBIV0lfTUVNX1dSQjsKKworCWlkeCA9IDA7CisJcHdyYl9oYW5kbGUgPSBtZW1fZGVzY3Jfd3JiaC0+bWVtX2FycmF5W2lkeF0udmlydHVhbF9hZGRyZXNzOworCW51bV9jeG5fd3JiaCA9ICgobWVtX2Rlc2NyX3dyYmgtPm1lbV9hcnJheVtpZHhdLnNpemUpIC8KKwkJCSgoc2l6ZW9mKHN0cnVjdCB3cmJfaGFuZGxlKSkgKgorCQkJIHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4pKTsKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsICogMjsgaW5kZXggKz0gMikgeworCQlwd3JiX2NvbnRleHQgPSAmcGh3aV9jdHJsci0+d3JiX2NvbnRleHRbaW5kZXhdOworCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJjaWQ9JWQgcHdyYl9jb250ZXh0PSVwIFxuIiwgaW5kZXgsCisJCQkJCQlwd3JiX2NvbnRleHQpOworCQlwd3JiX2NvbnRleHQtPnB3cmJfaGFuZGxlX2Jhc2UgPQorCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3cmJfaGFuZGxlICopICoKKwkJCQkJcGhiYS0+cGFyYW1zLndyYnNfcGVyX2N4biwgR0ZQX0tFUk5FTCk7CisJCXB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZXN0ZCA9CisJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHdyYl9oYW5kbGUgKikgKgorCQkJCQlwaGJhLT5wYXJhbXMud3Jic19wZXJfY3huLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG51bV9jeG5fd3JiaCkgeworCQkJcHdyYl9jb250ZXh0LT5hbGxvY19pbmRleCA9IDA7CisJCQlwd3JiX2NvbnRleHQtPndyYl9oYW5kbGVzX2F2YWlsYWJsZSA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgcGhiYS0+cGFyYW1zLndyYnNfcGVyX2N4bjsgaisrKSB7CisJCQkJcHdyYl9jb250ZXh0LT5wd3JiX2hhbmRsZV9iYXNlW2pdID0gcHdyYl9oYW5kbGU7CisJCQkJcHdyYl9jb250ZXh0LT5wd3JiX2hhbmRsZV9iYXNlc3RkW2pdID0KKwkJCQkJCQkJcHdyYl9oYW5kbGU7CisJCQkJcHdyYl9jb250ZXh0LT53cmJfaGFuZGxlc19hdmFpbGFibGUrKzsKKwkJCQlwd3JiX2hhbmRsZSsrOworCQkJfQorCQkJcHdyYl9jb250ZXh0LT5mcmVlX2luZGV4ID0gMDsKKwkJCW51bV9jeG5fd3JiaC0tOworCQl9IGVsc2UgeworCQkJaWR4Kys7CisJCQlwd3JiX2hhbmRsZSA9CisJCQkgICAgbWVtX2Rlc2NyX3dyYmgtPm1lbV9hcnJheVtpZHhdLnZpcnR1YWxfYWRkcmVzczsKKwkJCW51bV9jeG5fd3JiaCA9CisJCQkgICAgKChtZW1fZGVzY3Jfd3JiaC0+bWVtX2FycmF5W2lkeF0uc2l6ZSkgLworCQkJICAgICAoKHNpemVvZihzdHJ1Y3Qgd3JiX2hhbmRsZSkpICoKKwkJCSAgICAgIHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4pKTsKKwkJCXB3cmJfY29udGV4dC0+YWxsb2NfaW5kZXggPSAwOworCQkJZm9yIChqID0gMDsgaiA8IHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG47IGorKykgeworCQkJCXB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZVtqXSA9IHB3cmJfaGFuZGxlOworCQkJCXB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZXN0ZFtqXSA9CisJCQkJICAgIHB3cmJfaGFuZGxlOworCQkJCXB3cmJfY29udGV4dC0+d3JiX2hhbmRsZXNfYXZhaWxhYmxlKys7CisJCQkJcHdyYl9oYW5kbGUrKzsKKwkJCX0KKwkJCXB3cmJfY29udGV4dC0+ZnJlZV9pbmRleCA9IDA7CisJCQludW1fY3huX3dyYmgtLTsKKwkJfQorCX0KKwlpZHggPSAwOworCXB3cmIgPSBtZW1fZGVzY3Jfd3JiLT5tZW1fYXJyYXlbaWR4XS52aXJ0dWFsX2FkZHJlc3M7CisJbnVtX2N4bl93cmIgPQorCSAgICAoKG1lbV9kZXNjcl93cmItPm1lbV9hcnJheVtpZHhdLnNpemUpIC8gKHNpemVvZihzdHJ1Y3QgaXNjc2lfd3JiKSkgKgorCSAgICAgcGhiYS0+cGFyYW1zLndyYnNfcGVyX2N4bik7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybDsgaW5kZXggKz0gMikgeworCQlwd3JiX2NvbnRleHQgPSAmcGh3aV9jdHJsci0+d3JiX2NvbnRleHRbaW5kZXhdOworCQlpZiAobnVtX2N4bl93cmIpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBwaGJhLT5wYXJhbXMud3Jic19wZXJfY3huOyBqKyspIHsKKwkJCQlwd3JiX2hhbmRsZSA9IHB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZVtqXTsKKwkJCQlwd3JiX2hhbmRsZS0+cHdyYiA9IHB3cmI7CisJCQkJcHdyYisrOworCQkJfQorCQkJbnVtX2N4bl93cmItLTsKKwkJfSBlbHNlIHsKKwkJCWlkeCsrOworCQkJcHdyYiA9IG1lbV9kZXNjcl93cmItPm1lbV9hcnJheVtpZHhdLnZpcnR1YWxfYWRkcmVzczsKKwkJCW51bV9jeG5fd3JiID0gKChtZW1fZGVzY3Jfd3JiLT5tZW1fYXJyYXlbaWR4XS5zaXplKSAvCisJCQkJCShzaXplb2Yoc3RydWN0IGlzY3NpX3dyYikpICoKKwkJCQkJcGhiYS0+cGFyYW1zLndyYnNfcGVyX2N4bik7CisJCQlmb3IgKGogPSAwOyBqIDwgcGhiYS0+cGFyYW1zLndyYnNfcGVyX2N4bjsgaisrKSB7CisJCQkJcHdyYl9oYW5kbGUgPSBwd3JiX2NvbnRleHQtPnB3cmJfaGFuZGxlX2Jhc2Vbal07CisJCQkJcHdyYl9oYW5kbGUtPnB3cmIgPSBwd3JiOworCQkJCXB3cmIrKzsKKwkJCX0KKwkJCW51bV9jeG5fd3JiLS07CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGh3aV9pbml0X2FzeW5jX3BkdV9jdHgoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwlzdHJ1Y3QgaGJhX3BhcmFtZXRlcnMgKnAgPSAmcGhiYS0+cGFyYW1zOworCXN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHg7CisJc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKnBhc3luY19oZWFkZXJfaCwgKnBhc3luY19kYXRhX2g7CisJdW5zaWduZWQgaW50IGluZGV4OworCXN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqbWVtX2Rlc2NyOworCisJbWVtX2Rlc2NyID0gKHN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqKXBoYmEtPmluaXRfbWVtOworCW1lbV9kZXNjciArPSBIV0lfTUVNX0FTWU5DX1BEVV9DT05URVhUOworCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcGh3aV9jdHJsci0+cGh3aV9jdHh0LT5wYXN5bmNfY3R4ID0gKHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKikKKwkJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CisJcGFzeW5jX2N0eCA9IHBod2lfY3RybHItPnBod2lfY3R4dC0+cGFzeW5jX2N0eDsKKwltZW1zZXQocGFzeW5jX2N0eCwgMCwgc2l6ZW9mKCpwYXN5bmNfY3R4KSk7CisKKwlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIubnVtX2VudHJpZXMgPSBwLT5hc3luY3BkdXNfcGVyX2N0cmw7CisJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLmJ1ZmZlcl9zaXplID0gcC0+ZGVmcGR1X2hkcl9zejsKKwlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmJ1ZmZlcl9zaXplID0gcC0+ZGVmcGR1X2RhdGFfc3o7CisJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5udW1fZW50cmllcyA9IHAtPmFzeW5jcGR1c19wZXJfY3RybDsKKworCW1lbV9kZXNjciA9IChzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKilwaGJhLT5pbml0X21lbTsKKwltZW1fZGVzY3IgKz0gSFdJX01FTV9BU1lOQ19IRUFERVJfQlVGOworCWlmIChtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpIHsKKwkJU0VfREVCVUcoREJHX0xWTF84LAorCQkJICJod2lfaW5pdF9hc3luY19wZHVfY3R4IEhXSV9NRU1fQVNZTkNfSEVBREVSX0JVRiIKKwkJCSAidmE9JXAgXG4iLCBtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpOworCX0gZWxzZQorCQlzaG9zdF9wcmludGsoS0VSTl9XQVJOSU5HLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgIk5vIFZpcnR1YWwgYWRkcmVzcyBcbiIpOworCisJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLnZhX2Jhc2UgPQorCQkJbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzOworCisJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLnBhX2Jhc2UudS5hNjQuYWRkcmVzcyA9CisJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS5idXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzOworCisJbWVtX2Rlc2NyID0gKHN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqKXBoYmEtPmluaXRfbWVtOworCW1lbV9kZXNjciArPSBIV0lfTUVNX0FTWU5DX0hFQURFUl9SSU5HOworCWlmIChtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpIHsKKwkJU0VfREVCVUcoREJHX0xWTF84LAorCQkJICJod2lfaW5pdF9hc3luY19wZHVfY3R4IEhXSV9NRU1fQVNZTkNfSEVBREVSX1JJTkciCisJCQkgInZhPSVwIFxuIiwgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzKTsKKwl9IGVsc2UKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgIk5vIFZpcnR1YWwgYWRkcmVzcyBcbiIpOworCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5yaW5nX2Jhc2UgPQorCQkJbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzOworCisJbWVtX2Rlc2NyID0gKHN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqKXBoYmEtPmluaXRfbWVtOworCW1lbV9kZXNjciArPSBIV0lfTUVNX0FTWU5DX0hFQURFUl9IQU5ETEU7CisJaWYgKG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcykgeworCQlTRV9ERUJVRyhEQkdfTFZMXzgsCisJCQkgImh3aV9pbml0X2FzeW5jX3BkdV9jdHggSFdJX01FTV9BU1lOQ19IRUFERVJfSEFORExFIgorCQkJICJ2YT0lcCBcbiIsIG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcyk7CisJfSBlbHNlCisJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAorCQkJICAgICJObyBWaXJ0dWFsIGFkZHJlc3MgXG4iKTsKKworCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5oYW5kbGVfYmFzZSA9CisJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CisJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLndyaXRhYmxlcyA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJnBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5mcmVlX2xpc3QpOworCisJbWVtX2Rlc2NyID0gKHN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqKXBoYmEtPmluaXRfbWVtOworCW1lbV9kZXNjciArPSBIV0lfTUVNX0FTWU5DX0RBVEFfQlVGOworCWlmIChtZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3MpIHsKKwkJU0VfREVCVUcoREJHX0xWTF84LAorCQkJICJod2lfaW5pdF9hc3luY19wZHVfY3R4IEhXSV9NRU1fQVNZTkNfREFUQV9CVUYiCisJCQkgInZhPSVwIFxuIiwgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzKTsKKwl9IGVsc2UKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgIk5vIFZpcnR1YWwgYWRkcmVzcyBcbiIpOworCXBhc3luY19jdHgtPmFzeW5jX2RhdGEudmFfYmFzZSA9CisJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CisJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5wYV9iYXNlLnUuYTY0LmFkZHJlc3MgPQorCQkJbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0uYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzczsKKworCW1lbV9kZXNjciA9IChzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKilwaGJhLT5pbml0X21lbTsKKwltZW1fZGVzY3IgKz0gSFdJX01FTV9BU1lOQ19EQVRBX1JJTkc7CisJaWYgKG1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcykgeworCQlTRV9ERUJVRyhEQkdfTFZMXzgsCisJCQkgImh3aV9pbml0X2FzeW5jX3BkdV9jdHggSFdJX01FTV9BU1lOQ19EQVRBX1JJTkciCisJCQkgInZhPSVwIFxuIiwgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzKTsKKwl9IGVsc2UKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgICJObyBWaXJ0dWFsIGFkZHJlc3MgXG4iKTsKKworCXBhc3luY19jdHgtPmFzeW5jX2RhdGEucmluZ19iYXNlID0KKwkJCW1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzczsKKworCW1lbV9kZXNjciA9IChzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKilwaGJhLT5pbml0X21lbTsKKwltZW1fZGVzY3IgKz0gSFdJX01FTV9BU1lOQ19EQVRBX0hBTkRMRTsKKwlpZiAoIW1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzcykKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgIk5vIFZpcnR1YWwgYWRkcmVzcyBcbiIpOworCisJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5oYW5kbGVfYmFzZSA9CisJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CisJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS53cml0YWJsZXMgPSAwOworCUlOSVRfTElTVF9IRUFEKCZwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfbGlzdCk7CisKKwlwYXN5bmNfaGVhZGVyX2ggPQorCQkoc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKilwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuaGFuZGxlX2Jhc2U7CisJcGFzeW5jX2RhdGFfaCA9CisJCShzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqKXBhc3luY19jdHgtPmFzeW5jX2RhdGEuaGFuZGxlX2Jhc2U7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwLT5hc3luY3BkdXNfcGVyX2N0cmw7IGluZGV4KyspIHsKKwkJcGFzeW5jX2hlYWRlcl9oLT5jcmkgPSAtMTsKKwkJcGFzeW5jX2hlYWRlcl9oLT5pbmRleCA9IChjaGFyKWluZGV4OworCQlJTklUX0xJU1RfSEVBRCgmcGFzeW5jX2hlYWRlcl9oLT5saW5rKTsKKwkJcGFzeW5jX2hlYWRlcl9oLT5wYnVmZmVyID0KKwkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKQorCQkJKHBhc3luY19jdHgtPmFzeW5jX2hlYWRlci52YV9iYXNlKSArCisJCQkocC0+ZGVmcGR1X2hkcl9zeiAqIGluZGV4KSk7CisKKwkJcGFzeW5jX2hlYWRlcl9oLT5wYS51LmE2NC5hZGRyZXNzID0KKwkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5wYV9iYXNlLnUuYTY0LmFkZHJlc3MgKworCQkJKHAtPmRlZnBkdV9oZHJfc3ogKiBpbmRleCk7CisKKwkJbGlzdF9hZGRfdGFpbCgmcGFzeW5jX2hlYWRlcl9oLT5saW5rLAorCQkJCSZwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9saXN0KTsKKwkJcGFzeW5jX2hlYWRlcl9oKys7CisJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5mcmVlX2VudHJpZXMrKzsKKwkJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLndyaXRhYmxlcysrOworCisJCUlOSVRfTElTVF9IRUFEKCZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtpbmRleF0ud2FpdF9xdWV1ZS5saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2luZGV4XS4KKwkJCSAgICAgICBoZWFkZXJfYnVzeV9saXN0KTsKKwkJcGFzeW5jX2RhdGFfaC0+Y3JpID0gLTE7CisJCXBhc3luY19kYXRhX2gtPmluZGV4ID0gKGNoYXIpaW5kZXg7CisJCUlOSVRfTElTVF9IRUFEKCZwYXN5bmNfZGF0YV9oLT5saW5rKTsKKwkJcGFzeW5jX2RhdGFfaC0+cGJ1ZmZlciA9CisJCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykKKwkJCShwYXN5bmNfY3R4LT5hc3luY19kYXRhLnZhX2Jhc2UpICsKKwkJCShwLT5kZWZwZHVfZGF0YV9zeiAqIGluZGV4KSk7CisKKwkJcGFzeW5jX2RhdGFfaC0+cGEudS5hNjQuYWRkcmVzcyA9CisJCSAgICBwYXN5bmNfY3R4LT5hc3luY19kYXRhLnBhX2Jhc2UudS5hNjQuYWRkcmVzcyArCisJCSAgICAocC0+ZGVmcGR1X2RhdGFfc3ogKiBpbmRleCk7CisKKwkJbGlzdF9hZGRfdGFpbCgmcGFzeW5jX2RhdGFfaC0+bGluaywKKwkJCSAgICAgICZwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfbGlzdCk7CisJCXBhc3luY19kYXRhX2grKzsKKwkJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5mcmVlX2VudHJpZXMrKzsKKwkJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS53cml0YWJsZXMrKzsKKworCQlJTklUX0xJU1RfSEVBRCgmcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbaW5kZXhdLmRhdGFfYnVzeV9saXN0KTsKKwl9CisKKwlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuaG9zdF93cml0ZV9wdHIgPSAwOworCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5lcF9yZWFkX3B0ciA9IC0xOworCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuaG9zdF93cml0ZV9wdHIgPSAwOworCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuZXBfcmVhZF9wdHIgPSAtMTsKK30KKworc3RhdGljIGludAorYmVfc2dsX2NyZWF0ZV9jb250aWd1b3VzKHZvaWQgKnZpcnR1YWxfYWRkcmVzcywKKwkJCSB1NjQgcGh5c2ljYWxfYWRkcmVzcywgdTMyIGxlbmd0aCwKKwkJCSBzdHJ1Y3QgYmVfZG1hX21lbSAqc2dsKQoreworCVdBUk5fT04oIXZpcnR1YWxfYWRkcmVzcyk7CisJV0FSTl9PTighcGh5c2ljYWxfYWRkcmVzcyk7CisJV0FSTl9PTighbGVuZ3RoID4gMCk7CisJV0FSTl9PTighc2dsKTsKKworCXNnbC0+dmEgPSB2aXJ0dWFsX2FkZHJlc3M7CisJc2dsLT5kbWEgPSBwaHlzaWNhbF9hZGRyZXNzOworCXNnbC0+c2l6ZSA9IGxlbmd0aDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZV9zZ2xfZGVzdHJveV9jb250aWd1b3VzKHN0cnVjdCBiZV9kbWFfbWVtICpzZ2wpCit7CisJbWVtc2V0KHNnbCwgMCwgc2l6ZW9mKCpzZ2wpKTsKK30KKworc3RhdGljIHZvaWQKK2h3aV9idWlsZF9iZV9zZ2xfYXJyKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJICAgICBzdHJ1Y3QgbWVtX2FycmF5ICpwbWVtLCBzdHJ1Y3QgYmVfZG1hX21lbSAqc2dsKQoreworCWlmIChzZ2wtPnZhKQorCQliZV9zZ2xfZGVzdHJveV9jb250aWd1b3VzKHNnbCk7CisKKwliZV9zZ2xfY3JlYXRlX2NvbnRpZ3VvdXMocG1lbS0+dmlydHVhbF9hZGRyZXNzLAorCQkJCSBwbWVtLT5idXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzLAorCQkJCSBwbWVtLT5zaXplLCBzZ2wpOworfQorCitzdGF0aWMgdm9pZAoraHdpX2J1aWxkX2JlX3NnbF9ieV9vZmZzZXQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJICAgc3RydWN0IG1lbV9hcnJheSAqcG1lbSwgc3RydWN0IGJlX2RtYV9tZW0gKnNnbCkKK3sKKwlpZiAoc2dsLT52YSkKKwkJYmVfc2dsX2Rlc3Ryb3lfY29udGlndW91cyhzZ2wpOworCisJYmVfc2dsX2NyZWF0ZV9jb250aWd1b3VzKCh1bnNpZ25lZCBjaGFyICopcG1lbS0+dmlydHVhbF9hZGRyZXNzLAorCQkJCSBwbWVtLT5idXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzLAorCQkJCSBwbWVtLT5zaXplLCBzZ2wpOworfQorCitzdGF0aWMgaW50IGJlX2ZpbGxfcXVldWUoc3RydWN0IGJlX3F1ZXVlX2luZm8gKnEsCisJCXUxNiBsZW4sIHUxNiBlbnRyeV9zaXplLCB2b2lkICp2YWRkcmVzcykKK3sKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqbWVtID0gJnEtPmRtYV9tZW07CisKKwltZW1zZXQocSwgMCwgc2l6ZW9mKCpxKSk7CisJcS0+bGVuID0gbGVuOworCXEtPmVudHJ5X3NpemUgPSBlbnRyeV9zaXplOworCW1lbS0+c2l6ZSA9IGxlbiAqIGVudHJ5X3NpemU7CisJbWVtLT52YSA9IHZhZGRyZXNzOworCWlmICghbWVtLT52YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KG1lbS0+dmEsIDAsIG1lbS0+c2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmVpc2NzaV9jcmVhdGVfZXEoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJICAgICBzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQpCit7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgcmV0OworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcTsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqbWVtOworCXN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqbWVtX2Rlc2NyOworCXZvaWQgKmVxX3ZhZGRyZXNzOworCisJaWR4ID0gMDsKKwllcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxLnE7CisJbWVtID0gJmVxLT5kbWFfbWVtOworCW1lbV9kZXNjciA9IHBoYmEtPmluaXRfbWVtOworCW1lbV9kZXNjciArPSBIV0lfTUVNX0VROworCWVxX3ZhZGRyZXNzID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS52aXJ0dWFsX2FkZHJlc3M7CisKKwlyZXQgPSBiZV9maWxsX3F1ZXVlKGVxLCBwaGJhLT5wYXJhbXMubnVtX2VxX2VudHJpZXMsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBiZV9lcV9lbnRyeSksIGVxX3ZhZGRyZXNzKTsKKwlpZiAocmV0KSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkgICAgICJiZV9maWxsX3F1ZXVlIEZhaWxlZCBmb3IgRVEgXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltZW0tPmRtYSA9IG1lbV9kZXNjci0+bWVtX2FycmF5W2lkeF0uYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzczsKKworCXJldCA9IGJlaXNjc2lfY21kX2VxX2NyZWF0ZSgmcGhiYS0+Y3RybCwgZXEsCisJCQkJICAgIHBod2lfY29udGV4dC0+YmVfZXEuY3VyX2VxZCk7CisJaWYgKHJldCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LCAiYmVpc2NzaV9jbWRfZXFfY3JlYXRlIgorCQkJICAgICAiRmFpbGVkZm9yIEVRIFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCVNFX0RFQlVHKERCR19MVkxfOCwgImVxIGlkIGlzICVkXG4iLCBwaHdpX2NvbnRleHQtPmJlX2VxLnEuaWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJlaXNjc2lfY3JlYXRlX2NxKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJCSAgICAgc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0KQoreworCXVuc2lnbmVkIGludCBpZHg7CisJaW50IHJldDsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3EsICplcTsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqbWVtOworCXN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqbWVtX2Rlc2NyOworCXZvaWQgKmNxX3ZhZGRyZXNzOworCisJaWR4ID0gMDsKKwljcSA9ICZwaHdpX2NvbnRleHQtPmJlX2NxOworCWVxID0gJnBod2lfY29udGV4dC0+YmVfZXEucTsKKwltZW0gPSAmY3EtPmRtYV9tZW07CisJbWVtX2Rlc2NyID0gcGhiYS0+aW5pdF9tZW07CisJbWVtX2Rlc2NyICs9IEhXSV9NRU1fQ1E7CisJY3FfdmFkZHJlc3MgPSBtZW1fZGVzY3ItPm1lbV9hcnJheVtpZHhdLnZpcnR1YWxfYWRkcmVzczsKKwlyZXQgPSBiZV9maWxsX3F1ZXVlKGNxLCBwaGJhLT5wYXJhbXMuaWNkc19wZXJfY3RybCAvIDIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2xfY3FlKSwgY3FfdmFkZHJlc3MpOworCWlmIChyZXQpIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgImJlX2ZpbGxfcXVldWUgRmFpbGVkIGZvciBJU0NTSSBDUSBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1lbS0+ZG1hID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS5idXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzOworCXJldCA9IGJlaXNjc2lfY21kX2NxX2NyZWF0ZSgmcGhiYS0+Y3RybCwgY3EsIGVxLCBmYWxzZSwgZmFsc2UsIDApOworCWlmIChyZXQpIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgImJlaXNjc2lfY21kX2VxX2NyZWF0ZSBGYWlsZWQgZm9yIElTQ1NJIENRIFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCVNFX0RFQlVHKERCR19MVkxfOCwgImlzY3NpIGNxIGlkIGlzICVkXG4iLCBwaHdpX2NvbnRleHQtPmJlX2NxLmlkKTsKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJJU0NTSSBDUSBDUkVBVEVEXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmVpc2NzaV9jcmVhdGVfZGVmX2hkcihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCSAgICAgICBzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQsCisJCSAgICAgICBzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHIsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZGVmX3BkdV9yaW5nX3N6KQoreworCXVuc2lnbmVkIGludCBpZHg7CisJaW50IHJldDsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZHEsICpjcTsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqbWVtOworCXN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqbWVtX2Rlc2NyOworCXZvaWQgKmRxX3ZhZGRyZXNzOworCisJaWR4ID0gMDsKKwlkcSA9ICZwaHdpX2NvbnRleHQtPmJlX2RlZl9oZHJxOworCWNxID0gJnBod2lfY29udGV4dC0+YmVfY3E7CisJbWVtID0gJmRxLT5kbWFfbWVtOworCW1lbV9kZXNjciA9IHBoYmEtPmluaXRfbWVtOworCW1lbV9kZXNjciArPSBIV0lfTUVNX0FTWU5DX0hFQURFUl9SSU5HOworCWRxX3ZhZGRyZXNzID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS52aXJ0dWFsX2FkZHJlc3M7CisJcmV0ID0gYmVfZmlsbF9xdWV1ZShkcSwgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0uc2l6ZSAvCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBwaHlzX2FkZHIpLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcGh5c19hZGRyKSwgZHFfdmFkZHJlc3MpOworCWlmIChyZXQpIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgImJlX2ZpbGxfcXVldWUgRmFpbGVkIGZvciBERUYgUERVIEhEUlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCW1lbS0+ZG1hID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS5idXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzOworCXJldCA9IGJlX2NtZF9jcmVhdGVfZGVmYXVsdF9wZHVfcXVldWUoJnBoYmEtPmN0cmwsIGNxLCBkcSwKKwkJCQkJICAgICAgZGVmX3BkdV9yaW5nX3N6LAorCQkJCQkgICAgICBwaGJhLT5wYXJhbXMuZGVmcGR1X2hkcl9zeik7CisJaWYgKHJldCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJICAgICAiYmVfY21kX2NyZWF0ZV9kZWZhdWx0X3BkdV9xdWV1ZSBGYWlsZWQgREVGSERSXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcGh3aV9jdHJsci0+ZGVmYXVsdF9wZHVfaGRyLmlkID0gcGh3aV9jb250ZXh0LT5iZV9kZWZfaGRycS5pZDsKKwlTRV9ERUJVRyhEQkdfTFZMXzgsICJpc2NzaSBkZWYgcGR1IGlkIGlzICVkXG4iLAorCQkgcGh3aV9jb250ZXh0LT5iZV9kZWZfaGRycS5pZCk7CisJaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhwaGJhLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmVpc2NzaV9jcmVhdGVfZGVmX2RhdGEoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0LAorCQkJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyLAorCQkJdW5zaWduZWQgaW50IGRlZl9wZHVfcmluZ19zeikKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCByZXQ7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmRhdGFxLCAqY3E7CisJc3RydWN0IGJlX2RtYV9tZW0gKm1lbTsKKwlzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKm1lbV9kZXNjcjsKKwl2b2lkICpkcV92YWRkcmVzczsKKworCWlkeCA9IDA7CisJZGF0YXEgPSAmcGh3aV9jb250ZXh0LT5iZV9kZWZfZGF0YXE7CisJY3EgPSAmcGh3aV9jb250ZXh0LT5iZV9jcTsKKwltZW0gPSAmZGF0YXEtPmRtYV9tZW07CisJbWVtX2Rlc2NyID0gcGhiYS0+aW5pdF9tZW07CisJbWVtX2Rlc2NyICs9IEhXSV9NRU1fQVNZTkNfREFUQV9SSU5HOworCWRxX3ZhZGRyZXNzID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS52aXJ0dWFsX2FkZHJlc3M7CisJcmV0ID0gYmVfZmlsbF9xdWV1ZShkYXRhcSwgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0uc2l6ZSAvCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBwaHlzX2FkZHIpLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcGh5c19hZGRyKSwgZHFfdmFkZHJlc3MpOworCWlmIChyZXQpIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgImJlX2ZpbGxfcXVldWUgRmFpbGVkIGZvciBERUYgUERVIERBVEFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwltZW0tPmRtYSA9IG1lbV9kZXNjci0+bWVtX2FycmF5W2lkeF0uYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzczsKKwlyZXQgPSBiZV9jbWRfY3JlYXRlX2RlZmF1bHRfcGR1X3F1ZXVlKCZwaGJhLT5jdHJsLCBjcSwgZGF0YXEsCisJCQkJCSAgICAgIGRlZl9wZHVfcmluZ19zeiwKKwkJCQkJICAgICAgcGhiYS0+cGFyYW1zLmRlZnBkdV9kYXRhX3N6KTsKKwlpZiAocmV0KSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkgICAgICJiZV9jbWRfY3JlYXRlX2RlZmF1bHRfcGR1X3F1ZXVlIEZhaWxlZCIKKwkJCSAgICAgIiBmb3IgREVGIFBEVSBEQVRBXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcGh3aV9jdHJsci0+ZGVmYXVsdF9wZHVfZGF0YS5pZCA9IHBod2lfY29udGV4dC0+YmVfZGVmX2RhdGFxLmlkOworCVNFX0RFQlVHKERCR19MVkxfOCwgImlzY3NpIGRlZiBkYXRhIGlkIGlzICVkXG4iLAorCQkgcGh3aV9jb250ZXh0LT5iZV9kZWZfZGF0YXEuaWQpOworCWh3aV9wb3N0X2FzeW5jX2J1ZmZlcnMocGhiYSwgMCk7CisJU0VfREVCVUcoREJHX0xWTF84LCAiREVGQVVMVCBQRFUgREFUQSBSSU5HIENSRUFURUQgXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmVpc2NzaV9wb3N0X3BhZ2VzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKm1lbV9kZXNjcjsKKwlzdHJ1Y3QgbWVtX2FycmF5ICpwbV9hcnI7CisJdW5zaWduZWQgaW50IHBhZ2Vfb2Zmc2V0LCBpOworCXN0cnVjdCBiZV9kbWFfbWVtIHNnbDsKKwlpbnQgc3RhdHVzOworCisJbWVtX2Rlc2NyID0gcGhiYS0+aW5pdF9tZW07CisJbWVtX2Rlc2NyICs9IEhXSV9NRU1fU0dFOworCXBtX2FyciA9IG1lbV9kZXNjci0+bWVtX2FycmF5OworCisJcGFnZV9vZmZzZXQgPSAoc2l6ZW9mKHN0cnVjdCBpc2NzaV9zZ2UpICogcGhiYS0+cGFyYW1zLm51bV9zZ2VfcGVyX2lvICoKKwkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9pY2Rfc3RhcnQpIC8gUEFHRV9TSVpFOworCWZvciAoaSA9IDA7IGkgPCBtZW1fZGVzY3ItPm51bV9lbGVtZW50czsgaSsrKSB7CisJCWh3aV9idWlsZF9iZV9zZ2xfYXJyKHBoYmEsIHBtX2FyciwgJnNnbCk7CisJCXN0YXR1cyA9IGJlX2NtZF9pc2NzaV9wb3N0X3NnbF9wYWdlcygmcGhiYS0+Y3RybCwgJnNnbCwKKwkJCQkJCXBhZ2Vfb2Zmc2V0LAorCQkJCQkJKHBtX2Fyci0+c2l6ZSAvIFBBR0VfU0laRSkpOworCQlwYWdlX29mZnNldCArPSBwbV9hcnItPnNpemUgLyBQQUdFX1NJWkU7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCQkgICAgICJwb3N0IHNnbCBmYWlsZWQuXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJcG1fYXJyKys7CisJfQorCVNFX0RFQlVHKERCR19MVkxfOCwgIlBPU1RFRCBQQUdFUyBcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitiZWlzY3NpX2NyZWF0ZV93cmJfcmluZ3Moc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJIHN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dCwKKwkJCSBzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHIpCit7CisJdW5zaWduZWQgaW50IHdyYl9tZW1faW5kZXgsIG9mZnNldCwgc2l6ZSwgbnVtX3dyYl9yaW5nczsKKwl1NjQgcGFfYWRkcl9sbzsKKwl1bnNpZ25lZCBpbnQgaWR4LCBudW0sIGk7CisJc3RydWN0IG1lbV9hcnJheSAqcHdyYl9hcnI7CisJdm9pZCAqd3JiX3ZhZGRyOworCXN0cnVjdCBiZV9kbWFfbWVtIHNnbDsKKwlzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKm1lbV9kZXNjcjsKKwlpbnQgc3RhdHVzOworCisJaWR4ID0gMDsKKwltZW1fZGVzY3IgPSBwaGJhLT5pbml0X21lbTsKKwltZW1fZGVzY3IgKz0gSFdJX01FTV9XUkI7CisJcHdyYl9hcnIgPSBrbWFsbG9jKHNpemVvZigqcHdyYl9hcnIpICogcGhiYS0+cGFyYW1zLmN4bnNfcGVyX2N0cmwsCisJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXB3cmJfYXJyKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkgICAgICJNZW1vcnkgYWxsb2MgZmFpbGVkIGluIGNyZWF0ZSB3cmIgcmluZy5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJd3JiX3ZhZGRyID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS52aXJ0dWFsX2FkZHJlc3M7CisJcGFfYWRkcl9sbyA9IG1lbV9kZXNjci0+bWVtX2FycmF5W2lkeF0uYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzczsKKwludW1fd3JiX3JpbmdzID0gbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaWR4XS5zaXplIC8KKwkJKHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4gKiBzaXplb2Yoc3RydWN0IGlzY3NpX3dyYikpOworCisJZm9yIChudW0gPSAwOyBudW0gPCBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybDsgbnVtKyspIHsKKwkJaWYgKG51bV93cmJfcmluZ3MpIHsKKwkJCXB3cmJfYXJyW251bV0udmlydHVhbF9hZGRyZXNzID0gd3JiX3ZhZGRyOworCQkJcHdyYl9hcnJbbnVtXS5idXNfYWRkcmVzcy51LmE2NC5hZGRyZXNzCT0gcGFfYWRkcl9sbzsKKwkJCXB3cmJfYXJyW251bV0uc2l6ZSA9IHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4gKgorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpc2NzaV93cmIpOworCQkJd3JiX3ZhZGRyICs9IHB3cmJfYXJyW251bV0uc2l6ZTsKKwkJCXBhX2FkZHJfbG8gKz0gcHdyYl9hcnJbbnVtXS5zaXplOworCQkJbnVtX3dyYl9yaW5ncy0tOworCQl9IGVsc2UgeworCQkJaWR4Kys7CisJCQl3cmJfdmFkZHIgPSBtZW1fZGVzY3ItPm1lbV9hcnJheVtpZHhdLnZpcnR1YWxfYWRkcmVzczsKKwkJCXBhX2FkZHJfbG8gPSBtZW1fZGVzY3ItPm1lbV9hcnJheVtpZHhdLlwKKwkJCQkJYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzczsKKwkJCW51bV93cmJfcmluZ3MgPSBtZW1fZGVzY3ItPm1lbV9hcnJheVtpZHhdLnNpemUgLworCQkJCQkocGhiYS0+cGFyYW1zLndyYnNfcGVyX2N4biAqCisJCQkJCXNpemVvZihzdHJ1Y3QgaXNjc2lfd3JiKSk7CisJCQlwd3JiX2FycltudW1dLnZpcnR1YWxfYWRkcmVzcyA9IHdyYl92YWRkcjsKKwkJCXB3cmJfYXJyW251bV0uYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzc1wKKwkJCQkJCT0gcGFfYWRkcl9sbzsKKwkJCXB3cmJfYXJyW251bV0uc2l6ZSA9IHBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4gKgorCQkJCQkJIHNpemVvZihzdHJ1Y3QgaXNjc2lfd3JiKTsKKwkJCXdyYl92YWRkciArPSBwd3JiX2FycltudW1dLnNpemU7CisJCQlwYV9hZGRyX2xvICAgKz0gcHdyYl9hcnJbbnVtXS5zaXplOworCQkJbnVtX3dyYl9yaW5ncy0tOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybDsgaSsrKSB7CisJCXdyYl9tZW1faW5kZXggPSAwOworCQlvZmZzZXQgPSAwOworCQlzaXplID0gMDsKKworCQlod2lfYnVpbGRfYmVfc2dsX2J5X29mZnNldChwaGJhLCAmcHdyYl9hcnJbaV0sICZzZ2wpOworCQlzdGF0dXMgPSBiZV9jbWRfd3JicV9jcmVhdGUoJnBoYmEtPmN0cmwsICZzZ2wsCisJCQkJCSAgICAmcGh3aV9jb250ZXh0LT5iZV93cmJxW2ldKTsKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJCSAgICAgIndyYnEgY3JlYXRlIGZhaWxlZC4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJcGh3aV9jdHJsci0+d3JiX2NvbnRleHRbaV0uY2lkID0gcGh3aV9jb250ZXh0LT5iZV93cmJxW2ldLmlkOworCX0KKwlrZnJlZShwd3JiX2Fycik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfd3JiX2hhbmRsZXMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXVuc2lnbmVkIGludCBpbmRleDsKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV93cmJfY29udGV4dCAqcHdyYl9jb250ZXh0OworCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGhiYS0+cGFyYW1zLmN4bnNfcGVyX2N0cmwgKiAyOyBpbmRleCArPSAyKSB7CisJCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT53cmJfY29udGV4dFtpbmRleF07CisJCWtmcmVlKHB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZSk7CisJCWtmcmVlKHB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZXN0ZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBod2lfY2xlYW51cChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnE7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CisJaW50IGk7CisKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKwlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CisJZm9yIChpID0gMDsgaSA8IHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsOyBpKyspIHsKKwkJcSA9ICZwaHdpX2NvbnRleHQtPmJlX3dyYnFbaV07CisJCWlmIChxLT5jcmVhdGVkKQorCQkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIHEsIFFUWVBFX1dSQlEpOworCX0KKworCWZyZWVfd3JiX2hhbmRsZXMocGhiYSk7CisKKwlxID0gJnBod2lfY29udGV4dC0+YmVfZGVmX2hkcnE7CisJaWYgKHEtPmNyZWF0ZWQpCisJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9EUERVUSk7CisKKwlxID0gJnBod2lfY29udGV4dC0+YmVfZGVmX2RhdGFxOworCWlmIChxLT5jcmVhdGVkKQorCQliZWlzY3NpX2NtZF9xX2Rlc3Ryb3koY3RybCwgcSwgUVRZUEVfRFBEVVEpOworCisJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIE5VTEwsIFFUWVBFX1NHTCk7CisKKwlxID0gJnBod2lfY29udGV4dC0+YmVfY3E7CisJaWYgKHEtPmNyZWF0ZWQpCisJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9DUSk7CisKKwlxID0gJnBod2lfY29udGV4dC0+YmVfZXEucTsKKwlpZiAocS0+Y3JlYXRlZCkKKwkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIHEsIFFUWVBFX0VRKTsKK30KKworc3RhdGljIGludCBod2lfaW5pdF9wb3J0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OworCXVuc2lnbmVkIGludCBkZWZfcGR1X3Jpbmdfc3o7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCWludCBzdGF0dXM7CisKKwlkZWZfcGR1X3Jpbmdfc3ogPQorCQlwaGJhLT5wYXJhbXMuYXN5bmNwZHVzX3Blcl9jdHJsICogc2l6ZW9mKHN0cnVjdCBwaHlzX2FkZHIpOworCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCisJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OworCXBod2lfY29udGV4dC0+YmVfZXEubWF4X2VxZCA9IDA7CisJcGh3aV9jb250ZXh0LT5iZV9lcS5taW5fZXFkID0gMDsKKwlwaHdpX2NvbnRleHQtPmJlX2VxLmN1cl9lcWQgPSA2NDsKKwlwaHdpX2NvbnRleHQtPmJlX2VxLmVuYWJsZV9haWMgPSBmYWxzZTsKKwliZV9jbWRfZndfaW5pdGlhbGl6ZSgmcGhiYS0+Y3RybCk7CisJc3RhdHVzID0gYmVpc2NzaV9jcmVhdGVfZXEocGhiYSwgcGh3aV9jb250ZXh0KTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgIkVRIG5vdCBjcmVhdGVkIFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3RhdHVzID0gbWdtdF9jaGVja19zdXBwb3J0ZWRfZncoY3RybCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkgICAgICJVbnN1cHBvcnRlZCBmdyB2ZXJzaW9uIFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3RhdHVzID0gbWdtdF9nZXRfZndfY29uZmlnKGN0cmwsIHBoYmEpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJICAgICAiRXJyb3IgZ2V0dGluZyBmdyBjb25maWdcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXN0YXR1cyA9IGJlaXNjc2lfY3JlYXRlX2NxKHBoYmEsIHBod2lfY29udGV4dCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJDUSBub3QgY3JlYXRlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3RhdHVzID0gYmVpc2NzaV9jcmVhdGVfZGVmX2hkcihwaGJhLCBwaHdpX2NvbnRleHQsIHBod2lfY3RybHIsCisJCQkJCWRlZl9wZHVfcmluZ19zeik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkgICAgICJEZWZhdWx0IEhlYWRlciBub3QgY3JlYXRlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3RhdHVzID0gYmVpc2NzaV9jcmVhdGVfZGVmX2RhdGEocGhiYSwgcGh3aV9jb250ZXh0LAorCQkJCQkgcGh3aV9jdHJsciwgZGVmX3BkdV9yaW5nX3N6KTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgIkRlZmF1bHQgRGF0YSBub3QgY3JlYXRlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3RhdHVzID0gYmVpc2NzaV9wb3N0X3BhZ2VzKHBoYmEpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LCAiUG9zdCBTR0wgUGFnZXMgRmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzdGF0dXMgPSBiZWlzY3NpX2NyZWF0ZV93cmJfcmluZ3MocGhiYSwJcGh3aV9jb250ZXh0LCBwaHdpX2N0cmxyKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgIldSQiBSaW5ncyBub3QgY3JlYXRlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJU0VfREVCVUcoREJHX0xWTF84LCAiaHdpX2luaXRfcG9ydCBzdWNjZXNzXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImh3aV9pbml0X3BvcnQgZmFpbGVkIik7CisJaHdpX2NsZWFudXAocGhiYSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKworc3RhdGljIGludCBod2lfaW5pdF9jb250cm9sbGVyKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKwlpZiAoMSA9PSBwaGJhLT5pbml0X21lbVtIV0lfTUVNX0FERE5fQ09OVEVYVF0ubnVtX2VsZW1lbnRzKSB7CisJCXBod2lfY3RybHItPnBod2lfY3R4dCA9IChzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICopcGhiYS0+CisJCSAgICBpbml0X21lbVtIV0lfTUVNX0FERE5fQ09OVEVYVF0ubWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzczsKKwkJU0VfREVCVUcoREJHX0xWTF84LCAiIHBod2lfY3RybHItPnBod2lfY3R4dD0lcCBcbiIsCisJCQkgcGh3aV9jdHJsci0+cGh3aV9jdHh0KTsKKwl9IGVsc2UgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJICAgICAiSFdJX01FTV9BREROX0NPTlRFWFQgaXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LiIKKwkJCSAgICAgIkZhaWxpbmcgdG8gbG9hZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlzY3NpX2luaXRfZ2xvYmFsX3RlbXBsYXRlcyhwaGJhKTsKKwliZWlzY3NpX2luaXRfd3JiX2hhbmRsZShwaGJhKTsKKwlod2lfaW5pdF9hc3luY19wZHVfY3R4KHBoYmEpOworCWlmIChod2lfaW5pdF9wb3J0KHBoYmEpICE9IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgImh3aV9pbml0X2NvbnRyb2xsZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX2ZyZWVfbWVtKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKm1lbV9kZXNjcjsKKwlpbnQgaSwgajsKKworCW1lbV9kZXNjciA9IHBoYmEtPmluaXRfbWVtOworCWkgPSAwOworCWogPSAwOworCWZvciAoaSA9IDA7IGkgPCBTRV9NRU1fTUFYOyBpKyspIHsKKwkJZm9yIChqID0gbWVtX2Rlc2NyLT5udW1fZWxlbWVudHM7IGogPiAwOyBqLS0pIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LAorCQkJICBtZW1fZGVzY3ItPm1lbV9hcnJheVtqIC0gMV0uc2l6ZSwKKwkJCSAgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaiAtIDFdLnZpcnR1YWxfYWRkcmVzcywKKwkJCSAgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbaiAtIDFdLmJ1c19hZGRyZXNzLgorCQkJCXUuYTY0LmFkZHJlc3MpOworCQl9CisJCWtmcmVlKG1lbV9kZXNjci0+bWVtX2FycmF5KTsKKwkJbWVtX2Rlc2NyKys7CisJfQorCWtmcmVlKHBoYmEtPmluaXRfbWVtKTsKKwlrZnJlZShwaGJhLT5waHdpX2N0cmxyKTsKK30KKworc3RhdGljIGludCBiZWlzY3NpX2luaXRfY29udHJvbGxlcihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlyZXQgPSBiZWlzY3NpX2dldF9tZW1vcnkocGhiYSk7CisJaWYgKHJldCA8IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImJlaXNjc2lfZGV2X3Byb2JlIC0iCisJCQkgICAgICJGYWlsZWQgaW4gYmVpc2NzaV9hbGxvY19tZW1vcnkgXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBod2lfaW5pdF9jb250cm9sbGVyKHBoYmEpOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9pbml0OworCVNFX0RFQlVHKERCR19MVkxfOCwgIlJldHVybiBzdWNjZXNzIGZyb20gYmVpc2NzaV9pbml0X2NvbnRyb2xsZXIiKTsKKwlyZXR1cm4gMDsKKworZnJlZV9pbml0OgorCWJlaXNjc2lfZnJlZV9tZW0ocGhiYSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgYmVpc2NzaV9pbml0X3NnbF9oYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqbWVtX2Rlc2NyX3NnbGgsICptZW1fZGVzY3Jfc2c7CisJc3RydWN0IHNnbF9oYW5kbGUgKnBzZ2xfaGFuZGxlOworCXN0cnVjdCBpc2NzaV9zZ2UgKnBmcmFnOworCXVuc2lnbmVkIGludCBhcnJfaW5kZXgsIGksIGlkeDsKKworCXBoYmEtPmlvX3NnbF9obmRsX2F2YmwgPSAwOworCXBoYmEtPmVoX3NnbF9obmRsX2F2YmwgPSAwOworCW1lbV9kZXNjcl9zZ2xoID0gcGhiYS0+aW5pdF9tZW07CisJbWVtX2Rlc2NyX3NnbGggKz0gSFdJX01FTV9TR0xIOworCWlmICgxID09IG1lbV9kZXNjcl9zZ2xoLT5udW1fZWxlbWVudHMpIHsKKwkJcGhiYS0+aW9fc2dsX2huZGxfYmFzZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ2xfaGFuZGxlICopICoKKwkJCQkJCSBwaGJhLT5wYXJhbXMuaW9zX3Blcl9jdHJsLAorCQkJCQkJIEdGUF9LRVJORUwpOworCQlpZiAoIXBoYmEtPmlvX3NnbF9obmRsX2Jhc2UpIHsKKwkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkJICAgICAiTWVtIEFsbG9jIEZhaWxlZC4gRmFpbGluZyB0byBsb2FkXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXBoYmEtPmVoX3NnbF9obmRsX2Jhc2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2dsX2hhbmRsZSAqKSAqCisJCQkJCQkgKHBoYmEtPnBhcmFtcy5pY2RzX3Blcl9jdHJsIC0KKwkJCQkJCSBwaGJhLT5wYXJhbXMuaW9zX3Blcl9jdHJsKSwKKwkJCQkJCSBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwaGJhLT5laF9zZ2xfaG5kbF9iYXNlKSB7CisJCQlrZnJlZShwaGJhLT5pb19zZ2xfaG5kbF9iYXNlKTsKKwkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkJICAgICAiTWVtIEFsbG9jIEZhaWxlZC4gRmFpbGluZyB0byBsb2FkXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKKwkJCSAgICAgIkhXSV9NRU1fU0dMSCBpcyBtb3JlIHRoYW4gb25lIGVsZW1lbnQuIgorCQkJICAgICAiRmFpbGluZyB0byBsb2FkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXJyX2luZGV4ID0gMDsKKwlpZHggPSAwOworCXdoaWxlIChpZHggPCBtZW1fZGVzY3Jfc2dsaC0+bnVtX2VsZW1lbnRzKSB7CisJCXBzZ2xfaGFuZGxlID0gbWVtX2Rlc2NyX3NnbGgtPm1lbV9hcnJheVtpZHhdLnZpcnR1YWxfYWRkcmVzczsKKworCQlmb3IgKGkgPSAwOyBpIDwgKG1lbV9kZXNjcl9zZ2xoLT5tZW1fYXJyYXlbaWR4XS5zaXplIC8KKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBzZ2xfaGFuZGxlKSk7IGkrKykgeworCQkJaWYgKGFycl9pbmRleCA8IHBoYmEtPnBhcmFtcy5pb3NfcGVyX2N0cmwpIHsKKwkJCQlwaGJhLT5pb19zZ2xfaG5kbF9iYXNlW2Fycl9pbmRleF0gPSBwc2dsX2hhbmRsZTsKKwkJCQlwaGJhLT5pb19zZ2xfaG5kbF9hdmJsKys7CisJCQkJYXJyX2luZGV4Kys7CisJCQl9IGVsc2UgeworCQkJCXBoYmEtPmVoX3NnbF9obmRsX2Jhc2VbYXJyX2luZGV4IC0KKwkJCQkJcGhiYS0+cGFyYW1zLmlvc19wZXJfY3RybF0gPQorCQkJCQkJCQlwc2dsX2hhbmRsZTsKKwkJCQlhcnJfaW5kZXgrKzsKKwkJCQlwaGJhLT5laF9zZ2xfaG5kbF9hdmJsKys7CisJCQl9CisJCQlwc2dsX2hhbmRsZSsrOworCQl9CisJCWlkeCsrOworCX0KKwlTRV9ERUJVRyhEQkdfTFZMXzgsCisJCSAicGhiYS0+aW9fc2dsX2huZGxfYXZibD0lZCIKKwkJICJwaGJhLT5laF9zZ2xfaG5kbF9hdmJsPSVkIFxuIiwKKwkJIHBoYmEtPmlvX3NnbF9obmRsX2F2YmwsCisJCSBwaGJhLT5laF9zZ2xfaG5kbF9hdmJsKTsKKwltZW1fZGVzY3Jfc2cgPSBwaGJhLT5pbml0X21lbTsKKwltZW1fZGVzY3Jfc2cgKz0gSFdJX01FTV9TR0U7CisJU0VfREVCVUcoREJHX0xWTF84LCAiXG4gbWVtX2Rlc2NyX3NnLT5udW1fZWxlbWVudHM9JWQgXG4iLAorCQkgbWVtX2Rlc2NyX3NnLT5udW1fZWxlbWVudHMpOworCWFycl9pbmRleCA9IDA7CisJaWR4ID0gMDsKKwl3aGlsZSAoaWR4IDwgbWVtX2Rlc2NyX3NnLT5udW1fZWxlbWVudHMpIHsKKwkJcGZyYWcgPSBtZW1fZGVzY3Jfc2ctPm1lbV9hcnJheVtpZHhdLnZpcnR1YWxfYWRkcmVzczsKKworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPCAobWVtX2Rlc2NyX3NnLT5tZW1fYXJyYXlbaWR4XS5zaXplKSAvCisJCSAgICAgKHNpemVvZihzdHJ1Y3QgaXNjc2lfc2dlKSAqIHBoYmEtPnBhcmFtcy5udW1fc2dlX3Blcl9pbyk7CisJCSAgICAgaSsrKSB7CisJCQlpZiAoYXJyX2luZGV4IDwgcGhiYS0+cGFyYW1zLmlvc19wZXJfY3RybCkKKwkJCQlwc2dsX2hhbmRsZSA9IHBoYmEtPmlvX3NnbF9obmRsX2Jhc2VbYXJyX2luZGV4XTsKKwkJCWVsc2UKKwkJCQlwc2dsX2hhbmRsZSA9IHBoYmEtPmVoX3NnbF9obmRsX2Jhc2VbYXJyX2luZGV4IC0KKwkJCQkJCXBoYmEtPnBhcmFtcy5pb3NfcGVyX2N0cmxdOworCQkJcHNnbF9oYW5kbGUtPnBmcmFnID0gcGZyYWc7CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3NnZSwgYWRkcl9oaSwgcGZyYWcsIDApOworCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV9zZ2UsIGFkZHJfbG8sIHBmcmFnLCAwKTsKKwkJCXBmcmFnICs9IHBoYmEtPnBhcmFtcy5udW1fc2dlX3Blcl9pbzsKKwkJCXBzZ2xfaGFuZGxlLT5zZ2xfaW5kZXggPQorCQkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9jaWRfc3RhcnQgKyBhcnJfaW5kZXgrKzsKKwkJfQorCQlpZHgrKzsKKwl9CisJcGhiYS0+aW9fc2dsX2ZyZWVfaW5kZXggPSAwOworCXBoYmEtPmlvX3NnbF9hbGxvY19pbmRleCA9IDA7CisJcGhiYS0+ZWhfc2dsX2ZyZWVfaW5kZXggPSAwOworCXBoYmEtPmVoX3NnbF9hbGxvY19pbmRleCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGJhX3NldHVwX2NpZF90YmxzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlpbnQgaSwgbmV3X2NpZDsKKworCXBoYmEtPmNpZF9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHZvaWQgKikgKiBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybCwKKwkJCQkgIEdGUF9LRVJORUwpOworCWlmICghcGhiYS0+Y2lkX2FycmF5KSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCisJCQkgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGluICIKKwkJCSAgICAgImhiYV9zZXR1cF9jaWRfdGJsc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwaGJhLT5lcF9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqKSAqCisJCQkJIHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsICogMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaGJhLT5lcF9hcnJheSkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiAiCisJCQkgICAgICJoYmFfc2V0dXBfY2lkX3RibHMgXG4iKTsKKwkJa2ZyZWUocGhiYS0+Y2lkX2FycmF5KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5ld19jaWQgPSBwaGJhLT5md19jb25maWcuaXNjc2lfaWNkX3N0YXJ0OworCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybDsgaSsrKSB7CisJCXBoYmEtPmNpZF9hcnJheVtpXSA9IG5ld19jaWQ7CisJCW5ld19jaWQgKz0gMjsKKwl9CisJcGhiYS0+YXZsYmxfY2lkcyA9IHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBod2lfZW5hYmxlX2ludHIoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcTsKKwl1OCBfX2lvbWVtICphZGRyOworCXUzMiByZWc7CisJdTMyIGVuYWJsZWQ7CisKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKwlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CisKKwllcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxLnE7CisJYWRkciA9ICh1OCBfX2lvbWVtICopICgodTggX19pb21lbSAqKSBjdHJsLT5wY2ljZmcgKworCQkJUENJQ0ZHX01FTUJBUl9DVFJMX0lOVF9DVFJMX09GRlNFVCk7CisJcmVnID0gaW9yZWFkMzIoYWRkcik7CisJU0VfREVCVUcoREJHX0xWTF84LCAicmVnID14JTA4eCBcbiIsIHJlZyk7CisKKwllbmFibGVkID0gcmVnICYgTUVNQkFSX0NUUkxfSU5UX0NUUkxfSE9TVElOVFJfTUFTSzsKKwlpZiAoIWVuYWJsZWQpIHsKKwkJcmVnIHw9IE1FTUJBUl9DVFJMX0lOVF9DVFJMX0hPU1RJTlRSX01BU0s7CisJCVNFX0RFQlVHKERCR19MVkxfOCwgInJlZyA9eCUwOHggYWRkcj0lcCBcbiIsIHJlZywgYWRkcik7CisJCWlvd3JpdGUzMihyZWcsIGFkZHIpOworCQlTRV9ERUJVRyhEQkdfTFZMXzgsICJlcS0+aWQ9JWQgXG4iLCBlcS0+aWQpOworCisJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwgMCwgMSwgMSk7CisJfSBlbHNlCisJCXNob3N0X3ByaW50ayhLRVJOX1dBUk5JTkcsIHBoYmEtPnNob3N0LAorCQkJICAgICAiSW4gaHdpX2VuYWJsZV9pbnRyLCBOb3QgRW5hYmxlZCBcbiIpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBod2lfZGlzYWJsZV9pbnRyKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisKKwl1OCBfX2lvbWVtICphZGRyID0gY3RybC0+cGNpY2ZnICsgUENJQ0ZHX01FTUJBUl9DVFJMX0lOVF9DVFJMX09GRlNFVDsKKwl1MzIgcmVnID0gaW9yZWFkMzIoYWRkcik7CisKKwl1MzIgZW5hYmxlZCA9IHJlZyAmIE1FTUJBUl9DVFJMX0lOVF9DVFJMX0hPU1RJTlRSX01BU0s7CisJaWYgKGVuYWJsZWQpIHsKKwkJcmVnICY9IH5NRU1CQVJfQ1RSTF9JTlRfQ1RSTF9IT1NUSU5UUl9NQVNLOworCQlpb3dyaXRlMzIocmVnLCBhZGRyKTsKKwl9IGVsc2UKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgICJJbiBod2lfZGlzYWJsZV9pbnRyLCBBbHJlYWR5IERpc2FibGVkIFxuIik7Cit9CisKK3N0YXRpYyBpbnQgYmVpc2NzaV9pbml0X3BvcnQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCWludCByZXQ7CisKKwlyZXQgPSBiZWlzY3NpX2luaXRfY29udHJvbGxlcihwaGJhKTsKKwlpZiAocmV0IDwgMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJICAgICAiYmVpc2NzaV9kZXZfcHJvYmUgLSBGYWlsZWQgaW4iCisJCQkgICAgICJiZWlzY3NpX2luaXRfY29udHJvbGxlciBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBiZWlzY3NpX2luaXRfc2dsX2hhbmRsZShwaGJhKTsKKwlpZiAocmV0IDwgMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJICAgICAiYmVpc2NzaV9kZXZfcHJvYmUgLSBGYWlsZWQgaW4iCisJCQkgICAgICJiZWlzY3NpX2luaXRfc2dsX2hhbmRsZSBcbiIpOworCQlnb3RvIGRvX2NsZWFudXBfY3RybHI7CisJfQorCisJaWYgKGhiYV9zZXR1cF9jaWRfdGJscyhwaGJhKSkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAorCQkJICAgICAiRmFpbGVkIGluIGhiYV9zZXR1cF9jaWRfdGJsc1xuIik7CisJCWtmcmVlKHBoYmEtPmlvX3NnbF9obmRsX2Jhc2UpOworCQlrZnJlZShwaGJhLT5laF9zZ2xfaG5kbF9iYXNlKTsKKwkJZ290byBkb19jbGVhbnVwX2N0cmxyOworCX0KKworCXJldHVybiByZXQ7CisKK2RvX2NsZWFudXBfY3RybHI6CisJaHdpX2NsZWFudXAocGhiYSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaHdpX3B1cmdlX2VxKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcTsKKwlzdHJ1Y3QgYmVfZXFfZW50cnkgKmVxZSA9IE5VTEw7CisKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKwlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CisJZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcS5xOworCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisKKwl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdCisJCQkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkLCBlcWUsIDApOworCQlxdWV1ZV90YWlsX2luYyhlcSk7CisJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX2NsZWFuX3BvcnQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXVuc2lnbmVkIGNoYXIgbWdtdF9zdGF0dXM7CisKKwltZ210X3N0YXR1cyA9IG1nbXRfZXBmd19jbGVhbnVwKHBoYmEsIENNRF9DT05ORUNUSU9OX0NIVVRFXzApOworCWlmIChtZ210X3N0YXR1cykKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgICJtZ210X2VwZndfY2xlYW51cCBGQUlMRUQgXG4iKTsKKwlod2lfY2xlYW51cChwaGJhKTsKKwlod2lfcHVyZ2VfZXEocGhiYSk7CisJa2ZyZWUocGhiYS0+aW9fc2dsX2huZGxfYmFzZSk7CisJa2ZyZWUocGhiYS0+ZWhfc2dsX2huZGxfYmFzZSk7CisJa2ZyZWUocGhiYS0+Y2lkX2FycmF5KTsKKwlrZnJlZShwaGJhLT5lcF9hcnJheSk7Cit9CisKK3ZvaWQKK2JlaXNjc2lfb2ZmbG9hZF9jb25uZWN0aW9uKHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKKwkJCSAgIHN0cnVjdCBiZWlzY3NpX29mZmxvYWRfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHdyYl9oYW5kbGUgKnB3cmJfaGFuZGxlOworCXN0cnVjdCBpc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiICpwd3JiID0gTlVMTDsKKwlzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKm1lbV9kZXNjcjsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBiZWlzY3NpX2Nvbm4tPnBoYmE7CisJdTMyIGRvb3JiZWxsID0gMDsKKworCS8qCisJICogV2UgY2FuIGFsd2F5cyB1c2UgMCBoZXJlIGJlY2F1c2UgaXQgaXMgcmVzZXJ2ZWQgYnkgbGliaXNjc2kgZm9yCisJICogbG9naW4vc3RhcnR1cCByZWxhdGVkIHRhc2tzLgorCSAqLworCXB3cmJfaGFuZGxlID0gYWxsb2Nfd3JiX2hhbmRsZShwaGJhLCBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQsIDApOworCXB3cmIgPSAoc3RydWN0IGlzY3NpX3RhcmdldF9jb250ZXh0X3VwZGF0ZV93cmIgKilwd3JiX2hhbmRsZS0+cHdyYjsKKwltZW1zZXQocHdyYiwgMCwgc2l6ZW9mKCpwd3JiKSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiLAorCQkgICAgICBtYXhfYnVyc3RfbGVuZ3RoLCBwd3JiLCBwYXJhbXMtPmR3W29mZnNldG9mCisJCSAgICAgIChzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLAorCQkgICAgICBtYXhfYnVyc3RfbGVuZ3RoKSAvIDMyXSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiLAorCQkgICAgICBtYXhfc2VuZF9kYXRhX3NlZ21lbnRfbGVuZ3RoLCBwd3JiLAorCQkgICAgICBwYXJhbXMtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2JlaXNjc2lfb2ZmbG9hZF9wYXJhbXMsCisJCSAgICAgIG1heF9zZW5kX2RhdGFfc2VnbWVudF9sZW5ndGgpIC8gMzJdKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3RhcmdldF9jb250ZXh0X3VwZGF0ZV93cmIsCisJCSAgICAgIGZpcnN0X2J1cnN0X2xlbmd0aCwKKwkJICAgICAgcHdyYiwKKwkJICAgICAgcGFyYW1zLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLAorCQkgICAgICBmaXJzdF9idXJzdF9sZW5ndGgpIC8gMzJdKTsKKworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwgZXJsLCBwd3JiLAorCQkgICAgICAocGFyYW1zLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLAorCQkgICAgICBlcmwpIC8gMzJdICYgT0ZGTERfUEFSQU1TX0VSTCkpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwgZGRlLCBwd3JiLAorCQkgICAgICAocGFyYW1zLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLAorCQkgICAgICBkZGUpIC8gMzJdICYgT0ZGTERfUEFSQU1TX0RERSkgPj4gMik7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiLCBoZGUsIHB3cmIsCisJCSAgICAgIChwYXJhbXMtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2JlaXNjc2lfb2ZmbG9hZF9wYXJhbXMsCisJCSAgICAgIGhkZSkgLyAzMl0gJiBPRkZMRF9QQVJBTVNfSERFKSA+PiAzKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3RhcmdldF9jb250ZXh0X3VwZGF0ZV93cmIsIGlyMnQsIHB3cmIsCisJCSAgICAgIChwYXJhbXMtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2JlaXNjc2lfb2ZmbG9hZF9wYXJhbXMsCisJCSAgICAgIGlyMnQpIC8gMzJdICYgT0ZGTERfUEFSQU1TX0lSMlQpID4+IDQpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwgaW1kLCBwd3JiLAorCQkgICAgICAocGFyYW1zLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zLAorCQkgICAgICAgaW1kKSAvIDMyXSAmIE9GRkxEX1BBUkFNU19JTUQpID4+IDUpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwgc3RhdF9zbiwKKwkJICAgICAgcHdyYiwKKwkJICAgICAgKHBhcmFtcy0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfYmVpc2NzaV9vZmZsb2FkX3BhcmFtcywKKwkJICAgICAgZXhwX3N0YXRzbikgLyAzMl0gKyAxKSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiLCB0eXBlLCBwd3JiLAorCQkgICAgICAweDcpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwgd3JiX2lkeCwKKwkJICAgICAgcHdyYiwgcHdyYl9oYW5kbGUtPndyYl9pbmRleCk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiLCBwdHIybmV4dHdyYiwKKwkJICAgICAgcHdyYiwgcHdyYl9oYW5kbGUtPm54dF93cmJfaW5kZXgpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwKKwkJCXNlc3Npb25fc3RhdGUsIHB3cmIsIDApOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwgY29tcGx0b25hY2ssCisJCSAgICAgIHB3cmIsIDEpOworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwgbm90cHJlZGJscSwKKwkJICAgICAgcHdyYiwgMCk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiLCBtb2RlLCBwd3JiLAorCQkgICAgICAwKTsKKworCW1lbV9kZXNjciA9IHBoYmEtPmluaXRfbWVtOworCW1lbV9kZXNjciArPSBJU0NTSV9NRU1fR0xPQkFMX0hFQURFUjsKKworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYiwKKwkJCXBhZF9idWZmZXJfYWRkcl9oaSwgcHdyYiwKKwkJICAgICAgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0uYnVzX2FkZHJlc3MudS5hMzIuYWRkcmVzc19oaSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiLAorCQkJcGFkX2J1ZmZlcl9hZGRyX2xvLCBwd3JiLAorCQkgICAgICBtZW1fZGVzY3ItPm1lbV9hcnJheVswXS5idXNfYWRkcmVzcy51LmEzMi5hZGRyZXNzX2xvKTsKKworCWJlX2R3c19sZV90b19jcHUocHdyYiwgc2l6ZW9mKHN0cnVjdCBpc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiKSk7CisKKwlkb29yYmVsbCB8PSBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQgJiBEQl9XUkJfUE9TVF9DSURfTUFTSzsKKwlkb29yYmVsbCB8PSAocHdyYl9oYW5kbGUtPndyYl9pbmRleCAmIERCX0RFRl9QRFVfV1JCX0lOREVYX01BU0spIDw8CisJCQkJCURCX0RFRl9QRFVfV1JCX0lOREVYX1NISUZUOworCWRvb3JiZWxsIHw9IDEgPDwgREJfREVGX1BEVV9OVU1fUE9TVEVEX1NISUZUOworCisJaW93cml0ZTMyKGRvb3JiZWxsLCBwaGJhLT5kYl92YSArIERCX1RYVUxQMF9PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX3BhcnNlX3BkdShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgaXR0X3QgaXR0LAorCQkJICAgICAgaW50ICppbmRleCwgaW50ICphZ2UpCit7CisJKmluZGV4ID0gYmUzMl90b19jcHUoaXR0KSA+PiAxNjsKKwlpZiAoYWdlKQorCQkqYWdlID0gY29ubi0+c2Vzc2lvbi0+YWdlOworfQorCisvKioKKyAqIGJlaXNjc2lfYWxsb2NfcGR1IC0gYWxsb2NhdGVzIHBkdSBhbmQgcmVsYXRlZCByZXNvdXJjZXMKKyAqIEB0YXNrOiBsaWJpc2NzaSB0YXNrCisgKiBAb3Bjb2RlOiBvcGNvZGUgb2YgcGR1IGZvciB0YXNrCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgc2Vzc2lvbiBsb2NrIGhlbGQuIEl0IHdpbGwgYWxsb2NhdGUKKyAqIHRoZSB3cmIgYW5kIHNnbCBpZiBuZWVkZWQgZm9yIHRoZSBjb21tYW5kLiBBbmQgaXQgd2lsbCBwcmVwCisgKiB0aGUgcGR1J3MgaXR0LiBiZWlzY3NpX3BhcnNlX3BkdSB3aWxsIGxhdGVyIHRyYW5zbGF0ZQorICogdGhlIHBkdSBpdHQgdG8gdGhlIGxpYmlzY3NpIHRhc2sgaXR0LgorICovCitzdGF0aWMgaW50IGJlaXNjc2lfYWxsb2NfcGR1KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLCB1aW50OF90IG9wY29kZSkKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9pb190YXNrICppb190YXNrID0gdGFzay0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRhc2stPmNvbm47CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBiZWlzY3NpX2Nvbm4tPnBoYmE7CisJc3RydWN0IGh3aV93cmJfY29udGV4dCAqcHdyYl9jb250ZXh0OworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwlpdHRfdCBpdHQ7CisJc3RydWN0IGJlaXNjc2lfc2Vzc2lvbiAqYmVpc2NzaV9zZXNzID0gYmVpc2NzaV9jb25uLT5iZWlzY3NpX3Nlc3M7CisJZG1hX2FkZHJfdCBwYWRkcjsKKworCWlvX3Rhc2stPmNtZF9iaHMgPSBwY2lfcG9vbF9hbGxvYyhiZWlzY3NpX3Nlc3MtPmJoc19wb29sLAorCQkJCQkgIEdGUF9LRVJORUwsICZwYWRkcik7CisKKwlpZiAoIWlvX3Rhc2stPmNtZF9iaHMpCisJCXJldHVybiAtRU5PTUVNOworCisJaW9fdGFzay0+YmhzX3BhLnUuYTY0LmFkZHJlc3MgPSBwYWRkcjsKKwlpb190YXNrLT5wd3JiX2hhbmRsZSA9IGFsbG9jX3dyYl9oYW5kbGUocGhiYSwKKwkJCQkJCWJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCwKKwkJCQkJCXRhc2stPml0dCk7CisJaW9fdGFzay0+cHdyYl9oYW5kbGUtPnBpb19oYW5kbGUgPSB0YXNrOworCWlvX3Rhc2stPmNvbm4gPSBiZWlzY3NpX2Nvbm47CisKKwl0YXNrLT5oZHIgPSAoc3RydWN0IGlzY3NpX2hkciAqKSZpb190YXNrLT5jbWRfYmhzLT5pc2NzaV9oZHI7CisJdGFzay0+aGRyX21heCA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX2Jocyk7CisKKwlpZiAodGFzay0+c2MpIHsKKwkJc3Bpbl9sb2NrKCZwaGJhLT5pb19zZ2xfbG9jayk7CisJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlID0gYWxsb2NfaW9fc2dsX2hhbmRsZShwaGJhKTsKKwkJc3Bpbl91bmxvY2soJnBoYmEtPmlvX3NnbF9sb2NrKTsKKwkJaWYgKCFpb190YXNrLT5wc2dsX2hhbmRsZSkKKwkJCWdvdG8gZnJlZV9obmRsczsKKworCX0gZWxzZSB7CisJCWlvX3Rhc2stPnNjc2lfY21uZCA9IE5VTEw7CisJCWlmICgodGFzay0+aGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSykgPT0gSVNDU0lfT1BfTE9HSU4pIHsKKwkJCWlmICghYmVpc2NzaV9jb25uLT5sb2dpbl9pbl9wcm9ncmVzcykgeworCQkJCXNwaW5fbG9jaygmcGhiYS0+bWdtdF9zZ2xfbG9jayk7CisJCQkJaW9fdGFzay0+cHNnbF9oYW5kbGUgPSAoc3RydWN0IHNnbF9oYW5kbGUgKikKKwkJCQkJCWFsbG9jX21nbXRfc2dsX2hhbmRsZShwaGJhKTsKKwkJCQlzcGluX3VubG9jaygmcGhiYS0+bWdtdF9zZ2xfbG9jayk7CisJCQkJaWYgKCFpb190YXNrLT5wc2dsX2hhbmRsZSkKKwkJCQkJZ290byBmcmVlX2huZGxzOworCisJCQkJYmVpc2NzaV9jb25uLT5sb2dpbl9pbl9wcm9ncmVzcyA9IDE7CisJCQkJYmVpc2NzaV9jb25uLT5wbG9naW5fc2dsX2hhbmRsZSA9CisJCQkJCQkJaW9fdGFzay0+cHNnbF9oYW5kbGU7CisJCQl9IGVsc2UgeworCQkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlID0KKwkJCQkJCWJlaXNjc2lfY29ubi0+cGxvZ2luX3NnbF9oYW5kbGU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2soJnBoYmEtPm1nbXRfc2dsX2xvY2spOworCQkJaW9fdGFzay0+cHNnbF9oYW5kbGUgPSBhbGxvY19tZ210X3NnbF9oYW5kbGUocGhiYSk7CisJCQlzcGluX3VubG9jaygmcGhiYS0+bWdtdF9zZ2xfbG9jayk7CisJCQlpZiAoIWlvX3Rhc2stPnBzZ2xfaGFuZGxlKQorCQkJCWdvdG8gZnJlZV9obmRsczsKKwkJfQorCX0KKwlpdHQgPSAoaXR0X3QpIGNwdV90b19iZTMyKCgodW5zaWduZWQgaW50KXRhc2stPml0dCA8PCAxNikgfAorCQkJKHVuc2lnbmVkIGludCkoaW9fdGFzay0+cHNnbF9oYW5kbGUtPnNnbF9pbmRleCkpOworCWlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2hkci5pdHQgPSBpdHQ7CisJcmV0dXJuIDA7CisKK2ZyZWVfaG5kbHM6CisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcHdyYl9jb250ZXh0ID0gJnBod2lfY3RybHItPndyYl9jb250ZXh0W2JlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZF07CisJZnJlZV93cmJfaGFuZGxlKHBoYmEsIHB3cmJfY29udGV4dCwgaW9fdGFzay0+cHdyYl9oYW5kbGUpOworCWlvX3Rhc2stPnB3cmJfaGFuZGxlID0gTlVMTDsKKwlwY2lfcG9vbF9mcmVlKGJlaXNjc2lfc2Vzcy0+YmhzX3Bvb2wsIGlvX3Rhc2stPmNtZF9iaHMsCisJCSAgICAgIGlvX3Rhc2stPmJoc19wYS51LmE2NC5hZGRyZXNzKTsKKwlTRV9ERUJVRyhEQkdfTFZMXzEsICJBbGxvYyBvZiBTR0xfSUNEIEZhaWxlZCBcbiIpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX2NsZWFudXBfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9pb190YXNrICppb190YXNrID0gdGFzay0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRhc2stPmNvbm47CisJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBiZWlzY3NpX2Nvbm4tPnBoYmE7CisJc3RydWN0IGJlaXNjc2lfc2Vzc2lvbiAqYmVpc2NzaV9zZXNzID0gYmVpc2NzaV9jb25uLT5iZWlzY3NpX3Nlc3M7CisJc3RydWN0IGh3aV93cmJfY29udGV4dCAqcHdyYl9jb250ZXh0OworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKworCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCXB3cmJfY29udGV4dCA9ICZwaHdpX2N0cmxyLT53cmJfY29udGV4dFtiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWRdOworCWlmIChpb190YXNrLT5wd3JiX2hhbmRsZSkgeworCQlmcmVlX3dyYl9oYW5kbGUocGhiYSwgcHdyYl9jb250ZXh0LCBpb190YXNrLT5wd3JiX2hhbmRsZSk7CisJCWlvX3Rhc2stPnB3cmJfaGFuZGxlID0gTlVMTDsKKwl9CisKKwlpZiAoaW9fdGFzay0+Y21kX2JocykgeworCQlwY2lfcG9vbF9mcmVlKGJlaXNjc2lfc2Vzcy0+YmhzX3Bvb2wsIGlvX3Rhc2stPmNtZF9iaHMsCisJCQkgICAgICBpb190YXNrLT5iaHNfcGEudS5hNjQuYWRkcmVzcyk7CisJfQorCisJaWYgKHRhc2stPnNjKSB7CisJCWlmIChpb190YXNrLT5wc2dsX2hhbmRsZSkgeworCQkJc3Bpbl9sb2NrKCZwaGJhLT5pb19zZ2xfbG9jayk7CisJCQlmcmVlX2lvX3NnbF9oYW5kbGUocGhiYSwgaW9fdGFzay0+cHNnbF9oYW5kbGUpOworCQkJc3Bpbl91bmxvY2soJnBoYmEtPmlvX3NnbF9sb2NrKTsKKwkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgodGFzay0+aGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSykgPT0gSVNDU0lfT1BfTE9HSU4pCisJCQlyZXR1cm47CisJCWlmIChpb190YXNrLT5wc2dsX2hhbmRsZSkgeworCQkJc3Bpbl9sb2NrKCZwaGJhLT5tZ210X3NnbF9sb2NrKTsKKwkJCWZyZWVfbWdtdF9zZ2xfaGFuZGxlKHBoYmEsIGlvX3Rhc2stPnBzZ2xfaGFuZGxlKTsKKwkJCXNwaW5fdW5sb2NrKCZwaGJhLT5tZ210X3NnbF9sb2NrKTsKKwkJCWlvX3Rhc2stPnBzZ2xfaGFuZGxlID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBiZWlzY3NpX2lvdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgdW5zaWduZWQgaW50IG51bV9zZywgdW5zaWduZWQgaW50IHhmZXJsZW4sCisJCQkgIHVuc2lnbmVkIGludCB3cml0ZWRpcikKK3sKKworCXN0cnVjdCBiZWlzY3NpX2lvX3Rhc2sgKmlvX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGFzay0+Y29ubjsKKwlzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGJlaXNjc2lfY29ubi0+cGhiYTsKKwlzdHJ1Y3QgaXNjc2lfd3JiICpwd3JiID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZG9vcmJlbGwgPSAwOworCisJcHdyYiA9IGlvX3Rhc2stPnB3cmJfaGFuZGxlLT5wd3JiOworCWlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2hkci5leHBfc3RhdHNuID0gMDsKKwlpb190YXNrLT5iaHNfbGVuID0gc2l6ZW9mKHN0cnVjdCBiZV9jbWRfYmhzKTsKKworCWlmICh3cml0ZWRpcikgeworCQlTRV9ERUJVRyhEQkdfTFZMXzQsICIgV1JJVEUgQ29tbWFuZCBcdCIpOworCQltZW1zZXQoJmlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2RhdGFfcGR1LCAwLCA0OCk7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfcGR1X2RhdGFfb3V0LCBpdHQsCisJCQkgICAgICAmaW9fdGFzay0+Y21kX2Jocy0+aXNjc2lfZGF0YV9wZHUsCisJCQkgICAgICAodW5zaWduZWQgaW50KWlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2hkci5pdHQpOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX3BkdV9kYXRhX291dCwgb3Bjb2RlLAorCQkJICAgICAgJmlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2RhdGFfcGR1LAorCQkJICAgICAgSVNDU0lfT1BDT0RFX1NDU0lfREFUQV9PVVQpOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX3BkdV9kYXRhX291dCwgZmluYWxfYml0LAorCQkJICAgICAgJmlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2RhdGFfcGR1LCAxKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsIElOSV9XUl9DTUQpOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgZHNwLCBwd3JiLCAxKTsKKwl9IGVsc2UgeworCQlTRV9ERUJVRyhEQkdfTFZMXzQsICJSRUFEIENvbW1hbmQgXHQiKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsIElOSV9SRF9DTUQpOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgZHNwLCBwd3JiLCAwKTsKKwl9CisJbWVtY3B5KCZpb190YXNrLT5jbWRfYmhzLT5pc2NzaV9kYXRhX3BkdS4KKwkgICAgICAgZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfcGR1X2RhdGFfb3V0LCBsdW4pIC8gMzJdLAorCSAgICAgICBpb190YXNrLT5jbWRfYmhzLT5pc2NzaV9oZHIubHVuLCBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKSk7CisKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgbHVuLCBwd3JiLAorCQkgICAgICBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpaW9fdGFzay0+Y21kX2Jocy0+aXNjc2lfaGRyLgorCQkJCSAgbHVuWzBdKSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHIydF9leHBfZHRsLCBwd3JiLCB4ZmVybGVuKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgd3JiX2lkeCwgcHdyYiwKKwkJICAgICAgaW9fdGFzay0+cHdyYl9oYW5kbGUtPndyYl9pbmRleCk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGNtZHNuX2l0dCwgcHdyYiwKKwkJICAgICAgYmUzMl90b19jcHUodGFzay0+Y21kc24pKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgc2dsX2ljZF9pZHgsIHB3cmIsCisJCSAgICAgIGlvX3Rhc2stPnBzZ2xfaGFuZGxlLT5zZ2xfaW5kZXgpOworCisJaHdpX3dyaXRlX3NnbChwd3JiLCBzZywgbnVtX3NnLCBpb190YXNrKTsKKworCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBwdHIybmV4dHdyYiwgcHdyYiwKKwkJICAgICAgaW9fdGFzay0+cHdyYl9oYW5kbGUtPm54dF93cmJfaW5kZXgpOworCWJlX2R3c19sZV90b19jcHUocHdyYiwgc2l6ZW9mKHN0cnVjdCBpc2NzaV93cmIpKTsKKworCWRvb3JiZWxsIHw9IGJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCAmIERCX1dSQl9QT1NUX0NJRF9NQVNLOworCWRvb3JiZWxsIHw9IChpb190YXNrLT5wd3JiX2hhbmRsZS0+d3JiX2luZGV4ICYKKwkJICAgICBEQl9ERUZfUERVX1dSQl9JTkRFWF9NQVNLKSA8PCBEQl9ERUZfUERVX1dSQl9JTkRFWF9TSElGVDsKKwlkb29yYmVsbCB8PSAxIDw8IERCX0RFRl9QRFVfTlVNX1BPU1RFRF9TSElGVDsKKworCWlvd3JpdGUzMihkb29yYmVsbCwgcGhiYS0+ZGJfdmEgKyBEQl9UWFVMUDBfT0ZGU0VUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZWlzY3NpX210YXNrKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQoreworCXN0cnVjdCBiZWlzY3NpX2lvX3Rhc2sgKmFib3J0ZWRfaW9fdGFzaywgKmlvX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGFzay0+Y29ubjsKKwlzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGJlaXNjc2lfY29ubi0+cGhiYTsKKwlzdHJ1Y3QgaXNjc2lfd3JiICpwd3JiID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZG9vcmJlbGwgPSAwOworCXN0cnVjdCBpc2NzaV90YXNrICphYm9ydGVkX3Rhc2s7CisKKwlwd3JiID0gaW9fdGFzay0+cHdyYl9oYW5kbGUtPnB3cmI7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGNtZHNuX2l0dCwgcHdyYiwKKwkJICAgICAgYmUzMl90b19jcHUodGFzay0+Y21kc24pKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgd3JiX2lkeCwgcHdyYiwKKwkJICAgICAgaW9fdGFzay0+cHdyYl9oYW5kbGUtPndyYl9pbmRleCk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHNnbF9pY2RfaWR4LCBwd3JiLAorCQkgICAgICBpb190YXNrLT5wc2dsX2hhbmRsZS0+c2dsX2luZGV4KTsKKworCXN3aXRjaCAodGFzay0+aGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSykgeworCWNhc2UgSVNDU0lfT1BfTE9HSU46CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlLCBwd3JiLCBUR1RfRE1fQ01EKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGRtc2csIHB3cmIsIDApOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgY21kc25faXR0LCBwd3JiLCAxKTsKKwkJaHdpX3dyaXRlX2J1ZmZlcihwd3JiLCB0YXNrKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9PUF9OT09QX09VVDoKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHR5cGUsIHB3cmIsIElOSV9SRF9DTUQpOworCQlod2lfd3JpdGVfYnVmZmVyKHB3cmIsIHRhc2spOworCQlicmVhazsKKwljYXNlIElTQ1NJX09QX1RFWFQ6CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlLCBwd3JiLCBJTklfV1JfQ01EKTsKKwkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGRzcCwgcHdyYiwgMSk7CisJCWh3aV93cml0ZV9idWZmZXIocHdyYiwgdGFzayk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfT1BfU0NTSV9UTUZVTkM6CisJCWFib3J0ZWRfdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sCisJCQkJCSgoc3RydWN0IGlzY3NpX3RtICopdGFzay0+aGRyKS0+cnR0KTsKKwkJIGlmICghYWJvcnRlZF90YXNrKQorCQkJcmV0dXJuIDA7CisJCWFib3J0ZWRfaW9fdGFzayA9IGFib3J0ZWRfdGFzay0+ZGRfZGF0YTsKKwkJaWYgKCFhYm9ydGVkX2lvX3Rhc2stPnNjc2lfY21uZCkKKwkJCXJldHVybiAwOworCisJCW1nbXRfaW52YWxpZGF0ZV9pY2RzKHBoYmEsCisJCQkJICAgICBhYm9ydGVkX2lvX3Rhc2stPnBzZ2xfaGFuZGxlLT5zZ2xfaW5kZXgsCisJCQkJICAgICBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQpOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgdHlwZSwgcHdyYiwgSU5JX1RNRl9DTUQpOworCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgZG1zZywgcHdyYiwgMCk7CisJCWh3aV93cml0ZV9idWZmZXIocHdyYiwgdGFzayk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfT1BfTE9HT1VUOgorCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgZG1zZywgcHdyYiwgMCk7CisJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlLCBwd3JiLAorCQkJCUhXSF9UWVBFX0xPR09VVCk7CisJCWh3aV93cml0ZV9idWZmZXIocHdyYiwgdGFzayk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAib3Bjb2RlID0lZCBOb3Qgc3VwcG9ydGVkIFxuIiwKKwkJCSB0YXNrLT5oZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHIydF9leHBfZHRsLCBwd3JiLAorCQkgICAgICBiZTMyX3RvX2NwdSh0YXNrLT5kYXRhX2NvdW50KSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIHB0cjJuZXh0d3JiLCBwd3JiLAorCQkgICAgICBpb190YXNrLT5wd3JiX2hhbmRsZS0+bnh0X3dyYl9pbmRleCk7CisJYmVfZHdzX2xlX3RvX2NwdShwd3JiLCBzaXplb2Yoc3RydWN0IGlzY3NpX3dyYikpOworCisJZG9vcmJlbGwgfD0gYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkICYgREJfV1JCX1BPU1RfQ0lEX01BU0s7CisJZG9vcmJlbGwgfD0gKGlvX3Rhc2stPnB3cmJfaGFuZGxlLT53cmJfaW5kZXggJgorCQkgICAgIERCX0RFRl9QRFVfV1JCX0lOREVYX01BU0spIDw8IERCX0RFRl9QRFVfV1JCX0lOREVYX1NISUZUOworCWRvb3JiZWxsIHw9IDEgPDwgREJfREVGX1BEVV9OVU1fUE9TVEVEX1NISUZUOworCWlvd3JpdGUzMihkb29yYmVsbCwgcGhiYS0+ZGJfdmEgKyBEQl9UWFVMUDBfT0ZGU0VUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZWlzY3NpX3Rhc2tfeG1pdChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRhc2stPmNvbm47CisJc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqaW9fdGFzayA9IHRhc2stPmRkX2RhdGE7CisJc3RydWN0IHNjc2lfY21uZCAqc2MgPSB0YXNrLT5zYzsKKwlzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IG51bV9zZzsKKwl1bnNpZ25lZCBpbnQgIHdyaXRlZGlyID0gMCwgeGZlcmxlbiA9IDA7CisKKwlTRV9ERUJVRyhEQkdfTFZMXzQsICJcbiBjaWQ9JWQgSW4gYmVpc2NzaV90YXNrX3htaXQgdGFzaz0lcCBjb25uPSVwIFx0IgorCQkgImJlaXNjc2lfY29ubj0lcCBcbiIsIGJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCwKKwkJIHRhc2ssIGNvbm4sIGJlaXNjc2lfY29ubik7CisJaWYgKCFzYykKKwkJcmV0dXJuIGJlaXNjc2lfbXRhc2sodGFzayk7CisKKwlpb190YXNrLT5zY3NpX2NtbmQgPSBzYzsKKwludW1fc2cgPSBzY3NpX2RtYV9tYXAoc2MpOworCWlmIChudW1fc2cgPCAwKSB7CisJCVNFX0RFQlVHKERCR19MVkxfMSwgIiBzY3NpX2RtYV9tYXAgRmFpbGVkXG4iKQorCQlyZXR1cm4gbnVtX3NnOworCX0KKwlTRV9ERUJVRyhEQkdfTFZMXzQsICJ4ZmVybGVuPTB4JTA4eCBzY21kPSVwIG51bV9zZz0lZCBzZXJudW09JWx1XG4iLAorCQkgIChzY3NpX2J1ZmZsZW4oc2MpKSwgc2MsIG51bV9zZywgc2MtPnNlcmlhbF9udW1iZXIpOworCXhmZXJsZW4gPSBzY3NpX2J1ZmZsZW4oc2MpOworCXNnID0gc2NzaV9zZ2xpc3Qoc2MpOworCWlmIChzYy0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQl3cml0ZWRpciA9IDE7CisJCVNFX0RFQlVHKERCR19MVkxfNCwgInRhc2stPmltbV9jb3VudD0weCUwOHggXG4iLAorCQkJIHRhc2stPmltbV9jb3VudCk7CisJfSBlbHNlCisJCXdyaXRlZGlyID0gMDsKKwlyZXR1cm4gYmVpc2NzaV9pb3Rhc2sodGFzaywgc2csIG51bV9zZywgeGZlcmxlbiwgd3JpdGVkaXIpOworfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IE5VTEw7CisKKwlwaGJhID0gKHN0cnVjdCBiZWlzY3NpX2hiYSAqKXBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCWlmICghcGhiYSkgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImJlaXNjc2lfcmVtb3ZlIGNhbGxlZCB3aXRoIG5vIHBoYmEgXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWh3aV9kaXNhYmxlX2ludHIocGhiYSk7CisJaWYgKHBoYmEtPnBjaWRldi0+aXJxKQorCQlmcmVlX2lycShwaGJhLT5wY2lkZXYtPmlycSwgcGhiYSk7CisJZGVzdHJveV93b3JrcXVldWUocGhiYS0+d3EpOworCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpCisJCWJsa19pb3BvbGxfZGlzYWJsZSgmcGhiYS0+aW9wb2xsKTsKKworCWJlaXNjc2lfY2xlYW5fcG9ydChwaGJhKTsKKwliZWlzY3NpX2ZyZWVfbWVtKHBoYmEpOworCWJlaXNjc2lfdW5tYXBfcGNpX2Z1bmN0aW9uKHBoYmEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LAorCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC5zaXplLAorCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC52YSwKKwkJCSAgICBwaGJhLT5jdHJsLm1ib3hfbWVtX2FsbG9jZWQuZG1hKTsKKwlpc2NzaV9ob3N0X3JlbW92ZShwaGJhLT5zaG9zdCk7CisJcGNpX2Rldl9wdXQocGhiYS0+cGNpZGV2KTsKKwlpc2NzaV9ob3N0X2ZyZWUocGhiYS0+c2hvc3QpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBiZWlzY3NpX2Rldl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBOVUxMOworCWludCByZXQ7CisKKwlyZXQgPSBiZWlzY3NpX2VuYWJsZV9wY2kocGNpZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LCAiYmVpc2NzaV9kZXZfcHJvYmUtIgorCQkJICAgICAiRmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlIFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGhiYSA9IGJlaXNjc2lfaGJhX2FsbG9jKHBjaWRldik7CisJaWYgKCFwaGJhKSB7CisJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiYmVpc2NzaV9kZXZfcHJvYmUtIgorCQkJIiBGYWlsZWQgaW4gYmVpc2NzaV9oYmFfYWxsb2MgXG4iKTsKKwkJZ290byBkaXNhYmxlX3BjaTsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBwaGJhKTsKKwlyZXQgPSBiZV9jdHJsX2luaXQocGhiYSwgcGNpZGV2KTsKKwlpZiAocmV0KSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJiZWlzY3NpX2Rldl9wcm9iZS0iCisJCQkJIkZhaWxlZCBpbiBiZV9jdHJsX2luaXRcbiIpOworCQlnb3RvIGhiYV9mcmVlOworCX0KKworCXNwaW5fbG9ja19pbml0KCZwaGJhLT5pb19zZ2xfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBoYmEtPm1nbXRfc2dsX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwaGJhLT5pc3JfbG9jayk7CisJYmVpc2NzaV9nZXRfcGFyYW1zKHBoYmEpOworCXJldCA9IGJlaXNjc2lfaW5pdF9wb3J0KHBoYmEpOworCWlmIChyZXQgPCAwKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJiZWlzY3NpX2Rldl9wcm9iZS0iCisJCQkgICAgICJGYWlsZWQgaW4gYmVpc2NzaV9pbml0X3BvcnRcbiIpOworCQlnb3RvIGZyZWVfcG9ydDsKKwl9CisKKwlzbnByaW50ZihwaGJhLT53cV9uYW1lLCBzaXplb2YocGhiYS0+d3FfbmFtZSksICJiZWlzY3NpX3FfaXJxJXUiLAorCQkgcGhiYS0+c2hvc3QtPmhvc3Rfbm8pOworCXBoYmEtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUocGhiYS0+d3FfbmFtZSk7CisJaWYgKCFwaGJhLT53cSkgeworCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LCAiYmVpc2NzaV9kZXZfcHJvYmUtIgorCQkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgd29yayBxdWV1ZVxuIik7CisJCWdvdG8gZnJlZV90d3E7CisJfQorCisJSU5JVF9XT1JLKCZwaGJhLT53b3JrX2NxcywgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMpOworCisJaWYgKGJsa19pb3BvbGxfZW5hYmxlZCkgeworCQlibGtfaW9wb2xsX2luaXQoJnBoYmEtPmlvcG9sbCwgYmVfaW9wb2xsX2J1ZGdldCwgYmVfaW9wb2xsKTsKKwkJYmxrX2lvcG9sbF9lbmFibGUoJnBoYmEtPmlvcG9sbCk7CisJfQorCisJcmV0ID0gYmVpc2NzaV9pbml0X2lycXMocGhiYSk7CisJaWYgKHJldCA8IDApIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImJlaXNjc2lfZGV2X3Byb2JlLSIKKwkJCSAgICAgIkZhaWxlZCB0byBiZWlzY3NpX2luaXRfaXJxc1xuIik7CisJCWdvdG8gZnJlZV9ibGtlbmJsZDsKKwl9CisJcmV0ID0gaHdpX2VuYWJsZV9pbnRyKHBoYmEpOworCWlmIChyZXQgPCAwKSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJiZWlzY3NpX2Rldl9wcm9iZS0iCisJCQkgICAgICJGYWlsZWQgdG8gaHdpX2VuYWJsZV9pbnRyXG4iKTsKKwkJZ290byBmcmVlX2N0cmxyOworCX0KKworCVNFX0RFQlVHKERCR19MVkxfOCwgIlxuXG5cbiBTVUNDRVNTIC0gRFJJVkVSIExPQURFRCBcblxuXG4iKTsKKwlyZXR1cm4gMDsKKworZnJlZV9jdHJscjoKKwlpZiAocGhiYS0+cGNpZGV2LT5pcnEpCisJCWZyZWVfaXJxKHBoYmEtPnBjaWRldi0+aXJxLCBwaGJhKTsKK2ZyZWVfYmxrZW5ibGQ6CisJZGVzdHJveV93b3JrcXVldWUocGhiYS0+d3EpOworCWlmIChibGtfaW9wb2xsX2VuYWJsZWQpCisJCWJsa19pb3BvbGxfZGlzYWJsZSgmcGhiYS0+aW9wb2xsKTsKK2ZyZWVfdHdxOgorCWJlaXNjc2lfY2xlYW5fcG9ydChwaGJhKTsKKwliZWlzY3NpX2ZyZWVfbWVtKHBoYmEpOworZnJlZV9wb3J0OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LAorCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC5zaXplLAorCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC52YSwKKwkJCSAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC5kbWEpOworCWJlaXNjc2lfdW5tYXBfcGNpX2Z1bmN0aW9uKHBoYmEpOworaGJhX2ZyZWU6CisJaXNjc2lfaG9zdF9yZW1vdmUocGhiYS0+c2hvc3QpOworCXBjaV9kZXZfcHV0KHBoYmEtPnBjaWRldik7CisJaXNjc2lfaG9zdF9mcmVlKHBoYmEtPnNob3N0KTsKK2Rpc2FibGVfcGNpOgorCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBpc2NzaV90cmFuc3BvcnQgYmVpc2NzaV9pc2NzaV90cmFuc3BvcnQgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuY2FwcyA9IENBUF9SRUNPVkVSWV9MMCB8IENBUF9IRFJER1NUIHwKKwkJQ0FQX01VTFRJX1IyVCB8IENBUF9EQVRBREdTVCB8IENBUF9EQVRBX1BBVEhfT0ZGTE9BRCwKKwkucGFyYW1fbWFzayA9IElTQ1NJX01BWF9SRUNWX0RMRU5HVEggfAorCQlJU0NTSV9NQVhfWE1JVF9ETEVOR1RIIHwKKwkJSVNDU0lfSERSREdTVF9FTiB8CisJCUlTQ1NJX0RBVEFER1NUX0VOIHwKKwkJSVNDU0lfSU5JVElBTF9SMlRfRU4gfAorCQlJU0NTSV9NQVhfUjJUIHwKKwkJSVNDU0lfSU1NX0RBVEFfRU4gfAorCQlJU0NTSV9GSVJTVF9CVVJTVCB8CisJCUlTQ1NJX01BWF9CVVJTVCB8CisJCUlTQ1NJX1BEVV9JTk9SREVSX0VOIHwKKwkJSVNDU0lfREFUQVNFUV9JTk9SREVSX0VOIHwKKwkJSVNDU0lfRVJMIHwKKwkJSVNDU0lfQ09OTl9QT1JUIHwKKwkJSVNDU0lfQ09OTl9BRERSRVNTIHwKKwkJSVNDU0lfRVhQX1NUQVRTTiB8CisJCUlTQ1NJX1BFUlNJU1RFTlRfUE9SVCB8CisJCUlTQ1NJX1BFUlNJU1RFTlRfQUREUkVTUyB8CisJCUlTQ1NJX1RBUkdFVF9OQU1FIHwgSVNDU0lfVFBHVCB8CisJCUlTQ1NJX1VTRVJOQU1FIHwgSVNDU0lfUEFTU1dPUkQgfAorCQlJU0NTSV9VU0VSTkFNRV9JTiB8IElTQ1NJX1BBU1NXT1JEX0lOIHwKKwkJSVNDU0lfRkFTVF9BQk9SVCB8IElTQ1NJX0FCT1JUX1RNTyB8CisJCUlTQ1NJX0xVX1JFU0VUX1RNTyB8CisJCUlTQ1NJX1BJTkdfVE1PIHwgSVNDU0lfUkVDVl9UTU8gfAorCQlJU0NTSV9JRkFDRV9OQU1FIHwgSVNDU0lfSU5JVElBVE9SX05BTUUsCisJLmhvc3RfcGFyYW1fbWFzayA9IElTQ1NJX0hPU1RfSFdBRERSRVNTIHwgSVNDU0lfSE9TVF9JUEFERFJFU1MgfAorCQkJCUlTQ1NJX0hPU1RfSU5JVElBVE9SX05BTUUsCisJLmNyZWF0ZV9zZXNzaW9uID0gYmVpc2NzaV9zZXNzaW9uX2NyZWF0ZSwKKwkuZGVzdHJveV9zZXNzaW9uID0gYmVpc2NzaV9zZXNzaW9uX2Rlc3Ryb3ksCisJLmNyZWF0ZV9jb25uID0gYmVpc2NzaV9jb25uX2NyZWF0ZSwKKwkuYmluZF9jb25uID0gYmVpc2NzaV9jb25uX2JpbmQsCisJLmRlc3Ryb3lfY29ubiA9IGlzY3NpX2Nvbm5fdGVhcmRvd24sCisJLnNldF9wYXJhbSA9IGJlaXNjc2lfc2V0X3BhcmFtLAorCS5nZXRfY29ubl9wYXJhbSA9IGJlaXNjc2lfY29ubl9nZXRfcGFyYW0sCisJLmdldF9zZXNzaW9uX3BhcmFtID0gaXNjc2lfc2Vzc2lvbl9nZXRfcGFyYW0sCisJLmdldF9ob3N0X3BhcmFtID0gYmVpc2NzaV9nZXRfaG9zdF9wYXJhbSwKKwkuc3RhcnRfY29ubiA9IGJlaXNjc2lfY29ubl9zdGFydCwKKwkuc3RvcF9jb25uID0gYmVpc2NzaV9jb25uX3N0b3AsCisJLnNlbmRfcGR1ID0gaXNjc2lfY29ubl9zZW5kX3BkdSwKKwkueG1pdF90YXNrID0gYmVpc2NzaV90YXNrX3htaXQsCisJLmNsZWFudXBfdGFzayA9IGJlaXNjc2lfY2xlYW51cF90YXNrLAorCS5hbGxvY19wZHUgPSBiZWlzY3NpX2FsbG9jX3BkdSwKKwkucGFyc2VfcGR1X2l0dCA9IGJlaXNjc2lfcGFyc2VfcGR1LAorCS5nZXRfc3RhdHMgPSBiZWlzY3NpX2Nvbm5fZ2V0X3N0YXRzLAorCS5lcF9jb25uZWN0ID0gYmVpc2NzaV9lcF9jb25uZWN0LAorCS5lcF9wb2xsID0gYmVpc2NzaV9lcF9wb2xsLAorCS5lcF9kaXNjb25uZWN0ID0gYmVpc2NzaV9lcF9kaXNjb25uZWN0LAorCS5zZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0ID0gaXNjc2lfc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBiZWlzY3NpX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkucHJvYmUgPSBiZWlzY3NpX2Rldl9wcm9iZSwKKwkucmVtb3ZlID0gYmVpc2NzaV9yZW1vdmUsCisJLmlkX3RhYmxlID0gYmVpc2NzaV9wY2lfaWRfdGFibGUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJlaXNjc2lfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJYmVpc2NzaV9zY3NpX3RyYW5zcG9ydCA9CisJCQlpc2NzaV9yZWdpc3Rlcl90cmFuc3BvcnQoJmJlaXNjc2lfaXNjc2lfdHJhbnNwb3J0KTsKKwlpZiAoIWJlaXNjc2lfc2NzaV90cmFuc3BvcnQpIHsKKwkJU0VfREVCVUcoREJHX0xWTF8xLAorCQkJICJiZWlzY3NpX21vZHVsZV9pbml0IC0gVW5hYmxlIHRvICByZWdpc3RlciBiZWlzY3NpIgorCQkJICJ0cmFuc3BvcnQuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwl9CisJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9tb2R1bGVfaW5pdCwgdHQ9JXAgXG4iLAorCQkgJmJlaXNjc2lfaXNjc2lfdHJhbnNwb3J0KTsKKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlaXNjc2lfcGNpX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsCisJCQkgImJlaXNjc2lfbW9kdWxlX2luaXQgLSBVbmFibGUgdG8gIHJlZ2lzdGVyIgorCQkJICJiZWlzY3NpIHBjaSBkcml2ZXIuXG4iKTsKKwkJZ290byB1bnJlZ2lzdGVyX2lzY3NpX3RyYW5zcG9ydDsKKwl9CisJcmV0dXJuIDA7CisKK3VucmVnaXN0ZXJfaXNjc2lfdHJhbnNwb3J0OgorCWlzY3NpX3VucmVnaXN0ZXJfdHJhbnNwb3J0KCZiZWlzY3NpX2lzY3NpX3RyYW5zcG9ydCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJlaXNjc2lfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJlaXNjc2lfcGNpX2RyaXZlcik7CisJaXNjc2lfdW5yZWdpc3Rlcl90cmFuc3BvcnQoJmJlaXNjc2lfaXNjc2lfdHJhbnNwb3J0KTsKK30KKworbW9kdWxlX2luaXQoYmVpc2NzaV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChiZWlzY3NpX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzliNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCkBAIC0wLDAgKzEsODM3IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDkgU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIFdyaXR0ZW4gYnk6IEpheWFtb2hhbiBLYWxsaWNrYWwgKGpheWFtb2hhbmtAc2VydmVyZW5naW5lcy5jb20pCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICoKKyAqLworCisjaWZuZGVmIF9CRUlTQ1NJX01BSU5fCisjZGVmaW5lIF9CRUlTQ1NJX01BSU5fCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvYmxrLWlvcG9sbC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9pc2NzaV9wcm90by5oPgorI2luY2x1ZGUgPHNjc2kvbGliaXNjc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmg+CisKKyNpbmNsdWRlICJiZS5oIgorCisKKworI2RlZmluZSBEUlZfTkFNRQkJImJlMmlzY3NpIgorI2RlZmluZSBCVUlMRF9TVFIJCSIyLjAuNTI3LjAiCisKKyNkZWZpbmUgQkVfTkFNRQkJCSJTZXJ2ZXJFbmdpbmVzIEJsYWRlRW5naW5lMiIgXAorCQkJCSJMaW51eCBpU0NTSSBEcml2ZXIgdmVyc2lvbiIgQlVJTERfU1RSCisjZGVmaW5lIERSVl9ERVNDCQlCRV9OQU1FICIgIiAiRHJpdmVyIgorCisjZGVmaW5lIEJFX1ZFTkRPUl9JRCAJCTB4MTlBMgorI2RlZmluZSBCRV9ERVZJQ0VfSUQxCQkweDIxMgorI2RlZmluZSBPQ19ERVZJQ0VfSUQxCQkweDcwMgorI2RlZmluZSBPQ19ERVZJQ0VfSUQyCQkweDcwMworCisjZGVmaW5lIEJFMl9NQVhfU0VTU0lPTlMJNjQKKyNkZWZpbmUgQkUyX0NNRFNfUEVSX0NYTgkxMjgKKyNkZWZpbmUgQkUyX0xPR09VVFMJCUJFMl9NQVhfU0VTU0lPTlMKKyNkZWZpbmUgQkUyX1RNRlMJCTE2CisjZGVmaW5lIEJFMl9OT1BPVVRfUkVRCQkxNgorI2RlZmluZSBCRTJfQVNZTkNQRFVTCQlCRTJfTUFYX1NFU1NJT05TCisjZGVmaW5lIEJFMl9NQVhfSUNEUwkJMjA0OAorI2RlZmluZSBCRTJfU0dFCQkJMzIKKyNkZWZpbmUgQkUyX0RFRlBEVV9IRFJfU1oJNjQKKyNkZWZpbmUgQkUyX0RFRlBEVV9EQVRBX1NaCTgxOTIKKyNkZWZpbmUgQkUyX0lPX0RFUFRIIFwKKwkoQkUyX01BWF9JQ0RTIC8gMiAtIChCRTJfTE9HT1VUUyArIEJFMl9UTUZTICsgQkUyX05PUE9VVF9SRVEpKQorCisjZGVmaW5lIEJFSVNDU0lfU0dMSVNUX0VMRU1FTlRTCUJFMl9TR0UKKworI2RlZmluZSBCRUlTQ1NJX01BWF9DTU5EUwkxMDI0CS8qIE1heCBJTydzIHBlciBDdHJsciBzaHQtPmNhbl9xdWV1ZSAqLworI2RlZmluZSBCRUlTQ1NJX0NNRF9QRVJfTFVOCTEyOAkvKiBzY3NpX2hvc3QtPmNtZF9wZXJfbHVuICovCisjZGVmaW5lIEJFSVNDU0lfTUFYX1NFQ1RPUlMJMjA0OAkvKiBzY3NpX2hvc3QtPm1heF9zZWN0b3JzICovCisKKyNkZWZpbmUgQkVJU0NTSV9NQVhfQ01EX0xFTgkxNgkvKiBzY3NpX2hvc3QtPm1heF9jbWRfbGVuICovCisjZGVmaW5lIEJFSVNDU0lfTlVNX01BWF9MVU4JMjU2CS8qIHNjc2lfaG9zdC0+bWF4X2x1biAqLworI2RlZmluZSBCRUlTQ1NJX05VTV9ERVZJQ0VTX1NVUFBPUlRFRAkweDAxCisjZGVmaW5lIEJFSVNDU0lfTUFYX0ZSQUdTX0lOSVQJMTkyCisjZGVmaW5lIEJFX05VTV9NU0lYX0VOVFJJRVMgCTEKKyNkZWZpbmUgTVBVX0VQX1NFTUFQSE9SRSAJMHhhYworCisjZGVmaW5lIEJFX1NFTlNFX0lORk9fU0laRQkJMjU4CisjZGVmaW5lIEJFX0lTQ1NJX1BEVV9IRUFERVJfU0laRQk2NAorI2RlZmluZSBCRV9NSU5fTUVNX1NJWkUJCQkxNjM4NAorCisjZGVmaW5lIElJT0NfU0NTSV9EQVRBICAgICAgICAgICAgICAgICAgMHgwNQkvKiBXcml0ZSBPcGVyYXRpb24gKi8KKworI2RlZmluZSBEQkdfTFZMCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgREJHX0xWTF8xCQkJMHgwMDAwMDAwMQorI2RlZmluZSBEQkdfTFZMXzIJCQkweDAwMDAwMDAyCisjZGVmaW5lIERCR19MVkxfMwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgREJHX0xWTF80CQkJMHgwMDAwMDAwOAorI2RlZmluZSBEQkdfTFZMXzUJCQkweDAwMDAwMDEwCisjZGVmaW5lIERCR19MVkxfNgkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgREJHX0xWTF83CQkJMHgwMDAwMDA0MAorI2RlZmluZSBEQkdfTFZMXzgJCQkweDAwMDAwMDgwCisKKyNkZWZpbmUgU0VfREVCVUcoZGVidWdfbWFzaywgZm10LCBhcmdzLi4uKQkJXAorZG8gewkJCQkJCQlcCisJaWYgKGRlYnVnX21hc2sgJiBEQkdfTFZMKSB7CQkJXAorCQlwcmludGsoS0VSTl9FUlIgIiglcygpOiVkKToiLCBfX2Z1bmNfXywgX19MSU5FX18pO1wKKwkJcHJpbnRrKGZtdCwgIyNhcmdzKTsJCQlcCisJfQkJCQkJCVwKK30gd2hpbGUgKDApOworCisvKioKKyAqIGhhcmR3YXJlIG5lZWRzIHRoZSBhc3luYyBQRFUgYnVmZmVycyB0byBiZSBwb3N0ZWQgaW4gbXVsdGlwbGVzIG9mIDgKKyAqIFNvIGhhdmUgYXRsZWFzdCA4IG9mIHRoZW0gYnkgZGVmYXVsdAorICovCisKKyNkZWZpbmUgSFdJX0dFVF9BU1lOQ19QRFVfQ1RYKHBod2kpCShwaHdpLT5waHdpX2N0eHQtPnBhc3luY19jdHgpCisKKy8qKioqKioqKiogTWVtb3J5IEJBUiByZWdpc3RlciAqKioqKioqKioqKiovCisjZGVmaW5lIFBDSUNGR19NRU1CQVJfQ1RSTF9JTlRfQ1RSTF9PRkZTRVQgCTB4ZmMKKy8qKgorICogSG9zdCBJbnRlcnJ1cHQgRW5hYmxlLCBpZiBzZXQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBhbHRob3VnaCAiUENJIEludGVycnVwdAorICogRGlzYWJsZSIgbWF5IHN0aWxsIGdsb2JhbGx5IGJsb2NrIGludGVycnVwdHMgaW4gYWRkaXRpb24gdG8gaW5kaXZpZHVhbAorICogaW50ZXJydXB0IG1hc2tzOyBhIG1lY2hhbmlzbSBmb3IgdGhlIGRldmljZSBkcml2ZXIgdG8gYmxvY2sgYWxsIGludGVycnVwdHMKKyAqIGF0b21pY2FsbHkgd2l0aG91dCBoYXZpbmcgdG8gYXJiaXRyYXRlIGZvciB0aGUgUENJIEludGVycnVwdCBEaXNhYmxlIGJpdAorICogd2l0aCB0aGUgT1MuCisgKi8KKyNkZWZpbmUgTUVNQkFSX0NUUkxfSU5UX0NUUkxfSE9TVElOVFJfTUFTSwkoMSA8PCAyOSkJLyogYml0IDI5ICovCisKKy8qKioqKioqKiogSVNSMCBSZWdpc3RlciBvZmZzZXQgKioqKioqKioqKi8KKyNkZWZpbmUgQ0VWX0lTUjBfT0ZGU0VUIAkJCTB4QzE4CisjZGVmaW5lIENFVl9JU1JfU0laRQkJCQk0CisKKy8qKgorICogTWFjcm9zIGZvciByZWFkaW5nL3dyaXRpbmcgYSBwcm90ZWN0aW9uIGRvbWFpbiBvciBDU1IgcmVnaXN0ZXJzCisgKiBpbiBCbGFkZUVuZ2luZS4KKyAqLworCisjZGVmaW5lIERCX1RYVUxQMF9PRkZTRVQgMHg0MAorI2RlZmluZSBEQl9SWFVMUDBfT0ZGU0VUIDB4QTAKKy8qKioqKioqKiogRXZlbnQgUSBkb29yIGJlbGwgKioqKioqKioqKioqKi8KKyNkZWZpbmUgREJfRVFfT0ZGU0VUCQkJREJfQ1FfT0ZGU0VUCisjZGVmaW5lIERCX0VRX1JJTkdfSURfTUFTSwkJMHgxRkYJLyogYml0cyAwIC0gOCAqLworLyogQ2xlYXIgdGhlIGludGVycnVwdCBmb3IgdGhpcyBlcSAqLworI2RlZmluZSBEQl9FUV9DTFJfU0hJRlQJCQkoOSkJLyogYml0IDkgKi8KKy8qIE11c3QgYmUgMSAqLworI2RlZmluZSBEQl9FUV9FVk5UX1NISUZUCQkoMTApCS8qIGJpdCAxMCAqLworLyogTnVtYmVyIG9mIGV2ZW50IGVudHJpZXMgcHJvY2Vzc2VkICovCisjZGVmaW5lIERCX0VRX05VTV9QT1BQRURfU0hJRlQJCSgxNikJLyogYml0cyAxNiAtIDI4ICovCisvKiBSZWFybSBiaXQgKi8KKyNkZWZpbmUgREJfRVFfUkVBUk1fU0hJRlQJCSgyOSkJLyogYml0IDI5ICovCisKKy8qKioqKioqKiogQ29tcGwgUSBkb29yIGJlbGwgKioqKioqKioqKioqKi8KKyNkZWZpbmUgREJfQ1FfT0ZGU0VUIAkJCTB4MTIwCisjZGVmaW5lIERCX0NRX1JJTkdfSURfTUFTSwkJMHgzRkYJLyogYml0cyAwIC0gOSAqLworLyogTnVtYmVyIG9mIGV2ZW50IGVudHJpZXMgcHJvY2Vzc2VkICovCisjZGVmaW5lIERCX0NRX05VTV9QT1BQRURfU0hJRlQJCSgxNikgCS8qIGJpdHMgMTYgLSAyOCAqLworLyogUmVhcm0gYml0ICovCisjZGVmaW5lIERCX0NRX1JFQVJNX1NISUZUCQkoMjkpIAkvKiBiaXQgMjkgKi8KKworI2RlZmluZSBHRVRfSFdJX0NPTlRST0xMRVJfV1MocGMpCShwYy0+cGh3aV9jdHJscikKKyNkZWZpbmUgSFdJX0dFVF9ERUZfQlVGUV9JRChwYykgKCgoc3RydWN0IGh3aV9jb250cm9sbGVyICopXAorCQkoR0VUX0hXSV9DT05UUk9MTEVSX1dTKHBjKSkpLT5kZWZhdWx0X3BkdV9kYXRhLmlkKQorI2RlZmluZSBIV0lfR0VUX0RFRl9IRFJRX0lEKHBjKSAoKChzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKilcCisJCShHRVRfSFdJX0NPTlRST0xMRVJfV1MocGMpKSktPmRlZmF1bHRfcGR1X2hkci5pZCkKKworI2RlZmluZSBQQUdFU19SRVFVSVJFRCh4KSBcCisJKCh4IDwgUEFHRV9TSVpFKSA/IDEgOiAgKCh4ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkUpKQorCitlbnVtIGJlX21lbV9lbnVtIHsKKwlIV0lfTUVNX0FERE5fQ09OVEVYVCwKKwlIV0lfTUVNX0NRLAorCUhXSV9NRU1fRVEsCisJSFdJX01FTV9XUkIsCisJSFdJX01FTV9XUkJILAorCUhXSV9NRU1fU0dMSCwJLyogNSAqLworCUhXSV9NRU1fU0dFLAorCUhXSV9NRU1fQVNZTkNfSEVBREVSX0JVRiwKKwlIV0lfTUVNX0FTWU5DX0RBVEFfQlVGLAorCUhXSV9NRU1fQVNZTkNfSEVBREVSX1JJTkcsCisJSFdJX01FTV9BU1lOQ19EQVRBX1JJTkcsCS8qIDEwICovCisJSFdJX01FTV9BU1lOQ19IRUFERVJfSEFORExFLAorCUhXSV9NRU1fQVNZTkNfREFUQV9IQU5ETEUsCisJSFdJX01FTV9BU1lOQ19QRFVfQ09OVEVYVCwKKwlJU0NTSV9NRU1fR0xPQkFMX0hFQURFUiwKKwlTRV9NRU1fTUFYICAJLyogMTUgKi8KK307CisKK3N0cnVjdCBiZV9idXNfYWRkcmVzczMyIHsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzc19sbzsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzc19oaTsKK307CisKK3N0cnVjdCBiZV9idXNfYWRkcmVzczY0IHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcmVzczsKK307CisKK3N0cnVjdCBiZV9idXNfYWRkcmVzcyB7CisJdW5pb24geworCQlzdHJ1Y3QgYmVfYnVzX2FkZHJlc3MzMiBhMzI7CisJCXN0cnVjdCBiZV9idXNfYWRkcmVzczY0IGE2NDsKKwl9IHU7Cit9OworCitzdHJ1Y3QgbWVtX2FycmF5IHsKKwlzdHJ1Y3QgYmVfYnVzX2FkZHJlc3MgYnVzX2FkZHJlc3M7CS8qIEJ1cyBhZGRyZXNzIG9mIGxvY2F0aW9uICovCisJdm9pZCAqdmlydHVhbF9hZGRyZXNzOwkJLyogdmlydHVhbCBhZGRyZXNzIHRvIHRoZSBsb2NhdGlvbiAqLworCXVuc2lnbmVkIGludCBzaXplOwkJLyogU2l6ZSByZXF1aXJlZCBieSBtZW1vcnkgYmxvY2sgKi8KK307CisKK3N0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciB7CisJdW5zaWduZWQgaW50IGluZGV4OwkvKiBJbmRleCBvZiB0aGlzIG1lbW9yeSBwYXJhbWV0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgY2F0ZWdvcnk7CS8qIHR5cGUgaW5kaWNhdGVzIGNhY2hlZC9ub24tY2FjaGVkICovCisJdW5zaWduZWQgaW50IG51bV9lbGVtZW50czsJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMKKwkJCQkJICogZGVzY3JpcHRvcgorCQkJCQkgKi8KKwl1bnNpZ25lZCBpbnQgYWxpZ25tZW50X21hc2s7CS8qIEFsaWdubWVudCBtYXNrIGZvciB0aGlzIGJsb2NrICovCisJdW5zaWduZWQgaW50IHNpemVfaW5fYnl0ZXM7CS8qIFNpemUgcmVxdWlyZWQgYnkgbWVtb3J5IGJsb2NrICovCisJc3RydWN0IG1lbV9hcnJheSAqbWVtX2FycmF5OworfTsKKworc3RydWN0IHNnbF9oYW5kbGUgeworCXVuc2lnbmVkIGludCBzZ2xfaW5kZXg7CisJc3RydWN0IGlzY3NpX3NnZSAqcGZyYWc7Cit9OworCitzdHJ1Y3QgaGJhX3BhcmFtZXRlcnMgeworCXVuc2lnbmVkIGludCBpb3NfcGVyX2N0cmw7CisJdW5zaWduZWQgaW50IGN4bnNfcGVyX2N0cmw7CisJdW5zaWduZWQgaW50IGFzeW5jcGR1c19wZXJfY3RybDsKKwl1bnNpZ25lZCBpbnQgaWNkc19wZXJfY3RybDsKKwl1bnNpZ25lZCBpbnQgbnVtX3NnZV9wZXJfaW87CisJdW5zaWduZWQgaW50IGRlZnBkdV9oZHJfc3o7CisJdW5zaWduZWQgaW50IGRlZnBkdV9kYXRhX3N6OworCXVuc2lnbmVkIGludCBudW1fY3FfZW50cmllczsKKwl1bnNpZ25lZCBpbnQgbnVtX2VxX2VudHJpZXM7CisJdW5zaWduZWQgaW50IHdyYnNfcGVyX2N4bjsKKwl1bnNpZ25lZCBpbnQgY3Jhc2htb2RlOworCXVuc2lnbmVkIGludCBoYmFfbnVtOworCisJdW5zaWduZWQgaW50IG1nbXRfd3Nfc3o7CisJdW5zaWduZWQgaW50IGh3aV93c19zejsKKworCXVuc2lnbmVkIGludCBldG87CisJdW5zaWduZWQgaW50IGxkdG87CisKKwl1bnNpZ25lZCBpbnQgZGJnX2ZsYWdzOworCXVuc2lnbmVkIGludCBudW1fY3huOworCisJdW5zaWduZWQgaW50IGVxX3RpbWVyOworCS8qKgorCSAqIFRoZXNlIGFyZSBjYWxjdWxhdGVkIGZyb20gb3RoZXIgcGFyYW1zLiBUaGV5J3JlIGhlcmUKKwkgKiBmb3IgZGVidWcgcHVycG9zZXMKKwkgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX21jY19wYWdlczsKKwl1bnNpZ25lZCBpbnQgbnVtX21jY19jcV9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbnVtX2NxX3BhZ2VzOworCXVuc2lnbmVkIGludCBudW1fZXFfcGFnZXM7CisKKwl1bnNpZ25lZCBpbnQgbnVtX2FzeW5jX3BkdV9idWZfcGFnZXM7CisJdW5zaWduZWQgaW50IG51bV9hc3luY19wZHVfYnVmX3NnbF9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbnVtX2FzeW5jX3BkdV9idWZfY3FfcGFnZXM7CisKKwl1bnNpZ25lZCBpbnQgbnVtX2FzeW5jX3BkdV9oZHJfcGFnZXM7CisJdW5zaWduZWQgaW50IG51bV9hc3luY19wZHVfaGRyX3NnbF9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbnVtX2FzeW5jX3BkdV9oZHJfY3FfcGFnZXM7CisKKwl1bnNpZ25lZCBpbnQgbnVtX3NnZTsKK307CisKK3N0cnVjdCBiZWlzY3NpX2hiYSB7CisJc3RydWN0IGhiYV9wYXJhbWV0ZXJzIHBhcmFtczsKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJdW5zaWduZWQgaW50IG1lbV9yZXFbU0VfTUVNX01BWF07CisJLyogUENJIEJBUiBtYXBwZWQgYWRkcmVzc2VzICovCisJdTggX19pb21lbSAqY3NyX3ZhOwkvKiBDU1IgKi8KKwl1OCBfX2lvbWVtICpkYl92YTsJLyogRG9vciAgQmVsbCAgKi8KKwl1OCBfX2lvbWVtICpwY2lfdmE7CS8qIFBDSSBDb25maWcgKi8KKwlzdHJ1Y3QgYmVfYnVzX2FkZHJlc3MgY3NyX3BhOwkvKiBDU1IgKi8KKwlzdHJ1Y3QgYmVfYnVzX2FkZHJlc3MgZGJfcGE7CS8qIENTUiAqLworCXN0cnVjdCBiZV9idXNfYWRkcmVzcyBwY2lfcGE7CS8qIENTUiAqLworCS8qIFBDSSByZXByZXNlbnRhdGlvbiBvZiBvdXIgSEJBICovCisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwl1bnNpZ25lZCBpbnQgc3RhdGU7CisJdW5zaWduZWQgc2hvcnQgYXNpY19yZXZpc2lvbjsKKwlzdHJ1Y3QgYmxrX2lvcG9sbAlpb3BvbGw7CisJc3RydWN0IGJlX21lbV9kZXNjcmlwdG9yICppbml0X21lbTsKKworCXVuc2lnbmVkIHNob3J0IGlvX3NnbF9hbGxvY19pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCBpb19zZ2xfZnJlZV9pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCBpb19zZ2xfaG5kbF9hdmJsOworCXN0cnVjdCBzZ2xfaGFuZGxlICoqaW9fc2dsX2huZGxfYmFzZTsKKworCXVuc2lnbmVkIHNob3J0IGVoX3NnbF9hbGxvY19pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCBlaF9zZ2xfZnJlZV9pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCBlaF9zZ2xfaG5kbF9hdmJsOworCXN0cnVjdCBzZ2xfaGFuZGxlICoqZWhfc2dsX2huZGxfYmFzZTsKKwlzcGlubG9ja190IGlvX3NnbF9sb2NrOworCXNwaW5sb2NrX3QgbWdtdF9zZ2xfbG9jazsKKwlzcGlubG9ja190IGlzcl9sb2NrOworCXVuc2lnbmVkIGludCBhZ2U7CisJdW5zaWduZWQgc2hvcnQgYXZsYmxfY2lkczsKKwl1bnNpZ25lZCBzaG9ydCBjaWRfYWxsb2M7CisJdW5zaWduZWQgc2hvcnQgY2lkX2ZyZWU7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqY29ubl90YWJsZVtCRTJfTUFYX1NFU1NJT05TICogMl07CisJc3RydWN0IGxpc3RfaGVhZCBoYmFfcXVldWU7CisJdW5zaWduZWQgc2hvcnQgKmNpZF9hcnJheTsKKwlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKiplcF9hcnJheTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgeworCQkvKioKKwkJICogZ3JvdXAgdG9nZXRoZXIgc2luY2UgdGhleSBhcmUgdXNlZCBtb3N0IGZyZXF1ZW50bHkKKwkJICogZm9yIGNpZCB0byBjcmkgY29udmVyc2lvbgorCQkgKi8KKwkJdW5zaWduZWQgaW50IGlzY3NpX2NpZF9zdGFydDsKKwkJdW5zaWduZWQgaW50IHBoeXNfcG9ydDsKKworCQl1bnNpZ25lZCBpbnQgaXNyX29mZnNldDsKKwkJdW5zaWduZWQgaW50IGlzY3NpX2ljZF9zdGFydDsKKwkJdW5zaWduZWQgaW50IGlzY3NpX2NpZF9jb3VudDsKKwkJdW5zaWduZWQgaW50IGlzY3NpX2ljZF9jb3VudDsKKwkJdW5zaWduZWQgaW50IHBjaV9mdW5jdGlvbjsKKworCQl1bnNpZ25lZCBzaG9ydCBjaWRfYWxsb2M7CisJCXVuc2lnbmVkIHNob3J0IGNpZF9mcmVlOworCQl1bnNpZ25lZCBzaG9ydCBhdmxibF9jaWRzOworCQlzcGlubG9ja190IGNpZF9sb2NrOworCX0gZndfY29uZmlnOworCisJdTggbWFjX2FkZHJlc3NbRVRIX0FMRU5dOworCXVuc2lnbmVkIHNob3J0IHRvZG9fY3E7CisJdW5zaWduZWQgc2hvcnQgdG9kb19tY2NfY3E7CisJY2hhciB3cV9uYW1lWzIwXTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CS8qIFRoZSBhY3R1YWsgd29yayBxdWV1ZSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2NxczsJLyogVGhlIHdvcmsgYmVpbmcgcXVldWVkICovCisJc3RydWN0IGJlX2N0cmxfaW5mbyBjdHJsOworfTsKKworc3RydWN0IGJlaXNjc2lfc2Vzc2lvbiB7CisJc3RydWN0IHBjaV9wb29sICpiaHNfcG9vbDsKK307CisKKy8qKgorICogc3RydWN0IGJlaXNjc2lfY29ubiAtIGlzY3NpIGNvbm5lY3Rpb24gc3RydWN0dXJlCisgKi8KK3N0cnVjdCBiZWlzY3NpX2Nvbm4geworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKwl1MzIgZXhwX3N0YXRzbjsKKwl1MzIgYmVpc2NzaV9jb25uX2NpZDsKKwlzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqZXA7CisJdW5zaWduZWQgc2hvcnQgbG9naW5faW5fcHJvZ3Jlc3M7CisJc3RydWN0IHNnbF9oYW5kbGUgKnBsb2dpbl9zZ2xfaGFuZGxlOworCXN0cnVjdCBiZWlzY3NpX3Nlc3Npb24gKmJlaXNjc2lfc2VzczsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIGNoaXAgKi8KK3N0cnVjdCBwZHVfZGF0YV9vdXQgeworCXUzMiBkd1sxMl07Cit9OworLyoqCisgKiBQc2V1ZG8gYW1hcCBkZWZpbml0aW9uIGluIHdoaWNoIGVhY2ggYml0IG9mIHRoZSBhY3R1YWwgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAqIGFzIGEgYnl0ZTogdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9wZHVfZGF0YV9vdXQgeworCXU4IG9wY29kZVs2XTsJCS8qIG9wY29kZSAqLworCXU4IHJzdmQwWzJdOwkJLyogc2hvdWxkIGJlIDAgKi8KKwl1OCByc3ZkMVs3XTsKKwl1OCBmaW5hbF9iaXQ7CQkvKiBGIGJpdCAqLworCXU4IHJzdmQyWzE2XTsKKwl1OCBhaHNfbGVuZ3RoWzhdOwkvKiBubyBBSFMgKi8KKwl1OCBkYXRhX2xlbl9oaVs4XTsKKwl1OCBkYXRhX2xlbl9sb1sxNl07CS8qIERhdGFTZWdtZW50TGVuZ3RoICovCisJdTggbHVuWzY0XTsKKwl1OCBpdHRbMzJdOwkJLyogSVRUOyBpbml0aWF0b3IgdGFzayB0YWcgKi8KKwl1OCB0dHRbMzJdOwkJLyogVFRUOyB2YWxpZCBmb3IgUjJUIG9yIDB4ZmZmZmZmZmYgKi8KKwl1OCByc3ZkM1szMl07CisJdTggZXhwX3N0YXRfc25bMzJdOworCXU4IHJzdmQ0WzMyXTsKKwl1OCBkYXRhX3NuWzMyXTsKKwl1OCBidWZmZXJfb2Zmc2V0WzMyXTsKKwl1OCByc3ZkNVszMl07Cit9OworCitzdHJ1Y3QgYmVfY21kX2JocyB7CisJc3RydWN0IGlzY3NpX2NtZCBpc2NzaV9oZHI7CisJdW5zaWduZWQgY2hhciBwYWQxWzE2XTsKKwlzdHJ1Y3QgcGR1X2RhdGFfb3V0IGlzY3NpX2RhdGFfcGR1OworCXVuc2lnbmVkIGNoYXIgcGFkMltCRV9TRU5TRV9JTkZPX1NJWkUgLQorCQkJc2l6ZW9mKHN0cnVjdCBwZHVfZGF0YV9vdXQpXTsKK307CisKK3N0cnVjdCBiZWlzY3NpX2lvX3Rhc2sgeworCXN0cnVjdCB3cmJfaGFuZGxlICpwd3JiX2hhbmRsZTsKKwlzdHJ1Y3Qgc2dsX2hhbmRsZSAqcHNnbF9oYW5kbGU7CisJc3RydWN0IGJlaXNjc2lfY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtbmQ7CisJdW5zaWduZWQgaW50IGNtZF9zbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgY2lkOworCXVuc2lnbmVkIHNob3J0IGhlYWRlcl9sZW47CisKKwlzdHJ1Y3QgYmVfY21kX2JocyAqY21kX2JoczsKKwlzdHJ1Y3QgYmVfYnVzX2FkZHJlc3MgYmhzX3BhOworCXVuc2lnbmVkIHNob3J0IGJoc19sZW47Cit9OworCitzdHJ1Y3QgYmVfbm9uaW9fYmhzIHsKKwlzdHJ1Y3QgaXNjc2lfaGRyIGlzY3NpX2hkcjsKKwl1bnNpZ25lZCBjaGFyIHBhZDFbMTZdOworCXN0cnVjdCBwZHVfZGF0YV9vdXQgaXNjc2lfZGF0YV9wZHU7CisJdW5zaWduZWQgY2hhciBwYWQyW0JFX1NFTlNFX0lORk9fU0laRSAtCisJCQlzaXplb2Yoc3RydWN0IHBkdV9kYXRhX291dCldOworfTsKKworc3RydWN0IGJlX3N0YXR1c19iaHMgeworCXN0cnVjdCBpc2NzaV9jbWQgaXNjc2lfaGRyOworCXVuc2lnbmVkIGNoYXIgcGFkMVsxNl07CisJLyoqCisJICogVGhlIHBsdXMgMiBiZWxvdyBpcyB0byBob2xkIHRoZSBzZW5zZSBpbmZvIGxlbmd0aCB0aGF0IGdldHMKKwkgKiBETUEnZWQgYnkgUnhVTFAKKwkgKi8KKwl1bnNpZ25lZCBjaGFyIHNlbnNlX2luZm9bQkVfU0VOU0VfSU5GT19TSVpFXTsKK307CisKK3N0cnVjdCBpc2NzaV9zZ2UgeworCXUzMiBkd1s0XTsKK307CisKKy8qKgorICogUHNldWRvIGFtYXAgZGVmaW5pdGlvbiBpbiB3aGljaCBlYWNoIGJpdCBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkCisgKiBhcyBhIGJ5dGU6IHVzZWQgdG8gY2FsY3VsYXRlIG9mZnNldC9zaGlmdC9tYXNrIG9mIGVhY2ggZmllbGQKKyAqLworc3RydWN0IGFtYXBfaXNjc2lfc2dlIHsKKwl1OCBhZGRyX2hpWzMyXTsKKwl1OCBhZGRyX2xvWzMyXTsKKwl1OCBzZ2Vfb2Zmc2V0WzIyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQwWzldOwkJLyogRFdPUkQgMiAqLworCXU4IGxhc3Rfc2dlOwkJLyogRFdPUkQgMiAqLworCXU4IGxlblsxN107CQkvKiBEV09SRCAzICovCisJdTggcnN2ZDFbMTVdOwkJLyogRFdPUkQgMyAqLworfTsKKworc3RydWN0IGJlaXNjc2lfb2ZmbG9hZF9wYXJhbXMgeworCXUzMiBkd1s1XTsKK307CisKKyNkZWZpbmUgT0ZGTERfUEFSQU1TX0VSTAkweDAwMDAwMDAzCisjZGVmaW5lIE9GRkxEX1BBUkFNU19EREUJMHgwMDAwMDAwNAorI2RlZmluZSBPRkZMRF9QQVJBTVNfSERFCTB4MDAwMDAwMDgKKyNkZWZpbmUgT0ZGTERfUEFSQU1TX0lSMlQJMHgwMDAwMDAxMAorI2RlZmluZSBPRkZMRF9QQVJBTVNfSU1ECTB4MDAwMDAwMjAKKworLyoqCisgKiBQc2V1ZG8gYW1hcCBkZWZpbml0aW9uIGluIHdoaWNoIGVhY2ggYml0IG9mIHRoZSBhY3R1YWwgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAqIGFzIGEgYnl0ZTogdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9iZWlzY3NpX29mZmxvYWRfcGFyYW1zIHsKKwl1OCBtYXhfYnVyc3RfbGVuZ3RoWzMyXTsKKwl1OCBtYXhfc2VuZF9kYXRhX3NlZ21lbnRfbGVuZ3RoWzMyXTsKKwl1OCBmaXJzdF9idXJzdF9sZW5ndGhbMzJdOworCXU4IGVybFsyXTsKKwl1OCBkZGVbMV07CisJdTggaGRlWzFdOworCXU4IGlyMnRbMV07CisJdTggaW1kWzFdOworCXU4IHBhZFsyNl07CisJdTggZXhwX3N0YXRzblszMl07Cit9OworCisvKiB2b2lkIGh3aV9jb21wbGV0ZV9kcnZyX21zZ3Moc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uLAorCQlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHN0cnVjdCBzb2xfY3FlICpwc29sKTsqLworCitzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXN0cnVjdCBiZV9idXNfYWRkcmVzcyBwYTsKKwl2b2lkICpwYnVmZmVyOworCXVuc2lnbmVkIGludCBjb25zdW1lZDsKKwl1bnNpZ25lZCBjaGFyIGluZGV4OworCXVuc2lnbmVkIGNoYXIgaXNfaGVhZGVyOworCXVuc2lnbmVkIHNob3J0IGNyaTsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9sZW47Cit9OworCitzdHJ1Y3QgaHdpX2FzeW5jX2VudHJ5IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGhkcl9yZWNlaXZlZDsKKwkJdW5zaWduZWQgY2hhciBoZHJfbGVuOworCQl1bnNpZ25lZCBzaG9ydCBieXRlc19yZWNlaXZlZDsKKwkJdW5zaWduZWQgaW50IGJ5dGVzX25lZWRlZDsKKwkJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCX0gd2FpdF9xdWV1ZTsKKworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZGVyX2J1c3lfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRhdGFfYnVzeV9saXN0OworfTsKKworI2RlZmluZSBCRV9NSU5fQVNZTkNfRU5UUklFUyAxMjgKKworc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCB7CisJc3RydWN0IHsKKwkJc3RydWN0IGJlX2J1c19hZGRyZXNzIHBhX2Jhc2U7CisJCXZvaWQgKnZhX2Jhc2U7CisJCXZvaWQgKnJpbmdfYmFzZTsKKwkJc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKmhhbmRsZV9iYXNlOworCisJCXVuc2lnbmVkIGludCBob3N0X3dyaXRlX3B0cjsKKwkJdW5zaWduZWQgaW50IGVwX3JlYWRfcHRyOworCQl1bnNpZ25lZCBpbnQgd3JpdGFibGVzOworCisJCXVuc2lnbmVkIGludCBmcmVlX2VudHJpZXM7CisJCXVuc2lnbmVkIGludCBidXN5X2VudHJpZXM7CisJCXVuc2lnbmVkIGludCBidWZmZXJfc2l6ZTsKKwkJdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOworCisJCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9saXN0OworCX0gYXN5bmNfaGVhZGVyOworCisJc3RydWN0IHsKKwkJc3RydWN0IGJlX2J1c19hZGRyZXNzIHBhX2Jhc2U7CisJCXZvaWQgKnZhX2Jhc2U7CisJCXZvaWQgKnJpbmdfYmFzZTsKKwkJc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKmhhbmRsZV9iYXNlOworCisJCXVuc2lnbmVkIGludCBob3N0X3dyaXRlX3B0cjsKKwkJdW5zaWduZWQgaW50IGVwX3JlYWRfcHRyOworCQl1bnNpZ25lZCBpbnQgd3JpdGFibGVzOworCisJCXVuc2lnbmVkIGludCBmcmVlX2VudHJpZXM7CisJCXVuc2lnbmVkIGludCBidXN5X2VudHJpZXM7CisJCXVuc2lnbmVkIGludCBidWZmZXJfc2l6ZTsKKwkJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2xpc3Q7CisJCXVuc2lnbmVkIGludCBudW1fZW50cmllczsKKwl9IGFzeW5jX2RhdGE7CisKKwkvKioKKwkgKiBUaGlzIGlzIGEgdmFyeWluZyBzaXplIGxpc3QhIERvIG5vdCBhZGQgYW55dGhpbmcKKwkgKiBhZnRlciB0aGlzIGVudHJ5ISEKKwkgKi8KKwlzdHJ1Y3QgaHdpX2FzeW5jX2VudHJ5IGFzeW5jX2VudHJ5W0JFX01JTl9BU1lOQ19FTlRSSUVTXTsKK307CisKKyNkZWZpbmUgUERVQ1FFX0NPREVfTUFTSwkweDAwMDAwMDNGCisjZGVmaW5lIFBEVUNRRV9EUExfTUFTSwkJMHhGRkZGMDAwMAorI2RlZmluZSBQRFVDUUVfSU5ERVhfTUFTSwkweDAwMDBGRkZGCisKK3N0cnVjdCBpX3RfZHBkdV9jcWUgeworCXUzMiBkd1s0XTsKK30gX19wYWNrZWQ7CisKKy8qKgorICogUHNldWRvIGFtYXAgZGVmaW5pdGlvbiBpbiB3aGljaCBlYWNoIGJpdCBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkCisgKiBhcyBhIGJ5dGU6IHVzZWQgdG8gY2FsY3VsYXRlIG9mZnNldC9zaGlmdC9tYXNrIG9mIGVhY2ggZmllbGQKKyAqLworc3RydWN0IGFtYXBfaV90X2RwZHVfY3FlIHsKKwl1OCBkYl9hZGRyX2hpWzMyXTsKKwl1OCBkYl9hZGRyX2xvWzMyXTsKKwl1OCBjb2RlWzZdOworCXU4IGNpZFsxMF07CisJdTggZHBsWzE2XTsKKwl1OCBpbmRleFsxNl07CisJdTggbnVtX2NvbnNbMTBdOworCXU4IHJzdmQwWzRdOworCXU4IGZpbmFsOworCXU4IHZhbGlkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBDUUVfVkFMSURfTUFTSwkweDgwMDAwMDAwCisjZGVmaW5lIENRRV9DT0RFX01BU0sJMHgwMDAwMDAzRgorI2RlZmluZSBDUUVfQ0lEX01BU0sJMHgwMDAwRkZDMAorCisjZGVmaW5lIEVRRV9WQUxJRF9NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIEVRRV9NQUpPUkNPREVfTUFTSwkweDAwMDAwMDBFCisjZGVmaW5lIEVRRV9SRVNJRF9NQVNLCQkweEZGRkYwMDAwCisKK3N0cnVjdCBiZV9lcV9lbnRyeSB7CisJdTMyIGR3WzFdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBQc2V1ZG8gYW1hcCBkZWZpbml0aW9uIGluIHdoaWNoIGVhY2ggYml0IG9mIHRoZSBhY3R1YWwgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAqIGFzIGEgYnl0ZTogdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9lcV9lbnRyeSB7CisJdTggdmFsaWQ7CQkvKiBEV09SRCAwICovCisJdTggbWFqb3JfY29kZVszXTsJLyogRFdPUkQgMCAqLworCXU4IG1pbm9yX2NvZGVbMTJdOwkvKiBEV09SRCAwICovCisJdTggcmVzb3VyY2VfaWRbMTZdOwkvKiBEV09SRCAwICovCisKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjcV9kYiB7CisJdTMyIGR3WzFdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBQc2V1ZG8gYW1hcCBkZWZpbml0aW9uIGluIHdoaWNoIGVhY2ggYml0IG9mIHRoZSBhY3R1YWwgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAqIGFzIGEgYnl0ZTogdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9jcV9kYiB7CisJdTggcWlkWzEwXTsKKwl1OCBldmVudFsxXTsKKwl1OCByc3ZkMFs1XTsKKwl1OCBudW1fcG9wcGVkWzEzXTsKKwl1OCByZWFybVsxXTsKKwl1OCByc3ZkMVsyXTsKK30gX19wYWNrZWQ7CisKK3ZvaWQgYmVpc2NzaV9wcm9jZXNzX2VxKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CisKKworc3RydWN0IGlzY3NpX3dyYiB7CisJdTMyIGR3WzE2XTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgV1JCX1RZUEVfTUFTSyAweEYwMDAwMDAwCisKKy8qKgorICogUHNldWRvIGFtYXAgZGVmaW5pdGlvbiBpbiB3aGljaCBlYWNoIGJpdCBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkCisgKiBhcyBhIGJ5dGU6IHVzZWQgdG8gY2FsY3VsYXRlIG9mZnNldC9zaGlmdC9tYXNrIG9mIGVhY2ggZmllbGQKKyAqLworc3RydWN0IGFtYXBfaXNjc2lfd3JiIHsKKwl1OCBsdW5bMTRdOwkJLyogRFdPUkQgMCAqLworCXU4IGx0OwkJCS8qIERXT1JEIDAgKi8KKwl1OCBpbnZsZDsJCS8qIERXT1JEIDAgKi8KKwl1OCB3cmJfaWR4WzhdOwkJLyogRFdPUkQgMCAqLworCXU4IGRzcDsJCQkvKiBEV09SRCAwICovCisJdTggZG1zZzsJCS8qIERXT1JEIDAgKi8KKwl1OCB1bmRyX3J1bjsJCS8qIERXT1JEIDAgKi8KKwl1OCBvdmVyX3J1bjsJCS8qIERXT1JEIDAgKi8KKwl1OCB0eXBlWzRdOwkJLyogRFdPUkQgMCAqLworCXU4IHB0cjJuZXh0d3JiWzhdOwkvKiBEV09SRCAxICovCisJdTggcjJ0X2V4cF9kdGxbMjRdOwkvKiBEV09SRCAxICovCisJdTggc2dsX2ljZF9pZHhbMTJdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDBbMjBdOwkJLyogRFdPUkQgMiAqLworCXU4IGV4cF9kYXRhX3NuWzMyXTsJLyogRFdPUkQgMyAqLworCXU4IGlzY3NpX2Joc19hZGRyX2hpWzMyXTsJLyogRFdPUkQgNCAqLworCXU4IGlzY3NpX2Joc19hZGRyX2xvWzMyXTsJLyogRFdPUkQgNSAqLworCXU4IGNtZHNuX2l0dFszMl07CS8qIERXT1JEIDYgKi8KKwl1OCBkaWZfcmVmX3RhZ1szMl07CS8qIERXT1JEIDcgKi8KKwl1OCBzZ2UwX2FkZHJfaGlbMzJdOwkvKiBEV09SRCA4ICovCisJdTggc2dlMF9hZGRyX2xvWzMyXTsJLyogRFdPUkQgOSAgKi8KKwl1OCBzZ2UwX29mZnNldFsyMl07CS8qIERXT1JEIDEwICovCisJdTggcGJzOwkJCS8qIERXT1JEIDEwICovCisJdTggZGlmX21vZGVbMl07CQkvKiBEV09SRCAxMCAqLworCXU4IHJzdmQxWzZdOwkJLyogRFdPUkQgMTAgKi8KKwl1OCBzZ2UwX2xhc3Q7CQkvKiBEV09SRCAxMCAqLworCXU4IHNnZTBfbGVuWzE3XTsJLyogRFdPUkQgMTEgKi8KKwl1OCBkaWZfbWV0YV90YWdbMTRdOwkvKiBEV09SRCAxMSAqLworCXU4IHNnZTBfaW5fZGRyOwkJLyogRFdPUkQgMTEgKi8KKwl1OCBzZ2UxX2FkZHJfaGlbMzJdOwkvKiBEV09SRCAxMiAqLworCXU4IHNnZTFfYWRkcl9sb1szMl07CS8qIERXT1JEIDEzICovCisJdTggc2dlMV9yMnRfb2Zmc2V0WzIyXTsJLyogRFdPUkQgMTQgKi8KKwl1OCByc3ZkMls5XTsJCS8qIERXT1JEIDE0ICovCisJdTggc2dlMV9sYXN0OwkJLyogRFdPUkQgMTQgKi8KKwl1OCBzZ2UxX2xlblsxN107CS8qIERXT1JEIDE1ICovCisJdTggcmVmX3NnbF9pY2RfaWR4WzEyXTsJLyogRFdPUkQgMTUgKi8KKwl1OCByc3ZkM1syXTsJCS8qIERXT1JEIDE1ICovCisJdTggc2dlMV9pbl9kZHI7CQkvKiBEV09SRCAxNSAqLworCit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd3JiX2hhbmRsZSAqYWxsb2Nfd3JiX2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHVuc2lnbmVkIGludCBjaWQsCisJCQkJICAgIGludCBpbmRleCk7Cit2b2lkCitmcmVlX21nbXRfc2dsX2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHN0cnVjdCBzZ2xfaGFuZGxlICpwc2dsX2hhbmRsZSk7CisKK3N0cnVjdCBwZHVfbm9wX291dCB7CisJdTMyIGR3WzEyXTsKK307CisKKy8qKgorICogUHNldWRvIGFtYXAgZGVmaW5pdGlvbiBpbiB3aGljaCBlYWNoIGJpdCBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkCisgKiBhcyBhIGJ5dGU6IHVzZWQgdG8gY2FsY3VsYXRlIG9mZnNldC9zaGlmdC9tYXNrIG9mIGVhY2ggZmllbGQKKyAqLworc3RydWN0IGFtYXBfcGR1X25vcF9vdXQgeworCXU4IG9wY29kZVs2XTsJCS8qIG9wY29kZSAweDAwICovCisJdTggaV9iaXQ7CQkvKiBJIEJpdCAqLworCXU4IHhfYml0OwkJLyogcmVzZXJ2ZWQ7IHNob3VsZCBiZSAwICovCisJdTggZnBfYml0X2ZpbGxlcjFbN107CisJdTggZl9iaXQ7CQkvKiBhbHdheXMgMSAqLworCXU4IHJlc2VydmVkMVsxNl07CisJdTggYWhzX2xlbmd0aFs4XTsJLyogbm8gQUhTICovCisJdTggZGF0YV9sZW5faGlbOF07CisJdTggZGF0YV9sZW5fbG9bMTZdOwkvKiBEYXRhU2VnbWVudExlbmd0aCAqLworCXU4IGx1bls2NF07CisJdTggaXR0WzMyXTsJCS8qIGluaXRpYXRvciBpZCBmb3IgcGluZyBvciAweGZmZmZmZmZmICovCisJdTggdHR0WzMyXTsJCS8qIHRhcmdldCBpZCBmb3IgcGluZyBvciAweGZmZmZmZmZmICovCisJdTggY21kX3NuWzMyXTsKKwl1OCBleHBfc3RhdF9zblszMl07CisJdTggcmVzZXJ2ZWQ1WzEyOF07Cit9OworCisjZGVmaW5lIFBEVUJBU0VfT1BDT0RFX01BU0sJMHgwMDAwMDAzRgorI2RlZmluZSBQRFVCQVNFX0RBVEFMRU5ISV9NQVNLCTB4MDAwMEZGMDAKKyNkZWZpbmUgUERVQkFTRV9EQVRBTEVOTE9fTUFTSwkweEZGRkYwMDAwCisKK3N0cnVjdCBwZHVfYmFzZSB7CisJdTMyIGR3WzE2XTsKK30gX19wYWNrZWQ7CisKKy8qKgorICogUHNldWRvIGFtYXAgZGVmaW5pdGlvbiBpbiB3aGljaCBlYWNoIGJpdCBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkCisgKiBhcyBhIGJ5dGU6IHVzZWQgdG8gY2FsY3VsYXRlIG9mZnNldC9zaGlmdC9tYXNrIG9mIGVhY2ggZmllbGQKKyAqLworc3RydWN0IGFtYXBfcGR1X2Jhc2UgeworCXU4IG9wY29kZVs2XTsKKwl1OCBpX2JpdDsJCS8qIGltbWVkaWF0ZSBiaXQgKi8KKwl1OCB4X2JpdDsJCS8qIHJlc2VydmVkLCBhbHdheXMgMCAqLworCXU4IHJlc2VydmVkMVsyNF07CS8qIG9wY29kZS1zcGVjaWZpYyBmaWVsZHMgKi8KKwl1OCBhaHNfbGVuZ3RoWzhdOwkvKiBsZW5ndGggdW5pdHMgaXMgNCBieXRlIHdvcmRzICovCisJdTggZGF0YV9sZW5faGlbOF07CisJdTggZGF0YV9sZW5fbG9bMTZdOwkvKiBEYXRhc2VnbWVudExlbmd0aCAqLworCXU4IGx1bls2NF07CQkvKiBsdW4gb3Igb3Bjb2RlLXNwZWNpZmljIGZpZWxkcyAqLworCXU4IGl0dFszMl07CQkvKiBpbml0aWF0b3IgdGFzayB0YWcgKi8KKwl1OCByZXNlcnZlZDRbMjI0XTsKK307CisKK3N0cnVjdCBpc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiIHsKKwl1MzIgZHdbMTZdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBQc2V1ZG8gYW1hcCBkZWZpbml0aW9uIGluIHdoaWNoIGVhY2ggYml0IG9mIHRoZSBhY3R1YWwgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAqIGFzIGEgYnl0ZTogdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiIHsKKwl1OCBsdW5bMTRdOwkJLyogRFdPUkQgMCAqLworCXU4IGx0OwkJCS8qIERXT1JEIDAgKi8KKwl1OCBpbnZsZDsJCS8qIERXT1JEIDAgKi8KKwl1OCB3cmJfaWR4WzhdOwkJLyogRFdPUkQgMCAqLworCXU4IGRzcDsJCQkvKiBEV09SRCAwICovCisJdTggZG1zZzsJCS8qIERXT1JEIDAgKi8KKwl1OCB1bmRyX3J1bjsJCS8qIERXT1JEIDAgKi8KKwl1OCBvdmVyX3J1bjsJCS8qIERXT1JEIDAgKi8KKwl1OCB0eXBlWzRdOwkJLyogRFdPUkQgMCAqLworCXU4IHB0cjJuZXh0d3JiWzhdOwkvKiBEV09SRCAxICovCisJdTggbWF4X2J1cnN0X2xlbmd0aFsxOV07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMFs1XTsJCS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVsxNV07CQkvKiBEV09SRCAyICovCisJdTggbWF4X3NlbmRfZGF0YV9zZWdtZW50X2xlbmd0aFsxN107CS8qIERXT1JEIDIgKi8KKwl1OCBmaXJzdF9idXJzdF9sZW5ndGhbMTRdOwkvKiBEV09SRCAzICovCisJdTggcnN2ZDJbMl07CQkvKiBEV09SRCAzICovCisJdTggdHhfd3JiaW5kZXhfZHJ2X21zZ1s4XTsJLyogRFdPUkQgMyAqLworCXU4IHJzdmQzWzVdOwkJLyogRFdPUkQgMyAqLworCXU4IHNlc3Npb25fc3RhdGVbM107CS8qIERXT1JEIDMgKi8KKwl1OCByc3ZkNFsxNl07CQkvKiBEV09SRCA0ICovCisJdTggdHhfanVtYm87CQkvKiBEV09SRCA0ICovCisJdTggaGRlOwkJCS8qIERXT1JEIDQgKi8KKwl1OCBkZGU7CQkJLyogRFdPUkQgNCAqLworCXU4IGVybFsyXTsJCS8qIERXT1JEIDQgKi8KKwl1OCBkb21haW5faWRbNV07CQkvKiBEV09SRCA0ICovCisJdTggbW9kZTsJCS8qIERXT1JEIDQgKi8KKwl1OCBpbWQ7CQkJLyogRFdPUkQgNCAqLworCXU4IGlyMnQ7CQkvKiBEV09SRCA0ICovCisJdTggbm90cHJlZGJscVsyXTsJLyogRFdPUkQgNCAqLworCXU4IGNvbXBsdG9uYWNrOwkJLyogRFdPUkQgNCAqLworCXU4IHN0YXRfc25bMzJdOwkJLyogRFdPUkQgNSAqLworCXU4IHBhZF9idWZmZXJfYWRkcl9oaVszMl07CS8qIERXT1JEIDYgKi8KKwl1OCBwYWRfYnVmZmVyX2FkZHJfbG9bMzJdOwkvKiBEV09SRCA3ICovCisJdTggcGFkX2FkZHJfaGlbMzJdOwkvKiBEV09SRCA4ICovCisJdTggcGFkX2FkZHJfbG9bMzJdOwkvKiBEV09SRCA5ICovCisJdTggcnN2ZDVbMzJdOwkJLyogRFdPUkQgMTAgKi8KKwl1OCByc3ZkNlszMl07CQkvKiBEV09SRCAxMSAqLworCXU4IHJzdmQ3WzMyXTsJCS8qIERXT1JEIDEyICovCisJdTggcnN2ZDhbMzJdOwkJLyogRFdPUkQgMTMgKi8KKwl1OCByc3ZkOVszMl07CQkvKiBEV09SRCAxNCAqLworCXU4IHJzdmQxMFszMl07CQkvKiBEV09SRCAxNSAqLworCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYmVfcmluZyB7CisJdTMyIHBhZ2VzOwkJLyogcXVldWUgc2l6ZSBpbiBwYWdlcyAqLworCXUzMiBpZDsJCQkvKiBxdWV1ZSBpZCBhc3NpZ25lZCBieSBiZWtsaWIgKi8KKwl1MzIgbnVtOwkJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHF1ZXVlICovCisJdTMyIGNpZHg7CQkvKiBjb25zdW1lciBpbmRleCAqLworCXUzMiBwaWR4OwkJLyogcHJvZHVjZXIgaW5kZXggLS0gbm90IHVzZWQgYnkgbW9zdCByaW5ncyAqLworCXUzMiBpdGVtX3NpemU7CQkvKiBzaXplIGluIGJ5dGVzIG9mIG9uZSBvYmplY3QgKi8KKworCXZvaWQgKnZhOwkJLyogVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcmluZy4gIFRoaXMKKwkJCQkgKiBzaG91bGQgYmUgbGFzdCB0byBhbGxvdyAzMiAmIDY0IGJpdCBkZWJ1Z2dlcgorCQkJCSAqIGV4dGVuc2lvbnMgdG8gd29yay4KKwkJCQkgKi8KK307CisKK3N0cnVjdCBod2lfd3JiX2NvbnRleHQgeworCXN0cnVjdCBsaXN0X2hlYWQgd3JiX2hhbmRsZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgd3JiX2hhbmRsZV9kcnZyX2xpc3Q7CisJc3RydWN0IHdyYl9oYW5kbGUgKipwd3JiX2hhbmRsZV9iYXNlOworCXN0cnVjdCB3cmJfaGFuZGxlICoqcHdyYl9oYW5kbGVfYmFzZXN0ZDsKKwlzdHJ1Y3QgaXNjc2lfd3JiICpwbGFzdF93cmI7CisJdW5zaWduZWQgc2hvcnQgYWxsb2NfaW5kZXg7CisJdW5zaWduZWQgc2hvcnQgZnJlZV9pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCB3cmJfaGFuZGxlc19hdmFpbGFibGU7CisJdW5zaWduZWQgc2hvcnQgY2lkOworfTsKKworc3RydWN0IGh3aV9jb250cm9sbGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlvX3NnbF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZWhfc2dsX2xpc3Q7CisJc3RydWN0IHNnbF9oYW5kbGUgKnBzZ2xfaGFuZGxlX2Jhc2U7CisJdW5zaWduZWQgaW50IHdyYl9tZW1faW5kZXg7CisKKwlzdHJ1Y3QgaHdpX3dyYl9jb250ZXh0IHdyYl9jb250ZXh0W0JFMl9NQVhfU0VTU0lPTlMgKiAyXTsKKwlzdHJ1Y3QgbWNjX3dyYiAqcG1jY193cmJfYmFzZTsKKwlzdHJ1Y3QgYmVfcmluZyBkZWZhdWx0X3BkdV9oZHI7CisJc3RydWN0IGJlX3JpbmcgZGVmYXVsdF9wZHVfZGF0YTsKKwlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2N0eHQ7CisJdW5zaWduZWQgc2hvcnQgY3FfZXJyb3JzW0NYTl9LSUxMRURfQ01ORF9EQVRBX05PVF9PTl9TQU1FX0NPTk5dOworfTsKKworZW51bSBod2hfdHlwZV9lbnVtIHsKKwlIV0hfVFlQRV9JTyA9IDEsCisJSFdIX1RZUEVfTE9HT1VUID0gMiwKKwlIV0hfVFlQRV9UTUYgPSAzLAorCUhXSF9UWVBFX05PUCA9IDQsCisJSFdIX1RZUEVfSU9fUkQgPSA1LAorCUhXSF9UWVBFX0xPR0lOID0gMTEsCisJSFdIX1RZUEVfSU5WQUxJRCA9IDB4RkZGRkZGRkYKK307CisKK3N0cnVjdCB3cmJfaGFuZGxlIHsKKwllbnVtIGh3aF90eXBlX2VudW0gdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCB3cmJfaW5kZXg7CisJdW5zaWduZWQgc2hvcnQgbnh0X3dyYl9pbmRleDsKKworCXN0cnVjdCBpc2NzaV90YXNrICpwaW9faGFuZGxlOworCXN0cnVjdCBpc2NzaV93cmIgKnB3cmI7Cit9OworCitzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5IHsKKwlzdHJ1Y3QgYmVfZXFfb2JqIGJlX2VxOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGJlX2NxOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGJlX21jY19jcTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBiZV9tY2M7CisKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBiZV9kZWZfaGRycTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBiZV9kZWZfZGF0YXE7CisKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBiZV93cmJxW0JFMl9NQVhfU0VTU0lPTlNdOworCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKnBiZV9tY2NfY29udGV4dDsKKworCXN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHg7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZTY0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jCkBAIC0wLDAgKzEsMzIxIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDkgU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIFdyaXR0ZW4gYnk6IEpheWFtb2hhbiBLYWxsaWNrYWwgKGpheWFtb2hhbmtAc2VydmVyZW5naW5lcy5jb20pCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICoKKyAqLworCisjaW5jbHVkZSAiYmVfbWdtdC5oIgorI2luY2x1ZGUgImJlX2lzY3NpLmgiCisKK3Vuc2lnbmVkIGNoYXIgbWdtdF9nZXRfZndfY29uZmlnKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCisJCQkJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7CisJc3RydWN0IGJlX2Z3X2NmZyAqcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWludCBzdGF0dXMgPSAwOworCisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCisJCQkgICBPUENPREVfQ09NTU9OX1FVRVJZX0ZJUk1XQVJFX0NPTkZJRywgc2l6ZW9mKCpyZXEpKTsKKworCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBiZV9md19jZmcgKnBmd19jZmc7CisJCXBmd19jZmcgPSByZXE7CisJCXBoYmEtPmZ3X2NvbmZpZy5waHlzX3BvcnQgPSBwZndfY2ZnLT5waHlzX3BvcnQ7CisJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9pY2Rfc3RhcnQgPQorCQkJCQlwZndfY2ZnLT51bHBbMF0uaWNkX2Jhc2U7CisJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9pY2RfY291bnQgPQorCQkJCQlwZndfY2ZnLT51bHBbMF0uaWNkX2NvdW50OworCQlwaGJhLT5md19jb25maWcuaXNjc2lfY2lkX3N0YXJ0ID0KKwkJCQkJcGZ3X2NmZy0+dWxwWzBdLnNxX2Jhc2U7CisJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9jaWRfY291bnQgPQorCQkJCQlwZndfY2ZnLT51bHBbMF0uc3FfY291bnQ7CisJfSBlbHNlIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgICJGYWlsZWQgaW4gbWdtdF9nZXRfZndfY29uZmlnIFxuIik7CisJfQorCisJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordW5zaWduZWQgY2hhciBtZ210X2NoZWNrX3N1cHBvcnRlZF9mdyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKQoreworCXN0cnVjdCBiZV9kbWFfbWVtIG5vbmVtYl9jbWQ7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfbWdtdF9jb250cm9sbGVyX2F0dHJpYnV0ZXMgKnJlcTsKKwlzdHJ1Y3QgYmVfc2dlICpzZ2UgPSBub25lbWJlZGRlZF9zZ2wod3JiKTsKKwlpbnQgc3RhdHVzID0gMDsKKworCW5vbmVtYl9jbWQudmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjdHJsLT5wZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgYmVfbWdtdF9jb250cm9sbGVyX2F0dHJpYnV0ZXMpLAorCQkJCSZub25lbWJfY21kLmRtYSk7CisJaWYgKG5vbmVtYl9jbWQudmEgPT0gTlVMTCkgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsCisJCQkgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1nbXRfY2hlY2tfc3VwcG9ydGVkX2Z3IgorCQkJICJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW5vbmVtYl9jbWQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfbWdtdF9jb250cm9sbGVyX2F0dHJpYnV0ZXMpOworCXJlcSA9IG5vbmVtYl9jbWQudmE7CisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCBmYWxzZSwgMSk7CisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCisJCQkgICBPUENPREVfQ09NTU9OX0dFVF9DTlRMX0FUVFJJQlVURVMsIHNpemVvZigqcmVxKSk7CisJc2dlLT5wYV9oaSA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMobm9uZW1iX2NtZC5kbWEpKTsKKwlzZ2UtPnBhX2xvID0gY3B1X3RvX2xlMzIobm9uZW1iX2NtZC5kbWEgJiAweEZGRkZGRkZGKTsKKwlzZ2UtPmxlbiA9IGNwdV90b19sZTMyKG5vbmVtYl9jbWQuc2l6ZSk7CisKKwlzdGF0dXMgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKKwlpZiAoIXN0YXR1cykgeworCQlzdHJ1Y3QgYmVfbWdtdF9jb250cm9sbGVyX2F0dHJpYnV0ZXNfcmVzcCAqcmVzcCA9IG5vbmVtYl9jbWQudmE7CisJCVNFX0RFQlVHKERCR19MVkxfOCwgIkZpcm13YXJlIHZlcnNpb24gb2YgQ01EOiAlc1xuIiwKKwkJCXJlc3AtPnBhcmFtcy5oYmFfYXR0cmlicy5mbGFzaHJvbV92ZXJzaW9uX3N0cmluZyk7CisJCVNFX0RFQlVHKERCR19MVkxfOCwgIkZpcm13YXJlIHZlcnNpb24gaXMgOiAlc1xuIiwKKwkJCXJlc3AtPnBhcmFtcy5oYmFfYXR0cmlicy5maXJtd2FyZV92ZXJzaW9uX3N0cmluZyk7CisJCVNFX0RFQlVHKERCR19MVkxfOCwKKwkJCSJEZXZlbG9wZXIgQnVpbGQsIG5vdCBwZXJmb3JtaW5nIHZlcnNpb24gY2hlY2suLi5cbiIpOworCisJfSBlbHNlCisJCVNFX0RFQlVHKERCR19MVkxfMSwgIiBGYWlsZWQgaW4gbWdtdF9jaGVja19zdXBwb3J0ZWRfZndcbiIpOworCWlmIChub25lbWJfY21kLnZhKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGN0cmwtPnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKKwkJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOworCisJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordW5zaWduZWQgY2hhciBtZ210X2VwZndfY2xlYW51cChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHVuc2lnbmVkIHNob3J0IGNodXRlKQoreworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCBpc2NzaV9jbGVhbnVwX3JlcSAqcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWludCBzdGF0dXMgPSAwOworCisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0ksCisJCQkgICBPUENPREVfQ09NTU9OX0lTQ1NJX0NMRUFOVVAsIHNpemVvZigqcmVxKSk7CisKKwlyZXEtPmNodXRlID0gY2h1dGU7CisJcmVxLT5oZHJfcmluZ19pZCA9IDA7CisJcmVxLT5kYXRhX3JpbmdfaWQgPSAwOworCisJc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJaWYgKHN0YXR1cykKKwkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgcGhiYS0+c2hvc3QsCisJCQkgICAgICIgbWdtdF9lcGZ3X2NsZWFudXAgLCBGQUlMRURcbiIpOworCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbWdtdF9pbnZhbGlkYXRlX2ljZHMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJCSAgIHVuc2lnbmVkIGludCBpY2QsIHVuc2lnbmVkIGludCBjaWQpCit7CisJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKKwlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfc2dlICpzZ2UgPSBub25lbWJlZGRlZF9zZ2wod3JiKTsKKwlzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfaW4gKnJlcTsKKwlpbnQgc3RhdHVzID0gMDsKKworCW5vbmVtYl9jbWQudmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjdHJsLT5wZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfaW4pLAorCQkJCSZub25lbWJfY21kLmRtYSk7CisJaWYgKG5vbmVtYl9jbWQudmEgPT0gTlVMTCkgeworCQlTRV9ERUJVRyhEQkdfTFZMXzEsCisJCQkgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIgorCQkJICJtZ210X2ludmFsaWRhdGVfaWNkcyBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW5vbmVtYl9jbWQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfaW4pOworCXJlcSA9IG5vbmVtYl9jbWQudmE7CisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIGZhbHNlLCAxKTsKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0lTQ1NJLAorCQkJT1BDT0RFX0NPTU1PTl9JU0NTSV9FUlJPUl9SRUNPVkVSWV9JTlZBTElEQVRFX0NPTU1BTkRTLAorCQkJc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPnJlZl9oYW5kbGUgPSAwOworCXJlcS0+Y2xlYW51cF90eXBlID0gQ01EX0lTQ1NJX0NPTU1BTkRfSU5WQUxJREFURTsKKwlyZXEtPmljZF9jb3VudCA9IDA7CisJcmVxLT50YWJsZVtyZXEtPmljZF9jb3VudF0uaWNkID0gaWNkOworCXJlcS0+dGFibGVbcmVxLT5pY2RfY291bnRdLmNpZCA9IGNpZDsKKwlzZ2UtPnBhX2hpID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhub25lbWJfY21kLmRtYSkpOworCXNnZS0+cGFfbG8gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLmRtYSAmIDB4RkZGRkZGRkYpOworCXNnZS0+bGVuID0gY3B1X3RvX2xlMzIobm9uZW1iX2NtZC5zaXplKTsKKworCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOworCWlmIChzdGF0dXMpCisJCVNFX0RFQlVHKERCR19MVkxfMSwgIklDRFMgSW52YWxpZGF0aW9uIEZhaWxlZFxuIik7CisJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJaWYgKG5vbmVtYl9jbWQudmEpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY3RybC0+cGRldiwgbm9uZW1iX2NtZC5zaXplLAorCQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordW5zaWduZWQgY2hhciBtZ210X2ludmFsaWRhdGVfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkJCSBzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCwKKwkJCQkJIHVuc2lnbmVkIHNob3J0IGNpZCwKKwkJCQkJIHVuc2lnbmVkIHNob3J0IGlzc3VlX3Jlc2V0LAorCQkJCQkgdW5zaWduZWQgc2hvcnQgc2F2ZWNmZ19mbGFnKQoreworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCBpc2NzaV9pbnZhbGlkYXRlX2Nvbm5lY3Rpb25fcGFyYW1zX2luICpyZXEgPQorCQkJCQkJZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWludCBzdGF0dXMgPSAwOworCisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0lfSU5JLAorCQkJICAgT1BDT0RFX0lTQ1NJX0lOSV9EUklWRVJfSU5WQUxJREFURV9DT05ORUNUSU9OLAorCQkJICAgc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPnNlc3Npb25faGFuZGxlID0gYmVpc2NzaV9lcC0+ZndfaGFuZGxlOworCXJlcS0+Y2lkID0gY2lkOworCWlmIChpc3N1ZV9yZXNldCkKKwkJcmVxLT5jbGVhbnVwX3R5cGUgPSBDTURfSVNDU0lfQ09OTkVDVElPTl9JU1NVRV9UQ1BfUlNUOworCWVsc2UKKwkJcmVxLT5jbGVhbnVwX3R5cGUgPSBDTURfSVNDU0lfQ09OTkVDVElPTl9JTlZBTElEQVRFOworCXJlcS0+c2F2ZV9jZmcgPSBzYXZlY2ZnX2ZsYWc7CisJc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJaWYgKHN0YXR1cykKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAiSW52YWxpZGF0aW9uIEZhaWxlZFxuIik7CisKKwlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit1bnNpZ25lZCBjaGFyIG1nbXRfdXBsb2FkX2Nvbm5lY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJCXVuc2lnbmVkIHNob3J0IGNpZCwgdW5zaWduZWQgaW50IHVwbG9hZF9mbGFnKQoreworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCB0Y3BfdXBsb2FkX3BhcmFtc19pbiAqcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWludCBzdGF0dXMgPSAwOworCisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9DT01NT05fVENQX1VQTE9BRCwKKwkJCSAgIE9QQ09ERV9DT01NT05fVENQX1VQTE9BRCwgc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPmlkID0gKHVuc2lnbmVkIHNob3J0KWNpZDsKKwlyZXEtPnVwbG9hZF90eXBlID0gKHVuc2lnbmVkIGNoYXIpdXBsb2FkX2ZsYWc7CisJc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJaWYgKHN0YXR1cykKKwkJU0VfREVCVUcoREJHX0xWTF8xLCAibWdtdF91cGxvYWRfY29ubmVjdGlvbiBGYWlsZWRcbiIpOworCXNwaW5fdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBtZ210X29wZW5fY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKKwkJCSBzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCkKK3sKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OworCXN0cnVjdCBzb2NrYWRkcl9pbiAqZGFkZHJfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopZHN0X2FkZHI7CisJc3RydWN0IHNvY2thZGRyX2luNiAqZGFkZHJfaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilkc3RfYWRkcjsKKwlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgdGNwX2Nvbm5lY3RfYW5kX29mZmxvYWRfaW4gKnJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwl1bnNpZ25lZCBzaG9ydCBkZWZfaGRyX2lkOworCXVuc2lnbmVkIHNob3J0IGRlZl9kYXRhX2lkOworCXN0cnVjdCBwaHlzX2FkZHIgdGVtcGxhdGVfYWRkcmVzcyA9IHsgMCwgMCB9OworCXN0cnVjdCBwaHlzX2FkZHIgKnB0ZW1wbGF0ZV9hZGRyZXNzOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIHNob3J0IGNpZCA9IGJlaXNjc2lfZXAtPmVwX2NpZDsKKworCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKKwlkZWZfaGRyX2lkID0gKHVuc2lnbmVkIHNob3J0KUhXSV9HRVRfREVGX0hEUlFfSUQocGhiYSk7CisJZGVmX2RhdGFfaWQgPSAodW5zaWduZWQgc2hvcnQpSFdJX0dFVF9ERUZfQlVGUV9JRChwaGJhKTsKKworCXB0ZW1wbGF0ZV9hZGRyZXNzID0gJnRlbXBsYXRlX2FkZHJlc3M7CisJSVNDU0lfR0VUX1BEVV9URU1QTEFURV9BRERSRVNTKHBoYmEsIHB0ZW1wbGF0ZV9hZGRyZXNzKTsKKwlzcGluX2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKKworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7CisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9JU0NTSSwKKwkJCSAgIE9QQ09ERV9DT01NT05fSVNDU0lfVENQX0NPTk5FQ1RfQU5EX09GRkxPQUQsCisJCQkgICBzaXplb2YoKnJlcSkpOworCWlmIChkc3RfYWRkci0+c2FfZmFtaWx5ID09IFBGX0lORVQpIHsKKwkJX19iZTMyIHNfYWRkciA9IGRhZGRyX2luLT5zaW5fYWRkci5zX2FkZHI7CisJCXJlcS0+aXBfYWRkcmVzcy5pcF90eXBlID0gQkUyX0lQVjQ7CisJCXJlcS0+aXBfYWRkcmVzcy5pcF9hZGRyZXNzWzBdID0gc19hZGRyICYgMHgwMDAwMDBmZjsKKwkJcmVxLT5pcF9hZGRyZXNzLmlwX2FkZHJlc3NbMV0gPSAoc19hZGRyICYgMHgwMDAwZmYwMCkgPj4gODsKKwkJcmVxLT5pcF9hZGRyZXNzLmlwX2FkZHJlc3NbMl0gPSAoc19hZGRyICYgMHgwMGZmMDAwMCkgPj4gMTY7CisJCXJlcS0+aXBfYWRkcmVzcy5pcF9hZGRyZXNzWzNdID0gKHNfYWRkciAmIDB4ZmYwMDAwMDApID4+IDI0OworCQlyZXEtPnRjcF9wb3J0ID0gbnRvaHMoZGFkZHJfaW4tPnNpbl9wb3J0KTsKKwkJYmVpc2NzaV9lcC0+ZHN0X2FkZHIgPSBkYWRkcl9pbi0+c2luX2FkZHIuc19hZGRyOworCQliZWlzY3NpX2VwLT5kc3RfdGNwcG9ydCA9IG50b2hzKGRhZGRyX2luLT5zaW5fcG9ydCk7CisJCWJlaXNjc2lfZXAtPmlwX3R5cGUgPSBCRTJfSVBWNDsKKwl9IGVsc2UgaWYgKGRzdF9hZGRyLT5zYV9mYW1pbHkgPT0gUEZfSU5FVDYpIHsKKwkJcmVxLT5pcF9hZGRyZXNzLmlwX3R5cGUgPSBCRTJfSVBWNjsKKwkJbWVtY3B5KCZyZXEtPmlwX2FkZHJlc3MuaXBfYWRkcmVzcywKKwkJICAgICAgICZkYWRkcl9pbjYtPnNpbjZfYWRkci5pbjZfdS51Nl9hZGRyOCwgMTYpOworCQlyZXEtPnRjcF9wb3J0ID0gbnRvaHMoZGFkZHJfaW42LT5zaW42X3BvcnQpOworCQliZWlzY3NpX2VwLT5kc3RfdGNwcG9ydCA9IG50b2hzKGRhZGRyX2luNi0+c2luNl9wb3J0KTsKKwkJbWVtY3B5KCZiZWlzY3NpX2VwLT5kc3Q2X2FkZHIsCisJCSAgICAgICAmZGFkZHJfaW42LT5zaW42X2FkZHIuaW42X3UudTZfYWRkcjgsIDE2KTsKKwkJYmVpc2NzaV9lcC0+aXBfdHlwZSA9IEJFMl9JUFY2OworCX0gZWxzZXsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgInVua25vd24gYWRkciBmYW1pbHkgJWRcbiIsCisJCQkgICAgIGRzdF9hZGRyLT5zYV9mYW1pbHkpOworCQlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisJcmVxLT5jaWQgPSBjaWQ7CisJcmVxLT5jcV9pZCA9IHBod2lfY29udGV4dC0+YmVfY3EuaWQ7CisJcmVxLT5kZWZxX2lkID0gZGVmX2hkcl9pZDsKKwlyZXEtPmhkcl9yaW5nX2lkID0gZGVmX2hkcl9pZDsKKwlyZXEtPmRhdGFfcmluZ19pZCA9IGRlZl9kYXRhX2lkOworCXJlcS0+ZG9fb2ZmbG9hZCA9IDE7CisJcmVxLT5kYXRhb3V0X3RlbXBsYXRlX3BhLmxvID0gcHRlbXBsYXRlX2FkZHJlc3MtPmxvOworCXJlcS0+ZGF0YW91dF90ZW1wbGF0ZV9wYS5oaSA9IHB0ZW1wbGF0ZV9hZGRyZXNzLT5oaTsKKwlzdGF0dXMgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKKwlpZiAoIXN0YXR1cykgeworCQlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwOworCQlzdHJ1Y3QgdGNwX2Nvbm5lY3RfYW5kX29mZmxvYWRfb3V0ICpwdGNwY25jdF9vdXQgPQorCQkJCQkJCWVtYmVkZGVkX3BheWxvYWQod3JiKTsKKworCQllcCA9IHBoYmEtPmVwX2FycmF5W3B0Y3BjbmN0X291dC0+Y2lkXTsKKwkJYmVpc2NzaV9lcCA9IGVwLT5kZF9kYXRhOworCQliZWlzY3NpX2VwLT5md19oYW5kbGUgPSAwOworCQliZWlzY3NpX2VwLT5jaWRfdmxkID0gMTsKKwkJU0VfREVCVUcoREJHX0xWTF84LCAibWdtdF9vcGVuX2Nvbm5lY3Rpb24gU3VjY2Vzc1xuIik7CisJfSBlbHNlCisJCVNFX0RFQlVHKERCR19MVkxfMSwgIm1nbXRfb3Blbl9jb25uZWN0aW9uIEZhaWxlZFxuIik7CisJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTgxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDkgU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIFdyaXR0ZW4gYnk6IEpheWFtb2hhbiBLYWxsaWNrYWwgKGpheWFtb2hhbmtAc2VydmVyZW5naW5lcy5jb20pCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICoKKyAqLworCisjaWZuZGVmIF9CRUlTQ1NJX01HTVRfCisjZGVmaW5lIF9CRUlTQ1NJX01HTVRfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlICJiZV9pc2NzaS5oIgorI2luY2x1ZGUgImJlX21haW4uaCIKKworLyoqCisgKiBQc2V1ZG8gYW1hcCBkZWZpbml0aW9uIGluIHdoaWNoIGVhY2ggYml0IG9mIHRoZSBhY3R1YWwgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAqIGFzIGEgYnl0ZTogdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9tY2Nfc2dlIHsKKwl1OCBwYV9sb1szMl07CQkvKiBkd29yZCAwICovCisJdTggcGFfaGlbMzJdOwkJLyogZHdvcmQgMSAqLworCXU4IGxlbmd0aFszMl07CQkvKiBEV09SRCAyICovCit9IF9fcGFja2VkOworCisvKioKKyAqIFBzZXVkbyBhbWFwIGRlZmluaXRpb24gaW4gd2hpY2ggZWFjaCBiaXQgb2YgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZAorICogYXMgYSBieXRlOiB1c2VkIHRvIGNhbGN1bGF0ZSBvZmZzZXQvc2hpZnQvbWFzayBvZiBlYWNoIGZpZWxkCisgKi8KK3N0cnVjdCBhbWFwX21jY193cmJfcGF5bG9hZCB7CisJdW5pb24geworCQlzdHJ1Y3QgYW1hcF9tY2Nfc2dlIHNnbFsxOV07CisJCXU4IGVtYmVkZGVkWzU5ICogMzJdOwkvKiBEV09SRFMgNTcgdG8gMTE1ICovCisJfSB1OworfSBfX3BhY2tlZDsKKworLyoqCisgKiBQc2V1ZG8gYW1hcCBkZWZpbml0aW9uIGluIHdoaWNoIGVhY2ggYml0IG9mIHRoZSBhY3R1YWwgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAqIGFzIGEgYnl0ZTogdXNlZCB0byBjYWxjdWxhdGUgb2Zmc2V0L3NoaWZ0L21hc2sgb2YgZWFjaCBmaWVsZAorICovCitzdHJ1Y3QgYW1hcF9tY2Nfd3JiIHsKKwl1OCBlbWJlZGRlZDsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsyXTsJCS8qIERXT1JEIDAgKi8KKwl1OCBzZ2VfY291bnRbNV07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxNl07CQkvKiBEV09SRCAwICovCisJdTggc3BlY2lhbFs4XTsJCS8qIERXT1JEIDAgKi8KKwl1OCBwYXlsb2FkX2xlbmd0aFszMl07CisJdTggdGFnWzY0XTsJCS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkMlszMl07CQkvKiBEV09SRCA0ICovCisJc3RydWN0IGFtYXBfbWNjX3dyYl9wYXlsb2FkIHBheWxvYWQ7Cit9OworCitzdHJ1Y3QgbWNjX3NnZSB7CisJdTMyIHBhX2xvOwkJLyogZHdvcmQgMCAqLworCXUzMiBwYV9oaTsJCS8qIGR3b3JkIDEgKi8KKwl1MzIgbGVuZ3RoOwkJLyogRFdPUkQgMiAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IG1jY193cmJfcGF5bG9hZCB7CisJdW5pb24geworCQlzdHJ1Y3QgbWNjX3NnZSBzZ2xbMTldOworCQl1MzIgZW1iZWRkZWRbNTldOwkvKiBEV09SRFMgNTcgdG8gMTE1ICovCisJfSB1OworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNQ0NfV1JCX0VNQkVEREVEX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCitzdHJ1Y3QgbWNjX3dyYiB7CisJdTMyIGR3WzBdOwkJLyogRFdPUkQgMCAqLworCXUzMiBwYXlsb2FkX2xlbmd0aDsKKwl1MzIgdGFnWzJdOwkJLyogRFdPUkQgMiAqLworCXUzMiByc3ZkMlsxXTsJCS8qIERXT1JEIDQgKi8KKwlzdHJ1Y3QgbWNjX3dyYl9wYXlsb2FkIHBheWxvYWQ7Cit9OworCit1bnNpZ25lZCBjaGFyIG1nbXRfZXBmd19jbGVhbnVwKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgc2hvcnQgY2h1dGUpOworaW50IG1nbXRfb3Blbl9jb25uZWN0aW9uKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKKwkJCSBzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCk7CisKK3Vuc2lnbmVkIGNoYXIgbWdtdF91cGxvYWRfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBjaWQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdXBsb2FkX2ZsYWcpOwordW5zaWduZWQgY2hhciBtZ210X2ludmFsaWRhdGVfaWNkcyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkJICAgdW5zaWduZWQgaW50IGljZCwgdW5zaWduZWQgaW50IGNpZCk7CisKK3N0cnVjdCBpc2NzaV9pbnZhbGlkYXRlX2Nvbm5lY3Rpb25fcGFyYW1zX2luIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXVuc2lnbmVkIGludCBzZXNzaW9uX2hhbmRsZTsKKwl1bnNpZ25lZCBzaG9ydCBjaWQ7CisJdW5zaWduZWQgc2hvcnQgdW51c2VkOworCXVuc2lnbmVkIHNob3J0IGNsZWFudXBfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBzYXZlX2NmZzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpc2NzaV9pbnZhbGlkYXRlX2Nvbm5lY3Rpb25fcGFyYW1zX291dCB7CisJdW5zaWduZWQgaW50IHNlc3Npb25faGFuZGxlOworCXVuc2lnbmVkIHNob3J0IGNpZDsKKwl1bnNpZ25lZCBzaG9ydCB1bnVzZWQ7Cit9IF9fcGFja2VkOworCit1bmlvbiBpc2NzaV9pbnZhbGlkYXRlX2Nvbm5lY3Rpb25fcGFyYW1zIHsKKwlzdHJ1Y3QgaXNjc2lfaW52YWxpZGF0ZV9jb25uZWN0aW9uX3BhcmFtc19pbiByZXF1ZXN0OworCXN0cnVjdCBpc2NzaV9pbnZhbGlkYXRlX2Nvbm5lY3Rpb25fcGFyYW1zX291dCByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRfdGFibGUgeworCXVuc2lnbmVkIHNob3J0IGljZDsKKwl1bnNpZ25lZCBzaG9ydCBjaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfaW4geworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdW5zaWduZWQgaW50IHJlZl9oYW5kbGU7CisJdW5zaWduZWQgaW50IGljZF9jb3VudDsKKwlzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kX3RhYmxlIHRhYmxlWzEyOF07CisJdW5zaWduZWQgc2hvcnQgY2xlYW51cF90eXBlOworCXVuc2lnbmVkIHNob3J0IHVudXNlZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRzX3BhcmFtc19vdXQgeworCXVuc2lnbmVkIGludCByZWZfaGFuZGxlOworCXVuc2lnbmVkIGludCBpY2RfY291bnQ7CisJdW5zaWduZWQgaW50IGljZF9zdGF0dXNbMTI4XTsKK30gX19wYWNrZWQ7CisKK3VuaW9uIGludmFsaWRhdGVfY29tbWFuZHNfcGFyYW1zIHsKKwlzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfaW4gcmVxdWVzdDsKKwlzdHJ1Y3QgaW52YWxpZGF0ZV9jb21tYW5kc19wYXJhbXNfb3V0IHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworc3RydWN0IG1nbXRfaGJhX2F0dHJpYnV0ZXMgeworCXU4IGZsYXNocm9tX3ZlcnNpb25fc3RyaW5nWzMyXTsKKwl1OCBtYW51ZmFjdHVyZXJfbmFtZVszMl07CisJdTMyIHN1cHBvcnRlZF9tb2RlczsKKwl1OCBzZWVwcm9tX3ZlcnNpb25fbG87CisJdTggc2VlcHJvbV92ZXJzaW9uX2hpOworCXU4IHJzdmQwWzJdOworCXUzMiBmd19jbWRfZGF0YV9zdHJ1Y3RfdmVyc2lvbjsKKwl1MzIgZXBfZndfZGF0YV9zdHJ1Y3RfdmVyc2lvbjsKKwl1MzIgZnV0dXJlX3Jlc2VydmVkWzEyXTsKKwl1MzIgZGVmYXVsdF9leHRlbmRlZF90aW1lb3V0OworCXU4IGNvbnRyb2xsZXJfbW9kZWxfbnVtYmVyWzMyXTsKKwl1OCBjb250cm9sbGVyX2Rlc2NyaXB0aW9uWzY0XTsKKwl1OCBjb250cm9sbGVyX3NlcmlhbF9udW1iZXJbMzJdOworCXU4IGlwX3ZlcnNpb25fc3RyaW5nWzMyXTsKKwl1OCBmaXJtd2FyZV92ZXJzaW9uX3N0cmluZ1szMl07CisJdTggYmlvc192ZXJzaW9uX3N0cmluZ1szMl07CisJdTggcmVkYm9vdF92ZXJzaW9uX3N0cmluZ1szMl07CisJdTggZHJpdmVyX3ZlcnNpb25fc3RyaW5nWzMyXTsKKwl1OCBmd19vbl9mbGFzaF92ZXJzaW9uX3N0cmluZ1szMl07CisJdTMyIGZ1bmN0aW9uYWxpdGllc19zdXBwb3J0ZWQ7CisJdTE2IG1heF9jZGJsZW5ndGg7CisJdTggYXNpY19yZXZpc2lvbjsKKwl1OCBnZW5lcmF0aW9uYWxfZ3VpZFsxNl07CisJdTggaGJhX3BvcnRfY291bnQ7CisJdTE2IGRlZmF1bHRfbGlua19kb3duX3RpbWVvdXQ7CisJdTggaXNjc2lfdmVyX21pbl9tYXg7CisJdTggbXVsdGlmdW5jdGlvbl9kZXZpY2U7CisJdTggY2FjaGVfdmFsaWQ7CisJdTggaGJhX3N0YXR1czsKKwl1OCBtYXhfZG9tYWluc19zdXBwb3J0ZWQ7CisJdTggcGh5X3BvcnQ7CisJdTMyIGZpcm13YXJlX3Bvc3Rfc3RhdHVzOworCXUzMiBoYmFfbXR1WzhdOworCXUzMiBmdXR1cmVfdTMyWzRdOworfSBfX3BhY2tlZDsKKworc3RydWN0IG1nbXRfY29udHJvbGxlcl9hdHRyaWJ1dGVzIHsKKwlzdHJ1Y3QgbWdtdF9oYmFfYXR0cmlidXRlcyBoYmFfYXR0cmliczsKKwl1MTYgcGNpX3ZlbmRvcl9pZDsKKwl1MTYgcGNpX2RldmljZV9pZDsKKwl1MTYgcGNpX3N1Yl92ZW5kb3JfaWQ7CisJdTE2IHBjaV9zdWJfc3lzdGVtX2lkOworCXU4IHBjaV9idXNfbnVtYmVyOworCXU4IHBjaV9kZXZpY2VfbnVtYmVyOworCXU4IHBjaV9mdW5jdGlvbl9udW1iZXI7CisJdTggaW50ZXJmYWNlX3R5cGU7CisJdTY0IHVuaXF1ZV9pZGVudGlmaWVyOworCXU4IG5ldGZpbHRlcnM7CisJdTggcnN2ZDBbM107CisJdTggZnV0dXJlX3UzMls0XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9tZ210X2NvbnRyb2xsZXJfYXR0cmlidXRlcyB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwlzdHJ1Y3QgbWdtdF9jb250cm9sbGVyX2F0dHJpYnV0ZXMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJlX21nbXRfY29udHJvbGxlcl9hdHRyaWJ1dGVzX3Jlc3AgeworCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgaGRyOworCXN0cnVjdCBtZ210X2NvbnRyb2xsZXJfYXR0cmlidXRlcyBwYXJhbXM7Cit9IF9fcGFja2VkOworCisvKiBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgKi8KKworI2RlZmluZSBHRVRfTUdNVF9DT05UUk9MTEVSX1dTKHBoYmEpICAgIChwaGJhLT5wbWdtdF93cykKKworLyogTUdNVCBDTUQgZmxhZ3MgKi8KKworI2RlZmluZSBNR01UX0NNREhfRlJFRSAgICAgICAgICAgICAgICAoMTw8MCkKKworLyogIC0tLSBNR01UX0VSUk9SX0NPREVTIC0tLSAqLworLyogIEVycm9yIENvZGVzIHJldHVybmVkIGluIHRoZSBzdGF0dXMgZmllbGQgb2YgdGhlIENNRCByZXNwb25zZSBoZWFkZXIgKi8KKyNkZWZpbmUgTUdNVF9TVEFUVVNfU1VDQ0VTUyAwCS8qIFRoZSBDTUQgY29tcGxldGVkIHdpdGhvdXQgZXJyb3JzICovCisjZGVmaW5lIE1HTVRfU1RBVFVTX0ZBSUxFRCAxCS8qIEVycm9yIHN0YXR1cyBpbiB0aGUgU3RhdHVzIGZpZWxkIG9mICovCisJCQkJLyogdGhlIENNRF9SRVNQT05TRV9IRUFERVIgICovCisKKyNkZWZpbmUgSVNDU0lfR0VUX1BEVV9URU1QTEFURV9BRERSRVNTKHBjLCBwYSkge1wKKyAgICBwYS0+bG8gPSBwaGJhLT5pbml0X21lbVtJU0NTSV9NRU1fR0xPQkFMX0hFQURFUl0ubWVtX2FycmF5WzBdLlwKKwkJCQkJYnVzX2FkZHJlc3MudS5hMzIuYWRkcmVzc19sbzsgIFwKKyAgICBwYS0+aGkgPSBwaGJhLT5pbml0X21lbVtJU0NTSV9NRU1fR0xPQkFMX0hFQURFUl0ubWVtX2FycmF5WzBdLlwKKwkJCQkJYnVzX2FkZHJlc3MudS5hMzIuYWRkcmVzc19oaTsgIFwKK30KKworc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgeworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKwlzdHJ1Y3QgYmVpc2NzaV9zZXNzICpzZXNzOworCXN0cnVjdCBiZWlzY3NpX2Nvbm4gKmNvbm47CisJdW5zaWduZWQgc2hvcnQgaXBfdHlwZTsKKwljaGFyIGRzdDZfYWRkcltJU0NTSV9BRERSRVNTX0JVRl9MRU5dOworCXVuc2lnbmVkIGxvbmcgZHN0X2FkZHI7CisJdW5zaWduZWQgc2hvcnQgZXBfY2lkOworCXVuc2lnbmVkIGludCBmd19oYW5kbGU7CisJdTE2IGRzdF90Y3Bwb3J0OworCXUxNiBjaWRfdmxkOworfTsKKwordW5zaWduZWQgY2hhciBtZ210X2dldF9md19jb25maWcoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKKwkJCQkgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKKwordW5zaWduZWQgY2hhciBtZ210X2ludmFsaWRhdGVfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkJCSBzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCwKKwkJCQkJIHVuc2lnbmVkIHNob3J0IGNpZCwKKwkJCQkJIHVuc2lnbmVkIHNob3J0IGlzc3VlX3Jlc2V0LAorCQkJCQkgdW5zaWduZWQgc2hvcnQgc2F2ZWNmZ19mbGFnKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9iZmEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2MDA5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorb2JqLSQoQ09ORklHX1NDU0lfQkZBX0ZDKSA6PSBiZmEubworCitiZmEteSA6PSBiZmFkLm8gYmZhZF9pbnRyLm8gYmZhZF9vcy5vIGJmYWRfaW0ubyBiZmFkX2F0dHIubyBiZmFkX2Z3aW1nLm8KKworYmZhLXkgKz0gYmZhX2NvcmUubyBiZmFfaW9jLm8gYmZhX2lvY2ZjLm8gYmZhX2ZjeHAubyBiZmFfbHBzLm8KK2JmYS15ICs9IGJmYV9od19jYi5vIGJmYV9od19jdC5vIGJmYV9pbnRyLm8gYmZhX3RpbWVyLm8gYmZhX3Jwb3J0Lm8gCitiZmEteSArPSBiZmFfZmNwb3J0Lm8gYmZhX3BvcnQubyBiZmFfdWYubyBiZmFfc2dwZy5vIGJmYV9tb2R1bGUubyBiZmFfaW9pbS5vCitiZmEteSArPSBiZmFfaXRuaW0ubyBiZmFfZmNwaW0ubyBiZmFfdHNraW0ubyBiZmFfbG9nLm8gYmZhX2xvZ19tb2R1bGUubworYmZhLXkgKz0gYmZhX2NzZGVidWcubyBiZmFfc20ubyBwbG9nLm8KKworYmZhLXkgKz0gZmNidWlsZC5vIGZhYnJpYy5vIGZjcGltLm8gdmZhcGkubyBmY3B0bS5vIGJmYV9mY3MubyBiZmFfZmNzX3BvcnQubyAKK2JmYS15ICs9IGJmYV9mY3NfdWYubyBiZmFfZmNzX2xwb3J0Lm8gZmFiLm8gZmRtaS5vIG1zLm8gbnMubyBzY24ubyBsb29wLm8KK2JmYS15ICs9IGxwb3J0X2FwaS5vIG4ybi5vIHJwb3J0Lm8gcnBvcnRfYXBpLm8gcnBvcnRfZnRycy5vIHZwb3J0Lm8KKworY2NmbGFncy15IDo9IC1JJChvYmopIC1JJChvYmopL2luY2x1ZGUgLUkkKG9iaikvaW5jbHVkZS9jbmEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NhbGxiYWNrX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NhbGxiYWNrX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTMyNjVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY2FsbGJhY2tfcHJpdi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9DQUxMQkFDS19QUklWX0hfXworI2RlZmluZSBfX0JGQV9DQUxMQkFDS19QUklWX0hfXworCisjaW5jbHVkZSA8Y3MvYmZhX3EuaD4KKwordHlwZWRlZiB2b2lkICAgICgqYmZhX2NiX2NiZm5fdCkgKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKKworLyoqCisgKiBHZW5lcmljIEJGQSBjYWxsYmFjayBlbGVtZW50LgorICovCitzdHJ1Y3QgYmZhX2NiX3FlX3MgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICBxZTsKKwliZmFfY2JfY2Jmbl90ICBjYmZuOworCWJmYV9ib29sZWFuX3QgICBvbmNlOworCXUzMgkJcnN2ZDsKKwl2b2lkICAgICAgICAgICAqY2Jhcmc7Cit9OworCisjZGVmaW5lIGJmYV9jYl9xdWV1ZShfX2JmYSwgX19oY2JfcWUsIF9fY2JmbiwgX19jYmFyZykgZG8gewkJXAorCShfX2hjYl9xZSktPmNiZm4gID0gKF9fY2Jmbik7ICAgICAgXAorCShfX2hjYl9xZSktPmNiYXJnID0gKF9fY2JhcmcpOyAgICAgIFwKKwlsaXN0X2FkZF90YWlsKCYoX19oY2JfcWUpLT5xZSwgJihfX2JmYSktPmNvbXBfcSk7ICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBiZmFfY2JfZGVxdWV1ZShfX2hjYl9xZSkJbGlzdF9kZWwoJihfX2hjYl9xZSktPnFlKQorCisjZGVmaW5lIGJmYV9jYl9xdWV1ZV9vbmNlKF9fYmZhLCBfX2hjYl9xZSwgX19jYmZuLCBfX2NiYXJnKSBkbyB7CVwKKwkoX19oY2JfcWUpLT5jYmZuICA9IChfX2NiZm4pOyAgICAgIFwKKwkoX19oY2JfcWUpLT5jYmFyZyA9IChfX2NiYXJnKTsgICAgICBcCisJaWYgKCEoX19oY2JfcWUpLT5vbmNlKSB7ICAgICAgXAorCQlsaXN0X2FkZF90YWlsKChfX2hjYl9xZSksICYoX19iZmEpLT5jb21wX3EpOyAgICAgIFwKKwkJKF9faGNiX3FlKS0+b25jZSA9IEJGQV9UUlVFOwkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBiZmFfY2JfcXVldWVfZG9uZShfX2hjYl9xZSkgZG8gewkJCQlcCisJKF9faGNiX3FlKS0+b25jZSA9IEJGQV9GQUxTRTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX0JGQV9DQUxMQkFDS19QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfY2JfaW9pbV9tYWNyb3MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NiX2lvaW1fbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1MGM4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NiX2lvaW1fbWFjcm9zLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2NiX2lvaW1fbWFjcm9zLmggQkZBIElPSU0gZHJpdmVyIGludGVyZmFjZSBtYWNyb3MuCisgKi8KKworI2lmbmRlZiBfX0JGQV9IQ0JfSU9JTV9NQUNST1NfSF9fCisjZGVmaW5lIF9fQkZBX0hDQl9JT0lNX01BQ1JPU19IX18KKworI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKy8qCisgKiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyAqCisgKiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+ICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPiAjaW5jbHVkZQorICogPHNjc2kvc2NzaV9kZXZpY2UuaD4gI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisgKi8KKyNpbmNsdWRlICJiZmFkX2ltX2NvbXBhdC5oIgorCisvKgorICogdGFzayBhdHRyaWJ1dGUgdmFsdWVzIGluIEZDUC0yIEZDUF9DTU5EIElVCisgKi8KKyNkZWZpbmUgU0lNUExFX1EgICAgMAorI2RlZmluZSBIRUFEX09GX1EgICAxCisjZGVmaW5lIE9SREVSRURfUSAgIDIKKyNkZWZpbmUgQUNBX1EgICAgICAgNAorI2RlZmluZSBVTlRBR0dFRCAgICA1CisKK3N0YXRpYyBpbmxpbmUgbHVuX3QKK2JmYWRfaW50X3RvX2x1bih1MzIgbHVubykKK3sKKwl1bmlvbiB7CisJCXUxNiAgICAgICAgc2NzaV9sdW5bNF07CisJCWx1bl90ICAgICAgICAgICBiZmFfbHVuOworCX0gbHVuOworCisJbHVuLmJmYV9sdW4gICAgID0gMDsKKwlsdW4uc2NzaV9sdW5bMF0gPSBiZmFfb3NfaHRvbnMobHVubyk7CisKKwlyZXR1cm4gKGx1bi5iZmFfbHVuKTsKK30KKworLyoqCisgKiBHZXQgTFVOIGZvciB0aGUgSS9PIHJlcXVlc3QKKyAqLworI2RlZmluZSBiZmFfY2JfaW9pbV9nZXRfbHVuKF9fZGlvKQlcCisJYmZhZF9pbnRfdG9fbHVuKCgoc3RydWN0IHNjc2lfY21uZCAqKV9fZGlvKS0+ZGV2aWNlLT5sdW4pCisKKy8qKgorICogR2V0IENEQiBmb3IgdGhlIEkvTyByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgdTggKgorYmZhX2NiX2lvaW1fZ2V0X2NkYihzdHJ1Y3QgYmZhZF9pb2ltX3MgKmRpbykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gKHN0cnVjdCBzY3NpX2NtbmQgKilkaW87CisKKwlyZXR1cm4gKCh1OCAqKSBjbW5kLT5jbW5kKTsKK30KKworLyoqCisgKiBHZXQgSS9PIGRpcmVjdGlvbiAocmVhZC93cml0ZSkgZm9yIHRoZSBJL08gcmVxdWVzdAorICovCitzdGF0aWMgaW5saW5lIGVudW0gZmNwX2lvZGlyCitiZmFfY2JfaW9pbV9nZXRfaW9kaXIoc3RydWN0IGJmYWRfaW9pbV9zICpkaW8pCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopZGlvOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYWRpcjsKKworCWRtYWRpciA9IGNtbmQtPnNjX2RhdGFfZGlyZWN0aW9uOworCWlmIChkbWFkaXIgPT0gRE1BX1RPX0RFVklDRSkKKwkJcmV0dXJuIEZDUF9JT0RJUl9XUklURTsKKwllbHNlIGlmIChkbWFkaXIgPT0gRE1BX0ZST01fREVWSUNFKQorCQlyZXR1cm4gRkNQX0lPRElSX1JFQUQ7CisJZWxzZQorCQlyZXR1cm4gRkNQX0lPRElSX05PTkU7Cit9CisKKy8qKgorICogR2V0IElPIHNpemUgaW4gYnl0ZXMgZm9yIHRoZSBJL08gcmVxdWVzdAorICovCitzdGF0aWMgaW5saW5lIHUzMgorYmZhX2NiX2lvaW1fZ2V0X3NpemUoc3RydWN0IGJmYWRfaW9pbV9zICpkaW8pCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopZGlvOworCisJcmV0dXJuIChzY3NpX2J1ZmZsZW4oY21uZCkpOworfQorCisvKioKKyAqIEdldCB0aW1lb3V0IGZvciB0aGUgSS9PIHJlcXVlc3QKKyAqLworc3RhdGljIGlubGluZSB1OAorYmZhX2NiX2lvaW1fZ2V0X3RpbWVvdXQoc3RydWN0IGJmYWRfaW9pbV9zICpkaW8pCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopZGlvOworCS8qCisJICogVEJEOiBuZWVkIGEgdGltZW91dCBmb3Igc2NzaSBwYXNzdGhydQorCSAqLworCWlmIChjbW5kLT5kZXZpY2UtPmhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuIDQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBHZXQgU0cgZWxlbWVudCBmb3IgdGhlIEkvTyByZXF1ZXN0IGdpdmVuIHRoZSBTRyBlbGVtZW50IGluZGV4CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5pb24gYmZpX2FkZHJfdQorYmZhX2NiX2lvaW1fZ2V0X3NnYWRkcihzdHJ1Y3QgYmZhZF9pb2ltX3MgKmRpbywgaW50IHNnZWlkKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWRpbzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnZTsKKwl1NjQgICAgICAgIGFkZHI7CisKKwlzZ2UgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopc2NzaV9zZ2xpc3QoY21uZCkgKyBzZ2VpZDsKKwlhZGRyID0gKHU2NCkgc2dfZG1hX2FkZHJlc3Moc2dlKTsKKworCXJldHVybiAoKih1bmlvbiBiZmlfYWRkcl91ICopICZhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2JmYV9jYl9pb2ltX2dldF9zZ2xlbihzdHJ1Y3QgYmZhZF9pb2ltX3MgKmRpbywgaW50IHNnZWlkKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWRpbzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnZTsKKwl1MzIgICAgICAgIGxlbjsKKworCXNnZSA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3NpX3NnbGlzdChjbW5kKSArIHNnZWlkOworCWxlbiA9IHNnX2RtYV9sZW4oc2dlKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogR2V0IENvbW1hbmQgUmVmZXJlbmNlIE51bWJlciBmb3IgdGhlIEkvTyByZXF1ZXN0LiAwIGlmIG5vbmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTgKK2JmYV9jYl9pb2ltX2dldF9jcm4oc3RydWN0IGJmYWRfaW9pbV9zICpkaW8pCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2V0IFNBTS0zIHByaW9yaXR5IGZvciB0aGUgSS9PIHJlcXVlc3QuIDAgaXMgZGVmYXVsdC4KKyAqLworc3RhdGljIGlubGluZSB1OAorYmZhX2NiX2lvaW1fZ2V0X3ByaW9yaXR5KHN0cnVjdCBiZmFkX2lvaW1fcyAqZGlvKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCB0YXNrIGF0dHJpYnV0ZXMgZm9yIHRoZSBJL08gcmVxdWVzdC4gRGVmYXVsdCBpcyBGQ1BfVEFTS19BVFRSX1NJTVBMRSgwKS4KKyAqLworc3RhdGljIGlubGluZSB1OAorYmZhX2NiX2lvaW1fZ2V0X3Rhc2thdHRyKHN0cnVjdCBiZmFkX2lvaW1fcyAqZGlvKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWRpbzsKKwl1OCAgICAgICAgIHRhc2tfYXR0ciA9IFVOVEFHR0VEOworCisJaWYgKGNtbmQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgeworCQlzd2l0Y2ggKGNtbmQtPnRhZykgeworCQljYXNlIEhFQURfT0ZfUVVFVUVfVEFHOgorCQkJdGFza19hdHRyID0gSEVBRF9PRl9ROworCQkJYnJlYWs7CisJCWNhc2UgT1JERVJFRF9RVUVVRV9UQUc6CisJCQl0YXNrX2F0dHIgPSBPUkRFUkVEX1E7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRhc2tfYXR0ciA9IFNJTVBMRV9ROworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gdGFza19hdHRyOworfQorCisvKioKKyAqIEdldCBDREIgbGVuZ3RoIGluIGJ5dGVzIGZvciB0aGUgSS9PIHJlcXVlc3QuIERlZmF1bHQgaXMgRkNQX0NNTkRfQ0RCX0xFTigxNikuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTgKK2JmYV9jYl9pb2ltX2dldF9jZGJsZW4oc3RydWN0IGJmYWRfaW9pbV9zICpkaW8pCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopZGlvOworCisJcmV0dXJuIChjbW5kLT5jbWRfbGVuKTsKK30KKworCisKKyNlbmRpZiAvKiBfX0JGQV9IQ0JfSU9JTV9NQUNST1NfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jZWUuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTU5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jZWUuYwpAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19jZWUuaD4KKyNpbmNsdWRlIDxjcy9iZmFfdHJjLmg+CisjaW5jbHVkZSA8Y3MvYmZhX2xvZy5oPgorI2luY2x1ZGUgPGNzL2JmYV9kZWJ1Zy5oPgorI2luY2x1ZGUgPGNlZS9iZmFfY2VlLmg+CisjaW5jbHVkZSA8YmZpL2JmaV9jZWUuaD4KKyNpbmNsdWRlIDxiZmkvYmZpLmg+CisjaW5jbHVkZSA8YmZhX2lvYy5oPgorI2luY2x1ZGUgPGNuYS9iZmFfY25hX3RyY21vZC5oPgorCitCRkFfVFJDX0ZJTEUoQ05BLCBDRUUpOworCisjZGVmaW5lIGJmYV9pb2NfcG9ydGlkKF9faW9jKSAoKF9faW9jKS0+cG9ydF9pZCkKKyNkZWZpbmUgYmZhX2xwdWlkKF9fYXJnKSBiZmFfaW9jX3BvcnRpZCgmKF9fYXJnKS0+aW9jKQorCitzdGF0aWMgdm9pZCAgICAgYmZhX2NlZV9mb3JtYXRfbGxkcF9jZmcoc3RydWN0IGJmYV9jZWVfbGxkcF9jZmdfcyAqbGxkcF9jZmcpOworc3RhdGljIHZvaWQgICAgIGJmYV9jZWVfZm9ybWF0X2RjYmN4X3N0YXRzKHN0cnVjdCBiZmFfY2VlX2RjYnhfc3RhdHNfcworCQkJCQkgICAqZGNiY3hfc3RhdHMpOworc3RhdGljIHZvaWQgICAgIGJmYV9jZWVfZm9ybWF0X2xsZHBfc3RhdHMoc3RydWN0IGJmYV9jZWVfbGxkcF9zdGF0c19zCisJCQkJCSAgKmxsZHBfc3RhdHMpOworc3RhdGljIHZvaWQgICAgIGJmYV9jZWVfZm9ybWF0X2NmZ19zdGF0cyhzdHJ1Y3QgYmZhX2NlZV9jZmdfc3RhdHNfcyAqY2ZnX3N0YXRzKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfY2VlX2Zvcm1hdF9jZWVfY2ZnKHZvaWQgKmJ1ZmZlcik7CitzdGF0aWMgdm9pZCAgICAgYmZhX2NlZV9mb3JtYXRfY2VlX3N0YXRzKHZvaWQgKmJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkCitiZmFfY2VlX2Zvcm1hdF9jZWVfc3RhdHModm9pZCAqYnVmZmVyKQoreworCXN0cnVjdCBiZmFfY2VlX3N0YXRzX3MgKmNlZV9zdGF0cyA9IGJ1ZmZlcjsKKwliZmFfY2VlX2Zvcm1hdF9kY2JjeF9zdGF0cygmY2VlX3N0YXRzLT5kY2J4X3N0YXRzKTsKKwliZmFfY2VlX2Zvcm1hdF9sbGRwX3N0YXRzKCZjZWVfc3RhdHMtPmxsZHBfc3RhdHMpOworCWJmYV9jZWVfZm9ybWF0X2NmZ19zdGF0cygmY2VlX3N0YXRzLT5jZmdfc3RhdHMpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2NlZV9mb3JtYXRfY2VlX2NmZyh2b2lkICpidWZmZXIpCit7CisJc3RydWN0IGJmYV9jZWVfYXR0cl9zICpjZWVfY2ZnID0gYnVmZmVyOworCWJmYV9jZWVfZm9ybWF0X2xsZHBfY2ZnKCZjZWVfY2ZnLT5sbGRwX3JlbW90ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfY2VlX2Zvcm1hdF9kY2JjeF9zdGF0cyhzdHJ1Y3QgYmZhX2NlZV9kY2J4X3N0YXRzX3MgKmRjYmN4X3N0YXRzKQoreworCWRjYmN4X3N0YXRzLT5zdWJ0bHZzX3VucmVjb2duaXplZCA9CisJCWJmYV9vc19udG9obChkY2JjeF9zdGF0cy0+c3VidGx2c191bnJlY29nbml6ZWQpOworCWRjYmN4X3N0YXRzLT5uZWdvdGlhdGlvbl9mYWlsZWQgPQorCQliZmFfb3NfbnRvaGwoZGNiY3hfc3RhdHMtPm5lZ290aWF0aW9uX2ZhaWxlZCk7CisJZGNiY3hfc3RhdHMtPnJlbW90ZV9jZmdfY2hhbmdlZCA9CisJCWJmYV9vc19udG9obChkY2JjeF9zdGF0cy0+cmVtb3RlX2NmZ19jaGFuZ2VkKTsKKwlkY2JjeF9zdGF0cy0+dGx2c19yZWNlaXZlZCA9IGJmYV9vc19udG9obChkY2JjeF9zdGF0cy0+dGx2c19yZWNlaXZlZCk7CisJZGNiY3hfc3RhdHMtPnRsdnNfaW52YWxpZCA9IGJmYV9vc19udG9obChkY2JjeF9zdGF0cy0+dGx2c19pbnZhbGlkKTsKKwlkY2JjeF9zdGF0cy0+c2Vxbm8gPSBiZmFfb3NfbnRvaGwoZGNiY3hfc3RhdHMtPnNlcW5vKTsKKwlkY2JjeF9zdGF0cy0+YWNrbm8gPSBiZmFfb3NfbnRvaGwoZGNiY3hfc3RhdHMtPmFja25vKTsKKwlkY2JjeF9zdGF0cy0+cmVjdmRfc2Vxbm8gPSBiZmFfb3NfbnRvaGwoZGNiY3hfc3RhdHMtPnJlY3ZkX3NlcW5vKTsKKwlkY2JjeF9zdGF0cy0+cmVjdmRfYWNrbm8gPSBiZmFfb3NfbnRvaGwoZGNiY3hfc3RhdHMtPnJlY3ZkX2Fja25vKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9jZWVfZm9ybWF0X2xsZHBfc3RhdHMoc3RydWN0IGJmYV9jZWVfbGxkcF9zdGF0c19zICpsbGRwX3N0YXRzKQoreworCWxsZHBfc3RhdHMtPmZyYW1lc190cmFuc21pdHRlZCA9CisJCWJmYV9vc19udG9obChsbGRwX3N0YXRzLT5mcmFtZXNfdHJhbnNtaXR0ZWQpOworCWxsZHBfc3RhdHMtPmZyYW1lc19hZ2VkX291dCA9IGJmYV9vc19udG9obChsbGRwX3N0YXRzLT5mcmFtZXNfYWdlZF9vdXQpOworCWxsZHBfc3RhdHMtPmZyYW1lc19kaXNjYXJkZWQgPQorCQliZmFfb3NfbnRvaGwobGxkcF9zdGF0cy0+ZnJhbWVzX2Rpc2NhcmRlZCk7CisJbGxkcF9zdGF0cy0+ZnJhbWVzX2luX2Vycm9yID0gYmZhX29zX250b2hsKGxsZHBfc3RhdHMtPmZyYW1lc19pbl9lcnJvcik7CisJbGxkcF9zdGF0cy0+ZnJhbWVzX3JjdmQgPSBiZmFfb3NfbnRvaGwobGxkcF9zdGF0cy0+ZnJhbWVzX3JjdmQpOworCWxsZHBfc3RhdHMtPnRsdnNfZGlzY2FyZGVkID0gYmZhX29zX250b2hsKGxsZHBfc3RhdHMtPnRsdnNfZGlzY2FyZGVkKTsKKwlsbGRwX3N0YXRzLT50bHZzX3VucmVjb2duaXplZCA9CisJCWJmYV9vc19udG9obChsbGRwX3N0YXRzLT50bHZzX3VucmVjb2duaXplZCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfY2VlX2Zvcm1hdF9jZmdfc3RhdHMoc3RydWN0IGJmYV9jZWVfY2ZnX3N0YXRzX3MgKmNmZ19zdGF0cykKK3sKKwljZmdfc3RhdHMtPmNlZV9zdGF0dXNfZG93biA9IGJmYV9vc19udG9obChjZmdfc3RhdHMtPmNlZV9zdGF0dXNfZG93bik7CisJY2ZnX3N0YXRzLT5jZWVfc3RhdHVzX3VwID0gYmZhX29zX250b2hsKGNmZ19zdGF0cy0+Y2VlX3N0YXR1c191cCk7CisJY2ZnX3N0YXRzLT5jZWVfaHdfY2ZnX2NoYW5nZWQgPQorCQliZmFfb3NfbnRvaGwoY2ZnX3N0YXRzLT5jZWVfaHdfY2ZnX2NoYW5nZWQpOworCWNmZ19zdGF0cy0+cmVjdmRfaW52YWxpZF9jZmcgPQorCQliZmFfb3NfbnRvaGwoY2ZnX3N0YXRzLT5yZWN2ZF9pbnZhbGlkX2NmZyk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfY2VlX2Zvcm1hdF9sbGRwX2NmZyhzdHJ1Y3QgYmZhX2NlZV9sbGRwX2NmZ19zICpsbGRwX2NmZykKK3sKKwlsbGRwX2NmZy0+dGltZV90b19pbnRlcnZhbCA9IGJmYV9vc19udG9ocyhsbGRwX2NmZy0+dGltZV90b19pbnRlcnZhbCk7CisJbGxkcF9jZmctPmVuYWJsZWRfc3lzdGVtX2NhcCA9CisJCWJmYV9vc19udG9ocyhsbGRwX2NmZy0+ZW5hYmxlZF9zeXN0ZW1fY2FwKTsKK30KKworLyoqCisgKiBiZmFfY2VlX2F0dHJfbWVtaW5mbygpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gdm9pZAorICoKKyAqIEByZXR1cm4gU2l6ZSBvZiBETUEgcmVnaW9uCisgKi8KK3N0YXRpYyAgICAgICAgICB1MzIKK2JmYV9jZWVfYXR0cl9tZW1pbmZvKHZvaWQpCit7CisJcmV0dXJuIEJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3QgYmZhX2NlZV9hdHRyX3MpLCBCRkFfRE1BX0FMSUdOX1NaKTsKK30KKworLyoqCisgKiBiZmFfY2VlX3N0YXRzX21lbWluZm8oKQorICoKKyAqCisgKiBAcGFyYW1baW5dIHZvaWQKKyAqCisgKiBAcmV0dXJuIFNpemUgb2YgRE1BIHJlZ2lvbgorICovCitzdGF0aWMgICAgICAgICAgdTMyCitiZmFfY2VlX3N0YXRzX21lbWluZm8odm9pZCkKK3sKKwlyZXR1cm4gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmFfY2VlX3N0YXRzX3MpLCBCRkFfRE1BX0FMSUdOX1NaKTsKK30KKworLyoqCisgKiBiZmFfY2VlX2dldF9hdHRyX2lzcigpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gY2VlIC0gUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZQorICogICAgICAgICAgICBzdGF0dXMgLSBSZXR1cm4gc3RhdHVzIGZyb20gdGhlIGYvdworICoKKyAqIEByZXR1cm4gdm9pZAorICovCitzdGF0aWMgdm9pZAorYmZhX2NlZV9nZXRfYXR0cl9pc3Ioc3RydWN0IGJmYV9jZWVfcyAqY2VlLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKQoreworCWNlZS0+Z2V0X2F0dHJfc3RhdHVzID0gc3RhdHVzOworCWJmYV90cmMoY2VlLCAwKTsKKwlpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhjZWUsIDApOworCQkvKgorCQkgKiBUaGUgcmVxdWVzdGVkIGRhdGEgaGFzIGJlZW4gY29waWVkIHRvIHRoZSBETUEgYXJlYSwgKnByb2Nlc3MKKwkJICogaXQuCisJCSAqLworCQltZW1jcHkoY2VlLT5hdHRyLCBjZWUtPmF0dHJfZG1hLmt2YSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmZhX2NlZV9hdHRyX3MpKTsKKwkJYmZhX2NlZV9mb3JtYXRfY2VlX2NmZyhjZWUtPmF0dHIpOworCX0KKwljZWUtPmdldF9hdHRyX3BlbmRpbmcgPSBCRkFfRkFMU0U7CisJaWYgKGNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmZuKSB7CisJCWJmYV90cmMoY2VlLCAwKTsKKwkJY2VlLT5jYmZuLmdldF9hdHRyX2NiZm4oY2VlLT5jYmZuLmdldF9hdHRyX2NiYXJnLCBzdGF0dXMpOworCX0KKwliZmFfdHJjKGNlZSwgMCk7Cit9CisKKy8qKgorICogYmZhX2NlZV9nZXRfYXR0cl9pc3IoKQorICoKKyAqCisgKiBAcGFyYW1baW5dIGNlZSAtIFBvaW50ZXIgdG8gdGhlIENFRSBtb2R1bGUKKyAqICAgICAgICAgICAgc3RhdHVzIC0gUmV0dXJuIHN0YXR1cyBmcm9tIHRoZSBmL3cKKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9jZWVfZ2V0X3N0YXRzX2lzcihzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJY2VlLT5nZXRfc3RhdHNfc3RhdHVzID0gc3RhdHVzOworCWJmYV90cmMoY2VlLCAwKTsKKwlpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhjZWUsIDApOworCQkvKgorCQkgKiBUaGUgcmVxdWVzdGVkIGRhdGEgaGFzIGJlZW4gY29waWVkIHRvIHRoZSBETUEgYXJlYSwgcHJvY2VzcworCQkgKiBpdC4KKwkJICovCisJCW1lbWNweShjZWUtPnN0YXRzLCBjZWUtPnN0YXRzX2RtYS5rdmEsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGJmYV9jZWVfc3RhdHNfcykpOworCQliZmFfY2VlX2Zvcm1hdF9jZWVfc3RhdHMoY2VlLT5zdGF0cyk7CisJfQorCWNlZS0+Z2V0X3N0YXRzX3BlbmRpbmcgPSBCRkFfRkFMU0U7CisJYmZhX3RyYyhjZWUsIDApOworCWlmIChjZWUtPmNiZm4uZ2V0X3N0YXRzX2NiZm4pIHsKKwkJYmZhX3RyYyhjZWUsIDApOworCQljZWUtPmNiZm4uZ2V0X3N0YXRzX2NiZm4oY2VlLT5jYmZuLmdldF9zdGF0c19jYmFyZywgc3RhdHVzKTsKKwl9CisJYmZhX3RyYyhjZWUsIDApOworfQorCisvKioKKyAqIGJmYV9jZWVfZ2V0X2F0dHJfaXNyKCkKKyAqCisgKgorICogQHBhcmFtW2luXSBjZWUgLSBQb2ludGVyIHRvIHRoZSBDRUUgbW9kdWxlCisgKiAgICAgICAgICAgIHN0YXR1cyAtIFJldHVybiBzdGF0dXMgZnJvbSB0aGUgZi93CisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfY2VlX3Jlc2V0X3N0YXRzX2lzcihzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJY2VlLT5yZXNldF9zdGF0c19zdGF0dXMgPSBzdGF0dXM7CisJY2VlLT5yZXNldF9zdGF0c19wZW5kaW5nID0gQkZBX0ZBTFNFOworCWlmIChjZWUtPmNiZm4ucmVzZXRfc3RhdHNfY2JmbikKKwkJY2VlLT5jYmZuLnJlc2V0X3N0YXRzX2NiZm4oY2VlLT5jYmZuLnJlc2V0X3N0YXRzX2NiYXJnLCBzdGF0dXMpOworfQorCisvKioKKyAqIGJmYV9jZWVfbWVtaW5mbygpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gdm9pZAorICoKKyAqIEByZXR1cm4gU2l6ZSBvZiBETUEgcmVnaW9uCisgKi8KK3UzMgorYmZhX2NlZV9tZW1pbmZvKHZvaWQpCit7CisJcmV0dXJuIChiZmFfY2VlX2F0dHJfbWVtaW5mbygpICsgYmZhX2NlZV9zdGF0c19tZW1pbmZvKCkpOworfQorCisvKioKKyAqIGJmYV9jZWVfbWVtX2NsYWltKCkKKyAqCisgKgorICogQHBhcmFtW2luXSBjZWUgQ0VFIG1vZHVsZSBwb2ludGVyCisgKiAJICAgICAgZG1hX2t2YSBLZXJuZWwgVmlydHVhbCBBZGRyZXNzIG9mIENFRSBETUEgTWVtb3J5CisgKiAJICAgICAgZG1hX3BhICBQaHlzaWNhbCBBZGRyZXNzIG9mIENFRSBETUEgTWVtb3J5CisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3ZvaWQKK2JmYV9jZWVfbWVtX2NsYWltKHN0cnVjdCBiZmFfY2VlX3MgKmNlZSwgdTggKmRtYV9rdmEsIHU2NCBkbWFfcGEpCit7CisJY2VlLT5hdHRyX2RtYS5rdmEgPSBkbWFfa3ZhOworCWNlZS0+YXR0cl9kbWEucGEgPSBkbWFfcGE7CisJY2VlLT5zdGF0c19kbWEua3ZhID0gZG1hX2t2YSArIGJmYV9jZWVfYXR0cl9tZW1pbmZvKCk7CisJY2VlLT5zdGF0c19kbWEucGEgPSBkbWFfcGEgKyBiZmFfY2VlX2F0dHJfbWVtaW5mbygpOworCWNlZS0+YXR0ciA9IChzdHJ1Y3QgYmZhX2NlZV9hdHRyX3MgKilkbWFfa3ZhOworCWNlZS0+c3RhdHMgPQorCQkoc3RydWN0IGJmYV9jZWVfc3RhdHNfcyAqKShkbWFfa3ZhICsgYmZhX2NlZV9hdHRyX21lbWluZm8oKSk7Cit9CisKKy8qKgorICogYmZhX2NlZV9nZXRfYXR0cigpCisgKgorICogICBTZW5kIHRoZSByZXF1ZXN0IHRvIHRoZSBmL3cgdG8gZmV0Y2ggQ0VFIGF0dHJpYnV0ZXMuCisgKgorICogQHBhcmFtW2luXSBQb2ludGVyIHRvIHRoZSBDRUUgbW9kdWxlIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIEByZXR1cm4gU3RhdHVzCisgKi8KKworYmZhX3N0YXR1c190CitiZmFfY2VlX2dldF9hdHRyKHN0cnVjdCBiZmFfY2VlX3MgKmNlZSwgc3RydWN0IGJmYV9jZWVfYXR0cl9zICphdHRyLAorCQkgYmZhX2NlZV9nZXRfYXR0cl9jYmZuX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9jZWVfZ2V0X3JlcV9zICpjbWQ7CisKKwliZmFfYXNzZXJ0KChjZWUgIT0gTlVMTCkgJiYgKGNlZS0+aW9jICE9IE5VTEwpKTsKKwliZmFfdHJjKGNlZSwgMCk7CisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGNlZS0+aW9jKSkgeworCQliZmFfdHJjKGNlZSwgMCk7CisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCX0KKwlpZiAoY2VlLT5nZXRfYXR0cl9wZW5kaW5nID09IEJGQV9UUlVFKSB7CisJCWJmYV90cmMoY2VlLCAwKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisJY2VlLT5nZXRfYXR0cl9wZW5kaW5nID0gQkZBX1RSVUU7CisJY21kID0gKHN0cnVjdCBiZmlfY2VlX2dldF9yZXFfcyAqKWNlZS0+Z2V0X2NmZ19tYi5tc2c7CisJY2VlLT5hdHRyID0gYXR0cjsKKwljZWUtPmNiZm4uZ2V0X2F0dHJfY2JmbiA9IGNiZm47CisJY2VlLT5jYmZuLmdldF9hdHRyX2NiYXJnID0gY2Jhcmc7CisJYmZpX2gyaV9zZXQoY21kLT5taCwgQkZJX01DX0NFRSwgQkZJX0NFRV9IMklfR0VUX0NGR19SRVEsCisJCSAgICBiZmFfaW9jX3BvcnRpZChjZWUtPmlvYykpOworCWJmYV9kbWFfYmVfYWRkcl9zZXQoY21kLT5kbWFfYWRkciwgY2VlLT5hdHRyX2RtYS5wYSk7CisJYmZhX2lvY19tYm94X3F1ZXVlKGNlZS0+aW9jLCAmY2VlLT5nZXRfY2ZnX21iKTsKKwliZmFfdHJjKGNlZSwgMCk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoqCisgKiBiZmFfY2VlX2dldF9zdGF0cygpCisgKgorICogICBTZW5kIHRoZSByZXF1ZXN0IHRvIHRoZSBmL3cgdG8gZmV0Y2ggQ0VFIHN0YXRpc3RpY3MuCisgKgorICogQHBhcmFtW2luXSBQb2ludGVyIHRvIHRoZSBDRUUgbW9kdWxlIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIEByZXR1cm4gU3RhdHVzCisgKi8KKworYmZhX3N0YXR1c190CitiZmFfY2VlX2dldF9zdGF0cyhzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsIHN0cnVjdCBiZmFfY2VlX3N0YXRzX3MgKnN0YXRzLAorCQkgIGJmYV9jZWVfZ2V0X3N0YXRzX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX2NlZV9nZXRfcmVxX3MgKmNtZDsKKworCWJmYV9hc3NlcnQoKGNlZSAhPSBOVUxMKSAmJiAoY2VlLT5pb2MgIT0gTlVMTCkpOworCisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGNlZS0+aW9jKSkgeworCQliZmFfdHJjKGNlZSwgMCk7CisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCX0KKwlpZiAoY2VlLT5nZXRfc3RhdHNfcGVuZGluZyA9PSBCRkFfVFJVRSkgeworCQliZmFfdHJjKGNlZSwgMCk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCWNlZS0+Z2V0X3N0YXRzX3BlbmRpbmcgPSBCRkFfVFJVRTsKKwljbWQgPSAoc3RydWN0IGJmaV9jZWVfZ2V0X3JlcV9zICopY2VlLT5nZXRfc3RhdHNfbWIubXNnOworCWNlZS0+c3RhdHMgPSBzdGF0czsKKwljZWUtPmNiZm4uZ2V0X3N0YXRzX2NiZm4gPSBjYmZuOworCWNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JhcmcgPSBjYmFyZzsKKwliZmlfaDJpX3NldChjbWQtPm1oLCBCRklfTUNfQ0VFLCBCRklfQ0VFX0gySV9HRVRfU1RBVFNfUkVRLAorCQkgICAgYmZhX2lvY19wb3J0aWQoY2VlLT5pb2MpKTsKKwliZmFfZG1hX2JlX2FkZHJfc2V0KGNtZC0+ZG1hX2FkZHIsIGNlZS0+c3RhdHNfZG1hLnBhKTsKKwliZmFfaW9jX21ib3hfcXVldWUoY2VlLT5pb2MsICZjZWUtPmdldF9zdGF0c19tYik7CisJYmZhX3RyYyhjZWUsIDApOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogYmZhX2NlZV9yZXNldF9zdGF0cygpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIFN0YXR1cworICovCisKK2JmYV9zdGF0dXNfdAorYmZhX2NlZV9yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsIGJmYV9jZWVfcmVzZXRfc3RhdHNfY2Jmbl90IGNiZm4sCisJCSAgICB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX2NlZV9yZXNldF9zdGF0c19zICpjbWQ7CisKKwliZmFfYXNzZXJ0KChjZWUgIT0gTlVMTCkgJiYgKGNlZS0+aW9jICE9IE5VTEwpKTsKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwoY2VlLT5pb2MpKSB7CisJCWJmYV90cmMoY2VlLCAwKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisJfQorCWlmIChjZWUtPnJlc2V0X3N0YXRzX3BlbmRpbmcgPT0gQkZBX1RSVUUpIHsKKwkJYmZhX3RyYyhjZWUsIDApOworCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOworCX0KKwljZWUtPnJlc2V0X3N0YXRzX3BlbmRpbmcgPSBCRkFfVFJVRTsKKwljbWQgPSAoc3RydWN0IGJmaV9jZWVfcmVzZXRfc3RhdHNfcyAqKWNlZS0+cmVzZXRfc3RhdHNfbWIubXNnOworCWNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmZuID0gY2JmbjsKKwljZWUtPmNiZm4ucmVzZXRfc3RhdHNfY2JhcmcgPSBjYmFyZzsKKwliZmlfaDJpX3NldChjbWQtPm1oLCBCRklfTUNfQ0VFLCBCRklfQ0VFX0gySV9SRVNFVF9TVEFUUywKKwkJICAgIGJmYV9pb2NfcG9ydGlkKGNlZS0+aW9jKSk7CisJYmZhX2lvY19tYm94X3F1ZXVlKGNlZS0+aW9jLCAmY2VlLT5yZXNldF9zdGF0c19tYik7CisJYmZhX3RyYyhjZWUsIDApOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqIGJmYV9jZWVfaXNycygpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLworCit2b2lkCitiZmFfY2VlX2lzcih2b2lkICpjYmFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptKQoreworCXVuaW9uIGJmaV9jZWVfaTJoX21zZ191ICptc2c7CisJc3RydWN0IGJmaV9jZWVfZ2V0X3JzcF9zICpnZXRfcnNwOworCXN0cnVjdCBiZmFfY2VlX3MgKmNlZSA9IChzdHJ1Y3QgYmZhX2NlZV9zICopY2Jhcmc7CisJbXNnID0gKHVuaW9uIGJmaV9jZWVfaTJoX21zZ191ICopbTsKKwlnZXRfcnNwID0gKHN0cnVjdCBiZmlfY2VlX2dldF9yc3BfcyAqKW07CisJYmZhX3RyYyhjZWUsIG1zZy0+bWgubXNnX2lkKTsKKwlzd2l0Y2ggKG1zZy0+bWgubXNnX2lkKSB7CisJY2FzZSBCRklfQ0VFX0kySF9HRVRfQ0ZHX1JTUDoKKwkJYmZhX3RyYyhjZWUsIGdldF9yc3AtPmNtZF9zdGF0dXMpOworCQliZmFfY2VlX2dldF9hdHRyX2lzcihjZWUsIGdldF9yc3AtPmNtZF9zdGF0dXMpOworCQlicmVhazsKKwljYXNlIEJGSV9DRUVfSTJIX0dFVF9TVEFUU19SU1A6CisJCWJmYV9jZWVfZ2V0X3N0YXRzX2lzcihjZWUsIGdldF9yc3AtPmNtZF9zdGF0dXMpOworCQlicmVhazsKKwljYXNlIEJGSV9DRUVfSTJIX1JFU0VUX1NUQVRTX1JTUDoKKwkJYmZhX2NlZV9yZXNldF9zdGF0c19pc3IoY2VlLCBnZXRfcnNwLT5jbWRfc3RhdHVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogYmZhX2NlZV9oYmZhaWwoKQorICoKKyAqCisgKiBAcGFyYW1baW5dIFBvaW50ZXIgdG8gdGhlIENFRSBtb2R1bGUgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogQHJldHVybiB2b2lkCisgKi8KKwordm9pZAorYmZhX2NlZV9oYmZhaWwodm9pZCAqYXJnKQoreworCXN0cnVjdCBiZmFfY2VlX3MgKmNlZTsKKwljZWUgPSAoc3RydWN0IGJmYV9jZWVfcyAqKWFyZzsKKworCWlmIChjZWUtPmdldF9hdHRyX3BlbmRpbmcgPT0gQkZBX1RSVUUpIHsKKwkJY2VlLT5nZXRfYXR0cl9zdGF0dXMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKKwkJY2VlLT5nZXRfYXR0cl9wZW5kaW5nID0gQkZBX0ZBTFNFOworCQlpZiAoY2VlLT5jYmZuLmdldF9hdHRyX2NiZm4pIHsKKwkJCWNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmZuKGNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmFyZywKKwkJCQkJCUJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJfQorCX0KKwlpZiAoY2VlLT5nZXRfc3RhdHNfcGVuZGluZyA9PSBCRkFfVFJVRSkgeworCQljZWUtPmdldF9zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKKwkJY2VlLT5nZXRfc3RhdHNfcGVuZGluZyA9IEJGQV9GQUxTRTsKKwkJaWYgKGNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JmbikgeworCQkJY2VlLT5jYmZuLmdldF9zdGF0c19jYmZuKGNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JhcmcsCisJCQkJCQkgQkZBX1NUQVRVU19GQUlMRUQpOworCQl9CisJfQorCWlmIChjZWUtPnJlc2V0X3N0YXRzX3BlbmRpbmcgPT0gQkZBX1RSVUUpIHsKKwkJY2VlLT5yZXNldF9zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKKwkJY2VlLT5yZXNldF9zdGF0c19wZW5kaW5nID0gQkZBX0ZBTFNFOworCQlpZiAoY2VlLT5jYmZuLnJlc2V0X3N0YXRzX2NiZm4pIHsKKwkJCWNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmZuKGNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmFyZywKKwkJCQkJCSAgIEJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBiZmFfY2VlX2F0dGFjaCgpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gY2VlIC0gUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZSBkYXRhIHN0cnVjdHVyZQorICogICAgICAgICAgICBpb2MgLSBQb2ludGVyIHRvIHRoZSBpb2MgbW9kdWxlIGRhdGEgc3RydWN0dXJlCisgKiAgICAgICAgICAgIGRldiAtIFBvaW50ZXIgdG8gdGhlIGRldmljZSBkcml2ZXIgbW9kdWxlIGRhdGEgc3RydWN0dXJlCisgKiAgICAgICAgICAgICAgICAgIFRoZSBkZXZpY2UgZHJpdmVyIHNwZWNpZmljIG1ib3ggSVNSIGZ1bmN0aW9ucyBoYXZlCisgKiAgICAgICAgICAgICAgICAgIHRoaXMgcG9pbnRlciBhcyBvbmUgb2YgdGhlIHBhcmFtZXRlcnMuCisgKiAgICAgICAgICAgIHRyY21vZCAtCisgKiAgICAgICAgICAgIGxvZ21vZCAtCisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3ZvaWQKK2JmYV9jZWVfYXR0YWNoKHN0cnVjdCBiZmFfY2VlX3MgKmNlZSwgc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICpkZXYsCisJICAgICAgIHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QsIHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtb2QpCit7CisJYmZhX2Fzc2VydChjZWUgIT0gTlVMTCk7CisJY2VlLT5kZXYgPSBkZXY7CisJY2VlLT50cmNtb2QgPSB0cmNtb2Q7CisJY2VlLT5sb2dtb2QgPSBsb2dtb2Q7CisJY2VlLT5pb2MgPSBpb2M7CisKKwliZmFfaW9jX21ib3hfcmVnaXNyKGNlZS0+aW9jLCBCRklfTUNfQ0VFLCBiZmFfY2VlX2lzciwgY2VlKTsKKwliZmFfaW9jX2hiZmFpbF9pbml0KCZjZWUtPmhiZmFpbCwgYmZhX2NlZV9oYmZhaWwsIGNlZSk7CisJYmZhX2lvY19oYmZhaWxfcmVnaXN0ZXIoY2VlLT5pb2MsICZjZWUtPmhiZmFpbCk7CisJYmZhX3RyYyhjZWUsIDApOworfQorCisvKioKKyAqIGJmYV9jZWVfZGV0YWNoKCkKKyAqCisgKgorICogQHBhcmFtW2luXSBjZWUgLSBQb2ludGVyIHRvIHRoZSBDRUUgbW9kdWxlIGRhdGEgc3RydWN0dXJlCisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3ZvaWQKK2JmYV9jZWVfZGV0YWNoKHN0cnVjdCBiZmFfY2VlX3MgKmNlZSkKK3sKKwkvKgorCSAqIEZvciBub3csIGp1c3QgY2hlY2sgaWYgdGhlcmUgaXMgc29tZSBpb2N0bCBwZW5kaW5nIGFuZCBtYXJrIHRoYXQgYXMKKwkgKiBmYWlsZWQ/CisJICovCisJLyogYmZhX2NlZV9oYmZhaWwoY2VlKTsgKi8KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGUyZDExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY29yZS5jCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxiZmEuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BjaS5oPgorI2luY2x1ZGUgPGNzL2JmYV9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJmYV9pb2NmYy5oPgorCisjZGVmaW5lIERFRl9DRkdfTlVNX0ZBQlJJQ1MgICAgICAgICAxCisjZGVmaW5lIERFRl9DRkdfTlVNX0xQT1JUUyAgICAgICAgICAyNTYKKyNkZWZpbmUgREVGX0NGR19OVU1fQ1FTICAgICAgICAgICAgIDQKKyNkZWZpbmUgREVGX0NGR19OVU1fSU9JTV9SRVFTICAgICAgIChCRkFfSU9JTV9NQVgpCisjZGVmaW5lIERFRl9DRkdfTlVNX1RTS0lNX1JFUVMgICAgICAxMjgKKyNkZWZpbmUgREVGX0NGR19OVU1fRkNYUF9SRVFTICAgICAgIDY0CisjZGVmaW5lIERFRl9DRkdfTlVNX1VGX0JVRlMgICAgICAgICA2NAorI2RlZmluZSBERUZfQ0ZHX05VTV9SUE9SVFMgICAgICAgICAgMTAyNAorI2RlZmluZSBERUZfQ0ZHX05VTV9JVE5JTVMgICAgICAgICAgKERFRl9DRkdfTlVNX1JQT1JUUykKKyNkZWZpbmUgREVGX0NGR19OVU1fVElOUyAgICAgICAgICAgIDI1NgorCisjZGVmaW5lIERFRl9DRkdfTlVNX1NHUEdTICAgICAgICAgICAyMDQ4CisjZGVmaW5lIERFRl9DRkdfTlVNX1JFUVFfRUxFTVMgICAgICAyNTYKKyNkZWZpbmUgREVGX0NGR19OVU1fUlNQUV9FTEVNUyAgICAgIDY0CisjZGVmaW5lIERFRl9DRkdfTlVNX1NCT09UX1RHVFMgICAgICAxNgorI2RlZmluZSBERUZfQ0ZHX05VTV9TQk9PVF9MVU5TICAgICAgMTYKKworLyoqCisgKiBVc2UgdGhpcyBmdW5jdGlvbiBxdWVyeSB0aGUgbWVtb3J5IHJlcXVpcmVtZW50IG9mIHRoZSBCRkEgbGlicmFyeS4KKyAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBiZmFfYXR0YWNoKCkgdG8gZ2V0IHRoZQorICogbWVtb3J5IHJlcXVpcmVkIG9mIHRoZSBCRkEgbGF5ZXIgZm9yIGEgZ2l2ZW4gZHJpdmVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogVGhpcyBjYWxsIHdpbGwgZmFpbCwgaWYgdGhlIGNhcCBpcyBvdXQgb2YgcmFuZ2UgY29tcGFyZWQgdG8gcHJlLWRlZmluZWQKKyAqIHZhbHVlcyB3aXRoaW4gdGhlIEJGQSBsaWJyYXJ5CisgKgorICogQHBhcmFtW2luXSBjZmcgLSAJcG9pbnRlciB0byBiZmFfaW9jX2NmZ190LiBEcml2ZXIgbGF5ZXIgc2hvdWxkIGluZGljYXRlCisgKiAJCQlpdHMgY29uZmlndXJhdGlvbiBpbiB0aGlzIHN0cnVjdHVyZS4KKyAqCQkJVGhlIGRlZmF1bHQgdmFsdWVzIGZvciBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zIGNhbiBiZQorICoJCQlmZXRjaGVkIHVzaW5nIGJmYV9jZmdfZ2V0X2RlZmF1bHQoKSBBUEkuCisgKgorICogCQkJSWYgY2FwJ3MgYm91bmRhcnkgY2hlY2sgZmFpbHMsIHRoZSBsaWJyYXJ5IHdpbGwgdXNlCisgKgkJCXRoZSBkZWZhdWx0IGJmYV9jYXBfdCB2YWx1ZXMgKGFuZCBsb2cgYSB3YXJuaW5nIG1zZykuCisgKgorICogQHBhcmFtW291dF0gbWVtaW5mbyAtIHBvaW50ZXIgdG8gYmZhX21lbWluZm9fdC4gVGhpcyBjb250ZW50CisgKiAJCQlpbmRpY2F0ZXMgdGhlIG1lbW9yeSB0eXBlIChzZWUgYmZhX21lbV90eXBlX3QpIGFuZAorICoJCQlhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkLgorICoKKyAqCQkJRHJpdmVyIHNob3VsZCBhbGxvY2F0ZSB0aGUgbWVtb3J5LCBwb3B1bGF0ZSB0aGUKKyAqCQkJc3RhcnRpbmcgYWRkcmVzcyBmb3IgZWFjaCBibG9jayBhbmQgcHJvdmlkZSB0aGUgc2FtZQorICoJCQlzdHJ1Y3R1cmUgYXMgaW5wdXQgcGFyYW1ldGVyIHRvIGJmYV9hdHRhY2goKSBjYWxsLgorICoKKyAqIEByZXR1cm4gdm9pZAorICoKKyAqIFNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6IEBub3RlCisgKi8KK3ZvaWQKK2JmYV9jZmdfZ2V0X21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbykKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwl1MzIgICAgICAgIGttX2xlbiA9IDAsIGRtX2xlbiA9IDA7CisKKwliZmFfYXNzZXJ0KChjZmcgIT0gTlVMTCkgJiYgKG1lbWluZm8gIT0gTlVMTCkpOworCisJYmZhX29zX21lbXNldCgodm9pZCAqKW1lbWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmZhX21lbWluZm9fcykpOworCW1lbWluZm8tPm1lbWluZm9bQkZBX01FTV9UWVBFX0tWQSAtIDFdLm1lbV90eXBlID0KKwkJQkZBX01FTV9UWVBFX0tWQTsKKwltZW1pbmZvLT5tZW1pbmZvW0JGQV9NRU1fVFlQRV9ETUEgLSAxXS5tZW1fdHlwZSA9CisJCUJGQV9NRU1fVFlQRV9ETUE7CisKKwliZmFfaW9jZmNfbWVtaW5mbyhjZmcsICZrbV9sZW4sICZkbV9sZW4pOworCisJZm9yIChpID0gMDsgaGFsX21vZHNbaV07IGkrKykKKwkJaGFsX21vZHNbaV0tPm1lbWluZm8oY2ZnLCAma21fbGVuLCAmZG1fbGVuKTsKKworCisJbWVtaW5mby0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfS1ZBIC0gMV0ubWVtX2xlbiA9IGttX2xlbjsKKwltZW1pbmZvLT5tZW1pbmZvW0JGQV9NRU1fVFlQRV9ETUEgLSAxXS5tZW1fbGVuID0gZG1fbGVuOworfQorCisvKioKKyAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGF0dGFjaCB0aGUgZHJpdmVyIGluc3RhbmNlIHdpdGggdGhlIEJGQQorICogbGlicmFyeS4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0cmlnZ2VyIGFueSBIVyBpbml0aWFsaXphdGlvbgorICogcHJvY2VzcyAod2hpY2ggd2lsbCBiZSBkb25lIGluIGJmYV9pbml0KCkgY2FsbCkKKyAqCisgKiBUaGlzIGNhbGwgd2lsbCBmYWlsLCBpZiB0aGUgY2FwIGlzIG91dCBvZiByYW5nZSBjb21wYXJlZCB0bworICogcHJlLWRlZmluZWQgdmFsdWVzIHdpdGhpbiB0aGUgQkZBIGxpYnJhcnkKKyAqCisgKiBAcGFyYW1bb3V0XQliZmEJUG9pbnRlciB0byBiZmFfdC4KKyAqIEBwYXJhbVtpbl0JYmZhZCAJT3BhcXVlIGhhbmRsZSBiYWNrIHRvIHRoZSBkcml2ZXIncyBJT0Mgc3RydWN0dXJlCisgKiBAcGFyYW1baW5dCWNmZwlQb2ludGVyIHRvIGJmYV9pb2NfY2ZnX3QuIFNob3VsZCBiZSBzYW1lIHN0cnVjdHVyZQorICogCQkJdGhhdCB3YXMgdXNlZCBpbiBiZmFfY2ZnX2dldF9tZW1pbmZvKCkuCisgKiBAcGFyYW1baW5dIAltZW1pbmZvIFBvaW50ZXIgdG8gYmZhX21lbWluZm9fdC4gVGhlIGRyaXZlciBzaG91bGQKKyAqIAkJCXVzZSB0aGUgYmZhX2NmZ19nZXRfbWVtaW5mbygpIGNhbGwgdG8KKyAqIAkJCWZpbmQgdGhlIG1lbW9yeSBibG9ja3MgcmVxdWlyZWQsIGFsbG9jYXRlIHRoZQorICogCQkJcmVxdWlyZWQgbWVtb3J5IGFuZCBwcm92aWRlIHRoZSBzdGFydGluZyBhZGRyZXNzZXMuCisgKiBAcGFyYW1baW5dIAlwY2lkZXYJcG9pbnRlciB0byBzdHJ1Y3QgYmZhX3BjaWRldl9zCisgKgorICogQHJldHVybgorICogdm9pZAorICoKKyAqIFNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6CisgKgorICogQG5vdGUKKyAqCisgKi8KK3ZvaWQKK2JmYV9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKKwkgICAgICAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgYmZhX21lbV9lbGVtX3MgKm1lbGVtOworCisJYmZhLT5mY3MgPSBCRkFfRkFMU0U7CisKKwliZmFfYXNzZXJ0KChjZmcgIT0gTlVMTCkgJiYgKG1lbWluZm8gIT0gTlVMTCkpOworCisJLyoqCisJICogaW5pdGlhbGl6ZSBhbGwgbWVtb3J5IHBvaW50ZXJzIGZvciBpdGVyYXRpdmUgYWxsb2NhdGlvbgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBCRkFfTUVNX1RZUEVfTUFYOyBpKyspIHsKKwkJbWVsZW0gPSBtZW1pbmZvLT5tZW1pbmZvICsgaTsKKwkJbWVsZW0tPmt2YV9jdXJwID0gbWVsZW0tPmt2YTsKKwkJbWVsZW0tPmRtYV9jdXJwID0gbWVsZW0tPmRtYTsKKwl9CisKKwliZmFfaW9jZmNfYXR0YWNoKGJmYSwgYmZhZCwgY2ZnLCBtZW1pbmZvLCBwY2lkZXYpOworCisJZm9yIChpID0gMDsgaGFsX21vZHNbaV07IGkrKykKKwkJaGFsX21vZHNbaV0tPmF0dGFjaChiZmEsIGJmYWQsIGNmZywgbWVtaW5mbywgcGNpZGV2KTsKKworfQorCisvKioKKyAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhIEJGQSBJT0MuIElPQyBzaG91bGQgYmUgc3RvcHBlZCAoYnkKKyAqIGNhbGxpbmcgYmZhX3N0b3AoKSkgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FsbC4KKyAqCisgKiBAcGFyYW1baW5dIGJmYSAtIHBvaW50ZXIgdG8gYmZhX3QuCisgKgorICogQHJldHVybgorICogdm9pZAorICoKKyAqIFNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6CisgKgorICogQG5vdGUKKyAqLwordm9pZAorYmZhX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGhhbF9tb2RzW2ldOyBpKyspCisJCWhhbF9tb2RzW2ldLT5kZXRhY2goYmZhKTsKKworCWJmYV9pb2NmY19kZXRhY2goYmZhKTsKK30KKworCit2b2lkCitiZmFfaW5pdF90cmMoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QpCit7CisJYmZhLT50cmNtb2QgPSB0cmNtb2Q7Cit9CisKKwordm9pZAorYmZhX2luaXRfbG9nKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nbW9kKQoreworCWJmYS0+bG9nbSA9IGxvZ21vZDsKK30KKworCit2b2lkCitiZmFfaW5pdF9hZW4oc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfYWVuX3MgKmFlbikKK3sKKwliZmEtPmFlbiA9IGFlbjsKK30KKwordm9pZAorYmZhX2luaXRfcGxvZyhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9wbG9nX3MgKnBsb2cpCit7CisJYmZhLT5wbG9nID0gcGxvZzsKK30KKworLyoqCisgKiBJbml0aWFsaXplIElPQy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LCB3aGVuIHRoZSBJT0MgaW5pdGlhbGl6YXRpb24gaXMKKyAqIGNvbXBsZXRlZCwgdGhlIGJmYV9jYl9pbml0KCkgd2lsbCBiZSBjYWxsZWQuCisgKgorICogQHBhcmFtW2luXQliZmEJaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqCisgKiBTcGVjaWFsIENvbnNpZGVyYXRpb25zOgorICoKKyAqIEBub3RlCisgKiBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgdGhlIGRyaXZlciBzaG91bGQgcmVnaXN0ZXIgdGhlIGludGVycnVwdCBzZXJ2aWNlCisgKiByb3V0aW5lKHMpIGFuZCBlbmFibGUgdGhlIGRldmljZSBpbnRlcnJ1cHRzLiBJZiB0aGlzIGlzIG5vdCBkb25lLAorICogYmZhX2NiX2luaXQoKSB3aWxsIG5ldmVyIGdldCBjYWxsZWQKKyAqLwordm9pZAorYmZhX2luaXQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJYmZhX2lvY2ZjX2luaXQoYmZhKTsKK30KKworLyoqCisgKiBVc2UgdGhpcyBmdW5jdGlvbiBpbml0aWF0ZSB0aGUgSU9DIGNvbmZpZ3VyYXRpb24gc2V0dXAuIFRoaXMgZnVuY3Rpb24KKyAqIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgorICoKKyAqIEBwYXJhbVtpbl0JYmZhCWluc3RhbmNlCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2JmYV9zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwliZmFfaW9jZmNfc3RhcnQoYmZhKTsKK30KKworLyoqCisgKiBVc2UgdGhpcyBmdW5jdGlvbiBxdWllc2UgdGhlIElPQy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBpbW1lZGlhdGVseSwKKyAqIHdoZW4gdGhlIElPQyBpcyBhY3R1YWxseSBzdG9wcGVkLCB0aGUgYmZhX2NiX3N0b3AoKSB3aWxsIGJlIGNhbGxlZC4KKyAqCisgKiBAcGFyYW1baW5dIAliZmEgLSBwb2ludGVyIHRvIGJmYV90LgorICoKKyAqIEByZXR1cm4gTm9uZQorICoKKyAqIFNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6CisgKiBiZmFfY2Jfc3RvcCgpIGNvdWxkIGJlIGNhbGxlZCBiZWZvcmUgb3IgYWZ0ZXIgYmZhX3N0b3AoKSByZXR1cm5zLgorICoKKyAqIEBub3RlCisgKiBJbiBjYXNlIG9mIGFueSBmYWlsdXJlLCB3ZSBjb3VsZCBoYW5kbGUgaXQgYXV0b21hdGljYWxseSBieSBkb2luZyBhCisgKiByZXNldCBhbmQgdGhlbiBzdWNjZWVkIHRoZSBiZmFfc3RvcCgpIGNhbGwuCisgKi8KK3ZvaWQKK2JmYV9zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWJmYV9pb2NmY19zdG9wKGJmYSk7Cit9CisKK3ZvaWQKK2JmYV9jb21wX2RlcShzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGxpc3RfaGVhZCAqY29tcF9xKQoreworCUlOSVRfTElTVF9IRUFEKGNvbXBfcSk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZiZmEtPmNvbXBfcSwgY29tcF9xKTsKK30KKwordm9pZAorYmZhX2NvbXBfcHJvY2VzcyhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGxpc3RfaGVhZCAqY29tcF9xKQoreworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICpxZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqcWVuOworCXN0cnVjdCBiZmFfY2JfcWVfcyAgICpoY2JfcWU7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgY29tcF9xKSB7CisJCWhjYl9xZSA9IChzdHJ1Y3QgYmZhX2NiX3FlX3MgKikgcWU7CisJCWhjYl9xZS0+Y2JmbihoY2JfcWUtPmNiYXJnLCBCRkFfVFJVRSk7CisJfQorfQorCit2b2lkCitiZmFfY29tcF9mcmVlKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wX3EpCit7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKnFlOworCXN0cnVjdCBiZmFfY2JfcWVfcyAgICpoY2JfcWU7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoY29tcF9xKSkgeworCQliZmFfcV9kZXEoY29tcF9xLCAmcWUpOworCQloY2JfcWUgPSAoc3RydWN0IGJmYV9jYl9xZV9zICopIHFlOworCQloY2JfcWUtPmNiZm4oaGNiX3FlLT5jYmFyZywgQkZBX0ZBTFNFKTsKKwl9Cit9CisKK3ZvaWQKK2JmYV9hdHRhY2hfZmNzKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWJmYS0+ZmNzID0gQkZBX1RSVUU7Cit9CisKKy8qKgorICogUGVyaW9kaWMgdGltZXIgaGVhcnQgYmVhdCBmcm9tIGRyaXZlcgorICovCit2b2lkCitiZmFfdGltZXJfdGljayhzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwliZmFfdGltZXJfYmVhdCgmYmZhLT50aW1lcl9tb2QpOworfQorCisjaWZuZGVmIEJGQV9CSU9TX0JVSUxECisvKioKKyAqIFJldHVybiB0aGUgbGlzdCBvZiBQQ0kgdmVuZG9yL2RldmljZSBpZCBsaXN0cyBzdXBwb3J0ZWQgYnkgdGhpcworICogQkZBIGluc3RhbmNlLgorICovCit2b2lkCitiZmFfZ2V0X3BjaWlkcyhzdHJ1Y3QgYmZhX3BjaWlkX3MgKipwY2lpZHMsIGludCAqbnBjaWlkcykKK3sKKwlzdGF0aWMgc3RydWN0IGJmYV9wY2lpZF9zIF9fcGNpaWRzW10gPSB7CisJCXtCRkFfUENJX1ZFTkRPUl9JRF9CUk9DQURFLCBCRkFfUENJX0RFVklDRV9JRF9GQ184RzJQfSwKKwkJe0JGQV9QQ0lfVkVORE9SX0lEX0JST0NBREUsIEJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMVB9LAorCQl7QkZBX1BDSV9WRU5ET1JfSURfQlJPQ0FERSwgQkZBX1BDSV9ERVZJQ0VfSURfQ1R9LAorCX07CisKKwkqbnBjaWlkcyA9IHNpemVvZihfX3BjaWlkcykgLyBzaXplb2YoX19wY2lpZHNbMF0pOworCSpwY2lpZHMgPSBfX3BjaWlkczsKK30KKworLyoqCisgKiBVc2UgdGhpcyBmdW5jdGlvbiBxdWVyeSB0aGUgZGVmYXVsdCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zIHZhbHVlIChjb21waWxlZAorICogaW50byBCRkEgbGF5ZXIpLiBUaGUgT1MgZHJpdmVyIGNhbiB0aGVuIHR1cm4gYmFjayBhbmQgb3ZlcndyaXRlIGVudHJpZXMgdGhhdAorICogaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgYnkgdGhlIHVzZXIuCisgKgorICogQHBhcmFtW2luXSBjZmcgLSBwb2ludGVyIHRvIGJmYV9pb2NfY2ZnX3QKKyAqCisgKiBAcmV0dXJuCisgKgl2b2lkCisgKgorICogU3BlY2lhbCBDb25zaWRlcmF0aW9uczoKKyAqIAlub3RlCisgKi8KK3ZvaWQKK2JmYV9jZmdfZ2V0X2RlZmF1bHQoc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnKQoreworCWNmZy0+ZndjZmcubnVtX2ZhYnJpY3MgPSBERUZfQ0ZHX05VTV9GQUJSSUNTOworCWNmZy0+ZndjZmcubnVtX2xwb3J0cyA9IERFRl9DRkdfTlVNX0xQT1JUUzsKKwljZmctPmZ3Y2ZnLm51bV9ycG9ydHMgPSBERUZfQ0ZHX05VTV9SUE9SVFM7CisJY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzID0gREVGX0NGR19OVU1fSU9JTV9SRVFTOworCWNmZy0+ZndjZmcubnVtX3Rza2ltX3JlcXMgPSBERUZfQ0ZHX05VTV9UU0tJTV9SRVFTOworCWNmZy0+ZndjZmcubnVtX2ZjeHBfcmVxcyA9IERFRl9DRkdfTlVNX0ZDWFBfUkVRUzsKKwljZmctPmZ3Y2ZnLm51bV91Zl9idWZzID0gREVGX0NGR19OVU1fVUZfQlVGUzsKKwljZmctPmZ3Y2ZnLm51bV9jcXMgPSBERUZfQ0ZHX05VTV9DUVM7CisKKwljZmctPmRydmNmZy5udW1fcmVxcV9lbGVtcyA9IERFRl9DRkdfTlVNX1JFUVFfRUxFTVM7CisJY2ZnLT5kcnZjZmcubnVtX3JzcHFfZWxlbXMgPSBERUZfQ0ZHX05VTV9SU1BRX0VMRU1TOworCWNmZy0+ZHJ2Y2ZnLm51bV9zZ3BncyA9IERFRl9DRkdfTlVNX1NHUEdTOworCWNmZy0+ZHJ2Y2ZnLm51bV9zYm9vdF90Z3RzID0gREVGX0NGR19OVU1fU0JPT1RfVEdUUzsKKwljZmctPmRydmNmZy5udW1fc2Jvb3RfbHVucyA9IERFRl9DRkdfTlVNX1NCT09UX0xVTlM7CisJY2ZnLT5kcnZjZmcucGF0aF90b3YgPSBCRkFfRkNQSU1fUEFUSFRPVl9ERUY7CisJY2ZnLT5kcnZjZmcuaW9jX3JlY292ZXIgPSBCRkFfRkFMU0U7CisJY2ZnLT5kcnZjZmcuZGVsYXlfY29tcCA9IEJGQV9GQUxTRTsKKworfQorCit2b2lkCitiZmFfY2ZnX2dldF9taW4oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnKQoreworCWJmYV9jZmdfZ2V0X2RlZmF1bHQoY2ZnKTsKKwljZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMgICA9IEJGQV9JT0lNX01JTjsKKwljZmctPmZ3Y2ZnLm51bV90c2tpbV9yZXFzICA9IEJGQV9UU0tJTV9NSU47CisJY2ZnLT5md2NmZy5udW1fZmN4cF9yZXFzICAgPSBCRkFfRkNYUF9NSU47CisJY2ZnLT5md2NmZy5udW1fdWZfYnVmcyAgICAgPSBCRkFfVUZfTUlOOworCWNmZy0+ZndjZmcubnVtX3Jwb3J0cyAgICAgID0gQkZBX1JQT1JUX01JTjsKKworCWNmZy0+ZHJ2Y2ZnLm51bV9zZ3BncyAgICAgID0gQkZBX1NHUEdfTUlOOworCWNmZy0+ZHJ2Y2ZnLm51bV9yZXFxX2VsZW1zID0gQkZBX1JFUVFfTkVMRU1TX01JTjsKKwljZmctPmRydmNmZy5udW1fcnNwcV9lbGVtcyA9IEJGQV9SU1BRX05FTEVNU19NSU47CisJY2ZnLT5kcnZjZmcubWluX2NmZyAgICAgICAgPSBCRkFfVFJVRTsKK30KKwordm9pZAorYmZhX2dldF9hdHRyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2lvY19hdHRyX3MgKmlvY19hdHRyKQoreworCWJmYV9pb2NfZ2V0X2F0dHIoJmJmYS0+aW9jLCBpb2NfYXR0cik7Cit9CisKKy8qKgorICogUmV0cmlldmUgZmlybXdhcmUgdHJhY2UgaW5mb3JtYXRpb24gb24gSU9DIGZhaWx1cmUuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2RlYnVnX2Z3c2F2ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqdHJjZGF0YSwgaW50ICp0cmNsZW4pCit7CisJcmV0dXJuIGJmYV9pb2NfZGVidWdfZndzYXZlKCZiZmEtPmlvYywgdHJjZGF0YSwgdHJjbGVuKTsKK30KKworLyoqCisgKiAJCUZldGNoIGZpcm13YXJlIHRyYWNlIGRhdGEuCisgKgorICogQHBhcmFtW2luXQkJYmZhCQkJQkZBIGluc3RhbmNlCisgKiBAcGFyYW1bb3V0XQkJdHJjZGF0YQkJRmlybXdhcmUgdHJhY2UgYnVmZmVyCisgKiBAcGFyYW1baW4sb3V0XQl0cmNsZW4JCUZpcm13YXJlIHRyYWNlIGJ1ZmZlciBsZW4KKyAqCisgKiBAcmV0dmFsIEJGQV9TVEFUVVNfT0sJCQlGaXJtd2FyZSB0cmFjZSBpcyBmZXRjaGVkLgorICogQHJldHZhbCBCRkFfU1RBVFVTX0lOUFJPR1JFU1MJRmlybXdhcmUgdHJhY2UgZmV0Y2ggaXMgaW4gcHJvZ3Jlc3MuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2RlYnVnX2Z3dHJjKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICp0cmNkYXRhLCBpbnQgKnRyY2xlbikKK3sKKwlyZXR1cm4gYmZhX2lvY19kZWJ1Z19md3RyYygmYmZhLT5pb2MsIHRyY2RhdGEsIHRyY2xlbik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NzZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NzZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcxZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY3NkZWJ1Zy5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNzL2JmYV9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKyNpbmNsdWRlIDxjcy9iZmFfcS5oPgorI2luY2x1ZGUgPGxvZy9iZmFfbG9nX2hhbC5oPgorCisvKioKKyAqICBjc19kZWJ1Z19hcGkKKyAqLworCisKK3ZvaWQKK2JmYV9wYW5pYyhpbnQgbGluZSwgY2hhciAqZmlsZSwgY2hhciAqcGFuaWNzdHIpCit7CisJYmZhX2xvZyhOVUxMLCBCRkFfTE9HX0hBTF9BU1NFUlQsIGZpbGUsIGxpbmUsIHBhbmljc3RyKTsKKwliZmFfb3NfcGFuaWMoKTsKK30KKwordm9pZAorYmZhX3NtX3BhbmljKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtLCBpbnQgbGluZSwgY2hhciAqZmlsZSwgaW50IGV2ZW50KQoreworCWJmYV9sb2cobG9nbSwgQkZBX0xPR19IQUxfU01fQVNTRVJULCBmaWxlLCBsaW5lLCBldmVudCk7CisJYmZhX29zX3BhbmljKCk7Cit9CisKK2ludAorYmZhX3FfaXNfb25fcV9mdW5jKHN0cnVjdCBsaXN0X2hlYWQgKnEsIHN0cnVjdCBsaXN0X2hlYWQgKnFlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICp0cWU7CisKKwl0cWUgPSBiZmFfcV9uZXh0KHEpOworCXdoaWxlICh0cWUgIT0gcSkgeworCQlpZiAodHFlID09IHFlKQorCQkJcmV0dXJuICgxKTsKKwkJdHFlID0gYmZhX3FfbmV4dCh0cWUpOworCQlpZiAodHFlID09IE5VTEwpCisJCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDFiYWJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8bG9nL2JmYV9sb2dfaGFsLmg+CisKK0JGQV9UUkNfRklMRShIQUwsIEZDUElNKTsKK0JGQV9NT0RVTEUoZmNwaW0pOworCisvKioKKyAqICBoYWxfZmNwaW1fbW9kIEJGQSBGQ1AgSW5pdGlhdG9yIE1vZGUgbW9kdWxlCisgKi8KKworLyoqCisgKiAJCUNvbXB1dGUgYW5kIHJldHVybiBtZW1vcnkgbmVlZGVkIGJ5IEZDUChpbSkgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2ZjcGltX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKKwkJdTMyICpkbV9sZW4pCit7CisJYmZhX2l0bmltX21lbWluZm8oY2ZnLCBrbV9sZW4sIGRtX2xlbik7CisKKwkvKioKKwkgKiBJTyBtZW1vcnkKKwkgKi8KKwlpZiAoY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzIDwgQkZBX0lPSU1fTUlOKQorCQljZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMgPSBCRkFfSU9JTV9NSU47CisJZWxzZSBpZiAoY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzID4gQkZBX0lPSU1fTUFYKQorCQljZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMgPSBCRkFfSU9JTV9NQVg7CisKKwkqa21fbGVuICs9IGNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyAqCisJICAoc2l6ZW9mKHN0cnVjdCBiZmFfaW9pbV9zKSArIHNpemVvZihzdHJ1Y3QgYmZhX2lvaW1fc3BfcykpOworCisJKmRtX2xlbiArPSBjZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMgKiBCRklfSU9JTV9TTlNMRU47CisKKwkvKioKKwkgKiB0YXNrIG1hbmFnZW1lbnQgY29tbWFuZCBtZW1vcnkKKwkgKi8KKwlpZiAoY2ZnLT5md2NmZy5udW1fdHNraW1fcmVxcyA8IEJGQV9UU0tJTV9NSU4pCisJCWNmZy0+ZndjZmcubnVtX3Rza2ltX3JlcXMgPSBCRkFfVFNLSU1fTUlOOworCSprbV9sZW4gKz0gY2ZnLT5md2NmZy5udW1fdHNraW1fcmVxcyAqIHNpemVvZihzdHJ1Y3QgYmZhX3Rza2ltX3MpOworfQorCisKK3N0YXRpYyB2b2lkCitiZmFfZmNwaW1fYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCSAgICAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKK3sKKwlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKworCWJmYV90cmMoYmZhLCBjZmctPmRydmNmZy5wYXRoX3Rvdik7CisJYmZhX3RyYyhiZmEsIGNmZy0+ZndjZmcubnVtX3Jwb3J0cyk7CisJYmZhX3RyYyhiZmEsIGNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyk7CisJYmZhX3RyYyhiZmEsIGNmZy0+ZndjZmcubnVtX3Rza2ltX3JlcXMpOworCisJZmNwaW0tPmJmYSAgICAgICAgICAgID0gYmZhOworCWZjcGltLT5udW1faXRuaW1zICAgICA9IGNmZy0+ZndjZmcubnVtX3Jwb3J0czsKKwlmY3BpbS0+bnVtX2lvaW1fcmVxcyAgPSBjZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXM7CisJZmNwaW0tPm51bV90c2tpbV9yZXFzID0gY2ZnLT5md2NmZy5udW1fdHNraW1fcmVxczsKKwlmY3BpbS0+cGF0aF90b3YgICAgICAgPSBjZmctPmRydmNmZy5wYXRoX3RvdjsKKwlmY3BpbS0+ZGVsYXlfY29tcAkgID0gY2ZnLT5kcnZjZmcuZGVsYXlfY29tcDsKKworCWJmYV9pdG5pbV9hdHRhY2goZmNwaW0sIG1lbWluZm8pOworCWJmYV90c2tpbV9hdHRhY2goZmNwaW0sIG1lbWluZm8pOworCWJmYV9pb2ltX2F0dGFjaChmY3BpbSwgbWVtaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNwaW1faW5pdGRvbmUoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNwaW1fZGV0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCisJYmZhX2lvaW1fZGV0YWNoKGZjcGltKTsKKwliZmFfdHNraW1fZGV0YWNoKGZjcGltKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3BpbV9zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3BpbV9zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX2ZjcGltX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqcWUsICpxZW47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJmZjcGltLT5pdG5pbV9xKSB7CisJCWl0bmltID0gKHN0cnVjdCBiZmFfaXRuaW1fcyAqKSBxZTsKKwkJYmZhX2l0bmltX2lvY2Rpc2FibGUoaXRuaW0pOworCX0KK30KKwordm9pZAorYmZhX2ZjcGltX3BhdGhfdG92X3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHBhdGhfdG92KQoreworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCisJZmNwaW0tPnBhdGhfdG92ID0gcGF0aF90b3YgKiAxMDAwOworCWlmIChmY3BpbS0+cGF0aF90b3YgPiBCRkFfRkNQSU1fUEFUSFRPVl9NQVgpCisJCWZjcGltLT5wYXRoX3RvdiA9IEJGQV9GQ1BJTV9QQVRIVE9WX01BWDsKK30KKwordTE2CitiZmFfZmNwaW1fcGF0aF90b3ZfZ2V0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCisJcmV0dXJuIChmY3BpbS0+cGF0aF90b3YgLyAxMDAwKTsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fZ2V0X21vZHN0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2ZjcGltX3N0YXRzX3MgKm1vZHN0YXRzKQoreworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCisJKm1vZHN0YXRzID0gZmNwaW0tPnN0YXRzOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2ZjcGltX2Nscl9tb2RzdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKworCW1lbXNldCgmZmNwaW0tPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9mY3BpbV9zdGF0c19zKSk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKwordm9pZAorYmZhX2ZjcGltX3FkZXB0aF9zZXQoc3RydWN0IGJmYV9zICpiZmEsIHUxNiBxX2RlcHRoKQoreworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCisJYmZhX2Fzc2VydChxX2RlcHRoIDw9IEJGQV9JT0NGQ19RREVQVEhfTUFYKTsKKworCWZjcGltLT5xX2RlcHRoID0gcV9kZXB0aDsKK30KKwordTE2CitiZmFfZmNwaW1fcWRlcHRoX2dldChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKworCXJldHVybiAoZmNwaW0tPnFfZGVwdGgpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTMyMDZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW1fcHJpdi5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfRkNQSU1fUFJJVl9IX18KKyNkZWZpbmUgX19CRkFfRkNQSU1fUFJJVl9IX18KKworI2luY2x1ZGUgPGJmYV9mY3BpbS5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfZmNwaW0uaD4KKyNpbmNsdWRlIDxjcy9iZmFfd2MuaD4KKyNpbmNsdWRlICJiZmFfc2dwZ19wcml2LmgiCisKKyNkZWZpbmUgQkZBX0lUTklNX01JTiAgIDMyCisjZGVmaW5lIEJGQV9JVE5JTV9NQVggICAxMDI0CisKKyNkZWZpbmUgQkZBX0lPSU1fTUlOICAgIDgKKyNkZWZpbmUgQkZBX0lPSU1fTUFYICAgIDIwMDAKKworI2RlZmluZSBCRkFfVFNLSU1fTUlOICAgNAorI2RlZmluZSBCRkFfVFNLSU1fTUFYICAgNTEyCisjZGVmaW5lIEJGQV9GQ1BJTV9QQVRIVE9WX0RFRgkoMzAgKiAxMDAwKQkvKiBpbiBtaWxsaXNlY3MgKi8KKyNkZWZpbmUgQkZBX0ZDUElNX1BBVEhUT1ZfTUFYCSg5MCAqIDEwMDApCS8qIGluIG1pbGxpc2VjcyAqLworCisjZGVmaW5lIGJmYV9mY3BpbV9zdGF0cyhfX2ZjcGltLCBfX3N0YXRzKSAgIFwKKyAgICAoX19mY3BpbSktPnN0YXRzLl9fc3RhdHMgKysKKworc3RydWN0IGJmYV9mY3BpbV9tb2RfcyB7CisJc3RydWN0IGJmYV9zIAkqYmZhOworCXN0cnVjdCBiZmFfaXRuaW1fcyAJKml0bmltX2FycjsKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAJKmlvaW1fYXJyOworCXN0cnVjdCBiZmFfaW9pbV9zcF9zICppb2ltX3NwX2FycjsKKwlzdHJ1Y3QgYmZhX3Rza2ltX3MgCSp0c2tpbV9hcnI7CisJc3RydWN0IGJmYV9kbWFfcwlzbnNiYXNlOworCWludAkJCW51bV9pdG5pbXM7CisJaW50CQkJbnVtX2lvaW1fcmVxczsKKwlpbnQJCQludW1fdHNraW1fcmVxczsKKwl1MzIJCXBhdGhfdG92OworCXUxNgkJcV9kZXB0aDsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGxpc3RfaGVhZCAJaXRuaW1fcTsgICAgICAgIC8qICBxdWV1ZSBvZiBhY3RpdmUgaXRuaW0gICAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIAlpb2ltX2ZyZWVfcTsgICAgLyogIGZyZWUgSU8gcmVzb3VyY2VzICAgICAgICAqLworCXN0cnVjdCBsaXN0X2hlYWQgCWlvaW1fcmVzZnJlZV9xOyAvKiAgSU9zIHdhaXRpbmcgZm9yIGYvdyAgICAgICovCisJc3RydWN0IGxpc3RfaGVhZCAJaW9pbV9jb21wX3E7ICAgIC8qICBJTyBnbG9iYWwgY29tcCBRICAgICAgICAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIAl0c2tpbV9mcmVlX3E7CisJdTMyCWlvc19hY3RpdmU7CS8qICBjdXJyZW50IGFjdGl2ZSBJT3MJICAgICAgKi8KKwl1MzIJZGVsYXlfY29tcDsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3N0YXRzX3Mgc3RhdHM7Cit9OworCitzdHJ1Y3QgYmZhX2lvaW1fczsKK3N0cnVjdCBiZmFfdHNraW1fczsKKworLyoqCisgKiBCRkEgSU8gKGluaXRpYXRvciBtb2RlKQorICovCitzdHJ1Y3QgYmZhX2lvaW1fcyB7CisJc3RydWN0IGxpc3RfaGVhZCBxZTsJCS8qICBxdWV1ZSBlbGVtZW10ICAgICAgICAgICAgKi8KKwliZmFfc21fdAkJc207IAkvKiAgQkZBIGlvaW0gc3RhdGUgbWFjaGluZSAgICovCisJc3RydWN0IGJmYV9zIAkgICAgICAgICpiZmE7CS8qICBCRkEgbW9kdWxlICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zCSpmY3BpbTsJLyogIHBhcmVudCBmY3BpbSBtb2R1bGUgICAgICAqLworCXN0cnVjdCBiZmFfaXRuaW1fcyAJKml0bmltOwkvKiAgaS10LW4gbmV4dXMgZm9yIHRoaXMgSU8gICovCisJc3RydWN0IGJmYWRfaW9pbV9zIAkqZGlvOwkvKiAgZHJpdmVyIElPIGhhbmRsZSAgICAgICAgICovCisJdTE2CWlvdGFnOwkJLyogIEZXSSBJTyB0YWcgICAgICAgICAgICAgICAqLworCXUxNglhYm9ydF90YWc7CS8qICB1bnFpdWUgYWJvcnQgcmVxdWVzdCB0YWcgKi8KKwl1MTYJbnNnZXM7CQkvKiAgbnVtYmVyIG9mIFNHIGVsZW1lbnRzICAgICovCisJdTE2CW5zZ3BnczsJCS8qICBudW1iZXIgb2YgU0cgcGFnZXMgICAgICAgKi8KKwlzdHJ1Y3QgYmZhX3NncGdfcyAqc2dwZzsJLyogIGZpcnN0IFNHIHBhZ2UgICAgICAgICAgICAqLworCXN0cnVjdCBsaXN0X2hlYWQgc2dwZ19xOwkJLyogIGFsbG9jYXRlZCBTRyBwYWdlcyAgICAgICAqLworCXN0cnVjdCBiZmFfY2JfcWVfcyBoY2JfcWU7CS8qICBiZmEgY2FsbGJhY2sgcWVsZW0gICAgICAgKi8KKwliZmFfY2JfY2Jmbl90IGlvX2NiZm47CQkvKiAgSU8gY29tcGxldGlvbiBoYW5kbGVyICAgICovCisJc3RydWN0IGJmYV9pb2ltX3NwX3MgKmlvc3A7CS8qICBzbG93LXBhdGggSU8gaGFuZGxpbmcgICAgKi8KK307CisKK3N0cnVjdCBiZmFfaW9pbV9zcF9zIHsKKwlzdHJ1Y3QgYmZpX21zZ19zIAljb21wX3JzcG1zZzsJLyogIElPIGNvbXAgZi93IHJlc3BvbnNlICAgICAqLworCXU4CQkJKnNuc2luZm87CS8qICBzZW5zZSBpbmZvIGZvciB0aGlzIElPICAgKi8KKwlzdHJ1Y3QgYmZhX3NncGdfd3FlX3Mgc2dwZ193cWU7CS8qICB3YWl0cSBlbGVtIGZvciBzZ3BnICAgICAgKi8KKwlzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zIHJlcXFfd2FpdDsJLyogIHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxcSAqLworCWJmYV9ib29sZWFuX3QJCWFib3J0X2V4cGxpY2l0OwkvKiAgYWJvcnRlZCBieSBPUyAgICAgICAgICAgICovCisJc3RydWN0IGJmYV90c2tpbV9zCSp0c2tpbTsJCS8qICBSZWxldmFudCBUTSBjbWQgICAgICAgICAgKi8KK307CisKKy8qKgorICogQkZBIFRhc2sgbWFuYWdlbWVudCBjb21tYW5kIChpbml0aWF0b3IgbW9kZSkKKyAqLworc3RydWN0IGJmYV90c2tpbV9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgIHFlOworCWJmYV9zbV90CQlzbTsKKwlzdHJ1Y3QgYmZhX3MgICAgICAgICAgICAqYmZhOyAgICAgICAgLyogIEJGQSBtb2R1bGUgICovCisJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAgKmZjcGltOyAgICAgIC8qICBwYXJlbnQgZmNwaW0gbW9kdWxlICAgICAgKi8KKwlzdHJ1Y3QgYmZhX2l0bmltX3MgICAgICAqaXRuaW07ICAgICAgLyogIGktdC1uIG5leHVzIGZvciB0aGlzIElPICAqLworCXN0cnVjdCBiZmFkX3Rza2ltX3MgICAgICAgICAqZHRzazsgICAvKiAgZHJpdmVyIHRhc2sgbWdtdCBjbW5kICAgICovCisJYmZhX2Jvb2xlYW5fdCAgICAgICAgbm90aWZ5OyAgICAgICAgIC8qICBub3RpZnkgaXRuaW0gb24gVE0gY29tcCAgKi8KKwlsdW5fdCAgICAgICAgICAgICAgICBsdW47ICAgICAgICAgICAgLyogIGx1biBpZiBhcHBsaWNhYmxlICAgICAgICAqLworCWVudW0gZmNwX3RtX2NtbmQgICAgICAgIHRtX2NtbmQ7ICAgICAvKiAgdGFzayBtYW5hZ2VtZW50IGNvbW1hbmQgICovCisJdTE2ICAgICAgICAgICAgIHRza190YWc7ICAgICAgICAvKiAgRldJIElPIHRhZyAgICAgICAgICAgICAgICovCisJdTggICAgICAgICAgICAgIHRzZWNzOyAgICAgICAgICAvKiAgdGltZW91dCBpbiBzZWNvbmRzICAgICAgICovCisJc3RydWN0IGJmYV9yZXFxX3dhaXRfcyAgcmVxcV93YWl0OyAgIC8qICB0byB3YWl0IGZvciByb29tIGluIHJlcXEgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICBpb19xOyAgICAvKiAgcXVldWUgb2YgYWZmZWN0ZWQgSU9zICAgICovCisJc3RydWN0IGJmYV93Y19zICAgICAgICAgICAgIHdjOyAgICAgIC8qICB3YWl0aW5nIGNvdW50ZXIgICAgICAgICAgKi8KKwlzdHJ1Y3QgYmZhX2NiX3FlX3MJaGNiX3FlOyAgICAgIC8qICBiZmEgY2FsbGJhY2sgcWVsZW0gICAgICAgKi8KKwllbnVtIGJmaV90c2tpbV9zdGF0dXMgICB0c2tfc3RhdHVzOyAgLyogIFRNIHN0YXR1cyAgICAgICAgICAgICAgICAqLworfTsKKworLyoqCisgKiBCRkEgaS10LW4gKGluaXRpYXRvciBtb2RlKQorICovCitzdHJ1Y3QgYmZhX2l0bmltX3MgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgcWU7CQkvKiAgcXVldWUgZWxlbWVudCAgICAgICAgICAgICAgICovCisJYmZhX3NtX3QJICBzbTsJCS8qICBpLXQtbiBpbSBCRkEgc3RhdGUgbWFjaGluZSAgKi8KKwlzdHJ1Y3QgYmZhX3MgICAgICAqYmZhOwkJLyogIGJmYSBpbnN0YW5jZSAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQ7CS8qICBiZmEgcnBvcnQgICAgICAgICAgICAgICAgICAgKi8KKwl2b2lkICAgICAgICAgICAqZGl0bjsJCS8qICBkcml2ZXIgaS10LW4gc3RydWN0dXJlICAgICAgKi8KKwlzdHJ1Y3QgYmZpX21oZHJfcyAgICAgIG1oZHI7CS8qICBwcmUtYnVpbHQgbWhkciAgICAgICAgICAgICAgKi8KKwl1OCAgICAgICAgIG1zZ19ubzsJCS8qICBpdG5pbS9ycG9ydCBmaXJtd2FyZSBoYW5kbGUgKi8KKwl1OCAgICAgICAgIHJlcXE7CQkvKiAgQ1EgZm9yIHJlcXVlc3RzICAgICAgICAgICAgICovCisJc3RydWN0IGJmYV9jYl9xZV9zICAgIGhjYl9xZTsJLyogIGJmYSBjYWxsYmFjayBxZWxlbSAgICAgICAgICAqLworCXN0cnVjdCBsaXN0X2hlYWQgcGVuZGluZ19xOwkvKiAgcXVldWUgb2YgcGVuZGluZyBJTyByZXF1ZXN0cyovCisJc3RydWN0IGxpc3RfaGVhZCBpb19xOwkJLyogIHF1ZXVlIG9mIGFjdGl2ZSBJTyByZXF1ZXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaW9fY2xlYW51cF9xOwkvKiAgSU8gYmVpbmcgY2xlYW5lZCB1cCAgICAgICAgICovCisJc3RydWN0IGxpc3RfaGVhZCB0c2tfcTsJCS8qICBxdWV1ZSBvZiBhY3RpdmUgVE0gY29tbWFuZHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICBkZWxheV9jb21wX3E7LyogIHF1ZXVlIG9mIGZhaWxlZCBpbmZsaWdodCBjbWRzICovCisJYmZhX2Jvb2xlYW5fdCAgIHNlcV9yZWM7CS8qICBTUUVSIHN1cHBvcnRlZCAgICAgICAgICAgICAgKi8KKwliZmFfYm9vbGVhbl90ICAgaXNfb25saW5lOwkvKiAgaXRuaW0gaXMgT05MSU5FIGZvciBJTyAgICAgICovCisJYmZhX2Jvb2xlYW5fdCAgIGlvdG92X2FjdGl2ZTsJLyogIElPIFRPViB0aW1lciBpcyBhY3RpdmUJICovCisJc3RydWN0IGJmYV93Y19zICAgICAgICB3YzsJLyogIHdhaXRpbmcgY291bnRlciAgICAgICAgICAgICAqLworCXN0cnVjdCBiZmFfdGltZXJfcyB0aW1lcjsJLyogIHBlbmRpbmcgSU8gVE9WCQkgKi8KKwlzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zIHJlcXFfd2FpdDsgLyogIHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxcSAqLworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltOwkvKiAgZmNwaW0gbW9kdWxlICAgICAgICAgICAgICAgICovCisJc3RydWN0IGJmYV9pdG5pbV9oYWxfc3RhdHNfcwlzdGF0czsKK307CisKKyNkZWZpbmUgYmZhX2l0bmltX2lzX29ubGluZShfaXRuaW0pIChfaXRuaW0pLT5pc19vbmxpbmUKKyNkZWZpbmUgQkZBX0ZDUElNX01PRChfaGFsKSAoJihfaGFsKS0+bW9kdWxlcy5mY3BpbV9tb2QpCisjZGVmaW5lIEJGQV9JT0lNX0ZST01fVEFHKF9mY3BpbSwgX2lvdGFnKQlcCisJKCZmY3BpbS0+aW9pbV9hcnJbX2lvdGFnXSkKKyNkZWZpbmUgQkZBX1RTS0lNX0ZST01fVEFHKF9mY3BpbSwgX3RtdGFnKSAgICAgICAgICAgICAgICAgIFwKKyAgICAoJmZjcGltLT50c2tpbV9hcnJbX3RtdGFnICYgKGZjcGltLT5udW1fdHNraW1fcmVxcyAtIDEpXSkKKworLyoKKyAqIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLwordm9pZCAgICAgICAgICAgIGJmYV9pb2ltX2F0dGFjaChzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSwKKwkJCQkgICAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvKTsKK3ZvaWQgICAgICAgICAgICBiZmFfaW9pbV9kZXRhY2goc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0pOwordm9pZCAgICAgICAgICAgIGJmYV9pb2ltX2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbXNnKTsKK3ZvaWQgICAgICAgICAgICBiZmFfaW9pbV9nb29kX2NvbXBfaXNyKHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJCQlzdHJ1Y3QgYmZpX21zZ19zICptc2cpOwordm9pZCAgICAgICAgICAgIGJmYV9pb2ltX2NsZWFudXAoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOwordm9pZCAgICAgICAgICAgIGJmYV9pb2ltX2NsZWFudXBfdG0oc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sCisJCQkJCXN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0pOwordm9pZCAgICAgICAgICAgIGJmYV9pb2ltX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOwordm9pZCAgICAgICAgICAgIGJmYV9pb2ltX3RvdihzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSk7CisKK3ZvaWQgICAgICAgICAgICBiZmFfdHNraW1fYXR0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltLAorCQkJCSAgICAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvKTsKK3ZvaWQgICAgICAgICAgICBiZmFfdHNraW1fZGV0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltKTsKK3ZvaWQgICAgICAgICAgICBiZmFfdHNraW1faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptc2cpOwordm9pZCAgICAgICAgICAgIGJmYV90c2tpbV9pb2RvbmUoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSk7Cit2b2lkICAgICAgICAgICAgYmZhX3Rza2ltX2lvY2Rpc2FibGUoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSk7Cit2b2lkICAgICAgICAgICAgYmZhX3Rza2ltX2NsZWFudXAoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSk7CisKK3ZvaWQgICAgICAgICAgICBiZmFfaXRuaW1fbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHUzMiAqa21fbGVuLAorCQkJCSAgICAgIHUzMiAqZG1fbGVuKTsKK3ZvaWQgICAgICAgICAgICBiZmFfaXRuaW1fYXR0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltLAorCQkJCSAgICAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvKTsKK3ZvaWQgICAgICAgICAgICBiZmFfaXRuaW1fZGV0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltKTsKK3ZvaWQgICAgICAgICAgICBiZmFfaXRuaW1faW9jZGlzYWJsZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKTsKK3ZvaWQgICAgICAgICAgICBiZmFfaXRuaW1faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptc2cpOwordm9pZCAgICAgICAgICAgIGJmYV9pdG5pbV9pb2RvbmUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSk7Cit2b2lkICAgICAgICAgICAgYmZhX2l0bmltX3Rza2RvbmUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSk7CitiZmFfYm9vbGVhbl90ICAgYmZhX2l0bmltX2hvbGRfaW8oc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSk7CisKKyNlbmRpZiAvKiBfX0JGQV9GQ1BJTV9QUklWX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjQzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BvcnQuYwpAQCAtMCwwICsxLDE2NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX3Bwb3J0Lmg+CisjaW5jbHVkZSA8Y3MvYmZhX2RlYnVnLmg+CisjaW5jbHVkZSA8YWVuL2JmYV9hZW4uaD4KKyNpbmNsdWRlIDxjcy9iZmFfcGxvZy5oPgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuX3BvcnQuaD4KKworQkZBX1RSQ19GSUxFKEhBTCwgUFBPUlQpOworQkZBX01PRFVMRShwcG9ydCk7CisKKyNkZWZpbmUgYmZhX3Bwb3J0X2NhbGxiYWNrKF9fcHBvcnQsIF9fZXZlbnQpIGRvIHsJCQlcCisJaWYgKChfX3Bwb3J0KS0+YmZhLT5mY3MpIHsgICAgICBcCisJCShfX3Bwb3J0KS0+ZXZlbnRfY2JmbigoX19wcG9ydCktPmV2ZW50X2NiYXJnLCAoX19ldmVudCkpOyAgICAgIFwKKwl9IGVsc2UgewkJCQkJCQlcCisJCShfX3Bwb3J0KS0+aGNiX2V2ZW50ID0gKF9fZXZlbnQpOyAgICAgIFwKKwkJYmZhX2NiX3F1ZXVlKChfX3Bwb3J0KS0+YmZhLCAmKF9fcHBvcnQpLT5oY2JfcWUsCVwKKwkJX19iZmFfY2JfcG9ydF9ldmVudCwgKF9fcHBvcnQpKTsgICAgICBcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFRoZSBwb3J0IGlzIGNvbnNpZGVyZWQgZGlzYWJsZWQgaWYgY29ycmVzcG9uZGluZyBwaHlzaWNhbCBwb3J0IG9yIElPQyBhcmUKKyAqIGRpc2FibGVkIGV4cGxpY2l0bHkKKyAqLworI2RlZmluZSBCRkFfUE9SVF9JU19ESVNBQkxFRChiZmEpIFwKKwkoKGJmYV9wcG9ydF9pc19kaXNhYmxlZChiZmEpID09IEJGQV9UUlVFKSB8fCBcCisJKGJmYV9pb2NfaXNfZGlzYWJsZWQoJmJmYS0+aW9jKSA9PSBCRkFfVFJVRSkpCisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgYmZhX2Jvb2xlYW5fdCBiZmFfcHBvcnRfc2VuZF9lbmFibGUoc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0KTsKK3N0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV9wcG9ydF9zZW5kX2Rpc2FibGUoc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfcHBvcnRfdXBkYXRlX2xpbmtpbmZvKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9wcG9ydF9yZXNldF9saW5raW5mbyhzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfcHBvcnRfc2V0X3d3bnMoc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0KTsKK3N0YXRpYyB2b2lkICAgICBfX2JmYV9jYl9wb3J0X2V2ZW50KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkICAgICBfX2JmYV9jYl9wb3J0X3N0YXRzKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkICAgICBfX2JmYV9jYl9wb3J0X3N0YXRzX2Nscih2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCAgICAgYmZhX3BvcnRfc3RhdHNfdGltZW91dCh2b2lkICpjYmFyZyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX3BvcnRfc3RhdHNfY2xyX3RpbWVvdXQodm9pZCAqY2JhcmcpOworCisvKioKKyAqICBiZmFfcHBvcnRfcHJpdmF0ZQorICovCisKKy8qKgorICogQkZBIHBvcnQgc3RhdGUgbWFjaGluZSBldmVudHMKKyAqLworZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgeworCUJGQV9QUE9SVF9TTV9TVEFSVCA9IDEsCS8qICBzdGFydCBwb3J0IHN0YXRlIG1hY2hpbmUgKi8KKwlCRkFfUFBPUlRfU01fU1RPUCA9IDIsCS8qICBzdG9wIHBvcnQgc3RhdGUgbWFjaGluZSAqLworCUJGQV9QUE9SVF9TTV9FTkFCTEUgPSAzLAkvKiAgZW5hYmxlIHBvcnQgKi8KKwlCRkFfUFBPUlRfU01fRElTQUJMRSA9IDQsCS8qICBkaXNhYmxlIHBvcnQgc3RhdGUgbWFjaGluZSAqLworCUJGQV9QUE9SVF9TTV9GV1JTUCA9IDUsCS8qICBmaXJtd2FyZSBlbmFibGUvZGlzYWJsZSByc3AgKi8KKwlCRkFfUFBPUlRfU01fTElOS1VQID0gNiwJLyogIGZpcm13YXJlIGxpbmt1cCBldmVudCAqLworCUJGQV9QUE9SVF9TTV9MSU5LRE9XTiA9IDcsCS8qICBmaXJtd2FyZSBsaW5rdXAgZG93biAqLworCUJGQV9QUE9SVF9TTV9RUkVTVU1FID0gOCwJLyogIENRIHNwYWNlIGF2YWlsYWJsZSAqLworCUJGQV9QUE9SVF9TTV9IV0ZBSUwgPSA5LAkvKiAgSU9DIGgvdyBmYWlsdXJlICovCit9OworCitzdGF0aWMgdm9pZCAgICAgYmZhX3Bwb3J0X3NtX3VuaW5pdChzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0LAorCQkJCSAgICBlbnVtIGJmYV9wcG9ydF9zbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX3Bwb3J0X3NtX2VuYWJsaW5nX3F3YWl0KHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsCisJCQkJCSAgICBlbnVtIGJmYV9wcG9ydF9zbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX3Bwb3J0X3NtX2VuYWJsaW5nKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsCisJCQkJICAgICAgZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9wcG9ydF9zbV9saW5rZG93bihzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0LAorCQkJCSAgICAgIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfcHBvcnRfc21fbGlua3VwKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsCisJCQkJICAgIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfcHBvcnRfc21fZGlzYWJsaW5nKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsCisJCQkJICAgICAgIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfcHBvcnRfc21fZGlzYWJsaW5nX3F3YWl0KHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsCisJCQkJCSAgICAgZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9wcG9ydF9zbV9kaXNhYmxlZChzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0LAorCQkJCSAgICAgIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfcHBvcnRfc21fc3RvcHBlZChzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0LAorCQkJCSAgICAgZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9wcG9ydF9zbV9pb2Nkb3duKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsCisJCQkJICAgICBlbnVtIGJmYV9wcG9ydF9zbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX3Bwb3J0X3NtX2lvY2ZhaWwoc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCwKKwkJCQkgICAgIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KTsKKworc3RhdGljIHN0cnVjdCBiZmFfc21fdGFibGVfcyBoYWxfcHBvcnRfc21fdGFibGVbXSA9IHsKKwl7QkZBX1NNKGJmYV9wcG9ydF9zbV91bmluaXQpLCBCRkFfUFBPUlRfU1RfVU5JTklUfSwKKwl7QkZBX1NNKGJmYV9wcG9ydF9zbV9lbmFibGluZ19xd2FpdCksIEJGQV9QUE9SVF9TVF9FTkFCTElOR19RV0FJVH0sCisJe0JGQV9TTShiZmFfcHBvcnRfc21fZW5hYmxpbmcpLCBCRkFfUFBPUlRfU1RfRU5BQkxJTkd9LAorCXtCRkFfU00oYmZhX3Bwb3J0X3NtX2xpbmtkb3duKSwgQkZBX1BQT1JUX1NUX0xJTktET1dOfSwKKwl7QkZBX1NNKGJmYV9wcG9ydF9zbV9saW5rdXApLCBCRkFfUFBPUlRfU1RfTElOS1VQfSwKKwl7QkZBX1NNKGJmYV9wcG9ydF9zbV9kaXNhYmxpbmdfcXdhaXQpLAorCSBCRkFfUFBPUlRfU1RfRElTQUJMSU5HX1FXQUlUfSwKKwl7QkZBX1NNKGJmYV9wcG9ydF9zbV9kaXNhYmxpbmcpLCBCRkFfUFBPUlRfU1RfRElTQUJMSU5HfSwKKwl7QkZBX1NNKGJmYV9wcG9ydF9zbV9kaXNhYmxlZCksIEJGQV9QUE9SVF9TVF9ESVNBQkxFRH0sCisJe0JGQV9TTShiZmFfcHBvcnRfc21fc3RvcHBlZCksIEJGQV9QUE9SVF9TVF9TVE9QUEVEfSwKKwl7QkZBX1NNKGJmYV9wcG9ydF9zbV9pb2Nkb3duKSwgQkZBX1BQT1JUX1NUX0lPQ0RPV059LAorCXtCRkFfU00oYmZhX3Bwb3J0X3NtX2lvY2ZhaWwpLCBCRkFfUFBPUlRfU1RfSU9DRE9XTn0sCit9OworCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X2Flbl9wb3N0KHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsIGVudW0gYmZhX3BvcnRfYWVuX2V2ZW50IGV2ZW50KQoreworCXVuaW9uIGJmYV9hZW5fZGF0YV91IGFlbl9kYXRhOworCXN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtb2QgPSBwcG9ydC0+YmZhLT5sb2dtOworCXd3bl90ICAgICAgICAgICBwd3duID0gcHBvcnQtPnB3d247CisJY2hhciAgICAgICAgICAgIHB3d25fcHRyW0JGQV9TVFJJTkdfMzJdOworCXN0cnVjdCBiZmFfaW9jX2F0dHJfcyBpb2NfYXR0cjsKKworCXd3bjJzdHIocHd3bl9wdHIsIHB3d24pOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9QT1JUX0FFTl9PTkxJTkU6CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX1BPUlRfT05MSU5FLCBwd3duX3B0cik7CisJCWJyZWFrOworCWNhc2UgQkZBX1BPUlRfQUVOX09GRkxJTkU6CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX1BPUlRfT0ZGTElORSwgcHd3bl9wdHIpOworCQlicmVhazsKKwljYXNlIEJGQV9QT1JUX0FFTl9FTkFCTEU6CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX1BPUlRfRU5BQkxFLCBwd3duX3B0cik7CisJCWJyZWFrOworCWNhc2UgQkZBX1BPUlRfQUVOX0RJU0FCTEU6CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX1BPUlRfRElTQUJMRSwgcHd3bl9wdHIpOworCQlicmVhazsKKwljYXNlIEJGQV9QT1JUX0FFTl9ESVNDT05ORUNUOgorCQliZmFfbG9nKGxvZ21vZCwgQkZBX0FFTl9QT1JUX0RJU0NPTk5FQ1QsIHB3d25fcHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfUE9SVF9BRU5fUU9TX05FRzoKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fUE9SVF9RT1NfTkVHLCBwd3duX3B0cik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWJmYV9pb2NfZ2V0X2F0dHIoJnBwb3J0LT5iZmEtPmlvYywgJmlvY19hdHRyKTsKKwlhZW5fZGF0YS5wb3J0LmlvY190eXBlID0gaW9jX2F0dHIuaW9jX3R5cGU7CisJYWVuX2RhdGEucG9ydC5wd3duID0gcHd3bjsKK30KKworc3RhdGljIHZvaWQKK2JmYV9wcG9ydF9zbV91bmluaXQoc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCwgZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhwcG9ydC0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfUFBPUlRfU01fU1RBUlQ6CisJCS8qKgorCQkgKiBTdGFydCBldmVudCBhZnRlciBJT0MgaXMgY29uZmlndXJlZCBhbmQgQkZBIGlzIHN0YXJ0ZWQuCisJCSAqLworCQlpZiAoYmZhX3Bwb3J0X3NlbmRfZW5hYmxlKHBwb3J0KSkKKwkJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9lbmFibGluZyk7CisJCWVsc2UKKwkJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9lbmFibGluZ19xd2FpdCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fRU5BQkxFOgorCQkvKioKKwkJICogUG9ydCBpcyBwZXJzaXN0ZW50bHkgY29uZmlndXJlZCB0byBiZSBpbiBlbmFibGVkIHN0YXRlLiBEbworCQkgKiBub3QgY2hhbmdlIHN0YXRlLiBQb3J0IGVuYWJsaW5nIGlzIGRvbmUgd2hlbiBTVEFSVCBldmVudCBpcworCQkgKiByZWNlaXZlZC4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fRElTQUJMRToKKwkJLyoqCisJCSAqIElmIGEgcG9ydCBpcyBwZXJzaXN0ZW50bHkgY29uZmlndXJlZCB0byBiZSBkaXNhYmxlZCwgdGhlCisJCSAqIGZpcnN0IGV2ZW50IHdpbGwgYSBwb3J0IGRpc2FibGUgcmVxdWVzdC4KKwkJICovCisJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9kaXNhYmxlZCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21faW9jZG93bik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KHBwb3J0LT5iZmEsIGV2ZW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcHBvcnRfc21fZW5hYmxpbmdfcXdhaXQoc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCwKKwkJCSAgICBlbnVtIGJmYV9wcG9ydF9zbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHBwb3J0LT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9QUE9SVF9TTV9RUkVTVU1FOgorCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fZW5hYmxpbmcpOworCQliZmFfcHBvcnRfc2VuZF9lbmFibGUocHBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX1NUT1A6CisJCWJmYV9yZXFxX3djYW5jZWwoJnBwb3J0LT5yZXFxX3dhaXQpOworCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fc3RvcHBlZCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fRU5BQkxFOgorCQkvKioKKwkJICogQWxyZWFkeSBlbmFibGUgaXMgaW4gcHJvZ3Jlc3MuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0RJU0FCTEU6CisJCS8qKgorCQkgKiBKdXN0IHNlbmQgZGlzYWJsZSByZXF1ZXN0IHRvIGZpcm13YXJlIHdoZW4gcm9vbSBiZWNvbWVzCisJCSAqIGF2YWlsYWJsZSBpbiByZXF1ZXN0IHF1ZXVlLgorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2Rpc2FibGVkKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmcHBvcnQtPnJlcXFfd2FpdCk7CisJCWJmYV9wbG9nX3N0cihwcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKKwkJCSAgICAgQkZBX1BMX0VJRF9QT1JUX0RJU0FCTEUsIDAsICJQb3J0IERpc2FibGUiKTsKKwkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fRElTQUJMRSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fTElOS1VQOgorCWNhc2UgQkZBX1BQT1JUX1NNX0xJTktET1dOOgorCQkvKioKKwkJICogUG9zc2libGUgdG8gZ2V0IGxpbmsgZXZlbnRzIHdoZW4gZG9pbmcgYmFjay10by1iYWNrCisJCSAqIGVuYWJsZS9kaXNhYmxlcy4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fSFdGQUlMOgorCQliZmFfcmVxcV93Y2FuY2VsKCZwcG9ydC0+cmVxcV93YWl0KTsKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2lvY2Rvd24pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChwcG9ydC0+YmZhLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3NtX2VuYWJsaW5nKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocHBvcnQtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1BQT1JUX1NNX0ZXUlNQOgorCWNhc2UgQkZBX1BQT1JUX1NNX0xJTktET1dOOgorCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fbGlua2Rvd24pOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0xJTktVUDoKKwkJYmZhX3Bwb3J0X3VwZGF0ZV9saW5raW5mbyhwcG9ydCk7CisJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9saW5rdXApOworCisJCWJmYV9hc3NlcnQocHBvcnQtPmV2ZW50X2NiZm4pOworCQliZmFfcHBvcnRfY2FsbGJhY2socHBvcnQsIEJGQV9QUE9SVF9MSU5LVVApOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0VOQUJMRToKKwkJLyoqCisJCSAqIEFscmVhZHkgYmVpbmcgZW5hYmxlZC4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fRElTQUJMRToKKwkJaWYgKGJmYV9wcG9ydF9zZW5kX2Rpc2FibGUocHBvcnQpKQorCQkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2Rpc2FibGluZyk7CisJCWVsc2UKKwkJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9kaXNhYmxpbmdfcXdhaXQpOworCisJCWJmYV9wbG9nX3N0cihwcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKKwkJCSAgICAgQkZBX1BMX0VJRF9QT1JUX0RJU0FCTEUsIDAsICJQb3J0IERpc2FibGUiKTsKKwkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fRElTQUJMRSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fU1RPUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX3N0b3BwZWQpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2lvY2Rvd24pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChwcG9ydC0+YmZhLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3NtX2xpbmtkb3duKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocHBvcnQtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1BQT1JUX1NNX0xJTktVUDoKKwkJYmZhX3Bwb3J0X3VwZGF0ZV9saW5raW5mbyhwcG9ydCk7CisJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9saW5rdXApOworCQliZmFfYXNzZXJ0KHBwb3J0LT5ldmVudF9jYmZuKTsKKwkJYmZhX3Bsb2dfc3RyKHBwb3J0LT5iZmEtPnBsb2csIEJGQV9QTF9NSURfSEFMLAorCQkJICAgICBCRkFfUExfRUlEX1BPUlRfU1RfQ0hBTkdFLCAwLCAiUG9ydCBMaW5rdXAiKTsKKwkJYmZhX3Bwb3J0X2NhbGxiYWNrKHBwb3J0LCBCRkFfUFBPUlRfTElOS1VQKTsKKwkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fT05MSU5FKTsKKwkJLyoqCisJCSAqIElmIFFvUyBpcyBlbmFibGVkIGFuZCBpdCBpcyBub3Qgb25saW5lLAorCQkgKiBTZW5kIGEgc2VwYXJhdGUgZXZlbnQuCisJCSAqLworCQlpZiAoKHBwb3J0LT5jZmcucW9zX2VuYWJsZWQpCisJCSAgICAmJiAoYmZhX29zX250b2hsKHBwb3J0LT5xb3NfYXR0ci5zdGF0ZSkgIT0gQkZBX1FPU19PTkxJTkUpKQorCQkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fUU9TX05FRyk7CisKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9QUE9SVF9TTV9MSU5LRE9XTjoKKwkJLyoqCisJCSAqIFBvc3NpYmxlIHRvIGdldCBsaW5rIGRvd24gZXZlbnQuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0VOQUJMRToKKwkJLyoqCisJCSAqIEFscmVhZHkgZW5hYmxlZC4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fRElTQUJMRToKKwkJaWYgKGJmYV9wcG9ydF9zZW5kX2Rpc2FibGUocHBvcnQpKQorCQkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2Rpc2FibGluZyk7CisJCWVsc2UKKwkJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9kaXNhYmxpbmdfcXdhaXQpOworCisJCWJmYV9wbG9nX3N0cihwcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKKwkJCSAgICAgQkZBX1BMX0VJRF9QT1JUX0RJU0FCTEUsIDAsICJQb3J0IERpc2FibGUiKTsKKwkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fRElTQUJMRSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fU1RPUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX3N0b3BwZWQpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2lvY2Rvd24pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChwcG9ydC0+YmZhLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3NtX2xpbmt1cChzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0LCBlbnVtIGJmYV9wcG9ydF9zbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHBwb3J0LT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9QUE9SVF9TTV9FTkFCTEU6CisJCS8qKgorCQkgKiBBbHJlYWR5IGVuYWJsZWQuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0RJU0FCTEU6CisJCWlmIChiZmFfcHBvcnRfc2VuZF9kaXNhYmxlKHBwb3J0KSkKKwkJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9kaXNhYmxpbmcpOworCQllbHNlCisJCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fZGlzYWJsaW5nX3F3YWl0KTsKKworCQliZmFfcHBvcnRfcmVzZXRfbGlua2luZm8ocHBvcnQpOworCQliZmFfcHBvcnRfY2FsbGJhY2socHBvcnQsIEJGQV9QUE9SVF9MSU5LRE9XTik7CisJCWJmYV9wbG9nX3N0cihwcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKKwkJCSAgICAgQkZBX1BMX0VJRF9QT1JUX0RJU0FCTEUsIDAsICJQb3J0IERpc2FibGUiKTsKKwkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fT0ZGTElORSk7CisJCWJmYV9wcG9ydF9hZW5fcG9zdChwcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0FCTEUpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0xJTktET1dOOgorCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fbGlua2Rvd24pOworCQliZmFfcHBvcnRfcmVzZXRfbGlua2luZm8ocHBvcnQpOworCQliZmFfcHBvcnRfY2FsbGJhY2socHBvcnQsIEJGQV9QUE9SVF9MSU5LRE9XTik7CisJCWJmYV9wbG9nX3N0cihwcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKKwkJCSAgICAgQkZBX1BMX0VJRF9QT1JUX1NUX0NIQU5HRSwgMCwgIlBvcnQgTGlua2Rvd24iKTsKKwkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKHBwb3J0LT5iZmEpKSB7CisJCQliZmFfcHBvcnRfYWVuX3Bvc3QocHBvcnQsIEJGQV9QT1JUX0FFTl9PRkZMSU5FKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9wcG9ydF9hZW5fcG9zdChwcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0NPTk5FQ1QpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fU1RPUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX3N0b3BwZWQpOworCQliZmFfcHBvcnRfcmVzZXRfbGlua2luZm8ocHBvcnQpOworCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQocHBvcnQtPmJmYSkpIHsKKwkJCWJmYV9wcG9ydF9hZW5fcG9zdChwcG9ydCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpOworCQl9IGVsc2UgeworCQkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fRElTQ09OTkVDVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJGQV9QUE9SVF9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9pb2Nkb3duKTsKKwkJYmZhX3Bwb3J0X3Jlc2V0X2xpbmtpbmZvKHBwb3J0KTsKKwkJYmZhX3Bwb3J0X2NhbGxiYWNrKHBwb3J0LCBCRkFfUFBPUlRfTElOS0RPV04pOworCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQocHBvcnQtPmJmYSkpIHsKKwkJCWJmYV9wcG9ydF9hZW5fcG9zdChwcG9ydCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpOworCQl9IGVsc2UgeworCQkJYmZhX3Bwb3J0X2Flbl9wb3N0KHBwb3J0LCBCRkFfUE9SVF9BRU5fRElTQ09OTkVDVCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQocHBvcnQtPmJmYSwgZXZlbnQpOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9wcG9ydF9zbV9kaXNhYmxpbmdfcXdhaXQoc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCwKKwkJCSAgICAgZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhwcG9ydC0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfUFBPUlRfU01fUVJFU1VNRToKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2Rpc2FibGluZyk7CisJCWJmYV9wcG9ydF9zZW5kX2Rpc2FibGUocHBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX1NUT1A6CisJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9zdG9wcGVkKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmcHBvcnQtPnJlcXFfd2FpdCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fRElTQUJMRToKKwkJLyoqCisJCSAqIEFscmVhZHkgYmVpbmcgZGlzYWJsZWQuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0xJTktVUDoKKwljYXNlIEJGQV9QUE9SVF9TTV9MSU5LRE9XTjoKKwkJLyoqCisJCSAqIFBvc3NpYmxlIHRvIGdldCBsaW5rIGV2ZW50cyB3aGVuIGRvaW5nIGJhY2stdG8tYmFjaworCQkgKiBlbmFibGUvZGlzYWJsZXMuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2lvY2ZhaWwpOworCQliZmFfcmVxcV93Y2FuY2VsKCZwcG9ydC0+cmVxcV93YWl0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQocHBvcnQtPmJmYSwgZXZlbnQpOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9wcG9ydF9zbV9kaXNhYmxpbmcoc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCwgZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhwcG9ydC0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfUFBPUlRfU01fRldSU1A6CisJCWJmYV9zbV9zZXRfc3RhdGUocHBvcnQsIGJmYV9wcG9ydF9zbV9kaXNhYmxlZCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fRElTQUJMRToKKwkJLyoqCisJCSAqIEFscmVhZHkgYmVpbmcgZGlzYWJsZWQuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0VOQUJMRToKKwkJaWYgKGJmYV9wcG9ydF9zZW5kX2VuYWJsZShwcG9ydCkpCisJCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fZW5hYmxpbmcpOworCQllbHNlCisJCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fZW5hYmxpbmdfcXdhaXQpOworCisJCWJmYV9wbG9nX3N0cihwcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKKwkJCSAgICAgQkZBX1BMX0VJRF9QT1JUX0VOQUJMRSwgMCwgIlBvcnQgRW5hYmxlIik7CisJCWJmYV9wcG9ydF9hZW5fcG9zdChwcG9ydCwgQkZBX1BPUlRfQUVOX0VOQUJMRSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fU1RPUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX3N0b3BwZWQpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0xJTktVUDoKKwljYXNlIEJGQV9QUE9SVF9TTV9MSU5LRE9XTjoKKwkJLyoqCisJCSAqIFBvc3NpYmxlIHRvIGdldCBsaW5rIGV2ZW50cyB3aGVuIGRvaW5nIGJhY2stdG8tYmFjaworCQkgKiBlbmFibGUvZGlzYWJsZXMuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2lvY2ZhaWwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChwcG9ydC0+YmZhLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3NtX2Rpc2FibGVkKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocHBvcnQtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1BQT1JUX1NNX1NUQVJUOgorCQkvKioKKwkJICogSWdub3JlIHN0YXJ0IGV2ZW50IGZvciBhIHBvcnQgdGhhdCBpcyBkaXNhYmxlZC4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fU1RPUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX3N0b3BwZWQpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0VOQUJMRToKKwkJaWYgKGJmYV9wcG9ydF9zZW5kX2VuYWJsZShwcG9ydCkpCisJCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fZW5hYmxpbmcpOworCQllbHNlCisJCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fZW5hYmxpbmdfcXdhaXQpOworCisJCWJmYV9wbG9nX3N0cihwcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKKwkJCSAgICAgQkZBX1BMX0VJRF9QT1JUX0VOQUJMRSwgMCwgIlBvcnQgRW5hYmxlIik7CisJCWJmYV9wcG9ydF9hZW5fcG9zdChwcG9ydCwgQkZBX1BPUlRfQUVOX0VOQUJMRSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfU01fRElTQUJMRToKKwkJLyoqCisJCSAqIEFscmVhZHkgZGlzYWJsZWQuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2lvY2ZhaWwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChwcG9ydC0+YmZhLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3NtX3N0b3BwZWQoc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCwgZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhwcG9ydC0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfUFBPUlRfU01fU1RBUlQ6CisJCWlmIChiZmFfcHBvcnRfc2VuZF9lbmFibGUocHBvcnQpKQorCQkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2VuYWJsaW5nKTsKKwkJZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2VuYWJsaW5nX3F3YWl0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKioKKwkJICogSWdub3JlIGFsbCBvdGhlciBldmVudHMuCisJCSAqLworCQk7CisJfQorfQorCisvKioKKyAqIFBvcnQgaXMgZW5hYmxlZC4gSU9DIGlzIGRvd24vZmFpbGVkLgorICovCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3NtX2lvY2Rvd24oc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCwgZW51bSBiZmFfcHBvcnRfc21fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhwcG9ydC0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfUFBPUlRfU01fU1RBUlQ6CisJCWlmIChiZmFfcHBvcnRfc2VuZF9lbmFibGUocHBvcnQpKQorCQkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2VuYWJsaW5nKTsKKwkJZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2VuYWJsaW5nX3F3YWl0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKioKKwkJICogSWdub3JlIGFsbCBldmVudHMuCisJCSAqLworCQk7CisJfQorfQorCisvKioKKyAqIFBvcnQgaXMgZGlzYWJsZWQuIElPQyBpcyBkb3duL2ZhaWxlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9wcG9ydF9zbV9pb2NmYWlsKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsIGVudW0gYmZhX3Bwb3J0X3NtX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocHBvcnQtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1BQT1JUX1NNX1NUQVJUOgorCQliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fZGlzYWJsZWQpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BQT1JUX1NNX0VOQUJMRToKKwkJYmZhX3NtX3NldF9zdGF0ZShwcG9ydCwgYmZhX3Bwb3J0X3NtX2lvY2Rvd24pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qKgorCQkgKiBJZ25vcmUgYWxsIGV2ZW50cy4KKwkJICovCisJCTsKKwl9Cit9CisKKworCisvKioKKyAqICBiZmFfcHBvcnRfcHJpdmF0ZQorICovCisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9wb3J0X2V2ZW50KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQgPSBjYmFyZzsKKworCWlmIChjb21wbGV0ZSkKKwkJcHBvcnQtPmV2ZW50X2NiZm4ocHBvcnQtPmV2ZW50X2NiYXJnLCBwcG9ydC0+aGNiX2V2ZW50KTsKK30KKworI2RlZmluZSBQUE9SVF9TVEFUU19ETUFfU1ogKEJGQV9ST1VORFVQKHNpemVvZih1bmlvbiBiZmFfcHBvcnRfc3RhdHNfdSksIFwKKwkJCQkJCQlCRkFfQ0FDSEVMSU5FX1NaKSkKKworc3RhdGljIHZvaWQKK2JmYV9wcG9ydF9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICpuZG1fbGVuLAorCQkgIHUzMiAqZG1fbGVuKQoreworCSpkbV9sZW4gKz0gUFBPUlRfU1RBVFNfRE1BX1NaOworfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3FyZXN1bWUodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0ID0gY2Jhcmc7CisKKwliZmFfc21fc2VuZF9ldmVudChwb3J0LCBCRkFfUFBPUlRfU01fUVJFU1VNRSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcHBvcnRfbWVtX2NsYWltKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQsIHN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvKQoreworCXU4ICAgICAgICAqZG1fa3ZhOworCXU2NCAgICAgICAgZG1fcGE7CisKKwlkbV9rdmEgPSBiZmFfbWVtaW5mb19kbWFfdmlydChtZW1pbmZvKTsKKwlkbV9wYSA9IGJmYV9tZW1pbmZvX2RtYV9waHlzKG1lbWluZm8pOworCisJcHBvcnQtPnN0YXRzX2t2YSA9IGRtX2t2YTsKKwlwcG9ydC0+c3RhdHNfcGEgPSBkbV9wYTsKKwlwcG9ydC0+c3RhdHMgPSAodW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgKilkbV9rdmE7CisKKwlkbV9rdmEgKz0gUFBPUlRfU1RBVFNfRE1BX1NaOworCWRtX3BhICs9IFBQT1JUX1NUQVRTX0RNQV9TWjsKKworCWJmYV9tZW1pbmZvX2RtYV92aXJ0KG1lbWluZm8pID0gZG1fa3ZhOworCWJmYV9tZW1pbmZvX2RtYV9waHlzKG1lbWluZm8pID0gZG1fcGE7Cit9CisKKy8qKgorICogTWVtb3J5IGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYmZhZCwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAorCQkgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9wcG9ydF9jZmdfcyAqcG9ydF9jZmcgPSAmcHBvcnQtPmNmZzsKKworCWJmYV9vc19tZW1zZXQocHBvcnQsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3Bwb3J0X3MpKTsKKwlwcG9ydC0+YmZhID0gYmZhOworCisJYmZhX3Bwb3J0X21lbV9jbGFpbShwcG9ydCwgbWVtaW5mbyk7CisKKwliZmFfc21fc2V0X3N0YXRlKHBwb3J0LCBiZmFfcHBvcnRfc21fdW5pbml0KTsKKworCS8qKgorCSAqIGluaXRpYWxpemUgYW5kIHNldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKwkgKi8KKwlwb3J0X2NmZy0+dG9wb2xvZ3kgPSBCRkFfUFBPUlRfVE9QT0xPR1lfUDJQOworCXBvcnRfY2ZnLT5zcGVlZCA9IEJGQV9QUE9SVF9TUEVFRF9BVVRPOworCXBvcnRfY2ZnLT50cnVua2VkID0gQkZBX0ZBTFNFOworCXBvcnRfY2ZnLT5tYXhmcnNpemUgPSAwOworCisJcG9ydF9jZmctPnRybF9kZWZfc3BlZWQgPSBCRkFfUFBPUlRfU1BFRURfMUdCUFM7CisKKwliZmFfcmVxcV93aW5pdCgmcHBvcnQtPnJlcXFfd2FpdCwgYmZhX3Bwb3J0X3FyZXN1bWUsIHBwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9wcG9ydF9pbml0ZG9uZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHBvcnQgYXR0cmlidXRlcyBmcm9tIElPQyBoYXJkd2FyZSBkYXRhLgorCSAqLworCWJmYV9wcG9ydF9zZXRfd3ducyhwcG9ydCk7CisJaWYgKHBwb3J0LT5jZmcubWF4ZnJzaXplID09IDApCisJCXBwb3J0LT5jZmcubWF4ZnJzaXplID0gYmZhX2lvY19tYXhmcnNpemUoJmJmYS0+aW9jKTsKKwlwcG9ydC0+Y2ZnLnJ4X2JiY3JlZGl0ID0gYmZhX2lvY19yeF9iYmNyZWRpdCgmYmZhLT5pb2MpOworCXBwb3J0LT5zcGVlZF9zdXAgPSBiZmFfaW9jX3NwZWVkX3N1cCgmYmZhLT5pb2MpOworCisJYmZhX2Fzc2VydChwcG9ydC0+Y2ZnLm1heGZyc2l6ZSk7CisJYmZhX2Fzc2VydChwcG9ydC0+Y2ZnLnJ4X2JiY3JlZGl0KTsKKwliZmFfYXNzZXJ0KHBwb3J0LT5zcGVlZF9zdXApOworfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiBJT0MgaXMgcmVhZHkuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcHBvcnRfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQoQkZBX1BPUlRfTU9EKGJmYSksIEJGQV9QUE9SVF9TTV9TVEFSVCk7Cit9CisKKy8qKgorICogQ2FsbGVkIGJlZm9yZSBJT0MgaXMgc3RvcHBlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9wcG9ydF9zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWJmYV9zbV9zZW5kX2V2ZW50KEJGQV9QT1JUX01PRChiZmEpLCBCRkFfUFBPUlRfU01fU1RPUCk7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gSU9DIGZhaWx1cmUgaXMgZGV0ZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcHBvcnRfaW9jZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwliZmFfc21fc2VuZF9ldmVudChCRkFfUE9SVF9NT0QoYmZhKSwgQkZBX1BQT1JUX1NNX0hXRkFJTCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcHBvcnRfdXBkYXRlX2xpbmtpbmZvKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQpCit7CisJc3RydWN0IGJmaV9wcG9ydF9ldmVudF9zICpwZXZlbnQgPSBwcG9ydC0+ZXZlbnRfYXJnLmkyaG1zZy5ldmVudDsKKworCXBwb3J0LT5zcGVlZCA9IHBldmVudC0+bGlua19zdGF0ZS5zcGVlZDsKKwlwcG9ydC0+dG9wb2xvZ3kgPSBwZXZlbnQtPmxpbmtfc3RhdGUudG9wb2xvZ3k7CisKKwlpZiAocHBvcnQtPnRvcG9sb2d5ID09IEJGQV9QUE9SVF9UT1BPTE9HWV9MT09QKQorCQlwcG9ydC0+bXlhbHBhID0gcGV2ZW50LT5saW5rX3N0YXRlLnRsLmxvb3BfaW5mby5teWFscGE7CisKKwkvKgorCSAqIFFvUyBEZXRhaWxzCisJICovCisJYmZhX29zX2Fzc2lnbihwcG9ydC0+cW9zX2F0dHIsIHBldmVudC0+bGlua19zdGF0ZS5xb3NfYXR0cik7CisJYmZhX29zX2Fzc2lnbihwcG9ydC0+cW9zX3ZjX2F0dHIsIHBldmVudC0+bGlua19zdGF0ZS5xb3NfdmNfYXR0cik7CisKKwliZmFfdHJjKHBwb3J0LT5iZmEsIHBwb3J0LT5zcGVlZCk7CisJYmZhX3RyYyhwcG9ydC0+YmZhLCBwcG9ydC0+dG9wb2xvZ3kpOworfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3Jlc2V0X2xpbmtpbmZvKHN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQpCit7CisJcHBvcnQtPnNwZWVkID0gQkZBX1BQT1JUX1NQRUVEX1VOS05PV047CisJcHBvcnQtPnRvcG9sb2d5ID0gQkZBX1BQT1JUX1RPUE9MT0dZX05PTkU7Cit9CisKKy8qKgorICogU2VuZCBwb3J0IGVuYWJsZSBtZXNzYWdlIHRvIGZpcm13YXJlLgorICovCitzdGF0aWMgICAgICAgICAgYmZhX2Jvb2xlYW5fdAorYmZhX3Bwb3J0X3NlbmRfZW5hYmxlKHN0cnVjdCBiZmFfcHBvcnRfcyAqcG9ydCkKK3sKKwlzdHJ1Y3QgYmZpX3Bwb3J0X2VuYWJsZV9yZXFfcyAqbTsKKworCS8qKgorCSAqIEluY3JlbWVudCBtZXNzYWdlIHRhZyBiZWZvcmUgcXVldWUgY2hlY2ssIHNvIHRoYXQgcmVzcG9uc2VzIHRvIG9sZAorCSAqIHJlcXVlc3RzIGFyZSBkaXNjYXJkZWQuCisJICovCisJcG9ydC0+bXNndGFnKys7CisKKwkvKioKKwkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CisJICovCisJbSA9IGJmYV9yZXFxX25leHQocG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JUKTsKKwlpZiAoIW0pIHsKKwkJYmZhX3JlcXFfd2FpdChwb3J0LT5iZmEsIEJGQV9SRVFRX1BPUlQsICZwb3J0LT5yZXFxX3dhaXQpOworCQlyZXR1cm4gQkZBX0ZBTFNFOworCX0KKworCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfRkNfUE9SVCwgQkZJX1BQT1JUX0gySV9FTkFCTEVfUkVRLAorCQkgICAgYmZhX2xwdWlkKHBvcnQtPmJmYSkpOworCW0tPm53d24gPSBwb3J0LT5ud3duOworCW0tPnB3d24gPSBwb3J0LT5wd3duOworCW0tPnBvcnRfY2ZnID0gcG9ydC0+Y2ZnOworCW0tPm1zZ3RhZyA9IHBvcnQtPm1zZ3RhZzsKKwltLT5wb3J0X2NmZy5tYXhmcnNpemUgPSBiZmFfb3NfaHRvbnMocG9ydC0+Y2ZnLm1heGZyc2l6ZSk7CisJYmZhX2RtYV9iZV9hZGRyX3NldChtLT5zdGF0c19kbWFfYWRkciwgcG9ydC0+c3RhdHNfcGEpOworCWJmYV90cmMocG9ydC0+YmZhLCBtLT5zdGF0c19kbWFfYWRkci5hMzIuYWRkcl9sbyk7CisJYmZhX3RyYyhwb3J0LT5iZmEsIG0tPnN0YXRzX2RtYV9hZGRyLmEzMi5hZGRyX2hpKTsKKworCS8qKgorCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCisJICovCisJYmZhX3JlcXFfcHJvZHVjZShwb3J0LT5iZmEsIEJGQV9SRVFRX1BPUlQpOworCXJldHVybiBCRkFfVFJVRTsKK30KKworLyoqCisgKiBTZW5kIHBvcnQgZGlzYWJsZSBtZXNzYWdlIHRvIGZpcm13YXJlLgorICovCitzdGF0aWMgICAgICAgICAgYmZhX2Jvb2xlYW5fdAorYmZhX3Bwb3J0X3NlbmRfZGlzYWJsZShzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQpCit7CisJYmZpX3Bwb3J0X2Rpc2FibGVfcmVxX3QgKm07CisKKwkvKioKKwkgKiBJbmNyZW1lbnQgbWVzc2FnZSB0YWcgYmVmb3JlIHF1ZXVlIGNoZWNrLCBzbyB0aGF0IHJlc3BvbnNlcyB0byBvbGQKKwkgKiByZXF1ZXN0cyBhcmUgZGlzY2FyZGVkLgorCSAqLworCXBvcnQtPm1zZ3RhZysrOworCisJLyoqCisJICogY2hlY2sgZm9yIHJvb20gaW4gcXVldWUgdG8gc2VuZCByZXF1ZXN0IG5vdworCSAqLworCW0gPSBiZmFfcmVxcV9uZXh0KHBvcnQtPmJmYSwgQkZBX1JFUVFfUE9SVCk7CisJaWYgKCFtKSB7CisJCWJmYV9yZXFxX3dhaXQocG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JULCAmcG9ydC0+cmVxcV93YWl0KTsKKwkJcmV0dXJuIEJGQV9GQUxTRTsKKwl9CisKKwliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0ZDX1BPUlQsIEJGSV9QUE9SVF9IMklfRElTQUJMRV9SRVEsCisJCSAgICBiZmFfbHB1aWQocG9ydC0+YmZhKSk7CisJbS0+bXNndGFnID0gcG9ydC0+bXNndGFnOworCisJLyoqCisJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKKwkgKi8KKwliZmFfcmVxcV9wcm9kdWNlKHBvcnQtPmJmYSwgQkZBX1JFUVFfUE9SVCk7CisKKwlyZXR1cm4gQkZBX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcHBvcnRfc2V0X3d3bnMoc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0KQoreworCXBvcnQtPnB3d24gPSBiZmFfaW9jX2dldF9wd3duKCZwb3J0LT5iZmEtPmlvYyk7CisJcG9ydC0+bnd3biA9IGJmYV9pb2NfZ2V0X253d24oJnBvcnQtPmJmYS0+aW9jKTsKKworCWJmYV90cmMocG9ydC0+YmZhLCBwb3J0LT5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmJmYSwgcG9ydC0+bnd3bik7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcG9ydF9zZW5kX3R4Y3JlZGl0KHZvaWQgKnBvcnRfY2JhcmcpCit7CisKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSBwb3J0X2NiYXJnOworCXN0cnVjdCBiZmlfcHBvcnRfc2V0X3N2Y19wYXJhbXNfcmVxX3MgKm07CisKKwkvKioKKwkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CisJICovCisJbSA9IGJmYV9yZXFxX25leHQocG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JUKTsKKwlpZiAoIW0pIHsKKwkJYmZhX3RyYyhwb3J0LT5iZmEsIHBvcnQtPmNmZy50eF9iYmNyZWRpdCk7CisJCXJldHVybjsKKwl9CisKKwliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0ZDX1BPUlQsIEJGSV9QUE9SVF9IMklfU0VUX1NWQ19QQVJBTVNfUkVRLAorCQkgICAgYmZhX2xwdWlkKHBvcnQtPmJmYSkpOworCW0tPnR4X2JiY3JlZGl0ID0gYmZhX29zX2h0b25zKCh1MTYpIHBvcnQtPmNmZy50eF9iYmNyZWRpdCk7CisKKwkvKioKKwkgKiBxdWV1ZSBJL08gbWVzc2FnZSB0byBmaXJtd2FyZQorCSAqLworCWJmYV9yZXFxX3Byb2R1Y2UocG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JUKTsKK30KKworCisKKy8qKgorICogIGJmYV9wcG9ydF9wdWJsaWMKKyAqLworCisvKioKKyAqIEZpcm13YXJlIG1lc3NhZ2UgaGFuZGxlci4KKyAqLwordm9pZAorYmZhX3Bwb3J0X2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbXNnKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKwl1bmlvbiBiZmlfcHBvcnRfaTJoX21zZ191IGkyaG1zZzsKKworCWkyaG1zZy5tc2cgPSBtc2c7CisJcHBvcnQtPmV2ZW50X2FyZy5pMmhtc2cgPSBpMmhtc2c7CisKKwlzd2l0Y2ggKG1zZy0+bWhkci5tc2dfaWQpIHsKKwljYXNlIEJGSV9QUE9SVF9JMkhfRU5BQkxFX1JTUDoKKwkJaWYgKHBwb3J0LT5tc2d0YWcgPT0gaTJobXNnLmVuYWJsZV9yc3AtPm1zZ3RhZykKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHBwb3J0LCBCRkFfUFBPUlRfU01fRldSU1ApOworCQlicmVhazsKKworCWNhc2UgQkZJX1BQT1JUX0kySF9ESVNBQkxFX1JTUDoKKwkJaWYgKHBwb3J0LT5tc2d0YWcgPT0gaTJobXNnLmVuYWJsZV9yc3AtPm1zZ3RhZykKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHBwb3J0LCBCRkFfUFBPUlRfU01fRldSU1ApOworCQlicmVhazsKKworCWNhc2UgQkZJX1BQT1JUX0kySF9FVkVOVDoKKwkJc3dpdGNoIChpMmhtc2cuZXZlbnQtPmxpbmtfc3RhdGUubGlua3N0YXRlKSB7CisJCWNhc2UgQkZBX1BQT1JUX0xJTktVUDoKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHBwb3J0LCBCRkFfUFBPUlRfU01fTElOS1VQKTsKKwkJCWJyZWFrOworCQljYXNlIEJGQV9QUE9SVF9MSU5LRE9XTjoKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHBwb3J0LCBCRkFfUFBPUlRfU01fTElOS0RPV04pOworCQkJYnJlYWs7CisJCWNhc2UgQkZBX1BQT1JUX1RSVU5LX0xJTktET1dOOgorCQkJLyoqIHRvZG86IGV2ZW50IG5vdGlmaWNhdGlvbiAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJGSV9QUE9SVF9JMkhfR0VUX1NUQVRTX1JTUDoKKwljYXNlIEJGSV9QUE9SVF9JMkhfR0VUX1FPU19TVEFUU19SU1A6CisJCS8qCisJCSAqIGNoZWNrIGZvciB0aW1lciBwb3AgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHJzcAorCQkgKi8KKwkJaWYgKHBwb3J0LT5zdGF0c19idXN5ID09IEJGQV9GQUxTRQorCQkgICAgfHwgcHBvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX0VUSU1FUikKKwkJCWJyZWFrOworCisJCWJmYV90aW1lcl9zdG9wKCZwcG9ydC0+dGltZXIpOworCQlwcG9ydC0+c3RhdHNfc3RhdHVzID0gaTJobXNnLmdldHN0YXRzX3JzcC0+c3RhdHVzOworCQliZmFfY2JfcXVldWUocHBvcnQtPmJmYSwgJnBwb3J0LT5oY2JfcWUsIF9fYmZhX2NiX3BvcnRfc3RhdHMsCisJCQkgICAgIHBwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBCRklfUFBPUlRfSTJIX0NMRUFSX1NUQVRTX1JTUDoKKwljYXNlIEJGSV9QUE9SVF9JMkhfQ0xFQVJfUU9TX1NUQVRTX1JTUDoKKwkJLyoKKwkJICogY2hlY2sgZm9yIHRpbWVyIHBvcCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgcnNwCisJCSAqLworCQlpZiAocHBvcnQtPnN0YXRzX2J1c3kgPT0gQkZBX0ZBTFNFCisJCSAgICB8fCBwcG9ydC0+c3RhdHNfc3RhdHVzID09IEJGQV9TVEFUVVNfRVRJTUVSKQorCQkJYnJlYWs7CisKKwkJYmZhX3RpbWVyX3N0b3AoJnBwb3J0LT50aW1lcik7CisJCXBwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCQliZmFfY2JfcXVldWUocHBvcnQtPmJmYSwgJnBwb3J0LT5oY2JfcWUsCisJCQkgICAgIF9fYmZhX2NiX3BvcnRfc3RhdHNfY2xyLCBwcG9ydCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKworCisvKioKKyAqICBiZmFfcHBvcnRfYXBpCisgKi8KKworLyoqCisgKiBSZWdpc3RlcmVkIGNhbGxiYWNrIGZvciBwb3J0IGV2ZW50cy4KKyAqLwordm9pZAorYmZhX3Bwb3J0X2V2ZW50X3JlZ2lzdGVyKHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJIHZvaWQgKCpjYmZuKSAodm9pZCAqY2JhcmcsIGJmYV9wcG9ydF9ldmVudF90IGV2ZW50KSwKKwkJCSB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwlwcG9ydC0+ZXZlbnRfY2JmbiA9IGNiZm47CisJcHBvcnQtPmV2ZW50X2NiYXJnID0gY2Jhcmc7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX3Bwb3J0X2VuYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwlpZiAocHBvcnQtPmRpYWdfYnVzeSkKKwkJcmV0dXJuIChCRkFfU1RBVFVTX0RJQUdfQlVTWSk7CisJZWxzZSBpZiAoYmZhX3NtX2NtcF9zdGF0ZQorCQkgKEJGQV9QT1JUX01PRChiZmEpLCBiZmFfcHBvcnRfc21fZGlzYWJsaW5nX3F3YWl0KSkKKwkJcmV0dXJuIChCRkFfU1RBVFVTX0RFVkJVU1kpOworCisJYmZhX3NtX3NlbmRfZXZlbnQoQkZBX1BPUlRfTU9EKGJmYSksIEJGQV9QUE9SVF9TTV9FTkFCTEUpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9wcG9ydF9kaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWJmYV9zbV9zZW5kX2V2ZW50KEJGQV9QT1JUX01PRChiZmEpLCBCRkFfUFBPUlRfU01fRElTQUJMRSk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogQ29uZmlndXJlIHBvcnQgc3BlZWQuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX3Bwb3J0X2NmZ19zcGVlZChzdHJ1Y3QgYmZhX3MgKmJmYSwgZW51bSBiZmFfcHBvcnRfc3BlZWQgc3BlZWQpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJYmZhX3RyYyhiZmEsIHNwZWVkKTsKKworCWlmICgoc3BlZWQgIT0gQkZBX1BQT1JUX1NQRUVEX0FVVE8pICYmIChzcGVlZCA+IHBwb3J0LT5zcGVlZF9zdXApKSB7CisJCWJmYV90cmMoYmZhLCBwcG9ydC0+c3BlZWRfc3VwKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCX0KKworCXBwb3J0LT5jZmcuc3BlZWQgPSBzcGVlZDsKKworCXJldHVybiAoQkZBX1NUQVRVU19PSyk7Cit9CisKKy8qKgorICogR2V0IGN1cnJlbnQgc3BlZWQuCisgKi8KK2VudW0gYmZhX3Bwb3J0X3NwZWVkCitiZmFfcHBvcnRfZ2V0X3NwZWVkKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJcmV0dXJuIHBvcnQtPnNwZWVkOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBwb3J0IHRvcG9sb2d5LgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9wcG9ydF9jZmdfdG9wb2xvZ3koc3RydWN0IGJmYV9zICpiZmEsIGVudW0gYmZhX3Bwb3J0X3RvcG9sb2d5IHRvcG9sb2d5KQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCWJmYV90cmMoYmZhLCB0b3BvbG9neSk7CisJYmZhX3RyYyhiZmEsIHBwb3J0LT5jZmcudG9wb2xvZ3kpOworCisJc3dpdGNoICh0b3BvbG9neSkgeworCWNhc2UgQkZBX1BQT1JUX1RPUE9MT0dZX1AyUDoKKwljYXNlIEJGQV9QUE9SVF9UT1BPTE9HWV9MT09QOgorCWNhc2UgQkZBX1BQT1JUX1RPUE9MT0dZX0FVVE86CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRUlOVkFMOworCX0KKworCXBwb3J0LT5jZmcudG9wb2xvZ3kgPSB0b3BvbG9neTsKKwlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworfQorCisvKioKKyAqIEdldCBjdXJyZW50IHRvcG9sb2d5LgorICovCitlbnVtIGJmYV9wcG9ydF90b3BvbG9neQorYmZhX3Bwb3J0X2dldF90b3BvbG9neShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCXJldHVybiBwb3J0LT50b3BvbG9neTsKK30KKworYmZhX3N0YXR1c190CitiZmFfcHBvcnRfY2ZnX2hhcmRhbHBhKHN0cnVjdCBiZmFfcyAqYmZhLCB1OCBhbHBhKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCWJmYV90cmMoYmZhLCBhbHBhKTsKKwliZmFfdHJjKGJmYSwgcHBvcnQtPmNmZy5jZmdfaGFyZGFscGEpOworCWJmYV90cmMoYmZhLCBwcG9ydC0+Y2ZnLmhhcmRhbHBhKTsKKworCXBwb3J0LT5jZmcuY2ZnX2hhcmRhbHBhID0gQkZBX1RSVUU7CisJcHBvcnQtPmNmZy5oYXJkYWxwYSA9IGFscGE7CisKKwlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9wcG9ydF9jbHJfaGFyZGFscGEoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJYmZhX3RyYyhiZmEsIHBwb3J0LT5jZmcuY2ZnX2hhcmRhbHBhKTsKKwliZmFfdHJjKGJmYSwgcHBvcnQtPmNmZy5oYXJkYWxwYSk7CisKKwlwcG9ydC0+Y2ZnLmNmZ19oYXJkYWxwYSA9IEJGQV9GQUxTRTsKKwlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworfQorCitiZmFfYm9vbGVhbl90CitiZmFfcHBvcnRfZ2V0X2hhcmRhbHBhKHN0cnVjdCBiZmFfcyAqYmZhLCB1OCAqYWxwYSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCSphbHBhID0gcG9ydC0+Y2ZnLmhhcmRhbHBhOworCXJldHVybiBwb3J0LT5jZmcuY2ZnX2hhcmRhbHBhOworfQorCit1OAorYmZhX3Bwb3J0X2dldF9teWFscGEoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwlyZXR1cm4gcG9ydC0+bXlhbHBhOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9wcG9ydF9jZmdfbWF4ZnJzaXplKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgbWF4ZnJzaXplKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCWJmYV90cmMoYmZhLCBtYXhmcnNpemUpOworCWJmYV90cmMoYmZhLCBwcG9ydC0+Y2ZnLm1heGZyc2l6ZSk7CisKKwkvKgorCSAqIHdpdGggaW4gcmFuZ2UKKwkgKi8KKwlpZiAoKG1heGZyc2l6ZSA+IEZDX01BWF9QRFVTWikgfHwgKG1heGZyc2l6ZSA8IEZDX01JTl9QRFVTWikpCisJCXJldHVybiAoQkZBX1NUQVRVU19JTlZMRF9ERlNaKTsKKworCS8qCisJICogcG93ZXIgb2YgMiwgaWYgbm90IHRoZSBtYXggZnJhbWUgc2l6ZSBvZiAyMTEyCisJICovCisJaWYgKChtYXhmcnNpemUgIT0gRkNfTUFYX1BEVVNaKSAmJiAobWF4ZnJzaXplICYgKG1heGZyc2l6ZSAtIDEpKSkKKwkJcmV0dXJuIChCRkFfU1RBVFVTX0lOVkxEX0RGU1opOworCisJcHBvcnQtPmNmZy5tYXhmcnNpemUgPSBtYXhmcnNpemU7CisJcmV0dXJuIChCRkFfU1RBVFVTX09LKTsKK30KKwordTE2CitiZmFfcHBvcnRfZ2V0X21heGZyc2l6ZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCXJldHVybiBwb3J0LT5jZmcubWF4ZnJzaXplOworfQorCit1MzIKK2JmYV9wcG9ydF9teXBpZChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCXJldHVybiBwb3J0LT5teXBpZDsKK30KKwordTgKK2JmYV9wcG9ydF9nZXRfcnhfYmJjcmVkaXQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwlyZXR1cm4gcG9ydC0+Y2ZnLnJ4X2JiY3JlZGl0OworfQorCit2b2lkCitiZmFfcHBvcnRfc2V0X3R4X2JiY3JlZGl0KHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgdHhfYmJjcmVkaXQpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwlwb3J0LT5jZmcudHhfYmJjcmVkaXQgPSAodTgpIHR4X2JiY3JlZGl0OworCWJmYV9wb3J0X3NlbmRfdHhjcmVkaXQocG9ydCk7Cit9CisKKy8qKgorICogR2V0IHBvcnQgYXR0cmlidXRlcy4KKyAqLworCit3d25fdAorYmZhX3Bwb3J0X2dldF93d24oc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3Qgbm9kZSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisJaWYgKG5vZGUpCisJCXJldHVybiBwcG9ydC0+bnd3bjsKKwllbHNlCisJCXJldHVybiBwcG9ydC0+cHd3bjsKK30KKwordm9pZAorYmZhX3Bwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Bwb3J0X2F0dHJfcyAqYXR0cikKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwliZmFfb3NfbWVtc2V0KGF0dHIsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3Bwb3J0X2F0dHJfcykpOworCisJYXR0ci0+bnd3biA9IHBwb3J0LT5ud3duOworCWF0dHItPnB3d24gPSBwcG9ydC0+cHd3bjsKKworCWJmYV9vc19tZW1jcHkoJmF0dHItPnBwb3J0X2NmZywgJnBwb3J0LT5jZmcsCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgYmZhX3Bwb3J0X2NmZ19zKSk7CisJLyoKKwkgKiBzcGVlZCBhdHRyaWJ1dGVzCisJICovCisJYXR0ci0+cHBvcnRfY2ZnLnNwZWVkID0gcHBvcnQtPmNmZy5zcGVlZDsKKwlhdHRyLT5zcGVlZF9zdXBwb3J0ZWQgPSBwcG9ydC0+c3BlZWRfc3VwOworCWF0dHItPnNwZWVkID0gcHBvcnQtPnNwZWVkOworCWF0dHItPmNvc19zdXBwb3J0ZWQgPSBGQ19DTEFTU18zOworCisJLyoKKwkgKiB0b3BvbG9neSBhdHRyaWJ1dGVzCisJICovCisJYXR0ci0+cHBvcnRfY2ZnLnRvcG9sb2d5ID0gcHBvcnQtPmNmZy50b3BvbG9neTsKKwlhdHRyLT50b3BvbG9neSA9IHBwb3J0LT50b3BvbG9neTsKKworCS8qCisJICogYmVhY29uIGF0dHJpYnV0ZXMKKwkgKi8KKwlhdHRyLT5iZWFjb24gPSBwcG9ydC0+YmVhY29uOworCWF0dHItPmxpbmtfZTJlX2JlYWNvbiA9IHBwb3J0LT5saW5rX2UyZV9iZWFjb247CisJYXR0ci0+cGxvZ19lbmFibGVkID0gYmZhX3Bsb2dfZ2V0X3NldHRpbmcocHBvcnQtPmJmYS0+cGxvZyk7CisKKwlhdHRyLT5wcG9ydF9jZmcucGF0aF90b3YgPSBiZmFfZmNwaW1fcGF0aF90b3ZfZ2V0KGJmYSk7CisJYXR0ci0+cHBvcnRfY2ZnLnFfZGVwdGggPSBiZmFfZmNwaW1fcWRlcHRoX2dldChiZmEpOworCWF0dHItPnBvcnRfc3RhdGUgPSBiZmFfc21fdG9fc3RhdGUoaGFsX3Bwb3J0X3NtX3RhYmxlLCBwcG9ydC0+c20pOworCWlmIChiZmFfaW9jX2lzX2Rpc2FibGVkKCZwcG9ydC0+YmZhLT5pb2MpKQorCQlhdHRyLT5wb3J0X3N0YXRlID0gQkZBX1BQT1JUX1NUX0lPQ0RJUzsKKwllbHNlIGlmIChiZmFfaW9jX2Z3X21pc21hdGNoKCZwcG9ydC0+YmZhLT5pb2MpKQorCQlhdHRyLT5wb3J0X3N0YXRlID0gQkZBX1BQT1JUX1NUX0ZXTUlTTUFUQ0g7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcG9ydF9zdGF0c19xdWVyeSh2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSAoc3RydWN0IGJmYV9wcG9ydF9zICopY2Jhcmc7CisJYmZpX3Bwb3J0X2dldF9zdGF0c19yZXFfdCAqbXNnOworCisJbXNnID0gYmZhX3JlcXFfbmV4dChwb3J0LT5iZmEsIEJGQV9SRVFRX1BPUlQpOworCisJaWYgKCFtc2cpIHsKKwkJcG9ydC0+c3RhdHNfcWZ1bGwgPSBCRkFfVFJVRTsKKwkJYmZhX3JlcXFfd2luaXQoJnBvcnQtPnN0YXRzX3JlcXFfd2FpdCwgYmZhX3BvcnRfc3RhdHNfcXVlcnksCisJCQkgICAgICAgcG9ydCk7CisJCWJmYV9yZXFxX3dhaXQocG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JULCAmcG9ydC0+c3RhdHNfcmVxcV93YWl0KTsKKwkJcmV0dXJuOworCX0KKwlwb3J0LT5zdGF0c19xZnVsbCA9IEJGQV9GQUxTRTsKKworCWJmYV9vc19tZW1zZXQobXNnLCAwLCBzaXplb2YoYmZpX3Bwb3J0X2dldF9zdGF0c19yZXFfdCkpOworCWJmaV9oMmlfc2V0KG1zZy0+bWgsIEJGSV9NQ19GQ19QT1JULCBCRklfUFBPUlRfSDJJX0dFVF9TVEFUU19SRVEsCisJCSAgICBiZmFfbHB1aWQocG9ydC0+YmZhKSk7CisJYmZhX3JlcXFfcHJvZHVjZShwb3J0LT5iZmEsIEJGQV9SRVFRX1BPUlQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYmZhX3BvcnRfc3RhdHNfY2xlYXIodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0ID0gKHN0cnVjdCBiZmFfcHBvcnRfcyAqKWNiYXJnOworCWJmaV9wcG9ydF9jbGVhcl9zdGF0c19yZXFfdCAqbXNnOworCisJbXNnID0gYmZhX3JlcXFfbmV4dChwb3J0LT5iZmEsIEJGQV9SRVFRX1BPUlQpOworCisJaWYgKCFtc2cpIHsKKwkJcG9ydC0+c3RhdHNfcWZ1bGwgPSBCRkFfVFJVRTsKKwkJYmZhX3JlcXFfd2luaXQoJnBvcnQtPnN0YXRzX3JlcXFfd2FpdCwgYmZhX3BvcnRfc3RhdHNfY2xlYXIsCisJCQkgICAgICAgcG9ydCk7CisJCWJmYV9yZXFxX3dhaXQocG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JULCAmcG9ydC0+c3RhdHNfcmVxcV93YWl0KTsKKwkJcmV0dXJuOworCX0KKwlwb3J0LT5zdGF0c19xZnVsbCA9IEJGQV9GQUxTRTsKKworCWJmYV9vc19tZW1zZXQobXNnLCAwLCBzaXplb2YoYmZpX3Bwb3J0X2NsZWFyX3N0YXRzX3JlcV90KSk7CisJYmZpX2gyaV9zZXQobXNnLT5taCwgQkZJX01DX0ZDX1BPUlQsIEJGSV9QUE9SVF9IMklfQ0xFQVJfU1RBVFNfUkVRLAorCQkgICAgYmZhX2xwdWlkKHBvcnQtPmJmYSkpOworCWJmYV9yZXFxX3Byb2R1Y2UocG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JUKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcG9ydF9xb3Nfc3RhdHNfY2xlYXIodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0ID0gKHN0cnVjdCBiZmFfcHBvcnRfcyAqKWNiYXJnOworCWJmaV9wcG9ydF9jbGVhcl9xb3Nfc3RhdHNfcmVxX3QgKm1zZzsKKworCW1zZyA9IGJmYV9yZXFxX25leHQocG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JUKTsKKworCWlmICghbXNnKSB7CisJCXBvcnQtPnN0YXRzX3FmdWxsID0gQkZBX1RSVUU7CisJCWJmYV9yZXFxX3dpbml0KCZwb3J0LT5zdGF0c19yZXFxX3dhaXQsIGJmYV9wb3J0X3Fvc19zdGF0c19jbGVhciwKKwkJCSAgICAgICBwb3J0KTsKKwkJYmZhX3JlcXFfd2FpdChwb3J0LT5iZmEsIEJGQV9SRVFRX1BPUlQsICZwb3J0LT5zdGF0c19yZXFxX3dhaXQpOworCQlyZXR1cm47CisJfQorCXBvcnQtPnN0YXRzX3FmdWxsID0gQkZBX0ZBTFNFOworCisJYmZhX29zX21lbXNldChtc2csIDAsIHNpemVvZihiZmlfcHBvcnRfY2xlYXJfcW9zX3N0YXRzX3JlcV90KSk7CisJYmZpX2gyaV9zZXQobXNnLT5taCwgQkZJX01DX0ZDX1BPUlQsIEJGSV9QUE9SVF9IMklfQ0xFQVJfUU9TX1NUQVRTX1JFUSwKKwkJICAgIGJmYV9scHVpZChwb3J0LT5iZmEpKTsKKwliZmFfcmVxcV9wcm9kdWNlKHBvcnQtPmJmYSwgQkZBX1JFUVFfUE9SVCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYmZhX3Bwb3J0X3N0YXRzX3N3YXAodW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgKmQsIHVuaW9uIGJmYV9wcG9ydF9zdGF0c191ICpzKQoreworCXUzMiAgICAgICAqZGlwID0gKHUzMiAqKSBkOworCXUzMiAgICAgICAqc2lwID0gKHUzMiAqKSBzOworCWludCAgICAgICAgICAgICBpOworCisJLyoKKwkgKiBEbyA2NCBiaXQgZmllbGRzIHN3YXAgZmlyc3QKKwkgKi8KKwlmb3IgKGkgPSAwOworCSAgICAgaSA8CisJICAgICAoKHNpemVvZih1bmlvbiBiZmFfcHBvcnRfc3RhdHNfdSkgLQorCSAgICAgICBzaXplb2Yoc3RydWN0IGJmYV9xb3Nfc3RhdHNfcykpIC8gc2l6ZW9mKHUzMikpOyBpID0gaSArIDIpIHsKKyNpZmRlZiBfX0JJR0VORElBTgorCQlkaXBbaV0gPSBiZmFfb3NfbnRvaGwoc2lwW2ldKTsKKwkJZGlwW2kgKyAxXSA9IGJmYV9vc19udG9obChzaXBbaSArIDFdKTsKKyNlbHNlCisJCWRpcFtpXSA9IGJmYV9vc19udG9obChzaXBbaSArIDFdKTsKKwkJZGlwW2kgKyAxXSA9IGJmYV9vc19udG9obChzaXBbaV0pOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBOb3cgc3dhcCB0aGUgMzIgYml0IGZpZWxkcworCSAqLworCWZvciAoOyBpIDwgKHNpemVvZih1bmlvbiBiZmFfcHBvcnRfc3RhdHNfdSkgLyBzaXplb2YodTMyKSk7ICsraSkKKwkJZGlwW2ldID0gYmZhX29zX250b2hsKHNpcFtpXSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9wb3J0X3N0YXRzX2Nscih2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSBjYmFyZzsKKworCWlmIChjb21wbGV0ZSkgeworCQlwb3J0LT5zdGF0c19jYmZuKHBvcnQtPnN0YXRzX2NiYXJnLCBwb3J0LT5zdGF0c19zdGF0dXMpOworCX0gZWxzZSB7CisJCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CisJCXBvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3BvcnRfc3RhdHNfY2xyX3RpbWVvdXQodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwb3J0ID0gKHN0cnVjdCBiZmFfcHBvcnRfcyAqKWNiYXJnOworCisJYmZhX3RyYyhwb3J0LT5iZmEsIHBvcnQtPnN0YXRzX3FmdWxsKTsKKworCWlmIChwb3J0LT5zdGF0c19xZnVsbCkgeworCQliZmFfcmVxcV93Y2FuY2VsKCZwb3J0LT5zdGF0c19yZXFxX3dhaXQpOworCQlwb3J0LT5zdGF0c19xZnVsbCA9IEJGQV9GQUxTRTsKKwl9CisKKwlwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0VUSU1FUjsKKwliZmFfY2JfcXVldWUocG9ydC0+YmZhLCAmcG9ydC0+aGNiX3FlLCBfX2JmYV9jYl9wb3J0X3N0YXRzX2NsciwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9wb3J0X3N0YXRzKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcG9ydCA9IGNiYXJnOworCisJaWYgKGNvbXBsZXRlKSB7CisJCWlmIChwb3J0LT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19PSykKKwkJCWJmYV9wcG9ydF9zdGF0c19zd2FwKHBvcnQtPnN0YXRzX3JldCwgcG9ydC0+c3RhdHMpOworCQlwb3J0LT5zdGF0c19jYmZuKHBvcnQtPnN0YXRzX2NiYXJnLCBwb3J0LT5zdGF0c19zdGF0dXMpOworCX0gZWxzZSB7CisJCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CisJCXBvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3BvcnRfc3RhdHNfdGltZW91dCh2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSAoc3RydWN0IGJmYV9wcG9ydF9zICopY2Jhcmc7CisKKwliZmFfdHJjKHBvcnQtPmJmYSwgcG9ydC0+c3RhdHNfcWZ1bGwpOworCisJaWYgKHBvcnQtPnN0YXRzX3FmdWxsKSB7CisJCWJmYV9yZXFxX3djYW5jZWwoJnBvcnQtPnN0YXRzX3JlcXFfd2FpdCk7CisJCXBvcnQtPnN0YXRzX3FmdWxsID0gQkZBX0ZBTFNFOworCX0KKworCXBvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfRVRJTUVSOworCWJmYV9jYl9xdWV1ZShwb3J0LT5iZmEsICZwb3J0LT5oY2JfcWUsIF9fYmZhX2NiX3BvcnRfc3RhdHMsIHBvcnQpOworfQorCisjZGVmaW5lIEJGQV9QT1JUX1NUQVRTX1RPVgkxMDAwCisKKy8qKgorICogRmV0Y2ggcG9ydCBhdHRyaWJ1dGVzLgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9wcG9ydF9nZXRfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIHVuaW9uIGJmYV9wcG9ydF9zdGF0c191ICpzdGF0cywKKwkJICAgIGJmYV9jYl9wcG9ydF90IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJaWYgKHBvcnQtPnN0YXRzX2J1c3kpIHsKKwkJYmZhX3RyYyhiZmEsIHBvcnQtPnN0YXRzX2J1c3kpOworCQlyZXR1cm4gKEJGQV9TVEFUVVNfREVWQlVTWSk7CisJfQorCisJcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9UUlVFOworCXBvcnQtPnN0YXRzX3JldCA9IHN0YXRzOworCXBvcnQtPnN0YXRzX2NiZm4gPSBjYmZuOworCXBvcnQtPnN0YXRzX2NiYXJnID0gY2Jhcmc7CisKKwliZmFfcG9ydF9zdGF0c19xdWVyeShwb3J0KTsKKworCWJmYV90aW1lcl9zdGFydChiZmEsICZwb3J0LT50aW1lciwgYmZhX3BvcnRfc3RhdHNfdGltZW91dCwgcG9ydCwKKwkJCUJGQV9QT1JUX1NUQVRTX1RPVik7CisJcmV0dXJuIChCRkFfU1RBVFVTX09LKTsKK30KKworYmZhX3N0YXR1c190CitiZmFfcHBvcnRfY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9jYl9wcG9ydF90IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJaWYgKHBvcnQtPnN0YXRzX2J1c3kpIHsKKwkJYmZhX3RyYyhiZmEsIHBvcnQtPnN0YXRzX2J1c3kpOworCQlyZXR1cm4gKEJGQV9TVEFUVVNfREVWQlVTWSk7CisJfQorCisJcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9UUlVFOworCXBvcnQtPnN0YXRzX2NiZm4gPSBjYmZuOworCXBvcnQtPnN0YXRzX2NiYXJnID0gY2Jhcmc7CisKKwliZmFfcG9ydF9zdGF0c19jbGVhcihwb3J0KTsKKworCWJmYV90aW1lcl9zdGFydChiZmEsICZwb3J0LT50aW1lciwgYmZhX3BvcnRfc3RhdHNfY2xyX3RpbWVvdXQsIHBvcnQsCisJCQlCRkFfUE9SVF9TVEFUU19UT1YpOworCXJldHVybiAoQkZBX1NUQVRVU19PSyk7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX3Bwb3J0X3RydW5rX2VuYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTggYml0bWFwKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCWJmYV90cmMoYmZhLCBiaXRtYXApOworCWJmYV90cmMoYmZhLCBwcG9ydC0+Y2ZnLnRydW5rZWQpOworCWJmYV90cmMoYmZhLCBwcG9ydC0+Y2ZnLnRydW5rX3BvcnRzKTsKKworCWlmICghYml0bWFwIHx8IChiaXRtYXAgJiAoYml0bWFwIC0gMSkpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19FSU5WQUw7CisKKwlwcG9ydC0+Y2ZnLnRydW5rZWQgPSBCRkFfVFJVRTsKKwlwcG9ydC0+Y2ZnLnRydW5rX3BvcnRzID0gYml0bWFwOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK3ZvaWQKK2JmYV9wcG9ydF9xb3NfZ2V0X2F0dHIoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfcW9zX2F0dHJfcyAqcW9zX2F0dHIpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJcW9zX2F0dHItPnN0YXRlID0gYmZhX29zX250b2hsKHBwb3J0LT5xb3NfYXR0ci5zdGF0ZSk7CisJcW9zX2F0dHItPnRvdGFsX2JiX2NyID0gYmZhX29zX250b2hsKHBwb3J0LT5xb3NfYXR0ci50b3RhbF9iYl9jcik7Cit9CisKK3ZvaWQKK2JmYV9wcG9ydF9xb3NfZ2V0X3ZjX2F0dHIoc3RydWN0IGJmYV9zICpiZmEsCisJCQkgIHN0cnVjdCBiZmFfcW9zX3ZjX2F0dHJfcyAqcW9zX3ZjX2F0dHIpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCXN0cnVjdCBiZmFfcW9zX3ZjX2F0dHJfcyAqYmZhX3ZjX2F0dHIgPSAmcHBvcnQtPnFvc192Y19hdHRyOworCXUzMiAgICAgICAgaSA9IDA7CisKKwlxb3NfdmNfYXR0ci0+dG90YWxfdmNfY291bnQgPSBiZmFfb3NfbnRvaHMoYmZhX3ZjX2F0dHItPnRvdGFsX3ZjX2NvdW50KTsKKwlxb3NfdmNfYXR0ci0+c2hhcmVkX2NyZWRpdCA9IGJmYV9vc19udG9ocyhiZmFfdmNfYXR0ci0+c2hhcmVkX2NyZWRpdCk7CisJcW9zX3ZjX2F0dHItPmVscF9vcG1vZGVfZmxhZ3MgPQorCQliZmFfb3NfbnRvaGwoYmZhX3ZjX2F0dHItPmVscF9vcG1vZGVfZmxhZ3MpOworCisJLyoKKwkgKiBJbmRpdmlkdWFsIFZDIGluZm8KKwkgKi8KKwl3aGlsZSAoaSA8IHFvc192Y19hdHRyLT50b3RhbF92Y19jb3VudCkgeworCQlxb3NfdmNfYXR0ci0+dmNfaW5mb1tpXS52Y19jcmVkaXQgPQorCQkJYmZhX3ZjX2F0dHItPnZjX2luZm9baV0udmNfY3JlZGl0OworCQlxb3NfdmNfYXR0ci0+dmNfaW5mb1tpXS5ib3Jyb3dfY3JlZGl0ID0KKwkJCWJmYV92Y19hdHRyLT52Y19pbmZvW2ldLmJvcnJvd19jcmVkaXQ7CisJCXFvc192Y19hdHRyLT52Y19pbmZvW2ldLnByaW9yaXR5ID0KKwkJCWJmYV92Y19hdHRyLT52Y19pbmZvW2ldLnByaW9yaXR5OworCQkrK2k7CisJfQorfQorCisvKioKKyAqIEZldGNoIFFvUyBTdGF0cy4KKyAqLworYmZhX3N0YXR1c190CitiZmFfcHBvcnRfZ2V0X3Fvc19zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwgdW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgKnN0YXRzLAorCQkJYmZhX2NiX3Bwb3J0X3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJLyoKKwkgKiBRb1Mgc3RhdHMgaXMgZW1iZWRkZWQgaW4gcG9ydCBzdGF0cworCSAqLworCXJldHVybiAoYmZhX3Bwb3J0X2dldF9zdGF0cyhiZmEsIHN0YXRzLCBjYmZuLCBjYmFyZykpOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9wcG9ydF9jbGVhcl9xb3Nfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9jYl9wcG9ydF90IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJaWYgKHBvcnQtPnN0YXRzX2J1c3kpIHsKKwkJYmZhX3RyYyhiZmEsIHBvcnQtPnN0YXRzX2J1c3kpOworCQlyZXR1cm4gKEJGQV9TVEFUVVNfREVWQlVTWSk7CisJfQorCisJcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9UUlVFOworCXBvcnQtPnN0YXRzX2NiZm4gPSBjYmZuOworCXBvcnQtPnN0YXRzX2NiYXJnID0gY2Jhcmc7CisKKwliZmFfcG9ydF9xb3Nfc3RhdHNfY2xlYXIocG9ydCk7CisKKwliZmFfdGltZXJfc3RhcnQoYmZhLCAmcG9ydC0+dGltZXIsIGJmYV9wb3J0X3N0YXRzX2Nscl90aW1lb3V0LCBwb3J0LAorCQkJQkZBX1BPUlRfU1RBVFNfVE9WKTsKKwlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworfQorCisvKioKKyAqIEZldGNoIHBvcnQgYXR0cmlidXRlcy4KKyAqLworYmZhX3N0YXR1c190CitiZmFfcHBvcnRfdHJ1bmtfZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworfQorCitiZmFfYm9vbGVhbl90CitiZmFfcHBvcnRfdHJ1bmtfcXVlcnkoc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqYml0bWFwKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJKmJpdG1hcCA9IHBvcnQtPmNmZy50cnVua19wb3J0czsKKwlyZXR1cm4gcG9ydC0+Y2ZnLnRydW5rZWQ7Cit9CisKK2JmYV9ib29sZWFuX3QKK2JmYV9wcG9ydF9pc19kaXNhYmxlZChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCXJldHVybiAoYmZhX3NtX3RvX3N0YXRlKGhhbF9wcG9ydF9zbV90YWJsZSwgcG9ydC0+c20pID09CisJCUJGQV9QUE9SVF9TVF9ESVNBQkxFRCk7CisKK30KKworYmZhX2Jvb2xlYW5fdAorYmZhX3Bwb3J0X2lzX3JhdGVsaW0oc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCityZXR1cm4gKHBwb3J0LT5jZmcucmF0ZWxpbWl0ID8gQkZBX1RSVUUgOiBCRkFfRkFMU0UpOworCit9CisKK3ZvaWQKK2JmYV9wcG9ydF9jZmdfcW9zKHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfYm9vbGVhbl90IG9uX29mZikKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwliZmFfdHJjKGJmYSwgb25fb2ZmKTsKKwliZmFfdHJjKGJmYSwgcHBvcnQtPmNmZy5xb3NfZW5hYmxlZCk7CisKKwlwcG9ydC0+Y2ZnLnFvc19lbmFibGVkID0gb25fb2ZmOworfQorCit2b2lkCitiZmFfcHBvcnRfY2ZnX3JhdGVsaW0oc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3Qgb25fb2ZmKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCWJmYV90cmMoYmZhLCBvbl9vZmYpOworCWJmYV90cmMoYmZhLCBwcG9ydC0+Y2ZnLnJhdGVsaW1pdCk7CisKKwlwcG9ydC0+Y2ZnLnJhdGVsaW1pdCA9IG9uX29mZjsKKwlpZiAocHBvcnQtPmNmZy50cmxfZGVmX3NwZWVkID09IEJGQV9QUE9SVF9TUEVFRF9VTktOT1dOKQorCQlwcG9ydC0+Y2ZnLnRybF9kZWZfc3BlZWQgPSBCRkFfUFBPUlRfU1BFRURfMUdCUFM7Cit9CisKKy8qKgorICogQ29uZmlndXJlIGRlZmF1bHQgbWluaW11bSByYXRlbGltIHNwZWVkCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX3Bwb3J0X2NmZ19yYXRlbGltX3NwZWVkKHN0cnVjdCBiZmFfcyAqYmZhLCBlbnVtIGJmYV9wcG9ydF9zcGVlZCBzcGVlZCkKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwliZmFfdHJjKGJmYSwgc3BlZWQpOworCisJLyoKKwkgKiBBdXRvIGFuZCBzcGVlZHMgZ3JlYXRlciB0aGFuIHRoZSBzdXBwb3J0ZWQgc3BlZWQsIGFyZSBpbnZhbGlkCisJICovCisJaWYgKChzcGVlZCA9PSBCRkFfUFBPUlRfU1BFRURfQVVUTykgfHwgKHNwZWVkID4gcHBvcnQtPnNwZWVkX3N1cCkpIHsKKwkJYmZhX3RyYyhiZmEsIHBwb3J0LT5zcGVlZF9zdXApOworCQlyZXR1cm4gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJfQorCisJcHBvcnQtPmNmZy50cmxfZGVmX3NwZWVkID0gc3BlZWQ7CisKKwlyZXR1cm4gKEJGQV9TVEFUVVNfT0spOworfQorCisvKioKKyAqIEdldCBkZWZhdWx0IG1pbmltdW0gcmF0ZWxpbSBzcGVlZAorICovCitlbnVtIGJmYV9wcG9ydF9zcGVlZAorYmZhX3Bwb3J0X2dldF9yYXRlbGltX3NwZWVkKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfcHBvcnRfcyAqcHBvcnQgPSBCRkFfUE9SVF9NT0QoYmZhKTsKKworCWJmYV90cmMoYmZhLCBwcG9ydC0+Y2ZnLnRybF9kZWZfc3BlZWQpOworCXJldHVybiAocHBvcnQtPmNmZy50cmxfZGVmX3NwZWVkKTsKKworfQorCit2b2lkCitiZmFfcHBvcnRfYnVzeShzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBzdGF0dXMpCit7CisJc3RydWN0IGJmYV9wcG9ydF9zICpwcG9ydCA9IEJGQV9QT1JUX01PRChiZmEpOworCisJYmZhX3RyYyhiZmEsIHN0YXR1cyk7CisJYmZhX3RyYyhiZmEsIHBwb3J0LT5kaWFnX2J1c3kpOworCisJcHBvcnQtPmRpYWdfYnVzeSA9IHN0YXR1czsKK30KKwordm9pZAorYmZhX3Bwb3J0X2JlYWNvbihzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBiZWFjb24sCisJCSBiZmFfYm9vbGVhbl90IGxpbmtfZTJlX2JlYWNvbikKK3sKKwlzdHJ1Y3QgYmZhX3Bwb3J0X3MgKnBwb3J0ID0gQkZBX1BPUlRfTU9EKGJmYSk7CisKKwliZmFfdHJjKGJmYSwgYmVhY29uKTsKKwliZmFfdHJjKGJmYSwgbGlua19lMmVfYmVhY29uKTsKKwliZmFfdHJjKGJmYSwgcHBvcnQtPmJlYWNvbik7CisJYmZhX3RyYyhiZmEsIHBwb3J0LT5saW5rX2UyZV9iZWFjb24pOworCisJcHBvcnQtPmJlYWNvbiA9IGJlYWNvbjsKKwlwcG9ydC0+bGlua19lMmVfYmVhY29uID0gbGlua19lMmVfYmVhY29uOworfQorCitiZmFfYm9vbGVhbl90CitiZmFfcHBvcnRfaXNfbGlua3VwKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXJldHVybiBiZmFfc21fY21wX3N0YXRlKEJGQV9QT1JUX01PRChiZmEpLCBiZmFfcHBvcnRfc21fbGlua3VwKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYjM5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuYwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFfZmNzLmMgQkZBIEZDUyBtYWluCisgKi8KKworI2luY2x1ZGUgPGZjcy9iZmFfZmNzLmg+CisjaW5jbHVkZSAiZmNzX3BvcnQuaCIKKyNpbmNsdWRlICJmY3NfdWYuaCIKKyNpbmNsdWRlICJmY3NfdnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfcnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfZmFicmljLmgiCisjaW5jbHVkZSAiZmNzX2ZjcGltLmgiCisjaW5jbHVkZSAiZmNzX2ZjcHRtLmgiCisjaW5jbHVkZSAiZmNidWlsZC5oIgorI2luY2x1ZGUgImZjcy5oIgorI2luY2x1ZGUgImJmYWRfZHJ2LmgiCisjaW5jbHVkZSA8ZmNiL2JmYV9mY2IuaD4KKworLyoqCisgKiBGQ1Mgc3ViLW1vZHVsZXMKKyAqLworc3RydWN0IGJmYV9mY3NfbW9kX3MgeworCXZvaWQgICAgICAgICAgICAoKm1vZGluaXQpIChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOworCXZvaWQgICAgICAgICAgICAoKm1vZGV4aXQpIChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOworfTsKKworI2RlZmluZSBCRkFfRkNTX01PRFVMRShfbW9kKSB7IF9tb2QgIyMgX21vZGluaXQsIF9tb2QgIyMgX21vZGV4aXQgfQorCitzdGF0aWMgc3RydWN0IGJmYV9mY3NfbW9kX3MgZmNzX21vZHVsZXNbXSA9IHsKKwlCRkFfRkNTX01PRFVMRShiZmFfZmNzX3Bwb3J0KSwKKwlCRkFfRkNTX01PRFVMRShiZmFfZmNzX3VmKSwKKwlCRkFfRkNTX01PRFVMRShiZmFfZmNzX2ZhYnJpYyksCisJQkZBX0ZDU19NT0RVTEUoYmZhX2Zjc192cG9ydCksCisJQkZBX0ZDU19NT0RVTEUoYmZhX2Zjc19ycG9ydCksCisJQkZBX0ZDU19NT0RVTEUoYmZhX2Zjc19mY3BpbSksCit9OworCisvKioKKyAqICBmY3NfYXBpIEJGQSBGQ1MgQVBJCisgKi8KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfZXhpdF9jb21wKHZvaWQgKmZjc19jYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19zICpmY3MgPSBmY3NfY2Jhcmc7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IGZjcy0+YmZhZDsKKworCWNvbXBsZXRlKCZiZmFkLT5jb21wKTsKK30KKworCisKKy8qKgorICogIGZjc19hcGkgQkZBIEZDUyBBUEkKKyAqLworCisvKioKKyAqIAkJRkNTIGluc3RhbmNlIGluaXRpYWxpemF0aW9uLgorICoKKyAqIAlwYXJhbVtpbl0JCWZjcwkJRkNTIGluc3RhbmNlCisgKiAJcGFyYW1baW5dCQliZmEJCUJGQSBpbnN0YW5jZQorICogCXBhcmFtW2luXQkJYmZhZAkJQkZBIGRyaXZlciBpbnN0YW5jZQorICoKKyAqIAlyZXR1cm4gTm9uZQorICovCit2b2lkCitiZmFfZmNzX2luaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzLCBzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYWRfcyAqYmZhZCwKKwkJCWJmYV9ib29sZWFuX3QgbWluX2NmZykKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgYmZhX2Zjc19tb2RfcyAgKm1vZDsKKworCWZjcy0+YmZhID0gYmZhOworCWZjcy0+YmZhZCA9IGJmYWQ7CisJZmNzLT5taW5fY2ZnID0gbWluX2NmZzsKKworCWJmYV9hdHRhY2hfZmNzKGJmYSk7CisJZmNidWlsZF9pbml0KCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGZjc19tb2R1bGVzKSAvIHNpemVvZihmY3NfbW9kdWxlc1swXSk7IGkrKykgeworCQltb2QgPSAmZmNzX21vZHVsZXNbaV07CisJCW1vZC0+bW9kaW5pdChmY3MpOworCX0KK30KKworLyoqCisgKiBTdGFydCBGQ1Mgb3BlcmF0aW9ucy4KKyAqLwordm9pZAorYmZhX2Zjc19zdGFydChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7CisJYmZhX2Zjc19mYWJyaWNfbW9kc3RhcnQoZmNzKTsKK30KKworLyoqCisgKiAJCUZDUyBkcml2ZXIgZGV0YWlscyBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAJcGFyYW1baW5dCQlmY3MJCUZDUyBpbnN0YW5jZQorICogCXBhcmFtW2luXQkJZHJpdmVyX2luZm8JRHJpdmVyIERldGFpbHMKKyAqCisgKiAJcmV0dXJuIE5vbmUKKyAqLwordm9pZAorYmZhX2Zjc19kcml2ZXJfaW5mb19pbml0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcywKKwkJCXN0cnVjdCBiZmFfZmNzX2RyaXZlcl9pbmZvX3MgKmRyaXZlcl9pbmZvKQoreworCisJZmNzLT5kcml2ZXJfaW5mbyA9ICpkcml2ZXJfaW5mbzsKKworCWJmYV9mY3NfZmFicmljX3BzeW1iX2luaXQoJmZjcy0+ZmFicmljKTsKK30KKworLyoqCisgKiAJCUZDUyBpbnN0YW5jZSBjbGVhbnVwIGFuZCBleGl0LgorICoKKyAqIAlwYXJhbVtpbl0JCWZjcwkJCUZDUyBpbnN0YW5jZQorICogCXJldHVybiBOb25lCisgKi8KK3ZvaWQKK2JmYV9mY3NfZXhpdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7CisJc3RydWN0IGJmYV9mY3NfbW9kX3MgICptb2Q7CisJaW50ICAgICAgICAgICAgIG5tb2RzLCBpOworCisJYmZhX3djX2luaXQoJmZjcy0+d2MsIGJmYV9mY3NfZXhpdF9jb21wLCBmY3MpOworCisJbm1vZHMgPSBzaXplb2YoZmNzX21vZHVsZXMpIC8gc2l6ZW9mKGZjc19tb2R1bGVzWzBdKTsKKworCWZvciAoaSA9IDA7IGkgPCBubW9kczsgaSsrKSB7CisJCWJmYV93Y191cCgmZmNzLT53Yyk7CisKKwkJbW9kID0gJmZjc19tb2R1bGVzW2ldOworCQltb2QtPm1vZGV4aXQoZmNzKTsKKwl9CisKKwliZmFfd2Nfd2FpdCgmZmNzLT53Yyk7Cit9CisKKwordm9pZAorYmZhX2Zjc190cmNfaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QpCit7CisJZmNzLT50cmNtb2QgPSB0cmNtb2Q7Cit9CisKKwordm9pZAorYmZhX2Zjc19sb2dfaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtb2QpCit7CisJZmNzLT5sb2dtID0gbG9nbW9kOworfQorCisKK3ZvaWQKK2JmYV9mY3NfYWVuX2luaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzLCBzdHJ1Y3QgYmZhX2Flbl9zICphZW4pCit7CisJZmNzLT5hZW4gPSBhZW47Cit9CisKK3ZvaWQKK2JmYV9mY3NfbW9kZXhpdF9jb21wKHN0cnVjdCBiZmFfZmNzX3MgKmZjcykKK3sKKwliZmFfd2NfZG93bigmZmNzLT53Yyk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTc1ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2xwb3J0LmMKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2Zjc19wb3J0LmMgQkZBIEZDUyBwb3J0CisgKi8KKworI2luY2x1ZGUgPGZjcy9iZmFfZmNzLmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfbHBvcnQuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjc19ycG9ydC5oPgorI2luY2x1ZGUgPGZjYi9iZmFfZmNiX3BvcnQuaD4KKyNpbmNsdWRlIDxiZmFfc3ZjLmg+CisjaW5jbHVkZSA8bG9nL2JmYV9sb2dfZmNzLmg+CisjaW5jbHVkZSAiZmNzLmgiCisjaW5jbHVkZSAiZmNzX2xwb3J0LmgiCisjaW5jbHVkZSAiZmNzX3Zwb3J0LmgiCisjaW5jbHVkZSAiZmNzX3Jwb3J0LmgiCisjaW5jbHVkZSAiZmNzX2ZjeHAuaCIKKyNpbmNsdWRlICJmY3NfdHJjbW9kLmgiCisjaW5jbHVkZSAibHBvcnRfcHJpdi5oIgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuX2xwb3J0Lmg+CisKK0JGQV9UUkNfRklMRShGQ1MsIFBPUlQpOworCisvKioKKyAqIEZvcndhcmQgZGVjbGFyYXRpb25zCisgKi8KKworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQkJICAgICAgZW51bSBiZmFfbHBvcnRfYWVuX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfc2VuZF9sc19yanQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJc3RydWN0IGZjaHNfcyAqcnhfZmNocywgdTggcmVhc29uX2NvZGUsCisJCQl1OCByZWFzb25fY29kZV9leHBsKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfcGxvZ2koc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJc3RydWN0IGZjaHNfcyAqcnhfZmNocywKKwkJCXN0cnVjdCBmY19sb2dpX3MgKnBsb2dpKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfb25saW5lX2FjdGlvbnMoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfb2ZmbGluZV9hY3Rpb25zKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X3Vua25vd25faW5pdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF91bmtub3duX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF91bmtub3duX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfZGVsZXRlZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9lY2hvKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXN0cnVjdCBmY2hzX3MgKnJ4X2ZjaHMsCisJCQlzdHJ1Y3QgZmNfZWNob19zICplY2hvLCB1MTYgbGVuKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfcm5pZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQlzdHJ1Y3QgZmNoc19zICpyeF9mY2hzLAorCQkJc3RydWN0IGZjX3JuaWRfY21kX3MgKnJuaWQsIHUxNiBsZW4pOworc3RhdGljIHZvaWQgICAgIGJmYV9mc19wb3J0X2dldF9nZW5fdG9wb19kYXRhKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXN0cnVjdCBmY19ybmlkX2dlbmVyYWxfdG9wb2xvZ3lfZGF0YV9zICpnZW5fdG9wb19kYXRhKTsKKworc3RhdGljIHN0cnVjdCB7CisJdm9pZCAgICAgICAgICAgICgqaW5pdCkgKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7CisJdm9pZCAgICAgICAgICAgICgqb25saW5lKSAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKKwl2b2lkICAgICAgICAgICAgKCpvZmZsaW5lKSAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKK30gX19wb3J0X2FjdGlvbltdID0geworCXsKKwliZmFfZmNzX3BvcnRfdW5rbm93bl9pbml0LCBiZmFfZmNzX3BvcnRfdW5rbm93bl9vbmxpbmUsCisJCQliZmFfZmNzX3BvcnRfdW5rbm93bl9vZmZsaW5lfSwgeworCWJmYV9mY3NfcG9ydF9mYWJfaW5pdCwgYmZhX2Zjc19wb3J0X2ZhYl9vbmxpbmUsCisJCQliZmFfZmNzX3BvcnRfZmFiX29mZmxpbmV9LCB7CisJYmZhX2Zjc19wb3J0X2xvb3BfaW5pdCwgYmZhX2Zjc19wb3J0X2xvb3Bfb25saW5lLAorCQkJYmZhX2Zjc19wb3J0X2xvb3Bfb2ZmbGluZX0sIHsKK2JmYV9mY3NfcG9ydF9uMm5faW5pdCwgYmZhX2Zjc19wb3J0X24ybl9vbmxpbmUsCisJCQliZmFfZmNzX3BvcnRfbjJuX29mZmxpbmV9LH07CisKKy8qKgorICogIGZjc19wb3J0X3NtIEZDUyBsb2dpY2FsIHBvcnQgc3RhdGUgbWFjaGluZQorICovCisKK2VudW0gYmZhX2Zjc19wb3J0X2V2ZW50IHsKKwlCRkFfRkNTX1BPUlRfU01fQ1JFQVRFID0gMSwKKwlCRkFfRkNTX1BPUlRfU01fT05MSU5FID0gMiwKKwlCRkFfRkNTX1BPUlRfU01fT0ZGTElORSA9IDMsCisJQkZBX0ZDU19QT1JUX1NNX0RFTEVURSA9IDQsCisJQkZBX0ZDU19QT1JUX1NNX0RFTFJQT1JUID0gNSwKK307CisKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCQkgICAgICAgZW51bSBiZmFfZmNzX3BvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9zbV9pbml0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCQkgICAgIGVudW0gYmZhX2Zjc19wb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfc21fb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCQkgICAgICAgZW51bSBiZmFfZmNzX3BvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9zbV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCQkJZW51bSBiZmFfZmNzX3BvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9zbV9kZWxldGluZyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQkJCSBlbnVtIGJmYV9mY3NfcG9ydF9ldmVudCBldmVudCk7CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCWVudW0gYmZhX2Zjc19wb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19QT1JUX1NNX0NSRUFURToKKwkJYmZhX3NtX3NldF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21faW5pdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfc21faW5pdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIGVudW0gYmZhX2Zjc19wb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19QT1JUX1NNX09OTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21fb25saW5lKTsKKwkJYmZhX2Zjc19wb3J0X29ubGluZV9hY3Rpb25zKHBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19QT1JUX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21fdW5pbml0KTsKKwkJYmZhX2Zjc19wb3J0X2RlbGV0ZWQocG9ydCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfc21fb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCWVudW0gYmZhX2Zjc19wb3J0X2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMocG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX1BPUlRfU01fT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21fb2ZmbGluZSk7CisJCWJmYV9mY3NfcG9ydF9vZmZsaW5lX2FjdGlvbnMocG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX1BPUlRfU01fREVMRVRFOgorCisJCV9fcG9ydF9hY3Rpb25bcG9ydC0+ZmFicmljLT5mYWJfdHlwZV0ub2ZmbGluZShwb3J0KTsKKworCQlpZiAocG9ydC0+bnVtX3Jwb3J0cyA9PSAwKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfcG9ydF9zbV91bmluaXQpOworCQkJYmZhX2Zjc19wb3J0X2RlbGV0ZWQocG9ydCk7CisJCX0gZWxzZSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfcG9ydF9zbV9kZWxldGluZyk7CisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJnBvcnQtPnJwb3J0X3EpIHsKKwkJCQlycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopcWU7CisJCQkJYmZhX2Zjc19ycG9ydF9kZWxldGUocnBvcnQpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX1BPUlRfU01fREVMUlBPUlQ6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfc21fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQllbnVtIGJmYV9mY3NfcG9ydF9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19QT1JUX1NNX09OTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21fb25saW5lKTsKKwkJYmZhX2Zjc19wb3J0X29ubGluZV9hY3Rpb25zKHBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19QT1JUX1NNX0RFTEVURToKKwkJaWYgKHBvcnQtPm51bV9ycG9ydHMgPT0gMCkgeworCQkJYmZhX3NtX3NldF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21fdW5pbml0KTsKKwkJCWJmYV9mY3NfcG9ydF9kZWxldGVkKHBvcnQpOworCQl9IGVsc2UgeworCQkJYmZhX3NtX3NldF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21fZGVsZXRpbmcpOworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZwb3J0LT5ycG9ydF9xKSB7CisJCQkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXFlOworCQkJCWJmYV9mY3NfcnBvcnRfZGVsZXRlKHJwb3J0KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19QT1JUX1NNX0RFTFJQT1JUOgorCWNhc2UgQkZBX0ZDU19QT1JUX1NNX09GRkxJTkU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfc21fZGVsZXRpbmcoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJIGVudW0gYmZhX2Zjc19wb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19QT1JUX1NNX0RFTFJQT1JUOgorCQlpZiAocG9ydC0+bnVtX3Jwb3J0cyA9PSAwKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfcG9ydF9zbV91bmluaXQpOworCQkJYmZhX2Zjc19wb3J0X2RlbGV0ZWQocG9ydCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisKKy8qKgorICogIGZjc19wb3J0X3B2dAorICovCisKKy8qKgorICogU2VuZCBBRU4gbm90aWZpY2F0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkgICAgICBlbnVtIGJmYV9scG9ydF9hZW5fZXZlbnQgZXZlbnQpCit7CisJdW5pb24gYmZhX2Flbl9kYXRhX3UgYWVuX2RhdGE7CisJc3RydWN0IGJmYV9sb2dfbW9kX3MgKmxvZ21vZCA9IHBvcnQtPmZjcy0+bG9nbTsKKwllbnVtIGJmYV9wb3J0X3JvbGUgcm9sZSA9IHBvcnQtPnBvcnRfY2ZnLnJvbGVzOworCXd3bl90ICAgICAgICAgICBscHd3biA9IGJmYV9mY3NfcG9ydF9nZXRfcHd3bihwb3J0KTsKKwljaGFyICAgICAgICAgICAgbHB3d25fcHRyW0JGQV9TVFJJTkdfMzJdOworCWNoYXIgICAgICAgICAgICpyb2xlX3N0cltCRkFfUE9SVF9ST0xFX0ZDUF9NQVggLyAyICsgMV0gPQorCQl7ICJJbml0aWF0b3IiLCAiVGFyZ2V0IiwgIklQRkMiIH07CisKKwl3d24yc3RyKGxwd3duX3B0ciwgbHB3d24pOworCisJYmZhX2Fzc2VydChyb2xlIDw9IEJGQV9QT1JUX1JPTEVfRkNQX01BWCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfTFBPUlRfQUVOX09OTElORToKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fTFBPUlRfT05MSU5FLCBscHd3bl9wdHIsCisJCQlyb2xlX3N0cltyb2xlIC8gMl0pOworCQlicmVhazsKKwljYXNlIEJGQV9MUE9SVF9BRU5fT0ZGTElORToKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fTFBPUlRfT0ZGTElORSwgbHB3d25fcHRyLAorCQkJcm9sZV9zdHJbcm9sZSAvIDJdKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfTFBPUlRfQUVOX05FVzoKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fTFBPUlRfTkVXLCBscHd3bl9wdHIsCisJCQlyb2xlX3N0cltyb2xlIC8gMl0pOworCQlicmVhazsKKwljYXNlIEJGQV9MUE9SVF9BRU5fREVMRVRFOgorCQliZmFfbG9nKGxvZ21vZCwgQkZBX0FFTl9MUE9SVF9ERUxFVEUsIGxwd3duX3B0ciwKKwkJCXJvbGVfc3RyW3JvbGUgLyAyXSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0xQT1JUX0FFTl9ESVNDT05ORUNUOgorCQliZmFfbG9nKGxvZ21vZCwgQkZBX0FFTl9MUE9SVF9ESVNDT05ORUNULCBscHd3bl9wdHIsCisJCQlyb2xlX3N0cltyb2xlIC8gMl0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlhZW5fZGF0YS5scG9ydC52Zl9pZCA9IHBvcnQtPmZhYnJpYy0+dmZfaWQ7CisJYWVuX2RhdGEubHBvcnQucm9sZXMgPSByb2xlOworCWFlbl9kYXRhLmxwb3J0LnBwd3duID0KKwkJYmZhX2Zjc19wb3J0X2dldF9wd3duKGJmYV9mY3NfZ2V0X2Jhc2VfcG9ydChwb3J0LT5mY3MpKTsKKwlhZW5fZGF0YS5scG9ydC5scHd3biA9IGxwd3duOworfQorCisvKgorICogU2VuZCBhIExTIHJlamVjdAorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X3NlbmRfbHNfcmp0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgc3RydWN0IGZjaHNfcyAqcnhfZmNocywKKwkJCSB1OCByZWFzb25fY29kZSwgdTggcmVhc29uX2NvZGVfZXhwbCkKK3sKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJc3RydWN0IGJmYV9ycG9ydF9zICpiZmFfcnBvcnQgPSBOVUxMOworCWludCAgICAgICAgICAgICBsZW47CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcnhfZmNocy0+c19pZCk7CisKKwlmY3hwID0gYmZhX2Zjc19mY3hwX2FsbG9jKHBvcnQtPmZjcyk7CisJaWYgKCFmY3hwKQorCQlyZXR1cm47CisKKwlsZW4gPSBmY19sc19yanRfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksIHJ4X2ZjaHMtPnNfaWQsCisJCQkgICAgICBiZmFfZmNzX3BvcnRfZ2V0X2ZjaWQocG9ydCksIHJ4X2ZjaHMtPm94X2lkLAorCQkJICAgICAgcmVhc29uX2NvZGUsIHJlYXNvbl9jb2RlX2V4cGwpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBiZmFfcnBvcnQsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywKKwkJICAgICAgQkZBX0ZBTFNFLCBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBOVUxMLCBOVUxMLAorCQkgICAgICBGQ19NQVhfUERVU1osIDApOworfQorCisvKioKKyAqIFByb2Nlc3MgaW5jb21pbmcgcGxvZ2kgZnJvbSBhIHJlbW90ZSBwb3J0LgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X3Bsb2dpKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgc3RydWN0IGZjaHNfcyAqcnhfZmNocywKKwkJCXN0cnVjdCBmY19sb2dpX3MgKnBsb2dpKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHJ4X2ZjaHMtPmRfaWQpOworCWJmYV90cmMocG9ydC0+ZmNzLCByeF9mY2hzLT5zX2lkKTsKKworCS8qCisJICogSWYgbWluIGNmZyBtb2RlIGlzIGVuYWJsZWQsIGRyb3AgYW55IGluY29taW5nIFBMT0dJcworCSAqLworCWlmIChfX2Zjc19taW5fY2ZnKHBvcnQtPmZjcykpIHsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIHJ4X2ZjaHMtPnNfaWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGZjX3Bsb2dpX3BhcnNlKHJ4X2ZjaHMpICE9IEZDX1BBUlNFX09LKSB7CisJCWJmYV90cmMocG9ydC0+ZmNzLCByeF9mY2hzLT5zX2lkKTsKKwkJLyoKKwkJICogc2VuZCBhIExTIHJlamVjdAorCQkgKi8KKwkJYmZhX2Zjc19wb3J0X3NlbmRfbHNfcmp0KHBvcnQsIHJ4X2ZjaHMsCisJCQkJCSBGQ19MU19SSlRfUlNOX1BST1RPQ09MX0VSUk9SLAorCQkJCQkgRkNfTFNfUkpUX0VYUF9TUEFSTVNfRVJSX09QVElPTlMpOworCQlyZXR1cm47CisJfQorCisJLyoqCisqIERpcmVjdCBBdHRhY2ggUDJQIG1vZGUgOiB2ZXJpZnkgYWRkcmVzcyBhc3NpZ25lZCBieSB0aGUgci1wb3J0LgorCSAqLworCWlmICgoIWJmYV9mY3NfZmFicmljX2lzX3N3aXRjaGVkKHBvcnQtPmZhYnJpYykpCisJICAgICYmCisJICAgIChtZW1jbXAKKwkgICAgICgodm9pZCAqKSZiZmFfZmNzX3BvcnRfZ2V0X3B3d24ocG9ydCksICh2b2lkICopJnBsb2dpLT5wb3J0X25hbWUsCisJICAgICAgc2l6ZW9mKHd3bl90KSkgPCAwKSkgeworCQlpZiAoQkZBX0ZDU19QSURfSVNfV0tBKHJ4X2ZjaHMtPmRfaWQpKSB7CisJCQkvKgorCQkJICogQWRkcmVzcyBhc3NpZ25lZCB0byB1cyBjYW5ub3QgYmUgYSBXS0EKKwkJCSAqLworCQkJYmZhX2Zjc19wb3J0X3NlbmRfbHNfcmp0KHBvcnQsIHJ4X2ZjaHMsCisJCQkJCUZDX0xTX1JKVF9SU05fUFJPVE9DT0xfRVJST1IsCisJCQkJCUZDX0xTX1JKVF9FWFBfSU5WQUxJRF9OUE9SVF9JRCk7CisJCQlyZXR1cm47CisJCX0KKwkJcG9ydC0+cGlkID0gcnhfZmNocy0+ZF9pZDsKKwl9CisKKwkvKioKKwkgKiBGaXJzdCwgY2hlY2sgaWYgd2Uga25vdyB0aGUgZGV2aWNlIGJ5IHB3d24uCisJICovCisJcnBvcnQgPSBiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X2J5X3B3d24ocG9ydCwgcGxvZ2ktPnBvcnRfbmFtZSk7CisJaWYgKHJwb3J0KSB7CisJCS8qKgorCQkgKiBEaXJlY3QgQXR0YWNoIFAyUCBtb2RlOiBoYW5kbGUgYWRkcmVzcyBhc3NpZ25lZCBieSB0aGUgcnBvcnQuCisJCSAqLworCQlpZiAoKCFiZmFfZmNzX2ZhYnJpY19pc19zd2l0Y2hlZChwb3J0LT5mYWJyaWMpKQorCQkgICAgJiYKKwkJICAgIChtZW1jbXAKKwkJICAgICAoKHZvaWQgKikmYmZhX2Zjc19wb3J0X2dldF9wd3duKHBvcnQpLAorCQkgICAgICAodm9pZCAqKSZwbG9naS0+cG9ydF9uYW1lLCBzaXplb2Yod3duX3QpKSA8IDApKSB7CisJCQlwb3J0LT5waWQgPSByeF9mY2hzLT5kX2lkOworCQkJcnBvcnQtPnBpZCA9IHJ4X2ZjaHMtPnNfaWQ7CisJCX0KKwkJYmZhX2Zjc19ycG9ydF9wbG9naShycG9ydCwgcnhfZmNocywgcGxvZ2kpOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogTmV4dCwgbG9va3VwIHJwb3J0IGJ5IFBJRC4KKwkgKi8KKwlycG9ydCA9IGJmYV9mY3NfcG9ydF9nZXRfcnBvcnRfYnlfcGlkKHBvcnQsIHJ4X2ZjaHMtPnNfaWQpOworCWlmICghcnBvcnQpIHsKKwkJLyoqCisJCSAqIEluYm91bmQgUExPR0kgZnJvbSBhIG5ldyBkZXZpY2UuCisJCSAqLworCQliZmFfZmNzX3Jwb3J0X3Bsb2dpX2NyZWF0ZShwb3J0LCByeF9mY2hzLCBwbG9naSk7CisJCXJldHVybjsKKwl9CisKKwkvKioKKwkgKiBScG9ydCBpcyBrbm93biBvbmx5IGJ5IFBJRC4KKwkgKi8KKwlpZiAocnBvcnQtPnB3d24pIHsKKwkJLyoqCisJCSAqIFRoaXMgaXMgYSBkaWZmZXJlbnQgZGV2aWNlIHdpdGggdGhlIHNhbWUgcGlkLiBPbGQgZGV2aWNlCisJCSAqIGRpc2FwcGVhcmVkLiBTZW5kIGltcGxpY2l0IExPR08gdG8gb2xkIGRldmljZS4KKwkJICovCisJCWJmYV9hc3NlcnQocnBvcnQtPnB3d24gIT0gcGxvZ2ktPnBvcnRfbmFtZSk7CisJCWJmYV9mY3NfcnBvcnRfbG9nb19pbXAocnBvcnQpOworCisJCS8qKgorCQkgKiBJbmJvdW5kIFBMT0dJIGZyb20gYSBuZXcgZGV2aWNlICh3aXRoIG9sZCBQSUQpLgorCQkgKi8KKwkJYmZhX2Zjc19ycG9ydF9wbG9naV9jcmVhdGUocG9ydCwgcnhfZmNocywgcGxvZ2kpOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogUExPR0kgY3Jvc3NpbmcgZWFjaCBvdGhlci4KKwkgKi8KKwliZmFfYXNzZXJ0KHJwb3J0LT5wd3duID09IFdXTl9OVUxMKTsKKwliZmFfZmNzX3Jwb3J0X3Bsb2dpKHJwb3J0LCByeF9mY2hzLCBwbG9naSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGluY29taW5nIEVDSE8uCisgKiBTaW5jZSBpdCBkb2VzIG5vdCByZXF1aXJlIGEgbG9naW4sIGl0IGlzIHByb2Nlc3NlZCBoZXJlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2VjaG8oc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LCBzdHJ1Y3QgZmNoc19zICpyeF9mY2hzLAorCQkJc3RydWN0IGZjX2VjaG9fcyAqZWNobywgdTE2IHJ4X2xlbikKK3sKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJc3RydWN0IGJmYV9ycG9ydF9zICpiZmFfcnBvcnQgPSBOVUxMOworCWludCAgICAgICAgICAgICBsZW4sIHB5bGRfbGVuOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHJ4X2ZjaHMtPnNfaWQpOworCWJmYV90cmMocG9ydC0+ZmNzLCByeF9mY2hzLT5kX2lkKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgcnhfbGVuKTsKKworCWZjeHAgPSBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApCisJCXJldHVybjsKKworCWxlbiA9IGZjX2xzX2FjY19idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwgcnhfZmNocy0+c19pZCwKKwkJCSAgICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgcnhfZmNocy0+b3hfaWQpOworCisJLyoKKwkgKiBDb3B5IHRoZSBwYXlsb2FkIChpZiBhbnkpIGZyb20gdGhlIGVjaG8gZnJhbWUKKwkgKi8KKwlweWxkX2xlbiA9IHJ4X2xlbiAtIHNpemVvZihzdHJ1Y3QgZmNoc19zKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgcHlsZF9sZW4pOworCisJaWYgKHB5bGRfbGVuID4gbGVuKQorCQltZW1jcHkoKCh1OCAqKSBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApKSArCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGZjX2VjaG9fcyksIChlY2hvICsgMSksCisJCSAgICAgICAocHlsZF9sZW4gLSBzaXplb2Yoc3RydWN0IGZjX2VjaG9fcykpKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgYmZhX3Jwb3J0LCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsCisJCSAgICAgIEJGQV9GQUxTRSwgRkNfQ0xBU1NfMywgcHlsZF9sZW4sICZmY2hzLCBOVUxMLCBOVUxMLAorCQkgICAgICBGQ19NQVhfUERVU1osIDApOworfQorCisvKgorICogUHJvY2VzcyBpbmNvbWluZyBSTklELgorICogU2luY2UgaXQgZG9lcyBub3QgcmVxdWlyZSBhIGxvZ2luLCBpdCBpcyBwcm9jZXNzZWQgaGVyZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9ybmlkKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgc3RydWN0IGZjaHNfcyAqcnhfZmNocywKKwkJCXN0cnVjdCBmY19ybmlkX2NtZF9zICpybmlkLCB1MTYgcnhfbGVuKQoreworCXN0cnVjdCBmY19ybmlkX2NvbW1vbl9pZF9kYXRhX3MgY29tbW9uX2lkX2RhdGE7CisJc3RydWN0IGZjX3JuaWRfZ2VuZXJhbF90b3BvbG9neV9kYXRhX3MgZ2VuX3RvcG9fZGF0YTsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJc3RydWN0IGJmYV9ycG9ydF9zICpiZmFfcnBvcnQgPSBOVUxMOworCXUxNiAgICAgICAgbGVuOworCXUzMiAgICAgICAgZGF0YV9mb3JtYXQ7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcnhfZmNocy0+c19pZCk7CisJYmZhX3RyYyhwb3J0LT5mY3MsIHJ4X2ZjaHMtPmRfaWQpOworCWJmYV90cmMocG9ydC0+ZmNzLCByeF9sZW4pOworCisJZmN4cCA9IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDaGVjayBOb2RlIEluZGVudGlmaWNhdGlvbiBEYXRhIEZvcm1hdAorCSAqIFdlIG9ubHkgc3VwcG9ydCBHZW5lcmFsIFRvcG9sb2d5IERpc2NvdmVyeSBGb3JtYXQuCisJICogRm9yIGFueSBvdGhlciByZXF1ZXN0ZWQgRGF0YSBGb3JtYXRzLCB3ZSByZXR1cm4gQ29tbW9uIE5vZGUgSWQgRGF0YQorCSAqIG9ubHksIGFzIHBlciBGQy1MUy4KKwkgKi8KKwliZmFfdHJjKHBvcnQtPmZjcywgcm5pZC0+bm9kZV9pZF9kYXRhX2Zvcm1hdCk7CisJaWYgKHJuaWQtPm5vZGVfaWRfZGF0YV9mb3JtYXQgPT0gUk5JRF9OT0RFSURfREFUQV9GT1JNQVRfRElTQ09WRVJZKSB7CisJCWRhdGFfZm9ybWF0ID0gUk5JRF9OT0RFSURfREFUQV9GT1JNQVRfRElTQ09WRVJZOworCQkvKgorCQkgKiBHZXQgR2VuZXJhbCB0b3BvbG9neSBkYXRhIGZvciB0aGlzIHBvcnQKKwkJICovCisJCWJmYV9mc19wb3J0X2dldF9nZW5fdG9wb19kYXRhKHBvcnQsICZnZW5fdG9wb19kYXRhKTsKKwl9IGVsc2UgeworCQlkYXRhX2Zvcm1hdCA9IFJOSURfTk9ERUlEX0RBVEFfRk9STUFUX0NPTU1PTjsKKwl9CisKKwkvKgorCSAqIENvcHkgdGhlIE5vZGUgSWQgSW5mbworCSAqLworCWNvbW1vbl9pZF9kYXRhLnBvcnRfbmFtZSA9IGJmYV9mY3NfcG9ydF9nZXRfcHd3bihwb3J0KTsKKwljb21tb25faWRfZGF0YS5ub2RlX25hbWUgPSBiZmFfZmNzX3BvcnRfZ2V0X253d24ocG9ydCk7CisKKwlsZW4gPSBmY19ybmlkX2FjY19idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwgcnhfZmNocy0+c19pZCwKKwkJCQliZmFfZmNzX3BvcnRfZ2V0X2ZjaWQocG9ydCksIHJ4X2ZjaHMtPm94X2lkLAorCQkJCWRhdGFfZm9ybWF0LCAmY29tbW9uX2lkX2RhdGEsICZnZW5fdG9wb19kYXRhKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgYmZhX3Jwb3J0LCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsCisJCSAgICAgIEJGQV9GQUxTRSwgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgTlVMTCwgTlVMTCwKKwkJICAgICAgRkNfTUFYX1BEVVNaLCAwKTsKKworCXJldHVybjsKK30KKworLyoKKyAqICBGaWxsIG91dCBHZW5lcmFsIFRvcG9scGd5IERpc2NvdmVyeSBEYXRhIGZvciBSTklEIEVMUy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mc19wb3J0X2dldF9nZW5fdG9wb19kYXRhKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXN0cnVjdCBmY19ybmlkX2dlbmVyYWxfdG9wb2xvZ3lfZGF0YV9zICpnZW5fdG9wb19kYXRhKQoreworCisJYmZhX29zX21lbXNldChnZW5fdG9wb19kYXRhLCAwLAorCQkgICAgICBzaXplb2Yoc3RydWN0IGZjX3JuaWRfZ2VuZXJhbF90b3BvbG9neV9kYXRhX3MpKTsKKworCWdlbl90b3BvX2RhdGEtPmFzc29fdHlwZSA9IGJmYV9vc19odG9ubChSTklEX0FTU09DSUFURURfVFlQRV9IT1NUKTsKKwlnZW5fdG9wb19kYXRhLT5waHlfcG9ydF9udW0gPSAwOwkvKiBAdG9kbyAqLworCWdlbl90b3BvX2RhdGEtPm51bV9hdHRhY2hlZF9ub2RlcyA9IGJmYV9vc19odG9ubCgxKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9vbmxpbmVfYWN0aW9ucyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPmZhYnJpYy0+b3Blcl90eXBlKTsKKworCV9fcG9ydF9hY3Rpb25bcG9ydC0+ZmFicmljLT5mYWJfdHlwZV0uaW5pdChwb3J0KTsKKwlfX3BvcnRfYWN0aW9uW3BvcnQtPmZhYnJpYy0+ZmFiX3R5cGVdLm9ubGluZShwb3J0KTsKKworCWJmYV9mY3NfcG9ydF9hZW5fcG9zdChwb3J0LCBCRkFfTFBPUlRfQUVOX09OTElORSk7CisJYmZhX2ZjYl9wb3J0X29ubGluZShwb3J0LT5mY3MtPmJmYWQsIHBvcnQtPnBvcnRfY2ZnLnJvbGVzLAorCQkJcG9ydC0+ZmFicmljLT52Zl9kcnYsIChwb3J0LT52cG9ydCA9PSBOVUxMKSA/CisJCQlOVUxMIDogcG9ydC0+dnBvcnQtPnZwb3J0X2Rydik7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfb2ZmbGluZV9hY3Rpb25zKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5mYWJyaWMtPm9wZXJfdHlwZSk7CisKKwlfX3BvcnRfYWN0aW9uW3BvcnQtPmZhYnJpYy0+ZmFiX3R5cGVdLm9mZmxpbmUocG9ydCk7CisKKwlpZiAoYmZhX2Zjc19mYWJyaWNfaXNfb25saW5lKHBvcnQtPmZhYnJpYykgPT0gQkZBX1RSVUUpIHsKKwkJYmZhX2Zjc19wb3J0X2Flbl9wb3N0KHBvcnQsIEJGQV9MUE9SVF9BRU5fRElTQ09OTkVDVCk7CisJfSBlbHNlIHsKKwkJYmZhX2Zjc19wb3J0X2Flbl9wb3N0KHBvcnQsIEJGQV9MUE9SVF9BRU5fT0ZGTElORSk7CisJfQorCWJmYV9mY2JfcG9ydF9vZmZsaW5lKHBvcnQtPmZjcy0+YmZhZCwgcG9ydC0+cG9ydF9jZmcucm9sZXMsCisJCQlwb3J0LT5mYWJyaWMtPnZmX2RydiwKKwkJCShwb3J0LT52cG9ydCA9PSBOVUxMKSA/IE5VTEwgOiBwb3J0LT52cG9ydC0+dnBvcnRfZHJ2KTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmcG9ydC0+cnBvcnRfcSkgeworCQlycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopcWU7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZShycG9ydCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X3Vua25vd25faW5pdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJYmZhX2Fzc2VydCgwKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF91bmtub3duX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJYmZhX2Fzc2VydCgwKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF91bmtub3duX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCWJmYV9hc3NlcnQoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfZGVsZXRlZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJYmZhX2Zjc19wb3J0X2Flbl9wb3N0KHBvcnQsIEJGQV9MUE9SVF9BRU5fREVMRVRFKTsKKworCS8qCisJICogQmFzZSBwb3J0IHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgT1MgZHJpdmVyCisJICovCisJaWYgKHBvcnQtPnZwb3J0KSB7CisJCWJmYV9mY2JfcG9ydF9kZWxldGUocG9ydC0+ZmNzLT5iZmFkLCBwb3J0LT5wb3J0X2NmZy5yb2xlcywKKwkJCXBvcnQtPmZhYnJpYy0+dmZfZHJ2LAorCQkJcG9ydC0+dnBvcnQgPyBwb3J0LT52cG9ydC0+dnBvcnRfZHJ2IDogTlVMTCk7CisJCWJmYV9mY3NfdnBvcnRfZGVsZXRlX2NvbXAocG9ydC0+dnBvcnQpOworCX0gZWxzZSB7CisJCWJmYV9mY3NfZmFicmljX3BvcnRfZGVsZXRlX2NvbXAocG9ydC0+ZmFicmljKTsKKwl9Cit9CisKKworCisvKioKKyAqICBmY3NfbHBvcnRfYXBpIEJGQSBGQ1MgcG9ydCBBUEkKKyAqLworLyoqCisgKiAgIE1vZHVsZSBpbml0aWFsaXphdGlvbgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfbW9kaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7CisKK30KKworLyoqCisgKiAgIE1vZHVsZSBjbGVhbnVwCisgKi8KK3ZvaWQKK2JmYV9mY3NfcG9ydF9tb2RleGl0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcykKK3sKKwliZmFfZmNzX21vZGV4aXRfY29tcChmY3MpOworfQorCisvKioKKyAqIAkJVW5zb2xpY2l0ZWQgZnJhbWUgcmVjZWl2ZSBoYW5kbGluZy4KKyAqLwordm9pZAorYmZhX2Zjc19wb3J0X3VmX3JlY3Yoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpscG9ydCwgc3RydWN0IGZjaHNfcyAqZmNocywKKwkJCXUxNiBsZW4pCit7CisJdTMyICAgICAgICBwaWQgPSBmY2hzLT5zX2lkOworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gTlVMTDsKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgKmVsc19jbWQgPSAoc3RydWN0IGZjX2Vsc19jbWRfcyAqKSAoZmNocyArIDEpOworCisJYmZhX3N0YXRzKGxwb3J0LCB1Zl9yZWN2cyk7CisKKwlpZiAoIWJmYV9mY3NfcG9ydF9pc19vbmxpbmUobHBvcnQpKSB7CisJCWJmYV9zdGF0cyhscG9ydCwgdWZfcmVjdl9kcm9wcyk7CisJCXJldHVybjsKKwl9CisKKwkvKioKKwkgKiBGaXJzdCwgaGFuZGxlIEVMU3MgdGhhdCBkb25vdCByZXF1aXJlIGEgbG9naW4uCisJICovCisJLyoKKwkgKiBIYW5kbGUgUExPR0kgZmlyc3QKKwkgKi8KKwlpZiAoKGZjaHMtPnR5cGUgPT0gRkNfVFlQRV9FTFMpICYmCisJCShlbHNfY21kLT5lbHNfY29kZSA9PSBGQ19FTFNfUExPR0kpKSB7CisJCWJmYV9mY3NfcG9ydF9wbG9naShscG9ydCwgZmNocywgKHN0cnVjdCBmY19sb2dpX3MgKikgZWxzX2NtZCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBFQ0hPIHNlcGFyYXRlbHkuCisJICovCisJaWYgKChmY2hzLT50eXBlID09IEZDX1RZUEVfRUxTKSAmJiAoZWxzX2NtZC0+ZWxzX2NvZGUgPT0gRkNfRUxTX0VDSE8pKSB7CisJCWJmYV9mY3NfcG9ydF9lY2hvKGxwb3J0LCBmY2hzLAorCQkJKHN0cnVjdCBmY19lY2hvX3MgKikgZWxzX2NtZCwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSGFuZGxlIFJOSUQgc2VwYXJhdGVseS4KKwkgKi8KKwlpZiAoKGZjaHMtPnR5cGUgPT0gRkNfVFlQRV9FTFMpICYmIChlbHNfY21kLT5lbHNfY29kZSA9PSBGQ19FTFNfUk5JRCkpIHsKKwkJYmZhX2Zjc19wb3J0X3JuaWQobHBvcnQsIGZjaHMsCisJCQkoc3RydWN0IGZjX3JuaWRfY21kX3MgKikgZWxzX2NtZCwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qKgorCSAqIGxvb2sgZm9yIGEgbWF0Y2hpbmcgcmVtb3RlIHBvcnQgSUQKKwkgKi8KKwlycG9ydCA9IGJmYV9mY3NfcG9ydF9nZXRfcnBvcnRfYnlfcGlkKGxwb3J0LCBwaWQpOworCWlmIChycG9ydCkgeworCQliZmFfdHJjKHJwb3J0LT5mY3MsIGZjaHMtPnNfaWQpOworCQliZmFfdHJjKHJwb3J0LT5mY3MsIGZjaHMtPmRfaWQpOworCQliZmFfdHJjKHJwb3J0LT5mY3MsIGZjaHMtPnR5cGUpOworCisJCWJmYV9mY3NfcnBvcnRfdWZfcmVjdihycG9ydCwgZmNocywgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qKgorCSAqIE9ubHkgaGFuZGxlcyBFTFMgZnJhbWVzIGZvciBub3cuCisJICovCisJaWYgKGZjaHMtPnR5cGUgIT0gRkNfVFlQRV9FTFMpIHsKKwkJYmZhX3RyYyhscG9ydC0+ZmNzLCBmY2hzLT50eXBlKTsKKwkJYmZhX2Fzc2VydCgwKTsKKwkJcmV0dXJuOworCX0KKworCWJmYV90cmMobHBvcnQtPmZjcywgZWxzX2NtZC0+ZWxzX2NvZGUpOworCWlmIChlbHNfY21kLT5lbHNfY29kZSA9PSBGQ19FTFNfUlNDTikgeworCQliZmFfZmNzX3BvcnRfc2NuX3Byb2Nlc3NfcnNjbihscG9ydCwgZmNocywgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChlbHNfY21kLT5lbHNfY29kZSA9PSBGQ19FTFNfTE9HTykgeworCQkvKioKKwkJICogQHRvZG8gSGFuZGxlIExPR08gZnJhbWVzIHJlY2VpdmVkLgorCQkgKi8KKwkJYmZhX3RyYyhscG9ydC0+ZmNzLCBlbHNfY21kLT5lbHNfY29kZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZWxzX2NtZC0+ZWxzX2NvZGUgPT0gRkNfRUxTX1BSTEkpIHsKKwkJLyoqCisJCSAqIEB0b2RvIEhhbmRsZSBQUkxJIGZyYW1lcyByZWNlaXZlZC4KKwkJICovCisJCWJmYV90cmMobHBvcnQtPmZjcywgZWxzX2NtZC0+ZWxzX2NvZGUpOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogVW5oYW5kbGVkIEVMUyBmcmFtZXMuIFNlbmQgYSBMU19SSlQuCisJICovCisJYmZhX2Zjc19wb3J0X3NlbmRfbHNfcmp0KGxwb3J0LCBmY2hzLCBGQ19MU19SSlRfUlNOX0NNRF9OT1RfU1VQUCwKKwkJCQkgRkNfTFNfUkpUX0VYUF9OT19BRERMX0lORk8pOworCit9CisKKy8qKgorICogICBQSUQgYmFzZWQgTG9va3VwIGZvciBhIFItUG9ydCBpbiB0aGUgUG9ydCBSLVBvcnQgUXVldWUKKyAqLworc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqCitiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X2J5X3BpZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHUzMiBwaWQpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcWU7CisKKwlsaXN0X2Zvcl9lYWNoKHFlLCAmcG9ydC0+cnBvcnRfcSkgeworCQlycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopcWU7CisJCWlmIChycG9ydC0+cGlkID09IHBpZCkKKwkJCXJldHVybiBycG9ydDsKKwl9CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcGlkKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiAgIFBXV04gYmFzZWQgTG9va3VwIGZvciBhIFItUG9ydCBpbiB0aGUgUG9ydCBSLVBvcnQgUXVldWUKKyAqLworc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqCitiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X2J5X3B3d24oc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LCB3d25fdCBwd3duKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgKnFlOworCisJbGlzdF9mb3JfZWFjaChxZSwgJnBvcnQtPnJwb3J0X3EpIHsKKwkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXFlOworCQlpZiAod3duX2lzX2VxdWFsKHJwb3J0LT5wd3duLCBwd3duKSkKKwkJCXJldHVybiBycG9ydDsKKwl9CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcHd3bik7CisJcmV0dXJuIChOVUxMKTsKK30KKworLyoqCisgKiAgIE5XV04gYmFzZWQgTG9va3VwIGZvciBhIFItUG9ydCBpbiB0aGUgUG9ydCBSLVBvcnQgUXVldWUKKyAqLworc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqCitiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X2J5X253d24oc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LCB3d25fdCBud3duKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgKnFlOworCisJbGlzdF9mb3JfZWFjaChxZSwgJnBvcnQtPnJwb3J0X3EpIHsKKwkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXFlOworCQlpZiAod3duX2lzX2VxdWFsKHJwb3J0LT5ud3duLCBud3duKSkKKwkJCXJldHVybiBycG9ydDsKKwl9CisKKwliZmFfdHJjKHBvcnQtPmZjcywgbnd3bik7CisJcmV0dXJuIChOVUxMKTsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgcnBvcnQgbW9kdWxlIHdoZW4gbmV3IHJwb3J0cyBhcmUgZGlzY292ZXJlZC4KKyAqLwordm9pZAorYmZhX2Zjc19wb3J0X2FkZF9ycG9ydChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCSAgICAgICBzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwlsaXN0X2FkZF90YWlsKCZycG9ydC0+cWUsICZwb3J0LT5ycG9ydF9xKTsKKwlwb3J0LT5udW1fcnBvcnRzKys7Cit9CisKKy8qKgorICogQ2FsbGVkIGJ5IHJwb3J0IG1vZHVsZSB0byB3aGVuIHJwb3J0cyBhcmUgZGVsZXRlZC4KKyAqLwordm9pZAorYmZhX2Zjc19wb3J0X2RlbF9ycG9ydChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCSAgICAgICBzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwliZmFfYXNzZXJ0KGJmYV9xX2lzX29uX3EoJnBvcnQtPnJwb3J0X3EsIHJwb3J0KSk7CisJbGlzdF9kZWwoJnJwb3J0LT5xZSk7CisJcG9ydC0+bnVtX3Jwb3J0cy0tOworCisJYmZhX3NtX3NlbmRfZXZlbnQocG9ydCwgQkZBX0ZDU19QT1JUX1NNX0RFTFJQT1JUKTsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgZmFicmljIGZvciBiYXNlIHBvcnQgd2hlbiBmYWJyaWMgbG9naW4gaXMgY29tcGxldGUuCisgKiBDYWxsZWQgYnkgdnBvcnQgZm9yIHZpcnR1YWwgcG9ydHMgd2hlbiBGRElTQyBpcyBjb21wbGV0ZS4KKyAqLwordm9pZAorYmZhX2Zjc19wb3J0X29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQocG9ydCwgQkZBX0ZDU19QT1JUX1NNX09OTElORSk7Cit9CisKKy8qKgorICogQ2FsbGVkIGJ5IGZhYnJpYyBmb3IgYmFzZSBwb3J0IHdoZW4gZmFicmljIGdvZXMgb2ZmbGluZS4KKyAqIENhbGxlZCBieSB2cG9ydCBmb3IgdmlydHVhbCBwb3J0cyB3aGVuIHZpcnR1YWwgcG9ydCBiZWNvbWVzIG9mZmxpbmUuCisgKi8KK3ZvaWQKK2JmYV9mY3NfcG9ydF9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCkKK3sKKwliZmFfc21fc2VuZF9ldmVudChwb3J0LCBCRkFfRkNTX1BPUlRfU01fT0ZGTElORSk7Cit9CisKKy8qKgorICogQ2FsbGVkIGJ5IGZhYnJpYyB0byBkZWxldGUgYmFzZSBscG9ydCBhbmQgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKgorICogQ2FsbGVkIGJ5IHZwb3J0IHRvIGRlbGV0ZSBscG9ydCBhbmQgYXNzb2NpYXRlZCByZXNvdXJjZXMuIFNob3VsZCBjYWxsCisgKiBiZmFfZmNzX3Zwb3J0X2RlbGV0ZV9jb21wKCkgZm9yIHZwb3J0cyBvbiBjb21wbGV0aW9uLgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfZGVsZXRlKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCkKK3sKKwliZmFfc21fc2VuZF9ldmVudChwb3J0LCBCRkFfRkNTX1BPUlRfU01fREVMRVRFKTsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgZmFicmljIGluIHByaXZhdGUgbG9vcCB0b3BvbG9neSB0byBwcm9jZXNzIExJUCBldmVudC4KKyAqLwordm9pZAorYmZhX2Zjc19wb3J0X2xpcChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7Cit9CisKKy8qKgorICogUmV0dXJuIFRSVUUgaWYgcG9ydCBpcyBvbmxpbmUsIGVsc2UgcmV0dXJuIEZBTFNFCisgKi8KK2JmYV9ib29sZWFuX3QKK2JmYV9mY3NfcG9ydF9pc19vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCXJldHVybiAoYmZhX3NtX2NtcF9zdGF0ZShwb3J0LCBiZmFfZmNzX3BvcnRfc21fb25saW5lKSk7Cit9CisKKy8qKgorICogTG9naWNhbCBwb3J0IGluaXRpYWxpemF0aW9uIG9mIGJhc2Ugb3IgdmlydHVhbCBwb3J0LgorICogQ2FsbGVkIGJ5IGZhYnJpYyBmb3IgYmFzZSBwb3J0IG9yIGJ5IHZwb3J0IGZvciB2aXJ0dWFsIHBvcnRzLgorICovCit2b2lkCitiZmFfZmNzX2xwb3J0X2luaXQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpscG9ydCwgc3RydWN0IGJmYV9mY3NfcyAqZmNzLAorCQkgICB1MTYgdmZfaWQsIHN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcG9ydF9jZmcsCisJCSAgIHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KQoreworCWxwb3J0LT5mY3MgPSBmY3M7CisJbHBvcnQtPmZhYnJpYyA9IGJmYV9mY3NfdmZfbG9va3VwKGZjcywgdmZfaWQpOworCWJmYV9vc19hc3NpZ24obHBvcnQtPnBvcnRfY2ZnLCAqcG9ydF9jZmcpOworCWxwb3J0LT52cG9ydCA9IHZwb3J0OworCWxwb3J0LT5scF90YWcgPSAodnBvcnQpID8gYmZhX2xwc19nZXRfdGFnKHZwb3J0LT5scHMpIDoKKwkJCSBiZmFfbHBzX2dldF90YWcobHBvcnQtPmZhYnJpYy0+bHBzKTsKKworCUlOSVRfTElTVF9IRUFEKCZscG9ydC0+cnBvcnRfcSk7CisJbHBvcnQtPm51bV9ycG9ydHMgPSAwOworCisJbHBvcnQtPmJmYWRfcG9ydCA9CisJCWJmYV9mY2JfcG9ydF9uZXcoZmNzLT5iZmFkLCBscG9ydCwgbHBvcnQtPnBvcnRfY2ZnLnJvbGVzLAorCQkJCWxwb3J0LT5mYWJyaWMtPnZmX2RydiwKKwkJCQl2cG9ydCA/IHZwb3J0LT52cG9ydF9kcnYgOiBOVUxMKTsKKwliZmFfZmNzX3BvcnRfYWVuX3Bvc3QobHBvcnQsIEJGQV9MUE9SVF9BRU5fTkVXKTsKKworCWJmYV9zbV9zZXRfc3RhdGUobHBvcnQsIGJmYV9mY3NfcG9ydF9zbV91bmluaXQpOworCWJmYV9zbV9zZW5kX2V2ZW50KGxwb3J0LCBCRkFfRkNTX1BPUlRfU01fQ1JFQVRFKTsKK30KKworCisKKy8qKgorICogIGZjc19scG9ydF9hcGkKKyAqLworCit2b2lkCitiZmFfZmNzX3BvcnRfZ2V0X2F0dHIoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkgICAgICBzdHJ1Y3QgYmZhX3BvcnRfYXR0cl9zICpwb3J0X2F0dHIpCit7CisJaWYgKGJmYV9zbV9jbXBfc3RhdGUocG9ydCwgYmZhX2Zjc19wb3J0X3NtX29ubGluZSkpCisJCXBvcnRfYXR0ci0+cGlkID0gcG9ydC0+cGlkOworCWVsc2UKKwkJcG9ydF9hdHRyLT5waWQgPSAwOworCisJcG9ydF9hdHRyLT5wb3J0X2NmZyA9IHBvcnQtPnBvcnRfY2ZnOworCisJaWYgKHBvcnQtPmZhYnJpYykgeworCQlwb3J0X2F0dHItPnBvcnRfdHlwZSA9IGJmYV9mY3NfZmFicmljX3BvcnRfdHlwZShwb3J0LT5mYWJyaWMpOworCQlwb3J0X2F0dHItPmxvb3BiYWNrID0gYmZhX2Zjc19mYWJyaWNfaXNfbG9vcGJhY2socG9ydC0+ZmFicmljKTsKKwkJcG9ydF9hdHRyLT5mYWJyaWNfbmFtZSA9IGJmYV9mY3NfcG9ydF9nZXRfZmFicmljX25hbWUocG9ydCk7CisJCW1lbWNweShwb3J0X2F0dHItPmZhYnJpY19pcF9hZGRyLAorCQkgICAgICAgYmZhX2Zjc19wb3J0X2dldF9mYWJyaWNfaXBhZGRyKHBvcnQpLAorCQkgICAgICAgQkZBX0ZDU19GQUJSSUNfSVBBRERSX1NaKTsKKworCQlpZiAocG9ydC0+dnBvcnQgIT0gTlVMTCkKKwkJCXBvcnRfYXR0ci0+cG9ydF90eXBlID0gQkZBX1BQT1JUX1RZUEVfVlBPUlQ7CisKKwl9IGVsc2UgeworCQlwb3J0X2F0dHItPnBvcnRfdHlwZSA9IEJGQV9QUE9SVF9UWVBFX1VOS05PV047CisJCXBvcnRfYXR0ci0+c3RhdGUgPSBCRkFfUE9SVF9VTklOSVQ7CisJfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0YjI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19wb3J0LmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFfZmNzX3Bwb3J0LmMgQkZBIEZDUyBQUE9SVCAoIHBoeXNpY2FsIHBvcnQpCisgKi8KKworI2luY2x1ZGUgPGZjcy9iZmFfZmNzLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX2ZhYnJpYy5oPgorI2luY2x1ZGUgImZjc190cmNtb2QuaCIKKyNpbmNsdWRlICJmY3MuaCIKKyNpbmNsdWRlICJmY3NfZmFicmljLmgiCisjaW5jbHVkZSAiZmNzX3BvcnQuaCIKKworQkZBX1RSQ19GSUxFKEZDUywgUFBPUlQpOworCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wcG9ydF9ldmVudF9oYW5kbGVyKHZvaWQgKmNiYXJnLCBiZmFfcHBvcnRfZXZlbnRfdCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19zICAgICAgKmZjcyA9IGNiYXJnOworCisJYmZhX3RyYyhmY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9QUE9SVF9MSU5LVVA6CisJCWJmYV9mY3NfZmFicmljX2xpbmtfdXAoJmZjcy0+ZmFicmljKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9QUE9SVF9MSU5LRE9XTjoKKwkJYmZhX2Zjc19mYWJyaWNfbGlua19kb3duKCZmY3MtPmZhYnJpYyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUFBPUlRfVFJVTktfTElOS0RPV046CisJCWJmYV9hc3NlcnQoMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3ZvaWQKK2JmYV9mY3NfcHBvcnRfbW9kaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7CisJYmZhX3Bwb3J0X2V2ZW50X3JlZ2lzdGVyKGZjcy0+YmZhLCBiZmFfZmNzX3Bwb3J0X2V2ZW50X2hhbmRsZXIsCisJCQkJICAgICBmY3MpOworfQorCit2b2lkCitiZmFfZmNzX3Bwb3J0X21vZGV4aXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCWJmYV9mY3NfbW9kZXhpdF9jb21wKGZjcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfdWYuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc191Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDFkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfdWYuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFfZmNzX3VmLmMgQkZBIEZDUyBVRiAoIFVuc29saWNpdGVkIEZyYW1lcykKKyAqLworCisjaW5jbHVkZSA8ZmNzL2JmYV9mY3MuaD4KKyNpbmNsdWRlIDxiZmFfc3ZjLmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfZmFicmljLmg+CisjaW5jbHVkZSAiZmNzLmgiCisjaW5jbHVkZSAiZmNzX3RyY21vZC5oIgorI2luY2x1ZGUgImZjc19mYWJyaWMuaCIKKyNpbmNsdWRlICJmY3NfdWYuaCIKKworQkZBX1RSQ19GSUxFKEZDUywgVUYpOworCisvKioKKyAqIAkJQkZBIGNhbGxiYWNrIGZvciB1bnNvbGljaXRlZCBmcmFtZSByZWNlaXZlIGhhbmRsZXIuCisgKgorICogQHBhcmFtW2luXQkJY2JhcmcJCWNhbGxiYWNrIGFyZyBmb3IgcmVjZWl2ZSBoYW5kbGVyCisgKiBAcGFyYW1baW5dCQl1ZgkJdW5zb2xpY2l0ZWQgZnJhbWUgZGVzY3JpcHRvcgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc191Zl9yZWN2KHZvaWQgKmNiYXJnLCBzdHJ1Y3QgYmZhX3VmX3MgKnVmKQoreworCXN0cnVjdCBiZmFfZmNzX3MgICAgICAqZmNzID0gKHN0cnVjdCBiZmFfZmNzX3MgKikgY2Jhcmc7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICpmY2hzID0gYmZhX3VmX2dldF9mcm1idWYodWYpOworCXUxNiAgICAgICAgbGVuID0gYmZhX3VmX2dldF9mcm1sZW4odWYpOworCXN0cnVjdCBmY192ZnRfcyAgICAgICAqdmZ0OworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWM7CisKKwkvKioKKwkgKiBjaGVjayBmb3IgVkZUIGhlYWRlcgorCSAqLworCWlmIChmY2hzLT5yb3V0aW5nID09IEZDX1JUR19FWFRfSERSICYmCisJCWZjaHMtPmNhdF9pbmZvID09IEZDX0NBVF9WRlRfSERSKSB7CisJCWJmYV9zdGF0cyhmY3MsIHVmLnRhZ2dlZCk7CisJCXZmdCA9IGJmYV91Zl9nZXRfZnJtYnVmKHVmKTsKKwkJaWYgKGZjcy0+cG9ydF92ZmlkID09IHZmdC0+dmZfaWQpCisJCQlmYWJyaWMgPSAmZmNzLT5mYWJyaWM7CisJCWVsc2UKKwkJCWZhYnJpYyA9IGJmYV9mY3NfdmZfbG9va3VwKGZjcywgKHUxNikgdmZ0LT52Zl9pZCk7CisKKwkJLyoqCisJCSAqIGRyb3AgZnJhbWUgaWYgdmZpZCBpcyB1bmtub3duCisJCSAqLworCQlpZiAoIWZhYnJpYykgeworCQkJYmZhX2Fzc2VydCgwKTsKKwkJCWJmYV9zdGF0cyhmY3MsIHVmLnZmaWRfdW5rbm93bik7CisJCQliZmFfdWZfZnJlZSh1Zik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKioKKwkJICogc2tpcCB2ZnQgaGVhZGVyCisJCSAqLworCQlmY2hzID0gKHN0cnVjdCBmY2hzX3MgKikgKHZmdCArIDEpOworCQlsZW4gLT0gc2l6ZW9mKHN0cnVjdCBmY192ZnRfcyk7CisKKwkJYmZhX3RyYyhmY3MsIHZmdC0+dmZfaWQpOworCX0gZWxzZSB7CisJCWJmYV9zdGF0cyhmY3MsIHVmLnVudGFnZ2VkKTsKKwkJZmFicmljID0gJmZjcy0+ZmFicmljOworCX0KKworCWJmYV90cmMoZmNzLCAoKHUzMiAqKSBmY2hzKVswXSk7CisJYmZhX3RyYyhmY3MsICgodTMyICopIGZjaHMpWzFdKTsKKwliZmFfdHJjKGZjcywgKCh1MzIgKikgZmNocylbMl0pOworCWJmYV90cmMoZmNzLCAoKHUzMiAqKSBmY2hzKVszXSk7CisJYmZhX3RyYyhmY3MsICgodTMyICopIGZjaHMpWzRdKTsKKwliZmFfdHJjKGZjcywgKCh1MzIgKikgZmNocylbNV0pOworCWJmYV90cmMoZmNzLCBsZW4pOworCisJYmZhX2Zjc19mYWJyaWNfdWZfcmVjdihmYWJyaWMsIGZjaHMsIGxlbik7CisJYmZhX3VmX2ZyZWUodWYpOworfQorCit2b2lkCitiZmFfZmNzX3VmX21vZGluaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCWJmYV91Zl9yZWN2X3JlZ2lzdGVyKGZjcy0+YmZhLCBiZmFfZmNzX3VmX3JlY3YsIGZjcyk7Cit9CisKK3ZvaWQKK2JmYV9mY3NfdWZfbW9kZXhpdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7CisJYmZhX2Zjc19tb2RleGl0X2NvbXAoZmNzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjeHAuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjeHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzU0YTBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmN4cC5jCkBAIC0wLDAgKzEsNzgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxiZmEuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX3VmLmg+CisjaW5jbHVkZSA8Y3MvYmZhX2RlYnVnLmg+CisKK0JGQV9UUkNfRklMRShIQUwsIEZDWFApOworQkZBX01PRFVMRShmY3hwKTsKKworLyoqCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgdm9pZCAgICAgX19iZmFfZmN4cF9zZW5kX2NiZm4odm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOworc3RhdGljIHZvaWQgICAgIGhhbF9mY3hwX3J4X3Bsb2coc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCSBzdHJ1Y3QgYmZpX2ZjeHBfc2VuZF9yc3BfcyAqZmN4cF9yc3ApOworc3RhdGljIHZvaWQgICAgIGhhbF9mY3hwX3R4X3Bsb2coc3RydWN0IGJmYV9zICpiZmEsIHUzMiByZXFsZW4sCisJCQkJIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLCBzdHJ1Y3QgZmNoc19zICpmY2hzKTsKK3N0YXRpYyB2b2lkCWJmYV9mY3hwX3FyZXN1bWUodm9pZCAqY2JhcmcpOworc3RhdGljIHZvaWQJYmZhX2ZjeHBfcXVldWUoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkgICAgICAgc3RydWN0IGJmaV9mY3hwX3NlbmRfcmVxX3MgKnNlbmRfcmVxKTsKKworLyoqCisgKiAgZmN4cF9wdnQgQkZBIEZDWFAgcHJpdmF0ZSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZAorY2xhaW1fZmN4cF9yZXFfcnNwX21lbShzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MgKm1vZCwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pKQoreworCXU4ICAgICAgICAqZG1fa3ZhID0gTlVMTDsKKwl1NjQgICAgICAgIGRtX3BhOworCXUzMiAgICAgICAgYnVmX3Bvb2xfc3o7CisKKwlkbV9rdmEgPSBiZmFfbWVtaW5mb19kbWFfdmlydChtaSk7CisJZG1fcGEgPSBiZmFfbWVtaW5mb19kbWFfcGh5cyhtaSk7CisKKwlidWZfcG9vbF9zeiA9IG1vZC0+cmVxX3BsZF9zeiAqIG1vZC0+bnVtX2ZjeHBzOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBmY3hwIHJlcSBwYXlsb2FkIGxpc3QKKwkgKi8KKwltb2QtPnJlcV9wbGRfbGlzdF9rdmEgPSBkbV9rdmE7CisJbW9kLT5yZXFfcGxkX2xpc3RfcGEgPSBkbV9wYTsKKwlkbV9rdmEgKz0gYnVmX3Bvb2xfc3o7CisJZG1fcGEgKz0gYnVmX3Bvb2xfc3o7CisJYmZhX29zX21lbXNldChtb2QtPnJlcV9wbGRfbGlzdF9rdmEsIDAsIGJ1Zl9wb29sX3N6KTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZmN4cCByc3AgcGF5bG9hZCBsaXN0CisJICovCisJYnVmX3Bvb2xfc3ogPSBtb2QtPnJzcF9wbGRfc3ogKiBtb2QtPm51bV9mY3hwczsKKwltb2QtPnJzcF9wbGRfbGlzdF9rdmEgPSBkbV9rdmE7CisJbW9kLT5yc3BfcGxkX2xpc3RfcGEgPSBkbV9wYTsKKwlkbV9rdmEgKz0gYnVmX3Bvb2xfc3o7CisJZG1fcGEgKz0gYnVmX3Bvb2xfc3o7CisJYmZhX29zX21lbXNldChtb2QtPnJzcF9wbGRfbGlzdF9rdmEsIDAsIGJ1Zl9wb29sX3N6KTsKKworCWJmYV9tZW1pbmZvX2RtYV92aXJ0KG1pKSA9IGRtX2t2YTsKKwliZmFfbWVtaW5mb19kbWFfcGh5cyhtaSkgPSBkbV9wYTsKK30KKworc3RhdGljIHZvaWQKK2NsYWltX2ZjeHBzX21lbShzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MgKm1vZCwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pKQoreworCXUxNiAgICAgICAgaTsKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKworCWZjeHAgPSAoc3RydWN0IGJmYV9mY3hwX3MgKikgYmZhX21lbWluZm9fa3ZhKG1pKTsKKwliZmFfb3NfbWVtc2V0KGZjeHAsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX2ZjeHBfcykgKiBtb2QtPm51bV9mY3hwcyk7CisKKwlJTklUX0xJU1RfSEVBRCgmbW9kLT5mY3hwX2ZyZWVfcSk7CisJSU5JVF9MSVNUX0hFQUQoJm1vZC0+ZmN4cF9hY3RpdmVfcSk7CisKKwltb2QtPmZjeHBfbGlzdCA9IGZjeHA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kLT5udW1fZmN4cHM7IGkrKykgeworCQlmY3hwLT5mY3hwX21vZCA9IG1vZDsKKwkJZmN4cC0+ZmN4cF90YWcgPSBpOworCisJCWxpc3RfYWRkX3RhaWwoJmZjeHAtPnFlLCAmbW9kLT5mY3hwX2ZyZWVfcSk7CisJCWJmYV9yZXFxX3dpbml0KCZmY3hwLT5yZXFxX3dxZSwgYmZhX2ZjeHBfcXJlc3VtZSwgZmN4cCk7CisJCWZjeHAtPnJlcXFfd2FpdGluZyA9IEJGQV9GQUxTRTsKKworCQlmY3hwID0gZmN4cCArIDE7CisJfQorCisJYmZhX21lbWluZm9fa3ZhKG1pKSA9ICh2b2lkICopZmN4cDsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3hwX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKm5kbV9sZW4sCisJCXUzMiAqZG1fbGVuKQoreworCXUxNiAgICAgICAgbnVtX2ZjeHBfcmVxcyA9IGNmZy0+ZndjZmcubnVtX2ZjeHBfcmVxczsKKworCWlmIChudW1fZmN4cF9yZXFzID09IDApCisJCXJldHVybjsKKworCS8qCisJICogQWNjb3VudCBmb3IgcmVxL3JzcCBwYXlsb2FkCisJICovCisJKmRtX2xlbiArPSBCRkFfRkNYUF9NQVhfSUJVRl9TWiAqIG51bV9mY3hwX3JlcXM7CisJaWYgKGNmZy0+ZHJ2Y2ZnLm1pbl9jZmcpCisJCSpkbV9sZW4gKz0gQkZBX0ZDWFBfTUFYX0lCVUZfU1ogKiBudW1fZmN4cF9yZXFzOworCWVsc2UKKwkJKmRtX2xlbiArPSBCRkFfRkNYUF9NQVhfTEJVRl9TWiAqIG51bV9mY3hwX3JlcXM7CisKKwkvKgorCSAqIEFjY291bnQgZm9yIGZjeHAgc3RydWN0cworCSAqLworCSpuZG1fbGVuICs9IHNpemVvZihzdHJ1Y3QgYmZhX2ZjeHBfcykgKiBudW1fZmN4cF9yZXFzOworfQorCitzdGF0aWMgdm9pZAorYmZhX2ZjeHBfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCSAgICBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywgc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQoreworCXN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqbW9kID0gQkZBX0ZDWFBfTU9EKGJmYSk7CisKKwliZmFfb3NfbWVtc2V0KG1vZCwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfZmN4cF9tb2RfcykpOworCW1vZC0+YmZhID0gYmZhOworCW1vZC0+bnVtX2ZjeHBzID0gY2ZnLT5md2NmZy5udW1fZmN4cF9yZXFzOworCisJLyoqCisJICogSW5pdGlhbGl6ZSBGQ1hQIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHBheWxvYWQgc2l6ZXMuCisJICovCisJbW9kLT5yZXFfcGxkX3N6ID0gbW9kLT5yc3BfcGxkX3N6ID0gQkZBX0ZDWFBfTUFYX0lCVUZfU1o7CisJaWYgKCFjZmctPmRydmNmZy5taW5fY2ZnKQorCQltb2QtPnJzcF9wbGRfc3ogPSBCRkFfRkNYUF9NQVhfTEJVRl9TWjsKKworCUlOSVRfTElTVF9IRUFEKCZtb2QtPndhaXRfcSk7CisKKwljbGFpbV9mY3hwX3JlcV9yc3BfbWVtKG1vZCwgbWVtaW5mbyk7CisJY2xhaW1fZmN4cHNfbWVtKG1vZCwgbWVtaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmN4cF9pbml0ZG9uZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3hwX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3hwX3N0YXJ0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX2ZjeHBfc3RvcChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3hwX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9mY3hwX21vZF9zICptb2QgPSBCRkFfRkNYUF9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqcWUsICpxZW47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJm1vZC0+ZmN4cF9hY3RpdmVfcSkgeworCQlmY3hwID0gKHN0cnVjdCBiZmFfZmN4cF9zICopIHFlOworCQlpZiAoZmN4cC0+Y2FsbGVyID09IE5VTEwpIHsKKwkJCWZjeHAtPnNlbmRfY2JmbihmY3hwLT5jYWxsZXIsIGZjeHAsIGZjeHAtPnNlbmRfY2JhcmcsCisJCQkJCUJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUsIDAsIDAsIE5VTEwpOworCQkJYmZhX2ZjeHBfZnJlZShmY3hwKTsKKwkJfSBlbHNlIHsKKwkJCWZjeHAtPnJzcF9zdGF0dXMgPSBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCQkJYmZhX2NiX3F1ZXVlKGJmYSwgJmZjeHAtPmhjYl9xZSwKKwkJCQkgICAgICBfX2JmYV9mY3hwX3NlbmRfY2JmbiwgZmN4cCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmZhX2ZjeHBfcyAqCitiZmFfZmN4cF9nZXQoc3RydWN0IGJmYV9mY3hwX21vZF9zICpmbSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKworCWJmYV9xX2RlcSgmZm0tPmZjeHBfZnJlZV9xLCAmZmN4cCk7CisKKwlpZiAoZmN4cCkKKwkJbGlzdF9hZGRfdGFpbCgmZmN4cC0+cWUsICZmbS0+ZmN4cF9hY3RpdmVfcSk7CisKKwlyZXR1cm4gKGZjeHApOworfQorCitzdGF0aWMgdm9pZAorYmZhX2ZjeHBfcHV0KHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwKQoreworCXN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqbW9kID0gZmN4cC0+ZmN4cF9tb2Q7CisJc3RydWN0IGJmYV9mY3hwX3dxZV9zICp3cWU7CisKKwliZmFfcV9kZXEoJm1vZC0+d2FpdF9xLCAmd3FlKTsKKwlpZiAod3FlKSB7CisJCWJmYV90cmMobW9kLT5iZmEsIGZjeHAtPmZjeHBfdGFnKTsKKwkJd3FlLT5hbGxvY19jYmZuKHdxZS0+YWxsb2NfY2JhcmcsIGZjeHApOworCQlyZXR1cm47CisJfQorCisJYmZhX2Fzc2VydChiZmFfcV9pc19vbl9xKCZtb2QtPmZjeHBfYWN0aXZlX3EsIGZjeHApKTsKKwlsaXN0X2RlbCgmZmN4cC0+cWUpOworCWxpc3RfYWRkX3RhaWwoJmZjeHAtPnFlLCAmbW9kLT5mY3hwX2ZyZWVfcSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmN4cF9udWxsX2NvbXAodm9pZCAqYmZhZF9mY3hwLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwgdm9pZCAqY2JhcmcsCisJCSAgICAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywgdTMyIHJzcF9sZW4sCisJCSAgICAgICB1MzIgcmVzaWRfbGVuLCBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwkvKipkaXNjYXJkZWQgZmN4cCBjb21wbGV0aW9uICovCit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9mY3hwX3NlbmRfY2Jmbih2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCA9IGNiYXJnOworCisJaWYgKGNvbXBsZXRlKSB7CisJCWZjeHAtPnNlbmRfY2JmbihmY3hwLT5jYWxsZXIsIGZjeHAsIGZjeHAtPnNlbmRfY2JhcmcsCisJCQkJZmN4cC0+cnNwX3N0YXR1cywgZmN4cC0+cnNwX2xlbiwKKwkJCQlmY3hwLT5yZXNpZHVlX2xlbiwgJmZjeHAtPnJzcF9mY2hzKTsKKwl9IGVsc2UgeworCQliZmFfZmN4cF9mcmVlKGZjeHApOworCX0KK30KKworc3RhdGljIHZvaWQKK2hhbF9mY3hwX3NlbmRfY29tcChzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9mY3hwX3NlbmRfcnNwX3MgKmZjeHBfcnNwKQoreworCXN0cnVjdCBiZmFfZmN4cF9tb2RfcwkqbW9kID0gQkZBX0ZDWFBfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9mY3hwX3MgCSpmY3hwOworCXUxNgkJZmN4cF90YWcgPSBiZmFfb3NfbnRvaHMoZmN4cF9yc3AtPmZjeHBfdGFnKTsKKworCWJmYV90cmMoYmZhLCBmY3hwX3RhZyk7CisKKwlmY3hwX3JzcC0+cnNwX2xlbiA9IGJmYV9vc19udG9obChmY3hwX3JzcC0+cnNwX2xlbik7CisKKwkvKioKKwkgKiBAdG9kbyBmL3cgc2hvdWxkIG5vdCBzZXQgcmVzaWR1ZSB0byBub24tMCB3aGVuIGV2ZXJ5dGhpbmcKKwkgKiAgICAgICBpcyByZWNlaXZlZC4KKwkgKi8KKwlpZiAoZmN4cF9yc3AtPnJlcV9zdGF0dXMgPT0gQkZBX1NUQVRVU19PSykKKwkJZmN4cF9yc3AtPnJlc2lkdWVfbGVuID0gMDsKKwllbHNlCisJCWZjeHBfcnNwLT5yZXNpZHVlX2xlbiA9IGJmYV9vc19udG9obChmY3hwX3JzcC0+cmVzaWR1ZV9sZW4pOworCisJZmN4cCA9IEJGQV9GQ1hQX0ZST01fVEFHKG1vZCwgZmN4cF90YWcpOworCisJYmZhX2Fzc2VydChmY3hwLT5zZW5kX2NiZm4gIT0gTlVMTCk7CisKKwloYWxfZmN4cF9yeF9wbG9nKG1vZC0+YmZhLCBmY3hwLCBmY3hwX3JzcCk7CisKKwlpZiAoZmN4cC0+c2VuZF9jYmZuICE9IE5VTEwpIHsKKwkJaWYgKGZjeHAtPmNhbGxlciA9PSBOVUxMKSB7CisJCQliZmFfdHJjKG1vZC0+YmZhLCBmY3hwLT5mY3hwX3RhZyk7CisKKwkJCWZjeHAtPnNlbmRfY2JmbihmY3hwLT5jYWxsZXIsIGZjeHAsIGZjeHAtPnNlbmRfY2JhcmcsCisJCQkJCWZjeHBfcnNwLT5yZXFfc3RhdHVzLCBmY3hwX3JzcC0+cnNwX2xlbiwKKwkJCQkJZmN4cF9yc3AtPnJlc2lkdWVfbGVuLCAmZmN4cF9yc3AtPmZjaHMpOworCQkJLyoKKwkJCSAqIGZjeHAgYXV0b21hdGljYWxseSBmcmVlZCBvbiByZXR1cm4gZnJvbSB0aGUgY2FsbGJhY2sKKwkJCSAqLworCQkJYmZhX2ZjeHBfZnJlZShmY3hwKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV90cmMobW9kLT5iZmEsIGZjeHAtPmZjeHBfdGFnKTsKKwkJCWZjeHAtPnJzcF9zdGF0dXMgPSBmY3hwX3JzcC0+cmVxX3N0YXR1czsKKwkJCWZjeHAtPnJzcF9sZW4gPSBmY3hwX3JzcC0+cnNwX2xlbjsKKwkJCWZjeHAtPnJlc2lkdWVfbGVuID0gZmN4cF9yc3AtPnJlc2lkdWVfbGVuOworCQkJZmN4cC0+cnNwX2ZjaHMgPSBmY3hwX3JzcC0+ZmNoczsKKworCQkJYmZhX2NiX3F1ZXVlKGJmYSwgJmZjeHAtPmhjYl9xZSwKKwkJCQkgICAgICBfX2JmYV9mY3hwX3NlbmRfY2JmbiwgZmN4cCk7CisJCX0KKwl9IGVsc2UgeworCQliZmFfdHJjKGJmYSwgZmN4cF90YWcpOworCX0KK30KKworc3RhdGljIHZvaWQKK2hhbF9mY3hwX3NldF9sb2NhbF9zZ2VzKHN0cnVjdCBiZmlfc2dlX3MgKnNnZSwgdTMyIHJlcWxlbiwgdTY0IHJlcV9wYSkKK3sKKwl1bmlvbiBiZmlfYWRkcl91ICAgICAgc2dhX3plcm8gPSB7IHswfSB9OworCisJc2dlLT5zZ19sZW4gPSByZXFsZW47CisJc2dlLT5mbGFncyA9IEJGSV9TR0VfREFUQV9MQVNUOworCWJmYV9kbWFfYWRkcl9zZXQoc2dlWzBdLnNnYSwgcmVxX3BhKTsKKwliZmFfc2dlX3RvX2JlKHNnZSk7CisJc2dlKys7CisKKwlzZ2UtPnNnYSA9IHNnYV96ZXJvOworCXNnZS0+c2dfbGVuID0gcmVxbGVuOworCXNnZS0+ZmxhZ3MgPSBCRklfU0dFX1BHRExFTjsKKwliZmFfc2dlX3RvX2JlKHNnZSk7Cit9CisKK3N0YXRpYyB2b2lkCitoYWxfZmN4cF90eF9wbG9nKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgcmVxbGVuLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJIHN0cnVjdCBmY2hzX3MgKmZjaHMpCit7CisJLyoKKwkgKiBUT0RPOiBUWCBveF9pZAorCSAqLworCWlmIChyZXFsZW4gPiAwKSB7CisJCWlmIChmY3hwLT51c2VfaXJlcWJ1ZikgeworCQkJdTMyICAgICAgICBwbGRfdzAgPQorCQkJCSooKHUzMiAqKSBCRkFfRkNYUF9SRVFfUExEKGZjeHApKTsKKworCQkJYmZhX3Bsb2dfZmNoZHJfYW5kX3BsKGJmYS0+cGxvZywgQkZBX1BMX01JRF9IQUxfRkNYUCwKKwkJCQlCRkFfUExfRUlEX1RYLAorCQkJCXJlcWxlbiArIHNpemVvZihzdHJ1Y3QgZmNoc19zKSwgZmNocywgcGxkX3cwKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9wbG9nX2ZjaGRyKGJmYS0+cGxvZywgQkZBX1BMX01JRF9IQUxfRkNYUCwKKwkJCQlCRkFfUExfRUlEX1RYLCByZXFsZW4gKyBzaXplb2Yoc3RydWN0IGZjaHNfcyksCisJCQkJZmNocyk7CisJCX0KKwl9IGVsc2UgeworCQliZmFfcGxvZ19mY2hkcihiZmEtPnBsb2csIEJGQV9QTF9NSURfSEFMX0ZDWFAsIEJGQV9QTF9FSURfVFgsCisJCQkgICAgICAgcmVxbGVuICsgc2l6ZW9mKHN0cnVjdCBmY2hzX3MpLCBmY2hzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitoYWxfZmN4cF9yeF9wbG9nKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJIHN0cnVjdCBiZmlfZmN4cF9zZW5kX3JzcF9zICpmY3hwX3JzcCkKK3sKKwlpZiAoZmN4cF9yc3AtPnJzcF9sZW4gPiAwKSB7CisJCWlmIChmY3hwLT51c2VfaXJzcGJ1ZikgeworCQkJdTMyICAgICAgICBwbGRfdzAgPQorCQkJCSooKHUzMiAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApKTsKKworCQkJYmZhX3Bsb2dfZmNoZHJfYW5kX3BsKGJmYS0+cGxvZywgQkZBX1BMX01JRF9IQUxfRkNYUCwKKwkJCQkJICAgICAgQkZBX1BMX0VJRF9SWCwKKwkJCQkJICAgICAgKHUxNikgZmN4cF9yc3AtPnJzcF9sZW4sCisJCQkJCSAgICAgICZmY3hwX3JzcC0+ZmNocywgcGxkX3cwKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9wbG9nX2ZjaGRyKGJmYS0+cGxvZywgQkZBX1BMX01JRF9IQUxfRkNYUCwKKwkJCQkgICAgICAgQkZBX1BMX0VJRF9SWCwKKwkJCQkgICAgICAgKHUxNikgZmN4cF9yc3AtPnJzcF9sZW4sCisJCQkJICAgICAgICZmY3hwX3JzcC0+ZmNocyk7CisJCX0KKwl9IGVsc2UgeworCQliZmFfcGxvZ19mY2hkcihiZmEtPnBsb2csIEJGQV9QTF9NSURfSEFMX0ZDWFAsIEJGQV9QTF9FSURfUlgsCisJCQkgICAgICAgKHUxNikgZmN4cF9yc3AtPnJzcF9sZW4sICZmY3hwX3JzcC0+ZmNocyk7CisJfQorfQorCisvKioKKyAqIEhhbmRsZXIgdG8gcmVzdW1lIHNlbmRpbmcgZmN4cCB3aGVuIHNwYWNlIGluIGF2YWlsYWJsZSBpbiBjcGUgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmN4cF9xcmVzdW1lKHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfZmN4cF9zCQkqZmN4cCA9IGNiYXJnOworCXN0cnVjdCBiZmFfcwkJCSpiZmEgPSBmY3hwLT5mY3hwX21vZC0+YmZhOworCXN0cnVjdCBiZmlfZmN4cF9zZW5kX3JlcV9zCSpzZW5kX3JlcTsKKworCWZjeHAtPnJlcXFfd2FpdGluZyA9IEJGQV9GQUxTRTsKKwlzZW5kX3JlcSA9IGJmYV9yZXFxX25leHQoYmZhLCBCRkFfUkVRUV9GQ1hQKTsKKwliZmFfZmN4cF9xdWV1ZShmY3hwLCBzZW5kX3JlcSk7Cit9CisKKy8qKgorICogUXVldWUgZmN4cCBzZW5kIHJlcXVlc3QgdG8gZm9pbXJ3YXJlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2ZjeHBfcXVldWUoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsIHN0cnVjdCBiZmlfZmN4cF9zZW5kX3JlcV9zICpzZW5kX3JlcSkKK3sKKwlzdHJ1Y3QgYmZhX3MgICAgICAJCSpiZmEgPSBmY3hwLT5mY3hwX21vZC0+YmZhOworCXN0cnVjdCBiZmFfZmN4cF9yZXFfaW5mb19zCSpyZXFpID0gJmZjeHAtPnJlcV9pbmZvOworCXN0cnVjdCBiZmFfZmN4cF9yc3BfaW5mb19zCSpyc3BpID0gJmZjeHAtPnJzcF9pbmZvOworCXN0cnVjdCBiZmFfcnBvcnRfcwkJKnJwb3J0ID0gcmVxaS0+YmZhX3Jwb3J0OworCisJYmZpX2gyaV9zZXQoc2VuZF9yZXEtPm1oLCBCRklfTUNfRkNYUCwgQkZJX0ZDWFBfSDJJX1NFTkRfUkVRLAorCQkJYmZhX2xwdWlkKGJmYSkpOworCisJc2VuZF9yZXEtPmZjeHBfdGFnID0gYmZhX29zX2h0b25zKGZjeHAtPmZjeHBfdGFnKTsKKwlpZiAocnBvcnQpIHsKKwkJc2VuZF9yZXEtPnJwb3J0X2Z3X2huZGwgPSBycG9ydC0+ZndfaGFuZGxlOworCQlzZW5kX3JlcS0+bWF4X2ZybXN6ID0gYmZhX29zX2h0b25zKHJwb3J0LT5ycG9ydF9pbmZvLm1heF9mcm1zeik7CisJCWlmIChzZW5kX3JlcS0+bWF4X2ZybXN6ID09IDApCisJCQlzZW5kX3JlcS0+bWF4X2ZybXN6ID0gYmZhX29zX2h0b25zKEZDX01BWF9QRFVTWik7CisJfSBlbHNlIHsKKwkJc2VuZF9yZXEtPnJwb3J0X2Z3X2huZGwgPSAwOworCQlzZW5kX3JlcS0+bWF4X2ZybXN6ID0gYmZhX29zX2h0b25zKEZDX01BWF9QRFVTWik7CisJfQorCisJc2VuZF9yZXEtPnZmX2lkID0gYmZhX29zX2h0b25zKHJlcWktPnZmX2lkKTsKKwlzZW5kX3JlcS0+bHBfdGFnID0gcmVxaS0+bHBfdGFnOworCXNlbmRfcmVxLT5jbGFzcyA9IHJlcWktPmNsYXNzOworCXNlbmRfcmVxLT5yc3BfdGltZW91dCA9IHJzcGktPnJzcF90aW1lb3V0OworCXNlbmRfcmVxLT5jdHMgPSByZXFpLT5jdHM7CisJc2VuZF9yZXEtPmZjaHMgPSByZXFpLT5mY2hzOworCisJc2VuZF9yZXEtPnJlcV9sZW4gPSBiZmFfb3NfaHRvbmwocmVxaS0+cmVxX3RvdF9sZW4pOworCXNlbmRfcmVxLT5yc3BfbWF4bGVuID0gYmZhX29zX2h0b25sKHJzcGktPnJzcF9tYXhsZW4pOworCisJLyoKKwkgKiBzZXR1cCByZXEgc2dsZXMKKwkgKi8KKwlpZiAoZmN4cC0+dXNlX2lyZXFidWYgPT0gMSkgeworCQloYWxfZmN4cF9zZXRfbG9jYWxfc2dlcyhzZW5kX3JlcS0+cmVxX3NnZSwgcmVxaS0+cmVxX3RvdF9sZW4sCisJCQkJCUJGQV9GQ1hQX1JFUV9QTERfUEEoZmN4cCkpOworCX0gZWxzZSB7CisJCWlmIChmY3hwLT5ucmVxX3NnbGVzID4gMCkgeworCQkJYmZhX2Fzc2VydChmY3hwLT5ucmVxX3NnbGVzID09IDEpOworCQkJaGFsX2ZjeHBfc2V0X2xvY2FsX3NnZXMoc2VuZF9yZXEtPnJlcV9zZ2UsCisJCQkJCQlyZXFpLT5yZXFfdG90X2xlbiwKKwkJCQkJCWZjeHAtPnJlcV9zZ2FfY2JmbihmY3hwLT5jYWxsZXIsCisJCQkJCQkJCSAgIDApKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9hc3NlcnQocmVxaS0+cmVxX3RvdF9sZW4gPT0gMCk7CisJCQloYWxfZmN4cF9zZXRfbG9jYWxfc2dlcyhzZW5kX3JlcS0+cnNwX3NnZSwgMCwgMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIHNldHVwIHJzcCBzZ2xlcworCSAqLworCWlmIChmY3hwLT51c2VfaXJzcGJ1ZiA9PSAxKSB7CisJCWJmYV9hc3NlcnQocnNwaS0+cnNwX21heGxlbiA8PSBCRkFfRkNYUF9NQVhfTEJVRl9TWik7CisKKwkJaGFsX2ZjeHBfc2V0X2xvY2FsX3NnZXMoc2VuZF9yZXEtPnJzcF9zZ2UsIHJzcGktPnJzcF9tYXhsZW4sCisJCQkJCUJGQV9GQ1hQX1JTUF9QTERfUEEoZmN4cCkpOworCisJfSBlbHNlIHsKKwkJaWYgKGZjeHAtPm5yc3Bfc2dsZXMgPiAwKSB7CisJCQliZmFfYXNzZXJ0KGZjeHAtPm5yc3Bfc2dsZXMgPT0gMSk7CisJCQloYWxfZmN4cF9zZXRfbG9jYWxfc2dlcyhzZW5kX3JlcS0+cnNwX3NnZSwKKwkJCQkJCXJzcGktPnJzcF9tYXhsZW4sCisJCQkJCQlmY3hwLT5yc3Bfc2dhX2NiZm4oZmN4cC0+Y2FsbGVyLAorCQkJCQkJCQkgICAwKSk7CisJCX0gZWxzZSB7CisJCQliZmFfYXNzZXJ0KHJzcGktPnJzcF9tYXhsZW4gPT0gMCk7CisJCQloYWxfZmN4cF9zZXRfbG9jYWxfc2dlcyhzZW5kX3JlcS0+cnNwX3NnZSwgMCwgMCk7CisJCX0KKwl9CisKKwloYWxfZmN4cF90eF9wbG9nKGJmYSwgcmVxaS0+cmVxX3RvdF9sZW4sIGZjeHAsICZyZXFpLT5mY2hzKTsKKworCWJmYV9yZXFxX3Byb2R1Y2UoYmZhLCBCRkFfUkVRUV9GQ1hQKTsKKworCWJmYV90cmMoYmZhLCBiZmFfcmVxcV9waShiZmEsIEJGQV9SRVFRX0ZDWFApKTsKKwliZmFfdHJjKGJmYSwgYmZhX3JlcXFfY2koYmZhLCBCRkFfUkVRUV9GQ1hQKSk7Cit9CisKKworLyoqCisgKiAgaGFsX2ZjeHBfYXBpIEJGQSBGQ1hQIEFQSQorICovCisKKy8qKgorICogQWxsb2NhdGUgYW4gRkNYUCBpbnN0YW5jZSB0byBzZW5kIGEgcmVzcG9uc2Ugb3IgdG8gc2VuZCBhIHJlcXVlc3QKKyAqIHRoYXQgaGFzIGEgcmVzcG9uc2UuIFJlcXVlc3QvcmVzcG9uc2UgYnVmZmVycyBhcmUgYWxsb2NhdGVkIGJ5IGNhbGxlci4KKyAqCisgKiBAcGFyYW1baW5dCWJmYQkJQkZBIGJmYSBpbnN0YW5jZQorICogQHBhcmFtW2luXQlucmVxX3NnbGVzCU51bWJlciBvZiBTRyBlbGVtZW50cyByZXF1aXJlZCBmb3IgcmVxdWVzdAorICogCQkJCWJ1ZmZlci4gMCwgaWYgZmN4cCBpbnRlcm5hbCBidWZmZXJzIGFyZQl1c2VkLgorICogCQkJCVVzZSBiZmFfZmN4cF9nZXRfcmVxYnVmKCkgdG8gZ2V0IHRoZQorICogCQkJCWludGVybmFsIHJlcSBidWZmZXIuCisgKiBAcGFyYW1baW5dCXJlcV9zZ2xlcwlTRyBlbGVtZW50cyBkZXNjcmliaW5nIHJlcXVlc3QgYnVmZmVyLiBXaWxsIGJlCisgKiAJCQkJY29waWVkIGluIGJ5IEJGQSBhbmQgaGVuY2UgY2FuIGJlIGZyZWVkIG9uCisgKiAJCQkJcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAqIEBwYXJhbVtpbl0JZ2V0X3JlcV9zZ2EJZnVuY3Rpb24gcHRyIHRvIGJlIGNhbGxlZCB0byBnZXQgYSByZXF1ZXN0IFNHCisgKiAJCQkJQWRkcmVzcyAoZ2l2ZW4gdGhlIHNnZSBpbmRleCkuCisgKiBAcGFyYW1baW5dCWdldF9yZXFfc2dsZW4JZnVuY3Rpb24gcHRyIHRvIGJlIGNhbGxlZCB0byBnZXQgYSByZXF1ZXN0IFNHCisgKiAJCQkJbGVuIChnaXZlbiB0aGUgc2dlIGluZGV4KS4KKyAqIEBwYXJhbVtpbl0JZ2V0X3JzcF9zZ2EJZnVuY3Rpb24gcHRyIHRvIGJlIGNhbGxlZCB0byBnZXQgYSByZXNwb25zZSBTRworICogCQkJCUFkZHJlc3MgKGdpdmVuIHRoZSBzZ2UgaW5kZXgpLgorICogQHBhcmFtW2luXQlnZXRfcnNwX3NnbGVuCWZ1bmN0aW9uIHB0ciB0byBiZSBjYWxsZWQgdG8gZ2V0IGEgcmVzcG9uc2UgU0cKKyAqIAkJCQlsZW4gKGdpdmVuIHRoZSBzZ2UgaW5kZXgpLgorICoKKyAqIEByZXR1cm4gRkNYUCBpbnN0YW5jZS4gTlVMTCBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3QgYmZhX2ZjeHBfcyAqCitiZmFfZmN4cF9hbGxvYyh2b2lkICpjYWxsZXIsIHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnJlcV9zZ2xlcywKKwkJCWludCBucnNwX3NnbGVzLCBiZmFfZmN4cF9nZXRfc2dhZGRyX3QgcmVxX3NnYV9jYmZuLAorCQkJYmZhX2ZjeHBfZ2V0X3NnbGVuX3QgcmVxX3NnbGVuX2NiZm4sCisJCQliZmFfZmN4cF9nZXRfc2dhZGRyX3QgcnNwX3NnYV9jYmZuLAorCQkJYmZhX2ZjeHBfZ2V0X3NnbGVuX3QgcnNwX3NnbGVuX2NiZm4pCit7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAgPSBOVUxMOworCXUzMiAgICAgICAgbnJlcV9zZ3BnLCBucnNwX3NncGc7CisKKwliZmFfYXNzZXJ0KGJmYSAhPSBOVUxMKTsKKworCWZjeHAgPSBiZmFfZmN4cF9nZXQoQkZBX0ZDWFBfTU9EKGJmYSkpOworCWlmIChmY3hwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwliZmFfdHJjKGJmYSwgZmN4cC0+ZmN4cF90YWcpOworCisJZmN4cC0+Y2FsbGVyID0gY2FsbGVyOworCisJaWYgKG5yZXFfc2dsZXMgPT0gMCkgeworCQlmY3hwLT51c2VfaXJlcWJ1ZiA9IDE7CisJfSBlbHNlIHsKKwkJYmZhX2Fzc2VydChyZXFfc2dhX2NiZm4gIT0gTlVMTCk7CisJCWJmYV9hc3NlcnQocmVxX3NnbGVuX2NiZm4gIT0gTlVMTCk7CisKKwkJZmN4cC0+dXNlX2lyZXFidWYgPSAwOworCQlmY3hwLT5yZXFfc2dhX2NiZm4gPSByZXFfc2dhX2NiZm47CisJCWZjeHAtPnJlcV9zZ2xlbl9jYmZuID0gcmVxX3NnbGVuX2NiZm47CisKKwkJZmN4cC0+bnJlcV9zZ2xlcyA9IG5yZXFfc2dsZXM7CisKKwkJLyoKKwkJICogYWxsb2MgcmVxdWlyZWQgc2dwZ3MKKwkJICovCisJCWlmIChucmVxX3NnbGVzID4gQkZJX1NHRV9JTkxJTkUpIHsKKwkJCW5yZXFfc2dwZyA9IEJGQV9TR1BHX05QQUdFKG5yZXFfc2dsZXMpOworCisJCQlpZiAoYmZhX3NncGdfbWFsbG9jCisJCQkgICAgKGJmYSwgJmZjeHAtPnJlcV9zZ3BnX3EsIG5yZXFfc2dwZykKKwkJCSAgICAhPSBCRkFfU1RBVFVTX09LKSB7CisJCQkJLyogYmZhX3NncGdfd2FpdChiZmEsICZmY3hwLT5yZXFfc2dwZ193cWUsCisJCQkJbnJlcV9zZ3BnKTsgKi8KKwkJCQkvKgorCQkJCSAqIFRPRE8KKwkJCQkgKi8KKwkJCX0KKwkJfQorCX0KKworCWlmIChucnNwX3NnbGVzID09IDApIHsKKwkJZmN4cC0+dXNlX2lyc3BidWYgPSAxOworCX0gZWxzZSB7CisJCWJmYV9hc3NlcnQocnNwX3NnYV9jYmZuICE9IE5VTEwpOworCQliZmFfYXNzZXJ0KHJzcF9zZ2xlbl9jYmZuICE9IE5VTEwpOworCisJCWZjeHAtPnVzZV9pcnNwYnVmID0gMDsKKwkJZmN4cC0+cnNwX3NnYV9jYmZuID0gcnNwX3NnYV9jYmZuOworCQlmY3hwLT5yc3Bfc2dsZW5fY2JmbiA9IHJzcF9zZ2xlbl9jYmZuOworCisJCWZjeHAtPm5yc3Bfc2dsZXMgPSBucnNwX3NnbGVzOworCQkvKgorCQkgKiBhbGxvYyByZXF1aXJlZCBzZ3BncworCQkgKi8KKwkJaWYgKG5yc3Bfc2dsZXMgPiBCRklfU0dFX0lOTElORSkgeworCQkJbnJzcF9zZ3BnID0gQkZBX1NHUEdfTlBBR0UobnJlcV9zZ2xlcyk7CisKKwkJCWlmIChiZmFfc2dwZ19tYWxsb2MKKwkJCSAgICAoYmZhLCAmZmN4cC0+cnNwX3NncGdfcSwgbnJzcF9zZ3BnKQorCQkJICAgICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJCQkvKiBiZmFfc2dwZ193YWl0KGJmYSwgJmZjeHAtPnJzcF9zZ3BnX3dxZSwKKwkJCQlucnNwX3NncGcpOyAqLworCQkJCS8qCisJCQkJICogVE9ETworCQkJCSAqLworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIChmY3hwKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGludGVybmFsIHJlcXVlc3QgYnVmZmVyIHBvaW50ZXIKKyAqCisgKiBAcGFyYW1baW5dCWZjeHAJQkZBIGZjeHAgcG9pbnRlcgorICoKKyAqIEByZXR1cm4gCQlwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCByZXF1ZXN0IGJ1ZmZlcgorICovCit2b2lkICoKK2JmYV9mY3hwX2dldF9yZXFidWYoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApCit7CisJc3RydWN0IGJmYV9mY3hwX21vZF9zICptb2QgPSBmY3hwLT5mY3hwX21vZDsKKwl2b2lkCSpyZXFidWY7CisKKwliZmFfYXNzZXJ0KGZjeHAtPnVzZV9pcmVxYnVmID09IDEpOworCXJlcWJ1ZiA9ICgodTggKiltb2QtPnJlcV9wbGRfbGlzdF9rdmEpICsKKwkJCWZjeHAtPmZjeHBfdGFnICogbW9kLT5yZXFfcGxkX3N6OworCXJldHVybiByZXFidWY7Cit9CisKK3UzMgorYmZhX2ZjeHBfZ2V0X3JlcWJ1ZnN6KHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwKQoreworCXN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqbW9kID0gZmN4cC0+ZmN4cF9tb2Q7CisKKwlyZXR1cm4gbW9kLT5yZXFfcGxkX3N6OworfQorCisvKioKKyAqIEdldCB0aGUgaW50ZXJuYWwgcmVzcG9uc2UgYnVmZmVyIHBvaW50ZXIKKyAqCisgKiBAcGFyYW1baW5dCWZjeHAJQkZBIGZjeHAgcG9pbnRlcgorICoKKyAqIEByZXR1cm4JCXBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlcXVlc3QgYnVmZmVyCisgKi8KK3ZvaWQgKgorYmZhX2ZjeHBfZ2V0X3JzcGJ1ZihzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCkKK3sKKwlzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MgKm1vZCA9IGZjeHAtPmZjeHBfbW9kOworCXZvaWQJKnJzcGJ1ZjsKKworCWJmYV9hc3NlcnQoZmN4cC0+dXNlX2lyc3BidWYgPT0gMSk7CisKKwlyc3BidWYgPSAoKHU4ICopbW9kLT5yc3BfcGxkX2xpc3Rfa3ZhKSArCisJCQlmY3hwLT5mY3hwX3RhZyAqIG1vZC0+cnNwX3BsZF9zejsKKwlyZXR1cm4gcnNwYnVmOworfQorCisvKioKKyAqIAkJRnJlZSB0aGUgQkZBIEZDWFAKKyAqCisgKiBAcGFyYW1baW5dCWZjeHAJCQlCRkEgZmN4cCBwb2ludGVyCisgKgorICogQHJldHVybiAJCXZvaWQKKyAqLwordm9pZAorYmZhX2ZjeHBfZnJlZShzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCkKK3sKKwlzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MgKm1vZCA9IGZjeHAtPmZjeHBfbW9kOworCisJYmZhX2Fzc2VydChmY3hwICE9IE5VTEwpOworCWJmYV90cmMobW9kLT5iZmEsIGZjeHAtPmZjeHBfdGFnKTsKKwliZmFfZmN4cF9wdXQoZmN4cCk7Cit9CisKKy8qKgorICogU2VuZCBhIEZDWFAgcmVxdWVzdAorICoKKyAqIEBwYXJhbVtpbl0JZmN4cAlCRkEgZmN4cCBwb2ludGVyCisgKiBAcGFyYW1baW5dCXJwb3J0CUJGQSBycG9ydCBwb2ludGVyLiBDb3VsZCBiZSBsZWZ0IE5VTEwgZm9yIFdLQSBycG9ydHMKKyAqIEBwYXJhbVtpbl0JdmZfaWQJdmlydHVhbCBGYWJyaWMgSUQKKyAqIEBwYXJhbVtpbl0JbHBfdGFnICBscG9ydCB0YWcKKyAqIEBwYXJhbVtpbl0JY3RzCXVzZSBDb250aW5vdXMgc2VxdWVuY2UKKyAqIEBwYXJhbVtpbl0JY29zCWZjIENsYXNzIG9mIFNlcnZpY2UKKyAqIEBwYXJhbVtpbl0JcmVxbGVuCXJlcXVlc3QgbGVuZ3RoLCBkb2VzIG5vdCBpbmNsdWRlIEZDSFMgbGVuZ3RoCisgKiBAcGFyYW1baW5dCWZjaHMJZmMgSGVhZGVyIFBvaW50ZXIuIFRoZSBoZWFkZXIgY29udGVudCB3aWxsIGJlIGNvcGllZAorICoJCQlpbiBieSBCRkEuCisgKgorICogQHBhcmFtW2luXQljYmZuCWNhbGwgYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gcmVjZWl2aW5nCisgKiAJCQkJCQkJCXRoZSByZXNwb25zZQorICogQHBhcmFtW2luXQljYmFyZwlhcmcgZm9yIGNiZm4KKyAqIEBwYXJhbVtpbl0JcnNwX3RpbWVvdXQKKyAqCQkJcmVzcG9uc2UgdGltZW91dAorICoKKyAqIEByZXR1cm4JCWJmYV9zdGF0dXNfdAorICovCit2b2lkCitiZmFfZmN4cF9zZW5kKHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLCBzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0LAorCQl1MTYgdmZfaWQsIHU4IGxwX3RhZywgYmZhX2Jvb2xlYW5fdCBjdHMsIGVudW0gZmNfY29zIGNvcywKKwkJdTMyIHJlcWxlbiwgc3RydWN0IGZjaHNfcyAqZmNocywgYmZhX2NiX2ZjeHBfc2VuZF90IGNiZm4sCisJCXZvaWQgKmNiYXJnLCB1MzIgcnNwX21heGxlbiwgdTggcnNwX3RpbWVvdXQpCit7CisJc3RydWN0IGJmYV9zCQkJKmJmYSAgPSBmY3hwLT5mY3hwX21vZC0+YmZhOworCXN0cnVjdCBiZmFfZmN4cF9yZXFfaW5mb19zCSpyZXFpID0gJmZjeHAtPnJlcV9pbmZvOworCXN0cnVjdCBiZmFfZmN4cF9yc3BfaW5mb19zCSpyc3BpID0gJmZjeHAtPnJzcF9pbmZvOworCXN0cnVjdCBiZmlfZmN4cF9zZW5kX3JlcV9zCSpzZW5kX3JlcTsKKworCWJmYV90cmMoYmZhLCBmY3hwLT5mY3hwX3RhZyk7CisKKwkvKioKKwkgKiBzZXR1cCByZXF1ZXN0L3Jlc3BvbnNlIGluZm8KKwkgKi8KKwlyZXFpLT5iZmFfcnBvcnQgPSBycG9ydDsKKwlyZXFpLT52Zl9pZCA9IHZmX2lkOworCXJlcWktPmxwX3RhZyA9IGxwX3RhZzsKKwlyZXFpLT5jbGFzcyA9IGNvczsKKwlyc3BpLT5yc3BfdGltZW91dCA9IHJzcF90aW1lb3V0OworCXJlcWktPmN0cyA9IGN0czsKKwlyZXFpLT5mY2hzID0gKmZjaHM7CisJcmVxaS0+cmVxX3RvdF9sZW4gPSByZXFsZW47CisJcnNwaS0+cnNwX21heGxlbiA9IHJzcF9tYXhsZW47CisJZmN4cC0+c2VuZF9jYmZuID0gY2JmbiA/IGNiZm4gOiBiZmFfZmN4cF9udWxsX2NvbXA7CisJZmN4cC0+c2VuZF9jYmFyZyA9IGNiYXJnOworCisJLyoqCisJICogSWYgbm8gcm9vbSBpbiBDUEUgcXVldWUsIHdhaXQgZm9yCisJICovCisJc2VuZF9yZXEgPSBiZmFfcmVxcV9uZXh0KGJmYSwgQkZBX1JFUVFfRkNYUCk7CisJaWYgKCFzZW5kX3JlcSkgeworCQliZmFfdHJjKGJmYSwgZmN4cC0+ZmN4cF90YWcpOworCQlmY3hwLT5yZXFxX3dhaXRpbmcgPSBCRkFfVFJVRTsKKwkJYmZhX3JlcXFfd2FpdChiZmEsIEJGQV9SRVFRX0ZDWFAsICZmY3hwLT5yZXFxX3dxZSk7CisJCXJldHVybjsKKwl9CisKKwliZmFfZmN4cF9xdWV1ZShmY3hwLCBzZW5kX3JlcSk7Cit9CisKKy8qKgorICogQWJvcnQgYSBCRkEgRkNYUAorICoKKyAqIEBwYXJhbVtpbl0JZmN4cAlCRkEgZmN4cCBwb2ludGVyCisgKgorICogQHJldHVybiAJCXZvaWQKKyAqLworYmZhX3N0YXR1c190CitiZmFfZmN4cF9hYm9ydChzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCkKK3sKKwliZmFfYXNzZXJ0KDApOworCXJldHVybiAoQkZBX1NUQVRVU19PSyk7Cit9CisKK3ZvaWQKK2JmYV9mY3hwX2FsbG9jX3dhaXQoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfZmN4cF93cWVfcyAqd3FlLAorCQkJYmZhX2ZjeHBfYWxsb2NfY2Jmbl90IGFsbG9jX2NiZm4sIHZvaWQgKmFsbG9jX2NiYXJnKQoreworCXN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqbW9kID0gQkZBX0ZDWFBfTU9EKGJmYSk7CisKKwliZmFfYXNzZXJ0KGxpc3RfZW1wdHkoJm1vZC0+ZmN4cF9mcmVlX3EpKTsKKworCXdxZS0+YWxsb2NfY2JmbiA9IGFsbG9jX2NiZm47CisJd3FlLT5hbGxvY19jYmFyZyA9IGFsbG9jX2NiYXJnOworCWxpc3RfYWRkX3RhaWwoJndxZS0+cWUsICZtb2QtPndhaXRfcSk7Cit9CisKK3ZvaWQKK2JmYV9mY3hwX3dhbGxvY19jYW5jZWwoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfZmN4cF93cWVfcyAqd3FlKQoreworCXN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqbW9kID0gQkZBX0ZDWFBfTU9EKGJmYSk7CisKKwliZmFfYXNzZXJ0KGJmYV9xX2lzX29uX3EoJm1vZC0+d2FpdF9xLCB3cWUpKTsKKwlsaXN0X2RlbCgmd3FlLT5xZSk7Cit9CisKK3ZvaWQKK2JmYV9mY3hwX2Rpc2NhcmQoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApCit7CisJLyoqCisJICogSWYgd2FpdGluZyBmb3Igcm9vbSBpbiByZXF1ZXN0IHF1ZXVlLCBjYW5jZWwgcmVxcSB3YWl0CisJICogYW5kIGZyZWUgZmN4cC4KKwkgKi8KKwlpZiAoZmN4cC0+cmVxcV93YWl0aW5nKSB7CisJCWZjeHAtPnJlcXFfd2FpdGluZyA9IEJGQV9GQUxTRTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmZmN4cC0+cmVxcV93cWUpOworCQliZmFfZmN4cF9mcmVlKGZjeHApOworCQlyZXR1cm47CisJfQorCisJZmN4cC0+c2VuZF9jYmZuID0gYmZhX2ZjeHBfbnVsbF9jb21wOworfQorCisKKworLyoqCisgKiAgaGFsX2ZjeHBfcHVibGljIEJGQSBGQ1hQIHB1YmxpYyBmdW5jdGlvbnMKKyAqLworCit2b2lkCitiZmFfZmN4cF9pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm1zZykKK3sKKwlzd2l0Y2ggKG1zZy0+bWhkci5tc2dfaWQpIHsKKwljYXNlIEJGSV9GQ1hQX0kySF9TRU5EX1JTUDoKKwkJaGFsX2ZjeHBfc2VuZF9jb21wKGJmYSwgKHN0cnVjdCBiZmlfZmN4cF9zZW5kX3JzcF9zICopIG1zZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3RyYyhiZmEsIG1zZy0+bWhkci5tc2dfaWQpOworCQliZmFfYXNzZXJ0KDApOworCX0KK30KKwordTMyCitiZmFfZmN4cF9nZXRfbWF4cnNwKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqbW9kID0gQkZBX0ZDWFBfTU9EKGJmYSk7CisKKwlyZXR1cm4gbW9kLT5yc3BfcGxkX3N6OworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjeHBfcHJpdi5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmN4cF9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkYTQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjeHBfcHJpdi5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfRkNYUF9QUklWX0hfXworI2RlZmluZSBfX0JGQV9GQ1hQX1BSSVZfSF9fCisKKyNpbmNsdWRlIDxjcy9iZmFfc20uaD4KKyNpbmNsdWRlIDxwcm90b2NvbC9mYy5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX2ZjeHAuaD4KKworI2RlZmluZSBCRkFfRkNYUF9NSU4gICAgIAkoMSkKKyNkZWZpbmUgQkZBX0ZDWFBfTUFYX0lCVUZfU1oJKDIgKiAxMDI0ICsgMjU2KQorI2RlZmluZSBCRkFfRkNYUF9NQVhfTEJVRl9TWgkoNCAqIDEwMjQgKyAyNTYpCisKK3N0cnVjdCBiZmFfZmN4cF9tb2RfcyB7CisJc3RydWN0IGJmYV9zICAgICAgKmJmYTsJCS8qICBiYWNrcG9pbnRlciB0byBCRkEgKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9saXN0OwkvKiAgYXJyYXkgb2YgRkNYUHMgKi8KKwl1MTYgICAgICAgIG51bV9mY3hwczsJLyogIG1heCBudW0gRkNYUCByZXF1ZXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZmN4cF9mcmVlX3E7CS8qICBmcmVlIEZDWFBzICovCisJc3RydWN0IGxpc3RfaGVhZCBmY3hwX2FjdGl2ZV9xOwkvKiAgYWN0aXZlIEZDWFBzICovCisJdm9pZAkqcmVxX3BsZF9saXN0X2t2YTsJLyogIGxpc3Qgb2YgRkNYUCByZXEgcGxkICovCisJdTY0IHJlcV9wbGRfbGlzdF9wYTsJLyogIGxpc3Qgb2YgRkNYUCByZXEgcGxkICovCisJdm9pZCAqcnNwX3BsZF9saXN0X2t2YTsJCS8qICBsaXN0IG9mIEZDWFAgcmVzcCBwbGQgKi8KKwl1NjQgcnNwX3BsZF9saXN0X3BhOwkvKiAgbGlzdCBvZiBGQ1hQIHJlc3AgcGxkICovCisJc3RydWN0IGxpc3RfaGVhZCAgd2FpdF9xOwkJLyogIHdhaXQgcXVldWUgZm9yIGZyZWUgZmN4cCAqLworCXUzMglyZXFfcGxkX3N6OworCXUzMglyc3BfcGxkX3N6OworfTsKKworI2RlZmluZSBCRkFfRkNYUF9NT0QoX19iZmEpCQkoJihfX2JmYSktPm1vZHVsZXMuZmN4cF9tb2QpCisjZGVmaW5lIEJGQV9GQ1hQX0ZST01fVEFHKF9fbW9kLCBfX3RhZykJKCYoX19tb2QpLT5mY3hwX2xpc3RbX190YWddKQorCit0eXBlZGVmIHZvaWQgICAgKCpmY3hwX3NlbmRfY2JfdCkgKHN0cnVjdCBiZmFfcyAqaW9jLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQkgICB2b2lkICpjYl9hcmcsIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCSAgIHUzMiByc3BfbGVuLCB1MzIgcmVzaWRfbGVuLAorCQkJCSAgIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGEgRkNYUCByZXF1ZXN0CisgKi8KK3N0cnVjdCBiZmFfZmN4cF9yZXFfaW5mb19zIHsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKmJmYV9ycG9ydDsJLyogIFBvaW50ZXIgdG8gdGhlIGJmYSBycG9ydCB0aGF0IHdhcworCQkJCQkgKnJldHVybmVkIGZyb20gYmZhX3Jwb3J0X2NyZWF0ZSgpLgorCQkJCQkgKlRoaXMgY291bGQgYmUgbGVmdCBOVUxMIGZvciBXS0Egb3IgZm9yCisJCQkJCSAqRkNYUCBpbnRlcmFjdGlvbnMgYmVmb3JlIHRoZSBycG9ydAorCQkJCQkgKm5leHVzIGlzIGVzdGFibGlzaGVkCisJCQkJCSAqLworCXN0cnVjdCBmY2hzX3MgICBmY2hzOwkvKiAgcmVxdWVzdCBGQyBoZWFkZXIgc3RydWN0dXJlICovCisJdTggY3RzOwkJLyogIGNvbnRpbm91cyBzZXF1ZW5jZSAqLworCXU4IGNsYXNzOwkJLyogIEZDIGNsYXNzIGZvciB0aGUgcmVxdWVzdC9yZXNwb25zZSAqLworCXUxNiBtYXhfZnJtc3o7CS8qICBtYXggc2VuZCBmcmFtZSBzaXplICovCisJdTE2IHZmX2lkOwkJLyogIHZzYW4gdGFnIGlmIGFwcGxpY2FibGUgKi8KKwl1OAlscF90YWc7CQkvKiAgbHBvcnQgdGFnICovCisJdTMyIHJlcV90b3RfbGVuOwkvKiAgcmVxdWVzdCBwYXlsb2FkIHRvdGFsIGxlbmd0aCAqLworfTsKKworc3RydWN0IGJmYV9mY3hwX3JzcF9pbmZvX3MgeworCXN0cnVjdCBmY2hzX3MgcnNwX2ZjaHM7CQkvKiAgUmVzcG9uc2UgZnJhbWUncyBGQyBoZWFkZXIgd2lsbAorCQkJCQkgKiBiZSAqc2VudCBiYWNrIGluIHRoaXMgZmllbGQgKi8KKwl1OCAgICAgICAgIHJzcF90aW1lb3V0OwkvKiAgdGltZW91dCBpbiBzZWNvbmRzLCAwLW5vIHJlc3BvbnNlCisJCQkJCSAqLworCXU4ICAgICAgICAgcnN2ZDJbM107CisJdTMyICAgICAgICByc3BfbWF4bGVuOwkvKiAgbWF4IHJlc3BvbnNlIGxlbmd0aCBleHBlY3RlZCAqLworfTsKKworc3RydWN0IGJmYV9mY3hwX3MgeworCXN0cnVjdCBsaXN0X2hlYWQgCXFlOwkJLyogIGZjeHAgcXVldWUgZWxlbWVudCAqLworCWJmYV9zbV90ICAgICAgICBzbTsgICAgICAgICAgICAgLyogIHN0YXRlIG1hY2hpbmUgKi8KKwl2b2lkICAgICAgICAgICAJKmNhbGxlcjsJLyogIGRyaXZlciBvciBmY3MgKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MgKmZjeHBfbW9kOworCQkJCQkvKiAgYmFjayBwb2ludGVyIHRvIGZjeHAgbW9kICovCisJdTE2ICAgICAgICBmY3hwX3RhZzsJLyogIGludGVybmFsIHRhZyAqLworCXN0cnVjdCBiZmFfZmN4cF9yZXFfaW5mb19zIHJlcV9pbmZvOworCQkJCQkvKiAgcmVxdWVzdCBpbmZvICovCisJc3RydWN0IGJmYV9mY3hwX3JzcF9pbmZvX3MgcnNwX2luZm87CisJCQkJCS8qICByZXNwb25zZSBpbmZvICovCisJdTggCXVzZV9pcmVxYnVmOwkvKiAgdXNlIGludGVybmFsIHJlcSBidWYgKi8KKwl1OCAgICAgICAgIHVzZV9pcnNwYnVmOwkvKiAgdXNlIGludGVybmFsIHJzcCBidWYgKi8KKwl1MzIgICAgICAgIG5yZXFfc2dsZXM7CS8qICBudW0gcmVxdWVzdCBTR0xFcyAqLworCXUzMiAgICAgICAgbnJzcF9zZ2xlczsJLyogIG51bSByZXNwb25zZSBTR0xFcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgcmVxX3NncGdfcTsJLyogIFNHIHBhZ2VzIGZvciByZXF1ZXN0IGJ1ZiAqLworCXN0cnVjdCBsaXN0X2hlYWQgcmVxX3NncGdfd3FlOwkvKiAgd2FpdCBxdWV1ZSBmb3IgcmVxIFNHIHBhZ2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJzcF9zZ3BnX3E7CS8qICBTRyBwYWdlcyBmb3IgcmVzcG9uc2UgYnVmICovCisJc3RydWN0IGxpc3RfaGVhZCByc3Bfc2dwZ193cWU7CS8qICB3YWl0IHF1ZXVlIGZvciByc3AgU0cgcGFnZSAqLworCisJYmZhX2ZjeHBfZ2V0X3NnYWRkcl90IHJlcV9zZ2FfY2JmbjsKKwkJCQkJLyogIFNHIGVsZW0gYWRkciB1c2VyIGZ1bmN0aW9uICovCisJYmZhX2ZjeHBfZ2V0X3NnbGVuX3QgcmVxX3NnbGVuX2NiZm47CisJCQkJCS8qICBTRyBlbGVtIGxlbiB1c2VyIGZ1bmN0aW9uICovCisJYmZhX2ZjeHBfZ2V0X3NnYWRkcl90IHJzcF9zZ2FfY2JmbjsKKwkJCQkJLyogIFNHIGVsZW0gYWRkciB1c2VyIGZ1bmN0aW9uICovCisJYmZhX2ZjeHBfZ2V0X3NnbGVuX3QgcnNwX3NnbGVuX2NiZm47CisJCQkJCS8qICBTRyBlbGVtIGxlbiB1c2VyIGZ1bmN0aW9uICovCisJYmZhX2NiX2ZjeHBfc2VuZF90IHNlbmRfY2JmbjsgICAvKiAgc2VuZCBjb21wbGV0aW9uIGNhbGxiYWNrICovCisJdm9pZAkJKnNlbmRfY2Jhcmc7CS8qICBjYWxsYmFjayBhcmcgKi8KKwlzdHJ1Y3QgYmZhX3NnZV9zICAgcmVxX3NnZVtCRkFfRkNYUF9NQVhfU0dFU107CisJCQkJCS8qICByZXEgU0cgZWxlbXMgKi8KKwlzdHJ1Y3QgYmZhX3NnZV9zICAgcnNwX3NnZVtCRkFfRkNYUF9NQVhfU0dFU107CisJCQkJCS8qICByc3AgU0cgZWxlbXMgKi8KKwl1OCAgICAgICAgIHJzcF9zdGF0dXM7CS8qICBjb21wOiByc3Agc3RhdHVzICovCisJdTMyICAgICAgICByc3BfbGVuOwkvKiAgY29tcDogYWN0dWFsIHJlc3BvbnNlIGxlbiAqLworCXUzMiAgICAgICAgcmVzaWR1ZV9sZW47CS8qICBjb21wOiByZXNpZHVhbCByc3AgbGVuZ3RoICovCisJc3RydWN0IGZjaHNfcyAgICAgICAgICByc3BfZmNoczsJLyogIGNvbXA6IHJlc3BvbnNlIGZjaHMgKi8KKwlzdHJ1Y3QgYmZhX2NiX3FlX3MgICAgaGNiX3FlOwkvKiAgY29tcDogY2FsbGJhY2sgcWVsZW0gKi8KKwlzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zCXJlcXFfd3FlOworCWJmYV9ib29sZWFuX3QJcmVxcV93YWl0aW5nOworfTsKKworI2RlZmluZSBCRkFfRkNYUF9SRVFfUExEKF9mY3hwKSAJKGJmYV9mY3hwX2dldF9yZXFidWYoX2ZjeHApKQorCisjZGVmaW5lIEJGQV9GQ1hQX1JTUF9GQ0hTKF9mY3hwKSAJKCYoKF9mY3hwKS0+cnNwX2luZm8uZmNocykpCisjZGVmaW5lIEJGQV9GQ1hQX1JTUF9QTEQoX2ZjeHApIAkoYmZhX2ZjeHBfZ2V0X3JzcGJ1ZihfZmN4cCkpCisKKyNkZWZpbmUgQkZBX0ZDWFBfUkVRX1BMRF9QQShfZmN4cCkJCQkJCVwKKwkoKF9mY3hwKS0+ZmN4cF9tb2QtPnJlcV9wbGRfbGlzdF9wYSArCQkJCVwKKwkJKChfZmN4cCktPmZjeHBfbW9kLT5yZXFfcGxkX3N6ICAqIChfZmN4cCktPmZjeHBfdGFnKSkKKworI2RlZmluZSBCRkFfRkNYUF9SU1BfUExEX1BBKF9mY3hwKSAJCQkJCVwKKwkoKF9mY3hwKS0+ZmN4cF9tb2QtPnJzcF9wbGRfbGlzdF9wYSArCQkJCVwKKwkJKChfZmN4cCktPmZjeHBfbW9kLT5yc3BfcGxkX3N6ICogKF9mY3hwKS0+ZmN4cF90YWcpKQorCit2b2lkCWJmYV9mY3hwX2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbXNnKTsKKyNlbmRpZiAvKiBfX0JGQV9GQ1hQX1BSSVZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9md2ltZ19wcml2LmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9md2ltZ19wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMTM1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Z3aW1nX3ByaXYuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfRldJTUdfUFJJVl9IX18KKyNkZWZpbmUgX19CRkFfRldJTUdfUFJJVl9IX18KKworI2RlZmluZQlCRklfRkxBU0hfQ0hVTktfU1oJCTI1NgkvKiAgRmxhc2ggY2h1bmsgc2l6ZSAqLworI2RlZmluZQlCRklfRkxBU0hfQ0hVTktfU1pfV09SRFMJKEJGSV9GTEFTSF9DSFVOS19TWi9zaXplb2YodTMyKSkKKworZXh0ZXJuIHUzMiAqYmZpX2ltYWdlX2N0X2dldF9jaHVuayh1MzIgb2ZmKTsKK2V4dGVybiB1MzIgYmZpX2ltYWdlX2N0X3NpemU7CitleHRlcm4gdTMyICpiZmlfaW1hZ2VfY2JfZ2V0X2NodW5rKHUzMiBvZmYpOworZXh0ZXJuIHUzMiBiZmlfaW1hZ2VfY2Jfc2l6ZTsKK2V4dGVybiB1MzIgKmJmaV9pbWFnZV9jYjsKK2V4dGVybiB1MzIgKmJmaV9pbWFnZV9jdDsKKworI2VuZGlmIC8qIF9fQkZBX0ZXSU1HX1BSSVZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jYi5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUxNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YmZhX3ByaXYuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX2NicmVnLmg+CisKK3ZvaWQKK2JmYV9od2NiX3JlZ2luaXQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9pb2NmY19yZWdzX3MJKmJmYV9yZWdzID0gJmJmYS0+aW9jZmMuYmZhX3JlZ3M7CisJYmZhX29zX2FkZHJfdAkJa3ZhID0gYmZhX2lvY19iYXIwKCZiZmEtPmlvYyk7CisJaW50ICAgICAgICAgICAgIAlpLCBxLCBmbiA9IGJmYV9pb2NfcGNpZm4oJmJmYS0+aW9jKTsKKworCWlmIChmbiA9PSAwKSB7CisJCWJmYV9yZWdzLT5pbnRyX3N0YXR1cyA9IChrdmEgKyBIT1NURk4wX0lOVF9TVEFUVVMpOworCQliZmFfcmVncy0+aW50cl9tYXNrICAgPSAoa3ZhICsgSE9TVEZOMF9JTlRfTVNLKTsKKwl9IGVsc2UgeworCQliZmFfcmVncy0+aW50cl9zdGF0dXMgPSAoa3ZhICsgSE9TVEZOMV9JTlRfU1RBVFVTKTsKKwkJYmZhX3JlZ3MtPmludHJfbWFzayAgID0gKGt2YSArIEhPU1RGTjFfSU5UX01TSyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJGSV9JT0NfTUFYX0NRUzsgaSsrKSB7CisJCS8qCisJCSAqIENQRSByZWdpc3RlcnMKKwkJICovCisJCXEgPSBDUEVfUV9OVU0oZm4sIGkpOworCQliZmFfcmVncy0+Y3BlX3FfcGlbaV0gPSAoa3ZhICsgQ1BFX1FfUEkocSkpOworCQliZmFfcmVncy0+Y3BlX3FfY2lbaV0gPSAoa3ZhICsgQ1BFX1FfQ0kocSkpOworCQliZmFfcmVncy0+Y3BlX3FfZGVwdGhbaV0gPSAoa3ZhICsgQ1BFX1FfREVQVEgocSkpOworCisJCS8qCisJCSAqIFJNRSByZWdpc3RlcnMKKwkJICovCisJCXEgPSBDUEVfUV9OVU0oZm4sIGkpOworCQliZmFfcmVncy0+cm1lX3FfcGlbaV0gPSAoa3ZhICsgUk1FX1FfUEkocSkpOworCQliZmFfcmVncy0+cm1lX3FfY2lbaV0gPSAoa3ZhICsgUk1FX1FfQ0kocSkpOworCQliZmFfcmVncy0+cm1lX3FfZGVwdGhbaV0gPSAoa3ZhICsgUk1FX1FfREVQVEgocSkpOworCX0KK30KKwordm9pZAorYmZhX2h3Y2JfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX2h3Y2JfcnNwcV9hY2tfbXNpeChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpCit7CisJYmZhX3JlZ193cml0ZShiZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzLAorCQlfX0hGTl9JTlRfUk1FX1EwIDw8IFJNRV9RX05VTShiZmFfaW9jX3BjaWZuKCZiZmEtPmlvYyksIHJzcHEpKTsKK30KKwordm9pZAorYmZhX2h3Y2JfbXNpeF9nZXR2ZWNzKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgKm1zaXhfdmVjc19ibWFwLAorCQkgdTMyICpudW1fdmVjcywgdTMyICptYXhfdmVjX2JpdCkKK3sKKyNkZWZpbmUgX19IRk5fTlVNSU5UUwkxMworCWlmIChiZmFfaW9jX3BjaWZuKCZiZmEtPmlvYykgPT0gMCkgeworCQkqbXNpeF92ZWNzX2JtYXAgPSAoX19IRk5fSU5UX0NQRV9RMCB8IF9fSEZOX0lOVF9DUEVfUTEgfAorCQkJCSAgIF9fSEZOX0lOVF9DUEVfUTIgfCBfX0hGTl9JTlRfQ1BFX1EzIHwKKwkJCQkgICBfX0hGTl9JTlRfUk1FX1EwIHwgX19IRk5fSU5UX1JNRV9RMSB8CisJCQkJICAgX19IRk5fSU5UX1JNRV9RMiB8IF9fSEZOX0lOVF9STUVfUTMgfAorCQkJCSAgIF9fSEZOX0lOVF9NQk9YX0xQVTApOworCQkqbWF4X3ZlY19iaXQgPSBfX0hGTl9JTlRfTUJPWF9MUFUwOworCX0gZWxzZSB7CisJCSptc2l4X3ZlY3NfYm1hcCA9IChfX0hGTl9JTlRfQ1BFX1E0IHwgX19IRk5fSU5UX0NQRV9RNSB8CisJCQkJICAgX19IRk5fSU5UX0NQRV9RNiB8IF9fSEZOX0lOVF9DUEVfUTcgfAorCQkJCSAgIF9fSEZOX0lOVF9STUVfUTQgfCBfX0hGTl9JTlRfUk1FX1E1IHwKKwkJCQkgICBfX0hGTl9JTlRfUk1FX1E2IHwgX19IRk5fSU5UX1JNRV9RNyB8CisJCQkJICAgX19IRk5fSU5UX01CT1hfTFBVMSk7CisJCSptYXhfdmVjX2JpdCA9IF9fSEZOX0lOVF9NQk9YX0xQVTE7CisJfQorCisJKm1zaXhfdmVjc19ibWFwIHw9IChfX0hGTl9JTlRfRVJSX0VNQyB8IF9fSEZOX0lOVF9FUlJfTFBVMCB8CisJCQkgICAgX19IRk5fSU5UX0VSUl9MUFUxIHwgX19IRk5fSU5UX0VSUl9QU1MpOworCSpudW1fdmVjcyA9IF9fSEZOX05VTUlOVFM7Cit9CisKKy8qKgorICogTm8gc3BlY2lhbCBzZXR1cCByZXF1aXJlZCBmb3IgY3Jvc3Nib3cgLS0gdmVjdG9yIGFzc2lnbm1lbnRzIGFyZSBpbXBsaWNpdC4KKyAqLwordm9pZAorYmZhX2h3Y2JfbXNpeF9pbml0KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnZlY3MpCit7CisJaW50IGk7CisKKwliZmFfYXNzZXJ0KChudmVjcyA9PSAxKSB8fCAobnZlY3MgPT0gX19IRk5fTlVNSU5UUykpOworCisJYmZhLT5tc2l4Lm52ZWNzID0gbnZlY3M7CisJaWYgKG52ZWNzID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IEJGQV9NU0lYX0NCX01BWDsgaSsrKQorCQkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9hbGw7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSBCRkFfTVNJWF9DUEVfUTA7IGkgPD0gQkZBX01TSVhfQ1BFX1E3OyBpKyspCisJCWJmYS0+bXNpeC5oYW5kbGVyW2ldID0gYmZhX21zaXhfcmVxcTsKKworCWZvciAoaSA9IEJGQV9NU0lYX1JNRV9RMDsgaSA8PSBCRkFfTVNJWF9STUVfUTc7IGkrKykKKwkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9yc3BxOworCisJZm9yICg7IGkgPCBCRkFfTVNJWF9DQl9NQVg7IGkrKykKKwkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9scHVfZXJyOworfQorCisvKioKKyAqIENyb3NzYm93IC0tIGR1bW15LCBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQKKyAqLwordm9pZAorYmZhX2h3Y2JfbXNpeF9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCit2b2lkCitiZmFfaHdjYl9tc2l4X3VuaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworLyoqCisgKiBObyBzcGVjaWFsIGVuYWJsZS9kaXNhYmxlIC0tIHZlY3RvciBhc3NpZ25tZW50cyBhcmUgaW1wbGljaXQuCisgKi8KK3ZvaWQKK2JmYV9od2NiX2lzcl9tb2RlX3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBtc2l4KQoreworCWJmYS0+aW9jZmMuaHdpZi5od19yc3BxX2FjayA9IGJmYV9od2NiX3JzcHFfYWNrX21zaXg7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY3QuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhZTU3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2N0LmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYV9wcml2Lmg+CisjaW5jbHVkZSA8YmZpL2JmaV9jdHJlZy5oPgorI2luY2x1ZGUgPGJmYV9pb2MuaD4KKworQkZBX1RSQ19GSUxFKEhBTCwgSU9DRkNfQ1QpOworCitzdGF0aWMgdTMyIF9fY3RfbXNpeF9lcnJfdmVjX3JlZ1tdID0geworCUhPU1RfTVNJWF9FUlJfSU5ERVhfRk4wLAorCUhPU1RfTVNJWF9FUlJfSU5ERVhfRk4xLAorCUhPU1RfTVNJWF9FUlJfSU5ERVhfRk4yLAorCUhPU1RfTVNJWF9FUlJfSU5ERVhfRk4zLAorfTsKKworc3RhdGljIHZvaWQKK2JmYV9od2N0X21zaXhfbHB1X2Vycl9zZXQoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgbXNpeCwgaW50IHZlYykKK3sKKwlpbnQgZm4gPSBiZmFfaW9jX3BjaWZuKCZiZmEtPmlvYyk7CisJYmZhX29zX2FkZHJfdCBrdmEgPSBiZmFfaW9jX2JhcjAoJmJmYS0+aW9jKTsKKworCWlmIChtc2l4KQorCQliZmFfcmVnX3dyaXRlKGt2YSArIF9fY3RfbXNpeF9lcnJfdmVjX3JlZ1tmbl0sIHZlYyk7CisJZWxzZQorCQliZmFfcmVnX3dyaXRlKGt2YSArIF9fY3RfbXNpeF9lcnJfdmVjX3JlZ1tmbl0sIDApOworfQorCisvKioKKyAqIER1bW15IGludGVycnVwdCBoYW5kbGVyIGZvciBoYW5kbGluZyBzcHVyaW91cyBpbnRlcnJ1cHQgZHVyaW5nIGNoaXAtcmVpbml0LgorICovCitzdGF0aWMgdm9pZAorYmZhX2h3Y3RfbXNpeF9kdW1teShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYykKK3sKK30KKwordm9pZAorYmZhX2h3Y3RfcmVnaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2lvY2ZjX3JlZ3NfcwkqYmZhX3JlZ3MgPSAmYmZhLT5pb2NmYy5iZmFfcmVnczsKKwliZmFfb3NfYWRkcl90CQlrdmEgPSBiZmFfaW9jX2JhcjAoJmJmYS0+aW9jKTsKKwlpbnQgICAgICAgICAgICAgCWksIHEsIGZuID0gYmZhX2lvY19wY2lmbigmYmZhLT5pb2MpOworCisJaWYgKGZuID09IDApIHsKKwkJYmZhX3JlZ3MtPmludHJfc3RhdHVzID0gKGt2YSArIEhPU1RGTjBfSU5UX1NUQVRVUyk7CisJCWJmYV9yZWdzLT5pbnRyX21hc2sgICA9IChrdmEgKyBIT1NURk4wX0lOVF9NU0spOworCX0gZWxzZSB7CisJCWJmYV9yZWdzLT5pbnRyX3N0YXR1cyA9IChrdmEgKyBIT1NURk4xX0lOVF9TVEFUVVMpOworCQliZmFfcmVncy0+aW50cl9tYXNrICAgPSAoa3ZhICsgSE9TVEZOMV9JTlRfTVNLKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQkZJX0lPQ19NQVhfQ1FTOyBpKyspIHsKKwkJLyoKKwkJICogQ1BFIHJlZ2lzdGVycworCQkgKi8KKwkJcSA9IENQRV9RX05VTShmbiwgaSk7CisJCWJmYV9yZWdzLT5jcGVfcV9waVtpXSA9IChrdmEgKyBDUEVfUElfUFRSX1EocSA8PCA1KSk7CisJCWJmYV9yZWdzLT5jcGVfcV9jaVtpXSA9IChrdmEgKyBDUEVfQ0lfUFRSX1EocSA8PCA1KSk7CisJCWJmYV9yZWdzLT5jcGVfcV9kZXB0aFtpXSA9IChrdmEgKyBDUEVfREVQVEhfUShxIDw8IDUpKTsKKwkJYmZhX3JlZ3MtPmNwZV9xX2N0cmxbaV0gPSAoa3ZhICsgQ1BFX1FDVFJMX1EocSA8PCA1KSk7CisKKwkJLyoKKwkJICogUk1FIHJlZ2lzdGVycworCQkgKi8KKwkJcSA9IENQRV9RX05VTShmbiwgaSk7CisJCWJmYV9yZWdzLT5ybWVfcV9waVtpXSA9IChrdmEgKyBSTUVfUElfUFRSX1EocSA8PCA1KSk7CisJCWJmYV9yZWdzLT5ybWVfcV9jaVtpXSA9IChrdmEgKyBSTUVfQ0lfUFRSX1EocSA8PCA1KSk7CisJCWJmYV9yZWdzLT5ybWVfcV9kZXB0aFtpXSA9IChrdmEgKyBSTUVfREVQVEhfUShxIDw8IDUpKTsKKwkJYmZhX3JlZ3MtPnJtZV9xX2N0cmxbaV0gPSAoa3ZhICsgUk1FX1FDVFJMX1EocSA8PCA1KSk7CisJfQorfQorCit2b2lkCitiZmFfaHdjdF9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpCit7CisJdTMyCXIzMjsKKworCXIzMiA9IGJmYV9yZWdfcmVhZChiZmEtPmlvY2ZjLmJmYV9yZWdzLnJtZV9xX2N0cmxbcnNwcV0pOworCWJmYV9yZWdfd3JpdGUoYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jdHJsW3JzcHFdLCByMzIpOworfQorCit2b2lkCitiZmFfaHdjdF9tc2l4X2dldHZlY3Moc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqbXNpeF92ZWNzX2JtYXAsCisJCSB1MzIgKm51bV92ZWNzLCB1MzIgKm1heF92ZWNfYml0KQoreworCSptc2l4X3ZlY3NfYm1hcCA9ICgxIDw8IEJGQV9NU0lYX0NUX01BWCkgLSAxOworCSptYXhfdmVjX2JpdCA9ICgxIDw8IChCRkFfTVNJWF9DVF9NQVggLSAxKSk7CisJKm51bV92ZWNzID0gQkZBX01TSVhfQ1RfTUFYOworfQorCisvKioKKyAqIFNldHVwIE1TSS1YIHZlY3RvciBmb3IgY2F0YXB1bHQKKyAqLwordm9pZAorYmZhX2h3Y3RfbXNpeF9pbml0KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnZlY3MpCit7CisJYmZhX2Fzc2VydCgobnZlY3MgPT0gMSkgfHwgKG52ZWNzID09IEJGQV9NU0lYX0NUX01BWCkpOworCWJmYV90cmMoYmZhLCBudmVjcyk7CisKKwliZmEtPm1zaXgubnZlY3MgPSBudmVjczsKKwliZmFfaHdjdF9tc2l4X3VuaW5zdGFsbChiZmEpOworfQorCit2b2lkCitiZmFfaHdjdF9tc2l4X2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpCit7CisJaW50IGk7CisKKwlpZiAoYmZhLT5tc2l4Lm52ZWNzID09IDApCisJCXJldHVybjsKKworCWlmIChiZmEtPm1zaXgubnZlY3MgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQkZBX01TSVhfQ1RfTUFYOyBpKyspCisJCQliZmEtPm1zaXguaGFuZGxlcltpXSA9IGJmYV9tc2l4X2FsbDsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IEJGQV9NU0lYX0NQRV9RMDsgaSA8PSBCRkFfTVNJWF9DUEVfUTM7IGkrKykKKwkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9yZXFxOworCisJZm9yICg7IGkgPD0gQkZBX01TSVhfUk1FX1EzOyBpKyspCisJCWJmYS0+bXNpeC5oYW5kbGVyW2ldID0gYmZhX21zaXhfcnNwcTsKKworCWJmYV9hc3NlcnQoaSA9PSBCRkFfTVNJWF9MUFVfRVJSKTsKKwliZmEtPm1zaXguaGFuZGxlcltCRkFfTVNJWF9MUFVfRVJSXSA9IGJmYV9tc2l4X2xwdV9lcnI7Cit9CisKK3ZvaWQKK2JmYV9od2N0X21zaXhfdW5pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJGQV9NU0lYX0NUX01BWDsgaSsrKQorCQliZmEtPm1zaXguaGFuZGxlcltpXSA9IGJmYV9od2N0X21zaXhfZHVtbXk7Cit9CisKKy8qKgorICogRW5hYmxlIE1TSS1YIHZlY3RvcnMKKyAqLwordm9pZAorYmZhX2h3Y3RfaXNyX21vZGVfc2V0KHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfYm9vbGVhbl90IG1zaXgpCit7CisJYmZhX3RyYyhiZmEsIDApOworCWJmYV9od2N0X21zaXhfbHB1X2Vycl9zZXQoYmZhLCBtc2l4LCBCRkFfTVNJWF9MUFVfRVJSKTsKKwliZmFfaW9jX2lzcl9tb2RlX3NldCgmYmZhLT5pb2MsIG1zaXgpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHIuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ExMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW50ci5jCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8YmZpL2JmaV9jYnJlZy5oPgorI2luY2x1ZGUgPGJmYV9wb3J0X3ByaXYuaD4KKyNpbmNsdWRlIDxiZmFfaW50cl9wcml2Lmg+CisjaW5jbHVkZSA8Y3MvYmZhX2RlYnVnLmg+CisKK0JGQV9UUkNfRklMRShIQUwsIElOVFIpOworCitzdGF0aWMgdm9pZAorYmZhX21zaXhfZXJyaW50KHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgaW50cikKK3sKKwliZmFfaW9jX2Vycm9yX2lzcigmYmZhLT5pb2MpOworfQorCitzdGF0aWMgdm9pZAorYmZhX21zaXhfbHB1KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWJmYV9pb2NfbWJveF9pc3IoJmJmYS0+aW9jKTsKK30KKwordm9pZAorYmZhX21zaXhfYWxsKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgdmVjKQoreworCWJmYV9pbnR4KGJmYSk7Cit9CisKKy8qKgorICogIGhhbF9pbnRyX2FwaQorICovCitiZmFfYm9vbGVhbl90CitiZmFfaW50eChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwl1MzIgICAgICAgIGludHIsIHFpbnRyOworCWludCAgICAgICAgICAgICBxdWV1ZTsKKworCWludHIgPSBiZmFfcmVnX3JlYWQoYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7CisJaWYgKCFpbnRyKQorCQlyZXR1cm4gQkZBX0ZBTFNFOworCisJLyoqCisJICogUk1FIGNvbXBsZXRpb24gcXVldWUgaW50ZXJydXB0CisJICovCisJcWludHIgPSBpbnRyICYgX19IRk5fSU5UX1JNRV9NQVNLOworCWJmYV9yZWdfd3JpdGUoYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cywgcWludHIpOworCisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgQkZJX0lPQ19NQVhfQ1FTX0FTSUM7IHF1ZXVlICsrKSB7CisJCWlmIChpbnRyICYgKF9fSEZOX0lOVF9STUVfUTAgPDwgcXVldWUpKQorCQkJYmZhX21zaXhfcnNwcShiZmEsIHF1ZXVlICYgKEJGSV9JT0NfTUFYX0NRUyAtIDEpKTsKKwl9CisJaW50ciAmPSB+cWludHI7CisJaWYgKCFpbnRyKQorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwkvKioKKwkgKiBDUEUgY29tcGxldGlvbiBxdWV1ZSBpbnRlcnJ1cHQKKwkgKi8KKwlxaW50ciA9IGludHIgJiBfX0hGTl9JTlRfQ1BFX01BU0s7CisJYmZhX3JlZ193cml0ZShiZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzLCBxaW50cik7CisKKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBCRklfSU9DX01BWF9DUVNfQVNJQzsgcXVldWUrKykgeworCQlpZiAoaW50ciAmIChfX0hGTl9JTlRfQ1BFX1EwIDw8IHF1ZXVlKSkKKwkJCWJmYV9tc2l4X3JlcXEoYmZhLCBxdWV1ZSAmIChCRklfSU9DX01BWF9DUVMgLSAxKSk7CisJfQorCWludHIgJj0gfnFpbnRyOworCWlmICghaW50cikKKwkJcmV0dXJuIEJGQV9UUlVFOworCisJYmZhX21zaXhfbHB1X2VycihiZmEsIGludHIpOworCisJcmV0dXJuIEJGQV9UUlVFOworfQorCit2b2lkCitiZmFfaXNyX2VuYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwl1MzIgICAgICAgIGludHJfdW5tYXNrOworCWludCAgICAgICAgICAgICBwY2lfZnVuYyA9IGJmYV9pb2NfcGNpZm4oJmJmYS0+aW9jKTsKKworCWJmYV90cmMoYmZhLCBwY2lfZnVuYyk7CisKKwliZmFfbXNpeF9pbnN0YWxsKGJmYSk7CisJaW50cl91bm1hc2sgPSAoX19IRk5fSU5UX0VSUl9FTUMgfCBfX0hGTl9JTlRfRVJSX0xQVTAgfAorCQkgICAgICAgX19IRk5fSU5UX0VSUl9MUFUxIHwgX19IRk5fSU5UX0VSUl9QU1MpOworCisJaWYgKHBjaV9mdW5jID09IDApCisJCWludHJfdW5tYXNrIHw9IChfX0hGTl9JTlRfQ1BFX1EwIHwgX19IRk5fSU5UX0NQRV9RMSB8CisJCQkJX19IRk5fSU5UX0NQRV9RMiB8IF9fSEZOX0lOVF9DUEVfUTMgfAorCQkJCV9fSEZOX0lOVF9STUVfUTAgfCBfX0hGTl9JTlRfUk1FX1ExIHwKKwkJCQlfX0hGTl9JTlRfUk1FX1EyIHwgX19IRk5fSU5UX1JNRV9RMyB8CisJCQkJX19IRk5fSU5UX01CT1hfTFBVMCk7CisJZWxzZQorCQlpbnRyX3VubWFzayB8PSAoX19IRk5fSU5UX0NQRV9RNCB8IF9fSEZOX0lOVF9DUEVfUTUgfAorCQkJCV9fSEZOX0lOVF9DUEVfUTYgfCBfX0hGTl9JTlRfQ1BFX1E3IHwKKwkJCQlfX0hGTl9JTlRfUk1FX1E0IHwgX19IRk5fSU5UX1JNRV9RNSB8CisJCQkJX19IRk5fSU5UX1JNRV9RNiB8IF9fSEZOX0lOVF9STUVfUTcgfAorCQkJCV9fSEZOX0lOVF9NQk9YX0xQVTEpOworCisJYmZhX3JlZ193cml0ZShiZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzLCBpbnRyX3VubWFzayk7CisJYmZhX3JlZ193cml0ZShiZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfbWFzaywgfmludHJfdW5tYXNrKTsKKwliZmFfaXNyX21vZGVfc2V0KGJmYSwgYmZhLT5tc2l4Lm52ZWNzICE9IDApOworfQorCit2b2lkCitiZmFfaXNyX2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpCit7CisJYmZhX2lzcl9tb2RlX3NldChiZmEsIEJGQV9GQUxTRSk7CisJYmZhX3JlZ193cml0ZShiZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfbWFzaywgLTFMKTsKKwliZmFfbXNpeF91bmluc3RhbGwoYmZhKTsKK30KKwordm9pZAorYmZhX21zaXhfcmVxcShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHFpZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIAkJKndhaXRxLCAqcWUsICpxZW47CisJc3RydWN0IGJmYV9yZXFxX3dhaXRfcwkqd3FlOworCisJcWlkICY9IChCRklfSU9DX01BWF9DUVMgLSAxKTsKKworCXdhaXRxID0gYmZhX3JlcXEoYmZhLCBxaWQpOworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCB3YWl0cSkgeworCQkvKioKKwkJICogQ2FsbGJhY2sgb25seSBhcyBsb25nIGFzIHRoZXJlIGlzIHJvb20gaW4gcmVxdWVzdCBxdWV1ZQorCQkgKi8KKwkJaWYgKGJmYV9yZXFxX2Z1bGwoYmZhLCBxaWQpKQorCQkJYnJlYWs7CisKKwkJbGlzdF9kZWwocWUpOworCQl3cWUgPSAoc3RydWN0IGJmYV9yZXFxX3dhaXRfcyAqKSBxZTsKKwkJd3FlLT5xcmVzdW1lKHdxZS0+Y2JhcmcpOworCX0KK30KKwordm9pZAorYmZhX2lzcl91bmhhbmRsZWQoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm0pCit7CisJYmZhX3RyYyhiZmEsIG0tPm1oZHIubXNnX2NsYXNzKTsKKwliZmFfdHJjKGJmYSwgbS0+bWhkci5tc2dfaWQpOworCWJmYV90cmMoYmZhLCBtLT5taGRyLm10YWcuaTJodG9rKTsKKwliZmFfYXNzZXJ0KDApOworCWJmYV90cmNfc3RvcChiZmEtPnRyY21vZCk7Cit9CisKK3ZvaWQKK2JmYV9tc2l4X3JzcHEoc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BfcWlkKQoreworCXN0cnVjdCBiZmlfbXNnX3MgICAgICAqbTsKKwl1MzIgICAgICAgIHBpLCBjaTsKKworCWJmYV90cmNfZnAoYmZhLCByc3BfcWlkKTsKKworCXJzcF9xaWQgJj0gKEJGSV9JT0NfTUFYX0NRUyAtIDEpOworCisJYmZhLT5pb2NmYy5od2lmLmh3X3JzcHFfYWNrKGJmYSwgcnNwX3FpZCk7CisKKwljaSA9IGJmYV9yc3BxX2NpKGJmYSwgcnNwX3FpZCk7CisJcGkgPSBiZmFfcnNwcV9waShiZmEsIHJzcF9xaWQpOworCisJYmZhX3RyY19mcChiZmEsIGNpKTsKKwliZmFfdHJjX2ZwKGJmYSwgcGkpOworCisJaWYgKGJmYS0+cm1lX3Byb2Nlc3MpIHsKKwkJd2hpbGUgKGNpICE9IHBpKSB7CisJCQltID0gYmZhX3JzcHFfZWxlbShiZmEsIHJzcF9xaWQsIGNpKTsKKwkJCWJmYV9hc3NlcnRfZnAobS0+bWhkci5tc2dfY2xhc3MgPCBCRklfTUNfTUFYKTsKKworCQkJYmZhX2lzcnNbbS0+bWhkci5tc2dfY2xhc3NdIChiZmEsIG0pOworCisJCQlDUV9JTkNSKGNpLCBiZmEtPmlvY2ZjLmNmZy5kcnZjZmcubnVtX3JzcHFfZWxlbXMpOworCQl9CisJfQorCisJLyoqCisJICogdXBkYXRlIENJCisJICovCisJYmZhX3JzcHFfY2koYmZhLCByc3BfcWlkKSA9IHBpOworCWJmYV9yZWdfd3JpdGUoYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jaVtyc3BfcWlkXSwgcGkpOworCWJmYV9vc19tbWlvd2IoKTsKK30KKwordm9pZAorYmZhX21zaXhfbHB1X2VycihzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYykKK3sKKwl1MzIgaW50cjsKKworCWludHIgPSBiZmFfcmVnX3JlYWQoYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7CisKKwlpZiAoaW50ciAmIChfX0hGTl9JTlRfTUJPWF9MUFUwIHwgX19IRk5fSU5UX01CT1hfTFBVMSkpCisJCWJmYV9tc2l4X2xwdShiZmEpOworCisJaWYgKGludHIgJiAoX19IRk5fSU5UX0VSUl9FTUMgfAorCQkgICAgX19IRk5fSU5UX0VSUl9MUFUwIHwgX19IRk5fSU5UX0VSUl9MUFUxIHwKKwkJICAgIF9fSEZOX0lOVF9FUlJfUFNTKSkKKwkJYmZhX21zaXhfZXJyaW50KGJmYSwgaW50cik7Cit9CisKK3ZvaWQKK2JmYV9pc3JfYmluZChlbnVtIGJmaV9tY2xhc3MgbWMsIGJmYV9pc3JfZnVuY190IGlzcl9mdW5jKQoreworCWJmYV9pc3JzW21jXSA9IGlzcl9mdW5jOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHJfcHJpdi5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW50cl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlNmU2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ludHJfcHJpdi5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfSU5UUl9QUklWX0hfXworI2RlZmluZSBfX0JGQV9JTlRSX1BSSVZfSF9fCisKKy8qKgorICogTWVzc2FnZSBoYW5kbGVyCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJmYV9pc3JfZnVuY190KSAoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm0pOwordm9pZCBiZmFfaXNyX3VuaGFuZGxlZChzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbSk7Cit2b2lkIGJmYV9pc3JfYmluZChlbnVtIGJmaV9tY2xhc3MgbWMsIGJmYV9pc3JfZnVuY190IGlzcl9mdW5jKTsKKworCisjZGVmaW5lIGJmYV9yZXFxX3BpKF9fYmZhLCBfX3JlcXEpCShfX2JmYSktPmlvY2ZjLnJlcV9jcV9waVtfX3JlcXFdCisjZGVmaW5lIGJmYV9yZXFxX2NpKF9fYmZhLCBfX3JlcXEpCQkJCQlcCisJKih1MzIgKikoKF9fYmZhKS0+aW9jZmMucmVxX2NxX3NoYWRvd19jaVtfX3JlcXFdLmt2YSkKKworI2RlZmluZSBiZmFfcmVxcV9mdWxsKF9fYmZhLCBfX3JlcXEpCQkJCVwKKwkoKChiZmFfcmVxcV9waShfX2JmYSwgX19yZXFxKSArIDEpICYJCQlcCisJICAoKF9fYmZhKS0+aW9jZmMuY2ZnLmRydmNmZy5udW1fcmVxcV9lbGVtcyAtIDEpKSA9PQlcCisJIGJmYV9yZXFxX2NpKF9fYmZhLCBfX3JlcXEpKQorCisjZGVmaW5lIGJmYV9yZXFxX25leHQoX19iZmEsIF9fcmVxcSkJCQkJXAorCShiZmFfcmVxcV9mdWxsKF9fYmZhLCBfX3JlcXEpID8gTlVMTCA6CQkJXAorCSAoKHZvaWQgKikoKHN0cnVjdCBiZmlfbXNnX3MgKikoKF9fYmZhKS0+aW9jZmMucmVxX2NxX2JhW19fcmVxcV0ua3ZhKSBcCisJCQkgICsgYmZhX3JlcXFfcGkoKF9fYmZhKSwgKF9fcmVxcSkpKSkpCisKKyNkZWZpbmUgYmZhX3JlcXFfcHJvZHVjZShfX2JmYSwgX19yZXFxKQlkbyB7CQkJCVwKKwkoX19iZmEpLT5pb2NmYy5yZXFfY3FfcGlbX19yZXFxXSsrOwkJCQlcCisJKF9fYmZhKS0+aW9jZmMucmVxX2NxX3BpW19fcmVxcV0gJj0JCQkJXAorCQkoKF9fYmZhKS0+aW9jZmMuY2ZnLmRydmNmZy5udW1fcmVxcV9lbGVtcyAtIDEpOyAgICAgIFwKKwliZmFfcmVnX3dyaXRlKChfX2JmYSktPmlvY2ZjLmJmYV9yZWdzLmNwZV9xX3BpW19fcmVxcV0sCQlcCisJCQkJKF9fYmZhKS0+aW9jZmMucmVxX2NxX3BpW19fcmVxcV0pOyAgICAgIFwKKwliZmFfb3NfbW1pb3diKCk7ICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBiZmFfcnNwcV9waShfX2JmYSwgX19yc3BxKQkJCQkJXAorCSoodTMyICopKChfX2JmYSktPmlvY2ZjLnJzcF9jcV9zaGFkb3dfcGlbX19yc3BxXS5rdmEpCisKKyNkZWZpbmUgYmZhX3JzcHFfY2koX19iZmEsIF9fcnNwcSkJKF9fYmZhKS0+aW9jZmMucnNwX2NxX2NpW19fcnNwcV0KKyNkZWZpbmUgYmZhX3JzcHFfZWxlbShfX2JmYSwgX19yc3BxLCBfX2NpKQkJCQlcCisJJigoc3RydWN0IGJmaV9tc2dfcyAqKSgoX19iZmEpLT5pb2NmYy5yc3BfY3FfYmFbX19yc3BxXS5rdmEpKVtfX2NpXQorCisjZGVmaW5lIENRX0lOQ1IoX19pbmRleCwgX19zaXplKQkJCQkJXAorCQkJKF9faW5kZXgpKys7IChfX2luZGV4KSAmPSAoKF9fc2l6ZSkgLSAxKQorCisvKioKKyAqIFF1ZXVlIGVsZW1lbnQgdG8gd2FpdCBmb3Igcm9vbSBpbiByZXF1ZXN0IHF1ZXVlLiBGSUZPIG9yZGVyIGlzCisgKiBtYWludGFpbmVkIHdoZW4gZnVsbGZpbGxpbmcgcmVxdWVzdHMuCisgKi8KK3N0cnVjdCBiZmFfcmVxcV93YWl0X3MgeworCXN0cnVjdCBsaXN0X2hlYWQgCXFlOworCXZvaWQJCSgqcXJlc3VtZSkgKHZvaWQgKmNiYXJnKTsKKwl2b2lkCQkqY2Jhcmc7Cit9OworCisvKioKKyAqIENpcmN1bGFyIHF1ZXVlIHVzYWdlIGFzc2lnbm1lbnRzCisgKi8KK2VudW0geworCUJGQV9SRVFRX0lPQwk9IDAsCS8qICBhbGwgbG93LXByaW9yaXR5IElPQyBtc2dzCSovCisJQkZBX1JFUVFfRkNYUAk9IDAsCS8qICBhbGwgRkNYUCBtZXNzYWdlcwkJKi8KKwlCRkFfUkVRUV9MUFMJPSAwLAkvKiAgYWxsIGxwb3J0IHNlcnZpY2UgbXNncwkqLworCUJGQV9SRVFRX1BPUlQJPSAwLAkvKiAgYWxsIHBvcnQgbWVzc2FnZXMJCSovCisJQkZBX1JFUVFfRkxBU0gJPSAwLAkvKiAgZm9yIGZsYXNoIG1vZHVsZQkJKi8KKwlCRkFfUkVRUV9ESUFHCT0gMCwJLyogIGZvciBkaWFnIG1vZHVsZQkJKi8KKwlCRkFfUkVRUV9SUE9SVAk9IDAsCS8qICBhbGwgcG9ydCBtZXNzYWdlcwkJKi8KKwlCRkFfUkVRUV9TQk9PVAk9IDAsCS8qICBhbGwgc2FuIGJvb3QgbWVzc2FnZXMJKi8KKwlCRkFfUkVRUV9RT1NfTE8JPSAxLAkvKiAgYWxsIGxvdyBwcmlvcml0eSBJTwkqLworCUJGQV9SRVFRX1FPU19NRAk9IDIsCS8qICBhbGwgbWVkaXVtIHByaW9yaXR5IElPCSovCisJQkZBX1JFUVFfUU9TX0hJCT0gMywJLyogIGFsbCBoaWdoIHByaW9yaXR5IElPCSovCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK2JmYV9yZXFxX3dpbml0KHN0cnVjdCBiZmFfcmVxcV93YWl0X3MgKndxZSwgdm9pZCAoKnFyZXN1bWUpICh2b2lkICpjYmFyZyksCisJCQl2b2lkICpjYmFyZykKK3sKKwl3cWUtPnFyZXN1bWUgPSBxcmVzdW1lOworCXdxZS0+Y2JhcmcgPSBjYmFyZzsKK30KKworI2RlZmluZSBiZmFfcmVxcShfX2JmYSwgX19yZXFxKQkmKF9fYmZhKS0+cmVxcV93YWl0cVtfX3JlcXFdCisKKy8qKgorICogc3RhdGljIGlubGluZSB2b2lkCisgKiBiZmFfcmVxcV93YWl0KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcmVxcSwgc3RydWN0IGJmYV9yZXFxX3dhaXRfcyAqd3FlKQorICovCisjZGVmaW5lIGJmYV9yZXFxX3dhaXQoX19iZmEsIF9fcmVxcSwgX193cWUpIGRvIHsJCQlcCisJCQkJCQkJCQlcCisJCXN0cnVjdCBsaXN0X2hlYWQgKndhaXRxID0gYmZhX3JlcXEoX19iZmEsIF9fcmVxcSk7ICAgICAgXAorCQkJCQkJCQkJXAorCQliZmFfYXNzZXJ0KCgoX19yZXFxKSA8IEJGSV9JT0NfTUFYX0NRUykpOyAgICAgIFwKKwkJYmZhX2Fzc2VydCgoX193cWUpLT5xcmVzdW1lICYmIChfX3dxZSktPmNiYXJnKTsgICAgICBcCisJCQkJCQkJCQlcCisJCWxpc3RfYWRkX3RhaWwoJihfX3dxZSktPnFlLCB3YWl0cSk7ICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBiZmFfcmVxcV93Y2FuY2VsKF9fd3FlKQlsaXN0X2RlbCgmKF9fd3FlKS0+cWUpCisKKyNlbmRpZiAvKiBfX0JGQV9JTlRSX1BSSVZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTM0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwpAQCAtMCwwICsxLDIzODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9pb2MuaD4KKyNpbmNsdWRlIDxiZmFfZndpbWdfcHJpdi5oPgorI2luY2x1ZGUgPGJmYV90cmNtb2RfcHJpdi5oPgorI2luY2x1ZGUgPGNzL2JmYV9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJmaS9iZmlfaW9jLmg+CisjaW5jbHVkZSA8YmZpL2JmaV9jdHJlZy5oPgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuX2lvYy5oPgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuLmg+CisjaW5jbHVkZSA8bG9nL2JmYV9sb2dfaGFsLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19wY2kuaD4KKworQkZBX1RSQ19GSUxFKEhBTCwgSU9DKTsKKworLyoqCisgKiBJT0MgbG9jYWwgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBCRkFfSU9DX1RPVgkJMjAwMAkvKiBtc2VjcyAqLworI2RlZmluZSBCRkFfSU9DX0hCX1RPVgkJMTAwMAkvKiBtc2VjcyAqLworI2RlZmluZSBCRkFfSU9DX0hCX0ZBSUxfTUFYCTQKKyNkZWZpbmUgQkZBX0lPQ19IV0lOSVRfTUFYCTIKKyNkZWZpbmUgQkZBX0lPQ19GV0lNR19NSU5TWiAgICAgKDE2ICogMTAyNCkKKyNkZWZpbmUgQkZBX0lPQ19UT1ZfUkVDT1ZFUgkoQkZBX0lPQ19IQl9GQUlMX01BWCAqIEJGQV9JT0NfSEJfVE9WIFwKKwkJCQkrIEJGQV9JT0NfVE9WKQorCisjZGVmaW5lIGJmYV9pb2NfdGltZXJfc3RhcnQoX19pb2MpCQkJCQlcCisJYmZhX3RpbWVyX2JlZ2luKChfX2lvYyktPnRpbWVyX21vZCwgJihfX2lvYyktPmlvY190aW1lciwJXAorCQkJYmZhX2lvY190aW1lb3V0LCAoX19pb2MpLCBCRkFfSU9DX1RPVikKKyNkZWZpbmUgYmZhX2lvY190aW1lcl9zdG9wKF9faW9jKSAgIGJmYV90aW1lcl9zdG9wKCYoX19pb2MpLT5pb2NfdGltZXIpCisKKyNkZWZpbmUgQkZBX0RCR19GV1RSQ19FTlRTCShCRklfSU9DX1RSQ19FTlRTKQorI2RlZmluZSBCRkFfREJHX0ZXVFJDX0xFTgkJCQkJXAorCShCRkFfREJHX0ZXVFJDX0VOVFMgKiBzaXplb2Yoc3RydWN0IGJmYV90cmNfcykgKwlcCisJIChzaXplb2Yoc3RydWN0IGJmYV90cmNfbW9kX3MpIC0JCQlcCisJICBCRkFfVFJDX01BWCAqIHNpemVvZihzdHJ1Y3QgYmZhX3RyY19zKSkpCisjZGVmaW5lIEJGQV9EQkdfRldUUkNfT0ZGKF9mbikJKEJGSV9JT0NfVFJDX09GRiArIEJGQV9EQkdfRldUUkNfTEVOICogKF9mbikpCisjZGVmaW5lIGJmYV9pb2Nfc3RhdHMoX2lvYywgX3N0YXRzKQkoX2lvYyktPnN0YXRzLl9zdGF0cyArKworCisjZGVmaW5lIEJGQV9GTEFTSF9DSFVOS19OTyhvZmYpICAgICAgICAgKG9mZiAvIEJGSV9GTEFTSF9DSFVOS19TWl9XT1JEUykKKyNkZWZpbmUgQkZBX0ZMQVNIX09GRlNFVF9JTl9DSFVOSyhvZmYpICAob2ZmICUgQkZJX0ZMQVNIX0NIVU5LX1NaX1dPUkRTKQorI2RlZmluZSBCRkFfRkxBU0hfQ0hVTktfQUREUihjaHVua25vKSAgIChjaHVua25vICogQkZJX0ZMQVNIX0NIVU5LX1NaX1dPUkRTKQorYmZhX2Jvb2xlYW5fdCAgIGJmYV9hdXRvX3JlY292ZXIgPSBCRkFfRkFMU0U7CisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19hZW5fcG9zdChzdHJ1Y3QgYmZhX2lvY19zICpiZmEsCisJCQkJIGVudW0gYmZhX2lvY19hZW5fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfaHdfc2VtX2dldChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfaHdfc2VtX3JlbGVhc2Uoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9jX2h3X3NlbV9nZXRfY2FuY2VsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19od2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBiZmFfYm9vbGVhbl90IGZvcmNlKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9jX3RpbWVvdXQodm9pZCAqaW9jKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9jX3NlbmRfZW5hYmxlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19zZW5kX2Rpc2FibGUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9jX3NlbmRfZ2V0YXR0cihzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfaGJfbW9uaXRvcihzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfaGJfc3RvcChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfcmVzZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBiZmFfYm9vbGVhbl90IGZvcmNlKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9jX21ib3hfcG9sbChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfbWJveF9oYmZhaWwoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9jX3JlY292ZXIoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3N0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV9pb2NfZmlybXdhcmVfbG9jayhzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2NfZmlybXdhcmVfdW5sb2NrKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2lvY19kaXNhYmxlX2NvbXAoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9jX2xwdV9zdG9wKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CisKKy8qKgorICogIGJmYV9pb2Nfc20KKyAqLworCisvKioKKyAqIElPQyBzdGF0ZSBtYWNoaW5lIGV2ZW50cworICovCitlbnVtIGlvY19ldmVudCB7CisJSU9DX0VfRU5BQkxFID0gMSwJLyogIElPQyBlbmFibGUgcmVxdWVzdCAqLworCUlPQ19FX0RJU0FCTEUgPSAyLAkvKiAgSU9DIGRpc2FibGUgcmVxdWVzdCAqLworCUlPQ19FX1RJTUVPVVQgPSAzLAkvKiAgZi93IHJlc3BvbnNlIHRpbWVvdXQgKi8KKwlJT0NfRV9GV1JFQURZID0gNCwJLyogIGYvdyBpbml0aWFsaXphdGlvbiBkb25lICovCisJSU9DX0VfRldSU1BfR0VUQVRUUiA9IDUsCS8qICBJT0MgZ2V0IGF0dHJpYnV0ZSByZXNwb25zZSAqLworCUlPQ19FX0ZXUlNQX0VOQUJMRSA9IDYsCS8qICBlbmFibGUgZi93IHJlc3BvbnNlICovCisJSU9DX0VfRldSU1BfRElTQUJMRSA9IDcsCS8qICBkaXNhYmxlIGYvdyByZXNwb25zZSAqLworCUlPQ19FX0hCRkFJTCA9IDgsCS8qICBoZWFydGJlYXQgZmFpbHVyZSAqLworCUlPQ19FX0hXRVJST1IgPSA5LAkvKiAgaGFyZHdhcmUgZXJyb3IgaW50ZXJydXB0ICovCisJSU9DX0VfU0VNTE9DS0VEID0gMTAsCS8qICBoL3cgc2VtYXBob3JlIGlzIGxvY2tlZCAqLworCUlPQ19FX0RFVEFDSCA9IDExLAkvKiAgZHJpdmVyIGRldGFjaCBjbGVhbnVwICovCit9OworCitiZmFfZnNtX3N0YXRlX2RlY2woYmZhX2lvYywgcmVzZXQsIHN0cnVjdCBiZmFfaW9jX3MsIGVudW0gaW9jX2V2ZW50KTsKK2JmYV9mc21fc3RhdGVfZGVjbChiZmFfaW9jLCBmd2NoZWNrLCBzdHJ1Y3QgYmZhX2lvY19zLCBlbnVtIGlvY19ldmVudCk7CitiZmFfZnNtX3N0YXRlX2RlY2woYmZhX2lvYywgbWlzbWF0Y2gsIHN0cnVjdCBiZmFfaW9jX3MsIGVudW0gaW9jX2V2ZW50KTsKK2JmYV9mc21fc3RhdGVfZGVjbChiZmFfaW9jLCBzZW13YWl0LCBzdHJ1Y3QgYmZhX2lvY19zLCBlbnVtIGlvY19ldmVudCk7CitiZmFfZnNtX3N0YXRlX2RlY2woYmZhX2lvYywgaHdpbml0LCBzdHJ1Y3QgYmZhX2lvY19zLCBlbnVtIGlvY19ldmVudCk7CitiZmFfZnNtX3N0YXRlX2RlY2woYmZhX2lvYywgZW5hYmxpbmcsIHN0cnVjdCBiZmFfaW9jX3MsIGVudW0gaW9jX2V2ZW50KTsKK2JmYV9mc21fc3RhdGVfZGVjbChiZmFfaW9jLCBnZXRhdHRyLCBzdHJ1Y3QgYmZhX2lvY19zLCBlbnVtIGlvY19ldmVudCk7CitiZmFfZnNtX3N0YXRlX2RlY2woYmZhX2lvYywgb3AsIHN0cnVjdCBiZmFfaW9jX3MsIGVudW0gaW9jX2V2ZW50KTsKK2JmYV9mc21fc3RhdGVfZGVjbChiZmFfaW9jLCBpbml0ZmFpbCwgc3RydWN0IGJmYV9pb2NfcywgZW51bSBpb2NfZXZlbnQpOworYmZhX2ZzbV9zdGF0ZV9kZWNsKGJmYV9pb2MsIGhiZmFpbCwgc3RydWN0IGJmYV9pb2NfcywgZW51bSBpb2NfZXZlbnQpOworYmZhX2ZzbV9zdGF0ZV9kZWNsKGJmYV9pb2MsIGRpc2FibGluZywgc3RydWN0IGJmYV9pb2NfcywgZW51bSBpb2NfZXZlbnQpOworYmZhX2ZzbV9zdGF0ZV9kZWNsKGJmYV9pb2MsIGRpc2FibGVkLCBzdHJ1Y3QgYmZhX2lvY19zLCBlbnVtIGlvY19ldmVudCk7CisKK3N0YXRpYyBzdHJ1Y3QgYmZhX3NtX3RhYmxlX3MgaW9jX3NtX3RhYmxlW10gPSB7CisJe0JGQV9TTShiZmFfaW9jX3NtX3Jlc2V0KSwgQkZBX0lPQ19SRVNFVH0sCisJe0JGQV9TTShiZmFfaW9jX3NtX2Z3Y2hlY2spLCBCRkFfSU9DX0ZXTUlTTUFUQ0h9LAorCXtCRkFfU00oYmZhX2lvY19zbV9taXNtYXRjaCksIEJGQV9JT0NfRldNSVNNQVRDSH0sCisJe0JGQV9TTShiZmFfaW9jX3NtX3NlbXdhaXQpLCBCRkFfSU9DX1NFTVdBSVR9LAorCXtCRkFfU00oYmZhX2lvY19zbV9od2luaXQpLCBCRkFfSU9DX0hXSU5JVH0sCisJe0JGQV9TTShiZmFfaW9jX3NtX2VuYWJsaW5nKSwgQkZBX0lPQ19IV0lOSVR9LAorCXtCRkFfU00oYmZhX2lvY19zbV9nZXRhdHRyKSwgQkZBX0lPQ19HRVRBVFRSfSwKKwl7QkZBX1NNKGJmYV9pb2Nfc21fb3ApLCBCRkFfSU9DX09QRVJBVElPTkFMfSwKKwl7QkZBX1NNKGJmYV9pb2Nfc21faW5pdGZhaWwpLCBCRkFfSU9DX0lOSVRGQUlMfSwKKwl7QkZBX1NNKGJmYV9pb2Nfc21faGJmYWlsKSwgQkZBX0lPQ19IQkZBSUx9LAorCXtCRkFfU00oYmZhX2lvY19zbV9kaXNhYmxpbmcpLCBCRkFfSU9DX0RJU0FCTElOR30sCisJe0JGQV9TTShiZmFfaW9jX3NtX2Rpc2FibGVkKSwgQkZBX0lPQ19ESVNBQkxFRH0sCit9OworCisvKioKKyAqIFJlc2V0IGVudHJ5IGFjdGlvbnMgLS0gaW5pdGlhbGl6ZSBzdGF0ZSBtYWNoaW5lCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NtX3Jlc2V0X2VudHJ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlpb2MtPnJldHJ5X2NvdW50ID0gMDsKKwlpb2MtPmF1dG9fcmVjb3ZlciA9IGJmYV9hdXRvX3JlY292ZXI7Cit9CisKKy8qKgorICogQmVnaW5uaW5nIHN0YXRlLiBJT0MgaXMgaW4gcmVzZXQgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NtX3Jlc2V0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBpb2NfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElPQ19FX0VOQUJMRToKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Z3Y2hlY2spOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfRElTQUJMRToKKwkJYmZhX2lvY19kaXNhYmxlX2NvbXAoaW9jKTsKKwkJYnJlYWs7CisKKwljYXNlIElPQ19FX0RFVEFDSDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJfQorfQorCisvKioKKyAqIFNlbWFwaG9yZSBzaG91bGQgYmUgYWNxdWlyZWQgZm9yIHZlcnNpb24gY2hlY2suCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NtX2Z3Y2hlY2tfZW50cnkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV9pb2NfaHdfc2VtX2dldChpb2MpOworfQorCisvKioKKyAqIEF3YWl0aW5nIGgvdyBzZW1hcGhvcmUgdG8gY29udGludWUgd2l0aCB2ZXJzaW9uIGNoZWNrLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9md2NoZWNrKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBpb2NfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElPQ19FX1NFTUxPQ0tFRDoKKwkJaWYgKGJmYV9pb2NfZmlybXdhcmVfbG9jayhpb2MpKSB7CisJCQlpb2MtPnJldHJ5X2NvdW50ID0gMDsKKwkJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9od2luaXQpOworCQl9IGVsc2UgeworCQkJYmZhX2lvY19od19zZW1fcmVsZWFzZShpb2MpOworCQkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX21pc21hdGNoKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSU9DX0VfRElTQUJMRToKKwkJYmZhX2lvY19kaXNhYmxlX2NvbXAoaW9jKTsKKwkJLyoKKwkJICogZmFsbCB0aHJvdWdoCisJCSAqLworCisJY2FzZSBJT0NfRV9ERVRBQ0g6CisJCWJmYV9pb2NfaHdfc2VtX2dldF9jYW5jZWwoaW9jKTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX3Jlc2V0KTsKKwkJYnJlYWs7CisKKwljYXNlIElPQ19FX0ZXUkVBRFk6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCX0KK30KKworLyoqCisgKiBOb3RpZnkgZW5hYmxlIGNvbXBsZXRpb24gY2FsbGJhY2sgYW5kIGdlbmVyYXRlIG1pc21hdGNoIEFFTi4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21fbWlzbWF0Y2hfZW50cnkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCS8qKgorCSAqIFByb3ZpZGUgZW5hYmxlIGNvbXBsZXRpb24gY2FsbGJhY2sgYW5kIEFFTiBub3RpZmljYXRpb24gb25seSBvbmNlLgorCSAqLworCWlmIChpb2MtPnJldHJ5X2NvdW50ID09IDApIHsKKwkJaW9jLT5jYmZuLT5lbmFibGVfY2Jmbihpb2MtPmJmYSwgQkZBX1NUQVRVU19JT0NfRkFJTFVSRSk7CisJCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9GV01JU01BVENIKTsKKwl9CisJaW9jLT5yZXRyeV9jb3VudCsrOworCWJmYV9pb2NfdGltZXJfc3RhcnQoaW9jKTsKK30KKworLyoqCisgKiBBd2FpdGluZyBmaXJtd2FyZSB2ZXJzaW9uIG1hdGNoLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9taXNtYXRjaChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gaW9jX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaW9jLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJT0NfRV9USU1FT1VUOgorCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZndjaGVjayk7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9ESVNBQkxFOgorCQliZmFfaW9jX2Rpc2FibGVfY29tcChpb2MpOworCQkvKgorCQkgKiBmYWxsIHRocm91Z2gKKwkJICovCisKKwljYXNlIElPQ19FX0RFVEFDSDoKKwkJYmZhX2lvY190aW1lcl9zdG9wKGlvYyk7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9yZXNldCk7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9GV1JFQURZOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwl9Cit9CisKKy8qKgorICogUmVxdWVzdCBmb3Igc2VtYXBob3JlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9zZW13YWl0X2VudHJ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfaW9jX2h3X3NlbV9nZXQoaW9jKTsKK30KKworLyoqCisgKiBBd2FpdGluZyBzZW1hcGhvcmUgZm9yIGgvdyBpbml0aWFsemF0aW9uLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9zZW13YWl0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBpb2NfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElPQ19FX1NFTUxPQ0tFRDoKKwkJaW9jLT5yZXRyeV9jb3VudCA9IDA7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9od2luaXQpOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfRElTQUJMRToKKwkJYmZhX2lvY19od19zZW1fZ2V0X2NhbmNlbChpb2MpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZGlzYWJsZWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21faHdpbml0X2VudHJ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfaW9jX3RpbWVyX3N0YXJ0KGlvYyk7CisJYmZhX2lvY19yZXNldChpb2MsIEJGQV9GQUxTRSk7Cit9CisKKy8qKgorICogSGFyZHdhcmUgaXMgYmVpbmcgaW5pdGlhbGl6ZWQuIEludGVycnVwdHMgYXJlIGVuYWJsZWQuCisgKiBIb2xkaW5nIGhhcmR3YXJlIHNlbWFwaG9yZSBsb2NrLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9od2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBlbnVtIGlvY19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGlvYywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSU9DX0VfRldSRUFEWToKKwkJYmZhX2lvY190aW1lcl9zdG9wKGlvYyk7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9lbmFibGluZyk7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9IV0VSUk9SOgorCQliZmFfaW9jX3RpbWVyX3N0b3AoaW9jKTsKKwkJLyoKKwkJICogZmFsbCB0aHJvdWdoCisJCSAqLworCisJY2FzZSBJT0NfRV9USU1FT1VUOgorCQlpb2MtPnJldHJ5X2NvdW50Kys7CisJCWlmIChpb2MtPnJldHJ5X2NvdW50IDwgQkZBX0lPQ19IV0lOSVRfTUFYKSB7CisJCQliZmFfaW9jX3RpbWVyX3N0YXJ0KGlvYyk7CisJCQliZmFfaW9jX3Jlc2V0KGlvYywgQkZBX1RSVUUpOworCQkJYnJlYWs7CisJCX0KKworCQliZmFfaW9jX2h3X3NlbV9yZWxlYXNlKGlvYyk7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9pbml0ZmFpbCk7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9ESVNBQkxFOgorCQliZmFfaW9jX2h3X3NlbV9yZWxlYXNlKGlvYyk7CisJCWJmYV9pb2NfdGltZXJfc3RvcChpb2MpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZGlzYWJsZWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21fZW5hYmxpbmdfZW50cnkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV9pb2NfdGltZXJfc3RhcnQoaW9jKTsKKwliZmFfaW9jX3NlbmRfZW5hYmxlKGlvYyk7Cit9CisKKy8qKgorICogSG9zdCBJT0MgZnVuY3Rpb24gaXMgYmVpbmcgZW5hYmxlZCwgYXdhaXRpbmcgcmVzcG9uc2UgZnJvbSBmaXJtd2FyZS4KKyAqIFNlbWFwaG9yZSBpcyBhY3F1aXJlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21fZW5hYmxpbmcoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBlbnVtIGlvY19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGlvYywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSU9DX0VfRldSU1BfRU5BQkxFOgorCQliZmFfaW9jX3RpbWVyX3N0b3AoaW9jKTsKKwkJYmZhX2lvY19od19zZW1fcmVsZWFzZShpb2MpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZ2V0YXR0cik7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9IV0VSUk9SOgorCQliZmFfaW9jX3RpbWVyX3N0b3AoaW9jKTsKKwkJLyoKKwkJICogZmFsbCB0aHJvdWdoCisJCSAqLworCisJY2FzZSBJT0NfRV9USU1FT1VUOgorCQlpb2MtPnJldHJ5X2NvdW50Kys7CisJCWlmIChpb2MtPnJldHJ5X2NvdW50IDwgQkZBX0lPQ19IV0lOSVRfTUFYKSB7CisJCQliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaW9jX2Z3c3RhdGUsCisJCQkJICAgICAgQkZJX0lPQ19VTklOSVQpOworCQkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2h3aW5pdCk7CisJCQlicmVhazsKKwkJfQorCisJCWJmYV9pb2NfaHdfc2VtX3JlbGVhc2UoaW9jKTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2luaXRmYWlsKTsKKwkJYnJlYWs7CisKKwljYXNlIElPQ19FX0RJU0FCTEU6CisJCWJmYV9pb2NfdGltZXJfc3RvcChpb2MpOworCQliZmFfaW9jX2h3X3NlbV9yZWxlYXNlKGlvYyk7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9kaXNhYmxlZCk7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9GV1JFQURZOgorCQliZmFfaW9jX3NlbmRfZW5hYmxlKGlvYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCX0KK30KKworCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9nZXRhdHRyX2VudHJ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfaW9jX3RpbWVyX3N0YXJ0KGlvYyk7CisJYmZhX2lvY19zZW5kX2dldGF0dHIoaW9jKTsKK30KKworLyoqCisgKiBJT0MgY29uZmlndXJhdGlvbiBpbiBwcm9ncmVzcy4gVGltZXIgaXMgYWN0aXZlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9nZXRhdHRyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBpb2NfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElPQ19FX0ZXUlNQX0dFVEFUVFI6CisJCWJmYV9pb2NfdGltZXJfc3RvcChpb2MpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fb3ApOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfSFdFUlJPUjoKKwkJYmZhX2lvY190aW1lcl9zdG9wKGlvYyk7CisJCS8qCisJCSAqIGZhbGwgdGhyb3VnaAorCQkgKi8KKworCWNhc2UgSU9DX0VfVElNRU9VVDoKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2luaXRmYWlsKTsKKwkJYnJlYWs7CisKKwljYXNlIElPQ19FX0RJU0FCTEU6CisJCWJmYV9pb2NfdGltZXJfc3RvcChpb2MpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZGlzYWJsZWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21fb3BfZW50cnkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWlvYy0+Y2Jmbi0+ZW5hYmxlX2NiZm4oaW9jLT5iZmEsIEJGQV9TVEFUVVNfT0spOworCWJmYV9pb2NfaGJfbW9uaXRvcihpb2MpOworCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9vcChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gaW9jX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaW9jLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJT0NfRV9FTkFCTEU6CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9ESVNBQkxFOgorCQliZmFfaW9jX2hiX3N0b3AoaW9jKTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Rpc2FibGluZyk7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9IV0VSUk9SOgorCWNhc2UgSU9DX0VfRldSRUFEWToKKwkJLyoqCisJCSAqIEhhcmQgZXJyb3Igb3IgSU9DIHJlY292ZXJ5IGJ5IG90aGVyIGZ1bmN0aW9uLgorCQkgKiBUcmVhdCBpdCBzYW1lIGFzIGhlYXJ0YmVhdCBmYWlsdXJlLgorCQkgKi8KKwkJYmZhX2lvY19oYl9zdG9wKGlvYyk7CisJCS8qCisJCSAqICEhISBmYWxsIHRocm91Z2ggISEhCisJCSAqLworCisJY2FzZSBJT0NfRV9IQkZBSUw6CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9oYmZhaWwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21fZGlzYWJsaW5nX2VudHJ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfaW9jX2Flbl9wb3N0KGlvYywgQkZBX0lPQ19BRU5fRElTQUJMRSk7CisJYmZhX2lvY190aW1lcl9zdGFydChpb2MpOworCWJmYV9pb2Nfc2VuZF9kaXNhYmxlKGlvYyk7Cit9CisKKy8qKgorICogSU9DIGlzIGJlaW5nIGRpc2FibGVkCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NtX2Rpc2FibGluZyhzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gaW9jX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaW9jLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJT0NfRV9IV0VSUk9SOgorCWNhc2UgSU9DX0VfRldSU1BfRElTQUJMRToKKwkJYmZhX2lvY190aW1lcl9zdG9wKGlvYyk7CisJCS8qCisJCSAqICEhISBmYWxsIHRocm91Z2ggISEhCisJCSAqLworCisJY2FzZSBJT0NfRV9USU1FT1VUOgorCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZGlzYWJsZWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwl9Cit9CisKKy8qKgorICogSU9DIGRpc2FibGUgY29tcGxldGlvbiBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21fZGlzYWJsZWRfZW50cnkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV9pb2NfZGlzYWJsZV9jb21wKGlvYyk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NtX2Rpc2FibGVkKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBpb2NfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElPQ19FX0VOQUJMRToKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX3NlbXdhaXQpOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfRElTQUJMRToKKwkJaW9jLT5jYmZuLT5kaXNhYmxlX2NiZm4oaW9jLT5iZmEpOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfRldSRUFEWToKKwkJYnJlYWs7CisKKwljYXNlIElPQ19FX0RFVEFDSDoKKwkJYmZhX2lvY19maXJtd2FyZV91bmxvY2soaW9jKTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX3Jlc2V0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NtX2luaXRmYWlsX2VudHJ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlpb2MtPmNiZm4tPmVuYWJsZV9jYmZuKGlvYy0+YmZhLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKKwliZmFfaW9jX3RpbWVyX3N0YXJ0KGlvYyk7Cit9CisKKy8qKgorICogSGFyZHdhcmUgaW5pdGlhbGl6YXRpb24gZmFpbGVkLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9pbml0ZmFpbChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gaW9jX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaW9jLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJT0NfRV9ESVNBQkxFOgorCQliZmFfaW9jX3RpbWVyX3N0b3AoaW9jKTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Rpc2FibGVkKTsKKwkJYnJlYWs7CisKKwljYXNlIElPQ19FX0RFVEFDSDoKKwkJYmZhX2lvY190aW1lcl9zdG9wKGlvYyk7CisJCWJmYV9pb2NfZmlybXdhcmVfdW5sb2NrKGlvYyk7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9yZXNldCk7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9USU1FT1VUOgorCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fc2Vtd2FpdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCX0KK30KKworCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9oYmZhaWxfZW50cnkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnFlOworCXN0cnVjdCBiZmFfaW9jX2hiZmFpbF9ub3RpZnlfcyAqbm90aWZ5OworCisJLyoqCisJICogTWFyayBJT0MgYXMgZmFpbGVkIGluIGhhcmR3YXJlIGFuZCBzdG9wIGZpcm13YXJlLgorCSAqLworCWJmYV9pb2NfbHB1X3N0b3AoaW9jKTsKKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaW9jX2Z3c3RhdGUsIEJGSV9JT0NfSEJGQUlMKTsKKworCWlmIChpb2MtPnBjaWRldi5kZXZpY2VfaWQgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QpIHsKKwkJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmxsX2hhbHQsIF9fRldfSU5JVF9IQUxUX1ApOworCQkvKgorCQkgKiBXYWl0IGZvciBoYWx0IHRvIHRha2UgZWZmZWN0CisJCSAqLworCQliZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5sbF9oYWx0KTsKKwl9CisKKwkvKioKKwkgKiBOb3RpZnkgZHJpdmVyIGFuZCBjb21tb24gbW9kdWxlcyByZWdpc3RlcmVkIGZvciBub3RpZmljYXRpb24uCisJICovCisJaW9jLT5jYmZuLT5oYmZhaWxfY2Jmbihpb2MtPmJmYSk7CisJbGlzdF9mb3JfZWFjaChxZSwgJmlvYy0+aGJfbm90aWZ5X3EpIHsKKwkJbm90aWZ5ID0gKHN0cnVjdCBiZmFfaW9jX2hiZmFpbF9ub3RpZnlfcyAqKXFlOworCQlub3RpZnktPmNiZm4obm90aWZ5LT5jYmFyZyk7CisJfQorCisJLyoqCisJICogRmx1c2ggYW55IHF1ZXVlZCB1cCBtYWlsYm94IHJlcXVlc3RzLgorCSAqLworCWJmYV9pb2NfbWJveF9oYmZhaWwoaW9jKTsKKwliZmFfaW9jX2Flbl9wb3N0KGlvYywgQkZBX0lPQ19BRU5fSEJGQUlMKTsKKworCS8qKgorCSAqIFRyaWdnZXIgYXV0by1yZWNvdmVyeSBhZnRlciBhIGRlbGF5LgorCSAqLworCWlmIChpb2MtPmF1dG9fcmVjb3ZlcikgeworCQliZmFfdGltZXJfYmVnaW4oaW9jLT50aW1lcl9tb2QsICZpb2MtPmlvY190aW1lciwKKwkJCQliZmFfaW9jX3RpbWVvdXQsIGlvYywgQkZBX0lPQ19UT1ZfUkVDT1ZFUik7CisJfQorfQorCisvKioKKyAqIElPQyBoZWFydGJlYXQgZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21faGJmYWlsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBpb2NfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKworCWNhc2UgSU9DX0VfRU5BQkxFOgorCQlpb2MtPmNiZm4tPmVuYWJsZV9jYmZuKGlvYy0+YmZhLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKKwkJYnJlYWs7CisKKwljYXNlIElPQ19FX0RJU0FCTEU6CisJCWlmIChpb2MtPmF1dG9fcmVjb3ZlcikKKwkJCWJmYV9pb2NfdGltZXJfc3RvcChpb2MpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZGlzYWJsZWQpOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfVElNRU9VVDoKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX3NlbXdhaXQpOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfRldSRUFEWToKKwkJLyoqCisJCSAqIFJlY292ZXJ5IGlzIGFscmVhZHkgaW5pdGlhdGVkIGJ5IG90aGVyIGZ1bmN0aW9uLgorCQkgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJfQorfQorCisKKworLyoqCisgKiAgYmZhX2lvY19wdnQgQkZBIElPQyBwcml2YXRlIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX2Rpc2FibGVfY29tcChzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcWU7CisJc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeV9zICpub3RpZnk7CisKKwlpb2MtPmNiZm4tPmRpc2FibGVfY2Jmbihpb2MtPmJmYSk7CisKKwkvKioKKwkgKiBOb3RpZnkgY29tbW9uIG1vZHVsZXMgcmVnaXN0ZXJlZCBmb3Igbm90aWZpY2F0aW9uLgorCSAqLworCWxpc3RfZm9yX2VhY2gocWUsICZpb2MtPmhiX25vdGlmeV9xKSB7CisJCW5vdGlmeSA9IChzdHJ1Y3QgYmZhX2lvY19oYmZhaWxfbm90aWZ5X3MgKilxZTsKKwkJbm90aWZ5LT5jYmZuKG5vdGlmeS0+Y2JhcmcpOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc2VtX3RpbWVvdXQodm9pZCAqaW9jX2FyZykKK3sKKwlzdHJ1Y3QgYmZhX2lvY19zICppb2MgPSAoc3RydWN0IGJmYV9pb2NfcyAqKWlvY19hcmc7CisKKwliZmFfaW9jX2h3X3NlbV9nZXQoaW9jKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NfdXNhZ2Vfc2VtX2dldChzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJdTMyICAgICAgICByMzI7CisJaW50ICAgICAgICAgICAgIGNudCA9IDA7CisjZGVmaW5lIEJGQV9TRU1fU1BJTkNOVAkxMDAwCisKKwlkbyB7CisJCXIzMiA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLmlvY191c2FnZV9zZW1fcmVnKTsKKwkJY250Kys7CisJCWlmIChjbnQgPiBCRkFfU0VNX1NQSU5DTlQpCisJCQlicmVhazsKKwl9IHdoaWxlIChyMzIgIT0gMCk7CisJYmZhX2Fzc2VydChjbnQgPCBCRkFfU0VNX1NQSU5DTlQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY191c2FnZV9zZW1fcmVsZWFzZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmlvY191c2FnZV9zZW1fcmVnLCAxKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NfaHdfc2VtX2dldChzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJdTMyICAgICAgICByMzI7CisKKwkvKioKKwkgKiBGaXJzdCByZWFkIHRvIHRoZSBzZW1hcGhvcmUgcmVnaXN0ZXIgd2lsbCByZXR1cm4gMCwgc3Vic2VxdWVudCByZWFkcworCSAqIHdpbGwgcmV0dXJuIDEuIFNlbWFwaG9yZSBpcyByZWxlYXNlZCBieSB3cml0aW5nIDAgdG8gdGhlIHJlZ2lzdGVyCisJICovCisJcjMyID0gYmZhX3JlZ19yZWFkKGlvYy0+aW9jX3JlZ3MuaW9jX3NlbV9yZWcpOworCWlmIChyMzIgPT0gMCkgeworCQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9TRU1MT0NLRUQpOworCQlyZXR1cm47CisJfQorCisJYmZhX3RpbWVyX2JlZ2luKGlvYy0+dGltZXJfbW9kLCAmaW9jLT5zZW1fdGltZXIsIGJmYV9pb2Nfc2VtX3RpbWVvdXQsCisJCQlpb2MsIEJGQV9JT0NfVE9WKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NfaHdfc2VtX3JlbGVhc2Uoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV9yZWdfd3JpdGUoaW9jLT5pb2NfcmVncy5pb2Nfc2VtX3JlZywgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX2h3X3NlbV9nZXRfY2FuY2VsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfdGltZXJfc3RvcCgmaW9jLT5zZW1fdGltZXIpOworfQorCisvKioKKyAqIEluaXRpYWxpemUgTFBVIGxvY2FsIG1lbW9yeSAoYWthIHNlY29uZGFyeSBtZW1vcnkgLyBTUkFNKQorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19sbWVtX2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXUzMiAgICAgICAgcHNzX2N0bDsKKwlpbnQgICAgICAgICAgICAgaTsKKyNkZWZpbmUgUFNTX0xNRU1fSU5JVF9USU1FICAxMDAwMAorCisJcHNzX2N0bCA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLnBzc19jdGxfcmVnKTsKKwlwc3NfY3RsICY9IH5fX1BTU19MTUVNX1JFU0VUOworCXBzc19jdGwgfD0gX19QU1NfTE1FTV9JTklUX0VOOworCXBzc19jdGwgfD0gX19QU1NfSTJDX0NMS19ESVYoM1VMKTsgLyogaTJjIHdvcmthcm91bmQgMTIuNWtoeiBjbG9jayAqLworCWJmYV9yZWdfd3JpdGUoaW9jLT5pb2NfcmVncy5wc3NfY3RsX3JlZywgcHNzX2N0bCk7CisKKwkvKioKKwkgKiB3YWl0IGZvciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gdG8gYmUgY29tcGxldGUKKwkgKi8KKwlpID0gMDsKKwlkbyB7CisJCXBzc19jdGwgPSBiZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5wc3NfY3RsX3JlZyk7CisJCWkrKzsKKwl9IHdoaWxlICghKHBzc19jdGwgJiBfX1BTU19MTUVNX0lOSVRfRE9ORSkgJiYgKGkgPCBQU1NfTE1FTV9JTklUX1RJTUUpKTsKKworCS8qKgorCSAqIElmIG1lbW9yeSBpbml0aWFsaXphdGlvbiBpcyBub3Qgc3VjY2Vzc2Z1bCwgSU9DIHRpbWVvdXQgd2lsbCBjYXRjaAorCSAqIHN1Y2ggZmFpbHVyZXMuCisJICovCisJYmZhX2Fzc2VydChwc3NfY3RsICYgX19QU1NfTE1FTV9JTklUX0RPTkUpOworCWJmYV90cmMoaW9jLCBwc3NfY3RsKTsKKworCXBzc19jdGwgJj0gfihfX1BTU19MTUVNX0lOSVRfRE9ORSB8IF9fUFNTX0xNRU1fSU5JVF9FTik7CisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLnBzc19jdGxfcmVnLCBwc3NfY3RsKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NfbHB1X3N0YXJ0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl1MzIgICAgICAgIHBzc19jdGw7CisKKwkvKioKKwkgKiBUYWtlIHByb2Nlc3NvciBvdXQgb2YgcmVzZXQuCisJICovCisJcHNzX2N0bCA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLnBzc19jdGxfcmVnKTsKKwlwc3NfY3RsICY9IH5fX1BTU19MUFUwX1JFU0VUOworCisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLnBzc19jdGxfcmVnLCBwc3NfY3RsKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NfbHB1X3N0b3Aoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXUzMiAgICAgICAgcHNzX2N0bDsKKworCS8qKgorCSAqIFB1dCBwcm9jZXNzb3JzIGluIHJlc2V0LgorCSAqLworCXBzc19jdGwgPSBiZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5wc3NfY3RsX3JlZyk7CisJcHNzX2N0bCB8PSAoX19QU1NfTFBVMF9SRVNFVCB8IF9fUFNTX0xQVTFfUkVTRVQpOworCisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLnBzc19jdGxfcmVnLCBwc3NfY3RsKTsKK30KKworLyoqCisgKiBHZXQgZHJpdmVyIGFuZCBmaXJtd2FyZSB2ZXJzaW9ucy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2NfZnd2ZXJfZ2V0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgKmZ3aGRyKQoreworCXUzMiAgICAgICAgcGdudW0sIHBnb2ZmOworCXUzMiAgICAgICAgbG9mZiA9IDA7CisJaW50ICAgICAgICAgICAgIGk7CisJdTMyICAgICAgICpmd3NpZyA9ICh1MzIgKikgZndoZHI7CisKKwlwZ251bSA9IGJmYV9pb2Nfc21lbV9wZ251bShpb2MsIGxvZmYpOworCXBnb2ZmID0gYmZhX2lvY19zbWVtX3Bnb2ZmKGlvYywgbG9mZik7CisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmhvc3RfcGFnZV9udW1fZm4sIHBnbnVtKTsKKworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkcl9zKSAvIHNpemVvZih1MzIpKTsKKwkgICAgIGkrKykgeworCQlmd3NpZ1tpXSA9IGJmYV9tZW1fcmVhZChpb2MtPmlvY19yZWdzLnNtZW1fcGFnZV9zdGFydCwgbG9mZik7CisJCWxvZmYgKz0gc2l6ZW9mKHUzMik7CisJfQorfQorCitzdGF0aWMgdTMyICoKK2JmYV9pb2NfZndpbWdfZ2V0X2NodW5rKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdTMyIG9mZikKK3sKKwlpZiAoaW9jLT5jdGRldikKKwkJcmV0dXJuIGJmaV9pbWFnZV9jdF9nZXRfY2h1bmsob2ZmKTsKKwlyZXR1cm4gYmZpX2ltYWdlX2NiX2dldF9jaHVuayhvZmYpOworfQorCitzdGF0aWMgICAgICAgICAgdTMyCitiZmFfaW9jX2Z3aW1nX2dldF9zaXplKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKK3JldHVybiAoaW9jLT5jdGRldikgPyBiZmlfaW1hZ2VfY3Rfc2l6ZSA6IGJmaV9pbWFnZV9jYl9zaXplOworfQorCisvKioKKyAqIFJldHVybnMgVFJVRSBpZiBzYW1lLgorICovCitzdGF0aWMgICAgICAgICAgYmZhX2Jvb2xlYW5fdAorYmZhX2lvY19md3Zlcl9jbXAoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyAqZndoZHIpCit7CisJc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgKmRydl9md2hkcjsKKwlpbnQgICAgICAgICAgICAgaTsKKworCWRydl9md2hkciA9CisJCShzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyAqKWJmYV9pb2NfZndpbWdfZ2V0X2NodW5rKGlvYywgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkZJX0lPQ19NRDVTVU1fU1o7IGkrKykgeworCQlpZiAoZndoZHItPm1kNXN1bVtpXSAhPSBkcnZfZndoZHItPm1kNXN1bVtpXSkgeworCQkJYmZhX3RyYyhpb2MsIGkpOworCQkJYmZhX3RyYyhpb2MsIGZ3aGRyLT5tZDVzdW1baV0pOworCQkJYmZhX3RyYyhpb2MsIGRydl9md2hkci0+bWQ1c3VtW2ldKTsKKwkJCXJldHVybiBCRkFfRkFMU0U7CisJCX0KKwl9CisKKwliZmFfdHJjKGlvYywgZndoZHItPm1kNXN1bVswXSk7CisJcmV0dXJuIEJGQV9UUlVFOworfQorCisvKioKKyAqIFJldHVybiB0cnVlIGlmIGN1cnJlbnQgcnVubmluZyB2ZXJzaW9uIGlzIHZhbGlkLiBGaXJtd2FyZSBzaWduYXR1cmUgYW5kCisgKiBleGVjdXRpb24gY29udGV4dCAoZHJpdmVyL2Jpb3MpIG11c3QgbWF0Y2guCisgKi8KK3N0YXRpYyAgICAgICAgICBiZmFfYm9vbGVhbl90CitiZmFfaW9jX2Z3dmVyX3ZhbGlkKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyBmd2hkciwgKmRydl9md2hkcjsKKworCS8qKgorCSAqIElmIGJpb3MvZWZpIGJvb3QgKGZsYXNoIGJhc2VkKSAtLSByZXR1cm4gdHJ1ZQorCSAqLworCWlmIChiZmFfaW9jX2Z3aW1nX2dldF9zaXplKGlvYykgPCBCRkFfSU9DX0ZXSU1HX01JTlNaKQorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwliZmFfaW9jX2Z3dmVyX2dldChpb2MsICZmd2hkcik7CisJZHJ2X2Z3aGRyID0KKwkJKHN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkcl9zICopYmZhX2lvY19md2ltZ19nZXRfY2h1bmsoaW9jLCAwKTsKKworCWlmIChmd2hkci5zaWduYXR1cmUgIT0gZHJ2X2Z3aGRyLT5zaWduYXR1cmUpIHsKKwkJYmZhX3RyYyhpb2MsIGZ3aGRyLnNpZ25hdHVyZSk7CisJCWJmYV90cmMoaW9jLCBkcnZfZndoZHItPnNpZ25hdHVyZSk7CisJCXJldHVybiBCRkFfRkFMU0U7CisJfQorCisJaWYgKGZ3aGRyLmV4ZWMgIT0gZHJ2X2Z3aGRyLT5leGVjKSB7CisJCWJmYV90cmMoaW9jLCBmd2hkci5leGVjKTsKKwkJYmZhX3RyYyhpb2MsIGRydl9md2hkci0+ZXhlYyk7CisJCXJldHVybiBCRkFfRkFMU0U7CisJfQorCisJcmV0dXJuIGJmYV9pb2NfZnd2ZXJfY21wKGlvYywgJmZ3aGRyKTsKK30KKworLyoqCisgKiBSZXR1cm4gdHJ1ZSBpZiBmaXJtd2FyZSBvZiBjdXJyZW50IGRyaXZlciBtYXRjaGVzIHRoZSBydW5uaW5nIGZpcm13YXJlLgorICovCitzdGF0aWMgICAgICAgICAgYmZhX2Jvb2xlYW5fdAorYmZhX2lvY19maXJtd2FyZV9sb2NrKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwllbnVtIGJmaV9pb2Nfc3RhdGUgaW9jX2Z3c3RhdGU7CisJdTMyICAgICAgICB1c2VjbnQ7CisJc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgZndoZHI7CisKKwkvKioKKwkgKiBGaXJtd2FyZSBtYXRjaCBjaGVjayBpcyByZWxldmFudCBvbmx5IGZvciBDTkEuCisJICovCisJaWYgKCFpb2MtPmNuYSkKKwkJcmV0dXJuIEJGQV9UUlVFOworCisJLyoqCisJICogSWYgYmlvcyBib290IChmbGFzaCBiYXNlZCkgLS0gZG8gbm90IGluY3JlbWVudCB1c2FnZSBjb3VudAorCSAqLworCWlmIChiZmFfaW9jX2Z3aW1nX2dldF9zaXplKGlvYykgPCBCRkFfSU9DX0ZXSU1HX01JTlNaKQorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwliZmFfaW9jX3VzYWdlX3NlbV9nZXQoaW9jKTsKKwl1c2VjbnQgPSBiZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2VfcmVnKTsKKworCS8qKgorCSAqIElmIHVzYWdlIGNvdW50IGlzIDAsIGFsd2F5cyByZXR1cm4gVFJVRS4KKwkgKi8KKwlpZiAodXNlY250ID09IDApIHsKKwkJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmlvY191c2FnZV9yZWcsIDEpOworCQliZmFfaW9jX3VzYWdlX3NlbV9yZWxlYXNlKGlvYyk7CisJCWJmYV90cmMoaW9jLCB1c2VjbnQpOworCQlyZXR1cm4gQkZBX1RSVUU7CisJfQorCisJaW9jX2Z3c3RhdGUgPSBiZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5pb2NfZndzdGF0ZSk7CisJYmZhX3RyYyhpb2MsIGlvY19md3N0YXRlKTsKKworCS8qKgorCSAqIFVzZSBjb3VudCBjYW5ub3QgYmUgbm9uLXplcm8gYW5kIGNoaXAgaW4gdW5pbml0aWFsaXplZCBzdGF0ZS4KKwkgKi8KKwliZmFfYXNzZXJ0KGlvY19md3N0YXRlICE9IEJGSV9JT0NfVU5JTklUKTsKKworCS8qKgorCSAqIENoZWNrIGlmIGFub3RoZXIgZHJpdmVyIHdpdGggYSBkaWZmZXJlbnQgZmlybXdhcmUgaXMgYWN0aXZlCisJICovCisJYmZhX2lvY19md3Zlcl9nZXQoaW9jLCAmZndoZHIpOworCWlmICghYmZhX2lvY19md3Zlcl9jbXAoaW9jLCAmZndoZHIpKSB7CisJCWJmYV9pb2NfdXNhZ2Vfc2VtX3JlbGVhc2UoaW9jKTsKKwkJYmZhX3RyYyhpb2MsIHVzZWNudCk7CisJCXJldHVybiBCRkFfRkFMU0U7CisJfQorCisJLyoqCisJICogU2FtZSBmaXJtd2FyZSB2ZXJzaW9uLiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudC4KKwkgKi8KKwl1c2VjbnQrKzsKKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3JlZywgdXNlY250KTsKKwliZmFfaW9jX3VzYWdlX3NlbV9yZWxlYXNlKGlvYyk7CisJYmZhX3RyYyhpb2MsIHVzZWNudCk7CisJcmV0dXJuIEJGQV9UUlVFOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY19maXJtd2FyZV91bmxvY2soc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXUzMiAgICAgICAgdXNlY250OworCisJLyoqCisJICogRmlybXdhcmUgbG9jayBpcyByZWxldmFudCBvbmx5IGZvciBDTkEuCisJICogSWYgYmlvcyBib290IChmbGFzaCBiYXNlZCkgLS0gZG8gbm90IGRlY3JlbWVudCB1c2FnZSBjb3VudAorCSAqLworCWlmICghaW9jLT5jbmEgfHwgKGJmYV9pb2NfZndpbWdfZ2V0X3NpemUoaW9jKSA8IEJGQV9JT0NfRldJTUdfTUlOU1opKQorCQlyZXR1cm47CisKKwkvKioKKwkgKiBkZWNyZW1lbnQgdXNhZ2UgY291bnQKKwkgKi8KKwliZmFfaW9jX3VzYWdlX3NlbV9nZXQoaW9jKTsKKwl1c2VjbnQgPSBiZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2VfcmVnKTsKKwliZmFfYXNzZXJ0KHVzZWNudCA+IDApOworCisJdXNlY250LS07CisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmlvY191c2FnZV9yZWcsIHVzZWNudCk7CisJYmZhX3RyYyhpb2MsIHVzZWNudCk7CisKKwliZmFfaW9jX3VzYWdlX3NlbV9yZWxlYXNlKGlvYyk7Cit9CisKKy8qKgorICogQ29uZGl0aW9uYWxseSBmbHVzaCBhbnkgcGVuZGluZyBtZXNzYWdlIGZyb20gZmlybXdhcmUgYXQgc3RhcnQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX21zZ2ZsdXNoKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl1MzIgICAgICAgIHIzMjsKKworCXIzMiA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLmxwdV9tYm94X2NtZCk7CisJaWYgKHIzMikKKwkJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmxwdV9tYm94X2NtZCwgMSk7Cit9CisKKworc3RhdGljIHZvaWQKK2JmYV9pb2NfaHdpbml0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgYmZhX2Jvb2xlYW5fdCBmb3JjZSkKK3sKKwllbnVtIGJmaV9pb2Nfc3RhdGUgaW9jX2Z3c3RhdGU7CisJYmZhX2Jvb2xlYW5fdCAgIGZ3dmFsaWQ7CisKKwlpb2NfZndzdGF0ZSA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLmlvY19md3N0YXRlKTsKKworCWlmIChmb3JjZSkKKwkJaW9jX2Z3c3RhdGUgPSBCRklfSU9DX1VOSU5JVDsKKworCWJmYV90cmMoaW9jLCBpb2NfZndzdGF0ZSk7CisKKwkvKioKKwkgKiBjaGVjayBpZiBmaXJtd2FyZSBpcyB2YWxpZAorCSAqLworCWZ3dmFsaWQgPSAoaW9jX2Z3c3RhdGUgPT0gQkZJX0lPQ19VTklOSVQpID8KKwkJCUJGQV9GQUxTRSA6IGJmYV9pb2NfZnd2ZXJfdmFsaWQoaW9jKTsKKworCWlmICghZnd2YWxpZCkgeworCQliZmFfaW9jX2Jvb3QoaW9jLCBCRklfQk9PVF9UWVBFX05PUk1BTCwgaW9jLT5wY2lkZXYuZGV2aWNlX2lkKTsKKwkJcmV0dXJuOworCX0KKworCS8qKgorCSAqIElmIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uIGlzIGluIHByb2dyZXNzIChpbml0aWFsaXplZCBieSBvdGhlciBJT0MpLAorCSAqIGp1c3Qgd2FpdCBmb3IgYW4gaW5pdGlhbGl6YXRpb24gY29tcGxldGlvbiBpbnRlcnJ1cHQuCisJICovCisJaWYgKGlvY19md3N0YXRlID09IEJGSV9JT0NfSU5JVElORykgeworCQliZmFfdHJjKGlvYywgaW9jX2Z3c3RhdGUpOworCQlpb2MtPmNiZm4tPnJlc2V0X2NiZm4oaW9jLT5iZmEpOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogSWYgSU9DIGZ1bmN0aW9uIGlzIGRpc2FibGVkIGFuZCBmaXJtd2FyZSB2ZXJzaW9uIGlzIHNhbWUsCisJICoganVzdCByZS1lbmFibGUgSU9DLgorCSAqLworCWlmIChpb2NfZndzdGF0ZSA9PSBCRklfSU9DX0RJU0FCTEVEIHx8IGlvY19md3N0YXRlID09IEJGSV9JT0NfT1ApIHsKKwkJYmZhX3RyYyhpb2MsIGlvY19md3N0YXRlKTsKKworCQkvKioKKwkJICogV2hlbiB1c2luZyBNU0ktWCBhbnkgcGVuZGluZyBmaXJtd2FyZSByZWFkeSBldmVudCBzaG91bGQKKwkJICogYmUgZmx1c2hlZC4gT3RoZXJ3aXNlIE1TSS1YIGludGVycnVwdHMgYXJlIG5vdCBkZWxpdmVyZWQuCisJCSAqLworCQliZmFfaW9jX21zZ2ZsdXNoKGlvYyk7CisJCWlvYy0+Y2Jmbi0+cmVzZXRfY2Jmbihpb2MtPmJmYSk7CisJCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX0ZXUkVBRFkpOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgaC93IGZvciBhbnkgb3RoZXIgc3RhdGVzLgorCSAqLworCWJmYV9pb2NfYm9vdChpb2MsIEJGSV9CT09UX1RZUEVfTk9STUFMLCBpb2MtPnBjaWRldi5kZXZpY2VfaWQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY190aW1lb3V0KHZvaWQgKmlvY19hcmcpCit7CisJc3RydWN0IGJmYV9pb2NfcyAqaW9jID0gKHN0cnVjdCBiZmFfaW9jX3MgKilpb2NfYXJnOworCisJYmZhX3RyYyhpb2MsIDApOworCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX1RJTUVPVVQpOworfQorCit2b2lkCitiZmFfaW9jX21ib3hfc2VuZChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHZvaWQgKmlvY19tc2csIGludCBsZW4pCit7CisJdTMyICAgICAgICptc2dwID0gKHUzMiAqKSBpb2NfbXNnOworCXUzMiAgICAgICAgaTsKKworCWJmYV90cmMoaW9jLCBtc2dwWzBdKTsKKwliZmFfdHJjKGlvYywgbGVuKTsKKworCWJmYV9hc3NlcnQobGVuIDw9IEJGSV9JT0NfTVNHTEVOX01BWCk7CisKKwkvKgorCSAqIGZpcnN0IHdyaXRlIG1zZyB0byBtYWlsYm94IHJlZ2lzdGVycworCSAqLworCWZvciAoaSA9IDA7IGkgPCBsZW4gLyBzaXplb2YodTMyKTsgaSsrKQorCQliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaGZuX21ib3ggKyBpICogc2l6ZW9mKHUzMiksCisJCQkgICAgICBiZmFfb3Nfd3RvbGUobXNncFtpXSkpOworCisJZm9yICg7IGkgPCBCRklfSU9DX01TR0xFTl9NQVggLyBzaXplb2YodTMyKTsgaSsrKQorCQliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaGZuX21ib3ggKyBpICogc2l6ZW9mKHUzMiksIDApOworCisJLyoKKwkgKiB3cml0ZSAxIHRvIG1haWxib3ggQ01EIHRvIHRyaWdnZXIgTFBVIGV2ZW50CisJICovCisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmhmbl9tYm94X2NtZCwgMSk7CisJKHZvaWQpYmZhX3JlZ19yZWFkKGlvYy0+aW9jX3JlZ3MuaGZuX21ib3hfY21kKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2Nfc2VuZF9lbmFibGUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXN0cnVjdCBiZmlfaW9jX2N0cmxfcmVxX3MgZW5hYmxlX3JlcTsKKworCWJmaV9oMmlfc2V0KGVuYWJsZV9yZXEubWgsIEJGSV9NQ19JT0MsIEJGSV9JT0NfSDJJX0VOQUJMRV9SRVEsCisJCSAgICBiZmFfaW9jX3BvcnRpZChpb2MpKTsKKwllbmFibGVfcmVxLmlvY19jbGFzcyA9IGlvYy0+aW9jX21jOworCWJmYV9pb2NfbWJveF9zZW5kKGlvYywgJmVuYWJsZV9yZXEsIHNpemVvZihzdHJ1Y3QgYmZpX2lvY19jdHJsX3JlcV9zKSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NlbmRfZGlzYWJsZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJc3RydWN0IGJmaV9pb2NfY3RybF9yZXFfcyBkaXNhYmxlX3JlcTsKKworCWJmaV9oMmlfc2V0KGRpc2FibGVfcmVxLm1oLCBCRklfTUNfSU9DLCBCRklfSU9DX0gySV9ESVNBQkxFX1JFUSwKKwkJICAgIGJmYV9pb2NfcG9ydGlkKGlvYykpOworCWJmYV9pb2NfbWJveF9zZW5kKGlvYywgJmRpc2FibGVfcmVxLCBzaXplb2Yoc3RydWN0IGJmaV9pb2NfY3RybF9yZXFfcykpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY19zZW5kX2dldGF0dHIoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXN0cnVjdCBiZmlfaW9jX2dldGF0dHJfcmVxX3MgYXR0cl9yZXE7CisKKwliZmlfaDJpX3NldChhdHRyX3JlcS5taCwgQkZJX01DX0lPQywgQkZJX0lPQ19IMklfR0VUQVRUUl9SRVEsCisJCSAgICBiZmFfaW9jX3BvcnRpZChpb2MpKTsKKwliZmFfZG1hX2JlX2FkZHJfc2V0KGF0dHJfcmVxLmF0dHJfYWRkciwgaW9jLT5hdHRyX2RtYS5wYSk7CisJYmZhX2lvY19tYm94X3NlbmQoaW9jLCAmYXR0cl9yZXEsIHNpemVvZihhdHRyX3JlcSkpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY19oYl9jaGVjayh2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2lvY19zICppb2MgPSBjYmFyZzsKKwl1MzIgICAgICAgIGhiX2NvdW50OworCisJaGJfY291bnQgPSBiZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5oZWFydGJlYXQpOworCWlmIChpb2MtPmhiX2NvdW50ID09IGhiX2NvdW50KSB7CisJCWlvYy0+aGJfZmFpbCsrOworCX0gZWxzZSB7CisJCWlvYy0+aGJfY291bnQgPSBoYl9jb3VudDsKKwkJaW9jLT5oYl9mYWlsID0gMDsKKwl9CisKKwlpZiAoaW9jLT5oYl9mYWlsID49IEJGQV9JT0NfSEJfRkFJTF9NQVgpIHsKKwkJYmZhX2xvZyhpb2MtPmxvZ20sIEJGQV9MT0dfSEFMX0hFQVJUQkVBVF9GQUlMVVJFLCBoYl9jb3VudCk7CisJCWlvYy0+aGJfZmFpbCA9IDA7CisJCWJmYV9pb2NfcmVjb3Zlcihpb2MpOworCQlyZXR1cm47CisJfQorCisJYmZhX2lvY19tYm94X3BvbGwoaW9jKTsKKwliZmFfdGltZXJfYmVnaW4oaW9jLT50aW1lcl9tb2QsICZpb2MtPmlvY190aW1lciwgYmZhX2lvY19oYl9jaGVjaywgaW9jLAorCQkJQkZBX0lPQ19IQl9UT1YpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY19oYl9tb25pdG9yKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlpb2MtPmhiX2ZhaWwgPSAwOworCWlvYy0+aGJfY291bnQgPSBiZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5oZWFydGJlYXQpOworCWJmYV90aW1lcl9iZWdpbihpb2MtPnRpbWVyX21vZCwgJmlvYy0+aW9jX3RpbWVyLCBiZmFfaW9jX2hiX2NoZWNrLCBpb2MsCisJCQlCRkFfSU9DX0hCX1RPVik7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX2hiX3N0b3Aoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV90aW1lcl9zdG9wKCZpb2MtPmlvY190aW1lcik7Cit9CisKKy8qKgorICogSG9zdCB0byBMUFUgbWFpbGJveCBtZXNzYWdlIGFkZHJlc3NlcworICovCitzdGF0aWMgc3RydWN0IHsKKwl1MzIgICAgICAgIGhmbl9tYm94LCBscHVfbWJveCwgaGZuX3BnbjsKK30gaW9jcmVnX2ZucmVnW10gPSB7CisJeworCUhPU1RGTjBfTFBVX01CT1gwXzAsIExQVV9IT1NURk4wX01CT1gwXzAsIEhPU1RfUEFHRV9OVU1fRk4wfSwgeworCUhPU1RGTjFfTFBVX01CT1gwXzgsIExQVV9IT1NURk4xX01CT1gwXzgsIEhPU1RfUEFHRV9OVU1fRk4xfSwgeworCUhPU1RGTjJfTFBVX01CT1gwXzAsIExQVV9IT1NURk4yX01CT1gwXzAsIEhPU1RfUEFHRV9OVU1fRk4yfSwgeworCUhPU1RGTjNfTFBVX01CT1gwXzgsIExQVV9IT1NURk4zX01CT1gwXzgsIEhPU1RfUEFHRV9OVU1fRk4zfQorfTsKKworLyoqCisgKiBIb3N0IDwtPiBMUFUgbWFpbGJveCBjb21tYW5kL3N0YXR1cyByZWdpc3RlcnMgLSBwb3J0IDAKKyAqLworc3RhdGljIHN0cnVjdCB7CisJdTMyICAgICAgICBoZm4sIGxwdTsKK30gaW9jcmVnX21iY21kX3AwW10gPSB7CisJeworCUhPU1RGTjBfTFBVMF9NQk9YMF9DTURfU1RBVCwgTFBVMF9IT1NURk4wX01CT1gwX0NNRF9TVEFUfSwgeworCUhPU1RGTjFfTFBVMF9NQk9YMF9DTURfU1RBVCwgTFBVMF9IT1NURk4xX01CT1gwX0NNRF9TVEFUfSwgeworCUhPU1RGTjJfTFBVMF9NQk9YMF9DTURfU1RBVCwgTFBVMF9IT1NURk4yX01CT1gwX0NNRF9TVEFUfSwgeworCUhPU1RGTjNfTFBVMF9NQk9YMF9DTURfU1RBVCwgTFBVMF9IT1NURk4zX01CT1gwX0NNRF9TVEFUfQorfTsKKworLyoqCisgKiBIb3N0IDwtPiBMUFUgbWFpbGJveCBjb21tYW5kL3N0YXR1cyByZWdpc3RlcnMgLSBwb3J0IDEKKyAqLworc3RhdGljIHN0cnVjdCB7CisJdTMyICAgICAgICBoZm4sIGxwdTsKK30gaW9jcmVnX21iY21kX3AxW10gPSB7CisJeworCUhPU1RGTjBfTFBVMV9NQk9YMF9DTURfU1RBVCwgTFBVMV9IT1NURk4wX01CT1gwX0NNRF9TVEFUfSwgeworCUhPU1RGTjFfTFBVMV9NQk9YMF9DTURfU1RBVCwgTFBVMV9IT1NURk4xX01CT1gwX0NNRF9TVEFUfSwgeworCUhPU1RGTjJfTFBVMV9NQk9YMF9DTURfU1RBVCwgTFBVMV9IT1NURk4yX01CT1gwX0NNRF9TVEFUfSwgeworCUhPU1RGTjNfTFBVMV9NQk9YMF9DTURfU1RBVCwgTFBVMV9IT1NURk4zX01CT1gwX0NNRF9TVEFUfQorfTsKKworLyoqCisgKiBTaGFyZWQgSVJRIGhhbmRsaW5nIGluIElOVFggbW9kZQorICovCitzdGF0aWMgc3RydWN0IHsKKwl1MzIgICAgICAgIGlzciwgbXNrOworfSBpb2NyZWdfc2hpcnFfbmV4dFtdID0geworCXsKKwlIT1NURk4xX0lOVF9TVEFUVVMsIEhPU1RGTjFfSU5UX01TS30sIHsKKwlIT1NURk4yX0lOVF9TVEFUVVMsIEhPU1RGTjJfSU5UX01TS30sIHsKKwlIT1NURk4zX0lOVF9TVEFUVVMsIEhPU1RGTjNfSU5UX01TS30sIHsKK0hPU1RGTjBfSU5UX1NUQVRVUywgSE9TVEZOMF9JTlRfTVNLfSx9OworCitzdGF0aWMgdm9pZAorYmZhX2lvY19yZWdfaW5pdChzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJYmZhX29zX2FkZHJfdCAgIHJiOworCWludCAgICAgICAgICAgICBwY2lmbiA9IGJmYV9pb2NfcGNpZm4oaW9jKTsKKworCXJiID0gYmZhX2lvY19iYXIwKGlvYyk7CisKKwlpb2MtPmlvY19yZWdzLmhmbl9tYm94ID0gcmIgKyBpb2NyZWdfZm5yZWdbcGNpZm5dLmhmbl9tYm94OworCWlvYy0+aW9jX3JlZ3MubHB1X21ib3ggPSByYiArIGlvY3JlZ19mbnJlZ1twY2lmbl0ubHB1X21ib3g7CisJaW9jLT5pb2NfcmVncy5ob3N0X3BhZ2VfbnVtX2ZuID0gcmIgKyBpb2NyZWdfZm5yZWdbcGNpZm5dLmhmbl9wZ247CisKKwlpZiAoaW9jLT5wb3J0X2lkID09IDApIHsKKwkJaW9jLT5pb2NfcmVncy5oZWFydGJlYXQgPSByYiArIEJGQV9JT0MwX0hCRUFUX1JFRzsKKwkJaW9jLT5pb2NfcmVncy5pb2NfZndzdGF0ZSA9IHJiICsgQkZBX0lPQzBfU1RBVEVfUkVHOworCQlpb2MtPmlvY19yZWdzLmhmbl9tYm94X2NtZCA9IHJiICsgaW9jcmVnX21iY21kX3AwW3BjaWZuXS5oZm47CisJCWlvYy0+aW9jX3JlZ3MubHB1X21ib3hfY21kID0gcmIgKyBpb2NyZWdfbWJjbWRfcDBbcGNpZm5dLmxwdTsKKwkJaW9jLT5pb2NfcmVncy5sbF9oYWx0ID0gcmIgKyBGV19JTklUX0hBTFRfUDA7CisJfSBlbHNlIHsKKwkJaW9jLT5pb2NfcmVncy5oZWFydGJlYXQgPSAocmIgKyBCRkFfSU9DMV9IQkVBVF9SRUcpOworCQlpb2MtPmlvY19yZWdzLmlvY19md3N0YXRlID0gKHJiICsgQkZBX0lPQzFfU1RBVEVfUkVHKTsKKwkJaW9jLT5pb2NfcmVncy5oZm5fbWJveF9jbWQgPSByYiArIGlvY3JlZ19tYmNtZF9wMVtwY2lmbl0uaGZuOworCQlpb2MtPmlvY19yZWdzLmxwdV9tYm94X2NtZCA9IHJiICsgaW9jcmVnX21iY21kX3AxW3BjaWZuXS5scHU7CisJCWlvYy0+aW9jX3JlZ3MubGxfaGFsdCA9IHJiICsgRldfSU5JVF9IQUxUX1AxOworCX0KKworCS8qKgorCSAqIFNoYXJlZCBJUlEgaGFuZGxpbmcgaW4gSU5UWCBtb2RlCisJICovCisJaW9jLT5pb2NfcmVncy5zaGlycV9pc3JfbmV4dCA9IHJiICsgaW9jcmVnX3NoaXJxX25leHRbcGNpZm5dLmlzcjsKKwlpb2MtPmlvY19yZWdzLnNoaXJxX21za19uZXh0ID0gcmIgKyBpb2NyZWdfc2hpcnFfbmV4dFtwY2lmbl0ubXNrOworCisJLyoKKwkgKiBQU1MgY29udHJvbCByZWdpc3RlcnMKKwkgKi8KKwlpb2MtPmlvY19yZWdzLnBzc19jdGxfcmVnID0gKHJiICsgUFNTX0NUTF9SRUcpOworCWlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9mYXN0X2N0bF9yZWcgPSAocmIgKyBBUFBfUExMXzQyNV9DVExfUkVHKTsKKwlpb2MtPmlvY19yZWdzLmFwcF9wbGxfc2xvd19jdGxfcmVnID0gKHJiICsgQVBQX1BMTF8zMTJfQ1RMX1JFRyk7CisKKwkvKgorCSAqIElPQyBzZW1hcGhvcmUgcmVnaXN0ZXJzIGFuZCBzZXJpYWxpemF0aW9uCisJICovCisJaW9jLT5pb2NfcmVncy5pb2Nfc2VtX3JlZyA9IChyYiArIEhPU1RfU0VNMF9SRUcpOworCWlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3NlbV9yZWcgPSAocmIgKyBIT1NUX1NFTTFfUkVHKTsKKwlpb2MtPmlvY19yZWdzLmlvY191c2FnZV9yZWcgPSAocmIgKyBCRkFfRldfVVNFX0NPVU5UKTsKKworCS8qKgorCSAqIHNyYW0gbWVtb3J5IGFjY2VzcworCSAqLworCWlvYy0+aW9jX3JlZ3Muc21lbV9wYWdlX3N0YXJ0ID0gKHJiICsgUFNTX1NNRU1fUEFHRV9TVEFSVCk7CisJaW9jLT5pb2NfcmVncy5zbWVtX3BnMCA9IEJGSV9JT0NfU01FTV9QRzBfQ0I7CisJaWYgKGlvYy0+cGNpZGV2LmRldmljZV9pZCA9PSBCRkFfUENJX0RFVklDRV9JRF9DVCkKKwkJaW9jLT5pb2NfcmVncy5zbWVtX3BnMCA9IEJGSV9JT0NfU01FTV9QRzBfQ1Q7Cit9CisKKy8qKgorICogICAgICBJbml0aWF0ZSBhIGZ1bGwgZmlybXdhcmUgZG93bmxvYWQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX2Rvd25sb2FkX2Z3KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdTMyIGJvb3RfdHlwZSwKKwkJICAgIHUzMiBib290X3BhcmFtKQoreworCXUzMiAgICAgICAqZndpbWc7CisJdTMyICAgICAgICBwZ251bSwgcGdvZmY7CisJdTMyICAgICAgICBsb2ZmID0gMDsKKwl1MzIgICAgICAgIGNodW5rbm8gPSAwOworCXUzMiAgICAgICAgaTsKKworCS8qKgorCSAqIEluaXRpYWxpemUgTE1FTSBmaXJzdCBiZWZvcmUgY29kZSBkb3dubG9hZAorCSAqLworCWJmYV9pb2NfbG1lbV9pbml0KGlvYyk7CisKKwkvKioKKwkgKiBGbGFzaCBiYXNlZCBmaXJtd2FyZSBib290CisJICovCisJYmZhX3RyYyhpb2MsIGJmYV9pb2NfZndpbWdfZ2V0X3NpemUoaW9jKSk7CisJaWYgKGJmYV9pb2NfZndpbWdfZ2V0X3NpemUoaW9jKSA8IEJGQV9JT0NfRldJTUdfTUlOU1opCisJCWJvb3RfdHlwZSA9IEJGSV9CT09UX1RZUEVfRkxBU0g7CisJZndpbWcgPSBiZmFfaW9jX2Z3aW1nX2dldF9jaHVuayhpb2MsIGNodW5rbm8pOworCWZ3aW1nW0JGSV9CT09UX1RZUEVfT0ZGIC8gc2l6ZW9mKHUzMildID0gYmZhX29zX3N3YXAzMihib290X3R5cGUpOworCWZ3aW1nW0JGSV9CT09UX1BBUkFNX09GRiAvIHNpemVvZih1MzIpXSA9CisJCWJmYV9vc19zd2FwMzIoYm9vdF9wYXJhbSk7CisKKwlwZ251bSA9IGJmYV9pb2Nfc21lbV9wZ251bShpb2MsIGxvZmYpOworCXBnb2ZmID0gYmZhX2lvY19zbWVtX3Bnb2ZmKGlvYywgbG9mZik7CisKKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbiwgcGdudW0pOworCisJZm9yIChpID0gMDsgaSA8IGJmYV9pb2NfZndpbWdfZ2V0X3NpemUoaW9jKTsgaSsrKSB7CisKKwkJaWYgKEJGQV9GTEFTSF9DSFVOS19OTyhpKSAhPSBjaHVua25vKSB7CisJCQljaHVua25vID0gQkZBX0ZMQVNIX0NIVU5LX05PKGkpOworCQkJZndpbWcgPSBiZmFfaW9jX2Z3aW1nX2dldF9jaHVuayhpb2MsCisJCQkJCUJGQV9GTEFTSF9DSFVOS19BRERSKGNodW5rbm8pKTsKKwkJfQorCisJCS8qKgorCQkgKiB3cml0ZSBzbWVtCisJCSAqLworCQliZmFfbWVtX3dyaXRlKGlvYy0+aW9jX3JlZ3Muc21lbV9wYWdlX3N0YXJ0LCBsb2ZmLAorCQkJICAgICAgZndpbWdbQkZBX0ZMQVNIX09GRlNFVF9JTl9DSFVOSyhpKV0pOworCisJCWxvZmYgKz0gc2l6ZW9mKHUzMik7CisKKwkJLyoqCisJCSAqIGhhbmRsZSBwYWdlIG9mZnNldCB3cmFwIGFyb3VuZAorCQkgKi8KKwkJbG9mZiA9IFBTU19TTUVNX1BHT0ZGKGxvZmYpOworCQlpZiAobG9mZiA9PSAwKSB7CisJCQlwZ251bSsrOworCQkJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmhvc3RfcGFnZV9udW1fZm4sIHBnbnVtKTsKKwkJfQorCX0KKworCWJmYV9yZWdfd3JpdGUoaW9jLT5pb2NfcmVncy5ob3N0X3BhZ2VfbnVtX2ZuLAorCQkgICAgICBiZmFfaW9jX3NtZW1fcGdudW0oaW9jLCAwKSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX3Jlc2V0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgYmZhX2Jvb2xlYW5fdCBmb3JjZSkKK3sKKwliZmFfaW9jX2h3aW5pdChpb2MsIGZvcmNlKTsKK30KKworLyoqCisgKiBVcGRhdGUgQkZBIGNvbmZpZ3VyYXRpb24gZnJvbSBmaXJtd2FyZSBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19nZXRhdHRyX3JlcGx5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlzdHJ1Y3QgYmZpX2lvY19hdHRyX3MgKmF0dHIgPSBpb2MtPmF0dHI7CisKKwlhdHRyLT5hZGFwdGVyX3Byb3AgPSBiZmFfb3NfbnRvaGwoYXR0ci0+YWRhcHRlcl9wcm9wKTsKKwlhdHRyLT5tYXhmcnNpemUgPSBiZmFfb3NfbnRvaHMoYXR0ci0+bWF4ZnJzaXplKTsKKworCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX0ZXUlNQX0dFVEFUVFIpOworfQorCisvKioKKyAqIEF0dGFjaCB0aW1lIGluaXRpYWxpemF0aW9uIG9mIG1ib3ggbG9naWMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX21ib3hfYXR0YWNoKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlzdHJ1Y3QgYmZhX2lvY19tYm94X21vZF9zICptb2QgPSAmaW9jLT5tYm94X21vZDsKKwlpbnQgICAgICAgICAgICAgbWM7CisKKwlJTklUX0xJU1RfSEVBRCgmbW9kLT5jbWRfcSk7CisJZm9yIChtYyA9IDA7IG1jIDwgQkZJX01DX01BWDsgbWMrKykgeworCQltb2QtPm1iaGRsclttY10uY2JmbiA9IE5VTEw7CisJCW1vZC0+bWJoZGxyW21jXS5jYmFyZyA9IGlvYy0+YmZhOworCX0KK30KKworLyoqCisgKiBNYm94IHBvbGwgdGltZXIgLS0gcmVzdGFydHMgYW55IHBlbmRpbmcgbWFpbGJveCByZXF1ZXN0cy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2NfbWJveF9wb2xsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlzdHJ1Y3QgYmZhX2lvY19tYm94X21vZF9zICptb2QgPSAmaW9jLT5tYm94X21vZDsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MgKmNtZDsKKwl1MzIgICAgICAgIHN0YXQ7CisKKwkvKioKKwkgKiBJZiBubyBjb21tYW5kIHBlbmRpbmcsIGRvIG5vdGhpbmcKKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmbW9kLT5jbWRfcSkpCisJCXJldHVybjsKKworCS8qKgorCSAqIElmIHByZXZpb3VzIGNvbW1hbmQgaXMgbm90IHlldCBmZXRjaGVkIGJ5IGZpcm13YXJlLCBkbyBub3RoaW5nCisJICovCisJc3RhdCA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLmhmbl9tYm94X2NtZCk7CisJaWYgKHN0YXQpCisJCXJldHVybjsKKworCS8qKgorCSAqIEVucXVldWUgY29tbWFuZCB0byBmaXJtd2FyZS4KKwkgKi8KKwliZmFfcV9kZXEoJm1vZC0+Y21kX3EsICZjbWQpOworCWJmYV9pb2NfbWJveF9zZW5kKGlvYywgY21kLT5tc2csIHNpemVvZihjbWQtPm1zZykpOworfQorCisvKioKKyAqIENsZWFudXAgYW55IHBlbmRpbmcgcmVxdWVzdHMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX21ib3hfaGJmYWlsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlzdHJ1Y3QgYmZhX2lvY19tYm94X21vZF9zICptb2QgPSAmaW9jLT5tYm94X21vZDsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MgKmNtZDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbW9kLT5jbWRfcSkpCisJCWJmYV9xX2RlcSgmbW9kLT5jbWRfcSwgJmNtZCk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBJT0MgdG8gcG9ydCBtYXBwaW5nLgorICovCisKKyNkZWZpbmUgRk5DX1BFUlNfRk5fU0hJRlQoX19mbikJKChfX2ZuKSAqIDgpCitzdGF0aWMgdm9pZAorYmZhX2lvY19tYXBfcG9ydChzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJYmZhX29zX2FkZHJfdCAgIHJiID0gaW9jLT5wY2lkZXYucGNpX2Jhcl9rdmE7CisJdTMyICAgICAgICByMzI7CisKKwkvKioKKwkgKiBGb3IgY3Jvc3Nib3csIHBvcnQgaWQgaXMgc2FtZSBhcyBwY2kgZnVuY3Rpb24uCisJICovCisJaWYgKGlvYy0+cGNpZGV2LmRldmljZV9pZCAhPSBCRkFfUENJX0RFVklDRV9JRF9DVCkgeworCQlpb2MtPnBvcnRfaWQgPSBiZmFfaW9jX3BjaWZuKGlvYyk7CisJCXJldHVybjsKKwl9CisKKwkvKioKKwkgKiBGb3IgY2F0YXB1bHQsIGJhc2UgcG9ydCBpZCBvbiBwZXJzb25hbGl0eSByZWdpc3RlciBhbmQgSU9DIHR5cGUKKwkgKi8KKwlyMzIgPSBiZmFfcmVnX3JlYWQocmIgKyBGTkNfUEVSU19SRUcpOworCXIzMiA+Pj0gRk5DX1BFUlNfRk5fU0hJRlQoYmZhX2lvY19wY2lmbihpb2MpKTsKKwlpb2MtPnBvcnRfaWQgPSAocjMyICYgX19GMF9QT1JUX01BUF9NSykgPj4gX19GMF9QT1JUX01BUF9TSDsKKworCWJmYV90cmMoaW9jLCBiZmFfaW9jX3BjaWZuKGlvYykpOworCWJmYV90cmMoaW9jLCBpb2MtPnBvcnRfaWQpOworfQorCisKKworLyoqCisgKiAgYmZhX2lvY19wdWJsaWMKKyAqLworCisvKioKKyogU2V0IGludGVycnVwdCBtb2RlIGZvciBhIGZ1bmN0aW9uOiBJTlRYIG9yIE1TSVgKKyAqLwordm9pZAorYmZhX2lvY19pc3JfbW9kZV9zZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBiZmFfYm9vbGVhbl90IG1zaXgpCit7CisJYmZhX29zX2FkZHJfdCAgIHJiID0gaW9jLT5wY2lkZXYucGNpX2Jhcl9rdmE7CisJdTMyICAgICAgICByMzIsIG1vZGU7CisKKwlyMzIgPSBiZmFfcmVnX3JlYWQocmIgKyBGTkNfUEVSU19SRUcpOworCWJmYV90cmMoaW9jLCByMzIpOworCisJbW9kZSA9IChyMzIgPj4gRk5DX1BFUlNfRk5fU0hJRlQoYmZhX2lvY19wY2lmbihpb2MpKSkgJgorCQlfX0YwX0lOVFhfU1RBVFVTOworCisJLyoqCisJICogSWYgYWxyZWFkeSBpbiBkZXNpcmVkIG1vZGUsIGRvIG5vdCBjaGFuZ2UgYW55dGhpbmcKKwkgKi8KKwlpZiAoIW1zaXggJiYgbW9kZSkKKwkJcmV0dXJuOworCisJaWYgKG1zaXgpCisJCW1vZGUgPSBfX0YwX0lOVFhfU1RBVFVTX01TSVg7CisJZWxzZQorCQltb2RlID0gX19GMF9JTlRYX1NUQVRVU19JTlRBOworCisJcjMyICY9IH4oX19GMF9JTlRYX1NUQVRVUyA8PCBGTkNfUEVSU19GTl9TSElGVChiZmFfaW9jX3BjaWZuKGlvYykpKTsKKwlyMzIgfD0gKG1vZGUgPDwgRk5DX1BFUlNfRk5fU0hJRlQoYmZhX2lvY19wY2lmbihpb2MpKSk7CisJYmZhX3RyYyhpb2MsIHIzMik7CisKKwliZmFfcmVnX3dyaXRlKHJiICsgRk5DX1BFUlNfUkVHLCByMzIpOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9pb2NfcGxsX2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV9vc19hZGRyX3QgICByYiA9IGlvYy0+cGNpZGV2LnBjaV9iYXJfa3ZhOworCXUzMiAgICAgICAgcGxsX3NjbGssIHBsbF9mY2xrLCByMzI7CisKKwlpZiAoaW9jLT5wY2lkZXYuZGV2aWNlX2lkID09IEJGQV9QQ0lfREVWSUNFX0lEX0NUKSB7CisJCXBsbF9zY2xrID0KKwkJCV9fQVBQX1BMTF8zMTJfRU5BQkxFIHwgX19BUFBfUExMXzMxMl9MUkVTRVROIHwKKwkJCV9fQVBQX1BMTF8zMTJfUlNFTDIwMDUwMCB8IF9fQVBQX1BMTF8zMTJfUDBfMSgwVSkgfAorCQkJX19BUFBfUExMXzMxMl9KSVRMTVQwXzEoM1UpIHwKKwkJCV9fQVBQX1BMTF8zMTJfQ05UTE1UMF8xKDFVKTsKKwkJcGxsX2ZjbGsgPQorCQkJX19BUFBfUExMXzQyNV9FTkFCTEUgfCBfX0FQUF9QTExfNDI1X0xSRVNFVE4gfAorCQkJX19BUFBfUExMXzQyNV9SU0VMMjAwNTAwIHwgX19BUFBfUExMXzQyNV9QMF8xKDBVKSB8CisJCQlfX0FQUF9QTExfNDI1X0pJVExNVDBfMSgzVSkgfAorCQkJX19BUFBfUExMXzQyNV9DTlRMTVQwXzEoMVUpOworCisJCS8qKgorCQkgKiAJRm9yIGNhdGFwdWx0LCBjaG9vc2Ugb3BlcmF0aW9uYWwgbW9kZSBGQy9GQ29FCisJCSAqLworCQlpZiAoaW9jLT5mY21vZGUpIHsKKwkJCWJmYV9yZWdfd3JpdGUoKHJiICsgT1BfTU9ERSksIDApOworCQkJYmZhX3JlZ193cml0ZSgocmIgKyBFVEhfTUFDX1NFUl9SRUcpLAorCQkJCSAgICAgIF9fQVBQX0VNU19DTUxDS1NFTCB8IF9fQVBQX0VNU19SRUZDS0JVRkVOMgorCQkJCSAgICAgIHwgX19BUFBfRU1TX0NIQU5ORUxfU0VMKTsKKwkJfSBlbHNlIHsKKwkJCWlvYy0+cGxsaW5pdCA9IEJGQV9UUlVFOworCQkJYmZhX3JlZ193cml0ZSgocmIgKyBPUF9NT0RFKSwgX19HTE9CQUxfRkNPRV9NT0RFKTsKKwkJCWJmYV9yZWdfd3JpdGUoKHJiICsgRVRIX01BQ19TRVJfUkVHKSwKKwkJCQkgICAgICBfX0FQUF9FTVNfUkVGQ0tCVUZFTjEpOworCQl9CisJfSBlbHNlIHsKKwkJcGxsX3NjbGsgPQorCQkJX19BUFBfUExMXzMxMl9FTkFCTEUgfCBfX0FQUF9QTExfMzEyX0xSRVNFVE4gfAorCQkJX19BUFBfUExMXzMxMl9QMF8xKDNVKSB8IF9fQVBQX1BMTF8zMTJfSklUTE1UMF8xKDNVKSB8CisJCQlfX0FQUF9QTExfMzEyX0NOVExNVDBfMSgzVSk7CisJCXBsbF9mY2xrID0KKwkJCV9fQVBQX1BMTF80MjVfRU5BQkxFIHwgX19BUFBfUExMXzQyNV9MUkVTRVROIHwKKwkJCV9fQVBQX1BMTF80MjVfUlNFTDIwMDUwMCB8IF9fQVBQX1BMTF80MjVfUDBfMSgzVSkgfAorCQkJX19BUFBfUExMXzQyNV9KSVRMTVQwXzEoM1UpIHwKKwkJCV9fQVBQX1BMTF80MjVfQ05UTE1UMF8xKDNVKTsKKwl9CisKKwliZmFfcmVnX3dyaXRlKChyYiArIEJGQV9JT0MwX1NUQVRFX1JFRyksIEJGSV9JT0NfVU5JTklUKTsKKwliZmFfcmVnX3dyaXRlKChyYiArIEJGQV9JT0MxX1NUQVRFX1JFRyksIEJGSV9JT0NfVU5JTklUKTsKKworCWJmYV9yZWdfd3JpdGUoKHJiICsgSE9TVEZOMF9JTlRfTVNLKSwgMHhmZmZmZmZmZlUpOworCWJmYV9yZWdfd3JpdGUoKHJiICsgSE9TVEZOMV9JTlRfTVNLKSwgMHhmZmZmZmZmZlUpOworCWJmYV9yZWdfd3JpdGUoKHJiICsgSE9TVEZOMF9JTlRfU1RBVFVTKSwgMHhmZmZmZmZmZlUpOworCWJmYV9yZWdfd3JpdGUoKHJiICsgSE9TVEZOMV9JTlRfU1RBVFVTKSwgMHhmZmZmZmZmZlUpOworCWJmYV9yZWdfd3JpdGUoKHJiICsgSE9TVEZOMF9JTlRfTVNLKSwgMHhmZmZmZmZmZlUpOworCWJmYV9yZWdfd3JpdGUoKHJiICsgSE9TVEZOMV9JTlRfTVNLKSwgMHhmZmZmZmZmZlUpOworCisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmFwcF9wbGxfc2xvd19jdGxfcmVnLAorCQkgICAgICBfX0FQUF9QTExfMzEyX0xPR0lDX1NPRlRfUkVTRVQpOworCWJmYV9yZWdfd3JpdGUoaW9jLT5pb2NfcmVncy5hcHBfcGxsX3Nsb3dfY3RsX3JlZywKKwkJICAgICAgX19BUFBfUExMXzMxMl9CWVBBU1MgfCBfX0FQUF9QTExfMzEyX0xPR0lDX1NPRlRfUkVTRVQpOworCWJmYV9yZWdfd3JpdGUoaW9jLT5pb2NfcmVncy5hcHBfcGxsX2Zhc3RfY3RsX3JlZywKKwkJICAgICAgX19BUFBfUExMXzQyNV9MT0dJQ19TT0ZUX1JFU0VUKTsKKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9mYXN0X2N0bF9yZWcsCisJCSAgICAgIF9fQVBQX1BMTF80MjVfQllQQVNTIHwgX19BUFBfUExMXzQyNV9MT0dJQ19TT0ZUX1JFU0VUKTsKKwliZmFfb3NfdWRlbGF5KDIpOworCWJmYV9yZWdfd3JpdGUoaW9jLT5pb2NfcmVncy5hcHBfcGxsX3Nsb3dfY3RsX3JlZywKKwkJICAgICAgX19BUFBfUExMXzMxMl9MT0dJQ19TT0ZUX1JFU0VUKTsKKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9mYXN0X2N0bF9yZWcsCisJCSAgICAgIF9fQVBQX1BMTF80MjVfTE9HSUNfU09GVF9SRVNFVCk7CisKKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9zbG93X2N0bF9yZWcsCisJCSAgICAgIHBsbF9zY2xrIHwgX19BUFBfUExMXzMxMl9MT0dJQ19TT0ZUX1JFU0VUKTsKKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9mYXN0X2N0bF9yZWcsCisJCSAgICAgIHBsbF9mY2xrIHwgX19BUFBfUExMXzQyNV9MT0dJQ19TT0ZUX1JFU0VUKTsKKworCS8qKgorCSAqIFdhaXQgZm9yIFBMTHMgdG8gbG9jay4KKwkgKi8KKwliZmFfb3NfdWRlbGF5KDIwMDApOworCWJmYV9yZWdfd3JpdGUoKHJiICsgSE9TVEZOMF9JTlRfU1RBVFVTKSwgMHhmZmZmZmZmZlUpOworCWJmYV9yZWdfd3JpdGUoKHJiICsgSE9TVEZOMV9JTlRfU1RBVFVTKSwgMHhmZmZmZmZmZlUpOworCisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmFwcF9wbGxfc2xvd19jdGxfcmVnLCBwbGxfc2Nsayk7CisJYmZhX3JlZ193cml0ZShpb2MtPmlvY19yZWdzLmFwcF9wbGxfZmFzdF9jdGxfcmVnLCBwbGxfZmNsayk7CisKKwlpZiAoaW9jLT5wY2lkZXYuZGV2aWNlX2lkID09IEJGQV9QQ0lfREVWSUNFX0lEX0NUKSB7CisJCWJmYV9yZWdfd3JpdGUoKHJiICsgTUJJU1RfQ1RMX1JFRyksIF9fRURSQU1fQklTVFJfU1RBUlQpOworCQliZmFfb3NfdWRlbGF5KDEwMDApOworCQlyMzIgPSBiZmFfcmVnX3JlYWQoKHJiICsgTUJJU1RfU1RBVF9SRUcpKTsKKwkJYmZhX3RyYyhpb2MsIHIzMik7CisJfQorCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogSW50ZXJmYWNlIHVzZWQgYnkgZGlhZyBtb2R1bGUgdG8gZG8gZmlybXdhcmUgYm9vdCB3aXRoIG1lbW9yeSB0ZXN0CisgKiBhcyB0aGUgZW50cnkgdmVjdG9yLgorICovCit2b2lkCitiZmFfaW9jX2Jvb3Qoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MzIgYm9vdF90eXBlLCB1MzIgYm9vdF9wYXJhbSkKK3sKKwliZmFfb3NfYWRkcl90ICAgcmI7CisKKwliZmFfaW9jX3N0YXRzKGlvYywgaW9jX2Jvb3RzKTsKKworCWlmIChiZmFfaW9jX3BsbF9pbml0KGlvYykgIT0gQkZBX1NUQVRVU19PSykKKwkJcmV0dXJuOworCisJLyoqCisJICogSW5pdGlhbGl6ZSBJT0Mgc3RhdGUgb2YgYWxsIGZ1bmN0aW9ucyBvbiBhIGNoaXAgcmVzZXQuCisJICovCisJcmIgPSBpb2MtPnBjaWRldi5wY2lfYmFyX2t2YTsKKwlpZiAoYm9vdF9wYXJhbSA9PSBCRklfQk9PVF9UWVBFX01FTVRFU1QpIHsKKwkJYmZhX3JlZ193cml0ZSgocmIgKyBCRkFfSU9DMF9TVEFURV9SRUcpLCBCRklfSU9DX01FTVRFU1QpOworCQliZmFfcmVnX3dyaXRlKChyYiArIEJGQV9JT0MxX1NUQVRFX1JFRyksIEJGSV9JT0NfTUVNVEVTVCk7CisJfSBlbHNlIHsKKwkJYmZhX3JlZ193cml0ZSgocmIgKyBCRkFfSU9DMF9TVEFURV9SRUcpLCBCRklfSU9DX0lOSVRJTkcpOworCQliZmFfcmVnX3dyaXRlKChyYiArIEJGQV9JT0MxX1NUQVRFX1JFRyksIEJGSV9JT0NfSU5JVElORyk7CisJfQorCisJYmZhX2lvY19kb3dubG9hZF9mdyhpb2MsIGJvb3RfdHlwZSwgYm9vdF9wYXJhbSk7CisKKwkvKioKKwkgKiBFbmFibGUgaW50ZXJydXB0cyBqdXN0IGJlZm9yZSBzdGFydGluZyBMUFUKKwkgKi8KKwlpb2MtPmNiZm4tPnJlc2V0X2NiZm4oaW9jLT5iZmEpOworCWJmYV9pb2NfbHB1X3N0YXJ0KGlvYyk7Cit9CisKKy8qKgorICogRW5hYmxlL2Rpc2FibGUgSU9DIGZhaWx1cmUgYXV0byByZWNvdmVyeS4KKyAqLwordm9pZAorYmZhX2lvY19hdXRvX3JlY292ZXIoYmZhX2Jvb2xlYW5fdCBhdXRvX3JlY292ZXIpCit7CisJYmZhX2F1dG9fcmVjb3ZlciA9IEJGQV9GQUxTRTsKK30KKworCitiZmFfYm9vbGVhbl90CitiZmFfaW9jX2lzX29wZXJhdGlvbmFsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlyZXR1cm4gYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX29wKTsKK30KKwordm9pZAorYmZhX2lvY19tc2dnZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICptYm1zZykKK3sKKwl1MzIgICAgICAgKm1zZ3AgPSBtYm1zZzsKKwl1MzIgICAgICAgIHIzMjsKKwlpbnQgICAgICAgICAgICAgaTsKKworCS8qKgorCSAqIHJlYWQgdGhlIE1CT1ggbXNnCisJICovCisJZm9yIChpID0gMDsgaSA8IChzaXplb2YodW5pb24gYmZpX2lvY19pMmhfbXNnX3UpIC8gc2l6ZW9mKHUzMikpOworCSAgICAgaSsrKSB7CisJCXIzMiA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLmxwdV9tYm94ICsKKwkJCQkgICBpICogc2l6ZW9mKHUzMikpOworCQltc2dwW2ldID0gYmZhX29zX2h0b25sKHIzMik7CisJfQorCisJLyoqCisJICogdHVybiBvZmYgbWFpbGJveCBpbnRlcnJ1cHQgYnkgY2xlYXJpbmcgbWFpbGJveCBzdGF0dXMKKwkgKi8KKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MubHB1X21ib3hfY21kLCAxKTsKKwliZmFfcmVnX3JlYWQoaW9jLT5pb2NfcmVncy5scHVfbWJveF9jbWQpOworfQorCit2b2lkCitiZmFfaW9jX2lzcihzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHN0cnVjdCBiZmlfbWJtc2dfcyAqbSkKK3sKKwl1bmlvbiBiZmlfaW9jX2kyaF9tc2dfdSAqbXNnOworCisJbXNnID0gKHVuaW9uIGJmaV9pb2NfaTJoX21zZ191ICopbTsKKworCWJmYV9pb2Nfc3RhdHMoaW9jLCBpb2NfaXNycyk7CisKKwlzd2l0Y2ggKG1zZy0+bWgubXNnX2lkKSB7CisJY2FzZSBCRklfSU9DX0kySF9IQkVBVDoKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9JT0NfSTJIX1JFQURZX0VWRU5UOgorCQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9GV1JFQURZKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9JT0NfSTJIX0VOQUJMRV9SRVBMWToKKwkJYmZhX2ZzbV9zZW5kX2V2ZW50KGlvYywgSU9DX0VfRldSU1BfRU5BQkxFKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9JT0NfSTJIX0RJU0FCTEVfUkVQTFk6CisJCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX0ZXUlNQX0RJU0FCTEUpOworCQlicmVhazsKKworCWNhc2UgQkZJX0lPQ19JMkhfR0VUQVRUUl9SRVBMWToKKwkJYmZhX2lvY19nZXRhdHRyX3JlcGx5KGlvYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3RyYyhpb2MsIG1zZy0+bWgubXNnX2lkKTsKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogSU9DIGF0dGFjaCB0aW1lIGluaXRpYWxpemF0aW9uIGFuZCBzZXR1cC4KKyAqCisgKiBAcGFyYW1baW5dCWlvYwltZW1vcnkgZm9yIElPQworICogQHBhcmFtW2luXQliZmEJZHJpdmVyIGluc3RhbmNlIHN0cnVjdHVyZQorICogQHBhcmFtW2luXQl0cmNtb2QJa2VybmVsIHRyYWNlIG1vZHVsZQorICogQHBhcmFtW2luXQlhZW4Ja2VybmVsIGFlbiBldmVudCBtb2R1bGUKKyAqIEBwYXJhbVtpbl0JbG9nbQlrZXJuZWwgbG9nZ2luZyBtb2R1bGUKKyAqLwordm9pZAorYmZhX2lvY19hdHRhY2goc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICpiZmEsIHN0cnVjdCBiZmFfaW9jX2NiZm5fcyAqY2JmbiwKKwkgICAgICAgc3RydWN0IGJmYV90aW1lcl9tb2RfcyAqdGltZXJfbW9kLCBzdHJ1Y3QgYmZhX3RyY19tb2RfcyAqdHJjbW9kLAorCSAgICAgICBzdHJ1Y3QgYmZhX2Flbl9zICphZW4sIHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtKQoreworCWlvYy0+YmZhID0gYmZhOworCWlvYy0+Y2JmbiA9IGNiZm47CisJaW9jLT50aW1lcl9tb2QgPSB0aW1lcl9tb2Q7CisJaW9jLT50cmNtb2QgPSB0cmNtb2Q7CisJaW9jLT5hZW4gPSBhZW47CisJaW9jLT5sb2dtID0gbG9nbTsKKwlpb2MtPmZjbW9kZSA9IEJGQV9GQUxTRTsKKwlpb2MtPnBsbGluaXQgPSBCRkFfRkFMU0U7CisJaW9jLT5kYmdfZndzYXZlX29uY2UgPSBCRkFfVFJVRTsKKworCWJmYV9pb2NfbWJveF9hdHRhY2goaW9jKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9jLT5oYl9ub3RpZnlfcSk7CisKKwliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fcmVzZXQpOworfQorCisvKioKKyAqIERyaXZlciBkZXRhY2ggdGltZSBJT0MgY2xlYW51cC4KKyAqLwordm9pZAorYmZhX2lvY19kZXRhY2goc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX0RFVEFDSCk7Cit9CisKKy8qKgorICogU2V0dXAgSU9DIFBDSSBwcm9wZXJ0aWVzLgorICoKKyAqIEBwYXJhbVtpbl0JcGNpZGV2CVBDSSBkZXZpY2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgSU9DCisgKi8KK3ZvaWQKK2JmYV9pb2NfcGNpX2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYsCisJCSBlbnVtIGJmaV9tY2xhc3MgbWMpCit7CisJaW9jLT5pb2NfbWMgPSBtYzsKKwlpb2MtPnBjaWRldiA9ICpwY2lkZXY7CisJaW9jLT5jdGRldiA9IChpb2MtPnBjaWRldi5kZXZpY2VfaWQgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QpOworCWlvYy0+Y25hID0gaW9jLT5jdGRldiAmJiAhaW9jLT5mY21vZGU7CisKKwliZmFfaW9jX21hcF9wb3J0KGlvYyk7CisJYmZhX2lvY19yZWdfaW5pdChpb2MpOworfQorCisvKioKKyAqIEluaXRpYWxpemUgSU9DIGRtYSBtZW1vcnkKKyAqCisgKiBAcGFyYW1baW5dCWRtX2t2YQlrZXJuZWwgdmlydHVhbCBhZGRyZXNzIG9mIElPQyBkbWEgbWVtb3J5CisgKiBAcGFyYW1baW5dCWRtX3BhCXBoeXNpY2FsIGFkZHJlc3Mgb2YgSU9DIGRtYSBtZW1vcnkKKyAqLwordm9pZAorYmZhX2lvY19tZW1fY2xhaW0oc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1OCAqZG1fa3ZhLCB1NjQgZG1fcGEpCit7CisJLyoqCisJICogZG1hIG1lbW9yeSBmb3IgZmlybXdhcmUgYXR0cmlidXRlCisJICovCisJaW9jLT5hdHRyX2RtYS5rdmEgPSBkbV9rdmE7CisJaW9jLT5hdHRyX2RtYS5wYSA9IGRtX3BhOworCWlvYy0+YXR0ciA9IChzdHJ1Y3QgYmZpX2lvY19hdHRyX3MgKilkbV9rdmE7Cit9CisKKy8qKgorICogUmV0dXJuIHNpemUgb2YgZG1hIG1lbW9yeSByZXF1aXJlZC4KKyAqLwordTMyCitiZmFfaW9jX21lbWluZm8odm9pZCkKK3sKKwlyZXR1cm4gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jX2F0dHJfcyksIEJGQV9ETUFfQUxJR05fU1opOworfQorCit2b2lkCitiZmFfaW9jX2VuYWJsZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJYmZhX2lvY19zdGF0cyhpb2MsIGlvY19lbmFibGVzKTsKKwlpb2MtPmRiZ19md3NhdmVfb25jZSA9IEJGQV9UUlVFOworCisJYmZhX2ZzbV9zZW5kX2V2ZW50KGlvYywgSU9DX0VfRU5BQkxFKTsKK30KKwordm9pZAorYmZhX2lvY19kaXNhYmxlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfaW9jX3N0YXRzKGlvYywgaW9jX2Rpc2FibGVzKTsKKwliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9ESVNBQkxFKTsKK30KKworLyoqCisgKiBSZXR1cm5zIG1lbW9yeSByZXF1aXJlZCBmb3Igc2F2aW5nIGZpcm13YXJlIHRyYWNlIGluIGNhc2Ugb2YgY3Jhc2guCisgKiBEcml2ZXIgbXVzdCBjYWxsIHRoaXMgaW50ZXJmYWNlIHRvIGFsbG9jYXRlIG1lbW9yeSByZXF1aXJlZCBmb3IKKyAqIGF1dG9tYXRpYyBzYXZpbmcgb2YgZmlybXdhcmUgdHJhY2UuIERyaXZlciBzaG91bGQgY2FsbAorICogYmZhX2lvY19kZWJ1Z19tZW1jbGFpbSgpIHJpZ2h0IGFmdGVyIGJmYV9pb2NfYXR0YWNoKCkgdG8gc2V0dXAgdGhpcworICogdHJhY2UgbWVtb3J5LgorICovCitpbnQKK2JmYV9pb2NfZGVidWdfdHJjc3ooYmZhX2Jvb2xlYW5fdCBhdXRvX3JlY292ZXIpCit7CityZXR1cm4gKGF1dG9fcmVjb3ZlcikgPyBCRkFfREJHX0ZXVFJDX0xFTiA6IDA7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBtZW1vcnkgZm9yIHNhdmluZyBmaXJtd2FyZSB0cmFjZS4gRHJpdmVyIG11c3QgaW5pdGlhbGl6ZQorICogdHJhY2UgbWVtb3J5IGJlZm9yZSBjYWxsIGJmYV9pb2NfZW5hYmxlKCkuCisgKi8KK3ZvaWQKK2JmYV9pb2NfZGVidWdfbWVtY2xhaW0oc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICpkYmdfZndzYXZlKQoreworCWJmYV9hc3NlcnQoaW9jLT5hdXRvX3JlY292ZXIpOworCWlvYy0+ZGJnX2Z3c2F2ZSA9IGRiZ19md3NhdmU7CisJaW9jLT5kYmdfZndzYXZlX2xlbiA9IGJmYV9pb2NfZGVidWdfdHJjc3ooaW9jLT5hdXRvX3JlY292ZXIpOworfQorCit1MzIKK2JmYV9pb2Nfc21lbV9wZ251bShzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHUzMiBmbWFkZHIpCit7CisJcmV0dXJuIFBTU19TTUVNX1BHTlVNKGlvYy0+aW9jX3JlZ3Muc21lbV9wZzAsIGZtYWRkcik7Cit9CisKK3UzMgorYmZhX2lvY19zbWVtX3Bnb2ZmKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdTMyIGZtYWRkcikKK3sKKwlyZXR1cm4gUFNTX1NNRU1fUEdPRkYoZm1hZGRyKTsKK30KKworLyoqCisgKiBSZWdpc3RlciBtYWlsYm94IG1lc3NhZ2UgaGFuZGxlciBmdW5jdGlvbnMKKyAqCisgKiBAcGFyYW1baW5dCWlvYwkJSU9DIGluc3RhbmNlCisgKiBAcGFyYW1baW5dCW1jZnVuY3MJCW1lc3NhZ2UgY2xhc3MgaGFuZGxlciBmdW5jdGlvbnMKKyAqLwordm9pZAorYmZhX2lvY19tYm94X3JlZ2lzdGVyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgYmZhX2lvY19tYm94X21jZnVuY190ICptY2Z1bmNzKQoreworCXN0cnVjdCBiZmFfaW9jX21ib3hfbW9kX3MgKm1vZCA9ICZpb2MtPm1ib3hfbW9kOworCWludCAgICAgICAgICAgICBtYzsKKworCWZvciAobWMgPSAwOyBtYyA8IEJGSV9NQ19NQVg7IG1jKyspCisJCW1vZC0+bWJoZGxyW21jXS5jYmZuID0gbWNmdW5jc1ttY107Cit9CisKKy8qKgorICogUmVnaXN0ZXIgbWFpbGJveCBtZXNzYWdlIGhhbmRsZXIgZnVuY3Rpb24sIHRvIGJlIGNhbGxlZCBieSBjb21tb24gbW9kdWxlcworICovCit2b2lkCitiZmFfaW9jX21ib3hfcmVnaXNyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBiZmlfbWNsYXNzIG1jLAorCQkgICAgYmZhX2lvY19tYm94X21jZnVuY190IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfaW9jX21ib3hfbW9kX3MgKm1vZCA9ICZpb2MtPm1ib3hfbW9kOworCisJbW9kLT5tYmhkbHJbbWNdLmNiZm4gPSBjYmZuOworCW1vZC0+bWJoZGxyW21jXS5jYmFyZyA9IGNiYXJnOworfQorCisvKioKKyAqIFF1ZXVlIGEgbWFpbGJveCBjb21tYW5kIHJlcXVlc3QgdG8gZmlybXdhcmUuIFdhaXRzIGlmIG1haWxib3ggaXMgYnVzeS4KKyAqIFJlc3BvbnNpYmlsaXR5IG9mIGNhbGxlciB0byBzZXJpYWxpemUKKyAqCisgKiBAcGFyYW1baW5dCWlvYwlJT0MgaW5zdGFuY2UKKyAqIEBwYXJhbVtpXQljbWQJTWFpbGJveCBjb21tYW5kCisgKi8KK3ZvaWQKK2JmYV9pb2NfbWJveF9xdWV1ZShzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHN0cnVjdCBiZmFfbWJveF9jbWRfcyAqY21kKQoreworCXN0cnVjdCBiZmFfaW9jX21ib3hfbW9kX3MgKm1vZCA9ICZpb2MtPm1ib3hfbW9kOworCXUzMiAgICAgICAgc3RhdDsKKworCS8qKgorCSAqIElmIGEgcHJldmlvdXMgY29tbWFuZCBpcyBwZW5kaW5nLCBxdWV1ZSBuZXcgY29tbWFuZAorCSAqLworCWlmICghbGlzdF9lbXB0eSgmbW9kLT5jbWRfcSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmY21kLT5xZSwgJm1vZC0+Y21kX3EpOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogSWYgbWFpbGJveCBpcyBidXN5LCBxdWV1ZSBjb21tYW5kIGZvciBwb2xsIHRpbWVyCisJICovCisJc3RhdCA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLmhmbl9tYm94X2NtZCk7CisJaWYgKHN0YXQpIHsKKwkJbGlzdF9hZGRfdGFpbCgmY21kLT5xZSwgJm1vZC0+Y21kX3EpOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogbWFpbGJveCBpcyBmcmVlIC0tIHF1ZXVlIGNvbW1hbmQgdG8gZmlybXdhcmUKKwkgKi8KKwliZmFfaW9jX21ib3hfc2VuZChpb2MsIGNtZC0+bXNnLCBzaXplb2YoY21kLT5tc2cpKTsKK30KKworLyoqCisgKiBIYW5kbGUgbWFpbGJveCBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQKK2JmYV9pb2NfbWJveF9pc3Ioc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXN0cnVjdCBiZmFfaW9jX21ib3hfbW9kX3MgKm1vZCA9ICZpb2MtPm1ib3hfbW9kOworCXN0cnVjdCBiZmlfbWJtc2dfcyBtOworCWludCAgICAgICAgICAgICBtYzsKKworCWJmYV9pb2NfbXNnZ2V0KGlvYywgJm0pOworCisJLyoqCisJICogVHJlYXQgSU9DIG1lc3NhZ2UgY2xhc3MgYXMgc3BlY2lhbC4KKwkgKi8KKwltYyA9IG0ubWgubXNnX2NsYXNzOworCWlmIChtYyA9PSBCRklfTUNfSU9DKSB7CisJCWJmYV9pb2NfaXNyKGlvYywgJm0pOworCQlyZXR1cm47CisJfQorCisJaWYgKChtYyA+IEJGSV9NQ19NQVgpIHx8IChtb2QtPm1iaGRsclttY10uY2JmbiA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJbW9kLT5tYmhkbHJbbWNdLmNiZm4obW9kLT5tYmhkbHJbbWNdLmNiYXJnLCAmbSk7Cit9CisKK3ZvaWQKK2JmYV9pb2NfZXJyb3JfaXNyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9IV0VSUk9SKTsKK30KKworI2lmbmRlZiBCRkFfQklPU19CVUlMRAorCisvKioKKyAqIHJldHVybiB0cnVlIGlmIElPQyBpcyBkaXNhYmxlZAorICovCitiZmFfYm9vbGVhbl90CitiZmFfaW9jX2lzX2Rpc2FibGVkKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlyZXR1cm4gKGJmYV9mc21fY21wX3N0YXRlKGlvYywgYmZhX2lvY19zbV9kaXNhYmxpbmcpCisJCXx8IGJmYV9mc21fY21wX3N0YXRlKGlvYywgYmZhX2lvY19zbV9kaXNhYmxlZCkpOworfQorCisvKioKKyAqIHJldHVybiB0cnVlIGlmIElPQyBmaXJtd2FyZSBpcyBkaWZmZXJlbnQuCisgKi8KK2JmYV9ib29sZWFuX3QKK2JmYV9pb2NfZndfbWlzbWF0Y2goc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXJldHVybiAoYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX3Jlc2V0KQorCQl8fCBiZmFfZnNtX2NtcF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZndjaGVjaykKKwkJfHwgYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX21pc21hdGNoKSk7Cit9CisKKyNkZWZpbmUgYmZhX2lvY19zdGF0ZV9kaXNhYmxlZChfX3NtKQkJXAorCSgoKF9fc20pID09IEJGSV9JT0NfVU5JTklUKSB8fAkJXAorCSAoKF9fc20pID09IEJGSV9JT0NfSU5JVElORykgfHwJCVwKKwkgKChfX3NtKSA9PSBCRklfSU9DX0hXSU5JVCkgfHwJCVwKKwkgKChfX3NtKSA9PSBCRklfSU9DX0RJU0FCTEVEKSB8fAlcCisJICgoX19zbSkgPT0gQkZJX0lPQ19IQkZBSUwpIHx8CQlcCisJICgoX19zbSkgPT0gQkZJX0lPQ19DRkdfRElTQUJMRUQpKQorCisvKioKKyAqIENoZWNrIGlmIGFkYXB0ZXIgaXMgZGlzYWJsZWQgLS0gYm90aCBJT0NzIHNob3VsZCBiZSBpbiBhIGRpc2FibGVkCisgKiBzdGF0ZS4KKyAqLworYmZhX2Jvb2xlYW5fdAorYmZhX2lvY19hZGFwdGVyX2lzX2Rpc2FibGVkKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl1MzIgICAgICAgIGlvY19zdGF0ZTsKKwliZmFfb3NfYWRkcl90ICAgcmIgPSBpb2MtPnBjaWRldi5wY2lfYmFyX2t2YTsKKworCWlmICghYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Rpc2FibGVkKSkKKwkJcmV0dXJuIEJGQV9GQUxTRTsKKworCWlvY19zdGF0ZSA9IGJmYV9yZWdfcmVhZChyYiArIEJGQV9JT0MwX1NUQVRFX1JFRyk7CisJaWYgKCFiZmFfaW9jX3N0YXRlX2Rpc2FibGVkKGlvY19zdGF0ZSkpCisJCXJldHVybiBCRkFfRkFMU0U7CisKKwlpb2Nfc3RhdGUgPSBiZmFfcmVnX3JlYWQocmIgKyBCRkFfSU9DMV9TVEFURV9SRUcpOworCWlmICghYmZhX2lvY19zdGF0ZV9kaXNhYmxlZChpb2Nfc3RhdGUpKQorCQlyZXR1cm4gQkZBX0ZBTFNFOworCisJcmV0dXJuIEJGQV9UUlVFOworfQorCisvKioKKyAqIEFkZCB0byBJT0MgaGVhcnRiZWF0IGZhaWx1cmUgbm90aWZpY2F0aW9uIHF1ZXVlLiBUbyBiZSB1c2VkIGJ5IGNvbW1vbgorICogbW9kdWxlcyBzdWNoIGFzCisgKi8KK3ZvaWQKK2JmYV9pb2NfaGJmYWlsX3JlZ2lzdGVyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywKKwkJCXN0cnVjdCBiZmFfaW9jX2hiZmFpbF9ub3RpZnlfcyAqbm90aWZ5KQoreworCWxpc3RfYWRkX3RhaWwoJm5vdGlmeS0+cWUsICZpb2MtPmhiX25vdGlmeV9xKTsKK30KKworI2RlZmluZSBCRkFfTUZHX05BTUUgIkJyb2NhZGUiCit2b2lkCitiZmFfaW9jX2dldF9hZGFwdGVyX2F0dHIoc3RydWN0IGJmYV9pb2NfcyAqaW9jLAorCQkJIHN0cnVjdCBiZmFfYWRhcHRlcl9hdHRyX3MgKmFkX2F0dHIpCit7CisJc3RydWN0IGJmaV9pb2NfYXR0cl9zICppb2NfYXR0cjsKKwljaGFyICAgICAgICAgICAgbW9kZWxbQkZBX0FEQVBURVJfTU9ERUxfTkFNRV9MRU5dOworCisJaW9jX2F0dHIgPSBpb2MtPmF0dHI7CisJYmZhX29zX21lbWNweSgodm9pZCAqKSZhZF9hdHRyLT5zZXJpYWxfbnVtLAorCQkgICAgICAodm9pZCAqKWlvY19hdHRyLT5icmNkX3NlcmlhbG51bSwKKwkJICAgICAgQkZBX0FEQVBURVJfU0VSSUFMX05VTV9MRU4pOworCisJYmZhX29zX21lbWNweSgmYWRfYXR0ci0+ZndfdmVyLCBpb2NfYXR0ci0+ZndfdmVyc2lvbiwgQkZBX1ZFUlNJT05fTEVOKTsKKwliZmFfb3NfbWVtY3B5KCZhZF9hdHRyLT5vcHRyb21fdmVyLCBpb2NfYXR0ci0+b3B0cm9tX3ZlcnNpb24sCisJCSAgICAgIEJGQV9WRVJTSU9OX0xFTik7CisJYmZhX29zX21lbWNweSgmYWRfYXR0ci0+bWFudWZhY3R1cmVyLCBCRkFfTUZHX05BTUUsCisJCSAgICAgIEJGQV9BREFQVEVSX01GR19OQU1FX0xFTik7CisJYmZhX29zX21lbWNweSgmYWRfYXR0ci0+dnBkLCAmaW9jX2F0dHItPnZwZCwKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBiZmFfbWZnX3ZwZF9zKSk7CisKKwlhZF9hdHRyLT5ucG9ydHMgPSBCRklfQURBUFRFUl9HRVRQKE5QT1JUUywgaW9jX2F0dHItPmFkYXB0ZXJfcHJvcCk7CisJYWRfYXR0ci0+bWF4X3NwZWVkID0gQkZJX0FEQVBURVJfR0VUUChTUEVFRCwgaW9jX2F0dHItPmFkYXB0ZXJfcHJvcCk7CisKKwkvKioKKwkgKiBtb2RlbCBuYW1lCisJICovCisJaWYgKEJGSV9BREFQVEVSX0dFVFAoU1BFRUQsIGlvY19hdHRyLT5hZGFwdGVyX3Byb3ApID09IDEwKSB7CisJCXN0cmNweShtb2RlbCwgIkJSLTEwPzAiKTsKKwkJbW9kZWxbNV0gPSAnMCcgKyBhZF9hdHRyLT5ucG9ydHM7CisJfSBlbHNlIHsKKwkJc3RyY3B5KG1vZGVsLCAiQnJvY2FkZS0/PzUiKTsKKwkJbW9kZWxbOF0gPQorCQkJJzAnICsgQkZJX0FEQVBURVJfR0VUUChTUEVFRCwgaW9jX2F0dHItPmFkYXB0ZXJfcHJvcCk7CisJCW1vZGVsWzldID0gJzAnICsgYWRfYXR0ci0+bnBvcnRzOworCX0KKworCWlmIChCRklfQURBUFRFUl9JU19TUEVDSUFMKGlvY19hdHRyLT5hZGFwdGVyX3Byb3ApKQorCQlhZF9hdHRyLT5wcm90b3R5cGUgPSAxOworCWVsc2UKKwkJYWRfYXR0ci0+cHJvdG90eXBlID0gMDsKKworCWJmYV9vc19tZW1jcHkoJmFkX2F0dHItPm1vZGVsLCBtb2RlbCwgQkZBX0FEQVBURVJfTU9ERUxfTkFNRV9MRU4pOworCWJmYV9vc19tZW1jcHkoJmFkX2F0dHItPm1vZGVsX2Rlc2NyLCAmYWRfYXR0ci0+bW9kZWwsCisJCSAgICAgIEJGQV9BREFQVEVSX01PREVMX05BTUVfTEVOKTsKKworCWFkX2F0dHItPnB3d24gPSBiZmFfaW9jX2dldF9wd3duKGlvYyk7CisJYWRfYXR0ci0+bWFjID0gYmZhX2lvY19nZXRfbWFjKGlvYyk7CisKKwlhZF9hdHRyLT5wY2llX2dlbiA9IGlvY19hdHRyLT5wY2llX2dlbjsKKwlhZF9hdHRyLT5wY2llX2xhbmVzID0gaW9jX2F0dHItPnBjaWVfbGFuZXM7CisJYWRfYXR0ci0+cGNpZV9sYW5lc19vcmlnID0gaW9jX2F0dHItPnBjaWVfbGFuZXNfb3JpZzsKKwlhZF9hdHRyLT5hc2ljX3JldiA9IGlvY19hdHRyLT5hc2ljX3JldjsKKwlhZF9hdHRyLT5od192ZXJbMF0gPSAnUic7CisJYWRfYXR0ci0+aHdfdmVyWzFdID0gJ2UnOworCWFkX2F0dHItPmh3X3ZlclsyXSA9ICd2JzsKKwlhZF9hdHRyLT5od192ZXJbM10gPSAnLSc7CisJYWRfYXR0ci0+aHdfdmVyWzRdID0gaW9jX2F0dHItPmFzaWNfcmV2OworCWFkX2F0dHItPmh3X3Zlcls1XSA9ICdcMCc7CisKKwlhZF9hdHRyLT5jbmFfY2FwYWJsZSA9IGlvYy0+Y25hOworfQorCit2b2lkCitiZmFfaW9jX2dldF9hdHRyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgc3RydWN0IGJmYV9pb2NfYXR0cl9zICppb2NfYXR0cikKK3sKKwliZmFfb3NfbWVtc2V0KCh2b2lkICopaW9jX2F0dHIsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX2lvY19hdHRyX3MpKTsKKworCWlvY19hdHRyLT5zdGF0ZSA9IGJmYV9zbV90b19zdGF0ZShpb2Nfc21fdGFibGUsIGlvYy0+ZnNtKTsKKwlpb2NfYXR0ci0+cG9ydF9pZCA9IGlvYy0+cG9ydF9pZDsKKworCWlmICghaW9jLT5jdGRldikKKwkJaW9jX2F0dHItPmlvY190eXBlID0gQkZBX0lPQ19UWVBFX0ZDOworCWVsc2UgaWYgKGlvYy0+aW9jX21jID09IEJGSV9NQ19JT0NGQykKKwkJaW9jX2F0dHItPmlvY190eXBlID0gQkZBX0lPQ19UWVBFX0ZDb0U7CisJZWxzZSBpZiAoaW9jLT5pb2NfbWMgPT0gQkZJX01DX0xMKQorCQlpb2NfYXR0ci0+aW9jX3R5cGUgPSBCRkFfSU9DX1RZUEVfTEw7CisKKwliZmFfaW9jX2dldF9hZGFwdGVyX2F0dHIoaW9jLCAmaW9jX2F0dHItPmFkYXB0ZXJfYXR0cik7CisKKwlpb2NfYXR0ci0+cGNpX2F0dHIuZGV2aWNlX2lkID0gaW9jLT5wY2lkZXYuZGV2aWNlX2lkOworCWlvY19hdHRyLT5wY2lfYXR0ci5wY2lmbiA9IGlvYy0+cGNpZGV2LnBjaV9mdW5jOworCWlvY19hdHRyLT5wY2lfYXR0ci5jaGlwX3JldlswXSA9ICdSJzsKKwlpb2NfYXR0ci0+cGNpX2F0dHIuY2hpcF9yZXZbMV0gPSAnZSc7CisJaW9jX2F0dHItPnBjaV9hdHRyLmNoaXBfcmV2WzJdID0gJ3YnOworCWlvY19hdHRyLT5wY2lfYXR0ci5jaGlwX3JldlszXSA9ICctJzsKKwlpb2NfYXR0ci0+cGNpX2F0dHIuY2hpcF9yZXZbNF0gPSBpb2NfYXR0ci0+YWRhcHRlcl9hdHRyLmFzaWNfcmV2OworCWlvY19hdHRyLT5wY2lfYXR0ci5jaGlwX3Jldls1XSA9ICdcMCc7Cit9CisKKy8qKgorICogIGhhbF93d25fcHVibGljCisgKi8KK3d3bl90CitiZmFfaW9jX2dldF9wd3duKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl1bmlvbiB7CisJCXd3bl90ICAgICAgICAgICB3d247CisJCXU4ICAgICAgICAgYnl0ZVtzaXplb2Yod3duX3QpXTsKKwl9CisJdzsKKworCXcud3duID0gaW9jLT5hdHRyLT5tZmdfd3duOworCisJaWYgKGJmYV9pb2NfcG9ydGlkKGlvYykgPT0gMSkKKwkJdy5ieXRlWzddKys7CisKKwlyZXR1cm4gdy53d247Cit9CisKK3d3bl90CitiZmFfaW9jX2dldF9ud3duKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl1bmlvbiB7CisJCXd3bl90ICAgICAgICAgICB3d247CisJCXU4ICAgICAgICAgYnl0ZVtzaXplb2Yod3duX3QpXTsKKwl9CisJdzsKKworCXcud3duID0gaW9jLT5hdHRyLT5tZmdfd3duOworCisJaWYgKGJmYV9pb2NfcG9ydGlkKGlvYykgPT0gMSkKKwkJdy5ieXRlWzddKys7CisKKwl3LmJ5dGVbMF0gPSAweDIwOworCisJcmV0dXJuIHcud3duOworfQorCit3d25fdAorYmZhX2lvY19nZXRfd3duX25hYTUoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MTYgaW5zdCkKK3sKKwl1bmlvbiB7CisJCXd3bl90ICAgICAgICAgICB3d247CisJCXU4ICAgICAgICAgYnl0ZVtzaXplb2Yod3duX3QpXTsKKwl9CisJdyAgICAgICAgICAgICAgLCB3NTsKKworCWJmYV90cmMoaW9jLCBpbnN0KTsKKworCXcud3duID0gaW9jLT5hdHRyLT5tZmdfd3duOworCXc1LmJ5dGVbMF0gPSAweDUwIHwgdy5ieXRlWzJdID4+IDQ7CisJdzUuYnl0ZVsxXSA9IHcuYnl0ZVsyXSA8PCA0IHwgdy5ieXRlWzNdID4+IDQ7CisJdzUuYnl0ZVsyXSA9IHcuYnl0ZVszXSA8PCA0IHwgdy5ieXRlWzRdID4+IDQ7CisJdzUuYnl0ZVszXSA9IHcuYnl0ZVs0XSA8PCA0IHwgdy5ieXRlWzVdID4+IDQ7CisJdzUuYnl0ZVs0XSA9IHcuYnl0ZVs1XSA8PCA0IHwgdy5ieXRlWzZdID4+IDQ7CisJdzUuYnl0ZVs1XSA9IHcuYnl0ZVs2XSA8PCA0IHwgdy5ieXRlWzddID4+IDQ7CisJdzUuYnl0ZVs2XSA9IHcuYnl0ZVs3XSA8PCA0IHwgKGluc3QgJiAweDBmMDApID4+IDg7CisJdzUuYnl0ZVs3XSA9IChpbnN0ICYgMHhmZik7CisKKwlyZXR1cm4gdzUud3duOworfQorCit1NjQKK2JmYV9pb2NfZ2V0X2FkaWQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXJldHVybiBpb2MtPmF0dHItPm1mZ193d247Cit9CisKK21hY190CitiZmFfaW9jX2dldF9tYWMoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCW1hY190ICAgICAgICAgICBtYWM7CisKKwltYWMgPSBpb2MtPmF0dHItPm1mZ19tYWM7CisJbWFjLm1hY1tNQUNfQUREUkxFTiAtIDFdICs9IGJmYV9pb2NfcGNpZm4oaW9jKTsKKworCXJldHVybiBtYWM7Cit9CisKK3ZvaWQKK2JmYV9pb2Nfc2V0X2ZjbW9kZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJaW9jLT5mY21vZGUgPSBCRkFfVFJVRTsKKwlpb2MtPnBvcnRfaWQgPSBiZmFfaW9jX3BjaWZuKGlvYyk7Cit9CisKK2JmYV9ib29sZWFuX3QKK2JmYV9pb2NfZ2V0X2ZjbW9kZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJcmV0dXJuIGlvYy0+ZmNtb2RlIHx8IChpb2MtPnBjaWRldi5kZXZpY2VfaWQgIT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QpOworfQorCisvKioKKyAqIFJldHVybiB0cnVlIGlmIGludGVycnVwdCBzaG91bGQgYmUgY2xhaW1lZC4KKyAqLworYmZhX2Jvb2xlYW5fdAorYmZhX2lvY19pbnR4X2NsYWltKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl1MzIgICAgICAgIGlzciwgbXNrOworCisJLyoqCisJICogQWx3YXlzIGNsYWltIGlmIG5vdCBjYXRhcHVsdC4KKwkgKi8KKwlpZiAoIWlvYy0+Y3RkZXYpCisJCXJldHVybiBCRkFfVFJVRTsKKworCS8qKgorCSAqIEZBTFNFIGlmIG5leHQgZGV2aWNlIGlzIGNsYWltaW5nIGludGVycnVwdC4KKwkgKiBUUlVFIGlmIG5leHQgZGV2aWNlIGlzIG5vdCBpbnRlcnJ1cHRpbmcgb3Igbm90IHByZXNlbnQuCisJICovCisJbXNrID0gYmZhX3JlZ19yZWFkKGlvYy0+aW9jX3JlZ3Muc2hpcnFfbXNrX25leHQpOworCWlzciA9IGJmYV9yZWdfcmVhZChpb2MtPmlvY19yZWdzLnNoaXJxX2lzcl9uZXh0KTsKKwlyZXR1cm4gIShpc3IgJiB+bXNrKTsKK30KKworLyoqCisgKiBTZW5kIEFFTiBub3RpZmljYXRpb24KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2NfYWVuX3Bvc3Qoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBlbnVtIGJmYV9pb2NfYWVuX2V2ZW50IGV2ZW50KQoreworCXVuaW9uIGJmYV9hZW5fZGF0YV91IGFlbl9kYXRhOworCXN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtb2QgPSBpb2MtPmxvZ207CisJczMyICAgICAgICAgaW5zdF9udW0gPSAwOworCXN0cnVjdCBiZmFfaW9jX2F0dHJfcyBpb2NfYXR0cjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0NfQUVOX0hCR09PRDoKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fSU9DX0hCR09PRCwgaW5zdF9udW0pOworCQlicmVhazsKKwljYXNlIEJGQV9JT0NfQUVOX0hCRkFJTDoKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fSU9DX0hCRkFJTCwgaW5zdF9udW0pOworCQlicmVhazsKKwljYXNlIEJGQV9JT0NfQUVOX0VOQUJMRToKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fSU9DX0VOQUJMRSwgaW5zdF9udW0pOworCQlicmVhazsKKwljYXNlIEJGQV9JT0NfQUVOX0RJU0FCTEU6CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX0lPQ19ESVNBQkxFLCBpbnN0X251bSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0lPQ19BRU5fRldNSVNNQVRDSDoKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fSU9DX0ZXTUlTTUFUQ0gsIGluc3RfbnVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KCZhZW5fZGF0YS5pb2MucHd3biwgMCwgc2l6ZW9mKGFlbl9kYXRhLmlvYy5wd3duKSk7CisJbWVtc2V0KCZhZW5fZGF0YS5pb2MubWFjLCAwLCBzaXplb2YoYWVuX2RhdGEuaW9jLm1hYykpOworCWJmYV9pb2NfZ2V0X2F0dHIoaW9jLCAmaW9jX2F0dHIpOworCXN3aXRjaCAoaW9jX2F0dHIuaW9jX3R5cGUpIHsKKwljYXNlIEJGQV9JT0NfVFlQRV9GQzoKKwkJYWVuX2RhdGEuaW9jLnB3d24gPSBiZmFfaW9jX2dldF9wd3duKGlvYyk7CisJCWJyZWFrOworCWNhc2UgQkZBX0lPQ19UWVBFX0ZDb0U6CisJCWFlbl9kYXRhLmlvYy5wd3duID0gYmZhX2lvY19nZXRfcHd3bihpb2MpOworCQlhZW5fZGF0YS5pb2MubWFjID0gYmZhX2lvY19nZXRfbWFjKGlvYyk7CisJCWJyZWFrOworCWNhc2UgQkZBX0lPQ19UWVBFX0xMOgorCQlhZW5fZGF0YS5pb2MubWFjID0gYmZhX2lvY19nZXRfbWFjKGlvYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoaW9jX2F0dHIuaW9jX3R5cGUgPT0gQkZBX0lPQ19UWVBFX0ZDKTsKKwkJYnJlYWs7CisJfQorCWFlbl9kYXRhLmlvYy5pb2NfdHlwZSA9IGlvY19hdHRyLmlvY190eXBlOworfQorCisvKioKKyAqIFJldHJpZXZlIHNhdmVkIGZpcm13YXJlIHRyYWNlIGZyb20gYSBwcmlvciBJT0MgZmFpbHVyZS4KKyAqLworYmZhX3N0YXR1c190CitiZmFfaW9jX2RlYnVnX2Z3c2F2ZShzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHZvaWQgKnRyY2RhdGEsIGludCAqdHJjbGVuKQoreworCWludCAgICAgICAgICAgICB0bGVuOworCisJaWYgKGlvYy0+ZGJnX2Z3c2F2ZV9sZW4gPT0gMCkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRU5PRlNBVkU7CisKKwl0bGVuID0gKnRyY2xlbjsKKwlpZiAodGxlbiA+IGlvYy0+ZGJnX2Z3c2F2ZV9sZW4pCisJCXRsZW4gPSBpb2MtPmRiZ19md3NhdmVfbGVuOworCisJYmZhX29zX21lbWNweSh0cmNkYXRhLCBpb2MtPmRiZ19md3NhdmUsIHRsZW4pOworCSp0cmNsZW4gPSB0bGVuOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqIFJldHJpZXZlIHNhdmVkIGZpcm13YXJlIHRyYWNlIGZyb20gYSBwcmlvciBJT0MgZmFpbHVyZS4KKyAqLworYmZhX3N0YXR1c190CitiZmFfaW9jX2RlYnVnX2Z3dHJjKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqdHJjZGF0YSwgaW50ICp0cmNsZW4pCit7CisJdTMyICAgICAgICBwZ251bTsKKwl1MzIgICAgICAgIGxvZmYgPSBCRkFfREJHX0ZXVFJDX09GRihiZmFfaW9jX3BvcnRpZChpb2MpKTsKKwlpbnQgICAgICAgICAgICAgaSwgdGxlbjsKKwl1MzIgICAgICAgKnRidWYgPSB0cmNkYXRhLCByMzI7CisKKwliZmFfdHJjKGlvYywgKnRyY2xlbik7CisKKwlwZ251bSA9IGJmYV9pb2Nfc21lbV9wZ251bShpb2MsIGxvZmYpOworCWxvZmYgPSBiZmFfaW9jX3NtZW1fcGdvZmYoaW9jLCBsb2ZmKTsKKwliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbiwgcGdudW0pOworCisJdGxlbiA9ICp0cmNsZW47CisJaWYgKHRsZW4gPiBCRkFfREJHX0ZXVFJDX0xFTikKKwkJdGxlbiA9IEJGQV9EQkdfRldUUkNfTEVOOworCXRsZW4gLz0gc2l6ZW9mKHUzMik7CisKKwliZmFfdHJjKGlvYywgdGxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGxlbjsgaSsrKSB7CisJCXIzMiA9IGJmYV9tZW1fcmVhZChpb2MtPmlvY19yZWdzLnNtZW1fcGFnZV9zdGFydCwgbG9mZik7CisJCXRidWZbaV0gPSBiZmFfb3NfbnRvaGwocjMyKTsKKwkJbG9mZiArPSBzaXplb2YodTMyKTsKKworCQkvKioKKwkJICogaGFuZGxlIHBhZ2Ugb2Zmc2V0IHdyYXAgYXJvdW5kCisJCSAqLworCQlsb2ZmID0gUFNTX1NNRU1fUEdPRkYobG9mZik7CisJCWlmIChsb2ZmID09IDApIHsKKwkJCXBnbnVtKys7CisJCQliZmFfcmVnX3dyaXRlKGlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbiwgcGdudW0pOworCQl9CisJfQorCWJmYV9yZWdfd3JpdGUoaW9jLT5pb2NfcmVncy5ob3N0X3BhZ2VfbnVtX2ZuLAorCQkgICAgICBiZmFfaW9jX3NtZW1fcGdudW0oaW9jLCAwKSk7CisJYmZhX3RyYyhpb2MsIHBnbnVtKTsKKworCSp0cmNsZW4gPSB0bGVuICogc2l6ZW9mKHUzMik7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogU2F2ZSBmaXJtd2FyZSB0cmFjZSBpZiBjb25maWd1cmVkLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19kZWJ1Z19zYXZlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwlpbnQgICAgICAgICAgICAgdGxlbjsKKworCWlmIChpb2MtPmRiZ19md3NhdmVfbGVuKSB7CisJCXRsZW4gPSBpb2MtPmRiZ19md3NhdmVfbGVuOworCQliZmFfaW9jX2RlYnVnX2Z3dHJjKGlvYywgaW9jLT5kYmdfZndzYXZlLCAmdGxlbik7CisJfQorfQorCisvKioKKyAqIEZpcm13YXJlIGZhaWx1cmUgZGV0ZWN0ZWQuIFN0YXJ0IHJlY292ZXJ5IGFjdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX3JlY292ZXIoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWlmIChpb2MtPmRiZ19md3NhdmVfb25jZSkgeworCQlpb2MtPmRiZ19md3NhdmVfb25jZSA9IEJGQV9GQUxTRTsKKwkJYmZhX2lvY19kZWJ1Z19zYXZlKGlvYyk7CisJfQorCisJYmZhX2lvY19zdGF0cyhpb2MsIGlvY19oYmZhaWxzKTsKKwliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9IQkZBSUwpOworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZAorYmZhX2lvY19hZW5fcG9zdChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gYmZhX2lvY19hZW5fZXZlbnQgZXZlbnQpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX3JlY292ZXIoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV9hc3NlcnQoMCk7Cit9CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlZmQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfSU9DX0hfXworI2RlZmluZSBfX0JGQV9JT0NfSF9fCisKKyNpbmNsdWRlIDxjcy9iZmFfc20uaD4KKyNpbmNsdWRlIDxiZmkvYmZpLmg+CisjaW5jbHVkZSA8YmZpL2JmaV9pb2MuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX2Jvb3QuaD4KKyNpbmNsdWRlIDxiZmFfdGltZXIuaD4KKworLyoqCisgKiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IElPQworICovCitzdHJ1Y3QgYmZhX3BjaWRldl9zIHsKKwlpbnQgICAgICAgICAgICAgcGNpX3Nsb3Q7CisJdTggICAgICAgICBwY2lfZnVuYzsKKwl1MTYJZGV2aWNlX2lkOworCWJmYV9vc19hZGRyX3QgICBwY2lfYmFyX2t2YTsKK307CisKKy8qKgorICogU3RydWN0dXJlIHVzZWQgdG8gcmVtZW1iZXIgdGhlIERNQS1hYmxlIG1lbW9yeSBibG9jaydzIEtWQSBhbmQgUGh5c2ljYWwKKyAqIEFkZHJlc3MKKyAqLworc3RydWN0IGJmYV9kbWFfcyB7CisJdm9pZAkJKmt2YTsJLyohIEtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MJKi8KKwl1NjQJcGE7CS8qISBQaHlzaWNhbCBhZGRyZXNzCQkqLworfTsKKworI2RlZmluZSBCRkFfRE1BX0FMSUdOX1NaCTI1NgorI2RlZmluZSBCRkFfUk9VTkRVUChfbCwgX3MpCSgoKF9sKSArICgoX3MpIC0gMSkpICYgfigoX3MpIC0gMSkpCisKKworCisjZGVmaW5lIGJmYV9kbWFfYWRkcl9zZXQoZG1hX2FkZHIsIHBhKQlcCisJCV9fYmZhX2RtYV9hZGRyX3NldCgmZG1hX2FkZHIsICh1NjQpcGEpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19iZmFfZG1hX2FkZHJfc2V0KHVuaW9uIGJmaV9hZGRyX3UgKmRtYV9hZGRyLCB1NjQgcGEpCit7CisJZG1hX2FkZHItPmEzMi5hZGRyX2xvID0gKHUzMikgcGE7CisJZG1hX2FkZHItPmEzMi5hZGRyX2hpID0gKHUzMikgKGJmYV9vc191MzIocGEpKTsKK30KKworCisjZGVmaW5lIGJmYV9kbWFfYmVfYWRkcl9zZXQoZG1hX2FkZHIsIHBhKQlcCisJCV9fYmZhX2RtYV9iZV9hZGRyX3NldCgmZG1hX2FkZHIsICh1NjQpcGEpCitzdGF0aWMgaW5saW5lIHZvaWQKK19fYmZhX2RtYV9iZV9hZGRyX3NldCh1bmlvbiBiZmlfYWRkcl91ICpkbWFfYWRkciwgdTY0IHBhKQoreworCWRtYV9hZGRyLT5hMzIuYWRkcl9sbyA9ICh1MzIpIGJmYV9vc19odG9ubChwYSk7CisJZG1hX2FkZHItPmEzMi5hZGRyX2hpID0gKHUzMikgYmZhX29zX2h0b25sKGJmYV9vc191MzIocGEpKTsKK30KKworc3RydWN0IGJmYV9pb2NfcmVnc19zIHsKKwliZmFfb3NfYWRkcl90ICAgaGZuX21ib3hfY21kOworCWJmYV9vc19hZGRyX3QgICBoZm5fbWJveDsKKwliZmFfb3NfYWRkcl90ICAgbHB1X21ib3hfY21kOworCWJmYV9vc19hZGRyX3QgICBscHVfbWJveDsKKwliZmFfb3NfYWRkcl90ICAgcHNzX2N0bF9yZWc7CisJYmZhX29zX2FkZHJfdCAgIGFwcF9wbGxfZmFzdF9jdGxfcmVnOworCWJmYV9vc19hZGRyX3QgICBhcHBfcGxsX3Nsb3dfY3RsX3JlZzsKKwliZmFfb3NfYWRkcl90ICAgaW9jX3NlbV9yZWc7CisJYmZhX29zX2FkZHJfdCAgIGlvY191c2FnZV9zZW1fcmVnOworCWJmYV9vc19hZGRyX3QgICBpb2NfdXNhZ2VfcmVnOworCWJmYV9vc19hZGRyX3QgICBob3N0X3BhZ2VfbnVtX2ZuOworCWJmYV9vc19hZGRyX3QgICBoZWFydGJlYXQ7CisJYmZhX29zX2FkZHJfdCAgIGlvY19md3N0YXRlOworCWJmYV9vc19hZGRyX3QgICBsbF9oYWx0OworCWJmYV9vc19hZGRyX3QgICBzaGlycV9pc3JfbmV4dDsKKwliZmFfb3NfYWRkcl90ICAgc2hpcnFfbXNrX25leHQ7CisJYmZhX29zX2FkZHJfdCAgIHNtZW1fcGFnZV9zdGFydDsKKwl1MzIJc21lbV9wZzA7Cit9OworCisjZGVmaW5lIGJmYV9yZWdfcmVhZChfcmFkZHIpCWJmYV9vc19yZWdfcmVhZChfcmFkZHIpCisjZGVmaW5lIGJmYV9yZWdfd3JpdGUoX3JhZGRyLCBfdmFsKQliZmFfb3NfcmVnX3dyaXRlKF9yYWRkciwgX3ZhbCkKKyNkZWZpbmUgYmZhX21lbV9yZWFkKF9yYWRkciwgX29mZikJYmZhX29zX21lbV9yZWFkKF9yYWRkciwgX29mZikKKyNkZWZpbmUgYmZhX21lbV93cml0ZShfcmFkZHIsIF9vZmYsIF92YWwpCVwKKwkJCQkJYmZhX29zX21lbV93cml0ZShfcmFkZHIsIF9vZmYsIF92YWwpCisvKioKKyAqIElPQyBNYWlsYm94IHN0cnVjdHVyZXMKKyAqLworc3RydWN0IGJmYV9tYm94X2NtZF9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlxZTsKKwl1MzIJbXNnW0JGSV9JT0NfTVNHU1pdOworfTsKKworLyoqCisgKiBJT0MgbWFpbGJveCBtb2R1bGUKKyAqLwordHlwZWRlZiB2b2lkICgqYmZhX2lvY19tYm94X21jZnVuY190KSh2b2lkICpjYmFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptKTsKK3N0cnVjdCBiZmFfaW9jX21ib3hfbW9kX3MgeworCXN0cnVjdCBsaXN0X2hlYWQJY21kX3E7CQkvKiAgcGVuZGluZyBtYm94IHF1ZXVlCSovCisJaW50CQlubWNsYXNzOwkvKiAgbnVtYmVyIG9mIGhhbmRsZXJzICovCisJc3RydWN0IHsKKwkJYmZhX2lvY19tYm94X21jZnVuY190CWNiZm47CS8qICBtZXNzYWdlIGhhbmRsZXJzCSovCisJCXZvaWQJCQkqY2Jhcmc7CisJfSBtYmhkbHJbQkZJX01DX01BWF07Cit9OworCisvKioKKyAqIElPQyBjYWxsYmFjayBmdW5jdGlvbiBpbnRlcmZhY2VzCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJmYV9pb2NfZW5hYmxlX2NiZm5fdCkodm9pZCAqYmZhLCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKTsKK3R5cGVkZWYgdm9pZCAoKmJmYV9pb2NfZGlzYWJsZV9jYmZuX3QpKHZvaWQgKmJmYSk7Cit0eXBlZGVmIHZvaWQgKCpiZmFfaW9jX2hiZmFpbF9jYmZuX3QpKHZvaWQgKmJmYSk7Cit0eXBlZGVmIHZvaWQgKCpiZmFfaW9jX3Jlc2V0X2NiZm5fdCkodm9pZCAqYmZhKTsKK3N0cnVjdCBiZmFfaW9jX2NiZm5fcyB7CisJYmZhX2lvY19lbmFibGVfY2Jmbl90CWVuYWJsZV9jYmZuOworCWJmYV9pb2NfZGlzYWJsZV9jYmZuX3QJZGlzYWJsZV9jYmZuOworCWJmYV9pb2NfaGJmYWlsX2NiZm5fdAloYmZhaWxfY2JmbjsKKwliZmFfaW9jX3Jlc2V0X2NiZm5fdAlyZXNldF9jYmZuOworfTsKKworLyoqCisgKiBIZWFydGJlYXQgZmFpbHVyZSBub3RpZmljYXRpb24gcXVldWUgZWxlbWVudC4KKyAqLworc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeV9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlxZTsKKwliZmFfaW9jX2hiZmFpbF9jYmZuX3QJY2JmbjsKKwl2b2lkCQkJKmNiYXJnOworfTsKKworLyoqCisgKiBJbml0aWFsaXplIGEgaGVhcnRiZWF0IGZhaWx1cmUgbm90aWZpY2F0aW9uIHN0cnVjdHVyZQorICovCisjZGVmaW5lIGJmYV9pb2NfaGJmYWlsX2luaXQoX19ub3RpZnksIF9fY2JmbiwgX19jYmFyZykgZG8gewlcCisJKF9fbm90aWZ5KS0+Y2JmbiA9IChfX2NiZm4pOyAgICAgIFwKKwkoX19ub3RpZnkpLT5jYmFyZyA9IChfX2NiYXJnKTsgICAgICBcCit9IHdoaWxlICgwKQorCitzdHJ1Y3QgYmZhX2lvY19zIHsKKwliZmFfZnNtX3QJCWZzbTsKKwlzdHJ1Y3QgYmZhX3MJCSpiZmE7CisJc3RydWN0IGJmYV9wY2lkZXZfcwlwY2lkZXY7CisJc3RydWN0IGJmYV90aW1lcl9tb2RfcyAJKnRpbWVyX21vZDsKKwlzdHJ1Y3QgYmZhX3RpbWVyX3MgCWlvY190aW1lcjsKKwlzdHJ1Y3QgYmZhX3RpbWVyX3MgCXNlbV90aW1lcjsKKwl1MzIJCWhiX2NvdW50OworCXUzMgkJaGJfZmFpbDsKKwl1MzIJCXJldHJ5X2NvdW50OworCXN0cnVjdCBsaXN0X2hlYWQJCWhiX25vdGlmeV9xOworCXZvaWQJCQkqZGJnX2Z3c2F2ZTsKKwlpbnQJCQlkYmdfZndzYXZlX2xlbjsKKwliZmFfYm9vbGVhbl90CQlkYmdfZndzYXZlX29uY2U7CisJZW51bSBiZmlfbWNsYXNzCQlpb2NfbWM7CisJc3RydWN0IGJmYV9pb2NfcmVnc19zIAlpb2NfcmVnczsKKwlzdHJ1Y3QgYmZhX3RyY19tb2RfcwkqdHJjbW9kOworCXN0cnVjdCBiZmFfYWVuX3MJKmFlbjsKKwlzdHJ1Y3QgYmZhX2xvZ19tb2RfcwkqbG9nbTsKKwlzdHJ1Y3QgYmZhX2lvY19kcnZfc3RhdHNfcwlzdGF0czsKKwliZmFfYm9vbGVhbl90CQlhdXRvX3JlY292ZXI7CisJYmZhX2Jvb2xlYW5fdAkJZmNtb2RlOworCWJmYV9ib29sZWFuX3QJCWN0ZGV2OworCWJmYV9ib29sZWFuX3QJCWNuYTsKKwliZmFfYm9vbGVhbl90CQlwbGxpbml0OworCXU4CQkJcG9ydF9pZDsKKworCXN0cnVjdCBiZmFfZG1hX3MJYXR0cl9kbWE7CisJc3RydWN0IGJmaV9pb2NfYXR0cl9zCSphdHRyOworCXN0cnVjdCBiZmFfaW9jX2NiZm5fcwkqY2JmbjsKKwlzdHJ1Y3QgYmZhX2lvY19tYm94X21vZF9zIG1ib3hfbW9kOworfTsKKworI2RlZmluZSBiZmFfaW9jX3BjaWZuKF9faW9jKQkJKF9faW9jKS0+cGNpZGV2LnBjaV9mdW5jCisjZGVmaW5lIGJmYV9pb2NfZGV2aWQoX19pb2MpCQkoX19pb2MpLT5wY2lkZXYuZGV2aWNlX2lkCisjZGVmaW5lIGJmYV9pb2NfYmFyMChfX2lvYykJCShfX2lvYyktPnBjaWRldi5wY2lfYmFyX2t2YQorI2RlZmluZSBiZmFfaW9jX3BvcnRpZChfX2lvYykJCSgoX19pb2MpLT5wb3J0X2lkKQorI2RlZmluZSBiZmFfaW9jX2ZldGNoX3N0YXRzKF9faW9jLCBfX3N0YXRzKSBcCisJCSgoX19zdGF0cyktPmRydl9zdGF0cykgPSAoX19pb2MpLT5zdGF0cworI2RlZmluZSBiZmFfaW9jX2Nscl9zdGF0cyhfX2lvYykJXAorCQliZmFfb3NfbWVtc2V0KCYoX19pb2MpLT5zdGF0cywgMCwgc2l6ZW9mKChfX2lvYyktPnN0YXRzKSkKKyNkZWZpbmUgYmZhX2lvY19tYXhmcnNpemUoX19pb2MpCShfX2lvYyktPmF0dHItPm1heGZyc2l6ZQorI2RlZmluZSBiZmFfaW9jX3J4X2JiY3JlZGl0KF9faW9jKQkoX19pb2MpLT5hdHRyLT5yeF9iYmNyZWRpdAorI2RlZmluZSBiZmFfaW9jX3NwZWVkX3N1cChfX2lvYykJXAorCUJGSV9BREFQVEVSX0dFVFAoU1BFRUQsIChfX2lvYyktPmF0dHItPmFkYXB0ZXJfcHJvcCkKKworLyoqCisgKiBJT0MgbWFpbGJveCBpbnRlcmZhY2UKKyAqLwordm9pZCBiZmFfaW9jX21ib3hfcXVldWUoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBzdHJ1Y3QgYmZhX21ib3hfY21kX3MgKmNtZCk7Cit2b2lkIGJmYV9pb2NfbWJveF9yZWdpc3RlcihzdHJ1Y3QgYmZhX2lvY19zICppb2MsCisJCWJmYV9pb2NfbWJveF9tY2Z1bmNfdCAqbWNmdW5jcyk7Cit2b2lkIGJmYV9pb2NfbWJveF9pc3Ioc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3ZvaWQgYmZhX2lvY19tYm94X3NlbmQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICppb2NfbXNnLCBpbnQgbGVuKTsKK3ZvaWQgYmZhX2lvY19tc2dnZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICptYm1zZyk7Cit2b2lkIGJmYV9pb2NfbWJveF9yZWdpc3Ioc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBlbnVtIGJmaV9tY2xhc3MgbWMsCisJCWJmYV9pb2NfbWJveF9tY2Z1bmNfdCBjYmZuLCB2b2lkICpjYmFyZyk7CisKKy8qKgorICogSU9DIGludGVyZmFjZXMKKyAqLwordm9pZCBiZmFfaW9jX2F0dGFjaChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHZvaWQgKmJmYSwKKwkJc3RydWN0IGJmYV9pb2NfY2Jmbl9zICpjYmZuLCBzdHJ1Y3QgYmZhX3RpbWVyX21vZF9zICp0aW1lcl9tb2QsCisJCXN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QsCisJCXN0cnVjdCBiZmFfYWVuX3MgKmFlbiwgc3RydWN0IGJmYV9sb2dfbW9kX3MgKmxvZ20pOwordm9pZCBiZmFfaW9jX2RldGFjaChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwordm9pZCBiZmFfaW9jX3BjaV9pbml0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2LAorCQllbnVtIGJmaV9tY2xhc3MgbWMpOwordTMyIGJmYV9pb2NfbWVtaW5mbyh2b2lkKTsKK3ZvaWQgYmZhX2lvY19tZW1fY2xhaW0oc3RydWN0IGJmYV9pb2NfcyAqaW9jLCAgdTggKmRtX2t2YSwgdTY0IGRtX3BhKTsKK3ZvaWQgYmZhX2lvY19lbmFibGUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3ZvaWQgYmZhX2lvY19kaXNhYmxlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitiZmFfYm9vbGVhbl90IGJmYV9pb2NfaW50eF9jbGFpbShzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworCit2b2lkIGJmYV9pb2NfYm9vdChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHUzMiBib290X3R5cGUsIHUzMiBib290X3BhcmFtKTsKK3ZvaWQgYmZhX2lvY19pc3Ioc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBzdHJ1Y3QgYmZpX21ibXNnX3MgKm1zZyk7Cit2b2lkIGJmYV9pb2NfZXJyb3JfaXNyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7Cit2b2lkIGJmYV9pb2NfaXNyX21vZGVfc2V0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgYmZhX2Jvb2xlYW5fdCBpbnR4KTsKK2JmYV9zdGF0dXNfdCBiZmFfaW9jX3BsbF9pbml0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitiZmFfYm9vbGVhbl90IGJmYV9pb2NfaXNfb3BlcmF0aW9uYWwoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK2JmYV9ib29sZWFuX3QgYmZhX2lvY19pc19kaXNhYmxlZChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworYmZhX2Jvb2xlYW5fdCBiZmFfaW9jX2Z3X21pc21hdGNoKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitiZmFfYm9vbGVhbl90IGJmYV9pb2NfYWRhcHRlcl9pc19kaXNhYmxlZChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwordm9pZCBiZmFfaW9jX2NmZ19jb21wbGV0ZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwordm9pZCBiZmFfaW9jX2dldF9hdHRyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgc3RydWN0IGJmYV9pb2NfYXR0cl9zICppb2NfYXR0cik7Cit2b2lkIGJmYV9pb2NfZ2V0X2FkYXB0ZXJfYXR0cihzdHJ1Y3QgYmZhX2lvY19zICppb2MsCisJCXN0cnVjdCBiZmFfYWRhcHRlcl9hdHRyX3MgKmFkX2F0dHIpOworaW50IGJmYV9pb2NfZGVidWdfdHJjc3ooYmZhX2Jvb2xlYW5fdCBhdXRvX3JlY292ZXIpOwordm9pZCBiZmFfaW9jX2RlYnVnX21lbWNsYWltKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqZGJnX2Z3c2F2ZSk7CitiZmFfc3RhdHVzX3QgYmZhX2lvY19kZWJ1Z19md3NhdmUoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICp0cmNkYXRhLAorCQlpbnQgKnRyY2xlbik7CitiZmFfc3RhdHVzX3QgYmZhX2lvY19kZWJ1Z19md3RyYyhzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHZvaWQgKnRyY2RhdGEsCisJCQkJIGludCAqdHJjbGVuKTsKK3UzMiBiZmFfaW9jX3NtZW1fcGdudW0oc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MzIgZm1hZGRyKTsKK3UzMiBiZmFfaW9jX3NtZW1fcGdvZmYoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MzIgZm1hZGRyKTsKK3ZvaWQgYmZhX2lvY19zZXRfZmNtb2RlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitiZmFfYm9vbGVhbl90IGJmYV9pb2NfZ2V0X2ZjbW9kZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwordm9pZCBiZmFfaW9jX2hiZmFpbF9yZWdpc3RlcihzdHJ1Y3QgYmZhX2lvY19zICppb2MsCisJc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeV9zICpub3RpZnkpOworCisvKgorICogYmZhIG1mZyB3d24gQVBJIGZ1bmN0aW9ucworICovCit3d25fdCBiZmFfaW9jX2dldF9wd3duKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7Cit3d25fdCBiZmFfaW9jX2dldF9ud3duKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7Cit3d25fdCBiZmFfaW9jX2dldF93d25fbmFhNShzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHUxNiBpbnN0KTsKK21hY190IGJmYV9pb2NfZ2V0X21hYyhzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwordTY0IGJmYV9pb2NfZ2V0X2FkaWQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKKworI2VuZGlmIC8qIF9fQkZBX0lPQ19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY2ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzNTBiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY2ZjLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNzL2JmYV9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJmYV9wcml2Lmg+CisjaW5jbHVkZSA8bG9nL2JmYV9sb2dfaGFsLmg+CisjaW5jbHVkZSA8YmZpL2JmaV9ib290Lmg+CisjaW5jbHVkZSA8YmZpL2JmaV9jYnJlZy5oPgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuX2lvYy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfaW9jZmMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BjaS5oPgorI2luY2x1ZGUgImJmYV9jYWxsYmFja19wcml2LmgiCisjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKworQkZBX1RSQ19GSUxFKEhBTCwgSU9DRkMpOworCisvKioKKyAqIElPQyBsb2NhbCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIEJGQV9JT0NGQ19UT1YJCTUwMDAJLyogbXNlY3MgKi8KKworZW51bSB7CisJQkZBX0lPQ0ZDX0FDVF9OT05FCT0gMCwKKwlCRkFfSU9DRkNfQUNUX0lOSVQJPSAxLAorCUJGQV9JT0NGQ19BQ1RfU1RPUAk9IDIsCisJQkZBX0lPQ0ZDX0FDVF9ESVNBQkxFCT0gMywKK307CisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgdm9pZCBiZmFfaW9jZmNfZW5hYmxlX2NiZm4odm9pZCAqYmZhX2FyZywgZW51bSBiZmFfc3RhdHVzIHN0YXR1cyk7CitzdGF0aWMgdm9pZCBiZmFfaW9jZmNfZGlzYWJsZV9jYmZuKHZvaWQgKmJmYV9hcmcpOworc3RhdGljIHZvaWQgYmZhX2lvY2ZjX2hiZmFpbF9jYmZuKHZvaWQgKmJmYV9hcmcpOworc3RhdGljIHZvaWQgYmZhX2lvY2ZjX3Jlc2V0X2NiZm4odm9pZCAqYmZhX2FyZyk7CitzdGF0aWMgdm9pZCBiZmFfaW9jZmNfc3RhdHNfY2xlYXIodm9pZCAqYmZhX2FyZyk7CitzdGF0aWMgdm9pZCBiZmFfaW9jZmNfc3RhdHNfc3dhcChzdHJ1Y3QgYmZhX2Z3X3N0YXRzX3MgKmQsCisJCQlzdHJ1Y3QgYmZhX2Z3X3N0YXRzX3MgKnMpOworc3RhdGljIHZvaWQgYmZhX2lvY2ZjX3N0YXRzX2Nscl9jYih2b2lkICpiZmFfYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkIGJmYV9pb2NmY19zdGF0c19jbHJfdGltZW91dCh2b2lkICpiZmFfYXJnKTsKK3N0YXRpYyB2b2lkIGJmYV9pb2NmY19zdGF0c19jYih2b2lkICpiZmFfYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkIGJmYV9pb2NmY19zdGF0c190aW1lb3V0KHZvaWQgKmJmYV9hcmcpOworCitzdGF0aWMgc3RydWN0IGJmYV9pb2NfY2Jmbl9zIGJmYV9pb2NmY19jYmZuOworCisvKioKKyAqICBiZmFfaW9jX3B2dCBCRkEgSU9DIHByaXZhdGUgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQKK2JmYV9pb2NmY19jcXNfc3ooc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmRtX2xlbikKK3sKKwlpbnQgICAgICAgICAgICAgaSwgcGVyX3JlcXFfc3osIHBlcl9yc3BxX3N6OworCisJcGVyX3JlcXFfc3ogPSBCRkFfUk9VTkRVUCgoY2ZnLT5kcnZjZmcubnVtX3JlcXFfZWxlbXMgKiBCRklfTE1TR19TWiksCisJCQkJCQkJQkZBX0RNQV9BTElHTl9TWik7CisJcGVyX3JzcHFfc3ogPSBCRkFfUk9VTkRVUCgoY2ZnLT5kcnZjZmcubnVtX3JzcHFfZWxlbXMgKiBCRklfTE1TR19TWiksCisJCQkJCQkJQkZBX0RNQV9BTElHTl9TWik7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBDUSBzaXplCisJICovCisJZm9yIChpID0gMDsgaSA8IGNmZy0+ZndjZmcubnVtX2NxczsgaSsrKSB7CisJCSpkbV9sZW4gPSAqZG1fbGVuICsgcGVyX3JlcXFfc3o7CisJCSpkbV9sZW4gPSAqZG1fbGVuICsgcGVyX3JzcHFfc3o7CisJfQorCisJLyoKKwkgKiBDYWxjdWxhdGUgU2hhZG93IENJL1BJIHNpemUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5md2NmZy5udW1fY3FzOyBpKyspCisJCSpkbV9sZW4gKz0gKDIgKiBCRkFfQ0FDSEVMSU5FX1NaKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NmY19md19jZmdfc3ooc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmRtX2xlbikKK3sKKwkqZG1fbGVuICs9CisJCUJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19zKSwgQkZBX0NBQ0hFTElORV9TWik7CisJKmRtX2xlbiArPQorCQlCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmaV9pb2NmY19jZmdyc3BfcyksCisJCQkgICAgQkZBX0NBQ0hFTElORV9TWik7CisJKmRtX2xlbiArPSBCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmYV9md19zdGF0c19zKSwgQkZBX0NBQ0hFTElORV9TWik7Cit9CisKKy8qKgorICogVXNlIHRoZSBNYWlsYm94IGludGVyZmFjZSB0byBzZW5kIEJGSV9JT0NGQ19IMklfQ0ZHX1JFUQorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX3NlbmRfY2ZnKHZvaWQgKmJmYV9hcmcpCit7CisJc3RydWN0IGJmYV9zICpiZmEgPSBiZmFfYXJnOworCXN0cnVjdCBiZmFfaW9jZmNfcyAqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19yZXFfcyBjZmdfcmVxOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZnX3MgKmNmZ19pbmZvID0gaW9jZmMtPmNmZ2luZm87CisJc3RydWN0IGJmYV9pb2NmY19jZmdfcyAgKmNmZyA9ICZpb2NmYy0+Y2ZnOworCWludCAgICAgICAgICAgICBpOworCisJYmZhX2Fzc2VydChjZmctPmZ3Y2ZnLm51bV9jcXMgPD0gQkZJX0lPQ19NQVhfQ1FTKTsKKwliZmFfdHJjKGJmYSwgY2ZnLT5md2NmZy5udW1fY3FzKTsKKworCWlvY2ZjLT5jZmdkb25lID0gQkZBX0ZBTFNFOworCWJmYV9pb2NmY19yZXNldF9xdWV1ZXMoYmZhKTsKKworCS8qKgorCSAqIGluaXRpYWxpemUgSU9DIGNvbmZpZ3VyYXRpb24gaW5mbworCSAqLworCWNmZ19pbmZvLT5lbmRpYW5fc2lnID0gQkZJX0lPQ19FTkRJQU5fU0lHOworCWNmZ19pbmZvLT5udW1fY3FzID0gY2ZnLT5md2NmZy5udW1fY3FzOworCisJYmZhX2RtYV9iZV9hZGRyX3NldChjZmdfaW5mby0+Y2ZncnNwX2FkZHIsIGlvY2ZjLT5jZmdyc3BfZG1hLnBhKTsKKwliZmFfZG1hX2JlX2FkZHJfc2V0KGNmZ19pbmZvLT5zdGF0c19hZGRyLCBpb2NmYy0+c3RhdHNfcGEpOworCisJLyoqCisJICogZG1hIG1hcCBSRVEgYW5kIFJTUCBjaXJjdWxhciBxdWV1ZXMgYW5kIHNoYWRvdyBwb2ludGVycworCSAqLworCWZvciAoaSA9IDA7IGkgPCBjZmctPmZ3Y2ZnLm51bV9jcXM7IGkrKykgeworCQliZmFfZG1hX2JlX2FkZHJfc2V0KGNmZ19pbmZvLT5yZXFfY3FfYmFbaV0sCisJCQkJICAgICAgIGlvY2ZjLT5yZXFfY3FfYmFbaV0ucGEpOworCQliZmFfZG1hX2JlX2FkZHJfc2V0KGNmZ19pbmZvLT5yZXFfc2hhZG93X2NpW2ldLAorCQkJCSAgICAgICBpb2NmYy0+cmVxX2NxX3NoYWRvd19jaVtpXS5wYSk7CisJCWNmZ19pbmZvLT5yZXFfY3FfZWxlbXNbaV0gPQorCQkJYmZhX29zX2h0b25zKGNmZy0+ZHJ2Y2ZnLm51bV9yZXFxX2VsZW1zKTsKKworCQliZmFfZG1hX2JlX2FkZHJfc2V0KGNmZ19pbmZvLT5yc3BfY3FfYmFbaV0sCisJCQkJICAgICAgIGlvY2ZjLT5yc3BfY3FfYmFbaV0ucGEpOworCQliZmFfZG1hX2JlX2FkZHJfc2V0KGNmZ19pbmZvLT5yc3Bfc2hhZG93X3BpW2ldLAorCQkJCSAgICAgICBpb2NmYy0+cnNwX2NxX3NoYWRvd19waVtpXS5wYSk7CisJCWNmZ19pbmZvLT5yc3BfY3FfZWxlbXNbaV0gPQorCQkJYmZhX29zX2h0b25zKGNmZy0+ZHJ2Y2ZnLm51bV9yc3BxX2VsZW1zKTsKKwl9CisKKwkvKioKKwkgKiBkbWEgbWFwIElPQyBjb25maWd1cmF0aW9uIGl0c2VsZgorCSAqLworCWJmaV9oMmlfc2V0KGNmZ19yZXEubWgsIEJGSV9NQ19JT0NGQywgQkZJX0lPQ0ZDX0gySV9DRkdfUkVRLAorCQkJYmZhX2xwdWlkKGJmYSkpOworCWJmYV9kbWFfYmVfYWRkcl9zZXQoY2ZnX3JlcS5pb2NfY2ZnX2RtYV9hZGRyLCBpb2NmYy0+Y2ZnX2luZm8ucGEpOworCisJYmZhX2lvY19tYm94X3NlbmQoJmJmYS0+aW9jLCAmY2ZnX3JlcSwKKwkJCXNpemVvZihzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19yZXFfcykpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX2luaXRfbWVtKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCSAgICBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpCit7CisJc3RydWN0IGJmYV9pb2NmY19zCSppb2NmYyA9ICZiZmEtPmlvY2ZjOworCisJYmZhLT5iZmFkID0gYmZhZDsKKwlpb2NmYy0+YmZhID0gYmZhOworCWlvY2ZjLT5hY3Rpb24gPSBCRkFfSU9DRkNfQUNUX05PTkU7CisKKwliZmFfb3NfYXNzaWduKGlvY2ZjLT5jZmcsICpjZmcpOworCisJLyoqCisJICogSW5pdGlhbGl6ZSBjaGlwIHNwZWNpZmljIGhhbmRsZXJzLgorCSAqLworCWlmIChiZmFfaW9jX2RldmlkKCZiZmEtPmlvYykgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QpIHsKKwkJaW9jZmMtPmh3aWYuaHdfcmVnaW5pdCA9IGJmYV9od2N0X3JlZ2luaXQ7CisJCWlvY2ZjLT5od2lmLmh3X3JzcHFfYWNrID0gYmZhX2h3Y3RfcnNwcV9hY2s7CisJCWlvY2ZjLT5od2lmLmh3X21zaXhfaW5pdCA9IGJmYV9od2N0X21zaXhfaW5pdDsKKwkJaW9jZmMtPmh3aWYuaHdfbXNpeF9pbnN0YWxsID0gYmZhX2h3Y3RfbXNpeF9pbnN0YWxsOworCQlpb2NmYy0+aHdpZi5od19tc2l4X3VuaW5zdGFsbCA9IGJmYV9od2N0X21zaXhfdW5pbnN0YWxsOworCQlpb2NmYy0+aHdpZi5od19pc3JfbW9kZV9zZXQgPSBiZmFfaHdjdF9pc3JfbW9kZV9zZXQ7CisJCWlvY2ZjLT5od2lmLmh3X21zaXhfZ2V0dmVjcyA9IGJmYV9od2N0X21zaXhfZ2V0dmVjczsKKwl9IGVsc2UgeworCQlpb2NmYy0+aHdpZi5od19yZWdpbml0ID0gYmZhX2h3Y2JfcmVnaW5pdDsKKwkJaW9jZmMtPmh3aWYuaHdfcnNwcV9hY2sgPSBiZmFfaHdjYl9yc3BxX2FjazsKKwkJaW9jZmMtPmh3aWYuaHdfbXNpeF9pbml0ID0gYmZhX2h3Y2JfbXNpeF9pbml0OworCQlpb2NmYy0+aHdpZi5od19tc2l4X2luc3RhbGwgPSBiZmFfaHdjYl9tc2l4X2luc3RhbGw7CisJCWlvY2ZjLT5od2lmLmh3X21zaXhfdW5pbnN0YWxsID0gYmZhX2h3Y2JfbXNpeF91bmluc3RhbGw7CisJCWlvY2ZjLT5od2lmLmh3X2lzcl9tb2RlX3NldCA9IGJmYV9od2NiX2lzcl9tb2RlX3NldDsKKwkJaW9jZmMtPmh3aWYuaHdfbXNpeF9nZXR2ZWNzID0gYmZhX2h3Y2JfbXNpeF9nZXR2ZWNzOworCX0KKworCWlvY2ZjLT5od2lmLmh3X3JlZ2luaXQoYmZhKTsKKwliZmEtPm1zaXgubnZlY3MgPSAwOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX21lbV9jbGFpbShzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAorCQkgICAgICBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbykKK3sKKwl1OCAgICAgICAgKmRtX2t2YTsKKwl1NjQgICAgICAgIGRtX3BhOworCWludCAgICAgICAgICAgICBpLCBwZXJfcmVxcV9zeiwgcGVyX3JzcHFfc3o7CisJc3RydWN0IGJmYV9pb2NmY19zICAqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwlpbnQJCWRiZ3N6OworCisJZG1fa3ZhID0gYmZhX21lbWluZm9fZG1hX3ZpcnQobWVtaW5mbyk7CisJZG1fcGEgPSBiZmFfbWVtaW5mb19kbWFfcGh5cyhtZW1pbmZvKTsKKworCS8qCisJICogRmlyc3QgYWxsb2NhdGUgZG1hIG1lbW9yeSBmb3IgSU9DLgorCSAqLworCWJmYV9pb2NfbWVtX2NsYWltKCZiZmEtPmlvYywgZG1fa3ZhLCBkbV9wYSk7CisJZG1fa3ZhICs9IGJmYV9pb2NfbWVtaW5mbygpOworCWRtX3BhICArPSBiZmFfaW9jX21lbWluZm8oKTsKKworCS8qCisJICogQ2xhaW0gRE1BLWFibGUgbWVtb3J5IGZvciB0aGUgcmVxdWVzdC9yZXNwb25zZSBxdWV1ZXMgYW5kIGZvciBzaGFkb3cKKwkgKiBjaS9waSByZWdpc3RlcnMKKwkgKi8KKwlwZXJfcmVxcV9zeiA9IEJGQV9ST1VORFVQKChjZmctPmRydmNmZy5udW1fcmVxcV9lbGVtcyAqIEJGSV9MTVNHX1NaKSwKKwkJCQkJCQlCRkFfRE1BX0FMSUdOX1NaKTsKKwlwZXJfcnNwcV9zeiA9IEJGQV9ST1VORFVQKChjZmctPmRydmNmZy5udW1fcnNwcV9lbGVtcyAqIEJGSV9MTVNHX1NaKSwKKwkJCQkJCQlCRkFfRE1BX0FMSUdOX1NaKTsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPmZ3Y2ZnLm51bV9jcXM7IGkrKykgeworCQlpb2NmYy0+cmVxX2NxX2JhW2ldLmt2YSA9IGRtX2t2YTsKKwkJaW9jZmMtPnJlcV9jcV9iYVtpXS5wYSA9IGRtX3BhOworCQliZmFfb3NfbWVtc2V0KGRtX2t2YSwgMCwgcGVyX3JlcXFfc3opOworCQlkbV9rdmEgKz0gcGVyX3JlcXFfc3o7CisJCWRtX3BhICs9IHBlcl9yZXFxX3N6OworCisJCWlvY2ZjLT5yc3BfY3FfYmFbaV0ua3ZhID0gZG1fa3ZhOworCQlpb2NmYy0+cnNwX2NxX2JhW2ldLnBhID0gZG1fcGE7CisJCWJmYV9vc19tZW1zZXQoZG1fa3ZhLCAwLCBwZXJfcnNwcV9zeik7CisJCWRtX2t2YSArPSBwZXJfcnNwcV9zejsKKwkJZG1fcGEgKz0gcGVyX3JzcHFfc3o7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNmZy0+ZndjZmcubnVtX2NxczsgaSsrKSB7CisJCWlvY2ZjLT5yZXFfY3Ffc2hhZG93X2NpW2ldLmt2YSA9IGRtX2t2YTsKKwkJaW9jZmMtPnJlcV9jcV9zaGFkb3dfY2lbaV0ucGEgPSBkbV9wYTsKKwkJZG1fa3ZhICs9IEJGQV9DQUNIRUxJTkVfU1o7CisJCWRtX3BhICs9IEJGQV9DQUNIRUxJTkVfU1o7CisKKwkJaW9jZmMtPnJzcF9jcV9zaGFkb3dfcGlbaV0ua3ZhID0gZG1fa3ZhOworCQlpb2NmYy0+cnNwX2NxX3NoYWRvd19waVtpXS5wYSA9IGRtX3BhOworCQlkbV9rdmEgKz0gQkZBX0NBQ0hFTElORV9TWjsKKwkJZG1fcGEgKz0gQkZBX0NBQ0hFTElORV9TWjsKKwl9CisKKwkvKgorCSAqIENsYWltIERNQS1hYmxlIG1lbW9yeSBmb3IgdGhlIGNvbmZpZyBpbmZvIHBhZ2UKKwkgKi8KKwliZmEtPmlvY2ZjLmNmZ19pbmZvLmt2YSA9IGRtX2t2YTsKKwliZmEtPmlvY2ZjLmNmZ19pbmZvLnBhID0gZG1fcGE7CisJYmZhLT5pb2NmYy5jZmdpbmZvID0gKHN0cnVjdCBiZmlfaW9jZmNfY2ZnX3MgKikgZG1fa3ZhOworCWRtX2t2YSArPSBCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmaV9pb2NmY19jZmdfcyksIEJGQV9DQUNIRUxJTkVfU1opOworCWRtX3BhICs9IEJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19zKSwgQkZBX0NBQ0hFTElORV9TWik7CisKKwkvKgorCSAqIENsYWltIERNQS1hYmxlIG1lbW9yeSBmb3IgdGhlIGNvbmZpZyByZXNwb25zZQorCSAqLworCWJmYS0+aW9jZmMuY2ZncnNwX2RtYS5rdmEgPSBkbV9rdmE7CisJYmZhLT5pb2NmYy5jZmdyc3BfZG1hLnBhID0gZG1fcGE7CisJYmZhLT5pb2NmYy5jZmdyc3AgPSAoc3RydWN0IGJmaV9pb2NmY19jZmdyc3BfcyAqKSBkbV9rdmE7CisKKwlkbV9rdmEgKz0KKwkJQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MpLAorCQkJICAgIEJGQV9DQUNIRUxJTkVfU1opOworCWRtX3BhICs9IEJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zKSwKKwkJCSAgICAgQkZBX0NBQ0hFTElORV9TWik7CisKKwkvKgorCSAqIENsYWltIERNQS1hYmxlIG1lbW9yeSBmb3IgaW9jZmMgc3RhdHMKKwkgKi8KKwliZmEtPmlvY2ZjLnN0YXRzX2t2YSA9IGRtX2t2YTsKKwliZmEtPmlvY2ZjLnN0YXRzX3BhID0gZG1fcGE7CisJYmZhLT5pb2NmYy5md19zdGF0cyA9IChzdHJ1Y3QgYmZhX2Z3X3N0YXRzX3MgKikgZG1fa3ZhOworCWRtX2t2YSArPSBCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmYV9md19zdGF0c19zKSwgQkZBX0NBQ0hFTElORV9TWik7CisJZG1fcGEgKz0gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmFfZndfc3RhdHNfcyksIEJGQV9DQUNIRUxJTkVfU1opOworCisJYmZhX21lbWluZm9fZG1hX3ZpcnQobWVtaW5mbykgPSBkbV9rdmE7CisJYmZhX21lbWluZm9fZG1hX3BoeXMobWVtaW5mbykgPSBkbV9wYTsKKworCWRiZ3N6ID0gYmZhX2lvY19kZWJ1Z190cmNzeihiZmFfYXV0b19yZWNvdmVyKTsKKwlpZiAoZGJnc3ogPiAwKSB7CisJCWJmYV9pb2NfZGVidWdfbWVtY2xhaW0oJmJmYS0+aW9jLCBiZmFfbWVtaW5mb19rdmEobWVtaW5mbykpOworCQliZmFfbWVtaW5mb19rdmEobWVtaW5mbykgKz0gZGJnc3o7CisJfQorfQorCisvKioKKyAqIEJGQSBzdWJtb2R1bGVzIGluaXRpYWxpemF0aW9uIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX2luaXRkb25lX3N1Ym1vZChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKworCWZvciAoaSA9IDA7IGhhbF9tb2RzW2ldOyBpKyspCisJCWhhbF9tb2RzW2ldLT5pbml0ZG9uZShiZmEpOworfQorCisvKioKKyAqIFN0YXJ0IEJGQSBzdWJtb2R1bGVzLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX3N0YXJ0X3N1Ym1vZChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKworCWJmYS0+cm1lX3Byb2Nlc3MgPSBCRkFfVFJVRTsKKworCWZvciAoaSA9IDA7IGhhbF9tb2RzW2ldOyBpKyspCisJCWhhbF9tb2RzW2ldLT5zdGFydChiZmEpOworfQorCisvKioKKyAqIERpc2FibGUgQkZBIHN1Ym1vZHVsZXMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jZmNfZGlzYWJsZV9zdWJtb2Qoc3RydWN0IGJmYV9zICpiZmEpCit7CisJaW50ICAgICAgICAgICAgIGk7CisKKwlmb3IgKGkgPSAwOyBoYWxfbW9kc1tpXTsgaSsrKQorCQloYWxfbW9kc1tpXS0+aW9jZGlzYWJsZShiZmEpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX2luaXRfY2Iodm9pZCAqYmZhX2FyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgYmZhX3MJKmJmYSA9IGJmYV9hcmc7CisKKwlpZiAoY29tcGxldGUpIHsKKwkJaWYgKGJmYS0+aW9jZmMuY2ZnZG9uZSkKKwkJCWJmYV9jYl9pbml0KGJmYS0+YmZhZCwgQkZBX1NUQVRVU19PSyk7CisJCWVsc2UKKwkJCWJmYV9jYl9pbml0KGJmYS0+YmZhZCwgQkZBX1NUQVRVU19GQUlMRUQpOworCX0gZWxzZQorCQliZmEtPmlvY2ZjLmFjdGlvbiA9IEJGQV9JT0NGQ19BQ1RfTk9ORTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NmY19zdG9wX2NiKHZvaWQgKmJmYV9hcmcsIGJmYV9ib29sZWFuX3QgY29tcGwpCit7CisJc3RydWN0IGJmYV9zICAqYmZhID0gYmZhX2FyZzsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gYmZhLT5iZmFkOworCisJaWYgKGNvbXBsKQorCQljb21wbGV0ZSgmYmZhZC0+Y29tcCk7CisKKwllbHNlCisJCWJmYS0+aW9jZmMuYWN0aW9uID0gQkZBX0lPQ0ZDX0FDVF9OT05FOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX2Rpc2FibGVfY2Iodm9pZCAqYmZhX2FyZywgYmZhX2Jvb2xlYW5fdCBjb21wbCkKK3sKKwlzdHJ1Y3QgYmZhX3MgICpiZmEgPSBiZmFfYXJnOworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSBiZmEtPmJmYWQ7CisKKwlpZiAoY29tcGwpCisJCWNvbXBsZXRlKCZiZmFkLT5kaXNhYmxlX2NvbXApOworfQorCisvKioKKyAqIFVwZGF0ZSBCRkEgY29uZmlndXJhdGlvbiBmcm9tIGZpcm13YXJlIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jZmNfY2ZncnNwKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfaW9jZmNfcwkJKmlvY2ZjCSA9ICZiZmEtPmlvY2ZjOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MJKmNmZ3JzcCAgPSBpb2NmYy0+Y2ZncnNwOworCXN0cnVjdCBiZmFfaW9jZmNfZndjZmdfcwkqZndjZmcgICA9ICZjZmdyc3AtPmZ3Y2ZnOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZnX3MgCQkqY2ZnaW5mbyA9IGlvY2ZjLT5jZmdpbmZvOworCisJZndjZmctPm51bV9jcXMgICAgICAgID0gZndjZmctPm51bV9jcXM7CisJZndjZmctPm51bV9pb2ltX3JlcXMgID0gYmZhX29zX250b2hzKGZ3Y2ZnLT5udW1faW9pbV9yZXFzKTsKKwlmd2NmZy0+bnVtX3Rza2ltX3JlcXMgPSBiZmFfb3NfbnRvaHMoZndjZmctPm51bV90c2tpbV9yZXFzKTsKKwlmd2NmZy0+bnVtX2ZjeHBfcmVxcyAgPSBiZmFfb3NfbnRvaHMoZndjZmctPm51bV9mY3hwX3JlcXMpOworCWZ3Y2ZnLT5udW1fdWZfYnVmcyAgICA9IGJmYV9vc19udG9ocyhmd2NmZy0+bnVtX3VmX2J1ZnMpOworCWZ3Y2ZnLT5udW1fcnBvcnRzICAgICA9IGJmYV9vc19udG9ocyhmd2NmZy0+bnVtX3Jwb3J0cyk7CisKKwljZmdpbmZvLT5pbnRyX2F0dHIuY29hbGVzY2UgPSBjZmdyc3AtPmludHJfYXR0ci5jb2FsZXNjZTsKKwljZmdpbmZvLT5pbnRyX2F0dHIuZGVsYXkgICAgPSBiZmFfb3NfbnRvaHMoY2ZncnNwLT5pbnRyX2F0dHIuZGVsYXkpOworCWNmZ2luZm8tPmludHJfYXR0ci5sYXRlbmN5ICA9IGJmYV9vc19udG9ocyhjZmdyc3AtPmludHJfYXR0ci5sYXRlbmN5KTsKKworCWlvY2ZjLT5jZmdkb25lID0gQkZBX1RSVUU7CisKKwkvKioKKwkgKiBDb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlIC0gaW5pdGlhbGl6ZS9zdGFydCBzdWJtb2R1bGVzCisJICovCisJaWYgKGlvY2ZjLT5hY3Rpb24gPT0gQkZBX0lPQ0ZDX0FDVF9JTklUKQorCQliZmFfY2JfcXVldWUoYmZhLCAmaW9jZmMtPmluaXRfaGNiX3FlLCBiZmFfaW9jZmNfaW5pdF9jYiwgYmZhKTsKKwllbHNlCisJCWJmYV9pb2NmY19zdGFydF9zdWJtb2QoYmZhKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NmY19zdGF0c19jbGVhcih2b2lkICpiZmFfYXJnKQoreworCXN0cnVjdCBiZmFfcwkJKmJmYSA9IGJmYV9hcmc7CisJc3RydWN0IGJmYV9pb2NmY19zCSppb2NmYyA9ICZiZmEtPmlvY2ZjOworCXN0cnVjdCBiZmlfaW9jZmNfc3RhdHNfcmVxX3Mgc3RhdHNfcmVxOworCisJYmZhX3RpbWVyX3N0YXJ0KGJmYSwgJmlvY2ZjLT5zdGF0c190aW1lciwKKwkJCSAgICBiZmFfaW9jZmNfc3RhdHNfY2xyX3RpbWVvdXQsIGJmYSwKKwkJCSAgICBCRkFfSU9DRkNfVE9WKTsKKworCWJmaV9oMmlfc2V0KHN0YXRzX3JlcS5taCwgQkZJX01DX0lPQ0ZDLCBCRklfSU9DRkNfSDJJX0NMRUFSX1NUQVRTX1JFUSwKKwkJYmZhX2xwdWlkKGJmYSkpOworCWJmYV9pb2NfbWJveF9zZW5kKCZiZmEtPmlvYywgJnN0YXRzX3JlcSwKKwkJc2l6ZW9mKHN0cnVjdCBiZmlfaW9jZmNfc3RhdHNfcmVxX3MpKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NmY19zdGF0c19zd2FwKHN0cnVjdCBiZmFfZndfc3RhdHNfcyAqZCwgc3RydWN0IGJmYV9md19zdGF0c19zICpzKQoreworCXUzMiAgICAgICAqZGlwID0gKHUzMiAqKSBkOworCXUzMiAgICAgICAqc2lwID0gKHUzMiAqKSBzOworCWludCAgICAgICAgICAgICBpOworCisJZm9yIChpID0gMDsgaSA8IChzaXplb2Yoc3RydWN0IGJmYV9md19zdGF0c19zKSAvIHNpemVvZih1MzIpKTsgaSsrKQorCQlkaXBbaV0gPSBiZmFfb3NfbnRvaGwoc2lwW2ldKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NmY19zdGF0c19jbHJfY2Iodm9pZCAqYmZhX2FyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgYmZhX3MgKmJmYSA9IGJmYV9hcmc7CisJc3RydWN0IGJmYV9pb2NmY19zICppb2NmYyA9ICZiZmEtPmlvY2ZjOworCisJaWYgKGNvbXBsZXRlKSB7CisJCWJmYV9pb2NfY2xyX3N0YXRzKCZiZmEtPmlvYyk7CisJCWlvY2ZjLT5zdGF0c19jYmZuKGlvY2ZjLT5zdGF0c19jYmFyZywgaW9jZmMtPnN0YXRzX3N0YXR1cyk7CisJfSBlbHNlIHsKKwkJaW9jZmMtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CisJCWlvY2ZjLT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2NmY19zdGF0c19jbHJfdGltZW91dCh2b2lkICpiZmFfYXJnKQoreworCXN0cnVjdCBiZmFfcwkJKmJmYSA9IGJmYV9hcmc7CisJc3RydWN0IGJmYV9pb2NmY19zCSppb2NmYyA9ICZiZmEtPmlvY2ZjOworCisJYmZhX3RyYyhiZmEsIDApOworCisJaW9jZmMtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfRVRJTUVSOworCWJmYV9jYl9xdWV1ZShiZmEsICZpb2NmYy0+c3RhdHNfaGNiX3FlLCBiZmFfaW9jZmNfc3RhdHNfY2xyX2NiLCBiZmEpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX3N0YXRzX2NiKHZvaWQgKmJmYV9hcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCit7CisJc3RydWN0IGJmYV9zCQkqYmZhID0gYmZhX2FyZzsKKwlzdHJ1Y3QgYmZhX2lvY2ZjX3MJKmlvY2ZjID0gJmJmYS0+aW9jZmM7CisKKwlpZiAoY29tcGxldGUpIHsKKwkJaWYgKGlvY2ZjLT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19PSykgeworCQkJYmZhX29zX21lbXNldChpb2NmYy0+c3RhdHNfcmV0LCAwLAorCQkJCXNpemVvZigqaW9jZmMtPnN0YXRzX3JldCkpOworCQkJYmZhX2lvY2ZjX3N0YXRzX3N3YXAoJmlvY2ZjLT5zdGF0c19yZXQtPmZ3X3N0YXRzLAorCQkJCWlvY2ZjLT5md19zdGF0cyk7CisJCX0KKwkJaW9jZmMtPnN0YXRzX2NiZm4oaW9jZmMtPnN0YXRzX2NiYXJnLCBpb2NmYy0+c3RhdHNfc3RhdHVzKTsKKwl9IGVsc2UgeworCQlpb2NmYy0+c3RhdHNfYnVzeSA9IEJGQV9GQUxTRTsKKwkJaW9jZmMtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX3N0YXRzX3RpbWVvdXQodm9pZCAqYmZhX2FyZykKK3sKKwlzdHJ1Y3QgYmZhX3MJCSpiZmEgPSBiZmFfYXJnOworCXN0cnVjdCBiZmFfaW9jZmNfcwkqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKworCWJmYV90cmMoYmZhLCAwKTsKKworCWlvY2ZjLT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0VUSU1FUjsKKwliZmFfY2JfcXVldWUoYmZhLCAmaW9jZmMtPnN0YXRzX2hjYl9xZSwgYmZhX2lvY2ZjX3N0YXRzX2NiLCBiZmEpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX3N0YXRzX3F1ZXJ5KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfaW9jZmNfcwkqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX3N0YXRzX3JlcV9zIHN0YXRzX3JlcTsKKworCWJmYV90aW1lcl9zdGFydChiZmEsICZpb2NmYy0+c3RhdHNfdGltZXIsCisJCQkgICAgYmZhX2lvY2ZjX3N0YXRzX3RpbWVvdXQsIGJmYSwgQkZBX0lPQ0ZDX1RPVik7CisKKwliZmlfaDJpX3NldChzdGF0c19yZXEubWgsIEJGSV9NQ19JT0NGQywgQkZJX0lPQ0ZDX0gySV9HRVRfU1RBVFNfUkVRLAorCQkJYmZhX2xwdWlkKGJmYSkpOworCWJmYV9pb2NfbWJveF9zZW5kKCZiZmEtPmlvYywgJnN0YXRzX3JlcSwKKwkJc2l6ZW9mKHN0cnVjdCBiZmlfaW9jZmNfc3RhdHNfcmVxX3MpKTsKK30KKwordm9pZAorYmZhX2lvY2ZjX3Jlc2V0X3F1ZXVlcyhzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlpbnQgICAgICAgICAgICAgcTsKKworCWZvciAocSA9IDA7IHEgPCBCRklfSU9DX01BWF9DUVM7IHErKykgeworCQliZmFfcmVxcV9jaShiZmEsIHEpID0gMDsKKwkJYmZhX3JlcXFfcGkoYmZhLCBxKSA9IDA7CisJCWJmYV9yc3BxX2NpKGJmYSwgcSkgPSAwOworCQliZmFfcnNwcV9waShiZmEsIHEpID0gMDsKKwl9Cit9CisKKy8qKgorICogSU9DIGVuYWJsZSByZXF1ZXN0IGlzIGNvbXBsZXRlCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jZmNfZW5hYmxlX2NiZm4odm9pZCAqYmZhX2FyZywgZW51bSBiZmFfc3RhdHVzIHN0YXR1cykKK3sKKwlzdHJ1Y3QgYmZhX3MJKmJmYSA9IGJmYV9hcmc7CisKKwlpZiAoc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX2lzcl9kaXNhYmxlKGJmYSk7CisJCWlmIChiZmEtPmlvY2ZjLmFjdGlvbiA9PSBCRkFfSU9DRkNfQUNUX0lOSVQpCisJCQliZmFfY2JfcXVldWUoYmZhLCAmYmZhLT5pb2NmYy5pbml0X2hjYl9xZSwKKwkJCQkgICAgIGJmYV9pb2NmY19pbml0X2NiLCBiZmEpOworCQlyZXR1cm47CisJfQorCisJYmZhX2lvY2ZjX2luaXRkb25lX3N1Ym1vZChiZmEpOworCWJmYV9pb2NmY19zZW5kX2NmZyhiZmEpOworfQorCisvKioKKyAqIElPQyBkaXNhYmxlIHJlcXVlc3QgaXMgY29tcGxldGUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2NmY19kaXNhYmxlX2NiZm4odm9pZCAqYmZhX2FyZykKK3sKKwlzdHJ1Y3QgYmZhX3MJKmJmYSA9IGJmYV9hcmc7CisKKwliZmFfaXNyX2Rpc2FibGUoYmZhKTsKKwliZmFfaW9jZmNfZGlzYWJsZV9zdWJtb2QoYmZhKTsKKworCWlmIChiZmEtPmlvY2ZjLmFjdGlvbiA9PSBCRkFfSU9DRkNfQUNUX1NUT1ApCisJCWJmYV9jYl9xdWV1ZShiZmEsICZiZmEtPmlvY2ZjLnN0b3BfaGNiX3FlLCBiZmFfaW9jZmNfc3RvcF9jYiwKKwkJCSAgICAgYmZhKTsKKwllbHNlIHsKKwkJYmZhX2Fzc2VydChiZmEtPmlvY2ZjLmFjdGlvbiA9PSBCRkFfSU9DRkNfQUNUX0RJU0FCTEUpOworCQliZmFfY2JfcXVldWUoYmZhLCAmYmZhLT5pb2NmYy5kaXNfaGNiX3FlLCBiZmFfaW9jZmNfZGlzYWJsZV9jYiwKKwkJCSAgICAgYmZhKTsKKwl9Cit9CisKKy8qKgorICogTm90aWZ5IHN1Yi1tb2R1bGVzIG9mIGhhcmR3YXJlIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jZmNfaGJmYWlsX2NiZm4odm9pZCAqYmZhX2FyZykKK3sKKwlzdHJ1Y3QgYmZhX3MJKmJmYSA9IGJmYV9hcmc7CisKKwliZmEtPnJtZV9wcm9jZXNzID0gQkZBX0ZBTFNFOworCisJYmZhX2lzcl9kaXNhYmxlKGJmYSk7CisJYmZhX2lvY2ZjX2Rpc2FibGVfc3VibW9kKGJmYSk7CisKKwlpZiAoYmZhLT5pb2NmYy5hY3Rpb24gPT0gQkZBX0lPQ0ZDX0FDVF9JTklUKQorCQliZmFfY2JfcXVldWUoYmZhLCAmYmZhLT5pb2NmYy5pbml0X2hjYl9xZSwgYmZhX2lvY2ZjX2luaXRfY2IsCisJCQkgICAgIGJmYSk7Cit9CisKKy8qKgorICogQWN0aW9ucyBvbiBjaGlwLXJlc2V0IGNvbXBsZXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jZmNfcmVzZXRfY2Jmbih2b2lkICpiZmFfYXJnKQoreworCXN0cnVjdCBiZmFfcwkqYmZhID0gYmZhX2FyZzsKKworCWJmYV9pb2NmY19yZXNldF9xdWV1ZXMoYmZhKTsKKwliZmFfaXNyX2VuYWJsZShiZmEpOworfQorCisKKworLyoqCisgKiAgYmZhX2lvY19wdWJsaWMKKyAqLworCisvKioKKyAqIFF1ZXJ5IElPQyBtZW1vcnkgcmVxdWlyZW1lbnQgaW5mb3JtYXRpb24uCisgKi8KK3ZvaWQKK2JmYV9pb2NmY19tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICprbV9sZW4sCisJCXUzMiAqZG1fbGVuKQoreworCS8qIGRtYSBtZW1vcnkgZm9yIElPQyAqLworCSpkbV9sZW4gKz0gYmZhX2lvY19tZW1pbmZvKCk7CisKKwliZmFfaW9jZmNfZndfY2ZnX3N6KGNmZywgZG1fbGVuKTsKKwliZmFfaW9jZmNfY3FzX3N6KGNmZywgZG1fbGVuKTsKKwkqa21fbGVuICs9IGJmYV9pb2NfZGVidWdfdHJjc3ooYmZhX2F1dG9fcmVjb3Zlcik7Cit9CisKKy8qKgorICogUXVlcnkgSU9DIG1lbW9yeSByZXF1aXJlbWVudCBpbmZvcm1hdGlvbi4KKyAqLwordm9pZAorYmZhX2lvY2ZjX2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYmZhZCwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAorCQkgICBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywgc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQoreworCWludCAgICAgICAgICAgICBpOworCisJYmZhX2lvY2ZjX2NiZm4uZW5hYmxlX2NiZm4gPSBiZmFfaW9jZmNfZW5hYmxlX2NiZm47CisJYmZhX2lvY2ZjX2NiZm4uZGlzYWJsZV9jYmZuID0gYmZhX2lvY2ZjX2Rpc2FibGVfY2JmbjsKKwliZmFfaW9jZmNfY2Jmbi5oYmZhaWxfY2JmbiA9IGJmYV9pb2NmY19oYmZhaWxfY2JmbjsKKwliZmFfaW9jZmNfY2Jmbi5yZXNldF9jYmZuID0gYmZhX2lvY2ZjX3Jlc2V0X2NiZm47CisKKwliZmFfaW9jX2F0dGFjaCgmYmZhLT5pb2MsIGJmYSwgJmJmYV9pb2NmY19jYmZuLCAmYmZhLT50aW1lcl9tb2QsCisJCWJmYS0+dHJjbW9kLCBiZmEtPmFlbiwgYmZhLT5sb2dtKTsKKwliZmFfaW9jX3BjaV9pbml0KCZiZmEtPmlvYywgcGNpZGV2LCBCRklfTUNfSU9DRkMpOworCWJmYV9pb2NfbWJveF9yZWdpc3RlcigmYmZhLT5pb2MsIGJmYV9tYm94X2lzcnMpOworCisJLyoqCisJICogQ2hvb3NlIEZDIChzc2lkOiAweDFDKSB2L3MgRkNvRSAoc3NpZDogMHgxNCkgbW9kZS4KKwkgKi8KKwlpZiAoMCkKKwkJYmZhX2lvY19zZXRfZmNtb2RlKCZiZmEtPmlvYyk7CisKKwliZmFfaW9jZmNfaW5pdF9tZW0oYmZhLCBiZmFkLCBjZmcsIHBjaWRldik7CisJYmZhX2lvY2ZjX21lbV9jbGFpbShiZmEsIGNmZywgbWVtaW5mbyk7CisJYmZhX3RpbWVyX2luaXQoJmJmYS0+dGltZXJfbW9kKTsKKworCUlOSVRfTElTVF9IRUFEKCZiZmEtPmNvbXBfcSk7CisJZm9yIChpID0gMDsgaSA8IEJGSV9JT0NfTUFYX0NRUzsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmYmZhLT5yZXFxX3dhaXRxW2ldKTsKK30KKworLyoqCisgKiBRdWVyeSBJT0MgbWVtb3J5IHJlcXVpcmVtZW50IGluZm9ybWF0aW9uLgorICovCit2b2lkCitiZmFfaW9jZmNfZGV0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWJmYV9pb2NfZGV0YWNoKCZiZmEtPmlvYyk7Cit9CisKKy8qKgorICogUXVlcnkgSU9DIG1lbW9yeSByZXF1aXJlbWVudCBpbmZvcm1hdGlvbi4KKyAqLwordm9pZAorYmZhX2lvY2ZjX2luaXQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJYmZhLT5pb2NmYy5hY3Rpb24gPSBCRkFfSU9DRkNfQUNUX0lOSVQ7CisJYmZhX2lvY19lbmFibGUoJmJmYS0+aW9jKTsKKwliZmFfbXNpeF9pbnN0YWxsKGJmYSk7Cit9CisKKy8qKgorICogSU9DIHN0YXJ0IGNhbGxlZCBmcm9tIGJmYV9zdGFydCgpLiBDYWxsZWQgdG8gc3RhcnQgSU9DIG9wZXJhdGlvbnMKKyAqIGF0IGRyaXZlciBpbnN0YW50aWF0aW9uIGZvciB0aGlzIGluc3RhbmNlLgorICovCit2b2lkCitiZmFfaW9jZmNfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJaWYgKGJmYS0+aW9jZmMuY2ZnZG9uZSkKKwkJYmZhX2lvY2ZjX3N0YXJ0X3N1Ym1vZChiZmEpOworfQorCisvKioKKyAqIElPQyBzdG9wIGNhbGxlZCBmcm9tIGJmYV9zdG9wKCkuIENhbGxlZCBvbmx5IHdoZW4gZHJpdmVyIGlzIHVubG9hZGVkCisgKiBmb3IgdGhpcyBpbnN0YW5jZS4KKyAqLwordm9pZAorYmZhX2lvY2ZjX3N0b3Aoc3RydWN0IGJmYV9zICpiZmEpCit7CisJYmZhLT5pb2NmYy5hY3Rpb24gPSBCRkFfSU9DRkNfQUNUX1NUT1A7CisKKwliZmEtPnJtZV9wcm9jZXNzID0gQkZBX0ZBTFNFOworCWJmYV9pb2NfZGlzYWJsZSgmYmZhLT5pb2MpOworfQorCit2b2lkCitiZmFfaW9jZmNfaXNyKHZvaWQgKmJmYWFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptKQoreworCXN0cnVjdCBiZmFfcwkJKmJmYSA9IGJmYWFyZzsKKwlzdHJ1Y3QgYmZhX2lvY2ZjX3MJKmlvY2ZjID0gJmJmYS0+aW9jZmM7CisJdW5pb24gYmZpX2lvY2ZjX2kyaF9tc2dfdQkqbXNnOworCisJbXNnID0gKHVuaW9uIGJmaV9pb2NmY19pMmhfbXNnX3UgKikgbTsKKwliZmFfdHJjKGJmYSwgbXNnLT5taC5tc2dfaWQpOworCisJc3dpdGNoIChtc2ctPm1oLm1zZ19pZCkgeworCWNhc2UgQkZJX0lPQ0ZDX0kySF9DRkdfUkVQTFk6CisJCWlvY2ZjLT5jZmdfcmVwbHkgPSAmbXNnLT5jZmdfcmVwbHk7CisJCWJmYV9pb2NmY19jZmdyc3AoYmZhKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9JT0NGQ19JMkhfR0VUX1NUQVRTX1JTUDoKKwkJaWYgKGlvY2ZjLT5zdGF0c19idXN5ID09IEJGQV9GQUxTRQorCQkgICAgfHwgaW9jZmMtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX0VUSU1FUikKKwkJCWJyZWFrOworCisJCWJmYV90aW1lcl9zdG9wKCZpb2NmYy0+c3RhdHNfdGltZXIpOworCQlpb2NmYy0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwkJYmZhX2NiX3F1ZXVlKGJmYSwgJmlvY2ZjLT5zdGF0c19oY2JfcWUsIGJmYV9pb2NmY19zdGF0c19jYiwKKwkJCSAgICAgIGJmYSk7CisJCWJyZWFrOworCWNhc2UgQkZJX0lPQ0ZDX0kySF9DTEVBUl9TVEFUU19SU1A6CisJCS8qCisJCSAqIGNoZWNrIGZvciB0aW1lciBwb3AgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHJzcAorCQkgKi8KKwkJaWYgKGlvY2ZjLT5zdGF0c19idXN5ID09IEJGQV9GQUxTRQorCQkgICAgfHwgaW9jZmMtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX0VUSU1FUikKKwkJCWJyZWFrOworCisJCWJmYV90aW1lcl9zdG9wKCZpb2NmYy0+c3RhdHNfdGltZXIpOworCQlpb2NmYy0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwkJYmZhX2NiX3F1ZXVlKGJmYSwgJmlvY2ZjLT5zdGF0c19oY2JfcWUsCisJCQkgICAgICBiZmFfaW9jZmNfc3RhdHNfY2xyX2NiLCBiZmEpOworCQlicmVhazsKKwljYXNlIEJGSV9JT0NGQ19JMkhfVVBEQVRFUV9SU1A6CisJCWlvY2ZjLT51cGRhdGVxX2NiZm4oaW9jZmMtPnVwZGF0ZXFfY2JhcmcsIEJGQV9TVEFUVVNfT0spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworI2lmbmRlZiBCRkFfQklPU19CVUlMRAordm9pZAorYmZhX2FkYXB0ZXJfZ2V0X2F0dHIoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfYWRhcHRlcl9hdHRyX3MgKmFkX2F0dHIpCit7CisJYmZhX2lvY19nZXRfYWRhcHRlcl9hdHRyKCZiZmEtPmlvYywgYWRfYXR0cik7Cit9CisKK3U2NAorYmZhX2FkYXB0ZXJfZ2V0X2lkKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXJldHVybiBiZmFfaW9jX2dldF9hZGlkKCZiZmEtPmlvYyk7Cit9CisKK3ZvaWQKK2JmYV9pb2NmY19nZXRfYXR0cihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9pb2NmY19hdHRyX3MgKmF0dHIpCit7CisJc3RydWN0IGJmYV9pb2NmY19zCSppb2NmYyA9ICZiZmEtPmlvY2ZjOworCisJYXR0ci0+aW50cl9hdHRyID0gaW9jZmMtPmNmZ2luZm8tPmludHJfYXR0cjsKKwlhdHRyLT5jb25maWcJPSBpb2NmYy0+Y2ZnOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9pb2NmY19pc3JhdHRyX3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9pb2NmY19pbnRyX2F0dHJfcyAqYXR0cikKK3sKKwlzdHJ1Y3QgYmZhX2lvY2ZjX3MJCSppb2NmYyA9ICZiZmEtPmlvY2ZjOworCXN0cnVjdCBiZmlfaW9jZmNfc2V0X2ludHJfcmVxX3MgKm07CisKKwlpb2NmYy0+Y2ZnaW5mby0+aW50cl9hdHRyID0gKmF0dHI7CisJaWYgKCFiZmFfaW9jZmNfaXNfb3BlcmF0aW9uYWwoYmZhKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CisKKwltID0gYmZhX3JlcXFfbmV4dChiZmEsIEJGQV9SRVFRX0lPQyk7CisJaWYgKCFtKQorCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOworCisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JT0NGQywgQkZJX0lPQ0ZDX0gySV9TRVRfSU5UUl9SRVEsCisJCQliZmFfbHB1aWQoYmZhKSk7CisJbS0+Y29hbGVzY2UgPSBhdHRyLT5jb2FsZXNjZTsKKwltLT5kZWxheSAgICA9IGJmYV9vc19odG9ucyhhdHRyLT5kZWxheSk7CisJbS0+bGF0ZW5jeSAgPSBiZmFfb3NfaHRvbnMoYXR0ci0+bGF0ZW5jeSk7CisKKwliZmFfdHJjKGJmYSwgYXR0ci0+ZGVsYXkpOworCWJmYV90cmMoYmZhLCBhdHRyLT5sYXRlbmN5KTsKKworCWJmYV9yZXFxX3Byb2R1Y2UoYmZhLCBCRkFfUkVRUV9JT0MpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCit2b2lkCitiZmFfaW9jZmNfc2V0X3Nuc2Jhc2Uoc3RydWN0IGJmYV9zICpiZmEsIHU2NCBzbnNiYXNlX3BhKQoreworCXN0cnVjdCBiZmFfaW9jZmNfcyAgICAgICppb2NmYyA9ICZiZmEtPmlvY2ZjOworCisJaW9jZmMtPmNmZ2luZm8tPnNlbnNlX2J1Zl9sZW4gPSAoQkZJX0lPSU1fU05TTEVOIC0gMSk7CisJYmZhX2RtYV9iZV9hZGRyX3NldChpb2NmYy0+Y2ZnaW5mby0+aW9pbV9zbnNiYXNlLCBzbnNiYXNlX3BhKTsKK30KKworYmZhX3N0YXR1c190CitiZmFfaW9jZmNfZ2V0X3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2lvY2ZjX3N0YXRzX3MgKnN0YXRzLAorCQkgICAgICBiZmFfY2JfaW9jX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9pb2NmY19zCSppb2NmYyA9ICZiZmEtPmlvY2ZjOworCisJaWYgKGlvY2ZjLT5zdGF0c19idXN5KSB7CisJCWJmYV90cmMoYmZhLCBpb2NmYy0+c3RhdHNfYnVzeSk7CisJCXJldHVybiAoQkZBX1NUQVRVU19ERVZCVVNZKTsKKwl9CisKKwlpb2NmYy0+c3RhdHNfYnVzeSA9IEJGQV9UUlVFOworCWlvY2ZjLT5zdGF0c19yZXQgPSBzdGF0czsKKwlpb2NmYy0+c3RhdHNfY2JmbiA9IGNiZm47CisJaW9jZmMtPnN0YXRzX2NiYXJnID0gY2Jhcmc7CisKKwliZmFfaW9jZmNfc3RhdHNfcXVlcnkoYmZhKTsKKworCXJldHVybiAoQkZBX1NUQVRVU19PSyk7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2lvY2ZjX2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfY2JfaW9jX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9pb2NmY19zCSppb2NmYyA9ICZiZmEtPmlvY2ZjOworCisJaWYgKGlvY2ZjLT5zdGF0c19idXN5KSB7CisJCWJmYV90cmMoYmZhLCBpb2NmYy0+c3RhdHNfYnVzeSk7CisJCXJldHVybiAoQkZBX1NUQVRVU19ERVZCVVNZKTsKKwl9CisKKwlpb2NmYy0+c3RhdHNfYnVzeSA9IEJGQV9UUlVFOworCWlvY2ZjLT5zdGF0c19jYmZuID0gY2JmbjsKKwlpb2NmYy0+c3RhdHNfY2JhcmcgPSBjYmFyZzsKKworCWJmYV9pb2NmY19zdGF0c19jbGVhcihiZmEpOworCXJldHVybiAoQkZBX1NUQVRVU19PSyk7Cit9CisKKy8qKgorICogRW5hYmxlIElPQyBhZnRlciBpdCBpcyBkaXNhYmxlZC4KKyAqLwordm9pZAorYmZhX2lvY2ZjX2VuYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwliZmFfcGxvZ19zdHIoYmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwgQkZBX1BMX0VJRF9NSVNDLCAwLAorCQkgICAgICJJT0MgRW5hYmxlIik7CisJYmZhX2lvY19lbmFibGUoJmJmYS0+aW9jKTsKK30KKwordm9pZAorYmZhX2lvY2ZjX2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpCit7CisJYmZhX3Bsb2dfc3RyKGJmYS0+cGxvZywgQkZBX1BMX01JRF9IQUwsIEJGQV9QTF9FSURfTUlTQywgMCwKKwkJICAgICAiSU9DIERpc2FibGUiKTsKKwliZmEtPmlvY2ZjLmFjdGlvbiA9IEJGQV9JT0NGQ19BQ1RfRElTQUJMRTsKKworCWJmYS0+cm1lX3Byb2Nlc3MgPSBCRkFfRkFMU0U7CisJYmZhX2lvY19kaXNhYmxlKCZiZmEtPmlvYyk7Cit9CisKKworYmZhX2Jvb2xlYW5fdAorYmZhX2lvY2ZjX2lzX29wZXJhdGlvbmFsKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXJldHVybiBiZmFfaW9jX2lzX29wZXJhdGlvbmFsKCZiZmEtPmlvYykgJiYgYmZhLT5pb2NmYy5jZmdkb25lOworfQorCisvKioKKyAqIFJldHVybiBib290IHRhcmdldCBwb3J0IHd3bnMgLS0gcmVhZCBmcm9tIGJvb3QgaW5mb3JtYXRpb24gaW4gZmxhc2guCisgKi8KK3ZvaWQKK2JmYV9pb2NmY19nZXRfYm9vdHd3bnMoc3RydWN0IGJmYV9zICpiZmEsIHU4ICpud3ducywgd3duX3QgKip3d25zKQoreworCXN0cnVjdCBiZmFfaW9jZmNfcwkJKmlvY2ZjCSA9ICZiZmEtPmlvY2ZjOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MJKmNmZ3JzcCAgPSBpb2NmYy0+Y2ZncnNwOworCisJKm53d25zID0gY2ZncnNwLT5ib290d3ducy5ud3duczsKKwkqd3ducyA9IGNmZ3JzcC0+Ym9vdHd3bnMud3duOworfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NmYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQxNzdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmMuaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0lPQ0ZDX0hfXworI2RlZmluZSBfX0JGQV9JT0NGQ19IX18KKworI2luY2x1ZGUgPGJmYV9pb2MuaD4KKyNpbmNsdWRlIDxiZmEuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX2lvY2ZjLmg+CisjaW5jbHVkZSA8YmZhX2NhbGxiYWNrX3ByaXYuaD4KKworI2RlZmluZSBCRkFfUkVRUV9ORUxFTVNfTUlOCSg0KQorI2RlZmluZSBCRkFfUlNQUV9ORUxFTVNfTUlOCSg0KQorCitzdHJ1Y3QgYmZhX2lvY2ZjX3JlZ3NfcyB7CisJYmZhX29zX2FkZHJfdCAgIGludHJfc3RhdHVzOworCWJmYV9vc19hZGRyX3QgICBpbnRyX21hc2s7CisJYmZhX29zX2FkZHJfdCAgIGNwZV9xX3BpW0JGSV9JT0NfTUFYX0NRU107CisJYmZhX29zX2FkZHJfdCAgIGNwZV9xX2NpW0JGSV9JT0NfTUFYX0NRU107CisJYmZhX29zX2FkZHJfdCAgIGNwZV9xX2RlcHRoW0JGSV9JT0NfTUFYX0NRU107CisJYmZhX29zX2FkZHJfdCAgIGNwZV9xX2N0cmxbQkZJX0lPQ19NQVhfQ1FTXTsKKwliZmFfb3NfYWRkcl90ICAgcm1lX3FfY2lbQkZJX0lPQ19NQVhfQ1FTXTsKKwliZmFfb3NfYWRkcl90ICAgcm1lX3FfcGlbQkZJX0lPQ19NQVhfQ1FTXTsKKwliZmFfb3NfYWRkcl90ICAgcm1lX3FfZGVwdGhbQkZJX0lPQ19NQVhfQ1FTXTsKKwliZmFfb3NfYWRkcl90ICAgcm1lX3FfY3RybFtCRklfSU9DX01BWF9DUVNdOworfTsKKworLyoqCisgKiBNU0lYIHZlY3RvciBoYW5kbGVycworICovCisjZGVmaW5lIEJGQV9NU0lYX01BWF9WRUNUT1JTCTIyCit0eXBlZGVmIHZvaWQgKCpiZmFfbXNpeF9oYW5kbGVyX3QpKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgdmVjKTsKK3N0cnVjdCBiZmFfbXNpeF9zIHsKKwlpbnQJbnZlY3M7CisJYmZhX21zaXhfaGFuZGxlcl90IGhhbmRsZXJbQkZBX01TSVhfTUFYX1ZFQ1RPUlNdOworfTsKKworLyoqCisgKiBDaGlwIHNwZWNpZmljIGludGVyZmFjZXMKKyAqLworc3RydWN0IGJmYV9od2lmX3MgeworCXZvaWQgKCpod19yZWdpbml0KShzdHJ1Y3QgYmZhX3MgKmJmYSk7CisJdm9pZCAoKmh3X3JzcHFfYWNrKShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOworCXZvaWQgKCpod19tc2l4X2luaXQpKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnZlY3MpOworCXZvaWQgKCpod19tc2l4X2luc3RhbGwpKHN0cnVjdCBiZmFfcyAqYmZhKTsKKwl2b2lkICgqaHdfbXNpeF91bmluc3RhbGwpKHN0cnVjdCBiZmFfcyAqYmZhKTsKKwl2b2lkICgqaHdfaXNyX21vZGVfc2V0KShzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBtc2l4KTsKKwl2b2lkICgqaHdfbXNpeF9nZXR2ZWNzKShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyICp2ZWNtYXAsCisJCQl1MzIgKm52ZWNzLCB1MzIgKm1heHZlYyk7Cit9OwordHlwZWRlZiB2b2lkICgqYmZhX2NiX2lvY2ZjX3QpICh2b2lkICpjYmFyZywgZW51bSBiZmFfc3RhdHVzIHN0YXR1cyk7CisKK3N0cnVjdCBiZmFfaW9jZmNfcyB7CisJc3RydWN0IGJmYV9zIAkJKmJmYTsKKwlzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zIAljZmc7CisJaW50CQkJYWN0aW9uOworCisJdTMyICAgICAgICAJcmVxX2NxX3BpW0JGSV9JT0NfTUFYX0NRU107CisJdTMyICAgICAgICAJcnNwX2NxX2NpW0JGSV9JT0NfTUFYX0NRU107CisKKwlzdHJ1Y3QgYmZhX2NiX3FlX3MJaW5pdF9oY2JfcWU7CisJc3RydWN0IGJmYV9jYl9xZV9zCXN0b3BfaGNiX3FlOworCXN0cnVjdCBiZmFfY2JfcWVfcwlkaXNfaGNiX3FlOworCXN0cnVjdCBiZmFfY2JfcWVfcwlzdGF0c19oY2JfcWU7CisJYmZhX2Jvb2xlYW5fdAkJY2ZnZG9uZTsKKworCXN0cnVjdCBiZmFfZG1hX3MJY2ZnX2luZm87CisJc3RydWN0IGJmaV9pb2NmY19jZmdfcyAqY2ZnaW5mbzsKKwlzdHJ1Y3QgYmZhX2RtYV9zCWNmZ3JzcF9kbWE7CisJc3RydWN0IGJmaV9pb2NmY19jZmdyc3BfcyAqY2ZncnNwOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZnX3JlcGx5X3MgKmNmZ19yZXBseTsKKworCXU4CQkJKnN0YXRzX2t2YTsKKwl1NjQJCXN0YXRzX3BhOworCXN0cnVjdCBiZmFfZndfc3RhdHNfcyAJKmZ3X3N0YXRzOworCXN0cnVjdCBiZmFfdGltZXJfcyAJc3RhdHNfdGltZXI7CS8qICB0aW1lciAqLworCXN0cnVjdCBiZmFfaW9jZmNfc3RhdHNfcyAqc3RhdHNfcmV0OwkvKiAgZHJpdmVyIHN0YXRzIGxvY2F0aW9uICovCisJYmZhX3N0YXR1c190CQlzdGF0c19zdGF0dXM7CS8qICBzdGF0cy9zdGF0c2NsciBzdGF0dXMgKi8KKwliZmFfYm9vbGVhbl90ICAgCXN0YXRzX2J1c3k7CS8qICBvdXRzdGFuZGluZyBzdGF0cyAqLworCWJmYV9jYl9pb2NfdAkJc3RhdHNfY2JmbjsJLyogIGRyaXZlciBjYWxsYmFjayBmdW5jdGlvbiAqLworCXZvaWQgICAgICAgICAgIAkJKnN0YXRzX2NiYXJnOwkvKiAgdXNlciBjYWxsYmFjayBhcmcgKi8KKworCXN0cnVjdCBiZmFfZG1hX3MgICAJcmVxX2NxX2JhW0JGSV9JT0NfTUFYX0NRU107CisJc3RydWN0IGJmYV9kbWFfcyAgIAlyZXFfY3Ffc2hhZG93X2NpW0JGSV9JT0NfTUFYX0NRU107CisJc3RydWN0IGJmYV9kbWFfcyAgIAlyc3BfY3FfYmFbQkZJX0lPQ19NQVhfQ1FTXTsKKwlzdHJ1Y3QgYmZhX2RtYV9zICAgCXJzcF9jcV9zaGFkb3dfcGlbQkZJX0lPQ19NQVhfQ1FTXTsKKwlzdHJ1Y3QgYmZhX2lvY2ZjX3JlZ3NfcwliZmFfcmVnczsJLyogIEJGQSBkZXZpY2UgcmVnaXN0ZXJzICovCisJc3RydWN0IGJmYV9od2lmX3MJaHdpZjsKKworCWJmYV9jYl9pb2NmY190CQl1cGRhdGVxX2NiZm47IC8qICBiaW9zIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJdm9pZAkJCQkqdXBkYXRlcV9jYmFyZzsJLyogIGJpb3MgY2FsbGJhY2sgYXJnICovCit9OworCisjZGVmaW5lIGJmYV9scHVpZChfX2JmYSkJCWJmYV9pb2NfcG9ydGlkKCYoX19iZmEpLT5pb2MpCisjZGVmaW5lIGJmYV9tc2l4X2luaXQoX19iZmEsIF9fbnZlY3MpCVwKKwkoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfaW5pdChfX2JmYSwgX19udmVjcykKKyNkZWZpbmUgYmZhX21zaXhfaW5zdGFsbChfX2JmYSkJXAorCShfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF9pbnN0YWxsKF9fYmZhKQorI2RlZmluZSBiZmFfbXNpeF91bmluc3RhbGwoX19iZmEpCVwKKwkoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfdW5pbnN0YWxsKF9fYmZhKQorI2RlZmluZSBiZmFfaXNyX21vZGVfc2V0KF9fYmZhLCBfX21zaXgpCVwKKwkoX19iZmEpLT5pb2NmYy5od2lmLmh3X2lzcl9tb2RlX3NldChfX2JmYSwgX19tc2l4KQorI2RlZmluZSBiZmFfbXNpeF9nZXR2ZWNzKF9fYmZhLCBfX3ZlY21hcCwgX19udmVjcywgX19tYXh2ZWMpCVwKKwkoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfZ2V0dmVjcyhfX2JmYSwgX192ZWNtYXAsIF9fbnZlY3MsIF9fbWF4dmVjKQorCisvKgorICogRkMgc3BlY2lmaWMgSU9DIGZ1bmN0aW9ucy4KKyAqLwordm9pZCBiZmFfaW9jZmNfbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHUzMiAqa21fbGVuLAorCQl1MzIgKmRtX2xlbik7Cit2b2lkIGJmYV9pb2NmY19hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsCisJCXN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCisJCXN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldik7Cit2b2lkIGJmYV9pb2NmY19kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaW9jZmNfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9pb2NmY19zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9pb2NmY19zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2lvY2ZjX2lzcih2b2lkICpiZmEsIHN0cnVjdCBiZmlfbWJtc2dfcyAqbXNnKTsKK3ZvaWQgYmZhX2lvY2ZjX3NldF9zbnNiYXNlKHN0cnVjdCBiZmFfcyAqYmZhLCB1NjQgc25zYmFzZV9wYSk7CitiZmFfYm9vbGVhbl90IGJmYV9pb2NmY19pc19vcGVyYXRpb25hbChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9pb2NmY19yZXNldF9xdWV1ZXMoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaW9jZmNfdXBkYXRlcShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIHJlcXFfYmEsIHUzMiByc3BxX2JhLAorCQkJdTMyIHJlcXFfc2NpLCB1MzIgcnNwcV9zcGksCisJCQliZmFfY2JfaW9jZmNfdCBjYmZuLCB2b2lkICpjYmFyZyk7CisKK3ZvaWQgYmZhX21zaXhfYWxsKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgdmVjKTsKK3ZvaWQgYmZhX21zaXhfcmVxcShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYyk7Cit2b2lkIGJmYV9tc2l4X3JzcHEoc3RydWN0IGJmYV9zICpiZmEsIGludCB2ZWMpOwordm9pZCBiZmFfbXNpeF9scHVfZXJyKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgdmVjKTsKKwordm9pZCBiZmFfaHdjYl9yZWdpbml0KHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2h3Y2JfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxKTsKK3ZvaWQgYmZhX2h3Y2JfbXNpeF9pbml0KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnZlY3MpOwordm9pZCBiZmFfaHdjYl9tc2l4X2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaHdjYl9tc2l4X3VuaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9od2NiX2lzcl9tb2RlX3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBtc2l4KTsKK3ZvaWQgYmZhX2h3Y2JfbXNpeF9nZXR2ZWNzKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgKnZlY21hcCwKKwkJCXUzMiAqbnZlY3MsIHUzMiAqbWF4dmVjKTsKK3ZvaWQgYmZhX2h3Y3RfcmVnaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9od2N0X3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSk7Cit2b2lkIGJmYV9od2N0X21zaXhfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IG52ZWNzKTsKK3ZvaWQgYmZhX2h3Y3RfbXNpeF9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2h3Y3RfbXNpeF91bmluc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaHdjdF9pc3JfbW9kZV9zZXQoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgbXNpeCk7Cit2b2lkIGJmYV9od2N0X21zaXhfZ2V0dmVjcyhzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyICp2ZWNtYXAsCisJCQl1MzIgKm52ZWNzLCB1MzIgKm1heHZlYyk7CisKK3ZvaWQgYmZhX2NvbV9tZW1pbmZvKGJmYV9ib29sZWFuX3QgbWluY2ZnLCB1MzIgKmRtX2xlbik7Cit2b2lkIGJmYV9jb21fYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWksCisJCWJmYV9ib29sZWFuX3QgbWluY2ZnKTsKK3ZvaWQgYmZhX2lvY2ZjX2dldF9ib290d3ducyhzdHJ1Y3QgYmZhX3MgKmJmYSwgdTggKm53d25zLCB3d25fdCAqKnd3bnMpOworCisjZW5kaWYgLyogX19CRkFfSU9DRkNfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY2ZjX3EuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY2ZjX3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDBhMTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jZmNfcS5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgImJmYV9pbnRyX3ByaXYuaCIKKworQkZBX1RSQ19GSUxFKEhBTCwgSU9DRkNfUSk7CisKK3ZvaWQKK2JmYV9pb2NmY191cGRhdGVxKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgcmVxcV9iYSwgdTMyIHJzcHFfYmEsCisJCQkJdTMyIHJlcXFfc2NpLCB1MzIgcnNwcV9zcGksIGJmYV9jYl9pb2NmY190IGNiZm4sCisJCQkJdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9pb2NmY19zICppb2NmYyA9ICZiZmEtPmlvY2ZjOworCXN0cnVjdCBiZmlfaW9jZmNfdXBkYXRlcV9yZXFfcyB1cGRhdGVxX3JlcTsKKworCWlvY2ZjLT51cGRhdGVxX2NiZm4gPSBjYmZuOworCWlvY2ZjLT51cGRhdGVxX2NiYXJnID0gY2Jhcmc7CisKKwliZmlfaDJpX3NldCh1cGRhdGVxX3JlcS5taCwgQkZJX01DX0lPQ0ZDLCBCRklfSU9DRkNfSDJJX1VQREFURVFfUkVRLAorCQkJYmZhX2xwdWlkKGJmYSkpOworCisJdXBkYXRlcV9yZXEucmVxcV9iYSA9IGJmYV9vc19odG9ubChyZXFxX2JhKTsKKwl1cGRhdGVxX3JlcS5yc3BxX2JhID0gYmZhX29zX2h0b25sKHJzcHFfYmEpOworCXVwZGF0ZXFfcmVxLnJlcXFfc2NpID0gYmZhX29zX2h0b25sKHJlcXFfc2NpKTsKKwl1cGRhdGVxX3JlcS5yc3BxX3NwaSA9IGJmYV9vc19odG9ubChyc3BxX3NwaSk7CisKKwliZmFfaW9jX21ib3hfc2VuZCgmYmZhLT5pb2MsICZ1cGRhdGVxX3JlcSwKKwkJCXNpemVvZihzdHJ1Y3QgYmZpX2lvY2ZjX3VwZGF0ZXFfcmVxX3MpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvaW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUyNTUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9pbS5jCkBAIC0wLDAgKzEsMTMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8Y3MvYmZhX2RlYnVnLmg+CisjaW5jbHVkZSA8YmZhX2NiX2lvaW1fbWFjcm9zLmg+CisKK0JGQV9UUkNfRklMRShIQUwsIElPSU0pOworCisvKgorICogZm9yd2FyZCBkZWNsYXJhdGlvbnMuCisgKi8KK3N0YXRpYyBiZmFfYm9vbGVhbl90CWJmYV9pb2ltX3NlbmRfaW9yZXEoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOworc3RhdGljIGJmYV9ib29sZWFuX3QJYmZhX2lvaW1fc2dlX3NldHVwKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3N0YXRpYyB2b2lkCQliZmFfaW9pbV9zZ3BnX3NldHVwKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3N0YXRpYyBiZmFfYm9vbGVhbl90CWJmYV9pb2ltX3NlbmRfYWJvcnQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOworc3RhdGljIHZvaWQJCWJmYV9pb2ltX25vdGlmeV9jbGVhbnVwKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3N0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fZ29vZF9jb21wKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fY29tcCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCBfX2JmYV9jYl9pb2ltX2Fib3J0KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fZmFpbGVkKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fcGF0aHRvdih2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CisKKy8qKgorICogIGJmYV9pb2ltX3NtCisgKi8KKworLyoqCisgKiBJTyBzdGF0ZSBtYWNoaW5lIGV2ZW50cworICovCitlbnVtIGJmYV9pb2ltX2V2ZW50IHsKKwlCRkFfSU9JTV9TTV9TVEFSVCA9IDEsCQkvKiAgaW8gc3RhcnQgcmVxdWVzdCBmcm9tIGhvc3QgKi8KKwlCRkFfSU9JTV9TTV9DT01QX0dPT0QgPSAyLAkvKiAgaW8gZ29vZCBjb21wLCByZXNvdXJjZSBmcmVlICovCisJQkZBX0lPSU1fU01fQ09NUCA9IDMsCQkvKiAgaW8gY29tcCwgcmVzb3VyY2UgaXMgZnJlZSAqLworCUJGQV9JT0lNX1NNX0NPTVBfVVRBRyA9IDQsCS8qICBpbyBjb21wLCByZXNvdXJjZSBpcyBmcmVlICovCisJQkZBX0lPSU1fU01fRE9ORSA9IDUsCQkvKiAgaW8gY29tcCwgcmVzb3VyY2Ugbm90IGZyZWUgKi8KKwlCRkFfSU9JTV9TTV9GUkVFID0gNiwJCS8qICBpbyByZXNvdXJjZSBpcyBmcmVlZCAqLworCUJGQV9JT0lNX1NNX0FCT1JUID0gNywJCS8qICBhYm9ydCByZXF1ZXN0IGZyb20gc2NzaSBzdGFjayAqLworCUJGQV9JT0lNX1NNX0FCT1JUX0NPTVAgPSA4LAkvKiAgYWJvcnQgZnJvbSBmL3cgKi8KKwlCRkFfSU9JTV9TTV9BQk9SVF9ET05FID0gOSwJLyogIGFib3J0IGNvbXBsZXRpb24gZnJvbSBmL3cgKi8KKwlCRkFfSU9JTV9TTV9RUkVTVU1FID0gMTAsCS8qICBDUSBzcGFjZSBhdmFpbGFibGUgdG8gcXVldWUgSU8gKi8KKwlCRkFfSU9JTV9TTV9TR0FMTE9DRUQgPSAxMSwJLyogIFNHIHBhZ2UgYWxsb2NhdGlvbiBzdWNjZXNzZnVsICovCisJQkZBX0lPSU1fU01fU1FSRVRSWSA9IDEyLAkvKiAgc2VxdWVuY2UgcmVjb3ZlcnkgcmV0cnkgKi8KKwlCRkFfSU9JTV9TTV9IQ0IJPSAxMywJCS8qICBiZmEgY2FsbGJhY2sgY29tcGxldGUgKi8KKwlCRkFfSU9JTV9TTV9DTEVBTlVQID0gMTQsCS8qICBJTyBjbGVhbnVwIGZyb20gaXRuaW0gKi8KKwlCRkFfSU9JTV9TTV9UTVNUQVJUID0gMTUsCS8qICBJTyBjbGVhbnVwIGZyb20gdHNraW0gKi8KKwlCRkFfSU9JTV9TTV9UTURPTkUgPSAxNiwJLyogIElPIGNsZWFudXAgZnJvbSB0c2tpbSAqLworCUJGQV9JT0lNX1NNX0hXRkFJTCA9IDE3LAkvKiAgSU9DIGgvdyBmYWlsdXJlIGV2ZW50ICovCisJQkZBX0lPSU1fU01fSU9UT1YgPSAxOCwJCS8qICBJVE4gb2ZmbGluZSBUT1YgICAgICAgKi8KK307CisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIElPIHN0YXRlIG1hY2hpbmUKKyAqLworc3RhdGljIHZvaWQgICAgIGJmYV9pb2ltX3NtX3VuaW5pdChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwKKwkJCQkgICAgICAgZW51bSBiZmFfaW9pbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2lvaW1fc21fc2dhbGxvYyhzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwKKwkJCQkJZW51bSBiZmFfaW9pbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2lvaW1fc21fYWN0aXZlKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLAorCQkJCSAgICAgICBlbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9pbV9zbV9hYm9ydChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwKKwkJCQkgICAgICBlbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9pbV9zbV9jbGVhbnVwKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLAorCQkJCQllbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9pbV9zbV9xZnVsbChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwKKwkJCQkgICAgICBlbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9pbV9zbV9hYm9ydF9xZnVsbChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwKKwkJCQkJICAgIGVudW0gYmZhX2lvaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2ltX3NtX2NsZWFudXBfcWZ1bGwoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sCisJCQkJCSAgICAgIGVudW0gYmZhX2lvaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9pb2ltX3NtX2hjYihzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwKKwkJCQkgICAgZW51bSBiZmFfaW9pbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2lvaW1fc21faGNiX2ZyZWUoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sCisJCQkJCSBlbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaW9pbV9zbV9yZXNmcmVlKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLAorCQkJCQllbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KTsKKworLyoqCisgKiAJCUlPIGlzIG5vdCBzdGFydGVkICh1bmFsbG9jYXRlZCkuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9zbV91bmluaXQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIGVudW0gYmZhX2lvaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyY19mcChpb2ltLT5iZmEsIGlvaW0tPmlvdGFnKTsKKwliZmFfdHJjX2ZwKGlvaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lPSU1fU01fU1RBUlQ6CisJCWlmICghYmZhX2l0bmltX2lzX29ubGluZShpb2ltLT5pdG5pbSkpIHsKKwkJCWlmICghYmZhX2l0bmltX2hvbGRfaW8oaW9pbS0+aXRuaW0pKSB7CisJCQkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQkJCWxpc3RfZGVsKCZpb2ltLT5xZSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsCisJCQkJCSZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOworCQkJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsCisJCQkJCQlfX2JmYV9jYl9pb2ltX3BhdGh0b3YsIGlvaW0pOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0X2RlbCgmaW9pbS0+cWUpOworCQkJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLAorCQkJCQkmaW9pbS0+aXRuaW0tPnBlbmRpbmdfcSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpb2ltLT5uc2dlcyA+IEJGSV9TR0VfSU5MSU5FKSB7CisJCQlpZiAoIWJmYV9pb2ltX3NnZV9zZXR1cChpb2ltKSkgeworCQkJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fc2dhbGxvYyk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJaWYgKCFiZmFfaW9pbV9zZW5kX2lvcmVxKGlvaW0pKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX3FmdWxsKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9hY3RpdmUpOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fSU9UT1Y6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwKKwkJCQlfX2JmYV9jYl9pb2ltX3BhdGh0b3YsIGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fQUJPUlQ6CisJCS8qKgorCQkgKiBJTyBpbiBwZW5kaW5nIHF1ZXVlIGNhbiBnZXQgYWJvcnQgcmVxdWVzdHMuIENvbXBsZXRlIGFib3J0CisJCSAqIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQliZmFfYXNzZXJ0KGJmYV9xX2lzX29uX3EoJmlvaW0tPml0bmltLT5wZW5kaW5nX3EsIGlvaW0pKTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgX19iZmFfY2JfaW9pbV9hYm9ydCwKKwkJCQlpb2ltKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAJCUlPIGlzIHdhaXRpbmcgZm9yIFNHIHBhZ2VzLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fc21fc2dhbGxvYyhzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwgZW51bSBiZmFfaW9pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGlvaW0tPmJmYSwgaW9pbS0+aW90YWcpOworCWJmYV90cmMoaW9pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSU9JTV9TTV9TR0FMTE9DRUQ6CisJCWlmICghYmZhX2lvaW1fc2VuZF9pb3JlcShpb2ltKSkgeworCQkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9xZnVsbCk7CisJCQlicmVhazsKKwkJfQorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2FjdGl2ZSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9DTEVBTlVQOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9zZ3BnX3djYW5jZWwoaW9pbS0+YmZhLCAmaW9pbS0+aW9zcC0+c2dwZ193cWUpOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2ZhaWxlZCwKKwkJCSAgICAgIGlvaW0pOworCQliZmFfaW9pbV9ub3RpZnlfY2xlYW51cChpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0FCT1JUOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9zZ3BnX3djYW5jZWwoaW9pbS0+YmZhLCAmaW9pbS0+aW9zcC0+c2dwZ193cWUpOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2Fib3J0LAorCQkJICAgICAgaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX3NncGdfd2NhbmNlbChpb2ltLT5iZmEsICZpb2ltLT5pb3NwLT5zZ3BnX3dxZSk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fZmFpbGVkLAorCQkJICAgICAgaW9pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCQlJTyBpcyBhY3RpdmUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9zbV9hY3RpdmUoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIGVudW0gYmZhX2lvaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyY19mcChpb2ltLT5iZmEsIGlvaW0tPmlvdGFnKTsKKwliZmFfdHJjX2ZwKGlvaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lPSU1fU01fQ09NUF9HT09EOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsCisJCQkgICAgICBfX2JmYV9jYl9pb2ltX2dvb2RfY29tcCwgaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9DT01QOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fY29tcCwKKwkJCSAgICAgIGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fRE9ORToKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2JfZnJlZSk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fY29tcCwKKwkJCSAgICAgIGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fQUJPUlQ6CisJCWlvaW0tPmlvc3AtPmFib3J0X2V4cGxpY2l0ID0gQkZBX1RSVUU7CisJCWlvaW0tPmlvX2NiZm4gPSBfX2JmYV9jYl9pb2ltX2Fib3J0OworCisJCWlmIChiZmFfaW9pbV9zZW5kX2Fib3J0KGlvaW0pKQorCQkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9hYm9ydCk7CisJCWVsc2UgeworCQkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9hYm9ydF9xZnVsbCk7CisJCQliZmFfcmVxcV93YWl0KGlvaW0tPmJmYSwgaW9pbS0+aXRuaW0tPnJlcXEsCisJCQkJCSAgJmlvaW0tPmlvc3AtPnJlcXFfd2FpdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0NMRUFOVVA6CisJCWlvaW0tPmlvc3AtPmFib3J0X2V4cGxpY2l0ID0gQkZBX0ZBTFNFOworCQlpb2ltLT5pb19jYmZuID0gX19iZmFfY2JfaW9pbV9mYWlsZWQ7CisKKwkJaWYgKGJmYV9pb2ltX3NlbmRfYWJvcnQoaW9pbSkpCisJCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2NsZWFudXApOworCQllbHNlIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fY2xlYW51cF9xZnVsbCk7CisJCQliZmFfcmVxcV93YWl0KGlvaW0tPmJmYSwgaW9pbS0+aXRuaW0tPnJlcXEsCisJCQkJCSAgJmlvaW0tPmlvc3AtPnJlcXFfd2FpdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2ZhaWxlZCwKKwkJCSAgICAgIGlvaW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJSU8gaXMgYmVpbmcgYWJvcnRlZCwgd2FpdGluZyBmb3IgY29tcGxldGlvbiBmcm9tIGZpcm13YXJlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fc21fYWJvcnQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIGVudW0gYmZhX2lvaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGlvaW0tPmlvdGFnKTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lPSU1fU01fQ09NUF9HT09EOgorCWNhc2UgQkZBX0lPSU1fU01fQ09NUDoKKwljYXNlIEJGQV9JT0lNX1NNX0RPTkU6CisJY2FzZSBCRkFfSU9JTV9TTV9GUkVFOgorCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fQUJPUlRfRE9ORToKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2JfZnJlZSk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fYWJvcnQsCisJCQkgICAgICBpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0FCT1JUX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgX19iZmFfY2JfaW9pbV9hYm9ydCwKKwkJCSAgICAgIGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fQ09NUF9VVEFHOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fYWJvcnQsCisJCQkgICAgICBpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0NMRUFOVVA6CisJCWJmYV9hc3NlcnQoaW9pbS0+aW9zcC0+YWJvcnRfZXhwbGljaXQgPT0gQkZBX1RSVUUpOworCQlpb2ltLT5pb3NwLT5hYm9ydF9leHBsaWNpdCA9IEJGQV9GQUxTRTsKKworCQlpZiAoYmZhX2lvaW1fc2VuZF9hYm9ydChpb2ltKSkKKwkJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fY2xlYW51cCk7CisJCWVsc2UgeworCQkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9jbGVhbnVwX3FmdWxsKTsKKwkJCWJmYV9yZXFxX3dhaXQoaW9pbS0+YmZhLCBpb2ltLT5pdG5pbS0+cmVxcSwKKwkJCQkJICAmaW9pbS0+aW9zcC0+cmVxcV93YWl0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fZmFpbGVkLAorCQkJICAgICAgaW9pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogSU8gaXMgYmVpbmcgY2xlYW5lZCB1cCAoaW1wbGljaXQgYWJvcnQpLCB3YWl0aW5nIGZvciBjb21wbGV0aW9uIGZyb20KKyAqIGZpcm13YXJlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fc21fY2xlYW51cChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwgZW51bSBiZmFfaW9pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGlvaW0tPmJmYSwgaW9pbS0+aW90YWcpOworCWJmYV90cmMoaW9pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSU9JTV9TTV9DT01QX0dPT0Q6CisJY2FzZSBCRkFfSU9JTV9TTV9DT01QOgorCWNhc2UgQkZBX0lPSU1fU01fRE9ORToKKwljYXNlIEJGQV9JT0lNX1NNX0ZSRUU6CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9BQk9SVDoKKwkJLyoqCisJCSAqIElPIGlzIGFscmVhZHkgYmVpbmcgYWJvcnRlZCBpbXBsaWNpdGx5CisJCSAqLworCQlpb2ltLT5pb19jYmZuID0gX19iZmFfY2JfaW9pbV9hYm9ydDsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0FCT1JUX0RPTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiX2ZyZWUpOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBpb2ltLT5pb19jYmZuLCBpb2ltKTsKKwkJYmZhX2lvaW1fbm90aWZ5X2NsZWFudXAoaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9BQk9SVF9DT01QOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIGlvaW0tPmlvX2NiZm4sIGlvaW0pOworCQliZmFfaW9pbV9ub3RpZnlfY2xlYW51cChpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0NPTVBfVVRBRzoKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBpb2ltLT5pb19jYmZuLCBpb2ltKTsKKwkJYmZhX2lvaW1fbm90aWZ5X2NsZWFudXAoaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgX19iZmFfY2JfaW9pbV9mYWlsZWQsCisJCQkgICAgICBpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0NMRUFOVVA6CisJCS8qKgorCQkgKiBJTyBjYW4gYmUgaW4gY2xlYW51cCBzdGF0ZSBhbHJlYWR5IGR1ZSB0byBUTSBjb21tYW5kLiAybmQgY2xlYW51cAorCQkgKiByZXF1ZXN0IGNvbWVzIGZyb20gSVROIG9mZmxpbmUgZXZlbnQuCisJCSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJSU8gaXMgd2FpdGluZyBmb3Igcm9vbSBpbiByZXF1ZXN0IENRCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9zbV9xZnVsbChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwgZW51bSBiZmFfaW9pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGlvaW0tPmJmYSwgaW9pbS0+aW90YWcpOworCWJmYV90cmMoaW9pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSU9JTV9TTV9RUkVTVU1FOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2FjdGl2ZSk7CisJCWJmYV9pb2ltX3NlbmRfaW9yZXEoaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9BQk9SVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQliZmFfcmVxcV93Y2FuY2VsKCZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2Fib3J0LAorCQkJICAgICAgaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9DTEVBTlVQOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9yZXFxX3djYW5jZWwoJmlvaW0tPmlvc3AtPnJlcXFfd2FpdCk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fZmFpbGVkLAorCQkJICAgICAgaW9pbSk7CisJCWJmYV9pb2ltX25vdGlmeV9jbGVhbnVwKGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9yZXFxX3djYW5jZWwoJmlvaW0tPmlvc3AtPnJlcXFfd2FpdCk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fZmFpbGVkLAorCQkJICAgICAgaW9pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCQlBY3RpdmUgSU8gaXMgYmVpbmcgYWJvcnRlZCwgd2FpdGluZyBmb3Igcm9vbSBpbiByZXF1ZXN0IENRLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fc21fYWJvcnRfcWZ1bGwoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIGVudW0gYmZhX2lvaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGlvaW0tPmlvdGFnKTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lPSU1fU01fUVJFU1VNRToKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9hYm9ydCk7CisJCWJmYV9pb2ltX3NlbmRfYWJvcnQoaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9DTEVBTlVQOgorCQliZmFfYXNzZXJ0KGlvaW0tPmlvc3AtPmFib3J0X2V4cGxpY2l0ID09IEJGQV9UUlVFKTsKKwkJaW9pbS0+aW9zcC0+YWJvcnRfZXhwbGljaXQgPSBCRkFfRkFMU0U7CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fY2xlYW51cF9xZnVsbCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9DT01QX0dPT0Q6CisJY2FzZSBCRkFfSU9JTV9TTV9DT01QOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9yZXFxX3djYW5jZWwoJmlvaW0tPmlvc3AtPnJlcXFfd2FpdCk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIF9fYmZhX2NiX2lvaW1fYWJvcnQsCisJCQkgICAgICBpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0RPTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiX2ZyZWUpOworCQliZmFfcmVxcV93Y2FuY2VsKCZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2Fib3J0LAorCQkJICAgICAgaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmaW9pbS0+aW9zcC0+cmVxcV93YWl0KTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgX19iZmFfY2JfaW9pbV9mYWlsZWQsCisJCQkgICAgICBpb2ltKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAJCUFjdGl2ZSBJTyBpcyBiZWluZyBjbGVhbmVkIHVwLCB3YWl0aW5nIGZvciByb29tIGluIHJlcXVlc3QgQ1EuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9zbV9jbGVhbnVwX3FmdWxsKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLCBlbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaW9pbS0+YmZhLCBpb2ltLT5pb3RhZyk7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0lNX1NNX1FSRVNVTUU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fY2xlYW51cCk7CisJCWJmYV9pb2ltX3NlbmRfYWJvcnQoaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9BQk9SVDoKKwkJLyoqCisJCSAqIElPIGlzIGFscmFlZHkgYmVpbmcgY2xlYW5lZCB1cCBpbXBsaWNpdGx5CisJCSAqLworCQlpb2ltLT5pb19jYmZuID0gX19iZmFfY2JfaW9pbV9hYm9ydDsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0NPTVBfR09PRDoKKwljYXNlIEJGQV9JT0lNX1NNX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmaW9pbS0+aW9zcC0+cmVxcV93YWl0KTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgaW9pbS0+aW9fY2JmbiwgaW9pbSk7CisJCWJmYV9pb2ltX25vdGlmeV9jbGVhbnVwKGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fRE9ORToKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2JfZnJlZSk7CisJCWJmYV9yZXFxX3djYW5jZWwoJmlvaW0tPmlvc3AtPnJlcXFfd2FpdCk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsIGlvaW0tPmlvX2NiZm4sIGlvaW0pOworCQliZmFfaW9pbV9ub3RpZnlfY2xlYW51cChpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQliZmFfcmVxcV93Y2FuY2VsKCZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLCBfX2JmYV9jYl9pb2ltX2ZhaWxlZCwKKwkJCSAgICAgIGlvaW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIElPIGJmYSBjYWxsYmFjayBpcyBwZW5kaW5nLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fc21faGNiKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLCBlbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmNfZnAoaW9pbS0+YmZhLCBpb2ltLT5pb3RhZyk7CisJYmZhX3RyY19mcChpb2ltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0lNX1NNX0hDQjoKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV91bmluaXQpOworCQliZmFfaW9pbV9mcmVlKGlvaW0pOworCQliZmFfY2JfaW9pbV9yZXNmcmVlKGlvaW0tPmJmYS0+YmZhZCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9DTEVBTlVQOgorCQliZmFfaW9pbV9ub3RpZnlfY2xlYW51cChpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0hXRkFJTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBJTyBiZmEgY2FsbGJhY2sgaXMgcGVuZGluZy4gSU8gcmVzb3VyY2UgY2Fubm90IGJlIGZyZWVkLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fc21faGNiX2ZyZWUoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIGVudW0gYmZhX2lvaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGlvaW0tPmlvdGFnKTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lPSU1fU01fSENCOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX3Jlc2ZyZWUpOworCQlsaXN0X2RlbCgmaW9pbS0+cWUpOworCQlsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwgJmlvaW0tPmZjcGltLT5pb2ltX3Jlc2ZyZWVfcSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9GUkVFOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9DTEVBTlVQOgorCQliZmFfaW9pbV9ub3RpZnlfY2xlYW51cChpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIElPIGlzIGNvbXBsZXRlZCwgd2FpdGluZyByZXNvdXJjZSBmcmVlIGZyb20gZmlybXdhcmUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9zbV9yZXNmcmVlKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLCBlbnVtIGJmYV9pb2ltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaW9pbS0+YmZhLCBpb2ltLT5pb3RhZyk7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0lNX1NNX0ZSRUU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21fdW5pbml0KTsKKwkJYmZhX2lvaW1fZnJlZShpb2ltKTsKKwkJYmZhX2NiX2lvaW1fcmVzZnJlZShpb2ltLT5iZmEtPmJmYWQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fQ0xFQU5VUDoKKwkJYmZhX2lvaW1fbm90aWZ5X2NsZWFudXAoaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9IV0ZBSUw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKworCisvKioKKyAqICBiZmFfaW9pbV9wcml2YXRlCisgKi8KKworc3RhdGljIHZvaWQKK19fYmZhX2NiX2lvaW1fZ29vZF9jb21wKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltID0gY2Jhcmc7CisKKwlpZiAoIWNvbXBsZXRlKSB7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0hDQik7CisJCXJldHVybjsKKwl9CisKKwliZmFfY2JfaW9pbV9nb29kX2NvbXAoaW9pbS0+YmZhLT5iZmFkLCBpb2ltLT5kaW8pOworfQorCitzdGF0aWMgdm9pZAorX19iZmFfY2JfaW9pbV9jb21wKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfaW9pbV9zCSppb2ltID0gY2Jhcmc7CisJc3RydWN0IGJmaV9pb2ltX3JzcF9zICptOworCXU4CQkqc25zaW5mbyA9IE5VTEw7CisJdTggICAgICAgICBzbnNfbGVuID0gMDsKKwlzMzIgICAgICAgICByZXNpZHVlID0gMDsKKworCWlmICghY29tcGxldGUpIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fSENCKTsKKwkJcmV0dXJuOworCX0KKworCW0gPSAoc3RydWN0IGJmaV9pb2ltX3JzcF9zICopICZpb2ltLT5pb3NwLT5jb21wX3JzcG1zZzsKKwlpZiAobS0+aW9fc3RhdHVzID09IEJGSV9JT0lNX1NUU19PSykgeworCQkvKioKKwkJICogc2V0dXAgc2Vuc2UgaW5mb3JtYXRpb24sIGlmIHByZXNlbnQKKwkJICovCisJCWlmIChtLT5zY3NpX3N0YXR1cyA9PSBTQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT04KKwkJCQkJJiYgbS0+c25zX2xlbikgeworCQkJc25zX2xlbiA9IG0tPnNuc19sZW47CisJCQlzbnNpbmZvID0gaW9pbS0+aW9zcC0+c25zaW5mbzsKKwkJfQorCisJCS8qKgorCQkgKiBzZXR1cCByZXNpZHVlIHZhbHVlIGNvcnJlY3RseSBmb3Igbm9ybWFsIGNvbXBsZXRpb25zCisJCSAqLworCQlpZiAobS0+cmVzaWRfZmxhZ3MgPT0gRkNQX1JFU0lEX1VOREVSKQorCQkJcmVzaWR1ZSA9IGJmYV9vc19udG9obChtLT5yZXNpZHVlKTsKKwkJaWYgKG0tPnJlc2lkX2ZsYWdzID09IEZDUF9SRVNJRF9PVkVSKSB7CisJCQlyZXNpZHVlID0gYmZhX29zX250b2hsKG0tPnJlc2lkdWUpOworCQkJcmVzaWR1ZSA9IC1yZXNpZHVlOworCQl9CisJfQorCisJYmZhX2NiX2lvaW1fZG9uZShpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbywgbS0+aW9fc3RhdHVzLAorCQkJICBtLT5zY3NpX3N0YXR1cywgc25zX2xlbiwgc25zaW5mbywgcmVzaWR1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9pb2ltX2ZhaWxlZCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSA9IGNiYXJnOworCisJaWYgKCFjb21wbGV0ZSkgeworCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9IQ0IpOworCQlyZXR1cm47CisJfQorCisJYmZhX2NiX2lvaW1fZG9uZShpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbywgQkZJX0lPSU1fU1RTX0FCT1JURUQsCisJCQkgIDAsIDAsIE5VTEwsIDApOworfQorCitzdGF0aWMgdm9pZAorX19iZmFfY2JfaW9pbV9wYXRodG92KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltID0gY2Jhcmc7CisKKwlpZiAoIWNvbXBsZXRlKSB7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0hDQik7CisJCXJldHVybjsKKwl9CisKKwliZmFfY2JfaW9pbV9kb25lKGlvaW0tPmJmYS0+YmZhZCwgaW9pbS0+ZGlvLCBCRklfSU9JTV9TVFNfUEFUSFRPViwKKwkJCSAgMCwgMCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9pb2ltX2Fib3J0KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltID0gY2Jhcmc7CisKKwlpZiAoIWNvbXBsZXRlKSB7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0hDQik7CisJCXJldHVybjsKKwl9CisKKwliZmFfY2JfaW9pbV9hYm9ydChpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbyk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9zZ3BnX2FsbG9jZWQodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0gPSBjYmFyZzsKKworCWlvaW0tPm5zZ3BncyA9IEJGQV9TR1BHX05QQUdFKGlvaW0tPm5zZ2VzKTsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJmlvaW0tPmlvc3AtPnNncGdfd3FlLnNncGdfcSwgJmlvaW0tPnNncGdfcSk7CisJYmZhX2lvaW1fc2dwZ19zZXR1cChpb2ltKTsKKwliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9TR0FMTE9DRUQpOworfQorCisvKioKKyAqIFNlbmQgSS9PIHJlcXVlc3QgdG8gZmlybXdhcmUuCisgKi8KK3N0YXRpYyAgICAgICAgICBiZmFfYm9vbGVhbl90CitiZmFfaW9pbV9zZW5kX2lvcmVxKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCXN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0gPSBpb2ltLT5pdG5pbTsKKwlzdHJ1Y3QgYmZpX2lvaW1fcmVxX3MgKm07CisJc3RhdGljIHN0cnVjdCBmY3BfY21uZF9zIGNtbmRfejAgPSB7IDAgfTsKKwlzdHJ1Y3QgYmZpX3NnZV9zICAgICAgKnNnZTsKKwl1MzIgICAgICAgIHBnZGxlbiA9IDA7CisKKwkvKioKKwkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CisJICovCisJbSA9IGJmYV9yZXFxX25leHQoaW9pbS0+YmZhLCBpdG5pbS0+cmVxcSk7CisJaWYgKCFtKSB7CisJCWJmYV9yZXFxX3dhaXQoaW9pbS0+YmZhLCBpb2ltLT5pdG5pbS0+cmVxcSwKKwkJCQkgICZpb2ltLT5pb3NwLT5yZXFxX3dhaXQpOworCQlyZXR1cm4gQkZBX0ZBTFNFOworCX0KKworCS8qKgorCSAqIGJ1aWxkIGkvbyByZXF1ZXN0IG1lc3NhZ2UgbmV4dAorCSAqLworCW0tPmlvX3RhZyA9IGJmYV9vc19odG9ucyhpb2ltLT5pb3RhZyk7CisJbS0+cnBvcnRfaGRsID0gaW9pbS0+aXRuaW0tPnJwb3J0LT5md19oYW5kbGU7CisJbS0+aW9fdGltZW91dCA9IGJmYV9jYl9pb2ltX2dldF90aW1lb3V0KGlvaW0tPmRpbyk7CisKKwkvKioKKwkgKiBidWlsZCBpbmxpbmUgSU8gU0cgZWxlbWVudCBoZXJlCisJICovCisJc2dlID0gJm0tPnNnZXNbMF07CisJaWYgKGlvaW0tPm5zZ2VzKSB7CisJCXNnZS0+c2dhID0gYmZhX2NiX2lvaW1fZ2V0X3NnYWRkcihpb2ltLT5kaW8sIDApOworCQlwZ2RsZW4gPSBiZmFfY2JfaW9pbV9nZXRfc2dsZW4oaW9pbS0+ZGlvLCAwKTsKKwkJc2dlLT5zZ19sZW4gPSBwZ2RsZW47CisJCXNnZS0+ZmxhZ3MgPSAoaW9pbS0+bnNnZXMgPiBCRklfU0dFX0lOTElORSkgPworCQkJCQlCRklfU0dFX0RBVEFfQ1BMIDogQkZJX1NHRV9EQVRBX0xBU1Q7CisJCWJmYV9zZ2VfdG9fYmUoc2dlKTsKKwkJc2dlKys7CisJfQorCisJaWYgKGlvaW0tPm5zZ2VzID4gQkZJX1NHRV9JTkxJTkUpIHsKKwkJc2dlLT5zZ2EgPSBpb2ltLT5zZ3BnLT5zZ3BnX3BhOworCX0gZWxzZSB7CisJCXNnZS0+c2dhLmEzMi5hZGRyX2xvID0gMDsKKwkJc2dlLT5zZ2EuYTMyLmFkZHJfaGkgPSAwOworCX0KKwlzZ2UtPnNnX2xlbiA9IHBnZGxlbjsKKwlzZ2UtPmZsYWdzID0gQkZJX1NHRV9QR0RMRU47CisJYmZhX3NnZV90b19iZShzZ2UpOworCisJLyoqCisJICogc2V0IHVwIEkvTyBjb21tYW5kIHBhcmFtZXRlcnMKKwkgKi8KKwliZmFfb3NfYXNzaWduKG0tPmNtbmQsIGNtbmRfejApOworCW0tPmNtbmQubHVuID0gYmZhX2NiX2lvaW1fZ2V0X2x1bihpb2ltLT5kaW8pOworCW0tPmNtbmQuaW9kaXIgPSBiZmFfY2JfaW9pbV9nZXRfaW9kaXIoaW9pbS0+ZGlvKTsKKwliZmFfb3NfYXNzaWduKG0tPmNtbmQuY2RiLAorCQkJKihzdHJ1Y3Qgc2NzaV9jZGJfcyAqKWJmYV9jYl9pb2ltX2dldF9jZGIoaW9pbS0+ZGlvKSk7CisJbS0+Y21uZC5mY3BfZGwgPSBiZmFfb3NfaHRvbmwoYmZhX2NiX2lvaW1fZ2V0X3NpemUoaW9pbS0+ZGlvKSk7CisKKwkvKioKKwkgKiBzZXQgdXAgSS9PIG1lc3NhZ2UgaGVhZGVyCisJICovCisJc3dpdGNoIChtLT5jbW5kLmlvZGlyKSB7CisJY2FzZSBGQ1BfSU9ESVJfUkVBRDoKKwkJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JT0lNX1JFQUQsIDAsIGJmYV9scHVpZChpb2ltLT5iZmEpKTsKKwkJYmZhX3N0YXRzKGl0bmltLCBpbnB1dF9yZXFzKTsKKwkJYnJlYWs7CisJY2FzZSBGQ1BfSU9ESVJfV1JJVEU6CisJCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfSU9JTV9XUklURSwgMCwgYmZhX2xwdWlkKGlvaW0tPmJmYSkpOworCQliZmFfc3RhdHMoaXRuaW0sIG91dHB1dF9yZXFzKTsKKwkJYnJlYWs7CisJY2FzZSBGQ1BfSU9ESVJfUlc6CisJCWJmYV9zdGF0cyhpdG5pbSwgaW5wdXRfcmVxcyk7CisJCWJmYV9zdGF0cyhpdG5pbSwgb3V0cHV0X3JlcXMpOworCWRlZmF1bHQ6CisJCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfSU9JTV9JTywgMCwgYmZhX2xwdWlkKGlvaW0tPmJmYSkpOworCX0KKwlpZiAoaXRuaW0tPnNlcV9yZWMgfHwKKwkgICAgKGJmYV9jYl9pb2ltX2dldF9zaXplKGlvaW0tPmRpbykgJiAoc2l6ZW9mKHUzMikgLSAxKSkpCisJCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfSU9JTV9JTywgMCwgYmZhX2xwdWlkKGlvaW0tPmJmYSkpOworCisjaWZkZWYgSU9JTV9BRFZBTkNFRAorCW0tPmNtbmQuY3JuID0gYmZhX2NiX2lvaW1fZ2V0X2Nybihpb2ltLT5kaW8pOworCW0tPmNtbmQucHJpb3JpdHkgPSBiZmFfY2JfaW9pbV9nZXRfcHJpb3JpdHkoaW9pbS0+ZGlvKTsKKwltLT5jbW5kLnRhc2thdHRyID0gYmZhX2NiX2lvaW1fZ2V0X3Rhc2thdHRyKGlvaW0tPmRpbyk7CisKKwkvKioKKwkgKiBIYW5kbGUgbGFyZ2UgQ0RCICg+MTYgYnl0ZXMpLgorCSAqLworCW0tPmNtbmQuYWRkbF9jZGJfbGVuID0gKGJmYV9jYl9pb2ltX2dldF9jZGJsZW4oaW9pbS0+ZGlvKSAtCisJCQkJCUZDUF9DTU5EX0NEQl9MRU4pIC8gc2l6ZW9mKHUzMik7CisJaWYgKG0tPmNtbmQuYWRkbF9jZGJfbGVuKSB7CisJCWJmYV9vc19tZW1jcHkoJm0tPmNtbmQuY2RiICsgMSwgKHN0cnVjdCBzY3NpX2NkYl9zICopCisJCQkJYmZhX2NiX2lvaW1fZ2V0X2NkYihpb2ltLT5kaW8pICsgMSwKKwkJCQltLT5jbW5kLmFkZGxfY2RiX2xlbiAqIHNpemVvZih1MzIpKTsKKwkJZmNwX2NtbmRfZmNwZGwoJm0tPmNtbmQpID0KKwkJCQliZmFfb3NfaHRvbmwoYmZhX2NiX2lvaW1fZ2V0X3NpemUoaW9pbS0+ZGlvKSk7CisJfQorI2VuZGlmCisKKwkvKioKKwkgKiBxdWV1ZSBJL08gbWVzc2FnZSB0byBmaXJtd2FyZQorCSAqLworCWJmYV9yZXFxX3Byb2R1Y2UoaW9pbS0+YmZhLCBpdG5pbS0+cmVxcSk7CisJcmV0dXJuIEJGQV9UUlVFOworfQorCisvKioKKyAqIFNldHVwIGFueSBhZGRpdGlvbmFsIFNHIHBhZ2VzIG5lZWRlZC5JbmxpbmUgU0cgZWxlbWVudCBpcyBzZXR1cAorICogYXQgcXVldWluZyB0aW1lLgorICovCitzdGF0aWMgYmZhX2Jvb2xlYW5fdAorYmZhX2lvaW1fc2dlX3NldHVwKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCXUxNiAgICAgICAgbnNncGdzOworCisJYmZhX2Fzc2VydChpb2ltLT5uc2dlcyA+IEJGSV9TR0VfSU5MSU5FKTsKKworCS8qKgorCSAqIGFsbG9jYXRlIFNHIHBhZ2VzIG5lZWRlZAorCSAqLworCW5zZ3BncyA9IEJGQV9TR1BHX05QQUdFKGlvaW0tPm5zZ2VzKTsKKwlpZiAoIW5zZ3BncykKKwkJcmV0dXJuIEJGQV9UUlVFOworCisJaWYgKGJmYV9zZ3BnX21hbGxvYyhpb2ltLT5iZmEsICZpb2ltLT5zZ3BnX3EsIG5zZ3BncykKKwkgICAgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfc2dwZ193YWl0KGlvaW0tPmJmYSwgJmlvaW0tPmlvc3AtPnNncGdfd3FlLCBuc2dwZ3MpOworCQlyZXR1cm4gQkZBX0ZBTFNFOworCX0KKworCWlvaW0tPm5zZ3BncyA9IG5zZ3BnczsKKwliZmFfaW9pbV9zZ3BnX3NldHVwKGlvaW0pOworCisJcmV0dXJuIEJGQV9UUlVFOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fc2dwZ19zZXR1cChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwlpbnQgICAgICAgICAgICAgc2dlaWQsIG5zZ2VzLCBpOworCXN0cnVjdCBiZmlfc2dlX3MgICAgICAqc2dlOworCXN0cnVjdCBiZmFfc2dwZ19zICpzZ3BnOworCXUzMiAgICAgICAgcGdjdW1zejsKKworCXNnZWlkID0gQkZJX1NHRV9JTkxJTkU7CisJaW9pbS0+c2dwZyA9IHNncGcgPSBiZmFfcV9maXJzdCgmaW9pbS0+c2dwZ19xKTsKKworCWRvIHsKKwkJc2dlID0gc2dwZy0+c2dwZy0+c2dlczsKKwkJbnNnZXMgPSBpb2ltLT5uc2dlcyAtIHNnZWlkOworCQlpZiAobnNnZXMgPiBCRklfU0dQR19EQVRBX1NHRVMpCisJCQluc2dlcyA9IEJGSV9TR1BHX0RBVEFfU0dFUzsKKworCQlwZ2N1bXN6ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG5zZ2VzOyBpKyssIHNnZSsrLCBzZ2VpZCsrKSB7CisJCQlzZ2UtPnNnYSA9IGJmYV9jYl9pb2ltX2dldF9zZ2FkZHIoaW9pbS0+ZGlvLCBzZ2VpZCk7CisJCQlzZ2UtPnNnX2xlbiA9IGJmYV9jYl9pb2ltX2dldF9zZ2xlbihpb2ltLT5kaW8sIHNnZWlkKTsKKwkJCXBnY3Vtc3ogKz0gc2dlLT5zZ19sZW47CisKKwkJCS8qKgorCQkJICogc2V0IGZsYWdzCisJCQkgKi8KKwkJCWlmIChpIDwgKG5zZ2VzIC0gMSkpCisJCQkJc2dlLT5mbGFncyA9IEJGSV9TR0VfREFUQTsKKwkJCWVsc2UgaWYgKHNnZWlkIDwgKGlvaW0tPm5zZ2VzIC0gMSkpCisJCQkJc2dlLT5mbGFncyA9IEJGSV9TR0VfREFUQV9DUEw7CisJCQllbHNlCisJCQkJc2dlLT5mbGFncyA9IEJGSV9TR0VfREFUQV9MQVNUOworCQl9CisKKwkJc2dwZyA9IChzdHJ1Y3QgYmZhX3NncGdfcyAqKSBiZmFfcV9uZXh0KHNncGcpOworCisJCS8qKgorCQkgKiBzZXQgdGhlIGxpbmsgZWxlbWVudCBvZiBlYWNoIHBhZ2UKKwkJICovCisJCWlmIChzZ2VpZCA9PSBpb2ltLT5uc2dlcykgeworCQkJc2dlLT5mbGFncyA9IEJGSV9TR0VfUEdETEVOOworCQkJc2dlLT5zZ2EuYTMyLmFkZHJfbG8gPSAwOworCQkJc2dlLT5zZ2EuYTMyLmFkZHJfaGkgPSAwOworCQl9IGVsc2UgeworCQkJc2dlLT5mbGFncyA9IEJGSV9TR0VfTElOSzsKKwkJCXNnZS0+c2dhID0gc2dwZy0+c2dwZ19wYTsKKwkJfQorCQlzZ2UtPnNnX2xlbiA9IHBnY3Vtc3o7CisJfSB3aGlsZSAoc2dlaWQgPCBpb2ltLT5uc2dlcyk7Cit9CisKKy8qKgorICogU2VuZCBJL08gYWJvcnQgcmVxdWVzdCB0byBmaXJtd2FyZS4KKyAqLworc3RhdGljICAgICAgICAgIGJmYV9ib29sZWFuX3QKK2JmYV9pb2ltX3NlbmRfYWJvcnQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCit7CisJc3RydWN0IGJmYV9pdG5pbV9zICAgICAgICAgICppdG5pbSA9IGlvaW0tPml0bmltOworCXN0cnVjdCBiZmlfaW9pbV9hYm9ydF9yZXFfcyAqbTsKKwllbnVtIGJmaV9pb2ltX2gyaSAgICAgICBtc2dvcDsKKworCS8qKgorCSAqIGNoZWNrIGZvciByb29tIGluIHF1ZXVlIHRvIHNlbmQgcmVxdWVzdCBub3cKKwkgKi8KKwltID0gYmZhX3JlcXFfbmV4dChpb2ltLT5iZmEsIGl0bmltLT5yZXFxKTsKKwlpZiAoIW0pCisJCXJldHVybiBCRkFfRkFMU0U7CisKKwkvKioKKwkgKiBidWlsZCBpL28gcmVxdWVzdCBtZXNzYWdlIG5leHQKKwkgKi8KKwlpZiAoaW9pbS0+aW9zcC0+YWJvcnRfZXhwbGljaXQpCisJCW1zZ29wID0gQkZJX0lPSU1fSDJJX0lPQUJPUlRfUkVROworCWVsc2UKKwkJbXNnb3AgPSBCRklfSU9JTV9IMklfSU9DTEVBTlVQX1JFUTsKKworCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfSU9JTSwgbXNnb3AsIGJmYV9scHVpZChpb2ltLT5iZmEpKTsKKwltLT5pb190YWcgICAgPSBiZmFfb3NfaHRvbnMoaW9pbS0+aW90YWcpOworCW0tPmFib3J0X3RhZyA9ICsraW9pbS0+YWJvcnRfdGFnOworCisJLyoqCisJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKKwkgKi8KKwliZmFfcmVxcV9wcm9kdWNlKGlvaW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCXJldHVybiBCRkFfVFJVRTsKK30KKworLyoqCisgKiBDYWxsIHRvIHJlc3VtZSBhbnkgSS9PIHJlcXVlc3RzIHdhaXRpbmcgZm9yIHJvb20gaW4gcmVxdWVzdCBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2ltX3FyZXN1bWUodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0gPSBjYmFyZzsKKworCWJmYV9mY3BpbV9zdGF0cyhpb2ltLT5mY3BpbSwgcXJlc3VtZXMpOworCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX1FSRVNVTUUpOworfQorCisKK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9ub3RpZnlfY2xlYW51cChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwkvKioKKwkgKiBNb3ZlIElPIGZyb20gaXRuaW0gcXVldWUgdG8gZmNwaW0gZ2xvYmFsIHF1ZXVlIHNpbmNlIGl0bmltIHdpbGwgYmUKKwkgKiBmcmVlZC4KKwkgKi8KKwlsaXN0X2RlbCgmaW9pbS0+cWUpOworCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmaW9pbS0+ZmNwaW0tPmlvaW1fY29tcF9xKTsKKworCWlmICghaW9pbS0+aW9zcC0+dHNraW0pIHsKKwkJaWYgKGlvaW0tPmZjcGltLT5kZWxheV9jb21wICYmIGlvaW0tPml0bmltLT5pb3Rvdl9hY3RpdmUpIHsKKwkJCWJmYV9jYl9kZXF1ZXVlKCZpb2ltLT5oY2JfcWUpOworCQkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmaW9pbS0+aXRuaW0tPmRlbGF5X2NvbXBfcSk7CisJCX0KKwkJYmZhX2l0bmltX2lvZG9uZShpb2ltLT5pdG5pbSk7CisJfSBlbHNlCisJCWJmYV90c2tpbV9pb2RvbmUoaW9pbS0+aW9zcC0+dHNraW0pOworfQorCisvKioKKyAqIAkJICBvciBhZnRlciB0aGUgbGluayBjb21lcyBiYWNrLgorICovCit2b2lkCitiZmFfaW9pbV9kZWxheWVkX2NvbXAoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIGJmYV9ib29sZWFuX3QgaW90b3YpCit7CisJLyoqCisJICogSWYgcGF0aCB0b3YgdGltZXIgZXhwaXJlZCwgZmFpbGJhY2sgd2l0aCBQQVRIVE9WIHN0YXR1cyAtIHRoZXNlCisJICogSU8gcmVxdWVzdHMgYXJlIG5vdCBub3JtYWxseSByZXRyaWVkIGJ5IElPIHN0YWNrLgorCSAqCisJICogT3RoZXJ3aXNlIGRldmljZSBjYW1lYmFjayBvbmxpbmUgYW5kIGZhaWwgaXQgd2l0aCBub3JtYWwgZmFpbGVkCisJICogc3RhdHVzIHNvIHRoYXQgSU8gc3RhY2sgcmV0cmllcyB0aGVzZSBmYWlsZWQgSU8gcmVxdWVzdHMuCisJICovCisJaWYgKGlvdG92KQorCQlpb2ltLT5pb19jYmZuID0gX19iZmFfY2JfaW9pbV9wYXRodG92OworCWVsc2UKKwkJaW9pbS0+aW9fY2JmbiA9IF9fYmZhX2NiX2lvaW1fZmFpbGVkOworCisJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwgaW9pbS0+aW9fY2JmbiwgaW9pbSk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlIElPIHRvIGZjcGltIGdsb2JhbCBxdWV1ZSBzaW5jZSBpdG5pbSB3aWxsIGJlCisgICAgICogZnJlZWQuCisgICAgICovCisgICAgbGlzdF9kZWwoJmlvaW0tPnFlKTsKKyAgICBsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwgJmlvaW0tPmZjcGltLT5pb2ltX2NvbXBfcSk7Cit9CisKKworCisvKioKKyAqICBiZmFfaW9pbV9mcmllbmQKKyAqLworCisvKioKKyAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4KKyAqLwordm9pZAorYmZhX2lvaW1fYXR0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWluZm8pCit7CisJc3RydWN0IGJmYV9pb2ltX3MJCSppb2ltOworCXN0cnVjdCBiZmFfaW9pbV9zcF9zCSppb3NwOworCXUxNgkJaTsKKwl1OAkJCSpzbnNpbmZvOworCXUzMgkJc25zYnVmc3o7CisKKwkvKioKKwkgKiBjbGFpbSBtZW1vcnkgZmlyc3QKKwkgKi8KKwlpb2ltID0gKHN0cnVjdCBiZmFfaW9pbV9zICopIGJmYV9tZW1pbmZvX2t2YShtaW5mbyk7CisJZmNwaW0tPmlvaW1fYXJyID0gaW9pbTsKKwliZmFfbWVtaW5mb19rdmEobWluZm8pID0gKHU4ICopIChpb2ltICsgZmNwaW0tPm51bV9pb2ltX3JlcXMpOworCisJaW9zcCA9IChzdHJ1Y3QgYmZhX2lvaW1fc3BfcyAqKSBiZmFfbWVtaW5mb19rdmEobWluZm8pOworCWZjcGltLT5pb2ltX3NwX2FyciA9IGlvc3A7CisJYmZhX21lbWluZm9fa3ZhKG1pbmZvKSA9ICh1OCAqKSAoaW9zcCArIGZjcGltLT5udW1faW9pbV9yZXFzKTsKKworCS8qKgorCSAqIENsYWltIERNQSBtZW1vcnkgZm9yIHBlciBJTyBzZW5zZSBkYXRhLgorCSAqLworCXNuc2J1ZnN6ID0gZmNwaW0tPm51bV9pb2ltX3JlcXMgKiBCRklfSU9JTV9TTlNMRU47CisJZmNwaW0tPnNuc2Jhc2UucGEgID0gYmZhX21lbWluZm9fZG1hX3BoeXMobWluZm8pOworCWJmYV9tZW1pbmZvX2RtYV9waHlzKG1pbmZvKSArPSBzbnNidWZzejsKKworCWZjcGltLT5zbnNiYXNlLmt2YSA9IGJmYV9tZW1pbmZvX2RtYV92aXJ0KG1pbmZvKTsKKwliZmFfbWVtaW5mb19kbWFfdmlydChtaW5mbykgKz0gc25zYnVmc3o7CisJc25zaW5mbyA9IGZjcGltLT5zbnNiYXNlLmt2YTsKKwliZmFfaW9jZmNfc2V0X3Nuc2Jhc2UoZmNwaW0tPmJmYSwgZmNwaW0tPnNuc2Jhc2UucGEpOworCisJLyoqCisJICogSW5pdGlhbGl6ZSBpb2ltIGZyZWUgcXVldWVzCisJICovCisJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT5pb2ltX2ZyZWVfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT5pb2ltX3Jlc2ZyZWVfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT5pb2ltX2NvbXBfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmNwaW0tPm51bV9pb2ltX3JlcXM7CisJICAgICBpKyssIGlvaW0rKywgaW9zcCsrLCBzbnNpbmZvICs9IEJGSV9JT0lNX1NOU0xFTikgeworCQkvKgorCQkgKiBpbml0aWFsaXplIElPSU0KKwkJICovCisJCWJmYV9vc19tZW1zZXQoaW9pbSwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfaW9pbV9zKSk7CisJCWlvaW0tPmlvdGFnICAgPSBpOworCQlpb2ltLT5iZmEgICAgID0gZmNwaW0tPmJmYTsKKwkJaW9pbS0+ZmNwaW0gICA9IGZjcGltOworCQlpb2ltLT5pb3NwICAgID0gaW9zcDsKKwkJaW9zcC0+c25zaW5mbyA9IHNuc2luZm87CisJCUlOSVRfTElTVF9IRUFEKCZpb2ltLT5zZ3BnX3EpOworCQliZmFfcmVxcV93aW5pdCgmaW9pbS0+aW9zcC0+cmVxcV93YWl0LAorCQkJCSAgIGJmYV9pb2ltX3FyZXN1bWUsIGlvaW0pOworCQliZmFfc2dwZ193aW5pdCgmaW9pbS0+aW9zcC0+c2dwZ193cWUsCisJCQkJICAgYmZhX2lvaW1fc2dwZ19hbGxvY2VkLCBpb2ltKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV91bmluaXQpOworCisJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmZmNwaW0tPmlvaW1fZnJlZV9xKTsKKwl9Cit9CisKKy8qKgorICogRHJpdmVyIGRldGFjaCB0aW1lIGNhbGwuCisgKi8KK3ZvaWQKK2JmYV9pb2ltX2RldGFjaChzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSkKK3sKK30KKwordm9pZAorYmZhX2lvaW1faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKQoreworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCXN0cnVjdCBiZmlfaW9pbV9yc3BfcyAqcnNwID0gKHN0cnVjdCBiZmlfaW9pbV9yc3BfcyAqKSBtOworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltOworCXUxNiAgICAgICAgaW90YWc7CisJZW51bSBiZmFfaW9pbV9ldmVudCBldnQgPSBCRkFfSU9JTV9TTV9DT01QOworCisJaW90YWcgPSBiZmFfb3NfbnRvaHMocnNwLT5pb190YWcpOworCisJaW9pbSA9IEJGQV9JT0lNX0ZST01fVEFHKGZjcGltLCBpb3RhZyk7CisJYmZhX2Fzc2VydChpb2ltLT5pb3RhZyA9PSBpb3RhZyk7CisKKwliZmFfdHJjKGlvaW0tPmJmYSwgaW9pbS0+aW90YWcpOworCWJmYV90cmMoaW9pbS0+YmZhLCByc3AtPmlvX3N0YXR1cyk7CisJYmZhX3RyYyhpb2ltLT5iZmEsIHJzcC0+cmV1c2VfaW9fdGFnKTsKKworCWlmIChiZmFfc21fY21wX3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2FjdGl2ZSkpCisJCWJmYV9vc19hc3NpZ24oaW9pbS0+aW9zcC0+Y29tcF9yc3Btc2csICptKTsKKworCXN3aXRjaCAocnNwLT5pb19zdGF0dXMpIHsKKwljYXNlIEJGSV9JT0lNX1NUU19PSzoKKwkJYmZhX2ZjcGltX3N0YXRzKGZjcGltLCBpb2NvbXBfb2spOworCQlpZiAocnNwLT5yZXVzZV9pb190YWcgPT0gMCkKKwkJCWV2dCA9IEJGQV9JT0lNX1NNX0RPTkU7CisJCWVsc2UKKwkJCWV2dCA9IEJGQV9JT0lNX1NNX0NPTVA7CisJCWJyZWFrOworCisJY2FzZSBCRklfSU9JTV9TVFNfVElNRURPVVQ6CisJY2FzZSBCRklfSU9JTV9TVFNfQUJPUlRFRDoKKwkJcnNwLT5pb19zdGF0dXMgPSBCRklfSU9JTV9TVFNfQUJPUlRFRDsKKwkJYmZhX2ZjcGltX3N0YXRzKGZjcGltLCBpb2NvbXBfYWJvcnRlZCk7CisJCWlmIChyc3AtPnJldXNlX2lvX3RhZyA9PSAwKQorCQkJZXZ0ID0gQkZBX0lPSU1fU01fRE9ORTsKKwkJZWxzZQorCQkJZXZ0ID0gQkZBX0lPSU1fU01fQ09NUDsKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9JT0lNX1NUU19QUk9UT19FUlI6CisJCWJmYV9mY3BpbV9zdGF0cyhmY3BpbSwgaW9jb21fcHJvdG9fZXJyKTsKKwkJYmZhX2Fzc2VydChyc3AtPnJldXNlX2lvX3RhZyk7CisJCWV2dCA9IEJGQV9JT0lNX1NNX0NPTVA7CisJCWJyZWFrOworCisJY2FzZSBCRklfSU9JTV9TVFNfU1FFUl9ORUVERUQ6CisJCWJmYV9mY3BpbV9zdGF0cyhmY3BpbSwgaW9jb21fc3Flcl9uZWVkZWQpOworCQliZmFfYXNzZXJ0KHJzcC0+cmV1c2VfaW9fdGFnID09IDApOworCQlldnQgPSBCRkFfSU9JTV9TTV9TUVJFVFJZOworCQlicmVhazsKKworCWNhc2UgQkZJX0lPSU1fU1RTX1JFU19GUkVFOgorCQliZmFfZmNwaW1fc3RhdHMoZmNwaW0sIGlvY29tX3Jlc19mcmVlKTsKKwkJZXZ0ID0gQkZBX0lPSU1fU01fRlJFRTsKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9JT0lNX1NUU19IT1NUX0FCT1JURUQ6CisJCWJmYV9mY3BpbV9zdGF0cyhmY3BpbSwgaW9jb21faG9zdGFicnRzKTsKKwkJaWYgKHJzcC0+YWJvcnRfdGFnICE9IGlvaW0tPmFib3J0X3RhZykgeworCQkJYmZhX3RyYyhpb2ltLT5iZmEsIHJzcC0+YWJvcnRfdGFnKTsKKwkJCWJmYV90cmMoaW9pbS0+YmZhLCBpb2ltLT5hYm9ydF90YWcpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHJzcC0+cmV1c2VfaW9fdGFnKQorCQkJZXZ0ID0gQkZBX0lPSU1fU01fQUJPUlRfQ09NUDsKKwkJZWxzZQorCQkJZXZ0ID0gQkZBX0lPSU1fU01fQUJPUlRfRE9ORTsKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9JT0lNX1NUU19VVEFHOgorCQliZmFfZmNwaW1fc3RhdHMoZmNwaW0sIGlvY29tX3V0YWdzKTsKKwkJZXZ0ID0gQkZBX0lPSU1fU01fQ09NUF9VVEFHOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorCisJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgZXZ0KTsKK30KKwordm9pZAorYmZhX2lvaW1fZ29vZF9jb21wX2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZpX2lvaW1fcnNwX3MgKnJzcCA9IChzdHJ1Y3QgYmZpX2lvaW1fcnNwX3MgKikgbTsKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbTsKKwl1MTYgICAgICAgIGlvdGFnOworCisJaW90YWcgPSBiZmFfb3NfbnRvaHMocnNwLT5pb190YWcpOworCisJaW9pbSA9IEJGQV9JT0lNX0ZST01fVEFHKGZjcGltLCBpb3RhZyk7CisJYmZhX2Fzc2VydChpb2ltLT5pb3RhZyA9PSBpb3RhZyk7CisKKwliZmFfdHJjX2ZwKGlvaW0tPmJmYSwgaW9pbS0+aW90YWcpOworCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0NPTVBfR09PRCk7Cit9CisKKy8qKgorICogQ2FsbGVkIGJ5IGl0bmltIHRvIGNsZWFuIHVwIElPIHdoaWxlIGdvaW5nIG9mZmxpbmUuCisgKi8KK3ZvaWQKK2JmYV9pb2ltX2NsZWFudXAoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCit7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGlvaW0tPmlvdGFnKTsKKwliZmFfZmNwaW1fc3RhdHMoaW9pbS0+ZmNwaW0sIGlvX2NsZWFudXBzKTsKKworCWlvaW0tPmlvc3AtPnRza2ltID0gTlVMTDsKKwliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9DTEVBTlVQKTsKK30KKwordm9pZAorYmZhX2lvaW1fY2xlYW51cF90bShzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwgc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSkKK3sKKwliZmFfdHJjKGlvaW0tPmJmYSwgaW9pbS0+aW90YWcpOworCWJmYV9mY3BpbV9zdGF0cyhpb2ltLT5mY3BpbSwgaW9fdG1hYm9ydHMpOworCisJaW9pbS0+aW9zcC0+dHNraW0gPSB0c2tpbTsKKwliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9DTEVBTlVQKTsKK30KKworLyoqCisgKiBJT0MgZmFpbHVyZSBoYW5kbGluZy4KKyAqLwordm9pZAorYmZhX2lvaW1faW9jZGlzYWJsZShzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9IV0ZBSUwpOworfQorCisvKioKKyAqIElPIG9mZmxpbmUgVE9WIHBvcHBlZC4gRmFpbCB0aGUgcGVuZGluZyBJTy4KKyAqLwordm9pZAorYmZhX2lvaW1fdG92KHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0lPVE9WKTsKK30KKworCisKKy8qKgorICogIGJmYV9pb2ltX2FwaQorICovCisKKy8qKgorICogQWxsb2NhdGUgSU9JTSByZXNvdXJjZSBmb3IgaW5pdGlhdG9yIG1vZGUgSS9PIHJlcXVlc3QuCisgKi8KK3N0cnVjdCBiZmFfaW9pbV9zICoKK2JmYV9pb2ltX2FsbG9jKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhZF9pb2ltX3MgKmRpbywKKwkJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwgdTE2IG5zZ2VzKQoreworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltOworCisJLyoqCisJICogYWxvY2F0ZSBJT0lNIHJlc291cmNlCisJICovCisJYmZhX3FfZGVxKCZmY3BpbS0+aW9pbV9mcmVlX3EsICZpb2ltKTsKKwlpZiAoIWlvaW0pIHsKKwkJYmZhX2ZjcGltX3N0YXRzKGZjcGltLCBub19pb3RhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpb2ltLT5kaW8gPSBkaW87CisJaW9pbS0+aXRuaW0gPSBpdG5pbTsKKwlpb2ltLT5uc2dlcyA9IG5zZ2VzOworCWlvaW0tPm5zZ3BncyA9IDA7CisKKwliZmFfc3RhdHMoZmNwaW0sIHRvdGFsX2lvcyk7CisJYmZhX3N0YXRzKGl0bmltLCBpb3MpOworCWZjcGltLT5pb3NfYWN0aXZlKys7CisKKwlsaXN0X2FkZF90YWlsKCZpb2ltLT5xZSwgJml0bmltLT5pb19xKTsKKwliZmFfdHJjX2ZwKGlvaW0tPmJmYSwgaW9pbS0+aW90YWcpOworCisJcmV0dXJuIGlvaW07Cit9CisKK3ZvaWQKK2JmYV9pb2ltX2ZyZWUoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCit7CisJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBpb2ltLT5mY3BpbTsKKworCWJmYV90cmNfZnAoaW9pbS0+YmZhLCBpb2ltLT5pb3RhZyk7CisJYmZhX2Fzc2VydF9mcChiZmFfc21fY21wX3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX3VuaW5pdCkpOworCisJYmZhX2Fzc2VydF9mcChsaXN0X2VtcHR5KCZpb2ltLT5zZ3BnX3EpCisJCSAgIHx8IChpb2ltLT5uc2dlcyA+IEJGSV9TR0VfSU5MSU5FKSk7CisKKwlpZiAoaW9pbS0+bnNncGdzID4gMCkKKwkJYmZhX3NncGdfbWZyZWUoaW9pbS0+YmZhLCAmaW9pbS0+c2dwZ19xLCBpb2ltLT5uc2dwZ3MpOworCisJYmZhX3N0YXRzKGlvaW0tPml0bmltLCBpb19jb21wcyk7CisJZmNwaW0tPmlvc19hY3RpdmUtLTsKKworCWxpc3RfZGVsKCZpb2ltLT5xZSk7CisJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZmY3BpbS0+aW9pbV9mcmVlX3EpOworfQorCit2b2lkCitiZmFfaW9pbV9zdGFydChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwliZmFfdHJjX2ZwKGlvaW0tPmJmYSwgaW9pbS0+aW90YWcpOworCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX1NUQVJUKTsKK30KKworLyoqCisgKiBEcml2ZXIgSS9PIGFib3J0IHJlcXVlc3QuCisgKi8KK3ZvaWQKK2JmYV9pb2ltX2Fib3J0KHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCWJmYV90cmMoaW9pbS0+YmZhLCBpb2ltLT5pb3RhZyk7CisJYmZhX2ZjcGltX3N0YXRzKGlvaW0tPmZjcGltLCBpb19hYm9ydHMpOworCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0FCT1JUKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pdG5pbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaXRuaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDVjNjFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaXRuaW0uYwpAQCAtMCwwICsxLDEwODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9mY3BpbS5oPgorI2luY2x1ZGUgImJmYV9mY3BpbV9wcml2LmgiCisKK0JGQV9UUkNfRklMRShIQUwsIElUTklNKTsKKworI2RlZmluZSBCRkFfSVROSU1fRlJPTV9UQUcoX2ZjcGltLCBfdGFnKQkJCQlcCisJKChfZmNwaW0pLT5pdG5pbV9hcnIgKyAoKF90YWcpICYgKChfZmNwaW0pLT5udW1faXRuaW1zIC0gMSkpKQorCisjZGVmaW5lIGJmYV9mY3BpbV9hZGRpdG4oX19pdG5pbSkJCQkJCVwKKwlsaXN0X2FkZF90YWlsKCYoX19pdG5pbSktPnFlLCAmKF9faXRuaW0pLT5mY3BpbS0+aXRuaW1fcSkKKyNkZWZpbmUgYmZhX2ZjcGltX2RlbGl0bihfX2l0bmltKQlkbyB7CQkJCVwKKwliZmFfYXNzZXJ0KGJmYV9xX2lzX29uX3EoJihfX2l0bmltKS0+ZmNwaW0tPml0bmltX3EsIF9faXRuaW0pKTsgICAgICBcCisJbGlzdF9kZWwoJihfX2l0bmltKS0+cWUpOyAgICAgIFwKKwliZmFfYXNzZXJ0KGxpc3RfZW1wdHkoJihfX2l0bmltKS0+aW9fcSkpOyAgICAgIFwKKwliZmFfYXNzZXJ0KGxpc3RfZW1wdHkoJihfX2l0bmltKS0+aW9fY2xlYW51cF9xKSk7ICAgICAgXAorCWJmYV9hc3NlcnQobGlzdF9lbXB0eSgmKF9faXRuaW0pLT5wZW5kaW5nX3EpKTsgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGJmYV9pdG5pbV9vbmxpbmVfY2IoX19pdG5pbSkgZG8gewkJCQlcCisJaWYgKChfX2l0bmltKS0+YmZhLT5mY3MpCQkJCQlcCisJCWJmYV9jYl9pdG5pbV9vbmxpbmUoKF9faXRuaW0pLT5kaXRuKTsgICAgICBcCisJZWxzZSB7CQkJCQkJCQlcCisJCWJmYV9jYl9xdWV1ZSgoX19pdG5pbSktPmJmYSwgJihfX2l0bmltKS0+aGNiX3FlLAlcCisJCV9fYmZhX2NiX2l0bmltX29ubGluZSwgKF9faXRuaW0pKTsgICAgICBcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBiZmFfaXRuaW1fb2ZmbGluZV9jYihfX2l0bmltKSBkbyB7CQkJCVwKKwlpZiAoKF9faXRuaW0pLT5iZmEtPmZjcykJCQkJCVwKKwkJYmZhX2NiX2l0bmltX29mZmxpbmUoKF9faXRuaW0pLT5kaXRuKTsgICAgICBcCisJZWxzZSB7CQkJCQkJCQlcCisJCWJmYV9jYl9xdWV1ZSgoX19pdG5pbSktPmJmYSwgJihfX2l0bmltKS0+aGNiX3FlLAlcCisJCV9fYmZhX2NiX2l0bmltX29mZmxpbmUsIChfX2l0bmltKSk7ICAgICAgXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYmZhX2l0bmltX3NsZXJfY2IoX19pdG5pbSkgZG8gewkJCQkJXAorCWlmICgoX19pdG5pbSktPmJmYS0+ZmNzKQkJCQkJXAorCQliZmFfY2JfaXRuaW1fc2xlcigoX19pdG5pbSktPmRpdG4pOyAgICAgIFwKKwllbHNlIHsJCQkJCQkJCVwKKwkJYmZhX2NiX3F1ZXVlKChfX2l0bmltKS0+YmZhLCAmKF9faXRuaW0pLT5oY2JfcWUsCVwKKwkJX19iZmFfY2JfaXRuaW1fc2xlciwgKF9faXRuaW0pKTsgICAgICBcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1faW9jZGlzYWJsZV9jbGVhbnVwKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pOworc3RhdGljIGJmYV9ib29sZWFuX3QgYmZhX2l0bmltX3NlbmRfZndjcmVhdGUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSk7CitzdGF0aWMgYmZhX2Jvb2xlYW5fdCBiZmFfaXRuaW1fc2VuZF9md2RlbGV0ZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1fY2xlYW5wX2NvbXAodm9pZCAqaXRuaW1fY2JhcmcpOworc3RhdGljIHZvaWQgICAgIGJmYV9pdG5pbV9jbGVhbnVwKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pOworc3RhdGljIHZvaWQgICAgIF9fYmZhX2NiX2l0bmltX29ubGluZSh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCAgICAgX19iZmFfY2JfaXRuaW1fb2ZmbGluZSh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCAgICAgX19iZmFfY2JfaXRuaW1fc2xlcih2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2l0bmltX2lvdG92X29ubGluZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1faW90b3ZfY2xlYW51cChzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1faW90b3Yodm9pZCAqaXRuaW1fYXJnKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1faW90b3Zfc3RhcnQoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2l0bmltX2lvdG92X3N0b3Aoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2l0bmltX2lvdG92X2RlbGV0ZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKTsKKworLyoqCisgKiAgYmZhX2l0bmltX3NtIEJGQSBpdG5pbSBzdGF0ZSBtYWNoaW5lCisgKi8KKworCitlbnVtIGJmYV9pdG5pbV9ldmVudCB7CisJQkZBX0lUTklNX1NNX0NSRUFURSA9IDEsCS8qICBpdG5pbSBpcyBjcmVhdGVkICovCisJQkZBX0lUTklNX1NNX09OTElORSA9IDIsCS8qICBpdG5pbSBpcyBvbmxpbmUgKi8KKwlCRkFfSVROSU1fU01fT0ZGTElORSA9IDMsCS8qICBpdG5pbSBpcyBvZmZsaW5lICovCisJQkZBX0lUTklNX1NNX0ZXUlNQID0gNCwJCS8qICBmaXJtd2FyZSByZXNwb25zZSAqLworCUJGQV9JVE5JTV9TTV9ERUxFVEUgPSA1LAkvKiAgZGVsZXRpbmcgYW4gZXhpc3RpbmcgaXRuaW0gKi8KKwlCRkFfSVROSU1fU01fQ0xFQU5VUCA9IDYsCS8qICBJTyBjbGVhbnVwIGNvbXBsZXRpb24gKi8KKwlCRkFfSVROSU1fU01fU0xFUiA9IDcsCQkvKiAgc2Vjb25kIGxldmVsIGVycm9yIHJlY292ZXJ5ICovCisJQkZBX0lUTklNX1NNX0hXRkFJTCA9IDgsCS8qICBJT0MgaC93IGZhaWx1cmUgZXZlbnQgKi8KKwlCRkFfSVROSU1fU01fUVJFU1VNRSA9IDksCS8qICBxdWV1ZSBzcGFjZSBhdmFpbGFibGUgKi8KK307CisKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1fc21fdW5pbml0KHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJCWVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1fc21fY3JlYXRlZChzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJCQkgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9pdG5pbV9zbV9md2NyZWF0ZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJCQkgIGVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkCWJmYV9pdG5pbV9zbV9kZWxldGVfcGVuZGluZyhzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJCWVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1fc21fb25saW5lKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJCWVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1fc21fc2xlcihzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJCSAgICAgIGVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1fc21fY2xlYW51cF9vZmZsaW5lKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJCQkgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9pdG5pbV9zbV9jbGVhbnVwX2RlbGV0ZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJCQkJZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9pdG5pbV9zbV9md2RlbGV0ZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJCQkgIGVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1fc21fb2ZmbGluZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJCQkgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9pdG5pbV9zbV9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJCSAgICBlbnVtIGJmYV9pdG5pbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2l0bmltX3NtX2RlbGV0aW5nKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJCSAgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9pdG5pbV9zbV9md2NyZWF0ZV9xZnVsbChzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJCQkgIGVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfaXRuaW1fc21fZndkZWxldGVfcWZ1bGwoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwKKwkJCQkJICBlbnVtIGJmYV9pdG5pbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2l0bmltX3NtX2RlbGV0aW5nX3FmdWxsKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJCSAgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpOworCisvKioKKyAqIAkJQmVnaW5uaW5nL3VuYWxsb2NhdGVkIHN0YXRlIC0gbm8gZXZlbnRzIGV4cGVjdGVkLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX3NtX3VuaW5pdChzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLCBlbnVtIGJmYV9pdG5pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGl0bmltLT5iZmEsIGl0bmltLT5ycG9ydC0+cnBvcnRfdGFnKTsKKwliZmFfdHJjKGl0bmltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JVE5JTV9TTV9DUkVBVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9jcmVhdGVkKTsKKwkJaXRuaW0tPmlzX29ubGluZSA9IEJGQV9GQUxTRTsKKwkJYmZhX2ZjcGltX2FkZGl0bihpdG5pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCQlCZWdpbm5pbmcgc3RhdGUsIG9ubHkgb25saW5lIGV2ZW50IGV4cGVjdGVkLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX3NtX2NyZWF0ZWQoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBpdG5pbS0+cnBvcnQtPnJwb3J0X3RhZyk7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSVROSU1fU01fT05MSU5FOgorCQlpZiAoYmZhX2l0bmltX3NlbmRfZndjcmVhdGUoaXRuaW0pKQorCQkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2Z3Y3JlYXRlKTsKKwkJZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2Z3Y3JlYXRlX3FmdWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV91bmluaXQpOworCQliZmFfZmNwaW1fZGVsaXRuKGl0bmltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9pb2NkaXNhYmxlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAJCVdhaXRpbmcgZm9yIGl0bmltIGNyZWF0ZSByZXNwb25zZSBmcm9tIGZpcm13YXJlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX3NtX2Z3Y3JlYXRlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sIGVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaXRuaW0tPmJmYSwgaXRuaW0tPnJwb3J0LT5ycG9ydF90YWcpOworCWJmYV90cmMoaXRuaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lUTklNX1NNX0ZXUlNQOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fb25saW5lKTsKKwkJaXRuaW0tPmlzX29ubGluZSA9IEJGQV9UUlVFOworCQliZmFfaXRuaW1faW90b3Zfb25saW5lKGl0bmltKTsKKwkJYmZhX2l0bmltX29ubGluZV9jYihpdG5pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZGVsZXRlX3BlbmRpbmcpOworCQlicmVhazsKKworCWNhc2UgQkZBX0lUTklNX1NNX09GRkxJTkU6CisJCWlmIChiZmFfaXRuaW1fc2VuZF9md2RlbGV0ZShpdG5pbSkpCisJCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZndkZWxldGUpOworCQllbHNlCisJCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZndkZWxldGVfcWZ1bGwpOworCQlicmVhazsKKworCWNhc2UgQkZBX0lUTklNX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2lvY2Rpc2FibGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX3NtX2Z3Y3JlYXRlX3FmdWxsKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQllbnVtIGJmYV9pdG5pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGl0bmltLT5iZmEsIGl0bmltLT5ycG9ydC0+cnBvcnRfdGFnKTsKKwliZmFfdHJjKGl0bmltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JVE5JTV9TTV9RUkVTVU1FOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZndjcmVhdGUpOworCQliZmFfaXRuaW1fc2VuZF9md2NyZWF0ZShpdG5pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fdW5pbml0KTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmaXRuaW0tPnJlcXFfd2FpdCk7CisJCWJmYV9mY3BpbV9kZWxpdG4oaXRuaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lUTklNX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9vZmZsaW5lKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmaXRuaW0tPnJlcXFfd2FpdCk7CisJCWJmYV9pdG5pbV9vZmZsaW5lX2NiKGl0bmltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9pb2NkaXNhYmxlKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmaXRuaW0tPnJlcXFfd2FpdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCVdhaXRpbmcgZm9yIGl0bmltIGNyZWF0ZSByZXNwb25zZSBmcm9tIGZpcm13YXJlLCBhIGRlbGV0ZSBpcyBwZW5kaW5nLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX3NtX2RlbGV0ZV9wZW5kaW5nKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBpdG5pbS0+cnBvcnQtPnJwb3J0X3RhZyk7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSVROSU1fU01fRldSU1A6CisJCWlmIChiZmFfaXRuaW1fc2VuZF9md2RlbGV0ZShpdG5pbSkpCisJCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZGVsZXRpbmcpOworCQllbHNlCisJCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZGVsZXRpbmdfcWZ1bGwpOworCQlicmVhazsKKworCWNhc2UgQkZBX0lUTklNX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX3VuaW5pdCk7CisJCWJmYV9mY3BpbV9kZWxpdG4oaXRuaW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJT25saW5lIHN0YXRlIC0gbm9ybWFsIHBhcmtpbmcgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1fc21fb25saW5lKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sIGVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaXRuaW0tPmJmYSwgaXRuaW0tPnJwb3J0LT5ycG9ydF90YWcpOworCWJmYV90cmMoaXRuaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lUTklNX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9jbGVhbnVwX29mZmxpbmUpOworCQlpdG5pbS0+aXNfb25saW5lID0gQkZBX0ZBTFNFOworCQliZmFfaXRuaW1faW90b3Zfc3RhcnQoaXRuaW0pOworCQliZmFfaXRuaW1fY2xlYW51cChpdG5pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fY2xlYW51cF9kZWxldGUpOworCQlpdG5pbS0+aXNfb25saW5lID0gQkZBX0ZBTFNFOworCQliZmFfaXRuaW1fY2xlYW51cChpdG5pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fU0xFUjoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX3NsZXIpOworCQlpdG5pbS0+aXNfb25saW5lID0gQkZBX0ZBTFNFOworCQliZmFfaXRuaW1faW90b3Zfc3RhcnQoaXRuaW0pOworCQliZmFfaXRuaW1fc2xlcl9jYihpdG5pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21faW9jZGlzYWJsZSk7CisJCWl0bmltLT5pc19vbmxpbmUgPSBCRkFfRkFMU0U7CisJCWJmYV9pdG5pbV9pb3Rvdl9zdGFydChpdG5pbSk7CisJCWJmYV9pdG5pbV9pb2NkaXNhYmxlX2NsZWFudXAoaXRuaW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJU2Vjb25kIGxldmVsIGVycm9yIHJlY292ZXJ5IG5lZWQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1fc21fc2xlcihzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLCBlbnVtIGJmYV9pdG5pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGl0bmltLT5iZmEsIGl0bmltLT5ycG9ydC0+cnBvcnRfdGFnKTsKKwliZmFfdHJjKGl0bmltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JVE5JTV9TTV9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fY2xlYW51cF9vZmZsaW5lKTsKKwkJYmZhX2l0bmltX2NsZWFudXAoaXRuaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lUTklNX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2NsZWFudXBfZGVsZXRlKTsKKwkJYmZhX2l0bmltX2NsZWFudXAoaXRuaW0pOworCQliZmFfaXRuaW1faW90b3ZfZGVsZXRlKGl0bmltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9pb2NkaXNhYmxlKTsKKwkJYmZhX2l0bmltX2lvY2Rpc2FibGVfY2xlYW51cChpdG5pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCQlHb2luZyBvZmZsaW5lLiBXYWl0aW5nIGZvciBhY3RpdmUgSU8gY2xlYW51cC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pdG5pbV9zbV9jbGVhbnVwX29mZmxpbmUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwKKwkJCQkgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBpdG5pbS0+cnBvcnQtPnJwb3J0X3RhZyk7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSVROSU1fU01fQ0xFQU5VUDoKKwkJaWYgKGJmYV9pdG5pbV9zZW5kX2Z3ZGVsZXRlKGl0bmltKSkKKwkJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9md2RlbGV0ZSk7CisJCWVsc2UKKwkJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9md2RlbGV0ZV9xZnVsbCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fY2xlYW51cF9kZWxldGUpOworCQliZmFfaXRuaW1faW90b3ZfZGVsZXRlKGl0bmltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9pb2NkaXNhYmxlKTsKKwkJYmZhX2l0bmltX2lvY2Rpc2FibGVfY2xlYW51cChpdG5pbSk7CisJCWJmYV9pdG5pbV9vZmZsaW5lX2NiKGl0bmltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9TTEVSOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJRGVsZXRpbmcgaXRuaW0uIFdhaXRpbmcgZm9yIGFjdGl2ZSBJTyBjbGVhbnVwLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX3NtX2NsZWFudXBfZGVsZXRlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBpdG5pbS0+cnBvcnQtPnJwb3J0X3RhZyk7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSVROSU1fU01fQ0xFQU5VUDoKKwkJaWYgKGJmYV9pdG5pbV9zZW5kX2Z3ZGVsZXRlKGl0bmltKSkKKwkJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9kZWxldGluZyk7CisJCWVsc2UKKwkJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9kZWxldGluZ19xZnVsbCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21faW9jZGlzYWJsZSk7CisJCWJmYV9pdG5pbV9pb2NkaXNhYmxlX2NsZWFudXAoaXRuaW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIFJwb3J0IG9mZmxpbmUuIEZpbXJ3YXJlIGl0bmltIGlzIGJlaW5nIGRlbGV0ZWQgLSBhd2FpdGluZyBmL3cgcmVzcG9uc2UuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1fc21fZndkZWxldGUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBpdG5pbS0+cnBvcnQtPnJwb3J0X3RhZyk7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSVROSU1fU01fRldSU1A6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9vZmZsaW5lKTsKKwkJYmZhX2l0bmltX29mZmxpbmVfY2IoaXRuaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lUTklNX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2RlbGV0aW5nKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9pb2NkaXNhYmxlKTsKKwkJYmZhX2l0bmltX29mZmxpbmVfY2IoaXRuaW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX3NtX2Z3ZGVsZXRlX3FmdWxsKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQllbnVtIGJmYV9pdG5pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGl0bmltLT5iZmEsIGl0bmltLT5ycG9ydC0+cnBvcnRfdGFnKTsKKwliZmFfdHJjKGl0bmltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JVE5JTV9TTV9RUkVTVU1FOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZndkZWxldGUpOworCQliZmFfaXRuaW1fc2VuZF9md2RlbGV0ZShpdG5pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZGVsZXRpbmdfcWZ1bGwpOworCQlicmVhazsKKworCWNhc2UgQkZBX0lUTklNX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2lvY2Rpc2FibGUpOworCQliZmFfcmVxcV93Y2FuY2VsKCZpdG5pbS0+cmVxcV93YWl0KTsKKwkJYmZhX2l0bmltX29mZmxpbmVfY2IoaXRuaW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pdG5pbV9zbV9vZmZsaW5lKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sIGVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaXRuaW0tPmJmYSwgaXRuaW0tPnJwb3J0LT5ycG9ydF90YWcpOworCWJmYV90cmMoaXRuaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lUTklNX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX3VuaW5pdCk7CisJCWJmYV9pdG5pbV9pb3Rvdl9kZWxldGUoaXRuaW0pOworCQliZmFfZmNwaW1fZGVsaXRuKGl0bmltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9PTkxJTkU6CisJCWlmIChiZmFfaXRuaW1fc2VuZF9md2NyZWF0ZShpdG5pbSkpCisJCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZndjcmVhdGUpOworCQllbHNlCisJCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fZndjcmVhdGVfcWZ1bGwpOworCQlicmVhazsKKworCWNhc2UgQkZBX0lUTklNX1NNX0hXRkFJTDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2lvY2Rpc2FibGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJSU9DIGgvdyBmYWlsZWQgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1fc21faW9jZGlzYWJsZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJICAgIGVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaXRuaW0tPmJmYSwgaXRuaW0tPnJwb3J0LT5ycG9ydF90YWcpOworCWJmYV90cmMoaXRuaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lUTklNX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX3VuaW5pdCk7CisJCWJmYV9pdG5pbV9pb3Rvdl9kZWxldGUoaXRuaW0pOworCQliZmFfZmNwaW1fZGVsaXRuKGl0bmltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9PRkZMSU5FOgorCQliZmFfaXRuaW1fb2ZmbGluZV9jYihpdG5pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSVROSU1fU01fT05MSU5FOgorCQlpZiAoYmZhX2l0bmltX3NlbmRfZndjcmVhdGUoaXRuaW0pKQorCQkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2Z3Y3JlYXRlKTsKKwkJZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2Z3Y3JlYXRlX3FmdWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9IV0ZBSUw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCQlJdG5pbSBpcyBkZWxldGVkLCB3YWl0aW5nIGZvciBmaXJtd2FyZSByZXNwb25zZSB0byBkZWxldGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1fc21fZGVsZXRpbmcoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwgZW51bSBiZmFfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBpdG5pbS0+cnBvcnQtPnJwb3J0X3RhZyk7CisJYmZhX3RyYyhpdG5pbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSVROSU1fU01fRldSU1A6CisJY2FzZSBCRkFfSVROSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21fdW5pbml0KTsKKwkJYmZhX2ZjcGltX2RlbGl0bihpdG5pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1fc21fZGVsZXRpbmdfcWZ1bGwoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwKKwkJCWVudW0gYmZhX2l0bmltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaXRuaW0tPmJmYSwgaXRuaW0tPnJwb3J0LT5ycG9ydF90YWcpOworCWJmYV90cmMoaXRuaW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lUTklNX1NNX1FSRVNVTUU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9kZWxldGluZyk7CisJCWJmYV9pdG5pbV9zZW5kX2Z3ZGVsZXRlKGl0bmltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JVE5JTV9TTV9IV0ZBSUw6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV91bmluaXQpOworCQliZmFfcmVxcV93Y2FuY2VsKCZpdG5pbS0+cmVxcV93YWl0KTsKKwkJYmZhX2ZjcGltX2RlbGl0bihpdG5pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKworCisvKioKKyAqICBiZmFfaXRuaW1fcHJpdmF0ZQorICovCisKKy8qKgorICogCQlJbml0aWF0ZSBjbGVhbnVwIG9mIGFsbCBJT3Mgb24gYW4gSU9DIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1faW9jZGlzYWJsZV9jbGVhbnVwKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCit7CisJc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbTsKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqcWUsICpxZW47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJml0bmltLT50c2tfcSkgeworCQl0c2tpbSA9IChzdHJ1Y3QgYmZhX3Rza2ltX3MgKikgcWU7CisJCWJmYV90c2tpbV9pb2NkaXNhYmxlKHRza2ltKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJml0bmltLT5pb19xKSB7CisJCWlvaW0gPSAoc3RydWN0IGJmYV9pb2ltX3MgKikgcWU7CisJCWJmYV9pb2ltX2lvY2Rpc2FibGUoaW9pbSk7CisJfQorCisJLyoqCisJICogRm9yIElPIHJlcXVlc3QgaW4gcGVuZGluZyBxdWV1ZSwgd2UgcHJldGVuZCBhbiBlYXJseSB0aW1lb3V0LgorCSAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmaXRuaW0tPnBlbmRpbmdfcSkgeworCQlpb2ltID0gKHN0cnVjdCBiZmFfaW9pbV9zICopIHFlOworCQliZmFfaW9pbV90b3YoaW9pbSk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZpdG5pbS0+aW9fY2xlYW51cF9xKSB7CisJCWlvaW0gPSAoc3RydWN0IGJmYV9pb2ltX3MgKikgcWU7CisJCWJmYV9pb2ltX2lvY2Rpc2FibGUoaW9pbSk7CisJfQorfQorCisvKioKKyAqIAkJSU8gY2xlYW51cCBjb21wbGV0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1fY2xlYW5wX2NvbXAodm9pZCAqaXRuaW1fY2JhcmcpCit7CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSA9IGl0bmltX2NiYXJnOworCisJYmZhX3N0YXRzKGl0bmltLCBjbGVhbnVwX2NvbXBzKTsKKwliZmFfc21fc2VuZF9ldmVudChpdG5pbSwgQkZBX0lUTklNX1NNX0NMRUFOVVApOworfQorCisvKioKKyAqIAkJSW5pdGlhdGUgY2xlYW51cCBvZiBhbGwgSU9zLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX2NsZWFudXAoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKK3sKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAgKmlvaW07CisJc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgKnFlLCAqcWVuOworCisJYmZhX3djX2luaXQoJml0bmltLT53YywgYmZhX2l0bmltX2NsZWFucF9jb21wLCBpdG5pbSk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJml0bmltLT5pb19xKSB7CisJCWlvaW0gPSAoc3RydWN0IGJmYV9pb2ltX3MgKikgcWU7CisKKwkJLyoqCisJCSAqIE1vdmUgSU8gdG8gYSBjbGVhbnVwIHF1ZXVlIGZyb20gYWN0aXZlIHF1ZXVlIHNvIHRoYXQgYSBsYXRlcgorCQkgKiBUTSB3aWxsIG5vdCBwaWNrdXAgdGhpcyBJTy4KKwkJICovCisJCWxpc3RfZGVsKCZpb2ltLT5xZSk7CisJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmaXRuaW0tPmlvX2NsZWFudXBfcSk7CisKKwkJYmZhX3djX3VwKCZpdG5pbS0+d2MpOworCQliZmFfaW9pbV9jbGVhbnVwKGlvaW0pOworCX0KKworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmaXRuaW0tPnRza19xKSB7CisJCXRza2ltID0gKHN0cnVjdCBiZmFfdHNraW1fcyAqKSBxZTsKKwkJYmZhX3djX3VwKCZpdG5pbS0+d2MpOworCQliZmFfdHNraW1fY2xlYW51cCh0c2tpbSk7CisJfQorCisJYmZhX3djX3dhaXQoJml0bmltLT53Yyk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9pdG5pbV9vbmxpbmUodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCit7CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSA9IGNiYXJnOworCisJaWYgKGNvbXBsZXRlKQorCQliZmFfY2JfaXRuaW1fb25saW5lKGl0bmltLT5kaXRuKTsKK30KKworc3RhdGljIHZvaWQKK19fYmZhX2NiX2l0bmltX29mZmxpbmUodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCit7CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSA9IGNiYXJnOworCisJaWYgKGNvbXBsZXRlKQorCQliZmFfY2JfaXRuaW1fb2ZmbGluZShpdG5pbS0+ZGl0bik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9pdG5pbV9zbGVyKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0gPSBjYmFyZzsKKworCWlmIChjb21wbGV0ZSkKKwkJYmZhX2NiX2l0bmltX3NsZXIoaXRuaW0tPmRpdG4pOworfQorCisvKioKKyAqIENhbGwgdG8gcmVzdW1lIGFueSBJL08gcmVxdWVzdHMgd2FpdGluZyBmb3Igcm9vbSBpbiByZXF1ZXN0IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX3FyZXN1bWUodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSA9IGNiYXJnOworCisJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9JVE5JTV9TTV9RUkVTVU1FKTsKK30KKworCisKKworLyoqCisgKiAgYmZhX2l0bmltX3B1YmxpYworICovCisKK3ZvaWQKK2JmYV9pdG5pbV9pb2RvbmUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKK3sKKwliZmFfd2NfZG93bigmaXRuaW0tPndjKTsKK30KKwordm9pZAorYmZhX2l0bmltX3Rza2RvbmUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKK3sKKwliZmFfd2NfZG93bigmaXRuaW0tPndjKTsKK30KKwordm9pZAorYmZhX2l0bmltX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKKwkJdTMyICpkbV9sZW4pCit7CisJLyoqCisJICogSVROIG1lbW9yeQorCSAqLworCSprbV9sZW4gKz0gY2ZnLT5md2NmZy5udW1fcnBvcnRzICogc2l6ZW9mKHN0cnVjdCBiZmFfaXRuaW1fcyk7Cit9CisKK3ZvaWQKK2JmYV9pdG5pbV9hdHRhY2goc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0sIHN0cnVjdCBiZmFfbWVtaW5mb19zICptaW5mbykKK3sKKwlzdHJ1Y3QgYmZhX3MgICAgICAqYmZhID0gZmNwaW0tPmJmYTsKKwlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltOworCWludCAgICAgICAgICAgICBpOworCisJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT5pdG5pbV9xKTsKKworCWl0bmltID0gKHN0cnVjdCBiZmFfaXRuaW1fcyAqKSBiZmFfbWVtaW5mb19rdmEobWluZm8pOworCWZjcGltLT5pdG5pbV9hcnIgPSBpdG5pbTsKKworCWZvciAoaSA9IDA7IGkgPCBmY3BpbS0+bnVtX2l0bmltczsgaSsrLCBpdG5pbSsrKSB7CisJCWJmYV9vc19tZW1zZXQoaXRuaW0sIDAsIHNpemVvZihzdHJ1Y3QgYmZhX2l0bmltX3MpKTsKKwkJaXRuaW0tPmJmYSA9IGJmYTsKKwkJaXRuaW0tPmZjcGltID0gZmNwaW07CisJCWl0bmltLT5yZXFxID0gQkZBX1JFUVFfUU9TX0xPOworCQlpdG5pbS0+cnBvcnQgPSBCRkFfUlBPUlRfRlJPTV9UQUcoYmZhLCBpKTsKKwkJaXRuaW0tPmlvdG92X2FjdGl2ZSA9IEJGQV9GQUxTRTsKKwkJYmZhX3JlcXFfd2luaXQoJml0bmltLT5yZXFxX3dhaXQsIGJmYV9pdG5pbV9xcmVzdW1lLCBpdG5pbSk7CisKKwkJSU5JVF9MSVNUX0hFQUQoJml0bmltLT5pb19xKTsKKwkJSU5JVF9MSVNUX0hFQUQoJml0bmltLT5pb19jbGVhbnVwX3EpOworCQlJTklUX0xJU1RfSEVBRCgmaXRuaW0tPnBlbmRpbmdfcSk7CisJCUlOSVRfTElTVF9IRUFEKCZpdG5pbS0+dHNrX3EpOworCQlJTklUX0xJU1RfSEVBRCgmaXRuaW0tPmRlbGF5X2NvbXBfcSk7CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV91bmluaXQpOworCX0KKworCWJmYV9tZW1pbmZvX2t2YShtaW5mbykgPSAodTggKikgaXRuaW07Cit9CisKK3ZvaWQKK2JmYV9pdG5pbV9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCit7CisJYmZhX3N0YXRzKGl0bmltLCBpb2NfZGlzYWJsZWQpOworCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfSVROSU1fU01fSFdGQUlMKTsKK30KKworc3RhdGljIGJmYV9ib29sZWFuX3QKK2JmYV9pdG5pbV9zZW5kX2Z3Y3JlYXRlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCit7CisJc3RydWN0IGJmaV9pdG5pbV9jcmVhdGVfcmVxX3MgKm07CisKKwlpdG5pbS0+bXNnX25vKys7CisKKwkvKioKKwkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CisJICovCisJbSA9IGJmYV9yZXFxX25leHQoaXRuaW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCWlmICghbSkgeworCQliZmFfcmVxcV93YWl0KGl0bmltLT5iZmEsIGl0bmltLT5yZXFxLCAmaXRuaW0tPnJlcXFfd2FpdCk7CisJCXJldHVybiBCRkFfRkFMU0U7CisJfQorCisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JVE5JTSwgQkZJX0lUTklNX0gySV9DUkVBVEVfUkVRLAorCQkJYmZhX2xwdWlkKGl0bmltLT5iZmEpKTsKKwltLT5md19oYW5kbGUgPSBpdG5pbS0+cnBvcnQtPmZ3X2hhbmRsZTsKKwltLT5jbGFzcyA9IEZDX0NMQVNTXzM7CisJbS0+c2VxX3JlYyA9IGl0bmltLT5zZXFfcmVjOworCW0tPm1zZ19ubyA9IGl0bmltLT5tc2dfbm87CisKKwkvKioKKwkgKiBxdWV1ZSBJL08gbWVzc2FnZSB0byBmaXJtd2FyZQorCSAqLworCWJmYV9yZXFxX3Byb2R1Y2UoaXRuaW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCXJldHVybiBCRkFfVFJVRTsKK30KKworc3RhdGljIGJmYV9ib29sZWFuX3QKK2JmYV9pdG5pbV9zZW5kX2Z3ZGVsZXRlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCit7CisJc3RydWN0IGJmaV9pdG5pbV9kZWxldGVfcmVxX3MgKm07CisKKwkvKioKKwkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CisJICovCisJbSA9IGJmYV9yZXFxX25leHQoaXRuaW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCWlmICghbSkgeworCQliZmFfcmVxcV93YWl0KGl0bmltLT5iZmEsIGl0bmltLT5yZXFxLCAmaXRuaW0tPnJlcXFfd2FpdCk7CisJCXJldHVybiBCRkFfRkFMU0U7CisJfQorCisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JVE5JTSwgQkZJX0lUTklNX0gySV9ERUxFVEVfUkVRLAorCQkJYmZhX2xwdWlkKGl0bmltLT5iZmEpKTsKKwltLT5md19oYW5kbGUgPSBpdG5pbS0+cnBvcnQtPmZ3X2hhbmRsZTsKKworCS8qKgorCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCisJICovCisJYmZhX3JlcXFfcHJvZHVjZShpdG5pbS0+YmZhLCBpdG5pbS0+cmVxcSk7CisJcmV0dXJuIEJGQV9UUlVFOworfQorCisvKioKKyAqIENsZWFudXAgYWxsIHBlbmRpbmcgZmFpbGVkIGluZmxpZ2h0IHJlcXVlc3RzLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX2RlbGF5ZWRfY29tcChzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLCBiZmFfYm9vbGVhbl90IGlvdG92KQoreworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltOworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZpdG5pbS0+ZGVsYXlfY29tcF9xKSB7CisJCWlvaW0gPSAoc3RydWN0IGJmYV9pb2ltX3MgKilxZTsKKwkJYmZhX2lvaW1fZGVsYXllZF9jb21wKGlvaW0sIGlvdG92KTsKKwl9Cit9CisKKy8qKgorICogU3RhcnQgYWxsIHBlbmRpbmcgSU8gcmVxdWVzdHMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1faW90b3Zfb25saW5lKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCit7CisJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW07CisKKwliZmFfaXRuaW1faW90b3Zfc3RvcChpdG5pbSk7CisKKwkvKioKKwkgKiBBYm9ydCBhbGwgaW5mbGlnaHQgSU8gcmVxdWVzdHMgaW4gdGhlIHF1ZXVlCisJICovCisJYmZhX2l0bmltX2RlbGF5ZWRfY29tcChpdG5pbSwgQkZBX0ZBTFNFKTsKKworCS8qKgorCSAqIFN0YXJ0IGFsbCBwZW5kaW5nIElPIHJlcXVlc3RzLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmaXRuaW0tPnBlbmRpbmdfcSkpIHsKKwkJYmZhX3FfZGVxKCZpdG5pbS0+cGVuZGluZ19xLCAmaW9pbSk7CisJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmaXRuaW0tPmlvX3EpOworCQliZmFfaW9pbV9zdGFydChpb2ltKTsKKwl9Cit9CisKKy8qKgorICogRmFpbCBhbGwgcGVuZGluZyBJTyByZXF1ZXN0cworICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX2lvdG92X2NsZWFudXAoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKK3sKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbTsKKworCS8qKgorCSAqIEZhaWwgYWxsIGluZmxpZ2h0IElPIHJlcXVlc3RzIGluIHRoZSBxdWV1ZQorCSAqLworCWJmYV9pdG5pbV9kZWxheWVkX2NvbXAoaXRuaW0sIEJGQV9UUlVFKTsKKworCS8qKgorCSAqIEZhaWwgYW55IHBlbmRpbmcgSU8gcmVxdWVzdHMuCisJICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZpdG5pbS0+cGVuZGluZ19xKSkgeworCQliZmFfcV9kZXEoJml0bmltLT5wZW5kaW5nX3EsICZpb2ltKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZpb2ltLT5mY3BpbS0+aW9pbV9jb21wX3EpOworCQliZmFfaW9pbV90b3YoaW9pbSk7CisJfQorfQorCisvKioKKyAqIElPIFRPViB0aW1lciBjYWxsYmFjay4gRmFpbCBhbnkgcGVuZGluZyBJTyByZXF1ZXN0cy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pdG5pbV9pb3Rvdih2b2lkICppdG5pbV9hcmcpCit7CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSA9IGl0bmltX2FyZzsKKworCWl0bmltLT5pb3Rvdl9hY3RpdmUgPSBCRkFfRkFMU0U7CisKKwliZmFfY2JfaXRuaW1fdG92X2JlZ2luKGl0bmltLT5kaXRuKTsKKwliZmFfaXRuaW1faW90b3ZfY2xlYW51cChpdG5pbSk7CisJYmZhX2NiX2l0bmltX3RvdihpdG5pbS0+ZGl0bik7Cit9CisKKy8qKgorICogU3RhcnQgSU8gVE9WIHRpbWVyIGZvciBmYWlsaW5nIGJhY2sgcGVuZGluZyBJTyByZXF1ZXN0cyBpbiBvZmZsaW5lIHN0YXRlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX2lvdG92X3N0YXJ0KHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCit7CisJaWYgKGl0bmltLT5mY3BpbS0+cGF0aF90b3YgPiAwKSB7CisKKwkJaXRuaW0tPmlvdG92X2FjdGl2ZSA9IEJGQV9UUlVFOworCQliZmFfYXNzZXJ0KGJmYV9pdG5pbV9ob2xkX2lvKGl0bmltKSk7CisJCWJmYV90aW1lcl9zdGFydChpdG5pbS0+YmZhLCAmaXRuaW0tPnRpbWVyLAorCQkJYmZhX2l0bmltX2lvdG92LCBpdG5pbSwgaXRuaW0tPmZjcGltLT5wYXRoX3Rvdik7CisJfQorfQorCisvKioKKyAqIFN0b3AgSU8gVE9WIHRpbWVyLgorICovCitzdGF0aWMgdm9pZAorYmZhX2l0bmltX2lvdG92X3N0b3Aoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKK3sKKwlpZiAoaXRuaW0tPmlvdG92X2FjdGl2ZSkgeworCQlpdG5pbS0+aW90b3ZfYWN0aXZlID0gQkZBX0ZBTFNFOworCQliZmFfdGltZXJfc3RvcCgmaXRuaW0tPnRpbWVyKTsKKwl9Cit9CisKKy8qKgorICogU3RvcCBJTyBUT1YgdGltZXIuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaXRuaW1faW90b3ZfZGVsZXRlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCit7CisgICAgYmZhX2Jvb2xlYW5fdCBwYXRodG92X2FjdGl2ZSA9IEJGQV9GQUxTRTsKKworICAgIGlmIChpdG5pbS0+aW90b3ZfYWN0aXZlKQorCQlwYXRodG92X2FjdGl2ZSA9IEJGQV9UUlVFOworCisJYmZhX2l0bmltX2lvdG92X3N0b3AoaXRuaW0pOworCWlmIChwYXRodG92X2FjdGl2ZSkKKwkJYmZhX2NiX2l0bmltX3Rvdl9iZWdpbihpdG5pbS0+ZGl0bik7CisJYmZhX2l0bmltX2lvdG92X2NsZWFudXAoaXRuaW0pOworCWlmIChwYXRodG92X2FjdGl2ZSkKKwkJYmZhX2NiX2l0bmltX3RvdihpdG5pbS0+ZGl0bik7Cit9CisKKworCisvKioKKyAqICBiZmFfaXRuaW1fcHVibGljCisgKi8KKworLyoqCisgKiAJCUl0bmltIGludGVycnVwdCBwcm9jZXNzaW5nLgorICovCit2b2lkCitiZmFfaXRuaW1faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKQoreworCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCXVuaW9uIGJmaV9pdG5pbV9pMmhfbXNnX3UgbXNnOworCXN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW07CisKKwliZmFfdHJjKGJmYSwgbS0+bWhkci5tc2dfaWQpOworCisJbXNnLm1zZyA9IG07CisKKwlzd2l0Y2ggKG0tPm1oZHIubXNnX2lkKSB7CisJY2FzZSBCRklfSVROSU1fSTJIX0NSRUFURV9SU1A6CisJCWl0bmltID0gQkZBX0lUTklNX0ZST01fVEFHKGZjcGltLAorCQkJCQkgICAgICAgbXNnLmNyZWF0ZV9yc3AtPmJmYV9oYW5kbGUpOworCQliZmFfYXNzZXJ0KG1zZy5jcmVhdGVfcnNwLT5zdGF0dXMgPT0gQkZBX1NUQVRVU19PSyk7CisJCWJmYV9zdGF0cyhpdG5pbSwgY3JlYXRlX2NvbXBzKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9JVE5JTV9TTV9GV1JTUCk7CisJCWJyZWFrOworCisJY2FzZSBCRklfSVROSU1fSTJIX0RFTEVURV9SU1A6CisJCWl0bmltID0gQkZBX0lUTklNX0ZST01fVEFHKGZjcGltLAorCQkJCQkgICAgICAgbXNnLmRlbGV0ZV9yc3AtPmJmYV9oYW5kbGUpOworCQliZmFfYXNzZXJ0KG1zZy5kZWxldGVfcnNwLT5zdGF0dXMgPT0gQkZBX1NUQVRVU19PSyk7CisJCWJmYV9zdGF0cyhpdG5pbSwgZGVsZXRlX2NvbXBzKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9JVE5JTV9TTV9GV1JTUCk7CisJCWJyZWFrOworCisJY2FzZSBCRklfSVROSU1fSTJIX1NMRVJfRVZFTlQ6CisJCWl0bmltID0gQkZBX0lUTklNX0ZST01fVEFHKGZjcGltLAorCQkJCQkgICAgICAgbXNnLnNsZXJfZXZlbnQtPmJmYV9oYW5kbGUpOworCQliZmFfc3RhdHMoaXRuaW0sIHNsZXJfZXZlbnRzKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9JVE5JTV9TTV9TTEVSKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfdHJjKGJmYSwgbS0+bWhkci5tc2dfaWQpOworCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisKKy8qKgorICogIGJmYV9pdG5pbV9hcGkKKyAqLworCitzdHJ1Y3QgYmZhX2l0bmltX3MgKgorYmZhX2l0bmltX2NyZWF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydCwgdm9pZCAqZGl0bikKK3sKKwlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltOworCisJaXRuaW0gPSBCRkFfSVROSU1fRlJPTV9UQUcoZmNwaW0sIHJwb3J0LT5ycG9ydF90YWcpOworCWJmYV9hc3NlcnQoaXRuaW0tPnJwb3J0ID09IHJwb3J0KTsKKworCWl0bmltLT5kaXRuID0gZGl0bjsKKworCWJmYV9zdGF0cyhpdG5pbSwgY3JlYXRlcyk7CisJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9JVE5JTV9TTV9DUkVBVEUpOworCisJcmV0dXJuIChpdG5pbSk7Cit9CisKK3ZvaWQKK2JmYV9pdG5pbV9kZWxldGUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKK3sKKwliZmFfc3RhdHMoaXRuaW0sIGRlbGV0ZXMpOworCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfSVROSU1fU01fREVMRVRFKTsKK30KKwordm9pZAorYmZhX2l0bmltX29ubGluZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLCBiZmFfYm9vbGVhbl90IHNlcV9yZWMpCit7CisJaXRuaW0tPnNlcV9yZWMgPSBzZXFfcmVjOworCWJmYV9zdGF0cyhpdG5pbSwgb25saW5lcyk7CisJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9JVE5JTV9TTV9PTkxJTkUpOworfQorCit2b2lkCitiZmFfaXRuaW1fb2ZmbGluZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKQoreworCWJmYV9zdGF0cyhpdG5pbSwgb2ZmbGluZXMpOworCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfSVROSU1fU01fT0ZGTElORSk7Cit9CisKKy8qKgorICogUmV0dXJuIHRydWUgaWYgaXRuaW0gaXMgY29uc2lkZXJlZCBvZmZsaW5lIGZvciBob2xkaW5nIG9mZiBJTyByZXF1ZXN0LgorICogSU8gaXMgbm90IGhlbGQgaWYgaXRuaW0gaXMgYmVpbmcgZGVsZXRlZC4KKyAqLworYmZhX2Jvb2xlYW5fdAorYmZhX2l0bmltX2hvbGRfaW8oc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKK3sKKwlyZXR1cm4gKAorCQlpdG5pbS0+ZmNwaW0tPnBhdGhfdG92ICYmIGl0bmltLT5pb3Rvdl9hY3RpdmUgJiYKKwkJKGJmYV9zbV9jbXBfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9md2NyZWF0ZSkgfHwKKwkJIGJmYV9zbV9jbXBfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9zbGVyKSB8fAorCQkgYmZhX3NtX2NtcF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2NsZWFudXBfb2ZmbGluZSkgfHwKKwkJIGJmYV9zbV9jbXBfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9md2RlbGV0ZSkgfHwKKwkJIGJmYV9zbV9jbXBfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9vZmZsaW5lKSB8fAorCQkgYmZhX3NtX2NtcF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2lvY2Rpc2FibGUpKQorKTsKK30KKwordm9pZAorYmZhX2l0bmltX2dldF9zdGF0cyhzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCXN0cnVjdCBiZmFfaXRuaW1faGFsX3N0YXRzX3MgKnN0YXRzKQoreworCSpzdGF0cyA9IGl0bmltLT5zdGF0czsKK30KKwordm9pZAorYmZhX2l0bmltX2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCit7CisJYmZhX29zX21lbXNldCgmaXRuaW0tPnN0YXRzLCAwLCBzaXplb2YoaXRuaW0tPnN0YXRzKSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfbG9nLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjczNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbG9nLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2xvZy5jIEJGQSBsb2cgbGlicmFyeQorICovCisKKyNpbmNsdWRlIDxiZmFfb3NfaW5jLmg+CisjaW5jbHVkZSA8Y3MvYmZhX2xvZy5oPgorCisvKgorICogZ2xvYmFsIGxvZyBpbmZvIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgYmZhX2xvZ19pbmZvX3MgeworCXUzMiAgICAgICAgc3RhcnRfaWR4OwkvKiAgc3RhcnQgaW5kZXggZm9yIGEgbW9kdWxlICovCisJdTMyICAgICAgICB0b3RhbF9jb3VudDsJLyogIHRvdGFsIGNvdW50IGZvciBhIG1vZHVsZSAqLworCWVudW0gYmZhX2xvZ19zZXZlcml0eSBsZXZlbDsJLyogIGdsb2JhbCBsb2cgbGV2ZWwgKi8KKwliZmFfbG9nX2NiX3QJY2JmbjsJCS8qICBjYWxsYmFjayBmdW5jdGlvbiAqLworfTsKKworc3RhdGljIHN0cnVjdCBiZmFfbG9nX2luZm9fcyBiZmFfbG9nX2luZm9bQkZBX0xPR19NT0RVTEVfSURfTUFYICsgMV07CitzdGF0aWMgdTMyIGJmYV9sb2dfbXNnX3RvdGFsX2NvdW50Oworc3RhdGljIGludCAgICAgIGJmYV9sb2dfaW5pdGlhbGl6ZWQ7CisKK3N0YXRpYyBjaGFyICAgICpiZmFfbG9nX3NldmVyaXR5W10gPQorCXsgIltub25lXSIsICJbY3JpdGljYWxdIiwgIltlcnJvcl0iLCAiW3dhcm5dIiwgIltpbmZvXSIsICIiIH07CisKKy8qKgorICogQkZBIGxvZyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uCisgKgorICogVGhlIGxvZyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcsCisgKiAgICAtIHNldCBsb2cgaW5zdGFuY2UgbmFtZSBhbmQgY2FsbGJhY2sgZnVuY3Rpb24KKyAqICAgIC0gcmVhZCB0aGUgbWVzc2FnZSBhcnJheSBnZW5lcmF0ZWQgZnJvbSB4bWwgZmlsZXMKKyAqICAgIC0gY2FsY3VsYXRlIHN0YXJ0IGluZGV4IGZvciBlYWNoIG1vZHVsZQorICogICAgLSBjYWxjdWxhdGUgbWVzc2FnZSBjb3VudCBmb3IgZWFjaCBtb2R1bGUKKyAqICAgIC0gcGVyZm9ybSBlcnJvciBjaGVja2luZworICoKKyAqIEBwYXJhbVtpbl0gbG9nX21vZCAtIGxvZyBtb2R1bGUgaW5mbworICogQHBhcmFtW2luXSBpbnN0YW5jZV9uYW1lIC0gaW5zdGFuY2UgbmFtZQorICogQHBhcmFtW2luXSBjYmZuIC0gY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBJdCByZXR1cm4gMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlCisgKi8KK2ludAorYmZhX2xvZ19pbml0KHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLCBjaGFyICppbnN0YW5jZV9uYW1lLAorCQkJYmZhX2xvZ19jYl90IGNiZm4pCit7CisJc3RydWN0IGJmYV9sb2dfbXNnZGVmX3MgKm1zZzsKKwl1MzIgICAgICAgIHByZV9tb2RfaWQgPSAwOworCXUzMiAgICAgICAgY3VyX21vZF9pZCA9IDA7CisJdTMyICAgICAgICBpLCBwcmVfaWR4LCBpZHgsIG1zZ19pZDsKKworCS8qCisJICogc2V0IGluc3RhbmNlIG5hbWUKKwkgKi8KKwlpZiAobG9nX21vZCkgeworCQlzdHJuY3B5KGxvZ19tb2QtPmluc3RhbmNlX2luZm8sIGluc3RhbmNlX25hbWUsCisJCQlzaXplb2YobG9nX21vZC0+aW5zdGFuY2VfaW5mbykpOworCQlsb2dfbW9kLT5jYmZuID0gY2JmbjsKKwkJZm9yIChpID0gMDsgaSA8PSBCRkFfTE9HX01PRFVMRV9JRF9NQVg7IGkrKykKKwkJCWxvZ19tb2QtPmxvZ19sZXZlbFtpXSA9IEJGQV9MT0dfV0FSTklORzsKKwl9CisKKwlpZiAoYmZhX2xvZ19pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEJGQV9MT0dfTU9EVUxFX0lEX01BWDsgaSsrKSB7CisJCWJmYV9sb2dfaW5mb1tpXS5zdGFydF9pZHggPSAwOworCQliZmFfbG9nX2luZm9baV0udG90YWxfY291bnQgPSAwOworCQliZmFfbG9nX2luZm9baV0ubGV2ZWwgPSBCRkFfTE9HX1dBUk5JTkc7CisJCWJmYV9sb2dfaW5mb1tpXS5jYmZuID0gY2JmbjsKKwl9CisKKwlwcmVfaWR4ID0gMDsKKwlpZHggPSAwOworCW1zZyA9IGJmYV9sb2dfbXNnX2FycmF5OworCW1zZ19pZCA9IEJGQV9MT0dfR0VUX01TR19JRChtc2cpOworCXByZV9tb2RfaWQgPSBCRkFfTE9HX0dFVF9NT0RfSUQobXNnX2lkKTsKKwl3aGlsZSAobXNnX2lkICE9IDApIHsKKwkJY3VyX21vZF9pZCA9IEJGQV9MT0dfR0VUX01PRF9JRChtc2dfaWQpOworCisJCWlmIChjdXJfbW9kX2lkID4gQkZBX0xPR19NT0RVTEVfSURfTUFYKSB7CisJCQljYmZuKGxvZ19tb2QsIG1zZ19pZCwKKwkJCQkiJXMlcyBsb2c6IG1vZHVsZSBpZCAldSBvdXQgb2YgcmFuZ2VcbiIsCisJCQkJQkZBX0xPR19DQVRfTkFNRSwKKwkJCQliZmFfbG9nX3NldmVyaXR5W0JGQV9MT0dfRVJST1JdLAorCQkJCWN1cl9tb2RfaWQpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKHByZV9tb2RfaWQgPiBCRkFfTE9HX01PRFVMRV9JRF9NQVgpIHsKKwkJCWNiZm4obG9nX21vZCwgbXNnX2lkLAorCQkJCSIlcyVzIGxvZzogbW9kdWxlIGlkICV1IG91dCBvZiByYW5nZVxuIiwKKwkJCQlCRkFfTE9HX0NBVF9OQU1FLAorCQkJCWJmYV9sb2dfc2V2ZXJpdHlbQkZBX0xPR19FUlJPUl0sCisJCQkJcHJlX21vZF9pZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoY3VyX21vZF9pZCAhPSBwcmVfbW9kX2lkKSB7CisJCQliZmFfbG9nX2luZm9bcHJlX21vZF9pZF0uc3RhcnRfaWR4ID0gcHJlX2lkeDsKKwkJCWJmYV9sb2dfaW5mb1twcmVfbW9kX2lkXS50b3RhbF9jb3VudCA9IGlkeCAtIHByZV9pZHg7CisJCQlwcmVfbW9kX2lkID0gY3VyX21vZF9pZDsKKwkJCXByZV9pZHggPSBpZHg7CisJCX0KKworCQlpZHgrKzsKKwkJbXNnKys7CisJCW1zZ19pZCA9IEJGQV9MT0dfR0VUX01TR19JRChtc2cpOworCX0KKworCWJmYV9sb2dfaW5mb1tjdXJfbW9kX2lkXS5zdGFydF9pZHggPSBwcmVfaWR4OworCWJmYV9sb2dfaW5mb1tjdXJfbW9kX2lkXS50b3RhbF9jb3VudCA9IGlkeCAtIHByZV9pZHg7CisJYmZhX2xvZ19tc2dfdG90YWxfY291bnQgPSBpZHg7CisKKwljYmZuKGxvZ19tb2QsIG1zZ19pZCwgIiVzJXMgbG9nOiBpbml0IE9LLCBtc2cgdG90YWwgY291bnQgJXVcbiIsCisJCUJGQV9MT0dfQ0FUX05BTUUsCisJCWJmYV9sb2dfc2V2ZXJpdHlbQkZBX0xPR19JTkZPXSwgYmZhX2xvZ19tc2dfdG90YWxfY291bnQpOworCisJYmZhX2xvZ19pbml0aWFsaXplZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBCRkEgbG9nIHNldCBsb2cgbGV2ZWwgZm9yIGEgbW9kdWxlCisgKgorICogQHBhcmFtW2luXSBsb2dfbW9kIC0gbG9nIG1vZHVsZSBpbmZvCisgKiBAcGFyYW1baW5dIG1vZF9pZCAtIG1vZHVsZSBpZAorICogQHBhcmFtW2luXSBsb2dfbGV2ZWwgLSBsb2cgc2V2ZXJpdHkgbGV2ZWwKKyAqCisgKiBJdCByZXR1cm4gQkZBX1NUQVRVU19PSyBvbiBzdWNjZXNzLCBvciA+IDAgb24gZmFpbHVyZQorICovCitiZmFfc3RhdHVzX3QKK2JmYV9sb2dfc2V0X2xldmVsKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLCBpbnQgbW9kX2lkLAorCQkgIGVudW0gYmZhX2xvZ19zZXZlcml0eSBsb2dfbGV2ZWwpCit7CisJaWYgKG1vZF9pZCA8PSBCRkFfTE9HX1VOVVNFRF9JRCB8fCBtb2RfaWQgPiBCRkFfTE9HX01PRFVMRV9JRF9NQVgpCisJCXJldHVybiBCRkFfU1RBVFVTX0VJTlZBTDsKKworCWlmIChsb2dfbGV2ZWwgPD0gQkZBX0xPR19JTlZBTElEIHx8IGxvZ19sZXZlbCA+IEJGQV9MT0dfTEVWRUxfTUFYKQorCQlyZXR1cm4gQkZBX1NUQVRVU19FSU5WQUw7CisKKwlpZiAobG9nX21vZCkKKwkJbG9nX21vZC0+bG9nX2xldmVsW21vZF9pZF0gPSBsb2dfbGV2ZWw7CisJZWxzZQorCQliZmFfbG9nX2luZm9bbW9kX2lkXS5sZXZlbCA9IGxvZ19sZXZlbDsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqIEJGQSBsb2cgc2V0IGxvZyBsZXZlbCBmb3IgYWxsIG1vZHVsZXMKKyAqCisgKiBAcGFyYW1baW5dIGxvZ19tb2QgLSBsb2cgbW9kdWxlIGluZm8KKyAqIEBwYXJhbVtpbl0gbG9nX2xldmVsIC0gbG9nIHNldmVyaXR5IGxldmVsCisgKgorICogSXQgcmV0dXJuIEJGQV9TVEFUVVNfT0sgb24gc3VjY2Vzcywgb3IgPiAwIG9uIGZhaWx1cmUKKyAqLworYmZhX3N0YXR1c190CitiZmFfbG9nX3NldF9sZXZlbF9hbGwoc3RydWN0IGJmYV9sb2dfbW9kX3MgKmxvZ19tb2QsCisJCSAgZW51bSBiZmFfbG9nX3NldmVyaXR5IGxvZ19sZXZlbCkKK3sKKwlpbnQgbW9kX2lkID0gQkZBX0xPR19VTlVTRURfSUQgKyAxOworCisJaWYgKGxvZ19sZXZlbCA8PSBCRkFfTE9HX0lOVkFMSUQgfHwgbG9nX2xldmVsID4gQkZBX0xPR19MRVZFTF9NQVgpCisJCXJldHVybiBCRkFfU1RBVFVTX0VJTlZBTDsKKworCWlmIChsb2dfbW9kKSB7CisJCWZvciAoOyBtb2RfaWQgPD0gQkZBX0xPR19NT0RVTEVfSURfTUFYOyBtb2RfaWQrKykKKwkJCWxvZ19tb2QtPmxvZ19sZXZlbFttb2RfaWRdID0gbG9nX2xldmVsOworCX0gZWxzZSB7CisJCWZvciAoOyBtb2RfaWQgPD0gQkZBX0xPR19NT0RVTEVfSURfTUFYOyBtb2RfaWQrKykKKwkJCWJmYV9sb2dfaW5mb1ttb2RfaWRdLmxldmVsID0gbG9nX2xldmVsOworCX0KKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqIEJGQSBsb2cgc2V0IGxvZyBsZXZlbCBmb3IgYWxsIGFlbiBzdWItbW9kdWxlcworICoKKyAqIEBwYXJhbVtpbl0gbG9nX21vZCAtIGxvZyBtb2R1bGUgaW5mbworICogQHBhcmFtW2luXSBsb2dfbGV2ZWwgLSBsb2cgc2V2ZXJpdHkgbGV2ZWwKKyAqCisgKiBJdCByZXR1cm4gQkZBX1NUQVRVU19PSyBvbiBzdWNjZXNzLCBvciA+IDAgb24gZmFpbHVyZQorICovCitiZmFfc3RhdHVzX3QKK2JmYV9sb2dfc2V0X2xldmVsX2FlbihzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nX21vZCwKKwkJICBlbnVtIGJmYV9sb2dfc2V2ZXJpdHkgbG9nX2xldmVsKQoreworCWludCBtb2RfaWQgPSBCRkFfTE9HX0FFTl9NSU4gKyAxOworCisJaWYgKGxvZ19tb2QpIHsKKwkJZm9yICg7IG1vZF9pZCA8PSBCRkFfTE9HX0FFTl9NQVg7IG1vZF9pZCsrKQorCQkJbG9nX21vZC0+bG9nX2xldmVsW21vZF9pZF0gPSBsb2dfbGV2ZWw7CisJfSBlbHNlIHsKKwkJZm9yICg7IG1vZF9pZCA8PSBCRkFfTE9HX0FFTl9NQVg7IG1vZF9pZCsrKQorCQkJYmZhX2xvZ19pbmZvW21vZF9pZF0ubGV2ZWwgPSBsb2dfbGV2ZWw7CisJfQorCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogQkZBIGxvZyBnZXQgbG9nIGxldmVsIGZvciBhIG1vZHVsZQorICoKKyAqIEBwYXJhbVtpbl0gbG9nX21vZCAtIGxvZyBtb2R1bGUgaW5mbworICogQHBhcmFtW2luXSBtb2RfaWQgLSBtb2R1bGUgaWQKKyAqCisgKiBJdCByZXR1cm5zIGxvZyBsZXZlbCBvciAtMSBvbiBlcnJvcgorICovCitlbnVtIGJmYV9sb2dfc2V2ZXJpdHkKK2JmYV9sb2dfZ2V0X2xldmVsKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLCBpbnQgbW9kX2lkKQoreworCWlmIChtb2RfaWQgPD0gQkZBX0xPR19VTlVTRURfSUQgfHwgbW9kX2lkID4gQkZBX0xPR19NT0RVTEVfSURfTUFYKQorCQlyZXR1cm4gQkZBX0xPR19JTlZBTElEOworCisJaWYgKGxvZ19tb2QpCisJCXJldHVybiAobG9nX21vZC0+bG9nX2xldmVsW21vZF9pZF0pOworCWVsc2UKKwkJcmV0dXJuIChiZmFfbG9nX2luZm9bbW9kX2lkXS5sZXZlbCk7Cit9CisKK2VudW0gYmZhX2xvZ19zZXZlcml0eQorYmZhX2xvZ19nZXRfbXNnX2xldmVsKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLCB1MzIgbXNnX2lkKQoreworCXN0cnVjdCBiZmFfbG9nX21zZ2RlZl9zICptc2c7CisJdTMyICAgICAgICBtb2QgPSBCRkFfTE9HX0dFVF9NT0RfSUQobXNnX2lkKTsKKwl1MzIgICAgICAgIGlkeCA9IEJGQV9MT0dfR0VUX01TR19JRFgobXNnX2lkKSAtIDE7CisKKwlpZiAoIWJmYV9sb2dfaW5pdGlhbGl6ZWQpCisJCXJldHVybiBCRkFfTE9HX0lOVkFMSUQ7CisKKwlpZiAobW9kID4gQkZBX0xPR19NT0RVTEVfSURfTUFYKQorCQlyZXR1cm4gQkZBX0xPR19JTlZBTElEOworCisJaWYgKGlkeCA+PSBiZmFfbG9nX2luZm9bbW9kXS50b3RhbF9jb3VudCkgeworCQliZmFfbG9nX2luZm9bbW9kXS5jYmZuKGxvZ19tb2QsIG1zZ19pZCwKKwkJCSIlcyVzIGxvZzogaW5jb25zaXN0ZW50IGlkeCAldSB2cy4gdG90YWwgY291bnQgJXVcbiIsCisJCQlCRkFfTE9HX0NBVF9OQU1FLCBiZmFfbG9nX3NldmVyaXR5W0JGQV9MT0dfRVJST1JdLCBpZHgsCisJCQliZmFfbG9nX2luZm9bbW9kXS50b3RhbF9jb3VudCk7CisJCXJldHVybiBCRkFfTE9HX0lOVkFMSUQ7CisJfQorCisJbXNnID0gYmZhX2xvZ19tc2dfYXJyYXkgKyBiZmFfbG9nX2luZm9bbW9kXS5zdGFydF9pZHggKyBpZHg7CisJaWYgKG1zZ19pZCAhPSBCRkFfTE9HX0dFVF9NU0dfSUQobXNnKSkgeworCQliZmFfbG9nX2luZm9bbW9kXS5jYmZuKGxvZ19tb2QsIG1zZ19pZCwKKwkJCSIlcyVzIGxvZzogaW5jb25zaXN0ZW50IG1zZyBpZCAldSBhcnJheSBtc2cgaWQgJXVcbiIsCisJCQlCRkFfTE9HX0NBVF9OQU1FLCBiZmFfbG9nX3NldmVyaXR5W0JGQV9MT0dfRVJST1JdLAorCQkJbXNnX2lkLCBCRkFfTE9HX0dFVF9NU0dfSUQobXNnKSk7CisJCXJldHVybiBCRkFfTE9HX0lOVkFMSUQ7CisJfQorCisJcmV0dXJuIEJGQV9MT0dfR0VUX1NFVkVSSVRZKG1zZyk7Cit9CisKKy8qKgorICogQkZBIGxvZyBtZXNzYWdlIGhhbmRsaW5nCisgKgorICogQkZBIGxvZyBtZXNzYWdlIGhhbmRsaW5nIGZpbmRzIHRoZSBtZXNzYWdlIGJhc2VkIG9uIG1lc3NhZ2UgaWQgYW5kIHByaW50cworICogb3V0IHRoZSBtZXNzYWdlIGJhc2VkIG9uIGl0cyBmb3JtYXQgYW5kIGFyZ3VtZW50cy4gSXQgYWxzbyBkb2VzIHByZWZpeAorICogdGhlIHNldmVyaXR5IGV0Yy4KKyAqCisgKiBAcGFyYW1baW5dIGxvZ19tb2QgLSBsb2cgbW9kdWxlIGluZm8KKyAqIEBwYXJhbVtpbl0gbXNnX2lkIC0gbWVzc2FnZSBpZAorICogQHBhcmFtW2luXSAuLi4gLSBtZXNzYWdlIGFyZ3VtZW50cworICoKKyAqIEl0IHJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGVycm9ycworICovCitpbnQKK2JmYV9sb2coc3RydWN0IGJmYV9sb2dfbW9kX3MgKmxvZ19tb2QsIHUzMiBtc2dfaWQsIC4uLikKK3sKKwl2YV9saXN0ICAgICAgICAgYXA7CisJY2hhciAgICAgICAgICAgIGJ1ZlsyNTZdOworCXN0cnVjdCBiZmFfbG9nX21zZ2RlZl9zICptc2c7CisJaW50ICAgICAgICAgICAgIGxvZ19sZXZlbDsKKwl1MzIgICAgICAgIG1vZCA9IEJGQV9MT0dfR0VUX01PRF9JRChtc2dfaWQpOworCXUzMiAgICAgICAgaWR4ID0gQkZBX0xPR19HRVRfTVNHX0lEWChtc2dfaWQpIC0gMTsKKworCWlmICghYmZhX2xvZ19pbml0aWFsaXplZCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1vZCA+IEJGQV9MT0dfTU9EVUxFX0lEX01BWCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGlkeCA+PSBiZmFfbG9nX2luZm9bbW9kXS50b3RhbF9jb3VudCkgeworCQliZmFfbG9nX2luZm9bbW9kXS4KKwkJCWNiZm4KKwkJCShsb2dfbW9kLCBtc2dfaWQsCisJCQkiJXMlcyBsb2c6IGluY29uc2lzdGVudCBpZHggJXUgdnMuIHRvdGFsIGNvdW50ICV1XG4iLAorCQkJQkZBX0xPR19DQVRfTkFNRSwgYmZhX2xvZ19zZXZlcml0eVtCRkFfTE9HX0VSUk9SXSwgaWR4LAorCQkJYmZhX2xvZ19pbmZvW21vZF0udG90YWxfY291bnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJbXNnID0gYmZhX2xvZ19tc2dfYXJyYXkgKyBiZmFfbG9nX2luZm9bbW9kXS5zdGFydF9pZHggKyBpZHg7CisJaWYgKG1zZ19pZCAhPSBCRkFfTE9HX0dFVF9NU0dfSUQobXNnKSkgeworCQliZmFfbG9nX2luZm9bbW9kXS4KKwkJCWNiZm4KKwkJCShsb2dfbW9kLCBtc2dfaWQsCisJCQkiJXMlcyBsb2c6IGluY29uc2lzdGVudCBtc2cgaWQgJXUgYXJyYXkgbXNnIGlkICV1XG4iLAorCQkJQkZBX0xPR19DQVRfTkFNRSwgYmZhX2xvZ19zZXZlcml0eVtCRkFfTE9HX0VSUk9SXSwKKwkJCW1zZ19pZCwgQkZBX0xPR19HRVRfTVNHX0lEKG1zZykpOworCQlyZXR1cm4gLTE7CisJfQorCisJbG9nX2xldmVsID0gbG9nX21vZCA/IGxvZ19tb2QtPmxvZ19sZXZlbFttb2RdIDogYmZhX2xvZ19pbmZvW21vZF0ubGV2ZWw7CisJaWYgKChCRkFfTE9HX0dFVF9TRVZFUklUWShtc2cpID4gbG9nX2xldmVsKSAmJgorCQkJKG1zZy0+YXR0cmlidXRlcyAhPSBCRkFfTE9HX0FUVFJfTk9ORSkpCisJCXJldHVybiAwOworCisJdmFfc3RhcnQoYXAsIG1zZ19pZCk7CisJYmZhX29zX3ZzcHJpbnRmKGJ1ZiwgQkZBX0xPR19HRVRfTVNHX0ZNVF9TVFJJTkcobXNnKSwgYXApOworCXZhX2VuZChhcCk7CisKKwlpZiAobG9nX21vZCkKKwkJbG9nX21vZC0+Y2Jmbihsb2dfbW9kLCBtc2dfaWQsICIlc1slc10lcyVzICVzOiAlc1xuIiwKKwkJCQlCRkFfTE9HX0NBVF9OQU1FLCBsb2dfbW9kLT5pbnN0YW5jZV9pbmZvLAorCQkJCWJmYV9sb2dfc2V2ZXJpdHlbQkZBX0xPR19HRVRfU0VWRVJJVFkobXNnKV0sCisJCQkJKG1zZy0+YXR0cmlidXRlcyAmIEJGQV9MT0dfQVRUUl9BVURJVCkKKwkJCQk/ICIgKGF1ZGl0KSAiIDogIiIsIG1zZy0+bXNnX3ZhbHVlLCBidWYpOworCWVsc2UKKwkJYmZhX2xvZ19pbmZvW21vZF0uY2Jmbihsb2dfbW9kLCBtc2dfaWQsICIlcyVzJXMgJXM6ICVzXG4iLAorCQkJCUJGQV9MT0dfQ0FUX05BTUUsCisJCQkJYmZhX2xvZ19zZXZlcml0eVtCRkFfTE9HX0dFVF9TRVZFUklUWShtc2cpXSwKKwkJCQkobXNnLT5hdHRyaWJ1dGVzICYgQkZBX0xPR19BVFRSX0FVRElUKSA/CisJCQkJIiAoYXVkaXQpICIgOiAiIiwgbXNnLT5tc2dfdmFsdWUsIGJ1Zik7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfbG9nX21vZHVsZS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbG9nX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTU0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9sb2dfbW9kdWxlLmMKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNzL2JmYV9sb2cuaD4KKyNpbmNsdWRlIDxhZW4vYmZhX2Flbl9hZGFwdGVyLmg+CisjaW5jbHVkZSA8YWVuL2JmYV9hZW5fYXVkaXQuaD4KKyNpbmNsdWRlIDxhZW4vYmZhX2Flbl9ldGhwb3J0Lmg+CisjaW5jbHVkZSA8YWVuL2JmYV9hZW5faW9jLmg+CisjaW5jbHVkZSA8YWVuL2JmYV9hZW5faXRuaW0uaD4KKyNpbmNsdWRlIDxhZW4vYmZhX2Flbl9scG9ydC5oPgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuX3BvcnQuaD4KKyNpbmNsdWRlIDxhZW4vYmZhX2Flbl9ycG9ydC5oPgorI2luY2x1ZGUgPGxvZy9iZmFfbG9nX2Zjcy5oPgorI2luY2x1ZGUgPGxvZy9iZmFfbG9nX2hhbC5oPgorI2luY2x1ZGUgPGxvZy9iZmFfbG9nX2xpbnV4Lmg+CisjaW5jbHVkZSA8bG9nL2JmYV9sb2dfd2Rydi5oPgorCitzdHJ1Y3QgYmZhX2xvZ19tc2dkZWZfcyBiZmFfbG9nX21zZ19hcnJheVtdID0geworCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgQkZBX0FFTl9DQVRfQURBUFRFUiBNb2R1bGUgKi8KK3tCRkFfQUVOX0FEQVBURVJfQURELCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiQkZBX0FFTl9BREFQVEVSX0FERCIsCisgIk5ldyBhZGFwdGVyIGZvdW5kOiBTTiA9ICVzLCBiYXNlIHBvcnQgV1dOID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzEpIHwgMCksIDJ9LAorCit7QkZBX0FFTl9BREFQVEVSX1JFTU9WRSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfV0FSTklORywgIkJGQV9BRU5fQURBUFRFUl9SRU1PVkUiLAorICJBZGFwdGVyIHJlbW92ZWQ6IFNOID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCisKKworCisvKiBtZXNzYWdlcyBkZWZpbmUgZm9yIEJGQV9BRU5fQ0FUX0FVRElUIE1vZHVsZSAqLwore0JGQV9BRU5fQVVESVRfQVVUSF9FTkFCTEUsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0lORk8sICJCRkFfQUVOX0FVRElUX0FVVEhfRU5BQkxFIiwKKyAiQXV0aGVudGljYXRpb24gZW5hYmxlZCBmb3IgYmFzZSBwb3J0OiBXV04gPSAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfQUVOX0FVRElUX0FVVEhfRElTQUJMRSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkJGQV9BRU5fQVVESVRfQVVUSF9ESVNBQkxFIiwKKyAiQXV0aGVudGljYXRpb24gZGlzYWJsZWQgZm9yIGJhc2UgcG9ydDogV1dOID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCisKKworCisvKiBtZXNzYWdlcyBkZWZpbmUgZm9yIEJGQV9BRU5fQ0FUX0VUSFBPUlQgTW9kdWxlICovCit7QkZBX0FFTl9FVEhQT1JUX0xJTktVUCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fRVRIUE9SVF9MSU5LVVAiLAorICJCYXNlIHBvcnQgZXRoZXJuZXQgbGlua3VwOiBtYWMgPSAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfQUVOX0VUSFBPUlRfTElOS0RPV04sIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX0VUSFBPUlRfTElOS0RPV04iLAorICJCYXNlIHBvcnQgZXRoZXJuZXQgbGlua2Rvd246IG1hYyA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fRVRIUE9SVF9FTkFCTEUsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX0VUSFBPUlRfRU5BQkxFIiwKKyAiQmFzZSBwb3J0IGV0aGVybmV0IGludGVyZmFjZSBlbmFibGVkOiBtYWMgPSAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfQUVOX0VUSFBPUlRfRElTQUJMRSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fRVRIUE9SVF9ESVNBQkxFIiwKKyAiQmFzZSBwb3J0IGV0aGVybmV0IGludGVyZmFjZSBkaXNhYmxlZDogbWFjID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCisKKworCisvKiBtZXNzYWdlcyBkZWZpbmUgZm9yIEJGQV9BRU5fQ0FUX0lPQyBNb2R1bGUgKi8KK3tCRkFfQUVOX0lPQ19IQkdPT0QsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX0lPQ19IQkdPT0QiLAorICJIZWFydCBCZWF0IG9mIElPQyAlZCBpcyBnb29kLiIsCisgKChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fSU9DX0hCRkFJTCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0NSSVRJQ0FMLAorICJCRkFfQUVOX0lPQ19IQkZBSUwiLAorICJIZWFydCBCZWF0IG9mIElPQyAlZCBoYXMgZmFpbGVkLiIsCisgKChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fSU9DX0VOQUJMRSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fSU9DX0VOQUJMRSIsCisgIklPQyAlZCBpcyBlbmFibGVkLiIsCisgKChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fSU9DX0RJU0FCTEUsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX0lPQ19ESVNBQkxFIiwKKyAiSU9DICVkIGlzIGRpc2FibGVkLiIsCisgKChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fSU9DX0ZXTUlTTUFUQ0gsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0NSSVRJQ0FMLCAiQkZBX0FFTl9JT0NfRldNSVNNQVRDSCIsCisgIlJ1bm5pbmcgZmlybXdhcmUgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZHJpdmVyIHZlcnNpb24uIiwKKyAoMCksIDB9LAorCisKKworCisvKiBtZXNzYWdlcyBkZWZpbmUgZm9yIEJGQV9BRU5fQ0FUX0lUTklNIE1vZHVsZSAqLwore0JGQV9BRU5fSVROSU1fT05MSU5FLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiQkZBX0FFTl9JVE5JTV9PTkxJTkUiLAorICJUYXJnZXQgKFdXTiA9ICVzKSBpcyBvbmxpbmUgZm9yIGluaXRpYXRvciAoV1dOID0gJXMpLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fSVROSU1fT0ZGTElORSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fSVROSU1fT0ZGTElORSIsCisgIlRhcmdldCAoV1dOID0gJXMpIG9mZmxpbmVkIGJ5IGluaXRpYXRvciAoV1dOID0gJXMpLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fSVROSU1fRElTQ09OTkVDVCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfRVJST1IsICJCRkFfQUVOX0lUTklNX0RJU0NPTk5FQ1QiLAorICJUYXJnZXQgKFdXTiA9ICVzKSBjb25uZWN0aXZpdHkgbG9zdCBmb3IgaW5pdGlhdG9yIChXV04gPSAlcykuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzEpIHwgMCksIDJ9LAorCisKKworCisvKiBtZXNzYWdlcyBkZWZpbmUgZm9yIEJGQV9BRU5fQ0FUX0xQT1JUIE1vZHVsZSAqLwore0JGQV9BRU5fTFBPUlRfTkVXLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiQkZBX0FFTl9MUE9SVF9ORVciLAorICJOZXcgbG9naWNhbCBwb3J0IGNyZWF0ZWQ6IFdXTiA9ICVzLCBSb2xlID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzEpIHwgMCksIDJ9LAorCit7QkZBX0FFTl9MUE9SVF9ERUxFVEUsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX0xQT1JUX0RFTEVURSIsCisgIkxvZ2ljYWwgcG9ydCBkZWxldGVkOiBXV04gPSAlcywgUm9sZSA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fTFBPUlRfT05MSU5FLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiQkZBX0FFTl9MUE9SVF9PTkxJTkUiLAorICJMb2dpY2FsIHBvcnQgb25saW5lOiBXV04gPSAlcywgUm9sZSA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fTFBPUlRfT0ZGTElORSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fTFBPUlRfT0ZGTElORSIsCisgIkxvZ2ljYWwgcG9ydCB0YWtlbiBvZmZsaW5lOiBXV04gPSAlcywgUm9sZSA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fTFBPUlRfRElTQ09OTkVDVCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfRVJST1IsICJCRkFfQUVOX0xQT1JUX0RJU0NPTk5FQ1QiLAorICJMb2dpY2FsIHBvcnQgbG9zdCBmYWJyaWMgY29ubmVjdGl2aXR5OiBXV04gPSAlcywgUm9sZSA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fTFBPUlRfTkVXX1BST1AsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX0xQT1JUX05FV19QUk9QIiwKKyAiTmV3IHZpcnR1YWwgcG9ydCBjcmVhdGVkIHVzaW5nIHByb3ByaWV0YXJ5IGludGVyZmFjZTogV1dOID0gJXMsIFJvbGUgPSAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMSkgfCAwKSwgMn0sCisKK3tCRkFfQUVOX0xQT1JUX0RFTEVURV9QUk9QLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiQkZBX0FFTl9MUE9SVF9ERUxFVEVfUFJPUCIsCisgIlZpcnR1YWwgcG9ydCBkZWxldGVkIHVzaW5nIHByb3ByaWV0YXJ5IGludGVyZmFjZTogV1dOID0gJXMsIFJvbGUgPSAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMSkgfCAwKSwgMn0sCisKK3tCRkFfQUVOX0xQT1JUX05FV19TVEFOREFSRCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkJGQV9BRU5fTFBPUlRfTkVXX1NUQU5EQVJEIiwKKyAiTmV3IHZpcnR1YWwgcG9ydCBjcmVhdGVkIHVzaW5nIHN0YW5kYXJkIGludGVyZmFjZTogV1dOID0gJXMsIFJvbGUgPSAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMSkgfCAwKSwgMn0sCisKK3tCRkFfQUVOX0xQT1JUX0RFTEVURV9TVEFOREFSRCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkJGQV9BRU5fTFBPUlRfREVMRVRFX1NUQU5EQVJEIiwKKyAiVmlydHVhbCBwb3J0IGRlbGV0ZWQgdXNpbmcgc3RhbmRhcmQgaW50ZXJmYWNlOiBXV04gPSAlcywgUm9sZSA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fTFBPUlRfTlBJVl9EVVBfV1dOLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19XQVJOSU5HLCAiQkZBX0FFTl9MUE9SVF9OUElWX0RVUF9XV04iLAorICJWaXJ0dWFsIHBvcnQgbG9naW4gZmFpbGVkLiBEdXBsaWNhdGUgV1dOID0gJXMgcmVwb3J0ZWQgYnkgZmFicmljLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fTFBPUlRfTlBJVl9GQUJSSUNfTUFYLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19XQVJOSU5HLCAiQkZBX0FFTl9MUE9SVF9OUElWX0ZBQlJJQ19NQVgiLAorICJWaXJ0dWFsIHBvcnQgKFdXTiA9ICVzKSBsb2dpbiBmYWlsZWQuIE1heCBOUElWIHBvcnRzIGFscmVhZHkgZXhpc3QgaW4iCisgIiBmYWJyaWMvZnBvcnQuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0FFTl9MUE9SVF9OUElWX1VOS05PV04sIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX1dBUk5JTkcsICJCRkFfQUVOX0xQT1JUX05QSVZfVU5LTk9XTiIsCisgIlZpcnR1YWwgcG9ydCAoV1dOID0gJXMpIGxvZ2luIGZhaWxlZC4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKKworCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgQkZBX0FFTl9DQVRfUE9SVCBNb2R1bGUgKi8KK3tCRkFfQUVOX1BPUlRfT05MSU5FLCBCRkFfTE9HX0FUVFJfTk9ORSwgQkZBX0xPR19JTkZPLCAiQkZBX0FFTl9QT1JUX09OTElORSIsCisgIkJhc2UgcG9ydCBvbmxpbmU6IFdXTiA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fUE9SVF9PRkZMSU5FLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfV0FSTklORywKKyAiQkZBX0FFTl9QT1JUX09GRkxJTkUiLAorICJCYXNlIHBvcnQgb2ZmbGluZTogV1dOID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0FFTl9QT1JUX1JMSVIsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX1BPUlRfUkxJUiIsCisgIlJMSVIgZXZlbnQgbm90IHN1cHBvcnRlZC4iLAorICgwKSwgMH0sCisKK3tCRkFfQUVOX1BPUlRfU0ZQX0lOU0VSVCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fUE9SVF9TRlBfSU5TRVJUIiwKKyAiTmV3IFNGUCBmb3VuZDogV1dOL01BQyA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fUE9SVF9TRlBfUkVNT1ZFLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19XQVJOSU5HLCAiQkZBX0FFTl9QT1JUX1NGUF9SRU1PVkUiLAorICJTRlAgcmVtb3ZlZDogV1dOL01BQyA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9BRU5fUE9SVF9TRlBfUE9NLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfV0FSTklORywKKyAiQkZBX0FFTl9QT1JUX1NGUF9QT00iLAorICJTRlAgUE9NIGxldmVsIHRvICVzOiBXV04vTUFDID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzEpIHwgMCksIDJ9LAorCit7QkZBX0FFTl9QT1JUX0VOQUJMRSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fUE9SVF9FTkFCTEUiLAorICJCYXNlIHBvcnQgZW5hYmxlZDogV1dOID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0FFTl9QT1JUX0RJU0FCTEUsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX1BPUlRfRElTQUJMRSIsCisgIkJhc2UgcG9ydCBkaXNhYmxlZDogV1dOID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0FFTl9QT1JUX0FVVEhfT04sIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX1BPUlRfQVVUSF9PTiIsCisgIkF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwgZm9yIGJhc2UgcG9ydDogV1dOID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0FFTl9QT1JUX0FVVEhfT0ZGLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfRVJST1IsCisgIkJGQV9BRU5fUE9SVF9BVVRIX09GRiIsCisgIkF1dGhlbnRpY2F0aW9uIHVuc3VjY2Vzc2Z1bCBmb3IgYmFzZSBwb3J0OiBXV04gPSAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfQUVOX1BPUlRfRElTQ09OTkVDVCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0VSUk9SLAorICJCRkFfQUVOX1BPUlRfRElTQ09OTkVDVCIsCisgIkJhc2UgcG9ydCAoV1dOID0gJXMpIGxvc3QgZmFicmljIGNvbm5lY3Rpdml0eS4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfQUVOX1BPUlRfUU9TX05FRywgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX1dBUk5JTkcsCisgIkJGQV9BRU5fUE9SVF9RT1NfTkVHIiwKKyAiUU9TIG5lZ290aWF0aW9uIGZhaWxlZCBmb3IgYmFzZSBwb3J0OiBXV04gPSAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfQUVOX1BPUlRfRkFCUklDX05BTUVfQ0hBTkdFLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19XQVJOSU5HLCAiQkZBX0FFTl9QT1JUX0ZBQlJJQ19OQU1FX0NIQU5HRSIsCisgIkJhc2UgcG9ydCBXV04gPSAlcywgRmFicmljIFdXTiA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fUE9SVF9TRlBfQUNDRVNTX0VSUk9SLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19XQVJOSU5HLCAiQkZBX0FFTl9QT1JUX1NGUF9BQ0NFU1NfRVJST1IiLAorICJTRlAgYWNjZXNzIGVycm9yOiBXV04vTUFDID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0FFTl9QT1JUX1NGUF9VTlNVUFBPUlQsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX1dBUk5JTkcsICJCRkFfQUVOX1BPUlRfU0ZQX1VOU1VQUE9SVCIsCisgIlVuc3VwcG9ydGVkIFNGUCBmb3VuZDogV1dOL01BQyA9ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKworCisKKworLyogbWVzc2FnZXMgZGVmaW5lIGZvciBCRkFfQUVOX0NBVF9SUE9SVCBNb2R1bGUgKi8KK3tCRkFfQUVOX1JQT1JUX09OTElORSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fUlBPUlRfT05MSU5FIiwKKyAiUmVtb3RlIHBvcnQgKFdXTiA9ICVzKSBvbmxpbmUgZm9yIGxvZ2ljYWwgcG9ydCAoV1dOID0gJXMpLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fUlBPUlRfT0ZGTElORSwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkJGQV9BRU5fUlBPUlRfT0ZGTElORSIsCisgIlJlbW90ZSBwb3J0IChXV04gPSAlcykgb2ZmbGluZWQgYnkgbG9naWNhbCBwb3J0IChXV04gPSAlcykuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzEpIHwgMCksIDJ9LAorCit7QkZBX0FFTl9SUE9SVF9ESVNDT05ORUNULCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19FUlJPUiwgIkJGQV9BRU5fUlBPUlRfRElTQ09OTkVDVCIsCisgIlJlbW90ZSBwb3J0IChXV04gPSAlcykgY29ubmVjdGl2aXR5IGxvc3QgZm9yIGxvZ2ljYWwgcG9ydCAoV1dOID0gJXMpLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8IDApLCAyfSwKKwore0JGQV9BRU5fUlBPUlRfUU9TX1BSSU8sIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJCRkFfQUVOX1JQT1JUX1FPU19QUklPIiwKKyAiUU9TIHByaW9yaXR5IGNoYW5nZWQgdG8gJXM6IFJQV1dOID0gJXMgYW5kIExQV1dOID0gJXMuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzEpIHwKKyAgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzIpIHwgMCksIDN9LAorCit7QkZBX0FFTl9SUE9SVF9RT1NfRkxPV0lELCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiQkZBX0FFTl9SUE9SVF9RT1NfRkxPV0lEIiwKKyAiUU9TIGZsb3cgSUQgY2hhbmdlZCB0byAlZDogUlBXV04gPSAlcyBhbmQgTFBXV04gPSAlcy4iLAorICgoQkZBX0xPR19EIDw8IEJGQV9MT0dfQVJHMCkgfCAoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMSkgfAorICAoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMikgfCAwKSwgM30sCisKKworCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgRkNTIE1vZHVsZSAqLwore0JGQV9MT0dfRkNTX0ZBQlJJQ19OT1NXSVRDSCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkZDU19GQUJSSUNfTk9TV0lUQ0giLAorICJObyBzd2l0Y2hlZCBmYWJyaWMgcHJlc2VuY2UgaXMgZGV0ZWN0ZWQuIiwKKyAoMCksIDB9LAorCit7QkZBX0xPR19GQ1NfRkFCUklDX0lTT0xBVEVELCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiRkNTX0ZBQlJJQ19JU09MQVRFRCIsCisgIlBvcnQgaXMgaXNvbGF0ZWQgZHVlIHRvIFZGX0lEIG1pc21hdGNoLiBQV1dOOiAlcywgUG9ydCBWRl9JRDogJTA0eCBhbmQiCisgIiBzd2l0Y2ggcG9ydCBWRl9JRDogJTA0eC4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAoQkZBX0xPR19YIDw8IEJGQV9MT0dfQVJHMSkgfAorICAoQkZBX0xPR19YIDw8IEJGQV9MT0dfQVJHMikgfCAwKSwgM30sCisKKworCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgSEFMIE1vZHVsZSAqLwore0JGQV9MT0dfSEFMX0FTU0VSVCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0VSUk9SLAorICJIQUxfQVNTRVJUIiwKKyAiQXNzZXJ0aW9uIGZhaWx1cmU6ICVzOiVkOiAlcyIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcxKSB8CisgIChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcyKSB8IDApLCAzfSwKKwore0JGQV9MT0dfSEFMX0hFQVJUQkVBVF9GQUlMVVJFLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19DUklUSUNBTCwgIkhBTF9IRUFSVEJFQVRfRkFJTFVSRSIsCisgIkZpcm13YXJlIGhlYXJ0YmVhdCBmYWlsdXJlIGF0ICVkIiwKKyAoKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0xPR19IQUxfRkNQSU1fUEFSTV9JTlZBTElELCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiSEFMX0ZDUElNX1BBUk1fSU5WQUxJRCIsCisgIkRyaXZlciBjb25maWd1cmF0aW9uICVzIHZhbHVlICVkIGlzIGludmFsaWQuIFZhbHVlIHNob3VsZCBiZSB3aXRoaW4iCisgIiAlZCBhbmQgJWQuIiwKKyAoKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzEpIHwKKyAgKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzIpIHwgKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzMpIHwgMCksIDR9LAorCit7QkZBX0xPR19IQUxfU01fQVNTRVJULCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfRVJST1IsCisgIkhBTF9TTV9BU1NFUlQiLAorICJTTSBBc3NlcnRpb24gZmFpbHVyZTogJXM6JWQ6IGV2ZW50ID0gJWQiLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAoQkZBX0xPR19EIDw8IEJGQV9MT0dfQVJHMSkgfAorICAoQkZBX0xPR19EIDw8IEJGQV9MT0dfQVJHMikgfCAwKSwgM30sCisKKworCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgTElOVVggTW9kdWxlICovCit7QkZBX0xPR19MSU5VWF9ERVZJQ0VfQ0xBSU1FRCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkxJTlVYX0RFVklDRV9DTEFJTUVEIiwKKyAiYmZhIGRldmljZSBhdCAlcyBjbGFpbWVkLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9MT0dfTElOVVhfSEFTSF9JTklUX0ZBSUxFRCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkxJTlVYX0hBU0hfSU5JVF9GQUlMRUQiLAorICJIYXNoIHRhYmxlIGluaXRpYWxpemF0aW9uIGZhaWx1cmUgZm9yIHRoZSBwb3J0ICVzLiIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9MT0dfTElOVVhfU1lTRlNfRkFJTEVELCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiTElOVVhfU1lTRlNfRkFJTEVEIiwKKyAic3lzZnMgZmlsZSBjcmVhdGlvbiBmYWlsdXJlIGZvciB0aGUgcG9ydCAlcy4iLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfTE9HX0xJTlVYX01FTV9BTExPQ19GQUlMRUQsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0lORk8sICJMSU5VWF9NRU1fQUxMT0NfRkFJTEVEIiwKKyAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkOiAlcy4gICIsCisgKChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcwKSB8IDApLCAxfSwKKwore0JGQV9MT0dfTElOVVhfRFJJVkVSX1JFR0lTVFJBVElPTl9GQUlMRUQsCisgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLCBCRkFfTE9HX0lORk8sCisgIkxJTlVYX0RSSVZFUl9SRUdJU1RSQVRJT05fRkFJTEVEIiwKKyAiJXMuICAiLAorICgoQkZBX0xPR19TIDw8IEJGQV9MT0dfQVJHMCkgfCAwKSwgMX0sCisKK3tCRkFfTE9HX0xJTlVYX0lUTklNX0ZSRUUsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywgQkZBX0xPR19JTkZPLAorICJMSU5VWF9JVE5JTV9GUkVFIiwKKyAic2NzaSVkOiBGQ0lEOiAlcyBXV1BOOiAlcyIsCisgKChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcxKSB8CisgIChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcyKSB8IDApLCAzfSwKKwore0JGQV9MT0dfTElOVVhfSVROSU1fT05MSU5FLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiTElOVVhfSVROSU1fT05MSU5FIiwKKyAiVGFyZ2V0OiAlZDowOiVkIEZDSUQ6ICVzIFdXUE46ICVzIiwKKyAoKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzApIHwgKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzEpIHwKKyAgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzIpIHwgKEJGQV9MT0dfUyA8PCBCRkFfTE9HX0FSRzMpIHwgMCksIDR9LAorCit7QkZBX0xPR19MSU5VWF9JVE5JTV9PRkZMSU5FLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiTElOVVhfSVROSU1fT0ZGTElORSIsCisgIlRhcmdldDogJWQ6MDolZCBGQ0lEOiAlcyBXV1BOOiAlcyIsCisgKChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcxKSB8CisgIChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkcyKSB8IChCRkFfTE9HX1MgPDwgQkZBX0xPR19BUkczKSB8IDApLCA0fSwKKwore0JGQV9MT0dfTElOVVhfU0NTSV9IT1NUX0ZSRUUsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0lORk8sICJMSU5VWF9TQ1NJX0hPU1RfRlJFRSIsCisgIkZyZWUgc2NzaSVkIiwKKyAoKEJGQV9MT0dfRCA8PCBCRkFfTE9HX0FSRzApIHwgMCksIDF9LAorCit7QkZBX0xPR19MSU5VWF9TQ1NJX0FCT1JULCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csIEJGQV9MT0dfSU5GTywKKyAiTElOVVhfU0NTSV9BQk9SVCIsCisgInNjc2klZDogYWJvcnQgY21uZCAlcCwgaW90YWcgJXgiLAorICgoQkZBX0xPR19EIDw8IEJGQV9MT0dfQVJHMCkgfCAoQkZBX0xPR19QIDw8IEJGQV9MT0dfQVJHMSkgfAorICAoQkZBX0xPR19YIDw8IEJGQV9MT0dfQVJHMikgfCAwKSwgM30sCisKK3tCRkFfTE9HX0xJTlVYX1NDU0lfQUJPUlRfQ09NUCwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIkxJTlVYX1NDU0lfQUJPUlRfQ09NUCIsCisgInNjc2klZDogY29tcGxldGUgYWJvcnQgMHglcCwgaW90YWcgMHgleCIsCisgKChCRkFfTE9HX0QgPDwgQkZBX0xPR19BUkcwKSB8IChCRkFfTE9HX1AgPDwgQkZBX0xPR19BUkcxKSB8CisgIChCRkFfTE9HX1ggPDwgQkZBX0xPR19BUkcyKSB8IDApLCAzfSwKKworCisKKworLyogbWVzc2FnZXMgZGVmaW5lIGZvciBXRFJWIE1vZHVsZSAqLwore0JGQV9MT0dfV0RSVl9JT0NfSU5JVF9FUlJPUiwgQkZBX0xPR19BVFRSX05PTkUgfCBCRkFfTE9HX0FUVFJfTE9HLAorIEJGQV9MT0dfSU5GTywgIldEUlZfSU9DX0lOSVRfRVJST1IiLAorICJJT0MgaW5pdGlhbGl6YXRpb24gaGFzIGZhaWxlZC4iLAorICgwKSwgMH0sCisKK3tCRkFfTE9HX1dEUlZfSU9DX0lOVEVSTkFMX0VSUk9SLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiV0RSVl9JT0NfSU5URVJOQUxfRVJST1IiLAorICJJT0MgaW50ZXJuYWwgZXJyb3IuICAiLAorICgwKSwgMH0sCisKK3tCRkFfTE9HX1dEUlZfSU9DX1NUQVJUX0VSUk9SLCBCRkFfTE9HX0FUVFJfTk9ORSB8IEJGQV9MT0dfQVRUUl9MT0csCisgQkZBX0xPR19JTkZPLCAiV0RSVl9JT0NfU1RBUlRfRVJST1IiLAorICJJT0MgY291bGQgbm90IGJlIHN0YXJ0ZWQuICAiLAorICgwKSwgMH0sCisKK3tCRkFfTE9HX1dEUlZfSU9DX1NUT1BfRVJST1IsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0lORk8sICJXRFJWX0lPQ19TVE9QX0VSUk9SIiwKKyAiSU9DIGNvdWxkIG5vdCBiZSBzdG9wcGVkLiAgIiwKKyAoMCksIDB9LAorCit7QkZBX0xPR19XRFJWX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0lORk8sICJXRFJWX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMiLAorICJJbnN1ZmZpY2llbnQgbWVtb3J5LiAgIiwKKyAoMCksIDB9LAorCit7QkZBX0xPR19XRFJWX0JBU0VfQUREUkVTU19NQVBfRVJST1IsIEJGQV9MT0dfQVRUUl9OT05FIHwgQkZBX0xPR19BVFRSX0xPRywKKyBCRkFfTE9HX0lORk8sICJXRFJWX0JBU0VfQUREUkVTU19NQVBfRVJST1IiLAorICJVbmFibGUgdG8gbWFwIHRoZSBJT0Mgb250byB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UuICAiLAorICgwKSwgMH0sCisKKworezAsIDAsIDAsICIiLCAiIiwgMCwgMH0sCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfbHBzLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9scHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQ0YjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbHBzLmMKQEAgLTAsMCArMSw3ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmaS9iZmlfbHBzLmg+CisjaW5jbHVkZSA8Y3MvYmZhX2RlYnVnLmg+CisKK0JGQV9UUkNfRklMRShIQUwsIExQUyk7CitCRkFfTU9EVUxFKGxwcyk7CisKKyNkZWZpbmUgQkZBX0xQU19NSU5fTFBPUlRTCSgxKQorI2RlZmluZSBCRkFfTFBTX01BWF9MUE9SVFMJKDI1NikKKworLyoqCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgdm9pZCBiZmFfbHBzX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKm5kbV9sZW4sCisJCQkgICAgdTMyICpkbV9sZW4pOworc3RhdGljIHZvaWQgYmZhX2xwc19hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsCisJCQkgICBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCQkgICBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywKKwkJCSAgIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldik7CitzdGF0aWMgdm9pZCBiZmFfbHBzX2luaXRkb25lKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3N0YXRpYyB2b2lkIGJmYV9scHNfZGV0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3N0YXRpYyB2b2lkIGJmYV9scHNfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpOworc3RhdGljIHZvaWQgYmZhX2xwc19zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3N0YXRpYyB2b2lkIGJmYV9scHNfaW9jZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSk7CitzdGF0aWMgdm9pZCBiZmFfbHBzX2xvZ2luX3JzcChzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJCSAgICAgIHN0cnVjdCBiZmlfbHBzX2xvZ2luX3JzcF9zICpyc3ApOworc3RhdGljIHZvaWQgYmZhX2xwc19sb2dvdXRfcnNwKHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJICAgICAgIHN0cnVjdCBiZmlfbHBzX2xvZ291dF9yc3BfcyAqcnNwKTsKK3N0YXRpYyB2b2lkIGJmYV9scHNfcmVxcV9yZXN1bWUodm9pZCAqbHBzX2FyZyk7CitzdGF0aWMgdm9pZCBiZmFfbHBzX2ZyZWUoc3RydWN0IGJmYV9scHNfcyAqbHBzKTsKK3N0YXRpYyB2b2lkIGJmYV9scHNfc2VuZF9sb2dpbihzdHJ1Y3QgYmZhX2xwc19zICpscHMpOworc3RhdGljIHZvaWQgYmZhX2xwc19zZW5kX2xvZ291dChzdHJ1Y3QgYmZhX2xwc19zICpscHMpOworc3RhdGljIHZvaWQgYmZhX2xwc19sb2dpbl9jb21wKHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7CitzdGF0aWMgdm9pZCBiZmFfbHBzX2xvZ291dF9jb21wKHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7CisKKworLyoqCisgKiAgbHBzX3B2dCBCRkEgTFBTIHByaXZhdGUgZnVuY3Rpb25zCisgKi8KKworZW51bSBiZmFfbHBzX2V2ZW50IHsKKwlCRkFfTFBTX1NNX0xPR0lOCT0gMSwJLyogbG9naW4gcmVxdWVzdCBmcm9tIHVzZXIJKi8KKwlCRkFfTFBTX1NNX0xPR09VVAk9IDIsCS8qIGxvZ291dCByZXF1ZXN0IGZyb20gdXNlcgkqLworCUJGQV9MUFNfU01fRldSU1AJPSAzLAkvKiBmL3cgcmVzcG9uc2UgdG8gbG9naW4vbG9nb3V0CSovCisJQkZBX0xQU19TTV9SRVNVTUUJPSA0LAkvKiBzcGFjZSBwcmVzZW50IGluIHJlcXEgcXVldWUJKi8KKwlCRkFfTFBTX1NNX0RFTEVURQk9IDUsCS8qIGxwcyBkZWxldGUgZnJvbSB1c2VyCQkqLworCUJGQV9MUFNfU01fT0ZGTElORQk9IDYsCS8qIExpbmsgaXMgb2ZmbGluZQkJKi8KK307CisKK3N0YXRpYyB2b2lkIGJmYV9scHNfc21faW5pdChzdHJ1Y3QgYmZhX2xwc19zICpscHMsIGVudW0gYmZhX2xwc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfbHBzX3NtX2xvZ2luKHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgZW51bSBiZmFfbHBzX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9scHNfc21fbG9naW53YWl0KHN0cnVjdCBiZmFfbHBzX3MgKmxwcywKKwkJCWVudW0gYmZhX2xwc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfbHBzX3NtX29ubGluZShzdHJ1Y3QgYmZhX2xwc19zICpscHMsIGVudW0gYmZhX2xwc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfbHBzX3NtX2xvZ291dChzdHJ1Y3QgYmZhX2xwc19zICpscHMsIGVudW0gYmZhX2xwc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfbHBzX3NtX2xvZ293YWl0KHN0cnVjdCBiZmFfbHBzX3MgKmxwcywKKwkJCWVudW0gYmZhX2xwc19ldmVudCBldmVudCk7CisKKy8qKgorICogSW5pdCBzdGF0ZSAtLSBubyBsb2dpbgorICovCitzdGF0aWMgdm9pZAorYmZhX2xwc19zbV9pbml0KHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgZW51bSBiZmFfbHBzX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+bHBfdGFnKTsKKwliZmFfdHJjKGxwcy0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfTFBTX1NNX0xPR0lOOgorCQlpZiAoYmZhX3JlcXFfZnVsbChscHMtPmJmYSwgbHBzLT5yZXFxKSkgeworCQkJYmZhX3NtX3NldF9zdGF0ZShscHMsIGJmYV9scHNfc21fbG9naW53YWl0KTsKKwkJCWJmYV9yZXFxX3dhaXQobHBzLT5iZmEsIGxwcy0+cmVxcSwgJmxwcy0+d3FlKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2xvZ2luKTsKKwkJCWJmYV9scHNfc2VuZF9sb2dpbihscHMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBCRkFfTFBTX1NNX0xPR09VVDoKKwkJYmZhX2xwc19sb2dvdXRfY29tcChscHMpOworCQlicmVhazsKKworCWNhc2UgQkZBX0xQU19TTV9ERUxFVEU6CisJCWJmYV9scHNfZnJlZShscHMpOworCQlicmVhazsKKworCWNhc2UgQkZBX0xQU19TTV9PRkZMSU5FOgorCQlicmVhazsKKworCWNhc2UgQkZBX0xQU19TTV9GV1JTUDoKKwkJLyogQ291bGQgaGFwcGVuIHdoZW4gZmFicmljIGRldGVjdHMgbG9vcGJhY2sgYW5kIGRpc2NhcmRzCisJCSAqIHRoZSBscHMgcmVxdWVzdC4gRncgd2lsbCBldmVudHVhbGx5IHNlbnQgb3V0IHRoZSB0aW1lb3V0CisJCSAqIEp1c3QgaWdub3JlCisJCSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIGxvZ2luIGlzIGluIHByb2dyZXNzIC0tIGF3YWl0aW5nIHJlc3BvbnNlIGZyb20gZmlybXdhcmUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfc21fbG9naW4oc3RydWN0IGJmYV9scHNfcyAqbHBzLCBlbnVtIGJmYV9scHNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhscHMtPmJmYSwgbHBzLT5scF90YWcpOworCWJmYV90cmMobHBzLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9MUFNfU01fRldSU1A6CisJCWlmIChscHMtPnN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKQorCQkJYmZhX3NtX3NldF9zdGF0ZShscHMsIGJmYV9scHNfc21fb25saW5lKTsKKwkJZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShscHMsIGJmYV9scHNfc21faW5pdCk7CisJCWJmYV9scHNfbG9naW5fY29tcChscHMpOworCQlicmVhazsKKworCWNhc2UgQkZBX0xQU19TTV9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKGxwcywgYmZhX2xwc19zbV9pbml0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBsb2dpbiBwZW5kaW5nIC0gYXdhaXRpbmcgc3BhY2UgaW4gcmVxdWVzdCBxdWV1ZQorICovCitzdGF0aWMgdm9pZAorYmZhX2xwc19zbV9sb2dpbndhaXQoc3RydWN0IGJmYV9scHNfcyAqbHBzLCBlbnVtIGJmYV9scHNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhscHMtPmJmYSwgbHBzLT5scF90YWcpOworCWJmYV90cmMobHBzLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9MUFNfU01fUkVTVU1FOgorCQliZmFfc21fc2V0X3N0YXRlKGxwcywgYmZhX2xwc19zbV9sb2dpbik7CisJCWJyZWFrOworCisJY2FzZSBCRkFfTFBTX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2luaXQpOworCQliZmFfcmVxcV93Y2FuY2VsKCZscHMtPndxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogbG9naW4gY29tcGxldGUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfc21fb25saW5lKHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgZW51bSBiZmFfbHBzX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+bHBfdGFnKTsKKwliZmFfdHJjKGxwcy0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfTFBTX1NNX0xPR09VVDoKKwkJaWYgKGJmYV9yZXFxX2Z1bGwobHBzLT5iZmEsIGxwcy0+cmVxcSkpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2xvZ293YWl0KTsKKwkJCWJmYV9yZXFxX3dhaXQobHBzLT5iZmEsIGxwcy0+cmVxcSwgJmxwcy0+d3FlKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2xvZ291dCk7CisJCQliZmFfbHBzX3NlbmRfbG9nb3V0KGxwcyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJGQV9MUFNfU01fT0ZGTElORToKKwljYXNlIEJGQV9MUFNfU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGxwcywgYmZhX2xwc19zbV9pbml0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBsb2dvdXQgaW4gcHJvZ3Jlc3MgLSBhd2FpdGluZyBmaXJtd2FyZSByZXNwb25zZQorICovCitzdGF0aWMgdm9pZAorYmZhX2xwc19zbV9sb2dvdXQoc3RydWN0IGJmYV9scHNfcyAqbHBzLCBlbnVtIGJmYV9scHNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhscHMtPmJmYSwgbHBzLT5scF90YWcpOworCWJmYV90cmMobHBzLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9MUFNfU01fRldSU1A6CisJCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2luaXQpOworCQliZmFfbHBzX2xvZ291dF9jb21wKGxwcyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfTFBTX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2luaXQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIGxvZ291dCBwZW5kaW5nIC0tIGF3YWl0aW5nIHNwYWNlIGluIHJlcXVlc3QgcXVldWUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfc21fbG9nb3dhaXQoc3RydWN0IGJmYV9scHNfcyAqbHBzLCBlbnVtIGJmYV9scHNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhscHMtPmJmYSwgbHBzLT5scF90YWcpOworCWJmYV90cmMobHBzLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9MUFNfU01fUkVTVU1FOgorCQliZmFfc21fc2V0X3N0YXRlKGxwcywgYmZhX2xwc19zbV9sb2dvdXQpOworCQliZmFfbHBzX3NlbmRfbG9nb3V0KGxwcyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfTFBTX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2luaXQpOworCQliZmFfcmVxcV93Y2FuY2VsKCZscHMtPndxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKworCisvKioKKyAqICBscHNfcHZ0IEJGQSBMUFMgcHJpdmF0ZSBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIHJldHVybiBtZW1vcnkgcmVxdWlyZW1lbnQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHUzMiAqbmRtX2xlbiwgdTMyICpkbV9sZW4pCit7CisJaWYgKGNmZy0+ZHJ2Y2ZnLm1pbl9jZmcpCisJCSpuZG1fbGVuICs9IHNpemVvZihzdHJ1Y3QgYmZhX2xwc19zKSAqIEJGQV9MUFNfTUlOX0xQT1JUUzsKKwllbHNlCisJCSpuZG1fbGVuICs9IHNpemVvZihzdHJ1Y3QgYmZhX2xwc19zKSAqIEJGQV9MUFNfTUFYX0xQT1JUUzsKK30KKworLyoqCisgKiBiZmEgbW9kdWxlIGF0dGFjaCBhdCBpbml0aWFsaXphdGlvbiB0aW1lCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfbHBzX2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYmZhZCwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAorCQlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywgc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQoreworCXN0cnVjdCBiZmFfbHBzX21vZF9zCSptb2QgPSBCRkFfTFBTX01PRChiZmEpOworCXN0cnVjdCBiZmFfbHBzX3MJKmxwczsKKwlpbnQJCQlpOworCisJYmZhX29zX21lbXNldChtb2QsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX2xwc19tb2RfcykpOworCW1vZC0+bnVtX2xwcyA9IEJGQV9MUFNfTUFYX0xQT1JUUzsKKwlpZiAoY2ZnLT5kcnZjZmcubWluX2NmZykKKwkJbW9kLT5udW1fbHBzID0gQkZBX0xQU19NSU5fTFBPUlRTOworCWVsc2UKKwkJbW9kLT5udW1fbHBzID0gQkZBX0xQU19NQVhfTFBPUlRTOworCW1vZC0+bHBzX2FyciA9IGxwcyA9IChzdHJ1Y3QgYmZhX2xwc19zICopIGJmYV9tZW1pbmZvX2t2YShtZW1pbmZvKTsKKworCWJmYV9tZW1pbmZvX2t2YShtZW1pbmZvKSArPSBtb2QtPm51bV9scHMgKiBzaXplb2Yoc3RydWN0IGJmYV9scHNfcyk7CisKKwlJTklUX0xJU1RfSEVBRCgmbW9kLT5scHNfZnJlZV9xKTsKKwlJTklUX0xJU1RfSEVBRCgmbW9kLT5scHNfYWN0aXZlX3EpOworCisJZm9yIChpID0gMDsgaSA8IG1vZC0+bnVtX2xwczsgaSsrLCBscHMrKykgeworCQlscHMtPmJmYQk9IGJmYTsKKwkJbHBzLT5scF90YWcJPSAodTgpIGk7CisJCWxwcy0+cmVxcQk9IEJGQV9SRVFRX0xQUzsKKwkJYmZhX3JlcXFfd2luaXQoJmxwcy0+d3FlLCBiZmFfbHBzX3JlcXFfcmVzdW1lLCBscHMpOworCQlsaXN0X2FkZF90YWlsKCZscHMtPnFlLCAmbW9kLT5scHNfZnJlZV9xKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfbHBzX2luaXRkb25lKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX2xwc19kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfbHBzX3N0YXJ0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX2xwc19zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCisvKioKKyAqIElPQyBpbiBkaXNhYmxlZCBzdGF0ZSAtLSBjb25zaWRlciBhbGwgbHBzIG9mZmxpbmUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfaW9jZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2xwc19tb2RfcwkqbW9kID0gQkZBX0xQU19NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX2xwc19zCSpscHM7CisJc3RydWN0IGxpc3RfaGVhZAkJKnFlLCAqcWVuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZtb2QtPmxwc19hY3RpdmVfcSkgeworCQlscHMgPSAoc3RydWN0IGJmYV9scHNfcyAqKSBxZTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobHBzLCBCRkFfTFBTX1NNX09GRkxJTkUpOworCX0KK30KKworLyoqCisgKiBGaXJtd2FyZSBsb2dpbiByZXNwb25zZQorICovCitzdGF0aWMgdm9pZAorYmZhX2xwc19sb2dpbl9yc3Aoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbHBzX2xvZ2luX3JzcF9zICpyc3ApCit7CisJc3RydWN0IGJmYV9scHNfbW9kX3MJKm1vZCA9IEJGQV9MUFNfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9scHNfcwkqbHBzOworCisJYmZhX2Fzc2VydChyc3AtPmxwX3RhZyA8IG1vZC0+bnVtX2xwcyk7CisJbHBzID0gQkZBX0xQU19GUk9NX1RBRyhtb2QsIHJzcC0+bHBfdGFnKTsKKworCWxwcy0+c3RhdHVzID0gcnNwLT5zdGF0dXM7CisJc3dpdGNoIChyc3AtPnN0YXR1cykgeworCWNhc2UgQkZBX1NUQVRVU19PSzoKKwkJbHBzLT5mcG9ydAk9IHJzcC0+Zl9wb3J0OworCQlscHMtPm5waXZfZW4JPSByc3AtPm5waXZfZW47CisJCWxwcy0+bHBfcGlkCT0gcnNwLT5scF9waWQ7CisJCWxwcy0+cHJfYmJjcmVkCT0gYmZhX29zX250b2hzKHJzcC0+YmJfY3JlZGl0KTsKKwkJbHBzLT5wcl9wd3duCT0gcnNwLT5wb3J0X25hbWU7CisJCWxwcy0+cHJfbnd3bgk9IHJzcC0+bm9kZV9uYW1lOworCQlscHMtPmF1dGhfcmVxCT0gcnNwLT5hdXRoX3JlcTsKKwkJbHBzLT5scF9tYWMJPSByc3AtPmxwX21hYzsKKwkJbHBzLT5icmNkX3N3aXRjaCA9IHJzcC0+YnJjZF9zd2l0Y2g7CisJCWxwcy0+ZmNmX21hYwk9IHJzcC0+ZmNmX21hYzsKKworCQlicmVhazsKKworCWNhc2UgQkZBX1NUQVRVU19GQUJSSUNfUkpUOgorCQlscHMtPmxzcmp0X3JzbiA9IHJzcC0+bHNyanRfcnNuOworCQlscHMtPmxzcmp0X2V4cGwgPSByc3AtPmxzcmp0X2V4cGw7CisKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9TVEFUVVNfRVBST1RPQ09MOgorCQlscHMtPmV4dF9zdGF0dXMgPSByc3AtPmV4dF9zdGF0dXM7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBOb3RoaW5nIHRvIGRvIHdpdGggb3RoZXIgc3RhdHVzICovCisJCWJyZWFrOworCX0KKworCWJmYV9zbV9zZW5kX2V2ZW50KGxwcywgQkZBX0xQU19TTV9GV1JTUCk7Cit9CisKKy8qKgorICogRmlybXdhcmUgbG9nb3V0IHJlc3BvbnNlCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfbHBzX2xvZ291dF9yc3Aoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbHBzX2xvZ291dF9yc3BfcyAqcnNwKQoreworCXN0cnVjdCBiZmFfbHBzX21vZF9zCSptb2QgPSBCRkFfTFBTX01PRChiZmEpOworCXN0cnVjdCBiZmFfbHBzX3MJKmxwczsKKworCWJmYV9hc3NlcnQocnNwLT5scF90YWcgPCBtb2QtPm51bV9scHMpOworCWxwcyA9IEJGQV9MUFNfRlJPTV9UQUcobW9kLCByc3AtPmxwX3RhZyk7CisKKwliZmFfc21fc2VuZF9ldmVudChscHMsIEJGQV9MUFNfU01fRldSU1ApOworfQorCisvKioKKyAqIFNwYWNlIGlzIGF2YWlsYWJsZSBpbiByZXF1ZXN0IHF1ZXVlLCByZXN1bWUgcXVldWVpbmcgcmVxdWVzdCB0byBmaXJtd2FyZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfcmVxcV9yZXN1bWUodm9pZCAqbHBzX2FyZykKK3sKKwlzdHJ1Y3QgYmZhX2xwc19zCSpscHMgPSBscHNfYXJnOworCisJYmZhX3NtX3NlbmRfZXZlbnQobHBzLCBCRkFfTFBTX1NNX1JFU1VNRSk7Cit9CisKKy8qKgorICogbHBzIGlzIGZyZWVkIC0tIHRyaWdnZXJlZCBieSB2cG9ydCBkZWxldGUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfZnJlZShzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJc3RydWN0IGJmYV9scHNfbW9kX3MJKm1vZCA9IEJGQV9MUFNfTU9EKGxwcy0+YmZhKTsKKworCWxpc3RfZGVsKCZscHMtPnFlKTsKKwlsaXN0X2FkZF90YWlsKCZscHMtPnFlLCAmbW9kLT5scHNfZnJlZV9xKTsKK30KKworLyoqCisgKiBzZW5kIGxvZ2luIHJlcXVlc3QgdG8gZmlybXdhcmUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfc2VuZF9sb2dpbihzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJc3RydWN0IGJmaV9scHNfbG9naW5fcmVxX3MJKm07CisKKwltID0gYmZhX3JlcXFfbmV4dChscHMtPmJmYSwgbHBzLT5yZXFxKTsKKwliZmFfYXNzZXJ0KG0pOworCisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19MUFMsIEJGSV9MUFNfSDJJX0xPR0lOX1JFUSwKKwkJCWJmYV9scHVpZChscHMtPmJmYSkpOworCisJbS0+bHBfdGFnCT0gbHBzLT5scF90YWc7CisJbS0+YWxwYQkJPSBscHMtPmFscGE7CisJbS0+cGR1X3NpemUJPSBiZmFfb3NfaHRvbnMobHBzLT5wZHVzeik7CisJbS0+cHd3bgkJPSBscHMtPnB3d247CisJbS0+bnd3bgkJPSBscHMtPm53d247CisJbS0+ZmRpc2MJPSBscHMtPmZkaXNjOworCW0tPmF1dGhfZW4JPSBscHMtPmF1dGhfZW47CisKKwliZmFfcmVxcV9wcm9kdWNlKGxwcy0+YmZhLCBscHMtPnJlcXEpOworfQorCisvKioKKyAqIHNlbmQgbG9nb3V0IHJlcXVlc3QgdG8gZmlybXdhcmUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfc2VuZF9sb2dvdXQoc3RydWN0IGJmYV9scHNfcyAqbHBzKQoreworCXN0cnVjdCBiZmlfbHBzX2xvZ291dF9yZXFfcyAqbTsKKworCW0gPSBiZmFfcmVxcV9uZXh0KGxwcy0+YmZhLCBscHMtPnJlcXEpOworCWJmYV9hc3NlcnQobSk7CisKKwliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0xQUywgQkZJX0xQU19IMklfTE9HT1VUX1JFUSwKKwkJCWJmYV9scHVpZChscHMtPmJmYSkpOworCisJbS0+bHBfdGFnICAgID0gbHBzLT5scF90YWc7CisJbS0+cG9ydF9uYW1lID0gbHBzLT5wd3duOworCWJmYV9yZXFxX3Byb2R1Y2UobHBzLT5iZmEsIGxwcy0+cmVxcSk7Cit9CisKKy8qKgorICogSW5kaXJlY3QgbG9naW4gY29tcGxldGlvbiBoYW5kbGVyIGZvciBub24tZmNzCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfbHBzX2xvZ2luX2NvbXBfY2Iodm9pZCAqYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfbHBzX3MgKmxwcwk9IGFyZzsKKworCWlmICghY29tcGxldGUpCisJCXJldHVybjsKKworCWlmIChscHMtPmZkaXNjKQorCQliZmFfY2JfbHBzX2ZkaXNjX2NvbXAobHBzLT5iZmEtPmJmYWQsIGxwcy0+dWFyZywgbHBzLT5zdGF0dXMpOworCWVsc2UKKwkJYmZhX2NiX2xwc19mbG9naV9jb21wKGxwcy0+YmZhLT5iZmFkLCBscHMtPnVhcmcsIGxwcy0+c3RhdHVzKTsKK30KKworLyoqCisgKiBMb2dpbiBjb21wbGV0aW9uIGhhbmRsZXIgLS0gZGlyZWN0IGNhbGwgZm9yIGZjcywgcXVldWUgZm9yIG90aGVycworICovCitzdGF0aWMgdm9pZAorYmZhX2xwc19sb2dpbl9jb21wKHN0cnVjdCBiZmFfbHBzX3MgKmxwcykKK3sKKwlpZiAoIWxwcy0+YmZhLT5mY3MpIHsKKwkJYmZhX2NiX3F1ZXVlKGxwcy0+YmZhLCAmbHBzLT5oY2JfcWUsCisJCQkJYmZhX2xwc19sb2dpbl9jb21wX2NiLCBscHMpOworCQlyZXR1cm47CisJfQorCisJaWYgKGxwcy0+ZmRpc2MpCisJCWJmYV9jYl9scHNfZmRpc2NfY29tcChscHMtPmJmYS0+YmZhZCwgbHBzLT51YXJnLCBscHMtPnN0YXR1cyk7CisJZWxzZQorCQliZmFfY2JfbHBzX2Zsb2dpX2NvbXAobHBzLT5iZmEtPmJmYWQsIGxwcy0+dWFyZywgbHBzLT5zdGF0dXMpOworfQorCisvKioKKyAqIEluZGlyZWN0IGxvZ291dCBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIG5vbi1mY3MKKyAqLworc3RhdGljIHZvaWQKK2JmYV9scHNfbG9nb3V0X2NvbXBfY2Iodm9pZCAqYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfbHBzX3MgKmxwcwk9IGFyZzsKKworCWlmICghY29tcGxldGUpCisJCXJldHVybjsKKworCWlmIChscHMtPmZkaXNjKQorCQliZmFfY2JfbHBzX2ZkaXNjbG9nb19jb21wKGxwcy0+YmZhLT5iZmFkLCBscHMtPnVhcmcpOworCWVsc2UKKwkJYmZhX2NiX2xwc19mbG9nb19jb21wKGxwcy0+YmZhLT5iZmFkLCBscHMtPnVhcmcpOworfQorCisvKioKKyAqIExvZ291dCBjb21wbGV0aW9uIGhhbmRsZXIgLS0gZGlyZWN0IGNhbGwgZm9yIGZjcywgcXVldWUgZm9yIG90aGVycworICovCitzdGF0aWMgdm9pZAorYmZhX2xwc19sb2dvdXRfY29tcChzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJaWYgKCFscHMtPmJmYS0+ZmNzKSB7CisJCWJmYV9jYl9xdWV1ZShscHMtPmJmYSwgJmxwcy0+aGNiX3FlLAorCQkJCWJmYV9scHNfbG9nb3V0X2NvbXBfY2IsIGxwcyk7CisJCXJldHVybjsKKwl9CisJaWYgKGxwcy0+ZmRpc2MpCisJCWJmYV9jYl9scHNfZmRpc2Nsb2dvX2NvbXAobHBzLT5iZmEtPmJmYWQsIGxwcy0+dWFyZyk7CisJZWxzZQorCQliZmFfY2JfbHBzX2Zsb2dvX2NvbXAobHBzLT5iZmEtPmJmYWQsIGxwcy0+dWFyZyk7Cit9CisKKworCisvKioKKyAqICBscHNfcHVibGljIEJGQSBMUFMgcHVibGljIGZ1bmN0aW9ucworICovCisKKy8qKgorICogQWxsb2NhdGUgYSBscG9ydCBzcnZpY2UgdGFnLgorICovCitzdHJ1Y3QgYmZhX2xwc19zICAqCitiZmFfbHBzX2FsbG9jKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfbHBzX21vZF9zCSptb2QgPSBCRkFfTFBTX01PRChiZmEpOworCXN0cnVjdCBiZmFfbHBzX3MJKmxwcyA9IE5VTEw7CisKKwliZmFfcV9kZXEoJm1vZC0+bHBzX2ZyZWVfcSwgJmxwcyk7CisKKwlpZiAobHBzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbGlzdF9hZGRfdGFpbCgmbHBzLT5xZSwgJm1vZC0+bHBzX2FjdGl2ZV9xKTsKKworCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2luaXQpOworCXJldHVybiBscHM7Cit9CisKKy8qKgorICogRnJlZSBscG9ydCBzZXJ2aWNlIHRhZy4gVGhpcyBjYW4gYmUgY2FsbGVkIGFueXRpbWUgYWZ0ZXIgYW4gYWxsb2MuCisgKiBObyBuZWVkIHRvIHdhaXQgZm9yIGFueSBwZW5kaW5nIGxvZ2luL2xvZ291dCBjb21wbGV0aW9ucy4KKyAqLwordm9pZAorYmZhX2xwc19kZWxldGUoc3RydWN0IGJmYV9scHNfcyAqbHBzKQoreworCWJmYV9zbV9zZW5kX2V2ZW50KGxwcywgQkZBX0xQU19TTV9ERUxFVEUpOworfQorCisvKioKKyAqIEluaXRpYXRlIGEgbHBvcnQgbG9naW4uCisgKi8KK3ZvaWQKK2JmYV9scHNfZmxvZ2koc3RydWN0IGJmYV9scHNfcyAqbHBzLCB2b2lkICp1YXJnLCB1OCBhbHBhLCB1MTYgcGR1c3osCisJd3duX3QgcHd3biwgd3duX3Qgbnd3biwgYmZhX2Jvb2xlYW5fdCBhdXRoX2VuKQoreworCWxwcy0+dWFyZwk9IHVhcmc7CisJbHBzLT5hbHBhCT0gYWxwYTsKKwlscHMtPnBkdXN6CT0gcGR1c3o7CisJbHBzLT5wd3duCT0gcHd3bjsKKwlscHMtPm53d24JPSBud3duOworCWxwcy0+ZmRpc2MJPSBCRkFfRkFMU0U7CisJbHBzLT5hdXRoX2VuCT0gYXV0aF9lbjsKKwliZmFfc21fc2VuZF9ldmVudChscHMsIEJGQV9MUFNfU01fTE9HSU4pOworfQorCisvKioKKyAqIEluaXRpYXRlIGEgbHBvcnQgZmRpc2MgbG9naW4uCisgKi8KK3ZvaWQKK2JmYV9scHNfZmRpc2Moc3RydWN0IGJmYV9scHNfcyAqbHBzLCB2b2lkICp1YXJnLCB1MTYgcGR1c3osIHd3bl90IHB3d24sCisJd3duX3Qgbnd3bikKK3sKKwlscHMtPnVhcmcJPSB1YXJnOworCWxwcy0+YWxwYQk9IDA7CisJbHBzLT5wZHVzegk9IHBkdXN6OworCWxwcy0+cHd3bgk9IHB3d247CisJbHBzLT5ud3duCT0gbnd3bjsKKwlscHMtPmZkaXNjCT0gQkZBX1RSVUU7CisJbHBzLT5hdXRoX2VuCT0gQkZBX0ZBTFNFOworCWJmYV9zbV9zZW5kX2V2ZW50KGxwcywgQkZBX0xQU19TTV9MT0dJTik7Cit9CisKKy8qKgorICogSW5pdGlhdGUgYSBscG9ydCBsb2dvdXQgKGZsb2dpKS4KKyAqLwordm9pZAorYmZhX2xwc19mbG9nbyhzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQobHBzLCBCRkFfTFBTX1NNX0xPR09VVCk7Cit9CisKKy8qKgorICogSW5pdGlhdGUgYSBscG9ydCBGRFNJQyBsb2dvdXQuCisgKi8KK3ZvaWQKK2JmYV9scHNfZmRpc2Nsb2dvKHN0cnVjdCBiZmFfbHBzX3MgKmxwcykKK3sKKwliZmFfc21fc2VuZF9ldmVudChscHMsIEJGQV9MUFNfU01fTE9HT1VUKTsKK30KKworLyoqCisgKiBEaXNjYXJkIGEgcGVuZGluZyBsb2dpbiByZXF1ZXN0IC0tIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3IKKyAqIGxpbmsgZG93biBoYW5kbGluZy4KKyAqLwordm9pZAorYmZhX2xwc19kaXNjYXJkKHN0cnVjdCBiZmFfbHBzX3MgKmxwcykKK3sKKwliZmFfc21fc2VuZF9ldmVudChscHMsIEJGQV9MUFNfU01fT0ZGTElORSk7Cit9CisKKy8qKgorICogUmV0dXJuIGxwb3J0IHNlcnZpY2VzIHRhZworICovCit1OAorYmZhX2xwc19nZXRfdGFnKHN0cnVjdCBiZmFfbHBzX3MgKmxwcykKK3sKKwlyZXR1cm4gbHBzLT5scF90YWc7Cit9CisKKy8qKgorICogUmV0dXJuIGxwb3J0IHNlcnZpY2VzIHRhZyBnaXZlbiB0aGUgcGlkCisgKi8KK3U4CitiZmFfbHBzX2dldF90YWdfZnJvbV9waWQoc3RydWN0IGJmYV9zICpiZmEsIHUzMiBwaWQpCit7CisJc3RydWN0IGJmYV9scHNfbW9kX3MJKm1vZCA9IEJGQV9MUFNfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9scHNfcwkqbHBzOworCWludAkJCWk7CisKKwlmb3IgKGkgPSAwLCBscHMgPSBtb2QtPmxwc19hcnI7IGkgPCBtb2QtPm51bV9scHM7IGkrKywgbHBzKyspIHsKKwkJaWYgKGxwcy0+bHBfcGlkID09IHBpZCkKKwkJCXJldHVybiBscHMtPmxwX3RhZzsKKwl9CisKKwkvKiBSZXR1cm4gYmFzZSBwb3J0IHRhZyBhbnl3YXkgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiByZXR1cm4gaWYgZmFicmljIGxvZ2luIGluZGljYXRlcyBzdXBwb3J0IGZvciBOUElWCisgKi8KK2JmYV9ib29sZWFuX3QKK2JmYV9scHNfaXNfbnBpdl9lbihzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJcmV0dXJuIGxwcy0+bnBpdl9lbjsKK30KKworLyoqCisgKiBSZXR1cm4gVFJVRSBpZiBhdHRhY2hlZCB0byBGLVBvcnQsIGVsc2UgcmV0dXJuIEZBTFNFCisgKi8KK2JmYV9ib29sZWFuX3QKK2JmYV9scHNfaXNfZnBvcnQoc3RydWN0IGJmYV9scHNfcyAqbHBzKQoreworCXJldHVybiBscHMtPmZwb3J0OworfQorCisvKioKKyAqIFJldHVybiBUUlVFIGlmIGF0dGFjaGVkIHRvIGEgQnJvY2FkZSBGYWJyaWMKKyAqLworYmZhX2Jvb2xlYW5fdAorYmZhX2xwc19pc19icmNkX2ZhYnJpYyhzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJcmV0dXJuIGxwcy0+YnJjZF9zd2l0Y2g7Cit9CisvKioKKyAqIHJldHVybiBUUlVFIGlmIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkCisgKi8KK2JmYV9ib29sZWFuX3QKK2JmYV9scHNfaXNfYXV0aHJlcShzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJcmV0dXJuIGxwcy0+YXV0aF9yZXE7Cit9CisKK2JmYV9lcHJvdG9fc3RhdHVzX3QKK2JmYV9scHNfZ2V0X2V4dHN0YXR1cyhzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJcmV0dXJuIGxwcy0+ZXh0X3N0YXR1czsKK30KKworLyoqCisgKiByZXR1cm4gcG9ydCBpZCBhc3NpZ25lZCB0byB0aGUgbHBvcnQKKyAqLwordTMyCitiZmFfbHBzX2dldF9waWQoc3RydWN0IGJmYV9scHNfcyAqbHBzKQoreworCXJldHVybiBscHMtPmxwX3BpZDsKK30KKworLyoqCisgKiBSZXR1cm4gYmJfY3JlZGl0IGFzc2lnbmVkIGluIEZMT0dJIHJlc3BvbnNlCisgKi8KK3UxNgorYmZhX2xwc19nZXRfcGVlcl9iYmNyZWRpdChzdHJ1Y3QgYmZhX2xwc19zICpscHMpCit7CisJcmV0dXJuIGxwcy0+cHJfYmJjcmVkOworfQorCisvKioKKyAqIFJldHVybiBwZWVyIHBvcnQgbmFtZQorICovCit3d25fdAorYmZhX2xwc19nZXRfcGVlcl9wd3duKHN0cnVjdCBiZmFfbHBzX3MgKmxwcykKK3sKKwlyZXR1cm4gbHBzLT5wcl9wd3duOworfQorCisvKioKKyAqIFJldHVybiBwZWVyIG5vZGUgbmFtZQorICovCit3d25fdAorYmZhX2xwc19nZXRfcGVlcl9ud3duKHN0cnVjdCBiZmFfbHBzX3MgKmxwcykKK3sKKwlyZXR1cm4gbHBzLT5wcl9ud3duOworfQorCisvKioKKyAqIHJldHVybiByZWFzb24gY29kZSBpZiBsb2dpbiByZXF1ZXN0IGlzIHJlamVjdGVkCisgKi8KK3U4CitiZmFfbHBzX2dldF9sc3JqdF9yc24oc3RydWN0IGJmYV9scHNfcyAqbHBzKQoreworCXJldHVybiBscHMtPmxzcmp0X3JzbjsKK30KKworLyoqCisgKiByZXR1cm4gZXhwbGFuYXRpb24gY29kZSBpZiBsb2dpbiByZXF1ZXN0IGlzIHJlamVjdGVkCisgKi8KK3U4CitiZmFfbHBzX2dldF9sc3JqdF9leHBsKHN0cnVjdCBiZmFfbHBzX3MgKmxwcykKK3sKKwlyZXR1cm4gbHBzLT5sc3JqdF9leHBsOworfQorCisKKy8qKgorICogTFBTIGZpcm13YXJlIG1lc3NhZ2UgY2xhc3MgaGFuZGxlci4KKyAqLwordm9pZAorYmZhX2xwc19pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm0pCit7CisJdW5pb24gYmZpX2xwc19pMmhfbXNnX3UJbXNnOworCisJYmZhX3RyYyhiZmEsIG0tPm1oZHIubXNnX2lkKTsKKwltc2cubXNnID0gbTsKKworCXN3aXRjaCAobS0+bWhkci5tc2dfaWQpIHsKKwljYXNlIEJGSV9MUFNfSDJJX0xPR0lOX1JTUDoKKwkJYmZhX2xwc19sb2dpbl9yc3AoYmZhLCBtc2cubG9naW5fcnNwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9MUFNfSDJJX0xPR09VVF9SU1A6CisJCWJmYV9scHNfbG9nb3V0X3JzcChiZmEsIG1zZy5sb2dvdXRfcnNwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfdHJjKGJmYSwgbS0+bWhkci5tc2dfaWQpOworCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9scHNfcHJpdi5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbHBzX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTZjNmNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbHBzX3ByaXYuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfTFBTX1BSSVZfSF9fCisjZGVmaW5lIF9fQkZBX0xQU19QUklWX0hfXworCisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorCitzdHJ1Y3QgYmZhX2xwc19tb2RfcyB7CisJc3RydWN0IGxpc3RfaGVhZAkJbHBzX2ZyZWVfcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlscHNfYWN0aXZlX3E7CisJc3RydWN0IGJmYV9scHNfcwkqbHBzX2FycjsKKwlpbnQJCQludW1fbHBzOworfTsKKworI2RlZmluZSBCRkFfTFBTX01PRChfX2JmYSkJCSgmKF9fYmZhKS0+bW9kdWxlcy5scHNfbW9kKQorI2RlZmluZSBCRkFfTFBTX0ZST01fVEFHKF9fbW9kLCBfX3RhZykJKCYoX19tb2QpLT5scHNfYXJyW19fdGFnXSkKKworLyoKKyAqIGV4dGVybmFsIGZ1bmN0aW9ucworICovCit2b2lkCWJmYV9scHNfaXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptc2cpOworCisjZW5kaWYgLyogX19CRkFfTFBTX1BSSVZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9tb2R1bGUuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWRhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9tb2R1bGUuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19wY2kuaD4KKyNpbmNsdWRlIDxjcy9iZmFfZGVidWcuaD4KKyNpbmNsdWRlIDxiZmFfaW9jZmMuaD4KKworLyoqCisgKiBCRkEgbW9kdWxlIGxpc3QgdGVybWluYXRlZCBieSBOVUxMCisgKi8KK3N0cnVjdCBiZmFfbW9kdWxlX3MgKmhhbF9tb2RzW10gPSB7CisJJmhhbF9tb2Rfc2dwZywKKwkmaGFsX21vZF9wcG9ydCwKKwkmaGFsX21vZF9mY3hwLAorCSZoYWxfbW9kX2xwcywKKwkmaGFsX21vZF91ZiwKKwkmaGFsX21vZF9ycG9ydCwKKwkmaGFsX21vZF9mY3BpbSwKKyNpZmRlZiBCRkFfQ0ZHX1BCSU5ECisJJmhhbF9tb2RfcGJpbmQsCisjZW5kaWYKKwlOVUxMCit9OworCisvKioKKyAqIE1lc3NhZ2UgaGFuZGxlcnMgZm9yIHZhcmlvdXMgbW9kdWxlcy4KKyAqLworYmZhX2lzcl9mdW5jX3QgIGJmYV9pc3JzW0JGSV9NQ19NQVhdID0geworCWJmYV9pc3JfdW5oYW5kbGVkLAkvKiBOT05FICovCisJYmZhX2lzcl91bmhhbmRsZWQsCS8qIEJGSV9NQ19JT0MgKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0RJQUcgKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0ZMQVNIICovCisJYmZhX2lzcl91bmhhbmRsZWQsCS8qIEJGSV9NQ19DRUUgKi8KKwliZmFfcHBvcnRfaXNyLAkJLyogQkZJX01DX1BPUlQgKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0lPQ0ZDICovCisJYmZhX2lzcl91bmhhbmRsZWQsCS8qIEJGSV9NQ19MTCAqLworCWJmYV91Zl9pc3IsCQkvKiBCRklfTUNfVUYgKi8KKwliZmFfZmN4cF9pc3IsCQkvKiBCRklfTUNfRkNYUCAqLworCWJmYV9scHNfaXNyLAkJLyogQkZJX01DX0xQUyAqLworCWJmYV9ycG9ydF9pc3IsCQkvKiBCRklfTUNfUlBPUlQgKi8KKwliZmFfaXRuaW1faXNyLAkJLyogQkZJX01DX0lUTklNICovCisJYmZhX2lzcl91bmhhbmRsZWQsCS8qIEJGSV9NQ19JT0lNX1JFQUQgKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0lPSU1fV1JJVEUgKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0lPSU1fSU8gKi8KKwliZmFfaW9pbV9pc3IsCQkvKiBCRklfTUNfSU9JTSAqLworCWJmYV9pb2ltX2dvb2RfY29tcF9pc3IsCS8qIEJGSV9NQ19JT0lNX0lPQ09NICovCisJYmZhX3Rza2ltX2lzciwJCS8qIEJGSV9NQ19UU0tJTSAqLworCWJmYV9pc3JfdW5oYW5kbGVkLAkvKiBCRklfTUNfU0JPT1QgKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0lQRkMgKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX1BPUlQgKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogLS0tLS0tLS0tICovCisJYmZhX2lzcl91bmhhbmRsZWQsCS8qIC0tLS0tLS0tLSAqLworCWJmYV9pc3JfdW5oYW5kbGVkLAkvKiAtLS0tLS0tLS0gKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogLS0tLS0tLS0tICovCisJYmZhX2lzcl91bmhhbmRsZWQsCS8qIC0tLS0tLS0tLSAqLworCWJmYV9pc3JfdW5oYW5kbGVkLAkvKiAtLS0tLS0tLS0gKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogLS0tLS0tLS0tICovCisJYmZhX2lzcl91bmhhbmRsZWQsCS8qIC0tLS0tLS0tLSAqLworCWJmYV9pc3JfdW5oYW5kbGVkLAkvKiAtLS0tLS0tLS0gKi8KKwliZmFfaXNyX3VuaGFuZGxlZCwJLyogLS0tLS0tLS0tICovCit9OworCisvKioKKyAqIE1lc3NhZ2UgaGFuZGxlcnMgZm9yIG1haWxib3ggY29tbWFuZCBjbGFzc2VzCisgKi8KK2JmYV9pb2NfbWJveF9tY2Z1bmNfdCAgYmZhX21ib3hfaXNyc1tCRklfTUNfTUFYXSA9IHsKKwlOVUxMLAorCU5VTEwsCQkJLyogQkZJX01DX0lPQwkqLworCU5VTEwsCQkJLyogQkZJX01DX0RJQUcJKi8KKwlOVUxMLAkJLyogQkZJX01DX0ZMQVNIICovCisJTlVMTCwJCQkvKiBCRklfTUNfQ0VFCSovCisJTlVMTCwJCQkvKiBCRklfTUNfUE9SVAkqLworCWJmYV9pb2NmY19pc3IsCQkvKiBCRklfTUNfSU9DRkMgKi8KKwlOVUxMLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfbW9kdWxlc19wcml2LmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9tb2R1bGVzX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY3MDUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbW9kdWxlc19wcml2LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX01PRFVMRVNfUFJJVl9IX18KKyNkZWZpbmUgX19CRkFfTU9EVUxFU19QUklWX0hfXworCisjaW5jbHVkZSAiYmZhX3VmX3ByaXYuaCIKKyNpbmNsdWRlICJiZmFfcG9ydF9wcml2LmgiCisjaW5jbHVkZSAiYmZhX3Jwb3J0X3ByaXYuaCIKKyNpbmNsdWRlICJiZmFfZmN4cF9wcml2LmgiCisjaW5jbHVkZSAiYmZhX2xwc19wcml2LmgiCisjaW5jbHVkZSAiYmZhX2ZjcGltX3ByaXYuaCIKKyNpbmNsdWRlIDxjZWUvYmZhX2NlZS5oPgorI2luY2x1ZGUgPHBvcnQvYmZhX3BvcnQuaD4KKworCitzdHJ1Y3QgYmZhX21vZHVsZXNfcyB7CisJc3RydWN0IGJmYV9wcG9ydF9zCXBwb3J0OwkvKiAgcGh5c2ljYWwgcG9ydCBtb2R1bGUJKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MgZmN4cF9tb2Q7IC8qICBmY3hwIG1vZHVsZQkJKi8KKwlzdHJ1Y3QgYmZhX2xwc19tb2RfcyBscHNfbW9kOyAgIC8qICBmY3hwIG1vZHVsZQkJKi8KKwlzdHJ1Y3QgYmZhX3VmX21vZF9zIHVmX21vZDsJLyogIHVuc29saWNpdGVkIGZyYW1lIG1vZHVsZQkqLworCXN0cnVjdCBiZmFfcnBvcnRfbW9kX3MgcnBvcnRfbW9kOyAvKiAgcmVtb3RlIHBvcnQgbW9kdWxlCSovCisJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyBmY3BpbV9tb2Q7IC8qICBGQ1AgaW5pdGlhdG9yIG1vZHVsZQkqLworCXN0cnVjdCBiZmFfc2dwZ19tb2RfcyBzZ3BnX21vZDsgLyogIFNHIHBhZ2UgbW9kdWxlCQkqLworCXN0cnVjdCBiZmFfY2VlX3MgY2VlOyAgIAkvKiAgQ0VFIE1vZHVsZSAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgYmZhX3BvcnRfcyBwb3J0OwkJLyogIFBoeXNpY2FsIHBvcnQgbW9kdWxlCSovCit9OworCisjZW5kaWYgLyogX19CRkFfTU9EVUxFU19QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfb3NfaW5jLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9vc19pbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGE4OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfb3NfaW5jLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiBDb250YWlucyBkZWNsYXJhdGlvbnMgYWxsIE9TIFNwZWNpZmljIGZpbGVzIG5lZWRlZCBmb3IgQkZBIGxheWVyCisgKi8KKworI2lmbmRlZiBfX0JGQV9PU19JTkNfSF9fCisjZGVmaW5lIF9fQkZBX09TX0lOQ19IX18KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2RlZmluZSBTRVRfTU9EVUxFX1ZFUlNJT04oVkVSKQorCisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgorCisjZGVmaW5lIEJGQV9FUlIJCQlLRVJOX0VSUgorI2RlZmluZSBCRkFfV0FSTklORwkJS0VSTl9XQVJOSU5HCisjZGVmaW5lIEJGQV9OT1RJQ0UJCUtFUk5fTk9USUNFCisjZGVmaW5lIEJGQV9JTkZPCQlLRVJOX0lORk8KKyNkZWZpbmUgQkZBX0RFQlVHCQlLRVJOX0RFQlVHCisKKyNkZWZpbmUgTE9HX0JGQURfSU5JVAkJMHgwMDAwMDAwMQorI2RlZmluZSBMT0dfRkNQX0lPCQkweDAwMDAwMDAyCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBCRkFfTE9HX1RSQUNFKGJmYWQsIGxldmVsLCBtYXNrLCBmbXQsIGFyZy4uLikJCQlcCisJCUJGQV9MT0coYmZhZCwgbGV2ZWwsIG1hc2ssIGZtdCwgIyMgYXJnKQorI2RlZmluZSBCRkFfREVWX1RSQUNFKGJmYWQsIGxldmVsLCBmbXQsIGFyZy4uLikJCQkJXAorCQlCRkFfREVWX1BSSU5URihiZmFkLCBsZXZlbCwgZm10LCAjIyBhcmcpCisjZGVmaW5lIEJGQV9UUkFDRShsZXZlbCwgZm10LCBhcmcuLi4pCQkJCQlcCisJCUJGQV9QUklOVEYobGV2ZWwsIGZtdCwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgQkZBX0xPR19UUkFDRShiZmFkLCBsZXZlbCwgbWFzaywgZm10LCBhcmcuLi4pCisjZGVmaW5lIEJGQV9ERVZfVFJBQ0UoYmZhZCwgbGV2ZWwsIGZtdCwgYXJnLi4uKQorI2RlZmluZSBCRkFfVFJBQ0UobGV2ZWwsIGZtdCwgYXJnLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgQkZBX0FTU0VSVChwKSBkbyB7CQkJCQkJXAorCWlmICghKHApKSB7ICAgICAgXAorCQlwcmludGsoS0VSTl9FUlIgImFzc2VydCglcykgZmFpbGVkIGF0ICVzOiVkXG4iLAkJXAorCQkjcCwgX19GSUxFX18sIF9fTElORV9fKTsgICAgICBcCisJCUJVRygpOyAgICAgIFwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgQkZBX0xPRyhiZmFkLCBsZXZlbCwgbWFzaywgZm10LCBhcmcuLi4pCQkJCVwKK2RvIHsgCQkJCQkJCQkJXAorCWlmICgoKG1hc2spICYgKCgoc3RydWN0IGJmYWRfcyAqKShiZmFkKSktPgkJCVwKKwkJY2ZnX2RhdGFbY2ZnX2xvZ19tYXNrXSkpIHx8IChsZXZlbFsxXSA8PSAnMycpKQkJXAorCQlkZXZfcHJpbnRrKGxldmVsLCAmKCgoc3RydWN0IGJmYWRfcyAqKQkJCVwKKwkJCShiZmFkKSktPnBjaWRldi0+ZGV2KSwgZm10LCAjI2FyZyk7ICAgICAgXAorfSB3aGlsZSAoMCkKKworI2lmbmRlZiBCRkFfREVWX1BSSU5URgorI2RlZmluZSBCRkFfREVWX1BSSU5URihiZmFkLCBsZXZlbCwgZm10LCBhcmcuLi4pCQkJXAorCQlkZXZfcHJpbnRrKGxldmVsLCAmKCgoc3RydWN0IGJmYWRfcyAqKQkJCVwKKwkJCShiZmFkKSktPnBjaWRldi0+ZGV2KSwgZm10LCAjI2FyZyk7CisjZW5kaWYKKworI2RlZmluZSBCRkFfUFJJTlRGKGxldmVsLCBmbXQsIGFyZy4uLikJCQkJCVwKKwkJcHJpbnRrKGxldmVsIGZtdCwgIyNhcmcpOworCitpbnQgYmZhX29zX01XQih2b2lkICopOworCisjZGVmaW5lIGJmYV9vc19tbWlvd2IoKQkJbW1pb3diKCkKKworI2RlZmluZSBiZmFfc3dhcF8zYihfeCkJCQkJXAorCSgoKChfeCkgJiAweGZmKSA8PCAxNikgfAkJXAorCSgoX3gpICYgMHgwMGZmMDApIHwJCQlcCisJKCgoX3gpICYgMHhmZjAwMDApID4+IDE2KSkKKworI2RlZmluZSBiZmFfc3dhcF84YihfeCkgCQkJCVwKKyAgICAgKCgoKF94KSAmIDB4ZmYwMDAwMDAwMDAwMDAwMHVsbCkgPj4gNTYpCQlcCisgICAgICB8ICgoKF94KSAmIDB4MDBmZjAwMDAwMDAwMDAwMHVsbCkgPj4gNDApCQlcCisgICAgICB8ICgoKF94KSAmIDB4MDAwMGZmMDAwMDAwMDAwMHVsbCkgPj4gMjQpCQlcCisgICAgICB8ICgoKF94KSAmIDB4MDAwMDAwZmYwMDAwMDAwMHVsbCkgPj4gOCkJCVwKKyAgICAgIHwgKCgoX3gpICYgMHgwMDAwMDAwMGZmMDAwMDAwdWxsKSA8PCA4KQkJXAorICAgICAgfCAoKChfeCkgJiAweDAwMDAwMDAwMDBmZjAwMDB1bGwpIDw8IDI0KQkJXAorICAgICAgfCAoKChfeCkgJiAweDAwMDAwMDAwMDAwMGZmMDB1bGwpIDw8IDQwKQkJXAorICAgICAgfCAoKChfeCkgJiAweDAwMDAwMDAwMDAwMDAwZmZ1bGwpIDw8IDU2KSkKKworI2RlZmluZSBiZmFfb3Nfc3dhcDMyKF94KSAJCQlcCisJKCgoKF94KSAmIDB4ZmYpIDw8IDI0KSAJCXwJXAorCSgoKF94KSAmIDB4MDAwMGZmMDApIDw8IDgpCXwJXAorCSgoKF94KSAmIDB4MDBmZjAwMDApID4+IDgpCXwJXAorCSgoKF94KSAmIDB4ZmYwMDAwMDApID4+IDI0KSkKKworCisjaWZuZGVmIF9fQklHRU5ESUFOCisjZGVmaW5lIGJmYV9vc19odG9ucyhfeCkgKCh1MTYpKCgoKF94KSAmIDB4ZmYwMCkgPj4gOCkgfCBcCisJCQkJICgoKF94KSAmIDB4MDBmZikgPDwgOCkpKQorCisjZGVmaW5lIGJmYV9vc19odG9ubChfeCkJYmZhX29zX3N3YXAzMihfeCkKKyNkZWZpbmUgYmZhX29zX2h0b25sbChfeCkJYmZhX3N3YXBfOGIoX3gpCisjZGVmaW5lIGJmYV9vc19odG9uM2IoX3gpCWJmYV9zd2FwXzNiKF94KQorCisjZGVmaW5lIGJmYV9vc193dG9sZShfeCkgICAoX3gpCisKKyNlbHNlCisKKyNkZWZpbmUgYmZhX29zX2h0b25zKF94KSAgIChfeCkKKyNkZWZpbmUgYmZhX29zX2h0b25sKF94KSAgIChfeCkKKyNkZWZpbmUgYmZhX29zX2h0b24zYihfeCkgIChfeCkKKyNkZWZpbmUgYmZhX29zX2h0b25sbChfeCkgIChfeCkKKyNkZWZpbmUgYmZhX29zX3d0b2xlKF94KSAgIGJmYV9vc19zd2FwMzIoX3gpCisKKyNlbmRpZgorCisjZGVmaW5lIGJmYV9vc19udG9ocyhfeCkgICBiZmFfb3NfaHRvbnMoX3gpCisjZGVmaW5lIGJmYV9vc19udG9obChfeCkgICBiZmFfb3NfaHRvbmwoX3gpCisjZGVmaW5lIGJmYV9vc19udG9obGwoX3gpICBiZmFfb3NfaHRvbmxsKF94KQorI2RlZmluZSBiZmFfb3NfbnRvaDNiKF94KSAgYmZhX29zX2h0b24zYihfeCkKKworI2RlZmluZSBiZmFfb3NfdTMyKF9fcGE2NCkgKChfX3BhNjQpID4+IDMyKQorCisjZGVmaW5lIGJmYV9vc19tZW1zZXQJbWVtc2V0CisjZGVmaW5lIGJmYV9vc19tZW1jcHkJbWVtY3B5CisjZGVmaW5lIGJmYV9vc191ZGVsYXkJdWRlbGF5CisjZGVmaW5lIGJmYV9vc192c3ByaW50ZiB2c3ByaW50ZgorCisjZGVmaW5lIGJmYV9vc19hc3NpZ24oX190LCBfX3MpIF9fdCA9IF9fcworCisjZGVmaW5lIGJmYV9vc19hZGRyX3QgY2hhciBfX2lvbWVtICoKKyNkZWZpbmUgYmZhX29zX3BhbmljKCkKKworI2RlZmluZSBiZmFfb3NfcmVnX3JlYWQoX3JhZGRyKSBiZmFfb3Nfd3RvbGUocmVhZGwoX3JhZGRyKSkKKyNkZWZpbmUgYmZhX29zX3JlZ193cml0ZShfcmFkZHIsIF92YWwpIHdyaXRlbChiZmFfb3Nfd3RvbGUoKF92YWwpKSwgKF9yYWRkcikpCisjZGVmaW5lIGJmYV9vc19tZW1fcmVhZChfcmFkZHIsIF9vZmYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJYmZhX29zX250b2hsKHJlYWRsKCgoX3JhZGRyKSArIChfb2ZmKSkpKQorI2RlZmluZSBiZmFfb3NfbWVtX3dyaXRlKF9yYWRkciwgX29mZiwgX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXdyaXRlbChiZmFfb3NfaHRvbmwoKF92YWwpKSwgKChfcmFkZHIpICsgKF9vZmYpKSkKKworI2RlZmluZSBCRkFfVFJDX1RTKF90cmNtKQkJCQkJCVwKKwkJCSh7CQkJCQkJXAorCQkJCXN0cnVjdCB0aW1ldmFsIHR2OwkJCVwKKwkJCQkJCQkJCVwKKwkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsgICAgICBcCisJCQkJKHR2LnR2X3NlYyoxMDAwMDAwK3R2LnR2X3VzZWMpOyAgICAgIFwKKwkJCSB9KQorCitzdHJ1Y3QgYmZhX2xvZ19tb2RfczsKK3ZvaWQgYmZhX29zX3ByaW50ZihzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nX21vZCwgdTMyIG1zZ19pZCwKKwkJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNlbmRpZgorCisjZGVmaW5lIGJvb2xlYW5fdCBpbnQKKworLyoqCisgKiBGb3IgY3VycmVudCB0aW1lIHN0YW1wLCBPUyBBUEkgd2lsbCBmaWxsLWluCisgKi8KK3N0cnVjdCBiZmFfdGltZXZhbF9zIHsKKwl1MzIJdHZfc2VjOwkJLyogIHNlY29uZHMgICAgICAgICovCisJdTMyCXR2X3VzZWM7CS8qICBtaWNyb3NlY29uZHMgICAqLworfTsKKwordm9pZCBiZmFfb3NfZ2V0dGltZW9mZGF5KHN0cnVjdCBiZmFfdGltZXZhbF9zICp0dik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3duMnN0cihjaGFyICp3d25fc3RyLCB1NjQgd3duKQoreworCXVuaW9uIHsKKwkJdTY0IHd3bjsKKwkJdTggYnl0ZVs4XTsKKwl9IHc7CisKKwl3Lnd3biA9IHd3bjsKKwlzcHJpbnRmKHd3bl9zdHIsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCB3LmJ5dGVbMF0sCisJCXcuYnl0ZVsxXSwgdy5ieXRlWzJdLCB3LmJ5dGVbM10sIHcuYnl0ZVs0XSwgdy5ieXRlWzVdLAorCQl3LmJ5dGVbNl0sIHcuYnl0ZVs3XSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZmNpZDJzdHIoY2hhciAqZmNpZF9zdHIsIHUzMiBmY2lkKQoreworCXVuaW9uIHsKKwkJdTMyIGZjaWQ7CisJCXU4IGJ5dGVbNF07CisJfSBmOworCisJZi5mY2lkID0gZmNpZDsKKwlzcHJpbnRmKGZjaWRfc3RyLCAiJTAyeDolMDJ4OiUwMngiLCBmLmJ5dGVbMV0sIGYuYnl0ZVsyXSwgZi5ieXRlWzNdKTsKK30KKworI2VuZGlmIC8qIF9fQkZBX09TX0lOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWIxOTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydC5jCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BvcnQuaD4KKyNpbmNsdWRlIDxjcy9iZmFfdHJjLmg+CisjaW5jbHVkZSA8Y3MvYmZhX2xvZy5oPgorI2luY2x1ZGUgPGNzL2JmYV9kZWJ1Zy5oPgorI2luY2x1ZGUgPHBvcnQvYmZhX3BvcnQuaD4KKyNpbmNsdWRlIDxiZmkvYmZpLmg+CisjaW5jbHVkZSA8YmZpL2JmaV9wb3J0Lmg+CisjaW5jbHVkZSA8YmZhX2lvYy5oPgorI2luY2x1ZGUgPGNuYS9iZmFfY25hX3RyY21vZC5oPgorCitCRkFfVFJDX0ZJTEUoQ05BLCBQT1JUKTsKKworI2RlZmluZSBiZmFfaW9jX3BvcnRpZChfX2lvYykgKChfX2lvYyktPnBvcnRfaWQpCisjZGVmaW5lIGJmYV9scHVpZChfX2FyZykgYmZhX2lvY19wb3J0aWQoJihfX2FyZyktPmlvYykKKworc3RhdGljIHZvaWQKK2JmYV9wb3J0X3N0YXRzX3N3YXAoc3RydWN0IGJmYV9wb3J0X3MgKnBvcnQsIHVuaW9uIGJmYV9wcG9ydF9zdGF0c191ICpzdGF0cykKK3sKKwl1MzIgICAgICAgKmRpcCA9ICh1MzIgKikgc3RhdHM7CisJdTMyICAgICAgICB0MCwgdDE7CisJaW50ICAgICAgICAgICAgIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVuaW9uIGJmYV9wcG9ydF9zdGF0c191KSAvIHNpemVvZih1MzIpOworCSAgICAgaSArPSAyKSB7CisJCXQwID0gZGlwW2ldOworCQl0MSA9IGRpcFtpICsgMV07CisjaWZkZWYgX19CSUdFTkRJQU4KKwkJZGlwW2ldID0gYmZhX29zX250b2hsKHQwKTsKKwkJZGlwW2kgKyAxXSA9IGJmYV9vc19udG9obCh0MSk7CisjZWxzZQorCQlkaXBbaV0gPSBiZmFfb3NfbnRvaGwodDEpOworCQlkaXBbaSArIDFdID0gYmZhX29zX250b2hsKHQwKTsKKyNlbmRpZgorCX0KKworICAgIC8qKiB0b2RvCisgICAgICogUW9TIHN0YXRzIHIgYWxzbyBzd2FwcGVkIGFzIDY0Yml0OyB0aGF0IHN0cnVjdHVyZSBhbHNvCisgICAgICogaGFzIHRvIHVzZSA2NCBiaXQgY291bnRlcnMKKyAgICAgKi8KK30KKworLyoqCisgKiBiZmFfcG9ydF9lbmFibGVfaXNyKCkKKyAqCisgKgorICogQHBhcmFtW2luXSBwb3J0IC0gUG9pbnRlciB0byB0aGUgcG9ydCBtb2R1bGUKKyAqICAgICAgICAgICAgc3RhdHVzIC0gUmV0dXJuIHN0YXR1cyBmcm9tIHRoZSBmL3cKKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9wb3J0X2VuYWJsZV9pc3Ioc3RydWN0IGJmYV9wb3J0X3MgKnBvcnQsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJYmZhX2Fzc2VydCgwKTsKK30KKworLyoqCisgKiBiZmFfcG9ydF9kaXNhYmxlX2lzcigpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gcG9ydCAtIFBvaW50ZXIgdG8gdGhlIHBvcnQgbW9kdWxlCisgKiAgICAgICAgICAgIHN0YXR1cyAtIFJldHVybiBzdGF0dXMgZnJvbSB0aGUgZi93CisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcG9ydF9kaXNhYmxlX2lzcihzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwgYmZhX3N0YXR1c190IHN0YXR1cykKK3sKKwliZmFfYXNzZXJ0KDApOworfQorCisvKioKKyAqIGJmYV9wb3J0X2dldF9zdGF0c19pc3IoKQorICoKKyAqCisgKiBAcGFyYW1baW5dIHBvcnQgLSBQb2ludGVyIHRvIHRoZSBQb3J0IG1vZHVsZQorICogICAgICAgICAgICBzdGF0dXMgLSBSZXR1cm4gc3RhdHVzIGZyb20gdGhlIGYvdworICoKKyAqIEByZXR1cm4gdm9pZAorICovCitzdGF0aWMgdm9pZAorYmZhX3BvcnRfZ2V0X3N0YXRzX2lzcihzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwgYmZhX3N0YXR1c190IHN0YXR1cykKK3sKKwlwb3J0LT5zdGF0c19zdGF0dXMgPSBzdGF0dXM7CisJcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9GQUxTRTsKKworCWlmIChzdGF0dXMgPT0gQkZBX1NUQVRVU19PSykgeworCQltZW1jcHkocG9ydC0+c3RhdHMsIHBvcnQtPnN0YXRzX2RtYS5rdmEsCisJCSAgICAgICBzaXplb2YodW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UpKTsKKwkJYmZhX3BvcnRfc3RhdHNfc3dhcChwb3J0LCBwb3J0LT5zdGF0cyk7CisJfQorCisJaWYgKHBvcnQtPnN0YXRzX2NiZm4pIHsKKwkJcG9ydC0+c3RhdHNfY2Jmbihwb3J0LT5zdGF0c19jYmFyZywgc3RhdHVzKTsKKwkJcG9ydC0+c3RhdHNfY2JmbiA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIGJmYV9wb3J0X2NsZWFyX3N0YXRzX2lzcigpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gcG9ydCAtIFBvaW50ZXIgdG8gdGhlIFBvcnQgbW9kdWxlCisgKiAgICAgICAgICAgIHN0YXR1cyAtIFJldHVybiBzdGF0dXMgZnJvbSB0aGUgZi93CisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcG9ydF9jbGVhcl9zdGF0c19pc3Ioc3RydWN0IGJmYV9wb3J0X3MgKnBvcnQsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJcG9ydC0+c3RhdHNfc3RhdHVzID0gc3RhdHVzOworCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CisKKwlpZiAocG9ydC0+c3RhdHNfY2JmbikgeworCQlwb3J0LT5zdGF0c19jYmZuKHBvcnQtPnN0YXRzX2NiYXJnLCBzdGF0dXMpOworCQlwb3J0LT5zdGF0c19jYmZuID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogYmZhX3BvcnRfaXNyKCkKKyAqCisgKgorICogQHBhcmFtW2luXSBQb2ludGVyIHRvIHRoZSBQb3J0IG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9wb3J0X2lzcih2b2lkICpjYmFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptKQoreworCXN0cnVjdCBiZmFfcG9ydF9zICpwb3J0ID0gKHN0cnVjdCBiZmFfcG9ydF9zICopY2Jhcmc7CisJdW5pb24gYmZpX3BvcnRfaTJoX21zZ191ICppMmhtc2c7CisKKwlpMmhtc2cgPSAodW5pb24gYmZpX3BvcnRfaTJoX21zZ191ICopbTsKKwliZmFfdHJjKHBvcnQsIG0tPm1oLm1zZ19pZCk7CisKKwlzd2l0Y2ggKG0tPm1oLm1zZ19pZCkgeworCWNhc2UgQkZJX1BPUlRfSTJIX0VOQUJMRV9SU1A6CisJCWlmIChwb3J0LT5lbmRpc19wZW5kaW5nID09IEJGQV9GQUxTRSkKKwkJCWJyZWFrOworCQliZmFfcG9ydF9lbmFibGVfaXNyKHBvcnQsIGkyaG1zZy0+ZW5hYmxlX3JzcC5zdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgQkZJX1BPUlRfSTJIX0RJU0FCTEVfUlNQOgorCQlpZiAocG9ydC0+ZW5kaXNfcGVuZGluZyA9PSBCRkFfRkFMU0UpCisJCQlicmVhazsKKwkJYmZhX3BvcnRfZGlzYWJsZV9pc3IocG9ydCwgaTJobXNnLT5kaXNhYmxlX3JzcC5zdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgQkZJX1BPUlRfSTJIX0dFVF9TVEFUU19SU1A6CisJCS8qCisJCSAqIFN0YXRzIGJ1c3kgZmxhZyBpcyBzdGlsbCBzZXQ/IChtYXkgYmUgY21kIHRpbWVkIG91dCkKKwkJICovCisJCWlmIChwb3J0LT5zdGF0c19idXN5ID09IEJGQV9GQUxTRSkKKwkJCWJyZWFrOworCQliZmFfcG9ydF9nZXRfc3RhdHNfaXNyKHBvcnQsIGkyaG1zZy0+Z2V0c3RhdHNfcnNwLnN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBCRklfUE9SVF9JMkhfQ0xFQVJfU1RBVFNfUlNQOgorCQlpZiAocG9ydC0+c3RhdHNfYnVzeSA9PSBCRkFfRkFMU0UpCisJCQlicmVhazsKKwkJYmZhX3BvcnRfY2xlYXJfc3RhdHNfaXNyKHBvcnQsIGkyaG1zZy0+Y2xlYXJzdGF0c19yc3Auc3RhdHVzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBiZmFfcG9ydF9tZW1pbmZvKCkKKyAqCisgKgorICogQHBhcmFtW2luXSB2b2lkCisgKgorICogQHJldHVybiBTaXplIG9mIERNQSByZWdpb24KKyAqLwordTMyCitiZmFfcG9ydF9tZW1pbmZvKHZvaWQpCit7CisJcmV0dXJuIEJGQV9ST1VORFVQKHNpemVvZih1bmlvbiBiZmFfcHBvcnRfc3RhdHNfdSksIEJGQV9ETUFfQUxJR05fU1opOworfQorCisvKioKKyAqIGJmYV9wb3J0X21lbV9jbGFpbSgpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gcG9ydCBQb3J0IG1vZHVsZSBwb2ludGVyCisgKiAJICAgICAgZG1hX2t2YSBLZXJuZWwgVmlydHVhbCBBZGRyZXNzIG9mIFBvcnQgRE1BIE1lbW9yeQorICogCSAgICAgIGRtYV9wYSAgUGh5c2ljYWwgQWRkcmVzcyBvZiBQb3J0IERNQSBNZW1vcnkKKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLwordm9pZAorYmZhX3BvcnRfbWVtX2NsYWltKHN0cnVjdCBiZmFfcG9ydF9zICpwb3J0LCB1OCAqZG1hX2t2YSwgdTY0IGRtYV9wYSkKK3sKKwlwb3J0LT5zdGF0c19kbWEua3ZhID0gZG1hX2t2YTsKKwlwb3J0LT5zdGF0c19kbWEucGEgPSBkbWFfcGE7Cit9CisKKy8qKgorICogYmZhX3BvcnRfZW5hYmxlKCkKKyAqCisgKiAgIFNlbmQgdGhlIFBvcnQgZW5hYmxlIHJlcXVlc3QgdG8gdGhlIGYvdworICoKKyAqIEBwYXJhbVtpbl0gUG9pbnRlciB0byB0aGUgUG9ydCBtb2R1bGUgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogQHJldHVybiBTdGF0dXMKKyAqLworYmZhX3N0YXR1c190CitiZmFfcG9ydF9lbmFibGUoc3RydWN0IGJmYV9wb3J0X3MgKnBvcnQsIGJmYV9wb3J0X2VuZGlzX2NiZm5fdCBjYmZuLAorCQl2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yZXFfcyAqbTsKKworCS8qKiB0b2RvIE5vdCBpbXBsZW1lbnRlZCAqLworCWJmYV9hc3NlcnQoMCk7CisKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwocG9ydC0+aW9jKSkgeworCQliZmFfdHJjKHBvcnQsIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUpOworCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwl9CisKKwlpZiAocG9ydC0+ZW5kaXNfcGVuZGluZykgeworCQliZmFfdHJjKHBvcnQsIEJGQV9TVEFUVVNfREVWQlVTWSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCisJbSA9IChzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yZXFfcyAqKXBvcnQtPmVuZGlzX21iLm1zZzsKKworCXBvcnQtPm1zZ3RhZysrOworCXBvcnQtPmVuZGlzX2NiZm4gPSBjYmZuOworCXBvcnQtPmVuZGlzX2NiYXJnID0gY2Jhcmc7CisJcG9ydC0+ZW5kaXNfcGVuZGluZyA9IEJGQV9UUlVFOworCisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19QT1JULCBCRklfUE9SVF9IMklfRU5BQkxFX1JFUSwKKwkJICAgIGJmYV9pb2NfcG9ydGlkKHBvcnQtPmlvYykpOworCWJmYV9pb2NfbWJveF9xdWV1ZShwb3J0LT5pb2MsICZwb3J0LT5lbmRpc19tYik7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoqCisgKiBiZmFfcG9ydF9kaXNhYmxlKCkKKyAqCisgKiAgIFNlbmQgdGhlIFBvcnQgZGlzYWJsZSByZXF1ZXN0IHRvIHRoZSBmL3cKKyAqCisgKiBAcGFyYW1baW5dIFBvaW50ZXIgdG8gdGhlIFBvcnQgbW9kdWxlIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIEByZXR1cm4gU3RhdHVzCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX3BvcnRfZGlzYWJsZShzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwgYmZhX3BvcnRfZW5kaXNfY2Jmbl90IGNiZm4sCisJCSB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yZXFfcyAqbTsKKworCS8qKiB0b2RvIE5vdCBpbXBsZW1lbnRlZCAqLworCWJmYV9hc3NlcnQoMCk7CisKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwocG9ydC0+aW9jKSkgeworCQliZmFfdHJjKHBvcnQsIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUpOworCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwl9CisKKwlpZiAocG9ydC0+ZW5kaXNfcGVuZGluZykgeworCQliZmFfdHJjKHBvcnQsIEJGQV9TVEFUVVNfREVWQlVTWSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCisJbSA9IChzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yZXFfcyAqKXBvcnQtPmVuZGlzX21iLm1zZzsKKworCXBvcnQtPm1zZ3RhZysrOworCXBvcnQtPmVuZGlzX2NiZm4gPSBjYmZuOworCXBvcnQtPmVuZGlzX2NiYXJnID0gY2Jhcmc7CisJcG9ydC0+ZW5kaXNfcGVuZGluZyA9IEJGQV9UUlVFOworCisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19QT1JULCBCRklfUE9SVF9IMklfRElTQUJMRV9SRVEsCisJCSAgICBiZmFfaW9jX3BvcnRpZChwb3J0LT5pb2MpKTsKKwliZmFfaW9jX21ib3hfcXVldWUocG9ydC0+aW9jLCAmcG9ydC0+ZW5kaXNfbWIpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogYmZhX3BvcnRfZ2V0X3N0YXRzKCkKKyAqCisgKiAgIFNlbmQgdGhlIHJlcXVlc3QgdG8gdGhlIGYvdyB0byBmZXRjaCBQb3J0IHN0YXRpc3RpY3MuCisgKgorICogQHBhcmFtW2luXSBQb2ludGVyIHRvIHRoZSBQb3J0IG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIFN0YXR1cworICovCitiZmFfc3RhdHVzX3QKK2JmYV9wb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwgdW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgKnN0YXRzLAorCQkgICBiZmFfcG9ydF9zdGF0c19jYmZuX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9wb3J0X2dldF9zdGF0c19yZXFfcyAqbTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChwb3J0LT5pb2MpKSB7CisJCWJmYV90cmMocG9ydCwgQkZBX1NUQVRVU19JT0NfRkFJTFVSRSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCX0KKworCWlmIChwb3J0LT5zdGF0c19idXN5KSB7CisJCWJmYV90cmMocG9ydCwgQkZBX1NUQVRVU19ERVZCVVNZKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwltID0gKHN0cnVjdCBiZmlfcG9ydF9nZXRfc3RhdHNfcmVxX3MgKilwb3J0LT5zdGF0c19tYi5tc2c7CisKKwlwb3J0LT5zdGF0cyA9IHN0YXRzOworCXBvcnQtPnN0YXRzX2NiZm4gPSBjYmZuOworCXBvcnQtPnN0YXRzX2NiYXJnID0gY2Jhcmc7CisJcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9UUlVFOworCWJmYV9kbWFfYmVfYWRkcl9zZXQobS0+ZG1hX2FkZHIsIHBvcnQtPnN0YXRzX2RtYS5wYSk7CisKKwliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX1BPUlQsIEJGSV9QT1JUX0gySV9HRVRfU1RBVFNfUkVRLAorCQkgICAgYmZhX2lvY19wb3J0aWQocG9ydC0+aW9jKSk7CisJYmZhX2lvY19tYm94X3F1ZXVlKHBvcnQtPmlvYywgJnBvcnQtPnN0YXRzX21iKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqIGJmYV9wb3J0X2NsZWFyX3N0YXRzKCkKKyAqCisgKgorICogQHBhcmFtW2luXSBQb2ludGVyIHRvIHRoZSBQb3J0IG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIFN0YXR1cworICovCitiZmFfc3RhdHVzX3QKK2JmYV9wb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfcG9ydF9zICpwb3J0LCBiZmFfcG9ydF9zdGF0c19jYmZuX3QgY2JmbiwKKwkJICAgICB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yZXFfcyAqbTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChwb3J0LT5pb2MpKSB7CisJCWJmYV90cmMocG9ydCwgQkZBX1NUQVRVU19JT0NfRkFJTFVSRSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCX0KKworCWlmIChwb3J0LT5zdGF0c19idXN5KSB7CisJCWJmYV90cmMocG9ydCwgQkZBX1NUQVRVU19ERVZCVVNZKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwltID0gKHN0cnVjdCBiZmlfcG9ydF9nZW5lcmljX3JlcV9zICopcG9ydC0+c3RhdHNfbWIubXNnOworCisJcG9ydC0+c3RhdHNfY2JmbiA9IGNiZm47CisJcG9ydC0+c3RhdHNfY2JhcmcgPSBjYmFyZzsKKwlwb3J0LT5zdGF0c19idXN5ID0gQkZBX1RSVUU7CisKKwliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX1BPUlQsIEJGSV9QT1JUX0gySV9DTEVBUl9TVEFUU19SRVEsCisJCSAgICBiZmFfaW9jX3BvcnRpZChwb3J0LT5pb2MpKTsKKwliZmFfaW9jX21ib3hfcXVldWUocG9ydC0+aW9jLCAmcG9ydC0+c3RhdHNfbWIpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogYmZhX3BvcnRfaGJmYWlsKCkKKyAqCisgKgorICogQHBhcmFtW2luXSBQb2ludGVyIHRvIHRoZSBQb3J0IG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLwordm9pZAorYmZhX3BvcnRfaGJmYWlsKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCA9IChzdHJ1Y3QgYmZhX3BvcnRfcyAqKWFyZzsKKworCS8qCisJICogRmFpbCBhbnkgcGVuZGluZyBnZXRfc3RhdHMvY2xlYXJfc3RhdHMgcmVxdWVzdHMKKwkgKi8KKwlpZiAocG9ydC0+c3RhdHNfYnVzeSkgeworCQlpZiAocG9ydC0+c3RhdHNfY2JmbikKKwkJCXBvcnQtPnN0YXRzX2NiZm4ocG9ydC0+ZGV2LCBCRkFfU1RBVFVTX0ZBSUxFRCk7CisJCXBvcnQtPnN0YXRzX2NiZm4gPSBOVUxMOworCQlwb3J0LT5zdGF0c19idXN5ID0gQkZBX0ZBTFNFOworCX0KKworCS8qCisJICogQ2xlYXIgYW55IGVuYWJsZS9kaXNhYmxlIGlzIHBlbmRpbmcKKwkgKi8KKwlpZiAocG9ydC0+ZW5kaXNfcGVuZGluZykgeworCQlpZiAocG9ydC0+ZW5kaXNfY2JmbikKKwkJCXBvcnQtPmVuZGlzX2NiZm4ocG9ydC0+ZGV2LCBCRkFfU1RBVFVTX0ZBSUxFRCk7CisJCXBvcnQtPmVuZGlzX2NiZm4gPSBOVUxMOworCQlwb3J0LT5lbmRpc19wZW5kaW5nID0gQkZBX0ZBTFNFOworCX0KK30KKworLyoqCisgKiBiZmFfcG9ydF9hdHRhY2goKQorICoKKyAqCisgKiBAcGFyYW1baW5dIHBvcnQgLSBQb2ludGVyIHRvIHRoZSBQb3J0IG1vZHVsZSBkYXRhIHN0cnVjdHVyZQorICogICAgICAgICAgICBpb2MgIC0gUG9pbnRlciB0byB0aGUgaW9jIG1vZHVsZSBkYXRhIHN0cnVjdHVyZQorICogICAgICAgICAgICBkZXYgIC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIGRyaXZlciBtb2R1bGUgZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgIFRoZSBkZXZpY2UgZHJpdmVyIHNwZWNpZmljIG1ib3ggSVNSIGZ1bmN0aW9ucyBoYXZlCisgKiAgICAgICAgICAgICAgICAgICB0aGlzIHBvaW50ZXIgYXMgb25lIG9mIHRoZSBwYXJhbWV0ZXJzLgorICogICAgICAgICAgICB0cmNtb2QgLQorICogICAgICAgICAgICBsb2dtb2QgLQorICoKKyAqIEByZXR1cm4gdm9pZAorICovCit2b2lkCitiZmFfcG9ydF9hdHRhY2goc3RydWN0IGJmYV9wb3J0X3MgKnBvcnQsIHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqZGV2LAorCQlzdHJ1Y3QgYmZhX3RyY19tb2RfcyAqdHJjbW9kLCBzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nbW9kKQoreworCWJmYV9hc3NlcnQocG9ydCk7CisKKwlwb3J0LT5kZXYgPSBkZXY7CisJcG9ydC0+aW9jID0gaW9jOworCXBvcnQtPnRyY21vZCA9IHRyY21vZDsKKwlwb3J0LT5sb2dtb2QgPSBsb2dtb2Q7CisKKwlwb3J0LT5zdGF0c19idXN5ID0gcG9ydC0+ZW5kaXNfcGVuZGluZyA9IEJGQV9GQUxTRTsKKwlwb3J0LT5zdGF0c19jYmZuID0gcG9ydC0+ZW5kaXNfY2JmbiA9IE5VTEw7CisKKwliZmFfaW9jX21ib3hfcmVnaXNyKHBvcnQtPmlvYywgQkZJX01DX1BPUlQsIGJmYV9wb3J0X2lzciwgcG9ydCk7CisJYmZhX2lvY19oYmZhaWxfaW5pdCgmcG9ydC0+aGJmYWlsLCBiZmFfcG9ydF9oYmZhaWwsIHBvcnQpOworCWJmYV9pb2NfaGJmYWlsX3JlZ2lzdGVyKHBvcnQtPmlvYywgJnBvcnQtPmhiZmFpbCk7CisKKwliZmFfdHJjKHBvcnQsIDApOworfQorCisvKioKKyAqIGJmYV9wb3J0X2RldGFjaCgpCisgKgorICoKKyAqIEBwYXJhbVtpbl0gcG9ydCAtIFBvaW50ZXIgdG8gdGhlIFBvcnQgbW9kdWxlIGRhdGEgc3RydWN0dXJlCisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3ZvaWQKK2JmYV9wb3J0X2RldGFjaChzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCkKK3sKKwliZmFfdHJjKHBvcnQsIDApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydF9wcml2LmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wb3J0X3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjk3ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydF9wcml2LmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX1BPUlRfUFJJVl9IX18KKyNkZWZpbmUgX19CRkFfUE9SVF9QUklWX0hfXworCisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19wcG9ydC5oPgorI2luY2x1ZGUgPGJmaS9iZmlfcHBvcnQuaD4KKyNpbmNsdWRlICJiZmFfaW50cl9wcml2LmgiCisKKy8qKgorICogQkZBIHBoeXNpY2FsIHBvcnQgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGJmYV9wcG9ydF9zIHsKKwlzdHJ1Y3QgYmZhX3MgCQkqYmZhOwkvKiAgcGFyZW50IEJGQSBpbnN0YW5jZSAqLworCWJmYV9zbV90CQlzbTsJLyogIHBvcnQgc3RhdGUgbWFjaGluZSAqLworCXd3bl90CQkJbnd3bjsJLyogIG5vZGUgd3duIG9mIHBoeXNpY2FsIHBvcnQgKi8KKwl3d25fdAkJCXB3d247CS8qICBwb3J0IHd3biBvZiBwaHlzaWNhbCBvcHJ0ICovCisJZW51bSBiZmFfcHBvcnRfc3BlZWQgc3BlZWRfc3VwOworCQkJCQkvKiAgc3VwcG9ydGVkIHNwZWVkcyAqLworCWVudW0gYmZhX3Bwb3J0X3NwZWVkIHNwZWVkOwkvKiAgY3VycmVudCBzcGVlZCAqLworCWVudW0gYmZhX3Bwb3J0X3RvcG9sb2d5IHRvcG9sb2d5OwkvKiAgY3VycmVudCB0b3BvbG9neSAqLworCXU4CQkJbXlhbHBhOwkvKiAgbXkgQUxQQSBpbiBMT09QIHRvcG9sb2d5ICovCisJdTgJCQlyc3ZkWzNdOworCXN0cnVjdCBiZmFfcHBvcnRfY2ZnX3MJY2ZnOwkvKiAgY3VycmVudCBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3QgYmZhX3Fvc19hdHRyX3MgIHFvc19hdHRyOyAgIC8qIFFvUyBBdHRyaWJ1dGVzICovCisJc3RydWN0IGJmYV9xb3NfdmNfYXR0cl9zIHFvc192Y19hdHRyOyAgLyogIFZDIGluZm8gZnJvbSBFTFAgKi8KKwlzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zCXJlcXFfd2FpdDsKKwkJCQkJLyogIHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxcSAqLworCXN0cnVjdCBiZmFfcmVxcV93YWl0X3MJc3ZjcmVxX3dhaXQ7CisJCQkJCS8qICB0byB3YWl0IGZvciByb29tIGluIHJlcXEgKi8KKwlzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zCXN0YXRzX3JlcXFfd2FpdDsKKwkJCQkJLyogIHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxcSAoc3RhdHMpICovCisJdm9pZAkJCSpldmVudF9jYmFyZzsKKwl2b2lkCQkJKCpldmVudF9jYmZuKSAodm9pZCAqY2JhcmcsCisJCQkJCQliZmFfcHBvcnRfZXZlbnRfdCBldmVudCk7CisJdW5pb24geworCQl1bmlvbiBiZmlfcHBvcnRfaTJoX21zZ191IGkyaG1zZzsKKwl9IGV2ZW50X2FyZzsKKwl2b2lkCQkJKmJmYWQ7CS8qICBCRkEgZHJpdmVyIGhhbmRsZSAqLworCXN0cnVjdCBiZmFfY2JfcWVfcwkJaGNiX3FlOwkvKiAgQkZBIGNhbGxiYWNrIHF1ZXVlIGVsZW0gKi8KKwllbnVtIGJmYV9wcG9ydF9saW5rc3RhdGUJaGNiX2V2ZW50OworCQkJCQkvKiAgbGluayBldmVudCBmb3IgY2FsbGJhY2sgKi8KKwl1MzIJCW1zZ3RhZzsJLyogIGZpbXJ3YXJlIG1zZyB0YWcgZm9yIHJlcGx5ICovCisJdTgJCQkqc3RhdHNfa3ZhOworCXU2NAkJc3RhdHNfcGE7CisJdW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgKnN0YXRzOwkvKiAgcHBvcnQgc3RhdHMgKi8KKwl1MzIJCW15cGlkIDogMjQ7CisJdTMyCQlyc3ZkX2IgOiA4OworCXN0cnVjdCBiZmFfdGltZXJfcyAJdGltZXI7CS8qICB0aW1lciAqLworCXVuaW9uIGJmYV9wcG9ydF9zdGF0c191IAkqc3RhdHNfcmV0OworCQkJCQkvKiAgZHJpdmVyIHN0YXRzIGxvY2F0aW9uICovCisJYmZhX3N0YXR1c190CQlzdGF0c19zdGF0dXM7CisJCQkJCS8qICBzdGF0cy9zdGF0c2NsciBzdGF0dXMgKi8KKwliZmFfYm9vbGVhbl90ICAgCXN0YXRzX2J1c3k7CisJCQkJCS8qICBvdXRzdGFuZGluZyBzdGF0cy9zdGF0c2NsciAqLworCWJmYV9ib29sZWFuX3QgICAJc3RhdHNfcWZ1bGw7CisJYmZhX2Jvb2xlYW5fdCAgIAlkaWFnX2J1c3k7CisJCQkJCS8qICBkaWFnIGJ1c3kgc3RhdHVzICovCisJYmZhX2Jvb2xlYW5fdCAgIAliZWFjb247CisJCQkJCS8qICBwb3J0IGJlYWNvbiBzdGF0dXMgKi8KKwliZmFfYm9vbGVhbl90ICAgCWxpbmtfZTJlX2JlYWNvbjsKKwkJCQkJLyogIGxpbmsgYmVhY29uIHN0YXR1cyAqLworCWJmYV9jYl9wcG9ydF90CQlzdGF0c19jYmZuOworCQkJCQkvKiAgZHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJdm9pZAkJCSpzdGF0c19jYmFyZzsKKwkJCQkJLyogKiE8IHVzZXIgY2FsbGJhY2sgYXJnICovCit9OworCisjZGVmaW5lIEJGQV9QT1JUX01PRChfX2JmYSkJKCYoX19iZmEpLT5tb2R1bGVzLnBwb3J0KQorCisvKgorICogcHVibGljIGZ1bmN0aW9ucworICovCit2b2lkCWJmYV9wcG9ydF9pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm1zZyk7CisjZW5kaWYgLyogX19CRkFfUE9SVF9QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcHJpdi5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDdhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wcml2LmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9QUklWX0hfXworI2RlZmluZSBfX0JGQV9QUklWX0hfXworCisjaW5jbHVkZSAiYmZhX2lvY2ZjLmgiCisjaW5jbHVkZSAiYmZhX2ludHJfcHJpdi5oIgorI2luY2x1ZGUgImJmYV90cmNtb2RfcHJpdi5oIgorI2luY2x1ZGUgImJmYV9tb2R1bGVzX3ByaXYuaCIKKyNpbmNsdWRlICJiZmFfZndpbWdfcHJpdi5oIgorI2luY2x1ZGUgPGNzL2JmYV9sb2cuaD4KKyNpbmNsdWRlIDxiZmFfdGltZXIuaD4KKworLyoqCisgKiBNYWNybyB0byBkZWZpbmUgYSBuZXcgQkZBIG1vZHVsZQorICovCisjZGVmaW5lIEJGQV9NT0RVTEUoX19tb2QpIAkJCQkJCVwKKwlzdGF0aWMgdm9pZCBiZmFfICMjIF9fbW9kICMjIF9tZW1pbmZvKAkJCQlcCisJCQlzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHUzMiAqbmRtX2xlbiwJXAorCQkJdTMyICpkbV9sZW4pOyAgICAgIFwKKwlzdGF0aWMgdm9pZCBiZmFfICMjIF9fbW9kICMjIF9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsCQlcCisJCQl2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIAlcCisJCQlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywJCQlcCisJCQlzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpOyAgICAgIFwKKwlzdGF0aWMgdm9pZCBiZmFfICMjIF9fbW9kICMjIF9pbml0ZG9uZShzdHJ1Y3QgYmZhX3MgKmJmYSk7ICAgICAgXAorCXN0YXRpYyB2b2lkIGJmYV8gIyMgX19tb2QgIyMgX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSk7ICAgICAgXAorCXN0YXRpYyB2b2lkIGJmYV8gIyMgX19tb2QgIyMgX3N0YXJ0KHN0cnVjdCBiZmFfcyAqYmZhKTsgICAgICBcCisJc3RhdGljIHZvaWQgYmZhXyAjIyBfX21vZCAjIyBfc3RvcChzdHJ1Y3QgYmZhX3MgKmJmYSk7ICAgICAgXAorCXN0YXRpYyB2b2lkIGJmYV8gIyMgX19tb2QgIyMgX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpOyAgICAgIFwKKwkJCQkJCQkJCVwKKwlleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kXyAjIyBfX21vZDsJCQlcCisJc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kXyAjIyBfX21vZCA9IHsJCQlcCisJCWJmYV8gIyMgX19tb2QgIyMgX21lbWluZm8sCQkJCVwKKwkJYmZhXyAjIyBfX21vZCAjIyBfYXR0YWNoLAkJCQlcCisJCWJmYV8gIyMgX19tb2QgIyMgX2luaXRkb25lLAkJCQlcCisJCWJmYV8gIyMgX19tb2QgIyMgX2RldGFjaCwJCQkJXAorCQliZmFfICMjIF9fbW9kICMjIF9zdGFydCwJCQkJXAorCQliZmFfICMjIF9fbW9kICMjIF9zdG9wLAkJCQkJXAorCQliZmFfICMjIF9fbW9kICMjIF9pb2NkaXNhYmxlLAkJCQlcCisJfQorCisjZGVmaW5lIEJGQV9DQUNIRUxJTkVfU1oJKDI1NikKKworLyoqCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBpbnRlcmFjdCBiZXR3ZWVuIGRpZmZlcmVudCBCRkEgc3ViIG1vZHVsZXMKKyAqCisgKiBFYWNoIHN1YiBtb2R1bGUgbmVlZHMgdG8gaW1wbGVtZW50IG9ubHkgdGhlIGVudHJ5IHBvaW50cyByZWxldmFudCB0byBpdCAoYW5kCisgKiBjYW4gbGVhdmUgZW50cnkgcG9pbnRzIGFzIE5VTEwpCisgKi8KK3N0cnVjdCBiZmFfbW9kdWxlX3MgeworCXZvaWQgKCptZW1pbmZvKSAoc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKKwkJCXUzMiAqZG1fbGVuKTsKKwl2b2lkICgqYXR0YWNoKSAoc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsCisJCQlzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCQlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywKKwkJCXN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldik7CisJdm9pZCAoKmluaXRkb25lKSAoc3RydWN0IGJmYV9zICpiZmEpOworCXZvaWQgKCpkZXRhY2gpIChzdHJ1Y3QgYmZhX3MgKmJmYSk7CisJdm9pZCAoKnN0YXJ0KSAoc3RydWN0IGJmYV9zICpiZmEpOworCXZvaWQgKCpzdG9wKSAoc3RydWN0IGJmYV9zICpiZmEpOworCXZvaWQgKCppb2NkaXNhYmxlKSAoc3RydWN0IGJmYV9zICpiZmEpOworfTsKKworZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgKmhhbF9tb2RzW107CisKK3N0cnVjdCBiZmFfcyB7CisJdm9pZAkJCSpiZmFkOwkJLyogIEJGQSBkcml2ZXIgaW5zdGFuY2UgICAgKi8KKwlzdHJ1Y3QgYmZhX2Flbl9zCSphZW47CQkvKiAgQUVOIG1vZHVsZQkJICAgICovCisJc3RydWN0IGJmYV9wbG9nX3MJKnBsb2c7CQkvKiAgcG9ydGxvZyBidWZmZXIJICAgICovCisJc3RydWN0IGJmYV9sb2dfbW9kX3MJKmxvZ207CQkvKiAgZHJpdmVyIGxvZ2dpbmcgbW9kdWxlbiAqLworCXN0cnVjdCBiZmFfdHJjX21vZF9zCSp0cmNtb2Q7CS8qICBkcml2ZXIgdHJhY2luZwkgICAgKi8KKwlzdHJ1Y3QgYmZhX2lvY19zCWlvYzsJCS8qICBJT0MgbW9kdWxlCQkgICAgKi8KKwlzdHJ1Y3QgYmZhX2lvY2ZjX3MJaW9jZmM7CQkvKiAgSU9DRkMgbW9kdWxlCSAgICAqLworCXN0cnVjdCBiZmFfdGltZXJfbW9kX3MJdGltZXJfbW9kOwkvKiAgdGltZXIgbW9kdWxlCSAgICAqLworCXN0cnVjdCBiZmFfbW9kdWxlc19zCW1vZHVsZXM7CS8qICBCRkEgbW9kdWxlcwkgICAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWNvbXBfcTsJCS8qICBwZW5kaW5nIGNvbXBsZXRpb25zICAgICovCisJYmZhX2Jvb2xlYW5fdAkJcm1lX3Byb2Nlc3M7CS8qICBSTUUgcHJvY2Vzc2luZyBlbmFibGVkICovCisJc3RydWN0IGxpc3RfaGVhZAkJcmVxcV93YWl0cVtCRklfSU9DX01BWF9DUVNdOworCWJmYV9ib29sZWFuX3QJCWZjczsJCS8qICBGQ1MgaXMgYXR0YWNoZWQgdG8gQkZBICovCisJc3RydWN0IGJmYV9tc2l4X3MJbXNpeDsKK307CisKK2V4dGVybiBiZmFfaXNyX2Z1bmNfdCBiZmFfaXNyc1tCRklfTUNfTUFYXTsKK2V4dGVybiBiZmFfaW9jX21ib3hfbWNmdW5jX3QgIGJmYV9tYm94X2lzcnNbXTsKK2V4dGVybiBiZmFfYm9vbGVhbl90IGJmYV9hdXRvX3JlY292ZXI7CitleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX2ZsYXNoOworZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9mY2RpYWc7CitleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX3NncGc7CitleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX3Bwb3J0OworZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9mY3hwOworZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9scHM7CitleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX3VmOworZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9ycG9ydDsKK2V4dGVybiBzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2RfZmNwaW07CitleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX3BiaW5kOworCisjZW5kaWYgLyogX19CRkFfUFJJVl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Jwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkYTc3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Jwb3J0LmMKQEAgLTAsMCArMSw5MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlIDxjcy9iZmFfZGVidWcuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX3Jwb3J0Lmg+CisjaW5jbHVkZSAiYmZhX2ludHJfcHJpdi5oIgorCitCRkFfVFJDX0ZJTEUoSEFMLCBSUE9SVCk7CitCRkFfTU9EVUxFKHJwb3J0KTsKKworI2RlZmluZSBiZmFfcnBvcnRfb2ZmbGluZV9jYihfX3JwKSBkbyB7CQkJCVwKKwlpZiAoKF9fcnApLT5iZmEtPmZjcykJCQkJCQlcCisJCWJmYV9jYl9ycG9ydF9vZmZsaW5lKChfX3JwKS0+cnBvcnRfZHJ2KTsgICAgICBcCisJZWxzZSB7CQkJCQkJCQlcCisJCWJmYV9jYl9xdWV1ZSgoX19ycCktPmJmYSwgJihfX3JwKS0+aGNiX3FlLAkJXAorCQkJCV9fYmZhX2NiX3Jwb3J0X29mZmxpbmUsIChfX3JwKSk7ICAgICAgXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYmZhX3Jwb3J0X29ubGluZV9jYihfX3JwKSBkbyB7CQkJCVwKKwlpZiAoKF9fcnApLT5iZmEtPmZjcykJCQkJCQlcCisJCWJmYV9jYl9ycG9ydF9vbmxpbmUoKF9fcnApLT5ycG9ydF9kcnYpOyAgICAgIFwKKwllbHNlIHsJCQkJCQkJCVwKKwkJYmZhX2NiX3F1ZXVlKChfX3JwKS0+YmZhLCAmKF9fcnApLT5oY2JfcWUsCQlcCisJCQkJICBfX2JmYV9jYl9ycG9ydF9vbmxpbmUsIChfX3JwKSk7ICAgICAgXAorCQl9CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgc3RydWN0IGJmYV9ycG9ydF9zICpiZmFfcnBvcnRfYWxsb2Moc3RydWN0IGJmYV9ycG9ydF9tb2RfcyAqcnBfbW9kKTsKK3N0YXRpYyB2b2lkIGJmYV9ycG9ydF9mcmVlKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQpOworc3RhdGljIGJmYV9ib29sZWFuX3QgYmZhX3Jwb3J0X3NlbmRfZndjcmVhdGUoc3RydWN0IGJmYV9ycG9ydF9zICpycCk7CitzdGF0aWMgYmZhX2Jvb2xlYW5fdCBiZmFfcnBvcnRfc2VuZF9md2RlbGV0ZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwKTsKK3N0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV9ycG9ydF9zZW5kX2Z3c3BlZWQoc3RydWN0IGJmYV9ycG9ydF9zICpycCk7CitzdGF0aWMgdm9pZCBfX2JmYV9jYl9ycG9ydF9vbmxpbmUodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOworc3RhdGljIHZvaWQgX19iZmFfY2JfcnBvcnRfb2ZmbGluZSh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CisKKy8qKgorICogIGJmYV9ycG9ydF9zbSBCRkEgcnBvcnQgc3RhdGUgbWFjaGluZQorICovCisKKworZW51bSBiZmFfcnBvcnRfZXZlbnQgeworCUJGQV9SUE9SVF9TTV9DUkVBVEUJPSAxLAkvKiAgcnBvcnQgY3JlYXRlIGV2ZW50CQkqLworCUJGQV9SUE9SVF9TTV9ERUxFVEUJPSAyLAkvKiAgZGVsZXRpbmcgYW4gZXhpc3RpbmcgcnBvcnQgKi8KKwlCRkFfUlBPUlRfU01fT05MSU5FCT0gMywJLyogIHJwb3J0IGlzIG9ubGluZQkJKi8KKwlCRkFfUlBPUlRfU01fT0ZGTElORQk9IDQsCS8qICBycG9ydCBpcyBvZmZsaW5lCQkqLworCUJGQV9SUE9SVF9TTV9GV1JTUAk9IDUsCS8qICBmaXJtd2FyZSByZXNwb25zZQkJKi8KKwlCRkFfUlBPUlRfU01fSFdGQUlMCT0gNiwJLyogIElPQyBoL3cgZmFpbHVyZQkJKi8KKwlCRkFfUlBPUlRfU01fUU9TX1NDTgk9IDcsCS8qICBRb1MgU0NOIGZyb20gZmlybXdhcmUJKi8KKwlCRkFfUlBPUlRfU01fU0VUX1NQRUVECT0gOCwJLyogIFNldCBScG9ydCBTcGVlZCAJCSovCisJQkZBX1JQT1JUX1NNX1FSRVNVTUUJPSA5LAkvKiAgc3BhY2UgaW4gcmVxdWV1ZSBxdWV1ZQkqLworfTsKKworc3RhdGljIHZvaWQJYmZhX3Jwb3J0X3NtX3VuaW5pdChzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLAorCQkJCQllbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZAliZmFfcnBvcnRfc21fY3JlYXRlZChzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLAorCQkJCQkgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQJYmZhX3Jwb3J0X3NtX2Z3Y3JlYXRlKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnAsCisJCQkJCSAgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQJYmZhX3Jwb3J0X3NtX29ubGluZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLAorCQkJCQllbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZAliZmFfcnBvcnRfc21fZndkZWxldGUoc3RydWN0IGJmYV9ycG9ydF9zICpycCwKKwkJCQkJICBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZAliZmFfcnBvcnRfc21fb2ZmbGluZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLAorCQkJCQkgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQJYmZhX3Jwb3J0X3NtX2RlbGV0aW5nKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnAsCisJCQkJCSAgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQJYmZhX3Jwb3J0X3NtX29mZmxpbmVfcGVuZGluZyhzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLAorCQkJCQkgIGVudW0gYmZhX3Jwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkCWJmYV9ycG9ydF9zbV9kZWxldGVfcGVuZGluZyhzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLAorCQkJCQkgIGVudW0gYmZhX3Jwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkCWJmYV9ycG9ydF9zbV9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnAsCisJCQkJCSAgICBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZAliZmFfcnBvcnRfc21fZndjcmVhdGVfcWZ1bGwoc3RydWN0IGJmYV9ycG9ydF9zICpycCwKKwkJCQkJICBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZAliZmFfcnBvcnRfc21fZndkZWxldGVfcWZ1bGwoc3RydWN0IGJmYV9ycG9ydF9zICpycCwKKwkJCQkJICBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZAliZmFfcnBvcnRfc21fZGVsZXRpbmdfcWZ1bGwoc3RydWN0IGJmYV9ycG9ydF9zICpycCwKKwkJCQkJICBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCk7CisKKy8qKgorICogQmVnaW5uaW5nIHN0YXRlLCBvbmx5IG9ubGluZSBldmVudCBleHBlY3RlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9ycG9ydF9zbV91bmluaXQoc3RydWN0IGJmYV9ycG9ydF9zICpycCwgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycC0+YmZhLCBycC0+cnBvcnRfdGFnKTsKKwliZmFfdHJjKHJwLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9SUE9SVF9TTV9DUkVBVEU6CisJCWJmYV9zdGF0cyhycCwgc21fdW5fY3IpOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fY3JlYXRlZCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3N0YXRzKHJwLCBzbV91bl91bmV4cCk7CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3Jwb3J0X3NtX2NyZWF0ZWQoc3RydWN0IGJmYV9ycG9ydF9zICpycCwgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycC0+YmZhLCBycC0+cnBvcnRfdGFnKTsKKwliZmFfdHJjKHJwLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9SUE9SVF9TTV9PTkxJTkU6CisJCWJmYV9zdGF0cyhycCwgc21fY3Jfb24pOworCQlpZiAoYmZhX3Jwb3J0X3NlbmRfZndjcmVhdGUocnApKQorCQkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2Z3Y3JlYXRlKTsKKwkJZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2Z3Y3JlYXRlX3FmdWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9ERUxFVEU6CisJCWJmYV9zdGF0cyhycCwgc21fY3JfZGVsKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9ycG9ydF9mcmVlKHJwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9IV0ZBSUw6CisJCWJmYV9zdGF0cyhycCwgc21fY3JfaHdmKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2lvY2Rpc2FibGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zdGF0cyhycCwgc21fY3JfdW5leHApOworCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBXYWl0aW5nIGZvciBycG9ydCBjcmVhdGUgcmVzcG9uc2UgZnJvbSBmaXJtd2FyZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9ycG9ydF9zbV9md2NyZWF0ZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLCBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwLT5iZmEsIHJwLT5ycG9ydF90YWcpOworCWJmYV90cmMocnAtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1JQT1JUX1NNX0ZXUlNQOgorCQliZmFfc3RhdHMocnAsIHNtX2Z3Y19yc3ApOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fb25saW5lKTsKKwkJYmZhX3Jwb3J0X29ubGluZV9jYihycCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUlBPUlRfU01fREVMRVRFOgorCQliZmFfc3RhdHMocnAsIHNtX2Z3Y19kZWwpOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fZGVsZXRlX3BlbmRpbmcpOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX09GRkxJTkU6CisJCWJmYV9zdGF0cyhycCwgc21fZndjX29mZik7CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9vZmZsaW5lX3BlbmRpbmcpOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3N0YXRzKHJwLCBzbV9md2NfaHdmKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2lvY2Rpc2FibGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zdGF0cyhycCwgc21fZndjX3VuZXhwKTsKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogUmVxdWVzdCBxdWV1ZSBpcyBmdWxsLCBhd2FpdGluZyBxdWV1ZSByZXN1bWUgdG8gc2VuZCBjcmVhdGUgcmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9ycG9ydF9zbV9md2NyZWF0ZV9xZnVsbChzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLCBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwLT5iZmEsIHJwLT5ycG9ydF90YWcpOworCWJmYV90cmMocnAtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1JQT1JUX1NNX1FSRVNVTUU6CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9md2NyZWF0ZSk7CisJCWJmYV9ycG9ydF9zZW5kX2Z3Y3JlYXRlKHJwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9ERUxFVEU6CisJCWJmYV9zdGF0cyhycCwgc21fZndjX2RlbCk7CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV91bmluaXQpOworCQliZmFfcmVxcV93Y2FuY2VsKCZycC0+cmVxcV93YWl0KTsKKwkJYmZhX3Jwb3J0X2ZyZWUocnApOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX09GRkxJTkU6CisJCWJmYV9zdGF0cyhycCwgc21fZndjX29mZik7CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9vZmZsaW5lKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmcnAtPnJlcXFfd2FpdCk7CisJCWJmYV9ycG9ydF9vZmZsaW5lX2NiKHJwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9IV0ZBSUw6CisJCWJmYV9zdGF0cyhycCwgc21fZndjX2h3Zik7CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9pb2NkaXNhYmxlKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmcnAtPnJlcXFfd2FpdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3N0YXRzKHJwLCBzbV9md2NfdW5leHApOworCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBPbmxpbmUgc3RhdGUgLSBub3JtYWwgcGFya2luZyBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9ycG9ydF9zbV9vbmxpbmUoc3RydWN0IGJmYV9ycG9ydF9zICpycCwgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmaV9ycG9ydF9xb3Nfc2NuX3MgKnFvc19zY247CisKKwliZmFfdHJjKHJwLT5iZmEsIHJwLT5ycG9ydF90YWcpOworCWJmYV90cmMocnAtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1JQT1JUX1NNX09GRkxJTkU6CisJCWJmYV9zdGF0cyhycCwgc21fb25fb2ZmKTsKKwkJaWYgKGJmYV9ycG9ydF9zZW5kX2Z3ZGVsZXRlKHJwKSkKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9md2RlbGV0ZSk7CisJCWVsc2UKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9md2RlbGV0ZV9xZnVsbCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUlBPUlRfU01fREVMRVRFOgorCQliZmFfc3RhdHMocnAsIHNtX29uX2RlbCk7CisJCWlmIChiZmFfcnBvcnRfc2VuZF9md2RlbGV0ZShycCkpCisJCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fZGVsZXRpbmcpOworCQllbHNlCisJCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fZGVsZXRpbmdfcWZ1bGwpOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3N0YXRzKHJwLCBzbV9vbl9od2YpOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21faW9jZGlzYWJsZSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUlBPUlRfU01fU0VUX1NQRUVEOgorCQliZmFfcnBvcnRfc2VuZF9md3NwZWVkKHJwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9RT1NfU0NOOgorCQlxb3Nfc2NuID0gKHN0cnVjdCBiZmlfcnBvcnRfcW9zX3Njbl9zICopIHJwLT5ldmVudF9hcmcuZndfbXNnOworCQlycC0+cW9zX2F0dHIgPSBxb3Nfc2NuLT5uZXdfcW9zX2F0dHI7CisJCWJmYV90cmMocnAtPmJmYSwgcW9zX3Njbi0+b2xkX3Fvc19hdHRyLnFvc19mbG93X2lkKTsKKwkJYmZhX3RyYyhycC0+YmZhLCBxb3Nfc2NuLT5uZXdfcW9zX2F0dHIucW9zX2Zsb3dfaWQpOworCQliZmFfdHJjKHJwLT5iZmEsIHFvc19zY24tPm9sZF9xb3NfYXR0ci5xb3NfcHJpb3JpdHkpOworCQliZmFfdHJjKHJwLT5iZmEsIHFvc19zY24tPm5ld19xb3NfYXR0ci5xb3NfcHJpb3JpdHkpOworCisJCXFvc19zY24tPm9sZF9xb3NfYXR0ci5xb3NfZmxvd19pZCAgPQorCQkJYmZhX29zX250b2hsKHFvc19zY24tPm9sZF9xb3NfYXR0ci5xb3NfZmxvd19pZCk7CisJCXFvc19zY24tPm5ld19xb3NfYXR0ci5xb3NfZmxvd19pZCAgPQorCQkJYmZhX29zX250b2hsKHFvc19zY24tPm5ld19xb3NfYXR0ci5xb3NfZmxvd19pZCk7CisJCXFvc19zY24tPm9sZF9xb3NfYXR0ci5xb3NfcHJpb3JpdHkgPQorCQkJYmZhX29zX250b2hsKHFvc19zY24tPm9sZF9xb3NfYXR0ci5xb3NfcHJpb3JpdHkpOworCQlxb3Nfc2NuLT5uZXdfcW9zX2F0dHIucW9zX3ByaW9yaXR5ID0KKwkJCWJmYV9vc19udG9obChxb3Nfc2NuLT5uZXdfcW9zX2F0dHIucW9zX3ByaW9yaXR5KTsKKworCQlpZiAocW9zX3Njbi0+b2xkX3Fvc19hdHRyLnFvc19mbG93X2lkICE9CisJCQlxb3Nfc2NuLT5uZXdfcW9zX2F0dHIucW9zX2Zsb3dfaWQpCisJCQliZmFfY2JfcnBvcnRfcW9zX3Njbl9mbG93aWQocnAtPnJwb3J0X2RydiwKKwkJCQkJCSAgICBxb3Nfc2NuLT5vbGRfcW9zX2F0dHIsCisJCQkJCQkgICAgcW9zX3Njbi0+bmV3X3Fvc19hdHRyKTsKKwkJaWYgKHFvc19zY24tPm9sZF9xb3NfYXR0ci5xb3NfcHJpb3JpdHkgIT0KKwkJCXFvc19zY24tPm5ld19xb3NfYXR0ci5xb3NfcHJpb3JpdHkpCisJCQliZmFfY2JfcnBvcnRfcW9zX3Njbl9wcmlvKHJwLT5ycG9ydF9kcnYsCisJCQkJCQkgIHFvc19zY24tPm9sZF9xb3NfYXR0ciwKKwkJCQkJCSAgcW9zX3Njbi0+bmV3X3Fvc19hdHRyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc3RhdHMocnAsIHNtX29uX3VuZXhwKTsKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogRmlybXdhcmUgcnBvcnQgaXMgYmVpbmcgZGVsZXRlZCAtIGF3YWl0aW5nIGYvdyByZXNwb25zZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9ycG9ydF9zbV9md2RlbGV0ZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLCBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwLT5iZmEsIHJwLT5ycG9ydF90YWcpOworCWJmYV90cmMocnAtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1JQT1JUX1NNX0ZXUlNQOgorCQliZmFfc3RhdHMocnAsIHNtX2Z3ZF9yc3ApOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fb2ZmbGluZSk7CisJCWJmYV9ycG9ydF9vZmZsaW5lX2NiKHJwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9ERUxFVEU6CisJCWJmYV9zdGF0cyhycCwgc21fZndkX2RlbCk7CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9kZWxldGluZyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUlBPUlRfU01fSFdGQUlMOgorCQliZmFfc3RhdHMocnAsIHNtX2Z3ZF9od2YpOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21faW9jZGlzYWJsZSk7CisJCWJmYV9ycG9ydF9vZmZsaW5lX2NiKHJwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc3RhdHMocnAsIHNtX2Z3ZF91bmV4cCk7CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3Jwb3J0X3NtX2Z3ZGVsZXRlX3FmdWxsKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnAsIGVudW0gYmZhX3Jwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnAtPmJmYSwgcnAtPnJwb3J0X3RhZyk7CisJYmZhX3RyYyhycC0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfUlBPUlRfU01fUVJFU1VNRToKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2Z3ZGVsZXRlKTsKKwkJYmZhX3Jwb3J0X3NlbmRfZndkZWxldGUocnApOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX0RFTEVURToKKwkJYmZhX3N0YXRzKHJwLCBzbV9md2RfZGVsKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2RlbGV0aW5nX3FmdWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9IV0ZBSUw6CisJCWJmYV9zdGF0cyhycCwgc21fZndkX2h3Zik7CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9pb2NkaXNhYmxlKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmcnAtPnJlcXFfd2FpdCk7CisJCWJmYV9ycG9ydF9vZmZsaW5lX2NiKHJwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc3RhdHMocnAsIHNtX2Z3ZF91bmV4cCk7CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIE9mZmxpbmUgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfc21fb2ZmbGluZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLCBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwLT5iZmEsIHJwLT5ycG9ydF90YWcpOworCWJmYV90cmMocnAtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1JQT1JUX1NNX0RFTEVURToKKwkJYmZhX3N0YXRzKHJwLCBzbV9vZmZfZGVsKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9ycG9ydF9mcmVlKHJwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9PTkxJTkU6CisJCWJmYV9zdGF0cyhycCwgc21fb2ZmX29uKTsKKwkJaWYgKGJmYV9ycG9ydF9zZW5kX2Z3Y3JlYXRlKHJwKSkKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9md2NyZWF0ZSk7CisJCWVsc2UKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9md2NyZWF0ZV9xZnVsbCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUlBPUlRfU01fSFdGQUlMOgorCQliZmFfc3RhdHMocnAsIHNtX29mZl9od2YpOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21faW9jZGlzYWJsZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3N0YXRzKHJwLCBzbV9vZmZfdW5leHApOworCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBScG9ydCBpcyBkZWxldGVkLCB3YWl0aW5nIGZvciBmaXJtd2FyZSByZXNwb25zZSB0byBkZWxldGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfc21fZGVsZXRpbmcoc3RydWN0IGJmYV9ycG9ydF9zICpycCwgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycC0+YmZhLCBycC0+cnBvcnRfdGFnKTsKKwliZmFfdHJjKHJwLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9SUE9SVF9TTV9GV1JTUDoKKwkJYmZhX3N0YXRzKHJwLCBzbV9kZWxfZndyc3ApOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fdW5pbml0KTsKKwkJYmZhX3Jwb3J0X2ZyZWUocnApOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3N0YXRzKHJwLCBzbV9kZWxfaHdmKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9ycG9ydF9mcmVlKHJwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9ycG9ydF9zbV9kZWxldGluZ19xZnVsbChzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLCBlbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwLT5iZmEsIHJwLT5ycG9ydF90YWcpOworCWJmYV90cmMocnAtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1JQT1JUX1NNX1FSRVNVTUU6CisJCWJmYV9zdGF0cyhycCwgc21fZGVsX2Z3cnNwKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2RlbGV0aW5nKTsKKwkJYmZhX3Jwb3J0X3NlbmRfZndkZWxldGUocnApOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX0hXRkFJTDoKKwkJYmZhX3N0YXRzKHJwLCBzbV9kZWxfaHdmKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9yZXFxX3djYW5jZWwoJnJwLT5yZXFxX3dhaXQpOworCQliZmFfcnBvcnRfZnJlZShycCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogV2FpdGluZyBmb3IgcnBvcnQgY3JlYXRlIHJlc3BvbnNlIGZyb20gZmlybXdhcmUuIEEgZGVsZXRlIGlzIHBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfc21fZGVsZXRlX3BlbmRpbmcoc3RydWN0IGJmYV9ycG9ydF9zICpycCwKKwkJCQllbnVtIGJmYV9ycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwLT5iZmEsIHJwLT5ycG9ydF90YWcpOworCWJmYV90cmMocnAtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1JQT1JUX1NNX0ZXUlNQOgorCQliZmFfc3RhdHMocnAsIHNtX2RlbHBfZndyc3ApOworCQlpZiAoYmZhX3Jwb3J0X3NlbmRfZndkZWxldGUocnApKQorCQkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2RlbGV0aW5nKTsKKwkJZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2RlbGV0aW5nX3FmdWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9IV0ZBSUw6CisJCWJmYV9zdGF0cyhycCwgc21fZGVscF9od2YpOworCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fdW5pbml0KTsKKwkJYmZhX3Jwb3J0X2ZyZWUocnApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zdGF0cyhycCwgc21fZGVscF91bmV4cCk7CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIFdhaXRpbmcgZm9yIHJwb3J0IGNyZWF0ZSByZXNwb25zZSBmcm9tIGZpcm13YXJlLiBScG9ydCBvZmZsaW5lIGlzIHBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfc21fb2ZmbGluZV9wZW5kaW5nKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnAsCisJCQkJIGVudW0gYmZhX3Jwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnAtPmJmYSwgcnAtPnJwb3J0X3RhZyk7CisJYmZhX3RyYyhycC0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfUlBPUlRfU01fRldSU1A6CisJCWJmYV9zdGF0cyhycCwgc21fb2ZmcF9md3JzcCk7CisJCWlmIChiZmFfcnBvcnRfc2VuZF9md2RlbGV0ZShycCkpCisJCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fZndkZWxldGUpOworCQllbHNlCisJCQliZmFfc21fc2V0X3N0YXRlKHJwLCBiZmFfcnBvcnRfc21fZndkZWxldGVfcWZ1bGwpOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX0RFTEVURToKKwkJYmZhX3N0YXRzKHJwLCBzbV9vZmZwX2RlbCk7CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV9kZWxldGVfcGVuZGluZyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUlBPUlRfU01fSFdGQUlMOgorCQliZmFfc3RhdHMocnAsIHNtX29mZnBfaHdmKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2lvY2Rpc2FibGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zdGF0cyhycCwgc21fb2ZmcF91bmV4cCk7CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIElPQyBoL3cgZmFpbGVkLgorICovCitzdGF0aWMgdm9pZAorYmZhX3Jwb3J0X3NtX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9ycG9ydF9zICpycCwgZW51bSBiZmFfcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycC0+YmZhLCBycC0+cnBvcnRfdGFnKTsKKwliZmFfdHJjKHJwLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9SUE9SVF9TTV9PRkZMSU5FOgorCQliZmFfc3RhdHMocnAsIHNtX2lvY2Rfb2ZmKTsKKwkJYmZhX3Jwb3J0X29mZmxpbmVfY2IocnApOworCQlicmVhazsKKworCWNhc2UgQkZBX1JQT1JUX1NNX0RFTEVURToKKwkJYmZhX3N0YXRzKHJwLCBzbV9pb2NkX2RlbCk7CisJCWJmYV9zbV9zZXRfc3RhdGUocnAsIGJmYV9ycG9ydF9zbV91bmluaXQpOworCQliZmFfcnBvcnRfZnJlZShycCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUlBPUlRfU01fT05MSU5FOgorCQliZmFfc3RhdHMocnAsIHNtX2lvY2Rfb24pOworCQlpZiAoYmZhX3Jwb3J0X3NlbmRfZndjcmVhdGUocnApKQorCQkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2Z3Y3JlYXRlKTsKKwkJZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX2Z3Y3JlYXRlX3FmdWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9SUE9SVF9TTV9IV0ZBSUw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3N0YXRzKHJwLCBzbV9pb2NkX3VuZXhwKTsKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKworCisvKioKKyAqICBiZmFfcnBvcnRfcHJpdmF0ZSBCRkEgcnBvcnQgcHJpdmF0ZSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZAorX19iZmFfY2JfcnBvcnRfb25saW5lKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfcnBvcnRfcyAqcnAgPSBjYmFyZzsKKworCWlmIChjb21wbGV0ZSkKKwkJYmZhX2NiX3Jwb3J0X29ubGluZShycC0+cnBvcnRfZHJ2KTsKK30KKworc3RhdGljIHZvaWQKK19fYmZhX2NiX3Jwb3J0X29mZmxpbmUodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCit7CisJc3RydWN0IGJmYV9ycG9ydF9zICpycCA9IGNiYXJnOworCisJaWYgKGNvbXBsZXRlKQorCQliZmFfY2JfcnBvcnRfb2ZmbGluZShycC0+cnBvcnRfZHJ2KTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9ycG9ydF9xcmVzdW1lKHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfcnBvcnRfcwkqcnAgPSBjYmFyZzsKKworCWJmYV9zbV9zZW5kX2V2ZW50KHJwLCBCRkFfUlBPUlRfU01fUVJFU1VNRSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHUzMiAqa21fbGVuLAorCQl1MzIgKmRtX2xlbikKK3sKKwlpZiAoY2ZnLT5md2NmZy5udW1fcnBvcnRzIDwgQkZBX1JQT1JUX01JTikKKwkJY2ZnLT5md2NmZy5udW1fcnBvcnRzID0gQkZBX1JQT1JUX01JTjsKKworCSprbV9sZW4gKz0gY2ZnLT5md2NmZy5udW1fcnBvcnRzICogc2l6ZW9mKHN0cnVjdCBiZmFfcnBvcnRfcyk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCSAgICAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKK3sKKwlzdHJ1Y3QgYmZhX3Jwb3J0X21vZF9zICptb2QgPSBCRkFfUlBPUlRfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9ycG9ydF9zICpycDsKKwl1MTYgICAgICAgIGk7CisKKwlJTklUX0xJU1RfSEVBRCgmbW9kLT5ycF9mcmVlX3EpOworCUlOSVRfTElTVF9IRUFEKCZtb2QtPnJwX2FjdGl2ZV9xKTsKKworCXJwID0gKHN0cnVjdCBiZmFfcnBvcnRfcyAqKSBiZmFfbWVtaW5mb19rdmEobWVtaW5mbyk7CisJbW9kLT5ycHNfbGlzdCA9IHJwOworCW1vZC0+bnVtX3Jwb3J0cyA9IGNmZy0+ZndjZmcubnVtX3Jwb3J0czsKKworCWJmYV9hc3NlcnQobW9kLT5udW1fcnBvcnRzCisJCSAgICYmICEobW9kLT5udW1fcnBvcnRzICYgKG1vZC0+bnVtX3Jwb3J0cyAtIDEpKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kLT5udW1fcnBvcnRzOyBpKyssIHJwKyspIHsKKwkJYmZhX29zX21lbXNldChycCwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfcnBvcnRfcykpOworCQlycC0+YmZhID0gYmZhOworCQlycC0+cnBvcnRfdGFnID0gaTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX3VuaW5pdCk7CisKKwkJLyoqCisJCSAqICAtIGlzIHVudXNlZAorCQkgKi8KKwkJaWYgKGkpCisJCQlsaXN0X2FkZF90YWlsKCZycC0+cWUsICZtb2QtPnJwX2ZyZWVfcSk7CisKKwkJYmZhX3JlcXFfd2luaXQoJnJwLT5yZXFxX3dhaXQsIGJmYV9ycG9ydF9xcmVzdW1lLCBycCk7CisJfQorCisJLyoqCisJICogY29uc3VtZSBtZW1vcnkKKwkgKi8KKwliZmFfbWVtaW5mb19rdmEobWVtaW5mbykgPSAodTggKikgcnA7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfaW5pdGRvbmUoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfZGV0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX3Jwb3J0X3N0YXJ0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX3Jwb3J0X3N0b3Aoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcnBvcnRfaW9jZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX3Jwb3J0X21vZF9zICptb2QgPSBCRkFfUlBPUlRfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqcWUsICpxZW47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJm1vZC0+cnBfYWN0aXZlX3EpIHsKKwkJcnBvcnQgPSAoc3RydWN0IGJmYV9ycG9ydF9zICopIHFlOworCQliZmFfc21fc2VuZF9ldmVudChycG9ydCwgQkZBX1JQT1JUX1NNX0hXRkFJTCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGJmYV9ycG9ydF9zICoKK2JmYV9ycG9ydF9hbGxvYyhzdHJ1Y3QgYmZhX3Jwb3J0X21vZF9zICptb2QpCit7CisJc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydDsKKworCWJmYV9xX2RlcSgmbW9kLT5ycF9mcmVlX3EsICZycG9ydCk7CisJaWYgKHJwb3J0KQorCQlsaXN0X2FkZF90YWlsKCZycG9ydC0+cWUsICZtb2QtPnJwX2FjdGl2ZV9xKTsKKworCXJldHVybiAocnBvcnQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX3Jwb3J0X2ZyZWUoc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydCkKK3sKKwlzdHJ1Y3QgYmZhX3Jwb3J0X21vZF9zICptb2QgPSBCRkFfUlBPUlRfTU9EKHJwb3J0LT5iZmEpOworCisJYmZhX2Fzc2VydChiZmFfcV9pc19vbl9xKCZtb2QtPnJwX2FjdGl2ZV9xLCBycG9ydCkpOworCWxpc3RfZGVsKCZycG9ydC0+cWUpOworCWxpc3RfYWRkX3RhaWwoJnJwb3J0LT5xZSwgJm1vZC0+cnBfZnJlZV9xKTsKK30KKworc3RhdGljIGJmYV9ib29sZWFuX3QKK2JmYV9ycG9ydF9zZW5kX2Z3Y3JlYXRlKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnApCit7CisJc3RydWN0IGJmaV9ycG9ydF9jcmVhdGVfcmVxX3MgKm07CisKKwkvKioKKwkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CisJICovCisJbSA9IGJmYV9yZXFxX25leHQocnAtPmJmYSwgQkZBX1JFUVFfUlBPUlQpOworCWlmICghbSkgeworCQliZmFfcmVxcV93YWl0KHJwLT5iZmEsIEJGQV9SRVFRX1JQT1JULCAmcnAtPnJlcXFfd2FpdCk7CisJCXJldHVybiBCRkFfRkFMU0U7CisJfQorCisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19SUE9SVCwgQkZJX1JQT1JUX0gySV9DUkVBVEVfUkVRLAorCQkJYmZhX2xwdWlkKHJwLT5iZmEpKTsKKwltLT5iZmFfaGFuZGxlID0gcnAtPnJwb3J0X3RhZzsKKwltLT5tYXhfZnJtc3ogPSBiZmFfb3NfaHRvbnMocnAtPnJwb3J0X2luZm8ubWF4X2ZybXN6KTsKKwltLT5waWQgPSBycC0+cnBvcnRfaW5mby5waWQ7CisJbS0+bHBfdGFnID0gcnAtPnJwb3J0X2luZm8ubHBfdGFnOworCW0tPmxvY2FsX3BpZCA9IHJwLT5ycG9ydF9pbmZvLmxvY2FsX3BpZDsKKwltLT5mY19jbGFzcyA9IHJwLT5ycG9ydF9pbmZvLmZjX2NsYXNzOworCW0tPnZmX2VuID0gcnAtPnJwb3J0X2luZm8udmZfZW47CisJbS0+dmZfaWQgPSBycC0+cnBvcnRfaW5mby52Zl9pZDsKKwltLT5jaXNjID0gcnAtPnJwb3J0X2luZm8uY2lzYzsKKworCS8qKgorCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCisJICovCisJYmZhX3JlcXFfcHJvZHVjZShycC0+YmZhLCBCRkFfUkVRUV9SUE9SVCk7CisJcmV0dXJuIEJGQV9UUlVFOworfQorCitzdGF0aWMgYmZhX2Jvb2xlYW5fdAorYmZhX3Jwb3J0X3NlbmRfZndkZWxldGUoc3RydWN0IGJmYV9ycG9ydF9zICpycCkKK3sKKwlzdHJ1Y3QgYmZpX3Jwb3J0X2RlbGV0ZV9yZXFfcyAqbTsKKworCS8qKgorCSAqIGNoZWNrIGZvciByb29tIGluIHF1ZXVlIHRvIHNlbmQgcmVxdWVzdCBub3cKKwkgKi8KKwltID0gYmZhX3JlcXFfbmV4dChycC0+YmZhLCBCRkFfUkVRUV9SUE9SVCk7CisJaWYgKCFtKSB7CisJCWJmYV9yZXFxX3dhaXQocnAtPmJmYSwgQkZBX1JFUVFfUlBPUlQsICZycC0+cmVxcV93YWl0KTsKKwkJcmV0dXJuIEJGQV9GQUxTRTsKKwl9CisKKwliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX1JQT1JULCBCRklfUlBPUlRfSDJJX0RFTEVURV9SRVEsCisJCQliZmFfbHB1aWQocnAtPmJmYSkpOworCW0tPmZ3X2hhbmRsZSA9IHJwLT5md19oYW5kbGU7CisKKwkvKioKKwkgKiBxdWV1ZSBJL08gbWVzc2FnZSB0byBmaXJtd2FyZQorCSAqLworCWJmYV9yZXFxX3Byb2R1Y2UocnAtPmJmYSwgQkZBX1JFUVFfUlBPUlQpOworCXJldHVybiBCRkFfVFJVRTsKK30KKworc3RhdGljIGJmYV9ib29sZWFuX3QKK2JmYV9ycG9ydF9zZW5kX2Z3c3BlZWQoc3RydWN0IGJmYV9ycG9ydF9zICpycCkKK3sKKwlzdHJ1Y3QgYmZhX3Jwb3J0X3NwZWVkX3JlcV9zICptOworCisJLyoqCisJICogY2hlY2sgZm9yIHJvb20gaW4gcXVldWUgdG8gc2VuZCByZXF1ZXN0IG5vdworCSAqLworCW0gPSBiZmFfcmVxcV9uZXh0KHJwLT5iZmEsIEJGQV9SRVFRX1JQT1JUKTsKKwlpZiAoIW0pIHsKKwkJYmZhX3RyYyhycC0+YmZhLCBycC0+cnBvcnRfaW5mby5zcGVlZCk7CisJCXJldHVybiBCRkFfRkFMU0U7CisJfQorCisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19SUE9SVCwgQkZJX1JQT1JUX0gySV9TRVRfU1BFRURfUkVRLAorCQkJYmZhX2xwdWlkKHJwLT5iZmEpKTsKKwltLT5md19oYW5kbGUgPSBycC0+ZndfaGFuZGxlOworCW0tPnNwZWVkID0gKHU4KXJwLT5ycG9ydF9pbmZvLnNwZWVkOworCisJLyoqCisJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKKwkgKi8KKwliZmFfcmVxcV9wcm9kdWNlKHJwLT5iZmEsIEJGQV9SRVFRX1JQT1JUKTsKKwlyZXR1cm4gQkZBX1RSVUU7Cit9CisKKworCisvKioKKyAqICBiZmFfcnBvcnRfcHVibGljCisgKi8KKworLyoqCisgKiAJCVJwb3J0IGludGVycnVwdCBwcm9jZXNzaW5nLgorICovCit2b2lkCitiZmFfcnBvcnRfaXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKQoreworCXVuaW9uIGJmaV9ycG9ydF9pMmhfbXNnX3UgbXNnOworCXN0cnVjdCBiZmFfcnBvcnRfcyAqcnA7CisKKwliZmFfdHJjKGJmYSwgbS0+bWhkci5tc2dfaWQpOworCisJbXNnLm1zZyA9IG07CisKKwlzd2l0Y2ggKG0tPm1oZHIubXNnX2lkKSB7CisJY2FzZSBCRklfUlBPUlRfSTJIX0NSRUFURV9SU1A6CisJCXJwID0gQkZBX1JQT1JUX0ZST01fVEFHKGJmYSwgbXNnLmNyZWF0ZV9yc3AtPmJmYV9oYW5kbGUpOworCQlycC0+ZndfaGFuZGxlID0gbXNnLmNyZWF0ZV9yc3AtPmZ3X2hhbmRsZTsKKwkJcnAtPnFvc19hdHRyID0gbXNnLmNyZWF0ZV9yc3AtPnFvc19hdHRyOworCQliZmFfYXNzZXJ0KG1zZy5jcmVhdGVfcnNwLT5zdGF0dXMgPT0gQkZBX1NUQVRVU19PSyk7CisJCWJmYV9zbV9zZW5kX2V2ZW50KHJwLCBCRkFfUlBPUlRfU01fRldSU1ApOworCQlicmVhazsKKworCWNhc2UgQkZJX1JQT1JUX0kySF9ERUxFVEVfUlNQOgorCQlycCA9IEJGQV9SUE9SVF9GUk9NX1RBRyhiZmEsIG1zZy5kZWxldGVfcnNwLT5iZmFfaGFuZGxlKTsKKwkJYmZhX2Fzc2VydChtc2cuZGVsZXRlX3JzcC0+c3RhdHVzID09IEJGQV9TVEFUVVNfT0spOworCQliZmFfc21fc2VuZF9ldmVudChycCwgQkZBX1JQT1JUX1NNX0ZXUlNQKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGSV9SUE9SVF9JMkhfUU9TX1NDTjoKKwkJcnAgPSBCRkFfUlBPUlRfRlJPTV9UQUcoYmZhLCBtc2cucW9zX3Njbl9ldnQtPmJmYV9oYW5kbGUpOworCQlycC0+ZXZlbnRfYXJnLmZ3X21zZyA9IG1zZy5xb3Nfc2NuX2V2dDsKKwkJYmZhX3NtX3NlbmRfZXZlbnQocnAsIEJGQV9SUE9SVF9TTV9RT1NfU0NOKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfdHJjKGJmYSwgbS0+bWhkci5tc2dfaWQpOworCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisKKy8qKgorICogIGJmYV9ycG9ydF9hcGkKKyAqLworCitzdHJ1Y3QgYmZhX3Jwb3J0X3MgKgorYmZhX3Jwb3J0X2NyZWF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqcnBvcnRfZHJ2KQoreworCXN0cnVjdCBiZmFfcnBvcnRfcyAqcnA7CisKKwlycCA9IGJmYV9ycG9ydF9hbGxvYyhCRkFfUlBPUlRfTU9EKGJmYSkpOworCisJaWYgKHJwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlycC0+YmZhID0gYmZhOworCXJwLT5ycG9ydF9kcnYgPSBycG9ydF9kcnY7CisJYmZhX3Jwb3J0X2NsZWFyX3N0YXRzKHJwKTsKKworCWJmYV9hc3NlcnQoYmZhX3NtX2NtcF9zdGF0ZShycCwgYmZhX3Jwb3J0X3NtX3VuaW5pdCkpOworCWJmYV9zbV9zZW5kX2V2ZW50KHJwLCBCRkFfUlBPUlRfU01fQ1JFQVRFKTsKKworCXJldHVybiAocnApOworfQorCit2b2lkCitiZmFfcnBvcnRfZGVsZXRlKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIEJGQV9SUE9SVF9TTV9ERUxFVEUpOworfQorCit2b2lkCitiZmFfcnBvcnRfb25saW5lKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQsIHN0cnVjdCBiZmFfcnBvcnRfaW5mb19zICpycG9ydF9pbmZvKQoreworCWJmYV9hc3NlcnQocnBvcnRfaW5mby0+bWF4X2ZybXN6ICE9IDApOworCisJLyoqCisJICogU29tZSBKQk9EcyBhcmUgc2VlbiB0byBiZSBub3Qgc2V0dGluZyBQRFUgc2l6ZSBjb3JyZWN0bHkgaW4gUExPR0kKKwkgKiByZXNwb25zZXMuIERlZmF1bHQgdG8gbWluaW11bSBzaXplLgorCSAqLworCWlmIChycG9ydF9pbmZvLT5tYXhfZnJtc3ogPT0gMCkgeworCQliZmFfdHJjKHJwb3J0LT5iZmEsIHJwb3J0LT5ycG9ydF90YWcpOworCQlycG9ydF9pbmZvLT5tYXhfZnJtc3ogPSBGQ19NSU5fUERVU1o7CisJfQorCisJYmZhX29zX2Fzc2lnbihycG9ydC0+cnBvcnRfaW5mbywgKnJwb3J0X2luZm8pOworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBCRkFfUlBPUlRfU01fT05MSU5FKTsKK30KKwordm9pZAorYmZhX3Jwb3J0X29mZmxpbmUoc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydCkKK3sKKwliZmFfc21fc2VuZF9ldmVudChycG9ydCwgQkZBX1JQT1JUX1NNX09GRkxJTkUpOworfQorCit2b2lkCitiZmFfcnBvcnRfc3BlZWQoc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydCwgZW51bSBiZmFfcHBvcnRfc3BlZWQgc3BlZWQpCit7CisJYmZhX2Fzc2VydChzcGVlZCAhPSAwKTsKKwliZmFfYXNzZXJ0KHNwZWVkICE9IEJGQV9QUE9SVF9TUEVFRF9BVVRPKTsKKworCXJwb3J0LT5ycG9ydF9pbmZvLnNwZWVkID0gc3BlZWQ7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIEJGQV9SUE9SVF9TTV9TRVRfU1BFRUQpOworfQorCit2b2lkCitiZmFfcnBvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQsCisJc3RydWN0IGJmYV9ycG9ydF9oYWxfc3RhdHNfcyAqc3RhdHMpCit7CisJKnN0YXRzID0gcnBvcnQtPnN0YXRzOworfQorCit2b2lkCitiZmFfcnBvcnRfZ2V0X3Fvc19hdHRyKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQsCisJCQkJCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyAqcW9zX2F0dHIpCit7CisJcW9zX2F0dHItPnFvc19wcmlvcml0eSAgPSBiZmFfb3NfbnRvaGwocnBvcnQtPnFvc19hdHRyLnFvc19wcmlvcml0eSk7CisJcW9zX2F0dHItPnFvc19mbG93X2lkICA9IGJmYV9vc19udG9obChycG9ydC0+cW9zX2F0dHIucW9zX2Zsb3dfaWQpOworCit9CisKK3ZvaWQKK2JmYV9ycG9ydF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0KQoreworCWJmYV9vc19tZW1zZXQoJnJwb3J0LT5zdGF0cywgMCwgc2l6ZW9mKHJwb3J0LT5zdGF0cykpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Jwb3J0X3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Jwb3J0X3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDkwY2UyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfcnBvcnRfcHJpdi5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9SUE9SVF9QUklWX0hfXworI2RlZmluZSBfX0JGQV9SUE9SVF9QUklWX0hfXworCisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorCisjZGVmaW5lIEJGQV9SUE9SVF9NSU4JNAorCitzdHJ1Y3QgYmZhX3Jwb3J0X21vZF9zIHsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwc19saXN0OwkvKiAgbGlzdCBvZiBycG9ydHMJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIAlycF9mcmVlX3E7CS8qICBmcmVlIGJmYV9ycG9ydHMJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIAlycF9hY3RpdmVfcTsJLyogIGZyZWUgYmZhX3Jwb3J0cyAJKi8KKwl1MTYJbnVtX3Jwb3J0czsJLyogIG51bWJlciBvZiBycG9ydHMJKi8KK307CisKKyNkZWZpbmUgQkZBX1JQT1JUX01PRChfX2JmYSkJKCYoX19iZmEpLT5tb2R1bGVzLnJwb3J0X21vZCkKKworLyoqCisgKiBDb252ZXJ0IHJwb3J0IHRhZyB0byBSUE9SVAorICovCisjZGVmaW5lIEJGQV9SUE9SVF9GUk9NX1RBRyhfX2JmYSwgX3RhZykJCQkJXAorCShCRkFfUlBPUlRfTU9EKF9fYmZhKS0+cnBzX2xpc3QgKwkJCQlcCisJICgoX3RhZykgJiAoQkZBX1JQT1JUX01PRChfX2JmYSktPm51bV9ycG9ydHMgLSAxKSkpCisKKy8qCisgKiBleHRlcm5hbCBmdW5jdGlvbnMKKyAqLwordm9pZAliZmFfcnBvcnRfaXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptc2cpOworI2VuZGlmIC8qIF9fQkZBX1JQT1JUX1BSSVZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zZ3BnLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zZ3BnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5ZDhmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3NncGcuYwpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YmZhLmg+CisKK0JGQV9UUkNfRklMRShIQUwsIFNHUEcpOworQkZBX01PRFVMRShzZ3BnKTsKKworLyoqCisgKiAgYmZhX3NncGdfbW9kIEJGQSBTR1BHIE1vZGUgbW9kdWxlCisgKi8KKworLyoqCisgKiBDb21wdXRlIGFuZCByZXR1cm4gbWVtb3J5IG5lZWRlZCBieSBGQ1AoaW0pIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9zZ3BnX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKKwkJdTMyICpkbV9sZW4pCit7CisJaWYgKGNmZy0+ZHJ2Y2ZnLm51bV9zZ3BncyA8IEJGQV9TR1BHX01JTikKKwkJY2ZnLT5kcnZjZmcubnVtX3NncGdzID0gQkZBX1NHUEdfTUlOOworCisJKmttX2xlbiArPSAoY2ZnLT5kcnZjZmcubnVtX3NncGdzICsgMSkgKiBzaXplb2Yoc3RydWN0IGJmYV9zZ3BnX3MpOworCSpkbV9sZW4gKz0gKGNmZy0+ZHJ2Y2ZnLm51bV9zZ3BncyArIDEpICogc2l6ZW9mKHN0cnVjdCBiZmlfc2dwZ19zKTsKK30KKworCitzdGF0aWMgdm9pZAorYmZhX3NncGdfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCSAgICBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKK3sKKwlzdHJ1Y3QgYmZhX3NncGdfbW9kX3MJKm1vZCA9IEJGQV9TR1BHX01PRChiZmEpOworCWludAkJCQlpOworCXN0cnVjdCBiZmFfc2dwZ19zCQkqaHNncGc7CisJc3RydWN0IGJmaV9zZ3BnX3MgCSpzZ3BnOworCXU2NAkJYWxpZ25fbGVuOworCisJdW5pb24geworCQl1NjQgICAgICAgIHBhOworCQl1bmlvbiBiZmlfYWRkcl91ICAgICAgYWRkcjsKKwl9IHNncGdfcGE7CisKKwlJTklUX0xJU1RfSEVBRCgmbW9kLT5zZ3BnX3EpOworCUlOSVRfTElTVF9IRUFEKCZtb2QtPnNncGdfd2FpdF9xKTsKKworCWJmYV90cmMoYmZhLCBjZmctPmRydmNmZy5udW1fc2dwZ3MpOworCisJbW9kLT5udW1fc2dwZ3MgPSBjZmctPmRydmNmZy5udW1fc2dwZ3M7CisJbW9kLT5zZ3BnX2Fycl9wYSA9IGJmYV9tZW1pbmZvX2RtYV9waHlzKG1pbmZvKTsKKwlhbGlnbl9sZW4gPSAoQkZBX1NHUEdfUk9VTkRVUChtb2QtPnNncGdfYXJyX3BhKSAtIG1vZC0+c2dwZ19hcnJfcGEpOworCW1vZC0+c2dwZ19hcnJfcGEgKz0gYWxpZ25fbGVuOworCW1vZC0+aHNncGdfYXJyID0gKHN0cnVjdCBiZmFfc2dwZ19zICopIChiZmFfbWVtaW5mb19rdmEobWluZm8pICsKKwkJCQkJCWFsaWduX2xlbik7CisJbW9kLT5zZ3BnX2FyciA9IChzdHJ1Y3QgYmZpX3NncGdfcyAqKSAoYmZhX21lbWluZm9fZG1hX3ZpcnQobWluZm8pICsKKwkJCQkJCWFsaWduX2xlbik7CisKKwloc2dwZyA9IG1vZC0+aHNncGdfYXJyOworCXNncGcgPSBtb2QtPnNncGdfYXJyOworCXNncGdfcGEucGEgPSBtb2QtPnNncGdfYXJyX3BhOworCW1vZC0+ZnJlZV9zZ3BncyA9IG1vZC0+bnVtX3NncGdzOworCisJYmZhX2Fzc2VydCghKHNncGdfcGEucGEgJiAoc2l6ZW9mKHN0cnVjdCBiZmlfc2dwZ19zKSAtIDEpKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kLT5udW1fc2dwZ3M7IGkrKykgeworCQliZmFfb3NfbWVtc2V0KGhzZ3BnLCAwLCBzaXplb2YoKmhzZ3BnKSk7CisJCWJmYV9vc19tZW1zZXQoc2dwZywgMCwgc2l6ZW9mKCpzZ3BnKSk7CisKKwkJaHNncGctPnNncGcgPSBzZ3BnOworCQloc2dwZy0+c2dwZ19wYSA9IHNncGdfcGEuYWRkcjsKKwkJbGlzdF9hZGRfdGFpbCgmaHNncGctPnFlLCAmbW9kLT5zZ3BnX3EpOworCisJCWhzZ3BnKys7CisJCXNncGcrKzsKKwkJc2dwZ19wYS5wYSArPSBzaXplb2Yoc3RydWN0IGJmaV9zZ3BnX3MpOworCX0KKworCWJmYV9tZW1pbmZvX2t2YShtaW5mbykgPSAodTggKikgaHNncGc7CisJYmZhX21lbWluZm9fZG1hX3ZpcnQobWluZm8pID0gKHU4ICopIHNncGc7CisJYmZhX21lbWluZm9fZG1hX3BoeXMobWluZm8pID0gc2dwZ19wYS5wYTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9zZ3BnX2luaXRkb25lKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX3NncGdfZGV0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX3NncGdfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfc2dwZ19zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX3NncGdfaW9jZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworCisKKy8qKgorICogIGJmYV9zZ3BnX3B1YmxpYyBCRkEgU0dQRyBwdWJsaWMgZnVuY3Rpb25zCisgKi8KKworYmZhX3N0YXR1c190CitiZmFfc2dwZ19tYWxsb2Moc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBsaXN0X2hlYWQgKnNncGdfcSwgaW50IG5zZ3BncykKK3sKKwlzdHJ1Y3QgYmZhX3NncGdfbW9kX3MgKm1vZCA9IEJGQV9TR1BHX01PRChiZmEpOworCXN0cnVjdCBiZmFfc2dwZ19zICpoc2dwZzsKKwlpbnQgICAgICAgICAgICAgaTsKKworCWJmYV90cmNfZnAoYmZhLCBuc2dwZ3MpOworCisJaWYgKG1vZC0+ZnJlZV9zZ3BncyA8IG5zZ3BncykKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG5zZ3BnczsgaSsrKSB7CisJCWJmYV9xX2RlcSgmbW9kLT5zZ3BnX3EsICZoc2dwZyk7CisJCWJmYV9hc3NlcnQoaHNncGcpOworCQlsaXN0X2FkZF90YWlsKCZoc2dwZy0+cWUsIHNncGdfcSk7CisJfQorCisJbW9kLT5mcmVlX3NncGdzIC09IG5zZ3BnczsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKwordm9pZAorYmZhX3NncGdfbWZyZWUoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBsaXN0X2hlYWQgKnNncGdfcSwgaW50IG5zZ3BnKQoreworCXN0cnVjdCBiZmFfc2dwZ19tb2RfcyAqbW9kID0gQkZBX1NHUEdfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9zZ3BnX3dxZV9zICp3cWU7CisKKwliZmFfdHJjX2ZwKGJmYSwgbnNncGcpOworCisJbW9kLT5mcmVlX3NncGdzICs9IG5zZ3BnOworCWJmYV9hc3NlcnQobW9kLT5mcmVlX3NncGdzIDw9IG1vZC0+bnVtX3NncGdzKTsKKworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdChzZ3BnX3EsICZtb2QtPnNncGdfcSk7CisKKwlpZiAobGlzdF9lbXB0eSgmbW9kLT5zZ3BnX3dhaXRfcSkpCisJCXJldHVybjsKKworCS8qKgorCSAqIHNhdGlzZnkgYXMgbWFueSB3YWl0aW5nIHJlcXVlc3RzIGFzIHBvc3NpYmxlCisJICovCisJZG8geworCQl3cWUgPSBiZmFfcV9maXJzdCgmbW9kLT5zZ3BnX3dhaXRfcSk7CisJCWlmIChtb2QtPmZyZWVfc2dwZ3MgPCB3cWUtPm5zZ3BnKQorCQkJbnNncGcgPSBtb2QtPmZyZWVfc2dwZ3M7CisJCWVsc2UKKwkJCW5zZ3BnID0gd3FlLT5uc2dwZzsKKwkJYmZhX3NncGdfbWFsbG9jKGJmYSwgJndxZS0+c2dwZ19xLCBuc2dwZyk7CisJCXdxZS0+bnNncGcgLT0gbnNncGc7CisJCWlmICh3cWUtPm5zZ3BnID09IDApIHsKKwkJCWxpc3RfZGVsKCZ3cWUtPnFlKTsKKwkJCXdxZS0+Y2Jmbih3cWUtPmNiYXJnKTsKKwkJfQorCX0gd2hpbGUgKG1vZC0+ZnJlZV9zZ3BncyAmJiAhbGlzdF9lbXB0eSgmbW9kLT5zZ3BnX3dhaXRfcSkpOworfQorCit2b2lkCitiZmFfc2dwZ193YWl0KHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3NncGdfd3FlX3MgKndxZSwgaW50IG5zZ3BnKQoreworCXN0cnVjdCBiZmFfc2dwZ19tb2RfcyAqbW9kID0gQkZBX1NHUEdfTU9EKGJmYSk7CisKKwliZmFfYXNzZXJ0KG5zZ3BnID4gMCk7CisJYmZhX2Fzc2VydChuc2dwZyA+IG1vZC0+ZnJlZV9zZ3Bncyk7CisKKwl3cWUtPm5zZ3BnX3RvdGFsID0gd3FlLT5uc2dwZyA9IG5zZ3BnOworCisJLyoqCisJICogYWxsb2NhdGUgYW55IGxlZnQgdG8gdGhpcyBvbmUgZmlyc3QKKwkgKi8KKwlpZiAobW9kLT5mcmVlX3NncGdzKSB7CisJCS8qKgorCQkgKiBubyBvbmUgZWxzZSBpcyB3YWl0aW5nIGZvciBTR1BHCisJCSAqLworCQliZmFfYXNzZXJ0KGxpc3RfZW1wdHkoJm1vZC0+c2dwZ193YWl0X3EpKTsKKwkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZtb2QtPnNncGdfcSwgJndxZS0+c2dwZ19xKTsKKwkJd3FlLT5uc2dwZyAtPSBtb2QtPmZyZWVfc2dwZ3M7CisJCW1vZC0+ZnJlZV9zZ3BncyA9IDA7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmd3FlLT5xZSwgJm1vZC0+c2dwZ193YWl0X3EpOworfQorCit2b2lkCitiZmFfc2dwZ193Y2FuY2VsKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3NncGdfd3FlX3MgKndxZSkKK3sKKwlzdHJ1Y3QgYmZhX3NncGdfbW9kX3MgKm1vZCA9IEJGQV9TR1BHX01PRChiZmEpOworCisJYmZhX2Fzc2VydChiZmFfcV9pc19vbl9xKCZtb2QtPnNncGdfd2FpdF9xLCB3cWUpKTsKKwlsaXN0X2RlbCgmd3FlLT5xZSk7CisKKwlpZiAod3FlLT5uc2dwZ190b3RhbCAhPSB3cWUtPm5zZ3BnKQorCQliZmFfc2dwZ19tZnJlZShiZmEsICZ3cWUtPnNncGdfcSwKKwkJCQkgICB3cWUtPm5zZ3BnX3RvdGFsIC0gd3FlLT5uc2dwZyk7Cit9CisKK3ZvaWQKK2JmYV9zZ3BnX3dpbml0KHN0cnVjdCBiZmFfc2dwZ193cWVfcyAqd3FlLCB2b2lkICgqY2JmbikgKHZvaWQgKmNiYXJnKSwKKwkJICAgdm9pZCAqY2JhcmcpCit7CisJSU5JVF9MSVNUX0hFQUQoJndxZS0+c2dwZ19xKTsKKwl3cWUtPmNiZm4gPSBjYmZuOworCXdxZS0+Y2JhcmcgPSBjYmFyZzsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zZ3BnX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3NncGdfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMmE4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zZ3BnX3ByaXYuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIGhhbF9zZ3BnLmggQkZBIFNHIHBhZ2UgbW9kdWxlCisgKi8KKworI2lmbmRlZiBfX0JGQV9TR1BHX1BSSVZfSF9fCisjZGVmaW5lIF9fQkZBX1NHUEdfUFJJVl9IX18KKworI2luY2x1ZGUgPGNzL2JmYV9xLmg+CisKKyNkZWZpbmUgQkZBX1NHUEdfTUlOCSgxNikKKworLyoqCisgKiBBbGlnbm1lbnQgbWFjcm8gZm9yIFNHIHBhZ2UgYWxsb2NhdGlvbgorICovCisjZGVmaW5lIEJGQV9TR1BHX1JPVU5EVVAoX2wpICgoKF9sKSArIChzaXplb2Yoc3RydWN0IGJmaV9zZ3BnX3MpIC0gMSkpIFwKKwkJCSYgfihzaXplb2Yoc3RydWN0IGJmaV9zZ3BnX3MpIC0gMSkpCisKK3N0cnVjdCBiZmFfc2dwZ193cWVfcyB7CisJc3RydWN0IGxpc3RfaGVhZCBxZTsJLyogIHF1ZXVlIHNnIHBhZ2UgZWxlbWVudAkqLworCWludAluc2dwZzsJCS8qICBwYWdlcyB0byBiZSBhbGxvY2F0ZWQJKi8KKwlpbnQJbnNncGdfdG90YWw7CS8qICB0b3RhbCBwYWdlcyByZXF1aXJlZAkqLworCXZvaWQJKCpjYmZuKSAodm9pZCAqY2JhcmcpOworCQkJCS8qICBjYWxsYmFjayBmdW5jdGlvbgkJKi8KKwl2b2lkCSpjYmFyZzsJCS8qICBjYWxsYmFjayBhcmcJCSovCisJc3RydWN0IGxpc3RfaGVhZCBzZ3BnX3E7CS8qICBxdWV1ZSBvZiBhbGxvY2VkIHNncGdzCSovCit9OworCitzdHJ1Y3QgYmZhX3NncGdfcyB7CisJc3RydWN0IGxpc3RfaGVhZCAJcWU7CS8qICBxdWV1ZSBzZyBwYWdlIGVsZW1lbnQJKi8KKwlzdHJ1Y3QgYmZpX3NncGdfcyAqc2dwZzsgLyogIHZhIG9mIFNHIHBhZ2UJCSovCisJdW5pb24gYmZpX2FkZHJfdSBzZ3BnX3BhOy8qICBwYSBvZiBTRyBwYWdlCQkqLworfTsKKworLyoqCisgKiBHaXZlbiBudW1iZXIgb2YgU0cgZWxlbWVudHMsIEJGQV9TR1BHX05QQUdFKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgKiBTRyBwYWdlcyByZXF1aXJlZC4KKyAqLworI2RlZmluZSBCRkFfU0dQR19OUEFHRShfbnNnZXMpICAoKChfbnNnZXMpIC8gQkZJX1NHUEdfREFUQV9TR0VTKSArIDEpCisKK3N0cnVjdCBiZmFfc2dwZ19tb2RfcyB7CisJc3RydWN0IGJmYV9zICpiZmE7CisJaW50CQludW1fc2dwZ3M7CS8qICBudW1iZXIgb2YgU0cgcGFnZXMJCSovCisJaW50CQlmcmVlX3NncGdzOwkvKiAgbnVtYmVyIG9mIGZyZWUgU0cgcGFnZXMJKi8KKwlzdHJ1Y3QgYmZhX3NncGdfcyAqaHNncGdfYXJyOwkvKiAgQkZBIFNHIHBhZ2UgYXJyYXkJKi8KKwlzdHJ1Y3QgYmZpX3NncGdfcyAqc2dwZ19hcnI7CS8qICBhY3R1YWwgU0cgcGFnZSBhcnJheQkqLworCXU2NAlzZ3BnX2Fycl9wYTsJLyogIFNHIHBhZ2UgYXJyYXkgRE1BIGFkZHIJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNncGdfcTsJLyogIHF1ZXVlIG9mIGZyZWUgU0cgcGFnZXMJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNncGdfd2FpdF9xOyAvKiAgd2FpdCBxdWV1ZSBmb3IgU0cgcGFnZXMJKi8KK307CisjZGVmaW5lIEJGQV9TR1BHX01PRChfX2JmYSkJKCYoX19iZmEpLT5tb2R1bGVzLnNncGdfbW9kKQorCitiZmFfc3RhdHVzX3QJYmZhX3NncGdfbWFsbG9jKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgbGlzdF9oZWFkICpzZ3BnX3EsCisJCQkJCQkJCWludCBuc2dwZ3MpOwordm9pZAkJYmZhX3NncGdfbWZyZWUoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBsaXN0X2hlYWQgKnNncGdfcSwKKwkJCQkJCQkJaW50IG5zZ3Bncyk7Cit2b2lkCQliZmFfc2dwZ193aW5pdChzdHJ1Y3QgYmZhX3NncGdfd3FlX3MgKndxZSwKKwkJCQkgICB2b2lkICgqY2JmbikgKHZvaWQgKmNiYXJnKSwgdm9pZCAqY2JhcmcpOwordm9pZAkJYmZhX3NncGdfd2FpdChzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9zZ3BnX3dxZV9zICp3cWUsCisJCQkJCQkJCWludCBuc2dwZ3MpOwordm9pZAkJYmZhX3NncGdfd2NhbmNlbChzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9zZ3BnX3dxZV9zICp3cWUpOworCisjZW5kaWYgLyogX19CRkFfU0dQR19QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfc20uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyMGY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3NtLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFzbS5jIEJGQSBTdGF0ZSBtYWNoaW5lIHV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgPGNzL2JmYV9zbS5oPgorCisvKioKKyAqICBjc19zbV9hcGkKKyAqLworCitpbnQKK2JmYV9zbV90b19zdGF0ZShzdHJ1Y3QgYmZhX3NtX3RhYmxlX3MgKnNtdCwgYmZhX3NtX3Qgc20pCit7CisJaW50ICAgICAgICAgICAgIGkgPSAwOworCisJd2hpbGUgKHNtdFtpXS5zbSAmJiBzbXRbaV0uc20gIT0gc20pCisJCWkrKzsKKwlyZXR1cm4gc210W2ldLnN0YXRlOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3RpbWVyLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzY0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV90aW1lci5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYV90aW1lci5oPgorI2luY2x1ZGUgPGNzL2JmYV9kZWJ1Zy5oPgorCit2b2lkCitiZmFfdGltZXJfaW5pdChzdHJ1Y3QgYmZhX3RpbWVyX21vZF9zICptb2QpCit7CisJSU5JVF9MSVNUX0hFQUQoJm1vZC0+dGltZXJfcSk7Cit9CisKK3ZvaWQKK2JmYV90aW1lcl9iZWF0KHN0cnVjdCBiZmFfdGltZXJfbW9kX3MgKm1vZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqcWggPSAmbW9kLT50aW1lcl9xOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICpxZSwgKnFlX25leHQ7CisJc3RydWN0IGJmYV90aW1lcl9zICplbGVtOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICB0aW1lZG91dF9xOworCisJSU5JVF9MSVNUX0hFQUQoJnRpbWVkb3V0X3EpOworCisJcWUgPSBiZmFfcV9uZXh0KHFoKTsKKworCXdoaWxlIChxZSAhPSBxaCkgeworCQlxZV9uZXh0ID0gYmZhX3FfbmV4dChxZSk7CisKKwkJZWxlbSA9IChzdHJ1Y3QgYmZhX3RpbWVyX3MgKikgcWU7CisJCWlmIChlbGVtLT50aW1lb3V0IDw9IEJGQV9USU1FUl9GUkVRKSB7CisJCQllbGVtLT50aW1lb3V0ID0gMDsKKwkJCWxpc3RfZGVsKCZlbGVtLT5xZSk7CisJCQlsaXN0X2FkZF90YWlsKCZlbGVtLT5xZSwgJnRpbWVkb3V0X3EpOworCQl9IGVsc2UgeworCQkJZWxlbS0+dGltZW91dCAtPSBCRkFfVElNRVJfRlJFUTsKKwkJfQorCisJCXFlID0gcWVfbmV4dDsJLyogZ28gdG8gbmV4dCBlbGVtICovCisJfQorCisJLyoKKwkgKiBQb3AgYWxsIHRoZSB0aW1lb3V0IGVudHJpZXMKKwkgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnRpbWVkb3V0X3EpKSB7CisJCWJmYV9xX2RlcSgmdGltZWRvdXRfcSwgJmVsZW0pOworCQllbGVtLT50aW1lcmNiKGVsZW0tPmFyZyk7CisJfQorfQorCisvKioKKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrIHByb3RlY3Rpb24KKyAqLwordm9pZAorYmZhX3RpbWVyX2JlZ2luKHN0cnVjdCBiZmFfdGltZXJfbW9kX3MgKm1vZCwgc3RydWN0IGJmYV90aW1lcl9zICp0aW1lciwKKwkJICAgIHZvaWQgKCp0aW1lcmNiKSAodm9pZCAqKSwgdm9pZCAqYXJnLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKworCWJmYV9hc3NlcnQodGltZXJjYiAhPSBOVUxMKTsKKwliZmFfYXNzZXJ0KCFiZmFfcV9pc19vbl9xKCZtb2QtPnRpbWVyX3EsIHRpbWVyKSk7CisKKwl0aW1lci0+dGltZW91dCA9IHRpbWVvdXQ7CisJdGltZXItPnRpbWVyY2IgPSB0aW1lcmNiOworCXRpbWVyLT5hcmcgPSBhcmc7CisKKwlsaXN0X2FkZF90YWlsKCZ0aW1lci0+cWUsICZtb2QtPnRpbWVyX3EpOworfQorCisvKioKKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrIHByb3RlY3Rpb24KKyAqLwordm9pZAorYmZhX3RpbWVyX3N0b3Aoc3RydWN0IGJmYV90aW1lcl9zICp0aW1lcikKK3sKKwliZmFfYXNzZXJ0KCFsaXN0X2VtcHR5KCZ0aW1lci0+cWUpKTsKKworCWxpc3RfZGVsKCZ0aW1lci0+cWUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfdHJjbW9kX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3RyY21vZF9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1NjJkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3RyY21vZF9wcml2LmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBoYWxfdHJjbW9kLmggQkZBIHRyYWNlIG1vZHVsZXMKKyAqLworCisjaWZuZGVmIF9fQkZBX1RSQ01PRF9QUklWX0hfXworI2RlZmluZSBfX0JGQV9UUkNNT0RfUFJJVl9IX18KKworI2luY2x1ZGUgPGNzL2JmYV90cmMuaD4KKworLyoKKyAqICEhISBPbmx5IGFwcGVuZCB0byB0aGUgZW51bXMgZGVmaW5lZCBoZXJlIHRvIGF2b2lkIGFueSB2ZXJzaW9uaW5nCisgKiAhISEgbmVlZGVkIGJldHdlZW4gdHJhY2UgdXRpbGl0eSBhbmQgZHJpdmVyIHZlcnNpb24KKyAqLworZW51bSB7CisJQkZBX1RSQ19IQUxfSU9DCQk9IDEsCisJQkZBX1RSQ19IQUxfSU5UUgk9IDIsCisJQkZBX1RSQ19IQUxfRkNYUAk9IDMsCisJQkZBX1RSQ19IQUxfVUYJCT0gNCwKKwlCRkFfVFJDX0hBTF9ESUFHCT0gNSwKKwlCRkFfVFJDX0hBTF9SUE9SVAk9IDYsCisJQkZBX1RSQ19IQUxfRkNQSU0JPSA3LAorCUJGQV9UUkNfSEFMX0lPSU0JPSA4LAorCUJGQV9UUkNfSEFMX1RTS0lNCT0gOSwKKwlCRkFfVFJDX0hBTF9JVE5JTQk9IDEwLAorCUJGQV9UUkNfSEFMX1BQT1JUCT0gMTEsCisJQkZBX1RSQ19IQUxfU0dQRwk9IDEyLAorCUJGQV9UUkNfSEFMX0ZMQVNICT0gMTMsCisJQkZBX1RSQ19IQUxfREVCVUcJPSAxNCwKKwlCRkFfVFJDX0hBTF9XV04JCT0gMTUsCisJQkZBX1RSQ19IQUxfRkxBU0hfUkFXCT0gMTYsCisJQkZBX1RSQ19IQUxfU0JPT1QJPSAxNywKKwlCRkFfVFJDX0hBTF9TQk9PVF9JTwk9IDE4LAorCUJGQV9UUkNfSEFMX1NCT09UX0lOVFIJPSAxOSwKKwlCRkFfVFJDX0hBTF9TQlRFU1QJPSAyMCwKKwlCRkFfVFJDX0hBTF9JUEZDCT0gMjEsCisJQkZBX1RSQ19IQUxfSU9DRkMJPSAyMiwKKwlCRkFfVFJDX0hBTF9GQ1BUTQk9IDIzLAorCUJGQV9UUkNfSEFMX0lPVE0JPSAyNCwKKwlCRkFfVFJDX0hBTF9UU0tUTQk9IDI1LAorCUJGQV9UUkNfSEFMX1RJTgkJPSAyNiwKKwlCRkFfVFJDX0hBTF9MUFMJCT0gMjcsCisJQkZBX1RSQ19IQUxfRkNESUFHCT0gMjgsCisJQkZBX1RSQ19IQUxfUEJJTkQJPSAyOSwKKwlCRkFfVFJDX0hBTF9JT0NGQ19DVAk9IDMwLAorCUJGQV9UUkNfSEFMX0lPQ0ZDX0NCCT0gMzEsCisJQkZBX1RSQ19IQUxfSU9DRkNfUQk9IDMyLAorfTsKKworI2VuZGlmIC8qIF9fQkZBX1RSQ01PRF9QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfdHNraW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Rza2ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwZDQwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3Rza2ltLmMKQEAgLTAsMCArMSw2ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9jYl9pb2ltX21hY3Jvcy5oPgorCitCRkFfVFJDX0ZJTEUoSEFMLCBUU0tJTSk7CisKKy8qKgorICogdGFzayBtYW5hZ2VtZW50IGNvbXBsZXRpb24gaGFuZGxpbmcKKyAqLworI2RlZmluZSBiZmFfdHNraW1fcWNvbXAoX190c2tpbSwgX19jYmZuKSBkbyB7CQkJICAgICBcCisJYmZhX2NiX3F1ZXVlKChfX3Rza2ltKS0+YmZhLCAmKF9fdHNraW0pLT5oY2JfcWUsIF9fY2JmbiwgKF9fdHNraW0pKTsgXAorCWJmYV90c2tpbV9ub3RpZnlfY29tcChfX3Rza2ltKTsgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGJmYV90c2tpbV9ub3RpZnlfY29tcChfX3Rza2ltKSBkbyB7CQkJCSAgICAgXAorCWlmICgoX190c2tpbSktPm5vdGlmeSkJCQkJCSAgICAgCSAgICAgXAorCQliZmFfaXRuaW1fdHNrZG9uZSgoX190c2tpbSktPml0bmltKTsgICAgICBcCit9IHdoaWxlICgwKQorCisvKgorICogZm9yd2FyZCBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgICAgIF9fYmZhX2NiX3Rza2ltX2RvbmUodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOworc3RhdGljIHZvaWQgICAgIF9fYmZhX2NiX3Rza2ltX2ZhaWxlZCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CitzdGF0aWMgYmZhX2Jvb2xlYW5fdCBiZmFfdHNraW1fbWF0Y2hfc2NvcGUoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwKKwkJCQkJICAgICAgIGx1bl90IGx1bik7CitzdGF0aWMgdm9pZCAgICAgYmZhX3Rza2ltX2dhdGhlcl9pb3Moc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSk7CitzdGF0aWMgdm9pZCAgICAgYmZhX3Rza2ltX2NsZWFucF9jb21wKHZvaWQgKnRza2ltX2NiYXJnKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfdHNraW1fY2xlYW51cF9pb3Moc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSk7CitzdGF0aWMgYmZhX2Jvb2xlYW5fdCBiZmFfdHNraW1fc2VuZChzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltKTsKK3N0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV90c2tpbV9zZW5kX2Fib3J0KHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0pOworc3RhdGljIHZvaWQgICAgIGJmYV90c2tpbV9pb2NkaXNhYmxlX2lvcyhzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltKTsKKworLyoqCisgKiAgYmZhX3Rza2ltX3NtCisgKi8KKworZW51bSBiZmFfdHNraW1fZXZlbnQgeworCUJGQV9UU0tJTV9TTV9TVEFSVCAgICAgICAgPSAxLCAgLyogIFRNIGNvbW1hbmQgc3RhcnQgICAgICAgICAgICAqLworCUJGQV9UU0tJTV9TTV9ET05FICAgICAgICAgPSAyLCAgLyogIFRNIGNvbXBsZXRpb24gICAgICAgICAgICAgICAqLworCUJGQV9UU0tJTV9TTV9RUkVTVU1FICAgICAgPSAzLCAgLyogIHJlc3VtZSBhZnRlciBxZnVsbCAgICAgICAgICAqLworCUJGQV9UU0tJTV9TTV9IV0ZBSUwgICAgICAgPSA1LCAgLyogIElPQyBoL3cgZmFpbHVyZSBldmVudCAgICAgICAqLworCUJGQV9UU0tJTV9TTV9IQ0IgICAgICAgICAgPSA2LCAgLyogIEJGQSBjYWxsYmFjayBjb21wbGV0aW9uICAgICAqLworCUJGQV9UU0tJTV9TTV9JT1NfRE9ORSAgICAgPSA3LCAgLyogIElPIGFuZCBzdWIgVE0gY29tcGxldGlvbnMgICAqLworCUJGQV9UU0tJTV9TTV9DTEVBTlVQICAgICAgPSA4LCAgLyogIFRNIGNsZWFudXAgb24gSVROIG9mZmxpbmUgICAqLworCUJGQV9UU0tJTV9TTV9DTEVBTlVQX0RPTkUgPSA5LCAgLyogIFRNIGFib3J0IGNvbXBsZXRpb24gICAgICAgICAqLworfTsKKworc3RhdGljIHZvaWQgICAgIGJmYV90c2tpbV9zbV91bmluaXQoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwKKwkJCQkJZW51bSBiZmFfdHNraW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV90c2tpbV9zbV9hY3RpdmUoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwKKwkJCQkJZW51bSBiZmFfdHNraW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV90c2tpbV9zbV9jbGVhbnVwKHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0sCisJCQkJCSBlbnVtIGJmYV90c2tpbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX3Rza2ltX3NtX2lvY2xlYW51cChzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltLAorCQkJCQkgZW51bSBiZmFfdHNraW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV90c2tpbV9zbV9xZnVsbChzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltLAorCQkJCSAgICAgICBlbnVtIGJmYV90c2tpbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX3Rza2ltX3NtX2NsZWFudXBfcWZ1bGwoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwKKwkJCQkgICAgICAgZW51bSBiZmFfdHNraW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV90c2tpbV9zbV9oY2Ioc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwKKwkJCQkgICAgIGVudW0gYmZhX3Rza2ltX2V2ZW50IGV2ZW50KTsKKworLyoqCisgKiAgICAgIFRhc2sgbWFuYWdlbWVudCBjb21tYW5kIGJlZ2lubmluZyBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV90c2tpbV9zbV91bmluaXQoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwgZW51bSBiZmFfdHNraW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyh0c2tpbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfVFNLSU1fU01fU1RBUlQ6CisJCWJmYV9zbV9zZXRfc3RhdGUodHNraW0sIGJmYV90c2tpbV9zbV9hY3RpdmUpOworCQliZmFfdHNraW1fZ2F0aGVyX2lvcyh0c2tpbSk7CisKKwkJLyoqCisJCSAqIElmIGRldmljZSBpcyBvZmZsaW5lLCBkbyBub3Qgc2VuZCBUTSBvbiB3aXJlLiBKdXN0IGNsZWFudXAKKwkJICogYW55IHBlbmRpbmcgSU8gcmVxdWVzdHMgYW5kIGNvbXBsZXRlIFRNIHJlcXVlc3QuCisJCSAqLworCQlpZiAoIWJmYV9pdG5pbV9pc19vbmxpbmUodHNraW0tPml0bmltKSkgeworCQkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX2lvY2xlYW51cCk7CisJCQl0c2tpbS0+dHNrX3N0YXR1cyA9IEJGSV9UU0tJTV9TVFNfT0s7CisJCQliZmFfdHNraW1fY2xlYW51cF9pb3ModHNraW0pOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCFiZmFfdHNraW1fc2VuZCh0c2tpbSkpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUodHNraW0sIGJmYV90c2tpbV9zbV9xZnVsbCk7CisJCQliZmFfcmVxcV93YWl0KHRza2ltLT5iZmEsIHRza2ltLT5pdG5pbS0+cmVxcSwKKwkJCQkJICAmdHNraW0tPnJlcXFfd2FpdCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBicmllZgorICoJVE0gY29tbWFuZCBpcyBhY3RpdmUsIGF3YWl0aW5nIGNvbXBsZXRpb24gZnJvbSBmaXJtd2FyZSB0bworICoJY2xlYW51cCBJTyByZXF1ZXN0cyBpbiBUTSBzY29wZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV90c2tpbV9zbV9hY3RpdmUoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwgZW51bSBiZmFfdHNraW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyh0c2tpbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfVFNLSU1fU01fRE9ORToKKwkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX2lvY2xlYW51cCk7CisJCWJmYV90c2tpbV9jbGVhbnVwX2lvcyh0c2tpbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfVFNLSU1fU01fQ0xFQU5VUDoKKwkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX2NsZWFudXApOworCQlpZiAoIWJmYV90c2tpbV9zZW5kX2Fib3J0KHRza2ltKSkgeworCQkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX2NsZWFudXBfcWZ1bGwpOworCQkJYmZhX3JlcXFfd2FpdCh0c2tpbS0+YmZhLCB0c2tpbS0+aXRuaW0tPnJlcXEsCisJCQkJJnRza2ltLT5yZXFxX3dhaXQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBCRkFfVFNLSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKHRza2ltLCBiZmFfdHNraW1fc21faGNiKTsKKwkJYmZhX3Rza2ltX2lvY2Rpc2FibGVfaW9zKHRza2ltKTsKKwkJYmZhX3Rza2ltX3Fjb21wKHRza2ltLCBfX2JmYV9jYl90c2tpbV9mYWlsZWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqCUFuIGFjdGl2ZSBUTSBpcyBiZWluZyBjbGVhbmVkIHVwIHNpbmNlIElUTiBpcyBvZmZsaW5lLiBBd2FpdGluZyBjbGVhbnVwCisgKgljb21wbGV0aW9uIGV2ZW50IGZyb20gZmlybXdhcmUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfdHNraW1fc21fY2xlYW51cChzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltLCBlbnVtIGJmYV90c2tpbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHRza2ltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9UU0tJTV9TTV9ET05FOgorCQkvKioKKwkJICogSWdub3JlIGFuZCB3YWl0IGZvciBBQk9SVCBjb21wbGV0aW9uIGZyb20gZmlybXdhcmUuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgQkZBX1RTS0lNX1NNX0NMRUFOVVBfRE9ORToKKwkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX2lvY2xlYW51cCk7CisJCWJmYV90c2tpbV9jbGVhbnVwX2lvcyh0c2tpbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfVFNLSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKHRza2ltLCBiZmFfdHNraW1fc21faGNiKTsKKwkJYmZhX3Rza2ltX2lvY2Rpc2FibGVfaW9zKHRza2ltKTsKKwkJYmZhX3Rza2ltX3Fjb21wKHRza2ltLCBfX2JmYV9jYl90c2tpbV9mYWlsZWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3Rza2ltX3NtX2lvY2xlYW51cChzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltLCBlbnVtIGJmYV90c2tpbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHRza2ltLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9UU0tJTV9TTV9JT1NfRE9ORToKKwkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX2hjYik7CisJCWJmYV90c2tpbV9xY29tcCh0c2tpbSwgX19iZmFfY2JfdHNraW1fZG9uZSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfVFNLSU1fU01fQ0xFQU5VUDoKKwkJLyoqCisJCSAqIElnbm9yZSwgVE0gY29tbWFuZCBjb21wbGV0ZWQgb24gd2lyZS4KKwkJICogTm90aWZ5IFRNIGNvbm1wbGV0aW9uIG9uIElPIGNsZWFudXAgY29tcGxldGlvbi4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBCRkFfVFNLSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKHRza2ltLCBiZmFfdHNraW1fc21faGNiKTsKKwkJYmZhX3Rza2ltX2lvY2Rpc2FibGVfaW9zKHRza2ltKTsKKwkJYmZhX3Rza2ltX3Fjb21wKHRza2ltLCBfX2JmYV9jYl90c2tpbV9mYWlsZWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqICAgICAgVGFzayBtYW5hZ2VtZW50IGNvbW1hbmQgaXMgd2FpdGluZyBmb3Igcm9vbSBpbiByZXF1ZXN0IENRCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfdHNraW1fc21fcWZ1bGwoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwgZW51bSBiZmFfdHNraW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyh0c2tpbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfVFNLSU1fU01fUVJFU1VNRToKKwkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX2FjdGl2ZSk7CisJCWJmYV90c2tpbV9zZW5kKHRza2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9UU0tJTV9TTV9DTEVBTlVQOgorCQkvKioKKwkJICogTm8gbmVlZCB0byBzZW5kIFRNIG9uIHdpcmUgc2luY2UgSVROIGlzIG9mZmxpbmUuCisJCSAqLworCQliZmFfc21fc2V0X3N0YXRlKHRza2ltLCBiZmFfdHNraW1fc21faW9jbGVhbnVwKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmdHNraW0tPnJlcXFfd2FpdCk7CisJCWJmYV90c2tpbV9jbGVhbnVwX2lvcyh0c2tpbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfVFNLSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKHRza2ltLCBiZmFfdHNraW1fc21faGNiKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmdHNraW0tPnJlcXFfd2FpdCk7CisJCWJmYV90c2tpbV9pb2NkaXNhYmxlX2lvcyh0c2tpbSk7CisJCWJmYV90c2tpbV9xY29tcCh0c2tpbSwgX19iZmFfY2JfdHNraW1fZmFpbGVkKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAgICAgIFRhc2sgbWFuYWdlbWVudCBjb21tYW5kIGlzIGFjdGl2ZSwgYXdhaXRpbmcgZm9yIHJvb20gaW4gcmVxdWVzdCBDUQorICoJdG8gc2VuZCBjbGVhbiB1cCByZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZAorYmZhX3Rza2ltX3NtX2NsZWFudXBfcWZ1bGwoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwKKwkJZW51bSBiZmFfdHNraW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyh0c2tpbS0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfVFNLSU1fU01fRE9ORToKKwkJYmZhX3JlcXFfd2NhbmNlbCgmdHNraW0tPnJlcXFfd2FpdCk7CisJCS8qKgorCQkgKgorCQkgKiBGYWxsIHRocm91Z2ggISEhCisJCSAqLworCisJY2FzZSBCRkFfVFNLSU1fU01fUVJFU1VNRToKKwkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX2NsZWFudXApOworCQliZmFfdHNraW1fc2VuZF9hYm9ydCh0c2tpbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfVFNLSU1fU01fSFdGQUlMOgorCQliZmFfc21fc2V0X3N0YXRlKHRza2ltLCBiZmFfdHNraW1fc21faGNiKTsKKwkJYmZhX3JlcXFfd2NhbmNlbCgmdHNraW0tPnJlcXFfd2FpdCk7CisJCWJmYV90c2tpbV9pb2NkaXNhYmxlX2lvcyh0c2tpbSk7CisJCWJmYV90c2tpbV9xY29tcCh0c2tpbSwgX19iZmFfY2JfdHNraW1fZmFpbGVkKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAgICAgIEJGQSBjYWxsYmFjayBpcyBwZW5kaW5nCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfdHNraW1fc21faGNiKHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0sIGVudW0gYmZhX3Rza2ltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmModHNraW0tPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1RTS0lNX1NNX0hDQjoKKwkJYmZhX3NtX3NldF9zdGF0ZSh0c2tpbSwgYmZhX3Rza2ltX3NtX3VuaW5pdCk7CisJCWJmYV90c2tpbV9mcmVlKHRza2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9UU0tJTV9TTV9DTEVBTlVQOgorCQliZmFfdHNraW1fbm90aWZ5X2NvbXAodHNraW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX1RTS0lNX1NNX0hXRkFJTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisKKy8qKgorICogIGJmYV90c2tpbV9wcml2YXRlCisgKi8KKworc3RhdGljIHZvaWQKK19fYmZhX2NiX3Rza2ltX2RvbmUodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCit7CisJc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSA9IGNiYXJnOworCisJaWYgKCFjb21wbGV0ZSkgeworCQliZmFfc21fc2VuZF9ldmVudCh0c2tpbSwgQkZBX1RTS0lNX1NNX0hDQik7CisJCXJldHVybjsKKwl9CisKKwliZmFfc3RhdHModHNraW0tPml0bmltLCB0bV9zdWNjZXNzKTsKKwliZmFfY2JfdHNraW1fZG9uZSh0c2tpbS0+YmZhLT5iZmFkLCB0c2tpbS0+ZHRzaywgdHNraW0tPnRza19zdGF0dXMpOworfQorCitzdGF0aWMgdm9pZAorX19iZmFfY2JfdHNraW1fZmFpbGVkKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0gPSBjYmFyZzsKKworCWlmICghY29tcGxldGUpIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQodHNraW0sIEJGQV9UU0tJTV9TTV9IQ0IpOworCQlyZXR1cm47CisJfQorCisJYmZhX3N0YXRzKHRza2ltLT5pdG5pbSwgdG1fZmFpbHVyZXMpOworCWJmYV9jYl90c2tpbV9kb25lKHRza2ltLT5iZmEtPmJmYWQsIHRza2ltLT5kdHNrLAorCQkJICAgQkZJX1RTS0lNX1NUU19GQUlMRUQpOworfQorCitzdGF0aWMgICAgICAgICAgYmZhX2Jvb2xlYW5fdAorYmZhX3Rza2ltX21hdGNoX3Njb3BlKHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0sIGx1bl90IGx1bikKK3sKKwlzd2l0Y2ggKHRza2ltLT50bV9jbW5kKSB7CisJY2FzZSBGQ1BfVE1fVEFSR0VUX1JFU0VUOgorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwljYXNlIEZDUF9UTV9BQk9SVF9UQVNLX1NFVDoKKwljYXNlIEZDUF9UTV9DTEVBUl9UQVNLX1NFVDoKKwljYXNlIEZDUF9UTV9MVU5fUkVTRVQ6CisJY2FzZSBGQ1BfVE1fQ0xFQVJfQUNBOgorCQlyZXR1cm4gKHRza2ltLT5sdW4gPT0gbHVuKTsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorCisJcmV0dXJuIEJGQV9GQUxTRTsKK30KKworLyoqCisgKiAgICAgIEdhdGhlciBhZmZlY3RlZCBJTyByZXF1ZXN0cyBhbmQgdGFzayBtYW5hZ2VtZW50IGNvbW1hbmRzLgorICovCitzdGF0aWMgdm9pZAorYmZhX3Rza2ltX2dhdGhlcl9pb3Moc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSkKK3sKKwlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltID0gdHNraW0tPml0bmltOworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICpxZSwgKnFlbjsKKworCUlOSVRfTElTVF9IRUFEKCZ0c2tpbS0+aW9fcSk7CisKKwkvKioKKwkgKiBHYXRoZXIgYW55IGFjdGl2ZSBJTyByZXF1ZXN0cyBmaXJzdC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJml0bmltLT5pb19xKSB7CisJCWlvaW0gPSAoc3RydWN0IGJmYV9pb2ltX3MgKikgcWU7CisJCWlmIChiZmFfdHNraW1fbWF0Y2hfc2NvcGUKKwkJICAgICh0c2tpbSwgYmZhX2NiX2lvaW1fZ2V0X2x1bihpb2ltLT5kaW8pKSkgeworCQkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmdHNraW0tPmlvX3EpOworCQl9CisJfQorCisJLyoqCisJICogRmFpbGJhY2sgYW55IHBlbmRpbmcgSU8gcmVxdWVzdHMgaW1tZWRpYXRlbHkuCisJICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZpdG5pbS0+cGVuZGluZ19xKSB7CisJCWlvaW0gPSAoc3RydWN0IGJmYV9pb2ltX3MgKikgcWU7CisJCWlmIChiZmFfdHNraW1fbWF0Y2hfc2NvcGUKKwkJICAgICh0c2tpbSwgYmZhX2NiX2lvaW1fZ2V0X2x1bihpb2ltLT5kaW8pKSkgeworCQkJbGlzdF9kZWwoJmlvaW0tPnFlKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmaW9pbS0+ZmNwaW0tPmlvaW1fY29tcF9xKTsKKwkJCWJmYV9pb2ltX3Rvdihpb2ltKTsKKwkJfQorCX0KK30KKworLyoqCisgKiAJCUlPIGNsZWFudXAgY29tcGxldGlvbgorICovCitzdGF0aWMgdm9pZAorYmZhX3Rza2ltX2NsZWFucF9jb21wKHZvaWQgKnRza2ltX2NiYXJnKQoreworCXN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0gPSB0c2tpbV9jYmFyZzsKKworCWJmYV9zdGF0cyh0c2tpbS0+aXRuaW0sIHRtX2lvX2NvbXBzKTsKKwliZmFfc21fc2VuZF9ldmVudCh0c2tpbSwgQkZBX1RTS0lNX1NNX0lPU19ET05FKTsKK30KKworLyoqCisgKiAgICAgIEdhdGhlciBhZmZlY3RlZCBJTyByZXF1ZXN0cyBhbmQgdGFzayBtYW5hZ2VtZW50IGNvbW1hbmRzLgorICovCitzdGF0aWMgdm9pZAorYmZhX3Rza2ltX2NsZWFudXBfaW9zKHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0pCit7CisJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW07CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKnFlLCAqcWVuOworCisJYmZhX3djX2luaXQoJnRza2ltLT53YywgYmZhX3Rza2ltX2NsZWFucF9jb21wLCB0c2tpbSk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJnRza2ltLT5pb19xKSB7CisJCWlvaW0gPSAoc3RydWN0IGJmYV9pb2ltX3MgKikgcWU7CisJCWJmYV93Y191cCgmdHNraW0tPndjKTsKKwkJYmZhX2lvaW1fY2xlYW51cF90bShpb2ltLCB0c2tpbSk7CisJfQorCisJYmZhX3djX3dhaXQoJnRza2ltLT53Yyk7Cit9CisKKy8qKgorICogICAgICBTZW5kIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IHRvIGZpcm13YXJlLgorICovCitzdGF0aWMgYmZhX2Jvb2xlYW5fdAorYmZhX3Rza2ltX3NlbmQoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSkKK3sKKwlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltID0gdHNraW0tPml0bmltOworCXN0cnVjdCBiZmlfdHNraW1fcmVxX3MgKm07CisKKwkvKioKKwkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CisJICovCisJbSA9IGJmYV9yZXFxX25leHQodHNraW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCWlmICghbSkKKwkJcmV0dXJuIEJGQV9GQUxTRTsKKworCS8qKgorCSAqIGJ1aWxkIGkvbyByZXF1ZXN0IG1lc3NhZ2UgbmV4dAorCSAqLworCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfVFNLSU0sIEJGSV9UU0tJTV9IMklfVE1fUkVRLAorCQkJYmZhX2xwdWlkKHRza2ltLT5iZmEpKTsKKworCW0tPnRza190YWcgPSBiZmFfb3NfaHRvbnModHNraW0tPnRza190YWcpOworCW0tPml0bl9maGRsID0gdHNraW0tPml0bmltLT5ycG9ydC0+ZndfaGFuZGxlOworCW0tPnRfc2VjcyA9IHRza2ltLT50c2VjczsKKwltLT5sdW4gPSB0c2tpbS0+bHVuOworCW0tPnRtX2ZsYWdzID0gdHNraW0tPnRtX2NtbmQ7CisKKwkvKioKKwkgKiBxdWV1ZSBJL08gbWVzc2FnZSB0byBmaXJtd2FyZQorCSAqLworCWJmYV9yZXFxX3Byb2R1Y2UodHNraW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCXJldHVybiBCRkFfVFJVRTsKK30KKworLyoqCisgKiAgICAgIFNlbmQgYWJvcnQgcmVxdWVzdCB0byBjbGVhbnVwIGFuIGFjdGl2ZSBUTSB0byBmaXJtd2FyZS4KKyAqLworc3RhdGljIGJmYV9ib29sZWFuX3QKK2JmYV90c2tpbV9zZW5kX2Fib3J0KHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0pCit7CisJc3RydWN0IGJmYV9pdG5pbV9zICAgICAgICAgICAgICppdG5pbSA9IHRza2ltLT5pdG5pbTsKKwlzdHJ1Y3QgYmZpX3Rza2ltX2Fib3J0cmVxX3MgICAgKm07CisKKwkvKioKKwkgKiBjaGVjayBmb3Igcm9vbSBpbiBxdWV1ZSB0byBzZW5kIHJlcXVlc3Qgbm93CisJICovCisJbSA9IGJmYV9yZXFxX25leHQodHNraW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCWlmICghbSkKKwkJcmV0dXJuIEJGQV9GQUxTRTsKKworCS8qKgorCSAqIGJ1aWxkIGkvbyByZXF1ZXN0IG1lc3NhZ2UgbmV4dAorCSAqLworCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfVFNLSU0sIEJGSV9UU0tJTV9IMklfQUJPUlRfUkVRLAorCQkJYmZhX2xwdWlkKHRza2ltLT5iZmEpKTsKKworCW0tPnRza190YWcgID0gYmZhX29zX2h0b25zKHRza2ltLT50c2tfdGFnKTsKKworCS8qKgorCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCisJICovCisJYmZhX3JlcXFfcHJvZHVjZSh0c2tpbS0+YmZhLCBpdG5pbS0+cmVxcSk7CisJcmV0dXJuIEJGQV9UUlVFOworfQorCisvKioKKyAqICAgICAgQ2FsbCB0byByZXN1bWUgdGFzayBtYW5hZ2VtZW50IGNtbmQgd2FpdGluZyBmb3Igcm9vbSBpbiByZXF1ZXN0IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZAorYmZhX3Rza2ltX3FyZXN1bWUodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSA9IGNiYXJnOworCisJYmZhX2ZjcGltX3N0YXRzKHRza2ltLT5mY3BpbSwgcXJlc3VtZXMpOworCWJmYV9zdGF0cyh0c2tpbS0+aXRuaW0sIHRtX3FyZXN1bWVzKTsKKwliZmFfc21fc2VuZF9ldmVudCh0c2tpbSwgQkZBX1RTS0lNX1NNX1FSRVNVTUUpOworfQorCisvKioKKyAqIENsZWFudXAgSU9zIGFzc29jaWF0ZWQgd2l0aCBhIHRhc2sgbWFuZ2VtZW50IGNvbW1hbmQgb24gSU9DIGZhaWx1cmVzLgorICovCitzdGF0aWMgdm9pZAorYmZhX3Rza2ltX2lvY2Rpc2FibGVfaW9zKHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0pCit7CisJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW07CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKnFlLCAqcWVuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZ0c2tpbS0+aW9fcSkgeworCQlpb2ltID0gKHN0cnVjdCBiZmFfaW9pbV9zICopIHFlOworCQliZmFfaW9pbV9pb2NkaXNhYmxlKGlvaW0pOworCX0KK30KKworCisKKy8qKgorICogIGJmYV90c2tpbV9mcmllbmQKKyAqLworCisvKioKKyAqIE5vdGlmaWNhdGlvbiBvbiBjb21wbGV0aW9ucyBmcm9tIHJlbGF0ZWQgaW9pbS4KKyAqLwordm9pZAorYmZhX3Rza2ltX2lvZG9uZShzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltKQoreworCWJmYV93Y19kb3duKCZ0c2tpbS0+d2MpOworfQorCisvKioKKyAqIEhhbmRsZSBJT0MgaC93IGZhaWx1cmUgbm90aWZpY2F0aW9uIGZyb20gaXRuaW0uCisgKi8KK3ZvaWQKK2JmYV90c2tpbV9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0pCit7CisJdHNraW0tPm5vdGlmeSA9IEJGQV9GQUxTRTsKKwliZmFfc3RhdHModHNraW0tPml0bmltLCB0bV9pb2Nkb3ducyk7CisJYmZhX3NtX3NlbmRfZXZlbnQodHNraW0sIEJGQV9UU0tJTV9TTV9IV0ZBSUwpOworfQorCisvKioKKyAqIENsZWFudXAgVE0gY29tbWFuZCBhbmQgYXNzb2NpYXRlZCBJT3MgYXMgcGFydCBvZiBJVE5JTSBvZmZsaW5lLgorICovCit2b2lkCitiZmFfdHNraW1fY2xlYW51cChzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltKQoreworCXRza2ltLT5ub3RpZnkgPSBCRkFfVFJVRTsKKwliZmFfc3RhdHModHNraW0tPml0bmltLCB0bV9jbGVhbnVwcyk7CisJYmZhX3NtX3NlbmRfZXZlbnQodHNraW0sIEJGQV9UU0tJTV9TTV9DTEVBTlVQKTsKK30KKworLyoqCisgKiAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4KKyAqLwordm9pZAorYmZhX3Rza2ltX2F0dGFjaChzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvKQoreworCXN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW07CisJdTE2ICAgICAgICBpOworCisJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT50c2tpbV9mcmVlX3EpOworCisJdHNraW0gPSAoc3RydWN0IGJmYV90c2tpbV9zICopIGJmYV9tZW1pbmZvX2t2YShtaW5mbyk7CisJZmNwaW0tPnRza2ltX2FyciA9IHRza2ltOworCisJZm9yIChpID0gMDsgaSA8IGZjcGltLT5udW1fdHNraW1fcmVxczsgaSsrLCB0c2tpbSsrKSB7CisJCS8qCisJCSAqIGluaXRpYWxpemUgVFNLSU0KKwkJICovCisJCWJmYV9vc19tZW1zZXQodHNraW0sIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3Rza2ltX3MpKTsKKwkJdHNraW0tPnRza190YWcgPSBpOworCQl0c2tpbS0+YmZhICAgICA9IGZjcGltLT5iZmE7CisJCXRza2ltLT5mY3BpbSAgID0gZmNwaW07CisJCXRza2ltLT5ub3RpZnkgID0gQkZBX0ZBTFNFOworCQliZmFfcmVxcV93aW5pdCgmdHNraW0tPnJlcXFfd2FpdCwgYmZhX3Rza2ltX3FyZXN1bWUsCisJCQkJICAgdHNraW0pOworCQliZmFfc21fc2V0X3N0YXRlKHRza2ltLCBiZmFfdHNraW1fc21fdW5pbml0KTsKKworCQlsaXN0X2FkZF90YWlsKCZ0c2tpbS0+cWUsICZmY3BpbS0+dHNraW1fZnJlZV9xKTsKKwl9CisKKwliZmFfbWVtaW5mb19rdmEobWluZm8pID0gKHU4ICopIHRza2ltOworfQorCit2b2lkCitiZmFfdHNraW1fZGV0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltKQoreworICAgIC8qKgorICAgICAqIEB0b2RvCisgICAgICovCit9CisKK3ZvaWQKK2JmYV90c2tpbV9pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm0pCit7CisJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CisJc3RydWN0IGJmaV90c2tpbV9yc3BfcyAqcnNwID0gKHN0cnVjdCBiZmlfdHNraW1fcnNwX3MgKikgbTsKKwlzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltOworCXUxNiAgICAgICAgdHNrX3RhZyA9IGJmYV9vc19udG9ocyhyc3AtPnRza190YWcpOworCisJdHNraW0gPSBCRkFfVFNLSU1fRlJPTV9UQUcoZmNwaW0sIHRza190YWcpOworCWJmYV9hc3NlcnQodHNraW0tPnRza190YWcgPT0gdHNrX3RhZyk7CisKKwl0c2tpbS0+dHNrX3N0YXR1cyA9IHJzcC0+dHNrX3N0YXR1czsKKworCS8qKgorCSAqIEZpcm13YXJlIHNlbmRzIEJGSV9UU0tJTV9TVFNfQUJPUlRFRCBzdGF0dXMgZm9yIGFib3J0CisJICogcmVxdWVzdHMuIEFsbCBvdGhlciBzdGF0dXNlcyBhcmUgZm9yIG5vcm1hbCBjb21wbGV0aW9ucy4KKwkgKi8KKwlpZiAocnNwLT50c2tfc3RhdHVzID09IEJGSV9UU0tJTV9TVFNfQUJPUlRFRCkgeworCQliZmFfc3RhdHModHNraW0tPml0bmltLCB0bV9jbGVhbnVwX2NvbXBzKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQodHNraW0sIEJGQV9UU0tJTV9TTV9DTEVBTlVQX0RPTkUpOworCX0gZWxzZSB7CisJCWJmYV9zdGF0cyh0c2tpbS0+aXRuaW0sIHRtX2Z3X3JzcHMpOworCQliZmFfc21fc2VuZF9ldmVudCh0c2tpbSwgQkZBX1RTS0lNX1NNX0RPTkUpOworCX0KK30KKworCisKKy8qKgorICogIGJmYV90c2tpbV9hcGkKKyAqLworCisKK3N0cnVjdCBiZmFfdHNraW1fcyAqCitiZmFfdHNraW1fYWxsb2Moc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFkX3Rza2ltX3MgKmR0c2spCit7CisJc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CisJc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbTsKKworCWJmYV9xX2RlcSgmZmNwaW0tPnRza2ltX2ZyZWVfcSwgJnRza2ltKTsKKworCWlmICghdHNraW0pCisJCWJmYV9mY3BpbV9zdGF0cyhmY3BpbSwgbm9fdHNraW1zKTsKKwllbHNlCisJCXRza2ltLT5kdHNrID0gZHRzazsKKworCXJldHVybiB0c2tpbTsKK30KKwordm9pZAorYmZhX3Rza2ltX2ZyZWUoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSkKK3sKKwliZmFfYXNzZXJ0KGJmYV9xX2lzX29uX3FfZnVuYygmdHNraW0tPml0bmltLT50c2tfcSwgJnRza2ltLT5xZSkpOworCWxpc3RfZGVsKCZ0c2tpbS0+cWUpOworCWxpc3RfYWRkX3RhaWwoJnRza2ltLT5xZSwgJnRza2ltLT5mY3BpbS0+dHNraW1fZnJlZV9xKTsKK30KKworLyoqCisgKiAgICAgIFN0YXJ0IGEgdGFzayBtYW5hZ2VtZW50IGNvbW1hbmQuCisgKgorICogQHBhcmFtW2luXSAgICAgICB0c2tpbSAgICAgICBCRkEgdGFzayBtYW5hZ2VtZW50IGNvbW1hbmQgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gICAgICAgaXRuaW0gICAgICAgaS10IG5leHVzIGZvciB0aGUgdGFzayBtYW5hZ2VtZW50IGNvbW1hbmQKKyAqIEBwYXJhbVtpbl0gICAgICAgbHVuICAgICAgICAgbHVuLCBpZiBhcHBsaWNhYmxlCisgKiBAcGFyYW1baW5dICAgICAgIHRtX2NtbmQgICAgIFRhc2sgbWFuYWdlbWVudCBjb21tYW5kIGNvZGUuCisgKiBAcGFyYW1baW5dICAgICAgIHRfc2VjcyAgICAgIFRpbWVvdXQgaW4gc2Vjb25kcworICoKKyAqIEByZXR1cm4gTm9uZS4KKyAqLwordm9pZAorYmZhX3Rza2ltX3N0YXJ0KHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0sIHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sIGx1bl90IGx1biwKKwkJICAgIGVudW0gZmNwX3RtX2NtbmQgdG1fY21uZCwgdTggdHNlY3MpCit7CisJdHNraW0tPml0bmltICAgPSBpdG5pbTsKKwl0c2tpbS0+bHVuICAgICA9IGx1bjsKKwl0c2tpbS0+dG1fY21uZCA9IHRtX2NtbmQ7CisJdHNraW0tPnRzZWNzICAgPSB0c2VjczsKKwl0c2tpbS0+bm90aWZ5ICA9IEJGQV9GQUxTRTsKKwliZmFfc3RhdHMoaXRuaW0sIHRtX2NtbmRzKTsKKworCWxpc3RfYWRkX3RhaWwoJnRza2ltLT5xZSwgJml0bmltLT50c2tfcSk7CisJYmZhX3NtX3NlbmRfZXZlbnQodHNraW0sIEJGQV9UU0tJTV9TTV9TVEFSVCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfdWYuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3VmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZjlkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3VmLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX3VmLmMgQkZBIHVuc29saWNpdGVkIGZyYW1lIHJlY2VpdmUgaW1wbGVtZW50YXRpb24KKyAqLworCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgPGJmaS9iZmlfdWYuaD4KKyNpbmNsdWRlIDxjcy9iZmFfZGVidWcuaD4KKworQkZBX1RSQ19GSUxFKEhBTCwgVUYpOworQkZBX01PRFVMRSh1Zik7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVybmFsIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyB2b2lkCitfX2JmYV9jYl91Zl9yZWN2KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfdWZfcyAgICp1ZiA9IGNiYXJnOworCXN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSA9IEJGQV9VRl9NT0QodWYtPmJmYSk7CisKKwlpZiAoY29tcGxldGUpCisJCXVmbS0+dWZyZWN2KHVmbS0+Y2JhcmcsIHVmKTsKK30KKworc3RhdGljIHZvaWQKK2NsYWltX3VmX3BicyhzdHJ1Y3QgYmZhX3VmX21vZF9zICp1Zm0sIHN0cnVjdCBiZmFfbWVtaW5mb19zICptaSkKK3sKKwl1MzIgICAgICAgIHVmX3BiX3RvdF9zejsKKworCXVmbS0+dWZfcGJzX2t2YSA9IChzdHJ1Y3QgYmZhX3VmX2J1Zl9zICopIGJmYV9tZW1pbmZvX2RtYV92aXJ0KG1pKTsKKwl1Zm0tPnVmX3Bic19wYSA9IGJmYV9tZW1pbmZvX2RtYV9waHlzKG1pKTsKKwl1Zl9wYl90b3Rfc3ogPSBCRkFfUk9VTkRVUCgoc2l6ZW9mKHN0cnVjdCBiZmFfdWZfYnVmX3MpICogdWZtLT5udW1fdWZzKSwKKwkJCQkJCQlCRkFfRE1BX0FMSUdOX1NaKTsKKworCWJmYV9tZW1pbmZvX2RtYV92aXJ0KG1pKSArPSB1Zl9wYl90b3Rfc3o7CisJYmZhX21lbWluZm9fZG1hX3BoeXMobWkpICs9IHVmX3BiX3RvdF9zejsKKworCWJmYV9vc19tZW1zZXQoKHZvaWQgKil1Zm0tPnVmX3Bic19rdmEsIDAsIHVmX3BiX3RvdF9zeik7Cit9CisKK3N0YXRpYyB2b2lkCitjbGFpbV91Zl9wb3N0X21zZ3Moc3RydWN0IGJmYV91Zl9tb2RfcyAqdWZtLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWkpCit7CisJc3RydWN0IGJmaV91Zl9idWZfcG9zdF9zICp1Zl9icF9tc2c7CisJc3RydWN0IGJmaV9zZ2VfcyAgICAgICpzZ2U7CisJdW5pb24gYmZpX2FkZHJfdSAgICAgIHNnYV96ZXJvID0geyB7MH0gfTsKKwl1MTYgICAgICAgIGk7CisJdTE2ICAgICAgICBidWZfbGVuOworCisJdWZtLT51Zl9idWZfcG9zdHMgPSAoc3RydWN0IGJmaV91Zl9idWZfcG9zdF9zICopIGJmYV9tZW1pbmZvX2t2YShtaSk7CisJdWZfYnBfbXNnID0gdWZtLT51Zl9idWZfcG9zdHM7CisKKwlmb3IgKGkgPSAwLCB1Zl9icF9tc2cgPSB1Zm0tPnVmX2J1Zl9wb3N0czsgaSA8IHVmbS0+bnVtX3VmczsKKwkgICAgIGkrKywgdWZfYnBfbXNnKyspIHsKKwkJYmZhX29zX21lbXNldCh1Zl9icF9tc2csIDAsIHNpemVvZihzdHJ1Y3QgYmZpX3VmX2J1Zl9wb3N0X3MpKTsKKworCQl1Zl9icF9tc2ctPmJ1Zl90YWcgPSBpOworCQlidWZfbGVuID0gc2l6ZW9mKHN0cnVjdCBiZmFfdWZfYnVmX3MpOworCQl1Zl9icF9tc2ctPmJ1Zl9sZW4gPSBiZmFfb3NfaHRvbnMoYnVmX2xlbik7CisJCWJmaV9oMmlfc2V0KHVmX2JwX21zZy0+bWgsIEJGSV9NQ19VRiwgQkZJX1VGX0gySV9CVUZfUE9TVCwKKwkJCSAgICBiZmFfbHB1aWQodWZtLT5iZmEpKTsKKworCQlzZ2UgPSB1Zl9icF9tc2ctPnNnZTsKKwkJc2dlWzBdLnNnX2xlbiA9IGJ1Zl9sZW47CisJCXNnZVswXS5mbGFncyA9IEJGSV9TR0VfREFUQV9MQVNUOworCQliZmFfZG1hX2FkZHJfc2V0KHNnZVswXS5zZ2EsIHVmbV9wYnNfcGEodWZtLCBpKSk7CisJCWJmYV9zZ2VfdG9fYmUoc2dlKTsKKworCQlzZ2VbMV0uc2dfbGVuID0gYnVmX2xlbjsKKwkJc2dlWzFdLmZsYWdzID0gQkZJX1NHRV9QR0RMRU47CisJCXNnZVsxXS5zZ2EgPSBzZ2FfemVybzsKKwkJYmZhX3NnZV90b19iZSgmc2dlWzFdKTsKKwl9CisKKwkvKioKKwkgKiBhZHZhbmNlIHBvaW50ZXIgYmV5b25kIGNvbnN1bWVkIG1lbW9yeQorCSAqLworCWJmYV9tZW1pbmZvX2t2YShtaSkgPSAodTggKikgdWZfYnBfbXNnOworfQorCitzdGF0aWMgdm9pZAorY2xhaW1fdWZzKHN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pKQoreworCXUxNiAgICAgICAgaTsKKwlzdHJ1Y3QgYmZhX3VmX3MgICAqdWY7CisKKwkvKgorCSAqIENsYWltIGJsb2NrIG9mIG1lbW9yeSBmb3IgVUYgbGlzdAorCSAqLworCXVmbS0+dWZfbGlzdCA9IChzdHJ1Y3QgYmZhX3VmX3MgKikgYmZhX21lbWluZm9fa3ZhKG1pKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBVRnMgYW5kIHF1ZXVlIGl0IGluIFVGIGZyZWUgcXVldWUKKwkgKi8KKwlmb3IgKGkgPSAwLCB1ZiA9IHVmbS0+dWZfbGlzdDsgaSA8IHVmbS0+bnVtX3VmczsgaSsrLCB1ZisrKSB7CisJCWJmYV9vc19tZW1zZXQodWYsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3VmX3MpKTsKKwkJdWYtPmJmYSA9IHVmbS0+YmZhOworCQl1Zi0+dWZfdGFnID0gaTsKKwkJdWYtPnBiX2xlbiA9IHNpemVvZihzdHJ1Y3QgYmZhX3VmX2J1Zl9zKTsKKwkJdWYtPmJ1Zl9rdmEgPSAodm9pZCAqKSZ1Zm0tPnVmX3Bic19rdmFbaV07CisJCXVmLT5idWZfcGEgPSB1Zm1fcGJzX3BhKHVmbSwgaSk7CisJCWxpc3RfYWRkX3RhaWwoJnVmLT5xZSwgJnVmbS0+dWZfZnJlZV9xKTsKKwl9CisKKwkvKioKKwkgKiBhZHZhbmNlIG1lbW9yeSBwb2ludGVyCisJICovCisJYmZhX21lbWluZm9fa3ZhKG1pKSA9ICh1OCAqKSB1ZjsKK30KKworc3RhdGljIHZvaWQKK3VmX21lbV9jbGFpbShzdHJ1Y3QgYmZhX3VmX21vZF9zICp1Zm0sIHN0cnVjdCBiZmFfbWVtaW5mb19zICptaSkKK3sKKwljbGFpbV91Zl9wYnModWZtLCBtaSk7CisJY2xhaW1fdWZzKHVmbSwgbWkpOworCWNsYWltX3VmX3Bvc3RfbXNncyh1Zm0sIG1pKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV91Zl9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICpuZG1fbGVuLCB1MzIgKmRtX2xlbikKK3sKKwl1MzIgICAgICAgIG51bV91ZnMgPSBjZmctPmZ3Y2ZnLm51bV91Zl9idWZzOworCisJLyoKKwkgKiBkbWEtYWJsZSBtZW1vcnkgZm9yIFVGIHBvc3RlZCBidWZzCisJICovCisJKmRtX2xlbiArPSBCRkFfUk9VTkRVUCgoc2l6ZW9mKHN0cnVjdCBiZmFfdWZfYnVmX3MpICogbnVtX3VmcyksCisJCQkJCQkJQkZBX0RNQV9BTElHTl9TWik7CisKKwkvKgorCSAqIGtlcm5lbCBWaXJ0dWFsIG1lbW9yeSBmb3IgVUZzIGFuZCBVRiBidWYgcG9zdCBtc2cgY29waWVzCisJICovCisJKm5kbV9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBiZmFfdWZfcykgKiBudW1fdWZzOworCSpuZG1fbGVuICs9IHNpemVvZihzdHJ1Y3QgYmZpX3VmX2J1Zl9wb3N0X3MpICogbnVtX3VmczsKK30KKworc3RhdGljIHZvaWQKK2JmYV91Zl9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKKwkJICBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywgc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQoreworCXN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSA9IEJGQV9VRl9NT0QoYmZhKTsKKworCWJmYV9vc19tZW1zZXQodWZtLCAwLCBzaXplb2Yoc3RydWN0IGJmYV91Zl9tb2RfcykpOworCXVmbS0+YmZhID0gYmZhOworCXVmbS0+bnVtX3VmcyA9IGNmZy0+ZndjZmcubnVtX3VmX2J1ZnM7CisJSU5JVF9MSVNUX0hFQUQoJnVmbS0+dWZfZnJlZV9xKTsKKwlJTklUX0xJU1RfSEVBRCgmdWZtLT51Zl9wb3N0ZWRfcSk7CisKKwl1Zl9tZW1fY2xhaW0odWZtLCBtZW1pbmZvKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV91Zl9pbml0ZG9uZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV91Zl9kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmZhX3VmX3MgKgorYmZhX3VmX2dldChzdHJ1Y3QgYmZhX3VmX21vZF9zICp1Zl9tb2QpCit7CisJc3RydWN0IGJmYV91Zl9zICAgKnVmOworCisJYmZhX3FfZGVxKCZ1Zl9tb2QtPnVmX2ZyZWVfcSwgJnVmKTsKKwlyZXR1cm4gKHVmKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV91Zl9wdXQoc3RydWN0IGJmYV91Zl9tb2RfcyAqdWZfbW9kLCBzdHJ1Y3QgYmZhX3VmX3MgKnVmKQoreworCWxpc3RfYWRkX3RhaWwoJnVmLT5xZSwgJnVmX21vZC0+dWZfZnJlZV9xKTsKK30KKworc3RhdGljIGJmYV9zdGF0dXNfdAorYmZhX3VmX3Bvc3Qoc3RydWN0IGJmYV91Zl9tb2RfcyAqdWZtLCBzdHJ1Y3QgYmZhX3VmX3MgKnVmKQoreworCXN0cnVjdCBiZmlfdWZfYnVmX3Bvc3RfcyAqdWZfcG9zdF9tc2c7CisKKwl1Zl9wb3N0X21zZyA9IGJmYV9yZXFxX25leHQodWZtLT5iZmEsIEJGQV9SRVFRX0ZDWFApOworCWlmICghdWZfcG9zdF9tc2cpCisJCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKKworCWJmYV9vc19tZW1jcHkodWZfcG9zdF9tc2csICZ1Zm0tPnVmX2J1Zl9wb3N0c1t1Zi0+dWZfdGFnXSwKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBiZmlfdWZfYnVmX3Bvc3RfcykpOworCWJmYV9yZXFxX3Byb2R1Y2UodWZtLT5iZmEsIEJGQV9SRVFRX0ZDWFApOworCisJYmZhX3RyYyh1Zm0tPmJmYSwgdWYtPnVmX3RhZyk7CisKKwlsaXN0X2FkZF90YWlsKCZ1Zi0+cWUsICZ1Zm0tPnVmX3Bvc3RlZF9xKTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworc3RhdGljIHZvaWQKK2JmYV91Zl9wb3N0X2FsbChzdHJ1Y3QgYmZhX3VmX21vZF9zICp1Zl9tb2QpCit7CisJc3RydWN0IGJmYV91Zl9zICAgKnVmOworCisJd2hpbGUgKCh1ZiA9IGJmYV91Zl9nZXQodWZfbW9kKSkgIT0gTlVMTCkgeworCQlpZiAoYmZhX3VmX3Bvc3QodWZfbW9kLCB1ZikgIT0gQkZBX1NUQVRVU19PSykKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK3VmX3JlY3Yoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfdWZfZnJtX3JjdmRfcyAqbSkKK3sKKwlzdHJ1Y3QgYmZhX3VmX21vZF9zICp1Zm0gPSBCRkFfVUZfTU9EKGJmYSk7CisJdTE2ICAgICAgICB1Zl90YWcgPSBtLT5idWZfdGFnOworCXN0cnVjdCBiZmFfdWZfYnVmX3MgKnVmX2J1ZiA9ICZ1Zm0tPnVmX3Bic19rdmFbdWZfdGFnXTsKKwlzdHJ1Y3QgYmZhX3VmX3MgICAqdWYgPSAmdWZtLT51Zl9saXN0W3VmX3RhZ107CisJdTggICAgICAgICpidWYgPSAmdWZfYnVmLT5kWzBdOworCXN0cnVjdCBmY2hzX3MgICAgICAgICAqZmNoczsKKworCW0tPmZybV9sZW4gPSBiZmFfb3NfbnRvaHMobS0+ZnJtX2xlbik7CisJbS0+eGZyX2xlbiA9IGJmYV9vc19udG9ocyhtLT54ZnJfbGVuKTsKKworCWZjaHMgPSAoc3RydWN0IGZjaHNfcyAqKSB1Zl9idWY7CisKKwlsaXN0X2RlbCgmdWYtPnFlKTsJLyogZGVxdWV1ZSBmcm9tIHBvc3RlZCBxdWV1ZSAqLworCisJdWYtPmRhdGFfcHRyID0gYnVmOworCXVmLT5kYXRhX2xlbiA9IG0tPnhmcl9sZW47CisKKwliZmFfYXNzZXJ0KHVmLT5kYXRhX2xlbiA+PSBzaXplb2Yoc3RydWN0IGZjaHNfcykpOworCisJaWYgKHVmLT5kYXRhX2xlbiA9PSBzaXplb2Yoc3RydWN0IGZjaHNfcykpIHsKKwkJYmZhX3Bsb2dfZmNoZHIoYmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTF9VRiwgQkZBX1BMX0VJRF9SWCwKKwkJCSAgICAgICB1Zi0+ZGF0YV9sZW4sIChzdHJ1Y3QgZmNoc19zICopIGJ1Zik7CisJfSBlbHNlIHsKKwkJdTMyICAgICAgICBwbGRfdzAgPSAqKCh1MzIgKikgKGJ1ZiArIHNpemVvZihzdHJ1Y3QgZmNoc19zKSkpOworCQliZmFfcGxvZ19mY2hkcl9hbmRfcGwoYmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTF9VRiwKKwkJCQkgICAgICBCRkFfUExfRUlEX1JYLCB1Zi0+ZGF0YV9sZW4sCisJCQkJICAgICAgKHN0cnVjdCBmY2hzX3MgKikgYnVmLCBwbGRfdzApOworCX0KKworCWJmYV9jYl9xdWV1ZShiZmEsICZ1Zi0+aGNiX3FlLCBfX2JmYV9jYl91Zl9yZWN2LCB1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfdWZfc3RvcChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV91Zl9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSA9IEJGQV9VRl9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX3VmX3MgICAqdWY7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKnFlLCAqcWVuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZ1Zm0tPnVmX3Bvc3RlZF9xKSB7CisJCXVmID0gKHN0cnVjdCBiZmFfdWZfcyAqKSBxZTsKKwkJbGlzdF9kZWwoJnVmLT5xZSk7CisJCWJmYV91Zl9wdXQodWZtLCB1Zik7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX3VmX3N0YXJ0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWJmYV91Zl9wb3N0X2FsbChCRkFfVUZfTU9EKGJmYSkpOworfQorCisKKworLyoqCisgKiAgYmZhX3VmX2FwaQorICovCisKKy8qKgorICogCQlSZWdpc3RlciBoYW5kbGVyIGZvciBhbGwgdW5zb2xpY3RlZCByZWNpZXZlIGZyYW1lcy4KKyAqCisgKiBAcGFyYW1baW5dCWJmYQkJQkZBIGluc3RhbmNlCisgKiBAcGFyYW1baW5dCXVmcmVjdglyZWNlaXZlIGhhbmRsZXIgZnVuY3Rpb24KKyAqIEBwYXJhbVtpbl0JY2JhcmcJcmVjZWl2ZSBoYW5kbGVyIGFyZworICovCit2b2lkCitiZmFfdWZfcmVjdl9yZWdpc3RlcihzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2NiX3VmX3JlY3ZfdCB1ZnJlY3YsIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSA9IEJGQV9VRl9NT0QoYmZhKTsKKworCXVmbS0+dWZyZWN2ID0gdWZyZWN2OworCXVmbS0+Y2JhcmcgPSBjYmFyZzsKK30KKworLyoqCisgKiAJCUZyZWUgYW4gdW5zb2xpY2l0ZWQgZnJhbWUgYmFjayB0byBCRkEuCisgKgorICogQHBhcmFtW2luXQkJdWYJCXVuc29saWNpdGVkIGZyYW1lIHRvIGJlIGZyZWVkCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQKK2JmYV91Zl9mcmVlKHN0cnVjdCBiZmFfdWZfcyAqdWYpCit7CisJYmZhX3VmX3B1dChCRkFfVUZfTU9EKHVmLT5iZmEpLCB1Zik7CisJYmZhX3VmX3Bvc3RfYWxsKEJGQV9VRl9NT0QodWYtPmJmYSkpOworfQorCisKKworLyoqCisgKiAgdWZfcHViIEJGQSB1ZiBtb2R1bGUgcHVibGljIGZ1bmN0aW9ucworICovCisKK3ZvaWQKK2JmYV91Zl9pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm1zZykKK3sKKwliZmFfdHJjKGJmYSwgbXNnLT5taGRyLm1zZ19pZCk7CisKKwlzd2l0Y2ggKG1zZy0+bWhkci5tc2dfaWQpIHsKKwljYXNlIEJGSV9VRl9JMkhfRlJNX1JDVkQ6CisJCXVmX3JlY3YoYmZhLCAoc3RydWN0IGJmaV91Zl9mcm1fcmN2ZF9zICopIG1zZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3RyYyhiZmEsIG1zZy0+bWhkci5tc2dfaWQpOworCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV91Zl9wcml2LmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV91Zl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiNDkwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3VmX3ByaXYuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQkZBX1VGX1BSSVZfSF9fCisjZGVmaW5lIF9fQkZBX1VGX1BSSVZfSF9fCisKKyNpbmNsdWRlIDxjcy9iZmFfc20uaD4KKyNpbmNsdWRlIDxiZmFfc3ZjLmg+CisjaW5jbHVkZSA8YmZpL2JmaV91Zi5oPgorCisjZGVmaW5lIEJGQV9VRl9NSU4JKDQpCisKK3N0cnVjdCBiZmFfdWZfbW9kX3MgeworCXN0cnVjdCBiZmFfcyAqYmZhOwkJLyogIGJhY2sgcG9pbnRlciB0byBCRkEgKi8KKwlzdHJ1Y3QgYmZhX3VmX3MgKnVmX2xpc3Q7CS8qICBhcnJheSBvZiBVRnMgKi8KKwl1MTYJbnVtX3VmczsJLyogIG51bSB1bnNvbGljaXRlZCByeCBmcmFtZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIAl1Zl9mcmVlX3E7CS8qICBmcmVlIFVGcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgCXVmX3Bvc3RlZF9xOwkvKiAgVUZzIHBvc3RlZCB0byBJT0MgKi8KKwlzdHJ1Y3QgYmZhX3VmX2J1Zl9zICp1Zl9wYnNfa3ZhOwkvKiAgbGlzdCBVRiBidWZzIHJlcXVlc3QgcGxkICovCisJdTY0CXVmX3Bic19wYTsJLyogIHBoeSBhZGRyIGZvciBVRiBidWZzICovCisJc3RydWN0IGJmaV91Zl9idWZfcG9zdF9zICp1Zl9idWZfcG9zdHM7CisJCQkJCS8qICBwcmUtYnVpbHQgVUYgcG9zdCBtc2dzICovCisJYmZhX2NiX3VmX3JlY3ZfdCB1ZnJlY3Y7CS8qICB1ZiByZWN2IGhhbmRsZXIgZnVuY3Rpb24gKi8KKwl2b2lkCQkqY2Jhcmc7CQkvKiAgdWYgcmVjZWl2ZSBoYW5kbGVyIGFyZyAqLworfTsKKworI2RlZmluZSBCRkFfVUZfTU9EKF9fYmZhKQkoJihfX2JmYSktPm1vZHVsZXMudWZfbW9kKQorCisjZGVmaW5lIHVmbV9wYnNfcGEoX3VmbW9kLCBfdWZ0YWcpCVwKKwkoKF91Zm1vZCktPnVmX3Bic19wYSArIHNpemVvZihzdHJ1Y3QgYmZhX3VmX2J1Zl9zKSAqIChfdWZ0YWcpKQorCit2b2lkCWJmYV91Zl9pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm1zZyk7CisKKyNlbmRpZiAvKiBfX0JGQV9VRl9QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjJiZTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkLmMKQEAgLTAsMCArMSwxMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIGJmYWQuYyBMaW51eCBkcml2ZXIgUENJIGludGVyZmFjZSBtb2R1bGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgImJmYWRfZHJ2LmgiCisjaW5jbHVkZSAiYmZhZF9pbS5oIgorI2luY2x1ZGUgImJmYWRfdG0uaCIKKyNpbmNsdWRlICJiZmFkX2lwZmMuaCIKKyNpbmNsdWRlICJiZmFkX3RyY21vZC5oIgorI2luY2x1ZGUgPGZjYi9iZmFfZmNiX3ZmLmg+CisjaW5jbHVkZSA8ZmNiL2JmYV9mY2JfcnBvcnQuaD4KKyNpbmNsdWRlIDxmY2IvYmZhX2ZjYl9wb3J0Lmg+CisjaW5jbHVkZSA8ZmNiL2JmYV9mY2IuaD4KKworQkZBX1RSQ19GSUxFKExEUlYsIEJGQUQpOworc3RhdGljIERFRklORV9NVVRFWChiZmFkX211dGV4KTsKK0xJU1RfSEVBRChiZmFkX2xpc3QpOworc3RhdGljIGludCAgICAgIGJmYWRfaW5zdDsKK2ludCBiZmFkX3N1cHBvcnRlZF9mYzRzOworCitzdGF0aWMgY2hhciAgICAgKmhvc3RfbmFtZTsKK3N0YXRpYyBjaGFyICAgICAqb3NfbmFtZTsKK3N0YXRpYyBjaGFyICAgICAqb3NfcGF0Y2g7CitzdGF0aWMgaW50ICAgICAgbnVtX3Jwb3J0czsKK3N0YXRpYyBpbnQgICAgICBudW1faW9zOworc3RhdGljIGludCAgICAgIG51bV90bXM7CitzdGF0aWMgaW50ICAgICAgbnVtX2ZjeHBzOworc3RhdGljIGludCAgICAgIG51bV91ZmJ1ZnM7CitzdGF0aWMgaW50ICAgICAgcmVxcV9zaXplOworc3RhdGljIGludCAgICAgIHJzcHFfc2l6ZTsKK3N0YXRpYyBpbnQgICAgICBudW1fc2dwZ3M7CitzdGF0aWMgaW50ICAgICAgcnBvcnRfZGVsX3RpbWVvdXQgPSBCRkFfRkNTX1JQT1JUX0RFRl9ERUxfVElNRU9VVDsKK3N0YXRpYyBpbnQgICAgICBiZmFfaW9fbWF4X3NnZSA9IEJGQURfSU9fTUFYX1NHRTsKK3N0YXRpYyBpbnQgICAgICBsb2dfbGV2ZWwgPSBCRkFfTE9HX1dBUk5JTkc7CitzdGF0aWMgaW50ICAgICAgaW9jX2F1dG9fcmVjb3ZlciA9IEJGQV9UUlVFOworc3RhdGljIGludCAgICAgIGlwZmNfZW5hYmxlID0gQkZBX0ZBTFNFOworc3RhdGljIGludCAgICAgIGlwZmNfbXR1ID0gLTE7CitpbnQgCQliZmFfbHVuX3F1ZXVlX2RlcHRoID0gQkZBRF9MVU5fUVVFVUVfREVQVEg7CitpbnQgICAgICAJYmZhX2xpbmt1cF9kZWxheSA9IC0xOworCittb2R1bGVfcGFyYW0ob3NfbmFtZSwgY2hhcnAsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShvc19wYXRjaCwgY2hhcnAsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShob3N0X25hbWUsIGNoYXJwLCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0obnVtX3Jwb3J0cywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0obnVtX2lvcywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0obnVtX3RtcywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0obnVtX2ZjeHBzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShudW1fdWZidWZzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShyZXFxX3NpemUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKHJzcHFfc2l6ZSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0obnVtX3NncGdzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShycG9ydF9kZWxfdGltZW91dCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oYmZhX2x1bl9xdWV1ZV9kZXB0aCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oYmZhX2lvX21heF9zZ2UsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGxvZ19sZXZlbCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oaW9jX2F1dG9fcmVjb3ZlciwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oaXBmY19lbmFibGUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGlwZmNfbXR1LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShiZmFfbGlua3VwX2RlbGF5LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworLyoKKyAqIFN0b3JlcyB0aGUgbW9kdWxlIHBhcm0gbnVtX3NncGdzIHZhbHVlOworICogdXNlZCB0byByZXNldCBmb3IgYmZhZCBuZXh0IGluc3RhbmNlLgorICovCitzdGF0aWMgaW50IG51bV9zZ3Bnc19wYXJtOworCitzdGF0aWMgYmZhX3N0YXR1c190CitiZmFkX2ZjNF9wcm9iZShzdHJ1Y3QgYmZhZF9zICpiZmFkKQoreworCWludCAgICAgICAgICAgICByYzsKKworCXJjID0gYmZhZF9pbV9wcm9iZShiZmFkKTsKKwlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBleHQ7CisKKwliZmFkX3RtX3Byb2JlKGJmYWQpOworCisJaWYgKGlwZmNfZW5hYmxlKQorCQliZmFkX2lwZmNfcHJvYmUoYmZhZCk7CitleHQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAorYmZhZF9mYzRfcHJvYmVfdW5kbyhzdHJ1Y3QgYmZhZF9zICpiZmFkKQoreworCWJmYWRfaW1fcHJvYmVfdW5kbyhiZmFkKTsKKwliZmFkX3RtX3Byb2JlX3VuZG8oYmZhZCk7CisJaWYgKGlwZmNfZW5hYmxlKQorCQliZmFkX2lwZmNfcHJvYmVfdW5kbyhiZmFkKTsKK30KKworc3RhdGljIHZvaWQKK2JmYWRfZmM0X3Byb2JlX3Bvc3Qoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlpZiAoYmZhZC0+aW0pCisJCWJmYWRfaW1fcHJvYmVfcG9zdChiZmFkLT5pbSk7CisKKwliZmFkX3RtX3Byb2JlX3Bvc3QoYmZhZCk7CisJaWYgKGlwZmNfZW5hYmxlKQorCQliZmFkX2lwZmNfcHJvYmVfcG9zdChiZmFkKTsKK30KKworc3RhdGljIGJmYV9zdGF0dXNfdAorYmZhZF9mYzRfcG9ydF9uZXcoc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0LCBpbnQgcm9sZXMpCit7CisJaW50ICAgICAgICAgICAgIHJjID0gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwlpZiAocm9sZXMgJiBCRkFfUE9SVF9ST0xFX0ZDUF9JTSkKKwkJcmMgPSBiZmFkX2ltX3BvcnRfbmV3KGJmYWQsIHBvcnQpOworCWlmIChyYyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIGV4dDsKKworCWlmIChyb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX1RNKQorCQlyYyA9IGJmYWRfdG1fcG9ydF9uZXcoYmZhZCwgcG9ydCk7CisJaWYgKHJjICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gZXh0OworCisJaWYgKChyb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lQRkMpICYmIGlwZmNfZW5hYmxlKQorCQlyYyA9IGJmYWRfaXBmY19wb3J0X25ldyhiZmFkLCBwb3J0LCBwb3J0LT5wdmJfdHlwZSk7CitleHQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAorYmZhZF9mYzRfcG9ydF9kZWxldGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0LCBpbnQgcm9sZXMpCit7CisJaWYgKHJvbGVzICYgQkZBX1BPUlRfUk9MRV9GQ1BfSU0pCisJCWJmYWRfaW1fcG9ydF9kZWxldGUoYmZhZCwgcG9ydCk7CisKKwlpZiAocm9sZXMgJiBCRkFfUE9SVF9ST0xFX0ZDUF9UTSkKKwkJYmZhZF90bV9wb3J0X2RlbGV0ZShiZmFkLCBwb3J0KTsKKworCWlmICgocm9sZXMgJiBCRkFfUE9SVF9ST0xFX0ZDUF9JUEZDKSAmJiBpcGZjX2VuYWJsZSkKKwkJYmZhZF9pcGZjX3BvcnRfZGVsZXRlKGJmYWQsIHBvcnQpOworfQorCisvKioKKyAqICBCRkEgY2FsbGJhY2tzCisgKi8KK3ZvaWQKK2JmYWRfaGNiX2NvbXAodm9pZCAqYXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKQoreworCXN0cnVjdCBiZmFkX2hhbF9jb21wICpmY29tcCA9IChzdHJ1Y3QgYmZhZF9oYWxfY29tcCAqKWFyZzsKKworCWZjb21wLT5zdGF0dXMgPSBzdGF0dXM7CisJY29tcGxldGUoJmZjb21wLT5jb21wKTsKK30KKworLyoqCisgKiBiZmFfaW5pdCBjYWxsYmFjaworICovCit2b2lkCitiZmFfY2JfaW5pdCh2b2lkICpkcnYsIGJmYV9zdGF0dXNfdCBpbml0X3N0YXR1cykKK3sKKwlzdHJ1Y3QgYmZhZF9zICAqYmZhZCA9IGRydjsKKworCWlmIChpbml0X3N0YXR1cyA9PSBCRkFfU1RBVFVTX09LKQorCQliZmFkLT5iZmFkX2ZsYWdzIHw9IEJGQURfSEFMX0lOSVRfRE9ORTsKKworCWNvbXBsZXRlKCZiZmFkLT5jb21wKTsKK30KKworCisKKy8qKgorICogIEJGQV9GQ1MgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZhZF9wb3J0X3MgKgorYmZhZF9nZXRfZHJ2X3BvcnQoc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYWRfdmZfcyAqdmZfZHJ2LAorCQkgIHN0cnVjdCBiZmFkX3Zwb3J0X3MgKnZwX2RydikKK3sKKwlyZXR1cm4gKCh2cF9kcnYpID8gKCYodnBfZHJ2KS0+ZHJ2X3BvcnQpCisJCTogKCh2Zl9kcnYpID8gKCYodmZfZHJ2KS0+YmFzZV9wb3J0KSA6ICgmKGJmYWQpLT5wcG9ydCkpKTsKK30KKworc3RydWN0IGJmYWRfcG9ydF9zICoKK2JmYV9mY2JfcG9ydF9uZXcoc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkgZW51bSBiZmFfcG9ydF9yb2xlIHJvbGVzLCBzdHJ1Y3QgYmZhZF92Zl9zICp2Zl9kcnYsCisJCSBzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cF9kcnYpCit7CisJYmZhX3N0YXR1c190ICAgIHJjOworCXN0cnVjdCBiZmFkX3BvcnRfcyAqcG9ydF9kcnY7CisKKwlpZiAoIXZwX2RydiAmJiAhdmZfZHJ2KSB7CisJCXBvcnRfZHJ2ID0gJmJmYWQtPnBwb3J0OworCQlwb3J0X2Rydi0+cHZiX3R5cGUgPSBCRkFEX1BPUlRfUEhZU19CQVNFOworCX0gZWxzZSBpZiAoIXZwX2RydiAmJiB2Zl9kcnYpIHsKKwkJcG9ydF9kcnYgPSAmdmZfZHJ2LT5iYXNlX3BvcnQ7CisJCXBvcnRfZHJ2LT5wdmJfdHlwZSA9IEJGQURfUE9SVF9WRl9CQVNFOworCX0gZWxzZSBpZiAodnBfZHJ2ICYmICF2Zl9kcnYpIHsKKwkJcG9ydF9kcnYgPSAmdnBfZHJ2LT5kcnZfcG9ydDsKKwkJcG9ydF9kcnYtPnB2Yl90eXBlID0gQkZBRF9QT1JUX1BIWVNfVlBPUlQ7CisJfSBlbHNlIHsKKwkJcG9ydF9kcnYgPSAmdnBfZHJ2LT5kcnZfcG9ydDsKKwkJcG9ydF9kcnYtPnB2Yl90eXBlID0gQkZBRF9QT1JUX1ZGX1ZQT1JUOworCX0KKworCXBvcnRfZHJ2LT5mY3NfcG9ydCA9IHBvcnQ7CisJcG9ydF9kcnYtPnJvbGVzID0gcm9sZXM7CisJcmMgPSBiZmFkX2ZjNF9wb3J0X25ldyhiZmFkLCBwb3J0X2Rydiwgcm9sZXMpOworCWlmIChyYyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYWRfZmM0X3BvcnRfZGVsZXRlKGJmYWQsIHBvcnRfZHJ2LCByb2xlcyk7CisJCXBvcnRfZHJ2ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcG9ydF9kcnY7Cit9CisKK3ZvaWQKK2JmYV9mY2JfcG9ydF9kZWxldGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgZW51bSBiZmFfcG9ydF9yb2xlIHJvbGVzLAorCQkgICAgc3RydWN0IGJmYWRfdmZfcyAqdmZfZHJ2LCBzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cF9kcnYpCit7CisJc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0X2RydjsKKworCS8qCisJICogdGhpcyB3aWxsIGJlIG9ubHkgY2FsbGVkIGZyb20gcm1tb2QgY29udGV4dAorCSAqLworCWlmICh2cF9kcnYgJiYgIXZwX2Rydi0+Y29tcF9kZWwpIHsKKwkJcG9ydF9kcnYgPSBiZmFkX2dldF9kcnZfcG9ydChiZmFkLCB2Zl9kcnYsIHZwX2Rydik7CisJCWJmYV90cmMoYmZhZCwgcm9sZXMpOworCQliZmFkX2ZjNF9wb3J0X2RlbGV0ZShiZmFkLCBwb3J0X2Rydiwgcm9sZXMpOworCX0KK30KKwordm9pZAorYmZhX2ZjYl9wb3J0X29ubGluZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCBlbnVtIGJmYV9wb3J0X3JvbGUgcm9sZXMsCisJCSAgICBzdHJ1Y3QgYmZhZF92Zl9zICp2Zl9kcnYsIHN0cnVjdCBiZmFkX3Zwb3J0X3MgKnZwX2RydikKK3sKKwlzdHJ1Y3QgYmZhZF9wb3J0X3MgKnBvcnRfZHJ2ID0gYmZhZF9nZXRfZHJ2X3BvcnQoYmZhZCwgdmZfZHJ2LCB2cF9kcnYpOworCisJaWYgKHJvbGVzICYgQkZBX1BPUlRfUk9MRV9GQ1BfSU0pCisJCWJmYWRfaW1fcG9ydF9vbmxpbmUoYmZhZCwgcG9ydF9kcnYpOworCisJaWYgKHJvbGVzICYgQkZBX1BPUlRfUk9MRV9GQ1BfVE0pCisJCWJmYWRfdG1fcG9ydF9vbmxpbmUoYmZhZCwgcG9ydF9kcnYpOworCisJaWYgKChyb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lQRkMpICYmIGlwZmNfZW5hYmxlKQorCQliZmFkX2lwZmNfcG9ydF9vbmxpbmUoYmZhZCwgcG9ydF9kcnYpOworCisJYmZhZC0+YmZhZF9mbGFncyB8PSBCRkFEX1BPUlRfT05MSU5FOworfQorCit2b2lkCitiZmFfZmNiX3BvcnRfb2ZmbGluZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCBlbnVtIGJmYV9wb3J0X3JvbGUgcm9sZXMsCisJCSAgICAgc3RydWN0IGJmYWRfdmZfcyAqdmZfZHJ2LCBzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cF9kcnYpCit7CisJc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0X2RydiA9IGJmYWRfZ2V0X2Rydl9wb3J0KGJmYWQsIHZmX2RydiwgdnBfZHJ2KTsKKworCWlmIChyb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lNKQorCQliZmFkX2ltX3BvcnRfb2ZmbGluZShiZmFkLCBwb3J0X2Rydik7CisKKwlpZiAocm9sZXMgJiBCRkFfUE9SVF9ST0xFX0ZDUF9UTSkKKwkJYmZhZF90bV9wb3J0X29mZmxpbmUoYmZhZCwgcG9ydF9kcnYpOworCisJaWYgKChyb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lQRkMpICYmIGlwZmNfZW5hYmxlKQorCQliZmFkX2lwZmNfcG9ydF9vZmZsaW5lKGJmYWQsIHBvcnRfZHJ2KTsKK30KKwordm9pZAorYmZhX2ZjYl92cG9ydF9kZWxldGUoc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBvcnRfZHJ2KQoreworCWlmICh2cG9ydF9kcnYtPmNvbXBfZGVsKSB7CisJCWNvbXBsZXRlKHZwb3J0X2Rydi0+Y29tcF9kZWwpOworCQlyZXR1cm47CisJfQorCisJa2ZyZWUodnBvcnRfZHJ2KTsKK30KKworLyoqCisgKiBGQ1MgUlBPUlQgYWxsb2MgY2FsbGJhY2ssIGFmdGVyIHN1Y2Nlc3NmdWwgUExPR0kgYnkgRkNTCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2ZjYl9ycG9ydF9hbGxvYyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCBzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICoqcnBvcnQsCisJCSAgICBzdHJ1Y3QgYmZhZF9ycG9ydF9zICoqcnBvcnRfZHJ2KQoreworCWJmYV9zdGF0dXNfdCAgICByYyA9IEJGQV9TVEFUVVNfT0s7CisKKwkqcnBvcnRfZHJ2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJmYWRfcnBvcnRfcyksIEdGUF9BVE9NSUMpOworCWlmICgqcnBvcnRfZHJ2ID09IE5VTEwpIHsKKwkJcmMgPSBCRkFfU1RBVFVTX0VOT01FTTsKKwkJZ290byBleHQ7CisJfQorCisJKnJwb3J0ID0gJigqcnBvcnRfZHJ2KS0+ZmNzX3Jwb3J0OworCitleHQ6CisJcmV0dXJuIHJjOworfQorCisKKwordm9pZAorYmZhZF9oYWxfbWVtX3JlbGVhc2Uoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqaGFsX21lbWluZm8gPSAmYmZhZC0+bWVtaW5mbzsKKwlzdHJ1Y3QgYmZhX21lbV9lbGVtX3MgKm1lbWluZm9fZWxlbTsKKworCWZvciAoaSA9IDA7IGkgPCBCRkFfTUVNX1RZUEVfTUFYOyBpKyspIHsKKwkJbWVtaW5mb19lbGVtID0gJmhhbF9tZW1pbmZvLT5tZW1pbmZvW2ldOworCQlpZiAobWVtaW5mb19lbGVtLT5rdmEgIT0gTlVMTCkgeworCQkJc3dpdGNoIChtZW1pbmZvX2VsZW0tPm1lbV90eXBlKSB7CisJCQljYXNlIEJGQV9NRU1fVFlQRV9LVkE6CisJCQkJdmZyZWUobWVtaW5mb19lbGVtLT5rdmEpOworCQkJCWJyZWFrOworCQkJY2FzZSBCRkFfTUVNX1RZUEVfRE1BOgorCQkJCWRtYV9mcmVlX2NvaGVyZW50KCZiZmFkLT5wY2lkZXYtPmRldiwKKwkJCQkJCW1lbWluZm9fZWxlbS0+bWVtX2xlbiwKKwkJCQkJCW1lbWluZm9fZWxlbS0+a3ZhLAorCQkJCQkJKGRtYV9hZGRyX3QpIG1lbWluZm9fZWxlbS0+ZG1hKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYmZhX2Fzc2VydCgwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCW1lbXNldChoYWxfbWVtaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfbWVtaW5mb19zKSk7Cit9CisKK3ZvaWQKK2JmYWRfdXBkYXRlX2hhbF9jZmcoc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqYmZhX2NmZykKK3sKKwlpZiAobnVtX3Jwb3J0cyA+IDApCisJCWJmYV9jZmctPmZ3Y2ZnLm51bV9ycG9ydHMgPSBudW1fcnBvcnRzOworCWlmIChudW1faW9zID4gMCkKKwkJYmZhX2NmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyA9IG51bV9pb3M7CisJaWYgKG51bV90bXMgPiAwKQorCQliZmFfY2ZnLT5md2NmZy5udW1fdHNraW1fcmVxcyA9IG51bV90bXM7CisJaWYgKG51bV9mY3hwcyA+IDApCisJCWJmYV9jZmctPmZ3Y2ZnLm51bV9mY3hwX3JlcXMgPSBudW1fZmN4cHM7CisJaWYgKG51bV91ZmJ1ZnMgPiAwKQorCQliZmFfY2ZnLT5md2NmZy5udW1fdWZfYnVmcyA9IG51bV91ZmJ1ZnM7CisJaWYgKHJlcXFfc2l6ZSA+IDApCisJCWJmYV9jZmctPmRydmNmZy5udW1fcmVxcV9lbGVtcyA9IHJlcXFfc2l6ZTsKKwlpZiAocnNwcV9zaXplID4gMCkKKwkJYmZhX2NmZy0+ZHJ2Y2ZnLm51bV9yc3BxX2VsZW1zID0gcnNwcV9zaXplOworCWlmIChudW1fc2dwZ3MgPiAwKQorCQliZmFfY2ZnLT5kcnZjZmcubnVtX3NncGdzID0gbnVtX3NncGdzOworCisJLyoKKwkgKiBwb3B1bGF0ZSB0aGUgaGFsIHZhbHVlcyBiYWNrIHRvIHRoZSBkcml2ZXIgZm9yIHN5c2ZzIHVzZS4KKwkgKiBvdGhlcndpc2UsIHRoZSBkZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHNob3duIGFzIDAgaW4gc3lzZnMKKwkgKi8KKwludW1fcnBvcnRzID0gYmZhX2NmZy0+ZndjZmcubnVtX3Jwb3J0czsKKwludW1faW9zICAgID0gYmZhX2NmZy0+ZndjZmcubnVtX2lvaW1fcmVxczsKKwludW1fdG1zCSAgID0gYmZhX2NmZy0+ZndjZmcubnVtX3Rza2ltX3JlcXM7CisJbnVtX2ZjeHBzICA9IGJmYV9jZmctPmZ3Y2ZnLm51bV9mY3hwX3JlcXM7CisJbnVtX3VmYnVmcyA9IGJmYV9jZmctPmZ3Y2ZnLm51bV91Zl9idWZzOworCXJlcXFfc2l6ZSAgPSBiZmFfY2ZnLT5kcnZjZmcubnVtX3JlcXFfZWxlbXM7CisJcnNwcV9zaXplICA9IGJmYV9jZmctPmRydmNmZy5udW1fcnNwcV9lbGVtczsKKwludW1fc2dwZ3MgID0gYmZhX2NmZy0+ZHJ2Y2ZnLm51bV9zZ3BnczsKK30KKworYmZhX3N0YXR1c190CitiZmFkX2hhbF9tZW1fYWxsb2Moc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqaGFsX21lbWluZm8gPSAmYmZhZC0+bWVtaW5mbzsKKwlzdHJ1Y3QgYmZhX21lbV9lbGVtX3MgKm1lbWluZm9fZWxlbTsKKwliZmFfc3RhdHVzX3QgICAgcmMgPSBCRkFfU1RBVFVTX09LOworCWRtYV9hZGRyX3QgICAgICBwaHlzX2FkZHI7CisJaW50ICAgICAgICAgICAgIHJldHJ5X2NvdW50ID0gMDsKKwlpbnQgICAgICAgICAgICAgcmVzZXRfdmFsdWUgPSAxOworCWludCAgICAgICAgICAgICBtaW5fbnVtX3NncGdzID0gNTEyOworCXZvaWQgICAgICAgICAgICprdmE7CisJaW50ICAgICAgICAgICAgIGk7CisKKwliZmFfY2ZnX2dldF9kZWZhdWx0KCZiZmFkLT5pb2NfY2ZnKTsKKworcmV0cnk6CisJYmZhZF91cGRhdGVfaGFsX2NmZygmYmZhZC0+aW9jX2NmZyk7CisJYmZhZC0+Y2ZnX2RhdGEuaW9jX3F1ZXVlX2RlcHRoID0gYmZhZC0+aW9jX2NmZy5md2NmZy5udW1faW9pbV9yZXFzOworCWJmYV9jZmdfZ2V0X21lbWluZm8oJmJmYWQtPmlvY19jZmcsIGhhbF9tZW1pbmZvKTsKKworCWZvciAoaSA9IDA7IGkgPCBCRkFfTUVNX1RZUEVfTUFYOyBpKyspIHsKKwkJbWVtaW5mb19lbGVtID0gJmhhbF9tZW1pbmZvLT5tZW1pbmZvW2ldOworCQlzd2l0Y2ggKG1lbWluZm9fZWxlbS0+bWVtX3R5cGUpIHsKKwkJY2FzZSBCRkFfTUVNX1RZUEVfS1ZBOgorCQkJa3ZhID0gdm1hbGxvYyhtZW1pbmZvX2VsZW0tPm1lbV9sZW4pOworCQkJaWYgKGt2YSA9PSBOVUxMKSB7CisJCQkJYmZhZF9oYWxfbWVtX3JlbGVhc2UoYmZhZCk7CisJCQkJcmMgPSBCRkFfU1RBVFVTX0VOT01FTTsKKwkJCQlnb3RvIGV4dDsKKwkJCX0KKwkJCW1lbXNldChrdmEsIDAsIG1lbWluZm9fZWxlbS0+bWVtX2xlbik7CisJCQltZW1pbmZvX2VsZW0tPmt2YSA9IGt2YTsKKwkJCWJyZWFrOworCQljYXNlIEJGQV9NRU1fVFlQRV9ETUE6CisJCQlrdmEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmJmYWQtPnBjaWRldi0+ZGV2LAorCQkJCQltZW1pbmZvX2VsZW0tPm1lbV9sZW4sCisJCQkJCSZwaHlzX2FkZHIsIEdGUF9LRVJORUwpOworCQkJaWYgKGt2YSA9PSBOVUxMKSB7CisJCQkJYmZhZF9oYWxfbWVtX3JlbGVhc2UoYmZhZCk7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBjYW5ub3QgYWxsb2NhdGUgd2l0aCBkZWZhdWx0CisJCQkJICogbnVtX3NncGFnZXMgdHJ5IHdpdGggaGFsZiB0aGUgdmFsdWUuCisJCQkJICovCisJCQkJaWYgKG51bV9zZ3BncyA+IG1pbl9udW1fc2dwZ3MpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmZhZFslZF06IG1lbW9yeSIKKwkJCQkJCSIgYWxsb2NhdGlvbiBmYWlsZWQgd2l0aCIKKwkJCQkJCSIgbnVtX3NncGdzOiAlZFxuIiwKKwkJCQkJCWJmYWQtPmluc3Rfbm8sIG51bV9zZ3Bncyk7CisJCQkJCW5leHRMb3dlckludCgmbnVtX3NncGdzKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmZhZFslZF06IHRyeWluZyB0byIKKwkJCQkJCSIgYWxsb2NhdGUgbWVtb3J5IHdpdGgiCisJCQkJCQkiIG51bV9zZ3BnczogJWRcbiIsCisJCQkJCQliZmFkLT5pbnN0X25vLCBudW1fc2dwZ3MpOworCQkJCQlyZXRyeV9jb3VudCsrOworCQkJCQlnb3RvIHJldHJ5OworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChudW1fc2dwZ3NfcGFybSA+IDApCisJCQkJCQludW1fc2dwZ3MgPSBudW1fc2dwZ3NfcGFybTsKKwkJCQkJZWxzZSB7CisJCQkJCQlyZXNldF92YWx1ZSA9CisJCQkJCQkJKDEgPDwgcmV0cnlfY291bnQpOworCQkJCQkJbnVtX3NncGdzICo9IHJlc2V0X3ZhbHVlOworCQkJCQl9CisJCQkJCXJjID0gQkZBX1NUQVRVU19FTk9NRU07CisJCQkJCWdvdG8gZXh0OworCQkJCX0KKwkJCX0KKworCQkJaWYgKG51bV9zZ3Bnc19wYXJtID4gMCkKKwkJCQludW1fc2dwZ3MgPSBudW1fc2dwZ3NfcGFybTsKKwkJCWVsc2UgeworCQkJCXJlc2V0X3ZhbHVlID0gKDEgPDwgcmV0cnlfY291bnQpOworCQkJCW51bV9zZ3BncyAqPSByZXNldF92YWx1ZTsKKwkJCX0KKworCQkJbWVtc2V0KGt2YSwgMCwgbWVtaW5mb19lbGVtLT5tZW1fbGVuKTsKKwkJCW1lbWluZm9fZWxlbS0+a3ZhID0ga3ZhOworCQkJbWVtaW5mb19lbGVtLT5kbWEgPSBwaHlzX2FkZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCisJCX0KKwl9CitleHQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIENyZWF0ZSBhIHZwb3J0IHVuZGVyIGEgdmYuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhZF92cG9ydF9jcmVhdGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdTE2IHZmX2lkLAorCQkgIHN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcG9ydF9jZmcpCit7CisJc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBvcnQ7CisJaW50ICAgICAgICAgICAgIHJjID0gQkZBX1NUQVRVU19PSzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJc3RydWN0IGNvbXBsZXRpb24gZmNvbXA7CisKKwl2cG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiZmFkX3Zwb3J0X3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZwb3J0KSB7CisJCXJjID0gQkZBX1NUQVRVU19FTk9NRU07CisJCWdvdG8gZXh0OworCX0KKworCXZwb3J0LT5kcnZfcG9ydC5iZmFkID0gYmZhZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJcmMgPSBiZmFfZmNzX3Zwb3J0X2NyZWF0ZSgmdnBvcnQtPmZjc192cG9ydCwgJmJmYWQtPmJmYV9mY3MsIHZmX2lkLAorCQkJCSAgcG9ydF9jZmcsIHZwb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmIChyYyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIGV4dF9mcmVlX3Zwb3J0OworCisJaWYgKHBvcnRfY2ZnLT5yb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lNKSB7CisJCXJjID0gYmZhZF9pbV9zY3NpX2hvc3RfYWxsb2MoYmZhZCwgdnBvcnQtPmRydl9wb3J0LmltX3BvcnQpOworCQlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykKKwkJCWdvdG8gZXh0X2ZyZWVfZmNzX3Zwb3J0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfZmNzX3Zwb3J0X3N0YXJ0KCZ2cG9ydC0+ZmNzX3Zwb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworCitleHRfZnJlZV9mY3NfdnBvcnQ6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXZwb3J0LT5jb21wX2RlbCA9ICZmY29tcDsKKwlpbml0X2NvbXBsZXRpb24odnBvcnQtPmNvbXBfZGVsKTsKKwliZmFfZmNzX3Zwb3J0X2RlbGV0ZSgmdnBvcnQtPmZjc192cG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJd2FpdF9mb3JfY29tcGxldGlvbih2cG9ydC0+Y29tcF9kZWwpOworZXh0X2ZyZWVfdnBvcnQ6CisJa2ZyZWUodnBvcnQpOworZXh0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBDcmVhdGUgYSB2ZiBhbmQgaXRzIGJhc2UgdnBvcnQgaW1wbGljaXRlbHkuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhZF92Zl9jcmVhdGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdTE2IHZmX2lkLAorCSAgICAgICBzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBvcnRfY2ZnKQoreworCXN0cnVjdCBiZmFkX3ZmX3MgKnZmOworCWludCAgICAgICAgICAgICByYyA9IEJGQV9TVEFUVVNfT0s7CisKKwl2ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiZmFkX3ZmX3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZmKSB7CisJCXJjID0gQkZBX1NUQVRVU19GQUlMRUQ7CisJCWdvdG8gZXh0OworCX0KKworCXJjID0gYmZhX2Zjc192Zl9jcmVhdGUoJnZmLT5mY3NfdmYsICZiZmFkLT5iZmFfZmNzLCB2Zl9pZCwgcG9ydF9jZmcsCisJCQkgICAgICAgdmYpOworCWlmIChyYyAhPSBCRkFfU1RBVFVTX09LKQorCQlrZnJlZSh2Zik7CitleHQ6CisJcmV0dXJuIHJjOworfQorCit2b2lkCitiZmFkX2JmYV90bW8odW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBiZmFkX3MgICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICBkb25lcTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWJmYV90aW1lcl90aWNrKCZiZmFkLT5iZmEpOworCisJYmZhX2NvbXBfZGVxKCZiZmFkLT5iZmEsICZkb25lcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRvbmVxKSkgeworCQliZmFfY29tcF9wcm9jZXNzKCZiZmFkLT5iZmEsICZkb25lcSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJYmZhX2NvbXBfZnJlZSgmYmZhZC0+YmZhLCAmZG9uZXEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwl9CisKKwltb2RfdGltZXIoJmJmYWQtPmhhbF90bW8sIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEJGQV9USU1FUl9GUkVRKSk7Cit9CisKK3ZvaWQKK2JmYWRfaW5pdF90aW1lcihzdHJ1Y3QgYmZhZF9zICpiZmFkKQoreworCWluaXRfdGltZXIoJmJmYWQtPmhhbF90bW8pOworCWJmYWQtPmhhbF90bW8uZnVuY3Rpb24gPSBiZmFkX2JmYV90bW87CisJYmZhZC0+aGFsX3Rtby5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYmZhZDsKKworCW1vZF90aW1lcigmYmZhZC0+aGFsX3RtbywgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQkZBX1RJTUVSX0ZSRVEpKTsKK30KKworaW50CitiZmFkX3BjaV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYmZhZF9zICpiZmFkKQoreworCXVuc2lnbmVkIGxvbmcgICBiYXIwX2xlbjsKKwlpbnQgICAgICAgICAgICAgcmMgPSAtRU5PREVWOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCUJGQV9QUklOVEYoQkZBX0VSUiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWwgJXBcbiIsIHBkZXYpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBCRkFEX0RSSVZFUl9OQU1FKSkKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkgIT0gMCkKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkgIT0gMCkgeworCQkJQkZBX1BSSU5URihCRkFfRVJSLCAicGNpX3NldF9kbWFfbWFzayBmYWlsICVwXG4iLCBwZGV2KTsKKwkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCQl9CisKKwliZmFkLT5wY2lfYmFyMF9tYXAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJYmFyMF9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCWJmYWQtPnBjaV9iYXIwX2t2YSA9IGlvcmVtYXAoYmZhZC0+cGNpX2JhcjBfbWFwLCBiYXIwX2xlbik7CisKKwlpZiAoYmZhZC0+cGNpX2JhcjBfa3ZhID09IE5VTEwpIHsKKwkJQkZBX1BSSU5URihCRkFfRVJSLCAiRmFpbCB0byBtYXAgYmFyMFxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKworCWJmYWQtPmhhbF9wY2lkZXYucGNpX3Nsb3QgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisJYmZhZC0+aGFsX3BjaWRldi5wY2lfZnVuYyA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKKwliZmFkLT5oYWxfcGNpZGV2LnBjaV9iYXJfa3ZhID0gYmZhZC0+cGNpX2JhcjBfa3ZhOworCWJmYWQtPmhhbF9wY2lkZXYuZGV2aWNlX2lkID0gcGRldi0+ZGV2aWNlOworCWJmYWQtPnBjaV9uYW1lID0gcGNpX25hbWUocGRldik7CisKKwliZmFkLT5wY2lfYXR0ci52ZW5kb3JfaWQgPSBwZGV2LT52ZW5kb3I7CisJYmZhZC0+cGNpX2F0dHIuZGV2aWNlX2lkID0gcGRldi0+ZGV2aWNlOworCWJmYWQtPnBjaV9hdHRyLnNzaWQgPSBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCWJmYWQtPnBjaV9hdHRyLnNzdmlkID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKKwliZmFkLT5wY2lfYXR0ci5wY2lmbiA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKKworCWJmYWQtPnBjaWRldiA9IHBkZXY7CisJcmV0dXJuIDA7CisKK291dF9yZWxlYXNlX3JlZ2lvbjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQKK2JmYWRfcGNpX3VuaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKyNpZiBkZWZpbmVkKF9faWE2NF9fKQorCXBjaV9pb3VubWFwKHBkZXYsIGJmYWQtPnBjaV9iYXIwX2t2YSk7CisjZWxzZQorCWlvdW5tYXAoYmZhZC0+cGNpX2JhcjBfa3ZhKTsKKyNlbmRpZgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKwordm9pZAorYmZhZF9mY3NfcG9ydF9jZmcoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgcG9ydF9jZmc7CisJc3RydWN0IGJmYV9wcG9ydF9hdHRyX3MgYXR0cjsKKwljaGFyICAgICAgICAgICAgc3ltbmFtZVtCRkFfU1lNTkFNRV9NQVhMRU5dOworCisJc3ByaW50ZihzeW1uYW1lLCAiJXMtJWQiLCBCRkFEX0RSSVZFUl9OQU1FLCBiZmFkLT5pbnN0X25vKTsKKwltZW1jcHkocG9ydF9jZmcuc3ltX25hbWUuc3ltbmFtZSwgc3ltbmFtZSwgc3RybGVuKHN5bW5hbWUpKTsKKwliZmFfcHBvcnRfZ2V0X2F0dHIoJmJmYWQtPmJmYSwgJmF0dHIpOworCXBvcnRfY2ZnLm53d24gPSBhdHRyLm53d247CisJcG9ydF9jZmcucHd3biA9IGF0dHIucHd3bjsKKworCWJmYV9mY3NfY2ZnX2Jhc2VfcG9ydCgmYmZhZC0+YmZhX2ZjcywgJnBvcnRfY2ZnKTsKK30KKworYmZhX3N0YXR1c190CitiZmFkX2Rydl9pbml0KHN0cnVjdCBiZmFkX3MgKmJmYWQpCit7CisJYmZhX3N0YXR1c190ICAgIHJjOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlzdHJ1Y3QgYmZhX2Zjc19kcml2ZXJfaW5mb19zIGRyaXZlcl9pbmZvOworCWludCAgICAgICAgICAgICBpOworCisJYmZhZC0+Y2ZnX2RhdGEucnBvcnRfZGVsX3RpbWVvdXQgPSBycG9ydF9kZWxfdGltZW91dDsKKwliZmFkLT5jZmdfZGF0YS5sdW5fcXVldWVfZGVwdGggPSBiZmFfbHVuX3F1ZXVlX2RlcHRoOworCWJmYWQtPmNmZ19kYXRhLmlvX21heF9zZ2UgPSBiZmFfaW9fbWF4X3NnZTsKKwliZmFkLT5jZmdfZGF0YS5iaW5kaW5nX21ldGhvZCA9IEZDUF9QV1dOX0JJTkRJTkc7CisKKwlyYyA9IGJmYWRfaGFsX21lbV9hbGxvYyhiZmFkKTsKKwlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJiZmFkJWQgYmZhZF9oYWxfbWVtX2FsbG9jIGZhaWx1cmVcbiIsCisJCSAgICAgICBiZmFkLT5pbnN0X25vKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGF0dGFjaCBhbGwgQnJvY2FkZSBIQkEgcG9ydHMsIgorCQkJIiBTeXN0ZW0gbWF5IG5lZWQgbW9yZSBtZW1vcnkuXG4iKTsKKwkJZ290byBvdXRfaGFsX21lbV9hbGxvY19mYWlsdXJlOworCX0KKworCWJmYV9pbml0X2xvZygmYmZhZC0+YmZhLCBiZmFkLT5sb2dtb2QpOworCWJmYV9pbml0X3RyYygmYmZhZC0+YmZhLCBiZmFkLT50cmNtb2QpOworCWJmYV9pbml0X2FlbigmYmZhZC0+YmZhLCBiZmFkLT5hZW4pOworCUlOSVRfTElTVF9IRUFEKCZiZmFkLT5maWxlX3EpOworCUlOSVRfTElTVF9IRUFEKCZiZmFkLT5maWxlX2ZyZWVfcSk7CisJZm9yIChpID0gMDsgaSA8IEJGQURfQUVOX01BWF9BUFBTOyBpKyspIHsKKwkJYmZhX3FfcWVfaW5pdCgmYmZhZC0+ZmlsZV9idWZbaV0ucWUpOworCQlsaXN0X2FkZF90YWlsKCZiZmFkLT5maWxlX2J1ZltpXS5xZSwgJmJmYWQtPmZpbGVfZnJlZV9xKTsKKwl9CisJYmZhX2luaXRfcGxvZygmYmZhZC0+YmZhLCAmYmZhZC0+cGxvZ19idWYpOworCWJmYV9wbG9nX2luaXQoJmJmYWQtPnBsb2dfYnVmKTsKKwliZmFfcGxvZ19zdHIoJmJmYWQtPnBsb2dfYnVmLCBCRkFfUExfTUlEX0RSVlIsIEJGQV9QTF9FSURfRFJJVkVSX1NUQVJULAorCQkgICAgIDAsICJEcml2ZXIgQXR0YWNoIik7CisKKwliZmFfYXR0YWNoKCZiZmFkLT5iZmEsIGJmYWQsICZiZmFkLT5pb2NfY2ZnLCAmYmZhZC0+bWVtaW5mbywKKwkJICAgJmJmYWQtPmhhbF9wY2lkZXYpOworCisJaW5pdF9jb21wbGV0aW9uKCZiZmFkLT5jb21wKTsKKworCS8qCisJICogRW5hYmxlIEludGVycnVwdCBhbmQgd2FpdCBiZmFfaW5pdCBjb21wbGV0aW9uCisJICovCisJaWYgKGJmYWRfc2V0dXBfaW50cihiZmFkKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJiZmFkJWQ6IGJmYWRfc2V0dXBfaW50ciBmYWlsZWRcbiIsCisJCSAgICAgICBiZmFkLT5pbnN0X25vKTsKKwkJZ290byBvdXRfc2V0dXBfaW50cl9mYWlsdXJlOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfaW5pdCgmYmZhZC0+YmZhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogU2V0IHVwIGludGVycnVwdCBoYW5kbGVyIGZvciBlYWNoIHZlY3RvcnMKKwkgKi8KKwlpZiAoKGJmYWQtPmJmYWRfZmxhZ3MgJiBCRkFEX01TSVhfT04pCisJICAgICYmIGJmYWRfaW5zdGFsbF9tc2l4X2hhbmRsZXIoYmZhZCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGluc3RhbGxfbXNpeCBmYWlsZWQsIGJmYWQlZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgYmZhZC0+aW5zdF9ubyk7CisJfQorCisJYmZhZF9pbml0X3RpbWVyKGJmYWQpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmYmZhZC0+Y29tcCk7CisKKwltZW1zZXQoJmRyaXZlcl9pbmZvLCAwLCBzaXplb2YoZHJpdmVyX2luZm8pKTsKKwlzdHJuY3B5KGRyaXZlcl9pbmZvLnZlcnNpb24sIEJGQURfRFJJVkVSX1ZFUlNJT04sCisJCXNpemVvZihkcml2ZXJfaW5mby52ZXJzaW9uKSAtIDEpOworCWlmIChob3N0X25hbWUpCisJCXN0cm5jcHkoZHJpdmVyX2luZm8uaG9zdF9tYWNoaW5lX25hbWUsIGhvc3RfbmFtZSwKKwkJCXNpemVvZihkcml2ZXJfaW5mby5ob3N0X21hY2hpbmVfbmFtZSkgLSAxKTsKKwlpZiAob3NfbmFtZSkKKwkJc3RybmNweShkcml2ZXJfaW5mby5ob3N0X29zX25hbWUsIG9zX25hbWUsCisJCQlzaXplb2YoZHJpdmVyX2luZm8uaG9zdF9vc19uYW1lKSAtIDEpOworCWlmIChvc19wYXRjaCkKKwkJc3RybmNweShkcml2ZXJfaW5mby5ob3N0X29zX3BhdGNoLCBvc19wYXRjaCwKKwkJCXNpemVvZihkcml2ZXJfaW5mby5ob3N0X29zX3BhdGNoKSAtIDEpOworCisJc3RybmNweShkcml2ZXJfaW5mby5vc19kZXZpY2VfbmFtZSwgYmZhZC0+cGNpX25hbWUsCisJCXNpemVvZihkcml2ZXJfaW5mby5vc19kZXZpY2VfbmFtZSAtIDEpKTsKKworCS8qCisJICogRkNTIElOSVQKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJYmZhX2Zjc19sb2dfaW5pdCgmYmZhZC0+YmZhX2ZjcywgYmZhZC0+bG9nbW9kKTsKKwliZmFfZmNzX3RyY19pbml0KCZiZmFkLT5iZmFfZmNzLCBiZmFkLT50cmNtb2QpOworCWJmYV9mY3NfYWVuX2luaXQoJmJmYWQtPmJmYV9mY3MsIGJmYWQtPmFlbik7CisJYmZhX2Zjc19pbml0KCZiZmFkLT5iZmFfZmNzLCAmYmZhZC0+YmZhLCBiZmFkLCBCRkFfRkFMU0UpOworCWJmYV9mY3NfZHJpdmVyX2luZm9faW5pdCgmYmZhZC0+YmZhX2ZjcywgJmRyaXZlcl9pbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWJmYWQtPmJmYWRfZmxhZ3MgfD0gQkZBRF9EUlZfSU5JVF9ET05FOworCXJldHVybiBCRkFfU1RBVFVTX09LOworCitvdXRfc2V0dXBfaW50cl9mYWlsdXJlOgorCWJmYV9kZXRhY2goJmJmYWQtPmJmYSk7CisJYmZhZF9oYWxfbWVtX3JlbGVhc2UoYmZhZCk7CitvdXRfaGFsX21lbV9hbGxvY19mYWlsdXJlOgorCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKK30KKwordm9pZAorYmZhZF9kcnZfdW5pbml0KHN0cnVjdCBiZmFkX3MgKmJmYWQpCit7CisJZGVsX3RpbWVyX3N5bmMoJmJmYWQtPmhhbF90bW8pOworCWJmYV9pc3JfZGlzYWJsZSgmYmZhZC0+YmZhKTsKKwliZmFfZGV0YWNoKCZiZmFkLT5iZmEpOworCWJmYWRfcmVtb3ZlX2ludHIoYmZhZCk7CisJYmZhX2Fzc2VydChsaXN0X2VtcHR5KCZiZmFkLT5maWxlX3EpKTsKKwliZmFkX2hhbF9tZW1fcmVsZWFzZShiZmFkKTsKK30KKwordm9pZAorYmZhZF9kcnZfc3RhcnQoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJYmZhX3N0YXJ0KCZiZmFkLT5iZmEpOworCWJmYV9mY3Nfc3RhcnQoJmJmYWQtPmJmYV9mY3MpOworCWJmYWQtPmJmYWRfZmxhZ3MgfD0gQkZBRF9IQUxfU1RBUlRfRE9ORTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWJmYWRfZmM0X3Byb2JlX3Bvc3QoYmZhZCk7Cit9CisKK3ZvaWQKK2JmYWRfZHJ2X3N0b3Aoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW5pdF9jb21wbGV0aW9uKCZiZmFkLT5jb21wKTsKKwliZmFkLT5wcG9ydC5mbGFncyB8PSBCRkFEX1BPUlRfREVMRVRFOworCWJmYV9mY3NfZXhpdCgmYmZhZC0+YmZhX2Zjcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYmZhZC0+Y29tcCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW5pdF9jb21wbGV0aW9uKCZiZmFkLT5jb21wKTsKKwliZmFfc3RvcCgmYmZhZC0+YmZhKTsKKwliZmFkLT5iZmFkX2ZsYWdzICY9IH5CRkFEX0hBTF9TVEFSVF9ET05FOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJmYWQtPmNvbXApOworfQorCitiZmFfc3RhdHVzX3QKK2JmYWRfY2ZnX3Bwb3J0KHN0cnVjdCBiZmFkX3MgKmJmYWQsIGVudW0gYmZhX3BvcnRfcm9sZSByb2xlKQoreworCWludCAgICAgICAgICAgICByYyA9IEJGQV9TVEFUVVNfT0s7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNjc2lfaG9zdCBmb3IgdGhlIHBoeXNpY2FsIHBvcnQKKwkgKi8KKwlpZiAoKGJmYWRfc3VwcG9ydGVkX2ZjNHMgJiBCRkFfUE9SVF9ST0xFX0ZDUF9JTSkKKwkgICAgJiYgKHJvbGUgJiBCRkFfUE9SVF9ST0xFX0ZDUF9JTSkpIHsKKwkJaWYgKGJmYWQtPnBwb3J0LmltX3BvcnQgPT0gTlVMTCkgeworCQkJcmMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmMgPSBiZmFkX2ltX3Njc2lfaG9zdF9hbGxvYyhiZmFkLCBiZmFkLT5wcG9ydC5pbV9wb3J0KTsKKwkJaWYgKHJjICE9IEJGQV9TVEFUVVNfT0spCisJCQlnb3RvIG91dDsKKworCQliZmFkLT5wcG9ydC5yb2xlcyB8PSBCRkFfUE9SVF9ST0xFX0ZDUF9JTTsKKwl9CisKKwliZmFkLT5iZmFkX2ZsYWdzIHw9IEJGQURfQ0ZHX1BQT1JUX0RPTkU7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQKK2JmYWRfdW5jZmdfcHBvcnQoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlpZiAoKGJmYWQtPnBwb3J0LnJvbGVzICYgQkZBX1BPUlRfUk9MRV9GQ1BfSVBGQykgJiYgaXBmY19lbmFibGUpIHsKKwkJYmZhZF9pcGZjX3BvcnRfZGVsZXRlKGJmYWQsICZiZmFkLT5wcG9ydCk7CisJCWJmYWQtPnBwb3J0LnJvbGVzICY9IH5CRkFfUE9SVF9ST0xFX0ZDUF9JUEZDOworCX0KKworCWlmICgoYmZhZF9zdXBwb3J0ZWRfZmM0cyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lNKQorCSAgICAmJiAoYmZhZC0+cHBvcnQucm9sZXMgJiBCRkFfUE9SVF9ST0xFX0ZDUF9JTSkpIHsKKwkJYmZhZF9pbV9zY3NpX2hvc3RfZnJlZShiZmFkLCBiZmFkLT5wcG9ydC5pbV9wb3J0KTsKKwkJYmZhZF9pbV9wb3J0X2NsZWFuKGJmYWQtPnBwb3J0LmltX3BvcnQpOworCQlrZnJlZShiZmFkLT5wcG9ydC5pbV9wb3J0KTsKKwkJYmZhZC0+cHBvcnQucm9sZXMgJj0gfkJGQV9QT1JUX1JPTEVfRkNQX0lNOworCX0KKworCWJmYWQtPmJmYWRfZmxhZ3MgJj0gfkJGQURfQ0ZHX1BQT1JUX0RPTkU7Cit9CisKK3ZvaWQKK2JmYWRfZHJ2X2xvZ19sZXZlbF9zZXQoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlpZiAobG9nX2xldmVsID4gQkZBX0xPR19JTlZBTElEICYmIGxvZ19sZXZlbCA8PSBCRkFfTE9HX0xFVkVMX01BWCkKKwkJYmZhX2xvZ19zZXRfbGV2ZWxfYWxsKCZiZmFkLT5sb2dfZGF0YSwgbG9nX2xldmVsKTsKK30KKworIC8qCisgICogIFBDSV9lbnRyeSBQQ0kgZHJpdmVyIGVudHJpZXMgKiB7CisgICovCisKKy8qKgorICogUENJIHByb2JlIGVudHJ5LgorICovCitpbnQKK2JmYWRfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGlkKQoreworCXN0cnVjdCBiZmFkX3MgICpiZmFkOworCWludCAgICAgICAgICAgICBlcnJvciA9IC1FTk9ERVYsIHJldHZhbDsKKwljaGFyICAgICAgICAgICAgYnVmWzE2XTsKKworCS8qCisJICogRm9yIHNpbmdsZSBwb3J0IGNhcmRzIC0gb25seSBjbGFpbSBmdW5jdGlvbiAwCisJICovCisJaWYgKChwZGV2LT5kZXZpY2UgPT0gQkZBX1BDSV9ERVZJQ0VfSURfRkNfOEcxUCkKKwkgICAgJiYgKFBDSV9GVU5DKHBkZXYtPmRldmZuKSAhPSAwKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlCRkFfVFJBQ0UoQkZBX0lORk8sICJiZmFkX3BjaV9wcm9iZSBlbnRyeSIpOworCisJYmZhZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiZmFkX3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJmYWQpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwliZmFkLT50cmNtb2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmZhX3RyY19tb2RfcyksIEdGUF9LRVJORUwpOworCWlmICghYmZhZC0+dHJjbW9kKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVycm9yIGFsbG9jIHRyYWNlIGJ1ZmZlciFcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2FsbG9jX3RyYWNlX2ZhaWx1cmU7CisJfQorCisJLyoKKwkgKiBMT0cvVFJBQ0UgSU5JVAorCSAqLworCWJmYV90cmNfaW5pdChiZmFkLT50cmNtb2QpOworCWJmYV90cmMoYmZhZCwgYmZhZF9pbnN0KTsKKworCWJmYWQtPmxvZ21vZCA9ICZiZmFkLT5sb2dfZGF0YTsKKwlzcHJpbnRmKGJ1ZiwgIiVkIiwgYmZhZF9pbnN0KTsKKwliZmFfbG9nX2luaXQoYmZhZC0+bG9nbW9kLCBidWYsIGJmYV9vc19wcmludGYpOworCisJYmZhZF9kcnZfbG9nX2xldmVsX3NldChiZmFkKTsKKworCWJmYWQtPmFlbiA9ICZiZmFkLT5hZW5fYnVmOworCisJaWYgKCEoYmZhZF9sb2FkX2Z3aW1nKHBkZXYpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJiZmFkX2xvYWRfZndpbWcgZmFpbHVyZSFcbiIpOworCQlrZnJlZShiZmFkLT50cmNtb2QpOworCQlnb3RvIG91dF9hbGxvY190cmFjZV9mYWlsdXJlOworCX0KKworCXJldHZhbCA9IGJmYWRfcGNpX2luaXQocGRldiwgYmZhZCk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJiZmFkX3BjaV9pbml0IGZhaWx1cmUhXG4iKTsKKwkJZXJyb3IgPSByZXR2YWw7CisJCWdvdG8gb3V0X3BjaV9pbml0X2ZhaWx1cmU7CisJfQorCisJbXV0ZXhfbG9jaygmYmZhZF9tdXRleCk7CisJYmZhZC0+aW5zdF9ubyA9IGJmYWRfaW5zdCsrOworCWxpc3RfYWRkX3RhaWwoJmJmYWQtPmxpc3RfZW50cnksICZiZmFkX2xpc3QpOworCW11dGV4X3VubG9jaygmYmZhZF9tdXRleCk7CisKKwlzcGluX2xvY2tfaW5pdCgmYmZhZC0+YmZhZF9sb2NrKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYmZhZCk7CisKKwliZmFkLT5yZWZfY291bnQgPSAwOworCWJmYWQtPnBwb3J0LmJmYWQgPSBiZmFkOworCisJcmV0dmFsID0gYmZhZF9kcnZfaW5pdChiZmFkKTsKKwlpZiAocmV0dmFsICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0X2Rydl9pbml0X2ZhaWx1cmU7CisJaWYgKCEoYmZhZC0+YmZhZF9mbGFncyAmIEJGQURfSEFMX0lOSVRfRE9ORSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmZhZCVkOiBoYWwgaW5pdCBmYWlsZWRcbiIsIGJmYWQtPmluc3Rfbm8pOworCQlnb3RvIG9rOworCX0KKworCS8qCisJICogUFBPUlQgRkNTIGNvbmZpZworCSAqLworCWJmYWRfZmNzX3BvcnRfY2ZnKGJmYWQpOworCisJcmV0dmFsID0gYmZhZF9jZmdfcHBvcnQoYmZhZCwgQkZBX1BPUlRfUk9MRV9GQ1BfSU0pOworCWlmIChyZXR2YWwgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXRfY2ZnX3Bwb3J0X2ZhaWx1cmU7CisKKwkvKgorCSAqIEJGQUQgbGV2ZWwgRkM0IChJTS9UTS9JUEZDKSBzcGVjaWZpYyByZXNvdXJjZSBhbGxvY2F0aW9uCisJICovCisJcmV0dmFsID0gYmZhZF9mYzRfcHJvYmUoYmZhZCk7CisJaWYgKHJldHZhbCAhPSBCRkFfU1RBVFVTX09LKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImJmYWRfZmM0X3Byb2JlIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2ZjNF9wcm9iZV9mYWlsdXJlOworCX0KKworCWJmYWRfZHJ2X3N0YXJ0KGJmYWQpOworCisJLyoKKwkgKiBJZiBiZmFfbGlua3VwX2RlbGF5IGlzIHNldCB0byAtMSBkZWZhdWx0OyB0cnkgdG8gcmV0cml2ZSB0aGUKKwkgKiB2YWx1ZSB1c2luZyB0aGUgYmZhZF9vc19nZXRfbGlua3VwX2RlbGF5KCk7IGVsc2UgdXNlIHRoZQorCSAqIHBhc3NlZCBpbiBtb2R1bGUgcGFyYW0gdmFsdWUgYXMgdGhlIGJmYV9saW5rdXBfZGVsYXkuCisJICovCisJaWYgKGJmYV9saW5rdXBfZGVsYXkgPCAwKSB7CisJCWJmYV9saW5rdXBfZGVsYXkgPSBiZmFkX29zX2dldF9saW5rdXBfZGVsYXkoYmZhZCk7CisJCWJmYWRfb3NfcnBvcnRfb25saW5lX3dhaXQoYmZhZCk7CisJCWJmYV9saW5rdXBfZGVsYXkgPSAtMTsKKwl9IGVsc2UgeworCQliZmFkX29zX3Jwb3J0X29ubGluZV93YWl0KGJmYWQpOworCX0KKworCWJmYV9sb2coYmZhZC0+bG9nbW9kLCBCRkFfTE9HX0xJTlVYX0RFVklDRV9DTEFJTUVELCBiZmFkLT5wY2lfbmFtZSk7CitvazoKKwlyZXR1cm4gMDsKKworb3V0X2ZjNF9wcm9iZV9mYWlsdXJlOgorCWJmYWRfZmM0X3Byb2JlX3VuZG8oYmZhZCk7CisJYmZhZF91bmNmZ19wcG9ydChiZmFkKTsKK291dF9jZmdfcHBvcnRfZmFpbHVyZToKKwliZmFkX2Rydl91bmluaXQoYmZhZCk7CitvdXRfZHJ2X2luaXRfZmFpbHVyZToKKwltdXRleF9sb2NrKCZiZmFkX211dGV4KTsKKwliZmFkX2luc3QtLTsKKwlsaXN0X2RlbCgmYmZhZC0+bGlzdF9lbnRyeSk7CisJbXV0ZXhfdW5sb2NrKCZiZmFkX211dGV4KTsKKwliZmFkX3BjaV91bmluaXQocGRldiwgYmZhZCk7CitvdXRfcGNpX2luaXRfZmFpbHVyZToKKwlrZnJlZShiZmFkLT50cmNtb2QpOworb3V0X2FsbG9jX3RyYWNlX2ZhaWx1cmU6CisJa2ZyZWUoYmZhZCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIFBDSSByZW1vdmUgZW50cnkuCisgKi8KK3ZvaWQKK2JmYWRfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYmZhZF9zICAqYmZhZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwliZmFfdHJjKGJmYWQsIGJmYWQtPmluc3Rfbm8pOworCisJaWYgKChiZmFkLT5iZmFkX2ZsYWdzICYgQkZBRF9EUlZfSU5JVF9ET05FKQorCSAgICAmJiAhKGJmYWQtPmJmYWRfZmxhZ3MgJiBCRkFEX0hBTF9JTklUX0RPTkUpKSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpbml0X2NvbXBsZXRpb24oJmJmYWQtPmNvbXApOworCQliZmFfc3RvcCgmYmZhZC0+YmZhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJmYWQtPmNvbXApOworCisJCWJmYWRfcmVtb3ZlX2ludHIoYmZhZCk7CisJCWRlbF90aW1lcl9zeW5jKCZiZmFkLT5oYWxfdG1vKTsKKwkJZ290byBoYWxfZGV0YWNoOworCX0gZWxzZSBpZiAoIShiZmFkLT5iZmFkX2ZsYWdzICYgQkZBRF9EUlZfSU5JVF9ET05FKSkgeworCQlnb3RvIHJlbW92ZV9zeXNmczsKKwl9CisKKwlpZiAoYmZhZC0+YmZhZF9mbGFncyAmIEJGQURfSEFMX1NUQVJUX0RPTkUpCisJCWJmYWRfZHJ2X3N0b3AoYmZhZCk7CisKKwliZmFkX3JlbW92ZV9pbnRyKGJmYWQpOworCisJZGVsX3RpbWVyX3N5bmMoJmJmYWQtPmhhbF90bW8pOworCWJmYWRfZmM0X3Byb2JlX3VuZG8oYmZhZCk7CisKKwlpZiAoYmZhZC0+YmZhZF9mbGFncyAmIEJGQURfQ0ZHX1BQT1JUX0RPTkUpCisJCWJmYWRfdW5jZmdfcHBvcnQoYmZhZCk7CisKK2hhbF9kZXRhY2g6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWJmYV9kZXRhY2goJmJmYWQtPmJmYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJYmZhZF9oYWxfbWVtX3JlbGVhc2UoYmZhZCk7CityZW1vdmVfc3lzZnM6CisKKwltdXRleF9sb2NrKCZiZmFkX211dGV4KTsKKwliZmFkX2luc3QtLTsKKwlsaXN0X2RlbCgmYmZhZC0+bGlzdF9lbnRyeSk7CisJbXV0ZXhfdW5sb2NrKCZiZmFkX211dGV4KTsKKwliZmFkX3BjaV91bmluaXQocGRldiwgYmZhZCk7CisKKwlrZnJlZShiZmFkLT50cmNtb2QpOworCWtmcmVlKGJmYWQpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBiZmFkX2lkX3RhYmxlW10gPSB7CisJeworCSAudmVuZG9yID0gQkZBX1BDSV9WRU5ET1JfSURfQlJPQ0FERSwKKwkgLmRldmljZSA9IEJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMlAsCisJIC5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCSAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkgfSwKKwl7CisJIC52ZW5kb3IgPSBCRkFfUENJX1ZFTkRPUl9JRF9CUk9DQURFLAorCSAuZGV2aWNlID0gQkZBX1BDSV9ERVZJQ0VfSURfRkNfOEcxUCwKKwkgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCSB9LAorCXsKKwkgLnZlbmRvciA9IEJGQV9QQ0lfVkVORE9SX0lEX0JST0NBREUsCisJIC5kZXZpY2UgPSBCRkFfUENJX0RFVklDRV9JRF9DVCwKKwkgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCSAuY2xhc3MgPSAoUENJX0NMQVNTX1NFUklBTF9GSUJFUiA8PCA4KSwKKwkgLmNsYXNzX21hc2sgPSB+MCwKKwkgfSwKKworCXswLCAwfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBiZmFkX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGJmYWRfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IEJGQURfRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlID0gYmZhZF9pZF90YWJsZSwKKwkucHJvYmUgPSBiZmFkX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYmZhZF9wY2lfcmVtb3ZlKSwKK307CisKKy8qKgorICogIExpbnV4IGRyaXZlciBtb2R1bGUgZnVuY3Rpb25zCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhZF9mYzRfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgICAgICAgICAgICAgcmM7CisKKwlyYyA9IGJmYWRfaW1fbW9kdWxlX2luaXQoKTsKKwlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBleHQ7CisKKwliZmFkX3RtX21vZHVsZV9pbml0KCk7CisJaWYgKGlwZmNfZW5hYmxlKQorCQliZmFkX2lwZmNfbW9kdWxlX2luaXQoKTsKK2V4dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQKK2JmYWRfZmM0X21vZHVsZV9leGl0KHZvaWQpCit7CisJaWYgKGlwZmNfZW5hYmxlKQorCQliZmFkX2lwZmNfbW9kdWxlX2V4aXQoKTsKKwliZmFkX3RtX21vZHVsZV9leGl0KCk7CisJYmZhZF9pbV9tb2R1bGVfZXhpdCgpOworfQorCisvKioKKyAqIERyaXZlciBtb2R1bGUgaW5pdC4KKyAqLworc3RhdGljIGludCAgICAgIF9faW5pdAorYmZhZF9pbml0KHZvaWQpCit7CisJaW50ICAgICAgICAgICAgIGVycm9yID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIkJyb2NhZGUgQkZBIEZDL0ZDT0UgU0NTSSBkcml2ZXIgLSB2ZXJzaW9uOiAlc1xuIiwKKwkgICAgICAgQkZBRF9EUklWRVJfVkVSU0lPTik7CisKKwlpZiAobnVtX3NncGdzID4gMCkKKwkJbnVtX3NncGdzX3Bhcm0gPSBudW1fc2dwZ3M7CisKKwllcnJvciA9IGJmYWRfZmM0X21vZHVsZV9pbml0KCk7CisJaWYgKGVycm9yKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmZhZF9mYzRfbW9kdWxlX2luaXQgZmFpbHVyZVxuIik7CisJCWdvdG8gZXh0OworCX0KKworCWlmICghc3RyY21wKEZDUElfTkFNRSwgIiBmY3BpbSIpKQorCQliZmFkX3N1cHBvcnRlZF9mYzRzIHw9IEJGQV9QT1JUX1JPTEVfRkNQX0lNOworCWlmICghc3RyY21wKEZDUFRfTkFNRSwgIiBmY3B0bSIpKQorCQliZmFkX3N1cHBvcnRlZF9mYzRzIHw9IEJGQV9QT1JUX1JPTEVfRkNQX1RNOworCWlmICghc3RyY21wKElQRkNfTkFNRSwgIiBpcGZjIikpCisJCWJmYWRfc3VwcG9ydGVkX2ZjNHMgfD0gQkZBX1BPUlRfUk9MRV9GQ1BfSVBGQzsKKworCWJmYV9pb2NfYXV0b19yZWNvdmVyKGlvY19hdXRvX3JlY292ZXIpOworCWJmYV9mY3NfcnBvcnRfc2V0X2RlbF90aW1lb3V0KHJwb3J0X2RlbF90aW1lb3V0KTsKKwllcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJmYWRfcGNpX2RyaXZlcik7CisKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmZhZCBwY2lfcmVnaXN0ZXJfZHJpdmVyIGZhaWx1cmVcbiIpOworCQlnb3RvIGV4dDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXh0OgorCWJmYWRfZmM0X21vZHVsZV9leGl0KCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIERyaXZlciBtb2R1bGUgZXhpdC4KKyAqLworc3RhdGljIHZvaWQgICAgIF9fZXhpdAorYmZhZF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZiZmFkX3BjaV9kcml2ZXIpOworCWJmYWRfZmM0X21vZHVsZV9leGl0KCk7CisJYmZhZF9mcmVlX2Z3aW1nKCk7Cit9CisKKyNkZWZpbmUgQkZBRF9QUk9UT19OQU1FIEZDUElfTkFNRSBGQ1BUX05BTUUgSVBGQ19OQU1FCisKK21vZHVsZV9pbml0KGJmYWRfaW5pdCk7Cittb2R1bGVfZXhpdChiZmFkX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9jYWRlIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlciIgQkZBRF9QUk9UT19OQU1FKTsKK01PRFVMRV9BVVRIT1IoIkJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLiIpOworTU9EVUxFX1ZFUlNJT04oQkZBRF9EUklWRVJfVkVSU0lPTik7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9hdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyOWFlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9hdHRyLmMKQEAgLTAsMCArMSw2NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2F0dHIuYyBMaW51eCBkcml2ZXIgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgbW9kdWxlLgorICovCisKKyNpbmNsdWRlICJiZmFkX2Rydi5oIgorI2luY2x1ZGUgImJmYWRfaW0uaCIKKyNpbmNsdWRlICJiZmFkX3RyY21vZC5oIgorI2luY2x1ZGUgImJmYWRfYXR0ci5oIgorCisvKioKKyAqICBGQ190cmFuc3BvcnRfdGVtcGxhdGUgRkMgdHJhbnNwb3J0IHRlbXBsYXRlCisgKi8KKworLyoqCisgKiBGQyB0cmFuc3BvcnQgdGVtcGxhdGUgZW50cnksIGdldCBTQ1NJIHRhcmdldCBwb3J0IElELgorICovCit2b2lkCitiZmFkX2ltX2dldF9zdGFyZ2V0X3BvcnRfaWQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydDsKKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQ7CisJc3RydWN0IGJmYWRfaXRuaW1fcyAgICppdG5pbSA9IE5VTEw7CisJdTMyICAgICAgICBmY19pZCA9IC0xOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXNob3N0ID0gYmZhZF9vc19zdGFyZ2V0X3RvX3Nob3N0KHN0YXJnZXQpOworCWltX3BvcnQgPSAoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKKwliZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpdG5pbSA9IGJmYWRfb3NfZ2V0X2l0bmltKGltX3BvcnQsIHN0YXJnZXQtPmlkKTsKKwlpZiAoaXRuaW0pCisJCWZjX2lkID0gYmZhX2Zjc19pdG5pbV9nZXRfZmNpZCgmaXRuaW0tPmZjc19pdG5pbSk7CisKKwlmY19zdGFyZ2V0X3BvcnRfaWQoc3RhcmdldCkgPSBmY19pZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBGQyB0cmFuc3BvcnQgdGVtcGxhdGUgZW50cnksIGdldCBTQ1NJIHRhcmdldCBud3duLgorICovCit2b2lkCitiZmFkX2ltX2dldF9zdGFyZ2V0X25vZGVfbmFtZShzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0OworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZDsKKwlzdHJ1Y3QgYmZhZF9pdG5pbV9zICAgKml0bmltID0gTlVMTDsKKwl1NjQgICAgICAgICAgICAgbm9kZV9uYW1lID0gMDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzaG9zdCA9IGJmYWRfb3Nfc3RhcmdldF90b19zaG9zdChzdGFyZ2V0KTsKKwlpbV9wb3J0ID0gKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaXRuaW0gPSBiZmFkX29zX2dldF9pdG5pbShpbV9wb3J0LCBzdGFyZ2V0LT5pZCk7CisJaWYgKGl0bmltKQorCQlub2RlX25hbWUgPSBiZmFfZmNzX2l0bmltX2dldF9ud3duKCZpdG5pbS0+ZmNzX2l0bmltKTsKKworCWZjX3N0YXJnZXRfbm9kZV9uYW1lKHN0YXJnZXQpID0gYmZhX29zX2h0b25sbChub2RlX25hbWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIEZDIHRyYW5zcG9ydCB0ZW1wbGF0ZSBlbnRyeSwgZ2V0IFNDU0kgdGFyZ2V0IHB3d24uCisgKi8KK3ZvaWQKK2JmYWRfaW1fZ2V0X3N0YXJnZXRfcG9ydF9uYW1lKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQ7CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkOworCXN0cnVjdCBiZmFkX2l0bmltX3MgICAqaXRuaW0gPSBOVUxMOworCXU2NCAgICAgICAgICAgICBwb3J0X25hbWUgPSAwOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXNob3N0ID0gYmZhZF9vc19zdGFyZ2V0X3RvX3Nob3N0KHN0YXJnZXQpOworCWltX3BvcnQgPSAoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKKwliZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpdG5pbSA9IGJmYWRfb3NfZ2V0X2l0bmltKGltX3BvcnQsIHN0YXJnZXQtPmlkKTsKKwlpZiAoaXRuaW0pCisJCXBvcnRfbmFtZSA9IGJmYV9mY3NfaXRuaW1fZ2V0X3B3d24oJml0bmltLT5mY3NfaXRuaW0pOworCisJZmNfc3RhcmdldF9wb3J0X25hbWUoc3RhcmdldCkgPSBiZmFfb3NfaHRvbmxsKHBvcnRfbmFtZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCBnZXQgU0NTSSBob3N0IHBvcnQgSUQuCisgKi8KK3ZvaWQKK2JmYWRfaW1fZ2V0X2hvc3RfcG9ydF9pZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcG9ydF9zICAgICpwb3J0ID0gaW1fcG9ydC0+cG9ydDsKKworCWZjX2hvc3RfcG9ydF9pZChzaG9zdCkgPQorCQkJYmZhX29zX2h0b24zYihiZmFfZmNzX3BvcnRfZ2V0X2ZjaWQocG9ydC0+ZmNzX3BvcnQpKTsKK30KKworCisKKworCitzdHJ1Y3QgU2NzaV9Ib3N0ICoKK2JmYWRfb3Nfc3RhcmdldF90b19zaG9zdChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJcmV0dXJuIGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKK30KKworLyoqCisgKiBGQyB0cmFuc3BvcnQgdGVtcGxhdGUgZW50cnksIGdldCBTQ1NJIGhvc3QgcG9ydCB0eXBlLgorICovCitzdGF0aWMgdm9pZAorYmZhZF9pbV9nZXRfaG9zdF9wb3J0X3R5cGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJc3RydWN0IGJmYV9wcG9ydF9hdHRyX3MgYXR0cjsKKworCWJmYV9wcG9ydF9nZXRfYXR0cigmYmZhZC0+YmZhLCAmYXR0cik7CisKKwlzd2l0Y2ggKGF0dHIucG9ydF90eXBlKSB7CisJY2FzZSBCRkFfUFBPUlRfVFlQRV9OUE9SVDoKKwkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfTlBPUlQ7CisJCWJyZWFrOworCWNhc2UgQkZBX1BQT1JUX1RZUEVfTkxQT1JUOgorCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9OTFBPUlQ7CisJCWJyZWFrOworCWNhc2UgQkZBX1BQT1JUX1RZUEVfUDJQOgorCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9QVFA7CisJCWJyZWFrOworCWNhc2UgQkZBX1BQT1JUX1RZUEVfTFBPUlQ6CisJCWZjX2hvc3RfcG9ydF90eXBlKHNob3N0KSA9IEZDX1BPUlRUWVBFX0xQT1JUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9VTktOT1dOOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCBnZXQgU0NTSSBob3N0IHBvcnQgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFkX2ltX2dldF9ob3N0X3BvcnRfc3RhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJc3RydWN0IGJmYV9wcG9ydF9hdHRyX3MgYXR0cjsKKworCWJmYV9wcG9ydF9nZXRfYXR0cigmYmZhZC0+YmZhLCAmYXR0cik7CisKKwlzd2l0Y2ggKGF0dHIucG9ydF9zdGF0ZSkgeworCWNhc2UgQkZBX1BQT1JUX1NUX0xJTktET1dOOgorCQlmY19ob3N0X3BvcnRfc3RhdGUoc2hvc3QpID0gRkNfUE9SVFNUQVRFX0xJTktET1dOOworCQlicmVhazsKKwljYXNlIEJGQV9QUE9SVF9TVF9MSU5LVVA6CisJCWZjX2hvc3RfcG9ydF9zdGF0ZShzaG9zdCkgPSBGQ19QT1JUU1RBVEVfT05MSU5FOworCQlicmVhazsKKwljYXNlIEJGQV9QUE9SVF9TVF9VTklOSVQ6CisJY2FzZSBCRkFfUFBPUlRfU1RfRU5BQkxJTkdfUVdBSVQ6CisJY2FzZSBCRkFfUFBPUlRfU1RfRU5BQkxJTkc6CisJY2FzZSBCRkFfUFBPUlRfU1RfRElTQUJMSU5HX1FXQUlUOgorCWNhc2UgQkZBX1BQT1JUX1NUX0RJU0FCTElORzoKKwljYXNlIEJGQV9QUE9SVF9TVF9ESVNBQkxFRDoKKwljYXNlIEJGQV9QUE9SVF9TVF9TVE9QUEVEOgorCWNhc2UgQkZBX1BQT1JUX1NUX0lPQ0RPV046CisJZGVmYXVsdDoKKwkJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9VTktOT1dOOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCBnZXQgU0NTSSBob3N0IGFjdGl2ZSBmYzRzLgorICovCitzdGF0aWMgdm9pZAorYmZhZF9pbV9nZXRfaG9zdF9hY3RpdmVfZmM0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcG9ydF9zICAgICpwb3J0ID0gaW1fcG9ydC0+cG9ydDsKKworCW1lbXNldChmY19ob3N0X2FjdGl2ZV9mYzRzKHNob3N0KSwgMCwKKwkgICAgICAgc2l6ZW9mKGZjX2hvc3RfYWN0aXZlX2ZjNHMoc2hvc3QpKSk7CisKKwlpZiAocG9ydC0+c3VwcG9ydGVkX2ZjNHMgJgorCQkoQkZBX1BPUlRfUk9MRV9GQ1BfSU0gfCBCRkFfUE9SVF9ST0xFX0ZDUF9UTSkpCisJCWZjX2hvc3RfYWN0aXZlX2ZjNHMoc2hvc3QpWzJdID0gMTsKKworCWlmIChwb3J0LT5zdXBwb3J0ZWRfZmM0cyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lQRkMpCisJCWZjX2hvc3RfYWN0aXZlX2ZjNHMoc2hvc3QpWzNdID0gMHgyMDsKKworCWZjX2hvc3RfYWN0aXZlX2ZjNHMoc2hvc3QpWzddID0gMTsKK30KKworLyoqCisgKiBGQyB0cmFuc3BvcnQgdGVtcGxhdGUgZW50cnksIGdldCBTQ1NJIGhvc3QgbGluayBzcGVlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYWRfaW1fZ2V0X2hvc3Rfc3BlZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJc3RydWN0IGJmYV9wcG9ydF9hdHRyX3MgYXR0cjsKKworCWJmYV9wcG9ydF9nZXRfYXR0cigmYmZhZC0+YmZhLCAmYXR0cik7CisJc3dpdGNoIChhdHRyLnNwZWVkKSB7CisJY2FzZSBCRkFfUFBPUlRfU1BFRURfOEdCUFM6CisJCWZjX2hvc3Rfc3BlZWQoc2hvc3QpID0gRkNfUE9SVFNQRUVEXzhHQklUOworCQlicmVhazsKKwljYXNlIEJGQV9QUE9SVF9TUEVFRF80R0JQUzoKKwkJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBGQ19QT1JUU1BFRURfNEdCSVQ7CisJCWJyZWFrOworCWNhc2UgQkZBX1BQT1JUX1NQRUVEXzJHQlBTOgorCQlmY19ob3N0X3NwZWVkKHNob3N0KSA9IEZDX1BPUlRTUEVFRF8yR0JJVDsKKwkJYnJlYWs7CisJY2FzZSBCRkFfUFBPUlRfU1BFRURfMUdCUFM6CisJCWZjX2hvc3Rfc3BlZWQoc2hvc3QpID0gRkNfUE9SVFNQRUVEXzFHQklUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmY19ob3N0X3NwZWVkKHNob3N0KSA9IEZDX1BPUlRTUEVFRF9VTktOT1dOOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCBnZXQgU0NTSSBob3N0IHBvcnQgdHlwZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYWRfaW1fZ2V0X2hvc3RfZmFicmljX25hbWUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCBiZmFkX3BvcnRfcyAgICAqcG9ydCA9IGltX3BvcnQtPnBvcnQ7CisJd3duX3QgICAgICAgICAgIGZhYnJpY19ud3duID0gMDsKKworCWZhYnJpY19ud3duID0gYmZhX2Zjc19wb3J0X2dldF9mYWJyaWNfbmFtZShwb3J0LT5mY3NfcG9ydCk7CisKKwlmY19ob3N0X2ZhYnJpY19uYW1lKHNob3N0KSA9IGJmYV9vc19odG9ubGwoZmFicmljX253d24pOworCit9CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCBnZXQgQkZBRCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqCitiZmFkX2ltX2dldF9zdGF0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpoc3RhdHM7CisJYmZhX3N0YXR1c190ICAgIHJjOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCWhzdGF0cyA9ICZiZmFkLT5saW5rX3N0YXRzOworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCW1lbXNldChoc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzKSk7CisJcmMgPSBiZmFfcHBvcnRfZ2V0X3N0YXRzKCZiZmFkLT5iZmEsCisJCQkJICAgICAodW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgKikgaHN0YXRzLAorCQkJCSAgICAgYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykKKwkJcmV0dXJuIE5VTEw7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKworCXJldHVybiBoc3RhdHM7Cit9CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCByZXNldCBCRkFEIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFkX2ltX3Jlc2V0X3N0YXRzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9CisJCQkoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQgPSBpbV9wb3J0LT5iZmFkOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwliZmFfc3RhdHVzX3QgICAgcmM7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyYyA9IGJmYV9wcG9ydF9jbGVhcl9zdGF0cygmYmZhZC0+YmZhLCBiZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaWYgKHJjICE9IEJGQV9TVEFUVVNfT0spCisJCXJldHVybjsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCisJcmV0dXJuOworfQorCisvKioKKyAqIEZDIHRyYW5zcG9ydCB0ZW1wbGF0ZSBlbnRyeSwgZ2V0IHJwb3J0IGxvc3MgdGltZW91dC4KKyAqLworc3RhdGljIHZvaWQKK2JmYWRfaW1fZ2V0X3Jwb3J0X2xvc3NfdG1vKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQpCit7CisJc3RydWN0IGJmYWRfaXRuaW1fZGF0YV9zICppdG5pbV9kYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGJmYWRfaXRuaW1fcyAgICppdG5pbSA9IGl0bmltX2RhdGEtPml0bmltOworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGl0bmltLT5pbS0+YmZhZDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJcnBvcnQtPmRldl9sb3NzX3RtbyA9IGJmYV9mY3BpbV9wYXRoX3Rvdl9nZXQoJmJmYWQtPmJmYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCBzZXQgcnBvcnQgbG9zcyB0aW1lb3V0LgorICovCitzdGF0aWMgdm9pZAorYmZhZF9pbV9zZXRfcnBvcnRfbG9zc190bW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgdTMyIHRpbWVvdXQpCit7CisJc3RydWN0IGJmYWRfaXRuaW1fZGF0YV9zICppdG5pbV9kYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGJmYWRfaXRuaW1fcyAgICppdG5pbSA9IGl0bmltX2RhdGEtPml0bmltOworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGl0bmltLT5pbS0+YmZhZDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpZiAodGltZW91dCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQliZmFfZmNwaW1fcGF0aF90b3Zfc2V0KCZiZmFkLT5iZmEsIHRpbWVvdXQpOworCQlycG9ydC0+ZGV2X2xvc3NfdG1vID0gYmZhX2ZjcGltX3BhdGhfdG92X2dldCgmYmZhZC0+YmZhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJfQorCit9CisKK3N0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSBiZmFkX2ltX2ZjX2Z1bmN0aW9uX3RlbXBsYXRlID0geworCisJLyogVGFyZ2V0IGR5bmFtaWMgYXR0cmlidXRlcyAqLworCS5nZXRfc3RhcmdldF9wb3J0X2lkID0gYmZhZF9pbV9nZXRfc3RhcmdldF9wb3J0X2lkLAorCS5zaG93X3N0YXJnZXRfcG9ydF9pZCA9IDEsCisJLmdldF9zdGFyZ2V0X25vZGVfbmFtZSA9IGJmYWRfaW1fZ2V0X3N0YXJnZXRfbm9kZV9uYW1lLAorCS5zaG93X3N0YXJnZXRfbm9kZV9uYW1lID0gMSwKKwkuZ2V0X3N0YXJnZXRfcG9ydF9uYW1lID0gYmZhZF9pbV9nZXRfc3RhcmdldF9wb3J0X25hbWUsCisJLnNob3dfc3RhcmdldF9wb3J0X25hbWUgPSAxLAorCisJLyogSG9zdCBkeW5hbWljIGF0dHJpYnV0ZSAqLworCS5nZXRfaG9zdF9wb3J0X2lkID0gYmZhZF9pbV9nZXRfaG9zdF9wb3J0X2lkLAorCS5zaG93X2hvc3RfcG9ydF9pZCA9IDEsCisKKwkvKiBIb3N0IGZpeGVkIGF0dHJpYnV0ZXMgKi8KKwkuc2hvd19ob3N0X25vZGVfbmFtZSA9IDEsCisJLnNob3dfaG9zdF9wb3J0X25hbWUgPSAxLAorCS5zaG93X2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMgPSAxLAorCS5zaG93X2hvc3Rfc3VwcG9ydGVkX2ZjNHMgPSAxLAorCS5zaG93X2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyA9IDEsCisJLnNob3dfaG9zdF9tYXhmcmFtZV9zaXplID0gMSwKKworCS8qIE1vcmUgaG9zdCBkeW5hbWljIGF0dHJpYnV0ZXMgKi8KKwkuc2hvd19ob3N0X3BvcnRfdHlwZSA9IDEsCisJLmdldF9ob3N0X3BvcnRfdHlwZSA9IGJmYWRfaW1fZ2V0X2hvc3RfcG9ydF90eXBlLAorCS5zaG93X2hvc3RfcG9ydF9zdGF0ZSA9IDEsCisJLmdldF9ob3N0X3BvcnRfc3RhdGUgPSBiZmFkX2ltX2dldF9ob3N0X3BvcnRfc3RhdGUsCisJLnNob3dfaG9zdF9hY3RpdmVfZmM0cyA9IDEsCisJLmdldF9ob3N0X2FjdGl2ZV9mYzRzID0gYmZhZF9pbV9nZXRfaG9zdF9hY3RpdmVfZmM0cywKKwkuc2hvd19ob3N0X3NwZWVkID0gMSwKKwkuZ2V0X2hvc3Rfc3BlZWQgPSBiZmFkX2ltX2dldF9ob3N0X3NwZWVkLAorCS5zaG93X2hvc3RfZmFicmljX25hbWUgPSAxLAorCS5nZXRfaG9zdF9mYWJyaWNfbmFtZSA9IGJmYWRfaW1fZ2V0X2hvc3RfZmFicmljX25hbWUsCisKKwkuc2hvd19ob3N0X3N5bWJvbGljX25hbWUgPSAxLAorCisJLyogU3RhdGlzdGljcyAqLworCS5nZXRfZmNfaG9zdF9zdGF0cyA9IGJmYWRfaW1fZ2V0X3N0YXRzLAorCS5yZXNldF9mY19ob3N0X3N0YXRzID0gYmZhZF9pbV9yZXNldF9zdGF0cywKKworCS8qIEFsbG9jYXRpb24gbGVuZ3RoIGZvciBob3N0IHNwZWNpZmljIGRhdGEgKi8KKwkuZGRfZmNycG9ydF9zaXplID0gc2l6ZW9mKHN0cnVjdCBiZmFkX2l0bmltX2RhdGFfcyAqKSwKKworCS8qIFJlbW90ZSBwb3J0IGZpeGVkIGF0dHJpYnV0ZXMgKi8KKwkuc2hvd19ycG9ydF9tYXhmcmFtZV9zaXplID0gMSwKKwkuc2hvd19ycG9ydF9zdXBwb3J0ZWRfY2xhc3NlcyA9IDEsCisJLnNob3dfcnBvcnRfZGV2X2xvc3NfdG1vID0gMSwKKwkuZ2V0X3Jwb3J0X2Rldl9sb3NzX3RtbyA9IGJmYWRfaW1fZ2V0X3Jwb3J0X2xvc3NfdG1vLAorCS5zZXRfcnBvcnRfZGV2X2xvc3NfdG1vID0gYmZhZF9pbV9zZXRfcnBvcnRfbG9zc190bW8sCit9OworCisvKioKKyAqICBTY3NpX0hvc3RfYXR0cnMgU0NTSSBob3N0IGF0dHJpYnV0ZXMKKyAqLworc3RhdGljIHNzaXplX3QKK2JmYWRfaW1fc2VyaWFsX251bV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2lvY19hdHRyX3MgIGlvY19hdHRyOworCisJbWVtc2V0KCZpb2NfYXR0ciwgMCwgc2l6ZW9mKGlvY19hdHRyKSk7CisJYmZhX2dldF9hdHRyKCZiZmFkLT5iZmEsICZpb2NfYXR0cik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCQlpb2NfYXR0ci5hZGFwdGVyX2F0dHIuc2VyaWFsX251bSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitiZmFkX2ltX21vZGVsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJc3RydWN0IGJmYV9pb2NfYXR0cl9zICBpb2NfYXR0cjsKKworCW1lbXNldCgmaW9jX2F0dHIsIDAsIHNpemVvZihpb2NfYXR0cikpOworCWJmYV9nZXRfYXR0cigmYmZhZC0+YmZhLCAmaW9jX2F0dHIpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBpb2NfYXR0ci5hZGFwdGVyX2F0dHIubW9kZWwpOworfQorCitzdGF0aWMgc3NpemVfdAorYmZhZF9pbV9tb2RlbF9kZXNjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2lvY19hdHRyX3MgIGlvY19hdHRyOworCisJbWVtc2V0KCZpb2NfYXR0ciwgMCwgc2l6ZW9mKGlvY19hdHRyKSk7CisJYmZhX2dldF9hdHRyKCZiZmFkLT5iZmEsICZpb2NfYXR0cik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCQlpb2NfYXR0ci5hZGFwdGVyX2F0dHIubW9kZWxfZGVzY3IpOworfQorCitzdGF0aWMgc3NpemVfdAorYmZhZF9pbV9ub2RlX25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9CisJCQkoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgYmZhZF9wb3J0X3MgICAgKnBvcnQgPSBpbV9wb3J0LT5wb3J0OworCXU2NCAgICAgICAgbnd3bjsKKworCW53d24gPSBiZmFfZmNzX3BvcnRfZ2V0X253d24ocG9ydC0+ZmNzX3BvcnQpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JWxseFxuIiwgYmZhX29zX2h0b25sbChud3duKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitiZmFkX2ltX3N5bWJvbGljX25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9CisJCQkoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQgPSBpbV9wb3J0LT5iZmFkOworCXN0cnVjdCBiZmFfaW9jX2F0dHJfcyAgaW9jX2F0dHI7CisKKwltZW1zZXQoJmlvY19hdHRyLCAwLCBzaXplb2YoaW9jX2F0dHIpKTsKKwliZmFfZ2V0X2F0dHIoJmJmYWQtPmJmYSwgJmlvY19hdHRyKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIkJyb2NhZGUgJXMgRlYlcyBEViVzXG4iLAorCQkJaW9jX2F0dHIuYWRhcHRlcl9hdHRyLm1vZGVsLAorCQkJaW9jX2F0dHIuYWRhcHRlcl9hdHRyLmZ3X3ZlciwgQkZBRF9EUklWRVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitiZmFkX2ltX2h3X3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJc3RydWN0IGJmYV9pb2NfYXR0cl9zICBpb2NfYXR0cjsKKworCW1lbXNldCgmaW9jX2F0dHIsIDAsIHNpemVvZihpb2NfYXR0cikpOworCWJmYV9nZXRfYXR0cigmYmZhZC0+YmZhLCAmaW9jX2F0dHIpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBpb2NfYXR0ci5hZGFwdGVyX2F0dHIuaHdfdmVyKTsKK30KKworc3RhdGljIHNzaXplX3QKK2JmYWRfaW1fZHJ2X3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgQkZBRF9EUklWRVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitiZmFkX2ltX29wdGlvbnJvbV92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9CisJCQkoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQgPSBpbV9wb3J0LT5iZmFkOworCXN0cnVjdCBiZmFfaW9jX2F0dHJfcyAgaW9jX2F0dHI7CisKKwltZW1zZXQoJmlvY19hdHRyLCAwLCBzaXplb2YoaW9jX2F0dHIpKTsKKwliZmFfZ2V0X2F0dHIoJmJmYWQtPmJmYSwgJmlvY19hdHRyKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkJCWlvY19hdHRyLmFkYXB0ZXJfYXR0ci5vcHRyb21fdmVyKTsKK30KKworc3RhdGljIHNzaXplX3QKK2JmYWRfaW1fZndfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJc3RydWN0IGJmYV9pb2NfYXR0cl9zICBpb2NfYXR0cjsKKworCW1lbXNldCgmaW9jX2F0dHIsIDAsIHNpemVvZihpb2NfYXR0cikpOworCWJmYV9nZXRfYXR0cigmYmZhZC0+YmZhLCAmaW9jX2F0dHIpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBpb2NfYXR0ci5hZGFwdGVyX2F0dHIuZndfdmVyKTsKK30KKworc3RhdGljIHNzaXplX3QKK2JmYWRfaW1fbnVtX29mX3BvcnRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9CisJCQkoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQgPSBpbV9wb3J0LT5iZmFkOworCXN0cnVjdCBiZmFfaW9jX2F0dHJfcyAgaW9jX2F0dHI7CisKKwltZW1zZXQoJmlvY19hdHRyLCAwLCBzaXplb2YoaW9jX2F0dHIpKTsKKwliZmFfZ2V0X2F0dHIoJmJmYWQtPmJmYSwgJmlvY19hdHRyKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaW9jX2F0dHIuYWRhcHRlcl9hdHRyLm5wb3J0cyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitiZmFkX2ltX2Rydl9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIEJGQURfRFJJVkVSX05BTUUpOworfQorCitzdGF0aWMgc3NpemVfdAorYmZhZF9pbV9udW1fb2ZfZGlzY292ZXJlZF9wb3J0c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9CisJCQkoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIHNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgYmZhZF9wb3J0X3MgICAgKnBvcnQgPSBpbV9wb3J0LT5wb3J0OworCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJaW50ICAgICAgICBucnBvcnRzID0gMjA0ODsKKwl3d25fdCAgICAgICAgICAqcnBvcnRzID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlycG9ydHMgPSBremFsbG9jKHNpemVvZih3d25fdCkgKiBucnBvcnRzICwgR0ZQX0FUT01JQyk7CisJaWYgKHJwb3J0cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0cyhwb3J0LT5mY3NfcG9ydCwgcnBvcnRzLCAmbnJwb3J0cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJa2ZyZWUocnBvcnRzKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBucnBvcnRzKTsKK30KKworc3RhdGljICAgICAgICAgIERFVklDRV9BVFRSKHNlcmlhbF9udW1iZXIsIFNfSVJVR08sCisJCQkJYmZhZF9pbV9zZXJpYWxfbnVtX3Nob3csIE5VTEwpOworc3RhdGljICAgICAgICAgIERFVklDRV9BVFRSKG1vZGVsLCBTX0lSVUdPLCBiZmFkX2ltX21vZGVsX3Nob3csIE5VTEwpOworc3RhdGljICAgICAgICAgIERFVklDRV9BVFRSKG1vZGVsX2Rlc2NyaXB0aW9uLCBTX0lSVUdPLAorCQkJCWJmYWRfaW1fbW9kZWxfZGVzY19zaG93LCBOVUxMKTsKK3N0YXRpYyAgICAgICAgICBERVZJQ0VfQVRUUihub2RlX25hbWUsIFNfSVJVR08sIGJmYWRfaW1fbm9kZV9uYW1lX3Nob3csIE5VTEwpOworc3RhdGljICAgICAgICAgIERFVklDRV9BVFRSKHN5bWJvbGljX25hbWUsIFNfSVJVR08sCisJCQkJYmZhZF9pbV9zeW1ib2xpY19uYW1lX3Nob3csIE5VTEwpOworc3RhdGljICAgICAgICAgIERFVklDRV9BVFRSKGhhcmR3YXJlX3ZlcnNpb24sIFNfSVJVR08sCisJCQkJYmZhZF9pbV9od192ZXJzaW9uX3Nob3csIE5VTEwpOworc3RhdGljICAgICAgICAgIERFVklDRV9BVFRSKGRyaXZlcl92ZXJzaW9uLCBTX0lSVUdPLAorCQkJCWJmYWRfaW1fZHJ2X3ZlcnNpb25fc2hvdywgTlVMTCk7CitzdGF0aWMgICAgICAgICAgREVWSUNFX0FUVFIob3B0aW9uX3JvbV92ZXJzaW9uLCBTX0lSVUdPLAorCQkJCWJmYWRfaW1fb3B0aW9ucm9tX3ZlcnNpb25fc2hvdywgTlVMTCk7CitzdGF0aWMgICAgICAgICAgREVWSUNFX0FUVFIoZmlybXdhcmVfdmVyc2lvbiwgU19JUlVHTywKKwkJCQliZmFkX2ltX2Z3X3ZlcnNpb25fc2hvdywgTlVMTCk7CitzdGF0aWMgICAgICAgICAgREVWSUNFX0FUVFIobnVtYmVyX29mX3BvcnRzLCBTX0lSVUdPLAorCQkJCWJmYWRfaW1fbnVtX29mX3BvcnRzX3Nob3csIE5VTEwpOworc3RhdGljICAgICAgICAgIERFVklDRV9BVFRSKGRyaXZlcl9uYW1lLCBTX0lSVUdPLCBiZmFkX2ltX2Rydl9uYW1lX3Nob3csIE5VTEwpOworc3RhdGljICAgICAgICAgIERFVklDRV9BVFRSKG51bWJlcl9vZl9kaXNjb3ZlcmVkX3BvcnRzLCBTX0lSVUdPLAorCQkJCWJmYWRfaW1fbnVtX29mX2Rpc2NvdmVyZWRfcG9ydHNfc2hvdywgTlVMTCk7CisKK3N0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpiZmFkX2ltX2hvc3RfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfc2VyaWFsX251bWJlciwKKwkmZGV2X2F0dHJfbW9kZWwsCisJJmRldl9hdHRyX21vZGVsX2Rlc2NyaXB0aW9uLAorCSZkZXZfYXR0cl9ub2RlX25hbWUsCisJJmRldl9hdHRyX3N5bWJvbGljX25hbWUsCisJJmRldl9hdHRyX2hhcmR3YXJlX3ZlcnNpb24sCisJJmRldl9hdHRyX2RyaXZlcl92ZXJzaW9uLAorCSZkZXZfYXR0cl9vcHRpb25fcm9tX3ZlcnNpb24sCisJJmRldl9hdHRyX2Zpcm13YXJlX3ZlcnNpb24sCisJJmRldl9hdHRyX251bWJlcl9vZl9wb3J0cywKKwkmZGV2X2F0dHJfZHJpdmVyX25hbWUsCisJJmRldl9hdHRyX251bWJlcl9vZl9kaXNjb3ZlcmVkX3BvcnRzLAorCU5VTEwsCit9OworCitzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYmZhZF9pbV92cG9ydF9hdHRyc1tdID0geworICAgICZkZXZfYXR0cl9zZXJpYWxfbnVtYmVyLAorICAgICZkZXZfYXR0cl9tb2RlbCwKKyAgICAmZGV2X2F0dHJfbW9kZWxfZGVzY3JpcHRpb24sCisgICAgJmRldl9hdHRyX25vZGVfbmFtZSwKKyAgICAmZGV2X2F0dHJfc3ltYm9saWNfbmFtZSwKKyAgICAmZGV2X2F0dHJfaGFyZHdhcmVfdmVyc2lvbiwKKyAgICAmZGV2X2F0dHJfZHJpdmVyX3ZlcnNpb24sCisgICAgJmRldl9hdHRyX29wdGlvbl9yb21fdmVyc2lvbiwKKyAgICAmZGV2X2F0dHJfZmlybXdhcmVfdmVyc2lvbiwKKyAgICAmZGV2X2F0dHJfbnVtYmVyX29mX3BvcnRzLAorICAgICZkZXZfYXR0cl9kcml2ZXJfbmFtZSwKKyAgICAmZGV2X2F0dHJfbnVtYmVyX29mX2Rpc2NvdmVyZWRfcG9ydHMsCisgICAgTlVMTCwKK307CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2F0dHIuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9hdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMzEyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9hdHRyLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBRF9BVFRSX0hfXworI2RlZmluZSBfX0JGQURfQVRUUl9IX18KKy8qKgorICogIGJmYWRfYXR0ci5oIFZNd2FyZSBkcml2ZXIgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgbW9kdWxlLgorICovCisKKy8qKgorICogIEZDX3RyYW5zcG9ydF90ZW1wbGF0ZSBGQyB0cmFuc3BvcnQgdGVtcGxhdGUKKyAqLworCitzdHJ1Y3QgU2NzaV9Ib3N0KgorYmZhZF9vc19kZXZfdG9fc2hvc3Qoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KTsKKworLyoqCisgKiBGQyB0cmFuc3BvcnQgdGVtcGxhdGUgZW50cnksIGdldCBTQ1NJIHRhcmdldCBwb3J0IElELgorICovCit2b2lkCitiZmFkX2ltX2dldF9zdGFyZ2V0X3BvcnRfaWQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KTsKKworLyoqCisgKiBGQyB0cmFuc3BvcnQgdGVtcGxhdGUgZW50cnksIGdldCBTQ1NJIHRhcmdldCBud3duLgorICovCit2b2lkCitiZmFkX2ltX2dldF9zdGFyZ2V0X25vZGVfbmFtZShzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpOworCisvKioKKyAqIEZDIHRyYW5zcG9ydCB0ZW1wbGF0ZSBlbnRyeSwgZ2V0IFNDU0kgdGFyZ2V0IHB3d24uCisgKi8KK3ZvaWQKK2JmYWRfaW1fZ2V0X3N0YXJnZXRfcG9ydF9uYW1lKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCk7CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCBnZXQgU0NTSSBob3N0IHBvcnQgSUQuCisgKi8KK3ZvaWQKK2JmYWRfaW1fZ2V0X2hvc3RfcG9ydF9pZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CisKKy8qKgorICogRkMgdHJhbnNwb3J0IHRlbXBsYXRlIGVudHJ5LCBpc3N1ZSBhIExJUC4KKyAqLworaW50CitiZmFkX2ltX2lzc3VlX2ZjX2hvc3RfbGlwKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKKworc3RydWN0IFNjc2lfSG9zdCoKK2JmYWRfb3Nfc3RhcmdldF90b19zaG9zdChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpOworCisKKyNlbmRpZiAvKiAgX19CRkFEX0FUVFJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyYzgxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaApAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqIENvbnRhaW5zIGJhc2UgZHJpdmVyIGRlZmluaXRpb25zLgorICovCisKKy8qKgorICogIGJmYV9kcnYuaCBMaW51eCBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmVzLgorICovCisKKyNpZm5kZWYgX19CRkFEX0RSVl9IX18KKyNkZWZpbmUgX19CRkFEX0RSVl9IX18KKworI2luY2x1ZGUgImJmYV9vc19pbmMuaCIKKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjcy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcGNpLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19wb3J0Lmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19ycG9ydC5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX3Jwb3J0Lmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc192cG9ydC5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX3Zwb3J0Lmg+CisKKyNpbmNsdWRlIDxjcy9iZmFfcGxvZy5oPgorI2luY2x1ZGUgImFlbi9iZmFfYWVuLmgiCisjaW5jbHVkZSA8bG9nL2JmYV9sb2dfbGludXguaD4KKworI2RlZmluZSBCRkFEX0RSSVZFUl9OQU1FICAgICAgICAiYmZhIgorI2lmZGVmIEJGQV9EUklWRVJfVkVSU0lPTgorI2RlZmluZSBCRkFEX0RSSVZFUl9WRVJTSU9OICAgIEJGQV9EUklWRVJfVkVSU0lPTgorI2Vsc2UKKyNkZWZpbmUgQkZBRF9EUklWRVJfVkVSU0lPTiAgICAiMi4wLjAuMCIKKyNlbmRpZgorCisKKyNkZWZpbmUgQkZBRF9JUlFfRkxBR1MgSVJRRl9TSEFSRUQKKworLyoKKyAqIEJGQUQgZmxhZ3MKKyAqLworI2RlZmluZSBCRkFEX01TSVhfT04JCQkJMHgwMDAwMDAwMQorI2RlZmluZSBCRkFEX0hBTF9JTklUX0RPTkUJCQkweDAwMDAwMDAyCisjZGVmaW5lIEJGQURfRFJWX0lOSVRfRE9ORQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQkZBRF9DRkdfUFBPUlRfRE9ORQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQkZBRF9IQUxfU1RBUlRfRE9ORQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQkZBRF9QT1JUX09OTElORQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQkZBRF9SUE9SVF9PTkxJTkUJCQkweDAwMDAwMDQwCisKKyNkZWZpbmUgQkZBRF9QT1JUX0RFTEVURQkJCTB4MDAwMDAwMDEKKworLyoKKyAqIEJGQUQgcmVsYXRlZCBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgU0NTSV9TQ0FOX0RFTEFZCQlIWgorI2RlZmluZSBCRkFEX1NUT1BfVElNRU9VVAkzMAorI2RlZmluZSBCRkFEX1NVU1BFTkRfVElNRU9VVAlCRkFEX1NUT1BfVElNRU9VVAorCisvKgorICogQkZBRCBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBkZWZhdWx0IHZhbHVlcworICovCisjZGVmaW5lIEJGQURfTFVOX1FVRVVFX0RFUFRIIAkJMzIKKyNkZWZpbmUgQkZBRF9JT19NQVhfU0dFIAkJU0dfQUxMCisKKyNkZWZpbmUgYmZhZF9pc3JfdCBpcnFfaGFuZGxlcl90CisKKyNkZWZpbmUgTUFYX01TSVhfRU5UUlkgMjIKKworc3RydWN0IGJmYWRfbXNpeF9zIHsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkOworCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXg7Cit9OworCitlbnVtIGJmYWRfcG9ydF9wdmJfdHlwZSB7CisJQkZBRF9QT1JUX1BIWVNfQkFTRSA9IDAsCisJQkZBRF9QT1JUX1BIWVNfVlBPUlQgPSAxLAorCUJGQURfUE9SVF9WRl9CQVNFID0gMiwKKwlCRkFEX1BPUlRfVkZfVlBPUlQgPSAzLAorfTsKKworLyoKKyAqIFBPUlQgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGJmYWRfcG9ydF9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50cnk7CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqZmNzX3BvcnQ7CisJdTMyICAgICAgICByb2xlczsKKwlzMzIgICAgICAgICBmbGFnczsKKwl1MzIgICAgICAgIHN1cHBvcnRlZF9mYzRzOworCXU4CQlpcGZjX2ZsYWdzOworCWVudW0gYmZhZF9wb3J0X3B2Yl90eXBlIHB2Yl90eXBlOworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydDsJLyogSU0gc3BlY2lmaWMgZGF0YSAqLworCXN0cnVjdCBiZmFkX3RtX3BvcnRfcyAqdG1fcG9ydDsJLyogVE0gc3BlY2lmaWMgZGF0YSAqLworCXN0cnVjdCBiZmFkX2lwZmNfcG9ydF9zICppcGZjX3BvcnQ7CS8qIElQRkMgc3BlY2lmaWMgZGF0YSAqLworfTsKKworLyoKKyAqIFZQT1JUIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBiZmFkX3Zwb3J0X3MgeworCXN0cnVjdCBiZmFkX3BvcnRfcyAgICAgZHJ2X3BvcnQ7CisJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyBmY3NfdnBvcnQ7CisJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBfZGVsOworfTsKKworLyoKKyAqIFZGIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBiZmFkX3ZmX3MgeworCWJmYV9mY3NfdmZfdCAgICBmY3NfdmY7CisJc3RydWN0IGJmYWRfcG9ydF9zICAgIGJhc2VfcG9ydDsJLyogYmFzZSBwb3J0IGZvciB2ZiAqLworCXN0cnVjdCBiZmFkX3MgICAqYmZhZDsKK307CisKK3N0cnVjdCBiZmFkX2NmZ19wYXJhbV9zIHsKKwl1MzIgICAgICAgIHJwb3J0X2RlbF90aW1lb3V0OworCXUzMiAgICAgICAgaW9jX3F1ZXVlX2RlcHRoOworCXUzMiAgICAgICAgbHVuX3F1ZXVlX2RlcHRoOworCXUzMiAgICAgICAgaW9fbWF4X3NnZTsKKwl1MzIgICAgICAgIGJpbmRpbmdfbWV0aG9kOworfTsKKworI2RlZmluZSBCRkFEX0FFTl9NQVhfQVBQUyA4CitzdHJ1Y3QgYmZhZF9hZW5fZmlsZV9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICBxZTsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkOworCXMzMiByaTsKKwlzMzIgYXBwX2lkOworfTsKKworLyoKKyAqIEJGQUQgKFBDSSBmdW5jdGlvbikgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGJmYWRfcyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VudHJ5OworCXN0cnVjdCBiZmFfcyAgICAgICBiZmE7CisJc3RydWN0IGJmYV9mY3NfcyAgICAgICBiZmFfZmNzOworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJY29uc3QgY2hhciAqcGNpX25hbWU7CisJc3RydWN0IGJmYV9wY2lkZXZfcyBoYWxfcGNpZGV2OworCXN0cnVjdCBiZmFfaW9jX3BjaV9hdHRyX3MgcGNpX2F0dHI7CisJdW5zaWduZWQgbG9uZyAgIHBjaV9iYXIwX21hcDsKKwl2b2lkIF9faW9tZW0gICAqcGNpX2JhcjBfa3ZhOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisJc3RydWN0IGNvbXBsZXRpb24gc3VzcGVuZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkaXNhYmxlX2NvbXA7CisJYmZhX2Jvb2xlYW5fdCAgIGRpc2FibGVfYWN0aXZlOworCXN0cnVjdCBiZmFkX3BvcnRfcyAgICAgcHBvcnQ7CS8qIHBoeXNpY2FsIHBvcnQgb2YgdGhlIEJGQUQgKi8KKwlzdHJ1Y3QgYmZhX21lbWluZm9fcyBtZW1pbmZvOworCXN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgICBpb2NfY2ZnOworCXUzMiAgICAgICAgaW5zdF9ubzsJLyogQkZBRCBpbnN0YW5jZSBudW1iZXIgKi8KKwl1MzIgICAgICAgIGJmYWRfZmxhZ3M7CisJc3BpbmxvY2tfdCAgICAgIGJmYWRfbG9jazsKKwlzdHJ1Y3QgYmZhZF9jZmdfcGFyYW1fcyBjZmdfZGF0YTsKKwlzdHJ1Y3QgYmZhZF9tc2l4X3MgbXNpeF90YWJbTUFYX01TSVhfRU5UUlldOworCWludCAgICAgICAgICAgICBudmVjOworCWNoYXIgICAgICAgICAgICBhZGFwdGVyX25hbWVbQkZBX0FEQVBURVJfU1lNX05BTUVfTEVOXTsKKwljaGFyICAgICAgICAgICAgcG9ydF9uYW1lW0JGQV9BREFQVEVSX1NZTV9OQU1FX0xFTl07CisJc3RydWN0IHRpbWVyX2xpc3QgaGFsX3RtbzsKKwl1bnNpZ25lZCBsb25nICAgaHNfc3RhcnQ7CisJc3RydWN0IGJmYWRfaW1fcyAqaW07CQkvKiBJTSBzcGVjaWZpYyBkYXRhICovCisJc3RydWN0IGJmYWRfdG1fcyAqdG07CQkvKiBUTSBzcGVjaWZpYyBkYXRhICovCisJc3RydWN0IGJmYWRfaXBmY19zICppcGZjOwkvKiBJUEZDIHNwZWNpZmljIGRhdGEgKi8KKwlzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAgIGxvZ19kYXRhOworCXN0cnVjdCBiZmFfdHJjX21vZF9zICAqdHJjbW9kOworCXN0cnVjdCBiZmFfbG9nX21vZF9zICAqbG9nbW9kOworCXN0cnVjdCBiZmFfYWVuX3MgICAgICAqYWVuOworCXN0cnVjdCBiZmFfYWVuX3MgICAgICAgYWVuX2J1ZjsKKwlzdHJ1Y3QgYmZhZF9hZW5fZmlsZV9zIGZpbGVfYnVmW0JGQURfQUVOX01BWF9BUFBTXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgZmlsZV9xOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICBmaWxlX2ZyZWVfcTsKKwlzdHJ1Y3QgYmZhX3Bsb2dfcyAgICAgIHBsb2dfYnVmOworCWludCAgICAgICAgICAgICByZWZfY291bnQ7CisJYmZhX2Jvb2xlYW5fdAlpcGZjX2VuYWJsZWQ7CisJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyBsaW5rX3N0YXRzOworCisJc3RydWN0IGtvYmplY3QgKmJmYV9rb2JqOworCXN0cnVjdCBrb2JqZWN0ICppb2Nfa29iajsKKwlzdHJ1Y3Qga29iamVjdCAqcHBvcnRfa29iajsKKwlzdHJ1Y3Qga29iamVjdCAqbHBvcnRfa29iajsKK307CisKKy8qCisgKiBSUE9SVCBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgYmZhZF9ycG9ydF9zIHsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zIGZjc19ycG9ydDsKK307CisKK3N0cnVjdCBiZmFkX2J1Zl9pbmZvIHsKKwl2b2lkICAgICAgICAgICAqdmlydDsKKwlkbWFfYWRkcl90ICAgICAgcGh5czsKKwl1MzIgICAgICAgIHNpemU7Cit9OworCitzdHJ1Y3QgYmZhZF9mY3hwIHsKKwlzdHJ1Y3QgYmZhZF9wb3J0X3MgICAgKnBvcnQ7CisJc3RydWN0IGJmYV9ycG9ydF9zICpiZmFfcnBvcnQ7CisJYmZhX3N0YXR1c190ICAgIHJlcV9zdGF0dXM7CisJdTE2ICAgICAgICB0YWc7CisJdTE2ICAgICAgICByc3BfbGVuOworCXUxNiAgICAgICAgcnNwX21heGxlbjsKKwl1OCAgICAgICAgIHVzZV9pcmVxYnVmOworCXU4ICAgICAgICAgdXNlX2lyc3BidWY7CisJdTMyICAgICAgICBudW1fcmVxX3NnbGVzOworCXUzMiAgICAgICAgbnVtX3JzcF9zZ2xlczsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJdm9pZCAgICAgICAgICAgKnJlcWJ1Zl9pbmZvOworCXZvaWQgICAgICAgICAgICpyc3BidWZfaW5mbzsKKwlzdHJ1Y3QgYmZhX3NnZV9zICAqcmVxX3NnZTsKKwlzdHJ1Y3QgYmZhX3NnZV9zICAqcnNwX3NnZTsKKwlmY3hwX3NlbmRfY2JfdCAgc2VuZF9jYmZuOworCXZvaWQgICAgICAgICAgICpzZW5kX2NiYXJnOworCXZvaWQgICAgICAgICAgICpiZmFfZmN4cDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworfTsKKworc3RydWN0IGJmYWRfaGFsX2NvbXAgeworCWJmYV9zdGF0dXNfdCAgICBzdGF0dXM7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKK307CisKKy8qCisgKiBNYWNybyB0byBvYnRhaW4gdGhlIGltbWVkaWF0ZSBsb3dlciBwb3dlcgorICogb2YgdHdvIGZvciB0aGUgaW50ZWdlci4KKyAqLworI2RlZmluZSBuZXh0TG93ZXJJbnQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgCVwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJKCp4KS0tOyAgICAJCSAgICAgICAgICAgICAgICAJXAorCWZvciAoaiA9IDE7IGogPCAoc2l6ZW9mKGludCkgKiA4KTsgaiA8PD0gMSkgICAgIFwKKwkJKCp4KSA9ICgqeCkgfCAoKngpID4+IGo7ICAgICAgICAJXAorCSgqeCkrKzsgICAgICAgICAgICAgICAgICAJICAgICAgICAJXAorCSgqeCkgPSAoKngpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAJXAorfSB3aGlsZSAoMCkKKworCitiZmFfc3RhdHVzX3QgICAgYmZhZF92cG9ydF9jcmVhdGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdTE2IHZmX2lkLAorCQkJCSAgc3RydWN0IGJmYV9wb3J0X2NmZ19zICpwb3J0X2NmZyk7CitiZmFfc3RhdHVzX3QgICAgYmZhZF92Zl9jcmVhdGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdTE2IHZmX2lkLAorCQkJICAgICAgIHN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcG9ydF9jZmcpOworYmZhX3N0YXR1c190ICAgIGJmYWRfY2ZnX3Bwb3J0KHN0cnVjdCBiZmFkX3MgKmJmYWQsIGVudW0gYmZhX3BvcnRfcm9sZSByb2xlKTsKK2JmYV9zdGF0dXNfdCAgICBiZmFkX2Rydl9pbml0KHN0cnVjdCBiZmFkX3MgKmJmYWQpOwordm9pZCAgICAgICAgICAgIGJmYWRfZHJ2X3N0YXJ0KHN0cnVjdCBiZmFkX3MgKmJmYWQpOwordm9pZCAgICAgICAgICAgIGJmYWRfdW5jZmdfcHBvcnQoc3RydWN0IGJmYWRfcyAqYmZhZCk7Cit2b2lkICAgICAgICAgICAgYmZhZF9kcnZfc3RvcChzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKK3ZvaWQgICAgICAgICAgICBiZmFkX3JlbW92ZV9pbnRyKHN0cnVjdCBiZmFkX3MgKmJmYWQpOwordm9pZCAgICAgICAgICAgIGJmYWRfaGFsX21lbV9yZWxlYXNlKHN0cnVjdCBiZmFkX3MgKmJmYWQpOwordm9pZCAgICAgICAgICAgIGJmYWRfaGNiX2NvbXAodm9pZCAqYXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKKworaW50ICAgICAgICAgICAgIGJmYWRfc2V0dXBfaW50cihzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKK3ZvaWQgICAgICAgICAgICBiZmFkX3JlbW92ZV9pbnRyKHN0cnVjdCBiZmFkX3MgKmJmYWQpOworCit2b2lkCQliZmFkX3VwZGF0ZV9oYWxfY2ZnKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmJmYV9jZmcpOworYmZhX3N0YXR1c190CWJmYWRfaGFsX21lbV9hbGxvYyhzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKK3ZvaWQJCWJmYWRfYmZhX3Rtbyh1bnNpZ25lZCBsb25nIGRhdGEpOwordm9pZAkJYmZhZF9pbml0X3RpbWVyKHN0cnVjdCBiZmFkX3MgKmJmYWQpOworaW50CQliZmFkX3BjaV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKK3ZvaWQJCWJmYWRfcGNpX3VuaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGJmYWRfcyAqYmZhZCk7Cit2b2lkCQliZmFkX2Zjc19wb3J0X2NmZyhzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKK3ZvaWQJCWJmYWRfZHJ2X3VuaW5pdChzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKK3ZvaWQJCWJmYWRfZHJ2X2xvZ19sZXZlbF9zZXQoc3RydWN0IGJmYWRfcyAqYmZhZCk7CitiZmFfc3RhdHVzX3QJYmZhZF9mYzRfbW9kdWxlX2luaXQodm9pZCk7Cit2b2lkCQliZmFkX2ZjNF9tb2R1bGVfZXhpdCh2b2lkKTsKKwordm9pZCBiZmFkX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworaW50IGJmYWRfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGlkKTsKK3ZvaWQgYmZhZF9vc19ycG9ydF9vbmxpbmVfd2FpdChzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKK2ludCBiZmFkX29zX2dldF9saW5rdXBfZGVsYXkoc3RydWN0IGJmYWRfcyAqYmZhZCk7CitpbnQgYmZhZF9pbnN0YWxsX21zaXhfaGFuZGxlcihzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKKworZXh0ZXJuIHN0cnVjdCBpZHIgYmZhZF9pbV9wb3J0X2luZGV4OworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYmZhZF9saXN0OworZXh0ZXJuIGludCBiZmFfbHVuX3F1ZXVlX2RlcHRoOworZXh0ZXJuIGludCBiZmFkX3N1cHBvcnRlZF9mYzRzOworZXh0ZXJuIGludCBiZmFfbGlua3VwX2RlbGF5OworCisjZW5kaWYgLyogX19CRkFEX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9md2ltZy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Z3aW1nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmNjk0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9md2ltZy5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhZF9md2ltZy5jIExpbnV4IGRyaXZlciBQQ0kgaW50ZXJmYWNlIG1vZHVsZS4KKyAqLworI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKyNpbmNsdWRlIDxiZmFkX2Rydi5oPgorI2luY2x1ZGUgPGJmYWRfaW1fY29tcGF0Lmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc192ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxiZmFfZndpbWdfcHJpdi5oPgorI2luY2x1ZGUgPGJmYS5oPgorCit1MzIgYmZpX2ltYWdlX2N0X3NpemU7Cit1MzIgYmZpX2ltYWdlX2NiX3NpemU7Cit1MzIgKmJmaV9pbWFnZV9jdDsKK3UzMiAqYmZpX2ltYWdlX2NiOworCisKKyNkZWZpbmUJQkZBRF9GV19GSUxFX0NUCSJjdGZ3LmJpbiIKKyNkZWZpbmUJQkZBRF9GV19GSUxFX0NCCSJjYmZ3LmJpbiIKKwordTMyICoKK2JmYWRfcmVhZF9maXJtd2FyZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyICoqYmZpX2ltYWdlLAorCQkJdTMyICpiZmlfaW1hZ2Vfc2l6ZSwgY2hhciAqZndfbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCAmcGRldi0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiQ2FuJ3QgbG9jYXRlIGZpcm13YXJlICVzXG4iLCBmd19uYW1lKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqYmZpX2ltYWdlID0gdm1hbGxvYyhmdy0+c2l6ZSk7CisJaWYgKE5VTEwgPT0gKmJmaV9pbWFnZSkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiRmFpbCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGZ3IGltYWdlICIKKwkJCSJzaXplPSV4IVxuIiwgKHUzMikgZnctPnNpemUpOworCQlnb3RvIGVycm9yOworCX0KKworCW1lbWNweSgqYmZpX2ltYWdlLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCSpiZmlfaW1hZ2Vfc2l6ZSA9IGZ3LT5zaXplL3NpemVvZih1MzIpOworCisJcmV0dXJuKCpiZmlfaW1hZ2UpOworCitlcnJvcjoKKwlyZXR1cm4oTlVMTCk7Cit9CisKK3UzMiAqCitiZmFkX2dldF9maXJtd2FyZV9idWYoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBkZXYtPmRldmljZSA9PSBCRkFfUENJX0RFVklDRV9JRF9DVCkgeworCQlpZiAoYmZpX2ltYWdlX2N0X3NpemUgPT0gMCkKKwkJCWJmYWRfcmVhZF9maXJtd2FyZShwZGV2LCAmYmZpX2ltYWdlX2N0LAorCQkJCSZiZmlfaW1hZ2VfY3Rfc2l6ZSwgQkZBRF9GV19GSUxFX0NUKTsKKwkJcmV0dXJuKGJmaV9pbWFnZV9jdCk7CisJfSBlbHNlIHsKKwkJaWYgKGJmaV9pbWFnZV9jYl9zaXplID09IDApCisJCQliZmFkX3JlYWRfZmlybXdhcmUocGRldiwgJmJmaV9pbWFnZV9jYiwKKwkJCQkmYmZpX2ltYWdlX2NiX3NpemUsIEJGQURfRldfRklMRV9DQik7CisJCXJldHVybihiZmlfaW1hZ2VfY2IpOworCX0KK30KKwordTMyICoKK2JmaV9pbWFnZV9jdF9nZXRfY2h1bmsodTMyIG9mZikKK3sgcmV0dXJuICh1MzIgKikoYmZpX2ltYWdlX2N0ICsgb2ZmKTsgfQorCit1MzIgKgorYmZpX2ltYWdlX2NiX2dldF9jaHVuayh1MzIgb2ZmKQoreyByZXR1cm4gKHUzMiAqKShiZmlfaW1hZ2VfY2IgKyBvZmYpOyB9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4Yzk5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jCkBAIC0wLDAgKzEsMTIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFkX2ltLmMgTGludXggZHJpdmVyIElNIG1vZHVsZS4KKyAqLworCisjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKyNpbmNsdWRlICJiZmFkX2ltLmgiCisjaW5jbHVkZSAiYmZhZF90cmNtb2QuaCIKKyNpbmNsdWRlICJiZmFfY2JfaW9pbV9tYWNyb3MuaCIKKyNpbmNsdWRlIDxmY2IvYmZhX2ZjYl9mY3BpbS5oPgorCitCRkFfVFJDX0ZJTEUoTERSViwgSU0pOworCitERUZJTkVfSURSKGJmYWRfaW1fcG9ydF9pbmRleCk7CitzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmJmYWRfaW1fc2NzaV90cmFuc3BvcnRfdGVtcGxhdGU7CitzdGF0aWMgdm9pZCBiZmFkX2ltX2l0bmltX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIGludCBiZmFkX2ltX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kLAorCQl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CitzdGF0aWMgaW50IGJmYWRfaW1fc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKKwordm9pZAorYmZhX2NiX2lvaW1fZG9uZSh2b2lkICpkcnYsIHN0cnVjdCBiZmFkX2lvaW1fcyAqZGlvLAorCQkJZW51bSBiZmlfaW9pbV9zdGF0dXMgaW9fc3RhdHVzLCB1OCBzY3NpX3N0YXR1cywKKwkJCWludCBzbnNfbGVuLCB1OCAqc25zX2luZm8sIHMzMiByZXNpZHVlKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWRpbzsKKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQgPSBkcnY7CisJc3RydWN0IGJmYWRfaXRuaW1fZGF0YV9zICppdG5pbV9kYXRhOworCXN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltOworCisJc3dpdGNoIChpb19zdGF0dXMpIHsKKwljYXNlIEJGSV9JT0lNX1NUU19PSzoKKwkJYmZhX3RyYyhiZmFkLCBzY3NpX3N0YXR1cyk7CisJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX09LLCBzY3NpX3N0YXR1cyk7CisJCXNjc2lfc2V0X3Jlc2lkKGNtbmQsIDApOworCisJCWlmIChzbnNfbGVuID4gMCkgeworCQkJYmZhX3RyYyhiZmFkLCBzbnNfbGVuKTsKKwkJCWlmIChzbnNfbGVuID4gU0NTSV9TRU5TRV9CVUZGRVJTSVpFKQorCQkJCXNuc19sZW4gPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJCQltZW1jcHkoY21uZC0+c2Vuc2VfYnVmZmVyLCBzbnNfaW5mbywgc25zX2xlbik7CisJCX0KKwkJaWYgKHJlc2lkdWUgPiAwKQorCQkJc2NzaV9zZXRfcmVzaWQoY21uZCwgcmVzaWR1ZSk7CisJCWJyZWFrOworCisJY2FzZSBCRklfSU9JTV9TVFNfQUJPUlRFRDoKKwljYXNlIEJGSV9JT0lNX1NUU19USU1FRE9VVDoKKwljYXNlIEJGSV9JT0lNX1NUU19QQVRIVE9WOgorCWRlZmF1bHQ6CisJCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX0VSUk9SLCAwKTsKKwl9CisKKwkvKiBVbm1hcCBETUEsIGlmIGhvc3QgaXMgTlVMTCwgaXQgbWVhbnMgYSBzY3NpIHBhc3N0aHJ1IGNtZCAqLworCWlmIChjbW5kLT5kZXZpY2UtPmhvc3QgIT0gTlVMTCkKKwkJc2NzaV9kbWFfdW5tYXAoY21uZCk7CisKKwljbW5kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwliZmFfdHJjKGJmYWQsIGNtbmQtPnJlc3VsdCk7CisKKwlpdG5pbV9kYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlpZiAoaXRuaW1fZGF0YSkgeworCQlpdG5pbSA9IGl0bmltX2RhdGEtPml0bmltOworCQlpZiAoIWNtbmQtPnJlc3VsdCAmJiBpdG5pbSAmJgorCQkJIChiZmFfbHVuX3F1ZXVlX2RlcHRoID4gY21uZC0+ZGV2aWNlLT5xdWV1ZV9kZXB0aCkpIHsKKwkJCS8qIFF1ZXVlIGRlcHRoIGFkanVzdG1lbnQgZm9yIGdvb2Qgc3RhdHVzIGNvbXBsZXRpb24gKi8KKwkJCWJmYWRfb3NfcmFtcF91cF9xZGVwdGgoaXRuaW0sIGNtbmQtPmRldmljZSk7CisJCX0gZWxzZSBpZiAoY21uZC0+cmVzdWx0ID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwgJiYgaXRuaW0pIHsKKwkJCS8qIHFmdWxsIGhhbmRsaW5nICovCisJCQliZmFkX29zX2hhbmRsZV9xZnVsbChpdG5pbSwgY21uZC0+ZGV2aWNlKTsKKwkJfQorCX0KKworCWNtbmQtPnNjc2lfZG9uZShjbW5kKTsKK30KKwordm9pZAorYmZhX2NiX2lvaW1fZ29vZF9jb21wKHZvaWQgKmRydiwgc3RydWN0IGJmYWRfaW9pbV9zICpkaW8pCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopZGlvOworCXN0cnVjdCBiZmFkX2l0bmltX2RhdGFfcyAqaXRuaW1fZGF0YTsKKwlzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbTsKKworCWNtbmQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX09LLCBTQ1NJX1NUQVRVU19HT09EKTsKKworCS8qIFVubWFwIERNQSwgaWYgaG9zdCBpcyBOVUxMLCBpdCBtZWFucyBhIHNjc2kgcGFzc3RocnUgY21kICovCisJaWYgKGNtbmQtPmRldmljZS0+aG9zdCAhPSBOVUxMKQorCQlzY3NpX2RtYV91bm1hcChjbW5kKTsKKworCWNtbmQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisJLyogUXVldWUgZGVwdGggYWRqdXN0bWVudCAqLworCWlmIChiZmFfbHVuX3F1ZXVlX2RlcHRoID4gY21uZC0+ZGV2aWNlLT5xdWV1ZV9kZXB0aCkgeworCQlpdG5pbV9kYXRhID0gY21uZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwkJaWYgKGl0bmltX2RhdGEpIHsKKwkJCWl0bmltID0gaXRuaW1fZGF0YS0+aXRuaW07CisJCQlpZiAoaXRuaW0pCisJCQkJYmZhZF9vc19yYW1wX3VwX3FkZXB0aChpdG5pbSwgY21uZC0+ZGV2aWNlKTsKKwkJfQorCX0KKworCWNtbmQtPnNjc2lfZG9uZShjbW5kKTsKK30KKwordm9pZAorYmZhX2NiX2lvaW1fYWJvcnQodm9pZCAqZHJ2LCBzdHJ1Y3QgYmZhZF9pb2ltX3MgKmRpbykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gKHN0cnVjdCBzY3NpX2NtbmQgKilkaW87CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gZHJ2OworCisJY21uZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChESURfRVJST1IsIDApOworCisJLyogVW5tYXAgRE1BLCBpZiBob3N0IGlzIE5VTEwsIGl0IG1lYW5zIGEgc2NzaSBwYXNzdGhydSBjbWQgKi8KKwlpZiAoY21uZC0+ZGV2aWNlLT5ob3N0ICE9IE5VTEwpCisJCXNjc2lfZG1hX3VubWFwKGNtbmQpOworCisJYmZhX3RyYyhiZmFkLCBjbW5kLT5yZXN1bHQpOworCWNtbmQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworfQorCit2b2lkCitiZmFfY2JfdHNraW1fZG9uZSh2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhZF90c2tpbV9zICpkdHNrLAorCQkgICBlbnVtIGJmaV90c2tpbV9zdGF0dXMgdHNrX3N0YXR1cykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gKHN0cnVjdCBzY3NpX2NtbmQgKilkdHNrOworCXdhaXRfcXVldWVfaGVhZF90ICp3cTsKKworCWNtbmQtPlNDcC5TdGF0dXMgfD0gdHNrX3N0YXR1cyA8PCAxOworCXNldF9iaXQoSU9fRE9ORV9CSVQsICh1bnNpZ25lZCBsb25nICopJmNtbmQtPlNDcC5TdGF0dXMpOworCXdxID0gKHdhaXRfcXVldWVfaGVhZF90ICopIGNtbmQtPlNDcC5wdHI7CisJY21uZC0+U0NwLnB0ciA9IE5VTEw7CisKKwlpZiAod3EpCisJCXdha2VfdXAod3EpOworfQorCit2b2lkCitiZmFfY2JfaW9pbV9yZXNmcmVlKHZvaWQgKmRydikKK3sKK30KKworLyoqCisgKiAgU2NzaV9Ib3N0X3RlbXBsYXRlIFNDU0kgaG9zdCB0ZW1wbGF0ZQorICovCisvKioKKyAqIFNjc2lfSG9zdCB0ZW1wbGF0ZSBlbnRyeSwgcmV0dXJucyBCRkFEIFBDSSBpbmZvLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitiZmFkX2ltX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RhdGljIGNoYXIgICAgIGJmYV9idWZbMjU2XTsKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYV9pb2NfYXR0cl9zICBpb2NfYXR0cjsKKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQgPSBpbV9wb3J0LT5iZmFkOworCisJbWVtc2V0KCZpb2NfYXR0ciwgMCwgc2l6ZW9mKGlvY19hdHRyKSk7CisJYmZhX2dldF9hdHRyKCZiZmFkLT5iZmEsICZpb2NfYXR0cik7CisKKwltZW1zZXQoYmZhX2J1ZiwgMCwgc2l6ZW9mKGJmYV9idWYpKTsKKwlzbnByaW50ZihiZmFfYnVmLCBzaXplb2YoYmZhX2J1ZiksCisJCSAiQnJvY2FkZSBGQy9GQ09FIEFkYXB0ZXIsICIgIm1vZGVsOiAlcyBod3BhdGg6ICVzIGRyaXZlcjogJXMiLAorCQkgaW9jX2F0dHIuYWRhcHRlcl9hdHRyLm1vZGVsLCBiZmFkLT5wY2lfbmFtZSwKKwkJIEJGQURfRFJJVkVSX1ZFUlNJT04pOworCXJldHVybiBiZmFfYnVmOworfQorCisvKioKKyAqIFNjc2lfSG9zdCB0ZW1wbGF0ZSBlbnRyeSwgYWJvcnRzIHRoZSBzcGVjaWZpZWQgU0NTSSBjb21tYW5kLgorICoKKyAqIFJldHVybnM6IFNVQ0NFU1Mgb3IgRkFJTEVELgorICovCitzdGF0aWMgaW50CitiZmFkX2ltX2Fib3J0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21uZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNtbmQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAqaGFsX2lvOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1MzIgICAgICAgIHRpbWVvdXQ7CisJaW50ICAgICAgICAgICAgIHJjID0gRkFJTEVEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWhhbF9pbyA9IChzdHJ1Y3QgYmZhX2lvaW1fcyAqKSBjbW5kLT5ob3N0X3NjcmliYmxlOworCWlmICghaGFsX2lvKSB7CisJCS8qIElPIGhhcyBiZWVuIGNvbXBsZXRlZCwgcmV0cnVuIHN1Y2Nlc3MgKi8KKwkJcmMgPSBTVUNDRVNTOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGhhbF9pby0+ZGlvICE9IChzdHJ1Y3QgYmZhZF9pb2ltX3MgKikgY21uZCkgeworCQlyYyA9IEZBSUxFRDsKKwkJZ290byBvdXQ7CisJfQorCisJYmZhX3RyYyhiZmFkLCBoYWxfaW8tPmlvdGFnKTsKKwliZmFfbG9nKGJmYWQtPmxvZ21vZCwgQkZBX0xPR19MSU5VWF9TQ1NJX0FCT1JULAorCQlpbV9wb3J0LT5zaG9zdC0+aG9zdF9ubywgY21uZCwgaGFsX2lvLT5pb3RhZyk7CisJYmZhX2lvaW1fYWJvcnQoaGFsX2lvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCS8qIE5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgY29tbWFuZCBnZXQgYWJvcnRlZCAqLworCXRpbWVvdXQgPSAxMDsKKwl3aGlsZSAoKHN0cnVjdCBiZmFfaW9pbV9zICopIGNtbmQtPmhvc3Rfc2NyaWJibGUgPT0gaGFsX2lvKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJaWYgKHRpbWVvdXQgPCA0ICogSFopCisJCQl0aW1lb3V0ICo9IDI7CisJfQorCisJY21uZC0+c2NzaV9kb25lKGNtbmQpOworCWJmYV90cmMoYmZhZCwgaGFsX2lvLT5pb3RhZyk7CisJYmZhX2xvZyhiZmFkLT5sb2dtb2QsIEJGQV9MT0dfTElOVVhfU0NTSV9BQk9SVF9DT01QLAorCQlpbV9wb3J0LT5zaG9zdC0+aG9zdF9ubywgY21uZCwgaGFsX2lvLT5pb3RhZyk7CisJcmV0dXJuIFNVQ0NFU1M7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmZhX3N0YXR1c190CitiZmFkX2ltX3RhcmdldF9yZXNldF9zZW5kKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsCisJCSAgICAgc3RydWN0IGJmYWRfaXRuaW1fcyAqaXRuaW0pCit7CisJc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbTsKKwlzdHJ1Y3QgYmZhX2l0bmltX3MgKmJmYV9pdG5pbTsKKwliZmFfc3RhdHVzX3QgICAgcmMgPSBCRkFfU1RBVFVTX09LOworCisJYmZhX2l0bmltID0gYmZhX2Zjc19pdG5pbV9nZXRfaGFsaXRuKCZpdG5pbS0+ZmNzX2l0bmltKTsKKwl0c2tpbSA9IGJmYV90c2tpbV9hbGxvYygmYmZhZC0+YmZhLCAoc3RydWN0IGJmYWRfdHNraW1fcyAqKSBjbW5kKTsKKwlpZiAoIXRza2ltKSB7CisJCUJGQV9ERVZfUFJJTlRGKGJmYWQsIEJGQV9FUlIsCisJCQkgICAgICAgInRhcmdldCByZXNldCwgZmFpbCB0byBhbGxvY2F0ZSB0c2tpbVxuIik7CisJCXJjID0gQkZBX1NUQVRVU19GQUlMRUQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogU2V0IGhvc3Rfc2NyaWJibGUgdG8gTlVMTCB0byBhdm9pZCBhYm9ydGluZyBhIHRhc2sgY29tbWFuZCBpZgorCSAqIGhhcHBlbnMuCisJICovCisJY21uZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJY21uZC0+U0NwLlN0YXR1cyA9IDA7CisJYmZhX2l0bmltID0gYmZhX2Zjc19pdG5pbV9nZXRfaGFsaXRuKCZpdG5pbS0+ZmNzX2l0bmltKTsKKwliZmFfdHNraW1fc3RhcnQodHNraW0sIGJmYV9pdG5pbSwgKGx1bl90KTAsCisJCQkgICAgRkNQX1RNX1RBUkdFVF9SRVNFVCwgQkZBRF9UQVJHRVRfUkVTRVRfVE1PKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogU2NzaV9Ib3N0IHRlbXBsYXRlIGVudHJ5LCByZXNldHMgYSBMVU4gYW5kIGFib3J0IGl0cyBhbGwgY29tbWFuZHMuCisgKgorICogUmV0dXJuczogU1VDQ0VTUyBvciBGQUlMRUQuCisgKgorICovCitzdGF0aWMgaW50CitiZmFkX2ltX3Jlc2V0X2x1bl9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbW5kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOworCXN0cnVjdCBiZmFkX2l0bmltX2RhdGFfcyAqaXRuaW1fZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltOworCXN0cnVjdCBiZmFkX2l0bmltX3MgICAqaXRuaW07CisJc3RydWN0IGJmYV9pdG5pbV9zICpiZmFfaXRuaW07CisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod3EpOworCWludCAgICAgICAgICAgICByYyA9IFNVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWVudW0gYmZpX3Rza2ltX3N0YXR1cyB0YXNrX3N0YXR1czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpdG5pbSA9IGl0bmltX2RhdGEtPml0bmltOworCWlmICghaXRuaW0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCXJjID0gRkFJTEVEOworCQlnb3RvIG91dDsKKwl9CisKKwl0c2tpbSA9IGJmYV90c2tpbV9hbGxvYygmYmZhZC0+YmZhLCAoc3RydWN0IGJmYWRfdHNraW1fcyAqKSBjbW5kKTsKKwlpZiAoIXRza2ltKSB7CisJCUJGQV9ERVZfUFJJTlRGKGJmYWQsIEJGQV9FUlIsCisJCQkJIkxVTiByZXNldCwgZmFpbCB0byBhbGxvY2F0ZSB0c2tpbSIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJcmMgPSBGQUlMRUQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qKgorCSAqIFNldCBob3N0X3NjcmliYmxlIHRvIE5VTEwgdG8gYXZvaWQgYWJvcnRpbmcgYSB0YXNrIGNvbW1hbmQKKwkgKiBpZiBoYXBwZW5zLgorCSAqLworCWNtbmQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCWNtbmQtPlNDcC5wdHIgPSAoY2hhciAqKSZ3cTsKKwljbW5kLT5TQ3AuU3RhdHVzID0gMDsKKwliZmFfaXRuaW0gPSBiZmFfZmNzX2l0bmltX2dldF9oYWxpdG4oJml0bmltLT5mY3NfaXRuaW0pOworCWJmYV90c2tpbV9zdGFydCh0c2tpbSwgYmZhX2l0bmltLAorCQkJICAgIGJmYWRfaW50X3RvX2x1bihjbW5kLT5kZXZpY2UtPmx1biksCisJCQkgICAgRkNQX1RNX0xVTl9SRVNFVCwgQkZBRF9MVU5fUkVTRVRfVE1PKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXdhaXRfZXZlbnQod3EsIHRlc3RfYml0KElPX0RPTkVfQklULAorCQkJKHVuc2lnbmVkIGxvbmcgKikmY21uZC0+U0NwLlN0YXR1cykpOworCisJdGFza19zdGF0dXMgPSBjbW5kLT5TQ3AuU3RhdHVzID4+IDE7CisJaWYgKHRhc2tfc3RhdHVzICE9IEJGSV9UU0tJTV9TVFNfT0spIHsKKwkJQkZBX0RFVl9QUklOVEYoYmZhZCwgQkZBX0VSUiwgIkxVTiByZXNldCBmYWlsdXJlLCBzdGF0dXM6ICVkXG4iLAorCQkJICAgICAgIHRhc2tfc3RhdHVzKTsKKwkJcmMgPSBGQUlMRUQ7CisJfQorCitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIFNjc2lfSG9zdCB0ZW1wbGF0ZSBlbnRyeSwgcmVzZXRzIHRoZSBidXMgYW5kIGFib3J0IGFsbCBjb21tYW5kcy4KKyAqLworc3RhdGljIGludAorYmZhZF9pbV9yZXNldF9idXNfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY21uZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCA9CisJCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBzaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhZF9pdG5pbV9zICAgKml0bmltOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1MzIgICAgICAgIGksIHJjLCBlcnJfY250ID0gMDsKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3cSk7CisJZW51bSBiZmlfdHNraW1fc3RhdHVzIHRhc2tfc3RhdHVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRkNQX1RBUkdFVDsgaSsrKSB7CisJCWl0bmltID0gYmZhZF9vc19nZXRfaXRuaW0oaW1fcG9ydCwgaSk7CisJCWlmIChpdG5pbSkgeworCQkJY21uZC0+U0NwLnB0ciA9IChjaGFyICopJndxOworCQkJcmMgPSBiZmFkX2ltX3RhcmdldF9yZXNldF9zZW5kKGJmYWQsIGNtbmQsIGl0bmltKTsKKwkJCWlmIChyYyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCQkJZXJyX2NudCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiB3YWl0IHRhcmdldCByZXNldCB0byBjb21wbGV0ZSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCQl3YWl0X2V2ZW50KHdxLCB0ZXN0X2JpdChJT19ET05FX0JJVCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgKikmY21uZC0+U0NwLlN0YXR1cykpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJCQl0YXNrX3N0YXR1cyA9IGNtbmQtPlNDcC5TdGF0dXMgPj4gMTsKKwkJCWlmICh0YXNrX3N0YXR1cyAhPSBCRklfVFNLSU1fU1RTX09LKSB7CisJCQkJQkZBX0RFVl9QUklOVEYoYmZhZCwgQkZBX0VSUiwKKwkJCQkJInRhcmdldCByZXNldCBmYWlsdXJlLCIKKwkJCQkJIiBzdGF0dXM6ICVkXG4iLCB0YXNrX3N0YXR1cyk7CisJCQkJZXJyX2NudCsrOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaWYgKGVycl9jbnQpCisJCXJldHVybiBGQUlMRUQ7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgKiBTY3NpX0hvc3QgdGVtcGxhdGUgZW50cnkgc2xhdmVfZGVzdHJveS4KKyAqLworc3RhdGljIHZvaWQKK2JmYWRfaW1fc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc2Rldi0+aG9zdGRhdGEgPSBOVUxMOworCXJldHVybjsKK30KKworLyoqCisgKiAgQkZBIEZDUyBpdG5pbSBjYWxsYmFja3MKKyAqLworCisvKioKKyAqIEJGQSBGQ1MgaXRuaW0gYWxsb2MgY2FsbGJhY2ssIGFmdGVyIHN1Y2Nlc3NmdWwgUFJMSQorICogQ29udGV4dDogSW50ZXJydXB0CisgKi8KK3ZvaWQKK2JmYV9mY2JfaXRuaW1fYWxsb2Moc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqKml0bmltLAorCQkgICAgc3RydWN0IGJmYWRfaXRuaW1fcyAqKml0bmltX2RydikKK3sKKwkqaXRuaW1fZHJ2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJmYWRfaXRuaW1fcyksIEdGUF9BVE9NSUMpOworCWlmICgqaXRuaW1fZHJ2ID09IE5VTEwpCisJCXJldHVybjsKKworCSgqaXRuaW1fZHJ2KS0+aW0gPSBiZmFkLT5pbTsKKwkqaXRuaW0gPSAmKCppdG5pbV9kcnYpLT5mY3NfaXRuaW07CisJKCppdG5pbV9kcnYpLT5zdGF0ZSA9IElUTklNX1NUQVRFX05PTkU7CisKKwkvKgorCSAqIEluaXRpYXplIHRoZSBpdG5pbV93b3JrCisJICovCisJSU5JVF9XT1JLKCYoKml0bmltX2RydiktPml0bmltX3dvcmssIGJmYWRfaW1faXRuaW1fd29ya19oYW5kbGVyKTsKKwliZmFkLT5iZmFkX2ZsYWdzIHw9IEJGQURfUlBPUlRfT05MSU5FOworfQorCisvKioKKyAqIEJGQSBGQ1MgaXRuaW0gZnJlZSBjYWxsYmFjay4KKyAqIENvbnRleHQ6IEludGVycnVwdC4gYmZhZF9sb2NrIGlzIGhlbGQKKyAqLwordm9pZAorYmZhX2ZjYl9pdG5pbV9mcmVlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltX2RydikKK3sKKwlzdHJ1Y3QgYmZhZF9wb3J0X3MgICAgKnBvcnQ7CisJd3duX3Qgd3dwbjsKKwl1MzIgZmNpZDsKKwljaGFyIHd3cG5fc3RyWzMyXSwgZmNpZF9zdHJbMTZdOworCisJLyogb25saW5lIHRvIGZyZWUgc3RhdGUgdHJhbnN0aW9uIHNob3VsZCBub3QgaGFwcGVuICovCisJYmZhX2Fzc2VydChpdG5pbV9kcnYtPnN0YXRlICE9IElUTklNX1NUQVRFX09OTElORSk7CisKKwlpdG5pbV9kcnYtPnF1ZXVlX3dvcmsgPSAxOworCS8qIG9mZmxpbmUgcmVxdWVzdCBpcyBub3QgeWV0IGRvbmUsIHVzZSB0aGUgc2FtZSByZXF1ZXN0IHRvIGZyZWUgKi8KKwlpZiAoaXRuaW1fZHJ2LT5zdGF0ZSA9PSBJVE5JTV9TVEFURV9PRkZMSU5FX1BFTkRJTkcpCisJCWl0bmltX2Rydi0+cXVldWVfd29yayA9IDA7CisKKwlpdG5pbV9kcnYtPnN0YXRlID0gSVROSU1fU1RBVEVfRlJFRTsKKwlwb3J0ID0gYmZhX2Zjc19pdG5pbV9nZXRfZHJ2cG9ydCgmaXRuaW1fZHJ2LT5mY3NfaXRuaW0pOworCWl0bmltX2Rydi0+aW1fcG9ydCA9IHBvcnQtPmltX3BvcnQ7CisJd3dwbiA9IGJmYV9mY3NfaXRuaW1fZ2V0X3B3d24oJml0bmltX2Rydi0+ZmNzX2l0bmltKTsKKwlmY2lkID0gYmZhX2Zjc19pdG5pbV9nZXRfZmNpZCgmaXRuaW1fZHJ2LT5mY3NfaXRuaW0pOworCXd3bjJzdHIod3dwbl9zdHIsIHd3cG4pOworCWZjaWQyc3RyKGZjaWRfc3RyLCBmY2lkKTsKKwliZmFfbG9nKGJmYWQtPmxvZ21vZCwgQkZBX0xPR19MSU5VWF9JVE5JTV9GUkVFLAorCQlwb3J0LT5pbV9wb3J0LT5zaG9zdC0+aG9zdF9ubywKKwkJZmNpZF9zdHIsIHd3cG5fc3RyKTsKKwliZmFkX29zX2l0bmltX3Byb2Nlc3MoaXRuaW1fZHJ2KTsKK30KKworLyoqCisgKiBCRkEgRkNTIGl0bmltIG9ubGluZSBjYWxsYmFjay4KKyAqIENvbnRleHQ6IEludGVycnVwdC4gYmZhZF9sb2NrIGlzIGhlbGQKKyAqLwordm9pZAorYmZhX2ZjYl9pdG5pbV9vbmxpbmUoc3RydWN0IGJmYWRfaXRuaW1fcyAqaXRuaW1fZHJ2KQoreworCXN0cnVjdCBiZmFkX3BvcnRfcyAgICAqcG9ydDsKKworCWl0bmltX2Rydi0+YmZhX2l0bmltID0gYmZhX2Zjc19pdG5pbV9nZXRfaGFsaXRuKCZpdG5pbV9kcnYtPmZjc19pdG5pbSk7CisJcG9ydCA9IGJmYV9mY3NfaXRuaW1fZ2V0X2RydnBvcnQoJml0bmltX2Rydi0+ZmNzX2l0bmltKTsKKwlpdG5pbV9kcnYtPnN0YXRlID0gSVROSU1fU1RBVEVfT05MSU5FOworCWl0bmltX2Rydi0+cXVldWVfd29yayA9IDE7CisJaXRuaW1fZHJ2LT5pbV9wb3J0ID0gcG9ydC0+aW1fcG9ydDsKKwliZmFkX29zX2l0bmltX3Byb2Nlc3MoaXRuaW1fZHJ2KTsKK30KKworLyoqCisgKiBCRkEgRkNTIGl0bmltIG9mZmxpbmUgY2FsbGJhY2suCisgKiBDb250ZXh0OiBJbnRlcnJ1cHQuIGJmYWRfbG9jayBpcyBoZWxkCisgKi8KK3ZvaWQKK2JmYV9mY2JfaXRuaW1fb2ZmbGluZShzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbV9kcnYpCit7CisJc3RydWN0IGJmYWRfcG9ydF9zICAgICpwb3J0OworCXN0cnVjdCBiZmFkX3MgKmJmYWQ7CisKKwlwb3J0ID0gYmZhX2Zjc19pdG5pbV9nZXRfZHJ2cG9ydCgmaXRuaW1fZHJ2LT5mY3NfaXRuaW0pOworCWJmYWQgPSBwb3J0LT5iZmFkOworCWlmICgoYmZhZC0+cHBvcnQuZmxhZ3MgJiBCRkFEX1BPUlRfREVMRVRFKSB8fAorCQkgKHBvcnQtPmZsYWdzICYgQkZBRF9QT1JUX0RFTEVURSkpIHsKKwkJaXRuaW1fZHJ2LT5zdGF0ZSA9IElUTklNX1NUQVRFX09GRkxJTkU7CisJCXJldHVybjsKKwl9CisJaXRuaW1fZHJ2LT5pbV9wb3J0ID0gcG9ydC0+aW1fcG9ydDsKKwlpdG5pbV9kcnYtPnN0YXRlID0gSVROSU1fU1RBVEVfT0ZGTElORV9QRU5ESU5HOworCWl0bmltX2Rydi0+cXVldWVfd29yayA9IDE7CisJYmZhZF9vc19pdG5pbV9wcm9jZXNzKGl0bmltX2Rydik7Cit9CisKKy8qKgorICogQkZBIEZDUyBpdG5pbSB0aW1lb3V0IGNhbGxiYWNrLgorICogQ29udGV4dDogSW50ZXJydXB0LiBiZmFkX2xvY2sgaXMgaGVsZAorICovCit2b2lkIGJmYV9mY2JfaXRuaW1fdG92KHN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltKQoreworCWl0bmltLT5zdGF0ZSA9IElUTklNX1NUQVRFX1RJTUVPVVQ7Cit9CisKKy8qKgorICogUGF0aCBUT1YgcHJvY2Vzc2luZyBiZWdpbiBub3RpZmljYXRpb24gLS0gZHVtbXkgZm9yIGxpbnV4CisgKi8KK3ZvaWQKK2JmYV9mY2JfaXRuaW1fdG92X2JlZ2luKHN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltKQoreworfQorCisKKworLyoqCisgKiBBbGxvY2F0ZSBhIFNjc2lfSG9zdCBmb3IgYSBwb3J0LgorICovCitpbnQKK2JmYWRfaW1fc2NzaV9ob3N0X2FsbG9jKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCkKK3sKKwlpbnQgZXJyb3IgPSAxOworCisJaWYgKCFpZHJfcHJlX2dldCgmYmZhZF9pbV9wb3J0X2luZGV4LCBHRlBfS0VSTkVMKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZHJfcHJlX2dldCBmYWlsdXJlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSBpZHJfZ2V0X25ldygmYmZhZF9pbV9wb3J0X2luZGV4LCBpbV9wb3J0LAorCQkJCQkgJmltX3BvcnQtPmlkcl9pZCk7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlkcl9nZXRfbmV3IGZhaWx1cmVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpbV9wb3J0LT5zaG9zdCA9IGJmYWRfb3Nfc2NzaV9ob3N0X2FsbG9jKGltX3BvcnQsIGJmYWQpOworCWlmICghaW1fcG9ydC0+c2hvc3QpIHsKKwkJZXJyb3IgPSAxOworCQlnb3RvIG91dF9mcmVlX2lkcjsKKwl9CisKKwlpbV9wb3J0LT5zaG9zdC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZylpbV9wb3J0OworCWltX3BvcnQtPnNob3N0LT51bmlxdWVfaWQgPSBpbV9wb3J0LT5pZHJfaWQ7CisJaW1fcG9ydC0+c2hvc3QtPnRoaXNfaWQgPSAtMTsKKwlpbV9wb3J0LT5zaG9zdC0+bWF4X2lkID0gTUFYX0ZDUF9UQVJHRVQ7CisJaW1fcG9ydC0+c2hvc3QtPm1heF9sdW4gPSBNQVhfRkNQX0xVTjsKKwlpbV9wb3J0LT5zaG9zdC0+bWF4X2NtZF9sZW4gPSAxNjsKKwlpbV9wb3J0LT5zaG9zdC0+Y2FuX3F1ZXVlID0gYmZhZC0+Y2ZnX2RhdGEuaW9jX3F1ZXVlX2RlcHRoOworCWltX3BvcnQtPnNob3N0LT50cmFuc3BvcnR0ID0gYmZhZF9pbV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKKworCWVycm9yID0gYmZhZF9vc19zY3NpX2FkZF9ob3N0KGltX3BvcnQtPnNob3N0LCBpbV9wb3J0LCBiZmFkKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmZhZF9vc19zY3NpX2FkZF9ob3N0IGZhaWx1cmUgJWRcbiIsCisJCQkJCQkJZXJyb3IpOworCQlnb3RvIG91dF9mY19yZWw7CisJfQorCisJLyogc2V0dXAgaG9zdCBmaXhlZCBhdHRyaWJ1dGUgaWYgdGhlIGxrIHN1cHBvcnRzICovCisJYmZhZF9vc19mY19ob3N0X2luaXQoaW1fcG9ydCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZjX3JlbDoKKwlzY3NpX2hvc3RfcHV0KGltX3BvcnQtPnNob3N0KTsKK291dF9mcmVlX2lkcjoKKwlpZHJfcmVtb3ZlKCZiZmFkX2ltX3BvcnRfaW5kZXgsIGltX3BvcnQtPmlkcl9pZCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkCitiZmFkX2ltX3Njc2lfaG9zdF9mcmVlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYmZhX3RyYyhiZmFkLCBiZmFkLT5pbnN0X25vKTsKKwliZmFfbG9nKGJmYWQtPmxvZ21vZCwgQkZBX0xPR19MSU5VWF9TQ1NJX0hPU1RfRlJFRSwKKwkJCWltX3BvcnQtPnNob3N0LT5ob3N0X25vKTsKKworCWZjX3JlbW92ZV9ob3N0KGltX3BvcnQtPnNob3N0KTsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaW1fcG9ydC0+c2hvc3QpOworCXNjc2lfaG9zdF9wdXQoaW1fcG9ydC0+c2hvc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlkcl9yZW1vdmUoJmJmYWRfaW1fcG9ydF9pbmRleCwgaW1fcG9ydC0+aWRyX2lkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2JmYWRfaW1fcG9ydF9kZWxldGVfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZmFkX2ltX3BvcnRfcywgcG9ydF9kZWxldGVfd29yayk7CisKKwliZmFkX2ltX3Njc2lfaG9zdF9mcmVlKGltX3BvcnQtPmJmYWQsIGltX3BvcnQpOworCWJmYWRfaW1fcG9ydF9jbGVhbihpbV9wb3J0KTsKKwlrZnJlZShpbV9wb3J0KTsKK30KKworYmZhX3N0YXR1c190CitiZmFkX2ltX3BvcnRfbmV3KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX3BvcnRfcyAqcG9ydCkKK3sKKwlpbnQgICAgICAgICAgICAgcmMgPSBCRkFfU1RBVFVTX09LOworCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydDsKKworCWltX3BvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MpLCBHRlBfQVRPTUlDKTsKKwlpZiAoaW1fcG9ydCA9PSBOVUxMKSB7CisJCXJjID0gQkZBX1NUQVRVU19FTk9NRU07CisJCWdvdG8gZXh0OworCX0KKwlwb3J0LT5pbV9wb3J0ID0gaW1fcG9ydDsKKwlpbV9wb3J0LT5wb3J0ID0gcG9ydDsKKwlpbV9wb3J0LT5iZmFkID0gYmZhZDsKKworCUlOSVRfV09SSygmaW1fcG9ydC0+cG9ydF9kZWxldGVfd29yaywgYmZhZF9pbV9wb3J0X2RlbGV0ZV9oYW5kbGVyKTsKKwlJTklUX0xJU1RfSEVBRCgmaW1fcG9ydC0+aXRuaW1fbWFwcGVkX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpbV9wb3J0LT5iaW5kaW5nX2xpc3QpOworCitleHQ6CisJcmV0dXJuIHJjOworfQorCit2b2lkCitiZmFkX2ltX3BvcnRfZGVsZXRlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX3BvcnRfcyAqcG9ydCkKK3sKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPSBwb3J0LT5pbV9wb3J0OworCisJcXVldWVfd29yayhiZmFkLT5pbS0+ZHJ2X3dvcmtxLAorCQkJCSZpbV9wb3J0LT5wb3J0X2RlbGV0ZV93b3JrKTsKK30KKwordm9pZAorYmZhZF9pbV9wb3J0X2NsZWFuKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCkKK3sKKwlzdHJ1Y3QgYmZhZF9mY3BfYmluZGluZyAqYnAsICpicF9uZXc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gIGltX3BvcnQtPmJmYWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJwLCBicF9uZXcsICZpbV9wb3J0LT5iaW5kaW5nX2xpc3QsCisJCQkJCWxpc3RfZW50cnkpIHsKKwkJbGlzdF9kZWwoJmJwLT5saXN0X2VudHJ5KTsKKwkJa2ZyZWUoYnApOworCX0KKworCS8qIHRoZSBpdG5pbV9tYXBwZWRfbGlzdCBtdXN0IGJlIGVtcHR5IGF0IHRoaXMgdGltZSAqLworCWJmYV9hc3NlcnQobGlzdF9lbXB0eSgmaW1fcG9ydC0+aXRuaW1fbWFwcGVkX2xpc3QpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworfQorCit2b2lkCitiZmFkX2ltX3BvcnRfb25saW5lKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX3BvcnRfcyAqcG9ydCkKK3sKK30KKwordm9pZAorYmZhZF9pbV9wb3J0X29mZmxpbmUoc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0KQoreworfQorCitiZmFfc3RhdHVzX3QKK2JmYWRfaW1fcHJvYmUoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlzdHJ1Y3QgYmZhZF9pbV9zICAgICAgKmltOworCWJmYV9zdGF0dXNfdCAgICByYyA9IEJGQV9TVEFUVVNfT0s7CisKKwlpbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiZmFkX2ltX3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW0gPT0gTlVMTCkgeworCQlyYyA9IEJGQV9TVEFUVVNfRU5PTUVNOworCQlnb3RvIGV4dDsKKwl9CisKKwliZmFkLT5pbSA9IGltOworCWltLT5iZmFkID0gYmZhZDsKKworCWlmIChiZmFkX29zX3RocmVhZF93b3JrcShiZmFkKSAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWtmcmVlKGltKTsKKwkJcmMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKKwl9CisKK2V4dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQKK2JmYWRfaW1fcHJvYmVfdW5kbyhzdHJ1Y3QgYmZhZF9zICpiZmFkKQoreworCWlmIChiZmFkLT5pbSkgeworCQliZmFkX29zX2Rlc3Ryb3lfd29ya3EoYmZhZC0+aW0pOworCQlrZnJlZShiZmFkLT5pbSk7CisJCWJmYWQtPmltID0gTlVMTDsKKwl9Cit9CisKKworCisKK2ludAorYmZhZF9vc19zY3NpX2FkZF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQsCisJCQlzdHJ1Y3QgYmZhZF9zICpiZmFkKQoreworICAgIHN0cnVjdCBkZXZpY2UgKmRldjsKKworICAgIGlmIChpbV9wb3J0LT5wb3J0LT5wdmJfdHlwZSA9PSBCRkFEX1BPUlRfUEhZU19CQVNFKQorCQlkZXYgPSAmYmZhZC0+cGNpZGV2LT5kZXY7CisgICAgZWxzZQorCQlkZXYgPSAmYmZhZC0+cHBvcnQuaW1fcG9ydC0+c2hvc3QtPnNob3N0X2dlbmRldjsKKworICAgIHJldHVybiBzY3NpX2FkZF9ob3N0KHNob3N0LCBkZXYpOworfQorCitzdHJ1Y3QgU2NzaV9Ib3N0ICoKK2JmYWRfb3Nfc2NzaV9ob3N0X2FsbG9jKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCwgc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQ7CisKKwlpZiAoaW1fcG9ydC0+cG9ydC0+cHZiX3R5cGUgPT0gQkZBRF9QT1JUX1BIWVNfQkFTRSkKKwkJc2h0ID0gJmJmYWRfaW1fc2NzaV9ob3N0X3RlbXBsYXRlOworCWVsc2UKKwkJc2h0ID0gJmJmYWRfaW1fdnBvcnRfdGVtcGxhdGU7CisKKwlzaHQtPnNnX3RhYmxlc2l6ZSA9IGJmYWQtPmNmZ19kYXRhLmlvX21heF9zZ2U7CisKKwlyZXR1cm4gc2NzaV9ob3N0X2FsbG9jKHNodCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKK30KKwordm9pZAorYmZhZF9vc19zY3NpX2hvc3RfZnJlZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCBzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQpCit7CisJZmx1c2hfd29ya3F1ZXVlKGJmYWQtPmltLT5kcnZfd29ya3EpOworCWJmYWRfaW1fc2NzaV9ob3N0X2ZyZWUoaW1fcG9ydC0+YmZhZCwgaW1fcG9ydCk7CisJYmZhZF9pbV9wb3J0X2NsZWFuKGltX3BvcnQpOworCWtmcmVlKGltX3BvcnQpOworfQorCit2b2lkCitiZmFkX29zX2Rlc3Ryb3lfd29ya3Eoc3RydWN0IGJmYWRfaW1fcyAqaW0pCit7CisJaWYgKGltICYmIGltLT5kcnZfd29ya3EpIHsKKwkJZGVzdHJveV93b3JrcXVldWUoaW0tPmRydl93b3JrcSk7CisJCWltLT5kcnZfd29ya3EgPSBOVUxMOworCX0KK30KKworYmZhX3N0YXR1c190CitiZmFkX29zX3RocmVhZF93b3JrcShzdHJ1Y3QgYmZhZF9zICpiZmFkKQoreworCXN0cnVjdCBiZmFkX2ltX3MgICAgICAqaW0gPSBiZmFkLT5pbTsKKworCWJmYV90cmMoYmZhZCwgMCk7CisJc25wcmludGYoaW0tPmRydl93b3JrcV9uYW1lLCBCRkFEX0tPQkpfTkFNRV9MRU4sICJiZmFkX3dxXyVkIiwKKwkJIGJmYWQtPmluc3Rfbm8pOworCWltLT5kcnZfd29ya3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShpbS0+ZHJ2X3dvcmtxX25hbWUpOworCWlmICghaW0tPmRydl93b3JrcSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogU2NzaV9Ib3N0IHRlbXBsYXRlIGVudHJ5LgorICoKKyAqIERlc2NyaXB0aW9uOgorICogT1MgZW50cnkgcG9pbnQgdG8gYWRqdXN0IHRoZSBxdWV1ZV9kZXB0aHMgb24gYSBwZXItZGV2aWNlIGJhc2lzLgorICogQ2FsbGVkIG9uY2UgcGVyIGRldmljZSBkdXJpbmcgdGhlIGJ1cyBzY2FuLgorICogUmV0dXJuIG5vbi16ZXJvIGlmIGZhaWxzLgorICovCitzdGF0aWMgaW50CitiZmFkX2ltX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCXNjc2lfYWN0aXZhdGVfdGNxKHNkZXYsIGJmYV9sdW5fcXVldWVfZGVwdGgpOworCWVsc2UKKwkJc2NzaV9kZWFjdGl2YXRlX3RjcShzZGV2LCBiZmFfbHVuX3F1ZXVlX2RlcHRoKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGJmYWRfaW1fc2NzaV9ob3N0X3RlbXBsYXRlID0geworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9IEJGQURfRFJJVkVSX05BTUUsCisJLmluZm8gPSBiZmFkX2ltX2luZm8sCisJLnF1ZXVlY29tbWFuZCA9IGJmYWRfaW1fcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0gYmZhZF9pbV9hYm9ydF9oYW5kbGVyLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IGJmYWRfaW1fcmVzZXRfbHVuX2hhbmRsZXIsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyID0gYmZhZF9pbV9yZXNldF9idXNfaGFuZGxlciwKKworCS5zbGF2ZV9hbGxvYyA9IGJmYWRfaW1fc2xhdmVfYWxsb2MsCisJLnNsYXZlX2NvbmZpZ3VyZSA9IGJmYWRfaW1fc2xhdmVfY29uZmlndXJlLAorCS5zbGF2ZV9kZXN0cm95ID0gYmZhZF9pbV9zbGF2ZV9kZXN0cm95LAorCisJLnRoaXNfaWQgPSAtMSwKKwkuc2dfdGFibGVzaXplID0gQkZBRF9JT19NQVhfU0dFLAorCS5jbWRfcGVyX2x1biA9IDMsCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNob3N0X2F0dHJzID0gYmZhZF9pbV9ob3N0X2F0dHJzLAorCS5tYXhfc2VjdG9ycyA9IDB4RkZGRiwKK307CisKK3N0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYmZhZF9pbV92cG9ydF90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSBCRkFEX0RSSVZFUl9OQU1FLAorCS5pbmZvID0gYmZhZF9pbV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQgPSBiZmFkX2ltX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciA9IGJmYWRfaW1fYWJvcnRfaGFuZGxlciwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBiZmFkX2ltX3Jlc2V0X2x1bl9oYW5kbGVyLAorCS5laF9idXNfcmVzZXRfaGFuZGxlciA9IGJmYWRfaW1fcmVzZXRfYnVzX2hhbmRsZXIsCisKKwkuc2xhdmVfYWxsb2MgPSBiZmFkX2ltX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9jb25maWd1cmUgPSBiZmFkX2ltX3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveSA9IGJmYWRfaW1fc2xhdmVfZGVzdHJveSwKKworCS50aGlzX2lkID0gLTEsCisJLnNnX3RhYmxlc2l6ZSA9IEJGQURfSU9fTUFYX1NHRSwKKwkuY21kX3Blcl9sdW4gPSAzLAorCS51c2VfY2x1c3RlcmluZyA9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5zaG9zdF9hdHRycyA9IGJmYWRfaW1fdnBvcnRfYXR0cnMsCisJLm1heF9zZWN0b3JzID0gMHhGRkZGLAorfTsKKwordm9pZAorYmZhZF9pbV9wcm9iZV9wb3N0KHN0cnVjdCBiZmFkX2ltX3MgKmltKQoreworCWZsdXNoX3dvcmtxdWV1ZShpbS0+ZHJ2X3dvcmtxKTsKK30KKworYmZhX3N0YXR1c190CitiZmFkX2ltX21vZHVsZV9pbml0KHZvaWQpCit7CisJYmZhZF9pbV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSA9CisJCWZjX2F0dGFjaF90cmFuc3BvcnQoJmJmYWRfaW1fZmNfZnVuY3Rpb25fdGVtcGxhdGUpOworCWlmICghYmZhZF9pbV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRU5PTUVNOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK3ZvaWQKK2JmYWRfaW1fbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlpZiAoYmZhZF9pbV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSkKKwkJZmNfcmVsZWFzZV90cmFuc3BvcnQoYmZhZF9pbV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSk7Cit9CisKK3ZvaWQKK2JmYWRfb3NfaXRuaW1fcHJvY2VzcyhzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbV9kcnYpCit7CisJc3RydWN0IGJmYWRfaW1fcyAgICAgICppbSA9IGl0bmltX2Rydi0+aW07CisKKwlpZiAoaXRuaW1fZHJ2LT5xdWV1ZV93b3JrKQorCQlxdWV1ZV93b3JrKGltLT5kcnZfd29ya3EsICZpdG5pbV9kcnYtPml0bmltX3dvcmspOworfQorCit2b2lkCitiZmFkX29zX3JhbXBfdXBfcWRlcHRoKHN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICp0bXBfc2RldjsKKworCWlmICgoKGppZmZpZXMgLSBpdG5pbS0+bGFzdF9yYW1wX3VwX3RpbWUpID4KKwkJQkZBX1FVRVVFX0ZVTExfUkFNUF9VUF9USU1FICogSFopICYmCisJCSgoamlmZmllcyAtIGl0bmltLT5sYXN0X3F1ZXVlX2Z1bGxfdGltZSkgPgorCQlCRkFfUVVFVUVfRlVMTF9SQU1QX1VQX1RJTUUgKiBIWikpIHsKKwkJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHRtcF9zZGV2LCBzZGV2LT5ob3N0KSB7CisJCQlpZiAoYmZhX2x1bl9xdWV1ZV9kZXB0aCA+IHRtcF9zZGV2LT5xdWV1ZV9kZXB0aCkgeworCQkJCWlmICh0bXBfc2Rldi0+aWQgIT0gc2Rldi0+aWQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICh0bXBfc2Rldi0+b3JkZXJlZF90YWdzKQorCQkJCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aCh0bXBfc2RldiwKKwkJCQkJCU1TR19PUkRFUkVEX1RBRywKKwkJCQkJCXRtcF9zZGV2LT5xdWV1ZV9kZXB0aCArIDEpOworCQkJCWVsc2UKKwkJCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgodG1wX3NkZXYsCisJCQkJCQlNU0dfU0lNUExFX1RBRywKKwkJCQkJCXRtcF9zZGV2LT5xdWV1ZV9kZXB0aCArIDEpOworCisJCQkJaXRuaW0tPmxhc3RfcmFtcF91cF90aW1lID0gamlmZmllczsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZAorYmZhZF9vc19oYW5kbGVfcWZ1bGwoc3RydWN0IGJmYWRfaXRuaW1fcyAqaXRuaW0sIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnRtcF9zZGV2OworCisJaXRuaW0tPmxhc3RfcXVldWVfZnVsbF90aW1lID0gamlmZmllczsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZSh0bXBfc2Rldiwgc2Rldi0+aG9zdCkgeworCQlpZiAodG1wX3NkZXYtPmlkICE9IHNkZXYtPmlkKQorCQkJY29udGludWU7CisJCXNjc2lfdHJhY2tfcXVldWVfZnVsbCh0bXBfc2RldiwgdG1wX3NkZXYtPnF1ZXVlX2RlcHRoIC0gMSk7CisJfQorfQorCisKKworCitzdHJ1Y3QgYmZhZF9pdG5pbV9zICoKK2JmYWRfb3NfZ2V0X2l0bmltKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCwgaW50IGlkKQoreworCXN0cnVjdCBiZmFkX2l0bmltX3MgICAqaXRuaW0gPSBOVUxMOworCisJLyogU2VhcmNoIHRoZSBtYXBwZWQgbGlzdCBmb3IgdGhpcyB0YXJnZXQgSUQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0bmltLCAmaW1fcG9ydC0+aXRuaW1fbWFwcGVkX2xpc3QsIGxpc3RfZW50cnkpIHsKKwkJaWYgKGlkID09IGl0bmltLT5zY3NpX3RndF9pZCkKKwkJCXJldHVybiBpdG5pbTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBTY3NpX0hvc3QgdGVtcGxhdGUgZW50cnkgc2xhdmVfYWxsb2MKKyAqLworc3RhdGljIGludAorYmZhZF9pbV9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2RldikpOworCisJaWYgKCFycG9ydCB8fCBmY19yZW1vdGVfcG9ydF9jaGtyZWFkeShycG9ydCkpCisJCXJldHVybiAtRU5YSU87CisKKwlzZGV2LT5ob3N0ZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2JmYWRfb3NfZmNfaG9zdF9pbml0KHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaW1fcG9ydC0+c2hvc3Q7CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhZF9wb3J0X3MgICAgKnBvcnQgPSBpbV9wb3J0LT5wb3J0OworCXVuaW9uIGF0dHIgeworCQlzdHJ1Y3QgYmZhX3Bwb3J0X2F0dHJfcyBwYXR0cjsKKwkJc3RydWN0IGJmYV9pb2NfYXR0cl9zICBpb2NfYXR0cjsKKwl9IGF0dHI7CisKKwlmY19ob3N0X25vZGVfbmFtZShob3N0KSA9CisJCWJmYV9vc19odG9ubGwoKGJmYV9mY3NfcG9ydF9nZXRfbnd3bihwb3J0LT5mY3NfcG9ydCkpKTsKKwlmY19ob3N0X3BvcnRfbmFtZShob3N0KSA9CisJCWJmYV9vc19odG9ubGwoKGJmYV9mY3NfcG9ydF9nZXRfcHd3bihwb3J0LT5mY3NfcG9ydCkpKTsKKworCWZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMoaG9zdCkgPSBGQ19DT1NfQ0xBU1MzOworCisJbWVtc2V0KGZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMoaG9zdCksIDAsCisJICAgICAgIHNpemVvZihmY19ob3N0X3N1cHBvcnRlZF9mYzRzKGhvc3QpKSk7CisJaWYgKGJmYWRfc3VwcG9ydGVkX2ZjNHMgJiAoQkZBX1BPUlRfUk9MRV9GQ1BfSU0gfCBCRkFfUE9SVF9ST0xFX0ZDUF9UTSkpCisJCS8qIEZvciBGQ1AgdHlwZSAweDA4ICovCisJCWZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMoaG9zdClbMl0gPSAxOworCWlmIChiZmFkX3N1cHBvcnRlZF9mYzRzIHwgQkZBX1BPUlRfUk9MRV9GQ1BfSVBGQykKKwkJLyogRm9yIExMQy9TTkFQIHR5cGUgMHgwNSAqLworCQlmY19ob3N0X3N1cHBvcnRlZF9mYzRzKGhvc3QpWzNdID0gMHgyMDsKKwkvKiBGb3IgZmlicmUgY2hhbm5lbCBzZXJ2aWNlcyB0eXBlIDB4MjAgKi8KKwlmY19ob3N0X3N1cHBvcnRlZF9mYzRzKGhvc3QpWzddID0gMTsKKworCW1lbXNldCgmYXR0ci5pb2NfYXR0ciwgMCwgc2l6ZW9mKGF0dHIuaW9jX2F0dHIpKTsKKwliZmFfZ2V0X2F0dHIoJmJmYWQtPmJmYSwgJmF0dHIuaW9jX2F0dHIpOworCXNwcmludGYoZmNfaG9zdF9zeW1ib2xpY19uYW1lKGhvc3QpLCAiQnJvY2FkZSAlcyBGViVzIERWJXMiLAorCQlhdHRyLmlvY19hdHRyLmFkYXB0ZXJfYXR0ci5tb2RlbCwKKwkJYXR0ci5pb2NfYXR0ci5hZGFwdGVyX2F0dHIuZndfdmVyLCBCRkFEX0RSSVZFUl9WRVJTSU9OKTsKKworCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhob3N0KSA9IDA7CisJZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKGhvc3QpIHw9CisJCUZDX1BPUlRTUEVFRF84R0JJVCB8IEZDX1BPUlRTUEVFRF80R0JJVCB8IEZDX1BPUlRTUEVFRF8yR0JJVCB8CisJCUZDX1BPUlRTUEVFRF8xR0JJVDsKKworCW1lbXNldCgmYXR0ci5wYXR0ciwgMCwgc2l6ZW9mKGF0dHIucGF0dHIpKTsKKwliZmFfcHBvcnRfZ2V0X2F0dHIoJmJmYWQtPmJmYSwgJmF0dHIucGF0dHIpOworCWZjX2hvc3RfbWF4ZnJhbWVfc2l6ZShob3N0KSA9IGF0dHIucGF0dHIucHBvcnRfY2ZnLm1heGZyc2l6ZTsKK30KKworc3RhdGljIHZvaWQKK2JmYWRfaW1fZmNfcnBvcnRfYWRkKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCwgc3RydWN0IGJmYWRfaXRuaW1fcyAqaXRuaW0pCit7CisJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzIHJwb3J0X2lkczsKKwlzdHJ1Y3QgZmNfcnBvcnQgKmZjX3Jwb3J0OworCXN0cnVjdCBiZmFkX2l0bmltX2RhdGFfcyAqaXRuaW1fZGF0YTsKKworCXJwb3J0X2lkcy5ub2RlX25hbWUgPQorCQliZmFfb3NfaHRvbmxsKGJmYV9mY3NfaXRuaW1fZ2V0X253d24oJml0bmltLT5mY3NfaXRuaW0pKTsKKwlycG9ydF9pZHMucG9ydF9uYW1lID0KKwkJYmZhX29zX2h0b25sbChiZmFfZmNzX2l0bmltX2dldF9wd3duKCZpdG5pbS0+ZmNzX2l0bmltKSk7CisJcnBvcnRfaWRzLnBvcnRfaWQgPQorCQliZmFfb3NfaHRvbjNiKGJmYV9mY3NfaXRuaW1fZ2V0X2ZjaWQoJml0bmltLT5mY3NfaXRuaW0pKTsKKwlycG9ydF9pZHMucm9sZXMgPSBGQ19SUE9SVF9ST0xFX1VOS05PV047CisKKwlpdG5pbS0+ZmNfcnBvcnQgPSBmY19ycG9ydCA9CisJCWZjX3JlbW90ZV9wb3J0X2FkZChpbV9wb3J0LT5zaG9zdCwgMCwgJnJwb3J0X2lkcyk7CisKKwlpZiAoIWZjX3Jwb3J0KQorCQlyZXR1cm47CisKKwlmY19ycG9ydC0+bWF4ZnJhbWVfc2l6ZSA9CisJCWJmYV9mY3NfaXRuaW1fZ2V0X21heGZyc2l6ZSgmaXRuaW0tPmZjc19pdG5pbSk7CisJZmNfcnBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzID0gYmZhX2Zjc19pdG5pbV9nZXRfY29zKCZpdG5pbS0+ZmNzX2l0bmltKTsKKworCWl0bmltX2RhdGEgPSBmY19ycG9ydC0+ZGRfZGF0YTsKKwlpdG5pbV9kYXRhLT5pdG5pbSA9IGl0bmltOworCisJcnBvcnRfaWRzLnJvbGVzIHw9IEZDX1JQT1JUX1JPTEVfRkNQX1RBUkdFVDsKKworCWlmIChycG9ydF9pZHMucm9sZXMgIT0gRkNfUlBPUlRfUk9MRV9VTktOT1dOKQorCQlmY19yZW1vdGVfcG9ydF9yb2xlY2hnKGZjX3Jwb3J0LCBycG9ydF9pZHMucm9sZXMpOworCisJaWYgKChmY19ycG9ydC0+c2NzaV90YXJnZXRfaWQgIT0gLTEpCisJICAgICYmIChmY19ycG9ydC0+c2NzaV90YXJnZXRfaWQgPCBNQVhfRkNQX1RBUkdFVCkpCisJCWl0bmltLT5zY3NpX3RndF9pZCA9IGZjX3Jwb3J0LT5zY3NpX3RhcmdldF9pZDsKKworCXJldHVybjsKK30KKworLyoqCisgKiBXb3JrIHF1ZXVlIGhhbmRsZXIgdXNpbmcgRkMgdHJhbnNwb3J0IHNlcnZpY2UKKyogQ29udGV4dDoga2VybmVsCisgKi8KK3N0YXRpYyB2b2lkCitiZmFkX2ltX2l0bmltX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJmYWRfaXRuaW1fcyAgICppdG5pbSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmZhZF9pdG5pbV9zLAorCQkJCQkJCWl0bmltX3dvcmspOworCXN0cnVjdCBiZmFkX2ltX3MgICAgICAqaW0gPSBpdG5pbS0+aW07CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW0tPmJmYWQ7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0OworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlzdHJ1Y3QgZmNfcnBvcnQgKmZjX3Jwb3J0OworCXd3bl90IHd3cG47CisJdTMyIGZjaWQ7CisJY2hhciB3d3BuX3N0clszMl0sIGZjaWRfc3RyWzE2XTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpbV9wb3J0ID0gaXRuaW0tPmltX3BvcnQ7CisJYmZhX3RyYyhiZmFkLCBpdG5pbS0+c3RhdGUpOworCXN3aXRjaCAoaXRuaW0tPnN0YXRlKSB7CisJY2FzZSBJVE5JTV9TVEFURV9PTkxJTkU6CisJCWlmICghaXRuaW0tPmZjX3Jwb3J0KSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJCWJmYWRfaW1fZmNfcnBvcnRfYWRkKGltX3BvcnQsIGl0bmltKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJCXd3cG4gPSBiZmFfZmNzX2l0bmltX2dldF9wd3duKCZpdG5pbS0+ZmNzX2l0bmltKTsKKwkJCWZjaWQgPSBiZmFfZmNzX2l0bmltX2dldF9mY2lkKCZpdG5pbS0+ZmNzX2l0bmltKTsKKwkJCXd3bjJzdHIod3dwbl9zdHIsIHd3cG4pOworCQkJZmNpZDJzdHIoZmNpZF9zdHIsIGZjaWQpOworCQkJbGlzdF9hZGRfdGFpbCgmaXRuaW0tPmxpc3RfZW50cnksCisJCQkJJmltX3BvcnQtPml0bmltX21hcHBlZF9saXN0KTsKKwkJCWJmYV9sb2coYmZhZC0+bG9nbW9kLCBCRkFfTE9HX0xJTlVYX0lUTklNX09OTElORSwKKwkJCQlpbV9wb3J0LT5zaG9zdC0+aG9zdF9ubywKKwkJCQlpdG5pbS0+c2NzaV90Z3RfaWQsCisJCQkJZmNpZF9zdHIsIHd3cG5fc3RyKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IGl0bmltICVsbHggaXMgYWxyZWFkeSBpbiBvbmxpbmUgc3RhdGVcbiIsCisJCQkJX19GVU5DVElPTl9fLAorCQkJCWJmYV9mY3NfaXRuaW1fZ2V0X3B3d24oJml0bmltLT5mY3NfaXRuaW0pKTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgSVROSU1fU1RBVEVfT0ZGTElORV9QRU5ESU5HOgorCQlpdG5pbS0+c3RhdGUgPSBJVE5JTV9TVEFURV9PRkZMSU5FOworCQlpZiAoaXRuaW0tPmZjX3Jwb3J0KSB7CisJCQlmY19ycG9ydCA9IGl0bmltLT5mY19ycG9ydDsKKwkJCSgoc3RydWN0IGJmYWRfaXRuaW1fZGF0YV9zICopCisJCQkJZmNfcnBvcnQtPmRkX2RhdGEpLT5pdG5pbSA9IE5VTEw7CisJCQlpdG5pbS0+ZmNfcnBvcnQgPSBOVUxMOworCQkJaWYgKCEoaW1fcG9ydC0+cG9ydC0+ZmxhZ3MgJiBCRkFEX1BPUlRfREVMRVRFKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQkJCWZjX3Jwb3J0LT5kZXZfbG9zc190bW8gPQorCQkJCQliZmFfZmNwaW1fcGF0aF90b3ZfZ2V0KCZiZmFkLT5iZmEpICsgMTsKKwkJCQlmY19yZW1vdGVfcG9ydF9kZWxldGUoZmNfcnBvcnQpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCXd3cG4gPSBiZmFfZmNzX2l0bmltX2dldF9wd3duKCZpdG5pbS0+ZmNzX2l0bmltKTsKKwkJCWZjaWQgPSBiZmFfZmNzX2l0bmltX2dldF9mY2lkKCZpdG5pbS0+ZmNzX2l0bmltKTsKKwkJCXd3bjJzdHIod3dwbl9zdHIsIHd3cG4pOworCQkJZmNpZDJzdHIoZmNpZF9zdHIsIGZjaWQpOworCQkJbGlzdF9kZWwoJml0bmltLT5saXN0X2VudHJ5KTsKKwkJCWJmYV9sb2coYmZhZC0+bG9nbW9kLCBCRkFfTE9HX0xJTlVYX0lUTklNX09GRkxJTkUsCisJCQkJaW1fcG9ydC0+c2hvc3QtPmhvc3Rfbm8sCisJCQkJaXRuaW0tPnNjc2lfdGd0X2lkLAorCQkJCWZjaWRfc3RyLCB3d3BuX3N0cik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJVE5JTV9TVEFURV9GUkVFOgorCQlpZiAoaXRuaW0tPmZjX3Jwb3J0KSB7CisJCQlmY19ycG9ydCA9IGl0bmltLT5mY19ycG9ydDsKKwkJCSgoc3RydWN0IGJmYWRfaXRuaW1fZGF0YV9zICopCisJCQkJZmNfcnBvcnQtPmRkX2RhdGEpLT5pdG5pbSA9IE5VTEw7CisJCQlpdG5pbS0+ZmNfcnBvcnQgPSBOVUxMOworCQkJaWYgKCEoaW1fcG9ydC0+cG9ydC0+ZmxhZ3MgJiBCRkFEX1BPUlRfREVMRVRFKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQkJCWZjX3Jwb3J0LT5kZXZfbG9zc190bW8gPQorCQkJCQliZmFfZmNwaW1fcGF0aF90b3ZfZ2V0KCZiZmFkLT5iZmEpICsgMTsKKwkJCQlmY19yZW1vdGVfcG9ydF9kZWxldGUoZmNfcnBvcnQpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWxpc3RfZGVsKCZpdG5pbS0+bGlzdF9lbnRyeSk7CisJCX0KKworCQlrZnJlZShpdG5pbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIFNjc2lfSG9zdCB0ZW1wbGF0ZSBlbnRyeSwgcXVldWUgYSBTQ1NJIGNvbW1hbmQgdG8gdGhlIEJGQUQuCisgKi8KK3N0YXRpYyBpbnQKK2JmYWRfaW1fcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkoc3RydWN0IGJmYWRfaW1fcG9ydF9zICopIGNtbmQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwlzdHJ1Y3QgYmZhZF9pdG5pbV9kYXRhX3MgKml0bmltX2RhdGEgPSBjbW5kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBiZmFkX2l0bmltX3MgICAqaXRuaW07CisJc3RydWN0IGJmYV9pb2ltX3MgKmhhbF9pbzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIHJjOworCXMxNiAgICAgICAgc2dfY250ID0gMDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChjbW5kLT5kZXZpY2UpKTsKKworCXJjID0gZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpOworCWlmIChyYykgeworCQljbW5kLT5yZXN1bHQgPSByYzsKKwkJZG9uZShjbW5kKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2dfY250ID0gc2NzaV9kbWFfbWFwKGNtbmQpOworCisJaWYgKHNnX2NudCA8IDApCisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCisJY21uZC0+c2NzaV9kb25lID0gZG9uZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoIShiZmFkLT5iZmFkX2ZsYWdzICYgQkZBRF9IQUxfU1RBUlRfRE9ORSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJImJmYWQlZCwgcXVldWVjb21tYW5kICVwICV4IGZhaWxlZCwgQkZBIHN0b3BwZWRcbiIsCisJCSAgICAgICBiZmFkLT5pbnN0X25vLCBjbW5kLCBjbW5kLT5jbW5kWzBdKTsKKwkJY21uZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChESURfTk9fQ09OTkVDVCwgMCk7CisJCWdvdG8gb3V0X2ZhaWxfY21kOworCX0KKworCWl0bmltID0gaXRuaW1fZGF0YS0+aXRuaW07CisJaWYgKCFpdG5pbSkgeworCQljbW5kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9JTU1fUkVUUlksIDApOworCQlnb3RvIG91dF9mYWlsX2NtZDsKKwl9CisKKwloYWxfaW8gPSBiZmFfaW9pbV9hbGxvYygmYmZhZC0+YmZhLCAoc3RydWN0IGJmYWRfaW9pbV9zICopIGNtbmQsCisJCQkJICAgIGl0bmltLT5iZmFfaXRuaW0sIHNnX2NudCk7CisJaWYgKCFoYWxfaW8pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGFsX2lvIGZhaWx1cmVcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJc2NzaV9kbWFfdW5tYXAoY21uZCk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCX0KKworCWNtbmQtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKWhhbF9pbzsKKwliZmFfdHJjX2ZwKGJmYWQsIGhhbF9pby0+aW90YWcpOworCWJmYV9pb2ltX3N0YXJ0KGhhbF9pbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZhaWxfY21kOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXNjc2lfZG1hX3VubWFwKGNtbmQpOworCWlmIChkb25lKQorCQlkb25lKGNtbmQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2JmYWRfb3NfcnBvcnRfb25saW5lX3dhaXQoc3RydWN0IGJmYWRfcyAqYmZhZCkKK3sKKwlpbnQgaTsKKwlpbnQgcnBvcnRfZGVsYXkgPSAxMDsKKworCWZvciAoaSA9IDA7ICEoYmZhZC0+YmZhZF9mbGFncyAmIEJGQURfUE9SVF9PTkxJTkUpCisJCSAmJiBpIDwgYmZhX2xpbmt1cF9kZWxheTsgaSsrKQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWik7CisKKwlpZiAoYmZhZC0+YmZhZF9mbGFncyAmIEJGQURfUE9SVF9PTkxJTkUpIHsKKwkJcnBvcnRfZGVsYXkgPSBycG9ydF9kZWxheSA8IGJmYV9saW5rdXBfZGVsYXkgPworCQkJCSBycG9ydF9kZWxheSA6IGJmYV9saW5rdXBfZGVsYXk7CisJCWZvciAoaSA9IDA7ICEoYmZhZC0+YmZhZF9mbGFncyAmIEJGQURfUlBPUlRfT05MSU5FKQorCQkJICYmIGkgPCBycG9ydF9kZWxheTsgaSsrKQorCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFopOworCisJCWlmIChycG9ydF9kZWxheSA+IDAgJiYgKGJmYWQtPmJmYWRfZmxhZ3MgJiBCRkFEX1JQT1JUX09OTElORSkpCisJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShycG9ydF9kZWxheSAqIEhaKTsKKwl9Cit9CisKK2ludAorYmZhZF9vc19nZXRfbGlua3VwX2RlbGF5KHN0cnVjdCBiZmFkX3MgKmJmYWQpCit7CisKKwl1OCAgICAgICAgIG53d25zID0gMDsKKwl3d25fdCAgICAgICAgICAgKnd3bnM7CisJaW50ICAgICAgICAgICAgIGxkZWxheTsKKworCS8qCisJICogUXVlcnlpbmcgZm9yIHRoZSBib290IHRhcmdldCBwb3J0IHd3bnMKKwkgKiAtLSByZWFkIGZyb20gYm9vdCBpbmZvcm1hdGlvbiBpbiBmbGFzaC4KKwkgKiBJZiBud3ducyA+IDAgPT4gYm9vdCBvdmVyIFNBTiBhbmQgc2V0IGJmYV9saW5rdXBfZGVsYXkgPSAzMAorCSAqIGVsc2UgPT4gbG9jYWwgYm9vdCBtYWNoaW5lIHNldCBiZmFfbGlua3VwX2RlbGF5ID0gMTAKKwkgKi8KKworCWJmYV9pb2NmY19nZXRfYm9vdHd3bnMoJmJmYWQtPmJmYSwgJm53d25zLCAmd3ducyk7CisKKwlpZiAobnd3bnMgPiAwKSB7CisJCS8qIElmIGJvb3Qgb3ZlciBTQU47IGxpbmt1cF9kZWxheSA9IDMwc2VjICovCisJCWxkZWxheSA9IDMwOworCX0gZWxzZSB7CisJCS8qIElmIGxvY2FsIGJvb3Q7IGxpbmt1cF9kZWxheSA9IDEwc2VjICovCisJCWxkZWxheSA9IDA7CisJfQorCisJcmV0dXJuIGxkZWxheTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWE1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBRF9JTV9IX18KKyNkZWZpbmUgX19CRkFEX0lNX0hfXworCisjaW5jbHVkZSAiZmNzL2JmYV9mY3NfZmNwaW0uaCIKKyNpbmNsdWRlICJiZmFkX2ltX2NvbXBhdC5oIgorCisjZGVmaW5lIEZDUElfTkFNRSAiIGZjcGltIgorCit2b2lkIGJmYWRfZmxhZ3Nfc2V0KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHUzMiBmbGFncyk7CitiZmFfc3RhdHVzX3QgYmZhZF9pbV9tb2R1bGVfaW5pdCh2b2lkKTsKK3ZvaWQgYmZhZF9pbV9tb2R1bGVfZXhpdCh2b2lkKTsKK2JmYV9zdGF0dXNfdCBiZmFkX2ltX3Byb2JlKHN0cnVjdCBiZmFkX3MgKmJmYWQpOwordm9pZCBiZmFkX2ltX3Byb2JlX3VuZG8oc3RydWN0IGJmYWRfcyAqYmZhZCk7Cit2b2lkIGJmYWRfaW1fcHJvYmVfcG9zdChzdHJ1Y3QgYmZhZF9pbV9zICppbSk7CitiZmFfc3RhdHVzX3QgYmZhZF9pbV9wb3J0X25ldyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCBzdHJ1Y3QgYmZhZF9wb3J0X3MgKnBvcnQpOwordm9pZCBiZmFkX2ltX3BvcnRfZGVsZXRlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX3BvcnRfcyAqcG9ydCk7Cit2b2lkIGJmYWRfaW1fcG9ydF9vbmxpbmUoc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0KTsKK3ZvaWQgYmZhZF9pbV9wb3J0X29mZmxpbmUoc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYWRfcG9ydF9zICpwb3J0KTsKK3ZvaWQgYmZhZF9pbV9wb3J0X2NsZWFuKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCk7CitpbnQgIGJmYWRfaW1fc2NzaV9ob3N0X2FsbG9jKHN0cnVjdCBiZmFkX3MgKmJmYWQsCisJCQkJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0KTsKK3ZvaWQgYmZhZF9pbV9zY3NpX2hvc3RfZnJlZShzdHJ1Y3QgYmZhZF9zICpiZmFkLAorCQkJCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCk7CisKKyNkZWZpbmUgTUFYX0ZDUF9UQVJHRVQgMTAyNAorI2RlZmluZSBNQVhfRkNQX0xVTiAxNjM4NAorI2RlZmluZSBCRkFEX1RBUkdFVF9SRVNFVF9UTU8gNjAKKyNkZWZpbmUgQkZBRF9MVU5fUkVTRVRfVE1PIDYwCisjZGVmaW5lIFNjc2lSZXN1bHQoaG9zdF9jb2RlLCBzY3NpX2NvZGUpICgoKGhvc3RfY29kZSkgPDwgMTYpIHwgc2NzaV9jb2RlKQorI2RlZmluZSBCRkFfUVVFVUVfRlVMTF9SQU1QX1VQX1RJTUUgMTIwCisjZGVmaW5lIEJGQURfS09CSl9OQU1FX0xFTiAyMAorCisvKgorICogaXRuaW0gZmxhZ3MKKyAqLworI2RlZmluZSBJVE5JTV9NQVBQRUQJCTB4MDAwMDAwMDEKKworI2RlZmluZSBTQ1NJX1RBU0tfTUdNVAkJMHgwMDAwMDAwMQorI2RlZmluZSBJT19ET05FX0JJVAkJCTAKKworc3RydWN0IGJmYWRfaXRuaW1fZGF0YV9zIHsKKwlzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbTsKK307CisKK3N0cnVjdCBiZmFkX2ltX3BvcnRfcyB7CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkOworCXN0cnVjdCBiZmFkX3BvcnRfcyAgICAqcG9ydDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcG9ydF9kZWxldGVfd29yazsKKwlpbnQgICAgICAgICAgICAgaWRyX2lkOworCXUxNiAgICAgICAgY3VyX3Njc2lfaWQ7CisJc3RydWN0IGxpc3RfaGVhZCBiaW5kaW5nX2xpc3Q7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBpdG5pbV9tYXBwZWRfbGlzdDsKK307CisKK2VudW0gYmZhZF9pdG5pbV9zdGF0ZSB7CisJSVROSU1fU1RBVEVfTk9ORSwKKwlJVE5JTV9TVEFURV9PTkxJTkUsCisJSVROSU1fU1RBVEVfT0ZGTElORV9QRU5ESU5HLAorCUlUTklNX1NUQVRFX09GRkxJTkUsCisJSVROSU1fU1RBVEVfVElNRU9VVCwKKwlJVE5JTV9TVEFURV9GUkVFLAorfTsKKworLyoKKyAqIFBlciBpdG5pbSBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgYmZhZF9pdG5pbV9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50cnk7CisJc3RydWN0IGJmYV9mY3NfaXRuaW1fcyBmY3NfaXRuaW07CisJc3RydWN0IHdvcmtfc3RydWN0IGl0bmltX3dvcms7CisJdTMyICAgICAgICBmbGFnczsKKwllbnVtIGJmYWRfaXRuaW1fc3RhdGUgc3RhdGU7CisJc3RydWN0IGJmYWRfaW1fcyAqaW07CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0OworCXN0cnVjdCBiZmFkX3Jwb3J0X3MgKmRydl9ycG9ydDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKmZjX3Jwb3J0OworCXN0cnVjdCBiZmFfaXRuaW1fcyAqYmZhX2l0bmltOworCXUxNiAgICAgICAgc2NzaV90Z3RfaWQ7CisJdTE2ICAgICAgICBxdWV1ZV93b3JrOworCXVuc2lnbmVkIGxvbmcJbGFzdF9yYW1wX3VwX3RpbWU7CisJdW5zaWduZWQgbG9uZwlsYXN0X3F1ZXVlX2Z1bGxfdGltZTsKK307CisKK2VudW0gYmZhZF9iaW5kaW5nX3R5cGUgeworCUZDUF9QV1dOX0JJTkRJTkcgPSAweDEsCisJRkNQX05XV05fQklORElORyA9IDB4MiwKKwlGQ1BfRkNJRF9CSU5ESU5HID0gMHgzLAorfTsKKworc3RydWN0IGJmYWRfZmNwX2JpbmRpbmcgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9lbnRyeTsKKwllbnVtIGJmYWRfYmluZGluZ190eXBlIGJpbmRpbmdfdHlwZTsKKwl1MTYgICAgICAgIHNjc2lfdGFyZ2V0X2lkOworCXUzMiAgICAgICAgZmNfaWQ7CisJd3duX3QgICAgICAgICAgIG53d247CisJd3duX3QgICAgICAgICAgIHB3d247Cit9OworCitzdHJ1Y3QgYmZhZF9pbV9zIHsKKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQ7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmRydl93b3JrcTsKKwljaGFyICAgZHJ2X3dvcmtxX25hbWVbQkZBRF9LT0JKX05BTUVfTEVOXTsKK307CisKK3N0cnVjdCBTY3NpX0hvc3QgKmJmYWRfb3Nfc2NzaV9ob3N0X2FsbG9jKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCwKKwkJCQlzdHJ1Y3QgYmZhZF9zICopOworYmZhX3N0YXR1c190IGJmYWRfb3NfdGhyZWFkX3dvcmtxKHN0cnVjdCBiZmFkX3MgKmJmYWQpOwordm9pZCBiZmFkX29zX2Rlc3Ryb3lfd29ya3Eoc3RydWN0IGJmYWRfaW1fcyAqaW0pOwordm9pZCBiZmFkX29zX2l0bmltX3Byb2Nlc3Moc3RydWN0IGJmYWRfaXRuaW1fcyAqaXRuaW1fZHJ2KTsKK3ZvaWQgYmZhZF9vc19mY19ob3N0X2luaXQoc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0KTsKK3ZvaWQgYmZhZF9vc19pbml0X3dvcmsoc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0KTsKK3ZvaWQgYmZhZF9vc19zY3NpX2hvc3RfZnJlZShzdHJ1Y3QgYmZhZF9zICpiZmFkLAorCQkJCSBzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQpOwordm9pZCBiZmFkX29zX3JhbXBfdXBfcWRlcHRoKHN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltLAorCQkJCSBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwordm9pZCBiZmFkX29zX2hhbmRsZV9xZnVsbChzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbSwgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKK3N0cnVjdCBiZmFkX2l0bmltX3MgKmJmYWRfb3NfZ2V0X2l0bmltKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCwgaW50IGlkKTsKK2ludCBiZmFkX29zX3Njc2lfYWRkX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCXN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCwgc3RydWN0IGJmYWRfcyAqYmZhZCk7CisKKy8qCisgKiBzY3NpX2hvc3RfdGVtcGxhdGUgZW50cmllcworICovCit2b2lkIGJmYWRfaW1faXRuaW1fdW5tYXAoc3RydWN0IGJmYWRfaW1fcG9ydF9zICAqaW1fcG9ydCwKKwkJCSBzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbSk7CisKK2V4dGVybiBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGJmYWRfaW1fc2NzaV9ob3N0X3RlbXBsYXRlOworZXh0ZXJuIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYmZhZF9pbV92cG9ydF90ZW1wbGF0ZTsKK2V4dGVybiBzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgYmZhZF9pbV9mY19mdW5jdGlvbl90ZW1wbGF0ZTsKK2V4dGVybiBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmJmYWRfaW1fc2NzaV90cmFuc3BvcnRfdGVtcGxhdGU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltX2NvbXBhdC5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2U3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW1fY29tcGF0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBRF9JTV9DT01QQVRfSF9fCisjZGVmaW5lIF9fQkZBRF9JTV9DT01QQVRfSF9fCisKK2V4dGVybiB1MzIgKmJmaV9pbWFnZV9idWY7CitleHRlcm4gdTMyIGJmaV9pbWFnZV9zaXplOworCitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmJmYWRfaW1faG9zdF9hdHRyc1tdOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpiZmFkX2ltX3Zwb3J0X2F0dHJzW107CisKK3UzMiAqYmZhZF9nZXRfZmlybXdhcmVfYnVmKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3UzMiAqYmZhZF9yZWFkX2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgKipiZmlfaW1hZ2UsCisJCQl1MzIgKmJmaV9pbWFnZV9zaXplLCBjaGFyICpmd19uYW1lKTsKKworc3RhdGljIGlubGluZSB1MzIgKgorYmZhZF9sb2FkX2Z3aW1nKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybihiZmFkX2dldF9maXJtd2FyZV9idWYocGRldikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2JmYWRfZnJlZV9md2ltZyh2b2lkKQoreworCWlmIChiZmlfaW1hZ2VfY3Rfc2l6ZSAmJiBiZmlfaW1hZ2VfY3QpCisJCXZmcmVlKGJmaV9pbWFnZV9jdCk7CisJaWYgKGJmaV9pbWFnZV9jYl9zaXplICYmIGJmaV9pbWFnZV9jYikKKwkJdmZyZWUoYmZpX2ltYWdlX2NiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW50ci5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ludHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA0ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ludHIuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKyNpbmNsdWRlICJiZmFkX3RyY21vZC5oIgorCitCRkFfVFJDX0ZJTEUoTERSViwgSU5UUik7CisKKy8qKgorICogIGJmYV9pc3IgQkZBIGRyaXZlciBpbnRlcnJ1cHQgZnVuY3Rpb25zCisgKi8KK2lycXJldHVybl90IGJmYWRfaW50eChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworc3RhdGljIGludCBtc2l4X2Rpc2FibGU7Cittb2R1bGVfcGFyYW0obXNpeF9kaXNhYmxlLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKy8qKgorICogTGluZSBiYXNlZCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworaXJxcmV0dXJuX3QKK2JmYWRfaW50eChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkID0gZGV2X2lkOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICBkb25lcTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJYmZhX2Jvb2xlYW5fdCByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyYyA9IGJmYV9pbnR4KCZiZmFkLT5iZmEpOworCWlmICghcmMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwliZmFfY29tcF9kZXEoJmJmYWQtPmJmYSwgJmRvbmVxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmICghbGlzdF9lbXB0eSgmZG9uZXEpKSB7CisJCWJmYV9jb21wX3Byb2Nlc3MoJmJmYWQtPmJmYSwgJmRvbmVxKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWJmYV9jb21wX2ZyZWUoJmJmYWQtPmJmYSwgJmRvbmVxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWJmYV90cmNfZnAoYmZhZCwgaXJxKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK30KKworc3RhdGljIGlycXJldHVybl90CitiZmFkX21zaXgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBiZmFkX21zaXhfcyAqdmVjID0gZGV2X2lkOworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSB2ZWMtPmJmYWQ7CisJc3RydWN0IGxpc3RfaGVhZCBkb25lcTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwliZmFfbXNpeCgmYmZhZC0+YmZhLCB2ZWMtPm1zaXguZW50cnkpOworCWJmYV9jb21wX2RlcSgmYmZhZC0+YmZhLCAmZG9uZXEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaWYgKCFsaXN0X2VtcHR5KCZkb25lcSkpIHsKKwkJYmZhX2NvbXBfcHJvY2VzcygmYmZhZC0+YmZhLCAmZG9uZXEpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJYmZhX2NvbXBfZnJlZSgmYmZhZC0+YmZhLCAmZG9uZXEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgTVNJWCBlbnRyeSB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYWRfaW5pdF9tc2l4X2VudHJ5KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X2VudHJpZXMsCisJCQkgaW50IG1hc2ssIGludCBtYXhfYml0KQoreworCWludCAgICAgICAgICAgICBpOworCWludCAgICAgICAgICAgICBtYXRjaCA9IDB4MDAwMDAwMDE7CisKKwlmb3IgKGkgPSAwLCBiZmFkLT5udmVjID0gMDsgaSA8IE1BWF9NU0lYX0VOVFJZOyBpKyspIHsKKwkJaWYgKG1hc2sgJiBtYXRjaCkgeworCQkJYmZhZC0+bXNpeF90YWJbYmZhZC0+bnZlY10ubXNpeC5lbnRyeSA9IGk7CisJCQliZmFkLT5tc2l4X3RhYltiZmFkLT5udmVjXS5iZmFkID0gYmZhZDsKKwkJCW1zaXhfZW50cmllc1tiZmFkLT5udmVjXS5lbnRyeSA9IGk7CisJCQliZmFkLT5udmVjKys7CisJCX0KKworCQltYXRjaCA8PD0gMTsKKwl9CisKK30KKworaW50CitiZmFkX2luc3RhbGxfbXNpeF9oYW5kbGVyKHN0cnVjdCBiZmFkX3MgKmJmYWQpCit7CisJaW50ICAgICAgICAgICAgIGksIGVycm9yID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBiZmFkLT5udmVjOyBpKyspIHsKKwkJZXJyb3IgPSByZXF1ZXN0X2lycShiZmFkLT5tc2l4X3RhYltpXS5tc2l4LnZlY3RvciwKKwkJCQkgICAgKGlycV9oYW5kbGVyX3QpIGJmYWRfbXNpeCwgMCwKKwkJCQkgICAgQkZBRF9EUklWRVJfTkFNRSwgJmJmYWQtPm1zaXhfdGFiW2ldKTsKKwkJYmZhX3RyYyhiZmFkLCBpKTsKKwkJYmZhX3RyYyhiZmFkLCBiZmFkLT5tc2l4X3RhYltpXS5tc2l4LnZlY3Rvcik7CisJCWlmIChlcnJvcikgeworCQkJaW50ICAgICAgICAgICAgIGo7CisKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQkJZnJlZV9pcnEoYmZhZC0+bXNpeF90YWJbal0ubXNpeC52ZWN0b3IsCisJCQkJCQkmYmZhZC0+bXNpeF90YWJbal0pOworCisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFNldHVwIE1TSVggYmFzZWQgaW50ZXJydXB0LgorICovCitpbnQKK2JmYWRfc2V0dXBfaW50cihzdHJ1Y3QgYmZhZF9zICpiZmFkKQoreworCWludCBlcnJvciA9IDA7CisJdTMyIG1hc2sgPSAwLCBpLCBudW1fYml0ID0gMCwgbWF4X2JpdCA9IDA7CisJc3RydWN0IG1zaXhfZW50cnkgbXNpeF9lbnRyaWVzW01BWF9NU0lYX0VOVFJZXTsKKworCS8qIENhbGwgQkZBIHRvIGdldCB0aGUgbXNpeCBtYXAgZm9yIHRoaXMgUENJIGZ1bmN0aW9uLiAgKi8KKwliZmFfbXNpeF9nZXR2ZWNzKCZiZmFkLT5iZmEsICZtYXNrLCAmbnVtX2JpdCwgJm1heF9iaXQpOworCisJLyogU2V0IHVwIHRoZSBtc2l4IGVudHJ5IHRhYmxlICovCisJYmZhZF9pbml0X21zaXhfZW50cnkoYmZhZCwgbXNpeF9lbnRyaWVzLCBtYXNrLCBtYXhfYml0KTsKKworCWlmICghbXNpeF9kaXNhYmxlKSB7CisJCWVycm9yID0gcGNpX2VuYWJsZV9tc2l4KGJmYWQtPnBjaWRldiwgbXNpeF9lbnRyaWVzLCBiZmFkLT5udmVjKTsKKwkJaWYgKGVycm9yKSB7CisJCQkvKgorCQkJICogT25seSBlcnJvciBudW1iZXIgb2YgdmVjdG9yIGlzIGF2YWlsYWJsZS4KKwkJCSAqIFdlIGRvbid0IGhhdmUgYSBtZWNoYW5pc20gdG8gbWFwIG11bHRpcGxlCisJCQkgKiBpbnRlcnJ1cHRzIGludG8gb25lIHZlY3Rvciwgc28gZXZlbiBpZiB3ZQorCQkJICogY2FuIHRyeSB0byByZXF1ZXN0IGxlc3MgdmVjdG9ycywgd2UgZG9uJ3QKKwkJCSAqIGtub3cgaG93IHRvIGFzc29jaWF0ZSBpbnRlcnJ1cHQgZXZlbnRzIHRvCisJCQkgKiAgdmVjdG9ycy4gTGludXggZG9lc24ndCBkdXBpY2F0ZSB2ZWN0b3JzCisJCQkgKiBpbiB0aGUgTVNJWCB0YWJsZSBmb3IgdGhpcyBjYXNlLgorCQkJICovCisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJmYWQlZDogIgorCQkJCSJwY2lfZW5hYmxlX21zaXggZmFpbGVkICglZCksIgorCQkJCSIgdXNlIGxpbmUgYmFzZWQuXG4iLCBiZmFkLT5pbnN0X25vLCBlcnJvcik7CisKKwkJCWdvdG8gbGluZV9iYXNlZDsKKwkJfQorCisJCS8qIFNhdmUgdGhlIHZlY3RvcnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGJmYWQtPm52ZWM7IGkrKykgeworCQkJYmZhX3RyYyhiZmFkLCBtc2l4X2VudHJpZXNbaV0udmVjdG9yKTsKKwkJCWJmYWQtPm1zaXhfdGFiW2ldLm1zaXgudmVjdG9yID0gbXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKKwkJfQorCisJCWJmYV9tc2l4X2luaXQoJmJmYWQtPmJmYSwgYmZhZC0+bnZlYyk7CisKKwkJYmZhZC0+YmZhZF9mbGFncyB8PSBCRkFEX01TSVhfT047CisKKwkJcmV0dXJuIGVycm9yOworCX0KKworbGluZV9iYXNlZDoKKwllcnJvciA9IDA7CisJaWYgKHJlcXVlc3RfaXJxCisJICAgIChiZmFkLT5wY2lkZXYtPmlycSwgKGlycV9oYW5kbGVyX3QpIGJmYWRfaW50eCwgQkZBRF9JUlFfRkxBR1MsCisJICAgICBCRkFEX0RSSVZFUl9OQU1FLCBiZmFkKSAhPSAwKSB7CisJCS8qIEVuYWJsZSBpbnRlcnJ1cHQgaGFuZGxlciBmYWlsZWQgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCit2b2lkCitiZmFkX3JlbW92ZV9pbnRyKHN0cnVjdCBiZmFkX3MgKmJmYWQpCit7CisJaW50ICAgICAgICAgICAgIGk7CisKKwlpZiAoYmZhZC0+YmZhZF9mbGFncyAmIEJGQURfTVNJWF9PTikgeworCQlmb3IgKGkgPSAwOyBpIDwgYmZhZC0+bnZlYzsgaSsrKQorCQkJZnJlZV9pcnEoYmZhZC0+bXNpeF90YWJbaV0ubXNpeC52ZWN0b3IsCisJCQkJCSZiZmFkLT5tc2l4X3RhYltpXSk7CisKKwkJcGNpX2Rpc2FibGVfbXNpeChiZmFkLT5wY2lkZXYpOworCQliZmFkLT5iZmFkX2ZsYWdzICY9IH5CRkFEX01TSVhfT047CisJfSBlbHNlIHsKKwkJZnJlZV9pcnEoYmZhZC0+cGNpZGV2LT5pcnEsIGJmYWQpOworCX0KK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaXBmYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2lwZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MThiYzUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2lwZmMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQkZBX0RSVl9JUEZDX0hfXworI2RlZmluZSBfX0JGQV9EUlZfSVBGQ19IX18KKworCisjZGVmaW5lIElQRkNfTkFNRSAiIgorCisjZGVmaW5lIGJmYWRfaXBmY19tb2R1bGVfaW5pdCh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgYmZhZF9pcGZjX21vZHVsZV9leGl0KHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBiZmFkX2lwZmNfcHJvYmUoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGJmYWRfaXBmY19wcm9iZV91bmRvKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBiZmFkX2lwZmNfcG9ydF9jb25maWcoeCwgeSkgQkZBX1NUQVRVU19PSworI2RlZmluZSBiZmFkX2lwZmNfcG9ydF91bmNvbmZpZyh4LCB5KSBkbyB7fSB3aGlsZSAoMCkKKworI2RlZmluZSBiZmFkX2lwZmNfcHJvYmVfcG9zdCh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgYmZhZF9pcGZjX3BvcnRfbmV3KHgsIHksIHopIEJGQV9TVEFUVVNfT0sKKyNkZWZpbmUgYmZhZF9pcGZjX3BvcnRfZGVsZXRlKHgsIHkpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBiZmFkX2lwZmNfcG9ydF9vbmxpbmUoeCwgeSkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGJmYWRfaXBmY19wb3J0X29mZmxpbmUoeCwgeSkgZG8ge30gd2hpbGUgKDApCisKKyNkZWZpbmUgYmZhZF9pcF9nZXRfYXR0cih4KSBCRkFfU1RBVFVTX0ZBSUxFRAorI2RlZmluZSBiZmFkX2lwX3Jlc2V0X2Rydl9zdGF0cyh4KSBCRkFfU1RBVFVTX0ZBSUxFRAorI2RlZmluZSBiZmFkX2lwX2dldF9kcnZfc3RhdHMoeCwgeSkgQkZBX1NUQVRVU19GQUlMRUQKKyNkZWZpbmUgYmZhZF9pcF9lbmFibGVfaXBmYyh4LCB5LCB6KSBCRkFfU1RBVFVTX0ZBSUxFRAorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX29zLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWY0N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX29zLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFkX29zLmMgTGludXggZHJpdmVyIE9TIHNwZWNpZmljIGNhbGxzLgorICovCisKKyNpbmNsdWRlICJiZmFfb3NfaW5jLmgiCisjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKwordm9pZAorYmZhX29zX2dldHRpbWVvZmRheShzdHJ1Y3QgYmZhX3RpbWV2YWxfcyAqdHYpCit7CisJc3RydWN0IHRpbWV2YWwgIHRtcF90djsKKworCWRvX2dldHRpbWVvZmRheSgmdG1wX3R2KTsKKwl0di0+dHZfc2VjID0gKHUzMikgdG1wX3R2LnR2X3NlYzsKKwl0di0+dHZfdXNlYyA9ICh1MzIpIHRtcF90di50dl91c2VjOworfQorCit2b2lkCitiZmFfb3NfcHJpbnRmKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLCB1MzIgbXNnX2lkLAorCQkJY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwkjZGVmaW5lIEJGQV9TVFJJTkdfMjU2CTI1NgorCWNoYXIgdG1wW0JGQV9TVFJJTkdfMjU2XTsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZzcHJpbnRmKHRtcCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXByaW50ayh0bXApOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF90bS5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX3RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwMWIxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF90bS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIQkEgTGludXggVGFyZ2V0IE1vZGUgRHJpdmVyCisgKi8KKworLyoqCisgKiAgdG0vZHVtbXkvYmZhZF90bS5oIEJGQSBjYWxsYmFjayBkdW1teSBoZWFkZXIgZmlsZSBmb3IgQkZBIExpbnV4IHRhcmdldCBtb2RlIFBDSSBpbnRlcmZhY2UgbW9kdWxlLgorICovCisKKyNpZm5kZWYgX19CRkFEX1RNX0hfXworI2RlZmluZSBfX0JGQURfVE1fSF9fCisKKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3N0YXR1cy5oPgorCisjZGVmaW5lIEZDUFRfTkFNRSAJCSIiCisKKy8qCisgKiBDYWxsZWQgZnJvbSBiYXNlIExpbnV4IGRyaXZlciBvbiAoRGUpSW5pdCBldmVudHMKKyAqLworCisvKiBhdHRhY2ggdGd0IHRlbXBsYXRlIHdpdGggc2NzdCAqLworI2RlZmluZSBiZmFkX3RtX21vZHVsZV9pbml0KCkJZG8ge30gd2hpbGUgKDApCisKKy8qIGRldGFjaC9yZWxlYXNlIHRndCB0ZW1wbGF0ZSAqLworI2RlZmluZSBiZmFkX3RtX21vZHVsZV9leGl0KCkJZG8ge30gd2hpbGUgKDApCisKKyNkZWZpbmUgYmZhZF90bV9wcm9iZSh4KQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgYmZhZF90bV9wcm9iZV91bmRvKHgpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBiZmFkX3RtX3Byb2JlX3Bvc3QoeCkJZG8ge30gd2hpbGUgKDApCisKKy8qCisgKiBDYWxsZWQgYnkgYmFzZSBMaW51eCBkcml2ZXIgYnV0IHRyaWdnZXJlZCBieSBCRkEgRkNTIG9uIGNvbmZpZyBldmVudHMKKyAqLworI2RlZmluZSBiZmFkX3RtX3BvcnRfbmV3KHgsIHkpCQlCRkFfU1RBVFVTX09LCisjZGVmaW5lIGJmYWRfdG1fcG9ydF9kZWxldGUoeCwgeSkJZG8ge30gd2hpbGUgKDApCisKKy8qCisgKiBDYWxsZWQgYnkgYmFzZSBMaW51eCBkcml2ZXIgYnV0IHRyaWdnZXJlZCBieSBCRkEgRkNTIG9uIFBMT0dJL08gZXZlbnRzCisgKi8KKyNkZWZpbmUgYmZhZF90bV9wb3J0X29ubGluZSh4LCB5KQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgYmZhZF90bV9wb3J0X29mZmxpbmUoeCwgeSkJZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX3RyY21vZC5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX3RyY21vZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MjdiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfdHJjbW9kLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFkX3RyY21vZC5oIExpbnV4IGRyaXZlciB0cmFjZSBtb2R1bGVzCisgKi8KKworCisjaWZuZGVmIF9fQkZBRF9UUkNNT0RfSF9fCisjZGVmaW5lIF9fQkZBRF9UUkNNT0RfSF9fCisKKyNpbmNsdWRlIDxjcy9iZmFfdHJjLmg+CisKKy8qCisgKiAhISEgT25seSBhcHBlbmQgdG8gdGhlIGVudW1zIGRlZmluZWQgaGVyZSB0byBhdm9pZCBhbnkgdmVyc2lvbmluZworICogISEhIG5lZWRlZCBiZXR3ZWVuIHRyYWNlIHV0aWxpdHkgYW5kIGRyaXZlciB2ZXJzaW9uCisgKi8KK2VudW0geworCS8qIDIuNiBEcml2ZXIgKi8KKwlCRkFfVFJDX0xEUlZfQkZBRAkJPSAxLAorCUJGQV9UUkNfTERSVl9CRkFEXzJfNgkJPSAyLAorCUJGQV9UUkNfTERSVl9CRkFEXzJfNl85CQk9IDMsCisJQkZBX1RSQ19MRFJWX0JGQURfMl82XzEwCT0gNCwKKwlCRkFfVFJDX0xEUlZfSU5UUgkJPSA1LAorCUJGQV9UUkNfTERSVl9JT0NUTAkJPSA2LAorCUJGQV9UUkNfTERSVl9PUwkJCT0gNywKKwlCRkFfVFJDX0xEUlZfSU0JCQk9IDgsCisJQkZBX1RSQ19MRFJWX0lNXzJfNgkJPSA5LAorCUJGQV9UUkNfTERSVl9JTV8yXzZfOQkJPSAxMCwKKwlCRkFfVFJDX0xEUlZfSU1fMl82XzEwCQk9IDExLAorCUJGQV9UUkNfTERSVl9UTQkJCT0gMTIsCisJQkZBX1RSQ19MRFJWX0lQRkMJCT0gMTMsCisJQkZBX1RSQ19MRFJWX0lNXzJfNAkJPSAxNCwKKwlCRkFfVFJDX0xEUlZfSU1fVk1XCQk9IDE1LAorCUJGQV9UUkNfTERSVl9JTV9MVF8yXzZfMTAJPSAxNiwKK307CisKKyNlbmRpZiAvKiBfX0JGQURfVFJDTU9EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mYWIuYyBiL2RyaXZlcnMvc2NzaS9iZmEvZmFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYTRkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmFiLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgImZjc19scG9ydC5oIgorI2luY2x1ZGUgImZjc19ycG9ydC5oIgorI2luY2x1ZGUgImxwb3J0X3ByaXYuaCIKKworLyoqCisgKiAgZmFiLmMgcG9ydCBmYWIgaW1wbGVtZW50YXRpb24uCisgKi8KKworLyoqCisgKiAgYmZhX2Zjc19wb3J0X2ZhYl9wdWJsaWMgcG9ydCBmYWIgcHVibGljIGZ1bmN0aW9ucworICovCisKKy8qKgorICogICBDYWxsZWQgYnkgcG9ydCB0byBpbml0aWFsaXplIGZhYnJpYyBzZXJ2aWNlcyBvZiB0aGUgYmFzZSBwb3J0LgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfZmFiX2luaXQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCWJmYV9mY3NfcG9ydF9uc19pbml0KHBvcnQpOworCWJmYV9mY3NfcG9ydF9zY25faW5pdChwb3J0KTsKKwliZmFfZmNzX3BvcnRfbXNfaW5pdChwb3J0KTsKK30KKworLyoqCisgKiAgIENhbGxlZCBieSBwb3J0IHRvIG5vdGlmeSB0cmFuc2l0aW9uIHRvIG9ubGluZSBzdGF0ZS4KKyAqLwordm9pZAorYmZhX2Zjc19wb3J0X2ZhYl9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCWJmYV9mY3NfcG9ydF9uc19vbmxpbmUocG9ydCk7CisJYmZhX2Zjc19wb3J0X3Njbl9vbmxpbmUocG9ydCk7Cit9CisKKy8qKgorICogICBDYWxsZWQgYnkgcG9ydCB0byBub3RpZnkgdHJhbnNpdGlvbiB0byBvZmZsaW5lIHN0YXRlLgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfZmFiX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCWJmYV9mY3NfcG9ydF9uc19vZmZsaW5lKHBvcnQpOworCWJmYV9mY3NfcG9ydF9zY25fb2ZmbGluZShwb3J0KTsKKwliZmFfZmNzX3BvcnRfbXNfb2ZmbGluZShwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmFicmljLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2ZhYnJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YjE0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2ZhYnJpYy5jCkBAIC0wLDAgKzEsMTI3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBmYWJyaWMuYyBGYWJyaWMgbW9kdWxlIGltcGxlbWVudGF0aW9uLgorICovCisKKyNpbmNsdWRlICJmY3NfZmFicmljLmgiCisjaW5jbHVkZSAiZmNzX2xwb3J0LmgiCisjaW5jbHVkZSAiZmNzX3Zwb3J0LmgiCisjaW5jbHVkZSAiZmNzX3RyY21vZC5oIgorI2luY2x1ZGUgImZjc19mY3hwLmgiCisjaW5jbHVkZSAiZmNzX2F1dGguaCIKKyNpbmNsdWRlICJmY3MuaCIKKyNpbmNsdWRlICJmY2J1aWxkLmgiCisjaW5jbHVkZSA8bG9nL2JmYV9sb2dfZmNzLmg+CisjaW5jbHVkZSA8YWVuL2JmYV9hZW5fcG9ydC5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKworQkZBX1RSQ19GSUxFKEZDUywgRkFCUklDKTsKKworI2RlZmluZSBCRkFfRkNTX0ZBQlJJQ19SRVRSWV9ERUxBWQkoMjAwMCkJLyogTWlsbGlzZWNvbmRzICovCisjZGVmaW5lIEJGQV9GQ1NfRkFCUklDX0NMRUFOVVBfREVMQVkJKDEwMDAwKQkvKiBNaWxsaXNlY29uZHMgKi8KKworI2RlZmluZSBiZmFfZmNzX2ZhYnJpY19zZXRfb3BlcnR5cGUoX19mYWJyaWMpIGRvIHsgICAgICAgICAgXAorICAgIGlmIChiZmFfcHBvcnRfZ2V0X3RvcG9sb2d5KChfX2ZhYnJpYyktPmZjcy0+YmZhKSAgICBcCisJCQkJPT0gQkZBX1BQT1JUX1RPUE9MT0dZX1AyUCkgICBcCisJICAgIChfX2ZhYnJpYyktPm9wZXJfdHlwZSA9IEJGQV9QUE9SVF9UWVBFX05QT1JUOyAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIChfX2ZhYnJpYyktPm9wZXJfdHlwZSA9IEJGQV9QUE9SVF9UWVBFX05MUE9SVDsgICAgICBcCit9IHdoaWxlICgwKQorCisvKgorICogZm9yd2FyZCBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX2luaXQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19mYWJyaWNfbG9naW4oc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19mYWJyaWNfbm90aWZ5X29ubGluZShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19ub3RpZnlfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19kZWxheSh2b2lkICpjYmFyZyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19mYWJyaWNfZGVsZXRlKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX2RlbGV0ZV9jb21wKHZvaWQgKmNiYXJnKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19wcm9jZXNzX3VmKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkJCSAgc3RydWN0IGZjaHNfcyAqZmNocywgdTE2IGxlbik7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19mYWJyaWNfcHJvY2Vzc19mbG9naShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJCQkgICAgIHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUxNiBsZW4pOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX3NlbmRfZmxvZ2lfYWNjKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX2Zsb2dpYWNjX2NvbXAodm9pZCAqZmNzYXJnLAorCQkJCQkgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkgICAgIHZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzLAorCQkJCQkgICAgIHUzMiByc3BfbGVuLAorCQkJCQkgICAgIHUzMiByZXNpZF9sZW4sCisJCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnNwZmNocyk7CisvKioKKyAqICBmY3NfZmFicmljX3NtIGZhYnJpYyBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9ucworICovCisKKy8qKgorICogRmFicmljIHN0YXRlIG1hY2hpbmUgZXZlbnRzCisgKi8KK2VudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgeworCUJGQV9GQ1NfRkFCUklDX1NNX0NSRUFURSA9IDEsCS8qICBmYWJyaWMgY3JlYXRlIGZyb20gZHJpdmVyICovCisJQkZBX0ZDU19GQUJSSUNfU01fREVMRVRFID0gMiwJLyogIGZhYnJpYyBkZWxldGUgZnJvbSBkcml2ZXIgKi8KKwlCRkFfRkNTX0ZBQlJJQ19TTV9MSU5LX0RPV04gPSAzLAkvKiAgbGluayBkb3duIGZyb20gcG9ydCAqLworCUJGQV9GQ1NfRkFCUklDX1NNX0xJTktfVVAgPSA0LAkvKiAgbGluayB1cCBmcm9tIHBvcnQgKi8KKwlCRkFfRkNTX0ZBQlJJQ19TTV9DT05UX09QID0gNSwJLyogIGNvbnRpbnVlIG9wIGZyb20gZmxvZ2kvYXV0aCAqLworCUJGQV9GQ1NfRkFCUklDX1NNX1JFVFJZX09QID0gNiwJLyogIGNvbnRpbnVlIG9wIGZyb20gZmxvZ2kvYXV0aCAqLworCUJGQV9GQ1NfRkFCUklDX1NNX05PX0ZBQlJJQyA9IDcsCS8qICBubyBmYWJyaWMgZnJvbSBmbG9naS9hdXRoCisJCQkJCQkgKi8KKwlCRkFfRkNTX0ZBQlJJQ19TTV9QRVJGX0VWRlAgPSA4LAkvKiAgcGVyZm9ybSBFVkZQIGZyb20KKwkJCQkJCSAqZmxvZ2kvYXV0aCAqLworCUJGQV9GQ1NfRkFCUklDX1NNX0lTT0xBVEUgPSA5LAkvKiAgaXNvbGF0ZSBmcm9tIEVWRlAgcHJvY2Vzc2luZyAqLworCUJGQV9GQ1NfRkFCUklDX1NNX05PX1RBR0dJTkcgPSAxMCwvKiAgbm8gVkZUIHRhZ2dpbmcgZnJvbSBFVkZQICovCisJQkZBX0ZDU19GQUJSSUNfU01fREVMQVlFRCA9IDExLAkvKiAgdGltZW91dCBkZWxheSBldmVudCAqLworCUJGQV9GQ1NfRkFCUklDX1NNX0FVVEhfRkFJTEVEID0gMTIsCS8qICBhdXRoZW50aWNhdGlvbiBmYWlsZWQgKi8KKwlCRkFfRkNTX0ZBQlJJQ19TTV9BVVRIX1NVQ0NFU1MgPSAxMywJLyogIGF1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwKKwkJCQkJCSAqLworCUJGQV9GQ1NfRkFCUklDX1NNX0RFTENPTVAgPSAxNCwJLyogIGFsbCB2cG9ydHMgZGVsZXRlZCBldmVudCAqLworCUJGQV9GQ1NfRkFCUklDX1NNX0xPT1BCQUNLID0gMTUsCS8qICBSZWNlaXZlZCBvdXIgb3duIEZMT0dJICovCisJQkZBX0ZDU19GQUJSSUNfU01fU1RBUlQgPSAxNiwJLyogIGZhYnJpYyBkZWxldGUgZnJvbSBkcml2ZXIgKi8KK307CisKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19zbV91bmluaXQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCQkJIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX3NtX2NyZWF0ZWQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCQkJICBlbnVtIGJmYV9mY3NfZmFicmljX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19zbV9saW5rZG93bihzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJCQkgICBlbnVtIGJmYV9mY3NfZmFicmljX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19zbV9mbG9naShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJCQllbnVtIGJmYV9mY3NfZmFicmljX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19zbV9mbG9naV9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJCQkgICAgICBlbnVtIGJmYV9mY3NfZmFicmljX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19zbV9hdXRoKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkJICAgICAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX3NtX2F1dGhfZmFpbGVkKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkJCSAgICAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX3NtX2xvb3BiYWNrKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkJCSAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX3NtX25vZmFicmljKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkJCSAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJCQkgZW51bSBiZmFfZmNzX2ZhYnJpY19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19mYWJyaWNfc21fZXZmcChzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJCSAgICAgICBlbnVtIGJmYV9mY3NfZmFicmljX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2ZhYnJpY19zbV9ldmZwX2RvbmUoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCQkJICAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX3NtX2lzb2xhdGVkKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkJCSAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfZmFicmljX3NtX2RlbGV0aW5nKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkJCSAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOworLyoqCisgKiAgIEJlZ2lubmluZyBzdGF0ZSBiZWZvcmUgZmFicmljIGNyZWF0aW9uLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkgZW51bSBiZmFfZmNzX2ZhYnJpY19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMoZmFicmljLT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0NSRUFURToKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2NyZWF0ZWQpOworCQliZmFfZmNzX2ZhYnJpY19pbml0KGZhYnJpYyk7CisJCWJmYV9mY3NfbHBvcnRfaW5pdCgmZmFicmljLT5icG9ydCwgZmFicmljLT5mY3MsIEZDX1ZGX0lEX05VTEwsCisJCQkJICAgJmZhYnJpYy0+YnBvcnQucG9ydF9jZmcsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fTElOS19VUDoKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0xJTktfRE9XTjoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZmFicmljLT5mY3MsIGV2ZW50KTsKKwl9Cit9CisKKy8qKgorICogICBCZWdpbm5pbmcgc3RhdGUgYmVmb3JlIGZhYnJpYyBjcmVhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX3NtX2NyZWF0ZWQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCSAgZW51bSBiZmFfZmNzX2ZhYnJpY19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMoZmFicmljLT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX1NUQVJUOgorCQlpZiAoYmZhX3Bwb3J0X2lzX2xpbmt1cChmYWJyaWMtPmZjcy0+YmZhKSkgeworCQkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2Zsb2dpKTsKKwkJCWJmYV9mY3NfZmFicmljX2xvZ2luKGZhYnJpYyk7CisJCX0gZWxzZQorCQkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2xpbmtkb3duKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0xJTktfVVA6CisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9MSU5LX0RPV046CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV91bmluaXQpOworCQliZmFfZmNzX21vZGV4aXRfY29tcChmYWJyaWMtPmZjcyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGZhYnJpYy0+ZmNzLCBldmVudCk7CisJfQorfQorCisvKioKKyAqICAgTGluayBpcyBkb3duLCBhd2FpdGluZyBMSU5LIFVQIGV2ZW50IGZyb20gcG9ydC4gVGhpcyBpcyBhbHNvIHRoZQorICogICBmaXJzdCBzdGF0ZSBhdCBmYWJyaWMgY3JlYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX2ZhYnJpY19zbV9saW5rZG93bihzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJICAgZW51bSBiZmFfZmNzX2ZhYnJpY19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMoZmFicmljLT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0xJTktfVVA6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9mbG9naSk7CisJCWJmYV9mY3NfZmFicmljX2xvZ2luKGZhYnJpYyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9SRVRSWV9PUDoKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2RlbGV0aW5nKTsKKwkJYmZhX2Zjc19mYWJyaWNfZGVsZXRlKGZhYnJpYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGZhYnJpYy0+ZmNzLCBldmVudCk7CisJfQorfQorCisvKioKKyAqICAgRkxPR0kgaXMgaW4gcHJvZ3Jlc3MsIGF3YWl0aW5nIEZMT0dJIHJlcGx5LgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfc21fZmxvZ2koc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCWVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5icG9ydC5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9DT05UX09QOgorCisJCWJmYV9wcG9ydF9zZXRfdHhfYmJjcmVkaXQoZmFicmljLT5mY3MtPmJmYSwgZmFicmljLT5iYl9jcmVkaXQpOworCQlmYWJyaWMtPmZhYl90eXBlID0gQkZBX0ZDU19GQUJSSUNfU1dJVENIRUQ7CisKKwkJaWYgKGZhYnJpYy0+YXV0aF9yZXFkICYmIGZhYnJpYy0+aXNfYXV0aCkgeworCQkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2F1dGgpOworCQkJYmZhX3RyYyhmYWJyaWMtPmZjcywgZXZlbnQpOworCQl9IGVsc2UgeworCQkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX29ubGluZSk7CisJCQliZmFfZmNzX2ZhYnJpY19ub3RpZnlfb25saW5lKGZhYnJpYyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX1JFVFJZX09QOgorCQliZmFfc21fc2V0X3N0YXRlKGZhYnJpYywgYmZhX2Zjc19mYWJyaWNfc21fZmxvZ2lfcmV0cnkpOworCQliZmFfdGltZXJfc3RhcnQoZmFicmljLT5mY3MtPmJmYSwgJmZhYnJpYy0+ZGVsYXlfdGltZXIsCisJCQkJYmZhX2Zjc19mYWJyaWNfZGVsYXksIGZhYnJpYywKKwkJCQlCRkFfRkNTX0ZBQlJJQ19SRVRSWV9ERUxBWSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9MT09QQkFDSzoKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2xvb3BiYWNrKTsKKwkJYmZhX2xwc19kaXNjYXJkKGZhYnJpYy0+bHBzKTsKKwkJYmZhX2Zjc19mYWJyaWNfc2V0X29wZXJ0eXBlKGZhYnJpYyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9OT19GQUJSSUM6CisJCWZhYnJpYy0+ZmFiX3R5cGUgPSBCRkFfRkNTX0ZBQlJJQ19OMk47CisJCWJmYV9wcG9ydF9zZXRfdHhfYmJjcmVkaXQoZmFicmljLT5mY3MtPmJmYSwgZmFicmljLT5iYl9jcmVkaXQpOworCQliZmFfZmNzX2ZhYnJpY19ub3RpZnlfb25saW5lKGZhYnJpYyk7CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9ub2ZhYnJpYyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9MSU5LX0RPV046CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9saW5rZG93bik7CisJCWJmYV9scHNfZGlzY2FyZChmYWJyaWMtPmxwcyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9kZWxldGluZyk7CisJCWJmYV9scHNfZGlzY2FyZChmYWJyaWMtPmxwcyk7CisJCWJmYV9mY3NfZmFicmljX2RlbGV0ZShmYWJyaWMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChmYWJyaWMtPmZjcywgZXZlbnQpOworCX0KK30KKworCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfc21fZmxvZ2lfcmV0cnkoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCSAgICAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5icG9ydC5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxBWUVEOgorCQliZmFfc21fc2V0X3N0YXRlKGZhYnJpYywgYmZhX2Zjc19mYWJyaWNfc21fZmxvZ2kpOworCQliZmFfZmNzX2ZhYnJpY19sb2dpbihmYWJyaWMpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fTElOS19ET1dOOgorCQliZmFfc21fc2V0X3N0YXRlKGZhYnJpYywgYmZhX2Zjc19mYWJyaWNfc21fbGlua2Rvd24pOworCQliZmFfdGltZXJfc3RvcCgmZmFicmljLT5kZWxheV90aW1lcik7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9kZWxldGluZyk7CisJCWJmYV90aW1lcl9zdG9wKCZmYWJyaWMtPmRlbGF5X3RpbWVyKTsKKwkJYmZhX2Zjc19mYWJyaWNfZGVsZXRlKGZhYnJpYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGZhYnJpYy0+ZmNzLCBldmVudCk7CisJfQorfQorCisvKioKKyAqICAgQXV0aGVudGljYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIGF3YWl0aW5nIGF1dGhlbnRpY2F0aW9uIHJlc3VsdHMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX2ZhYnJpY19zbV9hdXRoKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCSAgICAgICBlbnVtIGJmYV9mY3NfZmFicmljX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZmFicmljLT5mY3MsIGZhYnJpYy0+YnBvcnQucG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fQVVUSF9GQUlMRUQ6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9hdXRoX2ZhaWxlZCk7CisJCWJmYV9scHNfZGlzY2FyZChmYWJyaWMtPmxwcyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9BVVRIX1NVQ0NFU1M6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9vbmxpbmUpOworCQliZmFfZmNzX2ZhYnJpY19ub3RpZnlfb25saW5lKGZhYnJpYyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9QRVJGX0VWRlA6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9ldmZwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0xJTktfRE9XTjoKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2xpbmtkb3duKTsKKwkJYmZhX2xwc19kaXNjYXJkKGZhYnJpYy0+bHBzKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2RlbGV0aW5nKTsKKwkJYmZhX2Zjc19mYWJyaWNfZGVsZXRlKGZhYnJpYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGZhYnJpYy0+ZmNzLCBldmVudCk7CisJfQorfQorCisvKioKKyAqICAgQXV0aGVudGljYXRpb24gZmFpbGVkCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX2ZhYnJpY19zbV9hdXRoX2ZhaWxlZChzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJICAgICAgZW51bSBiZmFfZmNzX2ZhYnJpY19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMoZmFicmljLT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0xJTktfRE9XTjoKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2xpbmtkb3duKTsKKwkJYmZhX2Zjc19mYWJyaWNfbm90aWZ5X29mZmxpbmUoZmFicmljKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2RlbGV0aW5nKTsKKwkJYmZhX2Zjc19mYWJyaWNfZGVsZXRlKGZhYnJpYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGZhYnJpYy0+ZmNzLCBldmVudCk7CisJfQorfQorCisvKioKKyAqICAgUG9ydCBpcyBpbiBsb29wYmFjayBtb2RlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfc21fbG9vcGJhY2soc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCSAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5icG9ydC5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9MSU5LX0RPV046CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9saW5rZG93bik7CisJCWJmYV9mY3NfZmFicmljX25vdGlmeV9vZmZsaW5lKGZhYnJpYyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9kZWxldGluZyk7CisJCWJmYV9mY3NfZmFicmljX2RlbGV0ZShmYWJyaWMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChmYWJyaWMtPmZjcywgZXZlbnQpOworCX0KK30KKworLyoqCisgKiAgIFRoZXJlIGlzIG5vIGF0dGFjaGVkIGZhYnJpYyAtIHByaXZhdGUgbG9vcCBvciBOUG9ydC10by1OUG9ydCB0b3BvbG9neS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX3NtX25vZmFicmljKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkgICBlbnVtIGJmYV9mY3NfZmFicmljX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZmFicmljLT5mY3MsIGZhYnJpYy0+YnBvcnQucG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fTElOS19ET1dOOgorCQliZmFfc21fc2V0X3N0YXRlKGZhYnJpYywgYmZhX2Zjc19mYWJyaWNfc21fbGlua2Rvd24pOworCQliZmFfbHBzX2Rpc2NhcmQoZmFicmljLT5scHMpOworCQliZmFfZmNzX2ZhYnJpY19ub3RpZnlfb2ZmbGluZShmYWJyaWMpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGZhYnJpYywgYmZhX2Zjc19mYWJyaWNfc21fZGVsZXRpbmcpOworCQliZmFfZmNzX2ZhYnJpY19kZWxldGUoZmFicmljKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX05PX0ZBQlJJQzoKKwkJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5iYl9jcmVkaXQpOworCQliZmFfcHBvcnRfc2V0X3R4X2JiY3JlZGl0KGZhYnJpYy0+ZmNzLT5iZmEsIGZhYnJpYy0+YmJfY3JlZGl0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZmFicmljLT5mY3MsIGV2ZW50KTsKKwl9Cit9CisKKy8qKgorICogICBGYWJyaWMgaXMgb25saW5lIC0gbm9ybWFsIG9wZXJhdGluZyBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5icG9ydC5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9MSU5LX0RPV046CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9saW5rZG93bik7CisJCWJmYV9scHNfZGlzY2FyZChmYWJyaWMtPmxwcyk7CisJCWJmYV9mY3NfZmFicmljX25vdGlmeV9vZmZsaW5lKGZhYnJpYyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9kZWxldGluZyk7CisJCWJmYV9mY3NfZmFicmljX2RlbGV0ZShmYWJyaWMpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fQVVUSF9GQUlMRUQ6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9hdXRoX2ZhaWxlZCk7CisJCWJmYV9scHNfZGlzY2FyZChmYWJyaWMtPmxwcyk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9BVVRIX1NVQ0NFU1M6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGZhYnJpYy0+ZmNzLCBldmVudCk7CisJfQorfQorCisvKioKKyAqICAgRXhjaGFuZ2luZyB2aXJ0dWFsIGZhYnJpYyBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfc21fZXZmcChzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkgICAgICAgZW51bSBiZmFfZmNzX2ZhYnJpY19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMoZmFicmljLT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0NPTlRfT1A6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV9ldmZwX2RvbmUpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fSVNPTEFURToKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2lzb2xhdGVkKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZmFicmljLT5mY3MsIGV2ZW50KTsKKwl9Cit9CisKKy8qKgorICogICBFVkZQIGV4Y2hhbmdlIGNvbXBsZXRlIGFuZCBWRlQgdGFnZ2luZyBpcyBlbmFibGVkLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfc21fZXZmcF9kb25lKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkgICAgZW51bSBiZmFfZmNzX2ZhYnJpY19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMoZmFicmljLT5mY3MsIGV2ZW50KTsKK30KKworLyoqCisgKiAgIFBvcnQgaXMgaXNvbGF0ZWQgYWZ0ZXIgRVZGUCBleGNoYW5nZSBkdWUgdG8gVkZfSUQgbWlzbWF0Y2ggKE4gYW5kIEYpLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfc21faXNvbGF0ZWQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCSAgIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5icG9ydC5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBldmVudCk7CisKKwliZmFfbG9nKGZhYnJpYy0+ZmNzLT5sb2dtLCBCRkFfTE9HX0ZDU19GQUJSSUNfSVNPTEFURUQsCisJCWZhYnJpYy0+YnBvcnQucG9ydF9jZmcucHd3biwgZmFicmljLT5mY3MtPnBvcnRfdmZpZCwKKwkJZmFicmljLT5ldmVudF9hcmcuc3dwX3ZmaWQpOworfQorCisvKioKKyAqICAgRmFicmljIGlzIGJlaW5nIGRlbGV0ZWQsIGF3YWl0aW5nIHZwb3J0IGRlbGV0ZSBjb21wbGV0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX3NtX2RlbGV0aW5nKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkgICBlbnVtIGJmYV9mY3NfZmFicmljX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZmFicmljLT5mY3MsIGZhYnJpYy0+YnBvcnQucG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fREVMQ09NUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX3VuaW5pdCk7CisJCWJmYV9mY3NfbW9kZXhpdF9jb21wKGZhYnJpYy0+ZmNzKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX0xJTktfVVA6CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9MSU5LX0RPV046CisJCWJmYV9mY3NfZmFicmljX25vdGlmeV9vZmZsaW5lKGZhYnJpYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGZhYnJpYy0+ZmNzLCBldmVudCk7CisJfQorfQorCisKKworLyoqCisgKiAgZmNzX2ZhYnJpY19wcml2YXRlIGZhYnJpYyBwcml2YXRlIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX2ZhYnJpY19pbml0KHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpCit7CisJc3RydWN0IGJmYV9wb3J0X2NmZ19zICpwb3J0X2NmZyA9ICZmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnOworCisJcG9ydF9jZmctPnJvbGVzID0gQkZBX1BPUlRfUk9MRV9GQ1BfSU07CisJcG9ydF9jZmctPm53d24gPSBiZmFfaW9jX2dldF9ud3duKCZmYWJyaWMtPmZjcy0+YmZhLT5pb2MpOworCXBvcnRfY2ZnLT5wd3duID0gYmZhX2lvY19nZXRfcHd3bigmZmFicmljLT5mY3MtPmJmYS0+aW9jKTsKK30KKworLyoqCisgKiBQb3J0IFN5bWJvbGljIE5hbWUgQ3JlYXRpb24gZm9yIGJhc2UgcG9ydC4KKyAqLwordm9pZAorYmZhX2Zjc19mYWJyaWNfcHN5bWJfaW5pdChzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKQoreworCXN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcG9ydF9jZmcgPSAmZmFicmljLT5icG9ydC5wb3J0X2NmZzsKKwlzdHJ1Y3QgYmZhX2FkYXB0ZXJfYXR0cl9zIGFkYXB0ZXJfYXR0cjsKKwlzdHJ1Y3QgYmZhX2Zjc19kcml2ZXJfaW5mb19zICpkcml2ZXJfaW5mbyA9ICZmYWJyaWMtPmZjcy0+ZHJpdmVyX2luZm87CisKKwliZmFfb3NfbWVtc2V0KCh2b2lkICopJmFkYXB0ZXJfYXR0ciwgMCwKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBiZmFfYWRhcHRlcl9hdHRyX3MpKTsKKwliZmFfaW9jX2dldF9hZGFwdGVyX2F0dHIoJmZhYnJpYy0+ZmNzLT5iZmEtPmlvYywgJmFkYXB0ZXJfYXR0cik7CisKKwkvKgorCSAqIE1vZGVsIG5hbWUvbnVtYmVyCisJICovCisJc3RybmNweSgoY2hhciAqKSZwb3J0X2NmZy0+c3ltX25hbWUsIGFkYXB0ZXJfYXR0ci5tb2RlbCwKKwkJQkZBX0ZDU19QT1JUX1NZTUJOQU1FX01PREVMX1NaKTsKKwlzdHJuY2F0KChjaGFyICopJnBvcnRfY2ZnLT5zeW1fbmFtZSwgQkZBX0ZDU19QT1JUX1NZTUJOQU1FX1NFUEFSQVRPUiwKKwkJc2l6ZW9mKEJGQV9GQ1NfUE9SVF9TWU1CTkFNRV9TRVBBUkFUT1IpKTsKKworCS8qCisJICogRHJpdmVyIFZlcnNpb24KKwkgKi8KKwlzdHJuY2F0KChjaGFyICopJnBvcnRfY2ZnLT5zeW1fbmFtZSwgKGNoYXIgKilkcml2ZXJfaW5mby0+dmVyc2lvbiwKKwkJQkZBX0ZDU19QT1JUX1NZTUJOQU1FX1ZFUlNJT05fU1opOworCXN0cm5jYXQoKGNoYXIgKikmcG9ydF9jZmctPnN5bV9uYW1lLCBCRkFfRkNTX1BPUlRfU1lNQk5BTUVfU0VQQVJBVE9SLAorCQlzaXplb2YoQkZBX0ZDU19QT1JUX1NZTUJOQU1FX1NFUEFSQVRPUikpOworCisJLyoKKwkgKiBIb3N0IG1hY2hpbmUgbmFtZQorCSAqLworCXN0cm5jYXQoKGNoYXIgKikmcG9ydF9jZmctPnN5bV9uYW1lLAorCQkoY2hhciAqKWRyaXZlcl9pbmZvLT5ob3N0X21hY2hpbmVfbmFtZSwKKwkJQkZBX0ZDU19QT1JUX1NZTUJOQU1FX01BQ0hJTkVOQU1FX1NaKTsKKwlzdHJuY2F0KChjaGFyICopJnBvcnRfY2ZnLT5zeW1fbmFtZSwgQkZBX0ZDU19QT1JUX1NZTUJOQU1FX1NFUEFSQVRPUiwKKwkJc2l6ZW9mKEJGQV9GQ1NfUE9SVF9TWU1CTkFNRV9TRVBBUkFUT1IpKTsKKworCS8qCisJICogSG9zdCBPUyBJbmZvIDoKKwkgKiBJZiBPUyBQYXRjaCBJbmZvIGlzIG5vdCB0aGVyZSwgZG8gbm90IHRydW5jYXRlIGFueSBieXRlcyBmcm9tIHRoZQorCSAqIE9TIG5hbWUgc3RyaW5nIGFuZCBpbnN0ZWFkIGNvcHkgdGhlIGVudGlyZSBPUyBpbmZvIHN0cmluZyAoNjQgYnl0ZXMpLgorCSAqLworCWlmIChkcml2ZXJfaW5mby0+aG9zdF9vc19wYXRjaFswXSA9PSAnXDAnKSB7CisJCXN0cm5jYXQoKGNoYXIgKikmcG9ydF9jZmctPnN5bV9uYW1lLAorCQkJKGNoYXIgKilkcml2ZXJfaW5mby0+aG9zdF9vc19uYW1lLCBCRkFfRkNTX09TX1NUUl9MRU4pOworCQlzdHJuY2F0KChjaGFyICopJnBvcnRfY2ZnLT5zeW1fbmFtZSwKKwkJCUJGQV9GQ1NfUE9SVF9TWU1CTkFNRV9TRVBBUkFUT1IsCisJCQlzaXplb2YoQkZBX0ZDU19QT1JUX1NZTUJOQU1FX1NFUEFSQVRPUikpOworCX0gZWxzZSB7CisJCXN0cm5jYXQoKGNoYXIgKikmcG9ydF9jZmctPnN5bV9uYW1lLAorCQkJKGNoYXIgKilkcml2ZXJfaW5mby0+aG9zdF9vc19uYW1lLAorCQkJQkZBX0ZDU19QT1JUX1NZTUJOQU1FX09TSU5GT19TWik7CisJCXN0cm5jYXQoKGNoYXIgKikmcG9ydF9jZmctPnN5bV9uYW1lLAorCQkJQkZBX0ZDU19QT1JUX1NZTUJOQU1FX1NFUEFSQVRPUiwKKwkJCXNpemVvZihCRkFfRkNTX1BPUlRfU1lNQk5BTUVfU0VQQVJBVE9SKSk7CisKKwkJLyoKKwkJICogQXBwZW5kIGhvc3QgT1MgUGF0Y2ggSW5mbworCQkgKi8KKwkJc3RybmNhdCgoY2hhciAqKSZwb3J0X2NmZy0+c3ltX25hbWUsCisJCQkoY2hhciAqKWRyaXZlcl9pbmZvLT5ob3N0X29zX3BhdGNoLAorCQkJQkZBX0ZDU19QT1JUX1NZTUJOQU1FX09TUEFUQ0hfU1opOworCX0KKworCS8qCisJICogbnVsbCB0ZXJtaW5hdGUKKwkgKi8KKwlwb3J0X2NmZy0+c3ltX25hbWUuc3ltbmFtZVtCRkFfU1lNTkFNRV9NQVhMRU4gLSAxXSA9IDA7Cit9CisKKy8qKgorICogYmZhIGxwcyBsb2dpbiBjb21wbGV0aW9uIGNhbGxiYWNrCisgKi8KK3ZvaWQKK2JmYV9jYl9scHNfZmxvZ2lfY29tcCh2b2lkICpiZmFkLCB2b2lkICp1YXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKQoreworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMgPSB1YXJnOworCisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5icG9ydC5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBzdGF0dXMpOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEJGQV9TVEFUVVNfT0s6CisJCWZhYnJpYy0+c3RhdHMuZmxvZ2lfYWNjZXB0cysrOworCQlicmVhazsKKworCWNhc2UgQkZBX1NUQVRVU19JTlZBTElEX01BQzoKKwkJLyoKKwkJICogT25seSBmb3IgQ05BCisJCSAqLworCQlmYWJyaWMtPnN0YXRzLmZsb2dpX2FjY19lcnIrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9SRVRSWV9PUCk7CisKKwkJcmV0dXJuOworCisJY2FzZSBCRkFfU1RBVFVTX0VQUk9UT0NPTDoKKwkJc3dpdGNoIChiZmFfbHBzX2dldF9leHRzdGF0dXMoZmFicmljLT5scHMpKSB7CisJCWNhc2UgQkZBX0VQUk9UT19CQURfQUNDRVBUOgorCQkJZmFicmljLT5zdGF0cy5mbG9naV9hY2NfZXJyKys7CisJCQlicmVhazsKKworCQljYXNlIEJGQV9FUFJPVE9fVU5LTk9XTl9SU1A6CisJCQlmYWJyaWMtPnN0YXRzLmZsb2dpX3Vua25vd25fcnNwKys7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9SRVRSWV9PUCk7CisKKwkJcmV0dXJuOworCisJY2FzZSBCRkFfU1RBVFVTX0ZBQlJJQ19SSlQ6CisJCWZhYnJpYy0+c3RhdHMuZmxvZ2lfcmVqZWN0cysrOworCQliZmFfc21fc2VuZF9ldmVudChmYWJyaWMsIEJGQV9GQ1NfRkFCUklDX1NNX1JFVFJZX09QKTsKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJZmFicmljLT5zdGF0cy5mbG9naV9yc3BfZXJyKys7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGZhYnJpYywgQkZBX0ZDU19GQUJSSUNfU01fUkVUUllfT1ApOworCQlyZXR1cm47CisJfQorCisJZmFicmljLT5iYl9jcmVkaXQgPSBiZmFfbHBzX2dldF9wZWVyX2JiY3JlZGl0KGZhYnJpYy0+bHBzKTsKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJiX2NyZWRpdCk7CisKKwlpZiAoIWJmYV9scHNfaXNfYnJjZF9mYWJyaWMoZmFicmljLT5scHMpKQorCQlmYWJyaWMtPmZhYnJpY19uYW1lID0gYmZhX2xwc19nZXRfcGVlcl9ud3duKGZhYnJpYy0+bHBzKTsKKworCS8qCisJICogQ2hlY2sgcG9ydCB0eXBlLiBJdCBzaG91bGQgYmUgMSA9IEYtcG9ydC4KKwkgKi8KKwlpZiAoYmZhX2xwc19pc19mcG9ydChmYWJyaWMtPmxwcykpIHsKKwkJZmFicmljLT5icG9ydC5waWQgPSBiZmFfbHBzX2dldF9waWQoZmFicmljLT5scHMpOworCQlmYWJyaWMtPmlzX25waXYgPSBiZmFfbHBzX2lzX25waXZfZW4oZmFicmljLT5scHMpOworCQlmYWJyaWMtPmlzX2F1dGggPSBiZmFfbHBzX2lzX2F1dGhyZXEoZmFicmljLT5scHMpOworCQliZmFfc21fc2VuZF9ldmVudChmYWJyaWMsIEJGQV9GQ1NfRkFCUklDX1NNX0NPTlRfT1ApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE5wb3J0LTItTnBvcnQgZGlyZWN0IGF0dGFjaGVkCisJCSAqLworCQlmYWJyaWMtPmJwb3J0LnBvcnRfdG9wby5wbjJuLnJlbV9wb3J0X3d3biA9CisJCQliZmFfbHBzX2dldF9wZWVyX3B3d24oZmFicmljLT5scHMpOworCQliZmFfc21fc2VuZF9ldmVudChmYWJyaWMsIEJGQV9GQ1NfRkFCUklDX1NNX05PX0ZBQlJJQyk7CisJfQorCisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5icG9ydC5waWQpOworCWJmYV90cmMoZmFicmljLT5mY3MsIGZhYnJpYy0+aXNfbnBpdik7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5pc19hdXRoKTsKK30KKworLyoqCisgKiAJCUFsbG9jYXRlIGFuZCBzZW5kIEZMT0dJLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfbG9naW4oc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKK3sKKwlzdHJ1Y3QgYmZhX3MgICAqYmZhID0gZmFicmljLT5mY3MtPmJmYTsKKwlzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBjZmcgPSAmZmFicmljLT5icG9ydC5wb3J0X2NmZzsKKwl1OCAgICAgICAgIGFscGEgPSAwOworCisJaWYgKGJmYV9wcG9ydF9nZXRfdG9wb2xvZ3koYmZhKSA9PSBCRkFfUFBPUlRfVE9QT0xPR1lfTE9PUCkKKwkJYWxwYSA9IGJmYV9wcG9ydF9nZXRfbXlhbHBhKGJmYSk7CisKKwliZmFfbHBzX2Zsb2dpKGZhYnJpYy0+bHBzLCBmYWJyaWMsIGFscGEsIGJmYV9wcG9ydF9nZXRfbWF4ZnJzaXplKGJmYSksCisJCSAgICAgIHBjZmctPnB3d24sIHBjZmctPm53d24sIGZhYnJpYy0+YXV0aF9yZXFkKTsKKworCWZhYnJpYy0+c3RhdHMuZmxvZ2lfc2VudCsrOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfbm90aWZ5X29ubGluZShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKQoreworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT5mYWJyaWNfbmFtZSk7CisKKwliZmFfZmNzX2ZhYnJpY19zZXRfb3BlcnR5cGUoZmFicmljKTsKKwlmYWJyaWMtPnN0YXRzLmZhYnJpY19vbmxpbmVzKys7CisKKwkvKioKKwkgKiBub3RpZnkgb25saW5lIGV2ZW50IHRvIGJhc2UgYW5kIHRoZW4gdmlydHVhbCBwb3J0cworCSAqLworCWJmYV9mY3NfcG9ydF9vbmxpbmUoJmZhYnJpYy0+YnBvcnQpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZmYWJyaWMtPnZwb3J0X3EpIHsKKwkJdnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqKXFlOworCQliZmFfZmNzX3Zwb3J0X29ubGluZSh2cG9ydCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfbm90aWZ5X29mZmxpbmUoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKKworCWJmYV90cmMoZmFicmljLT5mY3MsIGZhYnJpYy0+ZmFicmljX25hbWUpOworCWZhYnJpYy0+c3RhdHMuZmFicmljX29mZmxpbmVzKys7CisKKwkvKioKKwkgKiBub3RpZnkgb2ZmbGluZSBldmVudCBmaXJzdCB0byB2cG9ydHMgYW5kIHRoZW4gYmFzZSBwb3J0LgorCSAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmZmFicmljLT52cG9ydF9xKSB7CisJCXZwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKilxZTsKKwkJYmZhX2Zjc192cG9ydF9vZmZsaW5lKHZwb3J0KTsKKwl9CisKKwliZmFfZmNzX3BvcnRfb2ZmbGluZSgmZmFicmljLT5icG9ydCk7CisKKwlmYWJyaWMtPmZhYnJpY19uYW1lID0gMDsKKwlmYWJyaWMtPmZhYnJpY19pcF9hZGRyWzBdID0gMDsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX2RlbGF5KHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMgPSBjYmFyZzsKKworCWJmYV9zbV9zZW5kX2V2ZW50KGZhYnJpYywgQkZBX0ZDU19GQUJSSUNfU01fREVMQVlFRCk7Cit9CisKKy8qKgorICogRGVsZXRlIGFsbCB2cG9ydHMgYW5kIHdhaXQgZm9yIHZwb3J0IGRlbGV0ZSBjb21wbGV0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX2RlbGV0ZShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKQoreworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZmYWJyaWMtPnZwb3J0X3EpIHsKKwkJdnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqKXFlOworCQliZmFfZmNzX3Zwb3J0X2RlbGV0ZSh2cG9ydCk7CisJfQorCisJYmZhX2Zjc19wb3J0X2RlbGV0ZSgmZmFicmljLT5icG9ydCk7CisJYmZhX3djX3dhaXQoJmZhYnJpYy0+d2MpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfZGVsZXRlX2NvbXAodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyA9IGNiYXJnOworCisJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxDT01QKTsKK30KKworCisKKy8qKgorICogIGZjc19mYWJyaWNfcHVibGljIGZhYnJpYyBwdWJsaWMgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiAgIE1vZHVsZSBpbml0aWFsaXphdGlvbgorICovCit2b2lkCitiZmFfZmNzX2ZhYnJpY19tb2Rpbml0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljOworCisJZmFicmljID0gJmZjcy0+ZmFicmljOworCWJmYV9vc19tZW1zZXQoZmFicmljLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9mY3NfZmFicmljX3MpKTsKKworCS8qKgorCSAqIEluaXRpYWxpemUgYmFzZSBmYWJyaWMuCisJICovCisJZmFicmljLT5mY3MgPSBmY3M7CisJSU5JVF9MSVNUX0hFQUQoJmZhYnJpYy0+dnBvcnRfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmZhYnJpYy0+dmZfcSk7CisJZmFicmljLT5scHMgPSBiZmFfbHBzX2FsbG9jKGZjcy0+YmZhKTsKKwliZmFfYXNzZXJ0KGZhYnJpYy0+bHBzKTsKKworCS8qKgorCSAqIEluaXRpYWxpemUgZmFicmljIGRlbGV0ZSBjb21wbGV0aW9uIGhhbmRsZXIuIEZhYnJpYyBkZWxldGlvbiBpcyBjb21wbGV0ZQorCSAqIHdoZW4gdGhlIGxhc3QgdnBvcnQgZGVsZXRlIGlzIGNvbXBsZXRlLgorCSAqLworCWJmYV93Y19pbml0KCZmYWJyaWMtPndjLCBiZmFfZmNzX2ZhYnJpY19kZWxldGVfY29tcCwgZmFicmljKTsKKwliZmFfd2NfdXAoJmZhYnJpYy0+d2MpOwkvKiBGb3IgdGhlIGJhc2UgcG9ydCAqLworCisJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX3VuaW5pdCk7CisJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9DUkVBVEUpOworCWJmYV90cmMoZmNzLCAwKTsKK30KKworLyoqCisgKiAgIE1vZHVsZSBjbGVhbnVwCisgKi8KK3ZvaWQKK2JmYV9mY3NfZmFicmljX21vZGV4aXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWM7CisKKwliZmFfdHJjKGZjcywgMCk7CisKKwkvKioKKwkgKiBDbGVhbnVwIGJhc2UgZmFicmljLgorCSAqLworCWZhYnJpYyA9ICZmY3MtPmZhYnJpYzsKKwliZmFfbHBzX2RlbGV0ZShmYWJyaWMtPmxwcyk7CisJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxFVEUpOworfQorCisvKioKKyAqIEZhYnJpYyBtb2R1bGUgc3RhcnQgLS0ga2ljayBzdGFydHMgRkNTIGFjdGlvbnMKKyAqLwordm9pZAorYmZhX2Zjc19mYWJyaWNfbW9kc3RhcnQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWM7CisKKwliZmFfdHJjKGZjcywgMCk7CisJZmFicmljID0gJmZjcy0+ZmFicmljOworCWJmYV9zbV9zZW5kX2V2ZW50KGZhYnJpYywgQkZBX0ZDU19GQUJSSUNfU01fU1RBUlQpOworfQorCisvKioKKyAqICAgU3VzcGVuZCBmYWJyaWMgYWN0aXZpdHkgYXMgcGFydCBvZiBkcml2ZXIgc3VzcGVuZC4KKyAqLwordm9pZAorYmZhX2Zjc19mYWJyaWNfbW9kc3VzcChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7Cit9CisKK2JmYV9ib29sZWFuX3QKK2JmYV9mY3NfZmFicmljX2lzX2xvb3BiYWNrKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpCit7CisJcmV0dXJuIChiZmFfc21fY21wX3N0YXRlKGZhYnJpYywgYmZhX2Zjc19mYWJyaWNfc21fbG9vcGJhY2spKTsKK30KKworZW51bSBiZmFfcHBvcnRfdHlwZQorYmZhX2Zjc19mYWJyaWNfcG9ydF90eXBlKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpCit7CisJcmV0dXJuIGZhYnJpYy0+b3Blcl90eXBlOworfQorCisvKioKKyAqICAgTGluayB1cCBub3RpZmljYXRpb24gZnJvbSBCRkEgcGh5c2ljYWwgcG9ydCBtb2R1bGUuCisgKi8KK3ZvaWQKK2JmYV9mY3NfZmFicmljX2xpbmtfdXAoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKK3sKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnLnB3d24pOworCWJmYV9zbV9zZW5kX2V2ZW50KGZhYnJpYywgQkZBX0ZDU19GQUJSSUNfU01fTElOS19VUCk7Cit9CisKKy8qKgorICogICBMaW5rIGRvd24gbm90aWZpY2F0aW9uIGZyb20gQkZBIHBoeXNpY2FsIHBvcnQgbW9kdWxlLgorICovCit2b2lkCitiZmFfZmNzX2ZhYnJpY19saW5rX2Rvd24oc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKK3sKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmYWJyaWMtPmJwb3J0LnBvcnRfY2ZnLnB3d24pOworCWJmYV9zbV9zZW5kX2V2ZW50KGZhYnJpYywgQkZBX0ZDU19GQUJSSUNfU01fTElOS19ET1dOKTsKK30KKworLyoqCisgKiAgIEEgY2hpbGQgdnBvcnQgaXMgYmVpbmcgY3JlYXRlZCBpbiB0aGUgZmFicmljLgorICoKKyAqICAgQ2FsbCBmcm9tIHZwb3J0IG1vZHVsZSBhdCB2cG9ydCBjcmVhdGlvbi4gQSBsaXN0IG9mIGJhc2UgcG9ydCBhbmQgdnBvcnRzCisgKiAgIGJlbG9uZ2luZyB0byBhIGZhYnJpYyBpcyBtYWludGFpbmVkIHRvIHByb3BhZ2F0ZSBsaW5rIGV2ZW50cy4KKyAqCisgKiAgIHBhcmFtW2luXSBmYWJyaWMgLSBGYWJyaWMgaW5zdGFuY2UuIFRoaXMgY2FuIGJlIGEgYmFzZSBmYWJyaWMgb3IgdmYuCisgKiAgIHBhcmFtW2luXSB2cG9ydCAgLSBWcG9ydCBiZWluZyBjcmVhdGVkLgorICoKKyAqICAgQHJldHVybiBOb25lIChhbHdheXMgc3VjY2VlZHMpCisgKi8KK3ZvaWQKK2JmYV9mY3NfZmFicmljX2FkZHZwb3J0KHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQlzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCkKK3sKKwkvKioKKwkgKiAtIGFkZCB2cG9ydCB0byBmYWJyaWMncyB2cG9ydF9xCisJICovCisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZmFicmljLT52Zl9pZCk7CisKKwlsaXN0X2FkZF90YWlsKCZ2cG9ydC0+cWUsICZmYWJyaWMtPnZwb3J0X3EpOworCWZhYnJpYy0+bnVtX3Zwb3J0cysrOworCWJmYV93Y191cCgmZmFicmljLT53Yyk7Cit9CisKKy8qKgorICogICBBIGNoaWxkIHZwb3J0IGlzIGJlaW5nIGRlbGV0ZWQgZnJvbSBmYWJyaWMuCisgKgorICogICBWcG9ydCBpcyBiZWluZyBkZWxldGVkLgorICovCit2b2lkCitiZmFfZmNzX2ZhYnJpY19kZWx2cG9ydChzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpCit7CisJbGlzdF9kZWwoJnZwb3J0LT5xZSk7CisJZmFicmljLT5udW1fdnBvcnRzLS07CisJYmZhX3djX2Rvd24oJmZhYnJpYy0+d2MpOworfQorCisvKioKKyAqICAgQmFzZSBwb3J0IGlzIGRlbGV0ZWQuCisgKi8KK3ZvaWQKK2JmYV9mY3NfZmFicmljX3BvcnRfZGVsZXRlX2NvbXAoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKK3sKKwliZmFfd2NfZG93bigmZmFicmljLT53Yyk7Cit9CisKKy8qKgorICogICAgQ2hlY2sgaWYgZmFicmljIGlzIG9ubGluZS4KKyAqCisgKiAgIHBhcmFtW2luXSBmYWJyaWMgLSBGYWJyaWMgaW5zdGFuY2UuIFRoaXMgY2FuIGJlIGEgYmFzZSBmYWJyaWMgb3IgdmYuCisgKgorICogICBAcmV0dXJuICBUUlVFL0ZBTFNFCisgKi8KK2ludAorYmZhX2Zjc19mYWJyaWNfaXNfb25saW5lKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpCit7CisJcmV0dXJuIChiZmFfc21fY21wX3N0YXRlKGZhYnJpYywgYmZhX2Zjc19mYWJyaWNfc21fb25saW5lKSk7Cit9CisKKworYmZhX3N0YXR1c190CitiZmFfZmNzX2ZhYnJpY19hZGR2ZihzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqdmYsIHN0cnVjdCBiZmFfZmNzX3MgKmZjcywKKwkJICAgICBzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBvcnRfY2ZnLAorCQkgICAgIHN0cnVjdCBiZmFkX3ZmX3MgKnZmX2RydikKK3sKKwliZmFfc21fc2V0X3N0YXRlKHZmLCBiZmFfZmNzX2ZhYnJpY19zbV91bmluaXQpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqIExvb2t1cCBmb3IgYSB2cG9ydCB3aXRoaW5nIGEgZmFicmljIGdpdmVuIGl0cyBwd3duCisgKi8KK3N0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKgorYmZhX2Zjc19mYWJyaWNfdnBvcnRfbG9va3VwKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsIHd3bl90IHB3d24pCit7CisJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcWU7CisKKwlsaXN0X2Zvcl9lYWNoKHFlLCAmZmFicmljLT52cG9ydF9xKSB7CisJCXZwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKilxZTsKKwkJaWYgKGJmYV9mY3NfcG9ydF9nZXRfcHd3bigmdnBvcnQtPmxwb3J0KSA9PSBwd3duKQorCQkJcmV0dXJuIHZwb3J0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqICAgIEluIGEgZ2l2ZW4gZmFicmljLCByZXR1cm4gdGhlIG51bWJlciBvZiBscG9ydHMuCisgKgorICogICBwYXJhbVtpbl0gZmFicmljIC0gRmFicmljIGluc3RhbmNlLiBUaGlzIGNhbiBiZSBhIGJhc2UgZmFicmljIG9yIHZmLgorICoKKyogICAgQHJldHVybiA6IDEgb3IgbW9yZS4KKyAqLwordTE2CitiZmFfZmNzX2ZhYnJpY192cG9ydF9jb3VudChzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKQoreworCXJldHVybiAoZmFicmljLT5udW1fdnBvcnRzKTsKK30KKworLyoqCisgKiAJCVVuc29saWNpdGVkIGZyYW1lIHJlY2VpdmUgaGFuZGxpbmcuCisgKi8KK3ZvaWQKK2JmYV9mY3NfZmFicmljX3VmX3JlY3Yoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywgc3RydWN0IGZjaHNfcyAqZmNocywKKwkJICAgICAgIHUxNiBsZW4pCit7CisJdTMyICAgICAgICBwaWQgPSBmY2hzLT5kX2lkOworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgKnFlOworCXN0cnVjdCBmY19lbHNfY21kX3MgICAqZWxzX2NtZCA9IChzdHJ1Y3QgZmNfZWxzX2NtZF9zICopIChmY2hzICsgMSk7CisJc3RydWN0IGZjX2xvZ2lfcyAgICAgKmZsb2dpID0gKHN0cnVjdCBmY19sb2dpX3MgKikgZWxzX2NtZDsKKworCWJmYV90cmMoZmFicmljLT5mY3MsIGxlbik7CisJYmZhX3RyYyhmYWJyaWMtPmZjcywgcGlkKTsKKworCS8qKgorCSAqIExvb2sgZm9yIG91ciBvd24gRkxPR0kgZnJhbWVzIGJlaW5nIGxvb3BlZCBiYWNrLiBUaGlzIG1lYW5zIGFuCisJICogZXh0ZXJuYWwgbG9vcGJhY2sgY2FibGUgaXMgaW4gcGxhY2UuIE91ciBvd24gRkxPR0kgZnJhbWVzIGFyZQorCSAqIHNvbWV0aW1lcyBsb29wZWQgYmFjayB3aGVuIHN3aXRjaCBwb3J0IGdldHMgdGVtcG9yYXJpbHkgYnlwYXNzZWQuCisJICovCisJaWYgKChwaWQgPT0gYmZhX29zX250b2gzYihGQ19GQUJSSUNfUE9SVCkpCisJICAgICYmIChlbHNfY21kLT5lbHNfY29kZSA9PSBGQ19FTFNfRkxPR0kpCisJICAgICYmIChmbG9naS0+cG9ydF9uYW1lID09IGJmYV9mY3NfcG9ydF9nZXRfcHd3bigmZmFicmljLT5icG9ydCkpKSB7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGZhYnJpYywgQkZBX0ZDU19GQUJSSUNfU01fTE9PUEJBQ0spOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogRkxPR0kvRVZGUCBleGNoYW5nZXMgc2hvdWxkIGJlIGNvbnN1bWVkIGJ5IGJhc2UgZmFicmljLgorCSAqLworCWlmIChmY2hzLT5kX2lkID09IGJmYV9vc19odG9uM2IoRkNfRkFCUklDX1BPUlQpKSB7CisJCWJmYV90cmMoZmFicmljLT5mY3MsIHBpZCk7CisJCWJmYV9mY3NfZmFicmljX3Byb2Nlc3NfdWYoZmFicmljLCBmY2hzLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJaWYgKGZhYnJpYy0+YnBvcnQucGlkID09IHBpZCkgeworCQkvKioKKwkJICogQWxsIGF1dGhlbnRpY2F0aW9uIGZyYW1lcyBzaG91bGQgYmUgcm91dGVkIHRvIGF1dGgKKwkJICovCisJCWJmYV90cmMoZmFicmljLT5mY3MsIGVsc19jbWQtPmVsc19jb2RlKTsKKwkJaWYgKGVsc19jbWQtPmVsc19jb2RlID09IEZDX0VMU19BVVRIKSB7CisJCQliZmFfdHJjKGZhYnJpYy0+ZmNzLCBlbHNfY21kLT5lbHNfY29kZSk7CisJCQlmYWJyaWMtPmF1dGgucmVzcG9uc2UgPSAodTggKikgZWxzX2NtZDsKKwkJCXJldHVybjsKKwkJfQorCisJCWJmYV90cmMoZmFicmljLT5mY3MsICoodTggKikgKCh1OCAqKSBmY2hzKSk7CisJCWJmYV9mY3NfcG9ydF91Zl9yZWN2KCZmYWJyaWMtPmJwb3J0LCBmY2hzLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogbG9vayBmb3IgYSBtYXRjaGluZyBsb2NhbCBwb3J0IElECisJICovCisJbGlzdF9mb3JfZWFjaChxZSwgJmZhYnJpYy0+dnBvcnRfcSkgeworCQl2cG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICopcWU7CisJCWlmICh2cG9ydC0+bHBvcnQucGlkID09IHBpZCkgeworCQkJYmZhX2Zjc19wb3J0X3VmX3JlY3YoJnZwb3J0LT5scG9ydCwgZmNocywgbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBlbHNfY21kLT5lbHNfY29kZSk7CisJYmZhX2Zjc19wb3J0X3VmX3JlY3YoJmZhYnJpYy0+YnBvcnQsIGZjaHMsIGxlbik7Cit9CisKKy8qKgorICogCQlVbnNvbGljaXRlZCBmcmFtZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IGZhYnJpYy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX3Byb2Nlc3NfdWYoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywgc3RydWN0IGZjaHNfcyAqZmNocywKKwkJCSAgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgKmVsc19jbWQgPSAoc3RydWN0IGZjX2Vsc19jbWRfcyAqKSAoZmNocyArIDEpOworCisJYmZhX3RyYyhmYWJyaWMtPmZjcywgZWxzX2NtZC0+ZWxzX2NvZGUpOworCisJc3dpdGNoIChlbHNfY21kLT5lbHNfY29kZSkgeworCWNhc2UgRkNfRUxTX0ZMT0dJOgorCQliZmFfZmNzX2ZhYnJpY19wcm9jZXNzX2Zsb2dpKGZhYnJpYywgZmNocywgbGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBuZWVkIHRvIGdlbmVyYXRlIGEgTFNfUkpUCisJCSAqLworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogCVByb2Nlc3MJaW5jb21pbmcgRkxPR0kKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX3Byb2Nlc3NfZmxvZ2koc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCXN0cnVjdCBmY2hzX3MgKmZjaHMsIHUxNiBsZW4pCit7CisJc3RydWN0IGZjX2xvZ2lfcyAgICAgKmZsb2dpID0gKHN0cnVjdCBmY19sb2dpX3MgKikgKGZjaHMgKyAxKTsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKmJwb3J0ID0gJmZhYnJpYy0+YnBvcnQ7CisKKwliZmFfdHJjKGZhYnJpYy0+ZmNzLCBmY2hzLT5zX2lkKTsKKworCWZhYnJpYy0+c3RhdHMuZmxvZ2lfcmN2ZCsrOworCS8qCisJICogQ2hlY2sgcG9ydCB0eXBlLiBJdCBzaG91bGQgYmUgMCA9IG4tcG9ydC4KKwkgKi8KKwlpZiAoZmxvZ2ktPmNzcC5wb3J0X3R5cGUpIHsKKwkJLyoKKwkJICogQHRvZG86IG1heSBuZWVkIHRvIHNlbmQgYSBMU19SSlQKKwkJICovCisJCWJmYV90cmMoZmFicmljLT5mY3MsIGZsb2dpLT5wb3J0X25hbWUpOworCQlmYWJyaWMtPnN0YXRzLmZsb2dpX3JlamVjdGVkKys7CisJCXJldHVybjsKKwl9CisKKwlmYWJyaWMtPmJiX2NyZWRpdCA9IGJmYV9vc19udG9ocyhmbG9naS0+Y3NwLmJiY3JlZCk7CisJYnBvcnQtPnBvcnRfdG9wby5wbjJuLnJlbV9wb3J0X3d3biA9IGZsb2dpLT5wb3J0X25hbWU7CisJYnBvcnQtPnBvcnRfdG9wby5wbjJuLnJlcGx5X294aWQgPSBmY2hzLT5veF9pZDsKKworCS8qCisJICogU2VuZCBhIEZsb2dpIEFjYworCSAqLworCWJmYV9mY3NfZmFicmljX3NlbmRfZmxvZ2lfYWNjKGZhYnJpYyk7CisJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9OT19GQUJSSUMpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfc2VuZF9mbG9naV9hY2Moc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKK3sKKwlzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBjZmcgPSAmZmFicmljLT5icG9ydC5wb3J0X2NmZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X24ybl9zICpuMm5fcG9ydCA9ICZmYWJyaWMtPmJwb3J0LnBvcnRfdG9wby5wbjJuOworCXN0cnVjdCBiZmFfcyAgICpiZmEgPSBmYWJyaWMtPmZjcy0+YmZhOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXUxNiAgICAgICAgcmVxbGVuOworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNoczsKKworCWZjeHAgPSBiZmFfZmNzX2ZjeHBfYWxsb2MoZmFicmljLT5mY3MpOworCS8qKgorCSAqIERvIG5vdCBleHBlY3QgdGhpcyBmYWlsdXJlIC0tIGV4cGVjdCByZW1vdGUgbm9kZSB0byByZXRyeQorCSAqLworCWlmICghZmN4cCkKKwkJcmV0dXJuOworCisJcmVxbGVuID0gZmNfZmxvZ2lfYWNjX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLAorCQkJCSAgICBiZmFfb3NfaHRvbjNiKEZDX0ZBQlJJQ19QT1JUKSwKKwkJCQkgICAgbjJuX3BvcnQtPnJlcGx5X294aWQsIHBjZmctPnB3d24sCisJCQkJICAgIHBjZmctPm53d24sIGJmYV9wcG9ydF9nZXRfbWF4ZnJzaXplKGJmYSksCisJCQkJICAgIGJmYV9wcG9ydF9nZXRfcnhfYmJjcmVkaXQoYmZhKSk7CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIGZhYnJpYy0+dmZfaWQsIGJmYV9scHNfZ2V0X3RhZyhmYWJyaWMtPmxwcyksCisJCQlCRkFfRkFMU0UsIEZDX0NMQVNTXzMsIHJlcWxlbiwgJmZjaHMsCisJCQliZmFfZmNzX2ZhYnJpY19mbG9naWFjY19jb21wLCBmYWJyaWMsCisJCQlGQ19NQVhfUERVU1osIDApOyAvKiBUaW1lb3V0IDAgaW5kaWNhdGVzIG5vCisJCQkJCSAgICogcmVzcG9uc2UgZXhwZWN0ZWQKKwkJCQkJICAgKi8KK30KKworLyoqCisgKiAgIEZsb2dpIEFjYyBjb21wbGV0aW9uIGNhbGxiYWNrLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfZmxvZ2lhY2NfY29tcCh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLCB2b2lkICpjYmFyZywKKwkJCSAgICAgYmZhX3N0YXR1c190IHN0YXR1cywgdTMyIHJzcF9sZW4sCisJCQkgICAgIHUzMiByZXNpZF9sZW4sIHN0cnVjdCBmY2hzX3MgKnJzcGZjaHMpCit7CisJc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyA9IGNiYXJnOworCisJYmZhX3RyYyhmYWJyaWMtPmZjcywgc3RhdHVzKTsKK30KKworLyoKKyAqCisgKiBAcGFyYW1baW5dIGZhYnJpYyAtIGZhYnJpYworICogQHBhcmFtW2luXSByZXN1bHQgLSAxCisgKgorICogQHJldHVybiAtIG5vbmUKKyAqLwordm9pZAorYmZhX2Zjc19hdXRoX2ZpbmlzaGVkKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsIGVudW0gYXV0aF9zdGF0dXMgc3RhdHVzKQoreworCWJmYV90cmMoZmFicmljLT5mY3MsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzID09IEZDX0FVVEhfU1RBVEVfU1VDQ0VTUykKKwkJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9BVVRIX1NVQ0NFU1MpOworCWVsc2UKKwkJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9BVVRIX0ZBSUxFRCk7Cit9CisKKy8qKgorICogU2VuZCBBRU4gbm90aWZpY2F0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX2ZhYnJpY19hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQllbnVtIGJmYV9wb3J0X2Flbl9ldmVudCBldmVudCkKK3sKKwl1bmlvbiBiZmFfYWVuX2RhdGFfdSBhZW5fZGF0YTsKKwlzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nbW9kID0gcG9ydC0+ZmNzLT5sb2dtOworCXd3bl90ICAgICAgICAgICBwd3duID0gYmZhX2Zjc19wb3J0X2dldF9wd3duKHBvcnQpOworCXd3bl90ICAgICAgICAgICBmd3duID0gYmZhX2Zjc19wb3J0X2dldF9mYWJyaWNfbmFtZShwb3J0KTsKKwljaGFyICAgICAgICAgICAgcHd3bl9wdHJbQkZBX1NUUklOR18zMl07CisJY2hhciAgICAgICAgICAgIGZ3d25fcHRyW0JGQV9TVFJJTkdfMzJdOworCisJd3duMnN0cihwd3duX3B0ciwgcHd3bik7CisJd3duMnN0cihmd3duX3B0ciwgZnd3bik7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfUE9SVF9BRU5fRkFCUklDX05BTUVfQ0hBTkdFOgorCQliZmFfbG9nKGxvZ21vZCwgQkZBX0FFTl9QT1JUX0ZBQlJJQ19OQU1FX0NIQU5HRSwgcHd3bl9wdHIsCisJCQlmd3duX3B0cik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWFlbl9kYXRhLnBvcnQucHd3biA9IHB3d247CisJYWVuX2RhdGEucG9ydC5md3duID0gZnd3bjsKK30KKworLyoKKyAqCisgKiBAcGFyYW1baW5dIGZhYnJpYyAtIGZhYnJpYworICogQHBhcmFtW2luXSB3d25fdCAtIG5ldyBmYWJyaWMgbmFtZQorICoKKyAqIEByZXR1cm4gLSBub25lCisgKi8KK3ZvaWQKK2JmYV9mY3NfZmFicmljX3NldF9mYWJyaWNfbmFtZShzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLAorCQkJICAgICAgIHd3bl90IGZhYnJpY19uYW1lKQoreworCWJmYV90cmMoZmFicmljLT5mY3MsIGZhYnJpY19uYW1lKTsKKworCWlmIChmYWJyaWMtPmZhYnJpY19uYW1lID09IDApIHsKKwkJLyoKKwkJICogV2l0aCBCUkNEIHN3aXRjaGVzLCB3ZSBkb24ndCBnZXQgRmFicmljIE5hbWUgaW4gRkxPR0kuCisJCSAqIERvbid0IGdlbmVyYXRlIGEgZmFicmljIG5hbWUgY2hhbmdlIGV2ZW50IGluIHRoaXMgY2FzZS4KKwkJICovCisJCWZhYnJpYy0+ZmFicmljX25hbWUgPSBmYWJyaWNfbmFtZTsKKwl9IGVsc2UgeworCQlmYWJyaWMtPmZhYnJpY19uYW1lID0gZmFicmljX25hbWU7CisJCS8qCisJCSAqIEdlbmVyYXRlIGEgRXZlbnQKKwkJICovCisJCWJmYV9mY3NfZmFicmljX2Flbl9wb3N0KCZmYWJyaWMtPmJwb3J0LAorCQkJCQlCRkFfUE9SVF9BRU5fRkFCUklDX05BTUVfQ0hBTkdFKTsKKwl9CisKK30KKworLyoqCisgKiBOb3QgdXNlZCBieSBGQ1MuCisgKi8KK3ZvaWQKK2JmYV9jYl9scHNfZmxvZ29fY29tcCh2b2lkICpiZmFkLCB2b2lkICp1YXJnKQoreworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmNidWlsZC5jIGIvZHJpdmVycy9zY3NpL2JmYS9mY2J1aWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NDcwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNidWlsZC5jCkBAIC0wLDAgKzEsMTQ0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworLyoKKyAqIGZjYnVpbGQuYyAtIEZDIGxpbmsgc2VydmljZSBmcmFtZSBidWlsZGluZyBhbmQgcGFyc2luZyByb3V0aW5lcworICovCisKKyNpbmNsdWRlIDxiZmFfb3NfaW5jLmg+CisjaW5jbHVkZSAiZmNidWlsZC5oIgorCisvKgorICogc3RhdGljIGJ1aWxkIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBmY19lbHNfcnNwX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJCXUxNiBveF9pZCk7CitzdGF0aWMgdm9pZCBmY19ibHNfcnNwX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJCXUxNiBveF9pZCk7CitzdGF0aWMgc3RydWN0IGZjaHNfcyAgIGZjX2Vsc19yZXFfdG1wbDsKK3N0YXRpYyBzdHJ1Y3QgZmNoc19zICAgZmNfZWxzX3JzcF90bXBsOworc3RhdGljIHN0cnVjdCBmY2hzX3MgICBmY19ibHNfcmVxX3RtcGw7CitzdGF0aWMgc3RydWN0IGZjaHNfcyAgIGZjX2Jsc19yc3BfdG1wbDsKK3N0YXRpYyBzdHJ1Y3QgZmNfYmFfYWNjX3MgYmFfYWNjX3RtcGw7CitzdGF0aWMgc3RydWN0IGZjX2xvZ2lfcyBwbG9naV90bXBsOworc3RhdGljIHN0cnVjdCBmY19wcmxpX3MgcHJsaV90bXBsOworc3RhdGljIHN0cnVjdCBmY19ycnFfcyBycnFfdG1wbDsKK3N0YXRpYyBzdHJ1Y3QgZmNoc19zICAgZmNwX2ZjaHNfdG1wbDsKKwordm9pZAorZmNidWlsZF9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBmY19lbHNfcmVxX3RtcGwKKwkgKi8KKwlmY19lbHNfcmVxX3RtcGwucm91dGluZyA9IEZDX1JUR19FWFRfTElOSzsKKwlmY19lbHNfcmVxX3RtcGwuY2F0X2luZm8gPSBGQ19DQVRfTERfUkVRVUVTVDsKKwlmY19lbHNfcmVxX3RtcGwudHlwZSA9IEZDX1RZUEVfRUxTOworCWZjX2Vsc19yZXFfdG1wbC5mX2N0bCA9CisJCWJmYV9vc19odG9uM2IoRkNUTF9TRVFfSU5JIHwgRkNUTF9GU19FWENIIHwgRkNUTF9FTkRfU0VRIHwKKwkJCSAgICAgIEZDVExfU0lfWEZFUik7CisJZmNfZWxzX3JlcV90bXBsLnJ4X2lkID0gRkNfUlhJRF9BTlk7CisKKwkvKgorCSAqIGZjX2Vsc19yc3BfdG1wbAorCSAqLworCWZjX2Vsc19yc3BfdG1wbC5yb3V0aW5nID0gRkNfUlRHX0VYVF9MSU5LOworCWZjX2Vsc19yc3BfdG1wbC5jYXRfaW5mbyA9IEZDX0NBVF9MRF9SRVBMWTsKKwlmY19lbHNfcnNwX3RtcGwudHlwZSA9IEZDX1RZUEVfRUxTOworCWZjX2Vsc19yc3BfdG1wbC5mX2N0bCA9CisJCWJmYV9vc19odG9uM2IoRkNUTF9FQ19SRVNQIHwgRkNUTF9TRVFfSU5JIHwgRkNUTF9MU19FWENIIHwKKwkJCSAgICAgIEZDVExfRU5EX1NFUSB8IEZDVExfU0lfWEZFUik7CisJZmNfZWxzX3JzcF90bXBsLnJ4X2lkID0gRkNfUlhJRF9BTlk7CisKKwkvKgorCSAqIGZjX2Jsc19yZXFfdG1wbAorCSAqLworCWZjX2Jsc19yZXFfdG1wbC5yb3V0aW5nID0gRkNfUlRHX0JBU0lDX0xJTks7CisJZmNfYmxzX3JlcV90bXBsLnR5cGUgPSBGQ19UWVBFX0JMUzsKKwlmY19ibHNfcmVxX3RtcGwuZl9jdGwgPSBiZmFfb3NfaHRvbjNiKEZDVExfRU5EX1NFUSB8IEZDVExfU0lfWEZFUik7CisJZmNfYmxzX3JlcV90bXBsLnJ4X2lkID0gRkNfUlhJRF9BTlk7CisKKwkvKgorCSAqIGZjX2Jsc19yc3BfdG1wbAorCSAqLworCWZjX2Jsc19yc3BfdG1wbC5yb3V0aW5nID0gRkNfUlRHX0JBU0lDX0xJTks7CisJZmNfYmxzX3JzcF90bXBsLmNhdF9pbmZvID0gRkNfQ0FUX0JBX0FDQzsKKwlmY19ibHNfcnNwX3RtcGwudHlwZSA9IEZDX1RZUEVfQkxTOworCWZjX2Jsc19yc3BfdG1wbC5mX2N0bCA9CisJCWJmYV9vc19odG9uM2IoRkNUTF9FQ19SRVNQIHwgRkNUTF9TRVFfSU5JIHwgRkNUTF9MU19FWENIIHwKKwkJCSAgICAgIEZDVExfRU5EX1NFUSB8IEZDVExfU0lfWEZFUik7CisJZmNfYmxzX3JzcF90bXBsLnJ4X2lkID0gRkNfUlhJRF9BTlk7CisKKwkvKgorCSAqIGJhX2FjY190bXBsCisJICovCisJYmFfYWNjX3RtcGwuc2VxX2lkX3ZhbGlkID0gMDsKKwliYV9hY2NfdG1wbC5sb3dfc2VxX2NudCA9IDA7CisJYmFfYWNjX3RtcGwuaGlnaF9zZXFfY250ID0gMHhGRkZGOworCisJLyoKKwkgKiBwbG9naV90bXBsCisJICovCisJcGxvZ2lfdG1wbC5jc3AudmVyaGkgPSBGQ19QSF9WRVJfUEhfMzsKKwlwbG9naV90bXBsLmNzcC52ZXJsbyA9IEZDX1BIX1ZFUl80XzM7CisJcGxvZ2lfdG1wbC5jc3AuYmJjcmVkID0gYmZhX29zX2h0b25zKDB4MDAwNCk7CisJcGxvZ2lfdG1wbC5jc3AuY2lybyA9IDB4MTsKKwlwbG9naV90bXBsLmNzcC5jaXNjID0gMHgwOworCXBsb2dpX3RtcGwuY3NwLmFsdGJiY3JlZCA9IDB4MDsKKwlwbG9naV90bXBsLmNzcC5jb25zZXEgPSBiZmFfb3NfaHRvbnMoMHgwMEZGKTsKKwlwbG9naV90bXBsLmNzcC5yb19iaXRtYXAgPSBiZmFfb3NfaHRvbnMoMHgwMDAyKTsKKwlwbG9naV90bXBsLmNzcC5lX2RfdG92ID0gYmZhX29zX2h0b25sKDIwMDApOworCisJcGxvZ2lfdG1wbC5jbGFzczMuY2xhc3NfdmFsaWQgPSAxOworCXBsb2dpX3RtcGwuY2xhc3MzLnNlcXVlbnRpYWwgPSAxOworCXBsb2dpX3RtcGwuY2xhc3MzLmNvbnNlcSA9IDB4RkY7CisJcGxvZ2lfdG1wbC5jbGFzczMub3NweCA9IDE7CisKKwkvKgorCSAqIHBybGlfdG1wbAorCSAqLworCXBybGlfdG1wbC5jb21tYW5kID0gRkNfRUxTX1BSTEk7CisJcHJsaV90bXBsLnBnbGVuID0gMHgxMDsKKwlwcmxpX3RtcGwucGFnZWJ5dGVzID0gYmZhX29zX2h0b25zKDB4MDAxNCk7CisJcHJsaV90bXBsLnBhcmFtcGFnZS50eXBlID0gRkNfVFlQRV9GQ1A7CisJcHJsaV90bXBsLnBhcmFtcGFnZS5pbWFnZXBhaXIgPSAxOworCXBybGlfdG1wbC5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5yeHJkaXNhYiA9IDE7CisKKwkvKgorCSAqIHJycV90bXBsCisJICovCisJcnJxX3RtcGwuZWxzX2NtZC5lbHNfY29kZSA9IEZDX0VMU19SUlE7CisKKwkvKgorCSAqIGZjcF9mY2hzX3RtcGwKKwkgKi8KKwlmY3BfZmNoc190bXBsLnJvdXRpbmcgPSBGQ19SVEdfRkM0X0RFVl9EQVRBOworCWZjcF9mY2hzX3RtcGwuY2F0X2luZm8gPSBGQ19DQVRfVU5TT0xJQ0lUX0NNRDsKKwlmY3BfZmNoc190bXBsLnR5cGUgPSBGQ19UWVBFX0ZDUDsKKwlmY3BfZmNoc190bXBsLmZfY3RsID0KKwkJYmZhX29zX2h0b24zYihGQ1RMX0ZTX0VYQ0ggfCBGQ1RMX0VORF9TRVEgfCBGQ1RMX1NJX1hGRVIpOworCWZjcF9mY2hzX3RtcGwuc2VxX2lkID0gMTsKKwlmY3BfZmNoc190bXBsLnJ4X2lkID0gRkNfUlhJRF9BTlk7Cit9CisKK3N0YXRpYyB2b2lkCitmY19nc19mY2hkcl9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB1MzIgZF9pZCwgdTMyIHNfaWQsCisJCQl1MzIgb3hfaWQpCit7CisJYmZhX29zX21lbXNldChmY2hzLCAwLCBzaXplb2Yoc3RydWN0IGZjaHNfcykpOworCisJZmNocy0+cm91dGluZyA9IEZDX1JUR19GQzRfREVWX0RBVEE7CisJZmNocy0+Y2F0X2luZm8gPSBGQ19DQVRfVU5TT0xJQ0lUX0NUUkw7CisJZmNocy0+dHlwZSA9IEZDX1RZUEVfU0VSVklDRVM7CisJZmNocy0+Zl9jdGwgPQorCQliZmFfb3NfaHRvbjNiKEZDVExfU0VRX0lOSSB8IEZDVExfRlNfRVhDSCB8IEZDVExfRU5EX1NFUSB8CisJCQkgICAgICBGQ1RMX1NJX1hGRVIpOworCWZjaHMtPnJ4X2lkID0gRkNfUlhJRF9BTlk7CisJZmNocy0+ZF9pZCA9IChkX2lkKTsKKwlmY2hzLT5zX2lkID0gKHNfaWQpOworCWZjaHMtPm94X2lkID0gYmZhX29zX2h0b25zKG94X2lkKTsKKworCS8qKgorCSAqIEB0b2RvIG5vIG5lZWQgdG8gc2V0IG94X2lkIGZvciByZXF1ZXN0CisJICogICAgICAgbm8gbmVlZCB0byBzZXQgcnhfaWQgZm9yIHJlc3BvbnNlCisJICovCit9CisKK3ZvaWQKK2ZjX2Vsc19yZXFfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdTMyIGRfaWQsIHUzMiBzX2lkLAorCQkJdTE2IG94X2lkKQoreworCWJmYV9vc19tZW1jcHkoZmNocywgJmZjX2Vsc19yZXFfdG1wbCwgc2l6ZW9mKHN0cnVjdCBmY2hzX3MpKTsKKwlmY2hzLT5kX2lkID0gKGRfaWQpOworCWZjaHMtPnNfaWQgPSAoc19pZCk7CisJZmNocy0+b3hfaWQgPSBiZmFfb3NfaHRvbnMob3hfaWQpOworfQorCitzdGF0aWMgdm9pZAorZmNfZWxzX3JzcF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB1MzIgZF9pZCwgdTMyIHNfaWQsCisJCQl1MTYgb3hfaWQpCit7CisJYmZhX29zX21lbWNweShmY2hzLCAmZmNfZWxzX3JzcF90bXBsLCBzaXplb2Yoc3RydWN0IGZjaHNfcykpOworCWZjaHMtPmRfaWQgPSBkX2lkOworCWZjaHMtPnNfaWQgPSBzX2lkOworCWZjaHMtPm94X2lkID0gb3hfaWQ7Cit9CisKK2VudW0gZmNfcGFyc2Vfc3RhdHVzCitmY19lbHNfcnNwX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmZjaHMsIGludCBsZW4pCit7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICplbHNfY21kID0gKHN0cnVjdCBmY19lbHNfY21kX3MgKikgKGZjaHMgKyAxKTsKKwlzdHJ1Y3QgZmNfbHNfcmp0X3MgICAgKmxzX3JqdCA9IChzdHJ1Y3QgZmNfbHNfcmp0X3MgKikgZWxzX2NtZDsKKworCWxlbiA9IGxlbjsKKworCXN3aXRjaCAoZWxzX2NtZC0+ZWxzX2NvZGUpIHsKKwljYXNlIEZDX0VMU19MU19SSlQ6CisJCWlmIChsc19yanQtPnJlYXNvbl9jb2RlID09IEZDX0xTX1JKVF9SU05fTE9HSUNBTF9CVVNZKQorCQkJcmV0dXJuIChGQ19QQVJTRV9CVVNZKTsKKwkJZWxzZQorCQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKworCWNhc2UgRkNfRUxTX0FDQzoKKwkJcmV0dXJuIChGQ19QQVJTRV9PSyk7CisJfQorCXJldHVybiAoRkNfUEFSU0VfT0spOworfQorCitzdGF0aWMgdm9pZAorZmNfYmxzX3JzcF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB1MzIgZF9pZCwgdTMyIHNfaWQsCisJCQl1MTYgb3hfaWQpCit7CisJYmZhX29zX21lbWNweShmY2hzLCAmZmNfYmxzX3JzcF90bXBsLCBzaXplb2Yoc3RydWN0IGZjaHNfcykpOworCWZjaHMtPmRfaWQgPSBkX2lkOworCWZjaHMtPnNfaWQgPSBzX2lkOworCWZjaHMtPm94X2lkID0gb3hfaWQ7Cit9CisKK3N0YXRpYyAgICAgICAgICB1MTYKK2ZjX3Bsb2dpX3hfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcGxkLCB1MzIgZF9pZCwgdTMyIHNfaWQsCisJCSB1MTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSwgd3duX3Qgbm9kZV9uYW1lLAorCQkgdTE2IHBkdV9zaXplLCB1OCBlbHNfY29kZSkKK3sKKwlzdHJ1Y3QgZmNfbG9naV9zICAgICAqcGxvZ2kgPSAoc3RydWN0IGZjX2xvZ2lfcyAqKSAocGxkKTsKKworCWJmYV9vc19tZW1jcHkocGxvZ2ksICZwbG9naV90bXBsLCBzaXplb2Yoc3RydWN0IGZjX2xvZ2lfcykpOworCisJcGxvZ2ktPmVsc19jbWQuZWxzX2NvZGUgPSBlbHNfY29kZTsKKwlpZiAoZWxzX2NvZGUgPT0gRkNfRUxTX1BMT0dJKQorCQlmY19lbHNfcmVxX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKKwllbHNlCisJCWZjX2Vsc19yc3BfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCisJcGxvZ2ktPmNzcC5yeHN6ID0gcGxvZ2ktPmNsYXNzMy5yeHN6ID0gYmZhX29zX2h0b25zKHBkdV9zaXplKTsKKworCWJmYV9vc19tZW1jcHkoJnBsb2dpLT5wb3J0X25hbWUsICZwb3J0X25hbWUsIHNpemVvZih3d25fdCkpOworCWJmYV9vc19tZW1jcHkoJnBsb2dpLT5ub2RlX25hbWUsICZub2RlX25hbWUsIHNpemVvZih3d25fdCkpOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX2xvZ2lfcykpOworfQorCit1MTYKK2ZjX2Zsb2dpX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19sb2dpX3MgKmZsb2dpLCB1MzIgc19pZCwKKwkJdTE2IG94X2lkLCB3d25fdCBwb3J0X25hbWUsIHd3bl90IG5vZGVfbmFtZSwKKwkJdTE2IHBkdV9zaXplLCB1OCBzZXRfbnBpdiwgdTggc2V0X2F1dGgsCisJCXUxNiBsb2NhbF9iYl9jcmVkaXRzKQoreworCXUzMiAgICAgICAgZF9pZCA9IGJmYV9vc19odG9uM2IoRkNfRkFCUklDX1BPUlQpOworCXUzMiAJKnZ2bF9pbmZvOworCisJYmZhX29zX21lbWNweShmbG9naSwgJnBsb2dpX3RtcGwsIHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSk7CisKKwlmbG9naS0+ZWxzX2NtZC5lbHNfY29kZSA9IEZDX0VMU19GTE9HSTsKKwlmY19lbHNfcmVxX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKKworCWZsb2dpLT5jc3AucnhzeiA9IGZsb2dpLT5jbGFzczMucnhzeiA9IGJmYV9vc19odG9ucyhwZHVfc2l6ZSk7CisJZmxvZ2ktPnBvcnRfbmFtZSA9IHBvcnRfbmFtZTsKKwlmbG9naS0+bm9kZV9uYW1lID0gbm9kZV9uYW1lOworCisJLyoKKwkgKiBTZXQgdGhlIE5QSVYgQ2FwYWJpbGl0eSBCaXQgKCB3b3JkIDEsIGJpdCAzMSkgb2YgQ29tbW9uCisJICogU2VydmljZSBQYXJhbWV0ZXJzLgorCSAqLworCWZsb2dpLT5jc3AuY2lybyA9IHNldF9ucGl2OworCisJLyogc2V0IEFVVEggY2FwYWJpbGl0eSAqLworCWZsb2dpLT5jc3Auc2VjdXJpdHkgPSBzZXRfYXV0aDsKKworCWZsb2dpLT5jc3AuYmJjcmVkID0gYmZhX29zX2h0b25zKGxvY2FsX2JiX2NyZWRpdHMpOworCisJLyogU2V0IGJyY2QgdG9rZW4gaW4gVlZMICovCisJdnZsX2luZm8gPSAodTMyICopJmZsb2dpLT52dmxbMF07CisKKwkvKiBzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIFZWTCAqLworCWZsb2dpLT5jc3AubnBpdl9zdXBwICAgID0gMTsgLyogQHRvZG8uIGZpZWxkIG5hbWUgaXMgbm90IGNvcnJlY3QgKi8KKwl2dmxfaW5mb1swXQk9IGJmYV9vc19odG9ubChGTE9HSV9WVkxfQlJDRCk7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSk7Cit9CisKK3UxNgorZmNfZmxvZ2lfYWNjX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19sb2dpX3MgKmZsb2dpLCB1MzIgc19pZCwKKwkJICAgdTE2IG94X2lkLCB3d25fdCBwb3J0X25hbWUsIHd3bl90IG5vZGVfbmFtZSwKKwkJICAgdTE2IHBkdV9zaXplLCB1MTYgbG9jYWxfYmJfY3JlZGl0cykKK3sKKwl1MzIgICAgICAgIGRfaWQgPSAwOworCisJYmZhX29zX21lbWNweShmbG9naSwgJnBsb2dpX3RtcGwsIHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSk7CisJZmNfZWxzX3JzcF9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisKKwlmbG9naS0+ZWxzX2NtZC5lbHNfY29kZSA9IEZDX0VMU19BQ0M7CisJZmxvZ2ktPmNzcC5yeHN6ID0gZmxvZ2ktPmNsYXNzMy5yeHN6ID0gYmZhX29zX2h0b25zKHBkdV9zaXplKTsKKwlmbG9naS0+cG9ydF9uYW1lID0gcG9ydF9uYW1lOworCWZsb2dpLT5ub2RlX25hbWUgPSBub2RlX25hbWU7CisKKwlmbG9naS0+Y3NwLmJiY3JlZCA9IGJmYV9vc19odG9ucyhsb2NhbF9iYl9jcmVkaXRzKTsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpKTsKK30KKwordTE2CitmY19mZGlzY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfbG9naV9zICpmbG9naSwgdTMyIHNfaWQsCisJCXUxNiBveF9pZCwgd3duX3QgcG9ydF9uYW1lLCB3d25fdCBub2RlX25hbWUsCisJCXUxNiBwZHVfc2l6ZSkKK3sKKwl1MzIgICAgICAgIGRfaWQgPSBiZmFfb3NfaHRvbjNiKEZDX0ZBQlJJQ19QT1JUKTsKKworCWJmYV9vc19tZW1jcHkoZmxvZ2ksICZwbG9naV90bXBsLCBzaXplb2Yoc3RydWN0IGZjX2xvZ2lfcykpOworCisJZmxvZ2ktPmVsc19jbWQuZWxzX2NvZGUgPSBGQ19FTFNfRkRJU0M7CisJZmNfZWxzX3JlcV9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisKKwlmbG9naS0+Y3NwLnJ4c3ogPSBmbG9naS0+Y2xhc3MzLnJ4c3ogPSBiZmFfb3NfaHRvbnMocGR1X3NpemUpOworCWZsb2dpLT5wb3J0X25hbWUgPSBwb3J0X25hbWU7CisJZmxvZ2ktPm5vZGVfbmFtZSA9IG5vZGVfbmFtZTsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpKTsKK30KKwordTE2CitmY19wbG9naV9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkgICAgICAgdTE2IG94X2lkLCB3d25fdCBwb3J0X25hbWUsIHd3bl90IG5vZGVfbmFtZSwKKwkgICAgICAgdTE2IHBkdV9zaXplKQoreworCXJldHVybiBmY19wbG9naV94X2J1aWxkKGZjaHMsIHBsZCwgZF9pZCwgc19pZCwgb3hfaWQsIHBvcnRfbmFtZSwKKwkJCQlub2RlX25hbWUsIHBkdV9zaXplLCBGQ19FTFNfUExPR0kpOworfQorCit1MTYKK2ZjX3Bsb2dpX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJICAgdTE2IG94X2lkLCB3d25fdCBwb3J0X25hbWUsIHd3bl90IG5vZGVfbmFtZSwKKwkJICAgdTE2IHBkdV9zaXplKQoreworCXJldHVybiBmY19wbG9naV94X2J1aWxkKGZjaHMsIHBsZCwgZF9pZCwgc19pZCwgb3hfaWQsIHBvcnRfbmFtZSwKKwkJCQlub2RlX25hbWUsIHBkdV9zaXplLCBGQ19FTFNfQUNDKTsKK30KKworZW51bSBmY19wYXJzZV9zdGF0dXMKK2ZjX3Bsb2dpX3JzcF9wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzLCBpbnQgbGVuLCB3d25fdCBwb3J0X25hbWUpCit7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICplbHNfY21kID0gKHN0cnVjdCBmY19lbHNfY21kX3MgKikgKGZjaHMgKyAxKTsKKwlzdHJ1Y3QgZmNfbG9naV9zICAgICAqcGxvZ2k7CisJc3RydWN0IGZjX2xzX3JqdF9zICAgICpsc19yanQ7CisKKwlzd2l0Y2ggKGVsc19jbWQtPmVsc19jb2RlKSB7CisJY2FzZSBGQ19FTFNfTFNfUkpUOgorCQlsc19yanQgPSAoc3RydWN0IGZjX2xzX3JqdF9zICopIChmY2hzICsgMSk7CisJCWlmIChsc19yanQtPnJlYXNvbl9jb2RlID09IEZDX0xTX1JKVF9SU05fTE9HSUNBTF9CVVNZKQorCQkJcmV0dXJuIChGQ19QQVJTRV9CVVNZKTsKKwkJZWxzZQorCQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwljYXNlIEZDX0VMU19BQ0M6CisJCXBsb2dpID0gKHN0cnVjdCBmY19sb2dpX3MgKikgKGZjaHMgKyAxKTsKKwkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSkKKwkJCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisKKwkJaWYgKCF3d25faXNfZXF1YWwocGxvZ2ktPnBvcnRfbmFtZSwgcG9ydF9uYW1lKSkKKwkJCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisKKwkJaWYgKCFwbG9naS0+Y2xhc3MzLmNsYXNzX3ZhbGlkKQorCQkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKworCQlpZiAoYmZhX29zX250b2hzKHBsb2dpLT5jbGFzczMucnhzeikgPCAoRkNfTUlOX1BEVVNaKSkKKwkJCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisKKwkJcmV0dXJuIChGQ19QQVJTRV9PSyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKwl9Cit9CisKK2VudW0gZmNfcGFyc2Vfc3RhdHVzCitmY19wbG9naV9wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzKQoreworCXN0cnVjdCBmY19sb2dpX3MgICAgICpwbG9naSA9IChzdHJ1Y3QgZmNfbG9naV9zICopIChmY2hzICsgMSk7CisKKwlpZiAocGxvZ2ktPmNsYXNzMy5jbGFzc192YWxpZCAhPSAxKQorCQlyZXR1cm4gRkNfUEFSU0VfRkFJTFVSRTsKKworCWlmICgoYmZhX29zX250b2hzKHBsb2dpLT5jbGFzczMucnhzeikgPCBGQ19NSU5fUERVU1opCisJICAgIHx8IChiZmFfb3NfbnRvaHMocGxvZ2ktPmNsYXNzMy5yeHN6KSA+IEZDX01BWF9QRFVTWikKKwkgICAgfHwgKHBsb2dpLT5jbGFzczMucnhzeiA9PSAwKSkKKwkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKworCXJldHVybiBGQ19QQVJTRV9PSzsKK30KKwordTE2CitmY19wcmxpX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnBsZCwgdTMyIGRfaWQsIHUzMiBzX2lkLAorCSAgICAgIHUxNiBveF9pZCkKK3sKKwlzdHJ1Y3QgZmNfcHJsaV9zICAgICAgKnBybGkgPSAoc3RydWN0IGZjX3BybGlfcyAqKSAocGxkKTsKKworCWZjX2Vsc19yZXFfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCWJmYV9vc19tZW1jcHkocHJsaSwgJnBybGlfdG1wbCwgc2l6ZW9mKHN0cnVjdCBmY19wcmxpX3MpKTsKKworCXBybGktPmNvbW1hbmQgPSBGQ19FTFNfUFJMSTsKKwlwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5pbml0aWF0b3IgICAgID0gMTsKKwlwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5yZXRyeSAgICAgICAgID0gMTsKKwlwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5yZWNfc3VwcG9ydCAgID0gMTsKKwlwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy50YXNrX3JldHJ5X2lkID0gMDsKKwlwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5jb25maXJtICAgICAgID0gMTsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19wcmxpX3MpKTsKK30KKwordTE2CitmY19wcmxpX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJICB1MTYgb3hfaWQsIGVudW0gYmZhX3BvcnRfcm9sZSByb2xlKQoreworCXN0cnVjdCBmY19wcmxpX3MgICAgICAqcHJsaSA9IChzdHJ1Y3QgZmNfcHJsaV9zICopIChwbGQpOworCisJZmNfZWxzX3JzcF9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisJYmZhX29zX21lbWNweShwcmxpLCAmcHJsaV90bXBsLCBzaXplb2Yoc3RydWN0IGZjX3BybGlfcykpOworCisJcHJsaS0+Y29tbWFuZCA9IEZDX0VMU19BQ0M7CisKKwlpZiAoKHJvbGUgJiBCRkFfUE9SVF9ST0xFX0ZDUF9UTSkgPT0gQkZBX1BPUlRfUk9MRV9GQ1BfVE0pCisJCXBybGktPnBhcmFtcGFnZS5zZXJ2cGFyYW1zLnRhcmdldCA9IDE7CisJZWxzZQorCQlwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5pbml0aWF0b3IgPSAxOworCisJcHJsaS0+cGFyYW1wYWdlLnJzcGNvZGUgPSBGQ19QUkxJX0FDQ19YUVREOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3BybGlfcykpOworfQorCitlbnVtIGZjX3BhcnNlX3N0YXR1cworZmNfcHJsaV9yc3BfcGFyc2Uoc3RydWN0IGZjX3BybGlfcyAqcHJsaSwgaW50IGxlbikKK3sKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBmY19wcmxpX3MpKQorCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCisJaWYgKHBybGktPmNvbW1hbmQgIT0gRkNfRUxTX0FDQykKKwkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKworCWlmICgocHJsaS0+cGFyYW1wYWdlLnJzcGNvZGUgIT0gRkNfUFJMSV9BQ0NfWFFURCkKKwkgICAgJiYgKHBybGktPnBhcmFtcGFnZS5yc3Bjb2RlICE9IEZDX1BSTElfQUNDX1BSRURFRl9JTUcpKQorCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCisJaWYgKHBybGktPnBhcmFtcGFnZS5zZXJ2cGFyYW1zLnRhcmdldCAhPSAxKQorCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCisJcmV0dXJuIChGQ19QQVJTRV9PSyk7Cit9CisKK2VudW0gZmNfcGFyc2Vfc3RhdHVzCitmY19wcmxpX3BhcnNlKHN0cnVjdCBmY19wcmxpX3MgKnBybGkpCit7CisJaWYgKHBybGktPnBhcmFtcGFnZS50eXBlICE9IEZDX1RZUEVfRkNQKQorCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCisJaWYgKCFwcmxpLT5wYXJhbXBhZ2UuaW1hZ2VwYWlyKQorCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCisJaWYgKCFwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5pbml0aWF0b3IpCisJCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisKKwlyZXR1cm4gKEZDX1BBUlNFX09LKTsKK30KKwordTE2CitmY19sb2dvX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19sb2dvX3MgKmxvZ28sIHUzMiBkX2lkLAorCQkJdTMyIHNfaWQsIHUxNiBveF9pZCwgd3duX3QgcG9ydF9uYW1lKQoreworCWZjX2Vsc19yZXFfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCisJbWVtc2V0KGxvZ28sICdcMCcsIHNpemVvZihzdHJ1Y3QgZmNfbG9nb19zKSk7CisJbG9nby0+ZWxzX2NtZC5lbHNfY29kZSA9IEZDX0VMU19MT0dPOworCWxvZ28tPm5wb3J0X2lkID0gKHNfaWQpOworCWxvZ28tPm9yaWdfcG9ydF9uYW1lID0gcG9ydF9uYW1lOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX2xvZ29fcykpOworfQorCitzdGF0aWMgICAgICAgICAgdTE2CitmY19hZGlzY194X2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19hZGlzY19zICphZGlzYywgdTMyIGRfaWQsCisJCSB1MzIgc19pZCwgdTE2IG94X2lkLCB3d25fdCBwb3J0X25hbWUsCisJCSB3d25fdCBub2RlX25hbWUsIHU4IGVsc19jb2RlKQoreworCW1lbXNldChhZGlzYywgJ1wwJywgc2l6ZW9mKHN0cnVjdCBmY19hZGlzY19zKSk7CisKKwlhZGlzYy0+ZWxzX2NtZC5lbHNfY29kZSA9IGVsc19jb2RlOworCisJaWYgKGVsc19jb2RlID09IEZDX0VMU19BRElTQykKKwkJZmNfZWxzX3JlcV9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisJZWxzZQorCQlmY19lbHNfcnNwX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKKworCWFkaXNjLT5vcmlnX0hBID0gMDsKKwlhZGlzYy0+b3JpZ19wb3J0X25hbWUgPSBwb3J0X25hbWU7CisJYWRpc2MtPm9yaWdfbm9kZV9uYW1lID0gbm9kZV9uYW1lOworCWFkaXNjLT5ucG9ydF9pZCA9IChzX2lkKTsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19hZGlzY19zKSk7Cit9CisKK3UxNgorZmNfYWRpc2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX2FkaXNjX3MgKmFkaXNjLCB1MzIgZF9pZCwKKwkJdTMyIHNfaWQsIHUxNiBveF9pZCwgd3duX3QgcG9ydF9uYW1lLAorCQl3d25fdCBub2RlX25hbWUpCit7CisJcmV0dXJuIGZjX2FkaXNjX3hfYnVpbGQoZmNocywgYWRpc2MsIGRfaWQsIHNfaWQsIG94X2lkLCBwb3J0X25hbWUsCisJCQkJbm9kZV9uYW1lLCBGQ19FTFNfQURJU0MpOworfQorCit1MTYKK2ZjX2FkaXNjX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfYWRpc2NfcyAqYWRpc2MsIHUzMiBkX2lkLAorCQkgICB1MzIgc19pZCwgdTE2IG94X2lkLCB3d25fdCBwb3J0X25hbWUsCisJCSAgIHd3bl90IG5vZGVfbmFtZSkKK3sKKwlyZXR1cm4gZmNfYWRpc2NfeF9idWlsZChmY2hzLCBhZGlzYywgZF9pZCwgc19pZCwgb3hfaWQsIHBvcnRfbmFtZSwKKwkJCQlub2RlX25hbWUsIEZDX0VMU19BQ0MpOworfQorCitlbnVtIGZjX3BhcnNlX3N0YXR1cworZmNfYWRpc2NfcnNwX3BhcnNlKHN0cnVjdCBmY19hZGlzY19zICphZGlzYywgaW50IGxlbiwgd3duX3QgcG9ydF9uYW1lLAorCQkJCSB3d25fdCBub2RlX25hbWUpCit7CisKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBmY19hZGlzY19zKSkKKwkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKworCWlmIChhZGlzYy0+ZWxzX2NtZC5lbHNfY29kZSAhPSBGQ19FTFNfQUNDKQorCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCisJaWYgKCF3d25faXNfZXF1YWwoYWRpc2MtPm9yaWdfcG9ydF9uYW1lLCBwb3J0X25hbWUpKQorCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCisJcmV0dXJuIChGQ19QQVJTRV9PSyk7Cit9CisKK2VudW0gZmNfcGFyc2Vfc3RhdHVzCitmY19hZGlzY19wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBob3N0X2RhcCwKKwkJIHd3bl90IG5vZGVfbmFtZSwgd3duX3QgcG9ydF9uYW1lKQoreworCXN0cnVjdCBmY19hZGlzY19zICAgICAqYWRpc2MgPSAoc3RydWN0IGZjX2FkaXNjX3MgKikgcGxkOworCisJaWYgKGFkaXNjLT5lbHNfY21kLmVsc19jb2RlICE9IEZDX0VMU19BQ0MpCisJCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisKKwlpZiAoKGFkaXNjLT5ucG9ydF9pZCA9PSAoaG9zdF9kYXApKQorCSAgICAmJiB3d25faXNfZXF1YWwoYWRpc2MtPm9yaWdfcG9ydF9uYW1lLCBwb3J0X25hbWUpCisJICAgICYmIHd3bl9pc19lcXVhbChhZGlzYy0+b3JpZ19ub2RlX25hbWUsIG5vZGVfbmFtZSkpCisJCXJldHVybiAoRkNfUEFSU0VfT0spOworCisJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKK30KKworZW51bSBmY19wYXJzZV9zdGF0dXMKK2ZjX3BkaXNjX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHd3bl90IG5vZGVfbmFtZSwgd3duX3QgcG9ydF9uYW1lKQoreworCXN0cnVjdCBmY19sb2dpX3MgICAgICpwZGlzYyA9IChzdHJ1Y3QgZmNfbG9naV9zICopIChmY2hzICsgMSk7CisKKwlpZiAocGRpc2MtPmNsYXNzMy5jbGFzc192YWxpZCAhPSAxKQorCQlyZXR1cm4gRkNfUEFSU0VfRkFJTFVSRTsKKworCWlmICgoYmZhX29zX250b2hzKHBkaXNjLT5jbGFzczMucnhzeikgPAorCQkgKEZDX01JTl9QRFVTWiAtIHNpemVvZihzdHJ1Y3QgZmNoc19zKSkpCisJICAgIHx8IChwZGlzYy0+Y2xhc3MzLnJ4c3ogPT0gMCkpCisJCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisKKwlpZiAoIXd3bl9pc19lcXVhbChwZGlzYy0+cG9ydF9uYW1lLCBwb3J0X25hbWUpKQorCQlyZXR1cm4gKEZDX1BBUlNFX0ZBSUxVUkUpOworCisJaWYgKCF3d25faXNfZXF1YWwocGRpc2MtPm5vZGVfbmFtZSwgbm9kZV9uYW1lKSkKKwkJcmV0dXJuIChGQ19QQVJTRV9GQUlMVVJFKTsKKworCXJldHVybiBGQ19QQVJTRV9PSzsKK30KKwordTE2CitmY19hYnRzX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkKQoreworCWJmYV9vc19tZW1jcHkoZmNocywgJmZjX2Jsc19yZXFfdG1wbCwgc2l6ZW9mKHN0cnVjdCBmY2hzX3MpKTsKKwlmY2hzLT5jYXRfaW5mbyA9IEZDX0NBVF9BQlRTOworCWZjaHMtPmRfaWQgPSAoZF9pZCk7CisJZmNocy0+c19pZCA9IChzX2lkKTsKKwlmY2hzLT5veF9pZCA9IGJmYV9vc19odG9ucyhveF9pZCk7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNoc19zKSk7Cit9CisKK2VudW0gZmNfcGFyc2Vfc3RhdHVzCitmY19hYnRzX3JzcF9wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzLCBpbnQgbGVuKQoreworCWlmICgoZmNocy0+Y2F0X2luZm8gPT0gRkNfQ0FUX0JBX0FDQykKKwkgICAgfHwgKGZjaHMtPmNhdF9pbmZvID09IEZDX0NBVF9CQV9SSlQpKQorCQlyZXR1cm4gKEZDX1BBUlNFX09LKTsKKworCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7Cit9CisKK3UxNgorZmNfcnJxX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19ycnFfcyAqcnJxLCB1MzIgZF9pZCwKKwkJCSB1MzIgc19pZCwgdTE2IG94X2lkLCB1MTYgcnJxX294aWQpCit7CisJZmNfZWxzX3JlcV9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisKKwkvKgorCSAqIGJ1aWxkIHJycSBwYXlsb2FkCisJICovCisJYmZhX29zX21lbWNweShycnEsICZycnFfdG1wbCwgc2l6ZW9mKHN0cnVjdCBmY19ycnFfcykpOworCXJycS0+c19pZCA9IChzX2lkKTsKKwlycnEtPm94X2lkID0gYmZhX29zX2h0b25zKHJycV9veGlkKTsKKwlycnEtPnJ4X2lkID0gRkNfUlhJRF9BTlk7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfcnJxX3MpKTsKK30KKwordTE2CitmY19sb2dvX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJICB1MTYgb3hfaWQpCit7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICphY2MgPSBwbGQ7CisKKwlmY19lbHNfcnNwX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKKworCW1lbXNldChhY2MsIDAsIHNpemVvZihzdHJ1Y3QgZmNfZWxzX2NtZF9zKSk7CisJYWNjLT5lbHNfY29kZSA9IEZDX0VMU19BQ0M7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfZWxzX2NtZF9zKSk7Cit9CisKK3UxNgorZmNfbHNfcmp0X2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19sc19yanRfcyAqbHNfcmp0LCB1MzIgZF9pZCwKKwkJdTMyIHNfaWQsIHUxNiBveF9pZCwgdTggcmVhc29uX2NvZGUsCisJCXU4IHJlYXNvbl9jb2RlX2V4cGwpCit7CisJZmNfZWxzX3JzcF9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisJbWVtc2V0KGxzX3JqdCwgMCwgc2l6ZW9mKHN0cnVjdCBmY19sc19yanRfcykpOworCisJbHNfcmp0LT5lbHNfY21kLmVsc19jb2RlID0gRkNfRUxTX0xTX1JKVDsKKwlsc19yanQtPnJlYXNvbl9jb2RlID0gcmVhc29uX2NvZGU7CisJbHNfcmp0LT5yZWFzb25fY29kZV9leHBsID0gcmVhc29uX2NvZGVfZXhwbDsKKwlsc19yanQtPnZlbmRvcl91bmlxdWUgPSAweDAwOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX2xzX3JqdF9zKSk7Cit9CisKK3UxNgorZmNfYmFfYWNjX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19iYV9hY2NfcyAqYmFfYWNjLCB1MzIgZF9pZCwKKwkJdTMyIHNfaWQsIHUxNiBveF9pZCwgdTE2IHJ4X2lkKQoreworCWZjX2Jsc19yc3BfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCisJYmZhX29zX21lbWNweShiYV9hY2MsICZiYV9hY2NfdG1wbCwgc2l6ZW9mKHN0cnVjdCBmY19iYV9hY2NfcykpOworCisJZmNocy0+cnhfaWQgPSByeF9pZDsKKworCWJhX2FjYy0+b3hfaWQgPSBmY2hzLT5veF9pZDsKKwliYV9hY2MtPnJ4X2lkID0gZmNocy0+cnhfaWQ7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfYmFfYWNjX3MpKTsKK30KKwordTE2CitmY19sc19hY2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX2Vsc19jbWRfcyAqZWxzX2NtZCwKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkKQoreworCWZjX2Vsc19yc3BfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCW1lbXNldChlbHNfY21kLCAwLCBzaXplb2Yoc3RydWN0IGZjX2Vsc19jbWRfcykpOworCWVsc19jbWQtPmVsc19jb2RlID0gRkNfRUxTX0FDQzsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19lbHNfY21kX3MpKTsKK30KKworaW50CitmY19sb2dvdXRfcGFyYW1zX3BhZ2VzKHN0cnVjdCBmY2hzX3MgKmZjX2ZyYW1lLCB1OCBlbHNfY29kZSkKK3sKKwlpbnQgICAgICAgICAgICAgbnVtX3BhZ2VzID0gMDsKKwlzdHJ1Y3QgZmNfcHJsb19zICAgICAgKnBybG87CisJc3RydWN0IGZjX3RwcmxvX3MgICAgICp0cHJsbzsKKworCWlmIChlbHNfY29kZSA9PSBGQ19FTFNfUFJMTykgeworCQlwcmxvID0gKHN0cnVjdCBmY19wcmxvX3MgKikgKGZjX2ZyYW1lICsgMSk7CisJCW51bV9wYWdlcyA9IChiZmFfb3NfbnRvaHMocHJsby0+cGF5bG9hZF9sZW4pIC0gNCkgLyAxNjsKKwl9IGVsc2UgeworCQl0cHJsbyA9IChzdHJ1Y3QgZmNfdHBybG9fcyAqKSAoZmNfZnJhbWUgKyAxKTsKKwkJbnVtX3BhZ2VzID0gKGJmYV9vc19udG9ocyh0cHJsby0+cGF5bG9hZF9sZW4pIC0gNCkgLyAxNjsKKwl9CisJcmV0dXJuIG51bV9wYWdlczsKK30KKwordTE2CitmY190cHJsb19hY2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3RwcmxvX2FjY19zICp0cHJsb19hY2MsCisJCQl1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCWludCBudW1fcGFnZXMpCit7CisJaW50ICAgICAgICAgICAgIHBhZ2U7CisKKwlmY19lbHNfcnNwX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKKworCW1lbXNldCh0cHJsb19hY2MsIDAsIChudW1fcGFnZXMgKiAxNikgKyA0KTsKKwl0cHJsb19hY2MtPmNvbW1hbmQgPSBGQ19FTFNfQUNDOworCisJdHBybG9fYWNjLT5wYWdlX2xlbiA9IDB4MTA7CisJdHBybG9fYWNjLT5wYXlsb2FkX2xlbiA9IGJmYV9vc19odG9ucygobnVtX3BhZ2VzICogMTYpICsgNCk7CisKKwlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgbnVtX3BhZ2VzOyBwYWdlKyspIHsKKwkJdHBybG9fYWNjLT50cHJsb19hY2NfcGFyYW1zW3BhZ2VdLm9wYV92YWxpZCA9IDA7CisJCXRwcmxvX2FjYy0+dHBybG9fYWNjX3BhcmFtc1twYWdlXS5ycGFfdmFsaWQgPSAwOworCQl0cHJsb19hY2MtPnRwcmxvX2FjY19wYXJhbXNbcGFnZV0uZmM0dHlwZV9jc3AgPSBGQ19UWVBFX0ZDUDsKKwkJdHBybG9fYWNjLT50cHJsb19hY2NfcGFyYW1zW3BhZ2VdLm9yaWdfcHJvY2Vzc19hc3NjID0gMDsKKwkJdHBybG9fYWNjLT50cHJsb19hY2NfcGFyYW1zW3BhZ2VdLnJlc3BfcHJvY2Vzc19hc3NjID0gMDsKKwl9CisJcmV0dXJuIChiZmFfb3NfbnRvaHModHBybG9fYWNjLT5wYXlsb2FkX2xlbikpOworfQorCit1MTYKK2ZjX3BybG9fYWNjX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19wcmxvX2FjY19zICpwcmxvX2FjYywKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkLAorCQkJaW50IG51bV9wYWdlcykKK3sKKwlpbnQgICAgICAgICAgICAgcGFnZTsKKworCWZjX2Vsc19yc3BfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCisJbWVtc2V0KHBybG9fYWNjLCAwLCAobnVtX3BhZ2VzICogMTYpICsgNCk7CisJcHJsb19hY2MtPmNvbW1hbmQgPSBGQ19FTFNfQUNDOworCXBybG9fYWNjLT5wYWdlX2xlbiA9IDB4MTA7CisJcHJsb19hY2MtPnBheWxvYWRfbGVuID0gYmZhX29zX2h0b25zKChudW1fcGFnZXMgKiAxNikgKyA0KTsKKworCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBudW1fcGFnZXM7IHBhZ2UrKykgeworCQlwcmxvX2FjYy0+cHJsb19hY2NfcGFyYW1zW3BhZ2VdLm9wYV92YWxpZCA9IDA7CisJCXBybG9fYWNjLT5wcmxvX2FjY19wYXJhbXNbcGFnZV0ucnBhX3ZhbGlkID0gMDsKKwkJcHJsb19hY2MtPnBybG9fYWNjX3BhcmFtc1twYWdlXS5mYzR0eXBlX2NzcCA9IEZDX1RZUEVfRkNQOworCQlwcmxvX2FjYy0+cHJsb19hY2NfcGFyYW1zW3BhZ2VdLm9yaWdfcHJvY2Vzc19hc3NjID0gMDsKKwkJcHJsb19hY2MtPnBybG9fYWNjX3BhcmFtc1twYWdlXS5yZXNwX3Byb2Nlc3NfYXNzYyA9IDA7CisJfQorCisJcmV0dXJuIChiZmFfb3NfbnRvaHMocHJsb19hY2MtPnBheWxvYWRfbGVuKSk7Cit9CisKK3UxNgorZmNfcm5pZF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfcm5pZF9jbWRfcyAqcm5pZCwgdTMyIGRfaWQsCisJCQl1MzIgc19pZCwgdTE2IG94X2lkLCB1MzIgZGF0YV9mb3JtYXQpCit7CisJZmNfZWxzX3JlcV9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisKKwltZW1zZXQocm5pZCwgMCwgc2l6ZW9mKHN0cnVjdCBmY19ybmlkX2NtZF9zKSk7CisKKwlybmlkLT5lbHNfY21kLmVsc19jb2RlID0gRkNfRUxTX1JOSUQ7CisJcm5pZC0+bm9kZV9pZF9kYXRhX2Zvcm1hdCA9IGRhdGFfZm9ybWF0OworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3JuaWRfY21kX3MpKTsKK30KKwordTE2CitmY19ybmlkX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfcm5pZF9hY2NfcyAqcm5pZF9hY2MsCisJCQl1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCXUzMiBkYXRhX2Zvcm1hdCwKKwkJCXN0cnVjdCBmY19ybmlkX2NvbW1vbl9pZF9kYXRhX3MgKmNvbW1vbl9pZF9kYXRhLAorCQkJc3RydWN0IGZjX3JuaWRfZ2VuZXJhbF90b3BvbG9neV9kYXRhX3MgKmdlbl90b3BvX2RhdGEpCit7CisJbWVtc2V0KHJuaWRfYWNjLCAwLCBzaXplb2Yoc3RydWN0IGZjX3JuaWRfYWNjX3MpKTsKKworCWZjX2Vsc19yc3BfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCisJcm5pZF9hY2MtPmVsc19jbWQuZWxzX2NvZGUgPSBGQ19FTFNfQUNDOworCXJuaWRfYWNjLT5ub2RlX2lkX2RhdGFfZm9ybWF0ID0gZGF0YV9mb3JtYXQ7CisJcm5pZF9hY2MtPmNvbW1vbl9pZF9kYXRhX2xlbmd0aCA9CisJCQlzaXplb2Yoc3RydWN0IGZjX3JuaWRfY29tbW9uX2lkX2RhdGFfcyk7CisJcm5pZF9hY2MtPmNvbW1vbl9pZF9kYXRhID0gKmNvbW1vbl9pZF9kYXRhOworCisJaWYgKGRhdGFfZm9ybWF0ID09IFJOSURfTk9ERUlEX0RBVEFfRk9STUFUX0RJU0NPVkVSWSkgeworCQlybmlkX2FjYy0+c3BlY2lmaWNfaWRfZGF0YV9sZW5ndGggPQorCQkJc2l6ZW9mKHN0cnVjdCBmY19ybmlkX2dlbmVyYWxfdG9wb2xvZ3lfZGF0YV9zKTsKKwkJYmZhX29zX2Fzc2lnbihybmlkX2FjYy0+Z2VuX3RvcG9sb2d5X2RhdGEsICpnZW5fdG9wb19kYXRhKTsKKwkJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3JuaWRfYWNjX3MpKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfcm5pZF9hY2NfcykgLQorCQkJc2l6ZW9mKHN0cnVjdCBmY19ybmlkX2dlbmVyYWxfdG9wb2xvZ3lfZGF0YV9zKSk7CisJfQorCit9CisKK3UxNgorZmNfcnBzY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfcnBzY19jbWRfcyAqcnBzYywgdTMyIGRfaWQsCisJCQl1MzIgc19pZCwgdTE2IG94X2lkKQoreworCWZjX2Vsc19yZXFfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCisJbWVtc2V0KHJwc2MsIDAsIHNpemVvZihzdHJ1Y3QgZmNfcnBzY19jbWRfcykpOworCisJcnBzYy0+ZWxzX2NtZC5lbHNfY29kZSA9IEZDX0VMU19SUFNDOworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19ycHNjX2NtZF9zKSk7Cit9CisKK3UxNgorZmNfcnBzYzJfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3Jwc2MyX2NtZF9zICpycHNjMiwKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTMyICpwaWRfbGlzdCwKKwkJCXUxNiBucGlkcykKK3sKKwl1MzIgZGN0bHJfaWQgPSBGQ19ET01BSU5fQ1RSTFIoYmZhX29zX2h0b24zYihkX2lkKSk7CisJaW50IGkgPSAwOworCisJZmNfZWxzX3JlcV9idWlsZChmY2hzLCBiZmFfb3NfaHRvbjNiKGRjdGxyX2lkKSwgc19pZCwgMCk7CisKKwltZW1zZXQocnBzYzIsIDAsIHNpemVvZihzdHJ1Y3QgZmNfcnBzYzJfY21kX3MpKTsKKworCXJwc2MyLT5lbHNfY21kLmVsc19jb2RlID0gRkNfRUxTX1JQU0M7CisJcnBzYzItPnRva2VuID0gYmZhX29zX2h0b25sKEZDX0JSQ0RfVE9LRU4pOworCXJwc2MyLT5udW1fcGlkcyAgPSBiZmFfb3NfaHRvbnMobnBpZHMpOworCWZvciAoaSA9IDA7IGkgPCBucGlkczsgaSsrKQorCQlycHNjMi0+cGlkX2xpc3RbaV0ucGlkID0gcGlkX2xpc3RbaV07CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfcnBzYzJfY21kX3MpICsgKChucGlkcyAtIDEpICoKKwkJCShzaXplb2YodTMyKSkpKTsKK30KKwordTE2CitmY19ycHNjX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfcnBzY19hY2NfcyAqcnBzY19hY2MsCisJCQl1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCXN0cnVjdCBmY19ycHNjX3NwZWVkX2luZm9fcyAqb3Blcl9zcGVlZCkKK3sKKwltZW1zZXQocnBzY19hY2MsIDAsIHNpemVvZihzdHJ1Y3QgZmNfcnBzY19hY2NfcykpOworCisJZmNfZWxzX3JzcF9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisKKwlycHNjX2FjYy0+Y29tbWFuZCA9IEZDX0VMU19BQ0M7CisJcnBzY19hY2MtPm51bV9lbnRyaWVzID0gYmZhX29zX2h0b25zKDEpOworCisJcnBzY19hY2MtPnNwZWVkX2luZm9bMF0ucG9ydF9zcGVlZF9jYXAgPQorCQliZmFfb3NfaHRvbnMob3Blcl9zcGVlZC0+cG9ydF9zcGVlZF9jYXApOworCisJcnBzY19hY2MtPnNwZWVkX2luZm9bMF0ucG9ydF9vcF9zcGVlZCA9CisJCWJmYV9vc19odG9ucyhvcGVyX3NwZWVkLT5wb3J0X29wX3NwZWVkKTsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19ycHNjX2FjY19zKSk7CisKK30KKworLyoKKyAqIFRCRCAtCisgKiAuIGdldCByaWQgb2YgdW5uZWNlc3NhcnkgbWVtc2V0cworICovCisKK3UxNgorZmNfbG9nb19yc3BfcGFyc2Uoc3RydWN0IGZjaHNfcyAqZmNocywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgKmVsc19jbWQgPSAoc3RydWN0IGZjX2Vsc19jbWRfcyAqKSAoZmNocyArIDEpOworCisJbGVuID0gbGVuOworCWlmIChlbHNfY21kLT5lbHNfY29kZSAhPSBGQ19FTFNfQUNDKQorCQlyZXR1cm4gRkNfUEFSU0VfRkFJTFVSRTsKKworCXJldHVybiBGQ19QQVJTRV9PSzsKK30KKwordTE2CitmY19wZGlzY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB1MzIgZF9pZCwgdTMyIHNfaWQsCisJCQl1MTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSwgd3duX3Qgbm9kZV9uYW1lLAorCQkJdTE2IHBkdV9zaXplKQoreworCXN0cnVjdCBmY19sb2dpX3MgICAgICpwZGlzYyA9IChzdHJ1Y3QgZmNfbG9naV9zICopIChmY2hzICsgMSk7CisKKwliZmFfb3NfbWVtY3B5KHBkaXNjLCAmcGxvZ2lfdG1wbCwgc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpKTsKKworCXBkaXNjLT5lbHNfY21kLmVsc19jb2RlID0gRkNfRUxTX1BESVNDOworCWZjX2Vsc19yZXFfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCisJcGRpc2MtPmNzcC5yeHN6ID0gcGRpc2MtPmNsYXNzMy5yeHN6ID0gYmZhX29zX2h0b25zKHBkdV9zaXplKTsKKwlwZGlzYy0+cG9ydF9uYW1lID0gcG9ydF9uYW1lOworCXBkaXNjLT5ub2RlX25hbWUgPSBub2RlX25hbWU7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSk7Cit9CisKK3UxNgorZmNfcGRpc2NfcnNwX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmZjaHMsIGludCBsZW4sIHd3bl90IHBvcnRfbmFtZSkKK3sKKwlzdHJ1Y3QgZmNfbG9naV9zICAgICAqcGRpc2MgPSAoc3RydWN0IGZjX2xvZ2lfcyAqKSAoZmNocyArIDEpOworCisJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgZmNfbG9naV9zKSkKKwkJcmV0dXJuIChGQ19QQVJTRV9MRU5fSU5WQUwpOworCisJaWYgKHBkaXNjLT5lbHNfY21kLmVsc19jb2RlICE9IEZDX0VMU19BQ0MpCisJCXJldHVybiAoRkNfUEFSU0VfQUNDX0lOVkFMKTsKKworCWlmICghd3duX2lzX2VxdWFsKHBkaXNjLT5wb3J0X25hbWUsIHBvcnRfbmFtZSkpCisJCXJldHVybiAoRkNfUEFSU0VfUFdXTl9OT1RfRVFVQUwpOworCisJaWYgKCFwZGlzYy0+Y2xhc3MzLmNsYXNzX3ZhbGlkKQorCQlyZXR1cm4gKEZDX1BBUlNFX05XV05fTk9UX0VRVUFMKTsKKworCWlmIChiZmFfb3NfbnRvaHMocGRpc2MtPmNsYXNzMy5yeHN6KSA8IChGQ19NSU5fUERVU1opKQorCQlyZXR1cm4gKEZDX1BBUlNFX1JYU1pfSU5WQUwpOworCisJcmV0dXJuIChGQ19QQVJTRV9PSyk7Cit9CisKK3UxNgorZmNfcHJsb19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkgICAgICBpbnQgbnVtX3BhZ2VzKQoreworCXN0cnVjdCBmY19wcmxvX3MgICAgICAqcHJsbyA9IChzdHJ1Y3QgZmNfcHJsb19zICopIChmY2hzICsgMSk7CisJaW50ICAgICAgICAgICAgIHBhZ2U7CisKKwlmY19lbHNfcmVxX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKKwltZW1zZXQocHJsbywgMCwgKG51bV9wYWdlcyAqIDE2KSArIDQpOworCXBybG8tPmNvbW1hbmQgPSBGQ19FTFNfUFJMTzsKKwlwcmxvLT5wYWdlX2xlbiA9IDB4MTA7CisJcHJsby0+cGF5bG9hZF9sZW4gPSBiZmFfb3NfaHRvbnMoKG51bV9wYWdlcyAqIDE2KSArIDQpOworCisJZm9yIChwYWdlID0gMDsgcGFnZSA8IG51bV9wYWdlczsgcGFnZSsrKSB7CisJCXBybG8tPnBybG9fcGFyYW1zW3BhZ2VdLnR5cGUgPSBGQ19UWVBFX0ZDUDsKKwkJcHJsby0+cHJsb19wYXJhbXNbcGFnZV0ub3BhX3ZhbGlkID0gMDsKKwkJcHJsby0+cHJsb19wYXJhbXNbcGFnZV0ucnBhX3ZhbGlkID0gMDsKKwkJcHJsby0+cHJsb19wYXJhbXNbcGFnZV0ub3JpZ19wcm9jZXNzX2Fzc2MgPSAwOworCQlwcmxvLT5wcmxvX3BhcmFtc1twYWdlXS5yZXNwX3Byb2Nlc3NfYXNzYyA9IDA7CisJfQorCisJcmV0dXJuIChiZmFfb3NfbnRvaHMocHJsby0+cGF5bG9hZF9sZW4pKTsKK30KKwordTE2CitmY19wcmxvX3JzcF9wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzLCBpbnQgbGVuKQoreworCXN0cnVjdCBmY19wcmxvX2FjY19zICAqcHJsbyA9IChzdHJ1Y3QgZmNfcHJsb19hY2NfcyAqKSAoZmNocyArIDEpOworCWludCAgICAgICAgICAgICBudW1fcGFnZXMgPSAwOworCWludCAgICAgICAgICAgICBwYWdlID0gMDsKKworCWxlbiA9IGxlbjsKKworCWlmIChwcmxvLT5jb21tYW5kICE9IEZDX0VMU19BQ0MpCisJCXJldHVybiAoRkNfUEFSU0VfRkFJTFVSRSk7CisKKwludW1fcGFnZXMgPSAoKGJmYV9vc19udG9ocyhwcmxvLT5wYXlsb2FkX2xlbikpIC0gNCkgLyAxNjsKKworCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBudW1fcGFnZXM7IHBhZ2UrKykgeworCQlpZiAocHJsby0+cHJsb19hY2NfcGFyYW1zW3BhZ2VdLnR5cGUgIT0gRkNfVFlQRV9GQ1ApCisJCQlyZXR1cm4gRkNfUEFSU0VfRkFJTFVSRTsKKworCQlpZiAocHJsby0+cHJsb19hY2NfcGFyYW1zW3BhZ2VdLm9wYV92YWxpZCAhPSAwKQorCQkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CisKKwkJaWYgKHBybG8tPnBybG9fYWNjX3BhcmFtc1twYWdlXS5ycGFfdmFsaWQgIT0gMCkKKwkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOworCisJCWlmIChwcmxvLT5wcmxvX2FjY19wYXJhbXNbcGFnZV0ub3JpZ19wcm9jZXNzX2Fzc2MgIT0gMCkKKwkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOworCisJCWlmIChwcmxvLT5wcmxvX2FjY19wYXJhbXNbcGFnZV0ucmVzcF9wcm9jZXNzX2Fzc2MgIT0gMCkKKwkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gKEZDX1BBUlNFX09LKTsKKworfQorCit1MTYKK2ZjX3RwcmxvX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJCXUxNiBveF9pZCwgaW50IG51bV9wYWdlcywKKwkJCWVudW0gZmNfdHBybG9fdHlwZSB0cHJsb190eXBlLCB1MzIgdHByX2lkKQoreworCXN0cnVjdCBmY190cHJsb19zICAgICAqdHBybG8gPSAoc3RydWN0IGZjX3RwcmxvX3MgKikgKGZjaHMgKyAxKTsKKwlpbnQgICAgICAgICAgICAgcGFnZTsKKworCWZjX2Vsc19yZXFfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCW1lbXNldCh0cHJsbywgMCwgKG51bV9wYWdlcyAqIDE2KSArIDQpOworCXRwcmxvLT5jb21tYW5kID0gRkNfRUxTX1RQUkxPOworCXRwcmxvLT5wYWdlX2xlbiA9IDB4MTA7CisJdHBybG8tPnBheWxvYWRfbGVuID0gYmZhX29zX2h0b25zKChudW1fcGFnZXMgKiAxNikgKyA0KTsKKworCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBudW1fcGFnZXM7IHBhZ2UrKykgeworCQl0cHJsby0+dHBybG9fcGFyYW1zW3BhZ2VdLnR5cGUgPSBGQ19UWVBFX0ZDUDsKKwkJdHBybG8tPnRwcmxvX3BhcmFtc1twYWdlXS5vcGFfdmFsaWQgPSAwOworCQl0cHJsby0+dHBybG9fcGFyYW1zW3BhZ2VdLnJwYV92YWxpZCA9IDA7CisJCXRwcmxvLT50cHJsb19wYXJhbXNbcGFnZV0ub3JpZ19wcm9jZXNzX2Fzc2MgPSAwOworCQl0cHJsby0+dHBybG9fcGFyYW1zW3BhZ2VdLnJlc3BfcHJvY2Vzc19hc3NjID0gMDsKKwkJaWYgKHRwcmxvX3R5cGUgPT0gRkNfR0xPQkFMX0xPR08pIHsKKwkJCXRwcmxvLT50cHJsb19wYXJhbXNbcGFnZV0uZ2xvYmFsX3Byb2Nlc3NfbG9nb3V0ID0gMTsKKwkJfSBlbHNlIGlmICh0cHJsb190eXBlID09IEZDX1RQUl9MT0dPKSB7CisJCQl0cHJsby0+dHBybG9fcGFyYW1zW3BhZ2VdLnRwb19ucG9ydF92YWxpZCA9IDE7CisJCQl0cHJsby0+dHBybG9fcGFyYW1zW3BhZ2VdLnRwb19ucG9ydF9pZCA9ICh0cHJfaWQpOworCQl9CisJfQorCisJcmV0dXJuIChiZmFfb3NfbnRvaHModHBybG8tPnBheWxvYWRfbGVuKSk7Cit9CisKK3UxNgorZmNfdHBybG9fcnNwX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmZjaHMsIGludCBsZW4pCit7CisJc3RydWN0IGZjX3RwcmxvX2FjY19zICp0cHJsbyA9IChzdHJ1Y3QgZmNfdHBybG9fYWNjX3MgKikgKGZjaHMgKyAxKTsKKwlpbnQgICAgICAgICAgICAgbnVtX3BhZ2VzID0gMDsKKwlpbnQgICAgICAgICAgICAgcGFnZSA9IDA7CisKKwlsZW4gPSBsZW47CisKKwlpZiAodHBybG8tPmNvbW1hbmQgIT0gRkNfRUxTX0FDQykKKwkJcmV0dXJuIChGQ19QQVJTRV9BQ0NfSU5WQUwpOworCisJbnVtX3BhZ2VzID0gKGJmYV9vc19udG9ocyh0cHJsby0+cGF5bG9hZF9sZW4pIC0gNCkgLyAxNjsKKworCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBudW1fcGFnZXM7IHBhZ2UrKykgeworCQlpZiAodHBybG8tPnRwcmxvX2FjY19wYXJhbXNbcGFnZV0udHlwZSAhPSBGQ19UWVBFX0ZDUCkKKwkJCXJldHVybiAoRkNfUEFSU0VfTk9UX0ZDUCk7CisJCWlmICh0cHJsby0+dHBybG9fYWNjX3BhcmFtc1twYWdlXS5vcGFfdmFsaWQgIT0gMCkKKwkJCXJldHVybiAoRkNfUEFSU0VfT1BBRkxBR19JTlZBTCk7CisJCWlmICh0cHJsby0+dHBybG9fYWNjX3BhcmFtc1twYWdlXS5ycGFfdmFsaWQgIT0gMCkKKwkJCXJldHVybiAoRkNfUEFSU0VfUlBBRkxBR19JTlZBTCk7CisJCWlmICh0cHJsby0+dHBybG9fYWNjX3BhcmFtc1twYWdlXS5vcmlnX3Byb2Nlc3NfYXNzYyAhPSAwKQorCQkJcmV0dXJuIChGQ19QQVJTRV9PUEFfSU5WQUwpOworCQlpZiAodHBybG8tPnRwcmxvX2FjY19wYXJhbXNbcGFnZV0ucmVzcF9wcm9jZXNzX2Fzc2MgIT0gMCkKKwkJCXJldHVybiAoRkNfUEFSU0VfUlBBX0lOVkFMKTsKKwl9CisJcmV0dXJuIChGQ19QQVJTRV9PSyk7Cit9CisKK2VudW0gZmNfcGFyc2Vfc3RhdHVzCitmY19ycnFfcnNwX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmZjaHMsIGludCBsZW4pCit7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICplbHNfY21kID0gKHN0cnVjdCBmY19lbHNfY21kX3MgKikgKGZjaHMgKyAxKTsKKworCWxlbiA9IGxlbjsKKwlpZiAoZWxzX2NtZC0+ZWxzX2NvZGUgIT0gRkNfRUxTX0FDQykKKwkJcmV0dXJuIEZDX1BBUlNFX0ZBSUxVUkU7CisKKwlyZXR1cm4gRkNfUEFSU0VfT0s7Cit9CisKK3UxNgorZmNfYmFfcmp0X2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJCXUxNiBveF9pZCwgdTMyIHJlYXNvbl9jb2RlLAorCQkJdTMyIHJlYXNvbl9leHBsKQoreworCXN0cnVjdCBmY19iYV9yanRfcyAgICAqYmFfcmp0ID0gKHN0cnVjdCBmY19iYV9yanRfcyAqKSAoZmNocyArIDEpOworCisJZmNfYmxzX3JzcF9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisKKwlmY2hzLT5jYXRfaW5mbyA9IEZDX0NBVF9CQV9SSlQ7CisJYmFfcmp0LT5yZWFzb25fY29kZSA9IHJlYXNvbl9jb2RlOworCWJhX3JqdC0+cmVhc29uX2V4cGwgPSByZWFzb25fZXhwbDsKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNfYmFfcmp0X3MpKTsKK30KKworc3RhdGljIHZvaWQKK2ZjX2dzX2N0aGRyX2J1aWxkKHN0cnVjdCBjdF9oZHJfcyAqY3RoZHIsIHUzMiBzX2lkLCB1MTYgY21kX2NvZGUpCit7CisJYmZhX29zX21lbXNldChjdGhkciwgMCwgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworCWN0aGRyLT5yZXZfaWQgPSBDVF9HUzNfUkVWSVNJT047CisJY3RoZHItPmdzX3R5cGUgPSBDVF9HU1RZUEVfRElSU0VSVklDRTsKKwljdGhkci0+Z3Nfc3ViX3R5cGUgPSBDVF9HU1NVQlRZUEVfTkFNRVNFUlZFUjsKKwljdGhkci0+Y21kX3JzcF9jb2RlID0gYmZhX29zX2h0b25zKGNtZF9jb2RlKTsKK30KKworc3RhdGljIHZvaWQKK2ZjX2dzX2ZkbWlfY3RoZHJfYnVpbGQoc3RydWN0IGN0X2hkcl9zICpjdGhkciwgdTMyIHNfaWQsIHUxNiBjbWRfY29kZSkKK3sKKwliZmFfb3NfbWVtc2V0KGN0aGRyLCAwLCBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSk7CisJY3RoZHItPnJldl9pZCA9IENUX0dTM19SRVZJU0lPTjsKKwljdGhkci0+Z3NfdHlwZSA9IENUX0dTVFlQRV9NR01UU0VSVklDRTsKKwljdGhkci0+Z3Nfc3ViX3R5cGUgPSBDVF9HU1NVQlRZUEVfSEJBX01HTVRTRVJWRVI7CisJY3RoZHItPmNtZF9yc3BfY29kZSA9IGJmYV9vc19odG9ucyhjbWRfY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitmY19nc19tc19jdGhkcl9idWlsZChzdHJ1Y3QgY3RfaGRyX3MgKmN0aGRyLCB1MzIgc19pZCwgdTE2IGNtZF9jb2RlLAorCQkJCQkgdTggc3ViX3R5cGUpCit7CisJYmZhX29zX21lbXNldChjdGhkciwgMCwgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworCWN0aGRyLT5yZXZfaWQgPSBDVF9HUzNfUkVWSVNJT047CisJY3RoZHItPmdzX3R5cGUgPSBDVF9HU1RZUEVfTUdNVFNFUlZJQ0U7CisJY3RoZHItPmdzX3N1Yl90eXBlID0gc3ViX3R5cGU7CisJY3RoZHItPmNtZF9yc3BfY29kZSA9IGJmYV9vc19odG9ucyhjbWRfY29kZSk7Cit9CisKK3UxNgorZmNfZ2lkcG5fYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkgICAgICAgd3duX3QgcG9ydF9uYW1lKQoreworCisJc3RydWN0IGN0X2hkcl9zICAgICAgICpjdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgcHlsZDsKKwlzdHJ1Y3QgZmNnc19naWRwbl9yZXFfcyAqZ2lkcG4gPQorCQkJKHN0cnVjdCBmY2dzX2dpZHBuX3JlcV9zICopIChjdGhkciArIDEpOworCXUzMiAgICAgICAgZF9pZCA9IGJmYV9vc19odG9uM2IoRkNfTkFNRV9TRVJWRVIpOworCisJZmNfZ3NfZmNoZHJfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCWZjX2dzX2N0aGRyX2J1aWxkKGN0aGRyLCBzX2lkLCBHU19HSURfUE4pOworCisJYmZhX29zX21lbXNldChnaWRwbiwgMCwgc2l6ZW9mKHN0cnVjdCBmY2dzX2dpZHBuX3JlcV9zKSk7CisJZ2lkcG4tPnBvcnRfbmFtZSA9IHBvcnRfbmFtZTsKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19naWRwbl9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSk7Cit9CisKK3UxNgorZmNfZ3BuaWRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkgICAgICAgdTMyIHBvcnRfaWQpCit7CisKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgKmN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBweWxkOworCWZjZ3NfZ3BuaWRfcmVxX3QgKmdwbmlkID0gKGZjZ3NfZ3BuaWRfcmVxX3QgKikgKGN0aGRyICsgMSk7CisJdTMyICAgICAgICBkX2lkID0gYmZhX29zX2h0b24zYihGQ19OQU1FX1NFUlZFUik7CisKKwlmY19nc19mY2hkcl9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisJZmNfZ3NfY3RoZHJfYnVpbGQoY3RoZHIsIHNfaWQsIEdTX0dQTl9JRCk7CisKKwliZmFfb3NfbWVtc2V0KGdwbmlkLCAwLCBzaXplb2YoZmNnc19ncG5pZF9yZXFfdCkpOworCWdwbmlkLT5kYXAgPSBwb3J0X2lkOworCXJldHVybiAoc2l6ZW9mKGZjZ3NfZ3BuaWRfcmVxX3QpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworfQorCit1MTYKK2ZjX2dubmlkX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLCB1MTYgb3hfaWQsCisJICAgICAgIHUzMiBwb3J0X2lkKQoreworCisJc3RydWN0IGN0X2hkcl9zICAgICAgICpjdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgcHlsZDsKKwlmY2dzX2dubmlkX3JlcV90ICpnbm5pZCA9IChmY2dzX2dubmlkX3JlcV90ICopIChjdGhkciArIDEpOworCXUzMiAgICAgICAgZF9pZCA9IGJmYV9vc19odG9uM2IoRkNfTkFNRV9TRVJWRVIpOworCisJZmNfZ3NfZmNoZHJfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCWZjX2dzX2N0aGRyX2J1aWxkKGN0aGRyLCBzX2lkLCBHU19HTk5fSUQpOworCisJYmZhX29zX21lbXNldChnbm5pZCwgMCwgc2l6ZW9mKGZjZ3NfZ25uaWRfcmVxX3QpKTsKKwlnbm5pZC0+ZGFwID0gcG9ydF9pZDsKKwlyZXR1cm4gKHNpemVvZihmY2dzX2dubmlkX3JlcV90KSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKK30KKwordTE2CitmY19jdF9yc3BfcGFyc2Uoc3RydWN0IGN0X2hkcl9zICpjdGhkcikKK3sKKwlpZiAoYmZhX29zX250b2hzKGN0aGRyLT5jbWRfcnNwX2NvZGUpICE9IENUX1JTUF9BQ0NFUFQpIHsKKwkJaWYgKGN0aGRyLT5yZWFzb25fY29kZSA9PSBDVF9SU05fTE9HSUNBTF9CVVNZKQorCQkJcmV0dXJuIEZDX1BBUlNFX0JVU1k7CisJCWVsc2UKKwkJCXJldHVybiBGQ19QQVJTRV9GQUlMVVJFOworCX0KKworCXJldHVybiBGQ19QQVJTRV9PSzsKK30KKwordTE2CitmY19zY3JfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3Njcl9zICpzY3IsIHU4IHNldF9icl9yZWcsCisJCQl1MzIgc19pZCwgdTE2IG94X2lkKQoreworCXUzMiAgICAgICAgZF9pZCA9IGJmYV9vc19odG9uM2IoRkNfRkFCUklDX0NPTlRST0xMRVIpOworCisJZmNfZWxzX3JlcV9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisKKwliZmFfb3NfbWVtc2V0KHNjciwgMCwgc2l6ZW9mKHN0cnVjdCBmY19zY3JfcykpOworCXNjci0+Y29tbWFuZCA9IEZDX0VMU19TQ1I7CisJc2NyLT5yZWdfZnVuYyA9IEZDX1NDUl9SRUdfRlVOQ19GVUxMOworCWlmIChzZXRfYnJfcmVnKQorCQlzY3ItPnZ1X3JlZ19mdW5jID0gRkNfVlVfU0NSX1JFR19GVU5DX0ZBQlJJQ19OQU1FX0NIQU5HRTsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY19zY3JfcykpOworfQorCit1MTYKK2ZjX3JzY25fYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3JzY25fcGxfcyAqcnNjbiwgdTMyIHNfaWQsCisJCQl1MTYgb3hfaWQpCit7CisJdTMyICAgICAgICBkX2lkID0gYmZhX29zX2h0b24zYihGQ19GQUJSSUNfQ09OVFJPTExFUik7CisJdTE2ICAgICAgICBwYXlsZGxlbjsKKworCWZjX2Vsc19yZXFfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCXJzY24tPmNvbW1hbmQgPSBGQ19FTFNfUlNDTjsKKwlyc2NuLT5wYWdlbGVuID0gc2l6ZW9mKHJzY24tPmV2ZW50WzBdKTsKKworCXBheWxkbGVuID0gc2l6ZW9mKHUzMikgKyByc2NuLT5wYWdlbGVuOworCXJzY24tPnBheWxkbGVuID0gYmZhX29zX2h0b25zKHBheWxkbGVuKTsKKworCXJzY24tPmV2ZW50WzBdLmZvcm1hdCA9IEZDX1JTQ05fRk9STUFUX1BPUlRJRDsKKwlyc2NuLT5ldmVudFswXS5wb3J0aWQgPSBzX2lkOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjX3JzY25fcGxfcykpOworfQorCit1MTYKK2ZjX3JmdGlkX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLCB1MTYgb3hfaWQsCisJICAgICAgIGVudW0gYmZhX3BvcnRfcm9sZSByb2xlcykKK3sKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgKmN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBweWxkOworCXN0cnVjdCBmY2dzX3JmdGlkX3JlcV9zICpyZnRpZCA9CisJCQkoc3RydWN0IGZjZ3NfcmZ0aWRfcmVxX3MgKikgKGN0aGRyICsgMSk7CisJdTMyICAgICAgICB0eXBlX3ZhbHVlLCBkX2lkID0gYmZhX29zX2h0b24zYihGQ19OQU1FX1NFUlZFUik7CisJdTggICAgICAgICBpbmRleDsKKworCWZjX2dzX2ZjaGRyX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKKwlmY19nc19jdGhkcl9idWlsZChjdGhkciwgc19pZCwgR1NfUkZUX0lEKTsKKworCWJmYV9vc19tZW1zZXQocmZ0aWQsIDAsIHNpemVvZihzdHJ1Y3QgZmNnc19yZnRpZF9yZXFfcykpOworCisJcmZ0aWQtPmRhcCA9IHNfaWQ7CisKKwkvKiBCeSBkZWZhdWx0LCBGQ1AgRkM0IFR5cGUgaXMgcmVnaXN0ZXJlZCAqLworCWluZGV4ID0gRkNfVFlQRV9GQ1AgPj4gNTsKKwl0eXBlX3ZhbHVlID0gMSA8PCAoRkNfVFlQRV9GQ1AgJSAzMik7CisJcmZ0aWQtPmZjNF90eXBlW2luZGV4XSA9IGJmYV9vc19odG9ubCh0eXBlX3ZhbHVlKTsKKworCWlmIChyb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lQRkMpIHsKKwkJaW5kZXggPSBGQ19UWVBFX0lQID4+IDU7CisJCXR5cGVfdmFsdWUgPSAxIDw8IChGQ19UWVBFX0lQICUgMzIpOworCQlyZnRpZC0+ZmM0X3R5cGVbaW5kZXhdIHw9IGJmYV9vc19odG9ubCh0eXBlX3ZhbHVlKTsKKwl9CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19yZnRpZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSk7Cit9CisKK3UxNgorZmNfcmZ0aWRfYnVpbGRfc29sKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLAorCQkJdTE2IG94X2lkLCB1OCAqZmM0X2JpdG1hcCwKKwkJCXUzMiBiaXRtYXBfc2l6ZSkKK3sKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgKmN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBweWxkOworCXN0cnVjdCBmY2dzX3JmdGlkX3JlcV9zICpyZnRpZCA9CisJCQkoc3RydWN0IGZjZ3NfcmZ0aWRfcmVxX3MgKikgKGN0aGRyICsgMSk7CisJdTMyICAgICAgICBkX2lkID0gYmZhX29zX2h0b24zYihGQ19OQU1FX1NFUlZFUik7CisKKwlmY19nc19mY2hkcl9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisJZmNfZ3NfY3RoZHJfYnVpbGQoY3RoZHIsIHNfaWQsIEdTX1JGVF9JRCk7CisKKwliZmFfb3NfbWVtc2V0KHJmdGlkLCAwLCBzaXplb2Yoc3RydWN0IGZjZ3NfcmZ0aWRfcmVxX3MpKTsKKworCXJmdGlkLT5kYXAgPSBzX2lkOworCWJmYV9vc19tZW1jcHkoKHZvaWQgKilyZnRpZC0+ZmM0X3R5cGUsICh2b2lkICopZmM0X2JpdG1hcCwKKwkJCShiaXRtYXBfc2l6ZSA8IDMyID8gYml0bWFwX3NpemUgOiAzMikpOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjZ3NfcmZ0aWRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworfQorCit1MTYKK2ZjX3JmZmlkX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLCB1MTYgb3hfaWQsCisJICAgICAgIHU4IGZjNF90eXBlLCB1OCBmYzRfZnRycykKK3sKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgICAqY3RoZHIgPSAoc3RydWN0IGN0X2hkcl9zICopIHB5bGQ7CisJc3RydWN0IGZjZ3NfcmZmaWRfcmVxX3MgKnJmZmlkID0KKwkJCShzdHJ1Y3QgZmNnc19yZmZpZF9yZXFfcyAqKSAoY3RoZHIgKyAxKTsKKwl1MzIgICAgICAgICBkX2lkID0gYmZhX29zX2h0b24zYihGQ19OQU1FX1NFUlZFUik7CisKKwlmY19nc19mY2hkcl9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCBveF9pZCk7CisJZmNfZ3NfY3RoZHJfYnVpbGQoY3RoZHIsIHNfaWQsIEdTX1JGRl9JRCk7CisKKwliZmFfb3NfbWVtc2V0KHJmZmlkLCAwLCBzaXplb2Yoc3RydWN0IGZjZ3NfcmZmaWRfcmVxX3MpKTsKKworCXJmZmlkLT5kYXAgCQkgCT0gc19pZDsKKwlyZmZpZC0+ZmM0ZnRyX2JpdHMgID0gZmM0X2Z0cnM7CisJcmZmaWQtPmZjNF90eXBlCQk9IGZjNF90eXBlOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjZ3NfcmZmaWRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworfQorCit1MTYKK2ZjX3JzcG5pZF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpweWxkLCB1MzIgc19pZCwgdTE2IG94X2lkLAorCQl1OCAqbmFtZSkKK3sKKworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSAoc3RydWN0IGN0X2hkcl9zICopIHB5bGQ7CisJc3RydWN0IGZjZ3NfcnNwbmlkX3JlcV9zICpyc3BuaWQgPQorCQkJKHN0cnVjdCBmY2dzX3JzcG5pZF9yZXFfcyAqKSAoY3RoZHIgKyAxKTsKKwl1MzIgICAgICAgIGRfaWQgPSBiZmFfb3NfaHRvbjNiKEZDX05BTUVfU0VSVkVSKTsKKworCWZjX2dzX2ZjaGRyX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKKwlmY19nc19jdGhkcl9idWlsZChjdGhkciwgc19pZCwgR1NfUlNQTl9JRCk7CisKKwliZmFfb3NfbWVtc2V0KHJzcG5pZCwgMCwgc2l6ZW9mKHN0cnVjdCBmY2dzX3JzcG5pZF9yZXFfcykpOworCisJcnNwbmlkLT5kYXAgPSBzX2lkOworCXJzcG5pZC0+c3BuX2xlbiA9ICh1OCkgc3RybGVuKChjaGFyICopbmFtZSk7CisJc3RybmNweSgoY2hhciAqKXJzcG5pZC0+c3BuLCAoY2hhciAqKW5hbWUsIHJzcG5pZC0+c3BuX2xlbik7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19yc3BuaWRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworfQorCit1MTYKK2ZjX2dpZF9mdF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpweWxkLCB1MzIgc19pZCwKKwkJCXU4IGZjNF90eXBlKQoreworCisJc3RydWN0IGN0X2hkcl9zICAgICAgICpjdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgcHlsZDsKKwlzdHJ1Y3QgZmNnc19naWRmdF9yZXFfcyAqZ2lkZnQgPQorCQkJKHN0cnVjdCBmY2dzX2dpZGZ0X3JlcV9zICopIChjdGhkciArIDEpOworCXUzMiAgICAgICAgZF9pZCA9IGJmYV9vc19odG9uM2IoRkNfTkFNRV9TRVJWRVIpOworCisJZmNfZ3NfZmNoZHJfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgMCk7CisKKwlmY19nc19jdGhkcl9idWlsZChjdGhkciwgc19pZCwgR1NfR0lEX0ZUKTsKKworCWJmYV9vc19tZW1zZXQoZ2lkZnQsIDAsIHNpemVvZihzdHJ1Y3QgZmNnc19naWRmdF9yZXFfcykpOworCWdpZGZ0LT5mYzRfdHlwZSA9IGZjNF90eXBlOworCWdpZGZ0LT5kb21haW5faWQgPSAwOworCWdpZGZ0LT5hcmVhX2lkID0gMDsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY2dzX2dpZGZ0X3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKK30KKwordTE2CitmY19ycG5pZF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpweWxkLCB1MzIgc19pZCwgdTMyIHBvcnRfaWQsCisJICAgICAgIHd3bl90IHBvcnRfbmFtZSkKK3sKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgKmN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBweWxkOworCXN0cnVjdCBmY2dzX3JwbmlkX3JlcV9zICpycG5pZCA9CisJCQkoc3RydWN0IGZjZ3NfcnBuaWRfcmVxX3MgKikgKGN0aGRyICsgMSk7CisJdTMyICAgICAgICBkX2lkID0gYmZhX29zX2h0b24zYihGQ19OQU1FX1NFUlZFUik7CisKKwlmY19nc19mY2hkcl9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCAwKTsKKwlmY19nc19jdGhkcl9idWlsZChjdGhkciwgc19pZCwgR1NfUlBOX0lEKTsKKworCWJmYV9vc19tZW1zZXQocnBuaWQsIDAsIHNpemVvZihzdHJ1Y3QgZmNnc19ycG5pZF9yZXFfcykpOworCXJwbmlkLT5wb3J0X2lkID0gcG9ydF9pZDsKKwlycG5pZC0+cG9ydF9uYW1lID0gcG9ydF9uYW1lOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGZjZ3NfcnBuaWRfcmVxX3MpICsgc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworfQorCit1MTYKK2ZjX3JubmlkX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLCB1MzIgcG9ydF9pZCwKKwkgICAgICAgd3duX3Qgbm9kZV9uYW1lKQoreworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSAoc3RydWN0IGN0X2hkcl9zICopIHB5bGQ7CisJc3RydWN0IGZjZ3Nfcm5uaWRfcmVxX3MgKnJubmlkID0KKwkJCShzdHJ1Y3QgZmNnc19ybm5pZF9yZXFfcyAqKSAoY3RoZHIgKyAxKTsKKwl1MzIgICAgICAgIGRfaWQgPSBiZmFfb3NfaHRvbjNiKEZDX05BTUVfU0VSVkVSKTsKKworCWZjX2dzX2ZjaGRyX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIDApOworCWZjX2dzX2N0aGRyX2J1aWxkKGN0aGRyLCBzX2lkLCBHU19STk5fSUQpOworCisJYmZhX29zX21lbXNldChybm5pZCwgMCwgc2l6ZW9mKHN0cnVjdCBmY2dzX3JubmlkX3JlcV9zKSk7CisJcm5uaWQtPnBvcnRfaWQgPSBwb3J0X2lkOworCXJubmlkLT5ub2RlX25hbWUgPSBub2RlX25hbWU7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19ybm5pZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSk7Cit9CisKK3UxNgorZmNfcmNzaWRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsIHUzMiBwb3J0X2lkLAorCSAgICAgICB1MzIgY29zKQoreworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSAoc3RydWN0IGN0X2hkcl9zICopIHB5bGQ7CisJc3RydWN0IGZjZ3NfcmNzaWRfcmVxX3MgKnJjc2lkID0KKwkJCShzdHJ1Y3QgZmNnc19yY3NpZF9yZXFfcyAqKSAoY3RoZHIgKyAxKTsKKwl1MzIgICAgICAgIGRfaWQgPSBiZmFfb3NfaHRvbjNiKEZDX05BTUVfU0VSVkVSKTsKKworCWZjX2dzX2ZjaGRyX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIDApOworCWZjX2dzX2N0aGRyX2J1aWxkKGN0aGRyLCBzX2lkLCBHU19SQ1NfSUQpOworCisJYmZhX29zX21lbXNldChyY3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBmY2dzX3Jjc2lkX3JlcV9zKSk7CisJcmNzaWQtPnBvcnRfaWQgPSBwb3J0X2lkOworCXJjc2lkLT5jb3MgPSBjb3M7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZmNnc19yY3NpZF9yZXFfcykgKyBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSk7Cit9CisKK3UxNgorZmNfcnB0aWRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsIHUzMiBwb3J0X2lkLAorCSAgICAgICB1OCBwb3J0X3R5cGUpCit7CisJc3RydWN0IGN0X2hkcl9zICAgICAgICpjdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgcHlsZDsKKwlzdHJ1Y3QgZmNnc19ycHRpZF9yZXFfcyAqcnB0aWQgPQorCQkJKHN0cnVjdCBmY2dzX3JwdGlkX3JlcV9zICopIChjdGhkciArIDEpOworCXUzMiAgICAgICAgZF9pZCA9IGJmYV9vc19odG9uM2IoRkNfTkFNRV9TRVJWRVIpOworCisJZmNfZ3NfZmNoZHJfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgMCk7CisJZmNfZ3NfY3RoZHJfYnVpbGQoY3RoZHIsIHNfaWQsIEdTX1JQVF9JRCk7CisKKwliZmFfb3NfbWVtc2V0KHJwdGlkLCAwLCBzaXplb2Yoc3RydWN0IGZjZ3NfcnB0aWRfcmVxX3MpKTsKKwlycHRpZC0+cG9ydF9pZCA9IHBvcnRfaWQ7CisJcnB0aWQtPnBvcnRfdHlwZSA9IHBvcnRfdHlwZTsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBmY2dzX3JwdGlkX3JlcV9zKSArIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKK30KKwordTE2CitmY19nYW54dF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpweWxkLCB1MzIgc19pZCwgdTMyIHBvcnRfaWQpCit7CisJc3RydWN0IGN0X2hkcl9zICAgICAgICpjdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgcHlsZDsKKwlzdHJ1Y3QgZmNnc19nYW54dF9yZXFfcyAqZ2FueHQgPQorCQkJKHN0cnVjdCBmY2dzX2dhbnh0X3JlcV9zICopIChjdGhkciArIDEpOworCXUzMiAgICAgICAgZF9pZCA9IGJmYV9vc19odG9uM2IoRkNfTkFNRV9TRVJWRVIpOworCisJZmNfZ3NfZmNoZHJfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgMCk7CisJZmNfZ3NfY3RoZHJfYnVpbGQoY3RoZHIsIHNfaWQsIEdTX0dBX05YVCk7CisKKwliZmFfb3NfbWVtc2V0KGdhbnh0LCAwLCBzaXplb2Yoc3RydWN0IGZjZ3NfZ2FueHRfcmVxX3MpKTsKKwlnYW54dC0+cG9ydF9pZCA9IHBvcnRfaWQ7CisKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpICsgc2l6ZW9mKHN0cnVjdCBmY2dzX2dhbnh0X3JlcV9zKSk7Cit9CisKKy8qCisgKiBCdWlsZHMgZmMgaGRyIGFuZCBjdCBoZHIgZm9yIEZETUkgcmVxdWVzdHMuCisgKi8KK3UxNgorZmNfZmRtaV9yZXFoZHJfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsCisJCSAgICAgdTE2IGNtZF9jb2RlKQoreworCisJc3RydWN0IGN0X2hkcl9zICAgICAgICpjdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgcHlsZDsKKwl1MzIgICAgICAgIGRfaWQgPSBiZmFfb3NfaHRvbjNiKEZDX01HTVRfU0VSVkVSKTsKKworCWZjX2dzX2ZjaGRyX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIDApOworCWZjX2dzX2ZkbWlfY3RoZHJfYnVpbGQoY3RoZHIsIHNfaWQsIGNtZF9jb2RlKTsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykpOworfQorCisvKgorICogR2l2ZW4gYSBGQzQgVHlwZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgZmM0IHR5cGUgYml0bWFzaworICovCit2b2lkCitmY19nZXRfZmM0dHlwZV9iaXRtYXNrKHU4IGZjNF90eXBlLCB1OCAqYml0X21hc2spCit7CisJdTggICAgICAgICBpbmRleDsKKwl1MzIgICAgICAgKnB0ciA9ICh1MzIgKikgYml0X21hc2s7CisJdTMyICAgICAgICB0eXBlX3ZhbHVlOworCisJLyoKKwkgKiBAdG9kbyA6IENoZWNrIGZvciBiaXRtYXNrIHNpemUKKwkgKi8KKworCWluZGV4ID0gZmM0X3R5cGUgPj4gNTsKKwl0eXBlX3ZhbHVlID0gMSA8PCAoZmM0X3R5cGUgJSAzMik7CisJcHRyW2luZGV4XSA9IGJmYV9vc19odG9ubCh0eXBlX3ZhbHVlKTsKKworfQorCisvKgorICogR01BTCBSZXF1ZXN0CisgKi8KK3UxNgorZmNfZ21hbF9yZXFfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsIHd3bl90IHd3bikKK3sKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgKmN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBweWxkOworCWZjZ3NfZ21hbF9yZXFfdCAqZ21hbCA9IChmY2dzX2dtYWxfcmVxX3QgKikgKGN0aGRyICsgMSk7CisJdTMyICAgICAgICBkX2lkID0gYmZhX29zX2h0b24zYihGQ19NR01UX1NFUlZFUik7CisKKwlmY19nc19mY2hkcl9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCAwKTsKKwlmY19nc19tc19jdGhkcl9idWlsZChjdGhkciwgc19pZCwgR1NfRkNfR01BTF9DTUQsCisJCQlDVF9HU1NVQlRZUEVfQ0ZHU0VSVkVSKTsKKworCWJmYV9vc19tZW1zZXQoZ21hbCwgMCwgc2l6ZW9mKGZjZ3NfZ21hbF9yZXFfdCkpOworCWdtYWwtPnd3biA9IHd3bjsKKworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBjdF9oZHJfcykgKyBzaXplb2YoZmNnc19nbWFsX3JlcV90KSk7Cit9CisKKy8qCisgKiBHRk4gKEdldCBGYWJyaWMgTmFtZSkgUmVxdWVzdAorICovCit1MTYKK2ZjX2dmbl9yZXFfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsIHd3bl90IHd3bikKK3sKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgKmN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBweWxkOworCWZjZ3NfZ2ZuX3JlcV90ICpnZm4gPSAoZmNnc19nZm5fcmVxX3QgKikgKGN0aGRyICsgMSk7CisJdTMyICAgICAgICBkX2lkID0gYmZhX29zX2h0b24zYihGQ19NR01UX1NFUlZFUik7CisKKwlmY19nc19mY2hkcl9idWlsZChmY2hzLCBkX2lkLCBzX2lkLCAwKTsKKwlmY19nc19tc19jdGhkcl9idWlsZChjdGhkciwgc19pZCwgR1NfRkNfR0ZOX0NNRCwKKwkJCUNUX0dTU1VCVFlQRV9DRkdTRVJWRVIpOworCisJYmZhX29zX21lbXNldChnZm4sIDAsIHNpemVvZihmY2dzX2dmbl9yZXFfdCkpOworCWdmbi0+d3duID0gd3duOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGN0X2hkcl9zKSArIHNpemVvZihmY2dzX2dmbl9yZXFfdCkpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY2J1aWxkLmggYi9kcml2ZXJzL3Njc2kvYmZhL2ZjYnVpbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI0ODQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9mY2J1aWxkLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKy8qCisgKiBmY2J1aWxkLmggLSBGQyBsaW5rIHNlcnZpY2UgZnJhbWUgYnVpbGRpbmcgYW5kIHBhcnNpbmcgcm91dGluZXMKKyAqLworCisjaWZuZGVmIF9fRkNCVUlMRF9IX18KKyNkZWZpbmUgX19GQ0JVSUxEX0hfXworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorI2luY2x1ZGUgPHByb3RvY29sL2ZjLmg+CisjaW5jbHVkZSA8cHJvdG9jb2wvZmNwLmg+CisjaW5jbHVkZSA8cHJvdG9jb2wvY3QuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BvcnQuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Bwb3J0Lmg+CisKKy8qCisgKiBVdGlsaXR5IE1hY3Jvcy9mdW5jdGlvbnMKKyAqLworCisjZGVmaW5lIGZjaWZfc29mX3NldChfaWZoZHIsIF9zb2YpCShfaWZoZHIpLT5zb2YgPSBGQ18gIyMgX3NvZgorI2RlZmluZSBmY2lmX2VvZl9zZXQoX2lmaGRyLCBfZW9mKQkoX2lmaGRyKS0+ZW9mID0gRkNfICMjIF9lb2YKKworI2RlZmluZSB3d25faXNfZXF1YWwoX3d3bjEsIF93d24yKQkJXAorCShtZW1jbXAoJihfd3duMSksICYoX3d3bjIpLCBzaXplb2Yod3duX3QpKSA9PSAwKQorCisjZGVmaW5lIGZjX3JvdW5kdXAoX2wsIF9zKSAoKChfbCkgKyAoKF9zKSAtIDEpKSAmIH4oKF9zKSAtIDEpKQorCisvKgorICogR2l2ZW4gdGhlIGZjIHJlc3BvbnNlIGxlbmd0aCwgdGhpcyByb3V0aW5lIHdpbGwgcmV0dXJuCisgKiB0aGUgbGVuZ3RoIG9mIHRoZSBhY3R1YWwgcGF5bG9hZCBieXRlcyBmb2xsb3dpbmcgdGhlIENUIGhlYWRlci4KKyAqCisgKiBBc3N1bWVzIHRoZSBpbnB1dCByZXNwb25zZSBsZW5ndGggZG9lcyBub3QgaW5jbHVkZSB0aGUgY3JjLCBlb2YsIGV0Yy4KKyAqLworc3RhdGljIGlubGluZSAgIHUzMgorZmNfZ2V0X2N0cmVzcF9weWxkX2xlbih1MzIgcmVzcF9sZW4pCit7CisJcmV0dXJuIChyZXNwX2xlbiAtIHNpemVvZihzdHJ1Y3QgY3RfaGRyX3MpKTsKK30KKworLyoKKyAqIENvbnZlcnQgYmZhIHNwZWVkIHRvIHJwc2Mgc3BlZWQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgZW51bSBiZmFfcHBvcnRfc3BlZWQKK2ZjX3Jwc2Nfb3BlcnNwZWVkX3RvX2JmYV9zcGVlZChlbnVtIGZjX3Jwc2Nfb3Bfc3BlZWRfcyBzcGVlZCkKK3sKKwlzd2l0Y2ggKHNwZWVkKSB7CisKKwljYXNlIFJQU0NfT1BfU1BFRURfMUc6CisJCXJldHVybiBCRkFfUFBPUlRfU1BFRURfMUdCUFM7CisKKwljYXNlIFJQU0NfT1BfU1BFRURfMkc6CisJCXJldHVybiBCRkFfUFBPUlRfU1BFRURfMkdCUFM7CisKKwljYXNlIFJQU0NfT1BfU1BFRURfNEc6CisJCXJldHVybiBCRkFfUFBPUlRfU1BFRURfNEdCUFM7CisKKwljYXNlIFJQU0NfT1BfU1BFRURfOEc6CisJCXJldHVybiBCRkFfUFBPUlRfU1BFRURfOEdCUFM7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gQkZBX1BQT1JUX1NQRUVEX1VOS05PV047CisJfQorfQorCisvKgorICogQ29udmVydCBSUFNDIHNwZWVkIHRvIGJmYSBzcGVlZCB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSAgIGVudW0gZmNfcnBzY19vcF9zcGVlZF9zCitmY19iZmFfc3BlZWRfdG9fcnBzY19vcGVyc3BlZWQoZW51bSBiZmFfcHBvcnRfc3BlZWQgb3Bfc3BlZWQpCit7CisJc3dpdGNoIChvcF9zcGVlZCkgeworCisJY2FzZSBCRkFfUFBPUlRfU1BFRURfMUdCUFM6CisJCXJldHVybiBSUFNDX09QX1NQRUVEXzFHOworCisJY2FzZSBCRkFfUFBPUlRfU1BFRURfMkdCUFM6CisJCXJldHVybiBSUFNDX09QX1NQRUVEXzJHOworCisJY2FzZSBCRkFfUFBPUlRfU1BFRURfNEdCUFM6CisJCXJldHVybiBSUFNDX09QX1NQRUVEXzRHOworCisJY2FzZSBCRkFfUFBPUlRfU1BFRURfOEdCUFM6CisJCXJldHVybiBSUFNDX09QX1NQRUVEXzhHOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIFJQU0NfT1BfU1BFRURfTk9UX0VTVDsKKwl9Cit9CitlbnVtIGZjX3BhcnNlX3N0YXR1cyB7CisJRkNfUEFSU0VfT0sgPSAwLAorCUZDX1BBUlNFX0ZBSUxVUkUgPSAxLAorCUZDX1BBUlNFX0JVU1kgPSAyLAorCUZDX1BBUlNFX0xFTl9JTlZBTCwKKwlGQ19QQVJTRV9BQ0NfSU5WQUwsCisJRkNfUEFSU0VfUFdXTl9OT1RfRVFVQUwsCisJRkNfUEFSU0VfTldXTl9OT1RfRVFVQUwsCisJRkNfUEFSU0VfUlhTWl9JTlZBTCwKKwlGQ19QQVJTRV9OT1RfRkNQLAorCUZDX1BBUlNFX09QQUZMQUdfSU5WQUwsCisJRkNfUEFSU0VfUlBBRkxBR19JTlZBTCwKKwlGQ19QQVJTRV9PUEFfSU5WQUwsCisJRkNfUEFSU0VfUlBBX0lOVkFMLAorCit9OworCitzdHJ1Y3QgZmNfdGVtcGxhdGVzX3MgeworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNfZWxzX3JlcTsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjX2Jsc19yZXE7CisJc3RydWN0IGZjX2xvZ2lfcyAgICAgIHBsb2dpOworCXN0cnVjdCBmY19ycnFfcyAgICAgICAgcnJxOworfTsKKwordm9pZCBmY2J1aWxkX2luaXQodm9pZCk7CisKK3UxNiBmY19mbG9naV9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfbG9naV9zICpmbG9naSwKKwkJCXUzMiBzX2lkLCB1MTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSwKKwkJCXd3bl90IG5vZGVfbmFtZSwgdTE2IHBkdV9zaXplLCB1OCBzZXRfbnBpdiwKKwkJCXU4IHNldF9hdXRoLCB1MTYgbG9jYWxfYmJfY3JlZGl0cyk7Cit1MTYgZmNfZmRpc2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqYnVmLCBzdHJ1Y3QgZmNfbG9naV9zICpmbG9naSwKKwkJCXUzMiBzX2lkLCB1MTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSwKKwkJCXd3bl90IG5vZGVfbmFtZSwgdTE2IHBkdV9zaXplKTsKK3UxNiBmY19mbG9naV9hY2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX2xvZ2lfcyAqZmxvZ2ksCisJCQl1MzIgc19pZCwgdTE2IG94X2lkLCB3d25fdCBwb3J0X25hbWUsCisJCQl3d25fdCBub2RlX25hbWUsIHUxNiBwZHVfc2l6ZSwKKwkJCXUxNiBsb2NhbF9iYl9jcmVkaXRzKTsKK3UxNiBmY19wbG9naV9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBkX2lkLAorCQkJdTMyIHNfaWQsIHUxNiBveF9pZCwgd3duX3QgcG9ydF9uYW1lLAorCQkJd3duX3Qgbm9kZV9uYW1lLCB1MTYgcGR1X3NpemUpOworZW51bSBmY19wYXJzZV9zdGF0dXMgZmNfcGxvZ2lfcGFyc2Uoc3RydWN0IGZjaHNfcyAqZmNocyk7Cit1MTYgZmNfYWJ0c19idWlsZChzdHJ1Y3QgZmNoc19zICpidWYsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJCXUxNiBveF9pZCk7CitlbnVtIGZjX3BhcnNlX3N0YXR1cyBmY19hYnRzX3JzcF9wYXJzZShzdHJ1Y3QgZmNoc19zICpidWYsIGludCBsZW4pOwordTE2IGZjX3JycV9idWlsZChzdHJ1Y3QgZmNoc19zICpidWYsIHN0cnVjdCBmY19ycnFfcyAqcnJxLCB1MzIgZF9pZCwKKwkJCXUzMiBzX2lkLCB1MTYgb3hfaWQsIHUxNiBycnFfb3hpZCk7CitlbnVtIGZjX3BhcnNlX3N0YXR1cyBmY19ycnFfcnNwX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmJ1ZiwgaW50IGxlbik7Cit1MTYgZmNfcnNwbmlkX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnBsZCwgdTMyIHNfaWQsCisJCQl1MTYgb3hfaWQsIHU4ICpuYW1lKTsKK3UxNiBmY19yZnRpZF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBzX2lkLAorCQkJdTE2IG94X2lkLCBlbnVtIGJmYV9wb3J0X3JvbGUgcm9sZSk7Cit1MTYgZmNfcmZ0aWRfYnVpbGRfc29sKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLAorCQkJdTE2IG94X2lkLCB1OCAqZmM0X2JpdG1hcCwKKwkJCXUzMiBiaXRtYXBfc2l6ZSk7Cit1MTYgZmNfcmZmaWRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsCisJCQl1MTYgb3hfaWQsIHU4IGZjNF90eXBlLCB1OCBmYzRfZnRycyk7Cit1MTYgZmNfZ2lkcG5fYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsCisJCQl1MTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSk7Cit1MTYgZmNfZ3BuaWRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcGxkLCB1MzIgc19pZCwKKwkJCXUxNiBveF9pZCwgdTMyIHBvcnRfaWQpOwordTE2IGZjX3Njcl9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfc2NyX3MgKnNjciwKKwkJCXU4IHNldF9icl9yZWcsIHUzMiBzX2lkLCB1MTYgb3hfaWQpOwordTE2IGZjX3Bsb2dpX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBkX2lkLAorCQkJdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCXd3bl90IHBvcnRfbmFtZSwgd3duX3Qgbm9kZV9uYW1lLCB1MTYgcGR1X3NpemUpOworCit1MTYgZmNfYWRpc2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX2FkaXNjX3MgKmFkaXNjLAorCQkJdTMyIGRfaWQsIHUzMiBzX2lkLCB1MTYgb3hfaWQsCisJCQl3d25fdCBwb3J0X25hbWUsIHd3bl90IG5vZGVfbmFtZSk7CitlbnVtIGZjX3BhcnNlX3N0YXR1cyBmY19hZGlzY19wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsCisJCQl1MzIgaG9zdF9kYXAsCisJCQl3d25fdCBub2RlX25hbWUsIHd3bl90IHBvcnRfbmFtZSk7CitlbnVtIGZjX3BhcnNlX3N0YXR1cyBmY19hZGlzY19yc3BfcGFyc2Uoc3RydWN0IGZjX2FkaXNjX3MgKmFkaXNjLCBpbnQgbGVuLAorCQkJd3duX3QgcG9ydF9uYW1lLCB3d25fdCBub2RlX25hbWUpOwordTE2IGZjX2FkaXNjX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfYWRpc2NfcyAqYWRpc2MsCisJCQl1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCXd3bl90IHBvcnRfbmFtZSwgd3duX3Qgbm9kZV9uYW1lKTsKK3UxNiBmY19sc19yanRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX2xzX3JqdF9zICpsc19yanQsCisJCQl1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCXU4IHJlYXNvbl9jb2RlLCB1OCByZWFzb25fY29kZV9leHBsKTsKK3UxNiBmY19sc19hY2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX2Vsc19jbWRfcyAqZWxzX2NtZCwKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkKTsKK3UxNiBmY19wcmxpX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnBsZCwgdTMyIGRfaWQsCisJCQl1MzIgc19pZCwgdTE2IG94X2lkKTsKK2VudW0gZmNfcGFyc2Vfc3RhdHVzIGZjX3BybGlfcnNwX3BhcnNlKHN0cnVjdCBmY19wcmxpX3MgKnBybGksIGludCBsZW4pOworCit1MTYgZmNfcHJsaV9hY2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcGxkLCB1MzIgZF9pZCwKKwkJCXUzMiBzX2lkLCB1MTYgb3hfaWQsCisJCQllbnVtIGJmYV9wb3J0X3JvbGUgcm9sZSk7Cit1MTYgZmNfcm5pZF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfcm5pZF9jbWRfcyAqcm5pZCwKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkLAorCQkJdTMyIGRhdGFfZm9ybWF0KTsKK3UxNiBmY19ybmlkX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfcm5pZF9hY2NfcyAqcm5pZF9hY2MsCisJCQl1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCXUzMiBkYXRhX2Zvcm1hdCwKKwkJCXN0cnVjdCBmY19ybmlkX2NvbW1vbl9pZF9kYXRhX3MgKmNvbW1vbl9pZF9kYXRhLAorCQkJc3RydWN0IGZjX3JuaWRfZ2VuZXJhbF90b3BvbG9neV9kYXRhX3MgKgorCQkJZ2VuX3RvcG9fZGF0YSk7Cit1MTYgZmNfcnBzYzJfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3Jwc2MyX2NtZF9zICpycHMyYywKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwKKwkJCXUzMiAqcGlkX2xpc3QsIHUxNiBucGlkcyk7Cit1MTYgZmNfcnBzY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfcnBzY19jbWRfcyAqcnBzYywKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkKTsKK3UxNiBmY19ycHNjX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfcnBzY19hY2NfcyAqcnBzY19hY2MsCisJCQl1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCXN0cnVjdCBmY19ycHNjX3NwZWVkX2luZm9fcyAqb3Blcl9zcGVlZCk7Cit1MTYgZmNfZ2lkX2Z0X2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnBsZCwgdTMyIHNfaWQsCisJCQl1OCBmYzRfdHlwZSk7Cit1MTYgZmNfcnBuaWRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsCisJCQl1MzIgcG9ydF9pZCwgd3duX3QgcG9ydF9uYW1lKTsKK3UxNiBmY19ybm5pZF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpweWxkLCB1MzIgc19pZCwKKwkJCXUzMiBwb3J0X2lkLCB3d25fdCBub2RlX25hbWUpOwordTE2IGZjX3Jjc2lkX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLAorCQkJdTMyIHBvcnRfaWQsIHUzMiBjb3MpOwordTE2IGZjX3JwdGlkX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLAorCQkJdTMyIHBvcnRfaWQsIHU4IHBvcnRfdHlwZSk7Cit1MTYgZmNfZ2FueHRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsCisJCQl1MzIgcG9ydF9pZCk7Cit1MTYgZmNfbG9nb19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfbG9nb19zICpsb2dvLAorCQkJdTMyIGRfaWQsIHUzMiBzX2lkLCB1MTYgb3hfaWQsCisJCQl3d25fdCBwb3J0X25hbWUpOwordTE2IGZjX2xvZ29fYWNjX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnBsZCwgdTMyIGRfaWQsCisJCQl1MzIgc19pZCwgdTE2IG94X2lkKTsKK3UxNiBmY19mZG1pX3JlcWhkcl9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpweWxkLCB1MzIgc19pZCwKKwkJCXUxNiBjbWRfY29kZSk7Cit1MTYgZmNfZ21hbF9yZXFfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsCisJCQl3d25fdCB3d24pOwordTE2IGZjX2dmbl9yZXFfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcHlsZCwgdTMyIHNfaWQsCisJCQl3d25fdCB3d24pOwordm9pZCBmY19nZXRfZmM0dHlwZV9iaXRtYXNrKHU4IGZjNF90eXBlLCB1OCAqYml0X21hc2spOwordm9pZCBmY19lbHNfcmVxX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJCXUxNiBveF9pZCk7CitlbnVtIGZjX3BhcnNlX3N0YXR1cyBmY19lbHNfcnNwX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmZjaHMsIGludCBsZW4pOworZW51bSBmY19wYXJzZV9zdGF0dXMgZmNfcGxvZ2lfcnNwX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmZjaHMsIGludCBsZW4sCisJCQkgd3duX3QgcG9ydF9uYW1lKTsKK2VudW0gZmNfcGFyc2Vfc3RhdHVzIGZjX3BybGlfcGFyc2Uoc3RydWN0IGZjX3BybGlfcyAqcHJsaSk7CitlbnVtIGZjX3BhcnNlX3N0YXR1cyBmY19wZGlzY19wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzLCB3d25fdCBub2RlX25hbWUsCisJCQl3d25fdCBwb3J0X25hbWUpOwordTE2IGZjX2JhX2FjY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCBzdHJ1Y3QgZmNfYmFfYWNjX3MgKmJhX2FjYywKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkLAorCQkJdTE2IHJ4X2lkKTsKK2ludCBmY19sb2dvdXRfcGFyYW1zX3BhZ2VzKHN0cnVjdCBmY2hzX3MgKmZjX2ZyYW1lLCB1OCBlbHNfY29kZSk7Cit1MTYgZmNfdHBybG9fYWNjX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsCisJCQlzdHJ1Y3QgZmNfdHBybG9fYWNjX3MgKnRwcmxvX2FjYywKKwkJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkLAorCQkJaW50IG51bV9wYWdlcyk7Cit1MTYgZmNfcHJsb19hY2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3BybG9fYWNjX3MgKnBybG9fYWNjLAorCQkJdTMyIGRfaWQsIHUzMiBzX2lkLCB1MTYgb3hfaWQsCisJCQlpbnQgbnVtX3BhZ2VzKTsKK3UxNiBmY19sb2dvX3JzcF9wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzLCBpbnQgbGVuKTsKK3UxNiBmY19wZGlzY19idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB1MzIgZF9pZCwgdTMyIHNfaWQsCisJCQl1MTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSwgd3duX3Qgbm9kZV9uYW1lLAorCQkJdTE2IHBkdV9zaXplKTsKK3UxNiBmY19wZGlzY19yc3BfcGFyc2Uoc3RydWN0IGZjaHNfcyAqZmNocywgaW50IGxlbiwgd3duX3QgcG9ydF9uYW1lKTsKK3UxNiBmY19wcmxvX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUzMiBkX2lkLCB1MzIgc19pZCwKKwkJCXUxNiBveF9pZCwgaW50IG51bV9wYWdlcyk7Cit1MTYgZmNfcHJsb19yc3BfcGFyc2Uoc3RydWN0IGZjaHNfcyAqZmNocywgaW50IGxlbik7Cit1MTYgZmNfdHBybG9fYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdTMyIGRfaWQsIHUzMiBzX2lkLAorCQkJdTE2IG94X2lkLCBpbnQgbnVtX3BhZ2VzLAorCQkJZW51bSBmY190cHJsb190eXBlIHRwcmxvX3R5cGUsIHUzMiB0cHJfaWQpOwordTE2IGZjX3RwcmxvX3JzcF9wYXJzZShzdHJ1Y3QgZmNoc19zICpmY2hzLCBpbnQgbGVuKTsKK3UxNiBmY19iYV9yanRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdTMyIGRfaWQsIHUzMiBzX2lkLAorCQkJdTE2IG94X2lkLCB1MzIgcmVhc29uX2NvZGUsCisJCQl1MzIgcmVhc29uX2V4cGwpOwordTE2IGZjX2dubmlkX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnB5bGQsIHUzMiBzX2lkLAorCQkJdTE2IG94X2lkLCB1MzIgcG9ydF9pZCk7Cit1MTYgZmNfY3RfcnNwX3BhcnNlKHN0cnVjdCBjdF9oZHJfcyAqY3RoZHIpOwordTE2IGZjX3JzY25fYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3JzY25fcGxfcyAqcnNjbiwKKwkJCXUzMiBzX2lkLCB1MTYgb3hfaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2ZjcGltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2ZjcGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlNWQ4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2ZjcGltLmMKQEAgLTAsMCArMSw4NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgZmNwaW0uYyAtIEZDUCBpbml0aWF0b3IgbW9kZSBpLXQgbmV4dXMgc3RhdGUgbWFjaGluZQorICovCisKKyNpbmNsdWRlIDxiZmEuaD4KKyNpbmNsdWRlIDxiZmFfc3ZjLmg+CisjaW5jbHVkZSAiZmNzX2ZjcGltLmgiCisjaW5jbHVkZSAiZmNzX3Jwb3J0LmgiCisjaW5jbHVkZSAiZmNzX2xwb3J0LmgiCisjaW5jbHVkZSAiZmNzX3RyY21vZC5oIgorI2luY2x1ZGUgImZjc19mY3hwLmgiCisjaW5jbHVkZSAiZmNzLmgiCisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfZmNwaW0uaD4KKyNpbmNsdWRlIDxmY2IvYmZhX2ZjYl9mY3BpbS5oPgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuX2l0bmltLmg+CisKK0JGQV9UUkNfRklMRShGQ1MsIEZDUElNKTsKKworLyoKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2l0bmltX3RpbWVvdXQodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2l0bmltX2ZyZWUoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfaXRuaW1fc2VuZF9wcmxpKHZvaWQgKml0bmltX2NiYXJnLAorCQkJCQlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2l0bmltX3BybGlfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAorCQkJCQkgICAgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkJCSAgICB2b2lkICpjYmFyZywKKwkJCQkJICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCQkgICAgdTMyIHJzcF9sZW4sCisJCQkJCSAgICB1MzIgcmVzaWRfbGVuLAorCQkJCQkgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfaXRuaW1fYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0sCisJCQkJICAgICAgIGVudW0gYmZhX2l0bmltX2Flbl9ldmVudCBldmVudCk7CisKKy8qKgorICogIGZjc19pdG5pbV9zbSBGQ1MgaXRuaW0gc3RhdGUgbWFjaGluZSBldmVudHMKKyAqLworCitlbnVtIGJmYV9mY3NfaXRuaW1fZXZlbnQgeworCUJGQV9GQ1NfSVROSU1fU01fT05MSU5FID0gMSwJLyogIHJwb3J0IG9ubGluZSBldmVudCAqLworCUJGQV9GQ1NfSVROSU1fU01fT0ZGTElORSA9IDIsCS8qICBycG9ydCBvZmZsaW5lICovCisJQkZBX0ZDU19JVE5JTV9TTV9GUk1TRU5UID0gMywJLyogIHBybGkgZnJhbWUgaXMgc2VudCAqLworCUJGQV9GQ1NfSVROSU1fU01fUlNQX09LID0gNCwJLyogIGdvb2QgcmVzcG9uc2UgKi8KKwlCRkFfRkNTX0lUTklNX1NNX1JTUF9FUlJPUiA9IDUsCS8qICBlcnJvciByZXNwb25zZSAqLworCUJGQV9GQ1NfSVROSU1fU01fVElNRU9VVCA9IDYsCS8qICBkZWxheSB0aW1lb3V0ICovCisJQkZBX0ZDU19JVE5JTV9TTV9IQ0JfT0ZGTElORSA9IDcsCS8qICBCRkEgb25saW5lIGNhbGxiYWNrICovCisJQkZBX0ZDU19JVE5JTV9TTV9IQ0JfT05MSU5FID0gOCwJLyogIEJGQSBvZmZsaW5lIGNhbGxiYWNrICovCisJQkZBX0ZDU19JVE5JTV9TTV9JTklUSUFUT1IgPSA5LAkvKiAgcnBvcnQgaXMgaW5pdGlhdG9yICovCisJQkZBX0ZDU19JVE5JTV9TTV9ERUxFVEUgPSAxMCwJLyogIGRlbGV0ZSBldmVudCBmcm9tIHJwb3J0ICovCisJQkZBX0ZDU19JVE5JTV9TTV9QUkxPID0gMTEsCS8qICBkZWxldGUgZXZlbnQgZnJvbSBycG9ydCAqLworfTsKKworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJCQkJIGVudW0gYmZhX2Zjc19pdG5pbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19pdG5pbV9zbV9wcmxpX3NlbmQoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0sCisJCQkJCSAgIGVudW0gYmZhX2Zjc19pdG5pbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19pdG5pbV9zbV9wcmxpKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAorCQkJCSAgICAgIGVudW0gYmZhX2Zjc19pdG5pbV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19pdG5pbV9zbV9wcmxpX3JldHJ5KHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAorCQkJCQkgICAgZW51bSBiZmFfZmNzX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2l0bmltX3NtX2hjYl9vbmxpbmUoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0sCisJCQkJCSAgICBlbnVtIGJmYV9mY3NfaXRuaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfaXRuaW1fc21fb25saW5lKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAorCQkJCQllbnVtIGJmYV9mY3NfaXRuaW1fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfaXRuaW1fc21faGNiX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0sCisJCQkJCSAgICAgZW51bSBiZmFfZmNzX2l0bmltX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX2l0bmltX3NtX2luaXRpYXRvcihzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJCQkJICAgZW51bSBiZmFfZmNzX2l0bmltX2V2ZW50IGV2ZW50KTsKKworc3RhdGljIHN0cnVjdCBiZmFfc21fdGFibGVfcyBpdG5pbV9zbV90YWJsZVtdID0geworCXtCRkFfU00oYmZhX2Zjc19pdG5pbV9zbV9vZmZsaW5lKSwgQkZBX0lUTklNX09GRkxJTkV9LAorCXtCRkFfU00oYmZhX2Zjc19pdG5pbV9zbV9wcmxpX3NlbmQpLCBCRkFfSVROSU1fUFJMSV9TRU5EfSwKKwl7QkZBX1NNKGJmYV9mY3NfaXRuaW1fc21fcHJsaSksIEJGQV9JVE5JTV9QUkxJX1NFTlR9LAorCXtCRkFfU00oYmZhX2Zjc19pdG5pbV9zbV9wcmxpX3JldHJ5KSwgQkZBX0lUTklNX1BSTElfUkVUUll9LAorCXtCRkFfU00oYmZhX2Zjc19pdG5pbV9zbV9oY2Jfb25saW5lKSwgQkZBX0lUTklNX0hDQl9PTkxJTkV9LAorCXtCRkFfU00oYmZhX2Zjc19pdG5pbV9zbV9vbmxpbmUpLCBCRkFfSVROSU1fT05MSU5FfSwKKwl7QkZBX1NNKGJmYV9mY3NfaXRuaW1fc21faGNiX29mZmxpbmUpLCBCRkFfSVROSU1fSENCX09GRkxJTkV9LAorCXtCRkFfU00oYmZhX2Zjc19pdG5pbV9zbV9pbml0aWF0b3IpLCBCRkFfSVROSU1fSU5JVElBVElPUn0sCit9OworCisvKioKKyAqICBmY3NfaXRuaW1fc20gRkNTIGl0bmltIHN0YXRlIG1hY2hpbmUKKyAqLworCitzdGF0aWMgdm9pZAorYmZhX2Zjc19pdG5pbV9zbV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAorCQkJIGVudW0gYmZhX2Zjc19pdG5pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGl0bmltLT5mY3MsIGl0bmltLT5ycG9ydC0+cHd3bik7CisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX0lUTklNX1NNX09OTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9wcmxpX3NlbmQpOworCQliZmFfZmNzX2l0bmltX3NlbmRfcHJsaShpdG5pbSwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0lUTklNX1NNX09GRkxJTkU6CisJCWJmYV9mY3NfcnBvcnRfaXRuaW1fYWNrKGl0bmltLT5ycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0lUTklNX1NNX0lOSVRJQVRPUjoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9pbml0aWF0b3IpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9ERUxFVEU6CisJCWJmYV9mY3NfaXRuaW1fZnJlZShpdG5pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfaXRuaW1fc21fcHJsaV9zZW5kKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAorCQkJICAgZW51bSBiZmFfZmNzX2l0bmltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaXRuaW0tPmZjcywgaXRuaW0tPnJwb3J0LT5wd3duKTsKKwliZmFfdHJjKGl0bmltLT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fRlJNU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9wcmxpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fSU5JVElBVE9SOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX2luaXRpYXRvcik7CisJCWJmYV9mY3hwX3dhbGxvY19jYW5jZWwoaXRuaW0tPmZjcy0+YmZhLCAmaXRuaW0tPmZjeHBfd3FlKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChpdG5pbS0+ZmNzLT5iZmEsICZpdG5pbS0+ZmN4cF93cWUpOworCQliZmFfZmNzX3Jwb3J0X2l0bmltX2FjayhpdG5pbS0+cnBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZSk7CisJCWJmYV9mY3hwX3dhbGxvY19jYW5jZWwoaXRuaW0tPmZjcy0+YmZhLCAmaXRuaW0tPmZjeHBfd3FlKTsKKwkJYmZhX2Zjc19pdG5pbV9mcmVlKGl0bmltKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfaXRuaW1fc21fcHJsaShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJICAgICAgZW51bSBiZmFfZmNzX2l0bmltX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaXRuaW0tPmZjcywgaXRuaW0tPnJwb3J0LT5wd3duKTsKKwliZmFfdHJjKGl0bmltLT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fUlNQX09LOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX2hjYl9vbmxpbmUpOworCQliZmFfaXRuaW1fb25saW5lKGl0bmltLT5iZmFfaXRuaW0sIGl0bmltLT5zZXFfcmVjKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fUlNQX0VSUk9SOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX3BybGlfcmV0cnkpOworCQliZmFfdGltZXJfc3RhcnQoaXRuaW0tPmZjcy0+YmZhLCAmaXRuaW0tPnRpbWVyLAorCQkJCWJmYV9mY3NfaXRuaW1fdGltZW91dCwgaXRuaW0sCisJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfZGlzY2FyZChpdG5pbS0+ZmN4cCk7CisJCWJmYV9mY3NfcnBvcnRfaXRuaW1fYWNrKGl0bmltLT5ycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0lUTklNX1NNX0lOSVRJQVRPUjoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9pbml0aWF0b3IpOworCQkvKgorCQkgKiBkb250IGRpc2NhcmQgZmN4cC4gYWNjZXB0IHdpbGwgcmVhY2ggc2FtZSBzdGF0ZQorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF9kaXNjYXJkKGl0bmltLT5mY3hwKTsKKwkJYmZhX2Zjc19pdG5pbV9mcmVlKGl0bmltKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfaXRuaW1fc21fcHJsaV9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJCSAgICBlbnVtIGJmYV9mY3NfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBpdG5pbS0+cnBvcnQtPnB3d24pOworCWJmYV90cmMoaXRuaW0tPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9USU1FT1VUOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX3BybGlfc2VuZCk7CisJCWJmYV9mY3NfaXRuaW1fc2VuZF9wcmxpKGl0bmltLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9vZmZsaW5lKTsKKwkJYmZhX3RpbWVyX3N0b3AoJml0bmltLT50aW1lcik7CisJCWJmYV9mY3NfcnBvcnRfaXRuaW1fYWNrKGl0bmltLT5ycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0lUTklNX1NNX0lOSVRJQVRPUjoKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9pbml0aWF0b3IpOworCQliZmFfdGltZXJfc3RvcCgmaXRuaW0tPnRpbWVyKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmaXRuaW0tPnRpbWVyKTsKKwkJYmZhX2Zjc19pdG5pbV9mcmVlKGl0bmltKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfaXRuaW1fc21faGNiX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJCSAgICBlbnVtIGJmYV9mY3NfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBpdG5pbS0+cnBvcnQtPnB3d24pOworCWJmYV90cmMoaXRuaW0tPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9IQ0JfT05MSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX29ubGluZSk7CisJCWJmYV9mY2JfaXRuaW1fb25saW5lKGl0bmltLT5pdG5pbV9kcnYpOworCQliZmFfZmNzX2l0bmltX2Flbl9wb3N0KGl0bmltLCBCRkFfSVROSU1fQUVOX09OTElORSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX0lUTklNX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZSk7CisJCWJmYV9pdG5pbV9vZmZsaW5lKGl0bmltLT5iZmFfaXRuaW0pOworCQliZmFfZmNzX3Jwb3J0X2l0bmltX2FjayhpdG5pbS0+cnBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZSk7CisJCWJmYV9mY3NfaXRuaW1fZnJlZShpdG5pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX2l0bmltX3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJCWVudW0gYmZhX2Zjc19pdG5pbV9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGl0bmltLT5mY3MsIGl0bmltLT5ycG9ydC0+cHd3bik7CisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX0lUTklNX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21faGNiX29mZmxpbmUpOworCQliZmFfZmNiX2l0bmltX29mZmxpbmUoaXRuaW0tPml0bmltX2Rydik7CisJCWJmYV9pdG5pbV9vZmZsaW5lKGl0bmltLT5iZmFfaXRuaW0pOworCQlpZiAoYmZhX2Zjc19wb3J0X2lzX29ubGluZShpdG5pbS0+cnBvcnQtPnBvcnQpID09IEJGQV9UUlVFKSB7CisJCQliZmFfZmNzX2l0bmltX2Flbl9wb3N0KGl0bmltLCBCRkFfSVROSU1fQUVOX0RJU0NPTk5FQ1QpOworCQl9IGVsc2UgeworCQkJYmZhX2Zjc19pdG5pbV9hZW5fcG9zdChpdG5pbSwgQkZBX0lUTklNX0FFTl9PRkZMSU5FKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZSk7CisJCWJmYV9mY3NfaXRuaW1fZnJlZShpdG5pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX2l0bmltX3NtX2hjYl9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAorCQkJICAgICBlbnVtIGJmYV9mY3NfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBpdG5pbS0+cnBvcnQtPnB3d24pOworCWJmYV90cmMoaXRuaW0tPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9IQ0JfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9vZmZsaW5lKTsKKwkJYmZhX2Zjc19ycG9ydF9pdG5pbV9hY2soaXRuaW0tPnJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX29mZmxpbmUpOworCQliZmFfZmNzX2l0bmltX2ZyZWUoaXRuaW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKgorICogVGhpcyBzdGF0ZSBpcyBzZXQgd2hlbiBhIGRpc2NvdmVyZWQgcnBvcnQgaXMgYWxzbyBpbiBpbnRpYXRvciBtb2RlLgorICogVGhpcyBJVE4gaXMgbWFya2VkIGFzIG5vX29wIGFuZCBpcyBub3QgYWN0aXZlIGFuZCB3aWxsIG5vdCBiZSB0cnVuZWQgaW50bworICogb25saW5lIHN0YXRlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19pdG5pbV9zbV9pbml0aWF0b3Ioc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0sCisJCQkgICBlbnVtIGJmYV9mY3NfaXRuaW1fZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBpdG5pbS0+cnBvcnQtPnB3d24pOworCWJmYV90cmMoaXRuaW0tPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKGl0bmltLCBiZmFfZmNzX2l0bmltX3NtX29mZmxpbmUpOworCQliZmFfZmNzX3Jwb3J0X2l0bmltX2FjayhpdG5pbS0+cnBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9SU1BfRVJST1I6CisJY2FzZSBCRkFfRkNTX0lUTklNX1NNX09OTElORToKKwljYXNlIEJGQV9GQ1NfSVROSU1fU01fSU5JVElBVE9SOgorCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZSk7CisJCWJmYV9mY3NfaXRuaW1fZnJlZShpdG5pbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKworCisvKioKKyAqICBpdG5pbV9wcml2YXRlIEZDUyBJVE5JTSBwcml2YXRlIGludGVyZmFjZXMKKyAqLworCitzdGF0aWMgdm9pZAorYmZhX2Zjc19pdG5pbV9hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJICAgICAgIGVudW0gYmZhX2l0bmltX2Flbl9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IGl0bmltLT5ycG9ydDsKKwl1bmlvbiBiZmFfYWVuX2RhdGFfdSBhZW5fZGF0YTsKKwlzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nbW9kID0gcnBvcnQtPmZjcy0+bG9nbTsKKwl3d25fdCAgICAgICAgICAgbHB3d24gPSBiZmFfZmNzX3BvcnRfZ2V0X3B3d24ocnBvcnQtPnBvcnQpOworCXd3bl90ICAgICAgICAgICBycHd3biA9IHJwb3J0LT5wd3duOworCWNoYXIgICAgICAgICAgICBscHd3bl9wdHJbQkZBX1NUUklOR18zMl07CisJY2hhciAgICAgICAgICAgIHJwd3duX3B0cltCRkFfU1RSSU5HXzMyXTsKKworCS8qCisJICogRG9uJ3QgcG9zdCBldmVudHMgZm9yIHdlbGwga25vd24gYWRkcmVzc2VzCisJICovCisJaWYgKEJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkKKwkJcmV0dXJuOworCisJd3duMnN0cihscHd3bl9wdHIsIGxwd3duKTsKKwl3d24yc3RyKHJwd3duX3B0ciwgcnB3d24pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lUTklNX0FFTl9PTkxJTkU6CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX0lUTklNX09OTElORSwgcnB3d25fcHRyLCBscHd3bl9wdHIpOworCQlicmVhazsKKwljYXNlIEJGQV9JVE5JTV9BRU5fT0ZGTElORToKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fSVROSU1fT0ZGTElORSwgcnB3d25fcHRyLCBscHd3bl9wdHIpOworCQlicmVhazsKKwljYXNlIEJGQV9JVE5JTV9BRU5fRElTQ09OTkVDVDoKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fSVROSU1fRElTQ09OTkVDVCwgcnB3d25fcHRyLCBscHd3bl9wdHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlhZW5fZGF0YS5pdG5pbS52Zl9pZCA9IHJwb3J0LT5wb3J0LT5mYWJyaWMtPnZmX2lkOworCWFlbl9kYXRhLml0bmltLnBwd3duID0KKwkJYmZhX2Zjc19wb3J0X2dldF9wd3duKGJmYV9mY3NfZ2V0X2Jhc2VfcG9ydChpdG5pbS0+ZmNzKSk7CisJYWVuX2RhdGEuaXRuaW0ubHB3d24gPSBscHd3bjsKKwlhZW5fZGF0YS5pdG5pbS5ycHd3biA9IHJwd3duOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19pdG5pbV9zZW5kX3BybGkodm9pZCAqaXRuaW1fY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0gPSBpdG5pbV9jYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IGl0bmltLT5ycG9ydDsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJaW50ICAgICAgICAgICAgIGxlbjsKKworCWJmYV90cmMoaXRuaW0tPmZjcywgaXRuaW0tPnJwb3J0LT5wd3duKTsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJaXRuaW0tPnN0YXRzLmZjeHBfYWxsb2Nfd2FpdCsrOworCQliZmFfZmN4cF9hbGxvY193YWl0KHBvcnQtPmZjcy0+YmZhLCAmaXRuaW0tPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX2l0bmltX3NlbmRfcHJsaSwgaXRuaW0pOworCQlyZXR1cm47CisJfQorCWl0bmltLT5mY3hwID0gZmN4cDsKKworCWxlbiA9IGZjX3BybGlfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksIGl0bmltLT5ycG9ydC0+cGlkLAorCQkJICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgMCk7CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIHJwb3J0LT5iZmFfcnBvcnQsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywKKwkJICAgICAgQkZBX0ZBTFNFLCBGQ19DTEFTU18zLCBsZW4sICZmY2hzLAorCQkgICAgICBiZmFfZmNzX2l0bmltX3BybGlfcmVzcG9uc2UsICh2b2lkICopaXRuaW0sIEZDX01BWF9QRFVTWiwKKwkJICAgICAgRkNfUkFfVE9WKTsKKworCWl0bmltLT5zdGF0cy5wcmxpX3NlbnQrKzsKKwliZmFfc21fc2VuZF9ldmVudChpdG5pbSwgQkZBX0ZDU19JVE5JTV9TTV9GUk1TRU5UKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfaXRuaW1fcHJsaV9yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLCB2b2lkICpjYmFyZywKKwkJCSAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywgdTMyIHJzcF9sZW4sCisJCQkgICAgdTMyIHJlc2lkX2xlbiwgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCit7CisJc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0gPSAoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqKWNiYXJnOworCXN0cnVjdCBmY19lbHNfY21kX3MgICAqZWxzX2NtZDsKKwlzdHJ1Y3QgZmNfcHJsaV9zICAgICAgKnBybGlfcmVzcDsKKwlzdHJ1Y3QgZmNfbHNfcmp0X3MgICAgKmxzX3JqdDsKKwlzdHJ1Y3QgZmNfcHJsaV9wYXJhbXNfcyAqc3BhcmFtczsKKworCWJmYV90cmMoaXRuaW0tPmZjcywgcmVxX3N0YXR1cyk7CisKKwkvKgorCSAqIFNhbml0eSBDaGVja3MKKwkgKi8KKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWl0bmltLT5zdGF0cy5wcmxpX3JzcF9lcnIrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9GQ1NfSVROSU1fU01fUlNQX0VSUk9SKTsKKwkJcmV0dXJuOworCX0KKworCWVsc19jbWQgPSAoc3RydWN0IGZjX2Vsc19jbWRfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCisJaWYgKGVsc19jbWQtPmVsc19jb2RlID09IEZDX0VMU19BQ0MpIHsKKwkJcHJsaV9yZXNwID0gKHN0cnVjdCBmY19wcmxpX3MgKikgZWxzX2NtZDsKKworCQlpZiAoZmNfcHJsaV9yc3BfcGFyc2UocHJsaV9yZXNwLCByc3BfbGVuKSAhPSBGQ19QQVJTRV9PSykgeworCQkJYmZhX3RyYyhpdG5pbS0+ZmNzLCByc3BfbGVuKTsKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGlzICByLXBvcnQgaXMgYWxzbyBpbiBJbml0aWF0b3IgbW9kZS4KKwkJCSAqIElmIHNvLCB3ZSBuZWVkIHRvIHNldCB0aGlzIElUTiBhcyBhIG5vLW9wLgorCQkJICovCisJCQlpZiAocHJsaV9yZXNwLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5pbml0aWF0b3IpIHsKKwkJCQliZmFfdHJjKGl0bmltLT5mY3MsIHBybGlfcmVzcC0+cGFyYW1wYWdlLnR5cGUpOworCQkJCWl0bmltLT5ycG9ydC0+c2NzaV9mdW5jdGlvbiA9CisJCQkJCUJGQV9SUE9SVF9JTklUSUFUT1I7CisJCQkJaXRuaW0tPnN0YXRzLnBybGlfcnNwX2FjYysrOworCQkJCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLAorCQkJCQkJICBCRkFfRkNTX0lUTklNX1NNX0lOSVRJQVRPUik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpdG5pbS0+c3RhdHMucHJsaV9yc3BfcGFyc2VfZXJyKys7CisJCQlyZXR1cm47CisJCX0KKwkJaXRuaW0tPnJwb3J0LT5zY3NpX2Z1bmN0aW9uID0gQkZBX1JQT1JUX1RBUkdFVDsKKworCQlzcGFyYW1zID0gJnBybGlfcmVzcC0+cGFyYW1wYWdlLnNlcnZwYXJhbXM7CisJCWl0bmltLT5zZXFfcmVjID0gc3BhcmFtcy0+cmV0cnk7CisJCWl0bmltLT5yZWNfc3VwcG9ydCA9IHNwYXJhbXMtPnJlY19zdXBwb3J0OworCQlpdG5pbS0+dGFza19yZXRyeV9pZCA9IHNwYXJhbXMtPnRhc2tfcmV0cnlfaWQ7CisJCWl0bmltLT5jb25mX2NvbXAgPSBzcGFyYW1zLT5jb25maXJtOworCisJCWl0bmltLT5zdGF0cy5wcmxpX3JzcF9hY2MrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9GQ1NfSVROSU1fU01fUlNQX09LKTsKKwl9IGVsc2UgeworCQlsc19yanQgPSAoc3RydWN0IGZjX2xzX3JqdF9zICopIEJGQV9GQ1hQX1JTUF9QTEQoZmN4cCk7CisKKwkJYmZhX3RyYyhpdG5pbS0+ZmNzLCBsc19yanQtPnJlYXNvbl9jb2RlKTsKKwkJYmZhX3RyYyhpdG5pbS0+ZmNzLCBsc19yanQtPnJlYXNvbl9jb2RlX2V4cGwpOworCisJCWl0bmltLT5zdGF0cy5wcmxpX3JzcF9yanQrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9GQ1NfSVROSU1fU01fUlNQX0VSUk9SKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX2l0bmltX3RpbWVvdXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltID0gKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKilhcmc7CisKKwlpdG5pbS0+c3RhdHMudGltZW91dCsrOworCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfRkNTX0lUTklNX1NNX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19pdG5pbV9mcmVlKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworCWJmYV9pdG5pbV9kZWxldGUoaXRuaW0tPmJmYV9pdG5pbSk7CisJYmZhX2ZjYl9pdG5pbV9mcmVlKGl0bmltLT5mY3MtPmJmYWQsIGl0bmltLT5pdG5pbV9kcnYpOworfQorCisKKworLyoqCisgKiAgaXRuaW1fcHVibGljIEZDUyBJVE5JTSBwdWJsaWMgaW50ZXJmYWNlcworICovCisKKy8qKgorICogCUNhbGxlZCBieSBycG9ydCB3aGVuIGEgbmV3IHJwb3J0IGlzIGNyZWF0ZWQuCisgKgorICogQHBhcmFtW2luXSBycG9ydAktICByZW1vdGUgcG9ydC4KKyAqLworc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqCitiZmFfZmNzX2l0bmltX2NyZWF0ZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbTsKKwlzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbV9kcnY7CisJc3RydWN0IGJmYV9pdG5pbV9zICpiZmFfaXRuaW07CisKKwkvKgorCSAqIGNhbGwgYmZhZCB0byBhbGxvY2F0ZSB0aGUgaXRuaW0KKwkgKi8KKwliZmFfZmNiX2l0bmltX2FsbG9jKHBvcnQtPmZjcy0+YmZhZCwgJml0bmltLCAmaXRuaW1fZHJ2KTsKKwlpZiAoaXRuaW0gPT0gTlVMTCkgeworCQliZmFfdHJjKHBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgaXRuaW0KKwkgKi8KKwlpdG5pbS0+cnBvcnQgPSBycG9ydDsKKwlpdG5pbS0+ZmNzID0gcnBvcnQtPmZjczsKKwlpdG5pbS0+aXRuaW1fZHJ2ID0gaXRuaW1fZHJ2OworCisJLyoKKwkgKiBjYWxsIEJGQSB0byBjcmVhdGUgdGhlIGl0bmltCisJICovCisJYmZhX2l0bmltID0gYmZhX2l0bmltX2NyZWF0ZShwb3J0LT5mY3MtPmJmYSwgcnBvcnQtPmJmYV9ycG9ydCwgaXRuaW0pOworCisJaWYgKGJmYV9pdG5pbSA9PSBOVUxMKSB7CisJCWJmYV90cmMocG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJCWJmYV9mY2JfaXRuaW1fZnJlZShwb3J0LT5mY3MtPmJmYWQsIGl0bmltX2Rydik7CisJCWJmYV9hc3NlcnQoMCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWl0bmltLT5iZmFfaXRuaW0gPSBiZmFfaXRuaW07CisJaXRuaW0tPnNlcV9yZWMgPSBCRkFfRkFMU0U7CisJaXRuaW0tPnJlY19zdXBwb3J0ID0gQkZBX0ZBTFNFOworCWl0bmltLT5jb25mX2NvbXAgPSBCRkFfRkFMU0U7CisJaXRuaW0tPnRhc2tfcmV0cnlfaWQgPSBCRkFfRkFMU0U7CisKKwkvKgorCSAqIFNldCBTdGF0ZSBtYWNoaW5lCisJICovCisJYmZhX3NtX3NldF9zdGF0ZShpdG5pbSwgYmZhX2Zjc19pdG5pbV9zbV9vZmZsaW5lKTsKKworCXJldHVybiBpdG5pbTsKK30KKworLyoqCisgKiAJQ2FsbGVkIGJ5IHJwb3J0IHRvIGRlbGV0ZSAgdGhlIGluc3RhbmNlIG9mIEZDUElNLgorICoKKyAqIEBwYXJhbVtpbl0gcnBvcnQJLSAgcmVtb3RlIHBvcnQuCisgKi8KK3ZvaWQKK2JmYV9mY3NfaXRuaW1fZGVsZXRlKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworCWJmYV90cmMoaXRuaW0tPmZjcywgaXRuaW0tPnJwb3J0LT5waWQpOworCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfRkNTX0lUTklNX1NNX0RFTEVURSk7Cit9CisKKy8qKgorICogTm90aWZpY2F0aW9uIGZyb20gcnBvcnQgdGhhdCBQTE9HSSBpcyBjb21wbGV0ZSB0byBpbml0aWF0ZSBGQy00IHNlc3Npb24uCisgKi8KK3ZvaWQKK2JmYV9mY3NfaXRuaW1fcnBvcnRfb25saW5lKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworCWl0bmltLT5zdGF0cy5vbmxpbmVzKys7CisKKwlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShpdG5pbS0+cnBvcnQtPnBpZCkpIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9GQ1NfSVROSU1fU01fT05MSU5FKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3Igd2VsbCBrbm93biBhZGRyZXNzZXMsIHdlIHNldCB0aGUgaXRuaW0gdG8gaW5pdGlhdG9yCisJCSAqIHN0YXRlCisJCSAqLworCQlpdG5pbS0+c3RhdHMuaW5pdGlhdG9yKys7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfRkNTX0lUTklNX1NNX0lOSVRJQVRPUik7CisJfQorfQorCisvKioKKyAqIENhbGxlZCBieSBycG9ydCB0byBoYW5kbGUgYSByZW1vdGUgZGV2aWNlIG9mZmxpbmUuCisgKi8KK3ZvaWQKK2JmYV9mY3NfaXRuaW1fcnBvcnRfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSkKK3sKKwlpdG5pbS0+c3RhdHMub2ZmbGluZXMrKzsKKwliZmFfc21fc2VuZF9ldmVudChpdG5pbSwgQkZBX0ZDU19JVE5JTV9TTV9PRkZMSU5FKTsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgcnBvcnQgd2hlbiByZW1vdGUgcG9ydCBpcyBrbm93biB0byBiZSBhbiBpbml0aWF0b3IgZnJvbQorICogUFJMSSByZWNlaXZlZC4KKyAqLwordm9pZAorYmZhX2Zjc19pdG5pbV9pc19pbml0aWF0b3Ioc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pCit7CisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBpdG5pbS0+cnBvcnQtPnBpZCk7CisJaXRuaW0tPnN0YXRzLmluaXRpYXRvcisrOworCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfRkNTX0lUTklNX1NNX0lOSVRJQVRPUik7Cit9CisKKy8qKgorICogQ2FsbGVkIGJ5IHJwb3J0IHRvIGNoZWNrIGlmIHRoZSBpdG5pbSBpcyBvbmxpbmUuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2Zjc19pdG5pbV9nZXRfb25saW5lX3N0YXRlKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworCWJmYV90cmMoaXRuaW0tPmZjcywgaXRuaW0tPnJwb3J0LT5waWQpOworCXN3aXRjaCAoYmZhX3NtX3RvX3N0YXRlKGl0bmltX3NtX3RhYmxlLCBpdG5pbS0+c20pKSB7CisJY2FzZSBCRkFfSVROSU1fT05MSU5FOgorCWNhc2UgQkZBX0lUTklNX0lOSVRJQVRJT1I6CisJCXJldHVybiBCRkFfU1RBVFVTX09LOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIEJGQV9TVEFUVVNfTk9fRkNQSU1fTkVYVVM7CisKKwl9Cit9CisKKy8qKgorICogQkZBIGNvbXBsZXRpb24gY2FsbGJhY2sgZm9yIGJmYV9pdG5pbV9vbmxpbmUoKS4KKyAqLwordm9pZAorYmZhX2NiX2l0bmltX29ubGluZSh2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSA9IChzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICopY2Jhcmc7CisKKwliZmFfdHJjKGl0bmltLT5mY3MsIGl0bmltLT5ycG9ydC0+cHd3bik7CisJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9GQ1NfSVROSU1fU01fSENCX09OTElORSk7Cit9CisKKy8qKgorICogQkZBIGNvbXBsZXRpb24gY2FsbGJhY2sgZm9yIGJmYV9pdG5pbV9vZmZsaW5lKCkuCisgKi8KK3ZvaWQKK2JmYV9jYl9pdG5pbV9vZmZsaW5lKHZvaWQgKmNiX2FyZykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSA9IChzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICopY2JfYXJnOworCisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBpdG5pbS0+cnBvcnQtPnB3d24pOworCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfRkNTX0lUTklNX1NNX0hDQl9PRkZMSU5FKTsKK30KKworLyoqCisgKiBNYXJrIHRoZSBiZWdpbm5pbmcgb2YgUEFUSCBUT1YgaGFuZGxpbmcuIElPIGNvbXBsZXRpb24gY2FsbGJhY2tzCisgKiBhcmUgc3RpbGwgcGVuZGluZy4KKyAqLwordm9pZAorYmZhX2NiX2l0bmltX3Rvdl9iZWdpbih2b2lkICpjYl9hcmcpCit7CisJc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0gPSAoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqKWNiX2FyZzsKKworCWJmYV90cmMoaXRuaW0tPmZjcywgaXRuaW0tPnJwb3J0LT5wd3duKTsKKwliZmFfZmNiX2l0bmltX3Rvdl9iZWdpbihpdG5pbS0+aXRuaW1fZHJ2KTsKK30KKworLyoqCisgKiBNYXJrIHRoZSBlbmQgb2YgUEFUSCBUT1YgaGFuZGxpbmcuIEFsbCBwZW5kaW5nIElPcyBhcmUgYWxyZWFkeSBjbGVhbmVkIHVwLgorICovCit2b2lkCitiZmFfY2JfaXRuaW1fdG92KHZvaWQgKmNiX2FyZykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSA9IChzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICopY2JfYXJnOworCisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBpdG5pbS0+cnBvcnQtPnB3d24pOworCWJmYV9mY2JfaXRuaW1fdG92KGl0bmltLT5pdG5pbV9kcnYpOworfQorCisvKioKKyAqIAkJQkZBIG5vdGlmaWNhdGlvbiB0byBGQ1MvZHJpdmVyIGZvciBzZWNvbmQgbGV2ZWwgZXJyb3IgcmVjb3ZlcnkuCisgKgorICogQXRsZWFzdCBvbmUgSS9PIHJlcXVlc3QgaGFzIHRpbWVkb3V0IGFuZCB0YXJnZXQgaXMgdW5yZXNwb25zaXZlIHRvCisgKiByZXBlYXRlZCBhYm9ydCByZXF1ZXN0cy4gU2Vjb25kIGxldmVsIGVycm9yIHJlY292ZXJ5IHNob3VsZCBiZSBpbml0aWF0ZWQKKyAqIGJ5IHN0YXJ0aW5nIGltcGxpY2l0IGxvZ291dCBhbmQgcmVjb3ZlcnkgcHJvY2VkdXJlcy4KKyAqLwordm9pZAorYmZhX2NiX2l0bmltX3NsZXIodm9pZCAqY2JfYXJnKQoreworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltID0gKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKiljYl9hcmc7CisKKwlpdG5pbS0+c3RhdHMuc2xlcisrOworCWJmYV90cmMoaXRuaW0tPmZjcywgaXRuaW0tPnJwb3J0LT5wd3duKTsKKwliZmFfZmNzX3Jwb3J0X2xvZ29faW1wKGl0bmltLT5ycG9ydCk7Cit9CisKK3N0cnVjdCBiZmFfZmNzX2l0bmltX3MgKgorYmZhX2Zjc19pdG5pbV9sb29rdXAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LCB3d25fdCBycHd3bikKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydDsKKwlycG9ydCA9IGJmYV9mY3NfcnBvcnRfbG9va3VwKHBvcnQsIHJwd3duKTsKKworCWlmICghcnBvcnQpCisJCXJldHVybiBOVUxMOworCisJYmZhX2Fzc2VydChycG9ydC0+aXRuaW0gIT0gTlVMTCk7CisJcmV0dXJuIChycG9ydC0+aXRuaW0pOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfaXRuaW1fYXR0cl9nZXQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LCB3d25fdCBycHd3biwKKwkJICAgICAgIHN0cnVjdCBiZmFfaXRuaW1fYXR0cl9zICphdHRyKQoreworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltID0gTlVMTDsKKworCWl0bmltID0gYmZhX2Zjc19pdG5pbV9sb29rdXAocG9ydCwgcnB3d24pOworCisJaWYgKGl0bmltID09IE5VTEwpCisJCXJldHVybiBCRkFfU1RBVFVTX05PX0ZDUElNX05FWFVTOworCisJYXR0ci0+c3RhdGUgPSBiZmFfc21fdG9fc3RhdGUoaXRuaW1fc21fdGFibGUsIGl0bmltLT5zbSk7CisJYXR0ci0+cmV0cnkgPSBpdG5pbS0+c2VxX3JlYzsKKwlhdHRyLT5yZWNfc3VwcG9ydCA9IGl0bmltLT5yZWNfc3VwcG9ydDsKKwlhdHRyLT5jb25mX2NvbXAgPSBpdG5pbS0+Y29uZl9jb21wOworCWF0dHItPnRhc2tfcmV0cnlfaWQgPSBpdG5pbS0+dGFza19yZXRyeV9pZDsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfaXRuaW1fc3RhdHNfZ2V0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3QgcnB3d24sCisJCQlzdHJ1Y3QgYmZhX2l0bmltX3N0YXRzX3MgKnN0YXRzKQoreworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltID0gTlVMTDsKKworCWJmYV9hc3NlcnQocG9ydCAhPSBOVUxMKTsKKworCWl0bmltID0gYmZhX2Zjc19pdG5pbV9sb29rdXAocG9ydCwgcnB3d24pOworCisJaWYgKGl0bmltID09IE5VTEwpCisJCXJldHVybiBCRkFfU1RBVFVTX05PX0ZDUElNX05FWFVTOworCisJYmZhX29zX21lbWNweShzdGF0cywgJml0bmltLT5zdGF0cywgc2l6ZW9mKHN0cnVjdCBiZmFfaXRuaW1fc3RhdHNfcykpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2Zjc19pdG5pbV9zdGF0c19jbGVhcihzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHd3bl90IHJwd3duKQoreworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltID0gTlVMTDsKKworCWJmYV9hc3NlcnQocG9ydCAhPSBOVUxMKTsKKworCWl0bmltID0gYmZhX2Zjc19pdG5pbV9sb29rdXAocG9ydCwgcnB3d24pOworCisJaWYgKGl0bmltID09IE5VTEwpCisJCXJldHVybiBCRkFfU1RBVFVTX05PX0ZDUElNX05FWFVTOworCisJYmZhX29zX21lbXNldCgmaXRuaW0tPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9pdG5pbV9zdGF0c19zKSk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK3ZvaWQKK2JmYV9mY3NfZmNwaW1fdWZfcmVjdihzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwgc3RydWN0IGZjaHNfcyAqZmNocywKKwkJICAgICAgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgKmVsc19jbWQ7CisKKwliZmFfdHJjKGl0bmltLT5mY3MsIGZjaHMtPnR5cGUpOworCisJaWYgKGZjaHMtPnR5cGUgIT0gRkNfVFlQRV9FTFMpCisJCXJldHVybjsKKworCWVsc19jbWQgPSAoc3RydWN0IGZjX2Vsc19jbWRfcyAqKSAoZmNocyArIDEpOworCisJYmZhX3RyYyhpdG5pbS0+ZmNzLCBlbHNfY21kLT5lbHNfY29kZSk7CisKKwlzd2l0Y2ggKGVsc19jbWQtPmVsc19jb2RlKSB7CisJY2FzZSBGQ19FTFNfUFJMTzoKKwkJLyogYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9GQ1NfSVROSU1fU01fUFJMTyk7ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3ZvaWQKK2JmYV9mY3NfaXRuaW1fcGF1c2Uoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pCit7Cit9CisKK3ZvaWQKK2JmYV9mY3NfaXRuaW1fcmVzdW1lKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworfQorCisvKioKKyAqICAgTW9kdWxlIGluaXRpYWxpemF0aW9uCisgKi8KK3ZvaWQKK2JmYV9mY3NfZmNwaW1fbW9kaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7Cit9CisKKy8qKgorICogICBNb2R1bGUgY2xlYW51cAorICovCit2b2lkCitiZmFfZmNzX2ZjcGltX21vZGV4aXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCWJmYV9mY3NfbW9kZXhpdF9jb21wKGZjcyk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY3B0bS5jIGIvZHJpdmVycy9zY3NpL2JmYS9mY3B0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGIwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2ZjcHRtLmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkdW1teSBGQ1BUTSByb3V0aW5lcyB0byBhaWQgaW4gSW5pdGlhdG9yIE1vZGUgb25seQorICogY29tcGlsYXRpb24gb2YgT1MgZHJpdmVyLgorICoKKyAqLworCisjaW5jbHVkZSAiYmZhX29zX2luYy5oIgorI2luY2x1ZGUgImZjc19ycG9ydC5oIgorI2luY2x1ZGUgImZjc19mY3B0bS5oIgorI2luY2x1ZGUgImZjcy9iZmFfZmNzX3Jwb3J0LmgiCisKK3N0cnVjdCBiZmFfZmNzX3Rpbl9zICoKK2JmYV9mY3NfdGluX2NyZWF0ZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZAorYmZhX2Zjc190aW5fZGVsZXRlKHN0cnVjdCBiZmFfZmNzX3Rpbl9zICp0aW4pCit7Cit9CisKK3ZvaWQKK2JmYV9mY3NfdGluX3Jwb3J0X29mZmxpbmUoc3RydWN0IGJmYV9mY3NfdGluX3MgKnRpbikKK3sKK30KKwordm9pZAorYmZhX2Zjc190aW5fcnBvcnRfb25saW5lKHN0cnVjdCBiZmFfZmNzX3Rpbl9zICp0aW4pCit7Cit9CisKK3ZvaWQKK2JmYV9mY3NfdGluX3J4X3BybGkoc3RydWN0IGJmYV9mY3NfdGluX3MgKnRpbiwgc3RydWN0IGZjaHNfcyAqZmNocywgdTE2IGxlbikKK3sKK30KKwordm9pZAorYmZhX2Zjc19mY3B0bV91Zl9yZWN2KHN0cnVjdCBiZmFfZmNzX3Rpbl9zICp0aW4sIHN0cnVjdCBmY2hzX3MgKmZjaHMsIHUxNiBsZW4pCit7Cit9CisKK3ZvaWQKK2JmYV9mY3NfdGluX3BhdXNlKHN0cnVjdCBiZmFfZmNzX3Rpbl9zICp0aW4pCit7Cit9CisKK3ZvaWQKK2JmYV9mY3NfdGluX3Jlc3VtZShzdHJ1Y3QgYmZhX2Zjc190aW5fcyAqdGluKQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY3MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlZTY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBmY3MuaCBGQ1MgbW9kdWxlIGZ1bmN0aW9ucworICovCisKKworI2lmbmRlZiBfX0ZDU19IX18KKyNkZWZpbmUgX19GQ1NfSF9fCisKKyNkZWZpbmUgX19mY3NfbWluX2NmZyhfX2ZjcykgICAgICAgKF9fZmNzKS0+bWluX2NmZworCit2b2lkIGJmYV9mY3NfbW9kZXhpdF9jb21wKHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7CisKKyNlbmRpZiAvKiBfX0ZDU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmNzX2F1dGguaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX2F1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWQxNTVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfYXV0aC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgZmNzX3VmLmggRkNTIHVuc29saWNpdGVkIGZyYW1lIHJlY2VpdmUKKyAqLworCisKKyNpZm5kZWYgX19GQ1NfQVVUSF9IX18KKyNkZWZpbmUgX19GQ1NfQVVUSF9IX18KKworI2luY2x1ZGUgPGZjcy9iZmFfZmNzLmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfdnBvcnQuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjc19scG9ydC5oPgorCisvKgorICogZmNzIGZyaWVuZCBmdW5jdGlvbnM6IG9ubHkgYmV0d2VlbiBmY3MgbW9kdWxlcworICovCit2b2lkIGJmYV9mY3NfYXV0aF91Zl9yZWN2KHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsIGludCBsZW4pOwordm9pZCBiZmFfZmNzX2F1dGhfc3RhcnQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyk7Cit2b2lkIGJmYV9mY3NfYXV0aF9zdG9wKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpOworCisjZW5kaWYgLyogX19GQ1NfVUZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc19mYWJyaWMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX2ZhYnJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTk2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc19mYWJyaWMuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIGZjc19scG9ydC5oIEZDUyBsb2dpY2FsIHBvcnQgaW50ZXJmYWNlcworICovCisKKyNpZm5kZWYgX19GQ1NfRkFCUklDX0hfXworI2RlZmluZSBfX0ZDU19GQUJSSUNfSF9fCisKKyNpbmNsdWRlIDxmY3MvYmZhX2Zjcy5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX3Zwb3J0Lmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfbHBvcnQuaD4KKworLyoKKyogZmNzIGZyaWVuZCBmdW5jdGlvbnM6IG9ubHkgYmV0d2VlbiBmY3MgbW9kdWxlcworICovCit2b2lkICAgICAgICAgICAgYmZhX2Zjc19mYWJyaWNfbW9kaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfZmFicmljX21vZGV4aXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKTsKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX2ZhYnJpY19tb2RzdXNwKHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19mYWJyaWNfbGlua191cChzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKTsKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX2ZhYnJpY19saW5rX2Rvd24oc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19mYWJyaWNfYWRkdnBvcnQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCQkJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfZmFicmljX2RlbHZwb3J0KHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMsCisJCQkJCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KTsKK2ludCAgICAgICAgICAgICBiZmFfZmNzX2ZhYnJpY19pc19vbmxpbmUoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyk7CitzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICpiZmFfZmNzX2ZhYnJpY192cG9ydF9sb29rdXAoCisJCQlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljLCB3d25fdCBwd3duKTsKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX2ZhYnJpY19tb2RzdGFydChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfZmFicmljX3VmX3JlY3Yoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCXN0cnVjdCBmY2hzX3MgKmZjaHMsIHUxNiBsZW4pOwordTE2ICAgICAgICBiZmFfZmNzX2ZhYnJpY192cG9ydF9jb3VudChzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKTsKK2JmYV9ib29sZWFuX3QgICBiZmFfZmNzX2ZhYnJpY19pc19sb29wYmFjayhzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKTsKK2VudW0gYmZhX3Bwb3J0X3R5cGUgYmZhX2Zjc19mYWJyaWNfcG9ydF90eXBlKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpOwordm9pZCAgICAgCWJmYV9mY3NfZmFicmljX3BzeW1iX2luaXQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyk7Cit2b2lkIGJmYV9mY3NfZmFicmljX3BvcnRfZGVsZXRlX2NvbXAoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyk7CisKK2JmYV9zdGF0dXNfdCBiZmFfZmNzX2ZhYnJpY19hZGR2ZihzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqdmYsCisJCQlzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcG9ydF9jZmcsCisJCQlzdHJ1Y3QgYmZhZF92Zl9zICp2Zl9kcnYpOwordm9pZCBiZmFfZmNzX2F1dGhfZmluaXNoZWQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCWVudW0gYXV0aF9zdGF0dXMgc3RhdHVzKTsKKwordm9pZCBiZmFfZmNzX2ZhYnJpY19zZXRfZmFicmljX25hbWUoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKKwkJCXd3bl90IGZhYnJpY19uYW1lKTsKKyNlbmRpZiAvKiBfX0ZDU19GQUJSSUNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc19mY3BpbS5oIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfZmNwaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWU5ZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfZmNwaW0uaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fRkNTX0ZDUElNX0hfXworI2RlZmluZSBfX0ZDU19GQ1BJTV9IX18KKworI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcG9ydC5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX2xwb3J0Lmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfcnBvcnQuaD4KKworLyoKKyAqIEZvbGxvd2luZyByb3V0aW5lcyBhcmUgZnJvbSBGQ1BJTSBhbmQgd2lsbCBiZSBjYWxsZWQgYnkgcnBvcnQuCisgKi8KK3N0cnVjdCBiZmFfZmNzX2l0bmltX3MgKmJmYV9mY3NfaXRuaW1fY3JlYXRlKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK3ZvaWQgYmZhX2Zjc19pdG5pbV9kZWxldGUoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pOwordm9pZCBiZmFfZmNzX2l0bmltX3Jwb3J0X29mZmxpbmUoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pOwordm9pZCBiZmFfZmNzX2l0bmltX3Jwb3J0X29ubGluZShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSk7CitiZmFfc3RhdHVzX3QgYmZhX2Zjc19pdG5pbV9nZXRfb25saW5lX3N0YXRlKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKTsKKwordm9pZCBiZmFfZmNzX2l0bmltX2lzX2luaXRpYXRvcihzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSk7Cit2b2lkIGJmYV9mY3NfaXRuaW1fcGF1c2Uoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pOwordm9pZCBiZmFfZmNzX2l0bmltX3Jlc3VtZShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSk7CisKKy8qCisgKiBNb2R1ZGxlIGluaXQvY2xlYW51cCByb3V0aW5lcy4KKyAqLwordm9pZCBiZmFfZmNzX2ZjcGltX21vZGluaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKTsKK3ZvaWQgYmZhX2Zjc19mY3BpbV9tb2RleGl0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7Cit2b2lkIGJmYV9mY3NfZmNwaW1fdWZfcmVjdihzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwgc3RydWN0IGZjaHNfcyAqZmNocywKKwkJCXUxNiBsZW4pOworI2VuZGlmIC8qIF9fRkNTX0ZDUElNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY3NfZmNwdG0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX2ZjcHRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmZjA4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX2ZjcHRtLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fRkNTX0ZDUFRNX0hfXworI2RlZmluZSBfX0ZDU19GQ1BUTV9IX18KKworI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcG9ydC5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX2xwb3J0Lmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfcnBvcnQuaD4KKworLyoKKyAqIEZvbGxvd2luZyByb3V0aW5lcyBhcmUgZnJvbSBGQ1BUTSBhbmQgd2lsbCBiZSBjYWxsZWQgYnkgcnBvcnQuCisgKi8KK3N0cnVjdCBiZmFfZmNzX3Rpbl9zICpiZmFfZmNzX3Rpbl9jcmVhdGUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOwordm9pZCBiZmFfZmNzX3Rpbl9ycG9ydF9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3Rpbl9zICp0aW4pOwordm9pZCBiZmFfZmNzX3Rpbl9ycG9ydF9vbmxpbmUoc3RydWN0IGJmYV9mY3NfdGluX3MgKnRpbik7Cit2b2lkIGJmYV9mY3NfdGluX2RlbGV0ZShzdHJ1Y3QgYmZhX2Zjc190aW5fcyAqdGluKTsKK3ZvaWQgYmZhX2Zjc190aW5fcnhfcHJsaShzdHJ1Y3QgYmZhX2Zjc190aW5fcyAqdGluLCBzdHJ1Y3QgZmNoc19zICpmY2hzLAorCQkJdTE2IGxlbik7Cit2b2lkIGJmYV9mY3NfdGluX3BhdXNlKHN0cnVjdCBiZmFfZmNzX3Rpbl9zICp0aW4pOwordm9pZCBiZmFfZmNzX3Rpbl9yZXN1bWUoc3RydWN0IGJmYV9mY3NfdGluX3MgKnRpbik7CisKKy8qCisgKiBNb2R1ZGxlIGluaXQvY2xlYW51cCByb3V0aW5lcy4KKyAqLwordm9pZCBiZmFfZmNzX2ZjcHRtX21vZGluaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKTsKK3ZvaWQgYmZhX2Zjc19mY3B0bV9tb2RleGl0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7Cit2b2lkIGJmYV9mY3NfZmNwdG1fdWZfcmVjdihzdHJ1Y3QgYmZhX2Zjc190aW5fcyAqdGluLCBzdHJ1Y3QgZmNoc19zICpmY2hzLAorCQkJdTE2IGxlbik7CisKKyNlbmRpZiAvKiBfX0ZDU19GQ1BUTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmNzX2ZjeHAuaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX2ZjeHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc3ZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfZmN4cC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgZmNzX2ZjeHAuaCBGQ1hQIGhlbHBlciBtYWNyb3MgZm9yIEZDUworICovCisKKworI2lmbmRlZiBfX0ZDU19GQ1hQX0hfXworI2RlZmluZSBfX0ZDU19GQ1hQX0hfXworCisjZGVmaW5lIGJmYV9mY3NfZmN4cF9hbGxvYyhfX2ZjcykJXAorCWJmYV9mY3hwX2FsbG9jKE5VTEwsIChfX2ZjcyktPmJmYSwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkKKworI2VuZGlmIC8qIF9fRkNTX0ZDWFBfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc19scG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfbHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTc0NGJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfbHBvcnQuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBmY3NfbHBvcnQuaCBGQ1MgbG9naWNhbCBwb3J0IGludGVyZmFjZXMKKyAqLworCisjaWZuZGVmIF9fRkNTX0xQT1JUX0hfXworI2RlZmluZSBfX0ZDU19MUE9SVF9IX18KKworI2RlZmluZSBfX1ZQT1JUX0hfXworI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcG9ydC5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjc19scG9ydC5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX3Jwb3J0Lmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfdnBvcnQuaD4KKyNpbmNsdWRlIDxmY3NfZmFicmljLmg+CisjaW5jbHVkZSA8ZmNzX21zLmg+CisjaW5jbHVkZSA8Y3MvYmZhX3EuaD4KKyNpbmNsdWRlIDxmY2J1aWxkLmg+CisKKy8qCisgKiBQSUQgdXNlZCBpbiBQMlAvTjJOICggSW4gQmlnIEVuZGlhbikKKyAqLworI2RlZmluZSBOMk5fTE9DQUxfUElECSAgICAweDAxMDAwMAorI2RlZmluZSBOMk5fUkVNT1RFX1BJRAkJMHgwMjAwMDAKKworLyoKKyAqIE1pc2MgVGltZW91dHMKKyAqLworLyoKKyAqIFRvIGJlIHVzZWQgd2hlbiBzcGF3bmluZyBhIHRpbWVyIGJlZm9yZSByZXRyeWluZyBhIGZhaWxlZCBjb21tYW5kLiBNaWxsaQorICogU2Vjcy4KKyAqLworI2RlZmluZQlCRkFfRkNTX1JFVFJZX1RJTUVPVVQgMjAwMAorCisvKgorICogQ2hlY2sgZm9yIFBvcnQvVnBvcnQgTW9kZS9Sb2xlCisgKi8KKyNkZWZpbmUJQkZBX0ZDU19WUE9SVF9JU19JTklUSUFUT1JfTU9ERShwb3J0KSBcCisJCShwb3J0LT5wb3J0X2NmZy5yb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lNKQorCisjZGVmaW5lCUJGQV9GQ1NfVlBPUlRfSVNfVEFSR0VUX01PREUocG9ydCkgXAorCQkocG9ydC0+cG9ydF9jZmcucm9sZXMgJiBCRkFfUE9SVF9ST0xFX0ZDUF9UTSkKKworI2RlZmluZQlCRkFfRkNTX1ZQT1JUX0lTX0lQRkNfTU9ERShwb3J0KSBcCisJCShwb3J0LT5wb3J0X2NmZy5yb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lQRkMpCisKKy8qCisgKiBJcyB0aGlzIGEgV2VsbCBLbm93biBBZGRyZXNzCisgKi8KKyNkZWZpbmUgQkZBX0ZDU19QSURfSVNfV0tBKHBpZCkgICgoYmZhX29zX250b2gzYihwaWQpID4gMHhGRkYwMDApID8gIDEgOiAwKQorCisvKgorICogUG9pbnRlciB0byBlbGVtZW50cyB3aXRoaW4gUG9ydAorICovCisjZGVmaW5lIEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQocG9ydCkgIChwb3J0LT5mY3MtPmJmYSkKKyNkZWZpbmUgQkZBX0ZDU19HRVRfTlNfRlJPTV9QT1JUKHBvcnQpICAoJnBvcnQtPnBvcnRfdG9wby5wZmFiLm5zKQorI2RlZmluZSBCRkFfRkNTX0dFVF9TQ05fRlJPTV9QT1JUKHBvcnQpICAoJnBvcnQtPnBvcnRfdG9wby5wZmFiLnNjbikKKyNkZWZpbmUgQkZBX0ZDU19HRVRfTVNfRlJPTV9QT1JUKHBvcnQpICAoJnBvcnQtPnBvcnRfdG9wby5wZmFiLm1zKQorI2RlZmluZSBCRkFfRkNTX0dFVF9GRE1JX0ZST01fUE9SVChwb3J0KSAgKCZwb3J0LT5wb3J0X3RvcG8ucGZhYi5tcy5mZG1pKQorCisvKgorICogaGFuZGxlciBmb3IgdW5zb2xpY2llZCBmcmFtZXMKKyAqLwordm9pZCBiZmFfZmNzX3BvcnRfdWZfcmVjdihzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKmxwb3J0LCBzdHJ1Y3QgZmNoc19zICpmY2hzLAorCQkJdTE2IGxlbik7CisKKy8qCisgKiBGb2xsb3dpbmcgcm91dGluZXMgd2lsbCBiZSBjYWxsZWQgYnkgRmFicmljIHRvIGluZGljYXRlIHBvcnQKKyAqIG9ubGluZS9vZmZsaW5lIHRvIHZwb3J0LgorICovCit2b2lkIGJmYV9mY3NfbHBvcnRfaW5pdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKmxwb3J0LCBzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsCisJCQl1MTYgdmZfaWQsIHN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcG9ydF9jZmcsCisJCQlzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCk7Cit2b2lkIGJmYV9mY3NfcG9ydF9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKK3ZvaWQgYmZhX2Zjc19wb3J0X29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKK3ZvaWQgYmZhX2Zjc19wb3J0X2RlbGV0ZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOworYmZhX2Jvb2xlYW5fdCAgIGJmYV9mY3NfcG9ydF9pc19vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKKworLyoKKyAqIExvb2t1cCBycG9ydCBiYXNlZCBvbiBQSUQKKyAqLworc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9ieV9waWQoCisJCQlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHUzMiBwaWQpOworCisvKgorICogTG9va3VwIHJwb3J0IGJhc2VkIG9uIFBXV04KKyAqLworc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9ieV9wd3duKAorCQkJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LCB3d25fdCBwd3duKTsKK3N0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKmJmYV9mY3NfcG9ydF9nZXRfcnBvcnRfYnlfbnd3bigKKwkJCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3Qgbnd3bik7Cit2b2lkIGJmYV9mY3NfcG9ydF9hZGRfcnBvcnQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOwordm9pZCBiZmFfZmNzX3BvcnRfZGVsX3Jwb3J0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKKwordm9pZCBiZmFfZmNzX3BvcnRfbW9kaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOwordm9pZCBiZmFfZmNzX3BvcnRfbW9kZXhpdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOwordm9pZCBiZmFfZmNzX3BvcnRfbGlwKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7CisKKyNlbmRpZiAvKiBfX0ZDU19MUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmNzX21zLmggYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc19tcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YThjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc19tcy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgZmNzX21zLmggRkNTIG1zIGludGVyZmFjZXMKKyAqLworI2lmbmRlZiBfX0ZDU19NU19IX18KKyNkZWZpbmUgX19GQ1NfTVNfSF9fCisKKy8qIE1TIEZDUyByb3V0aW5lcyAqLwordm9pZCBiZmFfZmNzX3BvcnRfbXNfaW5pdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOwordm9pZCBiZmFfZmNzX3BvcnRfbXNfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOwordm9pZCBiZmFfZmNzX3BvcnRfbXNfb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7Cit2b2lkIGJmYV9mY3NfcG9ydF9tc19mYWJyaWNfcnNjbihzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOworCisvKiBGRE1JIEZDUyByb3V0aW5lcyAqLwordm9pZCBiZmFfZmNzX3BvcnRfZmRtaV9pbml0KHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMpOwordm9pZCBiZmFfZmNzX3BvcnRfZmRtaV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMpOwordm9pZCBiZmFfZmNzX3BvcnRfZmRtaV9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY3NfcG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjY1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc19wb3J0LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBmY3NfcHBvcnQuaCBGQ1MgcGh5c2ljYWwgcG9ydCBpbnRlcmZhY2VzCisgKi8KKworCisjaWZuZGVmIF9fRkNTX1BQT1JUX0hfXworI2RlZmluZSBfX0ZDU19QUE9SVF9IX18KKworLyoKKyAqIGZjcyBmcmllbmQgZnVuY3Rpb25zOiBvbmx5IGJldHdlZW4gZmNzIG1vZHVsZXMKKyAqLwordm9pZCBiZmFfZmNzX3Bwb3J0X21vZGluaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKTsKK3ZvaWQgYmZhX2Zjc19wcG9ydF9tb2RleGl0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7CisKKyNlbmRpZiAvKiBfX0ZDU19QUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmNzX3Jwb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc19ycG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDFlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc19ycG9ydC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgZmNzX3Jwb3J0LmggRkNTIHJwb3J0IGludGVyZmFjZXMgYW5kIGRlZmluZXMKKyAqLworCisjaWZuZGVmIF9fRkNTX1JQT1JUX0hfXworI2RlZmluZSBfX0ZDU19SUE9SVF9IX18KKworI2luY2x1ZGUgPGZjcy9iZmFfZmNzX3Jwb3J0Lmg+CisKK3ZvaWQgYmZhX2Zjc19ycG9ydF9tb2Rpbml0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7Cit2b2lkIGJmYV9mY3NfcnBvcnRfbW9kZXhpdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOworCit2b2lkIGJmYV9mY3NfcnBvcnRfdWZfcmVjdihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwgc3RydWN0IGZjaHNfcyAqZmNocywKKwkJCXUxNiBsZW4pOwordm9pZCBiZmFfZmNzX3Jwb3J0X3NjbihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCk7CisKK3N0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKmJmYV9mY3NfcnBvcnRfY3JlYXRlKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXUzMiBwaWQpOwordm9pZCBiZmFfZmNzX3Jwb3J0X2RlbGV0ZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCk7Cit2b2lkIGJmYV9mY3NfcnBvcnRfb25saW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK3ZvaWQgYmZhX2Zjc19ycG9ydF9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK3ZvaWQgYmZhX2Zjc19ycG9ydF9zdGFydChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHN0cnVjdCBmY2hzX3MgKnJ4X2ZjaHMsCisJCQlzdHJ1Y3QgZmNfbG9naV9zICpwbG9naV9yc3ApOwordm9pZCBiZmFfZmNzX3Jwb3J0X3Bsb2dpX2NyZWF0ZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQlzdHJ1Y3QgZmNoc19zICpyeF9mY2hzLAorCQkJc3RydWN0IGZjX2xvZ2lfcyAqcGxvZ2kpOwordm9pZCBiZmFfZmNzX3Jwb3J0X3Bsb2dpKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LCBzdHJ1Y3QgZmNoc19zICpmY2hzLAorCQkJc3RydWN0IGZjX2xvZ2lfcyAqcGxvZ2kpOwordm9pZCBiZmFfZmNzX3Jwb3J0X2xvZ29faW1wKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK3ZvaWQgYmZhX2Zjc19ycG9ydF9pdG5pbV9hY2soc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOwordm9pZCBiZmFfZmNzX3Jwb3J0X2l0bnRtX2FjayhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCk7Cit2b2lkIGJmYV9mY3NfcnBvcnRfdGluX2FjayhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCk7Cit2b2lkIGJmYV9mY3NfcnBvcnRfZmNwdG1fb2ZmbGluZV9kb25lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK2ludCAgYmZhX2Zjc19ycG9ydF9nZXRfc3RhdGUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOworc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqYmZhX2Zjc19ycG9ydF9jcmVhdGVfYnlfd3duKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXd3bl90IHd3bik7CisKKworLyogUnBvcnQgRmVhdHVyZXMgKi8KK3ZvaWQgIGJmYV9mY3NfcnBmX2luaXQoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOwordm9pZCAgYmZhX2Zjc19ycGZfcnBvcnRfb25saW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK3ZvaWQgIGJmYV9mY3NfcnBmX3Jwb3J0X29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOworCisjZW5kaWYgLyogX19GQ1NfUlBPUlRfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc190cmNtb2QuaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX3RyY21vZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjVhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2Zjc190cmNtb2QuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIGZjc190cmNtb2QuaCBCRkEgRkNTIHRyYWNlIG1vZHVsZXMKKyAqLworCisjaWZuZGVmIF9fRkNTX1RSQ01PRF9IX18KKyNkZWZpbmUgX19GQ1NfVFJDTU9EX0hfXworCisjaW5jbHVkZSA8Y3MvYmZhX3RyYy5oPgorCisvKgorICogISEhIE9ubHkgYXBwZW5kIHRvIHRoZSBlbnVtcyBkZWZpbmVkIGhlcmUgdG8gYXZvaWQgYW55IHZlcnNpb25pbmcKKyAqICEhISBuZWVkZWQgYmV0d2VlbiB0cmFjZSB1dGlsaXR5IGFuZCBkcml2ZXIgdmVyc2lvbgorICovCitlbnVtIHsKKwlCRkFfVFJDX0ZDU19GQUJSSUMJCT0gMSwKKwlCRkFfVFJDX0ZDU19WRkFQSQkJPSAyLAorCUJGQV9UUkNfRkNTX1BPUlQJCT0gMywKKwlCRkFfVFJDX0ZDU19WUE9SVAkJPSA0LAorCUJGQV9UUkNfRkNTX1ZQX0FQSQkJPSA1LAorCUJGQV9UUkNfRkNTX1ZQUwkJCT0gNiwKKwlCRkFfVFJDX0ZDU19SUE9SVAkJPSA3LAorCUJGQV9UUkNfRkNTX0ZDUElNCQk9IDgsCisJQkZBX1RSQ19GQ1NfRkNQVE0JCT0gOSwKKwlCRkFfVFJDX0ZDU19OUwkJCT0gMTAsCisJQkZBX1RSQ19GQ1NfU0NOCQkJPSAxMSwKKwlCRkFfVFJDX0ZDU19MT09QCQk9IDEyLAorCUJGQV9UUkNfRkNTX1VGCQkJPSAxMywKKwlCRkFfVFJDX0ZDU19QUE9SVAkJPSAxNCwKKwlCRkFfVFJDX0ZDU19GQ1BJUAkJPSAxNSwKKwlCRkFfVFJDX0ZDU19QT1JUX0FQSQk9IDE2LAorCUJGQV9UUkNfRkNTX1JQT1JUX0FQSQk9IDE3LAorCUJGQV9UUkNfRkNTX0FVVEgJCT0gMTgsCisJQkZBX1RSQ19GQ1NfTjJOCQkJPSAxOSwKKwlCRkFfVFJDX0ZDU19NUwkJCT0gMjAsCisJQkZBX1RSQ19GQ1NfRkRNSQkJPSAyMSwKKwlCRkFfVFJDX0ZDU19SUE9SVF9GVFJTCT0gMjIsCit9OworCisjZW5kaWYgLyogX19GQ1NfVFJDTU9EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9mY3NfdWYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX3VmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmMWJkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmNzX3VmLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBmY3NfdWYuaCBGQ1MgdW5zb2xpY2l0ZWQgZnJhbWUgcmVjZWl2ZQorICovCisKKworI2lmbmRlZiBfX0ZDU19VRl9IX18KKyNkZWZpbmUgX19GQ1NfVUZfSF9fCisKKy8qCisgKiBmY3MgZnJpZW5kIGZ1bmN0aW9uczogb25seSBiZXR3ZWVuIGZjcyBtb2R1bGVzCisgKi8KK3ZvaWQgYmZhX2Zjc191Zl9tb2Rpbml0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7Cit2b2lkIGJmYV9mY3NfdWZfbW9kZXhpdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOworCisjZW5kaWYgLyogX19GQ1NfVUZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2Zjc192cG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfdnBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTgwYjZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9mY3NfdnBvcnQuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19GQ1NfVlBPUlRfSF9fCisjZGVmaW5lIF9fRkNTX1ZQT1JUX0hfXworCisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfbHBvcnQuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjc192cG9ydC5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcGNpLmg+CisKKy8qCisgKiBNb2R1ZGxlIGluaXQvY2xlYW51cCByb3V0aW5lcy4KKyAqLworCit2b2lkIGJmYV9mY3NfdnBvcnRfbW9kaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOwordm9pZCBiZmFfZmNzX3Zwb3J0X21vZGV4aXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKTsKKwordm9pZCBiZmFfZmNzX3Zwb3J0X2NsZWFudXAoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwordm9pZCBiZmFfZmNzX3Zwb3J0X29ubGluZShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCk7Cit2b2lkIGJmYV9mY3NfdnBvcnRfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCk7Cit2b2lkIGJmYV9mY3NfdnBvcnRfZGVsZXRlX2NvbXAoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwordTMyIGJmYV9mY3NfdnBvcnRfZ2V0X21heChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOworCisjZW5kaWYgLyogX19GQ1NfVlBPUlRfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvZmRtaS5jIGIvZHJpdmVycy9zY3NpL2JmYS9mZG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0NWViMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvZmRtaS5jCkBAIC0wLDAgKzEsMTIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBwb3J0X2FwaS5jIEJGQSBGQ1MgcG9ydAorICovCisKKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlICJmY3NfbHBvcnQuaCIKKyNpbmNsdWRlICJmY3NfcnBvcnQuaCIKKyNpbmNsdWRlICJscG9ydF9wcml2LmgiCisjaW5jbHVkZSAiZmNzX3RyY21vZC5oIgorI2luY2x1ZGUgImZjc19mY3hwLmgiCisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfZmRtaS5oPgorCitCRkFfVFJDX0ZJTEUoRkNTLCBGRE1JKTsKKworI2RlZmluZSBCRkFfRkNTX0ZETUlfQ01EX01BWF9SRVRSSUVTIDIKKworLyoKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfZmRtaV9zZW5kX3JoYmEodm9pZCAqZmRtaV9jYmFyZywKKwkJCQkJICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9mZG1pX3NlbmRfcnBydCh2b2lkICpmZG1pX2NiYXJnLAorCQkJCQkgICAgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X2ZkbWlfc2VuZF9ycGEodm9pZCAqZmRtaV9jYmFyZywKKwkJCQkJICAgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X2ZkbWlfcmhiYV9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCQlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQkJCXZvaWQgKmNiYXJnLAorCQkJCQkJYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCQl1MzIgcnNwX2xlbiwKKwkJCQkJCXUzMiByZXNpZF9sZW4sCisJCQkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X2ZkbWlfcnBydF9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCQlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQkJCXZvaWQgKmNiYXJnLAorCQkJCQkJYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCQl1MzIgcnNwX2xlbiwKKwkJCQkJCXUzMiByZXNpZF9sZW4sCisJCQkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X2ZkbWlfcnBhX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywKKwkJCQkJICAgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkgICAgICAgdm9pZCAqY2JhcmcsCisJCQkJCSAgICAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQkJICAgICAgIHUzMiByc3BfbGVuLAorCQkJCQkgICAgICAgdTMyIHJlc2lkX2xlbiwKKwkJCQkJICAgICAgIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfZmRtaV90aW1lb3V0KHZvaWQgKmFyZyk7CitzdGF0aWMgdTE2IGJmYV9mY3NfcG9ydF9mZG1pX2J1aWxkX3JoYmFfcHlsZCgKKwkJCXN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLCB1OCAqcHlsZCk7CitzdGF0aWMgdTE2IGJmYV9mY3NfcG9ydF9mZG1pX2J1aWxkX3JwcnRfcHlsZCgKKwkJCXN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLCB1OCAqcHlsZCk7CitzdGF0aWMgdTE2IGJmYV9mY3NfcG9ydF9mZG1pX2J1aWxkX3JwYV9weWxkKAorCQkJc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksIHU4ICpweWxkKTsKK3N0YXRpYyB1MTYgYmZhX2Zjc19wb3J0X2ZkbWlfYnVpbGRfcG9ydGF0dHJfYmxvY2soCisJCQlzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwgdTggKnB5bGQpOwordm9pZCBiZmFfZmNzX2ZkbWlfZ2V0X2hiYWF0dHIoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQlzdHJ1Y3QgYmZhX2Zjc19mZG1pX2hiYV9hdHRyX3MgKmhiYV9hdHRyKTsKK3ZvaWQgYmZhX2Zjc19mZG1pX2dldF9wb3J0YXR0cihzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCXN0cnVjdCBiZmFfZmNzX2ZkbWlfcG9ydF9hdHRyX3MgKnBvcnRfYXR0cik7CisvKioKKyAqICBmY3NfZmRtaV9zbSBGQ1MgRkRNSSBzdGF0ZSBtYWNoaW5lCisgKi8KKworLyoqCisgKiAgRkRNSSBTdGF0ZSBNYWNoaW5lIGV2ZW50cworICovCitlbnVtIHBvcnRfZmRtaV9ldmVudCB7CisJRkRNSVNNX0VWRU5UX1BPUlRfT05MSU5FID0gMSwKKwlGRE1JU01fRVZFTlRfUE9SVF9PRkZMSU5FID0gMiwKKwlGRE1JU01fRVZFTlRfUlNQX09LID0gNCwKKwlGRE1JU01fRVZFTlRfUlNQX0VSUk9SID0gNSwKKwlGRE1JU01fRVZFTlRfVElNRU9VVCA9IDYsCisJRkRNSVNNX0VWRU5UX1JIQkFfU0VOVCA9IDcsCisJRkRNSVNNX0VWRU5UX1JQUlRfU0VOVCA9IDgsCisJRkRNSVNNX0VWRU5UX1JQQV9TRU5UID0gOSwKK307CisKK3N0YXRpYyB2b2lkIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQllbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9zZW5kaW5nX3JoYmEoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQllbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9yaGJhKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJZW51bSBwb3J0X2ZkbWlfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgYmZhX2Zjc19wb3J0X2ZkbWlfc21fcmhiYV9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCWVudW0gcG9ydF9mZG1pX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9mY3NfcG9ydF9mZG1pX3NtX3NlbmRpbmdfcnBydChzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCWVudW0gcG9ydF9mZG1pX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9mY3NfcG9ydF9mZG1pX3NtX3JwcnQoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQllbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9ycHJ0X3JldHJ5KHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJZW51bSBwb3J0X2ZkbWlfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgYmZhX2Zjc19wb3J0X2ZkbWlfc21fc2VuZGluZ19ycGEoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQllbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X2ZkbWlfc21fcnBhKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJZW51bSBwb3J0X2ZkbWlfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9mZG1pX3NtX3JwYV9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCWVudW0gcG9ydF9mZG1pX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfZmRtaV9zbV9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQllbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCk7CisvKioKKyAqIAkJU3RhcnQgaW4gb2ZmbGluZSBzdGF0ZSAtIGF3YWl0aW5nIE1TIHRvIHNlbmQgc3RhcnQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfZmRtaV9zbV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJICAgICBlbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJZmRtaS0+cmV0cnlfY250ID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEZETUlTTV9FVkVOVF9QT1JUX09OTElORToKKwkJaWYgKHBvcnQtPnZwb3J0KSB7CisJCQkvKgorCQkJICogRm9yIFZwb3J0cywgcmVnaXN0ZXIgYSBuZXcgcG9ydC4KKwkJCSAqLworCQkJYmZhX3NtX3NldF9zdGF0ZShmZG1pLAorCQkJCQkgYmZhX2Zjc19wb3J0X2ZkbWlfc21fc2VuZGluZ19ycHJ0KTsKKwkJCWJmYV9mY3NfcG9ydF9mZG1pX3NlbmRfcnBydChmZG1pLCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBGb3IgYSBiYXNlIHBvcnQsIHdlIHNob3VsZCBmaXJzdCByZWdpc3RlciB0aGUgSEJBCisJCQkgKiBhdHJpYnV0ZS4gVGhlIEhCQSBhdHRyaWJ1dGUgYWxzbyBjb250YWlucyB0aGUgYmFzZQorCQkJICogIHBvcnQgcmVnaXN0cmF0aW9uLgorCQkJICovCisJCQliZmFfc21fc2V0X3N0YXRlKGZkbWksCisJCQkJCSBiZmFfZmNzX3BvcnRfZmRtaV9zbV9zZW5kaW5nX3JoYmEpOworCQkJYmZhX2Zjc19wb3J0X2ZkbWlfc2VuZF9yaGJhKGZkbWksIE5VTEwpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfc21fc2VuZGluZ19yaGJhKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJCSAgZW51bSBwb3J0X2ZkbWlfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gZmRtaS0+bXMtPnBvcnQ7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEZETUlTTV9FVkVOVF9SSEJBX1NFTlQ6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fcmhiYSk7CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQocG9ydCksCisJCQkJICAgICAgICZmZG1pLT5mY3hwX3dxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfZmRtaV9zbV9yaGJhKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJICBlbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRkRNSVNNX0VWRU5UX1JTUF9FUlJPUjoKKwkJLyoKKwkJICogaWYgbWF4IHJldHJpZXMgaGF2ZSBub3QgYmVlbiByZWFjaGVkLCBzdGFydCB0aW1lciBmb3IgYQorCQkgKiBkZWxheWVkIHJldHJ5CisJCSAqLworCQlpZiAoZmRtaS0+cmV0cnlfY250KysgPCBCRkFfRkNTX0ZETUlfQ01EX01BWF9SRVRSSUVTKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX3JoYmFfcmV0cnkpOworCQkJYmZhX3RpbWVyX3N0YXJ0KEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQocG9ydCksCisJCQkJCSZmZG1pLT50aW1lciwgYmZhX2Zjc19wb3J0X2ZkbWlfdGltZW91dCwKKwkJCQkJZmRtaSwgQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBzZXQgc3RhdGUgdG8gb2ZmbGluZQorCQkJICovCisJCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29mZmxpbmUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUlNQX09LOgorCQkvKgorCQkgKiBJbml0aWF0ZSBSZWdpc3RlciBQb3J0IEF0dHJpYnV0ZXMKKwkJICovCisJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fc2VuZGluZ19ycGEpOworCQlmZG1pLT5yZXRyeV9jbnQgPSAwOworCQliZmFfZmNzX3BvcnRfZmRtaV9zZW5kX3JwYShmZG1pLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIEZETUlTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9mY3hwX2Rpc2NhcmQoZmRtaS0+ZmN4cCk7CisJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fb2ZmbGluZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfZmRtaV9zbV9yaGJhX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJCWVudW0gcG9ydF9mZG1pX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IGZkbWktPm1zLT5wb3J0OworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMocG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBGRE1JU01fRVZFTlRfVElNRU9VVDoKKwkJLyoKKwkJICogUmV0cnkgVGltZXIgRXhwaXJlZC4gUmUtc2VuZAorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShmZG1pLCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9zZW5kaW5nX3JoYmEpOworCQliZmFfZmNzX3BvcnRfZmRtaV9zZW5kX3JoYmEoZmRtaSwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmZmRtaS0+dGltZXIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKgorKiBSUFJUIDogUmVnaXN0ZXIgUG9ydAorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfc21fc2VuZGluZ19ycHJ0KHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJCSAgZW51bSBwb3J0X2ZkbWlfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gZmRtaS0+bXMtPnBvcnQ7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEZETUlTTV9FVkVOVF9SUFJUX1NFTlQ6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fcnBydCk7CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQocG9ydCksCisJCQkJICAgICAgICZmZG1pLT5mY3hwX3dxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfZmRtaV9zbV9ycHJ0KHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJICBlbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRkRNSVNNX0VWRU5UX1JTUF9FUlJPUjoKKwkJLyoKKwkJICogaWYgbWF4IHJldHJpZXMgaGF2ZSBub3QgYmVlbiByZWFjaGVkLCBzdGFydCB0aW1lciBmb3IgYQorCQkgKiBkZWxheWVkIHJldHJ5CisJCSAqLworCQlpZiAoZmRtaS0+cmV0cnlfY250KysgPCBCRkFfRkNTX0ZETUlfQ01EX01BWF9SRVRSSUVTKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX3JwcnRfcmV0cnkpOworCQkJYmZhX3RpbWVyX3N0YXJ0KEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQocG9ydCksCisJCQkJCSZmZG1pLT50aW1lciwgYmZhX2Zjc19wb3J0X2ZkbWlfdGltZW91dCwKKwkJCQkJZmRtaSwgQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHNldCBzdGF0ZSB0byBvZmZsaW5lCisJCQkgKi8KKwkJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fb2ZmbGluZSk7CisJCQlmZG1pLT5yZXRyeV9jbnQgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUlNQX09LOgorCQlmZG1pLT5yZXRyeV9jbnQgPSAwOworCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29ubGluZSk7CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfZmN4cF9kaXNjYXJkKGZkbWktPmZjeHApOworCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29mZmxpbmUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfc21fcnBydF9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCQllbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRkRNSVNNX0VWRU5UX1RJTUVPVVQ6CisJCS8qCisJCSAqIFJldHJ5IFRpbWVyIEV4cGlyZWQuIFJlLXNlbmQKKwkJICovCisJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fc2VuZGluZ19ycHJ0KTsKKwkJYmZhX2Zjc19wb3J0X2ZkbWlfc2VuZF9ycHJ0KGZkbWksIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgRkRNSVNNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShmZG1pLCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9vZmZsaW5lKTsKKwkJYmZhX3RpbWVyX3N0b3AoJmZkbWktPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoKKyAqIFJlZ2lzdGVyIFBvcnQgQXR0cmlidXRlcworICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfc21fc2VuZGluZ19ycGEoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQkJIGVudW0gcG9ydF9mZG1pX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IGZkbWktPm1zLT5wb3J0OworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMocG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBGRE1JU01fRVZFTlRfUlBBX1NFTlQ6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fcnBhKTsKKwkJYnJlYWs7CisKKwljYXNlIEZETUlTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fb2ZmbGluZSk7CisJCWJmYV9mY3hwX3dhbGxvY19jYW5jZWwoQkZBX0ZDU19HRVRfSEFMX0ZST01fUE9SVChwb3J0KSwKKwkJCQkgICAgICAgJmZkbWktPmZjeHBfd3FlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9mZG1pX3NtX3JwYShzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCSBlbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRkRNSVNNX0VWRU5UX1JTUF9FUlJPUjoKKwkJLyoKKwkJICogaWYgbWF4IHJldHJpZXMgaGF2ZSBub3QgYmVlbiByZWFjaGVkLCBzdGFydCB0aW1lciBmb3IgYQorCQkgKiBkZWxheWVkIHJldHJ5CisJCSAqLworCQlpZiAoZmRtaS0+cmV0cnlfY250KysgPCBCRkFfRkNTX0ZETUlfQ01EX01BWF9SRVRSSUVTKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX3JwYV9yZXRyeSk7CisJCQliZmFfdGltZXJfc3RhcnQoQkZBX0ZDU19HRVRfSEFMX0ZST01fUE9SVChwb3J0KSwKKwkJCQkJJmZkbWktPnRpbWVyLCBiZmFfZmNzX3BvcnRfZmRtaV90aW1lb3V0LAorCQkJCQlmZG1pLCBCRkFfRkNTX1JFVFJZX1RJTUVPVVQpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHNldCBzdGF0ZSB0byBvZmZsaW5lCisJCQkgKi8KKwkJCWJmYV9zbV9zZXRfc3RhdGUoZmRtaSwgYmZhX2Zjc19wb3J0X2ZkbWlfc21fb2ZmbGluZSk7CisJCQlmZG1pLT5yZXRyeV9jbnQgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUlNQX09LOgorCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29ubGluZSk7CisJCWZkbWktPnJldHJ5X2NudCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBGRE1JU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfZmN4cF9kaXNjYXJkKGZkbWktPmZjeHApOworCQliZmFfc21fc2V0X3N0YXRlKGZkbWksIGJmYV9mY3NfcG9ydF9mZG1pX3NtX29mZmxpbmUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfc21fcnBhX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJICAgICAgIGVudW0gcG9ydF9mZG1pX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IGZkbWktPm1zLT5wb3J0OworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMocG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBGRE1JU01fRVZFTlRfVElNRU9VVDoKKwkJLyoKKwkJICogUmV0cnkgVGltZXIgRXhwaXJlZC4gUmUtc2VuZAorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShmZG1pLCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9zZW5kaW5nX3JwYSk7CisJCWJmYV9mY3NfcG9ydF9mZG1pX3NlbmRfcnBhKGZkbWksIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgRkRNSVNNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShmZG1pLCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9vZmZsaW5lKTsKKwkJYmZhX3RpbWVyX3N0b3AoJmZkbWktPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9mZG1pX3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCSAgICBlbnVtIHBvcnRfZmRtaV9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRkRNSVNNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShmZG1pLCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9vZmZsaW5lKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisvKioKKyogICBSSEJBIDogUmVnaXN0ZXIgSEJBIEF0dHJpYnV0ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfZmRtaV9zZW5kX3JoYmEodm9pZCAqZmRtaV9jYmFyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSA9IGZkbWlfY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gZmRtaS0+bXMtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCWludCAgICAgICAgICAgICBsZW4sIGF0dHJfbGVuOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXU4ICAgICAgICAqcHlsZDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJYmZhX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJmZkbWktPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3BvcnRfZmRtaV9zZW5kX3JoYmEsIGZkbWkpOworCQlyZXR1cm47CisJfQorCWZkbWktPmZjeHAgPSBmY3hwOworCisJcHlsZCA9IGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCk7CisJYmZhX29zX21lbXNldChweWxkLCAwLCBGQ19NQVhfUERVU1opOworCisJbGVuID0gZmNfZmRtaV9yZXFoZHJfYnVpbGQoJmZjaHMsIHB5bGQsIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwKKwkJCQkgICBGRE1JX1JIQkEpOworCisJYXR0cl9sZW4gPSBiZmFfZmNzX3BvcnRfZmRtaV9idWlsZF9yaGJhX3B5bGQoZmRtaSwKKwkJCSh1OCAqKSAoKHN0cnVjdCBjdF9oZHJfcyAqKSBweWxkICsgMSkpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgKGxlbiArIGF0dHJfbGVuKSwgJmZjaHMsCisJCSAgICAgIGJmYV9mY3NfcG9ydF9mZG1pX3JoYmFfcmVzcG9uc2UsICh2b2lkICopZmRtaSwKKwkJICAgICAgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCisJYmZhX3NtX3NlbmRfZXZlbnQoZmRtaSwgRkRNSVNNX0VWRU5UX1JIQkFfU0VOVCk7Cit9CisKK3N0YXRpYyAgICAgICAgICB1MTYKK2JmYV9mY3NfcG9ydF9mZG1pX2J1aWxkX3JoYmFfcHlsZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCQkgIHU4ICpweWxkKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IGZkbWktPm1zLT5wb3J0OworCXN0cnVjdCBiZmFfZmNzX2ZkbWlfaGJhX2F0dHJfcyBoYmFfYXR0cjsJLyogQHRvZG8gKi8KKwlzdHJ1Y3QgYmZhX2Zjc19mZG1pX2hiYV9hdHRyX3MgKmZjc19oYmFfYXR0ciA9ICZoYmFfYXR0cjsgLyogQHRvZG8gKi8KKwlzdHJ1Y3QgZmRtaV9yaGJhX3MgICAgKnJoYmEgPSAoc3RydWN0IGZkbWlfcmhiYV9zICopIHB5bGQ7CisJc3RydWN0IGZkbWlfYXR0cl9zICAgICphdHRyOworCXU4ICAgICAgICAqY3Vycl9wdHI7CisJdTE2ICAgICAgICBsZW4sIGNvdW50OworCisJLyoKKwkgKiBnZXQgaGJhIGF0dHJpYnV0ZXMKKwkgKi8KKwliZmFfZmNzX2ZkbWlfZ2V0X2hiYWF0dHIoZmRtaSwgZmNzX2hiYV9hdHRyKTsKKworCXJoYmEtPmhiYV9pZCA9IGJmYV9mY3NfcG9ydF9nZXRfcHd3bihwb3J0KTsKKwlyaGJhLT5wb3J0X2xpc3QubnVtX3BvcnRzID0gYmZhX29zX2h0b25sKDEpOworCXJoYmEtPnBvcnRfbGlzdC5wb3J0X2VudHJ5ID0gYmZhX2Zjc19wb3J0X2dldF9wd3duKHBvcnQpOworCisJbGVuID0gc2l6ZW9mKHJoYmEtPmhiYV9pZCkgKyBzaXplb2YocmhiYS0+cG9ydF9saXN0KTsKKworCWNvdW50ID0gMDsKKwlsZW4gKz0gc2l6ZW9mKHJoYmEtPmhiYV9hdHRyX2Jsay5hdHRyX2NvdW50KTsKKworCS8qCisJICogZmlsbCBvdXQgdGhlIGludmlkaWR1YWwgZW50cmllcyBvZiB0aGUgSEJBIGF0dHJpYiBCbG9jaworCSAqLworCWN1cnJfcHRyID0gKHU4ICopICZyaGJhLT5oYmFfYXR0cl9ibGsuaGJhX2F0dHI7CisKKwkvKgorCSAqIE5vZGUgTmFtZQorCSAqLworCWF0dHIgPSAoc3RydWN0IGZkbWlfYXR0cl9zICopIGN1cnJfcHRyOworCWF0dHItPnR5cGUgPSBiZmFfb3NfaHRvbnMoRkRNSV9IQkFfQVRUUklCX05PREVOQU1FKTsKKwlhdHRyLT5sZW4gPSBzaXplb2Yod3duX3QpOworCW1lbWNweShhdHRyLT52YWx1ZSwgJmJmYV9mY3NfcG9ydF9nZXRfbnd3bihwb3J0KSwgYXR0ci0+bGVuKTsKKwljdXJyX3B0ciArPSBzaXplb2YoYXR0ci0+dHlwZSkgKyBzaXplb2YoYXR0ci0+bGVuKSArIGF0dHItPmxlbjsKKwlsZW4gKz0gYXR0ci0+bGVuOworCWNvdW50Kys7CisJYXR0ci0+bGVuID0KKwkJYmZhX29zX2h0b25zKGF0dHItPmxlbiArIHNpemVvZihhdHRyLT50eXBlKSArCisJCQkgICAgIHNpemVvZihhdHRyLT5sZW4pKTsKKworCS8qCisJICogTWFudWZhY3R1cmVyCisJICovCisJYXR0ciA9IChzdHJ1Y3QgZmRtaV9hdHRyX3MgKikgY3Vycl9wdHI7CisJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfTUFOVUZBQ1RVUkVSKTsKKwlhdHRyLT5sZW4gPSAodTE2KSBzdHJsZW4oZmNzX2hiYV9hdHRyLT5tYW51ZmFjdHVyZXIpOworCW1lbWNweShhdHRyLT52YWx1ZSwgZmNzX2hiYV9hdHRyLT5tYW51ZmFjdHVyZXIsIGF0dHItPmxlbik7CisJLyogdmFyaWFibGUgZmllbGRzIG5lZWQgdG8gYmUgNCBieXRlIGFsaWduZWQgKi8KKwlhdHRyLT5sZW4gPSBmY19yb3VuZHVwKGF0dHItPmxlbiwgc2l6ZW9mKHUzMikpOworCWN1cnJfcHRyICs9IHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pICsgYXR0ci0+bGVuOworCWxlbiArPSBhdHRyLT5sZW47CisJY291bnQrKzsKKwlhdHRyLT5sZW4gPQorCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJLyoKKwkgKiBTZXJpYWwgTnVtYmVyCisJICovCisJYXR0ciA9IChzdHJ1Y3QgZmRtaV9hdHRyX3MgKikgY3Vycl9wdHI7CisJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfU0VSSUFMTlVNKTsKKwlhdHRyLT5sZW4gPSAodTE2KSBzdHJsZW4oZmNzX2hiYV9hdHRyLT5zZXJpYWxfbnVtKTsKKwltZW1jcHkoYXR0ci0+dmFsdWUsIGZjc19oYmFfYXR0ci0+c2VyaWFsX251bSwgYXR0ci0+bGVuKTsKKwkvKiB2YXJpYWJsZSBmaWVsZHMgbmVlZCB0byBiZSA0IGJ5dGUgYWxpZ25lZCAqLworCWF0dHItPmxlbiA9IGZjX3JvdW5kdXAoYXR0ci0+bGVuLCBzaXplb2YodTMyKSk7CisJY3Vycl9wdHIgKz0gc2l6ZW9mKGF0dHItPnR5cGUpICsgc2l6ZW9mKGF0dHItPmxlbikgKyBhdHRyLT5sZW47CisJbGVuICs9IGF0dHItPmxlbjsKKwljb3VudCsrOworCWF0dHItPmxlbiA9CisJCWJmYV9vc19odG9ucyhhdHRyLT5sZW4gKyBzaXplb2YoYXR0ci0+dHlwZSkgKworCQkJICAgICBzaXplb2YoYXR0ci0+bGVuKSk7CisKKwkvKgorCSAqIE1vZGVsCisJICovCisJYXR0ciA9IChzdHJ1Y3QgZmRtaV9hdHRyX3MgKikgY3Vycl9wdHI7CisJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfTU9ERUwpOworCWF0dHItPmxlbiA9ICh1MTYpIHN0cmxlbihmY3NfaGJhX2F0dHItPm1vZGVsKTsKKwltZW1jcHkoYXR0ci0+dmFsdWUsIGZjc19oYmFfYXR0ci0+bW9kZWwsIGF0dHItPmxlbik7CisJLyogdmFyaWFibGUgZmllbGRzIG5lZWQgdG8gYmUgNCBieXRlIGFsaWduZWQgKi8KKwlhdHRyLT5sZW4gPSBmY19yb3VuZHVwKGF0dHItPmxlbiwgc2l6ZW9mKHUzMikpOworCWN1cnJfcHRyICs9IHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pICsgYXR0ci0+bGVuOworCWxlbiArPSBhdHRyLT5sZW47CisJY291bnQrKzsKKwlhdHRyLT5sZW4gPQorCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJLyoKKwkgKiBNb2RlbCBEZXNjCisJICovCisJYXR0ciA9IChzdHJ1Y3QgZmRtaV9hdHRyX3MgKikgY3Vycl9wdHI7CisJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfTU9ERUxfREVTQyk7CisJYXR0ci0+bGVuID0gKHUxNikgc3RybGVuKGZjc19oYmFfYXR0ci0+bW9kZWxfZGVzYyk7CisJbWVtY3B5KGF0dHItPnZhbHVlLCBmY3NfaGJhX2F0dHItPm1vZGVsX2Rlc2MsIGF0dHItPmxlbik7CisJLyogdmFyaWFibGUgZmllbGRzIG5lZWQgdG8gYmUgNCBieXRlIGFsaWduZWQgKi8KKwlhdHRyLT5sZW4gPSBmY19yb3VuZHVwKGF0dHItPmxlbiwgc2l6ZW9mKHUzMikpOworCWN1cnJfcHRyICs9IHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pICsgYXR0ci0+bGVuOworCWxlbiArPSBhdHRyLT5sZW47CisJY291bnQrKzsKKwlhdHRyLT5sZW4gPQorCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJLyoKKwkgKiBIL1cgVmVyc2lvbgorCSAqLworCWlmIChmY3NfaGJhX2F0dHItPmh3X3ZlcnNpb25bMF0gIT0gJ1wwJykgeworCQlhdHRyID0gKHN0cnVjdCBmZG1pX2F0dHJfcyAqKSBjdXJyX3B0cjsKKwkJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfSFdfVkVSU0lPTik7CisJCWF0dHItPmxlbiA9ICh1MTYpIHN0cmxlbihmY3NfaGJhX2F0dHItPmh3X3ZlcnNpb24pOworCQltZW1jcHkoYXR0ci0+dmFsdWUsIGZjc19oYmFfYXR0ci0+aHdfdmVyc2lvbiwgYXR0ci0+bGVuKTsKKwkJLyogdmFyaWFibGUgZmllbGRzIG5lZWQgdG8gYmUgNCBieXRlIGFsaWduZWQgKi8KKwkJYXR0ci0+bGVuID0gZmNfcm91bmR1cChhdHRyLT5sZW4sIHNpemVvZih1MzIpKTsKKwkJY3Vycl9wdHIgKz0gc2l6ZW9mKGF0dHItPnR5cGUpICsgc2l6ZW9mKGF0dHItPmxlbikgKyBhdHRyLT5sZW47CisJCWxlbiArPSBhdHRyLT5sZW47CisJCWNvdW50Kys7CisJCWF0dHItPmxlbiA9CisJCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCQkgICAgIHNpemVvZihhdHRyLT5sZW4pKTsKKwl9CisKKwkvKgorCSAqIERyaXZlciBWZXJzaW9uCisJICovCisJYXR0ciA9IChzdHJ1Y3QgZmRtaV9hdHRyX3MgKikgY3Vycl9wdHI7CisJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfRFJJVkVSX1ZFUlNJT04pOworCWF0dHItPmxlbiA9ICh1MTYpIHN0cmxlbihmY3NfaGJhX2F0dHItPmRyaXZlcl92ZXJzaW9uKTsKKwltZW1jcHkoYXR0ci0+dmFsdWUsIGZjc19oYmFfYXR0ci0+ZHJpdmVyX3ZlcnNpb24sIGF0dHItPmxlbik7CisJLyogdmFyaWFibGUgZmllbGRzIG5lZWQgdG8gYmUgNCBieXRlIGFsaWduZWQgKi8KKwlhdHRyLT5sZW4gPSBmY19yb3VuZHVwKGF0dHItPmxlbiwgc2l6ZW9mKHUzMikpOworCWN1cnJfcHRyICs9IHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pICsgYXR0ci0+bGVuOworCWxlbiArPSBhdHRyLT5sZW47OworCWNvdW50Kys7CisJYXR0ci0+bGVuID0KKwkJYmZhX29zX2h0b25zKGF0dHItPmxlbiArIHNpemVvZihhdHRyLT50eXBlKSArCisJCQkgICAgIHNpemVvZihhdHRyLT5sZW4pKTsKKworCS8qCisJICogT3B0aW9uIFJvbSBWZXJzaW9uCisJICovCisJaWYgKGZjc19oYmFfYXR0ci0+b3B0aW9uX3JvbV92ZXJbMF0gIT0gJ1wwJykgeworCQlhdHRyID0gKHN0cnVjdCBmZG1pX2F0dHJfcyAqKSBjdXJyX3B0cjsKKwkJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfUk9NX1ZFUlNJT04pOworCQlhdHRyLT5sZW4gPSAodTE2KSBzdHJsZW4oZmNzX2hiYV9hdHRyLT5vcHRpb25fcm9tX3Zlcik7CisJCW1lbWNweShhdHRyLT52YWx1ZSwgZmNzX2hiYV9hdHRyLT5vcHRpb25fcm9tX3ZlciwgYXR0ci0+bGVuKTsKKwkJLyogdmFyaWFibGUgZmllbGRzIG5lZWQgdG8gYmUgNCBieXRlIGFsaWduZWQgKi8KKwkJYXR0ci0+bGVuID0gZmNfcm91bmR1cChhdHRyLT5sZW4sIHNpemVvZih1MzIpKTsKKwkJY3Vycl9wdHIgKz0gc2l6ZW9mKGF0dHItPnR5cGUpICsgc2l6ZW9mKGF0dHItPmxlbikgKyBhdHRyLT5sZW47CisJCWxlbiArPSBhdHRyLT5sZW47CisJCWNvdW50Kys7CisJCWF0dHItPmxlbiA9CisJCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCQkgICAgIHNpemVvZihhdHRyLT5sZW4pKTsKKwl9CisKKwkvKgorCSAqIGYvdyBWZXJzaW9uID0gZHJpdmVyIHZlcnNpb24KKwkgKi8KKwlhdHRyID0gKHN0cnVjdCBmZG1pX2F0dHJfcyAqKSBjdXJyX3B0cjsKKwlhdHRyLT50eXBlID0gYmZhX29zX2h0b25zKEZETUlfSEJBX0FUVFJJQl9GV19WRVJTSU9OKTsKKwlhdHRyLT5sZW4gPSAodTE2KSBzdHJsZW4oZmNzX2hiYV9hdHRyLT5kcml2ZXJfdmVyc2lvbik7CisJbWVtY3B5KGF0dHItPnZhbHVlLCBmY3NfaGJhX2F0dHItPmRyaXZlcl92ZXJzaW9uLCBhdHRyLT5sZW4pOworCS8qIHZhcmlhYmxlIGZpZWxkcyBuZWVkIHRvIGJlIDQgYnl0ZSBhbGlnbmVkICovCisJYXR0ci0+bGVuID0gZmNfcm91bmR1cChhdHRyLT5sZW4sIHNpemVvZih1MzIpKTsKKwljdXJyX3B0ciArPSBzaXplb2YoYXR0ci0+dHlwZSkgKyBzaXplb2YoYXR0ci0+bGVuKSArIGF0dHItPmxlbjsKKwlsZW4gKz0gYXR0ci0+bGVuOworCWNvdW50Kys7CisJYXR0ci0+bGVuID0KKwkJYmZhX29zX2h0b25zKGF0dHItPmxlbiArIHNpemVvZihhdHRyLT50eXBlKSArCisJCQkgICAgIHNpemVvZihhdHRyLT5sZW4pKTsKKworCS8qCisJICogT1MgTmFtZQorCSAqLworCWlmIChmY3NfaGJhX2F0dHItPm9zX25hbWVbMF0gIT0gJ1wwJykgeworCQlhdHRyID0gKHN0cnVjdCBmZG1pX2F0dHJfcyAqKSBjdXJyX3B0cjsKKwkJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfT1NfTkFNRSk7CisJCWF0dHItPmxlbiA9ICh1MTYpIHN0cmxlbihmY3NfaGJhX2F0dHItPm9zX25hbWUpOworCQltZW1jcHkoYXR0ci0+dmFsdWUsIGZjc19oYmFfYXR0ci0+b3NfbmFtZSwgYXR0ci0+bGVuKTsKKwkJLyogdmFyaWFibGUgZmllbGRzIG5lZWQgdG8gYmUgNCBieXRlIGFsaWduZWQgKi8KKwkJYXR0ci0+bGVuID0gZmNfcm91bmR1cChhdHRyLT5sZW4sIHNpemVvZih1MzIpKTsKKwkJY3Vycl9wdHIgKz0gc2l6ZW9mKGF0dHItPnR5cGUpICsgc2l6ZW9mKGF0dHItPmxlbikgKyBhdHRyLT5sZW47CisJCWxlbiArPSBhdHRyLT5sZW47CisJCWNvdW50Kys7CisJCWF0dHItPmxlbiA9CisJCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCQkgICAgIHNpemVvZihhdHRyLT5sZW4pKTsKKwl9CisKKwkvKgorCSAqIE1BWF9DVF9QQVlMT0FECisJICovCisJYXR0ciA9IChzdHJ1Y3QgZmRtaV9hdHRyX3MgKikgY3Vycl9wdHI7CisJYXR0ci0+dHlwZSA9IGJmYV9vc19odG9ucyhGRE1JX0hCQV9BVFRSSUJfTUFYX0NUKTsKKwlhdHRyLT5sZW4gPSBzaXplb2YoZmNzX2hiYV9hdHRyLT5tYXhfY3RfcHlsZCk7CisJbWVtY3B5KGF0dHItPnZhbHVlLCAmZmNzX2hiYV9hdHRyLT5tYXhfY3RfcHlsZCwgYXR0ci0+bGVuKTsKKwlsZW4gKz0gYXR0ci0+bGVuOworCWNvdW50Kys7CisJYXR0ci0+bGVuID0KKwkJYmZhX29zX2h0b25zKGF0dHItPmxlbiArIHNpemVvZihhdHRyLT50eXBlKSArCisJCQkgICAgIHNpemVvZihhdHRyLT5sZW4pKTsKKworCS8qCisJICogVXBkYXRlIHNpemUgb2YgcGF5bG9hZAorCSAqLworCWxlbiArPSAoKHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pKSAqIGNvdW50KTsKKworCXJoYmEtPmhiYV9hdHRyX2Jsay5hdHRyX2NvdW50ID0gYmZhX29zX2h0b25sKGNvdW50KTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfcmhiYV9yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCXZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQl1MzIgcnNwX2xlbiwgdTMyIHJlc2lkX2xlbiwKKwkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSA9IChzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqKWNiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IGZkbWktPm1zLT5wb3J0OworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSBOVUxMOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCisJLyoKKwkgKiBTYW5pdHkgQ2hlY2tzCisJICovCisJaWYgKHJlcV9zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKHBvcnQtPmZjcywgcmVxX3N0YXR1cyk7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGZkbWksIEZETUlTTV9FVkVOVF9SU1BfRVJST1IpOworCQlyZXR1cm47CisJfQorCisJY3RoZHIgPSAoc3RydWN0IGN0X2hkcl9zICopIEJGQV9GQ1hQX1JTUF9QTEQoZmN4cCk7CisJY3RoZHItPmNtZF9yc3BfY29kZSA9IGJmYV9vc19udG9ocyhjdGhkci0+Y21kX3JzcF9jb2RlKTsKKworCWlmIChjdGhkci0+Y21kX3JzcF9jb2RlID09IENUX1JTUF9BQ0NFUFQpIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoZmRtaSwgRkRNSVNNX0VWRU5UX1JTUF9PSyk7CisJCXJldHVybjsKKwl9CisKKwliZmFfdHJjKHBvcnQtPmZjcywgY3RoZHItPnJlYXNvbl9jb2RlKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgY3RoZHItPmV4cF9jb2RlKTsKKwliZmFfc21fc2VuZF9ldmVudChmZG1pLCBGRE1JU01fRVZFTlRfUlNQX0VSUk9SKTsKK30KKworLyoqCisqICAgUlBSVCA6IFJlZ2lzdGVyIFBvcnQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9mZG1pX3NlbmRfcnBydCh2b2lkICpmZG1pX2NiYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pID0gZmRtaV9jYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJdTE2ICAgICAgICBsZW4sIGF0dHJfbGVuOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXU4ICAgICAgICAqcHlsZDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJYmZhX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJmZkbWktPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3BvcnRfZmRtaV9zZW5kX3JwcnQsIGZkbWkpOworCQlyZXR1cm47CisJfQorCWZkbWktPmZjeHAgPSBmY3hwOworCisJcHlsZCA9IGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCk7CisJYmZhX29zX21lbXNldChweWxkLCAwLCBGQ19NQVhfUERVU1opOworCisJbGVuID0gZmNfZmRtaV9yZXFoZHJfYnVpbGQoJmZjaHMsIHB5bGQsIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwKKwkJCQkgICBGRE1JX1JQUlQpOworCisJYXR0cl9sZW4gPSBiZmFfZmNzX3BvcnRfZmRtaV9idWlsZF9ycHJ0X3B5bGQoZmRtaSwKKwkJCSh1OCAqKSAoKHN0cnVjdCBjdF9oZHJfcyAqKSBweWxkICsgMSkpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuICsgYXR0cl9sZW4sICZmY2hzLAorCQkgICAgICBiZmFfZmNzX3BvcnRfZmRtaV9ycHJ0X3Jlc3BvbnNlLCAodm9pZCAqKWZkbWksCisJCSAgICAgIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKworCWJmYV9zbV9zZW5kX2V2ZW50KGZkbWksIEZETUlTTV9FVkVOVF9SUFJUX1NFTlQpOworfQorCisvKioKKyAqIFRoaXMgcm91dGluZSBidWlsZHMgUG9ydCBBdHRyaWJ1dGUgQmxvY2sgdGhhdCB1c2VkIGluIFJQQSwgUlBSVCBjb21tYW5kcy4KKyAqLworc3RhdGljICAgICAgICAgIHUxNgorYmZhX2Zjc19wb3J0X2ZkbWlfYnVpbGRfcG9ydGF0dHJfYmxvY2soc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQkJICAgICAgIHU4ICpweWxkKQoreworCXN0cnVjdCBiZmFfZmNzX2ZkbWlfcG9ydF9hdHRyX3MgZmNzX3BvcnRfYXR0cjsKKwlzdHJ1Y3QgZmRtaV9wb3J0X2F0dHJfcyAqcG9ydF9hdHRyaWIgPSAoc3RydWN0IGZkbWlfcG9ydF9hdHRyX3MgKikgcHlsZDsKKwlzdHJ1Y3QgZmRtaV9hdHRyX3MgICAgKmF0dHI7CisJdTggICAgICAgICpjdXJyX3B0cjsKKwl1MTYgICAgICAgIGxlbjsKKwl1OCAgICAgICAgIGNvdW50ID0gMDsKKworCS8qCisJICogZ2V0IHBvcnQgYXR0cmlidXRlcworCSAqLworCWJmYV9mY3NfZmRtaV9nZXRfcG9ydGF0dHIoZmRtaSwgJmZjc19wb3J0X2F0dHIpOworCisJbGVuID0gc2l6ZW9mKHBvcnRfYXR0cmliLT5hdHRyX2NvdW50KTsKKworCS8qCisJICogZmlsbCBvdXQgdGhlIGludmlkaWR1YWwgZW50cmllcworCSAqLworCWN1cnJfcHRyID0gKHU4ICopICZwb3J0X2F0dHJpYi0+cG9ydF9hdHRyOworCisJLyoKKwkgKiBGQzQgVHlwZXMKKwkgKi8KKwlhdHRyID0gKHN0cnVjdCBmZG1pX2F0dHJfcyAqKSBjdXJyX3B0cjsKKwlhdHRyLT50eXBlID0gYmZhX29zX2h0b25zKEZETUlfUE9SVF9BVFRSSUJfRkM0X1RZUEVTKTsKKwlhdHRyLT5sZW4gPSBzaXplb2YoZmNzX3BvcnRfYXR0ci5zdXBwX2ZjNF90eXBlcyk7CisJbWVtY3B5KGF0dHItPnZhbHVlLCBmY3NfcG9ydF9hdHRyLnN1cHBfZmM0X3R5cGVzLCBhdHRyLT5sZW4pOworCWN1cnJfcHRyICs9IHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pICsgYXR0ci0+bGVuOworCWxlbiArPSBhdHRyLT5sZW47CisJKytjb3VudDsKKwlhdHRyLT5sZW4gPQorCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJLyoKKwkgKiBTdXBwb3J0ZWQgU3BlZWQKKwkgKi8KKwlhdHRyID0gKHN0cnVjdCBmZG1pX2F0dHJfcyAqKSBjdXJyX3B0cjsKKwlhdHRyLT50eXBlID0gYmZhX29zX2h0b25zKEZETUlfUE9SVF9BVFRSSUJfU1VQUF9TUEVFRCk7CisJYXR0ci0+bGVuID0gc2l6ZW9mKGZjc19wb3J0X2F0dHIuc3VwcF9zcGVlZCk7CisJbWVtY3B5KGF0dHItPnZhbHVlLCAmZmNzX3BvcnRfYXR0ci5zdXBwX3NwZWVkLCBhdHRyLT5sZW4pOworCWN1cnJfcHRyICs9IHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pICsgYXR0ci0+bGVuOworCWxlbiArPSBhdHRyLT5sZW47CisJKytjb3VudDsKKwlhdHRyLT5sZW4gPQorCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJLyoKKwkgKiBjdXJyZW50IFBvcnQgU3BlZWQKKwkgKi8KKwlhdHRyID0gKHN0cnVjdCBmZG1pX2F0dHJfcyAqKSBjdXJyX3B0cjsKKwlhdHRyLT50eXBlID0gYmZhX29zX2h0b25zKEZETUlfUE9SVF9BVFRSSUJfUE9SVF9TUEVFRCk7CisJYXR0ci0+bGVuID0gc2l6ZW9mKGZjc19wb3J0X2F0dHIuY3Vycl9zcGVlZCk7CisJbWVtY3B5KGF0dHItPnZhbHVlLCAmZmNzX3BvcnRfYXR0ci5jdXJyX3NwZWVkLCBhdHRyLT5sZW4pOworCWN1cnJfcHRyICs9IHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pICsgYXR0ci0+bGVuOworCWxlbiArPSBhdHRyLT5sZW47CisJKytjb3VudDsKKwlhdHRyLT5sZW4gPQorCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJLyoKKwkgKiBtYXggZnJhbWUgc2l6ZQorCSAqLworCWF0dHIgPSAoc3RydWN0IGZkbWlfYXR0cl9zICopIGN1cnJfcHRyOworCWF0dHItPnR5cGUgPSBiZmFfb3NfaHRvbnMoRkRNSV9QT1JUX0FUVFJJQl9GUkFNRV9TSVpFKTsKKwlhdHRyLT5sZW4gPSBzaXplb2YoZmNzX3BvcnRfYXR0ci5tYXhfZnJtX3NpemUpOworCW1lbWNweShhdHRyLT52YWx1ZSwgJmZjc19wb3J0X2F0dHIubWF4X2ZybV9zaXplLCBhdHRyLT5sZW4pOworCWN1cnJfcHRyICs9IHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pICsgYXR0ci0+bGVuOworCWxlbiArPSBhdHRyLT5sZW47CisJKytjb3VudDsKKwlhdHRyLT5sZW4gPQorCQliZmFfb3NfaHRvbnMoYXR0ci0+bGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKKwkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJLyoKKwkgKiBPUyBEZXZpY2UgTmFtZQorCSAqLworCWlmIChmY3NfcG9ydF9hdHRyLm9zX2RldmljZV9uYW1lWzBdICE9ICdcMCcpIHsKKwkJYXR0ciA9IChzdHJ1Y3QgZmRtaV9hdHRyX3MgKikgY3Vycl9wdHI7CisJCWF0dHItPnR5cGUgPSBiZmFfb3NfaHRvbnMoRkRNSV9QT1JUX0FUVFJJQl9ERVZfTkFNRSk7CisJCWF0dHItPmxlbiA9ICh1MTYpIHN0cmxlbihmY3NfcG9ydF9hdHRyLm9zX2RldmljZV9uYW1lKTsKKwkJbWVtY3B5KGF0dHItPnZhbHVlLCBmY3NfcG9ydF9hdHRyLm9zX2RldmljZV9uYW1lLCBhdHRyLT5sZW4pOworCQkvKiB2YXJpYWJsZSBmaWVsZHMgbmVlZCB0byBiZSA0IGJ5dGUgYWxpZ25lZCAqLworCQlhdHRyLT5sZW4gPSBmY19yb3VuZHVwKGF0dHItPmxlbiwgc2l6ZW9mKHUzMikpOworCQljdXJyX3B0ciArPSBzaXplb2YoYXR0ci0+dHlwZSkgKyBzaXplb2YoYXR0ci0+bGVuKSArIGF0dHItPmxlbjsKKwkJbGVuICs9IGF0dHItPmxlbjsKKwkJKytjb3VudDsKKwkJYXR0ci0+bGVuID0KKwkJCWJmYV9vc19odG9ucyhhdHRyLT5sZW4gKyBzaXplb2YoYXR0ci0+dHlwZSkgKworCQkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJfQorCS8qCisJICogSG9zdCBOYW1lCisJICovCisJaWYgKGZjc19wb3J0X2F0dHIuaG9zdF9uYW1lWzBdICE9ICdcMCcpIHsKKwkJYXR0ciA9IChzdHJ1Y3QgZmRtaV9hdHRyX3MgKikgY3Vycl9wdHI7CisJCWF0dHItPnR5cGUgPSBiZmFfb3NfaHRvbnMoRkRNSV9QT1JUX0FUVFJJQl9IT1NUX05BTUUpOworCQlhdHRyLT5sZW4gPSAodTE2KSBzdHJsZW4oZmNzX3BvcnRfYXR0ci5ob3N0X25hbWUpOworCQltZW1jcHkoYXR0ci0+dmFsdWUsIGZjc19wb3J0X2F0dHIuaG9zdF9uYW1lLCBhdHRyLT5sZW4pOworCQkvKiB2YXJpYWJsZSBmaWVsZHMgbmVlZCB0byBiZSA0IGJ5dGUgYWxpZ25lZCAqLworCQlhdHRyLT5sZW4gPSBmY19yb3VuZHVwKGF0dHItPmxlbiwgc2l6ZW9mKHUzMikpOworCQljdXJyX3B0ciArPSBzaXplb2YoYXR0ci0+dHlwZSkgKyBzaXplb2YoYXR0ci0+bGVuKSArIGF0dHItPmxlbjsKKwkJbGVuICs9IGF0dHItPmxlbjsKKwkJKytjb3VudDsKKwkJYXR0ci0+bGVuID0KKwkJCWJmYV9vc19odG9ucyhhdHRyLT5sZW4gKyBzaXplb2YoYXR0ci0+dHlwZSkgKworCQkJCSAgICAgc2l6ZW9mKGF0dHItPmxlbikpOworCisJfQorCisJLyoKKwkgKiBVcGRhdGUgc2l6ZSBvZiBwYXlsb2FkCisJICovCisJcG9ydF9hdHRyaWItPmF0dHJfY291bnQgPSBiZmFfb3NfaHRvbmwoY291bnQpOworCWxlbiArPSAoKHNpemVvZihhdHRyLT50eXBlKSArIHNpemVvZihhdHRyLT5sZW4pKSAqIGNvdW50KTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgICAgICAgICAgdTE2CitiZmFfZmNzX3BvcnRfZmRtaV9idWlsZF9ycHJ0X3B5bGQoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWksCisJCQkJICB1OCAqcHlsZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKwlzdHJ1Y3QgZmRtaV9ycHJ0X3MgICAgKnJwcnQgPSAoc3RydWN0IGZkbWlfcnBydF9zICopIHB5bGQ7CisJdTE2ICAgICAgICBsZW47CisKKwlycHJ0LT5oYmFfaWQgPSBiZmFfZmNzX3BvcnRfZ2V0X3B3d24oYmZhX2Zjc19nZXRfYmFzZV9wb3J0KHBvcnQtPmZjcykpOworCXJwcnQtPnBvcnRfbmFtZSA9IGJmYV9mY3NfcG9ydF9nZXRfcHd3bihwb3J0KTsKKworCWxlbiA9IGJmYV9mY3NfcG9ydF9mZG1pX2J1aWxkX3BvcnRhdHRyX2Jsb2NrKGZkbWksCisJCQkodTggKikgJnJwcnQtPnBvcnRfYXR0cl9ibGspOworCisJbGVuICs9IHNpemVvZihycHJ0LT5oYmFfaWQpICsgc2l6ZW9mKHJwcnQtPnBvcnRfbmFtZSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfcnBydF9yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCXZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQl1MzIgcnNwX2xlbiwgdTMyIHJlc2lkX2xlbiwKKwkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSA9IChzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqKWNiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IGZkbWktPm1zLT5wb3J0OworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSBOVUxMOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCisJLyoKKwkgKiBTYW5pdHkgQ2hlY2tzCisJICovCisJaWYgKHJlcV9zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKHBvcnQtPmZjcywgcmVxX3N0YXR1cyk7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGZkbWksIEZETUlTTV9FVkVOVF9SU1BfRVJST1IpOworCQlyZXR1cm47CisJfQorCisJY3RoZHIgPSAoc3RydWN0IGN0X2hkcl9zICopIEJGQV9GQ1hQX1JTUF9QTEQoZmN4cCk7CisJY3RoZHItPmNtZF9yc3BfY29kZSA9IGJmYV9vc19udG9ocyhjdGhkci0+Y21kX3JzcF9jb2RlKTsKKworCWlmIChjdGhkci0+Y21kX3JzcF9jb2RlID09IENUX1JTUF9BQ0NFUFQpIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoZmRtaSwgRkRNSVNNX0VWRU5UX1JTUF9PSyk7CisJCXJldHVybjsKKwl9CisKKwliZmFfdHJjKHBvcnQtPmZjcywgY3RoZHItPnJlYXNvbl9jb2RlKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgY3RoZHItPmV4cF9jb2RlKTsKKwliZmFfc21fc2VuZF9ldmVudChmZG1pLCBGRE1JU01fRVZFTlRfUlNQX0VSUk9SKTsKK30KKworLyoqCisqICAgUlBBIDogUmVnaXN0ZXIgUG9ydCBBdHRyaWJ1dGVzLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfc2VuZF9ycGEodm9pZCAqZmRtaV9jYmFyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSA9IGZkbWlfY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gZmRtaS0+bXMtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCXUxNiAgICAgICAgbGVuLCBhdHRyX2xlbjsKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKwl1OCAgICAgICAgKnB5bGQ7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisKKwlmY3hwID0gZmN4cF9hbGxvY2VkID8gZmN4cF9hbGxvY2VkIDogYmZhX2Zjc19mY3hwX2FsbG9jKHBvcnQtPmZjcyk7CisJaWYgKCFmY3hwKSB7CisJCWJmYV9mY3hwX2FsbG9jX3dhaXQocG9ydC0+ZmNzLT5iZmEsICZmZG1pLT5mY3hwX3dxZSwKKwkJCQkgICAgYmZhX2Zjc19wb3J0X2ZkbWlfc2VuZF9ycGEsIGZkbWkpOworCQlyZXR1cm47CisJfQorCWZkbWktPmZjeHAgPSBmY3hwOworCisJcHlsZCA9IGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCk7CisJYmZhX29zX21lbXNldChweWxkLCAwLCBGQ19NQVhfUERVU1opOworCisJbGVuID0gZmNfZmRtaV9yZXFoZHJfYnVpbGQoJmZjaHMsIHB5bGQsIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwKKwkJCQkgICBGRE1JX1JQQSk7CisKKwlhdHRyX2xlbiA9IGJmYV9mY3NfcG9ydF9mZG1pX2J1aWxkX3JwYV9weWxkKGZkbWksCisJCQkodTggKikgKChzdHJ1Y3QgY3RfaGRyX3MgKikgcHlsZCArIDEpKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCisJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiArIGF0dHJfbGVuLCAmZmNocywKKwkJICAgICAgYmZhX2Zjc19wb3J0X2ZkbWlfcnBhX3Jlc3BvbnNlLCAodm9pZCAqKWZkbWksCisJCSAgICAgIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKworCWJmYV9zbV9zZW5kX2V2ZW50KGZkbWksIEZETUlTTV9FVkVOVF9SUEFfU0VOVCk7Cit9CisKK3N0YXRpYyAgICAgICAgICB1MTYKK2JmYV9mY3NfcG9ydF9mZG1pX2J1aWxkX3JwYV9weWxkKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJCSB1OCAqcHlsZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBmZG1pLT5tcy0+cG9ydDsKKwlzdHJ1Y3QgZmRtaV9ycGFfcyAgICAgKnJwYSA9IChzdHJ1Y3QgZmRtaV9ycGFfcyAqKSBweWxkOworCXUxNiAgICAgICAgbGVuOworCisJcnBhLT5wb3J0X25hbWUgPSBiZmFfZmNzX3BvcnRfZ2V0X3B3d24ocG9ydCk7CisKKwlsZW4gPSBiZmFfZmNzX3BvcnRfZmRtaV9idWlsZF9wb3J0YXR0cl9ibG9jayhmZG1pLAorCQkJKHU4ICopICZycGEtPnBvcnRfYXR0cl9ibGspOworCisJbGVuICs9IHNpemVvZihycGEtPnBvcnRfbmFtZSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfcnBhX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkgICAgICAgdm9pZCAqY2JhcmcsIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJICAgICAgIHUzMiByc3BfbGVuLCB1MzIgcmVzaWRfbGVuLAorCQkJICAgICAgIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pID0gKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICopY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gZmRtaS0+bXMtPnBvcnQ7CisJc3RydWN0IGN0X2hkcl9zICAgICAgICpjdGhkciA9IE5VTEw7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisKKwkvKgorCSAqIFNhbml0eSBDaGVja3MKKwkgKi8KKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoZmRtaSwgRkRNSVNNX0VWRU5UX1JTUF9FUlJPUik7CisJCXJldHVybjsKKwl9CisKKwljdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgQkZBX0ZDWFBfUlNQX1BMRChmY3hwKTsKKwljdGhkci0+Y21kX3JzcF9jb2RlID0gYmZhX29zX250b2hzKGN0aGRyLT5jbWRfcnNwX2NvZGUpOworCisJaWYgKGN0aGRyLT5jbWRfcnNwX2NvZGUgPT0gQ1RfUlNQX0FDQ0VQVCkgeworCQliZmFfc21fc2VuZF9ldmVudChmZG1pLCBGRE1JU01fRVZFTlRfUlNQX09LKTsKKwkJcmV0dXJuOworCX0KKworCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+cmVhc29uX2NvZGUpOworCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+ZXhwX2NvZGUpOworCWJmYV9zbV9zZW5kX2V2ZW50KGZkbWksIEZETUlTTV9FVkVOVF9SU1BfRVJST1IpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfdGltZW91dCh2b2lkICphcmcpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWkgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKilhcmc7CisKKwliZmFfc21fc2VuZF9ldmVudChmZG1pLCBGRE1JU01fRVZFTlRfVElNRU9VVCk7Cit9CisKK3ZvaWQKK2JmYV9mY3NfZmRtaV9nZXRfaGJhYXR0cihzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSwKKwkJCSBzdHJ1Y3QgYmZhX2Zjc19mZG1pX2hiYV9hdHRyX3MgKmhiYV9hdHRyKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IGZkbWktPm1zLT5wb3J0OworCXN0cnVjdCBiZmFfZmNzX2RyaXZlcl9pbmZvX3MgKmRyaXZlcl9pbmZvID0gJnBvcnQtPmZjcy0+ZHJpdmVyX2luZm87CisJc3RydWN0IGJmYV9hZGFwdGVyX2F0dHJfcyBhZGFwdGVyX2F0dHI7CisKKwliZmFfb3NfbWVtc2V0KGhiYV9hdHRyLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9mY3NfZmRtaV9oYmFfYXR0cl9zKSk7CisJYmZhX29zX21lbXNldCgmYWRhcHRlcl9hdHRyLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9hZGFwdGVyX2F0dHJfcykpOworCisJYmZhX2lvY19nZXRfYWRhcHRlcl9hdHRyKCZwb3J0LT5mY3MtPmJmYS0+aW9jLCAmYWRhcHRlcl9hdHRyKTsKKworCXN0cm5jcHkoaGJhX2F0dHItPm1hbnVmYWN0dXJlciwgYWRhcHRlcl9hdHRyLm1hbnVmYWN0dXJlciwKKwkJc2l6ZW9mKGFkYXB0ZXJfYXR0ci5tYW51ZmFjdHVyZXIpKTsKKworCXN0cm5jcHkoaGJhX2F0dHItPnNlcmlhbF9udW0sIGFkYXB0ZXJfYXR0ci5zZXJpYWxfbnVtLAorCQlzaXplb2YoYWRhcHRlcl9hdHRyLnNlcmlhbF9udW0pKTsKKworCXN0cm5jcHkoaGJhX2F0dHItPm1vZGVsLCBhZGFwdGVyX2F0dHIubW9kZWwsIHNpemVvZihoYmFfYXR0ci0+bW9kZWwpKTsKKworCXN0cm5jcHkoaGJhX2F0dHItPm1vZGVsX2Rlc2MsIGFkYXB0ZXJfYXR0ci5tb2RlbF9kZXNjciwKKwkJc2l6ZW9mKGhiYV9hdHRyLT5tb2RlbF9kZXNjKSk7CisKKwlzdHJuY3B5KGhiYV9hdHRyLT5od192ZXJzaW9uLCBhZGFwdGVyX2F0dHIuaHdfdmVyLAorCQlzaXplb2YoaGJhX2F0dHItPmh3X3ZlcnNpb24pKTsKKworCXN0cm5jcHkoaGJhX2F0dHItPmRyaXZlcl92ZXJzaW9uLCAoY2hhciAqKWRyaXZlcl9pbmZvLT52ZXJzaW9uLAorCQlzaXplb2YoaGJhX2F0dHItPmRyaXZlcl92ZXJzaW9uKSk7CisKKwlzdHJuY3B5KGhiYV9hdHRyLT5vcHRpb25fcm9tX3ZlciwgYWRhcHRlcl9hdHRyLm9wdHJvbV92ZXIsCisJCXNpemVvZihoYmFfYXR0ci0+b3B0aW9uX3JvbV92ZXIpKTsKKworCXN0cm5jcHkoaGJhX2F0dHItPmZ3X3ZlcnNpb24sIGFkYXB0ZXJfYXR0ci5md192ZXIsCisJCXNpemVvZihoYmFfYXR0ci0+ZndfdmVyc2lvbikpOworCisJc3RybmNweShoYmFfYXR0ci0+b3NfbmFtZSwgZHJpdmVyX2luZm8tPmhvc3Rfb3NfbmFtZSwKKwkJc2l6ZW9mKGhiYV9hdHRyLT5vc19uYW1lKSk7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgcGF0Y2ggbGV2ZWwsIGFwcGVuZCBpdCB0byB0aGUgb3MgbmFtZSBhbG9uZyB3aXRoIGEKKwkgKiBzZXBhcmF0b3IKKwkgKi8KKwlpZiAoZHJpdmVyX2luZm8tPmhvc3Rfb3NfcGF0Y2hbMF0gIT0gJ1wwJykgeworCQlzdHJuY2F0KGhiYV9hdHRyLT5vc19uYW1lLCBCRkFfRkNTX1BPUlRfU1lNQk5BTUVfU0VQQVJBVE9SLAorCQkJc2l6ZW9mKEJGQV9GQ1NfUE9SVF9TWU1CTkFNRV9TRVBBUkFUT1IpKTsKKwkJc3RybmNhdChoYmFfYXR0ci0+b3NfbmFtZSwgZHJpdmVyX2luZm8tPmhvc3Rfb3NfcGF0Y2gsCisJCQlzaXplb2YoZHJpdmVyX2luZm8tPmhvc3Rfb3NfcGF0Y2gpKTsKKwl9CisKKwloYmFfYXR0ci0+bWF4X2N0X3B5bGQgPSBiZmFfb3NfaHRvbmwoRkNfTUFYX1BEVVNaKTsKKworfQorCit2b2lkCitiZmFfZmNzX2ZkbWlfZ2V0X3BvcnRhdHRyKHN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pLAorCQkJICBzdHJ1Y3QgYmZhX2Zjc19mZG1pX3BvcnRfYXR0cl9zICpwb3J0X2F0dHIpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gZmRtaS0+bXMtPnBvcnQ7CisJc3RydWN0IGJmYV9mY3NfZHJpdmVyX2luZm9fcyAqZHJpdmVyX2luZm8gPSAmcG9ydC0+ZmNzLT5kcml2ZXJfaW5mbzsKKwlzdHJ1Y3QgYmZhX3Bwb3J0X2F0dHJfcyBwcG9ydF9hdHRyOworCisJYmZhX29zX21lbXNldChwb3J0X2F0dHIsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX2Zjc19mZG1pX3BvcnRfYXR0cl9zKSk7CisKKwkvKgorCSAqIGdldCBwcG9ydCBhdHRyaWJ1dGVzIGZyb20gaGFsCisJICovCisJYmZhX3Bwb3J0X2dldF9hdHRyKHBvcnQtPmZjcy0+YmZhLCAmcHBvcnRfYXR0cik7CisKKwkvKgorCSAqIGdldCBGQzQgdHlwZSBCaXRtYXNrCisJICovCisJZmNfZ2V0X2ZjNHR5cGVfYml0bWFzayhGQ19UWVBFX0ZDUCwgcG9ydF9hdHRyLT5zdXBwX2ZjNF90eXBlcyk7CisKKwkvKgorCSAqIFN1cHBvcnRlZCBTcGVlZHMKKwkgKi8KKwlwb3J0X2F0dHItPnN1cHBfc3BlZWQgPSBiZmFfb3NfaHRvbmwoQkZBX0ZDU19GRE1JX1NVUE9SVEVEX1NQRUVEUyk7CisKKwkvKgorCSAqIEN1cnJlbnQgU3BlZWQKKwkgKi8KKwlwb3J0X2F0dHItPmN1cnJfc3BlZWQgPSBiZmFfb3NfaHRvbmwocHBvcnRfYXR0ci5zcGVlZCk7CisKKwkvKgorCSAqIE1heCBQRFUgU2l6ZS4KKwkgKi8KKwlwb3J0X2F0dHItPm1heF9mcm1fc2l6ZSA9IGJmYV9vc19odG9ubChGQ19NQVhfUERVU1opOworCisJLyoKKwkgKiBPUyBkZXZpY2UgTmFtZQorCSAqLworCXN0cm5jcHkocG9ydF9hdHRyLT5vc19kZXZpY2VfbmFtZSwgKGNoYXIgKilkcml2ZXJfaW5mby0+b3NfZGV2aWNlX25hbWUsCisJCXNpemVvZihwb3J0X2F0dHItPm9zX2RldmljZV9uYW1lKSk7CisKKwkvKgorCSAqIEhvc3QgbmFtZQorCSAqLworCXN0cm5jcHkocG9ydF9hdHRyLT5ob3N0X25hbWUsIChjaGFyICopZHJpdmVyX2luZm8tPmhvc3RfbWFjaGluZV9uYW1lLAorCQlzaXplb2YocG9ydF9hdHRyLT5ob3N0X25hbWUpKTsKKworfQorCisKK3ZvaWQKK2JmYV9mY3NfcG9ydF9mZG1pX2luaXQoc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyAqZmRtaSA9ICZtcy0+ZmRtaTsKKworCWZkbWktPm1zID0gbXM7CisJYmZhX3NtX3NldF9zdGF0ZShmZG1pLCBiZmFfZmNzX3BvcnRfZmRtaV9zbV9vZmZsaW5lKTsKK30KKwordm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zICpmZG1pID0gJm1zLT5mZG1pOworCisJZmRtaS0+bXMgPSBtczsKKwliZmFfc21fc2VuZF9ldmVudChmZG1pLCBGRE1JU01fRVZFTlRfUE9SVF9PRkZMSU5FKTsKK30KKwordm9pZAorYmZhX2Zjc19wb3J0X2ZkbWlfb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9mZG1pX3MgKmZkbWkgPSAmbXMtPmZkbWk7CisKKwlmZG1pLT5tcyA9IG1zOworCWJmYV9zbV9zZW5kX2V2ZW50KGZkbWksIEZETUlTTV9FVkVOVF9QT1JUX09OTElORSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW4uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOGNhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW4uaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQkZBX0FFTl9IX18KKyNkZWZpbmUgX19CRkFfQUVOX0hfXworCisjaW5jbHVkZSAiZGVmcy9iZmFfZGVmc19hZW4uaCIKKworI2RlZmluZSBCRkFfQUVOX01BWF9FTlRSWSAgIDUxMgorCitleHRlcm4gczMyIGJmYV9hZW5fbWF4X2NmZ19lbnRyeTsKK3N0cnVjdCBiZmFfYWVuX3MgeworCXZvaWQJCSpiZmFkOworCXMzMgkJbWF4X2VudHJ5OworCXMzMgkJd3JpdGVfaW5kZXg7CisJczMyCQlyZWFkX2luZGV4OworCXUzMgliZmFkX251bTsKKwl1MzIJc2VxX251bTsKKwl2b2lkCQkoKmFlbl9jYl9ub3RpZnkpKHZvaWQgKmJmYWQpOworCXZvaWQJCSgqZ2V0dGltZW9mZGF5KShzdHJ1Y3QgYmZhX3RpbWV2YWxfcyAqdHYpOworCXN0cnVjdCBiZmFfdHJjX21vZF9zIAkqdHJjbW9kOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MJbGlzdFtCRkFfQUVOX01BWF9FTlRSWV07IC8qIE11c3QgYmUgdGhlIGxhc3QgKi8KK307CisKKworLyoqCisgKiBQdWJsaWMgQVBJcworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2JmYV9hZW5fc2V0X21heF9jZmdfZW50cnkoaW50IG1heF9lbnRyeSkKK3sKKwliZmFfYWVuX21heF9jZmdfZW50cnkgPSBtYXhfZW50cnk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyCitiZmFfYWVuX2dldF9tYXhfY2ZnX2VudHJ5KHZvaWQpCit7CisJcmV0dXJuIGJmYV9hZW5fbWF4X2NmZ19lbnRyeTsKK30KKworc3RhdGljIGlubGluZSBzMzIKK2JmYV9hZW5fZ2V0X21lbWluZm8odm9pZCkKK3sKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zKSAqIGJmYV9hZW5fZ2V0X21heF9jZmdfZW50cnkoKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyCitiZmFfYWVuX2dldF93aShzdHJ1Y3QgYmZhX2Flbl9zICphZW4pCit7CisJcmV0dXJuIGFlbi0+d3JpdGVfaW5kZXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyCitiZmFfYWVuX2dldF9yaShzdHJ1Y3QgYmZhX2Flbl9zICphZW4pCit7CisJcmV0dXJuIGFlbi0+cmVhZF9pbmRleDsKK30KKworc3RhdGljIGlubGluZSBzMzIKK2JmYV9hZW5fZmV0Y2hfY291bnQoc3RydWN0IGJmYV9hZW5fcyAqYWVuLCBzMzIgcmVhZF9pbmRleCkKK3sKKwlyZXR1cm4gKChhZW4tPndyaXRlX2luZGV4ICsgYWVuLT5tYXhfZW50cnkpIC0gcmVhZF9pbmRleCkKKwkJJSBhZW4tPm1heF9lbnRyeTsKK30KKworczMyIGJmYV9hZW5faW5pdChzdHJ1Y3QgYmZhX2Flbl9zICphZW4sIHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QsCisJCXZvaWQgKmJmYWQsIHUzMiBpbnN0X2lkLCB2b2lkICgqYWVuX2NiX25vdGlmeSkodm9pZCAqKSwKKwkJdm9pZCAoKmdldHRpbWVvZmRheSkoc3RydWN0IGJmYV90aW1ldmFsX3MgKikpOworCitzMzIgYmZhX2Flbl9wb3N0KHN0cnVjdCBiZmFfYWVuX3MgKmFlbiwgZW51bSBiZmFfYWVuX2NhdGVnb3J5IGFlbl9jYXRlZ29yeSwKKwkJICAgICBpbnQgYWVuX3R5cGUsIHVuaW9uIGJmYV9hZW5fZGF0YV91ICphZW5fZGF0YSk7CisKK3MzMiBiZmFfYWVuX2ZldGNoKHN0cnVjdCBiZmFfYWVuX3MgKmFlbiwgc3RydWN0IGJmYV9hZW5fZW50cnlfcyAqYWVuX2VudHJ5LAorCQkgICAgICBzMzIgZW50cnlfc3BhY2UsIHMzMiByaWksIHMzMiAqcmlfYXJyLAorCQkgICAgICBzMzIgcmlfYXJyX2NudCk7CisKK3MzMiBiZmFfYWVuX2dldF9pbnN0KHN0cnVjdCBiZmFfYWVuX3MgKmFlbik7CisKKyNlbmRpZiAvKiBfX0JGQV9BRU5fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5fYWRhcHRlci5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2FkYXB0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBkM2VhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2FkYXB0ZXIuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgQkZBX0FFTl9DQVRfQURBUFRFUiBNb2R1bGUgKi8KKyNpZm5kZWYJX19iZmFfYWVuX2FkYXB0ZXJfaF9fCisjZGVmaW5lCV9fYmZhX2Flbl9hZGFwdGVyX2hfXworCisjaW5jbHVkZSAgPGNzL2JmYV9sb2cuaD4KKyNpbmNsdWRlICA8ZGVmcy9iZmFfZGVmc19hZW4uaD4KKworI2RlZmluZSBCRkFfQUVOX0FEQVBURVJfQUREIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9BREFQVEVSLCBCRkFfQURBUFRFUl9BRU5fQUREKQorI2RlZmluZSBCRkFfQUVOX0FEQVBURVJfUkVNT1ZFIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9BREFQVEVSLCBCRkFfQURBUFRFUl9BRU5fUkVNT1ZFKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2F1ZGl0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5fYXVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNkN2FhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2F1ZGl0LmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBtZXNzYWdlcyBkZWZpbmUgZm9yIEJGQV9BRU5fQ0FUX0FVRElUIE1vZHVsZSAqLworI2lmbmRlZglfX2JmYV9hZW5fYXVkaXRfaF9fCisjZGVmaW5lCV9fYmZhX2Flbl9hdWRpdF9oX18KKworI2luY2x1ZGUgIDxjcy9iZmFfbG9nLmg+CisjaW5jbHVkZSAgPGRlZnMvYmZhX2RlZnNfYWVuLmg+CisKKyNkZWZpbmUgQkZBX0FFTl9BVURJVF9BVVRIX0VOQUJMRSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfQVVESVQsIEJGQV9BVURJVF9BRU5fQVVUSF9FTkFCTEUpCisjZGVmaW5lIEJGQV9BRU5fQVVESVRfQVVUSF9ESVNBQkxFIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9BVURJVCwgQkZBX0FVRElUX0FFTl9BVVRIX0RJU0FCTEUpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5fZXRocG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2V0aHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdkMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2V0aHBvcnQuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgQkZBX0FFTl9DQVRfRVRIUE9SVCBNb2R1bGUgKi8KKyNpZm5kZWYJX19iZmFfYWVuX2V0aHBvcnRfaF9fCisjZGVmaW5lCV9fYmZhX2Flbl9ldGhwb3J0X2hfXworCisjaW5jbHVkZSAgPGNzL2JmYV9sb2cuaD4KKyNpbmNsdWRlICA8ZGVmcy9iZmFfZGVmc19hZW4uaD4KKworI2RlZmluZSBCRkFfQUVOX0VUSFBPUlRfTElOS1VQIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9FVEhQT1JULCBCRkFfRVRIUE9SVF9BRU5fTElOS1VQKQorI2RlZmluZSBCRkFfQUVOX0VUSFBPUlRfTElOS0RPV04gXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX0VUSFBPUlQsIEJGQV9FVEhQT1JUX0FFTl9MSU5LRE9XTikKKyNkZWZpbmUgQkZBX0FFTl9FVEhQT1JUX0VOQUJMRSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfRVRIUE9SVCwgQkZBX0VUSFBPUlRfQUVOX0VOQUJMRSkKKyNkZWZpbmUgQkZBX0FFTl9FVEhQT1JUX0RJU0FCTEUgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX0VUSFBPUlQsIEJGQV9FVEhQT1JUX0FFTl9ESVNBQkxFKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2lvYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2lvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzc4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5faW9jLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBtZXNzYWdlcyBkZWZpbmUgZm9yIEJGQV9BRU5fQ0FUX0lPQyBNb2R1bGUgKi8KKyNpZm5kZWYJX19iZmFfYWVuX2lvY19oX18KKyNkZWZpbmUJX19iZmFfYWVuX2lvY19oX18KKworI2luY2x1ZGUgIDxjcy9iZmFfbG9nLmg+CisjaW5jbHVkZSAgPGRlZnMvYmZhX2RlZnNfYWVuLmg+CisKKyNkZWZpbmUgQkZBX0FFTl9JT0NfSEJHT09EIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9JT0MsIEJGQV9JT0NfQUVOX0hCR09PRCkKKyNkZWZpbmUgQkZBX0FFTl9JT0NfSEJGQUlMIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9JT0MsIEJGQV9JT0NfQUVOX0hCRkFJTCkKKyNkZWZpbmUgQkZBX0FFTl9JT0NfRU5BQkxFIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9JT0MsIEJGQV9JT0NfQUVOX0VOQUJMRSkKKyNkZWZpbmUgQkZBX0FFTl9JT0NfRElTQUJMRSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfSU9DLCBCRkFfSU9DX0FFTl9ESVNBQkxFKQorI2RlZmluZSBCRkFfQUVOX0lPQ19GV01JU01BVENIIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9JT0MsIEJGQV9JT0NfQUVOX0ZXTUlTTUFUQ0gpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5faXRuaW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbl9pdG5pbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDhkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5faXRuaW0uaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgQkZBX0FFTl9DQVRfSVROSU0gTW9kdWxlICovCisjaWZuZGVmCV9fYmZhX2Flbl9pdG5pbV9oX18KKyNkZWZpbmUJX19iZmFfYWVuX2l0bmltX2hfXworCisjaW5jbHVkZSAgPGNzL2JmYV9sb2cuaD4KKyNpbmNsdWRlICA8ZGVmcy9iZmFfZGVmc19hZW4uaD4KKworI2RlZmluZSBCRkFfQUVOX0lUTklNX09OTElORSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfSVROSU0sIEJGQV9JVE5JTV9BRU5fT05MSU5FKQorI2RlZmluZSBCRkFfQUVOX0lUTklNX09GRkxJTkUgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX0lUTklNLCBCRkFfSVROSU1fQUVOX09GRkxJTkUpCisjZGVmaW5lIEJGQV9BRU5fSVROSU1fRElTQ09OTkVDVCBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfSVROSU0sIEJGQV9JVE5JTV9BRU5fRElTQ09OTkVDVCkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbl9scG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX2xwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4ZWJiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbl9scG9ydC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogbWVzc2FnZXMgZGVmaW5lIGZvciBCRkFfQUVOX0NBVF9MUE9SVCBNb2R1bGUgKi8KKyNpZm5kZWYJX19iZmFfYWVuX2xwb3J0X2hfXworI2RlZmluZQlfX2JmYV9hZW5fbHBvcnRfaF9fCisKKyNpbmNsdWRlICA8Y3MvYmZhX2xvZy5oPgorI2luY2x1ZGUgIDxkZWZzL2JmYV9kZWZzX2Flbi5oPgorCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfTkVXIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9ORVcpCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfREVMRVRFIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9ERUxFVEUpCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfT05MSU5FIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9PTkxJTkUpCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfT0ZGTElORSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfTFBPUlQsIEJGQV9MUE9SVF9BRU5fT0ZGTElORSkKKyNkZWZpbmUgQkZBX0FFTl9MUE9SVF9ESVNDT05ORUNUIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9ESVNDT05ORUNUKQorI2RlZmluZSBCRkFfQUVOX0xQT1JUX05FV19QUk9QIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9ORVdfUFJPUCkKKyNkZWZpbmUgQkZBX0FFTl9MUE9SVF9ERUxFVEVfUFJPUCBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfTFBPUlQsIEJGQV9MUE9SVF9BRU5fREVMRVRFX1BST1ApCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfTkVXX1NUQU5EQVJEIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9ORVdfU1RBTkRBUkQpCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfREVMRVRFX1NUQU5EQVJEIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9ERUxFVEVfU1RBTkRBUkQpCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfTlBJVl9EVVBfV1dOIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9OUElWX0RVUF9XV04pCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfTlBJVl9GQUJSSUNfTUFYIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9OUElWX0ZBQlJJQ19NQVgpCisjZGVmaW5lIEJGQV9BRU5fTFBPUlRfTlBJVl9VTktOT1dOIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9MUE9SVCwgQkZBX0xQT1JUX0FFTl9OUElWX1VOS05PV04pCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5fcG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWRkOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Flbi9iZmFfYWVuX3BvcnQuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgQkZBX0FFTl9DQVRfUE9SVCBNb2R1bGUgKi8KKyNpZm5kZWYJX19iZmFfYWVuX3BvcnRfaF9fCisjZGVmaW5lCV9fYmZhX2Flbl9wb3J0X2hfXworCisjaW5jbHVkZSAgPGNzL2JmYV9sb2cuaD4KKyNpbmNsdWRlICA8ZGVmcy9iZmFfZGVmc19hZW4uaD4KKworI2RlZmluZSBCRkFfQUVOX1BPUlRfT05MSU5FIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9QT1JULCBCRkFfUE9SVF9BRU5fT05MSU5FKQorI2RlZmluZSBCRkFfQUVOX1BPUlRfT0ZGTElORSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUE9SVCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpCisjZGVmaW5lIEJGQV9BRU5fUE9SVF9STElSIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9QT1JULCBCRkFfUE9SVF9BRU5fUkxJUikKKyNkZWZpbmUgQkZBX0FFTl9QT1JUX1NGUF9JTlNFUlQgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX1BPUlQsIEJGQV9QT1JUX0FFTl9TRlBfSU5TRVJUKQorI2RlZmluZSBCRkFfQUVOX1BPUlRfU0ZQX1JFTU9WRSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUE9SVCwgQkZBX1BPUlRfQUVOX1NGUF9SRU1PVkUpCisjZGVmaW5lIEJGQV9BRU5fUE9SVF9TRlBfUE9NIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9QT1JULCBCRkFfUE9SVF9BRU5fU0ZQX1BPTSkKKyNkZWZpbmUgQkZBX0FFTl9QT1JUX0VOQUJMRSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUE9SVCwgQkZBX1BPUlRfQUVOX0VOQUJMRSkKKyNkZWZpbmUgQkZBX0FFTl9QT1JUX0RJU0FCTEUgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX1BPUlQsIEJGQV9QT1JUX0FFTl9ESVNBQkxFKQorI2RlZmluZSBCRkFfQUVOX1BPUlRfQVVUSF9PTiBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUE9SVCwgQkZBX1BPUlRfQUVOX0FVVEhfT04pCisjZGVmaW5lIEJGQV9BRU5fUE9SVF9BVVRIX09GRiBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUE9SVCwgQkZBX1BPUlRfQUVOX0FVVEhfT0ZGKQorI2RlZmluZSBCRkFfQUVOX1BPUlRfRElTQ09OTkVDVCBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUE9SVCwgQkZBX1BPUlRfQUVOX0RJU0NPTk5FQ1QpCisjZGVmaW5lIEJGQV9BRU5fUE9SVF9RT1NfTkVHIFwKKwlCRkFfTE9HX0NSRUFURV9JRChCRkFfQUVOX0NBVF9QT1JULCBCRkFfUE9SVF9BRU5fUU9TX05FRykKKyNkZWZpbmUgQkZBX0FFTl9QT1JUX0ZBQlJJQ19OQU1FX0NIQU5HRSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUE9SVCwgQkZBX1BPUlRfQUVOX0ZBQlJJQ19OQU1FX0NIQU5HRSkKKyNkZWZpbmUgQkZBX0FFTl9QT1JUX1NGUF9BQ0NFU1NfRVJST1IgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX1BPUlQsIEJGQV9QT1JUX0FFTl9TRlBfQUNDRVNTX0VSUk9SKQorI2RlZmluZSBCRkFfQUVOX1BPUlRfU0ZQX1VOU1VQUE9SVCBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUE9SVCwgQkZBX1BPUlRfQUVOX1NGUF9VTlNVUFBPUlQpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5fcnBvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9hZW4vYmZhX2Flbl9ycG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNGJlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYWVuL2JmYV9hZW5fcnBvcnQuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIG1lc3NhZ2VzIGRlZmluZSBmb3IgQkZBX0FFTl9DQVRfUlBPUlQgTW9kdWxlICovCisjaWZuZGVmCV9fYmZhX2Flbl9ycG9ydF9oX18KKyNkZWZpbmUJX19iZmFfYWVuX3Jwb3J0X2hfXworCisjaW5jbHVkZSAgPGNzL2JmYV9sb2cuaD4KKyNpbmNsdWRlICA8ZGVmcy9iZmFfZGVmc19hZW4uaD4KKworI2RlZmluZSBCRkFfQUVOX1JQT1JUX09OTElORSBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUlBPUlQsIEJGQV9SUE9SVF9BRU5fT05MSU5FKQorI2RlZmluZSBCRkFfQUVOX1JQT1JUX09GRkxJTkUgXAorCUJGQV9MT0dfQ1JFQVRFX0lEKEJGQV9BRU5fQ0FUX1JQT1JULCBCRkFfUlBPUlRfQUVOX09GRkxJTkUpCisjZGVmaW5lIEJGQV9BRU5fUlBPUlRfRElTQ09OTkVDVCBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUlBPUlQsIEJGQV9SUE9SVF9BRU5fRElTQ09OTkVDVCkKKyNkZWZpbmUgQkZBX0FFTl9SUE9SVF9RT1NfUFJJTyBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUlBPUlQsIEJGQV9SUE9SVF9BRU5fUU9TX1BSSU8pCisjZGVmaW5lIEJGQV9BRU5fUlBPUlRfUU9TX0ZMT1dJRCBcCisJQkZBX0xPR19DUkVBVEVfSUQoQkZBX0FFTl9DQVRfUlBPUlQsIEJGQV9SUE9SVF9BRU5fUU9TX0ZMT1dJRCkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmEuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMxNDEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYS5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQkZBX0hfXworI2RlZmluZSBfX0JGQV9IX18KKworI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKyNpbmNsdWRlIDxjcy9iZmFfZGVidWcuaD4KKyNpbmNsdWRlIDxjcy9iZmFfcS5oPgorI2luY2x1ZGUgPGNzL2JmYV90cmMuaD4KKyNpbmNsdWRlIDxjcy9iZmFfbG9nLmg+CisjaW5jbHVkZSA8Y3MvYmZhX3Bsb2cuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3N0YXR1cy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfaW9jLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19pb2NmYy5oPgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuLmg+CisjaW5jbHVkZSA8YmZpL2JmaS5oPgorCitzdHJ1Y3QgYmZhX3M7CisjaW5jbHVkZSA8YmZhX2ludHJfcHJpdi5oPgorCitzdHJ1Y3QgYmZhX3BjaWRldl9zOworCisvKioKKyAqIFBDSSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBCRkEKKyAqLworc3RydWN0IGJmYV9wY2lpZF9zIHsKKwl1MTYgICAgICAgIGRldmljZV9pZDsKKwl1MTYgICAgICAgIHZlbmRvcl9pZDsKK307CisKK2V4dGVybiBjaGFyICAgICBiZmFfdmVyc2lvbltdOworCisvKioKKyAqIEJGQSBQb3dlciBNZ210IENvbW1hbmRzCisgKi8KK2VudW0gYmZhX3BtX2NtZCB7CisJQkZBX1BNX0NUTF9EMCA9IDAsCisJQkZBX1BNX0NUTF9EMSA9IDEsCisJQkZBX1BNX0NUTF9EMiA9IDIsCisJQkZBX1BNX0NUTF9EMyA9IDMsCit9OworCisvKioKKyAqIEJGQSBtZW1vcnkgcmVzb3VyY2VzCisgKi8KK2VudW0gYmZhX21lbV90eXBlIHsKKwlCRkFfTUVNX1RZUEVfS1ZBID0gMSwJLyohIEtlcm5lbCBWaXJ0dWFsIE1lbW9yeSAqKG5vbi1kbWEtYWJsZSkgKi8KKwlCRkFfTUVNX1RZUEVfRE1BID0gMiwJLyohIERNQS1hYmxlIG1lbW9yeSAqLworCUJGQV9NRU1fVFlQRV9NQVggPSBCRkFfTUVNX1RZUEVfRE1BLAorfTsKKworc3RydWN0IGJmYV9tZW1fZWxlbV9zIHsKKwllbnVtIGJmYV9tZW1fdHlwZSBtZW1fdHlwZTsJLyogIHNlZSBlbnVtIGJmYV9tZW1fdHlwZSAJKi8KKwl1MzIgICAgICAgIG1lbV9sZW47CS8qICBUb3RhbCBMZW5ndGggaW4gQnl0ZXMJKi8KKwl1OCAgICAgICAJKmt2YTsJCS8qICBrZXJuZWwgdmlydHVhbCBhZGRyZXNzCSovCisJdTY0ICAgICAgICBkbWE7CQkvKiAgZG1hIGFkZHJlc3MgaWYgRE1BIG1lbW9yeQkqLworCXU4ICAgICAgIAkqa3ZhX2N1cnA7CS8qICBrdmEgYWxsb2NhdGlvbiBjdXJzb3IJKi8KKwl1NjQgICAgICAgIGRtYV9jdXJwOwkvKiAgZG1hIGFsbG9jYXRpb24gY3Vyc29yCSovCit9OworCitzdHJ1Y3QgYmZhX21lbWluZm9fcyB7CisJc3RydWN0IGJmYV9tZW1fZWxlbV9zIG1lbWluZm9bQkZBX01FTV9UWVBFX01BWF07Cit9OworI2RlZmluZSBiZmFfbWVtaW5mb19rdmEoX20pCVwKKwkoX20pLT5tZW1pbmZvW0JGQV9NRU1fVFlQRV9LVkEgLSAxXS5rdmFfY3VycAorI2RlZmluZSBiZmFfbWVtaW5mb19kbWFfdmlydChfbSkJXAorCShfbSktPm1lbWluZm9bQkZBX01FTV9UWVBFX0RNQSAtIDFdLmt2YV9jdXJwCisjZGVmaW5lIGJmYV9tZW1pbmZvX2RtYV9waHlzKF9tKQlcCisJKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfRE1BIC0gMV0uZG1hX2N1cnAKKworLyoqCisgKiBHZW5lcmljIFNjYXR0ZXIgR2F0aGVyIEVsZW1lbnQgdXNlZCBieSBkcml2ZXIKKyAqLworc3RydWN0IGJmYV9zZ2VfcyB7CisJdTMyICAgICAgICBzZ19sZW47CisJdm9pZCAgICAgICAgICAgKnNnX2FkZHI7Cit9OworCisjZGVmaW5lIGJmYV9zZ2VfdG9fYmUoX19zZ2UpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKCh1MzIgKikoX19zZ2UpKVswXSA9IGJmYV9vc19odG9ubCgoKHUzMiAqKShfX3NnZSkpWzBdKTsgICAgICBcCisJKCh1MzIgKikoX19zZ2UpKVsxXSA9IGJmYV9vc19odG9ubCgoKHUzMiAqKShfX3NnZSkpWzFdKTsgICAgICBcCisJKCh1MzIgKikoX19zZ2UpKVsyXSA9IGJmYV9vc19odG9ubCgoKHUzMiAqKShfX3NnZSkpWzJdKTsgICAgICBcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBiZmEgc3RhdHMgaW50ZXJmYWNlcworICovCisjZGVmaW5lIGJmYV9zdGF0cyhfbW9kLCBfc3RhdHMpCShfbW9kKS0+c3RhdHMuX3N0YXRzICsrCisKKyNkZWZpbmUgYmZhX2lvY19nZXRfc3RhdHMoX19iZmEsIF9faW9jX3N0YXRzKQlcCisJYmZhX2lvY19mZXRjaF9zdGF0cygmKF9fYmZhKS0+aW9jLCBfX2lvY19zdGF0cykKKyNkZWZpbmUgYmZhX2lvY19jbGVhcl9zdGF0cyhfX2JmYSkJXAorCWJmYV9pb2NfY2xyX3N0YXRzKCYoX19iZmEpLT5pb2MpCisKKy8qCisgKiBiZmEgQVBJIGZ1bmN0aW9ucworICovCit2b2lkIGJmYV9nZXRfcGNpaWRzKHN0cnVjdCBiZmFfcGNpaWRfcyAqKnBjaWlkcywgaW50ICpucGNpaWRzKTsKK3ZvaWQgYmZhX2NmZ19nZXRfZGVmYXVsdChzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcpOwordm9pZCBiZmFfY2ZnX2dldF9taW4oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnKTsKK3ZvaWQgYmZhX2NmZ19nZXRfbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCQlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbyk7Cit2b2lkIGJmYV9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKKwkJCXN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvLAorCQkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KTsKK3ZvaWQgYmZhX2luaXRfdHJjKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3RyY19tb2RfcyAqdHJjbW9kKTsKK3ZvaWQgYmZhX2luaXRfbG9nKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nbW9kKTsKK3ZvaWQgYmZhX2luaXRfYWVuKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2Flbl9zICphZW4pOwordm9pZCBiZmFfaW5pdF9wbG9nKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Bsb2dfcyAqcGxvZyk7Cit2b2lkIGJmYV9kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2F0dGFjaF9mY3Moc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfY2JfaW5pdCh2b2lkICpiZmFkLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKK3ZvaWQgYmZhX2NiX3N0b3Aodm9pZCAqYmZhZCwgYmZhX3N0YXR1c190IHN0YXR1cyk7Cit2b2lkIGJmYV9jYl91cGRhdGVxKHZvaWQgKmJmYWQsIGJmYV9zdGF0dXNfdCBzdGF0dXMpOworCitiZmFfYm9vbGVhbl90IGJmYV9pbnR4KHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2lzcl9lbmFibGUoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaXNyX2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfbXNpeF9nZXR2ZWNzKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgKm1zaXhfdmVjc19ibWFwLAorCQkJdTMyICpudW1fdmVjcywgdTMyICptYXhfdmVjX2JpdCk7CisjZGVmaW5lIGJmYV9tc2l4KF9fYmZhLCBfX3ZlYykgKF9fYmZhKS0+bXNpeC5oYW5kbGVyW19fdmVjXShfX2JmYSwgX192ZWMpCisKK3ZvaWQgYmZhX2NvbXBfZGVxKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wX3EpOwordm9pZCBiZmFfY29tcF9wcm9jZXNzKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wX3EpOwordm9pZCBiZmFfY29tcF9mcmVlKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wX3EpOworCit0eXBlZGVmIHZvaWQgKCpiZmFfY2JfaW9jX3QpICh2b2lkICpjYmFyZywgZW51bSBiZmFfc3RhdHVzIHN0YXR1cyk7Cit2b2lkIGJmYV9pb2NmY19nZXRfYXR0cihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9pb2NmY19hdHRyX3MgKmF0dHIpOworYmZhX3N0YXR1c190IGJmYV9pb2NmY19nZXRfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsCisJCQlzdHJ1Y3QgYmZhX2lvY2ZjX3N0YXRzX3MgKnN0YXRzLAorCQkJYmZhX2NiX2lvY190IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCBiZmFfaW9jZmNfY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsCisJCQliZmFfY2JfaW9jX3QgY2Jmbiwgdm9pZCAqY2JhcmcpOwordm9pZCBiZmFfZ2V0X2F0dHIoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfaW9jX2F0dHJfcyAqaW9jX2F0dHIpOworCit2b2lkIGJmYV9hZGFwdGVyX2dldF9hdHRyKHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJc3RydWN0IGJmYV9hZGFwdGVyX2F0dHJfcyAqYWRfYXR0cik7Cit1NjQgYmZhX2FkYXB0ZXJfZ2V0X2lkKHN0cnVjdCBiZmFfcyAqYmZhKTsKKworYmZhX3N0YXR1c190IGJmYV9pb2NmY19pc3JhdHRyX3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJCXN0cnVjdCBiZmFfaW9jZmNfaW50cl9hdHRyX3MgKmF0dHIpOworCit2b2lkIGJmYV9pb2NmY19lbmFibGUoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaW9jZmNfZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9pb2NfYXV0b19yZWNvdmVyKGJmYV9ib29sZWFuX3QgYXV0b19yZWNvdmVyKTsKK3ZvaWQgYmZhX2NiX2lvY19kaXNhYmxlKHZvaWQgKmJmYWQpOwordm9pZCBiZmFfdGltZXJfdGljayhzdHJ1Y3QgYmZhX3MgKmJmYSk7CisjZGVmaW5lIGJmYV90aW1lcl9zdGFydChfYmZhLCBfdGltZXIsIF90aW1lcmNiLCBfYXJnLCBfdGltZW91dCkJXAorCWJmYV90aW1lcl9iZWdpbigmKF9iZmEpLT50aW1lcl9tb2QsIF90aW1lciwgX3RpbWVyY2IsIF9hcmcsIF90aW1lb3V0KQorCisvKgorICogQkZBIGRlYnVnIEFQSSBmdW5jdGlvbnMKKyAqLworYmZhX3N0YXR1c190IGJmYV9kZWJ1Z19md3RyYyhzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqdHJjZGF0YSwgaW50ICp0cmNsZW4pOworYmZhX3N0YXR1c190IGJmYV9kZWJ1Z19md3NhdmUoc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKnRyY2RhdGEsIGludCAqdHJjbGVuKTsKKworI2luY2x1ZGUgImJmYV9wcml2LmgiCisKKyNlbmRpZiAvKiBfX0JGQV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfZmNwaW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfZmNwaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDc4OTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9mY3BpbS5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfRkNQSU1fSF9fCisjZGVmaW5lIF9fQkZBX0ZDUElNX0hfXworCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgPGJmaS9iZmlfZmNwaW0uaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2ZjcGltLmg+CisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdHJ1Y3QgYmZhX2l0bmltX3M7CitzdHJ1Y3QgYmZhX2lvaW1fczsKK3N0cnVjdCBiZmFfdHNraW1fczsKK3N0cnVjdCBiZmFkX2lvaW1fczsKK3N0cnVjdCBiZmFkX3Rza2ltX3M7CisKKy8qCisgKiBiZmEgZmNwaW0gbW9kdWxlIEFQSSBmdW5jdGlvbnMKKyAqLwordm9pZAkJYmZhX2ZjcGltX3BhdGhfdG92X3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHBhdGhfdG92KTsKK3UxNgliZmFfZmNwaW1fcGF0aF90b3ZfZ2V0KHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQJCWJmYV9mY3BpbV9xZGVwdGhfc2V0KHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgcV9kZXB0aCk7Cit1MTYJYmZhX2ZjcGltX3FkZXB0aF9nZXQoc3RydWN0IGJmYV9zICpiZmEpOworYmZhX3N0YXR1c190IGJmYV9mY3BpbV9nZXRfbW9kc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsCisJCQlzdHJ1Y3QgYmZhX2ZjcGltX3N0YXRzX3MgKm1vZHN0YXRzKTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNwaW1fY2xyX21vZHN0YXRzKHN0cnVjdCBiZmFfcyAqYmZhKTsKKworLyoKKyAqIGJmYSBpdG5pbSBBUEkgZnVuY3Rpb25zCisgKi8KK3N0cnVjdCBiZmFfaXRuaW1fcyAqYmZhX2l0bmltX2NyZWF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJCQkJc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydCwgdm9pZCAqaXRuaW0pOwordm9pZAkJYmZhX2l0bmltX2RlbGV0ZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKTsKK3ZvaWQJCWJmYV9pdG5pbV9vbmxpbmUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwKKwkJCQkgYmZhX2Jvb2xlYW5fdCBzZXFfcmVjKTsKK3ZvaWQJCWJmYV9pdG5pbV9vZmZsaW5lKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pOwordm9pZAkJYmZhX2l0bmltX2dldF9zdGF0cyhzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJc3RydWN0IGJmYV9pdG5pbV9oYWxfc3RhdHNfcyAqc3RhdHMpOwordm9pZAkJYmZhX2l0bmltX2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pOworCisKKy8qKgorICogCQlCRkEgY29tcGxldGlvbiBjYWxsYmFjayBmb3IgYmZhX2l0bmltX29ubGluZSgpLgorICoKKyAqIEBwYXJhbVtpbl0JCWl0bmltCQlGQ1Mgb3IgZHJpdmVyIGl0bmltIGluc3RhbmNlCisgKgorICogcmV0dXJuIE5vbmUKKyAqLwordm9pZCAgICAgICAgICAgIGJmYV9jYl9pdG5pbV9vbmxpbmUodm9pZCAqaXRuaW0pOworCisvKioKKyAqIAkJQkZBIGNvbXBsZXRpb24gY2FsbGJhY2sgZm9yIGJmYV9pdG5pbV9vZmZsaW5lKCkuCisgKgorICogQHBhcmFtW2luXQkJaXRuaW0JCUZDUyBvciBkcml2ZXIgaXRuaW0gaW5zdGFuY2UKKyAqCisgKiByZXR1cm4gTm9uZQorICovCit2b2lkICAgICAgICAgICAgYmZhX2NiX2l0bmltX29mZmxpbmUodm9pZCAqaXRuaW0pOwordm9pZCAgICAgICAgICAgIGJmYV9jYl9pdG5pbV90b3ZfYmVnaW4odm9pZCAqaXRuaW0pOwordm9pZCAgICAgICAgICAgIGJmYV9jYl9pdG5pbV90b3Yodm9pZCAqaXRuaW0pOworCisvKioKKyAqIAkJQkZBIG5vdGlmaWNhdGlvbiB0byBGQ1MvZHJpdmVyIGZvciBzZWNvbmQgbGV2ZWwgZXJyb3IgcmVjb3ZlcnkuCisgKgorICogQXRsZWFzdCBvbmUgSS9PIHJlcXVlc3QgaGFzIHRpbWVkb3V0IGFuZCB0YXJnZXQgaXMgdW5yZXNwb25zaXZlIHRvCisgKiByZXBlYXRlZCBhYm9ydCByZXF1ZXN0cy4gU2Vjb25kIGxldmVsIGVycm9yIHJlY292ZXJ5IHNob3VsZCBiZSBpbml0aWF0ZWQKKyAqIGJ5IHN0YXJ0aW5nIGltcGxpY2l0IGxvZ291dCBhbmQgcmVjb3ZlcnkgcHJvY2VkdXJlcy4KKyAqCisgKiBAcGFyYW1baW5dCQlpdG5pbQkJRkNTIG9yIGRyaXZlciBpdG5pbSBpbnN0YW5jZQorICoKKyAqIHJldHVybiBOb25lCisgKi8KK3ZvaWQgICAgICAgICAgICBiZmFfY2JfaXRuaW1fc2xlcih2b2lkICppdG5pbSk7CisKKy8qCisgKiBiZmEgaW9pbSBBUEkgZnVuY3Rpb25zCisgKi8KK3N0cnVjdCBiZmFfaW9pbV9zCSpiZmFfaW9pbV9hbGxvYyhzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJCQkJc3RydWN0IGJmYWRfaW9pbV9zICpkaW8sCisJCQkJCXN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQkJCXUxNiBuc2dsZXMpOworCit2b2lkCQliZmFfaW9pbV9mcmVlKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3ZvaWQJCWJmYV9pb2ltX3N0YXJ0KHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3ZvaWQJCWJmYV9pb2ltX2Fib3J0KHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3ZvaWQgCQliZmFfaW9pbV9kZWxheWVkX2NvbXAoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sCisJCQkJICAgICAgYmZhX2Jvb2xlYW5fdCBpb3Rvdik7CisKKworLyoqCisgKiAJCUkvTyBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dCQlkaW8JCQlkcml2ZXIgSU8gc3RydWN0dXJlCisgKiBAcGFyYW1baW5dCQlpb19zdGF0dXMJCUlPIGNvbXBsZXRpb24gc3RhdHVzCisgKiBAcGFyYW1baW5dCQlzY3NpX3N0YXR1cwkJU0NTSSBzdGF0dXMgcmV0dXJuZWQgYnkgdGFyZ2V0CisgKiBAcGFyYW1baW5dCQlzbnNfbGVuCQkJU0NTSSBzZW5zZSBsZW5ndGgsIDAgaWYgbm9uZQorICogQHBhcmFtW2luXQkJc25zX2luZm8JCVNDU0kgc2Vuc2UgZGF0YSwgaWYgYW55CisgKiBAcGFyYW1baW5dCQlyZXNpZHVlCQkJUmVzaWR1YWwgbGVuZ3RoCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgICAgICAgICAgICBiZmFfY2JfaW9pbV9kb25lKHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFkX2lvaW1fcyAqZGlvLAorCQkJCSAgZW51bSBiZmlfaW9pbV9zdGF0dXMgaW9fc3RhdHVzLAorCQkJCSAgdTggc2NzaV9zdGF0dXMsIGludCBzbnNfbGVuLAorCQkJCSAgdTggKnNuc19pbmZvLCBzMzIgcmVzaWR1ZSk7CisKKy8qKgorICogCQlJL08gZ29vZCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dCQlkaW8JCQlkcml2ZXIgSU8gc3RydWN0dXJlCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgICAgICAgICAgICBiZmFfY2JfaW9pbV9nb29kX2NvbXAodm9pZCAqYmZhZCwgc3RydWN0IGJmYWRfaW9pbV9zICpkaW8pOworCisvKioKKyAqIAkJSS9PIGFib3J0IGNvbXBsZXRpb24gbm90aWZpY2F0aW9uCisgKgorICogQHBhcmFtW2luXQkJZGlvCQkJZHJpdmVyIElPIHRoYXQgd2FzIGFib3J0ZWQKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCAgICAgICAgICAgIGJmYV9jYl9pb2ltX2Fib3J0KHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFkX2lvaW1fcyAqZGlvKTsKK3ZvaWQJCWJmYV9jYl9pb2ltX3Jlc2ZyZWUodm9pZCAqaGNiX2JmYWQpOworCit2b2lkIAkJCWJmYV9jYl9pb2ltX3Jlc2ZyZWUodm9pZCAqaGNiX2JmYWQpOworCisvKgorICogYmZhIHRza2ltIEFQSSBmdW5jdGlvbnMKKyAqLworc3RydWN0IGJmYV90c2tpbV9zCSpiZmFfdHNraW1fYWxsb2Moc3RydWN0IGJmYV9zICpiZmEsCisJCQkJCXN0cnVjdCBiZmFkX3Rza2ltX3MgKmR0c2spOwordm9pZAkJYmZhX3Rza2ltX2ZyZWUoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSk7Cit2b2lkCQliZmFfdHNraW1fc3RhcnQoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSwKKwkJCQlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLCBsdW5fdCBsdW4sCisJCQkJZW51bSBmY3BfdG1fY21uZCB0bSwgdTggdF9zZWNzKTsKK3ZvaWQJCWJmYV9jYl90c2tpbV9kb25lKHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFkX3Rza2ltX3MgKmR0c2ssCisJCQkJICBlbnVtIGJmaV90c2tpbV9zdGF0dXMgdHNrX3N0YXR1cyk7CisKKyNlbmRpZiAvKiBfX0JGQV9GQ1BJTV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9mY3B0bS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9mY3B0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWZmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZhX2ZjcHRtLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0ZDUFRNX0hfXworI2RlZmluZSBfX0JGQV9GQ1BUTV9IX18KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlIDxiZmkvYmZpX2ZjcHRtLmg+CisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdHJ1Y3QgYmZhX3Rpbl9zOworc3RydWN0IGJmYV9pb3RtX3M7CitzdHJ1Y3QgYmZhX3Rza3RtX3M7CisKKy8qCisgKiBiZmEgZmNwdG0gbW9kdWxlIEFQSSBmdW5jdGlvbnMKKyAqLwordm9pZCBiZmFfZmNwdG1fcGF0aF90b3Zfc2V0KHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgcGF0aF90b3YpOwordTE2IGJmYV9mY3B0bV9wYXRoX3Rvdl9nZXQoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfZmNwdG1fcWRlcHRoX3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHFfZGVwdGgpOwordTE2IGJmYV9mY3B0bV9xZGVwdGhfZ2V0KHN0cnVjdCBiZmFfcyAqYmZhKTsKKworLyoKKyAqIGJmYSB0aW4gQVBJIGZ1bmN0aW9ucworICovCit2b2lkIGJmYV90aW5fZ2V0X3N0YXRzKHN0cnVjdCBiZmFfdGluX3MgKnRpbiwgc3RydWN0IGJmYV90aW5fc3RhdHNfcyAqc3RhdHMpOwordm9pZCBiZmFfdGluX2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfdGluX3MgKnRpbik7CisKKyNlbmRpZiAvKiBfX0JGQV9GQ1BUTV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV9zdmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfc3ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4MGI3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfc3ZjLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRkFfU1ZDX0hfXworI2RlZmluZSBfX0JGQV9TVkNfSF9fCisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdHJ1Y3QgYmZhX2ZjeHBfczsKKworI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfc3RhdHVzLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19wcG9ydC5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcnBvcnQuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Fvcy5oPgorI2luY2x1ZGUgPGNzL2JmYV9zbS5oPgorI2luY2x1ZGUgPGJmYS5oPgorCisvKioKKyAqIAkJQkZBIHJwb3J0IGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgYmZhX3Jwb3J0X2luZm9fcyB7CisJdTE2ICAgICAgICBtYXhfZnJtc3o7CS8qICBtYXggcmN2IHBkdSBzaXplICAgICAgICAgICAgICAgKi8KKwl1MzIgICAgICAgIHBpZCA6IDI0LAkvKiAgcmVtb3RlIHBvcnQgSUQgICAgICAgICAgICAgICAgICovCisJCQlscF90YWcgOiA4OworCXUzMiAgICAgICAgbG9jYWxfcGlkIDogMjQsCS8qICBsb2NhbCBwb3J0IElECQkgICAgKi8KKwkJCWNpc2MgOiA4OwkvKiAgQ0lSTyBzdXBwb3J0ZWQJCSAgICAqLworCXU4ICAgICAgICAgZmNfY2xhc3M7CS8qICBzdXBwb3J0ZWQgRkMgY2xhc3Nlcy4gZW51bSBmY19jb3MgKi8KKwl1OCAgICAgICAgIHZmX2VuOwkJLyogIHZpcnR1YWwgZmFicmljIGVuYWJsZSAgICAgICAgICAqLworCXUxNiAgICAgICAgdmZfaWQ7CQkvKiAgdmlydHVhbCBmYWJyaWMgSUQgICAgICAgICAgICAgICovCisJZW51bSBiZmFfcHBvcnRfc3BlZWQgc3BlZWQ7CS8qICBScG9ydCdzIGN1cnJlbnQgc3BlZWQJICAgICovCit9OworCisvKioKKyAqIEJGQSBycG9ydCBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgYmZhX3Jwb3J0X3MgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHFlOwkgIC8qICBxdWV1ZSBlbGVtZW50ICovCisJYmZhX3NtX3QJICAgICAgc207IAkgIC8qICBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IGJmYV9zICAgICAgICAgICpiZmE7CSAgLyogIGJhY2twb2ludGVyIHRvIEJGQSAqLworCXZvaWQgICAgICAgICAgICAgICAgICAqcnBvcnRfZHJ2OyAvKiAgZmNzL2RyaXZlciBycG9ydCBvYmplY3QgKi8KKwl1MTYgICAgICAgICAgICAgIGZ3X2hhbmRsZTsgLyogIGZpcm13YXJlIHJwb3J0IGhhbmRsZSAqLworCXUxNiAgICAgICAgICAgICAgcnBvcnRfdGFnOyAvKiAgQkZBIHJwb3J0IHRhZyAqLworCXN0cnVjdCBiZmFfcnBvcnRfaW5mb19zIHJwb3J0X2luZm87IC8qICBycG9ydCBpbmZvIGZyb20gKmZjcy9kcml2ZXIgKi8KKwlzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zIHJlcXFfd2FpdDsgLyogIHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxcSAqLworCXN0cnVjdCBiZmFfY2JfcWVfcyAgICBoY2JfcWU7CSAvKiAgQkZBIGNhbGxiYWNrIHFlbGVtICovCisJc3RydWN0IGJmYV9ycG9ydF9oYWxfc3RhdHNfcyBzdGF0czsgLyogIEJGQSBycG9ydCBzdGF0aXN0aWNzICAqLworCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyAgcW9zX2F0dHI7CisJdW5pb24gYSB7CisJCWJmYV9zdGF0dXNfdCAgICBzdGF0dXM7CSAvKiAgZi93IHN0YXR1cyAqLworCQl2b2lkICAgICAgICAgICAgKmZ3X21zZzsgLyogIFFvUyBzY24gZXZlbnQgKi8KKwl9IGV2ZW50X2FyZzsKK307CisjZGVmaW5lIEJGQV9SUE9SVF9GQ19DT1MoX3Jwb3J0KQkoKF9ycG9ydCktPnJwb3J0X2luZm8uZmNfY2xhc3MpCisKKy8qKgorICogU2VuZCBjb21wbGV0aW9uIGNhbGxiYWNrLgorICovCit0eXBlZGVmIHZvaWQgKCpiZmFfY2JfZmN4cF9zZW5kX3QpICh2b2lkICpiZmFkX2ZjeHAsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJdm9pZCAqY2JhcmcsIGVudW0gYmZhX3N0YXR1cyByZXFfc3RhdHVzLAorCQkJdTMyIHJzcF9sZW4sIHUzMiByZXNpZF9sZW4sCisJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CisKKy8qKgorICogQkZBIGZjeHAgYWxsb2NhdGlvbiAoYXN5bmNocm9ub3VzKQorICovCit0eXBlZGVmIHZvaWQgKCpiZmFfZmN4cF9hbGxvY19jYmZuX3QpICh2b2lkICpjYmFyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApOworCitzdHJ1Y3QgYmZhX2ZjeHBfd3FlX3MgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICBxZTsKKwliZmFfZmN4cF9hbGxvY19jYmZuX3QgIGFsbG9jX2NiZm47CisJdm9pZCAgICAgICAgICAgKmFsbG9jX2NiYXJnOworfTsKKwordHlwZWRlZiB1NjQgKCpiZmFfZmN4cF9nZXRfc2dhZGRyX3QpICh2b2lkICpiZmFkX2ZjeHAsIGludCBzZ2VpZCk7Cit0eXBlZGVmIHUzMiAoKmJmYV9mY3hwX2dldF9zZ2xlbl90KSAodm9pZCAqYmZhZF9mY3hwLCBpbnQgc2dlaWQpOworCisjZGVmaW5lIEJGQV9VRl9CVUZTWgkoMiAqIDEwMjQgKyAyNTYpCisKKy8qKgorICogQHRvZG8gcHJpdmF0ZQorICovCitzdHJ1Y3QgYmZhX3VmX2J1Zl9zIHsKKwl1OCAgICAgICAgIGRbQkZBX1VGX0JVRlNaXTsKK307CisKKworc3RydWN0IGJmYV91Zl9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXFlOwkJLyogIHF1ZXVlIGVsZW1lbnQJICAqLworCXN0cnVjdCBiZmFfcwkqYmZhOwkJLyogIGJmYSBpbnN0YW5jZQkgICovCisJdTE2ICAgICAgICB1Zl90YWc7CQkvKiAgaWRlbnRpZnlpbmcgdGFnIGYvdyBtZXNzYWdlcyAqLworCXUxNiAgICAgICAgdmZfaWQ7CisJdTE2ICAgICAgICBzcmNfcnBvcnRfaGFuZGxlOworCXUxNiAgICAgICAgcnN2ZDsKKwl1OCAgICAgICAgCSpkYXRhX3B0cjsKKwl1MTYgICAgICAgIGRhdGFfbGVuOwkvKiAgYWN0dWFsIHJlY2VpdmUgbGVuZ3RoCSAgKi8KKwl1MTYgICAgICAgIHBiX2xlbjsJCS8qICBwb3N0ZWQgYnVmZmVyIGxlbmd0aAkgICovCisJdm9pZCAgICAgICAgICAgCSpidWZfa3ZhOwkvKiAgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcwkgICovCisJdTY0ICAgICAgICBidWZfcGE7CQkvKiAgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MJICAqLworCXN0cnVjdCBiZmFfY2JfcWVfcyAgICBoY2JfcWU7CS8qICBjb21wOiBCRkEgY29tcCBxZWxlbQkgICovCisJc3RydWN0IGJmYV9zZ2VfcyAgIAlzZ2VzW0JGSV9TR0VfSU5MSU5FX01BWF07Cit9OworCit0eXBlZGVmIHZvaWQgKCpiZmFfY2JfcHBvcnRfdCkgKHZvaWQgKmNiYXJnLCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKTsKKworLyoqCisgKiBiZmEgbHBvcnQgbG9naW4vbG9nb3V0IHNlcnZpY2UgaW50ZXJmYWNlCisgKi8KK3N0cnVjdCBiZmFfbHBzX3MgeworCXN0cnVjdCBsaXN0X2hlYWQJcWU7CQkvKiAgcXVldWUgZWxlbWVudCAqLworCXN0cnVjdCBiZmFfcwkqYmZhOwkJLyogIHBhcmVudCBiZmEgaW5zdGFuY2UJKi8KKwliZmFfc21fdAlzbTsJCS8qICBmaW5pdGUgc3RhdGUgbWFjaGluZQkqLworCXU4CQlscF90YWc7CQkvKiAgbHBvcnQgdGFnCQkJKi8KKwl1OAkJcmVxcTsJCS8qICBscG9ydCByZXF1ZXN0IHF1ZXVlCSovCisJdTgJCWFscGE7CQkvKiAgQUxQQSBmb3IgbG9vcCB0b3BvbG9naWVzCSovCisJdTMyCWxwX3BpZDsJCS8qICBscG9ydCBwb3J0IElECQkqLworCWJmYV9ib29sZWFuX3QJZmRpc2M7CQkvKiAgc2VuZCBGRElTQyBpbnN0ZWFkIG9mIEZMT0dJKi8KKwliZmFfYm9vbGVhbl90CWF1dGhfZW47CS8qICBlbmFibGUgYXV0aGVudGljYXRpb24JKi8KKwliZmFfYm9vbGVhbl90CWF1dGhfcmVxOwkvKiAgYXV0aGVudGljYXRpb24gcmVxdWlyZWQJKi8KKwliZmFfYm9vbGVhbl90CW5waXZfZW47CS8qICBOUElWIGlzIGFsbG93ZWQgYnkgcGVlcgkqLworCWJmYV9ib29sZWFuX3QJZnBvcnQ7CQkvKiAgYXR0YWNoZWQgcGVlciBpcyBGX1BPUlQJKi8KKwliZmFfYm9vbGVhbl90CWJyY2Rfc3dpdGNoOy8qICBhdHRhY2hlZCBwZWVyIGlzIGJyY2Qgc3dpdGNoCSovCisJYmZhX3N0YXR1c190CXN0YXR1czsJCS8qICBsb2dpbiBzdGF0dXMJCSovCisJdTE2CXBkdXN6OwkJLyogIG1heCByZWNlaXZlIFBEVSBzaXplIAkqLworCXUxNglwcl9iYmNyZWQ7CS8qICBCQl9DUkVESVQgZnJvbSBwZWVyIAkqLworCXU4CQlsc3JqdF9yc247CS8qICBMU1JKVCByZWFzb24JCSovCisJdTgJCWxzcmp0X2V4cGw7CS8qICBMU1JKVCBleHBsYW5hdGlvbgkJKi8KKwl3d25fdAkJcHd3bjsJCS8qICBwb3J0IHd3biBvZiBscG9ydAkJKi8KKwl3d25fdAkJbnd3bjsJCS8qICBub2RlIHd3biBvZiBscG9ydAkJKi8KKwl3d25fdAkJcHJfcHd3bjsJLyogIHBvcnQgd3duIG9mIGxwb3J0IHBlZXIJKi8KKwl3d25fdAkJcHJfbnd3bjsJLyogIG5vZGUgd3duIG9mIGxwb3J0IHBlZXIJKi8KKwltYWNfdAkJbHBfbWFjOwkJLyogIGZwbWEvc3BtYSBNQUMgZm9yIGxwb3J0CSovCisJbWFjX3QJCWZjZl9tYWM7CS8qICBGQ0YgTUFDIG9mIGxwb3J0CQkqLworCXN0cnVjdCBiZmFfcmVxcV93YWl0X3MJd3FlOwkvKiAgcmVxdWVzdCB3YWl0IHF1ZXVlIGVsZW1lbnQJKi8KKwl2b2lkCQkqdWFyZzsJCS8qICB1c2VyIGNhbGxiYWNrIGFyZwkJKi8KKwlzdHJ1Y3QgYmZhX2NiX3FlX3MgaGNiX3FlOwkvKiAgY29tcDogY2FsbGJhY2sgcWVsZW0JKi8KKwlzdHJ1Y3QgYmZpX2xwc19sb2dpbl9yc3BfcyAqbG9naW5yc3A7CisJYmZhX2Vwcm90b19zdGF0dXNfdAlleHRfc3RhdHVzOworfTsKKworLyoKKyAqIGJmYSBwcG9ydCBBUEkgZnVuY3Rpb25zCisgKi8KK2JmYV9zdGF0dXNfdCBiZmFfcHBvcnRfZW5hYmxlKHN0cnVjdCBiZmFfcyAqYmZhKTsKK2JmYV9zdGF0dXNfdCBiZmFfcHBvcnRfZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSk7CitiZmFfc3RhdHVzX3QgYmZhX3Bwb3J0X2NmZ19zcGVlZChzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJCWVudW0gYmZhX3Bwb3J0X3NwZWVkIHNwZWVkKTsKK2VudW0gYmZhX3Bwb3J0X3NwZWVkIGJmYV9wcG9ydF9nZXRfc3BlZWQoc3RydWN0IGJmYV9zICpiZmEpOworYmZhX3N0YXR1c190IGJmYV9wcG9ydF9jZmdfdG9wb2xvZ3koc3RydWN0IGJmYV9zICpiZmEsCisJCQllbnVtIGJmYV9wcG9ydF90b3BvbG9neSB0b3BvKTsKK2VudW0gYmZhX3Bwb3J0X3RvcG9sb2d5IGJmYV9wcG9ydF9nZXRfdG9wb2xvZ3koc3RydWN0IGJmYV9zICpiZmEpOworYmZhX3N0YXR1c190IGJmYV9wcG9ydF9jZmdfaGFyZGFscGEoc3RydWN0IGJmYV9zICpiZmEsIHU4IGFscGEpOworYmZhX2Jvb2xlYW5fdCBiZmFfcHBvcnRfZ2V0X2hhcmRhbHBhKHN0cnVjdCBiZmFfcyAqYmZhLCB1OCAqYWxwYSk7Cit1OCBiZmFfcHBvcnRfZ2V0X215YWxwYShzdHJ1Y3QgYmZhX3MgKmJmYSk7CitiZmFfc3RhdHVzX3QgYmZhX3Bwb3J0X2Nscl9oYXJkYWxwYShzdHJ1Y3QgYmZhX3MgKmJmYSk7CitiZmFfc3RhdHVzX3QgYmZhX3Bwb3J0X2NmZ19tYXhmcnNpemUoc3RydWN0IGJmYV9zICpiZmEsIHUxNiBtYXhzaXplKTsKK3UxNiBiZmFfcHBvcnRfZ2V0X21heGZyc2l6ZShzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit1MzIgYmZhX3Bwb3J0X215cGlkKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3U4IGJmYV9wcG9ydF9nZXRfcnhfYmJjcmVkaXQoc3RydWN0IGJmYV9zICpiZmEpOworYmZhX3N0YXR1c190IGJmYV9wcG9ydF90cnVua19lbmFibGUoc3RydWN0IGJmYV9zICpiZmEsIHU4IGJpdG1hcCk7CitiZmFfc3RhdHVzX3QgYmZhX3Bwb3J0X3RydW5rX2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpOworYmZhX2Jvb2xlYW5fdCBiZmFfcHBvcnRfdHJ1bmtfcXVlcnkoc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqYml0bWFwKTsKK3ZvaWQgYmZhX3Bwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Bwb3J0X2F0dHJfcyAqYXR0cik7Cit3d25fdCBiZmFfcHBvcnRfZ2V0X3d3bihzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBub2RlKTsKK2JmYV9zdGF0dXNfdCBiZmFfcHBvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJdW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgKnN0YXRzLAorCQkJYmZhX2NiX3Bwb3J0X3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworYmZhX3N0YXR1c190IGJmYV9wcG9ydF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2NiX3Bwb3J0X3QgY2JmbiwKKwkJCXZvaWQgKmNiYXJnKTsKK3ZvaWQgYmZhX3Bwb3J0X2V2ZW50X3JlZ2lzdGVyKHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJdm9pZCAoKmV2ZW50X2NiZm4pICh2b2lkICpjYmFyZywKKwkJCWJmYV9wcG9ydF9ldmVudF90IGV2ZW50KSwgdm9pZCAqZXZlbnRfY2JhcmcpOworYmZhX2Jvb2xlYW5fdCBiZmFfcHBvcnRfaXNfZGlzYWJsZWQoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfcHBvcnRfY2ZnX3FvcyhzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBvbl9vZmYpOwordm9pZCBiZmFfcHBvcnRfY2ZnX3JhdGVsaW0oc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3Qgb25fb2ZmKTsKK2JmYV9zdGF0dXNfdCBiZmFfcHBvcnRfY2ZnX3JhdGVsaW1fc3BlZWQoc3RydWN0IGJmYV9zICpiZmEsCisJCQllbnVtIGJmYV9wcG9ydF9zcGVlZCBzcGVlZCk7CitlbnVtIGJmYV9wcG9ydF9zcGVlZCBiZmFfcHBvcnRfZ2V0X3JhdGVsaW1fc3BlZWQoc3RydWN0IGJmYV9zICpiZmEpOworCit2b2lkIGJmYV9wcG9ydF9zZXRfdHhfYmJjcmVkaXQoc3RydWN0IGJmYV9zICpiZmEsIHUxNiB0eF9iYmNyZWRpdCk7Cit2b2lkIGJmYV9wcG9ydF9idXN5KHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfYm9vbGVhbl90IHN0YXR1cyk7Cit2b2lkIGJmYV9wcG9ydF9iZWFjb24oc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgYmVhY29uLAorCQkJYmZhX2Jvb2xlYW5fdCBsaW5rX2UyZV9iZWFjb24pOwordm9pZCBiZmFfY2JfcHBvcnRfZXZlbnQodm9pZCAqY2JhcmcsIGJmYV9wcG9ydF9ldmVudF90IGV2ZW50KTsKK3ZvaWQgYmZhX3Bwb3J0X3Fvc19nZXRfYXR0cihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9xb3NfYXR0cl9zICpxb3NfYXR0cik7Cit2b2lkIGJmYV9wcG9ydF9xb3NfZ2V0X3ZjX2F0dHIoc3RydWN0IGJmYV9zICpiZmEsCisJCQlzdHJ1Y3QgYmZhX3Fvc192Y19hdHRyX3MgKnFvc192Y19hdHRyKTsKK2JmYV9zdGF0dXNfdCBiZmFfcHBvcnRfZ2V0X3Fvc19zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJCXVuaW9uIGJmYV9wcG9ydF9zdGF0c191ICpzdGF0cywKKwkJCWJmYV9jYl9wcG9ydF90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCBiZmFfcHBvcnRfY2xlYXJfcW9zX3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfY2JfcHBvcnRfdCBjYmZuLAorCQkJdm9pZCAqY2JhcmcpOworYmZhX2Jvb2xlYW5fdCAgICAgYmZhX3Bwb3J0X2lzX3JhdGVsaW0oc3RydWN0IGJmYV9zICpiZmEpOworYmZhX2Jvb2xlYW5fdAliZmFfcHBvcnRfaXNfbGlua3VwKHN0cnVjdCBiZmFfcyAqYmZhKTsKKworLyoKKyAqIGJmYSBycG9ydCBBUEkgZnVuY3Rpb25zCisgKi8KK3N0cnVjdCBiZmFfcnBvcnRfcyAqYmZhX3Jwb3J0X2NyZWF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqcnBvcnRfZHJ2KTsKK3ZvaWQgYmZhX3Jwb3J0X2RlbGV0ZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0KTsKK3ZvaWQgYmZhX3Jwb3J0X29ubGluZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0LAorCQkJc3RydWN0IGJmYV9ycG9ydF9pbmZvX3MgKnJwb3J0X2luZm8pOwordm9pZCBiZmFfcnBvcnRfb2ZmbGluZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0KTsKK3ZvaWQgYmZhX3Jwb3J0X3NwZWVkKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQsIGVudW0gYmZhX3Bwb3J0X3NwZWVkIHNwZWVkKTsKK3ZvaWQgYmZhX3Jwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0LAorCQkJc3RydWN0IGJmYV9ycG9ydF9oYWxfc3RhdHNfcyAqc3RhdHMpOwordm9pZCBiZmFfcnBvcnRfY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydCk7Cit2b2lkIGJmYV9jYl9ycG9ydF9vbmxpbmUodm9pZCAqcnBvcnQpOwordm9pZCBiZmFfY2JfcnBvcnRfb2ZmbGluZSh2b2lkICpycG9ydCk7Cit2b2lkIGJmYV9jYl9ycG9ydF9xb3Nfc2NuX2Zsb3dpZCh2b2lkICpycG9ydCwKKwkJCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBvbGRfcW9zX2F0dHIsCisJCQlzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MgbmV3X3Fvc19hdHRyKTsKK3ZvaWQgYmZhX2NiX3Jwb3J0X3Fvc19zY25fcHJpbyh2b2lkICpycG9ydCwKKwkJCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBvbGRfcW9zX2F0dHIsCisJCQlzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MgbmV3X3Fvc19hdHRyKTsKK3ZvaWQgYmZhX3Jwb3J0X2dldF9xb3NfYXR0cihzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0LAorCQkJc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zICpxb3NfYXR0cik7CisKKy8qCisgKiBiZmEgZmN4cCBBUEkgZnVuY3Rpb25zCisgKi8KK3N0cnVjdCBiZmFfZmN4cF9zICpiZmFfZmN4cF9hbGxvYyh2b2lkICpiZmFkX2ZjeHAsIHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJaW50IG5yZXFfc2dsZXMsIGludCBucnNwX3NnbGVzLAorCQkJYmZhX2ZjeHBfZ2V0X3NnYWRkcl90IGdldF9yZXFfc2dhLAorCQkJYmZhX2ZjeHBfZ2V0X3NnbGVuX3QgZ2V0X3JlcV9zZ2xlbiwKKwkJCWJmYV9mY3hwX2dldF9zZ2FkZHJfdCBnZXRfcnNwX3NnYSwKKwkJCWJmYV9mY3hwX2dldF9zZ2xlbl90IGdldF9yc3Bfc2dsZW4pOwordm9pZCBiZmFfZmN4cF9hbGxvY193YWl0KHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2ZjeHBfd3FlX3MgKndxZSwKKwkJCWJmYV9mY3hwX2FsbG9jX2NiZm5fdCBhbGxvY19jYmZuLCB2b2lkICpjYmFyZyk7Cit2b2lkIGJmYV9mY3hwX3dhbGxvY19jYW5jZWwoc3RydWN0IGJmYV9zICpiZmEsCisJCQlzdHJ1Y3QgYmZhX2ZjeHBfd3FlX3MgKndxZSk7Cit2b2lkIGJmYV9mY3hwX2Rpc2NhcmQoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApOworCit2b2lkICpiZmFfZmN4cF9nZXRfcmVxYnVmKHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwKTsKK3ZvaWQgKmJmYV9mY3hwX2dldF9yc3BidWYoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApOworCit2b2lkIGJmYV9mY3hwX2ZyZWUoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApOworCit2b2lkIGJmYV9mY3hwX3NlbmQoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0LCB1MTYgdmZfaWQsIHU4IGxwX3RhZywKKwkJCWJmYV9ib29sZWFuX3QgY3RzLCBlbnVtIGZjX2NvcyBjb3MsCisJCQl1MzIgcmVxbGVuLCBzdHJ1Y3QgZmNoc19zICpmY2hzLAorCQkJYmZhX2NiX2ZjeHBfc2VuZF90IGNiZm4sCisJCQl2b2lkICpjYmFyZywKKwkJCXUzMiByc3BfbWF4bGVuLCB1OCByc3BfdGltZW91dCk7CitiZmFfc3RhdHVzX3QgYmZhX2ZjeHBfYWJvcnQoc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApOwordTMyICAgICAgICBiZmFfZmN4cF9nZXRfcmVxYnVmc3ooc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApOwordTMyCWJmYV9mY3hwX2dldF9tYXhyc3Aoc3RydWN0IGJmYV9zICpiZmEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKgorYmZhX3VmX2dldF9mcm1idWYoc3RydWN0IGJmYV91Zl9zICp1ZikKK3sKKwlyZXR1cm4gdWYtPmRhdGFfcHRyOworfQorCitzdGF0aWMgaW5saW5lICAgdTE2CitiZmFfdWZfZ2V0X2ZybWxlbihzdHJ1Y3QgYmZhX3VmX3MgKnVmKQoreworCXJldHVybiB1Zi0+ZGF0YV9sZW47Cit9CisKKy8qKgorICogICAgICBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHVuc29saWNpdGVkIGZyYW1lIHJlY2VpdmUgaGFuZGxlci4KKyAqCisgKiBAcGFyYW1baW5dICAgICAgICAgICBjYmFyZyAgICAgICAgICAgY2FsbGJhY2sgYXJnIGZvciByZWNlaXZlIGhhbmRsZXIKKyAqIEBwYXJhbVtpbl0gICAgICAgICAgIHVmICAgICAgICAgICAgICB1bnNvbGljaXRlZCBmcmFtZSBkZXNjcmlwdG9yCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJmYV9jYl91Zl9yZWN2X3QpICh2b2lkICpjYmFyZywgc3RydWN0IGJmYV91Zl9zICp1Zik7CisKKy8qCisgKiBiZmEgdWYgQVBJIGZ1bmN0aW9ucworICovCit2b2lkIGJmYV91Zl9yZWN2X3JlZ2lzdGVyKHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfY2JfdWZfcmVjdl90IHVmcmVjdiwKKwkJCXZvaWQgKmNiYXJnKTsKK3ZvaWQgYmZhX3VmX2ZyZWUoc3RydWN0IGJmYV91Zl9zICp1Zik7CisKKy8qKgorICogYmZhIGxwb3J0IHNlcnZpY2UgYXBpCisgKi8KKworc3RydWN0IGJmYV9scHNfcyAqYmZhX2xwc19hbGxvYyhzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9scHNfZGVsZXRlKHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7Cit2b2lkIGJmYV9scHNfZGlzY2FyZChzdHJ1Y3QgYmZhX2xwc19zICpscHMpOwordm9pZCBiZmFfbHBzX2Zsb2dpKHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgdm9pZCAqdWFyZywgdTggYWxwYSwgdTE2IHBkdXN6LAorCQkgICB3d25fdCBwd3duLCB3d25fdCBud3duLCBiZmFfYm9vbGVhbl90IGF1dGhfZW4pOwordm9pZCBiZmFfbHBzX2ZkaXNjKHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgdm9pZCAqdWFyZywgdTE2IHBkdXN6LCB3d25fdCBwd3duLAorCQkgICB3d25fdCBud3duKTsKK3ZvaWQgYmZhX2xwc19mbG9nbyhzdHJ1Y3QgYmZhX2xwc19zICpscHMpOwordm9pZCBiZmFfbHBzX2ZkaXNjbG9nbyhzdHJ1Y3QgYmZhX2xwc19zICpscHMpOwordTggYmZhX2xwc19nZXRfdGFnKHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7CitiZmFfYm9vbGVhbl90IGJmYV9scHNfaXNfbnBpdl9lbihzdHJ1Y3QgYmZhX2xwc19zICpscHMpOworYmZhX2Jvb2xlYW5fdCBiZmFfbHBzX2lzX2Zwb3J0KHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7CitiZmFfYm9vbGVhbl90IGJmYV9scHNfaXNfYnJjZF9mYWJyaWMoc3RydWN0IGJmYV9scHNfcyAqbHBzKTsKK2JmYV9ib29sZWFuX3QgYmZhX2xwc19pc19hdXRocmVxKHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7CitiZmFfZXByb3RvX3N0YXR1c190IGJmYV9scHNfZ2V0X2V4dHN0YXR1cyhzdHJ1Y3QgYmZhX2xwc19zICpscHMpOwordTMyIGJmYV9scHNfZ2V0X3BpZChzdHJ1Y3QgYmZhX2xwc19zICpscHMpOwordTggYmZhX2xwc19nZXRfdGFnX2Zyb21fcGlkKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgcGlkKTsKK3UxNiBiZmFfbHBzX2dldF9wZWVyX2JiY3JlZGl0KHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7Cit3d25fdCBiZmFfbHBzX2dldF9wZWVyX3B3d24oc3RydWN0IGJmYV9scHNfcyAqbHBzKTsKK3d3bl90IGJmYV9scHNfZ2V0X3BlZXJfbnd3bihzdHJ1Y3QgYmZhX2xwc19zICpscHMpOwordTggYmZhX2xwc19nZXRfbHNyanRfcnNuKHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7Cit1OCBiZmFfbHBzX2dldF9sc3JqdF9leHBsKHN0cnVjdCBiZmFfbHBzX3MgKmxwcyk7Cit2b2lkIGJmYV9jYl9scHNfZmxvZ2lfY29tcCh2b2lkICpiZmFkLCB2b2lkICp1YXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKK3ZvaWQgYmZhX2NiX2xwc19mbG9nb19jb21wKHZvaWQgKmJmYWQsIHZvaWQgKnVhcmcpOwordm9pZCBiZmFfY2JfbHBzX2ZkaXNjX2NvbXAodm9pZCAqYmZhZCwgdm9pZCAqdWFyZywgYmZhX3N0YXR1c190IHN0YXR1cyk7Cit2b2lkIGJmYV9jYl9scHNfZmRpc2Nsb2dvX2NvbXAodm9pZCAqYmZhZCwgdm9pZCAqdWFyZyk7CisKKyNlbmRpZiAvKiBfX0JGQV9TVkNfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfdGltZXIuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmFfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA3MTAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmYV90aW1lci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRkFfVElNRVJfSF9fCisjZGVmaW5lIF9fQkZBX1RJTUVSX0hfXworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorI2luY2x1ZGUgPGNzL2JmYV9xLmg+CisKK3N0cnVjdCBiZmFfczsKKwordHlwZWRlZiB2b2lkICgqYmZhX3RpbWVyX2NiZm5fdCkodm9pZCAqKTsKKworLyoqCisgKiBCRkEgdGltZXIgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGJmYV90aW1lcl9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXFlOworCWJmYV90aW1lcl9jYmZuX3QgdGltZXJjYjsKKwl2b2lkICAgICAgICAgICAgKmFyZzsKKwlpbnQgICAgICAgICAgICAgdGltZW91dDsJLyoqPCBpbiBtaWxsaXNlY3MuICovCit9OworCisvKioKKyAqIFRpbWVyIG1vZHVsZSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGJmYV90aW1lcl9tb2RfcyB7CisJc3RydWN0IGxpc3RfaGVhZCB0aW1lcl9xOworfTsKKworI2RlZmluZSBCRkFfVElNRVJfRlJFUSA1MDAgLyoqPCBzcGVjaWZpZWQgaW4gbWlsbGlzZWNzICovCisKK3ZvaWQgYmZhX3RpbWVyX2JlYXQoc3RydWN0IGJmYV90aW1lcl9tb2RfcyAqbW9kKTsKK3ZvaWQgYmZhX3RpbWVyX2luaXQoc3RydWN0IGJmYV90aW1lcl9tb2RfcyAqbW9kKTsKK3ZvaWQgYmZhX3RpbWVyX2JlZ2luKHN0cnVjdCBiZmFfdGltZXJfbW9kX3MgKm1vZCwgc3RydWN0IGJmYV90aW1lcl9zICp0aW1lciwKKwkJCWJmYV90aW1lcl9jYmZuX3QgdGltZXJjYiwgdm9pZCAqYXJnLAorCQkJdW5zaWduZWQgaW50IHRpbWVvdXQpOwordm9pZCBiZmFfdGltZXJfc3RvcChzdHJ1Y3QgYmZhX3RpbWVyX3MgKnRpbWVyKTsKKworI2VuZGlmIC8qIF9fQkZBX1RJTUVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmkuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhZGZlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpLmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGSV9IX18KKyNkZWZpbmUgX19CRklfSF9fCisKKyNpbmNsdWRlIDxiZmFfb3NfaW5jLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19zdGF0dXMuaD4KKworI3ByYWdtYSBwYWNrKDEpCisKKy8qKgorICogTXNnIGhlYWRlciBjb21tb24gdG8gYWxsIG1zZ3MKKyAqLworc3RydWN0IGJmaV9taGRyX3MgeworCXU4ICAgICAgICAgbXNnX2NsYXNzOwkvKiAgQHJlZiBiZmlfbWNsYXNzX3QJICAgICovCisJdTggICAgICAgICBtc2dfaWQ7CQkvKiAgbXNnIG9wY29kZSB3aXRoIGluIHRoZSBjbGFzcyAgICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggICAgICAgICByc3ZkOworCQkJdTggICAgICAgICBscHVfaWQ7CS8qICBtc2cgZGVzdGluYXRpb24JICAgICovCisJCX0gaDJpOworCQl1MTYgICAgICAgIGkyaHRvazsJLyogIHRva2VuIGluIG1zZ3MgdG8gaG9zdAkgICAgKi8KKwl9IG10YWc7Cit9OworCisjZGVmaW5lIGJmaV9oMmlfc2V0KF9taCwgX21jLCBfb3AsIF9scHVpZCkgZG8gewkJXAorCShfbWgpLm1zZ19jbGFzcyAJCT0gKF9tYyk7ICAgICAgXAorCShfbWgpLm1zZ19pZAkJCT0gKF9vcCk7ICAgICAgXAorCShfbWgpLm10YWcuaDJpLmxwdV9pZAk9IChfbHB1aWQpOyAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYmZpX2kyaF9zZXQoX21oLCBfbWMsIF9vcCwgX2kyaHRvaykgZG8gewkJXAorCShfbWgpLm1zZ19jbGFzcyAJCT0gKF9tYyk7ICAgICAgXAorCShfbWgpLm1zZ19pZAkJCT0gKF9vcCk7ICAgICAgXAorCShfbWgpLm10YWcuaTJodG9rCQk9IChfaTJodG9rKTsgICAgICBcCit9IHdoaWxlICgwKQorCisvKgorICogTWVzc2FnZSBvcGNvZGVzOiAwLTEyNyB0byBmaXJtd2FyZSwgMTI4LTI1NSB0byBob3N0CisgKi8KKyNkZWZpbmUgQkZJX0kySF9PUENPREVfQkFTRQkxMjgKKyNkZWZpbmUgQkZBX0kySE0oX3gpIAkJCSgoX3gpICsgQkZJX0kySF9PUENPREVfQkFTRSkKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNjYXR0ZXIgR2F0aGVyIEVsZW1lbnQgYW5kIFBhZ2UgZGVmaW5pdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2RlZmluZSBCRklfU0dFX0lOTElORQkxCisjZGVmaW5lIEJGSV9TR0VfSU5MSU5FX01BWAkoQkZJX1NHRV9JTkxJTkUgKyAxKQorCisvKioKKyAqIFNHIEZsYWdzCisgKi8KK2VudW0geworCUJGSV9TR0VfREFUQQk9IDAsCS8qICBkYXRhIGFkZHJlc3MsIG5vdCBsYXN0CSAgICAgKi8KKwlCRklfU0dFX0RBVEFfQ1BMCT0gMSwJLyogIGRhdGEgYWRkciwgbGFzdCBpbiBjdXJyZW50IHBhZ2UgKi8KKwlCRklfU0dFX0RBVEFfTEFTVAk9IDMsCS8qICBkYXRhIGFkZHJlc3MsIGxhc3QJCSAgICAgKi8KKwlCRklfU0dFX0xJTksJPSAyLAkvKiAgbGluayBhZGRyZXNzCQkgICAgICovCisJQkZJX1NHRV9QR0RMRU4JPSAyLAkvKiAgY3VtdWxhdGl2ZSBkYXRhIGxlbmd0aCBmb3IgcGFnZSAqLworfTsKKworLyoqCisgKiBETUEgYWRkcmVzc2VzCisgKi8KK3VuaW9uIGJmaV9hZGRyX3UgeworCXN0cnVjdCB7CisJCXUzMiAgICAgICAgYWRkcl9sbzsKKwkJdTMyICAgICAgICBhZGRyX2hpOworCX0gYTMyOworfTsKKworLyoqCisgKiBTY2F0dGVyIEdhdGhlciBFbGVtZW50CisgKi8KK3N0cnVjdCBiZmlfc2dlX3MgeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTMyICAgICAgICBmbGFncwk6IDIsCisJCQlyc3ZkCTogMiwKKwkJCXNnX2xlbgk6IDI4OworI2Vsc2UKKwl1MzIgICAgICAgIHNnX2xlbgk6IDI4LAorCQkJcnN2ZAk6IDIsCisJCQlmbGFncwk6IDI7CisjZW5kaWYKKwl1bmlvbiBiZmlfYWRkcl91IHNnYTsKK307CisKKy8qKgorICogU2NhdHRlciBHYXRoZXIgUGFnZQorICovCisjZGVmaW5lIEJGSV9TR1BHX0RBVEFfU0dFUwkJNworI2RlZmluZSBCRklfU0dQR19TR0VTX01BWAkJKEJGSV9TR1BHX0RBVEFfU0dFUyArIDEpCisjZGVmaW5lIEJGSV9TR1BHX1JTVkRfV0RfTEVOCTgKK3N0cnVjdCBiZmlfc2dwZ19zIHsKKwlzdHJ1Y3QgYmZpX3NnZV9zIHNnZXNbQkZJX1NHUEdfU0dFU19NQVhdOworCXUzMglyc3ZkW0JGSV9TR1BHX1JTVkRfV0RfTEVOXTsKK307CisKKy8qCisgKiBMYXJnZSBNZXNzYWdlIHN0cnVjdHVyZSAtIDEyOCBCeXRlcyBzaXplIE1zZ3MKKyAqLworI2RlZmluZSBCRklfTE1TR19TWgkJMTI4CisjZGVmaW5lIEJGSV9MTVNHX1BMX1dTWglcCisJCQkoKEJGSV9MTVNHX1NaIC0gc2l6ZW9mKHN0cnVjdCBiZmlfbWhkcl9zKSkgLyA0KQorCitzdHJ1Y3QgYmZpX21zZ19zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyBtaGRyOworCXUzMglwbFtCRklfTE1TR19QTF9XU1pdOworfTsKKworLyoqCisgKiBNYWlsYm94IG1lc3NhZ2Ugc3RydWN0dXJlCisgKi8KKyNkZWZpbmUgQkZJX01CTVNHX1NaCQk3CitzdHJ1Y3QgYmZpX21ibXNnX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zCW1oOworCXUzMgkJcGxbQkZJX01CTVNHX1NaXTsKK307CisKKy8qKgorICogTWVzc2FnZSBDbGFzc2VzCisgKi8KK2VudW0gYmZpX21jbGFzcyB7CisJQkZJX01DX0lPQwkJPSAxLAkvKiAgSU8gQ29udHJvbGxlciAoSU9DKQkgICAgKi8KKwlCRklfTUNfRElBRwkJPSAyLAkvKiAgRGlhZ25vc3RpYyBNc2dzCQkgICAgKi8KKwlCRklfTUNfRkxBU0gJCT0gMywJLyogIEZsYXNoIG1lc3NhZ2UgY2xhc3MJICAgICovCisJQkZJX01DX0NFRQkJPSA0LAorCUJGSV9NQ19GQ19QT1JUCQk9IDUsCS8qICBGQyBwb3J0CQkgICAJICAgICovCisJQkZJX01DX0lPQ0ZDCQk9IDYsCS8qICBGQyAtIElPIENvbnRyb2xsZXIgKElPQykJICAgICovCisJQkZJX01DX0xMCQk9IDcsCS8qICBMaW5rIExheWVyCQkgCSAgICAqLworCUJGSV9NQ19VRgkJPSA4LAkvKiAgVW5zb2xpY2l0ZWQgZnJhbWUgcmVjZWl2ZQkgICAgKi8KKwlCRklfTUNfRkNYUAkJPSA5LAkvKiAgRkMgVHJhbnNwb3J0CQkgICAgKi8KKwlCRklfTUNfTFBTCQk9IDEwLAkvKiAgbHBvcnQgZmMgbG9naW4gc2VydmljZXMJICAgICovCisJQkZJX01DX1JQT1JUCQk9IDExLAkvKiAgUmVtb3RlIHBvcnQJCSAgICAqLworCUJGSV9NQ19JVE5JTQkJPSAxMiwJLyogIEktVCBuZXh1cyAoSW5pdGlhdG9yIG1vZGUpCSAgICAqLworCUJGSV9NQ19JT0lNX1JFQUQJPSAxMywJLyogIHJlYWQgSU8gKEluaXRpYXRvciBtb2RlKQkgICAgKi8KKwlCRklfTUNfSU9JTV9XUklURQk9IDE0LAkvKiAgd3JpdGUgSU8gKEluaXRpYXRvciBtb2RlKQkgICAgKi8KKwlCRklfTUNfSU9JTV9JTwkJPSAxNSwJLyogIElPIChJbml0aWF0b3IgbW9kZSkJICAgICovCisJQkZJX01DX0lPSU0JCT0gMTYsCS8qICBJTyAoSW5pdGlhdG9yIG1vZGUpCSAgICAqLworCUJGSV9NQ19JT0lNX0lPQ09NCT0gMTcsCS8qICBnb29kIElPIGNvbXBsZXRpb24JCSAgICAqLworCUJGSV9NQ19UU0tJTQkJPSAxOCwJLyogIEluaXRpYXRvciBUYXNrIG1hbmFnZW1lbnQJICAgICovCisJQkZJX01DX1NCT09UCQk9IDE5LAkvKiAgU0FOIGJvb3Qgc2VydmljZXMJCSAgICAqLworCUJGSV9NQ19JUEZDCQk9IDIwLAkvKiAgSVAgb3ZlciBGQyBNc2dzCQkgICAgKi8KKwlCRklfTUNfUE9SVAkJPSAyMSwJLyogIFBoeXNpY2FsIHBvcnQJCSAgICAqLworCUJGSV9NQ19NQVgJCT0gMzIKK307CisKKyNkZWZpbmUgQkZJX0lPQ19NQVhfQ1FTCQk0CisjZGVmaW5lIEJGSV9JT0NfTUFYX0NRU19BU0lDCTgKKyNkZWZpbmUgQkZJX0lPQ19NU0dMRU5fTUFYCTMyCS8qIDMyIGJ5dGVzICovCisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZiAvKiBfX0JGSV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfYm9vdC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NTVhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9ib290LmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworLyoKKyAqIGJmaV9ib290LmgKKyAqLworCisjaWZuZGVmIF9fQkZJX0JPT1RfSF9fCisjZGVmaW5lIF9fQkZJX0JPT1RfSF9fCisKKyNkZWZpbmUgQkZJX0JPT1RfVFlQRV9PRkYJCTgKKyNkZWZpbmUgQkZJX0JPT1RfUEFSQU1fT0ZGCQkxMgorCisjZGVmaW5lIEJGSV9CT09UX1RZUEVfTk9STUFMIAkJMAkvKiBwYXJhbSBpcyBkZXZpY2UgaWQgKi8KKyNkZWZpbmUJQkZJX0JPT1RfVFlQRV9GTEFTSAkJMQorI2RlZmluZQlCRklfQk9PVF9UWVBFX01FTVRFU1QJCTIKKworI2RlZmluZSBCRklfQk9PVF9NRU1URVNUX1JFU19BRERSICAgMHg5MDAKKyNkZWZpbmUgQkZJX0JPT1RfTUVNVEVTVF9SRVNfU0lHICAgIDB4QTBBMUEyQTMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9jYnJlZy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfY2JyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2JiNTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfY2JyZWcuaApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogYmZpX2NicmVnLmggY3Jvc3Nib3cgaG9zdCBibG9jayByZWdpc3RlciBkZWZpbml0aW9ucworICoKKyAqICEhISBEbyBub3QgZWRpdC4gQXV0byBnZW5lcmF0ZWQuICEhIQorICovCisKKyNpZm5kZWYgX19CRklfQ0JSRUdfSF9fCisjZGVmaW5lIF9fQkZJX0NCUkVHX0hfXworCisKKyNkZWZpbmUgSE9TVEZOMF9JTlRfU1RBVFVTICAgICAgICAgICAgICAgMHgwMDAxNDAwMAorI2RlZmluZSBfX0hPU1RGTjBfSU5UX1NUQVRVU19MVkxfTUsgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX0xWTF9TSCAgICAgIDIwCisjZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX0xWTChfdikgICAgICgoX3YpIDw8IF9fSE9TVEZOMF9JTlRfU1RBVFVTX0xWTF9TSCkKKyNkZWZpbmUgX19IT1NURk4wX0lOVF9TVEFUVVNfUCAgICAgICAgICAgMHgwMDBmZmZmZgorI2RlZmluZSBIT1NURk4wX0lOVF9NU0sgICAgICAgICAgICAgICAgICAweDAwMDE0MDA0CisjZGVmaW5lIEhPU1RfUEFHRV9OVU1fRk4wICAgICAgICAgICAgICAgIDB4MDAwMTQwMDgKKyNkZWZpbmUgX19IT1NUX1BBR0VfTlVNX0ZOICAgICAgICAgICAgICAgMHgwMDAwMDFmZgorI2RlZmluZSBIT1NURk4xX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAweDAwMDE0MTAwCisjZGVmaW5lIF9fSE9TVEZOMV9JTlRfU1RBVF9MVkxfTUsgICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgX19IT1NURk4xX0lOVF9TVEFUX0xWTF9TSCAgICAgICAgMjAKKyNkZWZpbmUgX19IT1NURk4xX0lOVF9TVEFUX0xWTChfdikgICAgICAgKChfdikgPDwgX19IT1NURk4xX0lOVF9TVEFUX0xWTF9TSCkKKyNkZWZpbmUgX19IT1NURk4xX0lOVF9TVEFUX1AgICAgICAgICAgICAgMHgwMDBmZmZmZgorI2RlZmluZSBIT1NURk4xX0lOVF9NU0sgICAgICAgICAgICAgICAgICAweDAwMDE0MTA0CisjZGVmaW5lIEhPU1RfUEFHRV9OVU1fRk4xICAgICAgICAgICAgICAgIDB4MDAwMTQxMDgKKyNkZWZpbmUgQVBQX1BMTF80MDBfQ1RMX1JFRyAgICAgICAgICAgICAgMHgwMDAxNDIwNAorI2RlZmluZSBfX1BfNDAwX1BMTF9MT0NLICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF80MDBfU1JBTV9VU0VfMTAwTUhaICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9SRVNFVF9USU1FUl9NSyAgICAgMHgwMDBlMDAwMAorI2RlZmluZSBfX0FQUF9QTExfNDAwX1JFU0VUX1RJTUVSX1NIICAgICAxNworI2RlZmluZSBfX0FQUF9QTExfNDAwX1JFU0VUX1RJTUVSKF92KSAgICAoKF92KSA8PCBfX0FQUF9QTExfNDAwX1JFU0VUX1RJTUVSX1NIKQorI2RlZmluZSBfX0FQUF9QTExfNDAwX0xPR0lDX1NPRlRfUkVTRVQgICAweDAwMDEwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF80MDBfQ05UTE1UMF8xX01LICAgICAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9DTlRMTVQwXzFfU0ggICAgICAgMTQKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9DTlRMTVQwXzEoX3YpICAgICAgKChfdikgPDwgX19BUFBfUExMXzQwMF9DTlRMTVQwXzFfU0gpCisjZGVmaW5lIF9fQVBQX1BMTF80MDBfSklUTE1UMF8xX01LICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9KSVRMTVQwXzFfU0ggICAgICAgMTIKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9KSVRMTVQwXzEoX3YpICAgICAgKChfdikgPDwgX19BUFBfUExMXzQwMF9KSVRMTVQwXzFfU0gpCisjZGVmaW5lIF9fQVBQX1BMTF80MDBfSFJFRiAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9IRElWICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBfX0FQUF9QTExfNDAwX1AwXzFfTUsgICAgICAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIF9fQVBQX1BMTF80MDBfUDBfMV9TSCAgICAgICAgICAgIDgKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9QMF8xKF92KSAgICAgICAgICAgKChfdikgPDwgX19BUFBfUExMXzQwMF9QMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfNDAwX1owXzJfTUsgICAgICAgICAgICAweDAwMDAwMGUwCisjZGVmaW5lIF9fQVBQX1BMTF80MDBfWjBfMl9TSCAgICAgICAgICAgIDUKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9aMF8yKF92KSAgICAgICAgICAgKChfdikgPDwgX19BUFBfUExMXzQwMF9aMF8yX1NIKQorI2RlZmluZSBfX0FQUF9QTExfNDAwX1JTRUwyMDA1MDAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIF9fQVBQX1BMTF80MDBfRU5BUlNUICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgX19BUFBfUExMXzQwMF9CWVBBU1MgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBfX0FQUF9QTExfNDAwX0xSRVNFVE4gICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIF9fQVBQX1BMTF80MDBfRU5BQkxFICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVBQX1BMTF8yMTJfQ1RMX1JFRyAgICAgICAgICAgICAgMHgwMDAxNDIwOAorI2RlZmluZSBfX1BfMjEyX1BMTF9MT0NLICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfUkVTRVRfVElNRVJfTUsgICAgIDB4MDAwZTAwMDAKKyNkZWZpbmUgX19BUFBfUExMXzIxMl9SRVNFVF9USU1FUl9TSCAgICAgMTcKKyNkZWZpbmUgX19BUFBfUExMXzIxMl9SRVNFVF9USU1FUihfdikgICAgKChfdikgPDwgX19BUFBfUExMXzIxMl9SRVNFVF9USU1FUl9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzIxMl9MT0dJQ19TT0ZUX1JFU0VUICAgMHgwMDAxMDAwMAorI2RlZmluZSBfX0FQUF9QTExfMjEyX0NOVExNVDBfMV9NSyAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfQ05UTE1UMF8xX1NIICAgICAgIDE0CisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfQ05UTE1UMF8xKF92KSAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF8yMTJfQ05UTE1UMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfMjEyX0pJVExNVDBfMV9NSyAgICAgICAweDAwMDAzMDAwCisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfSklUTE1UMF8xX1NIICAgICAgIDEyCisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfSklUTE1UMF8xKF92KSAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF8yMTJfSklUTE1UMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfMjEyX0hSRUYgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfSERJViAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgX19BUFBfUExMXzIxMl9QMF8xX01LICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBfX0FQUF9QTExfMjEyX1AwXzFfU0ggICAgICAgICAgICA4CisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfUDBfMShfdikgICAgICAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF8yMTJfUDBfMV9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzIxMl9aMF8yX01LICAgICAgICAgICAgMHgwMDAwMDBlMAorI2RlZmluZSBfX0FQUF9QTExfMjEyX1owXzJfU0ggICAgICAgICAgICA1CisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfWjBfMihfdikgICAgICAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF8yMTJfWjBfMl9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzIxMl9SU0VMMjAwNTAwICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBfX0FQUF9QTExfMjEyX0VOQVJTVCAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIF9fQVBQX1BMTF8yMTJfQllQQVNTICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgX19BUFBfUExMXzIxMl9MUkVTRVROICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBfX0FQUF9QTExfMjEyX0VOQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhPU1RfU0VNMF9SRUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQyMzAKKyNkZWZpbmUgX19IT1NUX1NFTUFQSE9SRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIT1NUX1NFTTFfUkVHICAgICAgICAgICAgICAgICAgICAweDAwMDE0MjM0CisjZGVmaW5lIEhPU1RfU0VNMl9SRUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQyMzgKKyNkZWZpbmUgSE9TVF9TRU0zX1JFRyAgICAgICAgICAgICAgICAgICAgMHgwMDAxNDIzYworI2RlZmluZSBIT1NUX1NFTTBfSU5GT19SRUcgICAgICAgICAgICAgICAweDAwMDE0MjQwCisjZGVmaW5lIEhPU1RfU0VNMV9JTkZPX1JFRyAgICAgICAgICAgICAgIDB4MDAwMTQyNDQKKyNkZWZpbmUgSE9TVF9TRU0yX0lORk9fUkVHICAgICAgICAgICAgICAgMHgwMDAxNDI0OAorI2RlZmluZSBIT1NUX1NFTTNfSU5GT19SRUcgICAgICAgICAgICAgICAweDAwMDE0MjRjCisjZGVmaW5lIEhPU1RGTjBfTFBVMF9DTURfU1RBVCAgICAgICAgICAgIDB4MDAwMTkwMDAKKyNkZWZpbmUgX19IT1NURk4wX0xQVTBfTUJPWF9JTkZPX01LICAgICAgMHhmZmZmZmZmZQorI2RlZmluZSBfX0hPU1RGTjBfTFBVMF9NQk9YX0lORk9fU0ggICAgICAxCisjZGVmaW5lIF9fSE9TVEZOMF9MUFUwX01CT1hfSU5GTyhfdikgICAgICgoX3YpIDw8IF9fSE9TVEZOMF9MUFUwX01CT1hfSU5GT19TSCkKKyNkZWZpbmUgX19IT1NURk4wX0xQVTBfTUJPWF9DTURfU1RBVFVTICAgMHgwMDAwMDAwMQorI2RlZmluZSBMUFUwX0hPU1RGTjBfQ01EX1NUQVQgICAgICAgICAgICAweDAwMDE5MDA4CisjZGVmaW5lIF9fTFBVMF9IT1NURk4wX01CT1hfSU5GT19NSyAgICAgIDB4ZmZmZmZmZmUKKyNkZWZpbmUgX19MUFUwX0hPU1RGTjBfTUJPWF9JTkZPX1NIICAgICAgMQorI2RlZmluZSBfX0xQVTBfSE9TVEZOMF9NQk9YX0lORk8oX3YpICAgICAoKF92KSA8PCBfX0xQVTBfSE9TVEZOMF9NQk9YX0lORk9fU0gpCisjZGVmaW5lIF9fTFBVMF9IT1NURk4wX01CT1hfQ01EX1NUQVRVUyAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSE9TVEZOMV9MUFUxX0NNRF9TVEFUICAgICAgICAgICAgMHgwMDAxOTAxNAorI2RlZmluZSBfX0hPU1RGTjFfTFBVMV9NQk9YX0lORk9fTUsgICAgICAweGZmZmZmZmZlCisjZGVmaW5lIF9fSE9TVEZOMV9MUFUxX01CT1hfSU5GT19TSCAgICAgIDEKKyNkZWZpbmUgX19IT1NURk4xX0xQVTFfTUJPWF9JTkZPKF92KSAgICAgKChfdikgPDwgX19IT1NURk4xX0xQVTFfTUJPWF9JTkZPX1NIKQorI2RlZmluZSBfX0hPU1RGTjFfTFBVMV9NQk9YX0NNRF9TVEFUVVMgICAweDAwMDAwMDAxCisjZGVmaW5lIExQVTFfSE9TVEZOMV9DTURfU1RBVCAgICAgICAgICAgIDB4MDAwMTkwMWMKKyNkZWZpbmUgX19MUFUxX0hPU1RGTjFfTUJPWF9JTkZPX01LICAgICAgMHhmZmZmZmZmZQorI2RlZmluZSBfX0xQVTFfSE9TVEZOMV9NQk9YX0lORk9fU0ggICAgICAxCisjZGVmaW5lIF9fTFBVMV9IT1NURk4xX01CT1hfSU5GTyhfdikgICAgICgoX3YpIDw8IF9fTFBVMV9IT1NURk4xX01CT1hfSU5GT19TSCkKKyNkZWZpbmUgX19MUFUxX0hPU1RGTjFfTUJPWF9DTURfU1RBVFVTICAgMHgwMDAwMDAwMQorI2RlZmluZSBDUEVfUTBfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDE0CisjZGVmaW5lIENQRV9RMF9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMWMKKyNkZWZpbmUgQ1BFX1EwX0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAyMAorI2RlZmluZSBDUEVfUTFfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDM0CisjZGVmaW5lIENQRV9RMV9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwM2MKKyNkZWZpbmUgQ1BFX1ExX0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDA0MAorI2RlZmluZSBDUEVfUTJfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDU0CisjZGVmaW5lIENQRV9RMl9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwNWMKKyNkZWZpbmUgQ1BFX1EyX0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDA2MAorI2RlZmluZSBDUEVfUTNfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDc0CisjZGVmaW5lIENQRV9RM19QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwN2MKKyNkZWZpbmUgQ1BFX1EzX0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDA4MAorI2RlZmluZSBDUEVfUTRfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDk0CisjZGVmaW5lIENQRV9RNF9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwOWMKKyNkZWZpbmUgQ1BFX1E0X0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDBhMAorI2RlZmluZSBDUEVfUTVfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwMGI0CisjZGVmaW5lIENQRV9RNV9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwYmMKKyNkZWZpbmUgQ1BFX1E1X0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDBjMAorI2RlZmluZSBDUEVfUTZfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwMGQ0CisjZGVmaW5lIENQRV9RNl9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwZGMKKyNkZWZpbmUgQ1BFX1E2X0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDBlMAorI2RlZmluZSBDUEVfUTdfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwMGY0CisjZGVmaW5lIENQRV9RN19QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwZmMKKyNkZWZpbmUgQ1BFX1E3X0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDEwMAorI2RlZmluZSBSTUVfUTBfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDExMDE0CisjZGVmaW5lIFJNRV9RMF9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwMWMKKyNkZWZpbmUgUk1FX1EwX0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTAyMAorI2RlZmluZSBSTUVfUTFfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDExMDM0CisjZGVmaW5lIFJNRV9RMV9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwM2MKKyNkZWZpbmUgUk1FX1ExX0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTA0MAorI2RlZmluZSBSTUVfUTJfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDExMDU0CisjZGVmaW5lIFJNRV9RMl9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwNWMKKyNkZWZpbmUgUk1FX1EyX0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTA2MAorI2RlZmluZSBSTUVfUTNfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDExMDc0CisjZGVmaW5lIFJNRV9RM19QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwN2MKKyNkZWZpbmUgUk1FX1EzX0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTA4MAorI2RlZmluZSBSTUVfUTRfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDExMDk0CisjZGVmaW5lIFJNRV9RNF9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwOWMKKyNkZWZpbmUgUk1FX1E0X0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTBhMAorI2RlZmluZSBSTUVfUTVfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDExMGI0CisjZGVmaW5lIFJNRV9RNV9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwYmMKKyNkZWZpbmUgUk1FX1E1X0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTBjMAorI2RlZmluZSBSTUVfUTZfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDExMGQ0CisjZGVmaW5lIFJNRV9RNl9QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwZGMKKyNkZWZpbmUgUk1FX1E2X0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTBlMAorI2RlZmluZSBSTUVfUTdfREVQVEggICAgICAgICAgICAgICAgICAgICAweDAwMDExMGY0CisjZGVmaW5lIFJNRV9RN19QSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwZmMKKyNkZWZpbmUgUk1FX1E3X0NJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTEwMAorI2RlZmluZSBQU1NfQ1RMX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDE4ODAwCisjZGVmaW5lIF9fUFNTX0kyQ19DTEtfRElWX01LICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVZfU0ggICAgICAgICAgICAgMTYKKyNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVYoX3YpICAgICAgICAgICAgKChfdikgPDwgX19QU1NfSTJDX0NMS19ESVZfU0gpCisjZGVmaW5lIF9fUFNTX0xNRU1fSU5JVF9ET05FICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgX19QU1NfTE1FTV9SRVNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBfX1BTU19MTUVNX0lOSVRfRU4gICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIF9fUFNTX0xQVTFfUkVTRVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgX19QU1NfTFBVMF9SRVNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisKKy8qCisgKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZWl0aGVyIGluIGVycm9yL21pc3NpbmcgaW4gc3BlYy4gSXRzIGF1dG8tZ2VuZXJhdGVkCisgKiBmcm9tIGhhcmQgY29kZWQgdmFsdWVzIGluIHJlZ3BhcnNlLnBsLgorICovCisjZGVmaW5lIF9fRU1QSFBPU1RfQVRfNEdfTUtfRklYICAgICAgICAgIDB4MDAwMDAwMWMKKyNkZWZpbmUgX19FTVBIUE9TVF9BVF80R19TSF9GSVggICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBfX0VNUEhQUkVfQVRfNEdfRklYICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIF9fU0ZQX1RYUkFURV9FTl9GSVggICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgX19TRlBfUlhSQVRFX0VOX0ZJWCAgICAgICAgICAgICAgMHgwMDAwMDA4MAorCisKKy8qCisgKiBUaGVzZSByZWdpc3RlciBkZWZpbml0aW9ucyBhcmUgYXV0by1nZW5lcmF0ZWQgZnJvbSBoYXJkIGNvZGVkIHZhbHVlcworICogaW4gcmVncGFyc2UucGwuCisgKi8KKyNkZWZpbmUgSE9TVEZOMF9MUFVfTUJPWDBfMCAgICAgICAgICAgICAgMHgwMDAxOTIwMAorI2RlZmluZSBIT1NURk4xX0xQVV9NQk9YMF84ICAgICAgICAgICAgICAweDAwMDE5MjYwCisjZGVmaW5lIExQVV9IT1NURk4wX01CT1gwXzAgICAgICAgICAgICAgIDB4MDAwMTkyODAKKyNkZWZpbmUgTFBVX0hPU1RGTjFfTUJPWDBfOCAgICAgICAgICAgICAgMHgwMDAxOTJlMAorCisKKy8qCisgKiBUaGVzZSByZWdpc3RlciBtYXBwaW5nIGRlZmluaXRpb25zIGFyZSBhdXRvLWdlbmVyYXRlZCBmcm9tIG1hcHBpbmcgdGFibGVzCisgKiBpbiByZWdwYXJzZS5wbC4KKyAqLworI2RlZmluZSBCRkFfSU9DMF9IQkVBVF9SRUcgICAgICAgICAgICAgICBIT1NUX1NFTTBfSU5GT19SRUcKKyNkZWZpbmUgQkZBX0lPQzBfU1RBVEVfUkVHICAgICAgICAgICAgICAgSE9TVF9TRU0xX0lORk9fUkVHCisjZGVmaW5lIEJGQV9JT0MxX0hCRUFUX1JFRyAgICAgICAgICAgICAgIEhPU1RfU0VNMl9JTkZPX1JFRworI2RlZmluZSBCRkFfSU9DMV9TVEFURV9SRUcgICAgICAgICAgICAgICBIT1NUX1NFTTNfSU5GT19SRUcKKyNkZWZpbmUgQkZBX0ZXX1VTRV9DT1VOVCAgICAgICAgICAgICAgICAgSE9TVF9TRU00X0lORk9fUkVHCisKKyNkZWZpbmUgQ1BFX1FfREVQVEgoX19uKSBcCisJKENQRV9RMF9ERVBUSCArIChfX24pICogKENQRV9RMV9ERVBUSCAtIENQRV9RMF9ERVBUSCkpCisjZGVmaW5lIENQRV9RX1BJKF9fbikgXAorCShDUEVfUTBfUEkgKyAoX19uKSAqIChDUEVfUTFfUEkgLSBDUEVfUTBfUEkpKQorI2RlZmluZSBDUEVfUV9DSShfX24pIFwKKwkoQ1BFX1EwX0NJICsgKF9fbikgKiAoQ1BFX1ExX0NJIC0gQ1BFX1EwX0NJKSkKKyNkZWZpbmUgUk1FX1FfREVQVEgoX19uKSBcCisJKFJNRV9RMF9ERVBUSCArIChfX24pICogKFJNRV9RMV9ERVBUSCAtIFJNRV9RMF9ERVBUSCkpCisjZGVmaW5lIFJNRV9RX1BJKF9fbikgXAorCShSTUVfUTBfUEkgKyAoX19uKSAqIChSTUVfUTFfUEkgLSBSTUVfUTBfUEkpKQorI2RlZmluZSBSTUVfUV9DSShfX24pIFwKKwkoUk1FX1EwX0NJICsgKF9fbikgKiAoUk1FX1ExX0NJIC0gUk1FX1EwX0NJKSkKKworI2RlZmluZSBDUEVfUV9OVU0oX19mbiwgX19xKSAgKCgoX19mbikgPDwgMikgKyAoX19xKSkKKyNkZWZpbmUgUk1FX1FfTlVNKF9fZm4sIF9fcSkgICgoKF9fZm4pIDw8IDIpICsgKF9fcSkpCisjZGVmaW5lIENQRV9RX01BU0soX19xKSAgKChfX3EpICYgMHgzKQorI2RlZmluZSBSTUVfUV9NQVNLKF9fcSkgICgoX19xKSAmIDB4MykKKworCisvKgorICogUENJIE1TSS1YIHZlY3RvciBkZWZpbmVzCisgKi8KK2VudW0geworICAgIEJGQV9NU0lYX0NQRV9RMCA9IDAsCisgICAgQkZBX01TSVhfQ1BFX1ExID0gMSwKKyAgICBCRkFfTVNJWF9DUEVfUTIgPSAyLAorICAgIEJGQV9NU0lYX0NQRV9RMyA9IDMsCisgICAgQkZBX01TSVhfQ1BFX1E0ID0gNCwKKyAgICBCRkFfTVNJWF9DUEVfUTUgPSA1LAorICAgIEJGQV9NU0lYX0NQRV9RNiA9IDYsCisgICAgQkZBX01TSVhfQ1BFX1E3ID0gNywKKyAgICBCRkFfTVNJWF9STUVfUTAgPSA4LAorICAgIEJGQV9NU0lYX1JNRV9RMSA9IDksCisgICAgQkZBX01TSVhfUk1FX1EyID0gMTAsCisgICAgQkZBX01TSVhfUk1FX1EzID0gMTEsCisgICAgQkZBX01TSVhfUk1FX1E0ID0gMTIsCisgICAgQkZBX01TSVhfUk1FX1E1ID0gMTMsCisgICAgQkZBX01TSVhfUk1FX1E2ID0gMTQsCisgICAgQkZBX01TSVhfUk1FX1E3ID0gMTUsCisgICAgQkZBX01TSVhfRVJSX0VNQyA9IDE2LAorICAgIEJGQV9NU0lYX0VSUl9MUFUwID0gMTcsCisgICAgQkZBX01TSVhfRVJSX0xQVTEgPSAxOCwKKyAgICBCRkFfTVNJWF9FUlJfUFNTID0gMTksCisgICAgQkZBX01TSVhfTUJPWF9MUFUwID0gMjAsCisgICAgQkZBX01TSVhfTUJPWF9MUFUxID0gMjEsCisgICAgQkZBX01TSVhfQ0JfTUFYID0gMjIsCit9OworCisvKgorICogQW5kIGNvcnJlc3BvbmRpbmcgaG9zdCBpbnRlcnJ1cHQgc3RhdHVzIGJpdCBmaWVsZCBkZWZpbmVzCisgKi8KKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1ExICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVCisjZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUKKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RMyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1E0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVCisjZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMFUKKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RNiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1E3ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RMSAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwVQorI2RlZmluZSBfX0hGTl9JTlRfUk1FX1EyICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RNCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfUk1FX1E1ICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTYgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RNyAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwVQorI2RlZmluZSBfX0hGTl9JTlRfRVJSX0VNQyAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9FUlJfTFBVMCAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX0VSUl9MUFUxICAgICAgICAgICAgICAgICAweDAwMDQwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfRVJSX1BTUyAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9NQk9YX0xQVTAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX01CT1hfTFBVMSAgICAgICAgICAgICAgICAweDAwMjAwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfTUJPWDFfTFBVMCAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9NQk9YMV9MUFUxICAgICAgICAgICAgICAgMHgwMDgwMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMGZmVQorI2RlZmluZSBfX0hGTl9JTlRfUk1FX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMGZmMDBVCisKKworLyoKKyAqIGNyb3NzYm93IG1lbW9yeSBtYXAuCisgKi8KKyNkZWZpbmUgUFNTX1NNRU1fUEFHRV9TVEFSVAkweDgwMDAKKyNkZWZpbmUgUFNTX1NNRU1fUEdOVU0oX3BnMCwgX21hKQkoKF9wZzApICsgKChfbWEpID4+IDE1KSkKKyNkZWZpbmUgUFNTX1NNRU1fUEdPRkYoX21hKQkoKF9tYSkgJiAweDdmZmYpCisKKy8qCisgKiBFbmQgb2YgY3Jvc3Nib3cgbWVtb3J5IG1hcAorICovCisKKworI2VuZGlmIC8qIF9fQkZJX0NCUkVHX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9jZWUuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2NlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NzA1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9jZWUuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworLyoqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgYmZpX2RjYnguaCBCRkkgSW50ZXJmYWNlIChNYWlsYm94IGNvbW1hbmRzIGFuZCByZWxhdGVkIHN0cnVjdHVyZXMpCisgKiBiZXR3ZWVuIGhvc3QgZHJpdmVyIGFuZCBEQ0JYL0xMRFAgZmlybXdhcmUgbW9kdWxlLgorICoKKyoqLworCisjaWZuZGVmIF9fQkZJX0NFRV9IX18KKyNkZWZpbmUgX19CRklfQ0VFX0hfXworCisjaW5jbHVkZSA8YmZpL2JmaS5oPgorCisjcHJhZ21hIHBhY2soMSkKKworCitlbnVtIGJmaV9jZWVfaDJpX21zZ3NfZSB7CisJQkZJX0NFRV9IMklfR0VUX0NGR19SRVEgPSAxLAorCUJGSV9DRUVfSDJJX1JFU0VUX1NUQVRTID0gMiwKKwlCRklfQ0VFX0gySV9HRVRfU1RBVFNfUkVRID0gMywKK307CisKKworZW51bSBiZmlfY2VlX2kyaF9tc2dzX2UgeworCUJGSV9DRUVfSTJIX0dFVF9DRkdfUlNQID0gQkZBX0kySE0oMSksCisJQkZJX0NFRV9JMkhfUkVTRVRfU1RBVFNfUlNQID0gQkZBX0kySE0oMiksCisJQkZJX0NFRV9JMkhfR0VUX1NUQVRTX1JTUCA9IEJGQV9JMkhNKDMpLAorfTsKKworCisvKiBEYXRhIHN0cnVjdHVyZXMgKi8KKworLyoKKyAqIEJGSV9DRUVfSDJJX1JFU0VUX1NUQVRTCisgKi8KK3N0cnVjdCBiZmlfbGxkcF9yZXNldF9zdGF0c19zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7Cit9OworCisvKgorICogQkZJX0NFRV9IMklfUkVTRVRfU1RBVFMKKyAqLworc3RydWN0IGJmaV9jZWVfcmVzZXRfc3RhdHNfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOworfTsKKworLyoKKyAqIEJGSV9DRUVfSDJJX0dFVF9DRkdfUkVRCisgKi8KK3N0cnVjdCBiZmlfY2VlX2dldF9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOworCXVuaW9uIGJmaV9hZGRyX3UgICBkbWFfYWRkcjsKK307CisKKworLyoKKyAqIEJGSV9DRUVfSTJIX0dFVF9DRkdfUlNQCisgKi8KK3N0cnVjdCBiZmlfY2VlX2dldF9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOworCXU4ICAgICAgICAgICAgY21kX3N0YXR1czsKKwl1OCAgICAgICAgICAgIHJzdmRbM107Cit9OworCisvKgorICogQkZJX0NFRV9IMklfR0VUX1NUQVRTX1JFUQorICovCitzdHJ1Y3QgYmZpX2NlZV9zdGF0c19yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOworCXVuaW9uIGJmaV9hZGRyX3UgICBkbWFfYWRkcjsKK307CisKKworLyoKKyAqIEJGSV9DRUVfSTJIX0dFVF9TVEFUU19SU1AKKyAqLworc3RydWN0IGJmaV9jZWVfc3RhdHNfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsKKwl1OCAJCSAgIGNtZF9zdGF0dXM7CisJdTggCQkgICByc3ZkWzNdOworfTsKKworCisKK3VuaW9uIGJmaV9jZWVfaDJpX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgICAgICAgICAgbWg7CisJc3RydWN0IGJmaV9jZWVfZ2V0X3JlcV9zICAgZ2V0X3JlcTsKKwlzdHJ1Y3QgYmZpX2NlZV9zdGF0c19yZXFfcyBzdGF0c19yZXE7Cit9OworCisKK3VuaW9uIGJmaV9jZWVfaTJoX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgICAgICAgIG1oOworCXN0cnVjdCBiZmlfY2VlX2dldF9yc3BfcyAgZ2V0X3JzcDsKKwlzdHJ1Y3QgYmZpX2NlZV9zdGF0c19yc3BfcyBzdGF0c19yc3A7Cit9OworCisjcHJhZ21hIHBhY2soKQorCisKKyNlbmRpZiAvKiBfX0JGSV9DRUVfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2N0cmVnLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9jdHJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzY2FhNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9jdHJlZy5oCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBiZmlfY3RyZWcuaCBjYXRhcHVsdCBob3N0IGJsb2NrIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogISEhIERvIG5vdCBlZGl0LiBBdXRvIGdlbmVyYXRlZC4gISEhCisgKi8KKworI2lmbmRlZiBfX0JGSV9DVFJFR19IX18KKyNkZWZpbmUgX19CRklfQ1RSRUdfSF9fCisKKworI2RlZmluZSBIT1NURk4wX0xQVV9NQk9YMF8wICAgICAgICAgICAgICAweDAwMDE5MjAwCisjZGVmaW5lIEhPU1RGTjFfTFBVX01CT1gwXzggICAgICAgICAgICAgIDB4MDAwMTkyNjAKKyNkZWZpbmUgTFBVX0hPU1RGTjBfTUJPWDBfMCAgICAgICAgICAgICAgMHgwMDAxOTI4MAorI2RlZmluZSBMUFVfSE9TVEZOMV9NQk9YMF84ICAgICAgICAgICAgICAweDAwMDE5MmUwCisjZGVmaW5lIEhPU1RGTjJfTFBVX01CT1gwXzAgICAgICAgICAgICAgIDB4MDAwMTk0MDAKKyNkZWZpbmUgSE9TVEZOM19MUFVfTUJPWDBfOCAgICAgICAgICAgICAgMHgwMDAxOTQ2MAorI2RlZmluZSBMUFVfSE9TVEZOMl9NQk9YMF8wICAgICAgICAgICAgICAweDAwMDE5NDgwCisjZGVmaW5lIExQVV9IT1NURk4zX01CT1gwXzggICAgICAgICAgICAgIDB4MDAwMTk0ZTAKKyNkZWZpbmUgSE9TVEZOMF9JTlRfU1RBVFVTICAgICAgICAgICAgICAgMHgwMDAxNDAwMAorI2RlZmluZSBfX0hPU1RGTjBfSEFMVF9PQ0NVUlJFRCAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX0xWTF9NSyAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgX19IT1NURk4wX0lOVF9TVEFUVVNfTFZMX1NIICAgICAgMjAKKyNkZWZpbmUgX19IT1NURk4wX0lOVF9TVEFUVVNfTFZMKF92KSAgICAgKChfdikgPDwgX19IT1NURk4wX0lOVF9TVEFUVVNfTFZMX1NIKQorI2RlZmluZSBfX0hPU1RGTjBfSU5UX1NUQVRVU19QX01LICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX1BfU0ggICAgICAgIDE2CisjZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX1AoX3YpICAgICAgICgoX3YpIDw8IF9fSE9TVEZOMF9JTlRfU1RBVFVTX1BfU0gpCisjZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX0YgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSE9TVEZOMF9JTlRfTVNLICAgICAgICAgICAgICAgICAgMHgwMDAxNDAwNAorI2RlZmluZSBIT1NUX1BBR0VfTlVNX0ZOMCAgICAgICAgICAgICAgICAweDAwMDE0MDA4CisjZGVmaW5lIF9fSE9TVF9QQUdFX05VTV9GTiAgICAgICAgICAgICAgIDB4MDAwMDAxZmYKKyNkZWZpbmUgSE9TVF9NU0lYX0VSUl9JTkRFWF9GTjAgICAgICAgICAgMHgwMDAxNDAwYworI2RlZmluZSBfX01TSVhfRVJSX0lOREVYX0ZOICAgICAgICAgICAgICAweDAwMDAwMWZmCisjZGVmaW5lIEhPU1RGTjFfSU5UX1NUQVRVUyAgICAgICAgICAgICAgIDB4MDAwMTQxMDAKKyNkZWZpbmUgX19IT1NURk4xX0hBTFRfT0NDVVJSRUQgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRVU19MVkxfTUsgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIF9fSE9TVEZOMV9JTlRfU1RBVFVTX0xWTF9TSCAgICAgIDIwCisjZGVmaW5lIF9fSE9TVEZOMV9JTlRfU1RBVFVTX0xWTChfdikgICAgICgoX3YpIDw8IF9fSE9TVEZOMV9JTlRfU1RBVFVTX0xWTF9TSCkKKyNkZWZpbmUgX19IT1NURk4xX0lOVF9TVEFUVVNfUF9NSyAgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRVU19QX1NIICAgICAgICAxNgorI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRVU19QKF92KSAgICAgICAoKF92KSA8PCBfX0hPU1RGTjFfSU5UX1NUQVRVU19QX1NIKQorI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRVU19GICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhPU1RGTjFfSU5UX01TSyAgICAgICAgICAgICAgICAgIDB4MDAwMTQxMDQKKyNkZWZpbmUgSE9TVF9QQUdFX05VTV9GTjEgICAgICAgICAgICAgICAgMHgwMDAxNDEwOAorI2RlZmluZSBIT1NUX01TSVhfRVJSX0lOREVYX0ZOMSAgICAgICAgICAweDAwMDE0MTBjCisjZGVmaW5lIEFQUF9QTExfNDI1X0NUTF9SRUcgICAgICAgICAgICAgIDB4MDAwMTQyMDQKKyNkZWZpbmUgX19QXzQyNV9QTExfTE9DSyAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBfX0FQUF9QTExfNDI1X1NSQU1fVVNFXzEwME1IWiAgICAweDAwMTAwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF80MjVfUkVTRVRfVElNRVJfTUsgICAgIDB4MDAwZTAwMDAKKyNkZWZpbmUgX19BUFBfUExMXzQyNV9SRVNFVF9USU1FUl9TSCAgICAgMTcKKyNkZWZpbmUgX19BUFBfUExMXzQyNV9SRVNFVF9USU1FUihfdikgICAgKChfdikgPDwgX19BUFBfUExMXzQyNV9SRVNFVF9USU1FUl9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzQyNV9MT0dJQ19TT0ZUX1JFU0VUICAgMHgwMDAxMDAwMAorI2RlZmluZSBfX0FQUF9QTExfNDI1X0NOVExNVDBfMV9NSyAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIF9fQVBQX1BMTF80MjVfQ05UTE1UMF8xX1NIICAgICAgIDE0CisjZGVmaW5lIF9fQVBQX1BMTF80MjVfQ05UTE1UMF8xKF92KSAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF80MjVfQ05UTE1UMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfNDI1X0pJVExNVDBfMV9NSyAgICAgICAweDAwMDAzMDAwCisjZGVmaW5lIF9fQVBQX1BMTF80MjVfSklUTE1UMF8xX1NIICAgICAgIDEyCisjZGVmaW5lIF9fQVBQX1BMTF80MjVfSklUTE1UMF8xKF92KSAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF80MjVfSklUTE1UMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfNDI1X0hSRUYgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIF9fQVBQX1BMTF80MjVfSERJViAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgX19BUFBfUExMXzQyNV9QMF8xX01LICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBfX0FQUF9QTExfNDI1X1AwXzFfU0ggICAgICAgICAgICA4CisjZGVmaW5lIF9fQVBQX1BMTF80MjVfUDBfMShfdikgICAgICAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF80MjVfUDBfMV9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzQyNV9aMF8yX01LICAgICAgICAgICAgMHgwMDAwMDBlMAorI2RlZmluZSBfX0FQUF9QTExfNDI1X1owXzJfU0ggICAgICAgICAgICA1CisjZGVmaW5lIF9fQVBQX1BMTF80MjVfWjBfMihfdikgICAgICAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF80MjVfWjBfMl9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzQyNV9SU0VMMjAwNTAwICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBfX0FQUF9QTExfNDI1X0VOQVJTVCAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIF9fQVBQX1BMTF80MjVfQllQQVNTICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgX19BUFBfUExMXzQyNV9MUkVTRVROICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBfX0FQUF9QTExfNDI1X0VOQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFQUF9QTExfMzEyX0NUTF9SRUcgICAgICAgICAgICAgIDB4MDAwMTQyMDgKKyNkZWZpbmUgX19QXzMxMl9QTExfTE9DSyAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBfX0VOQUJMRV9NQUNfQUhCXzEgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIF9fRU5BQkxFX01BQ19BSEJfMCAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgX19FTkFCTEVfTUFDXzEgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBfX0VOQUJMRV9NQUNfMCAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfUkVTRVRfVElNRVJfTUsgICAgIDB4MDAwZTAwMDAKKyNkZWZpbmUgX19BUFBfUExMXzMxMl9SRVNFVF9USU1FUl9TSCAgICAgMTcKKyNkZWZpbmUgX19BUFBfUExMXzMxMl9SRVNFVF9USU1FUihfdikgICAgKChfdikgPDwgX19BUFBfUExMXzMxMl9SRVNFVF9USU1FUl9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzMxMl9MT0dJQ19TT0ZUX1JFU0VUICAgMHgwMDAxMDAwMAorI2RlZmluZSBfX0FQUF9QTExfMzEyX0NOVExNVDBfMV9NSyAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfQ05UTE1UMF8xX1NIICAgICAgIDE0CisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfQ05UTE1UMF8xKF92KSAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF8zMTJfQ05UTE1UMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfMzEyX0pJVExNVDBfMV9NSyAgICAgICAweDAwMDAzMDAwCisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfSklUTE1UMF8xX1NIICAgICAgIDEyCisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfSklUTE1UMF8xKF92KSAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF8zMTJfSklUTE1UMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfMzEyX0hSRUYgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfSERJViAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgX19BUFBfUExMXzMxMl9QMF8xX01LICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBfX0FQUF9QTExfMzEyX1AwXzFfU0ggICAgICAgICAgICA4CisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfUDBfMShfdikgICAgICAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF8zMTJfUDBfMV9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzMxMl9aMF8yX01LICAgICAgICAgICAgMHgwMDAwMDBlMAorI2RlZmluZSBfX0FQUF9QTExfMzEyX1owXzJfU0ggICAgICAgICAgICA1CisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfWjBfMihfdikgICAgICAgICAgICgoX3YpIDw8IF9fQVBQX1BMTF8zMTJfWjBfMl9TSCkKKyNkZWZpbmUgX19BUFBfUExMXzMxMl9SU0VMMjAwNTAwICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBfX0FQUF9QTExfMzEyX0VOQVJTVCAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIF9fQVBQX1BMTF8zMTJfQllQQVNTICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgX19BUFBfUExMXzMxMl9MUkVTRVROICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBfX0FQUF9QTExfMzEyX0VOQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE1CSVNUX0NUTF9SRUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQyMjAKKyNkZWZpbmUgX19FRFJBTV9CSVNUUl9TVEFSVCAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBfX01CSVNUX1JFU0VUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIF9fTUJJU1RfU1RBUlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTUJJU1RfU1RBVF9SRUcgICAgICAgICAgICAgICAgICAgMHgwMDAxNDIyNAorI2RlZmluZSBfX0VEUkFNX0JJU1RSX1NUQVRVUyAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIF9fRURSQU1fQklTVFJfRE9ORSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgX19NRU1fQklUX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBfX01CSVNUX0RPTkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhPU1RfU0VNMF9SRUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQyMzAKKyNkZWZpbmUgX19IT1NUX1NFTUFQSE9SRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIT1NUX1NFTTFfUkVHICAgICAgICAgICAgICAgICAgICAweDAwMDE0MjM0CisjZGVmaW5lIEhPU1RfU0VNMl9SRUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQyMzgKKyNkZWZpbmUgSE9TVF9TRU0zX1JFRyAgICAgICAgICAgICAgICAgICAgMHgwMDAxNDIzYworI2RlZmluZSBIT1NUX1NFTTBfSU5GT19SRUcgICAgICAgICAgICAgICAweDAwMDE0MjQwCisjZGVmaW5lIEhPU1RfU0VNMV9JTkZPX1JFRyAgICAgICAgICAgICAgIDB4MDAwMTQyNDQKKyNkZWZpbmUgSE9TVF9TRU0yX0lORk9fUkVHICAgICAgICAgICAgICAgMHgwMDAxNDI0OAorI2RlZmluZSBIT1NUX1NFTTNfSU5GT19SRUcgICAgICAgICAgICAgICAweDAwMDE0MjRjCisjZGVmaW5lIEVUSF9NQUNfU0VSX1JFRyAgICAgICAgICAgICAgICAgIDB4MDAwMTQyODgKKyNkZWZpbmUgX19BUFBfRU1TX0NLQlVGQU1QSU4gICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBfX0FQUF9FTVNfUkVGQ0xLU0VMICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIF9fQVBQX0VNU19DTUxDS1NFTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgX19BUFBfRU1TX1JFRkNLQlVGRU4yICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBfX0FQUF9FTVNfUkVGQ0tCVUZFTjEgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIF9fQVBQX0VNU19DSEFOTkVMX1NFTCAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSE9TVEZOMl9JTlRfU1RBVFVTICAgICAgICAgICAgICAgMHgwMDAxNDMwMAorI2RlZmluZSBfX0hPU1RGTjJfSEFMVF9PQ0NVUlJFRCAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIF9fSE9TVEZOMl9JTlRfU1RBVFVTX0xWTF9NSyAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgX19IT1NURk4yX0lOVF9TVEFUVVNfTFZMX1NIICAgICAgMjAKKyNkZWZpbmUgX19IT1NURk4yX0lOVF9TVEFUVVNfTFZMKF92KSAgICAgKChfdikgPDwgX19IT1NURk4yX0lOVF9TVEFUVVNfTFZMX1NIKQorI2RlZmluZSBfX0hPU1RGTjJfSU5UX1NUQVRVU19QX01LICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIF9fSE9TVEZOMl9JTlRfU1RBVFVTX1BfU0ggICAgICAgIDE2CisjZGVmaW5lIF9fSE9TVEZOMl9JTlRfU1RBVFVTX1AoX3YpICAgICAgICgoX3YpIDw8IF9fSE9TVEZOMl9JTlRfU1RBVFVTX1BfU0gpCisjZGVmaW5lIF9fSE9TVEZOMl9JTlRfU1RBVFVTX0YgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSE9TVEZOMl9JTlRfTVNLICAgICAgICAgICAgICAgICAgMHgwMDAxNDMwNAorI2RlZmluZSBIT1NUX1BBR0VfTlVNX0ZOMiAgICAgICAgICAgICAgICAweDAwMDE0MzA4CisjZGVmaW5lIEhPU1RfTVNJWF9FUlJfSU5ERVhfRk4yICAgICAgICAgIDB4MDAwMTQzMGMKKyNkZWZpbmUgSE9TVEZOM19JTlRfU1RBVFVTICAgICAgICAgICAgICAgMHgwMDAxNDQwMAorI2RlZmluZSBfX0hBTFRfT0NDVVJSRUQgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIF9fSE9TVEZOM19JTlRfU1RBVFVTX0xWTF9NSyAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgX19IT1NURk4zX0lOVF9TVEFUVVNfTFZMX1NIICAgICAgMjAKKyNkZWZpbmUgX19IT1NURk4zX0lOVF9TVEFUVVNfTFZMKF92KSAgICAgKChfdikgPDwgX19IT1NURk4zX0lOVF9TVEFUVVNfTFZMX1NIKQorI2RlZmluZSBfX0hPU1RGTjNfSU5UX1NUQVRVU19QX01LICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIF9fSE9TVEZOM19JTlRfU1RBVFVTX1BfU0ggICAgICAgIDE2CisjZGVmaW5lIF9fSE9TVEZOM19JTlRfU1RBVFVTX1AoX3YpICAgICAgICgoX3YpIDw8IF9fSE9TVEZOM19JTlRfU1RBVFVTX1BfU0gpCisjZGVmaW5lIF9fSE9TVEZOM19JTlRfU1RBVFVTX0YgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSE9TVEZOM19JTlRfTVNLICAgICAgICAgICAgICAgICAgMHgwMDAxNDQwNAorI2RlZmluZSBIT1NUX1BBR0VfTlVNX0ZOMyAgICAgICAgICAgICAgICAweDAwMDE0NDA4CisjZGVmaW5lIEhPU1RfTVNJWF9FUlJfSU5ERVhfRk4zICAgICAgICAgIDB4MDAwMTQ0MGMKKyNkZWZpbmUgRk5DX0lEX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxNDYwMAorI2RlZmluZSBfX0ZVTkNUSU9OX05VTUJFUiAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEZOQ19QRVJTX1JFRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQ2MDQKKyNkZWZpbmUgX19GM19GVU5DVElPTl9BQ1RJVkUgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBfX0YzX0ZVTkNUSU9OX01PREUgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIF9fRjNfUE9SVF9NQVBfTUsgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgX19GM19QT1JUX01BUF9TSCAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgX19GM19QT1JUX01BUChfdikgICAgICAgICAgICAgICAgKChfdikgPDwgX19GM19QT1JUX01BUF9TSCkKKyNkZWZpbmUgX19GM19WTV9NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBfX0YzX0lOVFhfU1RBVFVTX01LICAgICAgICAgICAgICAweDA3MDAwMDAwCisjZGVmaW5lIF9fRjNfSU5UWF9TVEFUVVNfU0ggICAgICAgICAgICAgIDI0CisjZGVmaW5lIF9fRjNfSU5UWF9TVEFUVVMoX3YpICAgICAgICAgICAgICgoX3YpIDw8IF9fRjNfSU5UWF9TVEFUVVNfU0gpCisjZGVmaW5lIF9fRjJfRlVOQ1RJT05fQUNUSVZFICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgX19GMl9GVU5DVElPTl9NT0RFICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBfX0YyX1BPUlRfTUFQX01LICAgICAgICAgICAgICAgICAweDAwMzAwMDAwCisjZGVmaW5lIF9fRjJfUE9SVF9NQVBfU0ggICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIF9fRjJfUE9SVF9NQVAoX3YpICAgICAgICAgICAgICAgICgoX3YpIDw8IF9fRjJfUE9SVF9NQVBfU0gpCisjZGVmaW5lIF9fRjJfVk1fTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgX19GMl9JTlRYX1NUQVRVU19NSyAgICAgICAgICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBfX0YyX0lOVFhfU1RBVFVTX1NIICAgICAgICAgICAgICAxNgorI2RlZmluZSBfX0YyX0lOVFhfU1RBVFVTKF92KSAgICAgICAgICAgICAoKF92KSA8PCBfX0YyX0lOVFhfU1RBVFVTX1NIKQorI2RlZmluZSBfX0YxX0ZVTkNUSU9OX0FDVElWRSAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIF9fRjFfRlVOQ1RJT05fTU9ERSAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgX19GMV9QT1JUX01BUF9NSyAgICAgICAgICAgICAgICAgMHgwMDAwMzAwMAorI2RlZmluZSBfX0YxX1BPUlRfTUFQX1NIICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBfX0YxX1BPUlRfTUFQKF92KSAgICAgICAgICAgICAgICAoKF92KSA8PCBfX0YxX1BPUlRfTUFQX1NIKQorI2RlZmluZSBfX0YxX1ZNX01PREUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIF9fRjFfSU5UWF9TVEFUVVNfTUsgICAgICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgX19GMV9JTlRYX1NUQVRVU19TSCAgICAgICAgICAgICAgOAorI2RlZmluZSBfX0YxX0lOVFhfU1RBVFVTKF92KSAgICAgICAgICAgICAoKF92KSA8PCBfX0YxX0lOVFhfU1RBVFVTX1NIKQorI2RlZmluZSBfX0YwX0ZVTkNUSU9OX0FDVElWRSAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIF9fRjBfRlVOQ1RJT05fTU9ERSAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgX19GMF9QT1JUX01BUF9NSyAgICAgICAgICAgICAgICAgMHgwMDAwMDAzMAorI2RlZmluZSBfX0YwX1BPUlRfTUFQX1NIICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIF9fRjBfUE9SVF9NQVAoX3YpICAgICAgICAgICAgICAgICgoX3YpIDw8IF9fRjBfUE9SVF9NQVBfU0gpCisjZGVmaW5lIF9fRjBfVk1fTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgX19GMF9JTlRYX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworZW51bSB7CisgICAgX19GMF9JTlRYX1NUQVRVU19NU0lYICAgICAgICAgICAgPSAweDAsCisgICAgX19GMF9JTlRYX1NUQVRVU19JTlRBICAgICAgICAgICAgPSAweDEsCisgICAgX19GMF9JTlRYX1NUQVRVU19JTlRCICAgICAgICAgICAgPSAweDIsCisgICAgX19GMF9JTlRYX1NUQVRVU19JTlRDICAgICAgICAgICAgPSAweDMsCisgICAgX19GMF9JTlRYX1NUQVRVU19JTlREICAgICAgICAgICAgPSAweDQsCit9OworI2RlZmluZSBPUF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDE0NjBjCisjZGVmaW5lIF9fQVBQX0VUSF9DTEtfTE9XU1BFRUQgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgX19HTE9CQUxfQ09SRUNMS19IQUxGU1BFRUQgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBfX0dMT0JBTF9GQ09FX01PREUgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhPU1RfU0VNNF9SRUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQ2MTAKKyNkZWZpbmUgSE9TVF9TRU01X1JFRyAgICAgICAgICAgICAgICAgICAgMHgwMDAxNDYxNAorI2RlZmluZSBIT1NUX1NFTTZfUkVHICAgICAgICAgICAgICAgICAgICAweDAwMDE0NjE4CisjZGVmaW5lIEhPU1RfU0VNN19SRUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQ2MWMKKyNkZWZpbmUgSE9TVF9TRU00X0lORk9fUkVHICAgICAgICAgICAgICAgMHgwMDAxNDYyMAorI2RlZmluZSBIT1NUX1NFTTVfSU5GT19SRUcgICAgICAgICAgICAgICAweDAwMDE0NjI0CisjZGVmaW5lIEhPU1RfU0VNNl9JTkZPX1JFRyAgICAgICAgICAgICAgIDB4MDAwMTQ2MjgKKyNkZWZpbmUgSE9TVF9TRU03X0lORk9fUkVHICAgICAgICAgICAgICAgMHgwMDAxNDYyYworI2RlZmluZSBIT1NURk4wX0xQVTBfTUJPWDBfQ01EX1NUQVQgICAgICAweDAwMDE5MDAwCisjZGVmaW5lIF9fSE9TVEZOMF9MUFUwX01CT1gwX0lORk9fTUsgICAgIDB4ZmZmZmZmZmUKKyNkZWZpbmUgX19IT1NURk4wX0xQVTBfTUJPWDBfSU5GT19TSCAgICAgMQorI2RlZmluZSBfX0hPU1RGTjBfTFBVMF9NQk9YMF9JTkZPKF92KSAgICAoKF92KSA8PCBfX0hPU1RGTjBfTFBVMF9NQk9YMF9JTkZPX1NIKQorI2RlZmluZSBfX0hPU1RGTjBfTFBVMF9NQk9YMF9DTURfU1RBVFVTICAweDAwMDAwMDAxCisjZGVmaW5lIEhPU1RGTjBfTFBVMV9NQk9YMF9DTURfU1RBVCAgICAgIDB4MDAwMTkwMDQKKyNkZWZpbmUgX19IT1NURk4wX0xQVTFfTUJPWDBfSU5GT19NSyAgICAgMHhmZmZmZmZmZQorI2RlZmluZSBfX0hPU1RGTjBfTFBVMV9NQk9YMF9JTkZPX1NIICAgICAxCisjZGVmaW5lIF9fSE9TVEZOMF9MUFUxX01CT1gwX0lORk8oX3YpICAgICgoX3YpIDw8IF9fSE9TVEZOMF9MUFUxX01CT1gwX0lORk9fU0gpCisjZGVmaW5lIF9fSE9TVEZOMF9MUFUxX01CT1gwX0NNRF9TVEFUVVMgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTFBVMF9IT1NURk4wX01CT1gwX0NNRF9TVEFUICAgICAgMHgwMDAxOTAwOAorI2RlZmluZSBfX0xQVTBfSE9TVEZOMF9NQk9YMF9JTkZPX01LICAgICAweGZmZmZmZmZlCisjZGVmaW5lIF9fTFBVMF9IT1NURk4wX01CT1gwX0lORk9fU0ggICAgIDEKKyNkZWZpbmUgX19MUFUwX0hPU1RGTjBfTUJPWDBfSU5GTyhfdikgICAgKChfdikgPDwgX19MUFUwX0hPU1RGTjBfTUJPWDBfSU5GT19TSCkKKyNkZWZpbmUgX19MUFUwX0hPU1RGTjBfTUJPWDBfQ01EX1NUQVRVUyAgMHgwMDAwMDAwMQorI2RlZmluZSBMUFUxX0hPU1RGTjBfTUJPWDBfQ01EX1NUQVQgICAgICAweDAwMDE5MDBjCisjZGVmaW5lIF9fTFBVMV9IT1NURk4wX01CT1gwX0lORk9fTUsgICAgIDB4ZmZmZmZmZmUKKyNkZWZpbmUgX19MUFUxX0hPU1RGTjBfTUJPWDBfSU5GT19TSCAgICAgMQorI2RlZmluZSBfX0xQVTFfSE9TVEZOMF9NQk9YMF9JTkZPKF92KSAgICAoKF92KSA8PCBfX0xQVTFfSE9TVEZOMF9NQk9YMF9JTkZPX1NIKQorI2RlZmluZSBfX0xQVTFfSE9TVEZOMF9NQk9YMF9DTURfU1RBVFVTICAweDAwMDAwMDAxCisjZGVmaW5lIEhPU1RGTjFfTFBVMF9NQk9YMF9DTURfU1RBVCAgICAgIDB4MDAwMTkwMTAKKyNkZWZpbmUgX19IT1NURk4xX0xQVTBfTUJPWDBfSU5GT19NSyAgICAgMHhmZmZmZmZmZQorI2RlZmluZSBfX0hPU1RGTjFfTFBVMF9NQk9YMF9JTkZPX1NIICAgICAxCisjZGVmaW5lIF9fSE9TVEZOMV9MUFUwX01CT1gwX0lORk8oX3YpICAgICgoX3YpIDw8IF9fSE9TVEZOMV9MUFUwX01CT1gwX0lORk9fU0gpCisjZGVmaW5lIF9fSE9TVEZOMV9MUFUwX01CT1gwX0NNRF9TVEFUVVMgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSE9TVEZOMV9MUFUxX01CT1gwX0NNRF9TVEFUICAgICAgMHgwMDAxOTAxNAorI2RlZmluZSBfX0hPU1RGTjFfTFBVMV9NQk9YMF9JTkZPX01LICAgICAweGZmZmZmZmZlCisjZGVmaW5lIF9fSE9TVEZOMV9MUFUxX01CT1gwX0lORk9fU0ggICAgIDEKKyNkZWZpbmUgX19IT1NURk4xX0xQVTFfTUJPWDBfSU5GTyhfdikgICAgKChfdikgPDwgX19IT1NURk4xX0xQVTFfTUJPWDBfSU5GT19TSCkKKyNkZWZpbmUgX19IT1NURk4xX0xQVTFfTUJPWDBfQ01EX1NUQVRVUyAgMHgwMDAwMDAwMQorI2RlZmluZSBMUFUwX0hPU1RGTjFfTUJPWDBfQ01EX1NUQVQgICAgICAweDAwMDE5MDE4CisjZGVmaW5lIF9fTFBVMF9IT1NURk4xX01CT1gwX0lORk9fTUsgICAgIDB4ZmZmZmZmZmUKKyNkZWZpbmUgX19MUFUwX0hPU1RGTjFfTUJPWDBfSU5GT19TSCAgICAgMQorI2RlZmluZSBfX0xQVTBfSE9TVEZOMV9NQk9YMF9JTkZPKF92KSAgICAoKF92KSA8PCBfX0xQVTBfSE9TVEZOMV9NQk9YMF9JTkZPX1NIKQorI2RlZmluZSBfX0xQVTBfSE9TVEZOMV9NQk9YMF9DTURfU1RBVFVTICAweDAwMDAwMDAxCisjZGVmaW5lIExQVTFfSE9TVEZOMV9NQk9YMF9DTURfU1RBVCAgICAgIDB4MDAwMTkwMWMKKyNkZWZpbmUgX19MUFUxX0hPU1RGTjFfTUJPWDBfSU5GT19NSyAgICAgMHhmZmZmZmZmZQorI2RlZmluZSBfX0xQVTFfSE9TVEZOMV9NQk9YMF9JTkZPX1NIICAgICAxCisjZGVmaW5lIF9fTFBVMV9IT1NURk4xX01CT1gwX0lORk8oX3YpICAgICgoX3YpIDw8IF9fTFBVMV9IT1NURk4xX01CT1gwX0lORk9fU0gpCisjZGVmaW5lIF9fTFBVMV9IT1NURk4xX01CT1gwX0NNRF9TVEFUVVMgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSE9TVEZOMl9MUFUwX01CT1gwX0NNRF9TVEFUICAgICAgMHgwMDAxOTE1MAorI2RlZmluZSBfX0hPU1RGTjJfTFBVMF9NQk9YMF9JTkZPX01LICAgICAweGZmZmZmZmZlCisjZGVmaW5lIF9fSE9TVEZOMl9MUFUwX01CT1gwX0lORk9fU0ggICAgIDEKKyNkZWZpbmUgX19IT1NURk4yX0xQVTBfTUJPWDBfSU5GTyhfdikgICAgKChfdikgPDwgX19IT1NURk4yX0xQVTBfTUJPWDBfSU5GT19TSCkKKyNkZWZpbmUgX19IT1NURk4yX0xQVTBfTUJPWDBfQ01EX1NUQVRVUyAgMHgwMDAwMDAwMQorI2RlZmluZSBIT1NURk4yX0xQVTFfTUJPWDBfQ01EX1NUQVQgICAgICAweDAwMDE5MTU0CisjZGVmaW5lIF9fSE9TVEZOMl9MUFUxX01CT1gwX0lORk9fTUsgICAgIDB4ZmZmZmZmZmUKKyNkZWZpbmUgX19IT1NURk4yX0xQVTFfTUJPWDBfSU5GT19TSCAgICAgMQorI2RlZmluZSBfX0hPU1RGTjJfTFBVMV9NQk9YMF9JTkZPKF92KSAgICAoKF92KSA8PCBfX0hPU1RGTjJfTFBVMV9NQk9YMF9JTkZPX1NIKQorI2RlZmluZSBfX0hPU1RGTjJfTFBVMV9NQk9YMEJPWDBfQ01EX1NUQVRVUyAweDAwMDAwMDAxCisjZGVmaW5lIExQVTBfSE9TVEZOMl9NQk9YMF9DTURfU1RBVCAgICAgIDB4MDAwMTkxNTgKKyNkZWZpbmUgX19MUFUwX0hPU1RGTjJfTUJPWDBfSU5GT19NSyAgICAgMHhmZmZmZmZmZQorI2RlZmluZSBfX0xQVTBfSE9TVEZOMl9NQk9YMF9JTkZPX1NIICAgICAxCisjZGVmaW5lIF9fTFBVMF9IT1NURk4yX01CT1gwX0lORk8oX3YpICAgICgoX3YpIDw8IF9fTFBVMF9IT1NURk4yX01CT1gwX0lORk9fU0gpCisjZGVmaW5lIF9fTFBVMF9IT1NURk4yX01CT1gwX0NNRF9TVEFUVVMgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTFBVMV9IT1NURk4yX01CT1gwX0NNRF9TVEFUICAgICAgMHgwMDAxOTE1YworI2RlZmluZSBfX0xQVTFfSE9TVEZOMl9NQk9YMF9JTkZPX01LICAgICAweGZmZmZmZmZlCisjZGVmaW5lIF9fTFBVMV9IT1NURk4yX01CT1gwX0lORk9fU0ggICAgIDEKKyNkZWZpbmUgX19MUFUxX0hPU1RGTjJfTUJPWDBfSU5GTyhfdikgICAgKChfdikgPDwgX19MUFUxX0hPU1RGTjJfTUJPWDBfSU5GT19TSCkKKyNkZWZpbmUgX19MUFUxX0hPU1RGTjJfTUJPWDBfQ01EX1NUQVRVUyAgMHgwMDAwMDAwMQorI2RlZmluZSBIT1NURk4zX0xQVTBfTUJPWDBfQ01EX1NUQVQgICAgICAweDAwMDE5MTYwCisjZGVmaW5lIF9fSE9TVEZOM19MUFUwX01CT1gwX0lORk9fTUsgICAgIDB4ZmZmZmZmZmUKKyNkZWZpbmUgX19IT1NURk4zX0xQVTBfTUJPWDBfSU5GT19TSCAgICAgMQorI2RlZmluZSBfX0hPU1RGTjNfTFBVMF9NQk9YMF9JTkZPKF92KSAgICAoKF92KSA8PCBfX0hPU1RGTjNfTFBVMF9NQk9YMF9JTkZPX1NIKQorI2RlZmluZSBfX0hPU1RGTjNfTFBVMF9NQk9YMF9DTURfU1RBVFVTICAweDAwMDAwMDAxCisjZGVmaW5lIEhPU1RGTjNfTFBVMV9NQk9YMF9DTURfU1RBVCAgICAgIDB4MDAwMTkxNjQKKyNkZWZpbmUgX19IT1NURk4zX0xQVTFfTUJPWDBfSU5GT19NSyAgICAgMHhmZmZmZmZmZQorI2RlZmluZSBfX0hPU1RGTjNfTFBVMV9NQk9YMF9JTkZPX1NIICAgICAxCisjZGVmaW5lIF9fSE9TVEZOM19MUFUxX01CT1gwX0lORk8oX3YpICAgICgoX3YpIDw8IF9fSE9TVEZOM19MUFUxX01CT1gwX0lORk9fU0gpCisjZGVmaW5lIF9fSE9TVEZOM19MUFUxX01CT1gwX0NNRF9TVEFUVVMgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTFBVMF9IT1NURk4zX01CT1gwX0NNRF9TVEFUICAgICAgMHgwMDAxOTE2OAorI2RlZmluZSBfX0xQVTBfSE9TVEZOM19NQk9YMF9JTkZPX01LICAgICAweGZmZmZmZmZlCisjZGVmaW5lIF9fTFBVMF9IT1NURk4zX01CT1gwX0lORk9fU0ggICAgIDEKKyNkZWZpbmUgX19MUFUwX0hPU1RGTjNfTUJPWDBfSU5GTyhfdikgICAgKChfdikgPDwgX19MUFUwX0hPU1RGTjNfTUJPWDBfSU5GT19TSCkKKyNkZWZpbmUgX19MUFUwX0hPU1RGTjNfTUJPWDBfQ01EX1NUQVRVUyAgMHgwMDAwMDAwMQorI2RlZmluZSBMUFUxX0hPU1RGTjNfTUJPWDBfQ01EX1NUQVQgICAgICAweDAwMDE5MTZjCisjZGVmaW5lIF9fTFBVMV9IT1NURk4zX01CT1gwX0lORk9fTUsgICAgIDB4ZmZmZmZmZmUKKyNkZWZpbmUgX19MUFUxX0hPU1RGTjNfTUJPWDBfSU5GT19TSCAgICAgMQorI2RlZmluZSBfX0xQVTFfSE9TVEZOM19NQk9YMF9JTkZPKF92KSAgICAoKF92KSA8PCBfX0xQVTFfSE9TVEZOM19NQk9YMF9JTkZPX1NIKQorI2RlZmluZSBfX0xQVTFfSE9TVEZOM19NQk9YMF9DTURfU1RBVFVTICAweDAwMDAwMDAxCisjZGVmaW5lIEZXX0lOSVRfSEFMVF9QMCAgICAgICAgICAgICAgICAgIDB4MDAwMTkxYWMKKyNkZWZpbmUgX19GV19JTklUX0hBTFRfUCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBGV19JTklUX0hBTFRfUDEgICAgICAgICAgICAgICAgICAweDAwMDE5MWJjCisjZGVmaW5lIENQRV9QSV9QVFJfUTAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzgwMDAKKyNkZWZpbmUgX19DUEVfUElfVU5VU0VEX01LICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBfX0NQRV9QSV9VTlVTRURfU0ggICAgICAgICAgICAgICAxNgorI2RlZmluZSBfX0NQRV9QSV9VTlVTRUQoX3YpICAgICAgICAgICAgICAoKF92KSA8PCBfX0NQRV9QSV9VTlVTRURfU0gpCisjZGVmaW5lIF9fQ1BFX1BJX1BUUiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgQ1BFX1BJX1BUUl9RMSAgICAgICAgICAgICAgICAgICAgMHgwMDAzODA0MAorI2RlZmluZSBDUEVfQ0lfUFRSX1EwICAgICAgICAgICAgICAgICAgICAweDAwMDM4MDA0CisjZGVmaW5lIF9fQ1BFX0NJX1VOVVNFRF9NSyAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgX19DUEVfQ0lfVU5VU0VEX1NIICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgX19DUEVfQ0lfVU5VU0VEKF92KSAgICAgICAgICAgICAgKChfdikgPDwgX19DUEVfQ0lfVU5VU0VEX1NIKQorI2RlZmluZSBfX0NQRV9DSV9QVFIgICAgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIENQRV9DSV9QVFJfUTEgICAgICAgICAgICAgICAgICAgIDB4MDAwMzgwNDQKKyNkZWZpbmUgQ1BFX0RFUFRIX1EwICAgICAgICAgICAgICAgICAgICAgMHgwMDAzODAwOAorI2RlZmluZSBfX0NQRV9ERVBUSF9VTlVTRURfTUsgICAgICAgICAgICAweGY4MDAwMDAwCisjZGVmaW5lIF9fQ1BFX0RFUFRIX1VOVVNFRF9TSCAgICAgICAgICAgIDI3CisjZGVmaW5lIF9fQ1BFX0RFUFRIX1VOVVNFRChfdikgICAgICAgICAgICgoX3YpIDw8IF9fQ1BFX0RFUFRIX1VOVVNFRF9TSCkKKyNkZWZpbmUgX19DUEVfTVNJWF9WRUNfSU5ERVhfTUsgICAgICAgICAgMHgwN2ZmMDAwMAorI2RlZmluZSBfX0NQRV9NU0lYX1ZFQ19JTkRFWF9TSCAgICAgICAgICAxNgorI2RlZmluZSBfX0NQRV9NU0lYX1ZFQ19JTkRFWChfdikgICAgICAgICAoKF92KSA8PCBfX0NQRV9NU0lYX1ZFQ19JTkRFWF9TSCkKKyNkZWZpbmUgX19DUEVfREVQVEggICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBDUEVfREVQVEhfUTEgICAgICAgICAgICAgICAgICAgICAweDAwMDM4MDQ4CisjZGVmaW5lIENQRV9RQ1RSTF9RMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzgwMGMKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQzMF9NSyAgICAgICAgICAgMHhmYzAwMDAwMAorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDMwX1NIICAgICAgICAgICAyNgorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDMwKF92KSAgICAgICAgICAoKF92KSA8PCBfX0NQRV9DVFJMX1VOVVNFRDMwX1NIKQorI2RlZmluZSBfX0NQRV9GVU5DX0lOVF9DVFJMX01LICAgICAgICAgICAweDAzMDAwMDAwCisjZGVmaW5lIF9fQ1BFX0ZVTkNfSU5UX0NUUkxfU0ggICAgICAgICAgIDI0CisjZGVmaW5lIF9fQ1BFX0ZVTkNfSU5UX0NUUkwoX3YpICAgICAgICAgICgoX3YpIDw8IF9fQ1BFX0ZVTkNfSU5UX0NUUkxfU0gpCitlbnVtIHsKKyAgICBfX0NQRV9GVU5DX0lOVF9DVFJMX0RJU0FCTEUgICAgICA9IDB4MCwKKyAgICBfX0NQRV9GVU5DX0lOVF9DVFJMX0YyTkYgICAgICAgICA9IDB4MSwKKyAgICBfX0NQRV9GVU5DX0lOVF9DVFJMXzNRVUFSVCAgICAgICA9IDB4MiwKKyAgICBfX0NQRV9GVU5DX0lOVF9DVFJMX0hBTEYgICAgICAgICA9IDB4MywKK307CisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMjBfTUsgICAgICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQyMF9TSCAgICAgICAgICAgMjAKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQyMChfdikgICAgICAgICAgKChfdikgPDwgX19DUEVfQ1RSTF9VTlVTRUQyMF9TSCkKKyNkZWZpbmUgX19DUEVfU0NJX1RIX01LICAgICAgICAgICAgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBfX0NQRV9TQ0lfVEhfU0ggICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBfX0NQRV9TQ0lfVEgoX3YpICAgICAgICAgICAgICAgICAoKF92KSA8PCBfX0NQRV9TQ0lfVEhfU0gpCisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMTBfTUsgICAgICAgICAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQxMF9TSCAgICAgICAgICAgMTQKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQxMChfdikgICAgICAgICAgKChfdikgPDwgX19DUEVfQ1RSTF9VTlVTRUQxMF9TSCkKKyNkZWZpbmUgX19DUEVfQUNLX1BFTkRJTkcgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDQwX01LICAgICAgICAgICAweDAwMDAxYzAwCisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VENDBfU0ggICAgICAgICAgIDEwCisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VENDAoX3YpICAgICAgICAgICgoX3YpIDw8IF9fQ1BFX0NUUkxfVU5VU0VENDBfU0gpCisjZGVmaW5lIF9fQ1BFX1BDSUVJRF9NSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgX19DUEVfUENJRUlEX1NIICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBfX0NQRV9QQ0lFSUQoX3YpICAgICAgICAgICAgICAgICAoKF92KSA8PCBfX0NQRV9QQ0lFSURfU0gpCisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMDBfTUsgICAgICAgICAgIDB4MDAwMDAwZmUKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQwMF9TSCAgICAgICAgICAgMQorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDAwKF92KSAgICAgICAgICAoKF92KSA8PCBfX0NQRV9DVFJMX1VOVVNFRDAwX1NIKQorI2RlZmluZSBfX0NQRV9FU0laRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIENQRV9RQ1RSTF9RMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzgwNGMKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQzMV9NSyAgICAgICAgICAgMHhmYzAwMDAwMAorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDMxX1NIICAgICAgICAgICAyNgorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDMxKF92KSAgICAgICAgICAoKF92KSA8PCBfX0NQRV9DVFJMX1VOVVNFRDMxX1NIKQorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDIxX01LICAgICAgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMjFfU0ggICAgICAgICAgIDIwCisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMjEoX3YpICAgICAgICAgICgoX3YpIDw8IF9fQ1BFX0NUUkxfVU5VU0VEMjFfU0gpCisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMTFfTUsgICAgICAgICAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQxMV9TSCAgICAgICAgICAgMTQKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQxMShfdikgICAgICAgICAgKChfdikgPDwgX19DUEVfQ1RSTF9VTlVTRUQxMV9TSCkKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQ0MV9NSyAgICAgICAgICAgMHgwMDAwMWMwMAorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDQxX1NIICAgICAgICAgICAxMAorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDQxKF92KSAgICAgICAgICAoKF92KSA8PCBfX0NQRV9DVFJMX1VOVVNFRDQxX1NIKQorI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDAxX01LICAgICAgICAgICAweDAwMDAwMGZlCisjZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMDFfU0ggICAgICAgICAgIDEKKyNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQwMShfdikgICAgICAgICAgKChfdikgPDwgX19DUEVfQ1RSTF9VTlVTRUQwMV9TSCkKKyNkZWZpbmUgUk1FX1BJX1BUUl9RMCAgICAgICAgICAgICAgICAgICAgMHgwMDAzODAyMAorI2RlZmluZSBfX0xBVEVOQ1lfVElNRV9TVEFNUF9NSyAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIF9fTEFURU5DWV9USU1FX1NUQU1QX1NIICAgICAgICAgIDE2CisjZGVmaW5lIF9fTEFURU5DWV9USU1FX1NUQU1QKF92KSAgICAgICAgICgoX3YpIDw8IF9fTEFURU5DWV9USU1FX1NUQU1QX1NIKQorI2RlZmluZSBfX1JNRV9QSV9QVFIgICAgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIFJNRV9QSV9QVFJfUTEgICAgICAgICAgICAgICAgICAgIDB4MDAwMzgwNjAKKyNkZWZpbmUgUk1FX0NJX1BUUl9RMCAgICAgICAgICAgICAgICAgICAgMHgwMDAzODAyNAorI2RlZmluZSBfX0RFTEFZX1RJTUVfU1RBTVBfTUsgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIF9fREVMQVlfVElNRV9TVEFNUF9TSCAgICAgICAgICAgIDE2CisjZGVmaW5lIF9fREVMQVlfVElNRV9TVEFNUChfdikgICAgICAgICAgICgoX3YpIDw8IF9fREVMQVlfVElNRV9TVEFNUF9TSCkKKyNkZWZpbmUgX19STUVfQ0lfUFRSICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBSTUVfQ0lfUFRSX1ExICAgICAgICAgICAgICAgICAgICAweDAwMDM4MDY0CisjZGVmaW5lIFJNRV9ERVBUSF9RMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzgwMjgKKyNkZWZpbmUgX19STUVfREVQVEhfVU5VU0VEX01LICAgICAgICAgICAgMHhmODAwMDAwMAorI2RlZmluZSBfX1JNRV9ERVBUSF9VTlVTRURfU0ggICAgICAgICAgICAyNworI2RlZmluZSBfX1JNRV9ERVBUSF9VTlVTRUQoX3YpICAgICAgICAgICAoKF92KSA8PCBfX1JNRV9ERVBUSF9VTlVTRURfU0gpCisjZGVmaW5lIF9fUk1FX01TSVhfVkVDX0lOREVYX01LICAgICAgICAgIDB4MDdmZjAwMDAKKyNkZWZpbmUgX19STUVfTVNJWF9WRUNfSU5ERVhfU0ggICAgICAgICAgMTYKKyNkZWZpbmUgX19STUVfTVNJWF9WRUNfSU5ERVgoX3YpICAgICAgICAgKChfdikgPDwgX19STUVfTVNJWF9WRUNfSU5ERVhfU0gpCisjZGVmaW5lIF9fUk1FX0RFUFRIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgUk1FX0RFUFRIX1ExICAgICAgICAgICAgICAgICAgICAgMHgwMDAzODA2OAorI2RlZmluZSBSTUVfUUNUUkxfUTAgICAgICAgICAgICAgICAgICAgICAweDAwMDM4MDJjCisjZGVmaW5lIF9fUk1FX0lOVF9MQVRFTkNZX1RJTUVSX01LICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgX19STUVfSU5UX0xBVEVOQ1lfVElNRVJfU0ggICAgICAgMjQKKyNkZWZpbmUgX19STUVfSU5UX0xBVEVOQ1lfVElNRVIoX3YpICAgICAgKChfdikgPDwgX19STUVfSU5UX0xBVEVOQ1lfVElNRVJfU0gpCisjZGVmaW5lIF9fUk1FX0lOVF9ERUxBWV9USU1FUl9NSyAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgX19STUVfSU5UX0RFTEFZX1RJTUVSX1NIICAgICAgICAgMTYKKyNkZWZpbmUgX19STUVfSU5UX0RFTEFZX1RJTUVSKF92KSAgICAgICAgKChfdikgPDwgX19STUVfSU5UX0RFTEFZX1RJTUVSX1NIKQorI2RlZmluZSBfX1JNRV9JTlRfREVMQVlfRElTQUJMRSAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIF9fUk1FX0RMWV9ERUxBWV9ESVNBQkxFICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgX19STUVfQUNLX1BFTkRJTkcgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBfX1JNRV9GVUxMX0lOVEVSUlVQVF9ESVNBQkxFICAgICAweDAwMDAxMDAwCisjZGVmaW5lIF9fUk1FX0NUUkxfVU5VU0VEMTBfTUsgICAgICAgICAgIDB4MDAwMDBjMDAKKyNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQxMF9TSCAgICAgICAgICAgMTAKKyNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQxMChfdikgICAgICAgICAgKChfdikgPDwgX19STUVfQ1RSTF9VTlVTRUQxMF9TSCkKKyNkZWZpbmUgX19STUVfUENJRUlEX01LICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBfX1JNRV9QQ0lFSURfU0ggICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIF9fUk1FX1BDSUVJRChfdikgICAgICAgICAgICAgICAgICgoX3YpIDw8IF9fUk1FX1BDSUVJRF9TSCkKKyNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQwMF9NSyAgICAgICAgICAgMHgwMDAwMDBmZQorI2RlZmluZSBfX1JNRV9DVFJMX1VOVVNFRDAwX1NIICAgICAgICAgICAxCisjZGVmaW5lIF9fUk1FX0NUUkxfVU5VU0VEMDAoX3YpICAgICAgICAgICgoX3YpIDw8IF9fUk1FX0NUUkxfVU5VU0VEMDBfU0gpCisjZGVmaW5lIF9fUk1FX0VTSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUk1FX1FDVFJMX1ExICAgICAgICAgICAgICAgICAgICAgMHgwMDAzODA2YworI2RlZmluZSBfX1JNRV9DVFJMX1VOVVNFRDExX01LICAgICAgICAgICAweDAwMDAwYzAwCisjZGVmaW5lIF9fUk1FX0NUUkxfVU5VU0VEMTFfU0ggICAgICAgICAgIDEwCisjZGVmaW5lIF9fUk1FX0NUUkxfVU5VU0VEMTEoX3YpICAgICAgICAgICgoX3YpIDw8IF9fUk1FX0NUUkxfVU5VU0VEMTFfU0gpCisjZGVmaW5lIF9fUk1FX0NUUkxfVU5VU0VEMDFfTUsgICAgICAgICAgIDB4MDAwMDAwZmUKKyNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQwMV9TSCAgICAgICAgICAgMQorI2RlZmluZSBfX1JNRV9DVFJMX1VOVVNFRDAxKF92KSAgICAgICAgICAoKF92KSA8PCBfX1JNRV9DVFJMX1VOVVNFRDAxX1NIKQorI2RlZmluZSBQU1NfQ1RMX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDE4ODAwCisjZGVmaW5lIF9fUFNTX0kyQ19DTEtfRElWX01LICAgICAgICAgICAgIDB4MDA3ZjAwMDAKKyNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVZfU0ggICAgICAgICAgICAgMTYKKyNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVYoX3YpICAgICAgICAgICAgKChfdikgPDwgX19QU1NfSTJDX0NMS19ESVZfU0gpCisjZGVmaW5lIF9fUFNTX0xNRU1fSU5JVF9ET05FICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgX19QU1NfTE1FTV9SRVNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBfX1BTU19MTUVNX0lOSVRfRU4gICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIF9fUFNTX0xQVTFfUkVTRVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgX19QU1NfTFBVMF9SRVNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIUU1fUVNFVDBfUlhRX0RSQkxfUDAgICAgICAgICAgICAweDAwMDM4MDAwCisjZGVmaW5lIF9fUlhRMF9BRERfVkVDVE9SU19QICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgX19SWFEwX1NUT1BfUCAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBfX1JYUTBfUFJEX1BUUl9QICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhRTV9RU0VUMV9SWFFfRFJCTF9QMCAgICAgICAgICAgIDB4MDAwMzgwODAKKyNkZWZpbmUgX19SWFExX0FERF9WRUNUT1JTX1AgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBfX1JYUTFfU1RPUF9QICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIF9fUlhRMV9QUkRfUFRSX1AgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFFNX1FTRVQwX1JYUV9EUkJMX1AxICAgICAgICAgICAgMHgwMDAzYzAwMAorI2RlZmluZSBIUU1fUVNFVDFfUlhRX0RSQkxfUDEgICAgICAgICAgICAweDAwMDNjMDgwCisjZGVmaW5lIEhRTV9RU0VUMF9UWFFfRFJCTF9QMCAgICAgICAgICAgIDB4MDAwMzgwMjAKKyNkZWZpbmUgX19UWFEwX0FERF9WRUNUT1JTX1AgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBfX1RYUTBfU1RPUF9QICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIF9fVFhRMF9QUkRfUFRSX1AgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFFNX1FTRVQxX1RYUV9EUkJMX1AwICAgICAgICAgICAgMHgwMDAzODBhMAorI2RlZmluZSBfX1RYUTFfQUREX1ZFQ1RPUlNfUCAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIF9fVFhRMV9TVE9QX1AgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgX19UWFExX1BSRF9QVFJfUCAgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBIUU1fUVNFVDBfVFhRX0RSQkxfUDEgICAgICAgICAgICAweDAwMDNjMDIwCisjZGVmaW5lIEhRTV9RU0VUMV9UWFFfRFJCTF9QMSAgICAgICAgICAgIDB4MDAwM2MwYTAKKyNkZWZpbmUgSFFNX1FTRVQwX0lCX0RSQkxfMV9QMCAgICAgICAgICAgMHgwMDAzODA0MAorI2RlZmluZSBfX0lCMV8wX0FDS19QICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIF9fSUIxXzBfRElTQUJMRV9QICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgX19JQjFfMF9OVU1fT0ZfQUNLRURfRVZFTlRTX1AgICAgMHgwMDAwZmZmZgorI2RlZmluZSBIUU1fUVNFVDFfSUJfRFJCTF8xX1AwICAgICAgICAgICAweDAwMDM4MGMwCisjZGVmaW5lIF9fSUIxXzFfQUNLX1AgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgX19JQjFfMV9ESVNBQkxFX1AgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBfX0lCMV8xX05VTV9PRl9BQ0tFRF9FVkVOVFNfUCAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhRTV9RU0VUMF9JQl9EUkJMXzFfUDEgICAgICAgICAgIDB4MDAwM2MwNDAKKyNkZWZpbmUgSFFNX1FTRVQxX0lCX0RSQkxfMV9QMSAgICAgICAgICAgMHgwMDAzYzBjMAorI2RlZmluZSBIUU1fUVNFVDBfSUJfRFJCTF8yX1AwICAgICAgICAgICAweDAwMDM4MDYwCisjZGVmaW5lIF9fSUIyXzBfQUNLX1AgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgX19JQjJfMF9ESVNBQkxFX1AgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBfX0lCMl8wX05VTV9PRl9BQ0tFRF9FVkVOVFNfUCAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhRTV9RU0VUMV9JQl9EUkJMXzJfUDAgICAgICAgICAgIDB4MDAwMzgwZTAKKyNkZWZpbmUgX19JQjJfMV9BQ0tfUCAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBfX0lCMl8xX0RJU0FCTEVfUCAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIF9fSUIyXzFfTlVNX09GX0FDS0VEX0VWRU5UU19QICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgSFFNX1FTRVQwX0lCX0RSQkxfMl9QMSAgICAgICAgICAgMHgwMDAzYzA2MAorI2RlZmluZSBIUU1fUVNFVDFfSUJfRFJCTF8yX1AxICAgICAgICAgICAweDAwMDNjMGUwCisKKworLyoKKyAqIFRoZXNlIGRlZmluaXRpb25zIGFyZSBlaXRoZXIgaW4gZXJyb3IvbWlzc2luZyBpbiBzcGVjLiBJdHMgYXV0by1nZW5lcmF0ZWQKKyAqIGZyb20gaGFyZCBjb2RlZCB2YWx1ZXMgaW4gcmVncGFyc2UucGwuCisgKi8KKyNkZWZpbmUgX19FTVBIUE9TVF9BVF80R19NS19GSVggICAgICAgICAgMHgwMDAwMDAxYworI2RlZmluZSBfX0VNUEhQT1NUX0FUXzRHX1NIX0ZJWCAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIF9fRU1QSFBSRV9BVF80R19GSVggICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgX19TRlBfVFhSQVRFX0VOX0ZJWCAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBfX1NGUF9SWFJBVEVfRU5fRklYICAgICAgICAgICAgICAweDAwMDAwMDgwCisKKworLyoKKyAqIFRoZXNlIHJlZ2lzdGVyIGRlZmluaXRpb25zIGFyZSBhdXRvLWdlbmVyYXRlZCBmcm9tIGhhcmQgY29kZWQgdmFsdWVzCisgKiBpbiByZWdwYXJzZS5wbC4KKyAqLworCisKKy8qCisgKiBUaGVzZSByZWdpc3RlciBtYXBwaW5nIGRlZmluaXRpb25zIGFyZSBhdXRvLWdlbmVyYXRlZCBmcm9tIG1hcHBpbmcgdGFibGVzCisgKiBpbiByZWdwYXJzZS5wbC4KKyAqLworI2RlZmluZSBCRkFfSU9DMF9IQkVBVF9SRUcgICAgICAgICAgICAgICBIT1NUX1NFTTBfSU5GT19SRUcKKyNkZWZpbmUgQkZBX0lPQzBfU1RBVEVfUkVHICAgICAgICAgICAgICAgSE9TVF9TRU0xX0lORk9fUkVHCisjZGVmaW5lIEJGQV9JT0MxX0hCRUFUX1JFRyAgICAgICAgICAgICAgIEhPU1RfU0VNMl9JTkZPX1JFRworI2RlZmluZSBCRkFfSU9DMV9TVEFURV9SRUcgICAgICAgICAgICAgICBIT1NUX1NFTTNfSU5GT19SRUcKKyNkZWZpbmUgQkZBX0ZXX1VTRV9DT1VOVCAgICAgICAgICAgICAgICAgSE9TVF9TRU00X0lORk9fUkVHCisKKyNkZWZpbmUgQ1BFX0RFUFRIX1EoX19uKSBcCisJKENQRV9ERVBUSF9RMCArIChfX24pICogKENQRV9ERVBUSF9RMSAtIENQRV9ERVBUSF9RMCkpCisjZGVmaW5lIENQRV9RQ1RSTF9RKF9fbikgXAorCShDUEVfUUNUUkxfUTAgKyAoX19uKSAqIChDUEVfUUNUUkxfUTEgLSBDUEVfUUNUUkxfUTApKQorI2RlZmluZSBDUEVfUElfUFRSX1EoX19uKSBcCisJKENQRV9QSV9QVFJfUTAgKyAoX19uKSAqIChDUEVfUElfUFRSX1ExIC0gQ1BFX1BJX1BUUl9RMCkpCisjZGVmaW5lIENQRV9DSV9QVFJfUShfX24pIFwKKwkoQ1BFX0NJX1BUUl9RMCArIChfX24pICogKENQRV9DSV9QVFJfUTEgLSBDUEVfQ0lfUFRSX1EwKSkKKyNkZWZpbmUgUk1FX0RFUFRIX1EoX19uKSBcCisJKFJNRV9ERVBUSF9RMCArIChfX24pICogKFJNRV9ERVBUSF9RMSAtIFJNRV9ERVBUSF9RMCkpCisjZGVmaW5lIFJNRV9RQ1RSTF9RKF9fbikgXAorCShSTUVfUUNUUkxfUTAgKyAoX19uKSAqIChSTUVfUUNUUkxfUTEgLSBSTUVfUUNUUkxfUTApKQorI2RlZmluZSBSTUVfUElfUFRSX1EoX19uKSBcCisJKFJNRV9QSV9QVFJfUTAgKyAoX19uKSAqIChSTUVfUElfUFRSX1ExIC0gUk1FX1BJX1BUUl9RMCkpCisjZGVmaW5lIFJNRV9DSV9QVFJfUShfX24pIFwKKwkoUk1FX0NJX1BUUl9RMCArIChfX24pICogKFJNRV9DSV9QVFJfUTEgLSBSTUVfQ0lfUFRSX1EwKSkKKyNkZWZpbmUgSFFNX1FTRVRfUlhRX0RSQkxfUDAoX19uKSBcCisJKEhRTV9RU0VUMF9SWFFfRFJCTF9QMCArIChfX24pICogKEhRTV9RU0VUMV9SWFFfRFJCTF9QMCAtIFwKKwlIUU1fUVNFVDBfUlhRX0RSQkxfUDApKQorI2RlZmluZSBIUU1fUVNFVF9UWFFfRFJCTF9QMChfX24pIFwKKwkoSFFNX1FTRVQwX1RYUV9EUkJMX1AwICsgKF9fbikgKiAoSFFNX1FTRVQxX1RYUV9EUkJMX1AwIC0gXAorCUhRTV9RU0VUMF9UWFFfRFJCTF9QMCkpCisjZGVmaW5lIEhRTV9RU0VUX0lCX0RSQkxfMV9QMChfX24pIFwKKwkoSFFNX1FTRVQwX0lCX0RSQkxfMV9QMCArIChfX24pICogKEhRTV9RU0VUMV9JQl9EUkJMXzFfUDAgLSBcCisJSFFNX1FTRVQwX0lCX0RSQkxfMV9QMCkpCisjZGVmaW5lIEhRTV9RU0VUX0lCX0RSQkxfMl9QMChfX24pIFwKKwkoSFFNX1FTRVQwX0lCX0RSQkxfMl9QMCArIChfX24pICogKEhRTV9RU0VUMV9JQl9EUkJMXzJfUDAgLSBcCisJSFFNX1FTRVQwX0lCX0RSQkxfMl9QMCkpCisjZGVmaW5lIEhRTV9RU0VUX1JYUV9EUkJMX1AxKF9fbikgXAorCShIUU1fUVNFVDBfUlhRX0RSQkxfUDEgKyAoX19uKSAqIChIUU1fUVNFVDFfUlhRX0RSQkxfUDEgLSBcCisJSFFNX1FTRVQwX1JYUV9EUkJMX1AxKSkKKyNkZWZpbmUgSFFNX1FTRVRfVFhRX0RSQkxfUDEoX19uKSBcCisJKEhRTV9RU0VUMF9UWFFfRFJCTF9QMSArIChfX24pICogKEhRTV9RU0VUMV9UWFFfRFJCTF9QMSAtIFwKKwlIUU1fUVNFVDBfVFhRX0RSQkxfUDEpKQorI2RlZmluZSBIUU1fUVNFVF9JQl9EUkJMXzFfUDEoX19uKSBcCisJKEhRTV9RU0VUMF9JQl9EUkJMXzFfUDEgKyAoX19uKSAqIChIUU1fUVNFVDFfSUJfRFJCTF8xX1AxIC0gXAorCUhRTV9RU0VUMF9JQl9EUkJMXzFfUDEpKQorI2RlZmluZSBIUU1fUVNFVF9JQl9EUkJMXzJfUDEoX19uKSBcCisJKEhRTV9RU0VUMF9JQl9EUkJMXzJfUDEgKyAoX19uKSAqIChIUU1fUVNFVDFfSUJfRFJCTF8yX1AxIC0gXAorCUhRTV9RU0VUMF9JQl9EUkJMXzJfUDEpKQorCisjZGVmaW5lIENQRV9RX05VTShfX2ZuLCBfX3EpICAoKChfX2ZuKSA8PCAyKSArIChfX3EpKQorI2RlZmluZSBSTUVfUV9OVU0oX19mbiwgX19xKSAgKCgoX19mbikgPDwgMikgKyAoX19xKSkKKyNkZWZpbmUgQ1BFX1FfTUFTSyhfX3EpICAoKF9fcSkgJiAweDMpCisjZGVmaW5lIFJNRV9RX01BU0soX19xKSAgKChfX3EpICYgMHgzKQorCisKKy8qCisgKiBQQ0kgTVNJLVggdmVjdG9yIGRlZmluZXMKKyAqLworZW51bSB7CisgICAgQkZBX01TSVhfQ1BFX1EwID0gMCwKKyAgICBCRkFfTVNJWF9DUEVfUTEgPSAxLAorICAgIEJGQV9NU0lYX0NQRV9RMiA9IDIsCisgICAgQkZBX01TSVhfQ1BFX1EzID0gMywKKyAgICBCRkFfTVNJWF9STUVfUTAgPSA0LAorICAgIEJGQV9NU0lYX1JNRV9RMSA9IDUsCisgICAgQkZBX01TSVhfUk1FX1EyID0gNiwKKyAgICBCRkFfTVNJWF9STUVfUTMgPSA3LAorICAgIEJGQV9NU0lYX0xQVV9FUlIgPSA4LAorICAgIEJGQV9NU0lYX0NUX01BWCA9IDksCit9OworCisvKgorICogQW5kIGNvcnJlc3BvbmRpbmcgaG9zdCBpbnRlcnJ1cHQgc3RhdHVzIGJpdCBmaWVsZCBkZWZpbmVzCisgKi8KKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1ExICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVCisjZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUKKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RMyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1E0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVCisjZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMFUKKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RNiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1E3ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RMSAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwVQorI2RlZmluZSBfX0hGTl9JTlRfUk1FX1EyICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RNCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfUk1FX1E1ICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTYgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RNyAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwVQorI2RlZmluZSBfX0hGTl9JTlRfRVJSX0VNQyAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9FUlJfTFBVMCAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX0VSUl9MUFUxICAgICAgICAgICAgICAgICAweDAwMDQwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfRVJSX1BTUyAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9NQk9YX0xQVTAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX01CT1hfTFBVMSAgICAgICAgICAgICAgICAweDAwMjAwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfTUJPWDFfTFBVMCAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9NQk9YMV9MUFUxICAgICAgICAgICAgICAgMHgwMDgwMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMGZmVQorI2RlZmluZSBfX0hGTl9JTlRfUk1FX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMGZmMDBVCisKKworLyoKKyAqIGNhdGFwdWx0IG1lbW9yeSBtYXAuCisgKi8KKyNkZWZpbmUgTExfUEdOX0hRTTAgICAgICAgICAgICAgICAgICAgICAgMHgwMDk2CisjZGVmaW5lIExMX1BHTl9IUU0xICAgICAgICAgICAgICAgICAgICAgIDB4MDA5NworI2RlZmluZSBQU1NfU01FTV9QQUdFX1NUQVJUCTB4ODAwMAorI2RlZmluZSBQU1NfU01FTV9QR05VTShfcGcwLCBfbWEpCSgoX3BnMCkgKyAoKF9tYSkgPj4gMTUpKQorI2RlZmluZSBQU1NfU01FTV9QR09GRihfbWEpCSgoX21hKSAmIDB4N2ZmZikKKworLyoKKyAqIEVuZCBvZiBjYXRhcHVsdCBtZW1vcnkgbWFwCisgKi8KKworCisjZW5kaWYgLyogX19CRklfQ1RSRUdfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2ZhYnJpYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfZmFicmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2NjllZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2ZhYnJpYy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGSV9GQUJSSUNfSF9fCisjZGVmaW5lIF9fQkZJX0ZBQlJJQ19IX18KKworI2luY2x1ZGUgPGJmaS9iZmkuaD4KKworI3ByYWdtYSBwYWNrKDEpCisKK2VudW0gYmZpX2ZhYnJpY19oMmlfbXNncyB7CisJQkZJX0ZBQlJJQ19IMklfQ1JFQVRFX1JFUQk9IDEsCisJQkZJX0ZBQlJJQ19IMklfREVMRVRFX1JFUQk9IDIsCisJQkZJX0ZBQlJJQ19IMklfU0VUQVVUSAkJPSAzLAorfTsKKworZW51bSBiZmlfZmFicmljX2kyaF9tc2dzIHsKKwlCRklfRkFCUklDX0kySF9DUkVBVEVfUlNQCT0gQkZBX0kySE0oMSksCisJQkZJX0ZBQlJJQ19JMkhfREVMRVRFX1JTUAk9IEJGQV9JMkhNKDIpLAorCUJGSV9GQUJSSUNfSTJIX1NFVEFVVEhfUlNQCT0gQkZBX0kySE0oMyksCisJQkZJX0ZBQlJJQ19JMkhfT05MSU5FCQk9IEJGQV9JMkhNKDQpLAorCUJGSV9GQUJSSUNfSTJIX09GRkxJTkUJCT0gQkZBX0kySE0oNSksCit9OworCitzdHJ1Y3QgYmZpX2ZhYnJpY19jcmVhdGVfcmVxX3MgeworCWJmaV9taGRyX3QJbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSovCisJdTggICAgICAgICB2Zl9lbjsJCS8qICB2aXJ0dWFsIGZhYnJpYyBlbmFibGUJKi8KKwl1OCAgICAgICAgIHJzdmQ7CisJdTE2ICAgICAgICB2Zl9pZDsJCS8qICB2aXJ0dWFsIGZhYnJpYyBJRAkJKi8KKwl3d25fdAkJcHd3bjsJCS8qICBwb3J0IG5hbWUJCQkqLworCXd3bl90CQlud3duOwkJLyogIG5vZGUgbmFtZQkJCSovCit9OworCitzdHJ1Y3QgYmZpX2ZhYnJpY19jcmVhdGVfcnNwX3MgeworCWJmaV9taGRyX3QJbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSovCisJdTE2ICAgICAgICBiZmFfaGFuZGxlOwkvKiAgaG9zdCBmYWJyaWMgaGFuZGxlCQkqLworCXU4ICAgICAgICAgc3RhdHVzOwkJLyogIGZhYnJpYyBjcmVhdGUgc3RhdHVzCSovCisJdTggICAgICAgICByc3ZkOworfTsKKworc3RydWN0IGJmaV9mYWJyaWNfZGVsZXRlX3JlcV9zIHsKKwliZmlfbWhkcl90CW1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXUxNiAgICAgICAgZndfaGFuZGxlOwkvKiAgZmlybXdhcmUgZmFicmljIGhhbmRsZQkqLworCXUxNiAgICAgICAgcnN2ZDsKK307CisKK3N0cnVjdCBiZmlfZmFicmljX2RlbGV0ZV9yc3BfcyB7CisJYmZpX21oZHJfdAltaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KKwl1MTYgICAgICAgIGJmYV9oYW5kbGU7CS8qICBob3N0IGZhYnJpYyBoYW5kbGUJCSovCisJdTggICAgICAgICBzdGF0dXM7CQkvKiAgZmFicmljIGRlbGV0aW9uIHN0YXR1cwkqLworCXU4ICAgICAgICAgcnN2ZDsKK307CisKKyNkZWZpbmUgQkZJX0ZBQlJJQ19BVVRIU0VDUkVUX0xFTgk2NAorc3RydWN0IGJmaV9mYWJyaWNfc2V0YXV0aF9yZXFfcyB7CisJYmZpX21oZHJfdAltaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KKwl1MTYgICAgICAgIGZ3X2hhbmRsZTsJLyogIGYvdyBoYW5kbGUgb2YgZmFicmljCSovCisJdTgJCWFsZ29yaXRobTsKKwl1OAkJZ3JvdXA7CisJdTgJCXNlY3JldFtCRklfRkFCUklDX0FVVEhTRUNSRVRfTEVOXTsKK307CisKK3VuaW9uIGJmaV9mYWJyaWNfaDJpX21zZ191IHsKKwliZmlfbXNnX3QJCSptc2c7CisJc3RydWN0IGJmaV9mYWJyaWNfY3JlYXRlX3JlcV9zCSpjcmVhdGVfcmVxOworCXN0cnVjdCBiZmlfZmFicmljX2RlbGV0ZV9yZXFfcwkqZGVsZXRlX3JlcTsKK307CisKK3VuaW9uIGJmaV9mYWJyaWNfaTJoX21zZ191IHsKKwliZmlfbXNnX3QJCSptc2c7CisJc3RydWN0IGJmaV9mYWJyaWNfY3JlYXRlX3JzcF9zCSpjcmVhdGVfcnNwOworCXN0cnVjdCBiZmlfZmFicmljX2RlbGV0ZV9yc3BfcwkqZGVsZXRlX3JzcDsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZiAvKiBfX0JGSV9GQUJSSUNfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2ZjcGltLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9mY3BpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzA1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9mY3BpbS5oCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRklfRkNQSU1fSF9fCisjZGVmaW5lIF9fQkZJX0ZDUElNX0hfXworCisjaW5jbHVkZSAiYmZpLmgiCisjaW5jbHVkZSA8cHJvdG9jb2wvZmNwLmg+CisKKyNwcmFnbWEgcGFjaygxKQorCisvKgorICogSW5pdGlhdG9yIG1vZGUgSS1UIG5leHVzIGludGVyZmFjZSBkZWZpbmVzLgorICovCisKK2VudW0gYmZpX2l0bmltX2gyaSB7CisJQkZJX0lUTklNX0gySV9DUkVBVEVfUkVRID0gMSwJLyogIGktdCBuZXh1cyBjcmVhdGlvbiAqLworCUJGSV9JVE5JTV9IMklfREVMRVRFX1JFUSA9IDIsCS8qICBpLXQgbmV4dXMgZGVsZXRpb24gKi8KK307CisKK2VudW0gYmZpX2l0bmltX2kyaCB7CisJQkZJX0lUTklNX0kySF9DUkVBVEVfUlNQID0gQkZBX0kySE0oMSksCisJQkZJX0lUTklNX0kySF9ERUxFVEVfUlNQID0gQkZBX0kySE0oMiksCisJQkZJX0lUTklNX0kySF9TTEVSX0VWRU5UID0gQkZBX0kySE0oMyksCit9OworCitzdHJ1Y3QgYmZpX2l0bmltX2NyZWF0ZV9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkgKi8KKwl1MTYgICAgICAgIGZ3X2hhbmRsZTsJLyogIGYvdyBoYW5kbGUgZm9yIGl0bmltCSAqLworCXU4ICAgICAgICAgY2xhc3M7CQkvKiAgRkMgY2xhc3MgZm9yIElPCQkgKi8KKwl1OCAgICAgICAgIHNlcV9yZWM7CS8qICBzZXF1ZW5jZSByZWNvdmVyeSBzdXBwb3J0CSAqLworCXU4ICAgICAgICAgbXNnX25vOwkJLyogIHNlcSBpZCBvZiB0aGUgbXNnCQkgKi8KK307CisKK3N0cnVjdCBiZmlfaXRuaW1fY3JlYXRlX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSAqLworCXUxNiAgICAgICAgYmZhX2hhbmRsZTsJLyogIGJmYSBoYW5kbGUgZm9yIGl0bmltCSAqLworCXU4ICAgICAgICAgc3RhdHVzOwkJLyogIGZjcCByZXF1ZXN0IHN0YXR1cwkJICovCisJdTggICAgICAgICBzZXFfaWQ7CQkvKiAgc2VxIGlkIG9mIHRoZSBtc2cJCSAqLworfTsKKworc3RydWN0IGJmaV9pdG5pbV9kZWxldGVfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJICovCisJdTE2ICAgICAgICBmd19oYW5kbGU7CS8qICBmL3cgaXRuaW0gaGFuZGxlCQkgKi8KKwl1OCAgICAgICAgIHNlcV9pZDsJCS8qICBzZXEgaWQgb2YgdGhlIG1zZwkJICovCisJdTggICAgICAgICByc3ZkOworfTsKKworc3RydWN0IGJmaV9pdG5pbV9kZWxldGVfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJICovCisJdTE2ICAgICAgICBiZmFfaGFuZGxlOwkvKiAgYmZhIGhhbmRsZSBmb3IgaXRuaW0JICovCisJdTggICAgICAgICBzdGF0dXM7CQkvKiAgZmNwIHJlcXVlc3Qgc3RhdHVzCQkgKi8KKwl1OCAgICAgICAgIHNlcV9pZDsJCS8qICBzZXEgaWQgb2YgdGhlIG1zZwkJICovCit9OworCitzdHJ1Y3QgYmZpX2l0bmltX3NsZXJfZXZlbnRfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkgKi8KKwl1MTYgICAgICAgIGJmYV9oYW5kbGU7CS8qICBiZmEgaGFuZGxlIGZvciBpdG5pbQkgKi8KKwl1MTYgICAgICAgIHJzdmQ7Cit9OworCit1bmlvbiBiZmlfaXRuaW1faDJpX21zZ191IHsKKwlzdHJ1Y3QgYmZpX2l0bmltX2NyZWF0ZV9yZXFfcyAqY3JlYXRlX3JlcTsKKwlzdHJ1Y3QgYmZpX2l0bmltX2RlbGV0ZV9yZXFfcyAqZGVsZXRlX3JlcTsKKwlzdHJ1Y3QgYmZpX21zZ19zICAgICAgKm1zZzsKK307CisKK3VuaW9uIGJmaV9pdG5pbV9pMmhfbXNnX3UgeworCXN0cnVjdCBiZmlfaXRuaW1fY3JlYXRlX3JzcF9zICpjcmVhdGVfcnNwOworCXN0cnVjdCBiZmlfaXRuaW1fZGVsZXRlX3JzcF9zICpkZWxldGVfcnNwOworCXN0cnVjdCBiZmlfaXRuaW1fc2xlcl9ldmVudF9zICpzbGVyX2V2ZW50OworCXN0cnVjdCBiZmlfbXNnX3MgICAgICAqbXNnOworfTsKKworLyoKKyAqIEluaXRpYXRvciBtb2RlIElPIGludGVyZmFjZSBkZWZpbmVzLgorICovCisKK2VudW0gYmZpX2lvaW1faDJpIHsKKwlCRklfSU9JTV9IMklfSU9BQk9SVF9SRVEgPSAxLAkvKiAgSU8gYWJvcnQgcmVxdWVzdAkgKi8KKwlCRklfSU9JTV9IMklfSU9DTEVBTlVQX1JFUSA9IDIsCS8qICBJTyBjbGVhbnVwIHJlcXVlc3QJICovCit9OworCitlbnVtIGJmaV9pb2ltX2kyaCB7CisJQkZJX0lPSU1fSTJIX0lPX1JTUCA9IEJGQV9JMkhNKDEpLAkvKiAgbm9uLWZwIElPIHJlc3BvbnNlCSAqLworCUJGSV9JT0lNX0kySF9JT0FCT1JUX1JTUCA9IEJGQV9JMkhNKDIpLC8qICBBQk9SVCByc3AJICovCit9OworCisvKioKKyAqIElPIGNvbW1hbmQgRElGIGluZm8KKyAqLworc3RydWN0IGJmaV9pb2ltX2RpZl9zIHsKKwl1MzIJZGlmX2luZm9bNF07Cit9OworCisvKioKKyAqIEZDUCBJTyBtZXNzYWdlcyBvdmVydmlldworICoKKyAqIEBub3RlCisgKiAtIE1heCBDREIgbGVuZ3RoIHN1cHBvcnRlZCBpcyA2NCBieXRlcy4KKyAqIC0gU0NTSSBMaW5rZWQgY29tbWFuZHMgYW5kIFNDU0kgYmktZGlyZWN0aW9uYWwgQ29tbWFuZHMgbm90CisgKiAJIHN1cHBvcnRlZC4KKyAqCisgKi8KK3N0cnVjdCBiZmlfaW9pbV9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIENvbW1vbiBtc2cgaGVhZGVyCQkgKi8KKwl1MTYgICAgICAgIGlvX3RhZzsJCS8qICBJL08gdGFnCQkJICovCisJdTE2ICAgICAgICBycG9ydF9oZGw7CS8qICBpdG5pbS9ycG9ydCBmaXJtd2FyZSBoYW5kbGUgKi8KKwlzdHJ1Y3QgZmNwX2NtbmRfcyBjbW5kOwkJLyogIElPIHJlcXVlc3QgaW5mbwkJICovCisKKwkvKioKKwkgKiBTRyBlbGVtZW50cyBhcnJheSB3aXRoaW4gdGhlIElPIHJlcXVlc3QgbXVzdCBiZSBkb3VibGUgd29yZAorCSAqIGFsaWduZWQuIFRoaXMgYWxpZ21lbnQgaXMgcmVxdWlyZWQgdG8gb3B0aW1pemUgU0dNIHNldHVwIGZvciB0aGUgSU8uCisJICovCisJc3RydWN0IGJmaV9zZ2VfcyAgIHNnZXNbQkZJX1NHRV9JTkxJTkVfTUFYXTsKKwl1OCAgICAgICAgIGlvX3RpbWVvdXQ7CisJdTggICAgICAgICBkaWZfZW47CisJdTggICAgICAgICByc3ZkX2FbMl07CisJc3RydWN0IGJmaV9pb2ltX2RpZl9zICBkaWY7Cit9OworCisvKioKKyAqIAlUaGlzIHRhYmxlIHNob3dzIHZhcmlvdXMgSU8gc3RhdHVzIGNvZGVzIGZyb20gZmlybXdhcmUgYW5kIHRoZWlyCisgKgltZWFuaW5nLiBIb3N0IGRyaXZlciBjYW4gdXNlIHRoZXNlIHN0YXR1cyBjb2RlcyB0byBmdXJ0aGVyIHByb2Nlc3MKKyAqCUlPIGNvbXBsZXRpb25zLgorICoKKyAqIAlCRklfSU9JTV9TVFNfT0sJCTogSU8gY29tcGxldGVkIHdpdGggZXJyb3IgZnJlZSBTQ1NJICYKKyAqCQkJCQkgICB0cmFuc3BvcnQgc3RhdHVzLgorICogCQkJCQkgICAtIGlvLXRhZyBjYW4gYmUgcmV1c2VkLgorICoKKyAqIAlCRkFfSU9JTV9TVFNfU0NTSV9FUlIJCTogSU8gY29tcGxldGVkIHdpdGggc2NzaSBlcnJvci4KKyAqIAkJCQkJICAtIGlvLXRhZyBjYW4gYmUgcmV1c2VkLgorICoKKyAqIAlCRklfSU9JTV9TVFNfSE9TVF9BQk9SVEVECTogSU8gd2FzIGFib3J0ZWQgc3VjY2Vzc2Z1bGx5IGR1ZSB0bworICoJCQkJCSAgIGhvc3QgcmVxdWVzdC4KKyAqIAkJCQkJICAgLSBpby10YWcgY2Fubm90IGJlIHJldXNlZCB5ZXQuCisgKgorICogCUJGSV9JT0lNX1NUU19BQk9SVEVECQk6IElPIHdhcyBhYm9ydGVkIHN1Y2Nlc3NmdWxseQorICoJCQkJCSAgIGludGVybmFsbHkgYnkgZi93LgorICogCQkJCQkgICAtIGlvLXRhZyBjYW5ub3QgYmUgcmV1c2VkIHlldC4KKyAqCisgKiAJQkZJX0lPSU1fU1RTX1RJTUVET1VUCTogSU8gdGltZWRvdXQgYW5kIEFCVFMvUlJRIGlzIGhhcHBlbmluZworICoJCQkJCSAgIGluIHRoZSBmaXJtd2FyZSBhbmQKKyAqIAkJCQkJICAgLSBpby10YWcgY2Fubm90IGJlIHJldXNlZCB5ZXQuCisgKgorICogCUJGSV9JT0lNX1NUU19TUUVSX05FRURFRAk6IEZpcm13YXJlIGNvdWxkIG5vdCByZWNvdmVyIHRoZSBJTworICoJCQkJCSAgd2l0aCBzZXF1ZW5jZSBsZXZlbCBlcnJvcgorICogCQkJCQkgIGxvZ2ljIGFuZCBoZW5jZSBob3N0IG5lZWRzIHRvIHJldHJ5CisgKgkJCQkJICB0aGlzIElPIHdpdGggYSBkaWZmZXJlbnQgSU8gdGFnCisgKiAJCQkJCSAgLSBpby10YWcgY2Fubm90IGJlIHVzZWQgeWV0LgorICoKKyAqIAlCRklfSU9JTV9TVFNfTkVYVVNfQUJPUlQJOiBTZWNvbmQgTGV2ZWwgRXJyb3IgUmVjb3ZlcnkgZnJvbSBob3N0CisgKgkJCQkJICBpcyByZXF1aXJlZCBiZWNhdXNlIDIgY29uc2VjdXRpdmUgQUJUUworICoJCQkJCSAgdGltZWRvdXQgYW5kIGhvc3QgbmVlZHMgbG9nb3V0IGFuZAorICoJCQkJCSAgcmUtbG9naW4gd2l0aCB0aGUgdGFyZ2V0CisgKiAJCQkJCSAgLSBpby10YWcgY2Fubm90IGJlIHVzZWQgeWV0LgorICoKKyAqIAlCRklfSU9JTV9TVFNfVU5ERVJSVU4JOiBJTyBjb21wbGV0ZWQgd2l0aCBTQ1NJIHN0YXR1cyBnb29kLAorICoJCQkJCSAgYnV0IHRoZSBkYXRhIHRyYW5mZXJyZWQgaXMgbGVzcyB0aGFuCisgKgkJCQkJICB0aGUgZmNwIGRhdGEgbGVuZ3RoIGluIHRoZSBjb21tYW5kLgorICoJCQkJCSAgZXguIFNDU0kgSU5RVUlSWSB3aGVyZSB0cmFuc2ZlcnJlZAorICoJCQkJCSAgZGF0YSBsZW5ndGggYW5kIHJlc2lkdWUgY291bnQgaW4gRkNQCisgKgkJCQkJICByZXNwb25zZSBhY2NvdW50cyBmb3IgdG90YWwgZmNwLWRsCisgKiAJCQkJCSAgLSBpby10YWcgY2FuIGJlIHJldXNlZC4KKyAqCisgKiAJQkZJX0lPSU1fU1RTX09WRVJSVU4JOiBJTyBjb21wbGV0ZWQgd2l0aCBTQ1NJIHN0YXR1cyBnb29kLAorICoJCQkJCSAgYnV0IHRoZSBkYXRhIHRyYW5zZXJyZWQgaXMgbW9yZSB0aGFuCisgKgkJCQkJICBmY3AgZGF0YSBsZW5ndGggaW4gdGhlIGNvbW1hbmQuIGV4LgorICoJCQkJCSAgVEFQRSBJT3Mgd2hlcmUgYmxvY2tzIGNhbiBvZiB1bmVxdWFsCisgKgkJCQkJICBsZW5ndGhzLgorICogCQkJCQkgIC0gaW8tdGFnIGNhbiBiZSByZXVzZWQuCisgKgorICogCUJGSV9JT0lNX1NUU19SRVNfRlJFRQk6IEZpcm13YXJlIGhhcyBjb21wbGV0ZWQgdXNpbmcgaW8tdGFnCisgKgkJCQkJICBkdXJpbmcgYWJvcnQgcHJvY2VzcworICogCQkJCQkgIC0gaW8tdGFnIGNhbiBiZSByZXVzZWQuCisgKgorICogCUJGSV9JT0lNX1NUU19QUk9UT19FUlIJOiBGaXJtd2FyZSBkZXRlY3RlZCBhIHByb3RvY29sIGVycm9yLgorICoJCQkJCSAgZXggdGFyZ2V0IHNlbnQgbW9yZSBkYXRhIHRoYW4KKyAqCQkJCQkgIHJlcXVlc3RlZCwgb3IgdGhlcmUgd2FzIGRhdGEgZnJhbWUKKyAqCQkJCQkgIGxvc3MgYW5kIG90aGVyIHJlYXNvbnMKKyAqIAkJCQkJICAtIGlvLXRhZyBjYW5ub3QgYmUgdXNlZCB5ZXQuCisgKgorICogCUJGSV9JT0lNX1NUU19ESUZfRVJSCTogRmlyd21hcmUgZGV0ZWN0ZWQgRElGIGVycm9yLiBleDogRElGCisgKiAJCQkJCSAgQ1JDIGVyciBvciBSZWYgVGFnIGVyciBvciBBcHAgdGFnIGVyci4KKyAqIAkJCQkJICAtIGlvLXRhZyBjYW4gYmUgcmV1c2VkLgorICoKKyAqIAlCRkFfSU9JTV9TVFNfVFNLX01HVF9BQk9SVAk6IElPIHdhcyBhYm9ydGVkIGJlY2F1c2Ugb2YgVGFzaworICoJCQkJCSAgTWFuYWdlbWVudCBjb21tYW5kIGZyb20gdGhlIGhvc3QKKyAqIAkJCQkJICAtIGlvLXRhZyBjYW4gYmUgcmV1c2VkLgorICoKKyAqIAlCRklfSU9JTV9TVFNfVVRBRwkJOiBGaXJtd2FyZSBkb2VzIG5vdCBrbm93IGFib3V0IHRoaXMKKyAqCQkJCQkgIGlvX3RhZy4KKyAqIAkJCQkJICAtIGlvLXRhZyBjYW4gYmUgcmV1c2VkLgorICovCitlbnVtIGJmaV9pb2ltX3N0YXR1cyB7CisJQkZJX0lPSU1fU1RTX09LID0gMCwKKwlCRklfSU9JTV9TVFNfSE9TVF9BQk9SVEVEID0gMSwKKwlCRklfSU9JTV9TVFNfQUJPUlRFRCA9IDIsCisJQkZJX0lPSU1fU1RTX1RJTUVET1VUID0gMywKKwlCRklfSU9JTV9TVFNfUkVTX0ZSRUUgPSA0LAorCUJGSV9JT0lNX1NUU19TUUVSX05FRURFRCA9IDUsCisJQkZJX0lPSU1fU1RTX1BST1RPX0VSUiA9IDYsCisJQkZJX0lPSU1fU1RTX1VUQUcgPSA3LAorCUJGSV9JT0lNX1NUU19QQVRIVE9WID0gOCwKK307CisKKyNkZWZpbmUgQkZJX0lPSU1fU05TTEVOCSgyNTYpCisvKioKKyAqIEkvTyByZXNwb25zZSBtZXNzYWdlCisgKi8KK3N0cnVjdCBiZmlfaW9pbV9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCSAJICovCisJdTE2ICAgICAgICBpb190YWc7CQkvKiAgY29tcGxldGVkIElPIHRhZwkJICovCisJdTE2ICAgICAgICBiZmFfcnBvcnRfaG5kbDsJLyogIHJlbGVhdGVkIHJwb3J0IGhhbmRsZQkgKi8KKwl1OCAgICAgICAgIGlvX3N0YXR1czsJLyogIElPIGNvbXBsZXRpb24gc3RhdHVzCSAqLworCXU4ICAgICAgICAgcmV1c2VfaW9fdGFnOwkvKiAgSU8gdGFnIGNhbiBiZSByZXVzZWQgICAgICAgICovCisJdTE2CWFib3J0X3RhZzsJLyogIGhvc3QgYWJvcnQgcmVxdWVzdCB0YWcgICAgICAqLworCXU4CQlzY3NpX3N0YXR1czsJLyogIHNjc2kgc3RhdHVzIGZyb20gdGFyZ2V0CSAqLworCXU4CQlzbnNfbGVuOwkvKiAgc2NzaSBzZW5zZSBsZW5ndGgJCSAqLworCXU4CQlyZXNpZF9mbGFnczsJLyogIElPIHJlc2lkdWUgZmxhZ3MJCSAqLworCXU4CQlyc3ZkX2E7CisJdTMyCXJlc2lkdWU7CS8qICBJTyByZXNpZHVhbCBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1MzIJcnN2ZF9iWzNdOworfTsKKworc3RydWN0IGJmaV9pb2ltX2Fib3J0X3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7ICAgICAgICAgIC8qICBDb21tb24gbXNnIGhlYWRlciAgKi8KKwl1MTYgICAgICAgIGlvX3RhZzsgICAgICAgICAvKiAgSS9PIHRhZyAgICAgICAgICAgICovCisJdTE2ICAgICAgICBhYm9ydF90YWc7ICAgICAgLyogIHVuaXF1ZSByZXF1ZXN0IHRhZyAqLworfTsKKworLyoKKyAqIEluaXRpYXRvciBtb2RlIHRhc2sgbWFuYWdlbWVudCBjb21tYW5kIGludGVyZmFjZSBkZWZpbmVzLgorICovCisKK2VudW0gYmZpX3Rza2ltX2gyaSB7CisJQkZJX1RTS0lNX0gySV9UTV9SRVEgICAgPSAxLCAvKiAgdGFzay1tZ210IGNvbW1hbmQgICAgICAgICAqLworCUJGSV9UU0tJTV9IMklfQUJPUlRfUkVRID0gMiwgLyogIHRhc2stbWdtdCBjb21tYW5kICAgICAgICAgKi8KK307CisKK2VudW0gYmZpX3Rza2ltX2kyaCB7CisJQkZJX1RTS0lNX0kySF9UTV9SU1AgPSBCRkFfSTJITSgxKSwKK307CisKK3N0cnVjdCBiZmlfdHNraW1fcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsgICAgICAgICAgICAgLyogIENvbW1vbiBtc2cgaGVhZGVyICAgICAgICAgICovCisJdTE2ICAgICAgICB0c2tfdGFnOyAgICAgICAgLyogIHRhc2sgbWFuYWdlbWVudCB0YWcgICAgICAgICovCisJdTE2ICAgICAgICBpdG5fZmhkbDsgICAgICAgLyogIGl0biBmaXJtd2FyZSBoYW5kbGUgICAgICAgICovCisJbHVuX3QgICAgICAgICAgIGx1bjsgICAgICAgICAgICAvKiAgTFUgbnVtYmVyICAgICAgICAgICAgICAgICAgKi8KKwl1OCAgICAgICAgIHRtX2ZsYWdzOyAgICAgICAvKiAgc2VlIGZjcF90bV9jbW5kX3QgICAgICAgICAgKi8KKwl1OCAgICAgICAgIHRfc2VjczsgICAgICAgICAvKiAgVGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzICAgKi8KKwl1OCAgICAgICAgIHJzdmRbMl07Cit9OworCitzdHJ1Y3QgYmZpX3Rza2ltX2Fib3J0cmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsgICAgICAgICAgICAgLyogIENvbW1vbiBtc2cgaGVhZGVyICAgICAgICAgICovCisJdTE2ICAgICAgICB0c2tfdGFnOyAgICAgICAgLyogIHRhc2sgbWFuYWdlbWVudCB0YWcgICAgICAgICovCisJdTE2ICAgICAgICByc3ZkOworfTsKKworZW51bSBiZmlfdHNraW1fc3RhdHVzIHsKKwkvKgorCSAqIEZvbGxvd2luZyBhcmUgRkNQLTQgc3BlYyBkZWZpbmVkIHN0YXR1cyBjb2RlcywKKwkgKiAqKkRPIE5PVCBDSEFOR0UgVEhFTSAqKgorCSAqLworCUJGSV9UU0tJTV9TVFNfT0sgICAgICAgPSAwLAorCUJGSV9UU0tJTV9TVFNfTk9UX1NVUFAgPSA0LAorCUJGSV9UU0tJTV9TVFNfRkFJTEVEICAgPSA1LAorCisJLyoqCisJICogRGVmaW5lZCBieSBCRkEKKwkgKi8KKwlCRklfVFNLSU1fU1RTX1RJTUVPVVQgID0gMTAsICAgIC8qICBUTSByZXF1ZXN0IHRpbWVkb3V0ICAgICAqLworCUJGSV9UU0tJTV9TVFNfQUJPUlRFRCAgPSAxMSwgICAgLyogIEFib3J0ZWQgb24gaG9zdCByZXF1ZXN0ICovCit9OworCitzdHJ1Y3QgYmZpX3Rza2ltX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgQ29tbW9uIG1zZyBoZWFkZXIJCSAqLworCXUxNiAgICAgICAgdHNrX3RhZzsJLyogIHRhc2sgbWdtdCBjbW5kIHRhZwkJICovCisJdTggICAgICAgICB0c2tfc3RhdHVzOwkvKiAgQHJlZiBiZmlfdHNraW1fc3RhdHVzICovCisJdTggICAgICAgICByc3ZkOworfTsKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmIC8qIF9fQkZJX0ZDUElNX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9mY3hwLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9mY3hwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlOTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX2ZjeHAuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRklfRkNYUF9IX18KKyNkZWZpbmUgX19CRklfRkNYUF9IX18KKworI2luY2x1ZGUgImJmaS5oIgorCisjcHJhZ21hIHBhY2soMSkKKworZW51bSBiZmlfZmN4cF9oMmkgeworCUJGSV9GQ1hQX0gySV9TRU5EX1JFUSA9IDEsCit9OworCitlbnVtIGJmaV9mY3hwX2kyaCB7CisJQkZJX0ZDWFBfSTJIX1NFTkRfUlNQID0gQkZBX0kySE0oMSksCit9OworCisjZGVmaW5lIEJGQV9GQ1hQX01BWF9TR0VTCTIKKworLyoqCisgKiBGQ1hQIHNlbmQgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGJmaV9mY3hwX3NlbmRfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBDb21tb24gbXNnIGhlYWRlcgkJICAgICovCisJdTE2ICAgICAgICBmY3hwX3RhZzsJLyogIGRyaXZlciByZXF1ZXN0IHRhZwkJICAgICovCisJdTE2ICAgICAgICBtYXhfZnJtc3o7CS8qICBtYXggc2VuZCBmcmFtZSBzaXplCSAgICAqLworCXUxNiAgICAgICAgdmZfaWQ7CQkvKiAgdnNhbiB0YWcgaWYgYXBwbGljYWJsZQkgICAgKi8KKwl1MTYgICAgICAgIHJwb3J0X2Z3X2huZGw7CS8qICBGVyBIYW5kbGUgZm9yIHRoZSByZW1vdGUgcG9ydCAgKi8KKwl1OCAgICAgICAgIGNsYXNzOwkJLyogIEZDIGNsYXNzIHVzZWQgZm9yIHJlcS9yc3AJICAgICovCisJdTggICAgICAgICByc3BfdGltZW91dDsJLyogIHRpbWVvdXQgaW4gc2VjcywgMC1ubyByZXNwb25zZSAqLworCXU4ICAgICAgICAgY3RzOwkJLyogIGNvbnRpbnVlIHNlcXVlbmNlCQkgICAgKi8KKwl1OCAgICAgICAgIGxwX3RhZzsJCS8qICBscG9ydCB0YWcJCQkgICAgKi8KKwlzdHJ1Y3QgZmNoc19zICAgZmNoczsJCS8qICByZXF1ZXN0IEZDIGhlYWRlciBzdHJ1Y3R1cmUgICAgKi8KKwl1MzIgICAgICAgIHJlcV9sZW47CS8qICByZXF1ZXN0IHBheWxvYWQgbGVuZ3RoCSAgICAqLworCXUzMiAgICAgICAgcnNwX21heGxlbjsJLyogIG1heCByZXNwb25zZSBsZW5ndGggZXhwZWN0ZWQgICAqLworCXN0cnVjdCBiZmlfc2dlX3MgICByZXFfc2dlW0JGQV9GQ1hQX01BWF9TR0VTXTsJLyogIHJlcXVlc3QgYnVmICAgICovCisJc3RydWN0IGJmaV9zZ2VfcyAgIHJzcF9zZ2VbQkZBX0ZDWFBfTUFYX1NHRVNdOwkvKiAgcmVzcG9uc2UgYnVmICAgKi8KK307CisKKy8qKgorICogRkNYUCBzZW5kIHJlc3BvbnNlIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgYmZpX2ZjeHBfc2VuZF9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIENvbW1vbiBtc2cgaGVhZGVyCQkgICAgKi8KKwl1MTYgICAgICAgIGZjeHBfdGFnOwkvKiAgc2VuZCByZXF1ZXN0IHRhZwkJICAgICovCisJdTggICAgICAgICByZXFfc3RhdHVzOwkvKiAgcmVxdWVzdCBzdGF0dXMJCSAgICAqLworCXU4ICAgICAgICAgcnN2ZDsKKwl1MzIgICAgICAgIHJzcF9sZW47CS8qICBhY3R1YWwgcmVzcG9uc2UgbGVuZ3RoCSAgICAqLworCXUzMiAgICAgICAgcmVzaWR1ZV9sZW47CS8qICByZXNpZHVhbCByZXNwb25zZSBsZW5ndGgJICAgICovCisJc3RydWN0IGZjaHNfcyAgIGZjaHM7CQkvKiAgcmVzcG9uc2UgRkMgaGVhZGVyIHN0cnVjdHVyZSAgICovCit9OworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogX19CRklfRkNYUF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfaW9jLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9pb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjZlOWMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfaW9jLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGSV9JT0NfSF9fCisjZGVmaW5lIF9fQkZJX0lPQ19IX18KKworI2luY2x1ZGUgImJmaS5oIgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfaW9jLmg+CisKKyNwcmFnbWEgcGFjaygxKQorCitlbnVtIGJmaV9pb2NfaDJpX21zZ3MgeworCUJGSV9JT0NfSDJJX0VOQUJMRV9SRVEgCQk9IDEsCisJQkZJX0lPQ19IMklfRElTQUJMRV9SRVEgCT0gMiwKKwlCRklfSU9DX0gySV9HRVRBVFRSX1JFUSAJPSAzLAorCUJGSV9JT0NfSDJJX0RCR19TWU5DCSAJPSA0LAorCUJGSV9JT0NfSDJJX0RCR19EVU1QCSAJPSA1LAorfTsKKworZW51bSBiZmlfaW9jX2kyaF9tc2dzIHsKKwlCRklfSU9DX0kySF9FTkFCTEVfUkVQTFkJPSBCRkFfSTJITSgxKSwKKwlCRklfSU9DX0kySF9ESVNBQkxFX1JFUExZIAk9IEJGQV9JMkhNKDIpLAorCUJGSV9JT0NfSTJIX0dFVEFUVFJfUkVQTFkgCT0gQkZBX0kySE0oMyksCisJQkZJX0lPQ19JMkhfUkVBRFlfRVZFTlQgCT0gQkZBX0kySE0oNCksCisJQkZJX0lPQ19JMkhfSEJFQVQJCT0gQkZBX0kySE0oNSksCit9OworCisvKioKKyAqIEJGSV9JT0NfSDJJX0dFVEFUVFJfUkVRIG1lc3NhZ2UKKyAqLworc3RydWN0IGJmaV9pb2NfZ2V0YXR0cl9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7CisJdW5pb24gYmZpX2FkZHJfdQlhdHRyX2FkZHI7Cit9OworCitzdHJ1Y3QgYmZpX2lvY19hdHRyX3MgeworCXd3bl90ICAgICAgICAgICBtZmdfd3duOworCW1hY190CQltZmdfbWFjOworCXUxNglyc3ZkX2E7CisJY2hhciAgICAgICAgICAgIGJyY2Rfc2VyaWFsbnVtW1NUUlNaKEJGQV9NRkdfU0VSSUFMTlVNX1NJWkUpXTsKKwl1OCAgICAgICAgIHBjaWVfZ2VuOworCXU4ICAgICAgICAgcGNpZV9sYW5lc19vcmlnOworCXU4ICAgICAgICAgcGNpZV9sYW5lczsKKwl1OCAgICAgICAgIHJ4X2JiY3JlZGl0OwkvKiAgcmVjZWl2ZSBidWZmZXIgY3JlZGl0cyAqLworCXUzMiAgICAgICAgYWRhcHRlcl9wcm9wOwkvKiAgYWRhcHRlciBwcm9wZXJ0aWVzICAgICAqLworCXUxNiAgICAgICAgbWF4ZnJzaXplOwkvKiAgbWF4IHJlY2VpdmUgZnJhbWUgc2l6ZSAqLworCWNoYXIgICAgICAgICAJYXNpY19yZXY7CisJdTggICAgICAgICByc3ZkX2I7CisJY2hhciAgICAgICAgICAgIGZ3X3ZlcnNpb25bQkZBX1ZFUlNJT05fTEVOXTsKKwljaGFyICAgICAgICAgICAgb3B0cm9tX3ZlcnNpb25bQkZBX1ZFUlNJT05fTEVOXTsKKwlzdHJ1Y3QgYmZhX21mZ192cGRfcwl2cGQ7Cit9OworCisvKioKKyAqIEJGSV9JT0NfSTJIX0dFVEFUVFJfUkVQTFkgbWVzc2FnZQorICovCitzdHJ1Y3QgYmZpX2lvY19nZXRhdHRyX3JlcGx5X3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBDb21tb24gbXNnIGhlYWRlciAgICAgICAgICAqLworCXU4CQlzdGF0dXM7CS8qICBjZmcgcmVwbHkgc3RhdHVzICAgICAgICAgICAqLworCXU4CQlyc3ZkWzNdOworfTsKKworLyoqCisgKiBGaXJtd2FyZSBtZW1vcnkgcGFnZSBvZmZzZXRzCisgKi8KKyNkZWZpbmUgQkZJX0lPQ19TTUVNX1BHMF9DQgkoMHg0MCkKKyNkZWZpbmUgQkZJX0lPQ19TTUVNX1BHMF9DVAkoMHgxODApCisKKy8qKgorICogRmlybXdhcmUgdHJhY2Ugb2Zmc2V0CisgKi8KKyNkZWZpbmUgQkZJX0lPQ19UUkNfT0ZGCQkoMHg0YjAwKQorI2RlZmluZSBCRklfSU9DX1RSQ19FTlRTCTI1NgorCisjZGVmaW5lIEJGSV9JT0NfRldfU0lHTkFUVVJFCSgweGJmYWRiZmFkKQorI2RlZmluZSBCRklfSU9DX01ENVNVTV9TWgk0CitzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyB7CisJdTMyICAgICAgICBzaWduYXR1cmU7CS8qICBjb25zdGFudCBzaWduYXR1cmUgKi8KKwl1MzIgICAgICAgIHJzdmRfYTsKKwl1MzIgICAgICAgIGV4ZWM7CQkvKiAgZXhlYyB2ZWN0b3IgICAgICAgICovCisJdTMyICAgICAgICBwYXJhbTsJCS8qICBwYXJhbWV0ZXJzICAgICAgICAgKi8KKwl1MzIgICAgICAgIHJzdmRfYls0XTsKKwl1MzIgICAgICAgIG1kNXN1bVtCRklfSU9DX01ENVNVTV9TWl07Cit9OworCisvKioKKyAqICBCRklfSU9DX0kySF9SRUFEWV9FVkVOVCBtZXNzYWdlCisgKi8KK3N0cnVjdCBiZmlfaW9jX3JkeV9ldmVudF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkJLyogIGNvbW1vbiBtc2cgaGVhZGVyICovCisJdTggICAgICAgICBpbml0X3N0YXR1czsJLyogIGluaXQgZXZlbnQgc3RhdHVzICovCisJdTggICAgICAgICByc3ZkWzNdOworfTsKKworc3RydWN0IGJmaV9pb2NfaGJlYXRfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXUzMgkgICBoYl9jb3VudDsJLyogIGN1cnJlbnQgaGVhcnQgYmVhdCBjb3VudAkqLworfTsKKworLyoqCisgKiBJT0MgaGFyZHdhcmUvZmlybXdhcmUgc3RhdGUKKyAqLworZW51bSBiZmlfaW9jX3N0YXRlIHsKKwlCRklfSU9DX1VOSU5JVCAJID0gMCwJCS8qICBub3QgaW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICovCisJQkZJX0lPQ19JTklUSU5HIAkgPSAxLAkvKiAgaC93IGlzIGJlaW5nIGluaXRpYWxpemVkICAgICAgICAqLworCUJGSV9JT0NfSFdJTklUIAkgPSAyLAkJLyogIGgvdyBpcyBpbml0aWFsaXplZCAgICAgICAgICAgICAgKi8KKwlCRklfSU9DX0NGRyAJID0gMywJCS8qICBJT0MgY29uZmlndXJhdGlvbiBpbiBwcm9ncmVzcyAgICovCisJQkZJX0lPQ19PUCAJCSA9IDQsCS8qICBJT0MgaXMgb3BlcmF0aW9uYWwgICAgICAgICAgICAgICovCisJQkZJX0lPQ19ESVNBQkxJTkcgCSA9IDUsCS8qICBJT0MgaXMgYmVpbmcgZGlzYWJsZWQgICAgICAgICAgICovCisJQkZJX0lPQ19ESVNBQkxFRCAJID0gNiwJLyogIElPQyBpcyBkaXNhYmxlZCAgICAgICAgICAgICAgICAgKi8KKwlCRklfSU9DX0NGR19ESVNBQkxFRCA9IDcsCS8qICBJT0MgaXMgYmVpbmcgZGlzYWJsZWQ7dHJhbnNpZW50ICovCisJQkZJX0lPQ19IQkZBSUwgICAgICAgPSA4LAkvKiAgSU9DIGhlYXJ0LWJlYXQgZmFpbHVyZSAgICAgICAgICAqLworCUJGSV9JT0NfTUVNVEVTVCAgICAgID0gOSwJLyogIElPQyBpcyBkb2luZyBtZW10ZXN0ICAgICAgICAgICAgKi8KK307CisKKyNkZWZpbmUgQkZJX0lPQ19FTkRJQU5fU0lHICAweDEyMzQ1Njc4CisKK2VudW0geworCUJGSV9BREFQVEVSX1RZUEVfRkMgICA9IDB4MDEsCQkvKiAgRkMgYWRhcHRlcnMgICAgICAgICAgICovCisJQkZJX0FEQVBURVJfVFlQRV9NSyAgID0gMHgwZjAwMDAsCS8qICBhZGFwdGVyIHR5cGUgbWFzayAgICAgKi8KKwlCRklfQURBUFRFUl9UWVBFX1NIICAgPSAxNiwJICAgICAgICAvKiAgYWRhcHRlciB0eXBlIHNoaWZ0ICAgICovCisJQkZJX0FEQVBURVJfTlBPUlRTX01LID0gMHhmZjAwLAkJLyogIG51bWJlciBvZiBwb3J0cyBtYXNrICAqLworCUJGSV9BREFQVEVSX05QT1JUU19TSCA9IDgsCSAgICAgICAgLyogIG51bWJlciBvZiBwb3J0cyBzaGlmdCAqLworCUJGSV9BREFQVEVSX1NQRUVEX01LICA9IDB4ZmYsCQkvKiAgYWRhcHRlciBzcGVlZCBtYXNrICAgICovCisJQkZJX0FEQVBURVJfU1BFRURfU0ggID0gMCwJICAgICAgICAvKiAgYWRhcHRlciBzcGVlZCBzaGlmdCAgICovCisJQkZJX0FEQVBURVJfUFJPVE8gICAgID0gMHgxMDAwMDAsCS8qICBwcm90b3R5cGUgYWRhcGF0ZXJzICAgKi8KKwlCRklfQURBUFRFUl9UVFYgICAgICAgPSAweDIwMDAwMCwJLyogIFRUViBkZWJ1ZyBjYXBhYmxlICAgICAqLworCUJGSV9BREFQVEVSX1VOU1VQUCAgICA9IDB4NDAwMDAwLAkvKiAgdW5rbm93biBhZGFwdGVyIHR5cGUgICovCit9OworCisjZGVmaW5lIEJGSV9BREFQVEVSX0dFVFAoX19wcm9wLF9fYWRhcF9wcm9wKSAgICAgICAgICAJCVwKKyAgICAoKChfX2FkYXBfcHJvcCkgJiBCRklfQURBUFRFUl8gIyMgX19wcm9wICMjIF9NSykgPj4gICAgICAgICBcCisgICAgIEJGSV9BREFQVEVSXyAjIyBfX3Byb3AgIyMgX1NIKQorI2RlZmluZSBCRklfQURBUFRFUl9TRVRQKF9fcHJvcCwgX192YWwpICAgICAgICAgCQlcCisgICAgKChfX3ZhbCkgPDwgQkZJX0FEQVBURVJfICMjIF9fcHJvcCAjIyBfU0gpCisjZGVmaW5lIEJGSV9BREFQVEVSX0lTX1BST1RPKF9fYWRhcF90eXBlKSAgIAkJCVwKKyAgICAoKF9fYWRhcF90eXBlKSAmIEJGSV9BREFQVEVSX1BST1RPKQorI2RlZmluZSBCRklfQURBUFRFUl9JU19UVFYoX19hZGFwX3R5cGUpICAgICAJCQlcCisgICAgKChfX2FkYXBfdHlwZSkgJiBCRklfQURBUFRFUl9UVFYpCisjZGVmaW5lIEJGSV9BREFQVEVSX0lTX1VOU1VQUChfX2FkYXBfdHlwZSkgIAkJCVwKKyAgICAoKF9fYWRhcF90eXBlKSAmIEJGSV9BREFQVEVSX1VOU1VQUCkKKyNkZWZpbmUgQkZJX0FEQVBURVJfSVNfU1BFQ0lBTChfX2FkYXBfdHlwZSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChfX2FkYXBfdHlwZSkgJiAoQkZJX0FEQVBURVJfVFRWIHwgQkZJX0FEQVBURVJfUFJPVE8gfCAgICAgXAorCQkJQkZJX0FEQVBURVJfVU5TVVBQKSkKKworLyoqCisgKiBCRklfSU9DX0gySV9FTkFCTEVfUkVRICYgQkZJX0lPQ19IMklfRElTQUJMRV9SRVEgbWVzc2FnZXMKKyAqLworc3RydWN0IGJmaV9pb2NfY3RybF9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7CisJdTgJCQlpb2NfY2xhc3M7CisJdTggICAgICAgICAJcnN2ZFszXTsKK307CisKKy8qKgorICogQkZJX0lPQ19JMkhfRU5BQkxFX1JFUExZICYgQkZJX0lPQ19JMkhfRElTQUJMRV9SRVBMWSBtZXNzYWdlcworICovCitzdHJ1Y3QgYmZpX2lvY19jdHJsX3JlcGx5X3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBDb21tb24gbXNnIGhlYWRlciAgICAgKi8KKwl1OCAgICAgICAgIHN0YXR1czsJCS8qICBlbmFibGUvZGlzYWJsZSBzdGF0dXMgKi8KKwl1OCAgICAgICAgIHJzdmRbM107Cit9OworCisjZGVmaW5lIEJGSV9JT0NfTVNHU1ogICA4CisvKioKKyAqIEgySSBNZXNzYWdlcworICovCit1bmlvbiBiZmlfaW9jX2gyaV9tc2dfdSB7CisJc3RydWN0IGJmaV9taGRyX3MgCW1oOworCXN0cnVjdCBiZmlfaW9jX2N0cmxfcmVxX3MgZW5hYmxlX3JlcTsKKwlzdHJ1Y3QgYmZpX2lvY19jdHJsX3JlcV9zIGRpc2FibGVfcmVxOworCXN0cnVjdCBiZmlfaW9jX2dldGF0dHJfcmVxX3MgZ2V0YXR0cl9yZXE7CisJdTMyICAgICAgIAkJbWJveG1zZ1tCRklfSU9DX01TR1NaXTsKK307CisKKy8qKgorICogSTJIIE1lc3NhZ2VzCisgKi8KK3VuaW9uIGJmaV9pb2NfaTJoX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgICAgIAltaDsKKwlzdHJ1Y3QgYmZpX2lvY19yZHlfZXZlbnRfcyAJcmR5X2V2ZW50OworCXUzMiAgICAgICAJCW1ib3htc2dbQkZJX0lPQ19NU0dTWl07Cit9OworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogX19CRklfSU9DX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9pb2NmYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfaW9jZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc2MGRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfaW9jZmMuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZJX0lPQ0ZDX0hfXworI2RlZmluZSBfX0JGSV9JT0NGQ19IX18KKworI2luY2x1ZGUgImJmaS5oIgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfaW9jLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19pb2NmYy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfYm9vdC5oPgorCisjcHJhZ21hIHBhY2soMSkKKworZW51bSBiZmlfaW9jZmNfaDJpX21zZ3MgeworCUJGSV9JT0NGQ19IMklfQ0ZHX1JFUSAJCT0gMSwKKwlCRklfSU9DRkNfSDJJX0dFVF9TVEFUU19SRVEgCT0gMiwKKwlCRklfSU9DRkNfSDJJX0NMRUFSX1NUQVRTX1JFUQk9IDMsCisJQkZJX0lPQ0ZDX0gySV9TRVRfSU5UUl9SRVEgCT0gNCwKKwlCRklfSU9DRkNfSDJJX1VQREFURVFfUkVRID0gNSwKK307CisKK2VudW0gYmZpX2lvY2ZjX2kyaF9tc2dzIHsKKwlCRklfSU9DRkNfSTJIX0NGR19SRVBMWQkJPSBCRkFfSTJITSgxKSwKKwlCRklfSU9DRkNfSTJIX0dFVF9TVEFUU19SU1AgCT0gQkZBX0kySE0oMiksCisJQkZJX0lPQ0ZDX0kySF9DTEVBUl9TVEFUU19SU1AJPSBCRkFfSTJITSgzKSwKKwlCRklfSU9DRkNfSTJIX1VQREFURVFfUlNQID0gQkZBX0kySE0oNSksCit9OworCitzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19zIHsKKwl1OCAgICAgICAgIG51bV9jcXM7IAkvKiAgTnVtYmVyIG9mIENRcyB0byBiZSB1c2VkICAgICAqLworCXU4ICAgICAgICAgc2Vuc2VfYnVmX2xlbjsJLyogIFNDU0kgc2Vuc2UgbGVuZ3RoICAgICAgICAgICAgKi8KKwl1OCAgICAgICAgIHRydW5rX2VuYWJsZWQ7CS8qICBwb3J0IHRydW5raW5nIGVuYWJsZWQgICAgICAgICovCisJdTggICAgICAgICB0cnVua19wb3J0czsJLyogIHRydW5rIHBvcnRzIGJpdCBtYXAgICAgICAgICAgKi8KKwl1MzIgICAgICAgIGVuZGlhbl9zaWc7CS8qICBlbmRpYW4gc2lnbmF0dXJlIG9mIGhvc3QgICAgICovCisKKwkvKioKKwkgKiBSZXF1ZXN0IGFuZCByZXNwb25zZSBjaXJjdWxhciBxdWV1ZSBiYXNlIGFkZHJlc3Nlcywgc2l6ZSBhbmQKKwkgKiBzaGFkb3cgaW5kZXggcG9pbnRlcnMuCisJICovCisJdW5pb24gYmZpX2FkZHJfdSAgcmVxX2NxX2JhW0JGSV9JT0NfTUFYX0NRU107CisJdW5pb24gYmZpX2FkZHJfdSAgcmVxX3NoYWRvd19jaVtCRklfSU9DX01BWF9DUVNdOworCXUxNiAgICByZXFfY3FfZWxlbXNbQkZJX0lPQ19NQVhfQ1FTXTsKKwl1bmlvbiBiZmlfYWRkcl91ICByc3BfY3FfYmFbQkZJX0lPQ19NQVhfQ1FTXTsKKwl1bmlvbiBiZmlfYWRkcl91ICByc3Bfc2hhZG93X3BpW0JGSV9JT0NfTUFYX0NRU107CisJdTE2ICAgIHJzcF9jcV9lbGVtc1tCRklfSU9DX01BWF9DUVNdOworCisJdW5pb24gYmZpX2FkZHJfdSAgc3RhdHNfYWRkcjsJLyogIERNQS1hYmxlIGFkZHJlc3MgZm9yIHN0YXRzCSAgKi8KKwl1bmlvbiBiZmlfYWRkcl91ICBjZmdyc3BfYWRkcjsJLyogIGNvbmZpZyByZXNwb25zZSBkbWEgYWRkcmVzcyAgKi8KKwl1bmlvbiBiZmlfYWRkcl91ICBpb2ltX3Nuc2Jhc2U7ICAvKiAgSU8gc2Vuc2UgYnVmZmVyIGJhc2UgYWRkcmVzcyAqLworCXN0cnVjdCBiZmFfaW9jZmNfaW50cl9hdHRyX3MgaW50cl9hdHRyOyAvKiAgSU9DIGludGVycnVwdCBhdHRyaWJ1dGVzICovCit9OworCisvKioKKyAqIEJvb3QgdGFyZ2V0IHd3biBpbmZvcm1hdGlvbiBmb3IgdGhpcyBwb3J0LiBUaGlzIGNvbnRhaW5zIGVpdGhlciB0aGUgc3RvcmVkCisgKiBvciBkaXNjb3ZlcmVkIGJvb3QgdGFyZ2V0IHBvcnQgd3ducyBmb3IgdGhlIHBvcnQuCisgKi8KK3N0cnVjdCBiZmlfaW9jZmNfYm9vdHd3bnMgeworCXd3bl90CQl3d25bQkZBX0JPT1RfQk9PVExVTl9NQVhdOworCXU4CQlud3duczsKKwl1OAkJcnN2ZFs3XTsKK307CisKK3N0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MgeworCXN0cnVjdCBiZmFfaW9jZmNfZndjZmdfcwlmd2NmZzsKKwlzdHJ1Y3QgYmZhX2lvY2ZjX2ludHJfYXR0cl9zCWludHJfYXR0cjsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX2Jvb3R3d25zCWJvb3R3d25zOworfTsKKworLyoqCisgKiBCRklfSU9DRkNfSDJJX0NGR19SRVEgbWVzc2FnZQorICovCitzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgICAgICBtaDsKKwl1bmlvbiBiZmlfYWRkcl91ICAgICAgaW9jX2NmZ19kbWFfYWRkcjsKK307CisKKy8qKgorICogQkZJX0lPQ0ZDX0kySF9DRkdfUkVQTFkgbWVzc2FnZQorICovCitzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19yZXBseV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgQ29tbW9uIG1zZyBoZWFkZXIgICAgICAgICAgKi8KKwl1OCAgICAgICAgIGNmZ19zdWNjZXNzOwkvKiAgY2ZnIHJlcGx5IHN0YXR1cyAgICAgICAgICAgKi8KKwl1OCAgICAgICAgIGxwdV9ibTsJCS8qICBMUFVzIGFzc2lnbmVkIGZvciB0aGlzIElPQyAqLworCXU4ICAgICAgICAgcnN2ZFsyXTsKK307CisKKy8qKgorICogIEJGSV9JT0NGQ19IMklfR0VUX1NUQVRTX1JFUSAmIEJGSV9JT0NGQ19IMklfQ0xFQVJfU1RBVFNfUkVRIG1lc3NhZ2VzCisgKi8KK3N0cnVjdCBiZmlfaW9jZmNfc3RhdHNfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zIG1oOwkJLyogIG1zZyBoZWFkZXIgICAgICAgICAgICAqLworCXUzMiAgICAgICAgbXNndGFnOwkJLyogIG1zZ3RhZyBmb3IgcmVwbHkgICAgICAqLworfTsKKworLyoqCisgKiBCRklfSU9DRkNfSTJIX0dFVF9TVEFUU19SU1AgJiBCRklfSU9DRkNfSTJIX0NMRUFSX1NUQVRTX1JTUCBtZXNzYWdlcworICovCitzdHJ1Y3QgYmZpX2lvY2ZjX3N0YXRzX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlciAgICAgKi8KKwl1OCAgICAgICAgIHN0YXR1czsJCS8qICByZXBseSBzdGF0dXMgICAgICAgICAgKi8KKwl1OCAgICAgICAgIHJzdmRbM107CisJdTMyICAgICAgICBtc2d0YWc7CQkvKiAgbXNndGFnIGZvciByZXBseSAgICAgICovCit9OworCisvKioKKyAqIEJGSV9JT0NGQ19IMklfU0VUX0lOVFJfUkVRIG1lc3NhZ2UKKyAqLworc3RydWN0IGJmaV9pb2NmY19zZXRfaW50cl9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIgICAgICovCisJdTgJCWNvYWxlc2NlOwkvKiAgZW5hYmxlIGludHIgY29hbGVzY2luZyovCisJdTggICAgICAgICByc3ZkWzNdOworCXUxNglkZWxheTsJCS8qICBkZWxheSB0aW1lciAwLi4xMTI1dXMgICovCisJdTE2CWxhdGVuY3k7CS8qICBsYXRlbmN5IHRpbWVyIDAuLjIyNXVzICovCit9OworCisvKioKKyAqIEJGSV9JT0NGQ19IMklfVVBEQVRFUV9SRVEgbWVzc2FnZQorICovCitzdHJ1Y3QgYmZpX2lvY2ZjX3VwZGF0ZXFfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyICAgICAqLworCXUzMiByZXFxX2JhOwkJCS8qICByZXFxIGJhc2UgYWRkciAgICAgICAgKi8KKwl1MzIgcnNwcV9iYTsJCQkvKiAgcnNwcSBiYXNlIGFkZHIgICAgICAgICovCisJdTMyIHJlcXFfc2NpOwkJCS8qICByZXFxIHNoYWRvdyBjaSAgICAgICAgKi8KKwl1MzIgcnNwcV9zcGk7CQkJLyogIHJzcHEgc2hhZG93IHBpICAgICAgICAqLworfTsKKworLyoqCisgKiBCRklfSU9DRkNfSTJIX1VQREFURVFfUlNQIG1lc3NhZ2UKKyAqLworc3RydWN0IGJmaV9pb2NmY191cGRhdGVxX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlciAgICAgKi8KKwl1OCAgICAgICAgIHN0YXR1czsJCS8qICB1cGRhdGVxICBzdGF0dXMgICAgICAgKi8KKwl1OCAgICAgICAgIHJzdmRbM107Cit9OworCisvKioKKyAqIEgySSBNZXNzYWdlcworICovCit1bmlvbiBiZmlfaW9jZmNfaDJpX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAJCW1oOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZnX3JlcV9zIAljZmdfcmVxOworCXN0cnVjdCBiZmlfaW9jZmNfc3RhdHNfcmVxX3Mgc3RhdHNfZ2V0OworCXN0cnVjdCBiZmlfaW9jZmNfc3RhdHNfcmVxX3Mgc3RhdHNfY2xyOworCXN0cnVjdCBiZmlfaW9jZmNfdXBkYXRlcV9yZXFfcyB1cGRhdGVxX3JlcTsKKwl1MzIgICAgICAgCQkJbWJveG1zZ1tCRklfSU9DX01TR1NaXTsKK307CisKKy8qKgorICogSTJIIE1lc3NhZ2VzCisgKi8KK3VuaW9uIGJmaV9pb2NmY19pMmhfbXNnX3UgeworCXN0cnVjdCBiZmlfbWhkcl9zICAgICAgCQltaDsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19yZXBseV9zIAkJY2ZnX3JlcGx5OworCXN0cnVjdCBiZmlfaW9jZmNfc3RhdHNfcnNwX3Mgc3RhdHNfZ2V0X3JzcDsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX3N0YXRzX3JzcF9zIHN0YXRzX2Nscl9yc3A7CisJc3RydWN0IGJmaV9pb2NmY191cGRhdGVxX3JzcF9zIHVwZGF0ZXFfcnNwOworCXUzMiAgICAgICAJCQltYm94bXNnW0JGSV9JT0NfTVNHU1pdOworfTsKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmIC8qIF9fQkZJX0lPQ0ZDX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9scG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfbHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAxMDYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfbHBvcnQuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRklfTFBPUlRfSF9fCisjZGVmaW5lIF9fQkZJX0xQT1JUX0hfXworCisjaW5jbHVkZSA8YmZpL2JmaS5oPgorCisjcHJhZ21hIHBhY2soMSkKKworZW51bSBiZmlfbHBvcnRfaDJpX21zZ3MgeworCUJGSV9MUE9SVF9IMklfQ1JFQVRFX1JFUSA9IDEsCisJQkZJX0xQT1JUX0gySV9ERUxFVEVfUkVRID0gMiwKK307CisKK2VudW0gYmZpX2xwb3J0X2kyaF9tc2dzIHsKKwlCRklfTFBPUlRfSTJIX0NSRUFURV9SU1AgPSBCRkFfSTJITSgxKSwKKwlCRklfTFBPUlRfSTJIX0RFTEVURV9SU1AgPSBCRkFfSTJITSgyKSwKKwlCRklfTFBPUlRfSTJIX09OTElORQkgID0gQkZBX0kySE0oMyksCisJQkZJX0xQT1JUX0kySF9PRkZMSU5FCSAgPSBCRkFfSTJITSg0KSwKK307CisKKyNkZWZpbmUgQkZJX0xQT1JUX01BWF9TWU5OQU1FCTY0CisKK2VudW0gYmZpX2xwb3J0X3JvbGVfZSB7CisJQkZJX0xQT1JUX1JPTEVfRkNQSU0JPSAxLAorCUJGSV9MUE9SVF9ST0xFX0ZDUFRNCT0gMiwKKwlCRklfTFBPUlRfUk9MRV9JUEZDCT0gNCwKK307CisKK3N0cnVjdCBiZmlfbHBvcnRfY3JlYXRlX3JlcV9zIHsKKwliZmlfbWhkcl90CW1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXUxNglmYWJyaWNfZndoZGw7CS8qICBwYXJlbnQgZmFicmljIGluc3RhbmNlCSovCisJdTgJCXJvbGVzOwkJLyogIGxwb3J0IEZDLTQgcm9sZXMJCSovCisJdTgJCXJzdmQ7CisJd3duX3QJCXB3d247CQkvKiAgcG9ydCBuYW1lCQkJKi8KKwl3d25fdAkJbnd3bjsJCS8qICBub2RlIG5hbWUJCQkqLworCXU4CQlzeW1uYW1lW0JGSV9MUE9SVF9NQVhfU1lOTkFNRV07Cit9OworCitzdHJ1Y3QgYmZpX2xwb3J0X2NyZWF0ZV9yc3BfcyB7CisJYmZpX21oZHJfdAltaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KKwl1OCAgICAgICAgIHN0YXR1czsJCS8qICBscG9ydCBjcmVhdGlvbiBzdGF0dXMJKi8KKwl1OCAgICAgICAgIHJzdmRbM107Cit9OworCitzdHJ1Y3QgYmZpX2xwb3J0X2RlbGV0ZV9yZXFfcyB7CisJYmZpX21oZHJfdAltaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KKwl1MTYgICAgICAgIGZ3X2hhbmRsZTsJLyogIGZpcm13YXJlIGxwb3J0IGhhbmRsZQkqLworCXUxNiAgICAgICAgcnN2ZDsKK307CisKK3N0cnVjdCBiZmlfbHBvcnRfZGVsZXRlX3JzcF9zIHsKKwliZmlfbWhkcl90CW1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXUxNiAgICAgICAgYmZhX2hhbmRsZTsJLyogIGhvc3QgbHBvcnQgaGFuZGxlCQkqLworCXU4ICAgICAgICAgc3RhdHVzOwkJLyogIGxwb3J0IGRlbGV0aW9uIHN0YXR1cwkqLworCXU4ICAgICAgICAgcnN2ZDsKK307CisKK3VuaW9uIGJmaV9scG9ydF9oMmlfbXNnX3UgeworCWJmaV9tc2dfdAkJKm1zZzsKKwlzdHJ1Y3QgYmZpX2xwb3J0X2NyZWF0ZV9yZXFfcwkqY3JlYXRlX3JlcTsKKwlzdHJ1Y3QgYmZpX2xwb3J0X2RlbGV0ZV9yZXFfcwkqZGVsZXRlX3JlcTsKK307CisKK3VuaW9uIGJmaV9scG9ydF9pMmhfbXNnX3UgeworCWJmaV9tc2dfdAkJKm1zZzsKKwlzdHJ1Y3QgYmZpX2xwb3J0X2NyZWF0ZV9yc3BfcwkqY3JlYXRlX3JzcDsKKwlzdHJ1Y3QgYmZpX2xwb3J0X2RlbGV0ZV9yc3BfcwkqZGVsZXRlX3JzcDsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZiAvKiBfX0JGSV9MUE9SVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfbHBzLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9scHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRiMGUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfbHBzLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZJX0xQU19IX18KKyNkZWZpbmUgX19CRklfTFBTX0hfXworCisjaW5jbHVkZSA8YmZpL2JmaS5oPgorCisjcHJhZ21hIHBhY2soMSkKKworZW51bSBiZmlfbHBzX2gyaV9tc2dzIHsKKwlCRklfTFBTX0gySV9MT0dJTl9SRVEJPSAxLAorCUJGSV9MUFNfSDJJX0xPR09VVF9SRVEJPSAyLAorfTsKKworZW51bSBiZmlfbHBzX2kyaF9tc2dzIHsKKwlCRklfTFBTX0gySV9MT0dJTl9SU1AJPSBCRkFfSTJITSgxKSwKKwlCRklfTFBTX0gySV9MT0dPVVRfUlNQCT0gQkZBX0kySE0oMiksCit9OworCitzdHJ1Y3QgYmZpX2xwc19sb2dpbl9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXU4CQlscF90YWc7CisJdTgJCWFscGE7CisJdTE2CXBkdV9zaXplOworCXd3bl90CQlwd3duOworCXd3bl90CQlud3duOworCXU4CQlmZGlzYzsKKwl1OAkJYXV0aF9lbjsKKwl1OAkJcnN2ZFsyXTsKK307CisKK3N0cnVjdCBiZmlfbHBzX2xvZ2luX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSovCisJdTgJCWxwX3RhZzsKKwl1OAkJc3RhdHVzOworCXU4CQlsc3JqdF9yc247CisJdTgJCWxzcmp0X2V4cGw7CisJd3duX3QJCXBvcnRfbmFtZTsKKwl3d25fdAkJbm9kZV9uYW1lOworCXUxNgliYl9jcmVkaXQ7CisJdTgJCWZfcG9ydDsKKwl1OAkJbnBpdl9lbjsKKwl1MzIJbHBfcGlkIDogMjQ7CisJdTMyCWF1dGhfcmVxIDogODsKKwltYWNfdAkJbHBfbWFjOworCW1hY190CQlmY2ZfbWFjOworCXU4CQlleHRfc3RhdHVzOworCXU4ICAJYnJjZF9zd2l0Y2g7LyogIGF0dGFjaGVkIHBlZXIgaXMgYnJjZCBzd2l0Y2gJKi8KK307CisKK3N0cnVjdCBiZmlfbHBzX2xvZ291dF9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXU4CQlscF90YWc7CisJdTgJCXJzdmRbM107CisJd3duX3QJCXBvcnRfbmFtZTsKK307CisKK3N0cnVjdCBiZmlfbHBzX2xvZ291dF9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXU4CQlscF90YWc7CisJdTgJCXN0YXR1czsKKwl1OAkJcnN2ZFsyXTsKK307CisKK3VuaW9uIGJmaV9scHNfaDJpX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwkJKm1zZzsKKwlzdHJ1Y3QgYmZpX2xwc19sb2dpbl9yZXFfcwkqbG9naW5fcmVxOworCXN0cnVjdCBiZmlfbHBzX2xvZ291dF9yZXFfcwkqbG9nb3V0X3JlcTsKK307CisKK3VuaW9uIGJmaV9scHNfaTJoX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21zZ19zCQkqbXNnOworCXN0cnVjdCBiZmlfbHBzX2xvZ2luX3JzcF9zCSpsb2dpbl9yc3A7CisJc3RydWN0IGJmaV9scHNfbG9nb3V0X3JzcF9zCSpsb2dvdXRfcnNwOworfTsKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmIC8qIF9fQkZJX0xQU19IX18gKi8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9wb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV9wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjM2JlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3BvcnQuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0JGSV9QT1JUX0hfXworI2RlZmluZSBfX0JGSV9QT1JUX0hfXworCisjaW5jbHVkZSA8YmZpL2JmaS5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcHBvcnQuaD4KKworI3ByYWdtYSBwYWNrKDEpCisKK2VudW0gYmZpX3BvcnRfaDJpIHsKKwlCRklfUE9SVF9IMklfRU5BQkxFX1JFUQkJPSAoMSksCisJQkZJX1BPUlRfSDJJX0RJU0FCTEVfUkVRCT0gKDIpLAorCUJGSV9QT1JUX0gySV9HRVRfU1RBVFNfUkVRCT0gKDMpLAorCUJGSV9QT1JUX0gySV9DTEVBUl9TVEFUU19SRVEJPSAoNCksCit9OworCitlbnVtIGJmaV9wb3J0X2kyaCB7CisJQkZJX1BPUlRfSTJIX0VOQUJMRV9SU1AJCT0gQkZBX0kySE0oMSksCisJQkZJX1BPUlRfSTJIX0RJU0FCTEVfUlNQCT0gQkZBX0kySE0oMiksCisJQkZJX1BPUlRfSTJIX0dFVF9TVEFUU19SU1AJPSBCRkFfSTJITSgzKSwKKwlCRklfUE9SVF9JMkhfQ0xFQVJfU1RBVFNfUlNQCT0gQkZBX0kySE0oNCksCit9OworCisvKioKKyAqIEdlbmVyaWMgUkVRIHR5cGUKKyAqLworc3RydWN0IGJmaV9wb3J0X2dlbmVyaWNfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBtc2cgaGVhZGVyCQkJICAgICovCisJdTMyICAgICAgICBtc2d0YWc7CQkvKiAgbXNndGFnIGZvciByZXBseQkJICAgICovCisJdTMyCXJzdmQ7Cit9OworCisvKioKKyAqIEdlbmVyaWMgUlNQIHR5cGUKKyAqLworc3RydWN0IGJmaV9wb3J0X2dlbmVyaWNfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJICAgICovCisJdTggICAgICAgICBzdGF0dXM7CQkvKiAgcG9ydCBlbmFibGUgc3RhdHVzCQkgICAgKi8KKwl1OCAgICAgICAgIHJzdmRbM107CisJdTMyICAgICAgICBtc2d0YWc7CQkvKiAgbXNndGFnIGZvciByZXBseQkJICAgICovCit9OworCisvKioKKyAqIEB0b2RvCisgKiBCRklfUE9SVF9IMklfRU5BQkxFX1JFUQorICovCisKKy8qKgorICogQHRvZG8KKyAqIEJGSV9QT1JUX0kySF9FTkFCTEVfUlNQCisgKi8KKworLyoqCisgKiBCRklfUE9SVF9IMklfRElTQUJMRV9SRVEKKyAqLworCisvKioKKyAqIEJGSV9QT1JUX0kySF9ESVNBQkxFX1JTUAorICovCisKKy8qKgorICogQkZJX1BPUlRfSDJJX0dFVF9TVEFUU19SRVEKKyAqLworc3RydWN0IGJmaV9wb3J0X2dldF9zdGF0c19yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkgICAgKi8KKwl1bmlvbiBiZmlfYWRkcl91ICAgZG1hX2FkZHI7Cit9OworCisvKioKKyAqIEJGSV9QT1JUX0kySF9HRVRfU1RBVFNfUlNQCisgKi8KKworLyoqCisgKiBCRklfUE9SVF9IMklfQ0xFQVJfU1RBVFNfUkVRCisgKi8KKworLyoqCisgKiBCRklfUE9SVF9JMkhfQ0xFQVJfU1RBVFNfUlNQCisgKi8KKwordW5pb24gYmZpX3BvcnRfaDJpX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwkJbWg7CisJc3RydWN0IGJmaV9wb3J0X2dlbmVyaWNfcmVxX3MJZW5hYmxlX3JlcTsKKwlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yZXFfcwlkaXNhYmxlX3JlcTsKKwlzdHJ1Y3QgYmZpX3BvcnRfZ2V0X3N0YXRzX3JlcV9zCWdldHN0YXRzX3JlcTsKKwlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yZXFfcwljbGVhcnN0YXRzX3JlcTsKK307CisKK3VuaW9uIGJmaV9wb3J0X2kyaF9tc2dfdSB7CisJc3RydWN0IGJmaV9taGRyX3MgICAgICAgICAJbWg7CisJc3RydWN0IGJmaV9wb3J0X2dlbmVyaWNfcnNwX3MJZW5hYmxlX3JzcDsKKwlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yc3BfcwlkaXNhYmxlX3JzcDsKKwlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yc3BfcwlnZXRzdGF0c19yc3A7CisJc3RydWN0IGJmaV9wb3J0X2dlbmVyaWNfcnNwX3MJY2xlYXJzdGF0c19yc3A7Cit9OworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogX19CRklfUE9SVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfcHBvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3Bwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2ZDI0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3Bwb3J0LmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRklfUFBPUlRfSF9fCisjZGVmaW5lIF9fQkZJX1BQT1JUX0hfXworCisjaW5jbHVkZSA8YmZpL2JmaS5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcHBvcnQuaD4KKworI3ByYWdtYSBwYWNrKDEpCisKK2VudW0gYmZpX3Bwb3J0X2gyaSB7CisJQkZJX1BQT1JUX0gySV9FTkFCTEVfUkVRCQk9ICgxKSwKKwlCRklfUFBPUlRfSDJJX0RJU0FCTEVfUkVRCQk9ICgyKSwKKwlCRklfUFBPUlRfSDJJX0dFVF9TVEFUU19SRVEJCT0gKDMpLAorCUJGSV9QUE9SVF9IMklfQ0xFQVJfU1RBVFNfUkVRCT0gKDQpLAorCUJGSV9QUE9SVF9IMklfU0VUX1NWQ19QQVJBTVNfUkVRCT0gKDUpLAorCUJGSV9QUE9SVF9IMklfRU5BQkxFX1JYX1ZGX1RBR19SRVEJPSAoNiksCisJQkZJX1BQT1JUX0gySV9FTkFCTEVfVFhfVkZfVEFHX1JFUQk9ICg3KSwKKwlCRklfUFBPUlRfSDJJX0dFVF9RT1NfU1RBVFNfUkVRCQk9ICg4KSwKKwlCRklfUFBPUlRfSDJJX0NMRUFSX1FPU19TVEFUU19SRVEJPSAoOSksCit9OworCitlbnVtIGJmaV9wcG9ydF9pMmggeworCUJGSV9QUE9SVF9JMkhfRU5BQkxFX1JTUAkJPSBCRkFfSTJITSgxKSwKKwlCRklfUFBPUlRfSTJIX0RJU0FCTEVfUlNQCQk9IEJGQV9JMkhNKDIpLAorCUJGSV9QUE9SVF9JMkhfR0VUX1NUQVRTX1JTUAkJPSBCRkFfSTJITSgzKSwKKwlCRklfUFBPUlRfSTJIX0NMRUFSX1NUQVRTX1JTUAk9IEJGQV9JMkhNKDQpLAorCUJGSV9QUE9SVF9JMkhfU0VUX1NWQ19QQVJBTVNfUlNQCT0gQkZBX0kySE0oNSksCisJQkZJX1BQT1JUX0kySF9FTkFCTEVfUlhfVkZfVEFHX1JTUAk9IEJGQV9JMkhNKDYpLAorCUJGSV9QUE9SVF9JMkhfRU5BQkxFX1RYX1ZGX1RBR19SU1AJPSBCRkFfSTJITSg3KSwKKwlCRklfUFBPUlRfSTJIX0VWRU5UCQkJPSBCRkFfSTJITSg4KSwKKwlCRklfUFBPUlRfSTJIX0dFVF9RT1NfU1RBVFNfUlNQCQk9IEJGQV9JMkhNKDkpLAorCUJGSV9QUE9SVF9JMkhfQ0xFQVJfUU9TX1NUQVRTX1JTUAk9IEJGQV9JMkhNKDEwKSwKK307CisKKy8qKgorICogR2VuZXJpYyBSRVEgdHlwZQorICovCitzdHJ1Y3QgYmZpX3Bwb3J0X2dlbmVyaWNfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBtc2cgaGVhZGVyCQkJICAgICovCisJdTMyICAgICAgICBtc2d0YWc7CQkvKiAgbXNndGFnIGZvciByZXBseQkJICAgICovCit9OworCisvKioKKyAqIEdlbmVyaWMgUlNQIHR5cGUKKyAqLworc3RydWN0IGJmaV9wcG9ydF9nZW5lcmljX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSAgICAqLworCXU4ICAgICAgICAgc3RhdHVzOwkJLyogIHBvcnQgZW5hYmxlIHN0YXR1cwkJICAgICovCisJdTggICAgICAgICByc3ZkWzNdOworCXUzMiAgICAgICAgbXNndGFnOwkJLyogIG1zZ3RhZyBmb3IgcmVwbHkJCSAgICAqLworfTsKKworLyoqCisgKiBCRklfUFBPUlRfSDJJX0VOQUJMRV9SRVEKKyAqLworc3RydWN0IGJmaV9wcG9ydF9lbmFibGVfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBtc2cgaGVhZGVyCQkJICAgICovCisJdTMyICAgICAgICByc3ZkMTsKKwl3d25fdCAgICAgICAgICAgbnd3bjsJCS8qICBub2RlIHd3biBvZiBwaHlzaWNhbCBwb3J0CSAgICAqLworCXd3bl90ICAgICAgICAgICBwd3duOwkJLyogIHBvcnQgd3duIG9mIHBoeXNpY2FsIHBvcnQJICAgICovCisJc3RydWN0IGJmYV9wcG9ydF9jZmdfcyBwb3J0X2NmZzsJLyogIHBvcnQgY29uZmlndXJhdGlvbgkgICAgKi8KKwl1bmlvbiBiZmlfYWRkcl91ICBzdGF0c19kbWFfYWRkcjsJLyogIERNQSBhZGRyZXNzIGZvciBzdGF0cyAgKi8KKwl1MzIgICAgICAgIG1zZ3RhZzsJCS8qICBtc2d0YWcgZm9yIHJlcGx5CQkgICAgKi8KKwl1MzIgICAgICAgIHJzdmQyOworfTsKKworLyoqCisgKiBCRklfUFBPUlRfSTJIX0VOQUJMRV9SU1AKKyAqLworI2RlZmluZSBiZmlfcHBvcnRfZW5hYmxlX3JzcF90IHN0cnVjdCBiZmlfcHBvcnRfZ2VuZXJpY19yc3BfcworCisvKioKKyAqIEJGSV9QUE9SVF9IMklfRElTQUJMRV9SRVEKKyAqLworI2RlZmluZSBiZmlfcHBvcnRfZGlzYWJsZV9yZXFfdCBzdHJ1Y3QgYmZpX3Bwb3J0X2dlbmVyaWNfcmVxX3MKKworLyoqCisgKiBCRklfUFBPUlRfSTJIX0RJU0FCTEVfUlNQCisgKi8KKyNkZWZpbmUgYmZpX3Bwb3J0X2Rpc2FibGVfcnNwX3Qgc3RydWN0IGJmaV9wcG9ydF9nZW5lcmljX3JzcF9zCisKKy8qKgorICogQkZJX1BQT1JUX0gySV9HRVRfU1RBVFNfUkVRCisgKi8KKyNkZWZpbmUgYmZpX3Bwb3J0X2dldF9zdGF0c19yZXFfdCBzdHJ1Y3QgYmZpX3Bwb3J0X2dlbmVyaWNfcmVxX3MKKworLyoqCisgKiBCRklfUFBPUlRfSTJIX0dFVF9TVEFUU19SU1AKKyAqLworI2RlZmluZSBiZmlfcHBvcnRfZ2V0X3N0YXRzX3JzcF90IHN0cnVjdCBiZmlfcHBvcnRfZ2VuZXJpY19yc3BfcworCisvKioKKyAqIEJGSV9QUE9SVF9IMklfQ0xFQVJfU1RBVFNfUkVRCisgKi8KKyNkZWZpbmUgYmZpX3Bwb3J0X2NsZWFyX3N0YXRzX3JlcV90IHN0cnVjdCBiZmlfcHBvcnRfZ2VuZXJpY19yZXFfcworCisvKioKKyAqIEJGSV9QUE9SVF9JMkhfQ0xFQVJfU1RBVFNfUlNQCisgKi8KKyNkZWZpbmUgYmZpX3Bwb3J0X2NsZWFyX3N0YXRzX3JzcF90IHN0cnVjdCBiZmlfcHBvcnRfZ2VuZXJpY19yc3BfcworCisvKioKKyAqIEJGSV9QUE9SVF9IMklfR0VUX1FPU19TVEFUU19SRVEKKyAqLworI2RlZmluZSBiZmlfcHBvcnRfZ2V0X3Fvc19zdGF0c19yZXFfdCBzdHJ1Y3QgYmZpX3Bwb3J0X2dlbmVyaWNfcmVxX3MKKworLyoqCisgKiBCRklfUFBPUlRfSDJJX0dFVF9RT1NfU1RBVFNfUlNQCisgKi8KKyNkZWZpbmUgYmZpX3Bwb3J0X2dldF9xb3Nfc3RhdHNfcnNwX3Qgc3RydWN0IGJmaV9wcG9ydF9nZW5lcmljX3JzcF9zCisKKy8qKgorICogQkZJX1BQT1JUX0gySV9DTEVBUl9RT1NfU1RBVFNfUkVRCisgKi8KKyNkZWZpbmUgYmZpX3Bwb3J0X2NsZWFyX3Fvc19zdGF0c19yZXFfdCBzdHJ1Y3QgYmZpX3Bwb3J0X2dlbmVyaWNfcmVxX3MKKworLyoqCisgKiBCRklfUFBPUlRfSDJJX0NMRUFSX1FPU19TVEFUU19SU1AKKyAqLworI2RlZmluZSBiZmlfcHBvcnRfY2xlYXJfcW9zX3N0YXRzX3JzcF90IHN0cnVjdCBiZmlfcHBvcnRfZ2VuZXJpY19yc3BfcworCisvKioKKyAqIEJGSV9QUE9SVF9IMklfU0VUX1NWQ19QQVJBTVNfUkVRCisgKi8KK3N0cnVjdCBiZmlfcHBvcnRfc2V0X3N2Y19wYXJhbXNfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBtc2cgaGVhZGVyICovCisJdTE2ICAgICAgICB0eF9iYmNyZWRpdDsJLyogIFR4IGNyZWRpdHMgKi8KKwl1MTYgICAgICAgIHJzdmQ7Cit9OworCisvKioKKyAqIEJGSV9QUE9SVF9JMkhfU0VUX1NWQ19QQVJBTVNfUlNQCisgKi8KKworLyoqCisgKiBCRklfUFBPUlRfSTJIX0VWRU5UCisgKi8KK3N0cnVjdCBiZmlfcHBvcnRfZXZlbnRfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgCW1oOwkvKiAgY29tbW9uIG1zZyBoZWFkZXIgKi8KKwlzdHJ1Y3QgYmZhX3Bwb3J0X2xpbmtfcwlsaW5rX3N0YXRlOworfTsKKwordW5pb24gYmZpX3Bwb3J0X2gyaV9tc2dfdSB7CisJc3RydWN0IGJmaV9taGRyX3MJCQkqbWhkcjsKKwlzdHJ1Y3QgYmZpX3Bwb3J0X2VuYWJsZV9yZXFfcwkJKnBlbmFibGU7CisJc3RydWN0IGJmaV9wcG9ydF9nZW5lcmljX3JlcV9zCQkqcGRpc2FibGU7CisJc3RydWN0IGJmaV9wcG9ydF9nZW5lcmljX3JlcV9zCQkqcGdldHN0YXRzOworCXN0cnVjdCBiZmlfcHBvcnRfZ2VuZXJpY19yZXFfcwkJKnBjbGVhcnN0YXRzOworCXN0cnVjdCBiZmlfcHBvcnRfc2V0X3N2Y19wYXJhbXNfcmVxX3MJKnBzZXRzdmNwYXJhbXM7CisJc3RydWN0IGJmaV9wcG9ydF9nZXRfcW9zX3N0YXRzX3JlcV9zCSpwZ2V0cW9zc3RhdHM7CisJc3RydWN0IGJmaV9wcG9ydF9nZW5lcmljX3JlcV9zCQkqcGNsZWFycW9zc3RhdHM7Cit9OworCit1bmlvbiBiZmlfcHBvcnRfaTJoX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21zZ19zCQkJKm1zZzsKKwlzdHJ1Y3QgYmZpX3Bwb3J0X2dlbmVyaWNfcnNwX3MJCSplbmFibGVfcnNwOworCXN0cnVjdCBiZmlfcHBvcnRfZGlzYWJsZV9yc3BfcwkJKmRpc2FibGVfcnNwOworCXN0cnVjdCBiZmlfcHBvcnRfZ2VuZXJpY19yc3BfcwkJKmdldHN0YXRzX3JzcDsKKwlzdHJ1Y3QgYmZpX3Bwb3J0X2NsZWFyX3N0YXRzX3JzcF9zCSpjbGVhcnN0YXRzX3JzcDsKKwlzdHJ1Y3QgYmZpX3Bwb3J0X3NldF9zdmNfcGFyYW1zX3JzcF9zCSpzZXRzdmNwYXJhc21fcnNwOworCXN0cnVjdCBiZmlfcHBvcnRfZ2V0X3Fvc19zdGF0c19yc3BfcwkqZ2V0cW9zc3RhdHNfcnNwOworCXN0cnVjdCBiZmlfcHBvcnRfY2xlYXJfcW9zX3N0YXRzX3JzcF9zCSpjbGVhcnFvc3N0YXRzX3JzcDsKKwlzdHJ1Y3QgYmZpX3Bwb3J0X2V2ZW50X3MJCSpldmVudDsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZiAvKiBfX0JGSV9QUE9SVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2JmaS9iZmlfcnBvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3Jwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyMGY1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3Jwb3J0LmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGSV9SUE9SVF9IX18KKyNkZWZpbmUgX19CRklfUlBPUlRfSF9fCisKKyNpbmNsdWRlIDxiZmkvYmZpLmg+CisKKyNwcmFnbWEgcGFjaygxKQorCitlbnVtIGJmaV9ycG9ydF9oMmlfbXNncyB7CisJQkZJX1JQT1JUX0gySV9DUkVBVEVfUkVRID0gMSwKKwlCRklfUlBPUlRfSDJJX0RFTEVURV9SRVEgPSAyLAorCUJGSV9SUE9SVF9IMklfU0VUX1NQRUVEX1JFUSAgPSAzLAorfTsKKworZW51bSBiZmlfcnBvcnRfaTJoX21zZ3MgeworCUJGSV9SUE9SVF9JMkhfQ1JFQVRFX1JTUCA9IEJGQV9JMkhNKDEpLAorCUJGSV9SUE9SVF9JMkhfREVMRVRFX1JTUCA9IEJGQV9JMkhNKDIpLAorCUJGSV9SUE9SVF9JMkhfUU9TX1NDTiAgICA9IEJGQV9JMkhNKDMpLAorfTsKKworc3RydWN0IGJmaV9ycG9ydF9jcmVhdGVfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KKwl1MTYgICAgICAgIGJmYV9oYW5kbGU7CS8qICBob3N0IHJwb3J0IGhhbmRsZQkJKi8KKwl1MTYgICAgICAgIG1heF9mcm1zejsJLyogIG1heCByY3YgcGR1IHNpemUJCSovCisJdTMyICAgICAgICBwaWQgICAgICAgOiAyNCwJLyogIHJlbW90ZSBwb3J0IElECQkqLworCQkJbHBfdGFnICAgIDogODsJLyogIGxvY2FsIHBvcnQgdGFnCQkqLworCXUzMiAgICAgICAgbG9jYWxfcGlkIDogMjQsCS8qICBsb2NhbCBwb3J0IElECQkqLworCQkJY2lzYyAgICAgIDogODsKKwl1OCAgICAgICAgIGZjX2NsYXNzOwkvKiAgc3VwcG9ydGVkIEZDIGNsYXNzZXMJKi8KKwl1OCAgICAgICAgIHZmX2VuOwkJLyogIHZpcnR1YWwgZmFicmljIGVuYWJsZQkqLworCXUxNiAgICAgICAgdmZfaWQ7CQkvKiAgdmlydHVhbCBmYWJyaWMgSUQJCSovCit9OworCitzdHJ1Y3QgYmZpX3Jwb3J0X2NyZWF0ZV9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXU4ICAgICAgICAgc3RhdHVzOwkJLyogIHJwb3J0IGNyZWF0aW9uIHN0YXR1cwkqLworCXU4ICAgICAgICAgcnN2ZFszXTsKKwl1MTYgICAgICAgIGJmYV9oYW5kbGU7CS8qICBob3N0IHJwb3J0IGhhbmRsZQkJKi8KKwl1MTYgICAgICAgIGZ3X2hhbmRsZTsJLyogIGZpcm13YXJlIHJwb3J0IGhhbmRsZQkqLworCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBxb3NfYXR0cjsgIC8qIFFvUyBBdHRyaWJ1dGVzICovCit9OworCitzdHJ1Y3QgYmZhX3Jwb3J0X3NwZWVkX3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSovCisJdTE2ICAgICAgICBmd19oYW5kbGU7CS8qICBmaXJtd2FyZSBycG9ydCBoYW5kbGUJKi8KKwl1OAkJc3BlZWQ7CQkvKiEgcnBvcnQncyBzcGVlZCB2aWEgUlBTQyAgKi8KKwl1OAkJcnN2ZDsKK307CisKK3N0cnVjdCBiZmlfcnBvcnRfZGVsZXRlX3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSovCisJdTE2ICAgICAgICBmd19oYW5kbGU7CS8qICBmaXJtd2FyZSBycG9ydCBoYW5kbGUJKi8KKwl1MTYgICAgICAgIHJzdmQ7Cit9OworCitzdHJ1Y3QgYmZpX3Jwb3J0X2RlbGV0ZV9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLworCXUxNiAgICAgICAgYmZhX2hhbmRsZTsJLyogIGhvc3QgcnBvcnQgaGFuZGxlCQkqLworCXU4ICAgICAgICAgc3RhdHVzOwkJLyogIHJwb3J0IGRlbGV0aW9uIHN0YXR1cwkqLworCXU4ICAgICAgICAgcnN2ZDsKK307CisKK3N0cnVjdCBiZmlfcnBvcnRfcW9zX3Njbl9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSovCisJdTE2ICAgICAgICBiZmFfaGFuZGxlOwkvKiAgaG9zdCBycG9ydCBoYW5kbGUJCSovCisJdTE2ICAgICAgICByc3ZkOworCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBvbGRfcW9zX2F0dHI7ICAvKiBPbGQgUW9TIEF0dHJpYnV0ZXMgKi8KKwlzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MgbmV3X3Fvc19hdHRyOyAgLyogTmV3IFFvUyBBdHRyaWJ1dGVzICovCit9OworCit1bmlvbiBiZmlfcnBvcnRfaDJpX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21zZ19zIAkJKm1zZzsKKwlzdHJ1Y3QgYmZpX3Jwb3J0X2NyZWF0ZV9yZXFfcwkqY3JlYXRlX3JlcTsKKwlzdHJ1Y3QgYmZpX3Jwb3J0X2RlbGV0ZV9yZXFfcwkqZGVsZXRlX3JlcTsKKwlzdHJ1Y3QgYmZpX3Jwb3J0X3NwZWVkX3JlcV9zCSpzcGVlZF9yZXE7Cit9OworCit1bmlvbiBiZmlfcnBvcnRfaTJoX21zZ191IHsKKwlzdHJ1Y3QgYmZpX21zZ19zIAkJKm1zZzsKKwlzdHJ1Y3QgYmZpX3Jwb3J0X2NyZWF0ZV9yc3BfcwkqY3JlYXRlX3JzcDsKKwlzdHJ1Y3QgYmZpX3Jwb3J0X2RlbGV0ZV9yc3BfcwkqZGVsZXRlX3JzcDsKKwlzdHJ1Y3QgYmZpX3Jwb3J0X3Fvc19zY25fcwkqcW9zX3Njbl9ldnQ7Cit9OworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogX19CRklfUlBPUlRfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9iZmkvYmZpX3VmLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV91Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjhhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvYmZpL2JmaV91Zi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGSV9VRl9IX18KKyNkZWZpbmUgX19CRklfVUZfSF9fCisKKyNpbmNsdWRlICJiZmkuaCIKKworI3ByYWdtYSBwYWNrKDEpCisKK2VudW0gYmZpX3VmX2gyaSB7CisJQkZJX1VGX0gySV9CVUZfUE9TVCA9IDEsCit9OworCitlbnVtIGJmaV91Zl9pMmggeworCUJGSV9VRl9JMkhfRlJNX1JDVkQgPSBCRkFfSTJITSgxKSwKK307CisKKyNkZWZpbmUgQkZBX1VGX01BWF9TR0VTCTIKKworc3RydWN0IGJmaV91Zl9idWZfcG9zdF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgQ29tbW9uIG1zZyBoZWFkZXIJCSovCisJdTE2ICAgICAgICBidWZfdGFnOwkvKiAgYnVmZmVyIHRhZwkJCSovCisJdTE2ICAgICAgICBidWZfbGVuOwkvKiAgdG90YWwgYnVmZmVyIGxlbmd0aAkqLworCXN0cnVjdCBiZmlfc2dlX3MgICBzZ2VbQkZBX1VGX01BWF9TR0VTXTsgLyogIGJ1ZmZlciBETUEgU0dFcwkqLworfTsKKworc3RydWN0IGJmaV91Zl9mcm1fcmN2ZF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgQ29tbW9uIG1zZyBoZWFkZXIJCSovCisJdTE2ICAgICAgICBidWZfdGFnOwkvKiAgYnVmZmVyIHRhZwkJCSovCisJdTE2ICAgICAgICByc3ZkOworCXUxNiAgICAgICAgZnJtX2xlbjsJLyogIHJlY2VpdmVkIGZyYW1lIGxlbmd0aCAJKi8KKwl1MTYgICAgICAgIHhmcl9sZW47CS8qICB0cmFuZmVycmVkIGxlbmd0aAkJKi8KK307CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZiAvKiBfX0JGSV9VRl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jbmEvYmZhX2NuYV90cmNtb2QuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jbmEvYmZhX2NuYV90cmNtb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JhNzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NuYS9iZmFfY25hX3RyY21vZC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2NuYV90cmNtb2QuaCBDTkEgdHJhY2UgbW9kdWxlcworICovCisKKyNpZm5kZWYgX19CRkFfQ05BX1RSQ01PRF9IX18KKyNkZWZpbmUgX19CRkFfQ05BX1RSQ01PRF9IX18KKworI2luY2x1ZGUgPGNzL2JmYV90cmMuaD4KKworLyoKKyAqICEhISBPbmx5IGFwcGVuZCB0byB0aGUgZW51bXMgZGVmaW5lZCBoZXJlIHRvIGF2b2lkIGFueSB2ZXJzaW9uaW5nCisgKiAhISEgbmVlZGVkIGJldHdlZW4gdHJhY2UgdXRpbGl0eSBhbmQgZHJpdmVyIHZlcnNpb24KKyAqLworZW51bSB7CisJQkZBX1RSQ19DTkFfQ0VFCQk9IDEsCisJQkZBX1RSQ19DTkFfUE9SVAk9IDIsCit9OworCisjZW5kaWYgLyogX19CRkFfQ05BX1RSQ01PRF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jbmEvY2VlL2JmYV9jZWUuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jbmEvY2VlL2JmYV9jZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2YyOTdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NuYS9jZWUvYmZhX2NlZS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9DRUVfSF9fCisjZGVmaW5lIF9fQkZBX0NFRV9IX18KKworI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfY2VlLmg+CisjaW5jbHVkZSA8YmZhX2lvYy5oPgorI2luY2x1ZGUgPGNzL2JmYV90cmMuaD4KKyNpbmNsdWRlIDxjcy9iZmFfbG9nLmg+CisKK3R5cGVkZWYgdm9pZCAoKmJmYV9jZWVfZ2V0X2F0dHJfY2Jmbl90KSAodm9pZCAqZGV2LCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKK3R5cGVkZWYgdm9pZCAoKmJmYV9jZWVfZ2V0X3N0YXRzX2NiZm5fdCkgKHZvaWQgKmRldiwgYmZhX3N0YXR1c190IHN0YXR1cyk7Cit0eXBlZGVmIHZvaWQgKCpiZmFfY2VlX3Jlc2V0X3N0YXRzX2NiZm5fdCkgKHZvaWQgKmRldiwgYmZhX3N0YXR1c190IHN0YXR1cyk7Cit0eXBlZGVmIHZvaWQgKCpiZmFfY2VlX2hiZmFpbF9jYmZuX3QpICh2b2lkICpkZXYsIGJmYV9zdGF0dXNfdCBzdGF0dXMpOworCitzdHJ1Y3QgYmZhX2NlZV9jYmZuX3MgeworCWJmYV9jZWVfZ2V0X2F0dHJfY2Jmbl90ICAgIGdldF9hdHRyX2NiZm47CisJdm9pZCAqZ2V0X2F0dHJfY2Jhcmc7CisJYmZhX2NlZV9nZXRfc3RhdHNfY2Jmbl90ICAgZ2V0X3N0YXRzX2NiZm47CisJdm9pZCAqZ2V0X3N0YXRzX2NiYXJnOworCWJmYV9jZWVfcmVzZXRfc3RhdHNfY2Jmbl90IHJlc2V0X3N0YXRzX2NiZm47CisJdm9pZCAqcmVzZXRfc3RhdHNfY2Jhcmc7Cit9OworCitzdHJ1Y3QgYmZhX2NlZV9zIHsKKwl2b2lkICpkZXY7CisJYmZhX2Jvb2xlYW5fdCBnZXRfYXR0cl9wZW5kaW5nOworCWJmYV9ib29sZWFuX3QgZ2V0X3N0YXRzX3BlbmRpbmc7CisJYmZhX2Jvb2xlYW5fdCByZXNldF9zdGF0c19wZW5kaW5nOworCWJmYV9zdGF0dXNfdCBnZXRfYXR0cl9zdGF0dXM7CisJYmZhX3N0YXR1c190IGdldF9zdGF0c19zdGF0dXM7CisJYmZhX3N0YXR1c190IHJlc2V0X3N0YXRzX3N0YXR1czsKKwlzdHJ1Y3QgYmZhX2NlZV9jYmZuX3MgY2JmbjsKKwlzdHJ1Y3QgYmZhX2lvY19oYmZhaWxfbm90aWZ5X3MgaGJmYWlsOworCXN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2Q7CisJc3RydWN0IGJmYV9sb2dfbW9kX3MgKmxvZ21vZDsKKwlzdHJ1Y3QgYmZhX2NlZV9hdHRyX3MgKmF0dHI7CisJc3RydWN0IGJmYV9jZWVfc3RhdHNfcyAqc3RhdHM7CisJc3RydWN0IGJmYV9kbWFfcyBhdHRyX2RtYTsKKwlzdHJ1Y3QgYmZhX2RtYV9zIHN0YXRzX2RtYTsKKwlzdHJ1Y3QgYmZhX2lvY19zICppb2M7CisJc3RydWN0IGJmYV9tYm94X2NtZF9zIGdldF9jZmdfbWI7CisJc3RydWN0IGJmYV9tYm94X2NtZF9zIGdldF9zdGF0c19tYjsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MgcmVzZXRfc3RhdHNfbWI7Cit9OworCit1MzIgYmZhX2NlZV9tZW1pbmZvKHZvaWQpOwordm9pZCBiZmFfY2VlX21lbV9jbGFpbShzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsIHU4ICpkbWFfa3ZhLAorCQkJIHU2NCBkbWFfcGEpOwordm9pZCBiZmFfY2VlX2F0dGFjaChzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsIHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqZGV2LAorCQkJc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY21vZCwKKwkJCXN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtb2QpOwordm9pZCBiZmFfY2VlX2RldGFjaChzdHJ1Y3QgYmZhX2NlZV9zICpjZWUpOworYmZhX3N0YXR1c190IGJmYV9jZWVfZ2V0X2F0dHIoc3RydWN0IGJmYV9jZWVfcyAqY2VlLAorCQkJIHN0cnVjdCBiZmFfY2VlX2F0dHJfcyAqYXR0ciwKKwkJCWJmYV9jZWVfZ2V0X2F0dHJfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCBiZmFfY2VlX2dldF9zdGF0cyhzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsCisJCQlzdHJ1Y3QgYmZhX2NlZV9zdGF0c19zICpzdGF0cywKKwkJCWJmYV9jZWVfZ2V0X3N0YXRzX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QgYmZhX2NlZV9yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsCisJCQliZmFfY2VlX3Jlc2V0X3N0YXRzX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CisjZW5kaWYgLyogX19CRkFfQ0VFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NuYS9wb3J0L2JmYV9wb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY25hL3BvcnQvYmZhX3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2JmMTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NuYS9wb3J0L2JmYV9wb3J0LmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX1BPUlRfSF9fCisjZGVmaW5lIF9fQkZBX1BPUlRfSF9fCisKKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BvcnQuaD4KKyNpbmNsdWRlIDxiZmFfaW9jLmg+CisjaW5jbHVkZSA8Y3MvYmZhX3RyYy5oPgorI2luY2x1ZGUgPGNzL2JmYV9sb2cuaD4KKwordHlwZWRlZiB2b2lkICAgICgqYmZhX3BvcnRfc3RhdHNfY2Jmbl90KSAodm9pZCAqZGV2LCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKK3R5cGVkZWYgdm9pZCAgICAoKmJmYV9wb3J0X2VuZGlzX2NiZm5fdCkgKHZvaWQgKmRldiwgYmZhX3N0YXR1c190IHN0YXR1cyk7CisKK3N0cnVjdCBiZmFfcG9ydF9zIHsKKwl2b2lkICAgICAgICAgICAqZGV2OworCXN0cnVjdCBiZmFfaW9jX3MgKmlvYzsKKwlzdHJ1Y3QgYmZhX3RyY19tb2RfcyAqdHJjbW9kOworCXN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtb2Q7CisJdTMyICAgICAgICBtc2d0YWc7CisJYmZhX2Jvb2xlYW5fdCAgIHN0YXRzX2J1c3k7CisJc3RydWN0IGJmYV9tYm94X2NtZF9zIHN0YXRzX21iOworCWJmYV9wb3J0X3N0YXRzX2NiZm5fdCBzdGF0c19jYmZuOworCXZvaWQgICAgICAgICAgICpzdGF0c19jYmFyZzsKKwliZmFfc3RhdHVzX3QgICAgc3RhdHNfc3RhdHVzOworCXVuaW9uIGJmYV9wcG9ydF9zdGF0c191ICpzdGF0czsKKwlzdHJ1Y3QgYmZhX2RtYV9zIHN0YXRzX2RtYTsKKwliZmFfYm9vbGVhbl90ICAgZW5kaXNfcGVuZGluZzsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MgZW5kaXNfbWI7CisJYmZhX3BvcnRfZW5kaXNfY2Jmbl90IGVuZGlzX2NiZm47CisJdm9pZCAgICAgICAgICAgKmVuZGlzX2NiYXJnOworCWJmYV9zdGF0dXNfdCAgICBlbmRpc19zdGF0dXM7CisJc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeV9zIGhiZmFpbDsKK307CisKK3ZvaWQgICAgICAgICAgICBiZmFfcG9ydF9hdHRhY2goc3RydWN0IGJmYV9wb3J0X3MgKnBvcnQsIHN0cnVjdCBiZmFfaW9jX3MgKmlvYywKKwkJCQl2b2lkICpkZXYsIHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QsCisJCQkJc3RydWN0IGJmYV9sb2dfbW9kX3MgKmxvZ21vZCk7Cit2b2lkICAgICAgICAgICAgYmZhX3BvcnRfZGV0YWNoKHN0cnVjdCBiZmFfcG9ydF9zICpwb3J0KTsKK3ZvaWQgICAgICAgICAgICBiZmFfcG9ydF9oYmZhaWwodm9pZCAqYXJnKTsKKworYmZhX3N0YXR1c190ICAgIGJmYV9wb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwKKwkJCQkgICB1bmlvbiBiZmFfcHBvcnRfc3RhdHNfdSAqc3RhdHMsCisJCQkJICAgYmZhX3BvcnRfc3RhdHNfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCAgICBiZmFfcG9ydF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwKKwkJCQkgICAgIGJmYV9wb3J0X3N0YXRzX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QgICAgYmZhX3BvcnRfZW5hYmxlKHN0cnVjdCBiZmFfcG9ydF9zICpwb3J0LAorCQkJCWJmYV9wb3J0X2VuZGlzX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QgICAgYmZhX3BvcnRfZGlzYWJsZShzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwKKwkJCQkgYmZhX3BvcnRfZW5kaXNfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK3UzMiAgICAgICAgYmZhX3BvcnRfbWVtaW5mbyh2b2lkKTsKK3ZvaWQgICAgICAgICAgICBiZmFfcG9ydF9tZW1fY2xhaW0oc3RydWN0IGJmYV9wb3J0X3MgKnBvcnQsIHU4ICpkbWFfa3ZhLAorCQkJCSAgIHU2NCBkbWFfcGEpOworCisjZW5kaWYgLyogX19CRkFfUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jbmEvcHN0YXRzL2V0aHBvcnRfZGVmcy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NuYS9wc3RhdHMvZXRocG9ydF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2M2VlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jbmEvcHN0YXRzL2V0aHBvcnRfZGVmcy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fRVRIUE9SVF9ERUZTX0hfXworI2RlZmluZSBfX0VUSFBPUlRfREVGU19IX18KKworc3RydWN0IGJuYWRfZHJ2X3N0YXRzIHsKKwl1NjQgbmV0aWZfcXVldWVfc3RvcDsKKwl1NjQgbmV0aWZfcXVldWVfd2FrZXVwOworCXU2NCB0c280OworCXU2NCB0c282OworCXU2NCB0c29fZXJyOworCXU2NCB0Y3Bjc3VtX29mZmxvYWQ7CisJdTY0IHVkcGNzdW1fb2ZmbG9hZDsKKwl1NjQgY3N1bV9oZWxwOworCXU2NCBjc3VtX2hlbHBfZXJyOworCisJdTY0IGh3X3N0YXRzX3VwZGF0ZXM7CisJdTY0IG5ldGlmX3J4X3NjaGVkdWxlOworCXU2NCBuZXRpZl9yeF9jb21wbGV0ZTsKKwl1NjQgbmV0aWZfcnhfZHJvcHBlZDsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jbmEvcHN0YXRzL3BoeXBvcnRfZGVmcy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NuYS9wc3RhdHMvcGh5cG9ydF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3NTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jbmEvcHN0YXRzL3BoeXBvcnRfZGVmcy5oCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1BIWVBPUlRfREVGU19IX18KKyNkZWZpbmUgX19QSFlQT1JUX0RFRlNfSF9fCisKKyNkZWZpbmUgQk5BX1RYRl9JRF9NQVggIAk2NAorI2RlZmluZSBCTkFfUlhGX0lEX01BWCAgCTY0CisKKy8qCisgKiBTdGF0aXN0aWNzCisgKi8KKworLyoKKyAqIFR4RiBGcmFtZSBTdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBibmFfc3RhdHNfdHhmIHsKKwl1NjQgICAgICAgIHVjYXN0X29jdGV0czsKKwl1NjQgICAgICAgIHVjYXN0OworCXU2NCAgICAgICAgdWNhc3RfdmxhbjsKKworCXU2NCAgICAgICAgbWNhc3Rfb2N0ZXRzOworCXU2NCAgICAgICAgbWNhc3Q7CisJdTY0ICAgICAgICBtY2FzdF92bGFuOworCisJdTY0ICAgICAgICBiY2FzdF9vY3RldHM7CisJdTY0ICAgICAgICBiY2FzdDsKKwl1NjQgICAgICAgIGJjYXN0X3ZsYW47CisKKwl1NjQgICAgICAgIGVycm9yczsKKwl1NjQgICAgICAgIGZpbHRlcl92bGFuOwkvKiBmcmFtZXMgZmlsdGVyZWQgZHVlIHRvIFZMQU4gKi8KKwl1NjQgICAgICAgIGZpbHRlcl9tYWNfc2E7CS8qIGZyYW1lcyBmaWx0ZXJlZCBkdWUgdG8gU0EgY2hlY2sgKi8KK307CisKKy8qCisgKiBSeEYgRnJhbWUgU3RhdGlzdGljcworICovCitzdHJ1Y3QgYm5hX3N0YXRzX3J4ZiB7CisJdTY0ICAgICAgICB1Y2FzdF9vY3RldHM7CisJdTY0ICAgICAgICB1Y2FzdDsKKwl1NjQgICAgICAgIHVjYXN0X3ZsYW47CisKKwl1NjQgICAgICAgIG1jYXN0X29jdGV0czsKKwl1NjQgICAgICAgIG1jYXN0OworCXU2NCAgICAgICAgbWNhc3RfdmxhbjsKKworCXU2NCAgICAgICAgYmNhc3Rfb2N0ZXRzOworCXU2NCAgICAgICAgYmNhc3Q7CisJdTY0ICAgICAgICBiY2FzdF92bGFuOworCXU2NCAgICAgICAgZnJhbWVfZHJvcHM7Cit9OworCisvKgorICogRkMgVHggRnJhbWUgU3RhdGlzdGljcworICovCitzdHJ1Y3QgYm5hX3N0YXRzX2ZjX3R4IHsKKwl1NjQgICAgICAgIHR4Zl91Y2FzdF9vY3RldHM7CisJdTY0ICAgICAgICB0eGZfdWNhc3Q7CisJdTY0ICAgICAgICB0eGZfdWNhc3RfdmxhbjsKKworCXU2NCAgICAgICAgdHhmX21jYXN0X29jdGV0czsKKwl1NjQgICAgICAgIHR4Zl9tY2FzdDsKKwl1NjQgICAgICAgIHR4Zl9tY2FzdF92bGFuOworCisJdTY0ICAgICAgICB0eGZfYmNhc3Rfb2N0ZXRzOworCXU2NCAgICAgICAgdHhmX2JjYXN0OworCXU2NCAgICAgICAgdHhmX2JjYXN0X3ZsYW47CisKKwl1NjQgICAgICAgIHR4Zl9wYXJpdHlfZXJyb3JzOworCXU2NCAgICAgICAgdHhmX3RpbWVvdXQ7CisJdTY0ICAgICAgICB0eGZfZmlkX3Bhcml0eV9lcnJvcnM7Cit9OworCisvKgorICogRkMgUnggRnJhbWUgU3RhdGlzdGljcworICovCitzdHJ1Y3QgYm5hX3N0YXRzX2ZjX3J4IHsKKwl1NjQgICAgICAgIHJ4Zl91Y2FzdF9vY3RldHM7CisJdTY0ICAgICAgICByeGZfdWNhc3Q7CisJdTY0ICAgICAgICByeGZfdWNhc3RfdmxhbjsKKworCXU2NCAgICAgICAgcnhmX21jYXN0X29jdGV0czsKKwl1NjQgICAgICAgIHJ4Zl9tY2FzdDsKKwl1NjQgICAgICAgIHJ4Zl9tY2FzdF92bGFuOworCisJdTY0ICAgICAgICByeGZfYmNhc3Rfb2N0ZXRzOworCXU2NCAgICAgICAgcnhmX2JjYXN0OworCXU2NCAgICAgICAgcnhmX2JjYXN0X3ZsYW47Cit9OworCisvKgorICogUkFEIEZyYW1lIFN0YXRpc3RpY3MKKyAqLworc3RydWN0IGNuYV9zdGF0c19yYWQgeworCXU2NCAgICAgICAgcnhfZnJhbWVzOworCXU2NCAgICAgICAgcnhfb2N0ZXRzOworCXU2NCAgICAgICAgcnhfdmxhbl9mcmFtZXM7CisKKwl1NjQgICAgICAgIHJ4X3VjYXN0OworCXU2NCAgICAgICAgcnhfdWNhc3Rfb2N0ZXRzOworCXU2NCAgICAgICAgcnhfdWNhc3RfdmxhbjsKKworCXU2NCAgICAgICAgcnhfbWNhc3Q7CisJdTY0ICAgICAgICByeF9tY2FzdF9vY3RldHM7CisJdTY0ICAgICAgICByeF9tY2FzdF92bGFuOworCisJdTY0ICAgICAgICByeF9iY2FzdDsKKwl1NjQgICAgICAgIHJ4X2JjYXN0X29jdGV0czsKKwl1NjQgICAgICAgIHJ4X2JjYXN0X3ZsYW47CisKKwl1NjQgICAgICAgIHJ4X2Ryb3BzOworfTsKKworLyoKKyAqIEJQQyBUeCBSZWdpc3RlcnMKKyAqLworc3RydWN0IGNuYV9zdGF0c19icGNfdHggeworCXU2NCAgICAgICAgdHhfcGF1c2VbOF07CisJdTY0ICAgICAgICB0eF96ZXJvX3BhdXNlWzhdOwkvKiAgUGF1c2UgY2FuY2VsbGF0aW9uICovCisJdTY0ICAgICAgICB0eF9maXJzdF9wYXVzZVs4XTsJLyogIFBhdXNlIGluaXRpYXRpb24gcmF0aGVyCisJCQkJCQkgKnRoYW4gcmV0ZW50aW9uICovCit9OworCisvKgorICogQlBDIFJ4IFJlZ2lzdGVycworICovCitzdHJ1Y3QgY25hX3N0YXRzX2JwY19yeCB7CisJdTY0ICAgICAgICByeF9wYXVzZVs4XTsKKwl1NjQgICAgICAgIHJ4X3plcm9fcGF1c2VbOF07CS8qICBQYXVzZSBjYW5jZWxsYXRpb24gKi8KKwl1NjQgICAgICAgIHJ4X2ZpcnN0X3BhdXNlWzhdOwkvKiAgUGF1c2UgaW5pdGlhdGlvbiByYXRoZXIKKwkJCQkJCSAqdGhhbiByZXRlbnRpb24gKi8KK307CisKKy8qCisgKiBNQUMgUnggU3RhdGlzdGljcworICovCitzdHJ1Y3QgY25hX3N0YXRzX21hY19yeCB7CisJdTY0ICAgICAgICBmcmFtZV82NDsJLyogYm90aCByeCBhbmQgdHggY291bnRlciAqLworCXU2NCAgICAgICAgZnJhbWVfNjVfMTI3OwkvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0ICAgICAgICBmcmFtZV8xMjhfMjU1OwkvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0ICAgICAgICBmcmFtZV8yNTZfNTExOwkvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0ICAgICAgICBmcmFtZV81MTJfMTAyMzsJLyogYm90aCByeCBhbmQgdHggY291bnRlciAqLworCXU2NCAgICAgICAgZnJhbWVfMTAyNF8xNTE4OwkvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0ICAgICAgICBmcmFtZV8xNTE4XzE1MjI7CS8qIGJvdGggcnggYW5kIHR4IGNvdW50ZXIgKi8KKwl1NjQgICAgICAgIHJ4X2J5dGVzOworCXU2NCAgICAgICAgcnhfcGFja2V0czsKKwl1NjQgICAgICAgIHJ4X2Zjc19lcnJvcjsKKwl1NjQgICAgICAgIHJ4X211bHRpY2FzdDsKKwl1NjQgICAgICAgIHJ4X2Jyb2FkY2FzdDsKKwl1NjQgICAgICAgIHJ4X2NvbnRyb2xfZnJhbWVzOworCXU2NCAgICAgICAgcnhfcGF1c2U7CisJdTY0ICAgICAgICByeF91bmtub3duX29wY29kZTsKKwl1NjQgICAgICAgIHJ4X2FsaWdubWVudF9lcnJvcjsKKwl1NjQgICAgICAgIHJ4X2ZyYW1lX2xlbmd0aF9lcnJvcjsKKwl1NjQgICAgICAgIHJ4X2NvZGVfZXJyb3I7CisJdTY0ICAgICAgICByeF9jYXJyaWVyX3NlbnNlX2Vycm9yOworCXU2NCAgICAgICAgcnhfdW5kZXJzaXplOworCXU2NCAgICAgICAgcnhfb3ZlcnNpemU7CisJdTY0ICAgICAgICByeF9mcmFnbWVudHM7CisJdTY0ICAgICAgICByeF9qYWJiZXI7CisJdTY0ICAgICAgICByeF9kcm9wOworfTsKKworLyoKKyAqIE1BQyBUeCBTdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBjbmFfc3RhdHNfbWFjX3R4IHsKKwl1NjQgICAgICAgIHR4X2J5dGVzOworCXU2NCAgICAgICAgdHhfcGFja2V0czsKKwl1NjQgICAgICAgIHR4X211bHRpY2FzdDsKKwl1NjQgICAgICAgIHR4X2Jyb2FkY2FzdDsKKwl1NjQgICAgICAgIHR4X3BhdXNlOworCXU2NCAgICAgICAgdHhfZGVmZXJyYWw7CisJdTY0ICAgICAgICB0eF9leGNlc3NpdmVfZGVmZXJyYWw7CisJdTY0ICAgICAgICB0eF9zaW5nbGVfY29sbGlzaW9uOworCXU2NCAgICAgICAgdHhfbXVsaXBsZV9jb2xsaXNpb247CisJdTY0ICAgICAgICB0eF9sYXRlX2NvbGxpc2lvbjsKKwl1NjQgICAgICAgIHR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb247CisJdTY0ICAgICAgICB0eF90b3RhbF9jb2xsaXNpb247CisJdTY0ICAgICAgICB0eF9wYXVzZV9ob25vcmVkOworCXU2NCAgICAgICAgdHhfZHJvcDsKKwl1NjQgICAgICAgIHR4X2phYmJlcjsKKwl1NjQgICAgICAgIHR4X2Zjc19lcnJvcjsKKwl1NjQgICAgICAgIHR4X2NvbnRyb2xfZnJhbWU7CisJdTY0ICAgICAgICB0eF9vdmVyc2l6ZTsKKwl1NjQgICAgICAgIHR4X3VuZGVyc2l6ZTsKKwl1NjQgICAgICAgIHR4X2ZyYWdtZW50czsKK307CisKKy8qCisgKiBDb21wbGV0ZSBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBibmFfc3RhdHMgeworCXN0cnVjdCBjbmFfc3RhdHNfbWFjX3J4IG1hY19yeF9zdGF0czsKKwlzdHJ1Y3QgY25hX3N0YXRzX2JwY19yeCBicGNfcnhfc3RhdHM7CisJc3RydWN0IGNuYV9zdGF0c19yYWQgcmFkX3N0YXRzOworCXN0cnVjdCBibmFfc3RhdHNfZmNfcnggZmNfcnhfc3RhdHM7CisJc3RydWN0IGNuYV9zdGF0c19tYWNfdHggbWFjX3R4X3N0YXRzOworCXN0cnVjdCBjbmFfc3RhdHNfYnBjX3R4IGJwY190eF9zdGF0czsKKwlzdHJ1Y3QgYm5hX3N0YXRzX2ZjX3R4IGZjX3R4X3N0YXRzOworCXN0cnVjdCBibmFfc3RhdHNfcnhmIHJ4Zl9zdGF0c1tCTkFfVFhGX0lEX01BWF07CisJc3RydWN0IGJuYV9zdGF0c190eGYgdHhmX3N0YXRzW0JOQV9SWEZfSURfTUFYXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9jaGVja3N1bS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9jaGVja3N1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGMxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX2NoZWNrc3VtLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFfY2hlY2tzdW0uaCBCRkEgY2hlY2tzdW0gdXRpbGl0aWVzCisgKi8KKworI2lmbmRlZiBfX0JGQV9DSEVDS1NVTV9IX18KKyNkZWZpbmUgX19CRkFfQ0hFQ0tTVU1fSF9fCisKK3N0YXRpYyBpbmxpbmUgdTMyCitiZmFfY2hlY2tzdW1fdTMyKHUzMiAqYnVmLCBpbnQgc3opCit7CisJaW50CQlpLCBtID0gc3ogPj4gMjsKKwl1MzIJc3VtID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspCisJCXN1bSBePSBidWZbaV07CisKKwlyZXR1cm4gKHN1bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2CitiZmFfY2hlY2tzdW1fdTE2KHUxNiAqYnVmLCBpbnQgc3opCit7CisJaW50ICAgICAgICAgICAgIGksIG0gPSBzeiA+PiAxOworCXUxNiAgICAgICAgc3VtID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspCisJCXN1bSBePSBidWZbaV07CisKKwlyZXR1cm4gKHN1bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTgKK2JmYV9jaGVja3N1bV91OCh1OCAqYnVmLCBpbnQgc3opCit7CisJaW50ICAgICAgICAgICAgIGk7CisJdTggICAgICAgICBzdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCisJCXN1bSBePSBidWZbaV07CisKKwlyZXR1cm4gKHN1bSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfZGVidWcuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDFiZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9kZWJ1Zy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2RlYnVnLmggQkZBIGRlYnVnIGludGVyZmFjZXMKKyAqLworCisjaWZuZGVmIF9fQkZBX0RFQlVHX0hfXworI2RlZmluZSBfX0JGQV9ERUJVR19IX18KKworI2RlZmluZSBiZmFfYXNzZXJ0KF9fY29uZCkJZG8gewkJCQkJXAorCWlmICghKF9fY29uZCkpIAkJCQkJCQlcCisJCWJmYV9wYW5pYyhfX0xJTkVfXywgX19GSUxFX18sICNfX2NvbmQpOyAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYmZhX3NtX2ZhdWx0KF9fbW9kLCBfX2V2ZW50KQlkbyB7CQkJCVwKKwliZmFfc21fcGFuaWMoKF9fbW9kKS0+bG9nbSwgX19MSU5FX18sIF9fRklMRV9fLCBfX2V2ZW50KTsgICAgICBcCit9IHdoaWxlICgwKQorCisjaWZuZGVmIEJGQV9QRVJGX0JVSUxECisjZGVmaW5lIGJmYV9hc3NlcnRfZnAoX19jb25kKQliZmFfYXNzZXJ0KF9fY29uZCkKKyNlbHNlCisjZGVmaW5lIGJmYV9hc3NlcnRfZnAoX19jb25kKQorI2VuZGlmCisKK3N0cnVjdCBiZmFfbG9nX21vZF9zOwordm9pZCBiZmFfcGFuaWMoaW50IGxpbmUsIGNoYXIgKmZpbGUsIGNoYXIgKnBhbmljc3RyKTsKK3ZvaWQgYmZhX3NtX3BhbmljKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dtLCBpbnQgbGluZSwgY2hhciAqZmlsZSwgaW50IGV2ZW50KTsKKworI2VuZGlmIC8qIF9fQkZBX0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9sb2cuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxY2JlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfbG9nLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2xvZy5oIEJGQSBsb2cgbGlicmFyeSBkYXRhIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCisKKyNpZm5kZWYgX19CRkFfTE9HX0hfXworI2RlZmluZSBfX0JGQV9MT0dfSF9fCisKKyNpbmNsdWRlIDxiZmFfb3NfaW5jLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19zdGF0dXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2Flbi5oPgorCisvKgorICogQkZBIGxvZyBtb2R1bGUgZGVmaW5pdGlvbgorICoKKyAqIFRvIGNyZWF0ZSBhIG5ldyBtb2R1bGUgaWQ6CisgKiBBZGQgYSAjZGVmaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmVsb3cuIFNlbGVjdCBhIHZhbHVlIGZvciB5b3VyCisgKiBkZWZpbml0aW9uIHNvIHRoYXQgaXQgaXMgb25lICgxKSBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzCisgKiBkZWZpbml0aW9uLiBNb2RpZnkgdGhlIGRlZmluaXRpb24gb2YgQkZBX0xPR19NT0RVTEVfSURfTUFYIHRvIGJlY29tZQorICogeW91ciBuZXcgZGVmaW5pdGlvbi4KKyAqIFNob3VsZCBoYXZlIG5vIGdhcHMgaW4gYmV0d2VlbiB0aGUgdmFsdWVzIGJlY2F1c2UgdGhpcyBpcyB1c2VkIGluIGFycmF5cy4KKyAqIElNUE9SVEFOVDogQUVOX0lEcyBtdXN0IGJlIGF0IHRoZSBiZWdpbmluZywgb3RoZXJ3aXNlIHVwZGF0ZSBiZmFfZGVmc19hZW4uaAorICovCisKK2VudW0gYmZhX2xvZ19tb2R1bGVfaWQgeworCUJGQV9MT0dfVU5VU0VEX0lECT0gMCwKKworCS8qIEFFTiBkZWZzIGJlZ2luICovCisJQkZBX0xPR19BRU5fTUlOCQk9IEJGQV9MT0dfVU5VU0VEX0lELAorCisJQkZBX0xPR19BRU5fSURfQURBUFRFUiAJPSBCRkFfTE9HX0FFTl9NSU4gKyBCRkFfQUVOX0NBVF9BREFQVEVSLC8qIDEgKi8KKwlCRkFfTE9HX0FFTl9JRF9QT1JUIAk9IEJGQV9MT0dfQUVOX01JTiArIEJGQV9BRU5fQ0FUX1BPUlQsCS8qIDIgKi8KKwlCRkFfTE9HX0FFTl9JRF9MUE9SVCAJPSBCRkFfTE9HX0FFTl9NSU4gKyBCRkFfQUVOX0NBVF9MUE9SVCwJLyogMyAqLworCUJGQV9MT0dfQUVOX0lEX1JQT1JUIAk9IEJGQV9MT0dfQUVOX01JTiArIEJGQV9BRU5fQ0FUX1JQT1JULAkvKiA0ICovCisJQkZBX0xPR19BRU5fSURfSVROSU0gCT0gQkZBX0xPR19BRU5fTUlOICsgQkZBX0FFTl9DQVRfSVROSU0sCS8qIDUgKi8KKwlCRkFfTE9HX0FFTl9JRF9USU4gCT0gQkZBX0xPR19BRU5fTUlOICsgQkZBX0FFTl9DQVRfVElOLAkvKiA2ICovCisJQkZBX0xPR19BRU5fSURfSVBGQyAJPSBCRkFfTE9HX0FFTl9NSU4gKyBCRkFfQUVOX0NBVF9JUEZDLAkvKiA3ICovCisJQkZBX0xPR19BRU5fSURfQVVESVQgCT0gQkZBX0xPR19BRU5fTUlOICsgQkZBX0FFTl9DQVRfQVVESVQsCS8qIDggKi8KKwlCRkFfTE9HX0FFTl9JRF9JT0MJPSBCRkFfTE9HX0FFTl9NSU4gKyBCRkFfQUVOX0NBVF9JT0MsCS8qIDkgKi8KKwlCRkFfTE9HX0FFTl9JRF9FVEhQT1JUCT0gQkZBX0xPR19BRU5fTUlOICsgQkZBX0FFTl9DQVRfRVRIUE9SVCwvKiAxMCAqLworCisJQkZBX0xPR19BRU5fTUFYCQk9IEJGQV9MT0dfQUVOX0lEX0VUSFBPUlQsCisJLyogQUVOIGRlZnMgZW5kICovCisKKwlCRkFfTE9HX01PRFVMRV9JRF9NSU4JPSBCRkFfTE9HX0FFTl9NQVgsCisKKwlCRkFfTE9HX0ZXX0lECQk9IEJGQV9MT0dfTU9EVUxFX0lEX01JTiArIDEsCisJQkZBX0xPR19IQUxfSUQJCT0gQkZBX0xPR19NT0RVTEVfSURfTUlOICsgMiwKKwlCRkFfTE9HX0ZDU19JRAkJPSBCRkFfTE9HX01PRFVMRV9JRF9NSU4gKyAzLAorCUJGQV9MT0dfV0RSVl9JRAkJPSBCRkFfTE9HX01PRFVMRV9JRF9NSU4gKyA0LAorCUJGQV9MT0dfTElOVVhfSUQJPSBCRkFfTE9HX01PRFVMRV9JRF9NSU4gKyA1LAorCUJGQV9MT0dfU09MQVJJU19JRAk9IEJGQV9MT0dfTU9EVUxFX0lEX01JTiArIDYsCisKKwlCRkFfTE9HX01PRFVMRV9JRF9NQVggCT0gQkZBX0xPR19TT0xBUklTX0lELAorCisJLyogTm90IHBhcnQgb2YgYW55IGFycmF5cyAqLworCUJGQV9MT0dfTU9EVUxFX0lEX0FMTCAJPSBCRkFfTE9HX01PRFVMRV9JRF9NQVggKyAxLAorCUJGQV9MT0dfQUVOX0FMTCAJPSBCRkFfTE9HX01PRFVMRV9JRF9NQVggKyAyLAorCUJGQV9MT0dfRFJWX0FMTAkJPSBCRkFfTE9HX01PRFVMRV9JRF9NQVggKyAzLAorfTsKKworLyoKKyAqIEJGQSBsb2cgY2F0YWxvZyBuYW1lCisgKi8KKyNkZWZpbmUgQkZBX0xPR19DQVRfTkFNRQkiQkZBIgorCisvKgorICogYmZhIGxvZyBzZXZlcml0eSB2YWx1ZXMKKyAqLworZW51bSBiZmFfbG9nX3NldmVyaXR5IHsKKwlCRkFfTE9HX0lOVkFMSUQgPSAwLAorCUJGQV9MT0dfQ1JJVElDQUwgPSAxLAorCUJGQV9MT0dfRVJST1IgPSAyLAorCUJGQV9MT0dfV0FSTklORyA9IDMsCisJQkZBX0xPR19JTkZPID0gNCwKKwlCRkFfTE9HX05PTkUgPSA1LAorCUJGQV9MT0dfTEVWRUxfTUFYID0gQkZBX0xPR19OT05FCit9OworCisjZGVmaW5lIEJGQV9MT0dfTU9ESURfT0ZGU0VUCQkxNgorCisKK3N0cnVjdCBiZmFfbG9nX21zZ2RlZl9zIHsKKwl1MzIJbXNnX2lkOwkJLyogIG1lc3NhZ2UgaWQgKi8KKwlpbnQJCWF0dHJpYnV0ZXM7CS8qICBhdHRyaWJ1dGVzICovCisJaW50CQlzZXZlcml0eTsJLyogIHNldmVyaXR5IGxldmVsICovCisJY2hhcgkJKm1zZ192YWx1ZTsKKwkJCQkJLyogIG1zZyBzdHJpbmcgKi8KKwljaGFyCQkqbWVzc2FnZTsKKwkJCQkJLyogIG1zZyBmb3JtYXQgc3RyaW5nICovCisJaW50CQlhcmdfdHlwZTsJLyogIGFyZ3VtZW50IHR5cGUgKi8KKwlpbnQJCWFyZ19udW07CS8qICBudW1iZXIgb2YgYXJndW1lbnQgKi8KK307CisKKy8qCisgKiBzdXBwb3J0ZWQgYXJndW1lbnQgdHlwZQorICovCitlbnVtIGJmYV9sb2dfYXJnX3R5cGUgeworCUJGQV9MT0dfUyA9IDAsCQkvKiAgc3RyaW5nICovCisJQkZBX0xPR19ELAkJLyogIGRlY2ltYWwgKi8KKwlCRkFfTE9HX0ksCQkvKiAgaW50ZWdlciAqLworCUJGQV9MT0dfTywJCS8qICBvY3QgbnVtYmVyICovCisJQkZBX0xPR19VLAkJLyogIHVuc2lnbmVkIGludGVnZXIgKi8KKwlCRkFfTE9HX1gsCQkvKiAgaGV4IG51bWJlciAqLworCUJGQV9MT0dfRiwJCS8qICBmbG9hdGluZyAqLworCUJGQV9MT0dfQywJCS8qICBjaGFyYWN0ZXIgKi8KKwlCRkFfTE9HX0wsCQkvKiAgZG91YmxlICovCisJQkZBX0xPR19QCQkvKiAgcG9pbnRlciAqLworfTsKKworI2RlZmluZSBCRkFfTE9HX0FSR19UWVBFCTIKKyNkZWZpbmUgQkZBX0xPR19BUkcwCQkoMCAqIEJGQV9MT0dfQVJHX1RZUEUpCisjZGVmaW5lIEJGQV9MT0dfQVJHMQkJKDEgKiBCRkFfTE9HX0FSR19UWVBFKQorI2RlZmluZSBCRkFfTE9HX0FSRzIJCSgyICogQkZBX0xPR19BUkdfVFlQRSkKKyNkZWZpbmUgQkZBX0xPR19BUkczCQkoMyAqIEJGQV9MT0dfQVJHX1RZUEUpCisKKyNkZWZpbmUgQkZBX0xPR19HRVRfTU9EX0lEKG1zZ2lkKSAoKG1zZ2lkID4+IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSAmIDB4ZmYpCisjZGVmaW5lIEJGQV9MT0dfR0VUX01TR19JRFgobXNnaWQpIChtc2dpZCAmIDB4ZmZmZikKKyNkZWZpbmUgQkZBX0xPR19HRVRfTVNHX0lEKG1zZ2RlZikgKChtc2dkZWYpLT5tc2dfaWQpCisjZGVmaW5lIEJGQV9MT0dfR0VUX01TR19GTVRfU1RSSU5HKG1zZ2RlZikgKChtc2dkZWYpLT5tZXNzYWdlKQorI2RlZmluZSBCRkFfTE9HX0dFVF9TRVZFUklUWShtc2dkZWYpICgobXNnZGVmKS0+c2V2ZXJpdHkpCisKKy8qCisgKiBFdmVudCBhdHRyaWJ1dGVzCisgKi8KKyNkZWZpbmUgQkZBX0xPR19BVFRSX05PTkUJMAorI2RlZmluZSBCRkFfTE9HX0FUVFJfQVVESVQJMQorI2RlZmluZSBCRkFfTE9HX0FUVFJfTE9HCTIKKyNkZWZpbmUgQkZBX0xPR19BVFRSX0ZGREMJNAorCisjZGVmaW5lIEJGQV9MT0dfQ1JFQVRFX0lEKG1zdywgbHN3KSBcCisJKCgodTMyKW1zdyA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCBsc3cpCisKK3N0cnVjdCBiZmFfbG9nX21vZF9zOworCisvKioKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJmYV9sb2dfY2JfdCkoc3RydWN0IGJmYV9sb2dfbW9kX3MgKmxvZ19tb2QsIHUzMiBtc2dfaWQsCisJCQljb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKKworc3RydWN0IGJmYV9sb2dfbW9kX3MgeworCWNoYXIJCWluc3RhbmNlX2luZm9bMTZdOwkvKiAgaW5zdGFuY2UgaW5mbyAqLworCWludAkJbG9nX2xldmVsW0JGQV9MT0dfTU9EVUxFX0lEX01BWCArIDFdOworCQkJCQkJLyogIGxvZyBsZXZlbCBmb3IgbW9kdWxlcyAqLworCWJmYV9sb2dfY2JfdAljYmZuOyAJCQkvKiAgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK307CisKK2V4dGVybiBpbnQgYmZhX2xvZ19pbml0KHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLAorCQkJY2hhciAqaW5zdGFuY2VfbmFtZSwgYmZhX2xvZ19jYl90IGNiZm4pOworZXh0ZXJuIGludCBiZmFfbG9nKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLCB1MzIgbXNnX2lkLCAuLi4pOworZXh0ZXJuIGJmYV9zdGF0dXNfdCBiZmFfbG9nX3NldF9sZXZlbChzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nX21vZCwKKwkJCWludCBtb2RfaWQsIGVudW0gYmZhX2xvZ19zZXZlcml0eSBsb2dfbGV2ZWwpOworZXh0ZXJuIGJmYV9zdGF0dXNfdCBiZmFfbG9nX3NldF9sZXZlbF9hbGwoc3RydWN0IGJmYV9sb2dfbW9kX3MgKmxvZ19tb2QsCisJCQllbnVtIGJmYV9sb2dfc2V2ZXJpdHkgbG9nX2xldmVsKTsKK2V4dGVybiBiZmFfc3RhdHVzX3QgYmZhX2xvZ19zZXRfbGV2ZWxfYWVuKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLAorCQkJZW51bSBiZmFfbG9nX3NldmVyaXR5IGxvZ19sZXZlbCk7CitleHRlcm4gZW51bSBiZmFfbG9nX3NldmVyaXR5IGJmYV9sb2dfZ2V0X2xldmVsKHN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLAorCQkJaW50IG1vZF9pZCk7CitleHRlcm4gZW51bSBiZmFfbG9nX3NldmVyaXR5IGJmYV9sb2dfZ2V0X21zZ19sZXZlbCgKKwkJCXN0cnVjdCBiZmFfbG9nX21vZF9zICpsb2dfbW9kLCB1MzIgbXNnX2lkKTsKKy8qCisgKiBhcnJheSBvZiBtZXNzYWdlcyBnZW5lcmF0ZWQgZnJvbSB4bWwgZmlsZXMKKyAqLworZXh0ZXJuIHN0cnVjdCBiZmFfbG9nX21zZ2RlZl9zIGJmYV9sb2dfbXNnX2FycmF5W107CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9wZXJmLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX3BlcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWFhNWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9wZXJmLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0JGQURfUEVSRl9IX18KKyNkZWZpbmUgX19CRkFEX1BFUkZfSF9fCisKKyNpZmRlZiBCRkFEX1BFUkZfQlVJTEQKKworI3VuZGVmIGJmYV90cmMKKyN1bmRlZiBiZmFfdHJjMzIKKyN1bmRlZiBiZmFfYXNzZXJ0CisjdW5kZWYgQkZBX1RSQ19GSUxFCisKKyNkZWZpbmUgYmZhX3RyYyhfdHJjcCwgX2RhdGEpCisjZGVmaW5lIGJmYV90cmMzMihfdHJjcCwgX2RhdGEpCisjZGVmaW5lIGJmYV9hc3NlcnQoX19jb25kKQorI2RlZmluZSBCRkFfVFJDX0ZJTEUoX19tb2QsIF9fc3VibW9kKQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQkZBRF9QRVJGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9wbG9nLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX3Bsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBmODZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9wbG9nLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRkFfUE9SVExPR19IX18KKyNkZWZpbmUgX19CRkFfUE9SVExPR19IX18KKworI2luY2x1ZGUgInByb3RvY29sL2ZjLmgiCisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc190eXBlcy5oPgorCisjZGVmaW5lIEJGQV9QTF9OTE9HX0VOVFMgMjU2CisjZGVmaW5lIEJGQV9QTF9MT0dfUkVDX0lOQ1IoX3gpICgoX3gpKyssIChfeCkgJT0gQkZBX1BMX05MT0dfRU5UUykKKworI2RlZmluZSBCRkFfUExfU1RSSU5HX0xPR19TWiAgIDMyICAgLyogbnVtYmVyIG9mIGNoYXJzIGluIHN0cmluZyBsb2cgKi8KKyNkZWZpbmUgQkZBX1BMX0lOVF9MT0dfU1ogICAgICA4ICAgIC8qIG51bWJlciBvZiBpbnRlZ2VycyBpbiB0aGUgaW50ZWdlciBsb2cgKi8KKworZW51bSBiZmFfcGxvZ19sb2dfdHlwZSB7CisJQkZBX1BMX0xPR19UWVBFX0lOVkFMSUQgPSAwLAorCUJGQV9QTF9MT0dfVFlQRV9JTlQgCT0gMSwKKwlCRkFfUExfTE9HX1RZUEVfU1RSSU5HIAk9IDIsCit9OworCisvKgorICogdGhlIChmaXhlZCBzaXplKSByZWNvcmQgZm9ybWF0IGZvciBlYWNoIGVudHJ5IGluIHRoZSBwb3J0bG9nCisgKi8KK3N0cnVjdCBiZmFfcGxvZ19yZWNfcyB7CisJdTMyICAgICAgICB0djsJLyogRmlsbGVkIGJ5IHRoZSBwb3J0bG9nIGRyaXZlciB3aGVuIHRoZSAqCisJCQkJICogZW50cnkgaXMgYWRkZWQgdG8gdGhlIGNpcmN1bGFyIGxvZy4gICAqLworCXU4ICAgICAgICAgcG9ydDsJLyogU291cmNlIHBvcnQgdGhhdCBsb2dnZWQgdGhpcyBlbnRyeS4gQ00KKwkJCQkgKiBlbnRpdGllcyB3aWxsIHVzZSAweEZGICovCisJdTggICAgICAgICBtaWQ7CS8qIEludGVnZXIgdmFsdWUgdG8gYmUgdXNlZCBieSBhbGwgZW50aXRpZXMgKgorCQkJCSAqIHdoaWxlIGxvZ2dpbmcuIFRoZSBtb2R1bGUgaWQgdG8gc3RyaW5nICAgKgorCQkJCSAqIGNvbnZlcnNpb24gd2lsbCBiZSBkb25lIGJ5IEJGQUwuIFNlZQorCQkJCSAqIGVudW0gYmZhX3Bsb2dfbWlkICovCisJdTggICAgICAgICBlaWQ7CS8qIGluZGljYXRlcyBSeCwgVHgsIElPQ1RMLCBldGMuIFNlZQorCQkJCSAqIGVudW0gYmZhX3Bsb2dfZWlkICovCisJdTggICAgICAgICBsb2dfdHlwZTsgLyogaW5kaWNhdGVzIHN0cmluZyBsb2cgb3IgaW50ZWdlciBsb2cuCisJCQkJICAgKiBzZWUgYmZhX3Bsb2dfbG9nX3R5cGVfdCAqLworCXU4ICAgICAgICAgbG9nX251bV9pbnRzOworCS8qCisJICogaW50ZXJwcmV0ZWQgb25seSBpZiBsb2dfdHlwZSBpcyBJTlRfTE9HLiBpbmRpY2F0ZXMgbnVtYmVyIG9mCisJICogaW50ZWdlcnMgaW4gdGhlIGludF9sb2dbXSAoMC1QTF9JTlRfTE9HX1NaKS4KKwkgKi8KKwl1OCAgICAgICAgIHJzdmQ7CisJdTE2ICAgICAgICBtaXNjOwkvKiBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSBmYyBmcmFtZSBsZW5ndGgsCisJCQkJICpldGMuLiAqLworCXVuaW9uIHsKKwkJY2hhciAgICAgICAgICAgIHN0cmluZ19sb2dbQkZBX1BMX1NUUklOR19MT0dfU1pdOworCQl1MzIgICAgICAgIGludF9sb2dbQkZBX1BMX0lOVF9MT0dfU1pdOworCX0gbG9nX2VudHJ5OworCit9OworCisvKgorICogdGhlIGZvbGxvd2luZyAjZGVmaW5lcyB3aWxsIGJlIHVzZWQgYnkgdGhlIGxvZ2dpbmcgZW50aXRpZXMgdG8gaW5kaWNhdGUKKyAqIHRoZWlyIG1vZHVsZSBpZC4gQkZBTCB3aWxsIGNvbnZlcnQgdGhlIGludGVnZXIgdmFsdWUgdG8gc3RyaW5nIGZvcm1hdAorICoKKyogcHJvY2VzcyB0byBiZSB1c2VkIHdoaWxlIGNoYW5naW5nIHRoZSBmb2xsb3dpbmcgI2RlZmluZXM6CisgKiAgLSBBbHdheXMgYWRkIG5ldyBlbnRyaWVzIGF0IHRoZSBlbmQKKyAqICAtIGRlZmluZSBjb3JyZXNwb25kaW5nIHN0cmluZyBpbiBCRkFMCisgKiAgLSBEbyBub3QgcmVtb3ZlIGFueSBlbnRyeSBvciByZWFycmFuZ2UgdGhlIG9yZGVyLgorICovCitlbnVtIGJmYV9wbG9nX21pZCB7CisJQkZBX1BMX01JRF9JTlZBTElEIAk9IDAsCisJQkZBX1BMX01JRF9ERUJVRyAJPSAxLAorCUJGQV9QTF9NSURfRFJWUiAJPSAyLAorCUJGQV9QTF9NSURfSEFMIAkJPSAzLAorCUJGQV9QTF9NSURfSEFMX0ZDWFAgCT0gNCwKKwlCRkFfUExfTUlEX0hBTF9VRiAJPSA1LAorCUJGQV9QTF9NSURfRkNTIAkJPSA2LAorCUJGQV9QTF9NSURfTUFYIAkJPSA3Cit9OworCisjZGVmaW5lIEJGQV9QTF9NSURfU1RSTEVOICAgIDgKK3N0cnVjdCBiZmFfcGxvZ19taWRfc3RyaW5nc19zIHsKKwljaGFyICAgICAgICAgICAgbV9zdHJbQkZBX1BMX01JRF9TVFJMRU5dOworfTsKKworLyoKKyAqIHRoZSBmb2xsb3dpbmcgI2RlZmluZXMgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsb2dnaW5nIGVudGl0aWVzIHRvIGluZGljYXRlCisgKiB0aGVpciBldmVudCB0eXBlLiBCRkFMIHdpbGwgY29udmVydCB0aGUgaW50ZWdlciB2YWx1ZSB0byBzdHJpbmcgZm9ybWF0CisgKgorKiBwcm9jZXNzIHRvIGJlIHVzZWQgd2hpbGUgY2hhbmdpbmcgdGhlIGZvbGxvd2luZyAjZGVmaW5lczoKKyAqICAtIEFsd2F5cyBhZGQgbmV3IGVudHJpZXMgYXQgdGhlIGVuZAorICogIC0gZGVmaW5lIGNvcnJlc3BvbmRpbmcgc3RyaW5nIGluIEJGQUwKKyAqICAtIERvIG5vdCByZW1vdmUgYW55IGVudHJ5IG9yIHJlYXJyYW5nZSB0aGUgb3JkZXIuCisgKi8KK2VudW0gYmZhX3Bsb2dfZWlkIHsKKwlCRkFfUExfRUlEX0lOVkFMSUQgCQk9IDAsCisJQkZBX1BMX0VJRF9JT0NfRElTQUJMRSAJCT0gMSwKKwlCRkFfUExfRUlEX0lPQ19FTkFCTEUgCQk9IDIsCisJQkZBX1BMX0VJRF9QT1JUX0RJU0FCTEUgCT0gMywKKwlCRkFfUExfRUlEX1BPUlRfRU5BQkxFIAkJPSA0LAorCUJGQV9QTF9FSURfUE9SVF9TVF9DSEFOR0UgCT0gNSwKKwlCRkFfUExfRUlEX1RYIAkJCT0gNiwKKwlCRkFfUExfRUlEX1RYX0FDSzEgCQk9IDcsCisJQkZBX1BMX0VJRF9UWF9SSlQgCQk9IDgsCisJQkZBX1BMX0VJRF9UWF9CU1kgCQk9IDksCisJQkZBX1BMX0VJRF9SWCAJCQk9IDEwLAorCUJGQV9QTF9FSURfUlhfQUNLMSAJCT0gMTEsCisJQkZBX1BMX0VJRF9SWF9SSlQgCQk9IDEyLAorCUJGQV9QTF9FSURfUlhfQlNZIAkJPSAxMywKKwlCRkFfUExfRUlEX0NUX0lOIAkJPSAxNCwKKwlCRkFfUExfRUlEX0NUX09VVCAJCT0gMTUsCisJQkZBX1BMX0VJRF9EUklWRVJfU1RBUlQgCT0gMTYsCisJQkZBX1BMX0VJRF9SU0NOIAkJPSAxNywKKwlCRkFfUExfRUlEX0RFQlVHIAkJPSAxOCwKKwlCRkFfUExfRUlEX01JU0MgCQk9IDE5LAorCUJGQV9QTF9FSURfTUFYIAkJCT0gMjAKK307CisKKyNkZWZpbmUgQkZBX1BMX0VOQU1FX1NUUkxFTiAgICAJOAorc3RydWN0IGJmYV9wbG9nX2VpZF9zdHJpbmdzX3MgeworCWNoYXIgICAgICAgICAgICBlX3N0cltCRkFfUExfRU5BTUVfU1RSTEVOXTsKK307CisKKyNkZWZpbmUgQkZBX1BMX1NJR19MRU4JOAorI2RlZmluZSBCRkFfUExfU0lHX1NUUiAgIjEycGwxMjMiCisKKy8qCisgKiBwZXIgcG9ydCBjaXJjdWxhciBsb2cgYnVmZmVyCisgKi8KK3N0cnVjdCBiZmFfcGxvZ19zIHsKKwljaGFyICAgICAgICAgICAgcGxvZ19zaWdbQkZBX1BMX1NJR19MRU5dOwkvKiBTdGFydCBzaWduYXR1cmUgKi8KKwl1OCAgICAgICAgIHBsb2dfZW5hYmxlZDsKKwl1OCAgICAgICAgIHJzdmRbN107CisJdTMyICAgICAgICB0aWNrczsKKwl1MTYgICAgICAgIGhlYWQ7CisJdTE2ICAgICAgICB0YWlsOworCXN0cnVjdCBiZmFfcGxvZ19yZWNfcyAgcGxvZ19yZWNzW0JGQV9QTF9OTE9HX0VOVFNdOworfTsKKwordm9pZCBiZmFfcGxvZ19pbml0KHN0cnVjdCBiZmFfcGxvZ19zICpwbG9nKTsKK3ZvaWQgYmZhX3Bsb2dfc3RyKHN0cnVjdCBiZmFfcGxvZ19zICpwbG9nLCBlbnVtIGJmYV9wbG9nX21pZCBtaWQsCisJCQllbnVtIGJmYV9wbG9nX2VpZCBldmVudCwgdTE2IG1pc2MsIGNoYXIgKmxvZ19zdHIpOwordm9pZCBiZmFfcGxvZ19pbnRhcnIoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2csIGVudW0gYmZhX3Bsb2dfbWlkIG1pZCwKKwkJCWVudW0gYmZhX3Bsb2dfZWlkIGV2ZW50LCB1MTYgbWlzYywKKwkJCXUzMiAqaW50YXJyLCB1MzIgbnVtX2ludHMpOwordm9pZCBiZmFfcGxvZ19mY2hkcihzdHJ1Y3QgYmZhX3Bsb2dfcyAqcGxvZywgZW51bSBiZmFfcGxvZ19taWQgbWlkLAorCQkJZW51bSBiZmFfcGxvZ19laWQgZXZlbnQsIHUxNiBtaXNjLAorCQkJc3RydWN0IGZjaHNfcyAqZmNoZHIpOwordm9pZCBiZmFfcGxvZ19mY2hkcl9hbmRfcGwoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2csIGVudW0gYmZhX3Bsb2dfbWlkIG1pZCwKKwkJCWVudW0gYmZhX3Bsb2dfZWlkIGV2ZW50LCB1MTYgbWlzYywKKwkJCXN0cnVjdCBmY2hzX3MgKmZjaGRyLCB1MzIgcGxkX3cwKTsKK3ZvaWQgYmZhX3Bsb2dfY2xlYXIoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2cpOwordm9pZCBiZmFfcGxvZ19lbmFibGUoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2cpOwordm9pZCBiZmFfcGxvZ19kaXNhYmxlKHN0cnVjdCBiZmFfcGxvZ19zICpwbG9nKTsKK2JmYV9ib29sZWFuX3QJYmZhX3Bsb2dfZ2V0X3NldHRpbmcoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2cpOworCisjZW5kaWYgLyogX19CRkFfUE9SVExPR19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfcS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9xLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4OTVmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfcS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX3EuaCBDaXJjdWxhciBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworCisjaWZuZGVmIF9fQkZBX1FfSF9fCisjZGVmaW5lIF9fQkZBX1FfSF9fCisKKyNkZWZpbmUgYmZhX3FfZmlyc3QoX3EpICgodm9pZCAqKSgoKHN0cnVjdCBsaXN0X2hlYWQgKikgKF9xKSktPm5leHQpKQorI2RlZmluZSBiZmFfcV9uZXh0KF9xZSkJKCgoc3RydWN0IGxpc3RfaGVhZCAqKSAoX3FlKSktPm5leHQpCisjZGVmaW5lIGJmYV9xX3ByZXYoX3FlKSAoKChzdHJ1Y3QgbGlzdF9oZWFkICopIChfcWUpKS0+cHJldikKKworLyoKKyAqIGJmYV9xX3FlX2luaXQgLSB0byBpbml0aWFsaXplIGEgcXVldWUgZWxlbWVudAorICovCisjZGVmaW5lIGJmYV9xX3FlX2luaXQoX3FlKSB7CQkJCQkJXAorCWJmYV9xX25leHQoX3FlKSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopIE5VTEw7CQkJXAorCWJmYV9xX3ByZXYoX3FlKSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopIE5VTEw7CQkJXAorfQorCisvKgorICogYmZhX3FfZGVxIC0gZGVxdWV1ZSBhbiBlbGVtZW50IGZyb20gaGVhZCBvZiB0aGUgcXVldWUKKyAqLworI2RlZmluZSBiZmFfcV9kZXEoX3EsIF9xZSkgewkJCQkJCVwKKwlpZiAoIWxpc3RfZW1wdHkoX3EpKSB7CQkJCQlcCisJCSgqKChzdHJ1Y3QgbGlzdF9oZWFkICoqKSAoX3FlKSkpID0gYmZhX3FfbmV4dChfcSk7CVwKKwkJYmZhX3FfcHJldihiZmFfcV9uZXh0KCooKHN0cnVjdCBsaXN0X2hlYWQgKiopIF9xZSkpKSA9CVwKKwkJCQkJCShzdHJ1Y3QgbGlzdF9oZWFkICopIChfcSk7IFwKKwkJYmZhX3FfbmV4dChfcSkgPSBiZmFfcV9uZXh0KCooKHN0cnVjdCBsaXN0X2hlYWQgKiopIF9xZSkpOyBcCisJCUJGQV9RX0RCR19JTklUKCooKHN0cnVjdCBsaXN0X2hlYWQgKiopIF9xZSkpOwkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJKigoc3RydWN0IGxpc3RfaGVhZCAqKikgKF9xZSkpID0gKHN0cnVjdCBsaXN0X2hlYWQgKikgTlVMTDsgXAorCX0JCQkJCQkJCVwKK30KKworLyoKKyAqIGJmYV9xX2RlcV90YWlsIC0gZGVxdWV1ZSBhbiBlbGVtZW50IGZyb20gdGFpbCBvZiB0aGUgcXVldWUKKyAqLworI2RlZmluZSBiZmFfcV9kZXFfdGFpbChfcSwgX3FlKSB7CQkJCQkgICAgXAorCWlmICghbGlzdF9lbXB0eShfcSkpIHsJCQkJCSAgICAgICAgICAgIFwKKwkJKigoc3RydWN0IGxpc3RfaGVhZCAqKikgKF9xZSkpID0gYmZhX3FfcHJldihfcSk7CSAgICBcCisJCWJmYV9xX25leHQoYmZhX3FfcHJldigqKChzdHJ1Y3QgbGlzdF9oZWFkICoqKSBfcWUpKSkgPSAJICAgIFwKKwkJCQkJCShzdHJ1Y3QgbGlzdF9oZWFkICopIChfcSk7ICBcCisJCWJmYV9xX3ByZXYoX3EpID0gYmZhX3FfcHJldigqKHN0cnVjdCBsaXN0X2hlYWQgKiopIF9xZSk7ICAgIFwKKwkJQkZBX1FfREJHX0lOSVQoKigoc3RydWN0IGxpc3RfaGVhZCAqKikgX3FlKSk7CQkgICAgXAorCX0gZWxzZSB7CQkJCQkJCSAgICBcCisJCSooKHN0cnVjdCBsaXN0X2hlYWQgKiopIChfcWUpKSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopIE5VTEw7IFwKKwl9CQkJCQkJCQkgICAgXAorfQorCisvKgorICogI2lmZGVmIEJGQV9ERUJVRyAoVXNpbmcgYmZhX2Fzc2VydCB0byBjaGVjayBmb3IgZGVidWdfYnVpbGQgaXMgbm90CisgKiBjb25zaXN0ZW50IGFjcm9zcyBtb2R1bGVzKQorICovCisjaWZuZGVmIEJGQV9QRVJGX0JVSUxECisjZGVmaW5lIEJGQV9RX0RCR19JTklUKF9xZSkJYmZhX3FfcWVfaW5pdChfcWUpCisjZWxzZQorI2RlZmluZSBCRkFfUV9EQkdfSU5JVChfcWUpCisjZW5kaWYKKworI2RlZmluZSBiZmFfcV9pc19vbl9xKF9xLCBfcWUpCQlcCisJYmZhX3FfaXNfb25fcV9mdW5jKF9xLCAoc3RydWN0IGxpc3RfaGVhZCAqKShfcWUpKQorZXh0ZXJuIGludCBiZmFfcV9pc19vbl9xX2Z1bmMoc3RydWN0IGxpc3RfaGVhZCAqcSwgc3RydWN0IGxpc3RfaGVhZCAqcWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfc20uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9jcy9iZmFfc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODc3MDY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV9zbS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhc20uaCBTdGF0ZSBtYWNoaW5lIGRlZmluZXMKKyAqLworCisjaWZuZGVmIF9fQkZBX1NNX0hfXworI2RlZmluZSBfX0JGQV9TTV9IX18KKwordHlwZWRlZiB2b2lkICgqYmZhX3NtX3QpKHZvaWQgKnNtLCBpbnQgZXZlbnQpOworCisjZGVmaW5lIGJmYV9zbV9zZXRfc3RhdGUoX3NtLCBfc3RhdGUpCShfc20pLT5zbSA9IChiZmFfc21fdCkoX3N0YXRlKQorI2RlZmluZSBiZmFfc21fc2VuZF9ldmVudChfc20sIF9ldmVudCkJKF9zbSktPnNtKChfc20pLCAoX2V2ZW50KSkKKyNkZWZpbmUgYmZhX3NtX2dldF9zdGF0ZShfc20pCQkoKF9zbSktPnNtKQorI2RlZmluZSBiZmFfc21fY21wX3N0YXRlKF9zbSwgX3N0YXRlKQkoKF9zbSktPnNtID09IChiZmFfc21fdCkoX3N0YXRlKSkKKworLyoqCisgKiBGb3IgY29udmVydGluZyBmcm9tIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gdG8gc3RhdGUgZW5jb2RpbmcuCisgKi8KK3N0cnVjdCBiZmFfc21fdGFibGVfcyB7CisJYmZhX3NtX3QJc207CS8qICBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uCSovCisJaW50CQlzdGF0ZTsJLyogIHN0YXRlIG1hY2hpbmUgZW5jb2RpbmcJKi8KKwljaGFyCQkqbmFtZTsJLyogIHN0YXRlIG5hbWUgZm9yIGRpc3BsYXkJKi8KK307CisjZGVmaW5lIEJGQV9TTShfc20pCSgoYmZhX3NtX3QpKF9zbSkpCisKK2ludCBiZmFfc21fdG9fc3RhdGUoc3RydWN0IGJmYV9zbV90YWJsZV9zICpzbXQsIGJmYV9zbV90IHNtKTsKKworLyoqCisgKiBTdGF0ZSBtYWNoaW5lIHdpdGggZW50cnkgYWN0aW9ucy4KKyAqLwordHlwZWRlZiB2b2lkICgqYmZhX2ZzbV90KSh2b2lkICpmc20sIGludCBldmVudCk7CisKKy8qKgorICogb2MgLSBvYmplY3QgY2xhc3MgZWcuIGJmYV9pb2MKKyAqIHN0IC0gc3RhdGUsIGVnLiByZXNldAorICogb3R5cGUgLSBvYmplY3QgdHlwZSwgZWcuIHN0cnVjdCBiZmFfaW9jX3MKKyAqIGV0eXBlIC0gb2JqZWN0IHR5cGUsIGVnLiBlbnVtIGlvY19ldmVudAorICovCisjZGVmaW5lIGJmYV9mc21fc3RhdGVfZGVjbChvYywgc3QsIG90eXBlLCBldHlwZSkJCVwKKwlzdGF0aWMgdm9pZCBvYyAjIyBfc21fICMjIHN0KG90eXBlICogZnNtLCBldHlwZSBldmVudCk7ICAgICAgXAorCXN0YXRpYyB2b2lkIG9jICMjIF9zbV8gIyMgc3QgIyMgX2VudHJ5KG90eXBlICogZnNtKQorCisjZGVmaW5lIGJmYV9mc21fc2V0X3N0YXRlKF9mc20sIF9zdGF0ZSkgZG8gewlcCisJKF9mc20pLT5mc20gPSAoYmZhX2ZzbV90KShfc3RhdGUpOyAgICAgIFwKKwlfc3RhdGUgIyMgX2VudHJ5KF9mc20pOyAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYmZhX2ZzbV9zZW5kX2V2ZW50KF9mc20sIF9ldmVudCkJXAorCShfZnNtKS0+ZnNtKChfZnNtKSwgKF9ldmVudCkpCisjZGVmaW5lIGJmYV9mc21fY21wX3N0YXRlKF9mc20sIF9zdGF0ZSkJCVwKKwkoKF9mc20pLT5mc20gPT0gKGJmYV9mc21fdCkoX3N0YXRlKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX3RyYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV90cmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc0MzkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV90cmMuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0JGQV9UUkNfSF9fCisjZGVmaW5lIF9fQkZBX1RSQ19IX18KKworI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKworI2lmbmRlZiBCRkFfVFJDX01BWAorI2RlZmluZSBCRkFfVFJDX01BWAkoNCAqIDEwMjQpCisjZW5kaWYKKworI2lmbmRlZiBCRkFfVFJDX1RTCisjZGVmaW5lIEJGQV9UUkNfVFMoX3RyY20pCSgoX3RyY20pLT50aWNrcyArKykKKyNlbmRpZgorCitzdHJ1Y3QgYmZhX3RyY19zIHsKKyNpZmRlZiBfX0JJR0VORElBTgorCXUxNglmaWxlbm87CisJdTE2CWxpbmU7CisjZWxzZQorCXUxNglsaW5lOworCXUxNglmaWxlbm87CisjZW5kaWYKKwl1MzIJdGltZXN0YW1wOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMglyc3ZkOworCQkJdTMyCXUzMjsKKwkJfSB1MzI7CisJCXU2NAl1NjQ7CisJfSBkYXRhOworfTsKKworCitzdHJ1Y3QgYmZhX3RyY19tb2RfcyB7CisJdTMyCWhlYWQ7CisJdTMyCXRhaWw7CisJdTMyCW50cmM7CisJdTMyCXN0b3BwZWQ7CisJdTMyCXRpY2tzOworCXUzMglyc3ZkWzNdOworCXN0cnVjdCBiZmFfdHJjX3MgdHJjW0JGQV9UUkNfTUFYXTsKK307CisKKworZW51bSB7CisJQkZBX1RSQ19GVyAgID0gMSwJLyogIGZpcm13YXJlIG1vZHVsZXMgKi8KKwlCRkFfVFJDX0hBTCAgPSAyLAkvKiAgQkZBIG1vZHVsZXMgKi8KKwlCRkFfVFJDX0ZDUyAgPSAzLAkvKiAgQkZBIEZDUyBtb2R1bGVzICovCisJQkZBX1RSQ19MRFJWID0gNCwJLyogIExpbnV4IGRyaXZlciBtb2R1bGVzICovCisJQkZBX1RSQ19TRFJWID0gNSwJLyogIFNvbGFyaXMgZHJpdmVyIG1vZHVsZXMgKi8KKwlCRkFfVFJDX1ZEUlYgPSA2LAkvKiAgdm13YXJlIGRyaXZlciBtb2R1bGVzICovCisJQkZBX1RSQ19XRFJWID0gNywJLyogIHdpbmRvd3MgZHJpdmVyIG1vZHVsZXMgKi8KKwlCRkFfVFJDX0FFTiAgPSA4LAkvKiAgQUVOIG1vZHVsZSAqLworCUJGQV9UUkNfQklPUyA9IDksCS8qICBiaW9zIGRyaXZlciBtb2R1bGVzICovCisJQkZBX1RSQ19FRkkgID0gMTAsCS8qICBFRkkgZHJpdmVyIG1vZHVsZXMgKi8KKwlCTkFfVFJDX1dEUlYgPSAxMSwJLyogIEJOQSB3aW5kb3dzIGRyaXZlciBtb2R1bGVzICovCisJQk5BX1RSQ19WRFJWID0gMTIsCS8qICBCTkEgdm13YXJlIGRyaXZlciBtb2R1bGVzICovCisJQk5BX1RSQ19TRFJWID0gMTMsCS8qICBCTkEgU29sYXJpcyBkcml2ZXIgbW9kdWxlcyAqLworCUJOQV9UUkNfTERSViA9IDE0LAkvKiAgQk5BIExpbnV4IGRyaXZlciBtb2R1bGVzICovCisJQk5BX1RSQ19IQUwgID0gMTUsCS8qICBCTkEgbW9kdWxlcyAqLworCUJGQV9UUkNfQ05BICA9IDE2LAkvKiAgQ29tbW9uIG1vZHVsZXMgKi8KKwlCTkFfVFJDX0lNRFJWID0gMTcJLyogIEJOQSB3aW5kb3dzIGludGVybWVkaWF0ZSBkcml2ZXIgbW9kdWxlcyAqLworfTsKKyNkZWZpbmUgQkZBX1RSQ19NT0RfU0gJMTAKKyNkZWZpbmUgQkZBX1RSQ19NT0QoX19tb2QpCSgoQkZBX1RSQ18gIyMgX19tb2QpIDw8IEJGQV9UUkNfTU9EX1NIKQorCisvKioKKyAqIERlZmluZSBhIG5ldyB0cmFjaW5nIGZpbGUgKG1vZHVsZSkuIE1vZHVsZSBzaG91bGQgbWF0Y2ggb25lIGRlZmluZWQgYWJvdmUuCisgKi8KKyNkZWZpbmUgQkZBX1RSQ19GSUxFKF9fbW9kLCBfX3N1Ym1vZCkJCQkJCVwKKwlzdGF0aWMgaW50IF9fdHJjX2ZpbGVubyA9ICgoQkZBX1RSQ18gIyMgX19tb2QgIyMgXyAjIyBfX3N1Ym1vZCkgfCBcCisJCQkJCQkgQkZBX1RSQ19NT0QoX19tb2QpKQorCisKKyNkZWZpbmUgYmZhX3RyYzMyKF90cmNwLCBfZGF0YSkJXAorCV9fYmZhX3RyYygoX3RyY3ApLT50cmNtb2QsIF9fdHJjX2ZpbGVubywgX19MSU5FX18sICh1MzIpX2RhdGEpCisKKworI2lmbmRlZiBCRkFfQk9PVF9CVUlMRAorI2RlZmluZSBiZmFfdHJjKF90cmNwLCBfZGF0YSkJXAorCV9fYmZhX3RyYygoX3RyY3ApLT50cmNtb2QsIF9fdHJjX2ZpbGVubywgX19MSU5FX18sICh1NjQpX2RhdGEpCisjZWxzZQordm9pZCBiZmFfYm9vdF90cmMoc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY21vZCwgdTE2IGZpbGVubywKKwkJCXUxNiBsaW5lLCB1MzIgZGF0YSk7CisjZGVmaW5lIGJmYV90cmMoX3RyY3AsIF9kYXRhKQlcCisJYmZhX2Jvb3RfdHJjKChfdHJjcCktPnRyY21vZCwgX190cmNfZmlsZW5vLCBfX0xJTkVfXywgKHUzMilfZGF0YSkKKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmZhX3RyY19pbml0KHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtKQoreworCXRyY20tPmhlYWQgPSB0cmNtLT50YWlsID0gdHJjbS0+c3RvcHBlZCA9IDA7CisJdHJjbS0+bnRyYyA9IEJGQV9UUkNfTUFYOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmZhX3RyY19zdG9wKHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtKQoreworCXRyY20tPnN0b3BwZWQgPSAxOworfQorCisjaWZkZWYgRldUUkMKK2V4dGVybiB2b2lkIGRjX2ZsdXNoKHZvaWQgKmRhdGEpOworI2Vsc2UKKyNkZWZpbmUgZGNfZmx1c2goZGF0YSkKKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19iZmFfdHJjKHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtLCBpbnQgZmlsZW5vLCBpbnQgbGluZSwgdTY0IGRhdGEpCit7CisJaW50CQl0YWlsID0gdHJjbS0+dGFpbDsKKwlzdHJ1Y3QgYmZhX3RyY19zIAkqdHJjID0gJnRyY20tPnRyY1t0YWlsXTsKKworCWlmICh0cmNtLT5zdG9wcGVkKQorCQlyZXR1cm47CisKKwl0cmMtPmZpbGVubyA9ICh1MTYpIGZpbGVubzsKKwl0cmMtPmxpbmUgPSAodTE2KSBsaW5lOworCXRyYy0+ZGF0YS51NjQgPSBkYXRhOworCXRyYy0+dGltZXN0YW1wID0gQkZBX1RSQ19UUyh0cmNtKTsKKwlkY19mbHVzaCh0cmMpOworCisJdHJjbS0+dGFpbCA9ICh0cmNtLT50YWlsICsgMSkgJiAoQkZBX1RSQ19NQVggLSAxKTsKKwlpZiAodHJjbS0+dGFpbCA9PSB0cmNtLT5oZWFkKQorCQl0cmNtLT5oZWFkID0gKHRyY20tPmhlYWQgKyAxKSAmIChCRkFfVFJDX01BWCAtIDEpOworCWRjX2ZsdXNoKHRyY20pOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19iZmFfdHJjMzIoc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY20sIGludCBmaWxlbm8sIGludCBsaW5lLCB1MzIgZGF0YSkKK3sKKwlpbnQJCXRhaWwgPSB0cmNtLT50YWlsOworCXN0cnVjdCBiZmFfdHJjX3MgKnRyYyA9ICZ0cmNtLT50cmNbdGFpbF07CisKKwlpZiAodHJjbS0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJdHJjLT5maWxlbm8gPSAodTE2KSBmaWxlbm87CisJdHJjLT5saW5lID0gKHUxNikgbGluZTsKKwl0cmMtPmRhdGEudTMyLnUzMiA9IGRhdGE7CisJdHJjLT50aW1lc3RhbXAgPSBCRkFfVFJDX1RTKHRyY20pOworCWRjX2ZsdXNoKHRyYyk7CisKKwl0cmNtLT50YWlsID0gKHRyY20tPnRhaWwgKyAxKSAmIChCRkFfVFJDX01BWCAtIDEpOworCWlmICh0cmNtLT50YWlsID09IHRyY20tPmhlYWQpCisJCXRyY20tPmhlYWQgPSAodHJjbS0+aGVhZCArIDEpICYgKEJGQV9UUkNfTUFYIC0gMSk7CisJZGNfZmx1c2godHJjbSk7Cit9CisKKyNpZm5kZWYgQkZBX1BFUkZfQlVJTEQKKyNkZWZpbmUgYmZhX3RyY19mcChfdHJjcCwgX2RhdGEpCWJmYV90cmMoX3RyY3AsIF9kYXRhKQorI2Vsc2UKKyNkZWZpbmUgYmZhX3RyY19mcChfdHJjcCwgX2RhdGEpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQkZBX1RSQ19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV93Yy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2NzL2JmYV93Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjBiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvY3MvYmZhX3djLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFfd2MuaCBHZW5lcmljIHdhaXQgY291bnRlci4KKyAqLworCisjaWZuZGVmIF9fQkZBX1dDX0hfXworI2RlZmluZSBfX0JGQV9XQ19IX18KKwordHlwZWRlZiB2b2lkICgqYmZhX3djX3Jlc3VtZV90KSAodm9pZCAqY2JhcmcpOworCitzdHJ1Y3QgYmZhX3djX3MgeworCWJmYV93Y19yZXN1bWVfdCB3Y19yZXN1bWU7CisJdm9pZAkJKndjX2NiYXJnOworCWludAkJd2NfY291bnQ7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK2JmYV93Y191cChzdHJ1Y3QgYmZhX3djX3MgKndjKQoreworCXdjLT53Y19jb3VudCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2JmYV93Y19kb3duKHN0cnVjdCBiZmFfd2NfcyAqd2MpCit7CisJd2MtPndjX2NvdW50LS07CisJaWYgKHdjLT53Y19jb3VudCA9PSAwKQorCQl3Yy0+d2NfcmVzdW1lKHdjLT53Y19jYmFyZyk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhIHdhaXRpbmcgY291bnRlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitiZmFfd2NfaW5pdChzdHJ1Y3QgYmZhX3djX3MgKndjLCBiZmFfd2NfcmVzdW1lX3Qgd2NfcmVzdW1lLCB2b2lkICp3Y19jYmFyZykKK3sKKwl3Yy0+d2NfcmVzdW1lID0gd2NfcmVzdW1lOworCXdjLT53Y19jYmFyZyA9IHdjX2NiYXJnOworCXdjLT53Y19jb3VudCA9IDA7CisJYmZhX3djX3VwKHdjKTsKK30KKworLyoqCisgKiBXYWl0IGZvciBjb3VudGVyIHRvIHJlYWNoIHplcm8KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitiZmFfd2Nfd2FpdChzdHJ1Y3QgYmZhX3djX3MgKndjKQoreworCWJmYV93Y19kb3duKHdjKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hZGFwdGVyLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hZGFwdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMDhmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2FkYXB0ZXIuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQkZBX0RFRlNfQURBUFRFUl9IX18KKyNkZWZpbmUgX19CRkFfREVGU19BREFQVEVSX0hfXworCisjaW5jbHVkZSA8cHJvdG9jb2wvdHlwZXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX21mZy5oPgorCisvKioKKyAqIEJGQSBhZGFwdGVyIGxldmVsIGF0dHJpYnV0ZXMuCisgKi8KK2VudW0geworCUJGQV9BREFQVEVSX1NFUklBTF9OVU1fTEVOID0gU1RSU1ooQkZBX01GR19TRVJJQUxOVU1fU0laRSksCisJCQkJCS8qCisJCQkJCSAqITwgYWRhcHRlciBzZXJpYWwgbnVtIGxlbmd0aAorCQkJCQkgKi8KKwlCRkFfQURBUFRFUl9NT0RFTF9OQU1FX0xFTiAgPSAxNiwgIC8qICBtb2RlbCBuYW1lIGxlbmd0aCAqLworCUJGQV9BREFQVEVSX01PREVMX0RFU0NSX0xFTiA9IDEyOCwgLyogIG1vZGVsIGRlc2NyaXB0aW9uIGxlbmd0aCAqLworCUJGQV9BREFQVEVSX01GR19OQU1FX0xFTiAgICA9IDgsICAgLyogIG1hbnVmYWN0dXJlciBuYW1lIGxlbmd0aCAqLworCUJGQV9BREFQVEVSX1NZTV9OQU1FX0xFTiAgICA9IDY0LCAgLyogIGFkYXB0ZXIgc3ltYm9saWMgbmFtZSBsZW5ndGggKi8KKwlCRkFfQURBUFRFUl9PU19UWVBFX0xFTgkgICAgPSA2NCwgIC8qICBhZGFwdGVyIG9zIHR5cGUgbGVuZ3RoICovCit9OworCitzdHJ1Y3QgYmZhX2FkYXB0ZXJfYXR0cl9zIHsKKwljaGFyICAgICAgICAgICAgbWFudWZhY3R1cmVyW0JGQV9BREFQVEVSX01GR19OQU1FX0xFTl07CisJY2hhciAgICAgICAgICAgIHNlcmlhbF9udW1bQkZBX0FEQVBURVJfU0VSSUFMX05VTV9MRU5dOworCXUzMglyc3ZkMTsKKwljaGFyICAgICAgICAgICAgbW9kZWxbQkZBX0FEQVBURVJfTU9ERUxfTkFNRV9MRU5dOworCWNoYXIgICAgICAgICAgICBtb2RlbF9kZXNjcltCRkFfQURBUFRFUl9NT0RFTF9ERVNDUl9MRU5dOworCXd3bl90ICAgICAgICAgICBwd3duOworCWNoYXIgICAgICAgICAgICBub2RlX3N5bW5hbWVbRkNfU1lNTkFNRV9NQVhdOworCWNoYXIgICAgICAgICAgICBod192ZXJbQkZBX1ZFUlNJT05fTEVOXTsKKwljaGFyICAgICAgICAgICAgZndfdmVyW0JGQV9WRVJTSU9OX0xFTl07CisJY2hhciAgICAgICAgICAgIG9wdHJvbV92ZXJbQkZBX1ZFUlNJT05fTEVOXTsKKwljaGFyICAgICAgICAgICAgb3NfdHlwZVtCRkFfQURBUFRFUl9PU19UWVBFX0xFTl07CisJc3RydWN0IGJmYV9tZmdfdnBkX3MJdnBkOworCXN0cnVjdCBtYWNfcwltYWM7CisKKwl1OAkJbnBvcnRzOworCXU4CQltYXhfc3BlZWQ7CisJdTgJCXByb3RvdHlwZTsKKwljaGFyCSAgICAgICAgYXNpY19yZXY7CisKKwl1OCAgICAgICAgIHBjaWVfZ2VuOworCXU4ICAgICAgICAgcGNpZV9sYW5lc19vcmlnOworCXU4ICAgICAgICAgcGNpZV9sYW5lczsKKwl1OAkgICAgICAgIGNuYV9jYXBhYmxlOworfTsKKworLyoqCisgKiBCRkEgYWRhcHRlciBsZXZlbCBldmVudHMKKyAqIEFyZ3VtZW50cyBiZWxvdyBhcmUgaW4gQkZBTCBjb250ZXh0IGZyb20gTWdtdAorICogQkZBX1BPUlRfQUVOX0FERDogICAgICAgIFtpbl06IE5vbmUgICAgIFtvdXRdOiBzZXJpYWxfbnVtLCBwd3duLCBucG9ydHMKKyAqIEJGQV9QT1JUX0FFTl9SRU1PVkU6ICAgICBbaW5dOiBwd3duICAgICBbb3V0XTogc2VyaWFsX251bSwgcHd3biwgbnBvcnRzCisgKi8KK2VudW0gYmZhX2FkYXB0ZXJfYWVuX2V2ZW50IHsKKwlCRkFfQURBUFRFUl9BRU5fQUREIAk9IDEsCS8qICBOZXcgQWRhcHRlciBmb3VuZCBldmVudCAqLworCUJGQV9BREFQVEVSX0FFTl9SRU1PVkUgCT0gMiwJLyogIEFkYXB0ZXIgcmVtb3ZlZCBldmVudCAqLworfTsKKworc3RydWN0IGJmYV9hZGFwdGVyX2Flbl9kYXRhX3MgeworCWNoYXIgICAgICAgICAgICBzZXJpYWxfbnVtW0JGQV9BREFQVEVSX1NFUklBTF9OVU1fTEVOXTsKKwl1MzIgICAgICAgIG5wb3J0czsJLyogIE51bWJlciBvZiBOUG9ydHMgKi8KKwl3d25fdCAgICAgICAgICAgcHd3bjsJLyogIFdXTiBvZiBvbmUgb2YgaXRzIHBoeXNpY2FsIHBvcnQgKi8KK307CisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX0FEQVBURVJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hZW4uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2Flbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODFhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hZW4uaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19BRU5fSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfQUVOX0hfXworCisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc190eXBlcy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfaW9jLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19hZGFwdGVyLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19wb3J0Lmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19scG9ydC5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcnBvcnQuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2l0bmltLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc190aW4uaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2lwZmMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2F1ZGl0Lmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19ldGhwb3J0Lmg+CisKK2VudW0gYmZhX2Flbl9jYXRlZ29yeSB7CisJQkZBX0FFTl9DQVRfQURBUFRFUiAJPSAxLAorCUJGQV9BRU5fQ0FUX1BPUlQgCT0gMiwKKwlCRkFfQUVOX0NBVF9MUE9SVCAJPSAzLAorCUJGQV9BRU5fQ0FUX1JQT1JUIAk9IDQsCisJQkZBX0FFTl9DQVRfSVROSU0gCT0gNSwKKwlCRkFfQUVOX0NBVF9USU4gCT0gNiwKKwlCRkFfQUVOX0NBVF9JUEZDIAk9IDcsCisJQkZBX0FFTl9DQVRfQVVESVQgCT0gOCwKKwlCRkFfQUVOX0NBVF9JT0MgCT0gOSwKKwlCRkFfQUVOX0NBVF9FVEhQT1JUCT0gMTAsCisJQkZBX0FFTl9NQVhfQ0FUIAk9IDEwCit9OworCisjcHJhZ21hIHBhY2soMSkKK3VuaW9uIGJmYV9hZW5fZGF0YV91IHsKKwlzdHJ1Y3QgYmZhX2FkYXB0ZXJfYWVuX2RhdGFfcyAJYWRhcHRlcjsKKwlzdHJ1Y3QgYmZhX3BvcnRfYWVuX2RhdGFfcyAJcG9ydDsKKwlzdHJ1Y3QgYmZhX2xwb3J0X2Flbl9kYXRhX3MgCWxwb3J0OworCXN0cnVjdCBiZmFfcnBvcnRfYWVuX2RhdGFfcyAJcnBvcnQ7CisJc3RydWN0IGJmYV9pdG5pbV9hZW5fZGF0YV9zIAlpdG5pbTsKKwlzdHJ1Y3QgYmZhX2F1ZGl0X2Flbl9kYXRhX3MgCWF1ZGl0OworCXN0cnVjdCBiZmFfaW9jX2Flbl9kYXRhX3MgCWlvYzsKKwlzdHJ1Y3QgYmZhX2V0aHBvcnRfYWVuX2RhdGFfcyAJZXRocG9ydDsKK307CisKK3N0cnVjdCBiZmFfYWVuX2VudHJ5X3MgeworCWVudW0gYmZhX2Flbl9jYXRlZ29yeSAJYWVuX2NhdGVnb3J5OworCWludAkJCWFlbl90eXBlOworCXVuaW9uIGJmYV9hZW5fZGF0YV91ICAJYWVuX2RhdGE7CisJc3RydWN0IGJmYV90aW1ldmFsX3MgICAJYWVuX3R2OworCXMzMiAgICAgICAgIAlzZXFfbnVtOworCXMzMiAgICAgICAgIAliZmFkX251bTsKKwlzMzIgICAgICAgICAJcnN2ZFsxXTsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKyNkZWZpbmUgYmZhX2Flbl9ldmVudF90IGludAorCisjZW5kaWYgLyogX19CRkFfREVGU19BRU5fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hdWRpdC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfYXVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNhOTYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfYXVkaXQuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19BVURJVF9IX18KKyNkZWZpbmUgX19CRkFfREVGU19BVURJVF9IX18KKworI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKworLyoqCisgKiBCRkEgYXVkaXQgZXZlbnRzCisgKi8KK2VudW0gYmZhX2F1ZGl0X2Flbl9ldmVudCB7CisJQkZBX0FVRElUX0FFTl9BVVRIX0VOQUJMRSAJPSAxLAorCUJGQV9BVURJVF9BRU5fQVVUSF9ESVNBQkxFIAk9IDIsCit9OworCisvKioKKyAqIGF1ZGl0IGV2ZW50IGRhdGEKKyAqLworc3RydWN0IGJmYV9hdWRpdF9hZW5fZGF0YV9zIHsKKwl3d25fdCAgICAgICAgICAgcHd3bjsKK307CisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX0FVRElUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfYXV0aC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfYXV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTljODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19hdXRoLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRkFfREVGU19BVVRIX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX0FVVEhfSF9fCisKKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3R5cGVzLmg+CisKKyNkZWZpbmUgUFVCTElDX0tFWQkJCTE1NDA5CisjZGVmaW5lIFBSSVZBVEVfS0VZCQkJMTkwMDkKKyNkZWZpbmUgS0VZX0xFTgkJCQkzMjM5OQorI2RlZmluZSBCRkFfQVVUSF9TRUNSRVRfU1RSSU5HX0xFTgkyNTYKKyNkZWZpbmUgQkZBX0FVVEhfRkFJTF9USU1FT1VUCQkweEZGCisKKy8qKgorICogQXV0aGVudGljYXRpb24gc3RhdHVzCisgKi8KK2VudW0gYmZhX2F1dGhfc3RhdHVzIHsKKwlCRkFfQVVUSF9TVEFUVVNfTk9ORSAJPSAwLAkvKiAgbm8gYXV0aGVudGljYXRpb24gKi8KKwlCRkFfQVVUSF9VTklOSVQgCT0gMSwJLyogIHN0YXRlIC0gdW5pbml0ICovCisJQkZBX0FVVEhfTkVHX1NFTkQgCT0gMiwJLyogIHN0YXRlIC0gbmVnb3RpYXRlIHNlbmQgKi8KKwlCRkFfQVVUSF9DSEFMX1dBSVQgCT0gMywJLyogIHN0YXRlIC0gY2hhbGxlbmdlIHdhaXQgKi8KKwlCRkFfQVVUSF9ORUdfUkVUUlkgCT0gNCwJLyogIHN0YXRlIC0gbmVnb3RpYXRlIHJldHJ5ICovCisJQkZBX0FVVEhfUkVQTFlfU0VORCAJPSA1LAkvKiAgc3RhdGUgLSByZXBseSBzZW5kICovCisJQkZBX0FVVEhfU1RBVFVTX1dBSVQgCT0gNiwJLyogIHN0YXRlIC0gc3RhdHVzIHdhaXQgKi8KKwlCRkFfQVVUSF9TVUNDRVNTIAk9IDcsCS8qICBzdGF0ZSAtIHN1Y2Nlc3MgKi8KKwlCRkFfQVVUSF9GQUlMRUQgCT0gOCwJLyogIHN0YXRlIC0gZmFpbGVkICovCisJQkZBX0FVVEhfU1RBVFVTX1VOS05PV04gPSA5LAkvKiAgYXV0aGVudGljYXRpb24gc3RhdHVzIHVua25vd24gKi8KK307CisKK3N0cnVjdCBhdXRoX3Byb3RvX3N0YXRzX3MgeworCXUzMiAgICAgICAgYXV0aF9yanRzOworCXUzMiAgICAgICAgYXV0aF9uZWdzOworCXUzMiAgICAgICAgYXV0aF9kb25lczsKKworCXUzMiAgICAgICAgZGhjaGFwX2NoYWxsZW5nZXM7CisJdTMyICAgICAgICBkaGNoYXBfcmVwbGllczsKKwl1MzIgICAgICAgIGRoY2hhcF9zdWNjZXNzZXM7Cit9OworCisvKioKKyAqIEF1dGhlbnRpY2F0aW9uIHJlbGF0ZWQgc3RhdGlzdGljcworICovCitzdHJ1Y3QgYmZhX2F1dGhfc3RhdHNfcyB7CisJdTMyICAgICAgICAgICBhdXRoX2ZhaWx1cmVzOwkvKiAgYXV0aGVudGljYXRpb24gZmFpbHVyZXMgKi8KKwl1MzIgICAgICAgICAgIGF1dGhfc3VjY2Vzc2VzOwkvKiAgYXV0aGVudGljYXRpb24gc3VjY2Vzc2VzKi8KKwlzdHJ1Y3QgYXV0aF9wcm90b19zdGF0c19zIGF1dGhfcnhfc3RhdHM7IC8qICBSeCBwcm90b2NvbCBzdGF0cyAqLworCXN0cnVjdCBhdXRoX3Byb3RvX3N0YXRzX3MgYXV0aF90eF9zdGF0czsgLyogIFR4IHByb3RvY29sIHN0YXRzICovCit9OworCisvKioKKyAqIEF1dGhlbnRpY2F0aW9uIGhhc2ggZnVuY3Rpb24gYWxnb3JpdGhtcworICovCitlbnVtIGJmYV9hdXRoX2FsZ28geworCUJGQV9BVVRIX0FMR09fTUQ1IAk9IDEsCS8qICBNZXNzYWdlLURpZ2VzdCBhbGdvcml0aG0gNSAqLworCUJGQV9BVVRIX0FMR09fU0hBMSAJPSAyLAkvKiAgU2VjdXJlIEhhc2ggQWxnb3JpdGhtIDEgKi8KKwlCRkFfQVVUSF9BTEdPX01TIAk9IDMsCS8qICBNRDUsIHRoZW4gU0hBLTEgKi8KKwlCRkFfQVVUSF9BTEdPX1NNIAk9IDQsCS8qICBTSEEtMSwgdGhlbiBNRDUgKi8KK307CisKKy8qKgorICogREggR3JvdXBzCisgKgorICogQ3VycmVudCB2YWx1ZSBjb3VsZCBiZSBjb21iaW5hdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICovCitlbnVtIGJmYV9hdXRoX2dyb3VwIHsKKwlCRkFfQVVUSF9HUk9VUF9ESE5VTEwgCT0gMCwJLyogIERIIE5VTEwgKHZhbHVlID09IDApICovCisJQkZBX0FVVEhfR1JPVVBfREg3NjggCT0gMSwJLyogIERIIGdyb3VwIDc2OCAodmFsdWUgPT0gMSkgKi8KKwlCRkFfQVVUSF9HUk9VUF9ESDEwMjQgCT0gMiwJLyogIERIIGdyb3VwIDEwMjQgKHZhbHVlID09IDIpICovCisJQkZBX0FVVEhfR1JPVVBfREgxMjgwIAk9IDQsCS8qICBESCBncm91cCAxMjgwICh2YWx1ZSA9PSAzKSAqLworCUJGQV9BVVRIX0dST1VQX0RIMTUzNiAJPSA4LAkvKiAgREggZ3JvdXAgMTUzNiAodmFsdWUgPT0gNCkgKi8KKworCUJGQV9BVVRIX0dST1VQX0FMTCAJPSAyNTYJLyogIFVzZSBkZWZhdWx0IERIIGdyb3VwIG9yZGVyCisJCQkJCSAqICAgIDAsIDEsIDIsIDMsIDQgKi8KK307CisKKy8qKgorICogQXV0aGVudGljYXRpb24gc2VjcmV0IHNvdXJjZXMKKyAqLworZW51bSBiZmFfYXV0aF9zZWNyZXRzb3VyY2UgeworCUJGQV9BVVRIX1NFQ1NSQ19MT0NBTCAJPSAxLAkvKiAgbG9jYWxseSBjb25maWd1cmVkICovCisJQkZBX0FVVEhfU0VDU1JDX1JBRElVUyAJPSAyLAkvKiAgdXNlIHJhZGl1cyBzZXJ2ZXIgKi8KKwlCRkFfQVVUSF9TRUNTUkNfVEFDQUNTIAk9IDMsCS8qICBUQUNBQ1Mgc2VydmVyICovCit9OworCisvKioKKyAqIEF1dGhlbnRpY2F0aW9uIGF0dHJpYnV0ZXMKKyAqLworc3RydWN0IGJmYV9hdXRoX2F0dHJfcyB7CisJZW51bSBiZmFfYXV0aF9zdGF0dXMgCXN0YXR1czsKKwllbnVtIGJmYV9hdXRoX2FsZ28gCWFsZ287CisJZW51bSBiZmFfYXV0aF9ncm91cCAJZGhfZ3JwOworCXUxNgkJcmp0X2NvZGU7CisJdTE2CQlyanRfY29kZV9leHA7CisJdTgJCQlzZWNyZXRfc2V0OworCXU4CQkJcmVzdls3XTsKK307CisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX0FVVEhfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19ib290LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19ib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0YWE1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2Jvb3QuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19CT09UX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX0JPT1RfSF9fCisKKyNpbmNsdWRlIDxwcm90b2NvbC90eXBlcy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfdHlwZXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Bwb3J0Lmg+CisKK2VudW0geworCUJGQV9CT09UX0JPT1RMVU5fTUFYID0gNCwJLyogIG1heGltdW0gYm9vdCBsdW4gcGVyIElPQyAqLworfTsKKworI2RlZmluZSBCT09UX0NGR19SRVYxCTEKKworLyoqCisgKiAgICAgIEJvb3Qgb3B0aW9ucyBzZXR0aW5nLiBCb290IG9wdGlvbnMgc2V0dGluZyBkZXRlcm1pbmVzIGZyb20gd2hlcmUKKyAqICAgICAgdG8gZ2V0IHRoZSBib290IGx1biBpbmZvcm1hdGlvbgorICovCitlbnVtIGJmYV9ib290X2Jvb3RvcHQgeworICAgIEJGQV9CT09UX0FVVE9fRElTQ09WRVIgPSAwLCAgICAvKiAgQm9vdCBmcm9tIGJsdW4gcHJvdmlkZWQgYnkgZmFicmljICovCisgICAgQkZBX0JPT1RfU1RPUkVEX0JMVU4gICA9IDEsICAgIC8qICBCb290IGZyb20gYmx1bnMgc3RvcmVkIGluIGZsYXNoICAgKi8KKyAgICBCRkFfQk9PVF9GSVJTVF9MVU4gICAgID0gMiwgICAgLyogIEJvb3QgZnJvbSBmaXJzdCBkaXNjb3ZlcmVkIGJsdW4gICAqLworfTsKKworLyoqCisgKiBCb290IGx1biBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGJmYV9ib290X2Jvb3RsdW5fcyB7CisJd3duX3QgICAgICAgICAgIHB3d247CS8qICBwb3J0IHd3biBvZiB0YXJnZXQgKi8KKwlsdW5fdCAgICAgICAgICAgbHVuOwkvKiAgNjQtYml0IGx1biAqLworfTsKKworLyoqCisgKiBCT09UIGJvb3QgY29uZmlndXJhdG9uCisgKi8KK3N0cnVjdCBiZmFfYm9vdF9jZmdfcyB7CisJdTggICAgICAgICB2ZXJzaW9uOworCXU4ICAgICAgICAgcnN2ZDE7CisJdTE2ICAgICAgICBjaGtzdW07CisKKwl1OCAgICAgICAgIGVuYWJsZTsJCS8qICBlbmFibGUvZGlzYWJsZSBTQU4gYm9vdCAqLworCXU4ICAgICAgICAgc3BlZWQ7CQkvKiAgYm9vdCBzcGVlZCBzZXR0aW5ncyAqLworCXU4ICAgICAgICAgdG9wb2xvZ3k7CS8qICBib290IHRvcG9sb2d5IHNldHRpbmcgKi8KKwl1OCAgICAgICAgIGJvb3RvcHQ7CS8qICBiZmFfYm9vdF9ib290b3B0X3QgKi8KKworCXUzMiAgICAgICAgbmJsdW5zOwkJLyogIG51bWJlciBvZiBib290IGx1bnMgKi8KKworCXUzMiAgICAgICAgcnN2ZDI7CisKKwlzdHJ1Y3QgYmZhX2Jvb3RfYm9vdGx1bl9zIGJsdW5bQkZBX0JPT1RfQk9PVExVTl9NQVhdOworCXN0cnVjdCBiZmFfYm9vdF9ib290bHVuX3MgYmx1bl9kaXNjW0JGQV9CT09UX0JPT1RMVU5fTUFYXTsKK307CisKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfQk9PVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2NlZS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfY2VlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYTIyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2NlZS5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiAgYmZhX2RlZnNfY2VlLmggSW50ZXJmYWNlIGRlY2xhcmF0aW9ucyBiZXR3ZWVuIGhvc3QgYmFzZWQKKyAqCUJGQUwgYW5kIERDQlgvTExEUCBtb2R1bGUgaW4gRmlybXdhcmUKKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQkZBX0RFRlNfQ0VFX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX0NFRV9IX18KKworI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfdHlwZXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Bwb3J0Lmg+CisjaW5jbHVkZSA8cHJvdG9jb2wvdHlwZXMuaD4KKworI3ByYWdtYSBwYWNrKDEpCisKKyNkZWZpbmUgQkZBX0NFRV9MTERQX01BWF9TVFJJTkdfTEVOICgxMjgpCisKKworLyogRklYTUU6IHRoaXMgaXMgY29taW5nIGZyb20gdGhlIHByb3RvY29sIHNwZWMuIENhbiB0aGUgaG9zdCAmIGFwcHMgc2hhcmUgdGhlCisgICBwcm90b2NvbCAuaCBmaWxlcyA/CisgKi8KKyNkZWZpbmUgQkZBX0NFRV9MTERQX1NZU19DQVBfT1RIRVIgICAgICAgMHgwMDAxCisjZGVmaW5lIEJGQV9DRUVfTExEUF9TWVNfQ0FQX1JFUEVBVEVSICAgIDB4MDAwMgorI2RlZmluZSBCRkFfQ0VFX0xMRFBfU1lTX0NBUF9NQUNfQlJJREdFICAweDAwMDQKKyNkZWZpbmUgQkZBX0NFRV9MTERQX1NZU19DQVBfV0xBTl9BUCAgICAgMHgwMDA4CisjZGVmaW5lIEJGQV9DRUVfTExEUF9TWVNfQ0FQX1JPVVRFUiAgICAgIDB4MDAxMAorI2RlZmluZSBCRkFfQ0VFX0xMRFBfU1lTX0NBUF9URUxFUEhPTkUgCSAweDAwMjAKKyNkZWZpbmUgQkZBX0NFRV9MTERQX1NZU19DQVBfRE9DU0lTX0NEICAgMHgwMDQwCisjZGVmaW5lIEJGQV9DRUVfTExEUF9TWVNfQ0FQX1NUQVRJT04gICAgIDB4MDA4MAorI2RlZmluZSBCRkFfQ0VFX0xMRFBfU1lTX0NBUF9DVkxBTgkgICAgIDB4MDEwMAorI2RlZmluZSBCRkFfQ0VFX0xMRFBfU1lTX0NBUF9TVkxBTiAJICAgICAweDAyMDAKKyNkZWZpbmUgQkZBX0NFRV9MTERQX1NZU19DQVBfVFBNUgkJIDB4MDQwMAorCisKKy8qIExMRFAgc3RyaW5nIHR5cGUgKi8KK3N0cnVjdCBiZmFfY2VlX2xsZHBfc3RyX3MgeworCXU4IHN1Yl90eXBlOworCXU4IGxlbjsKKwl1OCByc3ZkWzJdOworCXU4IHZhbHVlW0JGQV9DRUVfTExEUF9NQVhfU1RSSU5HX0xFTl07Cit9OworCisKKy8qIExMRFAgcGFyYW10ZXJzICovCitzdHJ1Y3QgYmZhX2NlZV9sbGRwX2NmZ19zIHsKKwlzdHJ1Y3QgYmZhX2NlZV9sbGRwX3N0cl9zIGNoYXNzaXNfaWQ7CisJc3RydWN0IGJmYV9jZWVfbGxkcF9zdHJfcyBwb3J0X2lkOworCXN0cnVjdCBiZmFfY2VlX2xsZHBfc3RyX3MgcG9ydF9kZXNjOworCXN0cnVjdCBiZmFfY2VlX2xsZHBfc3RyX3Mgc3lzX25hbWU7CisJc3RydWN0IGJmYV9jZWVfbGxkcF9zdHJfcyBzeXNfZGVzYzsKKwlzdHJ1Y3QgYmZhX2NlZV9sbGRwX3N0cl9zIG1nbXRfYWRkcjsKKwl1MTYgICAgdGltZV90b19pbnRlcnZhbDsKKwl1MTYgICAgZW5hYmxlZF9zeXN0ZW1fY2FwOworfTsKKworZW51bSBiZmFfY2VlX2RjYnhfdmVyc2lvbl9lIHsKKwlEQ0JYX1BST1RPQ09MX1BSRUNFRSA9IDEsCisJRENCWF9QUk9UT0NPTF9DRUUgICAgPSAyLAorfTsKKworZW51bSBiZmFfY2VlX2xsc19lIHsKKwlDRUVfTExTX0RPV05fTk9fVExWID0gMCwgLyogTExTIGlzIGRvd24gYmVjYXVzZSB0aGUgVExWIG5vdCBzZW50IGJ5CisJCQkJICAqIHRoZSBwZWVyICovCisJQ0VFX0xMU19ET1dOICAgICAgICA9IDEsIC8qIExMUyBpcyBkb3duIGFzIGFkdmVydGlzZWQgYnkgdGhlIHBlZXIgKi8KKwlDRUVfTExTX1VQICAgICAgICAgID0gMiwKK307CisKKy8qIENFRS9EQ0JYIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBiZmFfY2VlX2RjYnhfY2ZnX3MgeworCXU4IHBnaWRbOF07CisJdTggcGdfcGVyY2VudGFnZVs4XTsKKwl1OCBwZmNfZW5hYmxlZDsgICAgICAgICAgLyogYml0bWFwIG9mIHByaW9ydGllcyB3aXRoIFBGQyBlbmFibGVkICovCisJdTggZmNvZV91c2VyX3ByaW9yaXR5OyAgIC8qIGJpdG1hcCBvZiBwcmlvcml0aWVzIHVzZWQgZm9yIEZjb0UKKwkJCQkgICAgICAgKiB0cmFmZmljICovCisJdTggZGNieF92ZXJzaW9uOwkvKiBvcGVyYXRpbmcgdmVyc2lvbjpDRUUgb3IgcHJlQ0VFICovCisJdTggbGxzX2Zjb2U7CS8qIEZDb0UgTG9naWNhbCBMaW5rIFN0YXR1cyAqLworCXU4IGxsc19sYW47CS8qIExBTiBMb2dpY2FsIExpbmsgU3RhdHVzICovCisJdTggcnN2ZFszXTsKK307CisKKy8qIENFRSBzdGF0dXMgKi8KKy8qIE1ha2luZyB0aGlzIHRvIHRyaS1zdGF0ZSBmb3IgdGhlIGJlbmVmaXQgb2YgcG9ydCBsaXN0IGNvbW1hbmQgKi8KK2VudW0gYmZhX2NlZV9zdGF0dXNfZSB7CisgICAgQ0VFX1BIWV9ET1dOID0gMCwKKyAgICBDRUVfUEhZX1VQID0gMSwKKyAgICBDRUVfVVAgPSAyLAorfTsKKworLyogQ0VFIFF1ZXJ5ICovCitzdHJ1Y3QgYmZhX2NlZV9hdHRyX3MgeworCXU4ICAgICAgICAgICAgICAgICAgIGNlZV9zdGF0dXM7CisJdTggICAgICAgICAgICAgICAgICAgZXJyb3JfcmVhc29uOworCXN0cnVjdCBiZmFfY2VlX2xsZHBfY2ZnX3MgbGxkcF9yZW1vdGU7CisJc3RydWN0IGJmYV9jZWVfZGNieF9jZmdfcyBkY2J4X3JlbW90ZTsKKwltYWNfdCBzcmNfbWFjOworCXU4IGxpbmtfc3BlZWQ7CisJdTggZmlsbGVyWzNdOworfTsKKworCisKKworLyogTExEUC9EQ0JYL0NFRSBTdGF0aXN0aWNzICovCisKK3N0cnVjdCBiZmFfY2VlX2xsZHBfc3RhdHNfcyB7CisJdTMyIGZyYW1lc190cmFuc21pdHRlZDsKKwl1MzIgZnJhbWVzX2FnZWRfb3V0OworCXUzMiBmcmFtZXNfZGlzY2FyZGVkOworCXUzMiBmcmFtZXNfaW5fZXJyb3I7CisJdTMyIGZyYW1lc19yY3ZkOworCXUzMiB0bHZzX2Rpc2NhcmRlZDsKKwl1MzIgdGx2c191bnJlY29nbml6ZWQ7Cit9OworCitzdHJ1Y3QgYmZhX2NlZV9kY2J4X3N0YXRzX3MgeworCXUzMiBzdWJ0bHZzX3VucmVjb2duaXplZDsKKwl1MzIgbmVnb3RpYXRpb25fZmFpbGVkOworCXUzMiByZW1vdGVfY2ZnX2NoYW5nZWQ7CisJdTMyIHRsdnNfcmVjZWl2ZWQ7CisJdTMyIHRsdnNfaW52YWxpZDsKKwl1MzIgc2Vxbm87CisJdTMyIGFja25vOworCXUzMiByZWN2ZF9zZXFubzsKKwl1MzIgcmVjdmRfYWNrbm87Cit9OworCitzdHJ1Y3QgYmZhX2NlZV9jZmdfc3RhdHNfcyB7CisJdTMyIGNlZV9zdGF0dXNfZG93bjsKKwl1MzIgY2VlX3N0YXR1c191cDsKKwl1MzIgY2VlX2h3X2NmZ19jaGFuZ2VkOworCXUzMiByZWN2ZF9pbnZhbGlkX2NmZzsKK307CisKKworc3RydWN0IGJmYV9jZWVfc3RhdHNfcyB7CisJc3RydWN0IGJmYV9jZWVfbGxkcF9zdGF0c19zIGxsZHBfc3RhdHM7CisJc3RydWN0IGJmYV9jZWVfZGNieF9zdGF0c19zIGRjYnhfc3RhdHM7CisJc3RydWN0IGJmYV9jZWVfY2ZnX3N0YXRzX3MgIGNmZ19zdGF0czsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKworI2VuZGlmCS8qIF9fQkZBX0RFRlNfQ0VFX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2RyaXZlci5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNDk4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2RyaXZlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9ERUZTX0RSSVZFUl9IX18KKyNkZWZpbmUgX19CRkFfREVGU19EUklWRVJfSF9fCisKKy8qKgorICogRHJpdmVyIHN0YXRpc3RpY3MKKyAqLworCXUxNiAgICB0bV9pb19hYm9ydDsKKyAgICB1MTYgICAgdG1faW9fYWJvcnRfY29tcDsKKyAgICB1MTYgICAgdG1fbHVuX3Jlc2V0OworICAgIHUxNiAgICB0bV9sdW5fcmVzZXRfY29tcDsKKyAgICB1MTYgICAgdG1fdGFyZ2V0X3Jlc2V0OworICAgIHUxNiAgICB0bV9idXNfcmVzZXQ7CisgICAgdTE2ICAgIGlvY19yZXN0YXJ0OyAgICAgICAgLyogIElPQyByZXN0YXJ0IGNvdW50ICovCisgICAgdTE2ICAgIGlvX3BlbmRpbmc7ICAgICAgICAgLyogIG91dHN0YW5kaW5nIGlvIGNvdW50IHBlci1JT0MgKi8KKyAgICB1NjQgICAgY29udHJvbF9yZXE7CisgICAgdTY0ICAgIGlucHV0X3JlcTsKKyAgICB1NjQgICAgb3V0cHV0X3JlcTsKKyAgICB1NjQgICAgaW5wdXRfd29yZHM7CisgICAgdTY0ICAgIG91dHB1dF93b3JkczsKK30gYmZhX2RyaXZlcl9zdGF0c190OworCisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX0RSSVZFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2V0aHBvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2V0aHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWY5YjNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfZXRocG9ydC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9ERUZTX0VUSFBPUlRfSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfRVRIUE9SVF9IX18KKworI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfc3RhdHVzLmg+CisjaW5jbHVkZSA8cHJvdG9jb2wvdHlwZXMuaD4KKyNpbmNsdWRlIDxjbmEvcHN0YXRzL3BoeXBvcnRfZGVmcy5oPgorI2luY2x1ZGUgPGNuYS9wc3RhdHMvZXRocG9ydF9kZWZzLmg+CisKK3N0cnVjdCBibmFfdHhfaW5mb19zIHsKKwl1MzIgICAgbWluaXBvcnRfc3RhdGU7CisJdTMyICAgIGFkYXB0ZXJfc3RhdGU7CisJdTY0ICAgIHR4X2NvdW50OworCXU2NCAgICB0eF93aTsKKwl1NjQgICAgdHhfc2c7CisJdTY0ICAgIHR4X3RjcF9jaGtzdW07CisJdTY0ICAgIHR4X3VkcF9jaGtzdW07CisJdTY0ICAgIHR4X2lwX2Noa3N1bTsKKwl1NjQgICAgdHhfbHNvdjE7CisJdTY0ICAgIHR4X2xzb3YyOworCXU2NCAgICB0eF9tYXhfc2dfbGVuIDsKK307CisKK3N0cnVjdCBibmFfcnhfcXVldWVfaW5mb19zIHsKKwl1MTYgICAgcV9pZCA7CisJdTE2ICAgIGJ1Zl9zaXplIDsKKwl1MTYgICAgYnVmX2NvdW50IDsKKwl1MTYgICAgcnN2ZCA7CisJdTY0ICAgIHJ4X2NvdW50IDsKKwl1NjQgICAgcnhfZHJvcHBlZCA7CisJdTY0ICAgIHJ4X3Vuc3VwcG9ydGVkIDsKKwl1NjQgICAgcnhfaW50ZXJuYWxfZXJyIDsKKwl1NjQgICAgcnNzX2NvdW50IDsKKwl1NjQgICAgdmxhbl9jb3VudCA7CisJdTY0ICAgIHJ4X3RjcF9jaGtzdW0gOworCXU2NCAgICByeF91ZHBfY2hrc3VtIDsKKwl1NjQgICAgcnhfaXBfY2hrc3VtIDsKKwl1NjQgICAgcnhfaGRzIDsKK307CisKK3N0cnVjdCBibmFfcnhfcV9zZXRfcyB7CisJdTE2ICAgIHFfc2V0X3R5cGU7CisJdTMyICAgIG1pbmlwb3J0X3N0YXRlOworCXUzMiAgICBhZGFwdGVyX3N0YXRlOworCXN0cnVjdCBibmFfcnhfcXVldWVfaW5mb19zICAgIHJ4X3F1ZXVlWzJdOworfTsKKworc3RydWN0IGJuYV9wb3J0X3N0YXRzX3MgeworCXN0cnVjdCBibmFfdHhfaW5mb19zICAgdHhfc3RhdHM7CisJdTE2ICAgICAgICBxc2V0X2NvdW50IDsKKwlzdHJ1Y3QgYm5hX3J4X3Ffc2V0X3MgIHJ4X3FzZXRbOF07Cit9OworCitzdHJ1Y3QgYmZhX2V0aHBvcnRfc3RhdHNfcyB7CisJc3RydWN0IGJuYV9zdGF0c190eGYJdHhmX3N0YXRzWzFdOworCXN0cnVjdCBibmFfc3RhdHNfcnhmCXJ4Zl9zdGF0c1sxXTsKKwlzdHJ1Y3QgYm5hZF9kcnZfc3RhdHMgZHJ2X3N0YXRzOworfTsKKworLyoqCisgKiBFdGhlcm5ldCBwb3J0IGV2ZW50cworICogQXJndW1lbnRzIGJlbG93IGFyZSBpbiBCRkFMIGNvbnRleHQgZnJvbSBNZ210CisgKiBCRkFfUE9SVF9BRU5fRVRIX0xJTktVUDogICAgW2luXTogbWFjIFtvdXRdOiBtYWMKKyAqIEJGQV9QT1JUX0FFTl9FVEhfTElOS0RPV046ICBbaW5dOiBtYWMgW291dF06IG1hYworICogQkZBX1BPUlRfQUVOX0VUSF9FTkFCTEU6ICBbaW5dOiBtYWMgW291dF06IG1hYworICogQkZBX1BPUlRfQUVOX0VUSF9ESVNBQkxFOiAgW2luXTogbWFjIFtvdXRdOiBtYWMKKyAqCisgKi8KK2VudW0gYmZhX2V0aHBvcnRfYWVuX2V2ZW50IHsKKwlCRkFfRVRIUE9SVF9BRU5fTElOS1VQID0gMSwgLyogIEJhc2UgUG9ydCBFdGhlcm5ldCBsaW5rIHVwIGV2ZW50ICovCisJQkZBX0VUSFBPUlRfQUVOX0xJTktET1dOID0gMiwgLyogIEJhc2UgUG9ydCBFdGhlcm5ldCBsaW5rIGRvd24gZXZlbnQgKi8KKwlCRkFfRVRIUE9SVF9BRU5fRU5BQkxFID0gMywgLyogIEJhc2UgUG9ydCBFdGhlcm5ldCBsaW5rIGVuYWJsZSBldmVudCAqLworCUJGQV9FVEhQT1JUX0FFTl9ESVNBQkxFID0gNCwgLyogIEJhc2UgUG9ydCBFdGhlcm5ldCBsaW5rIGRpc2FibGUKKwkJCQkgICAgICAqIGV2ZW50ICovCit9OworCitzdHJ1Y3QgYmZhX2V0aHBvcnRfYWVuX2RhdGFfcyB7CisJbWFjX3QgbWFjOwkvKiAgTUFDIGFkZHJlc3Mgb2YgdGhlIHBoeXNpY2FsIHBvcnQgKi8KK307CisKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfRVRIUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2ZjcGltLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19mY3BpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOGY0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19mY3BpbS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRkFfREVGU19GQ1BJTV9IX18KKyNkZWZpbmUgX19CRkFfREVGU19GQ1BJTV9IX18KKworc3RydWN0IGJmYV9mY3BpbV9zdGF0c19zIHsKKwl1MzIgICAgICAgIHRvdGFsX2lvczsJLyogIFRvdGFsIElPIGNvdW50ICovCisJdTMyICAgICAgICBxcmVzdW1lczsJLyogIElPIHdhaXRpbmcgZm9yIENRIHNwYWNlICovCisJdTMyICAgICAgICBub19pb3RhZ3M7CS8qICBOTyBJTyBjb250ZXh0cyAqLworCXUzMiAgICAgICAgaW9fYWJvcnRzOwkvKiAgSU8gYWJvcnQgcmVxdWVzdHMgKi8KKwl1MzIgICAgICAgIG5vX3Rza2ltczsJLyogIE5PIHRhc2sgbWFuYWdlbWVudCBjb250ZXh0cyAqLworCXUzMiAgICAgICAgaW9jb21wX29rOwkvKiAgSU8gY29tcGxldGlvbnMgd2l0aCBPSyBzdGF0dXMgKi8KKwl1MzIgICAgICAgIGlvY29tcF91bmRlcnJ1bjsJLyogIElPIHVuZGVycnVuIChnb29kKSAqLworCXUzMiAgICAgICAgaW9jb21wX292ZXJydW47CS8qICBJTyBvdmVycnVuIChnb29kKSAqLworCXUzMiAgICAgICAgaW9jb21wX2Fib3J0ZWQ7CS8qICBBYm9ydGVkIElPIHJlcXVlc3RzICovCisJdTMyICAgICAgICBpb2NvbXBfdGltZWRvdXQ7CS8qICBJTyB0aW1lb3V0cyAqLworCXUzMiAgICAgICAgaW9jb21fbmV4dXNfYWJvcnQ7CS8qICBJTyBzZWxlY3Rpb24gdGltZW91dHMgKi8KKwl1MzIgICAgICAgIGlvY29tX3Byb3RvX2VycjsJLyogIElPIHByb3RvY29sIGVycm9ycyAqLworCXUzMiAgICAgICAgaW9jb21fZGlmX2VycjsJLyogIElPIFNCQy0zIHByb3RlY3Rpb24gZXJyb3JzICovCisJdTMyICAgICAgICBpb2NvbV90bV9hYm9ydDsJLyogIElPIGFib3J0ZWQgYnkgVE0gcmVxdWVzdHMgKi8KKwl1MzIgICAgICAgIGlvY29tX3NxZXJfbmVlZGVkOwkvKiAgSU8gcmV0cnkgZm9yIFNRIGVycm9yCisJCQkJCQkgKnJlY292ZXJ5ICovCisJdTMyICAgICAgICBpb2NvbV9yZXNfZnJlZTsJLyogIERlbGF5ZWQgZnJlZWluZyBvZiBJTyByZXNvdXJjZXMgKi8KKwl1MzIgICAgICAgIGlvY29tcF9zY3NpZXJyOwkvKiAgSU8gd2l0aCBub24tZ29vZCBTQ1NJIHN0YXR1cyAqLworCXUzMiAgICAgICAgaW9jb21faG9zdGFicnRzOwkvKiAgSG9zdCBJTyBhYm9ydCByZXF1ZXN0cyAqLworCXUzMiAgICAgICAgaW9jb21fdXRhZ3M7CS8qICBJTyBjb21wIHdpdGggdW5rbm93biB0YWdzICovCisJdTMyICAgICAgICBpb19jbGVhbnVwczsJLyogIElPIGltcGxpY2l0bHkgYWJvcnRlZCAqLworCXUzMiAgICAgICAgaW9fdG1hYm9ydHM7CS8qICBJTyBhYm9ydGVkIGR1ZSB0byBUTSBjb21tYW5kcyAqLworCXUzMiAgICAgICAgcnN2ZDsKK307CisjZW5kaWYgLypfX0JGQV9ERUZTX0ZDUElNX0hfXyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19pbV9jb21tb24uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2ltX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljY2Y1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19pbV9jb21tb24uaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19JTV9DT01NT05fSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfSU1fQ09NTU9OX0hfXworCisjZGVmaW5lCUJGQV9BREFQVEVSX05BTUVfTEVOCTI1NgorI2RlZmluZSBCRkFfQURBUFRFUl9HVUlEX0xFTiAgICAyNTYKKyNkZWZpbmUgUkVTRVJWRURfVkxBTl9OQU1FICAgICAgTCJQT1JUIFZMQU4iCisjZGVmaW5lIFBBU1NUSFJVX1ZMQU5fTkFNRSAgICAgIEwiUEFTU1RIUlUgVkxBTiIKKworCXU2NAl0eF9wa3RfY250OworCXU2NAlyeF9wa3RfY250OworCXUzMglkdXJhdGlvbjsKKwl1OAkJc3RhdHVzOworfSBiZmFfaW1fc3RhdHNfdCwgKnBiZmFfaW1fc3RhdHNfdDsKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfSU1fQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaW1fdGVhbS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaW1fdGVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ODZhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19pbV90ZWFtLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0RFRlNfSU1fVEVBTV9IX18KKyNkZWZpbmUgX19CRkFfREVGU19JTV9URUFNX0hfXworCisjaW5jbHVkZSA8cHJvdG9jb2wvdHlwZXMuaD4KKworI2RlZmluZQlCRkFfVEVBTV9NQVhfUE9SVFMJOAorI2RlZmluZQlCRkFfVEVBTV9OQU1FX0xFTgkyNTYKKyNkZWZpbmUgQkZBX01BWF9OVU1fVEVBTVMJMTYKKyNkZWZpbmUgQkZBX1RFQU1fSU5WQUxJRF9ERUxBWSAtMQorCisJQkZBX0xBQ1BfUkFURV9TTE9XID0gMSwKKwlCRkFfTEFDUF9SQVRFX0ZBU1QKK30gYmZhX2ltX2xhY3BfcmF0ZV90OworCisJQkZBX1RFQU1fTU9ERV9GQUlMX09WRVIgPSAxLAorCUJGQV9URUFNX01PREVfRkFJTF9CQUNLLAorCUJGQV9URUFNX01PREVfTEFDUCwKKwlCRkFfVEVBTV9NT0RFX05PTkUKK30gYmZhX2ltX3RlYW1fbW9kZV90OworCisJQkZBX1hNSVRfUE9MSUNZX0wyID0gMSwKKwlCRkFfWE1JVF9QT0xJQ1lfTDNfTDQKK30gYmZhX2ltX3htaXRfcG9saWN5X3Q7CisKKwliZmFfaW1fdGVhbV9tb2RlX3QgICAgIHRlYW1fbW9kZTsKKwliZmFfaW1fbGFjcF9yYXRlX3QgICAgIGxhY3BfcmF0ZTsKKwliZmFfaW1feG1pdF9wb2xpY3lfdCAgIHhtaXRfcG9saWN5OworCWludCAgIAkgICAgICAgICAgZGVsYXk7CisJd2NoYXJfdCAgICAJICBwcmltYXJ5W0JGQV9BREFQVEVSX05BTUVfTEVOXTsKKwl3Y2hhcl90ICAgICAgICAJICBwcmVmZXJyZWRfcHJpbWFyeVtCRkFfQURBUFRFUl9OQU1FX0xFTl07CisJbWFjX3QJICAgICAgICAgIG1hYzsKKwl1MTYgICAgICAgCSAgbnVtX3BvcnRzOworCXUxNiAgICAgICAgICBudW1fdmxhbnM7CisJdTE2IHZsYW5fbGlzdFtCRkFfTUFYX1ZMQU5TX1BFUl9QT1JUXTsKKwl3Y2hhcl90CSB0ZWFtX2d1aWRfbGlzdFtCRkFfVEVBTV9NQVhfUE9SVFNdW0JGQV9BREFQVEVSX0dVSURfTEVOXTsKKwl3Y2hhcl90CSBpb2NfbmFtZV9saXN0W0JGQV9URUFNX01BWF9QT1JUU11bQkZBX0FEQVBURVJfTkFNRV9MRU5dOworfSBiZmFfaW1fdGVhbV9hdHRyX3Q7CisKKwl3Y2hhcl90CQkgICAgICAgICAgICAgdGVhbV9uYW1lW0JGQV9URUFNX05BTUVfTEVOXTsKKwliZmFfaW1feG1pdF9wb2xpY3lfdAkgeG1pdF9wb2xpY3k7CisJaW50ICAgICAgICAgICAgICAgICAJIGRlbGF5OworCXdjaGFyX3QgICAgICAgICAgICAgICAgCSBwcmltYXJ5W0JGQV9BREFQVEVSX05BTUVfTEVOXTsKKwl3Y2hhcl90ICAgICAgICAgICAgICAgCSBwcmVmZXJyZWRfcHJpbWFyeVtCRkFfQURBUFRFUl9OQU1FX0xFTl07Cit9IGJmYV9pbV90ZWFtX2VkaXRfdCwgKnBiZmFfaW1fdGVhbV9lZGl0X3Q7CisKKwl3Y2hhcl90CQkJCQl0ZWFtX25hbWVbQkZBX1RFQU1fTkFNRV9MRU5dOworCWJmYV9pbV90ZWFtX21vZGVfdCAgICAgIHRlYW1fbW9kZTsKKwltYWNfdAkgICAgICAgICAgICAgICAJbWFjOworfSBiZmFfaW1fdGVhbV9pbmZvX3Q7CisKKwliZmFfaW1fdGVhbV9pbmZvX3QgCQl0ZWFtX2luZm9bQkZBX01BWF9OVU1fVEVBTVNdOworCXUxNiAJCQkJbnVtX3RlYW1zOworfSBiZmFfaW1fdGVhbV9saXN0X3QsICpwYmZhX2ltX3RlYW1fbGlzdF90OworCisjZW5kaWYgLyogX19CRkFfREVGU19JTV9URUFNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaW9jLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19pb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQ1MzJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaW9jLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9ERUZTX0lPQ19IX18KKyNkZWZpbmUgX19CRkFfREVGU19JT0NfSF9fCisKKyNpbmNsdWRlIDxwcm90b2NvbC90eXBlcy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfdHlwZXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2FkYXB0ZXIuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BtLmg+CisKK2VudW0geworCUJGQV9JT0NfRFJJVkVSX0xFTgk9IDE2LAorCUJGQV9JT0NfQ0hJUF9SRVZfTEVOIAk9IDgsCit9OworCisvKioKKyAqIERyaXZlciBhbmQgZmlybXdhcmUgdmVyc2lvbnMuCisgKi8KK3N0cnVjdCBiZmFfaW9jX2RyaXZlcl9hdHRyX3MgeworCWNoYXIgICAgICAgICAgICBkcml2ZXJbQkZBX0lPQ19EUklWRVJfTEVOXTsJLyogIGRyaXZlciBuYW1lICovCisJY2hhciAgICAgICAgICAgIGRyaXZlcl92ZXJbQkZBX1ZFUlNJT05fTEVOXTsJLyogIGRyaXZlciB2ZXJzaW9uICovCisJY2hhciAgICAgICAgICAgIGZ3X3ZlcltCRkFfVkVSU0lPTl9MRU5dOwkvKiAgZmlybXdhcmUgdmVyc2lvbiovCisJY2hhciAgICAgICAgICAgIGJpb3NfdmVyW0JGQV9WRVJTSU9OX0xFTl07CS8qICBiaW9zIHZlcnNpb24gKi8KKwljaGFyICAgICAgICAgICAgZWZpX3ZlcltCRkFfVkVSU0lPTl9MRU5dOwkvKiAgRUZJIHZlcnNpb24gKi8KKwljaGFyICAgICAgICAgICAgb2JfdmVyW0JGQV9WRVJTSU9OX0xFTl07CS8qICBvcGVuYm9vdCB2ZXJzaW9uKi8KK307CisKKy8qKgorICogSU9DIFBDSSBkZXZpY2UgYXR0cmlidXRlcworICovCitzdHJ1Y3QgYmZhX2lvY19wY2lfYXR0cl9zIHsKKwl1MTYgICAgICAgIHZlbmRvcl9pZDsJLyogIFBDSSB2ZW5kb3IgSUQgKi8KKwl1MTYgICAgICAgIGRldmljZV9pZDsJLyogIFBDSSBkZXZpY2UgSUQgKi8KKwl1MTYgICAgICAgIHNzaWQ7CQkvKiAgc3Vic3lzdGVtIElEICovCisJdTE2ICAgICAgICBzc3ZpZDsJCS8qICBzdWJzeXN0ZW0gdmVuZG9yIElEICovCisJdTMyICAgICAgICBwY2lmbjsJCS8qICBQQ0kgZGV2aWNlIGZ1bmN0aW9uICovCisJdTMyICAgICAgICByc3ZkOwkJLyogcGFkZGluZyAqLworCXU4ICAgICAgICAgY2hpcF9yZXZbQkZBX0lPQ19DSElQX1JFVl9MRU5dOwkgLyogIGNoaXAgcmV2aXNpb24gKi8KK307CisKKy8qKgorICogSU9DIHN0YXRlcworICovCitlbnVtIGJmYV9pb2Nfc3RhdGUgeworCUJGQV9JT0NfUkVTRVQgICAgICAgPSAxLCAgLyogIElPQyBpcyBpbiByZXNldCBzdGF0ZSAqLworCUJGQV9JT0NfU0VNV0FJVCAgICAgPSAyLCAgLyogIFdhaXRpbmcgZm9yIElPQyBoYXJkd2FyZSBzZW1hcGhvcmUgKi8KKwlCRkFfSU9DX0hXSU5JVCAJICAgID0gMywgIC8qICBJT0MgaGFyZHdhcmUgaXMgYmVpbmcgaW5pdGlhbGl6ZWQgKi8KKwlCRkFfSU9DX0dFVEFUVFIgICAgID0gNCwgIC8qICBJT0MgaXMgYmVpbmcgY29uZmlndXJlZCAqLworCUJGQV9JT0NfT1BFUkFUSU9OQUwgPSA1LCAgLyogIElPQyBpcyBvcGVyYXRpb25hbCAqLworCUJGQV9JT0NfSU5JVEZBSUwgICAgPSA2LCAgLyogIElPQyBoYXJkd2FyZSBmYWlsdXJlICovCisJQkZBX0lPQ19IQkZBSUwgICAgICA9IDcsICAvKiAgSU9DIGhlYXJ0LWJlYXQgZmFpbHVyZSAqLworCUJGQV9JT0NfRElTQUJMSU5HICAgPSA4LCAgLyogIElPQyBpcyBiZWluZyBkaXNhYmxlZCAqLworCUJGQV9JT0NfRElTQUJMRUQgICAgPSA5LCAgLyogIElPQyBpcyBkaXNhYmxlZCAqLworCUJGQV9JT0NfRldNSVNNQVRDSCAgPSAxMCwgLyogIElPQyBmaXJtd2FyZSBkaWZmZXJlbnQgZnJvbSBkcml2ZXJzICovCit9OworCisvKioKKyAqIElPQyBmaXJtd2FyZSBzdGF0cworICovCitzdHJ1Y3QgYmZhX2Z3X2lvY19zdGF0c19zIHsKKwl1MzIgICAgICAgIGhiX2NvdW50OworCXUzMiAgICAgICAgY2ZnX3JlcXM7CisJdTMyICAgICAgICBlbmFibGVfcmVxczsKKwl1MzIgICAgICAgIGRpc2FibGVfcmVxczsKKwl1MzIgICAgICAgIHN0YXRzX3JlcXM7CisJdTMyICAgICAgICBjbHJzdGF0c19yZXFzOworCXUzMiAgICAgICAgdW5rbm93bl9yZXFzOworCXUzMiAgICAgICAgaWNfcmVxczsJCS8qICBpbnRlcnJ1cHQgY29hbGVzY2UgcmVxcyAqLworfTsKKworLyoqCisgKiBJT0MgZHJpdmVyIHN0YXRzCisgKi8KK3N0cnVjdCBiZmFfaW9jX2Rydl9zdGF0c19zIHsKKwl1MzIJaW9jX2lzcnM7CisJdTMyCWlvY19lbmFibGVzOworCXUzMglpb2NfZGlzYWJsZXM7CisJdTMyCWlvY19oYmZhaWxzOworCXUzMglpb2NfYm9vdHM7CisJdTMyCXN0YXRzX3Rtb3M7CisJdTMyICAgICAgICBoYl9jb3VudDsKKwl1MzIgICAgICAgIGRpc2FibGVfcmVxczsKKwl1MzIgICAgICAgIGVuYWJsZV9yZXFzOworCXUzMiAgICAgICAgZGlzYWJsZV9yZXBsaWVzOworCXUzMiAgICAgICAgZW5hYmxlX3JlcGxpZXM7Cit9OworCisvKioKKyAqIElPQyBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBiZmFfaW9jX3N0YXRzX3MgeworCXN0cnVjdCBiZmFfaW9jX2Rydl9zdGF0c19zCWRydl9zdGF0czsgLyogIGRyaXZlciBJT0Mgc3RhdHMgKi8KKwlzdHJ1Y3QgYmZhX2Z3X2lvY19zdGF0c19zIAlmd19zdGF0czsgIC8qICBmaXJtd2FyZSBJT0Mgc3RhdHMgKi8KK307CisKKworZW51bSBiZmFfaW9jX3R5cGVfZSB7CisJQkZBX0lPQ19UWVBFX0ZDCSAgPSAxLAorCUJGQV9JT0NfVFlQRV9GQ29FID0gMiwKKwlCRkFfSU9DX1RZUEVfTEwJICA9IDMsCit9OworCisvKioKKyAqIElPQyBhdHRyaWJ1dGVzIHJldHVybmVkIGluIHF1ZXJpZXMKKyAqLworc3RydWN0IGJmYV9pb2NfYXR0cl9zIHsKKwllbnVtIGJmYV9pb2NfdHlwZV9lCQlpb2NfdHlwZTsKKwllbnVtIGJmYV9pb2Nfc3RhdGUgCQlzdGF0ZTsJCS8qICBJT0Mgc3RhdGUgICAgICAqLworCXN0cnVjdCBiZmFfYWRhcHRlcl9hdHRyX3MJYWRhcHRlcl9hdHRyOwkvKiAgSEJBIGF0dHJpYnV0ZXMgKi8KKwlzdHJ1Y3QgYmZhX2lvY19kcml2ZXJfYXR0cl9zIAlkcml2ZXJfYXR0cjsJLyogIGRyaXZlciBhdHRyICAgICovCisJc3RydWN0IGJmYV9pb2NfcGNpX2F0dHJfcwlwY2lfYXR0cjsKKwl1OAkJCQlwb3J0X2lkOwkvKiAgcG9ydCBudW1iZXIgICAgKi8KK307CisKKy8qKgorICogQkZBIElPQyBsZXZlbCBldmVudHMKKyAqLworZW51bSBiZmFfaW9jX2Flbl9ldmVudCB7CisJQkZBX0lPQ19BRU5fSEJHT09ECT0gMSwJLyogIEhlYXJ0IEJlYXQgcmVzdG9yZSBldmVudAkqLworCUJGQV9JT0NfQUVOX0hCRkFJTAk9IDIsCS8qICBIZWFydCBCZWF0IGZhaWx1cmUgZXZlbnQJKi8KKwlCRkFfSU9DX0FFTl9FTkFCTEUJPSAzLAkvKiAgSU9DIGVuYWJsZWQgZXZlbnQJCSovCisJQkZBX0lPQ19BRU5fRElTQUJMRQk9IDQsCS8qICBJT0MgZGlzYWJsZWQgZXZlbnQJCSovCisJQkZBX0lPQ19BRU5fRldNSVNNQVRDSAk9IDUsCS8qICBJT0MgZmlybXdhcmUgbWlzbWF0Y2gJKi8KK307CisKKy8qKgorICogQkZBIElPQyBsZXZlbCBldmVudCBkYXRhLCBub3cganVzdCBhIHBsYWNlIGhvbGRlcgorICovCitzdHJ1Y3QgYmZhX2lvY19hZW5fZGF0YV9zIHsKKwllbnVtIGJmYV9pb2NfdHlwZV9lIGlvY190eXBlOworCXd3bl90CXB3d247CisJbWFjX3QJbWFjOworfTsKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfSU9DX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19pb2NmYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaW9jZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzZiY2JkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaW9jZmMuaApAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0RFRlNfSU9DRkNfSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfSU9DRkNfSF9fCisKKyNpbmNsdWRlIDxwcm90b2NvbC90eXBlcy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfdHlwZXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2FkYXB0ZXIuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BtLmg+CisKKyNkZWZpbmUgQkZBX0lPQ0ZDX0lOVFJfREVMQVkJMTEyNQorI2RlZmluZSBCRkFfSU9DRkNfSU5UUl9MQVRFTkNZCTIyNQorCisvKioKKyAqIEludGVycnVwdCBjb2FsZXNjaW5nIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0cnVjdCBiZmFfaW9jZmNfaW50cl9hdHRyX3MgeworCWJmYV9ib29sZWFuX3QJY29hbGVzY2U7CS8qICBlbmFibGUvZGlzYWJsZSBjb2FsZXNjaW5nICovCisJdTE2CWxhdGVuY3k7CS8qICBsYXRlbmN5IGluIG1pY3Jvc2Vjb25kcyAgICovCisJdTE2CWRlbGF5OwkJLyogIGRlbGF5IGluIG1pY3Jvc2Vjb25kcyAgICAgKi8KK307CisKKy8qKgorICogSU9DIGZpcm13YXJlIGNvbmZpZ3VyYXRvbgorICovCitzdHJ1Y3QgYmZhX2lvY2ZjX2Z3Y2ZnX3MgeworCXUxNiAgICAgICAgbnVtX2ZhYnJpY3M7CS8qICBudW1iZXIgb2YgZmFicmljcwkJKi8KKwl1MTYgICAgICAgIG51bV9scG9ydHM7CS8qICBudW1iZXIgb2YgbG9jYWwgbHBvcnRzCSovCisJdTE2ICAgICAgICBudW1fcnBvcnRzOwkvKiAgbnVtYmVyIG9mIHJlbW90ZSBwb3J0cwkqLworCXUxNiAgICAgICAgbnVtX2lvaW1fcmVxczsJLyogIG51bWJlciBvZiBJTyByZXFzCQkqLworCXUxNiAgICAgICAgbnVtX3Rza2ltX3JlcXM7CS8qICB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdHMJKi8KKwl1MTYgICAgICAgIG51bV9pb3RtX3JlcXM7CS8qICBudW1iZXIgb2YgVE0gSU8gcmVxcwkqLworCXUxNiAgICAgICAgbnVtX3Rza3RtX3JlcXM7CS8qICBUTSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdHMqLworCXUxNiAgICAgICAgbnVtX2ZjeHBfcmVxczsJLyogIHVuYXNzaXN0ZWQgRkMgZXhjaGFuZ2VzCSovCisJdTE2ICAgICAgICBudW1fdWZfYnVmczsJLyogIHVuc29saWNpdGVkIHJlY3YgYnVmZmVycwkqLworCXU4CQludW1fY3FzOworCXU4CQlyc3ZkOworfTsKKworc3RydWN0IGJmYV9pb2NmY19kcnZjZmdfcyB7CisJdTE2ICAgICAgICBudW1fcmVxcV9lbGVtczsJLyogIG51bWJlciBvZiByZXEgcXVldWUgZWxlbWVudHMgKi8KKwl1MTYgICAgICAgIG51bV9yc3BxX2VsZW1zOwkvKiAgbnVtYmVyIG9mIHJzcCBxdWV1ZSBlbGVtZW50cyAqLworCXUxNiAgICAgICAgbnVtX3NncGdzOwkvKiAgbnVtYmVyIG9mIHRvdGFsIFNHIHBhZ2VzCSAgKi8KKwl1MTYgICAgICAgIG51bV9zYm9vdF90Z3RzOwkvKiAgbnVtYmVyIG9mIFNBTiBib290IHRhcmdldHMJICAqLworCXUxNiAgICAgICAgbnVtX3Nib290X2x1bnM7CS8qICBudW1iZXIgb2YgU0FOIGJvb3QgbHVucwkgICovCisJdTE2CSAgICBpb2NfcmVjb3ZlcjsJLyogIElPQyByZWNvdmVyeSBtb2RlCQkgICovCisJdTE2CSAgICBtaW5fY2ZnOwkvKiAgbWluaW11bSBjb25maWd1cmF0aW9uCSAgKi8KKwl1MTYgICAgICAgIHBhdGhfdG92OwkvKiAgZGV2aWNlIHBhdGggdGltZW91dAkgICovCisJYmZhX2Jvb2xlYW5fdCAgIGRlbGF5X2NvbXA7IC8qICBkZWxheSBjb21wbGV0aW9uIG9mCisJCQkJCQkJZmFpbGVkIGluZmxpZ2h0IElPcyAqLworCXUzMgkJcnN2ZDsKK307CisvKioKKyAqIElPQyBjb25maWd1cmF0aW9uCisgKi8KK3N0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgeworCXN0cnVjdCBiZmFfaW9jZmNfZndjZmdfcwlmd2NmZzsJLyogIGZpcm13YXJlIHNpZGUgY29uZmlnICovCisJc3RydWN0IGJmYV9pb2NmY19kcnZjZmdfcwlkcnZjZmc7CS8qICBkcml2ZXIgc2lkZSBjb25maWcJICAqLworfTsKKworLyoqCisgKiBJT0MgZmlybXdhcmUgSU8gc3RhdHMKKyAqLworc3RydWN0IGJmYV9md19pb19zdGF0c19zIHsKKwl1MzIJaG9zdF9hYm9ydDsJCS8qICBJTyBhYm9ydGVkIGJ5IGhvc3QgZHJpdmVyKi8KKwl1MzIJaG9zdF9jbGVhbnVwOwkJLyogIElPIGNsZWFuIHVwIGJ5IGhvc3QgZHJpdmVyICovCisKKwl1MzIJZndfaW9fdGltZW91dDsJCS8qICBJT3MgdGltZWRvdXQgKi8KKwl1MzIJZndfZnJtX3BhcnNlOwkJLyogIGZyYW1lIHBhcnNlZCBieSBmL3cgKi8KKwl1MzIJZndfZnJtX2RhdGE7CQkvKiAgZmNwX2RhdGEgZnJhbWUgcGFyc2VkIGJ5IGYvdyAqLworCXUzMglmd19mcm1fcnNwOwkJLyogIGZjcF9yc3AgZnJhbWUgcGFyc2VkIGJ5IGYvdyAqLworCXUzMglmd19mcm1feGZlcl9yZHk7CS8qICB4ZmVyX3JkeSBmcmFtZSBwYXJzZWQgYnkgZi93ICovCisJdTMyCWZ3X2ZybV9ibHNfYWNjOwkJLyogIEJMUyBBQ0MgIGZyYW1lIHBhcnNlZCBieSBmL3cgKi8KKwl1MzIJZndfZnJtX3RndF9hYm9ydDsJLyogIHRhcmdldCBBQlRTIHBhcnNlZCBieSBmL3cgKi8KKwl1MzIJZndfZnJtX3Vua25vd247CQkvKiAgdW5rbm93biBwYXJzZWQgYnkgZi93ICovCisJdTMyCWZ3X2RhdGFfZG1hOwkJLyogIGYvdyBETUEnZWQgdGhlIGRhdGEgZnJhbWUgKi8KKwl1MzIJZndfZnJtX2Ryb3A7CQkvKiAgZi93IGRyb3AgdGhlIGZyYW1lICovCisKKwl1MzIJcmVjX3RpbWVvdXQ7CQkvKiAgRlcgcmVjIHRpbWVkIG91dCAqLworCXUzMgllcnJvcl9yZWM7CQkJLyogIEZXIHNlbmRpbmcgcmVjIG9uCisJCQkJCQkJKiBhbiBlcnJvciBjb25kaXRpb24qLworCXUzMgl3YWl0X2Zvcl9zaTsJCS8qICBGVyB3YWl0IGZvciBTSSAqLworCXUzMglyZWNfcnNwX2ludmFsOwkJLyogIFJFQyByc3AgaW52YWxpZCAqLworCXUzMglzZXFyX2lvX2Fib3J0OwkJLyogIHRhcmdldCBkb2VzIG5vdCBrbm93IGNtZCBzbyBhYm9ydCAqLworCXUzMglzZXFyX2lvX3JldHJ5OwkJLyogIFNFUVIgZmFpbGVkIHNvIHJldHJ5IElPICovCisKKwl1MzIJaXRuX2Npc2NfdXBkX3JzcDsJLyogIElUTiBjaXNjIHVwZGF0ZWQgb24gZmNwX3JzcCAqLworCXUzMglpdG5fY2lzY191cGRfZGF0YTsJLyogIElUTiBjaXNjIHVwZGF0ZWQgb24gZmNwX2RhdGEgKi8KKwl1MzIJaXRuX2Npc2NfdXBkX3hmZXJfcmR5OwkvKiAgSVROIGNpc2MgdXBkYXRlZCBvbiBmY3BfZGF0YSAqLworCisJdTMyCWZjcF9kYXRhX2xvc3Q7CQkvKiAgZmNwIGRhdGEgbG9zdCAqLworCisJdTMyCXJvX3NldF9pbl94ZmVyX3JkeTsJLyogIFRhcmdldCBzZXQgUk8gaW4gWGZlcl9yZHkgZnJhbWUgKi8KKwl1MzIJeGZlcl9yZHlfb29vX2VycjsJLyogIE91dCBvZiBvcmRlciBYZmVyX3JkeSByZWNlaXZlZCAqLworCXUzMgl4ZmVyX3JkeV91bmtub3duX2VycjsJLyogIHVua25vd24gZXJyb3IgaW4geGZlcl9yZHkgZnJhbWUgKi8KKworCXUzMglpb19hYm9ydF90aW1lb3V0OwkvKiAgQUJUUyB0aW1lZG91dCAgKi8KKwl1MzIJc2xlcl9pbml0aWF0ZWQ7CQkvKiAgU0xFUiBpbml0aWF0ZWQgKi8KKworCXUzMgl1bmV4cF9mY3BfcnNwOwkJLyogIGZjcCByZXNwb25zZSBpbiB3cm9uZyBzdGF0ZSAqLworCisJdTMyCWZjcF9yc3BfdW5kZXJfcnVuOwkvKiAgZmNwIHJzcCBJTyB1bmRlcnJ1biAqLworCXUzMiAgICAgICAgZmNwX3JzcF91bmRlcl9ydW5fd3I7ICAgLyogIGZjcCByc3AgSU8gdW5kZXJydW4gZm9yIHdyaXRlICovCisJdTMyCWZjcF9yc3BfdW5kZXJfcnVuX2VycjsJLyogIGZjcCByc3AgSU8gdW5kZXJydW4gZXJyb3IgKi8KKwl1MzIgICAgICAgIGZjcF9yc3BfcmVzaWRfaW52YWw7ICAgIC8qICBpbnZhbGlkIHJlc2lkdWUgKi8KKwl1MzIJZmNwX3JzcF9vdmVyX3J1bjsJLyogIGZjcCByc3AgSU8gb3ZlcnJ1biAqLworCXUzMglmY3BfcnNwX292ZXJfcnVuX2VycjsJLyogIGZjcCByc3AgSU8gb3ZlcnJ1biBlcnJvciAqLworCXUzMglmY3BfcnNwX3Byb3RvX2VycjsJLyogIHByb3RvY29sIGVycm9yIGluIGZjcCByc3AgKi8KKwl1MzIJZmNwX3JzcF9zZW5zZV9lcnI7CS8qICBlcnJvciBpbiBzZW5zZSBpbmZvIGluIGZjcCByc3AgKi8KKwl1MzIJZmNwX2NvbmZfcmVxOwkJLyogIEZDUCBjb25mIHJlcXVlc3RlZCAqLworCisJdTMyCXRndF9hYm9ydGVkX2lvOwkJLyogIHRhcmdldCBpbml0aWF0ZWQgYWJvcnQgKi8KKworCXUzMglpb2hfZWR0b3ZfdGltZW91dF9ldmVudDsvKiAgSU9IIGVkdG92IHRpbWVyIHBvcHBlZCAqLworCXUzMglpb2hfZmNwX3JzcF9leGNwX2V2ZW50OwkvKiAgSU9IIEZDUF9SU1AgZXhjZXB0aW9uICovCisJdTMyCWlvaF9mY3BfY29uZl9ldmVudDsJLyogIElPSCBGQ1BfQ09ORiAqLworCXUzMglpb2hfbXVsdF9mcm1fcnNwX2V2ZW50OwkvKiAgSU9IIG11bHRpX2ZyYW1lIEZDUF9SU1AgKi8KKwl1MzIJaW9oX2hpdF9jbGFzczJfZXZlbnQ7CS8qICBJT0ggaGl0IGNsYXNzMiAqLworCXUzMglpb2hfbWlzc19vdGhlcl9ldmVudDsJLyogIElPSCBtaXNzIG90aGVyICovCisJdTMyCWlvaF9zZXFfY250X2Vycl9ldmVudDsJLyogIElPSCBzZXEgY250IGVycm9yICovCisJdTMyCWlvaF9sZW5fZXJyX2V2ZW50OwkJLyogIElPSCBsZW4gZXJyb3IgLSBmY3BfZGwgIT0KKwkJCQkJCQkqIGJ5dGVzIHhmZXJlZCAqLworCXUzMglpb2hfc2VxX2xlbl9lcnJfZXZlbnQ7CS8qICBJT0ggc2VxIGxlbiBlcnJvciAqLworCXUzMglpb2hfZGF0YV9vb3JfZXZlbnQ7CS8qICBEYXRhIG91dCBvZiByYW5nZSAqLworCXUzMglpb2hfcm9fb29vX2V2ZW50OwkvKiAgUmVsYXRpdmUgb2Zmc2V0IG91dCBvZiByYW5nZSAqLworCXUzMglpb2hfY3B1X293bmVkX2V2ZW50OwkvKiAgSU9IIGhpdCAtaW9zdCBvd25lZCBieSBmL3cgKi8KKwl1MzIJaW9oX3VuZXhwX2ZyYW1lX2V2ZW50OwkvKiAgdW5leHBlY3RlZCBmcmFtZSByZWNpZXZlZAorCQkJCQkJICogICBjb3VudCAqLworCXUzMglpb2hfZXJyX2ludDsJCS8qICBJT0ggZXJyb3IgaW50IGR1cmluZyBkYXRhLXBoYXNlCisJCQkJCQkgKiAgIGZvciBzY3NpIHdyaXRlCisJCQkJCQkgKi8KK307CisKKy8qKgorICogSU9DIHBvcnQgZmlybXdhcmUgc3RhdHMKKyAqLworCitzdHJ1Y3QgYmZhX2Z3X3BvcnRfZnBnX3N0YXRzX3MgeworICAgIHUzMiAgICBpbnRyX2V2dDsKKyAgICB1MzIgICAgaW50cjsKKyAgICB1MzIgICAgaW50cl9leGNlc3M7CisgICAgdTMyICAgIGludHJfY2F1c2UwOworICAgIHUzMiAgICBpbnRyX290aGVyOworICAgIHUzMiAgICBpbnRyX290aGVyX2lnbjsKKyAgICB1MzIgICAgc2lnX2xvc3Q7CisgICAgdTMyICAgIHNpZ19yZWdhaW5lZDsKKyAgICB1MzIgICAgc3luY19sb3N0OworICAgIHUzMiAgICBzeW5jX3RvOworICAgIHUzMiAgICBzeW5jX3JlZ2FpbmVkOworICAgIHUzMiAgICBkaXYyX292ZXJmbG93OworICAgIHUzMiAgICBkaXYyX3VuZGVyZmxvdzsKKyAgICB1MzIgICAgZWZpZm9fb3ZlcmZsb3c7CisgICAgdTMyICAgIGVmaWZvX3VuZGVyZmxvdzsKKyAgICB1MzIgICAgaWRsZV9yeDsKKyAgICB1MzIgICAgbHJyX3J4OworICAgIHUzMiAgICBscl9yeDsKKyAgICB1MzIgICAgb2xzX3J4OworICAgIHUzMiAgICBub3Nfcng7CisgICAgdTMyICAgIGxpcF9yeDsKKyAgICB1MzIgICAgYXJiZjBfcng7CisgICAgdTMyICAgIG1ya19yeDsKKyAgICB1MzIgICAgY29uc3RfbXJrX3J4OworICAgIHUzMiAgICBwcmltX3Vua25vd247CisgICAgdTMyICAgIHJzdmQ7Cit9OworCisKK3N0cnVjdCBiZmFfZndfcG9ydF9sa3NtX3N0YXRzX3MgeworICAgIHUzMiAgICBod3NtX3N1Y2Nlc3M7ICAgICAgIC8qICBod3NtIHN0YXRlIG1hY2hpbmUgc3VjY2VzcyAgICAgICAgICAqLworICAgIHUzMiAgICBod3NtX2ZhaWxzOyAgICAgICAgIC8qICBod3NtIGZhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBod3NtX3dkdG92OyAgICAgICAgIC8qICBod3NtIHRpbWVkIG91dCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBzd3NtX3N1Y2Nlc3M7ICAgICAgIC8qICBzd3NtIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBzd3NtX2ZhaWxzOyAgICAgICAgIC8qICBzd3NtIGZhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBzd3NtX3dkdG92OyAgICAgICAgIC8qICBzd3NtIHRpbWVkIG91dCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBidXN5YnVmczsgICAgICAgICAgIC8qICBsaW5rIGluaXQgZmFpbGVkIGR1ZSB0byBidXN5YnVmICAgICAqLworICAgIHUzMiAgICBidWZfd2FpdHM7ICAgICAgICAgIC8qICBidWZ3YWl0IHN0YXRlIGVudHJpZXMgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBsaW5rX2ZhaWxzOyAgICAgICAgIC8qICBsaW5rIGZhaWx1cmVzICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBwc3BfZXJyb3JzOyAgICAgICAgIC8qICBwcmltaXRpdmUgc2VxdWVuY2UgcHJvdG9jb2wgZXJyb3JzICAqLworICAgIHUzMiAgICBscl91bmV4cDsgICAgICAgICAgIC8qICBOby4gb2YgdGltZXMgTFIgcngtZWQgdW5leHBlY3RlZGx5ICAqLworICAgIHUzMiAgICBscnJfdW5leHA7ICAgICAgICAgIC8qICBOby4gb2YgdGltZXMgTFJSIHJ4LWVkIHVuZXhwZWN0ZWRseSAqLworICAgIHUzMiAgICBscl90eDsgICAgICAgICAgICAgIC8qICBOby4gb2YgdGltZXMgTFIgdHggc3RhcnRlZCAgICAgICAgICAqLworICAgIHUzMiAgICBscnJfdHg7ICAgICAgICAgICAgIC8qICBOby4gb2YgdGltZXMgTFJSIHR4IHN0YXJ0ZWQgICAgICAgICAqLworICAgIHUzMiAgICBvbHNfdHg7ICAgICAgICAgICAgIC8qICBOby4gb2YgdGltZXMgT0xTIHR4IHN0YXJ0ZWQgICAgICAgICAqLworICAgIHUzMiAgICBub3NfdHg7ICAgICAgICAgICAgIC8qICBOby4gb2YgdGltZXMgTk9TIHR4IHN0YXJ0ZWQgICAgICAgICAqLworfTsKKworCitzdHJ1Y3QgYmZhX2Z3X3BvcnRfc25zbV9zdGF0c19zIHsKKyAgICB1MzIgICAgaHdzbV9zdWNjZXNzOyAgICAgICAvKiAgU3VjY2Vzc2Z1bCBod3NtIHRlcm1pbmF0aW9ucyAgICAgICAgKi8KKyAgICB1MzIgICAgaHdzbV9mYWlsczsgICAgICAgICAvKiAgaHdzbSBmYWlsIGNvdW50ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgaHdzbV93ZHRvdjsgICAgICAgICAvKiAgaHdzbSB0aW1lZCBvdXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgc3dzbV9zdWNjZXNzOyAgICAgICAvKiAgc3dzbSBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgc3dzbV93ZHRvdjsgICAgICAgICAvKiAgc3dzbSB0aW1lZCBvdXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgZXJyb3JfcmVzZXRzOyAgICAgICAvKiAgZXJyb3IgcmVzZXRzIGluaXRpYXRlZCBieSB1cHNtICAgICAgKi8KKyAgICB1MzIgICAgc3luY19sb3N0OyAgICAgICAgICAvKiAgU3luYyBsb3NzIGNvdW50ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgc2lnX2xvc3Q7ICAgICAgICAgICAvKiAgU2lnbmFsIGxvc3MgY291bnQgICAgICAgICAgICAgICAgICAgKi8KK307CisKKworc3RydWN0IGJmYV9md19wb3J0X3BoeXNtX3N0YXRzX3MgeworICAgIHUzMiAgICBtb2R1bGVfaW5zZXJ0czsgICAgIC8qICBNb2R1bGUgaW5zZXJ0IGNvdW50ICAgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBtb2R1bGVfeHRyYWN0czsgICAgIC8qICBNb2R1bGUgZXh0cmFjdHMgY291bnQgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICBtb2R1bGVfaW52YWxpZHM7ICAgIC8qICBJbnZhbGlkIG1vZHVsZSBpbnNlcnRlZCBjb3VudCAgICAgICAqLworICAgIHUzMiAgICBtb2R1bGVfcmVhZF9pZ247ICAgIC8qICBNb2R1bGUgdmFsaWRhdGlvbiBzdGF0dXMgaWdub3JlZCAgICAqLworICAgIHUzMiAgICBsYXNlcl9mYXVsdHM7ICAgICAgIC8qICBMYXNlciBmYXVsdCBjb3VudCAgICAgICAgICAgICAgICAgICAqLworICAgIHUzMiAgICByc3ZkOworfTsKKworCitzdHJ1Y3QgYmZhX2Z3X2ZpcF9zdGF0c19zIHsKKyAgICB1MzIgICAgZGlzY19yZXE7ICAgICAgICAgICAvKiAgRGlzY292ZXJ5IHNvbGljaXQgcmVxdWVzdHMgICAgICAgICAgKi8KKyAgICB1MzIgICAgZGlzY19yc3A7ICAgICAgICAgICAvKiAgRGlzY292ZXJ5IHNvbGljaXQgcmVzcG9uc2UgICAgICAgICAgKi8KKyAgICB1MzIgICAgZGlzY19lcnI7ICAgICAgICAgICAvKiAgRGlzY292ZXJ5IGFkdnQuIHBhcnNlIGVycm9ycyAgICAgICAgKi8KKyAgICB1MzIgICAgZGlzY191bnNvbDsgICAgICAgICAvKiAgRGlzY292ZXJ5IHVuc29saWNpdGVkICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgZGlzY190aW1lb3V0czsgICAgICAvKiAgRGlzY292ZXJ5IHRpbWVvdXRzICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgbGlua3N2Y191bnN1cHA7ICAgICAvKiAgVW5zdXBwb3J0ZWQgbGluayBzZXJ2aWNlIHJlcSAgICAgICAgKi8KKyAgICB1MzIgICAgbGlua3N2Y19lcnI7ICAgICAgICAvKiAgUGFyc2UgZXJyb3IgaW4gbGluayBzZXJ2aWNlIHJlcSAgICAgKi8KKyAgICB1MzIgICAgbG9nb19yZXE7ICAgICAgICAgICAvKiAgTnVtYmVyIG9mIEZJUCBsb2dvcyByZWNlaXZlZCAgICAgICAgKi8KKyAgICB1MzIgICAgY2xydmxpbmtfcmVxOyAgICAgICAvKiAgQ2xlYXIgdmlydHVhbCBsaW5rIHJlcSAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgb3BfdW5zdXBwOyAgICAgICAgICAvKiAgVW5zdXBwb3J0ZWQgRklQIG9wZXJhdGlvbiAgICAgICAgICAgKi8KKyAgICB1MzIgICAgdW50YWdnZWQ7ICAgICAgICAgICAvKiAgVW50YWdnZWQgZnJhbWVzIChpZ25vcmVkKSAgICAgICAgICAgKi8KKyAgICB1MzIgICAgcnN2ZDsKK307CisKKworc3RydWN0IGJmYV9md19scHNfc3RhdHNfcyB7CisgICAgdTMyICAgIG1hY19pbnZhbGlkczsgICAgICAgLyogIEludmFsaWQgbWFjIGFzc2lnbmVkICAgICAgICAgICAgICAgICovCisgICAgdTMyICAgIHJzdmQ7Cit9OworCisKK3N0cnVjdCBiZmFfZndfZmNvZV9zdGF0c19zIHsKKyAgICB1MzIgICAgY2VlX2xpbmt1cHM7ICAgICAgICAvKiAgQ0VFIGxpbmsgdXAgY291bnQgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgY2VlX2xpbmtkbnM7ICAgICAgICAvKiAgQ0VFIGxpbmsgZG93biBjb3VudCAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgZmlwX2xpbmt1cHM7ICAgICAgICAvKiAgRklQIGxpbmsgdXAgY291bnQgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgZmlwX2xpbmtkbnM7ICAgICAgICAvKiAgRklQIGxpbmsgdXAgY291bnQgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgZmlwX2ZhaWxzOyAgICAgICAgICAvKiAgRklQIGZhaWwgY291bnQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1MzIgICAgbWFjX2ludmFsaWRzOyAgICAgICAvKiAgSW52YWxpZCBtYWMgYXNzaWduZWQgICAgICAgICAgICAgICAgKi8KK307CisKKy8qKgorICogSU9DIGZpcm13YXJlIEZDb0UgcG9ydCBzdGF0cworICovCitzdHJ1Y3QgYmZhX2Z3X2Zjb2VfcG9ydF9zdGF0c19zIHsKKyAgICBzdHJ1Y3QgYmZhX2Z3X2Zjb2Vfc3RhdHNfcyAgZmNvZV9zdGF0czsKKyAgICBzdHJ1Y3QgYmZhX2Z3X2ZpcF9zdGF0c19zICAgZmlwX3N0YXRzOworfTsKKworLyoqCisgKiBJT0MgZmlybXdhcmUgRkMgcG9ydCBzdGF0cworICovCitzdHJ1Y3QgYmZhX2Z3X2ZjX3BvcnRfc3RhdHNfcyB7CisJc3RydWN0IGJmYV9md19wb3J0X2ZwZ19zdGF0c19zCQlmcGdfc3RhdHM7CisJc3RydWN0IGJmYV9md19wb3J0X3BoeXNtX3N0YXRzX3MJcGh5c21fc3RhdHM7CisJc3RydWN0IGJmYV9md19wb3J0X3Nuc21fc3RhdHNfcwkJc25zbV9zdGF0czsKKwlzdHJ1Y3QgYmZhX2Z3X3BvcnRfbGtzbV9zdGF0c19zCQlsa3NtX3N0YXRzOworfTsKKworLyoqCisgKiBJT0MgZmlybXdhcmUgRkMgcG9ydCBzdGF0cworICovCit1bmlvbiBiZmFfZndfcG9ydF9zdGF0c19zIHsKKwlzdHJ1Y3QgYmZhX2Z3X2ZjX3BvcnRfc3RhdHNfcwlmY19zdGF0czsKKwlzdHJ1Y3QgYmZhX2Z3X2Zjb2VfcG9ydF9zdGF0c19zCWZjb2Vfc3RhdHM7Cit9OworCisvKioKKyAqIElPQyBmaXJtd2FyZSBzdGF0cworICovCitzdHJ1Y3QgYmZhX2Z3X3N0YXRzX3MgeworCXN0cnVjdCBiZmFfZndfaW9jX3N0YXRzX3MJaW9jX3N0YXRzOworCXN0cnVjdCBiZmFfZndfaW9fc3RhdHNfcwlpb19zdGF0czsKKwl1bmlvbiAgYmZhX2Z3X3BvcnRfc3RhdHNfcwlwb3J0X3N0YXRzOworfTsKKworLyoqCisgKiBJT0Mgc3RhdGlzdGljcworICovCitzdHJ1Y3QgYmZhX2lvY2ZjX3N0YXRzX3MgeworCXN0cnVjdCBiZmFfZndfc3RhdHNfcyAJZndfc3RhdHM7CS8qICBmaXJtd2FyZSBJT0Mgc3RhdHMgICAgICAqLworfTsKKworLyoqCisgKiBJT0MgYXR0cmlidXRlcyByZXR1cm5lZCBpbiBxdWVyaWVzCisgKi8KK3N0cnVjdCBiZmFfaW9jZmNfYXR0cl9zIHsKKwlzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zCQljb25maWc7CQkvKiAgSU9DRkMgY29uZmlnICAgKi8KKwlzdHJ1Y3QgYmZhX2lvY2ZjX2ludHJfYXR0cl9zCWludHJfYXR0cjsJLyogIGludGVycnVwdCBhdHRyICovCit9OworCisjZGVmaW5lIEJGQV9JT0NGQ19QQVRIVE9WX01BWAk2MAorI2RlZmluZSBCRkFfSU9DRkNfUURFUFRIX01BWAkyMDAwCisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX0lPQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2lwZmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2lwZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2I2M2VhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaXBmYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRkFfREVGU19JUEZDX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX0lQRkNfSF9fCisKKyNpbmNsdWRlIDxiZmFfb3NfaW5jLmg+CisjaW5jbHVkZSA8cHJvdG9jb2wvdHlwZXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3R5cGVzLmg+CisKKy8qKgorICogRkNTIGlwIHJlbW90ZSBwb3J0IHN0YXRlcworICovCitlbnVtIGJmYV9pcHJwX3N0YXRlIHsKKwlCRkFfSVBSUF9VTklOSVQgID0gMCwJLyogIFBPUlQgaXMgbm90IHlldCBpbml0aWFsaXplZCAqLworCUJGQV9JUFJQX09OTElORSAgPSAxLAkvKiAgcHJvY2VzcyBsb2dpbiBpcyBjb21wbGV0ZSAqLworCUJGQV9JUFJQX09GRkxJTkUgPSAyLAkvKiAgaXBycCBpcyBvZmZsaW5lICovCit9OworCisvKioKKyAqIEZDUyByZW1vdGUgcG9ydCBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBiZmFfaXBycF9zdGF0c19zIHsKKwl1MzIgICAgICAgIG9mZmxpbmVzOworCXUzMiAgICAgICAgb25saW5lczsKKwl1MzIgICAgICAgIHJzY25zOworCXUzMiAgICAgICAgcGxvZ2lzOworCXUzMiAgICAgICAgbG9nb3M7CisJdTMyICAgICAgICBwbG9naV90aW1lb3V0czsKKwl1MzIgICAgICAgIHBsb2dpX3JlamVjdHM7Cit9OworCisvKioKKyAqIEZDUyBpcHJwIGF0dHJpYnV0ZSByZXR1cm5lZCBpbiBxdWVyaWVzCisgKi8KK3N0cnVjdCBiZmFfaXBycF9hdHRyX3MgeworCWVudW0gYmZhX2lwcnBfc3RhdGUgc3RhdGU7Cit9OworCitzdHJ1Y3QgYmZhX2lwZmNfc3RhdHNfcyB7CisJdTMyIGFycF9zZW50OworCXUzMiBhcnBfcmVjdjsKKwl1MzIgYXJwX3JlcGx5X3NlbnQ7CisJdTMyIGFycF9yZXBseV9yZWN2OworCXUzMiBmYXJwX3NlbnQ7CisJdTMyIGZhcnBfcmVjdjsKKwl1MzIgZmFycF9yZXBseV9zZW50OworCXUzMiBmYXJwX3JlcGx5X3JlY3Y7CisJdTMyIGZhcnBfcmVqZWN0X3NlbnQ7CisJdTMyIGZhcnBfcmVqZWN0X3JlY3Y7Cit9OworCitzdHJ1Y3QgYmZhX2lwZmNfYXR0cl9zIHsKKwliZmFfYm9vbGVhbl90IGVuYWJsZWQ7Cit9OworCisjZW5kaWYgLyogX19CRkFfREVGU19JUEZDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfaXRuaW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2l0bmltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjNzY5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2l0bmltLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRkFfREVGU19JVE5JTV9IX18KKyNkZWZpbmUgX19CRkFfREVGU19JVE5JTV9IX18KKworI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKyNpbmNsdWRlIDxwcm90b2NvbC90eXBlcy5oPgorCisvKioKKyAqIEZDUyBpdG5pbSBzdGF0ZXMKKyAqLworZW51bSBiZmFfaXRuaW1fc3RhdGUgeworCUJGQV9JVE5JTV9PRkZMSU5FIAk9IDAsCS8qICBvZmZsaW5lICovCisJQkZBX0lUTklNX1BSTElfU0VORCAJPSAxLAkvKiAgcHJsaSBzZW5kICovCisJQkZBX0lUTklNX1BSTElfU0VOVCAJPSAyLAkvKiAgcHJsaSBzZW50ICovCisJQkZBX0lUTklNX1BSTElfUkVUUlkgCT0gMywJLyogIHBybGkgcmV0cnkgKi8KKwlCRkFfSVROSU1fSENCX09OTElORSAJPSA0LAkvKiAgb25saW5lIGNhbGxiYWNrICovCisJQkZBX0lUTklNX09OTElORSAJPSA1LAkvKiAgb25saW5lICovCisJQkZBX0lUTklNX0hDQl9PRkZMSU5FIAk9IDYsCS8qICBvZmZsaW5lIGNhbGxiYWNrICovCisJQkZBX0lUTklNX0lOSVRJQVRJT1IgCT0gNywJLyogIGluaXRpYXRvciAqLworfTsKKworc3RydWN0IGJmYV9pdG5pbV9oYWxfc3RhdHNfcyB7CisJdTMyCW9ubGluZXM7CS8qICBJVE4gbmV4dXMgb25saW5lcyAoUFJMSSBkb25lKSAqLworCXUzMglvZmZsaW5lczsJLyogIElUTiBOZXh1cyBvZmZsaW5lcyAJKi8KKwl1MzIJY3JlYXRlczsJLyogIElUTiBjcmVhdGUgcmVxdWVzdHMgCSovCisJdTMyCWRlbGV0ZXM7CS8qICBJVE4gZGVsZXRlIHJlcXVlc3RzIAkqLworCXUzMgljcmVhdGVfY29tcHM7CS8qICBJVE4gY3JlYXRlIGNvbXBsZXRpb25zIAkqLworCXUzMglkZWxldGVfY29tcHM7CS8qICBJVE4gZGVsZXRlIGNvbXBsZXRpb25zIAkqLworCXUzMglzbGVyX2V2ZW50czsJLyogIFNMRVIgKHNlcXVlbmNlIGxldmVsIGVycm9yCisJCQkJCSAqIHJlY292ZXJ5KSBldmVudHMgKi8KKwl1MzIJaW9jX2Rpc2FibGVkOwkvKiAgTnVtIElPQyBkaXNhYmxlcwkJKi8KKwl1MzIJY2xlYW51cF9jb21wczsJLyogIElUTiBjbGVhbnVwIGNvbXBsZXRpb25zICovCisJdTMyCXRtX2NtbmRzOwkvKiAgdGFzayBtYW5hZ2VtZW50KFRNKSBjbW5kcyBzZW50ICovCisJdTMyCXRtX2Z3X3JzcHM7CS8qICBUTSBjbWRzIGZpcm13YXJlIHJlc3BvbnNlcyAqLworCXUzMgl0bV9zdWNjZXNzOwkvKiAgVE0gc3VjY2Vzc2VzICovCisJdTMyCXRtX2ZhaWx1cmVzOwkvKiAgVE0gZmFpbHVyZXMgKi8KKwl1MzIJdG1faW9fY29tcHM7CS8qICBUTSBJTyBjb21wbGV0aW9ucyAqLworCXUzMgl0bV9xcmVzdW1lczsJLyogIFRNIHF1ZXVlIHJlc3VtZXMgKGFmdGVyIHdhaXRpbmcKKwkJCQkJICogZm9yIHJlc291cmNlcykKKwkJCQkJICovCisJdTMyCXRtX2lvY2Rvd25zOwkvKiAgVE0gY21uZHMgYWZmZWN0ZWQgYnkgSU9DIGRvd24gKi8KKwl1MzIJdG1fY2xlYW51cHM7CS8qICBUTSBjbGVhbnVwcyAqLworCXUzMgl0bV9jbGVhbnVwX2NvbXBzOworCQkJCQkvKiAgVE0gY2xlYW51cCBjb21wbGV0aW9ucyAqLworCXUzMglpb3M7CQkvKiAgSU8gcmVxdWVzdHMgKi8KKwl1MzIJaW9fY29tcHM7CS8qICBJTyBjb21wbGV0aW9ucyAqLworCXU2NAlpbnB1dF9yZXFzOwkvKiAgSU5QVVQgcmVxdWVzdHMgKi8KKwl1NjQJb3V0cHV0X3JlcXM7CS8qICBPVVRQVVQgcmVxdWVzdHMgKi8KK307CisKKy8qKgorICogRkNTIHJlbW90ZSBwb3J0IHN0YXRpc3RpY3MKKyAqLworc3RydWN0IGJmYV9pdG5pbV9zdGF0c19zIHsKKwl1MzIgICAgICAgIG9ubGluZXM7CS8qICBudW0gcnBvcnQgb25saW5lICovCisJdTMyICAgICAgICBvZmZsaW5lczsJLyogIG51bSBycG9ydCBvZmZsaW5lICovCisJdTMyICAgICAgICBwcmxpX3NlbnQ7CS8qICBudW0gcHJsaSBzZW50IG91dCAqLworCXUzMiAgICAgICAgZmN4cF9hbGxvY193YWl0Oy8qICBudW0gZmN4cCBhbGxvYyB3YWl0cyAqLworCXUzMiAgICAgICAgcHJsaV9yc3BfZXJyOwkvKiAgbnVtIHBybGkgcnNwIGVycm9ycyAqLworCXUzMiAgICAgICAgcHJsaV9yc3BfYWNjOwkvKiAgbnVtIHBybGkgcnNwIGFjY2VwdHMgKi8KKwl1MzIgICAgICAgIGluaXRpYXRvcjsJLyogIHJwb3J0IGlzIGFuIGluaXRpYXRvciAqLworCXUzMiAgICAgICAgcHJsaV9yc3BfcGFyc2VfZXJyOwkvKiAgcHJsaSByc3AgcGFyc2luZyBlcnJvcnMgKi8KKwl1MzIgICAgICAgIHBybGlfcnNwX3JqdDsJLyogIG51bSBwcmxpIHJzcCByZWplY3RzICovCisJdTMyICAgICAgICB0aW1lb3V0OwkvKiAgbnVtIHRpbWVvdXRzIGRldGVjdGVkICovCisJdTMyICAgICAgICBzbGVyOwkJLyogIG51bSBzbGVyIG5vdGlmaWNhdGlvbiBmcm9tIEJGQSAqLworCXUzMglyc3ZkOworCXN0cnVjdCBiZmFfaXRuaW1faGFsX3N0YXRzX3MJaGFsX3N0YXRzOworfTsKKworLyoqCisgKiBGQ1MgaXRuaW0gYXR0cmlidXRlcyByZXR1cm5lZCBpbiBxdWVyaWVzCisgKi8KK3N0cnVjdCBiZmFfaXRuaW1fYXR0cl9zIHsKKwllbnVtIGJmYV9pdG5pbV9zdGF0ZSBzdGF0ZTsgLyogIEZDUyBpdG5pbSBzdGF0ZSAgICAgICAgKi8KKwl1OCByZXRyeTsJCS8qICBkYXRhIHJldHJhbnNtaXNpb24gc3VwcG9ydCAqLworCXU4CXRhc2tfcmV0cnlfaWQ7ICAvKiAgdGFzayByZXRyeSBpZGVudCBzdXBwb3J0ICAgKi8KKwl1OCByZWNfc3VwcG9ydDsgICAgLyogIFJFQyBzdXBwb3J0ZWQgICAgICAgICAgICAgICovCisJdTggY29uZl9jb21wOyAgICAgIC8qICBjb25maXJtZWQgY29tcGxldGlvbiBzdXBwICAqLworfTsKKworLyoqCisgKiBCRkEgSVROSU0gZXZlbnRzLgorICogQXJndW1lbnRzIGJlbG93IGFyZSBpbiBCRkFMIGNvbnRleHQgZnJvbSBNZ210CisgKiBCRkFfSVROSU1fQUVOX05FVzogICAgICAgW2luXTogTm9uZSAgW291dF06IHZmX2lkLCBscHd3bgorICogQkZBX0lUTklNX0FFTl9ERUxFVEU6ICAgIFtpbl06IHZmX2lkLCBscHd3biwgcnB3d24gKDAgPSBhbGwgZmNwNCB0YXJnZXRzKSwKKyAqCQkJCSAgW291dF06IHZmX2lkLCBwcHd3biwgbHB3d24sIHJwd3duCisgKiBCRkFfSVROSU1fQUVOX09OTElORTogICAgW2luXTogdmZfaWQsIGxwd3duLCBycHd3biAoMCA9IGFsbCBmY3A0IHRhcmdldHMpLAorICoJCQkJICBbb3V0XTogdmZfaWQsIHBwd3duLCBscHd3biwgcnB3d24KKyAqIEJGQV9JVE5JTV9BRU5fT0ZGTElORTogICBbaW5dOiB2Zl9pZCwgbHB3d24sIHJwd3duICgwID0gYWxsIGZjcDQgdGFyZ2V0cyksCisgKgkJCQkgIFtvdXRdOiB2Zl9pZCwgcHB3d24sIGxwd3duLCBycHd3bgorICogQkZBX0lUTklNX0FFTl9ESVNDT05ORUNUOltpbl06IHZmX2lkLCBscHd3biwgcnB3d24gKDAgPSBhbGwgZmNwNCB0YXJnZXRzKSwKKyAqCQkJCSAgW291dF06IHZmX2lkLCBwcHd3biwgbHB3d24sIHJwd3duCisgKi8KK2VudW0gYmZhX2l0bmltX2Flbl9ldmVudCB7CisJQkZBX0lUTklNX0FFTl9PTkxJTkUgCT0gMSwJLyogIFRhcmdldCBvbmxpbmUgKi8KKwlCRkFfSVROSU1fQUVOX09GRkxJTkUgCT0gMiwJLyogIFRhcmdldCBvZmZsaW5lICovCisJQkZBX0lUTklNX0FFTl9ESVNDT05ORUNUID0gMywJLyogIFRhcmdldCBkaXNjb25uZWN0ZWQgKi8KK307CisKKy8qKgorICogQkZBIElUTklNIGV2ZW50IGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgYmZhX2l0bmltX2Flbl9kYXRhX3MgeworCXUxNiAgICAgICAgdmZfaWQ7CS8qICB2Zl9pZCBvZiB0aGUgSVQgbmV4dXMgKi8KKwl1MTYgICAgICAgIHJzdmRbM107CisJd3duX3QgICAgICAgICAgIHBwd3duOwkvKiAgV1dOIG9mIGl0cyBwaHlzaWNhbCBwb3J0ICovCisJd3duX3QgICAgICAgICAgIGxwd3duOwkvKiAgV1dOIG9mIGxvZ2ljYWwgcG9ydCAqLworCXd3bl90ICAgICAgICAgICBycHd3bjsJLyogIFdXTiBvZiByZW1vdGUodGFyZ2V0KSBwb3J0ICovCit9OworCisjZW5kaWYgLyogX19CRkFfREVGU19JVE5JTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2xlZC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfbGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwMzkyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2xlZC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9ERUZTX0xFRF9IX18KKyNkZWZpbmUgX19CRkFfREVGU19MRURfSF9fCisKKyNkZWZpbmUJQkZBX0xFRF9NQVhfTlVNCQkzCisKK2VudW0gYmZhX2xlZF9vcCB7CisJQkZBX0xFRF9PRkYgICA9IDAsCisJQkZBX0xFRF9PTiAgICA9IDEsCisJQkZBX0xFRF9GTElDSyA9IDIsCisJQkZBX0xFRF9CTElOSyA9IDMsCit9OworCitlbnVtIGJmYV9sZWRfY29sb3IgeworCUJGQV9MRURfR1JFRU4gPSAwLAorCUJGQV9MRURfQU1CRVIgPSAxLAorfTsKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfTEVEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfbHBvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2xwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1OWY4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX2xwb3J0LmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0RFRlNfTFBPUlRfSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfTFBPUlRfSF9fCisKKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3R5cGVzLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19wb3J0Lmg+CisKKy8qKgorICogQkZBIEFFTiBsb2dpY2FsIHBvcnQgZXZlbnRzLgorICogQXJndW1lbnRzIGJlbG93IGFyZSBpbiBCRkFMIGNvbnRleHQgZnJvbSBNZ210CisgKiBCRkFfTFBPUlRfQUVOX05FVzogICAgICAgW2luXTogTm9uZSAgICAgICAgIFtvdXRdOiB2Zl9pZCwgcHB3d24sIGxwd3duLCByb2xlcworICogQkZBX0xQT1JUX0FFTl9ERUxFVEU6ICAgIFtpbl06IGxwd3duICAgICAgICBbb3V0XTogdmZfaWQsIHBwd3duLiBscHd3biwgcm9sZXMKKyAqIEJGQV9MUE9SVF9BRU5fT05MSU5FOiAgICBbaW5dOiBscHd3biAgICAgICAgW291dF06IHZmX2lkLCBwcHd3bi4gbHB3d24sIHJvbGVzCisgKiBCRkFfTFBPUlRfQUVOX09GRkxJTkU6ICAgW2luXTogbHB3d24gICAgICAgIFtvdXRdOiB2Zl9pZCwgcHB3d24uIGxwd3duLCByb2xlcworICogQkZBX0xQT1JUX0FFTl9ESVNDT05ORUNUOltpbl06IGxwd3duICAgICAgICBbb3V0XTogdmZfaWQsIHBwd3duLiBscHd3biwgcm9sZXMKKyAqIEJGQV9MUE9SVF9BRU5fTkVXX1BST1A6ICBbaW5dOiBOb25lICAgICAgICAgW291dF06IHZmX2lkLCBwcHd3bi4gbHB3d24sIHJvbGVzCisgKiBCRkFfTFBPUlRfQUVOX0RFTEVURV9QUk9QOiAgICAgW2luXTogbHB3d24gIFtvdXRdOiB2Zl9pZCwgcHB3d24uIGxwd3duLCByb2xlcworICogQkZBX0xQT1JUX0FFTl9ORVdfU1RBTkRBUkQ6ICAgIFtpbl06IE5vbmUgICBbb3V0XTogdmZfaWQsIHBwd3duLiBscHd3biwgcm9sZXMKKyAqIEJGQV9MUE9SVF9BRU5fREVMRVRFX1NUQU5EQVJEOiBbaW5dOiBscHd3biAgW291dF06IHZmX2lkLCBwcHd3bi4gbHB3d24sIHJvbGVzCisgKiBCRkFfTFBPUlRfQUVOX05QSVZfRFVQX1dXTjogICAgW2luXTogbHB3d24gIFtvdXRdOiB2Zl9pZCwgcHB3d24uIGxwd3duLCByb2xlcworICogQkZBX0xQT1JUX0FFTl9OUElWX0ZBQlJJQ19NQVg6IFtpbl06IGxwd3duICBbb3V0XTogdmZfaWQsIHBwd3duLiBscHd3biwgcm9sZXMKKyAqIEJGQV9MUE9SVF9BRU5fTlBJVl9VTktOT1dOOiAgICBbaW5dOiBscHd3biAgW291dF06IHZmX2lkLCBwcHd3bi4gbHB3d24sIHJvbGVzCisgKi8KK2VudW0gYmZhX2xwb3J0X2Flbl9ldmVudCB7CisJQkZBX0xQT1JUX0FFTl9ORVcJPSAxLAkvKiAgTFBvcnQgY3JlYXRlZCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fREVMRVRFCT0gMiwJLyogIExQb3J0IGRlbGV0ZWQgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX09OTElORQk9IDMsCS8qICBMUG9ydCBvbmxpbmUgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX09GRkxJTkUJPSA0LAkvKiAgTFBvcnQgb2ZmbGluZSBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fRElTQ09OTkVDVCA9IDUsCS8qICBMUG9ydCBkaXNjb25uZWN0IGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ORVdfUFJPUAk9IDYsCS8qICBWUG9ydCBjcmVhdGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ERUxFVEVfUFJPUCA9IDcsCS8qICBWUG9ydCBkZWxldGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ORVdfU1RBTkRBUkQgPSA4LAkvKiAgVlBvcnQgY3JlYXRlZCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fREVMRVRFX1NUQU5EQVJEID0gOSwgIC8qICBWUG9ydCBkZWxldGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9OUElWX0RVUF9XV04gPSAxMCwgICAgLyogIFZQb3J0IGNvbmZpZ3VyZWQgd2l0aAorCQkJCQkgICAgICogICBkdXBsaWNhdGUgV1dOIGV2ZW50CisJCQkJCQkgKi8KKwlCRkFfTFBPUlRfQUVOX05QSVZfRkFCUklDX01BWCA9IDExLCAvKiAgTWF4IE5QSVYgaW4gZmFicmljL2Zwb3J0ICovCisJQkZBX0xQT1JUX0FFTl9OUElWX1VOS05PV04gPSAxMiwgLyogIFVua25vd24gTlBJViBFcnJvciBjb2RlIGV2ZW50ICovCit9OworCisvKioKKyAqIEJGQSBBRU4gZXZlbnQgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGJmYV9scG9ydF9hZW5fZGF0YV9zIHsKKwl1MTYgICAgICAgIHZmX2lkOwkvKiAgdmZfaWQgb2YgdGhpcyBsb2dpY2FsIHBvcnQgKi8KKwl1MTYgICAgICAgIHJzdmQ7CisJZW51bSBiZmFfcG9ydF9yb2xlIHJvbGVzOwkvKiAgTG9naWNhbCBwb3J0IG1vZGUsSU0vVE0vSVAgZXRjICovCisJd3duX3QgICAgICAgICAgIHBwd3duOwkvKiAgV1dOIG9mIGl0cyBwaHlzaWNhbCBwb3J0ICovCisJd3duX3QgICAgICAgICAgIGxwd3duOwkvKiAgV1dOIG9mIHRoaXMgbG9naWNhbCBwb3J0ICovCit9OworCisjZW5kaWYgLyogX19CRkFfREVGU19MUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX21mZy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfbWZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmZDRhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX21mZy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19CRkFfREVGU19NRkdfSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfTUZHX0hfXworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorCisvKioKKyAqIE1hbnVmYWN0dXJpbmcgYmxvY2sgdmVyc2lvbgorICovCisjZGVmaW5lIEJGQV9NRkdfVkVSU0lPTgkJCQkxCisKKy8qKgorICogTWFudWZhY3R1cmluZyBibG9jayBmb3JtYXQKKyAqLworI2RlZmluZSBCRkFfTUZHX1NFUklBTE5VTV9TSVpFCQkJMTEKKyNkZWZpbmUgQkZBX01GR19QQVJUTlVNX1NJWkUJCQkxNAorI2RlZmluZSBCRkFfTUZHX1NVUFBMSUVSX0lEX1NJWkUJCTEwCisjZGVmaW5lIEJGQV9NRkdfU1VQUExJRVJfUEFSVE5VTV9TSVpFCTIwCisjZGVmaW5lIEJGQV9NRkdfU1VQUExJRVJfU0VSSUFMTlVNX1NJWkUJMjAKKyNkZWZpbmUgQkZBX01GR19TVVBQTElFUl9SRVZJU0lPTl9TSVpFCTQKKyNkZWZpbmUgU1RSU1ooX24pCSgoKF9uKSArIDQpICYgfjMpCisKKy8qKgorICogVlBEIGRhdGEgbGVuZ3RoCisgKi8KKyNkZWZpbmUgQkZBX01GR19WUERfTEVOICAgICAyNTYKKworLyoqCisgKiBBbGwgbnVtZXJpY2FsIGZpZWxkcyBhcmUgaW4gYmlnLWVuZGlhbiBmb3JtYXQuCisgKi8KK3N0cnVjdCBiZmFfbWZnX3ZwZF9zIHsKKyAgICB1OCAgICAgdmVyc2lvbjsgICAgLyogIHZwZCBkYXRhIHZlcnNpb24gKi8KKyAgICB1OCAgICAgdnBkX3NpZ1szXTsgLyogIGNoYXJhY3RlcnMgJ1YnLCAnUCcsICdEJyAqLworICAgIHU4ICAgICBjaGtzdW07ICAgICAvKiAgdTggY2hlY2tzdW0gKi8KKyAgICB1OCAgICAgdmVuZG9yOyAgICAgLyogIHZlbmRvciAqLworICAgIHU4ICAgICBsZW47ICAgICAgICAvKiAgdnBkIGRhdGEgbGVuZ3RoIGV4Y2x1ZGluZyBoZWFkZXIgKi8KKyAgICB1OCAgICAgcnN2OworICAgIHU4ICAgICBkYXRhW0JGQV9NRkdfVlBEX0xFTl07ICAvKiAgdnBkIGRhdGEgKi8KK307CisKKyNwcmFnbWEgcGFjaygxKQorCisjZW5kaWYgLyogX19CRkFfREVGU19NRkdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wY2kuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjgzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wY2kuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19QQ0lfSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfUENJX0hfXworCisvKioKKyAqIFBDSSBkZXZpY2UgYW5kIHZlbmRvciBJRCBpbmZvcm1hdGlvbgorICovCitlbnVtIHsKKwlCRkFfUENJX1ZFTkRPUl9JRF9CUk9DQURFCT0gMHgxNjU3LAorCUJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMlAJPSAweDEzLAorCUJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMVAJPSAweDE3LAorCUJGQV9QQ0lfREVWSUNFX0lEX0NUCQk9IDB4MTQsCit9OworCisvKioKKyAqIFBDSSBzdWItc3lzdGVtIGRldmljZSBhbmQgdmVuZG9yIElEIGluZm9ybWF0aW9uCisgKi8KK2VudW0geworCUJGQV9QQ0lfRkNPRV9TU0RFVklDRV9JRAk9IDB4MTQsCit9OworCisjZGVmaW5lIEJGQV9QQ0lfQUNDRVNTX1JBTkdFUyAxCS8qIE1heGltdW0gbnVtYmVyIG9mIGRldmljZSBhZGRyZXNzIHJhbmdlcworCQkJCSAqIG1hcHBlZCB0aHJvdWdoIGRpZmZlcmVudCBCQVIocykuICovCisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX1BDSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3BtLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDZkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wbS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9ERUZTX1BNX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX1BNX0hfXworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorCisvKioKKyAqIEJGQSBwb3dlciBtYW5hZ2VtZW50IGRldmljZSBzdGF0ZXMKKyAqLworZW51bSBiZmFfcG1fZHMgeworCUJGQV9QTV9EU19EMCA9IDAsCS8qICBmdWxsIHBvd2VyIG1vZGUgKi8KKwlCRkFfUE1fRFNfRDEgPSAxLAkvKiAgcG93ZXIgc2F2ZSBzdGF0ZSAxICovCisJQkZBX1BNX0RTX0QyID0gMiwJLyogIHBvd2VyIHNhdmUgc3RhdGUgMiAqLworCUJGQV9QTV9EU19EMyA9IDMsCS8qICBwb3dlciBvZmYgc3RhdGUgKi8KK307CisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX1BNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcG9tLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZhMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcG9tLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0JGQV9ERUZTX1BPTV9IX18KKyNkZWZpbmUgX19CRkFfREVGU19QT01fSF9fCisKKyNpbmNsdWRlIDxiZmFfb3NfaW5jLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc190eXBlcy5oPgorCisvKioKKyAqIFBPTSBoZWFsdGggc3RhdHVzIGxldmVscyBmb3IgZWFjaCBhdHRyaWJ1dGVzLgorICovCitlbnVtIGJmYV9wb21fZW50cnlfaGVhbHRoIHsKKwlCRkFfUE9NX0hFQUxUSF9OT0lORk8gID0gMSwJLyogIG5vIGluZm9ybWF0aW9uICovCisJQkZBX1BPTV9IRUFMVEhfTk9STUFMICA9IDIsCS8qICBoZWFsdGggaXMgbm9ybWFsICovCisJQkZBX1BPTV9IRUFMVEhfV0FSTklORyA9IDMsCS8qICB3YXJuaW5nIGxldmVsICovCisJQkZBX1BPTV9IRUFMVEhfQUxBUk0gICA9IDQsCS8qICBhbGFybWluZyBsZXZlbCAqLworfTsKKworLyoqCisgKiBSZWFkaW5nIG9mIHRlbXBlcmF0dXJlL3ZvbHRhZ2UvY3VycmVudC9wb3dlcgorICovCitzdHJ1Y3QgYmZhX3BvbV9lbnRyeV9zIHsKKwllbnVtIGJmYV9wb21fZW50cnlfaGVhbHRoIGhlYWx0aDsJLyogIFBPTSBlbnRyeSBoZWFsdGggKi8KKwl1MzIgICAgICAgIGN1cnJfdmFsdWU7CS8qICBjdXJyZW50IHZhbHVlICovCisJdTMyICAgICAgICB0aHJfd2Fybl9oaWdoOwkvKiAgdGhyZXNob2xkIHdhcm5pbmcgaGlnaCAqLworCXUzMiAgICAgICAgdGhyX3dhcm5fbG93OwkvKiAgdGhyZXNob2xkIHdhcm5pbmcgbG93ICovCisJdTMyICAgICAgICB0aHJfYWxhcm1fbG93OwkvKiAgdGhyZXNob2xkIGFsYXJhbSBsb3cgKi8KKwl1MzIgICAgICAgIHRocl9hbGFybV9oaWdoOwkvKiAgdGhyZXNob2xkIGFsYXJtIGhpZ2ggKi8KK307CisKKy8qKgorICogUE9NIGF0dHJpYnV0ZXMKKyAqLworc3RydWN0IGJmYV9wb21fYXR0cl9zIHsKKwlzdHJ1Y3QgYmZhX3BvbV9lbnRyeV9zIHRlbXBlcmF0dXJlOwkvKiAgY2VudGlncmFkZSAqLworCXN0cnVjdCBiZmFfcG9tX2VudHJ5X3Mgdm9sdGFnZTsJLyogIHZvbHRzICovCisJc3RydWN0IGJmYV9wb21fZW50cnlfcyBjdXJyOwkvKiAgbWlsbGkgYW1wcyAqLworCXN0cnVjdCBiZmFfcG9tX2VudHJ5X3MgdHhwb3dlcjsJLyogIG1pY3JvIHdhdHRzICovCisJc3RydWN0IGJmYV9wb21fZW50cnlfcyByeHBvd2VyOwkvKiAgbWljcm8gd2F0dHMgKi8KK307CisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX1BPTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3BvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA2OTZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcG9ydC5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19QT1JUX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX1BPUlRfSF9fCisKKyNpbmNsdWRlIDxiZmFfb3NfaW5jLmg+CisjaW5jbHVkZSA8cHJvdG9jb2wvdHlwZXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Bwb3J0Lmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19pb2MuaD4KKworI2RlZmluZSBCRkFfRkNTX0ZBQlJJQ19JUEFERFJfU1ogIDE2CisKKy8qKgorICogc3ltYm9saWMgbmFtZXMgZm9yIGJhc2UgcG9ydC92aXJ0dWFsIHBvcnQKKyAqLworI2RlZmluZSBCRkFfU1lNTkFNRV9NQVhMRU4JMTI4CS8qIHZtd2FyZS93aW5kb3dzIHVzZXMgMTI4IGJ5dGVzICovCitzdHJ1Y3QgYmZhX3BvcnRfc3ltbmFtZV9zIHsKKwljaGFyICAgICAgICAgICAgc3ltbmFtZVtCRkFfU1lNTkFNRV9NQVhMRU5dOworfTsKKworLyoqCisqIFJvbGVzIG9mIEZDUyBwb3J0OgorICogICAgIC0gRkNQIElNIGFuZCBGQ1AgVE0gcm9sZXMgY2Fubm90IGJlIGVuYWJsZWQgdG9nZXRoZXIgZm9yIGEgRkNTIHBvcnQKKyAqICAgICAtIENyZWF0ZSBtdWx0aXBsZSBwb3J0cyBpZiBib3RoIElNIGFuZCBUTSBmdW5jdGlvbnMgcmVxdWlyZWQuCisgKiAgICAgLSBBdGxlYXN0IG9uZSByb2xlIG11c3QgYmUgc3BlY2lmaWVkLgorICovCitlbnVtIGJmYV9wb3J0X3JvbGUgeworCUJGQV9QT1JUX1JPTEVfRkNQX0lNIAk9IDB4MDEsCS8qICBGQ1AgaW5pdGlhdG9yIHJvbGUgKi8KKwlCRkFfUE9SVF9ST0xFX0ZDUF9UTSAJPSAweDAyLAkvKiAgRkNQIHRhcmdldCByb2xlICovCisJQkZBX1BPUlRfUk9MRV9GQ1BfSVBGQyAJPSAweDA0LAkvKiAgSVAgb3ZlciBGQyByb2xlICovCisJQkZBX1BPUlRfUk9MRV9GQ1BfTUFYIAk9IEJGQV9QT1JUX1JPTEVfRkNQX0lQRkMgfCBCRkFfUE9SVF9ST0xFX0ZDUF9JTQorfTsKKworLyoqCisgKiBGQ1MgcG9ydCBjb25maWd1cmF0aW9uLgorICovCitzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgeworICAgIHd3bl90ICAgICAgICAgICAgICAgcHd3bjsgICAgICAgLyogIHBvcnQgd3duICovCisgICAgd3duX3QgICAgICAgICAgICAgICBud3duOyAgICAgICAvKiAgbm9kZSB3d24gKi8KKyAgICBzdHJ1Y3QgYmZhX3BvcnRfc3ltbmFtZV9zICBzeW1fbmFtZTsgICAvKiAgdm0gcG9ydCBzeW1ib2xpYyBuYW1lICovCisgICAgZW51bSBiZmFfcG9ydF9yb2xlICAgICByb2xlczsgICAgICAvKiAgRkNTIHBvcnQgcm9sZXMgKi8KKwl1MzIJCQlyc3ZkOworICAgIHU4ICAgICAgICAgICAgIHRhZ1sxNl07CS8qICBvcGFxdWUgdGFnIGZyb20gYXBwbGljYXRpb24gKi8KK307CisKKy8qKgorICogRkNTIHBvcnQgc3RhdGVzCisgKi8KK2VudW0gYmZhX3BvcnRfc3RhdGUgeworCUJGQV9QT1JUX1VOSU5JVCAgPSAwLAkvKiAgUE9SVCBpcyBub3QgeWV0IGluaXRpYWxpemVkICovCisJQkZBX1BPUlRfRkRJU0MgICA9IDEsCS8qICBGRElTQyBpcyBpbiBwcm9ncmVzcyAqLworCUJGQV9QT1JUX09OTElORSAgPSAyLAkvKiAgbG9naW4gdG8gZmFicmljIGlzIGNvbXBsZXRlICovCisJQkZBX1BPUlRfT0ZGTElORSA9IDMsCS8qICBObyBsb2dpbiB0byBmYWJyaWMgKi8KK307CisKKy8qKgorICogRkNTIHBvcnQgdHlwZS4gUmVxdWlyZWQgZm9yIFZtV2FyZS4KKyAqLworZW51bSBiZmFfcG9ydF90eXBlIHsKKwlCRkFfUE9SVF9UWVBFX1BIWVNJQ0FMID0gMCwKKwlCRkFfUE9SVF9UWVBFX1ZJUlRVQUwsCit9OworCisvKioKKyAqIEZDUyBwb3J0IG9mZmxpbmUgcmVhc29uLiBSZXF1aXJlZCBmb3IgVm1XYXJlLgorICovCitlbnVtIGJmYV9wb3J0X29mZmxpbmVfcmVhc29uIHsKKwlCRkFfUE9SVF9PRkZMSU5FX1VOS05PV04gPSAwLAorCUJGQV9QT1JUX09GRkxJTkVfTElOS0RPV04sCisJQkZBX1BPUlRfT0ZGTElORV9GQUJfVU5TVVBQT1JURUQsCS8qICBOUElWIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisJCQkJCQkgKiAgICBmYWJyaWMgKi8KKwlCRkFfUE9SVF9PRkZMSU5FX0ZBQl9OT1JFU09VUkNFUywKKwlCRkFfUE9SVF9PRkZMSU5FX0ZBQl9MT0dPVVQsCit9OworCisvKioKKyAqIEZDUyBscG9ydCBpbmZvLiBSZXF1aXJlZCBmb3IgVm1XYXJlLgorICovCitzdHJ1Y3QgYmZhX3BvcnRfaW5mb19zIHsKKwl1OCAgICAgICAgIHBvcnRfdHlwZTsJLyogYmZhX3BvcnRfdHlwZV90IDogcGh5c2ljYWwgb3IKKwkJCQkJICogdmlydHVhbCAqLworCXU4ICAgICAgICAgcG9ydF9zdGF0ZTsJLyogb25lIG9mIGJmYV9wb3J0X3N0YXRlIHZhbHVlcyAqLworCXU4ICAgICAgICAgb2ZmbGluZV9yZWFzb247CS8qIG9uZSBvZiBiZmFfcG9ydF9vZmZsaW5lX3JlYXNvbl90CisJCQkJCSAqIHZhbHVlcyAqLworCXd3bl90ICAgICAgICAgICBwb3J0X3d3bjsKKwl3d25fdCAgICAgICAgICAgbm9kZV93d247CisKKwkvKgorCSAqIGZvbGxvd2luZyA0IGZlaWxkcyBhcmUgdmFsaWQgZm9yIFBoeXNpY2FsIFBvcnRzIG9ubHkKKwkgKi8KKwl1MzIgICAgICAgIG1heF92cG9ydHNfc3VwcDsJLyogTWF4IHN1cHBvcnRlZCB2cG9ydHMgKi8KKwl1MzIgICAgICAgIG51bV92cG9ydHNfaW51c2U7CS8qIE51bSBvZiBpbiB1c2UgdnBvcnRzICovCisJdTMyICAgICAgICBtYXhfcnBvcnRzX3N1cHA7CS8qIE1heCBzdXBwb3J0ZWQgcnBvcnRzICovCisJdTMyICAgICAgICBudW1fcnBvcnRzX2ludXNlOwkvKiBOdW0gb2YgZG9zY292ZXJlZCBycG9ydHMgKi8KKworfTsKKworLyoqCisgKiBGQ1MgcG9ydCBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBiZmFfcG9ydF9zdGF0c19zIHsKKwl1MzIgICAgICAgIG5zX3Bsb2dpX3NlbnQ7CisJdTMyICAgICAgICBuc19wbG9naV9yc3BfZXJyOworCXUzMiAgICAgICAgbnNfcGxvZ2lfYWNjX2VycjsKKwl1MzIgICAgICAgIG5zX3Bsb2dpX2FjY2VwdHM7CisJdTMyICAgICAgICBuc19yZWplY3RzOwkvKiBOUyBjb21tYW5kIHJlamVjdHMgKi8KKwl1MzIgICAgICAgIG5zX3Bsb2dpX3Vua25vd25fcnNwOworCXUzMiAgICAgICAgbnNfcGxvZ2lfYWxsb2Nfd2FpdDsKKworCXUzMiAgICAgICAgbnNfcmV0cmllczsJLyogTlMgY29tbWFuZCByZXRyaWVzICovCisJdTMyICAgICAgICBuc190aW1lb3V0czsJLyogTlMgY29tbWFuZCB0aW1lb3V0cyAqLworCisJdTMyICAgICAgICBuc19yc3BuaWRfc2VudDsKKwl1MzIgICAgICAgIG5zX3JzcG5pZF9hY2NlcHRzOworCXUzMiAgICAgICAgbnNfcnNwbmlkX3JzcF9lcnI7CisJdTMyICAgICAgICBuc19yc3BuaWRfcmVqZWN0czsKKwl1MzIgICAgICAgIG5zX3JzcG5pZF9hbGxvY193YWl0OworCisJdTMyICAgICAgICBuc19yZnRpZF9zZW50OworCXUzMiAgICAgICAgbnNfcmZ0aWRfYWNjZXB0czsKKwl1MzIgICAgICAgIG5zX3JmdGlkX3JzcF9lcnI7CisJdTMyICAgICAgICBuc19yZnRpZF9yZWplY3RzOworCXUzMiAgICAgICAgbnNfcmZ0aWRfYWxsb2Nfd2FpdDsKKworCXUzMgluc19yZmZpZF9zZW50OworCXUzMgluc19yZmZpZF9hY2NlcHRzOworCXUzMgluc19yZmZpZF9yc3BfZXJyOworCXUzMgluc19yZmZpZF9yZWplY3RzOworCXUzMgluc19yZmZpZF9hbGxvY193YWl0OworCisJdTMyICAgICAgICBuc19naWRmdF9zZW50OworCXUzMiAgICAgICAgbnNfZ2lkZnRfYWNjZXB0czsKKwl1MzIgICAgICAgIG5zX2dpZGZ0X3JzcF9lcnI7CisJdTMyICAgICAgICBuc19naWRmdF9yZWplY3RzOworCXUzMiAgICAgICAgbnNfZ2lkZnRfdW5rbm93bl9yc3A7CisJdTMyICAgICAgICBuc19naWRmdF9hbGxvY193YWl0OworCisJLyoKKwkgKiBNZ210IFNlcnZlciBzdGF0cworCSAqLworCXUzMiAgICAgICAgbXNfcmV0cmllczsJLyogTVMgY29tbWFuZCByZXRyaWVzICovCisJdTMyICAgICAgICBtc190aW1lb3V0czsJLyogTVMgY29tbWFuZCB0aW1lb3V0cyAqLworCXUzMiAgICAgICAgbXNfcGxvZ2lfc2VudDsKKwl1MzIgICAgICAgIG1zX3Bsb2dpX3JzcF9lcnI7CisJdTMyICAgICAgICBtc19wbG9naV9hY2NfZXJyOworCXUzMiAgICAgICAgbXNfcGxvZ2lfYWNjZXB0czsKKwl1MzIgICAgICAgIG1zX3JlamVjdHM7CS8qIE5TIGNvbW1hbmQgcmVqZWN0cyAqLworCXUzMiAgICAgICAgbXNfcGxvZ2lfdW5rbm93bl9yc3A7CisJdTMyICAgICAgICBtc19wbG9naV9hbGxvY193YWl0OworCisJdTMyICAgICAgICBudW1fcnNjbjsJLyogTnVtIG9mIFJTQ04gcmVjZWl2ZWQgKi8KKwl1MzIgICAgICAgIG51bV9wb3J0aWRfcnNjbjsvKiBOdW0gcG9ydGlkIGZvcm1hdCBSU0NOCisJCQkJCQkJCSogcmVjZWl2ZWQgKi8KKworCXUzMgl1Zl9yZWN2czsgCS8qIHVuc29saWNpdGVkIHJlY3YgZnJhbWVzICAgICAgKi8KKwl1MzIJdWZfcmVjdl9kcm9wczsgCS8qIGRyb3BwZWQgcmVjZWl2ZWQgZnJhbWVzCSovCisKKwl1MzIJcnN2ZDsgCQkvKiBwYWRkaW5nIGZvciA2NCBiaXQgYWxpZ25tZW50ICovCit9OworCisvKioKKyAqIEJGQSBwb3J0IGF0dHJpYnV0ZSByZXR1cm5lZCBpbiBxdWVyaWVzCisgKi8KK3N0cnVjdCBiZmFfcG9ydF9hdHRyX3MgeworCWVudW0gYmZhX3BvcnRfc3RhdGUgc3RhdGU7CQkvKiAgcG9ydCBzdGF0ZSAqLworCXUzMiAgICAgICAgIHBpZDsJCS8qICBwb3J0IElEICovCisJc3RydWN0IGJmYV9wb3J0X2NmZ19zICAgcG9ydF9jZmc7CS8qICBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKwllbnVtIGJmYV9wcG9ydF90eXBlIHBvcnRfdHlwZTsJLyogIGN1cnJlbnQgdG9wb2xvZ3kgKi8KKwl1MzIgICAgICAgICBsb29wYmFjazsJLyogIGNhYmxlIGlzIGV4dGVybmFsbHkgbG9vcGVkIGJhY2sgKi8KKwl3d25fdAkJZmFicmljX25hbWU7IC8qICBhdHRhY2hlZCBzd2l0Y2gncyBud3duICovCisJdTgJCWZhYnJpY19pcF9hZGRyW0JGQV9GQ1NfRkFCUklDX0lQQUREUl9TWl07IC8qICBhdHRhY2hlZAorCQkJCQkJCSogZmFicmljJ3MgaXAgYWRkciAqLworfTsKKworLyoqCisgKiBCRkEgcGh5c2ljYWwgcG9ydCBMZXZlbCBldmVudHMKKyAqIEFyZ3VtZW50cyBiZWxvdyBhcmUgaW4gQkZBTCBjb250ZXh0IGZyb20gTWdtdAorICogQkZBX1BPUlRfQUVOX09OTElORTogICAgIFtpbl06IHB3d24JW291dF06IHB3d24KKyAqIEJGQV9QT1JUX0FFTl9PRkZMSU5FOiAgICBbaW5dOiBwd3duCVtvdXRdOiBwd3duCisgKiBCRkFfUE9SVF9BRU5fUkxJUjogICAgICAgW2luXTogTm9uZQlbb3V0XTogcHd3biwgcmxpcl9kYXRhLCBybGlyX2xlbgorICogQkZBX1BPUlRfQUVOX1NGUF9JTlNFUlQ6IFtpbl06IHB3d24JW291dF06IHBvcnRfaWQsIHB3d24KKyAqIEJGQV9QT1JUX0FFTl9TRlBfUkVNT1ZFOiBbaW5dOiBwd3duCVtvdXRdOiBwb3J0X2lkLCBwd3duCisgKiBCRkFfUE9SVF9BRU5fU0ZQX1BPTTogICAgW2luXTogcHd3bglbb3V0XTogbGV2ZWwsIHBvcnRfaWQsIHB3d24KKyAqIEJGQV9QT1JUX0FFTl9FTkFCTEU6ICAgICBbaW5dOiBwd3duCVtvdXRdOiBwd3duCisgKiBCRkFfUE9SVF9BRU5fRElTQUJMRTogICAgW2luXTogcHd3bglbb3V0XTogcHd3bgorICogQkZBX1BPUlRfQUVOX0FVVEhfT046ICAgIFtpbl06IHB3d24JW291dF06IHB3d24KKyAqIEJGQV9QT1JUX0FFTl9BVVRIX09GRjogICBbaW5dOiBwd3duCVtvdXRdOiBwd3duCisgKiBCRkFfUE9SVF9BRU5fRElTQ09OTkVDVDogW2luXTogcHd3bglbb3V0XTogcHd3bgorICogQkZBX1BPUlRfQUVOX1FPU19ORUc6ICAgIFtpbl06IHB3d24JW291dF06IHB3d24KKyAqIEJGQV9QT1JUX0FFTl9GQUJSSUNfTkFNRV9DSEFOR0U6IFtpbl06IHB3d24sIFtvdXRdOiBwd3duLCBmd3duCisgKgorICovCitlbnVtIGJmYV9wb3J0X2Flbl9ldmVudCB7CisJQkZBX1BPUlRfQUVOX09OTElORSAgICAgPSAxLAkvKiAgUGh5c2ljYWwgUG9ydCBvbmxpbmUgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fT0ZGTElORSAgICA9IDIsCS8qICBQaHlzaWNhbCBQb3J0IG9mZmxpbmUgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fUkxJUiAgICAgICA9IDMsCS8qICBSTElSIGV2ZW50LCBub3Qgc3VwcG9ydGVkICovCisJQkZBX1BPUlRfQUVOX1NGUF9JTlNFUlQgPSA0LAkvKiAgU0ZQIGluc2VydGVkIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX1NGUF9SRU1PVkUgPSA1LAkvKiAgU0ZQIHJlbW92ZWQgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX1BPTSAgICA9IDYsCS8qICBTRlAgUE9NIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX0VOQUJMRSAgICAgPSA3LAkvKiAgUGh5c2ljYWwgUG9ydCBlbmFibGUgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fRElTQUJMRSAgICA9IDgsCS8qICBQaHlzaWNhbCBQb3J0IGRpc2FibGUgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fQVVUSF9PTiAgICA9IDksCS8qICBQaHlzaWNhbCBQb3J0IGF1dGggc3VjY2VzcyBldmVudCAqLworCUJGQV9QT1JUX0FFTl9BVVRIX09GRiAgID0gMTAsCS8qICBQaHlzaWNhbCBQb3J0IGF1dGggZmFpbCBldmVudCAqLworCUJGQV9QT1JUX0FFTl9ESVNDT05ORUNUID0gMTEsCS8qICBQaHlzaWNhbCBQb3J0IGRpc2Nvbm5lY3QgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fUU9TX05FRyAgICA9IDEyLCAgCS8qICBCYXNlIFBvcnQgUU9TIG5lZ290aWF0aW9uIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX0ZBQlJJQ19OQU1FX0NIQU5HRSA9IDEzLCAvKiAgRmFicmljIE5hbWUvV1dOIGNoYW5nZQorCQkJCQkgICAgICAgKiBldmVudCAqLworCUJGQV9QT1JUX0FFTl9TRlBfQUNDRVNTX0VSUk9SID0gMTQsIC8qICBTRlAgcmVhZCBlcnJvciBldmVudCAqLworCUJGQV9QT1JUX0FFTl9TRlBfVU5TVVBQT1JUID0gMTUsIC8qICBVbnN1cHBvcnRlZCBTRlAgZXZlbnQgKi8KK307CisKK2VudW0gYmZhX3BvcnRfYWVuX3NmcF9wb20geworCUJGQV9QT1JUX0FFTl9TRlBfUE9NX0dSRUVOID0gMSwJLyogIE5vcm1hbCAqLworCUJGQV9QT1JUX0FFTl9TRlBfUE9NX0FNQkVSID0gMiwJLyogIFdhcm5pbmcgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX1BPTV9SRUQgICA9IDMsCS8qICBDcml0aWNhbCAqLworCUJGQV9QT1JUX0FFTl9TRlBfUE9NX01BWCAgID0gQkZBX1BPUlRfQUVOX1NGUF9QT01fUkVECit9OworCitzdHJ1Y3QgYmZhX3BvcnRfYWVuX2RhdGFfcyB7CisJZW51bSBiZmFfaW9jX3R5cGVfZSBpb2NfdHlwZTsKKwl3d25fdCAgICAgICAgICAgcHd3bjsJICAgICAgLyogIFdXTiBvZiB0aGUgcGh5c2ljYWwgcG9ydCAqLworCXd3bl90ICAgICAgICAgICBmd3duOwkgICAgICAvKiAgV1dOIG9mIHRoZSBmYWJyaWMgcG9ydCAqLworCW1hY190ICAgICAgICAgICBtYWM7CSAgICAgIC8qICBNQUMgYWRkcmVzIG9mIHRoZSBldGhlcm5ldCBwb3J0LAorCQkJCSAgICAgICAqIGFwcGxpY2FibGUgdG8gQ05BIHBvcnQgb25seSAqLworCWludCAgICAgICAgICAgICBwaHlfcG9ydF9udW07IC8qISBGb3IgU0ZQIHJlbGF0ZWQgZXZlbnRzICovCisJZW51bSBiZmFfcG9ydF9hZW5fc2ZwX3BvbSBsZXZlbDsgLyogIE9ubHkgdHJhbnNpdGlvbnMgd2lsbAorCQkJCQkgICogYmUgaW5mb3JtZWQgKi8KK307CisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX1BPUlRfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19wcG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAwYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfcHBvcnQuaApAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0RFRlNfUFBPUlRfSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfUFBPUlRfSF9fCisKKyNpbmNsdWRlIDxiZmFfb3NfaW5jLmg+CisjaW5jbHVkZSA8cHJvdG9jb2wvZmMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3R5cGVzLmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19xb3MuaD4KKyNpbmNsdWRlIDxjbmEvcHN0YXRzL3BoeXBvcnRfZGVmcy5oPgorCisvKiBNb2RpZnkgY2hhciogcG9ydF9zdHRbXSBpbiBiZmFsX3BvcnQuYyBpZiBhIG5ldyBzdGF0ZSB3YXMgYWRkZWQgKi8KK2VudW0gYmZhX3Bwb3J0X3N0YXRlcyB7CisJQkZBX1BQT1JUX1NUX1VOSU5JVCAJCT0gMSwKKwlCRkFfUFBPUlRfU1RfRU5BQkxJTkdfUVdBSVQgCT0gMiwKKwlCRkFfUFBPUlRfU1RfRU5BQkxJTkcgCQk9IDMsCisJQkZBX1BQT1JUX1NUX0xJTktET1dOIAkJPSA0LAorCUJGQV9QUE9SVF9TVF9MSU5LVVAgCQk9IDUsCisJQkZBX1BQT1JUX1NUX0RJU0FCTElOR19RV0FJVCAJPSA2LAorCUJGQV9QUE9SVF9TVF9ESVNBQkxJTkcJCT0gNywKKwlCRkFfUFBPUlRfU1RfRElTQUJMRUQgCQk9IDgsCisJQkZBX1BQT1JUX1NUX1NUT1BQRUQgCQk9IDksCisJQkZBX1BQT1JUX1NUX0lPQ0RPV04gCQk9IDEwLAorCUJGQV9QUE9SVF9TVF9JT0NESVMgCQk9IDExLAorCUJGQV9QUE9SVF9TVF9GV01JU01BVENICQk9IDEyLAorCUJGQV9QUE9SVF9TVF9NQVhfU1RBVEUsCit9OworCisvKioKKyAqIAlQb3J0IHNwZWVkIHNldHRpbmdzLiBFYWNoIHNwZWNpZmljIHNwZWVkIGlzIGEgYml0IGZpZWxkLiBVc2UgbXVsdGlwbGUKKyAqICAgICAgYml0cyB0byBzcGVjaWZ5IHNwZWVkcyB0byBiZSBzZWxlY3RlZCBmb3IgYXV0by1uZWdvdGlhdGlvbi4KKyAqLworZW51bSBiZmFfcHBvcnRfc3BlZWQgeworCUJGQV9QUE9SVF9TUEVFRF9VTktOT1dOID0gMCwKKwlCRkFfUFBPUlRfU1BFRURfMUdCUFMgCT0gMSwKKwlCRkFfUFBPUlRfU1BFRURfMkdCUFMgCT0gMiwKKwlCRkFfUFBPUlRfU1BFRURfNEdCUFMgCT0gNCwKKwlCRkFfUFBPUlRfU1BFRURfOEdCUFMgCT0gOCwKKwlCRkFfUFBPUlRfU1BFRURfMTBHQlBTIAk9IDEwLAorCUJGQV9QUE9SVF9TUEVFRF9BVVRPID0KKwkJKEJGQV9QUE9SVF9TUEVFRF8xR0JQUyB8IEJGQV9QUE9SVF9TUEVFRF8yR0JQUyB8CisJCSBCRkFfUFBPUlRfU1BFRURfNEdCUFMgfCBCRkFfUFBPUlRfU1BFRURfOEdCUFMpLAorfTsKKworLyoqCisgKiAJCVBvcnQgb3BlcmF0aW9uYWwgdHlwZSAoaW4gc3luYyB3aXRoIFNOSUEgcG9ydCB0eXBlKS4KKyAqLworZW51bSBiZmFfcHBvcnRfdHlwZSB7CisJQkZBX1BQT1JUX1RZUEVfVU5LTk9XTiA9IDEsCS8qICBwb3J0IHR5cGUgaXMgdW5rb3duICovCisJQkZBX1BQT1JUX1RZUEVfVFJVTktFRCA9IDIsCS8qICBUcnVua2VkIG1vZGUgKi8KKwlCRkFfUFBPUlRfVFlQRV9OUE9SVCAgID0gNSwJLyogIFAyUCB3aXRoIHN3aXRjaGVkIGZhYnJpYyAqLworCUJGQV9QUE9SVF9UWVBFX05MUE9SVCAgPSA2LAkvKiAgcHVibGljIGxvb3AgKi8KKwlCRkFfUFBPUlRfVFlQRV9MUE9SVCAgID0gMjAsCS8qICBwcml2YXRlIGxvb3AgKi8KKwlCRkFfUFBPUlRfVFlQRV9QMlAgICAgID0gMjEsCS8qICBQMlAgd2l0aCBubyBzd2l0Y2hlZCBmYWJyaWMgKi8KKwlCRkFfUFBPUlRfVFlQRV9WUE9SVCAgID0gMjIsCS8qICBOUElWIC0gdmlydHVhbCBwb3J0ICovCit9OworCisvKioKKyAqIAkJUG9ydCB0b3BvbG9neSBzZXR0aW5nLiBBIHBvcnQncyB0b3BvbG9neSBhbmQgZmFicmljIGxvZ2luIHN0YXR1cworICogCQlkZXRlcm1pbmUgaXRzIG9wZXJhdGlvbmFsIHR5cGUuCisgKi8KK2VudW0gYmZhX3Bwb3J0X3RvcG9sb2d5IHsKKwlCRkFfUFBPUlRfVE9QT0xPR1lfTk9ORSA9IDAsCS8qICBObyB2YWxpZCB0b3BvbG9neSAqLworCUJGQV9QUE9SVF9UT1BPTE9HWV9QMlAgID0gMSwJLyogIFAyUCBvbmx5ICovCisJQkZBX1BQT1JUX1RPUE9MT0dZX0xPT1AgPSAyLAkvKiAgTE9PUCB0b3BvbG9neSAqLworCUJGQV9QUE9SVF9UT1BPTE9HWV9BVVRPID0gMywJLyogIGF1dG8gdG9wb2xvZ3kgc2VsZWN0aW9uICovCit9OworCisvKioKKyAqIAkJUGh5c2ljYWwgcG9ydCBsb29wYmFjayB0eXBlcy4KKyAqLworZW51bSBiZmFfcHBvcnRfb3Btb2RlIHsKKwlCRkFfUFBPUlRfT1BNT0RFX05PUk1BTCAgID0gMHgwMCwgLyogIG5vcm1hbCBub24tbG9vcGJhY2sgbW9kZSAqLworCUJGQV9QUE9SVF9PUE1PREVfTEJfSU5UICAgPSAweDAxLCAvKiAgaW50ZXJuYWwgbG9vcCBiYWNrICovCisJQkZBX1BQT1JUX09QTU9ERV9MQl9TTFcgICA9IDB4MDIsIC8qICBzZXJpYWwgbGluayB3cmFwYmFjayAoc2VyZGVzKSAqLworCUJGQV9QUE9SVF9PUE1PREVfTEJfRVhUICAgPSAweDA0LCAvKiAgZXh0ZXJuYWwgbG9vcCBiYWNrIChzZXJkZXMpICovCisJQkZBX1BQT1JUX09QTU9ERV9MQl9DQkwgICA9IDB4MDgsIC8qICBjYWJsZWQgbG9vcCBiYWNrICovCisJQkZBX1BQT1JUX09QTU9ERV9MQl9OTElOVCA9IDB4MjAsIC8qICBOTF9Qb3J0IGludGVybmFsIGxvb3BiYWNrICovCit9OworCisjZGVmaW5lIEJGQV9QUE9SVF9PUE1PREVfTEJfSEFSRChfbW9kZSkJCQlcCisJKChfbW9kZSA9PSBCRkFfUFBPUlRfT1BNT0RFX0xCX0lOVCkgfHwJCVwKKyAgICAgKF9tb2RlID09IEJGQV9QUE9SVF9PUE1PREVfTEJfU0xXKSB8fAkJXAorICAgICAoX21vZGUgPT0gQkZBX1BQT1JUX09QTU9ERV9MQl9FWFQpKQorCisvKioKKwkJUG9ydCBTdGF0ZSAoaW4gc3luYyB3aXRoIFNOSUEgcG9ydCBzdGF0ZSkuCisgKi8KK2VudW0gYmZhX3Bwb3J0X3NuaWFfc3RhdGUgeworCUJGQV9QUE9SVF9TVEFURV9VTktOT1dOICA9IDEsCS8qICBwb3J0IGlzIG5vdCBpbml0aWFsaXplZCAqLworCUJGQV9QUE9SVF9TVEFURV9PTkxJTkUgICA9IDIsCS8qICBwb3J0IGlzIE9OTElORSAqLworCUJGQV9QUE9SVF9TVEFURV9ESVNBQkxFRCA9IDMsCS8qICBwb3J0IGlzIGRpc2FibGVkIGJ5IHVzZXIgKi8KKwlCRkFfUFBPUlRfU1RBVEVfQllQQVNTRUQgPSA0LAkvKiAgcG9ydCBpcyBieXBhc3NlZCAoaW4gTE9PUCkgKi8KKwlCRkFfUFBPUlRfU1RBVEVfRElBRyAgICAgPSA1LAkvKiAgcG9ydCBkaWFnbm9zdGljcyBpcyBhY3RpdmUgKi8KKwlCRkFfUFBPUlRfU1RBVEVfTElOS0RPV04gPSA2LAkvKiAgbGluayBpcyBkb3duICovCisJQkZBX1BQT1JUX1NUQVRFX0xPT1BCQUNLID0gOCwJLyogIHBvcnQgaXMgbG9vcGVkIGJhY2sgKi8KK307CisKKy8qKgorICogCQlQb3J0IGxpbmsgc3RhdGUKKyAqLworZW51bSBiZmFfcHBvcnRfbGlua3N0YXRlIHsKKwlCRkFfUFBPUlRfTElOS1VQIAkgPSAxLAkvKiAgUGh5c2ljYWwgcG9ydC9UcnVuayBsaW5rIHVwICovCisJQkZBX1BQT1JUX0xJTktET1dOIAkgPSAyLAkvKiAgUGh5c2ljYWwgcG9ydC9UcnVuayBsaW5rIGRvd24gKi8KKwlCRkFfUFBPUlRfVFJVTktfTElOS0RPV04gPSAzLAkvKiAgVHJ1bmsgbGluayBkb3duIChuZXcgdG1hc3RlcikgKi8KK307CisKKy8qKgorICogCQlQb3J0IGxpbmsgc3RhdGUgZXZlbnQKKyAqLworI2RlZmluZSBiZmFfcHBvcnRfZXZlbnRfdCBlbnVtIGJmYV9wcG9ydF9saW5rc3RhdGUKKworLyoqCisgKiAJCVBvcnQgbGluayBzdGF0ZSByZWFzb24gY29kZQorICovCitlbnVtIGJmYV9wcG9ydF9saW5rc3RhdGVfcnNuIHsKKwlCRkFfUFBPUlRfTElOS1NUQVRFX1JTTl9OT05FCQk9IDAsCisJQkZBX1BQT1JUX0xJTktTVEFURV9SU05fRElTQUJMRUQgCT0gMSwKKwlCRkFfUFBPUlRfTElOS1NUQVRFX1JTTl9SWF9OT1MgCQk9IDIsCisJQkZBX1BQT1JUX0xJTktTVEFURV9SU05fUlhfT0xTIAkJPSAzLAorCUJGQV9QUE9SVF9MSU5LU1RBVEVfUlNOX1JYX0xJUCAJCT0gNCwKKwlCRkFfUFBPUlRfTElOS1NUQVRFX1JTTl9SWF9MSVBGNyAJPSA1LAorCUJGQV9QUE9SVF9MSU5LU1RBVEVfUlNOX1NGUF9SRU1PVkVEIAk9IDYsCisJQkZBX1BQT1JUX0xJTktTVEFURV9SU05fUE9SVF9GQVVMVCAJPSA3LAorCUJGQV9QUE9SVF9MSU5LU1RBVEVfUlNOX1JYX0xPUyAJCT0gOCwKKwlCRkFfUFBPUlRfTElOS1NUQVRFX1JTTl9MT0NBTF9GQVVMVCAJPSA5LAorCUJGQV9QUE9SVF9MSU5LU1RBVEVfUlNOX1JFTU9URV9GQVVMVCAJPSAxMCwKKwlCRkFfUFBPUlRfTElOS1NUQVRFX1JTTl9USU1FT1VUIAk9IDExLAorCisKKworCS8qIENFRSByZWxhdGVkIHJlYXNvbiBjb2Rlcy9lcnJvcnMgKi8KKwlDRUVfTExEUF9JTkZPX0FHRURfT1VUICAgICAgID0gMjAsCisJQ0VFX0xMRFBfU0hVVERPV05fVExWX1JDVkQgICA9IDIxLAorCUNFRV9QRUVSX05PVF9BRFZFUlRJU0VfRENCWCAgPSAyMiwKKwlDRUVfUEVFUl9OT1RfQURWRVJUSVNFX1BHICAgID0gMjMsCisJQ0VFX1BFRVJfTk9UX0FEVkVSVElTRV9QRkMgICA9IDI0LAorCUNFRV9QRUVSX05PVF9BRFZFUlRJU0VfRkNPRSAgPSAyNSwKKwlDRUVfUEdfTk9UX0NPTVBBVElCTEUgICAgICAgID0gMjYsCisJQ0VFX1BGQ19OT1RfQ09NUEFUSUJMRSAgICAgICA9IDI3LAorCUNFRV9GQ09FX05PVF9DT01QQVRJQkxFICAgICAgPSAyOCwKKwlDRUVfQkFEX1BHX1JDVkQgICAgICAgICAgICAgID0gMjksCisJQ0VFX0JBRF9CV19SQ1ZEICAgICAgICAgICAgICA9IDMwLAorCUNFRV9CQURfUEZDX1JDVkQgICAgICAgICAgICAgPSAzMSwKKwlDRUVfQkFEX0ZDT0VfUFJJX1JDVkQgICAgICAgID0gMzIsCisJQ0VFX0ZDT0VfUFJJX1BGQ19PRkYgICAgICAgICA9IDMzLAorCUNFRV9EVVBfQ09OVFJPTF9UTFZfUkNWRCAgICAgPSAzNCwKKwlDRUVfRFVQX0ZFQVRfVExWX1JDVkQgICAgICAgID0gMzUsCisJQ0VFX0FQUExZX05FV19DRkcgICAgICAgICAgICA9IDM2LAkvKiByZWFzb24sIG5vdCBhbiBlcnJvciAqLworCUNFRV9QUk9UT0NPTF9JTklUICAgICAgICAgICAgPSAzNywgIC8qIHJlYXNvbiwgbm90IGFuIGVycm9yICovCisJQ0VFX1BIWV9MSU5LX0RPV04gICAgICAgICAgICA9IDM4LAorCUNFRV9MTFNfRkNPRV9BQlNFTlQgICAgICAgICAgPSAzOSwKKwlDRUVfTExTX0ZDT0VfRE9XTiAgICAgICAgICAgID0gNDAKK307CisKKy8qKgorICogICAgICBEZWZhdWx0IFRhcmdldCBSYXRlIExpbWl0aW5nIFNwZWVkLgorICovCisjZGVmaW5lIEJGQV9QUE9SVF9ERUZfVFJMX1NQRUVEICBCRkFfUFBPUlRfU1BFRURfMUdCUFMKKworLyoqCisgKiAgICAgIFBoeXNpY2FsIHBvcnQgY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3QgYmZhX3Bwb3J0X2NmZ19zIHsKKwl1OCAgICAgICAgIHRvcG9sb2d5OwkvKiAgYmZhX3Bwb3J0X3RvcG9sb2d5CQkqLworCXU4ICAgICAgICAgc3BlZWQ7CQkvKiAgZW51bSBiZmFfcHBvcnRfc3BlZWQJKi8KKwl1OCAgICAgICAgIHRydW5rZWQ7CS8qICB0cnVua2VkIG9yIG5vdAkJKi8KKwl1OCAgICAgICAgIHFvc19lbmFibGVkOwkvKiAgcW9zIGVuYWJsZWQgb3Igbm90CQkqLworCXU4ICAgICAgICAgdHJ1bmtfcG9ydHM7CS8qICBiaXRtYXAgb2YgdHJ1bmtlZCBwb3J0cwkqLworCXU4ICAgICAgICAgY2ZnX2hhcmRhbHBhOwkvKiAgaXMgaGFyZCBhbHBhIGNvbmZpZ3VyZWQJKi8KKwl1MTYgICAgICAgIG1heGZyc2l6ZTsJLyogIG1heGltdW0gZnJhbWUgc2l6ZQkJKi8KKwl1OCAgICAgICAgIGhhcmRhbHBhOwkvKiAgY29uZmlndXJlZCBoYXJkIGFscGEJKi8KKwl1OCAgICAgICAgIHJ4X2JiY3JlZGl0OwkvKiAgcmVjZWl2ZSBidWZmZXIgY3JlZGl0cwkqLworCXU4ICAgICAgICAgdHhfYmJjcmVkaXQ7CS8qICB0cmFuc21pdCBidWZmZXIgY3JlZGl0cwkqLworCXU4ICAgICAgICAgcmF0ZWxpbWl0OwkvKiAgcmF0ZWxpbWl0IGVuYWJsZWQgb3Igbm90CSovCisJdTggICAgICAgICB0cmxfZGVmX3NwZWVkOwkvKiAgcmF0ZWxpbWl0IGRlZmF1bHQgc3BlZWQJKi8KKwl1OAkJcnN2ZFszXTsKKwl1MTYgICAJcGF0aF90b3Y7CS8qICBkZXZpY2UgcGF0aCB0aW1lb3V0CSovCisJdTE2ICAgCXFfZGVwdGg7CS8qICBTQ1NJIFF1ZXVlIGRlcHRoCQkqLworfTsKKworLyoqCisgKiAJCVBvcnQgYXR0cmlidXRlIHZhbHVlcy4KKyAqLworc3RydWN0IGJmYV9wcG9ydF9hdHRyX3MgeworCS8qCisJICogU3RhdGljIGZpZWxkcworCSAqLworCXd3bl90ICAgICAgICAgICBud3duOwkJLyogIG5vZGUgd3duICovCisJd3duX3QgICAgICAgICAgIHB3d247CQkvKiAgcG9ydCB3d24gKi8KKwllbnVtIGZjX2NvcyAgICAgY29zX3N1cHBvcnRlZDsJLyogIHN1cHBvcnRlZCBjbGFzcyBvZiBzZXJ2aWNlcyAqLworCXUzMiAgICAgICAgcnN2ZDsKKwlzdHJ1Y3QgZmNfc3ltbmFtZV9zICAgIHBvcnRfc3ltbmFtZTsJLyogIHBvcnQgc3ltYm9saWMgbmFtZSAqLworCWVudW0gYmZhX3Bwb3J0X3NwZWVkIHNwZWVkX3N1cHBvcnRlZDsgLyogIHN1cHBvcnRlZCBzcGVlZHMgKi8KKwliZmFfYm9vbGVhbl90ICAgcGJpbmRfZW5hYmxlZDsJLyogIFdpbGwgYmUgc2V0IGlmIFBlcnNpc3RlbnQgYmluZGluZworCQkJCQkgKiAgIGVuYWJsZWQuIFJlbGV2YW50IG9ubHkgaW4gV2luZG93cworCQkJCQkgKi8KKworCS8qCisJICogQ29uZmlndXJlZCB2YWx1ZXMKKwkgKi8KKwlzdHJ1Y3QgYmZhX3Bwb3J0X2NmZ19zIHBwb3J0X2NmZzsJLyogIHBwb3J0IGNmZyAqLworCisJLyoKKwkgKiBEeW5hbWljIGZpZWxkIC0gaW5mbyBmcm9tIEJGQQorCSAqLworCWVudW0gYmZhX3Bwb3J0X3N0YXRlcyAJcG9ydF9zdGF0ZTsJLyogIGN1cnJlbnQgcG9ydCBzdGF0ZSAqLworCWVudW0gYmZhX3Bwb3J0X3NwZWVkIAlzcGVlZDsJCS8qICBjdXJyZW50IHNwZWVkICovCisJZW51bSBiZmFfcHBvcnRfdG9wb2xvZ3kgCXRvcG9sb2d5OwkvKiAgY3VycmVudCB0b3BvbG9neSAqLworCWJmYV9ib29sZWFuX3QJCWJlYWNvbjsJCS8qICBjdXJyZW50IGJlYWNvbiBzdGF0dXMgKi8KKwliZmFfYm9vbGVhbl90CQlsaW5rX2UyZV9iZWFjb247LyogIHNldCBpZiBsaW5rIGJlYWNvbiBvbiAqLworCWJmYV9ib29sZWFuX3QJCXBsb2dfZW5hYmxlZDsJLyogIHNldCBpZiBwb3J0bG9nIGlzIGVuYWJsZWQqLworCisJLyoKKwkgKiBEeW5hbWljIGZpZWxkIC0gaW5mbyBmcm9tIEZDUworCSAqLworCXUzMiAgICAgICAgCXBpZDsJCS8qICBwb3J0IElEICovCisJZW51bSBiZmFfcHBvcnRfdHlwZSAJcG9ydF90eXBlOwkvKiAgY3VycmVudCB0b3BvbG9neSAqLworCXUzMiAgICAgICAgCWxvb3BiYWNrOwkvKiAgZXh0ZXJuYWwgbG9vcGJhY2sgKi8KKwl1MzIJCXJzdmQxOworCXUzMgkJcnN2ZDI7CQkvKiAgcGFkZGluZyBmb3IgNjQgYml0ICovCit9OworCisvKioKKyAqIAkJRkMgUG9ydCBzdGF0aXN0aWNzLgorICovCitzdHJ1Y3QgYmZhX3Bwb3J0X2ZjX3N0YXRzX3MgeworCXU2NCAgICAgICAgc2Vjc19yZXNldDsJLyogIHNlY29uZHMgc2luY2Ugc3RhdHMgaXMgcmVzZXQgKi8KKwl1NjQgICAgICAgIHR4X2ZyYW1lczsJLyogIHRyYW5zbWl0dGVkIGZyYW1lcyAqLworCXU2NCAgICAgICAgdHhfd29yZHM7CS8qICB0cmFuc21pdHRlZCB3b3JkcyAqLworCXU2NCAgICAgICAgcnhfZnJhbWVzOwkvKiAgcmVjZWl2ZWQgZnJhbWVzICovCisJdTY0ICAgICAgICByeF93b3JkczsJLyogIHJlY2VpdmVkIHdvcmRzICovCisJdTY0ICAgICAgICBsaXBfY291bnQ7CS8qICBMSVBzIHNlZW4gKi8KKwl1NjQgICAgICAgIG5vc19jb3VudDsJLyogIE5PUyBjb3VudCAqLworCXU2NCAgICAgICAgZXJyb3JfZnJhbWVzOwkvKiAgZXJyb3JlZCBmcmFtZXMgKHNlbnQ/KSAqLworCXU2NCAgICAgICAgZHJvcHBlZF9mcmFtZXM7CS8qICBkcm9wcGVkIGZyYW1lcyAqLworCXU2NCAgICAgICAgbGlua19mYWlsdXJlczsJLyogIGxpbmsgZmFpbHVyZSBjb3VudCAqLworCXU2NCAgICAgICAgbG9zc19vZl9zeW5jczsJLyogIGxvc3Mgb2Ygc3luYyBjb3VudCAqLworCXU2NCAgICAgICAgbG9zc19vZl9zaWduYWxzOy8qICBsb3NzIG9mIHNpZ25hbCBjb3VudCAqLworCXU2NCAgICAgICAgcHJpbXNlcV9lcnJzOwkvKiAgcHJpbWl0aXZlIHNlcXVlbmNlIHByb3RvY29sICovCisJdTY0ICAgICAgICBiYWRfb3NfY291bnQ7CS8qICBpbnZhbGlkIG9yZGVyZWQgc2V0ICovCisJdTY0ICAgICAgICBlcnJfZW5jX291dDsJLyogIEVuY29kaW5nIGVycm9yIG91dHNpZGUgZnJhbWUgKi8KKwl1NjQgICAgICAgIGludmFsaWRfY3JjczsJLyogIGZyYW1lcyByZWNlaXZlZCB3aXRoIGludmFsaWQgQ1JDKi8KKwl1NjQJdW5kZXJzaXplZF9mcm07IC8qICB1bmRlcnNpemVkIGZyYW1lcyAqLworCXU2NAlvdmVyc2l6ZWRfZnJtOwkvKiAgb3ZlcnNpemVkIGZyYW1lcyAqLworCXU2NAliYWRfZW9mX2ZybTsJLyogIGZyYW1lcyB3aXRoIGJhZCBFT0YgKi8KKwlzdHJ1Y3QgYmZhX3Fvc19zdGF0c19zCXFvc19zdGF0czsJLyogIFFvUyBzdGF0aXN0aWNzICovCit9OworCisvKioKKyAqIAkJRXRoIFBvcnQgc3RhdGlzdGljcy4KKyAqLworc3RydWN0IGJmYV9wcG9ydF9ldGhfc3RhdHNfcyB7CisJdTY0CXNlY3NfcmVzZXQ7CS8qICBzZWNvbmRzIHNpbmNlIHN0YXRzIGlzIHJlc2V0ICovCisJdTY0CWZyYW1lXzY0OyAgICAgIC8qICBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0CWZyYW1lXzY1XzEyNzsgICAgICAvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0CWZyYW1lXzEyOF8yNTU7ICAgICAvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0CWZyYW1lXzI1Nl81MTE7ICAgICAvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0CWZyYW1lXzUxMl8xMDIzOyAgICAvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0CWZyYW1lXzEwMjRfMTUxODsgICAvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisJdTY0CWZyYW1lXzE1MTlfMTUyMjsgICAvKiBib3RoIHJ4IGFuZCB0eCBjb3VudGVyICovCisKKwl1NjQJdHhfYnl0ZXM7CisJdTY0CXR4X3BhY2tldHM7CisJdTY0CXR4X21jYXN0X3BhY2tldHM7CisJdTY0CXR4X2JjYXN0X3BhY2tldHM7CisJdTY0CXR4X2NvbnRyb2xfZnJhbWU7CisJdTY0CXR4X2Ryb3A7CisJdTY0CXR4X2phYmJlcjsKKwl1NjQJdHhfZmNzX2Vycm9yOworCXU2NAl0eF9mcmFnbWVudHM7CisKKwl1NjQJcnhfYnl0ZXM7CisJdTY0CXJ4X3BhY2tldHM7CisJdTY0CXJ4X21jYXN0X3BhY2tldHM7CisJdTY0CXJ4X2JjYXN0X3BhY2tldHM7CisJdTY0CXJ4X2NvbnRyb2xfZnJhbWVzOworCXU2NAlyeF91bmtub3duX29wY29kZTsKKwl1NjQJcnhfZHJvcDsKKwl1NjQJcnhfamFiYmVyOworCXU2NAlyeF9mY3NfZXJyb3I7CisJdTY0CXJ4X2FsaWdubWVudF9lcnJvcjsKKwl1NjQJcnhfZnJhbWVfbGVuZ3RoX2Vycm9yOworCXU2NAlyeF9jb2RlX2Vycm9yOworCXU2NAlyeF9mcmFnbWVudHM7CisKKwl1NjQJcnhfcGF1c2U7IC8qIEJQQyAqLworCXU2NAlyeF96ZXJvX3BhdXNlOyAvKiAgQlBDIFBhdXNlIGNhbmNlbGxhdGlvbiAqLworCXU2NAl0eF9wYXVzZTsgICAgICAvKiBCUEMgKi8KKwl1NjQJdHhfemVyb19wYXVzZTsgLyogIEJQQyBQYXVzZSBjYW5jZWxsYXRpb24gKi8KKwl1NjQJcnhfZmNvZV9wYXVzZTsgLyogQlBDICovCisJdTY0CXJ4X2Zjb2VfemVyb19wYXVzZTsgLyogIEJQQyBQYXVzZSBjYW5jZWxsYXRpb24gKi8KKwl1NjQJdHhfZmNvZV9wYXVzZTsgICAgICAvKiBCUEMgKi8KKwl1NjQJdHhfZmNvZV96ZXJvX3BhdXNlOyAvKiAgQlBDIFBhdXNlIGNhbmNlbGxhdGlvbiAqLworfTsKKworLyoqCisgKiAJCVBvcnQgc3RhdGlzdGljcy4KKyAqLwordW5pb24gYmZhX3Bwb3J0X3N0YXRzX3UgeworCXN0cnVjdCBiZmFfcHBvcnRfZmNfc3RhdHNfcwlmYzsKKwlzdHJ1Y3QgYmZhX3Bwb3J0X2V0aF9zdGF0c19zIAlldGg7Cit9OworCisvKioKKyAqICAgICAgICAgICAgICBQb3J0IEZDUCBtYXBwaW5ncy4KKyAqLworc3RydWN0IGJmYV9wcG9ydF9mY3BtYXBfcyB7CisJY2hhcgkJb3NkZXZuYW1lWzI1Nl07CisJdTMyCWJ1czsKKwl1MzIgICAgICAgIHRhcmdldDsKKwl1MzIgICAgICAgIG9zbHVuOworCXUzMiAgICAgICAgZmNpZDsKKwl3d25fdCAgICAgICAgICAgbnd3bjsKKwl3d25fdCAgICAgICAgICAgcHd3bjsKKwl1NjQgICAgICAgIGZjcGx1bjsKKwljaGFyCQlsdWlkWzI1Nl07Cit9OworCisvKioKKyAqICAgICAgICAgICAgICBQb3J0IFJOSUQgaW5mby4KKyAqLworc3RydWN0IGJmYV9wcG9ydF9ybmlkX3MgeworCXd3bl90ICAgICAgICAgICAgIHd3bjsKKwl1MzIgICAgICAgICAgdW5pdHR5cGU7CisJdTMyICAgICAgICAgIHBvcnRpZDsKKwl1MzIgICAgICAgICAgYXR0YWNoZWRfbm9kZXNfbnVtOworCXUxNiAgICAgICAgICBpcF92ZXJzaW9uOworCXUxNiAgICAgICAgICB1ZHBfcG9ydDsKKwl1OCAgICAgICAgICAgaXBhZGRyWzE2XTsKKwl1MTYgICAgICAgICAgcnN2ZDsKKwl1MTYgICAgICAgICAgdG9wb2xvZ3lkaXNjb3ZlcnlmbGFnczsKK307CisKKy8qKgorICogCQlMaW5rIHN0YXRlIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBiZmFfcHBvcnRfbGlua19zIHsKKwl1OCAgICAgICAgIGxpbmtzdGF0ZTsJLyogIExpbmsgc3RhdGUgYmZhX3Bwb3J0X2xpbmtzdGF0ZSAqLworCXU4ICAgICAgICAgbGlua3N0YXRlX3JzbjsJLyogIGJmYV9wcG9ydF9saW5rc3RhdGVfcnNuX3QgKi8KKwl1OCAgICAgICAgIHRvcG9sb2d5OwkvKiAgUDJQL0xPT1AgYmZhX3Bwb3J0X3RvcG9sb2d5ICovCisJdTggICAgICAgICBzcGVlZDsJCS8qICBMaW5rIHNwZWVkICgxLzIvNC84IEcpICovCisJdTMyICAgICAgICBsaW5rc3RhdGVfb3B0OwkvKiAgTGlua3N0YXRlIG9wdGlvbmFsIGRhdGEgKGRlYnVnKSAqLworCXU4ICAgICAgICAgdHJ1bmtlZDsJLyogIFRydW5rZWQgb3Igbm90ICgxIG9yIDApICovCisJdTggICAgICAgICByZXN2ZFszXTsKKwlzdHJ1Y3QgYmZhX3Fvc19hdHRyX3MgIHFvc19hdHRyOyAgIC8qIFFvUyBBdHRyaWJ1dGVzICovCisJc3RydWN0IGJmYV9xb3NfdmNfYXR0cl9zIHFvc192Y19hdHRyOyAgLyogIFZDIGluZm8gZnJvbSBFTFAgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCAgICAgICAgIHRtYXN0ZXI7LyogIFRydW5rIE1hc3RlciBvcgorCQkJCQkJICogICAgbm90ICgxIG9yIDApICovCisJCQl1OCAgICAgICAgIHRsaW5rczsJLyogIFRydW5rIGxpbmtzIGJpdG1hcAorCQkJCQkJICogICAgKGxpbmt1cCkgKi8KKwkJCXU4ICAgICAgICAgcmVzdjE7CS8qICBSZXNlcnZlZCAqLworCQl9IHRydW5rX2luZm87CisKKwkJc3RydWN0IHsKKwkJCXU4ICAgICAgICAgbXlhbHBhOwkgICAvKiAgYWxwYSBjbGFpbWVkICovCisJCQl1OCAgICAgICAgIGxvZ2luX3JlcTsgLyogIExvZ2luIHJlcXVpcmVkIG9yCisJCQkJCQkgICAgKiAgICBub3QgKDEgb3IgMCkgKi8KKwkJCXU4ICAgICAgICAgYWxwYWJtX3ZhbDsvKiAgYWxwYSBiaXRtYXAgdmFsaWQKKwkJCQkJCSAgICAqICAgIG9yIG5vdCAoMSBvciAwKSAqLworCQkJc3RydWN0IGZjX2FscGFibV9zICAgICBhbHBhYm07CSAgIC8qICBhbHBhIGJpdG1hcCAqLworCQl9IGxvb3BfaW5mbzsKKwl9IHRsOworfTsKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfUFBPUlRfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19xb3MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3Fvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZGJhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19xb3MuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19RT1NfSF9fCisjZGVmaW5lIF9fQkZBX0RFRlNfUU9TX0hfXworCisvKioKKyAqIFFvUyBzdGF0ZXMKKyAqLworZW51bSBiZmFfcW9zX3N0YXRlIHsKKwlCRkFfUU9TX09OTElORSA9IDEsCQkvKiAgUW9TIGlzIG9ubGluZSAqLworCUJGQV9RT1NfT0ZGTElORSA9IDIsCQkvKiAgUW9TIGlzIG9mZmxpbmUgKi8KK307CisKKworLyoqCisgKiBRb1MgIFByaW9yaXR5IGxldmVscy4KKyAqLworZW51bSBiZmFfcW9zX3ByaW9yaXR5IHsKKwlCRkFfUU9TX1VOS05PV04gPSAwLAorCUJGQV9RT1NfSElHSCAgPSAxLAkvKiAgUW9TIFByaW9yaXR5IExldmVsIEhpZ2ggKi8KKwlCRkFfUU9TX01FRCAgPSAgMiwJLyogIFFvUyBQcmlvcml0eSBMZXZlbCBNZWRpdW0gKi8KKwlCRkFfUU9TX0xPVyAgPSAgMywJLyogIFFvUyBQcmlvcml0eSBMZXZlbCBMb3cgKi8KK307CisKKworLyoqCisgKiBRb1MgIGJhbmR3aWR0aCBhbGxvY2F0aW9uIGZvciBlYWNoIHByaW9yaXR5IGxldmVsCisgKi8KK2VudW0gYmZhX3Fvc19id19hbGxvYyB7CisJQkZBX1FPU19CV19ISUdIICA9IDYwLAkvKiAgYmFuZHdpZHRoIGFsbG9jYXRpb24gZm9yIEhpZ2ggKi8KKwlCRkFfUU9TX0JXX01FRCAgPSAgMzAsCS8qICBiYW5kd2lkdGggYWxsb2NhdGlvbiBmb3IgTWVkaXVtICovCisJQkZBX1FPU19CV19MT1cgID0gIDEwLAkvKiAgYmFuZHdpZHRoIGFsbG9jYXRpb24gZm9yIExvdyAqLworfTsKKworLyoqCisgKiBRb1MgYXR0cmlidXRlIHJldHVybmVkIGluIFFvUyBRdWVyeQorICovCitzdHJ1Y3QgYmZhX3Fvc19hdHRyX3MgeworCWVudW0gYmZhX3Fvc19zdGF0ZSBzdGF0ZTsJCS8qICBRb1MgY3VycmVudCBzdGF0ZSAqLworCXUzMiAgdG90YWxfYmJfY3I7ICAJIAkvKiAgVG90YWwgQkIgQ3JlZGl0cyAqLworfTsKKworLyoqCisgKiBUaGVzZSBmaWVsZHMgc2hvdWxkIGJlIGRpc3BsYXllZCBvbmx5IGZyb20gdGhlIENMSS4KKyAqIFRoZXJlIHdpbGwgYmUgYSBzZXBhcmF0ZSBCRkFMIEFQSSAoZ2V0X3Fvc192Y19hdHRyID8pCisgKiB0byByZXRyaWV2ZSB0aGlzLgorICoKKyAqLworI2RlZmluZSAgQkZBX1FPU19NQVhfVkMgIDE2CisKK3N0cnVjdCBiZmFfcW9zX3ZjX2luZm9fcyB7CisJdTggdmNfY3JlZGl0OworCXU4IGJvcnJvd19jcmVkaXQ7CisJdTggcHJpb3JpdHk7CisJdTggcmVzdmQ7Cit9OworCitzdHJ1Y3QgYmZhX3Fvc192Y19hdHRyX3MgeworCXUxNiAgdG90YWxfdmNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKiAgVG90YWwgVkMgQ291bnQgKi8KKwl1MTYgIHNoYXJlZF9jcmVkaXQ7CisJdTMyICBlbHBfb3Btb2RlX2ZsYWdzOworCXN0cnVjdCBiZmFfcW9zX3ZjX2luZm9fcyB2Y19pbmZvW0JGQV9RT1NfTUFYX1ZDXTsgIC8qICAgYXMgbWFueSBhcworCQkJCQkJCSAgICAqIHRvdGFsX3ZjX2NvdW50ICovCit9OworCisvKioKKyAqIFFvUyBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBiZmFfcW9zX3N0YXRzX3MgeworCXUzMglmbG9naV9zZW50OyAJCS8qICBRb1MgRmxvZ2kgc2VudCAqLworCXUzMglmbG9naV9hY2NfcmVjdmQ7CS8qICBRb1MgRmxvZ2kgQWNjIHJlY2VpdmVkICovCisJdTMyCWZsb2dpX3JqdF9yZWN2ZDsgLyogIFFvUyBGbG9naSByZWplY3RzIHJlY2VpdmVkICovCisJdTMyCWZsb2dpX3JldHJpZXM7CQkvKiAgUW9TIEZsb2dpIHJldHJpZXMgKi8KKworCXUzMgllbHBfcmVjdmQ7IAkgICAJLyogIFFvUyBFTFAgcmVjZWl2ZWQgKi8KKwl1MzIJZWxwX2FjY2VwdGVkOyAgICAgICAvKiAgUW9TIEVMUCBBY2NlcHRlZCAqLworCXUzMgllbHBfcmVqZWN0ZWQ7ICAgICAgIC8qICBRb1MgRUxQIHJlamVjdGVkICovCisJdTMyCWVscF9kcm9wcGVkOyAgICAgICAgLyogIFFvUyBFTFAgZHJvcHBlZCAgKi8KKworCXUzMglxb3NfcnNjbl9yZWN2ZDsgICAgIC8qICBRb1MgUlNDTiByZWNlaXZlZCAqLworCXUzMglyc3ZkOyAJCS8qIHBhZGRpbmcgZm9yIDY0IGJpdCBhbGlnbm1lbnQgKi8KK307CisKKyNlbmRpZiAvKiBfX0JGQV9ERUZTX1FPU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3Jwb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19ycG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWY1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19ycG9ydC5oCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19SUE9SVF9IX18KKyNkZWZpbmUgX19CRkFfREVGU19SUE9SVF9IX18KKworI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKyNpbmNsdWRlIDxwcm90b2NvbC90eXBlcy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcHBvcnQuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BvcnQuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Fvcy5oPgorCisvKioKKyAqIEZDUyByZW1vdGUgcG9ydCBzdGF0ZXMKKyAqLworZW51bSBiZmFfcnBvcnRfc3RhdGUgeworCUJGQV9SUE9SVF9VTklOSVQgCT0gMCwJLyogIFBPUlQgaXMgbm90IHlldCBpbml0aWFsaXplZCAqLworCUJGQV9SUE9SVF9PRkZMSU5FIAk9IDEsCS8qICBycG9ydCBpcyBvZmZsaW5lICovCisJQkZBX1JQT1JUX1BMT0dJIAk9IDIsCS8qICBQTE9HSSB0byBycG9ydCBpcyBpbiBwcm9ncmVzcyAqLworCUJGQV9SUE9SVF9PTkxJTkUgCT0gMywJLyogIGxvZ2luIHRvIHJwb3J0IGlzIGNvbXBsZXRlICovCisJQkZBX1JQT1JUX1BMT0dJX1JFVFJZIAk9IDQsCS8qICByZXRyeWluZyBsb2dpbiB0byBycG9ydCAqLworCUJGQV9SUE9SVF9OU1FVRVJZIAk9IDUsCS8qICBuYW1lc2VydmVyIHF1ZXJ5ICovCisJQkZBX1JQT1JUX0FESVNDIAk9IDYsCS8qICBBRElTQyBhdXRoZW50aWNhdGlvbiAqLworCUJGQV9SUE9SVF9MT0dPIAkJPSA3LAkvKiAgbG9nZ2luZyBvdXQgd2l0aCBycG9ydCAqLworCUJGQV9SUE9SVF9MT0dPUkNWIAk9IDgsCS8qICBoYW5kbGluZyBMT0dPIGZyb20gcnBvcnQgKi8KKwlCRkFfUlBPUlRfTlNESVNDIAk9IDksCS8qICByZS1kaXNjb3ZlciBycG9ydCAqLworfTsKKworLyoqCisgKiAgUnBvcnQgU2NzaSBGdW5jdGlvbiA6IEluaXRpYXRvci9UYXJnZXQuCisgKi8KK2VudW0gYmZhX3Jwb3J0X2Z1bmN0aW9uIHsKKwlCRkFfUlBPUlRfSU5JVElBVE9SIAk9IDB4MDEsCS8qICBTQ1NJIEluaXRpYXRvcgkqLworCUJGQV9SUE9SVF9UQVJHRVQgCT0gMHgwMiwJLyogIFNDU0kgVGFyZ2V0CSovCit9OworCisvKioKKyAqIHBvcnQvbm9kZSBzeW1ib2xpYyBuYW1lcyBmb3IgcnBvcnQKKyAqLworI2RlZmluZSBCRkFfUlBPUlRfU1lNTkFNRV9NQVhMRU4JMjU1CitzdHJ1Y3QgYmZhX3Jwb3J0X3N5bW5hbWVfcyB7CisJY2hhciAgICAgICAgICAgIHN5bW5hbWVbQkZBX1JQT1JUX1NZTU5BTUVfTUFYTEVOXTsKK307CisKK3N0cnVjdCBiZmFfcnBvcnRfaGFsX3N0YXRzX3MgeworCXUzMiAgICAgICAgc21fdW5fY3I7CSAgICAvKiAgdW5pbml0OiBjcmVhdGUgZXZlbnRzICAgICAgKi8KKwl1MzIgICAgICAgIHNtX3VuX3VuZXhwOwkgICAgLyogIHVuaW5pdDogZXhjZXB0aW9uIGV2ZW50cyAgICovCisJdTMyICAgICAgICBzbV9jcl9vbjsJICAgIC8qICBjcmVhdGVkOiBvbmxpbmUgZXZlbnRzICAgICAqLworCXUzMiAgICAgICAgc21fY3JfZGVsOwkgICAgLyogIGNyZWF0ZWQ6IGRlbGV0ZSBldmVudHMgICAgICovCisJdTMyICAgICAgICBzbV9jcl9od2Y7CSAgICAvKiAgY3JlYXRlZDogSU9DIGRvd24gICAgICAgICAgKi8KKwl1MzIgICAgICAgIHNtX2NyX3VuZXhwOwkgICAgLyogIGNyZWF0ZWQ6IGV4Y2VwdGlvbiBldmVudHMgICovCisJdTMyICAgICAgICBzbV9md2NfcnNwOwkgICAgLyogIGZ3IGNyZWF0ZTogZi93IHJlc3BvbnNlcyAgICovCisJdTMyICAgICAgICBzbV9md2NfZGVsOwkgICAgLyogIGZ3IGNyZWF0ZTogZGVsZXRlIGV2ZW50cyAgICovCisJdTMyICAgICAgICBzbV9md2Nfb2ZmOwkgICAgLyogIGZ3IGNyZWF0ZTogb2ZmbGluZSBldmVudHMgICovCisJdTMyICAgICAgICBzbV9md2NfaHdmOwkgICAgLyogIGZ3IGNyZWF0ZTogSU9DIGRvd24gICAgICAgICovCisJdTMyICAgICAgICBzbV9md2NfdW5leHA7CSAgICAvKiAgZncgY3JlYXRlOiBleGNlcHRpb24gZXZlbnRzKi8KKwl1MzIgICAgICAgIHNtX29uX29mZjsJICAgIC8qICBvbmxpbmU6IG9mZmxpbmUgZXZlbnRzICAgICAqLworCXUzMiAgICAgICAgc21fb25fZGVsOwkgICAgLyogIG9ubGluZTogZGVsZXRlIGV2ZW50cyAgICAgICovCisJdTMyICAgICAgICBzbV9vbl9od2Y7CSAgICAvKiAgb25saW5lOiBJT0MgZG93biBldmVudHMgICAgKi8KKwl1MzIgICAgICAgIHNtX29uX3VuZXhwOwkgICAgLyogIG9ubGluZTogZXhjZXB0aW9uIGV2ZW50cyAgICovCisJdTMyICAgICAgICBzbV9md2RfcnNwOwkgICAgLyogIGZ3IGRlbGV0ZTogZncgcmVzcG9uc2VzICAgICovCisJdTMyICAgICAgICBzbV9md2RfZGVsOwkgICAgLyogIGZ3IGRlbGV0ZTogZGVsZXRlIGV2ZW50cyAgICovCisJdTMyICAgICAgICBzbV9md2RfaHdmOwkgICAgLyogIGZ3IGRlbGV0ZTogSU9DIGRvd24gZXZlbnRzICovCisJdTMyICAgICAgICBzbV9md2RfdW5leHA7CSAgICAvKiAgZncgZGVsZXRlOiBleGNlcHRpb24gZXZlbnRzKi8KKwl1MzIgICAgICAgIHNtX29mZl9kZWw7CSAgICAvKiAgb2ZmbGluZTogZGVsZXRlIGV2ZW50cyAgICAgKi8KKwl1MzIgICAgICAgIHNtX29mZl9vbjsJICAgIC8qICBvZmZsaW5lOiBvbmxpbmUgZXZlbnRzICAgICAqLworCXUzMiAgICAgICAgc21fb2ZmX2h3ZjsJICAgIC8qICBvZmZsaW5lOiBJT0MgZG93biBldmVudHMgICAqLworCXUzMiAgICAgICAgc21fb2ZmX3VuZXhwOwkgICAgLyogIG9mZmxpbmU6IGV4Y2VwdGlvbiBldmVudHMgICovCisJdTMyICAgICAgICBzbV9kZWxfZndyc3A7CSAgICAvKiAgZGVsZXRlOiBmdyByZXNwb25zZXMgICAgICAgKi8KKwl1MzIgICAgICAgIHNtX2RlbF9od2Y7CSAgICAvKiAgZGVsZXRlOiBJT0MgZG93biBldmVudHMgICAgKi8KKwl1MzIgICAgICAgIHNtX2RlbF91bmV4cDsJICAgIC8qICBkZWxldGU6IGV4Y2VwdGlvbiBldmVudHMgICAqLworCXUzMiAgICAgICAgc21fZGVscF9md3JzcDsJICAgIC8qICBkZWxldGUgcGVuZDogZncgcmVzcG9uc2VzICAqLworCXUzMiAgICAgICAgc21fZGVscF9od2Y7CSAgICAvKiAgZGVsZXRlIHBlbmQ6IElPQyBkb3ducyAgICAgKi8KKwl1MzIgICAgICAgIHNtX2RlbHBfdW5leHA7CSAgICAvKiAgZGVsZXRlIHBlbmQ6IGV4Y2VwdGlvbnMgICAgKi8KKwl1MzIgICAgICAgIHNtX29mZnBfZndyc3A7CSAgICAvKiAgb2ZmLXBlbmRpbmc6IGZ3IHJlc3BvbnNlcyAgKi8KKwl1MzIgICAgICAgIHNtX29mZnBfZGVsOwkgICAgLyogIG9mZi1wZW5kaW5nOiBkZWxldGVzICAgICAgICovCisJdTMyICAgICAgICBzbV9vZmZwX2h3ZjsJICAgIC8qICBvZmYtcGVuZGluZzogSU9DIGRvd25zICAgICAqLworCXUzMiAgICAgICAgc21fb2ZmcF91bmV4cDsJICAgIC8qICBvZmYtcGVuZGluZzogZXhjZXB0aW9ucyAgICAqLworCXUzMiAgICAgICAgc21faW9jZF9vZmY7CSAgICAvKiAgSU9DIGRvd246IG9mZmxpbmUgZXZlbnRzICAgKi8KKwl1MzIgICAgICAgIHNtX2lvY2RfZGVsOwkgICAgLyogIElPQyBkb3duOiBkZWxldGUgZXZlbnRzICAgICovCisJdTMyICAgICAgICBzbV9pb2NkX29uOwkgICAgLyogIElPQyBkb3duOiBvbmxpbmUgZXZlbnRzICAgICovCisJdTMyICAgICAgICBzbV9pb2NkX3VuZXhwOwkgICAgLyogIElPQyBkb3duOiBleGNlcHRpb25zICAgICAgICovCisJdTMyICAgICAgICByc3ZkOworfTsKKworLyoqCisgKiBGQ1MgcmVtb3RlIHBvcnQgc3RhdGlzdGljcworICovCitzdHJ1Y3QgYmZhX3Jwb3J0X3N0YXRzX3MgeworCXUzMiAgICAgICAgb2ZmbGluZXM7ICAgICAgICAgICAvKiAgcmVtb3RlIHBvcnQgb2ZmbGluZSBjb3VudCAgKi8KKwl1MzIgICAgICAgIG9ubGluZXM7ICAgICAgICAgICAgLyogIHJlbW90ZSBwb3J0IG9ubGluZSBjb3VudCAgICovCisJdTMyICAgICAgICByc2NuczsgICAgICAgICAgICAgIC8qICBSU0NOIGFmZmVjdGluZyBycG9ydCAgICAgICAqLworCXUzMiAgICAgICAgcGxvZ2lzOwkJICAgIC8qICBwbG9naXMgc2VudCAgICAgICAgICAgICAgICAqLworCXUzMiAgICAgICAgcGxvZ2lfYWNjczsJICAgIC8qICBwbG9naSBhY2NlcHRzICAgICAgICAgICAgICAqLworCXUzMiAgICAgICAgcGxvZ2lfdGltZW91dHM7CSAgICAvKiAgcGxvZ2kgdGltZW91dHMgICAgICAgICAgICAgKi8KKwl1MzIgICAgICAgIHBsb2dpX3JlamVjdHM7CSAgICAvKiAgcmN2ZCBwbG9naSByZWplY3RzICAgICAgICAgKi8KKwl1MzIgICAgICAgIHBsb2dpX2ZhaWxlZDsJICAgIC8qICBsb2NhbCBmYWlsdXJlICAgICAgICAgICAgICAqLworCXUzMiAgICAgICAgcGxvZ2lfcmN2ZDsJICAgIC8qICBwbG9naXMgcmN2ZCAgICAgICAgICAgICAgICAqLworCXUzMiAgICAgICAgcHJsaV9yY3ZkOyAgICAgICAgICAvKiAgaW5ib3VuZCBQUkxJcyAgICAgICAgICAgICAgKi8KKwl1MzIgICAgICAgIGFkaXNjX3JjdmQ7ICAgICAgICAgLyogIEFESVNDcyByZWNlaXZlZCAgICAgICAgICAgICovCisJdTMyICAgICAgICBhZGlzY19yZWplY3RzOyAgICAgIC8qICByZWN2ZCAgQURJU0MgcmVqZWN0cyAgICAgICAqLworCXUzMiAgICAgICAgYWRpc2Nfc2VudDsgICAgICAgICAvKiAgQURJU0MgcmVxdWVzdHMgc2VudCAgICAgICAgKi8KKwl1MzIgICAgICAgIGFkaXNjX2FjY3M7ICAgICAgICAgLyogIEFESVNDIGFjY2VwdGVkIGJ5IHJwb3J0ICAgICovCisJdTMyICAgICAgICBhZGlzY19mYWlsZWQ7ICAgICAgIC8qICBBRElTQyBmYWlsZWQgKG5vIHJlc3BvbnNlKSAqLworCXUzMiAgICAgICAgYWRpc2NfcmVqZWN0ZWQ7ICAgICAvKiAgQURJU0MgcmVqZWN0ZWQgYnkgdXMgICAgKi8KKwl1MzIgICAgICAgIGxvZ29zOyAgICAgICAgICAgICAgLyogIGxvZ29zIHNlbnQgICAgICAgICAgICAgICAgICovCisJdTMyICAgICAgICBsb2dvX2FjY3M7ICAgICAgICAgIC8qICBMT0dPIGFjY2VwdHMgZnJvbSBycG9ydCAgICAqLworCXUzMiAgICAgICAgbG9nb19mYWlsZWQ7ICAgICAgICAvKiAgTE9HTyBmYWlsdXJlcyAgICAgICAgICAgICAgKi8KKwl1MzIgICAgICAgIGxvZ29fcmVqZWN0ZWQ7ICAgICAgLyogIExPR08gcmVqZWN0cyBmcm9tIHJwb3J0ICAgICovCisJdTMyICAgICAgICBsb2dvX3JjdmQ7ICAgICAgICAgIC8qICBMT0dPIGZyb20gcmVtb3RlIHBvcnQgICAgICAqLworCisJdTMyICAgICAgICBycHNjX3JjdmQ7ICAgICAgICAgLyogIFJQU0MgcmVjZWl2ZWQgICAgICAgICAgICAqLworCXUzMiAgICAgICAgcnBzY19yZWplY3RzOyAgICAgIC8qICByZWN2ZCAgUlBTQyByZWplY3RzICAgICAgICovCisJdTMyICAgICAgICBycHNjX3NlbnQ7ICAgICAgICAgLyogIFJQU0MgcmVxdWVzdHMgc2VudCAgICAgICAgKi8KKwl1MzIgICAgICAgIHJwc2NfYWNjczsgICAgICAgICAvKiAgUlBTQyBhY2NlcHRlZCBieSBycG9ydCAgICAqLworCXUzMiAgICAgICAgcnBzY19mYWlsZWQ7ICAgICAgIC8qICBSUFNDIGZhaWxlZCAobm8gcmVzcG9uc2UpICovCisJdTMyICAgICAgICBycHNjX3JlamVjdGVkOyAgICAgLyogIFJQU0MgcmVqZWN0ZWQgYnkgdXMgICAgKi8KKworCXUzMiAgICAgICAgcnN2ZDsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X2hhbF9zdGF0c19zCWhhbF9zdGF0czsgIC8qICBCRkEgcnBvcnQgc3RhdHMgICAgKi8KK307CisKKy8qKgorICogIFJwb3J0J3MgUW9TIGF0dHJpYnV0ZXMKKyAqLworc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIHsKKwllbnVtIGJmYV9xb3NfcHJpb3JpdHkgcW9zX3ByaW9yaXR5OyAgLyogIHJwb3J0J3MgUW9TIHByaW9yaXR5ICAgKi8KKwl1MzIJICAgICAgIHFvc19mbG93X2lkOwkgIC8qICBRb1MgZmxvdyBJZAkgKi8KK307CisKKy8qKgorICogRkNTIHJlbW90ZSBwb3J0IGF0dHJpYnV0ZXMgcmV0dXJuZWQgaW4gcXVlcmllcworICovCitzdHJ1Y3QgYmZhX3Jwb3J0X2F0dHJfcyB7CisJd3duX3QgICAgICAgICAgIAlud3duOwkvKiAgbm9kZSB3d24gKi8KKwl3d25fdCAgICAgICAgICAgCXB3d247CS8qICBwb3J0IHd3biAqLworCWVudW0gZmNfY29zIGNvc19zdXBwb3J0ZWQ7CS8qICBzdXBwb3J0ZWQgY2xhc3Mgb2Ygc2VydmljZXMgKi8KKwl1MzIgICAgICAgIAlwaWQ7CS8qICBwb3J0IElEICovCisJdTMyICAgICAgICAJZGZfc3o7CS8qICBNYXggcGF5bG9hZCBzaXplICovCisJZW51bSBiZmFfcnBvcnRfc3RhdGUgCXN0YXRlOwkvKiAgUnBvcnQgU3RhdGUgbWFjaGluZSBzdGF0ZSAqLworCWVudW0gZmNfY29zICAgICAgICAJZmNfY29zOwkvKiAgRkMgY2xhc3NlcyBvZiBzZXJ2aWNlcyAqLworCWJmYV9ib29sZWFuX3QgICAJY2lzYzsJLyogIENJU0MgY2FwYWJsZSBkZXZpY2UgKi8KKwlzdHJ1Y3QgYmZhX3Jwb3J0X3N5bW5hbWVfcyBzeW1uYW1lOyAvKiAgU3ltYm9saWMgTmFtZSAqLworCWVudW0gYmZhX3Jwb3J0X2Z1bmN0aW9uCXNjc2lfZnVuY3Rpb247IC8qICBJbml0aWF0b3IvVGFyZ2V0ICovCisJc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIHFvc19hdHRyOyAvKiAgcW9zIGF0dHJpYnV0ZXMgICovCisJZW51bSBiZmFfcHBvcnRfc3BlZWQgY3Vycl9zcGVlZDsgICAvKiAgb3BlcmF0aW5nIHNwZWVkIGdvdCBmcm9tCisJCQkJCSAgICAqIFJQU0MgRUxTLiBVTktOT1dOLCBpZiBSUFNDCisJCQkJCSAgICAqIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwliZmFfYm9vbGVhbl90IAl0cmxfZW5mb3JjZWQ7CS8qICBUUkwgZW5mb3JjZWQgPyBUUlVFL0ZBTFNFICovCisJZW51bSBiZmFfcHBvcnRfc3BlZWQJYXNzaWduZWRfc3BlZWQ7CS8qIFNwZWVkIGFzc2lnbmVkIGJ5IHRoZSB1c2VyLgorCQkJCQkJICogd2lsbCBiZSB1c2VkIGlmIFJQU0MgaXMgbm90CisJCQkJCQkgKiBzdXBwb3J0ZWQgYnkgdGhlIHJwb3J0ICovCit9OworCisjZGVmaW5lIGJmYV9ycG9ydF9hZW5fcW9zX2RhdGFfdCBzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MKKworLyoqCisgKiBCRkEgcmVtb3RlIHBvcnQgZXZlbnRzCisgKiBBcmd1bWVudHMgYmVsb3cgYXJlIGluIEJGQUwgY29udGV4dCBmcm9tIE1nbXQKKyAqIEJGQV9SUE9SVF9BRU5fT05MSU5FOiAgICBbaW5dOiBscHd3bglbb3V0XTogdmZfaWQsIGxwd3duLCBycHd3bgorICogQkZBX1JQT1JUX0FFTl9PRkZMSU5FOiAgIFtpbl06IGxwd3duIFtvdXRdOiB2Zl9pZCwgbHB3d24sIHJwd3duCisgKiBCRkFfUlBPUlRfQUVOX0RJU0NPTk5FQ1Q6W2luXTogbHB3d24gW291dF06IHZmX2lkLCBscHd3biwgcnB3d24KKyAqIEJGQV9SUE9SVF9BRU5fUU9TX1BSSU86ICBbaW5dOiBscHd3biBbb3V0XTogdmZfaWQsIGxwd3duLCBycHd3biwgcHJpbworICogQkZBX1JQT1JUX0FFTl9RT1NfRkxPV0lEOltpbl06IGxwd3duIFtvdXRdOiB2Zl9pZCwgbHB3d24sIHJwd3duLCBmbG93X2lkCisgKi8KK2VudW0gYmZhX3Jwb3J0X2Flbl9ldmVudCB7CisJQkZBX1JQT1JUX0FFTl9PTkxJTkUgICAgICA9IDEsCS8qICBSUG9ydCBvbmxpbmUgZXZlbnQgKi8KKwlCRkFfUlBPUlRfQUVOX09GRkxJTkUgICAgID0gMiwJLyogIFJQb3J0IG9mZmxpbmUgZXZlbnQgKi8KKwlCRkFfUlBPUlRfQUVOX0RJU0NPTk5FQ1QgID0gMywJLyogIFJQb3J0IGRpc2Nvbm5lY3QgZXZlbnQgKi8KKwlCRkFfUlBPUlRfQUVOX1FPU19QUklPICAgID0gNCwJLyogIFFPUyBwcmlvcml0eSBjaGFuZ2UgZXZlbnQgKi8KKwlCRkFfUlBPUlRfQUVOX1FPU19GTE9XSUQgID0gNSwJLyogIFFPUyBmbG93IElkIGNoYW5nZSBldmVudCAqLworfTsKKworc3RydWN0IGJmYV9ycG9ydF9hZW5fZGF0YV9zIHsKKwl1MTYgICAgICAgIHZmX2lkOwkvKiAgdmZfaWQgb2YgdGhpcyBsb2dpY2FsIHBvcnQgKi8KKwl1MTYgICAgICAgIHJzdmRbM107CisJd3duX3QgICAgICAgICAgIHBwd3duOwkvKiAgV1dOIG9mIGl0cyBwaHlzaWNhbCBwb3J0ICovCisJd3duX3QgICAgICAgICAgIGxwd3duOwkvKiAgV1dOIG9mIHRoaXMgbG9naWNhbCBwb3J0ICovCisJd3duX3QgICAgICAgICAgIHJwd3duOwkvKiAgV1dOIG9mIHRoaXMgcmVtb3RlIHBvcnQgKi8KKwl1bmlvbiB7CisJCWJmYV9ycG9ydF9hZW5fcW9zX2RhdGFfdCBxb3M7CisJfSBwcml2OworfTsKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfUlBPUlRfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19zdGF0dXMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3N0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2VhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc19zdGF0dXMuaApAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0JGQV9ERUZTX1NUQVRVU19IX18KKyNkZWZpbmUgX19CRkFfREVGU19TVEFUVVNfSF9fCisKKy8qKgorICogQVBJIHN0YXR1cyByZXR1cm4gdmFsdWVzCisgKgorICogTk9URTogVGhlIGVycm9yIG1zZ3MgYXJlIGF1dG8gZ2VuZXJhdGVkIGZyb20gdGhlIGNvbW1lbnRzLiBPbmx5IHNpbmdlIGxpbmUKKyAqIGNvbW1lbnRzIGFyZSBzdXBwb3J0ZWQKKyAqLworZW51bSBiZmFfc3RhdHVzIHsKKwlCRkFfU1RBVFVTX09LIAkJPSAwLAkvKiAgU3VjY2VzcyAqLworCUJGQV9TVEFUVVNfRkFJTEVEIAk9IDEsCS8qICBPcGVyYXRpb24gZmFpbGVkICovCisJQkZBX1NUQVRVU19FSU5WQUwgCT0gMiwJLyogIEludmFsaWQgcGFyYW1zIENoZWNrIGlucHV0CisJCQkJCSAqIHBhcmFtZXRlcnMgKi8KKwlCRkFfU1RBVFVTX0VOT01FTSAJPSAzLAkvKiAgT3V0IG9mIHJlc291cmNlcyAqLworCUJGQV9TVEFUVVNfRU5PU1lTIAk9IDQsCS8qICBGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQgKi8KKwlCRkFfU1RBVFVTX0VUSU1FUiAJPSA1LAkvKiAgVGltZXIgZXhwaXJlZCAtIFJldHJ5LCBpZgorCQkJCQkgKiBwZXJzaXN0cywgY29udGFjdCBzdXBwb3J0ICovCisJQkZBX1NUQVRVU19FUFJPVE9DT0wgCT0gNiwJLyogIFByb3RvY29sIGVycm9yICovCisJQkZBX1NUQVRVU19FTk9GQ1BPUlRTIAk9IDcsCS8qICBObyBGQyBwb3J0cyByZXNvdXJjZXMgKi8KKwlCRkFfU1RBVFVTX05PRkxBU0ggCT0gOCwJLyogIEZsYXNoIG5vdCBwcmVzZW50ICovCisJQkZBX1NUQVRVU19CQURGTEFTSCAJPSA5LAkvKiAgRmxhc2ggaXMgY29ycnVwdGVkIG9yIGJhZCAqLworCUJGQV9TVEFUVVNfU0ZQX1VOU1VQUCAJPSAxMCwJLyogIFVuc3VwcG9ydGVkIFNGUCAtIFJlcGxhY2UgU0ZQICovCisJQkZBX1NUQVRVU19VTktOT1dOX1ZGSUQgPSAxMSwJLyogIFZGX0lEIG5vdCBmb3VuZCAqLworCUJGQV9TVEFUVVNfREFUQUNPUlJVUFRFRCA9IDEyLAkvKiAgRGlhZyByZXR1cm5lZCBkYXRhIGNvcnJ1cHRlZAorCQkJCQkgKiBjb250YWN0IHN1cHBvcnQgKi8KKwlCRkFfU1RBVFVTX0RFVkJVU1kgCT0gMTMsCS8qICBEZXZpY2UgYnVzeSAtIFJldHJ5IG9wZXJhdGlvbiAqLworCUJGQV9TVEFUVVNfQUJPUlRFRCAJPSAxNCwJLyogIE9wZXJhdGlvbiBhYm9ydGVkICovCisJQkZBX1NUQVRVU19OT0RFViAJPSAxNSwJLyogIERldiBpcyBub3QgcHJlc2VudCAqLworCUJGQV9TVEFUVVNfSERNQV9GQUlMRUQgCT0gMTYsCS8qICBIb3N0IGRtYSBmYWlsZWQgY29udGFjdCBzdXBwb3J0ICovCisJQkZBX1NUQVRVU19GTEFTSF9CQURfTEVOID0gMTcsCS8qICBGbGFzaCBiYWQgbGVuZ3RoICovCisJQkZBX1NUQVRVU19VTktOT1dOX0xXV04gPSAxOCwJLyogIExQT1JUIFBXV04gbm90IGZvdW5kICovCisJQkZBX1NUQVRVU19VTktOT1dOX1JXV04gPSAxOSwJLyogIFJQT1JUIFBXV04gbm90IGZvdW5kICovCisJQkZBX1NUQVRVU19GQ1BUX0xTX1JKVCAJPSAyMCwJLyogIEdvdCBMU19SSlQgZm9yIEZDIFBhc3MKKwkJCQkJICogdGhyb3VnaCBSZXEgKi8KKwlCRkFfU1RBVFVTX1ZQT1JUX0VYSVNUUyA9IDIxLAkvKiAgVlBPUlQgYWxyZWFkeSBleGlzdHMgKi8KKwlCRkFfU1RBVFVTX1ZQT1JUX01BWCAJPSAyMiwJLyogIFJlYWNoZWQgbWF4IFZQT1JUIHN1cHBvcnRlZAorCQkJCQkgKiBsaW1pdCAqLworCUJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEID0gMjMsCS8qICBJbnZhbGlkIFNwZWVkIENoZWNrIHNwZWVkCisJCQkJCSAqIHNldHRpbmcgKi8KKwlCRkFfU1RBVFVTX0lOVkxEX0RGU1ogCT0gMjQsCS8qICBJbnZhbGlkIE1heCBkYXRhIGZpZWxkIHNpemUgKi8KKwlCRkFfU1RBVFVTX0NORkdfRkFJTEVEIAk9IDI1LAkvKiAgU2V0dGluZyBjYW4gbm90IGJlIHBlcnNpc3RlZCAqLworCUJGQV9TVEFUVVNfQ01EX05PVFNVUFAgCT0gMjYsCS8qICBDb21tYW5kL0FQSSBub3Qgc3VwcG9ydGVkICovCisJQkZBX1NUQVRVU19OT19BREFQVEVSIAk9IDI3LAkvKiAgTm8gQnJvY2FkZSBBZGFwdGVyIEZvdW5kICovCisJQkZBX1NUQVRVU19MSU5LRE9XTiAJPSAyOCwJLyogIExpbmsgaXMgZG93biAtIENoZWNrIG9yIHJlcGxhY2UKKwkJCQkJICogU0ZQL2NhYmxlICovCisJQkZBX1NUQVRVU19GQUJSSUNfUkpUIAk9IDI5LAkvKiAgUmVqZWN0IGZyb20gYXR0YWNoZWQgZmFicmljICovCisJQkZBX1NUQVRVU19VTktOT1dOX1ZXV04gPSAzMCwJLyogIFZQT1JUIFBXV04gbm90IGZvdW5kICovCisJQkZBX1NUQVRVU19OU0xPR0lOX0ZBSUxFRCA9IDMxLAkvKiAgTmFtZXNlcnZlciBsb2dpbiBmYWlsZWQgKi8KKwlCRkFfU1RBVFVTX05PX1JQT1JUUyAJPSAzMiwJLyogIE5vIHJlbW90ZSBwb3J0cyBmb3VuZCAqLworCUJGQV9TVEFUVVNfTlNRVUVSWV9GQUlMRUQgPSAzMywJLyogIE5hbWVzZXJ2ZXIgcXVlcnkgZmFpbGVkICovCisJQkZBX1NUQVRVU19QT1JUX09GRkxJTkUgPSAzNCwJLyogIFBvcnQgaXMgbm90IG9ubGluZSAqLworCUJGQV9TVEFUVVNfUlBPUlRfT0ZGTElORSA9IDM1LAkvKiAgUlBPUlQgaXMgbm90IG9ubGluZSAqLworCUJGQV9TVEFUVVNfVEdUT1BFTl9GQUlMRUQgPSAzNiwJLyogIFJlbW90ZSBTQ1NJIHRhcmdldCBvcGVuIGZhaWxlZCAqLworCUJGQV9TVEFUVVNfQkFEX0xVTlMgCT0gMzcsCS8qICBObyB2YWxpZCBMVU5zIGZvdW5kICovCisJQkZBX1NUQVRVU19JT19GQUlMVVJFIAk9IDM4LAkvKiAgU0NTSSB0YXJnZXQgSU8gZmFpbHVyZSAqLworCUJGQV9TVEFUVVNfTk9fRkFCUklDIAk9IDM5LAkvKiAgTm8gc3dpdGNoZWQgZmFicmljIHByZXNlbnQgKi8KKwlCRkFfU1RBVFVTX0VCQURGIAk9IDQwLAkvKiAgQmFkIGZpbGUgZGVzY3JpcHRvciAqLworCUJGQV9TVEFUVVNfRUlOVFIgCT0gNDEsCS8qICBBIHNpZ25hbCB3YXMgY2F1Z2h0IGR1cmluZyBpb2N0bCAqLworCUJGQV9TVEFUVVNfRUlPIAkJPSA0MiwJLyogIEkvTyBlcnJvciAqLworCUJGQV9TVEFUVVNfRU5PVFRZIAk9IDQzLAkvKiAgSW5hcHByb3ByaWF0ZSBJL08gY29udHJvbAorCQkJCQkgKiBvcGVyYXRpb24gKi8KKwlCRkFfU1RBVFVTX0VOWElPIAk9IDQ0LAkvKiAgTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyAqLworCUJGQV9TVEFUVVNfRUZPUEVOIAk9IDQ1LAkvKiAgRmFpbGVkIHRvIG9wZW4gZmlsZSAqLworCUJGQV9TVEFUVVNfVlBPUlRfV1dOX0JQID0gNDYsCS8qICBXV04gaXMgc2FtZSBhcyBiYXNlIHBvcnQncyBXV04gKi8KKwlCRkFfU1RBVFVTX1BPUlRfTk9UX0RJU0FCTEVEID0gNDcsIC8qICBQb3J0IG5vdCBkaXNhYmxlZCBkaXNhYmxlIHBvcnQKKwkJCQkJICAgICogZmlyc3QgKi8KKwlCRkFfU1RBVFVTX0JBREZSTUhEUiAJPSA0OCwJLyogIEJhZCBmcmFtZSBoZWFkZXIgKi8KKwlCRkFfU1RBVFVTX0JBREZSTVNaIAk9IDQ5LAkvKiAgQmFkIGZyYW1lIHNpemUgY2hlY2sgYW5kIHJlcGxhY2UKKwkJCQkJICogU0ZQL2NhYmxlICovCisJQkZBX1NUQVRVU19NSVNTSU5HRlJNIAk9IDUwLAkvKiAgTWlzc2luZyBmcmFtZSBjaGVjayBhbmQgcmVwbGFjZQorCQkJCQkgKiBTRlAvY2FibGUgKi8KKwlCRkFfU1RBVFVTX0xJTktUSU1FT1VUIAk9IDUxLAkvKiAgTGluayB0aW1lb3V0IGNoZWNrIGFuZCByZXBsYWNlCisJCQkJCSAqIFNGUC9jYWJsZSAqLworCUJGQV9TVEFUVVNfTk9fRkNQSU1fTkVYVVMgPSA1MiwJLyogIE5vIEZDUCBOZXh1cyBleGlzdHMgd2l0aCB0aGUKKwkJCQkJICogcnBvcnQgKi8KKwlCRkFfU1RBVFVTX0NIRUNLU1VNX0ZBSUwgPSA1MywJLyogIGNoZWNrc3VtIGZhaWx1cmUgKi8KKwlCRkFfU1RBVFVTX0daTUVfRkFJTEVEIAk9IDU0LAkvKiAgR2V0IHpvbmUgbWVtYmVyIHF1ZXJ5IGZhaWxlZCAqLworCUJGQV9TVEFUVVNfU0NTSVNUQVJUX1JFUUQgPSA1NSwJLyogIFNDU0kgZGlzayByZXF1aXJlIFNUQVJUIGNvbW1hbmQgKi8KKwlCRkFfU1RBVFVTX0lPQ19GQUlMVVJFIAk9IDU2LAkvKiAgSU9DIGZhaWx1cmUgLSBSZXRyeSwgaWYgcGVyc2lzdHMKKwkJCQkJICogY29udGFjdCBzdXBwb3J0ICovCisJQkZBX1NUQVRVU19JTlZBTElEX1dXTiAJPSA1NywJLyogIEludmFsaWQgV1dOICovCisJQkZBX1NUQVRVU19NSVNNQVRDSCAJPSA1OCwJLyogIFZlcnNpb24gbWlzbWF0Y2ggKi8KKwlCRkFfU1RBVFVTX0lPQ19FTkFCTEVEIAk9IDU5LAkvKiAgSU9DIGlzIGFscmVhZHkgZW5hYmxlZCAqLworCUJGQV9TVEFUVVNfQURBUFRFUl9FTkFCTEVEID0gNjAsIC8qICBBZGFwdGVyIGlzIG5vdCBkaXNhYmxlZCBkaXNhYmxlCisJCQkJCSAgKiBhZGFwdGVyIGZpcnN0ICovCisJQkZBX1NUQVRVU19JT0NfTk9OX09QIAk9IDYxLAkvKiAgSU9DIGlzIG5vdCBvcGVyYXRpb25hbC4gRW5hYmxlIElPQworCQkJCQkgKiBhbmQgaWYgaXQgc3RpbGwgZmFpbHMsCisJCQkJCSAqIGNvbnRhY3Qgc3VwcG9ydCAqLworCUJGQV9TVEFUVVNfQUREUl9NQVBfRkFJTFVSRSA9IDYyLCAvKiAgUENJIGJhc2UgYWRkcmVzcyBub3QgbWFwcGVkCisJCQkJCSAgICogaW4gT1MgKi8KKwlCRkFfU1RBVFVTX1NBTUVfTkFNRSAJPSA2MywJLyogIE5hbWUgZXhpc3RzISB1c2UgYSBkaWZmZXJlbnQKKwkJCQkJICogbmFtZSAqLworCUJGQV9TVEFUVVNfUEVORElORyAgICAgID0gNjQsICAgLyogIEFQSSBjb21wbGV0ZXMgYXN5bmNocm9ub3VzbHkgKi8KKwlCRkFfU1RBVFVTXzhHX1NQRAk9IDY1LAkvKiAgU3BlZWQgc2V0dGluZyBub3QgdmFsaWQgZm9yCisJCQkJCSAqIDhHIEhCQSAqLworCUJGQV9TVEFUVVNfNEdfU1BECT0gNjYsCS8qICBTcGVlZCBzZXR0aW5nIG5vdCB2YWxpZCBmb3IKKwkJCQkJICogNEcgSEJBICovCisJQkZBX1NUQVRVU19BRF9JU19FTkFCTEUgPSA2NywJLyogIEFkYXB0ZXIgaXMgYWxyZWFkeSBlbmFibGVkICovCisJQkZBX1NUQVRVU19FSU5WQUxfVE9WIAk9IDY4LAkvKiAgSW52YWxpZCBwYXRoIGZhaWxvdmVyIFRPViAqLworCUJGQV9TVEFUVVNfRUlOVkFMX1FERVBUSCA9IDY5LAkvKiAgSW52YWxpZCBxdWV1ZSBkZXB0aCB2YWx1ZSAqLworCUJGQV9TVEFUVVNfVkVSU0lPTl9GQUlMID0gNzAsCS8qICBBcHBsaWNhdGlvbi9Ecml2ZXIgdmVyc2lvbgorCQkJCQkgKiBtaXNtYXRjaCAqLworCUJGQV9TVEFUVVNfRElBR19CVVNZICAgID0gNzEsCS8qICBkaWFnIGJ1c3kgKi8KKwlCRkFfU1RBVFVTX0JFQUNPTl9PTgk9IDcyLAkvKiAgUG9ydCBCZWFjb24gYWxyZWFkeSBvbiAqLworCUJGQV9TVEFUVVNfQkVBQ09OX09GRgk9IDczLAkvKiAgUG9ydCBCZWFjb24gYWxyZWFkeSBvZmYgKi8KKwlCRkFfU1RBVFVTX0xCRUFDT05fT04gICA9IDc0LAkvKiAgTGluayBFbmQtdG8tRW5kIEJlYWNvbiBhbHJlYWR5CisJCQkJCSAqIG9uICovCisJQkZBX1NUQVRVU19MQkVBQ09OX09GRgk9IDc1LAkvKiAgTGluayBFbmQtdG8tRW5kIEJlYWNvbiBhbHJlYWR5CisJCQkJCSAqIG9mZiAqLworCUJGQV9TVEFUVVNfUE9SVF9OT1RfSU5JVEVEID0gNzYsIC8qICBQb3J0IG5vdCBpbml0aWFsaXplZCAqLworCUJGQV9TVEFUVVNfUlBTQ19FTkFCTEVEID0gNzcsIC8qICBUYXJnZXQgaGFzIGEgdmFsaWQgc3BlZWQgKi8KKwlCRkFfU1RBVFVTX0VOT0ZTQVZFID0gNzgsCS8qICBObyBzYXZlZCBmaXJtd2FyZSB0cmFjZSAqLworCUJGQV9TVEFUVVNfQkFEX0ZJTEUgPSA3OSwJLyogIE5vdCBhIHZhbGlkIEJyb2NhZGUgQm9vdCBDb2RlCisJCQkJCSAqIGZpbGUgKi8KKwlCRkFfU1RBVFVTX1JMSU1fRU4gPSA4MCwJLyogIFRhcmdldCByYXRlIGxpbWl0aW5nIGlzIGFscmVhZHkKKwkJCQkJICogZW5hYmxlZCAqLworCUJGQV9TVEFUVVNfUkxJTV9ESVMgPSA4MSwgIC8qICBUYXJnZXQgcmF0ZSBsaW1pdGluZyBpcyBhbHJlYWR5CisJCQkJICAgICogZGlzYWJsZWQgKi8KKwlCRkFfU1RBVFVTX0lPQ19ESVNBQkxFRCA9IDgyLCAgIC8qICBJT0MgaXMgYWxyZWFkeSBkaXNhYmxlZCAqLworCUJGQV9TVEFUVVNfQURBUFRFUl9ESVNBQkxFRCA9IDgzLCAgIC8qICBBZGFwdGVyIGlzIGFscmVhZHkgZGlzYWJsZWQgKi8KKwlCRkFfU1RBVFVTX0JJT1NfRElTQUJMRUQgPSA4NCwgICAvKiAgQmlvcyBpcyBhbHJlYWR5IGRpc2FibGVkICovCisJQkZBX1NUQVRVU19BVVRIX0VOQUJMRUQgPSA4NSwgICAvKiAgQXV0aGVudGljYXRpb24gaXMgYWxyZWFkeQorCQkJCQkgKiBlbmFibGVkICovCisJQkZBX1NUQVRVU19BVVRIX0RJU0FCTEVEID0gODYsICAgLyogIEF1dGhlbnRpY2F0aW9uIGlzIGFscmVhZHkKKwkJCQkJICogZGlzYWJsZWQgKi8KKwlCRkFfU1RBVFVTX0VSUk9SX1RSTF9FTkFCTEVEID0gODcsICAgLyogIFRhcmdldCByYXRlIGxpbWl0aW5nIGlzCisJCQkJCSAgICAgICogZW5hYmxlZCAqLworCUJGQV9TVEFUVVNfRVJST1JfUU9TX0VOQUJMRUQgPSA4OCwgICAvKiAgUW9TIGlzIGVuYWJsZWQgKi8KKwlCRkFfU1RBVFVTX05PX1NGUF9ERVYgPSA4OSwgLyogIE5vIFNGUCBkZXZpY2UgY2hlY2sgb3IgcmVwbGFjZSBTRlAgKi8KKwlCRkFfU1RBVFVTX01FTVRFU1RfRkFJTEVEID0gOTAsCS8qICBNZW1vcnkgdGVzdCBmYWlsZWQgY29udGFjdAorCQkJCQkgKiBzdXBwb3J0ICovCisJQkZBX1NUQVRVU19JTlZBTElEX0RFVklEID0gOTEsCS8qICBJbnZhbGlkIGRldmljZSBpZCBwcm92aWRlZCAqLworCUJGQV9TVEFUVVNfUU9TX0VOQUJMRUQgPSA5MiwgLyogIFFPUyBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKwlCRkFfU1RBVFVTX1FPU19ESVNBQkxFRCA9IDkzLCAvKiAgUU9TIGlzIGFscmVhZHkgZGlzYWJsZWQgKi8KKwlCRkFfU1RBVFVTX0lOQ09SUkVDVF9EUlZfQ09ORklHID0gOTQsIC8qICBDaGVjayBjb25maWd1cmF0aW9uCisJCQkJCSAgICAgICAqIGtleS92YWx1ZSBwYWlyICovCisJQkZBX1NUQVRVU19SRUdfRkFJTCA9IDk1LCAvKiAgQ2FuJ3QgcmVhZCB3aW5kb3dzIHJlZ2lzdHJ5ICovCisJQkZBX1NUQVRVU19JTV9JTlZfQ09ERSA9IDk2LCAvKiAgSW52YWxpZCBJT0NUTCBjb2RlICovCisJQkZBX1NUQVRVU19JTV9JTlZfVkxBTiA9IDk3LCAvKiAgSW52YWxpZCBWTEFOIElEICovCisJQkZBX1NUQVRVU19JTV9JTlZfQURBUFRfTkFNRSA9IDk4LCAvKiAgSW52YWxpZCBhZGFwdGVyIG5hbWUgKi8KKwlCRkFfU1RBVFVTX0lNX0xPV19SRVNPVVJDRVMgPSA5OSwgLyogIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4KKwkJCQkJICAgKiBkcml2ZXIgKi8KKwlCRkFfU1RBVFVTX0lNX1ZMQU5JRF9JU19QVklEID0gMTAwLCAvKiAgR2l2ZW4gVkxBTiBpZCBzYW1lIGFzIFBWSUQgKi8KKwlCRkFfU1RBVFVTX0lNX1ZMQU5JRF9FWElTVFMgPSAxMDEsIC8qICBHaXZlbiBWTEFOIGlkIGFscmVhZHkgZXhpc3RzICovCisJQkZBX1NUQVRVU19JTV9GV19VUERBVEVfRkFJTCA9IDEwMiwgLyogIFVwZGF0aW5nIGZpcm13YXJlIHdpdGggbmV3CisJCQkJCSAgICAgKiBWTEFOIElEIGZhaWxlZCAqLworCUJGQV9TVEFUVVNfUE9SVExPR19FTkFCTEVEID0gMTAzLCAvKiAgUG9ydCBMb2cgaXMgYWxyZWFkeSBlbmFibGVkICovCisJQkZBX1NUQVRVU19QT1JUTE9HX0RJU0FCTEVEID0gMTA0LCAvKiAgUG9ydCBMb2cgaXMgYWxyZWFkeSBkaXNhYmxlZCAqLworCUJGQV9TVEFUVVNfRklMRV9OT1RfRk9VTkQgPSAxMDUsIC8qICBTcGVjaWZpZWQgZmlsZSBjb3VsZCBub3QgYmUKKwkJCQkJICAqIGZvdW5kICovCisJQkZBX1NUQVRVU19RT1NfRkNfT05MWSA9IDEwNiwgLyogIFFPUyBjYW4gYmUgZW5hYmxlZCBmb3IgRkMgbW9kZQorCQkJCSAgICAgICAqIG9ubHkgKi8KKwlCRkFfU1RBVFVTX1JMSU1fRkNfT05MWSA9IDEwNywgLyogIFJBVEVMSU0gY2FuIGJlIGVuYWJsZWQgZm9yIEZDIG1vZGUKKwkJCQkJKiBvbmx5ICovCisJQkZBX1NUQVRVU19DVF9TUEQgPSAxMDgsIC8qICBJbnZhbGlkIHNwZWVkIHNlbGVjdGlvbiBmb3IgQ2F0YXB1bHQuICovCisJQkZBX1NUQVRVU19MRURURVNUX09QID0gMTA5LCAvKiAgTEVEIHRlc3QgaXMgb3BlcmF0aW5nICovCisJQkZBX1NUQVRVU19DRUVfTk9UX0ROID0gMTEwLCAvKiAgZXRoIHBvcnQgaXMgbm90IGF0IGRvd24gc3RhdGUsIHBsZWFzZQorCQkJCSAgICAgICogYnJpbmcgZG93biBmaXJzdCAqLworCUJGQV9TVEFUVVNfMTBHX1NQRCA9IDExMSwgLyogIFNwZWVkIHNldHRpbmcgbm90IHZhbGlkIGZvciAxMEcgSEJBICovCisJQkZBX1NUQVRVU19JTV9JTlZfVEVBTV9OQU1FID0gMTEyLCAvKiAgSW52YWxpZCB0ZWFtIG5hbWUgKi8KKwlCRkFfU1RBVFVTX0lNX0RVUF9URUFNX05BTUUgPSAxMTMsIC8qICBHaXZlbiB0ZWFtIG5hbWUgYWxyZWFkeQorCQkJCQkgICAgKiBleGlzdHMgKi8KKwlCRkFfU1RBVFVTX0lNX0FEQVBUX0FMUkVBRFlfSU5fVEVBTSA9IDExNCwgLyogIEdpdmVuIGFkYXB0ZXIgaXMgcGFydAorCQkJCQkJICAgICogb2YgYW5vdGhlciB0ZWFtICovCisJQkZBX1NUQVRVU19JTV9BREFQVF9IQVNfVkxBTlMgPSAxMTUsIC8qICBBZGFwdGVyIGhhcyBWTEFOcyBjb25maWd1cmVkLgorCQkJCQkgICAgICAqIERlbGV0ZSBhbGwgVkxBTnMgYmVmb3JlCisJCQkJCSAgICAgICogY3JlYXRpbmcgdGVhbSAqLworCUJGQV9TVEFUVVNfSU1fUFZJRF9NSVNNQVRDSCA9IDExNiwgLyogIE1pc21hdGNoaW5nIFBWSURzIGNvbmZpZ3VyZWQKKwkJCQkJICAgICogZm9yIGFkYXB0ZXJzICovCisJQkZBX1NUQVRVU19JTV9MSU5LX1NQRUVEX01JU01BVENIID0gMTE3LCAvKiAgTWlzbWF0Y2hpbmcgbGluayBzcGVlZHMKKwkJCQkJCSAgKiBjb25maWd1cmVkIGZvciBhZGFwdGVycyAqLworCUJGQV9TVEFUVVNfSU1fTVRVX01JU01BVENIID0gMTE4LCAvKiAgTWlzbWF0Y2hpbmcgTVRVcyBjb25maWd1cmVkIGZvcgorCQkJCQkgICAqIGFkYXB0ZXJzICovCisJQkZBX1NUQVRVU19JTV9SU1NfTUlTTUFUQ0ggPSAxMTksIC8qICBNaXNtYXRjaGluZyBSU1MgcGFyYW1ldGVycworCQkJCQkgICAqIGNvbmZpZ3VyZWQgZm9yIGFkYXB0ZXJzICovCisJQkZBX1NUQVRVU19JTV9IRFNfTUlTTUFUQ0ggPSAxMjAsIC8qICBNaXNtYXRjaGluZyBIRFMgcGFyYW1ldGVycworCQkJCQkgICAqIGNvbmZpZ3VyZWQgZm9yIGFkYXB0ZXJzICovCisJQkZBX1NUQVRVU19JTV9PRkZMT0FEX01JU01BVENIID0gMTIxLCAvKiAgTWlzbWF0Y2hpbmcgb2ZmbG9hZAorCQkJCQkgICAgICAgKiBwYXJhbWV0ZXJzIGNvbmZpZ3VyZWQgZm9yCisJCQkJCSAgICAgICAqIGFkYXB0ZXJzICovCisJQkZBX1NUQVRVU19JTV9QT1JUX1BBUkFNUyA9IDEyMiwgLyogIEVycm9yIHNldHRpbmcgcG9ydCBwYXJhbWV0ZXJzICovCisJQkZBX1NUQVRVU19JTV9QT1JUX05PVF9JTl9URUFNID0gMTIzLCAvKiAgUG9ydCBpcyBub3QgcGFydCBvZiB0ZWFtICovCisJQkZBX1NUQVRVU19JTV9DQU5OT1RfUkVNX1BSSSA9IDEyNCwgLyogIFByaW1hcnkgYWRhcHRlciBjYW5ub3QgYmUKKwkJCQkJICAgICAqIHJlbW92ZWQuIENoYW5nZSBwcmltYXJ5IGJlZm9yZQorCQkJCQkgICAgICogcmVtb3ZpbmcgKi8KKwlCRkFfU1RBVFVTX0lNX01BWF9QT1JUU19SRUFDSEVEID0gMTI1LCAvKiAgRXhjZWVkaW5nIG1heGltdW0gcG9ydHMKKwkJCQkJCSogcGVyIHRlYW0gKi8KKwlCRkFfU1RBVFVTX0lNX0xBU1RfUE9SVF9ERUxFVEUgPSAxMjYsIC8qICBMYXN0IHBvcnQgaW4gdGVhbSBiZWluZworCQkJCQkgICAgICAgKiBkZWxldGVkICovCisJQkZBX1NUQVRVU19JTV9OT19EUklWRVIgPSAxMjcsIC8qICBJTSBkcml2ZXIgaXMgbm90IGluc3RhbGxlZCAqLworCUJGQV9TVEFUVVNfSU1fTUFYX1ZMQU5TX1JFQUNIRUQgPSAxMjgsIC8qICBFeGNlZWRpbmcgbWF4aW11bSBWTEFOcworCQkJCQkJKiBwZXIgcG9ydCAqLworCUJGQV9TVEFUVVNfVE9NQ0FUX1NQRF9OT1RfQUxMT1dFRCA9IDEyOSwgLyogQmlvcyBzcGVlZCBjb25maWcgbm90CisJCQkJCQkgICogYWxsb3dlZCBmb3IgQ05BICovCisJQkZBX1NUQVRVU19OT19NSU5QT1JUX0RSSVZFUiA9IDEzMCwgLyogIE1pbmlwb3J0IGRyaXZlciBpcyBub3QKKwkJCQkJICAgICAqIGxvYWRlZCAqLworCUJGQV9TVEFUVVNfQ0FSRF9UWVBFX01JU01BVENIID0gMTMxLCAvKiAgQ2FyZCB0eXBlIG1pc21hdGNoICovCisJQkZBX1NUQVRVU19CQURfQVNJQ0JMSyA9IDEzMiwgLyogIEJhZCBBU0lDIGJsb2NrICovCisJQkZBX1NUQVRVU19OT19EUklWRVIgPSAxMzMsIC8qICBTdG9yYWdlL0V0aGVybmV0IGRyaXZlciBub3QgbG9hZGVkICovCisJQkZBX1NUQVRVU19JTlZBTElEX01BQyA9IDEzNCwgLyogIEludmFsaWQgbWFjIGFkZHJlc3MgKi8KKwlCRkFfU1RBVFVTX0lNX05PX1ZMQU4gPSAxMzUsIC8qICBObyBWTEFOcyBjb25maWd1cmVkIG9uIHRoZSBhZGFwdGVyICovCisJQkZBX1NUQVRVU19JTV9FVEhfTEJfRkFJTEVEID0gMTM2LCAvKiAgRXRoZXJuZXQgbG9vcGJhY2sgdGVzdCBmYWlsZWQgKi8KKwlCRkFfU1RBVFVTX0lNX1BWSURfUkVNT1ZFID0gMTM3LCAvKiAgQ2Fubm90IHJlbW92ZSBwb3J0IHZsYW4gKFBWSUQpICovCisJQkZBX1NUQVRVU19JTV9QVklEX0VESVQgPSAxMzgsIC8qICBDYW5ub3QgZWRpdCBwb3J0IHZsYW4gKFBWSUQpICovCisJQkZBX1NUQVRVU19DTkFfTk9fQk9PVCA9IDEzOSwgLyogIEJvb3QgdXBsb2FkIG5vdCBhbGxvd2VkIGZvciBDTkEgKi8KKwlCRkFfU1RBVFVTX0lNX1BWSURfTk9OX1pFUk8gPSAxNDAsIC8qICBQb3J0IFZMQU4gSUQgKFBWSUQpIGlzIFNldCB0bworCQkJCQkgICAgKiBOb24tWmVybyBWYWx1ZSAqLworCUJGQV9TVEFUVVNfSU1fSU5FVENGR19MT0NLX0ZBSUxFRCA9IDE0MSwgLyogIEFjcXVpcmluZyBOZXR3b3JrCisJCQkJCQkgICogU3Vic3l0ZW0gTG9jayBGYWlsZWQuUGxlYXNlCisJCQkJCQkgICogdHJ5IGFmdGVyIHNvbWUgdGltZSAqLworCUJGQV9TVEFUVVNfSU1fR0VUX0lORVRDRkdfRkFJTEVEID0gMTQyLCAvKiAgQWNxdWlyaW5nIE5ldHdvcmsgU3Vic3l0ZW0KKwkJCQkJCSAqIGhhbmRsZSBGYWlsZWQuIFBsZWFzZSB0cnkKKwkJCQkJCSAqIGFmdGVyIHNvbWUgdGltZSAqLworCUJGQV9TVEFUVVNfSU1fTk9UX0JPVU5EID0gMTQzLCAvKiAgQnJvY2FkZSAxMEcgRXRoZXJuZXQgU2VydmljZSBpcyBub3QKKwkJCQkJKiBFbmFibGVkIG9uIHRoaXMgcG9ydCAqLworCUJGQV9TVEFUVVNfSU5TVUZGSUNJRU5UX1BFUk1TID0gMTQ0LCAvKiAgVXNlciBkb2Vzbid0IGhhdmUgc3VmZmljaWVudAorCQkJCQkgICAgICAqIHBlcm1pc3Npb25zIHRvIGV4ZWN1dGUgdGhlIEJDVQorCQkJCQkgICAgICAqIGFwcGxpY2F0aW9uICovCisJQkZBX1NUQVRVU19JTV9JTlZfVkxBTl9OQU1FID0gMTQ1LCAvKiAgSW52YWxpZC9SZXNlcnZlZCBWbGFuIG5hbWUKKwkJCQkJICAgICogc3RyaW5nLiBUaGUgbmFtZSBpcyBub3QgYWxsb3dlZAorCQkJCQkgICAgKiBmb3IgdGhlIG5vcm1hbCBWbGFucyAqLworCUJGQV9TVEFUVVNfQ01EX05PVFNVUFBfQ05BID0gMTQ2LCAvKiAgQ29tbWFuZCBub3Qgc3VwcG9ydGVkIGZvciBDTkEgKi8KKwlCRkFfU1RBVFVTX0lNX1BBU1NUSFJVX0VESVQgPSAxNDcsIC8qICBDYW4gbm90IGVkaXQgcGFzc3RocnUgdmxhbiBpZCAqLworCUJGQV9TVEFUVVNfSU1fQklORF9GQUlMRUQgPSAxNDgsIC8qISA8IElNIERyaXZlciBiaW5kIG9wZXJhdGlvbgorCQkJCQkgICogZmFpbGVkICovCisJQkZBX1NUQVRVU19JTV9VTkJJTkRfRkFJTEVEID0gMTQ5LCAvKiAhIDwgSU0gRHJpdmVyIHVuYmluZCBvcGVyYXRpb24KKwkJCQkJICAgICogZmFpbGVkICovCisJQkZBX1NUQVRVU19NQVhfVkFMCQkvKiAgVW5rbm93biBlcnJvciBjb2RlICovCit9OworI2RlZmluZSBiZmFfc3RhdHVzX3QgZW51bSBiZmFfc3RhdHVzCisKK2VudW0gYmZhX2Vwcm90b19zdGF0dXMgeworCUJGQV9FUFJPVE9fQkFEX0FDQ0VQVCA9IDAsCisJQkZBX0VQUk9UT19VTktOT1dOX1JTUCA9IDEKK307CisjZGVmaW5lIGJmYV9lcHJvdG9fc3RhdHVzX3QgZW51bSBiZmFfZXByb3RvX3N0YXR1cworCisjZW5kaWYgLyogX19CRkFfREVGU19TVEFUVVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc190aW4uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3Rpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNWEyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc190aW4uaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0RFRlNfVElOX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX1RJTl9IX18KKworI2luY2x1ZGUgPHByb3RvY29sL3R5cGVzLmg+CisjaW5jbHVkZSA8cHJvdG9jb2wvZmMuaD4KKworLyoqCisgKiBGQ1MgdGluIHN0YXRlcworICovCitlbnVtIGJmYV90aW5fc3RhdGVfZSB7CisJQkZBX1RJTl9TTV9PRkZMSU5FID0gMCwJCS8qICB0aW4gaXMgb2ZmbGluZSAqLworCUJGQV9USU5fU01fV09TX0xPR0lOID0gMSwJLyogIFdhaXRpbmcgUFJMSSBBQ0MvUkpUIGZyb20gVUxQICovCisJQkZBX1RJTl9TTV9XRldfT05MSU5FID0gMiwJLyogIFdhaXRpbmcgQUNLIHRvIFBSTEkgQUNDIGZyb20gRlcgKi8KKwlCRkFfVElOX1NNX09OTElORSA9IDMsCQkvKiAgdGluIGxvZ2luIGlzIGNvbXBsZXRlICovCisJQkZBX1RJTl9TTV9XSU9fUkVMT0dJTiA9IDQsCS8qICB0aW4gcmVsb2dpbiBpcyBpbiBwcm9ncmVzcyAqLworCUJGQV9USU5fU01fV0lPX0xPR09VVCA9IDUsCS8qICBQcm9jZXNzaW5nIG9mIFBSTE8gcmVxIGZyb20KKwkJCQkJICogICBJbml0aWF0b3IgaXMgaW4gcHJvZ3Jlc3MKKwkJCQkJICovCisJQkZBX1RJTl9TTV9XT1NfTE9HT1VUID0gNiwJLyogIFByb2Nlc3Npbmcgb2YgUFJMTyByZXEgZnJvbQorCQkJCQkgKiAgIEluaXRpYXRvciBpcyBpbiBwcm9ncmVzcworCQkJCQkgKi8KKwlCRkFfVElOX1NNX1dJT19DTEVBTiA9IDcsCS8qICBXYWl0aW5nIGZvciBJTyBjbGVhbnVwIGJlZm9yZSB0aW4KKwkJCQkJICogICBpcyBvZmZsaW5lLiBUaGlzIGNhbiBiZSB0cmlnZ2VyZWQKKwkJCQkJICogICBieSBSUE9SVCBMT0dPIChyY3ZkL3NlbnQpIG9yIGJ5CisJCQkJCSAqICAgUFJMTyAocmN2ZC9zZW50KQorCQkJCQkgKi8KK307CisKK3N0cnVjdCBiZmFfcHJsaV9yZXFfcyB7CisJc3RydWN0IGZjaHNfcyBmY2hzOworCXN0cnVjdCBmY19wcmxpX3MgcHJsaV9wYXlsb2FkOworfTsKKworc3RydWN0IGJmYV9wcmxvX3JlcV9zIHsKKwlzdHJ1Y3QgZmNoc19zIGZjaHM7CisJc3RydWN0IGZjX3BybG9fcyBwcmxvX3BheWxvYWQ7Cit9OworCit2b2lkIGJmYV90aW5fc2VuZF9sb2dpbl9yc3Aodm9pZCAqYmZhX3RpbiwgdTMyIGxvZ2luX3JzcCwKKwkJCQlzdHJ1Y3QgZmNfbHNfcmp0X3Mgcmp0X3BheWxvYWQpOwordm9pZCBiZmFfdGluX3NlbmRfbG9nb3V0X3JzcCh2b2lkICpiZmFfdGluLCB1MzIgbG9nb3V0X3JzcCwKKwkJCQlzdHJ1Y3QgZmNfbHNfcmp0X3Mgcmp0X3BheWxvYWQpOworLyoqCisgKiBGQ1MgdGFyZ2V0IHBvcnQgc3RhdGlzdGljcworICovCitzdHJ1Y3QgYmZhX3Rpbl9zdGF0c19zIHsKKwl1MzIgb25saW5lczsJLyogIElUTiBuZXh1cyBvbmxpbmVzIChQUkxJIGRvbmUpICovCisJdTMyIG9mZmxpbmVzOwkvKiAgSVROIE5leHVzIG9mZmxpbmVzIAkqLworCXUzMiBwcmxpX3JlcV9wYXJzZV9lcnI7CS8qICBwcmxpIHJlcSBwYXJzaW5nIGVycm9ycyAqLworCXUzMiBwcmxpX3JzcF9yanQ7CS8qICBudW0gcHJsaSByc3AgcmVqZWN0cyBzZW50ICovCisJdTMyIHBybGlfcnNwX2FjYzsJLyogIG51bSBwcmxpIHJzcCBhY2NlcHRzIHNlbnQgKi8KKwl1MzIgY2xlYW51cF9jb21wczsJLyogIElUTiBjbGVhbnVwIGNvbXBsZXRpb25zICovCit9OworCisvKioKKyAqIEZDUyB0aW4gYXR0cmlidXRlcyByZXR1cm5lZCBpbiBxdWVyaWVzCisgKi8KK3N0cnVjdCBiZmFfdGluX2F0dHJfcyB7CisJZW51bSBiZmFfdGluX3N0YXRlX2Ugc3RhdGU7CisJdTgJc2VxX3JldHJ5OyAgICAvKiAgU2VxdWVuY2UgcmV0cnkgc3VwcG9ydGVkICAgICAgKi8KKwl1OAlyc3ZkWzNdOworfTsKKworLyoqCisgKiBCRkEgVElOIGFzeW5jIGV2ZW50IGRhdGEgc3RydWN0dXJlIGZvciBCRkFMCisgKi8KK2VudW0gYmZhX3Rpbl9hZW5fZXZlbnQgeworCUJGQV9USU5fQUVOX09OTElORSAJPSAxLAkvKiAgVGFyZ2V0IG9ubGluZSAqLworCUJGQV9USU5fQUVOX09GRkxJTkUgCT0gMiwJLyogIFRhcmdldCBvZmZsaW5lICovCisJQkZBX1RJTl9BRU5fRElTQ09OTkVDVAk9IDMsCS8qICBUYXJnZXQgZGlzY29ubmVjdGVkICovCit9OworCisvKioKKyAqIEJGQSBUSU4gZXZlbnQgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBiZmFfdGluX2Flbl9kYXRhX3MgeworCXUxNiB2Zl9pZDsJLyogIHZmX2lkIG9mIHRoZSBJVCBuZXh1cyAqLworCXUxNiByc3ZkWzNdOworCXd3bl90IGxwd3duOwkvKiAgV1dOIG9mIGxvZ2ljYWwgcG9ydCAqLworCXd3bl90IHJwd3duOwkvKiAgV1dOIG9mIHJlbW90ZSh0YXJnZXQpIHBvcnQgKi8KK307CisKKy8qKgorICogQmVsb3cgQVBJcyBhcmUgbmVlZGVkIGZyb20gQkZBIGRyaXZlcgorICogTW92ZSB0aGVzZSB0byBCRkEgZHJpdmVyIHB1YmxpYyBoZWFkZXIgZmlsZT8KKyAqLworLyogIFRJTiByY3ZkIG5ldyBQUkxJICYgZ2V0cyBiZmFkX3Rpbl90IHB0ciBmcm9tIGRyaXZlciB0aGlzIGNhbGxiYWNrICovCit2b2lkICpiZmFkX3Rpbl9yY3ZkX2xvZ2luX3JlcSh2b2lkICpiZmFkX3RtX3BvcnQsIHZvaWQgKmJmYV90aW4sCisJCQkJd3duX3QgcnBfd3duLCB1MzIgcnBfZmNpZCwKKwkJCQlzdHJ1Y3QgYmZhX3BybGlfcmVxX3MgcHJsaV9yZXEpOworLyogIFRJTiByY3ZkIG5ldyBQUkxPICovCit2b2lkIGJmYWRfdGluX3JjdmRfbG9nb3V0X3JlcSh2b2lkICpiZmFkX3Rpbiwgd3duX3QgcnBfd3duLCB1MzIgcnBfZmNpZCwKKwkJCQlzdHJ1Y3QgYmZhX3BybG9fcmVxX3MgcHJsb19yZXEpOworLyogIFRJTiBpcyBvbmxpbmUgYW5kIHJlYWR5IGZvciBJTyAqLwordm9pZCBiZmFkX3Rpbl9vbmxpbmUodm9pZCAqYmZhZF90aW4pOworLyogIFRJTiBpcyBvZmZsaW5lIGFuZCBCRkEgZHJpdmVyIGNhbiBzaHV0ZG93biBpdHMgdXBwZXIgc3RhY2sgKi8KK3ZvaWQgYmZhZF90aW5fb2ZmbGluZSh2b2lkICpiZmFkX3Rpbik7CisvKiAgVElOIGRvZXMgbm90IG5lZWQgdGhpcyBCRkEgZHJpdmVyIHRpbiB0YWcgYW55bW9yZSwgc28gY2FuIGJlIGZyZWVkICovCit2b2lkIGJmYWRfdGluX3Jlc19mcmVlKHZvaWQgKmJmYWRfdGluKTsKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfVElOX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfdHNlbnNvci5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfdHNlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODgxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc190c2Vuc29yLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0RFRlNfVFNFTlNPUl9IX18KKyNkZWZpbmUgX19CRkFfREVGU19UU0VOU09SX0hfXworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfdHlwZXMuaD4KKworLyoqCisgKiBUZW1wZXJhdHVyZSBzZW5zb3Igc3RhdHVzIHZhbHVlcworICovCitlbnVtIGJmYV90c2Vuc29yX3N0YXR1cyB7CisJQkZBX1RTRU5TT1JfU1RBVFVTX1VOS05PV04gICA9IDEsICAgLyogIHVua293biBzdGF0dXMgKi8KKwlCRkFfVFNFTlNPUl9TVEFUVVNfRkFVTFRZICAgID0gMiwgICAvKiAgc2Vuc29yIGlzIGZhdWx0eSAqLworCUJGQV9UU0VOU09SX1NUQVRVU19CRUxPV19NSU4gPSAzLCAgIC8qICB0ZW1wZXJhdHVyZSBiZWxvdyBtaW5pbnVtICovCisJQkZBX1RTRU5TT1JfU1RBVFVTX05PTUlOQUwgICA9IDQsICAgLyogIG5vcm1hbCB0ZW1wZXJhdHVyZSAqLworCUJGQV9UU0VOU09SX1NUQVRVU19BQk9WRV9NQVggPSA1LCAgIC8qICB0ZW1wZXJhdHVyZSBhYm92ZSBtYXhpbXVtICovCit9OworCisvKioKKyAqIFRlbXBlcmF0dXJlIHNlbnNvciBhdHRyaWJ1dGUKKyAqLworc3RydWN0IGJmYV90c2Vuc29yX2F0dHJfcyB7CisJZW51bSBiZmFfdHNlbnNvcl9zdGF0dXMgc3RhdHVzOwkvKiAgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YXR1cyAqLworCXUzMiAgICAgICAgCXZhbHVlOwkvKiAgY3VycmVudCB0ZW1wZXJhdHVyZSBpbiBjZWxzaXVzICovCit9OworCisjZW5kaWYgLyogX19CRkFfREVGU19UU0VOU09SX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfdHlwZXMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0ODMzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3R5cGVzLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0JGQV9ERUZTX1RZUEVTX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX1RZUEVTX0hfXworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorCitlbnVtIGJmYV9ib29sZWFuIHsKKwlCRkFfRkFMU0UgPSAwLAorCUJGQV9UUlVFICA9IDEKK307CisjZGVmaW5lIGJmYV9ib29sZWFuX3QgZW51bSBiZmFfYm9vbGVhbgorCisjZGVmaW5lIEJGQV9TVFJJTkdfMzIJMzIKKworI2VuZGlmIC8qIF9fQkZBX0RFRlNfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc192ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc192ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5MDJhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3ZlcnNpb24uaApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQkZBX0RFRlNfVkVSU0lPTl9IX18KKyNkZWZpbmUgX19CRkFfREVGU19WRVJTSU9OX0hfXworCisjZGVmaW5lIEJGQV9WRVJTSU9OX0xFTgkJNjQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc192Zi5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfdmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjM1YmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2RlZnMvYmZhX2RlZnNfdmYuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfREVGU19WRl9IX18KKyNkZWZpbmUgX19CRkFfREVGU19WRl9IX18KKworI2luY2x1ZGUgPGJmYV9vc19pbmMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BvcnQuaD4KKyNpbmNsdWRlIDxwcm90b2NvbC90eXBlcy5oPgorCisvKioKKyAqIFZGIHN0YXRlcworICovCitlbnVtIGJmYV92Zl9zdGF0ZSB7CisJQkZBX1ZGX1VOSU5JVCAgICA9IDAsCS8qICBmYWJyaWMgaXMgbm90IHlldCBpbml0aWFsaXplZCAqLworCUJGQV9WRl9MSU5LX0RPV04gPSAxLAkvKiAgbGluayBpcyBkb3duICovCisJQkZBX1ZGX0ZMT0dJICAgICA9IDIsCS8qICBmbG9naSBpcyBpbiBwcm9ncmVzcyAqLworCUJGQV9WRl9BVVRIICAgICAgPSAzLAkvKiAgYXV0aGVudGljYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwlCRkFfVkZfTk9GQUJSSUMgID0gNCwJLyogIGZhYnJpYyBpcyBub3QgcHJlc2VudCAqLworCUJGQV9WRl9PTkxJTkUgICAgPSA1LAkvKiAgbG9naW4gdG8gZmFicmljIGlzIGNvbXBsZXRlICovCisJQkZBX1ZGX0VWRlAgICAgICA9IDYsCS8qICBFVkZQIGlzIGluIHByb2dyZXNzICovCisJQkZBX1ZGX0lTT0xBVEVEICA9IDcsCS8qICBwb3J0IGlzb2xhdGVkIGR1ZSB0byB2Zl9pZCBtaXNtYXRjaCAqLworfTsKKworLyoqCisgKiBWRiBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBiZmFfdmZfc3RhdHNfcyB7CisJdTMyICAgICAgICBmbG9naV9zZW50OwkvKiAgTnVtIEZMT0dJcyBzZW50IAkJKi8KKwl1MzIgICAgICAgIGZsb2dpX3JzcF9lcnI7CS8qICBGTE9HSSByZXNwb25zZSBlcnJvcnMgCSovCisJdTMyICAgICAgICBmbG9naV9hY2NfZXJyOwkvKiAgRkxPR0kgYWNjZXB0IGVycm9ycyAJKi8KKwl1MzIgICAgICAgIGZsb2dpX2FjY2VwdHM7CS8qICBGTE9HSSBhY2NlcHRzIHJlY2VpdmVkIAkqLworCXUzMiAgICAgICAgZmxvZ2lfcmVqZWN0czsJLyogIEZMT0dJIHJlamVjdHMgcmVjZWl2ZWQgCSovCisJdTMyICAgICAgICBmbG9naV91bmtub3duX3JzcDsgLyogIFVua25vd24gcmVzcG9uc2VzIGZvciBGTE9HSSAqLworCXUzMiAgICAgICAgZmxvZ2lfYWxsb2Nfd2FpdDsgLyogIEFsbG9jYXRpb24gd2FpdHMgcHJpb3IgdG8KKwkJCQkJICAgKiBzZW5kaW5nIEZMT0dJCisJCQkJCSAgICovCisJdTMyICAgICAgICBmbG9naV9yY3ZkOwkvKiAgRkxPR0lzIHJlY2VpdmVkICovCisJdTMyICAgICAgICBmbG9naV9yZWplY3RlZDsJLyogIEluY29taW5nIEZMT0dJcyByZWplY3RlZCAqLworCXUzMiAgICAgICAgZmFicmljX29ubGluZXM7CS8qICBJbnRlcm5hbCBmYWJyaWMgb25saW5lCisJCQkJCSAqIG5vdGlmaWNhdGlvbiBzZW50IHRvIG90aGVyCisJCQkJCSAqIG1vZHVsZXMKKwkJCQkJICovCisJdTMyICAgICAgICBmYWJyaWNfb2ZmbGluZXM7IC8qICBJbnRlcm5hbCBmYWJyaWMgb2ZmbGluZQorCQkJCQkgICogbm90aWZpY2F0aW9uIHNlbnQgdG8gb3RoZXIKKwkJCQkJICAqIG1vZHVsZXMKKwkJCQkJICAqLworCXUzMiAgICAgICAgcmVzdmQ7Cit9OworCisvKioKKyAqIFZGIGF0dHJpYnV0ZXMgcmV0dXJuZWQgaW4gcXVlcmllcworICovCitzdHJ1Y3QgYmZhX3ZmX2F0dHJfcyB7CisJZW51bSBiZmFfdmZfc3RhdGUgIHN0YXRlOwkJLyogIFZGIHN0YXRlICovCisJdTMyICAgICAgICByc3ZkOworCXd3bl90ICAgICAgICAgICBmYWJyaWNfbmFtZTsJLyogIGZhYnJpYyBuYW1lICovCit9OworCisjZW5kaWYgLyogX19CRkFfREVGU19WRl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9kZWZzL2JmYV9kZWZzX3Zwb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc192cG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDIxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZGVmcy9iZmFfZGVmc192cG9ydC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9ERUZTX1ZQT1JUX0hfXworI2RlZmluZSBfX0JGQV9ERUZTX1ZQT1JUX0hfXworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcG9ydC5oPgorI2luY2x1ZGUgPHByb3RvY29sL3R5cGVzLmg+CisKKy8qKgorICogVlBPUlQgc3RhdGVzCisgKi8KK2VudW0gYmZhX3Zwb3J0X3N0YXRlIHsKKwlCRkFfRkNTX1ZQT1JUX1VOSU5JVCAJCT0gMCwKKwlCRkFfRkNTX1ZQT1JUX0NSRUFURUQgCQk9IDEsCisJQkZBX0ZDU19WUE9SVF9PRkZMSU5FIAkJPSAxLAorCUJGQV9GQ1NfVlBPUlRfRkRJU0NfU0VORCAJPSAyLAorCUJGQV9GQ1NfVlBPUlRfRkRJU0MgCQk9IDMsCisJQkZBX0ZDU19WUE9SVF9GRElTQ19SRVRSWSAJPSA0LAorCUJGQV9GQ1NfVlBPUlRfT05MSU5FIAkJPSA1LAorCUJGQV9GQ1NfVlBPUlRfREVMRVRJTkcgCQk9IDYsCisJQkZBX0ZDU19WUE9SVF9DTEVBTlVQIAkJPSA2LAorCUJGQV9GQ1NfVlBPUlRfTE9HT19TRU5EIAk9IDcsCisJQkZBX0ZDU19WUE9SVF9MT0dPIAkJCT0gOCwKKwlCRkFfRkNTX1ZQT1JUX0VSUk9SCQkJPSA5LAorCUJGQV9GQ1NfVlBPUlRfTUFYX1NUQVRFLAorfTsKKworLyoqCisgKiB2cG9ydCBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBiZmFfdnBvcnRfc3RhdHNfcyB7CisJc3RydWN0IGJmYV9wb3J0X3N0YXRzX3MgcG9ydF9zdGF0czsJLyogIGJhc2UgY2xhc3MgKHBvcnQpIHN0YXRzICovCisJLyoKKwkgKiBUT0RPIC0gcmVtb3ZlCisJICovCisKKwl1MzIgICAgICAgIGZkaXNjX3NlbnQ7CS8qICBudW0gZmRpc2Mgc2VudCAqLworCXUzMiAgICAgICAgZmRpc2NfYWNjZXB0czsJLyogIGZkaXNjIGFjY2VwdHMgKi8KKwl1MzIgICAgICAgIGZkaXNjX3JldHJpZXM7CS8qICBmZGlzYyByZXRyaWVzICovCisJdTMyICAgICAgICBmZGlzY190aW1lb3V0czsJLyogIGZkaXNjIHRpbWVvdXRzICovCisJdTMyICAgICAgICBmZGlzY19yc3BfZXJyOwkvKiAgZmRpc2MgcmVzcG9uc2UgZXJyb3IgKi8KKwl1MzIgICAgICAgIGZkaXNjX2FjY19iYWQ7CS8qICBiYWQgZmRpc2MgYWNjZXB0cyAqLworCXUzMiAgICAgICAgZmRpc2NfcmVqZWN0czsJLyogIGZkaXNjIHJlamVjdHMgKi8KKwl1MzIgICAgICAgIGZkaXNjX3Vua25vd25fcnNwOworCS8qCisJICohPCBmZGlzYyByc3AgdW5rbm93biBlcnJvcgorCSAqLworCXUzMiAgICAgICAgZmRpc2NfYWxsb2Nfd2FpdDsvKiAgZmRpc2MgcmVxIChmY3hwKWFsbG9jIHdhaXQgKi8KKworCXUzMiAgICAgICAgbG9nb19hbGxvY193YWl0Oy8qICBsb2dvIHJlcSAoZmN4cCkgYWxsb2Mgd2FpdCAqLworCXUzMiAgICAgICAgbG9nb19zZW50OwkvKiAgbG9nbyBzZW50ICovCisJdTMyICAgICAgICBsb2dvX2FjY2VwdHM7CS8qICBsb2dvIGFjY2VwdHMgKi8KKwl1MzIgICAgICAgIGxvZ29fcmVqZWN0czsJLyogIGxvZ28gcmVqZWN0cyAqLworCXUzMiAgICAgICAgbG9nb19yc3BfZXJyOwkvKiAgbG9nbyByc3AgZXJyb3JzICovCisJdTMyICAgICAgICBsb2dvX3Vua25vd25fcnNwOworCQkJLyogIGxvZ28gcnNwIHVua25vd24gZXJyb3JzICovCisKKwl1MzIgICAgICAgIGZhYl9ub19ucGl2OwkvKiAgZmFicmljIGRvZXMgbm90IHN1cHBvcnQgbnBpdiAqLworCisJdTMyICAgICAgICBmYWJfb2ZmbGluZTsJLyogIG9mZmxpbmUgZXZlbnRzIGZyb20gZmFiIFNNICovCisJdTMyICAgICAgICBmYWJfb25saW5lOwkvKiAgb25saW5lIGV2ZW50cyBmcm9tIGZhYiBTTSAqLworCXUzMiAgICAgICAgZmFiX2NsZWFudXA7CS8qICBjbGVhbnVwIHJlcXVlc3QgZnJvbSBmYWIgU00gKi8KKwl1MzIgICAgICAgIHJzdmQ7Cit9OworCisvKioKKyAqIEJGQSB2cG9ydCBhdHRyaWJ1dGUgcmV0dXJuZWQgaW4gcXVlcmllcworICovCitzdHJ1Y3QgYmZhX3Zwb3J0X2F0dHJfcyB7CisJc3RydWN0IGJmYV9wb3J0X2F0dHJfcyAgIHBvcnRfYXR0cjsgLyogIGJhc2UgY2xhc3MgKHBvcnQpIGF0dHJpYnV0ZXMgKi8KKwllbnVtIGJmYV92cG9ydF9zdGF0ZSB2cG9ydF9zdGF0ZTsgLyogIHZwb3J0IHN0YXRlICovCisJdTMyICAgICAgICAgIHJzdmQ7Cit9OworCisjZW5kaWYgLyogX19CRkFfREVGU19WUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYi5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2ZjYi9iZmFfZmNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2M2IwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2ZjYi5oIEJGQSBGQ1MgY2FsbGJhY2sgaW50ZXJmYWNlcworICovCisKKyNpZm5kZWYgX19CRkFfRkNCX0hfXworI2RlZmluZSBfX0JGQV9GQ0JfSF9fCisKKy8qKgorICogIGZjYiBNYWluIGZjcyBjYWxsYmFja3MKKyAqLworCit2b2lkIGJmYV9mY2JfZXhpdChzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKKworCisKKyNlbmRpZiAvKiBfX0JGQV9GQ0JfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNiL2JmYV9mY2JfZmNwaW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl9mY3BpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzcwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNiL2JmYV9mY2JfZmNwaW0uaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorKiA6IGJmYWRfZmNwaW0uaCAtIEJGQSBGQ1MgaW5pdGlhdG9yIG1vZGUgcmVtb3RlIHBvcnQgY2FsbGJhY2tzCisgKi8KKworI2lmbmRlZiBfX0JGQURfRkNCX0ZDUElNX0hfXworI2RlZmluZSBfX0JGQURfRkNCX0ZDUElNX0hfXworCitzdHJ1Y3QgYmZhZF9pdG5pbV9zOworCisvKgorICogUlBJTSBjYWxsYmFja3MKKyAqLworCisvKioKKyAqIAlNZW1vcnkgYWxsb2NhdGlvbiBmb3IgcmVtb3RlIHBvcnQgaW5zdGFuY2UuIENhbGxlZCBiZWZvcmUgUFJMSSBpcworICogCWluaXRpYXRlZCB0byB0aGUgcmVtb3RlIHRhcmdldCBwb3J0LgorICoKKyAqIEBwYXJhbVtpbl0gYmZhZAkJLSBkcml2ZXIgaW5zdGFuY2UKKyAqIEBwYXJhbVtvdXRdIGl0bmltCQktIEZDUyByZW1vdGUgcG9ydCAoSU0pIGluc3RhbmNlCisgKiBAcGFyYW1bb3V0XSBpdG5pbV9kcnYJLSBkcml2ZXIgcmVtb3RlIHBvcnQgKElNKSBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGJmYV9mY2JfaXRuaW1fYWxsb2Moc3RydWN0IGJmYWRfcyAqYmZhZCwgc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqKml0bmltLAorCQkJCSAgICBzdHJ1Y3QgYmZhZF9pdG5pbV9zICoqaXRuaW1fZHJ2KTsKKworLyoqCisgKiAJCUZyZWUgcmVtb3RlIHBvcnQgKElNKSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW1baW5dIGJmYWQJLSBkcml2ZXIgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaXRuaW1fZHJ2CS0gZHJpdmVyIHJlbW90ZSBwb3J0IGluc3RhbmNlCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgICAgICAgICAgICBiZmFfZmNiX2l0bmltX2ZyZWUoc3RydWN0IGJmYWRfcyAqYmZhZCwKKwkJCQkgICBzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbV9kcnYpOworCisvKioKKyAqIAlOb3RpZmljYXRpb24gb2Ygd2hlbiBsb2dpbiB3aXRoIGEgcmVtb3RlIHRhcmdldCBkZXZpY2UgaXMgY29tcGxldGUuCisgKgorICogQHBhcmFtW2luXSBpdG5pbV9kcnYJLSBkcml2ZXIgcmVtb3RlIHBvcnQgaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCAgICAgICAgICAgIGJmYV9mY2JfaXRuaW1fb25saW5lKHN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltX2Rydik7CisKKy8qKgorICogCU5vdGlmaWNhdGlvbiB3aGVuIGxvZ2luIHdpdGggdGhlIHJlbW90ZSBkZXZpY2UgaXMgc2V2ZXJlZC4KKyAqCisgKiBAcGFyYW1baW5dIGl0bmltX2RydgktIGRyaXZlciByZW1vdGUgcG9ydCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkICAgICAgICAgICAgYmZhX2ZjYl9pdG5pbV9vZmZsaW5lKHN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltX2Rydik7CisKK3ZvaWQgICAgICAgICAgICBiZmFfZmNiX2l0bmltX3Rvdl9iZWdpbihzdHJ1Y3QgYmZhZF9pdG5pbV9zICppdG5pbV9kcnYpOwordm9pZCAgICAgICAgICAgIGJmYV9mY2JfaXRuaW1fdG92KHN0cnVjdCBiZmFkX2l0bmltX3MgKml0bmltX2Rydik7CisKKyNlbmRpZiAvKiBfX0JGQURfRkNCX0ZDUElNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2ZjYi9iZmFfZmNiX3BvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl9wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkN2Y5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl9wb3J0LmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2ZjYl9wb3J0LmggQkZBIEZDUyB2aXJ0dWFsIHBvcnQgZHJpdmVyIGludGVyZmFjZXMKKyAqLworCisjaWZuZGVmIF9fQkZBX0ZDQl9QT1JUX0hfXworI2RlZmluZSBfX0JGQV9GQ0JfUE9SVF9IX18KKworI2luY2x1ZGUgPGZjYi9iZmFfZmNiX3Zwb3J0Lmg+CisvKioKKyAqICBmY3NfcG9ydF9mY2IgRkNTIHBvcnQgZHJpdmVyIGludGVyZmFjZXMKKyAqLworCisvKgorICogRm9yd2FyZCBkZWNsYXJhdGlvbnMKKyAqLworc3RydWN0IGJmYWRfcG9ydF9zOworCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb25zIGZyb20gQkZBIEZDUyB0byBkcml2ZXIKKyAqLworCisvKioKKyAqIAlDYWxsIGZyb20gRkNTIHRvIGRyaXZlciBtb2R1bGUgd2hlbiBhIHBvcnQgaXMgaW5zdGFudGlhdGVkLiBUaGUgcG9ydAorICogCWNhbiBiZSBhIGJhc2UgcG9ydCBvciBhIHZpcnR1YWwgcG9ydCB3aXRoIGluIHRoZSBiYXNlIGZhYnJpYyBvcgorICogCWEgdmlydHVhbCBmYWJyaWMuCisgKgorICogIE9uIHRoaXMgY2FsbGJhY2ssIGRyaXZlciBpcyBzdXBwb3NlZCB0byBjcmVhdGUgc2NzaV9ob3N0LCBzY3NpX3RndCBvcgorICogIG5ldHdvcmsgaW50ZXJmYWNlcyBiYXNlcyBvbiBwb3J0cyBwZXJzb25hbGl0eS9yb2xlcy4KKyAqCisgKiAgICAgIGJhc2UgcG9ydCBvZiBiYXNlIGZhYnJpYzoJdmZfZHJ2ID09IE5VTEwgJiYgdnBfZHJ2ID09IE5VTEwKKyAqICAgICAgdnBvcnQgb2YgYmFzZSBmYWJyaWM6CQl2Zl9kcnYgPT0gTlVMTCAmJiB2cF9kcnYgIT0gTlVMTAorICogICAgICBiYXNlIHBvcnQgb2YgVkY6CQl2Zl9kcnYgIT0gTlVMTCAmJiB2cF9kcnYgPT0gTlVMTAorICogICAgICB2cG9ydCBvZiBWRjoJCQl2Zl9kcnYgIT0gTlVMTCAmJiB2cF9kcnYgIT0gTlVMTAorICoKKyAqIEBwYXJhbVtpbl0gYmZhZCAgIC0gZHJpdmVyIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIHBvcnQgICAtIEZDUyBwb3J0IGluc3RhbmNlCisgKiBAcGFyYW1baW5dIHJvbGVzICAtIHBvcnQgcm9sZXM6IElNLCBUTSwgSVAKKyAqIEBwYXJhbVtpbl0gdmZfZHJ2IC0gVkYgZHJpdmVyIGluc3RhbmNlLCBOVUxMIGlmIGJhc2UgZmFicmljIChubyBWRikKKyAqIEBwYXJhbVtpbl0gdnBfZHJ2IC0gdnBvcnQgZHJpdmVyIGluc3RhbmNlLCBOVUxMIGlmIGJhc2UgcG9ydAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCitzdHJ1Y3QgYmZhZF9wb3J0X3MgKmJmYV9mY2JfcG9ydF9uZXcoc3RydWN0IGJmYWRfcyAqYmZhZCwKKwkJCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCWVudW0gYmZhX3BvcnRfcm9sZSByb2xlcywgc3RydWN0IGJmYWRfdmZfcyAqdmZfZHJ2LAorCQkJc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBfZHJ2KTsKKworLyoqCisgKiAJQ2FsbCBmcm9tIEZDUyB0byBkcml2ZXIgbW9kdWxlIHdoZW4gYSBwb3J0IGlzIGRlbGV0ZWQuIFRoZSBwb3J0CisgKiAJY2FuIGJlIGEgYmFzZSBwb3J0IG9yIGEgdmlydHVhbCBwb3J0IHdpdGggaW4gdGhlIGJhc2UgZmFicmljIG9yCisgKiAJYSB2aXJ0dWFsIGZhYnJpYy4KKyAqCisgKiBAcGFyYW1baW5dIGJmYWQgICAtIGRyaXZlciBpbnN0YW5jZQorICogQHBhcmFtW2luXSByb2xlcyAgLSBwb3J0IHJvbGVzOiBJTSwgVE0sIElQCisgKiBAcGFyYW1baW5dIHZmX2RydiAtIFZGIGRyaXZlciBpbnN0YW5jZSwgTlVMTCBpZiBiYXNlIGZhYnJpYyAobm8gVkYpCisgKiBAcGFyYW1baW5dIHZwX2RydiAtIHZwb3J0IGRyaXZlciBpbnN0YW5jZSwgTlVMTCBpZiBiYXNlIHBvcnQKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLwordm9pZCBiZmFfZmNiX3BvcnRfZGVsZXRlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIGVudW0gYmZhX3BvcnRfcm9sZSByb2xlcywKKwkJCXN0cnVjdCBiZmFkX3ZmX3MgKnZmX2Rydiwgc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBfZHJ2KTsKKworLyoqCisgKiAJTm90aWZpY2F0aW9uIHdoZW4gcG9ydCB0cmFuc2l0aW9ucyB0byBPTkxJTkUgc3RhdGUuCisgKgorICogT25saW5lIG5vdGlmaWNhdGlvbiBpcyBhIGxvZ2ljYWwgbGluayB1cCBmb3IgdGhlIGxvY2FsIHBvcnQuIFRoaXMKKyAqIG5vdGlmaWNhdGlvbiBpcyBzZW50IGFmdGVyIGEgc3VjY2Vzc2Z1bGwgRkxPR0ksIG9yIGEgc3VjY2Vzc2Z1bAorICogbGluayBpbml0aWFsaXphdGlvbiBpbiBwcm92aWF0ZS1sb29wIG9yIE4yTiB0b3BvbG9naWVzLgorICoKKyAqIEBwYXJhbVtpbl0gYmZhZCAgIC0gZHJpdmVyIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIHJvbGVzICAtIHBvcnQgcm9sZXM6IElNLCBUTSwgSVAKKyAqIEBwYXJhbVtpbl0gdmZfZHJ2IC0gVkYgZHJpdmVyIGluc3RhbmNlLCBOVUxMIGlmIGJhc2UgZmFicmljIChubyBWRikKKyAqIEBwYXJhbVtpbl0gdnBfZHJ2IC0gdnBvcnQgZHJpdmVyIGluc3RhbmNlLCBOVUxMIGlmIGJhc2UgcG9ydAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGJmYV9mY2JfcG9ydF9vbmxpbmUoc3RydWN0IGJmYWRfcyAqYmZhZCwgZW51bSBiZmFfcG9ydF9yb2xlIHJvbGVzLAorCQkJc3RydWN0IGJmYWRfdmZfcyAqdmZfZHJ2LCBzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cF9kcnYpOworCisvKioKKyAqIAlOb3RpZmljYXRpb24gd2hlbiBwb3J0IHRyYW5zaXRpb25zIHRvIE9GRkxJTkUgc3RhdGUuCisgKgorICogT2ZmbGluZSBub3RpZmljYXRpb24gaXMgYSBsb2dpY2FsIGxpbmsgZG93biBmb3IgdGhlIGxvY2FsIHBvcnQuCisgKgorICogQHBhcmFtW2luXSBiZmFkICAgLSBkcml2ZXIgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gcm9sZXMgIC0gcG9ydCByb2xlczogSU0sIFRNLCBJUAorICogQHBhcmFtW2luXSB2Zl9kcnYgLSBWRiBkcml2ZXIgaW5zdGFuY2UsIE5VTEwgaWYgYmFzZSBmYWJyaWMgKG5vIFZGKQorICogQHBhcmFtW2luXSB2cF9kcnYgLSB2cG9ydCBkcml2ZXIgaW5zdGFuY2UsIE5VTEwgaWYgYmFzZSBwb3J0CisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgYmZhX2ZjYl9wb3J0X29mZmxpbmUoc3RydWN0IGJmYWRfcyAqYmZhZCwgZW51bSBiZmFfcG9ydF9yb2xlIHJvbGVzLAorCQkJc3RydWN0IGJmYWRfdmZfcyAqdmZfZHJ2LCBzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cF9kcnYpOworCisKKyNlbmRpZiAvKiBfX0JGQV9GQ0JfUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl9ycG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2ZjYi9iZmFfZmNiX3Jwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNjFiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl9ycG9ydC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2ZjYl9ycG9ydC5oIEJGQSBGQ1MgcnBvcnQgZHJpdmVyIGludGVyZmFjZXMKKyAqLworCisjaWZuZGVmIF9fQkZBX0ZDQl9SUE9SVF9IX18KKyNkZWZpbmUgX19CRkFfRkNCX1JQT1JUX0hfXworCisvKioKKyAqICBmY3NfcnBvcnRfZmNiIFJlbW90ZSBwb3J0IGRyaXZlciBpbnRlcmZhY2VzCisgKi8KKworCitzdHJ1Y3QgYmZhZF9ycG9ydF9zOworCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb25zIGZyb20gQkZBIEZDUyB0byBkcml2ZXIKKyAqLworCisvKioKKyAqIAlDb21wbGV0aW9uIGNhbGxiYWNrIGZvciBiZmFfZmNzX3Jwb3J0X2FkZCgpLgorICoKKyAqIEBwYXJhbVtpbl0gcnBvcnRfZHJ2IC0gZHJpdmVyIGluc3RhbmNlIG9mIHJwb3J0CisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgYmZhX2ZjYl9ycG9ydF9hZGQoc3RydWN0IGJmYWRfcnBvcnRfcyAqcnBvcnRfZHJ2KTsKKworLyoqCisgKiAJQ29tcGxldGlvbiBjYWxsYmFjayBmb3IgYmZhX2Zjc19ycG9ydF9yZW1vdmUoKS4KKyAqCisgKiBAcGFyYW1baW5dIHJwb3J0X2RydiAtIGRyaXZlciBpbnN0YW5jZSBvZiBycG9ydAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkIGJmYV9mY2JfcnBvcnRfcmVtb3ZlKHN0cnVjdCBiZmFkX3Jwb3J0X3MgKnJwb3J0X2Rydik7CisKKy8qKgorICogCQlDYWxsIHRvIGFsbG9jYXRlIGEgcnBvcnQgaW5zdGFuY2UuCisgKgorICogQHBhcmFtW2luXSBiZmFkIC0gZHJpdmVyIGluc3RhbmNlCisgKiBAcGFyYW1bb3V0XSBycG9ydCAtIEJGQSBGQ1MgaW5zdGFuY2Ugb2YgcnBvcnQKKyAqIEBwYXJhbVtvdXRdIHJwb3J0X2RydiAtIGRyaXZlciBpbnN0YW5jZSBvZiBycG9ydAorICoKKyAqIEByZXR2YWwgQkZBX1NUQVRVU19PSyAtIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQKKyAqIEByZXR2YWwgQkZBX1NUQVRVU19FTk9NRU0gLSBjYW5ub3QgYWxsb2NhdGUKKyAqLworYmZhX3N0YXR1c190IGJmYV9mY2JfcnBvcnRfYWxsb2Moc3RydWN0IGJmYWRfcyAqYmZhZCwKKwkJCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKipycG9ydCwKKwkJCXN0cnVjdCBiZmFkX3Jwb3J0X3MgKipycG9ydF9kcnYpOworCisvKioKKyAqIAlDYWxsIHRvIGZyZWUgcnBvcnQgbWVtb3J5IHJlc291cmNlcy4KKyAqCisgKiBAcGFyYW1baW5dIGJmYWQgLSBkcml2ZXIgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gcnBvcnRfZHJ2IC0gZHJpdmVyIGluc3RhbmNlIG9mIHJwb3J0CisgKgorICogQHJldHVybiBOb25lCisgKi8KK3ZvaWQgYmZhX2ZjYl9ycG9ydF9mcmVlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX3Jwb3J0X3MgKipycG9ydF9kcnYpOworCisKKworI2VuZGlmIC8qIF9fQkZBX0ZDQl9SUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl92Zi5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2ZjYi9iZmFfZmNiX3ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkM2ZhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY2IvYmZhX2ZjYl92Zi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2ZjYl92Zi5oIEJGQSBGQ1MgdmlydHVhbCBmYWJyaWMgZHJpdmVyIGludGVyZmFjZXMKKyAqLworCisjaWZuZGVmIF9fQkZBX0ZDQl9WRl9IX18KKyNkZWZpbmUgX19CRkFfRkNCX1ZGX0hfXworCisvKioKKyAqICBmY3NfdmZfZmNiIFZpcnR1YWwgZmFicmljIGRyaXZlciBpbnRyZWZhY2VzCisgKi8KKworCitzdHJ1Y3QgYmZhZF92Zl9zOworCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb25zIGZyb20gQkZBIEZDUyB0byBkcml2ZXIKKyAqLworCisvKioKKyAqIAlDb21wbGV0aW9uIGNhbGxiYWNrIGZvciBiZmFfZmNzX3ZmX3N0b3AoKS4KKyAqCisgKiBAcGFyYW1baW5dIHZmX2RydiAtIGRyaXZlciBpbnN0YW5jZSBvZiB2ZgorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkICAgICAgICAgICAgYmZhX2ZjYl92Zl9zdG9wKHN0cnVjdCBiZmFkX3ZmX3MgKnZmX2Rydik7CisKKworCisjZW5kaWYgLyogX19CRkFfRkNCX1ZGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2ZjYi9iZmFfZmNiX3Zwb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNiL2JmYV9mY2JfdnBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzlmNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2ZjYi9iZmFfZmNiX3Zwb3J0LmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFfZmNiX3Zwb3J0LmggQkZBIEZDUyB2aXJ0dWFsIHBvcnQgZHJpdmVyIGludGVyZmFjZXMKKyAqLworCisjaWZuZGVmIF9fQkZBX0ZDQl9WUE9SVF9IX18KKyNkZWZpbmUgX19CRkFfRkNCX1ZQT1JUX0hfXworCisvKioKKyAqICBmY3NfdnBvcnRfZmNiIFZpcnR1YWwgcG9ydCBkcml2ZXIgaW50ZXJmYWNlcworICovCisKKworc3RydWN0IGJmYWRfdnBvcnRfczsKKworLyoKKyAqIENhbGxiYWNrIGZ1bmN0aW9ucyBmcm9tIEJGQSBGQ1MgdG8gZHJpdmVyCisgKi8KKworLyoqCisgKiAJQ29tcGxldGlvbiBjYWxsYmFjayBmb3IgYmZhX2Zjc192cG9ydF9kZWxldGUoKS4KKyAqCisgKiBAcGFyYW1baW5dIHZwb3J0X2RydiAtIGRyaXZlciBpbnN0YW5jZSBvZiB2cG9ydAorICoKKyAqIEByZXR1cm4gTm9uZQorICovCit2b2lkICAgICAgICAgICAgYmZhX2ZjYl92cG9ydF9kZWxldGUoc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBvcnRfZHJ2KTsKKworCisKKyNlbmRpZiAvKiBfX0JGQV9GQ0JfVlBPUlRfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzY2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3MuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfRkNTX0hfXworI2RlZmluZSBfX0JGQV9GQ1NfSF9fCisKKyNpbmNsdWRlIDxjcy9iZmFfZGVidWcuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3N0YXR1cy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfdmVyc2lvbi5oPgorI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX2ZhYnJpYy5oPgorCisjZGVmaW5lIEJGQV9GQ1NfT1NfU1RSX0xFTiAgCQk2NAorCitzdHJ1Y3QgYmZhX2Zjc19zdGF0c19zIHsKKwlzdHJ1Y3QgeworCQl1MzIgICAgICAgIHVudGFnZ2VkOyAvKiAgdW50YWdnZWQgcmVjZWl2ZSBmcmFtZXMgKi8KKwkJdTMyICAgICAgICB0YWdnZWQ7CS8qICB0YWdnZWQgcmVjZWl2ZSBmcmFtZXMgKi8KKwkJdTMyICAgICAgICB2ZmlkX3Vua25vd247CS8qICBWRiBpZCBpcyB1bmtub3duICovCisJfSB1ZjsKK307CisKK3N0cnVjdCBiZmFfZmNzX2RyaXZlcl9pbmZvX3MgeworCXU4ICB2ZXJzaW9uW0JGQV9WRVJTSU9OX0xFTl07CQkvKiAgRHJpdmVyIFZlcnNpb24gKi8KKwl1OCAgaG9zdF9tYWNoaW5lX25hbWVbQkZBX0ZDU19PU19TVFJfTEVOXTsKKwl1OCAgaG9zdF9vc19uYW1lW0JGQV9GQ1NfT1NfU1RSX0xFTl07IC8qICBPUyBuYW1lIGFuZCB2ZXJzaW9uICovCisJdTggIGhvc3Rfb3NfcGF0Y2hbQkZBX0ZDU19PU19TVFJfTEVOXTsvKiAgcGF0Y2ggb3Igc2VydmljZSBwYWNrICovCisJdTggIG9zX2RldmljZV9uYW1lW0JGQV9GQ1NfT1NfU1RSX0xFTl07IC8qICBEcml2ZXIgRGV2aWNlIE5hbWUgKi8KK307CisKK3N0cnVjdCBiZmFfZmNzX3MgeworCXN0cnVjdCBiZmFfcyAgICAgICpiZmE7CS8qICBjb3JyZXNwb25kaW5nIEJGQSBiZmEgaW5zdGFuY2UgKi8KKwlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQ7IC8qICBjb3JyZXNwb25kaW5nIEJEQSBkcml2ZXIgaW5zdGFuY2UgKi8KKwlzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAgKmxvZ207CS8qICBkcml2ZXIgbG9nZ2luZyBtb2R1bGUgaW5zdGFuY2UgKi8KKwlzdHJ1Y3QgYmZhX3RyY19tb2RfcyAgKnRyY21vZDsJLyogIHRyYWNpbmcgbW9kdWxlICovCisJc3RydWN0IGJmYV9hZW5fcyAgICAgICphZW47CS8qICBhZW4gY29tcG9uZW50ICovCisJYmZhX2Jvb2xlYW5fdCAgIHZmX2VuYWJsZWQ7CS8qICBWRiBtb2RlIGlzIGVuYWJsZWQgKi8KKwliZmFfYm9vbGVhbl90IG1pbl9jZmc7CQkvKiBtaW4gY2ZnIGVuYWJsZWQvZGlzYWJsZWQgKi8KKwl1MTYgICAgICAgIHBvcnRfdmZpZDsJLyogIHBvcnQgZGVmYXVsdCBWRiBJRCAqLworCXN0cnVjdCBiZmFfZmNzX2RyaXZlcl9pbmZvX3MgZHJpdmVyX2luZm87CisJc3RydWN0IGJmYV9mY3NfZmFicmljX3MgZmFicmljOyAvKiAgYmFzZSBmYWJyaWMgc3RhdGUgbWFjaGluZSAqLworCXN0cnVjdCBiZmFfZmNzX3N0YXRzX3MJc3RhdHM7CS8qICBGQ1Mgc3RhdGlzdGljcyAqLworCXN0cnVjdCBiZmFfd2NfcyAgICAgICAJd2M7CS8qICB3YWl0aW5nIGNvdW50ZXIgKi8KK307CisKKy8qCisgKiBiZmEgZmNzIEFQSSBmdW5jdGlvbnMKKyAqLwordm9pZCBiZmFfZmNzX2luaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzLCBzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYWRfcyAqYmZhZCwKKwkJCWJmYV9ib29sZWFuX3QgbWluX2NmZyk7Cit2b2lkIGJmYV9mY3NfZHJpdmVyX2luZm9faW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsCisJCQlzdHJ1Y3QgYmZhX2Zjc19kcml2ZXJfaW5mb19zICpkcml2ZXJfaW5mbyk7Cit2b2lkIGJmYV9mY3NfZXhpdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOwordm9pZCBiZmFfZmNzX3RyY19pbml0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcywgc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY21vZCk7Cit2b2lkIGJmYV9mY3NfbG9nX2luaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzLCBzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nbW9kKTsKK3ZvaWQgYmZhX2Zjc19hZW5faW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHN0cnVjdCBiZmFfYWVuX3MgKmFlbik7Cit2b2lkIAkgIAliZmFfZmNzX3N0YXJ0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7CisKKyNlbmRpZiAvKiBfX0JGQV9GQ1NfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfYXV0aC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2F1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGM0YzlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2F1dGguaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfRkNTX0FVVEhfSF9fCisjZGVmaW5lIF9fQkZBX0ZDU19BVVRIX0hfXworCitzdHJ1Y3QgYmZhX2Zjc19zOworCisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19zdGF0dXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2F1dGguaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3ZmLmg+CisjaW5jbHVkZSA8Y3MvYmZhX3EuaD4KKyNpbmNsdWRlIDxjcy9iZmFfc20uaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Bwb3J0Lmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfbHBvcnQuaD4KKyNpbmNsdWRlIDxwcm90b2NvbC9mY19zcC5oPgorCitzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfczsKKworCisKK3N0cnVjdCBiZmFfZmNzX2F1dGhfcyB7CisJYmZhX3NtX3QJc207CS8qICBzdGF0ZSBtYWNoaW5lICovCisJYmZhX2Jvb2xlYW5fdCAgIHBvbGljeTsJLyogIGF1dGhlbnRpY2F0aW9uIGVuYWJsZWQvZGlzYWJsZWQgKi8KKwllbnVtIGJmYV9hdXRoX3N0YXR1cyBzdGF0dXM7CS8qICBhdXRoZW50aWNhdGlvbiBzdGF0dXMgKi8KKwllbnVtIGF1dGhfcmp0X2NvZGVzICByanRfY29kZTsJLyogIGF1dGggcmVqZWN0IHN0YXR1cyAqLworCWVudW0gYXV0aF9yanRfY29kZV9leHBzICByanRfY29kZV9leHA7CS8qICBhdXRoIHJlamVjdCByZWFzb24gKi8KKwllbnVtIGJmYV9hdXRoX2FsZ28gYWxnbzsJLyogIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSAqLworCXN0cnVjdCBiZmFfYXV0aF9zdGF0c19zIHN0YXRzOwkvKiAgU3RhdGlzdGljcyAqLworCWVudW0gYXV0aF9kaF9naWQgICBncm91cDsJLyogIERIKGRpZmZpZS1oZWxsbWFuKSBHcm91cCAqLworCWVudW0gYmZhX2F1dGhfc2VjcmV0c291cmNlIHNvdXJjZTsJLyogIFNlY3JldCBzb3VyY2UgKi8KKwljaGFyICAgICAgICAgICAgc2VjcmV0W0JGQV9BVVRIX1NFQ1JFVF9TVFJJTkdfTEVOXTsKKwkJCQkvKiAgc2VjcmV0IHN0cmluZyAqLworCXU4ICAgICAgICAgc2VjcmV0X2xlbjsKKwkJCQkvKiAgc2VjcmV0IHN0cmluZyBsZW5ndGggKi8KKwl1OCAgICAgICAgIG5yZXRyaWVzOworCQkJCS8qICBudW1iZXIgb2YgcmV0cmllcyAqLworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWM7LyogIHBvaW50ZXIgdG8gZmFicmljICovCisJdTggICAgICAgICBzZW50Y29kZTsJLyogIHBvaW50ZXIgdG8gcmVzcG9uc2UgZGF0YSAqLworCXU4ICAgICAgICAqcmVzcG9uc2U7CS8qICBwb2ludGVyIHRvIHJlc3BvbnNlIGRhdGEgKi8KKwlzdHJ1Y3QgYmZhX3RpbWVyX3MgZGVsYXlfdGltZXI7IAkvKiAgZGVsYXkgdGltZXIgKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsJCS8qICBwb2ludGVyIHRvIGZjeHAgKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfd3FlX3MgZmN4cF93cWU7Cit9OworCisvKioKKyAqIGJmYSBmY3MgYXV0aGVudGljYXRpb24gcHVibGljIGZ1bmN0aW9ucworICovCitiZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19hdXRoX2dldF9hdHRyKHN0cnVjdCBiZmFfZmNzX3MgKnBvcnQsCisJCQkJICAgICAgc3RydWN0IGJmYV9hdXRoX2F0dHJfcyAqYXR0cik7CitiZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19hdXRoX3NldF9wb2xpY3koc3RydWN0IGJmYV9mY3NfcyAqcG9ydCwKKwkJCQkJYmZhX2Jvb2xlYW5fdCBwb2xpY3kpOworZW51bSBiZmFfYXV0aF9zdGF0dXMgYmZhX2Zjc19hdXRoX2dldF9zdGF0dXMoc3RydWN0IGJmYV9mY3NfcyAqcG9ydCk7CitiZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19hdXRoX3NldF9hbGdvKHN0cnVjdCBiZmFfZmNzX3MgKnBvcnQsCisJCQkJICAgICAgZW51bSBiZmFfYXV0aF9hbGdvIGFsZ28pOworYmZhX3N0YXR1c190ICAgIGJmYV9mY3NfYXV0aF9nZXRfc3RhdHMoc3RydWN0IGJmYV9mY3NfcyAqcG9ydCwKKwkJCQkgICAgICAgc3RydWN0IGJmYV9hdXRoX3N0YXRzX3MgKnN0YXRzKTsKK2JmYV9zdGF0dXNfdCAgICBiZmFfZmNzX2F1dGhfc2V0X2RoX2dyb3VwKHN0cnVjdCBiZmFfZmNzX3MgKnBvcnQsIGludCBncm91cCk7CitiZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19hdXRoX3NldF9zZWNyZXRzdHJpbmcoc3RydWN0IGJmYV9mY3NfcyAqcG9ydCwKKwkJCQkJICAgICAgY2hhciAqc2VjcmV0KTsKK2JmYV9zdGF0dXNfdCAgICBiZmFfZmNzX2F1dGhfc2V0X3NlY3JldHN0cmluZ19lbmNyeXB0KHN0cnVjdCBiZmFfZmNzX3MgKnBvcnQsCisJCQkJCSAgICAgIHUzMiBzZWNyZXRbXSwgdTMyIGxlbik7CitiZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19hdXRoX3NldF9zZWNyZXRzb3VyY2Uoc3RydWN0IGJmYV9mY3NfcyAqcG9ydCwKKwkJCQkJICAgICAgZW51bSBiZmFfYXV0aF9zZWNyZXRzb3VyY2Ugc3JjKTsKK2JmYV9zdGF0dXNfdCAgICBiZmFfZmNzX2F1dGhfcmVzZXRfc3RhdHMoc3RydWN0IGJmYV9mY3NfcyAqcG9ydCk7CitiZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19hdXRoX3JlaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpwb3J0KTsKKworI2VuZGlmIC8qIF9fQkZBX0ZDU19BVVRIX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2ZhYnJpYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2ZhYnJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZmQyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfZmFicmljLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0JGQV9GQ1NfRkFCUklDX0hfXworI2RlZmluZSBfX0JGQV9GQ1NfRkFCUklDX0hfXworCitzdHJ1Y3QgYmZhX2Zjc19zOworCisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19zdGF0dXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3ZmLmg+CisjaW5jbHVkZSA8Y3MvYmZhX3EuaD4KKyNpbmNsdWRlIDxjcy9iZmFfc20uaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Bwb3J0Lmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfbHBvcnQuaD4KKyNpbmNsdWRlIDxwcm90b2NvbC9mY19zcC5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX2F1dGguaD4KKworLyoKKyAqIGZvcndhcmQgZGVjbGFyYXRpb24KKyAqLworc3RydWN0IGJmYWRfdmZfczsKKworZW51bSBiZmFfZmNzX2ZhYnJpY190eXBlIHsKKwlCRkFfRkNTX0ZBQlJJQ19VTktOT1dOID0gMCwKKwlCRkFfRkNTX0ZBQlJJQ19TV0lUQ0hFRCA9IDEsCisJQkZBX0ZDU19GQUJSSUNfUExPT1AgPSAyLAorCUJGQV9GQ1NfRkFCUklDX04yTiA9IDMsCit9OworCisKK3N0cnVjdCBiZmFfZmNzX2ZhYnJpY19zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgcWU7CQkvKiAgcXVldWUgZWxlbWVudCAqLworCWJmYV9zbV90CSBzbTsJCS8qICBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IGJmYV9mY3NfcyAqZmNzOwkJLyogIEZDUyBpbnN0YW5jZSAqLworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAgYnBvcnQ7CS8qICBiYXNlIGxvZ2ljYWwgcG9ydCAqLworCWVudW0gYmZhX2Zjc19mYWJyaWNfdHlwZSBmYWJfdHlwZTsgLyogIGZhYnJpYyB0eXBlICovCisJZW51bSBiZmFfcHBvcnRfdHlwZSBvcGVyX3R5cGU7CS8qICBjdXJyZW50IGxpbmsgdG9wb2xvZ3kgKi8KKwl1OCAgICAgICAgIGlzX3ZmOwkJLyogIGlzIHZpcnR1YWwgZmFicmljPyAqLworCXU4ICAgICAgICAgaXNfbnBpdjsJLyogIGlzIE5QSVYgc3VwcG9ydGVkID8gKi8KKwl1OCAgICAgICAgIGlzX2F1dGg7CS8qICBpcyBTZWN1cml0eS9BdXRoIHN1cHBvcnRlZCA/ICovCisJdTE2ICAgICAgICBiYl9jcmVkaXQ7CS8qICBCQiBjcmVkaXQgZnJvbSBmYWJyaWMgKi8KKwl1MTYgICAgICAgIHZmX2lkOwkJLyogIHZpcnR1YWwgZmFicmljIElEICovCisJdTE2ICAgICAgICBudW1fdnBvcnRzOwkvKiAgbnVtIHZwb3J0cyAqLworCXUxNiAgICAgICAgcnN2ZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgdnBvcnRfcTsJLyogIHF1ZXVlIG9mIHZpcnR1YWwgcG9ydHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgdmZfcTsJLyogIHF1ZXVlIG9mIHZpcnR1YWwgZmFicmljcyAqLworCXN0cnVjdCBiZmFkX3ZmX3MgICAgICAqdmZfZHJ2OwkvKiAgZHJpdmVyIHZmIHN0cnVjdHVyZSAqLworCXN0cnVjdCBiZmFfdGltZXJfcyBsaW5rX3RpbWVyOwkvKiAgTGluayBGYWlsdXJlIHRpbWVyLiBWcG9ydCAqLworCXd3bl90ICAgICAgICAgICBmYWJyaWNfbmFtZTsJLyogIGF0dGFjaGVkIGZhYnJpYyBuYW1lICovCisJYmZhX2Jvb2xlYW5fdCAgIGF1dGhfcmVxZDsJLyogIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkCSovCisJc3RydWN0IGJmYV90aW1lcl9zIGRlbGF5X3RpbWVyOwkvKiAgZGVsYXkgdGltZXIJCSovCisJdW5pb24geworCQl1MTYgICAgICAgIHN3cF92ZmlkOy8qICBzd2l0Y2ggcG9ydCBWRiBpZAkJKi8KKwl9IGV2ZW50X2FyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19hdXRoX3MgIGF1dGg7CS8qICBhdXRoZW50aWNhdGlvbiBjb25maWcJKi8KKwlzdHJ1Y3QgYmZhX3djX3MgICAgICAgIHdjOwkvKiAgd2FpdCBjb3VudGVyIGZvciBkZWxldGUJKi8KKwlzdHJ1Y3QgYmZhX3ZmX3N0YXRzX3MgIHN0YXRzOyAJLyogIGZhYnJpYy92ZiBzdGF0cwkJKi8KKwlzdHJ1Y3QgYmZhX2xwc19zCSpscHM7CS8qICBscG9ydCBsb2dpbiBzZXJ2aWNlcwkqLworCXU4CWZhYnJpY19pcF9hZGRyW0JGQV9GQ1NfRkFCUklDX0lQQUREUl9TWl07ICAvKiAgYXR0YWNoZWQKKwkJCQkJCQkgICAgKiBmYWJyaWMncyBpcCBhZGRyCisJCQkJCQkJICAgICovCit9OworCisjZGVmaW5lIGJmYV9mY3NfZmFicmljX25waXZfY2FwYWJsZShfX2YpICAgIChfX2YpLT5pc19ucGl2CisjZGVmaW5lIGJmYV9mY3NfZmFicmljX2lzX3N3aXRjaGVkKF9fZikJCQlcCisJKChfX2YpLT5mYWJfdHlwZSA9PSBCRkFfRkNTX0ZBQlJJQ19TV0lUQ0hFRCkKKworLyoqCisgKiAgIFRoZSBkZXNpZ24gY2FsbHMgZm9yIGEgc2luZ2xlIGltcGxlbWVudGF0aW9uIG9mIGJhc2UgZmFicmljIGFuZCB2Zi4KKyAqLworI2RlZmluZSBiZmFfZmNzX3ZmX3Qgc3RydWN0IGJmYV9mY3NfZmFicmljX3MKKworc3RydWN0IGJmYV92Zl9ldmVudF9zIHsKKwl1MzIgICAgICAgIHVuZGVmaW5lZDsKK307CisKKy8qKgorICogYmZhIGZjcyB2ZiBwdWJsaWMgZnVuY3Rpb25zCisgKi8KK2JmYV9zdGF0dXNfdCBiZmFfZmNzX3ZmX21vZGVfZW5hYmxlKHN0cnVjdCBiZmFfZmNzX3MgKmZjcywgdTE2IHZmX2lkKTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNzX3ZmX21vZGVfZGlzYWJsZShzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOworYmZhX3N0YXR1c190IGJmYV9mY3NfdmZfY3JlYXRlKGJmYV9mY3NfdmZfdCAqdmYsIHN0cnVjdCBiZmFfZmNzX3MgKmZjcywKKwkJCSAgICAgICB1MTYgdmZfaWQsIHN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcG9ydF9jZmcsCisJCQkgICAgICAgc3RydWN0IGJmYWRfdmZfcyAqdmZfZHJ2KTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNzX3ZmX2RlbGV0ZShiZmFfZmNzX3ZmX3QgKnZmKTsKK3ZvaWQgYmZhX2Zjc192Zl9zdGFydChiZmFfZmNzX3ZmX3QgKnZmKTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNzX3ZmX3N0b3AoYmZhX2Zjc192Zl90ICp2Zik7Cit2b2lkIGJmYV9mY3NfdmZfbGlzdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHUxNiAqdmZfaWRzLCBpbnQgKm52ZnMpOwordm9pZCBiZmFfZmNzX3ZmX2xpc3RfYWxsKHN0cnVjdCBiZmFfZmNzX3MgKmZjcywgdTE2ICp2Zl9pZHMsIGludCAqbnZmcyk7Cit2b2lkIGJmYV9mY3NfdmZfZ2V0X2F0dHIoYmZhX2Zjc192Zl90ICp2Ziwgc3RydWN0IGJmYV92Zl9hdHRyX3MgKnZmX2F0dHIpOwordm9pZCBiZmFfZmNzX3ZmX2dldF9zdGF0cyhiZmFfZmNzX3ZmX3QgKnZmLAorCQkJICBzdHJ1Y3QgYmZhX3ZmX3N0YXRzX3MgKnZmX3N0YXRzKTsKK3ZvaWQgYmZhX2Zjc192Zl9jbGVhcl9zdGF0cyhiZmFfZmNzX3ZmX3QgKnZmKTsKK3ZvaWQgYmZhX2Zjc192Zl9nZXRfcG9ydHMoYmZhX2Zjc192Zl90ICp2Ziwgd3duX3QgdnB3d25bXSwgaW50ICpucG9ydHMpOworYmZhX2Zjc192Zl90ICpiZmFfZmNzX3ZmX2xvb2t1cChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHUxNiB2Zl9pZCk7CitzdHJ1Y3QgYmZhZF92Zl9zICpiZmFfZmNzX3ZmX2dldF9kcnZfdmYoYmZhX2Zjc192Zl90ICp2Zik7CisKKyNlbmRpZiAvKiBfX0JGQV9GQ1NfRkFCUklDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2ZjcGltLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfZmNwaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzE5ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2ZjcGltLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2Zjc19mY3BpbS5oIEJGQSBGQ1MgRkNQIEluaXRpYXRvciBNb2RlIGludGVyZmFjZXMvZGVmaW5lcy4KKyAqLworCisjaWZuZGVmIF9fQkZBX0ZDU19GQ1BJTV9IX18KKyNkZWZpbmUgX19CRkFfRkNTX0ZDUElNX0hfXworCisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19zdGF0dXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX2l0bmltLmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3MuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjc19ycG9ydC5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX2xwb3J0Lmg+CisjaW5jbHVkZSA8YmZhX2ZjcGltLmg+CisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdHJ1Y3QgYmZhZF9pdG5pbV9zOworCitzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zIHsKKwliZmFfc21fdAkJc207CQkvKiAgc3RhdGUgbWFjaGluZSAqLworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgCSpycG9ydDsJCS8qICBwYXJlbnQgcmVtb3RlIHJwb3J0ICAqLworCXN0cnVjdCBiZmFkX2l0bmltX3MgICAJKml0bmltX2RydjsJLyogIGRyaXZlciBwZWVyIGluc3RhbmNlICovCisJc3RydWN0IGJmYV9mY3NfcyAgICAgIAkqZmNzOwkJLyogIGZjcyBpbnN0YW5jZSAgICAgICAgICovCisJc3RydWN0IGJmYV90aW1lcl9zIAl0aW1lcjsJCS8qICB0aW1lciBmdW5jdGlvbnMgICAgICAqLworCXN0cnVjdCBiZmFfaXRuaW1fcyAJKmJmYV9pdG5pbTsJLyogIEJGQSBpdG5pbSBzdHJ1Y3QgICAgICovCisJYmZhX2Jvb2xlYW5fdAkgCXNlcV9yZWM7CS8qICBzZXEgcmVjb3Zlcnkgc3VwcG9ydCAqLworCWJmYV9ib29sZWFuX3QJIAlyZWNfc3VwcG9ydDsJLyogIFJFQyBzdXBwb3J0ZWQgICAgICAgICovCisJYmZhX2Jvb2xlYW5fdAkgCWNvbmZfY29tcDsJLyogIEZDUF9DT05GICAgICBzdXBwb3J0ICovCisJYmZhX2Jvb2xlYW5fdAkgCXRhc2tfcmV0cnlfaWQ7CS8qICB0YXNrIHJldHJ5IGlkIHN1cHAgICAqLworCXN0cnVjdCBiZmFfZmN4cF93cWVfcyAJZmN4cF93cWU7CS8qICB3YWl0IHFlbGVtIGZvciBmY3hwICAqLworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOwkJLyogIEZDWFAgaW4gdXNlICAgICAgICAgICovCisJc3RydWN0IGJmYV9pdG5pbV9zdGF0c19zIAlzdGF0czsJLyogIGl0biBzdGF0aXN0aWNzICAgICAgICovCit9OworCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJmYWRfcG9ydF9zICoKK2JmYV9mY3NfaXRuaW1fZ2V0X2RydnBvcnQoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pCit7CisJcmV0dXJuIGl0bmltLT5ycG9ydC0+cG9ydC0+YmZhZF9wb3J0OworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJmYV9mY3NfcG9ydF9zICoKK2JmYV9mY3NfaXRuaW1fZ2V0X3BvcnQoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pCit7CisJcmV0dXJuIGl0bmltLT5ycG9ydC0+cG9ydDsKK30KKworCitzdGF0aWMgaW5saW5lIHd3bl90CitiZmFfZmNzX2l0bmltX2dldF9ud3duKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworCXJldHVybiBpdG5pbS0+cnBvcnQtPm53d247Cit9CisKKworc3RhdGljIGlubGluZSB3d25fdAorYmZhX2Zjc19pdG5pbV9nZXRfcHd3bihzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSkKK3sKKwlyZXR1cm4gaXRuaW0tPnJwb3J0LT5wd3duOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyCitiZmFfZmNzX2l0bmltX2dldF9mY2lkKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworCXJldHVybiBpdG5pbS0+cnBvcnQtPnBpZDsKK30KKworCitzdGF0aWMgaW5saW5lICAgdTMyCitiZmFfZmNzX2l0bmltX2dldF9tYXhmcnNpemUoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0pCit7CisJcmV0dXJuIGl0bmltLT5ycG9ydC0+bWF4ZnJzaXplOworfQorCisKK3N0YXRpYyBpbmxpbmUgICBlbnVtIGZjX2NvcworYmZhX2Zjc19pdG5pbV9nZXRfY29zKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworCXJldHVybiBpdG5pbS0+cnBvcnQtPmZjX2NvczsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBiZmFkX2l0bmltX3MgKgorYmZhX2Zjc19pdG5pbV9nZXRfZHJ2aXRuKHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltKQoreworCXJldHVybiBpdG5pbS0+aXRuaW1fZHJ2OworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJmYV9pdG5pbV9zICoKK2JmYV9mY3NfaXRuaW1fZ2V0X2hhbGl0bihzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSkKK3sKKwlyZXR1cm4gaXRuaW0tPmJmYV9pdG5pbTsKK30KKworLyoqCisgKiBiZmEgZmNzIEZDUCBJbml0aWF0b3IgbW9kZSBBUEkgZnVuY3Rpb25zCisgKi8KK3ZvaWQgYmZhX2Zjc19pdG5pbV9nZXRfYXR0cihzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJCXN0cnVjdCBiZmFfaXRuaW1fYXR0cl9zICphdHRyKTsKK3ZvaWQgYmZhX2Zjc19pdG5pbV9nZXRfc3RhdHMoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0sCisJCQlzdHJ1Y3QgYmZhX2l0bmltX3N0YXRzX3MgKnN0YXRzKTsKK3N0cnVjdCBiZmFfZmNzX2l0bmltX3MgKmJmYV9mY3NfaXRuaW1fbG9va3VwKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXd3bl90IHJwd3duKTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNzX2l0bmltX2F0dHJfZ2V0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3QgcnB3d24sCisJCQlzdHJ1Y3QgYmZhX2l0bmltX2F0dHJfcyAqYXR0cik7CitiZmFfc3RhdHVzX3QgYmZhX2Zjc19pdG5pbV9zdGF0c19nZXQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LCB3d25fdCBycHd3biwKKwkJCXN0cnVjdCBiZmFfaXRuaW1fc3RhdHNfcyAqc3RhdHMpOworYmZhX3N0YXR1c190IGJmYV9mY3NfaXRuaW1fc3RhdHNfY2xlYXIoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJd3duX3QgcnB3d24pOworI2VuZGlmIC8qIF9fQkZBX0ZDU19GQ1BJTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc19mZG1pLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfZmRtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDFmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfZmRtaS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgYmZhX2Zjc19mZG1pLmggQkZBIGZjcyBmZG1pIG1vZHVsZSBwdWJsaWMgaW50ZXJmYWNlCisgKi8KKworI2lmbmRlZiBfX0JGQV9GQ1NfRkRNSV9IX18KKyNkZWZpbmUgX19CRkFfRkNTX0ZETUlfSF9fCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorI2luY2x1ZGUgPHByb3RvY29sL2ZkbWkuaD4KKworI2RlZmluZQlCRkFfRkNTX0ZETUlfU1VQT1JURURfU1BFRURTICAoRkRNSV9UUkFOU19TUEVFRF8xRyAgfCBcCisJCQkJCUZETUlfVFJBTlNfU1BFRURfMkcgfCBcCisJCQkJCUZETUlfVFJBTlNfU1BFRURfNEcgfCBcCisJCQkJCUZETUlfVFJBTlNfU1BFRURfOEcpCisKKy8qCisqIEhCQSBBdHRyaWJ1dGUgQmxvY2sgOiBCRkEgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIE5vdGUgOiBTb21lIHZhcmlhYmxlCisqIHNpemVzIGhhdmUgYmVlbiB0cmltbWVkIHRvIHN1aXQgQkZBIEZvciBFeCA6IE1vZGVsIHdpbGwgYmUgIkJyb2NhZGUiLiBCYXNlZAorICogb24gdGhpcyB0aGUgc2l6ZSBoYXMgYmVlbiByZWR1Y2VkIHRvIDE2IGJ5dGVzIGZyb20gdGhlIHN0YW5kYXJkJ3MgNjQgYnl0ZXMuCisgKi8KK3N0cnVjdCBiZmFfZmNzX2ZkbWlfaGJhX2F0dHJfcyB7CisJd3duX3QgICAgICAgICAgIG5vZGVfbmFtZTsKKwl1OCAgICAgICAgIG1hbnVmYWN0dXJlcls2NF07CisJdTggICAgICAgICBzZXJpYWxfbnVtWzY0XTsKKwl1OCAgICAgICAgIG1vZGVsWzE2XTsKKwl1OCAgICAgICAgIG1vZGVsX2Rlc2NbMjU2XTsKKwl1OCAgICAgICAgIGh3X3ZlcnNpb25bOF07CisJdTggICAgICAgICBkcml2ZXJfdmVyc2lvbls4XTsKKwl1OCAgICAgICAgIG9wdGlvbl9yb21fdmVyW0JGQV9WRVJTSU9OX0xFTl07CisJdTggICAgICAgICBmd192ZXJzaW9uWzhdOworCXU4ICAgICAgICAgb3NfbmFtZVsyNTZdOworCXUzMiAgICAgICAgbWF4X2N0X3B5bGQ7Cit9OworCisvKgorICogUG9ydCBBdHRyaWJ1dGUgQmxvY2sKKyAqLworc3RydWN0IGJmYV9mY3NfZmRtaV9wb3J0X2F0dHJfcyB7CisJdTggICAgICAgICBzdXBwX2ZjNF90eXBlc1szMl07CS8qIHN1cHBvcnRlZCBGQzQgdHlwZXMgKi8KKwl1MzIgICAgICAgIHN1cHBfc3BlZWQ7CS8qIHN1cHBvcnRlZCBzcGVlZCAqLworCXUzMiAgICAgICAgY3Vycl9zcGVlZDsJLyogY3VycmVudCBTcGVlZCAqLworCXUzMiAgICAgICAgbWF4X2ZybV9zaXplOwkvKiBtYXggZnJhbWUgc2l6ZSAqLworCXU4ICAgICAgICAgb3NfZGV2aWNlX25hbWVbMjU2XTsJLyogT1MgZGV2aWNlIE5hbWUgKi8KKwl1OCAgICAgICAgIGhvc3RfbmFtZVsyNTZdOwkvKiBob3N0IG5hbWUgKi8KK307CisKKyNlbmRpZiAvKiBfX0JGQV9GQ1NfRkRNSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc19scG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX2xwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1Y2JhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc19scG9ydC5oCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIGJmYV9mY3NfcG9ydC5oIEJGQSBmY3MgcG9ydCBtb2R1bGUgcHVibGljIGludGVyZmFjZQorICovCisKKyNpZm5kZWYgX19CRkFfRkNTX1BPUlRfSF9fCisjZGVmaW5lIF9fQkZBX0ZDU19QT1JUX0hfXworCisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19zdGF0dXMuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3BvcnQuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Bwb3J0Lmg+CisjaW5jbHVkZSA8ZGVmcy9iZmFfZGVmc19ycG9ydC5oPgorI2luY2x1ZGUgPGNzL2JmYV9xLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgPGNzL2JmYV93Yy5oPgorCitzdHJ1Y3QgYmZhX2Zjc19zOworc3RydWN0IGJmYV9mY3NfZmFicmljX3M7CisKKy8qCisqIEB0b2RvIDogbmVlZCB0byBtb3ZlIHRvIGEgZ2xvYmFsIGNvbmZpZyBmaWxlLgorICogTWF4aW11bSBWcG9ydHMgc3VwcG9ydGVkIHBlciBwaHlzaWNhbCBwb3J0IG9yIHZmLgorICovCisjZGVmaW5lIEJGQV9GQ1NfTUFYX1ZQT1JUU19TVVBQX0NCICAyNTUKKyNkZWZpbmUgQkZBX0ZDU19NQVhfVlBPUlRTX1NVUFBfQ1QgIDE5MQorCisvKgorKiBAdG9kbyA6IG5lZWQgdG8gbW92ZSB0byBhIGdsb2JhbCBjb25maWcgZmlsZS4KKyAqIE1heGltdW0gUnBvcnRzIHN1cHBvcnRlZCBwZXIgcG9ydCAocGh5c2ljYWwvbG9naWNhbCkuCisgKi8KKyNkZWZpbmUgQkZBX0ZDU19NQVhfUlBPUlRTX1NVUFAgIDI1NgkvKiBAdG9kbyA6IHRlbnRhdGl2ZSB2YWx1ZSAqLworCisKK3N0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyB7CisJYmZhX3NtX3QgICAgICAgIHNtOwkJLyogIHN0YXRlIG1hY2hpbmUgKi8KKwlzdHJ1Y3QgYmZhX3RpbWVyX3MgdGltZXI7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0OwkvKiAgcGFyZW50IHBvcnQgKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKwlzdHJ1Y3QgYmZhX2ZjeHBfd3FlX3MgZmN4cF93cWU7Cit9OworCisKK3N0cnVjdCBiZmFfZmNzX3BvcnRfc2NuX3MgeworCWJmYV9zbV90ICAgICAgICBzbTsJCS8qICBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IGJmYV90aW1lcl9zIHRpbWVyOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydDsJLyogIHBhcmVudCBwb3J0ICovCisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJc3RydWN0IGJmYV9mY3hwX3dxZV9zIGZjeHBfd3FlOworfTsKKworCitzdHJ1Y3QgYmZhX2Zjc19wb3J0X2ZkbWlfcyB7CisJYmZhX3NtX3QgICAgICAgIHNtOwkJLyogIHN0YXRlIG1hY2hpbmUgKi8KKwlzdHJ1Y3QgYmZhX3RpbWVyX3MgdGltZXI7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptczsJLyogIHBhcmVudCBtcyAqLworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXN0cnVjdCBiZmFfZmN4cF93cWVfcyBmY3hwX3dxZTsKKwl1OCAgICAgICAgIHJldHJ5X2NudDsJLyogIHJldHJ5IGNvdW50ICovCisJdTgJIAkgICByc3ZkWzNdOworfTsKKworCitzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgeworCWJmYV9zbV90ICAgICAgICBzbTsJCS8qICBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IGJmYV90aW1lcl9zIHRpbWVyOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydDsJLyogIHBhcmVudCBwb3J0ICovCisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJc3RydWN0IGJmYV9mY3hwX3dxZV9zIGZjeHBfd3FlOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfZmRtaV9zIGZkbWk7CS8qICBGRE1JIGNvbXBvbmVudCBvZiBNUyAqLworCXU4ICAgICAgICAgcmV0cnlfY250OwkvKiAgcmV0cnkgY291bnQgKi8KKwl1OAkgCSAgIHJzdmRbM107Cit9OworCisKK3N0cnVjdCBiZmFfZmNzX3BvcnRfZmFiX3MgeworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyBuczsJLyogIE5TIGNvbXBvbmVudCBvZiBwb3J0ICovCisJc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyBzY247CS8qICBzY24gY29tcG9uZW50IG9mIHBvcnQgKi8KKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgbXM7CS8qICBNUyBjb21wb25lbnQgb2YgcG9ydCAqLworfTsKKworCisKKyNkZWZpbmUgCU1BWF9BTFBBX0NPVU5UIAkJMTI3CisKK3N0cnVjdCBiZmFfZmNzX3BvcnRfbG9vcF9zIHsKKwl1OCAgICAgICAgIG51bV9hbHBhOwkvKiAgTnVtIG9mIEFMUEEgZW50cmllcyBpbiB0aGUgbWFwICovCisJdTggICAgICAgICBhbHBhX3Bvc19tYXBbTUFYX0FMUEFfQ09VTlRdOwkvKiAgQUxQQSBQb3NpdGlvbmFsCisJCQkJCQkJICpNYXAgKi8KKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQ7CS8qICBwYXJlbnQgcG9ydCAqLworfTsKKworCisKK3N0cnVjdCBiZmFfZmNzX3BvcnRfbjJuX3MgeworCXUzMiAgICAgICAgcnN2ZDsKKwl1MTYgICAgICAgIHJlcGx5X294aWQ7CS8qICBveF9pZCBmcm9tIHRoZSByZXEgZmxvZ2kgdG8gYmUKKwkJCQkJICp1c2VkIGluIGZsb2dpIGFjYyAqLworCXd3bl90ICAgICAgICAgICByZW1fcG9ydF93d247CS8qICBBdHRhY2hlZCBwb3J0J3Mgd3duICovCit9OworCisKK3VuaW9uIGJmYV9mY3NfcG9ydF90b3BvX3UgeworCXN0cnVjdCBiZmFfZmNzX3BvcnRfZmFiX3MgcGZhYjsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X2xvb3BfcyBwbG9vcDsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X24ybl9zIHBuMm47Cit9OworCisKK3N0cnVjdCBiZmFfZmNzX3BvcnRfcyB7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgIHFlOwkvKiAgdXNlZCBieSBwb3J0L3Zwb3J0ICovCisJYmZhX3NtX3QgICAgICAgICAgICAgICBzbTsJLyogIHN0YXRlIG1hY2hpbmUgKi8KKwlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljOwkvKiAgcGFyZW50IGZhYnJpYyAqLworCXN0cnVjdCBiZmFfcG9ydF9jZmdfcyAgcG9ydF9jZmc7CS8qICBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3QgYmZhX3RpbWVyX3MgbGlua190aW1lcjsJLyogIHRpbWVyIGZvciBsaW5rIG9mZmxpbmUgKi8KKwl1MzIgICAgICAgIHBpZCA6IDI0OwkvKiAgRkMgYWRkcmVzcyAqLworCXU4ICAgICAgICAgbHBfdGFnOwkJLyogIGxwb3J0IHRhZyAqLworCXUxNiAgICAgICAgbnVtX3Jwb3J0czsJLyogIE51bSBvZiByLXBvcnRzICovCisJc3RydWN0IGxpc3RfaGVhZCBycG9ydF9xOwkvKiAgcXVldWUgb2YgZGlzY292ZXJlZCByLXBvcnRzICovCisJc3RydWN0IGJmYV9mY3NfcyAqZmNzOwkvKiAgRkNTIGluc3RhbmNlICovCisJdW5pb24gYmZhX2Zjc19wb3J0X3RvcG9fdSBwb3J0X3RvcG87CS8qICBmYWJyaWMvbG9vcC9uMm4gZGV0YWlscyAqLworCXN0cnVjdCBiZmFkX3BvcnRfcyAqYmZhZF9wb3J0OwkvKiAgZHJpdmVyIHBlZXIgaW5zdGFuY2UgKi8KKwlzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydDsJLyogIE5VTEwgZm9yIGJhc2UgcG9ydHMgKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKwlzdHJ1Y3QgYmZhX2ZjeHBfd3FlX3MgZmN4cF93cWU7CisJc3RydWN0IGJmYV9wb3J0X3N0YXRzX3Mgc3RhdHM7CisJc3RydWN0IGJmYV93Y19zICAgICAgICB3YzsJLyogIHdhaXRpbmcgY291bnRlciBmb3IgZXZlbnRzICovCit9OworCisjZGVmaW5lIGJmYV9mY3NfbHBvcnRfdCBzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MKKworLyoqCisgKiBTeW1ib2xpYyBOYW1lIHJlbGF0ZWQgZGVmaW5lcworICogIFRvdGFsIGJ5dGVzIDI1NS4KKyAqICBQaHlzaWNhbCBQb3J0J3Mgc3ltYm9saWMgbmFtZSAxMjggYnl0ZXMuCisgKiAgRm9yIFZwb3J0cywgVnBvcnQncyBzeW1ib2xpYyBuYW1lIGlzIGFwcGVuZGVkIHRvIHRoZSBQaHlzaWNhbCBwb3J0J3MKKyAqICBTeW1ib2xpYyBOYW1lLgorICoKKyAqICBQaHlzaWNhbCBQb3J0J3Mgc3ltYm9saWMgbmFtZSBGb3JtYXQgOiAoVG90YWwgMTI4IGJ5dGVzKQorICogIEFkYXB0ZXIgTW9kZWwgbnVtYmVyL25hbWUgOiAxMiBieXRlcworICogIERyaXZlciBWZXJzaW9uICAgICA6IDEwIGJ5dGVzCisgKiAgSG9zdCBNYWNoaW5lIE5hbWUgIDogMzAgYnl0ZXMKKyAqIAlIb3N0IE9TIEluZm8JICAgOiA0OCBieXRlcworICogCUhvc3QgT1MgUEFUQ0ggSW5mbyA6IDE2IGJ5dGVzCisgKiAgKCByZW1haW5pbmcgMTIgYnl0ZXMgcmVzZXJ2ZWQgdG8gYmUgdXNlZCBmb3Igc2VwYXJhdG9yKQorICovCisjZGVmaW5lIEJGQV9GQ1NfUE9SVF9TWU1CTkFNRV9TRVBBUkFUT1IgCQkiIHwgIgorCisjZGVmaW5lIEJGQV9GQ1NfUE9SVF9TWU1CTkFNRV9NT0RFTF9TWgkJCTEyCisjZGVmaW5lIEJGQV9GQ1NfUE9SVF9TWU1CTkFNRV9WRVJTSU9OX1NaIAkJMTAKKyNkZWZpbmUgQkZBX0ZDU19QT1JUX1NZTUJOQU1FX01BQ0hJTkVOQU1FX1NaIAkzMAorI2RlZmluZSBCRkFfRkNTX1BPUlRfU1lNQk5BTUVfT1NJTkZPX1NaCQkJNDgKKyNkZWZpbmUgQkZBX0ZDU19QT1JUX1NZTUJOQU1FX09TUEFUQ0hfU1oJCTE2CisKKy8qKgorICogR2V0IEZDIHBvcnQgSUQgZm9yIGEgbG9naWNhbCBwb3J0LgorICovCisjZGVmaW5lIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChfbHBvcnQpCSgoX2xwb3J0KS0+cGlkKQorI2RlZmluZSBiZmFfZmNzX3BvcnRfZ2V0X3B3d24oX2xwb3J0KQkoKF9scG9ydCktPnBvcnRfY2ZnLnB3d24pCisjZGVmaW5lIGJmYV9mY3NfcG9ydF9nZXRfbnd3bihfbHBvcnQpCSgoX2xwb3J0KS0+cG9ydF9jZmcubnd3bikKKyNkZWZpbmUgYmZhX2Zjc19wb3J0X2dldF9wc3ltX25hbWUoX2xwb3J0KQkoKF9scG9ydCktPnBvcnRfY2ZnLnN5bV9uYW1lKQorI2RlZmluZSBiZmFfZmNzX3BvcnRfaXNfaW5pdGlhdG9yKF9scG9ydCkJXAorCQkJKChfbHBvcnQpLT5wb3J0X2NmZy5yb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX0lNKQorI2RlZmluZSBiZmFfZmNzX3BvcnRfaXNfdGFyZ2V0KF9scG9ydCkJXAorCQkJKChfbHBvcnQpLT5wb3J0X2NmZy5yb2xlcyAmIEJGQV9QT1JUX1JPTEVfRkNQX1RNKQorI2RlZmluZSBiZmFfZmNzX3BvcnRfZ2V0X25ycG9ydHMoX2xwb3J0KQlcCisJCQkoKF9scG9ydCkgPyAoX2xwb3J0KS0+bnVtX3Jwb3J0cyA6IDApCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJmYWRfcG9ydF9zICoKK2JmYV9mY3NfcG9ydF9nZXRfZHJ2cG9ydChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJcmV0dXJuIHBvcnQtPmJmYWRfcG9ydDsKK30KKworCisjZGVmaW5lIGJmYV9mY3NfcG9ydF9nZXRfb3BlcnR5cGUoX2xwb3J0KQkoX2xwb3J0KS0+ZmFicmljLT5vcGVyX3R5cGUKKworCisjZGVmaW5lIGJmYV9mY3NfcG9ydF9nZXRfZmFicmljX25hbWUoX2xwb3J0KQkoX2xwb3J0KS0+ZmFicmljLT5mYWJyaWNfbmFtZQorCisKKyNkZWZpbmUgYmZhX2Zjc19wb3J0X2dldF9mYWJyaWNfaXBhZGRyKF9scG9ydCkJKF9scG9ydCktPmZhYnJpYy0+ZmFicmljX2lwX2FkZHIKKworLyoqCisgKiBiZmEgZmNzIHBvcnQgcHVibGljIGZ1bmN0aW9ucworICovCit2b2lkIGJmYV9mY3NfY2ZnX2Jhc2VfcG9ydChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsCisJCQlzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBvcnRfY2ZnKTsKK3N0cnVjdCBiZmFfZmNzX3BvcnRfcyAqYmZhX2Zjc19nZXRfYmFzZV9wb3J0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7Cit2b2lkIGJmYV9mY3NfcG9ydF9nZXRfcnBvcnRzKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXd3bl90IHJwb3J0X3d3bnNbXSwgaW50ICpucnBvcnRzKTsKKword3duX3QgYmZhX2Zjc19wb3J0X2dldF9ycG9ydChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHd3bl90IHd3biwKKwkJCWludCBpbmRleCwgaW50IG5ycG9ydHMsIGJmYV9ib29sZWFuX3QgYnd3bik7CisKK3N0cnVjdCBiZmFfZmNzX3BvcnRfcyAqYmZhX2Zjc19sb29rdXBfcG9ydChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsCisJCQl1MTYgdmZfaWQsIHd3bl90IGxwd3duKTsKKwordm9pZCBiZmFfZmNzX3BvcnRfZ2V0X2luZm8oc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJc3RydWN0IGJmYV9wb3J0X2luZm9fcyAqcG9ydF9pbmZvKTsKK3ZvaWQgYmZhX2Zjc19wb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXN0cnVjdCBiZmFfcG9ydF9hdHRyX3MgKnBvcnRfYXR0cik7Cit2b2lkIGJmYV9mY3NfcG9ydF9nZXRfc3RhdHMoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpmY3NfcG9ydCwKKwkJCXN0cnVjdCBiZmFfcG9ydF9zdGF0c19zICpwb3J0X3N0YXRzKTsKK3ZvaWQgYmZhX2Zjc19wb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqZmNzX3BvcnQpOworZW51bSBiZmFfcHBvcnRfc3BlZWQgYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9tYXhfc3BlZWQoCisJCQlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOwordm9pZCBiZmFfZmNzX3BvcnRfZW5hYmxlX2lwZmNfcm9sZXMoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpmY3NfcG9ydCk7Cit2b2lkIGJmYV9mY3NfcG9ydF9kaXNhYmxlX2lwZmNfcm9sZXMoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpmY3NfcG9ydCk7CisKKyNlbmRpZiAvKiBfX0JGQV9GQ1NfUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc19ycG9ydC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX3Jwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyYjk1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9mY3MvYmZhX2Zjc19ycG9ydC5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19CRkFfRkNTX1JQT1JUX0hfXworI2RlZmluZSBfX0JGQV9GQ1NfUlBPUlRfSF9fCisKKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3N0YXR1cy5oPgorI2luY2x1ZGUgPGNzL2JmYV9xLmg+CisjaW5jbHVkZSA8ZmNzL2JmYV9mY3MuaD4KKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3Jwb3J0Lmg+CisKKyNkZWZpbmUgQkZBX0ZDU19SUE9SVF9ERUZfREVMX1RJTUVPVVQgCTkwIAkvKiBpbiBzZWNzICovCisvKgorICogZm9yd2FyZCBkZWNsYXJhdGlvbnMKKyAqLworc3RydWN0IGJmYWRfcnBvcnRfczsKKworc3RydWN0IGJmYV9mY3NfaXRuaW1fczsKK3N0cnVjdCBiZmFfZmNzX3Rpbl9zOworc3RydWN0IGJmYV9mY3NfaXBycF9zOworCisvKiBScG9ydCBGZWF0dXJlcyAoUlBGKSAqLworc3RydWN0IGJmYV9mY3NfcnBmX3MgeworCWJmYV9zbV90ICAgICAgICAgICAgICAgc207CS8qICBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQ7CS8qICBwYXJlbnQgcnBvcnQgKi8KKwlzdHJ1Y3QgYmZhX3RpbWVyX3MgCXRpbWVyOwkvKiAgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisJc3RydWN0IGJmYV9mY3hwX3MgCSpmY3hwOwkvKiAgRkNYUCBuZWVkZWQgZm9yIGRpc2NhcmRpbmcgKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfd3FlX3MgCWZjeHBfd3FlOwkvKiAgZmN4cCB3YWl0IHF1ZXVlIGVsZW1lbnQgKi8KKwlpbnQgICAgICAgICAgICAgCXJwc2NfcmV0cmllczsJLyogIG1heCBSUFNDIHJldHJ5IGF0dGVtcHRzICovCisJZW51bSBiZmFfcHBvcnRfc3BlZWQgCXJwc2Nfc3BlZWQ7CS8qIEN1cnJlbnQgU3BlZWQgZnJvbSBSUFNDLgorCQkJCQkJICogTyBpZiBSUFNDIGZhaWxzICovCisJZW51bSBiZmFfcHBvcnRfc3BlZWQJYXNzaWduZWRfc3BlZWQ7CS8qIFNwZWVkIGFzc2lnbmVkIGJ5IHRoZSB1c2VyLgorCQkJCQkJICogd2lsbCBiZSB1c2VkIGlmIFJQU0MgaXMgbm90CisJCQkJCQkgKiBzdXBwb3J0ZWQgYnkgdGhlIHJwb3J0ICovCit9OworCitzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgcWU7CS8qICB1c2VkIGJ5IHBvcnQvdnBvcnQgKi8KKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQ7CS8qICBwYXJlbnQgRkNTIHBvcnQgKi8KKwlzdHJ1Y3QgYmZhX2Zjc19zICAgICAgKmZjczsJLyogIGZjcyBpbnN0YW5jZSAqLworCXN0cnVjdCBiZmFkX3Jwb3J0X3MgICAqcnBfZHJ2OwkvKiAgZHJpdmVyIHBlZXIgaW5zdGFuY2UgKi8KKwl1MzIgICAgICAgIHBpZDsJLyogIHBvcnQgSUQgb2YgcnBvcnQgKi8KKwl1MTYgICAgICAgIG1heGZyc2l6ZTsJLyogIG1heGltdW0gZnJhbWUgc2l6ZSAqLworCXUxNiAgICAgICAgcmVwbHlfb3hpZDsJLyogIE9YX0lEIG9mIGluYm91bmQgcmVxdWVzdHMgKi8KKwllbnVtIGZjX2NvcyAgICAgICAgZmNfY29zOwkvKiAgRkMgY2xhc3NlcyBvZiBzZXJ2aWNlIHN1cHAgKi8KKwliZmFfYm9vbGVhbl90ICAgY2lzYzsJLyogIENJU0MgY2FwYWJsZSBkZXZpY2UgKi8KKwl3d25fdCAgICAgICAgICAgcHd3bjsJLyogIHBvcnQgd3duIG9mIHJwb3J0ICovCisJd3duX3QgICAgICAgICAgIG53d247CS8qICBub2RlIHd3biBvZiBycG9ydCAqLworCXN0cnVjdCBiZmFfcnBvcnRfc3ltbmFtZV9zIHBzeW1fbmFtZTsgLyogIHBvcnQgc3ltYm9saWMgbmFtZSAgKi8KKwliZmFfc21fdCAgICAgICAgc207CQkvKiAgc3RhdGUgbWFjaGluZSAqLworCXN0cnVjdCBiZmFfdGltZXJfcyB0aW1lcjsJLyogIGdlbmVyYWwgcHVycG9zZSB0aW1lciAqLworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltOwkvKiAgSVROIGluaXRpYXRvciBtb2RlIHJvbGUgKi8KKwlzdHJ1Y3QgYmZhX2Zjc190aW5fcyAqdGluOwkvKiAgSVROIGluaXRpYXRvciBtb2RlIHJvbGUgKi8KKwlzdHJ1Y3QgYmZhX2Zjc19pcHJwX3MgKmlwcnA7CS8qICBJUC9GQyByb2xlICovCisJc3RydWN0IGJmYV9ycG9ydF9zICpiZmFfcnBvcnQ7CS8qICBCRkEgUnBvcnQgKi8KKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsJLyogIEZDWFAgbmVlZGVkIGZvciBkaXNjYXJkaW5nICovCisJaW50ICAgICAgICAgICAgIHBsb2dpX3JldHJpZXM7CS8qICBtYXggcGxvZ2kgcmV0cnkgYXR0ZW1wdHMgKi8KKwlpbnQgICAgICAgICAgICAgbnNfcmV0cmllczsJLyogIG1heCBOUyBxdWVyeSByZXRyeSBhdHRlbXB0cyAqLworCXN0cnVjdCBiZmFfZmN4cF93cWVfcyAJZmN4cF93cWU7IC8qICBmY3hwIHdhaXQgcXVldWUgZWxlbWVudCAqLworCXN0cnVjdCBiZmFfcnBvcnRfc3RhdHNfcyBzdGF0czsJLyogIHJwb3J0IHN0YXRzICovCisJZW51bSBiZmFfcnBvcnRfZnVuY3Rpb24Jc2NzaV9mdW5jdGlvbjsgIC8qICBJbml0aWF0b3IvVGFyZ2V0ICovCisJc3RydWN0IGJmYV9mY3NfcnBmX3MgcnBmOyAJLyogUnBvcnQgZmVhdHVyZXMgbW9kdWxlICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBiZmFfcnBvcnRfcyAqCitiZmFfZmNzX3Jwb3J0X2dldF9oYWxycG9ydChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwlyZXR1cm4gcnBvcnQtPmJmYV9ycG9ydDsKK30KKworLyoqCisgKiBiZmEgZmNzIHJwb3J0IEFQSSBmdW5jdGlvbnMKKyAqLworYmZhX3N0YXR1c190IGJmYV9mY3NfcnBvcnRfYWRkKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3QgKnB3d24sCisJCQlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCXN0cnVjdCBiZmFkX3Jwb3J0X3MgKnJwb3J0X2Rydik7CitiZmFfc3RhdHVzX3QgYmZhX2Zjc19ycG9ydF9yZW1vdmUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOwordm9pZCBiZmFfZmNzX3Jwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJc3RydWN0IGJmYV9ycG9ydF9hdHRyX3MgKmF0dHIpOwordm9pZCBiZmFfZmNzX3Jwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCXN0cnVjdCBiZmFfcnBvcnRfc3RhdHNfcyAqc3RhdHMpOwordm9pZCBiZmFfZmNzX3Jwb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK3N0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKmJmYV9mY3NfcnBvcnRfbG9va3VwKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCXd3bl90IHJwd3duKTsKK3N0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKmJmYV9mY3NfcnBvcnRfbG9va3VwX2J5X253d24oCisJCQlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHd3bl90IHJud3duKTsKK3ZvaWQgYmZhX2Zjc19ycG9ydF9zZXRfZGVsX3RpbWVvdXQodTggcnBvcnRfdG1vKTsKK3ZvaWQgYmZhX2Zjc19ycG9ydF9zZXRfc3BlZWQoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQllbnVtIGJmYV9wcG9ydF9zcGVlZCBzcGVlZCk7CisjZW5kaWYgLyogX19CRkFfRkNTX1JQT1JUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX3Zwb3J0LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvZmNzL2JmYV9mY3NfdnBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDMzZjJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2Zjcy9iZmFfZmNzX3Zwb3J0LmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFfZmNzX3Zwb3J0LmggQkZBIGZjcyB2cG9ydCBtb2R1bGUgcHVibGljIGludGVyZmFjZQorICovCisKKyNpZm5kZWYgX19CRkFfRkNTX1ZQT1JUX0hfXworI2RlZmluZSBfX0JGQV9GQ1NfVlBPUlRfSF9fCisKKyNpbmNsdWRlIDxkZWZzL2JmYV9kZWZzX3N0YXR1cy5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfcG9ydC5oPgorI2luY2x1ZGUgPGRlZnMvYmZhX2RlZnNfdnBvcnQuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjcy5oPgorI2luY2x1ZGUgPGZjYi9iZmFfZmNiX3Zwb3J0Lmg+CisKK3N0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgeworCXN0cnVjdCBsaXN0X2hlYWQJCXFlOwkJLyogIHF1ZXVlIGVsZW0JICovCisJYmZhX3NtX3QJCXNtOwkJLyogIHN0YXRlIG1hY2hpbmUJKi8KKwliZmFfZmNzX2xwb3J0X3QJCWxwb3J0OwkJLyogIGxvZ2ljYWwgcG9ydAkqLworCXN0cnVjdCBiZmFfdGltZXJfcwl0aW1lcjsJCS8qICBnZW5lcmFsIHB1cnBvc2UgdGltZXIgKi8KKwlzdHJ1Y3QgYmZhZF92cG9ydF9zCSp2cG9ydF9kcnY7CS8qICBEcml2ZXIgcHJpdmF0ZQkqLworCXN0cnVjdCBiZmFfdnBvcnRfc3RhdHNfcyB2cG9ydF9zdGF0czsJLyogIHZwb3J0IHN0YXRpc3RpY3MJKi8KKwlzdHJ1Y3QgYmZhX2xwc19zCSpscHM7CQkvKiAgTHBvcnQgbG9naW4gc2VydmljZSAqLworCWludAkJCWZkaXNjX3JldHJpZXM7Cit9OworCisjZGVmaW5lIGJmYV9mY3NfdnBvcnRfZ2V0X3BvcnQodnBvcnQpIFwKKwkJCSgoc3RydWN0IGJmYV9mY3NfcG9ydF9zICAqKSgmdnBvcnQtPnBvcnQpKQorCisvKioKKyAqIGJmYSBmY3MgdnBvcnQgcHVibGljIGZ1bmN0aW9ucworICovCitiZmFfc3RhdHVzX3QgYmZhX2Zjc192cG9ydF9jcmVhdGUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQlzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHUxNiB2Zl9pZCwKKwkJCXN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcG9ydF9jZmcsCisJCQlzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cG9ydF9kcnYpOworYmZhX3N0YXR1c190IGJmYV9mY3NfdnBvcnRfZGVsZXRlKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNzX3Zwb3J0X3N0YXJ0KHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNzX3Zwb3J0X3N0b3Aoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwordm9pZCBiZmFfZmNzX3Zwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJc3RydWN0IGJmYV92cG9ydF9hdHRyX3MgKnZwb3J0X2F0dHIpOwordm9pZCBiZmFfZmNzX3Zwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCXN0cnVjdCBiZmFfdnBvcnRfc3RhdHNfcyAqdnBvcnRfc3RhdHMpOwordm9pZCBiZmFfZmNzX3Zwb3J0X2Nscl9zdGF0cyhzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCk7CitzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICpiZmFfZmNzX3Zwb3J0X2xvb2t1cChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsCisJCQl1MTYgdmZfaWQsIHd3bl90IHZwd3duKTsKKworI2VuZGlmIC8qIF9fQkZBX0ZDU19WUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ19mY3MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ19mY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY1ZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2xvZy9iZmFfbG9nX2Zjcy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIG1lc3NhZ2VzIGRlZmluZSBmb3IgRkNTIE1vZHVsZQorICovCisjaWZuZGVmCV9fQkZBX0xPR19GQ1NfSF9fCisjZGVmaW5lCV9fQkZBX0xPR19GQ1NfSF9fCisjaW5jbHVkZSAgPGNzL2JmYV9sb2cuaD4KKyNkZWZpbmUgQkZBX0xPR19GQ1NfRkFCUklDX05PU1dJVENIIAlcCisJKCgodTMyKSBCRkFfTE9HX0ZDU19JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAxKQorI2RlZmluZSBCRkFfTE9HX0ZDU19GQUJSSUNfSVNPTEFURUQgCVwKKwkoKCh1MzIpIEJGQV9MT0dfRkNTX0lEIDw8IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSB8IDIpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ19oYWwuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ19oYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDEyYWVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2xvZy9iZmFfbG9nX2hhbC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogbWVzc2FnZXMgZGVmaW5lIGZvciBIQUwgTW9kdWxlICovCisjaWZuZGVmCV9fQkZBX0xPR19IQUxfSF9fCisjZGVmaW5lCV9fQkZBX0xPR19IQUxfSF9fCisjaW5jbHVkZSAgPGNzL2JmYV9sb2cuaD4KKyNkZWZpbmUgQkZBX0xPR19IQUxfQVNTRVJUIFwKKwkoKCh1MzIpIEJGQV9MT0dfSEFMX0lEIDw8IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSB8IDEpCisjZGVmaW5lIEJGQV9MT0dfSEFMX0hFQVJUQkVBVF9GQUlMVVJFIFwKKwkoKCh1MzIpIEJGQV9MT0dfSEFMX0lEIDw8IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSB8IDIpCisjZGVmaW5lIEJGQV9MT0dfSEFMX0ZDUElNX1BBUk1fSU5WQUxJRCBcCisJKCgodTMyKSBCRkFfTE9HX0hBTF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAzKQorI2RlZmluZSBCRkFfTE9HX0hBTF9TTV9BU1NFUlQgXAorCSgoKHUzMikgQkZBX0xPR19IQUxfSUQgPDwgQkZBX0xPR19NT0RJRF9PRkZTRVQpIHwgNCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2xvZy9iZmFfbG9nX2xpbnV4LmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvbG9nL2JmYV9sb2dfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTdjMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2xvZy9iZmFfbG9nX2xpbnV4LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBtZXNzYWdlcyBkZWZpbmUgZm9yIExJTlVYIE1vZHVsZSAqLworI2lmbmRlZglfX0JGQV9MT0dfTElOVVhfSF9fCisjZGVmaW5lCV9fQkZBX0xPR19MSU5VWF9IX18KKyNpbmNsdWRlICA8Y3MvYmZhX2xvZy5oPgorI2RlZmluZSBCRkFfTE9HX0xJTlVYX0RFVklDRV9DTEFJTUVEIFwKKwkJKCgodTMyKSBCRkFfTE9HX0xJTlVYX0lEIDw8IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSB8IDEpCisjZGVmaW5lIEJGQV9MT0dfTElOVVhfSEFTSF9JTklUX0ZBSUxFRCBcCisJCSgoKHUzMikgQkZBX0xPR19MSU5VWF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAyKQorI2RlZmluZSBCRkFfTE9HX0xJTlVYX1NZU0ZTX0ZBSUxFRCBcCisJCSgoKHUzMikgQkZBX0xPR19MSU5VWF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAzKQorI2RlZmluZSBCRkFfTE9HX0xJTlVYX01FTV9BTExPQ19GQUlMRUQgXAorCQkoKCh1MzIpIEJGQV9MT0dfTElOVVhfSUQgPDwgQkZBX0xPR19NT0RJRF9PRkZTRVQpIHwgNCkKKyNkZWZpbmUgQkZBX0xPR19MSU5VWF9EUklWRVJfUkVHSVNUUkFUSU9OX0ZBSUxFRCBcCisJCSgoKHUzMikgQkZBX0xPR19MSU5VWF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCA1KQorI2RlZmluZSBCRkFfTE9HX0xJTlVYX0lUTklNX0ZSRUUgXAorCQkoKCh1MzIpIEJGQV9MT0dfTElOVVhfSUQgPDwgQkZBX0xPR19NT0RJRF9PRkZTRVQpIHwgNikKKyNkZWZpbmUgQkZBX0xPR19MSU5VWF9JVE5JTV9PTkxJTkUgXAorCQkoKCh1MzIpIEJGQV9MT0dfTElOVVhfSUQgPDwgQkZBX0xPR19NT0RJRF9PRkZTRVQpIHwgNykKKyNkZWZpbmUgQkZBX0xPR19MSU5VWF9JVE5JTV9PRkZMSU5FIFwKKwkJKCgodTMyKSBCRkFfTE9HX0xJTlVYX0lEIDw8IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSB8IDgpCisjZGVmaW5lIEJGQV9MT0dfTElOVVhfU0NTSV9IT1NUX0ZSRUUgXAorCQkoKCh1MzIpIEJGQV9MT0dfTElOVVhfSUQgPDwgQkZBX0xPR19NT0RJRF9PRkZTRVQpIHwgOSkKKyNkZWZpbmUgQkZBX0xPR19MSU5VWF9TQ1NJX0FCT1JUIFwKKwkJKCgodTMyKSBCRkFfTE9HX0xJTlVYX0lEIDw8IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSB8IDEwKQorI2RlZmluZSBCRkFfTE9HX0xJTlVYX1NDU0lfQUJPUlRfQ09NUCBcCisJCSgoKHUzMikgQkZBX0xPR19MSU5VWF9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAxMSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL2xvZy9iZmFfbG9nX3dkcnYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ193ZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5YTk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9sb2cvYmZhX2xvZ193ZHJ2LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogbWVzc2FnZXMgZGVmaW5lIGZvciBXRFJWIE1vZHVsZQorICovCisjaWZuZGVmCV9fQkZBX0xPR19XRFJWX0hfXworI2RlZmluZQlfX0JGQV9MT0dfV0RSVl9IX18KKyNpbmNsdWRlICA8Y3MvYmZhX2xvZy5oPgorI2RlZmluZSBCRkFfTE9HX1dEUlZfSU9DX0lOSVRfRVJST1IgCVwKKwkoKCh1MzIpIEJGQV9MT0dfV0RSVl9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAxKQorI2RlZmluZSBCRkFfTE9HX1dEUlZfSU9DX0lOVEVSTkFMX0VSUk9SIFwKKwkoKCh1MzIpIEJGQV9MT0dfV0RSVl9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCAyKQorI2RlZmluZSBCRkFfTE9HX1dEUlZfSU9DX1NUQVJUX0VSUk9SIAlcCisJKCgodTMyKSBCRkFfTE9HX1dEUlZfSUQgPDwgQkZBX0xPR19NT0RJRF9PRkZTRVQpIHwgMykKKyNkZWZpbmUgQkZBX0xPR19XRFJWX0lPQ19TVE9QX0VSUk9SIAlcCisJKCgodTMyKSBCRkFfTE9HX1dEUlZfSUQgPDwgQkZBX0xPR19NT0RJRF9PRkZTRVQpIHwgNCkKKyNkZWZpbmUgQkZBX0xPR19XRFJWX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgXAorCSgoKHUzMikgQkZBX0xPR19XRFJWX0lEIDw8IEJGQV9MT0dfTU9ESURfT0ZGU0VUKSB8IDUpCisjZGVmaW5lIEJGQV9MT0dfV0RSVl9CQVNFX0FERFJFU1NfTUFQX0VSUk9SIFwKKwkoKCh1MzIpIEJGQV9MT0dfV0RSVl9JRCA8PCBCRkFfTE9HX01PRElEX09GRlNFVCkgfCA2KQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvY3QuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9wcm90b2NvbC9jdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OWQ2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvY3QuaApAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ1RfSF9fCisjZGVmaW5lIF9fQ1RfSF9fCisKKyNpbmNsdWRlIDxwcm90b2NvbC90eXBlcy5oPgorCisjcHJhZ21hIHBhY2soMSkKKworc3RydWN0IGN0X2hkcl9zeworCXUzMglyZXZfaWQ6ODsJLyogUmV2aXNpb24gb2YgdGhlIENUICovCisJdTMyCWluX2lkOjI0OwkvKiBJbml0aWF0b3IgSWQgKi8KKwl1MzIJZ3NfdHlwZTo4OwkvKiBHZW5lcmljIHNlcnZpY2UgVHlwZSAqLworCXUzMglnc19zdWJfdHlwZTo4OwkvKiBHZW5lcmljIHNlcnZpY2Ugc3ViIHR5cGUgKi8KKwl1MzIJb3B0aW9uczo4OwkvKiBvcHRpb25zICovCisJdTMyCXJzdnJkOjg7CS8qIHJlc2VydmVkICovCisJdTMyCWNtZF9yc3BfY29kZToxNjsvKiBjdCBjb21tYW5kL3Jlc3BvbnNlIGNvZGUgKi8KKwl1MzIJbWF4X3Jlc19zaXplOjE2Oy8qIG1heGltdW0vcmVzaWR1YWwgc2l6ZSAqLworCXUzMglmcmFnX2lkOjg7CS8qIGZyYWdtZW50IElEICovCisJdTMyCXJlYXNvbl9jb2RlOjg7CS8qIHJlYXNvbiBjb2RlICovCisJdTMyCWV4cF9jb2RlOjg7CS8qIGV4cGxhbmF0aW9uIGNvZGUgKi8KKwl1MzIJdmVuZG9yX3VucTo4OwkvKiB2ZW5kb3IgdW5pcXVlICovCit9OworCisvKgorICogZGVmaW5lcyBmb3IgdGhlIFJldmlzaW9uCisgKi8KK2VudW0geworCUNUX0dTM19SRVZJU0lPTiA9IDB4MDEsCit9OworCisvKgorICogZGVmaW5lcyBmb3IgZ3NfdHlwZQorICovCitlbnVtIHsKKwlDVF9HU1RZUEVfS0VZU0VSVklDRQk9IDB4RjcsCisJQ1RfR1NUWVBFX0FMSUFTU0VSVklDRQk9IDB4RjgsCisJQ1RfR1NUWVBFX01HTVRTRVJWSUNFCT0gMHhGQSwKKwlDVF9HU1RZUEVfVElNRVNFUlZJQ0UJPSAweEZCLAorCUNUX0dTVFlQRV9ESVJTRVJWSUNFCT0gMHhGQywKK307CisKKy8qCisgKiBkZWZpbmVzIGZvciBnc19zdWJfdHlwZSBmb3IgZ3MgdHlwZSBkaXJlY3Rvcnkgc2VydmljZQorICovCitlbnVtIHsKKwlDVF9HU1NVQlRZUEVfTkFNRVNFUlZFUiA9IDB4MDIsCit9OworCisvKgorICogZGVmaW5lcyBmb3IgZ3Nfc3ViX3R5cGUgZm9yIGdzIHR5cGUgbWFuYWdlbWVudCBzZXJ2aWNlCisgKi8KK2VudW0geworCUNUX0dTU1VCVFlQRV9DRkdTRVJWRVIJPSAweDAxLAorCUNUX0dTU1VCVFlQRV9VTlpPTkVEX05TID0gMHgwMiwKKwlDVF9HU1NVQlRZUEVfWk9ORVNFUlZFUiA9IDB4MDMsCisJQ1RfR1NTVUJUWVBFX0xPQ0tTRVJWRVIgPSAweDA0LAorCUNUX0dTU1VCVFlQRV9IQkFfTUdNVFNFUlZFUiA9IDB4MTAsCS8qIGZvciBGRE1JICovCit9OworCisvKgorICogZGVmaW5lcyBmb3IgQ1QgcmVzcG9uc2UgY29kZSBmaWVsZAorICovCitlbnVtIHsKKwlDVF9SU1BfUkVKRUNUID0gMHg4MDAxLAorCUNUX1JTUF9BQ0NFUFQgPSAweDgwMDIsCit9OworCisvKgorICogZGVmaW50aW9ucyBmb3IgQ1QgcmVhc29uIGNvZGUKKyAqLworZW51bSB7CisJQ1RfUlNOX0lOVl9DTUQJCT0gMHgwMSwKKwlDVF9SU05fSU5WX1ZFUgkJPSAweDAyLAorCUNUX1JTTl9MT0dJQ19FUlIJPSAweDAzLAorCUNUX1JTTl9JTlZfU0laRQkJPSAweDA0LAorCUNUX1JTTl9MT0dJQ0FMX0JVU1kJPSAweDA1LAorCUNUX1JTTl9QUk9UT19FUlIJPSAweDA3LAorCUNUX1JTTl9VTkFCTEVfVE9fUEVSRgk9IDB4MDksCisJQ1RfUlNOX05PVF9TVVBQCQkJPSAweDBCLAorCUNUX1JTTl9TRVJWRVJfTk9UX0FWQkwgID0gMHgwRCwKKwlDVF9SU05fU0VTU0lPTl9DT1VMRF9OT1RfQkVfRVNUQkQgPSAweDBFLAorCUNUX1JTTl9WRU5ET1JfU1BFQ0lGSUMgID0gMHhGRiwKKworfTsKKworLyoKKyAqIGRlZmluaXRpb25zIGZvciBleHBsYW5hdGlvbnMgY29kZSBmb3IgTmFtZSBzZXJ2ZXIKKyAqLworZW51bSB7CisJQ1RfTlNfRVhQX05PQURESVRJT05BTAk9IDB4MDAsCisJQ1RfTlNfRVhQX0lEX05PVF9SRUcJPSAweDAxLAorCUNUX05TX0VYUF9QTl9OT1RfUkVHCT0gMHgwMiwKKwlDVF9OU19FWFBfTk5fTk9UX1JFRwk9IDB4MDMsCisJQ1RfTlNfRVhQX0NTX05PVF9SRUcJPSAweDA0LAorCUNUX05TX0VYUF9JUE5fTk9UX1JFRwk9IDB4MDUsCisJQ1RfTlNfRVhQX0lQQV9OT1RfUkVHCT0gMHgwNiwKKwlDVF9OU19FWFBfRlRfTk9UX1JFRwk9IDB4MDcsCisJQ1RfTlNfRVhQX1NQTl9OT1RfUkVHCT0gMHgwOCwKKwlDVF9OU19FWFBfU05OX05PVF9SRUcJPSAweDA5LAorCUNUX05TX0VYUF9QVF9OT1RfUkVHCT0gMHgwQSwKKwlDVF9OU19FWFBfSVBQX05PVF9SRUcJPSAweDBCLAorCUNUX05TX0VYUF9GUE5fTk9UX1JFRwk9IDB4MEMsCisJQ1RfTlNfRVhQX0hBX05PVF9SRUcJPSAweDBELAorCUNUX05TX0VYUF9GRF9OT1RfUkVHCT0gMHgwRSwKKwlDVF9OU19FWFBfRkZfTk9UX1JFRwk9IDB4MEYsCisJQ1RfTlNfRVhQX0FDQ0VTU0RFTklFRAk9IDB4MTAsCisJQ1RfTlNfRVhQX1VOQUNDRVBUQUJMRV9JRCA9IDB4MTEsCisJQ1RfTlNfRVhQX0RBVEFCQVNFRU1QVFkJCQk9IDB4MTIsCisJQ1RfTlNfRVhQX05PVF9SRUdfSU5fU0NPUEUgCQk9IDB4MTMsCisJQ1RfTlNfRVhQX0RPTV9JRF9OT1RfUFJFU0VOVCAJPSAweDE0LAorCUNUX05TX0VYUF9QT1JUX05VTV9OT1RfUFJFU0VOVCAgPSAweDE1LAorCUNUX05TX0VYUF9OT19ERVZJQ0VfQVRUQUNIRUQgCT0gMHgxNgorfTsKKworLyoKKyAqIGRlZmludGlvbnMgZm9yIHRoZSBleHBsYW5hdGlvbiBjb2RlIGZvciBhbGwgc2VydmVycworICovCitlbnVtIHsKKwlDVF9FWFBfQVVUSF9FWENFUFRJT04JCQk9IDB4RjEsCisJQ1RfRVhQX0RCX0ZVTEwJCQkJCT0gMHhGMiwKKwlDVF9FWFBfREJfRU1QVFkJCQkJCT0gMHhGMywKKwlDVF9FWFBfUFJPQ0VTU0lOR19SRVEJCQk9IDB4RjQsCisJQ1RfRVhQX1VOQUJMRV9UT19WRVJJRllfQ09OTgk9IDB4RjUsCisJQ1RfRVhQX0RFVklDRVNfTk9UX0lOX0NNTl9aT05FICA9IDB4RjYKK307CisKKy8qCisgKiBDb21tYW5kIGNvZGVzIGZvciBOYW1lIHNlcnZlcgorICovCitlbnVtIHsKKwlHU19HSURfUE4JPSAweDAxMjEsCS8qIEdldCBJZCBvbiBwb3J0IG5hbWUgKi8KKwlHU19HUE5fSUQJPSAweDAxMTIsCS8qIEdldCBwb3J0IG5hbWUgb24gSUQgKi8KKwlHU19HTk5fSUQJPSAweDAxMTMsCS8qIEdldCBub2RlIG5hbWUgb24gSUQgKi8KKwlHU19HSURfRlQJPSAweDAxNzEsCS8qIEdldCBJZCBvbiBGQzQgdHlwZSAqLworCUdTX0dTUE5fSUQJPSAweDAxMTgsCS8qIEdldCBzeW1ib2xpYyBQTiBvbiBJRCAqLworCUdTX1JGVF9JRAk9IDB4MDIxNywJLyogUmVnaXN0ZXIgZmM0dHlwZSBvbiBJRCAqLworCUdTX1JTUE5fSUQJPSAweDAyMTgsCS8qIFJlZ2lzdGVyIHN5bWJvbGljIFBOIG9uIElEICovCisJR1NfUlBOX0lECT0gMHgwMjEyLAkvKiBSZWdpc3RlciBwb3J0IG5hbWUgKi8KKwlHU19STk5fSUQJPSAweDAyMTMsCS8qIFJlZ2lzdGVyIG5vZGUgbmFtZSAqLworCUdTX1JDU19JRAk9IDB4MDIxNCwJLyogUmVnaXN0ZXIgY2xhc3Mgb2Ygc2VydmljZSAqLworCUdTX1JQVF9JRAk9IDB4MDIxQSwJLyogUmVnaXN0ZXIgcG9ydCB0eXBlICovCisJR1NfR0FfTlhUCT0gMHgwMTAwLAkvKiBHZXQgYWxsIG5leHQgKi8KKwlHU19SRkZfSUQJPSAweDAyMUYsCS8qIFJlZ2lzdGVyIEZDNCBGZWF0dXJlCQkqLworfTsKKworc3RydWN0IGZjZ3NfaWRfcmVxX3N7CisJdTMyCXJzdmQ6ODsKKwl1MzIJZGFwOjI0OwkvKiBwb3J0IGlkZW50aWZpZXIgKi8KK307CisjZGVmaW5lIGZjZ3NfZ3BuaWRfcmVxX3Qgc3RydWN0IGZjZ3NfaWRfcmVxX3MKKyNkZWZpbmUgZmNnc19nbm5pZF9yZXFfdCBzdHJ1Y3QgZmNnc19pZF9yZXFfcworI2RlZmluZSBmY2dzX2dzcG5pZF9yZXFfdCBzdHJ1Y3QgZmNnc19pZF9yZXFfcworCitzdHJ1Y3QgZmNnc19naWRwbl9yZXFfc3sKKwl3d25fdAlwb3J0X25hbWU7CS8qIHBvcnQgd3duICovCit9OworCitzdHJ1Y3QgZmNnc19naWRwbl9yZXNwX3N7CisJdTMyCXJzdmQ6ODsKKwl1MzIJZGFwOjI0OwkvKiBwb3J0IGlkZW50aWZpZXIgKi8KK307CisKKy8qKgorICogUkZUX0lECisgKi8KK3N0cnVjdCBmY2dzX3JmdGlkX3JlcV9zIHsKKwl1MzIJcnN2ZDo4OworCXUzMglkYXA6MjQ7CQkvKiBwb3J0IGlkZW50aWZpZXIgKi8KKwl1MzIJZmM0X3R5cGVbOF07CS8qIGZjNCB0eXBlcyAqLworfTsKKworLyoqCisgKiBSRkZfSUQgOiBSZWdpc3RlciBGQzQgZmVhdHVyZXMuCisgKi8KKworI2RlZmluZSBGQ19HU19GQ1BfRkM0X0ZFQVRVUkVfSU5JVElBVE9SICAweDAyCisjZGVmaW5lIEZDX0dTX0ZDUF9GQzRfRkVBVFVSRV9UQVJHRVQJIDB4MDEKKworc3RydWN0IGZjZ3NfcmZmaWRfcmVxX3N7CisgICAgdTMyICAgIHJzdmQgICAgICAgICAgOjg7CisgICAgdTMyICAgIGRhcCAgICAgICAgCSAgOjI0OwkJLyogcG9ydCBpZGVudGlmaWVyCSovCisgICAgdTMyICAgIHJzdmQxICAgICAgICAgOjE2OworICAgIHUzMiAgICBmYzRmdHJfYml0cyAgIDo4OwkJLyogZmM0IGZlYXR1cmUgYml0cwkqLworICAgIHUzMiAgICBmYzRfdHlwZSAgICAgIDo4OwkJLyogY29ycmVzcG9uZGluZyBGQzQgVHlwZSAqLworfTsKKworLyoqCisgKiBHSURfRlQgUmVxdWVzdAorICovCitzdHJ1Y3QgZmNnc19naWRmdF9yZXFfc3sKKwl1OAlyZXNlcnZlZDsKKwl1OAlkb21haW5faWQ7CS8qIGRvbWFpbiwgMCAtIGFsbCBmYWJyaWMgKi8KKwl1OAlhcmVhX2lkOwkvKiBhcmVhLCAwIC0gd2hvbGUgZG9tYWluICovCisJdTgJZmM0X3R5cGU7CS8qIEZDX1RZUEVfRkNQIGZvciBTQ1NJIGRldmljZXMgKi8KK307CQkJCS8qIEdJRF9GVCBSZXF1ZXN0ICovCisKKy8qKgorICogR0lEX0ZUIFJlc3BvbnNlCisgKi8KK3N0cnVjdCBmY2dzX2dpZGZ0X3Jlc3BfcyB7CisJdTgJCWxhc3Q6MTsJLyogbGFzdCBwb3J0IGlkZW50aWZpZXIgZmxhZyAqLworCXU4CQlyZXNlcnZlZDo3OworCXUzMglwaWQ6MjQ7CS8qIHBvcnQgaWRlbnRpZmllciAqLworfTsJCQkJLyogR0lEX0ZUIFJlc3BvbnNlICovCisKKy8qKgorICogUlNQTl9JRAorICovCitzdHJ1Y3QgZmNnc19yc3BuaWRfcmVxX3N7CisJdTMyCXJzdmQ6ODsKKwl1MzIJZGFwOjI0OwkJLyogcG9ydCBpZGVudGlmaWVyICovCisJdTgJCXNwbl9sZW47CS8qIHN5bWJvbGljIHBvcnQgbmFtZSBsZW5ndGggKi8KKwl1OAkJc3BuWzI1Nl07CS8qIHN5bWJvbGljIHBvcnQgbmFtZSAqLworfTsKKworLyoqCisgKiBSUE5fSUQKKyAqLworc3RydWN0IGZjZ3NfcnBuaWRfcmVxX3N7CisJdTMyCXJzdmQ6ODsKKwl1MzIJcG9ydF9pZDoyNDsKKwl3d25fdAkJcG9ydF9uYW1lOworfTsKKworLyoqCisgKiBSTk5fSUQKKyAqLworc3RydWN0IGZjZ3Nfcm5uaWRfcmVxX3N7CisJdTMyCXJzdmQ6ODsKKwl1MzIJcG9ydF9pZDoyNDsKKwl3d25fdAkJbm9kZV9uYW1lOworfTsKKworLyoqCisgKiBSQ1NfSUQKKyAqLworc3RydWN0IGZjZ3NfcmNzaWRfcmVxX3N7CisJdTMyCXJzdmQ6ODsKKwl1MzIJcG9ydF9pZDoyNDsKKwl1MzIJY29zOworfTsKKworLyoqCisgKiBSUFRfSUQKKyAqLworc3RydWN0IGZjZ3NfcnB0aWRfcmVxX3N7CisJdTMyCXJzdmQ6ODsKKwl1MzIJcG9ydF9pZDoyNDsKKwl1MzIJcG9ydF90eXBlOjg7CisJdTMyCXJzdmQxOjI0OworfTsKKworLyoqCisgKiBHQV9OWFQgUmVxdWVzdAorICovCitzdHJ1Y3QgZmNnc19nYW54dF9yZXFfc3sKKwl1MzIJcnN2ZDo4OworCXUzMglwb3J0X2lkOjI0OworfTsKKworLyoqCisgKiBHQV9OWFQgUmVzcG9uc2UKKyAqLworc3RydWN0IGZjZ3NfZ2FueHRfcnNwX3N7CisJdTMyCXBvcnRfdHlwZTo4OwkvKiBQb3J0IFR5cGUgKi8KKwl1MzIJcG9ydF9pZDoyNDsJLyogUG9ydCBJZGVudGlmaWVyICovCisJd3duX3QJCXBvcnRfbmFtZTsJLyogUG9ydCBOYW1lICovCisJdTgJCXNwbl9sZW47CS8qIExlbmd0aCBvZiBTeW1ib2xpYyBQb3J0IE5hbWUgKi8KKwljaGFyCQlzcG5bMjU1XTsJLyogU3ltYm9saWMgUG9ydCBOYW1lICovCisJd3duX3QJCW5vZGVfbmFtZTsJLyogTm9kZSBOYW1lICovCisJdTgJCXNubl9sZW47CS8qIExlbmd0aCBvZiBTeW1ib2xpYyBOb2RlIE5hbWUgKi8KKwljaGFyCQlzbm5bMjU1XTsJLyogU3ltYm9saWMgTm9kZSBOYW1lICovCisJdTgJCWlwYVs4XTsJCS8qIEluaXRpYWwgUHJvY2VzcyBBc3NvY2lhdG9yICovCisJdTgJCWlwWzE2XTsJCS8qIElQIEFkZHJlc3MgKi8KKwl1MzIJY29zOwkJLyogQ2xhc3Mgb2YgU2VydmljZSAqLworCXUzMglmYzR0eXBlc1s4XTsJLyogRkMtNCBUWVBFcyAqLworCXd3bl90CQlmYWJyaWNfcG9ydF9uYW1lOworCQkJCQkvKiBGYWJyaWMgUG9ydCBOYW1lICovCisJdTMyCXJzdmQ6ODsJCS8qIFJlc2VydmVkICovCisJdTMyCWhhcmRfYWRkcjoyNDsJLyogSGFyZCBBZGRyZXNzICovCit9OworCisvKgorICogRmFicmljIENvbmZpZyBTZXJ2ZXIKKyAqLworCisvKgorICogQ29tbWFuZCBjb2RlcyBmb3IgRmFicmljIENvbmZpZ3VyYXRpb24gU2VydmVyCisgKi8KK2VudW0geworCUdTX0ZDX0dGTl9DTUQJPSAweDAxMTQsCS8qIEdTIEZDIEdldCBGYWJyaWMgTmFtZSAgKi8KKwlHU19GQ19HTUFMX0NNRAk9IDB4MDExNiwJLyogR1MgRkMgR01BTCAgKi8KKwlHU19GQ19UUkFDRV9DTUQJPSAweDA0MDAsCS8qIEdTIEZDIFRyYWNlIFJvdXRlICovCisJR1NfRkNfUElOR19DTUQJPSAweDA0MDEsCS8qIEdTIEZDIFBpbmcgKi8KK307CisKKy8qCisgKiBTb3VyY2Ugb3IgRGVzdGluYXRpb24gUG9ydCBUYWdzLgorICovCitlbnVtIHsKKwlHU19GVFJBQ0VfVEFHX05QT1JUX0lECQk9IDEsCisJR1NfRlRSQUNFX1RBR19OUE9SVF9OQU1FCT0gMiwKK307CisKKy8qCisqIFBvcnQgVmFsdWUgOiBDb3VsZCBiZSBhIFBvcnQgaWQgb3Igd3duCisgKi8KK3VuaW9uIGZjZ3NfcG9ydF92YWxfdXsKKwl1MzIJbnBvcnRfaWQ7CisJd3duX3QJCW5wb3J0X3d3bjsKK307CisKKyNkZWZpbmUgR1NfRlRSQUNFX01BWF9IT1BfQ09VTlQJMjAKKyNkZWZpbmUgR1NfRlRSQUNFX1JFVklTSU9OCTEKKworLyoKKyAqIEZ0cmFjZSBSZWxhdGVkIFN0cnVjdHVyZXMuCisgKi8KKworLyoKKyAqIFNUUiAoU3dpdGNoIFRyYWNlKSBSZWplY3QgUmVhc29uIENvZGVzLiBGcm9tIEZDLVNXLgorICovCitlbnVtIHsKKwlHU19GVFJBQ0VfU1RSX0NNRF9DT01QTEVURURfU1VDQwk9IDAsCisJR1NfRlRSQUNFX1NUUl9DTURfTk9UX1NVUFBfSU5fTkVYVF9TV0lUQ0gsCisJR1NfRlRSQUNFX1NUUl9OT19SRVNQX0ZST01fTkVYVF9TV0lUQ0gsCisJR1NfRlRSQUNFX1NUUl9NQVhfSE9QX0NOVF9SRUFDSEVELAorCUdTX0ZUUkFDRV9TVFJfU1JDX1BPUlRfTk9UX0ZPVU5ELAorCUdTX0ZUUkFDRV9TVFJfRFNUX1BPUlRfTk9UX0ZPVU5ELAorCUdTX0ZUUkFDRV9TVFJfREVWSUNFU19OT1RfSU5fQ09NTU9OX1pPTkUsCisJR1NfRlRSQUNFX1NUUl9OT19ST1VURV9CV19QT1JUUywKKwlHU19GVFJBQ0VfU1RSX05PX0FERExfRVhQTE4sCisJR1NfRlRSQUNFX1NUUl9GQUJSSUNfQlVTWSwKKwlHU19GVFJBQ0VfU1RSX0ZBQlJJQ19CVUlMRF9JTl9QUk9HUkVTUywKKwlHU19GVFJBQ0VfU1RSX1ZFTkRPUl9TUEVDSUZJQ19FUlJfU1RBUlQgPSAweGYwLAorCUdTX0ZUUkFDRV9TVFJfVkVORE9SX1NQRUNJRklDX0VSUl9FTkQgPSAweGZmLAorfTsKKworLyoKKyAqIEZ0cmFjZSBSZXF1ZXN0CisgKi8KK3N0cnVjdCBmY2dzX2Z0cmFjZV9yZXFfc3sKKwl1MzIJcmV2aXNpb247CisJdTE2CXNyY19wb3J0X3RhZzsJLyogU291cmNlIFBvcnQgdGFnICovCisJdTE2CXNyY19wb3J0X2xlbjsJLyogU291cmNlIFBvcnQgbGVuICovCisJdW5pb24gZmNnc19wb3J0X3ZhbF91IHNyY19wb3J0X3ZhbDsJLyogU291cmNlIFBvcnQgdmFsdWUgKi8KKwl1MTYJZHN0X3BvcnRfdGFnOwkvKiBEZXN0aW5hdGlvbiBQb3J0IHRhZyAqLworCXUxNglkc3RfcG9ydF9sZW47CS8qIERlc3RpbmF0aW9uIFBvcnQgbGVuICovCisJdW5pb24gZmNnc19wb3J0X3ZhbF91IGRzdF9wb3J0X3ZhbDsJLyogRGVzdGluYXRpb24gUG9ydCB2YWx1ZSAqLworCXUzMgl0b2tlbjsKKwl1OAkJdmVuZG9yX2lkWzhdOwkvKiBUMTAgVmVuZG9yIElkZW50aWZpZXIgKi8KKwl1OAkJdmVuZG9yX2luZm9bOF07CS8qIFZlbmRvciBzcGVjaWZpYyBJbmZvICovCisJdTMyCW1heF9ob3BfY250OwkvKiBNYXggSG9wIENvdW50ICovCit9OworCisvKgorICogUGF0aCBpbmZvIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZmNnc19mdHJhY2VfcGF0aF9pbmZvX3N7CisJd3duX3QJCXN3aXRjaF9uYW1lOwkJLyogU3dpdGNoIFdXTiAqLworCXUzMglkb21haW5faWQ7CisJd3duX3QJCWluZ3Jlc3NfcG9ydF9uYW1lOwkvKiBJbmdyZXNzIHBvcnRzIHd3biAqLworCXUzMglpbmdyZXNzX3BoeXNfcG9ydF9udW07CS8qIEluZ3Jlc3MgcG9ydHMgcGh5c2ljYWwgcG9ydAorCQkJCQkJICogbnVtYmVyCisJCQkJCQkgKi8KKwl3d25fdAkJZWdyZXNzX3BvcnRfbmFtZTsJLyogSW5ncmVzcyBwb3J0cyB3d24gKi8KKwl1MzIJZWdyZXNzX3BoeXNfcG9ydF9udW07CS8qIEluZ3Jlc3MgcG9ydHMgcGh5c2ljYWwgcG9ydAorCQkJCQkJICogbnVtYmVyCisJCQkJCQkgKi8KK307CisKKy8qCisgKiBGdHJhY2UgQWNjIFJlc3BvbnNlCisgKi8KK3N0cnVjdCBmY2dzX2Z0cmFjZV9yZXNwX3N7CisJdTMyCXJldmlzaW9uOworCXUzMgl0b2tlbjsKKwl1OAkJdmVuZG9yX2lkWzhdOwkJLyogVDEwIFZlbmRvciBJZGVudGlmaWVyICovCisJdTgJCXZlbmRvcl9pbmZvWzhdOwkJLyogVmVuZG9yIHNwZWNpZmljIEluZm8gKi8KKwl1MzIJc3RyX3Jlal9yZWFzb25fY29kZTsJLyogU1RSIFJlamVjdCBSZWFzb24gQ29kZSAqLworCXUzMgludW1fcGF0aF9pbmZvX2VudHJpZXM7CS8qIE5vLiBvZiBwYXRoIGluZm8gZW50cmllcyAqLworCS8qCisJICogcGF0aCBpbmZvIGVudHJ5L2VudHJpZXMuCisJICovCisJc3RydWN0IGZjZ3NfZnRyYWNlX3BhdGhfaW5mb19zIHBhdGhfaW5mb1sxXTsKKworfTsKKworLyoKKyogRmFicmljIENvbmZpZyBTZXJ2ZXIgOiBGQ1BpbmcKKyAqLworCisvKgorICogRkMgUGluZyBSZXF1ZXN0CisgKi8KK3N0cnVjdCBmY2dzX2ZjcGluZ19yZXFfc3sKKwl1MzIJcmV2aXNpb247CisJdTE2CXBvcnRfdGFnOworCXUxNglwb3J0X2xlbjsJLyogUG9ydCBsZW4gKi8KKwl1bmlvbiBmY2dzX3BvcnRfdmFsX3UgcG9ydF92YWw7CS8qIFBvcnQgdmFsdWUgKi8KKwl1MzIJdG9rZW47Cit9OworCisvKgorICogRkMgUGluZyBSZXNwb25zZQorICovCitzdHJ1Y3QgZmNnc19mY3BpbmdfcmVzcF9zeworCXUzMgl0b2tlbjsKK307CisKKy8qCisgKiBDb21tYW5kIGNvZGVzIGZvciB6b25lIHNlcnZlciBxdWVyeS4KKyAqLworZW51bSB7CisJWlNfR1pNRSA9IDB4MDEyNCwJLyogR2V0IHpvbmUgbWVtYmVyIGV4dGVuZGVkICovCit9OworCisvKgorICogWlMgR1pNRSByZXF1ZXN0CisgKi8KKyNkZWZpbmUgWlNfR1pNRV9aTkFNRUxFTgkzMgorc3RydWN0IHpzX2d6bWVfcmVxX3N7CisJdTgJem5hbWVsZW47CisJdTgJcnN2ZFszXTsKKwl1OAl6bmFtZVtaU19HWk1FX1pOQU1FTEVOXTsKK307CisKK2VudW0genNfbWJyX3R5cGV7CisJWlNfTUJSX1RZUEVfUFdXTgk9IDEsCisJWlNfTUJSX1RZUEVfRE9NUE9SVAk9IDIsCisJWlNfTUJSX1RZUEVfUE9SVElECT0gMywKKwlaU19NQlJfVFlQRV9OV1dOCT0gNCwKK307CisKK3N0cnVjdCB6c19tYnJfd3duX3N7CisJdTgJbWJyX3R5cGU7CisJdTgJcnN2ZFszXTsKKwl3d25fdAl3d247Cit9OworCitzdHJ1Y3QgenNfcXVlcnlfcmVzcF9zeworCXUzMglubWJyczsJLyogIG51bWJlciBvZiB6b25lIG1lbWJlcnMgKi8KKwlzdHJ1Y3QgenNfbWJyX3d3bl9zCW1iclsxXTsKK307CisKKy8qCisgKiBHTUFMIENvbW1hbmQgKCBHZXQgKCBpbnRlcmNvbm5lY3QgRWxlbWVudCkgTWFuYWdlbWVudCBBZGRyZXNzIExpc3QpCisgKiBUbyByZXRyaWV2ZSB0aGUgSVAgQWRkcmVzcyBvZiBhIFN3aXRjaC4KKyAqLworCisjZGVmaW5lIENUX0dNQUxfUkVTUF9QUkVGSVhfVEVMTkVUCSAidGVsbmV0Oi8vIgorI2RlZmluZSBDVF9HTUFMX1JFU1BfUFJFRklYX0hUVFAJICJodHRwOi8vIgorCisvKiAgR01BTC9HRk4gcmVxdWVzdCAqLworc3RydWN0IGZjZ3NfcmVxX3MgeworCXd3bl90ICAgIHd3bjsgCS8qIFBXV04vTldXTiAqLworfTsKKworI2RlZmluZSBmY2dzX2dtYWxfcmVxX3Qgc3RydWN0IGZjZ3NfcmVxX3MKKyNkZWZpbmUgZmNnc19nZm5fcmVxX3Qgc3RydWN0IGZjZ3NfcmVxX3MKKworLyogQWNjZXB0IFJlc3BvbnNlIHRvIEdNQUwgKi8KK3N0cnVjdCBmY2dzX2dtYWxfcmVzcF9zIHsKKwl1MzIgCQltc19sZW47ICAgLyogTnVtIG9mIGVudHJpZXMgKi8KKwl1OCAgICAgCW1zX21hWzI1Nl07Cit9OworCitzdHJ1Y3QgZmNfZ21hbF9lbnRyeV9zIHsKKwl1OCAgbGVuOworCXU4ICBwcmVmaXhbN107IC8qIGxpa2UgImh0dHA6Ly8iICovCisJdTggIGlwX2FkZHJbMjQ4XTsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2ZjLmggYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTM5YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2ZjLmgKQEAgLTAsMCArMSwxMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19GQ19IX18KKyNkZWZpbmUgX19GQ19IX18KKworI2luY2x1ZGUgPHByb3RvY29sL3R5cGVzLmg+CisKKyNwcmFnbWEgcGFjaygxKQorCisvKgorICogRmlicmUgQ2hhbm5lbCBIZWFkZXIgU3RydWN0dXJlIChGQ0hTKSBkZWZpbml0aW9uCisgKi8KK3N0cnVjdCBmY2hzX3MgeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTMyICAgICAgICByb3V0aW5nOjQ7CS8qIHJvdXRpbmcgYml0cyAqLworCXUzMiAgICAgICAgY2F0X2luZm86NDsJLyogY2F0ZWdvcnkgaW5mbyAqLworI2Vsc2UKKwl1MzIgICAgICAgIGNhdF9pbmZvOjQ7CS8qIGNhdGVnb3J5IGluZm8gKi8KKwl1MzIgICAgICAgIHJvdXRpbmc6NDsJLyogcm91dGluZyBiaXRzICovCisjZW5kaWYKKwl1MzIgICAgICAgIGRfaWQ6MjQ7CS8qIGRlc3RpbmF0aW9uIGlkZW50aWZpZXIgKi8KKworCXUzMiAgICAgICAgY3NfY3RsOjg7CS8qIGNsYXNzIHNwZWNpZmljIGNvbnRyb2wgKi8KKwl1MzIgICAgICAgIHNfaWQ6MjQ7CS8qIHNvdXJjZSBpZGVudGlmaWVyICovCisKKwl1MzIgICAgICAgIHR5cGU6ODsJCS8qIGRhdGEgc3RydWN0dXJlIHR5cGUgKi8KKwl1MzIgICAgICAgIGZfY3RsOjI0OwkvKiBpbml0aWFsIGZyYW1lIGNvbnRyb2wgKi8KKworCXU4ICAgICAgICAgc2VxX2lkOwkJLyogc2VxdWVuY2UgaWRlbnRpZmllciAqLworCXU4ICAgICAgICAgZGZfY3RsOwkJLyogZGF0YSBmaWVsZCBjb250cm9sICovCisJdTE2ICAgICAgICBzZXFfY250OwkvKiBzZXF1ZW5jZSBjb3VudCAqLworCisJdTE2ICAgICAgICBveF9pZDsJCS8qIG9yaWdpbmF0b3IgZXhjaGFuZ2UgSUQgKi8KKwl1MTYgICAgICAgIHJ4X2lkOwkJLyogcmVzcG9uZGVyIGV4Y2hhbmdlIElEICovCisKKwl1MzIgICAgICAgIHJvOwkJLyogcmVsYXRpdmUgb2Zmc2V0ICovCit9OworLyoKKyAqIEZpYnJlIENoYW5uZWwgQkJfRSBIZWFkZXIgU3RydWN0dXJlCisgKi8KK3N0cnVjdCBmY2JiZWhzX3MgeworCXUxNgl2ZXJfcnN2ZDsKKwl1MzIJcnN2ZFsyXTsKKwl1MzIJcnN2ZF9fc29mOworfTsKKworI2RlZmluZSBGQ19TRVFfSURfTUFYCQkyNTYKKworLyoKKyAqIHJvdXRpbmcgYml0IGRlZmluaXRpb25zCisgKi8KK2VudW0geworCUZDX1JUR19GQzRfREVWX0RBVEEJPSAweDAsCS8qIEZDLTQgRGV2aWNlIERhdGEgKi8KKwlGQ19SVEdfRVhUX0xJTksJCT0gMHgyLAkvKiBFeHRlbmRlZCBMaW5rIERhdGEgKi8KKwlGQ19SVEdfRkM0X0xJTktfREFUQQk9IDB4MywJLyogRkMtNCBMaW5rIERhdGEgKi8KKwlGQ19SVEdfVklERU9fREFUQQk9IDB4NCwJLyogVmlkZW8gRGF0YSAqLworCUZDX1JUR19FWFRfSERSCQk9IDB4NSwJLyogVkZULCBJRlIgb3IgRW5jYXBzdWxlZCAqLworCUZDX1JUR19CQVNJQ19MSU5LCT0gMHg4LAkvKiBCYXNpYyBMaW5rIGRhdGEgKi8KKwlGQ19SVEdfTElOS19DVFJMCT0gMHhDLAkvKiBMaW5rIENvbnRyb2wgKi8KK307CisKKy8qCisgKiBpbmZvcm1hdGlvbiBjYXRlZ29yeSBmb3IgZXh0ZW5kZWQgbGluayBkYXRhIGFuZCBGQy00IExpbmsgRGF0YQorICovCitlbnVtIHsKKwlGQ19DQVRfTERfUkVRVUVTVAk9IDB4MiwJLyogUmVxdWVzdCAqLworCUZDX0NBVF9MRF9SRVBMWQkJPSAweDMsCS8qIFJlcGx5ICovCisJRkNfQ0FUX0xEX0RJQUcJCT0gMHhGLAkvKiBmb3IgRElBRyB1c2Ugb25seSAqLworfTsKKworLyoKKyAqIGluZm9ybWF0aW9uIGNhdGVnb3J5IGZvciBleHRlbmRlZCBoZWFkZXJzIChWRlQsIElGUiBvciBlbmNhcHN1bGF0aW9uKQorICovCitlbnVtIHsKKwlGQ19DQVRfVkZUX0hEUiA9IDB4MCwJLyogVmlydHVhbCBmYWJyaWMgdGFnZ2luZyBoZWFkZXIgKi8KKwlGQ19DQVRfSUZSX0hEUiA9IDB4MSwJLyogSW50ZXItRmFicmljIHJvdXRpbmcgaGVhZGVyICovCisJRkNfQ0FUX0VOQ19IRFIgPSAweDIsCS8qIEVuY2Fwc3VsYXRpb24gaGVhZGVyICovCit9OworCisvKgorICogaW5mb3JtYXRpb24gY2F0ZWdvcnkgZm9yIEZDLTQgZGV2aWNlIGRhdGEKKyAqLworZW51bSB7CisJRkNfQ0FUX1VOQ0FURUdfSU5GTwk9IDB4MCwJLyogVW5jYXRlZ29yaXplZCBpbmZvcm1hdGlvbiAqLworCUZDX0NBVF9TT0xJQ0lUX0RBVEEJPSAweDEsCS8qIFNvbGljaXRlZCBEYXRhICovCisJRkNfQ0FUX1VOU09MSUNJVF9DVFJMCT0gMHgyLAkvKiBVbnNvbGljaXRlZCBDb250cm9sICovCisJRkNfQ0FUX1NPTElDSVRfQ1RSTAk9IDB4MywJLyogU29saWNpdGVkIENvbnRyb2wgKi8KKwlGQ19DQVRfVU5TT0xJQ0lUX0RBVEEJPSAweDQsCS8qIFVuc29saWNpdGVkIERhdGEgKi8KKwlGQ19DQVRfREFUQV9ERVNDCT0gMHg1LAkvKiBEYXRhIERlc2NyaXB0b3IgKi8KKwlGQ19DQVRfVU5TT0xJQ0lUX0NNRAk9IDB4NiwJLyogVW5zb2xpY2l0ZWQgQ29tbWFuZCAqLworCUZDX0NBVF9DTURfU1RBVFVTCT0gMHg3LAkvKiBDb21tYW5kIFN0YXR1cyAqLworfTsKKworLyoKKyAqIGluZm9ybWF0aW9uIGNhdGVnb3J5IGZvciBMaW5rIENvbnRyb2wKKyAqLworZW51bSB7CisJRkNfQ0FUX0FDS18xCQk9IDB4MDAsCisJRkNfQ0FUX0FDS18wX04JCT0gMHgwMSwKKwlGQ19DQVRfUF9SSlQJCT0gMHgwMiwKKwlGQ19DQVRfRl9SSlQJCT0gMHgwMywKKwlGQ19DQVRfUF9CU1kJCT0gMHgwNCwKKwlGQ19DQVRfRl9CU1lfREFUQQk9IDB4MDUsCisJRkNfQ0FUX0ZfQlNZX0xJTktfQ1RMCT0gMHgwNiwKKwlGQ19DQVRfRl9MQ1IJCT0gMHgwNywKKwlGQ19DQVRfTlRZCQk9IDB4MDgsCisJRkNfQ0FUX0VORAkJPSAweDA5LAorfTsKKworLyoKKyAqIFR5cGUgRmllbGQgRGVmaW5pdGlvbnMuIEZDLVBIIFNlY3Rpb24gMTguNSBwZy4gMTY1CisgKi8KK2VudW0geworCUZDX1RZUEVfQkxTCQk9IDB4MCwJLyogQmFzaWMgTGluayBTZXJ2aWNlICovCisJRkNfVFlQRV9FTFMJCT0gMHgxLAkvKiBFeHRlbmRlZCBMaW5rIFNlcnZpY2UgKi8KKwlGQ19UWVBFX0lQCQk9IDB4NSwJLyogSVAgKi8KKwlGQ19UWVBFX0ZDUAkJPSAweDgsCS8qIFNDU0ktRkNQICovCisJRkNfVFlQRV9HUFAJCT0gMHg5LAkvKiBTQ1NJX0dQUCAqLworCUZDX1RZUEVfU0VSVklDRVMJPSAweDIwLAkvKiBGaWJyZSBDaGFubmVsIFNlcnZpY2VzICovCisJRkNfVFlQRV9GQ19GU1MJCT0gMHgyMiwJLyogRmFicmljIFN3aXRjaCBTZXJ2aWNlcyAqLworCUZDX1RZUEVfRkNfQUwJCT0gMHgyMywJLyogRkMtQUwgKi8KKwlGQ19UWVBFX0ZDX1NOTVAJCT0gMHgyNCwJLyogRkMtU05NUCAqLworCUZDX1RZUEVfTUFYCQk9IDI1NiwJLyogMjU2IEZDLTQgdHlwZXMgKi8KK307CisKK3N0cnVjdCBmY19mYzR0eXBlc19zeworCXU4ICAgICAgICAgYml0c1tGQ19UWVBFX01BWCAvIDhdOworfTsKKworLyoKKyAqIEZyYW1lIENvbnRyb2wgRGVmaW5pdGlvbnMuIEZDLVBIIFRhYmxlLTQ1LiBwZy4gMTY4CisgKi8KK2VudW0geworCUZDVExfRUNfT1JJRyA9IDB4MDAwMDAwLAkvKiBleGNoYW5nZSBvcmlnaW5hdG9yICovCisJRkNUTF9FQ19SRVNQID0gMHg4MDAwMDAsCS8qIGV4Y2hhbmdlIHJlc3BvbmRlciAqLworCUZDVExfU0VRX0lOSSA9IDB4MDAwMDAwLAkvKiBzZXF1ZW5jZSBpbml0aWF0b3IgKi8KKwlGQ1RMX1NFUV9SRUMgPSAweDQwMDAwMCwJLyogc2VxdWVuY2UgcmVjaXBpZW50ICovCisJRkNUTF9GU19FWENIID0gMHgyMDAwMDAsCS8qIGZpcnN0IHNlcXVlbmNlIG9mIHhjaGcgKi8KKwlGQ1RMX0xTX0VYQ0ggPSAweDEwMDAwMCwJLyogbGFzdCBzZXF1ZW5jZSBvZiB4Y2hnICovCisJRkNUTF9FTkRfU0VRID0gMHgwODAwMDAsCS8qIGxhc3QgZnJhbWUgb2Ygc2VxdWVuY2UgKi8KKwlGQ1RMX1NJX1hGRVIgPSAweDAxMDAwMCwJLyogc2VxIGluaXRpYXRpdmUgdHJhbnNmZXIgKi8KKwlGQ1RMX1JPX1BSRVNFTlQgPSAweDAwMDAwOCwJLyogcmVsYXRpdmUgb2Zmc2V0IHByZXNlbnQgKi8KKwlGQ1RMX0ZJTExCWVRFX01BU0sgPSAweDAwMDAwMwkvKiAsIGZpbGwgYnl0ZSBtYXNrICovCit9OworCisvKgorICogRmFicmljIFdlbGwgS25vd24gQWRkcmVzc2VzCisgKi8KK2VudW0geworCUZDX01JTl9XRUxMX0tOT1dOX0FERFIJCT0gMHhGRkZGRjAsCisJRkNfRE9NQUlOX0NPTlRST0xMRVJfTUFTSyAJPSAweEZGRkMwMCwKKwlGQ19BTElBU19TRVJWRVIJCQk9IDB4RkZGRkY4LAorCUZDX01HTVRfU0VSVkVSCQkJPSAweEZGRkZGQSwKKwlGQ19USU1FX1NFUlZFUgkJCT0gMHhGRkZGRkIsCisJRkNfTkFNRV9TRVJWRVIJCQk9IDB4RkZGRkZDLAorCUZDX0ZBQlJJQ19DT05UUk9MTEVSCQk9IDB4RkZGRkZELAorCUZDX0ZBQlJJQ19QT1JUCQkJPSAweEZGRkZGRSwKKwlGQ19CUk9BRENBU1RfU0VSVkVSCQk9IDB4RkZGRkZGCit9OworCisvKgorICogZG9tYWluL2FyZWEvcG9ydCBkZWZpbmVzCisgKi8KKyNkZWZpbmUgRkNfRE9NQUlOX01BU0sgIDB4RkYwMDAwCisjZGVmaW5lIEZDX0RPTUFJTl9TSElGVCAxNgorI2RlZmluZSBGQ19BUkVBX01BU0sgICAgMHgwMEZGMDAKKyNkZWZpbmUgRkNfQVJFQV9TSElGVCAgIDgKKyNkZWZpbmUgRkNfUE9SVF9NQVNLICAgIDB4MDAwMEZGCisjZGVmaW5lIEZDX1BPUlRfU0hJRlQgICAwCisKKyNkZWZpbmUgRkNfR0VUX0RPTUFJTihwKQkoKChwKSAmIEZDX0RPTUFJTl9NQVNLKSA+PiBGQ19ET01BSU5fU0hJRlQpCisjZGVmaW5lIEZDX0dFVF9BUkVBKHApCQkoKChwKSAmIEZDX0FSRUFfTUFTSykgPj4gRkNfQVJFQV9TSElGVCkKKyNkZWZpbmUgRkNfR0VUX1BPUlQocCkJCSgoKHApICYgRkNfUE9SVF9NQVNLKSA+PiBGQ19QT1JUX1NISUZUKQorCisjZGVmaW5lIEZDX0RPTUFJTl9DVFJMUihwKQkoRkNfRE9NQUlOX0NPTlRST0xMRVJfTUFTSyB8IChGQ19HRVRfRE9NQUlOKHApKSkKKworZW51bSB7CisJRkNfUlhJRF9BTlkgPSAweEZGRkZVLAorfTsKKworLyoKKyAqIGdlbmVyaWMgRUxTIGNvbW1hbmQKKyAqLworc3RydWN0IGZjX2Vsc19jbWRfc3sKKwl1MzIgICAgICAgIGVsc19jb2RlOjg7CS8qIEVMUyBDb21tYW5kIENvZGUgKi8KKwl1MzIgICAgICAgIHJlc2VydmVkOjI0OworfTsKKworLyoKKyAqIEVMUyBDb21tYW5kIENvZGVzLiBGQy1QSCBUYWJsZS03NS4gcGcuIDIyMworICovCitlbnVtIHsKKwlGQ19FTFNfTFNfUkpUID0gMHgxLAkvKiBMaW5rIFNlcnZpY2UgUmVqZWN0LiAqLworCUZDX0VMU19BQ0MgPSAweDAyLAkvKiBBY2NlcHQgKi8KKwlGQ19FTFNfUExPR0kgPSAweDAzLAkvKiBOX1BvcnQgTG9naW4uICovCisJRkNfRUxTX0ZMT0dJID0gMHgwNCwJLyogRl9Qb3J0IExvZ2luLiAqLworCUZDX0VMU19MT0dPID0gMHgwNSwJLyogTG9nb3V0LiAqLworCUZDX0VMU19BQlRYID0gMHgwNiwJLyogQWJvcnQgRXhjaGFuZ2UgKi8KKwlGQ19FTFNfUkVTID0gMHgwOCwJLyogUmVhZCBFeGNoYW5nZSBzdGF0dXMgKi8KKwlGQ19FTFNfUlNTID0gMHgwOSwJLyogUmVhZCBzZXF1ZW5jZSBzdGF0dXMgYmxvY2sgKi8KKwlGQ19FTFNfUlNJID0gMHgwQSwJLyogUmVxdWVzdCBTZXF1ZW5jZSBJbml0aWF0aXZlICovCisJRkNfRUxTX0VTVEMgPSAweDBDLAkvKiBFc3RpbWF0ZSBDcmVkaXQuICovCisJRkNfRUxTX1JUViA9IDB4MEUsCS8qIFJlYWQgVGltZW91dCBWYWx1ZS4gKi8KKwlGQ19FTFNfUkxTID0gMHgwRiwJLyogUmVhZCBMaW5rIFN0YXR1cy4gKi8KKwlGQ19FTFNfRUNITyA9IDB4MTAsCS8qIEVjaG8gKi8KKwlGQ19FTFNfVEVTVCA9IDB4MTEsCS8qIFRlc3QgKi8KKwlGQ19FTFNfUlJRID0gMHgxMiwJLyogUmVpbnN0YXRlIFJlY292ZXJ5IFF1YWxpZmllci4gKi8KKwlGQ19FTFNfUkVDID0gMHgxMywJLyogQWRkIHRoaXMgZm9yIFRBUEUgc3VwcG9ydCBpbiBGQ1IgKi8KKwlGQ19FTFNfUFJMSSA9IDB4MjAsCS8qIFByb2Nlc3MgTG9naW4gKi8KKwlGQ19FTFNfUFJMTyA9IDB4MjEsCS8qIFByb2Nlc3MgTG9nb3V0LiAqLworCUZDX0VMU19TQ04gPSAweDIyLAkvKiBTdGF0ZSBDaGFuZ2UgTm90aWZpY2F0aW9uLiAqLworCUZDX0VMU19UUFJMTyA9IDB4MjQsCS8qIFRoaXJkIFBhcnR5IFByb2Nlc3MgTG9nb3V0LiAqLworCUZDX0VMU19QRElTQyA9IDB4NTAsCS8qIERpc2NvdmVyIE5fUG9ydCBQYXJhbWV0ZXJzLiAqLworCUZDX0VMU19GRElTQyA9IDB4NTEsCS8qIERpc2NvdmVyIEZfUG9ydCBQYXJhbWV0ZXJzLiAqLworCUZDX0VMU19BRElTQyA9IDB4NTIsCS8qIERpc2NvdmVyIEFkZHJlc3MuICovCisJRkNfRUxTX0ZBTiA9IDB4NjAsCS8qIEZhYnJpYyBBZGRyZXNzIE5vdGlmaWNhdGlvbiAqLworCUZDX0VMU19SU0NOID0gMHg2MSwJLyogUmVnIFN0YXRlIENoYW5nZSBOb3RpZmljYXRpb24gKi8KKwlGQ19FTFNfU0NSID0gMHg2MiwJLyogU3RhdGUgQ2hhbmdlIFJlZ2lzdHJhdGlvbi4gKi8KKwlGQ19FTFNfUlRJTiA9IDB4NzcsCS8qIE1hbmdlbWVudCBzZXJ2ZXIgcmVxdWVzdCAqLworCUZDX0VMU19STklEID0gMHg3OCwJLyogTWFuZ2VtZW50IHNlcnZlciByZXF1ZXN0ICovCisJRkNfRUxTX1JMSVIgPSAweDc5LAkvKiBSZWdpc3RlcmVkIExpbmsgSW5jaWRlbnQgUmVjb3JkICovCisKKwlGQ19FTFNfUlBTQyA9IDB4N0QsCS8qIFJlcG9ydCBQb3J0IFNwZWVkIENhcGFiaWxpdGllcyAqLworCUZDX0VMU19RU0EgPSAweDdFLAkvKiBRdWVyeSBTZWN1cml0eSBBdHRyaWJ1dGVzLiBSZWYgRkMtU1AgKi8KKwlGQ19FTFNfRTJFX0xCRUFDT04gPSAweDgxLAorCQkJCS8qIEVuZC10by1FbmQgTGluayBCZWFjb24gKi8KKwlGQ19FTFNfQVVUSCA9IDB4OTAsCS8qIEF1dGhlbnRpY2F0aW9uLiBSZWYgRkMtU1AgKi8KKwlGQ19FTFNfUkZDTiA9IDB4OTcsCS8qIFJlcXVlc3QgRmFicmljIENoYW5nZSBOb3RpZmljYXRpb24uIFJlZgorCQkJCSAqRkMtU1AgKi8KKworfTsKKworLyoKKyAqICBWZXJzaW9uIG51bWJlcnMgZm9yIEZDLVBIIHN0YW5kYXJkcywKKyAqICB1c2VkIGluIGxvZ2luIHRvIGluZGljYXRlIHdoYXQgcG9ydAorICogIHN1cHBvcnRzLiBTZWUgRkMtUEgtWCB0YWJsZSAxNTguCisgKi8KK2VudW0geworCUZDX1BIX1ZFUl80XzMgPSAweDA5LAorCUZDX1BIX1ZFUl9QSF8zID0gMHgyMCwKK307CisKKy8qCisgKiBQRFUgc2l6ZSBkZWZpbmVzCisgKi8KK2VudW0geworCUZDX01JTl9QRFVTWiA9IDUxMiwKKwlGQ19NQVhfUERVU1ogPSAyMTEyLAorfTsKKworLyoKKyAqIE5fUG9ydCBQTE9HSSBDb21tb24gU2VydmljZSBQYXJhbWV0ZXJzLgorICogRkMtUEgteC4gRmlndXJlLTc2LiBwZy4gMzA4LgorICovCitzdHJ1Y3QgZmNfcGxvZ2lfY3NwX3N7CisJdTggICAgICAgICB2ZXJoaTsJLyogRkMtUEggaGlnaCB2ZXJzaW9uICovCisJdTggICAgICAgICB2ZXJsbzsJLyogRkMtUEggbG93IHZlcnNpb24gKi8KKwl1MTYgICAgICAgIGJiY3JlZDsJLyogQkJfQ3JlZGl0ICovCisKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgY2lybzoxLAkJLyogY29udGludW91c2x5IGluY3JlYXNpbmcgUk8gKi8KKwkJCXJybzoxLAkJLyogcmFuZG9tIHJlbGF0aXZlIG9mZnNldCAqLworCQkJbnBpdl9zdXBwOjEsCS8qIE5QSVYgc3VwcG9ydGVkICovCisJCQlwb3J0X3R5cGU6MSwJLyogTl9Qb3J0L0ZfcG9ydCAqLworCQkJYWx0YmJjcmVkOjEsCS8qIGFsdGVybmF0ZSBCQl9DcmVkaXQgKi8KKwkJCXJlc29sdXRpb246MSwJLyogbXMvbnMgRURfVE9WIHJlc29sdXRpb24gKi8KKwkJCXZ2bF9pbmZvOjEsCS8qIFZWTCBJbmZvIGluY2x1ZGVkICovCisJCQlyZXNlcnZlZDE6MTsKKworCXU4ICAgICAgICAgaGdfc3VwcDoxLAorCQkJcXVlcnlfZGJjOjEsCisJCQlzZWN1cml0eToxLAorCQkJc3luY19jYXA6MSwKKwkJCXJfdF90b3Y6MSwKKwkJCWRoX2R1cF9zdXBwOjEsCisJCQljaXNjOjEsCQkvKiBjb250aW51b3VzbHkgaW5jcmVhc2luZyBzZXEgY291bnQgKi8KKwkJCXBheWxvYWQ6MTsKKyNlbHNlCisJdTggICAgICAgICByZXNlcnZlZDI6MiwKKwkJCXJlc29sdXRpb246MSwJLyogbXMvbnMgRURfVE9WIHJlc29sdXRpb24gKi8KKwkJCWFsdGJiY3JlZDoxLAkvKiBhbHRlcm5hdGUgQkJfQ3JlZGl0ICovCisJCQlwb3J0X3R5cGU6MSwJLyogTl9Qb3J0L0ZfcG9ydCAqLworCQkJbnBpdl9zdXBwOjEsCS8qIE5QSVYgc3VwcG9ydGVkICovCisJCQlycm86MSwJCS8qIHJhbmRvbSByZWxhdGl2ZSBvZmZzZXQgKi8KKwkJCWNpcm86MTsJCS8qIGNvbnRpbnVvdXNseSBpbmNyZWFzaW5nIFJPICovCisKKwl1OCAgICAgICAgIHBheWxvYWQ6MSwKKwkJCWNpc2M6MSwJCS8qIGNvbnRpbnVvdXNseSBpbmNyZWFzaW5nIHNlcSBjb3VudCAqLworCQkJZGhfZHVwX3N1cHA6MSwKKwkJCXJfdF90b3Y6MSwKKwkJCXN5bmNfY2FwOjEsCisJCQlzZWN1cml0eToxLAorCQkJcXVlcnlfZGJjOjEsCisJCQloZ19zdXBwOjE7CisjZW5kaWYKKworCXUxNiAgICAgICAgcnhzejsJCS8qIHJlY2lldmUgZGF0YV9maWVsZCBzaXplICovCisKKwl1MTYgICAgICAgIGNvbnNlcTsKKwl1MTYgICAgICAgIHJvX2JpdG1hcDsKKworCXUzMiAgICAgICAgZV9kX3RvdjsKK307CisKKy8qCisgKiBOX1BvcnQgUExPR0kgQ2xhc3MgU3BlY2lmaWMgUGFyYW1ldGVycy4KKyAqIEZDLVBILXguIEZpZ3VyZSA3OC4gcGcuIDMxOC4KKyAqLworc3RydWN0IGZjX3Bsb2dpX2NscF9zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTMyICAgICAgICBjbGFzc192YWxpZDoxOworCXUzMiAgICAgICAgaW50ZXJtaXg6MTsJLyogY2xhc3MgaW50ZXJtaXggc3VwcG9ydGVkIGlmIHNldCA9MS4KKwkJCQkJICogdmFsaWQgb25seSBmb3IgY2xhc3MxLiBSZXNlcnZlZCBmb3IKKwkJCQkJICogY2xhc3MyICYgY2xhc3MzCisJCQkJCSAqLworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjI7CisJdTMyICAgICAgICBzZXF1ZW50aWFsOjE7CisJdTMyICAgICAgICByZXNlcnZlZDI6MzsKKyNlbHNlCisJdTMyICAgICAgICByZXNlcnZlZDI6MzsKKwl1MzIgICAgICAgIHNlcXVlbnRpYWw6MTsKKwl1MzIgICAgICAgIHJlc2VydmVkMToyOworCXUzMiAgICAgICAgaW50ZXJtaXg6MTsJLyogY2xhc3MgaW50ZXJtaXggc3VwcG9ydGVkIGlmIHNldCA9MS4KKwkJCQkJICogdmFsaWQgb25seSBmb3IgY2xhc3MxLiBSZXNlcnZlZCBmb3IKKwkJCQkJICogY2xhc3MyICYgY2xhc3MzCisJCQkJCSAqLworCXUzMiAgICAgICAgY2xhc3NfdmFsaWQ6MTsKKyNlbmRpZgorCisJdTMyICAgICAgICByZXNlcnZlZDM6MjQ7CisKKwl1MzIgICAgICAgIHJlc2VydmVkNDoxNjsKKwl1MzIgICAgICAgIHJ4c3o6MTY7CS8qIFJlY2VpdmUgZGF0YV9maWVsZCBzaXplICovCisKKwl1MzIgICAgICAgIHJlc2VydmVkNTo4OworCXUzMiAgICAgICAgY29uc2VxOjg7CisJdTMyICAgICAgICBlMmVfY3JlZGl0OjE2OwkvKiBlbmQgdG8gZW5kIGNyZWRpdCAqLworCisJdTMyICAgICAgICByZXNlcnZlZDc6ODsKKwl1MzIgICAgICAgIG9zcHg6ODsKKwl1MzIgICAgICAgIHJlc2VydmVkODoxNjsKK307CisKKyNkZWZpbmUgRkxPR0lfVlZMX0JSQ0QgICAgMHg0MjUyNDM0NCAvKiBBU0NJSSB2YWx1ZSBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4KKwkJCQkgICAgICAqIHN0cmluZyAiQlJDRCIgKi8KKworLyoKKyAqIFBMT0dJIGVscyBjb21tYW5kIGFuZCByZXBseSBwYXlsb2FkCisgKi8KK3N0cnVjdCBmY19sb2dpX3N7CisJc3RydWN0IGZjX2Vsc19jbWRfcyBlbHNfY21kOwkvKiBFTFMgY29tbWFuZCBjb2RlICovCisJc3RydWN0IGZjX3Bsb2dpX2NzcF9zICBjc3A7CQkvKiBjb21tb24gc2VydmljZSBwYXJhbXMgKi8KKwl3d25fdCAgICAgICAgICAgcG9ydF9uYW1lOworCXd3bl90ICAgICAgICAgICBub2RlX25hbWU7CisJc3RydWN0IGZjX3Bsb2dpX2NscF9zICBjbGFzczE7CQkvKiBjbGFzcyAxIHNlcnZpY2UgcGFyYW1ldGVycyAqLworCXN0cnVjdCBmY19wbG9naV9jbHBfcyAgY2xhc3MyOwkJLyogY2xhc3MgMiBzZXJ2aWNlIHBhcmFtZXRlcnMgKi8KKwlzdHJ1Y3QgZmNfcGxvZ2lfY2xwX3MgIGNsYXNzMzsJCS8qIGNsYXNzIDMgc2VydmljZSBwYXJhbWV0ZXJzICovCisJc3RydWN0IGZjX3Bsb2dpX2NscF9zICBjbGFzczQ7CQkvKiBjbGFzcyA0IHNlcnZpY2UgcGFyYW1ldGVycyAqLworCXU4ICAgICAgICAgdnZsWzE2XTsJLyogdmVuZG9yIHZlcnNpb24gbGV2ZWwgKi8KK307CisKKy8qCisgKiBMT0dPIGVscyBjb21tYW5kIHBheWxvYWQKKyAqLworc3RydWN0IGZjX2xvZ29fc3sKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgIGVsc19jbWQ7CS8qIEVMUyBjb21tYW5kIGNvZGUgKi8KKwl1MzIgICAgICAgIHJlczE6ODsKKwl1MzIgICAgICAgIG5wb3J0X2lkOjI0OwkvKiBOX1BvcnQgaWRlbnRpZmllciBvZiBzb3VyY2UgKi8KKwl3d25fdCAgICAgICAgICAgb3JpZ19wb3J0X25hbWU7CS8qIFBvcnQgbmFtZSBvZiB0aGUgTE9HTyBvcmlnaW5hdG9yICovCit9OworCisvKgorICogQURJU0MgZWxzIGNvbW1hbmQgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfYWRpc2NfcyB7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICBlbHNfY21kOwkvKiBFTFMgY29tbWFuZCBjb2RlICovCisJdTMyICAgICAgICByZXMxOjg7CisJdTMyICAgICAgICBvcmlnX0hBOjI0OwkvKiBvcmlnaW5hdG9yIGhhcmQgYWRkcmVzcyAqLworCXd3bl90ICAgICAgICAgICBvcmlnX3BvcnRfbmFtZTsJLyogb3JpZ2luYXRvciBwb3J0IG5hbWUgKi8KKwl3d25fdCAgICAgICAgICAgb3JpZ19ub2RlX25hbWU7CS8qIG9yaWdpbmF0b3Igbm9kZSBuYW1lICovCisJdTMyICAgICAgICByZXMyOjg7CisJdTMyICAgICAgICBucG9ydF9pZDoyNDsJLyogb3JpZ2luYXRvciBOUG9ydElEICovCit9OworCisvKgorICogRXhjaGFuZ2Ugc3RhdHVzIGJsb2NrCisgKi8KK3N0cnVjdCBmY19leGNoX3N0YXR1c19ibGtfc3sKKwl1MzIgICAgICAgIG94aWQ6MTY7CisJdTMyICAgICAgICByeGlkOjE2OworCXUzMiAgICAgICAgcmVzMTo4OworCXUzMiAgICAgICAgb3JpZ19ucDoyNDsJLyogb3JpZ2luYXRvciBOUG9ydElEICovCisJdTMyICAgICAgICByZXMyOjg7CisJdTMyICAgICAgICByZXNwX25wOjI0OwkvKiByZXNwb25kZXIgTlBvcnRJRCAqLworCXUzMiAgICAgICAgZXNfYml0czsKKwl1MzIgICAgICAgIHJlczM7CisJLyoKKwkgKiB1biBtb2RpZmllZCBzZWN0aW9uIG9mIHRoZSBmaWVsZHMKKwkgKi8KK307CisKKy8qCisgKiBSRVMgZWxzIGNvbW1hbmQgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfcmVzX3MgeworCXN0cnVjdCBmY19lbHNfY21kX3MgICAgZWxzX2NtZDsJLyogRUxTIGNvbW1hbmQgY29kZSAqLworCXUzMiAgICAgICAgcmVzMTo4OworCXUzMiAgICAgICAgbnBvcnRfaWQ6MjQ7CS8qIE5fUG9ydCBpZGVudGlmaWVyIG9mIHNvdXJjZSAqLworCXUzMiAgICAgICAgb3hpZDoxNjsKKwl1MzIgICAgICAgIHJ4aWQ6MTY7CisJdTggICAgICAgICBhc3NvY19oZHJbMzJdOworfTsKKworLyoKKyAqIFJFUyBlbHMgYWNjZXB0IHBheWxvYWQKKyAqLworc3RydWN0IGZjX3Jlc19hY2Nfc3sKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zIGVsc19jbWQ7CS8qIEVMUyBjb21tYW5kIGNvZGUgKi8KKwlzdHJ1Y3QgZmNfZXhjaF9zdGF0dXNfYmxrX3MgZmNfZXhjaF9ibGs7IC8qIEV4Y2hhbmdlIHN0YXR1cyBibG9jayAqLworfTsKKworLyoKKyAqIFJFQyBlbHMgY29tbWFuZCBwYXlsb2FkCisgKi8KK3N0cnVjdCBmY19yZWNfcyB7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICBlbHNfY21kOwkvKiBFTFMgY29tbWFuZCBjb2RlICovCisJdTMyICAgICAgICByZXMxOjg7CisJdTMyICAgICAgICBucG9ydF9pZDoyNDsJLyogTl9Qb3J0IGlkZW50aWZpZXIgb2Ygc291cmNlICovCisJdTMyICAgICAgICBveGlkOjE2OworCXUzMiAgICAgICAgcnhpZDoxNjsKK307CisKKyNkZWZpbmUgRkNfUkVDX0VTQl9PV05fUlNQCTB4ODAwMDAwMDAJLyogcmVzcG9uZGVyIG93bnMgKi8KKyNkZWZpbmUgRkNfUkVDX0VTQl9TSQkJMHg0MDAwMDAwMAkvKiBTSSBpcyBvd25lZCAJKi8KKyNkZWZpbmUgRkNfUkVDX0VTQl9DT01QCQkweDIwMDAwMDAwCS8qIGV4Y2hhbmdlIGlzIGNvbXBsZXRlCSovCisjZGVmaW5lIEZDX1JFQ19FU0JfRU5EQ09ORF9BQk4JMHgxMDAwMDAwMAkvKiBhYm5vcm1hbCBlbmRpbmcgCSovCisjZGVmaW5lIEZDX1JFQ19FU0JfUlFBQ1QJMHgwNDAwMDAwMAkvKiByZWNvdmVyeSBxdWFsIGFjdGl2ZQkqLworI2RlZmluZSBGQ19SRUNfRVNCX0VSUlBfTVNLCTB4MDMwMDAwMDAKKyNkZWZpbmUgRkNfUkVDX0VTQl9PWElEX0lOVgkweDAwODAwMDAwCS8qIGludmFsaWQgT1hJRAkJKi8KKyNkZWZpbmUgRkNfUkVDX0VTQl9SWElEX0lOVgkweDAwNDAwMDAwCS8qIGludmFsaWQgUlhJRAkJKi8KKyNkZWZpbmUgRkNfUkVDX0VTQl9QUklPX0lOVVNFCTB4MDAyMDAwMDAKKworLyoKKyAqIFJFQyBlbHMgYWNjZXB0IHBheWxvYWQKKyAqLworc3RydWN0IGZjX3JlY19hY2NfcyB7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICBlbHNfY21kOwkvKiBFTFMgY29tbWFuZCBjb2RlICovCisJdTMyICAgICAgICBveGlkOjE2OworCXUzMiAgICAgICAgcnhpZDoxNjsKKwl1MzIgICAgICAgIHJlczE6ODsKKwl1MzIgICAgICAgIG9yaWdfaWQ6MjQ7CS8qIE5fUG9ydCBpZCBvZiBleGNoYW5nZSBvcmlnaW5hdG9yICovCisJdTMyICAgICAgICByZXMyOjg7CisJdTMyICAgICAgICByZXNwX2lkOjI0OwkvKiBOX1BvcnQgaWQgb2YgZXhjaGFuZ2UgcmVzcG9uZGVyICovCisJdTMyICAgICAgICBjb3VudDsJCS8qIGRhdGEgdHJhbnNmZXIgY291bnQgKi8KKwl1MzIgICAgICAgIGVfc3RhdDsJCS8qIGV4Y2hhbmdlIHN0YXR1cyAqLworfTsKKworLyoKKyAqIFJTSSBlbHMgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfcnNpX3MgeworCXN0cnVjdCBmY19lbHNfY21kX3MgICAgZWxzX2NtZDsKKwl1MzIgICAgICAgIHJlczE6ODsKKwl1MzIgICAgICAgIG9yaWdfc2lkOjI0OworCXUzMiAgICAgICAgb3hpZDoxNjsKKwl1MzIgICAgICAgIHJ4aWQ6MTY7Cit9OworCisvKgorICogc3RydWN0dXJlIGZvciBQUkxJIHBhcmFtYXRlciBwYWdlcywgYm90aCByZXF1ZXN0ICYgcmVzcG9uc2UKKyAqIHNlZSBGQy1QSC1YIHRhYmxlIDExMyAmIDExNSBmb3IgZXhwbGFuYXRpb24gYWxzbyBGQ1AgdGFibGUgOAorICovCitzdHJ1Y3QgZmNfcHJsaV9wYXJhbXNfc3sKKwl1MzIgICAgICAgIHJlc2VydmVkOiAxNjsKKyNpZmRlZiBfX0JJR0VORElBTgorCXUzMiAgICAgICAgcmVzZXJ2ZWQxOiA1OworCXUzMiAgICAgICAgcmVjX3N1cHBvcnQgOiAxOworCXUzMiAgICAgICAgdGFza19yZXRyeV9pZCA6IDE7CisJdTMyICAgICAgICByZXRyeSA6IDE7CisKKwl1MzIgICAgICAgIGNvbmZpcm0gOiAxOworCXUzMiAgICAgICAgZG92ZXJsYXk6MTsKKwl1MzIgICAgICAgIGluaXRpYXRvcjoxOworCXUzMiAgICAgICAgdGFyZ2V0OjE7CisJdTMyICAgICAgICBjZG1peDoxOworCXUzMiAgICAgICAgZHJtaXg6MTsKKwl1MzIgICAgICAgIHJ4cmRpc2FiOjE7CisJdTMyICAgICAgICB3eHJkaXNhYjoxOworI2Vsc2UKKwl1MzIgICAgICAgIHJldHJ5IDogMTsKKwl1MzIgICAgICAgIHRhc2tfcmV0cnlfaWQgOiAxOworCXUzMiAgICAgICAgcmVjX3N1cHBvcnQgOiAxOworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOiA1OworCisJdTMyICAgICAgICB3eHJkaXNhYjoxOworCXUzMiAgICAgICAgcnhyZGlzYWI6MTsKKwl1MzIgICAgICAgIGRybWl4OjE7CisJdTMyICAgICAgICBjZG1peDoxOworCXUzMiAgICAgICAgdGFyZ2V0OjE7CisJdTMyICAgICAgICBpbml0aWF0b3I6MTsKKwl1MzIgICAgICAgIGRvdmVybGF5OjE7CisJdTMyICAgICAgICBjb25maXJtIDogMTsKKyNlbmRpZgorfTsKKworLyoKKyAqIHZhbGlkIHZhbHVlcyBmb3IgcnNwY29kZSBpbiBQUkxJIEFDQyBwYXlsb2FkCisgKi8KK2VudW0geworCUZDX1BSTElfQUNDX1hRVEQgPSAweDEsCQkvKiByZXF1ZXN0IGV4ZWN1dGVkICovCisJRkNfUFJMSV9BQ0NfUFJFREVGX0lNRyA9IDB4NSwJLyogcHJlZGVmaW5lZCBpbWFnZSAtIG5vIHBybGkgbmVlZGVkICovCit9OworCitzdHJ1Y3QgZmNfcHJsaV9wYXJhbXNfcGFnZV9zeworCXUzMiAgICAgICAgdHlwZTo4OworCXUzMiAgICAgICAgY29kZXh0Ojg7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1MzIgICAgICAgIG9yaWdwcm9jYXN2OjE7CisJdTMyICAgICAgICByc3BwYXY6MTsKKwl1MzIgICAgICAgIGltYWdlcGFpcjoxOworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTMyICAgICAgICByc3Bjb2RlOjQ7CisjZWxzZQorCXUzMiAgICAgICAgcnNwY29kZTo0OworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTMyICAgICAgICBpbWFnZXBhaXI6MTsKKwl1MzIgICAgICAgIHJzcHBhdjoxOworCXUzMiAgICAgICAgb3JpZ3Byb2Nhc3Y6MTsKKyNlbmRpZgorCXUzMiAgICAgICAgcmVzZXJ2ZWQyOjg7CisKKwl1MzIgICAgICAgIG9yaWdwcm9jYXM7CisJdTMyICAgICAgICByc3Bwcm9jYXM7CisJc3RydWN0IGZjX3BybGlfcGFyYW1zX3MgIHNlcnZwYXJhbXM7Cit9OworCisvKgorICogUFJMSSByZXF1ZXN0IGFuZCBhY2NlcHQgcGF5bG9hZCwgRkMtUEgtWCB0YWJsZXMgMTEyICYgMTE0CisgKi8KK3N0cnVjdCBmY19wcmxpX3N7CisJdTMyICAgICAgICBjb21tYW5kOjg7CisJdTMyICAgICAgICBwZ2xlbjo4OworCXUzMiAgICAgICAgcGFnZWJ5dGVzOjE2OworCXN0cnVjdCBmY19wcmxpX3BhcmFtc19wYWdlX3MgcGFyYW1wYWdlOworfTsKKworLyoKKyAqIFBSTE8gbG9nb3V0IHBhcmFtcyBwYWdlCisgKi8KK3N0cnVjdCBmY19wcmxvX3BhcmFtc19wYWdlX3N7CisJdTMyICAgICAgICB0eXBlOjg7CisJdTMyICAgICAgICB0eXBlX2V4dDo4OworI2lmZGVmIF9fQklHRU5ESUFOCisJdTMyICAgICAgICBvcGFfdmFsaWQ6MTsJLyogb3JpZ2luYXRvciBwcm9jZXNzIGFzc29jaWF0b3IKKwkJCQkJICogdmFsaWQKKwkJCQkJICovCisJdTMyICAgICAgICBycGFfdmFsaWQ6MTsJLyogcmVzcG9uZGVyIHByb2Nlc3MgYXNzb2NpYXRvciB2YWxpZCAqLworCXUzMiAgICAgICAgcmVzMToxNDsKKyNlbHNlCisJdTMyICAgICAgICByZXMxOjE0OworCXUzMiAgICAgICAgcnBhX3ZhbGlkOjE7CS8qIHJlc3BvbmRlciBwcm9jZXNzIGFzc29jaWF0b3IgdmFsaWQgKi8KKwl1MzIgICAgICAgIG9wYV92YWxpZDoxOwkvKiBvcmlnaW5hdG9yIHByb2Nlc3MgYXNzb2NpYXRvcgorCQkJCQkgKiB2YWxpZAorCQkJCQkgKi8KKyNlbmRpZgorCXUzMiAgICAgICAgb3JpZ19wcm9jZXNzX2Fzc2M7CisJdTMyICAgICAgICByZXNwX3Byb2Nlc3NfYXNzYzsKKworCXUzMiAgICAgICAgcmVzMjsKK307CisKKy8qCisgKiBQUkxPIGVscyBjb21tYW5kIHBheWxvYWQKKyAqLworc3RydWN0IGZjX3BybG9fc3sKKwl1MzIgICAgICAgIAljb21tYW5kOjg7CisJdTMyICAgICAgICAJcGFnZV9sZW46ODsKKwl1MzIgICAgICAgIAlwYXlsb2FkX2xlbjoxNjsKKwlzdHJ1Y3QgZmNfcHJsb19wYXJhbXNfcGFnZV9zIAlwcmxvX3BhcmFtc1sxXTsKK307CisKKy8qCisgKiBQUkxPIExvZ291dCByZXNwb25zZSBwYXJhbWV0ZXIgcGFnZQorICovCitzdHJ1Y3QgZmNfcHJsb19hY2NfcGFyYW1zX3BhZ2Vfc3sKKwl1MzIgICAgICAgIHR5cGU6ODsKKwl1MzIgICAgICAgIHR5cGVfZXh0Ojg7CisKKyNpZmRlZiBfX0JJR0VORElBTgorCXUzMiAgICAgICAgb3BhX3ZhbGlkOjE7CS8qIG9yaWdpbmF0b3IgcHJvY2VzcyBhc3NvY2lhdG9yCisJCQkJCSAqIHZhbGlkCisJCQkJCSAqLworCXUzMiAgICAgICAgcnBhX3ZhbGlkOjE7CS8qIHJlc3BvbmRlciBwcm9jZXNzIGFzc29jaWF0b3IgdmFsaWQgKi8KKwl1MzIgICAgICAgIHJlczE6MTQ7CisjZWxzZQorCXUzMiAgICAgICAgcmVzMToxNDsKKwl1MzIgICAgICAgIHJwYV92YWxpZDoxOwkvKiByZXNwb25kZXIgcHJvY2VzcyBhc3NvY2lhdG9yIHZhbGlkICovCisJdTMyICAgICAgICBvcGFfdmFsaWQ6MTsJLyogb3JpZ2luYXRvciBwcm9jZXNzIGFzc29jaWF0b3IKKwkJCQkJICogdmFsaWQKKwkJCQkJICovCisjZW5kaWYKKwl1MzIgICAgICAgIG9yaWdfcHJvY2Vzc19hc3NjOworCXUzMiAgICAgICAgcmVzcF9wcm9jZXNzX2Fzc2M7CisKKwl1MzIgICAgICAgIGZjNHR5cGVfY3NwOworfTsKKworLyoKKyAqIFBSTE8gZWxzIGNvbW1hbmQgQUNDIHBheWxvYWQKKyAqLworc3RydWN0IGZjX3BybG9fYWNjX3N7CisJdTMyICAgICAgICBjb21tYW5kOjg7CisJdTMyICAgICAgICBwYWdlX2xlbjo4OworCXUzMiAgICAgICAgcGF5bG9hZF9sZW46MTY7CisJc3RydWN0IGZjX3BybG9fYWNjX3BhcmFtc19wYWdlX3MgcHJsb19hY2NfcGFyYW1zWzFdOworfTsKKworLyoKKyAqIFNDUiBlbHMgY29tbWFuZCBwYXlsb2FkCisgKi8KK2VudW0geworCUZDX1NDUl9SRUdfRlVOQ19GQUJSSUNfREVURUNURUQgPSAweDAxLAorCUZDX1NDUl9SRUdfRlVOQ19OX1BPUlRfREVURUNURUQgPSAweDAyLAorCUZDX1NDUl9SRUdfRlVOQ19GVUxMID0gMHgwMywKKwlGQ19TQ1JfUkVHX0ZVTkNfQ0xFQVJfUkVHID0gMHhGRiwKK307CisKKy8qIFNDUiBWVSByZWdpc3RyYXRpb25zICovCitlbnVtIHsKKwlGQ19WVV9TQ1JfUkVHX0ZVTkNfRkFCUklDX05BTUVfQ0hBTkdFID0gMHgwMQorfTsKKworc3RydWN0IGZjX3Njcl9zeworCXUzMiBjb21tYW5kOjg7CisJdTMyIHJlczoyNDsKKwl1MzIgdnVfcmVnX2Z1bmM6ODsgLyogVmVuZG9yIFVuaXF1ZSBSZWdpc3RyYXRpb25zICovCisJdTMyIHJlczE6MTY7CisJdTMyIHJlZ19mdW5jOjg7Cit9OworCisvKgorICogSW5mb3JtYXRpb24gY2F0ZWdvcnkgZm9yIEJhc2ljIGxpbmsgZGF0YQorICovCitlbnVtIHsKKwlGQ19DQVRfTk9QCT0gMHgwLAorCUZDX0NBVF9BQlRTCT0gMHgxLAorCUZDX0NBVF9STUMJPSAweDIsCisJRkNfQ0FUX0JBX0FDQwk9IDB4NCwKKwlGQ19DQVRfQkFfUkpUCT0gMHg1LAorCUZDX0NBVF9QUk1UCT0gMHg2LAorfTsKKworLyoKKyAqIExTX1JKVCBlbHMgcmVwbHkgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfbHNfcmp0X3MgeworCXN0cnVjdCBmY19lbHNfY21kX3MgICAgZWxzX2NtZDsJCS8qIEVMUyBjb21tYW5kIGNvZGUgKi8KKwl1MzIgICAgICAgIHJlczE6ODsKKwl1MzIgICAgICAgIHJlYXNvbl9jb2RlOjg7CQkvKiBSZWFzb24gY29kZSBmb3IgcmVqZWN0ICovCisJdTMyICAgICAgICByZWFzb25fY29kZV9leHBsOjg7CS8qIFJlYXNvbiBjb2RlIGV4cGxhbmF0aW9uICovCisJdTMyICAgICAgICB2ZW5kb3JfdW5pcXVlOjg7CS8qIFZlbmRvciBzcGVjaWZpYyAqLworfTsKKworLyoKKyAqIExTX1JKVCByZWFzb24gY29kZXMKKyAqLworZW51bSB7CisJRkNfTFNfUkpUX1JTTl9JTlZfQ01EX0NPREUJPSAweDAxLAorCUZDX0xTX1JKVF9SU05fTE9HSUNBTF9FUlJPUgk9IDB4MDMsCisJRkNfTFNfUkpUX1JTTl9MT0dJQ0FMX0JVU1kJPSAweDA1LAorCUZDX0xTX1JKVF9SU05fUFJPVE9DT0xfRVJST1IJPSAweDA3LAorCUZDX0xTX1JKVF9SU05fVU5BQkxFX1RPX1BFUkZfQ01EID0gMHgwOSwKKwlGQ19MU19SSlRfUlNOX0NNRF9OT1RfU1VQUAk9IDB4MEIsCit9OworCisvKgorICogTFNfUkpUIHJlYXNvbiBjb2RlIGV4cGxhbmF0aW9uCisgKi8KK2VudW0geworCUZDX0xTX1JKVF9FWFBfTk9fQURETF9JTkZPCQk9IDB4MDAsCisJRkNfTFNfUkpUX0VYUF9TUEFSTVNfRVJSX09QVElPTlMJPSAweDAxLAorCUZDX0xTX1JKVF9FWFBfU1BBUk1TX0VSUl9JTklfQ1RMCT0gMHgwMywKKwlGQ19MU19SSlRfRVhQX1NQQVJNU19FUlJfUkVDX0NUTAk9IDB4MDUsCisJRkNfTFNfUkpUX0VYUF9TUEFSTVNfRVJSX1JYU1oJCT0gMHgwNywKKwlGQ19MU19SSlRfRVhQX1NQQVJNU19FUlJfQ09OU0VRCQk9IDB4MDksCisJRkNfTFNfUkpUX0VYUF9TUEFSTVNfRVJSX0NSRURJVAkJPSAweDBCLAorCUZDX0xTX1JKVF9FWFBfSU5WX1BPUlRfTkFNRQkJPSAweDBELAorCUZDX0xTX1JKVF9FWFBfSU5WX05PREVfRkFCUklDX05BTUUJPSAweDBFLAorCUZDX0xTX1JKVF9FWFBfSU5WX0NTUAkJCT0gMHgwRiwKKwlGQ19MU19SSlRfRVhQX0lOVl9BU1NPQ19IRFIJCT0gMHgxMSwKKwlGQ19MU19SSlRfRVhQX0FTU09DX0hEUl9SRVFECQk9IDB4MTMsCisJRkNfTFNfUkpUX0VYUF9JTlZfT1JJR19TX0lECQk9IDB4MTUsCisJRkNfTFNfUkpUX0VYUF9JTlZfT1hJRF9SWElEX0NPTUIJPSAweDE3LAorCUZDX0xTX1JKVF9FWFBfQ01EX0FMUkVBRFlfSU5fUFJPRwk9IDB4MTksCisJRkNfTFNfUkpUX0VYUF9MT0dJTl9SRVFVSVJFRAkJPSAweDFFLAorCUZDX0xTX1JKVF9FWFBfSU5WQUxJRF9OUE9SVF9JRAkJPSAweDFGLAorCUZDX0xTX1JKVF9FWFBfSU5TVUZGX1JFUwkJPSAweDI5LAorCUZDX0xTX1JKVF9FWFBfQ01EX05PVF9TVVBQCQk9IDB4MkMsCisJRkNfTFNfUkpUX0VYUF9JTlZfUEFZTE9BRF9MRU4JCT0gMHgyRCwKK307CisKKy8qCisgKiBSUlEgZWxzIGNvbW1hbmQgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfcnJxX3N7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICBlbHNfY21kOwkvKiBFTFMgY29tbWFuZCBjb2RlICovCisJdTMyICAgICAgICByZXMxOjg7CisJdTMyICAgICAgICBzX2lkOjI0OwkvKiBleGNoYW5nZSBvcmlnaW5hdG9yIFNfSUQgKi8KKworCXUzMiAgICAgICAgb3hfaWQ6MTY7CS8qIG9yaWdpbmF0b3IgZXhjaGFuZ2UgSUQgKi8KKwl1MzIgICAgICAgIHJ4X2lkOjE2OwkvKiByZXNwb25kZXIgZXhjaGFuZ2UgSUQgKi8KKworCXUzMiAgICAgICAgcmVzMls4XTsJLyogb3B0aW9uYWwgYXNzb2NpYXRpb24gaGVhZGVyICovCit9OworCisvKgorICogQUJUUyBCQV9BQ0MgcmVwbHkgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfYmFfYWNjX3N7CisJdTMyICAgICAgICBzZXFfaWRfdmFsaWQ6ODsJLyogc2V0IHRvIDB4MDAgZm9yIEFib3J0IEV4Y2hhbmdlICovCisJdTMyICAgICAgICBzZXFfaWQ6ODsJLyogaW52YWxpZCBmb3IgQWJvcnQgRXhjaGFuZ2UgKi8KKwl1MzIgICAgICAgIHJlczI6MTY7CisJdTMyICAgICAgICBveF9pZDoxNjsJLyogT1hfSUQgZnJvbSBBQlRTIGZyYW1lICovCisJdTMyICAgICAgICByeF9pZDoxNjsJLyogUlhfSUQgZnJvbSBBQlRTIGZyYW1lICovCisJdTMyICAgICAgICBsb3dfc2VxX2NudDoxNjsJLyogc2V0IHRvIDB4MDAwMCBmb3IgQWJvcnQgRXhjaGFuZ2UgKi8KKwl1MzIgICAgICAgIGhpZ2hfc2VxX2NudDoxNjsvKiBzZXQgdG8gMHhGRkZGIGZvciBBYm9ydCBFeGNoYW5nZSAqLworfTsKKworLyoKKyAqIEFCVFMgQkFfUkpUIHJlamVjdCBwYXlsb2FkCisgKi8KK3N0cnVjdCBmY19iYV9yanRfc3sKKwl1MzIgICAgICAgIHJlczE6ODsJCS8qIFJlc2VydmVkICovCisJdTMyICAgICAgICByZWFzb25fY29kZTo4OwkvKiByZWFzb24gY29kZSBmb3IgcmVqZWN0ICovCisJdTMyICAgICAgICByZWFzb25fZXhwbDo4OwkvKiByZWFzb24gY29kZSBleHBsYW5hdGlvbiAqLworCXUzMiAgICAgICAgdmVuZG9yX3VuaXF1ZTo4Oy8qIHZlbmRvciB1bmlxdWUgcmVhc29uIGNvZGUsc2V0IHRvIDAgKi8KK307CisKKy8qCisgKiBUUFJMTyBsb2dvdXQgcGFyYW1ldGVyIHBhZ2UKKyAqLworc3RydWN0IGZjX3RwcmxvX3BhcmFtc19wYWdlX3N7CisJdTMyICAgICAgICB0eXBlOjg7CisJdTMyICAgICAgICB0eXBlX2V4dDo4OworCisjaWZkZWYgX19CSUdFTkRJQU4KKwl1MzIgICAgICAgIG9wYV92YWxpZDoxOworCXUzMiAgICAgICAgcnBhX3ZhbGlkOjE7CisJdTMyICAgICAgICB0cG9fbnBvcnRfdmFsaWQ6MTsKKwl1MzIgICAgICAgIGdsb2JhbF9wcm9jZXNzX2xvZ291dDoxOworCXUzMiAgICAgICAgcmVzMToxMjsKKyNlbHNlCisJdTMyICAgICAgICByZXMxOjEyOworCXUzMiAgICAgICAgZ2xvYmFsX3Byb2Nlc3NfbG9nb3V0OjE7CisJdTMyICAgICAgICB0cG9fbnBvcnRfdmFsaWQ6MTsKKwl1MzIgICAgICAgIHJwYV92YWxpZDoxOworCXUzMiAgICAgICAgb3BhX3ZhbGlkOjE7CisjZW5kaWYKKworCXUzMiAgICAgICAgb3JpZ19wcm9jZXNzX2Fzc2M7CisJdTMyICAgICAgICByZXNwX3Byb2Nlc3NfYXNzYzsKKworCXUzMiAgICAgICAgcmVzMjo4OworCXUzMiAgICAgICAgdHBvX25wb3J0X2lkOworfTsKKworLyoKKyAqIFRQUkxPIEVMUyBjb21tYW5kIHBheWxvYWQKKyAqLworc3RydWN0IGZjX3RwcmxvX3N7CisJdTMyICAgICAgICBjb21tYW5kOjg7CisJdTMyICAgICAgICBwYWdlX2xlbjo4OworCXUzMiAgICAgICAgcGF5bG9hZF9sZW46MTY7CisKKwlzdHJ1Y3QgZmNfdHBybG9fcGFyYW1zX3BhZ2VfcyB0cHJsb19wYXJhbXNbMV07Cit9OworCitlbnVtIGZjX3RwcmxvX3R5cGV7CisJRkNfR0xPQkFMX0xPR08gPSAxLAorCUZDX1RQUl9MT0dPCit9OworCisvKgorICogVFBSTE8gZWxzIGNvbW1hbmQgQUNDIHBheWxvYWQKKyAqLworc3RydWN0IGZjX3RwcmxvX2FjY19zeworCXUzMgljb21tYW5kOjg7CisJdTMyCXBhZ2VfbGVuOjg7CisJdTMyCXBheWxvYWRfbGVuOjE2OworCXN0cnVjdCBmY19wcmxvX2FjY19wYXJhbXNfcGFnZV9zIHRwcmxvX2FjY19wYXJhbXNbMV07Cit9OworCisvKgorICogUlNDTiBlbHMgY29tbWFuZCByZXEgcGF5bG9hZAorICovCisjZGVmaW5lIEZDX1JTQ05fUEdMRU4JMHg0CisKK2VudW0gZmNfcnNjbl9mb3JtYXR7CisJRkNfUlNDTl9GT1JNQVRfUE9SVElECT0gMHgwLAorCUZDX1JTQ05fRk9STUFUX0FSRUEJPSAweDEsCisJRkNfUlNDTl9GT1JNQVRfRE9NQUlOCT0gMHgyLAorCUZDX1JTQ05fRk9STUFUX0ZBQlJJQwk9IDB4MywKK307CisKK3N0cnVjdCBmY19yc2NuX2V2ZW50X3N7CisJdTMyICAgICAgICBmb3JtYXQ6MjsKKwl1MzIgICAgICAgIHF1YWxpZmllcjo0OworCXUzMiAgICAgICAgcmVzdmQ6MjsKKwl1MzIgICAgICAgIHBvcnRpZDoyNDsKK307CisKK3N0cnVjdCBmY19yc2NuX3BsX3N7CisJdTggICAgICAgICBjb21tYW5kOworCXU4ICAgICAgICAgcGFnZWxlbjsKKwl1MTYgICAgICAgIHBheWxkbGVuOworCXN0cnVjdCBmY19yc2NuX2V2ZW50X3MgZXZlbnRbMV07Cit9OworCisvKgorICogRUNITyBlbHMgY29tbWFuZCByZXEgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfZWNob19zIHsKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgIGVsc19jbWQ7Cit9OworCisvKgorICogUk5JRCBlbHMgY29tbWFuZAorICovCisKKyNkZWZpbmUgUk5JRF9OT0RFSURfREFUQV9GT1JNQVRfQ09NTU9OICAgIAkJIDB4MDAKKyNkZWZpbmUgUk5JRF9OT0RFSURfREFUQV9GT1JNQVRfRkNQMyAgICAgICAgCQkgMHgwOAorI2RlZmluZSBSTklEX05PREVJRF9EQVRBX0ZPUk1BVF9ESVNDT1ZFUlkgICAgIAkJMHhERgorCisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX1VOS05PV04gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUk5JRF9BU1NPQ0lBVEVEX1RZUEVfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBSTklEX0FTU09DSUFURURfVFlQRV9IVUIgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUk5JRF9BU1NPQ0lBVEVEX1RZUEVfR0FURVdBWSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBSTklEX0FTU09DSUFURURfVFlQRV9TVE9SQUdFX0RFVklDRSAgICAgICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX0hPU1QgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEEKKyNkZWZpbmUgUk5JRF9BU1NPQ0lBVEVEX1RZUEVfU1RPUkFHRV9TVUJTWVNURU0gICAgICAgICAgMHgwMDAwMDAwQgorI2RlZmluZSBSTklEX0FTU09DSUFURURfVFlQRV9TVE9SQUdFX0FDQ0VTU19ERVZJQ0UgICAgICAweDAwMDAwMDBFCisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX05BU19TRVJWRVIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTEKKyNkZWZpbmUgUk5JRF9BU1NPQ0lBVEVEX1RZUEVfQlJJREdFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBSTklEX0FTU09DSUFURURfVFlQRV9WSVJUVUFMSVpBVElPTl9ERVZJQ0UgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX01VTFRJX0ZVTkNUSU9OX0RFVklDRSAgICAgIDB4MDAwMDAwRkYKKworLyoKKyAqIFJOSUQgZWxzIGNvbW1hbmQgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfcm5pZF9jbWRfc3sKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgIGVsc19jbWQ7CisJdTMyICAgICAgICBub2RlX2lkX2RhdGFfZm9ybWF0Ojg7CisJdTMyICAgICAgICByZXNlcnZlZDoyNDsKK307CisKKy8qCisgKiBSTklEIGVscyByZXNwb25zZSBwYXlsb2FkCisgKi8KKworc3RydWN0IGZjX3JuaWRfY29tbW9uX2lkX2RhdGFfc3sKKwl3d25fdCAgICAgICAgICAgcG9ydF9uYW1lOworCXd3bl90ICAgICAgICAgICBub2RlX25hbWU7Cit9OworCitzdHJ1Y3QgZmNfcm5pZF9nZW5lcmFsX3RvcG9sb2d5X2RhdGFfc3sKKwl1MzIgICAgICAgIHZlbmRvcl91bmlxdWVbNF07CisJdTMyICAgICAgICBhc3NvX3R5cGU7CisJdTMyICAgICAgICBwaHlfcG9ydF9udW07CisJdTMyICAgICAgICBudW1fYXR0YWNoZWRfbm9kZXM7CisJdTMyICAgICAgICBub2RlX21nbXQ6ODsKKwl1MzIgICAgICAgIGlwX3ZlcnNpb246ODsKKwl1MzIgICAgICAgIHVkcF90Y3BfcG9ydF9udW06MTY7CisJdTMyICAgICAgICBpcF9hZGRyZXNzWzRdOworCXUzMiAgICAgICAgcmVzZXJ2ZWQ6MTY7CisJdTMyICAgICAgICB2ZW5kb3Jfc3BlY2lmaWM6MTY7Cit9OworCitzdHJ1Y3QgZmNfcm5pZF9hY2Nfc3sKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgIGVsc19jbWQ7CisJdTMyICAgICAgICBub2RlX2lkX2RhdGFfZm9ybWF0Ojg7CisJdTMyICAgICAgICBjb21tb25faWRfZGF0YV9sZW5ndGg6ODsKKwl1MzIgICAgICAgIHJlc2VydmVkOjg7CisJdTMyICAgICAgICBzcGVjaWZpY19pZF9kYXRhX2xlbmd0aDo4OworCXN0cnVjdCBmY19ybmlkX2NvbW1vbl9pZF9kYXRhX3MgY29tbW9uX2lkX2RhdGE7CisJc3RydWN0IGZjX3JuaWRfZ2VuZXJhbF90b3BvbG9neV9kYXRhX3MgZ2VuX3RvcG9sb2d5X2RhdGE7Cit9OworCisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX1VOS05PV04gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUk5JRF9BU1NPQ0lBVEVEX1RZUEVfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBSTklEX0FTU09DSUFURURfVFlQRV9IVUIgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUk5JRF9BU1NPQ0lBVEVEX1RZUEVfR0FURVdBWSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBSTklEX0FTU09DSUFURURfVFlQRV9TVE9SQUdFX0RFVklDRSAgICAgICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX0hPU1QgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEEKKyNkZWZpbmUgUk5JRF9BU1NPQ0lBVEVEX1RZUEVfU1RPUkFHRV9TVUJTWVNURU0gICAgICAgICAgMHgwMDAwMDAwQgorI2RlZmluZSBSTklEX0FTU09DSUFURURfVFlQRV9TVE9SQUdFX0FDQ0VTU19ERVZJQ0UgICAgICAweDAwMDAwMDBFCisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX05BU19TRVJWRVIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTEKKyNkZWZpbmUgUk5JRF9BU1NPQ0lBVEVEX1RZUEVfQlJJREdFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBSTklEX0FTU09DSUFURURfVFlQRV9WSVJUVUFMSVpBVElPTl9ERVZJQ0UgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFJOSURfQVNTT0NJQVRFRF9UWVBFX01VTFRJX0ZVTkNUSU9OX0RFVklDRSAgICAgIDB4MDAwMDAwRkYKKworZW51bSBmY19ycHNjX3NwZWVkX2NhcHsKKwlSUFNDX1NQRUVEX0NBUF8xRyA9IDB4ODAwMCwKKwlSUFNDX1NQRUVEX0NBUF8yRyA9IDB4NDAwMCwKKwlSUFNDX1NQRUVEX0NBUF80RyA9IDB4MjAwMCwKKwlSUFNDX1NQRUVEX0NBUF8xMEcgPSAweDEwMDAsCisJUlBTQ19TUEVFRF9DQVBfOEcgPSAweDA4MDAsCisJUlBTQ19TUEVFRF9DQVBfMTZHID0gMHgwNDAwLAorCisJUlBTQ19TUEVFRF9DQVBfVU5LTk9XTiA9IDB4MDAwMSwKK307CisKK2VudW0gZmNfcnBzY19vcF9zcGVlZF9zeworCVJQU0NfT1BfU1BFRURfMUcgPSAweDgwMDAsCisJUlBTQ19PUF9TUEVFRF8yRyA9IDB4NDAwMCwKKwlSUFNDX09QX1NQRUVEXzRHID0gMHgyMDAwLAorCVJQU0NfT1BfU1BFRURfMTBHID0gMHgxMDAwLAorCVJQU0NfT1BfU1BFRURfOEcgPSAweDA4MDAsCisJUlBTQ19PUF9TUEVFRF8xNkcgPSAweDA0MDAsCisKKwlSUFNDX09QX1NQRUVEX05PVF9FU1QgPSAweDAwMDEsCS8qISBzcGVlZCBub3QgZXN0YWJsaXNoZWQgKi8KK307CisKK3N0cnVjdCBmY19ycHNjX3NwZWVkX2luZm9fc3sKKwl1MTYgICAgICAgIHBvcnRfc3BlZWRfY2FwOwkvKiEgc2VlIGZjX3Jwc2Nfc3BlZWRfY2FwX3QgKi8KKwl1MTYgICAgICAgIHBvcnRfb3Bfc3BlZWQ7CS8qISBzZWUgZmNfcnBzY19vcF9zcGVlZF90ICovCit9OworCitlbnVtIGxpbmtfZTJlX2JlYWNvbl9zdWJjbWR7CisJTElOS19FMkVfQkVBQ09OX09OID0gMSwKKwlMSU5LX0UyRV9CRUFDT05fT0ZGID0gMgorfTsKKworZW51bSBiZWFjb25fdHlwZXsKKwlCRUFDT05fVFlQRV9OT1JNQUwJPSAxLAkvKiEgTm9ybWFsIEJlYWNvbmluZy4gR3JlZW4gKi8KKwlCRUFDT05fVFlQRV9XQVJOCT0gMiwJLyohIFdhcm5pbmcgQmVhY29uaW5nLiBZZWxsb3cvQW1iZXIgKi8KKwlCRUFDT05fVFlQRV9DUklUSUNBTAk9IDMJLyohIENyaXRpY2FsIEJlYWNvbmluZy4gUmVkICovCit9OworCitzdHJ1Y3QgbGlua19lMmVfYmVhY29uX3BhcmFtX3MgeworCXU4ICAgICAgICAgYmVhY29uX3R5cGU7CS8qIEJlYWNvbiBUeXBlLiBTZWUgYmVhY29uX3R5cGVfdCAqLworCXU4ICAgICAgICAgYmVhY29uX2ZyZXF1ZW5jeTsKKwkJCQkJLyogQmVhY29uIGZyZXF1ZW5jeS4gTnVtYmVyIG9mIGJsaW5rcworCQkJCQkgKiBwZXIgMTAgc2Vjb25kcworCQkJCQkgKi8KKwl1MTYgICAgICAgIGJlYWNvbl9kdXJhdGlvbjsvKiBCZWFjb24gZHVyYXRpb24gKGluIFNlY29uZHMpLiBUaGUKKwkJCQkJICogY29tbWFuZCBvcGVyYXRpb24gc2hvdWxkIGJlCisJCQkJCSAqIHRlcm1pbmF0ZWQgYXQgdGhlIGVuZCBvZiB0aGlzCisJCQkJCSAqIHRpbWVvdXQgdmFsdWUuCisJCQkJCSAqCisJCQkJCSAqIElnbm9yZWQgaWYgZGlhZ19zdWJfY21kIGlzCisJCQkJCSAqIExJTktfRTJFX0JFQUNPTl9PRkYuCisJCQkJCSAqCisJCQkJCSAqIElmIDAsIGJlYWNvbmluZyB3aWxsIGNvbnRpbnVlIHRpbGwgYQorCQkJCQkgKiBCRUFDT04gT0ZGIHJlcXVlc3QgaXMgcmVjZWl2ZWQKKwkJCQkJICovCit9OworCisvKgorICogTGluayBFMkUgYmVhY29uIHJlcXVlc3QvZ29vZCByZXNwb25zZSBmb3JtYXQuIEZvciBMU19SSlRzIHVzZSBmY19sc19yanRfdAorICovCitzdHJ1Y3QgbGlua19lMmVfYmVhY29uX3JlcV9zeworCXUzMiAgICAgICAgbHNfY29kZTsJLyohIEZDX0VMU19FMkVfTEJFQUNPTiBpbiByZXF1ZXN0cyAqCisJCQkJCSAqb3IgRkNfRUxTX0FDQyBpbiBnb29kIHJlcGxpZXMgKi8KKwl1MzIgICAgICAgIGxzX3N1Yl9jbWQ7CS8qISBTZWUgbGlua19lMmVfYmVhY29uX3N1YmNtZF90ICovCisJc3RydWN0IGxpbmtfZTJlX2JlYWNvbl9wYXJhbV9zIGJlYWNvbl9wYXJtOworfTsKKworLyoqCisgKiBJZiBSUFNDIHJlcXVlc3QgaXMgc2VudCB0byB0aGUgRG9tYWluIENvbnRyb2xsZXIsIHRoZSByZXF1ZXN0IGlzIGZvcgorICogYWxsIHRoZSBwb3J0cyB3aXRoaW4gdGhhdCBkb21haW4gKFRPRE8gLSBJIGRvbid0IHRoaW5rIEZPUyBpbXBsZW1lbnRzCisgKiB0aGlzLi4uKS4KKyAqLworc3RydWN0IGZjX3Jwc2NfY21kX3N7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICBlbHNfY21kOworfTsKKworLyoKKyAqIFJQU0MgQWNjCisgKi8KK3N0cnVjdCBmY19ycHNjX2FjY19zeworCXUzMiAgICAgICAgY29tbWFuZDo4OworCXUzMiAgICAgICAgcnN2ZDo4OworCXUzMiAgICAgICAgbnVtX2VudHJpZXM6MTY7CisKKwlzdHJ1Y3QgZmNfcnBzY19zcGVlZF9pbmZvX3Mgc3BlZWRfaW5mb1sxXTsKK307CisKKy8qKgorICogSWYgUlBTQzIgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSBEb21haW4gQ29udHJvbGxlciwKKyAqLworI2RlZmluZSBGQ19CUkNEX1RPS0VOICAgIDB4NDI1MjQzNDQKKworc3RydWN0IGZjX3Jwc2MyX2NtZF9zeworCXN0cnVjdCBmY19lbHNfY21kX3MgICAgZWxzX2NtZDsKKwl1MzIgICAgICAgCXRva2VuOworCXUxNiAgICAgCXJlc3ZkOworCXUxNiAgICAgCW51bV9waWRzOyAgICAgICAvKiBOdW1iZXIgb2YgcGlkcyBpbiB0aGUgcmVxdWVzdCAqLworCXN0cnVjdCAgeworCQl1MzIJcnN2ZDE6ODsKKwkJdTMyCXBpZDoyNDsJLyogcG9ydCBpZGVudGlmaWVyICovCisJfSBwaWRfbGlzdFsxXTsKK307CisKK2VudW0gZmNfcnBzYzJfcG9ydF90eXBleworCVJQU0MyX1BPUlRfVFlQRV9VTktOT1dOID0gMCwKKwlSUFNDMl9QT1JUX1RZUEVfTlBPUlQgICA9IDEsCisJUlBTQzJfUE9SVF9UWVBFX05MUE9SVCAgPSAyLAorCVJQU0MyX1BPUlRfVFlQRV9OUElWX1BPUlQgID0gMHg1ZiwKKwlSUFNDMl9QT1JUX1RZUEVfTlBPUlRfVFJVTksgID0gMHg2ZiwKK307CisKKy8qCisgKiBSUFNDMiBwb3J0SW5mbyBlbnRyeSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGZjX3Jwc2MyX3BvcnRfaW5mb19zeworICAgIHUzMiAgICBwaWQ7ICAgICAgICAvKiBQSUQgKi8KKyAgICB1MTYgICAgcmVzdmQxOworICAgIHUxNiAgICBpbmRleDsgICAgICAvKiBwb3J0IG51bWJlciAvIGluZGV4ICovCisgICAgdTggICAgIHJlc3ZkMjsKKyAgICB1OCAgICAJdHlwZTsgICAgICAgIC8qIHBvcnQgdHlwZSBOL05MLy4uLiAqLworICAgIHUxNiAgICBzcGVlZDsgICAgICAvKiBwb3J0IE9wZXJhdGluZyBTcGVlZCAqLworfTsKKworLyoKKyAqIFJQU0MyIEFjY2VwdCBwYXlsb2FkCisgKi8KK3N0cnVjdCBmY19ycHNjMl9hY2Nfc3sKKwl1OCAgICAgICAgZWxzX2NtZDsKKwl1OCAgICAgICAgcmVzdmQ7CisJdTE2ICAgICAgIG51bV9waWRzOyAgLyogTnVtYmVyIG9mIHBpZHMgaW4gdGhlIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgZmNfcnBzYzJfcG9ydF9pbmZvX3MgIHBvcnRfaW5mb1sxXTsgICAgLyogcG9ydCBpbmZvcm1hdGlvbiAqLworfTsKKworLyoqCisgKiBiaXQgZmllbGRzIHNvIHRoYXQgbXVsdGlwbGUgY2xhc3NlcyBjYW4gYmUgc3BlY2lmaWVkCisgKi8KK2VudW0gZmNfY29zeworCUZDX0NMQVNTXzIJPSAweDA0LAorCUZDX0NMQVNTXzMJPSAweDA4LAorCUZDX0NMQVNTXzJfMwk9IDB4MEMsCit9OworCisvKgorICogc3ltYm9saWMgbmFtZQorICovCitzdHJ1Y3QgZmNfc3ltbmFtZV9zeworCXU4ICAgICAgICAgc3ltbmFtZVtGQ19TWU1OQU1FX01BWF07Cit9OworCitzdHJ1Y3QgZmNfYWxwYWJtX3N7CisJdTggICAgICAgICBhbHBhX2JtW0ZDX0FMUEFfTUFYIC8gOF07Cit9OworCisvKgorICogcHJvdG9jb2wgZGVmYXVsdCB0aW1lb3V0IHZhbHVlcworICovCisjZGVmaW5lIEZDX0VEX1RPVgkJMgorI2RlZmluZSBGQ19SRUNfVE9WCQkoRkNfRURfVE9WICsgMSkKKyNkZWZpbmUgRkNfUkFfVE9WCQkxMAorI2RlZmluZSBGQ19FTFNfVE9WCQkoMiAqIEZDX1JBX1RPVikKKworLyoKKyAqIHZpcnR1YWwgZmFicmljIHJlbGF0ZWQgZGVmaW5lcworICovCisjZGVmaW5lIEZDX1ZGX0lEX05VTEwgICAgMAkvKiAgbXVzdCBub3QgYmUgdXNlZCBhcyBWRl9JRCAqLworI2RlZmluZSBGQ19WRl9JRF9NSU4gICAgIDEKKyNkZWZpbmUgRkNfVkZfSURfTUFYICAgICAweEVGRgorI2RlZmluZSBGQ19WRl9JRF9DVEwgICAgIDB4RkVGCS8qICBjb250cm9sIFZGX0lEICovCisKKy8qKgorICogVmlydHVhbCBGYWJyaWMgVGFnZ2luZyBoZWFkZXIgZm9ybWF0CisgKiBAY2F1dGlvbiBUaGlzIGlzIGRlZmluZWQgb25seSBpbiBCSUcgRU5ESUFOIGZvcm1hdC4KKyAqLworc3RydWN0IGZjX3ZmdF9zeworCXUzMiAgICAgICAgcl9jdGw6ODsKKwl1MzIgICAgICAgIHZlcjoyOworCXUzMiAgICAgICAgdHlwZTo0OworCXUzMiAgICAgICAgcmVzX2E6MjsKKwl1MzIgICAgICAgIHByaW9yaXR5OjM7CisJdTMyICAgICAgICB2Zl9pZDoxMjsKKwl1MzIgICAgICAgIHJlc19iOjE7CisJdTMyICAgICAgICBob3BjdDo4OworCXUzMiAgICAgICAgcmVzX2M6MjQ7Cit9OworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9wcm90b2NvbC9mY19zcC5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2ZjX3NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViYjBiMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9wcm90b2NvbC9mY19zcC5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19GQ19TUF9IX18KKyNkZWZpbmUgX19GQ19TUF9IX18KKworI2luY2x1ZGUgPHByb3RvY29sL3R5cGVzLmg+CisKKyNwcmFnbWEgcGFjaygxKQorCitlbnVtIGF1dGhfZWxzX2ZsYWdzeworCUZDX0FVVEhfRUxTX01PUkVfRlJBR1NfRkxBRyAJPSAweDgwLAkvKiEgYml0LTcuIE1vcmUgRnJhZ21lbnRzCisJCQkJCQkgKiBGb2xsb3cKKwkJCQkJCSAqLworCUZDX0FVVEhfRUxTX0NPTkNBVF9GTEFHIAk9IDB4NDAsCS8qISBiaXQtNi4gQ29uY2F0ZW5hdGlvbiBGbGFnICovCisJRkNfQVVUSF9FTFNfU0VRX05VTV9GTEFHIAk9IDB4MDEgCS8qISBiaXQtMC4gU2VxdWVuY2UgTnVtYmVyICovCit9OworCitlbnVtIGF1dGhfbXNnX2NvZGVzeworCUZDX0FVVEhfTUNfQVVUSF9SSlQJCT0gMHgwQSwJLyohIEF1dGggUmVqZWN0ICovCisJRkNfQVVUSF9NQ19BVVRIX05FRyAJCT0gMHgwQiwgLyohIEF1dGggTmVnb3RpYXRlICovCisJRkNfQVVUSF9NQ19BVVRIX0RPTkUgCQk9IDB4MEMsIC8qISBBdXRoIERvbmUgKi8KKworCUZDX0FVVEhfTUNfREhDSEFQX0NIQUwgCQk9IDB4MTAsIC8qISBESENIQVAgQ2hhbGxlbmdlICovCisJRkNfQVVUSF9NQ19ESENIQVBfUkVQTFkgCT0gMHgxMSwgLyohIERIQ0hBUCBSZXBseSAqLworCUZDX0FVVEhfTUNfREhDSEFQX1NVQ0MgCQk9IDB4MTIsIC8qISBESENIQVAgU3VjY2VzcyAqLworCisJRkNfQVVUSF9NQ19GQ0FQX1JFUSAJCT0gMHgxMywgLyohIEZDQVAgUmVxdWVzdCAqLworCUZDX0FVVEhfTUNfRkNBUF9BQ0sgCQk9IDB4MTQsIC8qISBGQ0FQIEFja25vd2xlZGdlICovCisJRkNfQVVUSF9NQ19GQ0FQX0NPTkYgCQk9IDB4MTUsIC8qISBGQ0FQIENvbmZpcm0gKi8KKworCUZDX0FVVEhfTUNfRkNQQVBfSU5JVCAJCT0gMHgxNiwgLyohIEZDUEFQIEluaXQgKi8KKwlGQ19BVVRIX01DX0ZDUEFQX0FDQyAJCT0gMHgxNywgLyohIEZDUEFQIEFjY2VwdCAqLworCUZDX0FVVEhfTUNfRkNQQVBfQ09NUCAJCT0gMHgxOCwgLyohIEZDUEFQIENvbXBsZXRlICovCisKKwlGQ19BVVRIX01DX0lLRV9TQV9JTklUIAkJPSAweDIyLCAvKiEgSUtFIFNBIElOSVQgKi8KKwlGQ19BVVRIX01DX0lLRV9TQV9BVVRIIAkJPSAweDIzLCAvKiEgSUtFIFNBIEF1dGggKi8KKwlGQ19BVVRIX01DX0lLRV9DUkVBVEVfQ0hJTERfU0EJPSAweDI0LCAvKiEgSUtFIENyZWF0ZSBDaGlsZCBTQSAqLworCUZDX0FVVEhfTUNfSUtFX0lORk8gCQk9IDB4MjUsIC8qISBJS0UgaW5mb3JtYXRpb25hbCAqLworfTsKKworZW51bSBhdXRoX3Byb3RvX3ZlcnNpb257CisJRkNfQVVUSF9QUk9UT19WRVJfMSAJPSAxLAkvKiEgUHJvdG9jb2wgVmVyc2lvbiAxICovCit9OworCitlbnVtIHsKKwlGQ19BVVRIX0VMU19DT01NQU5EX0NPREUgPSAweDkwLC8qISBBdXRoZW50aWNhdGlvbiBFTFMgQ29tbWFuZCBjb2RlICAqLworCUZDX0FVVEhfUFJPVE9fUEFSQU1fTEVOX1NaID0gNCwJLyohIFNpemUgb2YgUHJvdG8gUGFyYW1ldGVyIExlbiBGaWVsZCAqLworCUZDX0FVVEhfUFJPVE9fUEFSQU1fVkFMX1NaID0gNCwJLyohIFNpemUgb2YgUHJvdG8gUGFyYW1ldGVyIFZhbCBGaWVsZCAqLworCUZDX01BWF9BVVRIX1NFQ1JFVF9MRU4gICAgID0gMjU2LAorCQkJCQkvKiEgTWF4aW11bSBzZWNyZXQgc3RyaW5nIGxlbmd0aCAqLworCUZDX0FVVEhfTlVNX1VTQUJMRV9QUk9UT19MRU5fU1ogPSA0LAorCQkJCQkvKiEgU2l6ZSBvZiB1c2FibGUgcHJvdG9jb2xzIGZpZWxkICovCisJRkNfQVVUSF9SRVNQX1ZBTFVFX0xFTl9TWgk9IDQsCisJCQkJCS8qISBTaXplIG9mIHJlc3BvbnNlIHZhbHVlIGxlbmd0aCAqLworCUZDX01BWF9DSEFQX0tFWV9MRU4JPSAyNTYsCS8qISBNYXhpbXVtIG1kNSBkaWdlc3QgbGVuZ3RoICovCisJRkNfTUFYX0FVVEhfUkVUUklFUyAgICAgPSAzLAkvKiEgTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyAqLworCUZDX01ENV9ESUdFU1RfTEVOICAgICAgID0gMTYsCS8qISBNRDUgZGlnZXN0IGxlbmd0aCAqLworCUZDX1NIQTFfRElHRVNUX0xFTiAgICAgID0gMjAsCS8qISBTSEExIGRpZ2VzdCBsZW5ndGggKi8KKwlGQ19NQVhfREhHX1NVUFBPUlRFRCAgICA9IDEsCS8qISBNYXhpbXVtIERIIEdyb3VwcyBzdXBwb3J0ZWQgKi8KKwlGQ19NQVhfQUxHX1NVUFBPUlRFRCAgICA9IDEsCS8qISBNYXhpbXVtIGFsZ29yaXRobXMgc3VwcG9ydGVkICovCisJRkNfTUFYX1BST1RPX1NVUFBPUlRFRCAgPSAxLAkvKiEgTWF4aW11bSBwcm90b2NvbHMgc3VwcG9ydGVkICovCisJRkNfU1RBUlRfVFhOX0lEICAgICAgICAgPSAyLAkvKiEgU3RhcnRpbmcgdHJhbnNhY3Rpb24gSUQgKi8KK307CisKK2VudW0gYXV0aF9wcm90b19pZHsKKwlGQ19BVVRIX1BST1RPX0RIQ0hBUAkJPSAweDAwMDAwMDAxLAorCUZDX0FVVEhfUFJPVE9fRkNBUCAJCT0gMHgwMDAwMDAwMiwKKwlGQ19BVVRIX1BST1RPX0ZDUEFQIAkJPSAweDAwMDAwMDAzLAorCUZDX0FVVEhfUFJPVE9fSUtFdjIgCQk9IDB4MDAwMDAwMDQsCisJRkNfQVVUSF9QUk9UT19JS0V2Ml9BVVRIIAk9IDB4MDAwMDAwMDUsCit9OworCitzdHJ1Y3QgYXV0aF9uYW1lX3N7CisJdTE2CW5hbWVfdGFnOwkvKiEgTmFtZSBUYWcgPSAxIGZvciBBdXRoZW50aWNhdGlvbiAqLworCXUxNgluYW1lX2xlbjsJLyohIE5hbWUgTGVuZ3RoID0gOCBmb3IgQXV0aGVudGljYXRpb24KKwkJCQkJICovCisJd3duX3QJCW5hbWU7ICAJCS8qISBOYW1lLiBUT0RPIC0gaXMgdGhpcyBQV1dOICovCit9OworCisKK2VudW0gYXV0aF9oYXNoX2Z1bmN7CisJRkNfQVVUSF9IQVNIX0ZVTkNfTUQ1IAkJPSAweDAwMDAwMDA1LAorCUZDX0FVVEhfSEFTSF9GVU5DX1NIQV8xIAk9IDB4MDAwMDAwMDYsCit9OworCitlbnVtIGF1dGhfZGhfZ2lkeworCUZDX0FVVEhfREhfR0lEXzBfREhHX05VTEwJPSAweDAwMDAwMDAwLAorCUZDX0FVVEhfREhfR0lEXzFfREhHXzEwMjQJPSAweDAwMDAwMDAxLAorCUZDX0FVVEhfREhfR0lEXzJfREhHXzEyODAJPSAweDAwMDAwMDAyLAorCUZDX0FVVEhfREhfR0lEXzNfREhHXzE1MzYJPSAweDAwMDAwMDAzLAorCUZDX0FVVEhfREhfR0lEXzRfREhHXzIwNDgJPSAweDAwMDAwMDA0LAorCUZDX0FVVEhfREhfR0lEXzZfREhHXzMwNzIJPSAweDAwMDAwMDA2LAorCUZDX0FVVEhfREhfR0lEXzdfREhHXzQwOTYJPSAweDAwMDAwMDA3LAorCUZDX0FVVEhfREhfR0lEXzhfREhHXzYxNDQJPSAweDAwMDAwMDA4LAorCUZDX0FVVEhfREhfR0lEXzlfREhHXzgxOTIJPSAweDAwMDAwMDA5LAorfTsKKworc3RydWN0IGF1dGhfZWxzX21zZ19zIHsKKwl1OAkJYXV0aF9lbHNfY29kZTsJLyogIEF1dGhlbnRpY2F0aW9uIEVMUyBDb2RlICgweDkwKSAqLworCXU4IAlhdXRoX2Vsc19mbGFnOyAJLyogIEF1dGhlbnRpY2F0aW9uIEVMUyBGbGFncyAqLworCXU4IAlhdXRoX21zZ19jb2RlOyAJLyogIEF1dGhlbnRpY2F0aW9uIE1lc3NhZ2UgQ29kZSAqLworCXU4IAlwcm90b192ZXJzaW9uOyAJLyogIFByb3RvY29sIFZlcnNpb24gKi8KKwl1MzIJbXNnX2xlbjsgCS8qICBNZXNzYWdlIExlbmd0aCAqLworCXUzMgl0cmFuc19pZDsgCS8qICBUcmFuc2FjdGlvbiBJZGVudGlmaWVyIChUX0lEKSAqLworCisJLyogTXNnIHBheWxvYWQgZm9sbG93cy4uLiAqLworfTsKKworCitlbnVtIGF1dGhfbmVnX3BhcmFtX3RhZ3MgeworCUZDX0FVVEhfTkVHX0RIQ0hBUF9IQVNITElTVCAJPSAweDAwMDEsCisJRkNfQVVUSF9ORUdfREhDSEFQX0RIR19JRF9MSVNUIAk9IDB4MDAwMiwKK307CisKKworc3RydWN0IGRoY2hhcF9wYXJhbV9mb3JtYXRfcyB7CisJdTE2CXRhZzsJCS8qISBQYXJhbWV0ZXIgVGFnLiBTZWUKKwkJCQkJICogYXV0aF9uZWdfcGFyYW1fdGFnc190CisJCQkJCSAqLworCXUxNgl3b3JkX2NudDsKKworCS8qIGZvbGxvd2VkIGJ5IHZhcmlhYmxlIGxlbmd0aCBwYXJhbWV0ZXIgdmFsdWUuLi4gKi8KK307CisKK3N0cnVjdCBhdXRoX3Byb3RvX3BhcmFtc19zIHsKKwl1MzIJcHJvdG9fcGFyYW1fbGVuOworCXUzMglwcm90b19pZDsKKworCS8qCisJICogRm9sbG93ZWQgYnkgdmFyaWFibGUgbGVuZ3RoIFByb3RvY29sIHNwZWNpZmljIHBhcmFtZXRlcnMuIERILUNIQVAKKwkgKiB1c2VzIGRoY2hhcF9wYXJhbV9mb3JtYXRfdAorCSAqLworfTsKKworc3RydWN0IGF1dGhfbmVnX21zZ19zIHsKKwlzdHJ1Y3QgYXV0aF9uYW1lX3MJYXV0aF9pbmlfbmFtZTsKKwl1MzIJCXVzYWJsZV9hdXRoX3Byb3RvczsKKwlzdHJ1Y3QgYXV0aF9wcm90b19wYXJhbXNfcyBwcm90b19wYXJhbXNbMV07IC8qISAoMS4udXNhYmxlX2F1dGhfcHJvdG8pCisJCQkJCQkgICAgICogcHJvdG9jb2wgcGFyYW1zCisJCQkJCQkgICAgICovCit9OworCitzdHJ1Y3QgYXV0aF9kaF92YWxfcyB7CisJdTMyIGRoX3ZhbF9sZW47CisJdTMyIGRoX3ZhbFsxXTsKK307CisKK3N0cnVjdCBhdXRoX2RoY2hhcF9jaGFsX21zZ19zIHsKKwlzdHJ1Y3QgYXV0aF9lbHNfbXNnX3MJaGRyOworCXN0cnVjdCBhdXRoX25hbWVfcyBhdXRoX3Jlc3BvbmRlcl9uYW1lOwkvKiBUT0RPIFZSSyAtIGlzIGF1dGhfbmFtZV90CisJCQkJCQkgKiB0eXBlIE9LPworCQkJCQkJICovCisJdTMyIAloYXNoX2lkOworCXUzMiAJZGhfZ3JwX2lkOworCXUzMiAJY2hhbF92YWxfbGVuOworCWNoYXIJCWNoYWxfdmFsWzFdOworCisJLyogLi4uZm9sbG93ZWQgYnkgdmFyaWFibGUgQ2hhbGxlbmdlIGxlbmd0aC92YWx1ZSBhbmQgREggbGVuZ3RoL3ZhbHVlICovCit9OworCisKK2VudW0gYXV0aF9yanRfY29kZXMgeworCUZDX0FVVEhfUkpUX0NPREVfQVVUSF9GQUlMVVJFIAk9IDB4MDEsCisJRkNfQVVUSF9SSlRfQ09ERV9MT0dJQ0FMX0VSUgk9IDB4MDIsCit9OworCitlbnVtIGF1dGhfcmp0X2NvZGVfZXhwcyB7CisJRkNfQVVUSF9DRVhQX0FVVEhfTUVDSF9OT1RfVVNBQkxFCT0gMHgwMSwKKwlGQ19BVVRIX0NFWFBfREhfR1JPVVBfTk9UX1VTQUJMRSAJPSAweDAyLAorCUZDX0FVVEhfQ0VYUF9IQVNIX0ZVTkNfTk9UX1VTQUJMRSAJPSAweDAzLAorCUZDX0FVVEhfQ0VYUF9BVVRIX1hBQ1RfU1RBUlRFRAkJPSAweDA0LAorCUZDX0FVVEhfQ0VYUF9BVVRIX0ZBSUxFRCAJCT0gMHgwNSwKKwlGQ19BVVRIX0NFWFBfSU5DT1JSRUNUX1BMRCAJCT0gMHgwNiwKKwlGQ19BVVRIX0NFWFBfSU5DT1JSRUNUX1BST1RPX01TRyAJPSAweDA3LAorCUZDX0FVVEhfQ0VYUF9SRVNUQVJUX0FVVEhfUFJPVE8gCT0gMHgwOCwKKwlGQ19BVVRIX0NFWFBfQVVUSF9DT05DQVRfTk9UX1NVUFAgCT0gMHgwOSwKKwlGQ19BVVRIX0NFWFBfUFJPVE9fVkVSX05PVF9TVVBQIAk9IDB4MEEsCit9OworCitlbnVtIGF1dGhfc3RhdHVzIHsKKwlGQ19BVVRIX1NUQVRFX0lOUFJPR1JFU1MgPSAwLCAJLyohIGF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzIAkqLworCUZDX0FVVEhfU1RBVEVfRkFJTEVECT0gMSwgCS8qISBhdXRoZW50aWNhdGlvbiBmYWlsZWQgKi8KKwlGQ19BVVRIX1NUQVRFX1NVQ0NFU1MJPSAyIAkvKiEgYXV0aGVudGljYXRpb24gc3VjY2Vzc2Z1bAkqLworfTsKKworc3RydWN0IGF1dGhfcmp0X21zZ19zIHsKKwlzdHJ1Y3QgYXV0aF9lbHNfbXNnX3MJaGRyOworCXU4CQlyZWFzb25fY29kZTsKKwl1OAkJcmVhc29uX2NvZGVfZXhwOworCXU4CQlyc3ZkWzJdOworfTsKKworCitzdHJ1Y3QgYXV0aF9kaGNoYXBfbmVnX21zZ19zIHsKKwlzdHJ1Y3QgYXV0aF9lbHNfbXNnX3MgaGRyOworCXN0cnVjdCBhdXRoX25lZ19tc2dfcyBuZWdvOworfTsKKworc3RydWN0IGF1dGhfZGhjaGFwX3JlcGx5X21zZ19zIHsKKwlzdHJ1Y3QgYXV0aF9lbHNfbXNnX3MJaGRyOworCisJLyoKKwkgKiBmb2xsb3dlZCBieSByZXNwb25zZSB2YWx1ZSBsZW5ndGggJiBWYWx1ZSArIERIIFZhbHVlIExlbmd0aCAmIFZhbHVlCisJICovCit9OworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogX19GQ19TUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9wcm90b2NvbC9mY3AuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9wcm90b2NvbC9mY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWRlNjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2ZjcC5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19GQ1BQUk9UT19IX18KKyNkZWZpbmUgX19GQ1BQUk9UT19IX18KKworI2luY2x1ZGUgPHByb3RvY29sL3Njc2kuaD4KKworI3ByYWdtYSBwYWNrKDEpCisKK2VudW0geworCUZDUF9SSlQJCT0gMHgwMTAwMDAwMCwJLyogU1JSIHJlamVjdCAqLworCUZDUF9TUlJfQUNDRVBUCT0gMHgwMjAwMDAwMCwJLyogU1JSIGFjY2VwdCAqLworCUZDUF9TUlIJCT0gMHgxNDAwMDAwMCwJLyogU2VxdWVuY2UgUmV0cmFuc21pc3Npb24gUmVxdWVzdCAqLworfTsKKworLyoKKyAqIFNSUiBGQy00IExTIHBheWxvYWQKKyAqLworc3RydWN0IGZjX3Nycl9zeworCXUzMglsc19jbWQ7CisJdTMyICAgICAgICBveF9pZDoxNjsJLyogb3gtaWQgKi8KKwl1MzIgICAgICAgIHJ4X2lkOjE2OwkvKiByeC1pZCAqLworCXUzMiAgICAgICAgcm87CQkvKiByZWxhdGl2ZSBvZmZzZXQgKi8KKwl1MzIgICAgICAgIHJfY3RsOjg7CQkvKiBSX0NUTCBmb3IgSS5VLiAqLworCXUzMiAgICAgICAgcmVzOjI0OworfTsKKworCisvKgorICogRkNQX0NNTkQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBGQ1BfQ01ORF9DREJfTEVOICAgIDE2CisjZGVmaW5lIEZDUF9DTU5EX0xVTl9MRU4gICAgOAorCitzdHJ1Y3QgZmNwX2NtbmRfc3sKKwlsdW5fdCAgICAgICAgICAgbHVuOwkJLyogNjQtYml0IExVIG51bWJlciAqLworCXU4ICAgICAgICAgY3JuOwkJLyogY29tbWFuZCByZWZlcmVuY2UgbnVtYmVyICovCisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHJlc3ZkOjEsCisJCQlwcmlvcml0eTo0LAkvKiBGQ1AtMzogU0FNLTMgcHJpb3JpdHkgKi8KKwkJCXRhc2thdHRyOjM7CS8qIHNjc2kgdGFzayBhdHRyaWJ1dGUgKi8KKyNlbHNlCisJdTggICAgICAgICB0YXNrYXR0cjozLAkvKiBzY3NpIHRhc2sgYXR0cmlidXRlICovCisJCQlwcmlvcml0eTo0LAkvKiBGQ1AtMzogU0FNLTMgcHJpb3JpdHkgKi8KKwkJCXJlc3ZkOjE7CisjZW5kaWYKKwl1OCAgICAgICAgIHRtX2ZsYWdzOwkvKiB0YXNrIG1hbmFnZW1lbnQgZmxhZ3MgKi8KKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgYWRkbF9jZGJfbGVuOjYsCS8qIGFkZGl0aW9uYWwgQ0RCIGxlbmd0aCB3b3JkcyAqLworCQkJaW9kaXI6MjsJLyogcmVhZC93cml0ZSBGQ1BfREFUQSBJVXMgKi8KKyNlbHNlCisJdTggICAgICAgICBpb2RpcjoyLAkvKiByZWFkL3dyaXRlIEZDUF9EQVRBIElVcyAqLworCQkJYWRkbF9jZGJfbGVuOjY7CS8qIGFkZGl0aW9uYWwgQ0RCIGxlbmd0aCAqLworI2VuZGlmCisJc3RydWN0IHNjc2lfY2RiX3MgICAgICBjZGI7CisKKwkvKgorCSAqICEhISBhZGRpdGlvbmFsIGNkYiBieXRlcyBmb2xsb3dzIGhlcmUhISEKKwkgKi8KKwl1MzIgICAgICAgIGZjcF9kbDsJLyogYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQgKi8KK307CisKKyNkZWZpbmUgZmNwX2NtbmRfY2RiX2xlbihfY21uZCkgKChfY21uZCktPmFkZGxfY2RiX2xlbiAqIDQgKyBGQ1BfQ01ORF9DREJfTEVOKQorI2RlZmluZSBmY3BfY21uZF9mY3BkbChfY21uZCkJKCgmKF9jbW5kKS0+ZmNwX2RsKVsoX2NtbmQpLT5hZGRsX2NkYl9sZW5dKQorCisvKgorICogZmNwX2NtbmRfdC5pb2RpciBmaWVsZCB2YWx1ZXMKKyAqLworZW51bSBmY3BfaW9kaXJ7CisJRkNQX0lPRElSX05PTkUJPSAwLAorCUZDUF9JT0RJUl9XUklURSA9IDEsCisJRkNQX0lPRElSX1JFQUQJPSAyLAorCUZDUF9JT0RJUl9SVwk9IDMsCit9OworCisvKgorICogVGFzayBhdHRyaWJ1dGUgZmllbGQKKyAqLworZW51bSB7CisJRkNQX1RBU0tfQVRUUl9TSU1QTEUJPSAwLAorCUZDUF9UQVNLX0FUVFJfSE9RCT0gMSwKKwlGQ1BfVEFTS19BVFRSX09SREVSRUQJPSAyLAorCUZDUF9UQVNLX0FUVFJfQUNBCT0gNCwKKwlGQ1BfVEFTS19BVFRSX1VOVEFHR0VECT0gNSwJLyogb2Jzb2xldGUgaW4gRkNQLTMgKi8KK307CisKKy8qCisgKiBUYXNrIG1hbmFnZW1lbnQgZmxhZ3MgZmllbGQgLSBvbmx5IG9uZSBiaXQgc2hhbGwgYmUgc2V0CisgKi8KKyNpZm5kZWYgQklUCisjZGVmaW5lIEJJVChfeCkJKDEgPDwgKF94KSkKKyNlbmRpZgorZW51bSBmY3BfdG1fY21uZHsKKwlGQ1BfVE1fQUJPUlRfVEFTS19TRVQJPSBCSVQoMSksCisJRkNQX1RNX0NMRUFSX1RBU0tfU0VUCT0gQklUKDIpLAorCUZDUF9UTV9MVU5fUkVTRVQJPSBCSVQoNCksCisJRkNQX1RNX1RBUkdFVF9SRVNFVAk9IEJJVCg1KSwJLyogb2Jzb2xldGUgaW4gRkNQLTMgKi8KKwlGQ1BfVE1fQ0xFQVJfQUNBCT0gQklUKDYpLAorfTsKKworLyoKKyAqIEZDUF9YRkVSX1JEWSBJVSBkZWZpbmVzCisgKi8KK3N0cnVjdCBmY3BfeGZlcl9yZHlfc3sKKwl1MzIgICAgICAgIGRhdGFfcm87CisJdTMyICAgICAgICBidXJzdF9sZW47CisJdTMyICAgICAgICByZXNlcnZlZDsKK307CisKKy8qCisgKiBGQ1BfUlNQIHJlc2lkdWUgZmxhZ3MKKyAqLworZW51bSBmY3BfcmVzaWR1ZXsKKwlGQ1BfTk9fUkVTSURVRSA9IDAsCS8qIG5vIHJlc2lkdWUgKi8KKwlGQ1BfUkVTSURfT1ZFUiA9IDEsCS8qIG1vcmUgZGF0YSBsZWZ0IHRoYXQgd2FzIG5vdCBzZW50ICovCisJRkNQX1JFU0lEX1VOREVSID0gMiwJLyogbGVzcyBkYXRhIHRoYW4gcmVxdWVzdGVkICovCit9OworCitlbnVtIHsKKwlGQ1BfUlNQSU5GT19HT09EID0gMCwKKwlGQ1BfUlNQSU5GT19EQVRBTEVOX01JU01BVENIID0gMSwKKwlGQ1BfUlNQSU5GT19DTU5EX0lOVkFMSUQgPSAyLAorCUZDUF9SU1BJTkZPX1JPTEVOX01JU01BVENIID0gMywKKwlGQ1BfUlNQSU5GT19UTV9OT1RfU1VQUCA9IDQsCisJRkNQX1JTUElORk9fVE1fRkFJTEVEID0gNSwKK307CisKK3N0cnVjdCBmY3BfcnNwaW5mb19zeworCXUzMiAgICAgICAgcmVzMDoyNDsKKwl1MzIgICAgICAgIHJzcF9jb2RlOjg7CS8qIHJlc3BvbnNlIGNvZGUgKGFzIGFib3ZlKSAqLworCXUzMiAgICAgICAgcmVzMTsKK307CisKK3N0cnVjdCBmY3BfcmVzcF9zeworCXUzMiAgICAgICAgcmVzZXJ2ZWRbMl07CS8qIDIgd29yZHMgcmVzZXJ2ZWQgKi8KKwl1MTYgICAgICAgIHJlc2VydmVkMjsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgcmVzZXJ2ZWQzOjM7CisJdTggICAgICAgICBmY3BfY29uZl9yZXE6MTsJLyogRkNQX0NPTkYgaXMgcmVxdWVzdGVkICovCisJdTggICAgICAgICByZXNpZF9mbGFnczoyOwkvKiB1bmRlcmZsb3cvb3ZlcmZsb3cgKi8KKwl1OCAgICAgICAgIHNuc19sZW5fdmFsaWQ6MTsvKiBzZW5zZSBsZW4gaXMgdmFsaWQgKi8KKwl1OCAgICAgICAgIHJzcF9sZW5fdmFsaWQ6MTsvKiByZXNwb25zZSBsZW4gaXMgdmFsaWQgKi8KKyNlbHNlCisJdTggICAgICAgICByc3BfbGVuX3ZhbGlkOjE7LyogcmVzcG9uc2UgbGVuIGlzIHZhbGlkICovCisJdTggICAgICAgICBzbnNfbGVuX3ZhbGlkOjE7Lyogc2Vuc2UgbGVuIGlzIHZhbGlkICovCisJdTggICAgICAgICByZXNpZF9mbGFnczoyOwkvKiB1bmRlcmZsb3cvb3ZlcmZsb3cgKi8KKwl1OCAgICAgICAgIGZjcF9jb25mX3JlcToxOwkvKiBGQ1BfQ09ORiBpcyByZXF1ZXN0ZWQgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMzozOworI2VuZGlmCisJdTggICAgICAgICBzY3NpX3N0YXR1czsJLyogb25lIGJ5dGUgU0NTSSBzdGF0dXMgKi8KKwl1MzIgICAgICAgIHJlc2lkdWU7CS8qIHJlc2lkdWFsIGRhdGEgYnl0ZXMgKi8KKwl1MzIgICAgICAgIHNuc19sZW47CS8qIGxlbmd0aCBvZCBzZW5zZSBpbmZvICovCisJdTMyICAgICAgICByc3BfbGVuOwkvKiBsZW5ndGggb2YgcmVzcG9uc2UgaW5mbyAqLworfTsKKworI2RlZmluZSBmY3Bfc25zbGVuKF9fZmNwcnNwKQkoKF9fZmNwcnNwKS0+c25zX2xlbl92YWxpZCA/IAkJXAorCQkJCQkoX19mY3Byc3ApLT5zbnNfbGVuIDogMCkKKyNkZWZpbmUgZmNwX3JzcGxlbihfX2ZjcHJzcCkJKChfX2ZjcHJzcCktPnJzcF9sZW5fdmFsaWQgPyAJCVwKKwkJCQkJKF9fZmNwcnNwKS0+cnNwX2xlbiA6IDApCisjZGVmaW5lIGZjcF9yc3BpbmZvKF9fZmNwcnNwKQkoKHN0cnVjdCBmY3BfcnNwaW5mb19zICopKChfX2ZjcHJzcCkgKyAxKSkKKyNkZWZpbmUgZmNwX3Nuc2luZm8oX19mY3Byc3ApCSgoKHU4ICopZmNwX3JzcGluZm8oX19mY3Byc3ApKSArIAlcCisJCQkJCQlmY3BfcnNwbGVuKF9fZmNwcnNwKSkKKworc3RydWN0IGZjcF9jbW5kX2ZyX3N7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCXN0cnVjdCBmY3BfY21uZF9zICAgICAgZmNwOworfTsKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvZmRtaS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2ZkbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzA1YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL2ZkbWkuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fRkRNSV9IX18KKyNkZWZpbmUgX19GRE1JX0hfXworCisjaW5jbHVkZSA8cHJvdG9jb2wvdHlwZXMuaD4KKyNpbmNsdWRlIDxwcm90b2NvbC9mYy5oPgorI2luY2x1ZGUgPHByb3RvY29sL2N0Lmg+CisKKyNwcmFnbWEgcGFjaygxKQorCisvKgorICogRkRNSSBDb21tYW5kIENvZGVzCisgKi8KKyNkZWZpbmUJRkRNSV9HUkhMCQkweDAxMDAKKyNkZWZpbmUJRkRNSV9HSEFUCQkweDAxMDEKKyNkZWZpbmUJRkRNSV9HUlBMCQkweDAxMDIKKyNkZWZpbmUJRkRNSV9HUEFUCQkweDAxMTAKKyNkZWZpbmUJRkRNSV9SSEJBCQkweDAyMDAKKyNkZWZpbmUJRkRNSV9SSEFUCQkweDAyMDEKKyNkZWZpbmUJRkRNSV9SUFJUCQkweDAyMTAKKyNkZWZpbmUJRkRNSV9SUEEJCTB4MDIxMQorI2RlZmluZQlGRE1JX0RIQkEJCTB4MDMwMAorI2RlZmluZQlGRE1JX0RQUlQJCTB4MDMxMAorCisvKgorICogRkRNSSByZWFzb24gY29kZXMKKyAqLworI2RlZmluZQlGRE1JX05PX0FERElUSU9OQUxfRVhQCQkweDAwCisjZGVmaW5lCUZETUlfSEJBX0FMUkVBRFlfUkVHCQkweDEwCisjZGVmaW5lCUZETUlfSEJBX0FUVFJJQl9OT1RfUkVHCQkweDExCisjZGVmaW5lCUZETUlfSEJBX0FUVFJJQl9NVUxUSVBMRQkweDEyCisjZGVmaW5lCUZETUlfSEJBX0FUVFJJQl9MRU5HVEhfSU5WQUxJRAkweDEzCisjZGVmaW5lCUZETUlfSEJBX0FUVFJJQl9OT1RfUFJFU0VOVAkweDE0CisjZGVmaW5lCUZETUlfUE9SVF9PUklHX05PVF9JTl9MSVNUCTB4MTUKKyNkZWZpbmUJRkRNSV9QT1JUX0hCQV9OT1RfSU5fTElTVAkweDE2CisjZGVmaW5lCUZETUlfUE9SVF9BVFRSSUJfTk9UX1JFRwkweDIwCisjZGVmaW5lCUZETUlfUE9SVF9OT1RfUkVHCQkweDIxCisjZGVmaW5lCUZETUlfUE9SVF9BVFRSSUJfTVVMVElQTEUJMHgyMgorI2RlZmluZQlGRE1JX1BPUlRfQVRUUklCX0xFTkdUSF9JTlZBTElECTB4MjMKKyNkZWZpbmUJRkRNSV9QT1JUX0FMUkVBRFlfUkVHSVNURVJFRUQJMHgyNAorCisvKgorICogRkRNSSBUcmFuc21pc3Npb24gU3BlZWQgTWFzayB2YWx1ZXMKKyAqLworI2RlZmluZQlGRE1JX1RSQU5TX1NQRUVEXzFHCQkweDAwMDAwMDAxCisjZGVmaW5lCUZETUlfVFJBTlNfU1BFRURfMkcJCTB4MDAwMDAwMDIKKyNkZWZpbmUJRkRNSV9UUkFOU19TUEVFRF8xMEcJCTB4MDAwMDAwMDQKKyNkZWZpbmUJRkRNSV9UUkFOU19TUEVFRF80RwkJMHgwMDAwMDAwOAorI2RlZmluZQlGRE1JX1RSQU5TX1NQRUVEXzhHCQkweDAwMDAwMDEwCisjZGVmaW5lCUZETUlfVFJBTlNfU1BFRURfMTZHCQkweDAwMDAwMDIwCisjZGVmaW5lCUZETUlfVFJBTlNfU1BFRURfVU5LTk9XTgkweDAwMDA4MDAwCisKKy8qCisgKiBGRE1JIEhCQSBhdHRyaWJ1dGUgdHlwZXMKKyAqLworZW51bSBmZG1pX2hiYV9hdHRyaWJ1dGVfdHlwZSB7CisJRkRNSV9IQkFfQVRUUklCX05PREVOQU1FID0gMSwJLyogMHgwMDAxICovCisJRkRNSV9IQkFfQVRUUklCX01BTlVGQUNUVVJFUiwJLyogMHgwMDAyICovCisJRkRNSV9IQkFfQVRUUklCX1NFUklBTE5VTSwJLyogMHgwMDAzICovCisJRkRNSV9IQkFfQVRUUklCX01PREVMLAkJLyogMHgwMDA0ICovCisJRkRNSV9IQkFfQVRUUklCX01PREVMX0RFU0MsCS8qIDB4MDAwNSAqLworCUZETUlfSEJBX0FUVFJJQl9IV19WRVJTSU9OLAkvKiAweDAwMDYgKi8KKwlGRE1JX0hCQV9BVFRSSUJfRFJJVkVSX1ZFUlNJT04sCS8qIDB4MDAwNyAqLworCUZETUlfSEJBX0FUVFJJQl9ST01fVkVSU0lPTiwJLyogMHgwMDA4ICovCisJRkRNSV9IQkFfQVRUUklCX0ZXX1ZFUlNJT04sCS8qIDB4MDAwOSAqLworCUZETUlfSEJBX0FUVFJJQl9PU19OQU1FLAkvKiAweDAwMEEgKi8KKwlGRE1JX0hCQV9BVFRSSUJfTUFYX0NULAkJLyogMHgwMDBCICovCisKKwlGRE1JX0hCQV9BVFRSSUJfTUFYX1RZUEUKK307CisKKy8qCisgKiBGRE1JIFBvcnQgYXR0cmlidXRlIHR5cGVzCisgKi8KK2VudW0gZmRtaV9wb3J0X2F0dHJpYnV0ZV90eXBlIHsKKwlGRE1JX1BPUlRfQVRUUklCX0ZDNF9UWVBFUyA9IDEsCS8qIDB4MDAwMSAqLworCUZETUlfUE9SVF9BVFRSSUJfU1VQUF9TUEVFRCwJLyogMHgwMDAyICovCisJRkRNSV9QT1JUX0FUVFJJQl9QT1JUX1NQRUVELAkvKiAweDAwMDMgKi8KKwlGRE1JX1BPUlRfQVRUUklCX0ZSQU1FX1NJWkUsCS8qIDB4MDAwNCAqLworCUZETUlfUE9SVF9BVFRSSUJfREVWX05BTUUsCS8qIDB4MDAwNSAqLworCUZETUlfUE9SVF9BVFRSSUJfSE9TVF9OQU1FLAkvKiAweDAwMDYgKi8KKworCUZETUlfUE9SVF9BVFRSX01BWF9UWVBFCit9OworCisvKgorICogRkRNSSBhdHRyaWJ1dGUKKyAqLworc3RydWN0IGZkbWlfYXR0cl9zIHsKKwl1MTYgICAgICAgIHR5cGU7CisJdTE2ICAgICAgICBsZW47CisJdTggICAgICAgICB2YWx1ZVsxXTsKK307CisKKy8qCisgKiBIQkEgQXR0cmlidXRlIEJsb2NrCisgKi8KK3N0cnVjdCBmZG1pX2hiYV9hdHRyX3MgeworCXUzMiAgICAgICAgYXR0cl9jb3VudDsJLyogIyBvZiBhdHRyaWJ1dGVzICovCisJc3RydWN0IGZkbWlfYXR0cl9zICAgICBoYmFfYXR0cjsJLyogbiBhdHRyaWJ1dGVzICovCit9OworCisvKgorICogUmVnaXN0ZXJlZCBQb3J0IExpc3QKKyAqLworc3RydWN0IGZkbWlfcG9ydF9saXN0X3MgeworCXUzMiAgICAgICAgbnVtX3BvcnRzOwkvKiBudW1iZXIgT2YgUG9ydCBFbnRyaWVzICovCisJd3duX3QgICAgICAgICAgIHBvcnRfZW50cnk7CS8qIG9uZSBvciBtb3JlICovCit9OworCisvKgorICogUG9ydCBBdHRyaWJ1dGUgQmxvY2sKKyAqLworc3RydWN0IGZkbWlfcG9ydF9hdHRyX3MgeworCXUzMiAgICAgICAgYXR0cl9jb3VudDsJLyogIyBvZiBhdHRyaWJ1dGVzICovCisJc3RydWN0IGZkbWlfYXR0cl9zICAgICBwb3J0X2F0dHI7CS8qIG4gYXR0cmlidXRlcyAqLworfTsKKworLyoKKyAqIEZETUkgUmVnaXN0ZXIgSEJBIEF0dHJpYnV0ZXMKKyAqLworc3RydWN0IGZkbWlfcmhiYV9zIHsKKwl3d25fdCAgICAgICAgICAgaGJhX2lkOwkJLyogSEJBIElkZW50aWZpZXIgKi8KKwlzdHJ1Y3QgZmRtaV9wb3J0X2xpc3RfcyBwb3J0X2xpc3Q7CS8qIFJlZ2lzdGVyZWQgUG9ydCBMaXN0ICovCisJc3RydWN0IGZkbWlfaGJhX2F0dHJfcyBoYmFfYXR0cl9ibGs7CS8qIEhCQSBhdHRyaWJ1dGUgYmxvY2sgKi8KK307CisKKy8qCisgKiBGRE1JIFJlZ2lzdGVyIFBvcnQKKyAqLworc3RydWN0IGZkbWlfcnBydF9zIHsKKwl3d25fdCAgICAgICAgICAgaGJhX2lkOwkJLyogSEJBIElkZW50aWZpZXIgKi8KKwl3d25fdCAgICAgICAgICAgcG9ydF9uYW1lOwkvKiBQb3J0IHd3biAqLworCXN0cnVjdCBmZG1pX3BvcnRfYXR0cl9zIHBvcnRfYXR0cl9ibGs7CS8qIFBvcnQgQXR0ciBCbG9jayAqLworfTsKKworLyoKKyAqIEZETUkgUmVnaXN0ZXIgUG9ydCBBdHRyaWJ1dGVzCisgKi8KK3N0cnVjdCBmZG1pX3JwYV9zIHsKKwl3d25fdCAgICAgICAgICAgcG9ydF9uYW1lOwkvKiBwb3J0IHd3biAqLworCXN0cnVjdCBmZG1pX3BvcnRfYXR0cl9zIHBvcnRfYXR0cl9ibGs7CS8qIFBvcnQgQXR0ciBCbG9jayAqLworfTsKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvcGNpZncuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9wcm90b2NvbC9wY2lmdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzBkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvcGNpZncuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIHBjaWZ3LmggUENJIEZXIHJlbGF0ZWQgaGVhZGVycworICovCisKKyNpZm5kZWYgX19QQ0lGV19IX18KKyNkZWZpbmUgX19QQ0lGV19IX18KKworI3ByYWdtYSBwYWNrKDEpCisKK3N0cnVjdCBwbnBfaGRyX3N7CisgIHUzMglzaWduYXR1cmU7CS8qICIkUG5QIiAqLworICB1OAlyZXY7CQkvKiBTdHJ1Y3QgcmV2aXNpb24gKi8KKyAgdTggCWxlbjsJCS8qIEhlYWRlciBzdHJ1Y3R1cmUgbGVuIGluIG11bHRpcGxlcworCQkJCSAqIG9mIDE2IGJ5dGVzICovCisgIHUxNiAgb2ZmOwkJLyogT2Zmc2V0IHRvIG5leHQgaGVhZGVyIDAwIGlmIG5vbmUgKi8KKyAgdTgJcnN2ZDsJCS8qIFJlc2VydmVkIGJ5dGUgKi8KKyAgdTgJY2tzdW07CQkvKiA4LWJpdCBjaGVja3N1bSBmb3IgdGhpcyBoZWFkZXIgKi8KKyAgdTMyCXBucF9kZXZfaWQ7CS8qIFBuUCBEZXZpY2UgSWQgKi8KKyAgdTE2ICBtZnN0cjsJCS8qIFBvaW50ZXIgdG8gbWFudWZhY3R1cmVyIHN0cmluZyAqLworICB1MTYJcHJzdHI7CQkvKiBQb2ludGVyIHRvIHByb2R1Y3Qgc3RyaW5nICovCisgIHU4CWRldnR5cGVbM107CS8qIERldmljZSBUeXBlIENvZGUgKi8KKyAgdTgJZGV2aW5kOwkJLyogRGV2aWNlIEluZGljYXRvciAqLworICB1MTYJYmN2ZW50cjsJLyogQm9vdHN0cmFwIGVudHJ5IHZlY3RvciAqLworICB1MTYJcnN2ZDI7CQkvKiBSZXNlcnZlZCAqLworICB1MTYgIHNyaXY7CQkvKiBTdGF0aWMgcmVzb3VyY2UgaW5mb3JtYXRpb24gdmVjdG9yICovCit9OworCitzdHJ1Y3QgcGNpXzNfMF9kc19zeworIHUzMglzaWc7ICAgCQkvKiBTaWduYXR1cmUgIlBDSVIiICovCisgdTE2CXZlbmRpZDsJCS8qIFZlbmRvciBJRCAqLworIHUxNglkZXZpZDsJCS8qIERldmljZSBJRCAqLworIHUxNglkZXZsaXN0b2ZmOwkvKiBEZXZpY2UgTGlzdCBPZmZzZXQgKi8KKyB1MTYJbGVuOwkJLyogUENJIERhdGEgU3RydWN0dXJlIExlbmd0aCAqLworIHU4CXJldjsJCS8qIFBDSSBEYXRhIFN0cnVjdHVyZSBSZXZpc2lvbiAqLworIHU4CWNsY29kZVszXTsJLyogQ2xhc3MgQ29kZSAqLworIHUxNglpbWdsZW47CQkvKiBDb2RlIGltYWdlIGxlbmd0aCBpbiBtdWx0aXBsZXMgb2YKKwkJCQkgKiA1MTIgYnl0ZXMgKi8KKyB1MTYJY29kZXJldjsJLyogUmV2aXNpb24gbGV2ZWwgb2YgY29kZS9kYXRhICovCisgdTgJY29kZXR5cGU7CS8qIENvZGUgdHlwZSAweDAwIC0gQklPUyAqLworIHU4CWluZHI7CQkvKiBMYXN0IGltYWdlIGluZGljYXRvciAqLworIHUxNgltcnRpbWdsZW47CS8qIE1heCBSdW4gVGltZSBJbWFnZSBMZW5ndGggKi8KKyB1MTYJY3VvZmY7CQkvKiBDb25maWcgVXRpbGl0eSBDb2RlIEhlYWRlciBPZmZzZXQgKi8KKyB1MTYJZG10ZmNscDsJLyogRE1URiBDTFAgZW50cnkgcG9pbnQgb2Zmc2V0ICovCit9OworCitzdHJ1Y3QgcGNpX29wdHJvbV9oZHJfc3sKKyB1MTYJc2lnOwkJLyogU2lnbmF0dXJlIDB4NTVBQSAqLworIHU4CWxlbjsJCS8qIE9wdGlvbiBST00gbGVuZ3RoIGluIHVuaXRzIG9mIDUxMiBieXRlcyAqLworIHU4CWluaXZlY1szXTsJLyogSW5pdGlhbGl6YXRpb24gdmVjdG9yICovCisgdTgJcnN2ZFsxNl07CS8qIFJlc2VydmVkIGZpZWxkICovCisgdTE2CXZlcnB0cjsJCS8qIFBvaW50ZXIgdG8gdmVyc2lvbiBzdHJpbmcgLSBwcml2YXRlICovCisgdTE2CXBjaWRzOwkJLyogUG9pbnRlciB0byBQQ0kgZGF0YSBzdHJ1Y3R1cmUgKi8KKyB1MTYJcG5waGRyOwkJLyogUG9pbnRlciB0byBQblAgZXhwYW5zaW9uIGhlYWRlciAqLworfTsKKworI3ByYWdtYSBwYWNrKCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvc2NzaS5oIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL3Njc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjIwZTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9pbmNsdWRlL3Byb3RvY29sL3Njc2kuaApAQCAtMCwwICsxLDE2NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1NDU0lfSF9fCisjZGVmaW5lIF9fU0NTSV9IX18KKworI2luY2x1ZGUgPHByb3RvY29sL3R5cGVzLmg+CisKKyNwcmFnbWEgcGFjaygxKQorCisvKgorICogZ2VuZXJpYyBTQ1NJIGNkYiBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgU0NTSV9NQVhfQ0RCTEVOICAgICAxNgorc3RydWN0IHNjc2lfY2RiX3N7CisJdTggICAgICAgICBzY3NpX2NkYltTQ1NJX01BWF9DREJMRU5dOworfTsKKworLyoKKyAqIHNjc2kgbHVuIHNlcmlhbCBudW1iZXIgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIFNDU0lfTFVOX1NOX0xFTiAgICAgMzIKK3N0cnVjdCBzY3NpX2x1bl9zbl9zeworCXU4ICAgICAgICAgbHVuX3NuW1NDU0lfTFVOX1NOX0xFTl07Cit9OworCisvKgorICogU0NTSSBEaXJlY3QgQWNjZXNzIENvbW1hbmRzCisgKi8KK2VudW0geworCVNDU0lfT1BfVEVTVF9VTklUX1JFQURZCQk9IDB4MDAsCisJU0NTSV9PUF9SRVFVRVNUX1NFTlNFCQk9IDB4MDMsCisJU0NTSV9PUF9GT1JNQVRfVU5JVAkJPSAweDA0LAorCVNDU0lfT1BfUkVBRDYJCQk9IDB4MDgsCisJU0NTSV9PUF9XUklURTYJCQk9IDB4MEEsCisJU0NTSV9PUF9XUklURV9GSUxFTUFSS1MJCT0gMHgxMCwKKwlTQ1NJX09QX0lOUVVJUlkJCQk9IDB4MTIsCisJU0NTSV9PUF9NT0RFX1NFTEVDVDYJCT0gMHgxNSwKKwlTQ1NJX09QX1JFU0VSVkU2CQk9IDB4MTYsCisJU0NTSV9PUF9SRUxFQVNFNgkJPSAweDE3LAorCVNDU0lfT1BfTU9ERV9TRU5TRTYJCT0gMHgxQSwKKwlTQ1NJX09QX1NUQVJUX1NUT1BfVU5JVAkJPSAweDFCLAorCVNDU0lfT1BfU0VORF9ESUFHTk9TVElDCQk9IDB4MUQsCisJU0NTSV9PUF9SRUFEX0NBUEFDSVRZCQk9IDB4MjUsCisJU0NTSV9PUF9SRUFEMTAJCQk9IDB4MjgsCisJU0NTSV9PUF9XUklURTEwCQkJPSAweDJBLAorCVNDU0lfT1BfVkVSSUZZMTAJCT0gMHgyRiwKKwlTQ1NJX09QX1JFQURfREVGRUNUX0RBVEEJPSAweDM3LAorCVNDU0lfT1BfTE9HX1NFTEVDVAkJPSAweDRDLAorCVNDU0lfT1BfTE9HX1NFTlNFCQk9IDB4NEQsCisJU0NTSV9PUF9NT0RFX1NFTEVDVDEwCQk9IDB4NTUsCisJU0NTSV9PUF9SRVNFUlZFMTAJCT0gMHg1NiwKKwlTQ1NJX09QX1JFTEVBU0UxMAkJPSAweDU3LAorCVNDU0lfT1BfTU9ERV9TRU5TRTEwCQk9IDB4NUEsCisJU0NTSV9PUF9QRVJfUkVTRVJWRV9JTgkJPSAweDVFLAorCVNDU0lfT1BfUEVSX1JFU0VSVkVfT1VSCQk9IDB4NUUsCisJU0NTSV9PUF9SRUFEMTYJCQk9IDB4ODgsCisJU0NTSV9PUF9XUklURTE2CQkJPSAweDhBLAorCVNDU0lfT1BfVkVSSUZZMTYJCT0gMHg4RiwKKwlTQ1NJX09QX1JFQURfQ0FQQUNJVFkxNgkJPSAweDlFLAorCVNDU0lfT1BfUkVQT1JUX0xVTlMJCT0gMHhBMCwKKwlTQ1NJX09QX1JFQUQxMgkJCT0gMHhBOCwKKwlTQ1NJX09QX1dSSVRFMTIJCQk9IDB4QUEsCisJU0NTSV9PUF9VTkRFRgkJCT0gMHhGRiwKK307CisKKy8qCisgKiBTQ1NJIFNUQVJUX1NUT1BfVU5JVCBjb21tYW5kCisgKi8KK3N0cnVjdCBzY3NpX3N0YXJ0X3N0b3BfdW5pdF9zeworCXU4ICAgICAgICAgb3Bjb2RlOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICBsdW46MzsKKwl1OCAgICAgICAgIHJlc2VydmVkMTo0OworCXU4ICAgICAgICAgaW1tZWQ6MTsKKyNlbHNlCisJdTggICAgICAgICBpbW1lZDoxOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjQ7CisJdTggICAgICAgICBsdW46MzsKKyNlbmRpZgorCXU4ICAgICAgICAgcmVzZXJ2ZWQyOworCXU4ICAgICAgICAgcmVzZXJ2ZWQzOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICBwb3dlcl9jb25kaXRpb25zOjQ7CisJdTggICAgICAgICByZXNlcnZlZDQ6MjsKKwl1OCAgICAgICAgIGxvRWo6MTsKKwl1OCAgICAgICAgIHN0YXJ0OjE7CisjZWxzZQorCXU4ICAgICAgICAgc3RhcnQ6MTsKKwl1OCAgICAgICAgIGxvRWo6MTsKKwl1OCAgICAgICAgIHJlc2VydmVkNDoyOworCXU4ICAgICAgICAgcG93ZXJfY29uZGl0aW9uczo0OworI2VuZGlmCisJdTggICAgICAgICBjb250cm9sOworfTsKKworLyoKKyAqIFNDU0kgU0VORF9ESUFHTk9TVElDIGNvbW1hbmQKKyAqLworc3RydWN0IHNjc2lfc2VuZF9kaWFnbm9zdGljX3N7CisJdTggICAgICAgICBvcGNvZGU7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHNlbGZfdGVzdF9jb2RlOjM7CisJdTggICAgICAgICBwZjoxOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTggICAgICAgICBzZWxmX3Rlc3Q6MTsKKwl1OCAgICAgICAgIGRldl9vZmZsOjE7CisJdTggICAgICAgICB1bml0X29mZmw6MTsKKyNlbHNlCisJdTggICAgICAgICB1bml0X29mZmw6MTsKKwl1OCAgICAgICAgIGRldl9vZmZsOjE7CisJdTggICAgICAgICBzZWxmX3Rlc3Q6MTsKKwl1OCAgICAgICAgIHJlc2VydmVkMToxOworCXU4ICAgICAgICAgcGY6MTsKKwl1OCAgICAgICAgIHNlbGZfdGVzdF9jb2RlOjM7CisjZW5kaWYKKwl1OCAgICAgICAgIHJlc2VydmVkMjsKKworCXU4ICAgICAgICAgcGFyYW1fbGlzdF9sZW5ndGhbMl07CS8qIE1TQiBmaXJzdCAqLworCXU4ICAgICAgICAgY29udHJvbDsKKworfTsKKworLyoKKyAqIFNDU0kgUkVBRDEwL1dSSVRFMTAgY29tbWFuZHMKKyAqLworc3RydWN0IHNjc2lfcncxMF9zeworCXU4ICAgICAgICAgb3Bjb2RlOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICBsdW46MzsKKwl1OCAgICAgICAgIGRwbzoxOwkvKiBEaXNhYmxlIFBhZ2UgT3V0ICovCisJdTggICAgICAgICBmdWE6MTsJLyogRm9yY2UgVW5pdCBBY2Nlc3MgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMToyOworCXU4ICAgICAgICAgcmVsX2FkcjoxOwkvKiByZWxhdGl2ZSBhZGRyZXNzICovCisjZWxzZQorCXU4ICAgICAgICAgcmVsX2FkcjoxOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjI7CisJdTggICAgICAgICBmdWE6MTsKKwl1OCAgICAgICAgIGRwbzoxOworCXU4ICAgICAgICAgbHVuOjM7CisjZW5kaWYKKwl1OCAgICAgICAgIGxiYTA7CS8qIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyAtIE1TQiAqLworCXU4ICAgICAgICAgbGJhMTsKKwl1OCAgICAgICAgIGxiYTI7CisJdTggICAgICAgICBsYmEzOwkvKiBMU0IgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMzsKKwl1OCAgICAgICAgIHhmZXJfbGVuZ3RoMDsJLyogdHJhbnNmZXIgbGVuZ3RoIGluIGJsb2NrcyAtIE1TQiAqLworCXU4ICAgICAgICAgeGZlcl9sZW5ndGgxOwkvKiBMU0IgKi8KKwl1OCAgICAgICAgIGNvbnRyb2w7Cit9OworCisjZGVmaW5lIFNDU0lfQ0RCMTBfR0VUX0xCQShjZGIpICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKGNkYiktPmxiYTAgPDwgMjQpIHwgKChjZGIpLT5sYmExIDw8IDE2KSB8ICAgIFwKKyAgICAgKChjZGIpLT5sYmEyIDw8IDgpIHwgKGNkYiktPmxiYTMpCisKKyNkZWZpbmUgU0NTSV9DREIxMF9TRVRfTEJBKGNkYiwgbGJhKSB7ICAgICAgXAorICAgIChjZGIpLT5sYmEwID0gbGJhID4+IDI0OyAgICAgICAgICAgIFwKKyAgICAoY2RiKS0+bGJhMSA9IChsYmEgPj4gMTYpICYgMHhGRjsgICBcCisgICAgKGNkYiktPmxiYTIgPSAobGJhID4+IDgpICYgMHhGRjsgICAgXAorICAgIChjZGIpLT5sYmEzID0gbGJhICYgMHhGRjsgICAgICAgICAgIFwKK30KKworI2RlZmluZSBTQ1NJX0NEQjEwX0dFVF9UTChjZGIpICBcCisgICAgKChjZGIpLT54ZmVyX2xlbmd0aDAgPDwgOCB8IChjZGIpLT54ZmVyX2xlbmd0aDEpCisjZGVmaW5lIFNDU0lfQ0RCMTBfU0VUX1RMKGNkYiwgdGwpIHsgICAgICBcCisgICAgKGNkYiktPnhmZXJfbGVuZ3RoMCA9IHRsID4+IDg7ICAgICAgIFwKKyAgICAoY2RiKS0+eGZlcl9sZW5ndGgxID0gdGwgJiAweEZGOyAgICAgXAorfQorCisvKgorICogU0NTSSBSRUFENi9XUklURTYgY29tbWFuZHMKKyAqLworc3RydWN0IHNjc2lfcnc2X3N7CisJdTggICAgICAgICBvcGNvZGU7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIGx1bjozOworCXU4ICAgICAgICAgbGJhMDo1OwkJLyogTVNiICovCisjZWxzZQorCXU4ICAgICAgICAgbGJhMDo1OwkJLyogTVNiICovCisJdTggICAgICAgICBsdW46MzsKKyNlbmRpZgorCXU4ICAgICAgICAgbGJhMTsKKwl1OCAgICAgICAgIGxiYTI7CQkvKiBMU0IgKi8KKwl1OCAgICAgICAgIHhmZXJfbGVuZ3RoOworCXU4ICAgICAgICAgY29udHJvbDsKK307CisKKyNkZWZpbmUgU0NTSV9UQVBFX0NEQjZfR0VUX1RMKGNkYikgICAgICAgICAgICAgIFwKKyAgICAoKChjZGIpLT50bDAgPDwgMTYpIHwgKChjZGIpLT50bDEgPDwgOCkgfCAoY2RiKS0+dGwyKQorCisjZGVmaW5lIFNDU0lfVEFQRV9DREI2X1NFVF9UTChjZGIsIHRsKSB7ICAgICAgXAorICAgIChjZGIpLT50bDAgPSB0bCA+PiAxNjsgICAgICAgICAgICBcCisgICAgKGNkYiktPnRsMSA9ICh0bCA+PiA4KSAmIDB4RkY7ICAgIFwKKyAgICAoY2RiKS0+dGwyID0gdGwgJiAweEZGOyAgICAgICAgICAgXAorfQorCisvKgorICogU0NTSSBzZXF1ZW50aWFsIChUQVBFKSB3cnRpZSBjb21tYW5kCisgKi8KK3N0cnVjdCBzY3NpX3RhcGVfd3Jfc3sKKwl1OCAgICAgICAgIG9wY29kZTsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgcnN2ZDo3OworCXU4ICAgICAgICAgZml4ZWQ6MTsJLyogTVNiICovCisjZWxzZQorCXU4ICAgICAgICAgZml4ZWQ6MTsJLyogTVNiICovCisJdTggICAgICAgICByc3ZkOjc7CisjZW5kaWYKKwl1OCAgICAgICAgIHRsMDsJCS8qIE1zYiAqLworCXU4ICAgICAgICAgdGwxOworCXU4ICAgICAgICAgdGwyOwkJLyogTHNiICovCisKKwl1OCAgICAgICAgIGNvbnRyb2w7Cit9OworCisjZGVmaW5lIFNDU0lfQ0RCNl9HRVRfTEJBKGNkYikgICAgICAgICAgICAgIFwKKyAgICAoKChjZGIpLT5sYmEwIDw8IDE2KSB8ICgoY2RiKS0+bGJhMSA8PCA4KSB8IChjZGIpLT5sYmEyKQorCisjZGVmaW5lIFNDU0lfQ0RCNl9TRVRfTEJBKGNkYiwgbGJhKSB7ICAgICAgXAorICAgIChjZGIpLT5sYmEwID0gbGJhID4+IDE2OyAgICAgICAgICAgIFwKKyAgICAoY2RiKS0+bGJhMSA9IChsYmEgPj4gOCkgJiAweEZGOyAgICBcCisgICAgKGNkYiktPmxiYTIgPSBsYmEgJiAweEZGOyAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNDU0lfQ0RCNl9HRVRfVEwoY2RiKSAoKGNkYiktPnhmZXJfbGVuZ3RoKQorI2RlZmluZSBTQ1NJX0NEQjZfU0VUX1RMKGNkYiwgdGwpIHsgICAgICBcCisgICAgKGNkYiktPnhmZXJfbGVuZ3RoID0gdGw7ICAgICAgICAgXAorfQorCisvKgorICogU0NTSSBzZW5zZSBkYXRhIGZvcm1hdAorICovCitzdHJ1Y3Qgc2NzaV9zZW5zZV9zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICB2YWxpZDoxOworCXU4ICAgICAgICAgcnNwX2NvZGU6NzsKKyNlbHNlCisJdTggICAgICAgICByc3BfY29kZTo3OworCXU4ICAgICAgICAgdmFsaWQ6MTsKKyNlbmRpZgorCXU4ICAgICAgICAgc2VnX251bTsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgZmlsZV9tYXJrOjE7CisJdTggICAgICAgICBlb206MTsJCS8qIGVuZCBvZiBtZWRpYSAqLworCXU4ICAgICAgICAgaWxpOjE7CQkvKiBpbmNvcnJlY3QgbGVuZ3RoIGluZGljYXRvciAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQ6MTsKKwl1OCAgICAgICAgIHNlbnNlX2tleTo0OworI2Vsc2UKKwl1OCAgICAgICAgIHNlbnNlX2tleTo0OworCXU4ICAgICAgICAgcmVzZXJ2ZWQ6MTsKKwl1OCAgICAgICAgIGlsaToxOwkJLyogaW5jb3JyZWN0IGxlbmd0aCBpbmRpY2F0b3IgKi8KKwl1OCAgICAgICAgIGVvbToxOwkJLyogZW5kIG9mIG1lZGlhICovCisJdTggICAgICAgICBmaWxlX21hcms6MTsKKyNlbmRpZgorCXU4ICAgICAgICAgaW5mb3JtYXRpb25bNF07CS8qIGRldmljZS10eXBlIG9yIGNvbW1hbmQgc3BlY2lmaWMgaW5mbworCQkJCQkgKi8KKwl1OCAgICAgICAgIGFkZF9zZW5zZV9sZW5ndGg7CisJCQkJCS8qIGFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoICovCisJdTggICAgICAgICBjb21tYW5kX2luZm9bNF07LyogY29tbWFuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbgorCQkJCQkJICovCisJdTggICAgICAgICBhc2M7CQkvKiBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgKi8KKwl1OCAgICAgICAgIGFzY3E7CQkvKiBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgcXVhbGlmaWVyICovCisJdTggICAgICAgICBmcnVfY29kZTsJLyogZmllbGQgcmVwbGFjZWFibGUgdW5pdCBjb2RlICovCisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHNrc3Y6MTsJCS8qIHNlbnNlIGtleSBzcGVjaWZpYyB2YWxpZCAqLworCXU4ICAgICAgICAgY19kOjE7CQkvKiBjb21tYW5kL2RhdGEgYml0ICovCisJdTggICAgICAgICByZXMxOjI7CisJdTggICAgICAgICBicHY6MTsJCS8qIGJpdCBwb2ludGVyIHZhbGlkICovCisJdTggICAgICAgICBicG9pbnRlcjozOwkvKiBiaXQgcG9pbnRlciAqLworI2Vsc2UKKwl1OCAgICAgICAgIGJwb2ludGVyOjM7CS8qIGJpdCBwb2ludGVyICovCisJdTggICAgICAgICBicHY6MTsJCS8qIGJpdCBwb2ludGVyIHZhbGlkICovCisJdTggICAgICAgICByZXMxOjI7CisJdTggICAgICAgICBjX2Q6MTsJCS8qIGNvbW1hbmQvZGF0YSBiaXQgKi8KKwl1OCAgICAgICAgIHNrc3Y6MTsJCS8qIHNlbnNlIGtleSBzcGVjaWZpYyB2YWxpZCAqLworI2VuZGlmCisJdTggICAgICAgICBmcG9pbnRlclsyXTsJLyogZmllbGQgcG9pbnRlciAqLworfTsKKworI2RlZmluZSBTQ1NJX1NFTlNFX0NVUl9FUlIgICAgICAgICAgMHg3MAorI2RlZmluZSBTQ1NJX1NFTlNFX0RFRl9FUlIgICAgICAgICAgMHg3MQorCisvKgorICogU0NTSSBzZW5zZSBrZXkgdmFsdWVzCisgKi8KKyNkZWZpbmUgU0NTSV9TS19OT19TRU5TRSAgICAgICAgMHgwCisjZGVmaW5lIFNDU0lfU0tfUkVDX0VSUiAgICAgICAgIDB4MQkvKiByZWNvdmVyZWQgZXJyb3IgKi8KKyNkZWZpbmUgU0NTSV9TS19OT1RfUkVBRFkgICAgICAgMHgyCisjZGVmaW5lIFNDU0lfU0tfTUVEX0VSUiAgICAgICAgIDB4MwkvKiBtZWRpdW0gZXJyb3IgKi8KKyNkZWZpbmUgU0NTSV9TS19IV19FUlIgICAgICAgICAgMHg0CS8qIGhhcmR3YXJlIGVycm9yICovCisjZGVmaW5lIFNDU0lfU0tfSUxMRUdBTF9SRVEgICAgIDB4NQorI2RlZmluZSBTQ1NJX1NLX1VOSVRfQVRUICAgICAgICAweDYJLyogdW5pdCBhdHRlbnRpb24gKi8KKyNkZWZpbmUgU0NTSV9TS19EQVRBX1BST1RFQ1QgICAgMHg3CisjZGVmaW5lIFNDU0lfU0tfQkxBTktfQ0hFQ0sgICAgIDB4OAorI2RlZmluZSBTQ1NJX1NLX1ZFTkRPUl9TUEVDICAgICAweDkKKyNkZWZpbmUgU0NTSV9TS19DT1BZX0FCT1JURUQgICAgMHhBCisjZGVmaW5lIFNDU0lfU0tfQUJPUlRFRF9DTU5EICAgIDB4QgorI2RlZmluZSBTQ1NJX1NLX1ZPTF9PVkVSRkxPVyAgICAweEQKKyNkZWZpbmUgU0NTSV9TS19NSVNDT01QQVJFICAgICAgMHhFCisKKy8qCisgKiBTQ1NJIGFkZGl0aW9uYWwgc2Vuc2UgY29kZXMKKyAqLworI2RlZmluZSBTQ1NJX0FTQ19OT19BRERfU0VOU0UgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0NTSV9BU0NfTFVOX05PVF9SRUFEWSAgICAgICAgICAweDA0CisjZGVmaW5lIFNDU0lfQVNDX0xVTl9DT01NVU5JQ0FUSU9OICAgICAgMHgwOAorI2RlZmluZSBTQ1NJX0FTQ19XUklURV9FUlJPUiAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgU0NTSV9BU0NfSU5WQUxJRF9DTU5EX0NPREUgICAgICAweDIwCisjZGVmaW5lIFNDU0lfQVNDX0JBRF9MQkEgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBTQ1NJX0FTQ19JTlZBTElEX0ZJRUxEX0lOX0NEQiAgIDB4MjQKKyNkZWZpbmUgU0NTSV9BU0NfTFVOX05PVF9TVVBQT1JURUQgICAgICAweDI1CisjZGVmaW5lIFNDU0lfQVNDX0xVTl9XUklURV9QUk9URUNUICAgICAgMHgyNworI2RlZmluZSBTQ1NJX0FTQ19QT1dFUk9OX0JEUiAgICAgICAgICAgIDB4MjkJLyogcG93ZXIgb24gcmVzZXQsIGJ1cyByZXNldCwKKwkJCQkJCSAqIGJ1cyBkZXZpY2UgcmVzZXQKKwkJCQkJCSAqLworI2RlZmluZSBTQ1NJX0FTQ19QQVJBTVNfQ0hBTkdFRCAgICAgICAgIDB4MkEKKyNkZWZpbmUgU0NTSV9BU0NfQ01ORF9DTEVBUkVEX0JZX0FfSSAgICAweDJGCisjZGVmaW5lIFNDU0lfQVNDX1NBVklOR19QQVJBTV9OT1RTVVBQICAgMHgzOQorI2RlZmluZSBTQ1NJX0FTQ19UT0NDICAgICAgICAgICAgICAgICAgIDB4M0YJLyogdGFyZ2V0IG9wZXJhdGluZyBjb25kdGlvbnMKKwkJCQkJCSAqIGNoYW5nZWQKKwkJCQkJCSAqLworI2RlZmluZSBTQ1NJX0FTQ19QQVJJVFlfRVJST1IgICAgICAgICAgIDB4NDcKKyNkZWZpbmUgU0NTSV9BU0NfQ01ORF9QSEFTRV9FUlJPUiAgICAgICAweDRBCisjZGVmaW5lIFNDU0lfQVNDX0RBVEFfUEhBU0VfRVJST1IgICAgICAgMHg0QgorI2RlZmluZSBTQ1NJX0FTQ19WRU5ET1JfU1BFQyAgICAgICAgICAgIDB4N0YKKworLyoKKyAqIFNDU0kgYWRkaXRpb25hbCBzZW5zZSBjb2RlIHF1YWxpZmllcnMKKyAqLworI2RlZmluZSBTQ1NJX0FTQ1FfQ0FVU0VfTk9UX1JFUE9SVCAgICAgIDB4MDAKKyNkZWZpbmUgU0NTSV9BU0NRX0JFQ09NSU5HX1JFQURZICAgICAgICAweDAxCisjZGVmaW5lIFNDU0lfQVNDUV9JTklUX0NNRF9SRVEgICAgICAgICAgMHgwMgorI2RlZmluZSBTQ1NJX0FTQ1FfRk9STUFUX0lOX1BST0dSRVNTICAgIDB4MDQKKyNkZWZpbmUgU0NTSV9BU0NRX09QRVJBVElPTl9JTl9QUk9HUkVTUyAweDA3CisjZGVmaW5lIFNDU0lfQVNDUV9TRUxGX1RFU1RfSU5fUFJPR1JFU1MgMHgwOQorI2RlZmluZSBTQ1NJX0FTQ1FfV1JfVU5FWFBfVU5TT0xfREFUQSAgIDB4MEMKKyNkZWZpbmUgU0NTSV9BU0NRX1dSX05PVEVOR19VTlNPTF9EQVRBICAweDBECisKKyNkZWZpbmUgU0NTSV9BU0NRX0xCQV9PVVRfT0ZfUkFOR0UgICAgICAweDAwCisjZGVmaW5lIFNDU0lfQVNDUV9JTlZBTElEX0VMRU1FTlRfQUREUiAgMHgwMQorCisjZGVmaW5lIFNDU0lfQVNDUV9MVU5fV1JJVEVfUFJPVEVDVEVEICAgICAgIDB4MDAKKyNkZWZpbmUgU0NTSV9BU0NRX0xVTl9IV19XUklURV9QUk9URUNURUQgICAgMHgwMQorI2RlZmluZSBTQ1NJX0FTQ1FfTFVOX1NXX1dSSVRFX1BST1RFQ1RFRCAgICAweDAyCisKKyNkZWZpbmUgU0NTSV9BU0NRX1BPUiAgIDB4MDEJLyogcG93ZXIgb24gcmVzZXQgKi8KKyNkZWZpbmUgU0NTSV9BU0NRX1NCUiAgIDB4MDIJLyogc2NzaSBidXMgcmVzZXQgKi8KKyNkZWZpbmUgU0NTSV9BU0NRX0JEUiAgIDB4MDMJLyogYnVzIGRldmljZSByZXNldCAqLworI2RlZmluZSBTQ1NJX0FTQ1FfRElSICAgMHgwNAkvKiBkZXZpY2UgaW50ZXJuYWwgcmVzZXQgKi8KKworI2RlZmluZSBTQ1NJX0FTQ1FfTU9ERV9QQVJBTVNfQ0hBTkdFRCAgICAgICAweDAxCisjZGVmaW5lIFNDU0lfQVNDUV9MT0dfUEFSQU1TX0NIQU5HRUQgICAgICAgIDB4MDIKKyNkZWZpbmUgU0NTSV9BU0NRX1JFU0VSVkFUSU9OU19QUkVFTVBURUQgICAgMHgwMworI2RlZmluZSBTQ1NJX0FTQ1FfUkVTRVJWQVRJT05TX1JFTEVBU0VEICAgICAweDA0CisjZGVmaW5lIFNDU0lfQVNDUV9SRUdJU1RSQVRJT05TX1BSRUVNUFRFRCAgIDB4MDUKKworI2RlZmluZSBTQ1NJX0FTQ1FfTUlDUk9DT0RFX0NIQU5HRUQgMHgwMQorI2RlZmluZSBTQ1NJX0FTQ1FfQ0hBTkdFRF9PUEVSX0NPTkQgMHgwMgorI2RlZmluZSBTQ1NJX0FTQ1FfSU5RX0NIQU5HRUQgICAgICAgMHgwMwkvKiBpbnF1aXJ5IGRhdGEgY2hhbmdlZCAqLworI2RlZmluZSBTQ1NJX0FTQ1FfRElfQ0hBTkdFRCAgICAgICAgMHgwNQkvKiBkZXZpY2UgaWQgY2hhbmdlZCAqLworI2RlZmluZSBTQ1NJX0FTQ1FfUkxfREFUQV9DSEFOR0VEICAgMHgwRQkvKiByZXBvcnQgbHVucyBkYXRhIGNoYW5nZWQgKi8KKworI2RlZmluZSBTQ1NJX0FTQ1FfRFBfQ1JDX0VSUiAgICAgICAgICAgIDB4MDEJLyogZGF0YSBwaGFzZSBjcmMgZXJyb3IgKi8KKyNkZWZpbmUgU0NTSV9BU0NRX0RQX1NDU0lfUEFSSVRZX0VSUiAgICAweDAyCS8qIGRhdGEgcGhhc2Ugc2NzaSBwYXJpdHkgZXJyb3IKKwkJCQkJCSAqLworI2RlZmluZSBTQ1NJX0FTQ1FfSVVfQ1JDX0VSUiAgICAgICAgICAgIDB4MDMJLyogaW5mb3JtYXRpb24gdW5pdCBjcmMgZXJyb3IgKi8KKyNkZWZpbmUgU0NTSV9BU0NRX1BST1RPX1NFUlZfQ1JDX0VSUiAgICAweDA1CisKKyNkZWZpbmUgU0NTSV9BU0NRX0xVTl9USU1FX09VVCAgICAgICAgICAweDAxCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU0NTSSBJTlFVSVJZCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3N7CisJdTggICAgICAgICBvcGNvZGU7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIGx1bjozOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjM7CisJdTggICAgICAgICBjbWRfZHQ6MTsKKwl1OCAgICAgICAgIGV2cGQ6MTsKKyNlbHNlCisJdTggICAgICAgICBldnBkOjE7CisJdTggICAgICAgICBjbWRfZHQ6MTsKKwl1OCAgICAgICAgIHJlc2VydmVkMTozOworCXU4ICAgICAgICAgbHVuOjM7CisjZW5kaWYKKwl1OCAgICAgICAgIHBhZ2VfY29kZTsKKwl1OCAgICAgICAgIHJlc2VydmVkMjsKKwl1OCAgICAgICAgIGFsbG9jX2xlbmd0aDsKKwl1OCAgICAgICAgIGNvbnRyb2w7Cit9OworCitzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3ZlbmRvcl9zeworCXU4ICAgICAgICAgdmVuZG9yX2lkWzhdOworfTsKKworc3RydWN0IHNjc2lfaW5xdWlyeV9wcm9kaWRfc3sKKwl1OCAgICAgICAgIHByb2R1Y3RfaWRbMTZdOworfTsKKworc3RydWN0IHNjc2lfaW5xdWlyeV9wcm9kcmV2X3N7CisJdTggICAgICAgICBwcm9kdWN0X3Jldls0XTsKK307CisKK3N0cnVjdCBzY3NpX2lucXVpcnlfZGF0YV9zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICBwZXJpcGhlcmFsX3F1YWw6MzsJLyogcGVyaXBoZXJhbCBxdWFsaWZpZXIgKi8KKwl1OCAgICAgICAgIGRldmljZV90eXBlOjU7CQkvKiBwZXJpcGhlcmFsIGRldmljZSB0eXBlICovCisKKwl1OCAgICAgICAgIHJtYjoxOwkJCS8qIHJlbW92YWJsZSBtZWRpdW0gYml0ICovCisJdTggICAgICAgICBkZXZpY2VfdHlwZV9tb2Q6NzsJLyogZGV2aWNlIHR5cGUgbW9kaWZpZXIgKi8KKworCXU4ICAgICAgICAgdmVyc2lvbjsKKworCXU4ICAgICAgICAgYWVuYzoxOwkJLyogYXN5bmMgZXZlbnQgbm90aWZpY2F0aW9uIGNhcGFiaWxpdHkKKwkJCQkJICovCisJdTggICAgICAgICB0cm1faW9wOjE7CS8qIHRlcm1pbmF0ZSBJL08gcHJvY2VzcyAqLworCXU4ICAgICAgICAgbm9ybV9hY2E6MTsJLyogbm9ybWFsIEFDQSBzdXBwb3J0ZWQgKi8KKwl1OCAgICAgICAgIGhpX3N1cHBvcnQ6MTsJLyogU0NTSS0zOiBzdXBwb3J0cyBSRVBPUlQgTFVOUyAqLworCXU4ICAgICAgICAgcnNwX2RhdGFfZm9ybWF0OjQ7CisKKwl1OCAgICAgICAgIGFkZGl0aW9uYWxfbGVuOworCXU4ICAgICAgICAgc2NjczoxOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjc7CisKKwl1OCAgICAgICAgIHJlc2VydmVkMjoxOworCXU4ICAgICAgICAgZW5jX3NlcnY6MTsJLyogZW5jbG9zdXJlIHNlcnZpY2UgY29tcG9uZW50ICovCisJdTggICAgICAgICByZXNlcnZlZDM6MTsKKwl1OCAgICAgICAgIG11bHRpX3BvcnQ6MTsJLyogbXVsdGktcG9ydCBkZXZpY2UgKi8KKwl1OCAgICAgICAgIG1fY2huZ3I6MTsJLyogZGV2aWNlIGluIG1lZGl1bSB0cmFuc3BvcnQgZWxlbWVudCAqLworCXU4ICAgICAgICAgYWNrX3JlcV9xOjE7CS8qIFNJUCBzcGVjaWZpYyBiaXQgKi8KKwl1OCAgICAgICAgIGFkZHIzMjoxOwkvKiBTSVAgc3BlY2lmaWMgYml0ICovCisJdTggICAgICAgICBhZGRyMTY6MTsJLyogU0lQIHNwZWNpZmljIGJpdCAqLworCisJdTggICAgICAgICByZWxfYWRyOjE7CS8qIHJlbGF0aXZlIGFkZHJlc3MgKi8KKwl1OCAgICAgICAgIHdfYnVzMzI6MTsKKwl1OCAgICAgICAgIHdfYnVzMTY6MTsKKwl1OCAgICAgICAgIHN5bmNocm9ub3VzOjE7CisJdTggICAgICAgICBsaW5rZWRfY29tbWFuZHM6MTsKKwl1OCAgICAgICAgIHRyYW5zX2RpczoxOworCXU4ICAgICAgICAgY21kX3F1ZXVlOjE7CS8qIGNvbW1hbmQgcXVldWVpbmcgc3VwcG9ydGVkICovCisJdTggICAgICAgICBzb2Z0X3Jlc2V0OjE7CS8qIHNvZnQgcmVzZXQgYWx0ZXJuYXRpdmUgKFZTKSAqLworI2Vsc2UKKwl1OCAgICAgICAgIGRldmljZV90eXBlOjU7CS8qIHBlcmlwaGVyYWwgZGV2aWNlIHR5cGUgKi8KKwl1OCAgICAgICAgIHBlcmlwaGVyYWxfcXVhbDozOworCQkJCQkvKiBwZXJpcGhlcmFsIHF1YWxpZmllciAqLworCisJdTggICAgICAgICBkZXZpY2VfdHlwZV9tb2Q6NzsKKwkJCQkJLyogZGV2aWNlIHR5cGUgbW9kaWZpZXIgKi8KKwl1OCAgICAgICAgIHJtYjoxOwkJLyogcmVtb3ZhYmxlIG1lZGl1bSBiaXQgKi8KKworCXU4ICAgICAgICAgdmVyc2lvbjsKKworCXU4ICAgICAgICAgcnNwX2RhdGFfZm9ybWF0OjQ7CisJdTggICAgICAgICBoaV9zdXBwb3J0OjE7CS8qIFNDU0ktMzogc3VwcG9ydHMgUkVQT1JUIExVTlMgKi8KKwl1OCAgICAgICAgIG5vcm1fYWNhOjE7CS8qIG5vcm1hbCBBQ0Egc3VwcG9ydGVkICovCisJdTggICAgICAgICB0ZXJtaW5hdGVfaW9wOjE7LyogdGVybWluYXRlIEkvTyBwcm9jZXNzICovCisJdTggICAgICAgICBhZW5jOjE7CQkvKiBhc3luYyBldmVudCBub3RpZmljYXRpb24gY2FwYWJpbGl0eQorCQkJCQkgKi8KKworCXU4ICAgICAgICAgYWRkaXRpb25hbF9sZW47CisJdTggICAgICAgICByZXNlcnZlZDE6NzsKKwl1OCAgICAgICAgIHNjY3M6MTsKKworCXU4ICAgICAgICAgYWRkcjE2OjE7CS8qIFNJUCBzcGVjaWZpYyBiaXQgKi8KKwl1OCAgICAgICAgIGFkZHIzMjoxOwkvKiBTSVAgc3BlY2lmaWMgYml0ICovCisJdTggICAgICAgICBhY2tfcmVxX3E6MTsJLyogU0lQIHNwZWNpZmljIGJpdCAqLworCXU4ICAgICAgICAgbV9jaG5ncjoxOwkvKiBkZXZpY2UgaW4gbWVkaXVtIHRyYW5zcG9ydCBlbGVtZW50ICovCisJdTggICAgICAgICBtdWx0aV9wb3J0OjE7CS8qIG11bHRpLXBvcnQgZGV2aWNlICovCisJdTggICAgICAgICByZXNlcnZlZDM6MTsJLyogVEJEIC0gVmVuZG9yIFNwZWNpZmljICovCisJdTggICAgICAgICBlbmNfc2VydjoxOwkvKiBlbmNsb3N1cmUgc2VydmljZSBjb21wb25lbnQgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMjoxOworCisJdTggICAgICAgICBzb2Z0X3Nlc2V0OjE7CS8qIHNvZnQgcmVzZXQgYWx0ZXJuYXRpdmUgKFZTKSAqLworCXU4ICAgICAgICAgY21kX3F1ZXVlOjE7CS8qIGNvbW1hbmQgcXVldWVpbmcgc3VwcG9ydGVkICovCisJdTggICAgICAgICB0cmFuc19kaXM6MTsKKwl1OCAgICAgICAgIGxpbmtlZF9jb21tYW5kczoxOworCXU4ICAgICAgICAgc3luY2hyb25vdXM6MTsKKwl1OCAgICAgICAgIHdfYnVzMTY6MTsKKwl1OCAgICAgICAgIHdfYnVzMzI6MTsKKwl1OCAgICAgICAgIHJlbF9hZHI6MTsJLyogcmVsYXRpdmUgYWRkcmVzcyAqLworI2VuZGlmCisJc3RydWN0IHNjc2lfaW5xdWlyeV92ZW5kb3JfcyB2ZW5kb3JfaWQ7CisJc3RydWN0IHNjc2lfaW5xdWlyeV9wcm9kaWRfcyBwcm9kdWN0X2lkOworCXN0cnVjdCBzY3NpX2lucXVpcnlfcHJvZHJldl9zIHByb2R1Y3RfcmV2OworCXU4ICAgICAgICAgdmVuZG9yX3NwZWNpZmljWzIwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkNFs0MF07Cit9OworCisvKgorICogaW5xdWlyeS5wZXJpcGhlcmFsX3F1YWwgZmllbGQgdmFsdWVzCisgKi8KKyNkZWZpbmUgU0NTSV9ERVZRVUFMX0RFRkFVTFQgICAgICAgIDAKKyNkZWZpbmUgU0NTSV9ERVZRVUFMX05PVF9DT05ORUNURUQgIDEKKyNkZWZpbmUgU0NTSV9ERVZRVUFMX05PVF9TVVBQT1JURUQgIDMKKworLyoKKyAqIGlucXVpcnkuZGV2aWNlX3R5cGUgZmllbGQgdmFsdWVzCisgKi8KKyNkZWZpbmUgU0NTSV9ERVZJQ0VfRElSRUNUX0FDQ0VTUyAgICAgICAweDAwCisjZGVmaW5lIFNDU0lfREVWSUNFX1NFUV9BQ0NFU1MgICAgICAgICAgMHgwMQorI2RlZmluZSBTQ1NJX0RFVklDRV9BUlJBWV9DT05UUk9MTEVSICAgIDB4MEMKKyNkZWZpbmUgU0NTSV9ERVZJQ0VfVU5LTk9XTiAgICAgICAgICAgICAweDFGCisKKy8qCisgKiBpbnF1aXJ5LnZlcnNpb24KKyAqLworI2RlZmluZSBTQ1NJX1ZFUlNJT05fQU5TSV9YMzEzMSAgICAgMgkvKiBBTlNJIFgzLjEzMSBTQ1NJLTIgKi8KKyNkZWZpbmUgU0NTSV9WRVJTSU9OX1NQQyAgICAgICAgICAgIDMJLyogU1BDIChTQ1NJLTMpLCBBTlNJIFgzLjMwMToxOTk3ICovCisjZGVmaW5lIFNDU0lfVkVSU0lPTl9TUENfMiAgICAgICAgICA0CS8qIFNQQy0yICovCisKKy8qCisgKiByZXNwb25zZSBkYXRhIGZvcm1hdAorICovCisjZGVmaW5lIFNDU0lfUlNQX0RBVEFfRk9STUFUICAgICAgICAyCS8qIFNDU0ktMiAmIFNQQyAqLworCisvKgorICogU0NTSSBpbnF1aXJ5IHBhZ2UgY29kZXMKKyAqLworI2RlZmluZSBTQ1NJX0lOUV9QQUdFX1ZQRF9QQUdFUyAgICAgMHgwMAkvKiBzdXBwb3J0ZWQgdnBkIHBhZ2VzICovCisjZGVmaW5lIFNDU0lfSU5RX1BBR0VfVVNOX1BBR0UgICAgICAweDgwCS8qIHVuaXQgc2VyaWFsIG51bWJlciBwYWdlICovCisjZGVmaW5lIFNDU0lfSU5RX1BBR0VfREVWX0lERU5UICAgICAweDgzCS8qIGRldmljZSBpbmRlbnRpZmljYXRpb24gcGFnZQorCQkJCQkJICovCisjZGVmaW5lIFNDU0lfSU5RX1BBR0VTX01BWCAgICAgICAgICAzCisKKy8qCisgKiBzdXBwb3J0ZWQgdml0YWwgcHJvZHVjdCBkYXRhIHBhZ2VzCisgKi8KK3N0cnVjdCBzY3NpX2lucV9wYWdlX3ZwZF9wYWdlc19zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICBwZXJpcGhlcmFsX3F1YWw6MzsKKwl1OCAgICAgICAgIGRldmljZV90eXBlOjU7CisjZWxzZQorCXU4ICAgICAgICAgZGV2aWNlX3R5cGU6NTsKKwl1OCAgICAgICAgIHBlcmlwaGVyYWxfcXVhbDozOworI2VuZGlmCisJdTggICAgICAgICBwYWdlX2NvZGU7CisJdTggICAgICAgICByZXNlcnZlZDsKKwl1OCAgICAgICAgIHBhZ2VfbGVuZ3RoOworCXU4ICAgICAgICAgcGFnZXNbU0NTSV9JTlFfUEFHRVNfTUFYXTsKK307CisKKy8qCisgKiBVbml0IHNlcmlhbCBudW1iZXIgcGFnZQorICovCisjZGVmaW5lIFNDU0lfSU5RX1VTTl9MRU4gMzIKKworc3RydWN0IHNjc2lfaW5xX3Vzbl9zeworCWNoYXIgICAgICAgICAgICB1c25bU0NTSV9JTlFfVVNOX0xFTl07Cit9OworCitzdHJ1Y3Qgc2NzaV9pbnFfcGFnZV91c25fc3sKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgcGVyaXBoZXJhbF9xdWFsOjM7CisJdTggICAgICAgICBkZXZpY2VfdHlwZTo1OworI2Vsc2UKKwl1OCAgICAgICAgIGRldmljZV90eXBlOjU7CisJdTggICAgICAgICBwZXJpcGhlcmFsX3F1YWw6MzsKKyNlbmRpZgorCXU4ICAgICAgICAgcGFnZV9jb2RlOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOworCXU4ICAgICAgICAgcGFnZV9sZW5ndGg7CisJc3RydWN0IHNjc2lfaW5xX3Vzbl9zICB1c247Cit9OworCitlbnVtIHsKKwlTQ1NJX0lOUV9ESVBfQ09ERV9CSU5BUlkgPSAxLAkvKiBpZGVudGlmaWVyIGhhcyBiaW5hcnkgdmFsdWUgKi8KKwlTQ1NJX0lOUV9ESVBfQ09ERV9BU0NJSSA9IDIsCS8qIGlkZW50aWZpZXIgaGFzIGFzY2lpIHZhbHVlICovCit9OworCitlbnVtIHsKKwlTQ1NJX0lOUV9ESVBfQVNTT0NfTFVOID0gMCwJLyogaWQgaXMgYXNzb2NpYXRlZCB3aXRoIGRldmljZSAqLworCVNDU0lfSU5RX0RJUF9BU1NPQ19QT1JUID0gMSwJLyogaWQgaXMgYXNzb2NpYXRlZCB3aXRoIHBvcnQgdGhhdAorCQkJCQkgKiByZWNlaXZlZCB0aGUgcmVxdWVzdAorCQkJCQkgKi8KK307CisKK2VudW0geworCVNDU0lfSU5RX0lEX1RZUEVfVkVORE9SID0gMSwKKwlTQ1NJX0lOUV9JRF9UWVBFX0lFRUUgPSAyLAorCVNDU0lfSU5RX0lEX1RZUEVfRkNfRlMgPSAzLAorCVNDU0lfSU5RX0lEX1RZUEVfT1RIRVIgPSA0LAorfTsKKworc3RydWN0IHNjc2lfaW5xX2RpcF9kZXNjX3N7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHJlczA6NDsKKwl1OCAgICAgICAgIGNvZGVfc2V0OjQ7CisJdTggICAgICAgICByZXMxOjI7CisJdTggICAgICAgICBhc3NvY2lhdGlvbjoyOworCXU4ICAgICAgICAgaWRfdHlwZTo0OworI2Vsc2UKKwl1OCAgICAgICAgIGNvZGVfc2V0OjQ7CisJdTggICAgICAgICByZXMwOjQ7CisJdTggICAgICAgICBpZF90eXBlOjQ7CisJdTggICAgICAgICBhc3NvY2lhdGlvbjoyOworCXU4ICAgICAgICAgcmVzMToyOworI2VuZGlmCisJdTggICAgICAgICByZXMyOworCXU4ICAgICAgICAgaWRfbGVuOworCXN0cnVjdCBzY3NpX2x1bl9zbl9zICAgaWQ7Cit9OworCisvKgorICogRGV2aWNlIGluZGVudGlmaWNhdGlvbiBwYWdlCisgKi8KK3N0cnVjdCBzY3NpX2lucV9wYWdlX2Rldl9pZGVudF9zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICBwZXJpcGhlcmFsX3F1YWw6MzsKKwl1OCAgICAgICAgIGRldmljZV90eXBlOjU7CisjZWxzZQorCXU4ICAgICAgICAgZGV2aWNlX3R5cGU6NTsKKwl1OCAgICAgICAgIHBlcmlwaGVyYWxfcXVhbDozOworI2VuZGlmCisJdTggICAgICAgICBwYWdlX2NvZGU7CisJdTggICAgICAgICByZXNlcnZlZDE7CisJdTggICAgICAgICBwYWdlX2xlbmd0aDsKKwlzdHJ1Y3Qgc2NzaV9pbnFfZGlwX2Rlc2NfcyBkZXNjOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSRUFEIENBUEFDSVRZCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdHJ1Y3Qgc2NzaV9yZWFkX2NhcGFjaXR5X3N7CisJdTggICAgICAgICBvcGNvZGU7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIGx1bjozOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjQ7CisJdTggICAgICAgICByZWxfYWRyOjE7CisjZWxzZQorCXU4ICAgICAgICAgcmVsX2FkcjoxOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjQ7CisJdTggICAgICAgICBsdW46MzsKKyNlbmRpZgorCXU4ICAgICAgICAgbGJhMDsJLyogTVNCICovCisJdTggICAgICAgICBsYmExOworCXU4ICAgICAgICAgbGJhMjsKKwl1OCAgICAgICAgIGxiYTM7CS8qIExTQiAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQyOworCXU4ICAgICAgICAgcmVzZXJ2ZWQzOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICByZXNlcnZlZDQ6NzsKKwl1OCAgICAgICAgIHBtaToxOwkvKiBwYXJ0aWFsIG1lZGl1bSBpbmRpY2F0b3IgKi8KKyNlbHNlCisJdTggICAgICAgICBwbWk6MTsJLyogcGFydGlhbCBtZWRpdW0gaW5kaWNhdG9yICovCisJdTggICAgICAgICByZXNlcnZlZDQ6NzsKKyNlbmRpZgorCXU4ICAgICAgICAgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3JlYWRfY2FwYWNpdHlfZGF0YV9zeworCXUzMiAgICAgICAgbWF4X2xiYTsJLyogbWF4aW11bSBMQkEgYXZhaWxhYmxlICovCisJdTMyICAgICAgICBibG9ja19sZW5ndGg7CS8qIGluIGJ5dGVzICovCit9OworCitzdHJ1Y3Qgc2NzaV9yZWFkX2NhcGFjaXR5MTZfZGF0YV9zeworCXU2NCAgICAgICAgbGJhOwkvKiBtYXhpbXVtIExCQSBhdmFpbGFibGUgKi8KKwl1MzIgICAgICAgIGJsb2NrX2xlbmd0aDsJLyogaW4gYnl0ZXMgKi8KKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjQsCisJCQlwX3R5cGU6MywKKwkJCXByb3RfZW46MTsKKwl1OAkJcmVzZXJ2ZWQyOjQsCisJCQlsYl9wYmU6NDsJLyogbG9naWNhbCBibG9ja3MgcGVyIHBoeXNpY2FsIGJsb2NrCisJCQkJCSAqIGV4cG9uZW50ICovCisJdTE2CXJlc2VydmVkMzoyLAorCQkJbGJhX2FsaWduOjE0OwkvKiBsb3dlc3QgYWxpZ25lZCBsb2dpY2FsIGJsb2NrCisJCQkJCSAqIGFkZHJlc3MgKi8KKyNlbHNlCisJdTE2CWxiYV9hbGlnbjoxNCwJLyogbG93ZXN0IGFsaWduZWQgbG9naWNhbCBibG9jaworCQkJCQkgKiBhZGRyZXNzICovCisJCQlyZXNlcnZlZDM6MjsKKwl1OAkJbGJfcGJlOjQsCS8qIGxvZ2ljYWwgYmxvY2tzIHBlciBwaHlzaWNhbCBibG9jaworCQkJCQkgKiBleHBvbmVudCAqLworCQkJcmVzZXJ2ZWQyOjQ7CisJdTgJCXByb3RfZW46MSwKKwkJCXBfdHlwZTozLAorCQkJcmVzZXJ2ZWQxOjQ7CisjZW5kaWYKKwl1NjQJcmVzZXJ2ZWQ0OworCXU2NAlyZXNlcnZlZDU7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJFUE9SVCBMVU5TIGNvbW1hbmQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0cnVjdCBzY3NpX3JlcG9ydF9sdW5zX3N7CisJdTggICAgICAgICBvcGNvZGU7CQkvKiBBMGggLSBSRVBPUlQgTFVOUyBvcENvZGUgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMVs1XTsKKwl1OCAgICAgICAgIGFsbG9jX2xlbmd0aFs0XTsvKiBhbGxvY2F0aW9uIGxlbmd0aCBNU0IgZmlyc3QgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMjsKKwl1OCAgICAgICAgIGNvbnRyb2w7Cit9OworCisjZGVmaW5lIFNDU0lfUkVQT1JUX0xVTl9BTExPQ19MRU5HVEgocmwpICAgICAgICAgICAgICAgIAkJXAorICAgICgocmwtPmFsbG9jX2xlbmd0aFswXSA8PCAyNCkgfCAocmwtPmFsbG9jX2xlbmd0aFsxXSA8PCAxNikgfCAJXAorICAgICAocmwtPmFsbG9jX2xlbmd0aFsyXSA8PCA4KSB8IChybC0+YWxsb2NfbGVuZ3RoWzNdKSkKKworI2RlZmluZSBTQ1NJX1JFUE9SVF9MVU5TX1NFVF9BTExPQ0xFTihybCwgYWxsb2NfbGVuKSB7ICAgICAgXAorICAgIChybCktPmFsbG9jX2xlbmd0aFswXSA9IChhbGxvY19sZW4pID4+IDI0OyAgICAgIAkJCVwKKyAgICAocmwpLT5hbGxvY19sZW5ndGhbMV0gPSAoKGFsbG9jX2xlbikgPj4gMTYpICYgMHhGRjsgCQlcCisgICAgKHJsKS0+YWxsb2NfbGVuZ3RoWzJdID0gKChhbGxvY19sZW4pID4+IDgpICYgMHhGRjsgIAkJXAorICAgIChybCktPmFsbG9jX2xlbmd0aFszXSA9IChhbGxvY19sZW4pICYgMHhGRjsgICAgIAkJCVwKK30KKworc3RydWN0IHNjc2lfcmVwb3J0X2x1bnNfZGF0YV9zeworCXUzMiAgICAgICAgbHVuX2xpc3RfbGVuZ3RoOwkvKiBsZW5ndGggb2YgTFVOIGxpc3QgbGVuZ3RoICovCisJdTMyICAgICAgICByZXNlcnZlZDsKKwlsdW5fdCAgICAgICAgICAgbHVuWzFdOwkJCS8qIGZpcnN0IExVTiBpbiBsdW4gbGlzdCAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU0NTSSBtb2RlICBwYXJhbWV0ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitlbnVtIHsKKwlTQ1NJX0RBX01FRElVTV9ERUYgPSAwLAkvKiBkaXJlY3QgYWNjZXNzIGRlZmF1bHQgbWVkaXVtIHR5cGUgKi8KKwlTQ1NJX0RBX01FRElVTV9TUyA9IDEsCS8qIGRpcmVjdCBhY2Nlc3Mgc2luZ2xlIHNpZGVkICovCisJU0NTSV9EQV9NRURJVU1fRFMgPSAyLAkvKiBkaXJlY3QgYWNjZXNzIGRvdWJsZSBzaWRlZCAqLworfTsKKworLyoKKyAqIFNDU0kgTW9kZSBTZWxlY3QoNikgY2RiCisgKi8KK3N0cnVjdCBzY3NpX21vZGVfc2VsZWN0Nl9zeworCXU4ICAgICAgICAgb3Bjb2RlOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICByZXNlcnZlZDE6MzsKKwl1OCAgICAgICAgIHBmOjE7CQkvKiBwYWdlIGZvcm1hdCAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQyOjM7CisJdTggICAgICAgICBzcDoxOwkJLyogc2F2ZSBwYWdlcyBpZiBzZXQgdG8gMSAqLworI2Vsc2UKKwl1OCAgICAgICAgIHNwOjE7CS8qIHNhdmUgcGFnZXMgaWYgc2V0IHRvIDEgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMjozOworCXU4ICAgICAgICAgcGY6MTsJLyogcGFnZSBmb3JtYXQgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMTozOworI2VuZGlmCisJdTggICAgICAgICByZXNlcnZlZDNbMl07CisJdTggICAgICAgICBhbGxvY19sZW47CisJdTggICAgICAgICBjb250cm9sOworfTsKKworLyoKKyAqIFNDU0kgTW9kZSBTZWxlY3QoMTApIGNkYgorICovCitzdHJ1Y3Qgc2NzaV9tb2RlX3NlbGVjdDEwX3N7CisJdTggICAgICAgICBvcGNvZGU7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHJlc2VydmVkMTozOworCXU4ICAgICAgICAgcGY6MTsJLyogcGFnZSBmb3JtYXQgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMjozOworCXU4ICAgICAgICAgc3A6MTsJLyogc2F2ZSBwYWdlcyBpZiBzZXQgdG8gMSAqLworI2Vsc2UKKwl1OCAgICAgICAgIHNwOjE7CS8qIHNhdmUgcGFnZXMgaWYgc2V0IHRvIDEgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMjozOworCXU4ICAgICAgICAgcGY6MTsJLyogcGFnZSBmb3JtYXQgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMTozOworI2VuZGlmCisJdTggICAgICAgICByZXNlcnZlZDNbNV07CisJdTggICAgICAgICBhbGxvY19sZW5fbXNiOworCXU4ICAgICAgICAgYWxsb2NfbGVuX2xzYjsKKwl1OCAgICAgICAgIGNvbnRyb2w7Cit9OworCisvKgorICogU0NTSSBNb2RlIFNlbnNlKDYpIGNkYgorICovCitzdHJ1Y3Qgc2NzaV9tb2RlX3NlbnNlNl9zeworCXU4ICAgICAgICAgb3Bjb2RlOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICByZXNlcnZlZDE6NDsKKwl1OCAgICAgICAgIGRiZDoxOwkvKiBkaXNhYmxlIGJsb2NrIGRpc2NyaXB0b3JzIGlmIHNldCB0byAxICovCisJdTggICAgICAgICByZXNlcnZlZDI6MzsKKworCXU4ICAgICAgICAgcGM6MjsJLyogcGFnZSBjb250cm9sICovCisJdTggICAgICAgICBwYWdlX2NvZGU6NjsKKyNlbHNlCisJdTggICAgICAgICByZXNlcnZlZDI6MzsKKwl1OCAgICAgICAgIGRiZDoxOwkvKiBkaXNhYmxlIGJsb2NrIGRlc2NyaXB0b3JzIGlmIHNldCB0byAxICovCisJdTggICAgICAgICByZXNlcnZlZDE6NDsKKworCXU4ICAgICAgICAgcGFnZV9jb2RlOjY7CisJdTggICAgICAgICBwYzoyOwkvKiBwYWdlIGNvbnRyb2wgKi8KKyNlbmRpZgorCXU4ICAgICAgICAgcmVzZXJ2ZWQzOworCXU4ICAgICAgICAgYWxsb2NfbGVuOworCXU4ICAgICAgICAgY29udHJvbDsKK307CisKKy8qCisgKiBTQ1NJIE1vZGUgU2Vuc2UoMTApIGNkYgorICovCitzdHJ1Y3Qgc2NzaV9tb2RlX3NlbnNlMTBfc3sKKwl1OCAgICAgICAgIG9wY29kZTsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjM7CisJdTggICAgICAgICBMTEJBQToxOwkvKiBsb25nIExCQSBhY2NlcHRlZCBpZiBzZXQgdG8gMSAqLworCXU4ICAgICAgICAgZGJkOjE7CQkvKiBkaXNhYmxlIGJsb2NrIGRlc2NyaXB0b3JzIGlmIHNldAorCQkJCQkgKiB0byAxCisJCQkJCSAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQyOjM7CisKKwl1OCAgICAgICAgIHBjOjI7CQkvKiBwYWdlIGNvbnRyb2wgKi8KKwl1OCAgICAgICAgIHBhZ2VfY29kZTo2OworI2Vsc2UKKwl1OCAgICAgICAgIHJlc2VydmVkMjozOworCXU4ICAgICAgICAgZGJkOjE7CQkvKiBkaXNhYmxlIGJsb2NrIGRlc2NyaXB0b3JzIGlmIHNldCB0bworCQkJCQkgKiAxCisJCQkJCSAqLworCXU4ICAgICAgICAgTExCQUE6MTsJLyogbG9uZyBMQkEgYWNjZXB0ZWQgaWYgc2V0IHRvIDEgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMTozOworCisJdTggICAgICAgICBwYWdlX2NvZGU6NjsKKwl1OCAgICAgICAgIHBjOjI7CQkvKiBwYWdlIGNvbnRyb2wgKi8KKyNlbmRpZgorCXU4ICAgICAgICAgcmVzZXJ2ZWQzWzRdOworCXU4ICAgICAgICAgYWxsb2NfbGVuX21zYjsKKwl1OCAgICAgICAgIGFsbG9jX2xlbl9sc2I7CisJdTggICAgICAgICBjb250cm9sOworfTsKKworI2RlZmluZSBTQ1NJX0NEQjEwX0dFVF9BTChjZGIpICAJCQkJCVwKKyAgICAoKGNkYiktPmFsbG9jX2xlbl9tc2IgPDwgOCB8IChjZGIpLT5hbGxvY19sZW5fbHNiKQorCisjZGVmaW5lIFNDU0lfQ0RCMTBfU0VUX0FMKGNkYiwgYWwpIHsgICAgICBcCisgICAgKGNkYiktPmFsbG9jX2xlbl9tc2IgPSBhbCA+PiA4OyAgICAgICAJCQkJXAorICAgIChjZGIpLT5hbGxvY19sZW5fbHNiID0gYWwgJiAweEZGOyAgICAgCQkJCVwKK30KKworI2RlZmluZSBTQ1NJX0NEQjZfR0VUX0FMKGNkYikgKChjZGIpLT5hbGxvY19sZW4pCisKKyNkZWZpbmUgU0NTSV9DREI2X1NFVF9BTChjZGIsIGFsKSB7ICAgICAgXAorICAgIChjZGIpLT5hbGxvY19sZW4gPSBhbDsgICAgICAgICAJCQkJCVwKK30KKworLyoKKyAqIHBhZ2UgY29udHJvbCBmaWVsZCB2YWx1ZXMKKyAqLworI2RlZmluZSBTQ1NJX1BDX0NVUlJFTlRfVkFMVUVTICAgICAgIDB4MAorI2RlZmluZSBTQ1NJX1BDX0NIQU5HRUFCTEVfVkFMVUVTICAgIDB4MQorI2RlZmluZSBTQ1NJX1BDX0RFRkFVTFRfVkFMVUVTICAgICAgIDB4MgorI2RlZmluZSBTQ1NJX1BDX1NBVkVEX1ZBTFVFUyAgICAgICAgIDB4MworCisvKgorICogU0NTSSBtb2RlIHBhZ2UgY29kZXMKKyAqLworI2RlZmluZSBTQ1NJX01QX1ZFTkRPUl9TUEVDICAgICAweDAwCisjZGVmaW5lIFNDU0lfTVBfRElTQ19SRUNOICAgICAgIDB4MDIJLyogZGlzY29ubmVjdC1yZWNvbm5lY3QgcGFnZSAqLworI2RlZmluZSBTQ1NJX01QX0ZPUk1BVF9ERVZJQ0UgICAweDAzCisjZGVmaW5lIFNDU0lfTVBfUkRHICAgICAgICAgICAgIDB4MDQJLyogcmlnaWQgZGlzayBnZW9tZXRyeSBwYWdlICovCisjZGVmaW5lIFNDU0lfTVBfRkRQICAgICAgICAgICAgIDB4MDUJLyogZmxleGlibGUgZGlzayBwYWdlICovCisjZGVmaW5lIFNDU0lfTVBfQ0FDSElORyAgICAgICAgIDB4MDgJLyogY2FjaGluZyBwYWdlICovCisjZGVmaW5lIFNDU0lfTVBfQ09OVFJPTCAgICAgICAgIDB4MEEJLyogY29udHJvbCBtb2RlIHBhZ2UgKi8KKyNkZWZpbmUgU0NTSV9NUF9NRURfVFlQRVNfU1VQICAgMHgwQgkvKiBtZWRpdW0gdHlwZXMgc3VwcG9ydGVkIHBhZ2UgKi8KKyNkZWZpbmUgU0NTSV9NUF9JTkZPX0VYQ1BfQ05UTCAgMHgxQwkvKiBpbmZvcm1hdGlvbmFsIGV4Y2VwdGlvbiBjb250cm9sICovCisjZGVmaW5lIFNDU0lfTVBfQUxMICAgICAgICAgICAgIDB4M0YJLyogcmV0dXJuIGFsbCBwYWdlcyAtIG1vZGUgc2Vuc2Ugb25seSAqLworCisvKgorICogbW9kZSBwYXJhbWV0ZXIgaGVhZGVyCisgKi8KK3N0cnVjdCBzY3NpX21vZGVfcGFyYW1faGVhZGVyNl9zeworCXU4ICAgICAgICAgbW9kZV9kYXRhbGVuOworCXU4ICAgICAgICAgbWVkaXVtX3R5cGU7CisKKwkvKgorCSAqIGRldmljZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGV4cGFuZGVkIGZvciBkaXJlY3QgYWNjZXNzIGRldmljZXMKKwkgKi8KKyNpZmRlZiBfX0JJR0VORElBTgorCXUzMiAgICAgICAgd3A6MTsJCS8qIHdyaXRlIHByb3RlY3RlZCAqLworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjI7CisJdTMyICAgICAgICBkcG9mdWE6MTsJLyogZGlzYWJsZSBwYWdlIG91dCArIGZvcmNlIHVuaXQgYWNjZXNzCisJCQkJCSAqLworCXUzMiAgICAgICAgcmVzZXJ2ZWQyOjQ7CisjZWxzZQorCXUzMiAgICAgICAgcmVzZXJ2ZWQyOjQ7CisJdTMyICAgICAgICBkcG9mdWE6MTsJLyogZGlzYWJsZSBwYWdlIG91dCArIGZvcmNlIHVuaXQgYWNjZXNzCisJCQkJCSAqLworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjI7CisJdTMyICAgICAgICB3cDoxOwkJLyogd3JpdGUgcHJvdGVjdGVkICovCisjZW5kaWYKKworCXU4ICAgICAgICAgYmxvY2tfZGVzY2xlbjsKK307CisKK3N0cnVjdCBzY3NpX21vZGVfcGFyYW1faGVhZGVyMTBfc3sKKwl1MzIgICAgICAgIG1vZGVfZGF0YWxlbjoxNjsKKwl1MzIgICAgICAgIG1lZGl1bV90eXBlOjg7CisKKwkvKgorCSAqIGRldmljZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGV4cGFuZGVkIGZvciBkaXJlY3QgYWNjZXNzIGRldmljZXMKKwkgKi8KKyNpZmRlZiBfX0JJR0VORElBTgorCXUzMiAgICAgICAgd3A6MTsJCS8qIHdyaXRlIHByb3RlY3RlZCAqLworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjI7CisJdTMyICAgICAgICBkcG9mdWE6MTsJLyogZGlzYWJsZSBwYWdlIG91dCArIGZvcmNlIHVuaXQgYWNjZXNzCisJCQkJCSAqLworCXUzMiAgICAgICAgcmVzZXJ2ZWQyOjQ7CisjZWxzZQorCXUzMiAgICAgICAgcmVzZXJ2ZWQyOjQ7CisJdTMyICAgICAgICBkcG9mdWE6MTsJLyogZGlzYWJsZSBwYWdlIG91dCArIGZvcmNlIHVuaXQgYWNjZXNzCisJCQkJCSAqLworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjI7CisJdTMyICAgICAgICB3cDoxOwkJLyogd3JpdGUgcHJvdGVjdGVkICovCisjZW5kaWYKKworI2lmZGVmIF9fQklHRU5ESUFOCisJdTMyICAgICAgICByZXNlcnZlZDM6NzsKKwl1MzIgICAgICAgIGxvbmdsYmE6MTsKKyNlbHNlCisJdTMyICAgICAgICBsb25nbGJhOjE7CisJdTMyICAgICAgICByZXNlcnZlZDM6NzsKKyNlbmRpZgorCXUzMiAgICAgICAgcmVzZXJ2ZWQ0Ojg7CisJdTMyICAgICAgICBibG9ja19kZXNjbGVuOjE2OworfTsKKworLyoKKyAqIG1vZGUgcGFyYW1ldGVyIGJsb2NrIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IHNjc2lfbW9kZV9wYXJhbV9kZXNjX3N7CisJdTMyICAgICAgICBuYmxrczsKKwl1MzIgICAgICAgIGRlbnNpdHlfY29kZTo4OworCXUzMiAgICAgICAgYmxvY2tfbGVuZ3RoOjI0OworfTsKKworLyoKKyAqIERpc2Nvbm5lY3QtcmVjb25uZWN0IG1vZGUgcGFnZSBmb3JtYXQKKyAqLworc3RydWN0IHNjc2lfbXBfZGlzY19yZWNuX3N7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHBzOjE7CisJdTggICAgICAgICByZXNlcnZlZDE6MTsKKwl1OCAgICAgICAgIHBhZ2VfY29kZTo2OworI2Vsc2UKKwl1OCAgICAgICAgIHBhZ2VfY29kZTo2OworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTggICAgICAgICBwczoxOworI2VuZGlmCisJdTggICAgICAgICBwYWdlX2xlbjsKKwl1OCAgICAgICAgIGJ1Zl9mdWxsX3JhdGlvOworCXU4ICAgICAgICAgYnVmX2VtcHR5X3JhdGlvOworCisJdTggICAgICAgICBiaWxfbXNiOwkvKiBidXMgaW5hY3Rpdml0eSBsaW1pdCAtTVNCICovCisJdTggICAgICAgICBiaWxfbHNiOwkvKiBidXMgaW5hY3Rpdml0eSBsaW1pdCAtTFNCICovCisKKwl1OCAgICAgICAgIGR0bF9tc2I7CS8qIGRpc2Nvbm5lY3QgdGltZSBsaW1pdCAtIE1TQiAqLworCXU4ICAgICAgICAgZHRsX2xzYjsJLyogZGlzY29ubmVjdCB0aW1lIGxpbWl0IC0gTFNCICovCisKKwl1OCAgICAgICAgIGN0bF9tc2I7CS8qIGNvbm5lY3QgdGltZSBsaW1pdCAtIE1TQiAqLworCXU4ICAgICAgICAgY3RsX2xzYjsJLyogY29ubmVjdCB0aW1lIGxpbWl0IC0gTFNCICovCisKKwl1OCAgICAgICAgIG1heF9idXJzdF9sZW5fbXNiOworCXU4ICAgICAgICAgbWF4X2J1cnN0X2xlbl9sc2I7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIGVtZHA6MTsJLyogZW5hYmxlIG1vZGlmeSBkYXRhIHBvaW50ZXJzICovCisJdTggICAgICAgICBmYTozOwkvKiBmYWlyIGFyYml0cmF0aW9uICovCisJdTggICAgICAgICBkaW1tOjE7CS8qIGRpc2Nvbm5lY3QgaW1tZWRpYXRlICovCisJdTggICAgICAgICBkdGRjOjM7CS8qIGRhdGEgdHJhbnNmZXIgZGlzY29ubmVjdCBjb250cm9sICovCisjZWxzZQorCXU4ICAgICAgICAgZHRkYzozOwkvKiBkYXRhIHRyYW5zZmVyIGRpc2Nvbm5lY3QgY29udHJvbCAqLworCXU4ICAgICAgICAgZGltbToxOwkvKiBkaXNjb25uZWN0IGltbWVkaWF0ZSAqLworCXU4ICAgICAgICAgZmE6MzsJLyogZmFpciBhcmJpdHJhdGlvbiAqLworCXU4ICAgICAgICAgZW1kcDoxOwkvKiBlbmFibGUgbW9kaWZ5IGRhdGEgcG9pbnRlcnMgKi8KKyNlbmRpZgorCisJdTggICAgICAgICByZXNlcnZlZDM7CisKKwl1OCAgICAgICAgIGZpcnN0X2J1cnN0X2xlbl9tc2I7CisJdTggICAgICAgICBmaXJzdF9idXJzdF9sZW5fbHNiOworfTsKKworLyoKKyAqIFNDU0kgZm9ybWF0IGRldmljZSBtb2RlIHBhZ2UKKyAqLworc3RydWN0IHNjc2lfbXBfZm9ybWF0X2RldmljZV9zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTMyICAgICAgICBwczoxOworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTMyICAgICAgICBwYWdlX2NvZGU6NjsKKyNlbHNlCisJdTMyICAgICAgICBwYWdlX2NvZGU6NjsKKwl1MzIgICAgICAgIHJlc2VydmVkMToxOworCXUzMiAgICAgICAgcHM6MTsKKyNlbmRpZgorCXUzMiAgICAgICAgcGFnZV9sZW46ODsKKwl1MzIgICAgICAgIHRyYWNrc19wZXJfem9uZToxNjsKKworCXUzMiAgICAgICAgYV9zZWNfcGVyX3pvbmU6MTY7CisJdTMyICAgICAgICBhX3RyYWNrc19wZXJfem9uZToxNjsKKworCXUzMiAgICAgICAgYV90cmFja3NfcGVyX2x1bjoxNjsJLyogYWx0ZXJuYXRlIHRyYWNrcy9sdW4tTVNCICovCisJdTMyICAgICAgICBzZWNfcGVyX3RyYWNrOjE2OwkvKiBzZWN0b3JzL3RyYWNrLU1TQiAqLworCisJdTMyICAgICAgICBieXRlc19wZXJfc2VjdG9yOjE2OworCXUzMiAgICAgICAgaW50ZXJsZWF2ZToxNjsKKworCXUzMiAgICAgICAgdHNmOjE2OwkJCS8qIHRyYWNrIHNrZXcgZmFjdG9yLU1TQiAqLworCXUzMiAgICAgICAgY3NmOjE2OwkJCS8qIGN5bGluZGVyIHNrZXcgZmFjdG9yLU1TQiAqLworCisjaWZkZWYgX19CSUdFTkRJQU4KKwl1MzIgICAgICAgIHNzZWM6MTsJLyogc29mdCBzZWN0b3IgZm9ybWF0dGluZyAqLworCXUzMiAgICAgICAgaHNlYzoxOwkvKiBoYXJkIHNlY3RvciBmb3JtYXR0aW5nICovCisJdTMyICAgICAgICBybWI6MTsJLyogcmVtb3ZhYmxlIG1lZGlhICovCisJdTMyICAgICAgICBzdXJmOjE7CS8qIHN1cmZhY2UgKi8KKwl1MzIgICAgICAgIHJlc2VydmVkMjo0OworI2Vsc2UKKwl1MzIgICAgICAgIHJlc2VydmVkMjo0OworCXUzMiAgICAgICAgc3VyZjoxOwkvKiBzdXJmYWNlICovCisJdTMyICAgICAgICBybWI6MTsJLyogcmVtb3ZhYmxlIG1lZGlhICovCisJdTMyICAgICAgICBoc2VjOjE7CS8qIGhhcmQgc2VjdG9yIGZvcm1hdHRpbmcgKi8KKwl1MzIgICAgICAgIHNzZWM6MTsJLyogc29mdCBzZWN0b3IgZm9ybWF0dGluZyAqLworI2VuZGlmCisJdTMyICAgICAgICByZXNlcnZlZDM6MjQ7Cit9OworCisvKgorICogU0NTSSByaWdpZCBkaXNrIGRldmljZSBnZW9tZXRyeSBwYWdlCisgKi8KK3N0cnVjdCBzY3NpX21wX3JpZ2lkX2RldmljZV9nZW9tZXRyeV9zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTMyICAgICAgICBwczoxOworCXUzMiAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTMyICAgICAgICBwYWdlX2NvZGU6NjsKKyNlbHNlCisJdTMyICAgICAgICBwYWdlX2NvZGU6NjsKKwl1MzIgICAgICAgIHJlc2VydmVkMToxOworCXUzMiAgICAgICAgcHM6MTsKKyNlbmRpZgorCXUzMiAgICAgICAgcGFnZV9sZW46ODsKKwl1MzIgICAgICAgIG51bV9jeWxpbmRlcnMwOjg7CisJdTMyICAgICAgICBudW1fY3lsaW5kZXJzMTo4OworCisJdTMyICAgICAgICBudW1fY3lsaW5kZXJzMjo4OworCXUzMiAgICAgICAgbnVtX2hlYWRzOjg7CisJdTMyICAgICAgICBzY3dwMDo4OworCXUzMiAgICAgICAgc2N3cDE6ODsKKworCXUzMiAgICAgICAgc2N3cDI6ODsKKwl1MzIgICAgICAgIHNjcndjMDo4OworCXUzMiAgICAgICAgc2Nyd2MxOjg7CisJdTMyICAgICAgICBzY3J3YzI6ODsKKworCXUzMiAgICAgICAgZHNyOjE2OworCXUzMiAgICAgICAgbHNjeWwwOjg7CisJdTMyICAgICAgICBsc2N5bDE6ODsKKworCXUzMiAgICAgICAgbHNjeWwyOjg7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1MzIgICAgICAgIHJlc2VydmVkMjo2OworCXUzMiAgICAgICAgcnBsOjI7CS8qIHJvdGF0aW9uYWwgcG9zaXRpb24gbG9ja2luZyAqLworI2Vsc2UKKwl1MzIgICAgICAgIHJwbDoyOwkvKiByb3RhdGlvbmFsIHBvc2l0aW9uIGxvY2tpbmcgKi8KKwl1MzIgICAgICAgIHJlc2VydmVkMjo2OworI2VuZGlmCisJdTMyICAgICAgICByb3Rfb2ZmOjg7CisJdTMyICAgICAgICByZXNlcnZlZDM6ODsKKworCXUzMiAgICAgICAgbWVkX3JvdF9yYXRlOjE2OworCXUzMiAgICAgICAgcmVzZXJ2ZWQ0OjE2OworfTsKKworLyoKKyAqIFNDU0kgY2FjaGluZyBtb2RlIHBhZ2UKKyAqLworc3RydWN0IHNjc2lfbXBfY2FjaGluZ19zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICBwczoxOworCXU4ICAgICAgICAgcmVzMToxOworCXU4ICAgICAgICAgcGFnZV9jb2RlOjY7CisjZWxzZQorCXU4ICAgICAgICAgcGFnZV9jb2RlOjY7CisJdTggICAgICAgICByZXMxOjE7CisJdTggICAgICAgICBwczoxOworI2VuZGlmCisJdTggICAgICAgICBwYWdlX2xlbjsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgaWM6MTsJLyogaW5pdGlhdG9yIGNvbnRyb2wgKi8KKwl1OCAgICAgICAgIGFicGY6MTsJLyogYWJvcnQgcHJlLWZldGNoICovCisJdTggICAgICAgICBjYXA6MTsJLyogY2FjaGluZyBhbmFseXNpcyBwZXJtaXR0ZWQgKi8KKwl1OCAgICAgICAgIGRpc2M6MTsJLyogZGlzY29udGludWl0eSAqLworCXU4ICAgICAgICAgc2l6ZToxOwkvKiBzaXplIGVuYWJsZSAqLworCXU4ICAgICAgICAgd2NlOjE7CS8qIHdyaXRlIGNhY2hlIGVuYWJsZSAqLworCXU4ICAgICAgICAgbWY6MTsJLyogbXVsdGlwbGljYXRpb24gZmFjdG9yICovCisJdTggICAgICAgICByY2Q6MTsJLyogcmVhZCBjYWNoZSBkaXNhYmxlICovCisKKwl1OCAgICAgICAgIGRycnA6NDsJLyogZGVtYW5kIHJlYWQgcmV0ZW50aW9uIHByaW9yaXR5ICovCisJdTggICAgICAgICB3cnA6NDsJLyogd3JpdGUgcmV0ZW50aW9uIHByaW9yaXR5ICovCisjZWxzZQorCXU4ICAgICAgICAgcmNkOjE7CS8qIHJlYWQgY2FjaGUgZGlzYWJsZSAqLworCXU4ICAgICAgICAgbWY6MTsJLyogbXVsdGlwbGljYXRpb24gZmFjdG9yICovCisJdTggICAgICAgICB3Y2U6MTsJLyogd3JpdGUgY2FjaGUgZW5hYmxlICovCisJdTggICAgICAgICBzaXplOjE7CS8qIHNpemUgZW5hYmxlICovCisJdTggICAgICAgICBkaXNjOjE7CS8qIGRpc2NvbnRpbnVpdHkgKi8KKwl1OCAgICAgICAgIGNhcDoxOwkvKiBjYWNoaW5nIGFuYWx5c2lzIHBlcm1pdHRlZCAqLworCXU4ICAgICAgICAgYWJwZjoxOwkvKiBhYm9ydCBwcmUtZmV0Y2ggKi8KKwl1OCAgICAgICAgIGljOjE7CS8qIGluaXRpYXRvciBjb250cm9sICovCisKKwl1OCAgICAgICAgIHdycDo0OwkvKiB3cml0ZSByZXRlbnRpb24gcHJpb3JpdHkgKi8KKwl1OCAgICAgICAgIGRycnA6NDsJLyogZGVtYW5kIHJlYWQgcmV0ZW50aW9uIHByaW9yaXR5ICovCisjZW5kaWYKKwl1OCAgICAgICAgIGRwdGxbMl07LyogZGlzYWJsZSBwcmUtZmV0Y2ggdHJhbnNmZXIgbGVuZ3RoICovCisJdTggICAgICAgICBtaW5fcHJlZmV0Y2hbMl07CisJdTggICAgICAgICBtYXhfcHJlZmV0Y2hbMl07CisJdTggICAgICAgICBtYXhfcHJlZmV0Y2hfbGltaXRbMl07CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIGZzdzoxOwkvKiBmb3JjZSBzZXF1ZW50aWFsIHdyaXRlICovCisJdTggICAgICAgICBsYmNzczoxOy8qIGxvZ2ljYWwgYmxvY2sgY2FjaGUgc2VnbWVudCBzaXplICovCisJdTggICAgICAgICBkcmE6MTsJLyogZGlzYWJsZSByZWFkIGFoZWFkICovCisJdTggICAgICAgICB2czoyOwkvKiB2ZW5kb3Igc3BlY2lmaWMgKi8KKwl1OCAgICAgICAgIHJlczI6MzsKKyNlbHNlCisJdTggICAgICAgICByZXMyOjM7CisJdTggICAgICAgICB2czoyOwkvKiB2ZW5kb3Igc3BlY2lmaWMgKi8KKwl1OCAgICAgICAgIGRyYToxOwkvKiBkaXNhYmxlIHJlYWQgYWhlYWQgKi8KKwl1OCAgICAgICAgIGxiY3NzOjE7LyogbG9naWNhbCBibG9jayBjYWNoZSBzZWdtZW50IHNpemUgKi8KKwl1OCAgICAgICAgIGZzdzoxOwkvKiBmb3JjZSBzZXF1ZW50aWFsIHdyaXRlICovCisjZW5kaWYKKwl1OCAgICAgICAgIG51bV9jYWNoZV9zZWdzOworCisJdTggICAgICAgICBjYWNoZV9zZWdfc2l6ZVsyXTsKKwl1OCAgICAgICAgIHJlczM7CisJdTggICAgICAgICBub25fY2FjaGVfc2VnX3NpemVbM107Cit9OworCisvKgorICogU0NTSSBjb250cm9sIG1vZGUgcGFnZQorICovCitzdHJ1Y3Qgc2NzaV9tcF9jb250cm9sX3BhZ2Vfc3sKKyNpZmRlZiBfX0JJR0VORElBTgordTggICAgICAgICBwczoxOwordTggICAgICAgICByZXNlcnZlZDE6MTsKK3U4ICAgICAgICAgcGFnZV9jb2RlOjY7CisjZWxzZQordTggICAgICAgICBwYWdlX2NvZGU6NjsKK3U4ICAgICAgICAgcmVzZXJ2ZWQxOjE7Cit1OCAgICAgICAgIHBzOjE7CisjZW5kaWYKKwl1OCAgICAgICAgIHBhZ2VfbGVuOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICB0c3Q6MzsJCS8qIHRhc2sgc2V0IHR5cGUgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMzozOworCXU4ICAgICAgICAgZ2x0c2Q6MTsJLyogZ2xvYmFsIGxvZ2dpbmcgdGFyZ2V0IHNhdmUgZGlzYWJsZSAqLworCXU4ICAgICAgICAgcmxlYzoxOwkJLyogcmVwb3J0IGxvZyBleGNlcHRpb24gY29uZGl0aW9uICovCisKKwl1OCAgICAgICAgIHFhbGdvX21vZDo0OwkvKiBxdWV1ZSBhbG9nb3JpdGhtIG1vZGlmaWVyICovCisJdTggICAgICAgICByZXNlcnZlZDQ6MTsKKwl1OCAgICAgICAgIHFlcnI6MjsJCS8qIHF1ZXVlIGVycm9yIG1hbmFnZW1lbnQgKi8KKwl1OCAgICAgICAgIGRxdWU6MTsJCS8qIGRpc2FibGUgcXVldWluZyAqLworCisJdTggICAgICAgICByZXNlcnZlZDU6MTsKKwl1OCAgICAgICAgIHJhYzoxOwkJLyogcmVwb3J0IGEgY2hlY2sgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkNjoyOworCXU4ICAgICAgICAgc3dwOjE7CQkvKiBzb2Z0d2FyZSB3cml0ZSBwcm90ZWN0ICovCisJdTggICAgICAgICByYWVycDoxOwkvKiByZWFkeSBBRVIgcGVybWlzc2lvbiAqLworCXU4ICAgICAgICAgdWFhZXJwOjE7CS8qIHVuaXQgYXR0ZW5zdGlvbiBBRVIgcGVybWlzc2lvbiAqLworCXU4ICAgICAgICAgZWFlcnA6MTsJLyogZXJyb3IgQUVSIHBlcm1pc3Npb24gKi8KKworCXU4ICAgICAgICAgcmVzZXJ2ZWQ3OjU7CisJdTggICAgICAgICBhdXRvbG9hZF9tb2Q6MzsKKyNlbHNlCisJdTggICAgICAgICBybGVjOjE7CQkvKiByZXBvcnQgbG9nIGV4Y2VwdGlvbiBjb25kaXRpb24gKi8KKwl1OCAgICAgICAgIGdsdHNkOjE7CS8qIGdsb2JhbCBsb2dnaW5nIHRhcmdldCBzYXZlIGRpc2FibGUgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMzozOworCXU4ICAgICAgICAgdHN0OjM7CQkvKiB0YXNrIHNldCB0eXBlICovCisKKwl1OCAgICAgICAgIGRxdWU6MTsJCS8qIGRpc2FibGUgcXVldWluZyAqLworCXU4ICAgICAgICAgcWVycjoyOwkJLyogcXVldWUgZXJyb3IgbWFuYWdlbWVudCAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQ0OjE7CisJdTggICAgICAgICBxYWxnb19tb2Q6NDsJLyogcXVldWUgYWxvZ29yaXRobSBtb2RpZmllciAqLworCisJdTggICAgICAgICBlYWVycDoxOwkvKiBlcnJvciBBRVIgcGVybWlzc2lvbiAqLworCXU4ICAgICAgICAgdWFhZXJwOjE7CS8qIHVuaXQgYXR0ZW5zdGlvbiBBRVIgcGVybWlzc2lvbiAqLworCXU4ICAgICAgICAgcmFlcnA6MTsJLyogcmVhZHkgQUVSIHBlcm1pc3Npb24gKi8KKwl1OCAgICAgICAgIHN3cDoxOwkJLyogc29mdHdhcmUgd3JpdGUgcHJvdGVjdCAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQ2OjI7CisJdTggICAgICAgICByYWM6MTsJCS8qIHJlcG9ydCBhIGNoZWNrICovCisJdTggICAgICAgICByZXNlcnZlZDU6MTsKKworCXU4ICAgICAgICAgYXV0b2xvYWRfbW9kOjM7CisJdTggICAgICAgICByZXNlcnZlZDc6NTsKKyNlbmRpZgorCXU4ICAgICAgICAgcmFocF9tc2I7CS8qIHJlYWR5IEFFUiBob2xkb2ZmIHBlcmlvZCAtIE1TQiAqLworCXU4ICAgICAgICAgcmFocF9sc2I7CS8qIHJlYWR5IEFFUiBob2xkb2ZmIHBlcmlvZCAtIExTQiAqLworCisJdTggICAgICAgICBidXN5X3RpbWVvdXRfcGVyaW9kX21zYjsKKwl1OCAgICAgICAgIGJ1c3lfdGltZW91dF9wZXJpb2RfbHNiOworCisJdTggICAgICAgICBleHRfc2VsZnRlc3RfY29tcGxfdGltZV9tc2I7CisJdTggICAgICAgICBleHRfc2VsZnRlc3RfY29tcGxfdGltZV9sc2I7Cit9OworCisvKgorICogU0NTSSBtZWRpdW0gdHlwZXMgc3VwcG9ydGVkIG1vZGUgcGFnZQorICovCitzdHJ1Y3Qgc2NzaV9tcF9tZWRpdW1fdHlwZXNfc3VwX3N7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHBzOjE7CisJdTggICAgICAgICByZXNlcnZlZDE6MTsKKwl1OCAgICAgICAgIHBhZ2VfY29kZTo2OworI2Vsc2UKKwl1OCAgICAgICAgIHBhZ2VfY29kZTo2OworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTggICAgICAgICBwczoxOworI2VuZGlmCisJdTggICAgICAgICBwYWdlX2xlbjsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWQzWzJdOworCXU4ICAgICAgICAgbWVkX3R5cGUxX3N1cDsJLyogbWVkaXVtIHR5cGUgb25lIHN1cHBvcnRlZCAqLworCXU4ICAgICAgICAgbWVkX3R5cGUyX3N1cDsJLyogbWVkaXVtIHR5cGUgdHdvIHN1cHBvcnRlZCAqLworCXU4ICAgICAgICAgbWVkX3R5cGUzX3N1cDsJLyogbWVkaXVtIHR5cGUgdGhyZWUgc3VwcG9ydGVkICovCisJdTggICAgICAgICBtZWRfdHlwZTRfc3VwOwkvKiBtZWRpdW0gdHlwZSBmb3VyIHN1cHBvcnRlZCAqLworfTsKKworLyoKKyAqIFNDU0kgaW5mb3JtYXRpb25hbCBleGNlcHRpb24gY29udHJvbCBtb2RlIHBhZ2UKKyAqLworc3RydWN0IHNjc2lfbXBfaW5mb19leGNwdF9jbnRsX3N7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHBzOjE7CisJdTggICAgICAgICByZXNlcnZlZDE6MTsKKwl1OCAgICAgICAgIHBhZ2VfY29kZTo2OworI2Vsc2UKKwl1OCAgICAgICAgIHBhZ2VfY29kZTo2OworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTggICAgICAgICBwczoxOworI2VuZGlmCisJdTggICAgICAgICBwYWdlX2xlbjsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgcGVyZjoxOwkJLyogcGVyZm9ybWFuY2UgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMzoxOworCXU4ICAgICAgICAgZWJmOjE7CQkvKiBlbmFibGUgYmFja2dyb3VuZCBmdWNudGlvbiAqLworCXU4ICAgICAgICAgZXdhc2M6MTsJLyogZW5hYmxlIHdhcm5pbmcgKi8KKwl1OCAgICAgICAgIGRleGNwdDoxOwkvKiBkaXNhYmxlIGV4Y2VwdGlvbiBjb250cm9sICovCisJdTggICAgICAgICB0ZXN0OjE7CQkvKiBlbmFibGUgdGVzdCBkZXZpY2UgZmFpbHVyZQorCQkJCQkgKiBub3RpZmljYXRpb24KKwkJCQkJICovCisJdTggICAgICAgICByZXNlcnZlZDQ6MTsKKwl1OCAgICAgICAgIGxvZ19lcnJvcjoxOworCisJdTggICAgICAgICByZXNlcnZlZDU6NDsKKwl1OCAgICAgICAgIG1yaWU6NDsJCS8qIG1ldGhvZCBvZiByZXBvcnRpbmcgaW5mbworCQkJCQkgKiBleGNlcHRpb25zCisJCQkJCSAqLworI2Vsc2UKKwl1OCAgICAgICAgIGxvZ19lcnJvcjoxOworCXU4ICAgICAgICAgcmVzZXJ2ZWQ0OjE7CisJdTggICAgICAgICB0ZXN0OjE7CQkvKiBlbmFibGUgdGVzdCBkZXZpY2UgZmFpbHVyZQorCQkJCQkgKiBub3RpZmljYXRpb24KKwkJCQkJICovCisJdTggICAgICAgICBkZXhjcHQ6MTsJLyogZGlzYWJsZSBleGNlcHRpb24gY29udHJvbCAqLworCXU4ICAgICAgICAgZXdhc2M6MTsJLyogZW5hYmxlIHdhcm5pbmcgKi8KKwl1OCAgICAgICAgIGViZjoxOwkJLyogZW5hYmxlIGJhY2tncm91bmQgZnVjbnRpb24gKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMzoxOworCXU4ICAgICAgICAgcGVyZjoxOwkJLyogcGVyZm9ybWFuY2UgKi8KKworCXU4ICAgICAgICAgbXJpZTo0OwkJLyogbWV0aG9kIG9mIHJlcG9ydGluZyBpbmZvCisJCQkJCSAqIGV4Y2VwdGlvbnMKKwkJCQkJICovCisJdTggICAgICAgICByZXNlcnZlZDU6NDsKKyNlbmRpZgorCXU4ICAgICAgICAgaW50ZXJ2YWxfdGltZXJfbXNiOworCXU4ICAgICAgICAgaW50ZXJ2YWxfdGltZXJfbHNiOworCisJdTggICAgICAgICByZXBvcnRfY291bnRfbXNiOworCXU4ICAgICAgICAgcmVwb3J0X2NvdW50X2xzYjsKK307CisKKy8qCisgKiBNZXRob2RzIG9mIHJlcG9ydGluZyBpbmZvcm1hdGlvbmFsIGV4Y2VwdGlvbnMKKyAqLworI2RlZmluZSBTQ1NJX01QX0lFQ19OT19SRVBPUlQgICAgICAgMHgwCS8qIG5vIHJlcG9ydGluZyBvZiBleGNlcHRpb25zICovCisjZGVmaW5lIFNDU0lfTVBfSUVDX0FFUiAgICAgICAgICAgICAweDEJLyogYXN5bmMgZXZlbnQgcmVwb3J0aW5nICovCisjZGVmaW5lIFNDU0lfTVBfSUVDX1VOSVRfQVRUTiAgICAgICAweDIJLyogZ2VuZXJhdGUgdW5pdCBhdHRlbnN0aW9uICovCisjZGVmaW5lIFNDU0lfTU9fSUVDX0NPTkRfUkVDX0VSUiAgICAweDMJLyogY29uZGl0aW9uYWxseSBnZW5lcmF0ZSByZWNvdmVyZWQKKwkJCQkJICogZXJyb3IKKwkJCQkJICovCisjZGVmaW5lIFNDU0lfTVBfSUVDX1VOQ09ORF9SRUNfRVJSICAweDQJLyogdW5jb25kaXRpb25hbGx5IGdlbmVyYXRlIHJlY292ZXJlZAorCQkJCQkgKiBlcnJvcgorCQkJCQkgKi8KKyNkZWZpbmUgU0NTSV9NUF9JRUNfTk9fU0VOU0UgICAgICAgIDB4NQkvKiBnZW5lcmF0ZSBubyBzZW5zZSAqLworI2RlZmluZSBTQ1NJX01QX0lFQ19PTl9SRVFVRVNUICAgICAgMHg2CS8qIG9ubHkgcmVwb3J0IGV4Y2VwdGlvbnMgb24gcmVxdWVzdCAqLworCisvKgorICogU0NTSSBmbGV4aWJsZSBkaXNrIHBhZ2UKKyAqLworc3RydWN0IHNjc2lfbXBfZmxleGlibGVfZGlza19zeworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICBwczoxOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjE7CisJdTggICAgICAgICBwYWdlX2NvZGU6NjsKKyNlbHNlCisJdTggICAgICAgICBwYWdlX2NvZGU6NjsKKwl1OCAgICAgICAgIHJlc2VydmVkMToxOworCXU4ICAgICAgICAgcHM6MTsKKyNlbmRpZgorCXU4ICAgICAgICAgcGFnZV9sZW47CisKKwl1OCAgICAgICAgIHRyYW5zZmVyX3JhdGVfbXNiOworCXU4ICAgICAgICAgdHJhbnNmZXJfcmF0ZV9sc2I7CisKKwl1OCAgICAgICAgIG51bV9oZWFkczsKKwl1OCAgICAgICAgIG51bV9zZWN0b3JzOworCisJdTggICAgICAgICBieXRlc19wZXJfc2VjdG9yX21zYjsKKwl1OCAgICAgICAgIGJ5dGVzX3Blcl9zZWN0b3JfbHNiOworCisJdTggICAgICAgICBudW1fY3lsaW5kZXJzX21zYjsKKwl1OCAgICAgICAgIG51bV9jeWxpbmRlcnNfbHNiOworCisJdTggICAgICAgICBzY193cGNfbXNiOwkvKiBzdGFydGluZyBjeWxpbmRlci13cml0ZQorCQkJCQkgKiBwcmVjb21wZW5zYXRpb24gbXNiCisJCQkJCSAqLworCXU4ICAgICAgICAgc2Nfd3BjX2xzYjsJLyogc3RhcnRpbmcgY3lsaW5kZXItd3JpdGUKKwkJCQkJICogcHJlY29tcGVuc2F0aW9uIGxzYgorCQkJCQkgKi8KKwl1OCAgICAgICAgIHNjX3J3Y19tc2I7CS8qIHN0YXJ0aW5nIGN5bGluZGVyLXJlZHVjZWQgd3JpdGUKKwkJCQkJICogY3VycmVudCBtc2IKKwkJCQkJICovCisJdTggICAgICAgICBzY19yd2NfbHNiOwkvKiBzdGFydGluZyBjeWxpbmRlci1yZWR1Y2VkIHdyaXRlCisJCQkJCSAqIGN1cnJlbnQgbHNiCisJCQkJCSAqLworCisJdTggICAgICAgICBkZXZfc3RlcF9yYXRlX21zYjsKKwl1OCAgICAgICAgIGRldl9zdGVwX3JhdGVfbHNiOworCisJdTggICAgICAgICBkZXZfc3RlcF9wdWxzZV93aWR0aDsKKworCXU4ICAgICAgICAgaGVhZF9zZF9tc2I7CS8qIGhlYWQgc2V0dGxlIGRlbGF5IG1zYiAqLworCXU4ICAgICAgICAgaGVhZF9zZF9sc2I7CS8qIGhlYWQgc2V0dGxlIGRlbGF5IGxzYiAqLworCisJdTggICAgICAgICBtb3Rvcl9vbl9kZWxheTsKKwl1OCAgICAgICAgIG1vdG9yX29mZl9kZWxheTsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgdHJkeToxOwkJLyogdHJ1ZSByZWFkeSBiaXQgKi8KKwl1OCAgICAgICAgIHNzbjoxOwkJLyogc3RhcnQgc2VjdG9yIG51bWJlciBiaXQgKi8KKwl1OCAgICAgICAgIG1vOjE7CQkvKiBtb3RvciBvbiBiaXQgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkMzo1OworCisJdTggICAgICAgICByZXNlcnZlZDQ6NDsKKwl1OCAgICAgICAgIHNwYzo0OwkJLyogc3RlcCBwdWxzZSBwZXIgY3lsaW5kZXIgKi8KKyNlbHNlCisJdTggICAgICAgICByZXNlcnZlZDM6NTsKKwl1OCAgICAgICAgIG1vOjE7CQkvKiBtb3RvciBvbiBiaXQgKi8KKwl1OCAgICAgICAgIHNzbjoxOwkJLyogc3RhcnQgc2VjdG9yIG51bWJlciBiaXQgKi8KKwl1OCAgICAgICAgIHRyZHk6MTsJCS8qIHRydWUgcmVhZHkgYml0ICovCisKKwl1OCAgICAgICAgIHNwYzo0OwkJLyogc3RlcCBwdWxzZSBwZXIgY3lsaW5kZXIgKi8KKwl1OCAgICAgICAgIHJlc2VydmVkNDo0OworI2VuZGlmCisJdTggICAgICAgICB3cml0ZV9jb21wOworCXU4ICAgICAgICAgaGVhZF9sb2FkX2RlbGF5OworCXU4ICAgICAgICAgaGVhZF91bmxvYWRfZGVsYXk7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHBpbjM0OjQ7CS8qIHBpbjM0IHVzYWdlICovCisJdTggICAgICAgICBwaW4yOjQ7CQkvKiBwaW4yIHVzYWdlICovCisKKwl1OCAgICAgICAgIHBpbjQ6NDsJCS8qIHBpbjQgdXNhZ2UgKi8KKwl1OCAgICAgICAgIHBpbjE6NDsJCS8qIHBpbjEgdXNhZ2UgKi8KKyNlbHNlCisJdTggICAgICAgICBwaW4yOjQ7CQkvKiBwaW4yIHVzYWdlICovCisJdTggICAgICAgICBwaW4zNDo0OwkvKiBwaW4zNCB1c2FnZSAqLworCisJdTggICAgICAgICBwaW4xOjQ7CQkvKiBwaW4xIHVzYWdlICovCisJdTggICAgICAgICBwaW40OjQ7CQkvKiBwaW40IHVzYWdlICovCisjZW5kaWYKKwl1OCAgICAgICAgIG1lZF9yb3RfcmF0ZV9tc2I7CisJdTggICAgICAgICBtZWRfcm90X3JhdGVfbHNiOworCisJdTggICAgICAgICByZXNlcnZlZDVbMl07Cit9OworCitzdHJ1Y3Qgc2NzaV9tb2RlX3BhZ2VfZm9ybWF0X2RhdGE2X3N7CisJc3RydWN0IHNjc2lfbW9kZV9wYXJhbV9oZWFkZXI2X3MgbXBoOwkvKiBtb2RlIHBhZ2UgaGVhZGVyICovCisJc3RydWN0IHNjc2lfbW9kZV9wYXJhbV9kZXNjX3MgZGVzYzsJLyogYmxvY2sgZGVzY3JpcHRvciAqLworCXN0cnVjdCBzY3NpX21wX2Zvcm1hdF9kZXZpY2VfcyBmb3JtYXQ7CS8qIGZvcm1hdCBkZXZpY2UgZGF0YSAqLworfTsKKworc3RydWN0IHNjc2lfbW9kZV9wYWdlX2Zvcm1hdF9kYXRhMTBfc3sKKwlzdHJ1Y3Qgc2NzaV9tb2RlX3BhcmFtX2hlYWRlcjEwX3MgbXBoOwkvKiBtb2RlIHBhZ2UgaGVhZGVyICovCisJc3RydWN0IHNjc2lfbW9kZV9wYXJhbV9kZXNjX3MgZGVzYzsJLyogYmxvY2sgZGVzY3JpcHRvciAqLworCXN0cnVjdCBzY3NpX21wX2Zvcm1hdF9kZXZpY2VfcyBmb3JtYXQ7CS8qIGZvcm1hdCBkZXZpY2UgZGF0YSAqLworfTsKKworc3RydWN0IHNjc2lfbW9kZV9wYWdlX3JkZ19kYXRhNl9zeworCXN0cnVjdCBzY3NpX21vZGVfcGFyYW1faGVhZGVyNl9zIG1waDsJLyogbW9kZSBwYWdlIGhlYWRlciAqLworCXN0cnVjdCBzY3NpX21vZGVfcGFyYW1fZGVzY19zIGRlc2M7CS8qIGJsb2NrIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3Qgc2NzaV9tcF9yaWdpZF9kZXZpY2VfZ2VvbWV0cnlfcyByZGc7CisJCQkJCS8qIHJpZ2lkIGdlb21ldHJ5IGRhdGEgKi8KK307CisKK3N0cnVjdCBzY3NpX21vZGVfcGFnZV9yZGdfZGF0YTEwX3N7CisJc3RydWN0IHNjc2lfbW9kZV9wYXJhbV9oZWFkZXIxMF9zIG1waDsJLyogbW9kZSBwYWdlIGhlYWRlciAqLworCXN0cnVjdCBzY3NpX21vZGVfcGFyYW1fZGVzY19zIGRlc2M7CS8qIGJsb2NrIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3Qgc2NzaV9tcF9yaWdpZF9kZXZpY2VfZ2VvbWV0cnlfcyByZGc7CisJCQkJCS8qIHJpZ2lkIGdlb21ldHJ5IGRhdGEgKi8KK307CisKK3N0cnVjdCBzY3NpX21vZGVfcGFnZV9jYWNoZTZfc3sKKwlzdHJ1Y3Qgc2NzaV9tb2RlX3BhcmFtX2hlYWRlcjZfcyBtcGg7CS8qIG1vZGUgcGFnZSBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc2NzaV9tb2RlX3BhcmFtX2Rlc2NfcyBkZXNjOwkvKiBibG9jayBkZXNjcmlwdG9yICovCisJc3RydWN0IHNjc2lfbXBfY2FjaGluZ19zIGNhY2hlOwkvKiBjYWNoZSBwYWdlIGRhdGEgKi8KK307CisKK3N0cnVjdCBzY3NpX21vZGVfcGFnZV9jYWNoZTEwX3N7CisJc3RydWN0IHNjc2lfbW9kZV9wYXJhbV9oZWFkZXIxMF9zIG1waDsJLyogbW9kZSBwYWdlIGhlYWRlciAqLworCXN0cnVjdCBzY3NpX21vZGVfcGFyYW1fZGVzY19zIGRlc2M7CS8qIGJsb2NrIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3Qgc2NzaV9tcF9jYWNoaW5nX3MgY2FjaGU7CS8qIGNhY2hlIHBhZ2UgZGF0YSAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZvcm1hdCBVbml0IGNvbW1hbmQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBGb3JtYXQgVW5pdCBDREIKKyAqLworc3RydWN0IHNjc2lfZm9ybWF0X3VuaXRfc3sKKwl1OCAgICAgICAgIG9wY29kZTsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgcmVzMTozOworCXU4ICAgICAgICAgZm10ZGF0YToxOwkvKiBpZiBzZXQsIGRhdGEgb3V0IHBoYXNlIGhhcyBmb3JtYXQKKwkJCQkJICogZGF0YQorCQkJCQkgKi8KKwl1OCAgICAgICAgIGNtcGxzdDoxOwkvKiBpZiBzZXQsIGRlZmVjdCBsaXN0IGlzIGNvbXBsZXRlICovCisJdTggICAgICAgICBkZWZfbGlzdDozOwkvKiBmb3JtYXQgb2YgZGVmZWN0IGRlc2NyaXB0b3IgaXMKKwkJCQkJICogZm10ZGF0YSA9MQorCQkJCQkgKi8KKyNlbHNlCisJdTggICAgICAgICBkZWZfbGlzdDozOwkvKiBmb3JtYXQgb2YgZGVmZWN0IGRlc2NyaXB0b3IgaXMKKwkJCQkJICogZm10ZGF0YSA9IDEKKwkJCQkJICovCisJdTggICAgICAgICBjbXBsc3Q6MTsJLyogaWYgc2V0LCBkZWZlY3QgbGlzdCBpcyBjb21wbGV0ZSAqLworCXU4ICAgICAgICAgZm10ZGF0YToxOwkvKiBpZiBzZXQsIGRhdGEgb3V0IHBoYXNlIGhhcyBmb3JtYXQKKwkJCQkJICogZGF0YQorCQkJCQkgKi8KKwl1OCAgICAgICAgIHJlczE6MzsKKyNlbmRpZgorCXU4ICAgICAgICAgaW50ZXJsZWF2ZV9tc2I7CisJdTggICAgICAgICBpbnRlcmxlYXZlX2xzYjsKKwl1OCAgICAgICAgIHZlbmRvcl9zcGVjOworCXU4ICAgICAgICAgY29udHJvbDsKK307CisKKy8qCisgKiBoCisgKi8KK3N0cnVjdCBzY3NpX3Jlc2VydmU2X3N7CisJdTggICAgICAgICBvcGNvZGU7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHJlc2VydmVkOjM7CisJdTggICAgICAgICBvYnNvbGV0ZTo0OworCXU4ICAgICAgICAgZXh0ZW50OjE7CisjZWxzZQorCXU4ICAgICAgICAgZXh0ZW50OjE7CisJdTggICAgICAgICBvYnNvbGV0ZTo0OworCXU4ICAgICAgICAgcmVzZXJ2ZWQ6MzsKKyNlbmRpZgorCXU4ICAgICAgICAgcmVzZXJ2YXRpb25faWQ7CisJdTE2ICAgICAgICBwYXJhbV9saXN0X2xlbjsKKwl1OCAgICAgICAgIGNvbnRyb2w7Cit9OworCisvKgorICogaAorICovCitzdHJ1Y3Qgc2NzaV9yZWxlYXNlNl9zeworCXU4ICAgICAgICAgb3Bjb2RlOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICByZXNlcnZlZDE6MzsKKwl1OCAgICAgICAgIG9ic29sZXRlOjQ7CisJdTggICAgICAgICBleHRlbnQ6MTsKKyNlbHNlCisJdTggICAgICAgICBleHRlbnQ6MTsKKwl1OCAgICAgICAgIG9ic29sZXRlOjQ7CisJdTggICAgICAgICByZXNlcnZlZDE6MzsKKyNlbmRpZgorCXU4ICAgICAgICAgcmVzZXJ2YXRpb25faWQ7CisJdTE2ICAgICAgICByZXNlcnZlZDI7CisJdTggICAgICAgICBjb250cm9sOworfTsKKworLyoKKyAqIGgKKyAqLworc3RydWN0IHNjc2lfcmVzZXJ2ZTEwX3N7CisJdTggICAgICAgICBvcGNvZGU7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHJlc2VydmVkMTozOworCXU4ICAgICAgICAgdGhpcmRfcGFydHk6MTsKKwl1OCAgICAgICAgIHJlc2VydmVkMjoyOworCXU4ICAgICAgICAgbG9uZ19pZDoxOworCXU4ICAgICAgICAgZXh0ZW50OjE7CisjZWxzZQorCXU4ICAgICAgICAgZXh0ZW50OjE7CisJdTggICAgICAgICBsb25nX2lkOjE7CisJdTggICAgICAgICByZXNlcnZlZDI6MjsKKwl1OCAgICAgICAgIHRoaXJkX3BhcnR5OjE7CisJdTggICAgICAgICByZXNlcnZlZDE6MzsKKyNlbmRpZgorCXU4ICAgICAgICAgcmVzZXJ2YXRpb25faWQ7CisJdTggICAgICAgICB0aGlyZF9wdHlfZGV2X2lkOworCXU4ICAgICAgICAgcmVzZXJ2ZWQzOworCXU4ICAgICAgICAgcmVzZXJ2ZWQ0OworCXU4ICAgICAgICAgcmVzZXJ2ZWQ1OworCXUxNiAgICAgICAgcGFyYW1fbGlzdF9sZW47CisJdTggICAgICAgICBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfcmVsZWFzZTEwX3N7CisJdTggICAgICAgICBvcGNvZGU7CisjaWZkZWYgX19CSUdFTkRJQU4KKwl1OCAgICAgICAgIHJlc2VydmVkMTozOworCXU4ICAgICAgICAgdGhpcmRfcGFydHk6MTsKKwl1OCAgICAgICAgIHJlc2VydmVkMjoyOworCXU4ICAgICAgICAgbG9uZ19pZDoxOworCXU4ICAgICAgICAgZXh0ZW50OjE7CisjZWxzZQorCXU4ICAgICAgICAgZXh0ZW50OjE7CisJdTggICAgICAgICBsb25nX2lkOjE7CisJdTggICAgICAgICByZXNlcnZlZDI6MjsKKwl1OCAgICAgICAgIHRoaXJkX3BhcnR5OjE7CisJdTggICAgICAgICByZXNlcnZlZDE6MzsKKyNlbmRpZgorCXU4ICAgICAgICAgcmVzZXJ2YXRpb25faWQ7CisJdTggICAgICAgICB0aGlyZF9wdHlfZGV2X2lkOworCXU4ICAgICAgICAgcmVzZXJ2ZWQzOworCXU4ICAgICAgICAgcmVzZXJ2ZWQ0OworCXU4ICAgICAgICAgcmVzZXJ2ZWQ1OworCXUxNiAgICAgICAgcGFyYW1fbGlzdF9sZW47CisJdTggICAgICAgICBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfdmVyaWZ5MTBfc3sKKwl1OCAgICAgICAgIG9wY29kZTsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgbHVuOjM7CisJdTggICAgICAgICBkcG86MTsKKwl1OCAgICAgICAgIHJlc2VydmVkOjI7CisJdTggICAgICAgICBieXRjaGs6MTsKKwl1OCAgICAgICAgIHJlbGFkZHI6MTsKKyNlbHNlCisJdTggICAgICAgICByZWxhZGRyOjE7CisJdTggICAgICAgICBieXRjaGs6MTsKKwl1OCAgICAgICAgIHJlc2VydmVkOjI7CisJdTggICAgICAgICBkcG86MTsKKwl1OCAgICAgICAgIGx1bjozOworI2VuZGlmCisJdTggICAgICAgICBsYmEwOworCXU4ICAgICAgICAgbGJhMTsKKwl1OCAgICAgICAgIGxiYTI7CisJdTggICAgICAgICBsYmEzOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOworCXU4ICAgICAgICAgdmVyaWZpY2F0aW9uX2xlbjA7CisJdTggICAgICAgICB2ZXJpZmljYXRpb25fbGVuMTsKKwl1OCAgICAgICAgIGNvbnRyb2xfYnl0ZTsKK307CisKK3N0cnVjdCBzY3NpX3JlcXVlc3Rfc2Vuc2Vfc3sKKwl1OCAgICAgICAgIG9wY29kZTsKKyNpZmRlZiBfX0JJR0VORElBTgorCXU4ICAgICAgICAgbHVuOjM7CisJdTggICAgICAgICByZXNlcnZlZDo1OworI2Vsc2UKKwl1OCAgICAgICAgIHJlc2VydmVkOjU7CisJdTggICAgICAgICBsdW46MzsKKyNlbmRpZgorCXU4ICAgICAgICAgcmVzZXJ2ZWQwOworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOworCXU4ICAgICAgICAgYWxsb2NfbGVuOworCXU4ICAgICAgICAgY29udHJvbF9ieXRlOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTQ1NJIHN0YXR1cyBieXRlIHZhbHVlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgU0NTSV9TVEFUVVNfR09PRCAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTiAgICAgICAgMHgwMgorI2RlZmluZSBTQ1NJX1NUQVRVU19DT05ESVRJT05fTUVUICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0NTSV9TVEFUVVNfQlVTWSAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFNDU0lfU1RBVFVTX0lOVEVSTUVESUFURSAgICAgICAgICAgMHgxMAorI2RlZmluZSBTQ1NJX1NUQVRVU19JQ00gICAgICAgICAgICAgICAgICAgIDB4MTQJLyogaW50ZXJtZWRpYXRlIGNvbmRpdGlvbiBtZXQgKi8KKyNkZWZpbmUgU0NTSV9TVEFUVVNfUkVTRVJWQVRJT05fQ09ORkxJQ1QgICAweDE4CisjZGVmaW5lIFNDU0lfU1RBVFVTX0NPTU1BTkRfVEVSTUlOQVRFRCAgICAgMHgyMgorI2RlZmluZSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMICAgICAgICAgICAgIDB4MjgKKyNkZWZpbmUgU0NTSV9TVEFUVVNfQUNBX0FDVElWRSAgICAgICAgICAgICAweDMwCisKKyNkZWZpbmUgU0NTSV9NQVhfQUxMT0NfTEVOCQkweEZGCS8qIG1heGltdW0gYWxsb2NhcmlvbiBsZW5ndGgKKwkJCQkJCSAqIGluIENEQnMKKwkJCQkJCSAqLworCisjZGVmaW5lIFNDU0lfT1BfV1JJVEVfVkVSSUZZMTAgICAgICAweDJFCisjZGVmaW5lIFNDU0lfT1BfV1JJVEVfVkVSSUZZMTIgICAgICAweEFFCisjZGVmaW5lIFNDU0lfT1BfVU5ERUYgICAgICAgICAgICAgICAweEZGCisKKy8qCisgKiBTQ1NJIFdSSVRFLVZFUklGWSgxMCkgY29tbWFuZAorICovCitzdHJ1Y3Qgc2NzaV93cml0ZV92ZXJpZnkxMF9zeworCXU4ICAgICAgICAgb3Bjb2RlOworI2lmZGVmIF9fQklHRU5ESUFOCisJdTggICAgICAgICByZXNlcnZlZDE6MzsKKwl1OCAgICAgICAgIGRwbzoxOwkJLyogRGlzYWJsZSBQYWdlIE91dCAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQyOjE7CisJdTggICAgICAgICBlYnA6MTsJCS8qIGVyc2UgYnktcGFzcyAqLworCXU4ICAgICAgICAgYnl0Y2hrOjE7CS8qIGJ5dGUgY2hlY2sgKi8KKwl1OCAgICAgICAgIHJlbF9hZHI6MTsJLyogcmVsYXRpdmUgYWRkcmVzcyAqLworI2Vsc2UKKwl1OCAgICAgICAgIHJlbF9hZHI6MTsJLyogcmVsYXRpdmUgYWRkcmVzcyAqLworCXU4ICAgICAgICAgYnl0Y2hrOjE7CS8qIGJ5dGUgY2hlY2sgKi8KKwl1OCAgICAgICAgIGVicDoxOwkJLyogZXJzZSBieS1wYXNzICovCisJdTggICAgICAgICByZXNlcnZlZDI6MTsKKwl1OCAgICAgICAgIGRwbzoxOwkJLyogRGlzYWJsZSBQYWdlIE91dCAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQxOjM7CisjZW5kaWYKKwl1OCAgICAgICAgIGxiYTA7CQkvKiBsb2dpY2FsIGJsb2NrIGFkZHJlc3MgLSBNU0IgKi8KKwl1OCAgICAgICAgIGxiYTE7CisJdTggICAgICAgICBsYmEyOworCXU4ICAgICAgICAgbGJhMzsJCS8qIExTQiAqLworCXU4ICAgICAgICAgcmVzZXJ2ZWQzOworCXU4ICAgICAgICAgeGZlcl9sZW5ndGgwOwkvKiB0cmFuc2ZlciBsZW5ndGggaW4gYmxvY2tzIC0gTVNCICovCisJdTggICAgICAgICB4ZmVyX2xlbmd0aDE7CS8qIExTQiAqLworCXU4ICAgICAgICAgY29udHJvbDsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZiAvKiBfX1NDU0lfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvdHlwZXMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvaW5jbHVkZS9wcm90b2NvbC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzVhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2luY2x1ZGUvcHJvdG9jb2wvdHlwZXMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIHR5cGVzLmggUHJvdG9jb2wgZGVmaW5lZCBiYXNlIHR5cGVzCisgKi8KKworI2lmbmRlZiBfX1RZUEVTX0hfXworI2RlZmluZSBfX1RZUEVTX0hfXworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorCisjZGVmaW5lIHd3bl90IHU2NAorI2RlZmluZSBsdW5fdCB1NjQKKworI2RlZmluZSBXV05fTlVMTAkoMCkKKyNkZWZpbmUgRkNfU1lNTkFNRV9NQVgJMjU2CS8qICBtYXggbmFtZSBzZXJ2ZXIgc3ltYm9saWMgbmFtZSBzaXplICovCisjZGVmaW5lIEZDX0FMUEFfTUFYCTEyOAorCisjcHJhZ21hIHBhY2soMSkKKworI2RlZmluZSBNQUNfQUREUkxFTgkoNikKK3N0cnVjdCBtYWNfcyB7IHU4IG1hY1tNQUNfQUREUkxFTl07IH07CisjZGVmaW5lIG1hY190IHN0cnVjdCBtYWNfcworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvbG9vcC5jIGIvZHJpdmVycy9zY3NpL2JmYS9sb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxOGRlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvbG9vcC5jCkBAIC0wLDAgKzEsNDIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIHBvcnRfbG9vcC5jIHZwb3J0IHByaXZhdGUgbG9vcCBpbXBsZW1lbnRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlICJmY3NfbHBvcnQuaCIKKyNpbmNsdWRlICJmY3NfcnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfdHJjbW9kLmgiCisjaW5jbHVkZSAibHBvcnRfcHJpdi5oIgorCitCRkFfVFJDX0ZJTEUoRkNTLCBMT09QKTsKKworLyoqCisgKiAgIEFMUEEgdG8gTElYQSBiaXRtYXAgbWFwcGluZworICoKKyAqICAgQUxQQSAweDAwIChXb3JkIDAsIEJpdCAzMCkgaXMgaW52YWxpZCBmb3IgTl9Qb3J0cy4gQWxzbyBXb3JkIDAgQml0IDMxCisgKiBpcyBmb3IgTF9iaXQgKGxvZ2luIHJlcXVpcmVkKSBhbmQgaXMgZmlsbGVkIGFzIEFMUEEgMHgwMCBoZXJlLgorICovCitzdGF0aWMgY29uc3QgdTggICBwb3J0X2xvb3BfYWxwYV9tYXBbXSA9IHsKKwkweEVGLCAweEU4LCAweEU0LCAweEUyLCAweEUxLCAweEUwLCAweERDLCAweERBLAkvKiBXb3JkIDMgQml0cyAwLi43ICovCisJMHhEOSwgMHhENiwgMHhENSwgMHhENCwgMHhEMywgMHhEMiwgMHhEMSwgMHhDRSwJLyogV29yZCAzIEJpdHMgOC4uMTUgKi8KKwkweENELCAweENDLCAweENCLCAweENBLCAweEM5LCAweEM3LCAweEM2LCAweEM1LAkvKiBXb3JkIDMgQml0cyAxNi4uMjMgKi8KKwkweEMzLCAweEJDLCAweEJBLCAweEI5LCAweEI2LCAweEI1LCAweEI0LCAweEIzLAkvKiBXb3JkIDMgQml0cyAyNC4uMzEgKi8KKworCTB4QjIsIDB4QjEsIDB4QUUsIDB4QUQsIDB4QUMsIDB4QUIsIDB4QUEsIDB4QTksCS8qIFdvcmQgMiBCaXRzIDAuLjcgKi8KKwkweEE3LCAweEE2LCAweEE1LCAweEEzLCAweDlGLCAweDlFLCAweDlELCAweDlCLAkvKiBXb3JkIDIgQml0cyA4Li4xNSAqLworCTB4OTgsIDB4OTcsIDB4OTAsIDB4OEYsIDB4ODgsIDB4ODQsIDB4ODIsIDB4ODEsCS8qIFdvcmQgMiBCaXRzIDE2Li4yMyAqLworCTB4ODAsIDB4N0MsIDB4N0EsIDB4NzksIDB4NzYsIDB4NzUsIDB4NzQsIDB4NzMsCS8qIFdvcmQgMiBCaXRzIDI0Li4zMSAqLworCisJMHg3MiwgMHg3MSwgMHg2RSwgMHg2RCwgMHg2QywgMHg2QiwgMHg2QSwgMHg2OSwJLyogV29yZCAxIEJpdHMgMC4uNyAqLworCTB4NjcsIDB4NjYsIDB4NjUsIDB4NjMsIDB4NUMsIDB4NUEsIDB4NTksIDB4NTYsCS8qIFdvcmQgMSBCaXRzIDguLjE1ICovCisJMHg1NSwgMHg1NCwgMHg1MywgMHg1MiwgMHg1MSwgMHg0RSwgMHg0RCwgMHg0QywJLyogV29yZCAxIEJpdHMgMTYuLjIzICovCisJMHg0QiwgMHg0QSwgMHg0OSwgMHg0NywgMHg0NiwgMHg0NSwgMHg0MywgMHgzQywJLyogV29yZCAxIEJpdHMgMjQuLjMxICovCisKKwkweDNBLCAweDM5LCAweDM2LCAweDM1LCAweDM0LCAweDMzLCAweDMyLCAweDMxLAkvKiBXb3JkIDAgQml0cyAwLi43ICovCisJMHgyRSwgMHgyRCwgMHgyQywgMHgyQiwgMHgyQSwgMHgyOSwgMHgyNywgMHgyNiwJLyogV29yZCAwIEJpdHMgOC4uMTUgKi8KKwkweDI1LCAweDIzLCAweDFGLCAweDFFLCAweDFELCAweDFCLCAweDE4LCAweDE3LAkvKiBXb3JkIDAgQml0cyAxNi4uMjMgKi8KKwkweDEwLCAweDBGLCAweDA4LCAweDA0LCAweDAyLCAweDAxLCAweDAwLCAweDAwLAkvKiBXb3JkIDAgQml0cyAyNC4uMzEgKi8KK307CisKKy8qCisgKiBMb2NhbCBGdW5jdGlvbnMKKyAqLworYmZhX3N0YXR1c190ICAgIGJmYV9mY3NfcG9ydF9sb29wX3NlbmRfcGxvZ2koc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJCQkgICAgIHU4IGFscGEpOworCit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X2xvb3BfcGxvZ2lfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAorCQkJCQkJIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkJIHZvaWQgKmNiYXJnLAorCQkJCQkJIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCQkJIHUzMiByc3BfbGVuLAorCQkJCQkJIHUzMiByZXNpZF9sZW4sCisJCQkJCQkgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOworCitiZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19wb3J0X2xvb3Bfc2VuZF9hZGlzYyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQkJCSAgICAgdTggYWxwYSk7CisKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX3BvcnRfbG9vcF9hZGlzY19yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCQkgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkJCQkgdm9pZCAqY2JhcmcsCisJCQkJCQkgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCQkgdTMyIHJzcF9sZW4sCisJCQkJCQkgdTMyIHJlc2lkX2xlbiwKKwkJCQkJCSBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CisKK2JmYV9zdGF0dXNfdCAgICBiZmFfZmNzX3BvcnRfbG9vcF9zZW5kX3Bsb2dpX2FjYyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQkJCQkgdTggYWxwYSk7CisKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX3BvcnRfbG9vcF9wbG9naV9hY2NfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAorCQkJCQkJICAgICBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQkJCSAgICAgdm9pZCAqY2JhcmcsCisJCQkJCQkgICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCQkJICAgICB1MzIgcnNwX2xlbiwKKwkJCQkJCSAgICAgdTMyIHJlc2lkX2xlbiwKKwkJCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOworCitiZmFfc3RhdHVzX3QgICAgYmZhX2Zjc19wb3J0X2xvb3Bfc2VuZF9hZGlzY19hY2Moc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJCQkJIHU4IGFscGEpOworCit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X2xvb3BfYWRpc2NfYWNjX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywKKwkJCQkJCSAgICAgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkJCQkgICAgIHZvaWQgKmNiYXJnLAorCQkJCQkJICAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQkJCSAgICAgdTMyIHJzcF9sZW4sCisJCQkJCQkgICAgIHUzMiByZXNpZF9sZW4sCisJCQkJCQkgICAgIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKTsKKy8qKgorICogICBDYWxsZWQgYnkgcG9ydCB0byBpbml0aWFsaXphciBpbiBwcm92YXRlIExPT1AgdG9wb2xvZ3kuCisgKi8KK3ZvaWQKK2JmYV9mY3NfcG9ydF9sb29wX2luaXQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworfQorCisvKioKKyAqICAgQ2FsbGVkIGJ5IHBvcnQgdG8gbm90aWZ5IHRyYW5zaXRpb24gdG8gb25saW5lIHN0YXRlLgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfbG9vcF9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCisJdTggICAgICAgICBudW1fYWxwYSA9IHBvcnQtPnBvcnRfdG9wby5wbG9vcC5udW1fYWxwYTsKKwl1OCAgICAgICAgKmFscGFfcG9zX21hcCA9IHBvcnQtPnBvcnRfdG9wby5wbG9vcC5hbHBhX3Bvc19tYXA7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcl9wb3J0OworCWludCAgICAgICAgICAgICBpaSA9IDA7CisKKwkvKgorCSAqIElmIHRoZSBwb3J0IHJvbGUgaXMgSW5pdGlhdG9yIE1vZGUsIGNyZWF0ZSBScG9ydHMuCisJICovCisJaWYgKHBvcnQtPnBvcnRfY2ZnLnJvbGVzID09IEJGQV9QT1JUX1JPTEVfRkNQX0lNKSB7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBBTFBBIHBvc2l0aW9uYWwgYml0bWFwIGlzIGF2YWlsYWJsZS4KKwkJICogaWYgbm90LCB3ZSBzZW5kIFBMT0dJIHRvIGFsbCBwb3NzaWJsZSBBTFBBcy4KKwkJICovCisJCWlmIChudW1fYWxwYSA+IDApIHsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IG51bV9hbHBhOyBpaSsrKSB7CisJCQkJLyoKKwkJCQkgKiBpZ25vcmUgQUxQQSBvZiBiZmEgcG9ydAorCQkJCSAqLworCQkJCWlmIChhbHBhX3Bvc19tYXBbaWldICE9IHBvcnQtPnBpZCkgeworCQkJCQlyX3BvcnQgPSBiZmFfZmNzX3Jwb3J0X2NyZWF0ZShwb3J0LAorCQkJCQkJYWxwYV9wb3NfbWFwW2lpXSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChpaSA9IDA7IGlpIDwgTUFYX0FMUEFfQ09VTlQ7IGlpKyspIHsKKwkJCQkvKgorCQkJCSAqIGlnbm9yZSBBTFBBIG9mIGJmYSBwb3J0CisJCQkJICovCisJCQkJaWYgKChwb3J0X2xvb3BfYWxwYV9tYXBbaWldID4gMCkKKwkJCQkgICAgJiYgKHBvcnRfbG9vcF9hbHBhX21hcFtpaV0gIT0gcG9ydC0+cGlkKSkKKwkJCQkJYmZhX2Zjc19wb3J0X2xvb3Bfc2VuZF9wbG9naShwb3J0LAorCQkJCQkJcG9ydF9sb29wX2FscGFfbWFwW2lpXSk7CisJCQkJLyoqVEJEICovCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUQkQgVGFyZ2V0IE1vZGUgPz8KKwkJICovCisJfQorCit9CisKKy8qKgorICogICBDYWxsZWQgYnkgcG9ydCB0byBub3RpZnkgdHJhbnNpdGlvbiB0byBvZmZsaW5lIHN0YXRlLgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfbG9vcF9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCkKK3sKKworfQorCisvKioKKyAqICAgQ2FsbGVkIGJ5IHBvcnQgdG8gbm90aWZ5IGEgTElQIG9uIHRoZSBsb29wLgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfbG9vcF9saXAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworfQorCisvKioKKyAqIExvY2FsIEZ1bmN0aW9ucy4KKyAqLworYmZhX3N0YXR1c190CitiZmFfZmNzX3BvcnRfbG9vcF9zZW5kX3Bsb2dpKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgdTggYWxwYSkKK3sKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAgPSBOVUxMOworCWludCAgICAgICAgICAgICBsZW47CisKKwliZmFfdHJjKHBvcnQtPmZjcywgYWxwYSk7CisKKwlmY3hwID0gYmZhX2ZjeHBfYWxsb2MoTlVMTCwgcG9ydC0+ZmNzLT5iZmEsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJICBOVUxMKTsKKwliZmFfYXNzZXJ0KGZjeHApOworCisJbGVuID0gZmNfcGxvZ2lfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksIGFscGEsCisJCQkgICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgMCwKKwkJCSAgICAgcG9ydC0+cG9ydF9jZmcucHd3biwgcG9ydC0+cG9ydF9jZmcubnd3biwKKwkJCQkgYmZhX3Bwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCisJCQkgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsCisJCQkgIGJmYV9mY3NfcG9ydF9sb29wX3Bsb2dpX3Jlc3BvbnNlLCAodm9pZCAqKXBvcnQsCisJCQkgIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqICAgQ2FsbGVkIGJ5IGZjeHAgdG8gbm90aWZ5IHRoZSBQbG9naSByZXNwb25zZQorICovCit2b2lkCitiZmFfZmNzX3BvcnRfbG9vcF9wbG9naV9yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCSB2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJIHUzMiByc3BfbGVuLCB1MzIgcmVzaWRfbGVuLAorCQkJCSBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICopIGNiYXJnOworCXN0cnVjdCBmY19sb2dpX3MgICAgICpwbG9naV9yZXNwOworCXN0cnVjdCBmY19lbHNfY21kX3MgICAqZWxzX2NtZDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKworCS8qCisJICogU2FuaXR5IENoZWNrcworCSAqLworCWlmIChyZXFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIHJlcV9zdGF0dXMpOworCQkvKgorCQkgKiBAdG9kbworCQkgKiBUaGlzIGNvdWxkIG1lYW4gdGhhdCB0aGUgZGV2aWNlIHdpdGggdGhpcyBBUExBIGRvZXMgbm90CisJCSAqIGV4aXN0IG9uIHRoZSBsb29wLgorCQkgKi8KKworCQlyZXR1cm47CisJfQorCisJZWxzX2NtZCA9IChzdHJ1Y3QgZmNfZWxzX2NtZF9zICopIEJGQV9GQ1hQX1JTUF9QTEQoZmN4cCk7CisJcGxvZ2lfcmVzcCA9IChzdHJ1Y3QgZmNfbG9naV9zICopIGVsc19jbWQ7CisKKwlpZiAoZWxzX2NtZC0+ZWxzX2NvZGUgPT0gRkNfRUxTX0FDQykgeworCQliZmFfZmNzX3Jwb3J0X3N0YXJ0KHBvcnQsIHJzcF9mY2hzLCBwbG9naV9yZXNwKTsKKwl9IGVsc2UgeworCQliZmFfdHJjKHBvcnQtPmZjcywgcGxvZ2lfcmVzcC0+ZWxzX2NtZC5lbHNfY29kZSk7CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfcG9ydF9sb29wX3NlbmRfcGxvZ2lfYWNjKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgdTggYWxwYSkKK3sKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJaW50ICAgICAgICAgICAgIGxlbjsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBhbHBhKTsKKworCWZjeHAgPSBiZmFfZmN4cF9hbGxvYyhOVUxMLCBwb3J0LT5mY3MtPmJmYSwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkgIE5VTEwpOworCWJmYV9hc3NlcnQoZmN4cCk7CisKKwlsZW4gPSBmY19wbG9naV9hY2NfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksIGFscGEsCisJCQkJIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgMCwKKwkJCQkgcG9ydC0+cG9ydF9jZmcucHd3biwgcG9ydC0+cG9ydF9jZmcubnd3biwKKwkJCQkgYmZhX3Bwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCisJCQkJIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsCisJCQkJIGJmYV9mY3NfcG9ydF9sb29wX3Bsb2dpX2FjY19yZXNwb25zZSwKKwkJCQkgKHZvaWQgKilwb3J0LCBGQ19NQVhfUERVU1osIDApOyAvKiBObyByZXNwb25zZQorCQkJCQkJCQkgICogZXhwZWN0ZWQKKwkJCQkJCQkJICAqLworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qCisgKiAgUGxvZ2kgQWNjIFJlc3BvbnNlCisgKiBXZSBkb25vdCBkbyBhbnkgcHJvY2Vzc2luZyBoZXJlLgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfbG9vcF9wbG9naV9hY2NfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQkgICAgIHZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQkgICAgIHUzMiByc3BfbGVuLCB1MzIgcmVzaWRfbGVuLAorCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCit7CisKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICopIGNiYXJnOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBpZCk7CisKKwkvKgorCSAqIFNhbml0eSBDaGVja3MKKwkgKi8KKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KK30KKworYmZhX3N0YXR1c190CitiZmFfZmNzX3BvcnRfbG9vcF9zZW5kX2FkaXNjKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgdTggYWxwYSkKK3sKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJaW50ICAgICAgICAgICAgIGxlbjsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBhbHBhKTsKKworCWZjeHAgPSBiZmFfZmN4cF9hbGxvYyhOVUxMLCBwb3J0LT5mY3MtPmJmYSwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkgIE5VTEwpOworCWJmYV9hc3NlcnQoZmN4cCk7CisKKwlsZW4gPSBmY19hZGlzY19idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwgYWxwYSwKKwkJCSAgICAgYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLCAwLAorCQkJICAgICBwb3J0LT5wb3J0X2NmZy5wd3duLCBwb3J0LT5wb3J0X2NmZy5ud3duKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCisJCQkgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsCisJCQkgIGJmYV9mY3NfcG9ydF9sb29wX2FkaXNjX3Jlc3BvbnNlLCAodm9pZCAqKXBvcnQsCisJCQkgIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqICAgQ2FsbGVkIGJ5IGZjeHAgdG8gbm90aWZ5IHRoZSBBRElTQyByZXNwb25zZQorICovCit2b2lkCitiZmFfZmNzX3BvcnRfbG9vcF9hZGlzY19yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCSB2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJIHUzMiByc3BfbGVuLCB1MzIgcmVzaWRfbGVuLAorCQkJCSBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICopIGNiYXJnOworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCXN0cnVjdCBmY19hZGlzY19zICAgICAqYWRpc2NfcmVzcDsKKwlzdHJ1Y3QgZmNfZWxzX2NtZF9zICAgKmVsc19jbWQ7CisJdTMyICAgICAgICBwaWQgPSByc3BfZmNocy0+c19pZDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKworCS8qCisJICogU2FuaXR5IENoZWNrcworCSAqLworCWlmIChyZXFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJLyoKKwkJICogVEJEIDogd2UgbWF5IG5lZWQgdG8gcmV0cnkgY2VydGFpbiByZXF1ZXN0cworCQkgKi8KKwkJYmZhX2ZjeHBfZnJlZShmY3hwKTsKKwkJcmV0dXJuOworCX0KKworCWVsc19jbWQgPSAoc3RydWN0IGZjX2Vsc19jbWRfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCWFkaXNjX3Jlc3AgPSAoc3RydWN0IGZjX2FkaXNjX3MgKikgZWxzX2NtZDsKKworCWlmIChlbHNfY21kLT5lbHNfY29kZSA9PSBGQ19FTFNfQUNDKSB7CisJfSBlbHNlIHsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIGFkaXNjX3Jlc3AtPmVsc19jbWQuZWxzX2NvZGUpOworCisJCS8qCisJCSAqIFRCRDogd2UgbWF5IG5lZWQgdG8gY2hlY2sgZm9yIHJlamVjdCBjb2RlcyBhbmQgcmV0cnkKKwkJICovCisJCXJwb3J0ID0gYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9ieV9waWQocG9ydCwgcGlkKTsKKwkJaWYgKHJwb3J0KSB7CisJCQlsaXN0X2RlbCgmcnBvcnQtPnFlKTsKKwkJCWJmYV9mY3NfcnBvcnRfZGVsZXRlKHJwb3J0KTsKKwkJfQorCisJfQorCXJldHVybjsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNzX3BvcnRfbG9vcF9zZW5kX2FkaXNjX2FjYyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHU4IGFscGEpCit7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCWludCAgICAgICAgICAgICBsZW47CisKKwliZmFfdHJjKHBvcnQtPmZjcywgYWxwYSk7CisKKwlmY3hwID0gYmZhX2ZjeHBfYWxsb2MoTlVMTCwgcG9ydC0+ZmNzLT5iZmEsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJICBOVUxMKTsKKwliZmFfYXNzZXJ0KGZjeHApOworCisJbGVuID0gZmNfYWRpc2NfYWNjX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCBhbHBhLAorCQkJCSBiZmFfZmNzX3BvcnRfZ2V0X2ZjaWQocG9ydCksIDAsCisJCQkJIHBvcnQtPnBvcnRfY2ZnLnB3d24sIHBvcnQtPnBvcnRfY2ZnLm53d24pOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJCQlGQ19DTEFTU18zLCBsZW4sICZmY2hzLAorCQkJCWJmYV9mY3NfcG9ydF9sb29wX2FkaXNjX2FjY19yZXNwb25zZSwKKwkJCQkodm9pZCAqKXBvcnQsIEZDX01BWF9QRFVTWiwgMCk7IC8qIG5vIHJlcG9uc2UKKwkJCQkJCQkJICogZXhwZWN0ZWQKKwkJCQkJCQkJICovCisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqICBBZGlzYyBBY2MgUmVzcG9uc2UKKyAqIFdlIGRvbm90IGRvIGFueSBwcm9jZXNzaW5nIGhlcmUuCisgKi8KK3ZvaWQKK2JmYV9mY3NfcG9ydF9sb29wX2FkaXNjX2FjY19yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCSAgICAgdm9pZCAqY2JhcmcsIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCSAgICAgdTMyIHJzcF9sZW4sIHUzMiByZXNpZF9sZW4sCisJCQkJICAgICBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKikgY2Jhcmc7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cGlkKTsKKworCS8qCisJICogU2FuaXR5IENoZWNrcworCSAqLworCWlmIChyZXFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIHJlcV9zdGF0dXMpOworCQlyZXR1cm47CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9scG9ydF9hcGkuYyBiL2RyaXZlcnMvc2NzaS9iZmEvbHBvcnRfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1MWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvbHBvcnRfYXBpLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgcG9ydF9hcGkuYyBCRkEgRkNTIHBvcnQKKyAqLworCisjaW5jbHVkZSA8ZmNzL2JmYV9mY3MuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjc19scG9ydC5oPgorI2luY2x1ZGUgPGZjcy9iZmFfZmNzX3Jwb3J0Lmg+CisjaW5jbHVkZSAiZmNzX3Jwb3J0LmgiCisjaW5jbHVkZSAiZmNzX2ZhYnJpYy5oIgorI2luY2x1ZGUgImZjc190cmNtb2QuaCIKKyNpbmNsdWRlICJmY3NfdnBvcnQuaCIKKworQkZBX1RSQ19GSUxFKEZDUywgUE9SVF9BUEkpOworCisKKworLyoqCisgKiAgZmNzX3BvcnRfYXBpIEJGQSBGQ1MgcG9ydCBBUEkKKyAqLworCit2b2lkCitiZmFfZmNzX2NmZ19iYXNlX3BvcnQoc3RydWN0IGJmYV9mY3NfcyAqZmNzLCBzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBvcnRfY2ZnKQoreworfQorCitzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKgorYmZhX2Zjc19nZXRfYmFzZV9wb3J0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcykKK3sKKwlyZXR1cm4gKCZmY3MtPmZhYnJpYy5icG9ydCk7Cit9CisKK3d3bl90CitiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3Qgd3duLCBpbnQgaW5kZXgsCisJCSAgICAgICBpbnQgbnJwb3J0cywgYmZhX2Jvb2xlYW5fdCBid3duKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnFoLCAqcWU7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSBOVUxMOworCWludCAgICAgICAgICAgICBpOworCXN0cnVjdCBiZmFfZmNzX3MgKmZjczsKKworCWlmIChwb3J0ID09IE5VTEwgfHwgbnJwb3J0cyA9PSAwKQorCQlyZXR1cm4gKHd3bl90KSAwOworCisJZmNzID0gcG9ydC0+ZmNzOworCWJmYV90cmMoZmNzLCAodTMyKSBucnBvcnRzKTsKKworCWkgPSAwOworCXFoID0gJnBvcnQtPnJwb3J0X3E7CisJcWUgPSBiZmFfcV9maXJzdChxaCk7CisKKwl3aGlsZSAoKHFlICE9IHFoKSAmJiAoaSA8IG5ycG9ydHMpKSB7CisJCXJwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKilxZTsKKwkJaWYgKGJmYV9vc19udG9oM2IocnBvcnQtPnBpZCkgPiAweEZGRjAwMCkgeworCQkJcWUgPSBiZmFfcV9uZXh0KHFlKTsKKwkJCWJmYV90cmMoZmNzLCAodTMyKSBycG9ydC0+cHd3bik7CisJCQliZmFfdHJjKGZjcywgcnBvcnQtPnBpZCk7CisJCQliZmFfdHJjKGZjcywgaSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChid3duKSB7CisJCQlpZiAoIW1lbWNtcCgmd3duLCAmcnBvcnQtPnB3d24sIDgpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaWYgKGkgPT0gaW5kZXgpCisJCQkJYnJlYWs7CisJCX0KKworCQlpKys7CisJCXFlID0gYmZhX3FfbmV4dChxZSk7CisJfQorCisJYmZhX3RyYyhmY3MsIGkpOworCWlmIChycG9ydCkgeworCQlyZXR1cm4gcnBvcnQtPnB3d247CisJfSBlbHNlIHsKKwkJcmV0dXJuICh3d25fdCkgMDsKKwl9Cit9CisKK3ZvaWQKK2JmYV9mY3NfcG9ydF9nZXRfcnBvcnRzKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3QgcnBvcnRfd3duc1tdLAorCQkJaW50ICpucnBvcnRzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnFoLCAqcWU7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSBOVUxMOworCWludCAgICAgICAgICAgICBpOworCXN0cnVjdCBiZmFfZmNzX3MgKmZjczsKKworCWlmIChwb3J0ID09IE5VTEwgfHwgcnBvcnRfd3ducyA9PSBOVUxMIHx8ICpucnBvcnRzID09IDApCisJCXJldHVybjsKKworCWZjcyA9IHBvcnQtPmZjczsKKwliZmFfdHJjKGZjcywgKHUzMikgKm5ycG9ydHMpOworCisJaSA9IDA7CisJcWggPSAmcG9ydC0+cnBvcnRfcTsKKwlxZSA9IGJmYV9xX2ZpcnN0KHFoKTsKKworCXdoaWxlICgocWUgIT0gcWgpICYmIChpIDwgKm5ycG9ydHMpKSB7CisJCXJwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKilxZTsKKwkJaWYgKGJmYV9vc19udG9oM2IocnBvcnQtPnBpZCkgPiAweEZGRjAwMCkgeworCQkJcWUgPSBiZmFfcV9uZXh0KHFlKTsKKwkJCWJmYV90cmMoZmNzLCAodTMyKSBycG9ydC0+cHd3bik7CisJCQliZmFfdHJjKGZjcywgcnBvcnQtPnBpZCk7CisJCQliZmFfdHJjKGZjcywgaSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJwb3J0X3d3bnNbaV0gPSBycG9ydC0+cHd3bjsKKworCQlpKys7CisJCXFlID0gYmZhX3FfbmV4dChxZSk7CisJfQorCisJYmZhX3RyYyhmY3MsIGkpOworCSpucnBvcnRzID0gaTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBJdGVyYXRlJ3MgdGhyb3VnaCBhbGwgdGhlIHJwb3J0J3MgaW4gdGhlIGdpdmVuIHBvcnQgdG8KKyAqIGRldGVybWluZSB0aGUgbWF4aW11bSBvcGVyYXRpbmcgc3BlZWQuCisgKi8KK2VudW0gYmZhX3Bwb3J0X3NwZWVkCitiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X21heF9zcGVlZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcWgsICpxZTsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IE5VTEw7CisJc3RydWN0IGJmYV9mY3NfcyAqZmNzOworCWVudW0gYmZhX3Bwb3J0X3NwZWVkIG1heF9zcGVlZCA9IDA7CisJc3RydWN0IGJmYV9wcG9ydF9hdHRyX3MgcHBvcnRfYXR0cjsKKwllbnVtIGJmYV9wcG9ydF9zcGVlZCBwcG9ydF9zcGVlZDsKKworCWlmIChwb3J0ID09IE5VTEwpCisJCXJldHVybiAwOworCisJZmNzID0gcG9ydC0+ZmNzOworCisJLyoKKwkgKiBHZXQgUGh5c2ljYWwgcG9ydCdzIGN1cnJlbnQgc3BlZWQKKwkgKi8KKwliZmFfcHBvcnRfZ2V0X2F0dHIocG9ydC0+ZmNzLT5iZmEsICZwcG9ydF9hdHRyKTsKKwlwcG9ydF9zcGVlZCA9IHBwb3J0X2F0dHIuc3BlZWQ7CisJYmZhX3RyYyhmY3MsIHBwb3J0X3NwZWVkKTsKKworCXFoID0gJnBvcnQtPnJwb3J0X3E7CisJcWUgPSBiZmFfcV9maXJzdChxaCk7CisKKwl3aGlsZSAocWUgIT0gcWgpIHsKKwkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXFlOworCQlpZiAoKGJmYV9vc19udG9oM2IocnBvcnQtPnBpZCkgPiAweEZGRjAwMCkKKwkJICAgIHx8IChiZmFfZmNzX3Jwb3J0X2dldF9zdGF0ZShycG9ydCkgPT0gQkZBX1JQT1JUX09GRkxJTkUpKSB7CisJCQlxZSA9IGJmYV9xX25leHQocWUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKHJwb3J0LT5ycGYucnBzY19zcGVlZCA9PSBCRkFfUFBPUlRfU1BFRURfOEdCUFMpCisJCSAgICB8fCAocnBvcnQtPnJwZi5ycHNjX3NwZWVkID4gcHBvcnRfc3BlZWQpKSB7CisJCQltYXhfc3BlZWQgPSBycG9ydC0+cnBmLnJwc2Nfc3BlZWQ7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChycG9ydC0+cnBmLnJwc2Nfc3BlZWQgPiBtYXhfc3BlZWQpIHsKKwkJCW1heF9zcGVlZCA9IHJwb3J0LT5ycGYucnBzY19zcGVlZDsKKwkJfQorCisJCXFlID0gYmZhX3FfbmV4dChxZSk7CisJfQorCisJYmZhX3RyYyhmY3MsIG1heF9zcGVlZCk7CisJcmV0dXJuIG1heF9zcGVlZDsKK30KKworc3RydWN0IGJmYV9mY3NfcG9ydF9zICoKK2JmYV9mY3NfbG9va3VwX3BvcnQoc3RydWN0IGJmYV9mY3NfcyAqZmNzLCB1MTYgdmZfaWQsIHd3bl90IGxwd3duKQoreworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0OworCWJmYV9mY3NfdmZfdCAgICp2ZjsKKworCWJmYV9hc3NlcnQoZmNzICE9IE5VTEwpOworCisJdmYgPSBiZmFfZmNzX3ZmX2xvb2t1cChmY3MsIHZmX2lkKTsKKwlpZiAodmYgPT0gTlVMTCkgeworCQliZmFfdHJjKGZjcywgdmZfaWQpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWlmICghbHB3d24gfHwgKHZmLT5icG9ydC5wb3J0X2NmZy5wd3duID09IGxwd3duKSkKKwkJcmV0dXJuICgmdmYtPmJwb3J0KTsKKworCXZwb3J0ID0gYmZhX2Zjc19mYWJyaWNfdnBvcnRfbG9va3VwKHZmLCBscHd3bik7CisJaWYgKHZwb3J0KQorCQlyZXR1cm4gKCZ2cG9ydC0+bHBvcnQpOworCisJcmV0dXJuIChOVUxMKTsKK30KKworLyoKKyAqICBBUEkgY29ycmVzcG9uZGluZyB0byBWbVdhcmUncyBOUElWX1ZQT1JUX0dFVElORk8uCisgKi8KK3ZvaWQKK2JmYV9mY3NfcG9ydF9nZXRfaW5mbyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCSAgICAgIHN0cnVjdCBiZmFfcG9ydF9pbmZvX3MgKnBvcnRfaW5mbykKK3sKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5mYWJyaWMtPmZhYnJpY19uYW1lKTsKKworCWlmIChwb3J0LT52cG9ydCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYSBQaHlzaWNhbCBwb3J0CisJCSAqLworCQlwb3J0X2luZm8tPnBvcnRfdHlwZSA9IEJGQV9QT1JUX1RZUEVfUEhZU0lDQUw7CisKKwkJLyoKKwkJICogQHRvZG8gOiBuZWVkIHRvIGZpeCB0aGUgc3RhdGUgJiByZWFzb24KKwkJICovCisJCXBvcnRfaW5mby0+cG9ydF9zdGF0ZSA9IDA7CisJCXBvcnRfaW5mby0+b2ZmbGluZV9yZWFzb24gPSAwOworCisJCXBvcnRfaW5mby0+cG9ydF93d24gPSBiZmFfZmNzX3BvcnRfZ2V0X3B3d24ocG9ydCk7CisJCXBvcnRfaW5mby0+bm9kZV93d24gPSBiZmFfZmNzX3BvcnRfZ2V0X253d24ocG9ydCk7CisKKwkJcG9ydF9pbmZvLT5tYXhfdnBvcnRzX3N1cHAgPSBiZmFfZmNzX3Zwb3J0X2dldF9tYXgocG9ydC0+ZmNzKTsKKwkJcG9ydF9pbmZvLT5udW1fdnBvcnRzX2ludXNlID0KKwkJCWJmYV9mY3NfZmFicmljX3Zwb3J0X2NvdW50KHBvcnQtPmZhYnJpYyk7CisJCXBvcnRfaW5mby0+bWF4X3Jwb3J0c19zdXBwID0gQkZBX0ZDU19NQVhfUlBPUlRTX1NVUFA7CisJCXBvcnRfaW5mby0+bnVtX3Jwb3J0c19pbnVzZSA9IHBvcnQtPm51bV9ycG9ydHM7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhIHZpcnR1YWwgcG9ydAorCQkgKi8KKwkJcG9ydF9pbmZvLT5wb3J0X3R5cGUgPSBCRkFfUE9SVF9UWVBFX1ZJUlRVQUw7CisKKwkJLyoKKwkJICogQHRvZG8gOiBuZWVkIHRvIGZpeCB0aGUgc3RhdGUgJiByZWFzb24KKwkJICovCisJCXBvcnRfaW5mby0+cG9ydF9zdGF0ZSA9IDA7CisJCXBvcnRfaW5mby0+b2ZmbGluZV9yZWFzb24gPSAwOworCisJCXBvcnRfaW5mby0+cG9ydF93d24gPSBiZmFfZmNzX3BvcnRfZ2V0X3B3d24ocG9ydCk7CisJCXBvcnRfaW5mby0+bm9kZV93d24gPSBiZmFfZmNzX3BvcnRfZ2V0X253d24ocG9ydCk7CisJfQorfQorCit2b2lkCitiZmFfZmNzX3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqZmNzX3BvcnQsCisJCSAgICAgICBzdHJ1Y3QgYmZhX3BvcnRfc3RhdHNfcyAqcG9ydF9zdGF0cykKK3sKKwliZmFfb3NfbWVtY3B5KHBvcnRfc3RhdHMsICZmY3NfcG9ydC0+c3RhdHMsCisJCSAgICAgIHNpemVvZihzdHJ1Y3QgYmZhX3BvcnRfc3RhdHNfcykpOworCXJldHVybjsKK30KKwordm9pZAorYmZhX2Zjc19wb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqZmNzX3BvcnQpCit7CisJYmZhX29zX21lbXNldCgmZmNzX3BvcnQtPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9wb3J0X3N0YXRzX3MpKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQKK2JmYV9mY3NfcG9ydF9lbmFibGVfaXBmY19yb2xlcyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKmZjc19wb3J0KQoreworCWZjc19wb3J0LT5wb3J0X2NmZy5yb2xlcyB8PSBCRkFfUE9SVF9ST0xFX0ZDUF9JUEZDOworCXJldHVybjsKK30KKwordm9pZAorYmZhX2Zjc19wb3J0X2Rpc2FibGVfaXBmY19yb2xlcyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKmZjc19wb3J0KQoreworCWZjc19wb3J0LT5wb3J0X2NmZy5yb2xlcyAmPSB+QkZBX1BPUlRfUk9MRV9GQ1BfSVBGQzsKKwlyZXR1cm47Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9scG9ydF9wcml2LmggYi9kcml2ZXJzL3Njc2kvYmZhL2xwb3J0X3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmFlMzcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9scG9ydF9wcml2LmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fVlBfUFJJVl9IX18KKyNkZWZpbmUgX19WUF9QUklWX0hfXworCisjaW5jbHVkZSA8ZmNzL2JmYV9mY3NfbHBvcnQuaD4KKyNpbmNsdWRlIDxmY3MvYmZhX2Zjc192cG9ydC5oPgorCisvKgorICogRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHZwcworICovCit2b2lkICAgICAgICAgICAgYmZhX2Zjc192cG9ydF9pbml0KHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KTsKKworLyoKKyAqIEZ1bmN0aW9ucyBleHBvcnRlZCBieSB2cHMKKyAqLwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfdnBzX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfdnBzX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX3Zwc19saXAoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKKworLyoKKyAqIEZ1bmN0aW9ucyBleHBvcnRlZCBieSBwb3J0X2ZhYgorICovCit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X2ZhYl9pbml0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqdnBvcnQpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfcG9ydF9mYWJfb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqdnBvcnQpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfcG9ydF9mYWJfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnZwb3J0KTsKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX3BvcnRfZmFiX3J4X2ZyYW1lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCQkJICB1OCAqcnhfZnJhbWUsIHUzMiBsZW4pOworCisvKgorICogRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IFZQLU5TLgorICovCit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X25zX2luaXQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICp2cG9ydCk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X25zX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICp2cG9ydCk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X25zX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnZwb3J0KTsKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX3BvcnRfbnNfcXVlcnkoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KTsKKworLyoKKyAqIEZ1bmN0aW9ucyBleHBvcnRlZCBieSBWUC1TQ04KKyAqLwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfcG9ydF9zY25faW5pdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnZwb3J0KTsKK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX3BvcnRfc2NuX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICp2cG9ydCk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X3Njbl9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICp2cG9ydCk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X3Njbl9wcm9jZXNzX3JzY24oc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJCQkgICAgICBzdHJ1Y3QgZmNoc19zICpyeF9mcmFtZSwgdTMyIGxlbik7CisKKy8qCisgKiBGdW5jdGlvbnMgZXhwb3J0ZWQgYnkgVlAtTjJOCisgKi8KKwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfcG9ydF9uMm5faW5pdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfcG9ydF9uMm5fb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X24ybl9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X24ybl9yeF9mcmFtZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQkJCSAgdTggKnJ4X2ZyYW1lLCB1MzIgbGVuKTsKKworLyoKKyAqIEZ1bmN0aW9ucyBleHBvcnRlZCBieSBWUC1MT09QCisgKi8KK3ZvaWQgICAgICAgICAgICBiZmFfZmNzX3BvcnRfbG9vcF9pbml0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X2xvb3Bfb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7Cit2b2lkICAgICAgICAgICAgYmZhX2Zjc19wb3J0X2xvb3Bfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfcG9ydF9sb29wX2xpcChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpOwordm9pZCAgICAgICAgICAgIGJmYV9mY3NfcG9ydF9sb29wX3J4X2ZyYW1lKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwKKwkJCQkJICAgdTggKnJ4X2ZyYW1lLCB1MzIgbGVuKTsKKworI2VuZGlmIC8qIF9fVlBfUFJJVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvbXMuYyBiL2RyaXZlcnMvc2NzaS9iZmEvbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTZiM2NhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9tcy5jCkBAIC0wLDAgKzEsNzU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlICJmY3NfbHBvcnQuaCIKKyNpbmNsdWRlICJmY3NfcnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfdHJjbW9kLmgiCisjaW5jbHVkZSAiZmNzX2ZjeHAuaCIKKyNpbmNsdWRlICJscG9ydF9wcml2LmgiCisKK0JGQV9UUkNfRklMRShGQ1MsIE1TKTsKKworI2RlZmluZSBCRkFfRkNTX01TX0NNRF9NQVhfUkVUUklFUyAgMgorLyoKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbXNfc2VuZF9wbG9naSh2b2lkICptc19jYmFyZywKKwkJCQkJICAgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X21zX3RpbWVvdXQodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbXNfcGxvZ2lfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAorCQkJCQkgICAgICAgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkJCSAgICAgICB2b2lkICpjYmFyZywKKwkJCQkJICAgICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCQkgICAgICAgdTMyIHJzcF9sZW4sCisJCQkJCSAgICAgICB1MzIgcmVzaWRfbGVuLAorCQkJCQkgICAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOworCitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X21zX3NlbmRfZ21hbCh2b2lkICptc19jYmFyZywKKwkJCQkJICBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbXNfZ21hbF9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCSAgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkgICAgICB2b2lkICpjYmFyZywKKwkJCQkJICAgICAgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCSAgICAgIHUzMiByc3BfbGVuLAorCQkJCQkgICAgICB1MzIgcmVzaWRfbGVuLAorCQkJCQkgICAgICBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X21zX3NlbmRfZ2ZuKHZvaWQgKm1zX2NiYXJnLAorCQkJCQkgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X21zX2dmbl9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCSAgICAgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkJCSAgICAgdm9pZCAqY2JhcmcsCisJCQkJCSAgICAgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCSAgICAgdTMyIHJzcF9sZW4sCisJCQkJCSAgICAgdTMyIHJlc2lkX2xlbiwKKwkJCQkJICAgICBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CisvKioKKyAqICBmY3NfbXNfc20gRkNTIE1TIHN0YXRlIG1hY2hpbmUKKyAqLworCisvKioKKyAqICBNUyBTdGF0ZSBNYWNoaW5lIGV2ZW50cworICovCitlbnVtIHBvcnRfbXNfZXZlbnQgeworCU1TU01fRVZFTlRfUE9SVF9PTkxJTkUgPSAxLAorCU1TU01fRVZFTlRfUE9SVF9PRkZMSU5FID0gMiwKKwlNU1NNX0VWRU5UX1JTUF9PSyA9IDMsCisJTVNTTV9FVkVOVF9SU1BfRVJST1IgPSA0LAorCU1TU01fRVZFTlRfVElNRU9VVCA9IDUsCisJTVNTTV9FVkVOVF9GQ1hQX1NFTlQgPSA2LAorCU1TU01fRVZFTlRfUE9SVF9GQUJSSUNfUlNDTiA9IDcKK307CisKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbXNfc21fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJCQkgICBlbnVtIHBvcnRfbXNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9tc19zbV9wbG9naV9zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMsCisJCQkJCQkgZW51bSBwb3J0X21zX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbXNfc21fcGxvZ2koc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcywKKwkJCQkJIGVudW0gcG9ydF9tc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X21zX3NtX3Bsb2dpX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMsCisJCQkJCSAgICAgICBlbnVtIHBvcnRfbXNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9tc19zbV9nbWFsX3NlbmRpbmcoc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcywKKwkJCQkJCWVudW0gcG9ydF9tc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X21zX3NtX2dtYWwoc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcywKKwkJCQkJZW51bSBwb3J0X21zX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbXNfc21fZ21hbF9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJCQkgICAgICBlbnVtIHBvcnRfbXNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9tc19zbV9nZm5fc2VuZGluZyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJCQkgICAgICAgZW51bSBwb3J0X21zX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbXNfc21fZ2ZuKHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMsCisJCQkJICAgICAgIGVudW0gcG9ydF9tc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X21zX3NtX2dmbl9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJCQkgICAgIGVudW0gcG9ydF9tc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X21zX3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJCQkgIGVudW0gcG9ydF9tc19ldmVudCBldmVudCk7CisvKioKKyAqIAkJU3RhcnQgaW4gb2ZmbGluZSBzdGF0ZSAtIGF3YWl0aW5nIE5TIHRvIHNlbmQgc3RhcnQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfc21fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJICAgZW51bSBwb3J0X21zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgbXMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTVNTTV9FVkVOVF9QT1JUX09OTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX3Bsb2dpX3NlbmRpbmcpOworCQliZmFfZmNzX3BvcnRfbXNfc2VuZF9wbG9naShtcywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBNU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9tc19zbV9wbG9naV9zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMsCisJCQkJIGVudW0gcG9ydF9tc19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKG1zLT5wb3J0LT5mY3MsIG1zLT5wb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKG1zLT5wb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE1TU01fRVZFTlRfRkNYUF9TRU5UOgorCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fcGxvZ2kpOworCQlicmVhazsKKworCWNhc2UgTVNTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG1zLT5wb3J0KSwKKwkJCQkgICAgICAgJm1zLT5mY3hwX3dxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfc21fcGxvZ2koc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcywgZW51bSBwb3J0X21zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgbXMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTVNTTV9FVkVOVF9SU1BfRVJST1I6CisJCS8qCisJCSAqIFN0YXJ0IHRpbWVyIGZvciBhIGRlbGF5ZWQgcmV0cnkKKwkJICovCisJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9wbG9naV9yZXRyeSk7CisJCWJmYV90aW1lcl9zdGFydChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG1zLT5wb3J0KSwgJm1zLT50aW1lciwKKwkJCQliZmFfZmNzX3BvcnRfbXNfdGltZW91dCwgbXMsCisJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIE1TU01fRVZFTlRfUlNQX09LOgorCQkvKgorCQkgKiBzaW5jZSBwbG9naSBpcyBkb25lLCBub3cgaW52b2tlIE1TIHJlbGF0ZWQgc3ViLW1vZHVsZXMKKwkJICovCisJCWJmYV9mY3NfcG9ydF9mZG1pX29ubGluZShtcyk7CisKKwkJLyoqCisJCSAqIGlmIHRoaXMgaXMgYSBWcG9ydCwgZ28gdG8gb25saW5lIHN0YXRlLgorCQkgKi8KKwkJaWYgKG1zLT5wb3J0LT52cG9ydCkgeworCQkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX29ubGluZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEZvciBhIGJhc2UgcG9ydCB3ZSBuZWVkIHRvIGdldCB0aGUKKwkJICogc3dpdGNoJ3MgSVAgYWRkcmVzcy4KKwkJICovCisJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9nbWFsX3NlbmRpbmcpOworCQliZmFfZmNzX3BvcnRfbXNfc2VuZF9nbWFsKG1zLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIE1TU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fb2ZmbGluZSk7CisJCWJmYV9mY3hwX2Rpc2NhcmQobXMtPmZjeHApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X21zX3NtX3Bsb2dpX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMsCisJCQkgICAgICAgZW51bSBwb3J0X21zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgbXMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTVNTTV9FVkVOVF9USU1FT1VUOgorCQkvKgorCQkgKiBSZXRyeSBUaW1lciBFeHBpcmVkLiBSZS1zZW5kCisJCSAqLworCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fcGxvZ2lfc2VuZGluZyk7CisJCWJmYV9mY3NfcG9ydF9tc19zZW5kX3Bsb2dpKG1zLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIE1TU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fb2ZmbGluZSk7CisJCWJmYV90aW1lcl9zdG9wKCZtcy0+dGltZXIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X21zX3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJICBlbnVtIHBvcnRfbXNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBtcy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBNU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX29mZmxpbmUpOworCQkvKgorCQkgKiBub3cgaW52b2tlIE1TIHJlbGF0ZWQgc3ViLW1vZHVsZXMKKwkJICovCisJCWJmYV9mY3NfcG9ydF9mZG1pX29mZmxpbmUobXMpOworCQlicmVhazsKKworCWNhc2UgTVNTTV9FVkVOVF9QT1JUX0ZBQlJJQ19SU0NOOgorCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fZ2ZuX3NlbmRpbmcpOworCQltcy0+cmV0cnlfY250ID0gMDsKKwkJYmZhX2Zjc19wb3J0X21zX3NlbmRfZ2ZuKG1zLCBOVUxMKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9tc19zbV9nbWFsX3NlbmRpbmcoc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcywKKwkJCQllbnVtIHBvcnRfbXNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBtcy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBNU1NNX0VWRU5UX0ZDWFBfU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX2dtYWwpOworCQlicmVhazsKKworCWNhc2UgTVNTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG1zLT5wb3J0KSwKKwkJCQkgICAgICAgJm1zLT5mY3hwX3dxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfc21fZ21hbChzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLCBlbnVtIHBvcnRfbXNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBtcy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBNU1NNX0VWRU5UX1JTUF9FUlJPUjoKKwkJLyoKKwkJICogU3RhcnQgdGltZXIgZm9yIGEgZGVsYXllZCByZXRyeQorCQkgKi8KKwkJaWYgKG1zLT5yZXRyeV9jbnQrKyA8IEJGQV9GQ1NfTVNfQ01EX01BWF9SRVRSSUVTKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fZ21hbF9yZXRyeSk7CisJCQliZmFfdGltZXJfc3RhcnQoQkZBX0ZDU19HRVRfSEFMX0ZST01fUE9SVChtcy0+cG9ydCksCisJCQkJCSZtcy0+dGltZXIsIGJmYV9mY3NfcG9ydF9tc190aW1lb3V0LCBtcywKKwkJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9nZm5fc2VuZGluZyk7CisJCQliZmFfZmNzX3BvcnRfbXNfc2VuZF9nZm4obXMsIE5VTEwpOworCQkJbXMtPnJldHJ5X2NudCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1TU01fRVZFTlRfUlNQX09LOgorCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fZ2ZuX3NlbmRpbmcpOworCQliZmFfZmNzX3BvcnRfbXNfc2VuZF9nZm4obXMsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgTVNTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfZGlzY2FyZChtcy0+ZmN4cCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfc21fZ21hbF9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJICAgICAgZW51bSBwb3J0X21zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgbXMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTVNTTV9FVkVOVF9USU1FT1VUOgorCQkvKgorCQkgKiBSZXRyeSBUaW1lciBFeHBpcmVkLiBSZS1zZW5kCisJCSAqLworCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fZ21hbF9zZW5kaW5nKTsKKwkJYmZhX2Zjc19wb3J0X21zX3NlbmRfZ21hbChtcywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBNU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmbXMtPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAgbXNfcHZ0IE1TIGxvY2FsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfc2VuZF9nbWFsKHZvaWQgKm1zX2NiYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMgPSBtc19jYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBtcy0+cG9ydDsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJaW50ICAgICAgICAgICAgIGxlbjsKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5waWQpOworCisJZmN4cCA9IGZjeHBfYWxsb2NlZCA/IGZjeHBfYWxsb2NlZCA6IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkgeworCQliZmFfZmN4cF9hbGxvY193YWl0KHBvcnQtPmZjcy0+YmZhLCAmbXMtPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3BvcnRfbXNfc2VuZF9nbWFsLCBtcyk7CisJCXJldHVybjsKKwl9CisJbXMtPmZjeHAgPSBmY3hwOworCisJbGVuID0gZmNfZ21hbF9yZXFfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksCisJCQkJYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLAorCQkJCWJmYV9scHNfZ2V0X3BlZXJfbnd3bihwb3J0LT5mYWJyaWMtPmxwcykpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19wb3J0X21zX2dtYWxfcmVzcG9uc2UsCisJCSAgICAgICh2b2lkICopbXMsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKworCWJmYV9zbV9zZW5kX2V2ZW50KG1zLCBNU1NNX0VWRU5UX0ZDWFBfU0VOVCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfZ21hbF9yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJICAgICAgdm9pZCAqY2JhcmcsIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJICAgICAgdTMyIHJzcF9sZW4sIHUzMiByZXNpZF9sZW4sCisJCQkgICAgICBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zID0gKHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqKWNiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG1zLT5wb3J0OworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSBOVUxMOworCXN0cnVjdCBmY2dzX2dtYWxfcmVzcF9zICpnbWFsX3Jlc3A7CisJc3RydWN0IGZjX2dtYWxfZW50cnlfcyAqZ21hbF9lbnRyeTsKKwl1MzIgICAgICAgIG51bV9lbnRyaWVzOworCXU4ICAgICAgICAqcnNwX3N0cjsKKworCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisKKwkvKgorCSAqIFNhbml0eSBDaGVja3MKKwkgKi8KKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobXMsIE1TU01fRVZFTlRfUlNQX0VSUk9SKTsKKwkJcmV0dXJuOworCX0KKworCWN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCWN0aGRyLT5jbWRfcnNwX2NvZGUgPSBiZmFfb3NfbnRvaHMoY3RoZHItPmNtZF9yc3BfY29kZSk7CisKKwlpZiAoY3RoZHItPmNtZF9yc3BfY29kZSA9PSBDVF9SU1BfQUNDRVBUKSB7CisJCWdtYWxfcmVzcCA9IChzdHJ1Y3QgZmNnc19nbWFsX3Jlc3BfcyAqKShjdGhkciArIDEpOworCQludW1fZW50cmllcyA9IGJmYV9vc19udG9obChnbWFsX3Jlc3AtPm1zX2xlbik7CisJCWlmIChudW1fZW50cmllcyA9PSAwKSB7CisJCQliZmFfc21fc2VuZF9ldmVudChtcywgTVNTTV9FVkVOVF9SU1BfRVJST1IpOworCQkJcmV0dXJuOworCQl9CisJCS8qCisJCSAqIFRoZSByZXNwb25zZSBjb3VsZCBjb250YWluIG11bHRpcGxlIEVudHJpZXMuCisJCSAqIEVudHJpZXMgZm9yIFNOTVAgaW50ZXJmYWNlLCBldGMuCisJCSAqIFdlIGxvb2sgZm9yIHRoZSBlbnRyeSB3aXRoIGEgdGVsbmV0IHByZWZpeC4KKwkJICogRmlyc3QgImh0dHA6Ly8iIGVudHJ5IHJlZmVycyB0byBJUCBhZGRyCisJCSAqLworCisJCWdtYWxfZW50cnkgPSAoc3RydWN0IGZjX2dtYWxfZW50cnlfcyAqKWdtYWxfcmVzcC0+bXNfbWE7CisJCXdoaWxlIChudW1fZW50cmllcyA+IDApIHsKKwkJCWlmIChzdHJuY21wCisJCQkgICAgKGdtYWxfZW50cnktPnByZWZpeCwgQ1RfR01BTF9SRVNQX1BSRUZJWF9IVFRQLAorCQkJICAgICBzaXplb2YoZ21hbF9lbnRyeS0+cHJlZml4KSkgPT0gMCkgeworCisJCQkJLyoKKwkJCQkgKiBpZiB0aGUgSVAgYWRkcmVzcyBpcyB0ZXJtaW5hdGluZyB3aXRoIGEgJy8nLAorCQkJCSAqIHJlbW92ZSBpdC4gKkJ5dGUgMCBjb25zaXN0cyBvZiB0aGUgbGVuZ3RoCisJCQkJICogb2YgdGhlIHN0cmluZy4KKwkJCQkgKi8KKwkJCQlyc3Bfc3RyID0gJihnbWFsX2VudHJ5LT5wcmVmaXhbMF0pOworCQkJCWlmIChyc3Bfc3RyW2dtYWxfZW50cnktPmxlbiAtIDFdID09ICcvJykKKwkJCQkJcnNwX3N0cltnbWFsX2VudHJ5LT5sZW4gLSAxXSA9IDA7CisJCQkJLyoKKwkJCQkgKiBjb3B5IElQIEFkZHJlc3MgdG8gZmFicmljCisJCQkJICovCisJCQkJc3RybmNweShiZmFfZmNzX3BvcnRfZ2V0X2ZhYnJpY19pcGFkZHIocG9ydCksCisJCQkJCWdtYWxfZW50cnktPmlwX2FkZHIsCisJCQkJCUJGQV9GQ1NfRkFCUklDX0lQQUREUl9TWik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS0tbnVtX2VudHJpZXM7CisJCQkJKytnbWFsX2VudHJ5OworCQkJfQorCQl9CisKKwkJYmZhX3NtX3NlbmRfZXZlbnQobXMsIE1TU01fRVZFTlRfUlNQX09LKTsKKwkJcmV0dXJuOworCX0KKworCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+cmVhc29uX2NvZGUpOworCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+ZXhwX2NvZGUpOworCWJmYV9zbV9zZW5kX2V2ZW50KG1zLCBNU1NNX0VWRU5UX1JTUF9FUlJPUik7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfc21fZ2ZuX3NlbmRpbmcoc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcywKKwkJCSAgICAgICBlbnVtIHBvcnRfbXNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBtcy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBNU1NNX0VWRU5UX0ZDWFBfU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX2dmbik7CisJCWJyZWFrOworCisJY2FzZSBNU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQobXMtPnBvcnQpLAorCQkJCSAgICAgICAmbXMtPmZjeHBfd3FlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9tc19zbV9nZm4oc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcywgZW51bSBwb3J0X21zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgbXMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobXMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTVNTTV9FVkVOVF9SU1BfRVJST1I6CisJCS8qCisJCSAqIFN0YXJ0IHRpbWVyIGZvciBhIGRlbGF5ZWQgcmV0cnkKKwkJICovCisJCWlmIChtcy0+cmV0cnlfY250KysgPCBCRkFfRkNTX01TX0NNRF9NQVhfUkVUUklFUykgeworCQkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX2dmbl9yZXRyeSk7CisJCQliZmFfdGltZXJfc3RhcnQoQkZBX0ZDU19HRVRfSEFMX0ZST01fUE9SVChtcy0+cG9ydCksCisJCQkJCSZtcy0+dGltZXIsIGJmYV9mY3NfcG9ydF9tc190aW1lb3V0LCBtcywKKwkJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9vbmxpbmUpOworCQkJbXMtPnJldHJ5X2NudCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1TU01fRVZFTlRfUlNQX09LOgorCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fb25saW5lKTsKKwkJYnJlYWs7CisKKwljYXNlIE1TU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKG1zLCBiZmFfZmNzX3BvcnRfbXNfc21fb2ZmbGluZSk7CisJCWJmYV9mY3hwX2Rpc2NhcmQobXMtPmZjeHApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X21zX3NtX2dmbl9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zLAorCQkJICAgICBlbnVtIHBvcnRfbXNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBtcy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhtcy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBNU1NNX0VWRU5UX1RJTUVPVVQ6CisJCS8qCisJCSAqIFJldHJ5IFRpbWVyIEV4cGlyZWQuIFJlLXNlbmQKKwkJICovCisJCWJmYV9zbV9zZXRfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9nZm5fc2VuZGluZyk7CisJCWJmYV9mY3NfcG9ydF9tc19zZW5kX2dmbihtcywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBNU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmbXMtPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAgbXNfcHZ0IE1TIGxvY2FsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfc2VuZF9nZm4odm9pZCAqbXNfY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcyA9IG1zX2NiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG1zLT5wb3J0OworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNoczsKKwlpbnQgICAgICAgICAgICAgbGVuOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBpZCk7CisKKwlmY3hwID0gZmN4cF9hbGxvY2VkID8gZmN4cF9hbGxvY2VkIDogYmZhX2Zjc19mY3hwX2FsbG9jKHBvcnQtPmZjcyk7CisJaWYgKCFmY3hwKSB7CisJCWJmYV9mY3hwX2FsbG9jX3dhaXQocG9ydC0+ZmNzLT5iZmEsICZtcy0+ZmN4cF93cWUsCisJCQkJICAgIGJmYV9mY3NfcG9ydF9tc19zZW5kX2dmbiwgbXMpOworCQlyZXR1cm47CisJfQorCW1zLT5mY3hwID0gZmN4cDsKKworCWxlbiA9IGZjX2dmbl9yZXFfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksCisJCQkgICAgICAgYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLAorCQkJICAgICAgIGJmYV9scHNfZ2V0X3BlZXJfbnd3bihwb3J0LT5mYWJyaWMtPmxwcykpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19wb3J0X21zX2dmbl9yZXNwb25zZSwKKwkJICAgICAgKHZvaWQgKiltcywgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCisJYmZhX3NtX3NlbmRfZXZlbnQobXMsIE1TU01fRVZFTlRfRkNYUF9TRU5UKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9tc19nZm5fcmVzcG9uc2Uodm9pZCAqZmNzYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwgdm9pZCAqY2JhcmcsCisJCQkgICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLCB1MzIgcnNwX2xlbiwKKwkJCSAgICAgICB1MzIgcmVzaWRfbGVuLCBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKm1zID0gKHN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqKWNiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG1zLT5wb3J0OworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSBOVUxMOworCXd3bl90ICAgICAgICAgICpnZm5fcmVzcDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisKKwkvKgorCSAqIFNhbml0eSBDaGVja3MKKwkgKi8KKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobXMsIE1TU01fRVZFTlRfUlNQX0VSUk9SKTsKKwkJcmV0dXJuOworCX0KKworCWN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCWN0aGRyLT5jbWRfcnNwX2NvZGUgPSBiZmFfb3NfbnRvaHMoY3RoZHItPmNtZF9yc3BfY29kZSk7CisKKwlpZiAoY3RoZHItPmNtZF9yc3BfY29kZSA9PSBDVF9SU1BfQUNDRVBUKSB7CisJCWdmbl9yZXNwID0gKHd3bl90ICopIChjdGhkciArIDEpOworCQkvKgorCQkgKiBjaGVjayBpZiBpdCBoYXMgYWN0dWFsbHkgY2hhbmdlZAorCQkgKi8KKwkJaWYgKChtZW1jbXAKKwkJICAgICAoKHZvaWQgKikmYmZhX2Zjc19wb3J0X2dldF9mYWJyaWNfbmFtZShwb3J0KSwgZ2ZuX3Jlc3AsCisJCSAgICAgIHNpemVvZih3d25fdCkpICE9IDApKQorCQkJYmZhX2Zjc19mYWJyaWNfc2V0X2ZhYnJpY19uYW1lKHBvcnQtPmZhYnJpYywgKmdmbl9yZXNwKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobXMsIE1TU01fRVZFTlRfUlNQX09LKTsKKwkJcmV0dXJuOworCX0KKworCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+cmVhc29uX2NvZGUpOworCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+ZXhwX2NvZGUpOworCWJmYV9zbV9zZW5kX2V2ZW50KG1zLCBNU1NNX0VWRU5UX1JTUF9FUlJPUik7Cit9CisKKy8qKgorICogIG1zX3B2dCBNUyBsb2NhbCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X21zX3NlbmRfcGxvZ2kodm9pZCAqbXNfY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcyA9IG1zX2NiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG1zLT5wb3J0OworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNoczsKKwlpbnQgICAgICAgICAgICAgbGVuOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBpZCk7CisKKwlmY3hwID0gZmN4cF9hbGxvY2VkID8gZmN4cF9hbGxvY2VkIDogYmZhX2Zjc19mY3hwX2FsbG9jKHBvcnQtPmZjcyk7CisJaWYgKCFmY3hwKSB7CisJCXBvcnQtPnN0YXRzLm1zX3Bsb2dpX2FsbG9jX3dhaXQrKzsKKwkJYmZhX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJm1zLT5mY3hwX3dxZSwKKwkJCQkgICAgYmZhX2Zjc19wb3J0X21zX3NlbmRfcGxvZ2ksIG1zKTsKKwkJcmV0dXJuOworCX0KKwltcy0+ZmN4cCA9IGZjeHA7CisKKwlsZW4gPSBmY19wbG9naV9idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwKKwkJCSAgICAgYmZhX29zX2h0b24zYihGQ19NR01UX1NFUlZFUiksCisJCQkgICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgMCwKKwkJCSAgICAgcG9ydC0+cG9ydF9jZmcucHd3biwgcG9ydC0+cG9ydF9jZmcubnd3biwKKwkJCSAgICAgYmZhX3Bwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCisJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcG9ydF9tc19wbG9naV9yZXNwb25zZSwKKwkJICAgICAgKHZvaWQgKiltcywgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCisJcG9ydC0+c3RhdHMubXNfcGxvZ2lfc2VudCsrOworCWJmYV9zbV9zZW5kX2V2ZW50KG1zLCBNU1NNX0VWRU5UX0ZDWFBfU0VOVCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbXNfcGxvZ2lfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCSAgICAgICB2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkgICAgICAgdTMyIHJzcF9sZW4sIHUzMiByZXNpZF9sZW4sCisJCQkgICAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcyA9IChzdHJ1Y3QgYmZhX2Zjc19wb3J0X21zX3MgKiljYmFyZzsKKworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG1zLT5wb3J0OworCXN0cnVjdCBmY19lbHNfY21kX3MgICAqZWxzX2NtZDsKKwlzdHJ1Y3QgZmNfbHNfcmp0X3MgICAgKmxzX3JqdDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisKKwkvKgorCSAqIFNhbml0eSBDaGVja3MKKwkgKi8KKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCXBvcnQtPnN0YXRzLm1zX3Bsb2dpX3JzcF9lcnIrKzsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIHJlcV9zdGF0dXMpOworCQliZmFfc21fc2VuZF9ldmVudChtcywgTVNTTV9FVkVOVF9SU1BfRVJST1IpOworCQlyZXR1cm47CisJfQorCisJZWxzX2NtZCA9IChzdHJ1Y3QgZmNfZWxzX2NtZF9zICopIEJGQV9GQ1hQX1JTUF9QTEQoZmN4cCk7CisKKwlzd2l0Y2ggKGVsc19jbWQtPmVsc19jb2RlKSB7CisKKwljYXNlIEZDX0VMU19BQ0M6CisJCWlmIChyc3BfbGVuIDwgc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpKSB7CisJCQliZmFfdHJjKHBvcnQtPmZjcywgcnNwX2xlbik7CisJCQlwb3J0LT5zdGF0cy5tc19wbG9naV9hY2NfZXJyKys7CisJCQliZmFfc21fc2VuZF9ldmVudChtcywgTVNTTV9FVkVOVF9SU1BfRVJST1IpOworCQkJYnJlYWs7CisJCX0KKwkJcG9ydC0+c3RhdHMubXNfcGxvZ2lfYWNjZXB0cysrOworCQliZmFfc21fc2VuZF9ldmVudChtcywgTVNTTV9FVkVOVF9SU1BfT0spOworCQlicmVhazsKKworCWNhc2UgRkNfRUxTX0xTX1JKVDoKKwkJbHNfcmp0ID0gKHN0cnVjdCBmY19sc19yanRfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCisJCWJmYV90cmMocG9ydC0+ZmNzLCBsc19yanQtPnJlYXNvbl9jb2RlKTsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGVfZXhwbCk7CisKKwkJcG9ydC0+c3RhdHMubXNfcmVqZWN0cysrOworCQliZmFfc21fc2VuZF9ldmVudChtcywgTVNTTV9FVkVOVF9SU1BfRVJST1IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXBvcnQtPnN0YXRzLm1zX3Bsb2dpX3Vua25vd25fcnNwKys7CisJCWJmYV90cmMocG9ydC0+ZmNzLCBlbHNfY21kLT5lbHNfY29kZSk7CisJCWJmYV9zbV9zZW5kX2V2ZW50KG1zLCBNU1NNX0VWRU5UX1JTUF9FUlJPUik7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X21zX3RpbWVvdXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICopYXJnOworCisJbXMtPnBvcnQtPnN0YXRzLm1zX3RpbWVvdXRzKys7CisJYmZhX3NtX3NlbmRfZXZlbnQobXMsIE1TU01fRVZFTlRfVElNRU9VVCk7Cit9CisKKwordm9pZAorYmZhX2Zjc19wb3J0X21zX2luaXQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMgPSBCRkFfRkNTX0dFVF9NU19GUk9NX1BPUlQocG9ydCk7CisKKwltcy0+cG9ydCA9IHBvcnQ7CisJYmZhX3NtX3NldF9zdGF0ZShtcywgYmZhX2Zjc19wb3J0X21zX3NtX29mZmxpbmUpOworCisJLyoKKwkgKiBJbnZva2UgaW5pdCByb3V0aW5lcyBvZiBzdWIgbW9kdWxlcy4KKwkgKi8KKwliZmFfZmNzX3BvcnRfZmRtaV9pbml0KG1zKTsKK30KKwordm9pZAorYmZhX2Zjc19wb3J0X21zX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbXNfcyAqbXMgPSBCRkFfRkNTX0dFVF9NU19GUk9NX1BPUlQocG9ydCk7CisKKwltcy0+cG9ydCA9IHBvcnQ7CisJYmZhX3NtX3NlbmRfZXZlbnQobXMsIE1TU01fRVZFTlRfUE9SVF9PRkZMSU5FKTsKK30KKwordm9pZAorYmZhX2Zjc19wb3J0X21zX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcyA9IEJGQV9GQ1NfR0VUX01TX0ZST01fUE9SVChwb3J0KTsKKworCW1zLT5wb3J0ID0gcG9ydDsKKwliZmFfc21fc2VuZF9ldmVudChtcywgTVNTTV9FVkVOVF9QT1JUX09OTElORSk7Cit9CisKK3ZvaWQKK2JmYV9mY3NfcG9ydF9tc19mYWJyaWNfcnNjbihzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9tc19zICptcyA9IEJGQV9GQ1NfR0VUX01TX0ZST01fUE9SVChwb3J0KTsKKworCS8qCisJICogQHRvZG8uICBIYW5kbGUgdGhpcyBvbmx5IHdoZW4gaW4gT25saW5lIHN0YXRlCisJICovCisJaWYgKGJmYV9zbV9jbXBfc3RhdGUobXMsIGJmYV9mY3NfcG9ydF9tc19zbV9vbmxpbmUpKQorCQliZmFfc21fc2VuZF9ldmVudChtcywgTVNTTV9FVkVOVF9QT1JUX0ZBQlJJQ19SU0NOKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvbjJuLmMgYi9kcml2ZXJzL3Njc2kvYmZhL24ybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTQ1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL24ybi5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIG4ybi5jIG4ybiBpbXBsZW1lbnRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlICJmY3NfbHBvcnQuaCIKKyNpbmNsdWRlICJmY3NfcnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfdHJjbW9kLmgiCisjaW5jbHVkZSAibHBvcnRfcHJpdi5oIgorCitCRkFfVFJDX0ZJTEUoRkNTLCBOMk4pOworCisvKioKKyAqICAgQ2FsbGVkIGJ5IGZjcy9wb3J0IHRvIGluaXRpYWxpemUgTjJOIHRvcG9sb2d5LgorICovCit2b2lkCitiZmFfZmNzX3BvcnRfbjJuX2luaXQoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworfQorCisvKioKKyAqICAgQ2FsbGVkIGJ5IGZjcy9wb3J0IHRvIG5vdGlmeSB0cmFuc2l0aW9uIHRvIG9ubGluZSBzdGF0ZS4KKyAqLwordm9pZAorYmZhX2Zjc19wb3J0X24ybl9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbjJuX3MgKm4ybl9wb3J0ID0gJnBvcnQtPnBvcnRfdG9wby5wbjJuOworCXN0cnVjdCBiZmFfcG9ydF9jZmdfcyAqcGNmZyA9ICZwb3J0LT5wb3J0X2NmZzsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwY2ZnLT5wd3duKTsKKworCS8qCisJICogSWYgb3VyIFBXV04gaXMgPiB0aGFuIHRoYXQgb2YgdGhlIHItcG9ydCwgd2UgaGF2ZSB0byBpbml0aWF0ZSBQTE9HSQorCSAqIGFuZCBhc3NpZ24gYW4gQWRkcmVzcy4gaWYgbm90LCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGl0cyBQTE9HSS4KKwkgKgorCSAqIElmIG91ciBQV1dOIGlzIDwgdGhhbiB0aGF0IG9mIHRoZSByZW1vdGUgcG9ydCwgaXQgd2lsbCBzZW5kIGEgUExPR0kKKwkgKiB3aXRoIHRoZSBQSURzIGFzc2lnbmVkLiBUaGUgcnBvcnQgc3RhdGUgbWFjaGluZSB0YWtlIGNhcmUgb2YgdGhpcworCSAqIGluY29taW5nIFBMT0dJLgorCSAqLworCWlmIChtZW1jbXAKKwkgICAgKCh2b2lkICopJnBjZmctPnB3d24sICh2b2lkICopJm4ybl9wb3J0LT5yZW1fcG9ydF93d24sCisJICAgICBzaXplb2Yod3duX3QpKSA+IDApIHsKKwkJcG9ydC0+cGlkID0gTjJOX0xPQ0FMX1BJRDsKKwkJLyoqCisJCSAqIEZpcnN0LCBjaGVjayBpZiB3ZSBrbm93IHRoZSBkZXZpY2UgYnkgcHd3bi4KKwkJICovCisJCXJwb3J0ID0gYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9ieV9wd3duKHBvcnQsCisJCQkJCQkgICAgICAgbjJuX3BvcnQtPnJlbV9wb3J0X3d3bik7CisJCWlmIChycG9ydCkgeworCQkJYmZhX3RyYyhwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCQkJYmZhX3RyYyhwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwkJCXJwb3J0LT5waWQgPSBOMk5fUkVNT1RFX1BJRDsKKwkJCWJmYV9mY3NfcnBvcnRfb25saW5lKHJwb3J0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIEluIG4ybiB0aGVyZSBjYW4gYmUgb25seSBvbmUgcnBvcnQuIERlbGV0ZSB0aGUgb2xkIG9uZSB3aG9zZQorCQkgKiBwaWQgc2hvdWxkIGJlIHplcm8sIGJlY2F1c2UgaXQgaXMgb2ZmbGluZS4KKwkJICovCisJCWlmIChwb3J0LT5udW1fcnBvcnRzID4gMCkgeworCQkJcnBvcnQgPSBiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X2J5X3BpZChwb3J0LCAwKTsKKwkJCWJmYV9hc3NlcnQocnBvcnQgIT0gTlVMTCk7CisJCQlpZiAocnBvcnQpIHsKKwkJCQliZmFfdHJjKHBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCQkJCWJmYV9mY3NfcnBvcnRfZGVsZXRlKHJwb3J0KTsKKwkJCX0KKwkJfQorCQliZmFfZmNzX3Jwb3J0X2NyZWF0ZShwb3J0LCBOMk5fUkVNT1RFX1BJRCk7CisJfQorfQorCisvKioKKyAqICAgQ2FsbGVkIGJ5IGZjcy9wb3J0IHRvIG5vdGlmeSB0cmFuc2l0aW9uIHRvIG9mZmxpbmUgc3RhdGUuCisgKi8KK3ZvaWQKK2JmYV9mY3NfcG9ydF9uMm5fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9uMm5fcyAqbjJuX3BvcnQgPSAmcG9ydC0+cG9ydF90b3BvLnBuMm47CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cGlkKTsKKwlwb3J0LT5waWQgPSAwOworCW4ybl9wb3J0LT5yZW1fcG9ydF93d24gPSAwOworCW4ybl9wb3J0LT5yZXBseV9veGlkID0gMDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL25zLmMgYi9kcml2ZXJzL3Njc2kvYmZhL25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmZWE5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvbnMuYwpAQCAtMCwwICsxLDEyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiBAcGFnZSBuc19zbV9pbmZvIFZQT1JUIE5TIFN0YXRlIE1hY2hpbmUKKyAqCisgKiBAc2VjdGlvbiBuc19zbV9pbnRlcmFjdGlvbnMgVlBPUlQgTlMgU3RhdGUgTWFjaGluZSBJbnRlcmFjdGlvbnMKKyAqCisgKiBAc2VjdGlvbiBuc19zbSBWUE9SVCBOUyBTdGF0ZSBNYWNoaW5lCisgKiAJaW1nIG5zX3NtLmpwZworICovCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgPGJmYV9pb2NmYy5oPgorI2luY2x1ZGUgImZjc19scG9ydC5oIgorI2luY2x1ZGUgImZjc19ycG9ydC5oIgorI2luY2x1ZGUgImZjc190cmNtb2QuaCIKKyNpbmNsdWRlICJmY3NfZmN4cC5oIgorI2luY2x1ZGUgImZjcy5oIgorI2luY2x1ZGUgImxwb3J0X3ByaXYuaCIKKworQkZBX1RSQ19GSUxFKEZDUywgTlMpOworCisvKgorICogZm9yd2FyZCBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zZW5kX3Bsb2dpKHZvaWQgKm5zX2NiYXJnLAorCQkJCQkgICBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbnNfc2VuZF9yc3BuX2lkKHZvaWQgKm5zX2NiYXJnLAorCQkJCQkgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zZW5kX3JmdF9pZCh2b2lkICpuc19jYmFyZywKKwkJCQkJICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zZW5kX3JmZl9pZCh2b2lkICpuc19jYmFyZywKKwkJCQkJICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zZW5kX2dpZF9mdCh2b2lkICpuc19jYmFyZywKKwkJCQkJICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc190aW1lb3V0KHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3Bsb2dpX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywKKwkJCQkJICAgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkgICAgICAgdm9pZCAqY2JhcmcsCisJCQkJCSAgICAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQkJICAgICAgIHUzMiByc3BfbGVuLAorCQkJCQkgICAgICAgdTMyIHJlc2lkX2xlbiwKKwkJCQkJICAgICAgIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbnNfcnNwbl9pZF9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCQkgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkJCQkgdm9pZCAqY2JhcmcsCisJCQkJCQkgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCQkgdTMyIHJzcF9sZW4sCisJCQkJCQkgdTMyIHJlc2lkX2xlbiwKKwkJCQkJCSBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3JmdF9pZF9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCQlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQkJCXZvaWQgKmNiYXJnLAorCQkJCQkJYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCQl1MzIgcnNwX2xlbiwKKwkJCQkJCXUzMiByZXNpZF9sZW4sCisJCQkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3JmZl9pZF9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCQlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQkJCXZvaWQgKmNiYXJnLAorCQkJCQkJYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCQl1MzIgcnNwX2xlbiwKKwkJCQkJCXUzMiByZXNpZF9sZW4sCisJCQkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX2dpZF9mdF9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCQlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQkJCXZvaWQgKmNiYXJnLAorCQkJCQkJYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCQl1MzIgcnNwX2xlbiwKKwkJCQkJCXUzMiByZXNpZF9sZW4sCisJCQkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3Byb2Nlc3NfZ2lkZnRfcGlkcyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQkJCQkgICB1MzIgKnBpZF9idWYsCisJCQkJCQkgICB1MzIgbl9waWRzKTsKKworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19ib290X3RhcmdldF9kaXNjKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCk7CisvKioKKyAqICBmY3NfbnNfc20gRkNTIG5hbWVzZXJ2ZXIgaW50ZXJmYWNlIHN0YXRlIG1hY2hpbmUKKyAqLworCisvKioKKyAqIFZQb3J0IE5TIFN0YXRlIE1hY2hpbmUgZXZlbnRzCisgKi8KK2VudW0gdnBvcnRfbnNfZXZlbnQgeworCU5TU01fRVZFTlRfUE9SVF9PTkxJTkUgPSAxLAorCU5TU01fRVZFTlRfUE9SVF9PRkZMSU5FID0gMiwKKwlOU1NNX0VWRU5UX1BMT0dJX1NFTlQgPSAzLAorCU5TU01fRVZFTlRfUlNQX09LID0gNCwKKwlOU1NNX0VWRU5UX1JTUF9FUlJPUiA9IDUsCisJTlNTTV9FVkVOVF9USU1FT1VUID0gNiwKKwlOU1NNX0VWRU5UX05TX1FVRVJZID0gNywKKwlOU1NNX0VWRU5UX1JTUE5JRF9TRU5UID0gOCwKKwlOU1NNX0VWRU5UX1JGVElEX1NFTlQgPSA5LAorCU5TU01fRVZFTlRfUkZGSURfU0VOVCA9IDEwLAorCU5TU01fRVZFTlRfR0lERlRfU0VOVCA9IDExLAorfTsKKworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zbV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkJCSAgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zbV9wbG9naV9zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkJCQkgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3NtX3Bsb2dpKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkJCSBlbnVtIHZwb3J0X25zX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbnNfc21fcGxvZ2lfcmV0cnkoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCQkJICAgICAgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX3JzcG5faWQoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCQkJCSAgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zbV9yc3BuX2lkKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkJCSAgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zbV9yc3BuX2lkX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkJCQkgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3NtX3NlbmRpbmdfcmZ0X2lkKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkJCQkgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zbV9yZnRfaWRfcmV0cnkoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCQkJCWVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zbV9yZnRfaWQoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCQkJICBlbnVtIHZwb3J0X25zX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbnNfc21fc2VuZGluZ19yZmZfaWQoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCQkJCSAgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3NtX3JmZl9pZF9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCQkJZW51bSB2cG9ydF9uc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3NtX3JmZl9pZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCQkgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX2dpZF9mdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCQkJICBlbnVtIHZwb3J0X25zX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfbnNfc21fZ2lkX2Z0KHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkJCSAgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3NtX2dpZF9mdF9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCQkJZW51bSB2cG9ydF9uc19ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X25zX3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCQkgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpOworLyoqCisgKiAJCVN0YXJ0IGluIG9mZmxpbmUgc3RhdGUgLSBhd2FpdGluZyBsaW5rdXAKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkgICBlbnVtIHZwb3J0X25zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobnMtPnBvcnQtPmZjcywgbnMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobnMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTlNTTV9FVkVOVF9QT1JUX09OTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX3Bsb2dpX3NlbmRpbmcpOworCQliZmFfZmNzX3BvcnRfbnNfc2VuZF9wbG9naShucywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9wbG9naV9zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkJIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBucy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOU1NNX0VWRU5UX1BMT0dJX1NFTlQ6CisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9wbG9naSk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQobnMtPnBvcnQpLAorCQkJCSAgICAgICAmbnMtPmZjeHBfd3FlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9wbG9naShzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBucy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOU1NNX0VWRU5UX1JTUF9FUlJPUjoKKwkJLyoKKwkJICogU3RhcnQgdGltZXIgZm9yIGEgZGVsYXllZCByZXRyeQorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX3Bsb2dpX3JldHJ5KTsKKwkJbnMtPnBvcnQtPnN0YXRzLm5zX3JldHJpZXMrKzsKKwkJYmZhX3RpbWVyX3N0YXJ0KEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQobnMtPnBvcnQpLCAmbnMtPnRpbWVyLAorCQkJCWJmYV9mY3NfcG9ydF9uc190aW1lb3V0LCBucywKKwkJCQlCRkFfRkNTX1JFVFJZX1RJTUVPVVQpOworCQlicmVhazsKKworCWNhc2UgTlNTTV9FVkVOVF9SU1BfT0s6CisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX3JzcG5faWQpOworCQliZmFfZmNzX3BvcnRfbnNfc2VuZF9yc3BuX2lkKG5zLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIE5TU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fb2ZmbGluZSk7CisJCWJmYV9mY3hwX2Rpc2NhcmQobnMtPmZjeHApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X25zX3NtX3Bsb2dpX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkgICAgICAgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIG5zLT5wb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5TU01fRVZFTlRfVElNRU9VVDoKKwkJLyoKKwkJICogUmV0cnkgVGltZXIgRXhwaXJlZC4gUmUtc2VuZAorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX3Bsb2dpX3NlbmRpbmcpOworCQliZmFfZmNzX3BvcnRfbnNfc2VuZF9wbG9naShucywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmbnMtPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX3JzcG5faWQoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCQkgICBlbnVtIHZwb3J0X25zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobnMtPnBvcnQtPmZjcywgbnMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobnMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTlNTTV9FVkVOVF9SU1BOSURfU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX3JzcG5faWQpOworCQlicmVhazsKKworCWNhc2UgTlNTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG5zLT5wb3J0KSwKKwkJCQkgICAgICAgJm5zLT5mY3hwX3dxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbnNfc21fcnNwbl9pZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJICAgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIG5zLT5wb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5TU01fRVZFTlRfUlNQX0VSUk9SOgorCQkvKgorCQkgKiBTdGFydCB0aW1lciBmb3IgYSBkZWxheWVkIHJldHJ5CisJCSAqLworCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fcnNwbl9pZF9yZXRyeSk7CisJCW5zLT5wb3J0LT5zdGF0cy5uc19yZXRyaWVzKys7CisJCWJmYV90aW1lcl9zdGFydChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG5zLT5wb3J0KSwgJm5zLT50aW1lciwKKwkJCQliZmFfZmNzX3BvcnRfbnNfdGltZW91dCwgbnMsCisJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIE5TU01fRVZFTlRfUlNQX09LOgorCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fc2VuZGluZ19yZnRfaWQpOworCQliZmFfZmNzX3BvcnRfbnNfc2VuZF9yZnRfaWQobnMsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgTlNTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9mY3hwX2Rpc2NhcmQobnMtPmZjeHApOworCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fb2ZmbGluZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbnNfc21fcnNwbl9pZF9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCSBlbnVtIHZwb3J0X25zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobnMtPnBvcnQtPmZjcywgbnMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobnMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTlNTTV9FVkVOVF9USU1FT1VUOgorCQkvKgorCQkgKiBSZXRyeSBUaW1lciBFeHBpcmVkLiBSZS1zZW5kCisJCSAqLworCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fc2VuZGluZ19yc3BuX2lkKTsKKwkJYmZhX2Zjc19wb3J0X25zX3NlbmRfcnNwbl9pZChucywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmbnMtPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX3JmdF9pZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCSAgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIG5zLT5wb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5TU01fRVZFTlRfUkZUSURfU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX3JmdF9pZCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQobnMtPnBvcnQpLAorCQkJCSAgICAgICAmbnMtPmZjeHBfd3FlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9yZnRfaWQoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCSAgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIG5zLT5wb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5TU01fRVZFTlRfUlNQX09LOgorCQkvKgorCQkgKiBOb3cgbW92ZSB0byByZWdpc3RlciBGQzQgRmVhdHVyZXMKKwkJICovCisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX3JmZl9pZCk7CisJCWJmYV9mY3NfcG9ydF9uc19zZW5kX3JmZl9pZChucywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1JTUF9FUlJPUjoKKwkJLyoKKwkJICogU3RhcnQgdGltZXIgZm9yIGEgZGVsYXllZCByZXRyeQorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX3JmdF9pZF9yZXRyeSk7CisJCW5zLT5wb3J0LT5zdGF0cy5uc19yZXRyaWVzKys7CisJCWJmYV90aW1lcl9zdGFydChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG5zLT5wb3J0KSwgJm5zLT50aW1lciwKKwkJCQliZmFfZmNzX3BvcnRfbnNfdGltZW91dCwgbnMsCisJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIE5TU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fb2ZmbGluZSk7CisJCWJmYV9mY3hwX2Rpc2NhcmQobnMtPmZjeHApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X25zX3NtX3JmdF9pZF9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCWVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBucy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOU1NNX0VWRU5UX1RJTUVPVVQ6CisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX3JmdF9pZCk7CisJCWJmYV9mY3NfcG9ydF9uc19zZW5kX3JmdF9pZChucywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmbnMtPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX3JmZl9pZChzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCSAgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIG5zLT5wb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5TU01fRVZFTlRfUkZGSURfU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX3JmZl9pZCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKEJGQV9GQ1NfR0VUX0hBTF9GUk9NX1BPUlQobnMtPnBvcnQpLAorCQkJCSAgICAgICAmbnMtPmZjeHBfd3FlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9yZmZfaWQoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCSAgZW51bSB2cG9ydF9uc19ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIG5zLT5wb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKG5zLT5wb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5TU01fRVZFTlRfUlNQX09LOgorCisJCS8qCisJCSAqIElmIG1pbiBjZmcgbW9kZSBpcyBlbmFibGVkLCB3ZSBkb25vdCBpbml0aWF0ZSBycG9ydAorCQkgKiBkaXNjb3Zlcnkgd2l0aCB0aGUgZmFicmljLiBJbnN0ZWFkLCB3ZSB3aWxsIHJldHJpZXZlIHRoZQorCQkgKiBib290IHRhcmdldHMgZnJvbSBIQUwvRlcuCisJCSAqLworCQlpZiAoX19mY3NfbWluX2NmZyhucy0+cG9ydC0+ZmNzKSkgeworCQkJYmZhX2Zjc19wb3J0X25zX2Jvb3RfdGFyZ2V0X2Rpc2MobnMtPnBvcnQpOworCQkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29ubGluZSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgcG9ydCByb2xlIGlzIEluaXRpYXRvciBNb2RlIGlzc3VlIE5TIHF1ZXJ5LgorCQkgKiBJZiBpdCBpcyBUYXJnZXQgTW9kZSwgc2tpcCB0aGlzIGFuZCBnbyB0byBvbmxpbmUuCisJCSAqLworCQlpZiAoQkZBX0ZDU19WUE9SVF9JU19JTklUSUFUT1JfTU9ERShucy0+cG9ydCkpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX2dpZF9mdCk7CisJCQliZmFfZmNzX3BvcnRfbnNfc2VuZF9naWRfZnQobnMsIE5VTEwpOworCQl9IGVsc2UgaWYgKEJGQV9GQ1NfVlBPUlRfSVNfVEFSR0VUX01PREUobnMtPnBvcnQpKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fb25saW5lKTsKKwkJfQorCQkvKgorCQkgKiBraWNrIG9mZiBtZ210IHNydnIgc3RhdGUgbWFjaGluZQorCQkgKi8KKwkJYmZhX2Zjc19wb3J0X21zX29ubGluZShucy0+cG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1JTUF9FUlJPUjoKKwkJLyoKKwkJICogU3RhcnQgdGltZXIgZm9yIGEgZGVsYXllZCByZXRyeQorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX3JmZl9pZF9yZXRyeSk7CisJCW5zLT5wb3J0LT5zdGF0cy5uc19yZXRyaWVzKys7CisJCWJmYV90aW1lcl9zdGFydChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG5zLT5wb3J0KSwgJm5zLT50aW1lciwKKwkJCQliZmFfZmNzX3BvcnRfbnNfdGltZW91dCwgbnMsCisJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIE5TU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fb2ZmbGluZSk7CisJCWJmYV9mY3hwX2Rpc2NhcmQobnMtPmZjeHApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X25zX3NtX3JmZl9pZF9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zLAorCQkJCWVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBucy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOU1NNX0VWRU5UX1RJTUVPVVQ6CisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9zZW5kaW5nX3JmZl9pZCk7CisJCWJmYV9mY3NfcG9ydF9uc19zZW5kX3JmZl9pZChucywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmbnMtPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbnNfc21fc2VuZGluZ19naWRfZnQoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCQkgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBucy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOU1NNX0VWRU5UX0dJREZUX1NFTlQ6CisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9naWRfZnQpOworCQlicmVhazsKKworCWNhc2UgTlNTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChCRkFfRkNTX0dFVF9IQUxfRlJPTV9QT1JUKG5zLT5wb3J0KSwKKwkJCQkgICAgICAgJm5zLT5mY3hwX3dxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbnNfc21fZ2lkX2Z0KHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBucy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOU1NNX0VWRU5UX1JTUF9PSzoKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29ubGluZSk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1JTUF9FUlJPUjoKKwkJLyoKKwkJICogVEJEOiBmb3IgY2VydGFpbiByZWplY3QgY29kZXMsIHdlIGRvbid0IG5lZWQgdG8gcmV0cnkKKwkJICovCisJCS8qCisJCSAqIFN0YXJ0IHRpbWVyIGZvciBhIGRlbGF5ZWQgcmV0cnkKKwkJICovCisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9naWRfZnRfcmV0cnkpOworCQlucy0+cG9ydC0+c3RhdHMubnNfcmV0cmllcysrOworCQliZmFfdGltZXJfc3RhcnQoQkZBX0ZDU19HRVRfSEFMX0ZST01fUE9SVChucy0+cG9ydCksICZucy0+dGltZXIsCisJCQkJYmZhX2Zjc19wb3J0X25zX3RpbWVvdXQsIG5zLAorCQkJCUJGQV9GQ1NfUkVUUllfVElNRU9VVCk7CisJCWJyZWFrOworCisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF9kaXNjYXJkKG5zLT5mY3hwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zbV9naWRfZnRfcmV0cnkoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucywKKwkJCQllbnVtIHZwb3J0X25zX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMobnMtPnBvcnQtPmZjcywgbnMtPnBvcnQtPnBvcnRfY2ZnLnB3d24pOworCWJmYV90cmMobnMtPnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTlNTTV9FVkVOVF9USU1FT1VUOgorCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fc2VuZGluZ19naWRfZnQpOworCQliZmFfZmNzX3BvcnRfbnNfc2VuZF9naWRfZnQobnMsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgTlNTTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9vZmZsaW5lKTsKKwkJYmZhX3RpbWVyX3N0b3AoJm5zLT50aW1lcik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbnNfc21fb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMsCisJCQkgIGVudW0gdnBvcnRfbnNfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBucy0+cG9ydC0+cG9ydF9jZmcucHd3bik7CisJYmZhX3RyYyhucy0+cG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOU1NNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShucywgYmZhX2Zjc19wb3J0X25zX3NtX29mZmxpbmUpOworCQlicmVhazsKKworCWNhc2UgTlNTTV9FVkVOVF9OU19RVUVSWToKKwkJLyoKKwkJICogSWYgdGhlIHBvcnQgcm9sZSBpcyBJbml0aWF0b3IgTW9kZSBpc3N1ZSBOUyBxdWVyeS4KKwkJICogSWYgaXQgaXMgVGFyZ2V0IE1vZGUsIHNraXAgdGhpcyBhbmQgZ28gdG8gb25saW5lLgorCQkgKi8KKwkJaWYgKEJGQV9GQ1NfVlBPUlRfSVNfSU5JVElBVE9SX01PREUobnMtPnBvcnQpKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKG5zLCBiZmFfZmNzX3BvcnRfbnNfc21fc2VuZGluZ19naWRfZnQpOworCQkJYmZhX2Zjc19wb3J0X25zX3NlbmRfZ2lkX2Z0KG5zLCBOVUxMKTsKKwkJfTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisKKy8qKgorICogIG5zX3B2dCBOYW1lc2VydmVyIGxvY2FsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbnNfc2VuZF9wbG9naSh2b2lkICpuc19jYmFyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zID0gbnNfY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gbnMtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCWludCAgICAgICAgICAgICBsZW47CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cGlkKTsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJcG9ydC0+c3RhdHMubnNfcGxvZ2lfYWxsb2Nfd2FpdCsrOworCQliZmFfZmN4cF9hbGxvY193YWl0KHBvcnQtPmZjcy0+YmZhLCAmbnMtPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3BvcnRfbnNfc2VuZF9wbG9naSwgbnMpOworCQlyZXR1cm47CisJfQorCW5zLT5mY3hwID0gZmN4cDsKKworCWxlbiA9IGZjX3Bsb2dpX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLAorCQkJICAgICBiZmFfb3NfaHRvbjNiKEZDX05BTUVfU0VSVkVSKSwKKwkJCSAgICAgYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLCAwLAorCQkJICAgICBwb3J0LT5wb3J0X2NmZy5wd3duLCBwb3J0LT5wb3J0X2NmZy5ud3duLAorCQkJICAgICBiZmFfcHBvcnRfZ2V0X21heGZyc2l6ZShwb3J0LT5mY3MtPmJmYSkpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19wb3J0X25zX3Bsb2dpX3Jlc3BvbnNlLAorCQkgICAgICAodm9pZCAqKW5zLCBGQ19NQVhfUERVU1osIEZDX1JBX1RPVik7CisJcG9ydC0+c3RhdHMubnNfcGxvZ2lfc2VudCsrOworCisJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUExPR0lfU0VOVCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbnNfcGxvZ2lfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCSAgICAgICB2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkgICAgICAgdTMyIHJzcF9sZW4sIHUzMiByZXNpZF9sZW4sCisJCQkgICAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucyA9IChzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKiljYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBucy0+cG9ydDsKKwkvKiBzdHJ1Y3QgZmNfbG9naV9zICpwbG9naV9yZXNwOyAqLworCXN0cnVjdCBmY19lbHNfY21kX3MgICAqZWxzX2NtZDsKKwlzdHJ1Y3QgZmNfbHNfcmp0X3MgICAgKmxzX3JqdDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisKKwkvKgorCSAqIFNhbml0eSBDaGVja3MKKwkgKi8KKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwkJcG9ydC0+c3RhdHMubnNfcGxvZ2lfcnNwX2VycisrOworCQliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SU1BfRVJST1IpOworCQlyZXR1cm47CisJfQorCisJZWxzX2NtZCA9IChzdHJ1Y3QgZmNfZWxzX2NtZF9zICopIEJGQV9GQ1hQX1JTUF9QTEQoZmN4cCk7CisKKwlzd2l0Y2ggKGVsc19jbWQtPmVsc19jb2RlKSB7CisKKwljYXNlIEZDX0VMU19BQ0M6CisJCWlmIChyc3BfbGVuIDwgc2l6ZW9mKHN0cnVjdCBmY19sb2dpX3MpKSB7CisJCQliZmFfdHJjKHBvcnQtPmZjcywgcnNwX2xlbik7CisJCQlwb3J0LT5zdGF0cy5uc19wbG9naV9hY2NfZXJyKys7CisJCQliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SU1BfRVJST1IpOworCQkJYnJlYWs7CisJCX0KKwkJcG9ydC0+c3RhdHMubnNfcGxvZ2lfYWNjZXB0cysrOworCQliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SU1BfT0spOworCQlicmVhazsKKworCWNhc2UgRkNfRUxTX0xTX1JKVDoKKwkJbHNfcmp0ID0gKHN0cnVjdCBmY19sc19yanRfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCisJCWJmYV90cmMocG9ydC0+ZmNzLCBsc19yanQtPnJlYXNvbl9jb2RlKTsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGVfZXhwbCk7CisKKwkJcG9ydC0+c3RhdHMubnNfcmVqZWN0cysrOworCisJCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX1JTUF9FUlJPUik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcG9ydC0+c3RhdHMubnNfcGxvZ2lfdW5rbm93bl9yc3ArKzsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIGVsc19jbWQtPmVsc19jb2RlKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUlNQX0VSUk9SKTsKKwl9Cit9CisKKy8qKgorICogUmVnaXN0ZXIgdGhlIHN5bWJvbGljIHBvcnQgbmFtZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zZW5kX3JzcG5faWQodm9pZCAqbnNfY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucyA9IG5zX2NiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG5zLT5wb3J0OworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNoczsKKwlpbnQgICAgICAgICAgICAgbGVuOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXU4ICAgICAgICAgc3ltYmxbMjU2XTsKKwl1OCAgICAgICAgKnBzeW1ibCA9ICZzeW1ibFswXTsKKworCWJmYV9vc19tZW1zZXQoc3ltYmwsIDAsIHNpemVvZihzeW1ibCkpOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCisJZmN4cCA9IGZjeHBfYWxsb2NlZCA/IGZjeHBfYWxsb2NlZCA6IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkgeworCQlwb3J0LT5zdGF0cy5uc19yc3BuaWRfYWxsb2Nfd2FpdCsrOworCQliZmFfZmN4cF9hbGxvY193YWl0KHBvcnQtPmZjcy0+YmZhLCAmbnMtPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3BvcnRfbnNfc2VuZF9yc3BuX2lkLCBucyk7CisJCXJldHVybjsKKwl9CisJbnMtPmZjeHAgPSBmY3hwOworCisJLyoKKwkgKiBmb3IgVi1Qb3J0LCBmb3JtIGEgUG9ydCBTeW1ib2xpYyBOYW1lCisJICovCisJaWYgKHBvcnQtPnZwb3J0KSB7CisJCS8qKkZvciBWcG9ydHMsCisJCSAqICB3ZSBhcHBlbmQgdGhlIHZwb3J0J3MgcG9ydCBzeW1ib2xpYyBuYW1lIHRvIHRoYXQgb2YgdGhlIGJhc2UgcG9ydC4KKwkJICovCisKKwkJc3RybmNweSgoY2hhciAqKXBzeW1ibCwKKwkJCShjaGFyICopCisJCQkmKGJmYV9mY3NfcG9ydF9nZXRfcHN5bV9uYW1lCisJCQkgIChiZmFfZmNzX2dldF9iYXNlX3BvcnQocG9ydC0+ZmNzKSkpLAorCQkJc3RybGVuKChjaGFyICopCisJCQkgICAgICAgJmJmYV9mY3NfcG9ydF9nZXRfcHN5bV9uYW1lKGJmYV9mY3NfZ2V0X2Jhc2VfcG9ydAorCQkJCQkJCSAgIChwb3J0LT5mY3MpKSkpOworCisJCS8qCisJCSAqIEVuc3VyZSB3ZSBoYXZlIGEgbnVsbCB0ZXJtaW5hdGluZyBzdHJpbmcuCisJCSAqLworCQkoKGNoYXIgKikKKwkJIHBzeW1ibClbc3RybGVuKChjaGFyICopCisJCQkJJmJmYV9mY3NfcG9ydF9nZXRfcHN5bV9uYW1lCisJCQkJKGJmYV9mY3NfZ2V0X2Jhc2VfcG9ydChwb3J0LT5mY3MpKSldID0gMDsKKworCQlzdHJuY2F0KChjaGFyICopcHN5bWJsLAorCQkJKGNoYXIgKikmKGJmYV9mY3NfcG9ydF9nZXRfcHN5bV9uYW1lKHBvcnQpKSwKKwkJCXN0cmxlbigoY2hhciAqKSZiZmFfZmNzX3BvcnRfZ2V0X3BzeW1fbmFtZShwb3J0KSkpOworCX0gZWxzZSB7CisJCXBzeW1ibCA9ICh1OCAqKSAmKGJmYV9mY3NfcG9ydF9nZXRfcHN5bV9uYW1lKHBvcnQpKTsKKwl9CisKKwlsZW4gPSBmY19yc3BuaWRfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksCisJCQkgICAgICBiZmFfZmNzX3BvcnRfZ2V0X2ZjaWQocG9ydCksIDAsIHBzeW1ibCk7CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywgQkZBX0ZBTFNFLAorCQkgICAgICBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBiZmFfZmNzX3BvcnRfbnNfcnNwbl9pZF9yZXNwb25zZSwKKwkJICAgICAgKHZvaWQgKilucywgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCisJcG9ydC0+c3RhdHMubnNfcnNwbmlkX3NlbnQrKzsKKworCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX1JTUE5JRF9TRU5UKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19yc3BuX2lkX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsCisJCQkJIHZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQkgdTMyIHJzcF9sZW4sIHUzMiByZXNpZF9sZW4sCisJCQkJIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICopY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gbnMtPnBvcnQ7CisJc3RydWN0IGN0X2hkcl9zICAgICAgICpjdGhkciA9IE5VTEw7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisKKwkvKgorCSAqIFNhbml0eSBDaGVja3MKKwkgKi8KKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMocG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwkJcG9ydC0+c3RhdHMubnNfcnNwbmlkX3JzcF9lcnIrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUlNQX0VSUk9SKTsKKwkJcmV0dXJuOworCX0KKworCWN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCWN0aGRyLT5jbWRfcnNwX2NvZGUgPSBiZmFfb3NfbnRvaHMoY3RoZHItPmNtZF9yc3BfY29kZSk7CisKKwlpZiAoY3RoZHItPmNtZF9yc3BfY29kZSA9PSBDVF9SU1BfQUNDRVBUKSB7CisJCXBvcnQtPnN0YXRzLm5zX3JzcG5pZF9hY2NlcHRzKys7CisJCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX1JTUF9PSyk7CisJCXJldHVybjsKKwl9CisKKwlwb3J0LT5zdGF0cy5uc19yc3BuaWRfcmVqZWN0cysrOworCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+cmVhc29uX2NvZGUpOworCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+ZXhwX2NvZGUpOworCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX1JTUF9FUlJPUik7Cit9CisKKy8qKgorICogUmVnaXN0ZXIgRkM0LVR5cGVzCisgKiBUQkQsIE5lZWQgdG8gcmV0cmlldmUgdGhpcyBmcm9tIHRoZSBPUyBkcml2ZXIsIGluIGNhc2UgSVBGQyBpcyBlbmFibGVkID8KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zZW5kX3JmdF9pZCh2b2lkICpuc19jYmFyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zID0gbnNfY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gbnMtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCWludCAgICAgICAgICAgICBsZW47CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cG9ydF9jZmcucHd3bik7CisKKwlmY3hwID0gZmN4cF9hbGxvY2VkID8gZmN4cF9hbGxvY2VkIDogYmZhX2Zjc19mY3hwX2FsbG9jKHBvcnQtPmZjcyk7CisJaWYgKCFmY3hwKSB7CisJCXBvcnQtPnN0YXRzLm5zX3JmdGlkX2FsbG9jX3dhaXQrKzsKKwkJYmZhX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJm5zLT5mY3hwX3dxZSwKKwkJCQkgICAgYmZhX2Zjc19wb3J0X25zX3NlbmRfcmZ0X2lkLCBucyk7CisJCXJldHVybjsKKwl9CisJbnMtPmZjeHAgPSBmY3hwOworCisJbGVuID0gZmNfcmZ0aWRfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksCisJCQkgICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgMCwKKwkJCSAgICAgcG9ydC0+cG9ydF9jZmcucm9sZXMpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19wb3J0X25zX3JmdF9pZF9yZXNwb25zZSwKKwkJICAgICAgKHZvaWQgKilucywgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCisJcG9ydC0+c3RhdHMubnNfcmZ0aWRfc2VudCsrOworCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX1JGVElEX1NFTlQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X25zX3JmdF9pZF9yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCXZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQl1MzIgcnNwX2xlbiwgdTMyIHJlc2lkX2xlbiwKKwkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zID0gKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqKWNiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG5zLT5wb3J0OworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSBOVUxMOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCisJLyoKKwkgKiBTYW5pdHkgQ2hlY2tzCisJICovCisJaWYgKHJlcV9zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKHBvcnQtPmZjcywgcmVxX3N0YXR1cyk7CisJCXBvcnQtPnN0YXRzLm5zX3JmdGlkX3JzcF9lcnIrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUlNQX0VSUk9SKTsKKwkJcmV0dXJuOworCX0KKworCWN0aGRyID0gKHN0cnVjdCBjdF9oZHJfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCWN0aGRyLT5jbWRfcnNwX2NvZGUgPSBiZmFfb3NfbnRvaHMoY3RoZHItPmNtZF9yc3BfY29kZSk7CisKKwlpZiAoY3RoZHItPmNtZF9yc3BfY29kZSA9PSBDVF9SU1BfQUNDRVBUKSB7CisJCXBvcnQtPnN0YXRzLm5zX3JmdGlkX2FjY2VwdHMrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUlNQX09LKTsKKwkJcmV0dXJuOworCX0KKworCXBvcnQtPnN0YXRzLm5zX3JmdGlkX3JlamVjdHMrKzsKKwliZmFfdHJjKHBvcnQtPmZjcywgY3RoZHItPnJlYXNvbl9jb2RlKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgY3RoZHItPmV4cF9jb2RlKTsKKwliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SU1BfRVJST1IpOworfQorCisvKioKKyogUmVnaXN0ZXIgRkM0LUZlYXR1cmVzIDogU2hvdWxkIGJlIGRvbmUgYWZ0ZXIgUkZUX0lECisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfbnNfc2VuZF9yZmZfaWQodm9pZCAqbnNfY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucyA9IG5zX2NiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG5zLT5wb3J0OworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNoczsKKwlpbnQgICAgICAgICAgICAgbGVuOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXU4ICAgICAgICAgZmM0X2Z0cnMgPSAwOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCisJZmN4cCA9IGZjeHBfYWxsb2NlZCA/IGZjeHBfYWxsb2NlZCA6IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkgeworCQlwb3J0LT5zdGF0cy5uc19yZmZpZF9hbGxvY193YWl0Kys7CisJCWJmYV9mY3hwX2FsbG9jX3dhaXQocG9ydC0+ZmNzLT5iZmEsICZucy0+ZmN4cF93cWUsCisJCQkJICAgIGJmYV9mY3NfcG9ydF9uc19zZW5kX3JmZl9pZCwgbnMpOworCQlyZXR1cm47CisJfQorCW5zLT5mY3hwID0gZmN4cDsKKworCWlmIChCRkFfRkNTX1ZQT1JUX0lTX0lOSVRJQVRPUl9NT0RFKG5zLT5wb3J0KSkgeworCQlmYzRfZnRycyA9IEZDX0dTX0ZDUF9GQzRfRkVBVFVSRV9JTklUSUFUT1I7CisJfSBlbHNlIGlmIChCRkFfRkNTX1ZQT1JUX0lTX1RBUkdFVF9NT0RFKG5zLT5wb3J0KSkgeworCQlmYzRfZnRycyA9IEZDX0dTX0ZDUF9GQzRfRkVBVFVSRV9UQVJHRVQ7CisJfQorCisJbGVuID0gZmNfcmZmaWRfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksCisJCQkgICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgMCwgRkNfVFlQRV9GQ1AsCisJCQkgICAgIGZjNF9mdHJzKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCisJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcG9ydF9uc19yZmZfaWRfcmVzcG9uc2UsCisJCSAgICAgICh2b2lkICopbnMsIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKworCXBvcnQtPnN0YXRzLm5zX3JmZmlkX3NlbnQrKzsKKwliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SRkZJRF9TRU5UKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19yZmZfaWRfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCQl2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJdTMyIHJzcF9sZW4sIHUzMiByZXNpZF9sZW4sCisJCQkJc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucyA9IChzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKiljYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBucy0+cG9ydDsKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgKmN0aGRyID0gTlVMTDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKworCS8qCisJICogU2FuaXR5IENoZWNrcworCSAqLworCWlmIChyZXFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIHJlcV9zdGF0dXMpOworCQlwb3J0LT5zdGF0cy5uc19yZmZpZF9yc3BfZXJyKys7CisJCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX1JTUF9FUlJPUik7CisJCXJldHVybjsKKwl9CisKKwljdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgQkZBX0ZDWFBfUlNQX1BMRChmY3hwKTsKKwljdGhkci0+Y21kX3JzcF9jb2RlID0gYmZhX29zX250b2hzKGN0aGRyLT5jbWRfcnNwX2NvZGUpOworCisJaWYgKGN0aGRyLT5jbWRfcnNwX2NvZGUgPT0gQ1RfUlNQX0FDQ0VQVCkgeworCQlwb3J0LT5zdGF0cy5uc19yZmZpZF9hY2NlcHRzKys7CisJCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX1JTUF9PSyk7CisJCXJldHVybjsKKwl9CisKKwlwb3J0LT5zdGF0cy5uc19yZmZpZF9yZWplY3RzKys7CisJYmZhX3RyYyhwb3J0LT5mY3MsIGN0aGRyLT5yZWFzb25fY29kZSk7CisJYmZhX3RyYyhwb3J0LT5mY3MsIGN0aGRyLT5leHBfY29kZSk7CisKKwlpZiAoY3RoZHItPnJlYXNvbl9jb2RlID09IENUX1JTTl9OT1RfU1VQUCkgeworCQkvKgorCQkgKiBpZiB0aGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCwgd2UgZG9uJ3QgcmV0cnkKKwkJICovCisJCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX1JTUF9PSyk7CisJfSBlbHNlIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUlNQX0VSUk9SKTsKKwl9Cit9CisKKy8qKgorICogUXVlcnkgRmFicmljIGZvciBGQzQtVHlwZXMgRGV2aWNlcy4KKyAqCisqICBUQkQgOiBOZWVkIHRvIHVzZSBhIGxvY2FsIChGQ1MgcHJpdmF0ZSkgcmVzcG9uc2UgYnVmZmVyLCBzaW5jZSB0aGUgcmVzcG9uc2UKKyAqIGNhbiBiZSBsYXJnZXIgdGhhbiAySy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19zZW5kX2dpZF9mdCh2b2lkICpuc19jYmFyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zID0gbnNfY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gbnMtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCWludCAgICAgICAgICAgICBsZW47CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cGlkKTsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJcG9ydC0+c3RhdHMubnNfZ2lkZnRfYWxsb2Nfd2FpdCsrOworCQliZmFfZmN4cF9hbGxvY193YWl0KHBvcnQtPmZjcy0+YmZhLCAmbnMtPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3BvcnRfbnNfc2VuZF9naWRfZnQsIG5zKTsKKwkJcmV0dXJuOworCX0KKwlucy0+ZmN4cCA9IGZjeHA7CisKKwkvKgorCSAqIFRoaXMgcXVlcnkgaXMgb25seSBpbml0aWF0ZWQgZm9yIEZDUCBpbml0aWF0b3IgbW9kZS4KKwkgKi8KKwlsZW4gPSBmY19naWRfZnRfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksIG5zLT5wb3J0LT5waWQsCisJCQkgICAgICBGQ19UWVBFX0ZDUCk7CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywgQkZBX0ZBTFNFLAorCQkgICAgICBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBiZmFfZmNzX3BvcnRfbnNfZ2lkX2Z0X3Jlc3BvbnNlLAorCQkgICAgICAodm9pZCAqKW5zLCBiZmFfZmN4cF9nZXRfbWF4cnNwKHBvcnQtPmZjcy0+YmZhKSwKKwkJICAgICAgRkNfUkFfVE9WKTsKKworCXBvcnQtPnN0YXRzLm5zX2dpZGZ0X3NlbnQrKzsKKworCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX0dJREZUX1NFTlQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X25zX2dpZF9mdF9yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCXZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCQl1MzIgcnNwX2xlbiwgdTMyIHJlc2lkX2xlbiwKKwkJCQlzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zID0gKHN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqKWNiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IG5zLT5wb3J0OworCXN0cnVjdCBjdF9oZHJfcyAgICAgICAqY3RoZHIgPSBOVUxMOworCXUzMiAgICAgICAgbl9waWRzOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCisJLyoKKwkgKiBTYW5pdHkgQ2hlY2tzCisJICovCisJaWYgKHJlcV9zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKHBvcnQtPmZjcywgcmVxX3N0YXR1cyk7CisJCXBvcnQtPnN0YXRzLm5zX2dpZGZ0X3JzcF9lcnIrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUlNQX0VSUk9SKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZXNpZF9sZW4gIT0gMCkgeworCQkvKgorCQkgKiBUQkQgOiB3ZSB3aWxsIG5lZWQgdG8gYWxsb2NhdGUgYSBsYXJnZXIgYnVmZmVyICYgcmV0cnkgdGhlCisJCSAqIGNvbW1hbmQKKwkJICovCisJCWJmYV90cmMocG9ydC0+ZmNzLCByc3BfbGVuKTsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIHJlc2lkX2xlbik7CisJCXJldHVybjsKKwl9CisKKwljdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikgQkZBX0ZDWFBfUlNQX1BMRChmY3hwKTsKKwljdGhkci0+Y21kX3JzcF9jb2RlID0gYmZhX29zX250b2hzKGN0aGRyLT5jbWRfcnNwX2NvZGUpOworCisJc3dpdGNoIChjdGhkci0+Y21kX3JzcF9jb2RlKSB7CisKKwljYXNlIENUX1JTUF9BQ0NFUFQ6CisKKwkJcG9ydC0+c3RhdHMubnNfZ2lkZnRfYWNjZXB0cysrOworCQluX3BpZHMgPSAoZmNfZ2V0X2N0cmVzcF9weWxkX2xlbihyc3BfbGVuKSAvIHNpemVvZih1MzIpKTsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIG5fcGlkcyk7CisJCWJmYV9mY3NfcG9ydF9uc19wcm9jZXNzX2dpZGZ0X3BpZHMocG9ydCwKKwkJCQkJCSAgICh1MzIgKikgKGN0aGRyICsgMSksCisJCQkJCQkgICBuX3BpZHMpOworCQliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SU1BfT0spOworCQlicmVhazsKKworCWNhc2UgQ1RfUlNQX1JFSkVDVDoKKworCQkvKgorCQkgKiBDaGVjayB0aGUgcmVhc29uIGNvZGUgICYgZXhwbGFuYXRpb24uCisJCSAqIFRoZXJlIG1heSBub3QgaGF2ZSBiZWVuIGFueSBGQzQgZGV2aWNlcyBpbiB0aGUgZmFicmljCisJCSAqLworCQlwb3J0LT5zdGF0cy5uc19naWRmdF9yZWplY3RzKys7CisJCWJmYV90cmMocG9ydC0+ZmNzLCBjdGhkci0+cmVhc29uX2NvZGUpOworCQliZmFfdHJjKHBvcnQtPmZjcywgY3RoZHItPmV4cF9jb2RlKTsKKworCQlpZiAoKGN0aGRyLT5yZWFzb25fY29kZSA9PSBDVF9SU05fVU5BQkxFX1RPX1BFUkYpCisJCSAgICAmJiAoY3RoZHItPmV4cF9jb2RlID09IENUX05TX0VYUF9GVF9OT1RfUkVHKSkgeworCisJCQliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SU1BfT0spOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGZvciBhbGwgb3RoZXIgZXJyb3JzLCByZXRyeQorCQkJICovCisJCQliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SU1BfRVJST1IpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcG9ydC0+c3RhdHMubnNfZ2lkZnRfdW5rbm93bl9yc3ArKzsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIGN0aGRyLT5jbWRfcnNwX2NvZGUpOworCQliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9SU1BfRVJST1IpOworCX0KK30KKworLyoqCisgKiAgICAgVGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIGJ5IGJmYV90aW1lciBvbiB0aW1lciB0aW1lb3V0cy4KKyAqCisgKiAJcGFyYW1baW5dIAlwb3J0IAktIHBvaW50ZXIgdG8gYmZhX2Zjc19wb3J0X3QuCisgKgorICogCXJldHVybgorICogCQl2b2lkCisgKgorKiAJU3BlY2lhbCBDb25zaWRlcmF0aW9uczoKKyAqCisgKiAJbm90ZQorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X25zX3RpbWVvdXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMgPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICopYXJnOworCisJbnMtPnBvcnQtPnN0YXRzLm5zX3RpbWVvdXRzKys7CisJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfVElNRU9VVCk7Cit9CisKKy8qCisgKiBQcm9jZXNzIHRoZSBQSUQgbGlzdCBpbiBHSURfRlQgcmVzcG9uc2UKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19wcm9jZXNzX2dpZGZ0X3BpZHMoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJCSAgIHUzMiAqcGlkX2J1ZiwgdTMyIG5fcGlkcykKK3sKKwlzdHJ1Y3QgZmNnc19naWRmdF9yZXNwX3MgKmdpZGZ0X2VudHJ5OworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCXUzMiAgICAgICAgaWk7CisKKwlmb3IgKGlpID0gMDsgaWkgPCBuX3BpZHM7IGlpKyspIHsKKwkJZ2lkZnRfZW50cnkgPSAoc3RydWN0IGZjZ3NfZ2lkZnRfcmVzcF9zICopICZwaWRfYnVmW2lpXTsKKworCQlpZiAoZ2lkZnRfZW50cnktPnBpZCA9PSBwb3J0LT5waWQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGlzIHJwb3J0IGFscmVhZHkgZXhpc3RzCisJCSAqLworCQlycG9ydCA9IGJmYV9mY3NfcG9ydF9nZXRfcnBvcnRfYnlfcGlkKHBvcnQsIGdpZGZ0X2VudHJ5LT5waWQpOworCQlpZiAocnBvcnQgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIHRoaXMgaXMgYSBuZXcgZGV2aWNlLiBjcmVhdGUgcnBvcnQKKwkJCSAqLworCQkJcnBvcnQgPSBiZmFfZmNzX3Jwb3J0X2NyZWF0ZShwb3J0LCBnaWRmdF9lbnRyeS0+cGlkKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiB0aGlzIHJwb3J0IGFscmVhZHkgZXhpc3RzCisJCQkgKi8KKwkJCWJmYV9mY3NfcnBvcnRfc2NuKHJwb3J0KTsKKwkJfQorCisJCWJmYV90cmMocG9ydC0+ZmNzLCBnaWRmdF9lbnRyeS0+cGlkKTsKKworCQkvKgorCQkgKiBpZiB0aGUgbGFzdCBlbnRyeSBiaXQgaXMgc2V0LCBiYWlsIG91dC4KKwkJICovCisJCWlmIChnaWRmdF9lbnRyeS0+bGFzdCkKKwkJCXJldHVybjsKKwl9Cit9CisKKy8qKgorICogIGZjc19uc19wdWJsaWMgRkNTIG5hbWVzZXJ2ZXIgcHVibGljIGludGVyZmFjZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zIGNhbGxlZCBieSBwb3J0L2ZhYi4KKyAqIFRoZXNlIHdpbGwgc2VuZCByZWxldmFudCBFdmVudHMgdG8gdGhlIG5zIHN0YXRlIG1hY2hpbmUuCisgKi8KK3ZvaWQKK2JmYV9mY3NfcG9ydF9uc19pbml0KHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X25zX3MgKm5zID0gQkZBX0ZDU19HRVRfTlNfRlJPTV9QT1JUKHBvcnQpOworCisJbnMtPnBvcnQgPSBwb3J0OworCWJmYV9zbV9zZXRfc3RhdGUobnMsIGJmYV9mY3NfcG9ydF9uc19zbV9vZmZsaW5lKTsKK30KKwordm9pZAorYmZhX2Zjc19wb3J0X25zX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfbnNfcyAqbnMgPSBCRkFfRkNTX0dFVF9OU19GUk9NX1BPUlQocG9ydCk7CisKKwlucy0+cG9ydCA9IHBvcnQ7CisJYmZhX3NtX3NlbmRfZXZlbnQobnMsIE5TU01fRVZFTlRfUE9SVF9PRkZMSU5FKTsKK30KKwordm9pZAorYmZhX2Zjc19wb3J0X25zX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucyA9IEJGQV9GQ1NfR0VUX05TX0ZST01fUE9SVChwb3J0KTsKKworCW5zLT5wb3J0ID0gcG9ydDsKKwliZmFfc21fc2VuZF9ldmVudChucywgTlNTTV9FVkVOVF9QT1JUX09OTElORSk7Cit9CisKK3ZvaWQKK2JmYV9mY3NfcG9ydF9uc19xdWVyeShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9uc19zICpucyA9IEJGQV9GQ1NfR0VUX05TX0ZST01fUE9SVChwb3J0KTsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5waWQpOworCWJmYV9zbV9zZW5kX2V2ZW50KG5zLCBOU1NNX0VWRU5UX05TX1FVRVJZKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9uc19ib290X3RhcmdldF9kaXNjKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCkKK3sKKworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCXU4ICAgICAgICAgbnd3bnM7CisJd3duX3QgICAgICAgICAgKnd3bnM7CisJaW50ICAgICAgICAgICAgIGlpOworCisJYmZhX2lvY2ZjX2dldF9ib290d3ducyhwb3J0LT5mY3MtPmJmYSwgJm53d25zLCAmd3ducyk7CisKKwlmb3IgKGlpID0gMDsgaWkgPCBud3duczsgKytpaSkgeworCQlycG9ydCA9IGJmYV9mY3NfcnBvcnRfY3JlYXRlX2J5X3d3bihwb3J0LCB3d25zW2lpXSk7CisJCWJmYV9hc3NlcnQocnBvcnQpOworCX0KK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL3Bsb2cuYyBiL2RyaXZlcnMvc2NzaS9iZmEvcGxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YWY4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL3Bsb2cuYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YmZhX29zX2luYy5oPgorI2luY2x1ZGUgPGNzL2JmYV9wbG9nLmg+CisjaW5jbHVkZSA8Y3MvYmZhX2RlYnVnLmg+CisKK3N0YXRpYyBpbnQKK3Bsa2RfdmFsaWRhdGVfbG9ncmVjKHN0cnVjdCBiZmFfcGxvZ19yZWNfcyAqcGxfcmVjKQoreworCWlmICgocGxfcmVjLT5sb2dfdHlwZSAhPSBCRkFfUExfTE9HX1RZUEVfSU5UKQorCSAgICAmJiAocGxfcmVjLT5sb2dfdHlwZSAhPSBCRkFfUExfTE9HX1RZUEVfU1RSSU5HKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKHBsX3JlYy0+bG9nX3R5cGUgIT0gQkZBX1BMX0xPR19UWVBFX0lOVCkKKwkgICAgJiYgKHBsX3JlYy0+bG9nX251bV9pbnRzID4gQkZBX1BMX0lOVF9MT0dfU1opKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYmZhX3Bsb2dfYWRkKHN0cnVjdCBiZmFfcGxvZ19zICpwbG9nLCBzdHJ1Y3QgYmZhX3Bsb2dfcmVjX3MgKnBsX3JlYykKK3sKKwl1MTYgICAgICAgIHRhaWw7CisJc3RydWN0IGJmYV9wbG9nX3JlY19zICpwbF9yZWNwOworCisJaWYgKHBsb2ctPnBsb2dfZW5hYmxlZCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocGxrZF92YWxpZGF0ZV9sb2dyZWMocGxfcmVjKSkgeworCQliZmFfYXNzZXJ0KDApOworCQlyZXR1cm47CisJfQorCisJdGFpbCA9IHBsb2ctPnRhaWw7CisKKwlwbF9yZWNwID0gJihwbG9nLT5wbG9nX3JlY3NbdGFpbF0pOworCisJYmZhX29zX21lbWNweShwbF9yZWNwLCBwbF9yZWMsIHNpemVvZihzdHJ1Y3QgYmZhX3Bsb2dfcmVjX3MpKTsKKworCXBsX3JlY3AtPnR2ID0gQkZBX1RSQ19UUyhwbG9nKTsKKwlCRkFfUExfTE9HX1JFQ19JTkNSKHBsb2ctPnRhaWwpOworCisJaWYgKHBsb2ctPmhlYWQgPT0gcGxvZy0+dGFpbCkKKwkJQkZBX1BMX0xPR19SRUNfSU5DUihwbG9nLT5oZWFkKTsKK30KKwordm9pZAorYmZhX3Bsb2dfaW5pdChzdHJ1Y3QgYmZhX3Bsb2dfcyAqcGxvZykKK3sKKwliZmFfb3NfbWVtc2V0KChjaGFyICopcGxvZywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfcGxvZ19zKSk7CisKKwliZmFfb3NfbWVtY3B5KHBsb2ctPnBsb2dfc2lnLCBCRkFfUExfU0lHX1NUUiwgQkZBX1BMX1NJR19MRU4pOworCXBsb2ctPmhlYWQgPSBwbG9nLT50YWlsID0gMDsKKwlwbG9nLT5wbG9nX2VuYWJsZWQgPSAxOworfQorCit2b2lkCitiZmFfcGxvZ19zdHIoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2csIGVudW0gYmZhX3Bsb2dfbWlkIG1pZCwKKwkJZW51bSBiZmFfcGxvZ19laWQgZXZlbnQsCisJCXUxNiBtaXNjLCBjaGFyICpsb2dfc3RyKQoreworCXN0cnVjdCBiZmFfcGxvZ19yZWNfcyAgbHA7CisKKwlpZiAocGxvZy0+cGxvZ19lbmFibGVkKSB7CisJCWJmYV9vc19tZW1zZXQoJmxwLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9wbG9nX3JlY19zKSk7CisJCWxwLm1pZCA9IG1pZDsKKwkJbHAuZWlkID0gZXZlbnQ7CisJCWxwLmxvZ190eXBlID0gQkZBX1BMX0xPR19UWVBFX1NUUklORzsKKwkJbHAubWlzYyA9IG1pc2M7CisJCXN0cm5jcHkobHAubG9nX2VudHJ5LnN0cmluZ19sb2csIGxvZ19zdHIsCisJCQlCRkFfUExfU1RSSU5HX0xPR19TWiAtIDEpOworCQlscC5sb2dfZW50cnkuc3RyaW5nX2xvZ1tCRkFfUExfU1RSSU5HX0xPR19TWiAtIDFdID0gJ1wwJzsKKwkJYmZhX3Bsb2dfYWRkKHBsb2csICZscCk7CisJfQorfQorCit2b2lkCitiZmFfcGxvZ19pbnRhcnIoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2csIGVudW0gYmZhX3Bsb2dfbWlkIG1pZCwKKwkJZW51bSBiZmFfcGxvZ19laWQgZXZlbnQsCisJCXUxNiBtaXNjLCB1MzIgKmludGFyciwgdTMyIG51bV9pbnRzKQoreworCXN0cnVjdCBiZmFfcGxvZ19yZWNfcyAgbHA7CisJdTMyICAgICAgICBpOworCisJaWYgKG51bV9pbnRzID4gQkZBX1BMX0lOVF9MT0dfU1opCisJCW51bV9pbnRzID0gQkZBX1BMX0lOVF9MT0dfU1o7CisKKwlpZiAocGxvZy0+cGxvZ19lbmFibGVkKSB7CisJCWJmYV9vc19tZW1zZXQoJmxwLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9wbG9nX3JlY19zKSk7CisJCWxwLm1pZCA9IG1pZDsKKwkJbHAuZWlkID0gZXZlbnQ7CisJCWxwLmxvZ190eXBlID0gQkZBX1BMX0xPR19UWVBFX0lOVDsKKwkJbHAubWlzYyA9IG1pc2M7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9pbnRzOyBpKyspCisJCQliZmFfb3NfYXNzaWduKGxwLmxvZ19lbnRyeS5pbnRfbG9nW2ldLAorCQkJCQlpbnRhcnJbaV0pOworCisJCWxwLmxvZ19udW1faW50cyA9ICh1OCkgbnVtX2ludHM7CisKKwkJYmZhX3Bsb2dfYWRkKHBsb2csICZscCk7CisJfQorfQorCit2b2lkCitiZmFfcGxvZ19mY2hkcihzdHJ1Y3QgYmZhX3Bsb2dfcyAqcGxvZywgZW51bSBiZmFfcGxvZ19taWQgbWlkLAorCQkJZW51bSBiZmFfcGxvZ19laWQgZXZlbnQsCisJCQl1MTYgbWlzYywgc3RydWN0IGZjaHNfcyAqZmNoZHIpCit7CisJc3RydWN0IGJmYV9wbG9nX3JlY19zICBscDsKKwl1MzIgICAgICAgKnRtcF9pbnQgPSAodTMyICopIGZjaGRyOworCXUzMiAgICAgICAgaW50c1tCRkFfUExfSU5UX0xPR19TWl07CisKKwlpZiAocGxvZy0+cGxvZ19lbmFibGVkKSB7CisJCWJmYV9vc19tZW1zZXQoJmxwLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9wbG9nX3JlY19zKSk7CisKKwkJaW50c1swXSA9IHRtcF9pbnRbMF07CisJCWludHNbMV0gPSB0bXBfaW50WzFdOworCQlpbnRzWzJdID0gdG1wX2ludFs0XTsKKworCQliZmFfcGxvZ19pbnRhcnIocGxvZywgbWlkLCBldmVudCwgbWlzYywgaW50cywgMyk7CisJfQorfQorCit2b2lkCitiZmFfcGxvZ19mY2hkcl9hbmRfcGwoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2csIGVudW0gYmZhX3Bsb2dfbWlkIG1pZCwKKwkJICAgICAgZW51bSBiZmFfcGxvZ19laWQgZXZlbnQsIHUxNiBtaXNjLCBzdHJ1Y3QgZmNoc19zICpmY2hkciwKKwkJICAgICAgdTMyIHBsZF93MCkKK3sKKwlzdHJ1Y3QgYmZhX3Bsb2dfcmVjX3MgIGxwOworCXUzMiAgICAgICAqdG1wX2ludCA9ICh1MzIgKikgZmNoZHI7CisJdTMyICAgICAgICBpbnRzW0JGQV9QTF9JTlRfTE9HX1NaXTsKKworCWlmIChwbG9nLT5wbG9nX2VuYWJsZWQpIHsKKwkJYmZhX29zX21lbXNldCgmbHAsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3Bsb2dfcmVjX3MpKTsKKworCQlpbnRzWzBdID0gdG1wX2ludFswXTsKKwkJaW50c1sxXSA9IHRtcF9pbnRbMV07CisJCWludHNbMl0gPSB0bXBfaW50WzRdOworCQlpbnRzWzNdID0gcGxkX3cwOworCisJCWJmYV9wbG9nX2ludGFycihwbG9nLCBtaWQsIGV2ZW50LCBtaXNjLCBpbnRzLCA0KTsKKwl9Cit9CisKK3ZvaWQKK2JmYV9wbG9nX2NsZWFyKHN0cnVjdCBiZmFfcGxvZ19zICpwbG9nKQoreworCXBsb2ctPmhlYWQgPSBwbG9nLT50YWlsID0gMDsKK30KKwordm9pZAorYmZhX3Bsb2dfZW5hYmxlKHN0cnVjdCBiZmFfcGxvZ19zICpwbG9nKQoreworCXBsb2ctPnBsb2dfZW5hYmxlZCA9IDE7Cit9CisKK3ZvaWQKK2JmYV9wbG9nX2Rpc2FibGUoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2cpCit7CisJcGxvZy0+cGxvZ19lbmFibGVkID0gMDsKK30KKworYmZhX2Jvb2xlYW5fdAorYmZhX3Bsb2dfZ2V0X3NldHRpbmcoc3RydWN0IGJmYV9wbG9nX3MgKnBsb2cpCit7CisJcmV0dXJuKChiZmFfYm9vbGVhbl90KXBsb2ctPnBsb2dfZW5hYmxlZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmNThiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvcnBvcnQuYwpAQCAtMCwwICsxLDI2MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgcnBvcnQuYyBSZW1vdGUgcG9ydCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgImZjYnVpbGQuaCIKKyNpbmNsdWRlICJmY3NfdnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfbHBvcnQuaCIKKyNpbmNsdWRlICJmY3NfcnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfZmNwaW0uaCIKKyNpbmNsdWRlICJmY3NfZmNwdG0uaCIKKyNpbmNsdWRlICJmY3NfdHJjbW9kLmgiCisjaW5jbHVkZSAiZmNzX2ZjeHAuaCIKKyNpbmNsdWRlICJmY3MuaCIKKyNpbmNsdWRlIDxmY2IvYmZhX2ZjYl9ycG9ydC5oPgorI2luY2x1ZGUgPGFlbi9iZmFfYWVuX3Jwb3J0Lmg+CisKK0JGQV9UUkNfRklMRShGQ1MsIFJQT1JUKTsKKworI2RlZmluZSBCRkFfRkNTX1JQT1JUX01BWF9SRVRSSUVTCQkoNSkKKworLyogSW4gbWlsbGlzZWNzICovCitzdGF0aWMgdTMyIGJmYV9mY3NfcnBvcnRfZGVsX3RpbWVvdXQgPQorCQkJQkZBX0ZDU19SUE9SVF9ERUZfREVMX1RJTUVPVVQgKiAxMDAwOworCisvKgorICogZm9yd2FyZCBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKmJmYV9mY3NfcnBvcnRfYWxsb2Moc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJCQkJICAgd3duX3QgcHd3biwgdTMyIHJwaWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfZnJlZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9oYWxfb25saW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X29ubGluZV9hY3Rpb24oc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24oc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfdXBkYXRlKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCSAgICAgc3RydWN0IGZjX2xvZ2lfcyAqcGxvZ2kpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfZmM0X3BhdXNlKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X2ZjNF9yZXN1bWUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfdGltZW91dCh2b2lkICphcmcpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc2VuZF9wbG9naSh2b2lkICpycG9ydF9jYmFyZywKKwkJCQkJIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc2VuZF9wbG9naWFjYyh2b2lkICpycG9ydF9jYmFyZywKKwkJCQkJICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfcGxvZ2lfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAorCQkJCQkgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkgICAgIHZvaWQgKmNiYXJnLAorCQkJCQkgICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCQkgICAgIHUzMiByc3BfbGVuLAorCQkJCQkgICAgIHUzMiByZXNpZF9sZW4sCisJCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc2VuZF9hZGlzYyh2b2lkICpycG9ydF9jYmFyZywKKwkJCQkJIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfYWRpc2NfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAorCQkJCQkgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkgICAgIHZvaWQgKmNiYXJnLAorCQkJCQkgICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCQkgICAgIHUzMiByc3BfbGVuLAorCQkJCQkgICAgIHUzMiByZXNpZF9sZW4sCisJCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbih2b2lkICpycG9ydF9jYmFyZywKKwkJCQkJIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfZ2lkcG5fcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAorCQkJCQkgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkgICAgIHZvaWQgKmNiYXJnLAorCQkJCQkgICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLAorCQkJCQkgICAgIHUzMiByc3BfbGVuLAorCQkJCQkgICAgIHUzMiByZXNpZF9sZW4sCisJCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc2VuZF9sb2dvKHZvaWQgKnJwb3J0X2NiYXJnLAorCQkJCQlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NlbmRfbG9nb19hY2Modm9pZCAqcnBvcnRfY2JhcmcpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfcHJvY2Vzc19wcmxpKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJc3RydWN0IGZjaHNfcyAqcnhfZmNocywgdTE2IGxlbik7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zZW5kX2xzX3JqdChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCXN0cnVjdCBmY2hzX3MgKnJ4X2ZjaHMsIHU4IHJlYXNvbl9jb2RlLAorCQkJdTggcmVhc29uX2NvZGVfZXhwbCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9wcm9jZXNzX2FkaXNjKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJc3RydWN0IGZjaHNfcyAqcnhfZmNocywgdTE2IGxlbik7CisvKioKKyAqICBmY3NfcnBvcnRfc20gRkNTIHJwb3J0IHN0YXRlIG1hY2hpbmUgZXZlbnRzCisgKi8KKworZW51bSBycG9ydF9ldmVudCB7CisJUlBTTV9FVkVOVF9QTE9HSV9TRU5EID0gMSwJLyogIG5ldyBycG9ydDsgc3RhcnQgd2l0aCBQTE9HSSAqLworCVJQU01fRVZFTlRfUExPR0lfUkNWRCA9IDIsCS8qICBJbmJvdW5kIFBMT0dJIGZyb20gcmVtb3RlIHBvcnQgKi8KKwlSUFNNX0VWRU5UX1BMT0dJX0NPTVAgPSAzLAkvKiAgUExPR0kgY29tcGxldGVkIHRvIHJwb3J0ICovCisJUlBTTV9FVkVOVF9MT0dPX1JDVkQgPSA0LAkvKiAgTE9HTyBmcm9tIHJlbW90ZSBkZXZpY2UgKi8KKwlSUFNNX0VWRU5UX0xPR09fSU1QID0gNSwJLyogIGltcGxpY2l0IGxvZ28gZm9yIFNMRVIgKi8KKwlSUFNNX0VWRU5UX0ZDWFBfU0VOVCA9IDYsCS8qICBGcmFtZSBmcm9tIGhhcyBiZWVuIHNlbnQgKi8KKwlSUFNNX0VWRU5UX0RFTEVURSA9IDcsCS8qICBSUE9SVCBkZWxldGUgcmVxdWVzdCAqLworCVJQU01fRVZFTlRfU0NOID0gOCwJLyogIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb24gKi8KKwlSUFNNX0VWRU5UX0FDQ0VQVEVEID0gOSwvKiAgR29vZCByZXNwb25zZSBmcm9tIHJlbW90ZSBkZXZpY2UgKi8KKwlSUFNNX0VWRU5UX0ZBSUxFRCA9IDEwLAkvKiAgUmVxdWVzdCB0byBycG9ydCBmYWlsZWQuICAqLworCVJQU01fRVZFTlRfVElNRU9VVCA9IDExLAkvKiAgUnBvcnQgU00gdGltZW91dCBldmVudCAqLworCVJQU01fRVZFTlRfSENCX09OTElORSA9IDEyLAkvKiAgQkZBIHJwb3J0IG9ubGluZSBjYWxsYmFjayAqLworCVJQU01fRVZFTlRfSENCX09GRkxJTkUgPSAxMywJLyogIEJGQSBycG9ydCBvZmZsaW5lIGNhbGxiYWNrICovCisJUlBTTV9FVkVOVF9GQzRfT0ZGTElORSA9IDE0LAkvKiAgRkMtNCBvZmZsaW5lIGNvbXBsZXRlICovCisJUlBTTV9FVkVOVF9BRERSRVNTX0NIQU5HRSA9IDE1LAkvKiAgUnBvcnQncyBQSUQgaGFzIGNoYW5nZWQgKi8KKwlSUFNNX0VWRU5UX0FERFJFU1NfRElTQyA9IDE2CS8qICBOZWVkIHRvIERpc2NvdmVyIHJwb3J0J3MgUElEICovCit9OworCitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV91bmluaXQoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJCWVudW0gcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc21fcGxvZ2lfc2VuZGluZyhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkJICAgICAgIGVudW0gcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc21fcGxvZ2lhY2Nfc2VuZGluZyhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkJCSAgZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9wbG9naV9yZXRyeShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkJICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCSAgICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NtX2hhbF9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJCSAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkJZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9uc3F1ZXJ5X3NlbmRpbmcoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJCQkgZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9uc3F1ZXJ5KHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCQkgZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9hZGlzY19zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCQkgICAgICAgZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9hZGlzYyhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkgICAgICAgZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9mYzRfbG9nb3JjdihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkJICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9sb2dvc2VuZChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkJICAgICAgZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9mYzRfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkJICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NtX2hjYl9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCQkgICAgIGVudW0gcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc21faGNiX2xvZ29yY3Yoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJCSAgICAgZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9oY2JfbG9nb3NlbmQoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJCSAgICAgIGVudW0gcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc21fbG9nb19zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCQkgICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NtX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJCSBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCQkJZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9uc2Rpc2NfcmV0cnkoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJCSAgICAgIGVudW0gcnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBvcnRfc21fbnNkaXNjX3NlbnQoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJCSAgICAgZW51bSBycG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycG9ydF9zbV9uc2Rpc2Nfc2VudChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCQkJICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KTsKKworc3RhdGljIHN0cnVjdCBiZmFfc21fdGFibGVfcyBycG9ydF9zbV90YWJsZVtdID0geworCXtCRkFfU00oYmZhX2Zjc19ycG9ydF9zbV91bmluaXQpLCBCRkFfUlBPUlRfVU5JTklUfSwKKwl7QkZBX1NNKGJmYV9mY3NfcnBvcnRfc21fcGxvZ2lfc2VuZGluZyksIEJGQV9SUE9SVF9QTE9HSX0sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpYWNjX3NlbmRpbmcpLCBCRkFfUlBPUlRfT05MSU5FfSwKKwl7QkZBX1NNKGJmYV9mY3NfcnBvcnRfc21fcGxvZ2lfcmV0cnkpLCBCRkFfUlBPUlRfUExPR0lfUkVUUll9LAorCXtCRkFfU00oYmZhX2Zjc19ycG9ydF9zbV9wbG9naSksIEJGQV9SUE9SVF9QTE9HSX0sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX2hhbF9vbmxpbmUpLCBCRkFfUlBPUlRfT05MSU5FfSwKKwl7QkZBX1NNKGJmYV9mY3NfcnBvcnRfc21fb25saW5lKSwgQkZBX1JQT1JUX09OTElORX0sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX25zcXVlcnlfc2VuZGluZyksIEJGQV9SUE9SVF9OU1FVRVJZfSwKKwl7QkZBX1NNKGJmYV9mY3NfcnBvcnRfc21fbnNxdWVyeSksIEJGQV9SUE9SVF9OU1FVRVJZfSwKKwl7QkZBX1NNKGJmYV9mY3NfcnBvcnRfc21fYWRpc2Nfc2VuZGluZyksIEJGQV9SUE9SVF9BRElTQ30sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX2FkaXNjKSwgQkZBX1JQT1JUX0FESVNDfSwKKwl7QkZBX1NNKGJmYV9mY3NfcnBvcnRfc21fZmM0X2xvZ29yY3YpLCBCRkFfUlBPUlRfTE9HT1JDVn0sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9sb2dvc2VuZCksIEJGQV9SUE9SVF9MT0dPfSwKKwl7QkZBX1NNKGJmYV9mY3NfcnBvcnRfc21fZmM0X29mZmxpbmUpLCBCRkFfUlBPUlRfT0ZGTElORX0sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX2hjYl9vZmZsaW5lKSwgQkZBX1JQT1JUX09GRkxJTkV9LAorCXtCRkFfU00oYmZhX2Zjc19ycG9ydF9zbV9oY2JfbG9nb3JjdiksIEJGQV9SUE9SVF9MT0dPUkNWfSwKKwl7QkZBX1NNKGJmYV9mY3NfcnBvcnRfc21faGNiX2xvZ29zZW5kKSwgQkZBX1JQT1JUX0xPR099LAorCXtCRkFfU00oYmZhX2Zjc19ycG9ydF9zbV9sb2dvX3NlbmRpbmcpLCBCRkFfUlBPUlRfTE9HT30sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX29mZmxpbmUpLCBCRkFfUlBPUlRfT0ZGTElORX0sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKSwgQkZBX1JQT1JUX05TRElTQ30sCisJe0JGQV9TTShiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19yZXRyeSksIEJGQV9SUE9SVF9OU0RJU0N9LAorCXtCRkFfU00oYmZhX2Zjc19ycG9ydF9zbV9uc2Rpc2Nfc2VudCksIEJGQV9SUE9SVF9OU0RJU0N9LAorfTsKKworLyoqCisgKiAJCUJlZ2lubmluZyBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LCBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX1NFTkQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fcGxvZ2lfc2VuZGluZyk7CisJCXJwb3J0LT5wbG9naV9yZXRyaWVzID0gMDsKKwkJYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpKHJwb3J0LCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfUkNWRDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9wbG9naWFjY19zZW5kaW5nKTsKKwkJYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpYWNjKHJwb3J0LCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfQ09NUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9oYWxfb25saW5lKTsKKwkJYmZhX2Zjc19ycG9ydF9oYWxfb25saW5lKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfRElTQzoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9uc2Rpc2Nfc2VuZGluZyk7CisJCXJwb3J0LT5uc19yZXRyaWVzID0gMDsKKwkJYmZhX2Zjc19ycG9ydF9zZW5kX2dpZHBuKHJwb3J0LCBOVUxMKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAJCVBMT0dJIGlzIGJlaW5nIHNlbnQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpX3NlbmRpbmcoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkgICAgICAgZW51bSBycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUlBTTV9FVkVOVF9GQ1hQX1NFTlQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fcGxvZ2kpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fdW5pbml0KTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+ZmN4cF93cWUpOworCQliZmFfZmNzX3Jwb3J0X2ZyZWUocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpYWNjX3NlbmRpbmcpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9wbG9naWFjYyhycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgorCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fbnNkaXNjX3NlbmRpbmcpOworCQlycG9ydC0+bnNfcmV0cmllcyA9IDA7CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0xPR09fSU1QOgorCQlycG9ydC0+cGlkID0gMDsKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+ZmN4cF93cWUpOworCQliZmFfdGltZXJfc3RhcnQocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPnRpbWVyLAorCQkJCWJmYV9mY3NfcnBvcnRfdGltZW91dCwgcnBvcnQsCisJCQkJYmZhX2Zjc19ycG9ydF9kZWxfdGltZW91dCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1NDTjoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAJCVBMT0dJIGlzIGJlaW5nIHNlbnQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpYWNjX3NlbmRpbmcoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkJICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX0ZDWFBfU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9oYWxfb25saW5lKTsKKwkJYmZhX2Zjc19ycG9ydF9oYWxfb25saW5lKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9mY3hwX3dhbGxvY19jYW5jZWwocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPmZjeHBfd3FlKTsKKwkJYmZhX2Zjc19ycG9ydF9mcmVlKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfU0NOOgorCQkvKioKKwkJICogSWdub3JlLCBTQ04gaXMgcG9zc2libHkgb25saW5lIG5vdGlmaWNhdGlvbi4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgorCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fbnNkaXNjX3NlbmRpbmcpOworCQlycG9ydC0+bnNfcmV0cmllcyA9IDA7CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0xPR09fSU1QOgorCQlycG9ydC0+cGlkID0gMDsKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+ZmN4cF93cWUpOworCQliZmFfdGltZXJfc3RhcnQocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPnRpbWVyLAorCQkJCWJmYV9mY3NfcnBvcnRfdGltZW91dCwgcnBvcnQsCisJCQkJYmZhX2Zjc19ycG9ydF9kZWxfdGltZW91dCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0hDQl9PRkZMSU5FOgorCQkvKioKKwkJICogSWdub3JlIEJGQSBjYWxsYmFjaywgb24gYSBQTE9HSSByZWNlaXZlIHdlIGNhbGwgYmZhIG9mZmxpbmUuCisJCSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJUExPR0kgaXMgc2VudC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21fcGxvZ2lfcmV0cnkoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQllbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX1NDTjoKKwkJYmZhX3RpbWVyX3N0b3AoJnJwb3J0LT50aW1lcik7CisJCS8qCisJCSAqICEhIGZhbGwgdGhyb3VnaCAhIQorCQkgKi8KKworCWNhc2UgUlBTTV9FVkVOVF9USU1FT1VUOgorCQlycG9ydC0+cGxvZ2lfcmV0cmllcysrOworCQlpZiAocnBvcnQtPnBsb2dpX3JldHJpZXMgPCBCRkFfRkNTX1JQT1JUX01BWF9SRVRSSUVTKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpX3NlbmRpbmcpOworCQkJYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpKHJwb3J0LCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCXJwb3J0LT5waWQgPSAwOworCQkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9vZmZsaW5lKTsKKwkJCWJmYV90aW1lcl9zdGFydChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+dGltZXIsCisJCQkJCWJmYV9mY3NfcnBvcnRfdGltZW91dCwgcnBvcnQsCisJCQkJCWJmYV9mY3NfcnBvcnRfZGVsX3RpbWVvdXQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV91bmluaXQpOworCQliZmFfdGltZXJfc3RvcCgmcnBvcnQtPnRpbWVyKTsKKwkJYmZhX2Zjc19ycG9ydF9mcmVlKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19SQ1ZEOgorCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpYWNjX3NlbmRpbmcpOworCQliZmFfdGltZXJfc3RvcCgmcnBvcnQtPnRpbWVyKTsKKwkJYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpYWNjKHJwb3J0LCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJCWJmYV90aW1lcl9zdG9wKCZycG9ydC0+dGltZXIpOworCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKTsKKwkJcnBvcnQtPm5zX3JldHJpZXMgPSAwOworCQliZmFfZmNzX3Jwb3J0X3NlbmRfZ2lkcG4ocnBvcnQsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX0lNUDoKKwkJcnBvcnQtPnBpZCA9IDA7CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fb2ZmbGluZSk7CisJCWJmYV90aW1lcl9zdG9wKCZycG9ydC0+dGltZXIpOworCQliZmFfdGltZXJfc3RhcnQocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPnRpbWVyLAorCQkJCWJmYV9mY3NfcnBvcnRfdGltZW91dCwgcnBvcnQsCisJCQkJYmZhX2Zjc19ycG9ydF9kZWxfdGltZW91dCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGFsX29ubGluZSk7CisJCWJmYV90aW1lcl9zdG9wKCZycG9ydC0+dGltZXIpOworCQliZmFfZmNzX3Jwb3J0X2hhbF9vbmxpbmUocnBvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJUExPR0kgaXMgc2VudC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21fcGxvZ2koc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsIGVudW0gcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJQU01fRVZFTlRfQUNDRVBURUQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGFsX29ubGluZSk7CisJCXJwb3J0LT5wbG9naV9yZXRyaWVzID0gMDsKKwkJYmZhX2Zjc19ycG9ydF9oYWxfb25saW5lKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19SQ1ZEOgorCQliZmFfZmNzX3Jwb3J0X3NlbmRfbG9nb19hY2MocnBvcnQpOworCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKKwkJLyoKKwkJICogISEgZmFsbCB0aHJvdWdoICEhCisJCSAqLworCWNhc2UgUlBTTV9FVkVOVF9GQUlMRUQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fcGxvZ2lfcmV0cnkpOworCQliZmFfdGltZXJfc3RhcnQocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPnRpbWVyLAorCQkJCWJmYV9mY3NfcnBvcnRfdGltZW91dCwgcnBvcnQsCisJCQkJQkZBX0ZDU19SRVRSWV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19JTVA6CisJCXJwb3J0LT5waWQgPSAwOworCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX29mZmxpbmUpOworCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKKwkJYmZhX3RpbWVyX3N0YXJ0KHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT50aW1lciwKKwkJCQliZmFfZmNzX3Jwb3J0X3RpbWVvdXQsIHJwb3J0LAorCQkJCWJmYV9mY3NfcnBvcnRfZGVsX3RpbWVvdXQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9BRERSRVNTX0NIQU5HRToKKwkJYmZhX2ZjeHBfZGlzY2FyZChycG9ydC0+ZmN4cCk7CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fbnNkaXNjX3NlbmRpbmcpOworCQlycG9ydC0+bnNfcmV0cmllcyA9IDA7CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX1JDVkQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fcGxvZ2lhY2Nfc2VuZGluZyk7CisJCWJmYV9mY3hwX2Rpc2NhcmQocnBvcnQtPmZjeHApOworCQliZmFfZmNzX3Jwb3J0X3NlbmRfcGxvZ2lhY2MocnBvcnQsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9TQ046CisJCS8qKgorCQkgKiBJZ25vcmUgU0NOIC0gd2FpdCBmb3IgUExPR0kgcmVzcG9uc2UuCisJCSAqLworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fdW5pbml0KTsKKwkJYmZhX2ZjeHBfZGlzY2FyZChycG9ydC0+ZmN4cCk7CisJCWJmYV9mY3NfcnBvcnRfZnJlZShycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGFsX29ubGluZSk7CisJCWJmYV9mY3hwX2Rpc2NhcmQocnBvcnQtPmZjeHApOworCQliZmFfZmNzX3Jwb3J0X2hhbF9vbmxpbmUocnBvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJUExPR0kgaXMgY29tcGxldGUuIEF3YWl0aW5nIEJGQSBycG9ydCBvbmxpbmUgY2FsbGJhY2suIEZDLTRzCisgKiAJCWFyZSBvZmZsaW5lLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zbV9oYWxfb25saW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJZW51bSBycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUlBTTV9FVkVOVF9IQ0JfT05MSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX29ubGluZSk7CisJCWJmYV9mY3NfcnBvcnRfb25saW5lX2FjdGlvbihycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9oY2JfbG9nb3Jjdik7CisJCWJmYV9ycG9ydF9vZmZsaW5lKHJwb3J0LT5iZmFfcnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX0lNUDoKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGNiX29mZmxpbmUpOworCQliZmFfcnBvcnRfb2ZmbGluZShycG9ydC0+YmZhX3Jwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfUkNWRDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9wbG9naWFjY19zZW5kaW5nKTsKKwkJYmZhX3Jwb3J0X29mZmxpbmUocnBvcnQtPmJmYV9ycG9ydCk7CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9wbG9naWFjYyhycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9oY2JfbG9nb3NlbmQpOworCQliZmFfcnBvcnRfb2ZmbGluZShycG9ydC0+YmZhX3Jwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfU0NOOgorCQkvKioKKwkJICogQHRvZG8KKwkJICogSWdub3JlIFNDTiAtIFBMT0dJIGp1c3QgY29tcGxldGVkLCBGQy00IGxvZ2luIHNob3VsZCBkZXRlY3QKKwkJICogZGV2aWNlIGZhaWx1cmVzLgorCQkgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAJCVJwb3J0IGlzIE9OTElORS4gRkMtNHMgYWN0aXZlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zbV9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsIGVudW0gcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJQU01fRVZFTlRfU0NOOgorCQkvKioKKwkJICogUGF1c2UgRkMtNCBhY3Rpdml0eSB0aWxsIHJwb3J0IGlzIGF1dGhlbnRpY2F0ZWQuCisJCSAqIEluIHN3aXRjaGVkIGZhYnJpY3MsIGNoZWNrIHByZXNlbmNlIG9mIGRldmljZSBpbiBuYW1lc2VydmVyCisJCSAqIGZpcnN0LgorCQkgKi8KKwkJYmZhX2Zjc19ycG9ydF9mYzRfcGF1c2UocnBvcnQpOworCisJCWlmIChiZmFfZmNzX2ZhYnJpY19pc19zd2l0Y2hlZChycG9ydC0+cG9ydC0+ZmFicmljKSkgeworCQkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwKKwkJCQkJIGJmYV9mY3NfcnBvcnRfc21fbnNxdWVyeV9zZW5kaW5nKTsKKwkJCXJwb3J0LT5uc19yZXRyaWVzID0gMDsKKwkJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2FkaXNjX3NlbmRpbmcpOworCQkJYmZhX2Zjc19ycG9ydF9zZW5kX2FkaXNjKHJwb3J0LCBOVUxMKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEOgorCWNhc2UgUlBTTV9FVkVOVF9MT0dPX0lNUDoKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X29mZmxpbmUpOworCQliZmFfZmNzX3Jwb3J0X29mZmxpbmVfYWN0aW9uKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9sb2dvc2VuZCk7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X2xvZ29yY3YpOworCQliZmFfZmNzX3Jwb3J0X29mZmxpbmVfYWN0aW9uKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfQ09NUDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAJCUFuIFNDTiBldmVudCBpcyByZWNlaXZlZCBpbiBPTkxJTkUgc3RhdGUuIE5TIHF1ZXJ5IGlzIGJlaW5nIHNlbnQKKyAqIAkJcHJpb3IgdG8gQURJU0MgYXV0aGVudGljYXRpb24gd2l0aCBycG9ydC4gRkMtNHMgYXJlIHBhdXNlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21fbnNxdWVyeV9zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCSBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX0ZDWFBfU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9uc3F1ZXJ5KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9sb2dvc2VuZCk7CisJCWJmYV9mY3hwX3dhbGxvY19jYW5jZWwocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPmZjeHBfd3FlKTsKKwkJYmZhX2Zjc19ycG9ydF9vZmZsaW5lX2FjdGlvbihycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1NDTjoKKwkJLyoqCisJCSAqIGlnbm9yZSBTQ04sIHdhaXQgZm9yIHJlc3BvbnNlIHRvIHF1ZXJ5IGl0c2VsZgorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19SQ1ZEOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9sb2dvcmN2KTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+ZmN4cF93cWUpOworCQliZmFfZmNzX3Jwb3J0X29mZmxpbmVfYWN0aW9uKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19JTVA6CisJCXJwb3J0LT5waWQgPSAwOworCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV90aW1lcl9zdGFydChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+dGltZXIsCisJCQkJYmZhX2Zjc19ycG9ydF90aW1lb3V0LCBycG9ydCwKKwkJCQliZmFfZmNzX3Jwb3J0X2RlbF90aW1lb3V0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAlBbiBTQ04gZXZlbnQgaXMgcmVjZWl2ZWQgaW4gT05MSU5FIHN0YXRlLiBOUyBxdWVyeSBpcyBzZW50IHRvIHJwb3J0LgorICogCUZDLTRzIGFyZSBwYXVzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NtX25zcXVlcnkoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsIGVudW0gcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJQU01fRVZFTlRfQUNDRVBURUQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fYWRpc2Nfc2VuZGluZyk7CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9hZGlzYyhycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0ZBSUxFRDoKKwkJcnBvcnQtPm5zX3JldHJpZXMrKzsKKwkJaWYgKHJwb3J0LT5uc19yZXRyaWVzIDwgQkZBX0ZDU19SUE9SVF9NQVhfUkVUUklFUykgeworCQkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwKKwkJCQkJIGJmYV9mY3NfcnBvcnRfc21fbnNxdWVyeV9zZW5kaW5nKTsKKwkJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9vZmZsaW5lKTsKKwkJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9mYzRfbG9nb3NlbmQpOworCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKKwkJYmZhX2Zjc19ycG9ydF9vZmZsaW5lX2FjdGlvbihycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1NDTjoKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19SQ1ZEOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9sb2dvcmN2KTsKKwkJYmZhX2ZjeHBfZGlzY2FyZChycG9ydC0+ZmN4cCk7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9DT01QOgorCWNhc2UgUlBTTV9FVkVOVF9BRERSRVNTX0NIQU5HRToKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfTE9HT19JTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X29mZmxpbmUpOworCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKKwkJYmZhX2Zjc19ycG9ydF9vZmZsaW5lX2FjdGlvbihycG9ydCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCUFuIFNDTiBldmVudCBpcyByZWNlaXZlZCBpbiBPTkxJTkUgc3RhdGUuIEFESVNDIGlzIGJlaW5nIHNlbnQgZm9yCisgKiAJYXV0aGVudGljYXRpbmcgd2l0aCBycG9ydC4gRkMtNHMgYXJlIHBhdXNlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21fYWRpc2Nfc2VuZGluZyhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCSAgICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX0ZDWFBfU0VOVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9hZGlzYyk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9mYzRfbG9nb3NlbmQpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX0lNUDoKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X2xvZ29yY3YpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9TQ046CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX1JDVkQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJQW4gU0NOIGV2ZW50IGlzIHJlY2VpdmVkIGluIE9OTElORSBzdGF0ZS4gQURJU0MgaXMgdG8gcnBvcnQuCisgKiAJCUZDLTRzIGFyZSBwYXVzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NtX2FkaXNjKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LCBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX0FDQ0VQVEVEOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX29ubGluZSk7CisJCWJmYV9mY3NfcnBvcnRfZmM0X3Jlc3VtZShycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX1JDVkQ6CisJCS8qKgorCQkgKiBUb28gY29tcGxleCB0byBjbGVhbnVwIEZDLTQgJiBycG9ydCBhbmQgdGhlbiBhY2MgdG8gUExPR0kuCisJCSAqIEF0IGxlYXN0IGdvIG9mZmxpbmUgd2hlbiBhIFBMT0dJIGlzIHJlY2VpdmVkLgorCQkgKi8KKwkJYmZhX2ZjeHBfZGlzY2FyZChycG9ydC0+ZmN4cCk7CisJCS8qCisJCSAqICEhISBmYWxsIHRocm91Z2ggISEhCisJCSAqLworCisJY2FzZSBSUFNNX0VWRU5UX0ZBSUxFRDoKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X29mZmxpbmUpOworCQliZmFfZmNzX3Jwb3J0X29mZmxpbmVfYWN0aW9uKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9sb2dvc2VuZCk7CisJCWJmYV9mY3hwX2Rpc2NhcmQocnBvcnQtPmZjeHApOworCQliZmFfZmNzX3Jwb3J0X29mZmxpbmVfYWN0aW9uKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfU0NOOgorCQkvKioKKwkJICogYWxyZWFkeSBwcm9jZXNzaW5nIFJTQ04KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0xPR09fSU1QOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfZGlzY2FyZChycG9ydC0+ZmN4cCk7CisJCWJmYV9mY3NfcnBvcnRfb2ZmbGluZV9hY3Rpb24ocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fZmM0X2xvZ29yY3YpOworCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKKwkJYmZhX2Zjc19ycG9ydF9vZmZsaW5lX2FjdGlvbihycG9ydCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCQlScG9ydCBoYXMgc2VudCBMT0dPLiBBd2FpdGluZyBGQy00IG9mZmxpbmUgY29tcGxldGlvbiBjYWxsYmFjay4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21fZmM0X2xvZ29yY3Yoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQllbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX0ZDNF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2hjYl9sb2dvcmN2KTsKKwkJYmZhX3Jwb3J0X29mZmxpbmUocnBvcnQtPmJmYV9ycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9mYzRfbG9nb3NlbmQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJTE9HTyBuZWVkcyB0byBiZSBzZW50IHRvIHJwb3J0LiBBd2FpdGluZyBGQy00IG9mZmxpbmUgY29tcGxldGlvbgorICogCQljYWxsYmFjay4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21fZmM0X2xvZ29zZW5kKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJICAgICAgZW51bSBycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUlBTTV9FVkVOVF9GQzRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9oY2JfbG9nb3NlbmQpOworCQliZmFfcnBvcnRfb2ZmbGluZShycG9ydC0+YmZhX3Jwb3J0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiAJUnBvcnQgaXMgZ29pbmcgb2ZmbGluZS4gQXdhaXRpbmcgRkMtNCBvZmZsaW5lIGNvbXBsZXRpb24gY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NtX2ZjNF9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJZW51bSBycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUlBTTV9FVkVOVF9GQzRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9oY2Jfb2ZmbGluZSk7CisJCWJmYV9ycG9ydF9vZmZsaW5lKHJwb3J0LT5iZmFfcnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9TQ046CisJY2FzZSBSUFNNX0VWRU5UX0xPR09fSU1QOgorCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgorCQkvKioKKwkJICogcnBvcnQgaXMgYWxyZWFkeSBnb2luZyBvZmZsaW5lLgorCQkgKiBTQ04gLSBpZ25vcmUgYW5kIHdhaXQgdGlsbCB0cmFuc2l0aW9uaW5nIHRvIG9mZmxpbmUgc3RhdGUKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9mYzRfbG9nb3NlbmQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJUnBvcnQgaXMgb2ZmbGluZS4gRkMtNHMgYXJlIG9mZmxpbmUuIEF3YWl0aW5nIEJGQSBycG9ydCBvZmZsaW5lCisgKiAJCWNhbGxiYWNrLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zbV9oY2Jfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCWVudW0gcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJQU01fRVZFTlRfSENCX09GRkxJTkU6CisJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgorCQlpZiAoYmZhX2Zjc19wb3J0X2lzX29ubGluZShycG9ydC0+cG9ydCkpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsCisJCQkJCSBiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKTsKKwkJCXJwb3J0LT5uc19yZXRyaWVzID0gMDsKKwkJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQlycG9ydC0+cGlkID0gMDsKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fb2ZmbGluZSk7CisJCQliZmFfdGltZXJfc3RhcnQocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPnRpbWVyLAorCQkJCQliZmFfZmNzX3Jwb3J0X3RpbWVvdXQsIHJwb3J0LAorCQkJCQliZmFfZmNzX3Jwb3J0X2RlbF90aW1lb3V0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fdW5pbml0KTsKKwkJYmZhX2Zjc19ycG9ydF9mcmVlKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfU0NOOgorCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJCS8qKgorCQkgKiBJZ25vcmUsIGFscmVhZHkgb2ZmbGluZS4KKwkJICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCQlScG9ydCBpcyBvZmZsaW5lLiBGQy00cyBhcmUgb2ZmbGluZS4gQXdhaXRpbmcgQkZBIHJwb3J0IG9mZmxpbmUKKyAqIAkJY2FsbGJhY2sgdG8gc2VuZCBMT0dPIGFjY2VwdC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21faGNiX2xvZ29yY3Yoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQllbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX0hDQl9PRkZMSU5FOgorCWNhc2UgUlBTTV9FVkVOVF9BRERSRVNTX0NIQU5HRToKKwkJaWYgKHJwb3J0LT5waWQpCisJCQliZmFfZmNzX3Jwb3J0X3NlbmRfbG9nb19hY2MocnBvcnQpOworCQkvKgorCQkgKiBJZiB0aGUgbHBvcnQgaXMgb25saW5lIGFuZCBpZiB0aGUgcnBvcnQgaXMgbm90IGEgd2VsbCBrbm93bgorCQkgKiBhZGRyZXNzIHBvcnQsIHdlIHRyeSB0byByZS1kaXNjb3ZlciB0aGUgci1wb3J0LgorCQkgKi8KKwkJaWYgKGJmYV9mY3NfcG9ydF9pc19vbmxpbmUocnBvcnQtPnBvcnQpCisJCSAgICAmJiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsCisJCQkJCSBiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKTsKKwkJCXJwb3J0LT5uc19yZXRyaWVzID0gMDsKKwkJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogaWYgaXQgaXMgbm90IGEgd2VsbCBrbm93biBhZGRyZXNzLCByZXNldCB0aGUgcGlkIHRvCisJCQkgKgorCQkJICovCisJCQlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkKKwkJCQlycG9ydC0+cGlkID0gMDsKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fb2ZmbGluZSk7CisJCQliZmFfdGltZXJfc3RhcnQocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPnRpbWVyLAorCQkJCQliZmFfZmNzX3Jwb3J0X3RpbWVvdXQsIHJwb3J0LAorCQkJCQliZmFfZmNzX3Jwb3J0X2RlbF90aW1lb3V0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGNiX2xvZ29zZW5kKTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19JTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGNiX29mZmxpbmUpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJCS8qKgorCQkgKiBJZ25vcmUgLSBhbHJlYWR5IHByb2Nlc3NpbmcgYSBMT0dPLgorCQkgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBScG9ydCBpcyBiZWluZyBkZWxldGVkLiBGQy00cyBhcmUgb2ZmbGluZS4gQXdhaXRpbmcgQkZBIHJwb3J0IG9mZmxpbmUKKyAqIGNhbGxiYWNrIHRvIHNlbmQgTE9HTy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21faGNiX2xvZ29zZW5kKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJICAgICAgZW51bSBycG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUlBTTV9FVkVOVF9IQ0JfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9sb2dvX3NlbmRpbmcpOworCQliZmFfZmNzX3Jwb3J0X3NlbmRfbG9nbyhycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogCQlScG9ydCBpcyBiZWluZyBkZWxldGVkLiBGQy00cyBhcmUgb2ZmbGluZS4gTE9HTyBpcyBiZWluZyBzZW50LgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zbV9sb2dvX3NlbmRpbmcoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkgICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX0ZDWFBfU0VOVDoKKwkJLyoKKwkJICogT25jZSBMT0dPIGlzIHNlbnQsIHdlIGRvbm90IHdhaXQgZm9yIHRoZSByZXNwb25zZQorCQkgKi8KKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV91bmluaXQpOworCQliZmFfZmNzX3Jwb3J0X2ZyZWUocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9TQ046CisJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgorCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fdW5pbml0KTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+ZmN4cF93cWUpOworCQliZmFfZmNzX3Jwb3J0X2ZyZWUocnBvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJUnBvcnQgaXMgb2ZmbGluZS4gRkMtNHMgYXJlIG9mZmxpbmUuIEJGQSBycG9ydCBpcyBvZmZsaW5lLgorICogCQlUaW1lciBhY3RpdmUgdG8gZGVsZXRlIHN0YWxlIHJwb3J0LgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zbV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LCBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX1RJTUVPVVQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fdW5pbml0KTsKKwkJYmZhX2Zjc19ycG9ydF9mcmVlKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfU0NOOgorCWNhc2UgUlBTTV9FVkVOVF9BRERSRVNTX0NIQU5HRToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9uc2Rpc2Nfc2VuZGluZyk7CisJCWJmYV90aW1lcl9zdG9wKCZycG9ydC0+dGltZXIpOworCQlycG9ydC0+bnNfcmV0cmllcyA9IDA7CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV91bmluaXQpOworCQliZmFfdGltZXJfc3RvcCgmcnBvcnQtPnRpbWVyKTsKKwkJYmZhX2Zjc19ycG9ydF9mcmVlKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfUkNWRDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9wbG9naWFjY19zZW5kaW5nKTsKKwkJYmZhX3RpbWVyX3N0b3AoJnJwb3J0LT50aW1lcik7CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9wbG9naWFjYyhycG9ydCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfTE9HT19JTVA6CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGFsX29ubGluZSk7CisJCWJmYV90aW1lcl9zdG9wKCZycG9ydC0+dGltZXIpOworCQliZmFfZmNzX3Jwb3J0X2hhbF9vbmxpbmUocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9TRU5EOgorCQliZmFfdGltZXJfc3RvcCgmcnBvcnQtPnRpbWVyKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9wbG9naV9zZW5kaW5nKTsKKwkJcnBvcnQtPnBsb2dpX3JldHJpZXMgPSAwOworCQliZmFfZmNzX3Jwb3J0X3NlbmRfcGxvZ2kocnBvcnQsIE5VTEwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAlScG9ydCBhZGRyZXNzIGhhcyBjaGFuZ2VkLiBOYW1lc2VydmVyIGRpc2NvdmVyeSByZXF1ZXN0IGlzIGJlaW5nIHNlbnQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJCWVudW0gcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJQU01fRVZFTlRfRkNYUF9TRU5UOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9mY3hwX3dhbGxvY19jYW5jZWwocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPmZjeHBfd3FlKTsKKwkJYmZhX2Zjc19ycG9ydF9mcmVlKHJwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfUkNWRDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9wbG9naWFjY19zZW5kaW5nKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+ZmN4cF93cWUpOworCQliZmFfZmNzX3Jwb3J0X3NlbmRfcGxvZ2lhY2MocnBvcnQsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9TQ046CisJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfU0VORDoKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfQUREUkVTU19DSEFOR0U6CisJCXJwb3J0LT5uc19yZXRyaWVzID0gMDsJLyogcmVzZXQgdGhlIHJldHJ5IGNvdW50ICovCisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX0xPR09fSU1QOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSk7CisJCWJmYV90aW1lcl9zdGFydChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+dGltZXIsCisJCQkJYmZhX2Zjc19ycG9ydF90aW1lb3V0LCBycG9ydCwKKwkJCQliZmFfZmNzX3Jwb3J0X2RlbF90aW1lb3V0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfUExPR0lfQ09NUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9oYWxfb25saW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChycG9ydC0+ZmNzLT5iZmEsICZycG9ydC0+ZmN4cF93cWUpOworCQliZmFfZmNzX3Jwb3J0X2hhbF9vbmxpbmUocnBvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIAkJTmFtZXNlcnZlciBkaXNjb3ZlcnkgZmFpbGVkLiBXYWl0aW5nIGZvciB0aW1lb3V0IHRvIHJldHJ5LgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zbV9uc2Rpc2NfcmV0cnkoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQkgICAgICBlbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX1RJTUVPVVQ6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fbnNkaXNjX3NlbmRpbmcpOworCQliZmFfZmNzX3Jwb3J0X3NlbmRfZ2lkcG4ocnBvcnQsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9TQ046CisJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKTsKKwkJYmZhX3RpbWVyX3N0b3AoJnJwb3J0LT50aW1lcik7CisJCXJwb3J0LT5uc19yZXRyaWVzID0gMDsKKwkJYmZhX2Zjc19ycG9ydF9zZW5kX2dpZHBuKHJwb3J0LCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV90aW1lcl9zdG9wKCZycG9ydC0+dGltZXIpOworCQliZmFfZmNzX3Jwb3J0X2ZyZWUocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpYWNjX3NlbmRpbmcpOworCQliZmFfdGltZXJfc3RvcCgmcnBvcnQtPnRpbWVyKTsKKwkJYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpYWNjKHJwb3J0LCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19JTVA6CisJCXJwb3J0LT5waWQgPSAwOworCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmcnBvcnQtPnRpbWVyKTsKKwkJYmZhX3RpbWVyX3N0YXJ0KHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT50aW1lciwKKwkJCQliZmFfZmNzX3Jwb3J0X3RpbWVvdXQsIHJwb3J0LAorCQkJCWJmYV9mY3NfcnBvcnRfZGVsX3RpbWVvdXQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJCWJmYV9mY3NfcnBvcnRfc2VuZF9sb2dvX2FjYyhycG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSUFNNX0VWRU5UX1BMT0dJX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21faGFsX29ubGluZSk7CisJCWJmYV90aW1lcl9zdG9wKCZycG9ydC0+dGltZXIpOworCQliZmFfZmNzX3Jwb3J0X2hhbF9vbmxpbmUocnBvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIFJwb3J0IGFkZHJlc3MgaGFzIGNoYW5nZWQuIE5hbWVzZXJ2ZXIgZGlzY292ZXJ5IHJlcXVlc3QgaXMgc2VudC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc21fbnNkaXNjX3NlbnQoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQllbnVtIHJwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUFNNX0VWRU5UX0FDQ0VQVEVEOgorCWNhc2UgUlBTTV9FVkVOVF9BRERSRVNTX0NIQU5HRToKKwkJaWYgKHJwb3J0LT5waWQpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fcGxvZ2lfc2VuZGluZyk7CisJCQliZmFfZmNzX3Jwb3J0X3NlbmRfcGxvZ2kocnBvcnQsIE5VTEwpOworCQl9IGVsc2UgeworCQkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwKKwkJCQkJIGJmYV9mY3NfcnBvcnRfc21fbnNkaXNjX3NlbmRpbmcpOworCQkJcnBvcnQtPm5zX3JldHJpZXMgPSAwOworCQkJYmZhX2Zjc19ycG9ydF9zZW5kX2dpZHBuKHJwb3J0LCBOVUxMKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9GQUlMRUQ6CisJCXJwb3J0LT5uc19yZXRyaWVzKys7CisJCWlmIChycG9ydC0+bnNfcmV0cmllcyA8IEJGQV9GQ1NfUlBPUlRfTUFYX1JFVFJJRVMpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsCisJCQkJCSBiZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKTsKKwkJCWJmYV9mY3NfcnBvcnRfc2VuZF9naWRwbihycG9ydCwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQlycG9ydC0+cGlkID0gMDsKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnBvcnQsIGJmYV9mY3NfcnBvcnRfc21fb2ZmbGluZSk7CisJCQliZmFfdGltZXJfc3RhcnQocnBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPnRpbWVyLAorCQkJCQliZmFfZmNzX3Jwb3J0X3RpbWVvdXQsIHJwb3J0LAorCQkJCQliZmFfZmNzX3Jwb3J0X2RlbF90aW1lb3V0KTsKKwkJfTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9mY3hwX2Rpc2NhcmQocnBvcnQtPmZjeHApOworCQliZmFfZmNzX3Jwb3J0X2ZyZWUocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpYWNjX3NlbmRpbmcpOworCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKKwkJYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpYWNjKHJwb3J0LCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFJQU01fRVZFTlRfTE9HT19JTVA6CisJCXJwb3J0LT5waWQgPSAwOworCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX29mZmxpbmUpOworCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKKwkJYmZhX3RpbWVyX3N0YXJ0KHJwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT50aW1lciwKKwkJCQliZmFfZmNzX3Jwb3J0X3RpbWVvdXQsIHJwb3J0LAorCQkJCWJmYV9mY3NfcnBvcnRfZGVsX3RpbWVvdXQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9TQ046CisJCS8qKgorCQkgKiBpZ25vcmUsIHdhaXQgZm9yIE5TIHF1ZXJ5IHJlc3BvbnNlCisJCSAqLworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CisJCS8qKgorCQkgKiBOb3QgbG9nZ2VkLWluIHlldC4gQWNjZXB0IExPR08uCisJCSAqLworCQliZmFfZmNzX3Jwb3J0X3NlbmRfbG9nb19hY2MocnBvcnQpOworCQlicmVhazsKKworCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9DT01QOgorCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LCBiZmFfZmNzX3Jwb3J0X3NtX2hhbF9vbmxpbmUpOworCQliZmFfZmN4cF9kaXNjYXJkKHJwb3J0LT5mY3hwKTsKKwkJYmZhX2Zjc19ycG9ydF9oYWxfb25saW5lKHJwb3J0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisKKy8qKgorICogIGZjc19ycG9ydF9wcml2YXRlIEZDUyBSUE9SVCBwcm92YXRlIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NlbmRfcGxvZ2kodm9pZCAqcnBvcnRfY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSBycG9ydF9jYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJaW50ICAgICAgICAgICAgIGxlbjsKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCisJZmN4cCA9IGZjeHBfYWxsb2NlZCA/IGZjeHBfYWxsb2NlZCA6IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkgeworCQliZmFfZmN4cF9hbGxvY193YWl0KHBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3Jwb3J0X3NlbmRfcGxvZ2ksIHJwb3J0KTsKKwkJcmV0dXJuOworCX0KKwlycG9ydC0+ZmN4cCA9IGZjeHA7CisKKwlsZW4gPSBmY19wbG9naV9idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwgcnBvcnQtPnBpZCwKKwkJCSAgICAgYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLCAwLAorCQkJICAgICBwb3J0LT5wb3J0X2NmZy5wd3duLCBwb3J0LT5wb3J0X2NmZy5ud3duLAorCQkJICAgICBiZmFfcHBvcnRfZ2V0X21heGZyc2l6ZShwb3J0LT5mY3MtPmJmYSkpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19ycG9ydF9wbG9naV9yZXNwb25zZSwKKwkJICAgICAgKHZvaWQgKilycG9ydCwgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCisJcnBvcnQtPnN0YXRzLnBsb2dpcysrOworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0ZDWFBfU0VOVCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3Bsb2dpX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsIHZvaWQgKmNiYXJnLAorCQkJICAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywgdTMyIHJzcF9sZW4sCisJCQkgICAgIHUzMiByZXNpZF9sZW4sIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKiljYmFyZzsKKwlzdHJ1Y3QgZmNfbG9naV9zCSpwbG9naV9yc3A7CisJc3RydWN0IGZjX2xzX3JqdF9zCSpsc19yanQ7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqdHdpbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZTsKKworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCisJLyoKKwkgKiBTYW5pdHkgQ2hlY2tzCisJICovCisJaWYgKHJlcV9zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKHJwb3J0LT5mY3MsIHJlcV9zdGF0dXMpOworCQlycG9ydC0+c3RhdHMucGxvZ2lfZmFpbGVkKys7CisJCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0ZBSUxFRCk7CisJCXJldHVybjsKKwl9CisKKwlwbG9naV9yc3AgPSAoc3RydWN0IGZjX2xvZ2lfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCisJLyoqCisJICogQ2hlY2sgZm9yIGZhaWx1cmUgZmlyc3QuCisJICovCisJaWYgKHBsb2dpX3JzcC0+ZWxzX2NtZC5lbHNfY29kZSAhPSBGQ19FTFNfQUNDKSB7CisJCWxzX3JqdCA9IChzdHJ1Y3QgZmNfbHNfcmp0X3MgKikgQkZBX0ZDWFBfUlNQX1BMRChmY3hwKTsKKworCQliZmFfdHJjKHJwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGUpOworCQliZmFfdHJjKHJwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGVfZXhwbCk7CisKKwkJcnBvcnQtPnN0YXRzLnBsb2dpX3JlamVjdHMrKzsKKwkJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfRkFJTEVEKTsKKwkJcmV0dXJuOworCX0KKworCS8qKgorCSAqIFBMT0dJIGlzIGNvbXBsZXRlLiBNYWtlIHN1cmUgdGhpcyBkZXZpY2UgaXMgbm90IG9uZSBvZiB0aGUga25vd24KKwkgKiBkZXZpY2Ugd2l0aCBhIG5ldyBGQyBwb3J0IGFkZHJlc3MuCisJICovCisJbGlzdF9mb3JfZWFjaChxZSwgJnJwb3J0LT5wb3J0LT5ycG9ydF9xKSB7CisJCXR3aW4gPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXFlOworCQlpZiAodHdpbiA9PSBycG9ydCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXJwb3J0LT5wd3duICYmIChwbG9naV9yc3AtPnBvcnRfbmFtZSA9PSB0d2luLT5wd3duKSkgeworCQkJYmZhX3RyYyhycG9ydC0+ZmNzLCB0d2luLT5waWQpOworCQkJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKworCQkJLyoKKwkJCSAqIFVwZGF0ZSBwbG9naSBzdGF0cyBpbiB0d2luCisJCQkgKi8KKwkJCXR3aW4tPnN0YXRzLnBsb2dpcyArPSBycG9ydC0+c3RhdHMucGxvZ2lzOworCQkJdHdpbi0+c3RhdHMucGxvZ2lfcmVqZWN0cyArPSBycG9ydC0+c3RhdHMucGxvZ2lfcmVqZWN0czsKKwkJCXR3aW4tPnN0YXRzLnBsb2dpX3RpbWVvdXRzICs9CisJCQkJcnBvcnQtPnN0YXRzLnBsb2dpX3RpbWVvdXRzOworCQkJdHdpbi0+c3RhdHMucGxvZ2lfZmFpbGVkICs9IHJwb3J0LT5zdGF0cy5wbG9naV9mYWlsZWQ7CisJCQl0d2luLT5zdGF0cy5wbG9naV9yY3ZkICs9IHJwb3J0LT5zdGF0cy5wbG9naV9yY3ZkOworCQkJdHdpbi0+c3RhdHMucGxvZ2lfYWNjcysrOworCisJCQliZmFfZmNzX3Jwb3J0X2RlbGV0ZShycG9ydCk7CisKKwkJCWJmYV9mY3NfcnBvcnRfdXBkYXRlKHR3aW4sIHBsb2dpX3JzcCk7CisJCQl0d2luLT5waWQgPSByc3BfZmNocy0+c19pZDsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHR3aW4sIFJQU01fRVZFTlRfUExPR0lfQ09NUCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKioKKwkgKiBOb3JtYWwgbG9naW4gcGF0aCAtLSBubyBldmlsIHR3aW5zLgorCSAqLworCXJwb3J0LT5zdGF0cy5wbG9naV9hY2NzKys7CisJYmZhX2Zjc19ycG9ydF91cGRhdGUocnBvcnQsIHBsb2dpX3JzcCk7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfQUNDRVBURUQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpYWNjKHZvaWQgKnJwb3J0X2NiYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gcnBvcnRfY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCWludCAgICAgICAgICAgICBsZW47CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5yZXBseV9veGlkKTsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJYmZhX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSwKKwkJCQkgICAgYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpYWNjLCBycG9ydCk7CisJCXJldHVybjsKKwl9CisJcnBvcnQtPmZjeHAgPSBmY3hwOworCisJbGVuID0gZmNfcGxvZ2lfYWNjX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCBycG9ydC0+cGlkLAorCQkJCSBiZmFfZmNzX3BvcnRfZ2V0X2ZjaWQocG9ydCksIHJwb3J0LT5yZXBseV9veGlkLAorCQkJCSBwb3J0LT5wb3J0X2NmZy5wd3duLCBwb3J0LT5wb3J0X2NmZy5ud3duLAorCQkJCSBiZmFfcHBvcnRfZ2V0X21heGZyc2l6ZShwb3J0LT5mY3MtPmJmYSkpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgTlVMTCwgTlVMTCwgRkNfTUFYX1BEVVNaLCAwKTsKKworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0ZDWFBfU0VOVCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3NlbmRfYWRpc2Modm9pZCAqcnBvcnRfY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSBycG9ydF9jYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJaW50ICAgICAgICAgICAgIGxlbjsKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCisJZmN4cCA9IGZjeHBfYWxsb2NlZCA/IGZjeHBfYWxsb2NlZCA6IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkgeworCQliZmFfZmN4cF9hbGxvY193YWl0KHBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3Jwb3J0X3NlbmRfYWRpc2MsIHJwb3J0KTsKKwkJcmV0dXJuOworCX0KKwlycG9ydC0+ZmN4cCA9IGZjeHA7CisKKwlsZW4gPSBmY19hZGlzY19idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwgcnBvcnQtPnBpZCwKKwkJCSAgICAgYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLCAwLAorCQkJICAgICBwb3J0LT5wb3J0X2NmZy5wd3duLCBwb3J0LT5wb3J0X2NmZy5ud3duKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCisJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIGJmYV9mY3NfcnBvcnRfYWRpc2NfcmVzcG9uc2UsCisJCSAgICAgIHJwb3J0LCBGQ19NQVhfUERVU1osIEZDX1JBX1RPVik7CisKKwlycG9ydC0+c3RhdHMuYWRpc2Nfc2VudCsrOworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0ZDWFBfU0VOVCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X2FkaXNjX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsIHZvaWQgKmNiYXJnLAorCQkJICAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywgdTMyIHJzcF9sZW4sCisJCQkgICAgIHUzMiByZXNpZF9sZW4sIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKiljYmFyZzsKKwl2b2lkICAgICAgICAgICAqcGxkID0gYmZhX2ZjeHBfZ2V0X3JzcGJ1ZihmY3hwKTsKKwlzdHJ1Y3QgZmNfbHNfcmp0X3MgICAgKmxzX3JqdDsKKworCWlmIChyZXFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhycG9ydC0+ZmNzLCByZXFfc3RhdHVzKTsKKwkJcnBvcnQtPnN0YXRzLmFkaXNjX2ZhaWxlZCsrOworCQliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9GQUlMRUQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGZjX2FkaXNjX3JzcF9wYXJzZSgoc3RydWN0IGZjX2FkaXNjX3MgKilwbGQsIHJzcF9sZW4sIHJwb3J0LT5wd3duLAorCQlycG9ydC0+bnd3bikgID09IEZDX1BBUlNFX09LKSB7CisJCXJwb3J0LT5zdGF0cy5hZGlzY19hY2NzKys7CisJCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0FDQ0VQVEVEKTsKKwkJcmV0dXJuOworCX0KKworCXJwb3J0LT5zdGF0cy5hZGlzY19yZWplY3RzKys7CisJbHNfcmp0ID0gcGxkOworCWJmYV90cmMocnBvcnQtPmZjcywgbHNfcmp0LT5lbHNfY21kLmVsc19jb2RlKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGUpOworCWJmYV90cmMocnBvcnQtPmZjcywgbHNfcmp0LT5yZWFzb25fY29kZV9leHBsKTsKKwliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9GQUlMRUQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zZW5kX2dpZHBuKHZvaWQgKnJwb3J0X2NiYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gcnBvcnRfY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCWludCAgICAgICAgICAgICBsZW47CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCisJZmN4cCA9IGZjeHBfYWxsb2NlZCA/IGZjeHBfYWxsb2NlZCA6IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkgeworCQliZmFfZmN4cF9hbGxvY193YWl0KHBvcnQtPmZjcy0+YmZhLCAmcnBvcnQtPmZjeHBfd3FlLAorCQkJCSAgICBiZmFfZmNzX3Jwb3J0X3NlbmRfZ2lkcG4sIHJwb3J0KTsKKwkJcmV0dXJuOworCX0KKwlycG9ydC0+ZmN4cCA9IGZjeHA7CisKKwlsZW4gPSBmY19naWRwbl9idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwKKwkJCSAgICAgYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLCAwLCBycG9ydC0+cHd3bik7CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywgQkZBX0ZBTFNFLAorCQkgICAgICBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBiZmFfZmNzX3Jwb3J0X2dpZHBuX3Jlc3BvbnNlLAorCQkgICAgICAodm9pZCAqKXJwb3J0LCBGQ19NQVhfUERVU1osIEZDX1JBX1RPVik7CisKKwliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9GQ1hQX1NFTlQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9naWRwbl9yZXNwb25zZSh2b2lkICpmY3NhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLCB2b2lkICpjYmFyZywKKwkJCSAgICAgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsIHUzMiByc3BfbGVuLAorCQkJICAgICB1MzIgcmVzaWRfbGVuLCBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopY2Jhcmc7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqdHdpbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZTsKKwlzdHJ1Y3QgY3RfaGRyX3MgICAgICAgCSpjdGhkcjsKKwlzdHJ1Y3QgZmNnc19naWRwbl9yZXNwX3MJKmdpZHBuX3JzcDsKKworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCisJY3RoZHIgPSAoc3RydWN0IGN0X2hkcl9zICopIEJGQV9GQ1hQX1JTUF9QTEQoZmN4cCk7CisJY3RoZHItPmNtZF9yc3BfY29kZSA9IGJmYV9vc19udG9ocyhjdGhkci0+Y21kX3JzcF9jb2RlKTsKKworCWlmIChjdGhkci0+Y21kX3JzcF9jb2RlID09IENUX1JTUF9BQ0NFUFQpIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIHBpZCBpcyB0aGUgc2FtZSBhcyBiZWZvcmUuCisJCSAqLworCQlnaWRwbl9yc3AgPSAoc3RydWN0IGZjZ3NfZ2lkcG5fcmVzcF9zICopIChjdGhkciArIDEpOworCisJCWlmIChnaWRwbl9yc3AtPmRhcCA9PSBycG9ydC0+cGlkKSB7CisJCQkvKgorCQkJICogRGV2aWNlIGlzIG9ubGluZQorCQkJICovCisJCQliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9BQ0NFUFRFRCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRGV2aWNlJ3MgUElEIGhhcyBjaGFuZ2VkLiBXZSBuZWVkIHRvIGNsZWFudXAgYW5kCisJCQkgKiByZS1sb2dpbi4gSWYgdGhlcmUgaXMgYW5vdGhlciBkZXZpY2Ugd2l0aCB0aGUgdGhlCisJCQkgKiBuZXdseSBkaXNjb3ZlcmVkIHBpZCwgc2VuZCBhbiBzY24gbm90aWNlIHNvIHRoYXQgaXRzCisJCQkgKiBuZXcgcGlkIGNhbiBiZSBkaXNjb3ZlcmVkLgorCQkJICovCisJCQlsaXN0X2Zvcl9lYWNoKHFlLCAmcnBvcnQtPnBvcnQtPnJwb3J0X3EpIHsKKwkJCQl0d2luID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKilxZTsKKwkJCQlpZiAodHdpbiA9PSBycG9ydCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGdpZHBuX3JzcC0+ZGFwID09IHR3aW4tPnBpZCkgeworCQkJCQliZmFfdHJjKHJwb3J0LT5mY3MsIHR3aW4tPnBpZCk7CisJCQkJCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisKKwkJCQkJdHdpbi0+cGlkID0gMDsKKwkJCQkJYmZhX3NtX3NlbmRfZXZlbnQodHdpbiwKKwkJCQkJCVJQU01fRVZFTlRfQUREUkVTU19DSEFOR0UpOworCQkJCX0KKwkJCX0KKwkJCXJwb3J0LT5waWQgPSBnaWRwbl9yc3AtPmRhcDsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBSZWplY3QgUmVzcG9uc2UKKwkgKi8KKwlzd2l0Y2ggKGN0aGRyLT5yZWFzb25fY29kZSkgeworCWNhc2UgQ1RfUlNOX0xPR0lDQUxfQlVTWToKKwkJLyoKKwkJICogTmVlZCB0byByZXRyeQorCQkgKi8KKwkJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfVElNRU9VVCk7CisJCWJyZWFrOworCisJY2FzZSBDVF9SU05fVU5BQkxFX1RPX1BFUkY6CisJCS8qCisJCSAqIGRldmljZSBkb2Vzbid0IGV4aXN0IDogU3RhcnQgdGltZXIgdG8gY2xlYW51cCB0aGlzIGxhdGVyLgorCQkgKi8KKwkJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfRkFJTEVEKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9GQUlMRUQpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogICAgQ2FsbGVkIHRvIHNlbmQgYSBsb2dvdXQgdG8gdGhlIHJwb3J0LgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zZW5kX2xvZ28odm9pZCAqcnBvcnRfY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSBycG9ydF9jYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXUxNiAgICAgICAgbGVuOworCisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKworCXBvcnQgPSBycG9ydC0+cG9ydDsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJYmZhX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJnJwb3J0LT5mY3hwX3dxZSwKKwkJCQkgICAgYmZhX2Zjc19ycG9ydF9zZW5kX2xvZ28sIHJwb3J0KTsKKwkJcmV0dXJuOworCX0KKwlycG9ydC0+ZmN4cCA9IGZjeHA7CisKKwlsZW4gPSBmY19sb2dvX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCBycG9ydC0+cGlkLAorCQkJICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgMCwKKwkJCSAgICBiZmFfZmNzX3BvcnRfZ2V0X3B3d24ocG9ydCkpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgTlVMTCwgcnBvcnQsIEZDX01BWF9QRFVTWiwKKwkJICAgICAgRkNfRURfVE9WKTsKKworCXJwb3J0LT5zdGF0cy5sb2dvcysrOworCWJmYV9mY3hwX2Rpc2NhcmQocnBvcnQtPmZjeHApOworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0ZDWFBfU0VOVCk7Cit9CisKKy8qKgorICogICAgU2VuZCBBQ0MgZm9yIGEgTE9HTyByZWNlaXZlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfc2VuZF9sb2dvX2FjYyh2b2lkICpycG9ydF9jYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IHJwb3J0X2NiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydDsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJdTE2ICAgICAgICBsZW47CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCisJcG9ydCA9IHJwb3J0LT5wb3J0OworCisJZmN4cCA9IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkKKwkJcmV0dXJuOworCisJcnBvcnQtPnN0YXRzLmxvZ29fcmN2ZCsrOworCWxlbiA9IGZjX2xvZ29fYWNjX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCBycG9ydC0+cGlkLAorCQkJCWJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgcnBvcnQtPnJlcGx5X294aWQpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgTlVMTCwgTlVMTCwgRkNfTUFYX1BEVVNaLCAwKTsKK30KKworLyoqCisgKiAgICAgVGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIGJ5IGJmYV90aW1lciBvbiB0aW1lciB0aW1lb3V0cy4KKyAqCisgKiAJcGFyYW1baW5dIAlycG9ydCAJCQktIHBvaW50ZXIgdG8gYmZhX2Zjc19wb3J0X25zX3QuCisgKiAJcGFyYW1bb3V0XQlycG9ydF9zdGF0dXMgCS0gcG9pbnRlciB0byByZXR1cm4gdnBvcnQgc3RhdHVzIGluCisgKgorICogCXJldHVybgorICogCQl2b2lkCisgKgorKiAgCVNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6CisgKgorICogCW5vdGUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfdGltZW91dCh2b2lkICphcmcpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKWFyZzsKKworCXJwb3J0LT5zdGF0cy5wbG9naV90aW1lb3V0cysrOworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9wcm9jZXNzX3BybGkoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQlzdHJ1Y3QgZmNoc19zICpyeF9mY2hzLCB1MTYgbGVuKQoreworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNoczsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgZmNfcHJsaV9zICAgICAgKnBybGk7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcnhfZmNocy0+c19pZCk7CisJYmZhX3RyYyhwb3J0LT5mY3MsIHJ4X2ZjaHMtPmRfaWQpOworCisJcnBvcnQtPnN0YXRzLnBybGlfcmN2ZCsrOworCisJaWYgKEJGQV9GQ1NfVlBPUlRfSVNfVEFSR0VUX01PREUocG9ydCkpIHsKKwkJLyoKKwkJICogVGFyZ2V0IE1vZGUgOiBMZXQgdGhlIGZjcHRtIGhhbmRsZSBpdAorCQkgKi8KKwkJYmZhX2Zjc190aW5fcnhfcHJsaShycG9ydC0+dGluLCByeF9mY2hzLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBXZSBhcmUgZWl0aGVyIGluIEluaXRpYXRvciBvciBpcGZjIE1vZGUKKwkgKi8KKwlwcmxpID0gKHN0cnVjdCBmY19wcmxpX3MgKikgKHJ4X2ZjaHMgKyAxKTsKKworCWlmIChwcmxpLT5wYXJhbXBhZ2Uuc2VydnBhcmFtcy5pbml0aWF0b3IpIHsKKwkJYmZhX3RyYyhycG9ydC0+ZmNzLCBwcmxpLT5wYXJhbXBhZ2UudHlwZSk7CisJCXJwb3J0LT5zY3NpX2Z1bmN0aW9uID0gQkZBX1JQT1JUX0lOSVRJQVRPUjsKKwkJYmZhX2Zjc19pdG5pbV9pc19pbml0aWF0b3IocnBvcnQtPml0bmltKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBAdG9kbzogUFJMSSBmcm9tIGEgdGFyZ2V0ID8KKwkJICovCisJCWJmYV90cmMocG9ydC0+ZmNzLCByeF9mY2hzLT5zX2lkKTsKKwkJcnBvcnQtPnNjc2lfZnVuY3Rpb24gPSBCRkFfUlBPUlRfVEFSR0VUOworCX0KKworCWZjeHAgPSBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApCisJCXJldHVybjsKKworCWxlbiA9IGZjX3BybGlfYWNjX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCByeF9mY2hzLT5zX2lkLAorCQkJCWJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgcnhfZmNocy0+b3hfaWQsCisJCQkJcG9ydC0+cG9ydF9jZmcucm9sZXMpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJICAgICAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgTlVMTCwgTlVMTCwgRkNfTUFYX1BEVVNaLCAwKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfcHJvY2Vzc19ycHNjKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJc3RydWN0IGZjaHNfcyAqcnhfZmNocywgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJc3RydWN0IGZjX3Jwc2Nfc3BlZWRfaW5mb19zIHNwZWVkczsKKwlzdHJ1Y3QgYmZhX3Bwb3J0X2F0dHJfcyBwcG9ydF9hdHRyOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHJ4X2ZjaHMtPnNfaWQpOworCWJmYV90cmMocG9ydC0+ZmNzLCByeF9mY2hzLT5kX2lkKTsKKworCXJwb3J0LT5zdGF0cy5ycHNjX3JjdmQrKzsKKwlzcGVlZHMucG9ydF9zcGVlZF9jYXAgPQorCQlSUFNDX1NQRUVEX0NBUF8xRyB8IFJQU0NfU1BFRURfQ0FQXzJHIHwgUlBTQ19TUEVFRF9DQVBfNEcgfAorCQlSUFNDX1NQRUVEX0NBUF84RzsKKworCS8qCisJICogZ2V0IGN1cmVudCBzcGVlZCBmcm9tIHBwb3J0IGF0dHJpYnV0ZXMgZnJvbSBCRkEKKwkgKi8KKwliZmFfcHBvcnRfZ2V0X2F0dHIocG9ydC0+ZmNzLT5iZmEsICZwcG9ydF9hdHRyKTsKKworCXNwZWVkcy5wb3J0X29wX3NwZWVkID0gZmNfYmZhX3NwZWVkX3RvX3Jwc2Nfb3BlcnNwZWVkKHBwb3J0X2F0dHIuc3BlZWQpOworCisJZmN4cCA9IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWlmICghZmN4cCkKKwkJcmV0dXJuOworCisJbGVuID0gZmNfcnBzY19hY2NfYnVpbGQoJmZjaHMsIGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCksIHJ4X2ZjaHMtPnNfaWQsCisJCQkJYmZhX2Zjc19wb3J0X2dldF9mY2lkKHBvcnQpLCByeF9mY2hzLT5veF9pZCwKKwkJCQkmc3BlZWRzKTsKKworCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCisJCSAgICAgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIE5VTEwsIE5VTEwsIEZDX01BWF9QRFVTWiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X3Byb2Nlc3NfYWRpc2Moc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQlzdHJ1Y3QgZmNoc19zICpyeF9mY2hzLCB1MTYgbGVuKQoreworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNoczsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgZmNfYWRpc2NfcyAgICAgICphZGlzYzsKKworCWJmYV90cmMocG9ydC0+ZmNzLCByeF9mY2hzLT5zX2lkKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgcnhfZmNocy0+ZF9pZCk7CisKKwlycG9ydC0+c3RhdHMuYWRpc2NfcmN2ZCsrOworCisJaWYgKEJGQV9GQ1NfVlBPUlRfSVNfVEFSR0VUX01PREUocG9ydCkpIHsKKwkJLyoKKwkJICogQHRvZG8gOiBUYXJnZXQgTW9kZSBoYW5kbGluZworCQkgKi8KKwkJYmZhX3RyYyhwb3J0LT5mY3MsIHJ4X2ZjaHMtPmRfaWQpOworCQliZmFfYXNzZXJ0KDApOworCQlyZXR1cm47CisJfQorCisJYWRpc2MgPSAoc3RydWN0IGZjX2FkaXNjX3MgKikgKHJ4X2ZjaHMgKyAxKTsKKworCS8qCisJICogQWNjZXB0IGlmIHRoZSBpdG5pbSBmb3IgdGhpcyBycG9ydCBpcyBvbmxpbmUuIEVsc2UgcmVqZWN0IHRoZSBBRElTQworCSAqLworCWlmIChiZmFfZmNzX2l0bmltX2dldF9vbmxpbmVfc3RhdGUocnBvcnQtPml0bmltKSA9PSBCRkFfU1RBVFVTX09LKSB7CisKKwkJZmN4cCA9IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCQlpZiAoIWZjeHApCisJCQlyZXR1cm47CisKKwkJbGVuID0gZmNfYWRpc2NfYWNjX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLAorCQkJCQkgcnhfZmNocy0+c19pZCwKKwkJCQkJIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwKKwkJCQkJIHJ4X2ZjaHMtPm94X2lkLCBwb3J0LT5wb3J0X2NmZy5wd3duLAorCQkJCQkgcG9ydC0+cG9ydF9jZmcubnd3bik7CisKKwkJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsCisJCQkgICAgICBCRkFfRkFMU0UsIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsIE5VTEwsIE5VTEwsCisJCQkgICAgICBGQ19NQVhfUERVU1osIDApOworCX0gZWxzZSB7CisJCXJwb3J0LT5zdGF0cy5hZGlzY19yZWplY3RlZCsrOworCQliZmFfZmNzX3Jwb3J0X3NlbmRfbHNfcmp0KHJwb3J0LCByeF9mY2hzLAorCQkJCQkgIEZDX0xTX1JKVF9SU05fVU5BQkxFX1RPX1BFUkZfQ01ELAorCQkJCQkgIEZDX0xTX1JKVF9FWFBfTE9HSU5fUkVRVUlSRUQpOworCX0KKworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9oYWxfb25saW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IHJwb3J0LT5wb3J0OworCXN0cnVjdCBiZmFfcnBvcnRfaW5mb19zIHJwb3J0X2luZm87CisKKwlycG9ydF9pbmZvLnBpZCA9IHJwb3J0LT5waWQ7CisJcnBvcnRfaW5mby5sb2NhbF9waWQgPSBwb3J0LT5waWQ7CisJcnBvcnRfaW5mby5scF90YWcgPSBwb3J0LT5scF90YWc7CisJcnBvcnRfaW5mby52Zl9pZCA9IHBvcnQtPmZhYnJpYy0+dmZfaWQ7CisJcnBvcnRfaW5mby52Zl9lbiA9IHBvcnQtPmZhYnJpYy0+aXNfdmY7CisJcnBvcnRfaW5mby5mY19jbGFzcyA9IHJwb3J0LT5mY19jb3M7CisJcnBvcnRfaW5mby5jaXNjID0gcnBvcnQtPmNpc2M7CisJcnBvcnRfaW5mby5tYXhfZnJtc3ogPSBycG9ydC0+bWF4ZnJzaXplOworCWJmYV9ycG9ydF9vbmxpbmUocnBvcnQtPmJmYV9ycG9ydCwgJnJwb3J0X2luZm8pOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9mYzRfcGF1c2Uoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpCit7CisJaWYgKGJmYV9mY3NfcG9ydF9pc19pbml0aWF0b3IocnBvcnQtPnBvcnQpKQorCQliZmFfZmNzX2l0bmltX3BhdXNlKHJwb3J0LT5pdG5pbSk7CisKKwlpZiAoYmZhX2Zjc19wb3J0X2lzX3RhcmdldChycG9ydC0+cG9ydCkpCisJCWJmYV9mY3NfdGluX3BhdXNlKHJwb3J0LT50aW4pOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9mYzRfcmVzdW1lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQoreworCWlmIChiZmFfZmNzX3BvcnRfaXNfaW5pdGlhdG9yKHJwb3J0LT5wb3J0KSkKKwkJYmZhX2Zjc19pdG5pbV9yZXN1bWUocnBvcnQtPml0bmltKTsKKworCWlmIChiZmFfZmNzX3BvcnRfaXNfdGFyZ2V0KHJwb3J0LT5wb3J0KSkKKwkJYmZhX2Zjc190aW5fcmVzdW1lKHJwb3J0LT50aW4pOworfQorCitzdGF0aWMgc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqCitiZmFfZmNzX3Jwb3J0X2FsbG9jKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3QgcHd3biwgdTMyIHJwaWQpCit7CisJc3RydWN0IGJmYV9mY3NfcyAqZmNzID0gcG9ydC0+ZmNzOworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCXN0cnVjdCBiZmFkX3Jwb3J0X3MgKnJwb3J0X2RydjsKKworCS8qKgorCSAqIGFsbG9jYXRlIHJwb3J0CisJICovCisJaWYgKGJmYV9mY2JfcnBvcnRfYWxsb2MoZmNzLT5iZmFkLCAmcnBvcnQsICZycG9ydF9kcnYpCisJICAgICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhmY3MsIHJwaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgci1wb3J0CisJICovCisJcnBvcnQtPnBvcnQgPSBwb3J0OworCXJwb3J0LT5mY3MgPSBmY3M7CisJcnBvcnQtPnJwX2RydiA9IHJwb3J0X2RydjsKKwlycG9ydC0+cGlkID0gcnBpZDsKKwlycG9ydC0+cHd3biA9IHB3d247CisKKwkvKioKKwkgKiBhbGxvY2F0ZSBCRkEgcnBvcnQKKwkgKi8KKwlycG9ydC0+YmZhX3Jwb3J0ID0gYmZhX3Jwb3J0X2NyZWF0ZShwb3J0LT5mY3MtPmJmYSwgcnBvcnQpOworCWlmICghcnBvcnQtPmJmYV9ycG9ydCkgeworCQliZmFfdHJjKGZjcywgcnBpZCk7CisJCWtmcmVlKHJwb3J0X2Rydik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qKgorCSAqIGFsbG9jYXRlIEZDLTRzCisJICovCisJYmZhX2Fzc2VydChiZmFfZmNzX3BvcnRfaXNfaW5pdGlhdG9yKHBvcnQpIF4KKwkJICAgYmZhX2Zjc19wb3J0X2lzX3RhcmdldChwb3J0KSk7CisKKwlpZiAoYmZhX2Zjc19wb3J0X2lzX2luaXRpYXRvcihwb3J0KSkgeworCQlycG9ydC0+aXRuaW0gPSBiZmFfZmNzX2l0bmltX2NyZWF0ZShycG9ydCk7CisJCWlmICghcnBvcnQtPml0bmltKSB7CisJCQliZmFfdHJjKGZjcywgcnBpZCk7CisJCQliZmFfcnBvcnRfZGVsZXRlKHJwb3J0LT5iZmFfcnBvcnQpOworCQkJa2ZyZWUocnBvcnRfZHJ2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJaWYgKGJmYV9mY3NfcG9ydF9pc190YXJnZXQocG9ydCkpIHsKKwkJcnBvcnQtPnRpbiA9IGJmYV9mY3NfdGluX2NyZWF0ZShycG9ydCk7CisJCWlmICghcnBvcnQtPnRpbikgeworCQkJYmZhX3RyYyhmY3MsIHJwaWQpOworCQkJYmZhX3Jwb3J0X2RlbGV0ZShycG9ydC0+YmZhX3Jwb3J0KTsKKwkJCWtmcmVlKHJwb3J0X2Rydik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWJmYV9mY3NfcG9ydF9hZGRfcnBvcnQocG9ydCwgcnBvcnQpOworCisJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV91bmluaXQpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBScG9ydCBGZWF0dXJlcyhSUEYpIFN1YiBNb2R1bGUKKwkgKi8KKwlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkKKwkJYmZhX2Zjc19ycGZfaW5pdChycG9ydCk7CisKKwlyZXR1cm4gcnBvcnQ7Cit9CisKKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfZnJlZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKworCS8qKgorCSAqIC0gZGVsZXRlIEZDLTRzCisJICogLSBkZWxldGUgQkZBIHJwb3J0CisJICogLSByZW1vdmUgZnJvbSBxdWV1ZSBvZiBycG9ydHMKKwkgKi8KKwlpZiAoYmZhX2Zjc19wb3J0X2lzX2luaXRpYXRvcihwb3J0KSkKKwkJYmZhX2Zjc19pdG5pbV9kZWxldGUocnBvcnQtPml0bmltKTsKKworCWlmIChiZmFfZmNzX3BvcnRfaXNfdGFyZ2V0KHBvcnQpKQorCQliZmFfZmNzX3Rpbl9kZWxldGUocnBvcnQtPnRpbik7CisKKwliZmFfcnBvcnRfZGVsZXRlKHJwb3J0LT5iZmFfcnBvcnQpOworCWJmYV9mY3NfcG9ydF9kZWxfcnBvcnQocG9ydCwgcnBvcnQpOworCWtmcmVlKHJwb3J0LT5ycF9kcnYpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJICAgICAgIGVudW0gYmZhX3Jwb3J0X2Flbl9ldmVudCBldmVudCwKKwkJICAgICAgIHN0cnVjdCBiZmFfcnBvcnRfYWVuX2RhdGFfcyAqZGF0YSkKK3sKKwl1bmlvbiBiZmFfYWVuX2RhdGFfdSBhZW5fZGF0YTsKKwlzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nbW9kID0gcnBvcnQtPmZjcy0+bG9nbTsKKwl3d25fdCAgICAgICAgICAgbHB3d24gPSBiZmFfZmNzX3BvcnRfZ2V0X3B3d24ocnBvcnQtPnBvcnQpOworCXd3bl90ICAgICAgICAgICBycHd3biA9IHJwb3J0LT5wd3duOworCWNoYXIgICAgICAgICAgICBscHd3bl9wdHJbQkZBX1NUUklOR18zMl07CisJY2hhciAgICAgICAgICAgIHJwd3duX3B0cltCRkFfU1RSSU5HXzMyXTsKKwljaGFyICAgICAgICAgICAqcHJpb19zdHJbXSA9IHsgInVua25vd24iLCAiaGlnaCIsICJtZWRpdW0iLCAibG93IiB9OworCisJd3duMnN0cihscHd3bl9wdHIsIGxwd3duKTsKKwl3d24yc3RyKHJwd3duX3B0ciwgcnB3d24pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX1JQT1JUX0FFTl9PTkxJTkU6CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX1JQT1JUX09OTElORSwgcnB3d25fcHRyLCBscHd3bl9wdHIpOworCQlicmVhazsKKwljYXNlIEJGQV9SUE9SVF9BRU5fT0ZGTElORToKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fUlBPUlRfT0ZGTElORSwgcnB3d25fcHRyLCBscHd3bl9wdHIpOworCQlicmVhazsKKwljYXNlIEJGQV9SUE9SVF9BRU5fRElTQ09OTkVDVDoKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fUlBPUlRfRElTQ09OTkVDVCwgcnB3d25fcHRyLCBscHd3bl9wdHIpOworCQlicmVhazsKKwljYXNlIEJGQV9SUE9SVF9BRU5fUU9TX1BSSU86CisJCWFlbl9kYXRhLnJwb3J0LnByaXYucW9zID0gZGF0YS0+cHJpdi5xb3M7CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX1JQT1JUX1FPU19QUklPLAorCQkJcHJpb19zdHJbYWVuX2RhdGEucnBvcnQucHJpdi5xb3MucW9zX3ByaW9yaXR5XSwKKwkJCXJwd3duX3B0ciwgbHB3d25fcHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfUlBPUlRfQUVOX1FPU19GTE9XSUQ6CisJCWFlbl9kYXRhLnJwb3J0LnByaXYucW9zID0gZGF0YS0+cHJpdi5xb3M7CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX1JQT1JUX1FPU19GTE9XSUQsCisJCQlhZW5fZGF0YS5ycG9ydC5wcml2LnFvcy5xb3NfZmxvd19pZCwgcnB3d25fcHRyLAorCQkJbHB3d25fcHRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJYWVuX2RhdGEucnBvcnQudmZfaWQgPSBycG9ydC0+cG9ydC0+ZmFicmljLT52Zl9pZDsKKwlhZW5fZGF0YS5ycG9ydC5wcHd3biA9CisJCWJmYV9mY3NfcG9ydF9nZXRfcHd3bihiZmFfZmNzX2dldF9iYXNlX3BvcnQocnBvcnQtPmZjcykpOworCWFlbl9kYXRhLnJwb3J0Lmxwd3duID0gbHB3d247CisJYWVuX2RhdGEucnBvcnQucnB3d24gPSBycHd3bjsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfb25saW5lX2FjdGlvbihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKworCXJwb3J0LT5zdGF0cy5vbmxpbmVzKys7CisKKwlpZiAoYmZhX2Zjc19wb3J0X2lzX2luaXRpYXRvcihwb3J0KSkgeworCQliZmFfZmNzX2l0bmltX3Jwb3J0X29ubGluZShycG9ydC0+aXRuaW0pOworCQlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkKKwkJCWJmYV9mY3NfcnBmX3Jwb3J0X29ubGluZShycG9ydCk7CisJfTsKKworCWlmIChiZmFfZmNzX3BvcnRfaXNfdGFyZ2V0KHBvcnQpKQorCQliZmFfZmNzX3Rpbl9ycG9ydF9vbmxpbmUocnBvcnQtPnRpbik7CisKKwkvKgorCSAqIERvbid0IHBvc3QgZXZlbnRzIGZvciB3ZWxsIGtub3duIGFkZHJlc3NlcworCSAqLworCWlmICghQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKQorCQliZmFfZmNzX3Jwb3J0X2Flbl9wb3N0KHJwb3J0LCBCRkFfUlBPUlRfQUVOX09OTElORSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X29mZmxpbmVfYWN0aW9uKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IHJwb3J0LT5wb3J0OworCisJcnBvcnQtPnN0YXRzLm9mZmxpbmVzKys7CisKKwkvKgorCSAqIERvbid0IHBvc3QgZXZlbnRzIGZvciB3ZWxsIGtub3duIGFkZHJlc3NlcworCSAqLworCWlmICghQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKSB7CisJCWlmIChiZmFfZmNzX3BvcnRfaXNfb25saW5lKHJwb3J0LT5wb3J0KSA9PSBCRkFfVFJVRSkgeworCQkJYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChycG9ydCwgQkZBX1JQT1JUX0FFTl9ESVNDT05ORUNULAorCQkJCQkgICAgICAgTlVMTCk7CisJCX0gZWxzZSB7CisJCQliZmFfZmNzX3Jwb3J0X2Flbl9wb3N0KHJwb3J0LCBCRkFfUlBPUlRfQUVOX09GRkxJTkUsCisJCQkJCSAgICAgICBOVUxMKTsKKwkJfQorCX0KKworCWlmIChiZmFfZmNzX3BvcnRfaXNfaW5pdGlhdG9yKHBvcnQpKSB7CisJCWJmYV9mY3NfaXRuaW1fcnBvcnRfb2ZmbGluZShycG9ydC0+aXRuaW0pOworCQlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkKKwkJCWJmYV9mY3NfcnBmX3Jwb3J0X29mZmxpbmUocnBvcnQpOworCX0KKworCWlmIChiZmFfZmNzX3BvcnRfaXNfdGFyZ2V0KHBvcnQpKQorCQliZmFfZmNzX3Rpbl9ycG9ydF9vZmZsaW5lKHJwb3J0LT50aW4pOworfQorCisvKioKKyAqIFVwZGF0ZSBycG9ydCBwYXJhbWV0ZXJzIGZyb20gUExPR0kgb3IgUExPR0kgYWNjZXB0LgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF91cGRhdGUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsIHN0cnVjdCBmY19sb2dpX3MgKnBsb2dpKQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IHJwb3J0LT5wb3J0OworCisJLyoqCisJICogLSBwb3J0IG5hbWUKKwkgKiAtIG5vZGUgbmFtZQorCSAqLworCXJwb3J0LT5wd3duID0gcGxvZ2ktPnBvcnRfbmFtZTsKKwlycG9ydC0+bnd3biA9IHBsb2dpLT5ub2RlX25hbWU7CisKKwkvKioKKwkgKiAtIGNsYXNzIG9mIHNlcnZpY2UKKwkgKi8KKwlycG9ydC0+ZmNfY29zID0gMDsKKwlpZiAocGxvZ2ktPmNsYXNzMy5jbGFzc192YWxpZCkKKwkJcnBvcnQtPmZjX2NvcyA9IEZDX0NMQVNTXzM7CisKKwlpZiAocGxvZ2ktPmNsYXNzMi5jbGFzc192YWxpZCkKKwkJcnBvcnQtPmZjX2NvcyB8PSBGQ19DTEFTU18yOworCisJLyoqCisJICogLSBDSVNDCisJICogLSBNQVggcmVjZWl2ZSBmcmFtZSBzaXplCisJICovCisJcnBvcnQtPmNpc2MgPSBwbG9naS0+Y3NwLmNpc2M7CisJcnBvcnQtPm1heGZyc2l6ZSA9IGJmYV9vc19udG9ocyhwbG9naS0+Y2xhc3MzLnJ4c3opOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIGJmYV9vc19udG9ocyhwbG9naS0+Y3NwLmJiY3JlZCkpOworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5mYWJyaWMtPmJiX2NyZWRpdCk7CisJLyoqCisJICogRGlyZWN0IEF0dGFjaCBQMlAgbW9kZSA6CisJICogVGhpcyBpcyB0byBoYW5kbGUgYSBidWcgKDIzMzQ3NikgaW4gSUJNIHRhcmdldHMgaW4gRGlyZWN0IEF0dGFjaAorCSAqIE1vZGUuIEJhc2ljYWxseSwgaW4gRkxPR0kgQWNjZXB0IHRoZSB0YXJnZXQgd291bGQgaGF2ZSBlcnJvbmVvdXNseQorCSAqIHNldCB0aGUgQkIgQ3JlZGl0IHRvIHRoZSB2YWx1ZSB1c2VkIGluIHRoZSBGTE9HSSBzZW50IGJ5IHRoZSBIQkEuCisJICogSXQgdXNlcyB0aGUgY29ycmVjdCB2YWx1ZSAoaXRzIG93biBCQiBjcmVkaXQpIGluIFBMT0dJLgorCSAqLworCWlmICgoIWJmYV9mY3NfZmFicmljX2lzX3N3aXRjaGVkKHBvcnQtPmZhYnJpYykpCisJICAgICYmIChiZmFfb3NfbnRvaHMocGxvZ2ktPmNzcC5iYmNyZWQpIDwgcG9ydC0+ZmFicmljLT5iYl9jcmVkaXQpKSB7CisKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIGJmYV9vc19udG9ocyhwbG9naS0+Y3NwLmJiY3JlZCkpOworCQliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+ZmFicmljLT5iYl9jcmVkaXQpOworCisJCXBvcnQtPmZhYnJpYy0+YmJfY3JlZGl0ID0gYmZhX29zX250b2hzKHBsb2dpLT5jc3AuYmJjcmVkKTsKKwkJYmZhX3Bwb3J0X3NldF90eF9iYmNyZWRpdChwb3J0LT5mY3MtPmJmYSwKKwkJCQkJICBwb3J0LT5mYWJyaWMtPmJiX2NyZWRpdCk7CisJfQorCit9CisKKy8qKgorICogICBDYWxsZWQgdG8gaGFuZGxlIExPR08gcmVjZWl2ZWQgZnJvbSBhbiBleGlzdGluZyByZW1vdGUgcG9ydC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfcHJvY2Vzc19sb2dvKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LCBzdHJ1Y3QgZmNoc19zICpmY2hzKQoreworCXJwb3J0LT5yZXBseV9veGlkID0gZmNocy0+b3hfaWQ7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cmVwbHlfb3hpZCk7CisKKwlycG9ydC0+c3RhdHMubG9nb19yY3ZkKys7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfTE9HT19SQ1ZEKTsKK30KKworCisKKy8qKgorICogIGZjc19ycG9ydF9wdWJsaWMgRkNTIHJwb3J0IHB1YmxpYyBpbnRlcmZhY2VzCisgKi8KKworLyoqCisgKiAJQ2FsbGVkIGJ5IGJwb3J0L3Zwb3J0IHRvIGNyZWF0ZSBhIHJlbW90ZSBwb3J0IGluc3RhbmNlIGZvciBhIGRpc2NvdmVyZWQKKyAqIAlyZW1vdGUgZGV2aWNlLgorICoKKyAqIEBwYXJhbVtpbl0gcG9ydAktIGJhc2UgcG9ydCBvciB2cG9ydAorICogQHBhcmFtW2luXSBycGlkCS0gcmVtb3RlIHBvcnQgSUQKKyAqCisgKiBAcmV0dXJuIE5vbmUKKyAqLworc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqCitiZmFfZmNzX3Jwb3J0X2NyZWF0ZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHUzMiBycGlkKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHJwaWQpOworCXJwb3J0ID0gYmZhX2Zjc19ycG9ydF9hbGxvYyhwb3J0LCBXV05fTlVMTCwgcnBpZCk7CisJaWYgKCFycG9ydCkKKwkJcmV0dXJuIE5VTEw7CisKKwliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9QTE9HSV9TRU5EKTsKKwlyZXR1cm4gcnBvcnQ7Cit9CisKKy8qKgorICogQ2FsbGVkIHRvIGNyZWF0ZSBhIHJwb3J0IGZvciB3aGljaCBvbmx5IHRoZSB3d24gaXMga25vd24uCisgKgorICogQHBhcmFtW2luXSBwb3J0CS0gYmFzZSBwb3J0CisgKiBAcGFyYW1baW5dIHJwd3duCS0gcmVtb3RlIHBvcnQgd3duCisgKgorICogQHJldHVybiBOb25lCisgKi8KK3N0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKgorYmZhX2Zjc19ycG9ydF9jcmVhdGVfYnlfd3duKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3QgcnB3d24pCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQ7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcnB3d24pOworCXJwb3J0ID0gYmZhX2Zjc19ycG9ydF9hbGxvYyhwb3J0LCBycHd3biwgMCk7CisJaWYgKCFycG9ydCkKKwkJcmV0dXJuIE5VTEw7CisKKwliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9BRERSRVNTX0RJU0MpOworCXJldHVybiBycG9ydDsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgYnBvcnQgaW4gcHJpdmF0ZSBsb29wIHRvcG9sb2d5IHRvIGluZGljYXRlIHRoYXQgYQorICogcnBvcnQgaGFzIGJlZW4gZGlzY292ZXJlZCBhbmQgcGxvZ2kgaGFzIGJlZW4gY29tcGxldGVkLgorICoKKyAqIEBwYXJhbVtpbl0gcG9ydAktIGJhc2UgcG9ydCBvciB2cG9ydAorICogQHBhcmFtW2luXSBycGlkCS0gcmVtb3RlIHBvcnQgSUQKKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF9zdGFydChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHN0cnVjdCBmY2hzX3MgKmZjaHMsCisJCQlzdHJ1Y3QgZmNfbG9naV9zICpwbG9naSkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydDsKKworCXJwb3J0ID0gYmZhX2Zjc19ycG9ydF9hbGxvYyhwb3J0LCBXV05fTlVMTCwgZmNocy0+c19pZCk7CisJaWYgKCFycG9ydCkKKwkJcmV0dXJuOworCisJYmZhX2Zjc19ycG9ydF91cGRhdGUocnBvcnQsIHBsb2dpKTsKKworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX1BMT0dJX0NPTVApOworfQorCisvKioKKyAqICAgQ2FsbGVkIGJ5IGJwb3J0L3Zwb3J0IHRvIGhhbmRsZSBQTE9HSSByZWNlaXZlZCBmcm9tIGEgbmV3IHJlbW90ZSBwb3J0LgorICogICBJZiBhbiBleGlzdGluZyBycG9ydCBkb2VzIGEgcGxvZ2ksIGl0IHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgorICovCit2b2lkCitiZmFfZmNzX3Jwb3J0X3Bsb2dpX2NyZWF0ZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHN0cnVjdCBmY2hzX3MgKmZjaHMsCisJCQkgICBzdHJ1Y3QgZmNfbG9naV9zICpwbG9naSkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydDsKKworCXJwb3J0ID0gYmZhX2Zjc19ycG9ydF9hbGxvYyhwb3J0LCBwbG9naS0+cG9ydF9uYW1lLCBmY2hzLT5zX2lkKTsKKwlpZiAoIXJwb3J0KQorCQlyZXR1cm47CisKKwliZmFfZmNzX3Jwb3J0X3VwZGF0ZShycG9ydCwgcGxvZ2kpOworCisJcnBvcnQtPnJlcGx5X294aWQgPSBmY2hzLT5veF9pZDsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5yZXBseV9veGlkKTsKKworCXJwb3J0LT5zdGF0cy5wbG9naV9yY3ZkKys7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfUExPR0lfUkNWRCk7Cit9CisKK3N0YXRpYyBpbnQKK3d3bl9jb21wYXJlKHd3bl90IHd3bjEsIHd3bl90IHd3bjIpCit7CisJdTggICAgICAgICpiMSA9ICh1OCAqKSAmd3duMTsKKwl1OCAgICAgICAgKmIyID0gKHU4ICopICZ3d24yOworCWludCAgICAgICAgICAgICBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZih3d25fdCk7IGkrKykgeworCQlpZiAoYjFbaV0gPCBiMltpXSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGIxW2ldID4gYjJbaV0pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogICBDYWxsZWQgYnkgYnBvcnQvdnBvcnQgdG8gaGFuZGxlIFBMT0dJIHJlY2VpdmVkIGZyb20gYW4gZXhpc3RpbmcKKyAqIAkgcmVtb3RlIHBvcnQuCisgKi8KK3ZvaWQKK2JmYV9mY3NfcnBvcnRfcGxvZ2koc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsIHN0cnVjdCBmY2hzX3MgKnJ4X2ZjaHMsCisJCSAgICBzdHJ1Y3QgZmNfbG9naV9zICpwbG9naSkKK3sKKwkvKioKKwkgKiBAdG9kbyBIYW5kbGUgUDJQIGFuZCBpbml0aWF0b3ItaW5pdGlhdG9yLgorCSAqLworCisJYmZhX2Zjc19ycG9ydF91cGRhdGUocnBvcnQsIHBsb2dpKTsKKworCXJwb3J0LT5yZXBseV9veGlkID0gcnhfZmNocy0+b3hfaWQ7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cmVwbHlfb3hpZCk7CisKKwkvKioKKwkgKiBJbiBTd2l0Y2hlZCBmYWJyaWMgdG9wb2xvZ3ksCisJICogUExPR0kgdG8gZWFjaCBvdGhlci4gSWYgb3VyIHB3d24gaXMgc21hbGxlciwgaWdub3JlIGl0LAorCSAqIGlmIGl0IGlzIG5vdCBhIHdlbGwga25vd24gYWRkcmVzcy4KKwkgKiBJZiB0aGUgbGluayB0b3BvbG9neSBpcyBOMk4sCisJICogdGhpcyBQbG9naSBzaG91bGQgYmUgYWNjZXB0ZWQuCisJICovCisJaWYgKCh3d25fY29tcGFyZShycG9ydC0+cG9ydC0+cG9ydF9jZmcucHd3biwgcnBvcnQtPnB3d24pID09IC0xKQorCSAgICAmJiAoYmZhX2Zjc19mYWJyaWNfaXNfc3dpdGNoZWQocnBvcnQtPnBvcnQtPmZhYnJpYykpCisJICAgICYmICghQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKSkgeworCQliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCQlyZXR1cm47CisJfQorCisJcnBvcnQtPnN0YXRzLnBsb2dpX3JjdmQrKzsKKwliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEKTsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgYnBvcnQvdnBvcnQgdG8gZGVsZXRlIGEgcmVtb3RlIHBvcnQgaW5zdGFuY2UuCisgKgorKiBScG9ydCBkZWxldGUgaXMgY2FsbGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAkJLSB2cG9ydCBpcyBkZWxldGVkCisgKiAJCS0gdmYgaXMgZGVsZXRlZAorICogCQktIGV4cGxpY2l0IHJlcXVlc3QgZnJvbSBPUyB0byBkZWxldGUgcnBvcnQgKHZtd2FyZSkKKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF9kZWxldGUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfREVMRVRFKTsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgYnBvcnQvdnBvcnQgdG8gIHdoZW4gYSB0YXJnZXQgZ29lcyBvZmZsaW5lLgorICoKKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQoreworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0xPR09fSU1QKTsKK30KKworLyoqCisgKiBDYWxsZWQgYnkgYnBvcnQgaW4gbjJuIHdoZW4gYSB0YXJnZXQgKGF0dGFjaGVkIHBvcnQpIGJlY29tZXMgb25saW5lLgorICoKKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfUExPR0lfU0VORCk7Cit9CisKKy8qKgorICogICBDYWxsZWQgYnkgYnBvcnQvdnBvcnQgdG8gbm90aWZ5IFNDTiBmb3IgdGhlIHJlbW90ZSBwb3J0CisgKi8KK3ZvaWQKK2JmYV9mY3NfcnBvcnRfc2NuKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQoreworCisJcnBvcnQtPnN0YXRzLnJzY25zKys7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfU0NOKTsKK30KKworLyoqCisgKiAgIENhbGxlZCBieSAgZmNwaW0gdG8gbm90aWZ5IHRoYXQgdGhlIElUTiBjbGVhbnVwIGlzIGRvbmUuCisgKi8KK3ZvaWQKK2JmYV9mY3NfcnBvcnRfaXRuaW1fYWNrKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQoreworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0ZDNF9PRkZMSU5FKTsKK30KKworLyoqCisgKiAgIENhbGxlZCBieSBmY3B0bSB0byBub3RpZnkgdGhhdCB0aGUgSVROIGNsZWFudXAgaXMgZG9uZS4KKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF90aW5fYWNrKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQoreworCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX0ZDNF9PRkZMSU5FKTsKK30KKworLyoqCisgKiAgICAgVGhpcyByb3V0aW5lIEJGQSBjYWxsYmFjayBmb3IgYmZhX3Jwb3J0X29ubGluZSgpIGNhbGwuCisgKgorICogCXBhcmFtW2luXSAJY2JfYXJnCS0gIHJwb3J0IHN0cnVjdC4KKyAqCisgKiAJcmV0dXJuCisgKiAJCXZvaWQKKyAqCisqIAlTcGVjaWFsIENvbnNpZGVyYXRpb25zOgorICoKKyAqIAlub3RlCisgKi8KK3ZvaWQKK2JmYV9jYl9ycG9ydF9vbmxpbmUodm9pZCAqY2JhcmcpCit7CisKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopY2Jhcmc7CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9IQ0JfT05MSU5FKTsKK30KKworLyoqCisgKiAgICAgVGhpcyByb3V0aW5lIEJGQSBjYWxsYmFjayBmb3IgYmZhX3Jwb3J0X29mZmxpbmUoKSBjYWxsLgorICoKKyAqIAlwYXJhbVtpbl0gCXJwb3J0IAktCisgKgorICogCXJldHVybgorICogCQl2b2lkCisgKgorICogCVNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6CisgKgorICogCW5vdGUKKyAqLwordm9pZAorYmZhX2NiX3Jwb3J0X29mZmxpbmUodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKWNiYXJnOworCisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIFJQU01fRVZFTlRfSENCX09GRkxJTkUpOworfQorCisvKioKKyAqIFRoaXMgcm91dGluZSBpcyBhIHN0YXRpYyBCRkEgY2FsbGJhY2sgd2hlbiB0aGVyZSBpcyBhIFFvUyBmbG93X2lkCisgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgKgorICogQHBhcmFtW2luXSAJcnBvcnQgCS0KKyAqCisgKiBAcmV0dXJuICAJdm9pZAorICoKKyAqIFNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6CisgKgorICogQG5vdGUKKyAqLwordm9pZAorYmZhX2NiX3Jwb3J0X3Fvc19zY25fZmxvd2lkKHZvaWQgKmNiYXJnLAorCQkJICAgIHN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBvbGRfcW9zX2F0dHIsCisJCQkgICAgc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIG5ld19xb3NfYXR0cikKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopY2Jhcmc7CisJc3RydWN0IGJmYV9ycG9ydF9hZW5fZGF0YV9zIGFlbl9kYXRhOworCisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYWVuX2RhdGEucHJpdi5xb3MgPSBuZXdfcW9zX2F0dHI7CisJYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChycG9ydCwgQkZBX1JQT1JUX0FFTl9RT1NfRkxPV0lELCAmYWVuX2RhdGEpOworfQorCisvKioKKyAqIFRoaXMgcm91dGluZSBpcyBhIHN0YXRpYyBCRkEgY2FsbGJhY2sgd2hlbiB0aGVyZSBpcyBhIFFvUyBwcmlvcml0eQorICogY2hhbmdlIG5vdGlmaWNhdGlvbgorICoKKyAqIEBwYXJhbVtpbl0gCXJwb3J0IAktCisgKgorICogQHJldHVybiAJdm9pZAorICoKKyAqIFNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6CisgKgorICogQG5vdGUKKyAqLwordm9pZAorYmZhX2NiX3Jwb3J0X3Fvc19zY25fcHJpbyh2b2lkICpjYmFyZywgc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIG9sZF9xb3NfYXR0ciwKKwkJCSAgc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIG5ld19xb3NfYXR0cikKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopY2Jhcmc7CisJc3RydWN0IGJmYV9ycG9ydF9hZW5fZGF0YV9zIGFlbl9kYXRhOworCisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYWVuX2RhdGEucHJpdi5xb3MgPSBuZXdfcW9zX2F0dHI7CisJYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChycG9ydCwgQkZBX1JQT1JUX0FFTl9RT1NfUFJJTywgJmFlbl9kYXRhKTsKK30KKworLyoqCisgKiAJCUNhbGxlZCB0byBwcm9jZXNzIGFueSB1bnNvbGljdGVkIGZyYW1lcyBmcm9tIHRoaXMgcmVtb3RlIHBvcnQKKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF9sb2dvX2ltcChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9MT0dPX0lNUCk7Cit9CisKKy8qKgorICogCQlDYWxsZWQgdG8gcHJvY2VzcyBhbnkgdW5zb2xpY3RlZCBmcmFtZXMgZnJvbSB0aGlzIHJlbW90ZSBwb3J0CisgKi8KK3ZvaWQKK2JmYV9mY3NfcnBvcnRfdWZfcmVjdihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwgc3RydWN0IGZjaHNfcyAqZmNocywKKwkJCXUxNiBsZW4pCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICplbHNfY21kOworCisJYmZhX3RyYyhycG9ydC0+ZmNzLCBmY2hzLT5zX2lkKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGZjaHMtPmRfaWQpOworCWJmYV90cmMocnBvcnQtPmZjcywgZmNocy0+dHlwZSk7CisKKwlpZiAoZmNocy0+dHlwZSAhPSBGQ19UWVBFX0VMUykKKwkJcmV0dXJuOworCisJZWxzX2NtZCA9IChzdHJ1Y3QgZmNfZWxzX2NtZF9zICopIChmY2hzICsgMSk7CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGVsc19jbWQtPmVsc19jb2RlKTsKKworCXN3aXRjaCAoZWxzX2NtZC0+ZWxzX2NvZGUpIHsKKwljYXNlIEZDX0VMU19MT0dPOgorCQliZmFfZmNzX3Jwb3J0X3Byb2Nlc3NfbG9nbyhycG9ydCwgZmNocyk7CisJCWJyZWFrOworCisJY2FzZSBGQ19FTFNfQURJU0M6CisJCWJmYV9mY3NfcnBvcnRfcHJvY2Vzc19hZGlzYyhycG9ydCwgZmNocywgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIEZDX0VMU19QUkxPOgorCQlpZiAoYmZhX2Zjc19wb3J0X2lzX2luaXRpYXRvcihwb3J0KSkKKwkJCWJmYV9mY3NfZmNwaW1fdWZfcmVjdihycG9ydC0+aXRuaW0sIGZjaHMsIGxlbik7CisKKwkJaWYgKGJmYV9mY3NfcG9ydF9pc190YXJnZXQocG9ydCkpCisJCQliZmFfZmNzX2ZjcHRtX3VmX3JlY3YocnBvcnQtPnRpbiwgZmNocywgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIEZDX0VMU19QUkxJOgorCQliZmFfZmNzX3Jwb3J0X3Byb2Nlc3NfcHJsaShycG9ydCwgZmNocywgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIEZDX0VMU19SUFNDOgorCQliZmFfZmNzX3Jwb3J0X3Byb2Nlc3NfcnBzYyhycG9ydCwgZmNocywgbGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfZmNzX3Jwb3J0X3NlbmRfbHNfcmp0KHJwb3J0LCBmY2hzLAorCQkJCQkgIEZDX0xTX1JKVF9SU05fQ01EX05PVF9TVVBQLAorCQkJCQkgIEZDX0xTX1JKVF9FWFBfTk9fQURETF9JTkZPKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogU2VuZCBhIExTIHJlamVjdAorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9zZW5kX2xzX3JqdChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwgc3RydWN0IGZjaHNfcyAqcnhfZmNocywKKwkJCSAgdTggcmVhc29uX2NvZGUsIHU4IHJlYXNvbl9jb2RlX2V4cGwpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOworCWludCAgICAgICAgICAgICBsZW47CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJ4X2ZjaHMtPnNfaWQpOworCisJZmN4cCA9IGJmYV9mY3NfZmN4cF9hbGxvYyhycG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApCisJCXJldHVybjsKKworCWxlbiA9IGZjX2xzX3JqdF9idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwgcnhfZmNocy0+c19pZCwKKwkJCSAgICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgcnhfZmNocy0+b3hfaWQsCisJCQkgICAgICByZWFzb25fY29kZSwgcmVhc29uX2NvZGVfZXhwbCk7CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywgQkZBX0ZBTFNFLAorCQkgICAgICBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBOVUxMLCBOVUxMLCBGQ19NQVhfUERVU1osIDApOworfQorCisvKioKKyAqICAgTW9kdWxlIGluaXRpYWxpemF0aW9uCisgKi8KK3ZvaWQKK2JmYV9mY3NfcnBvcnRfbW9kaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7Cit9CisKKy8qKgorICogICBNb2R1bGUgY2xlYW51cAorICovCit2b2lkCitiZmFfZmNzX3Jwb3J0X21vZGV4aXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCWJmYV9mY3NfbW9kZXhpdF9jb21wKGZjcyk7Cit9CisKKy8qKgorICogUmV0dXJuIHN0YXRlIG9mIHJwb3J0LgorICovCitpbnQKK2JmYV9mY3NfcnBvcnRfZ2V0X3N0YXRlKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQoreworCXJldHVybiBiZmFfc21fdG9fc3RhdGUocnBvcnRfc21fdGFibGUsIHJwb3J0LT5zbSk7Cit9CisKKy8qKgorICogCQkgQ2FsbGVkIGJ5IHRoZSBEcml2ZXIgdG8gc2V0IHJwb3J0IGRlbGV0ZS9hZ2VvdXQgdGltZW91dAorICoKKyAqIAlwYXJhbVtpbl0JCXJwb3J0IHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4KKyAqCisgKiAJcmV0dXJuIE5vbmUKKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF9zZXRfZGVsX3RpbWVvdXQodTggcnBvcnRfdG1vKQoreworCS8qCisJICogY29udmVydCB0byBNaWxsaXNlY3MKKwkgKi8KKwlpZiAocnBvcnRfdG1vID4gMCkKKwkJYmZhX2Zjc19ycG9ydF9kZWxfdGltZW91dCA9IHJwb3J0X3RtbyAqIDEwMDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL3Jwb3J0X2FwaS5jIGIvZHJpdmVycy9zY3NpL2JmYS9ycG9ydF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFlMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9ycG9ydF9hcGkuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlICJmY3NfdnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfbHBvcnQuaCIKKyNpbmNsdWRlICJmY3NfcnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfdHJjbW9kLmgiCisKK0JGQV9UUkNfRklMRShGQ1MsIFJQT1JUX0FQSSk7CisKKy8qKgorICogIHJwb3J0X2FwaS5jIFJlbW90ZSBwb3J0IGltcGxlbWVudGF0aW9uLgorICovCisKKy8qKgorICogIGZjc19ycG9ydF9hcGkgRkNTIHJwb3J0IEFQSS4KKyAqLworCisvKioKKyAqIAlEaXJlY3QgQVBJIHRvIGFkZCBhIHRhcmdldCBieSBwb3J0IHd3bi4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCwgZm9yCisgKglleGFtcGxlLCBieSBiaW9zIHdoZW4gdGFyZ2V0IHB3d24gaXMga25vd24gZnJvbSBib290IGx1biBjb25maWd1cmF0aW9uLgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfcnBvcnRfYWRkKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgd3duX3QgKnB3d24sCisJCQlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCXN0cnVjdCBiZmFkX3Jwb3J0X3MgKnJwb3J0X2RydikKK3sKKwliZmFfdHJjKHBvcnQtPmZjcywgKnB3d24pOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICoJRGlyZWN0IEFQSSB0byByZW1vdmUgYSB0YXJnZXQgYW5kIGl0cyBhc3NvY2lhdGVkIHJlc291cmNlcy4gVGhpcworICoJaW50ZXJmYWNlIGlzIHVzZWQsIGZvciBleGFtcGxlLCBieSB2bXdhcmUgZHJpdmVyIHRvIHJlbW92ZSB0YXJnZXQKKyAqCXBvcnRzIGZyb20gdGhlIHRhcmdldCBsaXN0IGZvciBhIFZNLgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfcnBvcnRfcmVtb3ZlKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0X2luKQoreworCisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQ7CisKKwliZmFfdHJjKHJwb3J0X2luLT5mY3MsIHJwb3J0X2luLT5wd3duKTsKKworCXJwb3J0ID0gYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9ieV9wd3duKHJwb3J0X2luLT5wb3J0LCBycG9ydF9pbi0+cHd3bik7CisJaWYgKHJwb3J0ID09IE5VTEwpIHsKKwkJLyoKKwkJICogVEJEIEVycm9yIGhhbmRsaW5nCisJCSAqLworCQliZmFfdHJjKHJwb3J0X2luLT5mY3MsIHJwb3J0X2luLT5waWQpOworCQlyZXR1cm4gQkZBX1NUQVRVU19VTktOT1dOX1JXV047CisJfQorCisJLyoKKwkgKiBUQkQgaWYgdGhpcyByZW1vdGUgcG9ydCBpcyBvbmxpbmUsIHNlbmQgYSBsb2dvCisJICovCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CisKK30KKworLyoqCisgKglSZW1vdGUgZGV2aWNlIHN0YXR1cyBmb3IgZGlzcGxheS9kZWJ1Zy4KKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF9nZXRfYXR0cihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCXN0cnVjdCBiZmFfcnBvcnRfYXR0cl9zICpycG9ydF9hdHRyKQoreworCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBxb3NfYXR0cjsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKworCWJmYV9vc19tZW1zZXQocnBvcnRfYXR0ciwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfcnBvcnRfYXR0cl9zKSk7CisKKwlycG9ydF9hdHRyLT5waWQgPSBycG9ydC0+cGlkOworCXJwb3J0X2F0dHItPnB3d24gPSBycG9ydC0+cHd3bjsKKwlycG9ydF9hdHRyLT5ud3duID0gcnBvcnQtPm53d247CisJcnBvcnRfYXR0ci0+Y29zX3N1cHBvcnRlZCA9IHJwb3J0LT5mY19jb3M7CisJcnBvcnRfYXR0ci0+ZGZfc3ogPSBycG9ydC0+bWF4ZnJzaXplOworCXJwb3J0X2F0dHItPnN0YXRlID0gYmZhX2Zjc19ycG9ydF9nZXRfc3RhdGUocnBvcnQpOworCXJwb3J0X2F0dHItPmZjX2NvcyA9IHJwb3J0LT5mY19jb3M7CisJcnBvcnRfYXR0ci0+Y2lzYyA9IHJwb3J0LT5jaXNjOworCXJwb3J0X2F0dHItPnNjc2lfZnVuY3Rpb24gPSBycG9ydC0+c2NzaV9mdW5jdGlvbjsKKwlycG9ydF9hdHRyLT5jdXJyX3NwZWVkICA9IHJwb3J0LT5ycGYucnBzY19zcGVlZDsKKwlycG9ydF9hdHRyLT5hc3NpZ25lZF9zcGVlZCAgPSBycG9ydC0+cnBmLmFzc2lnbmVkX3NwZWVkOworCisJYmZhX3Jwb3J0X2dldF9xb3NfYXR0cihycG9ydC0+YmZhX3Jwb3J0LCAmcW9zX2F0dHIpOworCXJwb3J0X2F0dHItPnFvc19hdHRyID0gcW9zX2F0dHI7CisKKwlycG9ydF9hdHRyLT50cmxfZW5mb3JjZWQgPSBCRkFfRkFMU0U7CisJaWYgKGJmYV9wcG9ydF9pc19yYXRlbGltKHBvcnQtPmZjcy0+YmZhKSkgeworCQlpZiAoKHJwb3J0LT5ycGYucnBzY19zcGVlZCA9PSBCRkFfUFBPUlRfU1BFRURfVU5LTk9XTikgfHwKKwkJCShycG9ydC0+cnBmLnJwc2Nfc3BlZWQgPAorCQkJYmZhX2Zjc19wb3J0X2dldF9ycG9ydF9tYXhfc3BlZWQocG9ydCkpKQorCQkJcnBvcnRfYXR0ci0+dHJsX2VuZm9yY2VkID0gQkZBX1RSVUU7CisJfQorCisJLyoKKwkgKiBUT0RPCisJICogcnBvcnQtPnN5bW5hbWUKKwkgKi8KK30KKworLyoqCisgKiAJUGVyIHJlbW90ZSBkZXZpY2Ugc3RhdGlzdGljcy4KKyAqLwordm9pZAorYmZhX2Zjc19ycG9ydF9nZXRfc3RhdHMoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQlzdHJ1Y3QgYmZhX3Jwb3J0X3N0YXRzX3MgKnN0YXRzKQoreworCSpzdGF0cyA9IHJwb3J0LT5zdGF0czsKK30KKwordm9pZAorYmZhX2Zjc19ycG9ydF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwliZmFfb3NfbWVtc2V0KChjaGFyICopJnJwb3J0LT5zdGF0cywgMCwKKwkJCXNpemVvZihzdHJ1Y3QgYmZhX3Jwb3J0X3N0YXRzX3MpKTsKK30KKworc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqCitiZmFfZmNzX3Jwb3J0X2xvb2t1cChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHd3bl90IHJwd3duKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCisJcnBvcnQgPSBiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X2J5X3B3d24ocG9ydCwgcnB3d24pOworCWlmIChycG9ydCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFRCRCBFcnJvciBoYW5kbGluZworCQkgKi8KKwl9CisKKwlyZXR1cm4gcnBvcnQ7Cit9CisKK3N0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKgorYmZhX2Zjc19ycG9ydF9sb29rdXBfYnlfbnd3bihzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsIHd3bl90IHJud3duKQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0OworCisJcnBvcnQgPSBiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X2J5X253d24ocG9ydCwgcm53d24pOworCWlmIChycG9ydCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFRCRCBFcnJvciBoYW5kbGluZworCQkgKi8KKwl9CisKKwlyZXR1cm4gcnBvcnQ7Cit9CisKKy8qCisgKiBUaGlzIEFQSSBpcyB0byBzZXQgdGhlIFJwb3J0J3Mgc3BlZWQuIFNob3VsZCBiZSB1c2VkIHdoZW4gUlBTQyBpcyBub3QKKyAqIHN1cHBvcnRlZCBieSB0aGUgcnBvcnQuCisgKi8KK3ZvaWQKK2JmYV9mY3NfcnBvcnRfc2V0X3NwZWVkKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJZW51bSBiZmFfcHBvcnRfc3BlZWQgc3BlZWQpCit7CisJcnBvcnQtPnJwZi5hc3NpZ25lZF9zcGVlZCAgPSBzcGVlZDsKKworCS8qIFNldCB0aGlzIHNwZWVkIGluIGYvdyBvbmx5IGlmIHRoZSBSUFNDIHNwZWVkIGlzIG5vdCBhdmFpbGFibGUgKi8KKwlpZiAocnBvcnQtPnJwZi5ycHNjX3NwZWVkID09IEJGQV9QUE9SVF9TUEVFRF9VTktOT1dOKQorCQliZmFfcnBvcnRfc3BlZWQocnBvcnQtPmJmYV9ycG9ydCwgc3BlZWQpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvcnBvcnRfZnRycy5jIGIvZHJpdmVycy9zY3NpL2JmYS9ycG9ydF9mdHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExZjU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvcnBvcnRfZnRycy5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qKgorICogIHJwb3J0X2Z0cnMuYyBSZW1vdGUgcG9ydCBmZWF0dXJlcyAoUlBGKSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgImZjYnVpbGQuaCIKKyNpbmNsdWRlICJmY3NfcnBvcnQuaCIKKyNpbmNsdWRlICJmY3NfbHBvcnQuaCIKKyNpbmNsdWRlICJmY3NfdHJjbW9kLmgiCisjaW5jbHVkZSAiZmNzX2ZjeHAuaCIKKyNpbmNsdWRlICJmY3MuaCIKKworQkZBX1RSQ19GSUxFKEZDUywgUlBPUlRfRlRSUyk7CisKKyNkZWZpbmUgQkZBX0ZDU19SUEZfUkVUUklFUwkoMykKKyNkZWZpbmUgQkZBX0ZDU19SUEZfUkVUUllfVElNRU9VVCAgKDEwMDApIC8qIDEgc2VjIChJbiBtaWxsaXNlY3MpICovCisKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3JwZl9zZW5kX3Jwc2MyKHZvaWQgKnJwb3J0X2NiYXJnLAorCQkJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19ycGZfcnBzYzJfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLAorCQkJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsIHZvaWQgKmNiYXJnLAorCQkJYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsIHUzMiByc3BfbGVuLAorCQkJdTMyIHJlc2lkX2xlbiwKKwkJCXN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3JwZl90aW1lb3V0KHZvaWQgKmFyZyk7CisKKy8qKgorICogIGZjc19ycG9ydF9mdHJzX3NtIEZDUyBycG9ydCBzdGF0ZSBtYWNoaW5lIGV2ZW50cworICovCisKK2VudW0gcnBmX2V2ZW50IHsKKwlSUEZTTV9FVkVOVF9SUE9SVF9PRkZMSU5FICA9IDEsICAgICAvKiAgUnBvcnQgb2ZmbGluZSAgICAgICAgICAgICovCisJUlBGU01fRVZFTlRfUlBPUlRfT05MSU5FICAgPSAyLCAgICAgLyogIFJwb3J0IG9ubGluZSAgICAgICAgICAgICovCisJUlBGU01fRVZFTlRfRkNYUF9TRU5UICAgICAgPSAzLCAgICAvKiAgRnJhbWUgZnJvbSBoYXMgYmVlbiBzZW50ICovCisJUlBGU01fRVZFTlRfVElNRU9VVCAgCSAgID0gNCwgICAgLyogIFJwb3J0IFNNIHRpbWVvdXQgZXZlbnQgICAqLworCVJQRlNNX0VWRU5UX1JQU0NfQ09NUCAgICAgID0gNSwKKwlSUEZTTV9FVkVOVF9SUFNDX0ZBSUwgICAgICA9IDYsCisJUlBGU01fRVZFTlRfUlBTQ19FUlJPUiAgICAgPSA3LAorfTsKKworc3RhdGljIHZvaWQJYmZhX2Zjc19ycGZfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX3JwZl9zICpycGYsCisJCQkJCWVudW0gcnBmX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3JwZl9zbV9ycHNjX3NlbmRpbmcoc3RydWN0IGJmYV9mY3NfcnBmX3MgKnJwZiwKKwkJCQkJICAgICAgIGVudW0gcnBmX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3JwZl9zbV9ycHNjKHN0cnVjdCBiZmFfZmNzX3JwZl9zICpycGYsCisJCQkJCSAgICAgICBlbnVtIHJwZl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAJYmZhX2Zjc19ycGZfc21fcnBzY19yZXRyeShzdHJ1Y3QgYmZhX2Zjc19ycGZfcyAqcnBmLAorCQkJCQkJCWVudW0gcnBmX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3JwZl9zbV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3JwZl9zICpycGYsCisJCQkJCQkJZW51bSBycGZfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcnBmX3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19ycGZfcyAqcnBmLAorCQkJCQkJCWVudW0gcnBmX2V2ZW50IGV2ZW50KTsKKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBmX3NtX3VuaW5pdChzdHJ1Y3QgYmZhX2Zjc19ycGZfcyAqcnBmLCBlbnVtIHJwZl9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IHJwZi0+cnBvcnQ7CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUlBGU01fRVZFTlRfUlBPUlRfT05MSU5FIDoKKwkJaWYgKCFCRkFfRkNTX1BJRF9JU19XS0EocnBvcnQtPnBpZCkpIHsKKwkJCWJmYV9zbV9zZXRfc3RhdGUocnBmLCBiZmFfZmNzX3JwZl9zbV9ycHNjX3NlbmRpbmcpOworCQkJcnBmLT5ycHNjX3JldHJpZXMgPSAwOworCQkJYmZhX2Zjc19ycGZfc2VuZF9ycHNjMihycGYsIE5VTEwpOworCQkJYnJlYWs7CisJCX07CisKKwljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkUgOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19ycGZfc21fcnBzY19zZW5kaW5nKHN0cnVjdCBiZmFfZmNzX3JwZl9zICpycGYsIGVudW0gcnBmX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gcnBmLT5ycG9ydDsKKworCWJmYV90cmMocnBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUlBGU01fRVZFTlRfRkNYUF9TRU5UOgorCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fcnBzYyk7CisJCWJyZWFrOworCisJY2FzZSBSUEZTTV9FVkVOVF9SUE9SVF9PRkZMSU5FIDoKKwkJYmZhX3NtX3NldF9zdGF0ZShycGYsIGJmYV9mY3NfcnBmX3NtX29mZmxpbmUpOworCQliZmFfZmN4cF93YWxsb2NfY2FuY2VsKHJwb3J0LT5mY3MtPmJmYSwgJnJwZi0+ZmN4cF93cWUpOworCQlycGYtPnJwc2NfcmV0cmllcyA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3JwZl9zbV9ycHNjKHN0cnVjdCBiZmFfZmNzX3JwZl9zICpycGYsIGVudW0gcnBmX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gcnBmLT5ycG9ydDsKKworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUEZTTV9FVkVOVF9SUFNDX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBmLCBiZmFfZmNzX3JwZl9zbV9vbmxpbmUpOworCQkvKiBVcGRhdGUgc3BlZWQgaW5mbyBpbiBmL3cgdmlhIEJGQSAqLworCQlpZiAocnBmLT5ycHNjX3NwZWVkICE9IEJGQV9QUE9SVF9TUEVFRF9VTktOT1dOKSB7CisJCQliZmFfcnBvcnRfc3BlZWQocnBvcnQtPmJmYV9ycG9ydCwgcnBmLT5ycHNjX3NwZWVkKTsKKwkJfSBlbHNlIGlmIChycGYtPmFzc2lnbmVkX3NwZWVkICE9IEJGQV9QUE9SVF9TUEVFRF9VTktOT1dOKSB7CisJCQliZmFfcnBvcnRfc3BlZWQocnBvcnQtPmJmYV9ycG9ydCwgcnBmLT5hc3NpZ25lZF9zcGVlZCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJQRlNNX0VWRU5UX1JQU0NfRkFJTDoKKwkJLyogUlBTQyBub3Qgc3VwcG9ydGVkIGJ5IHJwb3J0ICovCisJCWJmYV9zbV9zZXRfc3RhdGUocnBmLCBiZmFfZmNzX3JwZl9zbV9vbmxpbmUpOworCQlicmVhazsKKworCWNhc2UgUlBGU01fRVZFTlRfUlBTQ19FUlJPUjoKKwkJLyogbmVlZCB0byByZXRyeS4uLmRlbGF5ZWQgYSBiaXQuICovCisJCWlmIChycGYtPnJwc2NfcmV0cmllcysrIDwgQkZBX0ZDU19SUEZfUkVUUklFUykgeworCQkJYmZhX3RpbWVyX3N0YXJ0KHJwb3J0LT5mY3MtPmJmYSwgJnJwZi0+dGltZXIsCisJCQkJICAgIGJmYV9mY3NfcnBmX3RpbWVvdXQsIHJwZiwKKwkJCQkgICAgQkZBX0ZDU19SUEZfUkVUUllfVElNRU9VVCk7CisJCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fcnBzY19yZXRyeSk7CisJCX0gZWxzZSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fb25saW5lKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUlBGU01fRVZFTlRfUlBPUlRfT0ZGTElORSA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBmLCBiZmFfZmNzX3JwZl9zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfZGlzY2FyZChycGYtPmZjeHApOworCQlycGYtPnJwc2NfcmV0cmllcyA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3JwZl9zbV9ycHNjX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3JwZl9zICpycGYsIGVudW0gcnBmX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gcnBmLT5ycG9ydDsKKworCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnBpZCk7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSUEZTTV9FVkVOVF9USU1FT1VUIDoKKwkJLyogcmUtc2VuZCB0aGUgUlBTQyAqLworCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fcnBzY19zZW5kaW5nKTsKKwkJYmZhX2Zjc19ycGZfc2VuZF9ycHNjMihycGYsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgUlBGU01fRVZFTlRfUlBPUlRfT0ZGTElORSA6CisJCWJmYV90aW1lcl9zdG9wKCZycGYtPnRpbWVyKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycGYsIGJmYV9mY3NfcnBmX3NtX29mZmxpbmUpOworCQlycGYtPnJwc2NfcmV0cmllcyA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3JwZl9zbV9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcnBmX3MgKnJwZiwgZW51bSBycGZfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSBycGYtPnJwb3J0OworCisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09GRkxJTkUgOgorCQliZmFfc21fc2V0X3N0YXRlKHJwZiwgYmZhX2Zjc19ycGZfc21fb2ZmbGluZSk7CisJCXJwZi0+cnBzY19yZXRyaWVzID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBmX3NtX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcnBmX3MgKnJwZiwgZW51bSBycGZfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSBycGYtPnJwb3J0OworCisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJQRlNNX0VWRU5UX1JQT1JUX09OTElORSA6CisJCWJmYV9zbV9zZXRfc3RhdGUocnBmLCBiZmFfZmNzX3JwZl9zbV9ycHNjX3NlbmRpbmcpOworCQliZmFfZmNzX3JwZl9zZW5kX3Jwc2MyKHJwZiwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBSUEZTTV9FVkVOVF9SUE9SVF9PRkZMSU5FIDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKy8qKgorICogQ2FsbGVkIHdoZW4gUnBvcnQgaXMgY3JlYXRlZC4KKyAqLwordm9pZCAgYmZhX2Zjc19ycGZfaW5pdChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycGZfcyAqcnBmID0gJnJwb3J0LT5ycGY7CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCXJwZi0+cnBvcnQgPSBycG9ydDsKKworCWJmYV9zbV9zZXRfc3RhdGUocnBmLCBiZmFfZmNzX3JwZl9zbV91bmluaXQpOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuIFJwb3J0IGJlY29tZXMgb25saW5lCisgKi8KK3ZvaWQgIGJmYV9mY3NfcnBmX3Jwb3J0X29ubGluZShzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKK3sKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCisJaWYgKF9fZmNzX21pbl9jZmcocnBvcnQtPnBvcnQtPmZjcykpCisJCXJldHVybjsKKworCWlmIChiZmFfZmNzX2ZhYnJpY19pc19zd2l0Y2hlZChycG9ydC0+cG9ydC0+ZmFicmljKSkKKwkJYmZhX3NtX3NlbmRfZXZlbnQoJnJwb3J0LT5ycGYsIFJQRlNNX0VWRU5UX1JQT1JUX09OTElORSk7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gUnBvcnQgYmVjb21lcyBvZmZsaW5lCisgKi8KK3ZvaWQgIGJmYV9mY3NfcnBmX3Jwb3J0X29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpCit7CisJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKworCWlmIChfX2Zjc19taW5fY2ZnKHJwb3J0LT5wb3J0LT5mY3MpKQorCQlyZXR1cm47CisKKwliZmFfc21fc2VuZF9ldmVudCgmcnBvcnQtPnJwZiwgUlBGU01fRVZFTlRfUlBPUlRfT0ZGTElORSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3JwZl90aW1lb3V0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycGZfcyAqcnBmID0gKHN0cnVjdCBiZmFfZmNzX3JwZl9zICopIGFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IHJwZi0+cnBvcnQ7CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCWJmYV9zbV9zZW5kX2V2ZW50KHJwZiwgUlBGU01fRVZFTlRfVElNRU9VVCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3JwZl9zZW5kX3Jwc2MyKHZvaWQgKnJwZl9jYmFyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycGZfcyAqcnBmIAk9IChzdHJ1Y3QgYmZhX2Zjc19ycGZfcyAqKXJwZl9jYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IHJwZi0+cnBvcnQ7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJc3RydWN0IGZjaHNfcyAgICAgICAgICBmY2hzOworCWludCAgICAgICAgICAgICBsZW47CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJYmZhX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJnJwZi0+ZmN4cF93cWUsCisJCQkJCWJmYV9mY3NfcnBmX3NlbmRfcnBzYzIsIHJwZik7CisJCXJldHVybjsKKwl9CisJcnBmLT5mY3hwID0gZmN4cDsKKworCWxlbiA9IGZjX3Jwc2MyX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCBycG9ydC0+cGlkLAorCQkJICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgJnJwb3J0LT5waWQsIDEpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKKwkJCSAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19ycGZfcnBzYzJfcmVzcG9uc2UsCisJCQkgIHJwZiwgRkNfTUFYX1BEVVNaLCBGQ19SQV9UT1YpOworCXJwb3J0LT5zdGF0cy5ycHNjX3NlbnQrKzsKKwliZmFfc21fc2VuZF9ldmVudChycGYsIFJQRlNNX0VWRU5UX0ZDWFBfU0VOVCk7CisKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBmX3Jwc2MyX3Jlc3BvbnNlKHZvaWQgKmZjc2FyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsIHZvaWQgKmNiYXJnLAorCQkJICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLCB1MzIgcnNwX2xlbiwKKwkJCSAgICB1MzIgcmVzaWRfbGVuLCBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycGZfcyAqcnBmID0gKHN0cnVjdCBiZmFfZmNzX3JwZl9zICopIGNiYXJnOworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gcnBmLT5ycG9ydDsKKwlzdHJ1Y3QgZmNfbHNfcmp0X3MgICAgKmxzX3JqdDsKKwlzdHJ1Y3QgZmNfcnBzYzJfYWNjX3MgICpycHNjMl9hY2M7CisJdTE2ICAgICAgICBudW1fZW50czsKKworCWJmYV90cmMocnBvcnQtPmZjcywgcmVxX3N0YXR1cyk7CisKKwlpZiAocmVxX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMocnBvcnQtPmZjcywgcmVxX3N0YXR1cyk7CisJCWlmIChyZXFfc3RhdHVzID09IEJGQV9TVEFUVVNfRVRJTUVSKQorCQkJcnBvcnQtPnN0YXRzLnJwc2NfZmFpbGVkKys7CisJCWJmYV9zbV9zZW5kX2V2ZW50KHJwZiwgUlBGU01fRVZFTlRfUlBTQ19FUlJPUik7CisJCXJldHVybjsKKwl9CisKKwlycHNjMl9hY2MgPSAoc3RydWN0IGZjX3Jwc2MyX2FjY19zICopIEJGQV9GQ1hQX1JTUF9QTEQoZmN4cCk7CisJaWYgKHJwc2MyX2FjYy0+ZWxzX2NtZCA9PSBGQ19FTFNfQUNDKSB7CisJCXJwb3J0LT5zdGF0cy5ycHNjX2FjY3MrKzsKKwkJbnVtX2VudHMgPSBiZmFfb3NfbnRvaHMocnBzYzJfYWNjLT5udW1fcGlkcyk7CisJCWJmYV90cmMocnBvcnQtPmZjcywgbnVtX2VudHMpOworCQlpZiAobnVtX2VudHMgPiAwKSB7CisJCQliZmFfYXNzZXJ0KHJwc2MyX2FjYy0+cG9ydF9pbmZvWzBdLnBpZCAhPSBycG9ydC0+cGlkKTsKKwkJCWJmYV90cmMocnBvcnQtPmZjcywKKwkJCQliZmFfb3NfbnRvaHMocnBzYzJfYWNjLT5wb3J0X2luZm9bMF0ucGlkKSk7CisJCQliZmFfdHJjKHJwb3J0LT5mY3MsCisJCQkJYmZhX29zX250b2hzKHJwc2MyX2FjYy0+cG9ydF9pbmZvWzBdLnNwZWVkKSk7CisJCQliZmFfdHJjKHJwb3J0LT5mY3MsCisJCQkJYmZhX29zX250b2hzKHJwc2MyX2FjYy0+cG9ydF9pbmZvWzBdLmluZGV4KSk7CisJCQliZmFfdHJjKHJwb3J0LT5mY3MsCisJCQkJcnBzYzJfYWNjLT5wb3J0X2luZm9bMF0udHlwZSk7CisKKwkJCWlmIChycHNjMl9hY2MtPnBvcnRfaW5mb1swXS5zcGVlZCA9PSAwKSB7CisJCQkJYmZhX3NtX3NlbmRfZXZlbnQocnBmLCBSUEZTTV9FVkVOVF9SUFNDX0VSUk9SKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXJwZi0+cnBzY19zcGVlZCA9IGZjX3Jwc2Nfb3BlcnNwZWVkX3RvX2JmYV9zcGVlZCgKKwkJCQliZmFfb3NfbnRvaHMocnBzYzJfYWNjLT5wb3J0X2luZm9bMF0uc3BlZWQpKTsKKworCQkJYmZhX3NtX3NlbmRfZXZlbnQocnBmLCBSUEZTTV9FVkVOVF9SUFNDX0NPTVApOworCQl9CisJfSBlbHNlIHsKKwkJbHNfcmp0ID0gKHN0cnVjdCBmY19sc19yanRfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCQliZmFfdHJjKHJwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGUpOworCQliZmFfdHJjKHJwb3J0LT5mY3MsIGxzX3JqdC0+cmVhc29uX2NvZGVfZXhwbCk7CisJCXJwb3J0LT5zdGF0cy5ycHNjX3JlamVjdHMrKzsKKwkJaWYgKGxzX3JqdC0+cmVhc29uX2NvZGUgPT0gRkNfTFNfUkpUX1JTTl9DTURfTk9UX1NVUFApIHsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHJwZiwgUlBGU01fRVZFTlRfUlBTQ19GQUlMKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHJwZiwgUlBGU01fRVZFTlRfUlBTQ19FUlJPUik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL3Njbi5jIGIvZHJpdmVycy9zY3NpL2JmYS9zY24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQ3NzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9zY24uYwpAQCAtMCwwICsxLDQ4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YmZhLmg+CisjaW5jbHVkZSA8YmZhX3N2Yy5oPgorI2luY2x1ZGUgImZjc19scG9ydC5oIgorI2luY2x1ZGUgImZjc19ycG9ydC5oIgorI2luY2x1ZGUgImZjc19tcy5oIgorI2luY2x1ZGUgImZjc190cmNtb2QuaCIKKyNpbmNsdWRlICJmY3NfZmN4cC5oIgorI2luY2x1ZGUgImZjcy5oIgorI2luY2x1ZGUgImxwb3J0X3ByaXYuaCIKKworQkZBX1RSQ19GSUxFKEZDUywgU0NOKTsKKworI2RlZmluZSBGQ19RT1NfUlNDTl9FVkVOVAkJMHgwYworI2RlZmluZSBGQ19GQUJSSUNfTkFNRV9SU0NOX0VWRU5UCTB4MGQKKworLyoKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfc2NuX3NlbmRfc2NyKHZvaWQgKnNjbl9jYmFyZywKKwkJCQkJICBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfc2NuX3Njcl9yZXNwb25zZSh2b2lkICpmY3NhcmcsCisJCQkJCSAgICAgIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAorCQkJCQkgICAgICB2b2lkICpjYmFyZywKKwkJCQkJICAgICAgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCisJCQkJCSAgICAgIHUzMiByc3BfbGVuLAorCQkJCQkgICAgICB1MzIgcmVzaWRfbGVuLAorCQkJCQkgICAgICBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X3Njbl9zZW5kX2xzX2FjYyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQkJCSAgICAgc3RydWN0IGZjaHNfcyAqcnhfZmNocyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X3Njbl90aW1lb3V0KHZvaWQgKmFyZyk7CisKKy8qKgorICogIGZjc19zY21fc20gRkNTIFNDTiBzdGF0ZSBtYWNoaW5lCisgKi8KKworLyoqCisgKiBWUG9ydCBTQ04gU3RhdGUgTWFjaGluZSBldmVudHMKKyAqLworZW51bSBwb3J0X3Njbl9ldmVudCB7CisJU0NOU01fRVZFTlRfUE9SVF9PTkxJTkUgPSAxLAorCVNDTlNNX0VWRU5UX1BPUlRfT0ZGTElORSA9IDIsCisJU0NOU01fRVZFTlRfUlNQX09LID0gMywKKwlTQ05TTV9FVkVOVF9SU1BfRVJST1IgPSA0LAorCVNDTlNNX0VWRU5UX1RJTUVPVVQgPSA1LAorCVNDTlNNX0VWRU5UX1NDUl9TRU5UID0gNiwKK307CisKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfc2NuX3NtX29mZmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqc2NuLAorCQkJCQkgICAgZW51bSBwb3J0X3Njbl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X3Njbl9zbV9zZW5kaW5nX3NjcihzdHJ1Y3QgYmZhX2Zjc19wb3J0X3Njbl9zICpzY24sCisJCQkJCQllbnVtIHBvcnRfc2NuX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3BvcnRfc2NuX3NtX3NjcihzdHJ1Y3QgYmZhX2Zjc19wb3J0X3Njbl9zICpzY24sCisJCQkJCWVudW0gcG9ydF9zY25fZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfcG9ydF9zY25fc21fc2NyX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3BvcnRfc2NuX3MgKnNjbiwKKwkJCQkJICAgICAgZW51bSBwb3J0X3Njbl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19wb3J0X3Njbl9zbV9vbmxpbmUoc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqc2NuLAorCQkJCQkgICBlbnVtIHBvcnRfc2NuX2V2ZW50IGV2ZW50KTsKKworLyoqCisgKiAJCVN0YXJ0aW5nIHN0YXRlIC0gYXdhaXRpbmcgbGluayB1cC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9zY25fc21fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3Njbl9zICpzY24sCisJCQkgICAgZW51bSBwb3J0X3Njbl9ldmVudCBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTQ05TTV9FVkVOVF9QT1JUX09OTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShzY24sIGJmYV9mY3NfcG9ydF9zY25fc21fc2VuZGluZ19zY3IpOworCQliZmFfZmNzX3BvcnRfc2NuX3NlbmRfc2NyKHNjbiwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBTQ05TTV9FVkVOVF9QT1JUX09GRkxJTkU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfc2NuX3NtX3NlbmRpbmdfc2NyKHN0cnVjdCBiZmFfZmNzX3BvcnRfc2NuX3MgKnNjbiwKKwkJCQllbnVtIHBvcnRfc2NuX2V2ZW50IGV2ZW50KQoreworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNDTlNNX0VWRU5UX1NDUl9TRU5UOgorCQliZmFfc21fc2V0X3N0YXRlKHNjbiwgYmZhX2Zjc19wb3J0X3Njbl9zbV9zY3IpOworCQlicmVhazsKKworCWNhc2UgU0NOU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKHNjbiwgYmZhX2Zjc19wb3J0X3Njbl9zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfd2FsbG9jX2NhbmNlbChzY24tPnBvcnQtPmZjcy0+YmZhLCAmc2NuLT5mY3hwX3dxZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfc2NuX3NtX3NjcihzdHJ1Y3QgYmZhX2Zjc19wb3J0X3Njbl9zICpzY24sCisJCQllbnVtIHBvcnRfc2NuX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IHNjbi0+cG9ydDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNDTlNNX0VWRU5UX1JTUF9PSzoKKwkJYmZhX3NtX3NldF9zdGF0ZShzY24sIGJmYV9mY3NfcG9ydF9zY25fc21fb25saW5lKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDTlNNX0VWRU5UX1JTUF9FUlJPUjoKKwkJYmZhX3NtX3NldF9zdGF0ZShzY24sIGJmYV9mY3NfcG9ydF9zY25fc21fc2NyX3JldHJ5KTsKKwkJYmZhX3RpbWVyX3N0YXJ0KHBvcnQtPmZjcy0+YmZhLCAmc2NuLT50aW1lciwKKwkJCQliZmFfZmNzX3BvcnRfc2NuX3RpbWVvdXQsIHNjbiwKKwkJCQlCRkFfRkNTX1JFVFJZX1RJTUVPVVQpOworCQlicmVhazsKKworCWNhc2UgU0NOU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKHNjbiwgYmZhX2Zjc19wb3J0X3Njbl9zbV9vZmZsaW5lKTsKKwkJYmZhX2ZjeHBfZGlzY2FyZChzY24tPmZjeHApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X3Njbl9zbV9zY3JfcmV0cnkoc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqc2NuLAorCQkJICAgICAgZW51bSBwb3J0X3Njbl9ldmVudCBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTQ05TTV9FVkVOVF9USU1FT1VUOgorCQliZmFfc21fc2V0X3N0YXRlKHNjbiwgYmZhX2Zjc19wb3J0X3Njbl9zbV9zZW5kaW5nX3Njcik7CisJCWJmYV9mY3NfcG9ydF9zY25fc2VuZF9zY3Ioc2NuLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDTlNNX0VWRU5UX1BPUlRfT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZShzY24sIGJmYV9mY3NfcG9ydF9zY25fc21fb2ZmbGluZSk7CisJCWJmYV90aW1lcl9zdG9wKCZzY24tPnRpbWVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9zY25fc21fb25saW5lKHN0cnVjdCBiZmFfZmNzX3BvcnRfc2NuX3MgKnNjbiwKKwkJCSAgIGVudW0gcG9ydF9zY25fZXZlbnQgZXZlbnQpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU0NOU01fRVZFTlRfUE9SVF9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKHNjbiwgYmZhX2Zjc19wb3J0X3Njbl9zbV9vZmZsaW5lKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisKKy8qKgorICogIGZjc19zY25fcHJpdmF0ZSBGQ1MgU0NOIHByaXZhdGUgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgdG8gc2VuZCBhIFNDUiBjb21tYW5kLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X3Njbl9zZW5kX3Njcih2b2lkICpzY25fY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqc2NuID0gc2NuX2NiYXJnOworCXN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCA9IHNjbi0+cG9ydDsKKwlzdHJ1Y3QgZmNoc19zICAgICAgICAgIGZjaHM7CisJaW50ICAgICAgICAgICAgIGxlbjsKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5waWQpOworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApIHsKKwkJYmZhX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJnNjbi0+ZmN4cF93cWUsCisJCQkJICAgIGJmYV9mY3NfcG9ydF9zY25fc2VuZF9zY3IsIHNjbik7CisJCXJldHVybjsKKwl9CisJc2NuLT5mY3hwID0gZmN4cDsKKworCS8qCisJICogSGFuZGxlIFZVIHJlZ2lzdHJhdGlvbnMgZm9yIEJhc2UgcG9ydCBvbmx5CisJICovCisJaWYgKCghcG9ydC0+dnBvcnQpICYmIGJmYV9pb2NfZ2V0X2ZjbW9kZSgmcG9ydC0+ZmNzLT5iZmEtPmlvYykpIHsKKwkJbGVuID0gZmNfc2NyX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLAorCQkJCSAgIGJmYV9scHNfaXNfYnJjZF9mYWJyaWMocG9ydC0+ZmFicmljLT5scHMpLAorCQkJCSAgIHBvcnQtPnBpZCwgMCk7CisJfSBlbHNlIHsKKwkJbGVuID0gZmNfc2NyX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCBCRkFfRkFMU0UsCisJCQkJICAgcG9ydC0+cGlkLCAwKTsKKwl9CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywgQkZBX0ZBTFNFLAorCQkgICAgICBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBiZmFfZmNzX3BvcnRfc2NuX3Njcl9yZXNwb25zZSwKKwkJICAgICAgKHZvaWQgKilzY24sIEZDX01BWF9QRFVTWiwgRkNfUkFfVE9WKTsKKworCWJmYV9zbV9zZW5kX2V2ZW50KHNjbiwgU0NOU01fRVZFTlRfU0NSX1NFTlQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X3Njbl9zY3JfcmVzcG9uc2Uodm9pZCAqZmNzYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwKKwkJCSAgICAgIHZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywKKwkJCSAgICAgIHUzMiByc3BfbGVuLCB1MzIgcmVzaWRfbGVuLAorCQkJICAgICAgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqc2NuID0gKHN0cnVjdCBiZmFfZmNzX3BvcnRfc2NuX3MgKiljYmFyZzsKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQgPSBzY24tPnBvcnQ7CisJc3RydWN0IGZjX2Vsc19jbWRfcyAgICplbHNfY21kOworCXN0cnVjdCBmY19sc19yanRfcyAgICAqbHNfcmp0OworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHBvcnQtPnBvcnRfY2ZnLnB3d24pOworCisJLyoKKwkgKiBTYW5pdHkgQ2hlY2tzCisJICovCisJaWYgKHJlcV9zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKHBvcnQtPmZjcywgcmVxX3N0YXR1cyk7CisJCWJmYV9zbV9zZW5kX2V2ZW50KHNjbiwgU0NOU01fRVZFTlRfUlNQX0VSUk9SKTsKKwkJcmV0dXJuOworCX0KKworCWVsc19jbWQgPSAoc3RydWN0IGZjX2Vsc19jbWRfcyAqKSBCRkFfRkNYUF9SU1BfUExEKGZjeHApOworCisJc3dpdGNoIChlbHNfY21kLT5lbHNfY29kZSkgeworCisJY2FzZSBGQ19FTFNfQUNDOgorCQliZmFfc21fc2VuZF9ldmVudChzY24sIFNDTlNNX0VWRU5UX1JTUF9PSyk7CisJCWJyZWFrOworCisJY2FzZSBGQ19FTFNfTFNfUkpUOgorCisJCWxzX3JqdCA9IChzdHJ1Y3QgZmNfbHNfcmp0X3MgKikgQkZBX0ZDWFBfUlNQX1BMRChmY3hwKTsKKworCQliZmFfdHJjKHBvcnQtPmZjcywgbHNfcmp0LT5yZWFzb25fY29kZSk7CisJCWJmYV90cmMocG9ydC0+ZmNzLCBsc19yanQtPnJlYXNvbl9jb2RlX2V4cGwpOworCisJCWJmYV9zbV9zZW5kX2V2ZW50KHNjbiwgU0NOU01fRVZFTlRfUlNQX0VSUk9SKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fc2VuZF9ldmVudChzY24sIFNDTlNNX0VWRU5UX1JTUF9FUlJPUik7CisJfQorfQorCisvKgorICogU2VuZCBhIExTIEFjY2VwdAorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X3Njbl9zZW5kX2xzX2FjYyhzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQsCisJCQlzdHJ1Y3QgZmNoc19zICpyeF9mY2hzKQoreworCXN0cnVjdCBmY2hzX3MgICAgICAgICAgZmNoczsKKwlzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cDsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKmJmYV9ycG9ydCA9IE5VTEw7CisJaW50ICAgICAgICAgICAgIGxlbjsKKworCWJmYV90cmMocG9ydC0+ZmNzLCByeF9mY2hzLT5zX2lkKTsKKworCWZjeHAgPSBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApCisJCXJldHVybjsKKworCWxlbiA9IGZjX2xzX2FjY19idWlsZCgmZmNocywgYmZhX2ZjeHBfZ2V0X3JlcWJ1ZihmY3hwKSwgcnhfZmNocy0+c19pZCwKKwkJCSAgICAgIGJmYV9mY3NfcG9ydF9nZXRfZmNpZChwb3J0KSwgcnhfZmNocy0+b3hfaWQpOworCisJYmZhX2ZjeHBfc2VuZChmY3hwLCBiZmFfcnBvcnQsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywKKwkJICAgICAgQkZBX0ZBTFNFLCBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBOVUxMLCBOVUxMLAorCQkgICAgICBGQ19NQVhfUERVU1osIDApOworfQorCisvKioKKyAqICAgICBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgYnkgYmZhX3RpbWVyIG9uIHRpbWVyIHRpbWVvdXRzLgorICoKKyAqIAlwYXJhbVtpbl0gCXZwb3J0IAkJCS0gcG9pbnRlciB0byBiZmFfZmNzX3BvcnRfdC4KKyAqIAlwYXJhbVtvdXRdCXZwb3J0X3N0YXR1cyAJLSBwb2ludGVyIHRvIHJldHVybiB2cG9ydCBzdGF0dXMgaW4KKyAqCisgKiAJcmV0dXJuCisgKiAJCXZvaWQKKyAqCisqICAJU3BlY2lhbCBDb25zaWRlcmF0aW9uczoKKyAqCisgKiAJbm90ZQorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19wb3J0X3Njbl90aW1lb3V0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19wb3J0X3Njbl9zICpzY24gPSAoc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqKWFyZzsKKworCWJmYV9zbV9zZW5kX2V2ZW50KHNjbiwgU0NOU01fRVZFTlRfVElNRU9VVCk7Cit9CisKKworCisvKioKKyAqICBmY3Nfc2NuX3B1YmxpYyBGQ1Mgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBwdWJsaWMgaW50ZXJmYWNlcworICovCisKKy8qCisgKiBGdW5jdGlvbnMgY2FsbGVkIGJ5IHBvcnQvZmFiCisgKi8KK3ZvaWQKK2JmYV9mY3NfcG9ydF9zY25faW5pdChzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqc2NuID0gQkZBX0ZDU19HRVRfU0NOX0ZST01fUE9SVChwb3J0KTsKKworCXNjbi0+cG9ydCA9IHBvcnQ7CisJYmZhX3NtX3NldF9zdGF0ZShzY24sIGJmYV9mY3NfcG9ydF9zY25fc21fb2ZmbGluZSk7Cit9CisKK3ZvaWQKK2JmYV9mY3NfcG9ydF9zY25fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqc2NuID0gQkZBX0ZDU19HRVRfU0NOX0ZST01fUE9SVChwb3J0KTsKKworCXNjbi0+cG9ydCA9IHBvcnQ7CisJYmZhX3NtX3NlbmRfZXZlbnQoc2NuLCBTQ05TTV9FVkVOVF9QT1JUX09GRkxJTkUpOworfQorCit2b2lkCitiZmFfZmNzX3BvcnRfc2NuX29ubGluZShzdHJ1Y3QgYmZhX2Zjc19wb3J0X3MgKnBvcnQpCit7CisJc3RydWN0IGJmYV9mY3NfcG9ydF9zY25fcyAqc2NuID0gQkZBX0ZDU19HRVRfU0NOX0ZST01fUE9SVChwb3J0KTsKKworCXNjbi0+cG9ydCA9IHBvcnQ7CisJYmZhX3NtX3NlbmRfZXZlbnQoc2NuLCBTQ05TTV9FVkVOVF9QT1JUX09OTElORSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNzX3BvcnRfc2NuX3BvcnRpZF9yc2NuKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgdTMyIHJwaWQpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQ7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgcnBpZCk7CisKKwkvKioKKwkgKiBJZiB0aGlzIGlzIGFuIHVua25vd24gZGV2aWNlLCB0aGVuIGl0IGp1c3QgY2FtZSBvbmxpbmUuCisJICogT3RoZXJ3aXNlIGxldCBycG9ydCBoYW5kbGUgdGhlIFJTQ04gZXZlbnQuCisJICovCisJcnBvcnQgPSBiZmFfZmNzX3BvcnRfZ2V0X3Jwb3J0X2J5X3BpZChwb3J0LCBycGlkKTsKKwlpZiAocnBvcnQgPT0gTlVMTCkgeworCQkvKgorCQkgKiBJZiBtaW4gY2ZnIG1vZGUgaXMgZW5hYmxlZCwgd2UgZG9ub3QgbmVlZCB0bworCQkgKiBkaXNjb3ZlciBhbnkgbmV3IHJwb3J0cy4KKwkJICovCisJCWlmICghX19mY3NfbWluX2NmZyhwb3J0LT5mY3MpKQorCQkJcnBvcnQgPSBiZmFfZmNzX3Jwb3J0X2NyZWF0ZShwb3J0LCBycGlkKTsKKwl9IGVsc2UgeworCQliZmFfZmNzX3Jwb3J0X3NjbihycG9ydCk7CisJfQorfQorCisvKioKKyAqIHJzY24gZm9ybWF0IGJhc2VkIFBJRCBjb21wYXJpc29uCisgKi8KKyNkZWZpbmUgX19mY19waWRfbWF0Y2goX19jMCwgX19jMSwgX19mbXQpCQlcCisJKCgoX19mbXQpID09IEZDX1JTQ05fRk9STUFUX0ZBQlJJQykgfHwJCVwKKwkgKCgoX19mbXQpID09IEZDX1JTQ05fRk9STUFUX0RPTUFJTikgJiYJCVwKKwkgICgoX19jMClbMF0gPT0gKF9fYzEpWzBdKSkgfHwJCQlcCisJICgoKF9fZm10KSA9PSBGQ19SU0NOX0ZPUk1BVF9BUkVBKSAmJgkJXAorCSAgKChfX2MwKVswXSA9PSAoX19jMSlbMF0pICYmCQkJXAorCSAgKChfX2MwKVsxXSA9PSAoX19jMSlbMV0pKSkKKworc3RhdGljIHZvaWQKK2JmYV9mY3NfcG9ydF9zY25fbXVsdGlwb3J0X3JzY24oc3RydWN0IGJmYV9mY3NfcG9ydF9zICpwb3J0LAorCQkJZW51bSBmY19yc2NuX2Zvcm1hdCBmb3JtYXQsIHUzMiByc2NuX3BpZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlX25leHQ7CisJdTggICAgICAgICpjMCwgKmMxOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIGZvcm1hdCk7CisJYmZhX3RyYyhwb3J0LT5mY3MsIHJzY25fcGlkKTsKKworCWMwID0gKHU4ICopICZyc2NuX3BpZDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVfbmV4dCwgJnBvcnQtPnJwb3J0X3EpIHsKKwkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXFlOworCQljMSA9ICh1OCAqKSAmcnBvcnQtPnBpZDsKKwkJaWYgKF9fZmNfcGlkX21hdGNoKGMwLCBjMSwgZm9ybWF0KSkKKwkJCWJmYV9mY3NfcnBvcnRfc2NuKHJwb3J0KTsKKwl9Cit9CisKK3ZvaWQKK2JmYV9mY3NfcG9ydF9zY25fcHJvY2Vzc19yc2NuKHN0cnVjdCBiZmFfZmNzX3BvcnRfcyAqcG9ydCwgc3RydWN0IGZjaHNfcyAqZmNocywKKwkJCSAgICAgIHUzMiBsZW4pCit7CisJc3RydWN0IGZjX3JzY25fcGxfcyAgICpyc2NuID0gKHN0cnVjdCBmY19yc2NuX3BsX3MgKikgKGZjaHMgKyAxKTsKKwlpbnQgICAgICAgICAgICAgbnVtX2VudHJpZXM7CisJdTMyICAgICAgICByc2NuX3BpZDsKKwliZmFfYm9vbGVhbl90ICAgbnNxdWVyeSA9IEJGQV9GQUxTRTsKKwlpbnQgICAgICAgICAgICAgaSA9IDA7CisKKwludW1fZW50cmllcyA9CisJCShiZmFfb3NfbnRvaHMocnNjbi0+cGF5bGRsZW4pIC0KKwkJIHNpemVvZih1MzIpKSAvIHNpemVvZihyc2NuLT5ldmVudFswXSk7CisKKwliZmFfdHJjKHBvcnQtPmZjcywgbnVtX2VudHJpZXMpOworCisJcG9ydC0+c3RhdHMubnVtX3JzY24rKzsKKworCWJmYV9mY3NfcG9ydF9zY25fc2VuZF9sc19hY2MocG9ydCwgZmNocyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworCQlyc2NuX3BpZCA9IHJzY24tPmV2ZW50W2ldLnBvcnRpZDsKKworCQliZmFfdHJjKHBvcnQtPmZjcywgcnNjbi0+ZXZlbnRbaV0uZm9ybWF0KTsKKwkJYmZhX3RyYyhwb3J0LT5mY3MsIHJzY25fcGlkKTsKKworCQlzd2l0Y2ggKHJzY24tPmV2ZW50W2ldLmZvcm1hdCkgeworCQljYXNlIEZDX1JTQ05fRk9STUFUX1BPUlRJRDoKKwkJCWlmIChyc2NuLT5ldmVudFtpXS5xdWFsaWZpZXIgPT0gRkNfUU9TX1JTQ05fRVZFTlQpIHsKKwkJCQkvKgorCQkJCSAqIElnbm9yZSB0aGlzIGV2ZW50LiBmL3cgd291bGQgaGF2ZSBwcm9jZXNzZWQKKwkJCQkgKiBpdAorCQkJCSAqLworCQkJCWJmYV90cmMocG9ydC0+ZmNzLCByc2NuX3BpZCk7CisJCQl9IGVsc2UgeworCQkJCXBvcnQtPnN0YXRzLm51bV9wb3J0aWRfcnNjbisrOworCQkJCWJmYV9mY3NfcG9ydF9zY25fcG9ydGlkX3JzY24ocG9ydCwgcnNjbl9waWQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBGQ19SU0NOX0ZPUk1BVF9GQUJSSUM6CisJCQlpZiAocnNjbi0+ZXZlbnRbaV0ucXVhbGlmaWVyID09CisJCQkgICAgRkNfRkFCUklDX05BTUVfUlNDTl9FVkVOVCkgeworCQkJCWJmYV9mY3NfcG9ydF9tc19mYWJyaWNfcnNjbihwb3J0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiAhISEhISEhISEgRmFsbCBUaHJvdWdoICEhISEhISEhISEhISEKKwkJCSAqLworCisJCWNhc2UgRkNfUlNDTl9GT1JNQVRfQVJFQToKKwkJY2FzZSBGQ19SU0NOX0ZPUk1BVF9ET01BSU46CisJCQluc3F1ZXJ5ID0gQkZBX1RSVUU7CisJCQliZmFfZmNzX3BvcnRfc2NuX211bHRpcG9ydF9yc2NuKHBvcnQsCisJCQkJCQkJcnNjbi0+ZXZlbnRbaV0uZm9ybWF0LAorCQkJCQkJCXJzY25fcGlkKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQliZmFfYXNzZXJ0KDApOworCQkJbnNxdWVyeSA9IEJGQV9UUlVFOworCQl9CisJfQorCisJLyoqCisJICogSWYgYW55IG9mIGFyZWEsIGRvbWFpbiBvciBmYWJyaWMgUlNDTiBpcyByZWNlaXZlZCwgZG8gYSBmcmVzaCBkaXNjb3ZlcnkKKwkgKiB0byBmaW5kIG5ldyBkZXZpY2VzLgorCSAqLworCWlmIChuc3F1ZXJ5KQorCQliZmFfZmNzX3BvcnRfbnNfcXVlcnkocG9ydCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS92ZmFwaS5jIGIvZHJpdmVycy9zY3NpL2JmYS92ZmFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDgxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL3ZmYXBpLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiAgdmZhcGkuYyBGYWJyaWMgbW9kdWxlIGltcGxlbWVudGF0aW9uLgorICovCisKKyNpbmNsdWRlICJmY3NfZmFicmljLmgiCisjaW5jbHVkZSAiZmNzX3RyY21vZC5oIgorCitCRkFfVFJDX0ZJTEUoRkNTLCBWRkFQSSk7CisKKy8qKgorICogIGZjc192Zl9hcGkgdmlydHVhbCBmYWJyaWNzIEFQSQorICovCisKKy8qKgorICogCQlFbmFibGUgVkYgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dCQlmY3MJCWZjcyBtb2R1bGUgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0JCXZmX2lkCQlkZWZhdWx0IHZmX2lkIG9mIHBvcnQsIEZDX1ZGX0lEX05VTEwKKyAqIAkJCQkJdG8gdXNlIHN0YW5kYXJkIGRlZmF1bHQgdmZfaWQgb2YgMS4KKyAqCisgKiBAcmV0dmFsCUJGQV9TVEFUVVNfT0sJCXZmIG1vZGUgaXMgZW5hYmxlZAorICogQHJldHZhbAlCRkFfU1RBVFVTX0JVU1kJCVBvcnQgaXMgYWN0aXZlLiBQb3J0IG11c3QgYmUgZGlzYWJsZWQKKyAqCQkJCQliZWZvcmUgVkYgbW9kZSBjYW4gYmUgZW5hYmxlZC4KKyAqLworYmZhX3N0YXR1c190CitiZmFfZmNzX3ZmX21vZGVfZW5hYmxlKHN0cnVjdCBiZmFfZmNzX3MgKmZjcywgdTE2IHZmX2lkKQoreworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqIAkJRGlzYWJsZSBWRiBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0JCWZjcwkJZmNzIG1vZHVsZSBpbnN0YW5jZQorICoKKyAqIEByZXR2YWwJQkZBX1NUQVRVU19PSwkJdmYgbW9kZSBpcyBkaXNhYmxlZAorICogQHJldHZhbAlCRkFfU1RBVFVTX0JVU1kJCVZGcyBhcmUgcHJlc2VudCBhbmQgYmVpbmcgdXNlZC4gQWxsCisgKiAJCQkJCVZGcyBtdXN0IGJlIGRlbGV0ZWQgYmVmb3JlIGRpc2FibGluZworICoJCQkJCVZGIG1vZGUuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2Zjc192Zl9tb2RlX2Rpc2FibGUoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqIAkJQ3JlYXRlIGEgbmV3IFZGIGluc3RhbmNlLgorICoKKyAqICBBIG5ldyBWRiBpcyBjcmVhdGVkIHVzaW5nIHRoZSBnaXZlbiBWRiBjb25maWd1cmF0aW9uLiBBIFZGIGlzIGlkZW50aWZpZWQKKyAqICBieSBWRiBpZC4gTm8gZHVwbGljYXRlIFZGIGNyZWF0aW9uIGlzIGFsbG93ZWQgd2l0aCB0aGUgc2FtZSBWRiBpZC4gT25jZQorICogIGEgVkYgaXMgY3JlYXRlZCwgVkYgaXMgYXV0b21hdGljYWxseSBzdGFydGVkIGFmdGVyIGxpbmsgaW5pdGlhbGl6YXRpb24KKyAqICBhbmQgRVZGUCBleGNoYW5nZSBpcyBjb21wbGV0ZWQuCisgKgorICogCXBhcmFtW2luXSB2ZgkJLSAJRkNTIHZmIGRhdGEgc3RydWN0dXJlLiBNZW1vcnkgaXMKKyAqCQkJCQlhbGxvY2F0ZWQgYnkgY2FsbGVyIChkcml2ZXIpCisgKiAJcGFyYW1baW5dIGZjcyAJCS0gCUZDUyBtb2R1bGUKKyAqIAlwYXJhbVtpbl0gdmZfY2ZnCS0gCVZGIGNvbmZpZ3VyYXRpb24KKyAqIAlwYXJhbVtpbl0gdmZfZHJ2IAktIAlPcGFxdWUgaGFuZGxlIGJhY2sgdG8gdGhlIGRyaXZlcidzCisgKgkJCQkJdmlydHVhbCB2ZiBzdHJ1Y3R1cmUKKyAqCisgKiAJcmV0dmFsIEJGQV9TVEFUVVNfT0sgVkYgY3JlYXRpb24gaXMgc3VjY2Vzc2Z1bAorICogCXJldHZhbCBCRkFfU1RBVFVTX0ZBSUxFRCBWRiBjcmVhdGlvbiBmYWlsZWQKKyAqIAlyZXR2YWwgQkZBX1NUQVRVU19FRVhJU1QgQSBWRiBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gdmZfaWQKKyAqLworYmZhX3N0YXR1c190CitiZmFfZmNzX3ZmX2NyZWF0ZShiZmFfZmNzX3ZmX3QgKnZmLCBzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHUxNiB2Zl9pZCwKKwkJICBzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnBvcnRfY2ZnLCBzdHJ1Y3QgYmZhZF92Zl9zICp2Zl9kcnYpCit7CisJYmZhX3RyYyhmY3MsIHZmX2lkKTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoqCisgKiAgCVVzZSB0aGlzIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhIEJGQSBWRiBvYmplY3QuIFZGIG9iamVjdCBzaG91bGQKKyAqIAkJYmUgc3RvcHBlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYWxsLgorICoKKyAqIAlwYXJhbVtpbl0gdmYgLSBwb2ludGVyIHRvIGJmYV92Zl90LgorICoKKyAqIAlyZXR2YWwgQkZBX1NUQVRVU19PSwlPbiB2ZiBkZWxldGlvbiBzdWNjZXNzCisgKiAJcmV0dmFsIEJGQV9TVEFUVVNfQlVTWSBWRiBpcyBub3QgaW4gYSBzdG9wcGVkIHN0YXRlCisgKiAJcmV0dmFsIEJGQV9TVEFUVVNfSU5QUk9HUkVTUyBWRiBkZWxldGlvbiBpbiBpbiBwcm9ncmVzcworICovCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfdmZfZGVsZXRlKGJmYV9mY3NfdmZfdCAqdmYpCit7CisJYmZhX3RyYyh2Zi0+ZmNzLCB2Zi0+dmZfaWQpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqICAJU3RhcnQgcGFydGljaXBhdGlvbiBpbiBWRi4gVGhpcyB0cmlnZ2VycyBsb2dpbiB0byB0aGUgdmlydHVhbCBmYWJyaWMuCisgKgorICogCXBhcmFtW2luXSB2ZiAtIHBvaW50ZXIgdG8gYmZhX3ZmX3QuCisgKgorICogCXJldHVybiBOb25lCisgKi8KK3ZvaWQKK2JmYV9mY3NfdmZfc3RhcnQoYmZhX2Zjc192Zl90ICp2ZikKK3sKKwliZmFfdHJjKHZmLT5mY3MsIHZmLT52Zl9pZCk7Cit9CisKKy8qKgorICogIAlMb2dvdXQgd2l0aCB0aGUgdmlydHVhbCBmYWJyaWMuCisgKgorICogCXBhcmFtW2luXSB2ZiAtIHBvaW50ZXIgdG8gYmZhX3ZmX3QuCisgKgorICogCXJldHZhbCBCRkFfU1RBVFVTX09LIAlPbiBzdWNjZXNzLgorICogCXJldHZhbCBCRkFfU1RBVFVTX0lOUFJPR1JFU1MgVkYgaXMgYmVpbmcgc3RvcHBlZC4KKyAqLworYmZhX3N0YXR1c190CitiZmFfZmNzX3ZmX3N0b3AoYmZhX2Zjc192Zl90ICp2ZikKK3sKKwliZmFfdHJjKHZmLT5mY3MsIHZmLT52Zl9pZCk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogIAlSZXR1cm5zIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIFZGLgorICoKKyAqIAlwYXJhbVtpbl0gCXZmCQkJcG9pbnRlciB0byBiZmFfdmZfdC4KKyAqIAlwYXJhbVtvdXRdIHZmX2F0dHIgCXZmIGF0dHJpYnV0ZXMgcmV0dXJuZWQKKyAqCisgKiAJcmV0dXJuIE5vbmUKKyAqLwordm9pZAorYmZhX2Zjc192Zl9nZXRfYXR0cihiZmFfZmNzX3ZmX3QgKnZmLCBzdHJ1Y3QgYmZhX3ZmX2F0dHJfcyAqdmZfYXR0cikKK3sKKwliZmFfdHJjKHZmLT5mY3MsIHZmLT52Zl9pZCk7Cit9CisKKy8qKgorICogCQlSZXR1cm4gc3RhdGlzdGljcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHZmLgorICoKKyAqIAlwYXJhbVtpbl0gCXZmCQkJcG9pbnRlciB0byBiZmFfdmZfdC4KKyAqIAlwYXJhbVtvdXRdIHZmX3N0YXRzIAl2ZiBzdGF0aXN0aWNzIHJldHVybmVkCisgKgorICogIEByZXR1cm4gTm9uZQorICovCit2b2lkCitiZmFfZmNzX3ZmX2dldF9zdGF0cyhiZmFfZmNzX3ZmX3QgKnZmLCBzdHJ1Y3QgYmZhX3ZmX3N0YXRzX3MgKnZmX3N0YXRzKQoreworCWJmYV9vc19tZW1jcHkodmZfc3RhdHMsICZ2Zi0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgYmZhX3ZmX3N0YXRzX3MpKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQKKy8qKgorICogCQljbGVhciBzdGF0aXN0aWNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdmYuCisgKgorICogCXBhcmFtW2luXSAJdmYJCQlwb2ludGVyIHRvIGJmYV92Zl90LgorICoKKyAqICBAcmV0dXJuIE5vbmUKKyAqLworYmZhX2Zjc192Zl9jbGVhcl9zdGF0cyhiZmFfZmNzX3ZmX3QgKnZmKQoreworCWJmYV9vc19tZW1zZXQoJnZmLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfdmZfc3RhdHNfcykpOworCXJldHVybjsKK30KKworLyoqCisgKiAgCVJldHVybnMgRkNTIHZmIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiB2Zl9pZC4KKyAqCisgKiAJcGFyYW1baW5dIAl2Zl9pZAkJLSBWRl9JRAorICoKKyAqIAlyZXR1cm4KKyAqIAkJSWYgbG9va3VwIHN1Y2NlZWRzLCByZXR1bnMgZmNzIHZmIG9iamVjdCwgb3RoZXJ3aXNlIHJldHVybnMgTlVMTAorICovCitiZmFfZmNzX3ZmX3QgICAqCitiZmFfZmNzX3ZmX2xvb2t1cChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHUxNiB2Zl9pZCkKK3sKKwliZmFfdHJjKGZjcywgdmZfaWQpOworCWlmICh2Zl9pZCA9PSBGQ19WRl9JRF9OVUxMKQorCQlyZXR1cm4gKCZmY3MtPmZhYnJpYyk7CisKKwkvKioKKwkgKiBAdG9kbyB2ZiBzdXBwb3J0CisJICovCisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiAgCVJldHVybnMgZHJpdmVyIFZGIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBGQ1MgdmYuCisgKgorICogCXBhcmFtW2luXSAJdmYJCS0gcG9pbnRlciB0byBiZmFfdmZfdAorICoKKyAqIAlyZXR1cm4gRHJpdmVyIFZGIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgYmZhZF92Zl9zICAgICAgKgorYmZhX2Zjc192Zl9nZXRfZHJ2X3ZmKGJmYV9mY3NfdmZfdCAqdmYpCit7CisJYmZhX2Fzc2VydCh2Zik7CisJYmZhX3RyYyh2Zi0+ZmNzLCB2Zi0+dmZfaWQpOworCXJldHVybiB2Zi0+dmZfZHJ2OworfQorCisvKioKKyAqICAJUmV0dXJuIHRoZSBsaXN0IG9mIFZGcyBjb25maWd1cmVkLgorICoKKyAqIAlwYXJhbVtpbl0JZmNzCWZjcyBtb2R1bGUgaW5zdGFuY2UKKyAqIAlwYXJhbVtvdXRdIAl2Zl9pZHMJcmV0dXJuZWQgbGlzdCBvZiB2Zl9pZHMKKyAqIAlwYXJhbVtpbixvdXRdIAludmZzCWluOnNpemUgb2YgdmZfaWRzIGFycmF5LAorICogCQkJCW91dDp0b3RhbCBlbGVtZW50cyBwcmVzZW50LAorICogCQkJCWFjdHVhbCBlbGVtZW50cyByZXR1cm5lZCBpcyBsaW1pdGVkIGJ5IHRoZSBzaXplCisgKgorICogCXJldHVybiBEcml2ZXIgVkYgc3RydWN0dXJlCisgKi8KK3ZvaWQKK2JmYV9mY3NfdmZfbGlzdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHUxNiAqdmZfaWRzLCBpbnQgKm52ZnMpCit7CisJYmZhX3RyYyhmY3MsICpudmZzKTsKK30KKworLyoqCisgKiAgCVJldHVybiB0aGUgbGlzdCBvZiBhbGwgVkZzIHZpc2libGUgZnJvbSBmYWJyaWMuCisgKgorICogCXBhcmFtW2luXQlmY3MJZmNzIG1vZHVsZSBpbnN0YW5jZQorICogCXBhcmFtW291dF0gCXZmX2lkcwlyZXR1cm5lZCBsaXN0IG9mIHZmX2lkcworICogCXBhcmFtW2luLG91dF0gCW52ZnMJaW46c2l6ZSBvZiB2Zl9pZHMgYXJyYXksCisgKgkJCQlvdXQ6dG90YWwgZWxlbWVudHMgcHJlc2VudCwKKyAqIAkJCQlhY3R1YWwgZWxlbWVudHMgcmV0dXJuZWQgaXMgbGltaXRlZCBieSB0aGUgc2l6ZQorICoKKyAqIAlyZXR1cm4gRHJpdmVyIFZGIHN0cnVjdHVyZQorICovCit2b2lkCitiZmFfZmNzX3ZmX2xpc3RfYWxsKHN0cnVjdCBiZmFfZmNzX3MgKmZjcywgdTE2ICp2Zl9pZHMsIGludCAqbnZmcykKK3sKKwliZmFfdHJjKGZjcywgKm52ZnMpOworfQorCisvKioKKyAqIAkJUmV0dXJuIHRoZSBsaXN0IG9mIGxvY2FsIGxvZ2ljYWwgcG9ydHMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gVkYuCisgKgorICogCXBhcmFtW2luXQl2Zgl2ZiBmb3Igd2hpY2ggbG9naWNhbCBwb3J0cyBhcmUgcmV0dXJuZWQKKyAqIAlwYXJhbVtvdXRdIAlscHd3bglyZXR1cm5lZCBsb2dpY2FsIHBvcnQgd3duIGxpc3QKKyAqIAlwYXJhbVtpbixvdXRdIAlubHBvcnRzCWluOnNpemUgb2YgbHB3d24gbGlzdDsKKyAqCQkJCW91dDp0b3RhbCBlbGVtZW50cyBwcmVzZW50LAorICogCQkJCWFjdHVhbCBlbGVtZW50cyByZXR1cm5lZCBpcyBsaW1pdGVkIGJ5IHRoZSBzaXplCisgKgorICovCit2b2lkCitiZmFfZmNzX3ZmX2dldF9wb3J0cyhiZmFfZmNzX3ZmX3QgKnZmLCB3d25fdCBscHd3bltdLCBpbnQgKm5scG9ydHMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKnFlOworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0OworCWludCAgICAgICAgICAgICBpOworCXN0cnVjdCBiZmFfZmNzX3MgICAgICAqZmNzOworCisJaWYgKHZmID09IE5VTEwgfHwgbHB3d24gPT0gTlVMTCB8fCAqbmxwb3J0cyA9PSAwKQorCQlyZXR1cm47CisKKwlmY3MgPSB2Zi0+ZmNzOworCisJYmZhX3RyYyhmY3MsIHZmLT52Zl9pZCk7CisJYmZhX3RyYyhmY3MsICh1MzIpICpubHBvcnRzKTsKKworCWkgPSAwOworCWxwd3duW2krK10gPSB2Zi0+YnBvcnQucG9ydF9jZmcucHd3bjsKKworCWxpc3RfZm9yX2VhY2gocWUsICZ2Zi0+dnBvcnRfcSkgeworCQlpZiAoaSA+PSAqbmxwb3J0cykKKwkJCWJyZWFrOworCisJCXZwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKikgcWU7CisJCWxwd3duW2krK10gPSB2cG9ydC0+bHBvcnQucG9ydF9jZmcucHd3bjsKKwl9CisKKwliZmFfdHJjKGZjcywgaSk7CisJKm5scG9ydHMgPSBpOworCXJldHVybjsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL3Zwb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL3Zwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwYWYwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvdnBvcnQuYwpAQCAtMCwwICsxLDg5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqICBiZmFfZmNzX3Zwb3J0LmMgRkNTIHZpcnR1YWwgcG9ydCBzdGF0ZSBtYWNoaW5lCisgKi8KKworI2luY2x1ZGUgPGJmYS5oPgorI2luY2x1ZGUgPGJmYV9zdmMuaD4KKyNpbmNsdWRlIDxmY2J1aWxkLmg+CisjaW5jbHVkZSAiZmNzX2ZhYnJpYy5oIgorI2luY2x1ZGUgImZjc19scG9ydC5oIgorI2luY2x1ZGUgImZjc192cG9ydC5oIgorI2luY2x1ZGUgImZjc190cmNtb2QuaCIKKyNpbmNsdWRlICJmY3MuaCIKKyNpbmNsdWRlIDxhZW4vYmZhX2Flbl9scG9ydC5oPgorCitCRkFfVFJDX0ZJTEUoRkNTLCBWUE9SVCk7CisKKyNkZWZpbmUgX192cG9ydF9mY3MoX192cCkgICAgICAgKF9fdnApLT5scG9ydC5mY3MKKyNkZWZpbmUgX192cG9ydF9wd3duKF9fdnApICAgICAgKF9fdnApLT5scG9ydC5wb3J0X2NmZy5wd3duCisjZGVmaW5lIF9fdnBvcnRfbnd3bihfX3ZwKSAgICAgIChfX3ZwKS0+bHBvcnQucG9ydF9jZmcubnd3bgorI2RlZmluZSBfX3Zwb3J0X2JmYShfX3ZwKSAgICAgICAoX192cCktPmxwb3J0LmZjcy0+YmZhCisjZGVmaW5lIF9fdnBvcnRfZmNpZChfX3ZwKSAgICAgIChfX3ZwKS0+bHBvcnQucGlkCisjZGVmaW5lIF9fdnBvcnRfZmFicmljKF9fdnApICAgIChfX3ZwKS0+bHBvcnQuZmFicmljCisjZGVmaW5lIF9fdnBvcnRfdmZpZChfX3ZwKSAgICAgIChfX3ZwKS0+bHBvcnQuZmFicmljLT52Zl9pZAorCisjZGVmaW5lIEJGQV9GQ1NfVlBPUlRfTUFYX1JFVFJJRVMgIDUKKy8qCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc192cG9ydF9kb19mZGlzYyhzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc192cG9ydF90aW1lb3V0KHZvaWQgKnZwb3J0X2FyZyk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc192cG9ydF9kb19sb2dvKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Zwb3J0X2ZyZWUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOworCisvKioKKyAqICBmY3NfdnBvcnRfc20gRkNTIHZpcnR1YWwgcG9ydCBzdGF0ZSBtYWNoaW5lCisgKi8KKworLyoqCisgKiBWUG9ydCBTdGF0ZSBNYWNoaW5lIGV2ZW50cworICovCitlbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgeworCUJGQV9GQ1NfVlBPUlRfU01fQ1JFQVRFID0gMSwJLyogIHZwb3J0IGNyZWF0ZSBldmVudCAqLworCUJGQV9GQ1NfVlBPUlRfU01fREVMRVRFID0gMiwJLyogIHZwb3J0IGRlbGV0ZSBldmVudCAqLworCUJGQV9GQ1NfVlBPUlRfU01fU1RBUlQgPSAzLAkvKiAgdnBvcnQgc3RhcnQgcmVxdWVzdCAqLworCUJGQV9GQ1NfVlBPUlRfU01fU1RPUCA9IDQsCS8qICBzdG9wOiB1bnN1cHBvcnRlZCAqLworCUJGQV9GQ1NfVlBPUlRfU01fT05MSU5FID0gNSwJLyogIGZhYnJpYyBvbmxpbmUgKi8KKwlCRkFfRkNTX1ZQT1JUX1NNX09GRkxJTkUgPSA2LAkvKiAgZmFicmljIG9mZmxpbmUgZXZlbnQgKi8KKwlCRkFfRkNTX1ZQT1JUX1NNX0ZSTVNFTlQgPSA3LAkvKiAgZmRpc2MvbG9nbyBzZW50IGV2ZW50cyAqLworCUJGQV9GQ1NfVlBPUlRfU01fUlNQX09LID0gOCwJLyogIGdvb2QgcmVzcG9uc2UgKi8KKwlCRkFfRkNTX1ZQT1JUX1NNX1JTUF9FUlJPUiA9IDksCS8qICBlcnJvci9iYWQgcmVzcG9uc2UgKi8KKwlCRkFfRkNTX1ZQT1JUX1NNX1RJTUVPVVQgPSAxMCwJLyogIGRlbGF5IHRpbWVyIGV2ZW50ICovCisJQkZBX0ZDU19WUE9SVF9TTV9ERUxDT01QID0gMTEsCS8qICBscG9ydCBkZWxldGUgY29tcGxldGlvbiAqLworCUJGQV9GQ1NfVlBPUlRfU01fUlNQX0RVUF9XV04gPSAxMiwJLyogIER1cCB3bm4gZXJyb3IgKi8KKwlCRkFfRkNTX1ZQT1JUX1NNX1JTUF9GQUlMRUQgPSAxMywJLyogIG5vbi1yZXRyeWFibGUgZmFpbHVyZSAqLworfTsKKworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfdnBvcnRfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJCQllbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfdnBvcnRfc21fY3JlYXRlZChzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCQkJIGVudW0gYmZhX2Zjc192cG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc192cG9ydF9zbV9vZmZsaW5lKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJCQkgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Zwb3J0X3NtX2ZkaXNjKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJCSAgICAgICBlbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfdnBvcnRfc21fZmRpc2NfcmV0cnkoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQkJCSAgICAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Zwb3J0X3NtX29ubGluZShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCQkJZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Zwb3J0X3NtX2RlbGV0aW5nKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJCQkgIGVudW0gYmZhX2Zjc192cG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc192cG9ydF9zbV9jbGVhbnVwKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJCQkgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Zwb3J0X3NtX2xvZ28oc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQkJICAgICAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Zwb3J0X3NtX2Vycm9yKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJCSAgICAgICBlbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpOworCitzdGF0aWMgc3RydWN0IGJmYV9zbV90YWJsZV9zIHZwb3J0X3NtX3RhYmxlW10gPSB7CisJe0JGQV9TTShiZmFfZmNzX3Zwb3J0X3NtX3VuaW5pdCksIEJGQV9GQ1NfVlBPUlRfVU5JTklUfSwKKwl7QkZBX1NNKGJmYV9mY3NfdnBvcnRfc21fY3JlYXRlZCksIEJGQV9GQ1NfVlBPUlRfQ1JFQVRFRH0sCisJe0JGQV9TTShiZmFfZmNzX3Zwb3J0X3NtX29mZmxpbmUpLCBCRkFfRkNTX1ZQT1JUX09GRkxJTkV9LAorCXtCRkFfU00oYmZhX2Zjc192cG9ydF9zbV9mZGlzYyksIEJGQV9GQ1NfVlBPUlRfRkRJU0N9LAorCXtCRkFfU00oYmZhX2Zjc192cG9ydF9zbV9mZGlzY19yZXRyeSksIEJGQV9GQ1NfVlBPUlRfRkRJU0NfUkVUUll9LAorCXtCRkFfU00oYmZhX2Zjc192cG9ydF9zbV9vbmxpbmUpLCBCRkFfRkNTX1ZQT1JUX09OTElORX0sCisJe0JGQV9TTShiZmFfZmNzX3Zwb3J0X3NtX2RlbGV0aW5nKSwgQkZBX0ZDU19WUE9SVF9ERUxFVElOR30sCisJe0JGQV9TTShiZmFfZmNzX3Zwb3J0X3NtX2NsZWFudXApLCBCRkFfRkNTX1ZQT1JUX0NMRUFOVVB9LAorCXtCRkFfU00oYmZhX2Zjc192cG9ydF9zbV9sb2dvKSwgQkZBX0ZDU19WUE9SVF9MT0dPfSwKKwl7QkZBX1NNKGJmYV9mY3NfdnBvcnRfc21fZXJyb3IpLCBCRkFfRkNTX1ZQT1JUX0VSUk9SfQorfTsKKworLyoqCisgKiBCZWdpbm5pbmcgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Zwb3J0X3NtX3VuaW5pdChzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCWVudW0gYmZhX2Zjc192cG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgX192cG9ydF9wd3duKHZwb3J0KSk7CisJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fQ1JFQVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2NyZWF0ZWQpOworCQliZmFfZmNzX2ZhYnJpY19hZGR2cG9ydChfX3Zwb3J0X2ZhYnJpYyh2cG9ydCksIHZwb3J0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBDcmVhdGVkIHN0YXRlIC0gYSBzdGFydCBldmVudCBpcyByZXF1aXJlZCB0byBzdGFydCB1cCB0aGUgc3RhdGUgbWFjaGluZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfc21fY3JlYXRlZChzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCSBlbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIF9fdnBvcnRfcHd3bih2cG9ydCkpOworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1NUQVJUOgorCQlpZiAoYmZhX2Zjc19mYWJyaWNfaXNfb25saW5lKF9fdnBvcnRfZmFicmljKHZwb3J0KSkKKwkJICAgICYmIGJmYV9mY3NfZmFicmljX25waXZfY2FwYWJsZShfX3Zwb3J0X2ZhYnJpYyh2cG9ydCkpKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2ZkaXNjKTsKKwkJCWJmYV9mY3NfdnBvcnRfZG9fZmRpc2ModnBvcnQpOworCQl9IGVsc2UgeworCQkJLyoqCisJCQkgKiBGYWJyaWMgaXMgb2ZmbGluZSBvciBub3QgTlBJViBjYXBhYmxlLCBzdGF5IGluCisJCQkgKiBvZmZsaW5lIHN0YXRlLgorCQkJICovCisJCQl2cG9ydC0+dnBvcnRfc3RhdHMuZmFiX25vX25waXYrKzsKKwkJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fb2ZmbGluZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2NsZWFudXApOworCQliZmFfZmNzX3BvcnRfZGVsZXRlKCZ2cG9ydC0+bHBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9PTkxJTkU6CisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX09GRkxJTkU6CisJCS8qKgorCQkgKiBJZ25vcmUgT05MSU5FL09GRkxJTkUgZXZlbnRzIGZyb20gZmFicmljIHRpbGwgdnBvcnQgaXMgc3RhcnRlZC4KKwkJICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogT2ZmbGluZSBzdGF0ZSAtIGF3YWl0aW5nIE9OTElORSBldmVudCBmcm9tIGZhYnJpYyBTTS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfc21fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCSBlbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIF9fdnBvcnRfcHd3bih2cG9ydCkpOworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV9jbGVhbnVwKTsKKwkJYmZhX2Zjc19wb3J0X2RlbGV0ZSgmdnBvcnQtPmxwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fT05MSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2ZkaXNjKTsKKwkJdnBvcnQtPmZkaXNjX3JldHJpZXMgPSAwOworCQliZmFfZmNzX3Zwb3J0X2RvX2ZkaXNjKHZwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fT0ZGTElORToKKwkJLyoKKwkJICogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB2cG9ydCBjb3VsZG4ndCBiZSBpbml0aWFsemllZCBkdWUKKwkJICogdGhlIGZhY3QgdGhhdCB0aGUgbnBpdiB3YXMgbm90IGVuYWJsZWQgb24gdGhlIHN3aXRjaC4gSW4KKwkJICogdGhhdCBjYXNlIHdlIHdpbGwgcHV0IHRoZSB2cG9ydCBpbiBvZmZsaW5lIHN0YXRlLiBIb3dldmVyLAorCQkgKiB0aGUgbGluayBjYW4gZ28gZG93biBhbmQgY2F1c2UgdGhlIHRoaXMgZXZlbnQgdG8gYmUgc2VudCB3aGVuCisJCSAqIHdlIGFyZSBhbHJlYWR5IG9mZmxpbmUuIElnbm9yZSBpdC4KKwkJICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogRkRJU0MgaXMgc2VudCBhbmQgYXdhaXRpbmcgcmVwbHkgZnJvbSBmYWJyaWMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Zwb3J0X3NtX2ZkaXNjKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkgICAgICAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBfX3Zwb3J0X3B3d24odnBvcnQpKTsKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fbG9nbyk7CisJCWJmYV9scHNfZGlzY2FyZCh2cG9ydC0+bHBzKTsKKwkJYmZhX2Zjc192cG9ydF9kb19sb2dvKHZwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fT0ZGTElORToKKwkJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV9vZmZsaW5lKTsKKwkJYmZhX2xwc19kaXNjYXJkKHZwb3J0LT5scHMpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9SU1BfT0s6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fb25saW5lKTsKKwkJYmZhX2Zjc19wb3J0X29ubGluZSgmdnBvcnQtPmxwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0VSUk9SOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2ZkaXNjX3JldHJ5KTsKKwkJYmZhX3RpbWVyX3N0YXJ0KF9fdnBvcnRfYmZhKHZwb3J0KSwgJnZwb3J0LT50aW1lciwKKwkJCQliZmFfZmNzX3Zwb3J0X3RpbWVvdXQsIHZwb3J0LAorCQkJCUJGQV9GQ1NfUkVUUllfVElNRU9VVCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9GQUlMRUQ6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fb2ZmbGluZSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9EVVBfV1dOOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2Vycm9yKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworLyoqCisgKiBGRElTQyBhdHRlbXB0IGZhaWxlZCAtIGEgdGltZXIgaXMgYWN0aXZlIHRvIHJldHJ5IEZESVNDLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc192cG9ydF9zbV9mZGlzY19yZXRyeShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCSAgICAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBfX3Zwb3J0X3B3d24odnBvcnQpKTsKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9ERUxFVEU6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fY2xlYW51cCk7CisJCWJmYV90aW1lcl9zdG9wKCZ2cG9ydC0+dGltZXIpOworCQliZmFfZmNzX3BvcnRfZGVsZXRlKCZ2cG9ydC0+bHBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX29mZmxpbmUpOworCQliZmFfdGltZXJfc3RvcCgmdnBvcnQtPnRpbWVyKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fVElNRU9VVDoKKwkJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV9mZGlzYyk7CisJCXZwb3J0LT52cG9ydF9zdGF0cy5mZGlzY19yZXRyaWVzKys7CisJCXZwb3J0LT5mZGlzY19yZXRyaWVzKys7CisJCWJmYV9mY3NfdnBvcnRfZG9fZmRpc2ModnBvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9hc3NlcnQoMCk7CisJfQorfQorCisvKioKKyAqIFZwb3J0IGlzIG9ubGluZSAoRkRJU0MgaXMgY29tcGxldGUpLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc192cG9ydF9zbV9vbmxpbmUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQllbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIF9fdnBvcnRfcHd3bih2cG9ydCkpOworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX0RFTEVURToKKwkJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV9kZWxldGluZyk7CisJCWJmYV9mY3NfcG9ydF9kZWxldGUoJnZwb3J0LT5scG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fb2ZmbGluZSk7CisJCWJmYV9scHNfZGlzY2FyZCh2cG9ydC0+bHBzKTsKKwkJYmZhX2Zjc19wb3J0X29mZmxpbmUoJnZwb3J0LT5scG9ydCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogVnBvcnQgaXMgYmVpbmcgZGVsZXRlZCAtIGF3YWl0aW5nIGxwb3J0IGRlbGV0ZSBjb21wbGV0aW9uIHRvIHNlbmQKKyAqIExPR08gdG8gZmFicmljLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc192cG9ydF9zbV9kZWxldGluZyhzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCSAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBfX3Zwb3J0X3B3d24odnBvcnQpKTsKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9ERUxFVEU6CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX0RFTENPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fbG9nbyk7CisJCWJmYV9mY3NfdnBvcnRfZG9fbG9nbyh2cG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX09GRkxJTkU6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fY2xlYW51cCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogRXJyb3IgU3RhdGUuCisgKiBUaGlzIHN0YXRlIHdpbGwgYmUgc2V0IHdoZW4gdGhlIFZwb3J0IENyZWF0aW9uIGZhaWxzIGR1ZSB0byBlcnJvcnMgbGlrZQorICogRHVwIFdXTi4gSW4gdGhpcyBzdGF0ZSBvbmx5IG9wZXJhdGlvbiBhbGxvd2VkIGlzIGEgVnBvcnQgRGVsZXRlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc192cG9ydF9zbV9lcnJvcihzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJICAgICAgIGVudW0gYmZhX2Zjc192cG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgX192cG9ydF9wd3duKHZwb3J0KSk7CisJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fREVMRVRFOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9mY3NfdnBvcnRfZnJlZSh2cG9ydCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIGV2ZW50KTsKKwl9Cit9CisKKy8qKgorICogTHBvcnQgY2xlYW51cCBpcyBpbiBwcm9ncmVzcyBzaW5jZSB2cG9ydCBpcyBiZWluZyBkZWxldGVkLiBGYWJyaWMgaXMKKyAqIG9mZmxpbmUsIHNvIG5vIExPR08gaXMgbmVlZGVkIHRvIGNvbXBsZXRlIHZwb3J0IGRlbGV0aW9uLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc192cG9ydF9zbV9jbGVhbnVwKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJIGVudW0gYmZhX2Zjc192cG9ydF9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgX192cG9ydF9wd3duKHZwb3J0KSk7CisJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fREVMQ09NUDoKKwkJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV91bmluaXQpOworCQliZmFfZmNzX3Zwb3J0X2ZyZWUodnBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9ERUxFVEU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX2Fzc2VydCgwKTsKKwl9Cit9CisKKy8qKgorICogTE9HTyBpcyBzZW50IHRvIGZhYnJpYy4gVnBvcnQgZGVsZXRlIGlzIGluIHByb2dyZXNzLiBMcG9ydCBkZWxldGUgY2xlYW51cAorICogaXMgZG9uZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfc21fbG9nbyhzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJICAgICAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBfX3Zwb3J0X3B3d24odnBvcnQpKTsKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9PRkZMSU5FOgorCQliZmFfbHBzX2Rpc2NhcmQodnBvcnQtPmxwcyk7CisJCS8qCisJCSAqICEhISBmYWxsIHRocm91Z2ggISEhCisJCSAqLworCisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9PSzoKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0VSUk9SOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX3VuaW5pdCk7CisJCWJmYV9mY3NfdnBvcnRfZnJlZSh2cG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX0RFTEVURToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfYXNzZXJ0KDApOworCX0KK30KKworCisKKy8qKgorICogIGZjc192cG9ydF9wcml2YXRlIEZDUyB2aXJ0dWFsIHBvcnQgcHJpdmF0ZSBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIFNlbmQgQUVOIG5vdGlmaWNhdGlvbgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc192cG9ydF9hZW5fcG9zdChiZmFfZmNzX2xwb3J0X3QgKnBvcnQsIGVudW0gYmZhX2xwb3J0X2Flbl9ldmVudCBldmVudCkKK3sKKwl1bmlvbiBiZmFfYWVuX2RhdGFfdSBhZW5fZGF0YTsKKwlzdHJ1Y3QgYmZhX2xvZ19tb2RfcyAqbG9nbW9kID0gcG9ydC0+ZmNzLT5sb2dtOworCWVudW0gYmZhX3BvcnRfcm9sZSByb2xlID0gcG9ydC0+cG9ydF9jZmcucm9sZXM7CisJd3duX3QgICAgICAgICAgIGxwd3duID0gYmZhX2Zjc19wb3J0X2dldF9wd3duKHBvcnQpOworCWNoYXIgICAgICAgICAgICBscHd3bl9wdHJbQkZBX1NUUklOR18zMl07CisJY2hhciAgICAgICAgICAgKnJvbGVfc3RyW0JGQV9QT1JUX1JPTEVfRkNQX01BWCAvIDIgKyAxXSA9CisJCXsgIkluaXRpYXRvciIsICJUYXJnZXQiLCAiSVBGQyIgfTsKKworCXd3bjJzdHIobHB3d25fcHRyLCBscHd3bik7CisKKwliZmFfYXNzZXJ0KHJvbGUgPD0gQkZBX1BPUlRfUk9MRV9GQ1BfTUFYKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9MUE9SVF9BRU5fTlBJVl9EVVBfV1dOOgorCQliZmFfbG9nKGxvZ21vZCwgQkZBX0FFTl9MUE9SVF9OUElWX0RVUF9XV04sIGxwd3duX3B0ciwKKwkJCXJvbGVfc3RyW3JvbGUgLyAyXSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0xQT1JUX0FFTl9OUElWX0ZBQlJJQ19NQVg6CisJCWJmYV9sb2cobG9nbW9kLCBCRkFfQUVOX0xQT1JUX05QSVZfRkFCUklDX01BWCwgbHB3d25fcHRyLAorCQkJcm9sZV9zdHJbcm9sZSAvIDJdKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfTFBPUlRfQUVOX05QSVZfVU5LTk9XTjoKKwkJYmZhX2xvZyhsb2dtb2QsIEJGQV9BRU5fTFBPUlRfTlBJVl9VTktOT1dOLCBscHd3bl9wdHIsCisJCQlyb2xlX3N0cltyb2xlIC8gMl0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlhZW5fZGF0YS5scG9ydC52Zl9pZCA9IHBvcnQtPmZhYnJpYy0+dmZfaWQ7CisJYWVuX2RhdGEubHBvcnQucm9sZXMgPSByb2xlOworCWFlbl9kYXRhLmxwb3J0LnBwd3duID0KKwkJYmZhX2Zjc19wb3J0X2dldF9wd3duKGJmYV9mY3NfZ2V0X2Jhc2VfcG9ydChwb3J0LT5mY3MpKTsKKwlhZW5fZGF0YS5scG9ydC5scHd3biA9IGxwd3duOworfQorCisvKioKKyAqIFRoaXMgcm91dGluZSB3aWxsIGJlIGNhbGxlZCB0byBzZW5kIGEgRkRJU0MgY29tbWFuZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfZG9fZmRpc2Moc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpCit7CisJYmZhX2xwc19mZGlzYyh2cG9ydC0+bHBzLCB2cG9ydCwKKwkJICAgICAgYmZhX3Bwb3J0X2dldF9tYXhmcnNpemUoX192cG9ydF9iZmEodnBvcnQpKSwKKwkJICAgICAgX192cG9ydF9wd3duKHZwb3J0KSwgX192cG9ydF9ud3duKHZwb3J0KSk7CisJdnBvcnQtPnZwb3J0X3N0YXRzLmZkaXNjX3NlbnQrKzsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfZmRpc2NfcmVqZWN0ZWQoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpCit7CisJdTggICAgICAgICBsc3JqdF9yc24gPSBiZmFfbHBzX2dldF9sc3JqdF9yc24odnBvcnQtPmxwcyk7CisJdTggICAgICAgICBsc3JqdF9leHBsID0gYmZhX2xwc19nZXRfbHNyanRfZXhwbCh2cG9ydC0+bHBzKTsKKworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBsc3JqdF9yc24pOworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBsc3JqdF9leHBsKTsKKworCS8qCisJICogRm9yIGNlcnRhaW4gcmVhc29uIGNvZGVzLCB3ZSBkb24ndCB3YW50IHRvIHJldHJ5LgorCSAqLworCXN3aXRjaCAoYmZhX2xwc19nZXRfbHNyanRfZXhwbCh2cG9ydC0+bHBzKSkgeworCWNhc2UgRkNfTFNfUkpUX0VYUF9JTlZfUE9SVF9OQU1FOgkvKiBieSBicm9jYWRlICovCisJY2FzZSBGQ19MU19SSlRfRVhQX0lOVkFMSURfTlBPUlRfSUQ6CS8qIGJ5IENpc2NvICovCisJCWlmICh2cG9ydC0+ZmRpc2NfcmV0cmllcyA8IEJGQV9GQ1NfVlBPUlRfTUFYX1JFVFJJRVMpCisJCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRVJST1IpOworCQllbHNlIHsKKwkJCWJmYV9mY3NfdnBvcnRfYWVuX3Bvc3QoJnZwb3J0LT5scG9ydCwKKwkJCQkJICAgICAgIEJGQV9MUE9SVF9BRU5fTlBJVl9EVVBfV1dOKTsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9EVVBfV1dOKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRkNfTFNfUkpUX0VYUF9JTlNVRkZfUkVTOgorCQkvKgorCQkgKiBUaGlzIG1lYW5zIG1heCBsb2dpbnMgcGVyIHBvcnQvc3dpdGNoIHNldHRpbmcgb24gdGhlCisJCSAqIHN3aXRjaCB3YXMgZXhjZWVkZWQuCisJCSAqLworCQlpZiAodnBvcnQtPmZkaXNjX3JldHJpZXMgPCBCRkFfRkNTX1ZQT1JUX01BWF9SRVRSSUVTKQorCQkJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0VSUk9SKTsKKwkJZWxzZSB7CisJCQliZmFfZmNzX3Zwb3J0X2Flbl9wb3N0KCZ2cG9ydC0+bHBvcnQsCisJCQkJCSAgICAgICBCRkFfTFBPUlRfQUVOX05QSVZfRkFCUklDX01BWCk7CisJCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRkFJTEVEKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmICh2cG9ydC0+ZmRpc2NfcmV0cmllcyA9PSAwKQkvKiBQcmludCBvbmx5IG9uY2UgKi8KKwkJCWJmYV9mY3NfdnBvcnRfYWVuX3Bvc3QoJnZwb3J0LT5scG9ydCwKKwkJCQkJICAgICAgIEJGQV9MUE9SVF9BRU5fTlBJVl9VTktOT1dOKTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0VSUk9SKTsKKwl9Cit9CisKKy8qKgorICogCUNhbGxlZCB0byBzZW5kIGEgbG9nb3V0IHRvIHRoZSBmYWJyaWMuIFVzZWQgd2hlbiBhIFYtUG9ydCBpcworICogCWRlbGV0ZWQvc3RvcHBlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfZG9fbG9nbyhzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCkKK3sKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgX192cG9ydF9wd3duKHZwb3J0KSk7CisKKwl2cG9ydC0+dnBvcnRfc3RhdHMubG9nb19zZW50Kys7CisJYmZhX2xwc19mZGlzY2xvZ28odnBvcnQtPmxwcyk7Cit9CisKKy8qKgorICogICAgIFRoaXMgcm91dGluZSB3aWxsIGJlIGNhbGxlZCBieSBiZmFfdGltZXIgb24gdGltZXIgdGltZW91dHMuCisgKgorICogCXBhcmFtW2luXSAJdnBvcnQgCQktIHBvaW50ZXIgdG8gYmZhX2Zjc192cG9ydF90LgorICogCXBhcmFtW291dF0JdnBvcnRfc3RhdHVzIAktIHBvaW50ZXIgdG8gcmV0dXJuIHZwb3J0IHN0YXR1cyBpbgorICoKKyAqIAlyZXR1cm4KKyAqIAkJdm9pZAorICoKKyogCVNwZWNpYWwgQ29uc2lkZXJhdGlvbnM6CisgKgorICogCW5vdGUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfdGltZW91dCh2b2lkICp2cG9ydF9hcmcpCit7CisJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqKXZwb3J0X2FyZzsKKworCXZwb3J0LT52cG9ydF9zdGF0cy5mZGlzY190aW1lb3V0cysrOworCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Zjc192cG9ydF9mcmVlKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KQoreworCWJmYV9mY3NfZmFicmljX2RlbHZwb3J0KF9fdnBvcnRfZmFicmljKHZwb3J0KSwgdnBvcnQpOworCWJmYV9mY2JfdnBvcnRfZGVsZXRlKHZwb3J0LT52cG9ydF9kcnYpOworCWJmYV9scHNfZGVsZXRlKHZwb3J0LT5scHMpOworfQorCisKKworLyoqCisgKiAgZmNzX3Zwb3J0X3B1YmxpYyBGQ1MgdmlydHVhbCBwb3J0IHB1YmxpYyBpbnRlcmZhY2VzCisgKi8KKworLyoqCisgKiBPbmxpbmUgbm90aWZpY2F0aW9uIGZyb20gZmFicmljIFNNLgorICovCit2b2lkCitiZmFfZmNzX3Zwb3J0X29ubGluZShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCkKK3sKKwl2cG9ydC0+dnBvcnRfc3RhdHMuZmFiX29ubGluZSsrOworCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX09OTElORSk7Cit9CisKKy8qKgorICogT2ZmbGluZSBub3RpZmljYXRpb24gZnJvbSBmYWJyaWMgU00uCisgKi8KK3ZvaWQKK2JmYV9mY3NfdnBvcnRfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCkKK3sKKwl2cG9ydC0+dnBvcnRfc3RhdHMuZmFiX29mZmxpbmUrKzsKKwliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9PRkZMSU5FKTsKK30KKworLyoqCisgKiBDbGVhbnVwIG5vdGlmaWNhdGlvbiBmcm9tIGZhYnJpYyBTTSBvbiBsaW5rIHRpbWVyIGV4cGlyeS4KKyAqLwordm9pZAorYmZhX2Zjc192cG9ydF9jbGVhbnVwKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KQoreworCXZwb3J0LT52cG9ydF9zdGF0cy5mYWJfY2xlYW51cCsrOworfQorCisvKioKKyAqIERlbGV0ZSBjb21wbGV0aW9uIGNhbGxiYWNrIGZyb20gYXNzb2NpYXRlZCBscG9ydAorICovCit2b2lkCitiZmFfZmNzX3Zwb3J0X2RlbGV0ZV9jb21wKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KQoreworCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX0RFTENPTVApOworfQorCisvKioKKyAqICAgTW9kdWxlIGluaXRpYWxpemF0aW9uCisgKi8KK3ZvaWQKK2JmYV9mY3NfdnBvcnRfbW9kaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCit7Cit9CisKKy8qKgorICogICBNb2R1bGUgY2xlYW51cAorICovCit2b2lkCitiZmFfZmNzX3Zwb3J0X21vZGV4aXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCWJmYV9mY3NfbW9kZXhpdF9jb21wKGZjcyk7Cit9CisKK3UzMgorYmZhX2Zjc192cG9ydF9nZXRfbWF4KHN0cnVjdCBiZmFfZmNzX3MgKmZjcykKK3sKKwlzdHJ1Y3QgYmZhX2lvY19hdHRyX3MgaW9jX2F0dHI7CisKKwliZmFfZ2V0X2F0dHIoZmNzLT5iZmEsICZpb2NfYXR0cik7CisKKwlpZiAoaW9jX2F0dHIucGNpX2F0dHIuZGV2aWNlX2lkID09IEJGQV9QQ0lfREVWSUNFX0lEX0NUKQorCQlyZXR1cm4gKEJGQV9GQ1NfTUFYX1ZQT1JUU19TVVBQX0NUKTsKKwllbHNlCisJCXJldHVybiAoQkZBX0ZDU19NQVhfVlBPUlRTX1NVUFBfQ0IpOworfQorCisKKworLyoqCisgKiAgZmNzX3Zwb3J0X2FwaSBWaXJ0dWFsIHBvcnQgQVBJCisgKi8KKworLyoqCisgKiAgCVVzZSB0aGlzIGZ1bmN0aW9uIHRvIGluc3RhbnRpYXRlIGEgbmV3IEZDUyB2cG9ydCBvYmplY3QuIFRoaXMKKyAqIAlmdW5jdGlvbiB3aWxsIG5vdCB0cmlnZ2VyIGFueSBIVyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh3aGljaCB3aWxsIGJlCisgKiAJZG9uZSBpbiB2cG9ydF9zdGFydCgpIGNhbGwpCisgKgorICogCXBhcmFtW2luXSB2cG9ydAktIAlwb2ludGVyIHRvIGJmYV9mY3NfdnBvcnRfdC4gVGhpcyBzcGFjZQorICogCQkJCQluZWVkcyB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci4KKyAqIAlwYXJhbVtpbl0gZmNzIAkJLSAJRkNTIGluc3RhbmNlCisgKiAJcGFyYW1baW5dIHZwb3J0X2NmZwktIAl2cG9ydCBjb25maWd1cmF0aW9uCisgKiAJcGFyYW1baW5dIHZmX2lkICAgIAktIAlWRl9JRCBpZiB2cG9ydCBpcyBjcmVhdGVkIHdpdGhpbiBhIFZGLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIAkJRkNfVkZfSURfTlVMTCB0byBzcGVjaWZ5IGJhc2UgZmFicmljLgorICogCXBhcmFtW2luXSB2cG9ydF9kcnYgCS0gCU9wYXF1ZSBoYW5kbGUgYmFjayB0byB0aGUgZHJpdmVyJ3MgdnBvcnQKKyAqIAkJCQkJc3RydWN0dXJlCisgKgorICogCXJldHZhbCBCRkFfU1RBVFVTX09LIC0gb24gc3VjY2Vzcy4KKyAqIAlyZXR2YWwgQkZBX1NUQVRVU19GQUlMRUQgLSBvbiBmYWlsdXJlLgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfdnBvcnRfY3JlYXRlKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LCBzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsCisJCSAgICAgdTE2IHZmX2lkLCBzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgKnZwb3J0X2NmZywKKwkJICAgICBzdHJ1Y3QgYmZhZF92cG9ydF9zICp2cG9ydF9kcnYpCit7CisJaWYgKHZwb3J0X2NmZy0+cHd3biA9PSAwKQorCQlyZXR1cm4gKEJGQV9TVEFUVVNfSU5WQUxJRF9XV04pOworCisJaWYgKGJmYV9mY3NfcG9ydF9nZXRfcHd3bigmZmNzLT5mYWJyaWMuYnBvcnQpID09IHZwb3J0X2NmZy0+cHd3bikKKwkJcmV0dXJuIEJGQV9TVEFUVVNfVlBPUlRfV1dOX0JQOworCisJaWYgKGJmYV9mY3NfdnBvcnRfbG9va3VwKGZjcywgdmZfaWQsIHZwb3J0X2NmZy0+cHd3bikgIT0gTlVMTCkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfVlBPUlRfRVhJU1RTOworCisJaWYgKGJmYV9mY3NfZmFicmljX3Zwb3J0X2NvdW50KCZmY3MtPmZhYnJpYykgPT0KKwkgICAgYmZhX2Zjc192cG9ydF9nZXRfbWF4KGZjcykpCisJCXJldHVybiBCRkFfU1RBVFVTX1ZQT1JUX01BWDsKKworCXZwb3J0LT5scHMgPSBiZmFfbHBzX2FsbG9jKGZjcy0+YmZhKTsKKwlpZiAoIXZwb3J0LT5scHMpCisJCXJldHVybiBCRkFfU1RBVFVTX1ZQT1JUX01BWDsKKworCXZwb3J0LT52cG9ydF9kcnYgPSB2cG9ydF9kcnY7CisJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV91bmluaXQpOworCisJYmZhX2Zjc19scG9ydF9pbml0KCZ2cG9ydC0+bHBvcnQsIGZjcywgdmZfaWQsIHZwb3J0X2NmZywgdnBvcnQpOworCisJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fQ1JFQVRFKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKioKKyAqICAJVXNlIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB0aGUgdnBvcnQuCisgKgorICogIEBwYXJhbVtpbl0gdnBvcnQgLSBwb2ludGVyIHRvIGJmYV9mY3NfdnBvcnRfdC4KKyAqCisgKiAgQHJldHVybnMgTm9uZQorICovCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfdnBvcnRfc3RhcnQoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fU1RBUlQpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogIAlVc2UgdGhpcyBmdW5jdGlvbiBxdWllc2UgdGhlIHZwb3J0IG9iamVjdC4gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybgorICogCWltbWVkaWF0ZWx5LCB3aGVuIHRoZSB2cG9ydCBpcyBhY3R1YWxseSBzdG9wcGVkLCB0aGUKKyAqIAliZmFfZHJ2X3Zwb3J0X3N0b3BfY2IoKSB3aWxsIGJlIGNhbGxlZC4KKyAqCisgKiAJcGFyYW1baW5dIHZwb3J0IC0gcG9pbnRlciB0byBiZmFfZmNzX3Zwb3J0X3QuCisgKgorICogCXJldHVybiBOb25lCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2Zjc192cG9ydF9zdG9wKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KQoreworCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX1NUT1ApOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qKgorICogIAlVc2UgdGhpcyBmdW5jdGlvbiB0byBkZWxldGUgYSB2cG9ydCBvYmplY3QuIEZhYnJpYyBvYmplY3Qgc2hvdWxkCisgKiAJCWJlIHN0b3BwZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FsbC4KKyAqCisgKiAJcGFyYW1baW5dIHZwb3J0IC0gcG9pbnRlciB0byBiZmFfZmNzX3Zwb3J0X3QuCisgKgorICogCXJldHVybiAgICAgTm9uZQorICovCitiZmFfc3RhdHVzX3QKK2JmYV9mY3NfdnBvcnRfZGVsZXRlKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KQoreworCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX0RFTEVURSk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoqCisgKiAgCVVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB2cG9ydCdzIGN1cnJlbnQgc3RhdHVzIGluZm8uCisgKgorICogCXBhcmFtW2luXSAJdnBvcnQgCQlwb2ludGVyIHRvIGJmYV9mY3NfdnBvcnRfdC4KKyAqIAlwYXJhbVtvdXRdCWF0dHIgCQlwb2ludGVyIHRvIHJldHVybiB2cG9ydCBhdHRyaWJ1dGVzCisgKgorICogCXJldHVybiBOb25lCisgKi8KK3ZvaWQKK2JmYV9mY3NfdnBvcnRfZ2V0X2F0dHIoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCSAgICAgICBzdHJ1Y3QgYmZhX3Zwb3J0X2F0dHJfcyAqYXR0cikKK3sKKwlpZiAodnBvcnQgPT0gTlVMTCB8fCBhdHRyID09IE5VTEwpCisJCXJldHVybjsKKworCWJmYV9vc19tZW1zZXQoYXR0ciwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfdnBvcnRfYXR0cl9zKSk7CisKKwliZmFfZmNzX3BvcnRfZ2V0X2F0dHIoJnZwb3J0LT5scG9ydCwgJmF0dHItPnBvcnRfYXR0cik7CisJYXR0ci0+dnBvcnRfc3RhdGUgPSBiZmFfc21fdG9fc3RhdGUodnBvcnRfc21fdGFibGUsIHZwb3J0LT5zbSk7Cit9CisKKy8qKgorICogIAlVc2UgdGhpcyBmdW5jdGlvbiB0byBnZXQgdnBvcnQncyBzdGF0aXN0aWNzLgorICoKKyAqIAlwYXJhbVtpbl0gCXZwb3J0IAkJcG9pbnRlciB0byBiZmFfZmNzX3Zwb3J0X3QuCisgKiAJcGFyYW1bb3V0XQlzdGF0cwkJcG9pbnRlciB0byByZXR1cm4gdnBvcnQgc3RhdGlzdGljcyBpbgorICoKKyAqIAlyZXR1cm4gTm9uZQorICovCit2b2lkCitiZmFfZmNzX3Zwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCwKKwkJCXN0cnVjdCBiZmFfdnBvcnRfc3RhdHNfcyAqc3RhdHMpCit7CisJKnN0YXRzID0gdnBvcnQtPnZwb3J0X3N0YXRzOworfQorCisvKioKKyAqICAJVXNlIHRoaXMgZnVuY3Rpb24gdG8gY2xlYXIgdnBvcnQncyBzdGF0aXN0aWNzLgorICoKKyAqIAlwYXJhbVtpbl0gCXZwb3J0IAkJcG9pbnRlciB0byBiZmFfZmNzX3Zwb3J0X3QuCisgKgorICogCXJldHVybiBOb25lCisgKi8KK3ZvaWQKK2JmYV9mY3NfdnBvcnRfY2xyX3N0YXRzKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0KQoreworCWJmYV9vc19tZW1zZXQoJnZwb3J0LT52cG9ydF9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfdnBvcnRfc3RhdHNfcykpOworfQorCisvKioKKyAqICAgICAgTG9va3VwIGEgdmlydHVhbCBwb3J0LiBFeGNsdWRlcyBiYXNlIHBvcnQgZnJvbSBsb29rdXAuCisgKi8KK3N0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKgorYmZhX2Zjc192cG9ydF9sb29rdXAoc3RydWN0IGJmYV9mY3NfcyAqZmNzLCB1MTYgdmZfaWQsIHd3bl90IHZwd3duKQoreworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0OworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWM7CisKKwliZmFfdHJjKGZjcywgdmZfaWQpOworCWJmYV90cmMoZmNzLCB2cHd3bik7CisKKwlmYWJyaWMgPSBiZmFfZmNzX3ZmX2xvb2t1cChmY3MsIHZmX2lkKTsKKwlpZiAoIWZhYnJpYykgeworCQliZmFfdHJjKGZjcywgdmZfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl2cG9ydCA9IGJmYV9mY3NfZmFicmljX3Zwb3J0X2xvb2t1cChmYWJyaWMsIHZwd3duKTsKKwlyZXR1cm4gdnBvcnQ7Cit9CisKKy8qKgorICogRkRJU0MgUmVzcG9uc2UKKyAqLwordm9pZAorYmZhX2NiX2xwc19mZGlzY19jb21wKHZvaWQgKmJmYWQsIHZvaWQgKnVhcmcsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQgPSB1YXJnOworCisJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIF9fdnBvcnRfcHd3bih2cG9ydCkpOworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBzdGF0dXMpOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEJGQV9TVEFUVVNfT0s6CisJCS8qCisJCSAqIEluaXRpYWxpYXplIHRoZSBWLVBvcnQgZmllbGRzCisJCSAqLworCQlfX3Zwb3J0X2ZjaWQodnBvcnQpID0gYmZhX2xwc19nZXRfcGlkKHZwb3J0LT5scHMpOworCQl2cG9ydC0+dnBvcnRfc3RhdHMuZmRpc2NfYWNjZXB0cysrOworCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfT0spOworCQlicmVhazsKKworCWNhc2UgQkZBX1NUQVRVU19JTlZBTElEX01BQzoKKwkJLyoKKwkJICogT25seSBmb3IgQ05BCisJCSAqLworCQl2cG9ydC0+dnBvcnRfc3RhdHMuZmRpc2NfYWNjX2JhZCsrOworCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRVJST1IpOworCisJCWJyZWFrOworCisJY2FzZSBCRkFfU1RBVFVTX0VQUk9UT0NPTDoKKwkJc3dpdGNoIChiZmFfbHBzX2dldF9leHRzdGF0dXModnBvcnQtPmxwcykpIHsKKwkJY2FzZSBCRkFfRVBST1RPX0JBRF9BQ0NFUFQ6CisJCQl2cG9ydC0+dnBvcnRfc3RhdHMuZmRpc2NfYWNjX2JhZCsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBCRkFfRVBST1RPX1VOS05PV05fUlNQOgorCQkJdnBvcnQtPnZwb3J0X3N0YXRzLmZkaXNjX3Vua25vd25fcnNwKys7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRVJST1IpOworCQlicmVhazsKKworCWNhc2UgQkZBX1NUQVRVU19GQUJSSUNfUkpUOgorCQl2cG9ydC0+dnBvcnRfc3RhdHMuZmRpc2NfcmVqZWN0cysrOworCQliZmFfZmNzX3Zwb3J0X2ZkaXNjX3JlamVjdGVkKHZwb3J0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2cG9ydC0+dnBvcnRfc3RhdHMuZmRpc2NfcnNwX2VycisrOworCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRVJST1IpOworCX0KK30KKworLyoqCisgKiBMT0dPIHJlc3BvbnNlCisgKi8KK3ZvaWQKK2JmYV9jYl9scHNfZmRpc2Nsb2dvX2NvbXAodm9pZCAqYmZhZCwgdm9pZCAqdWFyZykKK3sKKwlzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCA9IHVhcmc7CisJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fUlNQX09LKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmkuaCBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaS5oCmluZGV4IGQ3NTc2ZjIuLjVlZGRlMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaS5oCkBAIC0xMDAsNiArMTAwLDggQEAKICNkZWZpbmUgQ1RYX09GRlNFVCAJCQkweDEwMDAwCiAjZGVmaW5lIE1BWF9DSURfQ05UCQkJMHg0MDAwCiAKKyNkZWZpbmUgQk5YMklfNTcwWF9QQUdFX1NJWkVfREVGQVVMVAk0MDk2CisKIC8qIDU3MDkgY29udGV4dCByZWdpc3RlcnMgKi8KICNkZWZpbmUgQk5YMl9NUV9DT05GSUcyCQkJMHgwMDAwM2QwMAogI2RlZmluZSBCTlgyX01RX0NPTkZJRzJfQ09OVF9TWgkJKDB4N0w8PDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMKaW5kZXggNDFlMWIwZS4uNWM4ZDc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYwpAQCAtMjM4Niw3ICsyMzg2LDcgQEAKIAkJY3R4X3N6ID0gKGNvbmZpZzIgJiBCTlgyX01RX0NPTkZJRzJfQ09OVF9TWikgPj4gMzsKIAkJaWYgKGN0eF9zeikKIAkJCXJlZ19vZmYgPSBDVFhfT0ZGU0VUICsgTUFYX0NJRF9DTlQgKiBNQl9LRVJORUxfQ1RYX1NJWkUKLQkJCQkgICsgUEFHRV9TSVpFICoKKwkJCQkgICsgQk5YMklfNTcwWF9QQUdFX1NJWkVfREVGQVVMVCAqCiAJCQkJICAoKChjaWRfbnVtIC0gZmlyc3RfbDRsNSkgLyBjdHhfc3opICsgMjU2KTsKIAkJZWxzZQogCQkJcmVnX29mZiA9IENUWF9PRkZTRVQgKyAoTUJfS0VSTkVMX0NUWF9TSVpFICogY2lkX251bSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCmluZGV4IDlhN2JhNzEuLmNhZmI4ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCkBAIC0xMjQzLDcgKzEyNDMsNyBAQAogCQljbWRzX21heCA9IEJOWDJJX1NRX1dRRVNfTUlOOwogCiAJY2xzX3Nlc3Npb24gPSBpc2NzaV9zZXNzaW9uX3NldHVwKCZibngyaV9pc2NzaV90cmFuc3BvcnQsIHNob3N0LAotCQkJCQkgIGNtZHNfbWF4LCBzaXplb2Yoc3RydWN0IGJueDJpX2NtZCksCisJCQkJCSAgY21kc19tYXgsIDAsIHNpemVvZihzdHJ1Y3QgYm54MmlfY21kKSwKIAkJCQkJICBpbml0aWFsX2NtZHNuLCBJU0NTSV9NQVhfVEFSR0VUKTsKIAlpZiAoIWNsc19zZXNzaW9uKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9pc2NzaS5jCmluZGV4IGMzOTlmNDguLjI2MzFiZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfaXNjc2kuYwpAQCAtNDIyLDcgKzQyMiw3IEBACiAJQlVHX09OKGhiYSAhPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpKTsKIAogCWNsc19zZXNzaW9uID0gaXNjc2lfc2Vzc2lvbl9zZXR1cCgmY3hnYjNpX2lzY3NpX3RyYW5zcG9ydCwgc2hvc3QsCi0JCQkJCSAgY21kc19tYXgsCisJCQkJCSAgY21kc19tYXgsIDAsCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpc2NzaV90Y3BfdGFzaykgKwogCQkJCQkgIHNpemVvZihzdHJ1Y3QgY3hnYjNpX3Rhc2tfZGF0YSksCiAJCQkJCSAgaW5pdGlhbF9jbWRzbiwgSVNDU0lfTUFYX1RBUkdFVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKaW5kZXggMTFjODkzMS4uMjY4MTg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYwpAQCAtNTAwLDggKzUwMCw2IEBACiAJaWYgKCFyZXQpCiAJCWdvdG8gZG9uZTsKIAotCWVyciA9IFNDU0lfREhfT0s7Ci0KIAlzd2l0Y2ggKHNlbnNlX2hkci5zZW5zZV9rZXkpIHsKIAljYXNlIE5PX1NFTlNFOgogCWNhc2UgQUJPUlRFRF9DT01NQU5EOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdF9pMm8uYyBiL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKaW5kZXggYjZhZjYzYy4uNDk2NzY0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RwdF9pMm8uYworKysgYi9kcml2ZXJzL3Njc2kvZHB0X2kyby5jCkBAIC0xOTE4LDYgKzE5MTgsMTAgQEAKIAkJfQogCQlzaXplID0gc2l6ZT4+MTY7CiAJCXNpemUgKj0gNDsKKwkJaWYgKHNpemUgPiBNQVhfTUVTU0FHRV9TSVpFKSB7CisJCQlyY29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KIAkJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCiAJCWlmIChjb3B5X2Zyb21fdXNlciAobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKIAkJCXJjb2RlID0gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHRpb3AuYyBiL2RyaXZlcnMvc2NzaS9ocHRpb3AuYwppbmRleCBjNTk2YWI1Li5hMGU3ZTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaHB0aW9wLmMKKysrIGIvZHJpdmVycy9zY3NpL2hwdGlvcC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIEhpZ2hQb2ludCBSUjN4eHgvNHh4eCBjb250cm9sbGVyIGRyaXZlciBmb3IgTGludXgKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEhpZ2hQb2ludCBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEhpZ2hQb2ludCBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQxLDcgKzQxLDcgQEAKIAogc3RhdGljIGNoYXIgZHJpdmVyX25hbWVbXSA9ICJocHRpb3AiOwogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVfbG9uZ1tdID0gIlJvY2tldFJBSUQgM3h4eC80eHh4IENvbnRyb2xsZXIgZHJpdmVyIjsKLXN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl92ZXJbXSA9ICJ2MS4zICgwNzEyMDMpIjsKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl92ZXJbXSA9ICJ2MS42ICgwOTA5MTApIjsKIAogc3RhdGljIGludCBpb3Bfc2VuZF9zeW5jX21zZyhzdHJ1Y3QgaHB0aW9wX2hiYSAqaGJhLCB1MzIgbXNnLCB1MzIgbWlsbGlzZWMpOwogc3RhdGljIHZvaWQgaHB0aW9wX2ZpbmlzaF9zY3NpX3JlcShzdHJ1Y3QgaHB0aW9wX2hiYSAqaGJhLCB1MzIgdGFnLApAQCAtMTE1LDkgKzExNSwxMyBAQAogc3RhdGljIGludCBpb3BfaW50cl9pdGwoc3RydWN0IGhwdGlvcF9oYmEgKmhiYSkKIHsKIAlzdHJ1Y3QgaHB0X2lvcG11X2l0bCBfX2lvbWVtICppb3AgPSBoYmEtPnUuaXRsLmlvcDsKKwl2b2lkIF9faW9tZW0gKnBseCA9IGhiYS0+dS5pdGwucGx4OwogCXUzMiBzdGF0dXM7CiAJaW50IHJldCA9IDA7CiAKKwlpZiAocGx4ICYmIHJlYWRsKHBseCArIDB4MTFDNUMpICYgMHhmKQorCQl3cml0ZWwoMSwgcGx4ICsgMHgxMUM2MCk7CisKIAlzdGF0dXMgPSByZWFkbCgmaW9wLT5vdXRib3VuZF9pbnRzdGF0dXMpOwogCiAJaWYgKHN0YXR1cyAmIElPUE1VX09VVEJPVU5EX0lOVF9NU0cwKSB7CkBAIC00NjAsMTUgKzQ2NCwyNSBAQAogCiBzdGF0aWMgaW50IGhwdGlvcF9tYXBfcGNpX2Jhcl9pdGwoc3RydWN0IGhwdGlvcF9oYmEgKmhiYSkKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gaGJhLT5wY2lkZXY7CiAJaGJhLT51Lml0bC5pb3AgPSBocHRpb3BfbWFwX3BjaV9iYXIoaGJhLCAwKTsKLQlpZiAoaGJhLT51Lml0bC5pb3ApCi0JCXJldHVybiAwOwotCWVsc2UKKwlpZiAoaGJhLT51Lml0bC5pb3AgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOworCWlmICgocGNpZGV2LT5kZXZpY2UgJiAweGZmMDApID09IDB4NDQwMCkgeworCQloYmEtPnUuaXRsLnBseCA9IGhiYS0+dS5pdGwuaW9wOworCQloYmEtPnUuaXRsLmlvcCA9IGhwdGlvcF9tYXBfcGNpX2JhcihoYmEsIDIpOworCQlpZiAoaGJhLT51Lml0bC5pb3AgPT0gTlVMTCkgeworCQkJaW91bm1hcChoYmEtPnUuaXRsLnBseCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGhwdGlvcF91bm1hcF9wY2lfYmFyX2l0bChzdHJ1Y3QgaHB0aW9wX2hiYSAqaGJhKQogeworCWlmIChoYmEtPnUuaXRsLnBseCkKKwkJaW91bm1hcChoYmEtPnUuaXRsLnBseCk7CiAJaW91bm1hcChoYmEtPnUuaXRsLmlvcCk7CiB9CiAKQEAgLTEyMzksMjIgKzEyNTMsMjMgQEAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBocHRpb3BfaWRfdGFibGVbXSA9IHsKIAl7IFBDSV9WREVWSUNFKFRUSSwgMHgzMjIwKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAogCXsgUENJX1ZERVZJQ0UoVFRJLCAweDMzMjApLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9pdGxfb3BzIH0sCi0JeyBQQ0lfVkRFVklDRShUVEksIDB4MzUyMCksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX2l0bF9vcHMgfSwKLQl7IFBDSV9WREVWSUNFKFRUSSwgMHg0MzIwKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAorCXsgUENJX1ZERVZJQ0UoVFRJLCAweDM0MTApLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9pdGxfb3BzIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIDB4MzUxMCksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX2l0bF9vcHMgfSwKIAl7IFBDSV9WREVWSUNFKFRUSSwgMHgzNTExKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAorCXsgUENJX1ZERVZJQ0UoVFRJLCAweDM1MjApLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9pdGxfb3BzIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIDB4MzUyMSksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX2l0bF9vcHMgfSwKIAl7IFBDSV9WREVWSUNFKFRUSSwgMHgzNTIyKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAotCXsgUENJX1ZERVZJQ0UoVFRJLCAweDM0MTApLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9pdGxfb3BzIH0sCi0JeyBQQ0lfVkRFVklDRShUVEksIDB4MzU0MCksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX2l0bF9vcHMgfSwKIAl7IFBDSV9WREVWSUNFKFRUSSwgMHgzNTMwKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAorCXsgUENJX1ZERVZJQ0UoVFRJLCAweDM1NDApLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9pdGxfb3BzIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIDB4MzU2MCksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX2l0bF9vcHMgfSwKLQl7IFBDSV9WREVWSUNFKFRUSSwgMHg0MzIyKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAotCXsgUENJX1ZERVZJQ0UoVFRJLCAweDQzMjEpLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9pdGxfb3BzIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIDB4NDIxMCksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX2l0bF9vcHMgfSwKIAl7IFBDSV9WREVWSUNFKFRUSSwgMHg0MjExKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAogCXsgUENJX1ZERVZJQ0UoVFRJLCAweDQzMTApLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9pdGxfb3BzIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIDB4NDMxMSksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX2l0bF9vcHMgfSwKKwl7IFBDSV9WREVWSUNFKFRUSSwgMHg0MzIwKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAorCXsgUENJX1ZERVZJQ0UoVFRJLCAweDQzMjEpLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9pdGxfb3BzIH0sCisJeyBQQ0lfVkRFVklDRShUVEksIDB4NDMyMiksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX2l0bF9vcHMgfSwKKwl7IFBDSV9WREVWSUNFKFRUSSwgMHg0NDAwKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfaXRsX29wcyB9LAogCXsgUENJX1ZERVZJQ0UoVFRJLCAweDMxMjApLCAoa2VybmVsX3Vsb25nX3QpJmhwdGlvcF9tdl9vcHMgfSwKIAl7IFBDSV9WREVWSUNFKFRUSSwgMHgzMTIyKSwgKGtlcm5lbF91bG9uZ190KSZocHRpb3BfbXZfb3BzIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIDB4MzAyMCksIChrZXJuZWxfdWxvbmdfdCkmaHB0aW9wX212X29wcyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwdGlvcC5oIGIvZHJpdmVycy9zY3NpL2hwdGlvcC5oCmluZGV4IGEwMjg5ZjIuLjBiODcxYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHRpb3AuaAorKysgYi9kcml2ZXJzL3Njc2kvaHB0aW9wLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogSGlnaFBvaW50IFJSM3h4eC80eHh4IGNvbnRyb2xsZXIgZHJpdmVyIGZvciBMaW51eAotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgSGlnaFBvaW50IFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgSGlnaFBvaW50IFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjI4LDYgKzIyOCw3IEBACiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGhwdF9pb3BtdV9pdGwgX19pb21lbSAqaW9wOworCQkJdm9pZCBfX2lvbWVtICpwbHg7CiAJCX0gaXRsOwogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGhwdF9pb3Btdl9yZWdzICpyZWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCmluZGV4IDJiMWI4MzQuLmVkYzQ5Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKQEAgLTgxMSw3ICs4MTEsNyBAQAogCQlnb3RvIGZyZWVfaG9zdDsKIAogCWNsc19zZXNzaW9uID0gaXNjc2lfc2Vzc2lvbl9zZXR1cCgmaXNjc2lfc3dfdGNwX3RyYW5zcG9ydCwgc2hvc3QsCi0JCQkJCSAgY21kc19tYXgsCisJCQkJCSAgY21kc19tYXgsIDAsCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpc2NzaV90Y3BfdGFzaykgKwogCQkJCQkgIHNpemVvZihzdHJ1Y3QgaXNjc2lfc3dfdGNwX2hkcmJ1ZiksCiAJCQkJCSAgaW5pdGlhbF9jbWRzbiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCmluZGV4IDhkYzczYzQuLmYxYTQyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCkBAIC0yNDM2LDcgKzI0MzYsNyBAQAogICovCiBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKgogaXNjc2lfc2Vzc2lvbl9zZXR1cChzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICppc2NzaXQsIHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAotCQkgICAgdWludDE2X3QgY21kc19tYXgsIGludCBjbWRfdGFza19zaXplLAorCQkgICAgdWludDE2X3QgY21kc19tYXgsIGludCBkZF9zaXplLCBpbnQgY21kX3Rhc2tfc2l6ZSwKIAkJICAgIHVpbnQzMl90IGluaXRpYWxfY21kc24sIHVuc2lnbmVkIGludCBpZCkKIHsKIAlzdHJ1Y3QgaXNjc2lfaG9zdCAqaWhvc3QgPSBzaG9zdF9wcml2KHNob3N0KTsKQEAgLTI0ODYsNyArMjQ4Niw4IEBACiAJc2NzaV9jbWRzID0gdG90YWxfY21kcyAtIElTQ1NJX01HTVRfQ01EU19NQVg7CiAKIAljbHNfc2Vzc2lvbiA9IGlzY3NpX2FsbG9jX3Nlc3Npb24oc2hvc3QsIGlzY3NpdCwKLQkJCQkJICBzaXplb2Yoc3RydWN0IGlzY3NpX3Nlc3Npb24pKTsKKwkJCQkJICBzaXplb2Yoc3RydWN0IGlzY3NpX3Nlc3Npb24pICsKKwkJCQkJICBkZF9zaXplKTsKIAlpZiAoIWNsc19zZXNzaW9uKQogCQlnb3RvIGRlY19zZXNzaW9uX2NvdW50OwogCXNlc3Npb24gPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKQEAgLTI1MDMsNiArMjUwNCw3IEBACiAJc2Vzc2lvbi0+bWF4X2NtZHNuID0gaW5pdGlhbF9jbWRzbiArIDE7CiAJc2Vzc2lvbi0+bWF4X3IydCA9IDE7CiAJc2Vzc2lvbi0+dHQgPSBpc2NzaXQ7CisJc2Vzc2lvbi0+ZGRfZGF0YSA9IGNsc19zZXNzaW9uLT5kZF9kYXRhICsgc2l6ZW9mKCpzZXNzaW9uKTsKIAltdXRleF9pbml0KCZzZXNzaW9uLT5laF9tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJnNlc3Npb24tPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCmluZGV4IDYxZDA4OTcuLmM4OGY1OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCkBAIC01Niw4ICs1Niw2IEBACiAJIlNDU0lfUFJPVF9XUklURV9JTlNFUlQiLAogCSJTQ1NJX1BST1RfUkVBRF9QQVNTIiwKIAkiU0NTSV9QUk9UX1dSSVRFX1BBU1MiLAotCSJTQ1NJX1BST1RfUkVBRF9DT05WRVJUIiwKLQkiU0NTSV9QUk9UX1dSSVRFX0NPTlZFUlQiCiB9Owogc3RhdGljIHZvaWQKIGxwZmNfcmVsZWFzZV9zY3NpX2J1Zl9zNChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX3Njc2lfYnVmICpwc2IpOwpAQCAtMTEzMSwxMyArMTEyOSwxMSBAQAogCQkJcmV0X3Byb2YgPSBMUEZDX1BST0ZfQTE7CiAJCQlicmVhazsKIAotCQljYXNlIFNDU0lfUFJPVF9SRUFEX0NPTlZFUlQ6Ci0JCWNhc2UgU0NTSV9QUk9UX1dSSVRFX0NPTlZFUlQ6CisJCWNhc2UgU0NTSV9QUk9UX1JFQURfUEFTUzoKKwkJY2FzZSBTQ1NJX1BST1RfV1JJVEVfUEFTUzoKIAkJCXJldF9wcm9mID0gTFBGQ19QUk9GX0FTVDE7CiAJCQlicmVhazsKIAotCQljYXNlIFNDU0lfUFJPVF9SRUFEX1BBU1M6Ci0JCWNhc2UgU0NTSV9QUk9UX1dSSVRFX1BBU1M6CiAJCWNhc2UgU0NTSV9QUk9UX05PUk1BTDoKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX0VSUiAiQmFkIG9wL2d1YXJkOiVkLyVkIGNvbWJpbmF0aW9uXG4iLApAQCAtMTE1Nyw4ICsxMTUzLDYgQEAKIAkJCXJldF9wcm9mID0gTFBGQ19QUk9GX0MxOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBTQ1NJX1BST1RfUkVBRF9DT05WRVJUOgotCQljYXNlIFNDU0lfUFJPVF9XUklURV9DT05WRVJUOgogCQljYXNlIFNDU0lfUFJPVF9SRUFEX0lOU0VSVDoKIAkJY2FzZSBTQ1NJX1BST1RfV1JJVEVfU1RSSVA6CiAJCWNhc2UgU0NTSV9QUk9UX05PUk1BTDoKQEAgLTEyMDksOCArMTIwMyw3IEBACiAJc3RhdGljIGludCBjbnQ7CiAKIAlpZiAocHJvdGNudCAmJiAob3AgPT0gU0NTSV9QUk9UX1dSSVRFX1NUUklQIHx8Ci0JCQkJb3AgPT0gU0NTSV9QUk9UX1dSSVRFX1BBU1MgfHwKLQkJCQlvcCA9PSBTQ1NJX1BST1RfV1JJVEVfQ09OVkVSVCkpIHsKKwkJCQlvcCA9PSBTQ1NJX1BST1RfV1JJVEVfUEFTUykpIHsKIAogCQljbnQrKzsKIAkJc3B0ID0gcGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2NzaV9wcm90X3NnbGlzdChzYykpKSArCkBAIC0xNTAxLDggKzE0OTQsNiBAQAogCWNhc2UgU0NTSV9QUk9UX1dSSVRFX1NUUklQOgogCWNhc2UgU0NTSV9QUk9UX1JFQURfUEFTUzoKIAljYXNlIFNDU0lfUFJPVF9XUklURV9QQVNTOgotCWNhc2UgU0NTSV9QUk9UX1dSSVRFX0NPTlZFUlQ6Ci0JY2FzZSBTQ1NJX1BST1RfUkVBRF9DT05WRVJUOgogCQlyZXQgPSBMUEZDX1BHX1RZUEVfRElGX0JVRjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9LY29uZmlnCmluZGV4IDRhODY4NTUuLjcwYzRjMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvS2NvbmZpZwpAQCAtMiw3ICsyLDcgQEAKICMgS2VybmVsIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIE1QVDJTQVMKICMKICMgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIGRyaXZlcnMvc2NzaS9tcHQyc2FzL0tjb25maWcKLSMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggIExTSSBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSAgTFNJIENvcnBvcmF0aW9uCiAjICAobWFpbHRvOkRMLU1QVEZ1c2lvbkxpbnV4QGxzaS5jb20pCiAKICMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyLmgKaW5kZXggN2JiMmVjZS4uZjlmNmMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMi5oCkBAIC04LDcgKzgsNyBAQAogICogICAgICAgICAgICAgICAgICBzY2F0dGVyL2dhdGhlciBmb3JtYXRzLgogICogIENyZWF0aW9uIERhdGU6ICBKdW5lIDIxLCAyMDA2CiAgKgotICogIG1waTIuaCBWZXJzaW9uOiAgMDIuMDAuMTEKKyAqICBtcGkyLmggVmVyc2lvbjogIDAyLjAwLjEyCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNDUsNiArNDUsMTMgQEAKICAqICAxMC0wMi0wOCAgMDIuMDAuMTAgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCiAgKiAgICAgICAgICAgICAgICAgICAgICBNb3ZlZCBMVU4gZmllbGQgZGVmaW5lcyBmcm9tIG1waTJfaW5pdC5oLgogICogIDAxLTE5LTA5ICAwMi4wMC4xMSAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwNS0wNi0wOSAgMDIuMDAuMTIgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgICAgICAgICAgICAgICAgICAgICBJbiBhbGwgcmVxdWVzdCBhbmQgcmVwbHkgZGVzY3JpcHRvcnMsIHJlcGxhY2VkIFZGX0lECisgKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZCB3aXRoIE1TSXhJbmRleCBmaWVsZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgRGV2SGFuZGxlIGZpZWxkIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfU0NTSV9JT19TVUNDRVNTX1JFUExZX0RFU0NSSVBUT1IgYW5kIG1hZGUgdGhvc2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIHJlc2VydmVkLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUkFJRCBBY2NlbGVyYXRvciBmdW5jdGlvbmFsaXR5LgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNzAsNyArNzcsNyBAQAogI2RlZmluZSBNUEkyX1ZFUlNJT05fMDJfMDAgICAgICAgICAgICAgICAgICAoMHgwMjAwKQogCiAvKiB2ZXJzaW9uaW5nIGZvciB0aGlzIE1QSSBoZWFkZXIgc2V0ICovCi0jZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVCAgICAgICAgICAgICgweDBCKQorI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQgICAgICAgICAgICAoMHgwQykKICNkZWZpbmUgTVBJMl9IRUFERVJfVkVSU0lPTl9ERVYgICAgICAgICAgICAgKDB4MDApCiAjZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVF9NQVNLICAgICAgICgweEZGMDApCiAjZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVF9TSElGVCAgICAgICg4KQpAQCAtMjU3LDcgKzI2NCw3IEBACiB0eXBlZGVmIHN0cnVjdCBfTVBJMl9ERUZBVUxUX1JFUVVFU1RfREVTQ1JJUFRPUgogewogICAgIFU4ICAgICAgICAgICAgICBSZXF1ZXN0RmxhZ3M7ICAgICAgICAgICAgICAgLyogMHgwMCAqLwotICAgIFU4ICAgICAgICAgICAgICBWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworICAgIFU4ICAgICAgICAgICAgICBNU0l4SW5kZXg7ICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLwogICAgIFUxNiAgICAgICAgICAgICBTTUlEOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLwogICAgIFUxNiAgICAgICAgICAgICBMTUlEOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLwogICAgIFUxNiAgICAgICAgICAgICBEZXNjcmlwdG9yVHlwZURlcGVuZGVudDsgICAgLyogMHgwNiAqLwpAQCAtMjcxLDYgKzI3OCw3IEBACiAjZGVmaW5lIE1QSTJfUkVRX0RFU0NSSVBUX0ZMQUdTX1NDU0lfVEFSR0VUICAgICAgICAgICAgICgweDAyKQogI2RlZmluZSBNUEkyX1JFUV9ERVNDUklQVF9GTEFHU19ISUdIX1BSSU9SSVRZICAgICAgICAgICAoMHgwNikKICNkZWZpbmUgTVBJMl9SRVFfREVTQ1JJUFRfRkxBR1NfREVGQVVMVF9UWVBFICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSTJfUkVRX0RFU0NSSVBUX0ZMQUdTX1JBSURfQUNDRUxFUkFUT1IgICAgICAgICgweDBBKQogCiAjZGVmaW5lIE1QSTJfUkVRX0RFU0NSSVBUX0ZMQUdTX0lPQ19GSUZPX01BUktFUiAoMHgwMSkKIApAQCAtMjc5LDcgKzI4Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCBfTVBJMl9ISUdIX1BSSU9SSVRZX1JFUVVFU1RfREVTQ1JJUFRPUgogewogICAgIFU4ICAgICAgICAgICAgICBSZXF1ZXN0RmxhZ3M7ICAgICAgICAgICAgICAgLyogMHgwMCAqLwotICAgIFU4ICAgICAgICAgICAgICBWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworICAgIFU4ICAgICAgICAgICAgICBNU0l4SW5kZXg7ICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLwogICAgIFUxNiAgICAgICAgICAgICBTTUlEOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLwogICAgIFUxNiAgICAgICAgICAgICBMTUlEOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLwogICAgIFUxNiAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwNiAqLwpAQCAtMjkzLDcgKzMwMSw3IEBACiB0eXBlZGVmIHN0cnVjdCBfTVBJMl9TQ1NJX0lPX1JFUVVFU1RfREVTQ1JJUFRPUgogewogICAgIFU4ICAgICAgICAgICAgICBSZXF1ZXN0RmxhZ3M7ICAgICAgICAgICAgICAgLyogMHgwMCAqLwotICAgIFU4ICAgICAgICAgICAgICBWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworICAgIFU4ICAgICAgICAgICAgICBNU0l4SW5kZXg7ICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLwogICAgIFUxNiAgICAgICAgICAgICBTTUlEOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLwogICAgIFUxNiAgICAgICAgICAgICBMTUlEOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLwogICAgIFUxNiAgICAgICAgICAgICBEZXZIYW5kbGU7ICAgICAgICAgICAgICAgICAgLyogMHgwNiAqLwpAQCAtMzA2LDcgKzMxNCw3IEBACiB0eXBlZGVmIHN0cnVjdCBfTVBJMl9TQ1NJX1RBUkdFVF9SRVFVRVNUX0RFU0NSSVBUT1IKIHsKICAgICBVOCAgICAgICAgICAgICAgUmVxdWVzdEZsYWdzOyAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KLSAgICBVOCAgICAgICAgICAgICAgVkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKyAgICBVOCAgICAgICAgICAgICAgTVNJeEluZGV4OyAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KICAgICBVMTYgICAgICAgICAgICAgU01JRDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KICAgICBVMTYgICAgICAgICAgICAgTE1JRDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDQgKi8KICAgICBVMTYgICAgICAgICAgICAgSW9JbmRleDsgICAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KQEAgLTMxNSwxNCArMzIzLDI5IEBACiAgIE1waTJTQ1NJVGFyZ2V0UmVxdWVzdERlc2NyaXB0b3JfdCwKICAgTVBJMl9QT0lOVEVSIHBNcGkyU0NTSVRhcmdldFJlcXVlc3REZXNjcmlwdG9yX3Q7CiAKKworLyogUkFJRCBBY2NlbGVyYXRvciBSZXF1ZXN0IERlc2NyaXB0b3IgKi8KK3R5cGVkZWYgc3RydWN0IF9NUEkyX1JBSURfQUNDRUxfUkVRVUVTVF9ERVNDUklQVE9SIHsKKyAgICBVOCAgICAgICAgICAgICAgUmVxdWVzdEZsYWdzOyAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVOCAgICAgICAgICAgICAgTVNJeEluZGV4OyAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKyAgICBVMTYgICAgICAgICAgICAgU01JRDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVMTYgICAgICAgICAgICAgTE1JRDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDQgKi8KKyAgICBVMTYgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KK30gTVBJMl9SQUlEX0FDQ0VMX1JFUVVFU1RfREVTQ1JJUFRPUiwKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1JBSURfQUNDRUxfUkVRVUVTVF9ERVNDUklQVE9SLAorICBNcGkyUkFJREFjY2VsZXJhdG9yUmVxdWVzdERlc2NyaXB0b3JfdCwKKyAgTVBJMl9QT0lOVEVSIHBNcGkyUkFJREFjY2VsZXJhdG9yUmVxdWVzdERlc2NyaXB0b3JfdDsKKworCiAvKiB1bmlvbiBvZiBSZXF1ZXN0IERlc2NyaXB0b3JzICovCiB0eXBlZGVmIHVuaW9uIF9NUEkyX1JFUVVFU1RfREVTQ1JJUFRPUl9VTklPTgogewotICAgIE1QSTJfREVGQVVMVF9SRVFVRVNUX0RFU0NSSVBUT1IgICAgICAgICBEZWZhdWx0OwotICAgIE1QSTJfSElHSF9QUklPUklUWV9SRVFVRVNUX0RFU0NSSVBUT1IgICBIaWdoUHJpb3JpdHk7Ci0gICAgTVBJMl9TQ1NJX0lPX1JFUVVFU1RfREVTQ1JJUFRPUiAgICAgICAgIFNDU0lJTzsKLSAgICBNUEkyX1NDU0lfVEFSR0VUX1JFUVVFU1RfREVTQ1JJUFRPUiAgICAgU0NTSVRhcmdldDsKLSAgICBVNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZHM7CisgICAgTVBJMl9ERUZBVUxUX1JFUVVFU1RfREVTQ1JJUFRPUiAgICAgICAgICAgICBEZWZhdWx0OworICAgIE1QSTJfSElHSF9QUklPUklUWV9SRVFVRVNUX0RFU0NSSVBUT1IgICAgICAgSGlnaFByaW9yaXR5OworICAgIE1QSTJfU0NTSV9JT19SRVFVRVNUX0RFU0NSSVBUT1IgICAgICAgICAgICAgU0NTSUlPOworICAgIE1QSTJfU0NTSV9UQVJHRVRfUkVRVUVTVF9ERVNDUklQVE9SICAgICAgICAgU0NTSVRhcmdldDsKKyAgICBNUEkyX1JBSURfQUNDRUxfUkVRVUVTVF9ERVNDUklQVE9SICAgICAgICAgIFJBSURBY2NlbGVyYXRvcjsKKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmRzOwogfSBNUEkyX1JFUVVFU1RfREVTQ1JJUFRPUl9VTklPTiwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1JFUVVFU1RfREVTQ1JJUFRPUl9VTklPTiwKICAgTXBpMlJlcXVlc3REZXNjcmlwdG9yVW5pb25fdCwgTVBJMl9QT0lOVEVSIHBNcGkyUmVxdWVzdERlc2NyaXB0b3JVbmlvbl90OwogCkBAIC0zMzMsMTkgKzM1NiwyMCBAQAogdHlwZWRlZiBzdHJ1Y3QgX01QSTJfREVGQVVMVF9SRVBMWV9ERVNDUklQVE9SCiB7CiAgICAgVTggICAgICAgICAgICAgIFJlcGx5RmxhZ3M7ICAgICAgICAgICAgICAgICAvKiAweDAwICovCi0gICAgVTggICAgICAgICAgICAgIFZGX0lEOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDAxICovCisgICAgVTggICAgICAgICAgICAgIE1TSXhJbmRleDsgICAgICAgICAgICAgICAgICAvKiAweDAxICovCiAgICAgVTE2ICAgICAgICAgICAgIERlc2NyaXB0b3JUeXBlRGVwZW5kZW50MTsgICAvKiAweDAyICovCiAgICAgVTMyICAgICAgICAgICAgIERlc2NyaXB0b3JUeXBlRGVwZW5kZW50MjsgICAvKiAweDA0ICovCiB9IE1QSTJfREVGQVVMVF9SRVBMWV9ERVNDUklQVE9SLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfREVGQVVMVF9SRVBMWV9ERVNDUklQVE9SLAogICBNcGkyRGVmYXVsdFJlcGx5RGVzY3JpcHRvcl90LCBNUEkyX1BPSU5URVIgcE1waTJEZWZhdWx0UmVwbHlEZXNjcmlwdG9yX3Q7CiAKIC8qIGRlZmluZXMgZm9yIHRoZSBSZXBseUZsYWdzIGZpZWxkICovCi0jZGVmaW5lIE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1RZUEVfTUFTSyAgICAgICAgICAgICAgICgweDBGKQotI2RlZmluZSBNUEkyX1JQWV9ERVNDUklQVF9GTEFHU19TQ1NJX0lPX1NVQ0NFU1MgICAgICAgICAoMHgwMCkKLSNkZWZpbmUgTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfQUREUkVTU19SRVBMWSAgICAgICAgICAgKDB4MDEpCi0jZGVmaW5lIE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1RBUkdFVEFTU0lTVF9TVUNDRVNTICAgICgweDAyKQotI2RlZmluZSBNUEkyX1JQWV9ERVNDUklQVF9GTEFHU19UQVJHRVRfQ09NTUFORF9CVUZGRVIgICAoMHgwMykKLSNkZWZpbmUgTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfVU5VU0VEICAgICAgICAgICAgICAgICAgKDB4MEYpCisjZGVmaW5lIE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAoMHgwRikKKyNkZWZpbmUgTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfU0NTSV9JT19TVUNDRVNTICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUEkyX1JQWV9ERVNDUklQVF9GTEFHU19BRERSRVNTX1JFUExZICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1RBUkdFVEFTU0lTVF9TVUNDRVNTICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfVEFSR0VUX0NPTU1BTkRfQlVGRkVSICAgICAgICgweDAzKQorI2RlZmluZSBNUEkyX1JQWV9ERVNDUklQVF9GTEFHU19SQUlEX0FDQ0VMRVJBVE9SX1NVQ0NFU1MgICAgKDB4MDUpCisjZGVmaW5lIE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1VOVVNFRCAgICAgICAgICAgICAgICAgICAgICAoMHgwRikKIAogLyogdmFsdWVzIGZvciBtYXJraW5nIGEgcmVwbHkgZGVzY3JpcHRvciBhcyB1bnVzZWQgKi8KICNkZWZpbmUgTVBJMl9SUFlfREVTQ1JJUFRfVU5VU0VEX1dPUkQwX01BUksgICAgICAgICAgICAgKDB4RkZGRkZGRkYpCkBAIC0zNTUsNyArMzc5LDcgQEAKIHR5cGVkZWYgc3RydWN0IF9NUEkyX0FERFJFU1NfUkVQTFlfREVTQ1JJUFRPUgogewogICAgIFU4ICAgICAgICAgICAgICBSZXBseUZsYWdzOyAgICAgICAgICAgICAgICAgLyogMHgwMCAqLwotICAgIFU4ICAgICAgICAgICAgICBWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworICAgIFU4ICAgICAgICAgICAgICBNU0l4SW5kZXg7ICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLwogICAgIFUxNiAgICAgICAgICAgICBTTUlEOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLwogICAgIFUzMiAgICAgICAgICAgICBSZXBseUZyYW1lQWRkcmVzczsgICAgICAgICAgLyogMHgwNCAqLwogfSBNUEkyX0FERFJFU1NfUkVQTFlfREVTQ1JJUFRPUiwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0FERFJFU1NfUkVQTFlfREVTQ1JJUFRPUiwKQEAgLTM2OCwxMCArMzkyLDEwIEBACiB0eXBlZGVmIHN0cnVjdCBfTVBJMl9TQ1NJX0lPX1NVQ0NFU1NfUkVQTFlfREVTQ1JJUFRPUgogewogICAgIFU4ICAgICAgICAgICAgICBSZXBseUZsYWdzOyAgICAgICAgICAgICAgICAgLyogMHgwMCAqLwotICAgIFU4ICAgICAgICAgICAgICBWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworICAgIFU4ICAgICAgICAgICAgICBNU0l4SW5kZXg7ICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLwogICAgIFUxNiAgICAgICAgICAgICBTTUlEOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLwogICAgIFUxNiAgICAgICAgICAgICBUYXNrVGFnOyAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLwotICAgIFUxNiAgICAgICAgICAgICBEZXZIYW5kbGU7ICAgICAgICAgICAgICAgICAgLyogMHgwNiAqLworICAgIFUxNiAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwNiAqLwogfSBNUEkyX1NDU0lfSU9fU1VDQ0VTU19SRVBMWV9ERVNDUklQVE9SLAogICBNUEkyX1BPSU5URVIgUFRSX01QSTJfU0NTSV9JT19TVUNDRVNTX1JFUExZX0RFU0NSSVBUT1IsCiAgIE1waTJTQ1NJSU9TdWNjZXNzUmVwbHlEZXNjcmlwdG9yX3QsCkBAIC0zODIsNyArNDA2LDcgQEAKIHR5cGVkZWYgc3RydWN0IF9NUEkyX1RBUkdFVEFTU0lTVF9TVUNDRVNTX1JFUExZX0RFU0NSSVBUT1IKIHsKICAgICBVOCAgICAgICAgICAgICAgUmVwbHlGbGFnczsgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KLSAgICBVOCAgICAgICAgICAgICAgVkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKyAgICBVOCAgICAgICAgICAgICAgTVNJeEluZGV4OyAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KICAgICBVMTYgICAgICAgICAgICAgU01JRDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KICAgICBVOCAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXI7ICAgICAgICAgICAgIC8qIDB4MDQgKi8KICAgICBVOCAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDB4MDUgKi8KQEAgLTM5Nyw3ICs0MjEsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgX01QSTJfVEFSR0VUX0NPTU1BTkRfQlVGRkVSX1JFUExZX0RFU0NSSVBUT1IKIHsKICAgICBVOCAgICAgICAgICAgICAgUmVwbHlGbGFnczsgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KLSAgICBVOCAgICAgICAgICAgICAgVkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKyAgICBVOCAgICAgICAgICAgICAgTVNJeEluZGV4OyAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KICAgICBVOCAgICAgICAgICAgICAgVlBfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KICAgICBVOCAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDMgKi8KICAgICBVMTYgICAgICAgICAgICAgSW5pdGlhdG9yRGV2SGFuZGxlOyAgICAgICAgIC8qIDB4MDQgKi8KQEAgLTQxMSwxNSArNDM1LDI4IEBACiAjZGVmaW5lIE1QSTJfUlBZX0RFU0NSSVBUX1RDQl9GTEFHU19QSFlOVU1fTUFTSyAgICAgKDB4M0YpCiAKIAorLyogUkFJRCBBY2NlbGVyYXRvciBTdWNjZXNzIFJlcGx5IERlc2NyaXB0b3IgKi8KK3R5cGVkZWYgc3RydWN0IF9NUEkyX1JBSURfQUNDRUxFUkFUT1JfU1VDQ0VTU19SRVBMWV9ERVNDUklQVE9SIHsKKyAgICBVOCAgICAgICAgICAgICAgUmVwbHlGbGFnczsgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVOCAgICAgICAgICAgICAgTVNJeEluZGV4OyAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKyAgICBVMTYgICAgICAgICAgICAgU01JRDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVMzIgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDB4MDQgKi8KK30gTVBJMl9SQUlEX0FDQ0VMRVJBVE9SX1NVQ0NFU1NfUkVQTFlfREVTQ1JJUFRPUiwKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1JBSURfQUNDRUxFUkFUT1JfU1VDQ0VTU19SRVBMWV9ERVNDUklQVE9SLAorICBNcGkyUkFJREFjY2VsZXJhdG9yU3VjY2Vzc1JlcGx5RGVzY3JpcHRvcl90LAorICBNUEkyX1BPSU5URVIgcE1waTJSQUlEQWNjZWxlcmF0b3JTdWNjZXNzUmVwbHlEZXNjcmlwdG9yX3Q7CisKKwogLyogdW5pb24gb2YgUmVwbHkgRGVzY3JpcHRvcnMgKi8KIHR5cGVkZWYgdW5pb24gX01QSTJfUkVQTFlfREVTQ1JJUFRPUlNfVU5JT04KIHsKLSAgICBNUEkyX0RFRkFVTFRfUkVQTFlfREVTQ1JJUFRPUiAgICAgICAgICAgICAgIERlZmF1bHQ7Ci0gICAgTVBJMl9BRERSRVNTX1JFUExZX0RFU0NSSVBUT1IgICAgICAgICAgICAgICBBZGRyZXNzUmVwbHk7Ci0gICAgTVBJMl9TQ1NJX0lPX1NVQ0NFU1NfUkVQTFlfREVTQ1JJUFRPUiAgICAgICBTQ1NJSU9TdWNjZXNzOwotICAgIE1QSTJfVEFSR0VUQVNTSVNUX1NVQ0NFU1NfUkVQTFlfREVTQ1JJUFRPUiAgVGFyZ2V0QXNzaXN0U3VjY2VzczsKLSAgICBNUEkyX1RBUkdFVF9DT01NQU5EX0JVRkZFUl9SRVBMWV9ERVNDUklQVE9SIFRhcmdldENvbW1hbmRCdWZmZXI7Ci0gICAgVTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkczsKKyAgICBNUEkyX0RFRkFVTFRfUkVQTFlfREVTQ1JJUFRPUiAgICAgICAgICAgICAgICAgICBEZWZhdWx0OworICAgIE1QSTJfQUREUkVTU19SRVBMWV9ERVNDUklQVE9SICAgICAgICAgICAgICAgICAgIEFkZHJlc3NSZXBseTsKKyAgICBNUEkyX1NDU0lfSU9fU1VDQ0VTU19SRVBMWV9ERVNDUklQVE9SICAgICAgICAgICBTQ1NJSU9TdWNjZXNzOworICAgIE1QSTJfVEFSR0VUQVNTSVNUX1NVQ0NFU1NfUkVQTFlfREVTQ1JJUFRPUiAgICAgIFRhcmdldEFzc2lzdFN1Y2Nlc3M7CisgICAgTVBJMl9UQVJHRVRfQ09NTUFORF9CVUZGRVJfUkVQTFlfREVTQ1JJUFRPUiAgICAgVGFyZ2V0Q29tbWFuZEJ1ZmZlcjsKKyAgICBNUEkyX1JBSURfQUNDRUxFUkFUT1JfU1VDQ0VTU19SRVBMWV9ERVNDUklQVE9SICBSQUlEQWNjZWxlcmF0b3JTdWNjZXNzOworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmRzOwogfSBNUEkyX1JFUExZX0RFU0NSSVBUT1JTX1VOSU9OLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfUkVQTFlfREVTQ1JJUFRPUlNfVU5JT04sCiAgIE1waTJSZXBseURlc2NyaXB0b3JzVW5pb25fdCwgTVBJMl9QT0lOVEVSIHBNcGkyUmVwbHlEZXNjcmlwdG9yc1VuaW9uX3Q7CiAKQEAgLTQ1OCw2ICs0OTUsNyBAQAogI2RlZmluZSBNUEkyX0ZVTkNUSU9OX0RJQUdfUkVMRUFTRSAgICAgICAgICAgICAgICAgICgweDFFKSAvKiBEaWFnbm9zdGljIFJlbGVhc2UgKi8KICNkZWZpbmUgTVBJMl9GVU5DVElPTl9UQVJHRVRfQ01EX0JVRl9CQVNFX1BPU1QgICAgICAoMHgyNCkgLyogVGFyZ2V0IENvbW1hbmQgQnVmZmVyIFBvc3QgQmFzZSAqLwogI2RlZmluZSBNUEkyX0ZVTkNUSU9OX1RBUkdFVF9DTURfQlVGX0xJU1RfUE9TVCAgICAgICgweDI1KSAvKiBUYXJnZXQgQ29tbWFuZCBCdWZmZXIgUG9zdCBMaXN0ICovCisjZGVmaW5lIE1QSTJfRlVOQ1RJT05fUkFJRF9BQ0NFTEVSQVRPUiAgICAgICAgICAgICAgKDB4MkMpIC8qIFJBSUQgQWNjZWxlcmF0b3IqLwogCiAKIApAQCAtNTU1LDEyICs1OTMsMTcgQEAKIAogI2RlZmluZSBNUEkyX0lPQ1NUQVRVU19ESUFHTk9TVElDX1JFTEVBU0VEICAgICAgICAgICgweDAwQTApCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBSQUlEIEFjY2VsZXJhdG9yIHZhbHVlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUEkyX0lPQ1NUQVRVU19SQUlEX0FDQ0VMX0VSUk9SICAgICAgICAgICAgICgweDAwQjApCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBJT0NTdGF0dXMgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGxvZyBpbmZvIGlzIGF2YWlsYWJsZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBNUEkyX0lPQ1NUQVRVU19GTEFHX0xPR19JTkZPX0FWQUlMQUJMRSAgKDB4ODAwMCkKKyNkZWZpbmUgTVBJMl9JT0NTVEFUVVNfRkxBR19MT0dfSU5GT19BVkFJTEFCTEUgICAgICAoMHg4MDAwKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgSU9DTG9nSW5mbyBUeXBlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oCmluZGV4IDJmMjdjZjYuLmFiNDdjNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2NuZmcuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9jbmZnLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGFuZCBwYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBOb3ZlbWJlciAxMCwgMjAwNgogICoKLSAqICAgIG1waTJfY25mZy5oIFZlcnNpb246ICAwMi4wMC4xMAorICogICAgbXBpMl9jbmZnLmggVmVyc2lvbjogIDAyLjAwLjExCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtOTUsNiArOTUsMTEgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfU0FTX0RFVklDRTBfQVNUQVRVU19ERVZJQ0VfQkxPQ0tFRCBkZWZpbmUuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBQb3J0R3JvdXBzLCBEbWFHcm91cCwgYW5kIENvbnRyb2xHcm91cCBmaWVsZHMgdG8KICAqICAgICAgICAgICAgICAgICAgICAgIFNBUyBEZXZpY2UgUGFnZSAwLgorICogIDA1LTA2LTA5ICAwMi4wMC4xMSAgQWRkZWQgc3RydWN0dXJlcyBhbmQgZGVmaW5lcyBmb3IgSU8gVW5pdCBQYWdlIDUgYW5kIElPCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml0IFBhZ2UgNi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGV4cGFuZGVyIHJlZHVjZWQgZnVuY3Rpb25hbGl0eSBkYXRhIHRvIFNBUworICogICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXIgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgU0FTIFBIWSBQYWdlIDIgYW5kIFNBUyBQSFkgUGFnZSAzLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNzIzLDYgKzcyOCw2NSBAQAogI2RlZmluZSBNUEkyX0lPVU5JVFBBR0UzX0dQSU9fU0VUVElOR19PTiAgICAgICAgICAgICAgICAoMHgwMDAxKQogCiAKKy8qIElPIFVuaXQgUGFnZSA1ICovCisKKy8qCisgKiBVcHBlciBsYXllciBjb2RlIChkcml2ZXJzLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLlBhZ2VMZW5ndGggb3IgTnVtRG1hRW5naW5lcyBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSTJfSU9VTklUUEFHRTVfRE1BRU5HSU5FX0VOVFJJRVMKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFNV9ETUFFTkdJTkVfRU5UUklFUyAgICAgICgxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfNSB7CisgICAgTVBJMl9DT05GSUdfUEFHRV9IRUFERVIgSGVhZGVyOwkJCQkvKiAweDAwICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgUmFpZEFjY2VsZXJhdG9yQnVmZmVyQmFzZUFkZHJlc3M7ICAvKiAweDA0ICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgUmFpZEFjY2VsZXJhdG9yQnVmZmVyU2l6ZTsgICAgICAgICAvKiAweDBDICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgUmFpZEFjY2VsZXJhdG9yQ29udHJvbEJhc2VBZGRyZXNzOyAvKiAweDE0ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUkFDb250cm9sU2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKiAweDFDICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTnVtRG1hRW5naW5lczsgICAgICAgICAgICAgICAgICAgICAvKiAweDFEICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUkFNaW5Db250cm9sU2l6ZTsgICAgICAgICAgICAgICAgICAvKiAweDFFICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUkFNYXhDb250cm9sU2l6ZTsgICAgICAgICAgICAgICAgICAvKiAweDFGICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDIwICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDI0ICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDI4ICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRG1hRW5naW5lQ2FwYWJpbGl0aWVzCisJCQkJW01QSTJfSU9VTklUUEFHRTVfRE1BRU5HSU5FX0VOVFJJRVNdOyAvKiAweDJDICovCit9IE1QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF81LCBNUEkyX1BPSU5URVIgUFRSX01QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF81LAorICBNcGkySU9Vbml0UGFnZTVfdCwgTVBJMl9QT0lOVEVSIHBNcGkySU9Vbml0UGFnZTVfdDsKKworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U1X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKworLyogZGVmaW5lcyBmb3IgSU8gVW5pdCBQYWdlIDUgRG1hRW5naW5lQ2FwYWJpbGl0aWVzIGZpZWxkICovCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTVfRE1BX0NBUF9NQVNLX01BWF9SRVFVRVNUUyAgICAgICgweEZGMDApCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTVfRE1BX0NBUF9TSElGVF9NQVhfUkVRVUVTVFMgICAgICgxNikKKworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U1X0RNQV9DQVBfRUVEUCAgICAgICAgICAgICAgICAgICAoMHgwMDA4KQorI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U1X0RNQV9DQVBfUEFSSVRZX0dFTkVSQVRJT04gICAgICAoMHgwMDA0KQorI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U1X0RNQV9DQVBfSEFTSElORyAgICAgICAgICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U1X0RNQV9DQVBfRU5DUllQVElPTiAgICAgICAgICAgICAoMHgwMDAxKQorCisKKy8qIElPIFVuaXQgUGFnZSA2ICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfNiB7CisgICAgTVBJMl9DT05GSUdfUEFHRV9IRUFERVIgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJBSG9zdENvbnRyb2xTaXplOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA2ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDcgKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBSYWlkQWNjZWxlcmF0b3JIb3N0Q29udHJvbEJhc2VBZGRyZXNzOyAgLyogMHgwOCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDEwICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTQgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgxOCAqLworfSBNUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfNiwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfNiwKKyAgTXBpMklPVW5pdFBhZ2U2X3QsIE1QSTJfUE9JTlRFUiBwTXBpMklPVW5pdFBhZ2U2X3Q7CisKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFNl9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKy8qIGRlZmluZXMgZm9yIElPIFVuaXQgUGFnZSA2IEZsYWdzIGZpZWxkICovCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTZfRkxBR1NfRU5BQkxFX1JBSURfQUNDRUxFUkFUT1IgICgweDAwMDEpCisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICBJT0MgQ29uZmlnIFBhZ2VzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTcwOSwxMCArMTc3MywxNCBAQAogICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZVpvbmVNYW5hZ2VyU0FTQWRkcmVzczsvKiAweDJDICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWm9uZUxvY2tJbmFjdGl2aXR5TGltaXQ7ICAgIC8qIDB4MzQgKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgzNiAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVUb1JlZHVjZWRGdW5jOyAgICAgICAgICAvKiAweDM4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbFRpbWVUb1JlZHVjZWRGdW5jOyAgIC8qIDB4MzkgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhSZWR1Y2VkRnVuY1RpbWU7ICAgICAgICAgLyogMHgzQSAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDNCICovCiB9IE1QSTJfQ09ORklHX1BBR0VfRVhQQU5ERVJfMCwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0NPTkZJR19QQUdFX0VYUEFOREVSXzAsCiAgIE1waTJFeHBhbmRlclBhZ2UwX3QsIE1QSTJfUE9JTlRFUiBwTXBpMkV4cGFuZGVyUGFnZTBfdDsKIAotI2RlZmluZSBNUEkyX1NBU0VYUEFOREVSMF9QQUdFVkVSU0lPTiAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJMl9TQVNFWFBBTkRFUjBfUEFHRVZFUlNJT04gICAgICAgKDB4MDYpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIEV4cGFuZGVyIFBhZ2UgMCBEaXNjb3ZlcnlTdGF0dXMgZmllbGQgKi8KICNkZWZpbmUgTVBJMl9TQVNfRVhQQU5ERVIwX0RTX01BWF9FTkNMT1NVUkVTX0VYQ0VFRCAgICAgICAgICgweDgwMDAwMDAwKQpAQCAtMTczNyw2ICsxODA1LDcgQEAKICNkZWZpbmUgTVBJMl9TQVNfRVhQQU5ERVIwX0RTX0xPT1BfREVURUNURUQgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQogCiAvKiB2YWx1ZXMgZm9yIFNBUyBFeHBhbmRlciBQYWdlIDAgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9TQVNfRVhQQU5ERVIwX0ZMQUdTX1JFRFVDRURfRlVOQ1RJT05BTElUWSAgICAgICgweDIwMDApCiAjZGVmaW5lIE1QSTJfU0FTX0VYUEFOREVSMF9GTEFHU19aT05FX0xPQ0tFRCAgICAgICAgICAgICAgICAoMHgxMDAwKQogI2RlZmluZSBNUEkyX1NBU19FWFBBTkRFUjBfRkxBR1NfU1VQUE9SVEVEX1BIWVNJQ0FMX1BSRVMgICAgKDB4MDgwMCkKICNkZWZpbmUgTVBJMl9TQVNfRVhQQU5ERVIwX0ZMQUdTX0FTU0VSVEVEX1BIWVNJQ0FMX1BSRVMgICAgICgweDA0MDApCkBAIC0xOTQ0LDYgKzIwMTMsMTMzIEBACiAjZGVmaW5lIE1QSTJfU0FTUEhZMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICgweDAxKQogCiAKKy8qIFNBUyBQSFkgUGFnZSAyICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX1NBU1BIWTJfUEhZX0VWRU5UIHsKKyAgICBVOCAgICAgICAgICBQaHlFdmVudENvZGU7ICAgICAgIC8qIDB4MDAgKi8KKyAgICBVOCAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDB4MDEgKi8KKyAgICBVMTYgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVMzIgICAgICAgICBQaHlFdmVudEluZm87ICAgICAgIC8qIDB4MDQgKi8KK30gTVBJMl9TQVNQSFkyX1BIWV9FVkVOVCwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1NBU1BIWTJfUEhZX0VWRU5ULAorICBNcGkyU2FzUGh5MlBoeUV2ZW50X3QsIE1QSTJfUE9JTlRFUiBwTXBpMlNhc1BoeTJQaHlFdmVudF90OworCisvKiB1c2UgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfIGZvciB0aGUgUGh5RXZlbnRDb2RlIGZpZWxkICovCisKKworLyoKKyAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCisgKiBvbmUgYW5kIGNoZWNrIEhlYWRlci5FeHRQYWdlTGVuZ3RoIG9yIE51bVBoeUV2ZW50cyBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSTJfU0FTUEhZMl9QSFlfRVZFTlRfTUFYCisjZGVmaW5lIE1QSTJfU0FTUEhZMl9QSFlfRVZFTlRfTUFYICAgICAgKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfQ09ORklHX1BBR0VfU0FTX1BIWV8yIHsKKyAgICBNUEkyX0NPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDA4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtUGh5RXZlbnRzOyAgICAgICAgICAgICAgIC8qIDB4MEMgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMHgwRCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAweDBFICovCisgICAgTVBJMl9TQVNQSFkyX1BIWV9FVkVOVCAgICAgICAgICAgICAgUGh5RXZlbnRbTVBJMl9TQVNQSFkyX1BIWV9FVkVOVF9NQVhdOworCQkJCQkJCQkvKiAweDEwICovCit9IE1QSTJfQ09ORklHX1BBR0VfU0FTX1BIWV8yLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfQ09ORklHX1BBR0VfU0FTX1BIWV8yLAorICBNcGkyU2FzUGh5UGFnZTJfdCwgTVBJMl9QT0lOVEVSIHBNcGkyU2FzUGh5UGFnZTJfdDsKKworI2RlZmluZSBNUEkyX1NBU1BIWTJfUEFHRVZFUlNJT04gICAgICAgICAgICAoMHgwMCkKKworCisvKiBTQVMgUEhZIFBhZ2UgMyAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9TQVNQSFkzX1BIWV9FVkVOVF9DT05GSUcgeworICAgIFU4ICAgICAgICAgIFBoeUV2ZW50Q29kZTsgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMHgwMSAqLworICAgIFUxNiAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMHgwMiAqLworICAgIFU4ICAgICAgICAgIENvdW50ZXJUeXBlOyAgICAgICAgLyogMHgwNCAqLworICAgIFU4ICAgICAgICAgIFRocmVzaG9sZFdpbmRvdzsgICAgLyogMHgwNSAqLworICAgIFU4ICAgICAgICAgIFRpbWVVbml0czsgICAgICAgICAgLyogMHgwNiAqLworICAgIFU4ICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMHgwNyAqLworICAgIFUzMiAgICAgICAgIEV2ZW50VGhyZXNob2xkOyAgICAgLyogMHgwOCAqLworICAgIFUxNiAgICAgICAgIFRocmVzaG9sZEZsYWdzOyAgICAgLyogMHgwQyAqLworICAgIFUxNiAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgLyogMHgwRSAqLworfSBNUEkyX1NBU1BIWTNfUEhZX0VWRU5UX0NPTkZJRywgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1NBU1BIWTNfUEhZX0VWRU5UX0NPTkZJRywKKyAgTXBpMlNhc1BoeTNQaHlFdmVudENvbmZpZ190LCBNUEkyX1BPSU5URVIgcE1waTJTYXNQaHkzUGh5RXZlbnRDb25maWdfdDsKKworLyogdmFsdWVzIGZvciBQaHlFdmVudENvZGUgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfTk9fRVZFTlQgICAgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9JTlZBTElEX0RXT1JEICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1JVTk5JTkdfRElTUEFSSVRZX0VSUk9SICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfTE9TU19EV09SRF9TWU5DICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9QSFlfUkVTRVRfUFJPQkxFTSAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX0VMQVNUSUNJVFlfQlVGX09WRVJGTE9XICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUlhfRVJST1IgICAgICAgICAgICAgICAgICAgICgweDA2KQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9SWF9BRERSX0ZSQU1FX0VSUk9SICAgICAgICAgKDB4MjApCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1RYX0FDX09QRU5fUkVKRUNUICAgICAgICAgICAoMHgyMSkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUlhfQUNfT1BFTl9SRUpFQ1QgICAgICAgICAgICgweDIyKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9UWF9SQ19PUEVOX1JFSkVDVCAgICAgICAgICAgKDB4MjMpCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1JYX1JDX09QRU5fUkVKRUNUICAgICAgICAgICAoMHgyNCkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUlhfQUlQX1BBUlRJQUxfV0FJVElOR19PTiAgICgweDI1KQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9SWF9BSVBfQ09OTkVDVF9XQUlUSU5HX09OICAgKDB4MjYpCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1RYX0JSRUFLICAgICAgICAgICAgICAgICAgICAoMHgyNykKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUlhfQlJFQUsgICAgICAgICAgICAgICAgICAgICgweDI4KQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9CUkVBS19USU1FT1VUICAgICAgICAgICAgICAgKDB4MjkpCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX0NPTk5FQ1RJT04gICAgICAgICAgICAgICAgICAoMHgyQSkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUEVBS1RYX1BBVEhXQVlfQkxPQ0tFRCAgICAgICgweDJCKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9QRUFLVFhfQVJCX1dBSVRfVElNRSAgICAgICAgKDB4MkMpCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1BFQUtfQVJCX1dBSVRfVElNRSAgICAgICAgICAoMHgyRCkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUEVBS19DT05ORUNUX1RJTUUgICAgICAgICAgICgweDJFKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9UWF9TU1BfRlJBTUVTICAgICAgICAgICAgICAgKDB4NDApCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1JYX1NTUF9GUkFNRVMgICAgICAgICAgICAgICAoMHg0MSkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfVFhfU1NQX0VSUk9SX0ZSQU1FUyAgICAgICAgICgweDQyKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9SWF9TU1BfRVJST1JfRlJBTUVTICAgICAgICAgKDB4NDMpCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1RYX0NSRURJVF9CTE9DS0VEICAgICAgICAgICAoMHg0NCkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUlhfQ1JFRElUX0JMT0NLRUQgICAgICAgICAgICgweDQ1KQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9UWF9TQVRBX0ZSQU1FUyAgICAgICAgICAgICAgKDB4NTApCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1JYX1NBVEFfRlJBTUVTICAgICAgICAgICAgICAoMHg1MSkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfU0FUQV9PVkVSRkxPVyAgICAgICAgICAgICAgICgweDUyKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9UWF9TTVBfRlJBTUVTICAgICAgICAgICAgICAgKDB4NjApCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX1JYX1NNUF9GUkFNRVMgICAgICAgICAgICAgICAoMHg2MSkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUlhfU01QX0VSUk9SX0ZSQU1FUyAgICAgICAgICgweDYzKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfRVZFTlRfQ09ERV9IT1RQTFVHX1RJTUVPVVQgICAgICAgICAgICAgKDB4RDApCisjZGVmaW5lIE1QSTJfU0FTUEhZM19FVkVOVF9DT0RFX01JU0FMSUdORURfTVVYX1BSSU1JVElWRSAgICAoMHhEMSkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfUlhfQUlQICAgICAgICAgICAgICAgICAgICAgICgweEQyKQorCisvKiB2YWx1ZXMgZm9yIHRoZSBDb3VudGVyVHlwZSBmaWVsZCAqLworI2RlZmluZSBNUEkyX1NBU1BIWTNfQ09VTlRFUl9UWVBFX1dSQVBQSU5HICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSTJfU0FTUEhZM19DT1VOVEVSX1RZUEVfU0FUVVJBVElORyAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX0NPVU5URVJfVFlQRV9QRUFLX1ZBTFVFICAgICAgICAgICAgICAgICgweDAyKQorCisvKiB2YWx1ZXMgZm9yIHRoZSBUaW1lVW5pdHMgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9TQVNQSFkzX1RJTUVfVU5JVFNfMTBfTUlDUk9TRUNPTkRTICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUEkyX1NBU1BIWTNfVElNRV9VTklUU18xMDBfTUlDUk9TRUNPTkRTICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfU0FTUEhZM19USU1FX1VOSVRTXzFfTUlMTElTRUNPTkQgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX1RJTUVfVU5JVFNfMTBfTUlMTElTRUNPTkRTICAgICAgICAgICAgICgweDAzKQorCisvKiB2YWx1ZXMgZm9yIHRoZSBUaHJlc2hvbGRGbGFncyBmaWVsZCAqLworI2RlZmluZSBNUEkyX1NBU1BIWTNfVEZMQUdTX1BIWV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJMl9TQVNQSFkzX1RGTEFHU19FVkVOVF9OT1RJRlkgICAgICAgICAgICAgICAgICAgICgweDAwMDEpCisKKy8qCisgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bworICogb25lIGFuZCBjaGVjayBIZWFkZXIuRXh0UGFnZUxlbmd0aCBvciBOdW1QaHlFdmVudHMgYXQgcnVudGltZS4KKyAqLworI2lmbmRlZiBNUEkyX1NBU1BIWTNfUEhZX0VWRU5UX01BWAorI2RlZmluZSBNUEkyX1NBU1BIWTNfUEhZX0VWRU5UX01BWCAgICAgICgxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0NPTkZJR19QQUdFX1NBU19QSFlfMyB7CisgICAgTVBJMl9DT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVBoeUV2ZW50czsgICAgICAgICAgICAgICAvKiAweDBDICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDB4MEQgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMHgwRSAqLworICAgIE1QSTJfU0FTUEhZM19QSFlfRVZFTlRfQ09ORklHICAgICAgIFBoeUV2ZW50Q29uZmlnCisJCQkJCVtNUEkyX1NBU1BIWTNfUEhZX0VWRU5UX01BWF07IC8qIDB4MTAgKi8KK30gTVBJMl9DT05GSUdfUEFHRV9TQVNfUEhZXzMsIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9TQVNfUEhZXzMsCisgIE1waTJTYXNQaHlQYWdlM190LCBNUEkyX1BPSU5URVIgcE1waTJTYXNQaHlQYWdlM190OworCisjZGVmaW5lIE1QSTJfU0FTUEhZM19QQUdFVkVSU0lPTiAgICAgICAgICAgICgweDAwKQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgU0FTIFBvcnQgQ29uZmlnIFBhZ2VzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaGlzdG9yeS50eHQgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9oaXN0b3J5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWZjYWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaGlzdG9yeS50eHQKQEAgLTAsMCArMSwzMzQgQEAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBGdXNpb24tTVBUIE1QSSAyLjAgSGVhZGVyIEZpbGUgQ2hhbmdlIEhpc3RvcnkKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIENvcHlyaWdodCAoYykgMjAwMC0yMDA5IExTSSBDb3Jwb3JhdGlvbi4KKworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhlYWRlciBTZXQgUmVsZWFzZSBWZXJzaW9uOiAgICAwMi4wMC4xMgorIEhlYWRlciBTZXQgUmVsZWFzZSBEYXRlOiAgICAgICAwNS0wNi0wOQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgRmlsZW5hbWUgICAgICAgICAgICAgICBDdXJyZW50IHZlcnNpb24gICAgIFByaW9yIHZlcnNpb24KKyAtLS0tLS0tLS0tICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLQorIG1waTIuaCAgICAgICAgICAgICAgICAgMDIuMDAuMTIgICAgICAgICAgICAwMi4wMC4xMQorIG1waTJfY25mZy5oICAgICAgICAgICAgMDIuMDAuMTEgICAgICAgICAgICAwMi4wMC4xMAorIG1waTJfaW5pdC5oICAgICAgICAgICAgMDIuMDAuMDcgICAgICAgICAgICAwMi4wMC4wNgorIG1waTJfaW9jLmggICAgICAgICAgICAgMDIuMDAuMTEgICAgICAgICAgICAwMi4wMC4xMAorIG1waTJfcmFpZC5oICAgICAgICAgICAgMDIuMDAuMDMgICAgICAgICAgICAwMi4wMC4wMworIG1waTJfc2FzLmggICAgICAgICAgICAgMDIuMDAuMDIgICAgICAgICAgICAwMi4wMC4wMgorIG1waTJfdGFyZy5oICAgICAgICAgICAgMDIuMDAuMDMgICAgICAgICAgICAwMi4wMC4wMworIG1waTJfdG9vbC5oICAgICAgICAgICAgMDIuMDAuMDMgICAgICAgICAgICAwMi4wMC4wMgorIG1waTJfdHlwZS5oICAgICAgICAgICAgMDIuMDAuMDAgICAgICAgICAgICAwMi4wMC4wMAorIG1waTJfcmEuaCAgICAgICAgICAgICAgMDIuMDAuMDAKKyBtcGkyX2hpc3RvcnkudHh0ICAgICAgIDAyLjAwLjExICAgICAgICAgICAgMDIuMDAuMTIKKworCisgKiAgRGF0ZSAgICAgIFZlcnNpb24gICBEZXNjcmlwdGlvbgorICogIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waTIuaAorICogIDA0LTMwLTA3ICAwMi4wMC4wMCAgQ29ycmVzcG9uZHMgdG8gRnVzaW9uLU1QVCBNUEkgU3BlY2lmaWNhdGlvbiBSZXYgQS4KKyAqICAwNi0wNC0wNyAgMDIuMDAuMDEgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgMDYtMjYtMDcgIDAyLjAwLjAyICBCdW1wZWQgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklULgorICogIDA4LTMxLTA3ICAwMi4wMC4wMyAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vdmVkIFJlcGx5UG9zdEhvc3RJbmRleCByZWdpc3RlciB0byBvZmZzZXQgMHg2QyBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfU1lTVEVNX0lOVEVSRkFDRV9SRUdTIGFuZCBtb2RpZmllZCB0aGUgZGVmaW5lIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgTVBJMl9SRVBMWV9QT1NUX0hPU1RfSU5ERVhfT0ZGU0VULgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgdW5pb24gb2YgcmVxdWVzdCBkZXNjcmlwdG9ycy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHVuaW9uIG9mIHJlcGx5IGRlc2NyaXB0b3JzLgorICogIDEwLTMxLTA3ICAwMi4wMC4wNCAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGRlZmluZSBmb3IgTVBJMl9WRVJTSU9OXzAyXzAwLgorICogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgdGhlIHNpemUgb2YgdGhlIEZ1bmN0aW9uRGVwZW5kZW50NSBmaWVsZCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfREVGQVVMVF9SRVBMWSBzdHJ1Y3R1cmUuCisgKiAgMTItMTgtMDcgIDAyLjAwLjA1ICBCdW1wZWQgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklULgorICogICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCB0aGUgTVBJLWRlZmluZWQgRmF1bHQgQ29kZXMgYW5kIGV4dGVuZGVkIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCBzcGVjaWZpYyBjb2RlcyB1cCB0byAweEVGRkYuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBhIHNpeHRoIGtleSB2YWx1ZSBmb3IgdGhlIFdyaXRlU2VxdWVuY2UgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBjaGFuZ2VkIHRoZSBmbHVzaCB2YWx1ZSB0byAweDAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBtZXNzYWdlIGZ1bmN0aW9uIGNvZGVzIGZvciBEaWFnbm9zdGljIEJ1ZmZlciBQb3N0CisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgRGlhZ25zb3RpYyBSZWxlYXNlLgorICogICAgICAgICAgICAgICAgICAgICAgTmV3IElPQ1N0YXR1cyBkZWZpbmU6IE1QSTJfSU9DU1RBVFVTX0RJQUdOT1NUSUNfUkVMRUFTRUQKKyAqICAgICAgICAgICAgICAgICAgICAgIE1vdmVkIE1QSTJfVkVSU0lPTl9VTklPTiBmcm9tIG1waTJfaW9jLmguCisgKiAgMDItMjktMDggIDAyLjAwLjA2ICBCdW1wZWQgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklULgorICogIDAzLTAzLTA4ICAwMi4wMC4wNyAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwNS0yMS0wOCAgMDIuMDAuMDggIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCAjZGVmaW5lcyBmb3IgbWFya2luZyBhIHJlcGx5IGRlc2NyaXB0b3IgYXMgdW51c2VkLgorICogIDA2LTI3LTA4ICAwMi4wMC4wOSAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAxMC0wMi0wOCAgMDIuMDAuMTAgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgICAgICAgICAgICAgICAgICAgICBNb3ZlZCBMVU4gZmllbGQgZGVmaW5lcyBmcm9tIG1waTJfaW5pdC5oLgorICogIDAxLTE5LTA5ICAwMi4wMC4xMSAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwNS0wNi0wOSAgMDIuMDAuMTIgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgICAgICAgICAgICAgICAgICAgICBJbiBhbGwgcmVxdWVzdCBhbmQgcmVwbHkgZGVzY3JpcHRvcnMsIHJlcGxhY2VkIFZGX0lECisgKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZCB3aXRoIE1TSXhJbmRleCBmaWVsZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgRGV2SGFuZGxlIGZpZWxkIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfU0NTSV9JT19TVUNDRVNTX1JFUExZX0RFU0NSSVBUT1IgYW5kIG1hZGUgdGhvc2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIHJlc2VydmVkLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUkFJRCBBY2NlbGVyYXRvciBmdW5jdGlvbmFsaXR5LgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waTJfY25mZy5oCisgKiAgMDQtMzAtMDcgIDAyLjAwLjAwICBDb3JyZXNwb25kcyB0byBGdXNpb24tTVBUIE1QSSBTcGVjaWZpY2F0aW9uIFJldiBBLgorICogIDA2LTA0LTA3ICAwMi4wMC4wMSAgQWRkZWQgZGVmaW5lcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAyIFBoeUZsYWdzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTWFudWZhY3R1cmluZyBQYWdlIDExLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9TQVNfRVhQQU5ERVIwX0ZMQUdTX0NPTk5FQ1RPUl9FTkRfREVWSUNFCisgKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUuCisgKiAgMDYtMjYtMDcgIDAyLjAwLjAyICBBZGRpbmcgZ2VuZXJpYyBzdHJ1Y3R1cmUgZm9yIHByb2R1Y3Qtc3BlY2lmaWMKKyAqICAgICAgICAgICAgICAgICAgICAgIE1hbnVmYWN0dXJpbmcgcGFnZXM6IE1QSTJfQ09ORklHX1BBR0VfTUFOVUZBQ1RVUklOR19QUy4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJld29yayBvZiBCSU9TIFBhZ2UgMiBjb25maWd1cmF0aW9uIHBhZ2UuCisgKiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCBNUEkyX0JJT1NQQUdFMl9CT09UX0RFVklDRSB0byBiZSBhIHVuaW9uIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgZm9ybXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBjb25maWd1cmF0aW9uIHBhZ2VzIElPQyBQYWdlIDggYW5kIERyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVudCBNYXBwaW5nIFBhZ2UgMC4KKyAqICAwOC0zMS0wNyAgMDIuMDAuMDMgIE1vZGlmaWVkIGNvbmZpZ3VyYXRpb24gcGFnZXMgZGVhbGluZyB3aXRoIEludGVncmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIFJBSUQgKE1hbnVmYWN0dXJpbmcgUGFnZSA0LCBSQUlEIFZvbHVtZSBQYWdlcyAwIGFuZCAxLAorICogICAgICAgICAgICAgICAgICAgICAgUkFJRCBQaHlzaWNhbCBEaXNrIFBhZ2VzIDAgYW5kIDEsIFJBSUQgQ29uZmlndXJhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgUGFnZSAwKS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyB2YWx1ZSBmb3IgQWNjZXNzU3RhdHVzIGZpZWxkIG9mIFNBUyBEZXZpY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMCAoX1NBVEFfTkVFRFNfSU5JVElBTElaQVRJT04pLgorICogIDEwLTMxLTA3ICAwMi4wMC4wNCAgQWRkZWQgbWlzc2luZyBTRVBEZXZIYW5kbGUgZmllbGQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfQ09ORklHX1BBR0VfU0FTX0VOQ0xPU1VSRV8wLgorICogIDEyLTE4LTA3ICAwMi4wMC4wNSAgTW9kaWZpZWQgSU8gVW5pdCBQYWdlIDAgdG8gdXNlIDMyLWJpdCB2ZXJzaW9uIGZpZWxkcyBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIE5WREFUQS4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIElPQyBQYWdlIDcgdG8gdXNlIG1hc2tzIGFuZCBhZGRlZCBmaWVsZCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIFNBU0Jyb2FkY2FzdFByaW1pdGl2ZU1hc2tzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9DT05GSUdfUEFHRV9CSU9TXzQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX0NPTkZJR19QQUdFX0xPR18wLgorICogIDAyLTI5LTA4ICAwMi4wMC4wNiAgTW9kaWZpZWQgdmFyaW91cyBuYW1lcyB0byBtYWtlIHRoZW0gMzItY2hhcmFjdGVyIHVuaXF1ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNBUyBEZXZpY2UgSURzLgorICogICAgICAgICAgICAgICAgICAgICAgVXBkYXRlZCBJbnRlZ3JhdGVkIFJBSUQgY29uZmlndXJhdGlvbiBwYWdlcyBpbmNsdWRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgIE1hbnVmYWN0dXJpbmcgUGFnZSA0LCBJT0MgUGFnZSA2LCBhbmQgUkFJRCBDb25maWd1cmF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICBQYWdlIDAuCisgKiAgMDUtMjEtMDggIDAyLjAwLjA3ICBBZGRlZCBkZWZpbmUgTVBJMl9NQU5QQUdFNF9NSVhfU1NEX1NBU19TQVRBLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lIE1QSTJfTUFOUEFHRTRfUEhZU0RJU0tfMTI4TUJfQ09FUkNJT04uCisgKiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCBkZWZpbmUgTVBJMl9JT0NQQUdFOF9GTEFHU19FTkNMT1NVUkVfU0xPVF9NQVBQSU5HLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBNYXhOdW1Sb3V0ZWRTYXNBZGRyZXNzZXMgZmllbGQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfQ09ORklHX1BBR0VfRVhQQU5ERVJfMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNBUyBQb3J0IFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIHN0cnVjdHVyZSBsYXlvdXQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICBNUEkyX0NPTkZJR19QQUdFX0RSSVZFUl9NQVBQSU5HXzAuCisgKiAgMDYtMjctMDggIDAyLjAwLjA4ICBDaGFuZ2VkIE1QSTJfQ09ORklHX1BBR0VfUkRfUERJU0tfMSB0byB1c2UKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfUkFJRF9QSFlTX0RJU0sxX1BBVEhfTUFYIHRvIHNpemUgdGhlIGFycmF5LgorICogIDEwLTAyLTA4ICAwMi4wMC4wOSAgQ2hhbmdlZCBNUEkyX1JBSURfUEdBRF9DT05GSUdOVU1fTUFTSyBmcm9tIDB4MDAwMEZGRkYKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDB4MDAwMDAwRkYuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCB0d28gbmV3IHZhbHVlcyBmb3IgdGhlIFBoeXNpY2FsIERpc2sgQ29lcmNpb24gU2l6ZQorICogICAgICAgICAgICAgICAgICAgICAgYml0cyBpbiB0aGUgRmxhZ3MgZmllbGQgb2YgTWFudWZhY3R1cmluZyBQYWdlIDQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBwcm9kdWN0LXNwZWNpZmljIE1hbnVmYWN0dXJpbmcgcGFnZXMgMTYgdG8gMzEuCisgKiAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllZCBGbGFncyBiaXRzIGZvciBjb250cm9sbGluZyB3cml0ZSBjYWNoZSBvbiBTQVRBCisgKiAgICAgICAgICAgICAgICAgICAgICBkcml2ZXMgaW4gSU8gVW5pdCBQYWdlIDEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBuZXcgYml0IHRvIEFkZGl0aW9uYWxDb250cm9sRmxhZ3Mgb2YgU0FTIElPIFVuaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMSB0byBjb250cm9sIEludmFsaWQgVG9wb2xvZ3kgQ29ycmVjdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFN1cHBvcnRlZFBoeXNEaXNrcyBmaWVsZCB0byBSQUlEIFZvbHVtZSBQYWdlIDEgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBhZGRlZCByZWxhdGVkIGRlZmluZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBhZGRpdGlvbmFsIGRlZmluZXMgZm9yIFJBSUQgVm9sdW1lIFBhZ2UgMAorICogICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU3RhdHVzRmxhZ3MgZmllbGQuCisgKiAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllZCBtZWFuaW5nIG9mIFJBSUQgVm9sdW1lIFBhZ2UgMCBWb2x1bWVTZXR0aW5ncworICogICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIGZvciBhdXRvLWNvbmZpZ3VyZSBvZiBob3Qtc3dhcCBkcml2ZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBQaHlzRGlza0F0dHJpYnV0ZXMgZmllbGQgKGFuZCByZWxhdGVkIGRlZmluZXMpIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBSQUlEIFBoeXNpY2FsIERpc2sgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9TQVNfUEhZSU5GT19QSFlfVkFDQU5UIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHRocmVlIG5ldyBEaXNjb3ZlcnlTdGF0dXMgYml0cyBmb3IgU0FTIElPIFVuaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMCBhbmQgU0FTIEV4cGFuZGVyIFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgbXVsdGlwbGV4aW5nIGluZm9ybWF0aW9uIGZyb20gU0FTIElPIFVuaXQgcGFnZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBCb290RGV2aWNlV2FpdFRpbWUgZmllbGQgdG8gU0FTIElPIFVuaXQgUGFnZSA0LgorICogICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCBab25lIEFkZHJlc3MgUmVzb2x2ZWQgYml0IGZyb20gUGh5SW5mbyBhbmQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXIgUGFnZSAwIEZsYWdzIGZpZWxkLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgdHdvIG5ldyBBY2Nlc3NTdGF0dXMgdmFsdWVzIHRvIFNBUyBEZXZpY2UgUGFnZSAwCisgKiAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5kaWNhdGluZyByb3V0aW5nIHByb2JsZW1zLiBBZGRlZCAzIHJlc2VydmVkIHdvcmRzCisgKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGlzIHBhZ2UuCisgKiAgMDEtMTktMDkgIDAyLjAwLjEwICBGaXhlZCBkZWZpbmVzIGZvciBHUElPVmFsIGZpZWxkIG9mIElPIFVuaXQgUGFnZSAzLgorICogICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0ZWQgbWlzc2luZyByZXNlcnZlZCBmaWVsZCBpbnRvIHN0cnVjdHVyZSBmb3IgSU9DCisgKiAgICAgICAgICAgICAgICAgICAgICBQYWdlIDYuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBtb3JlIHBlbmRpbmcgdGFzayBiaXRzIHRvIFJBSUQgVm9sdW1lIFBhZ2UgMAorICogICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU3RhdHVzRmxhZ3MgZGVmaW5lcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfUEhZU0RJU0swX1NUQVRVU19GTEFHX05PVF9DRVJUSUZJRUQgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYSBuZXcgRGlzY292ZXJ5U3RhdHVzIGJpdCBmb3IgU0FTIElPIFVuaXQgUGFnZSAwCisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgU0FTIEV4cGFuZGVyIFBhZ2UgMCB0byBmbGFnIGEgZG93bnN0cmVhbSBpbml0aWF0b3IKKyAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gaW4gc2ltcGxpZmllZCByb3V0aW5nIG1vZGUuCisgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIFNBVEEgSW5pdCBGYWlsdXJlIGRlZmluZXMgZm9yIERpc2NvdmVyeVN0YXR1cworICogICAgICAgICAgICAgICAgICAgICAgZmllbGRzIG9mIFNBUyBJTyBVbml0IFBhZ2UgMCBhbmQgU0FTIEV4cGFuZGVyIFBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfU0FTX0RFVklDRTBfQVNUQVRVU19ERVZJQ0VfQkxPQ0tFRCBkZWZpbmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBQb3J0R3JvdXBzLCBEbWFHcm91cCwgYW5kIENvbnRyb2xHcm91cCBmaWVsZHMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIFNBUyBEZXZpY2UgUGFnZSAwLgorICogIDA1LTA2LTA5ICAwMi4wMC4xMSAgQWRkZWQgc3RydWN0dXJlcyBhbmQgZGVmaW5lcyBmb3IgSU8gVW5pdCBQYWdlIDUgYW5kIElPCisgKiAgICAgICAgICAgICAgICAgICAgICBVbml0IFBhZ2UgNi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGV4cGFuZGVyIHJlZHVjZWQgZnVuY3Rpb25hbGl0eSBkYXRhIHRvIFNBUworICogICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXIgUGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgU0FTIFBIWSBQYWdlIDIgYW5kIFNBUyBQSFkgUGFnZSAzLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waTJfaW5pdC5oCisgKiAgMDQtMzAtMDcgIDAyLjAwLjAwICBDb3JyZXNwb25kcyB0byBGdXNpb24tTVBUIE1QSSBTcGVjaWZpY2F0aW9uIFJldiBBLgorICogIDEwLTMxLTA3ICAwMi4wMC4wMSAgRml4ZWQgbmFtZSBmb3IgcE1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QuCisgKiAgMTItMTgtMDcgIDAyLjAwLjAyICBNb2RpZmllZCBUYXNrIE1hbmFnZW1lbnQgVGFyZ2V0IFJlc2V0IE1ldGhvZCBkZWZpbmVzLgorICogIDAyLTI5LTA4ICAwMi4wMC4wMyAgQWRkZWQgUXVlcnkgVGFzayBTZXQgYW5kIFF1ZXJ5IFVuaXQgQXR0ZW50aW9uLgorICogIDAzLTAzLTA4ICAwMi4wMC4wNCAgRml4ZWQgbmFtZSBvZiBzdHJ1Y3QgX01QSTJfU0NTSV9UQVNLX01BTkFHRV9SRVBMWS4KKyAqICAwNS0yMS0wOCAgMDIuMDAuMDUgIEZpeGVkIHR5cG8gaW4gbmFtZSBvZiBNcGkyU2VwUmVxdWVzdF90LgorICogIDEwLTAyLTA4ICAwMi4wMC4wNiAgUmVtb3ZlZCBVbnRhZ2dlZCBhbmQgTm8gRGlzY29ubmVjdCB2YWx1ZXMgZnJvbSBTQ1NJIElPCisgKiAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGZpZWxkIFRhc2sgQXR0cmlidXRlIGZsYWdzLgorICogICAgICAgICAgICAgICAgICAgICAgTW92ZWQgTFVOIGZpZWxkIGRlZmluZXMgdG8gbXBpMi5oIGJlY2FzdWUgdGhleSBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbiB0byBtYW55IHN0cnVjdHVyZXMuCisgKiAgMDUtMDYtMDkgIDAyLjAwLjA3ICBDaGFuZ2VkIHRhc2sgbWFuYWdlbWVudCB0eXBlIG9mIFF1ZXJ5IFVuaXQgQXR0ZW50aW9uIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBRdWVyeSBBc3luY2hyb25vdXMgRXZlbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVkIHR3byBuZXcgYml0cyBpbiB0aGUgU2xvdFN0YXR1cyBmaWVsZCBvZiB0aGUgU0NTSQorICogICAgICAgICAgICAgICAgICAgICAgRW5jbG9zdXJlIFByb2Nlc3NvciBSZXF1ZXN0IGFuZCBSZXBseS4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittcGkyX2lvYy5oCisgKiAgMDQtMzAtMDcgIDAyLjAwLjAwICBDb3JyZXNwb25kcyB0byBGdXNpb24tTVBUIE1QSSBTcGVjaWZpY2F0aW9uIFJldiBBLgorICogIDA2LTA0LTA3ICAwMi4wMC4wMSAgSW4gSU9DRmFjdHMgUmVwbHkgc3RydWN0dXJlLCByZW5hbWVkIE1heERldmljZXMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIE1heFRhcmdldHMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBUb3RhbEltYWdlU2l6ZSBmaWVsZCB0byBGV0Rvd25sb2FkIFJlcXVlc3QuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCByZXNlcnZlZCB3b3JkcyB0byBGV1VwbG9hZCBSZXF1ZXN0LgorICogIDA2LTI2LTA3ICAwMi4wMC4wMiAgQWRkZWQgSVIgQ29uZmlndXJhdGlvbiBDaGFuZ2UgTGlzdCBFdmVudC4KKyAqICAwOC0zMS0wNyAgMDIuMDAuMDMgIFJlbW92ZWQgU3lzdGVtUmVwbHlRdWV1ZURlcHRoIGZpZWxkIGZyb20gdGhlIElPQ0luaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgYW5kIHJlcGxhY2VkIGl0IHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgIFJlcGx5RGVzY3JpcHRvclBvc3RRdWV1ZURlcHRoIGFuZCBSZXBseUZyZWVRdWV1ZURlcHRoLgorICogICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZWQgdGhlIE1pblJlcGx5UXVldWVEZXB0aCBmaWVsZCBvZiB0aGUgSU9DRmFjdHMKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlcGx5IHdpdGggTWF4UmVwbHlEZXNjcmlwdG9yUG9zdFF1ZXVlRGVwdGguCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX1JEUFFfREVQVEhfTUlOIGRlZmluZSB0byBzcGVjaWZ5IHRoZSBtaW5pbXVtCisgKiAgICAgICAgICAgICAgICAgICAgICBkZXB0aCBmb3IgdGhlIFJlcGx5IERlc2NyaXB0b3IgUG9zdCBRdWV1ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNBU0FkZHJlc3MgZmllbGQgdG8gSW5pdGlhdG9yIERldmljZSBUYWJsZQorICogICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3cgRXZlbnQgZGF0YS4KKyAqICAxMC0zMS0wNyAgMDIuMDAuMDQgIEFkZGVkIFJlYXNvbkNvZGUgTVBJMl9FVkVOVF9TQVNfSU5JVF9SQ19OT1RfUkVTUE9ORElORworICogICAgICAgICAgICAgICAgICAgICAgZm9yIFNBUyBJbml0aWF0b3IgRGV2aWNlIFN0YXR1cyBDaGFuZ2UgRXZlbnQgZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIFJlYXNvbiBDb2RlIGRlZmluZXMgZm9yIFNBUyBUb3BvbG9neSBDaGFuZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgIExpc3QgRXZlbnQgZGF0YSwgaW5jbHVkaW5nIGFkZGluZyBhIGJpdCBmb3IgUEhZIFZhY2FudAorICogICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhbmQgYWRkaW5nIGEgbWFzayBmb3IgdGhlIFJlYXNvbiBDb2RlLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgTVBJMl9FVkVOVF9TQVNfVE9QT19FU19ERUxBWV9OT1RfUkVTUE9ORElORy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGRlZmluZSBmb3IgTVBJMl9FWFRfSU1BR0VfVFlQRV9NRUdBUkFJRC4KKyAqICAxMi0xOC0wNyAgMDIuMDAuMDUgIEFkZGVkIEJvb3QgU3RhdHVzIGRlZmluZXMgZm9yIHRoZSBJT0NFeGNlcHRpb25zIGZpZWxkIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgSU9DRmFjdHMgUmVwbHkuCisgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9FWFRFTkRFRF9CVUZGRVIgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgTW92ZWQgTVBJMl9WRVJTSU9OX1VOSU9OIHRvIG1waTIuaC4KKyAqICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgTVBJMl9FVkVOVF9OT1RJRklDQVRJT05fUkVRVUVTVCB0byB1c2UgbWFza3MKKyAqICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgZW5hYmxlcywgYW5kIGFkZGVkIFNBU0Jyb2FkY2FzdFByaW1pdGl2ZU1hc2tzCisgKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIExvZyBFbnRyeSBBZGRlZCBFdmVudCBhbmQgcmVsYXRlZCBzdHJ1Y3R1cmUuCisgKiAgMDItMjktMDggIDAyLjAwLjA2ICBBZGRlZCBkZWZpbmUgTVBJMl9JT0NGQUNUU19DQVBBQklMSVRZX0lOVEVHUkFURURfUkFJRC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgZGVmaW5lIE1QSTJfSU9DRkFDVFNfUFJPVE9DT0xfU01QX1RBUkdFVC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1heFZvbHVtZXMgYW5kIE1heFBlcnNpc3RlbnRFbnRyaWVzIGZpZWxkcyB0bworICogICAgICAgICAgICAgICAgICAgICAgSU9DRmFjdHMgcmVwbHkuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBQcm90b2NhbEZsYWdzIGFuZCBJT0NDYXBhYmlsaXRpZXMgZmllbGRzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBNUEkyX0ZXX0lNQUdFX0hFQURFUi4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgTVBJMl9QT1JURU5BQkxFX0ZMQUdTX0VOQUJMRV9TSU5HTEVfUE9SVC4KKyAqICAwMy0wMy0wOCAgMDIuMDAuMDcgIEZpeGVkIE1QSTJfRldfSU1BR0VfSEVBREVSIGJ5IGNoYW5naW5nIFJlc2VydmVkMjYgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIGEgVTE2IChmcm9tIGEgVTMyKS4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgZXh0cmEgJ3MnIGZyb20gRXZlbnRNYXNrcyBuYW1lLgorICogIDA2LTI3LTA4ICAwMi4wMC4wOCAgRml4ZWQgYW4gb2Zmc2V0IGluIGEgY29tbWVudC4KKyAqICAxMC0wMi0wOCAgMDIuMDAuMDkgIFJlbW92ZWQgU3lzdGVtUmVwbHlGcmFtZVNpemUgZnJvbSBNUEkyX0lPQ19JTklUX1JFUVVFU1QuCisgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIEN1clJlcGx5RnJhbWVTaXplIGZyb20gTVBJMl9JT0NfRkFDVFNfUkVQTFkgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICByZW5hbWVkIE1pblJlcGx5RnJhbWVTaXplIHRvIFJlcGx5RnJhbWVTaXplLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9JT0NGQUNUU19FWENFUFRfSVJfRk9SRUlHTl9DT05GSUdfTUFYLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgdHdvIG5ldyBSQUlET3BlcmF0aW9uIHZhbHVlcyBmb3IgSW50ZWdyYXRlZCBSQUlECisgKiAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25zIFN0YXR1cyBFdmVudCBkYXRhLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZm91ciBuZXcgSVIgQ29uZmlndXJhdGlvbiBDaGFuZ2UgTGlzdCBFdmVudCBkYXRhCisgKiAgICAgICAgICAgICAgICAgICAgICBSZWFzb25Db2RlIHZhbHVlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHR3byBuZXcgUmVhc29uQ29kZSBkZWZpbmVzIGZvciBTQVMgRGV2aWNlIFN0YXR1cworICogICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIEV2ZW50IGRhdGEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCB0aHJlZSBuZXcgRGlzY292ZXJ5U3RhdHVzIGJpdHMgZm9yIHRoZSBTQVMKKyAqICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBldmVudCBkYXRhLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTXVsdGlwbGV4aW5nIFN0YXR1cyBDaGFuZ2UgYml0IHRvIHRoZSBQaHlTdGF0dXMKKyAqICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBTQVMgVG9wb2xvZ3kgQ2hhbmdlIExpc3QgZXZlbnQgZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgZGVmaW5lIGZvciBNUEkyX0lOSVRfSU1BR0VfQk9PVEZMQUdTX1hNRU1DT1BZLgorICogICAgICAgICAgICAgICAgICAgICAgQm9vdEZsYWdzIGFyZSBub3cgcHJvZHVjdC1zcGVjaWZpYy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGRlZmluZXMgZm9yIHRoZSBpbmRpdmR1YWwgc2lnbmF0dXJlIGJ5dGVzCisgKiAgICAgICAgICAgICAgICAgICAgICBmb3IgTVBJMl9JTklUX0lNQUdFX0ZPT1RFUi4KKyAqICAwMS0xOS0wOSAgMDIuMDAuMTAgIEFkZGVkIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9FVkVOVF9SRVBMQVkgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9FVkVOVF9TQVNfRElTQ19EU19ET1dOU1RSRUFNX0lOSVRJQVRPUgorICogICAgICAgICAgICAgICAgICAgICAgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfU0FUQV9JTklUX0ZBSUxVUkUKKyAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgTVBJMl9FVkVOVF9TQVNfRElTQ19EU19TQVRBX0lOSVRfRkFJTFVSRSBkZWZpbmUuCisgKiAgMDUtMDYtMDkgIDAyLjAwLjExICBBZGRlZCBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfUkFJRF9BQ0NFTEVSQVRPUiBkZWZpbmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfTVNJX1hfSU5ERVggZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgdHdvIG5ldyByZWFzb24gY29kZXMgZm9yIFNBUyBEZXZpY2UgU3RhdHVzIENoYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgRXZlbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBuZXcgZXZlbnQ6IFNBUyBQSFkgQ291bnRlci4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittcGkyX3JhaWQuaAorICogIDA0LTMwLTA3ICAwMi4wMC4wMCAgQ29ycmVzcG9uZHMgdG8gRnVzaW9uLU1QVCBNUEkgU3BlY2lmaWNhdGlvbiBSZXYgQS4KKyAqICAwOC0zMS0wNyAgMDIuMDAuMDEgIE1vZGlmaWNhdGlvbnMgdG8gUkFJRCBBY3Rpb24gcmVxdWVzdCBhbmQgcmVwbHksCisgKiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIEFjdGlvbnMgYW5kIEFjdGlvbkRhdGEuCisgKiAgMDItMjktMDggIDAyLjAwLjAyICBBZGRlZCBNUEkyX1JBSURfQUNUSU9OX0FEQVRBX0RJU0FCTF9GVUxMX1JFQlVJTEQuCisgKiAgMDUtMjEtMDggIDAyLjAwLjAzICBBZGRlZCBNUEkyX1JBSURfVk9MX0NSRUFUSU9OX05VTV9QSFlTRElTS1Mgc28gdGhhdAorICogICAgICAgICAgICAgICAgICAgICAgdGhlIFBoeXNEaXNrIGFycmF5IGluIE1QSTJfUkFJRF9WT0xVTUVfQ1JFQVRJT05fU1RSVUNUCisgKiAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgc2l6ZWQgYnkgdGhlIGJ1aWxkIGVudmlyb25tZW50LgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waTJfc2FzLmgKKyAqICAwNC0zMC0wNyAgMDIuMDAuMDAgIENvcnJlc3BvbmRzIHRvIEZ1c2lvbi1NUFQgTVBJIFNwZWNpZmljYXRpb24gUmV2IEEuCisgKiAgMDYtMjYtMDcgIDAyLjAwLjAxICBBZGRlZCBDbGVhciBBbGwgUGVyc2lzdGVudCBPcGVyYXRpb24gdG8gU0FTIElPIFVuaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgUmVxdWVzdC4KKyAqICAxMC0wMi0wOCAgMDIuMDAuMDIgIEFkZGVkIFNldCBJT0MgUGFyYW1ldGVyIE9wZXJhdGlvbiB0byBTQVMgSU8gVW5pdCBDb250cm9sCisgKiAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0LgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waTJfdGFyZy5oCisgKiAgMDQtMzAtMDcgIDAyLjAwLjAwICBDb3JyZXNwb25kcyB0byBGdXNpb24tTVBUIE1QSSBTcGVjaWZpY2F0aW9uIFJldiBBLgorICogIDA4LTMxLTA3ICAwMi4wMC4wMSAgQWRkZWQgQ29tbWFuZCBCdWZmZXIgRGF0YSBMb2NhdGlvbiBBZGRyZXNzIFNwYWNlIGJpdHMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclBvc3RGbGFncyBmaWVsZCBvZiBDb21tYW5kQnVmZmVyUG9zdEJhc2UgUmVxdWVzdC4KKyAqICAwMi0yOS0wOCAgMDIuMDAuMDIgIE1vZGlmaWVkIHZhcmlvdXMgbmFtZXMgdG8gbWFrZSB0aGVtIDMyLWNoYXJhY3RlciB1bmlxdWUuCisgKiAgMTAtMDItMDggIDAyLjAwLjAzICBSZW1vdmVkIE5leHRDbWRCdWZmZXJPZmZzZXQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgTVBJMl9UQVJHRVRfQ01EX0JVRl9QT1NUX0JBU0VfUkVRVUVTVC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCBTdGF0dXMgU2VuZCBSZXF1ZXN0IG9ubHkgdGFrZXMgYSBzaW5nbGUgU0dFIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgZGF0YS4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittcGkyX3Rvb2wuaAorICogIDA0LTMwLTA3ICAwMi4wMC4wMCAgQ29ycmVzcG9uZHMgdG8gRnVzaW9uLU1QVCBNUEkgU3BlY2lmaWNhdGlvbiBSZXYgQS4KKyAqICAxMi0xOC0wNyAgMDIuMDAuMDEgIEFkZGVkIERpYWdub3N0aWMgQnVmZmVyIFBvc3QgYW5kIERpYWdub3N0aWMgUmVsZWFzZQorICogICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcyBhbmQgZGVmaW5lcy4KKyAqICAwMi0yOS0wOCAgMDIuMDAuMDIgIE1vZGlmaWVkIHZhcmlvdXMgbmFtZXMgdG8gbWFrZSB0aGVtIDMyLWNoYXJhY3RlciB1bmlxdWUuCisgKiAgMDUtMDYtMDkgIDAyLjAwLjAzICBBZGRlZCBJU1RXSSBSZWFkIFdyaXRlIFRvb2wgYW5kIERpYWdub3N0aWMgQ0xJIFRvb2wuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXBpMl90eXBlLmgKKyAqICAwNC0zMC0wNyAgMDIuMDAuMDAgIENvcnJlc3BvbmRzIHRvIEZ1c2lvbi1NUFQgTVBJIFNwZWNpZmljYXRpb24gUmV2IEEuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXBpMl9yYS5oCisgKiAgMDUtMDYtMDkgIDAyLjAwLjAwICBJbml0aWFsIHZlcnNpb24uCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXBpMl9oaXN0b3J5LnR4dCAgICAgICAgIFBhcnRzIGxpc3QgaGlzdG9yeQorCitGaWxlbmFtZSAgICAgMDIuMDAuMTIKKy0tLS0tLS0tLS0gICAtLS0tLS0tLQorbXBpMi5oICAgICAgIDAyLjAwLjEyCittcGkyX2NuZmcuaCAgMDIuMDAuMTEKK21waTJfaW5pdC5oICAwMi4wMC4wNworbXBpMl9pb2MuaCAgIDAyLjAwLjExCittcGkyX3JhaWQuaCAgMDIuMDAuMDMKK21waTJfc2FzLmggICAwMi4wMC4wMgorbXBpMl90YXJnLmggIDAyLjAwLjAzCittcGkyX3Rvb2wuaCAgMDIuMDAuMDMKK21waTJfdHlwZS5oICAwMi4wMC4wMAorbXBpMl9yYS5oICAgIDAyLjAwLjAwCisKK0ZpbGVuYW1lICAgICAwMi4wMC4xMSAgMDIuMDAuMTAgIDAyLjAwLjA5ICAwMi4wMC4wOCAgMDIuMDAuMDcgIDAyLjAwLjA2CistLS0tLS0tLS0tICAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLQorbXBpMi5oICAgICAgIDAyLjAwLjExICAwMi4wMC4xMCAgMDIuMDAuMDkgIDAyLjAwLjA4ICAwMi4wMC4wNyAgMDIuMDAuMDYKK21waTJfY25mZy5oICAwMi4wMC4xMCAgMDIuMDAuMDkgIDAyLjAwLjA4ICAwMi4wMC4wNyAgMDIuMDAuMDYgIDAyLjAwLjA2CittcGkyX2luaXQuaCAgMDIuMDAuMDYgIDAyLjAwLjA2ICAwMi4wMC4wNSAgMDIuMDAuMDUgIDAyLjAwLjA0ICAwMi4wMC4wMworbXBpMl9pb2MuaCAgIDAyLjAwLjEwICAwMi4wMC4wOSAgMDIuMDAuMDggIDAyLjAwLjA3ICAwMi4wMC4wNyAgMDIuMDAuMDYKK21waTJfcmFpZC5oICAwMi4wMC4wMyAgMDIuMDAuMDMgIDAyLjAwLjAzICAwMi4wMC4wMyAgMDIuMDAuMDIgIDAyLjAwLjAyCittcGkyX3Nhcy5oICAgMDIuMDAuMDIgIDAyLjAwLjAyICAwMi4wMC4wMSAgMDIuMDAuMDEgIDAyLjAwLjAxICAwMi4wMC4wMQorbXBpMl90YXJnLmggIDAyLjAwLjAzICAwMi4wMC4wMyAgMDIuMDAuMDIgIDAyLjAwLjAyICAwMi4wMC4wMiAgMDIuMDAuMDIKK21waTJfdG9vbC5oICAwMi4wMC4wMiAgMDIuMDAuMDIgIDAyLjAwLjAyICAwMi4wMC4wMiAgMDIuMDAuMDIgIDAyLjAwLjAyCittcGkyX3R5cGUuaCAgMDIuMDAuMDAgIDAyLjAwLjAwICAwMi4wMC4wMCAgMDIuMDAuMDAgIDAyLjAwLjAwICAwMi4wMC4wMAorCitGaWxlbmFtZSAgICAgMDIuMDAuMDUgIDAyLjAwLjA0ICAwMi4wMC4wMyAgMDIuMDAuMDIgIDAyLjAwLjAxICAwMi4wMC4wMAorLS0tLS0tLS0tLSAgIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0KK21waTIuaCAgICAgICAwMi4wMC4wNSAgMDIuMDAuMDQgIDAyLjAwLjAzICAwMi4wMC4wMiAgMDIuMDAuMDEgIDAyLjAwLjAwCittcGkyX2NuZmcuaCAgMDIuMDAuMDUgIDAyLjAwLjA0ICAwMi4wMC4wMyAgMDIuMDAuMDIgIDAyLjAwLjAxICAwMi4wMC4wMAorbXBpMl9pbml0LmggIDAyLjAwLjAyICAwMi4wMC4wMSAgMDIuMDAuMDAgIDAyLjAwLjAwICAwMi4wMC4wMCAgMDIuMDAuMDAKK21waTJfaW9jLmggICAwMi4wMC4wNSAgMDIuMDAuMDQgIDAyLjAwLjAzICAwMi4wMC4wMiAgMDIuMDAuMDEgIDAyLjAwLjAwCittcGkyX3JhaWQuaCAgMDIuMDAuMDEgIDAyLjAwLjAxICAwMi4wMC4wMSAgMDIuMDAuMDAgIDAyLjAwLjAwICAwMi4wMC4wMAorbXBpMl9zYXMuaCAgIDAyLjAwLjAxICAwMi4wMC4wMSAgMDIuMDAuMDEgIDAyLjAwLjAxICAwMi4wMC4wMCAgMDIuMDAuMDAKK21waTJfdGFyZy5oICAwMi4wMC4wMSAgMDIuMDAuMDEgIDAyLjAwLjAxICAwMi4wMC4wMCAgMDIuMDAuMDAgIDAyLjAwLjAwCittcGkyX3Rvb2wuaCAgMDIuMDAuMDEgIDAyLjAwLjAwICAwMi4wMC4wMCAgMDIuMDAuMDAgIDAyLjAwLjAwICAwMi4wMC4wMAorbXBpMl90eXBlLmggIDAyLjAwLjAwICAwMi4wMC4wMCAgMDIuMDAuMDAgIDAyLjAwLjAwICAwMi4wMC4wMCAgMDIuMDAuMDAKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW5pdC5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW5pdC5oCmluZGV4IGYxMTE1ZjAuLjU2M2U1NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2luaXQuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9pbml0LmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDggTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA5IExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGkyX2luaXQuaAogICogICAgICAgICAgVGl0bGU6ICBNUEkgU0NTSSBpbml0aWF0b3IgbW9kZSBtZXNzYWdlcyBhbmQgc3RydWN0dXJlcwogICogIENyZWF0aW9uIERhdGU6ICBKdW5lIDIzLCAyMDA2CiAgKgotICogICAgbXBpMl9pbml0LmggVmVyc2lvbjogIDAyLjAwLjA2CisgKiAgICBtcGkyX2luaXQuaCBWZXJzaW9uOiAgMDIuMDAuMDcKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC0yMyw2ICsyMywxMCBAQAogICogICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBmaWVsZCBUYXNrIEF0dHJpYnV0ZSBmbGFncy4KICAqICAgICAgICAgICAgICAgICAgICAgIE1vdmVkIExVTiBmaWVsZCBkZWZpbmVzIHRvIG1waTIuaCBiZWNhc3VlIHRoZXkgYXJlCiAgKiAgICAgICAgICAgICAgICAgICAgICBjb21tb24gdG8gbWFueSBzdHJ1Y3R1cmVzLgorICogIDA1LTA2LTA5ICAwMi4wMC4wNyAgQ2hhbmdlZCB0YXNrIG1hbmFnZW1lbnQgdHlwZSBvZiBRdWVyeSBVbml0IEF0dGVudGlvbiB0bworICogICAgICAgICAgICAgICAgICAgICAgUXVlcnkgQXN5bmNocm9ub3VzIEV2ZW50LgorICogICAgICAgICAgICAgICAgICAgICAgRGVmaW5lZCB0d28gbmV3IGJpdHMgaW4gdGhlIFNsb3RTdGF0dXMgZmllbGQgb2YgdGhlIFNDU0kKKyAqICAgICAgICAgICAgICAgICAgICAgIEVuY2xvc3VyZSBQcm9jZXNzb3IgUmVxdWVzdCBhbmQgUmVwbHkuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC0yODksNyArMjkzLDExIEBACiAjZGVmaW5lIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1FVRVJZX1RBU0sgICAgICAgICAgICgweDA3KQogI2RlZmluZSBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9DTFJfQUNBICAgICAgICAgICAgICAoMHgwOCkKICNkZWZpbmUgTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfUVJZX1RBU0tfU0VUICAgICAgICAgKDB4MDkpCi0jZGVmaW5lIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1FSWV9VTklUX0FUVEVOVElPTiAgICgweDBBKQorI2RlZmluZSBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9RUllfQVNZTkNfRVZFTlQgICAgICAoMHgwQSkKKworLyogb2Jzb2xldGUgVGFza1R5cGUgbmFtZSAqLworI2RlZmluZSBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9RUllfVU5JVF9BVFRFTlRJT04JXAorCShNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9RUllfQVNZTkNfRVZFTlQpCiAKIC8qIE1zZ0ZsYWdzIGJpdHMgKi8KIApAQCAtMzc1LDYgKzM4Myw4IEBACiAjZGVmaW5lIE1QSTJfU0VQX1JFUV9TTE9UU1RBVFVTX0hPVF9TUEFSRSAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQogI2RlZmluZSBNUEkyX1NFUF9SRVFfU0xPVFNUQVRVU19VTkNPTkZJR1VSRUQgICAgICAgICAgICAoMHgwMDAwMDA4MCkKICNkZWZpbmUgTVBJMl9TRVBfUkVRX1NMT1RTVEFUVVNfUFJFRElDVEVEX0ZBVUxUICAgICAgICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIE1QSTJfU0VQX1JFUV9TTE9UU1RBVFVTX0lOX0NSSVRJQ0FMX0FSUkFZICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNUEkyX1NFUF9SRVFfU0xPVFNUQVRVU19JTl9GQUlMRURfQVJSQVkgICAgICAgICAoMHgwMDAwMDAwOCkKICNkZWZpbmUgTVBJMl9TRVBfUkVRX1NMT1RTVEFUVVNfREVWX1JFQlVJTERJTkcgICAgICAgICAgKDB4MDAwMDAwMDQpCiAjZGVmaW5lIE1QSTJfU0VQX1JFUV9TTE9UU1RBVFVTX0RFVl9GQVVMVFkgICAgICAgICAgICAgICgweDAwMDAwMDAyKQogI2RlZmluZSBNUEkyX1NFUF9SRVFfU0xPVFNUQVRVU19OT19FUlJPUiAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKQEAgLTQxMCw2ICs0MjAsOCBAQAogI2RlZmluZSBNUEkyX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0hPVF9TUEFSRSAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKICNkZWZpbmUgTVBJMl9TRVBfUkVQTFlfU0xPVFNUQVRVU19VTkNPTkZJR1VSRUQgICAgICAgICAgKDB4MDAwMDAwODApCiAjZGVmaW5lIE1QSTJfU0VQX1JFUExZX1NMT1RTVEFUVVNfUFJFRElDVEVEX0ZBVUxUICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNUEkyX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0lOX0NSSVRJQ0FMX0FSUkFZICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJMl9TRVBfUkVQTFlfU0xPVFNUQVRVU19JTl9GQUlMRURfQVJSQVkgICAgICAgKDB4MDAwMDAwMDgpCiAjZGVmaW5lIE1QSTJfU0VQX1JFUExZX1NMT1RTVEFUVVNfREVWX1JFQlVJTERJTkcgICAgICAgICgweDAwMDAwMDA0KQogI2RlZmluZSBNUEkyX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0RFVl9GQVVMVFkgICAgICAgICAgICAoMHgwMDAwMDAwMikKICNkZWZpbmUgTVBJMl9TRVBfUkVQTFlfU0xPVFNUQVRVU19OT19FUlJPUiAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9pb2MuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCmluZGV4IDhjNWQ4MTguLmMyOTQxMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgSU9DLCBQb3J0LCBFdmVudCwgRlcgRG93bmxvYWQsIGFuZCBGVyBVcGxvYWQgbWVzc2FnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgT2N0b2JlciAxMSwgMjAwNgogICoKLSAqICBtcGkyX2lvYy5oIFZlcnNpb246ICAwMi4wMC4xMAorICogIG1waTJfaW9jLmggVmVyc2lvbjogIDAyLjAwLjExCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNzksNiArNzksMTEgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX1NBVEFfSU5JVF9GQUlMVVJFCiAgKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUuCiAgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIE1QSTJfRVZFTlRfU0FTX0RJU0NfRFNfU0FUQV9JTklUX0ZBSUxVUkUgZGVmaW5lLgorICogIDA1LTA2LTA5ICAwMi4wMC4xMSAgQWRkZWQgTVBJMl9JT0NGQUNUU19DQVBBQklMSVRZX1JBSURfQUNDRUxFUkFUT1IgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9JT0NGQUNUU19DQVBBQklMSVRZX01TSV9YX0lOREVYIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHR3byBuZXcgcmVhc29uIGNvZGVzIGZvciBTQVMgRGV2aWNlIFN0YXR1cyBDaGFuZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbmV3IGV2ZW50OiBTQVMgUEhZIENvdW50ZXIuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC0yNjEsNiArMjY2LDggQEAKIC8qIFByb2R1Y3RJRCBmaWVsZCB1c2VzIE1QSTJfRldfSEVBREVSX1BJRF8gKi8KIAogLyogSU9DQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9NU0lfWF9JTkRFWCAgICAgICAgICAgICgweDAwMDA4MDAwKQorI2RlZmluZSBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfUkFJRF9BQ0NFTEVSQVRPUiAgICAgICAoMHgwMDAwNDAwMCkKICNkZWZpbmUgTVBJMl9JT0NGQUNUU19DQVBBQklMSVRZX0VWRU5UX1JFUExBWSAgICAgICAgICAgKDB4MDAwMDIwMDApCiAjZGVmaW5lIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9JTlRFR1JBVEVEX1JBSUQgICAgICAgICgweDAwMDAxMDAwKQogI2RlZmluZSBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfVExSICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDgwMCkKQEAgLTQ0MCw2ICs0NDcsNyBAQAogI2RlZmluZSBNUEkyX0VWRU5UX0lSX1BIWVNJQ0FMX0RJU0sgICAgICAgICAgICAgICAgICgweDAwMUYpCiAjZGVmaW5lIE1QSTJfRVZFTlRfSVJfQ09ORklHVVJBVElPTl9DSEFOR0VfTElTVCAgICAgKDB4MDAyMCkKICNkZWZpbmUgTVBJMl9FVkVOVF9MT0dfRU5UUllfQURERUQgICAgICAgICAgICAgICAgICAoMHgwMDIxKQorI2RlZmluZSBNUEkyX0VWRU5UX1NBU19QSFlfQ09VTlRFUiAgICAgICAgICAgICAgICAgICgweDAwMjIpCiAKIAogLyogTG9nIEVudHJ5IEFkZGVkIEV2ZW50IGRhdGEgKi8KQEAgLTUwMiwxNyArNTEwLDE5IEBACiAgIE1QSTJfUE9JTlRFUiBwTXBpMkV2ZW50RGF0YVNhc0RldmljZVN0YXR1c0NoYW5nZV90OwogCiAvKiBTQVMgRGV2aWNlIFN0YXR1cyBDaGFuZ2UgRXZlbnQgZGF0YSBSZWFzb25Db2RlIHZhbHVlcyAqLwotI2RlZmluZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19TTUFSVF9EQVRBICAgICAgICAgICAgICAgKDB4MDUpCi0jZGVmaW5lIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAoMHgwNykKLSNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfSU5URVJOQUxfREVWSUNFX1JFU0VUICAgICgweDA4KQotI2RlZmluZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19UQVNLX0FCT1JUX0lOVEVSTkFMICAgICAgKDB4MDkpCi0jZGVmaW5lIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0FCT1JUX1RBU0tfU0VUX0lOVEVSTkFMICAoMHgwQSkKLSNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfQ0xFQVJfVEFTS19TRVRfSU5URVJOQUwgICgweDBCKQotI2RlZmluZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19RVUVSWV9UQVNLX0lOVEVSTkFMICAgICAgKDB4MEMpCi0jZGVmaW5lIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0FTWU5DX05PVElGSUNBVElPTiAgICAgICAoMHgwRCkKLSNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfQ01QX0lOVEVSTkFMX0RFVl9SRVNFVCAgICgweDBFKQotI2RlZmluZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19DTVBfVEFTS19BQk9SVF9JTlRFUk5BTCAgKDB4MEYpCi0jZGVmaW5lIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX1NBVEFfSU5JVF9GQUlMVVJFICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfU01BUlRfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDA1KQorI2RlZmluZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDcpCisjZGVmaW5lIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0lOVEVSTkFMX0RFVklDRV9SRVNFVCAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfVEFTS19BQk9SVF9JTlRFUk5BTCAgICAgICAgICAgICAgICAgICgweDA5KQorI2RlZmluZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19BQk9SVF9UQVNLX1NFVF9JTlRFUk5BTCAgICAgICAgICAgICAgKDB4MEEpCisjZGVmaW5lIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0NMRUFSX1RBU0tfU0VUX0lOVEVSTkFMICAgICAgICAgICAgICAoMHgwQikKKyNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfUVVFUllfVEFTS19JTlRFUk5BTCAgICAgICAgICAgICAgICAgICgweDBDKQorI2RlZmluZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19BU1lOQ19OT1RJRklDQVRJT04gICAgICAgICAgICAgICAgICAgKDB4MEQpCisjZGVmaW5lIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0NNUF9JTlRFUk5BTF9ERVZfUkVTRVQgICAgICAgICAgICAgICAoMHgwRSkKKyNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfQ01QX1RBU0tfQUJPUlRfSU5URVJOQUwgICAgICAgICAgICAgICgweDBGKQorI2RlZmluZSBNUEkyX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19TQVRBX0lOSVRfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1QSTJfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0VYUEFOREVSX1JFRFVDRURfRlVOQ1RJT05BTElUWSAgICAgICAoMHgxMSkKKyNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfQ01QX0VYUEFOREVSX1JFRFVDRURfRlVOQ1RJT05BTElUWSAgICgweDEyKQogCiAKIC8qIEludGVncmF0ZWQgUkFJRCBPcGVyYXRpb24gU3RhdHVzIEV2ZW50IGRhdGEgKi8KQEAgLTgyMiw2ICs4MzIsMzcgQEAKICNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfRU5DTF9SQ19OT1RfUkVTUE9ORElORyAgICAgICAoMHgwMikKIAogCisvKiBTQVMgUEhZIENvdW50ZXIgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9FVkVOVF9EQVRBX1NBU19QSFlfQ09VTlRFUiB7CisgICAgVTY0ICAgICAgICAgVGltZVN0YW1wOyAgICAgICAgICAvKiAweDAwICovCisgICAgVTMyICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAweDA4ICovCisgICAgVTggICAgICAgICAgUGh5RXZlbnRDb2RlOyAgICAgICAvKiAweDBDICovCisgICAgVTggICAgICAgICAgUGh5TnVtOyAgICAgICAgICAgICAvKiAweDBEICovCisgICAgVTE2ICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAweDBFICovCisgICAgVTMyICAgICAgICAgUGh5RXZlbnRJbmZvOyAgICAgICAvKiAweDEwICovCisgICAgVTggICAgICAgICAgQ291bnRlclR5cGU7ICAgICAgICAvKiAweDE0ICovCisgICAgVTggICAgICAgICAgVGhyZXNob2xkV2luZG93OyAgICAvKiAweDE1ICovCisgICAgVTggICAgICAgICAgVGltZVVuaXRzOyAgICAgICAgICAvKiAweDE2ICovCisgICAgVTggICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAweDE3ICovCisgICAgVTMyICAgICAgICAgRXZlbnRUaHJlc2hvbGQ7ICAgICAvKiAweDE4ICovCisgICAgVTE2ICAgICAgICAgVGhyZXNob2xkRmxhZ3M7ICAgICAvKiAweDFDICovCisgICAgVTE2ICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAvKiAweDFFICovCit9IE1QSTJfRVZFTlRfREFUQV9TQVNfUEhZX0NPVU5URVIsCisgIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9FVkVOVF9EQVRBX1NBU19QSFlfQ09VTlRFUiwKKyAgTXBpMkV2ZW50RGF0YVNhc1BoeUNvdW50ZXJfdCwgTVBJMl9QT0lOVEVSIHBNcGkyRXZlbnREYXRhU2FzUGh5Q291bnRlcl90OworCisvKiB1c2UgTVBJMl9TQVNQSFkzX0VWRU5UX0NPREVfIHZhbHVlcyBmcm9tIG1waTJfY25mZy5oIGZvciB0aGUKKyAqIFBoeUV2ZW50Q29kZSBmaWVsZAorICogdXNlIE1QSTJfU0FTUEhZM19DT1VOVEVSX1RZUEVfIHZhbHVlcyBmcm9tIG1waTJfY25mZy5oIGZvciB0aGUKKyAqIENvdW50ZXJUeXBlIGZpZWxkCisgKiB1c2UgTVBJMl9TQVNQSFkzX1RJTUVfVU5JVFNfIHZhbHVlcyBmcm9tIG1waTJfY25mZy5oIGZvciB0aGUKKyAqIFRpbWVVbml0cyBmaWVsZAorICogdXNlIE1QSTJfU0FTUEhZM19URkxBR1NfIHZhbHVlcyBmcm9tIG1waTJfY25mZy5oIGZvciB0aGUKKyAqIFRocmVzaG9sZEZsYWdzIGZpZWxkCisgKiAqLworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBFdmVudEFjayBtZXNzYWdlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfdG9vbC5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfdG9vbC5oCmluZGV4IDJmZjRlOTMuLjAwN2U5NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX3Rvb2wuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl90b29sLmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDggTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA5IExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGkyX3Rvb2wuaAogICogICAgICAgICAgVGl0bGU6ICBNUEkgZGlhZ25vc3RpYyB0b29sIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCiAgKiAgQ3JlYXRpb24gRGF0ZTogIE1hcmNoIDI2LCAyMDA3CiAgKgotICogICAgbXBpMl90b29sLmggVmVyc2lvbjogIDAyLjAwLjAyCisgKiAgICBtcGkyX3Rvb2wuaCBWZXJzaW9uOiAgMDIuMDAuMDMKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC0xNyw2ICsxNyw3IEBACiAgKiAgMTItMTgtMDcgIDAyLjAwLjAxICBBZGRlZCBEaWFnbm9zdGljIEJ1ZmZlciBQb3N0IGFuZCBEaWFnbm9zdGljIFJlbGVhc2UKICAqICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMuCiAgKiAgMDItMjktMDggIDAyLjAwLjAyICBNb2RpZmllZCB2YXJpb3VzIG5hbWVzIHRvIG1ha2UgdGhlbSAzMi1jaGFyYWN0ZXIgdW5pcXVlLgorICogIDA1LTA2LTA5ICAwMi4wMC4wMyAgQWRkZWQgSVNUV0kgUmVhZCBXcml0ZSBUb29sIGFuZCBEaWFnbm9zdGljIENMSSBUb29sLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMzIsNyArMzMsMTAgQEAKIC8qIGRlZmluZXMgZm9yIHRoZSBUb29scyAqLwogI2RlZmluZSBNUEkyX1RPT0xCT1hfQ0xFQU5fVE9PTCAgICAgICAgICAgICAgICAgICAgICgweDAwKQogI2RlZmluZSBNUEkyX1RPT0xCT1hfTUVNT1JZX01PVkVfVE9PTCAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX1RPT0xCT1hfSVNUV0lfUkVBRF9XUklURV9UT09MICAgICAgICAgICgweDAzKQogI2RlZmluZSBNUEkyX1RPT0xCT1hfQkVBQ09OX1RPT0wgICAgICAgICAgICAgICAgICAgICgweDA1KQorI2RlZmluZSBNUEkyX1RPT0xCT1hfRElBR05PU1RJQ19DTElfVE9PTCAgICAgICAgICAgICgweDA2KQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBUb29sYm94IHJlcGx5CkBAIC0xMTIsNiArMTE2LDc3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFRvb2xib3ggSVNUV0kgUmVhZCBXcml0ZSBUb29sCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUb29sYm94IElTVFdJIFJlYWQgV3JpdGUgVG9vbCByZXF1ZXN0IG1lc3NhZ2UgKi8KK3R5cGVkZWYgc3RydWN0IF9NUEkyX1RPT0xCT1hfSVNUV0lfUkVBRF9XUklURV9SRVFVRVNUIHsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUb29sOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDAxICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDA0ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMHgwNyAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZQX0lEOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDkgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgLyogMHgwQSAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgICAgICAgICAvKiAweDBDICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ2OyAgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBEZXZJbmRleDsgICAgICAgICAgICAgICAgICAgLyogMHgxNCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjsgICAgICAgICAgICAgICAgICAgICAvKiAweDE1ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU0dMRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDB4MTYgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDc7ICAgICAgICAgICAgICAgICAgLyogMHgxNyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFR4RGF0YUxlbmd0aDsgICAgICAgICAgICAgICAvKiAweDE4ICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUnhEYXRhTGVuZ3RoOyAgICAgICAgICAgICAgIC8qIDB4MUEgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDg7ICAgICAgICAgICAgICAgICAgLyogMHgxQyAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOTsgICAgICAgICAgICAgICAgICAvKiAweDIwICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxMDsgICAgICAgICAgICAgICAgIC8qIDB4MjQgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDExOyAgICAgICAgICAgICAgICAgLyogMHgyOCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTI7ICAgICAgICAgICAgICAgICAvKiAweDJDICovCisgICAgTVBJMl9TR0VfU0lNUExFX1VOSU9OICAgU0dMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAgKi8KK30gTVBJMl9UT09MQk9YX0lTVFdJX1JFQURfV1JJVEVfUkVRVUVTVCwKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1RPT0xCT1hfSVNUV0lfUkVBRF9XUklURV9SRVFVRVNULAorICBNcGkyVG9vbGJveElzdHdpUmVhZFdyaXRlUmVxdWVzdF90LAorICBNUEkyX1BPSU5URVIgcE1waTJUb29sYm94SXN0d2lSZWFkV3JpdGVSZXF1ZXN0X3Q7CisKKy8qIHZhbHVlcyBmb3IgdGhlIEFjdGlvbiBmaWVsZCAqLworI2RlZmluZSBNUEkyX1RPT0xfSVNUV0lfQUNUSU9OX1JFQURfREFUQSAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX1RPT0xfSVNUV0lfQUNUSU9OX1dSSVRFX0RBVEEgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUEkyX1RPT0xfSVNUV0lfQUNUSU9OX1NFUVVFTkNFICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUEkyX1RPT0xfSVNUV0lfQUNUSU9OX1JFU0VSVkVfQlVTICAgICAgICAgICgweDEwKQorI2RlZmluZSBNUEkyX1RPT0xfSVNUV0lfQUNUSU9OX1JFTEVBU0VfQlVTICAgICAgICAgICgweDExKQorI2RlZmluZSBNUEkyX1RPT0xfSVNUV0lfQUNUSU9OX1JFU0VUICAgICAgICAgICAgICAgICgweDEyKQorCisvKiB2YWx1ZXMgZm9yIFNHTEZsYWdzIGZpZWxkIGFyZSBpbiB0aGUgU0dMIHNlY3Rpb24gb2YgbXBpMi5oICovCisKKworLyogVG9vbGJveCBJU1RXSSBSZWFkIFdyaXRlIFRvb2wgcmVwbHkgbWVzc2FnZSAqLwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfVE9PTEJPWF9JU1RXSV9SRVBMWSB7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVG9vbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAweDAyICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDB4MDMgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAweDA2ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDB4MDcgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWUF9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZGX0lEOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA5ICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgICAgIC8qIDB4MEEgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgICAgICAgICAgLyogMHgwQyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAweDBFICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBEZXZJbmRleDsgICAgICAgICAgICAgICAgICAgLyogMHgxNCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjsgICAgICAgICAgICAgICAgICAgICAvKiAweDE1ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgSXN0d2lTdGF0dXM7ICAgICAgICAgICAgICAgIC8qIDB4MTYgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDY7ICAgICAgICAgICAgICAgICAgLyogMHgxNyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFR4RGF0YUNvdW50OyAgICAgICAgICAgICAgICAvKiAweDE4ICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUnhEYXRhQ291bnQ7ICAgICAgICAgICAgICAgIC8qIDB4MUEgKi8KK30gTVBJMl9UT09MQk9YX0lTVFdJX1JFUExZLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfVE9PTEJPWF9JU1RXSV9SRVBMWSwKKyAgTXBpMlRvb2xib3hJc3R3aVJlcGx5X3QsIE1QSTJfUE9JTlRFUiBwTXBpMlRvb2xib3hJc3R3aVJlcGx5X3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFRvb2xib3ggQmVhY29uIFRvb2wgcmVxdWVzdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTM5LDYgKzIxNCw2MSBAQAogI2RlZmluZSBNUEkyX1RPT0xCT1hfRkxBR1NfQkVBQ09OTU9ERV9PTiAgICAgICAgKDB4MDEpCiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFRvb2xib3ggRGlhZ25vc3RpYyBDTEkgVG9vbAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUEkyX1RPT0xCT1hfRElBR19DTElfQ01EX0xFTkdUSCAgICAoMHg1QykKKworLyogVG9vbGJveCBEaWFnbm9zdGljIENMSSBUb29sIHJlcXVlc3QgbWVzc2FnZSAqLwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfVE9PTEJPWF9ESUFHTk9TVElDX0NMSV9SRVFVRVNUIHsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUb29sOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDAxICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDA0ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMHgwNyAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZQX0lEOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDkgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgLyogMHgwQSAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNHTEZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAweDBDICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1OyAgICAgICAgICAgICAgICAgIC8qIDB4MEQgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDY7ICAgICAgICAgICAgICAgICAgLyogMHgwRSAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7ICAgICAgICAgICAgICAgICAvKiAweDEwICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY0NsaUNvbW1hbmQKKwkJW01QSTJfVE9PTEJPWF9ESUFHX0NMSV9DTURfTEVOR1RIXTsgICAgIC8qIDB4MTQgKi8KKyAgICBNUEkyX1NHRV9TSU1QTEVfVU5JT04gICBTR0w7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg3MCAqLworfSBNUEkyX1RPT0xCT1hfRElBR05PU1RJQ19DTElfUkVRVUVTVCwKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1RPT0xCT1hfRElBR05PU1RJQ19DTElfUkVRVUVTVCwKKyAgTXBpMlRvb2xib3hEaWFnbm9zdGljQ2xpUmVxdWVzdF90LAorICBNUEkyX1BPSU5URVIgcE1waTJUb29sYm94RGlhZ25vc3RpY0NsaVJlcXVlc3RfdDsKKworLyogdmFsdWVzIGZvciBTR0xGbGFncyBmaWVsZCBhcmUgaW4gdGhlIFNHTCBzZWN0aW9uIG9mIG1waTIuaCAqLworCisKKy8qIFRvb2xib3ggRGlhZ25vc3RpYyBDTEkgVG9vbCByZXBseSBtZXNzYWdlICovCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9UT09MQk9YX0RJQUdOT1NUSUNfQ0xJX1JFUExZIHsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUb29sOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDAxICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDA0ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMHgwNyAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZQX0lEOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDkgKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgLyogMHgwQSAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgICAgICAgICAvKiAweDBDICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAgICAgICAgIC8qIDB4MEUgKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMHgxMCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJldHVybmVkRGF0YUxlbmd0aDsgICAgICAgICAvKiAweDE0ICovCit9IE1QSTJfVE9PTEJPWF9ESUFHTk9TVElDX0NMSV9SRVBMWSwKKyAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1RPT0xCT1hfRElBR19DTElfUkVQTFksCisgIE1waTJUb29sYm94RGlhZ25vc3RpY0NsaVJlcGx5X3QsCisgIE1QSTJfUE9JTlRFUiBwTXBpMlRvb2xib3hEaWFnbm9zdGljQ2xpUmVwbHlfdDsKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgRGlhZ25vc3RpYyBCdWZmZXIgTWVzc2FnZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmMKaW5kZXggZDk1ZDJmMi4uNjcwMjQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmMKQEAgLTMsNyArMyw3IEBACiAgKiBmb3IgYWNjZXNzIHRvIE1QVCAoTWVzc2FnZSBQYXNzaW5nIFRlY2hub2xvZ3kpIGZpcm13YXJlLgogICoKICAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBkcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyX2Jhc2UuYwotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggIExTSSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIExTSSBDb3Jwb3JhdGlvbgogICogIChtYWlsdG86REwtTVBURnVzaW9uTGludXhAbHNpLmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC02Myw3ICs2Myw3IEBACiBzdGF0aWMgTVBUX0NBTExCQUNLCW1wdF9jYWxsYmFja3NbTVBUX01BWF9DQUxMQkFDS1NdOwogCiAjZGVmaW5lIEZBVUxUX1BPTExJTkdfSU5URVJWQUwgMTAwMCAvKiBpbiBtaWxsaXNlY29uZHMgKi8KLSNkZWZpbmUgTVBUMlNBU19NQVhfUkVRVUVTVF9RVUVVRSA1MDAgLyogbWF4aW11bSBjb250cm9sbGVyIHF1ZXVlIGRlcHRoICovCisjZGVmaW5lIE1QVDJTQVNfTUFYX1JFUVVFU1RfUVVFVUUgNjAwIC8qIG1heGltdW0gY29udHJvbGxlciBxdWV1ZSBkZXB0aCAqLwogCiBzdGF0aWMgaW50IG1heF9xdWV1ZV9kZXB0aCA9IC0xOwogbW9kdWxlX3BhcmFtKG1heF9xdWV1ZV9kZXB0aCwgaW50LCAwKTsKQEAgLTU0MywxMyArNTQzLDEzIEBACiAgKiBfYmFzZV9kaXNwbGF5X3JlcGx5X2luZm8gLQogICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CiAgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAotICogQFZGX0lEOiB2aXJ0dWFsIGZ1bmN0aW9uIGlkCisgKiBAbXNpeF9pbmRleDogTVNJWCB0YWJsZSBpbmRleCBzdXBwbGllZCBieSB0aGUgT1MKICAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBmcmFtZShsb3dlciAzMmJpdCBhZGRyKQogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiBzdGF0aWMgdm9pZAotX2Jhc2VfZGlzcGxheV9yZXBseV9pbmZvKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IFZGX0lELAorX2Jhc2VfZGlzcGxheV9yZXBseV9pbmZvKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IG1zaXhfaW5kZXgsCiAgICAgdTMyIHJlcGx5KQogewogCU1QSTJEZWZhdWx0UmVwbHlfdCAqbXBpX3JlcGx5OwpAQCAtNTcyLDIyICs1NzIsMjQgQEAKICAqIG1wdDJzYXNfYmFzZV9kb25lIC0gYmFzZSBpbnRlcm5hbCBjb21tYW5kIGNvbXBsZXRpb24gcm91dGluZQogICogQGlvYzogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CiAgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAotICogQFZGX0lEOiB2aXJ0dWFsIGZ1bmN0aW9uIGlkCisgKiBAbXNpeF9pbmRleDogTVNJWCB0YWJsZSBpbmRleCBzdXBwbGllZCBieSB0aGUgT1MKICAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBmcmFtZShsb3dlciAzMmJpdCBhZGRyKQogICoKLSAqIFJldHVybiBub3RoaW5nLgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXZvaWQKLW1wdDJzYXNfYmFzZV9kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IFZGX0lELCB1MzIgcmVwbHkpCit1OAorbXB0MnNhc19iYXNlX2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggbXNpeF9pbmRleCwKKyAgICB1MzIgcmVwbHkpCiB7CiAJTVBJMkRlZmF1bHRSZXBseV90ICptcGlfcmVwbHk7CiAKIAltcGlfcmVwbHkgPSBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKIAlpZiAobXBpX3JlcGx5ICYmIG1waV9yZXBseS0+RnVuY3Rpb24gPT0gTVBJMl9GVU5DVElPTl9FVkVOVF9BQ0spCi0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAKIAlpZiAoaW9jLT5iYXNlX2NtZHMuc3RhdHVzID09IE1QVDJfQ01EX05PVF9VU0VEKQotCQlyZXR1cm47CisJCXJldHVybiAxOwogCiAJaW9jLT5iYXNlX2NtZHMuc3RhdHVzIHw9IE1QVDJfQ01EX0NPTVBMRVRFOwogCWlmIChtcGlfcmVwbHkpIHsKQEAgLTU5NiwxOCArNTk4LDIwIEBACiAJfQogCWlvYy0+YmFzZV9jbWRzLnN0YXR1cyAmPSB+TVBUMl9DTURfUEVORElORzsKIAljb21wbGV0ZSgmaW9jLT5iYXNlX2NtZHMuZG9uZSk7CisJcmV0dXJuIDE7CiB9CiAKIC8qKgogICogX2Jhc2VfYXN5bmNfZXZlbnQgLSBtYWluIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGZpcm13YXJlIGFzeW4gZXZlbnRzCiAgKiBAaW9jOiBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBvYmplY3QKLSAqIEBWRl9JRDogdmlydHVhbCBmdW5jdGlvbiBpZAorICogQG1zaXhfaW5kZXg6IE1TSVggdGFibGUgaW5kZXggc3VwcGxpZWQgYnkgdGhlIE9TCiAgKiBAcmVwbHk6IHJlcGx5IG1lc3NhZ2UgZnJhbWUobG93ZXIgMzJiaXQgYWRkcikKICAqCi0gKiBSZXR1cm4gbm90aGluZy4KKyAqIFJldHVybiAxIG1lYW5pbmcgbWYgc2hvdWxkIGJlIGZyZWVkIGZyb20gX2Jhc2VfaW50ZXJydXB0CisgKiAgICAgICAgMCBtZWFucyB0aGUgbWYgaXMgZnJlZWQgZnJvbSB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgdm9pZAotX2Jhc2VfYXN5bmNfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwgdTMyIHJlcGx5KQorc3RhdGljIHU4CitfYmFzZV9hc3luY19ldmVudChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IG1zaXhfaW5kZXgsIHUzMiByZXBseSkKIHsKIAlNcGkyRXZlbnROb3RpZmljYXRpb25SZXBseV90ICptcGlfcmVwbHk7CiAJTXBpMkV2ZW50QWNrUmVxdWVzdF90ICphY2tfcmVxdWVzdDsKQEAgLTYxNSw5ICs2MTksOSBAQAogCiAJbXBpX3JlcGx5ID0gbXB0MnNhc19iYXNlX2dldF9yZXBseV92aXJ0X2FkZHIoaW9jLCByZXBseSk7CiAJaWYgKCFtcGlfcmVwbHkpCi0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAJaWYgKG1waV9yZXBseS0+RnVuY3Rpb24gIT0gTVBJMl9GVU5DVElPTl9FVkVOVF9OT1RJRklDQVRJT04pCi0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAjaWZkZWYgQ09ORklHX1NDU0lfTVBUMlNBU19MT0dHSU5HCiAJX2Jhc2VfZGlzcGxheV9ldmVudF9kYXRhKGlvYywgbXBpX3JlcGx5KTsKICNlbmRpZgpAQCAtNjM1LDE2ICs2MzksNDcgQEAKIAlhY2tfcmVxdWVzdC0+RnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX0VWRU5UX0FDSzsKIAlhY2tfcmVxdWVzdC0+RXZlbnQgPSBtcGlfcmVwbHktPkV2ZW50OwogCWFja19yZXF1ZXN0LT5FdmVudENvbnRleHQgPSBtcGlfcmVwbHktPkV2ZW50Q29udGV4dDsKLQlhY2tfcmVxdWVzdC0+VkZfSUQgPSBWRl9JRDsKLQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIFZGX0lEKTsKKwlhY2tfcmVxdWVzdC0+VkZfSUQgPSAwOyAgLyogVE9ETyAqLworCWFja19yZXF1ZXN0LT5WUF9JRCA9IDA7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKIAogIG91dDoKIAogCS8qIHNjc2loIGNhbGxiYWNrIGhhbmRsZXIgKi8KLQltcHQyc2FzX3Njc2loX2V2ZW50X2NhbGxiYWNrKGlvYywgVkZfSUQsIHJlcGx5KTsKKwltcHQyc2FzX3Njc2loX2V2ZW50X2NhbGxiYWNrKGlvYywgbXNpeF9pbmRleCwgcmVwbHkpOwogCiAJLyogY3RsIGNhbGxiYWNrIGhhbmRsZXIgKi8KLQltcHQyc2FzX2N0bF9ldmVudF9jYWxsYmFjayhpb2MsIFZGX0lELCByZXBseSk7CisJbXB0MnNhc19jdGxfZXZlbnRfY2FsbGJhY2soaW9jLCBtc2l4X2luZGV4LCByZXBseSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBfYmFzZV9nZXRfY2JfaWR4IC0gb2J0YWluIHRoZSBjYWxsYmFjayBpbmRleAorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAorICoKKyAqIFJldHVybiBjYWxsYmFjayBpbmRleC4KKyAqLworc3RhdGljIHU4CitfYmFzZV9nZXRfY2JfaWR4KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQpCit7CisJaW50IGk7CisJdTggY2JfaWR4ID0gMHhGRjsKKworCWlmIChzbWlkID49IGlvYy0+aGlfcHJpb3JpdHlfc21pZCkgeworCQlpZiAoc21pZCA8IGlvYy0+aW50ZXJuYWxfc21pZCkgeworCQkJaSA9IHNtaWQgLSBpb2MtPmhpX3ByaW9yaXR5X3NtaWQ7CisJCQljYl9pZHggPSBpb2MtPmhwcl9sb29rdXBbaV0uY2JfaWR4OworCQl9IGVsc2UgeworCQkJaSA9IHNtaWQgLSBpb2MtPmludGVybmFsX3NtaWQ7CisJCQljYl9pZHggPSBpb2MtPmludGVybmFsX2xvb2t1cFtpXS5jYl9pZHg7CisJCX0KKwl9IGVsc2UgeworCQlpID0gc21pZCAtIDE7CisJCWNiX2lkeCA9IGlvYy0+c2NzaV9sb29rdXBbaV0uY2JfaWR4OworCX0KKwlyZXR1cm4gY2JfaWR4OwogfQogCiAvKioKQEAgLTY4MCw3ICs3MTUsNiBAQAogewogCXUzMiBoaW1fcmVnaXN0ZXI7CiAKLQl3cml0ZWwoMCwgJmlvYy0+Y2hpcC0+SG9zdEludGVycnVwdFN0YXR1cyk7CiAJaGltX3JlZ2lzdGVyID0gcmVhZGwoJmlvYy0+Y2hpcC0+SG9zdEludGVycnVwdE1hc2spOwogCWhpbV9yZWdpc3RlciAmPSB+TVBJMl9ISU1fUklNOwogCXdyaXRlbChoaW1fcmVnaXN0ZXIsICZpb2MtPmNoaXAtPkhvc3RJbnRlcnJ1cHRNYXNrKTsKQEAgLTcxMiw5ICs3NDYsMTAgQEAKIAl1MTYgc21pZDsKIAl1OCBjYl9pZHg7CiAJdTMyIHJlcGx5OwotCXU4IFZGX0lEOworCXU4IG1zaXhfaW5kZXg7CiAJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gYnVzX2lkOwogCU1waTJSZXBseURlc2NyaXB0b3JzVW5pb25fdCAqcnBmOworCXU4IHJjOwogCiAJaWYgKGlvYy0+bWFza19pbnRlcnJ1cHRzKQogCQlyZXR1cm4gSVJRX05PTkU7CkBAIC03MzMsNyArNzY4LDcgQEAKIAkJcmVwbHkgPSAwOwogCQljYl9pZHggPSAweEZGOwogCQlzbWlkID0gbGUxNl90b19jcHUocnBmLT5EZWZhdWx0LkRlc2NyaXB0b3JUeXBlRGVwZW5kZW50MSk7Ci0JCVZGX0lEID0gcnBmLT5EZWZhdWx0LlZGX0lEOworCQltc2l4X2luZGV4ID0gcnBmLT5EZWZhdWx0Lk1TSXhJbmRleDsKIAkJaWYgKHJlcXVlc3RfZGVzcmlwdF90eXBlID09CiAJCSAgICBNUEkyX1JQWV9ERVNDUklQVF9GTEFHU19BRERSRVNTX1JFUExZKSB7CiAJCQlyZXBseSA9IGxlMzJfdG9fY3B1CkBAIC03NDUsMTYgKzc4MCwxOCBAQAogCQkgICAgTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfVEFSR0VUQVNTSVNUX1NVQ0NFU1MpCiAJCQlnb3RvIG5leHQ7CiAJCWlmIChzbWlkKQotCQkJY2JfaWR4ID0gaW9jLT5zY3NpX2xvb2t1cFtzbWlkIC0gMV0uY2JfaWR4OworCQkJY2JfaWR4ID0gX2Jhc2VfZ2V0X2NiX2lkeChpb2MsIHNtaWQpOwogCQlpZiAoc21pZCAmJiBjYl9pZHggIT0gMHhGRikgewotCQkJbXB0X2NhbGxiYWNrc1tjYl9pZHhdKGlvYywgc21pZCwgVkZfSUQsIHJlcGx5KTsKKwkJCXJjID0gbXB0X2NhbGxiYWNrc1tjYl9pZHhdKGlvYywgc21pZCwgbXNpeF9pbmRleCwKKwkJCSAgICByZXBseSk7CiAJCQlpZiAocmVwbHkpCi0JCQkJX2Jhc2VfZGlzcGxheV9yZXBseV9pbmZvKGlvYywgc21pZCwgVkZfSUQsCisJCQkJX2Jhc2VfZGlzcGxheV9yZXBseV9pbmZvKGlvYywgc21pZCwgbXNpeF9pbmRleCwKIAkJCQkgICAgcmVwbHkpOwotCQkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIHNtaWQpOworCQkJaWYgKHJjKQorCQkJCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBzbWlkKTsKIAkJfQogCQlpZiAoIXNtaWQpCi0JCQlfYmFzZV9hc3luY19ldmVudChpb2MsIFZGX0lELCByZXBseSk7CisJCQlfYmFzZV9hc3luY19ldmVudChpb2MsIG1zaXhfaW5kZXgsIHJlcGx5KTsKIAogCQkvKiByZXBseSBmcmVlIHF1ZXVlIGhhbmRsaW5nICovCiAJCWlmIChyZXBseSkgewpAQCAtMTE5MSwxOSArMTIyOCw2IEBACiB9CiAKIC8qKgotICogbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWVfZG1hIC0gb2J0YWluIHJlcXVlc3QgbWYgcG9pbnRlciBwaHlzIGFkZHIKLSAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQHNtaWQ6IHN5c3RlbSByZXF1ZXN0IG1lc3NhZ2UgaW5kZXgoc21pZCB6ZXJvIGlzIGludmFsaWQpCi0gKgotICogUmV0dXJucyBwaHlzIHBvaW50ZXIgdG8gbWVzc2FnZSBmcmFtZS4KLSAqLwotZG1hX2FkZHJfdAotbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWVfZG1hKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQpCi17Ci0JcmV0dXJuIGlvYy0+cmVxdWVzdF9kbWEgKyAoc21pZCAqIGlvYy0+cmVxdWVzdF9zeik7Ci19Ci0KLS8qKgogICogbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUgLSBvYnRhaW4gcmVxdWVzdCBtZiBwb2ludGVyCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4KHNtaWQgemVybyBpcyBpbnZhbGlkKQpAQCAtMTI1OCw3ICsxMjgyLDcgQEAKIH0KIAogLyoqCi0gKiBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWQgLSBvYnRhaW4gYSBmcmVlIHNtaWQKKyAqIG1wdDJzYXNfYmFzZV9nZXRfc21pZCAtIG9idGFpbiBhIGZyZWUgc21pZCBmcm9tIGludGVybmFsIHF1ZXVlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBjYl9pZHg6IGNhbGxiYWNrIGluZGV4CiAgKgpAQCAtMTI3Miw2ICsxMjk2LDM5IEBACiAJdTE2IHNtaWQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmlvYy0+aW50ZXJuYWxfZnJlZV9saXN0KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IHNtaWQgbm90IGF2YWlsYWJsZVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXF1ZXN0ID0gbGlzdF9lbnRyeShpb2MtPmludGVybmFsX2ZyZWVfbGlzdC5uZXh0LAorCSAgICBzdHJ1Y3QgcmVxdWVzdF90cmFja2VyLCB0cmFja2VyX2xpc3QpOworCXJlcXVlc3QtPmNiX2lkeCA9IGNiX2lkeDsKKwlzbWlkID0gcmVxdWVzdC0+c21pZDsKKwlsaXN0X2RlbCgmcmVxdWVzdC0+dHJhY2tlcl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc21pZDsKK30KKworLyoqCisgKiBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWRfc2NzaWlvIC0gb2J0YWluIGEgZnJlZSBzbWlkIGZyb20gc2NzaWlvIHF1ZXVlCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBjYl9pZHg6IGNhbGxiYWNrIGluZGV4CisgKiBAc2NtZDogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKgorICogUmV0dXJucyBzbWlkICh6ZXJvIGlzIGludmFsaWQpCisgKi8KK3UxNgorbXB0MnNhc19iYXNlX2dldF9zbWlkX3Njc2lpbyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IGNiX2lkeCwKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJlcXVlc3RfdHJhY2tlciAqcmVxdWVzdDsKKwl1MTYgc21pZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKIAlpZiAobGlzdF9lbXB0eSgmaW9jLT5mcmVlX2xpc3QpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogc21pZCBub3QgYXZhaWxhYmxlXG4iLApAQCAtMTI4MSw2ICsxMzM4LDM2IEBACiAKIAlyZXF1ZXN0ID0gbGlzdF9lbnRyeShpb2MtPmZyZWVfbGlzdC5uZXh0LAogCSAgICBzdHJ1Y3QgcmVxdWVzdF90cmFja2VyLCB0cmFja2VyX2xpc3QpOworCXJlcXVlc3QtPnNjbWQgPSBzY21kOworCXJlcXVlc3QtPmNiX2lkeCA9IGNiX2lkeDsKKwlzbWlkID0gcmVxdWVzdC0+c21pZDsKKwlsaXN0X2RlbCgmcmVxdWVzdC0+dHJhY2tlcl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc21pZDsKK30KKworLyoqCisgKiBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWRfaHByIC0gb2J0YWluIGEgZnJlZSBzbWlkIGZyb20gaGktcHJpb3JpdHkgcXVldWUKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICogQGNiX2lkeDogY2FsbGJhY2sgaW5kZXgKKyAqCisgKiBSZXR1cm5zIHNtaWQgKHplcm8gaXMgaW52YWxpZCkKKyAqLwordTE2CittcHQyc2FzX2Jhc2VfZ2V0X3NtaWRfaHByKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggY2JfaWR4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJlcXVlc3RfdHJhY2tlciAqcmVxdWVzdDsKKwl1MTYgc21pZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmaW9jLT5ocHJfZnJlZV9saXN0KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVxdWVzdCA9IGxpc3RfZW50cnkoaW9jLT5ocHJfZnJlZV9saXN0Lm5leHQsCisJICAgIHN0cnVjdCByZXF1ZXN0X3RyYWNrZXIsIHRyYWNrZXJfbGlzdCk7CiAJcmVxdWVzdC0+Y2JfaWR4ID0gY2JfaWR4OwogCXNtaWQgPSByZXF1ZXN0LT5zbWlkOwogCWxpc3RfZGVsKCZyZXF1ZXN0LT50cmFja2VyX2xpc3QpOwpAQCAtMTMwMCwxMCArMTM4NywzMiBAQAogbXB0MnNhc19iYXNlX2ZyZWVfc21pZChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7Ci0JaW9jLT5zY3NpX2xvb2t1cFtzbWlkIC0gMV0uY2JfaWR4ID0gMHhGRjsKLQlsaXN0X2FkZF90YWlsKCZpb2MtPnNjc2lfbG9va3VwW3NtaWQgLSAxXS50cmFja2VyX2xpc3QsCisJaWYgKHNtaWQgPj0gaW9jLT5oaV9wcmlvcml0eV9zbWlkKSB7CisJCWlmIChzbWlkIDwgaW9jLT5pbnRlcm5hbF9zbWlkKSB7CisJCQkvKiBoaS1wcmlvcml0eSAqLworCQkJaSA9IHNtaWQgLSBpb2MtPmhpX3ByaW9yaXR5X3NtaWQ7CisJCQlpb2MtPmhwcl9sb29rdXBbaV0uY2JfaWR4ID0gMHhGRjsKKwkJCWxpc3RfYWRkX3RhaWwoJmlvYy0+aHByX2xvb2t1cFtpXS50cmFja2VyX2xpc3QsCisJCQkgICAgJmlvYy0+aHByX2ZyZWVfbGlzdCk7CisJCX0gZWxzZSB7CisJCQkvKiBpbnRlcm5hbCBxdWV1ZSAqLworCQkJaSA9IHNtaWQgLSBpb2MtPmludGVybmFsX3NtaWQ7CisJCQlpb2MtPmludGVybmFsX2xvb2t1cFtpXS5jYl9pZHggPSAweEZGOworCQkJbGlzdF9hZGRfdGFpbCgmaW9jLT5pbnRlcm5hbF9sb29rdXBbaV0udHJhY2tlcl9saXN0LAorCQkJICAgICZpb2MtPmludGVybmFsX2ZyZWVfbGlzdCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBzY3NpaW8gcXVldWUgKi8KKwlpID0gc21pZCAtIDE7CisJaW9jLT5zY3NpX2xvb2t1cFtpXS5jYl9pZHggPSAweEZGOworCWlvYy0+c2NzaV9sb29rdXBbaV0uc2NtZCA9IE5VTEw7CisJbGlzdF9hZGRfdGFpbCgmaW9jLT5zY3NpX2xvb2t1cFtpXS50cmFja2VyX2xpc3QsCiAJICAgICZpb2MtPmZyZWVfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CiAKQEAgLTEzNTIsMjEgKzE0NjEsMTkgQEAKICAqIG1wdDJzYXNfYmFzZV9wdXRfc21pZF9zY3NpX2lvIC0gc2VuZCBTQ1NJX0lPIHJlcXVlc3QgdG8gZmlybXdhcmUKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHNtaWQ6IHN5c3RlbSByZXF1ZXN0IG1lc3NhZ2UgaW5kZXgKLSAqIEB2Zl9pZDogdmlydHVhbCBmdW5jdGlvbiBpZAogICogQGhhbmRsZTogZGV2aWNlIGhhbmRsZQogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiB2b2lkCi1tcHQyc2FzX2Jhc2VfcHV0X3NtaWRfc2NzaV9pbyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCB2Zl9pZCwKLSAgICB1MTYgaGFuZGxlKQorbXB0MnNhc19iYXNlX3B1dF9zbWlkX3Njc2lfaW8oc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTE2IGhhbmRsZSkKIHsKIAlNcGkyUmVxdWVzdERlc2NyaXB0b3JVbmlvbl90IGRlc2NyaXB0b3I7CiAJdTY0ICpyZXF1ZXN0ID0gKHU2NCAqKSZkZXNjcmlwdG9yOwogCiAKIAlkZXNjcmlwdG9yLlNDU0lJTy5SZXF1ZXN0RmxhZ3MgPSBNUEkyX1JFUV9ERVNDUklQVF9GTEFHU19TQ1NJX0lPOwotCWRlc2NyaXB0b3IuU0NTSUlPLlZGX0lEID0gdmZfaWQ7CisJZGVzY3JpcHRvci5TQ1NJSU8uTVNJeEluZGV4ID0gMDsgLyogVE9ETyAqLwogCWRlc2NyaXB0b3IuU0NTSUlPLlNNSUQgPSBjcHVfdG9fbGUxNihzbWlkKTsKIAlkZXNjcmlwdG9yLlNDU0lJTy5EZXZIYW5kbGUgPSBjcHVfdG9fbGUxNihoYW5kbGUpOwogCWRlc2NyaXB0b3IuU0NTSUlPLkxNSUQgPSAwOwpAQCAtMTM3OSwyMCArMTQ4NiwxOCBAQAogICogbXB0MnNhc19iYXNlX3B1dF9zbWlkX2hpX3ByaW9yaXR5IC0gc2VuZCBUYXNrIE1hbmFnbWVudCByZXF1ZXN0IHRvIGZpcm13YXJlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4Ci0gKiBAdmZfaWQ6IHZpcnR1YWwgZnVuY3Rpb24gaWQKICAqCiAgKiBSZXR1cm4gbm90aGluZy4KICAqLwogdm9pZAotbXB0MnNhc19iYXNlX3B1dF9zbWlkX2hpX3ByaW9yaXR5KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsCi0gICAgdTggdmZfaWQpCittcHQyc2FzX2Jhc2VfcHV0X3NtaWRfaGlfcHJpb3JpdHkoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCkKIHsKIAlNcGkyUmVxdWVzdERlc2NyaXB0b3JVbmlvbl90IGRlc2NyaXB0b3I7CiAJdTY0ICpyZXF1ZXN0ID0gKHU2NCAqKSZkZXNjcmlwdG9yOwogCiAJZGVzY3JpcHRvci5IaWdoUHJpb3JpdHkuUmVxdWVzdEZsYWdzID0KIAkgICAgTVBJMl9SRVFfREVTQ1JJUFRfRkxBR1NfSElHSF9QUklPUklUWTsKLQlkZXNjcmlwdG9yLkhpZ2hQcmlvcml0eS5WRl9JRCA9IHZmX2lkOworCWRlc2NyaXB0b3IuSGlnaFByaW9yaXR5Lk1TSXhJbmRleCA9IDA7IC8qIFRPRE8gKi8KIAlkZXNjcmlwdG9yLkhpZ2hQcmlvcml0eS5TTUlEID0gY3B1X3RvX2xlMTYoc21pZCk7CiAJZGVzY3JpcHRvci5IaWdoUHJpb3JpdHkuTE1JRCA9IDA7CiAJZGVzY3JpcHRvci5IaWdoUHJpb3JpdHkuUmVzZXJ2ZWQxID0gMDsKQEAgLTE0MDQsMTggKzE1MDksMTcgQEAKICAqIG1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0IC0gRGVmYXVsdCwgcHJpbWFyaWx5IHVzZWQgZm9yIGNvbmZpZyBwYWdlcwogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAotICogQHZmX2lkOiB2aXJ0dWFsIGZ1bmN0aW9uIGlkCiAgKgogICogUmV0dXJuIG5vdGhpbmcuCiAgKi8KIHZvaWQKLW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IHZmX2lkKQorbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCkKIHsKIAlNcGkyUmVxdWVzdERlc2NyaXB0b3JVbmlvbl90IGRlc2NyaXB0b3I7CiAJdTY0ICpyZXF1ZXN0ID0gKHU2NCAqKSZkZXNjcmlwdG9yOwogCiAJZGVzY3JpcHRvci5EZWZhdWx0LlJlcXVlc3RGbGFncyA9IE1QSTJfUkVRX0RFU0NSSVBUX0ZMQUdTX0RFRkFVTFRfVFlQRTsKLQlkZXNjcmlwdG9yLkRlZmF1bHQuVkZfSUQgPSB2Zl9pZDsKKwlkZXNjcmlwdG9yLkRlZmF1bHQuTVNJeEluZGV4ID0gMDsgLyogVE9ETyAqLwogCWRlc2NyaXB0b3IuRGVmYXVsdC5TTUlEID0gY3B1X3RvX2xlMTYoc21pZCk7CiAJZGVzY3JpcHRvci5EZWZhdWx0LkxNSUQgPSAwOwogCWRlc2NyaXB0b3IuRGVmYXVsdC5EZXNjcmlwdG9yVHlwZURlcGVuZGVudCA9IDA7CkBAIC0xNDI3LDIxICsxNTMxLDIwIEBACiAgKiBtcHQyc2FzX2Jhc2VfcHV0X3NtaWRfdGFyZ2V0X2Fzc2lzdCAtIHNlbmQgVGFyZ2V0IEFzc2lzdC9TdGF0dXMgdG8gZmlybXdhcmUKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHNtaWQ6IHN5c3RlbSByZXF1ZXN0IG1lc3NhZ2UgaW5kZXgKLSAqIEB2Zl9pZDogdmlydHVhbCBmdW5jdGlvbiBpZAogICogQGlvX2luZGV4OiB2YWx1ZSB1c2VkIHRvIHRyYWNrIHRoZSBJTwogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiB2b2lkCiBtcHQyc2FzX2Jhc2VfcHV0X3NtaWRfdGFyZ2V0X2Fzc2lzdChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLAotICAgIHU4IHZmX2lkLCB1MTYgaW9faW5kZXgpCisgICAgdTE2IGlvX2luZGV4KQogewogCU1waTJSZXF1ZXN0RGVzY3JpcHRvclVuaW9uX3QgZGVzY3JpcHRvcjsKIAl1NjQgKnJlcXVlc3QgPSAodTY0ICopJmRlc2NyaXB0b3I7CiAKIAlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuUmVxdWVzdEZsYWdzID0KIAkgICAgTVBJMl9SRVFfREVTQ1JJUFRfRkxBR1NfU0NTSV9UQVJHRVQ7Ci0JZGVzY3JpcHRvci5TQ1NJVGFyZ2V0LlZGX0lEID0gdmZfaWQ7CisJZGVzY3JpcHRvci5TQ1NJVGFyZ2V0Lk1TSXhJbmRleCA9IDA7IC8qIFRPRE8gKi8KIAlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuU01JRCA9IGNwdV90b19sZTE2KHNtaWQpOwogCWRlc2NyaXB0b3IuU0NTSVRhcmdldC5MTUlEID0gMDsKIAlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuSW9JbmRleCA9IGNwdV90b19sZTE2KGlvX2luZGV4KTsKQEAgLTE3MTcsNiArMTgyMCw4IEBACiAJfQogCiAJa2ZyZWUoaW9jLT5zY3NpX2xvb2t1cCk7CisJa2ZyZWUoaW9jLT5ocHJfbG9va3VwKTsKKwlrZnJlZShpb2MtPmludGVybmFsX2xvb2t1cCk7CiB9CiAKIApAQCAtMTczNiw3ICsxODQxLDYgQEAKIAl1MTYgbnVtX29mX3JlcGx5X2ZyYW1lczsKIAl1MTYgY2hhaW5zX25lZWRlZF9wZXJfaW87CiAJdTMyIHN6LCB0b3RhbF9zejsKLQl1MTYgaTsKIAl1MzIgcmV0cnlfc3o7CiAJdTE2IG1heF9yZXF1ZXN0X2NyZWRpdDsKIApAQCAtMTc2NCw3ICsxODY4LDEwIEBACiAJCSAgICBNUFQyU0FTX01BWF9SRVFVRVNUX1FVRVVFKSA/IE1QVDJTQVNfTUFYX1JFUVVFU1RfUVVFVUUgOgogCQkgICAgZmFjdHMtPlJlcXVlc3RDcmVkaXQ7CiAJfQotCWlvYy0+cmVxdWVzdF9kZXB0aCA9IG1heF9yZXF1ZXN0X2NyZWRpdDsKKworCWlvYy0+aGJhX3F1ZXVlX2RlcHRoID0gbWF4X3JlcXVlc3RfY3JlZGl0OworCWlvYy0+aGlfcHJpb3JpdHlfZGVwdGggPSBmYWN0cy0+SGlnaFByaW9yaXR5Q3JlZGl0OworCWlvYy0+aW50ZXJuYWxfZGVwdGggPSBpb2MtPmhpX3ByaW9yaXR5X2RlcHRoICsgNTsKIAogCS8qIHJlcXVlc3QgZnJhbWUgc2l6ZSAqLwogCWlvYy0+cmVxdWVzdF9zeiA9IGZhY3RzLT5JT0NSZXF1ZXN0RnJhbWVTaXplICogNDsKQEAgLTE4MDIsNyArMTkwOSw3IEBACiAJaW9jLT5jaGFpbnNfbmVlZGVkX3Blcl9pbyA9IGNoYWluc19uZWVkZWRfcGVyX2lvOwogCiAJLyogcmVwbHkgZnJlZSBxdWV1ZSBzaXppbmcgLSB0YWtpbmcgaW50byBhY2NvdW50IGZvciBldmVudHMgKi8KLQludW1fb2ZfcmVwbHlfZnJhbWVzID0gaW9jLT5yZXF1ZXN0X2RlcHRoICsgMzI7CisJbnVtX29mX3JlcGx5X2ZyYW1lcyA9IGlvYy0+aGJhX3F1ZXVlX2RlcHRoICsgMzI7CiAKIAkvKiBudW1iZXIgb2YgcmVwbGllcyBmcmFtZXMgY2FuJ3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAqLwogCS8qIGRlY3JlYXNlIG51bWJlciBvZiByZXBseSBmcmFtZXMgYnkgMSAqLwpAQCAtMTgyMyw3ICsxOTMwLDcgQEAKIAkgKiBmcmFtZXMKIAkgKi8KIAotCXF1ZXVlX3NpemUgPSBpb2MtPnJlcXVlc3RfZGVwdGggKyBudW1fb2ZfcmVwbHlfZnJhbWVzICsgMTsKKwlxdWV1ZV9zaXplID0gaW9jLT5oYmFfcXVldWVfZGVwdGggKyBudW1fb2ZfcmVwbHlfZnJhbWVzICsgMTsKIAkvKiByb3VuZCB1cCB0byAxNiBieXRlIGJvdW5kYXJ5ICovCiAJaWYgKHF1ZXVlX3NpemUgJSAxNikKIAkJcXVldWVfc2l6ZSArPSAxNiAtIChxdWV1ZV9zaXplICUgMTYpOwpAQCAtMTgzNyw2MCArMTk0NCw4NSBAQAogCQlpZiAocXVldWVfZGlmZiAlIDE2KQogCQkJcXVldWVfZGlmZiArPSAxNiAtIChxdWV1ZV9kaWZmICUgMTYpOwogCi0JCS8qIGFkanVzdCByZXF1ZXN0X2RlcHRoLCByZXBseV9mcmVlX3F1ZXVlX2RlcHRoLAorCQkvKiBhZGp1c3QgaGJhX3F1ZXVlX2RlcHRoLCByZXBseV9mcmVlX3F1ZXVlX2RlcHRoLAogCQkgKiBhbmQgcXVldWVfc2l6ZQogCQkgKi8KLQkJaW9jLT5yZXF1ZXN0X2RlcHRoIC09IHF1ZXVlX2RpZmY7CisJCWlvYy0+aGJhX3F1ZXVlX2RlcHRoIC09IHF1ZXVlX2RpZmY7CiAJCWlvYy0+cmVwbHlfZnJlZV9xdWV1ZV9kZXB0aCAtPSBxdWV1ZV9kaWZmOwogCQlxdWV1ZV9zaXplIC09IHF1ZXVlX2RpZmY7CiAJfQogCWlvYy0+cmVwbHlfcG9zdF9xdWV1ZV9kZXB0aCA9IHF1ZXVlX3NpemU7CiAKLQkvKiBtYXggc2NzaSBob3N0IHF1ZXVlIGRlcHRoICovCi0JaW9jLT5zaG9zdC0+Y2FuX3F1ZXVlID0gaW9jLT5yZXF1ZXN0X2RlcHRoIC0gSU5URVJOQUxfQ01EU19DT1VOVDsKLQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzY3NpIGhvc3QgcXVldWU6IGRlcHRoIgotCSAgICAiKCVkKVxuIiwgaW9jLT5uYW1lLCBpb2MtPnNob3N0LT5jYW5fcXVldWUpKTsKLQogCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInNjYXR0ZXIgZ2F0aGVyOiAiCiAJICAgICJzZ2VfaW5fbWFpbl9tc2coJWQpLCBzZ2VfcGVyX2NoYWluKCVkKSwgc2dlX3Blcl9pbyglZCksICIKIAkgICAgImNoYWluc19wZXJfaW8oJWQpXG4iLCBpb2MtPm5hbWUsIGlvYy0+bWF4X3NnZXNfaW5fbWFpbl9tZXNzYWdlLAogCSAgICBpb2MtPm1heF9zZ2VzX2luX2NoYWluX21lc3NhZ2UsIGlvYy0+c2hvc3QtPnNnX3RhYmxlc2l6ZSwKIAkgICAgaW9jLT5jaGFpbnNfbmVlZGVkX3Blcl9pbykpOwogCisJaW9jLT5zY3NpaW9fZGVwdGggPSBpb2MtPmhiYV9xdWV1ZV9kZXB0aCAtCisJICAgIGlvYy0+aGlfcHJpb3JpdHlfZGVwdGggLSBpb2MtPmludGVybmFsX2RlcHRoOworCisJLyogc2V0IHRoZSBzY3NpIGhvc3QgY2FuX3F1ZXVlIGRlcHRoCisJICogd2l0aCBzb21lIGludGVybmFsIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgb3V0c3RhbmRpbmcKKwkgKi8KKwlpb2MtPnNob3N0LT5jYW5fcXVldWUgPSBpb2MtPnNjc2lpb19kZXB0aCAtICgyKTsKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzY3NpIGhvc3Q6ICIKKwkgICAgImNhbl9xdWV1ZSBkZXB0aCAoJWQpXG4iLCBpb2MtPm5hbWUsIGlvYy0+c2hvc3QtPmNhbl9xdWV1ZSkpOworCiAJLyogY29udGlndW91cyBwb29sIGZvciByZXF1ZXN0IGFuZCBjaGFpbnMsIDE2IGJ5dGUgYWxpZ24sIG9uZSBleHRyYSAiCiAJICogImZyYW1lIGZvciBzbWlkPTAKIAkgKi8KLQlpb2MtPmNoYWluX2RlcHRoID0gaW9jLT5jaGFpbnNfbmVlZGVkX3Blcl9pbyAqIGlvYy0+cmVxdWVzdF9kZXB0aDsKLQlzeiA9ICgoaW9jLT5yZXF1ZXN0X2RlcHRoICsgMSArIGlvYy0+Y2hhaW5fZGVwdGgpICogaW9jLT5yZXF1ZXN0X3N6KTsKKwlpb2MtPmNoYWluX2RlcHRoID0gaW9jLT5jaGFpbnNfbmVlZGVkX3Blcl9pbyAqIGlvYy0+c2NzaWlvX2RlcHRoOworCXN6ID0gKChpb2MtPnNjc2lpb19kZXB0aCArIDEgKyBpb2MtPmNoYWluX2RlcHRoKSAqIGlvYy0+cmVxdWVzdF9zeik7CisKKwkvKiBoaS1wcmlvcml0eSBxdWV1ZSAqLworCXN6ICs9IChpb2MtPmhpX3ByaW9yaXR5X2RlcHRoICogaW9jLT5yZXF1ZXN0X3N6KTsKKworCS8qIGludGVybmFsIHF1ZXVlICovCisJc3ogKz0gKGlvYy0+aW50ZXJuYWxfZGVwdGggKiBpb2MtPnJlcXVlc3Rfc3opOwogCiAJaW9jLT5yZXF1ZXN0X2RtYV9zeiA9IHN6OwogCWlvYy0+cmVxdWVzdCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGRldiwgc3osICZpb2MtPnJlcXVlc3RfZG1hKTsKIAlpZiAoIWlvYy0+cmVxdWVzdCkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJyZXF1ZXN0IHBvb2w6IHBjaV9hbGxvY19jb25zaXN0ZW50ICIKLQkJICAgICJmYWlsZWQ6IHJlcV9kZXB0aCglZCksIGNoYWluc19wZXJfaW8oJWQpLCBmcmFtZV9zeiglZCksICIKLQkJICAgICJ0b3RhbCglZCBrQilcbiIsIGlvYy0+bmFtZSwgaW9jLT5yZXF1ZXN0X2RlcHRoLAorCQkgICAgImZhaWxlZDogaGJhX2RlcHRoKCVkKSwgY2hhaW5zX3Blcl9pbyglZCksIGZyYW1lX3N6KCVkKSwgIgorCQkgICAgInRvdGFsKCVkIGtCKVxuIiwgaW9jLT5uYW1lLCBpb2MtPmhiYV9xdWV1ZV9kZXB0aCwKIAkJICAgIGlvYy0+Y2hhaW5zX25lZWRlZF9wZXJfaW8sIGlvYy0+cmVxdWVzdF9zeiwgc3ovMTAyNCk7Ci0JCWlmIChpb2MtPnJlcXVlc3RfZGVwdGggPCBNUFQyU0FTX1NBU19RVUVVRV9ERVBUSCkKKwkJaWYgKGlvYy0+c2NzaWlvX2RlcHRoIDwgTVBUMlNBU19TQVNfUVVFVUVfREVQVEgpCiAJCQlnb3RvIG91dDsKIAkJcmV0cnlfc3ogKz0gNjQ7Ci0JCWlvYy0+cmVxdWVzdF9kZXB0aCA9IG1heF9yZXF1ZXN0X2NyZWRpdCAtIHJldHJ5X3N6OworCQlpb2MtPmhiYV9xdWV1ZV9kZXB0aCA9IG1heF9yZXF1ZXN0X2NyZWRpdCAtIHJldHJ5X3N6OwogCQlnb3RvIHJldHJ5X2FsbG9jYXRpb247CiAJfQogCiAJaWYgKHJldHJ5X3N6KQogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJyZXF1ZXN0IHBvb2w6IHBjaV9hbGxvY19jb25zaXN0ZW50ICIKLQkJICAgICJzdWNjZWVkOiByZXFfZGVwdGgoJWQpLCBjaGFpbnNfcGVyX2lvKCVkKSwgZnJhbWVfc3ooJWQpLCAiCi0JCSAgICAidG90YWwoJWQga2IpXG4iLCBpb2MtPm5hbWUsIGlvYy0+cmVxdWVzdF9kZXB0aCwKKwkJICAgICJzdWNjZWVkOiBoYmFfZGVwdGgoJWQpLCBjaGFpbnNfcGVyX2lvKCVkKSwgZnJhbWVfc3ooJWQpLCAiCisJCSAgICAidG90YWwoJWQga2IpXG4iLCBpb2MtPm5hbWUsIGlvYy0+aGJhX3F1ZXVlX2RlcHRoLAogCQkgICAgaW9jLT5jaGFpbnNfbmVlZGVkX3Blcl9pbywgaW9jLT5yZXF1ZXN0X3N6LCBzei8xMDI0KTsKIAotCWlvYy0+Y2hhaW4gPSBpb2MtPnJlcXVlc3QgKyAoKGlvYy0+cmVxdWVzdF9kZXB0aCArIDEpICoKKworCS8qIGhpLXByaW9yaXR5IHF1ZXVlICovCisJaW9jLT5oaV9wcmlvcml0eSA9IGlvYy0+cmVxdWVzdCArICgoaW9jLT5zY3NpaW9fZGVwdGggKyAxKSAqCiAJICAgIGlvYy0+cmVxdWVzdF9zeik7Ci0JaW9jLT5jaGFpbl9kbWEgPSBpb2MtPnJlcXVlc3RfZG1hICsgKChpb2MtPnJlcXVlc3RfZGVwdGggKyAxKSAqCisJaW9jLT5oaV9wcmlvcml0eV9kbWEgPSBpb2MtPnJlcXVlc3RfZG1hICsgKChpb2MtPnNjc2lpb19kZXB0aCArIDEpICoKIAkgICAgaW9jLT5yZXF1ZXN0X3N6KTsKKworCS8qIGludGVybmFsIHF1ZXVlICovCisJaW9jLT5pbnRlcm5hbCA9IGlvYy0+aGlfcHJpb3JpdHkgKyAoaW9jLT5oaV9wcmlvcml0eV9kZXB0aCAqCisJICAgIGlvYy0+cmVxdWVzdF9zeik7CisJaW9jLT5pbnRlcm5hbF9kbWEgPSBpb2MtPmhpX3ByaW9yaXR5X2RtYSArIChpb2MtPmhpX3ByaW9yaXR5X2RlcHRoICoKKwkgICAgaW9jLT5yZXF1ZXN0X3N6KTsKKworCWlvYy0+Y2hhaW4gPSBpb2MtPmludGVybmFsICsgKGlvYy0+aW50ZXJuYWxfZGVwdGggKgorCSAgICBpb2MtPnJlcXVlc3Rfc3opOworCWlvYy0+Y2hhaW5fZG1hID0gaW9jLT5pbnRlcm5hbF9kbWEgKyAoaW9jLT5pbnRlcm5hbF9kZXB0aCAqCisJICAgIGlvYy0+cmVxdWVzdF9zeik7CisKIAlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZXF1ZXN0IHBvb2woMHglcCk6ICIKIAkgICAgImRlcHRoKCVkKSwgZnJhbWVfc2l6ZSglZCksIHBvb2xfc2l6ZSglZCBrQilcbiIsIGlvYy0+bmFtZSwKLQkgICAgaW9jLT5yZXF1ZXN0LCBpb2MtPnJlcXVlc3RfZGVwdGgsIGlvYy0+cmVxdWVzdF9zeiwKLQkgICAgKChpb2MtPnJlcXVlc3RfZGVwdGggKyAxKSAqIGlvYy0+cmVxdWVzdF9zeikvMTAyNCkpOworCSAgICBpb2MtPnJlcXVlc3QsIGlvYy0+aGJhX3F1ZXVlX2RlcHRoLCBpb2MtPnJlcXVlc3Rfc3osCisJICAgIChpb2MtPmhiYV9xdWV1ZV9kZXB0aCAqIGlvYy0+cmVxdWVzdF9zeikvMTAyNCkpOwogCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImNoYWluIHBvb2woMHglcCk6IGRlcHRoIgogCSAgICAiKCVkKSwgZnJhbWVfc2l6ZSglZCksIHBvb2xfc2l6ZSglZCBrQilcbiIsIGlvYy0+bmFtZSwgaW9jLT5jaGFpbiwKIAkgICAgaW9jLT5jaGFpbl9kZXB0aCwgaW9jLT5yZXF1ZXN0X3N6LCAoKGlvYy0+Y2hhaW5fZGVwdGggKgpAQCAtMTg5OSw3ICsyMDMxLDcgQEAKIAkgICAgaW9jLT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKSBpb2MtPnJlcXVlc3RfZG1hKSk7CiAJdG90YWxfc3ogKz0gc3o7CiAKLQlpb2MtPnNjc2lfbG9va3VwID0ga2NhbGxvYyhpb2MtPnJlcXVlc3RfZGVwdGgsCisJaW9jLT5zY3NpX2xvb2t1cCA9IGtjYWxsb2MoaW9jLT5zY3NpaW9fZGVwdGgsCiAJICAgIHNpemVvZihzdHJ1Y3QgcmVxdWVzdF90cmFja2VyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpb2MtPnNjc2lfbG9va3VwKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgInNjc2lfbG9va3VwOiBrY2FsbG9jIGZhaWxlZFxuIiwKQEAgLTE5MDcsMTIgKzIwMzksMzggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JIC8qIGluaXRpYWxpemUgc29tZSBiaXRzICovCi0JZm9yIChpID0gMDsgaSA8IGlvYy0+cmVxdWVzdF9kZXB0aDsgaSsrKQotCQlpb2MtPnNjc2lfbG9va3VwW2ldLnNtaWQgPSBpICsgMTsKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzY3NpaW8oMHglcCk6ICIKKwkgICAgImRlcHRoKCVkKVxuIiwgaW9jLT5uYW1lLCBpb2MtPnJlcXVlc3QsCisJICAgIGlvYy0+c2NzaWlvX2RlcHRoKSk7CisKKwkvKiBpbml0aWFsaXplIGhpLXByaW9yaXR5IHF1ZXVlIHNtaWQncyAqLworCWlvYy0+aHByX2xvb2t1cCA9IGtjYWxsb2MoaW9jLT5oaV9wcmlvcml0eV9kZXB0aCwKKwkgICAgc2l6ZW9mKHN0cnVjdCByZXF1ZXN0X3RyYWNrZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvYy0+aHByX2xvb2t1cCkgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJocHJfbG9va3VwOiBrY2FsbG9jIGZhaWxlZFxuIiwKKwkJICAgIGlvYy0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwlpb2MtPmhpX3ByaW9yaXR5X3NtaWQgPSBpb2MtPnNjc2lpb19kZXB0aCArIDE7CisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiaGlfcHJpb3JpdHkoMHglcCk6ICIKKwkgICAgImRlcHRoKCVkKSwgc3RhcnQgc21pZCglZClcbiIsIGlvYy0+bmFtZSwgaW9jLT5oaV9wcmlvcml0eSwKKwkgICAgaW9jLT5oaV9wcmlvcml0eV9kZXB0aCwgaW9jLT5oaV9wcmlvcml0eV9zbWlkKSk7CisKKwkvKiBpbml0aWFsaXplIGludGVybmFsIHF1ZXVlIHNtaWQncyAqLworCWlvYy0+aW50ZXJuYWxfbG9va3VwID0ga2NhbGxvYyhpb2MtPmludGVybmFsX2RlcHRoLAorCSAgICBzaXplb2Yoc3RydWN0IHJlcXVlc3RfdHJhY2tlciksIEdGUF9LRVJORUwpOworCWlmICghaW9jLT5pbnRlcm5hbF9sb29rdXApIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiaW50ZXJuYWxfbG9va3VwOiBrY2FsbG9jIGZhaWxlZFxuIiwKKwkJICAgIGlvYy0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwlpb2MtPmludGVybmFsX3NtaWQgPSBpb2MtPmhpX3ByaW9yaXR5X3NtaWQgKyBpb2MtPmhpX3ByaW9yaXR5X2RlcHRoOworCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImludGVybmFsKDB4JXApOiAiCisJICAgICJkZXB0aCglZCksIHN0YXJ0IHNtaWQoJWQpXG4iLCBpb2MtPm5hbWUsIGlvYy0+aW50ZXJuYWwsCisJICAgICBpb2MtPmludGVybmFsX2RlcHRoLCBpb2MtPmludGVybmFsX3NtaWQpKTsKIAogCS8qIHNlbnNlIGJ1ZmZlcnMsIDQgYnl0ZSBhbGlnbiAqLwotCXN6ID0gaW9jLT5yZXF1ZXN0X2RlcHRoICogU0NTSV9TRU5TRV9CVUZGRVJTSVpFOworCXN6ID0gaW9jLT5zY3NpaW9fZGVwdGggKiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CiAJaW9jLT5zZW5zZV9kbWFfcG9vbCA9IHBjaV9wb29sX2NyZWF0ZSgic2Vuc2UgcG9vbCIsIGlvYy0+cGRldiwgc3osIDQsCiAJICAgIDApOwogCWlmICghaW9jLT5zZW5zZV9kbWFfcG9vbCkgewpAQCAtMTkyOSw3ICsyMDg3LDcgQEAKIAl9CiAJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVAogCSAgICAic2Vuc2UgcG9vbCgweCVwKTogZGVwdGgoJWQpLCBlbGVtZW50X3NpemUoJWQpLCBwb29sX3NpemUiCi0JICAgICIoJWQga0IpXG4iLCBpb2MtPm5hbWUsIGlvYy0+c2Vuc2UsIGlvYy0+cmVxdWVzdF9kZXB0aCwKKwkgICAgIiglZCBrQilcbiIsIGlvYy0+bmFtZSwgaW9jLT5zZW5zZSwgaW9jLT5zY3NpaW9fZGVwdGgsCiAJICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgc3ovMTAyNCkpOwogCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInNlbnNlX2RtYSgweCVsbHgpXG4iLAogCSAgICBpb2MtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpaW9jLT5zZW5zZV9kbWEpKTsKQEAgLTIzMDQsNyArMjQ2Miw3IEBACiAJICAgICgocmVxdWVzdF9ieXRlcy80KTw8TVBJMl9ET09SQkVMTF9BRERfRFdPUkRTX1NISUZUKSksCiAJICAgICZpb2MtPmNoaXAtPkRvb3JiZWxsKTsKIAotCWlmICgoX2Jhc2Vfd2FpdF9mb3JfZG9vcmJlbGxfaW50KGlvYywgNSwgc2xlZXBfZmxhZykpKSB7CisJaWYgKChfYmFzZV93YWl0X2Zvcl9kb29yYmVsbF9pbnQoaW9jLCA1LCBOT19TTEVFUCkpKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImRvb3JiZWxsIGhhbmRzaGFrZSAiCiAJCSAgICJpbnQgZmFpbGVkIChsaW5lPSVkKVxuIiwgaW9jLT5uYW1lLCBfX0xJTkVfXyk7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMjQ1NCw3ICsyNjEyLDggQEAKIAlpZiAobXBpX3JlcXVlc3QtPk9wZXJhdGlvbiA9PSBNUEkyX1NBU19PUF9QSFlfSEFSRF9SRVNFVCB8fAogCSAgICBtcGlfcmVxdWVzdC0+T3BlcmF0aW9uID09IE1QSTJfU0FTX09QX1BIWV9MSU5LX1JFU0VUKQogCQlpb2MtPmlvY19saW5rX3Jlc2V0X2luX3Byb2dyZXNzID0gMTsKLQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIG1waV9yZXF1ZXN0LT5WRl9JRCk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwlpbml0X2NvbXBsZXRpb24oJmlvYy0+YmFzZV9jbWRzLmRvbmUpOwogCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmJhc2VfY21kcy5kb25lLAogCSAgICBtc2Vjc190b19qaWZmaWVzKDEwMDAwKSk7CiAJaWYgKChtcGlfcmVxdWVzdC0+T3BlcmF0aW9uID09IE1QSTJfU0FTX09QX1BIWV9IQVJEX1JFU0VUIHx8CkBAIC0yNTU1LDcgKzI3MTQsOCBAQAogCXJlcXVlc3QgPSBtcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShpb2MsIHNtaWQpOwogCWlvYy0+YmFzZV9jbWRzLnNtaWQgPSBzbWlkOwogCW1lbWNweShyZXF1ZXN0LCBtcGlfcmVxdWVzdCwgc2l6ZW9mKE1waTJTZXBSZXBseV90KSk7Ci0JbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkLCBtcGlfcmVxdWVzdC0+VkZfSUQpOworCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7CisJaW5pdF9jb21wbGV0aW9uKCZpb2MtPmJhc2VfY21kcy5kb25lKTsKIAl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5iYXNlX2NtZHMuZG9uZSwKIAkgICAgbXNlY3NfdG9famlmZmllcygxMDAwMCkpOwogCWlmICghKGlvYy0+YmFzZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX0NPTVBMRVRFKSkgewpAQCAtMjcwMSwxMyArMjg2MSwxMiBAQAogLyoqCiAgKiBfYmFzZV9zZW5kX2lvY19pbml0IC0gc2VuZCBpb2NfaW5pdCB0byBmaXJtd2FyZQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAVkZfSUQ6IHZpcnR1YWwgZnVuY3Rpb24gaWQKICAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1fYmFzZV9zZW5kX2lvY19pbml0KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggVkZfSUQsIGludCBzbGVlcF9mbGFnKQorX2Jhc2Vfc2VuZF9pb2NfaW5pdChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIGludCBzbGVlcF9mbGFnKQogewogCU1waTJJT0NJbml0UmVxdWVzdF90IG1waV9yZXF1ZXN0OwogCU1waTJJT0NJbml0UmVwbHlfdCBtcGlfcmVwbHk7CkBAIC0yNzE5LDcgKzI4NzgsOCBAQAogCW1lbXNldCgmbXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkySU9DSW5pdFJlcXVlc3RfdCkpOwogCW1waV9yZXF1ZXN0LkZ1bmN0aW9uID0gTVBJMl9GVU5DVElPTl9JT0NfSU5JVDsKIAltcGlfcmVxdWVzdC5XaG9Jbml0ID0gTVBJMl9XSE9JTklUX0hPU1RfRFJJVkVSOwotCW1waV9yZXF1ZXN0LlZGX0lEID0gVkZfSUQ7CisJbXBpX3JlcXVlc3QuVkZfSUQgPSAwOyAvKiBUT0RPICovCisJbXBpX3JlcXVlc3QuVlBfSUQgPSAwOwogCW1waV9yZXF1ZXN0Lk1zZ1ZlcnNpb24gPSBjcHVfdG9fbGUxNihNUEkyX1ZFUlNJT04pOwogCW1waV9yZXF1ZXN0LkhlYWRlclZlcnNpb24gPSBjcHVfdG9fbGUxNihNUEkyX0hFQURFUl9WRVJTSU9OKTsKIApAQCAtMjc5NSwxMyArMjk1NSwxMiBAQAogLyoqCiAgKiBfYmFzZV9zZW5kX3BvcnRfZW5hYmxlIC0gc2VuZCBwb3J0X2VuYWJsZShkaXNjb3Zlcnkgc3R1ZmYpIHRvIGZpcm13YXJlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBWRl9JRDogdmlydHVhbCBmdW5jdGlvbiBpZAogICogQHNsZWVwX2ZsYWc6IENBTl9TTEVFUCBvciBOT19TTEVFUAogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKLV9iYXNlX3NlbmRfcG9ydF9lbmFibGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwgaW50IHNsZWVwX2ZsYWcpCitfYmFzZV9zZW5kX3BvcnRfZW5hYmxlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcpCiB7CiAJTXBpMlBvcnRFbmFibGVSZXF1ZXN0X3QgKm1waV9yZXF1ZXN0OwogCXUzMiBpb2Nfc3RhdGU7CkBAIC0yODI5LDkgKzI5ODgsMTEgQEAKIAlpb2MtPmJhc2VfY21kcy5zbWlkID0gc21pZDsKIAltZW1zZXQobXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkyUG9ydEVuYWJsZVJlcXVlc3RfdCkpOwogCW1waV9yZXF1ZXN0LT5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fUE9SVF9FTkFCTEU7Ci0JbXBpX3JlcXVlc3QtPlZGX0lEID0gVkZfSUQ7CisJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLworCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7CiAKLQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIFZGX0lEKTsKKwltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQpOworCWluaXRfY29tcGxldGlvbigmaW9jLT5iYXNlX2NtZHMuZG9uZSk7CiAJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+YmFzZV9jbWRzLmRvbmUsCiAJICAgIDMwMCpIWik7CiAJaWYgKCEoaW9jLT5iYXNlX2NtZHMuc3RhdHVzICYgTVBUMl9DTURfQ09NUExFVEUpKSB7CkBAIC0yODkyLDEzICszMDUzLDEyIEBACiAvKioKICAqIF9iYXNlX2V2ZW50X25vdGlmaWNhdGlvbiAtIHNlbmQgZXZlbnQgbm90aWZpY2F0aW9uCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBWRl9JRDogdmlydHVhbCBmdW5jdGlvbiBpZAogICogQHNsZWVwX2ZsYWc6IENBTl9TTEVFUCBvciBOT19TTEVFUAogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKLV9iYXNlX2V2ZW50X25vdGlmaWNhdGlvbihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IFZGX0lELCBpbnQgc2xlZXBfZmxhZykKK19iYXNlX2V2ZW50X25vdGlmaWNhdGlvbihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIGludCBzbGVlcF9mbGFnKQogewogCU1waTJFdmVudE5vdGlmaWNhdGlvblJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CiAJdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKQEAgLTI5MjYsMTEgKzMwODYsMTMgQEAKIAlpb2MtPmJhc2VfY21kcy5zbWlkID0gc21pZDsKIAltZW1zZXQobXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkyRXZlbnROb3RpZmljYXRpb25SZXF1ZXN0X3QpKTsKIAltcGlfcmVxdWVzdC0+RnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX0VWRU5UX05PVElGSUNBVElPTjsKLQltcGlfcmVxdWVzdC0+VkZfSUQgPSBWRl9JRDsKKwltcGlfcmVxdWVzdC0+VkZfSUQgPSAwOyAvKiBUT0RPICovCisJbXBpX3JlcXVlc3QtPlZQX0lEID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgTVBJMl9FVkVOVF9OT1RJRllfRVZFTlRNQVNLX1dPUkRTOyBpKyspCiAJCW1waV9yZXF1ZXN0LT5FdmVudE1hc2tzW2ldID0KIAkJICAgIGxlMzJfdG9fY3B1KGlvYy0+ZXZlbnRfbWFza3NbaV0pOwotCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCwgVkZfSUQpOworCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7CisJaW5pdF9jb21wbGV0aW9uKCZpb2MtPmJhc2VfY21kcy5kb25lKTsKIAl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5iYXNlX2NtZHMuZG9uZSwgMzAqSFopOwogCWlmICghKGlvYy0+YmFzZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX0NPTVBMRVRFKSkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogdGltZW91dFxuIiwKQEAgLTI5ODEsNyArMzE0Myw3IEBACiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmlvYy0+YmFzZV9jbWRzLm11dGV4KTsKLQlfYmFzZV9ldmVudF9ub3RpZmljYXRpb24oaW9jLCAwLCBDQU5fU0xFRVApOworCV9iYXNlX2V2ZW50X25vdGlmaWNhdGlvbihpb2MsIENBTl9TTEVFUCk7CiAJbXV0ZXhfdW5sb2NrKCZpb2MtPmJhc2VfY21kcy5tdXRleCk7CiB9CiAKQEAgLTMwMDYsNyArMzE2OCw2IEBACiAKIAlkcnNwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19ERUJVR19GTVQgImNsZWFyIGludGVycnVwdHNcbiIsCiAJICAgIGlvYy0+bmFtZSkpOwotCXdyaXRlbCgwLCAmaW9jLT5jaGlwLT5Ib3N0SW50ZXJydXB0U3RhdHVzKTsKIAogCWNvdW50ID0gMDsKIAlkbyB7CkBAIC0zMTYwLDMwICszMzIxLDYwIEBACiAvKioKICAqIF9iYXNlX21ha2VfaW9jX29wZXJhdGlvbmFsIC0gcHV0IGNvbnRyb2xsZXIgaW4gT1BFUkFUSU9OQUwgc3RhdGUKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQFZGX0lEOiB2aXJ0dWFsIGZ1bmN0aW9uIGlkCiAgKiBAc2xlZXBfZmxhZzogQ0FOX1NMRUVQIG9yIE5PX1NMRUVQCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotX2Jhc2VfbWFrZV9pb2Nfb3BlcmF0aW9uYWwoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwKLSAgICBpbnQgc2xlZXBfZmxhZykKK19iYXNlX21ha2VfaW9jX29wZXJhdGlvbmFsKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcpCiB7CiAJaW50IHIsIGk7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAl1MzIgcmVwbHlfYWRkcmVzczsKKwl1MTYgc21pZDsKKwlzdHJ1Y3QgX3RyX2xpc3QgKmRlbGF5ZWRfdHIsICpkZWxheWVkX3RyX25leHQ7CiAKIAlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAorCS8qIGNsZWFuIHRoZSBkZWxheWVkIHRhcmdldCByZXNldCBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlbGF5ZWRfdHIsIGRlbGF5ZWRfdHJfbmV4dCwKKwkgICAgJmlvYy0+ZGVsYXllZF90cl9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZkZWxheWVkX3RyLT5saXN0KTsKKwkJa2ZyZWUoZGVsYXllZF90cik7CisJfQorCiAJLyogaW5pdGlhbGl6ZSB0aGUgc2NzaSBsb29rdXAgZnJlZSBsaXN0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwogCUlOSVRfTElTVF9IRUFEKCZpb2MtPmZyZWVfbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IGlvYy0+cmVxdWVzdF9kZXB0aDsgaSsrKSB7CisJc21pZCA9IDE7CisJZm9yIChpID0gMDsgaSA8IGlvYy0+c2NzaWlvX2RlcHRoOyBpKyssIHNtaWQrKykgewogCQlpb2MtPnNjc2lfbG9va3VwW2ldLmNiX2lkeCA9IDB4RkY7CisJCWlvYy0+c2NzaV9sb29rdXBbaV0uc21pZCA9IHNtaWQ7CisJCWlvYy0+c2NzaV9sb29rdXBbaV0uc2NtZCA9IE5VTEw7CiAJCWxpc3RfYWRkX3RhaWwoJmlvYy0+c2NzaV9sb29rdXBbaV0udHJhY2tlcl9saXN0LAogCQkgICAgJmlvYy0+ZnJlZV9saXN0KTsKIAl9CisKKwkvKiBoaS1wcmlvcml0eSBxdWV1ZSAqLworCUlOSVRfTElTVF9IRUFEKCZpb2MtPmhwcl9mcmVlX2xpc3QpOworCXNtaWQgPSBpb2MtPmhpX3ByaW9yaXR5X3NtaWQ7CisJZm9yIChpID0gMDsgaSA8IGlvYy0+aGlfcHJpb3JpdHlfZGVwdGg7IGkrKywgc21pZCsrKSB7CisJCWlvYy0+aHByX2xvb2t1cFtpXS5jYl9pZHggPSAweEZGOworCQlpb2MtPmhwcl9sb29rdXBbaV0uc21pZCA9IHNtaWQ7CisJCWxpc3RfYWRkX3RhaWwoJmlvYy0+aHByX2xvb2t1cFtpXS50cmFja2VyX2xpc3QsCisJCSAgICAmaW9jLT5ocHJfZnJlZV9saXN0KTsKKwl9CisKKwkvKiBpbnRlcm5hbCBxdWV1ZSAqLworCUlOSVRfTElTVF9IRUFEKCZpb2MtPmludGVybmFsX2ZyZWVfbGlzdCk7CisJc21pZCA9IGlvYy0+aW50ZXJuYWxfc21pZDsKKwlmb3IgKGkgPSAwOyBpIDwgaW9jLT5pbnRlcm5hbF9kZXB0aDsgaSsrLCBzbWlkKyspIHsKKwkJaW9jLT5pbnRlcm5hbF9sb29rdXBbaV0uY2JfaWR4ID0gMHhGRjsKKwkJaW9jLT5pbnRlcm5hbF9sb29rdXBbaV0uc21pZCA9IHNtaWQ7CisJCWxpc3RfYWRkX3RhaWwoJmlvYy0+aW50ZXJuYWxfbG9va3VwW2ldLnRyYWNrZXJfbGlzdCwKKwkJICAgICZpb2MtPmludGVybmFsX2ZyZWVfbGlzdCk7CisJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwogCiAJLyogaW5pdGlhbGl6ZSBSZXBseSBGcmVlIFF1ZXVlICovCkBAIC0zMTk2LDcgKzMzODcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpb2MtPnJlcGx5X3Bvc3RfcXVldWVfZGVwdGg7IGkrKykKIAkJaW9jLT5yZXBseV9wb3N0X2ZyZWVbaV0uV29yZHMgPSBVTExPTkdfTUFYOwogCi0JciA9IF9iYXNlX3NlbmRfaW9jX2luaXQoaW9jLCBWRl9JRCwgc2xlZXBfZmxhZyk7CisJciA9IF9iYXNlX3NlbmRfaW9jX2luaXQoaW9jLCBzbGVlcF9mbGFnKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTMyMDcsMTQgKzMzOTgsMTQgQEAKIAl3cml0ZWwoMCwgJmlvYy0+Y2hpcC0+UmVwbHlQb3N0SG9zdEluZGV4KTsKIAogCV9iYXNlX3VubWFza19pbnRlcnJ1cHRzKGlvYyk7Ci0JciA9IF9iYXNlX2V2ZW50X25vdGlmaWNhdGlvbihpb2MsIFZGX0lELCBzbGVlcF9mbGFnKTsKKwlyID0gX2Jhc2VfZXZlbnRfbm90aWZpY2F0aW9uKGlvYywgc2xlZXBfZmxhZyk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCiAJaWYgKHNsZWVwX2ZsYWcgPT0gQ0FOX1NMRUVQKQogCQlfYmFzZV9zdGF0aWNfY29uZmlnX3BhZ2VzKGlvYyk7CiAKLQlyID0gX2Jhc2Vfc2VuZF9wb3J0X2VuYWJsZShpb2MsIFZGX0lELCBzbGVlcF9mbGFnKTsKKwlyID0gX2Jhc2Vfc2VuZF9wb3J0X2VuYWJsZShpb2MsIHNsZWVwX2ZsYWcpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIApAQCAtMzI3OCw2ICszNDY5LDE3IEBACiAJaWYgKHIpCiAJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOwogCisJaW9jLT5wZmFjdHMgPSBrY2FsbG9jKGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0cywKKwkgICAgc2l6ZW9mKE1waTJQb3J0RmFjdHNSZXBseV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb2MtPnBmYWN0cykKKwkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0czsgaSsrKSB7CisJCXIgPSBfYmFzZV9nZXRfcG9ydF9mYWN0cyhpb2MsIGksIENBTl9TTEVFUCk7CisJCWlmIChyKQorCQkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CisJfQorCiAJciA9IF9iYXNlX2FsbG9jYXRlX21lbW9yeV9wb29scyhpb2MsIENBTl9TTEVFUCk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOwpAQCAtMzI4Niw3ICszNDg4LDYgQEAKIAogCS8qIGJhc2UgaW50ZXJuYWwgY29tbWFuZCBiaXRzICovCiAJbXV0ZXhfaW5pdCgmaW9jLT5iYXNlX2NtZHMubXV0ZXgpOwotCWluaXRfY29tcGxldGlvbigmaW9jLT5iYXNlX2NtZHMuZG9uZSk7CiAJaW9jLT5iYXNlX2NtZHMucmVwbHkgPSBremFsbG9jKGlvYy0+cmVwbHlfc3osIEdGUF9LRVJORUwpOwogCWlvYy0+YmFzZV9jbWRzLnN0YXR1cyA9IE1QVDJfQ01EX05PVF9VU0VEOwogCkBAIC0zMjk0LDcgKzM0OTUsNiBAQAogCWlvYy0+dHJhbnNwb3J0X2NtZHMucmVwbHkgPSBremFsbG9jKGlvYy0+cmVwbHlfc3osIEdGUF9LRVJORUwpOwogCWlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CiAJbXV0ZXhfaW5pdCgmaW9jLT50cmFuc3BvcnRfY21kcy5tdXRleCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZpb2MtPnRyYW5zcG9ydF9jbWRzLmRvbmUpOwogCiAJLyogdGFzayBtYW5hZ2VtZW50IGludGVybmFsIGNvbW1hbmQgYml0cyAqLwogCWlvYy0+dG1fY21kcy5yZXBseSA9IGt6YWxsb2MoaW9jLT5yZXBseV9zeiwgR0ZQX0tFUk5FTCk7CkBAIC0zMzEwLDcgKzM1MTAsNiBAQAogCWlvYy0+Y3RsX2NtZHMucmVwbHkgPSBremFsbG9jKGlvYy0+cmVwbHlfc3osIEdGUF9LRVJORUwpOwogCWlvYy0+Y3RsX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CiAJbXV0ZXhfaW5pdCgmaW9jLT5jdGxfY21kcy5tdXRleCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZpb2MtPmN0bF9jbWRzLmRvbmUpOwogCiAJZm9yIChpID0gMDsgaSA8IE1QSTJfRVZFTlRfTk9USUZZX0VWRU5UTUFTS19XT1JEUzsgaSsrKQogCQlpb2MtPmV2ZW50X21hc2tzW2ldID0gLTE7CkBAIC0zMzI3LDE4ICszNTI2LDcgQEAKIAlfYmFzZV91bm1hc2tfZXZlbnRzKGlvYywgTVBJMl9FVkVOVF9JUl9PUEVSQVRJT05fU1RBVFVTKTsKIAlfYmFzZV91bm1hc2tfZXZlbnRzKGlvYywgTVBJMl9FVkVOVF9UQVNLX1NFVF9GVUxMKTsKIAlfYmFzZV91bm1hc2tfZXZlbnRzKGlvYywgTVBJMl9FVkVOVF9MT0dfRU5UUllfQURERUQpOwotCi0JaW9jLT5wZmFjdHMgPSBrY2FsbG9jKGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0cywKLQkgICAgc2l6ZW9mKE1waTJQb3J0RmFjdHNSZXBseV90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpb2MtPnBmYWN0cykKLQkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0czsgaSsrKSB7Ci0JCXIgPSBfYmFzZV9nZXRfcG9ydF9mYWN0cyhpb2MsIGksIENBTl9TTEVFUCk7Ci0JCWlmIChyKQotCQkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7Ci0JfQotCXIgPSBfYmFzZV9tYWtlX2lvY19vcGVyYXRpb25hbChpb2MsIDAsIENBTl9TTEVFUCk7CisJciA9IF9iYXNlX21ha2VfaW9jX29wZXJhdGlvbmFsKGlvYywgQ0FOX1NMRUVQKTsKIAlpZiAocikKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAKQEAgLTM0NjYsNyArMzY1NCw3IEBACiAKIAkvKiBwZW5kaW5nIGNvbW1hbmQgY291bnQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IGlvYy0+cmVxdWVzdF9kZXB0aDsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBpb2MtPnNjc2lpb19kZXB0aDsgaSsrKQogCQlpZiAoaW9jLT5zY3NpX2xvb2t1cFtpXS5jYl9pZHggIT0gMHhGRikKIAkJCWlvYy0+cGVuZGluZ19pb19jb3VudCsrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwpAQCAtMzQ5MCw3ICszNjc4LDcgQEAKIG1wdDJzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBfZmxhZywKICAgICBlbnVtIHJlc2V0X3R5cGUgdHlwZSkKIHsKLQlpbnQgciwgaTsKKwlpbnQgcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKQEAgLTM1MTMsOSArMzcwMSw3IEBACiAJaWYgKHIpCiAJCWdvdG8gb3V0OwogCV9iYXNlX3Jlc2V0X2hhbmRsZXIoaW9jLCBNUFQyX0lPQ19BRlRFUl9SRVNFVCk7Ci0JZm9yIChpID0gMCA7IGkgPCBpb2MtPmZhY3RzLk51bWJlck9mUG9ydHM7IGkrKykKLQkJciA9IF9iYXNlX21ha2VfaW9jX29wZXJhdGlvbmFsKGlvYywgaW9jLT5wZmFjdHNbaV0uVkZfSUQsCi0JCSAgICBzbGVlcF9mbGFnKTsKKwlyID0gX2Jhc2VfbWFrZV9pb2Nfb3BlcmF0aW9uYWwoaW9jLCBzbGVlcF9mbGFnKTsKIAlpZiAoIXIpCiAJCV9iYXNlX3Jlc2V0X2hhbmRsZXIoaW9jLCBNUFQyX0lPQ19ET05FX1JFU0VUKTsKICBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5oCmluZGV4IDJmYWFiMWUuLjBjZjZiYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5oCkBAIC0zLDcgKzMsNyBAQAogICogZm9yIGFjY2VzcyB0byBNUFQgKE1lc3NhZ2UgUGFzc2luZyBUZWNobm9sb2d5KSBmaXJtd2FyZS4KICAqCiAgKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0Ml9iYXNlLmgKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4ICBMU0kgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5ICBMU0kgQ29ycG9yYXRpb24KICAqICAobWFpbHRvOkRMLU1QVEZ1c2lvbkxpbnV4QGxzaS5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNjksMTAgKzY5LDEwIEBACiAjZGVmaW5lIE1QVDJTQVNfRFJJVkVSX05BTUUJCSJtcHQyc2FzIgogI2RlZmluZSBNUFQyU0FTX0FVVEhPUgkiTFNJIENvcnBvcmF0aW9uIDxETC1NUFRGdXNpb25MaW51eEBsc2kuY29tPiIKICNkZWZpbmUgTVBUMlNBU19ERVNDUklQVElPTgkiTFNJIE1QVCBGdXNpb24gU0FTIDIuMCBEZXZpY2UgRHJpdmVyIgotI2RlZmluZSBNUFQyU0FTX0RSSVZFUl9WRVJTSU9OCQkiMDEuMTAwLjA2LjAwIgotI2RlZmluZSBNUFQyU0FTX01BSk9SX1ZFUlNJT04JCTAxCisjZGVmaW5lIE1QVDJTQVNfRFJJVkVSX1ZFUlNJT04JCSIwMi4xMDAuMDMuMDAiCisjZGVmaW5lIE1QVDJTQVNfTUFKT1JfVkVSU0lPTgkJMDIKICNkZWZpbmUgTVBUMlNBU19NSU5PUl9WRVJTSU9OCQkxMDAKLSNkZWZpbmUgTVBUMlNBU19CVUlMRF9WRVJTSU9OCQkwNgorI2RlZmluZSBNUFQyU0FTX0JVSUxEX1ZFUlNJT04JCTAzCiAjZGVmaW5lIE1QVDJTQVNfUkVMRUFTRV9WRVJTSU9OCQkwMAogCiAvKgpAQCAtMjY0LDYgKzI2NCwxMyBAQAogICogU0FTIFRvcG9sb2d5IFN0cnVjdHVyZXMKICAqLwogCisjZGVmaW5lIE1QVFNBU19TVEFURV9UUl9TRU5ECQkweDAwMDEKKyNkZWZpbmUgTVBUU0FTX1NUQVRFX1RSX0NPTVBMRVRFCTB4MDAwMgorI2RlZmluZSBNUFRTQVNfU1RBVEVfQ05UUkxfU0VORAkJMHgwMDA0CisjZGVmaW5lIE1QVFNBU19TVEFURV9DTlRSTF9DT01QTEVURQkweDAwMDgKKworI2RlZmluZSBNUFQyU0FTX1JFUV9TQVNfQ05UUkwJCTB4MDAxMAorCiAvKioKICAqIHN0cnVjdCBfc2FzX2RldmljZSAtIGF0dGFjaGVkIGRldmljZSBpbmZvcm1hdGlvbgogICogQGxpc3Q6IHNhcyBkZXZpY2UgbGlzdApAQCAtMzAwLDYgKzMwNyw3IEBACiAJdTE2CXNsb3Q7CiAJdTgJaGlkZGVuX3JhaWRfY29tcG9uZW50OwogCXU4CXJlc3BvbmRpbmc7CisJdTE2CXN0YXRlOwogfTsKIAogLyoqCkBAIC00MzYsNiArNDQ0LDE3IEBACiAJc3RydWN0IGxpc3RfaGVhZCB0cmFja2VyX2xpc3Q7CiB9OwogCisvKioKKyAqIHN0cnVjdCBfdHJfbGlzdCAtIHRhcmdldCByZXNldCBsaXN0CisgKiBAaGFuZGxlOiBkZXZpY2UgaGFuZGxlCisgKiBAc3RhdGU6IHN0YXRlIG1hY2hpbmUKKyAqLworc3RydWN0IF90cl9saXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTE2CWhhbmRsZTsKKwl1MTYJc3RhdGU7Cit9OworCiB0eXBlZGVmIHZvaWQgKCpNUFRfQUREX1NHRSkodm9pZCAqcGFkZHIsIHUzMiBmbGFnc19sZW5ndGgsIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwogCiAvKioKQEAgLTUxMCw4ICs1MjksOSBAQAogICogQGNvbmZpZ19wYWdlX3N6OiBjb25maWcgcGFnZSBzaXplCiAgKiBAY29uZmlnX3BhZ2U6IHJlc2VydmUgbWVtb3J5IGZvciBjb25maWcgcGFnZSBwYXlsb2FkCiAgKiBAY29uZmlnX3BhZ2VfZG1hOgorICogQGhiYV9xdWV1ZV9kZXB0aDogaGJhIHJlcXVlc3QgcXVldWUgZGVwdGgKICAqIEBzZ2Vfc2l6ZTogc2cgZWxlbWVudCBzaXplIGZvciBlaXRoZXIgMzIvNjQgYml0Ci0gKiBAcmVxdWVzdF9kZXB0aDogaGJhIHJlcXVlc3QgcXVldWUgZGVwdGgKKyAqIEBzY3NpaW9fZGVwdGg6IFNDU0lfSU8gcXVldWUgZGVwdGgKICAqIEByZXF1ZXN0X3N6OiBwZXIgcmVxdWVzdCBmcmFtZSBzaXplCiAgKiBAcmVxdWVzdDogcG9vbCBvZiByZXF1ZXN0IGZyYW1lcwogICogQHJlcXVlc3RfZG1hOgpAQCAtNTI4LDYgKzU0OCwxOCBAQAogICogQGNoYWluc19uZWVkZWRfcGVyX2lvOiBtYXggY2hhaW5zIHBlciBpbwogICogQGNoYWluX29mZnNldF92YWx1ZV9mb3JfbWFpbl9tZXNzYWdlOiBsb2NhdGlvbiAxc3Qgc2cgaW4gbWFpbgogICogQGNoYWluX2RlcHRoOiB0b3RhbCBjaGFpbnMgYWxsb2NhdGVkCisgKiBAaGlfcHJpb3JpdHlfc21pZDoKKyAqIEBoaV9wcmlvcml0eToKKyAqIEBoaV9wcmlvcml0eV9kbWE6CisgKiBAaGlfcHJpb3JpdHlfZGVwdGg6CisgKiBAaHByX2xvb2t1cDoKKyAqIEBocHJfZnJlZV9saXN0OgorICogQGludGVybmFsX3NtaWQ6CisgKiBAaW50ZXJuYWw6CisgKiBAaW50ZXJuYWxfZG1hOgorICogQGludGVybmFsX2RlcHRoOgorICogQGludGVybmFsX2xvb2t1cDoKKyAqIEBpbnRlcm5hbF9mcmVlX2xpc3Q6CiAgKiBAc2Vuc2U6IHBvb2wgb2Ygc2Vuc2UKICAqIEBzZW5zZV9kbWE6CiAgKiBAc2Vuc2VfZG1hX3Bvb2w6CkBAIC01OTcsNiArNjI5LDggQEAKIAl1OAkJY3RsX2NiX2lkeDsKIAl1OAkJYmFzZV9jYl9pZHg7CiAJdTgJCWNvbmZpZ19jYl9pZHg7CisJdTgJCXRtX3RyX2NiX2lkeDsKKwl1OAkJdG1fc2FzX2NvbnRyb2xfY2JfaWR4OwogCXN0cnVjdCBfaW50ZXJuYWxfY21kIGJhc2VfY21kczsKIAlzdHJ1Y3QgX2ludGVybmFsX2NtZCB0cmFuc3BvcnRfY21kczsKIAlzdHJ1Y3QgX2ludGVybmFsX2NtZCB0bV9jbWRzOwpAQCAtNjQzLDkgKzY3NywxMCBAQAogCXZvaWQgCQkqY29uZmlnX3BhZ2U7CiAJZG1hX2FkZHJfdAljb25maWdfcGFnZV9kbWE7CiAKLQkvKiByZXF1ZXN0ICovCisJLyogc2NzaWlvIHJlcXVlc3QgKi8KKwl1MTYJCWhiYV9xdWV1ZV9kZXB0aDsKIAl1MTYJCXNnZV9zaXplOwotCXUxNiAJCXJlcXVlc3RfZGVwdGg7CisJdTE2IAkJc2NzaWlvX2RlcHRoOwogCXUxNgkJcmVxdWVzdF9zejsKIAl1OAkJKnJlcXVlc3Q7CiAJZG1hX2FkZHJfdAlyZXF1ZXN0X2RtYTsKQEAgLTY2NSw2ICs3MDAsMjIgQEAKIAl1MTYJCWNoYWluX29mZnNldF92YWx1ZV9mb3JfbWFpbl9tZXNzYWdlOwogCXUxNgkJY2hhaW5fZGVwdGg7CiAKKwkvKiBoaS1wcmlvcml0eSBxdWV1ZSAqLworCXUxNgkJaGlfcHJpb3JpdHlfc21pZDsKKwl1OAkJKmhpX3ByaW9yaXR5OworCWRtYV9hZGRyX3QJaGlfcHJpb3JpdHlfZG1hOworCXUxNgkJaGlfcHJpb3JpdHlfZGVwdGg7CisJc3RydWN0IHJlcXVlc3RfdHJhY2tlciAqaHByX2xvb2t1cDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhwcl9mcmVlX2xpc3Q7CisKKwkvKiBpbnRlcm5hbCBxdWV1ZSAqLworCXUxNgkJaW50ZXJuYWxfc21pZDsKKwl1OAkJKmludGVybmFsOworCWRtYV9hZGRyX3QJaW50ZXJuYWxfZG1hOworCXUxNgkJaW50ZXJuYWxfZGVwdGg7CisJc3RydWN0IHJlcXVlc3RfdHJhY2tlciAqaW50ZXJuYWxfbG9va3VwOworCXN0cnVjdCBsaXN0X2hlYWQgaW50ZXJuYWxfZnJlZV9saXN0OworCiAJLyogc2Vuc2UgKi8KIAl1OAkJKnNlbnNlOwogCWRtYV9hZGRyX3QJc2Vuc2VfZG1hOwpAQCAtNjkwLDYgKzc0MSw4IEBACiAJc3RydWN0IGRtYV9wb29sICpyZXBseV9wb3N0X2ZyZWVfZG1hX3Bvb2w7CiAJdTMyCQlyZXBseV9wb3N0X2hvc3RfaW5kZXg7CiAKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGF5ZWRfdHJfbGlzdDsKKwogCS8qIGRpYWcgYnVmZmVyIHN1cHBvcnQgKi8KIAl1OAkJKmRpYWdfYnVmZmVyW01QSTJfRElBR19CVUZfVFlQRV9DT1VOVF07CiAJdTMyCQlkaWFnX2J1ZmZlcl9zeltNUEkyX0RJQUdfQlVGX1RZUEVfQ09VTlRdOwpAQCAtNzAxLDcgKzc1NCw3IEBACiAJdTMyCQlkaWFnbm9zdGljX2ZsYWdzW01QSTJfRElBR19CVUZfVFlQRV9DT1VOVF07CiB9OwogCi10eXBlZGVmIHZvaWQgKCpNUFRfQ0FMTEJBQ0spKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IFZGX0lELAordHlwZWRlZiB1OCAoKk1QVF9DQUxMQkFDSykoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggbXNpeF9pbmRleCwKICAgICB1MzIgcmVwbHkpOwogCiAKQEAgLTcyMCwyMiArNzczLDI4IEBACiB2b2lkICptcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkKTsKIHZvaWQgKm1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQpOwogdm9pZCBtcHQyc2FzX2Jhc2VfYnVpbGRfemVyb19sZW5fc2dlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdm9pZCAqcGFkZHIpOwotZG1hX2FkZHJfdCBtcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZV9kbWEoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCk7Ci1kbWFfYWRkcl90IG1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyX2RtYShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkKTsKK2RtYV9hZGRyX3QgbXB0MnNhc19iYXNlX2dldF9zZW5zZV9idWZmZXJfZG1hKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKKyAgICB1MTYgc21pZCk7CisKKy8qIGhpLXByaW9yaXR5IHF1ZXVlICovCit1MTYgbXB0MnNhc19iYXNlX2dldF9zbWlkX2hwcihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IGNiX2lkeCk7Cit1MTYgbXB0MnNhc19iYXNlX2dldF9zbWlkX3Njc2lpbyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IGNiX2lkeCwKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKTsKIAogdTE2IG1wdDJzYXNfYmFzZV9nZXRfc21pZChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IGNiX2lkeCk7CiB2b2lkIG1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCk7Ci12b2lkIG1wdDJzYXNfYmFzZV9wdXRfc21pZF9zY3NpX2lvKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IHZmX2lkLAordm9pZCBtcHQyc2FzX2Jhc2VfcHV0X3NtaWRfc2NzaV9pbyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLAogICAgIHUxNiBoYW5kbGUpOwotdm9pZCBtcHQyc2FzX2Jhc2VfcHV0X3NtaWRfaGlfcHJpb3JpdHkoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggdmZfaWQpOwordm9pZCBtcHQyc2FzX2Jhc2VfcHV0X3NtaWRfaGlfcHJpb3JpdHkoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCk7CiB2b2lkIG1wdDJzYXNfYmFzZV9wdXRfc21pZF90YXJnZXRfYXNzaXN0KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsCi0gICAgdTggdmZfaWQsIHUxNiBpb19pbmRleCk7Ci12b2lkIG1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IHZmX2lkKTsKKyAgICB1MTYgaW9faW5kZXgpOwordm9pZCBtcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkKTsKIHZvaWQgbXB0MnNhc19iYXNlX2luaXRpYWxpemVfY2FsbGJhY2tfaGFuZGxlcih2b2lkKTsKIHU4IG1wdDJzYXNfYmFzZV9yZWdpc3Rlcl9jYWxsYmFja19oYW5kbGVyKE1QVF9DQUxMQkFDSyBjYl9mdW5jKTsKIHZvaWQgbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcih1OCBjYl9pZHgpOwogCi12b2lkIG1wdDJzYXNfYmFzZV9kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IFZGX0lELCB1MzIgcmVwbHkpOwordTggbXB0MnNhc19iYXNlX2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggbXNpeF9pbmRleCwKKyAgICB1MzIgcmVwbHkpOwogdm9pZCAqbXB0MnNhc19iYXNlX2dldF9yZXBseV92aXJ0X2FkZHIoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MzIgcGh5c19hZGRyKTsKIAogdTMyIG1wdDJzYXNfYmFzZV9nZXRfaW9jc3RhdGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCBpbnQgY29va2VkKTsKQEAgLTc0OSw2ICs4MDgsOCBAQAogdm9pZCBtcHQyc2FzX2Jhc2VfdmFsaWRhdGVfZXZlbnRfdHlwZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUzMiAqZXZlbnRfdHlwZSk7CiAKIC8qIHNjc2loIHNoYXJlZCBBUEkgKi8KK3U4IG1wdDJzYXNfc2NzaWhfZXZlbnRfY2FsbGJhY2soc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBtc2l4X2luZGV4LAorICAgIHUzMiByZXBseSk7CiB2b2lkIG1wdDJzYXNfc2NzaWhfaXNzdWVfdG0oc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgaGFuZGxlLCB1aW50IGx1biwKICAgICB1OCB0eXBlLCB1MTYgc21pZF90YXNrLCB1bG9uZyB0aW1lb3V0KTsKIHZvaWQgbXB0MnNhc19zY3NpaF9zZXRfdG1fZmxhZyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpOwpAQCAtNzYwLDExICs4MjEsMTEgQEAKIHN0cnVjdCBfc2FzX2RldmljZSAqbXB0MnNhc19zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfc2FzX2FkZHJlc3MoCiAgICAgc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1NjQgc2FzX2FkZHJlc3MpOwogCi12b2lkIG1wdDJzYXNfc2NzaWhfZXZlbnRfY2FsbGJhY2soc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwgdTMyIHJlcGx5KTsKIHZvaWQgbXB0MnNhc19zY3NpaF9yZXNldF9oYW5kbGVyKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgaW50IHJlc2V0X3BoYXNlKTsKIAogLyogY29uZmlnIHNoYXJlZCBBUEkgKi8KLXZvaWQgbXB0MnNhc19jb25maWdfZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBWRl9JRCwgdTMyIHJlcGx5KTsKK3U4IG1wdDJzYXNfY29uZmlnX2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggbXNpeF9pbmRleCwKKyAgICB1MzIgcmVwbHkpOwogaW50IG1wdDJzYXNfY29uZmlnX2dldF9udW1iZXJfaGJhX3BoeXMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCAqbnVtX3BoeXMpOwogaW50IG1wdDJzYXNfY29uZmlnX2dldF9tYW51ZmFjdHVyaW5nX3BnMChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCiAgICAgTXBpMkNvbmZpZ1JlcGx5X3QgKm1waV9yZXBseSwgTXBpMk1hbnVmYWN0dXJpbmdQYWdlMF90ICpjb25maWdfcGFnZSk7CkBAIC04MTcsMTQgKzg3OCwxNyBAQAogZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptcHQyc2FzX2Rldl9hdHRyc1tdOwogdm9pZCBtcHQyc2FzX2N0bF9pbml0KHZvaWQpOwogdm9pZCBtcHQyc2FzX2N0bF9leGl0KHZvaWQpOwotdm9pZCBtcHQyc2FzX2N0bF9kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IFZGX0lELCB1MzIgcmVwbHkpOwordTggbXB0MnNhc19jdGxfZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBtc2l4X2luZGV4LAorICAgIHUzMiByZXBseSk7CiB2b2lkIG1wdDJzYXNfY3RsX3Jlc2V0X2hhbmRsZXIoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCBpbnQgcmVzZXRfcGhhc2UpOwotdm9pZCBtcHQyc2FzX2N0bF9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IFZGX0lELCB1MzIgcmVwbHkpOwordTggbXB0MnNhc19jdGxfZXZlbnRfY2FsbGJhY2soc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBtc2l4X2luZGV4LAorICAgIHUzMiByZXBseSk7CiB2b2lkIG1wdDJzYXNfY3RsX2FkZF90b19ldmVudF9sb2coc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAogICAgIE1waTJFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QgKm1waV9yZXBseSk7CiAKIC8qIHRyYW5zcG9ydCBzaGFyZWQgQVBJICovCi12b2lkIG1wdDJzYXNfdHJhbnNwb3J0X2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggVkZfSUQsIHUzMiByZXBseSk7Cit1OCBtcHQyc2FzX3RyYW5zcG9ydF9kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IG1zaXhfaW5kZXgsCisgICAgdTMyIHJlcGx5KTsKIHN0cnVjdCBfc2FzX3BvcnQgKm1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfYWRkKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKICAgICB1MTYgaGFuZGxlLCB1MTYgcGFyZW50X2hhbmRsZSk7CiB2b2lkIG1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfcmVtb3ZlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTY0IHNhc19hZGRyZXNzLApAQCAtODM4LDYgKzkwMiw4IEBACiBleHRlcm4gc3RydWN0IHNhc19mdW5jdGlvbl90ZW1wbGF0ZSBtcHQyc2FzX3RyYW5zcG9ydF9mdW5jdGlvbnM7CiBleHRlcm4gc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICptcHQyc2FzX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIGV4dGVybiBpbnQgc2NzaV9pbnRlcm5hbF9kZXZpY2VfYmxvY2soc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKK2V4dGVybiB1OCBtcHQyc2FzX3N0bV96ZXJvX3NtaWRfaGFuZGxlcihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCisgICAgdTggbXNpeF9pbmRleCwgdTMyIHJlcGx5KTsKIGV4dGVybiBpbnQgc2NzaV9pbnRlcm5hbF9kZXZpY2VfdW5ibG9jayhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogCiAjZW5kaWYgLyogTVBUMlNBU19CQVNFX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY29uZmlnLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2NvbmZpZy5jCmluZGV4IGFiOGM1NjAuLjU5NGEzODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY29uZmlnLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jb25maWcuYwpAQCAtMiw3ICsyLDcgQEAKICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNvbW1vbiBBUEkgZm9yIGFjY2Vzc2luZyBmaXJtd2FyZSBjb25maWd1cmF0aW9uIHBhZ2VzCiAgKgogICogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIGRyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJfYmFzZS5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCAgTFNJIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSAgTFNJIENvcnBvcmF0aW9uCiAgKiAgKG1haWx0bzpETC1NUFRGdXNpb25MaW51eEBsc2kuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTIyNywyMyArMjI3LDI1IEBACiAgKiBtcHQyc2FzX2NvbmZpZ19kb25lIC0gY29uZmlnIHBhZ2UgY29tcGxldGlvbiByb3V0aW5lCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4Ci0gKiBAVkZfSUQ6IHZpcnR1YWwgZnVuY3Rpb24gaWQKKyAqIEBtc2l4X2luZGV4OiBNU0lYIHRhYmxlIGluZGV4IHN1cHBsaWVkIGJ5IHRoZSBPUwogICogQHJlcGx5OiByZXBseSBtZXNzYWdlIGZyYW1lKGxvd2VyIDMyYml0IGFkZHIpCiAgKiBDb250ZXh0OiBub25lLgogICoKICAqIFRoZSBjYWxsYmFjayBoYW5kbGVyIHdoZW4gdXNpbmcgX2NvbmZpZ19yZXF1ZXN0LgogICoKLSAqIFJldHVybiBub3RoaW5nLgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXZvaWQKLW1wdDJzYXNfY29uZmlnX2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggVkZfSUQsIHUzMiByZXBseSkKK3U4CittcHQyc2FzX2NvbmZpZ19kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IG1zaXhfaW5kZXgsCisgICAgdTMyIHJlcGx5KQogewogCU1QSTJEZWZhdWx0UmVwbHlfdCAqbXBpX3JlcGx5OwogCiAJaWYgKGlvYy0+Y29uZmlnX2NtZHMuc3RhdHVzID09IE1QVDJfQ01EX05PVF9VU0VEKQotCQlyZXR1cm47CisJCXJldHVybiAxOwogCWlmIChpb2MtPmNvbmZpZ19jbWRzLnNtaWQgIT0gc21pZCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAlpb2MtPmNvbmZpZ19jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9DT01QTEVURTsKIAltcGlfcmVwbHkgPSAgbXB0MnNhc19iYXNlX2dldF9yZXBseV92aXJ0X2FkZHIoaW9jLCByZXBseSk7CiAJaWYgKG1waV9yZXBseSkgewpAQCAtMjU3LDYgKzI1OSw3IEBACiAjZW5kaWYKIAlpb2MtPmNvbmZpZ19jbWRzLnNtaWQgPSBVU0hPUlRfTUFYOwogCWNvbXBsZXRlKCZpb2MtPmNvbmZpZ19jbWRzLmRvbmUpOworCXJldHVybiAxOwogfQogCiAvKioKQEAgLTMwMyw2ICszMDYsOSBAQAogCXJldHJ5X2NvdW50ID0gMDsKIAltZW1zZXQoJm1lbSwgMCwgc2l6ZW9mKHN0cnVjdCBjb25maWdfcmVxdWVzdCkpOwogCisJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLworCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7CisKIAlpZiAoY29uZmlnX3BhZ2UpIHsKIAkJbXBpX3JlcXVlc3QtPkhlYWRlci5QYWdlVmVyc2lvbiA9IG1waV9yZXBseS0+SGVhZGVyLlBhZ2VWZXJzaW9uOwogCQltcGlfcmVxdWVzdC0+SGVhZGVyLlBhZ2VOdW1iZXIgPSBtcGlfcmVwbHktPkhlYWRlci5QYWdlTnVtYmVyOwpAQCAtMzgwLDcgKzM4Niw3IEBACiAJX2NvbmZpZ19kaXNwbGF5X3NvbWVfZGVidWcoaW9jLCBzbWlkLCAiY29uZmlnX3JlcXVlc3QiLCBOVUxMKTsKICNlbmRpZgogCWluaXRfY29tcGxldGlvbigmaW9jLT5jb25maWdfY21kcy5kb25lKTsKLQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIGNvbmZpZ19yZXF1ZXN0LT5WRl9JRCk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKIAl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5jb25maWdfY21kcy5kb25lLAogCSAgICB0aW1lb3V0KkhaKTsKIAlpZiAoIShpb2MtPmNvbmZpZ19jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX0NPTVBMRVRFKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmMKaW5kZXggYzJhNTEwMS4uNTdkNzI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5jCkBAIC0zLDcgKzMsNyBAQAogICogY29udHJvbGxlcnMKICAqCiAgKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0Ml9jdGwuYwotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggIExTSSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIExTSSBDb3Jwb3JhdGlvbgogICogIChtYWlsdG86REwtTVBURnVzaW9uTGludXhAbHNpLmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yMTksMjMgKzIxOSwyNSBAQAogICogbXB0MnNhc19jdGxfZG9uZSAtIGN0bCBtb2R1bGUgY29tcGxldGlvbiByb3V0aW5lCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4Ci0gKiBAVkZfSUQ6IHZpcnR1YWwgZnVuY3Rpb24gaWQKKyAqIEBtc2l4X2luZGV4OiBNU0lYIHRhYmxlIGluZGV4IHN1cHBsaWVkIGJ5IHRoZSBPUwogICogQHJlcGx5OiByZXBseSBtZXNzYWdlIGZyYW1lKGxvd2VyIDMyYml0IGFkZHIpCiAgKiBDb250ZXh0OiBub25lLgogICoKICAqIFRoZSBjYWxsYmFjayBoYW5kbGVyIHdoZW4gdXNpbmcgaW9jLT5jdGxfY2JfaWR4LgogICoKLSAqIFJldHVybiBub3RoaW5nLgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXZvaWQKLW1wdDJzYXNfY3RsX2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggVkZfSUQsIHUzMiByZXBseSkKK3U4CittcHQyc2FzX2N0bF9kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IG1zaXhfaW5kZXgsCisJdTMyIHJlcGx5KQogewogCU1QSTJEZWZhdWx0UmVwbHlfdCAqbXBpX3JlcGx5OwogCiAJaWYgKGlvYy0+Y3RsX2NtZHMuc3RhdHVzID09IE1QVDJfQ01EX05PVF9VU0VEKQotCQlyZXR1cm47CisJCXJldHVybiAxOwogCWlmIChpb2MtPmN0bF9jbWRzLnNtaWQgIT0gc21pZCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAlpb2MtPmN0bF9jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9DT01QTEVURTsKIAltcGlfcmVwbHkgPSBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKIAlpZiAobXBpX3JlcGx5KSB7CkBAIC0yNDcsNiArMjQ5LDcgQEAKICNlbmRpZgogCWlvYy0+Y3RsX2NtZHMuc3RhdHVzICY9IH5NUFQyX0NNRF9QRU5ESU5HOwogCWNvbXBsZXRlKCZpb2MtPmN0bF9jbWRzLmRvbmUpOworCXJldHVybiAxOwogfQogCiAvKioKQEAgLTMyOCwyMiArMzMxLDI1IEBACiAvKioKICAqIG1wdDJzYXNfY3RsX2V2ZW50X2NhbGxiYWNrIC0gZmlybXdhcmUgZXZlbnQgaGFuZGxlciAoY2FsbGVkIGF0IElTUiB0aW1lKQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAVkZfSUQ6IHZpcnR1YWwgZnVuY3Rpb24gaWQKKyAqIEBtc2l4X2luZGV4OiBNU0lYIHRhYmxlIGluZGV4IHN1cHBsaWVkIGJ5IHRoZSBPUwogICogQHJlcGx5OiByZXBseSBtZXNzYWdlIGZyYW1lKGxvd2VyIDMyYml0IGFkZHIpCiAgKiBDb250ZXh0OiBpbnRlcnJ1cHQuCiAgKgogICogVGhpcyBmdW5jdGlvbiBtZXJlbHkgYWRkcyBhIG5ldyB3b3JrIHRhc2sgaW50byBpb2MtPmZpcm13YXJlX2V2ZW50X3RocmVhZC4KICAqIFRoZSB0YXNrcyBhcmUgd29ya2VkIGZyb20gX2Zpcm13YXJlX2V2ZW50X3dvcmsgaW4gdXNlciBjb250ZXh0LgogICoKLSAqIFJldHVybiBub3RoaW5nLgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXZvaWQKLW1wdDJzYXNfY3RsX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggVkZfSUQsIHUzMiByZXBseSkKK3U4CittcHQyc2FzX2N0bF9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IG1zaXhfaW5kZXgsCisJdTMyIHJlcGx5KQogewogCU1waTJFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QgKm1waV9yZXBseTsKIAogCW1waV9yZXBseSA9IG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOwogCW1wdDJzYXNfY3RsX2FkZF90b19ldmVudF9sb2coaW9jLCBtcGlfcmVwbHkpOworCXJldHVybiAxOwogfQogCiAvKioKQEAgLTUwNyw3ICs1MTMsNyBAQAogCiAJaGFuZGxlID0gbGUxNl90b19jcHUodG1fcmVxdWVzdC0+RGV2SGFuZGxlKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gaW9jLT5yZXF1ZXN0X2RlcHRoOyBpICYmICFmb3VuZDsgaS0tKSB7CisJZm9yIChpID0gaW9jLT5zY3NpaW9fZGVwdGg7IGkgJiYgIWZvdW5kOyBpLS0pIHsKIAkJc2NtZCA9IGlvYy0+c2NzaV9sb29rdXBbaSAtIDFdLnNjbWQ7CiAJCWlmIChzY21kID09IE5VTEwgfHwgc2NtZC0+ZGV2aWNlID09IE5VTEwgfHwKIAkJICAgIHNjbWQtPmRldmljZS0+aG9zdGRhdGEgPT0gTlVMTCkKQEAgLTYxNCw3ICs2MjAsNyBAQAogCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGlvYyBpcyBvcGVyYXRpb25hbFxuIiwKIAkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOwogCi0Jc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZChpb2MsIGlvYy0+Y3RsX2NiX2lkeCk7CisJc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZF9zY3NpaW8oaW9jLCBpb2MtPmN0bF9jYl9pZHgsIE5VTEwpOwogCWlmICghc21pZCkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogZmFpbGVkIG9idGFpbmluZyBhIHNtaWRcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKQEAgLTczNyw3ICs3NDMsNyBAQAogCQkgICAgKHUzMiltcHQyc2FzX2Jhc2VfZ2V0X3NlbnNlX2J1ZmZlcl9kbWEoaW9jLCBzbWlkKTsKIAkJcHJpdl9zZW5zZSA9IG1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyKGlvYywgc21pZCk7CiAJCW1lbXNldChwcml2X3NlbnNlLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwotCQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfc2NzaV9pbyhpb2MsIHNtaWQsIDAsCisJCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9zY3NpX2lvKGlvYywgc21pZCwKIAkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXF1ZXN0LT5GdW5jdGlvbkRlcGVuZGVudDEpKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzU5LDggKzc2NSw3IEBACiAJCW11dGV4X2xvY2soJmlvYy0+dG1fY21kcy5tdXRleCk7CiAJCW1wdDJzYXNfc2NzaWhfc2V0X3RtX2ZsYWcoaW9jLCBsZTE2X3RvX2NwdSgKIAkJICAgIHRtX3JlcXVlc3QtPkRldkhhbmRsZSkpOwotCQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfaGlfcHJpb3JpdHkoaW9jLCBzbWlkLAotCQkgICAgbXBpX3JlcXVlc3QtPlZGX0lEKTsKKwkJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2hpX3ByaW9yaXR5KGlvYywgc21pZCk7CiAJCWJyZWFrOwogCX0KIAljYXNlIE1QSTJfRlVOQ1RJT05fU01QX1BBU1NUSFJPVUdIOgpAQCAtNzgxLDcgKzc4Niw3IEBACiAJCQlpb2MtPmlvY19saW5rX3Jlc2V0X2luX3Byb2dyZXNzID0gMTsKIAkJCWlvYy0+aWdub3JlX2xvZ2luZm9zID0gMTsKIAkJfQotCQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIG1waV9yZXF1ZXN0LT5WRl9JRCk7CisJCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7CiAJCWJyZWFrOwogCX0KIAljYXNlIE1QSTJfRlVOQ1RJT05fU0FTX0lPX1VOSVRfQ09OVFJPTDoKQEAgLTc5NSwxMSArODAwLDExIEBACiAJCQlpb2MtPmlvY19saW5rX3Jlc2V0X2luX3Byb2dyZXNzID0gMTsKIAkJCWlvYy0+aWdub3JlX2xvZ2luZm9zID0gMTsKIAkJfQotCQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIG1waV9yZXF1ZXN0LT5WRl9JRCk7CisJCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7CiAJCWJyZWFrOwogCX0KIAlkZWZhdWx0OgotCQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIG1waV9yZXF1ZXN0LT5WRl9JRCk7CisJCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7CiAJCWJyZWFrOwogCX0KIApAQCAtODA3LDYgKzgxMiw3IEBACiAJCXRpbWVvdXQgPSBNUFQyX0lPQ1RMX0RFRkFVTFRfVElNRU9VVDsKIAllbHNlCiAJCXRpbWVvdXQgPSBrYXJnLnRpbWVvdXQ7CisJaW5pdF9jb21wbGV0aW9uKCZpb2MtPmN0bF9jbWRzLmRvbmUpOwogCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmN0bF9jbWRzLmRvbmUsCiAJICAgIHRpbWVvdXQqSFopOwogCWlmIChtcGlfcmVxdWVzdC0+RnVuY3Rpb24gPT0gTVBJMl9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVCkgewpAQCAtMTM3MSw2ICsxMzc3LDggQEAKIAltcGlfcmVxdWVzdC0+RmxhZ3MgPSBjcHVfdG9fbGUzMihrYXJnLmRpYWdub3N0aWNfZmxhZ3MpOwogCW1waV9yZXF1ZXN0LT5CdWZmZXJBZGRyZXNzID0gY3B1X3RvX2xlNjQocmVxdWVzdF9kYXRhX2RtYSk7CiAJbXBpX3JlcXVlc3QtPkJ1ZmZlckxlbmd0aCA9IGNwdV90b19sZTMyKHJlcXVlc3RfZGF0YV9zeik7CisJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLworCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7CiAKIAlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZGlhZ19idWZmZXIoMHglcCksICIKIAkgICAgImRtYSgweCVsbHgpLCBzeiglZClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sIHJlcXVlc3RfZGF0YSwKQEAgLTEzODAsNyArMTM4OCw4IEBACiAJCW1waV9yZXF1ZXN0LT5Qcm9kdWN0U3BlY2lmaWNbaV0gPQogCQkJY3B1X3RvX2xlMzIoaW9jLT5wcm9kdWN0X3NwZWNpZmljW2J1ZmZlcl90eXBlXVtpXSk7CiAKLQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIG1waV9yZXF1ZXN0LT5WRl9JRCk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwlpbml0X2NvbXBsZXRpb24oJmlvYy0+Y3RsX2NtZHMuZG9uZSk7CiAJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+Y3RsX2NtZHMuZG9uZSwKIAkgICAgTVBUMl9JT0NUTF9ERUZBVUxUX1RJTUVPVVQqSFopOwogCkBAIC0xNjQzLDggKzE2NTIsMTEgQEAKIAogCW1waV9yZXF1ZXN0LT5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fRElBR19SRUxFQVNFOwogCW1waV9yZXF1ZXN0LT5CdWZmZXJUeXBlID0gYnVmZmVyX3R5cGU7CisJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLworCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7CiAKLQltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQsIG1waV9yZXF1ZXN0LT5WRl9JRCk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwlpbml0X2NvbXBsZXRpb24oJmlvYy0+Y3RsX2NtZHMuZG9uZSk7CiAJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+Y3RsX2NtZHMuZG9uZSwKIAkgICAgTVBUMl9JT0NUTF9ERUZBVUxUX1RJTUVPVVQqSFopOwogCkBAIC0xOTAyLDggKzE5MTQsMTEgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTVBUMl9QUk9EVUNUX1NQRUNJRklDX0RXT1JEUzsgaSsrKQogCQltcGlfcmVxdWVzdC0+UHJvZHVjdFNwZWNpZmljW2ldID0KIAkJCWNwdV90b19sZTMyKGlvYy0+cHJvZHVjdF9zcGVjaWZpY1tidWZmZXJfdHlwZV1baV0pOworCW1waV9yZXF1ZXN0LT5WRl9JRCA9IDA7IC8qIFRPRE8gKi8KKwltcGlfcmVxdWVzdC0+VlBfSUQgPSAwOwogCi0JbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkLCBtcGlfcmVxdWVzdC0+VkZfSUQpOworCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7CisJaW5pdF9jb21wbGV0aW9uKCZpb2MtPmN0bF9jbWRzLmRvbmUpOwogCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmN0bF9jbWRzLmRvbmUsCiAJICAgIE1QVDJfSU9DVExfREVGQVVMVF9USU1FT1VUKkhaKTsKIApAQCAtMjA2OSw2ICsyMDg0LDcgQEAKIF9jdGxfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWxvbmcgcmV0OworCiAJbG9ja19rZXJuZWwoKTsKIAlyZXQgPSBfY3RsX2lvY3RsX21haW4oZmlsZSwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOwogCXVubG9ja19rZXJuZWwoKTsKQEAgLTIxNDMsNiArMjE1OSw3IEBACiBfY3RsX2lvY3RsX2NvbXBhdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlsb25nIHJldDsKKwogCWxvY2tfa2VybmVsKCk7CiAJaWYgKGNtZCA9PSBNUFQyQ09NTUFORDMyKQogCQlyZXQgPSBfY3RsX2NvbXBhdF9tcHRfY29tbWFuZChmaWxlLCBjbWQsIGFyZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuaAppbmRleCA0ZGExMTQzLi4yMTFmMjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmgKQEAgLTMsNyArMyw3IEBACiAgKiBjb250cm9sbGVycwogICoKICAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBkcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyX2N0bC5oCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCAgTFNJIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSAgTFNJIENvcnBvcmF0aW9uCiAgKiAgKG1haWx0bzpETC1NUFRGdXNpb25MaW51eEBsc2kuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfZGVidWcuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfZGVidWcuaAppbmRleCBhZDMyNTA5Li41MzA4YTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2RlYnVnLmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19kZWJ1Zy5oCkBAIC0yLDcgKzIsNyBAQAogICogTG9nZ2luZyBTdXBwb3J0IGZvciBNUFQgKE1lc3NhZ2UgUGFzc2luZyBUZWNobm9sb2d5KSBiYXNlZCBjb250cm9sbGVycwogICoKICAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBkcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyX2RlYnVnLmMKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4ICBMU0kgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5ICBMU0kgQ29ycG9yYXRpb24KICAqICAobWFpbHRvOkRMLU1QVEZ1c2lvbkxpbnV4QGxzaS5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCmluZGV4IDc3NGIzNDUuLjg2YWIzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKQEAgLTIsNyArMiw3IEBACiAgKiBTY3NpIEhvc3QgTGF5ZXIgZm9yIE1QVCAoTWVzc2FnZSBQYXNzaW5nIFRlY2hub2xvZ3kpIGJhc2VkIGNvbnRyb2xsZXJzCiAgKgogICogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIGRyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJfc2NzaWguYwotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggIExTSSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIExTSSBDb3Jwb3JhdGlvbgogICogIChtYWlsdG86REwtTVBURnVzaW9uTGludXhAbHNpLmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC03OSw2ICs3OSw5IEBACiBzdGF0aWMgdTggY29uZmlnX2NiX2lkeCA9IC0xOwogc3RhdGljIGludCBtcHRfaWRzOwogCitzdGF0aWMgdTggdG1fdHJfY2JfaWR4ID0gLTEgOworc3RhdGljIHU4IHRtX3Nhc19jb250cm9sX2NiX2lkeCA9IC0xOworCiAvKiBjb21tYW5kIGxpbmUgb3B0aW9ucyAqLwogc3RhdGljIHUzMiBsb2dnaW5nX2xldmVsOwogTU9EVUxFX1BBUk1fREVTQyhsb2dnaW5nX2xldmVsLCAiIGJpdHMgZm9yIGVuYWJsaW5nIGFkZGl0aW9uYWwgbG9nZ2luZyBpbmZvICIKQEAgLTEwOSw2ICsxMTIsNyBAQAogICogQHdvcms6IHdvcmsgb2JqZWN0IChpb2MtPmZhdWx0X3Jlc2V0X3dvcmtfcSkKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQFZGX0lEOiB2aXJ0dWFsIGZ1bmN0aW9uIGlkCisgKiBAVlBfSUQ6IHZpcnR1YWwgcG9ydCBpZAogICogQGhvc3RfcmVzZXRfaGFuZGxpbmc6IGhhbmRsaW5nIGV2ZW50cyBkdXJpbmcgaG9zdCByZXNldAogICogQGlnbm9yZTogZmxhZyBtZWFuaW5nIHRoaXMgZXZlbnQgaGFzIGJlZW4gbWFya2VkIHRvIGlnbm9yZQogICogQGV2ZW50OiBmaXJtd2FyZSBldmVudCBNUEkyX0VWRU5UX1hYWCBkZWZpbmVkIGluIG1wdDJfaW9jLmgKQEAgLTEyMSw2ICsxMjUsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYzsKIAl1OAkJCVZGX0lEOworCXU4CQkJVlBfSUQ7CiAJdTgJCQlob3N0X3Jlc2V0X2hhbmRsaW5nOwogCXU4CQkJaWdub3JlOwogCXUxNgkJCWV2ZW50OwpAQCAtMTM4LDggKzE0MywxMCBAQAogICogQGx1bjogbHVuIG51bWJlcgogICogQGNkYl9sZW5ndGg6IGNkYiBsZW5ndGgKICAqIEBjZGI6IGNkYiBjb250ZW50cwotICogQHZhbGlkX3JlcGx5OiBmbGFnIHNldCBmb3IgcmVwbHkgbWVzc2FnZQogICogQHRpbWVvdXQ6IHRpbWVvdXQgZm9yIHRoaXMgY29tbWFuZAorICogQFZGX0lEOiB2aXJ0dWFsIGZ1bmN0aW9uIGlkCisgKiBAVlBfSUQ6IHZpcnR1YWwgcG9ydCBpZAorICogQHZhbGlkX3JlcGx5OiBmbGFnIHNldCBmb3IgcmVwbHkgbWVzc2FnZQogICogQHNlbnNlX2xlbmd0aDogc2Vuc2UgbGVuZ3RoCiAgKiBAaW9jX3N0YXR1czogaW9jIHN0YXR1cwogICogQHNjc2lfc3RhdGU6IHNjc2kgc3RhdGUKQEAgLTE2MSw2ICsxNjgsOCBAQAogCXU4CWNkYl9sZW5ndGg7CiAJdTgJY2RiWzMyXTsKIAl1OAl0aW1lb3V0OworCXU4CVZGX0lEOworCXU4CVZQX0lEOwogCXU4CXZhbGlkX3JlcGx5OwogICAvKiB0aGUgZm9sbG93aW5nIGJpdHMgYXJlIG9ubHkgdmFsaWQgd2hlbiAndmFsaWRfcmVwbHkgPSAxJyAqLwogCXUzMglzZW5zZV9sZW5ndGg7CkBAIC03NTYsNjYgKzc2NSwxNiBAQAogfQogCiAvKioKLSAqIF9zY3NpaF9zY3NpX2xvb2t1cF9nZXQgLSByZXR1cm5zIHNjbWQgZW50cnkKKyAqIG1wdHNjc2loX2dldF9zY3NpX2xvb2t1cCAtIHJldHVybnMgc2NtZCBlbnRyeQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAotICogQ29udGV4dDogVGhpcyBmdW5jdGlvbiB3aWxsIGFjcXVpcmUgaW9jLT5zY3NpX2xvb2t1cF9sb2NrLgogICoKICAqIFJldHVybnMgdGhlIHNtaWQgc3RvcmVkIHNjbWQgcG9pbnRlci4KICAqLwogc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKgogX3Njc2loX3Njc2lfbG9va3VwX2dldChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkKQogewotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0Jc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKLQlzY21kID0gaW9jLT5zY3NpX2xvb2t1cFtzbWlkIC0gMV0uc2NtZDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gc2NtZDsKLX0KLQotLyoqCi0gKiBtcHRzY3NpaF9nZXRjbGVhcl9zY3NpX2xvb2t1cCAtIHJldHVybnMgc2NtZCBlbnRyeQotICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAotICogQ29udGV4dDogVGhpcyBmdW5jdGlvbiB3aWxsIGFjcXVpcmUgaW9jLT5zY3NpX2xvb2t1cF9sb2NrLgotICoKLSAqIFJldHVybnMgdGhlIHNtaWQgc3RvcmVkIHNjbWQgcG9pbnRlciwgYXMgd2VsbCBhcyBjbGVhcmluZyB0aGUgc2NtZCBwb2ludGVyLgotICovCi1zdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqCi1fc2NzaWhfc2NzaV9sb29rdXBfZ2V0Y2xlYXIoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCkKLXsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7Ci0Jc2NtZCA9IGlvYy0+c2NzaV9sb29rdXBbc21pZCAtIDFdLnNjbWQ7Ci0JaW9jLT5zY3NpX2xvb2t1cFtzbWlkIC0gMV0uc2NtZCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHNjbWQ7Ci19Ci0KLS8qKgotICogX3Njc2loX3Njc2lfbG9va3VwX3NldCAtIHVwZGF0ZXMgc2NtZCBlbnRyeSBpbiBsb29rdXAKLSAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQHNtaWQ6IHN5c3RlbSByZXF1ZXN0IG1lc3NhZ2UgaW5kZXgKLSAqIEBzY21kOiBwb2ludGVyIHRvIHNjc2kgY29tbWFuZCBvYmplY3QKLSAqIENvbnRleHQ6IFRoaXMgZnVuY3Rpb24gd2lsbCBhY3F1aXJlIGlvYy0+c2NzaV9sb29rdXBfbG9jay4KLSAqCi0gKiBUaGlzIHdpbGwgc2F2ZSBzY21kIHBvaW50ZXIgaW4gdGhlIHNjc2lfbG9va3VwIGFycmF5LgotICoKLSAqIFJldHVybiBub3RoaW5nLgotICovCi1zdGF0aWMgdm9pZAotX3Njc2loX3Njc2lfbG9va3VwX3NldChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLAotICAgIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCi17Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKLQlpb2MtPnNjc2lfbG9va3VwW3NtaWQgLSAxXS5zY21kID0gc2NtZDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaW9jLT5zY3NpX2xvb2t1cFtzbWlkIC0gMV0uc2NtZDsKIH0KIAogLyoqCkBAIC04MzgsOSArNzk3LDkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKIAlzbWlkID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgaW9jLT5yZXF1ZXN0X2RlcHRoOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgaW9jLT5zY3NpaW9fZGVwdGg7IGkrKykgewogCQlpZiAoaW9jLT5zY3NpX2xvb2t1cFtpXS5zY21kID09IHNjbWQpIHsKLQkJCXNtaWQgPSBpICsgMTsKKwkJCXNtaWQgPSBpb2MtPnNjc2lfbG9va3VwW2ldLnNtaWQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTg2OSw3ICs4MjgsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwogCWZvdW5kID0gMDsKLQlmb3IgKGkgPSAwIDsgaSA8IGlvYy0+cmVxdWVzdF9kZXB0aDsgaSsrKSB7CisJZm9yIChpID0gMCA7IGkgPCBpb2MtPnNjc2lpb19kZXB0aDsgaSsrKSB7CiAJCWlmIChpb2MtPnNjc2lfbG9va3VwW2ldLnNjbWQgJiYKIAkJICAgIChpb2MtPnNjc2lfbG9va3VwW2ldLnNjbWQtPmRldmljZS0+aWQgPT0gaWQgJiYKIAkJICAgIGlvYy0+c2NzaV9sb29rdXBbaV0uc2NtZC0+ZGV2aWNlLT5jaGFubmVsID09IGNoYW5uZWwpKSB7CkBAIC05MDMsNyArODYyLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKIAlmb3VuZCA9IDA7Ci0JZm9yIChpID0gMCA7IGkgPCBpb2MtPnJlcXVlc3RfZGVwdGg7IGkrKykgeworCWZvciAoaSA9IDAgOyBpIDwgaW9jLT5zY3NpaW9fZGVwdGg7IGkrKykgewogCQlpZiAoaW9jLT5zY3NpX2xvb2t1cFtpXS5zY21kICYmCiAJCSAgICAoaW9jLT5zY3NpX2xvb2t1cFtpXS5zY21kLT5kZXZpY2UtPmlkID09IGlkICYmCiAJCSAgICBpb2MtPnNjc2lfbG9va3VwW2ldLnNjbWQtPmRldmljZS0+Y2hhbm5lbCA9PSBjaGFubmVsICYmCkBAIC0xMTEzLDcgKzEwNzIsNyBAQAogfQogCiAvKioKLSAqIF9zY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGggLSBjaGFuZ2luZyBkZXZpY2UgcXVldWUgdGFnIHR5cGUKKyAqIF9zY3NpaF9jaGFuZ2VfcXVldWVfdHlwZSAtIGNoYW5naW5nIGRldmljZSBxdWV1ZSB0YWcgdHlwZQogICogQHNkZXY6IHNjc2kgZGV2aWNlIHN0cnVjdAogICogQHRhZ190eXBlOiByZXF1ZXN0ZWQgdGFnIHR5cGUKICAqCkBAIC0xNjc5LDIzICsxNjM4LDI0IEBACiAgKiBfc2NzaWhfdG1fZG9uZSAtIHRtIGNvbXBsZXRpb24gcm91dGluZQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAotICogQFZGX0lEOiB2aXJ0dWFsIGZ1bmN0aW9uIGlkCisgKiBAbXNpeF9pbmRleDogTVNJWCB0YWJsZSBpbmRleCBzdXBwbGllZCBieSB0aGUgT1MKICAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBmcmFtZShsb3dlciAzMmJpdCBhZGRyKQogICogQ29udGV4dDogbm9uZS4KICAqCiAgKiBUaGUgY2FsbGJhY2sgaGFuZGxlciB3aGVuIHVzaW5nIHNjc2loX2lzc3VlX3RtLgogICoKLSAqIFJldHVybiBub3RoaW5nLgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyB2b2lkCi1fc2NzaWhfdG1fZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBWRl9JRCwgdTMyIHJlcGx5KQorc3RhdGljIHU4Citfc2NzaWhfdG1fZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBtc2l4X2luZGV4LCB1MzIgcmVwbHkpCiB7CiAJTVBJMkRlZmF1bHRSZXBseV90ICptcGlfcmVwbHk7CiAKIAlpZiAoaW9jLT50bV9jbWRzLnN0YXR1cyA9PSBNUFQyX0NNRF9OT1RfVVNFRCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAlpZiAoaW9jLT50bV9jbWRzLnNtaWQgIT0gc21pZCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAlpb2MtPnRtX2NtZHMuc3RhdHVzIHw9IE1QVDJfQ01EX0NPTVBMRVRFOwogCW1waV9yZXBseSA9ICBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKIAlpZiAobXBpX3JlcGx5KSB7CkBAIC0xNzA0LDYgKzE2NjQsNyBAQAogCX0KIAlpb2MtPnRtX2NtZHMuc3RhdHVzICY9IH5NUFQyX0NNRF9QRU5ESU5HOwogCWNvbXBsZXRlKCZpb2MtPnRtX2NtZHMuZG9uZSk7CisJcmV0dXJuIDE7CiB9CiAKIC8qKgpAQCAtMTc5MCw3ICsxNzUxLDYgQEAKIAl1MTYgc21pZCA9IDA7CiAJdTMyIGlvY19zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIHRpbWVsZWZ0OwotCXU4IFZGX0lEID0gMDsKIAogCWlmIChpb2MtPnRtX2NtZHMuc3RhdHVzICE9IE1QVDJfQ01EX05PVF9VU0VEKSB7CiAJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogdG1fY21kIGJ1c3khISFcbiIsCkBAIC0xODE3LDcgKzE3NzcsNyBAQAogCQlnb3RvIGlzc3VlX2hvc3RfcmVzZXQ7CiAJfQogCi0Jc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZChpb2MsIGlvYy0+dG1fY2JfaWR4KTsKKwlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkX2hwcihpb2MsIGlvYy0+dG1fY2JfaWR4KTsKIAlpZiAoIXNtaWQpIHsKIAkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBvYnRhaW5pbmcgYSBzbWlkXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CkBAIC0xODI1LDcgKzE3ODUsOCBAQAogCX0KIAogCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZW5kaW5nIHRtOiBoYW5kbGUoMHglMDR4KSwiCi0JICAgICIgdGFza190eXBlKDB4JTAyeCksIHNtaWQoJWQpXG4iLCBpb2MtPm5hbWUsIGhhbmRsZSwgdHlwZSwgc21pZCkpOworCSAgICAiIHRhc2tfdHlwZSgweCUwMngpLCBzbWlkKCVkKVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUsIHR5cGUsCisJICAgIHNtaWRfdGFzaykpOwogCWlvYy0+dG1fY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9QRU5ESU5HOwogCW1waV9yZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkKTsKIAlpb2MtPnRtX2NtZHMuc21pZCA9IHNtaWQ7CkBAIC0xODM0LDEwICsxNzk1LDEyIEBACiAJbXBpX3JlcXVlc3QtPkRldkhhbmRsZSA9IGNwdV90b19sZTE2KGhhbmRsZSk7CiAJbXBpX3JlcXVlc3QtPlRhc2tUeXBlID0gdHlwZTsKIAltcGlfcmVxdWVzdC0+VGFza01JRCA9IGNwdV90b19sZTE2KHNtaWRfdGFzayk7CisJbXBpX3JlcXVlc3QtPlZQX0lEID0gMDsgIC8qIFRPRE8gKi8KKwltcGlfcmVxdWVzdC0+VkZfSUQgPSAwOwogCWludF90b19zY3NpbHVuKGx1biwgKHN0cnVjdCBzY3NpX2x1biAqKW1waV9yZXF1ZXN0LT5MVU4pOwogCW1wdDJzYXNfc2NzaWhfc2V0X3RtX2ZsYWcoaW9jLCBoYW5kbGUpOwogCWluaXRfY29tcGxldGlvbigmaW9jLT50bV9jbWRzLmRvbmUpOwotCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9oaV9wcmlvcml0eShpb2MsIHNtaWQsIFZGX0lEKTsKKwltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfaGlfcHJpb3JpdHkoaW9jLCBzbWlkKTsKIAl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT50bV9jbWRzLmRvbmUsIHRpbWVvdXQqSFopOwogCW1wdDJzYXNfc2NzaWhfY2xlYXJfdG1fZmxhZyhpb2MsIGhhbmRsZSk7CiAJaWYgKCEoaW9jLT50bV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX0NPTVBMRVRFKSkgewpAQCAtMjA3NSw3ICsyMDM4LDcgQEAKIH0KIAogLyoqCi0gKiBfc2NzaWhfYWJvcnQgLSBlaCB0aHJlYWRzIG1haW4gaG9zdCByZXNldCByb3V0aW5lCisgKiBfc2NzaWhfaG9zdF9yZXNldCAtIGVoIHRocmVhZHMgbWFpbiBob3N0IHJlc2V0IHJvdXRpbmUKICAqIEBzZGV2OiBzY3NpIGRldmljZSBzdHJ1Y3QKICAqCiAgKiBSZXR1cm5zIFNVQ0NFU1MgaWYgY29tbWFuZCBhYm9ydGVkIGVsc2UgRkFJTEVECkBAIC0yMzU0LDYgKzIzMTcsMjMxIEBACiB9CiAKIC8qKgorICogX3Njc2loX3RtX3RyX3NlbmQgLSBzZW5kIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBoYW5kbGU6IGRldmljZSBoYW5kbGUKKyAqIENvbnRleHQ6IGludGVycnVwdCB0aW1lLgorICoKKyAqIFRoaXMgY29kZSBpcyB0byBpbml0aWF0ZSB0aGUgZGV2aWNlIHJlbW92YWwgaGFuZHNoYWtlIHByb3RvY2FsCisgKiB3aXRoIGNvbnRyb2xsZXIgZmlybXdhcmUuICBUaGlzIGZ1bmN0aW9uIHdpbGwgaXNzdWUgdGFyZ2V0IHJlc2V0CisgKiB1c2luZyBoaWdoIHByaW9yaXR5IHJlcXVlc3QgcXVldWUuICBJdCB3aWxsIHNlbmQgYSBzYXMgaW91bml0CisgKiBjb250cm9sbCByZXF1ZXN0IChNUEkyX1NBU19PUF9SRU1PVkVfREVWSUNFKSBmcm9tIHRoaXMgY29tcGxldGlvbi4KKyAqCisgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIHNlbmQgbXVsaXBsZSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdCBhdCB0aGUgc2FtZQorICogdGltZSB0byB0aGUgZmlmby4gSWYgdGhlIGZpZm8gaXMgZnVsbCwgd2Ugd2lsbCBhcHBlbmQgdGhlIHJlcXVlc3QsCisgKiBhbmQgcHJvY2VzcyBpdCBpbiBhIGZ1dHVyZSBjb21wbGV0aW9uLgorICovCitzdGF0aWMgdm9pZAorX3Njc2loX3RtX3RyX3NlbmQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgaGFuZGxlKQoreworCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QgKm1waV9yZXF1ZXN0OworCXN0cnVjdCBNUFQyU0FTX1RBUkdFVCAqc2FzX3RhcmdldF9wcml2X2RhdGE7CisJdTE2IHNtaWQ7CisJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IF90cl9saXN0ICpkZWxheWVkX3RyOworCisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpIHsKKwkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluIHByb2dyZXNzIVxuIiwKKwkJICAgIF9fZnVuY19fLCBpb2MtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisJc2FzX2RldmljZSA9IF9zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlKGlvYywgaGFuZGxlKTsKKwlpZiAoIXNhc19kZXZpY2UpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBmaW5kaW5nIHNhc19kZXZpY2VcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCisJLyogc2tpcCBpcyBoaWRkZW4gcmFpZCBjb21wb25lbnQgKi8KKwlpZiAoc2FzX2RldmljZS0+aGlkZGVuX3JhaWRfY29tcG9uZW50KQorCQlyZXR1cm47CisKKwlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkX2hwcihpb2MsIGlvYy0+dG1fdHJfY2JfaWR4KTsKKwlpZiAoIXNtaWQpIHsKKwkJZGVsYXllZF90ciA9IGt6YWxsb2Moc2l6ZW9mKCpkZWxheWVkX3RyKSwgR0ZQX0FUT01JQyk7CisJCWlmICghZGVsYXllZF90cikKKwkJCXJldHVybjsKKwkJSU5JVF9MSVNUX0hFQUQoJmRlbGF5ZWRfdHItPmxpc3QpOworCQlkZWxheWVkX3RyLT5oYW5kbGUgPSBoYW5kbGU7CisJCWRlbGF5ZWRfdHItPnN0YXRlID0gTVBUMlNBU19SRVFfU0FTX0NOVFJMOworCQlsaXN0X2FkZF90YWlsKCZkZWxheWVkX3RyLT5saXN0LAorCQkgICAgJmlvYy0+ZGVsYXllZF90cl9saXN0KTsKKwkJaWYgKHNhc19kZXZpY2UtPnN0YXJnZXQpCisJCQlkZXd0cHJpbnRrKGlvYywgc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLAorCQkJICAgIHNhc19kZXZpY2UtPnN0YXJnZXQsICJERUxBWUVEOnRyOmhhbmRsZSgweCUwNHgpLCAiCisJCQkgICAgIihvcGVuKVxuIiwgc2FzX2RldmljZS0+aGFuZGxlKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2FzX2RldmljZS0+c3RhcmdldCAmJiBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YSkgeworCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YSA9IHNhc19kZXZpY2UtPnN0YXJnZXQtPmhvc3RkYXRhOworCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+dG1fYnVzeSA9IDE7CisJCWRld3RwcmludGsoaW9jLCBzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sIHNhc19kZXZpY2UtPnN0YXJnZXQsCisJCSAgICAidHI6aGFuZGxlKDB4JTA0eCksIChvcGVuKVxuIiwgc2FzX2RldmljZS0+aGFuZGxlKSk7CisJfQorCisJbXBpX3JlcXVlc3QgPSBtcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShpb2MsIHNtaWQpOworCW1lbXNldChtcGlfcmVxdWVzdCwgMCwgc2l6ZW9mKE1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QpKTsKKwltcGlfcmVxdWVzdC0+RnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX1NDU0lfVEFTS19NR01UOworCW1waV9yZXF1ZXN0LT5EZXZIYW5kbGUgPSBjcHVfdG9fbGUxNihoYW5kbGUpOworCW1waV9yZXF1ZXN0LT5UYXNrVHlwZSA9IE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1RBUkdFVF9SRVNFVDsKKwlzYXNfZGV2aWNlLT5zdGF0ZSB8PSBNUFRTQVNfU1RBVEVfVFJfU0VORDsKKwlzYXNfZGV2aWNlLT5zdGF0ZSB8PSBNUFQyU0FTX1JFUV9TQVNfQ05UUkw7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2hpX3ByaW9yaXR5KGlvYywgc21pZCk7Cit9CisKKworCisvKioKKyAqIF9zY3NpaF9zYXNfY29udHJvbF9jb21wbGV0ZSAtIGNvbXBsZXRpb24gcm91dGluZQorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAorICogQG1zaXhfaW5kZXg6IE1TSVggdGFibGUgaW5kZXggc3VwcGxpZWQgYnkgdGhlIE9TCisgKiBAcmVwbHk6IHJlcGx5IG1lc3NhZ2UgZnJhbWUobG93ZXIgMzJiaXQgYWRkcikKKyAqIENvbnRleHQ6IGludGVycnVwdCB0aW1lLgorICoKKyAqIFRoaXMgaXMgdGhlIHNhcyBpb3VuaXQgY29udHJvbGwgY29tcGxldGlvbiByb3V0aW5lLgorICogVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIGNvZGUgdG8gaW5pdGlhdGUgdGhlIGRldmljZSByZW1vdmFsCisgKiBoYW5kc2hha2UgcHJvdG9jYWwgd2l0aCBjb250cm9sbGVyIGZpcm13YXJlLgorICoKKyAqIFJldHVybiAxIG1lYW5pbmcgbWYgc2hvdWxkIGJlIGZyZWVkIGZyb20gX2Jhc2VfaW50ZXJydXB0CisgKiAgICAgICAgMCBtZWFucyB0aGUgbWYgaXMgZnJlZWQgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdTgKK19zY3NpaF9zYXNfY29udHJvbF9jb21wbGV0ZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLAorICAgIHU4IG1zaXhfaW5kZXgsIHUzMiByZXBseSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBoYW5kbGU7CisJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOworCU1waTJTYXNJb1VuaXRDb250cm9sUmVwbHlfdCAqbXBpX3JlcGx5ID0KKwkgICAgbXB0MnNhc19iYXNlX2dldF9yZXBseV92aXJ0X2FkZHIoaW9jLCByZXBseSk7CisKKwloYW5kbGUgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHktPkRldkhhbmRsZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlzYXNfZGV2aWNlID0gX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9oYW5kbGUoaW9jLCBoYW5kbGUpOworCWlmICghc2FzX2RldmljZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogZmFpbGVkIGZpbmRpbmcgc2FzX2RldmljZVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlyZXR1cm4gMTsKKwl9CisJc2FzX2RldmljZS0+c3RhdGUgfD0gTVBUU0FTX1NUQVRFX0NOVFJMX0NPTVBMRVRFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoc2FzX2RldmljZS0+c3RhcmdldCkKKwkJZGV3dHByaW50ayhpb2MsIHN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc2FzX2RldmljZS0+c3RhcmdldCwKKwkJICAgICJzY19jb21wbGV0ZTpoYW5kbGUoMHglMDR4KSwgIgorCQkgICAgImlvY19zdGF0dXMoMHglMDR4KSwgbG9naW5mbygweCUwOHgpXG4iLAorCQkgICAgaGFuZGxlLCBsZTE2X3RvX2NwdShtcGlfcmVwbHktPklPQ1N0YXR1cyksCisJCSAgICBsZTMyX3RvX2NwdShtcGlfcmVwbHktPklPQ0xvZ0luZm8pKSk7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogX3Njc2loX3RtX3RyX2NvbXBsZXRlIC0KKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICogQHNtaWQ6IHN5c3RlbSByZXF1ZXN0IG1lc3NhZ2UgaW5kZXgKKyAqIEBtc2l4X2luZGV4OiBNU0lYIHRhYmxlIGluZGV4IHN1cHBsaWVkIGJ5IHRoZSBPUworICogQHJlcGx5OiByZXBseSBtZXNzYWdlIGZyYW1lKGxvd2VyIDMyYml0IGFkZHIpCisgKiBDb250ZXh0OiBpbnRlcnJ1cHQgdGltZS4KKyAqCisgKiBUaGlzIGlzIHRoZSB0YXJnZXQgcmVzZXQgY29tcGxldGlvbiByb3V0aW5lLgorICogVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIGNvZGUgdG8gaW5pdGlhdGUgdGhlIGRldmljZSByZW1vdmFsCisgKiBoYW5kc2hha2UgcHJvdG9jYWwgd2l0aCBjb250cm9sbGVyIGZpcm13YXJlLgorICogSXQgd2lsbCBzZW5kIGEgc2FzIGlvdW5pdCBjb250cm9sbCByZXF1ZXN0IChNUEkyX1NBU19PUF9SRU1PVkVfREVWSUNFKQorICoKKyAqIFJldHVybiAxIG1lYW5pbmcgbWYgc2hvdWxkIGJlIGZyZWVkIGZyb20gX2Jhc2VfaW50ZXJydXB0CisgKiAgICAgICAgMCBtZWFucyB0aGUgbWYgaXMgZnJlZWQgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdTgKK19zY3NpaF90bV90cl9jb21wbGV0ZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBtc2l4X2luZGV4LAorICAgIHUzMiByZXBseSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBoYW5kbGU7CisJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOworCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXBseV90ICptcGlfcmVwbHkgPQorCSAgICBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKKwlNcGkyU2FzSW9Vbml0Q29udHJvbFJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CisJdTE2IHNtaWRfc2FzX2N0cmw7CisJc3RydWN0IE1QVDJTQVNfVEFSR0VUICpzYXNfdGFyZ2V0X3ByaXZfZGF0YTsKKwlzdHJ1Y3QgX3RyX2xpc3QgKmRlbGF5ZWRfdHI7CisJdTggcmM7CisKKwloYW5kbGUgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHktPkRldkhhbmRsZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisJc2FzX2RldmljZSA9IF9zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlKGlvYywgaGFuZGxlKTsKKwlpZiAoIXNhc19kZXZpY2UpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBmaW5kaW5nIHNhc19kZXZpY2VcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCXNhc19kZXZpY2UtPnN0YXRlIHw9IE1QVFNBU19TVEFURV9UUl9DT01QTEVURTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCisJaWYgKHNhc19kZXZpY2UtPnN0YXJnZXQpCisJCWRld3RwcmludGsoaW9jLCBzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sIHNhc19kZXZpY2UtPnN0YXJnZXQsCisJCSAgICAidHJfY29tcGxldGU6aGFuZGxlKDB4JTA0eCksICglcykgaW9jX3N0YXR1cygweCUwNHgpLCAiCisJCSAgICAibG9naW5mbygweCUwOHgpLCBjb21wbGV0ZWQoJWQpXG4iLAorCQkgICAgc2FzX2RldmljZS0+aGFuZGxlLCAoc2FzX2RldmljZS0+c3RhdGUgJgorCQkgICAgTVBUMlNBU19SRVFfU0FTX0NOVFJMKSA/ICJvcGVuIiA6ICJhY3RpdmUiLAorCQkgICAgbGUxNl90b19jcHUobXBpX3JlcGx5LT5JT0NTdGF0dXMpLAorCQkgICAgbGUzMl90b19jcHUobXBpX3JlcGx5LT5JT0NMb2dJbmZvKSwKKwkJICAgIGxlMzJfdG9fY3B1KG1waV9yZXBseS0+VGVybWluYXRpb25Db3VudCkpKTsKKworCWlmIChzYXNfZGV2aWNlLT5zdGFyZ2V0ICYmIHNhc19kZXZpY2UtPnN0YXJnZXQtPmhvc3RkYXRhKSB7CisJCXNhc190YXJnZXRfcHJpdl9kYXRhID0gc2FzX2RldmljZS0+c3RhcmdldC0+aG9zdGRhdGE7CisJCXNhc190YXJnZXRfcHJpdl9kYXRhLT50bV9idXN5ID0gMDsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmlvYy0+ZGVsYXllZF90cl9saXN0KSkgeworCQlkZWxheWVkX3RyID0gbGlzdF9lbnRyeShpb2MtPmRlbGF5ZWRfdHJfbGlzdC5uZXh0LAorCQkgICAgc3RydWN0IF90cl9saXN0LCBsaXN0KTsKKwkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIHNtaWQpOworCQlpZiAoZGVsYXllZF90ci0+c3RhdGUgJiBNUFQyU0FTX1JFUV9TQVNfQ05UUkwpCisJCQlfc2NzaWhfdG1fdHJfc2VuZChpb2MsIGRlbGF5ZWRfdHItPmhhbmRsZSk7CisJCWxpc3RfZGVsKCZkZWxheWVkX3RyLT5saXN0KTsKKwkJa2ZyZWUoZGVsYXllZF90cik7CisJCXJjID0gMDsgLyogdGVsbHMgYmFzZV9pbnRlcnJ1cHQgbm90IHRvIGZyZWUgbWYgKi8KKwl9IGVsc2UKKwkJcmMgPSAxOworCisKKwlpZiAoIShzYXNfZGV2aWNlLT5zdGF0ZSAmIE1QVDJTQVNfUkVRX1NBU19DTlRSTCkpCisJCXJldHVybiByYzsKKworCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KSB7CisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaG9zdCByZXNldCBpbiBwcm9ncmVzcyFcbiIsCisJCSAgICBfX2Z1bmNfXywgaW9jLT5uYW1lKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXNtaWRfc2FzX2N0cmwgPSBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWQoaW9jLCBpb2MtPnRtX3Nhc19jb250cm9sX2NiX2lkeCk7CisJaWYgKCFzbWlkX3Nhc19jdHJsKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgb2J0YWluaW5nIGEgc21pZFxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlyZXR1cm4gcmM7CisJfQorCisJbXBpX3JlcXVlc3QgPSBtcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShpb2MsIHNtaWRfc2FzX2N0cmwpOworCW1lbXNldChtcGlfcmVxdWVzdCwgMCwgc2l6ZW9mKE1waTJTYXNJb1VuaXRDb250cm9sUmVxdWVzdF90KSk7CisJbXBpX3JlcXVlc3QtPkZ1bmN0aW9uID0gTVBJMl9GVU5DVElPTl9TQVNfSU9fVU5JVF9DT05UUk9MOworCW1waV9yZXF1ZXN0LT5PcGVyYXRpb24gPSBNUEkyX1NBU19PUF9SRU1PVkVfREVWSUNFOworCW1waV9yZXF1ZXN0LT5EZXZIYW5kbGUgPSBtcGlfcmVwbHktPkRldkhhbmRsZTsKKwlzYXNfZGV2aWNlLT5zdGF0ZSB8PSBNUFRTQVNfU1RBVEVfQ05UUkxfU0VORDsKKwltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWRfc2FzX2N0cmwpOworCXJldHVybiByYzsKK30KKworLyoqCiAgKiBfc2NzaWhfY2hlY2tfdG9wb19kZWxldGVfZXZlbnRzIC0gc2FuaXR5IGNoZWNrIG9uIHRvcG8gZXZlbnRzCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBldmVudF9kYXRhOiB0aGUgZXZlbnQgZGF0YSBwYXlsb2FkCkBAIC0yMzc1LDYgKzI1NjMsMjEgQEAKIAl1MTYgZXhwYW5kZXJfaGFuZGxlOwogCXN0cnVjdCBfc2FzX25vZGUgKnNhc19leHBhbmRlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCByZWFzb25fY29kZTsKKwl1MTYgaGFuZGxlOworCisJZm9yIChpID0gMCA7IGkgPCBldmVudF9kYXRhLT5OdW1FbnRyaWVzOyBpKyspIHsKKwkJaWYgKGV2ZW50X2RhdGEtPlBIWVtpXS5QaHlTdGF0dXMgJgorCQkgICAgTVBJMl9FVkVOVF9TQVNfVE9QT19QSFlTVEFUVVNfVkFDQU5UKQorCQkJY29udGludWU7CisJCWhhbmRsZSA9IGxlMTZfdG9fY3B1KGV2ZW50X2RhdGEtPlBIWVtpXS5BdHRhY2hlZERldkhhbmRsZSk7CisJCWlmICghaGFuZGxlKQorCQkJY29udGludWU7CisJCXJlYXNvbl9jb2RlID0gZXZlbnRfZGF0YS0+UEhZW2ldLlBoeVN0YXR1cyAmCisJCSAgICBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX01BU0s7CisJCWlmIChyZWFzb25fY29kZSA9PSBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX1RBUkdfTk9UX1JFU1BPTkRJTkcpCisJCQlfc2NzaWhfdG1fdHJfc2VuZChpb2MsIGhhbmRsZSk7CisJfQogCiAJZXhwYW5kZXJfaGFuZGxlID0gbGUxNl90b19jcHUoZXZlbnRfZGF0YS0+RXhwYW5kZXJEZXZIYW5kbGUpOwogCWlmIChleHBhbmRlcl9oYW5kbGUgPCBpb2MtPnNhc19oYmEubnVtX3BoeXMpIHsKQEAgLTI0MzMsOCArMjYzNiw4IEBACiAJdTE2IHNtaWQ7CiAJdTE2IGNvdW50ID0gMDsKIAotCWZvciAoc21pZCA9IDE7IHNtaWQgPD0gaW9jLT5yZXF1ZXN0X2RlcHRoOyBzbWlkKyspIHsKLQkJc2NtZCA9IF9zY3NpaF9zY3NpX2xvb2t1cF9nZXRjbGVhcihpb2MsIHNtaWQpOworCWZvciAoc21pZCA9IDE7IHNtaWQgPD0gaW9jLT5zY3NpaW9fZGVwdGg7IHNtaWQrKykgeworCQlzY21kID0gX3Njc2loX3Njc2lfbG9va3VwX2dldChpb2MsIHNtaWQpOwogCQlpZiAoIXNjbWQpCiAJCQljb250aW51ZTsKIAkJY291bnQrKzsKQEAgLTI2MTYsNyArMjgxOSw3IEBACiAJaWYgKChzYXNfZGV2aWNlX3ByaXZfZGF0YS0+ZmxhZ3MgJiBNUFRfREVWSUNFX1RMUl9PTikpCiAJCW1waV9jb250cm9sIHw9IE1QSTJfU0NTSUlPX0NPTlRST0xfVExSX09OOwogCi0Jc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZChpb2MsIGlvYy0+c2NzaV9pb19jYl9pZHgpOworCXNtaWQgPSBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWRfc2NzaWlvKGlvYywgaW9jLT5zY3NpX2lvX2NiX2lkeCwgc2NtZCk7CiAJaWYgKCFzbWlkKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgb2J0YWluaW5nIGEgc21pZFxuIiwKIAkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOwpAQCAtMjY0Myw3ICsyODQ2LDggQEAKIAltcGlfcmVxdWVzdC0+U0dMT2Zmc2V0MCA9IG9mZnNldG9mKE1waTJTQ1NJSU9SZXF1ZXN0X3QsIFNHTCkgLyA0OwogCW1waV9yZXF1ZXN0LT5TR0xGbGFncyA9IGNwdV90b19sZTE2KE1QSTJfU0NTSUlPX1NHTEZMQUdTX1RZUEVfTVBJICsKIAkgICAgTVBJMl9TQ1NJSU9fU0dMRkxBR1NfU1lTVEVNX0FERFIpOwotCisJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLworCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7CiAJaW50X3RvX3Njc2lsdW4oc2FzX2RldmljZV9wcml2X2RhdGEtPmx1biwgKHN0cnVjdCBzY3NpX2x1biAqKQogCSAgICBtcGlfcmVxdWVzdC0+TFVOKTsKIAltZW1jcHkobXBpX3JlcXVlc3QtPkNEQi5DREIzMiwgc2NtZC0+Y21uZCwgc2NtZC0+Y21kX2xlbik7CkBAIC0yNjU3LDggKzI4NjEsNyBAQAogCQl9CiAJfQogCi0JX3Njc2loX3Njc2lfbG9va3VwX3NldChpb2MsIHNtaWQsIHNjbWQpOwotCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9zY3NpX2lvKGlvYywgc21pZCwgMCwKKwltcHQyc2FzX2Jhc2VfcHV0X3NtaWRfc2NzaV9pbyhpb2MsIHNtaWQsCiAJICAgIHNhc19kZXZpY2VfcHJpdl9kYXRhLT5zYXNfdGFyZ2V0LT5oYW5kbGUpOwogCXJldHVybiAwOwogCkBAIC0yOTU0LDE1ICszMTU3LDE2IEBACiAgKiBfc2NzaWhfaW9fZG9uZSAtIHNjc2kgcmVxdWVzdCBjYWxsYmFjawogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAotICogQFZGX0lEOiB2aXJ0dWFsIGZ1bmN0aW9uIGlkCisgKiBAbXNpeF9pbmRleDogTVNJWCB0YWJsZSBpbmRleCBzdXBwbGllZCBieSB0aGUgT1MKICAqIEByZXBseTogcmVwbHkgbWVzc2FnZSBmcmFtZShsb3dlciAzMmJpdCBhZGRyKQogICoKLSAqIENhbGxiYWNrIGhhbmRsZXIgd2hlbiB1c2luZyBzY3NpaF9xY21kLgorICogQ2FsbGJhY2sgaGFuZGxlciB3aGVuIHVzaW5nIF9zY3NpaF9xY21kLgogICoKLSAqIFJldHVybiBub3RoaW5nLgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyB2b2lkCi1fc2NzaWhfaW9fZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBWRl9JRCwgdTMyIHJlcGx5KQorc3RhdGljIHU4Citfc2NzaWhfaW9fZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBtc2l4X2luZGV4LCB1MzIgcmVwbHkpCiB7CiAJTXBpMlNDU0lJT1JlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CiAJTXBpMlNDU0lJT1JlcGx5X3QgKm1waV9yZXBseTsKQEAgLTI5NzYsOSArMzE4MCw5IEBACiAJdTMyIHJlc3BvbnNlX2NvZGU7CiAKIAltcGlfcmVwbHkgPSBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKLQlzY21kID0gX3Njc2loX3Njc2lfbG9va3VwX2dldGNsZWFyKGlvYywgc21pZCk7CisJc2NtZCA9IF9zY3NpaF9zY3NpX2xvb2t1cF9nZXQoaW9jLCBzbWlkKTsKIAlpZiAoc2NtZCA9PSBOVUxMKQotCQlyZXR1cm47CisJCXJldHVybiAxOwogCiAJbXBpX3JlcXVlc3QgPSBtcHQyc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShpb2MsIHNtaWQpOwogCkBAIC0zMTM0LDYgKzMzMzgsNyBAQAogIG91dDoKIAlzY3NpX2RtYV91bm1hcChzY21kKTsKIAlzY21kLT5zY3NpX2RvbmUoc2NtZCk7CisJcmV0dXJuIDE7CiB9CiAKIC8qKgpAQCAtMzM5OCw5ICszNjAzLDggQEAKIAkJfQogCX0KIAotCXNhc19hZGRyZXNzID0gbGU2NF90b19jcHUoZXhwYW5kZXJfcGcwLlNBU0FkZHJlc3MpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX25vZGVfbG9jaywgZmxhZ3MpOworCXNhc19hZGRyZXNzID0gbGU2NF90b19jcHUoZXhwYW5kZXJfcGcwLlNBU0FkZHJlc3MpOwogCXNhc19leHBhbmRlciA9IG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCiAJICAgIHNhc19hZGRyZXNzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19ub2RlX2xvY2ssIGZsYWdzKTsKQEAgLTM2NjYsNiArMzg3MCwxMiBAQAogCWlmIChpb2MtPnJlbW92ZV9ob3N0KQogCQlnb3RvIG91dDsKIAorCWlmICgoc2FzX2RldmljZS0+c3RhdGUgJiBNUFRTQVNfU1RBVEVfVFJfQ09NUExFVEUpKSB7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiXHRza2lwICIKKwkJICAgInRhcmdldF9yZXNldCBoYW5kbGUoMHglMDR4KVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUpKTsKKwkJZ290byBza2lwX3RyOworCX0KKwogCS8qIFRhcmdldCBSZXNldCB0byBmbHVzaCBvdXQgYWxsIHRoZSBvdXRzdGFuZGluZyBJTyAqLwogCWRldmljZV9oYW5kbGUgPSAoc2FzX2RldmljZS0+aGlkZGVuX3JhaWRfY29tcG9uZW50KSA/CiAJICAgIHNhc19kZXZpY2UtPnZvbHVtZV9oYW5kbGUgOiBoYW5kbGU7CkBAIC0zNjgyLDYgKzM4OTIsMTMgQEAKIAkJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpCiAJCQlnb3RvIG91dDsKIAl9Cisgc2tpcF90cjoKKworCWlmICgoc2FzX2RldmljZS0+c3RhdGUgJiBNUFRTQVNfU1RBVEVfQ05UUkxfQ09NUExFVEUpKSB7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiXHRza2lwICIKKwkJICAgInNhc19jbnRybCBoYW5kbGUoMHglMDR4KVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUpKTsKKwkJZ290byBvdXQ7CisJfQogCiAJLyogU0FTX0lPX1VOSVRfQ05UUiAtIHNlbmQgUkVNT1ZFX0RFVklDRSAqLwogCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2FzX2lvdW5pdDogaGFuZGxlIgpAQCAtMzY5MCw3ICszOTA3LDggQEAKIAltcGlfcmVxdWVzdC5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fU0FTX0lPX1VOSVRfQ09OVFJPTDsKIAltcGlfcmVxdWVzdC5PcGVyYXRpb24gPSBNUEkyX1NBU19PUF9SRU1PVkVfREVWSUNFOwogCW1waV9yZXF1ZXN0LkRldkhhbmRsZSA9IGhhbmRsZTsKLQltcGlfcmVxdWVzdC5WRl9JRCA9IDA7CisJbXBpX3JlcXVlc3QuVkZfSUQgPSAwOyAvKiBUT0RPICovCisJbXBpX3JlcXVlc3QuVlBfSUQgPSAwOwogCWlmICgobXB0MnNhc19iYXNlX3Nhc19pb3VuaXRfY29udHJvbChpb2MsICZtcGlfcmVwbHksCiAJICAgICZtcGlfcmVxdWVzdCkpICE9IDApIHsKIAkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKQEAgLTM4MDAsMTUgKzQwMTgsMTIgQEAKIC8qKgogICogX3Njc2loX3Nhc190b3BvbG9neV9jaGFuZ2VfZXZlbnQgLSBoYW5kbGUgdG9wb2xvZ3kgY2hhbmdlcwogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAVkZfSUQ6Ci0gKiBAZXZlbnRfZGF0YTogZXZlbnQgZGF0YSBwYXlsb2FkCi0gKiBmd19ldmVudDoKKyAqIEBmd19ldmVudDogVGhlIGZ3X2V2ZW50X3dvcmsgb2JqZWN0CiAgKiBDb250ZXh0OiB1c2VyLgogICoKICAqLwogc3RhdGljIHZvaWQKLV9zY3NpaF9zYXNfdG9wb2xvZ3lfY2hhbmdlX2V2ZW50KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggVkZfSUQsCi0gICAgTXBpMkV2ZW50RGF0YVNhc1RvcG9sb2d5Q2hhbmdlTGlzdF90ICpldmVudF9kYXRhLAorX3Njc2loX3Nhc190b3BvbG9neV9jaGFuZ2VfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAogICAgIHN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudCkKIHsKIAlpbnQgaTsKQEAgLTM4MTgsNiArNDAzMyw3IEBACiAJc3RydWN0IF9zYXNfbm9kZSAqc2FzX2V4cGFuZGVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggbGlua19yYXRlXzsKKwlNcGkyRXZlbnREYXRhU2FzVG9wb2xvZ3lDaGFuZ2VMaXN0X3QgKmV2ZW50X2RhdGEgPSBmd19ldmVudC0+ZXZlbnRfZGF0YTsKIAogI2lmZGVmIENPTkZJR19TQ1NJX01QVDJTQVNfTE9HR0lORwogCWlmIChpb2MtPmxvZ2dpbmdfbGV2ZWwgJiBNUFRfREVCVUdfRVZFTlRfV09SS19UQVNLKQpAQCAtMzg1MSwxNSArNDA2NywxNiBAQAogCQl9CiAJCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQogCQkJcmV0dXJuOwotCQlpZiAoZXZlbnRfZGF0YS0+UEhZW2ldLlBoeVN0YXR1cyAmCi0JCSAgICBNUEkyX0VWRU5UX1NBU19UT1BPX1BIWVNUQVRVU19WQUNBTlQpCisJCXBoeV9udW1iZXIgPSBldmVudF9kYXRhLT5TdGFydFBoeU51bSArIGk7CisJCXJlYXNvbl9jb2RlID0gZXZlbnRfZGF0YS0+UEhZW2ldLlBoeVN0YXR1cyAmCisJCSAgICBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX01BU0s7CisJCWlmICgoZXZlbnRfZGF0YS0+UEhZW2ldLlBoeVN0YXR1cyAmCisJCSAgICBNUEkyX0VWRU5UX1NBU19UT1BPX1BIWVNUQVRVU19WQUNBTlQpICYmIChyZWFzb25fY29kZSAhPQorCQkgICAgTVBJMl9FVkVOVF9TQVNfVE9QT19SQ19UQVJHX05PVF9SRVNQT05ESU5HKSkKIAkJCWNvbnRpbnVlOwogCQloYW5kbGUgPSBsZTE2X3RvX2NwdShldmVudF9kYXRhLT5QSFlbaV0uQXR0YWNoZWREZXZIYW5kbGUpOwogCQlpZiAoIWhhbmRsZSkKIAkJCWNvbnRpbnVlOwotCQlwaHlfbnVtYmVyID0gZXZlbnRfZGF0YS0+U3RhcnRQaHlOdW0gKyBpOwotCQlyZWFzb25fY29kZSA9IGV2ZW50X2RhdGEtPlBIWVtpXS5QaHlTdGF0dXMgJgotCQkgICAgTVBJMl9FVkVOVF9TQVNfVE9QT19SQ19NQVNLOwogCQlsaW5rX3JhdGVfID0gZXZlbnRfZGF0YS0+UEhZW2ldLkxpbmtSYXRlID4+IDQ7CiAJCXN3aXRjaCAocmVhc29uX2NvZGUpIHsKIAkJY2FzZSBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX1BIWV9DSEFOR0VEOgpAQCAtMzk3MSwxOSArNDE4OCwxOSBAQAogLyoqCiAgKiBfc2NzaWhfc2FzX2RldmljZV9zdGF0dXNfY2hhbmdlX2V2ZW50IC0gaGFuZGxlIGRldmljZSBzdGF0dXMgY2hhbmdlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBWRl9JRDoKLSAqIEBldmVudF9kYXRhOiBldmVudCBkYXRhIHBheWxvYWQKKyAqIEBmd19ldmVudDogVGhlIGZ3X2V2ZW50X3dvcmsgb2JqZWN0CiAgKiBDb250ZXh0OiB1c2VyLgogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiBzdGF0aWMgdm9pZAotX3Njc2loX3Nhc19kZXZpY2Vfc3RhdHVzX2NoYW5nZV9ldmVudChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IFZGX0lELAotICAgIE1waTJFdmVudERhdGFTYXNEZXZpY2VTdGF0dXNDaGFuZ2VfdCAqZXZlbnRfZGF0YSkKK19zY3NpaF9zYXNfZGV2aWNlX3N0YXR1c19jaGFuZ2VfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAorICAgIHN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudCkKIHsKICNpZmRlZiBDT05GSUdfU0NTSV9NUFQyU0FTX0xPR0dJTkcKIAlpZiAoaW9jLT5sb2dnaW5nX2xldmVsICYgTVBUX0RFQlVHX0VWRU5UX1dPUktfVEFTSykKLQkJX3Njc2loX3Nhc19kZXZpY2Vfc3RhdHVzX2NoYW5nZV9ldmVudF9kZWJ1Zyhpb2MsIGV2ZW50X2RhdGEpOworCQlfc2NzaWhfc2FzX2RldmljZV9zdGF0dXNfY2hhbmdlX2V2ZW50X2RlYnVnKGlvYywKKwkJICAgICBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CiAjZW5kaWYKIH0KIApAQCAtNDAyNiwzNCArNDI0MywzMyBAQAogLyoqCiAgKiBfc2NzaWhfc2FzX2VuY2xvc3VyZV9kZXZfc3RhdHVzX2NoYW5nZV9ldmVudCAtIGhhbmRsZSBlbmNsb3N1cmUgZXZlbnRzCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBWRl9JRDoKLSAqIEBldmVudF9kYXRhOiBldmVudCBkYXRhIHBheWxvYWQKKyAqIEBmd19ldmVudDogVGhlIGZ3X2V2ZW50X3dvcmsgb2JqZWN0CiAgKiBDb250ZXh0OiB1c2VyLgogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiBzdGF0aWMgdm9pZAogX3Njc2loX3Nhc19lbmNsb3N1cmVfZGV2X3N0YXR1c19jaGFuZ2VfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAotICAgIHU4IFZGX0lELCBNcGkyRXZlbnREYXRhU2FzRW5jbERldlN0YXR1c0NoYW5nZV90ICpldmVudF9kYXRhKQorICAgIHN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudCkKIHsKICNpZmRlZiBDT05GSUdfU0NTSV9NUFQyU0FTX0xPR0dJTkcKIAlpZiAoaW9jLT5sb2dnaW5nX2xldmVsICYgTVBUX0RFQlVHX0VWRU5UX1dPUktfVEFTSykKIAkJX3Njc2loX3Nhc19lbmNsb3N1cmVfZGV2X3N0YXR1c19jaGFuZ2VfZXZlbnRfZGVidWcoaW9jLAotCQkgICAgIGV2ZW50X2RhdGEpOworCQkgICAgIGZ3X2V2ZW50LT5ldmVudF9kYXRhKTsKICNlbmRpZgogfQogCiAvKioKICAqIF9zY3NpaF9zYXNfYnJvYWRjYXN0X3ByaW1hdGl2ZV9ldmVudCAtIGhhbmRsZSBicm9hZGNhc3QgZXZlbnRzCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBldmVudF9kYXRhOiBldmVudCBkYXRhIHBheWxvYWQKKyAqIEBmd19ldmVudDogVGhlIGZ3X2V2ZW50X3dvcmsgb2JqZWN0CiAgKiBDb250ZXh0OiB1c2VyLgogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiBzdGF0aWMgdm9pZAotX3Njc2loX3Nhc19icm9hZGNhc3RfcHJpbWF0aXZlX2V2ZW50KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggVkZfSUQsCi0gICAgTXBpMkV2ZW50RGF0YVNhc0Jyb2FkY2FzdFByaW1pdGl2ZV90ICpldmVudF9kYXRhKQorX3Njc2loX3Nhc19icm9hZGNhc3RfcHJpbWF0aXZlX2V2ZW50KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKKyAgICBzdHJ1Y3QgZndfZXZlbnRfd29yayAqZndfZXZlbnQpCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKIAl1MTYgc21pZCwgaGFuZGxlOwpAQCAtNDA2MiwxMSArNDI3OCwxMiBAQAogCXUzMiB0ZXJtaW5hdGlvbl9jb3VudDsKIAl1MzIgcXVlcnlfY291bnQ7CiAJTXBpMlNDU0lUYXNrTWFuYWdlbWVudFJlcGx5X3QgKm1waV9yZXBseTsKLQorI2lmZGVmIENPTkZJR19TQ1NJX01QVDJTQVNfTE9HR0lORworCU1waTJFdmVudERhdGFTYXNCcm9hZGNhc3RQcmltaXRpdmVfdCAqZXZlbnRfZGF0YSA9IGZ3X2V2ZW50LT5ldmVudF9kYXRhOworI2VuZGlmCiAJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiYnJvYWRjYXN0IHByaW1hdGl2ZTogIgogCSAgICAicGh5IG51bWJlciglZCksIHdpZHRoKCVkKVxuIiwgaW9jLT5uYW1lLCBldmVudF9kYXRhLT5QaHlOdW0sCiAJICAgIGV2ZW50X2RhdGEtPlBvcnRXaWR0aCkpOwotCiAJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIApAQCAtNDA3NCw3ICs0MjkxLDcgQEAKIAl0ZXJtaW5hdGlvbl9jb3VudCA9IDA7CiAJcXVlcnlfY291bnQgPSAwOwogCW1waV9yZXBseSA9IGlvYy0+dG1fY21kcy5yZXBseTsKLQlmb3IgKHNtaWQgPSAxOyBzbWlkIDw9IGlvYy0+cmVxdWVzdF9kZXB0aDsgc21pZCsrKSB7CisJZm9yIChzbWlkID0gMTsgc21pZCA8PSBpb2MtPnNjc2lpb19kZXB0aDsgc21pZCsrKSB7CiAJCXNjbWQgPSBfc2NzaWhfc2NzaV9sb29rdXBfZ2V0KGlvYywgc21pZCk7CiAJCWlmICghc2NtZCkKIAkJCWNvbnRpbnVlOwpAQCAtNDEyMSwyMyArNDMzOCwyNSBAQAogLyoqCiAgKiBfc2NzaWhfc2FzX2Rpc2NvdmVyeV9ldmVudCAtIGhhbmRsZSBkaXNjb3ZlcnkgZXZlbnRzCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBldmVudF9kYXRhOiBldmVudCBkYXRhIHBheWxvYWQKKyAqIEBmd19ldmVudDogVGhlIGZ3X2V2ZW50X3dvcmsgb2JqZWN0CiAgKiBDb250ZXh0OiB1c2VyLgogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiBzdGF0aWMgdm9pZAotX3Njc2loX3Nhc19kaXNjb3ZlcnlfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwKLSAgICBNcGkyRXZlbnREYXRhU2FzRGlzY292ZXJ5X3QgKmV2ZW50X2RhdGEpCitfc2NzaWhfc2FzX2Rpc2NvdmVyeV9ldmVudChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCisgICAgc3RydWN0IGZ3X2V2ZW50X3dvcmsgKmZ3X2V2ZW50KQogeworCU1waTJFdmVudERhdGFTYXNEaXNjb3ZlcnlfdCAqZXZlbnRfZGF0YSA9IGZ3X2V2ZW50LT5ldmVudF9kYXRhOworCiAjaWZkZWYgQ09ORklHX1NDU0lfTVBUMlNBU19MT0dHSU5HCiAJaWYgKGlvYy0+bG9nZ2luZ19sZXZlbCAmIE1QVF9ERUJVR19FVkVOVF9XT1JLX1RBU0spIHsKIAkJcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJkaXNjb3ZlcnkgZXZlbnQ6ICglcykiLCBpb2MtPm5hbWUsCiAJCSAgICAoZXZlbnRfZGF0YS0+UmVhc29uQ29kZSA9PSBNUEkyX0VWRU5UX1NBU19ESVNDX1JDX1NUQVJURUQpID8KIAkJICAgICJzdGFydCIgOiAic3RvcCIpOwogCWlmIChldmVudF9kYXRhLT5EaXNjb3ZlcnlTdGF0dXMpCi0JCXByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVCAiLCBkaXNjb3Zlcnlfc3RhdHVzKDB4JTA4eCkiLAotCQkgICAgaW9jLT5uYW1lLCBsZTMyX3RvX2NwdShldmVudF9kYXRhLT5EaXNjb3ZlcnlTdGF0dXMpKTsKKwkJcHJpbnRrKCJkaXNjb3Zlcnlfc3RhdHVzKDB4JTA4eCkiLAorCQkgICAgbGUzMl90b19jcHUoZXZlbnRfZGF0YS0+RGlzY292ZXJ5U3RhdHVzKSk7CiAJcHJpbnRrKCJcbiIpOwogCX0KICNlbmRpZgpAQCAtNDQ4OCwxOSArNDcwNywxOSBAQAogLyoqCiAgKiBfc2NzaWhfc2FzX2lyX2NvbmZpZ19jaGFuZ2VfZXZlbnQgLSBoYW5kbGUgaXIgY29uZmlndXJhdGlvbiBjaGFuZ2UgZXZlbnRzCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBWRl9JRDoKLSAqIEBldmVudF9kYXRhOiBldmVudCBkYXRhIHBheWxvYWQKKyAqIEBmd19ldmVudDogVGhlIGZ3X2V2ZW50X3dvcmsgb2JqZWN0CiAgKiBDb250ZXh0OiB1c2VyLgogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiBzdGF0aWMgdm9pZAotX3Njc2loX3Nhc19pcl9jb25maWdfY2hhbmdlX2V2ZW50KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggVkZfSUQsCi0gICAgTXBpMkV2ZW50RGF0YUlyQ29uZmlnQ2hhbmdlTGlzdF90ICpldmVudF9kYXRhKQorX3Njc2loX3Nhc19pcl9jb25maWdfY2hhbmdlX2V2ZW50KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKKyAgICBzdHJ1Y3QgZndfZXZlbnRfd29yayAqZndfZXZlbnQpCiB7CiAJTXBpMkV2ZW50SXJDb25maWdFbGVtZW50X3QgKmVsZW1lbnQ7CiAJaW50IGk7CiAJdTggZm9yZWlnbl9jb25maWc7CisJTXBpMkV2ZW50RGF0YUlyQ29uZmlnQ2hhbmdlTGlzdF90ICpldmVudF9kYXRhID0gZndfZXZlbnQtPmV2ZW50X2RhdGE7CiAKICNpZmRlZiBDT05GSUdfU0NTSV9NUFQyU0FTX0xPR0dJTkcKIAlpZiAoaW9jLT5sb2dnaW5nX2xldmVsICYgTVBUX0RFQlVHX0VWRU5UX1dPUktfVEFTSykKQEAgLTQ1NDMsMTQgKzQ3NjIsMTQgQEAKIC8qKgogICogX3Njc2loX3Nhc19pcl92b2x1bWVfZXZlbnQgLSBJUiB2b2x1bWUgZXZlbnQKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQGV2ZW50X2RhdGE6IGV2ZW50IGRhdGEgcGF5bG9hZAorICogQGZ3X2V2ZW50OiBUaGUgZndfZXZlbnRfd29yayBvYmplY3QKICAqIENvbnRleHQ6IHVzZXIuCiAgKgogICogUmV0dXJuIG5vdGhpbmcuCiAgKi8KIHN0YXRpYyB2b2lkCi1fc2NzaWhfc2FzX2lyX3ZvbHVtZV9ldmVudChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IFZGX0lELAotICAgIE1waTJFdmVudERhdGFJclZvbHVtZV90ICpldmVudF9kYXRhKQorX3Njc2loX3Nhc19pcl92b2x1bWVfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAorICAgIHN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudCkKIHsKIAl1NjQgd3dpZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDU1OSw2ICs0Nzc4LDcgQEAKIAl1MzIgc3RhdGU7CiAJaW50IHJjOwogCXN0cnVjdCBNUFQyU0FTX1RBUkdFVCAqc2FzX3RhcmdldF9wcml2X2RhdGE7CisJTXBpMkV2ZW50RGF0YUlyVm9sdW1lX3QgKmV2ZW50X2RhdGEgPSBmd19ldmVudC0+ZXZlbnRfZGF0YTsKIAogCWlmIChldmVudF9kYXRhLT5SZWFzb25Db2RlICE9IE1QSTJfRVZFTlRfSVJfVk9MVU1FX1JDX1NUQVRFX0NIQU5HRUQpCiAJCXJldHVybjsKQEAgLTQ2MjgsMTQgKzQ4NDgsMTQgQEAKIC8qKgogICogX3Njc2loX3Nhc19pcl9waHlzaWNhbF9kaXNrX2V2ZW50IC0gUEQgZXZlbnQKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQGV2ZW50X2RhdGE6IGV2ZW50IGRhdGEgcGF5bG9hZAorICogQGZ3X2V2ZW50OiBUaGUgZndfZXZlbnRfd29yayBvYmplY3QKICAqIENvbnRleHQ6IHVzZXIuCiAgKgogICogUmV0dXJuIG5vdGhpbmcuCiAgKi8KIHN0YXRpYyB2b2lkCi1fc2NzaWhfc2FzX2lyX3BoeXNpY2FsX2Rpc2tfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwKLSAgIE1waTJFdmVudERhdGFJclBoeXNpY2FsRGlza190ICpldmVudF9kYXRhKQorX3Njc2loX3Nhc19pcl9waHlzaWNhbF9kaXNrX2V2ZW50KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKKyAgICBzdHJ1Y3QgZndfZXZlbnRfd29yayAqZndfZXZlbnQpCiB7CiAJdTE2IGhhbmRsZTsKIAl1MzIgc3RhdGU7CkBAIC00NjQ0LDYgKzQ4NjQsNyBAQAogCU1waTJDb25maWdSZXBseV90IG1waV9yZXBseTsKIAlNcGkyU2FzRGV2aWNlUGFnZTBfdCBzYXNfZGV2aWNlX3BnMDsKIAl1MzIgaW9jX3N0YXR1czsKKwlNcGkyRXZlbnREYXRhSXJQaHlzaWNhbERpc2tfdCAqZXZlbnRfZGF0YSA9IGZ3X2V2ZW50LT5ldmVudF9kYXRhOwogCiAJaWYgKGV2ZW50X2RhdGEtPlJlYXNvbkNvZGUgIT0gTVBJMl9FVkVOVF9JUl9QSFlTRElTS19SQ19TVEFURV9DSEFOR0VEKQogCQlyZXR1cm47CkBAIC00NzQzLDMzICs0OTY0LDMzIEBACiAvKioKICAqIF9zY3NpaF9zYXNfaXJfb3BlcmF0aW9uX3N0YXR1c19ldmVudCAtIGhhbmRsZSBSQUlEIG9wZXJhdGlvbiBldmVudHMKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQFZGX0lEOgotICogQGV2ZW50X2RhdGE6IGV2ZW50IGRhdGEgcGF5bG9hZAorICogQGZ3X2V2ZW50OiBUaGUgZndfZXZlbnRfd29yayBvYmplY3QKICAqIENvbnRleHQ6IHVzZXIuCiAgKgogICogUmV0dXJuIG5vdGhpbmcuCiAgKi8KIHN0YXRpYyB2b2lkCi1fc2NzaWhfc2FzX2lyX29wZXJhdGlvbl9zdGF0dXNfZXZlbnQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwKLSAgICBNcGkyRXZlbnREYXRhSXJPcGVyYXRpb25TdGF0dXNfdCAqZXZlbnRfZGF0YSkKK19zY3NpaF9zYXNfaXJfb3BlcmF0aW9uX3N0YXR1c19ldmVudChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCisgICAgc3RydWN0IGZ3X2V2ZW50X3dvcmsgKmZ3X2V2ZW50KQogewogI2lmZGVmIENPTkZJR19TQ1NJX01QVDJTQVNfTE9HR0lORwogCWlmIChpb2MtPmxvZ2dpbmdfbGV2ZWwgJiBNUFRfREVCVUdfRVZFTlRfV09SS19UQVNLKQotCQlfc2NzaWhfc2FzX2lyX29wZXJhdGlvbl9zdGF0dXNfZXZlbnRfZGVidWcoaW9jLCBldmVudF9kYXRhKTsKKwkJX3Njc2loX3Nhc19pcl9vcGVyYXRpb25fc3RhdHVzX2V2ZW50X2RlYnVnKGlvYywKKwkJICAgICBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CiAjZW5kaWYKIH0KIAogLyoqCiAgKiBfc2NzaWhfdGFza19zZXRfZnVsbCAtIGhhbmRsZSB0YXNrIHNldCBmdWxsCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBldmVudF9kYXRhOiBldmVudCBkYXRhIHBheWxvYWQKKyAqIEBmd19ldmVudDogVGhlIGZ3X2V2ZW50X3dvcmsgb2JqZWN0CiAgKiBDb250ZXh0OiB1c2VyLgogICoKICAqIFRocm90dGxlIGJhY2sgcWRlcHRoLgogICovCiBzdGF0aWMgdm9pZAotX3Njc2loX3Rhc2tfc2V0X2Z1bGwoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwKLSAgICBNcGkyRXZlbnREYXRhVGFza1NldEZ1bGxfdCAqZXZlbnRfZGF0YSkKK19zY3NpaF90YXNrX3NldF9mdWxsKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgc3RydWN0IGZ3X2V2ZW50X3dvcmsKKwkqZndfZXZlbnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgX3Nhc19kZXZpY2UgKnNhc19kZXZpY2U7CkBAIC00NzgwLDYgKzUwMDEsNyBAQAogCXUxNiBoYW5kbGU7CiAJaW50IGlkLCBjaGFubmVsOwogCXU2NCBzYXNfYWRkcmVzczsKKwlNcGkyRXZlbnREYXRhVGFza1NldEZ1bGxfdCAqZXZlbnRfZGF0YSA9IGZ3X2V2ZW50LT5ldmVudF9kYXRhOwogCiAJY3VycmVudF9kZXB0aCA9IGxlMTZfdG9fY3B1KGV2ZW50X2RhdGEtPkN1cnJlbnREZXB0aCk7CiAJaGFuZGxlID0gbGUxNl90b19jcHUoZXZlbnRfZGF0YS0+RGV2SGFuZGxlKTsKQEAgLTQ4NjgsNiArNTA5MCwxMCBAQAogCQlpZiAoc2FzX2RldmljZS0+c2FzX2FkZHJlc3MgPT0gc2FzX2FkZHJlc3MgJiYKIAkJICAgIHNhc19kZXZpY2UtPnNsb3QgPT0gc2xvdCAmJiBzYXNfZGV2aWNlLT5zdGFyZ2V0KSB7CiAJCQlzYXNfZGV2aWNlLT5yZXNwb25kaW5nID0gMTsKKwkJCXNhc19kZXZpY2UtPnN0YXRlID0gMDsKKwkJCXN0YXJnZXQgPSBzYXNfZGV2aWNlLT5zdGFyZ2V0OworCQkJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzdGFyZ2V0LT5ob3N0ZGF0YTsKKwkJCXNhc190YXJnZXRfcHJpdl9kYXRhLT50bV9idXN5ID0gMDsKIAkJCXN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc2FzX2RldmljZS0+c3RhcmdldCwKIAkJCSAgICAiaGFuZGxlKDB4JTA0eCksIHNhc19hZGRyKDB4JTAxNmxseCksIGVuY2xvc3VyZSAiCiAJCQkgICAgImxvZ2ljYWwgaWQoMHglMDE2bGx4KSwgc2xvdCglZClcbiIsIGhhbmRsZSwKQEAgLTQ4ODAsOCArNTEwNiw2IEBACiAJCQlwcmludGsoS0VSTl9JTkZPICJcdGhhbmRsZSBjaGFuZ2VkIGZyb20oMHglMDR4KSEhIVxuIiwKIAkJCSAgICBzYXNfZGV2aWNlLT5oYW5kbGUpOwogCQkJc2FzX2RldmljZS0+aGFuZGxlID0gaGFuZGxlOwotCQkJc3RhcmdldCA9IHNhc19kZXZpY2UtPnN0YXJnZXQ7Ci0JCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YSA9IHN0YXJnZXQtPmhvc3RkYXRhOwogCQkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmhhbmRsZSA9IGhhbmRsZTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC01MjI3LDQ0ICs1NDUxLDM4IEBACiAKIAlzd2l0Y2ggKGZ3X2V2ZW50LT5ldmVudCkgewogCWNhc2UgTVBJMl9FVkVOVF9TQVNfVE9QT0xPR1lfQ0hBTkdFX0xJU1Q6Ci0JCV9zY3NpaF9zYXNfdG9wb2xvZ3lfY2hhbmdlX2V2ZW50KGlvYywgZndfZXZlbnQtPlZGX0lELAotCQkgICAgZndfZXZlbnQtPmV2ZW50X2RhdGEsIGZ3X2V2ZW50KTsKKwkJX3Njc2loX3Nhc190b3BvbG9neV9jaGFuZ2VfZXZlbnQoaW9jLCBmd19ldmVudCk7CiAJCWJyZWFrOwogCWNhc2UgTVBJMl9FVkVOVF9TQVNfREVWSUNFX1NUQVRVU19DSEFOR0U6Ci0JCV9zY3NpaF9zYXNfZGV2aWNlX3N0YXR1c19jaGFuZ2VfZXZlbnQoaW9jLCBmd19ldmVudC0+VkZfSUQsCi0JCSAgICBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CisJCV9zY3NpaF9zYXNfZGV2aWNlX3N0YXR1c19jaGFuZ2VfZXZlbnQoaW9jLAorCQkgICAgZndfZXZlbnQpOwogCQlicmVhazsKIAljYXNlIE1QSTJfRVZFTlRfU0FTX0RJU0NPVkVSWToKLQkJX3Njc2loX3Nhc19kaXNjb3ZlcnlfZXZlbnQoaW9jLCBmd19ldmVudC0+VkZfSUQsCi0JCSAgICBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CisJCV9zY3NpaF9zYXNfZGlzY292ZXJ5X2V2ZW50KGlvYywKKwkJICAgIGZ3X2V2ZW50KTsKIAkJYnJlYWs7CiAJY2FzZSBNUEkyX0VWRU5UX1NBU19CUk9BRENBU1RfUFJJTUlUSVZFOgotCQlfc2NzaWhfc2FzX2Jyb2FkY2FzdF9wcmltYXRpdmVfZXZlbnQoaW9jLCBmd19ldmVudC0+VkZfSUQsCi0JCSAgICBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CisJCV9zY3NpaF9zYXNfYnJvYWRjYXN0X3ByaW1hdGl2ZV9ldmVudChpb2MsCisJCSAgICBmd19ldmVudCk7CiAJCWJyZWFrOwogCWNhc2UgTVBJMl9FVkVOVF9TQVNfRU5DTF9ERVZJQ0VfU1RBVFVTX0NIQU5HRToKIAkJX3Njc2loX3Nhc19lbmNsb3N1cmVfZGV2X3N0YXR1c19jaGFuZ2VfZXZlbnQoaW9jLAotCQkgICAgZndfZXZlbnQtPlZGX0lELCBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CisJCSAgICBmd19ldmVudCk7CiAJCWJyZWFrOwogCWNhc2UgTVBJMl9FVkVOVF9JUl9DT05GSUdVUkFUSU9OX0NIQU5HRV9MSVNUOgotCQlfc2NzaWhfc2FzX2lyX2NvbmZpZ19jaGFuZ2VfZXZlbnQoaW9jLCBmd19ldmVudC0+VkZfSUQsCi0JCSAgICBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CisJCV9zY3NpaF9zYXNfaXJfY29uZmlnX2NoYW5nZV9ldmVudChpb2MsIGZ3X2V2ZW50KTsKIAkJYnJlYWs7CiAJY2FzZSBNUEkyX0VWRU5UX0lSX1ZPTFVNRToKLQkJX3Njc2loX3Nhc19pcl92b2x1bWVfZXZlbnQoaW9jLCBmd19ldmVudC0+VkZfSUQsCi0JCSAgICBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CisJCV9zY3NpaF9zYXNfaXJfdm9sdW1lX2V2ZW50KGlvYywgZndfZXZlbnQpOwogCQlicmVhazsKIAljYXNlIE1QSTJfRVZFTlRfSVJfUEhZU0lDQUxfRElTSzoKLQkJX3Njc2loX3Nhc19pcl9waHlzaWNhbF9kaXNrX2V2ZW50KGlvYywgZndfZXZlbnQtPlZGX0lELAotCQkgICAgZndfZXZlbnQtPmV2ZW50X2RhdGEpOworCQlfc2NzaWhfc2FzX2lyX3BoeXNpY2FsX2Rpc2tfZXZlbnQoaW9jLCBmd19ldmVudCk7CiAJCWJyZWFrOwogCWNhc2UgTVBJMl9FVkVOVF9JUl9PUEVSQVRJT05fU1RBVFVTOgotCQlfc2NzaWhfc2FzX2lyX29wZXJhdGlvbl9zdGF0dXNfZXZlbnQoaW9jLCBmd19ldmVudC0+VkZfSUQsCi0JCSAgICBmd19ldmVudC0+ZXZlbnRfZGF0YSk7CisJCV9zY3NpaF9zYXNfaXJfb3BlcmF0aW9uX3N0YXR1c19ldmVudChpb2MsIGZ3X2V2ZW50KTsKIAkJYnJlYWs7CiAJY2FzZSBNUEkyX0VWRU5UX1RBU0tfU0VUX0ZVTEw6Ci0JCV9zY3NpaF90YXNrX3NldF9mdWxsKGlvYywgZndfZXZlbnQtPlZGX0lELAotCQkgICAgZndfZXZlbnQtPmV2ZW50X2RhdGEpOworCQlfc2NzaWhfdGFza19zZXRfZnVsbChpb2MsIGZ3X2V2ZW50KTsKIAkJYnJlYWs7CiAJfQogCV9zY3NpaF9md19ldmVudF9mcmVlKGlvYywgZndfZXZlbnQpOwpAQCAtNTI3MywxNyArNTQ5MSwxOSBAQAogLyoqCiAgKiBtcHQyc2FzX3Njc2loX2V2ZW50X2NhbGxiYWNrIC0gZmlybXdhcmUgZXZlbnQgaGFuZGxlciAoY2FsbGVkIGF0IElTUiB0aW1lKQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAVkZfSUQ6IHZpcnR1YWwgZnVuY3Rpb24gaWQKKyAqIEBtc2l4X2luZGV4OiBNU0lYIHRhYmxlIGluZGV4IHN1cHBsaWVkIGJ5IHRoZSBPUwogICogQHJlcGx5OiByZXBseSBtZXNzYWdlIGZyYW1lKGxvd2VyIDMyYml0IGFkZHIpCiAgKiBDb250ZXh0OiBpbnRlcnJ1cHQuCiAgKgogICogVGhpcyBmdW5jdGlvbiBtZXJlbHkgYWRkcyBhIG5ldyB3b3JrIHRhc2sgaW50byBpb2MtPmZpcm13YXJlX2V2ZW50X3RocmVhZC4KICAqIFRoZSB0YXNrcyBhcmUgd29ya2VkIGZyb20gX2Zpcm13YXJlX2V2ZW50X3dvcmsgaW4gdXNlciBjb250ZXh0LgogICoKLSAqIFJldHVybiBub3RoaW5nLgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXZvaWQKLW1wdDJzYXNfc2NzaWhfZXZlbnRfY2FsbGJhY2soc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBWRl9JRCwgdTMyIHJlcGx5KQordTgKK21wdDJzYXNfc2NzaWhfZXZlbnRfY2FsbGJhY2soc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBtc2l4X2luZGV4LAorCXUzMiByZXBseSkKIHsKIAlzdHJ1Y3QgZndfZXZlbnRfd29yayAqZndfZXZlbnQ7CiAJTXBpMkV2ZW50Tm90aWZpY2F0aW9uUmVwbHlfdCAqbXBpX3JlcGx5OwpAQCAtNTI5NCwxMSArNTUxNCwxMSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZ3X2V2ZW50X2xvY2ssIGZsYWdzKTsKIAlpZiAoaW9jLT5md19ldmVudHNfb2ZmIHx8IGlvYy0+cmVtb3ZlX2hvc3QpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5md19ldmVudF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+ZndfZXZlbnRfbG9jaywgZmxhZ3MpOwogCi0JbXBpX3JlcGx5ID0gIG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOworCW1waV9yZXBseSA9IG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOwogCWV2ZW50ID0gbGUxNl90b19jcHUobXBpX3JlcGx5LT5FdmVudCk7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CkBAIC01MzEyLDcgKzU1MzIsNyBAQAogCQlpZiAoYmFlbl9kYXRhLT5QcmltaXRpdmUgIT0KIAkJICAgIE1QSTJfRVZFTlRfUFJJTUlUSVZFX0FTWU5DSFJPTk9VU19FVkVOVCB8fAogCQkgICAgaW9jLT5icm9hZGNhc3RfYWVuX2J1c3kpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMTsKIAkJaW9jLT5icm9hZGNhc3RfYWVuX2J1c3kgPSAxOwogCQlicmVhazsKIAl9CkBAIC01MzM0LDE0ICs1NTU0LDE0IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDogLyogaWdub3JlIHRoZSByZXN0ICovCi0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAJfQogCiAJZndfZXZlbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZndfZXZlbnRfd29yayksIEdGUF9BVE9NSUMpOwogCWlmICghZndfZXZlbnQpIHsKIAkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKIAkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAJfQogCWZ3X2V2ZW50LT5ldmVudF9kYXRhID0KIAkgICAga3phbGxvYyhtcGlfcmVwbHktPkV2ZW50RGF0YUxlbmd0aCo0LCBHRlBfQVRPTUlDKTsKQEAgLTUzNDksMTUgKzU1NjksMTcgQEAKIAkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKIAkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CiAJCWtmcmVlKGZ3X2V2ZW50KTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAKIAltZW1jcHkoZndfZXZlbnQtPmV2ZW50X2RhdGEsIG1waV9yZXBseS0+RXZlbnREYXRhLAogCSAgICBtcGlfcmVwbHktPkV2ZW50RGF0YUxlbmd0aCo0KTsKIAlmd19ldmVudC0+aW9jID0gaW9jOwotCWZ3X2V2ZW50LT5WRl9JRCA9IFZGX0lEOworCWZ3X2V2ZW50LT5WRl9JRCA9IG1waV9yZXBseS0+VkZfSUQ7CisJZndfZXZlbnQtPlZQX0lEID0gbXBpX3JlcGx5LT5WUF9JRDsKIAlmd19ldmVudC0+ZXZlbnQgPSBldmVudDsKIAlfc2NzaWhfZndfZXZlbnRfYWRkKGlvYywgZndfZXZlbnQpOworCXJldHVybiAxOwogfQogCiAvKiBzaG9zdCB0ZW1wbGF0ZSAqLwpAQCAtNTYxNyw3ICs1ODM5LDcgQEAKIH0KIAogLyoqCi0gKiBfc2NzaWhfcHJvYmVfc2FzIC0gcmVwb3J0aW5nIHJhaWQgdm9sdW1lcyB0byBzYXMgdHJhbnNwb3J0CisgKiBfc2NzaWhfcHJvYmVfc2FzIC0gcmVwb3J0aW5nIHNhcyBkZXZpY2VzIHRvIHNhcyB0cmFuc3BvcnQKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICoKICAqIENhbGxlZCBkdXJpbmcgaW5pdGlhbCBsb2FkaW5nIG9mIHRoZSBkcml2ZXIuCkBAIC01NzE0LDYgKzU5MzYsOCBAQAogCWlvYy0+YmFzZV9jYl9pZHggPSBiYXNlX2NiX2lkeDsKIAlpb2MtPnRyYW5zcG9ydF9jYl9pZHggPSB0cmFuc3BvcnRfY2JfaWR4OwogCWlvYy0+Y29uZmlnX2NiX2lkeCA9IGNvbmZpZ19jYl9pZHg7CisJaW9jLT50bV90cl9jYl9pZHggPSB0bV90cl9jYl9pZHg7CisJaW9jLT50bV9zYXNfY29udHJvbF9jYl9pZHggPSB0bV9zYXNfY29udHJvbF9jYl9pZHg7CiAJaW9jLT5sb2dnaW5nX2xldmVsID0gbG9nZ2luZ19sZXZlbDsKIAkvKiBtaXNjIHNlbWFwaG9yZXMgYW5kIHNwaW4gbG9ja3MgKi8KIAlzcGluX2xvY2tfaW5pdCgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jayk7CkBAIC01NzI5LDYgKzU5NTMsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZpb2MtPmZ3X2V2ZW50X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZpb2MtPnJhaWRfZGV2aWNlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZpb2MtPnNhc19oYmEuc2FzX3BvcnRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYy0+ZGVsYXllZF90cl9saXN0KTsKIAogCS8qIGluaXQgc2hvc3QgcGFyYW1ldGVycyAqLwogCXNob3N0LT5tYXhfY21kX2xlbiA9IDE2OwpAQCAtNTc0NSw2ICs1OTcwLDcgQEAKIAogCXNjc2lfaG9zdF9zZXRfcHJvdChzaG9zdCwgU0hPU1RfRElGX1RZUEUxX1BST1RFQ1RJT04KIAkgICAgfCBTSE9TVF9ESUZfVFlQRTNfUFJPVEVDVElPTik7CisJc2NzaV9ob3N0X3NldF9ndWFyZChzaG9zdCwgU0hPU1RfRElYX0dVQVJEX0NSQyk7CiAKIAkvKiBldmVudCB0aHJlYWQgKi8KIAlzbnByaW50Zihpb2MtPmZpcm13YXJlX2V2ZW50X25hbWUsIHNpemVvZihpb2MtPmZpcm13YXJlX2V2ZW50X25hbWUpLApAQCAtNTg5NCw2ICs2MTIwLDExIEBACiAJLyogY3RsIG1vZHVsZSBjYWxsYmFjayBoYW5kbGVyICovCiAJY3RsX2NiX2lkeCA9IG1wdDJzYXNfYmFzZV9yZWdpc3Rlcl9jYWxsYmFja19oYW5kbGVyKG1wdDJzYXNfY3RsX2RvbmUpOwogCisJdG1fdHJfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIoCisJICAgIF9zY3NpaF90bV90cl9jb21wbGV0ZSk7CisJdG1fc2FzX2NvbnRyb2xfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIoCisJICAgIF9zY3NpaF9zYXNfY29udHJvbF9jb21wbGV0ZSk7CisKIAltcHQyc2FzX2N0bF9pbml0KCk7CiAKIAllcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNjc2loX2RyaXZlcik7CkBAIC01OTI0LDYgKzYxNTUsOSBAQAogCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIoY29uZmlnX2NiX2lkeCk7CiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcihjdGxfY2JfaWR4KTsKIAorCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIodG1fdHJfY2JfaWR4KTsKKwltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKHRtX3Nhc19jb250cm9sX2NiX2lkeCk7CisKIAltcHQyc2FzX2N0bF9leGl0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jCmluZGV4IDc0MjMyNGEuLmViOTgxODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYwpAQCAtMiw3ICsyLDcgQEAKICAqIFNBUyBUcmFuc3BvcnQgTGF5ZXIgZm9yIE1QVCAoTWVzc2FnZSBQYXNzaW5nIFRlY2hub2xvZ3kpIGJhc2VkIGNvbnRyb2xsZXJzCiAgKgogICogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIGRyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJfdHJhbnNwb3J0LmMKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4ICBMU0kgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5ICBMU0kgQ29ycG9yYXRpb24KICAqICAobWFpbHRvOkRMLU1QVEZ1c2lvbkxpbnV4QGxzaS5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjEyLDI1ICsyMTIsMjYgQEAKICAqIG1wdDJzYXNfdHJhbnNwb3J0X2RvbmUgLSAgaW50ZXJuYWwgdHJhbnNwb3J0IGxheWVyIGNhbGxiYWNrIGhhbmRsZXIuCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBzbWlkOiBzeXN0ZW0gcmVxdWVzdCBtZXNzYWdlIGluZGV4Ci0gKiBAVkZfSUQ6IHZpcnR1YWwgZnVuY3Rpb24gaWQKKyAqIEBtc2l4X2luZGV4OiBNU0lYIHRhYmxlIGluZGV4IHN1cHBsaWVkIGJ5IHRoZSBPUwogICogQHJlcGx5OiByZXBseSBtZXNzYWdlIGZyYW1lKGxvd2VyIDMyYml0IGFkZHIpCiAgKgogICogQ2FsbGJhY2sgaGFuZGxlciB3aGVuIHNlbmRpbmcgaW50ZXJuYWwgZ2VuZXJhdGVkIHRyYW5zcG9ydCBjbWRzLgogICogVGhlIGNhbGxiYWNrIGluZGV4IHBhc3NlZCBpcyBgaW9jLT50cmFuc3BvcnRfY2JfaWR4YAogICoKLSAqIFJldHVybiBub3RoaW5nLgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXZvaWQKLW1wdDJzYXNfdHJhbnNwb3J0X2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggVkZfSUQsCit1OAorbXB0MnNhc190cmFuc3BvcnRfZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBtc2l4X2luZGV4LAogICAgIHUzMiByZXBseSkKIHsKIAlNUEkyRGVmYXVsdFJlcGx5X3QgKm1waV9yZXBseTsKIAogCW1waV9yZXBseSA9ICBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKIAlpZiAoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgPT0gTVBUMl9DTURfTk9UX1VTRUQpCi0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAJaWYgKGlvYy0+dHJhbnNwb3J0X2NtZHMuc21pZCAhPSBzbWlkKQotCQlyZXR1cm47CisJCXJldHVybiAxOwogCWlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzIHw9IE1QVDJfQ01EX0NPTVBMRVRFOwogCWlmIChtcGlfcmVwbHkpIHsKIAkJbWVtY3B5KGlvYy0+dHJhbnNwb3J0X2NtZHMucmVwbHksIG1waV9yZXBseSwKQEAgLTIzOSw2ICsyNDAsNyBAQAogCX0KIAlpb2MtPnRyYW5zcG9ydF9jbWRzLnN0YXR1cyAmPSB+TVBUMl9DTURfUEVORElORzsKIAljb21wbGV0ZSgmaW9jLT50cmFuc3BvcnRfY21kcy5kb25lKTsKKwlyZXR1cm4gMTsKIH0KIAogLyogcmVwb3J0IG1hbnVmYWN0dXJlIHJlcXVlc3Qgc3RydWN0dXJlICovCkBAIC0zNjksNiArMzcxLDggQEAKIAltZW1zZXQobXBpX3JlcXVlc3QsIDAsIHNpemVvZihNcGkyU21wUGFzc3Rocm91Z2hSZXF1ZXN0X3QpKTsKIAltcGlfcmVxdWVzdC0+RnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX1NNUF9QQVNTVEhST1VHSDsKIAltcGlfcmVxdWVzdC0+UGh5c2ljYWxQb3J0ID0gMHhGRjsKKwltcGlfcmVxdWVzdC0+VkZfSUQgPSAwOyAvKiBUT0RPICovCisJbXBpX3JlcXVlc3QtPlZQX0lEID0gMDsKIAlzYXNfYWRkcmVzc19sZSA9ICh1NjQgKikmbXBpX3JlcXVlc3QtPlNBU0FkZHJlc3M7CiAJKnNhc19hZGRyZXNzX2xlID0gY3B1X3RvX2xlNjQoc2FzX2FkZHJlc3MpOwogCW1waV9yZXF1ZXN0LT5SZXF1ZXN0RGF0YUxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcmVwX21hbnVfcmVxdWVzdCk7CkBAIC0zOTYsNyArNDAwLDggQEAKIAlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICJyZXBvcnRfbWFudWZhY3R1cmUgLSAiCiAJICAgICJzZW5kIHRvIHNhc19hZGRyKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwKIAkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfYWRkcmVzcykpOwotCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCwgMCAvKiBWRl9JRCAqLyk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwlpbml0X2NvbXBsZXRpb24oJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSk7CiAJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSwKIAkgICAgMTAqSFopOwogCkBAIC0xMTA2LDYgKzExMTEsOCBAQAogCW1lbXNldChtcGlfcmVxdWVzdCwgMCwgc2l6ZW9mKE1waTJTbXBQYXNzdGhyb3VnaFJlcXVlc3RfdCkpOwogCW1waV9yZXF1ZXN0LT5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fU01QX1BBU1NUSFJPVUdIOwogCW1waV9yZXF1ZXN0LT5QaHlzaWNhbFBvcnQgPSAweEZGOworCW1waV9yZXF1ZXN0LT5WRl9JRCA9IDA7IC8qIFRPRE8gKi8KKwltcGlfcmVxdWVzdC0+VlBfSUQgPSAwOwogCSooKHU2NCAqKSZtcGlfcmVxdWVzdC0+U0FTQWRkcmVzcykgPSAocnBoeSkgPwogCSAgICBjcHVfdG9fbGU2NChycGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcykgOgogCSAgICBjcHVfdG9fbGU2NChpb2MtPnNhc19oYmEuc2FzX2FkZHJlc3MpOwpAQCAtMTE0Nyw3ICsxMTU0LDggQEAKIAlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlcyAtICIKIAkgICAgInNlbmRpbmcgc21wIHJlcXVlc3RcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pKTsKIAotCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCwgMCAvKiBWRl9JRCAqLyk7CisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwlpbml0X2NvbXBsZXRpb24oJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSk7CiAJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSwKIAkgICAgMTAqSFopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfZGVmcy5oIGIvZHJpdmVycy9zY3NpL212c2FzL212X2RlZnMuaAppbmRleCBmOGNiOWRlLi4xODQ5ZGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfZGVmcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9kZWZzLmgKQEAgLTI1LDYgKzI1LDggQEAKICNpZm5kZWYgX01WX0RFRlNfSF8KICNkZWZpbmUgX01WX0RFRlNfSF8KIAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FSRUNBXzEzMDAJMHgxMzAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVJFQ0FfMTMyMAkweDEzMjAKIAogZW51bSBjaGlwX2ZsYXZvcnMgewogCWNoaXBfNjMyMCwKQEAgLTMyLDYgKzM0LDggQEAKIAljaGlwXzY0ODUsCiAJY2hpcF85NDgwLAogCWNoaXBfOTE4MCwKKwljaGlwXzEzMDAsCisJY2hpcF8xMzIwCiB9OwogCiAvKiBkcml2ZXIgY29tcGlsZS10aW1lIGNvbmZpZ3VyYXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9pbml0LmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfaW5pdC5jCmluZGV4IDg2NDZhMTkuLmM3OTBkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212X2luaXQuYwpAQCAtMzIsNiArMzIsOCBAQAogCVtjaGlwXzY0ODVdID0JeyAxLCA4LCAweDgwMCwgMzMsIDMyLCAxMCwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAogCVtjaGlwXzkxODBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAogCVtjaGlwXzk0ODBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzEzMDBdID0JeyAxLCA0LCAweDQwMCwgMTcsIDE2LCAgOSwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzEzMjBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAogfTsKIAogI2RlZmluZSBTT0NfU0FTX05VTSAyCkBAIC02NTMsNiArNjU1LDggQEAKIAl7IFBDSV9WREVWSUNFKE1BUlZFTEwsIDB4NjQ4NSksIGNoaXBfNjQ4NSB9LAogCXsgUENJX1ZERVZJQ0UoTUFSVkVMTCwgMHg5NDgwKSwgY2hpcF85NDgwIH0sCiAJeyBQQ0lfVkRFVklDRShNQVJWRUxMLCAweDkxODApLCBjaGlwXzkxODAgfSwKKwl7IFBDSV9WREVWSUNFKEFSRUNBLCBQQ0lfREVWSUNFX0lEX0FSRUNBXzEzMDApLCBjaGlwXzEzMDAgfSwKKwl7IFBDSV9WREVWSUNFKEFSRUNBLCBQQ0lfREVWSUNFX0lEX0FSRUNBXzEzMjApLCBjaGlwXzEzMjAgfSwKIAogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMgYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCmluZGV4IDQzMDJmMDYuLmY3YzcwZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC02ODQsNyArNjg1LDcgQEAKIAlzdHJ1Y3QgcG1jcmFpZF9pbnN0YW5jZSAqcGluc3RhbmNlID0gY21kLT5kcnZfaW5zdDsKIAl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CiAKLQlkZXZfZXJyKCZwaW5zdGFuY2UtPnBkZXYtPmRldiwKKwlkZXZfaW5mbygmcGluc3RhbmNlLT5wZGV2LT5kZXYsCiAJCSJBZGFwdGVyIGJlaW5nIHJlc2V0IGR1ZSB0byBjb21tYW5kIHRpbWVvdXQuXG4iKTsKIAogCS8qIENvbW1hbmQgdGltZW91dHMgcmVzdWx0IGluIGhhcmQgcmVzZXQgc2VxdWVuY2UuIFRoZSBjb21tYW5kIHRoYXQgZ290CkBAIC04MTUsOCArODE2LDkgQEAKIAogCWlmIChQTUNSQUlEX0lPQVNDX1NFTlNFX0tFWShpb2FzYykgPiAwKSB7CiAJCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9FUlJPUiA8PCAxNik7Ci0JCXBtY3JhaWRfZXJyKCJjb21tYW5kIENEQlswXSA9ICV4IGZhaWxlZCB3aXRoIElPQVNDOiAweCUwOFhcbiIsCi0JCQkgICAgIGNtZC0+aW9hX2NiLT5pb2FyY2IuY2RiWzBdLCBpb2FzYyk7CisJCXNjbWRfcHJpbnRrKEtFUk5fSU5GTywgc2NzaV9jbWQsCisJCQkgICAgImNvbW1hbmQgQ0RCWzBdID0gJXggZmFpbGVkIHdpdGggSU9BU0M6IDB4JTA4WFxuIiwKKwkJCSAgICBjbWQtPmlvYV9jYi0+aW9hcmNiLmNkYlswXSwgaW9hc2MpOwogCX0KIAogCS8qIGlmIHdlIGhhZCBhbGxvY2F0ZWQgc2Vuc2UgYnVmZmVycyBmb3IgcmVxdWVzdCBzZW5zZSwgY29weSB0aGUgc2Vuc2UKQEAgLTE1NDEsMTMgKzE1NDMsMTMgQEAKIAogCWlmIChwaW5zdGFuY2UtPmxkbi5oY2FtLT5ub3RpZmljYXRpb25fbG9zdCA9PQogCSAgICBIT1NUUkNCX05PVElGSUNBVElPTlNfTE9TVCkKLQkJZGV2X2VycigmcGluc3RhbmNlLT5wZGV2LT5kZXYsICJFcnJvciBub3RpZmljYXRpb25zIGxvc3RcbiIpOworCQlkZXZfaW5mbygmcGluc3RhbmNlLT5wZGV2LT5kZXYsICJFcnJvciBub3RpZmljYXRpb25zIGxvc3RcbiIpOwogCiAJaW9hc2MgPSBsZTMyX3RvX2NwdShoY2FtX2xkbi0+ZXJyb3JfbG9nLmZkX2lvYXNjKTsKIAogCWlmIChpb2FzYyA9PSBQTUNSQUlEX0lPQVNDX1VBX0JVU19XQVNfUkVTRVQgfHwKIAkJaW9hc2MgPT0gUE1DUkFJRF9JT0FTQ19VQV9CVVNfV0FTX1JFU0VUX0JZX09USEVSKSB7Ci0JCWRldl9lcnIoJnBpbnN0YW5jZS0+cGRldi0+ZGV2LAorCQlkZXZfaW5mbygmcGluc3RhbmNlLT5wZGV2LT5kZXYsCiAJCQkiVW5pdEF0dGVudGlvbiBkdWUgdG8gSU9BIEJ1cyBSZXNldFxuIik7CiAJCXNjc2lfcmVwb3J0X2J1c19yZXNldCgKIAkJCXBpbnN0YW5jZS0+aG9zdCwKQEAgLTE1ODQsNyArMTU4Niw3IEBACiAJICAgIGF0b21pY19yZWFkKCZwaW5zdGFuY2UtPmNjbi5pZ25vcmUpID09IDEpIHsKIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAoaW9hc2MpIHsKLQkJZGV2X2VycigmcGluc3RhbmNlLT5wZGV2LT5kZXYsCisJCWRldl9pbmZvKCZwaW5zdGFuY2UtPnBkZXYtPmRldiwKIAkJCSJIb3N0IFJDQiAoQ0NOKSBmYWlsZWQgd2l0aCBJT0FTQzogMHglMDhYXG4iLCBpb2FzYyk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKHBpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKIAkJcG1jcmFpZF9zZW5kX2hjYW0ocGluc3RhbmNlLCBQTUNSQUlEX0hDQU1fQ09ERV9DT05GSUdfQ0hBTkdFKTsKQEAgLTE2MzQsNyArMTYzNiw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewotCQlkZXZfZXJyKCZwaW5zdGFuY2UtPnBkZXYtPmRldiwKKwkJZGV2X2luZm8oJnBpbnN0YW5jZS0+cGRldi0+ZGV2LAogCQkJIkhvc3QgUkNCKExETikgZmFpbGVkIHdpdGggSU9BU0M6IDB4JTA4WFxuIiwgaW9hc2MpOwogCX0KIAkvKiBzZW5kIG5ldGxpbmsgbWVzc2FnZSBmb3IgSENBTSBub3RpZmljYXRpb24gaWYgZW5hYmxlZCAqLwpAQCAtMTgyMiw3ICsxODI0LDYgQEAKIAkJCXNjc2lfZG1hX3VubWFwKHNjc2lfY21kKTsKIAkJCXBtY3JhaWRfcmV0dXJuX2NtZChjbWQpOwogCi0KIAkJCXBtY3JhaWRfaW5mbygiZmFpbGluZyglZCkgQ0RCWzBdID0gJXggcmVzdWx0OiAleFxuIiwKIAkJCQkgICAgIGxlMzJfdG9fY3B1KHJlc3ApID4+IDIsCiAJCQkJICAgICBjbWQtPmlvYV9jYi0+aW9hcmNiLmNkYlswXSwKQEAgLTI1MTQsNyArMjUxNSw4IEBACiAJcmVzID0gc2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CiAKIAlpZiAoIXJlcykgewotCQlwbWNyYWlkX2VycigicmVzZXRfZGV2aWNlOiBOVUxMIHJlc291cmNlIHBvaW50ZXJcbiIpOworCQlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2NzaV9jbWQtPmRldmljZSwKKwkJCSAgICAicmVzZXRfZGV2aWNlOiBOVUxMIHJlc291cmNlIHBvaW50ZXJcbiIpOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIApAQCAtMjc1Miw4ICsyNzU0LDggQEAKIAlwaW5zdGFuY2UgPQogCQkoc3RydWN0IHBtY3JhaWRfaW5zdGFuY2UgKilzY3NpX2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIAotCWRldl9lcnIoJnBpbnN0YW5jZS0+cGRldi0+ZGV2LAotCQkiSS9PIGNvbW1hbmQgdGltZWQgb3V0LCBhYm9ydGluZyBpdC5cbiIpOworCXNjbWRfcHJpbnRrKEtFUk5fSU5GTywgc2NzaV9jbWQsCisJCSAgICAiSS9PIGNvbW1hbmQgdGltZWQgb3V0LCBhYm9ydGluZyBpdC5cbiIpOwogCiAJcmVzID0gc2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CiAKQEAgLTI4MjQsNyArMjgyNiw4IEBACiAgKi8KIHN0YXRpYyBpbnQgcG1jcmFpZF9laF9kZXZpY2VfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQogewotCXBtY3JhaWRfZXJyKCJEb2luZyBkZXZpY2UgcmVzZXQgZHVlIHRvIGFuIEkvTyBjb21tYW5kIHRpbWVvdXQuXG4iKTsKKwlzY21kX3ByaW50ayhLRVJOX0lORk8sIHNjbWQsCisJCSAgICAicmVzZXR0aW5nIGRldmljZSBkdWUgdG8gYW4gSS9PIGNvbW1hbmQgdGltZW91dC5cbiIpOwogCXJldHVybiBwbWNyYWlkX3Jlc2V0X2RldmljZShzY21kLAogCQkJCSAgICBQTUNSQUlEX0lOVEVSTkFMX1RJTUVPVVQsCiAJCQkJICAgIFJFU0VUX0RFVklDRV9MVU4pOwpAQCAtMjgzMiw3ICsyODM1LDggQEAKIAogc3RhdGljIGludCBwbWNyYWlkX2VoX2J1c19yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7Ci0JcG1jcmFpZF9lcnIoIkRvaW5nIGJ1cyByZXNldCBkdWUgdG8gYW4gSS9PIGNvbW1hbmQgdGltZW91dC5cbiIpOworCXNjbWRfcHJpbnRrKEtFUk5fSU5GTywgc2NtZCwKKwkJICAgICJEb2luZyBidXMgcmVzZXQgZHVlIHRvIGFuIEkvTyBjb21tYW5kIHRpbWVvdXQuXG4iKTsKIAlyZXR1cm4gcG1jcmFpZF9yZXNldF9kZXZpY2Uoc2NtZCwKIAkJCQkgICAgUE1DUkFJRF9SRVNFVF9CVVNfVElNRU9VVCwKIAkJCQkgICAgUkVTRVRfREVWSUNFX0JVUyk7CkBAIC0yODQwLDcgKzI4NDQsOCBAQAogCiBzdGF0aWMgaW50IHBtY3JhaWRfZWhfdGFyZ2V0X3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKIHsKLQlwbWNyYWlkX2VycigiRG9pbmcgdGFyZ2V0IHJlc2V0IGR1ZSB0byBhbiBJL08gY29tbWFuZCB0aW1lb3V0LlxuIik7CisJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBzY21kLAorCQkgICAgIkRvaW5nIHRhcmdldCByZXNldCBkdWUgdG8gYW4gSS9PIGNvbW1hbmQgdGltZW91dC5cbiIpOwogCXJldHVybiBwbWNyYWlkX3Jlc2V0X2RldmljZShzY21kLAogCQkJCSAgICBQTUNSQUlEX0lOVEVSTkFMX1RJTUVPVVQsCiAJCQkJICAgIFJFU0VUX0RFVklDRV9UQVJHRVQpOwpAQCAtMjk4OCwxMSArMjk5MywxMSBAQAogCW5zZWcgPSBzY3NpX2RtYV9tYXAoc2NzaV9jbWQpOwogCiAJaWYgKG5zZWcgPCAwKSB7Ci0JCWRldl9lcnIoJnBpbnN0YW5jZS0+cGRldi0+ZGV2LCAic2NzaV9tYXBfZG1hIGZhaWxlZCFcbiIpOworCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgc2NzaV9jbWQsICJzY3NpX21hcF9kbWEgZmFpbGVkIVxuIik7CiAJCXJldHVybiAtMTsKIAl9IGVsc2UgaWYgKG5zZWcgPiBQTUNSQUlEX01BWF9JT0FETFMpIHsKIAkJc2NzaV9kbWFfdW5tYXAoc2NzaV9jbWQpOwotCQlkZXZfZXJyKCZwaW5zdGFuY2UtPnBkZXYtPmRldiwKKwkJc2NtZF9wcmludGsoS0VSTl9FUlIsIHNjc2lfY21kLAogCQkJInNnIGNvdW50IGlzICglZCkgbW9yZSB0aGFuIGFsbG93ZWQhXG4iLCBuc2VnKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTUwNDAsNyArNTA0NSw3IEBACiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAogCWlmIChyYykgewotCQlwbWNyYWlkX2VycigicG1jcmFpZDogRW5hYmxlIGRldmljZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZXN1bWU6IEVuYWJsZSBkZXZpY2UgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtNTA1NCw3ICs1MDU5LDcgQEAKIAkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAKIAlpZiAocmMgIT0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IFBDSSBETUEgbWFza1xuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlc3VtZTogRmFpbGVkIHRvIHNldCBQQ0kgRE1BIG1hc2tcbiIpOwogCQlnb3RvIGRpc2FibGVfZGV2aWNlOwogCX0KIApAQCAtNTA2Myw3ICs1MDY4LDggQEAKIAlyYyA9IHBtY3JhaWRfcmVnaXN0ZXJfaW50ZXJydXB0X2hhbmRsZXIocGluc3RhbmNlKTsKIAogCWlmIChyYykgewotCQlwbWNyYWlkX2VycigicmVzdW1lOiBjb3VsZG4ndCByZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlcnNcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkicmVzdW1lOiBjb3VsZG4ndCByZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlcnNcbiIpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gcmVsZWFzZV9ob3N0OwogCX0KQEAgLTUwODAsNyArNTA4Niw3IEBACiAJICogc3RhdGUuCiAJICovCiAJaWYgKHBtY3JhaWRfcmVzZXRfYnJpbmd1cChwaW5zdGFuY2UpKSB7Ci0JCXBtY3JhaWRfZXJyKCJjb3VsZG4ndCBpbml0aWFsaXplIElPQSBcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCBpbml0aWFsaXplIElPQSBcbiIpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gcmVsZWFzZV90YXNrbGV0czsKIAl9CkBAIC01MTg3LDcgKzUxOTMsNyBAQAogCUxJU1RfSEVBRChvbGRfcmVzKTsKIAogCWlmIChwaW5zdGFuY2UtPmNmZ190YWJsZS0+ZmxhZ3MgJiBNSUNST0NPREVfVVBEQVRFX1JFUVVJUkVEKQotCQlkZXZfZXJyKCZwaW5zdGFuY2UtPnBkZXYtPmRldiwgIlJlcXVpcmUgbWljcm9jb2RlIGRvd25sb2FkXG4iKTsKKwkJcG1jcmFpZF9lcnIoIklPQSByZXF1aXJlcyBtaWNyb2NvZGUgZG93bmxvYWRcbiIpOwogCiAJLyogcmVzb3VyY2UgbGlzdCBpcyBwcm90ZWN0ZWQgYnkgcGluc3RhbmNlLT5yZXNvdXJjZV9sb2NrLgogCSAqIGluaXRfcmVzX3RhYmxlIGNhbiBiZSBjYWxsZWQgZnJvbSBwcm9iZSAodXNlci10aHJlYWQpIG9yIHJ1bnRpbWUKQEAgLTUyMjQsOCArNTIzMCw3IEBACiAJCWlmICghZm91bmQpIHsKIAogCQkJaWYgKGxpc3RfZW1wdHkoJnBpbnN0YW5jZS0+ZnJlZV9yZXNfcSkpIHsKLQkJCQlkZXZfZXJyKCZwaW5zdGFuY2UtPnBkZXYtPmRldiwKLQkJCQkJIlRvbyBtYW55IGRldmljZXMgYXR0YWNoZWRcbiIpOworCQkJCXBtY3JhaWRfZXJyKCJUb28gbWFueSBkZXZpY2VzIGF0dGFjaGVkXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtNTQ0Miw3ICs1NDQ3LDcgQEAKIAlyYyA9IHBtY3JhaWRfcmVnaXN0ZXJfaW50ZXJydXB0X2hhbmRsZXIocGluc3RhbmNlKTsKIAogCWlmIChyYykgewotCQlwbWNyYWlkX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXJcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCByZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlclxuIik7CiAJCWdvdG8gb3V0X3Njc2lfaG9zdF9wdXQ7CiAJfQogCkBAIC01NDY2LDcgKzU0NzEsNyBAQAogCSAqLwogCXBtY3JhaWRfaW5mbygic3RhcnRpbmcgSU9BIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlXG4iKTsKIAlpZiAocG1jcmFpZF9yZXNldF9icmluZ3VwKHBpbnN0YW5jZSkpIHsKLQkJcG1jcmFpZF9lcnIoImNvdWxkbid0IGluaXRpYWxpemUgSU9BIFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkbid0IGluaXRpYWxpemUgSU9BIFxuIik7CiAJCXJjID0gMTsKIAkJZ290byBvdXRfcmVsZWFzZV9idWZzOwogCX0KQEAgLTU1MzQsNyArNTUzOSw2IEBACiAJLnNodXRkb3duID0gcG1jcmFpZF9zaHV0ZG93bgogfTsKIAotCiAvKioKICAqIHBtY3JhaWRfaW5pdCAtIG1vZHVsZSBsb2FkIGVudHJ5IHBvaW50CiAgKi8KQEAgLTU1NjYsNyArNTU3MCw2IEBACiAJCWdvdG8gb3V0X3VucmVnX2NocmRldjsKIAl9CiAKLQogCWVycm9yID0gcG1jcmFpZF9uZXRsaW5rX2luaXQoKTsKIAogCWlmIChlcnJvcikKQEAgLTU1ODQsNiArNTU4Nyw3IEBACiAKIG91dF91bnJlZ19jaHJkZXY6CiAJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKHBtY3JhaWRfbWFqb3IsIDApLCBQTUNSQUlEX01BWF9BREFQVEVSUyk7CisKIG91dF9pbml0OgogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5oCmluZGV4IDYxNGIzYTcuLjM0NDFiM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmgKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuaApAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+Ci0jaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKaW5kZXggNDJiNzk5YS4uZTA3YjM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYwpAQCAtNTY4LDcgKzU2OCw3IEBACiAJaWYgKHJlcSA9PSBOVUxMKSB7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkiCiAJCQkiZm9yIHJlcXVlc3QgcXVlXG4iKTsKLQkJZ290byBxdWVfZmFpbGVkOworCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlyZXEtPmxlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzI0WFg7CkBAIC02MzIsNiArNjMyLDcgQEAKIAogcXVlX2ZhaWxlZDoKIAlxbGEyNXh4X2ZyZWVfcmVxX3F1ZShiYXNlX3ZoYSwgcmVxKTsKK2ZhaWxlZDoKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjU5LDcgKzY2MCw3IEBACiAJaWYgKHJzcCA9PSBOVUxMKSB7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIgogCQkJCSIgcmVzcG9uc2UgcXVlXG4iKTsKLQkJZ290byBxdWVfZmFpbGVkOworCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlyc3AtPmxlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF9NUTsKQEAgLTcyOCw2ICs3MjksNyBAQAogCiBxdWVfZmFpbGVkOgogCXFsYTI1eHhfZnJlZV9yc3BfcXVlKGJhc2VfdmhhLCByc3ApOworZmFpbGVkOgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2kuYwppbmRleCBiNmUwMzA3Li5kZDA5OGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKQEAgLTI0MSwxMCArMjQxLDcgQEAKICAqLwogc3RydWN0IHNjc2lfY21uZCAqX19zY3NpX2dldF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7Ci0JdW5zaWduZWQgY2hhciAqYnVmOwotCi0JY21kID0gc2NzaV9ob3N0X2FsbG9jX2NvbW1hbmQoc2hvc3QsIGdmcF9tYXNrKTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzY3NpX2hvc3RfYWxsb2NfY29tbWFuZChzaG9zdCwgZ2ZwX21hc2spOwogCiAJaWYgKHVubGlrZWx5KCFjbWQpKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNTgsOSArMjU1LDE1IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJCWlmIChjbWQpIHsKKwkJCXZvaWQgKmJ1ZiwgKnByb3Q7CisKIAkJCWJ1ZiA9IGNtZC0+c2Vuc2VfYnVmZmVyOworCQkJcHJvdCA9IGNtZC0+cHJvdF9zZGI7CisKIAkJCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisKIAkJCWNtZC0+c2Vuc2VfYnVmZmVyID0gYnVmOworCQkJY21kLT5wcm90X3NkYiA9IHByb3Q7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCmluZGV4IGZiOWFmMjAuLmM0MTAzYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgogCiAjaW5jbHVkZSAic2QuaCIKICNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKQEAgLTY0LDYgKzY1LDcgQEAKICNkZWZpbmUgUEFSQU1FVEVSX0xJU1RfTEVOR1RIX0VSUiAweDFhCiAjZGVmaW5lIElOVkFMSURfT1BDT0RFIDB4MjAKICNkZWZpbmUgQUREUl9PVVRfT0ZfUkFOR0UgMHgyMQorI2RlZmluZSBJTlZBTElEX0NPTU1BTkRfT1BDT0RFIDB4MjAKICNkZWZpbmUgSU5WQUxJRF9GSUVMRF9JTl9DREIgMHgyNAogI2RlZmluZSBJTlZBTElEX0ZJRUxEX0lOX1BBUkFNX0xJU1QgMHgyNgogI2RlZmluZSBQT1dFUk9OX1JFU0VUIDB4MjkKQEAgLTE4MCw3ICsxODIsNyBAQAogI2RlZmluZSBTREVCVUdfU0VOU0VfTEVOIDMyCiAKICNkZWZpbmUgU0NTSV9ERUJVR19DQU5RVUVVRSAgMjU1Ci0jZGVmaW5lIFNDU0lfREVCVUdfTUFYX0NNRF9MRU4gMTYKKyNkZWZpbmUgU0NTSV9ERUJVR19NQVhfQ01EX0xFTiAzMgogCiBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OwpAQCAtMjk2LDkgKzI5OCwyNSBAQAogfQogCiBzdGF0aWMgdm9pZCBnZXRfZGF0YV90cmFuc2Zlcl9pbmZvKHVuc2lnbmVkIGNoYXIgKmNtZCwKLQkJCQkgICB1bnNpZ25lZCBsb25nIGxvbmcgKmxiYSwgdW5zaWduZWQgaW50ICpudW0pCisJCQkJICAgdW5zaWduZWQgbG9uZyBsb25nICpsYmEsIHVuc2lnbmVkIGludCAqbnVtLAorCQkJCSAgIHUzMiAqZWlfbGJhKQogeworCSplaV9sYmEgPSAwOworCiAJc3dpdGNoICgqY21kKSB7CisJY2FzZSBWQVJJQUJMRV9MRU5HVEhfQ01EOgorCQkqbGJhID0gKHU2NCljbWRbMTldIHwgKHU2NCljbWRbMThdIDw8IDggfAorCQkJKHU2NCljbWRbMTddIDw8IDE2IHwgKHU2NCljbWRbMTZdIDw8IDI0IHwKKwkJCSh1NjQpY21kWzE1XSA8PCAzMiB8ICh1NjQpY21kWzE0XSA8PCA0MCB8CisJCQkodTY0KWNtZFsxM10gPDwgNDggfCAodTY0KWNtZFsxMl0gPDwgNTY7CisKKwkJKmVpX2xiYSA9ICh1MzIpY21kWzIzXSB8ICh1MzIpY21kWzIyXSA8PCA4IHwKKwkJCSh1MzIpY21kWzIxXSA8PCAxNiB8ICh1MzIpY21kWzIwXSA8PCAyNDsKKworCQkqbnVtID0gKHUzMiljbWRbMzFdIHwgKHUzMiljbWRbMzBdIDw8IDggfCAodTMyKWNtZFsyOV0gPDwgMTYgfAorCQkJKHUzMiljbWRbMjhdIDw8IDI0OworCQlicmVhazsKKwogCWNhc2UgV1JJVEVfMTY6CiAJY2FzZSBSRUFEXzE2OgogCQkqbGJhID0gKHU2NCljbWRbOV0gfCAodTY0KWNtZFs4XSA8PCA4IHwKQEAgLTE1ODksNyArMTYwNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcHJvdF92ZXJpZnlfcmVhZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgc2VjdG9yX3Qgc3RhcnRfc2VjLAotCQkJICAgIHVuc2lnbmVkIGludCBzZWN0b3JzKQorCQkJICAgIHVuc2lnbmVkIGludCBzZWN0b3JzLCB1MzIgZWlfbGJhKQogewogCXVuc2lnbmVkIGludCBpLCByZXNpZDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzZ2w7CkBAIC0xNjM2LDEzICsxNjU0LDIzIEBACiAJCQlyZXR1cm4gMHgwMTsKIAkJfQogCi0JCWlmIChzY3NpX2RlYnVnX2RpZiAhPSBTRF9ESUZfVFlQRTNfUFJPVEVDVElPTiAmJgorCQlpZiAoc2NzaV9kZWJ1Z19kaWYgPT0gU0RfRElGX1RZUEUxX1BST1RFQ1RJT04gJiYKIAkJICAgIGJlMzJfdG9fY3B1KHNkdFtpXS5yZWZfdGFnKSAhPSAoc2VjdG9yICYgMHhmZmZmZmZmZikpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJFRiBjaGVjayBmYWlsZWQgb24gc2VjdG9yICVsdVxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpc2VjdG9yKTsKIAkJCWRpZl9lcnJvcnMrKzsKIAkJCXJldHVybiAweDAzOwogCQl9CisKKwkJaWYgKHNjc2lfZGVidWdfZGlmID09IFNEX0RJRl9UWVBFMl9QUk9URUNUSU9OICYmCisJCSAgICBiZTMyX3RvX2NwdShzZHRbaV0ucmVmX3RhZykgIT0gZWlfbGJhKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSRUYgY2hlY2sgZmFpbGVkIG9uIHNlY3RvciAlbHVcbiIsCisJCQkgICAgICAgX19mdW5jX18sICh1bnNpZ25lZCBsb25nKXNlY3Rvcik7CisJCQlkaWZfZXJyb3JzKys7CisJCQlyZXR1cm4gMHgwMzsKKwkJfQorCisJCWVpX2xiYSsrOwogCX0KIAogCXJlc2lkID0gc2VjdG9ycyAqIDg7IC8qIEJ5dGVzIG9mIHByb3RlY3Rpb24gZGF0YSB0byBjb3B5IGludG8gc2dsICovCkBAIC0xNjcwLDcgKzE2OTgsOCBAQAogfQogCiBzdGF0aWMgaW50IHJlc3BfcmVhZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdW5zaWduZWQgbG9uZyBsb25nIGxiYSwKLQkJICAgICB1bnNpZ25lZCBpbnQgbnVtLCBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICpkZXZpcCkKKwkJICAgICB1bnNpZ25lZCBpbnQgbnVtLCBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICpkZXZpcCwKKwkJICAgICB1MzIgZWlfbGJhKQogewogCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwogCWludCByZXQ7CkBAIC0xNjk5LDcgKzE3MjgsNyBAQAogCiAJLyogRElYICsgVDEwIERJRiAqLwogCWlmIChzY3NpX2RlYnVnX2RpeCAmJiBzY3NpX3Byb3Rfc2dfY291bnQoU0NwbnQpKSB7Ci0JCWludCBwcm90X3JldCA9IHByb3RfdmVyaWZ5X3JlYWQoU0NwbnQsIGxiYSwgbnVtKTsKKwkJaW50IHByb3RfcmV0ID0gcHJvdF92ZXJpZnlfcmVhZChTQ3BudCwgbGJhLCBudW0sIGVpX2xiYSk7CiAKIAkJaWYgKHByb3RfcmV0KSB7CiAJCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIEFCT1JURURfQ09NTUFORCwgMHgxMCwgcHJvdF9yZXQpOwpAQCAtMTczNSw3ICsxNzY0LDcgQEAKIH0KIAogc3RhdGljIGludCBwcm90X3ZlcmlmeV93cml0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgc2VjdG9yX3Qgc3RhcnRfc2VjLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2VjdG9ycykKKwkJCSAgICAgdW5zaWduZWQgaW50IHNlY3RvcnMsIHUzMiBlaV9sYmEpCiB7CiAJaW50IGksIGosIHJldDsKIAlzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpzZHQ7CkBAIC0xNzQ5LDExICsxNzc4LDYgQEAKIAogCXNlY3RvciA9IGRvX2Rpdih0bXBfc2VjLCBzZGVidWdfc3RvcmVfc2VjdG9ycyk7CiAKLQlpZiAoKChTQ3BudC0+Y21uZFsxXSA+PiA1KSAmIDcpICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaV9kZWJ1ZzogV1JQUk9URUNUICE9IDFcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlCVUdfT04oc2NzaV9zZ19jb3VudChTQ3BudCkgPT0gMCk7CiAJQlVHX09OKHNjc2lfcHJvdF9zZ19jb3VudChTQ3BudCkgPT0gMCk7CiAKQEAgLTE4MDgsNyArMTgzMiw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCWlmIChzY3NpX2RlYnVnX2RpZiAhPSBTRF9ESUZfVFlQRTNfUFJPVEVDVElPTiAmJgorCQkJaWYgKHNjc2lfZGVidWdfZGlmID09IFNEX0RJRl9UWVBFMV9QUk9URUNUSU9OICYmCiAJCQkgICAgYmUzMl90b19jcHUoc2R0LT5yZWZfdGFnKQogCQkJICAgICE9IChzdGFydF9zZWMgJiAweGZmZmZmZmZmKSkgewogCQkJCXByaW50ayhLRVJOX0VSUgpAQCAtMTgxOSw2ICsxODQzLDE2IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKKwkJCWlmIChzY3NpX2RlYnVnX2RpZiA9PSBTRF9ESUZfVFlQRTJfUFJPVEVDVElPTiAmJgorCQkJICAgIGJlMzJfdG9fY3B1KHNkdC0+cmVmX3RhZykgIT0gZWlfbGJhKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogUkVGIGNoZWNrIGZhaWxlZCBvbiBzZWN0b3IgJWx1XG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpc2VjdG9yKTsKKwkJCQlyZXQgPSAweDAzOworCQkJCWR1bXBfc2VjdG9yKGRhZGRyLCBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwogCQkJLyogV291bGQgYmUgZ3JlYXQgdG8gY29weSB0aGlzIGluIGJpZ2dlcgogCQkJICogY2h1bmtzLiAgSG93ZXZlciwgZm9yIHRoZSBzYWtlIG9mCiAJCQkgKiBjb3JyZWN0bmVzcyB3ZSBuZWVkIHRvIHZlcmlmeSBlYWNoIHNlY3RvcgpAQCAtMTgzMiw2ICsxODY2LDcgQEAKIAkJCQlzZWN0b3IgPSAwOwkvKiBGb3JjZSB3cmFwICovCiAKIAkJCXN0YXJ0X3NlYysrOworCQkJZWlfbGJhKys7CiAJCQlkYWRkciArPSBzY3NpX2RlYnVnX3NlY3Rvcl9zaXplOwogCQkJcHBhZ2Vfb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3Qgc2RfZGlmX3R1cGxlKTsKIAkJfQpAQCAtMTg1Myw3ICsxODg4LDggQEAKIH0KIAogc3RhdGljIGludCByZXNwX3dyaXRlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBsb25nIGxvbmcgbGJhLAotCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtLCBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICpkZXZpcCkKKwkJICAgICAgdW5zaWduZWQgaW50IG51bSwgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqZGV2aXAsCisJCSAgICAgIHUzMiBlaV9sYmEpCiB7CiAJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CiAJaW50IHJldDsKQEAgLTE4NjQsNyArMTkwMCw3IEBACiAKIAkvKiBESVggKyBUMTAgRElGICovCiAJaWYgKHNjc2lfZGVidWdfZGl4ICYmIHNjc2lfcHJvdF9zZ19jb3VudChTQ3BudCkpIHsKLQkJaW50IHByb3RfcmV0ID0gcHJvdF92ZXJpZnlfd3JpdGUoU0NwbnQsIGxiYSwgbnVtKTsKKwkJaW50IHByb3RfcmV0ID0gcHJvdF92ZXJpZnlfd3JpdGUoU0NwbnQsIGxiYSwgbnVtLCBlaV9sYmEpOwogCiAJCWlmIChwcm90X3JldCkgewogCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsIDB4MTAsIHByb3RfcmV0KTsKQEAgLTI4NzIsMTEgKzI5MDgsMTIgQEAKIAogCWNhc2UgU0RfRElGX1RZUEUwX1BST1RFQ1RJT046CiAJY2FzZSBTRF9ESUZfVFlQRTFfUFJPVEVDVElPTjoKKwljYXNlIFNEX0RJRl9UWVBFMl9QUk9URUNUSU9OOgogCWNhc2UgU0RfRElGX1RZUEUzX1BST1RFQ1RJT046CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpX2RlYnVnX2luaXQ6IGRpZiBtdXN0IGJlIDAsIDEgb3IgM1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaV9kZWJ1Z19pbml0OiBkaWYgbXVzdCBiZSAwLCAxLCAyIG9yIDNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMxMjEsNiArMzE1OCw3IEBACiAJaW50IGxlbiwgazsKIAl1bnNpZ25lZCBpbnQgbnVtOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmE7CisJdTMyIGVpX2xiYTsKIAlpbnQgZXJyc3RzID0gMDsKIAlpbnQgdGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CiAJc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqZGV2aXAgPSBOVUxMOwpAQCAtMzI1NCwxNCArMzI5MiwzMCBAQAogCWNhc2UgUkVBRF8xNjoKIAljYXNlIFJFQURfMTI6CiAJY2FzZSBSRUFEXzEwOgorCQkvKiBSRUFEezEwLDEyLDE2fSBhbmQgRElGIFR5cGUgMiBhcmUgbmF0dXJhbCBlbmVtaWVzICovCisJCWlmIChzY3NpX2RlYnVnX2RpZiA9PSBTRF9ESUZfVFlQRTJfUFJPVEVDVElPTiAmJgorCQkgICAgY21kWzFdICYgMHhlMCkgeworCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsCisJCQkJCUlOVkFMSURfQ09NTUFORF9PUENPREUsIDApOworCQkJZXJyc3RzID0gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChzY3NpX2RlYnVnX2RpZiA9PSBTRF9ESUZfVFlQRTFfUFJPVEVDVElPTiB8fAorCQkgICAgIHNjc2lfZGVidWdfZGlmID09IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKSAmJgorCQkgICAgKGNtZFsxXSAmIDB4ZTApID09IDApCisJCQlwcmludGsoS0VSTl9FUlIgIlVucHJvdGVjdGVkIFJEL1dSIHRvIERJRiBkZXZpY2VcbiIpOworCisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgUkVBRF82OgorcmVhZDoKIAkJZXJyc3RzID0gY2hlY2tfcmVhZGluZXNzKFNDcG50LCAwLCBkZXZpcCk7CiAJCWlmIChlcnJzdHMpCiAJCQlicmVhazsKIAkJaWYgKHNjc2lfZGVidWdfZmFrZV9ydykKIAkJCWJyZWFrOwotCQlnZXRfZGF0YV90cmFuc2Zlcl9pbmZvKGNtZCwgJmxiYSwgJm51bSk7Ci0JCWVycnN0cyA9IHJlc3BfcmVhZChTQ3BudCwgbGJhLCBudW0sIGRldmlwKTsKKwkJZ2V0X2RhdGFfdHJhbnNmZXJfaW5mbyhjbWQsICZsYmEsICZudW0sICZlaV9sYmEpOworCQllcnJzdHMgPSByZXNwX3JlYWQoU0NwbnQsIGxiYSwgbnVtLCBkZXZpcCwgZWlfbGJhKTsKIAkJaWYgKGlual9yZWNvdmVyZWQgJiYgKDAgPT0gZXJyc3RzKSkgewogCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBSRUNPVkVSRURfRVJST1IsCiAJCQkJCVRIUkVTSE9MRF9FWENFRURFRCwgMCk7CkBAIC0zMjg4LDE0ICszMzQyLDMwIEBACiAJY2FzZSBXUklURV8xNjoKIAljYXNlIFdSSVRFXzEyOgogCWNhc2UgV1JJVEVfMTA6CisJCS8qIFdSSVRFezEwLDEyLDE2fSBhbmQgRElGIFR5cGUgMiBhcmUgbmF0dXJhbCBlbmVtaWVzICovCisJCWlmIChzY3NpX2RlYnVnX2RpZiA9PSBTRF9ESUZfVFlQRTJfUFJPVEVDVElPTiAmJgorCQkgICAgY21kWzFdICYgMHhlMCkgeworCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsCisJCQkJCUlOVkFMSURfQ09NTUFORF9PUENPREUsIDApOworCQkJZXJyc3RzID0gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChzY3NpX2RlYnVnX2RpZiA9PSBTRF9ESUZfVFlQRTFfUFJPVEVDVElPTiB8fAorCQkgICAgIHNjc2lfZGVidWdfZGlmID09IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKSAmJgorCQkgICAgKGNtZFsxXSAmIDB4ZTApID09IDApCisJCQlwcmludGsoS0VSTl9FUlIgIlVucHJvdGVjdGVkIFJEL1dSIHRvIERJRiBkZXZpY2VcbiIpOworCisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgV1JJVEVfNjoKK3dyaXRlOgogCQllcnJzdHMgPSBjaGVja19yZWFkaW5lc3MoU0NwbnQsIDAsIGRldmlwKTsKIAkJaWYgKGVycnN0cykKIAkJCWJyZWFrOwogCQlpZiAoc2NzaV9kZWJ1Z19mYWtlX3J3KQogCQkJYnJlYWs7Ci0JCWdldF9kYXRhX3RyYW5zZmVyX2luZm8oY21kLCAmbGJhLCAmbnVtKTsKLQkJZXJyc3RzID0gcmVzcF93cml0ZShTQ3BudCwgbGJhLCBudW0sIGRldmlwKTsKKwkJZ2V0X2RhdGFfdHJhbnNmZXJfaW5mbyhjbWQsICZsYmEsICZudW0sICZlaV9sYmEpOworCQllcnJzdHMgPSByZXNwX3dyaXRlKFNDcG50LCBsYmEsIG51bSwgZGV2aXAsIGVpX2xiYSk7CiAJCWlmIChpbmpfcmVjb3ZlcmVkICYmICgwID09IGVycnN0cykpIHsKIAkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgUkVDT1ZFUkVEX0VSUk9SLAogCQkJCQlUSFJFU0hPTERfRVhDRUVERUQsIDApOwpAQCAtMzM0MSwxNSArMzQxMSwzOCBAQAogCQkJYnJlYWs7CiAJCWlmIChzY3NpX2RlYnVnX2Zha2VfcncpCiAJCQlicmVhazsKLQkJZ2V0X2RhdGFfdHJhbnNmZXJfaW5mbyhjbWQsICZsYmEsICZudW0pOwotCQllcnJzdHMgPSByZXNwX3JlYWQoU0NwbnQsIGxiYSwgbnVtLCBkZXZpcCk7CisJCWdldF9kYXRhX3RyYW5zZmVyX2luZm8oY21kLCAmbGJhLCAmbnVtLCAmZWlfbGJhKTsKKwkJZXJyc3RzID0gcmVzcF9yZWFkKFNDcG50LCBsYmEsIG51bSwgZGV2aXAsIGVpX2xiYSk7CiAJCWlmIChlcnJzdHMpCiAJCQlicmVhazsKLQkJZXJyc3RzID0gcmVzcF93cml0ZShTQ3BudCwgbGJhLCBudW0sIGRldmlwKTsKKwkJZXJyc3RzID0gcmVzcF93cml0ZShTQ3BudCwgbGJhLCBudW0sIGRldmlwLCBlaV9sYmEpOwogCQlpZiAoZXJyc3RzKQogCQkJYnJlYWs7CiAJCWVycnN0cyA9IHJlc3BfeGR3cml0ZXJlYWQoU0NwbnQsIGxiYSwgbnVtLCBkZXZpcCk7CiAJCWJyZWFrOworCWNhc2UgVkFSSUFCTEVfTEVOR1RIX0NNRDoKKwkJaWYgKHNjc2lfZGVidWdfZGlmID09IFNEX0RJRl9UWVBFMl9QUk9URUNUSU9OKSB7CisKKwkJCWlmICgoY21kWzEwXSAmIDB4ZTApID09IDApCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJVbnByb3RlY3RlZCBSRC9XUiB0byBESUYgZGV2aWNlXG4iKTsKKworCQkJaWYgKGNtZFs5XSA9PSBSRUFEXzMyKSB7CisJCQkJQlVHX09OKFNDcG50LT5jbWRfbGVuIDwgMzIpOworCQkJCWdvdG8gcmVhZDsKKwkJCX0KKworCQkJaWYgKGNtZFs5XSA9PSBXUklURV8zMikgeworCQkJCUJVR19PTihTQ3BudC0+Y21kX2xlbiA8IDMyKTsKKwkJCQlnb3RvIHdyaXRlOworCQkJfQorCQl9CisKKwkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsCisJCQkJSU5WQUxJRF9GSUVMRF9JTl9DREIsIDApOworCQllcnJzdHMgPSBjaGVja19jb25kaXRpb25fcmVzdWx0OworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKIAkJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IE9wY29kZTogMHgleCBub3QgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKaW5kZXggODc3MjA0ZC4uMWIwMDYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCkBAIC03MjUsNiArNzI1LDkgQEAKIAkJY2FzZSBORUVEU19SRVRSWToKIAkJY2FzZSBGQUlMRUQ6CiAJCQlicmVhazsKKwkJY2FzZSBBRERfVE9fTUxRVUVVRToKKwkJCXJ0biA9IE5FRURTX1JFVFJZOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlydG4gPSBGQUlMRUQ7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCBjNDQ3ODM4Li4wNTQ3YTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC0zMTcsNiArMzE3LDcgQEAKIG91dF9kZXZpY2VfZGVzdHJveToKIAlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9ERUwpOwogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZGV2KTsKIAlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiBvdXQ6CiAJaWYgKGRpc3BsYXlfZmFpbHVyZV9tc2cpCkBAIC05NTcsNiArOTU4LDcgQEAKIAlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPnNsYXZlX2Rlc3Ryb3kpCiAJCXNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9kZXN0cm95KHNkZXYpOwogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZGV2KTsKIAlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IGZkZTU0NTMuLjVjN2ViNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtODY0LDEwICs4NjQsNiBAQAogCQlnb3RvIGNsZWFuX2RldmljZTsKIAl9CiAKLQkvKiB0YWtlIGEgcmVmZXJlbmNlIGZvciB0aGUgc2Rldl9kZXY7IHRoaXMgaXMKLQkgKiByZWxlYXNlZCBieSB0aGUgc2Rldl9jbGFzcyAucmVsZWFzZSAqLwotCWdldF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKLQogCS8qIGNyZWF0ZSBxdWV1ZSBmaWxlcywgd2hpY2ggbWF5IGJlIHdyaXRhYmxlLCBkZXBlbmRpbmcgb24gdGhlIGhvc3QgKi8KIAlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCkKIAkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPnNkZXZfZ2VuZGV2LCAmc2Rldl9hdHRyX3F1ZXVlX2RlcHRoX3J3KTsKQEAgLTkxNyw2ICs5MTMsNyBAQAogCiAJZGV2aWNlX2RlbCgmc2Rldi0+c2Rldl9nZW5kZXYpOwogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZGV2KTsKIAlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC0xMDY1LDcgKzEwNjIsNyBAQAogCQkgICAgIHNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4pOwogCiAJZGV2aWNlX2luaXRpYWxpemUoJnNkZXYtPnNkZXZfZGV2KTsKLQlzZGV2LT5zZGV2X2Rldi5wYXJlbnQgPSAmc2Rldi0+c2Rldl9nZW5kZXY7CisJc2Rldi0+c2Rldl9kZXYucGFyZW50ID0gZ2V0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwogCXNkZXYtPnNkZXZfZGV2LmNsYXNzID0gJnNkZXZfY2xhc3M7CiAJZGV2X3NldF9uYW1lKCZzZGV2LT5zZGV2X2RldiwgIiVkOiVkOiVkOiVkIiwKIAkJICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKaW5kZXggYjk4ODg1ZC4uYTY3ZmVkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMKQEAgLTM1ODYsNiArMzU4Niw3IEBACiAKIC8qKgogICogZmNfYnNnX2hvc3RfZGlzcGF0Y2ggLSBwcm9jZXNzIGZjIGhvc3QgYnNnIHJlcXVlc3RzIGFuZCBkaXNwYXRjaCB0byBMTERECisgKiBAcToJCWZjIGhvc3QgcmVxdWVzdCBxdWV1ZQogICogQHNob3N0OglzY3NpIGhvc3QgcnBvcnQgYXR0YWNoZWQgdG8KICAqIEBqb2I6CWJzZyBqb2IgdG8gYmUgcHJvY2Vzc2VkCiAgKi8KQEAgLTM2OTMsNiArMzY5NCw3IEBACiAKIC8qKgogICogZmNfYnNnX3Jwb3J0X2Rpc3BhdGNoIC0gcHJvY2VzcyBycG9ydCBic2cgcmVxdWVzdHMgYW5kIGRpc3BhdGNoIHRvIExMREQKKyAqIEBxOgkJcnBvcnQgcmVxdWVzdCBxdWV1ZQogICogQHNob3N0OglzY3NpIGhvc3QgcnBvcnQgYXR0YWNoZWQgdG8KICAqIEBycG9ydDoJcnBvcnQgcmVxdWVzdCBkZXN0aW5lZCB0bwogICogQGpvYjoJYnNnIGpvYiB0byBiZSBwcm9jZXNzZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKaW5kZXggOGRkOTZkYy4uOTA5M2M3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTExNiw2ICsxMTYsOSBAQAogICogb2JqZWN0IGFmdGVyIGxhc3QgcHV0KSAqLwogc3RhdGljIERFRklORV9NVVRFWChzZF9yZWZfbXV0ZXgpOwogCitzdHJ1Y3Qga21lbV9jYWNoZSAqc2RfY2RiX2NhY2hlOworbWVtcG9vbF90ICpzZF9jZGJfcG9vbDsKKwogc3RhdGljIGNvbnN0IGNoYXIgKnNkX2NhY2hlX3R5cGVzW10gPSB7CiAJIndyaXRlIHRocm91Z2giLCAibm9uZSIsICJ3cml0ZSBiYWNrIiwKIAkid3JpdGUgYmFjaywgbm8gcmVhZCAoZGFmdCkiCkBAIC0zNzAsNiArMzczLDMxIEBACiAJbXV0ZXhfdW5sb2NrKCZzZF9yZWZfbXV0ZXgpOwogfQogCitzdGF0aWMgdm9pZCBzZF9wcm90X29wKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIHVuc2lnbmVkIGludCBkaWYpCit7CisJdW5zaWduZWQgaW50IHByb3Rfb3AgPSBTQ1NJX1BST1RfTk9STUFMOworCXVuc2lnbmVkIGludCBkaXggPSBzY3NpX3Byb3Rfc2dfY291bnQoc2NtZCk7CisKKwlpZiAoc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCWlmIChkaWYgJiYgZGl4KQorCQkJcHJvdF9vcCA9IFNDU0lfUFJPVF9SRUFEX1BBU1M7CisJCWVsc2UgaWYgKGRpZiAmJiAhZGl4KQorCQkJcHJvdF9vcCA9IFNDU0lfUFJPVF9SRUFEX1NUUklQOworCQllbHNlIGlmICghZGlmICYmIGRpeCkKKwkJCXByb3Rfb3AgPSBTQ1NJX1BST1RfUkVBRF9JTlNFUlQ7CisJfSBlbHNlIHsKKwkJaWYgKGRpZiAmJiBkaXgpCisJCQlwcm90X29wID0gU0NTSV9QUk9UX1dSSVRFX1BBU1M7CisJCWVsc2UgaWYgKGRpZiAmJiAhZGl4KQorCQkJcHJvdF9vcCA9IFNDU0lfUFJPVF9XUklURV9JTlNFUlQ7CisJCWVsc2UgaWYgKCFkaWYgJiYgZGl4KQorCQkJcHJvdF9vcCA9IFNDU0lfUFJPVF9XUklURV9TVFJJUDsKKwl9CisKKwlzY3NpX3NldF9wcm90X29wKHNjbWQsIHByb3Rfb3ApOworCXNjc2lfc2V0X3Byb3RfdHlwZShzY21kLCBkaWYpOworfQorCiAvKioKICAqCXNkX2luaXRfY29tbWFuZCAtIGJ1aWxkIGEgc2NzaSAocmVhZCBvciB3cml0ZSkgY29tbWFuZCBmcm9tCiAgKglpbmZvcm1hdGlvbiBpbiB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUuCkBAIC0zODgsNiArNDE2LDcgQEAKIAlzZWN0b3JfdCB0aHJlc2hvbGQ7CiAJdW5zaWduZWQgaW50IHRoaXNfY291bnQgPSBibGtfcnFfc2VjdG9ycyhycSk7CiAJaW50IHJldCwgaG9zdF9kaWY7CisJdW5zaWduZWQgY2hhciBwcm90ZWN0OwogCiAJaWYgKHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9CTE9DS19QQykgewogCQlyZXQgPSBzY3NpX3NldHVwX2Jsa19wY19jbW5kKHNkcCwgcnEpOwpAQCAtNTIwLDEzICs1NDksNDkgQEAKIAkvKiBTZXQgUkRQUk9URUNUL1dSUFJPVEVDVCBpZiBkaXNrIGlzIGZvcm1hdHRlZCB3aXRoIERJRiAqLwogCWhvc3RfZGlmID0gc2NzaV9ob3N0X2RpZl9jYXBhYmxlKHNkcC0+aG9zdCwgc2RrcC0+cHJvdGVjdGlvbl90eXBlKTsKIAlpZiAoaG9zdF9kaWYpCi0JCVNDcG50LT5jbW5kWzFdID0gMSA8PCA1OworCQlwcm90ZWN0ID0gMSA8PCA1OwogCWVsc2UKLQkJU0NwbnQtPmNtbmRbMV0gPSAwOworCQlwcm90ZWN0ID0gMDsKIAotCWlmIChibG9jayA+IDB4ZmZmZmZmZmYpIHsKKwlpZiAoaG9zdF9kaWYgPT0gU0RfRElGX1RZUEUyX1BST1RFQ1RJT04pIHsKKwkJU0NwbnQtPmNtbmQgPSBtZW1wb29sX2FsbG9jKHNkX2NkYl9wb29sLCBHRlBfQVRPTUlDKTsKKworCQlpZiAodW5saWtlbHkoU0NwbnQtPmNtbmQgPT0gTlVMTCkpIHsKKwkJCXJldCA9IEJMS1BSRVBfREVGRVI7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCVNDcG50LT5jbWRfbGVuID0gU0RfRVhUX0NEQl9TSVpFOworCQltZW1zZXQoU0NwbnQtPmNtbmQsIDAsIFNDcG50LT5jbWRfbGVuKTsKKwkJU0NwbnQtPmNtbmRbMF0gPSBWQVJJQUJMRV9MRU5HVEhfQ01EOworCQlTQ3BudC0+Y21uZFs3XSA9IDB4MTg7CisJCVNDcG50LT5jbW5kWzldID0gKHJxX2RhdGFfZGlyKHJxKSA9PSBSRUFEKSA/IFJFQURfMzIgOiBXUklURV8zMjsKKwkJU0NwbnQtPmNtbmRbMTBdID0gcHJvdGVjdCB8IChibGtfZnVhX3JxKHJxKSA/IDB4OCA6IDApOworCisJCS8qIExCQSAqLworCQlTQ3BudC0+Y21uZFsxMl0gPSBzaXplb2YoYmxvY2spID4gNCA/ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gNTYpICYgMHhmZiA6IDA7CisJCVNDcG50LT5jbW5kWzEzXSA9IHNpemVvZihibG9jaykgPiA0ID8gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiA0OCkgJiAweGZmIDogMDsKKwkJU0NwbnQtPmNtbmRbMTRdID0gc2l6ZW9mKGJsb2NrKSA+IDQgPyAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDQwKSAmIDB4ZmYgOiAwOworCQlTQ3BudC0+Y21uZFsxNV0gPSBzaXplb2YoYmxvY2spID4gNCA/ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gMzIpICYgMHhmZiA6IDA7CisJCVNDcG50LT5jbW5kWzE2XSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gMjQpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbMTddID0gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiAxNikgJiAweGZmOworCQlTQ3BudC0+Y21uZFsxOF0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDgpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbMTldID0gKHVuc2lnbmVkIGNoYXIpIGJsb2NrICYgMHhmZjsKKworCQkvKiBFeHBlY3RlZCBJbmRpcmVjdCBMQkEgKi8KKwkJU0NwbnQtPmNtbmRbMjBdID0gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiAyNCkgJiAweGZmOworCQlTQ3BudC0+Y21uZFsyMV0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDE2KSAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzIyXSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gOCkgJiAweGZmOworCQlTQ3BudC0+Y21uZFsyM10gPSAodW5zaWduZWQgY2hhcikgYmxvY2sgJiAweGZmOworCisJCS8qIFRyYW5zZmVyIGxlbmd0aCAqLworCQlTQ3BudC0+Y21uZFsyOF0gPSAodW5zaWduZWQgY2hhcikgKHRoaXNfY291bnQgPj4gMjQpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbMjldID0gKHVuc2lnbmVkIGNoYXIpICh0aGlzX2NvdW50ID4+IDE2KSAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzMwXSA9ICh1bnNpZ25lZCBjaGFyKSAodGhpc19jb3VudCA+PiA4KSAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzMxXSA9ICh1bnNpZ25lZCBjaGFyKSB0aGlzX2NvdW50ICYgMHhmZjsKKwl9IGVsc2UgaWYgKGJsb2NrID4gMHhmZmZmZmZmZikgewogCQlTQ3BudC0+Y21uZFswXSArPSBSRUFEXzE2IC0gUkVBRF82OwotCQlTQ3BudC0+Y21uZFsxXSB8PSBibGtfZnVhX3JxKHJxKSA/IDB4OCA6IDA7CisJCVNDcG50LT5jbW5kWzFdID0gcHJvdGVjdCB8IChibGtfZnVhX3JxKHJxKSA/IDB4OCA6IDApOwogCQlTQ3BudC0+Y21uZFsyXSA9IHNpemVvZihibG9jaykgPiA0ID8gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiA1NikgJiAweGZmIDogMDsKIAkJU0NwbnQtPmNtbmRbM10gPSBzaXplb2YoYmxvY2spID4gNCA/ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gNDgpICYgMHhmZiA6IDA7CiAJCVNDcG50LT5jbW5kWzRdID0gc2l6ZW9mKGJsb2NrKSA+IDQgPyAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDQwKSAmIDB4ZmYgOiAwOwpAQCAtNTQ3LDcgKzYxMiw3IEBACiAJCQl0aGlzX2NvdW50ID0gMHhmZmZmOwogCiAJCVNDcG50LT5jbW5kWzBdICs9IFJFQURfMTAgLSBSRUFEXzY7Ci0JCVNDcG50LT5jbW5kWzFdIHw9IGJsa19mdWFfcnEocnEpID8gMHg4IDogMDsKKwkJU0NwbnQtPmNtbmRbMV0gPSBwcm90ZWN0IHwgKGJsa19mdWFfcnEocnEpID8gMHg4IDogMCk7CiAJCVNDcG50LT5jbW5kWzJdID0gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiAyNCkgJiAweGZmOwogCQlTQ3BudC0+Y21uZFszXSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gMTYpICYgMHhmZjsKIAkJU0NwbnQtPmNtbmRbNF0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDgpICYgMHhmZjsKQEAgLTU3OCw4ICs2NDMsNyBAQAogCiAJLyogSWYgRElGIG9yIERJWCBpcyBlbmFibGVkLCB0ZWxsIEhCQSBob3cgdG8gaGFuZGxlIHJlcXVlc3QgKi8KIAlpZiAoaG9zdF9kaWYgfHwgc2NzaV9wcm90X3NnX2NvdW50KFNDcG50KSkKLQkJc2RfZGlmX29wKFNDcG50LCBob3N0X2RpZiwgc2NzaV9wcm90X3NnX2NvdW50KFNDcG50KSwKLQkJCSAgc2RrcC0+cHJvdGVjdGlvbl90eXBlKTsKKwkJc2RfcHJvdF9vcChTQ3BudCwgaG9zdF9kaWYpOwogCiAJLyoKIAkgKiBXZSBzaG91bGRuJ3QgZGlzY29ubmVjdCBpbiB0aGUgbWlkZGxlIG9mIGEgc2VjdG9yLCBzbyB3aXRoIGEgZHVtYgpAQCAtMTAyMyw2ICsxMDg3LDcgQEAKIAlpbnQgcmVzdWx0ID0gU0NwbnQtPnJlc3VsdDsKIAl1bnNpZ25lZCBpbnQgZ29vZF9ieXRlcyA9IHJlc3VsdCA/IDAgOiBzY3NpX2J1ZmZsZW4oU0NwbnQpOwogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gc2NzaV9kaXNrKFNDcG50LT5yZXF1ZXN0LT5ycV9kaXNrKTsKIAlpbnQgc2Vuc2VfdmFsaWQgPSAwOwogCWludCBzZW5zZV9kZWZlcnJlZCA9IDA7CiAKQEAgLTEwODQsNiArMTE0OSwxMCBAQAogCWlmIChycV9kYXRhX2RpcihTQ3BudC0+cmVxdWVzdCkgPT0gUkVBRCAmJiBzY3NpX3Byb3Rfc2dfY291bnQoU0NwbnQpKQogCQlzZF9kaWZfY29tcGxldGUoU0NwbnQsIGdvb2RfYnl0ZXMpOwogCisJaWYgKHNjc2lfaG9zdF9kaWZfY2FwYWJsZShzZGtwLT5kZXZpY2UtPmhvc3QsIHNka3AtPnByb3RlY3Rpb25fdHlwZSkKKwkgICAgPT0gU0RfRElGX1RZUEUyX1BST1RFQ1RJT04gJiYgU0NwbnQtPmNtbmQgIT0gU0NwbnQtPnJlcXVlc3QtPmNtZCkKKwkJbWVtcG9vbF9mcmVlKFNDcG50LT5jbW5kLCBzZF9jZGJfcG9vbCk7CisKIAlyZXR1cm4gZ29vZF9ieXRlczsKIH0KIApAQCAtMTIzOCwzNCArMTMwNywyOCBAQAogCXU4IHR5cGU7CiAKIAlpZiAoc2NzaV9kZXZpY2VfcHJvdGVjdGlvbihzZHApID09IDAgfHwgKGJ1ZmZlclsxMl0gJiAxKSA9PSAwKQotCQl0eXBlID0gMDsKLQllbHNlCi0JCXR5cGUgPSAoKGJ1ZmZlclsxMl0gPj4gMSkgJiA3KSArIDE7IC8qIFBfVFlQRSAwID0gVHlwZSAxICovCisJCXJldHVybjsKKworCXR5cGUgPSAoKGJ1ZmZlclsxMl0gPj4gMSkgJiA3KSArIDE7IC8qIFBfVFlQRSAwID0gVHlwZSAxICovCisKKwlpZiAodHlwZSA9PSBzZGtwLT5wcm90ZWN0aW9uX3R5cGUgfHwgIXNka3AtPmZpcnN0X3NjYW4pCisJCXJldHVybjsKIAogCXNka3AtPnByb3RlY3Rpb25fdHlwZSA9IHR5cGU7CiAKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFNEX0RJRl9UWVBFMF9QUk9URUNUSU9OOgotCWNhc2UgU0RfRElGX1RZUEUxX1BST1RFQ1RJT046Ci0JY2FzZSBTRF9ESUZfVFlQRTNfUFJPVEVDVElPTjoKLQkJYnJlYWs7Ci0KLQljYXNlIFNEX0RJRl9UWVBFMl9QUk9URUNUSU9OOgotCQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICJmb3JtYXR0ZWQgd2l0aCBESUYgVHlwZSAyICIJXAotCQkJICAicHJvdGVjdGlvbiB3aGljaCBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuICIJXAotCQkJICAiRGlzYWJsaW5nIGRpc2shXG4iKTsKLQkJZ290byBkaXNhYmxlOwotCi0JZGVmYXVsdDoKLQkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiZm9ybWF0dGVkIHdpdGggdW5rbm93biAiCVwKLQkJCSAgInByb3RlY3Rpb24gdHlwZSAlZC4gRGlzYWJsaW5nIGRpc2shXG4iLCB0eXBlKTsKLQkJZ290byBkaXNhYmxlOworCWlmICh0eXBlID4gU0RfRElGX1RZUEUzX1BST1RFQ1RJT04pIHsKKwkJc2RfcHJpbnRrKEtFUk5fRVJSLCBzZGtwLCAiZm9ybWF0dGVkIHdpdGggdW5zdXBwb3J0ZWQgIglcCisJCQkgICJwcm90ZWN0aW9uIHR5cGUgJXUuIERpc2FibGluZyBkaXNrIVxuIiwgdHlwZSk7CisJCXNka3AtPmNhcGFjaXR5ID0gMDsKKwkJcmV0dXJuOwogCX0KIAotCXJldHVybjsKLQotZGlzYWJsZToKLQlzZGtwLT5jYXBhY2l0eSA9IDA7CisJaWYgKHNjc2lfaG9zdF9kaWZfY2FwYWJsZShzZHAtPmhvc3QsIHR5cGUpKQorCQlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsCisJCQkgICJFbmFibGluZyBESUYgVHlwZSAldSBwcm90ZWN0aW9uXG4iLCB0eXBlKTsKKwllbHNlCisJCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwKKwkJCSAgIkRpc2FibGluZyBESUYgVHlwZSAldSBwcm90ZWN0aW9uXG4iLCB0eXBlKTsKIH0KIAogc3RhdGljIHZvaWQgcmVhZF9jYXBhY2l0eV9lcnJvcihzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCwKQEAgLTIzMDAsOCArMjM2MywyNCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dF9jbGFzczsKIAorCXNkX2NkYl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzZF9leHRfY2RiIiwgU0RfRVhUX0NEQl9TSVpFLAorCQkJCQkgMCwgMCwgTlVMTCk7CisJaWYgKCFzZF9jZGJfY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzZDogY2FuJ3QgaW5pdCBleHRlbmRlZCBjZGIgY2FjaGVcbiIpOworCQlnb3RvIGVycl9vdXRfY2xhc3M7CisJfQorCisJc2RfY2RiX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woU0RfTUVNUE9PTF9TSVpFLCBzZF9jZGJfY2FjaGUpOworCWlmICghc2RfY2RiX3Bvb2wpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzZDogY2FuJ3QgaW5pdCBleHRlbmRlZCBjZGIgcG9vbFxuIik7CisJCWdvdG8gZXJyX291dF9jYWNoZTsKKwl9CisKIAlyZXR1cm4gMDsKIAorZXJyX291dF9jYWNoZToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koc2RfY2RiX2NhY2hlKTsKKwogZXJyX291dF9jbGFzczoKIAljbGFzc191bnJlZ2lzdGVyKCZzZF9kaXNrX2NsYXNzKTsKIGVycl9vdXQ6CkBAIC0yMzIxLDYgKzI0MDAsOSBAQAogCiAJU0NTSV9MT0dfSExRVUVVRSgzLCBwcmludGsoImV4aXRfc2Q6IGV4aXRpbmcgc2QgZHJpdmVyXG4iKSk7CiAKKwltZW1wb29sX2Rlc3Ryb3koc2RfY2RiX3Bvb2wpOworCWttZW1fY2FjaGVfZGVzdHJveShzZF9jZGJfY2FjaGUpOworCiAJc2NzaV91bnJlZ2lzdGVyX2RyaXZlcigmc2RfdGVtcGxhdGUuZ2VuZHJ2KTsKIAljbGFzc191bnJlZ2lzdGVyKCZzZF9kaXNrX2NsYXNzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmggYi9kcml2ZXJzL3Njc2kvc2QuaAppbmRleCA4NDc0YjViLi5lMzc0ODA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuaAorKysgYi9kcml2ZXJzL3Njc2kvc2QuaApAQCAtMzcsNiArMzcsMTEgQEAKICAqLwogI2RlZmluZSBTRF9MQVNUX0JVR0dZX1NFQ1RPUlMJOAogCitlbnVtIHsKKwlTRF9FWFRfQ0RCX1NJWkUgPSAzMiwJLyogRXh0ZW5kZWQgQ0RCIHNpemUgKi8KKwlTRF9NRU1QT09MX1NJWkUgPSAyLAkvKiBDREIgcG9vbCBzaXplICovCit9OworCiBzdHJ1Y3Qgc2NzaV9kaXNrIHsKIAlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRyaXZlcjsJLyogYWx3YXlzICZzZF90ZW1wbGF0ZSAqLwogCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlOwpAQCAtMTAxLDE2ICsxMDYsMTIgQEAKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOVEVHUklUWQogCi1leHRlcm4gdm9pZCBzZF9kaWZfb3Aoc3RydWN0IHNjc2lfY21uZCAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIHNkX2RpZl9jb25maWdfaG9zdChzdHJ1Y3Qgc2NzaV9kaXNrICopOwogZXh0ZXJuIGludCBzZF9kaWZfcHJlcGFyZShzdHJ1Y3QgcmVxdWVzdCAqcnEsIHNlY3Rvcl90LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgc2RfZGlmX2NvbXBsZXRlKHN0cnVjdCBzY3NpX2NtbmQgKiwgdW5zaWduZWQgaW50KTsKIAogI2Vsc2UgLyogQ09ORklHX0JMS19ERVZfSU5URUdSSVRZICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZF9kaWZfb3Aoc3RydWN0IHNjc2lfY21uZCAqY21kLCB1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGIsIHVuc2lnbmVkIGludCBjKQotewotfQogc3RhdGljIGlubGluZSB2b2lkIHNkX2RpZl9jb25maWdfaG9zdChzdHJ1Y3Qgc2NzaV9kaXNrICpkaXNrKQogewogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkX2RpZi5jIGIvZHJpdmVycy9zY3NpL3NkX2RpZi5jCmluZGV4IDgyZjE0YTkuLjg4ZGE5NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZF9kaWYuYworKysgYi9kcml2ZXJzL3Njc2kvc2RfZGlmLmMKQEAgLTMyMCwxNSArMzIwLDYgQEAKIAkJZGlmID0gMDsgZGl4ID0gMTsKIAl9CiAKLQlpZiAodHlwZSkgewotCQlpZiAoZGlmKQotCQkJc2RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLAotCQkJCSAgIkVuYWJsaW5nIERJRiBUeXBlICVkIHByb3RlY3Rpb25cbiIsIHR5cGUpOwotCQllbHNlCi0JCQlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsCi0JCQkJICAiRGlzYWJsaW5nIERJRiBUeXBlICVkIHByb3RlY3Rpb25cbiIsIHR5cGUpOwotCX0KLQogCWlmICghZGl4KQogCQlyZXR1cm47CiAKQEAgLTM2MCw2MiArMzUxLDYgQEAKIH0KIAogLyoKLSAqIERJRiBETUEgb3BlcmF0aW9uIG1hZ2ljIGRlY29kZXIgcmluZy4KLSAqLwotdm9pZCBzZF9kaWZfb3Aoc3RydWN0IHNjc2lfY21uZCAqc2NtZCwgdW5zaWduZWQgaW50IGRpZiwgdW5zaWduZWQgaW50IGRpeCwgdW5zaWduZWQgaW50IHR5cGUpCi17Ci0JaW50IGNzdW1fY29udmVydCwgcHJvdF9vcDsKLQotCXByb3Rfb3AgPSAwOwotCi0JLyogQ29udmVydCBjaGVja3N1bT8gKi8KLQlpZiAoc2NzaV9ob3N0X2dldF9ndWFyZChzY21kLT5kZXZpY2UtPmhvc3QpICE9IFNIT1NUX0RJWF9HVUFSRF9DUkMpCi0JCWNzdW1fY29udmVydCA9IDE7Ci0JZWxzZQotCQljc3VtX2NvbnZlcnQgPSAwOwotCi0JQlVHX09OKGRpZiAmJiAoc2NtZC0+Y21uZFswXSA9PSBSRUFEXzYgfHwgc2NtZC0+Y21uZFswXSA9PSBXUklURV82KSk7Ci0KLQlzd2l0Y2ggKHNjbWQtPmNtbmRbMF0pIHsKLQljYXNlIFJFQURfNjoKLQljYXNlIFJFQURfMTA6Ci0JY2FzZSBSRUFEXzEyOgotCWNhc2UgUkVBRF8xNjoKLQkJaWYgKGRpZiAmJiBkaXgpCi0JCQlpZiAoY3N1bV9jb252ZXJ0KQotCQkJCXByb3Rfb3AgPSBTQ1NJX1BST1RfUkVBRF9DT05WRVJUOwotCQkJZWxzZQotCQkJCXByb3Rfb3AgPSBTQ1NJX1BST1RfUkVBRF9QQVNTOwotCQllbHNlIGlmIChkaWYgJiYgIWRpeCkKLQkJCXByb3Rfb3AgPSBTQ1NJX1BST1RfUkVBRF9TVFJJUDsKLQkJZWxzZSBpZiAoIWRpZiAmJiBkaXgpCi0JCQlwcm90X29wID0gU0NTSV9QUk9UX1JFQURfSU5TRVJUOwotCi0JCWJyZWFrOwotCi0JY2FzZSBXUklURV82OgotCWNhc2UgV1JJVEVfMTA6Ci0JY2FzZSBXUklURV8xMjoKLQljYXNlIFdSSVRFXzE2OgotCQlpZiAoZGlmICYmIGRpeCkKLQkJCWlmIChjc3VtX2NvbnZlcnQpCi0JCQkJcHJvdF9vcCA9IFNDU0lfUFJPVF9XUklURV9DT05WRVJUOwotCQkJZWxzZQotCQkJCXByb3Rfb3AgPSBTQ1NJX1BST1RfV1JJVEVfUEFTUzsKLQkJZWxzZSBpZiAoZGlmICYmICFkaXgpCi0JCQlwcm90X29wID0gU0NTSV9QUk9UX1dSSVRFX0lOU0VSVDsKLQkJZWxzZSBpZiAoIWRpZiAmJiBkaXgpCi0JCQlwcm90X29wID0gU0NTSV9QUk9UX1dSSVRFX1NUUklQOwotCi0JCWJyZWFrOwotCX0KLQotCXNjc2lfc2V0X3Byb3Rfb3Aoc2NtZCwgcHJvdF9vcCk7Ci0JaWYgKGRpZikKLQkJc2NzaV9zZXRfcHJvdF90eXBlKHNjbWQsIHR5cGUpOwotfQotCi0vKgogICogVGhlIHZpcnR1YWwgc3RhcnQgc2VjdG9yIGlzIHRoZSBvbmUgdGhhdCB3YXMgb3JpZ2luYWxseSBzdWJtaXR0ZWQKICAqIGJ5IHRoZSBibG9jayBsYXllci4JRHVlIHRvIHBhcnRpdGlvbmluZywgTUQvRE0gY2xvbmluZywgZXRjLiB0aGUKICAqIGFjdHVhbCBwaHlzaWNhbCBzdGFydCBzZWN0b3IgaXMgbGlrZWx5IHRvIGJlIGRpZmZlcmVudC4gIFJlbWFwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2cuYyBiL2RyaXZlcnMvc2NzaS9zZy5jCmluZGV4IDg0OGI1OTQuLjA0MGY3NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZy5jCkBAIC0xMTg1LDcgKzExODUsNyBAQAogCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc2dfbW1hcF92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNnX21tYXBfdm1fb3BzID0gewogCS5mYXVsdCA9IHNnX3ZtYV9mYXVsdCwKIH07CiAKQEAgLTEzMTcsNyArMTMxNyw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZ19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2dfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkucmVhZCA9IHNnX3JlYWQsCiAJLndyaXRlID0gc2dfd3JpdGUsCkBAIC0xNzA4LDExICsxNzA4LDYgQEAKIAlTZ19zY2F0dGVyX2hvbGQgKnJlcV9zY2hwID0gJnNycC0+ZGF0YTsKIAogCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19maW5pc2hfcmVtX3JlcTogcmVzX3VzZWQ9JWRcbiIsIChpbnQpIHNycC0+cmVzX3VzZWQpKTsKLQlpZiAoc3JwLT5yZXNfdXNlZCkKLQkJc2dfdW5saW5rX3Jlc2VydmUoc2ZwLCBzcnApOwotCWVsc2UKLQkJc2dfcmVtb3ZlX3NjYXQocmVxX3NjaHApOwotCiAJaWYgKHNycC0+cnEpIHsKIAkJaWYgKHNycC0+YmlvKQogCQkJcmV0ID0gYmxrX3JxX3VubWFwX3VzZXIoc3JwLT5iaW8pOwpAQCAtMTcyMCw2ICsxNzE1LDExIEBACiAJCWJsa19wdXRfcmVxdWVzdChzcnAtPnJxKTsKIAl9CiAKKwlpZiAoc3JwLT5yZXNfdXNlZCkKKwkJc2dfdW5saW5rX3Jlc2VydmUoc2ZwLCBzcnApOworCWVsc2UKKwkJc2dfcmVtb3ZlX3NjYXQocmVxX3NjaHApOworCiAJc2dfcmVtb3ZlX3JlcXVlc3Qoc2ZwLCBzcnApOwogCiAJcmV0dXJuIHJldDsKQEAgLTIxOTQsOSArMjE5NCwxMSBAQAogc3RhdGljIGludCBzZ19wcm9jX3NpbmdsZV9vcGVuX2FkaW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHNzaXplX3Qgc2dfcHJvY193cml0ZV9hZGlvKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkJICAgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWRpb19mb3BzID0gewotCS8qIC5vd25lciwgLnJlYWQgYW5kIC5sbHNlZWsgYWRkZWQgaW4gc2dfcHJvY19pbml0KCkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkaW9fZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHNnX3Byb2Nfc2luZ2xlX29wZW5fYWRpbywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCiAJLndyaXRlID0gc2dfcHJvY193cml0ZV9hZGlvLAogCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwpAQCAtMjIwNCwyMyArMjIwNiwzMiBAQAogc3RhdGljIGludCBzZ19wcm9jX3NpbmdsZV9vcGVuX2RyZXNzeihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3NpemVfdCBzZ19wcm9jX3dyaXRlX2RyZXNzeihzdHJ1Y3QgZmlsZSAqZmlscCwgCiAJCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHJlc3N6X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkcmVzc3pfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHNnX3Byb2Nfc2luZ2xlX29wZW5fZHJlc3N6LAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKIAkud3JpdGUgPSBzZ19wcm9jX3dyaXRlX2RyZXNzeiwKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X3ZlcnNpb24oc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KTsKIHN0YXRpYyBpbnQgc2dfcHJvY19zaW5nbGVfb3Blbl92ZXJzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZlcnNpb25fZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZlcnNpb25fZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHNnX3Byb2Nfc2luZ2xlX29wZW5fdmVyc2lvbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19kZXZoZHIoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KTsKIHN0YXRpYyBpbnQgc2dfcHJvY19zaW5nbGVfb3Blbl9kZXZoZHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2aGRyX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZoZHJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHNnX3Byb2Nfc2luZ2xlX29wZW5fZGV2aGRyLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIApAQCAtMjIyOSw4ICsyMjQwLDExIEBACiBzdGF0aWMgdm9pZCAqIGRldl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcyk7CiBzdGF0aWMgdm9pZCAqIGRldl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKTsKIHN0YXRpYyB2b2lkIGRldl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpOwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHNnX3Byb2Nfb3Blbl9kZXYsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZXZfc2VxX29wcyA9IHsKQEAgLTIyNDIsOCArMjI1NiwxMSBAQAogCiBzdGF0aWMgaW50IHNnX3Byb2Nfc2VxX3Nob3dfZGV2c3RycyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpOwogc3RhdGljIGludCBzZ19wcm9jX29wZW5fZGV2c3RycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZzdHJzX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZzdHJzX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm9wZW4gPSBzZ19wcm9jX29wZW5fZGV2c3RycywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRldnN0cnNfc2VxX29wcyA9IHsKQEAgLTIyNTUsOCArMjI3MiwxMSBAQAogCiBzdGF0aWMgaW50IHNnX3Byb2Nfc2VxX3Nob3dfZGVidWcoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KTsKIHN0YXRpYyBpbnQgc2dfcHJvY19vcGVuX2RlYnVnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5vcGVuID0gc2dfcHJvY19vcGVuX2RlYnVnLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGVidWdfc2VxX29wcyA9IHsKQEAgLTIyNjksNyArMjI4OSw3IEBACiAKIHN0cnVjdCBzZ19wcm9jX2xlYWYgewogCWNvbnN0IGNoYXIgKiBuYW1lOwotCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKiBmb3BzOworCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKiBmb3BzOwogfTsKIAogc3RhdGljIHN0cnVjdCBzZ19wcm9jX2xlYWYgc2dfcHJvY19sZWFmX2FycltdID0gewpAQCAtMjI5NSw5ICsyMzE1LDYgQEAKIAlmb3IgKGsgPSAwOyBrIDwgbnVtX2xlYXZlczsgKytrKSB7CiAJCWxlYWYgPSAmc2dfcHJvY19sZWFmX2FycltrXTsKIAkJbWFzayA9IGxlYWYtPmZvcHMtPndyaXRlID8gU19JUlVHTyB8IFNfSVdVU1IgOiBTX0lSVUdPOwotCQlsZWFmLT5mb3BzLT5vd25lciA9IFRISVNfTU9EVUxFOwotCQlsZWFmLT5mb3BzLT5yZWFkID0gc2VxX3JlYWQ7Ci0JCWxlYWYtPmZvcHMtPmxsc2VlayA9IHNlcV9sc2VlazsKIAkJcHJvY19jcmVhdGUobGVhZi0+bmFtZSwgbWFzaywgc2dfcHJvY19zZ3AsIGxlYWYtPmZvcHMpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zci5jIGIvZHJpdmVycy9zY3NpL3NyLmMKaW5kZXggZWI2MWY3YS4uZDZmMzQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NyLmMKKysrIGIvZHJpdmVycy9zY3NpL3NyLmMKQEAgLTY4NCwxNCArNjg0LDIwIEBACiAJCWNkLT5jYXBhY2l0eSA9IDB4MWZmZmZmOwogCQlzZWN0b3Jfc2l6ZSA9IDIwNDg7CS8qIEEgZ3Vlc3MsIGp1c3QgaW4gY2FzZSAqLwogCX0gZWxzZSB7Ci0jaWYgMAotCQlpZiAoY2Ryb21fZ2V0X2xhc3Rfd3JpdHRlbigmY2QtPmNkaSwKLQkJCQkJICAgJmNkLT5jYXBhY2l0eSkpCi0jZW5kaWYKLQkJCWNkLT5jYXBhY2l0eSA9IDEgKyAoKGJ1ZmZlclswXSA8PCAyNCkgfAotCQkJCQkJICAgIChidWZmZXJbMV0gPDwgMTYpIHwKLQkJCQkJCSAgICAoYnVmZmVyWzJdIDw8IDgpIHwKLQkJCQkJCSAgICBidWZmZXJbM10pOworCQlsb25nIGxhc3Rfd3JpdHRlbjsKKworCQljZC0+Y2FwYWNpdHkgPSAxICsgKChidWZmZXJbMF0gPDwgMjQpIHwgKGJ1ZmZlclsxXSA8PCAxNikgfAorCQkJCSAgICAoYnVmZmVyWzJdIDw8IDgpIHwgYnVmZmVyWzNdKTsKKwkJLyoKKwkJICogUkVBRF9DQVBBQ0lUWSBkb2Vzbid0IHJldHVybiB0aGUgY29ycmVjdCBzaXplIG9uCisJCSAqIGNlcnRhaW4gVURGIG1lZGlhLiAgSWYgbGFzdF93cml0dGVuIGlzIGxhcmdlciwgdXNlCisJCSAqIGl0IGluc3RlYWQuCisJCSAqCisJCSAqIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD05NjY4CisJCSAqLworCQlpZiAoIWNkcm9tX2dldF9sYXN0X3dyaXR0ZW4oJmNkLT5jZGksICZsYXN0X3dyaXR0ZW4pKQorCQkJY2QtPmNhcGFjaXR5ID0gbWF4X3QobG9uZywgY2QtPmNhcGFjaXR5LCBsYXN0X3dyaXR0ZW4pOworCiAJCXNlY3Rvcl9zaXplID0gKGJ1ZmZlcls0XSA8PCAyNCkgfAogCQkgICAgKGJ1ZmZlcls1XSA8PCAxNikgfCAoYnVmZmVyWzZdIDw8IDgpIHwgYnVmZmVyWzddOwogCQlzd2l0Y2ggKHNlY3Rvcl9zaXplKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IGIzM2QwNDIuLjEyZDU4YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0yODU5LDExICsyODU5LDggQEAKIAkJCWlvY3RsX3Jlc3VsdCA9IHN0X2ludF9pb2N0bChTVHAsIE1UQlNGLCAxKTsKIAogCQlpZiAoY21kX2luID09IE1UU0VUQkxLIHx8IGNtZF9pbiA9PSBTRVRfREVOU19BTkRfQkxLKSB7Ci0JCQlpbnQgb2xkX2Jsb2NrX3NpemUgPSBTVHAtPmJsb2NrX3NpemU7CiAJCQlTVHAtPmJsb2NrX3NpemUgPSBhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0s7CiAJCQlpZiAoU1RwLT5ibG9ja19zaXplICE9IDApIHsKLQkJCQlpZiAob2xkX2Jsb2NrX3NpemUgPT0gMCkKLQkJCQkJbm9ybWFsaXplX2J1ZmZlcihTVHAtPmJ1ZmZlcik7CiAJCQkJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2Jsb2NrcyA9CiAJCQkJICAgIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9zaXplIC8gU1RwLT5ibG9ja19zaXplOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCmluZGV4IDIyMDk2MjAuLmIxYWU3NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTY0LDYgKzY0LDggQEAKIAlyZXR1cm4gKHNlcmlhbDgyNTBfcmVnLm1pbm9yIC0gNjQpICsgcG9ydC0+bGluZTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBza2lwX3R4ZW5fdGVzdDsgLyogZm9yY2Ugc2tpcCBvZiB0eGVuIHRlc3QgYXQgaW5pdCB0aW1lICovCisKIC8qCiAgKiBEZWJ1Z2dpbmcuCiAgKi8KQEAgLTIxMDgsNyArMjExMCw3IEBACiAJICAgaXMgdmFyaWFibGUuIFNvLCBsZXQncyBqdXN0IGRvbid0IHRlc3QgaWYgd2UgcmVjZWl2ZQogCSAgIFRYIGlycS4gVGhpcyB3YXksIHdlJ2xsIG5ldmVyIGVuYWJsZSBVQVJUX0JVR19UWEVOLgogCSAqLwotCWlmICh1cC0+cG9ydC5mbGFncyAmIFVQRl9OT19UWEVOX1RFU1QpCisJaWYgKHNraXBfdHhlbl90ZXN0IHx8IHVwLT5wb3J0LmZsYWdzICYgVVBGX05PX1RYRU5fVEVTVCkKIAkJZ290byBkb250X3Rlc3RfdHhfZW47CiAKIAkvKgpAQCAtMzI0OCw2ICszMjUwLDkgQEAKIG1vZHVsZV9wYXJhbShucl91YXJ0cywgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5yX3VhcnRzLCAiTWF4aW11bSBudW1iZXIgb2YgVUFSVHMgc3VwcG9ydGVkLiAoMS0iIF9fTU9EVUxFX1NUUklORyhDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFMpICIpIik7CiAKK21vZHVsZV9wYXJhbShza2lwX3R4ZW5fdGVzdCwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHNraXBfdHhlbl90ZXN0LCAiU2tpcCBjaGVja2luZyBmb3IgdGhlIFRYRU4gYnVnIGF0IGluaXQgdGltZSIpOworCiAjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX1JTQQogbW9kdWxlX3BhcmFtX2FycmF5KHByb2JlX3JzYSwgdWxvbmcsICZwcm9iZV9yc2FfY291bnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwcm9iZV9yc2EsICJQcm9iZSBJL08gcG9ydHMgZm9yIFJTQSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMKaW5kZXggZTcxMDhlNy4uNDJlODU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCkBAIC0xNTYxLDExICsxNTYxLDE2IEBACiAJcGJuX2V4YXJfWFIxN0MxNTIsCiAJcGJuX2V4YXJfWFIxN0MxNTQsCiAJcGJuX2V4YXJfWFIxN0MxNTgsCisJcGJuX2V4YXJfaWJtX3NhdHVybiwKIAlwYm5fcGFzZW1pXzE2ODJNLAogCXBibl9uaTg0MzBfMiwKIAlwYm5fbmk4NDMwXzQsCiAJcGJuX25pODQzMF84LAogCXBibl9uaTg0MzBfMTYsCisJcGJuX0FERElEQVRBX1BDSWVfMV8zOTA2MjUwLAorCXBibl9BRERJREFUQV9QQ0llXzJfMzkwNjI1MCwKKwlwYm5fQURESURBVEFfUENJZV80XzM5MDYyNTAsCisJcGJuX0FERElEQVRBX1BDSWVfOF8zOTA2MjUwLAogfTsKIAogLyoKQEAgLTIxNDYsNiArMjE1MSwxMyBAQAogCQkuYmFzZV9iYXVkCT0gOTIxNjAwLAogCQkudWFydF9vZmZzZXQJPSAweDIwMCwKIAl9LAorCVtwYm5fZXhhcl9pYm1fc2F0dXJuXSA9IHsKKwkJLmZsYWdzCQk9IEZMX0JBU0UwLAorCQkubnVtX3BvcnRzCT0gMSwKKwkJLmJhc2VfYmF1ZAk9IDkyMTYwMCwKKwkJLnVhcnRfb2Zmc2V0CT0gMHgyMDAsCisJfSwKKwogCS8qCiAJICogUEEgU2VtaSBQV1JmaWNpZW50IFBBNlQtMTY4Mk0gb24tY2hpcCBVQVJUCiAJICovCkBAIC0yMTg1LDYgKzIxOTcsMzcgQEAKIAkJLnVhcnRfb2Zmc2V0CT0gMHgxMCwKIAkJLmZpcnN0X29mZnNldAk9IDB4ODAwLAogCX0sCisJLyoKKwkgKiBBRERJLURBVEEgR21iSCBQQ0ktRXhwcmVzcyBjb21tdW5pY2F0aW9uIGNhcmRzIDxpbmZvQGFkZGktZGF0YS5jb20+CisJICovCisJW3Bibl9BRERJREFUQV9QQ0llXzFfMzkwNjI1MF0gPSB7CisJCS5mbGFncwkJPSBGTF9CQVNFMCwKKwkJLm51bV9wb3J0cwk9IDEsCisJCS5iYXNlX2JhdWQJPSAzOTA2MjUwLAorCQkudWFydF9vZmZzZXQJPSAweDIwMCwKKwkJLmZpcnN0X29mZnNldAk9IDB4MTAwMCwKKwl9LAorCVtwYm5fQURESURBVEFfUENJZV8yXzM5MDYyNTBdID0geworCQkuZmxhZ3MJCT0gRkxfQkFTRTAsCisJCS5udW1fcG9ydHMJPSAyLAorCQkuYmFzZV9iYXVkCT0gMzkwNjI1MCwKKwkJLnVhcnRfb2Zmc2V0CT0gMHgyMDAsCisJCS5maXJzdF9vZmZzZXQJPSAweDEwMDAsCisJfSwKKwlbcGJuX0FERElEQVRBX1BDSWVfNF8zOTA2MjUwXSA9IHsKKwkJLmZsYWdzCQk9IEZMX0JBU0UwLAorCQkubnVtX3BvcnRzCT0gNCwKKwkJLmJhc2VfYmF1ZAk9IDM5MDYyNTAsCisJCS51YXJ0X29mZnNldAk9IDB4MjAwLAorCQkuZmlyc3Rfb2Zmc2V0CT0gMHgxMDAwLAorCX0sCisJW3Bibl9BRERJREFUQV9QQ0llXzhfMzkwNjI1MF0gPSB7CisJCS5mbGFncwkJPSBGTF9CQVNFMCwKKwkJLm51bV9wb3J0cwk9IDgsCisJCS5iYXNlX2JhdWQJPSAzOTA2MjUwLAorCQkudWFydF9vZmZzZXQJPSAweDIwMCwKKwkJLmZpcnN0X29mZnNldAk9IDB4MTAwMCwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNvZnRtb2RlbV9ibGFja2xpc3RbXSA9IHsKQEAgLTI2NDksNiArMjY5Miw5IEBACiAJCVBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNILAogCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9QQ0lfVUFSVF84XzQ4NSwgMCwgMCwKIAkJcGJuX2IwXzhfMTg0MzIwMF8yMDAgfSwKKwl7CVBDSV9WRU5ET1JfSURfRVhBUiwgUENJX0RFVklDRV9JRF9FWEFSX1hSMTdDMTUyLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgUENJX1NVQkRFVklDRV9JRF9JQk1fU0FUVVJOX1NFUklBTF9PTkVfUE9SVCwKKwkJMCwgMCwgcGJuX2V4YXJfaWJtX3NhdHVybiB9LAogCiAJewlQQ0lfVkVORE9SX0lEX1NFQUxFVkVMLCBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1U1MzAsCiAJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCkBAIC0zNTU2LDYgKzM2MDIsMzggQEAKIAkJMCwKIAkJcGJuX2IwXzhfMTE1MjAwIH0sCiAKKwl7CVBDSV9WRU5ET1JfSURfQURESURBVEEsCisJCVBDSV9ERVZJQ0VfSURfQURESURBVEFfQVBDSWU3NTAwLAorCQlQQ0lfQU5ZX0lELAorCQlQQ0lfQU5ZX0lELAorCQkwLAorCQkwLAorCQlwYm5fQURESURBVEFfUENJZV80XzM5MDYyNTAgfSwKKworCXsJUENJX1ZFTkRPUl9JRF9BRERJREFUQSwKKwkJUENJX0RFVklDRV9JRF9BRERJREFUQV9BUENJZTc0MjAsCisJCVBDSV9BTllfSUQsCisJCVBDSV9BTllfSUQsCisJCTAsCisJCTAsCisJCXBibl9BRERJREFUQV9QQ0llXzJfMzkwNjI1MCB9LAorCisJewlQQ0lfVkVORE9SX0lEX0FERElEQVRBLAorCQlQQ0lfREVWSUNFX0lEX0FERElEQVRBX0FQQ0llNzMwMCwKKwkJUENJX0FOWV9JRCwKKwkJUENJX0FOWV9JRCwKKwkJMCwKKwkJMCwKKwkJcGJuX0FERElEQVRBX1BDSWVfMV8zOTA2MjUwIH0sCisKKwl7CVBDSV9WRU5ET1JfSURfQURESURBVEEsCisJCVBDSV9ERVZJQ0VfSURfQURESURBVEFfQVBDSWU3ODAwLAorCQlQQ0lfQU5ZX0lELAorCQlQQ0lfQU5ZX0lELAorCQkwLAorCQkwLAorCQlwYm5fQURESURBVEFfUENJZV84XzM5MDYyNTAgfSwKKwogCXsJUENJX1ZFTkRPUl9JRF9ORVRNT1MsIFBDSV9ERVZJQ0VfSURfTkVUTU9TXzk4MzUsCiAJCVBDSV9WRU5ET1JfSURfSUJNLCAweDAyOTksCiAJCTAsIDAsIHBibl9iMF9idF8yXzExNTIwMCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggMDM0MjJjZS4uZTUyMjU3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC04NjIsNyArODYyLDcgQEAKIAogY29uZmlnIFNFUklBTF9VQVJUTElURQogCXRyaXN0YXRlICJYaWxpbnggdWFydGxpdGUgc2VyaWFsIHBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBQQzMyIHx8IE1JQ1JPQkxBWkUKKwlkZXBlbmRzIG9uIFBQQzMyIHx8IE1JQ1JPQkxBWkUgfHwgTUZEX1RJTUJFUkRBTEUKIAlzZWxlY3QgU0VSSUFMX0NPUkUKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgWGlsaW54IHVhcnRsaXRlIHNlcmlhbCBjb250cm9sbGVyLgpAQCAtMTQ1OCw0ICsxNDU4LDIzIEBACiAJLS0taGVscC0tLQogCUFkZCBzdXBwb3J0IGZvciBVQVJUIGNvbnRyb2xsZXIgb24gdGltYmVyZGFsZS4KIAorY29uZmlnIFNFUklBTF9CQ002M1hYCisJdHJpc3RhdGUgImJjbTYzeHggc2VyaWFsIHBvcnQgc3VwcG9ydCIKKwlzZWxlY3QgU0VSSUFMX0NPUkUKKwlkZXBlbmRzIG9uIEJDTTYzWFgKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIGJjbTYzeHggQ1BVLCB5b3UgY2FuIGVuYWJsZSBpdHMgb25ib2FyZAorCSAgc2VyaWFsIHBvcnQgYnkgZW5hYmxpbmcgdGhpcyBvcHRpb25zLgorCisgICAgICAgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisgICAgICAgICAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGJjbTk2M3h4X3VhcnQuCisKK2NvbmZpZyBTRVJJQUxfQkNNNjNYWF9DT05TT0xFCisJYm9vbCAiQ29uc29sZSBvbiBiY202M3h4IHNlcmlhbCBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX0JDTTYzWFg9eQorCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCisJaGVscAorCSAgSWYgeW91IGhhdmUgZW5hYmxlZCB0aGUgc2VyaWFsIHBvcnQgb24gdGhlIGJjbTYzeHggQ1BVCisJICB5b3UgY2FuIG1ha2UgaXQgdGhlIGNvbnNvbGUgYnkgYW5zd2VyaW5nIFkgdG8gdGhpcyBvcHRpb24uCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKaW5kZXggOTdmNmZjYy4uZDIxZDVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTM0LDYgKzM0LDcgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfUFhBKSArPSBweGEubwogb2JqLSQoQ09ORklHX1NFUklBTF9QTlg4WFhYKSArPSBwbng4eHh4X3VhcnQubwogb2JqLSQoQ09ORklHX1NFUklBTF9TQTExMDApICs9IHNhMTEwMC5vCitvYmotJChDT05GSUdfU0VSSUFMX0JDTTYzWFgpICs9IGJjbTYzeHhfdWFydC5vCiBvYmotJChDT05GSUdfU0VSSUFMX0JGSU4pICs9IGJmaW5fNXh4Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgKz0gYmZpbl9zcG9ydF91YXJ0Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfU0FNU1VORykgKz0gc2Ftc3VuZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCmluZGV4IDM1NTFjNWMuLjlkOTQ4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCkBAIC0xNTMxLDcgKzE1MzEsNyBAQAogCXZvaWQgKmRhdGE7CiAJaW50IHJldDsKIAotCUJVSUxEX0JVR19PTighaXNfcG93ZXJfb2ZfMihBVE1FTF9TRVJJQUxfUklOR1NJWkUpKTsKKwlCVUlMRF9CVUdfT04oQVRNRUxfU0VSSUFMX1JJTkdTSVpFICYgKEFUTUVMX1NFUklBTF9SSU5HU0laRSAtIDEpKTsKIAogCXBvcnQgPSAmYXRtZWxfcG9ydHNbcGRldi0+aWRdOwogCXBvcnQtPmJhY2t1cF9pbXIgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYmNtNjN4eF91YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC9iY202M3h4X3VhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWRkYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKQEAgLTAsMCArMSw4OTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBEZXJpdmVkIGZyb20gbWFueSBkcml2ZXJzIHVzaW5nIGdlbmVyaWNfc2VyaWFsIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWF4aW1lIEJpem9uIDxtYml6b25AZnJlZWJveC5mcj4KKyAqCisgKiAgU2VyaWFsIGRyaXZlciBmb3IgQkNNNjN4eCBpbnRlZ3JhdGVkIFVBUlQuCisgKgorICogSGFyZHdhcmUgZmxvdyBjb250cm9sIHdhcyBfbm90XyB0ZXN0ZWQgc2luY2UgSSBvbmx5IGhhdmUgUlgvVFggb24KKyAqIG15IGJvYXJkLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkNNNjNYWF9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19NQUdJQ19TWVNSUSkKKyNkZWZpbmUgU1VQUE9SVF9TWVNSUQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisKKyNpbmNsdWRlIDxiY202M3h4X2Nsay5oPgorI2luY2x1ZGUgPGJjbTYzeHhfaXJxLmg+CisjaW5jbHVkZSA8YmNtNjN4eF9yZWdzLmg+CisjaW5jbHVkZSA8YmNtNjN4eF9pby5oPgorCisjZGVmaW5lIEJDTTYzWFhfTlJfVUFSVFMJMQorCitzdGF0aWMgc3RydWN0IHVhcnRfcG9ydCBwb3J0c1tCQ002M1hYX05SX1VBUlRTXTsKKworLyoKKyAqIHJ4IGludGVycnVwdCBtYXNrIC8gc3RhdAorICoKKyAqIG1hc2s6CisgKiAgLSByeCBmaWZvIGZ1bGwKKyAqICAtIHJ4IGZpZm8gYWJvdmUgdGhyZXNob2xkCisgKiAgLSByeCBmaWZvIG5vdCBlbXB0eSBmb3IgdG9vIGxvbmcKKyAqLworI2RlZmluZSBVQVJUX1JYX0lOVF9NQVNLCShVQVJUX0lSX01BU0soVUFSVF9JUl9SWE9WRVIpIHwJCVwKKwkJCQlVQVJUX0lSX01BU0soVUFSVF9JUl9SWFRIUkVTSCkgfAlcCisJCQkJVUFSVF9JUl9NQVNLKFVBUlRfSVJfUlhUSU1FT1VUKSkKKworI2RlZmluZSBVQVJUX1JYX0lOVF9TVEFUCShVQVJUX0lSX1NUQVQoVUFSVF9JUl9SWE9WRVIpIHwJCVwKKwkJCQlVQVJUX0lSX1NUQVQoVUFSVF9JUl9SWFRIUkVTSCkgfAlcCisJCQkJVUFSVF9JUl9TVEFUKFVBUlRfSVJfUlhUSU1FT1VUKSkKKworLyoKKyAqIHR4IGludGVycnVwdCBtYXNrIC8gc3RhdAorICoKKyAqIG1hc2s6CisgKiAtIHR4IGZpZm8gZW1wdHkKKyAqIC0gdHggZmlmbyBiZWxvdyB0aHJlc2hvbGQKKyAqLworI2RlZmluZSBVQVJUX1RYX0lOVF9NQVNLCShVQVJUX0lSX01BU0soVUFSVF9JUl9UWEVNUFRZKSB8CVwKKwkJCQlVQVJUX0lSX01BU0soVUFSVF9JUl9UWFRSRVNIKSkKKworI2RlZmluZSBVQVJUX1RYX0lOVF9TVEFUCShVQVJUX0lSX1NUQVQoVUFSVF9JUl9UWEVNUFRZKSB8CVwKKwkJCQlVQVJUX0lSX1NUQVQoVUFSVF9JUl9UWFRSRVNIKSkKKworLyoKKyAqIGV4dGVybmFsIGlucHV0IGludGVycnVwdAorICoKKyAqIG1hc2s6IGFueSBlZGdlIG9uIENUUywgRENECisgKi8KKyNkZWZpbmUgVUFSVF9FWFRJTlBfSU5UX01BU0sJKFVBUlRfRVhUSU5QX0lSTUFTSyhVQVJUX0VYVElOUF9JUl9DVFMpIHwgXAorCQkJCSBVQVJUX0VYVElOUF9JUk1BU0soVUFSVF9FWFRJTlBfSVJfRENEKSkKKworLyoKKyAqIGhhbmR5IHVhcnQgcmVnaXN0ZXIgYWNjZXNzb3IKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmNtX3VhcnRfcmVhZGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKKwkJCQkJIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGJjbV9yZWFkbChwb3J0LT5tZW1iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbV91YXJ0X3dyaXRlbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJCSAgdW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWJjbV93cml0ZWwodmFsdWUsIHBvcnQtPm1lbWJhc2UgKyBvZmZzZXQpOworfQorCisvKgorICogc2VyaWFsIGNvcmUgcmVxdWVzdCB0byBjaGVjayBpZiB1YXJ0IHR4IGZpZm8gaXMgZW1wdHkKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBiY21fdWFydF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0lSX1JFRyk7CisJcmV0dXJuICh2YWwgJiBVQVJUX0lSX1NUQVQoVUFSVF9JUl9UWEVNUFRZKSkgPyAxIDogMDsKK30KKworLyoKKyAqIHNlcmlhbCBjb3JlIHJlcXVlc3QgdG8gc2V0IFJUUyBhbmQgRFRSIHBpbiBzdGF0ZSBhbmQgbG9vcGJhY2sgbW9kZQorICovCitzdGF0aWMgdm9pZCBiY21fdWFydF9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX01DVExfUkVHKTsKKwl2YWwgJj0gfihVQVJUX01DVExfRFRSX01BU0sgfCBVQVJUX01DVExfUlRTX01BU0spOworCS8qIGludmVydCBvZiB3cml0dGVuIHZhbHVlIGlzIHJlZmxlY3RlZCBvbiB0aGUgcGluICovCisJaWYgKCEobWN0cmwgJiBUSU9DTV9EVFIpKQorCQl2YWwgfD0gVUFSVF9NQ1RMX0RUUl9NQVNLOworCWlmICghKG1jdHJsICYgVElPQ01fUlRTKSkKKwkJdmFsIHw9IFVBUlRfTUNUTF9SVFNfTUFTSzsKKwliY21fdWFydF93cml0ZWwocG9ydCwgdmFsLCBVQVJUX01DVExfUkVHKTsKKworCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfQ1RMX1JFRyk7CisJaWYgKG1jdHJsICYgVElPQ01fTE9PUCkKKwkJdmFsIHw9IFVBUlRfQ1RMX0xPT1BCQUNLX01BU0s7CisJZWxzZQorCQl2YWwgJj0gflVBUlRfQ1RMX0xPT1BCQUNLX01BU0s7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9DVExfUkVHKTsKK30KKworLyoKKyAqIHNlcmlhbCBjb3JlIHJlcXVlc3QgdG8gcmV0dXJuIFJJLCBDVFMsIERDRCBhbmQgRFNSIHBpbiBzdGF0ZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGJjbV91YXJ0X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGludCB2YWwsIG1jdHJsOworCisJbWN0cmwgPSAwOworCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfRVhUSU5QX1JFRyk7CisJaWYgKHZhbCAmIFVBUlRfRVhUSU5QX1JJX01BU0spCisJCW1jdHJsIHw9IFRJT0NNX1JJOworCWlmICh2YWwgJiBVQVJUX0VYVElOUF9DVFNfTUFTSykKKwkJbWN0cmwgfD0gVElPQ01fQ1RTOworCWlmICh2YWwgJiBVQVJUX0VYVElOUF9EQ0RfTUFTSykKKwkJbWN0cmwgfD0gVElPQ01fQ0Q7CisJaWYgKHZhbCAmIFVBUlRfRVhUSU5QX0RTUl9NQVNLKQorCQltY3RybCB8PSBUSU9DTV9EU1I7CisJcmV0dXJuIG1jdHJsOworfQorCisvKgorICogc2VyaWFsIGNvcmUgcmVxdWVzdCB0byBkaXNhYmxlIHR4IEFTQVAgKHVzZWQgZm9yIGZsb3cgY29udHJvbCkKKyAqLworc3RhdGljIHZvaWQgYmNtX3VhcnRfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0NUTF9SRUcpOworCXZhbCAmPSB+KFVBUlRfQ1RMX1RYRU5fTUFTSyk7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9DVExfUkVHKTsKKworCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfSVJfUkVHKTsKKwl2YWwgJj0gflVBUlRfVFhfSU5UX01BU0s7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9JUl9SRUcpOworfQorCisvKgorICogc2VyaWFsIGNvcmUgcmVxdWVzdCB0byAocmUpZW5hYmxlIHR4CisgKi8KK3N0YXRpYyB2b2lkIGJjbV91YXJ0X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfSVJfUkVHKTsKKwl2YWwgfD0gVUFSVF9UWF9JTlRfTUFTSzsKKwliY21fdWFydF93cml0ZWwocG9ydCwgdmFsLCBVQVJUX0lSX1JFRyk7CisKKwl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0NUTF9SRUcpOworCXZhbCB8PSBVQVJUX0NUTF9UWEVOX01BU0s7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9DVExfUkVHKTsKK30KKworLyoKKyAqIHNlcmlhbCBjb3JlIHJlcXVlc3QgdG8gc3RvcCByeCwgY2FsbGVkIGJlZm9yZSBwb3J0IHNodXRkb3duCisgKi8KK3N0YXRpYyB2b2lkIGJjbV91YXJ0X3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9JUl9SRUcpOworCXZhbCAmPSB+VUFSVF9SWF9JTlRfTUFTSzsKKwliY21fdWFydF93cml0ZWwocG9ydCwgdmFsLCBVQVJUX0lSX1JFRyk7Cit9CisKKy8qCisgKiBzZXJpYWwgY29yZSByZXF1ZXN0IHRvIGVuYWJsZSBtb2RlbSBzdGF0dXMgaW50ZXJydXB0IHJlcG9ydGluZworICovCitzdGF0aWMgdm9pZCBiY21fdWFydF9lbmFibGVfbXMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9JUl9SRUcpOworCXZhbCB8PSBVQVJUX0lSX01BU0soVUFSVF9JUl9FWFRJUCk7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9JUl9SRUcpOworfQorCisvKgorICogc2VyaWFsIGNvcmUgcmVxdWVzdCB0byBzdGFydC9zdG9wIGVtaXR0aW5nIGJyZWFrIGNoYXIKKyAqLworc3RhdGljIHZvaWQgYmNtX3VhcnRfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjdGwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfQ1RMX1JFRyk7CisJaWYgKGN0bCkKKwkJdmFsIHw9IFVBUlRfQ1RMX1hNSVRCUktfTUFTSzsKKwllbHNlCisJCXZhbCAmPSB+VUFSVF9DVExfWE1JVEJSS19NQVNLOworCWJjbV91YXJ0X3dyaXRlbChwb3J0LCB2YWwsIFVBUlRfQ1RMX1JFRyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiByZXR1cm4gcG9ydCB0eXBlIGluIHN0cmluZyBmb3JtYXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmJjbV91YXJ0X3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gKHBvcnQtPnR5cGUgPT0gUE9SVF9CQ002M1hYKSA/ICJiY202M3h4X3VhcnQiIDogTlVMTDsKK30KKworLyoKKyAqIHJlYWQgYWxsIGNoYXJzIGluIHJ4IGZpZm8gYW5kIHNlbmQgdGhlbSB0byBjb3JlCisgKi8KK3N0YXRpYyB2b2lkIGJjbV91YXJ0X2RvX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQgbWF4X2NvdW50OworCisJLyogbGltaXQgbnVtYmVyIG9mIGNoYXIgcmVhZCBpbiBpbnRlcnJ1cHQsIHNob3VsZCBub3QgYmUKKwkgKiBoaWdoZXIgdGhhbiBmaWZvIHNpemUgYW55d2F5IHNpbmNlIHdlJ3JlIG11Y2ggZmFzdGVyIHRoYW4KKwkgKiBzZXJpYWwgcG9ydCAqLworCW1heF9jb3VudCA9IDMyOworCXR0eSA9IHBvcnQtPmluZm8tPnBvcnQudHR5OworCWRvIHsKKwkJdW5zaWduZWQgaW50IGllc3RhdCwgYywgY3N0YXQ7CisJCWNoYXIgZmxhZzsKKworCQkvKiBnZXQgb3ZlcnJ1bi9maWZvIGVtcHR5IGluZm9ybWF0aW9uIGZyb20gaWVyCisJCSAqIHJlZ2lzdGVyICovCisJCWllc3RhdCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfSVJfUkVHKTsKKwkJaWYgKCEoaWVzdGF0ICYgVUFSVF9JUl9TVEFUKFVBUlRfSVJfUlhOT1RFTVBUWSkpKQorCQkJYnJlYWs7CisKKwkJY3N0YXQgPSBjID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9GSUZPX1JFRyk7CisJCXBvcnQtPmljb3VudC5yeCsrOworCQlmbGFnID0gVFRZX05PUk1BTDsKKwkJYyAmPSAweGZmOworCisJCWlmICh1bmxpa2VseSgoY3N0YXQgJiBVQVJUX0ZJRk9fQU5ZRVJSX01BU0spKSkgeworCQkJLyogZG8gc3RhdHMgZmlyc3QgKi8KKwkJCWlmIChjc3RhdCAmIFVBUlRfRklGT19CUktERVRfTUFTSykgeworCQkJCXBvcnQtPmljb3VudC5icmsrKzsKKwkJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoY3N0YXQgJiBVQVJUX0ZJRk9fUEFSRVJSX01BU0spCisJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOworCQkJaWYgKGNzdGF0ICYgVUFSVF9GSUZPX0ZSQU1FRVJSX01BU0spCisJCQkJcG9ydC0+aWNvdW50LmZyYW1lKys7CisKKwkJCS8qIHVwZGF0ZSBmbGFnIHdydCByZWFkX3N0YXR1c19tYXNrICovCisJCQljc3RhdCAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQkJaWYgKGNzdGF0ICYgVUFSVF9GSUZPX0JSS0RFVF9NQVNLKQorCQkJCWZsYWcgPSBUVFlfQlJFQUs7CisJCQlpZiAoY3N0YXQgJiBVQVJUX0ZJRk9fRlJBTUVFUlJfTUFTSykKKwkJCQlmbGFnID0gVFRZX0ZSQU1FOworCQkJaWYgKGNzdGF0ICYgVUFSVF9GSUZPX1BBUkVSUl9NQVNLKQorCQkJCWZsYWcgPSBUVFlfUEFSSVRZOworCQl9CisKKwkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgYykpCisJCQljb250aW51ZTsKKworCQlpZiAodW5saWtlbHkoaWVzdGF0ICYgVUFSVF9JUl9TVEFUKFVBUlRfSVJfUlhPVkVSKSkpIHsKKwkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKKwkJfQorCisJCWlmICgoY3N0YXQgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2spID09IDApCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGMsIGZsYWcpOworCisJfSB3aGlsZSAoLS1tYXhfY291bnQpOworCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworLyoKKyAqIGZpbGwgdHggZmlmbyB3aXRoIGNoYXJzIHRvIHNlbmQsIHN0b3Agd2hlbiBmaWZvIGlzIGFib3V0IHRvIGJlIGZ1bGwKKyAqIG9yIHdoZW4gYWxsIGNoYXJzIGhhdmUgYmVlbiBzZW50LgorICovCitzdGF0aWMgdm9pZCBiY21fdWFydF9kb190eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdDsKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXhfY291bnQ7CisKKwlpZiAocG9ydC0+eF9jaGFyKSB7CisJCWJjbV91YXJ0X3dyaXRlbChwb3J0LCBwb3J0LT54X2NoYXIsIFVBUlRfRklGT19SRUcpOworCQlwb3J0LT5pY291bnQudHgrKzsKKwkJcG9ydC0+eF9jaGFyID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmICh1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKKwkJYmNtX3VhcnRfc3RvcF90eChwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCXhtaXQgPSAmcG9ydC0+aW5mby0+eG1pdDsKKwlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQorCQlnb3RvIHR4cV9lbXB0eTsKKworCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfTUNUTF9SRUcpOworCXZhbCA9ICh2YWwgJiBVQVJUX01DVExfVFhGSUZPRklMTF9NQVNLKSA+PiBVQVJUX01DVExfVFhGSUZPRklMTF9TSElGVDsKKwltYXhfY291bnQgPSBwb3J0LT5maWZvc2l6ZSAtIHZhbDsKKworCXdoaWxlIChtYXhfY291bnQtLSkgeworCQl1bnNpZ25lZCBpbnQgYzsKKworCQljID0geG1pdC0+YnVmW3htaXQtPnRhaWxdOworCQliY21fdWFydF93cml0ZWwocG9ydCwgYywgVUFSVF9GSUZPX1JFRyk7CisJCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisJCXBvcnQtPmljb3VudC50eCsrOworCQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQorCQl1YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKKworCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCisJCWdvdG8gdHhxX2VtcHR5OworCXJldHVybjsKKwordHhxX2VtcHR5OgorCS8qIG5vdGhpbmcgdG8gc2VuZCwgZGlzYWJsZSB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0lSX1JFRyk7CisJdmFsICY9IH5VQVJUX1RYX0lOVF9NQVNLOworCWJjbV91YXJ0X3dyaXRlbChwb3J0LCB2YWwsIFVBUlRfSVJfUkVHKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBwcm9jZXNzIHVhcnQgaW50ZXJydXB0CisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBiY21fdWFydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgaW50IGlycXN0YXQ7CisKKwlwb3J0ID0gZGV2X2lkOworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisKKwlpcnFzdGF0ID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9JUl9SRUcpOworCWlmIChpcnFzdGF0ICYgVUFSVF9SWF9JTlRfU1RBVCkKKwkJYmNtX3VhcnRfZG9fcngocG9ydCk7CisKKwlpZiAoaXJxc3RhdCAmIFVBUlRfVFhfSU5UX1NUQVQpCisJCWJjbV91YXJ0X2RvX3R4KHBvcnQpOworCisJaWYgKGlycXN0YXQgJiBVQVJUX0lSX01BU0soVUFSVF9JUl9FWFRJUCkpIHsKKwkJdW5zaWduZWQgaW50IGVzdGF0OworCisJCWVzdGF0ID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9FWFRJTlBfUkVHKTsKKwkJaWYgKGVzdGF0ICYgVUFSVF9FWFRJTlBfSVJTVEFUKFVBUlRfRVhUSU5QX0lSX0NUUykpCisJCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHBvcnQsCisJCQkJCSAgICAgICBlc3RhdCAmIFVBUlRfRVhUSU5QX0NUU19NQVNLKTsKKwkJaWYgKGVzdGF0ICYgVUFSVF9FWFRJTlBfSVJTVEFUKFVBUlRfRVhUSU5QX0lSX0RDRCkpCisJCQl1YXJ0X2hhbmRsZV9kY2RfY2hhbmdlKHBvcnQsCisJCQkJCSAgICAgICBlc3RhdCAmIFVBUlRfRVhUSU5QX0RDRF9NQVNLKTsKKwl9CisKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogZW5hYmxlIHJ4ICYgdHggb3BlcmF0aW9uIG9uIHVhcnQKKyAqLworc3RhdGljIHZvaWQgYmNtX3VhcnRfZW5hYmxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfQ1RMX1JFRyk7CisJdmFsIHw9IChVQVJUX0NUTF9CUkdFTl9NQVNLIHwgVUFSVF9DVExfVFhFTl9NQVNLIHwgVUFSVF9DVExfUlhFTl9NQVNLKTsKKwliY21fdWFydF93cml0ZWwocG9ydCwgdmFsLCBVQVJUX0NUTF9SRUcpOworfQorCisvKgorICogZGlzYWJsZSByeCAmIHR4IG9wZXJhdGlvbiBvbiB1YXJ0CisgKi8KK3N0YXRpYyB2b2lkIGJjbV91YXJ0X2Rpc2FibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9DVExfUkVHKTsKKwl2YWwgJj0gfihVQVJUX0NUTF9CUkdFTl9NQVNLIHwgVUFSVF9DVExfVFhFTl9NQVNLIHwKKwkJIFVBUlRfQ1RMX1JYRU5fTUFTSyk7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9DVExfUkVHKTsKK30KKworLyoKKyAqIGNsZWFyIGFsbCB1bnJlYWQgZGF0YSBpbiByeCBmaWZvIGFuZCB1bnNlbnQgZGF0YSBpbiB0eCBmaWZvCisgKi8KK3N0YXRpYyB2b2lkIGJjbV91YXJ0X2ZsdXNoKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCS8qIGVtcHR5IHJ4IGFuZCB0eCBmaWZvICovCisJdmFsID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9DVExfUkVHKTsKKwl2YWwgfD0gVUFSVF9DVExfUlNUUlhGSUZPX01BU0sgfCBVQVJUX0NUTF9SU1RUWEZJRk9fTUFTSzsKKwliY21fdWFydF93cml0ZWwocG9ydCwgdmFsLCBVQVJUX0NUTF9SRUcpOworCisJLyogcmVhZCBhbnkgcGVuZGluZyBjaGFyIHRvIG1ha2Ugc3VyZSBhbGwgaXJxIHN0YXR1cyBhcmUKKwkgKiBjbGVhcmVkICovCisJKHZvaWQpYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9GSUZPX1JFRyk7Cit9CisKKy8qCisgKiBzZXJpYWwgY29yZSByZXF1ZXN0IHRvIGluaXRpYWxpemUgdWFydCBhbmQgc3RhcnQgcnggb3BlcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgYmNtX3VhcnRfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCS8qIG1hc2sgYWxsIGlycSBhbmQgZmx1c2ggcG9ydCAqLworCWJjbV91YXJ0X2Rpc2FibGUocG9ydCk7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIDAsIFVBUlRfSVJfUkVHKTsKKwliY21fdWFydF9mbHVzaChwb3J0KTsKKworCS8qIGNsZWFyIGFueSBwZW5kaW5nIGV4dGVybmFsIGlucHV0IGludGVycnVwdCAqLworCSh2b2lkKWJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfRVhUSU5QX1JFRyk7CisKKwkvKiBzZXQgcngvdHggZmlmbyB0aHJlc2ggdG8gZmlmbyBoYWxmIHNpemUgKi8KKwl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX01DVExfUkVHKTsKKwl2YWwgJj0gfihVQVJUX01DVExfUlhGSUZPVEhSRVNIX01BU0sgfCBVQVJUX01DVExfVFhGSUZPVEhSRVNIX01BU0spOworCXZhbCB8PSAocG9ydC0+Zmlmb3NpemUgLyAyKSA8PCBVQVJUX01DVExfUlhGSUZPVEhSRVNIX1NISUZUOworCXZhbCB8PSAocG9ydC0+Zmlmb3NpemUgLyAyKSA8PCBVQVJUX01DVExfVFhGSUZPVEhSRVNIX1NISUZUOworCWJjbV91YXJ0X3dyaXRlbChwb3J0LCB2YWwsIFVBUlRfTUNUTF9SRUcpOworCisJLyogc2V0IHJ4IGZpZm8gdGltZW91dCB0byAxIGNoYXIgdGltZSAqLworCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfQ1RMX1JFRyk7CisJdmFsICY9IH5VQVJUX0NUTF9SWFRNT1VUQ05UX01BU0s7CisJdmFsIHw9IDEgPDwgVUFSVF9DVExfUlhUTU9VVENOVF9TSElGVDsKKwliY21fdWFydF93cml0ZWwocG9ydCwgdmFsLCBVQVJUX0NUTF9SRUcpOworCisJLyogcmVwb3J0IGFueSBlZGdlIG9uIGRjZCBhbmQgY3RzICovCisJdmFsID0gVUFSVF9FWFRJTlBfSU5UX01BU0s7CisJdmFsIHw9IFVBUlRfRVhUSU5QX0RDRF9OT1NFTlNFX01BU0s7CisJdmFsIHw9IFVBUlRfRVhUSU5QX0NUU19OT1NFTlNFX01BU0s7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9FWFRJTlBfUkVHKTsKKworCS8qIHJlZ2lzdGVyIGlycSBhbmQgZW5hYmxlIHJ4IGludGVycnVwdHMgKi8KKwlyZXQgPSByZXF1ZXN0X2lycShwb3J0LT5pcnEsIGJjbV91YXJ0X2ludGVycnVwdCwgMCwKKwkJCSAgYmNtX3VhcnRfdHlwZShwb3J0KSwgcG9ydCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwliY21fdWFydF93cml0ZWwocG9ydCwgVUFSVF9SWF9JTlRfTUFTSywgVUFSVF9JUl9SRUcpOworCWJjbV91YXJ0X2VuYWJsZShwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNlcmlhbCBjb3JlIHJlcXVlc3QgdG8gZmx1c2ggJiBkaXNhYmxlIHVhcnQKKyAqLworc3RhdGljIHZvaWQgYmNtX3VhcnRfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwliY21fdWFydF93cml0ZWwocG9ydCwgMCwgVUFSVF9JUl9SRUcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCWJjbV91YXJ0X2Rpc2FibGUocG9ydCk7CisJYmNtX3VhcnRfZmx1c2gocG9ydCk7CisJZnJlZV9pcnEocG9ydC0+aXJxLCBwb3J0KTsKK30KKworLyoKKyAqIHNlcmlhbCBjb3JlIHJlcXVlc3QgdG8gY2hhbmdlIGN1cnJlbnQgdWFydCBzZXR0aW5nCisgKi8KK3N0YXRpYyB2b2lkIGJjbV91YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQkJIHN0cnVjdCBrdGVybWlvcyAqbmV3LAorCQkJCSBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3RsLCBiYXVkLCBxdW90LCBpZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwkvKiBkaXNhYmxlIHVhcnQgd2hpbGUgY2hhbmdpbmcgc3BlZWQgKi8KKwliY21fdWFydF9kaXNhYmxlKHBvcnQpOworCWJjbV91YXJ0X2ZsdXNoKHBvcnQpOworCisJLyogdXBkYXRlIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwljdGwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0NUTF9SRUcpOworCWN0bCAmPSB+VUFSVF9DVExfQklUU1BFUlNZTV9NQVNLOworCisJc3dpdGNoIChuZXctPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCQljdGwgfD0gKDAgPDwgVUFSVF9DVExfQklUU1BFUlNZTV9TSElGVCk7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQljdGwgfD0gKDEgPDwgVUFSVF9DVExfQklUU1BFUlNZTV9TSElGVCk7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQljdGwgfD0gKDIgPDwgVUFSVF9DVExfQklUU1BFUlNZTV9TSElGVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN0bCB8PSAoMyA8PCBVQVJUX0NUTF9CSVRTUEVSU1lNX1NISUZUKTsKKwkJYnJlYWs7CisJfQorCisJY3RsICY9IH5VQVJUX0NUTF9TVE9QQklUU19NQVNLOworCWlmIChuZXctPmNfY2ZsYWcgJiBDU1RPUEIpCisJCWN0bCB8PSBVQVJUX0NUTF9TVE9QQklUU18yOworCWVsc2UKKwkJY3RsIHw9IFVBUlRfQ1RMX1NUT1BCSVRTXzE7CisKKwljdGwgJj0gfihVQVJUX0NUTF9SWFBBUkVOX01BU0sgfCBVQVJUX0NUTF9UWFBBUkVOX01BU0spOworCWlmIChuZXctPmNfY2ZsYWcgJiBQQVJFTkIpCisJCWN0bCB8PSAoVUFSVF9DVExfUlhQQVJFTl9NQVNLIHwgVUFSVF9DVExfVFhQQVJFTl9NQVNLKTsKKwljdGwgJj0gfihVQVJUX0NUTF9SWFBBUkVWRU5fTUFTSyB8IFVBUlRfQ1RMX1RYUEFSRVZFTl9NQVNLKTsKKwlpZiAobmV3LT5jX2NmbGFnICYgUEFST0REKQorCQljdGwgfD0gKFVBUlRfQ1RMX1JYUEFSRVZFTl9NQVNLIHwgVUFSVF9DVExfVFhQQVJFVkVOX01BU0spOworCWJjbV91YXJ0X3dyaXRlbChwb3J0LCBjdGwsIFVBUlRfQ1RMX1JFRyk7CisKKwkvKiB1cGRhdGUgQmF1ZHdvcmQgcmVnaXN0ZXIgKi8KKwliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIG5ldywgb2xkLCAwLCBwb3J0LT51YXJ0Y2xrIC8gMTYpOworCXF1b3QgPSB1YXJ0X2dldF9kaXZpc29yKHBvcnQsIGJhdWQpIC0gMTsKKwliY21fdWFydF93cml0ZWwocG9ydCwgcXVvdCwgVUFSVF9CQVVEX1JFRyk7CisKKwkvKiB1cGRhdGUgSW50ZXJydXB0IHJlZ2lzdGVyICovCisJaWVyID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9JUl9SRUcpOworCisJaWVyICY9IH5VQVJUX0lSX01BU0soVUFSVF9JUl9FWFRJUCk7CisJaWYgKFVBUlRfRU5BQkxFX01TKHBvcnQsIG5ldy0+Y19jZmxhZykpCisJCWllciB8PSBVQVJUX0lSX01BU0soVUFSVF9JUl9FWFRJUCk7CisKKwliY21fdWFydF93cml0ZWwocG9ydCwgaWVyLCBVQVJUX0lSX1JFRyk7CisKKwkvKiB1cGRhdGUgcmVhZC9pZ25vcmUgbWFzayAqLworCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0ZJRk9fVkFMSURfTUFTSzsKKwlpZiAobmV3LT5jX2lmbGFnICYgSU5QQ0spIHsKKwkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0ZJRk9fRlJBTUVFUlJfTUFTSzsKKwkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0ZJRk9fUEFSRVJSX01BU0s7CisJfQorCWlmIChuZXctPmNfaWZsYWcgJiAoQlJLSU5UKSkKKwkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0ZJRk9fQlJLREVUX01BU0s7CisKKwlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCWlmIChuZXctPmNfaWZsYWcgJiBJR05QQVIpCisJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0ZJRk9fUEFSRVJSX01BU0s7CisJaWYgKG5ldy0+Y19pZmxhZyAmIElHTkJSSykKKwkJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfRklGT19CUktERVRfTUFTSzsKKwlpZiAoIShuZXctPmNfY2ZsYWcgJiBDUkVBRCkpCisJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0ZJRk9fVkFMSURfTUFTSzsKKworCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgbmV3LT5jX2NmbGFnLCBiYXVkKTsKKwliY21fdWFydF9lbmFibGUocG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogc2VyaWFsIGNvcmUgcmVxdWVzdCB0byBjbGFpbSB1YXJ0IGlvbWVtCisgKi8KK3N0YXRpYyBpbnQgYmNtX3VhcnRfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlzaXplID0gUlNFVF9VQVJUX1NJWkU7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgc2l6ZSwgImJjbTYzeHgiKSkgeworCQlkZXZfZXJyKHBvcnQtPmRldiwgIk1lbW9yeSByZWdpb24gYnVzeVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocG9ydC0+bWFwYmFzZSwgc2l6ZSk7CisJaWYgKCFwb3J0LT5tZW1iYXNlKSB7CisJCWRldl9lcnIocG9ydC0+ZGV2LCAiVW5hYmxlIHRvIG1hcCByZWdpc3RlcnNcbiIpOworCQlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgc2l6ZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogc2VyaWFsIGNvcmUgcmVxdWVzdCB0byByZWxlYXNlIHVhcnQgaW9tZW0KKyAqLworc3RhdGljIHZvaWQgYmNtX3VhcnRfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsIFJTRVRfVUFSVF9TSVpFKTsKKwlpb3VubWFwKHBvcnQtPm1lbWJhc2UpOworfQorCisvKgorICogc2VyaWFsIGNvcmUgcmVxdWVzdCB0byBkbyBhbnkgcG9ydCByZXF1aXJlZCBhdXRvY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgdm9pZCBiY21fdWFydF9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkgeworCQlpZiAoYmNtX3VhcnRfcmVxdWVzdF9wb3J0KHBvcnQpKQorCQkJcmV0dXJuOworCQlwb3J0LT50eXBlID0gUE9SVF9CQ002M1hYOworCX0KK30KKworLyoKKyAqIHNlcmlhbCBjb3JlIHJlcXVlc3QgdG8gY2hlY2sgdGhhdCBwb3J0IGluZm9ybWF0aW9uIGluIHNlcmluZm8gYXJlCisgKiBzdWl0YWJsZQorICovCitzdGF0aWMgaW50IGJjbV91YXJ0X3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnNlcmluZm8pCit7CisJaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF9CQ002M1hYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG9ydC0+aXJxICE9IHNlcmluZm8tPmlycSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcnQtPmlvdHlwZSAhPSBzZXJpbmZvLT5pb190eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG9ydC0+bWFwYmFzZSAhPSAodW5zaWduZWQgbG9uZylzZXJpbmZvLT5pb21lbV9iYXNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyogc2VyaWFsIGNvcmUgY2FsbGJhY2tzICovCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIGJjbV91YXJ0X29wcyA9IHsKKwkudHhfZW1wdHkJPSBiY21fdWFydF90eF9lbXB0eSwKKwkuZ2V0X21jdHJsCT0gYmNtX3VhcnRfZ2V0X21jdHJsLAorCS5zZXRfbWN0cmwJPSBiY21fdWFydF9zZXRfbWN0cmwsCisJLnN0YXJ0X3R4CT0gYmNtX3VhcnRfc3RhcnRfdHgsCisJLnN0b3BfdHgJPSBiY21fdWFydF9zdG9wX3R4LAorCS5zdG9wX3J4CT0gYmNtX3VhcnRfc3RvcF9yeCwKKwkuZW5hYmxlX21zCT0gYmNtX3VhcnRfZW5hYmxlX21zLAorCS5icmVha19jdGwJPSBiY21fdWFydF9icmVha19jdGwsCisJLnN0YXJ0dXAJPSBiY21fdWFydF9zdGFydHVwLAorCS5zaHV0ZG93bgk9IGJjbV91YXJ0X3NodXRkb3duLAorCS5zZXRfdGVybWlvcwk9IGJjbV91YXJ0X3NldF90ZXJtaW9zLAorCS50eXBlCQk9IGJjbV91YXJ0X3R5cGUsCisJLnJlbGVhc2VfcG9ydAk9IGJjbV91YXJ0X3JlbGVhc2VfcG9ydCwKKwkucmVxdWVzdF9wb3J0CT0gYmNtX3VhcnRfcmVxdWVzdF9wb3J0LAorCS5jb25maWdfcG9ydAk9IGJjbV91YXJ0X2NvbmZpZ19wb3J0LAorCS52ZXJpZnlfcG9ydAk9IGJjbV91YXJ0X3ZlcmlmeV9wb3J0LAorfTsKKworCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JDTTYzWFhfQ09OU09MRQorc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX3htaXRyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHRtb3V0OworCisJLyogV2FpdCB1cCB0byAxMG1zIGZvciB0aGUgY2hhcmFjdGVyKHMpIHRvIGJlIHNlbnQuICovCisJdG1vdXQgPSAxMDAwMDsKKwl3aGlsZSAoLS10bW91dCkgeworCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCXZhbCA9IGJjbV91YXJ0X3JlYWRsKHBvcnQsIFVBUlRfSVJfUkVHKTsKKwkJaWYgKHZhbCAmIFVBUlRfSVJfU1RBVChVQVJUX0lSX1RYRU1QVFkpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisKKwkvKiBXYWl0IHVwIHRvIDFzIGZvciBmbG93IGNvbnRyb2wgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHBvcnQtPmZsYWdzICYgVVBGX0NPTlNfRkxPVykgeworCQl0bW91dCA9IDEwMDAwMDA7CisJCXdoaWxlICgtLXRtb3V0KSB7CisJCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCQl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0VYVElOUF9SRUcpOworCQkJaWYgKHZhbCAmIFVBUlRfRVhUSU5QX0NUU19NQVNLKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEpOworCQl9CisJfQorfQorCisvKgorICogb3V0cHV0IGdpdmVuIGNoYXIKKyAqLworc3RhdGljIHZvaWQgYmNtX2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY2gpCit7CisJd2FpdF9mb3JfeG1pdHIocG9ydCk7CisJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIGNoLCBVQVJUX0ZJRk9fUkVHKTsKK30KKworLyoKKyAqIGNvbnNvbGUgY29yZSByZXF1ZXN0IHRvIG91dHB1dCBnaXZlbiBzdHJpbmcKKyAqLworc3RhdGljIHZvaWQgYmNtX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbG9ja2VkOworCisJcG9ydCA9ICZwb3J0c1tjby0+aW5kZXhdOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChwb3J0LT5zeXNycSkgeworCQkvKiBiY21fdWFydF9pbnRlcnJ1cHQoKSBhbHJlYWR5IHRvb2sgdGhlIGxvY2sgKi8KKwkJbG9ja2VkID0gMDsKKwl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKKwkJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZwb3J0LT5sb2NrKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCQlsb2NrZWQgPSAxOworCX0KKworCS8qIGNhbGwgaGVscGVyIHRvIGRlYWwgd2l0aCBcclxuICovCisJdWFydF9jb25zb2xlX3dyaXRlKHBvcnQsIHMsIGNvdW50LCBiY21fY29uc29sZV9wdXRjaGFyKTsKKworCS8qIGFuZCB3YWl0IGZvciBjaGFyIHRvIGJlIHRyYW5zbWl0dGVkICovCisJd2FpdF9mb3JfeG1pdHIocG9ydCk7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogY29uc29sZSBjb3JlIHJlcXVlc3QgdG8gc2V0dXAgZ2l2ZW4gY29uc29sZSwgZmluZCBtYXRjaGluZyB1YXJ0CisgKiBwb3J0IGFuZCBzZXR1cCBpdC4KKyAqLworc3RhdGljIGludCBiY21fY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydDsKKwlpbnQgYmF1ZCA9IDk2MDA7CisJaW50IGJpdHMgPSA4OworCWludCBwYXJpdHkgPSAnbic7CisJaW50IGZsb3cgPSAnbic7CisKKwlpZiAoY28tPmluZGV4IDwgMCB8fCBjby0+aW5kZXggPj0gQkNNNjNYWF9OUl9VQVJUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcG9ydCA9ICZwb3J0c1tjby0+aW5kZXhdOworCWlmICghcG9ydC0+bWVtYmFzZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKG9wdGlvbnMpCisJCXVhcnRfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMsICZmbG93KTsKKworCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKHBvcnQsIGNvLCBiYXVkLCBwYXJpdHksIGJpdHMsIGZsb3cpOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIGJjbV91YXJ0X2RyaXZlcjsKKworc3RhdGljIHN0cnVjdCBjb25zb2xlIGJjbTYzeHhfY29uc29sZSA9IHsKKwkubmFtZQkJPSAidHR5UyIsCisJLndyaXRlCQk9IGJjbV9jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UJCT0gdWFydF9jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gYmNtX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCisJLmRhdGEJCT0gJmJjbV91YXJ0X2RyaXZlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJjbTYzeHhfY29uc29sZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfY29uc29sZSgmYmNtNjN4eF9jb25zb2xlKTsKKwlyZXR1cm4gMDsKK30KKworY29uc29sZV9pbml0Y2FsbChiY202M3h4X2NvbnNvbGVfaW5pdCk7CisKKyNkZWZpbmUgQkNNNjNYWF9DT05TT0xFCSgmYmNtNjN4eF9jb25zb2xlKQorI2Vsc2UKKyNkZWZpbmUgQkNNNjNYWF9DT05TT0xFCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX0JDTTYzWFhfQ09OU09MRSAqLworCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIGJjbV91YXJ0X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gImJjbTYzeHhfdWFydCIsCisJLmRldl9uYW1lCT0gInR0eVMiLAorCS5tYWpvcgkJPSBUVFlfTUFKT1IsCisJLm1pbm9yCQk9IDY0LAorCS5ucgkJPSAxLAorCS5jb25zCQk9IEJDTTYzWFhfQ09OU09MRSwKK307CisKKy8qCisgKiBwbGF0Zm9ybSBkcml2ZXIgcHJvYmUvcmVtb3ZlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGJjbV91YXJ0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXNfbWVtLCAqcmVzX2lycTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OworCXN0cnVjdCBjbGsgKmNsazsKKwlpbnQgcmV0OworCisJaWYgKHBkZXYtPmlkIDwgMCB8fCBwZGV2LT5pZCA+PSBCQ002M1hYX05SX1VBUlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3J0c1twZGV2LT5pZF0ubWVtYmFzZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJlc19tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzX21lbSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXNfaXJxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAoIXJlc19pcnEpCisJCXJldHVybiAtRU5PREVWOworCisJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAicGVyaXBoIik7CisJaWYgKElTX0VSUihjbGspKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBvcnQgPSAmcG9ydHNbcGRldi0+aWRdOworCW1lbXNldChwb3J0LCAwLCBzaXplb2YoKnBvcnQpKTsKKwlwb3J0LT5pb3R5cGUgPSBVUElPX01FTTsKKwlwb3J0LT5tYXBiYXNlID0gcmVzX21lbS0+c3RhcnQ7CisJcG9ydC0+aXJxID0gcmVzX2lycS0+c3RhcnQ7CisJcG9ydC0+b3BzID0gJmJjbV91YXJ0X29wczsKKwlwb3J0LT5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GOworCXBvcnQtPmRldiA9ICZwZGV2LT5kZXY7CisJcG9ydC0+Zmlmb3NpemUgPSAxNjsKKwlwb3J0LT51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKGNsaykgLyAyOworCWNsa19wdXQoY2xrKTsKKworCXJldCA9IHVhcnRfYWRkX29uZV9wb3J0KCZiY21fdWFydF9kcml2ZXIsIHBvcnQpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUocG9ydCk7CisJCXJldHVybiByZXQ7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBvcnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiY21fdWFydF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OworCisJcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZiY21fdWFydF9kcml2ZXIsIHBvcnQpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCS8qIG1hcmsgcG9ydCBhcyBmcmVlICovCisJcG9ydHNbcGRldi0+aWRdLm1lbWJhc2UgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogcGxhdGZvcm0gZHJpdmVyIHN0dWZmCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbV91YXJ0X3BsYXRmb3JtX2RyaXZlciA9IHsKKwkucHJvYmUJPSBiY21fdWFydF9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoYmNtX3VhcnRfcmVtb3ZlKSwKKwkuZHJpdmVyCT0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm5hbWUgID0gImJjbTYzeHhfdWFydCIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJjbV91YXJ0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJmJjbV91YXJ0X2RyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmNtX3VhcnRfcGxhdGZvcm1fZHJpdmVyKTsKKwlpZiAocmV0KQorCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZiY21fdWFydF9kcml2ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJjbV91YXJ0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYmNtX3VhcnRfcGxhdGZvcm1fZHJpdmVyKTsKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZiY21fdWFydF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChiY21fdWFydF9pbml0KTsKK21vZHVsZV9leGl0KGJjbV91YXJ0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXhpbWUgQml6b24gPG1iaXpvbkBmcmVlYm94LmZyPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSA2Mzx4eCBpbnRlZ3JhdGVkIHVhcnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKaW5kZXggOGQzNDliMjMuLjMwMGNlYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKQEAgLTY0OSw3ICs2NDksNyBAQAogCXU4ICpwOwogCWludCBjb3VudDsKIAlzdHJ1Y3QgdWFydF9jcG1fcG9ydCAqcGluZm8gPSAoc3RydWN0IHVhcnRfY3BtX3BvcnQgKilwb3J0OwotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5zdGF0ZS0+eG1pdDsKIAogCS8qIEhhbmRsZSB4b24veG9mZiAqLwogCWlmIChwb3J0LT54X2NoYXIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYyBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYwppbmRleCA3YmU1MmZlLi4zMWYxNzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaWNvbS5jIGIvZHJpdmVycy9zZXJpYWwvaWNvbS5jCmluZGV4IDJkN2ZlZWMuLjAwMjhiNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2ljb20uYworKysgYi9kcml2ZXJzL3NlcmlhbC9pY29tLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCWlmIChwb3J0IDwgNCkgewogCQl0ZW1wID0gcmVhZGwoc3RvcF9wcm9jW3BvcnRdLmdsb2JhbF9jb250cm9sX3JlZyk7CiAJCXRlbXAgPQotCSAgICAJCSh0ZW1wICYgfnN0YXJ0X3Byb2NbcG9ydF0ucHJvY2Vzc29yX2lkKSB8IHN0b3BfcHJvY1twb3J0XS5wcm9jZXNzb3JfaWQ7CisJCQkodGVtcCAmIH5zdGFydF9wcm9jW3BvcnRdLnByb2Nlc3Nvcl9pZCkgfCBzdG9wX3Byb2NbcG9ydF0ucHJvY2Vzc29yX2lkOwogCQl3cml0ZWwodGVtcCwgc3RvcF9wcm9jW3BvcnRdLmdsb2JhbF9jb250cm9sX3JlZyk7CiAKIAkJLyogd3JpdGUgZmx1c2ggKi8KQEAgLTMzNiw3ICszMzYsNyBAQAogCWlmIChwb3J0IDwgNCkgewogCQl0ZW1wID0gcmVhZGwoc3RhcnRfcHJvY1twb3J0XS5nbG9iYWxfY29udHJvbF9yZWcpOwogCQl0ZW1wID0KLQkgICAgCQkodGVtcCAmIH5zdG9wX3Byb2NbcG9ydF0ucHJvY2Vzc29yX2lkKSB8IHN0YXJ0X3Byb2NbcG9ydF0ucHJvY2Vzc29yX2lkOworCQkJKHRlbXAgJiB+c3RvcF9wcm9jW3BvcnRdLnByb2Nlc3Nvcl9pZCkgfCBzdGFydF9wcm9jW3BvcnRdLnByb2Nlc3Nvcl9pZDsKIAkJd3JpdGVsKHRlbXAsIHN0YXJ0X3Byb2NbcG9ydF0uZ2xvYmFsX2NvbnRyb2xfcmVnKTsKIAogCQkvKiB3cml0ZSBmbHVzaCAqLwpAQCAtNTA5LDggKzUwOSw4IEBACiAJCWRldl9lcnIoJmljb21fcG9ydC0+YWRhcHRlci0+cGNpX2Rldi0+ZGV2LCJQb3J0IG5vdCBvcGVydGlvbmFsXG4iKTsKIAl9CiAKLSAgICAgIGlmIChuZXdfcGFnZSAhPSBOVUxMKQotCSAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCA0MDk2LCBuZXdfcGFnZSwgdGVtcF9wY2kpOworCWlmIChuZXdfcGFnZSAhPSBOVUxMKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldiwgNDA5NiwgbmV3X3BhZ2UsIHRlbXBfcGNpKTsKIH0KIAogc3RhdGljIGludCBzdGFydHVwKHN0cnVjdCBpY29tX3BvcnQgKmljb21fcG9ydCkKQEAgLTE0OTMsMTUgKzE0OTMsMTUgQEAKIAkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCWludCBpbmRleDsKLSAgICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfcmVnOwotICAgICAgICBpbnQgcmV0dmFsOwotICAgICAgICBzdHJ1Y3QgaWNvbV9hZGFwdGVyICppY29tX2FkYXB0ZXI7Ci0gICAgICAgIHN0cnVjdCBpY29tX3BvcnQgKmljb21fcG9ydDsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZF9yZWc7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaWNvbV9hZGFwdGVyICppY29tX2FkYXB0ZXI7CisJc3RydWN0IGljb21fcG9ydCAqaWNvbV9wb3J0OwogCi0gICAgICAgIHJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7Ci0gICAgICAgIGlmIChyZXR2YWwpIHsKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChyZXR2YWwpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJEZXZpY2UgZW5hYmxlIEZBSUxFRFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAlpZiAoIChyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgImljb20iKSkpIHsKQEAgLTE1MTAsMjMgKzE1MTAsMjMgQEAKIAkJIHJldHVybiByZXR2YWw7CiAJIH0KIAotICAgICAgICBwY2lfc2V0X21hc3RlcihkZXYpOworCXBjaV9zZXRfbWFzdGVyKGRldik7CiAKLSAgICAgICAgaWYgKCAocmV0dmFsID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kX3JlZykpKSB7CisJaWYgKCAocmV0dmFsID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kX3JlZykpKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiUENJIENvbmZpZyByZWFkIEZBSUxFRFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQorCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ09NTUFORCwKIAkJY29tbWFuZF9yZWcgfCBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIKICAJCXwgUENJX0NPTU1BTkRfUEFSSVRZIHwgUENJX0NPTU1BTkRfU0VSUik7CiAKLSAgICAgICAgaWYgKGVudC0+ZHJpdmVyX2RhdGEgPT0gQURBUFRFUl9WMSkgeworCWlmIChlbnQtPmRyaXZlcl9kYXRhID09IEFEQVBURVJfVjEpIHsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDQsIDB4ODMwMDgzMEEpOwotCSB9IGVsc2UgeworCX0gZWxzZSB7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQ0LCAweDQyMDA0MjAwKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDgsIDB4NDIwMDQyMDApOwotICAgICAgICAgfQorCX0KIAogCiAJcmV0dmFsID0gaWNvbV9hbGxvY19hZGFwdGVyKCZpY29tX2FkYXB0ZXIpOwpAQCAtMTUzNiwxMCArMTUzNiwxMCBAQAogCQkgZ290byBwcm9iZV9leGl0MDsKIAl9CiAKLQkgaWNvbV9hZGFwdGVyLT5iYXNlX2FkZHJfcGNpID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7Ci0JIGljb21fYWRhcHRlci0+cGNpX2RldiA9IGRldjsKLQkgaWNvbV9hZGFwdGVyLT52ZXJzaW9uID0gZW50LT5kcml2ZXJfZGF0YTsKLQkgaWNvbV9hZGFwdGVyLT5zdWJzeXN0ZW1faWQgPSBlbnQtPnN1YmRldmljZTsKKwlpY29tX2FkYXB0ZXItPmJhc2VfYWRkcl9wY2kgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlpY29tX2FkYXB0ZXItPnBjaV9kZXYgPSBkZXY7CisJaWNvbV9hZGFwdGVyLT52ZXJzaW9uID0gZW50LT5kcml2ZXJfZGF0YTsKKwlpY29tX2FkYXB0ZXItPnN1YnN5c3RlbV9pZCA9IGVudC0+c3ViZGV2aWNlOwogCiAKIAlyZXR2YWwgPSBpY29tX2luaXRfcG9ydHMoaWNvbV9hZGFwdGVyKTsKQEAgLTE1NDgsNyArMTU0OCw3IEBACiAJCWdvdG8gcHJvYmVfZXhpdDE7CiAJfQogCi0JIGljb21fYWRhcHRlci0+YmFzZV9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CisJaWNvbV9hZGFwdGVyLT5iYXNlX2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAwKTsKIAogCWlmICghaWNvbV9hZGFwdGVyLT5iYXNlX2FkZHIpCiAJCWdvdG8gcHJvYmVfZXhpdDE7CkBAIC0xNTYyLDcgKzE1NjIsNyBAQAogCiAJcmV0dmFsID0gaWNvbV9sb2FkX3BvcnRzKGljb21fYWRhcHRlcik7CiAKLSAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaWNvbV9hZGFwdGVyLT5udW1iX3BvcnRzOyBpbmRleCsrKSB7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaWNvbV9hZGFwdGVyLT5udW1iX3BvcnRzOyBpbmRleCsrKSB7CiAJCWljb21fcG9ydCA9ICZpY29tX2FkYXB0ZXItPnBvcnRfaW5mb1tpbmRleF07CiAKIAkJaWYgKGljb21fcG9ydC0+c3RhdHVzID09IElDT01fUE9SVF9BQ1RJVkUpIHsKQEAgLTE1NzksNyArMTU3OSw3IEBACiAJCQkJaWNvbV9wb3J0LT5zdGF0dXMgPSBJQ09NX1BPUlRfT0ZGOwogCQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiRGV2aWNlIGFkZCBmYWlsZWRcbiIpOwogCQkJIH0gZWxzZQotCQkJICAgICAgICBkZXZfaW5mbygmZGV2LT5kZXYsICJEZXZpY2UgYWRkZWRcbiIpOworCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgIkRldmljZSBhZGRlZFxuIik7CiAJCX0KIAl9CiAKQEAgLTE1OTUsOSArMTU5NSw3IEBACiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCi0gICAgICAgIHJldHVybiByZXR2YWw7Ci0KLQorCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpY29tX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYwppbmRleCBkN2JjZDA3Li43Y2U5ZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYwpAQCAtNzA1LDcgKzcwNSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKChzZXItPmlycSAhPSBwb3J0LT5pcnEpIHx8Ci0JICAgIChzZXItPmlvX3R5cGUgIT0gU0VSSUFMX0lPX01FTSkgfHwKKwkgICAgKHNlci0+aW9fdHlwZSAhPSBVUElPX01FTSkgfHwKIAkgICAgKHNlci0+YmF1ZF9iYXNlICE9IHBvcnQtPnVhcnRjbGspICB8fAogCSAgICAoc2VyLT5pb21lbV9iYXNlICE9ICh2b2lkICopcG9ydC0+bWFwYmFzZSkgfHwKIAkgICAgKHNlci0+aHViNiAhPSAwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKaW5kZXggNjQ0M2I3Zi4uYjg2MjlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcHhhLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKQEAgLTcyNiw5ICs3MjYsMTAgQEAKIAkuY29ucwkJPSBQWEFfQ09OU09MRSwKIH07CiAKLXN0YXRpYyBpbnQgc2VyaWFsX3B4YV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzZXJpYWxfcHhhX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotICAgICAgICBzdHJ1Y3QgdWFydF9weGFfcG9ydCAqc3BvcnQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworICAgICAgICBzdHJ1Y3QgdWFydF9weGFfcG9ydCAqc3BvcnQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogICAgICAgICBpZiAoc3BvcnQpCiAgICAgICAgICAgICAgICAgdWFydF9zdXNwZW5kX3BvcnQoJnNlcmlhbF9weGFfcmVnLCAmc3BvcnQtPnBvcnQpOwpAQCAtNzM2LDkgKzczNyw5IEBACiAgICAgICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNlcmlhbF9weGFfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc2VyaWFsX3B4YV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotICAgICAgICBzdHJ1Y3QgdWFydF9weGFfcG9ydCAqc3BvcnQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworICAgICAgICBzdHJ1Y3QgdWFydF9weGFfcG9ydCAqc3BvcnQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogICAgICAgICBpZiAoc3BvcnQpCiAgICAgICAgICAgICAgICAgdWFydF9yZXN1bWVfcG9ydCgmc2VyaWFsX3B4YV9yZWcsICZzcG9ydC0+cG9ydCk7CkBAIC03NDYsNiArNzQ3LDEyIEBACiAgICAgICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgc2VyaWFsX3B4YV9wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBzZXJpYWxfcHhhX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzZXJpYWxfcHhhX3Jlc3VtZSwKK307CisjZW5kaWYKKwogc3RhdGljIGludCBzZXJpYWxfcHhhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdWFydF9weGFfcG9ydCAqc3BvcnQ7CkBAIC04MjUsMTEgKzgzMiwxMiBAQAogICAgICAgICAucHJvYmUgICAgICAgICAgPSBzZXJpYWxfcHhhX3Byb2JlLAogICAgICAgICAucmVtb3ZlICAgICAgICAgPSBzZXJpYWxfcHhhX3JlbW92ZSwKIAotCS5zdXNwZW5kCT0gc2VyaWFsX3B4YV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc2VyaWFsX3B4YV9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJICAgICAgICAubmFtZQk9ICJweGEyeHgtdWFydCIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmc2VyaWFsX3B4YV9wbV9vcHMsCisjZW5kaWYKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2ExMTAwLmMgYi9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYwppbmRleCA3ZjVlMjY4Li4yMTk5ZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYwpAQCAtNjM4LDcgKzYzOCw3IEBACiAJUFBTUiB8PSBQUENfVFhEMSB8IFBQQ19UWEQzOwogfQogCi12b2lkIF9faW5pdCBzYTExMDBfcmVnaXN0ZXJfdWFydF9mbnMoc3RydWN0IHNhMTEwMF9wb3J0X2ZucyAqZm5zKQordm9pZCBfX2RldmluaXQgc2ExMTAwX3JlZ2lzdGVyX3VhcnRfZm5zKHN0cnVjdCBzYTExMDBfcG9ydF9mbnMgKmZucykKIHsKIAlpZiAoZm5zLT5nZXRfbWN0cmwpCiAJCXNhMTEwMF9wb3BzLmdldF9tY3RybCA9IGZucy0+Z2V0X21jdHJsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggMjUxNGQwMC4uZGNjNzI0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0xMjcwLDYgKzEyNzAsOSBAQAogCiAJQlVHX09OKCFrZXJuZWxfbG9ja2VkKCkpOwogCisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuOworCiAJdXBvcnQgPSBzdGF0ZS0+dWFydF9wb3J0OwogCXBvcnQgPSAmc3RhdGUtPnBvcnQ7CiAKQEAgLTEzMTYsOSArMTMxOSw5IEBACiAJICovCiAJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CiAJCXVwb3J0LT5vcHMtPnN0b3BfcngodXBvcnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CiAJCS8qCiAJCSAqIEJlZm9yZSB3ZSBkcm9wIERUUiwgbWFrZSBzdXJlIHRoZSBVQVJUIHRyYW5zbWl0dGVyCiAJCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQpAQCAtMjQyNiw3ICsyNDI5LDcgQEAKIC8qKgogICoJdWFydF9hZGRfb25lX3BvcnQgLSBhdHRhY2ggYSBkcml2ZXItZGVmaW5lZCBwb3J0IHN0cnVjdHVyZQogICoJQGRydjogcG9pbnRlciB0byB0aGUgdWFydCBsb3cgbGV2ZWwgZHJpdmVyIHN0cnVjdHVyZSBmb3IgdGhpcyBwb3J0Ci0gKglAcG9ydDogdWFydCBwb3J0IHN0cnVjdHVyZSB0byB1c2UgZm9yIHRoaXMgcG9ydC4KKyAqCUB1cG9ydDogdWFydCBwb3J0IHN0cnVjdHVyZSB0byB1c2UgZm9yIHRoaXMgcG9ydC4KICAqCiAgKglUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIHJlZ2lzdGVyIGl0cyBvd24gdWFydF9wb3J0IHN0cnVjdHVyZQogICoJd2l0aCB0aGUgY29yZSBkcml2ZXIuICBUaGUgbWFpbiBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSBsb3cKQEAgLTI0OTksNyArMjUwMiw3IEBACiAvKioKICAqCXVhcnRfcmVtb3ZlX29uZV9wb3J0IC0gZGV0YWNoIGEgZHJpdmVyIGRlZmluZWQgcG9ydCBzdHJ1Y3R1cmUKICAqCUBkcnY6IHBvaW50ZXIgdG8gdGhlIHVhcnQgbG93IGxldmVsIGRyaXZlciBzdHJ1Y3R1cmUgZm9yIHRoaXMgcG9ydAotICoJQHBvcnQ6IHVhcnQgcG9ydCBzdHJ1Y3R1cmUgZm9yIHRoaXMgcG9ydAorICoJQHVwb3J0OiB1YXJ0IHBvcnQgc3RydWN0dXJlIGZvciB0aGlzIHBvcnQKICAqCiAgKglUaGlzIHVuaG9va3MgKGFuZCBoYW5ncyB1cCkgdGhlIHNwZWNpZmllZCBwb3J0IHN0cnVjdHVyZSBmcm9tIHRoZQogICoJY29yZSBkcml2ZXIuICBObyBmdXJ0aGVyIGNhbGxzIHdpbGwgYmUgbWFkZSB0byB0aGUgbG93LWxldmVsIGNvZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKaW5kZXggYTNiYjQ5MC4uN2M3OTE0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMKQEAgLTg3MywyMCArODczLDIwIEBACiAJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigxLCAiUHNpb24gRGFjb20iLCAiR29sZCBDYXJkIFYzNCBFdGhlcm5ldCIsIDB4ZjVmMDI1YzIsIDB4MzM4ZTgxNTUsICJjaXMvUENNTE0yOC5jaXMiKSwKIAlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDEsICJQc2lvbiBEYWNvbSIsICJHb2xkIENhcmQgVjM0IEV0aGVybmV0IEdTTSIsIDB4ZjVmMDI1YzIsIDB4NGFlODVkMzUsICJjaXMvUENNTE0yOC5jaXMiKSwKIAlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDEsICJMSU5LU1lTIiwgIlBDTUxNMjgiLCAweGY3Y2IwYjA3LCAweDY2ODgxODc0LCAiY2lzL1BDTUxNMjguY2lzIiksCi0JUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigxLCAiREFZTkEgQ09NTVVOSUNBVElPTlMiLCAiTEFOIEFORCBNT0RFTSBNVUxUSUZVTkNUSU9OIiwgMHg4ZmRmOGY4OSwgMHhkZDVlZDllOCwgIkRQODM5MDMuY2lzIiksCi0JUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX1BST0RfSUQ0KDEsICJOU0MgTUYgTEFOL01vZGVtIiwgMHg1OGZjNjA1NiwgIkRQODM5MDMuY2lzIiksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigxLCAiREFZTkEgQ09NTVVOSUNBVElPTlMiLCAiTEFOIEFORCBNT0RFTSBNVUxUSUZVTkNUSU9OIiwgMHg4ZmRmOGY4OSwgMHhkZDVlZDllOCwgImNpcy9EUDgzOTAzLmNpcyIpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19QUk9EX0lENCgxLCAiTlNDIE1GIExBTi9Nb2RlbSIsIDB4NThmYzYwNTYsICJjaXMvRFA4MzkwMy5jaXMiKSwKIAlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDEwMSwgMHgwNTU2LCAiY2lzLzNDQ0ZFTTU1Ni5jaXMiKSwKLQlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDE3NSwgMHgwMDAwLCAiRFA4MzkwMy5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDE3NSwgMHgwMDAwLCAiY2lzL0RQODM5MDMuY2lzIiksCiAJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgxLCAweDAxMDEsIDB4MDAzNSwgImNpcy8zQ1hFTTU1Ni5jaXMiKSwKIAlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDEwMSwgMHgwMDNkLCAiY2lzLzNDWEVNNTU2LmNpcyIpLAotCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiU2llcnJhIFdpcmVsZXNzIiwgIkFDODUwIiwgMHhkODVmNjIwNiwgMHg0MmEyYzAxOCwgIlNXXzh4eF9TRVIuY2lzIiksICAvKiBTaWVycmEgV2lyZWxlc3MgQUM4NTAgM0cgTmV0d29yayBBZGFwdGVyIFIxICovCi0JUENNQ0lBX0RFVklDRV9DSVNfTUFORl9DQVJEKDB4MDE5MiwgMHgwNzEwLCAiU1dfN3h4X1NFUi5jaXMiKSwJLyogU2llcnJhIFdpcmVsZXNzIEFDNzEwL0FDNzUwIEdQUlMgTmV0d29yayBBZGFwdGVyIFIxICovCi0JUENNQ0lBX0RFVklDRV9DSVNfTUFORl9DQVJEKDB4MDE5MiwgMHhhNTU1LCAiU1dfNTU1X1NFUi5jaXMiKSwgIC8qIFNpZXJyYSBBaXJjYXJkIDU1NSBDRE1BIDF4cnR0IE1vZGVtIC0tIHByZSB1cGRhdGUgKi8KLQlQQ01DSUFfREVWSUNFX0NJU19NQU5GX0NBUkQoMHgwMTNmLCAweGE1NTUsICJTV181NTVfU0VSLmNpcyIpLCAgLyogU2llcnJhIEFpcmNhcmQgNTU1IENETUEgMXhydHQgTW9kZW0gLS0gcG9zdCB1cGRhdGUgKi8KKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIlNpZXJyYSBXaXJlbGVzcyIsICJBQzg1MCIsIDB4ZDg1ZjYyMDYsIDB4NDJhMmMwMTgsICJjaXMvU1dfOHh4X1NFUi5jaXMiKSwgLyogU2llcnJhIFdpcmVsZXNzIEFDODUwIDNHIE5ldHdvcmsgQWRhcHRlciBSMSAqLworCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiU2llcnJhIFdpcmVsZXNzIiwgIkFDNzEwL0FDNzUwIiwgMHhkODVmNjIwNiwgMHg3NjFiMTFlMCwgImNpcy9TV183eHhfU0VSLmNpcyIpLCAgLyogU2llcnJhIFdpcmVsZXNzIEFDNzEwL0FDNzUwIEdQUlMgTmV0d29yayBBZGFwdGVyIFIxICovCisJUENNQ0lBX0RFVklDRV9DSVNfTUFORl9DQVJEKDB4MDE5MiwgMHhhNTU1LCAiY2lzL1NXXzU1NV9TRVIuY2lzIiksICAvKiBTaWVycmEgQWlyY2FyZCA1NTUgQ0RNQSAxeHJ0dCBNb2RlbSAtLSBwcmUgdXBkYXRlICovCisJUENNQ0lBX0RFVklDRV9DSVNfTUFORl9DQVJEKDB4MDEzZiwgMHhhNTU1LCAiY2lzL1NXXzU1NV9TRVIuY2lzIiksICAvKiBTaWVycmEgQWlyY2FyZCA1NTUgQ0RNQSAxeHJ0dCBNb2RlbSAtLSBwb3N0IHVwZGF0ZSAqLwogCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiTXVsdGlUZWNoIiwgIlBDTUNJQSA1NksgRGF0YUZheCIsIDB4ODQyMDQ3ZWUsIDB4YzJlZmNmMDMsICJjaXMvTVQ1NjM0WkxYLmNpcyIpLAotCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiQURWQU5URUNIIiwgIkNPTXBhZC0zMi84NUItMiIsIDB4OTY5MTNhODUsIDB4MjdhYjU0MzcsICJDT01wYWQyLmNpcyIpLAotCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiQURWQU5URUNIIiwgIkNPTXBhZC0zMi84NUItNCIsIDB4OTY5MTNhODUsIDB4Y2VjOGYxMDIsICJDT01wYWQ0LmNpcyIpLAotCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMjMoIkFEVkFOVEVDSCIsICJDT01wYWQtMzIvODUiLCAiMS4wIiwgMHg5NjkxM2E4NSwgMHg4ZmJlOTJhZSwgMHgwODc3YjYyNywgIkNPTXBhZDIuY2lzIiksCisJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJBRFZBTlRFQ0giLCAiQ09NcGFkLTMyLzg1Qi0yIiwgMHg5NjkxM2E4NSwgMHgyN2FiNTQzNywgImNpcy9DT01wYWQyLmNpcyIpLAorCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiQURWQU5URUNIIiwgIkNPTXBhZC0zMi84NUItNCIsIDB4OTY5MTNhODUsIDB4Y2VjOGYxMDIsICJjaXMvQ09NcGFkNC5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIzKCJBRFZBTlRFQ0giLCAiQ09NcGFkLTMyLzg1IiwgIjEuMCIsIDB4OTY5MTNhODUsIDB4OGZiZTkyYWUsIDB4MDg3N2I2MjcsICJjaXMvQ09NcGFkMi5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMigiUlMtQ09NIDJQIiwgMHhhZDIwYjE1NiwgImNpcy9SUy1DT00tMlAuY2lzIiksCiAJUENNQ0lBX0RFVklDRV9DSVNfTUFORl9DQVJEKDB4MDAxMywgMHgwMDAwLCAiR0xPQkVUUk9UVEVSLmNpcyIpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFTEFOIERJR0lUQUwgU1lTVEVNUyBMVEQsIGMxOTk3LiIsIlNFUklBTCBDQVJEOiBTTDEwMCAgMS4wMC4iLDB4MTljYTc4YWYsMHhmOTY0ZjQyYiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYwppbmRleCAwZjdjZjRjLi5jNTBlOWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKQEAgLTIyMSwyMSArMjIxLDI2IEBACiAJCXNpb19vdXQodXAsIFRYWDlfU0lCR1IsIDB4ZmYgfCBUWFg5X1NJQkdSX0JDTEtfVDYpOwogfQogCitzdGF0aWMgc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp0b191YXJ0X3R4eDlfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHVhcnRfdHh4OV9wb3J0LCBwb3J0KTsKK30KKwogc3RhdGljIHZvaWQgc2VyaWFsX3R4eDlfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfdHh4OV9wb3J0ICopcG9ydDsKKwlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gdG9fdWFydF90eHg5X3BvcnQocG9ydCk7CiAJc2lvX21hc2sodXAsIFRYWDlfU0lESUNSLCBUWFg5X1NJRElDUl9USUUpOwogfQogCiBzdGF0aWMgdm9pZCBzZXJpYWxfdHh4OV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfdHh4OV9wb3J0ICopcG9ydDsKKwlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gdG9fdWFydF90eHg5X3BvcnQocG9ydCk7CiAJc2lvX3NldCh1cCwgVFhYOV9TSURJQ1IsIFRYWDlfU0lESUNSX1RJRSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNlcmlhbF90eHg5X3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqKXBvcnQ7CisJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IHRvX3VhcnRfdHh4OV9wb3J0KHBvcnQpOwogCXVwLT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgJj0gflRYWDlfU0lESVNSX1JESVM7CiB9CiAKQEAgLTI0Niw3ICsyNTEsNyBAQAogCiBzdGF0aWMgdm9pZCBzZXJpYWxfdHh4OV9pbml0aWFsaXplKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSB0b191YXJ0X3R4eDlfcG9ydChwb3J0KTsKIAl1bnNpZ25lZCBpbnQgdG1vdXQgPSAxMDAwMDsKIAogCXNpb19vdXQodXAsIFRYWDlfU0lGQ1IsIFRYWDlfU0lGQ1JfU1dSU1QpOwpAQCAtNDE0LDcgKzQxOSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsX3R4eDlfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqKXBvcnQ7CisJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IHRvX3VhcnRfdHh4OV9wb3J0KHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHJldDsKIApAQCAtNDI3LDcgKzQzMiw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsX3R4eDlfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSB0b191YXJ0X3R4eDlfcG9ydChwb3J0KTsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCiAJLyogbm8gbW9kZW0gY29udHJvbCBsaW5lcyAqLwpAQCAtNDQwLDcgKzQ0NSw3IEBACiAKIHN0YXRpYyB2b2lkIHNlcmlhbF90eHg5X3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCiB7Ci0Jc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSB0b191YXJ0X3R4eDlfcG9ydChwb3J0KTsKIAogCWlmIChtY3RybCAmIFRJT0NNX1JUUykKIAkJc2lvX21hc2sodXAsIFRYWDlfU0lGTENSLCBUWFg5X1NJRkxDUl9SVFNTQyk7CkBAIC00NTAsNyArNDU1LDcgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX3R4eDlfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKIHsKLQlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqKXBvcnQ7CisJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IHRvX3VhcnRfdHh4OV9wb3J0KHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwpAQCAtNDk0LDcgKzQ5OSw3IEBACiB7CiAJdW5zaWduZWQgaW50IGllcjsKIAl1bnNpZ25lZCBjaGFyIGM7Ci0Jc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSB0b191YXJ0X3R4eDlfcG9ydChwb3J0KTsKIAogCS8qCiAJICoJRmlyc3Qgc2F2ZSB0aGUgSUVSIHRoZW4gZGlzYWJsZSB0aGUgaW50ZXJydXB0cwpAQCAtNTIwLDcgKzUyNSw3IEBACiBzdGF0aWMgdm9pZCBzZXJpYWxfdHh4OV9wdXRfcG9sbF9jaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGNoYXIgYykKIHsKIAl1bnNpZ25lZCBpbnQgaWVyOwotCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfdHh4OV9wb3J0ICopcG9ydDsKKwlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gdG9fdWFydF90eHg5X3BvcnQocG9ydCk7CiAKIAkvKgogCSAqCUZpcnN0IHNhdmUgdGhlIElFUiB0aGVuIGRpc2FibGUgdGhlIGludGVycnVwdHMKQEAgLTU1MSw3ICs1NTYsNyBAQAogCiBzdGF0aWMgaW50IHNlcmlhbF90eHg5X3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqKXBvcnQ7CisJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IHRvX3VhcnRfdHh4OV9wb3J0KHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldHZhbDsKIApAQCAtNTk2LDcgKzYwMSw3IEBACiAKIHN0YXRpYyB2b2lkIHNlcmlhbF90eHg5X3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSB0b191YXJ0X3R4eDlfcG9ydChwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoKQEAgLTYzNiw3ICs2NDEsNyBAQAogc2VyaWFsX3R4eDlfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAogCQkgICAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7Ci0Jc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSB0b191YXJ0X3R4eDlfcG9ydChwb3J0KTsKIAl1bnNpZ25lZCBpbnQgY3ZhbCwgZmNyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBiYXVkLCBxdW90OwpAQCAtODE0LDE5ICs4MTksMTkgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsX3R4eDlfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSB0b191YXJ0X3R4eDlfcG9ydChwb3J0KTsKIAlzZXJpYWxfdHh4OV9yZWxlYXNlX3Jlc291cmNlKHVwKTsKIH0KIAogc3RhdGljIGludCBzZXJpYWxfdHh4OV9yZXF1ZXN0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqKXBvcnQ7CisJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IHRvX3VhcnRfdHh4OV9wb3J0KHBvcnQpOwogCXJldHVybiBzZXJpYWxfdHh4OV9yZXF1ZXN0X3Jlc291cmNlKHVwKTsKIH0KIAogc3RhdGljIHZvaWQgc2VyaWFsX3R4eDlfY29uZmlnX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IHVmbGFncykKIHsKLQlzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqKXBvcnQ7CisJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IHRvX3VhcnRfdHh4OV9wb3J0KHBvcnQpOwogCWludCByZXQ7CiAKIAkvKgpAQCAtODk3LDcgKzkwMiw3IEBACiAKIHN0YXRpYyB2b2lkIHNlcmlhbF90eHg5X2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY2gpCiB7Ci0Jc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF90eHg5X3BvcnQgKilwb3J0OworCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSB0b191YXJ0X3R4eDlfcG9ydChwb3J0KTsKIAogCXdhaXRfZm9yX3htaXRyKHVwKTsKIAlzaW9fb3V0KHVwLCBUWFg5X1NJVEZJRk8sIGNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2ZpL3NmaV9jb3JlLmMgYi9kcml2ZXJzL3NmaS9zZmlfY29yZS5jCmluZGV4IGQzYjQ5NjguLmIyMDRhMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2ZpL3NmaV9jb3JlLmMKKysrIGIvZHJpdmVycy9zZmkvc2ZpX2NvcmUuYwpAQCAtOTAsNyArOTAsMTEgQEAKICAqLwogc3RhdGljIHUzMiBzZmlfdXNlX2lvcmVtYXAgX19yZWFkX21vc3RseTsKIAotc3RhdGljIHZvaWQgX19pb21lbSAqc2ZpX21hcF9tZW1vcnkodTY0IHBoeXMsIHUzMiBzaXplKQorLyoKKyAqIHNmaV91bi9tYXBfbWVtb3J5IGNhbGxzIGVhcmx5X2lvcmVtYXAvaW91bm1hcCB3aGljaCBpcyBhIF9faW5pdCBmdW5jdGlvbgorICogYW5kIGludHJvZHVjZXMgc2VjdGlvbiBtaXNtYXRjaC4gU28gdXNlIF9fcmVmIHRvIG1ha2UgaXQgY2FsbS4KKyAqLworc3RhdGljIHZvaWQgX19pb21lbSAqIF9fcmVmIHNmaV9tYXBfbWVtb3J5KHU2NCBwaHlzLCB1MzIgc2l6ZSkKIHsKIAlpZiAoIXBoeXMgfHwgIXNpemUpCiAJCXJldHVybiBOVUxMOwpAQCAtMTAxLDcgKzEwNSw3IEBACiAJCXJldHVybiBlYXJseV9pb3JlbWFwKHBoeXMsIHNpemUpOwogfQogCi1zdGF0aWMgdm9pZCBzZmlfdW5tYXBfbWVtb3J5KHZvaWQgX19pb21lbSAqdmlydCwgdTMyIHNpemUpCitzdGF0aWMgdm9pZCBfX3JlZiBzZmlfdW5tYXBfbWVtb3J5KHZvaWQgX19pb21lbSAqdmlydCwgdTMyIHNpemUpCiB7CiAJaWYgKCF2aXJ0IHx8ICFzaXplKQogCQlyZXR1cm47CkBAIC0xMjUsNyArMTI5LDcgQEAKICAqIHNmaV92ZXJpZnlfdGFibGUoKQogICogU2FuaXR5IGNoZWNrIHRhYmxlIGxlbmdoLCBjYWxjdWxhdGUgY2hlY2tzdW0KICAqLwotc3RhdGljIF9faW5pdCBpbnQgc2ZpX3ZlcmlmeV90YWJsZShzdHJ1Y3Qgc2ZpX3RhYmxlX2hlYWRlciAqdGFibGUpCitzdGF0aWMgaW50IHNmaV92ZXJpZnlfdGFibGUoc3RydWN0IHNmaV90YWJsZV9oZWFkZXIgKnRhYmxlKQogewogCiAJdTggY2hlY2tzdW0gPSAwOwpAQCAtMjEzLDEyICsyMTcsMTcgQEAKICAqICAgIHRoZSBtYXBwZWQgdmlydCBhZGRyZXNzIHdpbGwgYmUgcmV0dXJuZWQsIGFuZCB0aGUgdmlydCBzcGFjZQogICogICAgd2lsbCBiZSByZWxlYXNlZCBieSBjYWxsIHNmaV9wdXRfdGFibGUoKSBsYXRlcgogICoKKyAqIFRoaXMgdHdvIGNhc2VzIGFyZSBmcm9tIHR3byBkaWZmZXJlbnQgZnVuY3Rpb25zIHdpdGggdHdvIGRpZmZlcmVudAorICogc2VjdGlvbnMgYW5kIGNhdXNlcyBzZWN0aW9uIG1pc21hdGNoIHdhcm5pbmcuIFNvIHVzZSBfX3JlZiB0byB0ZWxsCisgKiBtb2Rwb3N0IG5vdCB0byBtYWtlIGFueSBub2lzZS4KKyAqCiAgKiBSZXR1cm4gdmFsdWU6CiAgKglOVUxMOgkJCXdoZW4gY2FuJ3QgZmluZCBhIHRhYmxlIG1hdGNoaW5nIHRoZSBrZXkKICAqCUVSUl9QVFIoZXJyb3IpOgkJZXJyb3IgdmFsdWUKICAqCXZpcnQgdGFibGUgYWRkcmVzczoJd2hlbiBhIG1hdGNoZWQgdGFibGUgaXMgZm91bmQKICAqLwotc3RydWN0IHNmaV90YWJsZV9oZWFkZXIgKnNmaV9jaGVja190YWJsZSh1NjQgcGEsIHN0cnVjdCBzZmlfdGFibGVfa2V5ICprZXkpCitzdHJ1Y3Qgc2ZpX3RhYmxlX2hlYWRlciAqCisgX19yZWYgc2ZpX2NoZWNrX3RhYmxlKHU2NCBwYSwgc3RydWN0IHNmaV90YWJsZV9rZXkgKmtleSkKIHsKIAlzdHJ1Y3Qgc2ZpX3RhYmxlX2hlYWRlciAqdGg7CiAJdm9pZCAqcmV0ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL01ha2VmaWxlIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKaW5kZXggNmQ3YTNmOC4uMjFhMTE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTE3LDcgKzE3LDcgQEAKIG9iai0kKENPTkZJR19TUElfQVUxNTUwKQkJKz0gYXUxNTUwX3NwaS5vCiBvYmotJChDT05GSUdfU1BJX0JVVFRFUkZMWSkJCSs9IHNwaV9idXR0ZXJmbHkubwogb2JqLSQoQ09ORklHX1NQSV9HUElPKQkJCSs9IHNwaV9ncGlvLm8KLW9iai0kKENPTkZJR19TUElfSU1YKQkJCSs9IG14Y19zcGkubworb2JqLSQoQ09ORklHX1NQSV9JTVgpCQkJKz0gc3BpX2lteC5vCiBvYmotJChDT05GSUdfU1BJX0xNNzBfTExQKQkJKz0gc3BpX2xtNzBsbHAubwogb2JqLSQoQ09ORklHX1NQSV9QWEEyWFgpCQkrPSBweGEyeHhfc3BpLm8KIG9iai0kKENPTkZJR19TUElfT01BUF9VV0lSRSkJCSs9IG9tYXBfdXdpcmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvYW1iYS1wbDAyMi5jIGIvZHJpdmVycy9zcGkvYW1iYS1wbDAyMi5jCmluZGV4IGMwZjk1MGEuLmZmNWJiYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2FtYmEtcGwwMjIuYworKysgYi9kcml2ZXJzL3NwaS9hbWJhLXBsMDIyLmMKQEAgLTUzMiw3ICs1MzIsNyBAQAogCUdFTl9NQVNLX0JJVFMoU1NQX0RBVEFfQklUU18xMiwgU1NQX0NSMF9NQVNLX0RTUywgMCkJfCBcCiAJR0VOX01BU0tfQklUUyhTU1BfTUlDUk9XSVJFX0NIQU5ORUxfRlVMTF9EVVBMRVgsIFNTUF9DUjBfTUFTS19IQUxGRFVQLCA1KSB8IFwKIAlHRU5fTUFTS19CSVRTKFNTUF9DTEtfUE9MX0lETEVfTE9XLCBTU1BfQ1IwX01BU0tfU1BPLCA2KSB8IFwKLQlHRU5fTUFTS19CSVRTKFNTUF9DTEtfRkFMTElOR19FREdFLCBTU1BfQ1IwX01BU0tfU1BILCA3KSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9DTEtfU0VDT05EX0VER0UsIFNTUF9DUjBfTUFTS19TUEgsIDcpIHwgXAogCUdFTl9NQVNLX0JJVFMoTk1ES19TU1BfREVGQVVMVF9DTEtSQVRFLCBTU1BfQ1IwX01BU0tfU0NSLCA4KSB8IFwKIAlHRU5fTUFTS19CSVRTKFNTUF9CSVRTXzgsIFNTUF9DUjBfTUFTS19DU1MsIDE2KQl8IFwKIAlHRU5fTUFTS19CSVRTKFNTUF9JTlRFUkZBQ0VfTU9UT1JPTEFfU1BJLCBTU1BfQ1IwX01BU0tfRlJGLCAyMSkgXApAQCAtMTI0Nyw4ICsxMjQ3LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChjaGlwX2luZm8tPmlmYWNlID09IFNTUF9JTlRFUkZBQ0VfTU9UT1JPTEFfU1BJKSB7Ci0JCWlmICgoY2hpcF9pbmZvLT5jbGtfcGhhc2UgIT0gU1NQX0NMS19SSVNJTkdfRURHRSkKLQkJICAgICYmIChjaGlwX2luZm8tPmNsa19waGFzZSAhPSBTU1BfQ0xLX0ZBTExJTkdfRURHRSkpIHsKKwkJaWYgKChjaGlwX2luZm8tPmNsa19waGFzZSAhPSBTU1BfQ0xLX0ZJUlNUX0VER0UpCisJCSAgICAmJiAoY2hpcF9pbmZvLT5jbGtfcGhhc2UgIT0gU1NQX0NMS19TRUNPTkRfRURHRSkpIHsKIAkJCWRldl9lcnIoY2hpcF9pbmZvLT5kZXYsCiAJCQkJIkNsb2NrIFBoYXNlIGlzIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHlcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDg1LDcgKzE0ODUsNyBAQAogCQljaGlwX2luZm8tPmRhdGFfc2l6ZSA9IFNTUF9EQVRBX0JJVFNfMTI7CiAJCWNoaXBfaW5mby0+cnhfbGV2X3RyaWcgPSBTU1BfUlhfMV9PUl9NT1JFX0VMRU07CiAJCWNoaXBfaW5mby0+dHhfbGV2X3RyaWcgPSBTU1BfVFhfMV9PUl9NT1JFX0VNUFRZX0xPQzsKLQkJY2hpcF9pbmZvLT5jbGtfcGhhc2UgPSBTU1BfQ0xLX0ZBTExJTkdfRURHRTsKKwkJY2hpcF9pbmZvLT5jbGtfcGhhc2UgPSBTU1BfQ0xLX1NFQ09ORF9FREdFOwogCQljaGlwX2luZm8tPmNsa19wb2wgPSBTU1BfQ0xLX1BPTF9JRExFX0xPVzsKIAkJY2hpcF9pbmZvLT5jdHJsX2xlbiA9IFNTUF9CSVRTXzg7CiAJCWNoaXBfaW5mby0+d2FpdF9zdGF0ZSA9IFNTUF9NV0lSRV9XQUlUX1pFUk87CkBAIC0xODI2LDcgKzE4MjYsNyBAQAogCQkgKiBTVCBNaWNybyBkZXJpdmF0aXZlLCB0aGlzIGhhcyAzMmJpdCB3aWRlCiAJCSAqIGFuZCAzMiBsb2NhdGlvbnMgZGVlcCBUWC9SWCBGSUZPCiAJCSAqLwotCQkuaWQJPSAweDAwMTA4MDIyLAorCQkuaWQJPSAweDAxMDgwMDIyLAogCQkubWFzawk9IDB4ZmZmZmZmZmYsCiAJCS5kYXRhCT0gJnZlbmRvcl9zdCwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvbXhjX3NwaS5jIGIvZHJpdmVycy9zcGkvbXhjX3NwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ0NzIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL214Y19zcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEp1ZXJnZW4gQmVpc2VydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgotICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3NwaS5oPgotCi0jZGVmaW5lIERSSVZFUl9OQU1FICJzcGlfaW14IgotCi0jZGVmaW5lIE1YQ19DU1BJUlhEQVRBCQkweDAwCi0jZGVmaW5lIE1YQ19DU1BJVFhEQVRBCQkweDA0Ci0jZGVmaW5lIE1YQ19DU1BJQ1RSTAkJMHgwOAotI2RlZmluZSBNWENfQ1NQSUlOVAkJMHgwYwotI2RlZmluZSBNWENfUkVTRVQJCTB4MWMKLQotLyogZ2VuZXJpYyBkZWZpbmVzIHRvIGFic3RyYWN0IGZyb20gdGhlIGRpZmZlcmVudCByZWdpc3RlciBsYXlvdXRzICovCi0jZGVmaW5lIE1YQ19JTlRfUlIJKDEgPDwgMCkgLyogUmVjZWl2ZSBkYXRhIHJlYWR5IGludGVycnVwdCAqLwotI2RlZmluZSBNWENfSU5UX1RFCSgxIDw8IDEpIC8qIFRyYW5zbWl0IEZJRk8gZW1wdHkgaW50ZXJydXB0ICovCi0KLXN0cnVjdCBteGNfc3BpX2NvbmZpZyB7Ci0JdW5zaWduZWQgaW50IHNwZWVkX2h6OwotCXVuc2lnbmVkIGludCBicHc7Ci0JdW5zaWduZWQgaW50IG1vZGU7Ci0JaW50IGNzOwotfTsKLQotc3RydWN0IG14Y19zcGlfZGF0YSB7Ci0Jc3RydWN0IHNwaV9iaXRiYW5nIGJpdGJhbmc7Ci0KLQlzdHJ1Y3QgY29tcGxldGlvbiB4ZmVyX2RvbmU7Ci0Jdm9pZCAqYmFzZTsKLQlpbnQgaXJxOwotCXN0cnVjdCBjbGsgKmNsazsKLQl1bnNpZ25lZCBsb25nIHNwaV9jbGs7Ci0JaW50ICpjaGlwc2VsZWN0OwotCi0JdW5zaWduZWQgaW50IGNvdW50OwotCXZvaWQgKCp0eCkoc3RydWN0IG14Y19zcGlfZGF0YSAqKTsKLQl2b2lkICgqcngpKHN0cnVjdCBteGNfc3BpX2RhdGEgKik7Ci0Jdm9pZCAqcnhfYnVmOwotCWNvbnN0IHZvaWQgKnR4X2J1ZjsKLQl1bnNpZ25lZCBpbnQgdHhmaWZvOyAvKiBudW1iZXIgb2Ygd29yZHMgcHVzaGVkIGluIHR4IEZJRk8gKi8KLQotCS8qIFNvQyBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KLQl2b2lkICgqaW50Y3RybCkoc3RydWN0IG14Y19zcGlfZGF0YSAqLCBpbnQpOwotCWludCAoKmNvbmZpZykoc3RydWN0IG14Y19zcGlfZGF0YSAqLCBzdHJ1Y3QgbXhjX3NwaV9jb25maWcgKik7Ci0Jdm9pZCAoKnRyaWdnZXIpKHN0cnVjdCBteGNfc3BpX2RhdGEgKik7Ci0JaW50ICgqcnhfYXZhaWxhYmxlKShzdHJ1Y3QgbXhjX3NwaV9kYXRhICopOwotfTsKLQotI2RlZmluZSBNWENfU1BJX0JVRl9SWCh0eXBlKQkJCQkJCVwKLXN0YXRpYyB2b2lkIG14Y19zcGlfYnVmX3J4XyMjdHlwZShzdHJ1Y3QgbXhjX3NwaV9kYXRhICpteGNfc3BpKQkJXAotewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgdmFsID0gcmVhZGwobXhjX3NwaS0+YmFzZSArIE1YQ19DU1BJUlhEQVRBKTsJXAotCQkJCQkJCQkJXAotCWlmIChteGNfc3BpLT5yeF9idWYpIHsJCQkJCQlcCi0JCSoodHlwZSAqKW14Y19zcGktPnJ4X2J1ZiA9IHZhbDsJCQkJXAotCQlteGNfc3BpLT5yeF9idWYgKz0gc2l6ZW9mKHR5cGUpOwkJCVwKLQl9CQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgTVhDX1NQSV9CVUZfVFgodHlwZSkJCQkJCQlcCi1zdGF0aWMgdm9pZCBteGNfc3BpX2J1Zl90eF8jI3R5cGUoc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSkJCVwKLXsJCQkJCQkJCQlcCi0JdHlwZSB2YWwgPSAwOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JaWYgKG14Y19zcGktPnR4X2J1ZikgewkJCQkJCVwKLQkJdmFsID0gKih0eXBlICopbXhjX3NwaS0+dHhfYnVmOwkJCQlcCi0JCW14Y19zcGktPnR4X2J1ZiArPSBzaXplb2YodHlwZSk7CQkJXAotCX0JCQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlteGNfc3BpLT5jb3VudCAtPSBzaXplb2YodHlwZSk7CQkJCQlcCi0JCQkJCQkJCQlcCi0Jd3JpdGVsKHZhbCwgbXhjX3NwaS0+YmFzZSArIE1YQ19DU1BJVFhEQVRBKTsJCQlcCi19Ci0KLU1YQ19TUElfQlVGX1JYKHU4KQotTVhDX1NQSV9CVUZfVFgodTgpCi1NWENfU1BJX0JVRl9SWCh1MTYpCi1NWENfU1BJX0JVRl9UWCh1MTYpCi1NWENfU1BJX0JVRl9SWCh1MzIpCi1NWENfU1BJX0JVRl9UWCh1MzIpCi0KLS8qIEZpcnN0IGVudHJ5IGlzIHJlc2VydmVkLCBzZWNvbmQgZW50cnkgaXMgdmFsaWQgb25seSBpZiBTREhDX1NQSUVOIGlzIHNldAotICogKHdoaWNoIGlzIGN1cnJlbnRseSBub3QgdGhlIGNhc2UgaW4gdGhpcyBkcml2ZXIpCi0gKi8KLXN0YXRpYyBpbnQgbXhjX2Nsa2RpdnNbXSA9IHswLCAzLCA0LCA2LCA4LCAxMiwgMTYsIDI0LCAzMiwgNDgsIDY0LCA5NiwgMTI4LCAxOTIsCi0JMjU2LCAzODQsIDUxMiwgNzY4LCAxMDI0fTsKLQotLyogTVgyMSwgTVgyNyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBteGNfc3BpX2Nsa2Rpdl8xKHVuc2lnbmVkIGludCBmaW4sCi0JCXVuc2lnbmVkIGludCBmc3BpKQotewotCWludCBpLCBtYXg7Ci0KLQlpZiAoY3B1X2lzX214MjEoKSkKLQkJbWF4ID0gMTg7Ci0JZWxzZQotCQltYXggPSAxNjsKLQotCWZvciAoaSA9IDI7IGkgPCBtYXg7IGkrKykKLQkJaWYgKGZzcGkgKiBteGNfY2xrZGl2c1tpXSA+PSBmaW4pCi0JCQlyZXR1cm4gaTsKLQotCXJldHVybiBtYXg7Ci19Ci0KLS8qIE1YMSwgTVgzMSwgTVgzNSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBteGNfc3BpX2Nsa2Rpdl8yKHVuc2lnbmVkIGludCBmaW4sCi0JCXVuc2lnbmVkIGludCBmc3BpKQotewotCWludCBpLCBkaXYgPSA0OwotCi0JZm9yIChpID0gMDsgaSA8IDc7IGkrKykgewotCQlpZiAoZnNwaSAqIGRpdiA+PSBmaW4pCi0JCQlyZXR1cm4gaTsKLQkJZGl2IDw8PSAxOwotCX0KLQotCXJldHVybiA3OwotfQotCi0jZGVmaW5lIE1YMzFfSU5UUkVHX1RFRU4JKDEgPDwgMCkKLSNkZWZpbmUgTVgzMV9JTlRSRUdfUlJFTgkoMSA8PCAzKQotCi0jZGVmaW5lIE1YMzFfQ1NQSUNUUkxfRU5BQkxFCSgxIDw8IDApCi0jZGVmaW5lIE1YMzFfQ1NQSUNUUkxfTUFTVEVSCSgxIDw8IDEpCi0jZGVmaW5lIE1YMzFfQ1NQSUNUUkxfWENICSgxIDw8IDIpCi0jZGVmaW5lIE1YMzFfQ1NQSUNUUkxfUE9MCSgxIDw8IDQpCi0jZGVmaW5lIE1YMzFfQ1NQSUNUUkxfUEhBCSgxIDw8IDUpCi0jZGVmaW5lIE1YMzFfQ1NQSUNUUkxfU1NDVEwJKDEgPDwgNikKLSNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9TU1BPTAkoMSA8PCA3KQotI2RlZmluZSBNWDMxX0NTUElDVFJMX0JDX1NISUZUCTgKLSNkZWZpbmUgTVgzNV9DU1BJQ1RSTF9CTF9TSElGVAkyMAotI2RlZmluZSBNWDMxX0NTUElDVFJMX0NTX1NISUZUCTI0Ci0jZGVmaW5lIE1YMzVfQ1NQSUNUUkxfQ1NfU0hJRlQJMTIKLSNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9EUl9TSElGVAkxNgotCi0jZGVmaW5lIE1YMzFfQ1NQSVNUQVRVUwkJMHgxNAotI2RlZmluZSBNWDMxX1NUQVRVU19SUgkJKDEgPDwgMykKLQotLyogVGhlc2UgZnVuY3Rpb25zIGFsc28gd29yayBmb3IgdGhlIGkuTVgzNSwgYnV0IGJlIGF3YXJlIHRoYXQKLSAqIHRoZSBpLk1YMzUgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHJlZ2lzdGVyIGxheW91dCBmb3IgYml0cwotICogd2UgZG8gbm90IHVzZSBoZXJlLgotICovCi1zdGF0aWMgdm9pZCBteDMxX2ludGN0cmwoc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSwgaW50IGVuYWJsZSkKLXsKLQl1bnNpZ25lZCBpbnQgdmFsID0gMDsKLQotCWlmIChlbmFibGUgJiBNWENfSU5UX1RFKQotCQl2YWwgfD0gTVgzMV9JTlRSRUdfVEVFTjsKLQlpZiAoZW5hYmxlICYgTVhDX0lOVF9SUikKLQkJdmFsIHw9IE1YMzFfSU5UUkVHX1JSRU47Ci0KLQl3cml0ZWwodmFsLCBteGNfc3BpLT5iYXNlICsgTVhDX0NTUElJTlQpOwotfQotCi1zdGF0aWMgdm9pZCBteDMxX3RyaWdnZXIoc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCi0JcmVnID0gcmVhZGwobXhjX3NwaS0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7Ci0JcmVnIHw9IE1YMzFfQ1NQSUNUUkxfWENIOwotCXdyaXRlbChyZWcsIG14Y19zcGktPmJhc2UgKyBNWENfQ1NQSUNUUkwpOwotfQotCi1zdGF0aWMgaW50IG14MzFfY29uZmlnKHN0cnVjdCBteGNfc3BpX2RhdGEgKm14Y19zcGksCi0JCXN0cnVjdCBteGNfc3BpX2NvbmZpZyAqY29uZmlnKQotewotCXVuc2lnbmVkIGludCByZWcgPSBNWDMxX0NTUElDVFJMX0VOQUJMRSB8IE1YMzFfQ1NQSUNUUkxfTUFTVEVSOwotCi0JcmVnIHw9IG14Y19zcGlfY2xrZGl2XzIobXhjX3NwaS0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeikgPDwKLQkJTVgzMV9DU1BJQ1RSTF9EUl9TSElGVDsKLQotCWlmIChjcHVfaXNfbXgzMSgpKQotCQlyZWcgfD0gKGNvbmZpZy0+YnB3IC0gMSkgPDwgTVgzMV9DU1BJQ1RSTF9CQ19TSElGVDsKLQllbHNlIGlmIChjcHVfaXNfbXgzNSgpKSB7Ci0JCXJlZyB8PSAoY29uZmlnLT5icHcgLSAxKSA8PCBNWDM1X0NTUElDVFJMX0JMX1NISUZUOwotCQlyZWcgfD0gTVgzMV9DU1BJQ1RSTF9TU0NUTDsKLQl9Ci0KLQlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NQSEEpCi0JCXJlZyB8PSBNWDMxX0NTUElDVFJMX1BIQTsKLQlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NQT0wpCi0JCXJlZyB8PSBNWDMxX0NTUElDVFJMX1BPTDsKLQlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NTX0hJR0gpCi0JCXJlZyB8PSBNWDMxX0NTUElDVFJMX1NTUE9MOwotCWlmIChjb25maWctPmNzIDwgMCkgewotCQlpZiAoY3B1X2lzX214MzEoKSkKLQkJCXJlZyB8PSAoY29uZmlnLT5jcyArIDMyKSA8PCBNWDMxX0NTUElDVFJMX0NTX1NISUZUOwotCQllbHNlIGlmIChjcHVfaXNfbXgzNSgpKQotCQkJcmVnIHw9IChjb25maWctPmNzICsgMzIpIDw8IE1YMzVfQ1NQSUNUUkxfQ1NfU0hJRlQ7Ci0JfQotCi0Jd3JpdGVsKHJlZywgbXhjX3NwaS0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteDMxX3J4X2F2YWlsYWJsZShzdHJ1Y3QgbXhjX3NwaV9kYXRhICpteGNfc3BpKQotewotCXJldHVybiByZWFkbChteGNfc3BpLT5iYXNlICsgTVgzMV9DU1BJU1RBVFVTKSAmIE1YMzFfU1RBVFVTX1JSOwotfQotCi0jZGVmaW5lIE1YMjdfSU5UUkVHX1JSCQkoMSA8PCA0KQotI2RlZmluZSBNWDI3X0lOVFJFR19URUVOCSgxIDw8IDkpCi0jZGVmaW5lIE1YMjdfSU5UUkVHX1JSRU4JKDEgPDwgMTMpCi0KLSNkZWZpbmUgTVgyN19DU1BJQ1RSTF9QT0wJKDEgPDwgNSkKLSNkZWZpbmUgTVgyN19DU1BJQ1RSTF9QSEEJKDEgPDwgNikKLSNkZWZpbmUgTVgyN19DU1BJQ1RSTF9TU1BPTAkoMSA8PCA4KQotI2RlZmluZSBNWDI3X0NTUElDVFJMX1hDSAkoMSA8PCA5KQotI2RlZmluZSBNWDI3X0NTUElDVFJMX0VOQUJMRQkoMSA8PCAxMCkKLSNkZWZpbmUgTVgyN19DU1BJQ1RSTF9NQVNURVIJKDEgPDwgMTEpCi0jZGVmaW5lIE1YMjdfQ1NQSUNUUkxfRFJfU0hJRlQJMTQKLSNkZWZpbmUgTVgyN19DU1BJQ1RSTF9DU19TSElGVAkxOQotCi1zdGF0aWMgdm9pZCBteDI3X2ludGN0cmwoc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSwgaW50IGVuYWJsZSkKLXsKLQl1bnNpZ25lZCBpbnQgdmFsID0gMDsKLQotCWlmIChlbmFibGUgJiBNWENfSU5UX1RFKQotCQl2YWwgfD0gTVgyN19JTlRSRUdfVEVFTjsKLQlpZiAoZW5hYmxlICYgTVhDX0lOVF9SUikKLQkJdmFsIHw9IE1YMjdfSU5UUkVHX1JSRU47Ci0KLQl3cml0ZWwodmFsLCBteGNfc3BpLT5iYXNlICsgTVhDX0NTUElJTlQpOwotfQotCi1zdGF0aWMgdm9pZCBteDI3X3RyaWdnZXIoc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCi0JcmVnID0gcmVhZGwobXhjX3NwaS0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7Ci0JcmVnIHw9IE1YMjdfQ1NQSUNUUkxfWENIOwotCXdyaXRlbChyZWcsIG14Y19zcGktPmJhc2UgKyBNWENfQ1NQSUNUUkwpOwotfQotCi1zdGF0aWMgaW50IG14MjdfY29uZmlnKHN0cnVjdCBteGNfc3BpX2RhdGEgKm14Y19zcGksCi0JCXN0cnVjdCBteGNfc3BpX2NvbmZpZyAqY29uZmlnKQotewotCXVuc2lnbmVkIGludCByZWcgPSBNWDI3X0NTUElDVFJMX0VOQUJMRSB8IE1YMjdfQ1NQSUNUUkxfTUFTVEVSOwotCi0JcmVnIHw9IG14Y19zcGlfY2xrZGl2XzEobXhjX3NwaS0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeikgPDwKLQkJTVgyN19DU1BJQ1RSTF9EUl9TSElGVDsKLQlyZWcgfD0gY29uZmlnLT5icHcgLSAxOwotCi0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUEhBKQotCQlyZWcgfD0gTVgyN19DU1BJQ1RSTF9QSEE7Ci0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUE9MKQotCQlyZWcgfD0gTVgyN19DU1BJQ1RSTF9QT0w7Ci0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DU19ISUdIKQotCQlyZWcgfD0gTVgyN19DU1BJQ1RSTF9TU1BPTDsKLQlpZiAoY29uZmlnLT5jcyA8IDApCi0JCXJlZyB8PSAoY29uZmlnLT5jcyArIDMyKSA8PCBNWDI3X0NTUElDVFJMX0NTX1NISUZUOwotCi0Jd3JpdGVsKHJlZywgbXhjX3NwaS0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteDI3X3J4X2F2YWlsYWJsZShzdHJ1Y3QgbXhjX3NwaV9kYXRhICpteGNfc3BpKQotewotCXJldHVybiByZWFkbChteGNfc3BpLT5iYXNlICsgTVhDX0NTUElJTlQpICYgTVgyN19JTlRSRUdfUlI7Ci19Ci0KLSNkZWZpbmUgTVgxX0lOVFJFR19SUgkJKDEgPDwgMykKLSNkZWZpbmUgTVgxX0lOVFJFR19URUVOCQkoMSA8PCA4KQotI2RlZmluZSBNWDFfSU5UUkVHX1JSRU4JCSgxIDw8IDExKQotCi0jZGVmaW5lIE1YMV9DU1BJQ1RSTF9QT0wJKDEgPDwgNCkKLSNkZWZpbmUgTVgxX0NTUElDVFJMX1BIQQkoMSA8PCA1KQotI2RlZmluZSBNWDFfQ1NQSUNUUkxfWENICSgxIDw8IDgpCi0jZGVmaW5lIE1YMV9DU1BJQ1RSTF9FTkFCTEUJKDEgPDwgOSkKLSNkZWZpbmUgTVgxX0NTUElDVFJMX01BU1RFUgkoMSA8PCAxMCkKLSNkZWZpbmUgTVgxX0NTUElDVFJMX0RSX1NISUZUCTEzCi0KLXN0YXRpYyB2b2lkIG14MV9pbnRjdHJsKHN0cnVjdCBteGNfc3BpX2RhdGEgKm14Y19zcGksIGludCBlbmFibGUpCi17Ci0JdW5zaWduZWQgaW50IHZhbCA9IDA7Ci0KLQlpZiAoZW5hYmxlICYgTVhDX0lOVF9URSkKLQkJdmFsIHw9IE1YMV9JTlRSRUdfVEVFTjsKLQlpZiAoZW5hYmxlICYgTVhDX0lOVF9SUikKLQkJdmFsIHw9IE1YMV9JTlRSRUdfUlJFTjsKLQotCXdyaXRlbCh2YWwsIG14Y19zcGktPmJhc2UgKyBNWENfQ1NQSUlOVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG14MV90cmlnZ2VyKHN0cnVjdCBteGNfc3BpX2RhdGEgKm14Y19zcGkpCi17Ci0JdW5zaWduZWQgaW50IHJlZzsKLQotCXJlZyA9IHJlYWRsKG14Y19zcGktPmJhc2UgKyBNWENfQ1NQSUNUUkwpOwotCXJlZyB8PSBNWDFfQ1NQSUNUUkxfWENIOwotCXdyaXRlbChyZWcsIG14Y19zcGktPmJhc2UgKyBNWENfQ1NQSUNUUkwpOwotfQotCi1zdGF0aWMgaW50IG14MV9jb25maWcoc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSwKLQkJc3RydWN0IG14Y19zcGlfY29uZmlnICpjb25maWcpCi17Ci0JdW5zaWduZWQgaW50IHJlZyA9IE1YMV9DU1BJQ1RSTF9FTkFCTEUgfCBNWDFfQ1NQSUNUUkxfTUFTVEVSOwotCi0JcmVnIHw9IG14Y19zcGlfY2xrZGl2XzIobXhjX3NwaS0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeikgPDwKLQkJTVgxX0NTUElDVFJMX0RSX1NISUZUOwotCXJlZyB8PSBjb25maWctPmJwdyAtIDE7Ci0KLQlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NQSEEpCi0JCXJlZyB8PSBNWDFfQ1NQSUNUUkxfUEhBOwotCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BPTCkKLQkJcmVnIHw9IE1YMV9DU1BJQ1RSTF9QT0w7Ci0KLQl3cml0ZWwocmVnLCBteGNfc3BpLT5iYXNlICsgTVhDX0NTUElDVFJMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG14MV9yeF9hdmFpbGFibGUoc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSkKLXsKLQlyZXR1cm4gcmVhZGwobXhjX3NwaS0+YmFzZSArIE1YQ19DU1BJSU5UKSAmIE1YMV9JTlRSRUdfUlI7Ci19Ci0KLXN0YXRpYyB2b2lkIG14Y19zcGlfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfYWN0aXZlKQotewotCXN0cnVjdCBteGNfc3BpX2RhdGEgKm14Y19zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1bnNpZ25lZCBpbnQgY3MgPSAwOwotCWludCBncGlvID0gbXhjX3NwaS0+Y2hpcHNlbGVjdFtzcGktPmNoaXBfc2VsZWN0XTsKLQlzdHJ1Y3QgbXhjX3NwaV9jb25maWcgY29uZmlnOwotCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKQotCQljcyA9IDE7Ci0KLQlpZiAoaXNfYWN0aXZlID09IEJJVEJBTkdfQ1NfSU5BQ1RJVkUpIHsKLQkJaWYgKGdwaW8gPj0gMCkKLQkJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sICFjcyk7Ci0JCXJldHVybjsKLQl9Ci0KLQljb25maWcuYnB3ID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCWNvbmZpZy5zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCWNvbmZpZy5tb2RlID0gc3BpLT5tb2RlOwotCWNvbmZpZy5jcyA9IG14Y19zcGktPmNoaXBzZWxlY3Rbc3BpLT5jaGlwX3NlbGVjdF07Ci0KLQlteGNfc3BpLT5jb25maWcobXhjX3NwaSwgJmNvbmZpZyk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBmdW5jdGlvbnMgZm9yIHRyYW5zZmVyICovCi0JaWYgKGNvbmZpZy5icHcgPD0gOCkgewotCQlteGNfc3BpLT5yeCA9IG14Y19zcGlfYnVmX3J4X3U4OwotCQlteGNfc3BpLT50eCA9IG14Y19zcGlfYnVmX3R4X3U4OwotCX0gZWxzZSBpZiAoY29uZmlnLmJwdyA8PSAxNikgewotCQlteGNfc3BpLT5yeCA9IG14Y19zcGlfYnVmX3J4X3UxNjsKLQkJbXhjX3NwaS0+dHggPSBteGNfc3BpX2J1Zl90eF91MTY7Ci0JfSBlbHNlIGlmIChjb25maWcuYnB3IDw9IDMyKSB7Ci0JCW14Y19zcGktPnJ4ID0gbXhjX3NwaV9idWZfcnhfdTMyOwotCQlteGNfc3BpLT50eCA9IG14Y19zcGlfYnVmX3R4X3UzMjsKLQl9IGVsc2UKLQkJQlVHKCk7Ci0KLQlpZiAoZ3BpbyA+PSAwKQotCQlncGlvX3NldF92YWx1ZShncGlvLCBjcyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIG14Y19zcGlfcHVzaChzdHJ1Y3QgbXhjX3NwaV9kYXRhICpteGNfc3BpKQotewotCXdoaWxlIChteGNfc3BpLT50eGZpZm8gPCA4KSB7Ci0JCWlmICghbXhjX3NwaS0+Y291bnQpCi0JCQlicmVhazsKLQkJbXhjX3NwaS0+dHgobXhjX3NwaSk7Ci0JCW14Y19zcGktPnR4ZmlmbysrOwotCX0KLQotCW14Y19zcGktPnRyaWdnZXIobXhjX3NwaSk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBteGNfc3BpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSA9IGRldl9pZDsKLQotCXdoaWxlIChteGNfc3BpLT5yeF9hdmFpbGFibGUobXhjX3NwaSkpIHsKLQkJbXhjX3NwaS0+cngobXhjX3NwaSk7Ci0JCW14Y19zcGktPnR4Zmlmby0tOwotCX0KLQotCWlmIChteGNfc3BpLT5jb3VudCkgewotCQlteGNfc3BpX3B1c2gobXhjX3NwaSk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAobXhjX3NwaS0+dHhmaWZvKSB7Ci0JCS8qIE5vIGRhdGEgbGVmdCB0byBwdXNoLCBidXQgc3RpbGwgd2FpdGluZyBmb3IgcnggZGF0YSwKLQkJICogZW5hYmxlIHJlY2VpdmUgZGF0YSBhdmFpbGFibGUgaW50ZXJydXB0LgotCQkgKi8KLQkJbXhjX3NwaS0+aW50Y3RybChteGNfc3BpLCBNWENfSU5UX1JSKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCW14Y19zcGktPmludGN0cmwobXhjX3NwaSwgMCk7Ci0JY29tcGxldGUoJm14Y19zcGktPnhmZXJfZG9uZSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXhjX3NwaV9zZXR1cHhmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlzdHJ1Y3QgbXhjX3NwaV9kYXRhICpteGNfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IG14Y19zcGlfY29uZmlnIGNvbmZpZzsKLQotCWNvbmZpZy5icHcgPSB0ID8gdC0+Yml0c19wZXJfd29yZCA6IHNwaS0+Yml0c19wZXJfd29yZDsKLQljb25maWcuc3BlZWRfaHogID0gdCA/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7Ci0JY29uZmlnLm1vZGUgPSBzcGktPm1vZGU7Ci0KLQlteGNfc3BpLT5jb25maWcobXhjX3NwaSwgJmNvbmZpZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteGNfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXIpCi17Ci0Jc3RydWN0IG14Y19zcGlfZGF0YSAqbXhjX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JbXhjX3NwaS0+dHhfYnVmID0gdHJhbnNmZXItPnR4X2J1ZjsKLQlteGNfc3BpLT5yeF9idWYgPSB0cmFuc2Zlci0+cnhfYnVmOwotCW14Y19zcGktPmNvdW50ID0gdHJhbnNmZXItPmxlbjsKLQlteGNfc3BpLT50eGZpZm8gPSAwOwotCi0JaW5pdF9jb21wbGV0aW9uKCZteGNfc3BpLT54ZmVyX2RvbmUpOwotCi0JbXhjX3NwaV9wdXNoKG14Y19zcGkpOwotCi0JbXhjX3NwaS0+aW50Y3RybChteGNfc3BpLCBNWENfSU5UX1RFKTsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb24oJm14Y19zcGktPnhmZXJfZG9uZSk7Ci0KLQlyZXR1cm4gdHJhbnNmZXItPmxlbjsKLX0KLQotc3RhdGljIGludCBteGNfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCi0JCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1vZGUgJWQsICV1IGJwdywgJWQgaHpcbiIsIF9fZnVuY19fLAotCQkgc3BpLT5tb2RlLCBzcGktPmJpdHNfcGVyX3dvcmQsIHNwaS0+bWF4X3NwZWVkX2h6KTsKLQotCW14Y19zcGlfY2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfSU5BQ1RJVkUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG14Y19zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotfQotCi1zdGF0aWMgaW50IF9faW5pdCBteGNfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNwaV9pbXhfbWFzdGVyICpteGNfcGxhdGZvcm1faW5mbzsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBteGNfc3BpX2RhdGEgKm14Y19zcGk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IGksIHJldDsKLQotCW14Y19wbGF0Zm9ybV9pbmZvID0gKHN0cnVjdCBzcGlfaW14X21hc3RlciAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmICghbXhjX3BsYXRmb3JtX2luZm8pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IHRoZSBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG14Y19zcGlfZGF0YSkpOwotCWlmICghbWFzdGVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7Ci0KLQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKLQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gbXhjX3BsYXRmb3JtX2luZm8tPm51bV9jaGlwc2VsZWN0OwotCi0JbXhjX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlteGNfc3BpLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7Ci0JbXhjX3NwaS0+Y2hpcHNlbGVjdCA9IG14Y19wbGF0Zm9ybV9pbmZvLT5jaGlwc2VsZWN0OwotCi0JZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgewotCQlpZiAobXhjX3NwaS0+Y2hpcHNlbGVjdFtpXSA8IDApCi0JCQljb250aW51ZTsKLQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KG14Y19zcGktPmNoaXBzZWxlY3RbaV0sIERSSVZFUl9OQU1FKTsKLQkJaWYgKHJldCkgewotCQkJaS0tOwotCQkJd2hpbGUgKGkgPiAwKQotCQkJCWlmIChteGNfc3BpLT5jaGlwc2VsZWN0W2ldID49IDApCi0JCQkJCWdwaW9fZnJlZShteGNfc3BpLT5jaGlwc2VsZWN0W2ktLV0pOwotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGNzIGdwaW9zIik7Ci0JCQlnb3RvIG91dF9tYXN0ZXJfcHV0OwotCQl9Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChteGNfc3BpLT5jaGlwc2VsZWN0W2ldLCAxKTsKLQl9Ci0KLQlteGNfc3BpLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBteGNfc3BpX2NoaXBzZWxlY3Q7Ci0JbXhjX3NwaS0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IG14Y19zcGlfc2V0dXB4ZmVyOwotCW14Y19zcGktPmJpdGJhbmcudHhyeF9idWZzID0gbXhjX3NwaV90cmFuc2ZlcjsKLQlteGNfc3BpLT5iaXRiYW5nLm1hc3Rlci0+c2V0dXAgPSBteGNfc3BpX3NldHVwOwotCW14Y19zcGktPmJpdGJhbmcubWFzdGVyLT5jbGVhbnVwID0gbXhjX3NwaV9jbGVhbnVwOwotCi0JaW5pdF9jb21wbGV0aW9uKCZteGNfc3BpLT54ZmVyX2RvbmUpOwotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgcGxhdGZvcm0gcmVzb3VyY2VcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9ncGlvX2ZyZWU7Ci0JfQotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkXG4iKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dF9ncGlvX2ZyZWU7Ci0JfQotCi0JbXhjX3NwaS0+YmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlpZiAoIW14Y19zcGktPmJhc2UpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfcmVsZWFzZV9tZW07Ci0JfQotCi0JbXhjX3NwaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoIW14Y19zcGktPmlycSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9pb3VubWFwOwotCX0KLQotCXJldCA9IHJlcXVlc3RfaXJxKG14Y19zcGktPmlycSwgbXhjX3NwaV9pc3IsIDAsIERSSVZFUl9OQU1FLCBteGNfc3BpKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBpcnElZDogJWRcbiIsIG14Y19zcGktPmlycSwgcmV0KTsKLQkJZ290byBvdXRfaW91bm1hcDsKLQl9Ci0KLQlpZiAoY3B1X2lzX214MzEoKSB8fCBjcHVfaXNfbXgzNSgpKSB7Ci0JCW14Y19zcGktPmludGN0cmwgPSBteDMxX2ludGN0cmw7Ci0JCW14Y19zcGktPmNvbmZpZyA9IG14MzFfY29uZmlnOwotCQlteGNfc3BpLT50cmlnZ2VyID0gbXgzMV90cmlnZ2VyOwotCQlteGNfc3BpLT5yeF9hdmFpbGFibGUgPSBteDMxX3J4X2F2YWlsYWJsZTsKLQl9IGVsc2UgIGlmIChjcHVfaXNfbXgyNygpIHx8IGNwdV9pc19teDIxKCkpIHsKLQkJbXhjX3NwaS0+aW50Y3RybCA9IG14MjdfaW50Y3RybDsKLQkJbXhjX3NwaS0+Y29uZmlnID0gbXgyN19jb25maWc7Ci0JCW14Y19zcGktPnRyaWdnZXIgPSBteDI3X3RyaWdnZXI7Ci0JCW14Y19zcGktPnJ4X2F2YWlsYWJsZSA9IG14MjdfcnhfYXZhaWxhYmxlOwotCX0gZWxzZSBpZiAoY3B1X2lzX214MSgpKSB7Ci0JCW14Y19zcGktPmludGN0cmwgPSBteDFfaW50Y3RybDsKLQkJbXhjX3NwaS0+Y29uZmlnID0gbXgxX2NvbmZpZzsKLQkJbXhjX3NwaS0+dHJpZ2dlciA9IG14MV90cmlnZ2VyOwotCQlteGNfc3BpLT5yeF9hdmFpbGFibGUgPSBteDFfcnhfYXZhaWxhYmxlOwotCX0gZWxzZQotCQlCVUcoKTsKLQotCW14Y19zcGktPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Ci0JaWYgKElTX0VSUihteGNfc3BpLT5jbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgY2xvY2tcbiIpOwotCQlyZXQgPSBQVFJfRVJSKG14Y19zcGktPmNsayk7Ci0JCWdvdG8gb3V0X2ZyZWVfaXJxOwotCX0KLQotCWNsa19lbmFibGUobXhjX3NwaS0+Y2xrKTsKLQlteGNfc3BpLT5zcGlfY2xrID0gY2xrX2dldF9yYXRlKG14Y19zcGktPmNsayk7Ci0KLQlpZiAoIWNwdV9pc19teDMxKCkgfHwgIWNwdV9pc19teDM1KCkpCi0JCXdyaXRlbCgxLCBteGNfc3BpLT5iYXNlICsgTVhDX1JFU0VUKTsKLQotCW14Y19zcGktPmludGN0cmwobXhjX3NwaSwgMCk7Ci0KLQlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmbXhjX3NwaS0+Yml0YmFuZyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJiaXRiYW5nIHN0YXJ0IGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9jbGtfcHV0OwotCX0KLQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwcm9iZWRcbiIpOwotCi0JcmV0dXJuIHJldDsKLQotb3V0X2Nsa19wdXQ6Ci0JY2xrX2Rpc2FibGUobXhjX3NwaS0+Y2xrKTsKLQljbGtfcHV0KG14Y19zcGktPmNsayk7Ci1vdXRfZnJlZV9pcnE6Ci0JZnJlZV9pcnEobXhjX3NwaS0+aXJxLCBteGNfc3BpKTsKLW91dF9pb3VubWFwOgotCWlvdW5tYXAobXhjX3NwaS0+YmFzZSk7Ci1vdXRfcmVsZWFzZV9tZW06Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci1vdXRfZ3Bpb19mcmVlOgotCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspCi0JCWlmIChteGNfc3BpLT5jaGlwc2VsZWN0W2ldID49IDApCi0JCQlncGlvX2ZyZWUobXhjX3NwaS0+Y2hpcHNlbGVjdFtpXSk7Ci1vdXRfbWFzdGVyX3B1dDoKLQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwotCWtmcmVlKG1hc3Rlcik7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgbXhjX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXN0cnVjdCBteGNfc3BpX2RhdGEgKm14Y19zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JaW50IGk7Ci0KLQlzcGlfYml0YmFuZ19zdG9wKCZteGNfc3BpLT5iaXRiYW5nKTsKLQotCXdyaXRlbCgwLCBteGNfc3BpLT5iYXNlICsgTVhDX0NTUElDVFJMKTsKLQljbGtfZGlzYWJsZShteGNfc3BpLT5jbGspOwotCWNsa19wdXQobXhjX3NwaS0+Y2xrKTsKLQlmcmVlX2lycShteGNfc3BpLT5pcnEsIG14Y19zcGkpOwotCWlvdW5tYXAobXhjX3NwaS0+YmFzZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKQotCQlpZiAobXhjX3NwaS0+Y2hpcHNlbGVjdFtpXSA+PSAwKQotCQkJZ3Bpb19mcmVlKG14Y19zcGktPmNoaXBzZWxlY3RbaV0pOwotCi0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQotCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXhjX3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSBEUklWRVJfTkFNRSwKLQkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCSAgIH0sCi0JLnByb2JlID0gbXhjX3NwaV9wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AobXhjX3NwaV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXhjX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhjX3NwaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXhjX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm14Y19zcGlfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXhjX3NwaV9pbml0KTsKLW1vZHVsZV9leGl0KG14Y19zcGlfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiU1BJIE1hc3RlciBDb250cm9sbGVyIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCmluZGV4IDMxZGQ1NmYuLmM4YzJiNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKQEAgLTE2NjgsMTAgKzE2NjgsOSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCi0KLXN0YXRpYyBpbnQgcHhhMnh4X3NwaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhMnh4X3NwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzc3BfZGV2aWNlICpzc3AgPSBkcnZfZGF0YS0+c3NwOwogCWludCBzdGF0dXMgPSAwOwogCkBAIC0xNjg0LDkgKzE2ODMsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YTJ4eF9zcGlfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHB4YTJ4eF9zcGlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzc3BfZGV2aWNlICpzc3AgPSBkcnZfZGF0YS0+c3NwOwogCWludCBzdGF0dXMgPSAwOwogCkBAIC0xNzAzLDI2ICsxNzAyLDI5IEBACiAJLyogU3RhcnQgdGhlIHF1ZXVlIHJ1bm5pbmcgKi8KIAlzdGF0dXMgPSBzdGFydF9xdWV1ZShkcnZfZGF0YSk7CiAJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInByb2JsZW0gc3RhcnRpbmcgcXVldWUgKCVkKVxuIiwgc3RhdHVzKTsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHF1ZXVlICglZClcbiIsIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJcmV0dXJuIDA7CiB9Ci0jZWxzZQotI2RlZmluZSBweGEyeHhfc3BpX3N1c3BlbmQgTlVMTAotI2RlZmluZSBweGEyeHhfc3BpX3Jlc3VtZSBOVUxMCi0jZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBweGEyeHhfc3BpX3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IHB4YTJ4eF9zcGlfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHB4YTJ4eF9zcGlfcmVzdW1lLAorfTsKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAicHhhMnh4LXNwaSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJweGEyeHgtc3BpIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9ICZweGEyeHhfc3BpX3BtX29wcywKKyNlbmRpZgogCX0sCiAJLnJlbW92ZSA9IHB4YTJ4eF9zcGlfcmVtb3ZlLAogCS5zaHV0ZG93biA9IHB4YTJ4eF9zcGlfc2h1dGRvd24sCi0JLnN1c3BlbmQgPSBweGEyeHhfc3BpX3N1c3BlbmQsCi0JLnJlc3VtZSA9IHB4YTJ4eF9zcGlfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcHhhMnh4X3NwaV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfaW14LmMgYi9kcml2ZXJzL3NwaS9zcGlfaW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljMjJlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9pbXguYwpAQCAtMCwwICsxLDY4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBKdWVyZ2VuIEJlaXNlcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bWFjaC9zcGkuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRSAic3BpX2lteCIKKworI2RlZmluZSBNWENfQ1NQSVJYREFUQQkJMHgwMAorI2RlZmluZSBNWENfQ1NQSVRYREFUQQkJMHgwNAorI2RlZmluZSBNWENfQ1NQSUNUUkwJCTB4MDgKKyNkZWZpbmUgTVhDX0NTUElJTlQJCTB4MGMKKyNkZWZpbmUgTVhDX1JFU0VUCQkweDFjCisKKy8qIGdlbmVyaWMgZGVmaW5lcyB0byBhYnN0cmFjdCBmcm9tIHRoZSBkaWZmZXJlbnQgcmVnaXN0ZXIgbGF5b3V0cyAqLworI2RlZmluZSBNWENfSU5UX1JSCSgxIDw8IDApIC8qIFJlY2VpdmUgZGF0YSByZWFkeSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTVhDX0lOVF9URQkoMSA8PCAxKSAvKiBUcmFuc21pdCBGSUZPIGVtcHR5IGludGVycnVwdCAqLworCitzdHJ1Y3Qgc3BpX2lteF9jb25maWcgeworCXVuc2lnbmVkIGludCBzcGVlZF9oejsKKwl1bnNpZ25lZCBpbnQgYnB3OworCXVuc2lnbmVkIGludCBtb2RlOworCWludCBjczsKK307CisKK3N0cnVjdCBzcGlfaW14X2RhdGEgeworCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOworCisJc3RydWN0IGNvbXBsZXRpb24geGZlcl9kb25lOworCXZvaWQgKmJhc2U7CisJaW50IGlycTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdW5zaWduZWQgbG9uZyBzcGlfY2xrOworCWludCAqY2hpcHNlbGVjdDsKKworCXVuc2lnbmVkIGludCBjb3VudDsKKwl2b2lkICgqdHgpKHN0cnVjdCBzcGlfaW14X2RhdGEgKik7CisJdm9pZCAoKnJ4KShzdHJ1Y3Qgc3BpX2lteF9kYXRhICopOworCXZvaWQgKnJ4X2J1ZjsKKwljb25zdCB2b2lkICp0eF9idWY7CisJdW5zaWduZWQgaW50IHR4ZmlmbzsgLyogbnVtYmVyIG9mIHdvcmRzIHB1c2hlZCBpbiB0eCBGSUZPICovCisKKwkvKiBTb0Mgc3BlY2lmaWMgZnVuY3Rpb25zICovCisJdm9pZCAoKmludGN0cmwpKHN0cnVjdCBzcGlfaW14X2RhdGEgKiwgaW50KTsKKwlpbnQgKCpjb25maWcpKHN0cnVjdCBzcGlfaW14X2RhdGEgKiwgc3RydWN0IHNwaV9pbXhfY29uZmlnICopOworCXZvaWQgKCp0cmlnZ2VyKShzdHJ1Y3Qgc3BpX2lteF9kYXRhICopOworCWludCAoKnJ4X2F2YWlsYWJsZSkoc3RydWN0IHNwaV9pbXhfZGF0YSAqKTsKK307CisKKyNkZWZpbmUgTVhDX1NQSV9CVUZfUlgodHlwZSkJCQkJCQlcCitzdGF0aWMgdm9pZCBzcGlfaW14X2J1Zl9yeF8jI3R5cGUoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkJCVwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgaW50IHZhbCA9IHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSVJYREFUQSk7CVwKKwkJCQkJCQkJCVwKKwlpZiAoc3BpX2lteC0+cnhfYnVmKSB7CQkJCQkJXAorCQkqKHR5cGUgKilzcGlfaW14LT5yeF9idWYgPSB2YWw7CQkJCVwKKwkJc3BpX2lteC0+cnhfYnVmICs9IHNpemVvZih0eXBlKTsJCQlcCisJfQkJCQkJCQkJXAorfQorCisjZGVmaW5lIE1YQ19TUElfQlVGX1RYKHR5cGUpCQkJCQkJXAorc3RhdGljIHZvaWQgc3BpX2lteF9idWZfdHhfIyN0eXBlKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCQlcCit7CQkJCQkJCQkJXAorCXR5cGUgdmFsID0gMDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmIChzcGlfaW14LT50eF9idWYpIHsJCQkJCQlcCisJCXZhbCA9ICoodHlwZSAqKXNwaV9pbXgtPnR4X2J1ZjsJCQkJXAorCQlzcGlfaW14LT50eF9idWYgKz0gc2l6ZW9mKHR5cGUpOwkJCVwKKwl9CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJc3BpX2lteC0+Y291bnQgLT0gc2l6ZW9mKHR5cGUpOwkJCQkJXAorCQkJCQkJCQkJXAorCXdyaXRlbCh2YWwsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSVRYREFUQSk7CQkJXAorfQorCitNWENfU1BJX0JVRl9SWCh1OCkKK01YQ19TUElfQlVGX1RYKHU4KQorTVhDX1NQSV9CVUZfUlgodTE2KQorTVhDX1NQSV9CVUZfVFgodTE2KQorTVhDX1NQSV9CVUZfUlgodTMyKQorTVhDX1NQSV9CVUZfVFgodTMyKQorCisvKiBGaXJzdCBlbnRyeSBpcyByZXNlcnZlZCwgc2Vjb25kIGVudHJ5IGlzIHZhbGlkIG9ubHkgaWYgU0RIQ19TUElFTiBpcyBzZXQKKyAqICh3aGljaCBpcyBjdXJyZW50bHkgbm90IHRoZSBjYXNlIGluIHRoaXMgZHJpdmVyKQorICovCitzdGF0aWMgaW50IG14Y19jbGtkaXZzW10gPSB7MCwgMywgNCwgNiwgOCwgMTIsIDE2LCAyNCwgMzIsIDQ4LCA2NCwgOTYsIDEyOCwgMTkyLAorCTI1NiwgMzg0LCA1MTIsIDc2OCwgMTAyNH07CisKKy8qIE1YMjEsIE1YMjcgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3BpX2lteF9jbGtkaXZfMSh1bnNpZ25lZCBpbnQgZmluLAorCQl1bnNpZ25lZCBpbnQgZnNwaSkKK3sKKwlpbnQgaSwgbWF4OworCisJaWYgKGNwdV9pc19teDIxKCkpCisJCW1heCA9IDE4OworCWVsc2UKKwkJbWF4ID0gMTY7CisKKwlmb3IgKGkgPSAyOyBpIDwgbWF4OyBpKyspCisJCWlmIChmc3BpICogbXhjX2Nsa2RpdnNbaV0gPj0gZmluKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gbWF4OworfQorCisvKiBNWDEsIE1YMzEsIE1YMzUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3BpX2lteF9jbGtkaXZfMih1bnNpZ25lZCBpbnQgZmluLAorCQl1bnNpZ25lZCBpbnQgZnNwaSkKK3sKKwlpbnQgaSwgZGl2ID0gNDsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaWYgKGZzcGkgKiBkaXYgPj0gZmluKQorCQkJcmV0dXJuIGk7CisJCWRpdiA8PD0gMTsKKwl9CisKKwlyZXR1cm4gNzsKK30KKworI2RlZmluZSBNWDMxX0lOVFJFR19URUVOCSgxIDw8IDApCisjZGVmaW5lIE1YMzFfSU5UUkVHX1JSRU4JKDEgPDwgMykKKworI2RlZmluZSBNWDMxX0NTUElDVFJMX0VOQUJMRQkoMSA8PCAwKQorI2RlZmluZSBNWDMxX0NTUElDVFJMX01BU1RFUgkoMSA8PCAxKQorI2RlZmluZSBNWDMxX0NTUElDVFJMX1hDSAkoMSA8PCAyKQorI2RlZmluZSBNWDMxX0NTUElDVFJMX1BPTAkoMSA8PCA0KQorI2RlZmluZSBNWDMxX0NTUElDVFJMX1BIQQkoMSA8PCA1KQorI2RlZmluZSBNWDMxX0NTUElDVFJMX1NTQ1RMCSgxIDw8IDYpCisjZGVmaW5lIE1YMzFfQ1NQSUNUUkxfU1NQT0wJKDEgPDwgNykKKyNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9CQ19TSElGVAk4CisjZGVmaW5lIE1YMzVfQ1NQSUNUUkxfQkxfU0hJRlQJMjAKKyNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9DU19TSElGVAkyNAorI2RlZmluZSBNWDM1X0NTUElDVFJMX0NTX1NISUZUCTEyCisjZGVmaW5lIE1YMzFfQ1NQSUNUUkxfRFJfU0hJRlQJMTYKKworI2RlZmluZSBNWDMxX0NTUElTVEFUVVMJCTB4MTQKKyNkZWZpbmUgTVgzMV9TVEFUVVNfUlIJCSgxIDw8IDMpCisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhbHNvIHdvcmsgZm9yIHRoZSBpLk1YMzUsIGJ1dCBiZSBhd2FyZSB0aGF0CisgKiB0aGUgaS5NWDM1IGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCByZWdpc3RlciBsYXlvdXQgZm9yIGJpdHMKKyAqIHdlIGRvIG5vdCB1c2UgaGVyZS4KKyAqLworc3RhdGljIHZvaWQgbXgzMV9pbnRjdHJsKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwlpZiAoZW5hYmxlICYgTVhDX0lOVF9URSkKKwkJdmFsIHw9IE1YMzFfSU5UUkVHX1RFRU47CisJaWYgKGVuYWJsZSAmIE1YQ19JTlRfUlIpCisJCXZhbCB8PSBNWDMxX0lOVFJFR19SUkVOOworCisJd3JpdGVsKHZhbCwgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJSU5UKTsKK30KKworc3RhdGljIHZvaWQgbXgzMV90cmlnZ2VyKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworCXJlZyB8PSBNWDMxX0NTUElDVFJMX1hDSDsKKwl3cml0ZWwocmVnLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKK30KKworc3RhdGljIGludCBteDMxX2NvbmZpZyhzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LAorCQlzdHJ1Y3Qgc3BpX2lteF9jb25maWcgKmNvbmZpZykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0gTVgzMV9DU1BJQ1RSTF9FTkFCTEUgfCBNWDMxX0NTUElDVFJMX01BU1RFUjsKKworCXJlZyB8PSBzcGlfaW14X2Nsa2Rpdl8yKHNwaV9pbXgtPnNwaV9jbGssIGNvbmZpZy0+c3BlZWRfaHopIDw8CisJCU1YMzFfQ1NQSUNUUkxfRFJfU0hJRlQ7CisKKwlpZiAoY3B1X2lzX214MzEoKSkKKwkJcmVnIHw9IChjb25maWctPmJwdyAtIDEpIDw8IE1YMzFfQ1NQSUNUUkxfQkNfU0hJRlQ7CisJZWxzZSBpZiAoY3B1X2lzX214MzUoKSkgeworCQlyZWcgfD0gKGNvbmZpZy0+YnB3IC0gMSkgPDwgTVgzNV9DU1BJQ1RSTF9CTF9TSElGVDsKKwkJcmVnIHw9IE1YMzFfQ1NQSUNUUkxfU1NDVEw7CisJfQorCisJaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUEhBKQorCQlyZWcgfD0gTVgzMV9DU1BJQ1RSTF9QSEE7CisJaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUE9MKQorCQlyZWcgfD0gTVgzMV9DU1BJQ1RSTF9QT0w7CisJaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DU19ISUdIKQorCQlyZWcgfD0gTVgzMV9DU1BJQ1RSTF9TU1BPTDsKKwlpZiAoY29uZmlnLT5jcyA8IDApIHsKKwkJaWYgKGNwdV9pc19teDMxKCkpCisJCQlyZWcgfD0gKGNvbmZpZy0+Y3MgKyAzMikgPDwgTVgzMV9DU1BJQ1RSTF9DU19TSElGVDsKKwkJZWxzZSBpZiAoY3B1X2lzX214MzUoKSkKKwkJCXJlZyB8PSAoY29uZmlnLT5jcyArIDMyKSA8PCBNWDM1X0NTUElDVFJMX0NTX1NISUZUOworCX0KKworCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXgzMV9yeF9hdmFpbGFibGUoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKK3sKKwlyZXR1cm4gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YMzFfQ1NQSVNUQVRVUykgJiBNWDMxX1NUQVRVU19SUjsKK30KKworI2RlZmluZSBNWDI3X0lOVFJFR19SUgkJKDEgPDwgNCkKKyNkZWZpbmUgTVgyN19JTlRSRUdfVEVFTgkoMSA8PCA5KQorI2RlZmluZSBNWDI3X0lOVFJFR19SUkVOCSgxIDw8IDEzKQorCisjZGVmaW5lIE1YMjdfQ1NQSUNUUkxfUE9MCSgxIDw8IDUpCisjZGVmaW5lIE1YMjdfQ1NQSUNUUkxfUEhBCSgxIDw8IDYpCisjZGVmaW5lIE1YMjdfQ1NQSUNUUkxfU1NQT0wJKDEgPDwgOCkKKyNkZWZpbmUgTVgyN19DU1BJQ1RSTF9YQ0gJKDEgPDwgOSkKKyNkZWZpbmUgTVgyN19DU1BJQ1RSTF9FTkFCTEUJKDEgPDwgMTApCisjZGVmaW5lIE1YMjdfQ1NQSUNUUkxfTUFTVEVSCSgxIDw8IDExKQorI2RlZmluZSBNWDI3X0NTUElDVFJMX0RSX1NISUZUCTE0CisjZGVmaW5lIE1YMjdfQ1NQSUNUUkxfQ1NfU0hJRlQJMTkKKworc3RhdGljIHZvaWQgbXgyN19pbnRjdHJsKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwlpZiAoZW5hYmxlICYgTVhDX0lOVF9URSkKKwkJdmFsIHw9IE1YMjdfSU5UUkVHX1RFRU47CisJaWYgKGVuYWJsZSAmIE1YQ19JTlRfUlIpCisJCXZhbCB8PSBNWDI3X0lOVFJFR19SUkVOOworCisJd3JpdGVsKHZhbCwgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJSU5UKTsKK30KKworc3RhdGljIHZvaWQgbXgyN190cmlnZ2VyKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworCXJlZyB8PSBNWDI3X0NTUElDVFJMX1hDSDsKKwl3cml0ZWwocmVnLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKK30KKworc3RhdGljIGludCBteDI3X2NvbmZpZyhzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LAorCQlzdHJ1Y3Qgc3BpX2lteF9jb25maWcgKmNvbmZpZykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0gTVgyN19DU1BJQ1RSTF9FTkFCTEUgfCBNWDI3X0NTUElDVFJMX01BU1RFUjsKKworCXJlZyB8PSBzcGlfaW14X2Nsa2Rpdl8xKHNwaV9pbXgtPnNwaV9jbGssIGNvbmZpZy0+c3BlZWRfaHopIDw8CisJCU1YMjdfQ1NQSUNUUkxfRFJfU0hJRlQ7CisJcmVnIHw9IGNvbmZpZy0+YnB3IC0gMTsKKworCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BIQSkKKwkJcmVnIHw9IE1YMjdfQ1NQSUNUUkxfUEhBOworCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BPTCkKKwkJcmVnIHw9IE1YMjdfQ1NQSUNUUkxfUE9MOworCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1NfSElHSCkKKwkJcmVnIHw9IE1YMjdfQ1NQSUNUUkxfU1NQT0w7CisJaWYgKGNvbmZpZy0+Y3MgPCAwKQorCQlyZWcgfD0gKGNvbmZpZy0+Y3MgKyAzMikgPDwgTVgyN19DU1BJQ1RSTF9DU19TSElGVDsKKworCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXgyN19yeF9hdmFpbGFibGUoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKK3sKKwlyZXR1cm4gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJSU5UKSAmIE1YMjdfSU5UUkVHX1JSOworfQorCisjZGVmaW5lIE1YMV9JTlRSRUdfUlIJCSgxIDw8IDMpCisjZGVmaW5lIE1YMV9JTlRSRUdfVEVFTgkJKDEgPDwgOCkKKyNkZWZpbmUgTVgxX0lOVFJFR19SUkVOCQkoMSA8PCAxMSkKKworI2RlZmluZSBNWDFfQ1NQSUNUUkxfUE9MCSgxIDw8IDQpCisjZGVmaW5lIE1YMV9DU1BJQ1RSTF9QSEEJKDEgPDwgNSkKKyNkZWZpbmUgTVgxX0NTUElDVFJMX1hDSAkoMSA8PCA4KQorI2RlZmluZSBNWDFfQ1NQSUNUUkxfRU5BQkxFCSgxIDw8IDkpCisjZGVmaW5lIE1YMV9DU1BJQ1RSTF9NQVNURVIJKDEgPDwgMTApCisjZGVmaW5lIE1YMV9DU1BJQ1RSTF9EUl9TSElGVAkxMworCitzdGF0aWMgdm9pZCBteDFfaW50Y3RybChzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJaWYgKGVuYWJsZSAmIE1YQ19JTlRfVEUpCisJCXZhbCB8PSBNWDFfSU5UUkVHX1RFRU47CisJaWYgKGVuYWJsZSAmIE1YQ19JTlRfUlIpCisJCXZhbCB8PSBNWDFfSU5UUkVHX1JSRU47CisKKwl3cml0ZWwodmFsLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElJTlQpOworfQorCitzdGF0aWMgdm9pZCBteDFfdHJpZ2dlcihzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14KQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSByZWFkbChzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKKwlyZWcgfD0gTVgxX0NTUElDVFJMX1hDSDsKKwl3cml0ZWwocmVnLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKK30KKworc3RhdGljIGludCBteDFfY29uZmlnKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgsCisJCXN0cnVjdCBzcGlfaW14X2NvbmZpZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGludCByZWcgPSBNWDFfQ1NQSUNUUkxfRU5BQkxFIHwgTVgxX0NTUElDVFJMX01BU1RFUjsKKworCXJlZyB8PSBzcGlfaW14X2Nsa2Rpdl8yKHNwaV9pbXgtPnNwaV9jbGssIGNvbmZpZy0+c3BlZWRfaHopIDw8CisJCU1YMV9DU1BJQ1RSTF9EUl9TSElGVDsKKwlyZWcgfD0gY29uZmlnLT5icHcgLSAxOworCisJaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUEhBKQorCQlyZWcgfD0gTVgxX0NTUElDVFJMX1BIQTsKKwlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NQT0wpCisJCXJlZyB8PSBNWDFfQ1NQSUNUUkxfUE9MOworCisJd3JpdGVsKHJlZywgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteDFfcnhfYXZhaWxhYmxlKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJcmV0dXJuIHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUlOVCkgJiBNWDFfSU5UUkVHX1JSOworfQorCitzdGF0aWMgdm9pZCBzcGlfaW14X2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX2FjdGl2ZSkKK3sKKwlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJaW50IGdwaW8gPSBzcGlfaW14LT5jaGlwc2VsZWN0W3NwaS0+Y2hpcF9zZWxlY3RdOworCWludCBhY3RpdmUgPSBpc19hY3RpdmUgIT0gQklUQkFOR19DU19JTkFDVElWRTsKKwlpbnQgZGV2X2lzX2xvd2FjdGl2ZSA9ICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpOworCisJaWYgKGdwaW8gPCAwKQorCQlyZXR1cm47CisKKwlncGlvX3NldF92YWx1ZShncGlvLCBkZXZfaXNfbG93YWN0aXZlIF4gYWN0aXZlKTsKK30KKworc3RhdGljIHZvaWQgc3BpX2lteF9wdXNoKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJd2hpbGUgKHNwaV9pbXgtPnR4ZmlmbyA8IDgpIHsKKwkJaWYgKCFzcGlfaW14LT5jb3VudCkKKwkJCWJyZWFrOworCQlzcGlfaW14LT50eChzcGlfaW14KTsKKwkJc3BpX2lteC0+dHhmaWZvKys7CisJfQorCisJc3BpX2lteC0+dHJpZ2dlcihzcGlfaW14KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNwaV9pbXhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gZGV2X2lkOworCisJd2hpbGUgKHNwaV9pbXgtPnJ4X2F2YWlsYWJsZShzcGlfaW14KSkgeworCQlzcGlfaW14LT5yeChzcGlfaW14KTsKKwkJc3BpX2lteC0+dHhmaWZvLS07CisJfQorCisJaWYgKHNwaV9pbXgtPmNvdW50KSB7CisJCXNwaV9pbXhfcHVzaChzcGlfaW14KTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChzcGlfaW14LT50eGZpZm8pIHsKKwkJLyogTm8gZGF0YSBsZWZ0IHRvIHB1c2gsIGJ1dCBzdGlsbCB3YWl0aW5nIGZvciByeCBkYXRhLAorCQkgKiBlbmFibGUgcmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSBpbnRlcnJ1cHQuCisJCSAqLworCQlzcGlfaW14LT5pbnRjdHJsKHNwaV9pbXgsIE1YQ19JTlRfUlIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc3BpX2lteC0+aW50Y3RybChzcGlfaW14LCAwKTsKKwljb21wbGV0ZSgmc3BpX2lteC0+eGZlcl9kb25lKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzcGlfaW14X3NldHVweGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXggPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3Qgc3BpX2lteF9jb25maWcgY29uZmlnOworCisJY29uZmlnLmJwdyA9IHQgPyB0LT5iaXRzX3Blcl93b3JkIDogc3BpLT5iaXRzX3Blcl93b3JkOworCWNvbmZpZy5zcGVlZF9oeiAgPSB0ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKKwljb25maWcubW9kZSA9IHNwaS0+bW9kZTsKKwljb25maWcuY3MgPSBzcGlfaW14LT5jaGlwc2VsZWN0W3NwaS0+Y2hpcF9zZWxlY3RdOworCisJaWYgKCFjb25maWcuc3BlZWRfaHopCisJCWNvbmZpZy5zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6OworCWlmICghY29uZmlnLmJwdykKKwkJY29uZmlnLmJwdyA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwlpZiAoIWNvbmZpZy5zcGVlZF9oeikKKwkJY29uZmlnLnNwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CisKKwkvKiBJbml0aWFsaXplIHRoZSBmdW5jdGlvbnMgZm9yIHRyYW5zZmVyICovCisJaWYgKGNvbmZpZy5icHcgPD0gOCkgeworCQlzcGlfaW14LT5yeCA9IHNwaV9pbXhfYnVmX3J4X3U4OworCQlzcGlfaW14LT50eCA9IHNwaV9pbXhfYnVmX3R4X3U4OworCX0gZWxzZSBpZiAoY29uZmlnLmJwdyA8PSAxNikgeworCQlzcGlfaW14LT5yeCA9IHNwaV9pbXhfYnVmX3J4X3UxNjsKKwkJc3BpX2lteC0+dHggPSBzcGlfaW14X2J1Zl90eF91MTY7CisJfSBlbHNlIGlmIChjb25maWcuYnB3IDw9IDMyKSB7CisJCXNwaV9pbXgtPnJ4ID0gc3BpX2lteF9idWZfcnhfdTMyOworCQlzcGlfaW14LT50eCA9IHNwaV9pbXhfYnVmX3R4X3UzMjsKKwl9IGVsc2UKKwkJQlVHKCk7CisKKwlzcGlfaW14LT5jb25maWcoc3BpX2lteCwgJmNvbmZpZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGlfaW14X3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXIpCit7CisJc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJc3BpX2lteC0+dHhfYnVmID0gdHJhbnNmZXItPnR4X2J1ZjsKKwlzcGlfaW14LT5yeF9idWYgPSB0cmFuc2Zlci0+cnhfYnVmOworCXNwaV9pbXgtPmNvdW50ID0gdHJhbnNmZXItPmxlbjsKKwlzcGlfaW14LT50eGZpZm8gPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZzcGlfaW14LT54ZmVyX2RvbmUpOworCisJc3BpX2lteF9wdXNoKHNwaV9pbXgpOworCisJc3BpX2lteC0+aW50Y3RybChzcGlfaW14LCBNWENfSU5UX1RFKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNwaV9pbXgtPnhmZXJfZG9uZSk7CisKKwlyZXR1cm4gdHJhbnNmZXItPmxlbjsKK30KKworc3RhdGljIGludCBzcGlfaW14X3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCWludCBncGlvID0gc3BpX2lteC0+Y2hpcHNlbGVjdFtzcGktPmNoaXBfc2VsZWN0XTsKKworCXByX2RlYnVnKCIlczogbW9kZSAlZCwgJXUgYnB3LCAlZCBoelxuIiwgX19mdW5jX18sCisJCSBzcGktPm1vZGUsIHNwaS0+Yml0c19wZXJfd29yZCwgc3BpLT5tYXhfc3BlZWRfaHopOworCisJaWYgKGdwaW8gPj0gMCkKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMCA6IDEpOworCisJc3BpX2lteF9jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BpX2lteF9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV9pbXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgKm14Y19wbGF0Zm9ybV9pbmZvOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgcmV0OworCisJbXhjX3BsYXRmb3JtX2luZm8gPSAoc3RydWN0IHNwaV9pbXhfbWFzdGVyICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFteGNfcGxhdGZvcm1faW5mbykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgdGhlIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3BpX2lteF9kYXRhKSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKKworCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBteGNfcGxhdGZvcm1faW5mby0+bnVtX2NoaXBzZWxlY3Q7CisKKwlzcGlfaW14ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKwlzcGlfaW14LT5jaGlwc2VsZWN0ID0gbXhjX3BsYXRmb3JtX2luZm8tPmNoaXBzZWxlY3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7CisJCWlmIChzcGlfaW14LT5jaGlwc2VsZWN0W2ldIDwgMCkKKwkJCWNvbnRpbnVlOworCQlyZXQgPSBncGlvX3JlcXVlc3Qoc3BpX2lteC0+Y2hpcHNlbGVjdFtpXSwgRFJJVkVSX05BTUUpOworCQlpZiAocmV0KSB7CisJCQlpLS07CisJCQl3aGlsZSAoaSA+IDApCisJCQkJaWYgKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0gPj0gMCkKKwkJCQkJZ3Bpb19mcmVlKHNwaV9pbXgtPmNoaXBzZWxlY3RbaS0tXSk7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgY3MgZ3Bpb3MiKTsKKwkJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CisJCX0KKwl9CisKKwlzcGlfaW14LT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzcGlfaW14X2NoaXBzZWxlY3Q7CisJc3BpX2lteC0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHNwaV9pbXhfc2V0dXB4ZmVyOworCXNwaV9pbXgtPmJpdGJhbmcudHhyeF9idWZzID0gc3BpX2lteF90cmFuc2ZlcjsKKwlzcGlfaW14LT5iaXRiYW5nLm1hc3Rlci0+c2V0dXAgPSBzcGlfaW14X3NldHVwOworCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyLT5jbGVhbnVwID0gc3BpX2lteF9jbGVhbnVwOworCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CisKKwlpbml0X2NvbXBsZXRpb24oJnNwaV9pbXgtPnhmZXJfZG9uZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBwbGF0Zm9ybSByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2dwaW9fZnJlZTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2dwaW9fZnJlZTsKKwl9CisKKwlzcGlfaW14LT5iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghc3BpX2lteC0+YmFzZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9yZWxlYXNlX21lbTsKKwl9CisKKwlzcGlfaW14LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICghc3BpX2lteC0+aXJxKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoc3BpX2lteC0+aXJxLCBzcGlfaW14X2lzciwgMCwgRFJJVkVSX05BTUUsIHNwaV9pbXgpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSVkOiAlZFxuIiwgc3BpX2lteC0+aXJxLCByZXQpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCWlmIChjcHVfaXNfbXgzMSgpIHx8IGNwdV9pc19teDM1KCkpIHsKKwkJc3BpX2lteC0+aW50Y3RybCA9IG14MzFfaW50Y3RybDsKKwkJc3BpX2lteC0+Y29uZmlnID0gbXgzMV9jb25maWc7CisJCXNwaV9pbXgtPnRyaWdnZXIgPSBteDMxX3RyaWdnZXI7CisJCXNwaV9pbXgtPnJ4X2F2YWlsYWJsZSA9IG14MzFfcnhfYXZhaWxhYmxlOworCX0gZWxzZSAgaWYgKGNwdV9pc19teDI3KCkgfHwgY3B1X2lzX214MjEoKSkgeworCQlzcGlfaW14LT5pbnRjdHJsID0gbXgyN19pbnRjdHJsOworCQlzcGlfaW14LT5jb25maWcgPSBteDI3X2NvbmZpZzsKKwkJc3BpX2lteC0+dHJpZ2dlciA9IG14MjdfdHJpZ2dlcjsKKwkJc3BpX2lteC0+cnhfYXZhaWxhYmxlID0gbXgyN19yeF9hdmFpbGFibGU7CisJfSBlbHNlIGlmIChjcHVfaXNfbXgxKCkpIHsKKwkJc3BpX2lteC0+aW50Y3RybCA9IG14MV9pbnRjdHJsOworCQlzcGlfaW14LT5jb25maWcgPSBteDFfY29uZmlnOworCQlzcGlfaW14LT50cmlnZ2VyID0gbXgxX3RyaWdnZXI7CisJCXNwaV9pbXgtPnJ4X2F2YWlsYWJsZSA9IG14MV9yeF9hdmFpbGFibGU7CisJfSBlbHNlCisJCUJVRygpOworCisJc3BpX2lteC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHNwaV9pbXgtPmNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBjbG9ja1xuIik7CisJCXJldCA9IFBUUl9FUlIoc3BpX2lteC0+Y2xrKTsKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJfQorCisJY2xrX2VuYWJsZShzcGlfaW14LT5jbGspOworCXNwaV9pbXgtPnNwaV9jbGsgPSBjbGtfZ2V0X3JhdGUoc3BpX2lteC0+Y2xrKTsKKworCWlmICghY3B1X2lzX214MzEoKSB8fCAhY3B1X2lzX214MzUoKSkKKwkJd3JpdGVsKDEsIHNwaV9pbXgtPmJhc2UgKyBNWENfUkVTRVQpOworCisJc3BpX2lteC0+aW50Y3RybChzcGlfaW14LCAwKTsKKworCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZzcGlfaW14LT5iaXRiYW5nKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImJpdGJhbmcgc3RhcnQgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X2Nsa19wdXQ7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgInByb2JlZFxuIik7CisKKwlyZXR1cm4gcmV0OworCitvdXRfY2xrX3B1dDoKKwljbGtfZGlzYWJsZShzcGlfaW14LT5jbGspOworCWNsa19wdXQoc3BpX2lteC0+Y2xrKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShzcGlfaW14LT5pcnEsIHNwaV9pbXgpOworb3V0X2lvdW5tYXA6CisJaW91bm1hcChzcGlfaW14LT5iYXNlKTsKK291dF9yZWxlYXNlX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKK291dF9ncGlvX2ZyZWU6CisJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykKKwkJaWYgKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0gPj0gMCkKKwkJCWdwaW9fZnJlZShzcGlfaW14LT5jaGlwc2VsZWN0W2ldKTsKK291dF9tYXN0ZXJfcHV0OgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJa2ZyZWUobWFzdGVyKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBzcGlfaW14X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgaTsKKworCXNwaV9iaXRiYW5nX3N0b3AoJnNwaV9pbXgtPmJpdGJhbmcpOworCisJd3JpdGVsKDAsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworCWNsa19kaXNhYmxlKHNwaV9pbXgtPmNsayk7CisJY2xrX3B1dChzcGlfaW14LT5jbGspOworCWZyZWVfaXJxKHNwaV9pbXgtPmlycSwgc3BpX2lteCk7CisJaW91bm1hcChzcGlfaW14LT5iYXNlKTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspCisJCWlmIChzcGlfaW14LT5jaGlwc2VsZWN0W2ldID49IDApCisJCQlncGlvX2ZyZWUoc3BpX2lteC0+Y2hpcHNlbGVjdFtpXSk7CisKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGlfaW14X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9IERSSVZFUl9OQU1FLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfSwKKwkucHJvYmUgPSBzcGlfaW14X3Byb2JlLAorCS5yZW1vdmUgPSBfX2V4aXRfcChzcGlfaW14X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzcGlfaW14X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzcGlfaW14X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcGlfaW14X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX2lteF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzcGlfaW14X2luaXQpOworbW9kdWxlX2V4aXQoc3BpX2lteF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgTWFzdGVyIENvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlkZXYuYyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCmluZGV4IGY5MjFiZDEuLjVkMjM5ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaWRldi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCkBAIC01MzcsNyArNTM3LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcGlkZXZfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwaWRldl9mb3BzID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS8qIFJFVklTSVQgc3dpdGNoIHRvIGFpbyBwcmltaXRpdmVzLCBzbyB0aGF0IHVzZXJzcGFjZQogCSAqIGdldHMgbW9yZSBjb21wbGV0ZSBBUEkgY292ZXJhZ2UuICBJdCdsbCBzaW1wbGlmeSB0aGluZ3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggODJiMzQ4OS4uZDIxYjM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTU5LDggKzU5LDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcG9jaC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hZ254L0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnQyODYwL0tjb25maWciCkBAIC05NSw4ICs5Myw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3N0bGM0NXh4L0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2IzZGZnL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9LY29uZmlnIgpAQCAtMTE3LDggKzExMyw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9jcGMtdXNiL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VkbGZiL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2h2L0tjb25maWciCkBAIC0xMzEsNyArMTI1LDUgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2Nvd2xvb3AvS2NvbmZpZyIKLQogZW5kaWYgIyAhU1RBR0lOR19FWENMVURFX0JVSUxECiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCBiMWNhZDBkLi44Y2JmMWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw2IEBACiBvYmotJChDT05GSUdfUFJJU00yX1VTQikJKz0gd2xhbi1uZy8KIG9iai0kKENPTkZJR19FQ0hPKQkJKz0gZWNoby8KIG9iai0kKENPTkZJR19QT0NIKQkJKz0gcG9jaC8KLW9iai0kKENPTkZJR19BR05YKQkJKz0gYWdueC8KIG9iai0kKENPTkZJR19PVFVTKQkJKz0gb3R1cy8KIG9iai0kKENPTkZJR19SVDI4NjApCQkrPSBydDI4NjAvCiBvYmotJChDT05GSUdfUlQyODcwKQkJKz0gcnQyODcwLwpAQCAtMzAsNyArMjksNiBAQAogb2JqLSQoQ09ORklHX0FORFJPSUQpCQkrPSBkcmVhbS8KIG9iai0kKENPTkZJR19EU1QpCQkrPSBkc3QvCiBvYmotJChDT05GSUdfUE9ITUVMRlMpCQkrPSBwb2htZWxmcy8KLW9iai0kKENPTkZJR19TVExDNDVYWCkJCSs9IHN0bGM0NXh4Lwogb2JqLSQoQ09ORklHX0IzREZHKQkJKz0gYjNkZmcvCiBvYmotJChDT05GSUdfSURFX1BISVNPTikJKz0gcGhpc29uLwogb2JqLSQoQ09ORklHX1BMQU45QVVUSCkJCSs9IHA5YXV0aC8KQEAgLTQwLDExICszOCw5IEBACiBvYmotJChDT05GSUdfT0NURU9OX0VUSEVSTkVUKQkrPSBvY3Rlb24vCiBvYmotJChDT05GSUdfVlQ2NjU1KQkJKz0gdnQ2NjU1Lwogb2JqLSQoQ09ORklHX1ZUNjY1NikJCSs9IHZ0NjY1Ni8KLW9iai0kKENPTkZJR19VU0JfQ1BDKQkJKz0gY3BjLXVzYi8KIG9iai0kKENPTkZJR19GQl9VREwpCQkrPSB1ZGxmYi8KIG9iai0kKENPTkZJR19IWVBFUlYpCQkrPSBodi8KIG9iai0kKENPTkZJR19WTUVfQlVTKQkJKz0gdm1lLwogb2JqLSQoQ09ORklHX1JBUl9SRUdJU1RFUikJKz0gcmFyLwogb2JqLSQoQ09ORklHX0RYX1NFUCkJCSs9IHNlcC8KIG9iai0kKENPTkZJR19JSU8pCQkrPSBpaW8vCi1vYmotJChDT05GSUdfQ09XTE9PUCkJCSs9IGNvd2xvb3AvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0MzU0OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1jb25maWcgQUdOWAotCXRyaXN0YXRlICJXaXJlbGVzcyBBaXJnbyBBR05YIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIE1BQzgwMjExCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciBBaXJnbyBBR05YMDAgd2lyZWxlc3MgY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTY1NjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FnbngvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW9iai0kKENPTkZJR19BR05YKQkrPSBhZ254Lm8KLQotYWdueC1vYmpzIDo9CXJmLm8JXAotCQlwY2kubwlcCi0JCXhtaXQubwlcCi0JCXRhYmxlLm8JXAotCQlzdGEubwlcCi0JCXBoeS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliZWM3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotMjAwOCA3LzE4Ci0KLVRoZSBSWCBoYXMgY2FuJ3QgcmVjZWl2ZSBPRkRNIHBhY2tldCBjb3JyZWN0bHksCi1HdWVzcyBpdCBuZWVkIGJlIGRvIFJYIGNhbGlicmF0ZS4KLQotCi1iZWZvcmUgMjAwOCAzLzEKLQotMTogVGhlIFJYIGdldCB0b28gbXVjaCAiQ1JDIGZhaWxlZCIgcGFrZXRzLCBpdCBtYWtlIHRoZSBjYXJkIHdvcmsgdmVyeSB1bnN0YWJsZSwKLTI6IEFmdGVyIHJ1bm5pbmcgYSB3aGlsZSwgdGhlIGNhcmQgd2lsbCBnZXQgaW5maW5pdHkgIlJYIEZyYW1lIiBhbmQgIkVycm9yIgotaW50ZXJydXB0LCBub3Qga25vdyB0aGUgcm9vdCByZWFzb24gc28gZmFyLCB0cnkgdG8gZml4IGl0Ci0zOiBVc2luZyB0d28gdHggcXVldWUgdHhkIGFuZCB0eG0gYnV0IG5vdCBvbmx5IHR4bS4KLTQ6IFNldCB0aGUgaGRyIGNvcnJlY3RseS4KLTU6IFRyeSB0byBkbyByZWNhbGlicmF0ZSBjb3JyZXZ0bHkKLTY6IFRvIHN1cHBvcnQgRyBtb2RlIGluIGZ1dHVyZQotNzogRml4IHRoZSBtYWMgYWRkcmVzcyBjYW4ndCBiZSByZWFkZWQgYW5kIHNldCBjb3JyZWN0bHkgaW4gQkUgbWFjaGluZS4KLTg6IEZpeCBpbmNsdWRlIGFuZCBleGNsdWRlIEZDUyBpbiBwcm9taXNvdXMgbW9kZSBhbmQgbWFuYWdlIG1vZGUKLTk6IFVzaW5nIHN0YV9ub3RpZnkgdG8gbm90aWNlIHN0YSBjaGFuZ2UKLTEwOiBUdXJuIG9uIGZyYW1lIHJlY2VwdGlvbiBhdCB0aGUgZW5kIG9mIHN0YXJ0Ci0xMTogR3Vlc3MgdGhlIGNhcmQgc3VwcG9ydCBIV19NVUxUSUNBU1RfRklMVEVSCi0xMjogVGhlIHR4IHByb2Nlc3Mgc2hvdWxkIGJlIGltcGxtZW50IGF0b21pYz8KLTEzOiBVc2luZyBtYWM4MDIxMSBmdW5jdGlvbiB0byBjb250cm9sIHRoZSBUWCZSWCBMRUQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9hZ254LmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9hZ254LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjNkMjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FnbngvYWdueC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSNpZm5kZWYgQUdOWF9IXwotI2RlZmluZSBBR05YX0hfCi0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSAieG1pdC5oIgotCi0jZGVmaW5lIFBGWAkJCQlLQlVJTERfTU9ETkFNRSAiOiAiCi0KLXN0YXRpYyBpbmxpbmUgdTMyIGFnbnhfcmVhZDMyKHZvaWQgX19pb21lbSAqbWVtX3JlZ2lvbiwgdTMyIG9mZnNldCkKLXsKLQlyZXR1cm4gaW9yZWFkMzIobWVtX3JlZ2lvbiArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3dyaXRlMzIodm9pZCBfX2lvbWVtICptZW1fcmVnaW9uLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQotewotCWlvd3JpdGUzMih2YWwsIG1lbV9yZWdpb24gKyBvZmZzZXQpOwotfQotCi0vKiBzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlIGFnbnhfcmF0ZXNfODAyMTFiW10gPSB7ICovCi0vKiAJeyAucmF0ZSA9IDEwLCAqLwotLyogCSAgLnZhbCA9IDB4YSwgKi8KLS8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDSyB9LCAqLwotLyogCXsgLnJhdGUgPSAyMCwgKi8KLS8qIAkgIC52YWwgPSAweDE0LCAqLwotLyogCSAgLmh3X3ZhbHVlID0gLTB4MTQsICovCi0vKiAJICAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9DQ0tfMiB9LCAqLwotLyogCXsgLnJhdGUgPSA1NSwgKi8KLS8qIAkgIC52YWwgPSAweDM3LCAqLwotLyogCSAgLnZhbDIgPSAtMHgzNywgKi8KLS8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0sICovCi0vKiAJeyAucmF0ZSA9IDExMCwgKi8KLS8qIAkgIC52YWwgPSAweDZlLCAqLwotLyogCSAgLnZhbDIgPSAtMHg2ZSwgKi8KLS8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0gKi8KLS8qIH07ICovCi0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBhZ254X3JhdGVzXzgwMjExZ1tdID0gewotLyogCXsgLmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMSwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwgKi8KLS8qIAl7IC5iaXRyYXRlID0gMjAsIC5od192YWx1ZSA9IDIsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCi0vKiAJeyAuYml0cmF0ZSA9IDU1LCAuaHdfdmFsdWUgPSAzLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LCAqLwotLyogCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDQsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCi0JeyAuYml0cmF0ZSA9IDEwLCAuaHdfdmFsdWUgPSAxLCB9LAotCXsgLmJpdHJhdGUgPSAyMCwgLmh3X3ZhbHVlID0gMiwgfSwKLQl7IC5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDMsIH0sCi0JeyAuYml0cmF0ZSA9IDExMCwgLmh3X3ZhbHVlID0gNCx9LAotCi0JeyAuYml0cmF0ZSA9IDYwLCAuaHdfdmFsdWUgPSAweEIsIH0sCi0JeyAuYml0cmF0ZSA9IDkwLCAuaHdfdmFsdWUgPSAweEYsIH0sCi0JeyAuYml0cmF0ZSA9IDEyMCwgLmh3X3ZhbHVlID0gMHhBIH0sCi0JeyAuYml0cmF0ZSA9IDE4MCwgLmh3X3ZhbHVlID0gMHhFLCB9LAotLyoJeyAuYml0cmF0ZSA9IDI0MCwgLmh3X3ZhbHVlID0gMHhkLCB9LCAqLwotCXsgLmJpdHJhdGUgPSAzNjAsIC5od192YWx1ZSA9IDB4RCwgfSwKLQl7IC5iaXRyYXRlID0gNDgwLCAuaHdfdmFsdWUgPSAweDgsIH0sCi0JeyAuYml0cmF0ZSA9IDU0MCwgLmh3X3ZhbHVlID0gMHhDLCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBhZ254X2NoYW5uZWxzW10gPSB7Ci0JeyAuY2VudGVyX2ZyZXEgPSAyNDEyLCAuaHdfdmFsdWUgPSAxLCB9LAotCXsgLmNlbnRlcl9mcmVxID0gMjQxNywgLmh3X3ZhbHVlID0gMiwgfSwKLQl7IC5jZW50ZXJfZnJlcSA9IDI0MjIsIC5od192YWx1ZSA9IDMsIH0sCi0JeyAuY2VudGVyX2ZyZXEgPSAyNDI3LCAuaHdfdmFsdWUgPSA0LCB9LAotCXsgLmNlbnRlcl9mcmVxID0gMjQzMiwgLmh3X3ZhbHVlID0gNSwgfSwKLQl7IC5jZW50ZXJfZnJlcSA9IDI0MzcsIC5od192YWx1ZSA9IDYsIH0sCi0JeyAuY2VudGVyX2ZyZXEgPSAyNDQyLCAuaHdfdmFsdWUgPSA3LCB9LAotCXsgLmNlbnRlcl9mcmVxID0gMjQ0NywgLmh3X3ZhbHVlID0gOCwgfSwKLQl7IC5jZW50ZXJfZnJlcSA9IDI0NTIsIC5od192YWx1ZSA9IDksIH0sCi0JeyAuY2VudGVyX2ZyZXEgPSAyNDU3LCAuaHdfdmFsdWUgPSAxMCwgfSwKLQl7IC5jZW50ZXJfZnJlcSA9IDI0NjIsIC5od192YWx1ZSA9IDExLCB9LAotCXsgLmNlbnRlcl9mcmVxID0gMjQ2NywgLmh3X3ZhbHVlID0gMTIsIH0sCi0JeyAuY2VudGVyX2ZyZXEgPSAyNDcyLCAuaHdfdmFsdWUgPSAxMywgfSwKLQl7IC5jZW50ZXJfZnJlcSA9IDI0ODQsIC5od192YWx1ZSA9IDE0LCB9LAotfTsKLQotI2RlZmluZSBOVU1fRFJJVkVfTU9ERVMJMgotLyogQWdueCBvcGVyYXRlIG1vZGUgKi8KLWVudW0gewotCUFHTlhfTU9ERV84MDIxMUEsCi0JQUdOWF9NT0RFXzgwMjExQV9PT0IsCi0JQUdOWF9NT0RFXzgwMjExQV9NSU1PLAotCUFHTlhfTU9ERV84MDIxMUJfU0hPUlQsCi0JQUdOWF9NT0RFXzgwMjExQl9MT05HLAotCUFHTlhfTU9ERV84MDIxMUcsCi0JQUdOWF9NT0RFXzgwMjExR19PT0IsCi0JQUdOWF9NT0RFXzgwMjExR19NSU1PLAotfTsKLQotZW51bSB7Ci0JQUdOWF9VTklOSVQsCi0JQUdOWF9TVEFSVCwKLQlBR05YX1NUT1AsCi19OwotCi1zdHJ1Y3QgYWdueF9wcml2IHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci0JdW5zaWduZWQgaW50IGluaXRfc3RhdHVzOwotCi0Jdm9pZCBfX2lvbWVtICpjdGw7CS8qIHBvaW50ZXIgdG8gYmFzZSByYW0gYWRkcmVzcyAqLwotCXZvaWQgX19pb21lbSAqZGF0YTsJLyogcG9pbnRlciB0byBtZW0gcmVnaW9uICMyICovCi0KLQlzdHJ1Y3QgYWdueF9yaW5nIHJ4OwotCXN0cnVjdCBhZ254X3JpbmcgdHhtOwotCXN0cnVjdCBhZ254X3JpbmcgdHhkOwotCi0JLyogTmVlZCB2b2xhdGlsZT8gKi8KLQl1MzIgaXJxX3N0YXR1czsKLQotCXN0cnVjdCBkZWxheWVkX3dvcmsgcGVyaW9kaWNfd29yazsgLyogUGVyaW9kaWMgdGFza3MgbGlrZSByZWNhbGlicmF0ZSAqLwotCXN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzIHN0YXRzOwotCi0JLyogdW5zaWduZWQgaW50IHBoeW1vZGU7ICovCi0JaW50IG1vZGU7Ci0JaW50IGNoYW5uZWw7Ci0JdTggYnNzaWRbRVRIX0FMRU5dOwotCi0JdTggbWFjX2FkZHJbRVRIX0FMRU5dOwotCXU4IHJldmlkOwotCi0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kOwotfTsKLQotCi0jZGVmaW5lIEFHTlhfQ0hBSU5TX01BWAk2Ci0jZGVmaW5lIEFHTlhfUEVSSU9ESUNfREVMQVkgNjAwMDAgLyogdW5pdDogbXMgKi8KLSNkZWZpbmUgTE9DQUxfU1RBSUQJMAkvKiB0aGUgc3RhdGlvbiBlbnRyeSBmb3IgdGhlIGNhcmQgaXRzZWxmICovCi0jZGVmaW5lIEJTU0lEX1NUQUlECTEJLyogdGhlIHN0YXRpb24gZW50cnkgZm9yIHRoZSBic3NzaWQgQVAgKi8KLSNkZWZpbmUJc3BpX2RlbGF5KCkJdWRlbGF5KDQwKQotI2RlZmluZSBlZXByb21fZGVsYXkoKQl1ZGVsYXkoNDApCi0jZGVmaW5lCXJvdXRpbmdfdGFibGVfZGVsYXkoKQl1ZGVsYXkoNTApCi0KLS8qIFBEVSBwb29sIE1FTSByZWdpb24gIzIgKi8KLSNkZWZpbmUgQUdOWF9QRFVQT09MCQkweDQwMDAwCS8qIFBEVSBwb29sICovCi0jZGVmaW5lIEFHTlhfUERVUE9PTF9TSVpFCTB4ODAwMAkvKiBQRFUgcG9vbCBzaXplKi8KLSNkZWZpbmUgQUdOWF9QRFVfVFhfV1EJCTB4NDEwMDAJLyogUERVIGxpc3QgVFggd29ya3F1ZXVlICovCi0jZGVmaW5lIEFHTlhfUERVX0ZSRUUJCTB4NDE4MDAJLyogRnJlZSBQb29sICovCi0jZGVmaW5lIFBEVV9TSVpFCQkweDgwCS8qIEZyZWUgUG9vbCBub2RlIHNpemUgKi8KLSNkZWZpbmUgUERVX0ZSRUVfQ05UCQkweGQwIC8qIEZyZWUgcG9vbCBub2RlIGNvdW50ICovCi0KLQotLyogUkYgc3R1ZmZzICovCi1leHRlcm4gdm9pZCByZl9jaGlwc19pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwotZXh0ZXJuIHZvaWQgc3BpX3JjX3dyaXRlKHZvaWQgX19pb21lbSAqbWVtX3JlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpOwotZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX29zY2lsbGF0b3Ioc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci1leHRlcm4gdm9pZCBkb19jYWxpYnJhdGlvbihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGFudGVubmFfY2FsaWJyYXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwotZXh0ZXJuIHZvaWQgX19hbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIHByaW50X29mZnNldHMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGFnbnhfc2V0X2NoYW5uZWwoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpOwotCi0KLSNlbmRpZiAvKiBBR05YX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0N2YzMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLSNpZm5kZWYgQUdOWF9ERUJVR19IXwotI2RlZmluZSBBR05YX0RFQlVHX0hfCi0KLSNpbmNsdWRlICJhZ254LmgiCi0jaW5jbHVkZSAicGh5LmgiCi0jaW5jbHVkZSAic3RhLmgiCi0jaW5jbHVkZSAieG1pdC5oIgotCi0jZGVmaW5lIEFHTlhfVFJBQ0UgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiBQRlggImZ1bmN0aW9uOiVzIGxpbmU6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXykKLQotI2RlZmluZSBQUklOVEtfTEUxNihwcmVmaXgsIHZhcikJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjR4XG4iLCBsZTE2X3RvX2NwdSh2YXIpKQotI2RlZmluZSBQUklOVEtfTEUzMihwcmVmaXgsIHZhcikJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjh4XG4iLCBsZTMyX3RvX2NwdSh2YXIpKQotI2RlZmluZSBQUklOVEtfVTgocHJlZml4LCB2YXIpIAkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjJ4XG4iLCB2YXIpCi0jZGVmaW5lIFBSSU5US19CRTE2KHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuNHhcbiIsIGJlMTZfdG9fY3B1KHZhcikpCi0jZGVmaW5lIFBSSU5US19CRTMyKHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuOHhcbiIsIGJlMzJfdG9fY3B1KHZhcikpCi0jZGVmaW5lIFBSSU5US19CSVRTKHByZWZpeCwgZmllbGQpICAgIAlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICNmaWVsZCAiOiAweCV4XG4iLCAocmVnICYgZmllbGQpID4+IGZpZWxkIyNfU0hJRlQpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZ254X2J1ZyhjaGFyICpyZWFzb24pCi17Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXNcbiIsIHJlYXNvbik7Ci0JQlVHKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X2Rlc2Moc3RydWN0IGFnbnhfZGVzYyAqZGVzYykKLXsKLQl1MzIgcmVnID0gYmUzMl90b19jcHUoZGVzYy0+ZnJhZyk7Ci0KLQlQUklOVEtfQklUUyhERVNDLCBQQUNLRVRfTEVOKTsKLQotCWlmIChyZWcgJiBGSVJTVF9GUkFHKSB7Ci0JCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1BBQ0tFVF9NQVNLKTsKLQkJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfUkVTRVJWMik7Ci0JCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1RLSVBfRVJST1IpOwotCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9US0lQX1BBQ0tFVCk7Ci0JCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1JFU0VSVjEpOwotCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9GUkFHX0xFTik7Ci0JfSBlbHNlIHsKLQkJUFJJTlRLX0JJVFMoREVTQywgU1VCX1JFU0VSVjIpOwotCQlQUklOVEtfQklUUyhERVNDLCBTVUJfVEtJUF9FUlJPUik7Ci0JCVBSSU5US19CSVRTKERFU0MsIFNVQl9US0lQX1BBQ0tFVCk7Ci0JCVBSSU5US19CSVRTKERFU0MsIFNVQl9SRVNFUlYxKTsKLQkJUFJJTlRLX0JJVFMoREVTQywgU1VCX0ZSQUdfTEVOKTsKLQl9Ci0KLQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9GUkFHKTsKLQlQUklOVEtfQklUUyhERVNDLCBMQVNUX0ZSQUcpOwotCVBSSU5US19CSVRTKERFU0MsIE9XTkVSKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9pZWVlODAyMTFiX3BoeV9oZHIoX19iZTMyIF8xMWIwLCBfX2JlMzIgXzExYjEpCi17Ci0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfaGRyKHN0cnVjdCBhZ254X2hkciAqaGRyKQotewotCXUzMiByZWc7Ci0JaW50IGk7Ci0KLQlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzApOwotCVBSSU5US19CSVRTKEhEUiwgUlRTKTsKLQlQUklOVEtfQklUUyhIRFIsIE1VTFRJQ0FTVCk7Ci0JUFJJTlRLX0JJVFMoSERSLCBBQ0spOwotCVBSSU5US19CSVRTKEhEUiwgVE0pOwotCVBSSU5US19CSVRTKEhEUiwgUkVMQVkpOwotCVBSSU5US19CSVRTKEhEUiwgUkVWSVNFRF9GQ1MpOwotCVBSSU5US19CSVRTKEhEUiwgTkVYVF9CVUZGRVJfQUREUik7Ci0KLQlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzEpOwotCVBSSU5US19CSVRTKEhEUiwgTUFDX0hEUl9MRU4pOwotCVBSSU5US19CSVRTKEhEUiwgRFVSQVRJT05fT1ZFUklERSk7Ci0JUFJJTlRLX0JJVFMoSERSLCBQSFlfSERSX09WRVJJREUpOwotCVBSSU5US19CSVRTKEhEUiwgQ1JDX0ZBSUwpOwotCVBSSU5US19CSVRTKEhEUiwgU0VRVUVOQ0VfTlVNQkVSKTsKLQlQUklOVEtfQklUUyhIRFIsIEJVRkZfSEVBRF9BRERSKTsKLQotCXJlZyA9IGJlMzJfdG9fY3B1KGhkci0+cmVnMik7Ci0JUFJJTlRLX0JJVFMoSERSLCBQRFVfQ09VTlQpOwotCVBSSU5US19CSVRTKEhEUiwgV0VQX0tFWSk7Ci0JUFJJTlRLX0JJVFMoSERSLCBVU0VTX1dFUF9LRVkpOwotCVBSSU5US19CSVRTKEhEUiwgS0VFUF9BTElWRSk7Ci0JUFJJTlRLX0JJVFMoSERSLCBCVUZGX1RBSUxfQUREUik7Ci0KLQlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzMpOwotCVBSSU5US19CSVRTKEhEUiwgQ1RTXzExRyk7Ci0JUFJJTlRLX0JJVFMoSERSLCBSVFNfMTFHKTsKLQlQUklOVEtfQklUUyhIRFIsIEZSQUdfU0laRSk7Ci0JUFJJTlRLX0JJVFMoSERSLCBQQVlMT0FEX0xFTik7Ci0JUFJJTlRLX0JJVFMoSERSLCBGUkFHX05VTSk7Ci0KLQlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzQpOwotCVBSSU5US19CSVRTKEhEUiwgUkVMQVlfU1RBSUQpOwotCVBSSU5US19CSVRTKEhEUiwgU1RBVElPTl9JRCk7Ci0JUFJJTlRLX0JJVFMoSERSLCBXT1JLUVVFVUVfSUQpOwotCi0JcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWc1KTsKLQkvKiBwcmludGYgdGhlIHJvdXRlIGZsYWcgKi8KLQlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0hPU1QpOwotCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfQ0FSRF9DUFUpOwotCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfRU5DUllQVElPTik7Ci0JUFJJTlRLX0JJVFMoSERSLCBST1VURV9UWCk7Ci0JUFJJTlRLX0JJVFMoSERSLCBST1VURV9SWDEpOwotCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfUlgyKTsKLQlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0NPTVBSRVNTSU9OKTsKLQotCVBSSU5US19CRTMyKEhEUiwgaGRyLT5fMTFnMCk7Ci0JUFJJTlRLX0JFMzIoSERSLCBoZHItPl8xMWcxKTsKLQlQUklOVEtfQkUzMihIRFIsIGhkci0+XzExYjApOwotCVBSSU5US19CRTMyKEhEUiwgaGRyLT5fMTFiMSk7Ci0KLQlkdW1wX2llZWU4MDIxMWJfcGh5X2hkcihoZHItPl8xMWIwLCBoZHItPl8xMWIxKTsKLQotCS8qIEZpeG1lICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGRyLT5tYWNfaGRyKTsgaSsrKSB7Ci0JCWlmIChpID09IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIklFRUU4MDIxMSBIRFI6ICIpOwotCQlwcmludGsoIiUuMnggIiwgaGRyLT5tYWNfaGRyW2ldKTsKLQkJaWYgKGkgKyAxID09IEFSUkFZX1NJWkUoaGRyLT5tYWNfaGRyKSkKLQkJCXByaW50aygiXG4iKTsKLQl9Ci0KLQlQUklOVEtfQkUxNihIRFIsIGhkci0+cnRzX2R1cmF0aW9uKTsKLQlQUklOVEtfQkUxNihIRFIsIGhkci0+bGFzdF9kdXJhdGlvbik7Ci0JUFJJTlRLX0JFMTYoSERSLCBoZHItPnNlY19sYXN0X2R1cmF0aW9uKTsKLQlQUklOVEtfQkUxNihIRFIsIGhkci0+b3RoZXJfZHVyYXRpb24pOwotCVBSSU5US19CRTE2KEhEUiwgaGRyLT50eF9vdGhlcl9kdXJhdGlvbik7Ci0JUFJJTlRLX0JFMTYoSERSLCBoZHItPmxhc3RfMTFnX2xlbik7Ci0JUFJJTlRLX0JFMTYoSERSLCBoZHItPm90aGVyXzExZ19sZW4pOwotCVBSSU5US19CRTE2KEhEUiwgaGRyLT5sYXN0XzExYl9sZW4pOwotCVBSSU5US19CRTE2KEhEUiwgaGRyLT5vdGhlcl8xMWJfbGVuKTsKLQotCS8qIEZJWE1FICovCi0JcmVnID0gYmUxNl90b19jcHUoaGRyLT5yZWc2KTsKLQlQUklOVEtfQklUUyhIRFIsIE1CRik7Ci0JUFJJTlRLX0JJVFMoSERSLCBSU1ZENCk7Ci0KLQlQUklOVEtfQkUxNihIRFIsIGhkci0+cnhfZnJhZ19zdGF0KTsKLQotCVBSSU5US19CRTMyKEhEUiwgaGRyLT50aW1lX3N0YW1wKTsKLQlQUklOVEtfQkUzMihIRFIsIGhkci0+cGh5X3N0YXRzX2hpKTsKLQlQUklOVEtfQkUzMihIRFIsIGhkci0+cGh5X3N0YXRzX2xvKTsKLQlQUklOVEtfQkUzMihIRFIsIGhkci0+bWljX2tleTApOwotCVBSSU5US19CRTMyKEhEUiwgaGRyLT5taWNfa2V5MSk7Ci19IC8qIGFnbnhfcHJpbnRfaGRyICovCi0KLQotc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfcnhfaGRyKHN0cnVjdCBhZ254X2hkciAqaGRyKQotewotCWFnbnhfcHJpbnRfaGRyKGhkcik7Ci0KLQlQUklOVEtfQkUxNihIRFIsIGhkci0+cngucnhfcGFja2V0X2R1cmF0aW9uKTsKLQlQUklOVEtfQkUxNihIRFIsIGhkci0+cngucmVwbGF5X2NudCk7Ci0KLQlQUklOVEtfVTgoSERSLCBoZHItPnJ4X2NoYW5uZWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWdueF9wcmludF90eF9oZHIoc3RydWN0IGFnbnhfaGRyICpoZHIpCi17Ci0JYWdueF9wcmludF9oZHIoaGRyKTsKLQotCVBSSU5US19VOChIRFIsIGhkci0+dHgubG9uZ19yZXRyeV9saW1pdCk7Ci0JUFJJTlRLX1U4KEhEUiwgaGRyLT50eC5zaG9ydF9yZXRyeV9saW1pdCk7Ci0JUFJJTlRLX1U4KEhEUiwgaGRyLT50eC5sb25nX3JldHJ5X2NudCk7Ci0JUFJJTlRLX1U4KEhEUiwgaGRyLT50eC5zaG9ydF9yZXRyeV9jbnQpOwotCi0JUFJJTlRLX1U4KEhEUiwgaGRyLT5yeF9jaGFubmVsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1hZ254X3ByaW50X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKLXsKLQlzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgcG93ZXI7Ci0JdTMyIHJlZzsKLQotCWdldF9zdGFfcG93ZXIocHJpdiwgJnBvd2VyLCBzdGFfaWR4KTsKLQotCXJlZyA9IGxlMzJfdG9fY3B1KHBvd2VyLnJlZyk7Ci0JUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBTSUdOQUwpOwotCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgUkFURSk7Ci0JUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBUSUZTKTsKLQlQUklOVEtfQklUUyhTVEFfUE9XRVIsIEVEQ0YpOwotCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgQ0hBTk5FTF9CT05EKTsKLQlQUklOVEtfQklUUyhTVEFfUE9XRVIsIFBIWV9NT0RFKTsKLQlQUklOVEtfQklUUyhTVEFfUE9XRVIsIFBPV0VSX0xFVkVMKTsKLQlQUklOVEtfQklUUyhTVEFfUE9XRVIsIE5VTV9UUkFOU01JVFRFUlMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWFnbnhfcHJpbnRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KQotewotCXN0cnVjdCBhZ254X3N0YV90eF93cSB0eF93cTsKLQl1MzIgcmVnOwotCi0JZ2V0X3N0YV90eF93cShwcml2LCAmdHhfd3EsIHN0YV9pZHgsIHdxX2lkeCk7Ci0KLQlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWcwKTsKLQlQUklOVEtfQklUUyhTVEFfVFhfV1EsIFRBSUxfUE9JTlRFUik7Ci0JUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBIRUFEX1BPSU5URVJfTE9XKTsKLQotCXJlZyA9IGxlMzJfdG9fY3B1KHR4X3dxLnJlZzMpOwotCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9QT0lOVEVSX0hJR0gpOwotCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgQUNLX1BPSU5URVJfTE9XKTsKLQotCXJlZyA9IGxlMzJfdG9fY3B1KHR4X3dxLnJlZzEpOwotCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgQUNLX1BPSU5URVJfSElHSCk7Ci0JUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBIRUFEX1RJTU9VVF9UQUlMX1BBQ0tfQ05UKTsKLQlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEFDS19USU1PVVRfVEFJTF9QQUNLX0NOVCk7Ci0KLQlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWcyKTsKLQlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEhFQURfVElNT1VUX1dJTl9MSU1fQllURV9DTlQpOwotCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9USU1PVVRfV0lOX0xJTV9GUkFHX0NOVCk7Ci0JUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBXT1JLX1FVRVVFX0FDS19UWVBFKTsKLQlQUklOVEtfQklUUyhTVEFfVFhfV1EsIFdPUktfUVVFVUVfVkFMSUQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWdueF9wcmludF9zdGFfdHJhZmZpYyhzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyAqdHJhZmZpYykKLXsKLQl1MzIgcmVnOwotCi0JcmVnID0gbGUzMl90b19jcHUodHJhZmZpYy0+cmVnMCk7Ci0JUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIEFDS19USU1PVVRfQ05UKTsKLQlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgVFJBRkZJQ19BQ0tfVFlQRSk7Ci0JUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIE5FV19QQUNLRVQpOwotCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBUUkFGRklDX1ZBTElEKTsKLQlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgUlhfSERSX0RFU0NfUE9JTlRFUik7Ci0KLQlyZWcgPSBsZTMyX3RvX2NwdSh0cmFmZmljLT5yZWcxKTsKLQlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgUlhfUEFDS0VUX1RJTUVTVEFNUCk7Ci0JUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFRSQUZGSUNfUkVTRVJWRUQpOwotCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBTVik7Ci0JUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFJYX1NFUVVFTkNFX05VTSk7Ci0KLQlQUklOVEtfTEUzMihTVEFfVFJBRkZJQywgdHJhZmZpYy0+dHhfcmVwbGF5X2NudF9sb3cpOwotCi0JUFJJTlRLX0xFMTYoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnR4X3JlcGxheV9jbnRfaGlnaCk7Ci0JUFJJTlRLX0xFMTYoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnJ4X3JlcGxheV9jbnRfaGlnaCk7Ci0KLQlQUklOVEtfTEUzMihTVEFfVFJBRkZJQywgdHJhZmZpYy0+cnhfcmVwbGF5X2NudF9sb3cpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWdueF9wcmludF9zdGEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCi17Ci0Jc3RydWN0IGFnbnhfc3RhIHN0YXRpb247Ci0Jc3RydWN0IGFnbnhfc3RhICpzdGEgPSAmc3RhdGlvbjsKLQl1MzIgcmVnOwotCXVuc2lnbmVkIGludCBpOwotCi0JZ2V0X3N0YShwcml2LCBzdGEsIHN0YV9pZHgpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnR4X3Nlc3Npb25fa2V5c1tpXSk7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnJ4X3Nlc3Npb25fa2V5c1tpXSk7Ci0KLQlyZWcgPSBsZTMyX3RvX2NwdShzdGEtPnJlZyk7Ci0JUFJJTlRLX0JJVFMoU1RBLCBJRF8xKTsKLQlQUklOVEtfQklUUyhTVEEsIElEXzApOwotCVBSSU5US19CSVRTKFNUQSwgRU5BQkxFX0NPTkNBVEVOQVRJT04pOwotCVBSSU5US19CSVRTKFNUQSwgRU5BQkxFX0RFQ09NUFJFU1NJT04pOwotCVBSSU5US19CSVRTKFNUQSwgU1RBX1JFU0VSVkVEKTsKLQlQUklOVEtfQklUUyhTVEEsIEVBUCk7Ci0JUFJJTlRLX0JJVFMoU1RBLCBFRF9OVUxMKTsKLQlQUklOVEtfQklUUyhTVEEsIEVOQ1JZUFRJT05fUE9MSUNZKTsKLQlQUklOVEtfQklUUyhTVEEsIERFRklORURfS0VZX0lEKTsKLQlQUklOVEtfQklUUyhTVEEsIEZJWEVEX0tFWSk7Ci0JUFJJTlRLX0JJVFMoU1RBLCBLRVlfVkFMSUQpOwotCVBSSU5US19CSVRTKFNUQSwgU1RBVElPTl9WQUxJRCk7Ci0KLQlQUklOVEtfTEUzMihTVEEsIHN0YS0+dHhfYWVzX2Jsa3NfdW5pY2FzdCk7Ci0JUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnJ4X2Flc19ibGtzX3VuaWNhc3QpOwotCi0JUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFlc19mb3JtYXRfZXJyX3VuaWNhc3RfY250KTsKLQlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWVzX3JlcGxheV91bmljYXN0KTsKLQotCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hZXNfZGVjcnlwdF9lcnJfdW5pY2FzdCk7Ci0JUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFlc19kZWNyeXB0X2Vycl9kZWZhdWx0KTsKLQotCVBSSU5US19MRTE2KFNUQSwgc3RhLT5zaW5nbGVfcmV0cnlfcGFja2V0cyk7Ci0JUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmZhaWxlZF90eF9wYWNrZXRzKTsKLQotCVBSSU5US19MRTE2KFNUQSwgc3RhLT5tdXRpX3JldHJ5X3BhY2tldHMpOwotCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hY2tfdGltZW91dHMpOwotCi0JUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmZyYWdfdHhfY250KTsKLQlQUklOVEtfTEUxNihTVEEsIHN0YS0+cnRzX2JycV9zZW50KTsKLQotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50eF9wYWNrZXRzKTsKLQlQUklOVEtfTEUxNihTVEEsIHN0YS0+Y3RzX2JhY2tfdGltZW91dCk7Ci0KLQlQUklOVEtfTEUzMihTVEEsIHN0YS0+cGh5X3N0YXRzX2hpZ2gpOwotCVBSSU5US19MRTMyKFNUQSwgc3RhLT5waHlfc3RhdHNfbG93KTsKLQotCS8qIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspICovCi0JYWdueF9wcmludF9zdGFfdHJhZmZpYyhzdGEtPnRyYWZmaWMgKyAwKTsKLQotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMF9mcmFnX3N1Y2Nlc3MpOwotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMV9mcmFnX3N1Y2Nlc3MpOwotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMl9mcmFnX3N1Y2Nlc3MpOwotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzM19mcmFnX3N1Y2Nlc3MpOwotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNF9mcmFnX3N1Y2Nlc3MpOwotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNV9mcmFnX3N1Y2Nlc3MpOwotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNl9mcmFnX3N1Y2Nlc3MpOwotCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzN19mcmFnX3N1Y2Nlc3MpOwotCi0JUFJJTlRLX0xFMTYoU1RBLCBzdGEtPm51bV9mcmFnX25vbl9wcmltZV9yYXRlcyk7Ci0JUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFja190aW1lb3V0X25vbl9wcmltZV9yYXRlcyk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaWVlZTgwMjExX2hkcihzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBjaGFyICp0YWcpCi17Ci0JdTE2IGZjdGw7Ci0JaW50IGhkcmxlbjsKLQotCWZjdGwgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpOwotCXN3aXRjaCAoZmN0bCAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKLQkJcHJpbnRrKFBGWCAiJXMgREFUQSAiLCB0YWcpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCXByaW50ayhQRlggIiVzIENUTCAiLCB0YWcpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgotCQlwcmludGsoUEZYICIlcyBNR01UICIsIHRhZyk7Ci0JCXN3aXRjaCAoZmN0bCAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSB7Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUToKLQkJCXByaW50aygiU3ViVHlwZTogQVNTT0NfUkVRICIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1A6Ci0JCQlwcmludGsoIlN1YlR5cGU6IEFTU09DX1JFU1AgIik7Ci0JCQlicmVhazsKLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVE6Ci0JCQlwcmludGsoIlN1YlR5cGU6IFJFQVNTT0NfUkVRICIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUDoKLQkJCXByaW50aygiU3ViVHlwZTogUkVBU1NPQ19SRVNQICIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKLQkJCXByaW50aygiU3ViVHlwZTogUFJPQkVfUkVRICIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6Ci0JCQlwcmludGsoIlN1YlR5cGU6IFBST0JFX1JFU1AgIik7Ci0JCQlicmVhazsKLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgotCQkJcHJpbnRrKCJTdWJUeXBlOiBCRUFDT04gIik7Ci0JCQlicmVhazsKLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVRJTToKLQkJCXByaW50aygiU3ViVHlwZTogQVRJTSAiKTsKLQkJCWJyZWFrOwotCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKLQkJCXByaW50aygiU3ViVHlwZTogRElTQVNTT0MgIik7Ci0JCQlicmVhazsKLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKLQkJCXByaW50aygiU3ViVHlwZTogQVVUSCAiKTsKLQkJCWJyZWFrOwotCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6Ci0JCQlwcmludGsoIlN1YlR5cGU6IERFQVVUSCAiKTsKLQkJCWJyZWFrOwotCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ1RJT046Ci0JCQlwcmludGsoIlN1YlR5cGU6IEFDVElPTiAiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJTdWJUeXBlOiBVbmtub3dcbiIpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhQRlggIiVzIFBhY2tldCB0eXBlOiBVbmtub3dcbiIsIHRhZyk7Ci0JfQotCi0JaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihmY3RsKTsKLQotCWlmIChoZHJsZW4gPj0gNCkKLQkJcHJpbnRrKCJGQz0weCUwNHggRFVSPTB4JTA0eCIsCi0JCSAgICAgICBmY3RsLCBsZTE2X3RvX2NwdShoZHItPmR1cmF0aW9uX2lkKSk7Ci0JaWYgKGhkcmxlbiA+PSAxMCkKLQkJcHJpbnRrKCIgQTE9JXBNIiwgaGRyLT5hZGRyMSk7Ci0JaWYgKGhkcmxlbiA+PSAxNikKLQkJcHJpbnRrKCIgQTI9JXBNIiwgaGRyLT5hZGRyMik7Ci0JaWYgKGhkcmxlbiA+PSAyNCkKLQkJcHJpbnRrKCIgQTM9JXBNIiwgaGRyLT5hZGRyMyk7Ci0JaWYgKGhkcmxlbiA+PSAzMCkKLQkJcHJpbnRrKCIgQTQ9JXBNIiwgaGRyLT5hZGRyNCk7Ci0JcHJpbnRrKCJcbiIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtcF90eG1fcmVnaXN0ZXJzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8PSAweDFlODsgaSArPSA0KQotCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIlRYTTogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgaSkpOwotfQotc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcnhtX3JlZ2lzdGVycyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPD0gMHgxMDg7IGkgKz0gNCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJSWE06ICV4LS0tPiAweCUuOHhcbiIsIGksIGlvcmVhZDMyKGN0bCArIDB4MjAwMCArIGkpKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2JtX3JlZ2lzdGVycyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPD0gMHg5MDsgaSArPSA0KQotCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIkJNOiAleC0tLT4gMHglLjh4XG4iLCBpLCBpb3JlYWQzMihjdGwgKyAweDJjMDAgKyBpKSk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9jaXJfcmVnaXN0ZXJzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8PSAweGI4OyBpICs9IDQpCi0JCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQ0lSOiAleC0tLT4gMHglLjh4XG4iLCBpLCBpb3JlYWQzMihjdGwgKyAweDMwMDAgKyBpKSk7Ci19Ci0KLSNlbmRpZiAvKiBBR05YX0RFQlVHX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI1NDg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM1ICswLDAgQEAKLS8qKgotICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KLQotICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCi0gKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCi0KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlICJhZ254LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ4bWl0LmgiCi0jaW5jbHVkZSAicGh5LmgiCi0KLU1PRFVMRV9BVVRIT1IoIkxpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFpcmdvIE1JTU8gUENJIHdpcmVsZXNzIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdueF9wY2lfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKLQl7IFBDSV9ERVZJQ0UoMHgxN2NiLCAweDAwMDEpIH0sCS8qIEJla2xpbiBGNWQ4MDEwLCBOZXRnZWFyIFdHTTUxMSBldGMgKi8KLQl7IFBDSV9ERVZJQ0UoMHgxN2NiLCAweDAwMDIpIH0sCS8qIE5ldGdlYXIgV3BudDUxMSAqLwotCXsgMCB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWdueF9wY2lfaWRfdGJsKTsKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWdueF9pbnRlcnJ1cHRfYWNrKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiAqcmVhc29uKQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0KLQlpZiAoKnJlYXNvbiAmIEFHTlhfU1RBVF9SWCkgewotCQkvKiBNYXJrIGNvbXBsZXRlIFJYICovCi0JCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKLQkJcmVnIHw9IDB4NDsKLQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9DSVJfUlhDVEwpOwotCQkvKiBkaXNhYmxlIFJ4IGludGVycnVwdCAqLwotCX0KLQlpZiAoKnJlYXNvbiAmIEFHTlhfU1RBVF9UWCkgewotCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9UWERDVEwpOwotCQlpZiAocmVnICYgMHg0KSB7Ci0JCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9UWERDVEwpOwotCQkJKnJlYXNvbiB8PSBBR05YX1NUQVRfVFhEOwotCQl9Ci0JCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1RYTUNUTCk7Ci0JCWlmIChyZWcgJiAweDQpIHsKLQkJCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfQ0lSX1RYTUNUTCk7Ci0JCQkqcmVhc29uIHw9IEFHTlhfU1RBVF9UWE07Ci0JCX0KLQl9Ci0jaWYgMAotCWlmICgqcmVhc29uICYgQUdOWF9TVEFUX1gpIHsKLQkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfU1RBVCk7Ci0JCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfSU5UX1NUQVQpOwotCQkvKiBGSVhNRSByZWluaXQgaW50ZXJydXB0IG1hc2sgKi8KLQkJcmVnID0gMHhjMzkwYmY5ICYgfklSUV9UWF9CRUFDT047Ci0JCXJlZyAmPSB+SVJRX1RYX0RJU0FCTEU7Ci0JCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfSU5UX01BU0spOwotCQlpb3dyaXRlMzIoMHg4MDAsIGN0bCArIEFHTlhfQ0lSX0JMS0NUTCk7Ci0JfQotI2VuZGlmCi19IC8qIGFnbnhfaW50ZXJydXB0X2FjayAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWdueF9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gZGV2X2lkOwotCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0JdTMyIGlycV9yZWFzb247Ci0KLQlzcGluX2xvY2soJnByaXYtPmxvY2spOwotCi0vKglwcmludGsoS0VSTl9FUlIgUEZYICJHZXQgYSBpbnRlcnJ1cHQgJXNcbiIsIF9fZnVuY19fKTsgKi8KLQotCWlmIChwcml2LT5pbml0X3N0YXR1cyAhPSBBR05YX1NUQVJUKQotCQlnb3RvIG91dDsKLQotCS8qIEZpWE1FICBIZXJlIGhhcyBubyBsb2NrLCBJcyB0aGlzIHdpbGwgbGVhZCB0byByYWNlPyAqLwotCWlycV9yZWFzb24gPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9CTEtDVEwpOwotCWlmICghKGlycV9yZWFzb24gJiAweDcpKQotCQlnb3RvIG91dDsKLQotCXJldCA9IElSUV9IQU5ETEVEOwotCXByaXYtPmlycV9zdGF0dXMgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9TVEFUKTsKLQotLyoJcHJpbnRrKFBGWCAiSW50ZXJydXB0IHJlYXNvbiBpcyAweCV4XG4iLCBpcnFfcmVhc29uKTsgKi8KLQkvKiBNYWtlIHN1cmUgdGhlIHR4bSBhbmQgdHhkIGZsYWdzIGRvbid0IGNvbmZsaWN0IHdpdGggb3RoZXIgdW5rbm93bgotCSAgIGludGVycnVwdCBmbGFnLCBtYXliZSBpcyBub3QgbmVjZXNzYXJ5ICovCi0JaXJxX3JlYXNvbiAmPSAweEY7Ci0KLQlkaXNhYmxlX3J4X2ludGVycnVwdChwcml2KTsKLQkvKiBUT0RPIE1ha2Ugc3VyZSB0aGUgY2FyZCBmaW5pc2hlZCBpbml0aWFsaXplZCAqLwotCWFnbnhfaW50ZXJydXB0X2Fjayhwcml2LCAmaXJxX3JlYXNvbik7Ci0KLQlpZiAoaXJxX3JlYXNvbiAmIEFHTlhfU1RBVF9SWCkKLQkJaGFuZGxlX3J4X2lycShwcml2KTsKLQlpZiAoaXJxX3JlYXNvbiAmIEFHTlhfU1RBVF9UWEQpCi0JCWhhbmRsZV90eGRfaXJxKHByaXYpOwotCWlmIChpcnFfcmVhc29uICYgQUdOWF9TVEFUX1RYTSkKLQkJaGFuZGxlX3R4bV9pcnEocHJpdik7Ci0JaWYgKGlycV9yZWFzb24gJiBBR05YX1NUQVRfWCkKLQkJaGFuZGxlX290aGVyX2lycShwcml2KTsKLQotCWVuYWJsZV9yeF9pbnRlcnJ1cHQocHJpdik7Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwotCXJldHVybiByZXQ7Ci19IC8qIGFnbnhfaW50ZXJydXB0X2hhbmRsZXIgKi8KLQotCi0vKiBGSVhNRSAqLwotc3RhdGljIGludCBhZ254X3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlBR05YX1RSQUNFOwotCXJldHVybiBfYWdueF90eChkZXYtPnByaXYsIHNrYik7Ci19IC8qIGFnbnhfdHggKi8KLQotCi1zdGF0aWMgaW50IGFnbnhfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTMyIHJlZzsKLQlBR05YX1RSQUNFOwotCi0JLyogQXR0ZW50aW9uISBkaXJlY3RseSByZWFkIHRoZSBNQUMgb3Igb3RoZXIgZGF0ZSBmcm9tIEVFUFJPTSB3aWxsCi0JIGxlYWQgdG8gY2FyZGJ1cyhXR001MTEpIGxvY2sgdXAgd2hlbiB3cml0ZSB0byBQTSBQTEwgcmVnaXN0ZXIgKi8KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MzU0NCk7Ci0JdWRlbGF5KDQwKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MzU0Yyk7Ci0JdWRlbGF5KDUwKTsKLQkvKiBHZXQgdGhlIG1hYyBhZGRyZXNzICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweDM1NDQpOwotCXVkZWxheSg0MCk7Ci0KLQkvKiBIQUNLICovCi0JcmVnID0gY3B1X3RvX2xlMzIocmVnKTsKLQlwcml2LT5tYWNfYWRkclswXSA9ICgodTggKikmcmVnKVsyXTsKLQlwcml2LT5tYWNfYWRkclsxXSA9ICgodTggKikmcmVnKVszXTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MzU0OCk7Ci0JdWRlbGF5KDUwKTsKLQkqKCh1MzIgKikocHJpdi0+bWFjX2FkZHIgKyAyKSkgPSBjcHVfdG9fbGUzMihyZWcpOwotCi0JaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPm1hY19hZGRyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAicmVhZCBtYWMgJXBNXG4iLCBwcml2LT5tYWNfYWRkcik7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJJbnZhbGlkIGh3YWRkciEgVXNpbmcgcmFuZG9tIGh3YWRkclxuIik7Ci0JCXJhbmRvbV9ldGhlcl9hZGRyKHByaXYtPm1hY19hZGRyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0gLyogYWdueF9nZXRfbWFjX2FkZHJlc3MgKi8KLQotc3RhdGljIGludCBhZ254X2FsbG9jX3JpbmdzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgaW50IGxlbjsKLQlBR05YX1RSQUNFOwotCi0JLyogQWxsb2NhdGUgUlgvVFhNL1RYRCByaW5ncyBpbmZvICovCi0JcHJpdi0+cnguc2l6ZSA9IEFHTlhfUlhfUklOR19TSVpFOwotCXByaXYtPnR4bS5zaXplID0gQUdOWF9UWE1fUklOR19TSVpFOwotCXByaXYtPnR4ZC5zaXplID0gQUdOWF9UWERfUklOR19TSVpFOwotCi0JbGVuID0gcHJpdi0+cnguc2l6ZSArIHByaXYtPnR4bS5zaXplICsgcHJpdi0+dHhkLnNpemU7Ci0KLS8qCXByaXYtPnJ4LmluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWdueF9pbmZvKSAqIGxlbiwgR0ZQX0tFUk5FTCk7ICovCi0JcHJpdi0+cnguaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZ254X2luZm8pICogbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXByaXYtPnJ4LmluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCXByaXYtPnR4bS5pbmZvID0gcHJpdi0+cnguaW5mbyArIHByaXYtPnJ4LnNpemU7Ci0JcHJpdi0+dHhkLmluZm8gPSBwcml2LT50eG0uaW5mbyArIHByaXYtPnR4bS5zaXplOwotCi0JLyogQWxsb2NhdGUgUlgvVFhNL1RYRCBkZXNjcmlwdG9ycyAqLwotCXByaXYtPnJ4LmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwcml2LT5wZGV2LCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBsZW4sCi0JCQkJCSAgICAgJnByaXYtPnJ4LmRtYSk7Ci0JaWYgKCFwcml2LT5yeC5kZXNjKSB7Ci0JCWtmcmVlKHByaXYtPnJ4LmluZm8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwcml2LT50eG0uZGVzYyA9IHByaXYtPnJ4LmRlc2MgKyBwcml2LT5yeC5zaXplOwotCXByaXYtPnR4bS5kbWEgPSBwcml2LT5yeC5kbWEgKyBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBwcml2LT5yeC5zaXplOwotCXByaXYtPnR4ZC5kZXNjID0gcHJpdi0+dHhtLmRlc2MgKyBwcml2LT50eG0uc2l6ZTsKLQlwcml2LT50eGQuZG1hID0gcHJpdi0+dHhtLmRtYSArIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIHByaXYtPnR4bS5zaXplOwotCi0JcmV0dXJuIDA7Ci19IC8qIGFnbnhfYWxsb2NfcmluZ3MgKi8KLQotc3RhdGljIHZvaWQgcmluZ3NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGludCBsZW4gPSBwcml2LT5yeC5zaXplICsgcHJpdi0+dHhtLnNpemUgKyBwcml2LT50eGQuc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCUFHTlhfVFJBQ0U7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWtmcmVlKHByaXYtPnJ4LmluZm8pOwotCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdi0+cGRldiwgc2l6ZW9mKHN0cnVjdCBhZ254X2Rlc2MpICogbGVuLAotCQkJICAgIHByaXYtPnJ4LmRlc2MsIHByaXYtPnJ4LmRtYSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotfQotCi0jaWYgMAotc3RhdGljIHZvaWQgYWdueF9wZXJpb2RpY193b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFnbnhfcHJpdiwgcGVyaW9kaWNfd29yay53b3JrKTsKLS8qCXVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCi0JdW5zaWduZWQgbG9uZyBkZWxheTsKLQotCS8qIGZpeG1lOiB1c2luZyBtdXRleD8/ICovCi0vKglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOyAqLwotCi0JLyogVE9ETyBSZWNhbGlicmF0ZSovCi0vKgljYWxpYnJhdGVfb3NjaWxsYXRvcihwcml2KTsgKi8KLS8qCWFudGVubmFfY2FsaWJyYXRlKHByaXYpOyAqLwotLyoJYWdueF9zZW5kX3BhY2tldChwcml2LCA5OTcpOyAqLwotCS8qIEZJWE1FICovCi0vKiAJaWYgKGRlYnVnID09IDMpICovCi0vKiAgICAgICAgICAgICAgICAgZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKEFHTlhfUEVSSU9ESUNfREVMQVkpOyAqLwotLyogCWVsc2UgKi8KLQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoQUdOWF9QRVJJT0RJQ19ERUxBWSk7Ci0vKglkZWxheSA9IHJvdW5kX2ppZmZpZXMoSFogKiAxNSk7ICovCi0KLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHctPndvcmtxdWV1ZSwgJnByaXYtPnBlcmlvZGljX3dvcmssIGRlbGF5KTsKLQotLyoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOyAqLwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYWdueF9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCi17Ci0Jc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKLQkvKiB1bnNpZ25lZCBsb25nIGRlbGF5OyAqLwotCWludCBlcnIgPSAwOwotCUFHTlhfVFJBQ0U7Ci0KLQllcnIgPSBhZ254X2FsbG9jX3JpbmdzKHByaXYpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgYWxsb2MgUlgvVFhNL1RYRCByaW5nc1xuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQllcnIgPSByZXF1ZXN0X2lycShwcml2LT5wZGV2LT5pcnEsICZhZ254X2ludGVycnVwdF9oYW5kbGVyLAotCQkJICBJUlFGX1NIQVJFRCwgImFnbnhfcGNpIiwgZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byByZWdpc3RlciBJUlEgaGFuZGxlclxuIik7Ci0JCXJpbmdzX2ZyZWUocHJpdik7Ci0JCWdvdG8gb3V0OwotCX0KLQotLyoJbWRlbGF5KDUwMCk7ICovCi0KLQltaWdodF9zbGVlcCgpOwotCWFnbnhfaHdfaW5pdChwcml2KTsKLQotLyoJbWRlbGF5KDUwMCk7ICovCi0JbWlnaHRfc2xlZXAoKTsKLQotCXByaXYtPmluaXRfc3RhdHVzID0gQUdOWF9TVEFSVDsKLS8qICAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnBlcmlvZGljX3dvcmssIGFnbnhfcGVyaW9kaWNfd29ya19oYW5kbGVyKTsgKi8KLS8qIAlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoQUdOWF9QRVJJT0RJQ19ERUxBWSk7ICovCi0vKiAgICAgICAgIHF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5ody0+d29ya3F1ZXVlLCAmcHJpdi0+cGVyaW9kaWNfd29yaywgZGVsYXkpOyAqLwotb3V0OgotCXJldHVybiBlcnI7Ci19IC8qIGFnbnhfc3RhcnQgKi8KLQotc3RhdGljIHZvaWQgYWdueF9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKLXsKLQlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwotCUFHTlhfVFJBQ0U7Ci0KLQlwcml2LT5pbml0X3N0YXR1cyA9IEFHTlhfU1RPUDsKLQkvKiBtYWtlIHN1cmUgaGFyZHdhcmUgd2lsbCBub3QgZ2VuZXJhdGUgaXJxICovCi0JYWdueF9od19yZXNldChwcml2KTsKLQlmcmVlX2lycShwcml2LT5wZGV2LT5pcnEsIGRldik7Ci0vKglmbHVzaF93b3JrcXVldWUocHJpdi0+aHctPndvcmtxdWV1ZSk7ICovCi0vKgljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnBlcmlvZGljX3dvcmspOyAqLwotCXVuZmlsbF9yaW5ncyhwcml2KTsKLQlyaW5nc19mcmVlKHByaXYpOwotfQotCi1zdGF0aWMgaW50IGFnbnhfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdTMyIGNoYW5nZWQpCi17Ci0Jc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmZGV2LT5jb25mOwotCWludCBjaGFubmVsID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNvbmYtPmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKLQlBR05YX1RSQUNFOwotCi0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKLQkvKiBGSVhNRSBuZWVkIHByaXYgbG9jaz8gKi8KLQlpZiAoY2hhbm5lbCAhPSBwcml2LT5jaGFubmVsKSB7Ci0JCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOwotCQlhZ254X3NldF9jaGFubmVsKHByaXYsIHByaXYtPmNoYW5uZWwpOwotCX0KLQotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYWdueF9ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpjb25mLAotCQkJCSAgdTMyIGNoYW5nZWQpCi17Ci0Jc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQlBR05YX1RSQUNFOwotCi0JaWYgKCEoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JTU0lEKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKLQotCWlmIChtZW1jbXAoY29uZi0+YnNzaWQsIHByaXYtPmJzc2lkLCBFVEhfQUxFTikpIHsKLQkJYWdueF9zZXRfYnNzaWQocHJpdiwgY29uZi0+YnNzaWQpOwotCQltZW1jcHkocHJpdi0+YnNzaWQsIGNvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JCWhhc2hfd3JpdGUocHJpdiwgY29uZi0+YnNzaWQsIEJTU0lEX1NUQUlEKTsKLQkJc3RhX2luaXQocHJpdiwgQlNTSURfU1RBSUQpOwotCQkvKiBGSVhNRSBuZWVkZWQ/ICovCi0JCXN0YV9wb3dlcl9pbml0KHByaXYsIEJTU0lEX1NUQUlEKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9NVFNNLCAweGZmICYgfjB4MSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLX0gLyogYWdueF9ic3NfaW5mb19jaGFuZ2VkICovCi0KLQotc3RhdGljIHZvaWQgYWdueF9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCQkgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAotCQkJCSAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKLQkJCQkgIGludCBtY19jb3VudCwgc3RydWN0IGRldl9tY19saXN0ICptY2xpc3QpCi17Ci0JdW5zaWduZWQgaW50IG5ld19mbGFncyA9IDA7Ci0KLQkqdG90YWxfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0JLyogVE9ETyAqLwotfQotCi1zdGF0aWMgaW50IGFnbnhfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKLXsKLQlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwotCUFHTlhfVFJBQ0U7Ci0KLQlzcGluX2xvY2soJnByaXYtPmxvY2spOwotCS8qIEZJWE1FICovCi0JaWYgKHByaXYtPm1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0Jc3dpdGNoIChjb25mLT50eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlwcml2LT5tb2RlID0gY29uZi0+dHlwZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLQotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhZ254X3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCi17Ci0Jc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKLQlBR05YX1RSQUNFOwotCi0JLyogVE9ETyAqLwotCXByaXYtPm1vZGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOwotfQotCi1zdGF0aWMgaW50IGFnbnhfZ2V0X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCSAgc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKQotewotCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7Ci0JQUdOWF9UUkFDRTsKLQlzcGluX2xvY2soJnByaXYtPmxvY2spOwotCS8qIFRPRE8gISEgKi8KLQltZW1jcHkoc3RhdHMsICZwcml2LT5zdGF0cywgc2l6ZW9mKCpzdGF0cykpOwotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTY0IGFnbnhfZ2V0X3RzZnQoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gKChzdHJ1Y3QgYWdueF9wcml2ICopZGV2LT5wcml2KS0+Y3RsOwotCXUzMiB0c2Z0bDsKLQl1NjQgdHNmdDsKLQlBR05YX1RSQUNFOwotCi0JLyogRklYTUUgKi8KLQl0c2Z0bCA9IGlvcmVhZDMyKGN0bCArIEFHTlhfVFhNX1RJTUVTVEFNUExPKTsKLQl0c2Z0ID0gaW9yZWFkMzIoY3RsICsgQUdOWF9UWE1fVElNRVNUQU1QSEkpOwotCXRzZnQgPDw9IDMyOwotCXRzZnQgfD0gdHNmdGw7Ci0KLQlyZXR1cm4gdHNmdDsKLX0KLQotc3RhdGljIGludCBhZ254X2dldF90eF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfc3RhdHMgKnN0YXRzKQotewotCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7Ci0JQUdOWF9UUkFDRTsKLQotCS8qIEZJWE1FIG5vdyB3ZSBqdXN0IHVzaW5nIHR4ZCBxdWV1ZSwgYnV0IHNob3VsZCB1c2luZyB0eG0gcXVldWUgdG9vICovCi0Jc3RhdHNbMF0ubGVuID0gKHByaXYtPnR4ZC5pZHggLSBwcml2LT50eGQuaWR4X3NlbnQpIC8gMjsKLQlzdGF0c1swXS5saW1pdCA9IHByaXYtPnR4ZC5zaXplIC0gMjsKLQlzdGF0c1swXS5jb3VudCA9IHByaXYtPnR4ZC5pZHggLyAyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX29wcyBhZ254X29wcyA9IHsKLQkudHgJCQk9IGFnbnhfdHgsCi0JLnN0YXJ0CQkJPSBhZ254X3N0YXJ0LAotCS5zdG9wCQkJPSBhZ254X3N0b3AsCi0JLmFkZF9pbnRlcmZhY2UJCT0gYWdueF9hZGRfaW50ZXJmYWNlLAotCS5yZW1vdmVfaW50ZXJmYWNlCT0gYWdueF9yZW1vdmVfaW50ZXJmYWNlLAotCS5jb25maWcJCQk9IGFnbnhfY29uZmlnLAotCS5ic3NfaW5mb19jaGFuZ2VkCT0gYWdueF9ic3NfaW5mb19jaGFuZ2VkLAotCS5jb25maWd1cmVfZmlsdGVyCT0gYWdueF9jb25maWd1cmVfZmlsdGVyLAotCS5nZXRfc3RhdHMJCT0gYWdueF9nZXRfc3RhdHMsCi0JLmdldF90eF9zdGF0cwkJPSBhZ254X2dldF90eF9zdGF0cywKLQkuZ2V0X3RzZgkJPSBhZ254X2dldF90c2Z0Ci19OwotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdueF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYWdueF9wcml2ICpwcml2OwotCUFHTlhfVFJBQ0U7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuOwotCXByaXYgPSBkZXYtPnByaXY7Ci0JaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoZGV2KTsKLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5jdGwpOwotCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmRhdGEpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0JaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgYWdueF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXY7Ci0Jc3RydWN0IGFnbnhfcHJpdiAqcHJpdjsKLQlpbnQgZXJyOwotCi0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBlbmFibGUgcGNpIGRldmljZVxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiYWdueC1wY2kiKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkgfHwKLQkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIpOwotCQllcnIgPSAtRUlPOwotCQlnb3RvIGVycl9mcmVlX3JlZzsKLQl9Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCWRldiA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2YoKnByaXYpLCAmYWdueF9vcHMpOwotCWlmICghZGV2KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImllZWU4MDIxMSBhbGxvYyBmYWlsZWRcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9mcmVlX3JlZzsKLQl9Ci0JcHJpdiA9IGRldi0+cHJpdjsKLQltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7Ci0JcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7Ci0JcHJpdi0+cGRldiA9IHBkZXY7Ci0JcHJpdi0+aHcgPSBkZXY7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwotCXByaXYtPmluaXRfc3RhdHVzID0gQUdOWF9VTklOSVQ7Ci0KLQlwcml2LT5jdGwgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7Ci0vKglkZXZfZGJnKCZwZGV2LT5kZXYsICJNRU0xIG1hcHBlZCBhZGRyZXNzIGlzIDB4JXBcbiIsIHByaXYtPmN0bCk7ICovCi0JaWYgKCFwcml2LT5jdGwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgbWFwIGRldmljZSBtZW1vcnlcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9mcmVlX2RldjsKLQl9Ci0JcHJpdi0+ZGF0YSA9IHBjaV9pb21hcChwZGV2LCAxLCAwKTsKLQlpZiAoIXByaXYtPmRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgbWFwIGRldmljZSBtZW1vcnlcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9pb3VubWFwMjsKLQl9Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZwcml2LT5yZXZpZCk7Ci0KLQlwcml2LT5iYW5kLmNoYW5uZWxzICAgPSAoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICopYWdueF9jaGFubmVsczsKLQlwcml2LT5iYW5kLm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFnbnhfY2hhbm5lbHMpOwotCXByaXYtPmJhbmQuYml0cmF0ZXMgICA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKilhZ254X3JhdGVzXzgwMjExZzsKLQlwcml2LT5iYW5kLm5fYml0cmF0ZXMgPSBBUlJBWV9TSVpFKGFnbnhfcmF0ZXNfODAyMTFnKTsKLQotCS8qIEluaXQgaWVlZTgwMi4xMSBkZXYgICovCi0JU0VUX0lFRUU4MDIxMV9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKLQlkZXYtPmV4dHJhX3R4X2hlYWRyb29tID0gc2l6ZW9mKHN0cnVjdCBhZ254X2hkcik7Ci0KLQkvKiBGSVhNRSBJdCBvbmx5IGluY2x1ZGUgRkNTIGluIHByb21pb3VzIG1vZGUgYnV0IG5vdCBtYW5hZ2UgbW9kZSAqLwotLyogICAgICBkZXYtPmZsYWdzID0gIElFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1M7ICovCi0JZGV2LT5jaGFubmVsX2NoYW5nZV90aW1lID0gNTAwMDsKLQlkZXYtPm1heF9zaWduYWwgPSAxMDA7Ci0JLyogRklYTUUgKi8KLQlkZXYtPnF1ZXVlcyA9IDE7Ci0KLQlhZ254X2dldF9tYWNfYWRkcmVzcyhwcml2KTsKLQotCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGRldiwgcHJpdi0+bWFjX2FkZHIpOwotCi0vKiAJL1wqIEZJWE1FICpcLyAqLwotLyogCWZvciAoaSA9IDE7IGkgPCBOVU1fRFJJVkVfTU9ERVM7IGkrKykgeyAqLwotLyogCQllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHdtb2RlKGRldiwgJnByaXYtPm1vZGVzW2ldKTsgKi8KLS8qIAkJaWYgKGVycikgeyAqLwotLyogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgcmVnaXN0ZXIgaHdtb2RlXG4iKTsgKi8KLS8qIAkJCWdvdG8gIGVycl9pb3VubWFwOyAqLwotLyogCQl9ICovCi0vKiAJfSAqLwotCi0JcHJpdi0+Y2hhbm5lbCA9IDE7Ci0JZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmcHJpdi0+YmFuZDsKLQotCWVyciA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgcmVnaXN0ZXIgaGFyZHdhcmVcbiIpOwotCQlnb3RvIGVycl9pb3VubWFwOwotCX0KLQotCWFnbnhfaHdfcmVzZXQocHJpdik7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXM6IGh3YWRkciAlcE0sIFJldiAweCUwMnhcbiIsCi0JCXdpcGh5X25hbWUoZGV2LT53aXBoeSksCi0JCWRldi0+d2lwaHktPnBlcm1fYWRkciwgcHJpdi0+cmV2aWQpOwotCXJldHVybiAwOwotCi0gZXJyX2lvdW5tYXA6Ci0JcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+ZGF0YSk7Ci0KLSBlcnJfaW91bm1hcDI6Ci0JcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+Y3RsKTsKLQotIGVycl9mcmVlX2RldjoKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKLQotIGVycl9mcmVlX3JlZzoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXJldHVybiBlcnI7Ci19IC8qIGFnbnhfcGNpX3Byb2JlKi8KLQotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgaW50IGFnbnhfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JQUdOWF9UUkFDRTsKLQotCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhkZXYpOwotCWFnbnhfc3RvcChkZXYpOwotCi0JcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWdueF9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlBR05YX1RSQUNFOwotCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCi0JYWdueF9zdGFydChkZXYpOwotCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0KLSNkZWZpbmUgYWdueF9wY2lfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGFnbnhfcGNpX3Jlc3VtZSBOVUxMCi0KLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWdueF9wY2lfZHJpdmVyID0gewotCS5uYW1lCQk9ICJhZ254LXBjaSIsCi0JLmlkX3RhYmxlCT0gYWdueF9wY2lfaWRfdGJsLAotCS5wcm9iZQkJPSBhZ254X3BjaV9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFnbnhfcGNpX3JlbW92ZSksCi0JLnN1c3BlbmQJPSBhZ254X3BjaV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gYWdueF9wY2lfcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWdueF9wY2lfaW5pdCh2b2lkKQotewotCUFHTlhfVFJBQ0U7Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFnbnhfcGNpX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhZ254X3BjaV9leGl0KHZvaWQpCi17Ci0JQUdOWF9UUkFDRTsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFnbnhfcGNpX2RyaXZlcik7Ci19Ci0KLQotbW9kdWxlX2luaXQoYWdueF9wY2lfaW5pdCk7Ci1tb2R1bGVfZXhpdChhZ254X3BjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGh5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMWNhODYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FnbngvcGh5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjAgKzAsMCBAQAotLyoqCi0gKiBBaXJnbyBNSU1PIHdpcmVsZXNzIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBMaSBZYW5CbyA8ZHJlYW1mbHkyODFAZ21haWwuY29tPgotCi0gKiBUaGFua3MgZm9yIEplZmYgV2lsbGlhbXMgPGFuZ2VsYmFuZUBnbWFpbC5jb20+IGRvIHJldmVyc2UgZW5naW5lZXIKLSAqIHdvcmtzIGFuZCBwdWJsaXNoZWQgdGhlIFNQRUNTIGF0IGh0dHA6Ly9haXJnby53ZHdjb25zdWx0aW5nLm5ldC9teW1vaW4KLQotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICJhZ254LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJwaHkuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotI2luY2x1ZGUgInN0YS5oIgotI2luY2x1ZGUgInhtaXQuaCIKLQotdTggcmVhZF9mcm9tX2VlcHJvbShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MTYgYWRkcmVzcykKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQlzdHJ1Y3QgYWdueF9lZXByb20gY21kOwotCXUzMiByZWc7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWQgPSBFRVBST01fQ01EX1JFQUQgPDwgQUdOWF9FRVBST01fQ09NTUFORF9TSElGVDsKLQljbWQuYWRkcmVzcyA9IGFkZHJlc3M7Ci0JLyogVmVyaWZ5IHRoYXQgdGhlIFN0YXR1cyBiaXQgaXMgY2xlYXIgKi8KLQkvKiBSZWFkIENvbW1hbmQgYW5kIEFkZHJlc3MgYXJlIHdyaXR0ZW4gdG8gdGhlIFNlcmlhbCBJbnRlcmZhY2UgKi8KLQlpb3dyaXRlMzIoKihfX2xlMzIgKikmY21kLCBjdGwgKyBBR05YX0NJUl9TRVJJQUxJVEYpOwotCS8qIFdhaXQgZm9yIHRoZSBTdGF0dXMgYml0IHRvIGNsZWFyIGFnYWluICovCi0JZWVwcm9tX2RlbGF5KCk7Ci0JLyogUmVhZCBmcm9tIERhdGEgKi8KLQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9TRVJJQUxJVEYpOwotCi0JY21kID0gKihzdHJ1Y3QgYWdueF9lZXByb20gKikmcmVnOwotCi0JcmV0dXJuIGNtZC5kYXRhOwotfQotCi1zdGF0aWMgaW50IGNhcmRfZnVsbF9yZXNldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0JQUdOWF9UUkFDRTsKLQotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwsIDB4ODApOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMKTsKLQlyZXR1cm4gMDsKLX0KLQotaW5saW5lIHZvaWQgZW5hYmxlX3Bvd2VyX3NhdmluZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOwotCXJlZyAmPSB+MHg4OwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7Ci19Ci0KLWlubGluZSB2b2lkIGRpc2FibGVfcG93ZXJfc2F2aW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTMyIHJlZzsKLQotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7Ci0JcmVnIHw9IDB4ODsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOwotfQotCi0KLXZvaWQgZGlzYWJsZV9yZWNlaXZlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCUFHTlhfVFJBQ0U7Ci0KLQkvKiBGSVhNRSBEaXNhYmxlIHRoZSByZWNlaXZlciAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgwKTsKLQkvKiBTZXQgZ2FpbiBjb250cm9sIHJlc2V0ICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKLQkvKiBSZXNldCBnYWluIGNvbnRyb2wgcmVzZXQgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOwotfQotCi0KLS8qIEZpeG1lIHRoaXMgc2hvdWxlIGJlIGRpc2FibGUgUlgsIGFib3ZlIGlzIGVuYWJsZSBSWCAqLwotdm9pZCBlbmFibGVfcmVjZWl2ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQlBR05YX1RSQUNFOwotCi0JLyogU2V0IGFkYXB0aXZlIGdhaW4gY29udHJvbCBkaXNjb3ZlcnkgbW9kZSAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKLQkvKiBTZXQgZ2FpbiBjb250cm9sIHJlc2V0ICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKLQkvKiBDbGVhciBnYWluIGNvbnRyb2wgcmVzZXQgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOwotfQotCi1zdGF0aWMgdm9pZCBtYWNfYWRkcmVzc19zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl1OCAqbWFjX2FkZHIgPSBwcml2LT5tYWNfYWRkcjsKLQl1MzIgcmVnOwotCi0JLyogRklYTUUgKi8KLQlyZWcgPSAobWFjX2FkZHJbMF0gPDwgMjQpIHwgKG1hY19hZGRyWzFdIDw8IDE2KSB8IG1hY19hZGRyWzJdIDw8IDggfCBtYWNfYWRkclszXTsKLQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX1JYTV9NQUNISSk7Ci0JcmVnID0gKG1hY19hZGRyWzRdIDw8IDgpIHwgbWFjX2FkZHJbNV07Ci0JaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fTUFDTE8pOwotfQotCi1zdGF0aWMgdm9pZCByZWNlaXZlcl9ic3NpZF9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgY29uc3QgdTggKmJzc2lkKQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0KLQlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOwotCS8qIEZJWE1FICovCi0JcmVnID0gYnNzaWRbMF0gPDwgMjQgfCAoYnNzaWRbMV0gPDwgMTYpIHwgKGJzc2lkWzJdIDw8IDgpIHwgYnNzaWRbM107Ci0JaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fQlNTSURISSk7Ci0JcmVnID0gKGJzc2lkWzRdIDw8IDgpIHwgYnNzaWRbNV07Ci0JaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fQlNTSURMTyk7Ci0KLQkvKiBFbmFibGUgdGhlIHJlY2VpdmVyICovCi0JZW5hYmxlX3JlY2VpdmVyKHByaXYpOwotCi0JLyogQ2xlYXIgdGhlIFRTRiAqLwotLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RTRkxPLCAweDApOyAqLwotLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RTRkhJLCAweDApOyAqLwotCS8qIENsZWFyIHRoZSBUQlRUICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVEJUVExPLCAweDApOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RCVFRISSwgMHgwKTsKLQlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOwotfSAvKiByZWNlaXZlcl9ic3NpZF9zZXQgKi8KLQotc3RhdGljIHZvaWQgYmFuZF9tYW5hZ2VtZW50X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOwotCXUzMiByZWc7Ci0JaW50IGk7Ci0JQUdOWF9UUkFDRTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fVFhXQUREUiwgQUdOWF9QRFVfVFhfV1EpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0FERFJXSU4sIDB4MCk7Ci0JbWVtc2V0X2lvKGRhdGEgKyBBR05YX1BEVVBPT0wsIDB4MCwgQUdOWF9QRFVQT09MX1NJWkUpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQk1DVEwsIDB4MjAwKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQ0lQRFVXQ05ULCAweDQwKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1NQUERVV0NOVCwgMHgyKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1JGUFBEVVdDTlQsIDB4MCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9SSFBQRFVXQ05ULCAweDIyKTsKLQotCS8qIEZJWE1FIEluaXRpYWxpemUgdGhlIEZyZWUgUG9vbCBMaW5rZWQgTGlzdCAqLwotCS8qICAgIDEuIFdyaXRlIHRoZSBBZGRyZXNzIG9mIHRoZSBOZXh0IE5vZGUgKCgweDQxODAwICsgbm9kZSpzaXplKS9zaXplKQotCSAgICAgIHRvIHRoZSBmaXJzdCB3b3JkIG9mIGVhY2ggbm9kZS4gICovCi0JZm9yIChpID0gMDsgaSA8IFBEVV9GUkVFX0NOVDsgaSsrKSB7Ci0JCWlvd3JpdGUzMigoQUdOWF9QRFVfRlJFRSArIChpKzEpKlBEVV9TSVpFKS9QRFVfU0laRSwKLQkJCSAgZGF0YSArIEFHTlhfUERVX0ZSRUUgKyAoUERVX1NJWkUgKiBpKSk7Ci0JCS8qIFRoZSBsYXN0IG5vZGUgc2hvdWxkIGJlIHNldCB0byAweDAgKi8KLQkJaWYgKChpICsgMSkgPT0gUERVX0ZSRUVfQ05UKQotCQkJbWVtc2V0X2lvKGRhdGEgKyBBR05YX1BEVV9GUkVFICsgKFBEVV9TSVpFICogaSksCi0JCQkJICAweDAsIFBEVV9TSVpFKTsKLQl9Ci0KLQkvKiBIZWFkIGlzIEZpcnN0IFBvb2wgYWRkcmVzcyAoMHg0MTgwMCkgLyBzaXplICgweDgwKSAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fRlBMSFAsIEFHTlhfUERVX0ZSRUUvUERVX1NJWkUpOwotCS8qIFRhaWwgaXMgTGFzdCBQb29sIEFkZHJlc3MgKDB4NDdmODApIC8gc2l6ZSAoMHg4MCkgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0ZQTFRQLCAweDQ3ZjgwL1BEVV9TSVpFKTsKLQkvKiBDb3VudCBpcyBOdW1iZXIgb2YgTm9kZXMgaW4gdGhlIFBvb2wgKDB4ZDApICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9GUENOVCwgUERVX0ZSRUVfQ05UKTsKLQotCS8qIFN0YXJ0IGFsbCB3b3JrcXVldWUgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NJV1FDVEwsIDB4ODAwMDApOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQ1BVTFdDVEwsIDB4ODAwMDApOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQ1BVSFdDVEwsIDB4ODAwMDApOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQ1BVVFhXQ1RMLCAweDgwMDAwKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVVJYV0NUTCwgMHg4MDAwMCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9TUFJYV0NUTCwgMHg4MDAwMCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9TUFRYV0NUTCwgMHg4MDAwMCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9SRlBXQ1RMLCAweDgwMDAwKTsKLQotCS8qIEVuYWJsZSB0aGUgQmFuZCBNYW5hZ2VtZW50ICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0JNX0JNQ1RMKTsKLQlyZWcgfD0gMHgxOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQk1DVEwsIHJlZyk7Ci19IC8qIGJhbmRfbWFuYWdtZW50X2luaXQgKi8KLQotCi1zdGF0aWMgdm9pZCBzeXN0ZW1faXRmX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl1MzIgcmVnOwotCUFHTlhfVFJBQ0U7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIDB4MCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9URVNUUEhZLCAweDExZTE0M2EpOwotCi0JaWYgKHByaXYtPnJldmlkID09IDApIHsKLQkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFKTsKLQkJcmVnIHw9IDB4MTE7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIHJlZyk7Ci0JfQotCS8qID8/PyBXaGF0IGlzIHRoYXQgbWVhbnM/IGl0IHNob3VsZCBkaWZmZXJlbmNlIGZvciBkaWZmZXJpY2UgdHlwZQotCSBvZiBjYXJkcyAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1NFUklBTElURiwgMHhmZmY4MTAwNik7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPSU4sIDB4MWYwMDAwKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIDB4NSk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9HUElPSU4pOwotfQotCi1zdGF0aWMgdm9pZCBlbmNyeXB0aW9uX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQlBR05YX1RSQUNFOwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9FTkNSWV9XRVBLRVkwLCAweDApOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfV0VQS0VZMSwgMHgwKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0VOQ1JZX1dFUEtFWTIsIDB4MCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9FTkNSWV9XRVBLRVkzLCAweDApOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfQ0NNUkVDVEwsIDB4OCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR4X21hbmFnZW1lbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7Ci0JdTMyIHJlZzsKLQlBR05YX1RSQUNFOwotCi0JLyogRmlsbCBvdXQgdGhlIENvbXB1dGF0aW9uYWxFbmdpbmVMb29rdXBUYWJsZQotCSAqIHN0YXJ0aW5nIGF0IG1lbW9yeSAjMiBvZmZzZXQgMHg4MDAKLQkgKi8KLQl0eF9lbmdpbmVfbG9va3VwX3RibF9pbml0KHByaXYpOwotCW1lbXNldF9pbyhkYXRhICsgMHgxMDAwLCAwLCAweGZlMCk7Ci0JLyogRW5hYmxlIFRyYW5zbWlzc2lvbiBNYW5hZ2VtZW50IEZ1bmN0aW9ucyAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0VUTUYsIDB4M2ZmKTsKLQkvKiBXcml0ZSAweDNmIHRvIFRyYW5zbWlzc2lvbiBUZW1wbGF0ZSAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RYVEVNUCwgMHgzZik7Ci0KLQlpZiAocHJpdi0+cmV2aWQgPj0gMikKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0lGU1BJRlMsIDB4MWUxNDBhMGIpOwotCWVsc2UKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0lGU1BJRlMsIDB4MWUxOTBhMGIpOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUyk7Ci0JcmVnICY9IDB4ZmYwMDsKLQlyZWcgfD0gMHhiOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTLCByZWcpOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMpOwotCXJlZyAmPSAweGZmZmYwMGZmOwotCXJlZyB8PSAweGEwMDsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUywgcmVnKTsKLQkvKiBFbmFibGUgVElGUyAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgMHg0MDAwMCk7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTKTsKLQlyZWcgJj0gMHhmZjAwZmZmZjsKLQlyZWcgfD0gMHg1MTAwMDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMsIHJlZyk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9QUk9CREVMQVkpOwotCXJlZyAmPSAweGZmMDBmZmZmOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSwgcmVnKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTKTsKLQlyZWcgJj0gMHgwMGZmZmZmZjsKLQlyZWcgfD0gMHgxYzAwMDAwMDsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUywgcmVnKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSk7Ci0JcmVnICY9IDB4MDBmZmZmZmY7Ci0JcmVnIHw9IDB4MDEwMDAwMDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZLCByZWcpOwotCi0JLyogIyBTZXQgRElGIDAtMSwyLTMsNC01LDYtNyB0byBkZWZhdWx0cyAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RJRjAxLCAweDMyMWQzMjFkKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9ESUYyMywgMHgzMjFkMzIxZCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fRElGNDUsIDB4MzIxZDMyMWQpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RJRjY3LCAweDMyMWQzMjFkKTsKLQotCS8qIE1heCBBY2sgdGltZW91dCBsaW1pdCAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX01BWEFDS1RJTSwgMHgxZTE5KTsKLQkvKiBNYXggUlggRGF0YSBUaW1lb3V0IGNvdW50LCAqLwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fTUFYUlhUSU1FKTsKLQlyZWcgJj0gMHhmZmZmMDAwMDsKLQlyZWcgfD0gMHhmZjsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9NQVhSWFRJTUUsIHJlZyk7Ci0KLQkvKiBDRiBwb2xsIFJYIFRpbWVvdXQgY291bnQgKi8KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGUE9MTFJYVElNKTsKLQlyZWcgJj0gMHhmZmZmOwotCXJlZyB8PSAweGZmMDAwMDsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSwgcmVnKTsKLQotCS8qIE1heCBUaW1lb3V0IEV4Y2VlZGVkIGNvdW50LCAqLwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fTUFYVElNT1VUKTsKLQlyZWcgJj0gMHhmZjAwZmZmZjsKLQlyZWcgfD0gMHgxOTAwMDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTUFYVElNT1VULCByZWcpOwotCi0JLyogQ0YgYWNrIHRpbWVvdXQgbGltaXQgZm9yIDExYiAqLwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ0ZBQ0tUMTFCKTsKLQlyZWcgJj0gMHhmZjAwOwotCXJlZyB8PSAweDFlOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NGQUNLVDExQiwgcmVnKTsKLQotCS8qIE1heCBDRiBQb2xsIFRpbWVvdXQgQ291bnQgKi8KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGUE9MTFJYVElNKTsKLQlyZWcgJj0gMHhmZmZmMDAwMDsKLQlyZWcgfD0gMHgxOTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSwgcmVnKTsKLQkvKiBDRiBQb2xsIFJYIFRpbWVvdXQgQ291bnQgKi8KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGUE9MTFJYVElNKTsKLQlyZWcgJj0gMHhmZmZmMDAwMDsKLQlyZWcgfD0gMHgxZTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSwgcmVnKTsKLQotCS8qICMgd3JpdGUgZGVmYXVsdCB0byAqLwotCS8qICAgIDEuIFNjaGVkdWxlIEVtcHR5IENvdW50ICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0NIRU1QQ05ULCAweDUpOwotCS8qICAgIDIuIENGUCBQZXJpb2QgQ291bnQgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBFUkNOVCwgMHgxKTsKLQkvKiAgICAzLiBDRlAgTURWICAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NGUE1EViwgMHgxMDAwMCk7Ci0KLQkvKiBQcm9iZSBEZWxheSAqLwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZKTsKLQlyZWcgJj0gMHhmZmZmMDAwMDsKLQlyZWcgfD0gMHg0MDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZLCByZWcpOwotCi0JLyogTWF4IENDQSBjb3VudCBTbG90ICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9NQVhDQ0FDTlRTTE9UKTsKLQlyZWcgJj0gMHhmZmZmMDBmZjsKLQlyZWcgfD0gMHg5MDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTUFYQ0NBQ05UU0xPVCwgcmVnKTsKLQotCS8qIFNsb3QgbGltaXQvMSBtc2VjIExpbWl0ICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9TTE9UTElNSVQpOwotCXJlZyAmPSAweGZmMDBmZmZmOwotCXJlZyB8PSAweDE0MDA3NzsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTE9UTElNSVQsIHJlZyk7Ci0KLQkvKiAjIFNldCBDVyAjKDAtNykgdG8gZGVmYXVsdCAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXMCwgMHhmZjAwMDcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXMSwgMHhmZjAwMDcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXMiwgMHhmZjAwMDcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXMywgMHhmZjAwMDcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXNCwgMHhmZjAwMDcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXNSwgMHhmZjAwMDcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXNiwgMHhmZjAwMDcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXNywgMHhmZjAwMDcpOwotCi0JLyogIyBTZXQgU2hvcnQvTG9uZyBsaW1pdCAjKDAtNykgdG8gZGVmYXVsdCAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNMCwgIDB4YTAwMGEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNMSwgIDB4YTAwMGEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNMiwgIDB4YTAwMGEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNMywgIDB4YTAwMGEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNNCwgIDB4YTAwMGEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNNSwgIDB4YTAwMGEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNNiwgIDB4YTAwMGEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNNywgIDB4YTAwMGEpOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOwotCXJlZyB8PSAweDE0MDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOwotCS8qIFdhaXQgZm9yIGJpdCAwIGluIENvbnRyb2wgUmVnIHRvIGNsZWFyICAqLwotCXVkZWxheSg4MCk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOwotCS8qIE9yIDB4MTgwMDAgdG8gQ29udHJvbCByZWcgKi8KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NUTCk7Ci0JcmVnIHw9IDB4MTgwMDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOwotCS8qIFdhaXQgZm9yIGJpdCAwIGluIENvbnRyb2wgUmVnIHRvIGNsZWFyICovCi0JdWRlbGF5KDgwKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NUTCk7Ci0KLQkvKiBTZXQgTGlzdGVuIEludGVydmFsIENvdW50IHRvIGRlZmF1bHQgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9MSVNJTlRFUkNOVCwgMHgxKTsKLQkvKiBTZXQgRFRJTSBwZXJpb2QgY291bnQgdG8gZGVmYXVsdCAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RUSU1QRVJJQ05ULCAweDIwMDApOwotfSAvKiB0eF9tYW5hZ2VtZW50X2luaXQgKi8KLQotc3RhdGljIHZvaWQgcnhfbWFuYWdlbWVudF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JQUdOWF9UUkFDRTsKLQotCS8qIEluaXRpYWxpemUgdGhlIFJvdXRpbmcgVGFibGUgKi8KLQlyb3V0aW5nX3RhYmxlX2luaXQocHJpdik7Ci0KLQlpZiAocHJpdi0+cmV2aWQgPj0gMykgewotCQlhZ254X3dyaXRlMzIoY3RsLCAweDIwNzQsIDB4MWYxNzE3MTApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDIwNzgsIDB4MTAxMDBkMGQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDIwN2MsIDB4MTExMTEwMTApOwotCX0gZWxzZSB7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX0RFTEFZMTEsIDB4MCk7Ci0JfQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIDB4ODE5NWUwMCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWdueF90aW1lcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JQUdOWF9UUkFDRTsKLQotLyogCS9cKiBXcml0ZSAweDI0OWYwMCAodGljayBkdXJhdGlvbj8pIHRvIFRpbWVyIDEgKlwvICovCi0vKiAJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNRVIxLCAweDI0OWYwMCk7ICovCi0vKiAJL1wqIFdyaXRlIDB4ZTIgdG8gVGltZXIgMSBDb250cm9sICpcLyAqLwotLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVElNQ1RMX1RJTTFDVEwsIDB4ZTIpOyAqLwotCi0JLyogV3JpdGUgMHgyNDlmMDAgKHRpY2sgZHVyYXRpb24/KSB0byBUaW1lciAxICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNRVIxLCAweDApOwotCS8qIFdyaXRlIDB4ZTIgdG8gVGltZXIgMSBDb250cm9sICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNMUNUTCwgMHgwKTsKLQotCWlvd3JpdGUzMigweEZGRkZGRkZGLCBwcml2LT5jdGwgKyBBR05YX1RYTV9CRUFDT05fQ1RMKTsKLX0KLQotc3RhdGljIHZvaWQgcG93ZXJfbWFuYWdlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl1MzIgcmVnOwotCUFHTlhfVFJBQ0U7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX01BQ01TVywgMHgxZik7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9SRkNUTCwgMHgxZik7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOwotCXJlZyAmPSAweGYwMGY7Ci0JcmVnIHw9IDB4YTA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKLQotCWlmIChwcml2LT5yZXZpZCA+PSAzKSB7Ci0JCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNUKTsKLQkJcmVnIHw9IDB4MTg7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKLQl9Ci19IC8qIHBvd2VyX21hbmFnZV9pbml0ICovCi0KLQotc3RhdGljIHZvaWQgZ2Fpbl9jdGxjbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0JQUdOWF9UUkFDRTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RSQUNOVDUsIDB4MTE5KTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ2LCAweDExOCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVFJBQ05UNywgMHgxMTcpOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKLQlyZWcgfD0gMHg4OwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOwotCXJlZyAmPSB+MHg4OwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9BRERSV0lOLCAweDApOwotCi0JLyogRklYTUUgV3JpdGUgdGhlIGluaXRpYWwgU3RhdGlvbiBEZXNjcmlwdG9yIGZvciB0aGUgY2FyZCAqLwotCXN0YV9pbml0KHByaXYsIExPQ0FMX1NUQUlEKTsKLQlzdGFfaW5pdChwcml2LCBCU1NJRF9TVEFJRCk7Ci0KLQkvKiBFbmFibGUgc3RhaW9uIDAgYW5kIDEgY2FuIGRvIFRYICovCi0JLyogSXQgc2VlbWVkIGlmIHdlIHNldCBvdGhlciBiaXQgdG8gMSB0aGUgYml0IDAgd2lsbAotCSAgIGJlIGF1dG8gY2hhbmdlIHRvIDAgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1RYVE9QRUVSLCAweDIgfCAweDEpOwotLyoJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9UWFRPUEVFUiwgMHgxKTsgKi8KLX0gLyogZ2Fpbl9jdGxjbnRfaW5pdCAqLwotCi0KLXN0YXRpYyB2b2lkIHBoeV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0Jdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKLQl1MzIgcmVnOwotCUFHTlhfVFJBQ0U7Ci0KLQkvKiBMb2FkIEluaXRpYWxHYWluVGFibGUgKi8KLQlnYWluX3RhYmxlX2luaXQocHJpdik7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9BRERSV0lOLCAweDIwMDAwMDApOwotCi0JLyogQ2xlYXIgdGhlIGZvbGxvd2luZyBvZmZzZXRzIGluIE1lbW9yeSBSYW5nZSAjMjogKi8KLQltZW1zZXRfaW8oZGF0YSArIDB4NTA0MCwgMCwgMHhhICogNCk7Ci0JbWVtc2V0X2lvKGRhdGEgKyAweDUwODAsIDAsIDB4YSAqIDQpOwotCW1lbXNldF9pbyhkYXRhICsgMHg1MGMwLCAwLCAweGEgKiA0KTsKLQltZW1zZXRfaW8oZGF0YSArIDB4NTQwMCwgMCwgMHg4MCAqIDQpOwotCW1lbXNldF9pbyhkYXRhICsgMHg2MDAwLCAwLCAweDI4MCAqIDQpOwotCW1lbXNldF9pbyhkYXRhICsgMHg3MDAwLCAwLCAweDI4MCAqIDQpOwotCW1lbXNldF9pbyhkYXRhICsgMHg4MDAwLCAwLCAweDI4MCAqIDQpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgRm9sbG93aW5nIFJlZ2lzdGVycyBBY2NvcmRpbmcgdG8gUENJIFJldmlzaW9uIElEICovCi0JaWYgKHByaXYtPnJldmlkID09IDApIHsKLQkJLyogZml4bWUgdGhlIHBhcnQgaGFzbid0IGJlZW4gdXBkYXRlIGJ1dCBiZWxvdyBoYXMgYmVlbiB1cGRhdGUKLQkJICAgYmFzZWQgb24gV0dNNTExICovCi0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIxLCAweDFkKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDMpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9BSUNDSEEwT1ZFLCAweDExKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfQUlDQ0hBMU9WRSwgMHgwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEEsIDB4NjQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDB4NGIpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgMHg0Yik7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RVTlNBVCwgMHgxNCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RTQVQsIDB4MjQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ERklSQ0FMLCAweDgpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ER0NUTDExQSwgMHgxYSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RHQ1RMMTFCLCAweDMpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOSU5JVCwgMHhkKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhOT1NJRywgMHgxKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09BUlNURVAsIDB4Nyk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJRlNUMTFBLCAweDI4KTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lGU1QxMUIsIDB4MjgpOwotCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0NXREVURUMpOwotCQlyZWcgfD0gMHgxOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DV0RFVEVDLCByZWcpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl8wWDM4LCAweDFlKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9BQ1QsIDB4MjYpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDB4Myk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAweDMpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMHgzKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDB4Myk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAweDMpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUDExQSwgMHgwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVAxMUIsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQUlgxMUEsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQUlgxMUIsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RITEVWRFJPLCAweDEwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTUFYUlhUSU1FMTFBLCAweDEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhSWFRJTUUxMUIsIDB4MSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NPUlJUSU1FLCAweDE5MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0hUSCwgMHg3OCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0xUSCwgMHgxYyk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NPUlJEUk9QLCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENELCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhQT1dESUZGLCAweDEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9URVNUQlVTLCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9BTlRDRkcsIDB4MWYpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEpVTVAsIDB4MTQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFBPV0VSLCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFBPV0NMSVAsIDB4MzApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQlRGRVNULCAweDMyKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhSWDExQlBPV01JTiwgMHgxOSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMTRjLCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl8wWDE1MCwgMHgwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDAwLCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MGMsIDB4NmZmKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDI4LCAweGEwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDM0LCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMDQsIDB4MTUpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMGMsIDB4N2YpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMzQsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIDB4YzAwMCwgMHgzOGQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE4LCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDE2MDAwLCAweDEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA0LCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIDB4YSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWMxYywgMHg1KTsKLQl9IGVsc2UgaWYgKHByaXYtPnJldmlkID4gMCkgewotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4Zik7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0FJQ0NIQTBPVkUsIDB4MTEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9BSUNDSEExT1ZFLCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9EVU5TQVQsIDB4MTQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9EU0FULCAweDI0KTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfREZJUkNBTCwgMHg4KTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfREdDVEwxMUEsIDB4MWEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ER0NUTDExQiwgMHgzKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTklOSVQsIDB4ZCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RITk9TSUcsIDB4MSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NPQVJTVEVQLCAweDcpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUZTVDExQSwgMHgyOCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJRlNUMTFCLCAweDI4KTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ1dERVRFQywgMHgwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgzOCwgMHgxZSk7Ci0vKgkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9BQ1QsIDB4MjYpOyovCi0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKLQotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUDExQSwgMHgzMik7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFCLCAweDMyKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQSwgMHgzMik7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQUlgxMUIsIDB4MzIpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USExFVkRSTywgMHgxMCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQSwgMHgxYWQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhSWFRJTUUxMUIsIDB4YTEwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUlRJTUUsIDB4MTkwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUkRST1AsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0QsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ1MsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFBPV0RJRkYsIDB4NCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RFU1RCVVMsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RISlVNUCwgMHgxZSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XRVIsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XQ0xJUCwgMHgyYSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDB4M2MpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFJYMTFCUE9XTUlOLCAweDE5KTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNGMsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMTUwLCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1dBVENIRE9HLCAweDM3KTsKLQkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDAwLCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MGMsIDB4NmZmKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDI4LCAweGEwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDM0LCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMDQsIDB4MTUpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMGMsIDB4N2YpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMzQsIDB4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIDB4YzAwMCwgMHgzOGQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE0LCAweDEwMDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE4LCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDE2MDAwLCAweDEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA0LCAweDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIDB4YSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWMxYywgMHg1MCk7Ci0JfSBlbHNlIGlmIChwcml2LT5yZXZpZCA+IDEpIHsKLQkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjMTgpOwotCQlyZWcgfD0gMHg4OwotCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjMTgsIHJlZyk7Ci0JfQotCi0JLyogV3JpdGUgdGhlIFRYIEZpciBDb2VmZmljaWVudCBUYWJsZSAqLwotCXR4X2Zpcl90YWJsZV9pbml0KHByaXYpOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKLQlyZWcgJj0gfjB4ODsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOwotCXJlZyB8PSAweDE7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIHJlZyk7Ci0KLS8qIAlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MWEwMzApOyAqLwotLyogCXJlZyAmPSB+MHg0OyAqLwotLyogCWFnbnhfd3JpdGUzMihjdGwsIDB4MWEwMzAsIHJlZyk7ICovCi0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ0LCAweDExMyk7Ci19IC8qIHBoeV9pbml0ICovCi0KLXN0YXRpYyB2b2lkIGNoaXBfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0JQUdOWF9UUkFDRTsKLQotCWJhbmRfbWFuYWdlbWVudF9pbml0KHByaXYpOwotCi0JcmZfY2hpcHNfaW5pdChwcml2KTsKLQotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7Ci0JcmVnIHw9IDB4ODsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgUEhZICovCi0JcGh5X2luaXQocHJpdik7Ci0KLQllbmNyeXB0aW9uX2luaXQocHJpdik7Ci0KLQl0eF9tYW5hZ2VtZW50X2luaXQocHJpdik7Ci0KLQlyeF9tYW5hZ2VtZW50X2luaXQocHJpdik7Ci0KLQlwb3dlcl9tYW5hZ2VfaW5pdChwcml2KTsKLQotCS8qIEluaXRpYWxpemUgdGhlIFRpbWVycyAqLwotCWFnbnhfdGltZXJfaW5pdChwcml2KTsKLQotCS8qIFdyaXRlIDB4YzM5MGJmOSB0byBJbnRlcnJ1cHQgTWFzayAoRGlzYWJsZSBUWCkgKi8KLQlyZWcgPSAweGMzOTBiZjkgJiB+SVJRX1RYX0JFQUNPTjsKLQlyZWcgJj0gfklSUV9UWF9ESVNBQkxFOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfSU5UX01BU0ssIHJlZyk7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCk7Ci0JcmVnIHw9IDB4ODAwOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgcmVnKTsKLQotCS8qIHNldCBpdCB3aGVuIG5lZWQgZ2V0IG11bHRpY2FzdCBlbmFibGU/ICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9NVFNNLCAweGZmKTsKLX0gLyogY2hpcF9pbml0ICovCi0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9wcm9taXNfYW5kX21hbmFnZWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwIHwgMHgyKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwIHwgMHgyKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVhcm5fbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4OCk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NjYW5fbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4MjApOwotfQotc3RhdGljIGlubGluZSB2b2lkIHNldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JLyogYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgyMTApOyovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgxMCk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X21hbmFnZWRfbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4Mik7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FkaG9jX21vZGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDApOwotfQotCi0jaWYgMAotc3RhdGljIHZvaWQgdW5rbm93X3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MCwgMHgzZSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQsIDB4YjIpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg4LCAweDE0MCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweGMsIDB4MUMwKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTAsIDB4MUZGKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTQsIDB4MUREKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTgsIDB4MTVGKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MWMsIDB4QTEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyMCwgMHgzRTcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyNCwgMHgzNkIpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyOCwgMHgzNDgpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyYywgMHgzN0QpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzMCwgMHgzREUpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzNCwgMHgzNik7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDM4LCAweDY0KTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4M2MsIDB4NTcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg0MCwgMHgyMyk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQ0LCAweDNFRCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQ4LCAweDNDOSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDRjLCAweDNDQSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDUwLCAweDNFNyk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDU0LCAweDgpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg1OCwgMHgxRik7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDVjLCAweDFhKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjYXJkX2ludGVyZmFjZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTggYnNzaWRbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCXUzMiByZWc7Ci0JdW5zaWduZWQgaW50IGk7Ci0JQUdOWF9UUkFDRTsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0JLyogQ2xlYXIgUlggQ29udHJvbCBhbmQgRW5hYmxlIFJYIHF1ZXVlcyAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ1RMLCAweDgpOwotCi0JbWlnaHRfc2xlZXAoKTsKLQkvKiBEbyBhIGZ1bGwgcmVzZXQgb2YgdGhlIGNhcmQgKi8KLQljYXJkX2Z1bGxfcmVzZXQocHJpdik7Ci0JbWlnaHRfc2xlZXAoKTsKLQotCS8qIENoZWNrIGFuZCBzZXQgQ2FyZCBFbmRpYW5uZXNzICovCi0JcmVnID0gaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfRU5ESUFOKTsKLQkvKiBUT0RPIElmIG5vdCAweEIzQjJCMUIwIHNldCB0byAweEIzQjJCMUIwICovCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNJUl9FTkRJQU4gaXMgJXhcbiIsIHJlZyk7Ci0KLQotCS8qIENvbmZpZyB0aGUgZWVwcm9tICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGLCAweDcwMDAwODYpOwotCXVkZWxheSgxMCk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOwotCi0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4ODAwMDAwMzMpOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKLQlyZWcgfD0gMHhmOwotCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4MCk7Ci0KLQotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOKTsKLQl1ZGVsYXkoMTApOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGKTsKLQotCS8qIER1bXAgdGhlIGVlcHJvbSAqLwotCWRvIHsKLQkJY2hhciBlZXByb21bMHgxMDAwMDAvMHgxMDBdOwotCi0JCWZvciAoaSA9IDA7IGkgPCAweDEwMDAwMDsgaSArPSAweDEwMCkgewotCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGLCAweDMwMDAwMDAgKyBpKTsKLQkJCXVkZWxheSgxMyk7Ci0JCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX1NFUklBTElURik7Ci0JCQl1ZGVsYXkoNzApOwotCQkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOwotCQkJZWVwcm9tW2kvMHgxMDBdID0gcmVnICYgMHhGRjsKLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoUEZYICJFRVBST006ICIsIERVTVBfUFJFRklYX05PTkUsIGVlcHJvbSwKLQkJCQkgICAgIEFSUkFZX1NJWkUoZWVwcm9tKSk7Ci0JfSB3aGlsZSAoMCk7Ci0KLQlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyNik7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHN5c3RlbSBpbnRlcmZhY2UgKi8KLQlzeXN0ZW1faXRmX2luaXQocHJpdik7Ci0KLQltaWdodF9zbGVlcCgpOwotCS8qIENoaXAgSW5pdGlhbGl6YXRpb24gKFBvbGFyaXMpICovCi0JY2hpcF9pbml0KHByaXYpOwotCW1pZ2h0X3NsZWVwKCk7Ci0KLQkvKiBDYWxpYnJhdGUgdGhlIGFudGVubmFlICovCi0JYW50ZW5uYV9jYWxpYnJhdGUocHJpdik7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4ZWM1MCk7Ci0JcmVnICY9IH4weDQwOwotCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4MCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIDB4MSk7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQk1fQk1DVEwpOwotCXJlZyB8PSAweDgwMDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9CTUNUTCwgcmVnKTsKLQllbmFibGVfcmVjZWl2ZXIocHJpdik7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFKTsKLQlyZWcgfD0gMHgyMDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgcmVnKTsKLQllbmFibGVfcmVjZWl2ZXIocHJpdik7Ci0KLQltaWdodF9zbGVlcCgpOwotCS8qIEluaXRpYWxpemUgR2FpbiBDb250cm9sIENvdW50cyAqLwotCWdhaW5fY3RsY250X2luaXQocHJpdik7Ci0KLQkvKiBXcml0ZSBJbml0aWFsIFN0YXRpb24gUG93ZXIgVGVtcGxhdGUgZm9yIHRoaXMgc3RhdGlvbigjMCkgKi8KLQlzdGFfcG93ZXJfaW5pdChwcml2LCBMT0NBTF9TVEFJRCk7Ci0KLQltaWdodF9zbGVlcCgpOwotCS8qIEluaXRpYWxpemUgdGhlIHJ4LHRkLHRtIHJpbmdzLCBmb3IgZWFjaCBub2RlIGluIHRoZSByaW5nICovCi0JZmlsbF9yaW5ncyhwcml2KTsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHg4MDAwMDAzMyk7Ci0JYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCAweGMpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHgwKTsKLQotCS8qIEZJWE1FIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVEwsIDB4MTk0YzEpOwotCi0JZW5hYmxlX3JlY2VpdmVyKHByaXYpOwotCi0JbWlnaHRfc2xlZXAoKTsKLQkvKiBGSVhNRSBTZXQgdGhlIFJlY2VpdmUgQ29udHJvbCBNYWMgQWRkcmVzcyB0byBjYXJkIGFkZHJlc3MgKi8KLQltYWNfYWRkcmVzc19zZXQocHJpdik7Ci0JZW5hYmxlX3JlY2VpdmVyKHByaXYpOwotCW1pZ2h0X3NsZWVwKCk7Ci0KLQkvKiBTZXQgdGhlIHJlY2lldmUgcmVxdWVzdCByYXRlICovCi0JLyogRklYTUUgRW5hYmxlIHRoZSByZXF1ZXN0ICovCi0JLyogQ2hlY2sgcGFja2V0IGxlbmd0aCAqLwotCS8qIFNldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKi8KLS8qCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIDB4ODgxOTVlMDApOyAqLwotLyoJZW5hYmxlX3JlY2VpdmVyKHByaXYpOyAqLwotCi0JLyogU2V0IHRoZSBSZWNlaXZlciBCU1NJRCAqLwotCXJlY2VpdmVyX2Jzc2lkX3NldChwcml2LCBic3NpZCk7Ci0KLQkvKiBGSVhNRSBTZXQgdG8gbWFuYWdlZCBtb2RlICovCi0Jc2V0X21hbmFnZWRfbW9kZShwcml2KTsKLS8qCXNldF9wcm9taXNjdW91c19tb2RlKHByaXYpOyAqLwotLyoJc2V0X3NjYW5fbW9kZShwcml2KTsgKi8KLS8qCXNldF9sZWFybl9tb2RlKHByaXYpOyAqLwotLyoJc2V0X3Byb21pc19hbmRfbWFuYWdlZChwcml2KTsgKi8KLS8qCXNldF9hZGhvY19tb2RlKHByaXYpOyAqLwotCi0JLyogU2V0IHRoZSByZWNpZXZlIHJlcXVlc3QgcmF0ZSAqLwotCS8qIENoZWNrIHBhY2tldCBsZW5ndGggKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCAweDA4MDAwMDAwKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUpOwotCS8qIFNldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKi8KLQlyZWcgfD0gMHgwMDE5NWUwMDsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCByZWcpOwotCi0JLyogQ29uZmlndXJlIHRoZSBSWCBhbmQgVFggaW50ZXJydXB0ICovCi0JcmVnID0gRU5BQkxFX1JYX0lOVEVSUlVQVCB8IFJYX0NBQ0hFX0xJTkUgfCBGUkFHX0xFTl8yMDQ4IHwgRlJBR19CRTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9SWENGRywgcmVnKTsKLQkvKiBGSVhNRSAqLwotCXJlZyA9IEVOQUJMRV9UWF9JTlRFUlJVUFQgfCBUWF9DQUNIRV9MSU5FIHwgRlJBR19MRU5fMjA0OCB8IEZSQUdfQkU7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhDRkcsIHJlZyk7Ci0KLQkvKiBFbmFibGUgUlggVFggSW50ZXJydXB0cyAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ1RMLCAweDgwKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwsIDB4ODApOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRENUTCwgMHg4MCk7Ci0KLQkvKiBGSVhNRSBTZXQgdGhlIG1hc3RlciBjb250cm9sIGludGVycnVwdCBpbiBibG9jayBjb250cm9sICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMLCAweDgwMCk7Ci0KLQkvKiBFbmFibGUgUlggYW5kIFRYIHF1ZXVlcyAqLwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfUlhDVEwpOwotCXJlZyB8PSAweDg7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDVEwsIHJlZyk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwpOwotCXJlZyB8PSAweDg7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNQ1RMLCByZWcpOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfVFhEQ1RMKTsKLQlyZWcgfD0gMHg4OwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRENUTCwgcmVnKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgMHg1KTsKLQkvKiBGSVhNRSAqLwotCS8qICB1bmtub3dfcmVnaXN0ZXJfd3JpdGUocHJpdik7ICovCi0JLyogVXBkYXRlIGxvY2FsIGNhcmQgaGFzaCBlbnRyeSAqLwotCWhhc2hfd3JpdGUocHJpdiwgcHJpdi0+bWFjX2FkZHIsIExPQ0FMX1NUQUlEKTsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQkvKiBGSVhNRSAqLwotCWFnbnhfc2V0X2NoYW5uZWwocHJpdiwgMSk7Ci0JbWlnaHRfc2xlZXAoKTsKLX0gLyogYWdueF9jYXJkX2ludGVyZmFjZV9pbml0ICovCi0KLQotdm9pZCBhZ254X2h3X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQlBR05YX1RSQUNFOwotCW1pZ2h0X3NsZWVwKCk7Ci0JY2FyZF9pbnRlcmZhY2VfaW5pdChwcml2KTsKLX0KLQotaW50IGFnbnhfaHdfcmVzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm4gY2FyZF9mdWxsX3Jlc2V0KHByaXYpOwotfQotCi1pbnQgYWdueF9zZXRfc3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQotewotCUFHTlhfVFJBQ0U7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYWdueF9zZXRfYnNzaWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgY29uc3QgdTggKmJzc2lkKQotewotCXJlY2VpdmVyX2Jzc2lkX3NldChwcml2LCBic3NpZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU1ZjA1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLSNpZm5kZWYgQUdOWF9QSFlfSF8KLSNkZWZpbmUgQUdOWF9QSFlfSF8KLQotI2luY2x1ZGUgImFnbnguaCIKLQotLyogVHJhbnNtaXNzaW9uIE1hbmFnbWVudCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgQUdOWF9UWE1fQkFTRQkJMHgwMDAwCi0jZGVmaW5lIEFHTlhfVFhNX0NUTAkJMHgwMDAwCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQUdOWF9UWE1fRVRNRgkJMHgwMDA0IC8qIGVuYWJsZSB0cmFuc21pc3Npb24gbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQUdOWF9UWE1fVFhURU1QCQkweDAwMDggLyogdHJhbnNtaXNzaW9uIHRlbXBsYXRlICovCi0jZGVmaW5lIEFHTlhfVFhNX1JFVFJZU1RBSUQJMHgwMDBjIC8qIFJldHJ5IFN0YXRpb24gSUQgKi8KLSNkZWZpbmUgQUdOWF9UWE1fVElNRVNUQU1QTE8JCTB4MDAxMAkvKiBUaW1lc3RhbXAgTG8gKi8KLSNkZWZpbmUgQUdOWF9UWE1fVElNRVNUQU1QSEkJCTB4MDAxNAkvKiBUaW1lc3RhbXAgSGkgKi8KLSNkZWZpbmUgQUdOWF9UWE1fVFhERUxBWQkweDAwMTggIC8qIHR4IGRlbGF5ICovCi0jZGVmaW5lIEFHTlhfVFhNX1RCVFRMTwkJMHgwMDIwCS8qIHRidHQgTG8gKi8KLSNkZWZpbmUgQUdOWF9UWE1fVEJUVEhJCQkweDAwMjQJLyogdGJ0dCBIaSAqLwotI2RlZmluZSBBR05YX1RYTV9CRUFJTlRFUgkweDAwMjggLyogQmVhY29uIEludGVydmFsICovCi0jZGVmaW5lIEFHTlhfVFhNX05BVgkJMHgwMDMwIC8qIE5BViAqLwotI2RlZmluZSBBR05YX1RYTV9DRlBNRFYJCTB4MDAzNCAvKiBDRlAgTURWICovCi0jZGVmaW5lIEFHTlhfVFhNX0NGUEVSQ05UCTB4MDAzOCAvKiBDRlAgcGVyaW9kIGNvdW50ICovCi0jZGVmaW5lIEFHTlhfVFhNX1BST0JERUxBWQkweDAwM2MgLyogcHJvYmUgZGVsYXkgKi8KLSNkZWZpbmUgQUdOWF9UWE1fTElTSU5URVJDTlQJMHgwMDQwIC8qIGxpc3RlbiBpbnRlcnZhbCBjb3VudCAqLwotI2RlZmluZSBBR05YX1RYTV9EVElNUEVSSUNOVAkweDAwNGMgLyogRFRJTSBwZXJpb2QgY291bnQgKi8KLQotI2RlZmluZSBBR05YX1RYTV9CRUFDT05fQ1RMCTB4MDA1YyAvKiBiZWFjb24gY29udHJvbCAqLwotCi0jZGVmaW5lIEFHTlhfVFhNX1NDSEVNUENOVAkweDAwN2MgLyogc2NoZWR1bGUgZW1wdHkgY291bnQgKi8KLSNkZWZpbmUgQUdOWF9UWE1fTUFYVElNT1VUCTB4MDA4NCAvKiBtYXggdGltZW91dCBleGNlZWQgY291bnQgKi8KLSNkZWZpbmUgQUdOWF9UWE1fTUFYQ0ZQVElNCTB4MDA4OCAvKiBtYXggQ0YgcG9sbCB0aW1lb3V0IGNvdW50ICovCi0jZGVmaW5lIEFHTlhfVFhNX01BWFJYVElNRQkweDAwOGMgLyogbWF4IFJYIHRpbWVvdXQgY291bnQgKi8KLSNkZWZpbmUgQUdOWF9UWE1fTUFYQUNLVElNCTB4MDA5MAkvKiBtYXggQUNLIHRpbWVvdXQgY291bnQgKi8KLSNkZWZpbmUgQUdOWF9UWE1fRElGMDEJCTB4MDBhMCAvKiBESUYgMC0xICovCi0jZGVmaW5lIEFHTlhfVFhNX0RJRjIzCQkweDAwYTQgLyogRElGIDItMyAqLwotI2RlZmluZSBBR05YX1RYTV9ESUY0NQkJMHgwMGE4IC8qIERJRiA0LTUgKi8KLSNkZWZpbmUgQUdOWF9UWE1fRElGNjcJCTB4MDBhYyAvKiBESUYgNi03ICovCi0jZGVmaW5lIEFHTlhfVFhNX1NJRlNQSUZTCTB4MDBiMCAvKiBTSUZTL1BJRlMgKi8KLSNkZWZpbmUgQUdOWF9UWE1fVElGU0VJRlMJMHgwMGI0IC8qIFRJRlMvRUlGUyAqLwotI2RlZmluZSBBR05YX1RYTV9NQVhDQ0FDTlRTTE9UCTB4MDBiOCAvKiBtYXggQ0NBIGNvdW50IHNsb3QgKi8KLSNkZWZpbmUgQUdOWF9UWE1fU0xPVExJTUlUCTB4MDBiYyAvKiBzbG90IGxpbWl0LzEgbXNlYyBsaW1pdCAqLwotI2RlZmluZSBBR05YX1RYTV9DRlBPTExSWFRJTQkweDAwZjAgLyogQ0YgcG9sbCBSWCB0aW1lb3V0IGNvdW50ICovCi0jZGVmaW5lIEFHTlhfVFhNX0NGQUNLVDExQgkweDAwZjQgLyogQ0YgYWNrIHRpbWVvdXQgbGltaXQgZm9yIDExYiAqLwotI2RlZmluZSBBR05YX1RYTV9DVzAJCTB4MDEwMCAvKiBDVyAwICovCi0jZGVmaW5lIEFHTlhfVFhNX1NMQkVBTElNMAkweDAxMDggLyogc2hvcnQvbG9uZyBiZWFjb24gbGltaXQgMCAqLwotI2RlZmluZSBBR05YX1RYTV9DVzEJCTB4MDEyMCAvKiBDVyAxICovCi0jZGVmaW5lIEFHTlhfVFhNX1NMQkVBTElNMQkweDAxMjggLyogc2hvcnQvbG9uZyBiZWFjb24gbGltaXQgMSAqLwotI2RlZmluZSBBR05YX1RYTV9DVzIJCTB4MDE0MCAvKiBDVyAyICovCi0jZGVmaW5lIEFHTlhfVFhNX1NMQkVBTElNMgkweDAxNDggLyogc2hvcnQvbG9uZyBiZWFjb24gbGltaXQgMiAqLwotI2RlZmluZSBBR05YX1RYTV9DVzMJCTB4MDE2MCAvKiBDVyAzICovCi0jZGVmaW5lIEFHTlhfVFhNX1NMQkVBTElNMwkweDAxNjggLyogc2hvcnQvbG9uZyBiZWFjb24gbGltaXQgMyAqLwotI2RlZmluZSBBR05YX1RYTV9DVzQJCTB4MDE4MCAvKiBDVyA0ICovCi0jZGVmaW5lIEFHTlhfVFhNX1NMQkVBTElNNAkweDAxODggLyogc2hvcnQvbG9uZyBiZWFjb24gbGltaXQgNCAqLwotI2RlZmluZSBBR05YX1RYTV9DVzUJCTB4MDFhMCAvKiBDVyA1ICovCi0jZGVmaW5lIEFHTlhfVFhNX1NMQkVBTElNNQkweDAxYTggLyogc2hvcnQvbG9uZyBiZWFjb24gbGltaXQgNSAqLwotI2RlZmluZSBBR05YX1RYTV9DVzYJCTB4MDFjMCAvKiBDVyA2ICovCi0jZGVmaW5lIEFHTlhfVFhNX1NMQkVBTElNNgkweDAxYzggLyogc2hvcnQvbG9uZyBiZWFjb24gbGltaXQgNiAqLwotI2RlZmluZSBBR05YX1RYTV9DVzcJCTB4MDFlMCAvKiBDVyA3ICovCi0jZGVmaW5lIEFHTlhfVFhNX1NMQkVBTElNNwkweDAxZTggLyogc2hvcnQvbG9uZyBiZWFjb24gbGltaXQgNyAqLwotI2RlZmluZSBBR05YX1RYTV9CRUFDT05URU1QICAgICAweDEwMDAJLyogYmVhY29uIHRlbXBsYXRlICovCi0jZGVmaW5lIEFHTlhfVFhNX1NUQVBPV1RFTVAJMHgxYTAwIC8qICBTdGF0aW9uIFBvd2VyIFRlbXBsYXRlICovCi0KLS8qIFJlY2VpdmUgTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVycyAqLwotI2RlZmluZSBBR05YX1JYTV9CQVNFCQkweDIwMDAKLSNkZWZpbmUgQUdOWF9SWE1fUkVRUkFURQkweDIwMDAJLyogcmVxdWVzdGVkIHJhdGUgKi8KLSNkZWZpbmUgQUdOWF9SWE1fTUFDSEkJCTB4MjAwNAkvKiBmaXJzdCA0IGJ5dGVzIG9mIG1hYyBhZGRyZXNzICovCi0jZGVmaW5lIEFHTlhfUlhNX01BQ0xPCQkweDIwMDgJLyogbGFzdCAyIGJ5dGVzIG9mIG1hYyBhZGRyZXNzICovCi0jZGVmaW5lIEFHTlhfUlhNX0JTU0lESEkJMHgyMDBjCS8qIGJzc2lkIGhpICovCi0jZGVmaW5lIEFHTlhfUlhNX0JTU0lETE8JMHgyMDEwCS8qIGJzc2lkIGxvICovCi0jZGVmaW5lIEFHTlhfUlhNX0hBU0hfQ01EX0ZMQUcJMHgyMDE0CS8qIEZsYWdzIGZvciB0aGUgUlggSGFzaCBDb21tYW5kIERlZmF1bHQ6MCAqLwotI2RlZmluZSBBR05YX1JYTV9IQVNIX0NNRF9ISUdICTB4MjAxOAkvKiBUaGUgSGlnaCBoYWxmIG9mIHRoZSBIYXNoIENvbW1hbmQgKi8KLSNkZWZpbmUgQUdOWF9SWE1fSEFTSF9DTURfTE9XCTB4MjAxYwkvKiBUaGUgTG93IGhhbGYgb2YgdGhlIEhhc2ggQ29tbWFuZCAqLwotI2RlZmluZSBBR05YX1JYTV9ST1VUQUIJCTB4MjAyMAkvKiByb3V0aW5nIHRhYmxlICovCi0jZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9TSElGVAkyNAotI2RlZmluZQkJUk9VVEFCX1RZUEVfU0hJRlQJMjgKLSNkZWZpbmUJCVJPVVRBQl9TVEFUVVNfU0hJRlQJMzAKLSNkZWZpbmUJCVJPVVRBQl9SV19TSElGVAkJMzEKLSNkZWZpbmUJCVJPVVRBQl9ST1VURV9EUk9QCTB4ZjAwMDAwIC8qIERyb3AgKi8KLSNkZWZpbmUJCVJPVVRBQl9ST1VURV9DUFUJMHg0MDAwMDAgLyogQ1BVICovCi0jZGVmaW5lCQlST1VUQUJfUk9VVEVfRU5DUlkJMHg1MDA4MDAgLyogRW5jcnlwdGlvbiAqLwotI2RlZmluZQkJUk9VVEFCX1JPVVRFX1JGUAkweDgwMDAwMCAvKiBSRlAgKi8KLQotI2RlZmluZQkJUk9VVEFCX1RZUEVfTUFOQUcJMHgwIC8qIE1hbmFnZW1lbnQgKi8KLSNkZWZpbmUJCVJPVVRBQl9UWVBFX0NUTAkJMHgxIC8qIENvbnRyb2wgKi8KLSNkZWZpbmUJCVJPVVRBQl9UWVBFX0RBVEEJMHgyIC8qIERhdGEgKi8KLQotI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfREFUQQkJMHgwCi0jZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9EQVRBQUNLCQkweDEKLSNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX0RBVEFQT0xMCQkweDIKLSNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX0RBVEFQT0xMQUNLCTB4MwotI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfTlVMTAkJMHg0IC8qIE5VTEwgKi8KLSNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX05VTExBQ0sJCTB4NQotI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfTlVMTFBPTEwJCTB4NgotI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfTlVMTFBPTExBQ0sJMHg3Ci0jZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NEQVRBCQkweDggLyogUU9TIERBVEEgKi8KLSNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU0RBVEFBQ0sJMHg5Ci0jZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NEQVRBUE9MTAkweGEKLSNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU0RBVEFBQ0tQT0xMCTB4YgotI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TTlVMTAkJMHhjCi0jZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NOVUxMQUNLCTB4ZAotI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TTlVMTFBPTEwJMHhlCi0jZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NOVUxMUE9MTEFDSwkweGYKLSNkZWZpbmUgQUdOWF9SWE1fREVMQVkxMQkgICAweDIwMjQJLyogZGVsYXkgMTEoQUIpICovCi0jZGVmaW5lIEFHTlhfUlhNX1NPRl9DTlQJICAgMHgyMDI4CS8qIFNPRiBDb3VudCAqLwotI2RlZmluZSBBR05YX1JYTV9GUkFHX0NOVAkgICAweDIwMmMJLyogRnJhZ21lbnQgQ291bnQqLwotI2RlZmluZSBBR05YX1JYTV9GQ1NfQ05UCSAgIDB4MjAzMAkvKiBGQ1MgQ291bnQgKi8KLSNkZWZpbmUgQUdOWF9SWE1fQlNTSURfTUlTU19DTlQJICAgMHgyMDM0CS8qIEJTU0lEIE1pc3MgQ291bnQgKi8KLSNkZWZpbmUgQUdOWF9SWE1fUERVX0VSUl9DTlQJICAgMHgyMDM4CS8qIFBEVSBFcnJvciBDb3VudCAqLwotI2RlZmluZSBBR05YX1JYTV9ERVNUX01JU1NfQ05UCSAgIDB4MjAzQwkvKiBEZXN0aW5hdGlvbiBNaXNzIENvdW50ICovCi0jZGVmaW5lIEFHTlhfUlhNX0RST1BfQ05UCSAgIDB4MjA0MAkvKiBEcm9wIENvdW50ICovCi0jZGVmaW5lIEFHTlhfUlhNX0FCT1JUX0NOVAkgICAweDIwNDQJLyogQWJvcnQgQ291bnQgKi8KLSNkZWZpbmUgQUdOWF9SWE1fUkVMQVlfQ05UCSAgIDB4MjA0OAkvKiBSZWxheSBDb3VudCAqLwotI2RlZmluZSBBR05YX1JYTV9IQVNIX01JU1NfQ05UCSAgIDB4MjA0YwkvKiBIYXNoIE1pc3MgQ291bnQgKi8KLSNkZWZpbmUgQUdOWF9SWE1fU0FfSEkJCSAgIDB4MjA1MAkvKiBBZGRyZXNzIG9mIHJlY2VpdmVkIHBhY2tldCBIaSAqLwotI2RlZmluZSBBR05YX1JYTV9TQV9MTwkJICAgMHgyMDU0CS8qIEFkZHJlc3Mgb2YgcmVjZWl2ZWQgcGFja2V0IExvICovCi0jZGVmaW5lIEFHTlhfUlhNX0hBU0hfRFVNUF9MU1QJICAgMHgyMTAwCS8qIENvbnRhaW5zIEhhc2ggRGF0YSAqLwotI2RlZmluZSBBR05YX1JYTV9IQVNIX0RVTVBfTVNUCSAgIDB4MjEwNAkvKiBDb250YWlucyBIYXNoIERhdGEgKi8KLSNkZWZpbmUgQUdOWF9SWE1fSEFTSF9EVU1QX0RBVEEgICAgMHgyMTA4CS8qIFRoZSBTdGF0aW9uIElEIHRvIGR1bXAgKi8KLQotCi0vKiBFbmNyeXB0aW9uIE1hbmFnbWVudCAqLwotI2RlZmluZSBBR05YX0VOQ1JZX0JBU0UJCTB4MjQwMAotI2RlZmluZSBBR05YX0VOQ1JZX1dFUEtFWTAJMHgyNDQwIC8qIHdlcCBrZXkgIzAgKi8KLSNkZWZpbmUgQUdOWF9FTkNSWV9XRVBLRVkxCTB4MjQ0NCAvKiB3ZXAga2V5ICMxICovCi0jZGVmaW5lIEFHTlhfRU5DUllfV0VQS0VZMgkweDI0NDggLyogd2VwIGtleSAjMiAqLwotI2RlZmluZSBBR05YX0VOQ1JZX1dFUEtFWTMJMHgyNDRjIC8qIHdlcCBrZXkgIzMgKi8KLSNkZWZpbmUgQUdOWF9FTkNSWV9DQ01SRUNUTAkweDI0NjAgLyogY2NtIHJlcGxheSBjb250cm9sICovCi0KLQotLyogQmFuZCBNYW5hZ2VtZW50IFJlZ2lzdGVycyAqLwotI2RlZmluZSBBR05YX0JNX0JBU0UJCTB4MmMwMAotI2RlZmluZSBBR05YX0JNX0JNQ1RMCQkweDJjMDAgIC8qIGJhbmQgbWFuYWdlbWVudCBjb250cm9sICovCi0jZGVmaW5lIEFHTlhfQk1fVFhXQUREUgkJMHgyYzE4ICAvKiB0eCB3b3JrcXVldWUgYWRkcmVzcyBzdGFydCAqLwotI2RlZmluZSBBR05YX0JNX1RYVE9QRUVSCTB4MmMyNAkvKiB0cmFuc21pdCB0byBwZWVycyAqLwotI2RlZmluZSBBR05YX0JNX0ZQTEhQCQkweDJjMmMgIC8qIGZyZWUgcG9vbCBsaXN0IGhlYWQgcG9pbnRlciAqLwotI2RlZmluZSBBR05YX0JNX0ZQTFRQCQkweDJjMzAgIC8qIGZyZWUgcG9vbCBsaXN0IHRhaWwgcG9pbnRlciAqLwotI2RlZmluZSBBR05YX0JNX0ZQQ05UCQkweDJjMzQgIC8qIGZyZWUgcG9vbCBjb3VudCAqLwotI2RlZmluZSBBR05YX0JNX0NJUERVV0NOVAkweDJjMzggIC8qIGNhcmQgaW50ZXJmYWNlIHBkdSB3b3JrcXVldWUgY291bnQgKi8KLSNkZWZpbmUgQUdOWF9CTV9TUFBEVVdDTlQJMHgyYzNjICAvKiBzcCBwZHUgd29ya3F1ZXVlIGNvdW50ICovCi0jZGVmaW5lIEFHTlhfQk1fUkZQUERVV0NOVAkweDJjNDAgIC8qIHJmcCBwZHUgd29ya3F1ZXVlIGNvdW50ICovCi0jZGVmaW5lIEFHTlhfQk1fUkhQUERVV0NOVAkweDJjNDQgIC8qIHJocCBwZHUgd29ya3F1ZXVlIGNvdW50ICovCi0jZGVmaW5lIEFHTlhfQk1fQ0lXUUNUTAkJMHgyYzQ4IC8qIENhcmQgSW50ZXJmYWNlIFdvcmtRdWV1ZSBDb250cm9sICovCi0jZGVmaW5lIEFHTlhfQk1fQ1BVVFhXQ1RMCTB4MmM1MCAgLyogY3B1IHR4IHdvcmtxdWV1ZSBjb250cm9sICovCi0jZGVmaW5lIEFHTlhfQk1fQ1BVUlhXQ1RMCTB4MmM1OCAgLyogY3B1IHJ4IHdvcmtxdWV1ZSBjb250cm9sICovCi0jZGVmaW5lIEFHTlhfQk1fQ1BVTFdDVEwJMHgyYzYwIC8qIGNwdSBsb3cgd29ya3F1ZXVlIGNvbnRyb2wgKi8KLSNkZWZpbmUgQUdOWF9CTV9DUFVIV0NUTAkweDJjNjggLyogY3B1IGhpZ2ggd29ya3F1ZXVlIGNvbnRyb2wgKi8KLSNkZWZpbmUgQUdOWF9CTV9TUFRYV0NUTAkweDJjNzAgLyogc3AgdHggd29ya3F1ZXVlIGNvbnRyb2wgKi8KLSNkZWZpbmUgQUdOWF9CTV9TUFJYV0NUTAkweDJjNzggLyogc3Agcnggd29ya3F1ZXVlIGNvbnRyb2wgKi8KLSNkZWZpbmUgQUdOWF9CTV9SRlBXQ1RMCQkweDJjODAgLyogUkZQIHdvcmtxdWV1ZSBjb250cm9sICovCi0jZGVmaW5lIEFHTlhfQk1fTVRTTQkJMHgyYzkwIC8qIE11bHRpY2FzdCBUcmFuc21pdCBTdGF0aW9uIE1hc2sgKi8KLQotLyogQ2FyZCBJbnRlcmZhY2UgUmVnaXN0ZXJzICgzMmJpdHMpICovCi0jZGVmaW5lIEFHTlhfQ0lSX0JBU0UJCTB4MzAwMAotI2RlZmluZSBBR05YX0NJUl9CTEtDVEwJCTB4MzAwMAkvKiBibG9jayBjb250cm9sKi8KLSNkZWZpbmUJCUFHTlhfU1RBVF9UWAkweDEKLSNkZWZpbmUJCUFHTlhfU1RBVF9SWAkweDIKLSNkZWZpbmUJCUFHTlhfU1RBVF9YCTB4NAotLyogQmVsb3cgdHdvIGludGVycnVwdCBmbGFncyB3aWxsIGJlIHNldCBieSBvdXIgYnV0IG5vdCBDUFUgb3IgdGhlIGNhcmQgKi8KLSNkZWZpbmUJCUFHTlhfU1RBVF9UWEQJMHgxMAotI2RlZmluZQkJQUdOWF9TVEFUX1RYTQkweDIwCi0KLSNkZWZpbmUgQUdOWF9DSVJfQUREUldJTgkweDMwMDQJLyogQWRkcmVzc2FibGUgV2luZG93cyovCi0jZGVmaW5lIEFHTlhfQ0lSX0VORElBTgkJMHgzMDA4ICAvKiBjYXJkIGVuZGlhbm5lc3MgKi8KLSNkZWZpbmUgQUdOWF9DSVJfU0VSSUFMSVRGCTB4MzAyMAkvKiBzZXJpYWwgaW50ZXJmYWNlICovCi0jZGVmaW5lIEFHTlhfQ0lSX1JYQ0ZHCQkweDMwNDAJLyogcmVjZWl2ZSBjb25maWcgKi8KLSNkZWZpbmUJCUVOQUJMRV9SWF9JTlRFUlJVUFQgMHgyMAotI2RlZmluZQkJUlhfQ0FDSEVfTElORQkgICAgMHg4Ci0vKiB0aGUgUlggZnJhZ21lbnQgbGVuZ3RoICovCi0jZGVmaW5lCQlGUkFHX0xFTl8yNTYJMHgwIC8qIDI1NkIgKi8KLSNkZWZpbmUJCUZSQUdfTEVOXzUxMgkweDEKLSNkZWZpbmUJCUZSQUdfTEVOXzEwMjQJMHgyCi0jZGVmaW5lCQlGUkFHX0xFTl8yMDQ4CTB4MwotI2RlZmluZQkJRlJBR19CRQkJMHgxMAotI2RlZmluZSBBR05YX0NJUl9SWENUTAkJMHgzMDUwCS8qIHJlY2VpdmUgY29udHJvbCAqLwotLyogbWVtb3J5IGFkZHJlc3MsIGNoaXBzaWRlICovCi0jZGVmaW5lIEFHTlhfQ0lSX1JYQ01TVEFSVAkweDMwNTQJLyogcmVjZWl2ZSBjbGllbnQgbWVtb3J5IHN0YXJ0ICovCi0jZGVmaW5lIEFHTlhfQ0lSX1JYQ01FTkQJMHgzMDU4CS8qIHJlY2VpdmUgY2xpZW50IG1lbW9yeSBlbmQgKi8KLS8qIG1lbW9yeSBhZGRyZXNzLCBwY2kgKi8KLSNkZWZpbmUgQUdOWF9DSVJfUlhIT1NUQUREUgkweDMwNjAJLyogcmVjZWl2ZSBob3N0c2lkZSBhZGRyZXNzICovCi0vKiBtZW1vcnkgYWRkcmVzcywgY2hpcHNpZGUgKi8KLSNkZWZpbmUgQUdOWF9DSVJfUlhDTElBRERSCTB4MzA2NAkvKiByZWNlaXZlIGNsaWVudHNpZGUgYWRkcmVzcyAqLwotI2RlZmluZSBBR05YX0NJUl9SWERNQUNUTAkweDMwNjgJLyogcmVjZWl2ZSBkbWEgY29udHJvbCAqLwotI2RlZmluZSBBR05YX0NJUl9UWENGRwkJMHgzMDgwCS8qIHRyYW5zbWl0IGNvbmZpZyAqLwotI2RlZmluZSBBR05YX0NJUl9UWE1DVEwJCTB4MzA5MCAvKiBUcmFuc21pdCBNYW5hZ2VtZW50IENvbnRyb2wgKi8KLSNkZWZpbmUJCUVOQUJMRV9UWF9JTlRFUlJVUFQgMHgyMAotI2RlZmluZQkJVFhfQ0FDSEVfTElORQkgICAgMHg4Ci0jZGVmaW5lIEFHTlhfQ0lSX1RYTVNUQVJUCTB4MzA5NCAvKiBUcmFuc21pdCBNYW5hZ2VtZW50IFN0YXJ0ICovCi0jZGVmaW5lIEFHTlhfQ0lSX1RYTUVORAkJMHgzMDk4IC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgRW5kICovCi0jZGVmaW5lIEFHTlhfQ0lSX1RYRENUTAkJMHgzMGEwCS8qIHRyYW5zbWl0IGRhdGEgY29udHJvbCAqLwotLyogbWVtZW9yeSBhZGRyZXNzLCBjaGlwc2V0ICovCi0jZGVmaW5lIEFHTlhfQ0lSX1RYRFNUQVJUCTB4MzBhNAkvKiB0cmFuc21pdCBkYXRhIHN0YXJ0ICovCi0jZGVmaW5lIEFHTlhfQ0lSX1RYREVORAkJMHgzMGE4CS8qIHRyYW5zbWl0IGRhdGEgZW5kICovCi0jZGVmaW5lIEFHTlhfQ0lSX1RYTUhBRERSCTB4MzBiMCAvKiBUcmFuc21pdCBNYW5hZ2VtZW50IEhvc3RzaWRlIEFkZHJlc3MgKi8KLSNkZWZpbmUgQUdOWF9DSVJfVFhNQ0FERFIJMHgzMGI0IC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgQ2xpZW50c2lkZSBBZGRyZXNzICovCi0jZGVmaW5lIEFHTlhfQ0lSX1RYRE1BQ1RMCTB4MzBiOAkvKiB0cmFuc21pdCBkbWEgY29udHJvbCAqLwotCi0KLS8qIFBvd2VyIE1hbmFnbWVudCBVbml0ICovCi0jZGVmaW5lIEFHTlhfUE1fQkFTRQkJMHgzYzAwCi0jZGVmaW5lIEFHTlhfUE1fUE1DVEwJCTB4M2MwMAkvKiBQTSBDb250cm9sKi8KLSNkZWZpbmUgQUdOWF9QTV9NQUNNU1cJCTB4M2MwOCAvKiBNQUMgTWFudWFsIFNsb3cgV29yayBFbmFibGUgKi8KLSNkZWZpbmUgQUdOWF9QTV9SRkNUTAkJMHgzYzBjIC8qIFJGIENvbnRyb2wgKi8KLSNkZWZpbmUgQUdOWF9QTV9QSFlNVwkJMHgzYzE0CS8qIFBoeSBNYW5uYWwgV29yayAqLwotI2RlZmluZSBBR05YX1BNX1NPRlRSU1QJCTB4M2MxOAkvKiBQTVUgU29mdCBSZXNldCAqLwotI2RlZmluZSBBR05YX1BNX1BMTENUTAkJMHgzYzFjCS8qIFBNVSBQTEwgY29udHJvbCovCi0jZGVmaW5lIEFHTlhfUE1fVEVTVFBIWQkJMHgzYzI0IC8qIFBNVSBUZXN0IFBoeSAqLwotCi0KLS8qIEludGVycnVwdCBDb250cm9sIGludGVyZmFjZSAqLwotI2RlZmluZSBBR05YX0lOVF9CQVNFCQkweDQwMDAKLSNkZWZpbmUgQUdOWF9JTlRfU1RBVAkJMHg0MDAwCS8qIGludGVycnVwdCBzdGF0dXMgKi8KLSNkZWZpbmUgQUdOWF9JTlRfTUFTSwkJMHg0MDBjCS8qIGludGVycnVwdCBtYXNrICovCi0vKiBGSVhNRSAqLwotI2RlZmluZQkJSVJRX1RYX0JFQUNPTgkweDEJLyogVFggQmVhY29uICovCi0jZGVmaW5lCQlJUlFfVFhfUkVUUlkJMHg4CS8qIFRYIFJldHJ5IEludGVycnVwdCAqLwotI2RlZmluZQkJSVJRX1RYX0FDVElWSVRZCTB4MTAJLyogVFggQWN0aXZpdHkgKi8KLSNkZWZpbmUJCUlSUV9SWF9BQ1RJVklUWQkweDIwCS8qIFJYIEFjdGl2aXR5ICovCi0vKiBGSVhNRSBJIGd1ZXNzIHRoYXQgaW5zdGVhZCBSWCBhIG5vbmUgZXhpc3Qgc3RhaW9uJ3MgcGFja2V0IG9yCi0gICB0aGUgc3RhdGlvbiBoYXNuJ3QgYmVlbiBpbml0ICovCi0jZGVmaW5lCQlJUlFfUlhfWAkweDQwCi0jZGVmaW5lCQlJUlFfUlhfWQkweDgwCS8qIFJYID8gKi8KLSNkZWZpbmUJCUlSUV9SWF9IQVNISElUCTB4MTAwCS8qIFJYIEhhc2ggSGl0ICovCi0jZGVmaW5lCQlJUlFfUlhfRlJBTUUJMHgyMDAJLyogUlggRnJhbWUgKi8KLSNkZWZpbmUJCUlSUV9FUlJfSU5UCTB4NDAwCS8qIEVycm9yIEludGVycnVwdCAqLwotI2RlZmluZQkJSVJRX1RYX1FVRV9GVUxMCTB4ODAwCS8qIFRYIFdvcmtxdWV1ZSBGdWxsICovCi0jZGVmaW5lCQlJUlFfQkFORE1BTl9FUlIJMHgxMDAwMAkvKiBCYW5kd2lkdGggTWFuYWdlbWVudCBFcnJvciAqLwotI2RlZmluZQkJSVJRX1RYX0RJU0FCTEUJMHgyMDAwMAkvKiBUWCBEaXNhYmxlICovCi0jZGVmaW5lCQlJUlFfUlhfSVZBU0VTS0VZIDB4ODAwMDAgLyogUlggSW52YWxpZCBTZXNzaW9uIEtleSAqLwotI2RlZmluZQkJSVJRX1JYX0tFWUlETUlTCTB4MTAwMDAwIC8qIFJYIGtleSBJRCBNaXNtYXRjaCAqLwotI2RlZmluZQkJSVJRX1JFUF9USEhJVAkweDIwMDAwMCAvKiBSZXBsYXkgVGhyZXNob2xkIEhpdCAqLwotI2RlZmluZQkJSVJRX1RJTUVSMQkweDQwMDAwMDAgLyogVGltZXIxICovCi0jZGVmaW5lCQlJUlFfVElNRVJfQ05UCTB4MTAwMDAwMDAgLyogVGltZXIgQ291bnQgKi8KLSNkZWZpbmUJCUlSUV9QSFlfRkFTVElOVCAweDIwMDAwMDAwIC8qIFBoeSBGYXN0IEludGVycnVwdCAqLwotI2RlZmluZQkJSVJRX1BIWV9TTE9XSU5UCTB4NDAwMDAwMDAgLyogUGh5IFNsb3cgSW50ZXJydXB0ICovCi0jZGVmaW5lCQlJUlFfT1RIRVIJMHg4MDAwMDAwMCAvKiBVbmtub3cgaW50ZXJydXB0ICovCi0jZGVmaW5lCQlBR05YX0lSUV9BTEwgICAJMHhmZmZmZmZmZgotCi0vKiBTeXN0ZW0gSW50ZXJmYWNlICovCi0jZGVmaW5lIEFHTlhfU1lTSVRGX0JBU0UJMHg0NDAwCi0jZGVmaW5lIEFHTlhfU1lTSVRGX1NZU01PREUJMHg0NDAwCS8qIHN5c3RlbSBtb2RlICovCi0jZGVmaW5lIEFHTlhfU1lTSVRGX0dQSU9JTgkweDQ0MTAgLyogR1BJTyBJbiAqLwotLyogUElOIGxpbmVzIGZvciBsZWRzPyAqLwotI2RlZmluZSBBR05YX1NZU0lURl9HUElPVVQJMHg0NDE0CS8qIEdQSU8gT3V0ICovCi0KLS8qIFRpbWVyIENvbnRyb2wgKi8KLSNkZWZpbmUgQUdOWF9USU1DVExfVElNRVIxCTB4NDgwMCAvKiBUaW1lciAxICovCi0jZGVmaW5lIEFHTlhfVElNQ1RMX1RJTTFDVEwJMHg0ODA4IC8qIFRpbWVyIDEgQ29udHJvbCAqLwotCi0KLS8qIEFudGVubmEgQ2FsaWJyYXRpb24gSW50ZXJmYWNlICovCi0jZGVmaW5lIEFHTlhfQUNJX0JBU0UJCTB4NTAwMAotI2RlZmluZSBBR05YX0FDSV9NT0RFCQkweDUwMDAgLyogTW9kZSAqLwotI2RlZmluZSBBR05YX0FDSV9NRUFTVVJFCTB4NTAwNCAvKiBNZWFzdXJlICovCi0jZGVmaW5lIEFHTlhfQUNJX1NFTENIQUlOCTB4NTAwOCAvKiBTZWxlY3QgQ2hhaW4gKi8KLSNkZWZpbmUgQUdOWF9BQ0lfTEVOCQkweDUwMGMgLyogTGVuZ3RoICovCi0jZGVmaW5lIEFHTlhfQUNJX1RJTUVSMQkJMHg1MDE4IC8qIFRpbWVyIDEgKi8KLSNkZWZpbmUgQUdOWF9BQ0lfVElNRVIyCQkweDUwMWMgLyogVGltZXIgMiAqLwotI2RlZmluZSBBR05YX0FDSV9PRkZTRVQJCTB4NTAyMCAvKiBPZmZzZXQgKi8KLSNkZWZpbmUgQUdOWF9BQ0lfU1RBVFVTCQkweDUwMzAgLyogU3RhdHVzICovCi0jZGVmaW5lCQlDQUxJX0lETEUJMHgwCi0jZGVmaW5lCQlDQUxJX0RPTkUJMHgxCi0jZGVmaW5lCQlDQUxJX0JVU1kJMHgyCi0jZGVmaW5lCQlDQUxJX0VSUgkweDMKLSNkZWZpbmUgQUdOWF9BQ0lfQUlDQ0hBME9WRQkweDUwMzQgLyogQUlDIENoYW5uZWwgMCBPdmVycmlkZSAqLwotI2RlZmluZSBBR05YX0FDSV9BSUNDSEExT1ZFCTB4NTAzOCAvKiBBSUMgQ2hhbm5lbCAxIE92ZXJyaWRlICovCi0KLS8qIEdhaW4gQ29udHJvbCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfQkFTRQkJMHg5MDAwCi0vKiB0aHJlc2hvbGQgb2YgcHJpbWFyeSBhbnRlbm5hICovCi0jZGVmaW5lIEFHTlhfR0NSX1RIRDBBCQkweDkwMDAJLyogdGhyZXNob2xkPyBEMCBBICovCi0vKiBsb3cgdGhyZXNob2xkIG9mIHByaW1hcnkgYW50ZW5uYSAqLwotI2RlZmluZSBBR05YX0dDUl9USEQwQUwJCTB4OTAwNAkvKiB0aHJlc2hvbGQ/IEQwIEEgbG93ICovCi0vKiB0aHJlc2hvbGQgb2Ygc2Vjb25kYXJ5IGFudGVubmEgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfVEhEMEIJCTB4OTAwOAkvKiB0aHJlc2hvbGQ/IEQwX0IgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfRFVOU0FUCQkweDkwMGMgLyogZCB1bnNhdHVyYXRlZCAqLwotI2RlZmluZSBBR05YX0dDUl9EU0FUCQkweDkwMTAgLyogZCBzYXR1cmF0ZWQgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfREZJUkNBTAkweDkwMTQgLyogRCBGaXIvQ2FsICovCi0jZGVmaW5lIEFHTlhfR0NSX0RHQ1RMMTFBCTB4OTAxOCAvKiBkIGdhaW4gY29udHJvbCAxMWEgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfREdDVEwxMUIJMHg5MDFjIC8qIGQgZ2FpbiBjb250cm9sIDExYiAqLwotLyogc3RyZW5ndGggb2YgZ2FpbiAqLwotI2RlZmluZSBBR05YX0dDUl9HQUlOSU5JVAkweDkwMjAJLyogZ2FpbiBpbml0aWFsaXphdGlvbiAqLwotI2RlZmluZSBBR05YX0dDUl9USE5PU0lHCTB4OTAyNCAvKiB0aHJlaG9sZCBubyBzaWduYWwgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfQ09BUlNURVAJMHg5MDI4IC8qIGNvYXJzZSBzdGVwcGluZyAqLwotI2RlZmluZSBBR05YX0dDUl9TSUZTVDExQQkweDkwMmMgLyogc2lmeCB0aW1lIDExYSAqLwotI2RlZmluZSBBR05YX0dDUl9TSUZTVDExQgkweDkwMzAgLyogc2lmeCB0aW1lIDExYiAqLwotI2RlZmluZSBBR05YX0dDUl9DV0RFVEVDCTB4OTAzNCAvKiBjdyBkZXRlY3Rpb24gKi8KLSNkZWZpbmUgQUdOWF9HQ1JfMFgzOAkJMHg5MDM4IC8qID8/Pz8gKi8KLSNkZWZpbmUgQUdOWF9HQ1JfQk9BQ1QJCTB4OTAzYwkvKiBCTyBBY3RpdmUgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfQk9JTkFDVAkweDkwNDAJLyogQk8gSW5hY3RpdmUgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfQk9EWU5BCQkweDkwNDQJLyogQk8gZHluYW1pYyAqLwotLyogODAyLjExIG1vZGUoYSxiLGcpICovCi0jZGVmaW5lIEFHTlhfR0NSX0RJU0NPVk1PRAkweDkwNDgJLyogZGlzY292ZXJ5IG1vZGUgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfTkxJU1RBTlQJMHg5MDRjCS8qIG51bWJlciBvZiBsaXN0ZW5pbmcgYW50ZW5uYSAqLwotI2RlZmluZSBBR05YX0dDUl9OQUNUSUFOVAkweDkwNTAJLyogbnVtYmVyIG9mIGFjdGl2ZSBhbnRlbm5hICovCi0jZGVmaW5lIEFHTlhfR0NSX05NRUFTQU5UCTB4OTA1NAkvKiBudW1iZXIgb2YgbWVhc3VyaW5nIGFudGVubmEgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfTkNBUFRBTlQJMHg5MDU4CS8qIG51bWJlciBvZiBjYXB0dXJlIGFudGVubmEgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfVEhDQVAxMUEJMHg5MDVjIC8qIHRocmVzaG9sZCBjYXB0dXJlIDExYSAqLwotI2RlZmluZSBBR05YX0dDUl9USENBUDExQgkweDkwNjAgLyogdGhyZXNob2xkIGNhcHR1cmUgMTFiICovCi0jZGVmaW5lIEFHTlhfR0NSX1RIQ0FQUlgxMUEJMHg5MDY0IC8qIHRocmVzaG9sZCBjYXB0dXJlIHJ4IDExYSAqLwotI2RlZmluZSBBR05YX0dDUl9USENBUFJYMTFCCTB4OTA2OCAvKiB0aHJlc2hvbGQgY2FwdHVyZSByeCAxMWIgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfVEhMRVZEUk8JMHg5MDZjIC8qIHRocmVzaG9sZCBsZXZlbCBkcm9wICovCi0jZGVmaW5lIEFHTlhfR0NSX0dBSU5TRVQwCTB4OTA3MCAvKiBHYWluc2V0IDAgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfR0FJTlNFVDEJMHg5MDc0IC8qIEdhaW5zZXQgMSAqLwotI2RlZmluZSBBR05YX0dDUl9HQUlOU0VUMgkweDkwNzggLyogR2FpbnNldCAyICovCi0jZGVmaW5lIEFHTlhfR0NSX01BWFJYVElNRTExQQkweDkwN2MgLyogbWF4aW11bSByeCB0aW1lIDExYSAqLwotI2RlZmluZSBBR05YX0dDUl9NQVhSWFRJTUUxMUIJMHg5MDgwIC8qIG1heGltdW0gcnggdGltZSAxMWIgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfQ09SUlRJTUUJMHg5MDg0IC8qIGNvcnJlY3Rpb24gdGltZSAqLwotLyogcmVzZXQgdGhlIHN1YnN5c3RlbSwgMCA9IGRpc2FibGUsIDEgPSBlbmFibGUgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfUlNUR0NUTAkweDkwODgJLyogcmVzZXQgZ2FpbiBjb250cm9sICovCi0vKiBjaGFubmVsIHJlY2VpdmluZyAqLwotI2RlZmluZSBBR05YX0dDUl9SWENIQU5FTAkweDkwOGMJLyogcmVjZWl2ZSBjaGFubmVsICovCi0jZGVmaW5lIEFHTlhfR0NSX05PSVNFMAkJMHg5MDkwIC8qIE5vaXNlIDAgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfTk9JU0UxCQkweDkwOTQgLyogTm9pc2UgMSAqLwotI2RlZmluZSBBR05YX0dDUl9OT0lTRTIJCTB4OTA5OCAvKiBOb2lzZSAyICovCi0jZGVmaW5lIEFHTlhfR0NSX1NJR0hUSAkJMHg5MDljCS8qIFNpZ25hbCBIaWdoIFRocmVzaG9sZCAqLwotI2RlZmluZSBBR05YX0dDUl9TSUdMVEgJCTB4OTBhMAkvKiBTaWduYWwgTG93IFRocmVzaG9sZCAqLwotI2RlZmluZSBBR05YX0dDUl9DT1JSRFJPUAkweDkwYTQgLyogY29ycmVjdGlvbiBkcm9wICovCi0vKiB0aHJlc2hvbGQgb2YgdGVydGlheSBhbnRlbm5hICovCi0jZGVmaW5lIEFHTlhfR0NSX1RIQ0QJCTB4OTBhOAkvKiB0aHJlc2hvbGQ/IENEICovCi0jZGVmaW5lIEFHTlhfR0NSX1RIQ1MJCTB4OTBhYwkvKiB0aHJlc2hvbGQ/IENTICovCi0jZGVmaW5lIEFHTlhfR0NSX01BWFBPV0RJRkYJMHg5MGI4IC8qIG1heGltdW0gcG93ZXIgZGlmZmVyZW5jZSAqLwotI2RlZmluZSBBR05YX0dDUl9UUkFDTlQ0CTB4OTBlYyAvKiBUcmFuc2l0aW9uIENvdW50IDQgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfVFJBQ05UNSAgICAgIAkweDkwZjAJLyogdHJhbnNpdGlvbiBjb3VudCA1ICovCi0jZGVmaW5lIEFHTlhfR0NSX1RSQUNOVDYgICAgICAgCTB4OTBmNAkvKiB0cmFuc2l0aW9uIGNvdW50IDYgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfVFJBQ05UNyAgICAgICAJMHg5MGY4CS8qIHRyYW5zaXRpb24gY291dG4gNyAqLwotI2RlZmluZSBBR05YX0dDUl9URVNUQlVTCTB4OTExYyAvKiB0ZXN0IGJ1cyAqLwotI2RlZmluZSBBR05YX0dDUl9DSEFJTk5VTQkweDkxMjAgLyogTnVtYmVyIG9mIENoYWlucyAqLwotI2RlZmluZSBBR05YX0dDUl9BTlRDRkcJCTB4OTEyNAkvKiBBbnRlbm5hIENvbmZpZyAqLwotI2RlZmluZSBBR05YX0dDUl9USEpVTVAJCTB4OTEyYyAvKiB0aHJlaG9sZCBqdW1wICovCi0jZGVmaW5lIEFHTlhfR0NSX1RIUE9XRVIJMHg5MTMwIC8qIHRocmVzaG9sZCBwb3dlciAqLwotI2RlZmluZSBBR05YX0dDUl9USFBPV0NMSVAJMHg5MTM0IC8qIHRocmVzaG9sZCBwb3dlciBjbGlwKi8KLSNkZWZpbmUgQUdOWF9HQ1JfRk9SQ0VDVExDTEsJMHg5MTM4IC8qIEZvcmNlIEdhaW4gQ29udHJvbCBDbG9jayAqLwotI2RlZmluZSBBR05YX0dDUl9HQUlOU0VUV1JJVEUJMHg5MTNjIC8qIEdhaW5zZXQgV3JpdGUgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfVEhEMEJURkVTVAkweDkxNDAJLyogdGhyZXNob2xkIGQwIGIgdGYgZXN0aW1hdGUgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfVEhSWDExQlBPV01JTgkweDkxNDQJLyogdGhyZXNob2xkIHJ4IDExYiBwb3dlciBtaW5pbXVtICovCi0jZGVmaW5lIEFHTlhfR0NSXzBYMTRjCQkweDkxNGMgLyogPz8gKi8KLSNkZWZpbmUgQUdOWF9HQ1JfMFgxNTAJCTB4OTE1MCAvKiA/PyAqLwotI2RlZmluZSBBR05YX0dDUl9SWE9WRVJJREUJMHg5MTk0CS8qIHJlY2lldmUgb3ZlcnJpZGUgKi8KLSNkZWZpbmUgQUdOWF9HQ1JfV0FUQ0hET0cJMHg5MWIwCS8qIHdhdGNoZG9nIHRpbWVvdXQgKi8KLQotCi0vKiBTcGkgSW50ZXJmYWNlICovCi0jZGVmaW5lIEFHTlhfU1BJX0JBU0UJCTB4ZGMwMAotI2RlZmluZSBBR05YX1NQSV9DRkcJCTB4ZGMwMCAvKiBzcGkgY29uZmlndXJhdGlvbiAqLwotLyogT25seSBhY2NlcHQgMTYgYml0cyAqLwotI2RlZmluZSBBR05YX1NQSV9XTVNXCQkweGRjMDQJLyogd3JpdGUgbW9zdCBzaWduaWZpY2FudCB3b3JkICovCi0vKiBPbmx5IGFjY2VwdCAxNiBiaXRzICovCi0jZGVmaW5lIEFHTlhfU1BJX1dMU1cJCTB4ZGMwOAkvKiB3cml0ZSBsZWFzdCBzaWduaWZpY2FudCB3b3JkICovCi0jZGVmaW5lIEFHTlhfU1BJX0NUTAkJMHhkYzBjCS8qIHNwaSBjb250cm9sICovCi0jZGVmaW5lIEFHTlhfU1BJX1JNU1cJCTB4ZGMxMCAvKiByZWFkIG1vc3Qgc2lnbmlmaWNhbnQgd29yZCAqLwotI2RlZmluZSBBR05YX1NQSV9STFNXCQkweGRjMTQgLyogcmVhZCBsZWFzdCBzaWduaWZpY2FudCB3b3JkICovCi0vKiBTUEkgQ29udHJvbCBNYXNrICovCi0jZGVmaW5lCQlTUElfUkVBRF9DVEwJCTB4NDAwMCAvKiByZWFkIGNvbnRyb2wgKi8KLSNkZWZpbmUJCVNQSV9CVVNZX0NUTAkJMHg4MDAwIC8qIGJ1c3kgY29udHJvbCAqLwotLyogUkYgYW5kIHN5bnRoIGNoaXBzIGluIHNwaSAqLwotI2RlZmluZQkJUkZfQ0hJUDAJMHg0MDAKLSNkZWZpbmUJCVJGX0NISVAxCTB4ODAwCi0jZGVmaW5lCQlSRl9DSElQMgkweDEwMDAKLSNkZWZpbmUJCVNZTlRIX0NISVAJMHgyMDAwCi0KLS8qIFVua25vd24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQUdOWF9VTktOT1dOX0JBU0UJMHg3ODAwCi0KLS8qIEZJWE1FIE1vbml0b3JHYWluICovCi0jZGVmaW5lIEFHTlhfTU9OR0NSX0JBU0UJMHgxMjAwMAotCi0vKiBHYWluIFRhYmxlICovCi0jZGVmaW5lIEFHTlhfR0FJTl9UQUJMRQkJMHgxMjQwMAotCi0vKiBUaGUgaW5pdGlhbCBGSVIgY29lZmZpY2llbnQgdGFibGUgKi8KLSNkZWZpbmUgQUdOWF9GSVJfQkFTRQkJMHgxOTgwNAotCi0jZGVmaW5lIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwJMHg4MDAKLQotLyogZWVwcm9tIGNvbW1hbmRzICovCi0jZGVmaW5lIEVFUFJPTV9DTURfTlVMTAkJMHgwIC8qIE5VTEwgKi8KLSNkZWZpbmUgRUVQUk9NX0NNRF9XUklURQkweDIgLyogd3JpdGUgKi8KLSNkZWZpbmUgRUVQUk9NX0NNRF9SRUFECQkweDMgLyogcmVhZCAqLwotI2RlZmluZSBFRVBST01fQ01EX1NUQVRVU1JFQUQJMHg1IC8qIHN0YXR1cyByZWdpc3RlciByZWFkICovCi0jZGVmaW5lIEVFUFJPTV9DTURfV1JJVEVFTkFCTEUJMHg2IC8qIHdyaXRlIGVuYWJsZSAqLwotI2RlZmluZSBFRVBST01fQ01EX0NPTkZJR1VSRQkweDcgLyogY29uZmlndXJlICovCi0KLSNkZWZpbmUgRUVQUk9NX0RBVEFGT1JDT0ZJR1VSRQkweDYgLyogPz8/ICovCi0KLS8qIGVlcHJvbSBhZGRyZXNzICovCi0jZGVmaW5lIEVFUFJPTV9BRERSX1NVQlZJRAkweDAgLyogU3ViIFZlbmRvciBJRCAqLwotI2RlZmluZSBFRVBST01fQUREUl9TVUJTSUQJMHgyIC8qIFN1YiBTeXN0ZW0gSUQgKi8KLSNkZWZpbmUgRUVQUk9NX0FERFJfTUFDQUREUgkweDE0NiAvKiBNQUMgQWRkcmVzcyAqLwotI2RlZmluZSBFRVBST01fQUREUl9MT1RZUEUJMHgxNGYgLyogTE8gdHlwZSAqLwotCi1zdHJ1Y3QgYWdueF9lZXByb20gewotCXU4IGRhdGE7CS8qIGRhdGUgKi8KLQl1MTYgYWRkcmVzczsJLyogYWRkcmVzcyBpbiBFRVBST00gKi8KLQl1OCBjbWQ7CQkvKiBjb21tYW5kLCB1bmtub3duLCBzdGF0dXMgKi8KLX0gIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotI2RlZmluZSBBR05YX0VFUFJPTV9DT01NQU5EX1NISUZUCTUKLSNkZWZpbmUgQUdOWF9FRVBST01fQ09NTUFORF9TVEFUCTB4MDEKLQotdm9pZCBkaXNhYmxlX3JlY2VpdmVyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwotdm9pZCBlbmFibGVfcmVjZWl2ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci11OCByZWFkX2Zyb21fZWVwcm9tKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUxNiBhZGRyZXNzKTsKLXZvaWQgYWdueF9od19pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwotaW50IGFnbnhfaHdfcmVzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci1pbnQgYWdueF9zZXRfc3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKTsKLXZvaWQgYWdueF9zZXRfYnNzaWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgY29uc3QgdTggKmJzc2lkKTsKLXZvaWQgZW5hYmxlX3Bvd2VyX3NhdmluZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKLXZvaWQgZGlzYWJsZV9wb3dlcl9zYXZpbmcoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci12b2lkIGNhbGlicmF0ZV9hbnRlbm5hX3BlcmlvZCh1bnNpZ25lZCBsb25nIGRhdGEpOwotCi0jZW5kaWYgLyogQUdOWF9QSFlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9yZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmU0NTdhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3JmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTMgKzAsMCBAQAotLyoqCi0gKiBBaXJnbyBNSU1PIHdpcmVsZXNzIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBMaSBZYW5CbyA8ZHJlYW1mbHkyODFAZ21haWwuY29tPgotCi0gKiBUaGFua3MgZm9yIEplZmYgV2lsbGlhbXMgPGFuZ2VsYmFuZUBnbWFpbC5jb20+IGRvIHJldmVyc2UgZW5naW5lZXIKLSAqIHdvcmtzIGFuZCBwdWJsaXNoZWQgdGhlIFNQRUNTIGF0IGh0dHA6Ly9haXJnby53ZHdjb25zdWx0aW5nLm5ldC9teW1vaW4KLQotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICJhZ254LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJwaHkuaCIKLSNpbmNsdWRlICJ0YWJsZS5oIgotCi0vKiBGSVhNRSEgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGlfd3JpdGUodm9pZCBfX2lvbWVtICpyZWdpb24sIHUzMiBjaGlwX2lkcywgdTMyIHN3LAotCQkgICAgICB1MTYgc2l6ZSwgdTMyIGNvbnRyb2wpCi17Ci0JdTMyIHJlZzsKLQl1MzIgbHN3ID0gc3cgJiAweGZmZmY7CQkvKiBsb3dlciAxNiBiaXRzIG9mIHN3Ki8KLQl1MzIgbXN3ID0gc3cgPj4gMTY7CQkvKiBoaWdoIDE2IGJpdHMgb2Ygc3cgKi8KLQotCS8qIEZJWE1FIFdyaXRlIE1vc3QgU2lnbmlmaWNhbnQgV29yZCBvZiB0aGUgMzJiaXQgZGF0YSB0byBNU1cgKi8KLQkvKiBGSVhNRSBBbmQgTGVhc3QgU2lnbmlmaWNhbnQgV29yZCB0byBMU1cgKi8KLQlpb3dyaXRlMzIoKGxzdyksIHJlZ2lvbiArIEFHTlhfU1BJX1dMU1cpOwotCWlvd3JpdGUzMigobXN3KSwgcmVnaW9uICsgQUdOWF9TUElfV01TVyk7Ci0JcmVnID0gY2hpcF9pZHMgfCBzaXplIHwgY29udHJvbDsKLQkvKiBXcml0ZSBjaGlwIGlkKHMpLCB3cml0ZSBzaXplIGFuZCBidXN5IGNvbnRyb2wgdG8gQ29udHJvbCBSZWdpc3RlciAqLwotCWlvd3JpdGUzMigocmVnKSwgcmVnaW9uICsgQUdOWF9TUElfQ1RMKTsKLQkvKiBXYWl0IGZvciBCdXN5IGNvbnRyb2wgdG8gY2xlYXIgKi8KLQlzcGlfZGVsYXkoKTsKLX0KLQotLyoKLSAqIFdyaXRlIHRvIFNQSSBTeW50aCByZWdpc3RlcgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc3BpX3N5X3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdykKLXsKLQkvKiBGSVhNRSB0aGUgc2l6ZSAweDE1IGlzIGEgbWFnaWMgdmFsdWUqLwotCXNwaV93cml0ZShyZWdpb24sIGNoaXBfaWRzLCBzdywgMHgxNSwgU1BJX0JVU1lfQ1RMKTsKLX0KLQotLyoKLSAqIFdyaXRlIHRvIFNQSSBSRiByZWdpc3RlcgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc3BpX3JmX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdykKLXsKLQkvKiBGSVhNRSB0aGUgc2l6ZSAweGQgaXMgYSBtYWdpYyB2YWx1ZSovCi0Jc3BpX3dyaXRlKHJlZ2lvbiwgY2hpcF9pZHMsIHN3LCAweGQsIFNQSV9CVVNZX0NUTCk7Ci19IC8qIHNwaV9yZl93cml0ZSAqLwotCi0vKgotICogV3JpdGUgdG8gU1BJIHdpdGggUmVhZCBDb250cm9sIGJpdCBzZXQKLSAqLwotaW5saW5lIHZvaWQgc3BpX3JjX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdykKLXsKLQkvKiBGSVhNRSB0aGUgc2l6ZSAweGU1IGlzIGEgbWFnaWMgdmFsdWUgKi8KLQlzcGlfd3JpdGUocmVnaW9uLCBjaGlwX2lkcywgc3csIDB4ZTUsIFNQSV9CVVNZX0NUTHxTUElfUkVBRF9DVEwpOwotfQotCi0vKiBHZXQgdGhlIGFjdGl2ZSBjaGFpbnMncyBjb3VudCAqLwotc3RhdGljIGludCBnZXRfYWN0aXZlX2NoYWlucyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCWludCBudW0gPSAwOwotCXUzMiByZWc7Ci0JQUdOWF9UUkFDRTsKLQotCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDIxKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOwotCWlmIChyZWcgPT0gMSkKLQkJbnVtKys7Ci0KLQlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMSwgMHgyMSk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKLQlpZiAocmVnID09IDEpCi0JCW51bSsrOwotCi0Jc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MjEpOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7Ci0JaWYgKHJlZyA9PSAxKQotCQludW0rKzsKLQotCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI2KTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOwotCWlmICgweDMzICE9IHJlZykKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOwotCi0JcmV0dXJuIG51bTsKLX0gLyogZ2V0X2FjdGl2ZV9jaGFpbnMgKi8KLQotdm9pZCByZl9jaGlwc19pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTMyIHJlZzsKLQlpbnQgbnVtOwotCUFHTlhfVFJBQ0U7Ci0KLQlpZiAocHJpdi0+cmV2aWQgPT0gMSkgewotCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCk7Ci0JCXJlZyB8PSAweDg7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgcmVnKTsKLQl9Ci0KLQkvKiBTZXQgU1BJIGNsb2NrIHNwZWVkIHRvIDIwME5TICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOwotCXJlZyAmPSB+MHhGOwotCXJlZyB8PSAweDM7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOwotCi0JLyogU2V0IFNQSSBjbG9jayBzcGVlZCB0byA1ME5TICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOwotCXJlZyAmPSB+MHhGOwotCXJlZyB8PSAweDE7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOwotCi0Jc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTEwMSk7Ci0KLQludW0gPSBnZXRfYWN0aXZlX2NoYWlucyhwcml2KTsKLQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQWN0aXZlIGNoYWlucyBhcmUgJWRcbiIsIG51bSk7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7Ci0JcmVnICY9IH4weEY7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOwotCi0Jc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTkwOCk7Ci19IC8qIHJmX2NoaXBzX2luaXQgKi8KLQotCi1zdGF0aWMgdTMyIGNoYW5uZWxfdGJsWzE1XVs5XSA9IHsKLQl7MCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCXsxLCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWE0LCAweDI4LCAweDAwLCAweDFlfSwKLQl7MiwgIDB4MDAsIDB4MDAsIDB4NjE1LCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCi0JezMsICAweDAwLCAweDAwLCAweDYxYSwgMHgwMCwgMHgxYWUsIDB4MjgsIDB4MDAsIDB4MWV9LAotCXs0LCAgMHgwMCwgMHgwMCwgMHg2MWYsIDB4MDAsIDB4MWFlLCAweDI4LCAweDAwLCAweDFlfSwKLQl7NSwgIDB4MDAsIDB4MDAsIDB4NjI0LCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCi0JezYsICAweDAwLCAweDAwLCAweDYxZiwgMHgwMCwgMHgxYjMsIDB4MjgsIDB4MDAsIDB4MWV9LAotCXs3LCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWIzLCAweDI4LCAweDAwLCAweDFlfSwKLQl7OCwgIDB4MDAsIDB4MDAsIDB4NjI5LCAweDAwLCAweDFiMywgMHgyOCwgMHgwMCwgMHgxZX0sCi0JezksICAweDAwLCAweDAwLCAweDYyNCwgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAotCXsxMCwgMHgwMCwgMHgwMCwgMHg2MjksIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKLQl7MTEsIDB4MDAsIDB4MDAsIDB4NjJlLCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCi0JezEyLCAweDAwLCAweDAwLCAweDYzMywgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAotCXsxMywgMHgwMCwgMHgwMCwgMHg2MjgsIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKLQl7MTQsIDB4MDAsIDB4MDAsIDB4NjQ0LCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCi19OwotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotY2hhbm5lbF90Ymxfd3JpdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCByZWdfbnVtKQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0KLQlyZWcgPSBjaGFubmVsX3RibFtjaGFubmVsXVtyZWdfbnVtXTsKLQlyZWcgPDw9IDQ7Ci0JcmVnIHw9IHJlZ19udW07Ci0Jc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgcmVnKTsKLX0KLQotc3RhdGljIHZvaWQgc3ludGhfZnJlcV9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTMyIHJlZzsKLQlBR05YX1RSQUNFOwotCi0Jc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7Ci0KLQkvKiBTZXQgdGhlIENsb2NrIGJpdHMgdG8gNTBOUyAqLwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfQ0ZHKTsKLQlyZWcgJj0gfjB4RjsKLQlyZWcgfD0gMHgxOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKLQotCS8qIFdyaXRlIDB4MDBjMCB0byBMU1cgYW5kIDB4MyB0byBNU1cgb2YgU3ludGggQ2hpcCAqLwotCXNwaV9zeV93cml0ZShjdGwsIFNZTlRIX0NISVAsIDB4MzAwYzApOwotCi0Jc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgMHgzMik7Ci0KLQkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDEgb24gdGhlIFN5bnRoIENoaXAgKi8KLQljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCAxKTsKLQkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDMgb24gdGhlIFN5bnRoIENoaXAgKi8KLQljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCAzKTsKLQkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDYgb24gdGhlIFN5bnRoIENoaXAgKi8KLQljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA2KTsKLQkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDUgb24gdGhlIFN5bnRoIENoaXAgKi8KLQljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA1KTsKLQkvKiAjIFdyaXRlIHRvIHJlZ2lzdGVyIDggb24gdGhlIFN5bnRoIENoaXAgKi8KLQljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA4KTsKLQotCS8qIEZJWE1FIENsZWFyIHRoZSBjbG9jayBiaXRzICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOwotCXJlZyAmPSB+MHhmOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKLX0gLyogc3ludGhfY2hpcF9pbml0ICovCi0KLQotc3RhdGljIHZvaWQgYW50ZW5uYV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIGludCBudW1fYW50ZW5uYSkKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQotCXN3aXRjaCAobnVtX2FudGVubmEpIHsKLQljYXNlIDE6Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAxKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAxKTsKLQotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9BTlRDRkcsIDcpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMzQpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAzNCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPRFlOQSwgMzApOwotCi0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMjUpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA5MCk7Ci0KLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgODApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdIVEgsIDEwMCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0xUSCwgMTYpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAyKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDIpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMik7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAyKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAxNSk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAzNik7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPSU5BQ1QsIDM2KTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAzMik7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMjApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA4MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDcwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAxMDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDMyKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTElTVEFOVCwgMyk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAzKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkFDVElBTlQsIDMpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQ0FQVEFOVCwgMyk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0FOVENGRywgMzEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMzYpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAzNik7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPRFlOQSwgMzIpOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMTAwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAxMDApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgNzApOwotCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQlRGRVNULCA3MCk7Ci0JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0hUSCwgMTAwKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCA0OCk7Ci0vKgkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCAxNik7ICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3cgYW50ZW5uYSBudW1iZXJcbiIpOwotCX0KLX0gLyogYW50ZW5uYV9pbml0ICovCi0KLXN0YXRpYyB2b2lkIGNoYWluX3VwZGF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgY2hhaW4pCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTMyIHJlZzsKLQlBR05YX1RSQUNFOwotCi0Jc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjApOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7Ci0KLQlpZiAocmVnID09IDB4NCkKLQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIHJlZ3wweDEwMDApOwotCWVsc2UgaWYgKHJlZyAhPSAweDApCi0JCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCByZWd8MHgxMDAwKTsKLQllbHNlIHsKLQkJaWYgKGNoYWluID09IDMgfHwgY2hhaW4gPT0gNikgewotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIHJlZ3wweDEwMDApOwotCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOwotCQl9IGVsc2UgaWYgKGNoYWluID09IDIgfHwgY2hhaW4gPT0gNCkgewotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIHJlZ3wweDEwMDApOwotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTAwNSk7Ci0JCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4ODI0KTsKLQkJfSBlbHNlIGlmIChjaGFpbiA9PSAxKSB7Ci0JCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgcmVnfDB4MTAwMCk7Ci0JCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMXxSRl9DSElQMiwgMHgxMDA0KTsKLQkJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhjMzYpOwotCQl9Ci0JfQotCi0Jc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjIpOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7Ci0KLQlzd2l0Y2ggKHJlZykgewotCWNhc2UgMDoKLQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJaWYgKGNoYWluID09IDYgfHwgY2hhaW4gPT0gNCkgewotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMik7Ci0JCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMDA1KTsKLQkJfSBlbHNlIGlmIChjaGFpbiA8IDMpIHsKLQkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDIpOwotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKGNoYWluID09IDMpIHsKLQkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDMpOwotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTIwMSk7Ci0JCX0gZWxzZSBpZiAoY2hhaW4gPT0gMikgewotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MTIwMyk7Ci0JCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAwKTsKLQkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxLCAweDEyMDEpOwotCQl9IGVsc2UgaWYgKGNoYWluID09IDEpIHsKLQkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDMpOwotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTIwMCk7Ci0JCX0gZWxzZSBpZiAoY2hhaW4gPT0gNCkgewotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMyk7Ci0JCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAxKTsKLQkJfSBlbHNlIHsKLQkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDMpOwotCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTIwMSk7Ci0JCX0KLQl9Ci19IC8qIGNoYWluX3VwZGF0ZSAqLwotCi1zdGF0aWMgdm9pZCBhbnRlbm5hX2NvbmZpZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0JQUdOWF9UUkFDRTsKLQotCS8qIFdyaXRlIDB4MCB0byB0aGUgVFggTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyIEVuYWJsZSBiaXQgKi8KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NUTCk7Ci0JcmVnICY9IH4weDE7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOwotCi0JLyogRklYTUUgKi8KLQkvKiBTZXQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBudW1iZXIgb2YgQW50ZW5uYWUgKi8KLQlhbnRlbm5hX2luaXQocHJpdiwgMyk7Ci0KLQkvKiBGSVhNRSBVcGRhdGUgUG93ZXIgVGVtcGxhdGVzIGZvciBjdXJyZW50IHZhbGlkIFN0YXRpb25zICovCi0JLyogc3RhX3Bvd2VyX2luaXQocHJpdiwgMCk7Ki8KLQotCS8qIEZJWE1FIHRoZSBudW1iZXIgb2YgY2hhaW5zIHNob3VsZCBnZXQgZnJvbSBlZXByb20qLwotCWNoYWluX3VwZGF0ZShwcml2LCBBR05YX0NIQUlOU19NQVgpOwotfSAvKiBhbnRlbm5hX2NvbmZpZyAqLwotCi12b2lkIGNhbGlicmF0ZV9vc2NpbGxhdG9yKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTMyIHJlZzsKLQlBR05YX1RSQUNFOwotCi0Jc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7Ci0JcmVnIHw9IDB4MTA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIHJlZyk7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUV1JJVEUsIDEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDEpOwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7Ci0JLyogKFJlc2lkdWFsIERDIENhbGlicmF0aW9uKSB0byBDYWxpYnJhdGlvbiBNb2RlICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgyKTsKLQotCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEwMDQpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHgzZmYpOwotCS8qIChUWCBMTyBDYWxpYnJhdGlvbikgdG8gQ2FsaWJyYXRpb24gTW9kZSAqLwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4NCk7Ci0KLQlkbyB7Ci0JCXUzMiAgcmVnMSwgcmVnMiwgcmVnMzsKLQkJLyogRW5hYmxlIFBvd2VyIFNhdmluZyBDb250cm9sICovCi0JCWVuYWJsZV9wb3dlcl9zYXZpbmcocHJpdik7Ci0JCS8qIFNhdmUgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgdG8gcmVzdG9yZSAqLwotCQlyZWcxID0gaW9yZWFkMzIoY3RsICsgMHgxMTAwMCk7Ci0JCXJlZzIgPSBpb3JlYWQzMihjdGwgKyAweGVjNTApOwotCQlyZWczID0gaW9yZWFkMzIoY3RsICsgMHhlYzU0KTsKLQkJd21iKCk7Ci0KLQkJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwMCwgMHhjZmRmKTsKLQkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCAweDcwKTsKLQkJLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzICovCi0JCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDAsIHJlZzEpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIHJlZzIpOwotCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIHJlZzMpOwotCQkvKiBEaXNhYmxlIFBvd2VyIFNhdmluZyBDb250cm9sICovCi0JCWRpc2FibGVfcG93ZXJfc2F2aW5nKHByaXYpOwotCX0gd2hpbGUgKDApOwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMCk7Ci19IC8qIGNhbGlicmF0ZV9vc2NpbGxhdG9yICovCi0KLQotc3RhdGljIHZvaWQgcmFkaW9fY2hhbm5lbF9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdW5zaWduZWQgaW50IGZyZXEgPSBwcml2LT5iYW5kLmNoYW5uZWxzW2NoYW5uZWwgLSAxXS5jZW50ZXJfZnJlcTsKLQl1MzIgcmVnOwotCUFHTlhfVFJBQ0U7Ci0KLQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKLQkvKiBTZXQgU1BJIENsb2NrIHRvIDUwIE5zICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOwotCXJlZyAmPSB+MHhGOwotCXJlZyB8PSAweDE7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOwotCi0JLyogQ2xlYXIgdGhlIERpc2FibGUgVHggaW50ZXJydXB0IGJpdCBpbiBJbnRlcnJ1cHQgTWFzayAqLwotLyogCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9JTlRfTUFTSyk7ICovCi0vKiAJcmVnICY9IH5JUlFfVFhfRElTQUJMRTsgKi8KLS8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0lOVF9NQVNLLCByZWcpOyAqLwotCi0JLyogQmFuZCBTZWxlY3Rpb24gKi8KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCk7Ci0JcmVnIHw9IDB4ODsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIHJlZyk7Ci0KLQkvKiBGSVhNRSBTZXQgdGhlIFNpTGFicyBDaGlwIEZyZXF1ZW5jeSAqLwotCXN5bnRoX2ZyZXFfc2V0KHByaXYsIGNoYW5uZWwpOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOwotCXJlZyB8PSAweDgwMTAwMDMwOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUExMQ1RMKTsKLQlyZWcgfD0gMHgyMDAwOTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BMTENUTCwgcmVnKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgMHg1KTsKLQotCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDExMDApOwotCi0JLyogTG9hZCB0aGUgTW9uaXRvckdhaW4gVGFibGUgKi8KLQltb25pdG9yX2dhaW5fdGFibGVfaW5pdChwcml2KTsKLQotCS8qIExvYWQgdGhlIFRYIEZpciB0YWJsZSAqLwotCXR4X2Zpcl90YWJsZV9pbml0KHByaXYpOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKLQlyZWcgfD0gMHg4OwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7Ci0KLQlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgyMik7Ci0JdWRlbGF5KDgwKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOwotCi0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4ZmYpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKLQotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKLQlyZWcgfD0gMHg0ZjsKLQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIHJlZyk7Ci0KLQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKLQlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA4LCAweDEpOwotCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMGMsIDB4MCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwOCwgMHgwKTsKLQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIDB4Yyk7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDB4Myk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOwotCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTAsIDB4NmUpOwotCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTQsIDB4NmMpOwotCi0Jc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7Ci0KLQkvKiBDYWxpYnJhdGUgdGhlIEFudGVubmEgKi8KLQkvKiBhbnRlbm5hX2NhbGlicmF0ZShwcml2KTsgKi8KLQkvKiBDYWxpYnJhdGUgdGhlIFR4TG9jYWxPc2NpbGxhdG9yICovCi0JY2FsaWJyYXRlX29zY2lsbGF0b3IocHJpdik7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOwotCXJlZyAmPSB+MHg4OwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTklOSVQsIDB4YSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDRCwgMHgwKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTgsIDB4Yik7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDApOwotCi0JLyogV3JpdGUgRnJlcXVlbmN5IHRvIEdhaW4gQ29udHJvbCBDaGFubmVsICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhDSEFORUwsIGZyZXEpOwotCS8qIFdyaXRlIDB4MTQwMDAwL0ZyZXEgdG8gMHg5YzA4ICovCi0JcmVnID0gMHgxNDAwMDAvZnJlcTsKLQlhZ254X3dyaXRlMzIoY3RsLCAweDljMDgsIHJlZyk7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fU09GVFJTVCk7Ci0JcmVnICY9IH4weDgwMTAwMDMwOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKLQotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOwotCXJlZyAmPSB+MHgyMDAwOTsKLQlyZWcgfD0gMHgxOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgwKTsKLQotLyogRklYTUUgQWNjb3JkaW5nIHRvIE51bWJlciBvZiBDaGFpbnM6ICovCi0KLS8qIAkJCSAgIDEuIDE6ICovCi0vKiAgICAgICAgICAxLiBXcml0ZSAweDEyMDMgdG8gUkYgQ2hpcCAwICovCi0vKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcHMgMSArMiAgKi8KLS8qIAkJCSAgIDIuIDI6ICovCi0vKiAgICAgICAgICAxLiBXcml0ZSAweDEyMDMgdG8gUkYgQ2hpcCAwICovCi0vKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcCAyICovCi0vKiAgICAgICAgICAzLiBXcml0ZSAweDEyMDEgdG8gUkYgQ2hpcCAxICAqLwotLyogCQkJICAgMy4gMzogKi8KLS8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKi8KLS8qICAgICAgICAgIDIuIFdyaXRlIDB4MTIwMSB0byBSRiBDaGlwIDEgKyAyICAqLwotLyogCQkJICAgNC4gNDogKi8KLS8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKyAxICovCi0vKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcCAyICAqLwotCi0vKiAJCQkgICA1LiA2OiAqLwotCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDMpOwotCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAyLCAweDEyMDEpOwotCi0Jc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwMCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOwotCi0JLyogRklYTUUgU2V0IHRoZSBEaXNhYmxlIFR4IGludGVycnVwdCBiaXQgaW4gSW50ZXJydXB0IE1hc2sKLQkgICAoT3IgMHgyMDAwMCB0byBJbnRlcnJ1cHQgTWFzaykgKi8KLS8qIAlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfSU5UX01BU0spOyAqLwotLyogCXJlZyB8PSBJUlFfVFhfRElTQUJMRTsgKi8KLS8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0lOVF9NQVNLLCByZWcpOyAqLwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOwotCi0JLyogQ29uZmlndXJlIHRoZSBBbnRlbm5hICovCi0JYW50ZW5uYV9jb25maWcocHJpdik7Ci0KLQkvKiBXcml0ZSAweDAgdG8gRGlzY292ZXJ5IE1vZGUgRW5hYmxlIGRldGVjdCBHLCBCLCBBIHBhY2tldD8gKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDApOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFKTsKLQlyZWcgfD0gMHg4MDAwMDAwMDsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCByZWcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgwKTsKLQotCS8qIGVuYWJsZSByYWRpbyBvbiBhbmQgdGhlIHBvd2VyIExFRCAqLwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VUKTsKLQlyZWcgJj0gfjB4MTsKLQlyZWcgfD0gMHgyOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgcmVnKTsKLQotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKLQlyZWcgfD0gMHgxOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKLX0gLyogcmFkaW9fY2hhbm5lbF9zZXQgKi8KLQotc3RhdGljIHZvaWQgYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQotCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDE3MDApOwotCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDEpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLLCAweDApOwotCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI3KTsKLQlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMSwgMHgyNyk7Ci0Jc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MjcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLLCAweDEpOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9vZmZzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIGNoYWluKQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiBvZmZzZXQ7Ci0KLQlpb3dyaXRlMzIoKGNoYWluKSwgY3RsICsgQUdOWF9BQ0lfU0VMQ0hBSU4pOwotCXVkZWxheSgxMCk7Ci0Jb2Zmc2V0ID0gKGlvcmVhZDMyKGN0bCArIEFHTlhfQUNJX09GRlNFVCkpOwotCXByaW50ayhQRlggIkNoYWluIGlzIDB4JXgsIE9mZnNldCBpcyAweCV4XG4iLCBjaGFpbiwgb2Zmc2V0KTsKLX0KLQotdm9pZCBwcmludF9vZmZzZXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0JcHJpbnRfb2Zmc2V0KHByaXYsIDApOwotCXByaW50X29mZnNldChwcml2LCA0KTsKLQlwcmludF9vZmZzZXQocHJpdiwgMSk7Ci0JcHJpbnRfb2Zmc2V0KHByaXYsIDUpOwotCXByaW50X29mZnNldChwcml2LCAyKTsKLQlwcmludF9vZmZzZXQocHJpdiwgNik7Ci19Ci0KLQotc3RydWN0IGNoYWlucyB7Ci0JdTMyIGNhbGk7CQkvKiBjYWxpYnJhdGUgIHZhbHVlKi8KLQotI2RlZmluZSAgTkVFRF9DQUxJQlJBVEUJCTAKLSNkZWZpbmUgIFNVQ0NFU1NfQ0FMSUJSQVRFCTEKLQlpbnQgc3RhdHVzOwotfTsKLQotc3RhdGljIHZvaWQgY2hhaW5fY2FsaWJyYXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBjaGFpbnMgKmNoYWlucywKLQkJCSAgICB1bnNpZ25lZCBpbnQgbnVtKQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiBjYWxpYnJhID0gY2hhaW5zW251bV0uY2FsaTsKLQotCWlmIChudW0gPCAzKQotCQljYWxpYnJhIHw9IDB4MTQwMDsKLQllbHNlCi0JCWNhbGlicmEgfD0gMHgxNTAwOwotCi0Jc3dpdGNoIChudW0pIHsKLQljYXNlIDA6Ci0JY2FzZSA0OgotCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgY2FsaWJyYSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQljYXNlIDU6Ci0JCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxLCBjYWxpYnJhKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCWNhc2UgNjoKLQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIGNhbGlicmEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci19IC8qIGNoYWluX2NhbGlicmF0ZSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2NhbGlicmV0ZV92YWx1ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgY2hhaW5zICpjaGFpbnMsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBudW0pCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTMyIG9mZnNldDsKLQotCWlvd3JpdGUzMigobnVtKSwgY3RsICsgQUdOWF9BQ0lfU0VMQ0hBSU4pOwotCS8qIEZJWE1FICovCi0JdWRlbGF5KDEwKTsKLQlvZmZzZXQgPSAoaW9yZWFkMzIoY3RsICsgQUdOWF9BQ0lfT0ZGU0VUKSk7Ci0KLQlpZiAob2Zmc2V0IDwgMHhmKSB7Ci0JCWNoYWluc1tudW1dLnN0YXR1cyA9IFNVQ0NFU1NfQ0FMSUJSQVRFOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG51bSA9PSAwIHx8IG51bSA9PSAxIHx8IG51bSA9PSAyKSB7Ci0JCWlmICgwID09IGNoYWluc1tudW1dLmNhbGkpCi0JCQljaGFpbnNbbnVtXS5jYWxpID0gMHhmZjsKLQkJZWxzZQotCQkJY2hhaW5zW251bV0uY2FsaS0tOwotCX0gZWxzZQotCQljaGFpbnNbbnVtXS5jYWxpKys7Ci0KLQljaGFpbnNbbnVtXS5zdGF0dXMgPSBORUVEX0NBTElCUkFURTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNhbGlicmFfZGVsYXkoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl1MzIgcmVnOwotCXVuc2lnbmVkIGludCBpID0gMTAwOwotCi0Jd21iKCk7Ci0Jd2hpbGUgKC0taSkgewotCQlyZWcgPSAoaW9yZWFkMzIoY3RsICsgQUdOWF9BQ0lfU1RBVFVTKSk7Ci0JCWlmIChyZWcgPT0gMHg0MDAwKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCWlmICghaSkKLQkJcHJpbnRrKFBGWCAiY2FsaWJyYXRpb24gZmFpbGVkXG4iKTsKLX0KLQotdm9pZCBkb19jYWxpYnJhdGlvbihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXN0cnVjdCBjaGFpbnMgY2hhaW5zWzddOwotCXVuc2lnbmVkIGludCBpLCBqOwotCUFHTlhfVFJBQ0U7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JCWlmIChpID09IDMpCi0JCQljb250aW51ZTsKLQotCQljaGFpbnNbaV0uY2FsaSA9IDB4N2Y7Ci0JCWNoYWluc1tpXS5zdGF0dXMgPSBORUVEX0NBTElCUkFURTsKLQl9Ci0KLQkvKiBGSVhNRSAweDMwMCBpcyBhIG1hZ2ljIG51bWJlciAqLwotCWZvciAoaiA9IDA7IGogPCAweDMwMDsgaisrKSB7Ci0JCWlmIChjaGFpbnNbMF0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCi0JCSAgICBjaGFpbnNbMV0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCi0JCSAgICBjaGFpbnNbMl0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCi0JCSAgICBjaGFpbnNbNF0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCi0JCSAgICBjaGFpbnNbNV0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCi0JCSAgICBjaGFpbnNbNl0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFKQotCQkJYnJlYWs7Ci0KLQkJLyogQXR0ZW50aW9uLCB0aGVyZSBpcyBubyBjaGFpbiAzICovCi0JCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKLQkJCWlmIChpID09IDMpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoY2hhaW5zW2ldLnN0YXR1cyA9PSBORUVEX0NBTElCUkFURSkKLQkJCQljaGFpbl9jYWxpYnJhdGUocHJpdiwgY2hhaW5zLCBpKTsKLQkJfQotCQkvKiBXcml0ZSAweDEgdG8gQ2FsaWJyYXRpb24gTWVhc3VyZSAqLwotCQlpb3dyaXRlMzIoKDB4MSksIGN0bCArIEFHTlhfQUNJX01FQVNVUkUpOwotCQljYWxpYnJhX2RlbGF5KHByaXYpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKLQkJCWlmIChpID09IDMpCi0JCQkJY29udGludWU7Ci0KLQkJCWdldF9jYWxpYnJldGVfdmFsdWUocHJpdiwgY2hhaW5zLCBpKTsKLQkJfQotCX0KLQlwcmludGsoUEZYICJDbGlicmF0ZSB0aW1lcyBpcyAlZFxuIiwgaik7Ci0JcHJpbnRfb2Zmc2V0cyhwcml2KTsKLX0gLyogZG9fY2FsaWJyYXRpb24gKi8KLQotdm9pZCBhbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0JQUdOWF9UUkFDRTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAweDMpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAweDMpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAweDMpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAweDMpOwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAweDFmKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9JTkFDVCwgMHgyNCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAweDIwKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMHg2NCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAweDY0KTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgMHg0Nik7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgMHgzYyk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAweDY0KTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDB4MzApOwotCi0Jc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjApOwotCS8qIEZpeG1lICovCi0JdWRlbGF5KDgwKTsKLQkvKiAgICAxLiBTaG91bGQgcmVhZCAweDAgICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKLQlpZiAoMHgwICE9IHJlZykKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOwotCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDApOwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOwotCi0Jc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjIpOwotCXVkZWxheSg4MCk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKLQlpZiAoMHgwICE9IHJlZykKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOwotCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDUpOwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOwotCXJlZyB8PSAweDFjMDAwMDMyOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUExMQ1RMKTsKLQlyZWcgfD0gMHgwMDAzZjA3OwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOwotCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjNTApOwotCXJlZyB8PSAweDQwOwotCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhmZjgpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NIQUlOTlVNLCAweDYpOwotCWFnbnhfd3JpdGUzMihjdGwsIDB4MTk4NzQsIDB4MCk7Ci0Jc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTcwMCk7Ci0KLQkvKiBDYWxpYnJhdGUgdGhlIEJhc2VCYW5kRmlsdGVyICovCi0JYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUocHJpdik7Ci0KLQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxMDAyKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCAweDFkKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgMHgxZCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDIsIDB4MWQpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgxKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4MSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjcpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7Ci0KLQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNDAwKTsKLQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNTAwKTsKLQotCS8qIE1lYXN1cmUgQ2FsaWJyYXRpb24gKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9NRUFTVVJFLCAweDEpOwotCWNhbGlicmFfZGVsYXkocHJpdik7Ci0KLQkvKiBkbyBjYWxpYnJhdGlvbiAqLwotCWRvX2NhbGlicmF0aW9uKHByaXYpOwotCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4Zik7Ci0KLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwKTsKLQlyZWcgJj0gMHhmOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCByZWcpOwotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEpOwotCXJlZyAmPSAweGY7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIHJlZyk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMik7Ci0JcmVnICY9IDB4ZjsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMiwgcmVnKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgwKTsKLQlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOwotfSAvKiBhbnRlbm5hX2NhbGlicmF0ZSAqLwotCi12b2lkIF9fYW50ZW5uYV9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl1MzIgcmVnOwotCi0JLyogQ2FsaWJyYXRlIHRoZSBCYXNlQmFuZEZpbHRlciAqLwotCS8qIGJhc2VfYmFuZF9maWx0ZXJfY2FsaWJyYXRlKHByaXYpOyAqLwotCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDIpOwotCi0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMCwgMHgxZCk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIDB4MWQpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCAweDFkKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgxKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4MSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7Ci0KLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyNyk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKLQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNDAwKTsKLQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNTAwKTsKLQkvKiBNZWFzdXJlIENhbGlicmF0aW9uICovCi0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTUVBU1VSRSwgMHgxKTsKLQljYWxpYnJhX2RlbGF5KHByaXYpOwotCWRvX2NhbGlicmF0aW9uKHByaXYpOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHgwKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKLQotCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDApOwotCXJlZyAmPSAweGY7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDAsIHJlZyk7Ci0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7Ci0JcmVnICY9IDB4ZjsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgcmVnKTsKLQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyKTsKLQlyZWcgJj0gMHhmOwotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCByZWcpOwotCi0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUV1JJVEUsIDB4MCk7Ci0KLQkvKiBXcml0ZSAweDMgR2FpbiBDb250cm9sIERpc2NvdmVyeSBNb2RlICovCi0JZW5hYmxlX3JlY2VpdmVyKHByaXYpOwotfQotCi1pbnQgYWdueF9zZXRfY2hhbm5lbChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlBR05YX1RSQUNFOwotCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2hhbm5lbCBpcyAlZCAlc1xuIiwgY2hhbm5lbCwgX19mdW5jX18pOwotCXJhZGlvX2NoYW5uZWxfc2V0KHByaXYsIGNoYW5uZWwpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3ZGI1ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgInBoeS5oIgotI2luY2x1ZGUgInN0YS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0KLXZvaWQgaGFzaF9yZWFkKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiByZWdoaSwgdTMyIHJlZ2xvLCB1OCBzdGFfaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0KLQlyZWdsbyAmPSAweEZGRkY7Ci0JcmVnbG8gfD0gMHgzMDAwMDAwMDsKLQlyZWdsbyB8PSAweDQwMDAwMDAwOwkvKiBTZXQgc3RhdHVzIGJ1c3kgKi8KLQlyZWdsbyB8PSBzdGFfaWQgPDwgMTY7Ci0KLQlpb3dyaXRlMzIoMCwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7Ci0JaW93cml0ZTMyKHJlZ2hpLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKLQlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7Ci0KLQlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOwotCXJlZ2xvID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKLQlwcmludGsoUEZYICJSWCBoYXNoIGNtZCBhcmUgOiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKLX0KLQotdm9pZCBoYXNoX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIGNvbnN0IHU4ICptYWNfYWRkciwgdTggc3RhX2lkKQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWdoaSwgcmVnbG87Ci0KLQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjX2FkZHIpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVXBkYXRlIGhhc2ggdGFibGU6IEludmFsaWQgaHdhZGRyIVxuIik7Ci0KLQlyZWdoaSA9IG1hY19hZGRyWzBdIDw8IDI0IHwgbWFjX2FkZHJbMV0gPDwgMTYgfCBtYWNfYWRkclsyXSA8PCA4IHwgbWFjX2FkZHJbM107Ci0JcmVnbG8gPSBtYWNfYWRkcls0XSA8PCA4IHwgbWFjX2FkZHJbNV07Ci0JcmVnbG8gfD0gMHgxMDAwMDAwMDsJLyogU2V0IGhhc2ggY29tbW1hbmQgKi8KLQlyZWdsbyB8PSAweDQwMDAwMDAwOwkvKiBTZXQgc3RhdHVzIGJ1c3kgKi8KLQlyZWdsbyB8PSBzdGFfaWQgPDwgMTY7Ci0KLQlpb3dyaXRlMzIoMCwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7Ci0JaW93cml0ZTMyKHJlZ2hpLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKLQlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7Ci0KLQlyZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7Ci0JaWYgKCEocmVnbG8gJiAweDgwMDAwMDAwKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVwZGF0ZSBoYXNoIHRhYmxlIGZhaWxlZFxuIik7Ci19Ci0KLXZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCkKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQotCXJlZ2xvICY9IDB4RkZGRjsKLQlyZWdsbyB8PSAweDIwMDAwMDAwOwotCXJlZ2xvIHw9IDB4NDAwMDAwMDA7CS8qIFNldCBzdGF0dXMgYnVzeSAqLwotCXJlZ2xvIHw9IHN0YV9pZCA8PCAxNjsKLQotCWlvd3JpdGUzMigwLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKLQlpb3dyaXRlMzIocmVnaGksIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOwotCWlvd3JpdGUzMihyZWdsbywgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKLQlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOwotCi0JcmVnbG8gPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOwotCXByaW50ayhQRlggIlJYIGhhc2ggY21kIGFyZSA6ICUuOHglLjh4XG4iLCByZWdoaSwgcmVnbG8pOwotCi19Ci0KLXZvaWQgaGFzaF9kdW1wKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl1MzIgcmVnaGksIHJlZ2xvOwotCi0JcmVnbG8gPSAweDQwMDAwMDAwOyAgCS8qIHN0YXR1cyBiaXQgKi8KLQlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7Ci0JaW93cml0ZTMyKHN0YV9pZCA8PCAxNiwgY3RsICsgQUdOWF9SWE1fSEFTSF9EVU1QX0RBVEEpOwotCi0JdWRlbGF5KDgwKTsKLQotCXJlZ2hpID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfSElHSCk7Ci0JcmVnbG8gPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOwotCXByaW50ayhQRlggImhhc2ggY21kIGFyZSA6ICUuOHglLjh4XG4iLCByZWdoaSwgcmVnbG8pOwotCXJlZ2hpID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7Ci0JcHJpbnRrKFBGWCAiaGFzaCBmbGFnIGlzIDogJS44eFxuIiwgcmVnaGkpOwotCXJlZ2hpID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9EVU1QX01TVCk7Ci0JcmVnbG8gPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0RVTVBfTFNUKTsKLQlwcmludGsoUEZYICJoYXNoIGR1bXAgbXN0IGxzdDogJS44eCUuOHhcbiIsIHJlZ2hpLCByZWdsbyk7Ci0JcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0RVTVBfREFUQSk7Ci0JcHJpbnRrKFBGWCAiaGFzaCBkdW1wIGRhdGE6ICUuOHhcbiIsIHJlZ2hpKTsKLX0KLQotdm9pZCBnZXRfc3RhX3Bvd2VyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV9wb3dlciAqcG93ZXIsIHVuc2lnbmVkIGludCBzdGFfaWR4KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCW1lbWNweV9mcm9taW8ocG93ZXIsIGN0bCArIEFHTlhfVFhNX1NUQVBPV1RFTVAgKyBzaXplb2YoKnBvd2VyKSAqIHN0YV9pZHgsCi0JCSAgICAgIHNpemVvZigqcG93ZXIpKTsKLX0KLQotaW5saW5lIHZvaWQKLXNldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwgdW5zaWduZWQgaW50IHN0YV9pZHgpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JLyogRklYTUUgICAyLiBXcml0ZSBUZW1wbGF0ZSB0byBvZmZzZXQgKyBzdGF0aW9uIG51bWJlciAgKi8KLQltZW1jcHlfdG9pbyhjdGwgKyBBR05YX1RYTV9TVEFQT1dURU1QICsgc2l6ZW9mKCpwb3dlcikgKiBzdGFfaWR4LAotCQkgICAgcG93ZXIsIHNpemVvZigqcG93ZXIpKTsKLX0KLQotCi12b2lkIGdldF9zdGFfdHhfd3Eoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3R4X3dxICp0eF93cSwKLQkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgsIHVuc2lnbmVkIGludCB3cV9pZHgpCi17Ci0Jdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKLQltZW1jcHlfZnJvbWlvKHR4X3dxLCBkYXRhICsgQUdOWF9QRFVfVFhfV1EgKyBzaXplb2YoKnR4X3dxKSAqIFNUQV9UWF9XUV9OVU0gKiBzdGFfaWR4ICsKLQkJICAgICAgc2l6ZW9mKCp0eF93cSkgKiB3cV9pZHgsICBzaXplb2YoKnR4X3dxKSk7Ci0KLX0KLQotaW5saW5lIHZvaWQgc2V0X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgKnR4X3dxLAotCQkgICB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCkKLXsKLQl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOwotCW1lbWNweV90b2lvKGRhdGEgKyBBR05YX1BEVV9UWF9XUSArIHNpemVvZigqdHhfd3EpICogU1RBX1RYX1dRX05VTSAqIHN0YV9pZHggKwotCQkgICAgc2l6ZW9mKCp0eF93cSkgKiB3cV9pZHgsIHR4X3dxLCBzaXplb2YoKnR4X3dxKSk7Ci19Ci0KLQotdm9pZCBnZXRfc3RhKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YSAqc3RhLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKLXsKLQl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOwotCi0JbWVtY3B5X2Zyb21pbyhzdGEsIGRhdGEgKyBBR05YX1BEVVBPT0wgKyBzaXplb2YoKnN0YSkgKiBzdGFfaWR4LAotCQkgICAgICBzaXplb2YoKnN0YSkpOwotfQotCi1pbmxpbmUgdm9pZCBzZXRfc3RhKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YSAqc3RhLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKLXsKLQl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOwotCi0JbWVtY3B5X3RvaW8oZGF0YSArIEFHTlhfUERVUE9PTCArIHNpemVvZigqc3RhKSAqIHN0YV9pZHgsCi0JCSAgICBzdGEsIHNpemVvZigqc3RhKSk7Ci19Ci0KLS8qIEZJWE1FICovCi12b2lkIHN0YV9wb3dlcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4KQotewotCXN0cnVjdCBhZ254X3N0YV9wb3dlciBwb3dlcjsKLQl1MzIgcmVnOwotCUFHTlhfVFJBQ0U7Ci0KLQltZW1zZXQoJnBvd2VyLCAwLCBzaXplb2YocG93ZXIpKTsKLQlyZWcgPSBhZ254X3NldF9iaXRzKEVEQ0YsIEVEQ0ZfU0hJRlQsIDB4MSk7Ci0JcG93ZXIucmVnID0gY3B1X3RvX2xlMzIocmVnKTsKLQlzZXRfc3RhX3Bvd2VyKHByaXYsICZwb3dlciwgc3RhX2lkeCk7Ci0JdWRlbGF5KDQwKTsKLX0gLyogYWRkX3Bvd2VyX3RlbXBsYXRlICovCi0KLQotLyogQG51bTogVGhlICNudW1iZXIgb2Ygc3RhdGlvbiB0aGF0IGlzIHZpc2libGUgdG8gdGhlIGNhcmQgKi8KLXN0YXRpYyB2b2lkIHN0YV90eF93b3JrcXVldWVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKLXsKLQlzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgdHhfd3E7Ci0JdTMyIHJlZzsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCW1lbXNldCgmdHhfd3EsIDAsIHNpemVvZih0eF93cSkpOwotCi0JcmVnID0gYWdueF9zZXRfYml0cyhXT1JLX1FVRVVFX1ZBTElELCBXT1JLX1FVRVVFX1ZBTElEX1NISUZULCAxKTsKLQlyZWcgfD0gYWdueF9zZXRfYml0cyhXT1JLX1FVRVVFX0FDS19UWVBFLCBXT1JLX1FVRVVFX0FDS19UWVBFX1NISUZULCAxKTsKLS8qCXJlZyB8PSBhZ254X3NldF9iaXRzKFdPUktfUVVFVUVfQUNLX1RZUEUsIFdPUktfUVVFVUVfQUNLX1RZUEVfU0hJRlQsIDApOyAqLwotCXR4X3dxLnJlZzIgfD0gY3B1X3RvX2xlMzIocmVnKTsKLQotCS8qIFN1cHBvc2UgYWxsIDggdHJhZmZpYyBjbGFzcyBhcmUgdXNlZCAqLwotCWZvciAoaSA9IDA7IGkgPCBTVEFfVFhfV1FfTlVNOyBpKyspCi0JCXNldF9zdGFfdHhfd3EocHJpdiwgJnR4X3dxLCBzdGFfaWR4LCBpKTsKLX0gLyogc3RhX3R4X3dvcmtxdWV1ZV9pbml0ICovCi0KLQotc3RhdGljIHZvaWQgc3RhX3RyYWZmaWNfaW5pdChzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyAqdHJhZmZpYykKLXsKLQl1MzIgcmVnOwotCW1lbXNldCh0cmFmZmljLCAwLCBzaXplb2YoKnRyYWZmaWMpKTsKLQotCXJlZyA9IGFnbnhfc2V0X2JpdHMoTkVXX1BBQ0tFVCwgTkVXX1BBQ0tFVF9TSElGVCwgMSk7Ci0JcmVnIHw9IGFnbnhfc2V0X2JpdHMoVFJBRkZJQ19WQUxJRCwgVFJBRkZJQ19WQUxJRF9TSElGVCwgMSk7Ci0vKglyZWcgfD0gYWdueF9zZXRfYml0cyhUUkFGRklDX0FDS19UWVBFLCBUUkFGRklDX0FDS19UWVBFX1NISUZULCAxKTsgKi8KLQl0cmFmZmljLT5yZWcwID0gY3B1X3RvX2xlMzIocmVnKTsKLQotCS8qIAkzLiBzZXR0aW5nIFJYIFNlcXVlbmNlIE51bWJlciB0byA0MDk1ICovCi0JcmVnID0gYWdueF9zZXRfYml0cyhSWF9TRVFVRU5DRV9OVU0sIFJYX1NFUVVFTkNFX05VTV9TSElGVCwgNDA5NSk7Ci0JdHJhZmZpYy0+cmVnMSA9IGNwdV90b19sZTMyKHJlZyk7Ci19Ci0KLQotLyogQG51bTogVGhlICNudW1iZXIgb2Ygc3RhdGlvbiB0aGF0IGlzIHZpc2libGUgdG8gdGhlIGNhcmQgKi8KLXZvaWQgc3RhX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCi17Ci0JLyogRklYTUUgdGhlIGxlbmd0aCBvZiBzdGEgaXMgMjU2IGJ5dGVzIElzIHRoYXQKLQkgKiBkYW5nZXJvdXMgdG8gc3RhY2sgb3ZlcmZsb3c/ICovCi0Jc3RydWN0IGFnbnhfc3RhIHN0YTsKLQl1MzIgcmVnOwotCWludCBpOwotCi0JbWVtc2V0KCZzdGEsIDAsIHNpemVvZihzdGEpKTsKLQkvKiBTZXQgdmFsaWQgdG8gMSAqLwotCXJlZyA9IGFnbnhfc2V0X2JpdHMoU1RBVElPTl9WQUxJRCwgU1RBVElPTl9WQUxJRF9TSElGVCwgMSk7Ci0JLyogU2V0IEVuYWJsZSBDb25jYXRlbmF0aW9uIHRvIDAgKD8pICovCi0JcmVnIHw9IGFnbnhfc2V0X2JpdHMoRU5BQkxFX0NPTkNBVEVOQVRJT04sIEVOQUJMRV9DT05DQVRFTkFUSU9OX1NISUZULCAwKTsKLQkvKiBTZXQgRW5hYmxlIERlY29tcHJlc3Npb24gdG8gMCAoPykgKi8KLQlyZWcgfD0gYWdueF9zZXRfYml0cyhFTkFCTEVfREVDT01QUkVTU0lPTiwgRU5BQkxFX0RFQ09NUFJFU1NJT05fU0hJRlQsIDApOwotCXN0YS5yZWcgPSBjcHVfdG9fbGUzMihyZWcpOwotCi0JLyogSW5pdGlhbGl6ZSBlYWNoIG9mIHRoZSBUcmFmZmljIENsYXNzIFN0cnVjdHVyZXMgYnk6ICovCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJc3RhX3RyYWZmaWNfaW5pdChzdGEudHJhZmZpYyArIGkpOwotCi0Jc2V0X3N0YShwcml2LCAmc3RhLCBzdGFfaWR4KTsKLQlzdGFfdHhfd29ya3F1ZXVlX2luaXQocHJpdiwgc3RhX2lkeCk7Ci19IC8qIHN0YV9kZXNjcmlwdG9yX2luaXQgKi8KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDUwNGUzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSNpZm5kZWYgQUdOWF9TVEFfSF8KLSNkZWZpbmUgQUdOWF9TVEFfSF8KLQotI2RlZmluZSBTVEFfVFhfV1FfTlVNCTgJLyogVGhlIG51bWJlciBvZiBUWCB3b3JrcXVldWUgb25lIFNUQSBoYXMgKi8KLQotc3RydWN0IGFnbnhfaGFzaF9jbWQgewotCV9fYmUzMiBjbWRoaTsKLSNkZWZpbmUgTUFDTE8JCTB4RkZGRjAwMDAKLSNkZWZpbmUgTUFDTE9fU0hJRlQJMTYKLSNkZWZpbmUgU1RBX0lECQkweDAwMDBGRkYwCi0jZGVmaW5lIFNUQV9JRF9TSElGVAk0Ci0jZGVmaW5lIENNRAkJMHgwMDAwMDAwQwotI2RlZmluZSBDTURfU0hJRlQJMgotI2RlZmluZSBTVEFUVVMJCTB4MDAwMDAwMDIKLSNkZWZpbmUgU1RBVFVTX1NISUZUCTEKLSNkZWZpbmUgUEFTUwkJMHgwMDAwMDAwMQotI2RlZmluZSBQQVNTX1NISUZUCTEKLQlfX2JlMzIgY21kbG87Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotCi0vKgotICogU3RhdGlvbiBQb3dlciBUZW1wbGF0ZQotICogRklYTUUgSnVzdCBmb3IgYWduMTAwIHlldAotICovCi1zdHJ1Y3QgYWdueF9zdGFfcG93ZXIgewotCV9fbGUzMiByZWc7Ci0jZGVmaW5lIFNJR05BTAkJCTB4MDAwMDAwRkYgLyogc2lnbmFsICovCi0jZGVmaW5lIFNJR05BTF9TSElGVAkJMAotI2RlZmluZSBSQVRFCQkJMHgwMDAwMEYwMAotI2RlZmluZSBSQVRFX1NISUZUCQk4Ci0jZGVmaW5lIFRJRlMJCQkweDAwMDAxMDAwCi0jZGVmaW5lIFRJRlNfU0hJRlQJCTEyCi0jZGVmaW5lIEVEQ0YJCQkweDAwMDAyMDAwCi0jZGVmaW5lIEVEQ0ZfU0hJRlQJCTEzCi0jZGVmaW5lIENIQU5ORUxfQk9ORAkJMHgwMDAwNDAwMAotI2RlZmluZSBDSEFOTkVMX0JPTkRfU0hJRlQJMTQKLSNkZWZpbmUgUEhZX01PREUJCTB4MDAwMzgwMDAKLSNkZWZpbmUgUEhZX01PREVfU0hJRlQJCTE1Ci0jZGVmaW5lIFBPV0VSX0xFVkVMCQkweDAwN0MwMDAwCi0jZGVmaW5lIFBPV0VSX0xFVkVMX1NISUZUCTE4Ci0jZGVmaW5lIE5VTV9UUkFOU01JVFRFUlMJMHgwMDgwMDAwMAotI2RlZmluZSBOVU1fVFJBTlNNSVRURVJTX1NISUZUCTIzCi19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotLyoKLSAqIFRYIFdvcmtxdWV1ZSBEZXNjcmlwdG9yCi0gKi8KLXN0cnVjdCBhZ254X3N0YV90eF93cSB7Ci0JX19sZTMyIHJlZzA7Ci0jZGVmaW5lIEhFQURfUE9JTlRFUl9MT1cJMHhGRjAwMDAwMCAvKiBIZWFkIHBvaW50ZXIgbG93ICovCi0jZGVmaW5lIEhFQURfUE9JTlRFUl9MT1dfU0hJRlQJMjQKLSNkZWZpbmUgVEFJTF9QT0lOVEVSCQkweDAwRkZGRkZGIC8qIFRhaWwgcG9pbnRlciAqLwotI2RlZmluZSBUQUlMX1BPSU5URVJfU0hJRlQJMAotCi0JX19sZTMyIHJlZzM7Ci0jZGVmaW5lIEFDS19QT0lOVEVSX0xPVwkgICAgICAgIDB4RkZGRjAwMDAJLyogQUNLIHBvaW50ZXIgbG93ICovCi0jZGVmaW5lIEFDS19QT0lOVEVSX0xPV19TSElGVAkxNgotI2RlZmluZSBIRUFEX1BPSU5URVJfSElHSAkweDAwMDBGRkZGCS8qIEhlYWQgcG9pbnRlciBoaWdoICovCi0jZGVmaW5lIEhFQURfUE9JTlRFUl9ISUdIX1NISUZUCTAKLQotCV9fbGUzMiByZWcxOwotLyogQUNLIHRpbWVvdXQgdGFpbCBwYWNrZXQgY291bnQgKi8KLSNkZWZpbmUgQUNLX1RJTU9VVF9UQUlMX1BBQ0tfQ05UCTB4RkZGMDAwMDAKLSNkZWZpbmUgQUNLX1RJTU9VVF9UQUlMX1BBQ0tfQ05UX1NISUZUCTIwCi0vKiBIZWFkIHRpbWVvdXQgdGFpbCBwYWNrZXQgY291bnQgKi8KLSNkZWZpbmUgSEVBRF9USU1PVVRfVEFJTF9QQUNLX0NOVAkweDAwMEZGRjAwCi0jZGVmaW5lIEhFQURfVElNT1VUX1RBSUxfUEFDS19DTlRfU0hJRlQJOAotI2RlZmluZSBBQ0tfUE9JTlRFUl9ISUdICSAgICAgICAgMHgwMDAwMDBGRiAvKiBBQ0sgcG9pbnRlciBoaWdoICovCi0jZGVmaW5lIEFDS19QT0lOVEVSX0hJR0hfU0hJRlQJCTAKLQotCV9fbGUzMiByZWcyOwotI2RlZmluZSBXT1JLX1FVRVVFX1ZBTElECQkweDgwMDAwMDAwIC8qIHZhbGlkICovCi0jZGVmaW5lIFdPUktfUVVFVUVfVkFMSURfU0hJRlQJCTMxCi0jZGVmaW5lIFdPUktfUVVFVUVfQUNLX1RZUEUJCTB4NDAwMDAwMDAgLyogQUNLIHR5cGUgKi8KLSNkZWZpbmUgV09SS19RVUVVRV9BQ0tfVFlQRV9TSElGVAkzMAotLyogSGVhZCB0aW1lb3V0IHdpbmRvdyBsaW1pdCBmcmFnbWVudGF0aW9uIGNvdW50ICovCi0jZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fRlJBR19DTlQJMHgzRkZGMDAwMAotI2RlZmluZSBIRUFEX1RJTU9VVF9XSU5fTElNX0ZSQUdfQ05UX1NISUZUCTE2Ci0vKiBIZWFkIHRpbWVvdXQgd2luZG93IGxpbWl0IGJ5dGUgY291bnQgKi8KLSNkZWZpbmUgSEVBRF9USU1PVVRfV0lOX0xJTV9CWVRFX0NOVAkweDAwMDBGRkZGCi0jZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fQllURV9DTlRfU0hJRlQJIDAKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0KLS8qCi0gKiBUcmFmZmljIENsYXNzIFN0cnVjdHVyZQotICovCi1zdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyB7Ci0JX19sZTMyIHJlZzA7Ci0jZGVmaW5lIEFDS19USU1PVVRfQ05UCQkweEZGODAwMDAwIC8qIEFDSyBUaW1lb3V0IENvdW50cyAqLwotI2RlZmluZSBBQ0tfVElNT1VUX0NOVF9TSElGVAkyMwotI2RlZmluZSBUUkFGRklDX0FDS19UWVBFCTB4MDA2MDAwMDAgLyogQUNLIFR5cGUgKi8KLSNkZWZpbmUgVFJBRkZJQ19BQ0tfVFlQRV9TSElGVAkyMQotI2RlZmluZSBORVdfUEFDS0VUCQkweDAwMTAwMDAwIC8qIE5ldyBQYWNrZXQgICovCi0jZGVmaW5lIE5FV19QQUNLRVRfU0hJRlQJMjAKLSNkZWZpbmUgVFJBRkZJQ19WQUxJRAkJMHgwMDA4MDAwMCAvKiBWYWxpZCAqLwotI2RlZmluZSBUUkFGRklDX1ZBTElEX1NISUZUCTE5Ci0jZGVmaW5lIFJYX0hEUl9ERVNDX1BPSU5URVIJMHgwMDA3RkZGRiAvKiBSWCBIZWFkZXIgRGVzY3JpcHRlciBwb2ludGVyICovCi0jZGVmaW5lIFJYX0hEUl9ERVNDX1BPSU5URVJfU0hJRlQJIDAKLQotCV9fbGUzMiByZWcxOwotI2RlZmluZSBSWF9QQUNLRVRfVElNRVNUQU1QCTB4RkZGRjAwMDAgLyogUlggUGFja2V0IFRpbWVzdGFtcCAqLwotI2RlZmluZSBSWF9QQUNLRVRfVElNRVNUQU1QX1NISUZUCTE2Ci0jZGVmaW5lIFRSQUZGSUNfUkVTRVJWRUQJMHgwMDAwRTAwMCAvKiBSZXNlcnZlZCAqLwotI2RlZmluZSBUUkFGRklDX1JFU0VSVkVEX1NISUZUICAxMwotI2RlZmluZSBTVgkJCTB4MDAwMDEwMDAgLyogc3YgKi8KLSNkZWZpbmUgU1ZfU0hJRlQJCTEyCi0jZGVmaW5lIFJYX1NFUVVFTkNFX05VTQkJMHgwMDAwMEZGRiAvKiBSWCBTZXF1ZW5jZSBOdW1iZXIgKi8KLSNkZWZpbmUgUlhfU0VRVUVOQ0VfTlVNX1NISUZUCTAKLQotCV9fbGUzMiB0eF9yZXBsYXlfY250X2xvdzsgLyogVFggUmVwbGF5IENvdW50ZXIgTG93ICovCi0KLQlfX2xlMTYgdHhfcmVwbGF5X2NudF9oaWdoOyAvKiBUWCBSZXBsYXkgQ291bnRlciBIaWdoICovCi0JX19sZTE2IHJ4X3JlcGxheV9jbnRfaGlnaDsgLyogUlggUmVwbGF5IENvdW50ZXIgSGlnaCAqLwotCi0JX19iZTMyIHJ4X3JlcGxheV9jbnRfbG93OyAvKiBSWCBSZXBsYXkgQ291bnRlciBMb3cgKi8KLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0vKgotICogU3RhdGlvbiBEZXNjcmlwdG9ycwotICovCi1zdHJ1Y3QgYWdueF9zdGEgewotCV9fbGUzMiB0eF9zZXNzaW9uX2tleXNbNF07IC8qIFRyYW5zbWl0IFNlc3Npb24gS2V5ICgwLTMpICovCi0JX19sZTMyIHJ4X3Nlc3Npb25fa2V5c1s0XTsgLyogUmVjZWl2ZSBTZXNzaW9uIEtleSAoMC0zKSAqLwotCi0JX19sZTMyIHJlZzsKLSNkZWZpbmUgSURfMQkJCTB4QzAwMDAwMDAgLyogaWQgMSAqLwotI2RlZmluZSBJRF8xX1NISUZUCQkzMAotI2RlZmluZSBJRF8wCQkJMHgzMDAwMDAwMCAvKiBpZCAwICovCi0jZGVmaW5lIElEXzBfU0hJRlQJCTI4Ci0jZGVmaW5lIEVOQUJMRV9DT05DQVRFTkFUSU9OCTB4MEZGMDAwMDAgLyogRW5hYmxlIGNvbmNhdGVuYXRpb24gKi8KLSNkZWZpbmUgRU5BQkxFX0NPTkNBVEVOQVRJT05fU0hJRlQJMjAKLSNkZWZpbmUgRU5BQkxFX0RFQ09NUFJFU1NJT04JMHgwMDBGRjAwMCAvKiBFbmFibGUgZGVjb21wcmVzc2lvbiAqLwotI2RlZmluZSBFTkFCTEVfREVDT01QUkVTU0lPTl9TSElGVAkxMgotI2RlZmluZSBTVEFfUkVTRVJWRUQJCTB4MDAwMDBDMDAgLyogUmVzZXJ2ZWQgKi8KLSNkZWZpbmUgU1RBX1JFU0VSVkVEX1NISUZUCTEwCi0jZGVmaW5lIEVBUAkJCTB4MDAwMDAyMDAgLyogRUFQICovCi0jZGVmaW5lIEVBUF9TSElGVAkJOQotI2RlZmluZSBFRF9OVUxMCQkJMHgwMDAwMDEwMCAvKiBFRCBOVUxMICovCi0jZGVmaW5lIEVEX05VTExfU0hJRlQJCTgKLSNkZWZpbmUgRU5DUllQVElPTl9QT0xJQ1kJMHgwMDAwMDBFMCAvKiBFbmNyeXB0aW9uIFBvbGljeSAqLwotI2RlZmluZSBFTkNSWVBUSU9OX1BPTElDWV9TSElGVCA1Ci0jZGVmaW5lIERFRklORURfS0VZX0lECQkweDAwMDAwMDE4IC8qIERlZmluZWQgS2V5IElEICovCi0jZGVmaW5lIERFRklORURfS0VZX0lEX1NISUZUCTMKLSNkZWZpbmUgRklYRURfS0VZCQkweDAwMDAwMDA0IC8qIEZpeGVkIEtleSAqLwotI2RlZmluZSBGSVhFRF9LRVlfU0hJRlQJCTIKLSNkZWZpbmUgS0VZX1ZBTElECQkweDAwMDAwMDAyIC8qIEtleSBWYWxpZCAqLwotI2RlZmluZSBLRVlfVkFMSURfU0hJRlQJCTEKLSNkZWZpbmUgU1RBVElPTl9WQUxJRAkJMHgwMDAwMDAwMSAvKiBTdGF0aW9uIFZhbGlkICovCi0jZGVmaW5lIFNUQVRJT05fVkFMSURfU0hJRlQJMAotCi0JX19sZTMyIHR4X2Flc19ibGtzX3VuaWNhc3Q7IC8qIFRYIEFFUyBCbGtzIFVuaWNhc3QgKi8KLQlfX2xlMzIgcnhfYWVzX2Jsa3NfdW5pY2FzdDsgLyogUlggQUVTIEJsa3MgVW5pY2FzdCAqLwotCi0JX19sZTE2IGFlc19mb3JtYXRfZXJyX3VuaWNhc3RfY250OyAvKiBBRVMgRm9ybWF0IEVycm9yIFVuaWNhc3QgQ291bnRzICovCi0JX19sZTE2IGFlc19yZXBsYXlfdW5pY2FzdDsgLyogQUVTIFJlcGxheSBVbmljYXN0ICovCi0KLQlfX2xlMTYgYWVzX2RlY3J5cHRfZXJyX3VuaWNhc3Q7CS8qIEFFUyBEZWNyeXB0IEVycm9yIFVuaWNhc3QgKi8KLQlfX2xlMTYgYWVzX2RlY3J5cHRfZXJyX2RlZmF1bHQ7CS8qIEFFUyBEZWNyeXB0IEVycm9yIGRlZmF1bHQgKi8KLQotCV9fbGUxNiBzaW5nbGVfcmV0cnlfcGFja2V0czsgLyogU2luZ2xlIFJldHJ5IFBhY2tldHMgKi8KLQlfX2xlMTYgZmFpbGVkX3R4X3BhY2tldHM7IC8qIEZhaWxlZCBUeCBQYWNrZXRzICovCi0KLQlfX2xlMTYgbXV0aV9yZXRyeV9wYWNrZXRzOyAvKiBNdWx0aXBsZSBSZXRyeSBQYWNrZXRzICovCi0JX19sZTE2IGFja190aW1lb3V0czsJLyogQUNLIFRpbWVvdXRzICovCi0KLQlfX2xlMTYgZnJhZ190eF9jbnQ7CS8qIEZyYWdtZW50IFRYIENvdW50cyAqLwotCV9fbGUxNiBydHNfYnJxX3NlbnQ7CS8qIFJUUyBCcnEgU2VudCAqLwotCi0JX19sZTE2IHR4X3BhY2tldHM7CS8qIFRYIFBhY2tldHMgKi8KLQlfX2xlMTYgY3RzX2JhY2tfdGltZW91dDsgLyogQ1RTIEJhY2sgVGltZW91dCAqLwotCi0JX19sZTMyIHBoeV9zdGF0c19oaWdoOwkvKiBQSFkgU3RhdHMgSGlnaCAqLwotCV9fbGUzMiBwaHlfc3RhdHNfbG93OwkvKiBQSFkgU3RhdHMgTG93ICovCi0KLQlzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyB0cmFmZmljWzhdOwkvKiBUcmFmZmljIENsYXNzIFN0cnVjdHVyZSAoOCkgKi8KLQotCV9fbGUxNiB0cmFmZmljX2NsYXNzMF9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMCBGcmFnbWVudCBTdWNjZXNzICovCi0JX19sZTE2IHRyYWZmaWNfY2xhc3MxX2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyAxIEZyYWdtZW50IFN1Y2Nlc3MgKi8KLQlfX2xlMTYgdHJhZmZpY19jbGFzczJfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDIgRnJhZ21lbnQgU3VjY2VzcyAqLwotCV9fbGUxNiB0cmFmZmljX2NsYXNzM19mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMyBGcmFnbWVudCBTdWNjZXNzICovCi0JX19sZTE2IHRyYWZmaWNfY2xhc3M0X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA0IEZyYWdtZW50IFN1Y2Nlc3MgKi8KLQlfX2xlMTYgdHJhZmZpY19jbGFzczVfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDUgRnJhZ21lbnQgU3VjY2VzcyAqLwotCV9fbGUxNiB0cmFmZmljX2NsYXNzNl9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgNiBGcmFnbWVudCBTdWNjZXNzICovCi0JX19sZTE2IHRyYWZmaWNfY2xhc3M3X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA3IEZyYWdtZW50IFN1Y2Nlc3MgKi8KLQotCV9fbGUxNiBudW1fZnJhZ19ub25fcHJpbWVfcmF0ZXM7IC8qIG51bWJlciBvZiBGcmFnbWVudHMgZm9yIG5vbi1wcmltZSByYXRlcyAqLwotCV9fbGUxNiBhY2tfdGltZW91dF9ub25fcHJpbWVfcmF0ZXM7IC8qIEFDSyBUaW1lb3V0IGZvciBub24tcHJpbWUgcmF0ZXMgKi8KLQotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLQotc3RydWN0IGFnbnhfYmVhY29uX2hkciB7Ci0Jc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOyAvKiBUeCBTdGF0aW9uIFBvd2VyIFRlbXBsYXRlICAqLwotCXU4IHBoeV9oZHJbNl07CQkvKiBQSFkgSGRyICovCi0JdTggZnJhbWVfbGVuX2xvOwkvKiBGcmFtZSBMZW5ndGggTG8gKi8KLQl1OCBmcmFtZV9sZW5faGk7CS8qIEZyYW1lIExlbmd0aCBIaSAqLwotCXU4IG1hY19oZHJbMjRdOwkJLyogTUFDIEhlYWRlciAqLwotCS8qIEZJWE1FICovCi0JLyogODAyLjExKGFiZykgYmVhY29uICovCi19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotdm9pZCBoYXNoX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIGNvbnN0IHU4ICptYWNfYWRkciwgdTggc3RhX2lkKTsKLXZvaWQgaGFzaF9kdW1wKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4IHN0YV9pZCk7Ci12b2lkIGhhc2hfcmVhZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgcmVnaGksIHUzMiByZWdsbywgdTggc3RhX2lkKTsKLXZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCk7Ci0KLXZvaWQgZ2V0X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgKnBvd2VyLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCk7Ci12b2lkIHNldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwKLQkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgpOwotdm9pZCBnZXRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV90eF93cSAqdHhfd3EsCi0JCSAgIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KTsKLXZvaWQgc2V0X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgKnR4X3dxLAotCQkgICB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCk7Ci12b2lkIGdldF9zdGEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhICpzdGEsIHVuc2lnbmVkIGludCBzdGFfaWR4KTsKLXZvaWQgc2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpOwotCi12b2lkIHN0YV9wb3dlcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBudW0pOwotdm9pZCBzdGFfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgbnVtKTsKLQotI2VuZGlmIC8qIEFHTlhfU1RBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvdGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyZmVmOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgImFnbnguaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInBoeS5oIgotCi1zdGF0aWMgY29uc3QgdTMyCi10eF9maXJfdGFibGVbXSA9IHsgMHgxOSwgMHg1ZCwgMHhjZSwgMHgxNTEsIDB4MWMzLCAweDFmZiwgMHgxZWEsIDB4MTdjLCAweGNmLAotCQkgICAweDE5LCAweDM4ZSwgMHgzNTAsIDB4MzYyLCAweDNhZCwgMHg1LCAweDQ0LCAweDU5LCAweDQ5LAotCQkgICAweDIxLCAweDNmNywgMHgzZTAsIDB4M2UzLCAweDNmMywgMHgwIH07Ci0KLXZvaWQgdHhfZmlyX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR4X2Zpcl90YWJsZSk7IGkrKykKLQkJaW93cml0ZTMyKHR4X2Zpcl90YWJsZVtpXSwgY3RsICsgQUdOWF9GSVJfQkFTRSArIGkqNCk7Ci19IC8qIGZpcl90YWJsZV9zZXR1cCAqLwotCi0KLXN0YXRpYyBjb25zdCB1MzIKLWdhaW5fdGFibGVbXSA9IHsgMHg4LCAweDgsIDB4ZiwgMHgxMywgMHgxNywgMHgxYiwgMHgxZiwgMHgyMywgMHgyNywgMHgyYiwKLQkJIDB4MmYsIDB4MzMsIDB4MzcsIDB4M2IsIDB4M2YsIDB4NDMsIDB4NDcsIDB4NGIsIDB4NGYsCi0JCSAweDUzLCAweDU3LCAweDViLCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLAotCQkgMHg1ZiwgMHg1ZiwgMHg1ZiwgMHg1ZiB9OwotCi12b2lkIGdhaW5fdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ2Fpbl90YWJsZSk7IGkrKykgewotCQlpb3dyaXRlMzIoZ2Fpbl90YWJsZVtpXSwgY3RsICsgQUdOWF9HQUlOX1RBQkxFICsgaSo0KTsKLQkJaW93cml0ZTMyKGdhaW5fdGFibGVbaV0sIGN0bCArIEFHTlhfR0FJTl9UQUJMRSArIGkqNCArIDB4ODApOwotCX0KLX0gLyogZ2Fpbl90YWJsZV9pbml0ICovCi0KLXZvaWQgbW9uaXRvcl9nYWluX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAweDQ0OyBpICs9IDQpIHsKLQkJaW93cml0ZTMyKDB4NjEsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKLQkJaW93cml0ZTMyKDB4NjEsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOwotCX0KLQlmb3IgKGkgPSAweDQ0OyBpIDwgMHg2NDsgaSArPSA0KSB7Ci0JCWlvd3JpdGUzMigweDZlLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7Ci0JCWlvd3JpdGUzMigweDZlLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKLQl9Ci0JZm9yIChpID0gMHg2NDsgaSA8IDB4OTQ7IGkgKz0gNCkgewotCQlpb3dyaXRlMzIoMHg3YSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOwotCQlpb3dyaXRlMzIoMHg3YSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7Ci0JfQotCWZvciAoaSA9IDB4OTQ7IGkgPCAweGRjOyBpICs9IDQpIHsKLQkJaW93cml0ZTMyKDB4ODcsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKLQkJaW93cml0ZTMyKDB4ODcsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOwotCX0KLQlmb3IgKGkgPSAweGRjOyBpIDwgMHgxNDg7IGkgKz0gNCkgewotCQlpb3dyaXRlMzIoMHg5NSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOwotCQlpb3dyaXRlMzIoMHg5NSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7Ci0JfQotCWZvciAoaSA9IDB4MTQ4OyBpIDwgMHgxZTg7IGkgKz0gNCkgewotCQlpb3dyaXRlMzIoMHhhMiwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOwotCQlpb3dyaXRlMzIoMHhhMiwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7Ci0JfQotCWZvciAoaSA9IDB4MWU4OyBpIDw9IDB4MWZjOyBpICs9IDQpIHsKLQkJaW93cml0ZTMyKDB4YjAsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKLQkJaW93cml0ZTMyKDB4YjAsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOwotCX0KLX0gLyogbW9uaXRvcl9nYWluX3RhYmxlX2luaXQgKi8KLQotCi12b2lkIHJvdXRpbmdfdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXVuc2lnbmVkIGludCB0eXBlLCBzdWJ0eXBlOwotCXUzMiByZWc7Ci0KLQlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOwotCi0JZm9yICh0eXBlID0gMDsgdHlwZSA8IDB4MzsgdHlwZSsrKSB7Ci0JCWZvciAoc3VidHlwZSA9IDA7IHN1YnR5cGUgPCAweDEwOyBzdWJ0eXBlKyspIHsKLQkJCS8qIDEuIFNldCBSb3V0aW5nIHRhYmxlIHRvIFIvVyBhbmQgdG8gUmV0dXJuIHN0YXR1cyBvbiBSZWFkICovCi0JCQlyZWcgPSAodHlwZSA8PCBST1VUQUJfVFlQRV9TSElGVCkgfAotCQkJCShzdWJ0eXBlIDw8IFJPVVRBQl9TVUJUWVBFX1NISUZUKTsKLQkJCXJlZyB8PSAoMSA8PCBST1VUQUJfUldfU0hJRlQpIHwgKDEgPDwgUk9VVEFCX1NUQVRVU19TSElGVCk7Ci0JCQlpZiAodHlwZSA9PSBST1VUQUJfVFlQRV9EQVRBKSB7Ci0JCQkJLyogTlVMTCBnb2VzIHRvIFJGUCAqLwotCQkJCWlmIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTEwpCi0vKgkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9SRlA7ICovCi0JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfQ1BVOwotCQkJCS8qIFFPUyBOVUxMIGdvZXMgdG8gQ1BVICovCi0JCQkJZWxzZSBpZiAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NOVUxMKQotCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0NQVTsKLQkJCQkvKiBBbGwgRGF0YSBhbmQgUU9TIGRhdGEgc3VidHlwZXMgZ28gdG8gRW5jcnlwdGlvbiAqLwotCQkJCWVsc2UgaWYgKChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX0RBVEEpIHx8Ci0JCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9EQVRBQUNLKSB8fAotCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfREFUQVBPTEwpIHx8Ci0JCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9EQVRBUE9MTEFDSykgfHwKLQkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX1FPU0RBVEEpIHx8Ci0JCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NEQVRBQUNLKSB8fAotCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TREFUQVBPTEwpIHx8Ci0JCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NEQVRBQUNLUE9MTCkpCi0JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfRU5DUlk7Ci0vKgkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9DUFU7ICovCi0JCQkJLypEcm9wIE5VTEwgYW5kIFFPUyBOVUxMIGFjaywgcG9sbCBhbmQgcG9sbCBhY2sqLwotCQkJCWVsc2UgaWYgKChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTExBQ0spIHx8Ci0JCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NOVUxMQUNLKSB8fAotCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfTlVMTFBPTEwpIHx8Ci0JCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NOVUxMUE9MTCkgfHwKLQkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTExQT0xMQUNLKSB8fAotCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTFBPTExBQ0spKQotLyoJCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfRFJPUDsgKi8KLQkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9DUFU7Ci0JCQl9IGVsc2UgewotCQkJCXJlZyB8PSAoUk9VVEFCX1JPVVRFX0NQVSk7Ci0JCQl9Ci0JCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX1JYTV9ST1VUQUIpOwotCQkJLyogQ2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIHN0YXR1cyBiaXQgY2xlYXJlZCAqLwotCQkJcm91dGluZ190YWJsZV9kZWxheSgpOwotCQl9Ci0JfQotCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKLX0gLyogcm91dGluZ190YWJsZV9pbml0ICovCi0KLXZvaWQgdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IDI4OyBpICs9IDQpCi0JCWlvd3JpdGUzMigweGIwMGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7Ci0JZm9yIChpID0gMzI7IGkgPD0gMTIwOyBpICs9IDgpIHsKLQkJaW93cml0ZTMyKDB4MWU1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKLQkJaW93cml0ZTMyKDB4YjAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7Ci0JfQotCi0JZm9yIChpID0gMTI4OyBpIDw9IDE1NjsgaSArPSA0KQotCQlpb3dyaXRlMzIoMHg5ODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOwotCWZvciAoaSA9IDE2MDsgaSA8PSAyNDg7IGkgKz0gOCkgewotCQlpb3dyaXRlMzIoMHgxODU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOwotCQlpb3dyaXRlMzIoMHg5ODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKLQl9Ci0KLQlmb3IgKGkgPSAyNTY7IGkgPD0gMjg0OyBpICs9IDQpCi0JCWlvd3JpdGUzMigweDk4MGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7Ci0JZm9yIChpID0gMjg4OyBpIDw9IDM3NjsgaSArPSA4KSB7Ci0JCWlvd3JpdGUzMigweDFhNTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7Ci0JCWlvd3JpdGUzMigweDE4NTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSArIDQpOwotCX0KLQotCWZvciAoaSA9IDUxMjsgaSA8PSA1NDA7IGkgKz0gNCkKLQkJaW93cml0ZTMyKDB4YzAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKLQlmb3IgKGkgPSA1NDQ7IGkgPD0gNjMyOyBpICs9IDgpIHsKLQkJaW93cml0ZTMyKDB4MjA1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKLQkJaW93cml0ZTMyKDB4YzAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7Ci0JfQotCi0JZm9yIChpID0gNjQwOyBpIDw9IDY2ODsgaSArPSA0KQotCQlpb3dyaXRlMzIoMHhjODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOwotCWZvciAoaSA9IDY3MjsgaSA8PSA3NjQ7IGkgKz0gOCkgewotCQlpb3dyaXRlMzIoMHgyMjU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOwotCQlpb3dyaXRlMzIoMHhjODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3RhYmxlLmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDYyNmI1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZuZGVmIEFHTlhfVEFCTEVfSF8KLSNkZWZpbmUgQUdOWF9UQUJMRV9IXwotCi12b2lkIHR4X2Zpcl90YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwotdm9pZCBnYWluX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci12b2lkIG1vbml0b3JfZ2Fpbl90YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwotdm9pZCByb3V0aW5nX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci12b2lkIHR4X2VuZ2luZV9sb29rdXBfdGJsX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci0KLSNlbmRpZiAvKiBBR05YX1RBQkxFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZGI0MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FnbngveG1pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODM2ICswLDAgQEAKLS8qKgotICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KLQotICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCi0gKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCi0KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSAiYWdueC5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAicGh5LmgiCi0KLXVuc2lnbmVkIGludCByeF9mcmFtZV9jbnQ7Ci0vKiB1bnNpZ25lZCBpbnQgbG9jYWxfdHhfc2VudF9jbnQgPSAwOyAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9yeF9lbmdpbmUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQlpb3dyaXRlMzIoMHgxMDAsIGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKLQkvKiBXYWl0IGZvciBSWCBDb250cm9sIHRvIGhhdmUgdGhlIERpc2FibGUgUnggSW50ZXJydXB0ICgweDEwMCkgc2V0ICovCi0JaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDVEwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX3J4X2VuZ2luZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCWlvd3JpdGUzMigweDgwLCBjdGwgKyBBR05YX0NJUl9SWENUTCk7Ci0JaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDVEwpOwotfQotCi1pbmxpbmUgdm9pZCBkaXNhYmxlX3J4X2ludGVycnVwdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0KLQlkaXNhYmxlX3J4X2VuZ2luZShwcml2KTsKLQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9SWENGRyk7Ci0JcmVnICY9IH4weDIwOwotCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfQ0lSX1JYQ0ZHKTsKLQlpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9SWENGRyk7Ci19Ci0KLWlubGluZSB2b2lkIGVuYWJsZV9yeF9pbnRlcnJ1cHQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKLQl1MzIgcmVnOwotCi0JcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOwotCXJlZyB8PSAweDIwOwotCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfQ0lSX1JYQ0ZHKTsKLQlpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9SWENGRyk7Ci0JZW5hYmxlX3J4X2VuZ2luZShwcml2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJ4X2Rlc2NfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQotewotCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT5yeC5kZXNjICsgaWR4OwotCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT5yeC5pbmZvICsgaWR4OwotCi0JbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwotCi0JaW5mby0+ZG1hX2xlbiA9IElFRUU4MDIxMV9NQVhfUlRTX1RIUkVTSE9MRCArIHNpemVvZihzdHJ1Y3QgYWdueF9oZHIpOwotCWluZm8tPnNrYiA9IGRldl9hbGxvY19za2IoaW5mby0+ZG1hX2xlbik7Ci0JaWYgKGluZm8tPnNrYiA9PSBOVUxMKQotCQlhZ254X2J1ZygicmVmaWxsIGVyciIpOwotCi0JaW5mby0+bWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYl90YWlsX3BvaW50ZXIoaW5mby0+c2tiKSwKLQkJCQkgICAgICAgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7Ci0JZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihpbmZvLT5tYXBwaW5nKTsKLQkvKiBTZXQgdGhlIG93bmVyIHRvIHRoZSBjYXJkICovCi0JZGVzYy0+ZnJhZyA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpIHwgT1dORVIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhfZGVzY19yZWluaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGlkeCkKLXsKLQlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+cnguaW5mbyArIGlkeDsKLQotCS8qIENhdXNlIGllZWU4MDIxMSB3aWxsIGZyZWUgdGhlIHNrYiBidWZmZXIsIHNvIHdlIG5lZWRuJ3QgdG8gZnJlZSBpdCBhZ2Fpbj8hICovCi0JcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LCBpbmZvLT5tYXBwaW5nLCBpbmZvLT5kbWFfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCXJ4X2Rlc2NfaW5pdChwcml2LCBpZHgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhfZGVzY19yZXVzaW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCi17Ci0Jc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnJ4LmRlc2MgKyBpZHg7Ci0Jc3RydWN0IGFnbnhfaW5mbyAqaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpZHg7Ci0KLQltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7Ci0JZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihpbmZvLT5tYXBwaW5nKTsKLQkvKiBTZXQgdGhlIG93bmVyIHRvIHRoZSBjYXJkICovCi0JZGVzYy0+ZnJhZyA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpIHwgT1dORVIpOwotfQotCi1zdGF0aWMgdm9pZCByeF9kZXNjX2ZyZWUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGlkeCkKLXsKLQlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjID0gcHJpdi0+cnguZGVzYyArIGlkeDsKLQlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+cnguaW5mbyArIGlkeDsKLQotCUJVR19PTighZGVzYyB8fCAhaW5mbyk7Ci0JaWYgKGluZm8tPm1hcHBpbmcpCi0JCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgaW5mby0+bWFwcGluZywgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQlpZiAoaW5mby0+c2tiKQotCQlkZXZfa2ZyZWVfc2tiKGluZm8tPnNrYik7Ci0JbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwotCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fdHhfZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgYWdueF9kZXNjICpkZXNjLCBzdHJ1Y3QgYWdueF9pbmZvICppbmZvKQotewotCUJVR19PTighZGVzYyB8fCAhaW5mbyk7Ci0JLyogVE9ETyBtYWtlIHN1cmUgbWFwcGluZywgc2tiIGFuZCBsZW4gYXJlIGNvbnNpc3RlbmN5ICovCi0JaWYgKGluZm8tPm1hcHBpbmcpCi0JCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgaW5mby0+bWFwcGluZywKLQkJCQkgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKQotCQlkZXZfa2ZyZWVfc2tiKGluZm8tPnNrYik7Ci0KLQltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7Ci0JbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOwotfQotCi1zdGF0aWMgdm9pZCB0eG1fZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCi17Ci0Jc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnR4bS5kZXNjICsgaWR4OwotCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT50eG0uaW5mbyArIGlkeDsKLQotCV9fdHhfZGVzY19mcmVlKHByaXYsIGRlc2MsIGluZm8pOwotfQotCi1zdGF0aWMgdm9pZCB0eGRfZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCi17Ci0Jc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnR4ZC5kZXNjICsgaWR4OwotCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT50eGQuaW5mbyArIGlkeDsKLQotCV9fdHhfZGVzY19mcmVlKHByaXYsIGRlc2MsIGluZm8pOwotfQotCi1pbnQgZmlsbF9yaW5ncyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXVuc2lnbmVkIGludCBpOwotCXUzMiByZWc7Ci0JQUdOWF9UUkFDRTsKLQotCXByaXYtPnR4ZC5pZHhfc2VudCA9IHByaXYtPnR4bS5pZHhfc2VudCA9IDA7Ci0JcHJpdi0+cnguaWR4ID0gcHJpdi0+dHhtLmlkeCA9IHByaXYtPnR4ZC5pZHggPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPnJ4LnNpemU7IGkrKykKLQkJcnhfZGVzY19pbml0KHByaXYsIGkpOwotCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eG0uc2l6ZTsgaSsrKSB7Ci0JCW1lbXNldChwcml2LT50eG0uZGVzYyArIGksIDAsIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSk7Ci0JCW1lbXNldChwcml2LT50eG0uaW5mbyArIGksIDAsIHNpemVvZihzdHJ1Y3QgYWdueF9pbmZvKSk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eGQuc2l6ZTsgaSsrKSB7Ci0JCW1lbXNldChwcml2LT50eGQuZGVzYyArIGksIDAsIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSk7Ci0JCW1lbXNldChwcml2LT50eGQuaW5mbyArIGksIDAsIHNpemVvZihzdHJ1Y3QgYWdueF9pbmZvKSk7Ci0JfQotCi0JLyogRklYTUUgU2V0IHRoZSBjYXJkIFJYIFRYTSBhbmQgVFhEIGFkZHJlc3MgKi8KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9SWENNU1RBUlQsIHByaXYtPnJ4LmRtYSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDTUVORCwgcHJpdi0+dHhtLmRtYSk7Ci0KLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWE1TVEFSVCwgcHJpdi0+dHhtLmRtYSk7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNRU5ELCBwcml2LT50eGQuZG1hKTsKLQotCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRFNUQVJULCBwcml2LT50eGQuZG1hKTsKLQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWERFTkQsIHByaXYtPnR4ZC5kbWEgKwotCQkgICAgIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIHByaXYtPnR4ZC5zaXplKTsKLQotCS8qIEZJWE1FIFJlbGlucXVpc2ggY29udHJvbCBvZiByaW5ncyB0byBjYXJkICovCi0JcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwpOwotCXJlZyAmPSB+MHg4MDA7Ci0JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMLCByZWcpOwotCXJldHVybiAwOwotfSAvKiBmaWxsX3JpbmdzICovCi0KLXZvaWQgdW5maWxsX3JpbmdzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgaTsKLQlBR05YX1RSQUNFOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeC5zaXplOyBpKyspCi0JCXJ4X2Rlc2NfZnJlZShwcml2LCBpKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhtLnNpemU7IGkrKykKLQkJdHhtX2Rlc2NfZnJlZShwcml2LCBpKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhkLnNpemU7IGkrKykKLQkJdHhkX2Rlc2NfZnJlZShwcml2LCBpKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyogRXh0cmFjdCB0aGUgYml0cmF0ZSBvdXQgb2YgYSBDQ0sgUExDUCBoZWFkZXIuCi0gICBjb3B5IGZyb20gYmNtNDN4eCBkcml2ZXIgKi8KLXN0YXRpYyBpbmxpbmUgdTggYWdueF9wbGNwX2dldF9iaXRyYXRlX2NjayhfX2JlMzIgKnBoeWhkcl8xMWIpCi17Ci0JLyogRklYTUUgKi8KLQlzd2l0Y2ggKCoodTggKilwaHloZHJfMTFiKSB7Ci0JY2FzZSAweDBBOgotCQlyZXR1cm4gMDsKLQljYXNlIDB4MTQ6Ci0JCXJldHVybiAxOwotCWNhc2UgMHgzNzoKLQkJcmV0dXJuIDI7Ci0JY2FzZSAweDZFOgotCQlyZXR1cm4gMzsKLQl9Ci0JYWdueF9idWcoIldyb25nIHBsY3AgcmF0ZSIpOwotCXJldHVybiAwOwotfQotCi0vKiBGSVhNRSAqLwotc3RhdGljIGlubGluZSB1OCBhZ254X3BsY3BfZ2V0X2JpdHJhdGVfb2ZkbShfX2JlMzIgKnBoeWhkcl8xMWcpCi17Ci0JdTggcmF0ZSA9ICoodTggKilwaHloZHJfMTFnICYgMHhGOwotCi0JcHJpbnRrKFBGWCAiRyBtb2RlIHJhdGUgaXMgMHgleFxuIiwgcmF0ZSk7Ci0JcmV0dXJuIHJhdGU7Ci19Ci0KLS8qIEZJWE1FICovCi1zdGF0aWMgdm9pZCBnZXRfcnhfc3RhdHMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfaGRyICpoZHIsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXQpCi17Ci0Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7Ci0JdTggKnJzc2k7Ci0JdTMyIG5vaXNlOwotCS8qIEZJWE1FIGp1c3QgZm9yIHRlc3QgKi8KLQlpbnQgc25yID0gNDA7CQkvKiBzaWduYWwtdG8tbm9pc2UgcmF0aW8gKi8KLQotCW1lbXNldChzdGF0LCAwLCBzaXplb2YoKnN0YXQpKTsKLQkvKiBSU1NJICovCi0JcnNzaSA9ICh1OCAqKSZoZHItPnBoeV9zdGF0c19sbzsKLS8qCXN0YXQtPnNzaSA9IChyc3NpWzBdICsgcnNzaVsxXSArIHJzc2lbMl0pIC8gMzsgKi8KLQkvKiBOb2lzZSAqLwotCW5vaXNlID0gaW9yZWFkMzIoY3RsICsgQUdOWF9HQ1JfTk9JU0UwKTsKLQlub2lzZSArPSBpb3JlYWQzMihjdGwgKyBBR05YX0dDUl9OT0lTRTEpOwotCW5vaXNlICs9IGlvcmVhZDMyKGN0bCArIEFHTlhfR0NSX05PSVNFMik7Ci0Jc3RhdC0+bm9pc2UgPSBub2lzZSAvIDM7Ci0JLyogU2lnbmFsIHF1YWxpdHkgKi8KLS8qCXNuciA9IHN0YXQtPnNzaSAtIHN0YXQtPm5vaXNlOyAqLwotCWlmIChzbnIgPj0gMCAmJiBzbnIgPCA0MCkKLQkJc3RhdC0+c2lnbmFsID0gNSAqIHNuciAvIDI7Ci0JZWxzZSBpZiAoc25yID49IDQwKQotCQlzdGF0LT5zaWduYWwgPSAxMDA7Ci0JZWxzZQotCQlzdGF0LT5zaWduYWwgPSAwOwotCi0KLQlpZiAoaGRyLT5fMTFiMCAmJiAhaGRyLT5fMTFnMCkgewotCQlzdGF0LT5yYXRlX2lkeCA9IGFnbnhfcGxjcF9nZXRfYml0cmF0ZV9jY2soJmhkci0+XzExYjApOwotCX0gZWxzZSBpZiAoIWhkci0+XzExYjAgJiYgaGRyLT5fMTFnMCkgewotCQlwcmludGsoUEZYICJSWDogRm91bmQgRyBtb2RlIHBhY2tldFxuIik7Ci0JCXN0YXQtPnJhdGVfaWR4ID0gYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oJmhkci0+XzExZzApOwotCX0gZWxzZQotCQlhZ254X2J1ZygiVW5rbm93biBwYWNrZXRzIHR5cGUiKTsKLQotCi0Jc3RhdC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0Jc3RhdC0+ZnJlcSA9IGFnbnhfY2hhbm5lbHNbcHJpdi0+Y2hhbm5lbCAtIDFdLmNlbnRlcl9mcmVxOwotLyoJc3RhdC0+YW50ZW5uYSA9IDM7Ci0Jc3RhdC0+bWFjdGltZSA9IGJlMzJfdG9fY3B1KGhkci0+dGltZV9zdGFtcCk7Ci0Jc3RhdC0+Y2hhbm5lbCA9IHByaXYtPmNoYW5uZWw7ICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb21iaW5lX2hkcl9mcmFnKHN0cnVjdCBpZWVlODAyMTFfaGRyICppZWVlaGRyLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXUxNiBmY3RsOwotCXVuc2lnbmVkIGludCBoZHJsZW47Ci0KLQlmY3RsID0gbGUxNl90b19jcHUoaWVlZWhkci0+ZnJhbWVfY29udHJvbCk7Ci0JaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihmY3RsKTsKLQkvKiBGSVhNRSAqLwotCWlmIChoZHJsZW4gPCAoMisyKzYpLyptaW5pbXVtIGhkciovIHx8Ci0JICAgIGhkcmxlbiA+IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImhkciBsZW4gaXMgJWRcbiIsIGhkcmxlbik7Ci0JCWFnbnhfYnVnKCJXcm9uZyBpZWVlODAyMTEgaGRyIGRldGVjdGVkIik7Ci0JfQotCXNrYl9wdXNoKHNrYiwgaGRybGVuKTsKLQltZW1jcHkoc2tiLT5kYXRhLCBpZWVlaGRyLCBoZHJsZW4pOwotfSAvKiBjb21iaW5lX2hkcl9mcmFnICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGFnbnhfcGFja2V0X2NoZWNrKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X2hkciAqYWdueGhkciwKLQkJCQkgICAgdW5zaWduZWQgcGFja2V0X2xlbikKLXsKLQlpZiAoYWdueF9nZXRfYml0cyhDUkNfRkFJTCwgQ1JDX0ZBSUxfU0hJRlQsIGJlMzJfdG9fY3B1KGFnbnhoZHItPnJlZzEpKSA9PSAxKSB7Ci0JCXByaW50ayhQRlggIlJYOiBDUkMgY2hlY2sgZmFpbFxuIik7Ci0JCWdvdG8gZHJvcDsKLQl9Ci0JaWYgKHBhY2tldF9sZW4gPiAyMDQ4KSB7Ci0JCXByaW50ayhQRlggIlJYOiBUb28gbG9uZyBwYWNrZXQgZGV0ZWN0ZWRcbiIpOwotCQlnb3RvIGRyb3A7Ci0JfQotCi0JLyogRklYTUUgSnVzdCB1c2FibGUgZm9yIFByb21pb3VzIE1vZGUsIGZvciBNYW5hZ2UgbW9kZSBleGNsdWRlIEZDUyAqLwotLyogCWlmIChwYWNrZXRfbGVuIC0gc2l6ZW9mKCphZ254aGRyKSA8IEZDU19MRU4pIHsgKi8KLS8qIAkJcHJpbnRrKFBGWCAiUlg6IFRvbyBzaG9ydCBwYWNrZXQgZGV0ZWN0ZWRcbiIpOyAqLwotLyogCQlnb3RvIGRyb3A7ICovCi0vKiAJfSAqLwotCXJldHVybiAwOwotZHJvcDoKLQlwcml2LT5zdGF0cy5kb3QxMUZDU0Vycm9yQ291bnQrKzsKLQlyZXR1cm4gLTE7Ci19Ci0KLXZvaWQgaGFuZGxlX3J4X2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgbGVuOwotLyoJQUdOWF9UUkFDRTsgKi8KLQotCWRvIHsKLQkJc3RydWN0IGFnbnhfZGVzYyAqZGVzYzsKLQkJdTMyIGZyYWc7Ci0JCXN0cnVjdCBhZ254X2luZm8gKmluZm87Ci0JCXN0cnVjdCBhZ254X2hkciAqaGRyOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCQl1bnNpZ25lZCBpbnQgaSA9IHByaXYtPnJ4LmlkeCAlIHByaXYtPnJ4LnNpemU7Ci0KLQkJZGVzYyA9IHByaXYtPnJ4LmRlc2MgKyBpOwotCQlmcmFnID0gYmUzMl90b19jcHUoZGVzYy0+ZnJhZyk7Ci0JCWlmIChmcmFnICYgT1dORVIpCi0JCQlicmVhazsKLQotCQlpbmZvID0gcHJpdi0+cnguaW5mbyArIGk7Ci0JCXNrYiA9IGluZm8tPnNrYjsKLQkJaGRyID0gKHN0cnVjdCBhZ254X2hkciAqKShza2ItPmRhdGEpOwotCi0JCWxlbiA9IChmcmFnICYgUEFDS0VUX0xFTikgPj4gUEFDS0VUX0xFTl9TSElGVDsKLQkJaWYgKGFnbnhfcGFja2V0X2NoZWNrKHByaXYsIGhkciwgbGVuKSA9PSAtMSkgewotCQkJcnhfZGVzY19yZXVzaW5nKHByaXYsIGkpOwotCQkJY29udGludWU7Ci0JCX0KLQkJc2tiX3B1dChza2IsIGxlbik7Ci0KLQkJZG8gewotCQkJCXUxNiBmY3RsOwotCQkJZmN0bCA9IGxlMTZfdG9fY3B1KCgoc3RydWN0IGllZWU4MDIxMV9oZHIgKiloZHItPm1hY19oZHIpLT5mcmFtZV9jb250cm9sKTsKLQkJCWlmICgoZmN0bCAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSAhPSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKS8qICYmICEoZmN0bCAmIElFRUU4MDIxMV9TVFlQRV9CRUFDT04pKSAqLwotCQkJCWR1bXBfaWVlZTgwMjExX2hkcigoc3RydWN0IGllZWU4MDIxMV9oZHIgKiloZHItPm1hY19oZHIsICJSWCIpOwotCQl9IHdoaWxlICgwKTsKLQotCQlpZiAoaGRyLT5fMTFiMCAmJiAhaGRyLT5fMTFnMCkgewotLyoJCQlpbnQgajsKLQkJCXUxNiBmY3RsID0gbGUxNl90b19jcHUoKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkcikKLQkJCQkJICAgICAgIC0+ZnJhbWVfY29udHJvbCk7Ci0JCQlpZiAoIChmY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpID09ICBJRUVFODAyMTFfRlRZUEVfREFUQSkgewotCQkJCWFnbnhfcHJpbnRfcnhfaGRyKGhkcik7Ci0JCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOwotCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCBqKTsKLQkJCX0gKi8KLQotCQkJZ2V0X3J4X3N0YXRzKHByaXYsIGhkciwgJnN0YXR1cyk7Ci0JCQlza2JfcHVsbChza2IsIHNpemVvZigqaGRyKSk7Ci0JCQljb21iaW5lX2hkcl9mcmFnKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkciwgc2tiKTsKLQkJfSBlbHNlIGlmICghaGRyLT5fMTFiMCAmJiBoZHItPl8xMWcwKSB7Ci0vKgkJCWludCBqOyAqLwotCQkJYWdueF9wcmludF9yeF9oZHIoaGRyKTsKLQkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIEJTU0lEX1NUQUlEKTsKLS8qCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgKi8KLQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCAwKTsKLQotCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImFnbng6IFJYX1BBQ0tFVDogIiwgRFVNUF9QUkVGSVhfTk9ORSwKLQkJCQkJICAgICBza2ItPmRhdGEsIHNrYi0+bGVuICsgOCk7Ci0KLS8qCQkJaWYgKGFnbnhfcGxjcF9nZXRfYml0cmF0ZV9vZmRtKCZoZHItPl8xMWcwKSA9PSAwKSAqLwotCQkJZ2V0X3J4X3N0YXRzKHByaXYsIGhkciwgJnN0YXR1cyk7Ci0JCQlza2JfcHVsbChza2IsIHNpemVvZigqaGRyKSk7Ci0JCQljb21iaW5lX2hkcl9mcmFnKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKQotCQkJCQkgKCh2b2lkICopJmhkci0+bWFjX2hkciksIHNrYik7Ci0vKgkJCWR1bXBfaWVlZTgwMjExX2hkcigoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGEsICJSWCBHIik7ICovCi0JCX0gZWxzZQotCQkJYWdueF9idWcoIlVua25vd24gcGFja2V0cyB0eXBlIik7Ci0JCW1lbWNweShJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKSwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOwotCQlpZWVlODAyMTFfcnhfaXJxc2FmZShwcml2LT5odywgc2tiKTsKLQkJcnhfZGVzY19yZWluaXQocHJpdiwgaSk7Ci0KLQl9IHdoaWxlIChwcml2LT5yeC5pZHgrKyk7Ci19IC8qIGhhbmRsZV9yeF9pcnEgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV90eF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfcmluZyAqcmluZykKLXsKLQlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOwotCXN0cnVjdCBhZ254X2luZm8gKmluZm87Ci0JdW5zaWduZWQgaW50IGlkeDsKLQotCWZvciAoaWR4ID0gcmluZy0+aWR4X3NlbnQ7IGlkeCA8IHJpbmctPmlkeDsgaWR4KyspIHsKLQkJdW5zaWduZWQgaW50IGkgPSBpZHggJSByaW5nLT5zaXplOwotCQl1MzIgIGZyYWc7Ci0KLQkJZGVzYyA9IHJpbmctPmRlc2MgKyBpOwotCQlpbmZvID0gcmluZy0+aW5mbyArIGk7Ci0KLQkJZnJhZyA9IGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpOwotCQlpZiAoZnJhZyAmIE9XTkVSKSB7Ci0JCQlpZiAoaW5mby0+dHlwZSA9PSBIRUFERVIpCi0JCQkJYnJlYWs7Ci0JCQllbHNlCi0JCQkJYWdueF9idWcoIlRYIGVycm9yIik7Ci0JCX0KLQotCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JCWRvIHsKLS8qCQkJaW50IGo7ICovCi0JCQlzaXplX3QgbGVuOwotCQkJbGVuID0gaW5mby0+c2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSArIGluZm8tPmhkcl9sZW47Ci0vKgkJCWlmIChsZW4gPT0gNjE0KSB7ICovCi0vKgkJCQlhZ254X3ByaW50X2Rlc2MoZGVzYyk7ICovCi0JCQkJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKSB7Ci0vKgkJCQkJYWdueF9wcmludF90eF9oZHIoKHN0cnVjdCBhZ254X2hkciAqKWluZm8tPnNrYi0+ZGF0YSk7ICovCi0vKgkJCQkJYWdueF9wcmludF9zdGFfcG93ZXIocHJpdiwgTE9DQUxfU1RBSUQpOyAqLwotLyoJCQkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIExPQ0FMX1NUQUlEKTsgKi8KLS8qCQkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLwotLyoJCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIExPQ0FMX1NUQUlELCAwKTsgKi8KLS8qCQkJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBCU1NJRF9TVEFJRCk7ICovCi0vKgkJCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOyAqLwotLyoJCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspICovCi0vKgkJCQkJYWdueF9wcmludF9zdGFfdHhfd3EocHJpdiwgQlNTSURfU1RBSUQsIDApOyAqLwotCQkJCX0KLS8qCQkJfSAqLwotCQl9IHdoaWxlICgwKTsKLQotCQlpZiAoaW5mby0+dHlwZSA9PSBQQUNLRVQpIHsKLS8qCQkJZHVtcF90eG1fcmVnaXN0ZXJzKHByaXYpOwotCQkJZHVtcF9yeG1fcmVnaXN0ZXJzKHByaXYpOwotCQkJZHVtcF9ibV9yZWdpc3RlcnMocHJpdik7Ci0JCQlkdW1wX2Npcl9yZWdpc3RlcnMocHJpdik7ICovCi0JCX0KLQotCQlpZiAoaW5mby0+dHlwZSA9PSBQQUNLRVQpIHsKLS8qCQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsgKi8KLQkJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhpID0gSUVFRTgwMjExX1NLQl9DQihpbmZvLT5za2IpOwotCi0JCQlza2JfcHVsbChpbmZvLT5za2IsIHNpemVvZihzdHJ1Y3QgYWdueF9oZHIpKTsKLQkJCW1lbWNweShza2JfcHVzaChpbmZvLT5za2IsIGluZm8tPmhkcl9sZW4pLCAmaW5mby0+aGRyLCBpbmZvLT5oZHJfbGVuKTsKLQotLyoJCQlkdW1wX2llZWU4MDIxMV9oZHIoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaW5mby0+c2tiLT5kYXRhLCAiVFhfSEFORExFIik7ICovCi0vKiAJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiYWdueDogVFhfSEFORExFOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAqLwotLyogCQkJCQkgICAgIGluZm8tPnNrYi0+ZGF0YSwgaW5mby0+c2tiLT5sZW4pOyAqLwotCi0JCQlpZiAoISh0eGktPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spKQotCQkJCXR4aS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOwotCi0JCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIGluZm8tPnNrYik7Ci0KLQotLyogCQkJCWluZm8tPnR4X3N0YXR1cy5xdWV1ZV9udW1iZXIgPSAocmluZy0+c2l6ZSAtIGkpIC8gMjsgKi8KLS8qIAkJCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIGluZm8tPnNrYiwgJihpbmZvLT50eF9zdGF0dXMpKTsgKi8KLS8qIAkJCX0gZWxzZSAqLwotLyogCQkJCWRldl9rZnJlZV9za2JfaXJxKGluZm8tPnNrYik7ICovCi0JCX0KLQkJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOwotCQltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7Ci0JfQotCi0JcmluZy0+aWR4X3NlbnQgPSBpZHg7Ci0JLyogVE9ETyBmaWxsIHRoZSBwcml2LT5sb3dfbGV2ZWxfc3RhdHMgKi8KLQotCS8qIGllZWU4MDIxMV93YWtlX3F1ZXVlKHByaXYtPmh3LCAwKTsgKi8KLX0KLQotdm9pZCBoYW5kbGVfdHhtX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQotewotCWhhbmRsZV90eF9pcnEocHJpdiwgJnByaXYtPnR4bSk7Ci19Ci0KLXZvaWQgaGFuZGxlX3R4ZF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLQloYW5kbGVfdHhfaXJxKHByaXYsICZwcml2LT50eGQpOwotfQotCi12b2lkIGhhbmRsZV9vdGhlcl9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKLXsKLS8qCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOyAqLwotCXUzMiBzdGF0dXMgPSBwcml2LT5pcnFfc3RhdHVzOwotCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOwotCXUzMiByZWc7Ci0KLQlpZiAoc3RhdHVzICYgSVJRX1RYX0JFQUNPTikgewotCQlpb3dyaXRlMzIoSVJRX1RYX0JFQUNPTiwgY3RsICsgQUdOWF9JTlRfU1RBVCk7Ci0JCXByaW50ayhQRlggIklSUTogVFggQmVhY29uIGNvbnRyb2wgaXMgMFglLjhYXG4iLCBpb3JlYWQzMihjdGwgKyBBR05YX1RYTV9CRUFDT05fQ1RMKSk7Ci0JCXByaW50ayhQRlggIklSUTogVFggQmVhY29uIHJ4IGZyYW1lIG51bTogJWRcbiIsIHJ4X2ZyYW1lX2NudCk7Ci0JfQotCWlmIChzdGF0dXMgJiBJUlFfVFhfUkVUUlkpIHsKLQkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9UWE1fUkVUUllTVEFJRCk7Ci0JCXByaW50ayhQRlggIklSUTogVFggUmV0cnksIFJFVFJZIFNUQSBJRCBpcyAleFxuIiwgcmVnKTsKLQl9Ci0JaWYgKHN0YXR1cyAmIElSUV9UWF9BQ1RJVklUWSkKLQkJcHJpbnRrKFBGWCAiSVJROiBUWCBBY3Rpdml0eVxuIik7Ci0JaWYgKHN0YXR1cyAmIElSUV9SWF9BQ1RJVklUWSkKLQkJcHJpbnRrKFBGWCAiSVJROiBSWCBBY3Rpdml0eVxuIik7Ci0JaWYgKHN0YXR1cyAmIElSUV9SWF9YKQotCQlwcmludGsoUEZYICJJUlE6IFJYIFhcbiIpOwotCWlmIChzdGF0dXMgJiBJUlFfUlhfWSkgewotCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9NQVNLKTsKLQkJcmVnICY9IH5JUlFfUlhfWTsKLQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfTUFTSyk7Ci0JCWlvd3JpdGUzMihJUlFfUlhfWSwgY3RsICsgQUdOWF9JTlRfU1RBVCk7Ci0JCXByaW50ayhQRlggIklSUTogUlggWVxuIik7Ci0JfQotCWlmIChzdGF0dXMgJiBJUlFfUlhfSEFTSEhJVCkgIHsKLQkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfTUFTSyk7Ci0JCXJlZyAmPSB+SVJRX1JYX0hBU0hISVQ7Ci0JCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfSU5UX01BU0spOwotCQlpb3dyaXRlMzIoSVJRX1JYX0hBU0hISVQsIGN0bCArIEFHTlhfSU5UX1NUQVQpOwotCQlwcmludGsoUEZYICJJUlE6IFJYIEhhc2ggSGl0XG4iKTsKLQotCX0KLQlpZiAoc3RhdHVzICYgSVJRX1JYX0ZSQU1FKSB7Ci0JCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfSU5UX01BU0spOwotCQlyZWcgJj0gfklSUV9SWF9GUkFNRTsKLQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfTUFTSyk7Ci0JCWlvd3JpdGUzMihJUlFfUlhfRlJBTUUsIGN0bCArIEFHTlhfSU5UX1NUQVQpOwotCQlwcmludGsoUEZYICJJUlE6IFJYIEZyYW1lXG4iKTsKLQkJcnhfZnJhbWVfY250Kys7Ci0JfQotCWlmIChzdGF0dXMgJiBJUlFfRVJSX0lOVCkgewotCQlpb3dyaXRlMzIoSVJRX0VSUl9JTlQsIGN0bCArIEFHTlhfSU5UX1NUQVQpOwotLyoJCWFnbnhfaHdfcmVzZXQocHJpdik7ICovCi0JCXByaW50ayhQRlggIklSUTogRXJyb3IgSW50ZXJydXB0XG4iKTsKLQl9Ci0JaWYgKHN0YXR1cyAmIElSUV9UWF9RVUVfRlVMTCkKLQkJcHJpbnRrKFBGWCAiSVJROiBUWCBXb3JrcXVldWUgRnVsbFxuIik7Ci0JaWYgKHN0YXR1cyAmIElSUV9CQU5ETUFOX0VSUikKLQkJcHJpbnRrKFBGWCAiSVJROiBCYW5kd2lkdGggTWFuYWdlbWVudCBFcnJvclxuIik7Ci0JaWYgKHN0YXR1cyAmIElSUV9UWF9ESVNBQkxFKQotCQlwcmludGsoUEZYICJJUlE6IFRYIERpc2FibGVcbiIpOwotCWlmIChzdGF0dXMgJiBJUlFfUlhfSVZBU0VTS0VZKQotCQlwcmludGsoUEZYICJJUlE6IFJYIEludmFsaWQgU2Vzc2lvbiBLZXlcbiIpOwotCWlmIChzdGF0dXMgJiBJUlFfUkVQX1RISElUKQotCQlwcmludGsoUEZYICJJUlE6IFJlcGxheSBUaHJlc2hvbGQgSGl0XG4iKTsKLQlpZiAoc3RhdHVzICYgSVJRX1RJTUVSMSkKLQkJcHJpbnRrKFBGWCAiSVJROiBUaW1lcjFcbiIpOwotCWlmIChzdGF0dXMgJiBJUlFfVElNRVJfQ05UKQotCQlwcmludGsoUEZYICJJUlE6IFRpbWVyIENvdW50XG4iKTsKLQlpZiAoc3RhdHVzICYgSVJRX1BIWV9GQVNUSU5UKQotCQlwcmludGsoUEZYICJJUlE6IFBoeSBGYXN0IEludGVycnVwdFxuIik7Ci0JaWYgKHN0YXR1cyAmIElSUV9QSFlfU0xPV0lOVCkKLQkJcHJpbnRrKFBGWCAiSVJROiBQaHkgU2xvdyBJbnRlcnJ1cHRcbiIpOwotCWlmIChzdGF0dXMgJiBJUlFfT1RIRVIpCi0JCXByaW50ayhQRlggIklSUTogMHg4MDAwMDAwMFxuIik7Ci19IC8qIGhhbmRsZV9vdGhlcl9pcnEgKi8KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcm91dGVfZmxhZ19zZXQoc3RydWN0IGFnbnhfaGRyICp0eGhkcikKLXsKLS8qCXUzMiByZWcgPSAwOyAqLwotCi0JLyogRklYTUUgKi8KLS8qCXJlZyA9ICgweDcgPDwgUk9VVEVfQ09NUFJFU1NJT05fU0hJRlQpICYgUk9VVEVfQ09NUFJFU1NJT047ICovCi0vKgl0eGhkci0+cmVnNSA9IGNwdV90b19iZTMyKHJlZyk7ICovCi0JdHhoZHItPnJlZzUgPSAoMHhhIDw8IDB4MCkgfCAoMHg3IDw8IDB4MTgpOwotLyoJdHhoZHItPnJlZzUgPSBjcHVfdG9fYmUzMigoMHhhIDw8IDB4MCkgfCAoMHg3IDw8IDB4MTgpKTsgKi8KLS8qCXR4aGRyLT5yZWc1ID0gY3B1X3RvX2JlMzIoMHg3IDw8IDB4MCk7ICovCi19Ci0KLS8qIFJldHVybiAwIGlmIG5vIG1hdGNoICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfcG93ZXJfbGV2ZWwodW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBhbnRlbm5hc19udW0pCi17Ci0JdW5zaWduZWQgaW50IHBvd2VyX2xldmVsOwotCi0Jc3dpdGNoIChyYXRlKSB7Ci0JY2FzZSAxMDoKLQljYXNlIDIwOgotCWNhc2UgNTU6Ci0JY2FzZSA2MDoKLQljYXNlIDkwOgotCWNhc2UgMTIwOgotCQlwb3dlcl9sZXZlbCA9IDIyOwotCQlicmVhazsKLQotCWNhc2UgMTgwOgotCQlwb3dlcl9sZXZlbCA9IDE5OwotCQlicmVhazsKLQotCWNhc2UgMjQwOgotCQlwb3dlcl9sZXZlbCA9IDE4OwotCQlicmVhazsKLQotCWNhc2UgMzYwOgotCQlwb3dlcl9sZXZlbCA9IDE2OwotCQlicmVhazsKLQotCWNhc2UgNDgwOgotCQlwb3dlcl9sZXZlbCA9IDE1OwotCQlicmVhazsKLQotCWNhc2UgNTQwOgotCQlwb3dlcl9sZXZlbCA9IDE0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhZ254X2J1ZygiRXJyb3IgcmF0ZSBzZXR0aW5nXG4iKTsKLQl9Ci0KLQlpZiAocG93ZXJfbGV2ZWwgJiYgKGFudGVubmFzX251bSA9PSAyKSkKLQkJcG93ZXJfbGV2ZWwgLT0gMzsKLQotCXJldHVybiBwb3dlcl9sZXZlbDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZpbGxfYWdueF9oZHIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfaW5mbyAqdHhfaW5mbykKLXsKLQlzdHJ1Y3QgYWdueF9oZHIgKnR4aGRyID0gKHN0cnVjdCBhZ254X2hkciAqKXR4X2luZm8tPnNrYi0+ZGF0YTsKLQlzaXplX3QgbGVuOwotCXUxNiBmYyA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopJnR4X2luZm8tPmhkcik7Ci0JdTMyIHJlZzsKLQotCW1lbXNldCh0eGhkciwgMCwgc2l6ZW9mKCp0eGhkcikpOwotCi0vKglyZWcgPSBhZ254X3NldF9iaXRzKFNUQVRJT05fSUQsIFNUQVRJT05fSURfU0hJRlQsIExPQ0FMX1NUQUlEKTsgKi8KLQlyZWcgPSBhZ254X3NldF9iaXRzKFNUQVRJT05fSUQsIFNUQVRJT05fSURfU0hJRlQsIEJTU0lEX1NUQUlEKTsKLQlyZWcgfD0gYWdueF9zZXRfYml0cyhXT1JLUVVFVUVfSUQsIFdPUktRVUVVRV9JRF9TSElGVCwgMCk7Ci0JdHhoZHItPnJlZzQgPSBjcHVfdG9fYmUzMihyZWcpOwotCi0JLyogU2V0IHRoZSBIYXJkd2FyZSBTZXF1ZW5jZSBOdW1iZXIgdG8gMT8gKi8KLQlyZWcgPSBhZ254X3NldF9iaXRzKFNFUVVFTkNFX05VTUJFUiwgU0VRVUVOQ0VfTlVNQkVSX1NISUZULCAwKTsKLS8qCXJlZyA9IGFnbnhfc2V0X2JpdHMoU0VRVUVOQ0VfTlVNQkVSLCBTRVFVRU5DRV9OVU1CRVJfU0hJRlQsIDEpOyAqLwotCXJlZyB8PSBhZ254X3NldF9iaXRzKE1BQ19IRFJfTEVOLCBNQUNfSERSX0xFTl9TSElGVCwgdHhfaW5mby0+aGRyX2xlbik7Ci0JdHhoZHItPnJlZzEgPSBjcHVfdG9fYmUzMihyZWcpOwotCS8qIFNldCB0aGUgYWdueF9oZHIncyBNQUMgaGVhZGVyICovCi0JbWVtY3B5KHR4aGRyLT5tYWNfaGRyLCAmdHhfaW5mby0+aGRyLCB0eF9pbmZvLT5oZHJfbGVuKTsKLQotCXJlZyA9IGFnbnhfc2V0X2JpdHMoQUNLLCBBQ0tfU0hJRlQsIDEpOwotLyoJcmVnID0gYWdueF9zZXRfYml0cyhBQ0ssIEFDS19TSElGVCwgMCk7ICovCi0JcmVnIHw9IGFnbnhfc2V0X2JpdHMoTVVMVElDQVNULCBNVUxUSUNBU1RfU0hJRlQsIDApOwotLyoJcmVnIHw9IGFnbnhfc2V0X2JpdHMoTVVMVElDQVNULCBNVUxUSUNBU1RfU0hJRlQsIDEpOyAqLwotCXJlZyB8PSBhZ254X3NldF9iaXRzKFJFTEFZLCBSRUxBWV9TSElGVCwgMCk7Ci0JcmVnIHw9IGFnbnhfc2V0X2JpdHMoVE0sIFRNX1NISUZULCAwKTsKLQl0eGhkci0+cmVnMCA9IGNwdV90b19iZTMyKHJlZyk7Ci0KLQkvKiBTZXQgdGhlIGxvbmcgYW5kIHNob3J0IHJldHJ5IGxpbWl0cyAqLwotCXR4aGRyLT50eC5zaG9ydF9yZXRyeV9saW1pdCA9IHR4X2luZm8tPnR4aS0+Y29udHJvbC5yYXRlc1swXS5jb3VudDsKLQl0eGhkci0+dHgubG9uZ19yZXRyeV9saW1pdCA9IHR4X2luZm8tPnR4aS0+Y29udHJvbC5yYXRlc1swXS5jb3VudDsKLQotCS8qIEZJWE1FICovCi0JbGVuID0gdHhfaW5mby0+c2tiLT5sZW4gLSBzaXplb2YoKnR4aGRyKSArIHR4X2luZm8tPmhkcl9sZW4gKyBGQ1NfTEVOOwotCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCkKLQkJbGVuICs9IDg7Ci0JbGVuID0gMjM5ODsKLQlyZWcgPSBhZ254X3NldF9iaXRzKEZSQUdfU0laRSwgRlJBR19TSVpFX1NISUZULCBsZW4pOwotCWxlbiA9IHR4X2luZm8tPnNrYi0+bGVuIC0gc2l6ZW9mKCp0eGhkcik7Ci0JcmVnIHw9IGFnbnhfc2V0X2JpdHMoUEFZTE9BRF9MRU4sIFBBWUxPQURfTEVOX1NISUZULCBsZW4pOwotCXR4aGRyLT5yZWczID0gY3B1X3RvX2JlMzIocmVnKTsKLQotCXJvdXRlX2ZsYWdfc2V0KHR4aGRyKTsKLX0gLyogZmlsbF9oZHIgKi8KLQotc3RhdGljIHZvaWQgdHhtX3Bvd2VyX3NldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aSkKLXsKLQlzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgcG93ZXI7Ci0JdTMyIHJlZzsKLQotCS8qIEZJWE1FICovCi0JaWYgKHR4aS0+Y29udHJvbC5yYXRlc1swXS5pZHggPCAwKSB7Ci0JCS8qIEZvciBCIG1vZGUgU2hvcnQgUHJlYW1ibGUgKi8KLQkJcmVnID0gYWdueF9zZXRfYml0cyhQSFlfTU9ERSwgUEhZX01PREVfU0hJRlQsIEFHTlhfTU9ERV84MDIxMUJfU0hPUlQpOwotLyoJCWNvbnRyb2wtPnR4X3JhdGUgPSAtY29udHJvbC0+dHhfcmF0ZTsgKi8KLQl9IGVsc2UKLQkJcmVnID0gYWdueF9zZXRfYml0cyhQSFlfTU9ERSwgUEhZX01PREVfU0hJRlQsIEFHTlhfTU9ERV84MDIxMUcpOwotLyoJCXJlZyA9IGFnbnhfc2V0X2JpdHMoUEhZX01PREUsIFBIWV9NT0RFX1NISUZULCBBR05YX01PREVfODAyMTFCX0xPTkcpOyAqLwotCXJlZyB8PSBhZ254X3NldF9iaXRzKFNJR05BTCwgU0lHTkFMX1NISUZULCAweEIpOwotCXJlZyB8PSBhZ254X3NldF9iaXRzKFJBVEUsIFJBVEVfU0hJRlQsIDB4Qik7Ci0vKglyZWcgfD0gYWdueF9zZXRfYml0cyhQT1dFUl9MRVZFTCwgUE9XRVJfTEVWRUxfU0hJRlQsIDE1KTsgKi8KLQlyZWcgfD0gYWdueF9zZXRfYml0cyhQT1dFUl9MRVZFTCwgUE9XRVJfTEVWRUxfU0hJRlQsIDIwKTsKLQkvKiBpZiByYXRlIDwgMTFNIHNldCBpdCB0byAwICovCi0JcmVnIHw9IGFnbnhfc2V0X2JpdHMoTlVNX1RSQU5TTUlUVEVSUywgTlVNX1RSQU5TTUlUVEVSU19TSElGVCwgMSk7Ci0vKglyZWcgfD0gYWdueF9zZXRfYml0cyhFRENGLCBFRENGX1NISUZULCAxKTsgKi8KLS8qCXJlZyB8PSBhZ254X3NldF9iaXRzKFRJRlMsIFRJRlNfU0hJRlQsIDEpOyAqLwotCi0JcG93ZXIucmVnID0gcmVnOwotLyoJcG93ZXIucmVnID0gY3B1X3RvX2xlMzIocmVnKTsgKi8KLQotLyoJc2V0X3N0YV9wb3dlcihwcml2LCAmcG93ZXIsIExPQ0FMX1NUQUlEKTsgKi8KLQlzZXRfc3RhX3Bvd2VyKHByaXYsICZwb3dlciwgQlNTSURfU1RBSUQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0eF9wYWNrZXRfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQl1bnNpZ25lZCBpbnQgaWVlZV9sZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpOwotCWlmIChza2ItPmxlbiA+IDIwNDgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGVuZ3RoIGlzICVkXG4iLCBza2ItPmxlbik7Ci0JCWFnbnhfYnVnKCJUb28gbG9uZyBUWCBza2IiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBGSVhNRSAqLwotCWlmIChza2ItPmxlbiA9PSBpZWVlX2xlbikgewotCQlwcmludGsoUEZYICJBIHN0cmFuZ2UgVFggcGFja2V0XG4iKTsKLQkJcmV0dXJuIC0xOwotCQkvKiB0eF9mYWlsZV9pcnFzYWZlKCk7ICovCi0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fYWdueF90eChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIHN0cnVjdCBhZ254X3JpbmcgKnJpbmcpCi17Ci0Jc3RydWN0IGFnbnhfZGVzYyAqaGRyX2Rlc2MsICpmcmFnX2Rlc2M7Ci0Jc3RydWN0IGFnbnhfaW5mbyAqaGRyX2luZm8sICpmcmFnX2luZm87Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGkgPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBUaGUgUlggaW50ZXJydXB0IG5lZWQgYmUgRGlzYWJsZSB1bnRpbCB0aGlzIFRYIHBhY2tldAotCSAgIGlzIGhhbmRsZWQgaW4gdGhlIG5leHQgdHggaW50ZXJydXB0ICovCi0JZGlzYWJsZV9yeF9pbnRlcnJ1cHQocHJpdik7Ci0KLQlpID0gcmluZy0+aWR4OwotCXJpbmctPmlkeCArPSAyOwotLyogICAJaWYgKHByaXYtPnR4bV9pZHggLSBwcml2LT50eG1faWR4X3NlbnQgPT0gQUdOWF9UWE1fUklOR19TSVpFIC0gMikgKi8KLS8qIAkJaWVlZTgwMjExX3N0b3BfcXVldWUocHJpdi0+aHcsIDApOyAqLwotCi0JLyogU2V0IGFnbnggaGVhZGVyJ3MgaW5mbyBhbmQgZGVzYyAqLwotCWkgJT0gcmluZy0+c2l6ZTsKLQloZHJfZGVzYyA9IHJpbmctPmRlc2MgKyBpOwotCWhkcl9pbmZvID0gcmluZy0+aW5mbyArIGk7Ci0JaGRyX2luZm8tPmhkcl9sZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpOwotCW1lbWNweSgmaGRyX2luZm8tPmhkciwgc2tiLT5kYXRhLCBoZHJfaW5mby0+aGRyX2xlbik7Ci0KLQkvKiBBZGQgdGhlIGFnbnggaGVhZGVyIHRvIHRoZSBmcm9udCBvZiB0aGUgU0tCICovCi0Jc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSAtIGhkcl9pbmZvLT5oZHJfbGVuKTsKLQotCWhkcl9pbmZvLT50eGkgPSB0eGk7Ci0JaGRyX2luZm8tPmRtYV9sZW4gPSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKTsKLQloZHJfaW5mby0+c2tiID0gc2tiOwotCWhkcl9pbmZvLT50eXBlID0gSEVBREVSOwotCWZpbGxfYWdueF9oZHIocHJpdiwgaGRyX2luZm8pOwotCWhkcl9pbmZvLT5tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgc2tiLT5kYXRhLAotCQkJCQkgICBoZHJfaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JZG8gewotCQl1MzIgZnJhZyA9IDA7Ci0JCWZyYWcgfD0gYWdueF9zZXRfYml0cyhGSVJTVF9GUkFHLCBGSVJTVF9GUkFHX1NISUZULCAxKTsKLQkJZnJhZyB8PSBhZ254X3NldF9iaXRzKExBU1RfRlJBRywgTEFTVF9GUkFHX1NISUZULCAwKTsKLQkJZnJhZyB8PSBhZ254X3NldF9iaXRzKFBBQ0tFVF9MRU4sIFBBQ0tFVF9MRU5fU0hJRlQsIHNrYi0+bGVuKTsKLQkJZnJhZyB8PSBhZ254X3NldF9iaXRzKEZJUlNUX0ZSQUdfTEVOLCBGSVJTVF9GUkFHX0xFTl9TSElGVCwgMSk7Ci0JCWZyYWcgfD0gYWdueF9zZXRfYml0cyhPV05FUiwgT1dORVJfU0hJRlQsIDEpOwotCQloZHJfZGVzYy0+ZnJhZyA9IGNwdV90b19iZTMyKGZyYWcpOwotCX0gd2hpbGUgKDApOwotCWhkcl9kZXNjLT5kbWFfYWRkciA9IGNwdV90b19iZTMyKGhkcl9pbmZvLT5tYXBwaW5nKTsKLQotCi0JLyogU2V0IEZyYWcncyBpbmZvIGFuZCBkZXNjICovCi0JaSA9IChpICsgMSkgJSByaW5nLT5zaXplOwotCWZyYWdfZGVzYyA9IHJpbmctPmRlc2MgKyBpOwotCWZyYWdfaW5mbyA9IHJpbmctPmluZm8gKyBpOwotCW1lbWNweShmcmFnX2luZm8sIGhkcl9pbmZvLCBzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykpOwotCWZyYWdfaW5mby0+dHlwZSA9IFBBQ0tFVDsKLQlmcmFnX2luZm8tPmRtYV9sZW4gPSBza2ItPmxlbiAtIGhkcl9pbmZvLT5kbWFfbGVuOwotCWZyYWdfaW5mby0+bWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSArIGhkcl9pbmZvLT5kbWFfbGVuLAotCQkJCQkgICAgZnJhZ19pbmZvLT5kbWFfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlkbyB7Ci0JCXUzMiBmcmFnID0gMDsKLQkJZnJhZyB8PSBhZ254X3NldF9iaXRzKEZJUlNUX0ZSQUcsIEZJUlNUX0ZSQUdfU0hJRlQsIDApOwotCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoTEFTVF9GUkFHLCBMQVNUX0ZSQUdfU0hJRlQsIDEpOwotCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoUEFDS0VUX0xFTiwgUEFDS0VUX0xFTl9TSElGVCwgc2tiLT5sZW4pOwotCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoU1VCX0ZSQUdfTEVOLCBTVUJfRlJBR19MRU5fU0hJRlQsIGZyYWdfaW5mby0+ZG1hX2xlbik7Ci0JCWZyYWdfZGVzYy0+ZnJhZyA9IGNwdV90b19iZTMyKGZyYWcpOwotCX0gd2hpbGUgKDApOwotCWZyYWdfZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihmcmFnX2luZm8tPm1hcHBpbmcpOwotCi0JdHhtX3Bvd2VyX3NldChwcml2LCB0eGkpOwotCi0vKglkbyB7ICovCi0vKgkJaW50IGo7ICovCi0vKgkJc2l6ZV90IGxlbjsgKi8KLS8qCQlsZW4gPSBza2ItPmxlbiAtIGhkcl9pbmZvLT5kbWFfbGVuICsgaGRyX2luZm8tPmhkcl9sZW47ICAqLwotLyoJCWlmIChsZW4gPT0gNjE0KSB7ICovCi0vKgkJCWFnbnhfcHJpbnRfZGVzYyhoZHJfZGVzYyk7ICovCi0vKgkJCWFnbnhfcHJpbnRfZGVzYyhmcmFnX2Rlc2MpOyAqLwotLyoJCQlhZ254X3ByaW50X3R4X2hkcigoc3RydWN0IGFnbnhfaGRyICopc2tiLT5kYXRhKTsgKi8KLS8qCQkJYWdueF9wcmludF9zdGFfcG93ZXIocHJpdiwgTE9DQUxfU1RBSUQpOyAqLwotLyoJCQlhZ254X3ByaW50X3N0YShwcml2LCBMT0NBTF9TVEFJRCk7ICovCi0vKgkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspICovCi0vKgkJCQlhZ254X3ByaW50X3N0YV90eF93cShwcml2LCBMT0NBTF9TVEFJRCwgaik7ICovCi0vKgkJCWFnbnhfcHJpbnRfc3RhX3Bvd2VyKHByaXYsIEJTU0lEX1NUQUlEKTsgKi8KLS8qCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOyAqLwotLyoJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLwotLyoJCQkJYWdueF9wcmludF9zdGFfdHhfd3EocHJpdiwgQlNTSURfU1RBSUQsIGopOyAqLwotLyoJCQl9ICovCi0vKgl9IHdoaWxlICgwKTsgKi8KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIEZJWE1FIHVnbHkgY29kZSAqLwotCS8qIFRyaWdnZXIgVFhNICovCi0JZG8gewotCQl1MzIgcmVnOwotCQlyZWcgPSAoaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhNQ1RMKSk7Ci0JCXJlZyB8PSAweDg7Ci0JCWlvd3JpdGUzMigocmVnKSwgcHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKLQl9IHdoaWxlICgwKTsKLQotCS8qIFRyaWdnZXIgVFhEICovCi0JZG8gewotCQl1MzIgcmVnOwotCQlyZWcgPSAoaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhEQ1RMKSk7Ci0JCXJlZyB8PSAweDg7Ci0JCWlvd3JpdGUzMigocmVnKSwgcHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhEQ1RMKTsKLQl9IHdoaWxlICgwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgX2FnbnhfdHgoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQl1MTYgZmN0bDsKLQotCWlmICh0eF9wYWNrZXRfY2hlY2soc2tiKSkKLQkJcmV0dXJuIDA7Ci0KLS8qCXByaW50X2hleF9kdW1wX2J5dGVzKCJhZ254OiBUWF9QQUNLRVQ6ICIsIERVTVBfUFJFRklYX05PTkUsICovCi0vKgkJCSAgICAgc2tiLT5kYXRhLCBza2ItPmxlbik7ICovCi0KLQlmY3RsID0gbGUxNl90b19jcHUoKigoX19sZTE2ICopc2tiLT5kYXRhKSk7Ci0KLQlpZiAoKGZjdGwgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpCi0JCXJldHVybiBfX2FnbnhfdHgocHJpdiwgc2tiLCAmcHJpdi0+dHhkKTsKLQllbHNlCi0JCXJldHVybiBfX2FnbnhfdHgocHJpdiwgc2tiLCAmcHJpdi0+dHhtKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhYzQxNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotI2lmbmRlZiBBR05YX1hNSVRfSF8KLSNkZWZpbmUgQUdOWF9YTUlUX0hfCi0KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotc3RydWN0IGFnbnhfcHJpdjsKLQotc3RhdGljIGlubGluZSB1MzIgYWdueF9zZXRfYml0cyh1MzIgbWFzaywgdTggc2hpZnQsIHUzMiB2YWx1ZSkKLXsKLQlyZXR1cm4gKHZhbHVlIDw8IHNoaWZ0KSAmIG1hc2s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGFnbnhfZ2V0X2JpdHModTMyIG1hc2ssIHU4IHNoaWZ0LCB1MzIgdmFsdWUpCi17Ci0JcmV0dXJuICh2YWx1ZSAmIG1hc2spID4+IHNoaWZ0OwotfQotCi0KLXN0cnVjdCBhZ254X3J4IHsKLQlfX2JlMTYgcnhfcGFja2V0X2R1cmF0aW9uOyAvKiAgUlggUGFja2V0IER1cmF0aW9uICovCi0JX19iZTE2IHJlcGxheV9jbnQ7CS8qIFJlcGxheSBDb3VudCAqLwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLQotc3RydWN0IGFnbnhfdHggewotCXU4IGxvbmdfcmV0cnlfbGltaXQ7IC8qIExvbmcgUmV0cnkgTGltaXQgKi8KLQl1OCBzaG9ydF9yZXRyeV9saW1pdDsgLyogU2hvcnQgUmV0cnkgTGltaXQgKi8KLQl1OCBsb25nX3JldHJ5X2NudDsJLyogTG9uZyBSZXRyeSBDb3VudCAqLwotCXU4IHNob3J0X3JldHJ5X2NudDsgLyogU2hvcnQgUmV0cnkgQ291bnQgKi8KLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0KLS8qIENvcHkgZnJvbSBiY200M3h4ICovCi0jZGVmaW5lIFA0RF9CWVQzUyhtYWdpYywgbnJfYnl0ZXMpICAgICAgdTggX19wNGRkaW5nIyNtYWdpY1tucl9ieXRlc10KLSNkZWZpbmUgUDREX0JZVEVTKGxpbmUsIG5yX2J5dGVzKSAgICAgICBQNERfQllUM1MobGluZSwgbnJfYnl0ZXMpCi0jZGVmaW5lIFBBRF9CWVRFUyhucl9ieXRlcykgICAgICAgICAgICAgUDREX0JZVEVTKF9fTElORV9fLCBucl9ieXRlcykKLQotI2RlZmluZSBQNERfQklUM1MobWFnaWMsIG5yX2JpdHMpICAgICAgIF9fYmUzMiBfX3BhZGRpbmcjI21hZ2ljOm5yX2JpdHMKLSNkZWZpbmUgUDREX0JJVFMobGluZSwgbnJfYml0cykgICAgICAgICBQNERfQklUM1MobGluZSwgbnJfYml0cykKLSNkZWZpbmUgUEFEX0JJVFMobnJfYml0cykJICAgICAgICBQNERfQklUUyhfX0xJTkVfXywgbnJfYml0cykKLQotCi1zdHJ1Y3QgYWdueF9oZHIgewotCV9fYmUzMiByZWcwOwotI2RlZmluZSBSVFMJCSAgICAgICAgMHg4MDAwMDAwMCAvKiBSVFMgKi8KLSNkZWZpbmUgUlRTX1NISUZUCQkzMQotI2RlZmluZSBNVUxUSUNBU1QJICAgICAgICAweDQwMDAwMDAwIC8qIG11bHRpY2FzdCAqLwotI2RlZmluZSBNVUxUSUNBU1RfU0hJRlQJCTMwCi0jZGVmaW5lIEFDSwkJCTB4MzAwMDAwMDAgLyogQUNLICovCi0jZGVmaW5lIEFDS19TSElGVAkJMjgKLSNkZWZpbmUgVE0JCQkweDA4MDAwMDAwIC8qIFRNICovCi0jZGVmaW5lIFRNX1NISUZUCQkyNwotI2RlZmluZSBSRUxBWQkJCTB4MDQwMDAwMDAgLyogUmVsYXkgKi8KLSNkZWZpbmUgUkVMQVlfU0hJRlQJCTI2Ci0vKiAJUEFEX0JJVFMoNCk7ICovCi0jZGVmaW5lIFJFVklTRURfRkNTCQkweDAwMzgwMDAwIC8qIHJldmlzZWQgRkNTICovCi0jZGVmaW5lIFJFVklTRURfRkNTX1NISUZUCTE5Ci0jZGVmaW5lIE5FWFRfQlVGRkVSX0FERFIJMHgwMDA3RkZGRiAvKiBOZXh0IEJ1ZmZlciBBZGRyZXNzICovCi0jZGVmaW5lIE5FWFRfQlVGRkVSX0FERFJfU0hJRlQJMAotCi0JX19iZTMyIHJlZzE7Ci0jZGVmaW5lIE1BQ19IRFJfTEVOCQkweEZDMDAwMDAwIC8qIE1BQyBIZWFkZXIgTGVuZ3RoICAqLwotI2RlZmluZSBNQUNfSERSX0xFTl9TSElGVAkyNgotI2RlZmluZSBEVVJBVElPTl9PVkVSSURFCTB4MDIwMDAwMDAgLyogRHVyYXRpb24gT3ZlcnJpZGUgKi8KLSNkZWZpbmUgRFVSQVRJT05fT1ZFUklERV9TSElGVAkyNQotI2RlZmluZSBQSFlfSERSX09WRVJJREUJCTB4MDEwMDAwMDAgLyogUEhZIEhlYWRlciBPdmVycmlkZSAqLwotI2RlZmluZSBQSFlfSERSX09WRVJJREVfU0hJRlQJMjQKLSNkZWZpbmUgQ1JDX0ZBSUwJCTB4MDA4MDAwMDAgLyogQ1JDIGZhaWwgKi8KLSNkZWZpbmUgQ1JDX0ZBSUxfU0hJRlQJCTIzCi0vKglQQURfQklUUygxKTsgKi8KLSNkZWZpbmUgU0VRVUVOQ0VfTlVNQkVSCQkweDAwMjAwMDAwIC8qIFNlcXVlbmNlIE51bWJlciAqLwotI2RlZmluZSBTRVFVRU5DRV9OVU1CRVJfU0hJRlQJMjEKLS8qCVBBRF9CSVRTKDIpOyAqLwotI2RlZmluZSBCVUZGX0hFQURfQUREUgkJMHgwMDA3RkZGRiAvKiBCdWZmZXIgSGVhZCBBZGRyZXNzICovCi0jZGVmaW5lIEJVRkZfSEVBRF9BRERSX1NISUZUCTAKLQotCV9fYmUzMiByZWcyOwotI2RlZmluZSBQRFVfQ09VTlQJCTB4RkMwMDAwMDAgLyogUERVIENvdW50ICovCi0jZGVmaW5lIFBEVV9DT1VOVF9TSElGVAkJMjYKLS8qIAlQQURfQklUUygzKTsgKi8KLSNkZWZpbmUgV0VQX0tFWQkJCTB4MDA2MDAwMDAgLyogV0VQIEtleSAjICovCi0jZGVmaW5lIFdFUF9LRVlfU0hJRlQJCTIxCi0jZGVmaW5lIFVTRVNfV0VQX0tFWQkJMHgwMDEwMDAwMCAvKiBVc2VzIFdFUCBLZXkgKi8KLSNkZWZpbmUgVVNFU19XRVBfS0VZX1NISUZUCTIwCi0jZGVmaW5lIEtFRVBfQUxJVkUJCTB4MDAwODAwMDAgLyogS2VlcCBhbGl2ZSAqLwotI2RlZmluZSBLRUVQX0FMSVZFX1NISUZUCTE5Ci0jZGVmaW5lIEJVRkZfVEFJTF9BRERSCQkweDAwMDdGRkZGIC8qIEJ1ZmZlciBUYWlsIEFkZHJlc3MgKi8KLSNkZWZpbmUgQlVGRl9UQUlMX0FERFJfU0hJRlQJMAotCi0JX19iZTMyIHJlZzM7Ci0jZGVmaW5lIENUU18xMUcJCQkweDgwMDAwMDAwCS8qIENUUyBpbiAxMWcgKi8KLSNkZWZpbmUgQ1RTXzExR19TSElGVAkJMzEKLSNkZWZpbmUgUlRTXzExRwkJCTB4NDAwMDAwMDAJLyogUlRTIGluIDExZyAqLwotI2RlZmluZSBSVFNfMTFHX1NISUZUCQkzMAotLyogUEFEX0JJVFMoMik7ICovCi0jZGVmaW5lIEZSQUdfU0laRQkJMHgwRkZGMDAwMAkvKiBmcmFnbWVudCBzaXplICovCi0jZGVmaW5lIEZSQUdfU0laRV9TSElGVAkJMTYKLSNkZWZpbmUgUEFZTE9BRF9MRU4JCTB4MDAwMEZGRjAJLyogcGF5bG9hZCBsZW5ndGggKi8KLSNkZWZpbmUgUEFZTE9BRF9MRU5fU0hJRlQJNAotI2RlZmluZSBGUkFHX05VTQkJMHgwMDAwMDAwRgkvKiBudW1iZXIgb2YgZnJhZ3MgKi8KLSNkZWZpbmUgRlJBR19OVU1fU0hJRlQJCTAKLQotCV9fYmUzMiByZWc0OwotLyogCVBBRF9CSVRTKDQpOyAqLwotI2RlZmluZSBSRUxBWV9TVEFJRAkJMHgwRkZGMDAwMCAvKiByZWxheVN0YWxkICovCi0jZGVmaW5lIFJFTEFZX1NUQUlEX1NISUZUCTE2Ci0jZGVmaW5lIFNUQVRJT05fSUQJCTB4MDAwMEZGRjAgLyogU3RhdGlvbiBJRCAqLwotI2RlZmluZSBTVEFUSU9OX0lEX1NISUZUCTQKLSNkZWZpbmUgV09SS1FVRVVFX0lECQkweDAwMDAwMDBGIC8qIFdvcmtxdWV1ZSBJRCAqLwotI2RlZmluZSBXT1JLUVVFVUVfSURfU0hJRlQJMAotCi0JLyogRklYTUUgdGhpcyByZWdpc3RlciBtYXliZSBpcyBMRT8gKi8KLQlfX2JlMzIgcmVnNTsKLS8qIAlQQURfQklUUyg0KTsgKi8KLSNkZWZpbmUgUk9VVEVfSE9TVAkJMHgwRjAwMDAwMAotI2RlZmluZSBST1VURV9IT1NUX1NISUZUCTI0Ci0jZGVmaW5lIFJPVVRFX0NBUkRfQ1BVCQkweDAwRjAwMDAwCi0jZGVmaW5lIFJPVVRFX0NBUkRfQ1BVX1NISUZUCTIwCi0jZGVmaW5lIFJPVVRFX0VOQ1JZUFRJT04JMHgwMDBGMDAwMAotI2RlZmluZSBST1VURV9FTkNSWVBUSU9OX1NISUZUCTE2Ci0jZGVmaW5lIFJPVVRFX1RYCQkweDAwMDBGMDAwCi0jZGVmaW5lIFJPVVRFX1RYX1NISUZUCQkxMgotI2RlZmluZSBST1VURV9SWDEJCTB4MDAwMDBGMDAKLSNkZWZpbmUgUk9VVEVfUlgxX1NISUZUCQk4Ci0jZGVmaW5lIFJPVVRFX1JYMgkJMHgwMDAwMDBGMAotI2RlZmluZSBST1VURV9SWDJfU0hJRlQJCTQKLSNkZWZpbmUgUk9VVEVfQ09NUFJFU1NJT04JMHgwMDAwMDAwRgotI2RlZmluZSBST1VURV9DT01QUkVTU0lPTl9TSElGVCAwCi0KLQlfX2JlMzIgXzExZzA7CQkJLyogMTFnICovCi0JX19iZTMyIF8xMWcxOwkJCS8qIDExZyAqLwotCV9fYmUzMiBfMTFiMDsJCQkvKiAxMWIgKi8KLQlfX2JlMzIgXzExYjE7CQkJLyogMTFiICovCi0JdTggbWFjX2hkclszMl07CQkJLyogTUFDIGhlYWRlciAqLwotCi0JX19iZTE2IHJ0c19kdXJhdGlvbjsJCS8qIFJUUyBkdXJhdGlvbiAqLwotCV9fYmUxNiBsYXN0X2R1cmF0aW9uOwkJLyogTGFzdCBkdXJhdGlvbiAqLwotCV9fYmUxNiBzZWNfbGFzdF9kdXJhdGlvbjsJLyogU2Vjb25kIHRvIExhc3QgZHVyYXRpb24gKi8KLQlfX2JlMTYgb3RoZXJfZHVyYXRpb247CQkvKiBPdGhlciBkdXJhdGlvbiAqLwotCV9fYmUxNiB0eF9sYXN0X2R1cmF0aW9uOwkvKiBUWCBMYXN0IGR1cmF0aW9uICovCi0JX19iZTE2IHR4X290aGVyX2R1cmF0aW9uOwkvKiBUWCBPdGhlciBEdXJhdGlvbiAqLwotCV9fYmUxNiBsYXN0XzExZ19sZW47CQkvKiBMZW5ndGggb2YgbGFzdCAxMWcgKi8KLQlfX2JlMTYgb3RoZXJfMTFnX2xlbjsJCS8qIExlbmdodCBvZiBvdGhlciAxMWcgKi8KLQotCV9fYmUxNiBsYXN0XzExYl9sZW47CQkvKiBMZW5ndGggb2YgbGFzdCAxMWIgKi8KLQlfX2JlMTYgb3RoZXJfMTFiX2xlbjsJCS8qIExlbmdodCBvZiBvdGhlciAxMWIgKi8KLQotCi0JX19iZTE2IHJlZzY7Ci0jZGVmaW5lIE1CRgkJCTB4RjAwMCAvKiBtYmYgKi8KLSNkZWZpbmUgTUJGX1NISUZUCQkxMgotI2RlZmluZSBSU1ZENAkJCTB4MEZGRiAvKiByc3ZkNCAqLwotI2RlZmluZSBSU1ZENF9TSElGVAkJMAotCi0JX19iZTE2IHJ4X2ZyYWdfc3RhdDsJLyogUlggZnJhZ21lbnRhdGlvbiBzdGF0dXMgKi8KLQotCV9fYmUzMiB0aW1lX3N0YW1wOwkvKiBUaW1lU3RhbXAgKi8KLQlfX2JlMzIgcGh5X3N0YXRzX2hpOwkvKiBQSFkgc3RhdHMgaGkgKi8KLQlfX2JlMzIgcGh5X3N0YXRzX2xvOwkvKiBQSFkgc3RhdHMgbG8gKi8KLQlfX2JlMzIgbWljX2tleTA7CS8qIE1JQyBrZXkgMCAqLwotCV9fYmUzMiBtaWNfa2V5MTsJLyogTUlDIGtleSAxICovCi0KLQl1bmlvbiB7CQkJLyogUlgvVFggVW5pb24gKi8KLQkJc3RydWN0IGFnbnhfcnggcng7Ci0JCXN0cnVjdCBhZ254X3R4IHR4OwotCX07Ci0KLQl1OCByeF9jaGFubmVsOwkJLyogUmVjaWV2ZSBDaGFubmVsICovCi0JUEFEX0JZVEVTKDMpOwotCi0JdTggcmVzZXJ2ZWRbNF07Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotCi1zdHJ1Y3QgYWdueF9kZXNjIHsKLSNkZWZpbmUgUEFDS0VUX0xFTgkJMHhGRkYwMDAwMAotI2RlZmluZSBQQUNLRVRfTEVOX1NISUZUCTIwCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgRklSU1RfUEFDS0VUX01BU0sJMHgwMDA4MDAwMAotI2RlZmluZSBGSVJTVF9QQUNLRVRfTUFTS19TSElGVAkxOQotI2RlZmluZSBGSVJTVF9SRVNFUlYyCQkweDAwMDQwMDAwCi0jZGVmaW5lIEZJUlNUX1JFU0VSVjJfU0hJRlQJMTgKLSNkZWZpbmUgRklSU1RfVEtJUF9FUlJPUgkweDAwMDIwMDAwCi0jZGVmaW5lIEZJUlNUX1RLSVBfRVJST1JfU0hJRlQJMTcKLSNkZWZpbmUgRklSU1RfVEtJUF9QQUNLRVQJMHgwMDAxMDAwMAotI2RlZmluZSBGSVJTVF9US0lQX1BBQ0tFVF9TSElGVAkxNgotI2RlZmluZSBGSVJTVF9SRVNFUlYxCQkweDAwMDBGMDAwCi0jZGVmaW5lIEZJUlNUX1JFU0VSVjFfU0hJRlQJMTIKLSNkZWZpbmUgRklSU1RfRlJBR19MRU4JCTB4MDAwMDBGRjgKLSNkZWZpbmUgRklSU1RfRlJBR19MRU5fU0hJRlQJMwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFNVQl9SRVNFUlYyCQkweDAwMGMwMDAwCi0jZGVmaW5lIFNVQl9SRVNFUlYyX1NISUZUCTE4Ci0jZGVmaW5lIFNVQl9US0lQX0VSUk9SCQkweDAwMDIwMDAwCi0jZGVmaW5lIFNVQl9US0lQX0VSUk9SX1NISUZUCTE3Ci0jZGVmaW5lIFNVQl9US0lQX1BBQ0tFVAkJMHgwMDAxMDAwMAotI2RlZmluZSBTVUJfVEtJUF9QQUNLRVRfU0hJRlQJMTYKLSNkZWZpbmUgU1VCX1JFU0VSVjEJCTB4MDAwMDgwMDAKLSNkZWZpbmUgU1VCX1JFU0VSVjFfU0hJRlQJMTUKLSNkZWZpbmUgU1VCX0ZSQUdfTEVOCQkweDAwMDA3RkY4Ci0jZGVmaW5lIFNVQl9GUkFHX0xFTl9TSElGVAkzCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgRklSU1RfRlJBRwkJMHgwMDAwMDAwNAotI2RlZmluZSBGSVJTVF9GUkFHX1NISUZUCTIKLSNkZWZpbmUgTEFTVF9GUkFHCQkweDAwMDAwMDAyCi0jZGVmaW5lIExBU1RfRlJBR19TSElGVAkJMQotI2RlZmluZSBPV05FUgkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgT1dORVJfU0hJRlQJCTAKLQlfX2JlMzIgZnJhZzsKLQlfX2JlMzIgZG1hX2FkZHI7Ci19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotZW51bSB7SEVBREVSLCBQQUNLRVR9OwotCi1zdHJ1Y3QgYWdueF9pbmZvIHsKLSAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKLSAgICAgICAgZG1hX2FkZHJfdCBtYXBwaW5nOwotCXUzMiBkbWFfbGVuOwkJLyogZG1hIGJ1ZmZlciBsZW4gICovCi0JLyogQmVsb3cgZmllbGRzIG9ubHkgdXNmdWwgZm9yIHR4ICovCi0JdTMyIGhkcl9sZW47CQkvKiBpZWVlODAyMTEgaGVhZGVyIGxlbmd0aCAqLwotCXVuc2lnbmVkIGludCB0eXBlOwotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aTsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgaGRyOwotfTsKLQotCi1zdHJ1Y3QgYWdueF9yaW5nIHsKLQlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOwotCWRtYV9hZGRyX3QgZG1hOwotCXN0cnVjdCBhZ254X2luZm8gKmluZm87Ci0JLyogV2lsbCBsZWFkIHRvIG92ZXJmbG93IHdoZW4gc2VudCBwYWNrZXQgbnVtYmVyIGVub3VnaD8gKi8KLQl1bnNpZ25lZCBpbnQgaWR4OwotCXVuc2lnbmVkIGludCBpZHhfc2VudDsJCS8qIG9ubHkgdXNmdWwgZm9yIHR4ZCBhbmQgdHhtICovCi0JdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi0jZGVmaW5lIEFHTlhfUlhfUklOR19TSVpFCTEyOAotI2RlZmluZSBBR05YX1RYRF9SSU5HX1NJWkUJMjU2Ci0jZGVmaW5lIEFHTlhfVFhNX1JJTkdfU0laRQkxMjgKLQotdm9pZCBkaXNhYmxlX3J4X2ludGVycnVwdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKLXZvaWQgZW5hYmxlX3J4X2ludGVycnVwdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKLWludCBmaWxsX3JpbmdzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwotdm9pZCB1bmZpbGxfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci12b2lkIGhhbmRsZV9yeF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Ci12b2lkIGhhbmRsZV90eGRfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwotdm9pZCBoYW5kbGVfdHhtX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKLXZvaWQgaGFuZGxlX290aGVyX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKLWludCBfYWdueF90eChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLSNlbmRpZiAvKiBBR05YX1hNSVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCmluZGV4IDI0NzE5NDkuLmViNjc1NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAogY29uZmlnIEFORFJPSUQKIAlib29sICJBbmRyb2lkIERyaXZlcnMiCisJZGVwZW5kcyBvbiBCUk9LRU4KIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdmFyaW91cyBkcml2ZXJzIG5lZWRlZCBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2IzZGZnL2IzZGZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvYjNkZmcvYjNkZmcuYwppbmRleCA5NGM1ZDI3Li5jZGEyNmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYjNkZmcvYjNkZmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYjNkZmcvYjNkZmcuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGIzZGZnX25idWYgPSAyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKaW5kZXggYWY3MjNjYi4uZDYzYzg4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZwpAQCAtMSw3ICsxLDcgQEAKIGNvbmZpZyBDT01FREkKIAl0cmlzdGF0ZSAiRGF0YSBhY3F1aXNpdGlvbiBzdXBwb3J0IChjb21lZGkpIgogCWRlZmF1bHQgTgotCWRlcGVuZHMgb24gbQorCWRlcGVuZHMgb24gbSAmJiAoUENJIHx8IFBDTUNJQSB8fCBQQ0NBUkQgfHwgVVNCKQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGEgd2lkZSByYW5nZSBvZiBkYXRhIGFjcXVpc2l0aW9uIGRldmljZXMKIAkgIGZvciBMaW51eC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwppbmRleCBmNTRiYjliLi5hYWFkNzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCkBAIC0yMzM3LDcgKzIzMzcsNyBAQAogCX0KIAogCURQUklOVEsoImNvbWVkaSVpIHN1YmQgJWQgYnVmZmVyIHJlc2l6ZWQgdG8gJWkgYnl0ZXNcbiIsCi0JCWRldi0+bWlub3IsIHMgLSBkZXYtPnN1YmRldmljZXMsIGFzeW5jLT5wcmVhbGxvY19idWZzeik7CisJCWRldi0+bWlub3IsIChpbnQpKHMgLSBkZXYtPnN1YmRldmljZXMpLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCmluZGV4IDEyZDEyYjQuLjgwYzBkZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCkBAIC03NDQsNyArNzQ0LDcgQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIHBjbWNpYV9kZXZpY2Ugc3RydWN0dXJlICovCiAJLyogSW50ZXJydXB0IHNldHVwICovCi0JbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwogCWxpbmstPmlycS5IYW5kbGVyID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRpby5jCmluZGV4IDRkMTBiYzMuLjA5ZTZlM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGlvLmMKQEAgLTUzLDcgKzUzLDggQEAKICAqIFNvbWUgZHJpdmVycyB1c2UgYXJyYXlzIHN1Y2ggYXMgdGhpcywgb3RoZXIgZG8gbm90LgogICovCiBzdHJ1Y3QgcGNpZGlvX2JvYXJkIHsKLQljb25zdCBjaGFyICpuYW1lOwkvKiAgYW5tZSBvZiB0aGUgYm9hcmQgKi8KKwljb25zdCBjaGFyICpuYW1lOwkvKiAgbmFtZSBvZiB0aGUgYm9hcmQgKi8KKwlpbnQgZGV2X2lkOwogCWludCBuXzgyNTU7CQkvKiAgbnVtYmVyIG9mIDgyNTUgY2hpcHMgb24gYm9hcmQgKi8KIAogCS8qICBpbmRpY2VzIG9mIGJhc2UgYWRkcmVzcyByZWdpb25zICovCkBAIC02NCwxOCArNjUsMjEgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpZGlvX2JvYXJkIHBjaWRpb19ib2FyZHNbXSA9IHsKIAl7CiAJIC5uYW1lID0gInBjaS1kaW8yNCIsCisJIC5kZXZfaWQgPSAweDAwMjgsCiAJIC5uXzgyNTUgPSAxLAogCSAucGNpY29udHJvbGVyX2JhZHJpbmRleCA9IDEsCiAJIC5kaW9yZWdzX2JhZHJpbmRleCA9IDIsCiAJIH0sCiAJewogCSAubmFtZSA9ICJwY2ktZGlvMjRoIiwKKwkgLmRldl9pZCA9IDB4MDAxNCwKIAkgLm5fODI1NSA9IDEsCiAJIC5wY2ljb250cm9sZXJfYmFkcmluZGV4ID0gMSwKIAkgLmRpb3JlZ3NfYmFkcmluZGV4ID0gMiwKIAkgfSwKIAl7CiAJIC5uYW1lID0gInBjaS1kaW80OGgiLAorCSAuZGV2X2lkID0gMHgwMDBiLAogCSAubl84MjU1ID0gMiwKIAkgLnBjaWNvbnRyb2xlcl9iYWRyaW5kZXggPSAwLAogCSAuZGlvcmVnc19iYWRyaW5kZXggPSAxLApAQCAtMjA2LDcgKzIxMCw3IEBACiAJCQljb250aW51ZTsKIAkJLyogIGxvb3AgdGhyb3VnaCBjYXJkcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KIAkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQVJSQVlfU0laRShwY2lkaW9fYm9hcmRzKTsgaW5kZXgrKykgewotCQkJaWYgKHBjaWRpb19wY2lfdGFibGVbaW5kZXhdLmRldmljZSAhPSBwY2lkZXYtPmRldmljZSkKKwkJCWlmIChwY2lkaW9fYm9hcmRzW2luZGV4XS5kZXZfaWQgIT0gcGNpZGV2LT5kZXZpY2UpCiAJCQkJY29udGludWU7CiAKIAkJCS8qICB3YXMgYSBwYXJ0aWN1bGFyIGJ1cy9zbG90IHJlcXVlc3RlZD8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCmluZGV4IDE0YmYyOWIuLjBkMmMyZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwpAQCAtNTE1LDYgKzUxNSw3IEBACiB7CiAJc3RydWN0IHBvbGxfZGVsYXlfdCByZXN1bHQgPSBwb2xsX2RlbGF5X21pbl9tYXgoMTAwMCwgMjAwMCk7CiAJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnAgPSBzLT5wcml2YXRlOworCWludCBpOwogCiAJaWYgKHApIHsKIAkJdm9sYXRpbGUgc3RydWN0IGpyM19jaGFubmVsICpjaGFubmVsID0gcC0+Y2hhbm5lbDsKQEAgLTU3MCwxOCArNTcxLDExIEBACiAJCQkJCSAgICAgICBwLT5zZXJpYWxfbm8pOwogCiAJCQkJCS8qICBUcmFuc2Zvcm1hdGlvbiBhbGwgemVyb3MgKi8KLQkJCQkJdHJhbnNmLmxpbmtbMF0ubGlua190eXBlID0KLQkJCQkJICAgIChlbnVtIGxpbmtfdHlwZXMpMDsKLQkJCQkJdHJhbnNmLmxpbmtbMF0ubGlua19hbW91bnQgPSAwOwotCQkJCQl0cmFuc2YubGlua1sxXS5saW5rX3R5cGUgPQotCQkJCQkgICAgKGVudW0gbGlua190eXBlcykwOwotCQkJCQl0cmFuc2YubGlua1sxXS5saW5rX2Ftb3VudCA9IDA7Ci0JCQkJCXRyYW5zZi5saW5rWzJdLmxpbmtfdHlwZSA9Ci0JCQkJCSAgICAoZW51bSBsaW5rX3R5cGVzKTA7Ci0JCQkJCXRyYW5zZi5saW5rWzJdLmxpbmtfYW1vdW50ID0gMDsKLQkJCQkJdHJhbnNmLmxpbmtbM10ubGlua190eXBlID0KLQkJCQkJICAgIChlbnVtIGxpbmtfdHlwZXMpMDsKLQkJCQkJdHJhbnNmLmxpbmtbM10ubGlua19hbW91bnQgPSAwOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cmFuc2YubGluayk7IGkrKykgeworCQkJCQkJdHJhbnNmLmxpbmtbaV0ubGlua190eXBlID0KKwkJCQkJCQkoZW51bSBsaW5rX3R5cGVzKTA7CisJCQkJCQl0cmFuc2YubGlua1tpXS5saW5rX2Ftb3VudCA9IDA7CisJCQkJCX0KIAogCQkJCQlzZXRfdHJhbnNmb3JtcyhjaGFubmVsLCB0cmFuc2YsIDApOwogCQkJCQl1c2VfdHJhbnNmb3JtKGNoYW5uZWwsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCmluZGV4IDJjZGE3YWQuLjgwZTE5MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKQEAgLTUxLDYgKzUxLDcgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1eHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NXh4LmMKaW5kZXggNmIxMThjMS4uYmJmNzVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1eHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjV4eC5jCkBAIC00MTgsMTUgKzQxOCwxNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAliYXNlX2JpdGZpZWxkX2NoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlmb3IgKGogPSAwOyBqIDwgbWF4X3BvcnRzX3Blcl9iaXRmaWVsZDsgKytqKSB7CisJCWNvbnN0IHVuc2lnbmVkIHBvcnRfb2Zmc2V0ID0gbmlfNjV4eF9wb3J0X2J5X2NoYW5uZWwoYmFzZV9iaXRmaWVsZF9jaGFubmVsKSArIGo7CiAJCWNvbnN0IHVuc2lnbmVkIHBvcnQgPQotCQkgICAgc3ByaXZhdGUocyktPmJhc2VfcG9ydCArCi0JCSAgICBuaV82NXh4X3BvcnRfYnlfY2hhbm5lbChiYXNlX2JpdGZpZWxkX2NoYW5uZWwpICsgajsKKwkJICAgIHNwcml2YXRlKHMpLT5iYXNlX3BvcnQgKyBwb3J0X29mZnNldDsKIAkJdW5zaWduZWQgYmFzZV9wb3J0X2NoYW5uZWw7CiAJCXVuc2lnbmVkIHBvcnRfbWFzaywgcG9ydF9kYXRhLCBwb3J0X3JlYWRfYml0czsKIAkJaW50IGJpdHNoaWZ0OwogCQlpZiAocG9ydCA+PSBuaV82NXh4X3RvdGFsX251bV9wb3J0cyhib2FyZChkZXYpKSkKIAkJCWJyZWFrOwotCQliYXNlX3BvcnRfY2hhbm5lbCA9IHBvcnQgKiBuaV82NXh4X2NoYW5uZWxzX3Blcl9wb3J0OworCQliYXNlX3BvcnRfY2hhbm5lbCA9IHBvcnRfb2Zmc2V0ICogbmlfNjV4eF9jaGFubmVsc19wZXJfcG9ydDsKIAkJcG9ydF9tYXNrID0gZGF0YVswXTsKIAkJcG9ydF9kYXRhID0gZGF0YVsxXTsKIAkJYml0c2hpZnQgPSBiYXNlX3BvcnRfY2hhbm5lbCAtIGJhc2VfYml0ZmllbGRfY2hhbm5lbDsKQEAgLTQ1Nyw2ICs0NTcsMTIgQEAKIAkJcG9ydF9yZWFkX2JpdHMgPQogCQkgICAgcmVhZGIocHJpdmF0ZShkZXYpLT5taXRlLT5kYXFfaW9fYWRkciArIFBvcnRfRGF0YShwb3J0KSk7CiAvKiBwcmludGsoInJlYWQgMHgleCBmcm9tIHBvcnQgJWlcbiIsIHBvcnRfcmVhZF9iaXRzLCBwb3J0KTsgKi8KKwkJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfRE8gJiYgYm9hcmQoZGV2KS0+aW52ZXJ0X291dHB1dHMpIHsKKwkJCS8qIE91dHB1dHMgaW52ZXJ0ZWQsIHNvIGludmVydCB2YWx1ZSByZWFkIGJhY2sgZnJvbQorCQkJICogRE8gc3ViZGV2aWNlLiAgKERvZXMgbm90IGFwcGx5IHRvIGJvYXJkcyB3aXRoIERJTworCQkJICogc3ViZGV2aWNlLikgKi8KKwkJCXBvcnRfcmVhZF9iaXRzIF49IDB4RkY7CisJCX0KIAkJaWYgKGJpdHNoaWZ0ID4gMCkgewogCQkJcG9ydF9yZWFkX2JpdHMgPDw9IGJpdHNoaWZ0OwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV83MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfNzAwLmMKaW5kZXggNmE3Nzk3Ni4uZWMzMWEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV83MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxXzcwMC5jCkBAIC01MjAsNyArNTIwLDcgQEAKIAlsaW5rLT5wcml2ID0gbG9jYWw7CiAKIAkvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KLQlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKIAlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CiAJbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMKaW5kZXggYjA2ZTgxYy4uMDcwMGE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV9kaW8yNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAJbGluay0+cHJpdiA9IGxvY2FsOwogCiAJLyogSW50ZXJydXB0IHNldHVwICovCi0JbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwogCWxpbmstPmlycS5IYW5kbGVyID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYwppbmRleCA1N2FlY2ZhLi5hMzA1M2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJbGluay0+cHJpdiA9IGxvY2FsOwogCiAJLyogSW50ZXJydXB0IHNldHVwICovCi0JbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfRk9SQ0VEX1BVTFNFOworCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HIHwgSVJRX0ZPUkNFRF9QVUxTRTsKIAlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfSU5GTzJfVkFMSUQgfCBJUlFfUFVMU0VfSUQ7CiAJbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwppbmRleCBlM2ZmYjA2Li43NTNlZTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKQEAgLTYyLDYgKzYyLDcgQEAKIC8qICNkZWZpbmUgREVCVUdfU1RBVFVTX0IgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAiODI1NS5oIgogI2luY2x1ZGUgIm1pdGUuaCIKICNpbmNsdWRlICJjb21lZGlfZmMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYwppbmRleCBiNzMyMjk2Li45YWVmODdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jCkBAIC0yNzMsNyArMjczLDcgQEAKIHsKIAlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKIAlsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKLQlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKIAlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CiAJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCmluZGV4IDUyYjJlY2EuLmQ1NDQ2OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKQEAgLTcwLDYgKzcwLDcgQEAKIC8qICNkZWZpbmUgREVCVUdfRkxBR1MgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICJtaXRlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKaW5kZXggMTlkODc1NS4uMjRjOGI4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYwpAQCAtMjksNyArMjksNyBAQAogICBQQ0ktTUlPLTE2WEUtMTAsIFBYSS02MDMwRSwgUENJLU1JTy0xNkUtMSwgUENJLU1JTy0xNkUtNCwgUENJLTYwMTQsIFBDSS02MDQwRSwKICAgUFhJLTYwNDBFLCBQQ0ktNjAzMEUsIFBDSS02MDMxRSwgUENJLTYwMzJFLCBQQ0ktNjAzM0UsIFBDSS02MDcxRSwgUENJLTYwMjNFLAogICBQQ0ktNjAyNEUsIFBDSS02MDI1RSwgUFhJLTYwMjVFLCBQQ0ktNjAzNEUsIFBDSS02MDM1RSwgUENJLTYwNTJFLAotICBQQ0ktNjExMCwgUENJLTYxMTEsIFBDSS02MjIwLCBQQ0ktNjIyMSwgUENJLTYyMjQsIFBYSS02MjI0LCBQQ0ktNjIyNSwKKyAgUENJLTYxMTAsIFBDSS02MTExLCBQQ0ktNjIyMCwgUENJLTYyMjEsIFBDSS02MjI0LCBQWEktNjIyNCwgUENJLTYyMjUsIFBYSS02MjI1LAogICBQQ0ktNjIyOSwgUENJLTYyNTAsIFBDSS02MjUxLCBQQ0llLTYyNTEsIFBDSS02MjU0LCBQQ0ktNjI1OSwgUENJZS02MjU5LAogICBQQ0ktNjI4MCwgUENJLTYyODEsIFBYSS02MjgxLCBQQ0ktNjI4NCwgUENJLTYyODksCiAgIFBDSS02NzExLCBQWEktNjcxMSwgUENJLTY3MTMsIFBYSS02NzEzLApAQCAtMTc5LDYgKzE3OSw3IEBACiAJUENJX1ZFTkRPUl9JRF9OQVRJTlNULCAweDcwZjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCB7CiAJUENJX1ZFTkRPUl9JRF9OQVRJTlNULCAweDcxMGQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCB7CiAJUENJX1ZFTkRPUl9JRF9OQVRJTlNULCAweDcxNmMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCB7CisJUENJX1ZFTkRPUl9JRF9OQVRJTlNULCAweDcxNmQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCB7CiAJUENJX1ZFTkRPUl9JRF9OQVRJTlNULCAweDcxN2YsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCB7CiAJUENJX1ZFTkRPUl9JRF9OQVRJTlNULCAweDcxYmMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCB7CiAJUENJX1ZFTkRPUl9JRF9OQVRJTlNULCAweDcxN2QsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCB7CkBAIC05NTMsNiArOTU0LDI1IEBACiAJIC5oYXNfODI1NSA9IDAsCiAJIH0sCiAJeworCSAuZGV2aWNlX2lkID0gMHg3MTZkLAorCSAubmFtZSA9ICJweGktNjIyNSIsCisJIC5uX2FkY2hhbiA9IDgwLAorCSAuYWRiaXRzID0gMTYsCisJIC5haV9maWZvX2RlcHRoID0gNDA5NSwKKwkgLmdhaW5sa3VwID0gYWlfZ2Fpbl82MjJ4LAorCSAuYWlfc3BlZWQgPSA0MDAwLAorCSAubl9hb2NoYW4gPSAyLAorCSAuYW9iaXRzID0gMTYsCisJIC5hb19maWZvX2RlcHRoID0gODE5MSwKKwkgLmFvX3JhbmdlX3RhYmxlID0gJnJhbmdlX25pX01fNjIyeF9hbywKKwkgLnJlZ190eXBlID0gbmlfcmVnXzYyMngsCisJIC5hb191bmlwb2xhciA9IDAsCisJIC5hb19zcGVlZCA9IDEyMDAsCisJIC5udW1fcDBfZGlvX2NoYW5uZWxzID0gMzIsCisJIC5jYWxkYWMgPSB7Y2FsZGFjX25vbmV9LAorCSAuaGFzXzgyNTUgPSAwLAorCX0sCisJewogCSAuZGV2aWNlX2lkID0gMHg3MGFhLAogCSAubmFtZSA9ICJwY2ktNjIyOSIsCiAJIC5uX2FkY2hhbiA9IDMyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCmluZGV4IGY2M2JkYzMuLjM0NGI4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKQEAgLTEwNzksNyArMTA3OSw3IEBACiAJbGluay0+cHJpdiA9IGxvY2FsOwogCiAJLyogSW50ZXJydXB0IHNldHVwICovCi0JbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkcgfCBJUlFfSEFORExFX1BSRVNFTlQ7CiAJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwogCWxpbmstPmlycS5IYW5kbGVyID0gZGFxcF9pbnRlcnJ1cHQ7CiAJbGluay0+aXJxLkluc3RhbmNlID0gbG9jYWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYwppbmRleCBiODllMWVjLi4wN2MyMWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMKQEAgLTQzLDYgKzQzLDcgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2RlZmluZSBTNTI2X1NJWkUgNjQKIApAQCAtMTEzLDYgKzExNCw3IEBACiB9OwogCiBzdHJ1Y3QgY291bnRlcl9tb2RlX3JlZ2lzdGVyX3QgeworI2lmIGRlZmluZWQgKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKIAl1bnNpZ25lZCBzaG9ydCBjb3V0U291cmNlOjE7CiAJdW5zaWduZWQgc2hvcnQgY291dFBvbGFyaXR5OjE7CiAJdW5zaWduZWQgc2hvcnQgYXV0b0xvYWRSZXNldFJjYXA6MzsKQEAgLTEyNCwxMiArMTI2LDI3IEBACiAJdW5zaWduZWQgc2hvcnQgb3V0cHV0UmVnTGF0Y2hDdHJsOjE7CiAJdW5zaWduZWQgc2hvcnQgcHJlbG9hZFJlZ1NlbDoxOwogCXVuc2lnbmVkIHNob3J0IHJlc2VydmVkOjE7CisgI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQ6MTsKKwl1bnNpZ25lZCBzaG9ydCBwcmVsb2FkUmVnU2VsOjE7CisJdW5zaWduZWQgc2hvcnQgb3V0cHV0UmVnTGF0Y2hDdHJsOjE7CisJdW5zaWduZWQgc2hvcnQgY291bnREaXJDdHJsOjE7CisJdW5zaWduZWQgc2hvcnQgY291bnREaXI6MTsKKwl1bnNpZ25lZCBzaG9ydCBjbG9ja1NvdXJjZToyOworCXVuc2lnbmVkIHNob3J0IGN0RW5hYmxlQ3RybDoyOworCXVuc2lnbmVkIHNob3J0IGh3Q3RFbmFibGVTb3VyY2U6MjsKKwl1bnNpZ25lZCBzaG9ydCBhdXRvTG9hZFJlc2V0UmNhcDozOworCXVuc2lnbmVkIHNob3J0IGNvdXRQb2xhcml0eToxOworCXVuc2lnbmVkIHNob3J0IGNvdXRTb3VyY2U6MTsKKyNlbHNlCisjZXJyb3IgVW5rbm93biBiaXQgZmllbGQgb3JkZXIKKyNlbmRpZgogfTsKIAotdW5pb24gewordW5pb24gY21SZWcgewogCXN0cnVjdCBjb3VudGVyX21vZGVfcmVnaXN0ZXJfdCByZWc7CiAJdW5zaWduZWQgc2hvcnQgdmFsdWU7Ci19IGNtUmVnOworfTsKIAogI2RlZmluZSBNQVhfR1BDVF9DT05GSUdfREFUQSA2CiAKQEAgLTI4NSw2ICszMDIsNyBAQAogCWludCBpLCBuOwogLyogc2hvcnQgdmFsdWU7ICovCiAvKiBpbnQgc3ViZGV2X2NoYW5uZWwgPSAwOyAqLworCXVuaW9uIGNtUmVnIGNtUmVnOwogCiAJcHJpbnRrKCJjb21lZGklZDogczUyNjogIiwgZGV2LT5taW5vcik7CiAKQEAgLTM3NSw3ICszOTMsNyBAQAogCWlmICh0aGlzYm9hcmQtPmhhdmVfZGlvKSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CiAJCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKLQkJcy0+bl9jaGFuID0gMjsKKwkJcy0+bl9jaGFuID0gODsKIAkJcy0+bWF4ZGF0YSA9IDE7CiAJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAJCXMtPmluc25fYml0cyA9IHM1MjZfZGlvX2luc25fYml0czsKQEAgLTQzNSwxMSArNDUzLDExIEBACiAJdWRlbGF5KDEwMDApOwogCXByaW50aygiUmVhZCBiYWNrIG1vZGUgcmVnPTB4JTA0eFxuIiwgaW53KEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwgbikpKTsKIAotCS8qICBMb2FkIHRoZSBwcmUtbGFvZCByZWdpc3RlciBoaWdoIHdvcmQgKi8KKwkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgaGlnaCB3b3JkICovCiAvKiB2YWx1ZSA9IChzaG9ydCkgKDB4NTUpOyAqLwogLyogb3V0dyh2YWx1ZSwgQUREUl9DSEFOX1JFRyhSRUdfQzBILCBuKSk7ICovCiAKLQkvKiAgTG9hZCB0aGUgcHJlLWxhb2QgcmVnaXN0ZXIgbG93IHdvcmQgKi8KKwkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgbG93IHdvcmQgKi8KIC8qIHZhbHVlID0gKHNob3J0KSgweGFhNTUpOyAqLwogLyogb3V0dyh2YWx1ZSwgQUREUl9DSEFOX1JFRyhSRUdfQzBMLCBuKSk7ICovCiAKQEAgLTUxNiw2ICs1MzQsNyBAQAogCWludCBzdWJkZXZfY2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwkvKiAgVW5wYWNrIGNoYW5zcGVjICovCiAJaW50IGk7CiAJc2hvcnQgdmFsdWU7CisJdW5pb24gY21SZWcgY21SZWc7CiAKIC8qIHByaW50aygiczUyNjogR1BDVF9JTlNOX0NPTkZJRzogQ29uZmlndXJpbmcgQ2hhbm5lbCAlZFxuIiwgc3ViZGV2X2NoYW5uZWwpOyAqLwogCkBAIC01NjgsMTkgKzU4Nyw4IEBACiAKICNpZiAxCiAJCS8qICBTZXQgQ291bnRlciBNb2RlIFJlZ2lzdGVyICovCi0JCWNtUmVnLnJlZy5jb3V0U291cmNlID0gMDsJLyogIG91dCBSQ0FQICovCi0JCWNtUmVnLnJlZy5jb3V0UG9sYXJpdHkgPSAwOwkvKiAgUG9sYXJpdHkgaW52ZXJ0ZWQgKi8KLQkJY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID0gMDsJLyogIEF1dG8gbG9hZCBkaXNhYmxlZCAqLwotCQljbVJlZy5yZWcuaHdDdEVuYWJsZVNvdXJjZSA9IDI7CS8qICBOT1QgUkNBUCAqLwotCQljbVJlZy5yZWcuY3RFbmFibGVDdHJsID0gMTsJLyogIDE6IFNvZnR3YXJlLCAgPjEgOiBIYXJkd2FyZSAqLwotCQljbVJlZy5yZWcuY2xvY2tTb3VyY2UgPSAzOwkvKiAgeDQgKi8KLQkJY21SZWcucmVnLmNvdW50RGlyID0gMDsJLyogIHVwICovCi0JCWNtUmVnLnJlZy5jb3VudERpckN0cmwgPSAwOwkvKiAgcXVhZHJhdHVyZSAqLwotCQljbVJlZy5yZWcub3V0cHV0UmVnTGF0Y2hDdHJsID0gMDsJLyogIGxhdGNoIG9uIHJlYWQgKi8KLQkJY21SZWcucmVnLnByZWxvYWRSZWdTZWwgPSAwOwkvKiAgUFIwICovCi0JCWNtUmVnLnJlZy5yZXNlcnZlZCA9IDA7CisJCWNtUmVnLnZhbHVlID0gaW5zbi0+ZGF0YVsxXSAmIDB4RkZGRjsKIAotCQkvKiAgU2V0IENvdW50ZXIgTW9kZSBSZWdpc3RlciAqLwogLyogcHJpbnRrKCJzNTI2OiBDb3VudGVyIE1vZGUgcmVnaXN0ZXI9JXhcbiIsIGNtUmVnLnZhbHVlKTsgKi8KIAkJb3V0dyhjbVJlZy52YWx1ZSwgQUREUl9DSEFOX1JFRyhSRUdfQzBNLCBzdWJkZXZfY2hhbm5lbCkpOwogCkBAIC02MTUsMTEgKzYyMywxMSBAQAogCQljbVJlZy52YWx1ZSA9IChzaG9ydCkoaW5zbi0+ZGF0YVsxXSAmIDB4RkZGRik7CiAJCW91dHcoY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwgc3ViZGV2X2NoYW5uZWwpKTsKIAotCQkvKiAgTG9hZCB0aGUgcHJlLWxhb2QgcmVnaXN0ZXIgaGlnaCB3b3JkICovCisJCS8qICBMb2FkIHRoZSBwcmUtbG9hZCByZWdpc3RlciBoaWdoIHdvcmQgKi8KIAkJdmFsdWUgPSAoc2hvcnQpKChpbnNuLT5kYXRhWzJdID4+IDE2KSAmIDB4RkZGRik7CiAJCW91dHcodmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwSCwgc3ViZGV2X2NoYW5uZWwpKTsKIAotCQkvKiAgTG9hZCB0aGUgcHJlLWxhb2QgcmVnaXN0ZXIgbG93IHdvcmQgKi8KKwkJLyogIExvYWQgdGhlIHByZS1sb2FkIHJlZ2lzdGVyIGxvdyB3b3JkICovCiAJCXZhbHVlID0gKHNob3J0KShpbnNuLT5kYXRhWzJdICYgMHhGRkZGKTsKIAkJb3V0dyh2YWx1ZSwgQUREUl9DSEFOX1JFRyhSRUdfQzBMLCBzdWJkZXZfY2hhbm5lbCkpOwogCkBAIC02NTMsMTEgKzY2MSwxMSBAQAogCQljbVJlZy5yZWcucHJlbG9hZFJlZ1NlbCA9IDA7CS8qICBQUjAgKi8KIAkJb3V0dyhjbVJlZy52YWx1ZSwgQUREUl9DSEFOX1JFRyhSRUdfQzBNLCBzdWJkZXZfY2hhbm5lbCkpOwogCi0JCS8qICBMb2FkIHRoZSBwcmUtbGFvZCByZWdpc3RlciAwIGhpZ2ggd29yZCAqLworCQkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgMCBoaWdoIHdvcmQgKi8KIAkJdmFsdWUgPSAoc2hvcnQpKChpbnNuLT5kYXRhWzJdID4+IDE2KSAmIDB4RkZGRik7CiAJCW91dHcodmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwSCwgc3ViZGV2X2NoYW5uZWwpKTsKIAotCQkvKiAgTG9hZCB0aGUgcHJlLWxhb2QgcmVnaXN0ZXIgMCBsb3cgd29yZCAqLworCQkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgMCBsb3cgd29yZCAqLwogCQl2YWx1ZSA9IChzaG9ydCkoaW5zbi0+ZGF0YVsyXSAmIDB4RkZGRik7CiAJCW91dHcodmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTCwgc3ViZGV2X2NoYW5uZWwpKTsKIApAQCAtNjY2LDE3ICs2NzQsMTcgQEAKIAkJY21SZWcucmVnLnByZWxvYWRSZWdTZWwgPSAxOwkvKiAgUFIxICovCiAJCW91dHcoY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwgc3ViZGV2X2NoYW5uZWwpKTsKIAotCQkvKiAgTG9hZCB0aGUgcHJlLWxhb2QgcmVnaXN0ZXIgMSBoaWdoIHdvcmQgKi8KKwkJLyogIExvYWQgdGhlIHByZS1sb2FkIHJlZ2lzdGVyIDEgaGlnaCB3b3JkICovCiAJCXZhbHVlID0gKHNob3J0KSgoaW5zbi0+ZGF0YVszXSA+PiAxNikgJiAweEZGRkYpOwogCQlvdXR3KHZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DMEgsIHN1YmRldl9jaGFubmVsKSk7CiAKLQkJLyogIExvYWQgdGhlIHByZS1sYW9kIHJlZ2lzdGVyIDEgbG93IHdvcmQgKi8KKwkJLyogIExvYWQgdGhlIHByZS1sb2FkIHJlZ2lzdGVyIDEgbG93IHdvcmQgKi8KIAkJdmFsdWUgPSAoc2hvcnQpKGluc24tPmRhdGFbM10gJiAweEZGRkYpOwogCQlvdXR3KHZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CiAKIAkJLyogIFdyaXRlIHRoZSBDb3VudGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQkJaWYgKGluc24tPmRhdGFbM10gIT0gMCkgewotCQkJdmFsdWUgPSAoc2hvcnQpKGluc24tPmRhdGFbM10gJiAweEZGRkYpOworCQlpZiAoaW5zbi0+ZGF0YVs0XSAhPSAwKSB7CisJCQl2YWx1ZSA9IChzaG9ydCkoaW5zbi0+ZGF0YVs0XSAmIDB4RkZGRik7CiAJCQlvdXR3KHZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CiAJCX0KIAkJYnJlYWs7CkBAIC02OTgsMTEgKzcwNiwxMSBAQAogCQljbVJlZy5yZWcucHJlbG9hZFJlZ1NlbCA9IDA7CS8qICBQUjAgKi8KIAkJb3V0dyhjbVJlZy52YWx1ZSwgQUREUl9DSEFOX1JFRyhSRUdfQzBNLCBzdWJkZXZfY2hhbm5lbCkpOwogCi0JCS8qICBMb2FkIHRoZSBwcmUtbGFvZCByZWdpc3RlciAwIGhpZ2ggd29yZCAqLworCQkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgMCBoaWdoIHdvcmQgKi8KIAkJdmFsdWUgPSAoc2hvcnQpKChpbnNuLT5kYXRhWzJdID4+IDE2KSAmIDB4RkZGRik7CiAJCW91dHcodmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwSCwgc3ViZGV2X2NoYW5uZWwpKTsKIAotCQkvKiAgTG9hZCB0aGUgcHJlLWxhb2QgcmVnaXN0ZXIgMCBsb3cgd29yZCAqLworCQkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgMCBsb3cgd29yZCAqLwogCQl2YWx1ZSA9IChzaG9ydCkoaW5zbi0+ZGF0YVsyXSAmIDB4RkZGRik7CiAJCW91dHcodmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTCwgc3ViZGV2X2NoYW5uZWwpKTsKIApAQCAtNzExLDE3ICs3MTksMTcgQEAKIAkJY21SZWcucmVnLnByZWxvYWRSZWdTZWwgPSAxOwkvKiAgUFIxICovCiAJCW91dHcoY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwgc3ViZGV2X2NoYW5uZWwpKTsKIAotCQkvKiAgTG9hZCB0aGUgcHJlLWxhb2QgcmVnaXN0ZXIgMSBoaWdoIHdvcmQgKi8KKwkJLyogIExvYWQgdGhlIHByZS1sb2FkIHJlZ2lzdGVyIDEgaGlnaCB3b3JkICovCiAJCXZhbHVlID0gKHNob3J0KSgoaW5zbi0+ZGF0YVszXSA+PiAxNikgJiAweEZGRkYpOwogCQlvdXR3KHZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DMEgsIHN1YmRldl9jaGFubmVsKSk7CiAKLQkJLyogIExvYWQgdGhlIHByZS1sYW9kIHJlZ2lzdGVyIDEgbG93IHdvcmQgKi8KKwkJLyogIExvYWQgdGhlIHByZS1sb2FkIHJlZ2lzdGVyIDEgbG93IHdvcmQgKi8KIAkJdmFsdWUgPSAoc2hvcnQpKGluc24tPmRhdGFbM10gJiAweEZGRkYpOwogCQlvdXR3KHZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CiAKIAkJLyogIFdyaXRlIHRoZSBDb3VudGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQkJaWYgKGluc24tPmRhdGFbM10gIT0gMCkgewotCQkJdmFsdWUgPSAoc2hvcnQpKGluc24tPmRhdGFbM10gJiAweEZGRkYpOworCQlpZiAoaW5zbi0+ZGF0YVs0XSAhPSAwKSB7CisJCQl2YWx1ZSA9IChzaG9ydCkoaW5zbi0+ZGF0YVs0XSAmIDB4RkZGRik7CiAJCQlvdXR3KHZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CiAJCX0KIAkJYnJlYWs7CkBAIC03NDEsNiArNzQ5LDcgQEAKIHsKIAlpbnQgc3ViZGV2X2NoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsJLyogIFVucGFjayBjaGFuc3BlYyAqLwogCXNob3J0IHZhbHVlOworCXVuaW9uIGNtUmVnIGNtUmVnOwogCiAJcHJpbnRrKCJzNTI2OiBHUENUX0lOU05fV1JJVEUgb24gY2hhbm5lbCAlZFxuIiwgc3ViZGV2X2NoYW5uZWwpOwogCWNtUmVnLnZhbHVlID0gaW53KEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwgc3ViZGV2X2NoYW5uZWwpKTsKQEAgLTc3NSw5ICs3ODQsOCBAQAogCQkJKGRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdKS5kYXRhWzFdID0KIAkJCSAgICBpbnNuLT5kYXRhWzFdOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKCIlZCBcdCAlZFxuIiwgaW5zbi0+ZGF0YVsxXSwgaW5zbi0+ZGF0YVsyXSk7Ci0JCQlwcmludGsKLQkJCSAgICAoInM1MjY6IElOU05fV1JJVEU6IFBURzogUHJvYmxlbSB3aXRoIFB1bHNlIHBhcmFtc1xuIik7CisJCQlwcmludGsoInM1MjY6IElOU05fV1JJVEU6IFBURzogUHJvYmxlbSB3aXRoIFB1bHNlIHBhcmFtcyAtPiAlZCAlZFxuIiwKKwkJCQlpbnNuLT5kYXRhWzBdLCBpbnNuLT5kYXRhWzFdKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTk0OSw3ICs5NTcsNyBAQAogCWRhdGFbMV0gPSBpbncoQUREUl9SRUcoUkVHX0RJTykpICYgMHhGRjsJLyogIGxvdyA4IGJpdHMgYXJlIHRoZSBkYXRhICovCiAJLyogb3Igd2UgY291bGQganVzdCByZXR1cm4gdGhlIHNvZnR3YXJlIGNvcHkgb2YgdGhlIG91dHB1dCB2YWx1ZXMgaWYKIAkgKiBpdCB3YXMgYSBwdXJlbHkgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlICovCi0JLyogZGF0YVsxXT1zLT5zdGF0ZTsgKi8KKwkvKiBkYXRhWzFdPXMtPnN0YXRlICYgMHhGRjsgKi8KIAogCXJldHVybiAyOwogfQpAQCAtOTU5LDI4ICs5NjcsMzMgQEAKIAkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXNob3J0IHZhbHVlOworCWludCBncm91cCwgbWFzazsKIAogCXByaW50aygiUzUyNiBESU8gaW5zbl9jb25maWdcbiIpOwogCi0JaWYgKGluc24tPm4gIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2YWx1ZSA9IGludyhBRERSX1JFRyhSRUdfRElPKSk7Ci0KIAkvKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKIAkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCiAJICogY29udGFpbnMgdGhlIGNoYW5uZWwgdG8gYmUgY2hhbmdlZCwgYW5kIGRhdGFbMF0gY29udGFpbnMgdGhlCiAJICogdmFsdWUgQ09NRURJX0lOUFVUIG9yIENPTUVESV9PVVRQVVQuICovCiAKLQlpZiAoZGF0YVswXSA9PSBDT01FRElfT1VUUFVUKSB7Ci0JCXZhbHVlIHw9IDEgPDwgKGNoYW4gKyAxMCk7CS8qICBiaXQgMTAvMTEgc2V0IHRoZSBncm91cCAxLzIncyBtb2RlICovCi0JCXMtPmlvX2JpdHMgfD0gKDB4RiA8PCBjaGFuKTsKLQl9IGVsc2UgewotCQl2YWx1ZSAmPSB+KDEgPDwgKGNoYW4gKyAxMCkpOwkvKiAgMSBpcyBvdXRwdXQsIDAgaXMgaW5wdXQuICovCi0JCXMtPmlvX2JpdHMgJj0gfigweEYgPDwgY2hhbik7CisJZ3JvdXAgPSBjaGFuID4+IDI7CisJbWFzayA9IDB4RiA8PCAoZ3JvdXAgPDwgMik7CisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fT1VUUFVUOgorCQlzLT5zdGF0ZSB8PSAxIDw8IChncm91cCArIDEwKTsgIC8vIGJpdCAxMC8xMSBzZXQgdGhlIGdyb3VwIDEvMidzIG1vZGUKKwkJcy0+aW9fYml0cyB8PSBtYXNrOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0RJT19JTlBVVDoKKwkJcy0+c3RhdGUgJj0gfigxIDw8IChncm91cCArIDEwKSk7Ly8gMSBpcyBvdXRwdXQsIDAgaXMgaW5wdXQuCisJCXMtPmlvX2JpdHMgJj0gfm1hc2s7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX1FVRVJZOgorCQlkYXRhWzFdID0gKHMtPmlvX2JpdHMgJiBtYXNrKSA/IENPTUVESV9PVVRQVVQgOiBDT01FRElfSU5QVVQ7CisJCXJldHVybiBpbnNuLT5uOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlvdXR3KHZhbHVlLCBBRERSX1JFRyhSRUdfRElPKSk7CisJb3V0dyhzLT5zdGF0ZSwgQUREUl9SRUcoUkVHX0RJTykpOwogCiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYwppbmRleCBhMjE5Njc5Li44MmFhODZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMKQEAgLTM1LDYgKzM1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFzbS90ZXJtaW9zLmg+CiAjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Nvd2xvb3AvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jb3dsb29wL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDJhMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Nvd2xvb3AvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLWNvbmZpZyBDT1dMT09QCi0JdHJpc3RhdGUgImNvcHktb24td3JpdGUgcHNldWRvIEJsb2NrIERyaXZlciIKLQlkZXBlbmRzIG9uIEJMT0NLCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgQ293bG9vcCBpcyBhICJjb3B5LW9uLXdyaXRlIiBwc2V1ZG8gYmxvY2sgZHJpdmVyLiBJdCBjYW4gYmUKLQkgIHN0YWNrZWQgb24gdG9wIG9mIGEgInJlYWwiIGJsb2NrIGRyaXZlciwgYW5kIGNhdGNoZXMgYWxsIHdyaXRlCi0JICBvcGVyYXRpb25zIG9uIHRoZWlyIHdheSBmcm9tIHRoZSBmaWxlIHN5c3RlbXMgbGF5ZXIgYWJvdmUgdG8KLQkgIHRoZSByZWFsIGRyaXZlciBiZWxvdywgZWZmZWN0aXZlbHkgc2hpZWxkaW5nIHRoZSBsb3dlciBkcml2ZXIKLQkgIGZyb20gdGhvc2Ugd3JpdGUgYWNjZXNzZXMuIFRoZSByZXF1ZXN0cyBhcmUgdGhlbiBkaXZlcnRlZCB0bwotCSAgYW4gb3JkaW5hcnkgZmlsZSwgbG9jYXRlZCBzb21ld2hlcmUgZWxzZSAoY29uZmlndXJhYmxlKS4gTGF0ZXIKLQkgIHJlYWQgcmVxdWVzdHMgYXJlIGNoZWNrZWQgdG8gc2VlIHdoZXRoZXIgdGhleSBjYW4gYmUgc2VydmljZWQKLQkgIGJ5IHRoZSAicmVhbCIgYmxvY2sgZHJpdmVyIGJlbG93LCBvciBtdXN0IGJlIHB1bGxlZCBpbiBmcm9tCi0JICB0aGUgZGl2ZXJ0ZWQgbG9jYXRpb24uIE1vcmUgaW5mb3JtYXRpb24gYW5kIHVzZXJzcGFjZSB0b29scyB0bwotCSAgdXNlIHRoZSBkcml2ZXIgYXJlIG9uIHRoZSBwcm9qZWN0J3Mgd2Vic2l0ZQotCSAgaHR0cDovL3d3dy5BVENvbXB1dGluZy5ubC9jb3dsb29wLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Nvd2xvb3AvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY293bG9vcC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2YjgxYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY293bG9vcC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9iai0kKENPTkZJR19DT1dMT09QKQkrPSBjb3dsb29wLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb3dsb29wL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvY293bG9vcC9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk5ZDFjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb3dsb29wL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1UT0RPOgotCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcwotCS0gcnVuIHNwYXJzZSB0byBlbnN1cmUgY2xlYW4KLQktIGZpeCB1cCAzMi82NGJpdCBpb2N0bCBpc3N1ZXMKLQktIG1vdmUgcHJvYyBmaWxlIHVzYWdlIHRvIGRlYnVnZnMKLQktIGF1ZGl0IGlvY3RscwotCS0gYWRkIGRvY3VtZW50YXRpb24KLQktIGdldCBsaW51eC1mc2RldmVsIHRvIHJldmlldyBpdAotCi1QbGVhc2Ugc2VuZCBwYXRjaGVzIHRvICJILkouIFRob21hc3NlbiIgPGhqdEBBVENvbXB1dGluZy5ubD4gYW5kCi1HcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBzdXNlLmRlPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Nvd2xvb3AvY293bG9vcC5jIGIvZHJpdmVycy9zdGFnaW5nL2Nvd2xvb3AvY293bG9vcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzFjNzQzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb3dsb29wL2Nvd2xvb3AuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NDIgKzAsMCBAQAotLyoKLSoqICAgICAgIENPV0xPT1AgYmxvY2sgZGV2aWNlIGRyaXZlciAoMi42IGtlcm5lbCBjb21wbGlhbnQpCi0qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiogUmVhZC13cml0ZSBsb29wLWRyaXZlciB3aXRoIGNvcHktb24td3JpdGUgZnVuY3Rpb25hbGl0eS4KLSoqCi0qKiBTeW5vcHNpczoKLSoqCi0qKiAgICAgbW9kcHJvYmUgY293bG9vcCBbbWF4Y293cz0uLl0gW3Jkb2ZpbGU9Li4uLi4gY293ZmlsZT0uLi4uIFtvcHRpb249cl1dCi0qKgotKiogRGVmaW5pdGlvbiBvZiBudW1iZXIgb2YgY29uZmlndXJlZCBjb3dkZXZpY2VzOgotKiogICBtYXhjb3dzPQludW1iZXIgb2YgY29uZmlndXJlZCBjb3dkZXZpY2VzIChkZWZhdWx0OiAxNikKLSoqIChkbyBub3QgY29uZnVzZSB0aGlzIHdpdGggTUFYQ09XUzogYWJzb2x1dGUgbWF4aW11bSBhcyBjb21waWxlZCkKLSoqCi0qKiBPbmUgcGFpciBvZiBmaWxlbmFtZXMgY2FuIGJlIHN1cHBsaWVkIGR1cmluZyBpbnNtb2QvbW9kcHJvYmUgdG8gb3BlbgotKiogdGhlIGZpcnN0IGNvd2RldmljZToKLSoqICAgcmRvZmlsZT0JcmVhZC1vbmx5IGZpbGUgKG9yIGZpbGVzeXN0ZW0pCi0qKiAgIGNvd2ZpbGU9CXN0b3JhZ2Utc3BhY2UgZm9yIG1vZGlmaWVkIGJsb2NrcyBvZiByZWFkLW9ubHkgZmlsZShzeXN0ZW0pCi0qKiAgIG9wdGlvbj1yCXJlcGFpciBjb3dmaWxlIGF1dG9tYXRpY2FsbHkgaWYgaXQgYXBwZWFycyB0byBiZSBkaXJ0eQotKioKLSoqIE90aGVyIGNvd2RldmljZXMgY2FuIGJlIGFjdGl2YXRlZCB2aWEgdGhlIGNvbW1hbmQgImNvd2RldiIKLSoqIHdoZW5ldmVyIHRoZSBjb3dsb29wLWRyaXZlciBpcyBsb2FkZWQuCi0qKgotKiogVGhlIHJlYWQtb25seSBmaWxlIG1heSBiZSBvZiB0eXBlICdyZWd1bGFyJyBvciAnYmxvY2stZGV2aWNlJy4KLSoqCi0qKiBUaGUgY293ZmlsZSBtdXN0IGJlIG9mIHR5cGUgJ3JlZ3VsYXInLgotKiogSWYgYW4gZXhpc3RpbmcgcmVndWxhciBmaWxlIGlzIHVzZWQgYXMgY293ZmlsZSwgaXRzIGNvbnRlbnRzIHdpbGwgYmUKLSoqIHVzZWQgYWdhaW4gZm9yIHRoZSBjdXJyZW50IHJlYWQtb25seSBmaWxlLiBXaGVuIHRoZSBjb3dmaWxlIGhhcyBub3QgYmVlbgotKiogY2xvc2VkIHByb3Blcmx5IGR1cmluZyBhIHByZXZpb3VzIHNlc3Npb24gKGkuZS4gcm1tb2QgY293bG9vcCksIHRoZQotKiogY293bG9vcC1kcml2ZXIgcmVmdXNlcyB0byBvcGVuIGl0IHVubGVzcyB0aGUgcGFyYW1ldGVyICJvcHRpb249ciIgaXMKLSoqIHNwZWNpZmllZC4KLSoqCi0qKiBMYXlvdXQgb2YgY293ZmlsZToKLSoqCi0qKiAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKioJfCAgICAgICBjb3cgaGVhZCBibG9jayAgICAgICAgfCAgIE1BUFVOSVQgYnl0ZXMKLSoqCXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSoqCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBNQVBVTklUIGJ5dGVzCi0qKgl8LS0tICAgICAgICAgICAgICAgICAgICAgICAtLS18Ci0qKgl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgTUFQVU5JVCBieXRlcwotKioJfC0tLSAgICAgICAgICAgICAgICAgICAgICAgLS0tfAotKioJfCAgICAgIHVzZWQtYmxvY2sgYml0bWFwICAgICAgfCAgIE1BUFVOSVQgYnl0ZXMKLSoqCXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSoqCXwgIGdhcCB0byBhbGlnbiBzdGFydC1vZmZzZXQgIHwKLSoqCXwgICAgICAgIHRvIDRLIG11bHRpcGxlICAgICAgIHwKLSoqCXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgIDwtLS0tIHN0YXJ0LW9mZnNldCBjb3cgYmxvY2tzCi0qKgl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiAgICAgIHwgICAgd3JpdHRlbiBjb3cgYmxvY2tzICAgICAgIHwgICBNQVBVTklUIGJ5dGVzCi0qKiAgICAgIHwgICAgICAgICAgLi4uLi4gICAgICAgICAgICAgIHwKLSoqCi0qKiAJY293aGVhZCBibG9jazoKLSoqICAgCSAgLSBjb250YWlucyBnZW5lcmFsIGluZm8gYWJvdXQgdGhlIHJkb2ZpbGUgd2hpY2ggaXMgcmVsYXRlZAotKiogCSAgICB0byB0aGlzIGNvd2ZpbGUKLSoqCi0qKiAJdXNlZC1ibG9jayBiaXRtYXA6Ci0qKiAJICAtIGNvbnRhaW5zIG9uZSBiaXQgcGVyIGJsb2NrIHdpdGggYSBzaXplIG9mIE1BUFVOSVQgYnl0ZXMKLSoqIAkgIC0gYml0LXZhbHVlICcxJyA9IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gb24gY293Ci0qKiAJICAgICAgICAgICAgICAnMCcgPSBibG9jayB1bnVzZWQgb24gY293Ci0qKiAJICAtIHRvdGFsIGJpdG1hcCByb3VuZGVkIHRvIG11bHRpcGxlcyBvZiBNQVBVTklUCi0qKgotKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiogQXV0aG9yOiAgICAgICAgICAgICBHZXJsb2YgTGFuZ2V2ZWxkIC0gQVQgQ29tcHV0aW5nIChNYXJjaCAyMDAzKQotKiogQ3VycmVudCBtYWludGFpbmVyOiBIZW5kcmlrLUphbiBUaG9tYXNzZW4gLSBBVCBDb21wdXRpbmcgKFN1bW1lciAyMDA2KQotKiogRW1haWw6ICAgICAgICAgICAgICBoanRAQVRDb21wdXRpbmcubmwKLSoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqIENvcHlyaWdodCAoQykgMjAwMy0yMDA5IEFUIENvbnN1bHRhbmN5Ci0qKgotKiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSoqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotKiogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotKiogbGF0ZXIgdmVyc2lvbi4KLSoqCi0qKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0qKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0qKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0qKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qKgotKiogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0qKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogTWFqb3IgbW9kaWZpY2F0aW9uczoKLSoqCi0qKiAJMjAwNDA1CVBvcnRlZCB0byBrZXJuZWwtdmVyc2lvbiAyLjYJCUhlbmRyaWstSmFuIFRob21hc3NlbgotKioJMjAwNDA1CUFkZGVkIGNvd2hlYWQgdG8gY293ZmlsZSB0byBnYXJhbnRlZQotKioJCWNvbnNpc3RlbmN5IHdpdGggcmVhZC1vbmx5IGZpbGUJCUdlcmxvZiBMYW5nZXZlbGQKLSoqCTIwMDQwNQlQb3N0cG9uZWQgZmx1c2hpbmcgb2YgYml0bWFwcyB0byBpbXByb3ZlCi0qKgkJcGVyZm9ybWFuY2UuIAkJCQlHZXJsb2YgTGFuZ2V2ZWxkCi0qKgkyMDA0MDUJSW5saW5lIHJlY292ZXJ5IGZvciBkaXJ0eSBjb3dmaWxlcy4JR2VybG9mIExhbmdldmVsZAotKioJMjAwNTAyCVJlZGVzaWduIHRvIHN1cHBvcnQgbW9yZSBjb3dkZXZpY2VzLglHZXJsb2YgTGFuZ2V2ZWxkCi0qKgkyMDA1MDIJU3VwcG9ydCBkZXZpY2VzL2ZpbGUgPiAyIEdieXRlcy4JR2VybG9mIExhbmdldmVsZAotKioJMjAwNTA3CUNoZWNrIGZvciBmcmVlIHNwYWNlIHRvIGV4cGFuZCBjb3dmaWxlLglHZXJsb2YgTGFuZ2V2ZWxkCi0qKgkyMDA5MDIgIFVwZ3JhZGUgZm9yIGtlcm5lbCAyLjYuMjggICAgICAgICAgICAgICBIZW5kcmlrLUphbiBUaG9tYXNzZW4KLSoqCi0qKiBJbnNwaXJlZCBieQotKiogICAgbG9vcC5jICBieSBUaGVvZG9yZSBUcydvIGFuZAotKiogICAgY2xvb3AuYyBieSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIEtsYXVzIEtub3BwZXIuCi0qKgotKiogRGVzaWduLWNvbnNpZGVyYXRpb25zOgotKioKLSoqICAgRm9yIHRoZSBmaXJzdCBleHBlcmltZW50cyB3aXRoIHRoZSBjb3dsb29wLWRyaXZlciwgdGhlIHJlcXVlc3QtcXVldWUKLSoqICAgbWFkZSB1c2Ugb2YgdGhlIGRvX2dlbmVyaWNfZmlsZV9yZWFkKCkgd2hpY2ggd29ya2VkIGZpbmUgZXhjZXB0Ci0qKiAgIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGNsb29wLWRyaXZlcjsgdGhhdCBjb21iaW5hdGlvbgotKiogICByZXN1bHRlZCBpbiBhIG5vbi1pbnRlcnJ1cHRpYmxlIGhhbmd1cCBvZiB0aGUgc3lzdGVtIGR1cmluZwotKiogICBoZWF2eSBsb2FkLiBPdGhlciBleHBlcmltZW50cyB1c2luZyB0aGUgYG1ha2VfcmVxdWVzdCcgaW50ZXJmYWNlIGFsc28KLSoqICAgcmVzdWx0ZWQgaW4gdW5wcmVkaWN0YWJsZSBzeXN0ZW0gaGFuZ3VwcyAod2l0aCBwcm9wZXIgdXNlIG9mIHNwaW5sb2NrcykuCi0qKgotKiogICBUbyBvdmVyY29tZSB0aGVzZSBwcm9ibGVtcywgdGhlIGNvd2xvb3AtZHJpdmVyIHN0YXJ0cyBhIGtlcm5lbC10aHJlYWQKLSoqICAgZm9yIGV2ZXJ5IGFjdGl2ZSBjb3dkZXZpY2UuCi0qKiAgIEFsbCByZWFkLSBhbmQgd3JpdGUtcmVxdWVzdCBvbiB0aGUgcmVhZC1vbmx5IGZpbGUgYW5kIGNvcHktb24td3JpdGUgZmlsZQotKiogICBhcmUgaGFuZGxlZCBpbiB0aGUgY29udGV4dCBvZiB0aGF0IHRocmVhZC4KLSoqICAgQSBzY2hlbWUgaGFzIGJlZW4gZGVzaWduZWQgdG8gd2FrZXVwIHRoZSBrZXJuZWwtdGhyZWFkIGFzCi0qKiAgIHNvb24gYXMgSS9PLXJlcXVlc3RzIGFyZSBhdmFpbGFibGUgaW4gdGhlIHJlcXVlc3QtcXVldWU7IHRoaXMgdGhyZWFkCi0qKiAgIGhhbmRsZXMgdGhlIHJlcXVlc3RzIG9uZS1ieS1vbmUgYnkgY2FsbGluZyB0aGUgcHJvcGVyIHJlYWQtIG9yCi0qKiAgIHdyaXRlLWZ1bmN0aW9uIHJlbGF0ZWQgdG8gdGhlIG9wZW4gcmVhZC1vbmx5IGZpbGUgb3IgY29weS1vbi13cml0ZSBmaWxlLgotKiogICBXaGVuIGFsbCBwZW5kaW5nIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkLCB0aGUga2VybmVsLXRocmVhZCBnb2VzCi0qKiAgIGJhY2sgdG8gc2xlZXAtc3RhdGUuCi0qKiAgIFRoaXMgYXBwcm9hY2ggcmVxdWlyZXMgc29tZSBhZGRpdGlvbmFsIGNvbnRleHQtc3dpdGNoZXM7IGhvd2V2ZXIgdGhlCi0qKiAgIHBlcmZvcm1hbmNlIGxvc3MgZHVyaW5nIGhlYXZ5IEkvTyBpcyBsZXNzIHRoYW4gMyUuCi0qKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBUaGUgZm9sbG93aW5nIGlzIHRoZSBjb3dsb29wIHBhY2thZ2UgdmVyc2lvbiBudW1iZXIuIEl0IG11c3QgYmUKLSAgIGlkZW50aWNhbCB0byB0aGUgY29udGVudCBvZiB0aGUgaW5jbHVkZS1maWxlICJ2ZXJzaW9uLmgiIHRoYXQgaXMKLSAgIHVzZWQgaW4gYWxsIHN1cHBvcnRpbmcgdXRpbGl0aWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotY2hhciByZXZpc2lvbltdID0gIiRSZXZpc2lvbjogMy4xICQiOyAvKiBjb3dsb19pbml0X21vZHVsZSgpIGhhcwotCQkJICAgICBhc3N1bXB0aW9ucyBhYm91dCB0aGlzIHN0cmluZydzIGZvcm1hdCAgICovCi0KLS8qIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIG51bWJlcnMgYXJlICpub3QqIHRoZSBjb3dsb29wIHBhY2thZ2UgdmVyc2lvbgotICAgbnVtYmVycywgYnV0IHNlcGFyYXRlIHJldmlzaW9uIGhpc3RvcnkgbnVtYmVycyB0byB0cmFjayB0aGUKLSAgIG1vZGlmaWNhdGlvbnMgb2YgdGhpcyBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlOiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogJExvZzogY293bG9vcC5jLHYgJAotKioKLSoqIFJldmlzaW9uIDEuMzAgIDIwMDkvMDIvMDggaGp0Ci0qKiBJbnRlZ3JhdGVkIGVhcmxpZXIgZml4ZXMKLSoqIFVwZ3JhZGVkIHRvIGtlcm5lbCAyLjYuMjggKHRoYW5rcyBKZXJvbWUgUG91bGluKQotKioKLSoqIFJldmlzaW9uIDEuMjkgIDIwMDYvMTIvMDMgMjI6MTI6MDAgIGhqdAotKiogY2hhbmdlZCAnY293ZGV2bG9jaycgZnJvbSBzcGlubG9jayB0byBzZW1hcGhvcmUsIHRvIGF2b2lkCi0qKiAic2NoZWR1bGluZyB3aGlsZSBhdG9taWMiLiBDb250cmlidXRlZCBieSBKdWVyZ2VuIENocmlzdC4KLSoqIEFkZGVkIHZlcnNpb24uaCBhZ2FpbgotKioKLSoqIFJldmlzaW9uIDEuMjggIDIwMDYvMDgvMTYgMTY6MDA6MDAgIGhqdAotKiogbWFsbG9jIGVhY2ggaW5kaXZpZHVhbCBjb3dsb29wZGV2aWNlIHN0cnVjdCBzZXBhcmF0ZWx5Ci0qKgotKiogUmV2aXNpb24gMS4yNyAgMjAwNi8wMy8xNCAxNDo1NzowMyAgcm9vdAotKiogUmVtb3ZlZCBpbmNsdWRlIHZlcnNpb24uaAotKioKLSoqIFJldmlzaW9uIDEuMjYgIDIwMDUvMDgvMDggMTE6MjI6NDggIHJvb3QKLSoqIEltcGxlbWVudCBwb3NzaWJpbGl0eSB0byBjbG9zZSBhIGNvdyBmaWxlIG9yIHJlb3BlbiBhIGNvd2ZpbGUgcmVhZC1vbmx5LgotKioKLSoqIFJldmlzaW9uIDEuMjUgIDIwMDUvMDgvMDMgMTQ6MDA6MzkgIHJvb3QKLSoqIEFkZGVkIG1vZGluZm8gaW5mbyB0byBkcml2ZXIuCi0qKgotKiogUmV2aXNpb24gMS4yNCAgMjAwNS8wNy8yMSAwNjoxNDo1MyAgcm9vdAotKiogQ29zbWV0aWMgY2hhbmdlcyBzb3VyY2UgY29kZS4KLSoqCi0qKiBSZXZpc2lvbiAxLjIzICAyMDA1LzA3LzIwIDEzOjA3OjMyICByb290Ci0qKiBTdXBwbHkgaW9jdGwgdG8gd3JpdGUgd2F0Y2hkb2cgcHJvZ3JhbSB0byByZWFjdCBvbiBsYWNrIG9mIGNvd2ZpbGUgc3BhY2UuCi0qKgotKiogUmV2aXNpb24gMS4yMiAgMjAwNS8wNy8yMCAwNzo1MzozNCAgcm9vdAotKiogUmVndWxhciB2ZXJpZmljYXRpb24gb2YgZnJlZSBzcGFjZSBpbiBmaWxlc3lzdGVtIGhvbGRpbmcgdGhlIGNvd2ZpbGUKLSoqIChnaXZlIHdhcm5pbmdzIHdoZW5ldmVyIHNwYWNlIGlzIGFsbW9zdCBleGhhdXN0ZWQpLgotKiogVGVybWlub2xvZ3kgY2hhbmdlOiBjaGVja3N1bSByZW5hbWVkIHRvIGZpbmdlcnByaW50LgotKioKLSoqIFJldmlzaW9uIDEuMjEgIDIwMDUvMDcvMTkgMDk6MjE6NTIgIHJvb3QKLSoqIFJlbW92aW5nIG1heGltdW0gbGltaXQgb2YgMTYgR2IgcGVyIGNvd2RldmljZS4KLSoqCi0qKiBSZXZpc2lvbiAxLjIwICAyMDA1LzA3LzE5IDA3OjUwOjMzICByb290Ci0qKiBNaW5vciBidWdmaXhlcyBhbmQgY29zbWV0aWMgY2hhbmdlcy4KLSoqCi0qKiBSZXZpc2lvbiAxLjE5ICAyMDA1LzA2LzEwIDEyOjI5OjU1ICByb290Ci0qKiBSZW1vdmVkIGxvY2svdW5sb2NrIG9wZXJhdGlvbiBmcm9tIGNvd2xvX29wZW4oKS4KLSoqCi0qKiBSZXZpc2lvbiAxLjE4ICAyMDA1LzA1LzA5IDEyOjU2OjI2ICByb290Ci0qKiBBbGxvdyBhIGNvd2RldmljZSB0byBiZSBvcGVuIG1vcmUgdGhhbiBvbmNlCi0qKiAobmVlZGVkIGZvciBzdXBwb3J0IG9mIFJlaXNlckZTIGFuZCBYRlMpLgotKioKLSoqIFJldmlzaW9uIDEuMTcgIDIwMDUvMDMvMTcgMTQ6MzY6MTYgIHJvb3QKLSoqIEZpeGVkIHNvbWUgbGljZW5zZSBpc3N1ZXMuCi0qKgotKiogUmV2aXNpb24gMS4xNiAgMjAwNS8wMy8wNyAxNDo0MjowNSAgcm9vdAotKiogT25seSBhbGxvdyBvbmUgcGFyYWxsZWwgb3BlbiBwZXIgY293ZGV2aWNlLgotKioKLSoqIFJldmlzaW9uIDEuMTUgIDIwMDUvMDIvMTggMTE6NTI6MDQgIGdlcmxvZgotKiogUmVkZXNpZ24gdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGNvd2RldmljZSA+IDIgR2Igc3BhY2UuCi0qKgotKiogUmV2aXNpb24gMS4xNCAgMjAwNC8wOC8xNyAxNDoxOToxNiAgZ2VybG9mCi0qKiBNb2RpZmllZCBvdXRwdXQgb2YgL3Byb2MvY293bG9vcC4KLSoqCi0qKiBSZXZpc2lvbiAxLjEzICAyMDA0LzA4LzE2IDA3OjIxOjEwICBnZXJsb2YKLSoqIFNlcGFyYXRlIHN0YXRpc3RpY2FsIGNvdW50ZXIgZm9yIHJlYWQgb24gcmRvZmlsZSBhbmQgY293ZmlsZS4KLSoqCi0qKiBSZXZpc2lvbiAxLjEyICAyMDA0LzA4LzExIDA2OjUyOjExICBnZXJsb2YKLSoqIE1vZGlmaWVkIG1lc3NhZ2VzLgotKioKLSoqIFJldmlzaW9uIDEuMTEgIDIwMDQvMDgvMTEgMDY6NDQ6MTEgIGdlcmxvZgotKiogTW9kaWZpZWQgbG9nIG1lc3NhZ2VzLgotKioKLSoqIFJldmlzaW9uIDEuMTAgIDIwMDQvMDgvMTAgMTI6Mjc6MjcgIGdlcmxvZgotKiogQ29zbWV0aWMgY2hhbmdlcy4KLSoqCi0qKiBSZXZpc2lvbiAxLjkgIDIwMDQvMDgvMDkgMTE6NDM6MzcgIGdlcmxvZgotKiogUmVtb3ZlZCBkb3VibGUgZGVmaW5pdGlvbiBvZiBtYWpvciBudW1iZXIgKENPV01BSk9SKS4KLSoqCi0qKiBSZXZpc2lvbiAxLjggIDIwMDQvMDgvMDkgMDg6MDM6MzkgIGdlcmxvZgotKiogQ2xlYW51cCBvZiBtZXNzYWdlcy4KLSoqCi0qKiBSZXZpc2lvbiAxLjcgIDIwMDQvMDUvMjcgMDY6Mzc6MzMgIGdlcmxvZgotKiogTW9kaWZpZWQgL3Byb2MgbWVzc2FnZS4KLSoqCi0qKiBSZXZpc2lvbiAxLjYgIDIwMDQvMDUvMjYgMjE6MjM6MjggIGdlcmxvZgotKiogTW9kaWZpZWQgL3Byb2Mgb3V0cHV0LgotKioKLSoqIFJldmlzaW9uIDEuNSAgMjAwNC8wNS8yNiAxMzoyMzozNCAgZ2VybG9mCi0qKiBTdXBwb3J0IGNvd3N5bmMgdG8gZm9yY2UgZmx1c2hpbmcgdGhlIGJpdG1hcHMgYW5kIGNvd2hlYWQuCi0qKgotKiogUmV2aXNpb24gMS40ICAyMDA0LzA1LzI2IDExOjExOjEwICBnZXJsb2YKLSoqIFVwZGF0ZWQgdGhlIGNvbW1lbnQgdG8gdGhlIGFjdHVhbCBzaXR1YXRpb24uCi0qKgotKiogUmV2aXNpb24gMS4zICAyMDA0LzA1LzI2IDEwOjUwOjAwICBnZXJsb2YKLSoqIEltcGxlbWVudGVkIHJlY292ZXJ5LW9wdGlvbi4KLSoqCi0qKiBSZXZpc2lvbiAxLjIgIDIwMDQvMDUvMjUgMTU6MTQ6NDEgIGdlcmxvZgotKiogTW9kaWZpZWQgYml0bWFwIGZsdXNoaW5nIHN0cmF0ZWd5LgotKioKLSovCi0KLSNkZWZpbmUgQ09XTUFKT1IJMjQxCi0KLS8vICNkZWZpbmUgQ09XREVCVUcKLQotI2lmZGVmIAlDT1dERUJVRwotI2RlZmluZSBERUJVR1AJCXByaW50awotI2RlZmluZSBEQ09XCQlLRVJOX0FMRVJUCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCB4Li4uKQotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+Ci0jaWZuZGVmIEFVVE9DT05GX0lOQ0xVREVECi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgotI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+Ci0KLSNpbmNsdWRlICJjb3dsb29wLmgiCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLS8qIE1PRFVMRV9BVVRIT1IoIkdlcmxvZiBMYW5nZXZlbGQgPGdlcmxvZkBBVENvbXB1dGluZy5ubD4iKTsgICAgIG9ic29sZXRlIGFkZHJlc3MgKi8KLU1PRFVMRV9BVVRIT1IoIkhlbmRyaWstSmFuIFRob21hc3NlbiA8aGp0QEFUQ29tcHV0aW5nLm5sPiIpOyAvKiBjdXJyZW50IG1haW50YWluZXIgKi8KLU1PRFVMRV9ERVNDUklQVElPTigiQ29weS1vbi13cml0ZSBsb29wIGRyaXZlciIpOwotTU9EVUxFX1BBUk1fREVTQyhtYXhjb3dzLCAiIE51bWJlciBvZiBjb25maWd1cmVkIGNvd2RldmljZXMgKGRlZmF1bHQgMTYpIik7Ci1NT0RVTEVfUEFSTV9ERVNDKHJkb2ZpbGUsICIgUmVhZC1vbmx5IGZpbGUgZm9yIC9kZXYvY293LzAiKTsKLU1PRFVMRV9QQVJNX0RFU0MoY293ZmlsZSwgIiBDb3dmaWxlIGZvciAvZGV2L2Nvdy8wIik7Ci1NT0RVTEVfUEFSTV9ERVNDKG9wdGlvbiwgIiAgUmVwYWlyIGNvd2ZpbGUgaWYgaW5jb25zaXN0ZW50OiBvcHRpb249ciIpOwotCi0jZGVmaW5lIERFVklDRV9OQU1FCSJjb3ciCi0KLSNkZWZpbmUJREZMQ09XUwkJMTYJCS8qIGRlZmF1bHQgY293bG9vcCBkZXZpY2VzCSovCi0KLXN0YXRpYyBpbnQgbWF4Y293cyA9IERGTENPV1M7Ci1tb2R1bGVfcGFyYW0obWF4Y293cywgaW50LCAwKTsKLXN0YXRpYyBjaGFyICpyZG9maWxlID0gIiI7Ci1tb2R1bGVfcGFyYW0ocmRvZmlsZSwgY2hhcnAsIDApOwotc3RhdGljIGNoYXIgKmNvd2ZpbGUgPSAiIjsKLW1vZHVsZV9wYXJhbShjb3dmaWxlLCBjaGFycCwgMCk7Ci1zdGF0aWMgY2hhciAqb3B0aW9uID0gIiI7Ci1tb2R1bGVfcGFyYW0ob3B0aW9uLCBjaGFycCwgMCk7Ci0KLS8qCi0qKiBwZXIgY293ZGV2aWNlIHNldmVyYWwgYml0bWFwIGNodW5rcyBhcmUgYWxsb3dlZCBvZiBNQVBDSFVOS1NaIGVhY2gKLSoqCi0qKiBlYWNoIGJpdG1hcCBjaHVuayBjYW4gZGVzY3JpYmUgTUFQQ0hVTktTWiAqIDggKiBNQVBVTklUIGJ5dGVzIG9mIGRhdGEKLSoqIHN1cHBvc2U6Ci0qKglNQVBDSFVOS1NaIDQwOTYgYW5kIE1BUFVOSVQgMTAyNCAtLT4gNDA5NiAqIDggKiAxMDI0ID0gMzIgTWIgcGVyIGNodW5rCi0qLwotI2RlZmluZQlNQVBDSFVOS1NaCTQwOTYJLyogI2J5dGVzIHBlciBiaXRtYXAgY2h1bmsgIChkbyBub3QgY2hhbmdlKSAgKi8KLQotI2RlZmluZSBTUENNSU5CTEsJMTAwCS8qIHNwYWNlIHRocmVzaG9sZCB0byBnaXZlIHdhcm5pbmcgbWVzc2FnZXMgICovCi0jZGVmaW5lIFNQQ0RGTElOVFZMCTE2CS8qIG9uY2UgZXZlcnkgU1BDREZMSU5UVkwgd3JpdGVzIHRvIGNvd2ZpbGUsICovCi0JCQkJLyogYXZhaWxhYmxlIHNwYWNlIGluIGZpbGVzeXN0ZW0gaXMgY2hlY2tlZCAgKi8KLQotI2RlZmluZQlDQUxDTUFQKHgpCSgoeCkvKE1BUENIVU5LU1oqOCkpCi0jZGVmaW5lCUNBTENCWVRFKHgpCSgoKHgpJShNQVBDSFVOS1NaKjgpKT4+MykKLSNkZWZpbmUJQ0FMQ0JJVCh4KQkoKHgpJjcpCi0KLSNkZWZpbmUgQUxMQ09XCQkxCi0jZGVmaW5lIEFMTFJETwkJMgotI2RlZmluZSBNSVhFRFVQCQkzCi0KLXN0YXRpYyBjaGFyCWFsbHplcm9lc1tNQVBVTklUXTsKLQotLyoKLSoqIGFkbWluaXN0cmF0aW9uIHBlciBjb3dkZXZpY2UgKHBhaXIgb2YgY293ZmlsZS9yZG9maWxlKQotKi8KLQotLyogYml0LXZhbHVlcyBmb3Igc3RhdGUgKi8KLSNkZWZpbmUJQ09XREVWT1BFTgkweDAxCS8qIGNvd2RldmljZSBvcGVuZWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lCUNPV1JXQ09XT1BFTgkweDAyCS8qIGNvd2ZpbGUgb3BlbmVkIHJlYWQtd3JpdGUgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lCUNPV1JEQ09XT1BFTgkweDA0CS8qIGNvd2ZpbGUgb3BlbmVkIHJlYWQtb25seSAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lCUNPV1dBVENIRE9HCTB4MDggCS8qIGlvY3RsIGZvciB3YXRjaGRvZyBjb3dmaWxlIHNwYWNlIGFjdGl2ZSAgICovCi0KLSNkZWZpbmUJQ09XQ09XT1BFTgkoQ09XUldDT1dPUEVOfENPV1JEQ09XT1BFTikKLQotc3RydWN0IGNvd2xvb3BfZGV2aWNlCi17Ci0JLyoKLQkqKiBjdXJyZW50IHN0YXR1cwotCSovCi0JaW50CQlzdGF0ZTsJCQkvKiBiaXQtdmFsdWVzIChzZWUgYWJvdmUpICAgICovCi0JaW50CQlvcGVuY250OwkJLyogIyBvcGVucyBmb3IgY293ZGV2aWNlICAgICAqLwotCi0gICAgICAgIC8qCi0JKiogb3BlbiBmaWxlIHBvaW50ZXJzCi0JKi8KLSAgICAgICAgc3RydWN0IGZpbGUgIAkqcmRvZnAsICAgKmNvd2ZwOwkvKiBvcGVuIGZpbGUgcG9pbnRlcnMgICAgICAgICovCi0JY2hhcgkJKnJkb25hbWUsICpjb3duYW1lOwkvKiBmaWxlIG5hbWVzICAgICAgICAgICAgICAgICovCi0KLQkvKgotCSoqIHJlcXVlc3QgcXVldWUgYWRtaW5pc3RyYXRpb24KLQkqLwotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlCSpycXVldWU7Ci0Jc3BpbmxvY2tfdAkJcnFsb2NrOwotCXN0cnVjdCBnZW5kaXNrCQkqZ2Q7Ci0KLQkvKgotCSoqIGFkbWluaXN0cmF0aW9uIGFib3V0IHJlYWQtb25seSBmaWxlCi0JKi8KLQl1bnNpZ25lZCBpbnQJICAgICBudW1ibG9ja3M7CS8qICMgYmxvY2tzIGlucHV0IGZpbGUgaW4gTUFQVU5JVCAgICAqLwotCXVuc2lnbmVkIGludAkgICAgIGJsb2Nrc3o7ICAgLyogbWluaW11bSB1bml0IHRvIGFjY2VzcyB0aGlzIGRldiAgICovCi0JdW5zaWduZWQgbG9uZwkgICAgIGZpbmdlcnByaW50OyAvKiBmaW5nZXJwcmludCBvZiBjdXJyZW50IHJkb2ZpbGUgICovCi0Jc3RydWN0IGJsb2NrX2RldmljZSAgKmJlbG93ZGV2OwkvKiBibG9jayBkZXZpY2UgYmVsb3cgdXMgICAgICAgICAgICAgKi8KLQlzdHJ1Y3QgZ2VuZGlzayAgICAgICAqYmVsb3dnZDsgIC8qIGdlbmRpc2sgZm9yIGJsayBkZXYgYmVsb3cgdXMgICAgICAqLwotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpiZWxvd3E7CS8qIHJlcS4gcXVldWUgb2YgYmxrIGRldiBiZWxvdyB1cyAgICAqLwotCi0JLyoKLQkqKiBiaXRtYXAgYWRtaW5pc3RyYXRpb24gdG8gcmVnaXN0ZXIgd2hpY2ggYmxvY2tzIGFyZSBtb2RpZmllZAotCSovCi0JbG9uZyBpbnQJbWFwc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiBiaXRtYXAgKGJ5dGVzKSAgICAgICovCi0JbG9uZyBpbnQJbWFwcmVtYWluOwkvKiByZW1haW5pbmcgYnl0ZXMgaW4gbGFzdCBiaXRtYXAgICAgKi8KLQlpbnQJCW1hcGNvdW50OyAgICAgICAvKiBudW1iZXIgb2YgYml0bWFwcyBpbiB1c2UgICAgICAgICAgKi8KLQljaGFyIAkJKiptYXBjYWNoZTsJLyogYXJlYSB3aXRoIHBvaW50ZXJzIHRvIGJpdG1hcHMgICAgICovCi0KLQljaGFyCQkqaW9idWY7CQkvKiBkYXRhYnVmZmVyIG9mIE1BUFVOSVQgYnl0ZXMgICAgICAgKi8KLQlzdHJ1Y3QgY293aGVhZAkqY293aGVhZDsJLyogYnVmZmVyIGNvbnRhaW5pbmcgY293aGVhZCAgICAgICAgICovCi0KLQkvKgotCSoqIGFkbWluaXN0cmF0aW9uIGZvciBpbnRlcmZhY2Ugd2l0aCB0aGUga2VybmVsLXRocmVhZAotCSovCi0JaW50CQlwaWQ7CQkvKiBwaWQ9PTA6IG5vIHRocmVhZCBhdmFpbGFibGUgICAgICAgKi8KLQlzdHJ1Y3QgcmVxdWVzdAkqcmVxOwkJLyogcmVxdWVzdCB0byBiZSBoYW5kbGVkIG5vdyAgICAgICAgICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CS8qIHdhaXQtUTogdGhyZWFkIHdhaXRzIGZvciB3b3JrICAgICAqLwotCWNoYXIJCWNsb3NlZG93bjsJLyogYm9vbGVhbjogdGhyZWFkIGV4aXQgcmVxdWlyZWQgICAgICovCi0JY2hhcgkJcWZpbGxlZDsJLyogYm9vbGVhbjogSS9PIHJlcXVlc3QgcGVuZGluZyAgICAgICovCi0JY2hhcgkJaW9idXN5OwkJLyogYm9vbGVhbjogcmVxIHVuZGVyIHRyZWF0bWVudCAgICAgICovCi0KLQkvKgotCSoqIGFkbWluaXN0cmF0aW9uIHRvIGtlZXAgdHJhY2sgb2YgZnJlZSBzcGFjZSBpbiBjb3dmaWxlIGZpbGVzeXN0ZW0KLQkqLwotCXVuc2lnbmVkIGxvbmcJYmxrc2l6ZTsJLyogYmxvY2sgc2l6ZSBvZiBmcyAoYnl0ZXMpICAgICAgICAgICovCi0JdW5zaWduZWQgbG9uZwlibGt0b3RhbDsJLyogcmVjZW50IHRvdGFsIHNwYWNlIGluIGZzIChibG9ja3MpICovCi0JdW5zaWduZWQgbG9uZwlibGthdmFpbDsJLyogcmVjZW50IGZyZWUgIHNwYWNlIGluIGZzIChibG9ja3MpICovCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YXRjaHE7CS8qIHdhaXQtUTogd2F0Y2hlciBhd2FpdHMgdGhyZXNob2xkICAqLwotCXVuc2lnbmVkIGxvbmcJd2F0Y2h0aHJlc2g7CS8qIHRocmVzaG9sZCBvZiB3YXRjaGVyIChibG9ja3MpICAgICAqLwotCi0JLyoKLQkqKiBzdGF0aXN0aWNhbCBjb3VudGVycwotCSovCi0JdW5zaWduZWQgbG9uZwlyZG9yZWFkczsJLyogbnVtYmVyIG9mICByZWFkLWFjdGlvbnMgcmRvICAgICAgICovCi0JdW5zaWduZWQgbG9uZwljb3dyZWFkczsJLyogbnVtYmVyIG9mICByZWFkLWFjdGlvbnMgY293ICAgICAgICovCi0JdW5zaWduZWQgbG9uZwljb3d3cml0ZXM7CS8qIG51bWJlciBvZiB3cml0ZS1hY3Rpb25zICAgICAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJbnJjb3dibG9ja3M7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gdXNlIG9uIGNvdyAgICAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBjb3dsb29wX2RldmljZQkqKmNvd2RldmFsbDsJLyogcHRyIHRvIHB0cnMgdG8gYWxsIGNvd2RldmljZXMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIAljb3dkZXZsb2NrOwkvKiBnZW5lcmljIGxvY2sgZm9yIGNvd2RldnMgICAgICAqLwotCi1zdGF0aWMgc3RydWN0IGdlbmRpc2sJCSpjb3djdGxnZDsJLyogZ2VuZGlzayBjb250cm9sIGNoYW5uZWwgICAgICAgKi8KLXN0YXRpYyBzcGlubG9ja190CQljb3djdGxycWxvY2s7ICAgLyogZm9yIHJlcS5xLiBvZiBjdHJsLiBjaGFubmVsICAgKi8KLQotLyoKLSoqIHByaXZhdGUgZGlyZWN0b3J5IC9wcm9jL2NvdwotKi8KLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqY293bG9fcHJvY2RpcjsKLQotLyoKLSoqIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSovCi1zdGF0aWMgbG9uZyBpbnQgY293bG9fZG9fcmVxdWVzdCAoc3RydWN0IHJlcXVlc3QgKnJlcSk7Ci1zdGF0aWMgdm9pZAljb3dsb19zeW5jICAgICAgICh2b2lkKTsKLXN0YXRpYyBpbnQJY293bG9fY2hlY2tpbyAgICAoc3RydWN0IGNvd2xvb3BfZGV2aWNlICosICAgICAgICAgaW50LCBsb2ZmX3QpOwotc3RhdGljIGludAljb3dsb19yZWFkbWl4ICAgIChzdHJ1Y3QgY293bG9vcF9kZXZpY2UgKiwgdm9pZCAqLCBpbnQsIGxvZmZfdCk7Ci1zdGF0aWMgaW50CWNvd2xvX3dyaXRlbWl4ICAgKHN0cnVjdCBjb3dsb29wX2RldmljZSAqLCB2b2lkICosIGludCwgbG9mZl90KTsKLXN0YXRpYyBsb25nIGludCBjb3dsb19yZWFkcmRvICAgIChzdHJ1Y3QgY293bG9vcF9kZXZpY2UgKiwgdm9pZCAqLCBpbnQsIGxvZmZfdCk7Ci1zdGF0aWMgbG9uZyBpbnQgY293bG9fcmVhZGNvdyAgICAoc3RydWN0IGNvd2xvb3BfZGV2aWNlICosIHZvaWQgKiwgaW50LCBsb2ZmX3QpOwotc3RhdGljIGxvbmcgaW50IGNvd2xvX3JlYWRjb3dyYXcgKHN0cnVjdCBjb3dsb29wX2RldmljZSAqLCB2b2lkICosIGludCwgbG9mZl90KTsKLXN0YXRpYyBsb25nIGludCBjb3dsb193cml0ZWNvdyAgIChzdHJ1Y3QgY293bG9vcF9kZXZpY2UgKiwgdm9pZCAqLCBpbnQsIGxvZmZfdCk7Ci1zdGF0aWMgbG9uZyBpbnQgY293bG9fd3JpdGVjb3dyYXcoc3RydWN0IGNvd2xvb3BfZGV2aWNlICosIHZvaWQgKiwgaW50LCBsb2ZmX3QpOwotc3RhdGljIGludCAgICAgIGNvd2xvX2lvY3RsICAgICAgKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgZm1vZGVfdCwKLSAgICAgICAgICAgCQkJIAkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyBpbnQJY293bG9fbWFrZXBhaXIgICAgKHN0cnVjdCBjb3dwYWlyIF9fdXNlciAqKTsKLXN0YXRpYyBpbnQJY293bG9fcmVtb3ZlcGFpciAgKHVuc2lnbmVkIGxvbmcgIF9fdXNlciAqKTsKLXN0YXRpYyBpbnQJY293bG9fd2F0Y2ggICAgICAgKHN0cnVjdCBjb3dwYWlyIF9fdXNlciAqKTsKLXN0YXRpYyBpbnQJY293bG9fY293Y3RsICAgICAgKHVuc2lnbmVkIGxvbmcgIF9fdXNlciAqLCBpbnQpOwotc3RhdGljIGludAljb3dsb19vcGVucGFpciAgICAoY2hhciAqLCBjaGFyICosIGludCwgaW50KTsKLXN0YXRpYyBpbnQgCWNvd2xvX2Nsb3NlcGFpciAgIChzdHJ1Y3QgY293bG9vcF9kZXZpY2UgKik7Ci1zdGF0aWMgaW50CWNvd2xvX29wZW5yZG8gICAgIChzdHJ1Y3QgY293bG9vcF9kZXZpY2UgKiwgY2hhciAqKTsKLXN0YXRpYyBpbnQJY293bG9fb3BlbmNvdyAgICAgKHN0cnVjdCBjb3dsb29wX2RldmljZSAqLCBjaGFyICosIGludCk7Ci1zdGF0aWMgdm9pZAljb3dsb191bmRvX29wZW5yZG8oc3RydWN0IGNvd2xvb3BfZGV2aWNlICopOwotc3RhdGljIHZvaWQJY293bG9fdW5kb19vcGVuY293KHN0cnVjdCBjb3dsb29wX2RldmljZSAqKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3lzdGVtIGNhbGwgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotKiogaGFuZGxlIHN5c3RlbSBjYWxsIG9wZW4oKS9tb3VudCgpCi0qKgotKiogcmV0dXJuczoKLSoqIAkwICAgLSBva2F5Ci0qKiAgICA8IDAgICAtIGVycm9yIHZhbHVlCi0qLwotc3RhdGljIGludCBjb3dsb19vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gYmRldi0+YmRfaW5vZGU7Ci0KLQlpZiAoIWlub2RlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpbWFqb3IoaW5vZGUpICE9IENPV01BSk9SKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJjb3dsb29wIC0gdW5leHBlY3RlZCBtYWpvciAlZFxuIiwgaW1ham9yKGlub2RlKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXN3aXRjaCAoaW1pbm9yKGlub2RlKSkgewotCSAgIGNhc2UgQ09XQ1RMOgotCQlERUJVR1AoRENPVyJjb3dsb29wIC0gb3BlbiAlZCBjb250cm9sXG4iLCBDT1dDVEwpOwotCQlicmVhazsKLQotCSAgIGRlZmF1bHQ6Ci0JCURFQlVHUChEQ09XImNvd2xvb3AgLSBvcGVuIG1pbm9yICVkXG4iLCBpbWlub3IoaW5vZGUpKTsKLQotCQlpZiAoIGltaW5vcihpbm9kZSkgPj0gbWF4Y293cyApCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQlpZiAoICEoKGNvd2RldmFsbFtpbWlub3IoaW5vZGUpXSktPnN0YXRlICYgQ09XREVWT1BFTikgKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJKGNvd2RldmFsbFtpbWlub3IoaW5vZGUpXSktPm9wZW5jbnQrKzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSoqIGhhbmRsZSBzeXN0ZW0gY2FsbCBjbG9zZSgpL3Vtb3VudCgpCi0qKgotKiogcmV0dXJuczoKLSoqIAkwICAgLSBva2F5Ci0qLwotc3RhdGljIGludCBjb3dsb19yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpnZCwgZm1vZGVfdCBtb2RlKQotewotCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQotCWJkZXYgPSBiZGdldF9kaXNrKGdkLCAwKTsKLQlpbm9kZSA9IGJkZXYtPmJkX2lub2RlOwotCWlmICghaW5vZGUpCi0JCXJldHVybiAwOwotCi0JREVCVUdQKERDT1ciY293bG9vcCAtIHJlbGVhc2UgKGNsb3NlKSBtaW5vciAlZFxuIiwgaW1pbm9yKGlub2RlKSk7Ci0KLQlpZiAoIGltaW5vcihpbm9kZSkgIT0gQ09XQ1RMKQotCQkoY293ZGV2YWxsW2ltaW5vcihpbm9kZSldKS0+b3BlbmNudC0tOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0qKiBoYW5kbGUgc3lzdGVtIGNhbGwgaW9jdGwoKQotKioKLSoqIHJldHVybnM6Ci0qKiAJMCAgIC0gb2theQotKiogICAgPCAwICAgLSBlcnJvciB2YWx1ZQotKi8KLXN0YXRpYyBpbnQgY293bG9faW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlLAotCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGhkX2dlb21ldHJ5CWdlbzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gYmRldi0+YmRfaW5vZGU7Ci0KLQlERUJVR1AoRENPVyAiY293bG9vcCAtIGlvY3RsIGNtZCAleFxuIiwgY21kKTsKLQotCXN3aXRjaCAoIGltaW5vcihpbm9kZSkgKSB7Ci0KLQkgICAvKgotCSAgICoqIGFsbG93ZWQgdmlhIGNvbnRyb2wgZGV2aWNlIG9ubHkKLQkgICAqLwotCSAgIGNhc2UgQ09XQ1RMOgotCQlzd2l0Y2ggKGNtZCkgewotCQkgICAvKgotCQkgICAqKiB3cml0ZSBhbGwgYml0bWFwIGNodW5rcyBhbmQgY293aGVhZGVycyB0byBjb3dmaWxlcwotCQkgICAqLwotCQkgICBjYXNlIENPV1NZTkM6Ci0JCQlkb3duKCZjb3dkZXZsb2NrKTsKLQkJCWNvd2xvX3N5bmMoKTsKLQkJCXVwKCZjb3dkZXZsb2NrKTsKLQkJCXJldHVybiAwOwotCi0JCSAgIC8qCi0JCSAgICoqIG9wZW4gYSBuZXcgY293ZGV2aWNlIChwYWlyIG9mIHJkb2ZpbGUvY293ZmlsZSkKLQkJICAgKi8KLQkJICAgY2FzZSBDT1dNS1BBSVI6Ci0JCQlyZXR1cm4gY293bG9fbWFrZXBhaXIoKHZvaWQgX191c2VyICopYXJnKTsKLQotCQkgICAvKgotCQkgICAqKiBjbG9zZSBhIGNvd2RldmljZSAocGFpciBvZiByZG9maWxlL2Nvd2ZpbGUpCi0JCSAgICovCi0JCSAgIGNhc2UgQ09XUk1QQUlSOgotCQkJcmV0dXJuIGNvd2xvX3JlbW92ZXBhaXIoKHZvaWQgX191c2VyICopYXJnKTsKLQotCQkgICAvKgotCQkgICAqKiB3YXRjaCBmcmVlIHNwYWNlIG9mIGZpbGVzeXN0ZW0gY29udGFpbmluZyBjb3dmaWxlCi0JCSAgICovCi0JCSAgIGNhc2UgQ09XV0FUQ0g6Ci0JCQlyZXR1cm4gY293bG9fd2F0Y2goKHZvaWQgX191c2VyICopYXJnKTsKLQotCQkgICAvKgotCQkgICAqKiBjbG9zZSBjb3dmaWxlIGZvciBhY3RpdmUgZGV2aWNlCi0JCSAgICovCi0JCSAgIGNhc2UgQ09XQ0xPU0U6Ci0JCQlyZXR1cm4gY293bG9fY293Y3RsKCh2b2lkIF9fdXNlciAqKWFyZywgQ09XQ0xPU0UpOwotCi0JCSAgIC8qCi0JCSAgICoqIHJlb3BlbiBjb3dmaWxlIHJlYWQtb25seSBmb3IgYWN0aXZlIGRldmljZQotCQkgICAqLwotCQkgICBjYXNlIENPV1JET1BFTjoKLQkJCXJldHVybiBjb3dsb19jb3djdGwoKHZvaWQgX191c2VyICopYXJnLCBDT1dSRE9QRU4pOwotCi0JCSAgIGRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSAvKiBlbmQgb2Ygc3dpdGNoIG9uIGNvbW1hbmQgKi8KLQotCSAgIC8qCi0JICAgKiogYWxsb3dlZCBmb3IgYW55IG90aGVyIGNvd2RldmljZQotCSAgICovCi0JICAgZGVmYXVsdDoKLQkJc3dpdGNoIChjbWQpIHsKLQkJICAgLyoKLQkJICAgKiogSERJT19HRVRHRU8gbXVzdCBiZSBzdXBwb3J0ZWQgZm9yIGZkaXNrLCBldGMKLQkJICAgKi8KLQkJICAgY2FzZSBIRElPX0dFVEdFTzoKLQkJCWdlby5jeWxpbmRlcnMgPSAwOwotCQkJZ2VvLmhlYWRzICAgICA9IDA7Ci0JCQlnZW8uc2VjdG9ycyAgID0gMDsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZnZW8sIHNpemVvZiBnZW8pKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0KLQkJICAgZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9IC8qIGVuZCBvZiBzd2l0Y2ggb24gaW9jdGwtY21kIGNvZGUgcGFyYW1ldGVyICovCi0JfSAvKiBlbmQgb2Ygc3dpdGNoIG9uIG1pbm9yIG51bWJlciAqLwotfQotCi1zdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGNvd2xvX2ZvcHMgPQotewotCS5vd25lcgkgPSAgICAgVEhJU19NT0RVTEUsCi0gICAgICAgIC5vcGVuICAgID0gICAgIGNvd2xvX29wZW4sCS8qIGNhbGxlZCB1cG9uIG9wZW4gICovCi0gICAgICAgIC5yZWxlYXNlID0gICAgIGNvd2xvX3JlbGVhc2UsCS8qIGNhbGxlZCB1cG9uIGNsb3NlICovCi0gICAgICAgIC5pb2N0bCAgID0gICAgIGNvd2xvX2lvY3RsLCAgICAgLyogY2FsbGVkIHVwb24gaW9jdGwgKi8KLX07Ci0KLS8qCi0qKiBoYW5kbGUgaW9jdGwtY29tbWFuZCBDT1dNS1BBSVI6Ci0qKglvcGVuIGEgbmV3IGNvd2RldmljZSAocGFpciBvZiByZG9maWxlL2Nvd2ZpbGUpIG9uLXRoZS1mbHkKLSoqCi0qKiByZXR1cm5zOgotKiogCTAgICAtIG9rYXkKLSoqICAgIDwgMCAgIC0gZXJyb3IgdmFsdWUKLSovCi1zdGF0aWMgaW50Ci1jb3dsb19tYWtlcGFpcihzdHJ1Y3QgY293cGFpciBfX3VzZXIgKmFyZykKLXsKLQlpbnQJCWksIHJ2PTA7Ci0Jc3RydWN0IGNvd3BhaXIJY293cGFpcjsKLQl1bnNpZ25lZCBjaGFyCSpjb3dwYXRoOwotCXVuc2lnbmVkIGNoYXIJKnJkb3BhdGg7Ci0KLQkvKgotCSoqIHJldHJpZXZlIGluZm8gYWJvdXQgcGF0aG5hbWVzCi0JKi8KLQlpZiAoIGNvcHlfZnJvbV91c2VyKCZjb3dwYWlyLCBhcmcsIHNpemVvZiBjb3dwYWlyKSApCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKCAoTUFKT1IoY293cGFpci5kZXZpY2UpICE9IENPV01BSk9SKSAmJiAoY293cGFpci5kZXZpY2UgIT0gQU5ZREVWKSApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCAoTUlOT1IoY293cGFpci5kZXZpY2UpID49IG1heGNvd3MpICAmJiAoY293cGFpci5kZXZpY2UgIT0gQU5ZREVWKSApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyoKLQkqKiByZXRyaWV2ZSBwYXRobmFtZSBzdHJpbmdzCi0JKi8KLQlpZiAoIChjb3dwYWlyLmNvd2ZsZW4gPiBQQVRIX01BWCkgfHwgKGNvd3BhaXIucmRvZmxlbiA+IFBBVEhfTUFYKSApCi0JCXJldHVybiAtRU5BTUVUT09MT05HOwotCi0JaWYgKCAhKGNvd3BhdGggPSBrbWFsbG9jKGNvd3BhaXIuY293ZmxlbisxLCBHRlBfS0VSTkVMKSkgKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmICggY29weV9mcm9tX3VzZXIoY293cGF0aCwgKHZvaWQgX191c2VyICopY293cGFpci5jb3dmaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY293cGFpci5jb3dmbGVuKSApIHsKLQkJa2ZyZWUoY293cGF0aCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQkqKGNvd3BhdGgrY293cGFpci5jb3dmbGVuKSA9IDA7Ci0KLQlpZiAoICEocmRvcGF0aCA9IGttYWxsb2MoY293cGFpci5yZG9mbGVuKzEsIEdGUF9LRVJORUwpKSApIHsKLQkJa2ZyZWUoY293cGF0aCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmICggY29weV9mcm9tX3VzZXIocmRvcGF0aCwgKHZvaWQgX191c2VyICopY293cGFpci5yZG9maWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY293cGFpci5yZG9mbGVuKSApIHsKLQkJa2ZyZWUocmRvcGF0aCk7Ci0JCWtmcmVlKGNvd3BhdGgpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JKihyZG9wYXRoK2Nvd3BhaXIucmRvZmxlbikgPSAwOwotCi0JLyoKLQkqKiBvcGVuIG5ldyBjb3dkZXZpY2UKLQkqLwotCWlmICggY293cGFpci5kZXZpY2UgPT0gQU5ZREVWKSB7Ci0JCS8qCi0JCSoqIHNlYXJjaCBmaXJzdCB1bnVzZWQgbWlub3IKLQkJKi8KLQkJZm9yIChpPTAsIHJ2PS1FQlVTWTsgaSA8IG1heGNvd3M7IGkrKykgewotCQkJaWYgKCAhKChjb3dkZXZhbGxbaV0pLT5zdGF0ZSAmIENPV0RFVk9QRU4pICkgewotCQkJCXJ2ID0gY293bG9fb3BlbnBhaXIocmRvcGF0aCwgY293cGF0aCwgMCwgaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocnYpIHsgCQkvKiBvcGVuIGZhaWxlZD8gKi8KLQkJCWtmcmVlKHJkb3BhdGgpOwotCQkJa2ZyZWUoY293cGF0aCk7Ci0JCQlyZXR1cm4gcnY7Ci0JCX0KLQotCQkvKgotCQkqKiByZXR1cm4gbmV3bHkgYWxsb2NhdGVkIGNvd2RldmljZSB0byB1c2VyIHNwYWNlCi0JCSovCi0JCWNvd3BhaXIuZGV2aWNlID0gTUtERVYoQ09XTUFKT1IsIGkpOwotCi0JCWlmICggY29weV90b191c2VyKGFyZywgJmNvd3BhaXIsIHNpemVvZiBjb3dwYWlyKSkgewotCQkJa2ZyZWUocmRvcGF0aCk7Ci0JCQlrZnJlZShjb3dwYXRoKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfSBlbHNlIHsgCQkvKiBzcGVjaWZpYyBtaW5vciByZXF1ZXN0ZWQgKi8KLQkJaWYgKCAocnYgPSBjb3dsb19vcGVucGFpcihyZG9wYXRoLCBjb3dwYXRoLCAwLAotCQkJCQkJTUlOT1IoY293cGFpci5kZXZpY2UpKSkpIHsKLQkJCWtmcmVlKHJkb3BhdGgpOwotCQkJa2ZyZWUoY293cGF0aCk7Ci0JCQlyZXR1cm4gcnY7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSoqIGhhbmRsZSBpb2N0bC1jb21tYW5kIENPV1JNUEFJUjoKLSoqIAlkZWFjdGl2YXRlIGFuIGV4aXN0aW5nIGNvd2RldmljZSAocGFpciBvZiByZG9maWxlL2Nvd2ZpbGUpIG9uLXRoZS1mbHkKLSoqCi0qKiByZXR1cm5zOgotKiogCTAgICAtIG9rYXkKLSoqICAgIDwgMCAgIC0gZXJyb3IgdmFsdWUKLSovCi1zdGF0aWMgaW50Ci1jb3dsb19yZW1vdmVwYWlyKHVuc2lnbmVkIGxvbmcgX191c2VyICphcmcpCi17Ci0JdW5zaWduZWQgbG9uZwkJY293ZGV2aWNlOwotCXN0cnVjdCBjb3dsb29wX2RldmljZQkqY293ZGV2OwotCi0JLyoKLQkqKiByZXRyaWV2ZSBpbmZvIGFib3V0IGRldmljZSB0byBiZSByZW1vdmVkCi0JKi8KLQlpZiAoIGNvcHlfZnJvbV91c2VyKCZjb3dkZXZpY2UsIGFyZywgc2l6ZW9mIGNvd2RldmljZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyoKLQkqKiB2ZXJpZnkgbWFqb3ItbWlub3IgbnVtYmVyCi0JKi8KLQlpZiAoIE1BSk9SKGNvd2RldmljZSkgIT0gQ09XTUFKT1IpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCBNSU5PUihjb3dkZXZpY2UpID49IG1heGNvd3MpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY293ZGV2ID0gY293ZGV2YWxsW01JTk9SKGNvd2RldmljZSldOwotCi0JaWYgKCAhKGNvd2Rldi0+c3RhdGUgJiBDT1dERVZPUEVOKSApCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyoKLQkqKiBzeW5jaHJvbml6ZSBiaXRtYXBzIGFuZCBjbG9zZSBjb3dkZXZpY2UKLQkqLwotCWlmIChjb3dkZXYtPnN0YXRlICYgQ09XUldDT1dPUEVOKSB7Ci0JCWRvd24oJmNvd2RldmxvY2spOwotCQljb3dsb19zeW5jKCk7Ci0JCXVwKCZjb3dkZXZsb2NrKTsKLQl9Ci0KLQlyZXR1cm4gY293bG9fY2xvc2VwYWlyKGNvd2Rldik7Ci19Ci0KLS8qCi0qKiBoYW5kbGUgaW9jdGwtY29tbWFuZCBDT1dXQVRDSDoKLSoqCXdhdGNoIHRoZSBmcmVlIHNwYWNlIG9mIHRoZSBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgYSBjb3dmaWxlCi0qKiAgICAgIG9mIGFuIG9wZW4gY293ZGV2aWNlCi0qKgotKiogcmV0dXJuczoKLSoqIAkwICAgLSBva2F5Ci0qKiAgICA8IDAgICAtIGVycm9yIHZhbHVlCi0qLwotc3RhdGljIGludAotY293bG9fd2F0Y2goc3RydWN0IGNvd3BhaXIgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IGNvd2xvb3BfZGV2aWNlCSpjb3dkZXY7Ci0Jc3RydWN0IGNvd3dhdGNoCQljb3d3YXRjaDsKLQotCS8qCi0JKiogcmV0cmlldmUgc3RydWN0dXJlIGhvbGRpbmcgaW5mbwotCSovCi0JaWYgKCBjb3B5X2Zyb21fdXNlcigmY293d2F0Y2gsIGFyZywgc2l6ZW9mIGNvd3dhdGNoKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkvKgotCSoqIHZlcmlmeSBpZiBjb3dkZXZpY2UgZXhpc3RzIGFuZCBpcyBjdXJyZW50bHkgb3BlbgotCSovCi0JaWYgKCBNSU5PUihjb3d3YXRjaC5kZXZpY2UpID49IG1heGNvd3MpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY293ZGV2ID0gY293ZGV2YWxsW01JTk9SKGNvd3dhdGNoLmRldmljZSldOwotCi0JaWYgKCAhKGNvd2Rldi0+c3RhdGUgJiBDT1dERVZPUEVOKSApCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyoKLQkqKiBpZiB0aGUgV0FUQ0hXQUlULW9wdGlvbiBpcyBzZXQsIHdhaXQgdW50aWwgdGhlIGluZGljYXRlZAotCSoqIHRocmVzaG9sZCBpcyByZWFjaGVkIChvbmx5IG9uZSB3YWl0ZXIgYWxsb3dlZCkKLQkqLwotCWlmIChjb3d3YXRjaC5mbGFncyAmIFdBVENIV0FJVCkgewotCQkvKgotCQkqKiBjaGVjayBpZiBhbHJlYWR5IGFub3RoZXIgd2FpdGVyIGFjdGl2ZQotCQkqKiBmb3IgdGhpcyBjb3dkZXZpY2UKLQkJKi8KLQkJaWYgKGNvd2Rldi0+c3RhdGUgJiBDT1dXQVRDSERPRykKLQkJCXJldHVybiAtRUFHQUlOOwotCi0JCWNvd2Rldi0+c3RhdGUgfD0gQ09XV0FUQ0hET0c7Ci0KLQkJY293ZGV2LT53YXRjaHRocmVzaCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpCi0JCSAgICAgICAgICAgICAgICAgICAgICBjb3d3YXRjaC50aHJlc2hvbGQgLwotCQkJCSAgICAgIChjb3dkZXYtPmJsa3NpemUgLyAxMDI0KTsKLQotCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNvd2Rldi0+d2F0Y2hxLAotCQkgICAgICAgICAgICAgICAgICAgIGNvd2Rldi0+d2F0Y2h0aHJlc2ggPj0gY293ZGV2LT5ibGthdmFpbCkpIHsKLQkJCWNvd2Rldi0+c3RhdGUgJj0gfkNPV1dBVENIRE9HOwotCQkJcmV0dXJuIEVJTlRSOwotCQl9Ci0KLQkJY293ZGV2LT5zdGF0ZSAmPSB+Q09XV0FUQ0hET0c7Ci0JfQotCi0JY293d2F0Y2gudG90YWxrYiA9ICh1bnNpZ25lZCBsb25nIGxvbmcpY293ZGV2LT5ibGt0b3RhbCAqCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY293ZGV2LT5ibGtzaXplIC8gMTAyNDsKLQljb3d3YXRjaC5hdmFpbGtiID0gKHVuc2lnbmVkIGxvbmcgbG9uZyljb3dkZXYtPmJsa2F2YWlsICoKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3dkZXYtPmJsa3NpemUgLyAxMDI0OwotCi0JaWYgKCBjb3B5X3RvX3VzZXIoYXJnLCAmY293d2F0Y2gsIHNpemVvZiBjb3d3YXRjaCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0qKiBoYW5kbGUgaW9jdGwtY29tbWFuZHMgQ09XQ0xPU0UgYW5kIENPV1JET1BFTjoKLSoqCUNPV0NMT1NFICAtIGNsb3NlIHRoZSBjb3dmaWxlIHdoaWxlIHRoZSBjb3dkZXZpY2UgcmVtYWlucyBvcGVuOwotKiogICAgICAgICAgICAgICAgICB0aGlzIGFsbG93cyBhbiB1bm1vdW50IG9mIHRoZSBmaWxlc3lzdGVtIG9uIHdoaWNoCi0qKiAgICAgICAgICAgICAgICAgIHRoZSBjb3dmaWxlIHJlc2lkZXMKLSoqCUNPV1JET1BFTiAtIGNsb3NlIHRoZSBjb3dmaWxlIGFuZCByZW9wZW4gaXQgZm9yIHJlYWQtb25seTsKLSoqICAgICAgICAgICAgICAgICAgdGhpcyBhbGxvd3MgYSByZW1vdW50IHJlYWQtb255IG9mIHRoZSBmaWxlc3lzdGVtCi0qKiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHRoZSBjb3dmaWxlIHJlc2lkZXMKLSoqCi0qKiByZXR1cm5zOgotKiogCTAgICAtIG9rYXkKLSoqICAgIDwgMCAgIC0gZXJyb3IgdmFsdWUKLSovCi1zdGF0aWMgaW50Ci1jb3dsb19jb3djdGwodW5zaWduZWQgbG9uZyBfX3VzZXIgKmFyZywgaW50IGNtZCkKLXsKLQlzdHJ1Y3QgY293bG9vcF9kZXZpY2UJKmNvd2RldjsKLQl1bnNpZ25lZCBsb25nCQljb3dkZXZpY2U7Ci0KLQkvKgotCSoqIHJldHJpZXZlIGluZm8gYWJvdXQgZGV2aWNlIHRvIGJlIHJlbW92ZWQKLQkqLwotCWlmICggY29weV9mcm9tX3VzZXIoJmNvd2RldmljZSwgYXJnLCBzaXplb2YgY293ZGV2aWNlKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkvKgotCSoqIHZlcmlmeSBtYWpvci1taW5vciBudW1iZXIKLQkqLwotCWlmICggTUFKT1IoY293ZGV2aWNlKSAhPSBDT1dNQUpPUikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIE1JTk9SKGNvd2RldmljZSkgPj0gbWF4Y293cykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljb3dkZXYgPSBjb3dkZXZhbGxbTUlOT1IoY293ZGV2aWNlKV07Ci0KLQlpZiAoICEoY293ZGV2LT5zdGF0ZSAmIENPV0RFVk9QRU4pICkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKgotCSoqIHN5bmNocm9uaXplIGJpdG1hcHMgYW5kIGNsb3NlIGNvd2ZpbGUKLQkqLwotCWlmIChjb3dkZXYtPnN0YXRlICYgQ09XUldDT1dPUEVOKSB7Ci0JCWRvd24oJmNvd2RldmxvY2spOwotCQljb3dsb19zeW5jKCk7Ci0JCXVwKCZjb3dkZXZsb2NrKTsKLQl9Ci0KLQkvKgotCSoqIGhhbmRsZSBzcGVjaWZpYyBpb2N0bC1jb21tYW5kCi0JKi8KLQlzd2l0Y2ggKGNtZCkgewotCSAgIGNhc2UgQ09XUkRPUEVOOgotCQkvKgotCQkqKiBpZiB0aGUgY293ZmlsZSBpcyBzdGlsbCBvcGVuZWQgcmVhZC13cml0ZQotCQkqLwotCQlpZiAoY293ZGV2LT5zdGF0ZSAmIENPV1JXQ09XT1BFTikgewotCQkJLyoKLQkJCSoqIGNsb3NlIHRoZSBjb3dmaWxlCi0JCQkqLwotICAJCQlpZiAoY293ZGV2LT5jb3dmcCkKLQkJICAJCWZpbHBfY2xvc2UoY293ZGV2LT5jb3dmcCwgMCk7Ci0KLQkJCWNvd2Rldi0+c3RhdGUgJj0gfkNPV1JXQ09XT1BFTjsKLQotCQkJLyoKLQkJCSoqIG9wZW4gYWdhaW4gZm9yIHJlYWQtb25seQotCQkJKi8KLQkJCWNvd2Rldi0+Y293ZnAgPSBmaWxwX29wZW4oY293ZGV2LT5jb3duYW1lLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZfE9fTEFSR0VGSUxFLCAwNjAwKTsKLQotCQkJaWYgKCAoY293ZGV2LT5jb3dmcCA9PSBOVUxMKSB8fCBJU19FUlIoY293ZGV2LT5jb3dmcCkgKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAiY293bG9vcCAtIGZhaWxlZCB0byByZW9wZW4gY293ZmlsZSAlc1xuIiwKLQkJCQkgICAgIGNvd2Rldi0+Y293bmFtZSk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkqKiBtYXJrIGNvd2ZpbGUgb3BlbiBmb3IgcmVhZC1vbmx5Ci0JCQkqLwotCQkJY293ZGV2LT5zdGF0ZSB8PSBDT1dSRENPV09QRU47Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQotCSAgIGNhc2UgQ09XQ0xPU0U6Ci0JCS8qCi0JCSoqIGlmIHRoZSBjb3dmaWxlIGlzIHN0aWxsIG9wZW4KLQkJKi8KLQkJaWYgKGNvd2Rldi0+c3RhdGUgJiBDT1dDT1dPUEVOKSB7Ci0JCQkvKgotCQkJKiogY2xvc2UgdGhlIGNvd2ZpbGUKLQkJCSovCi0gIAkJCWlmIChjb3dkZXYtPmNvd2ZwKQotCQkgIAkJZmlscF9jbG9zZShjb3dkZXYtPmNvd2ZwLCAwKTsKLQotCQkJY293ZGV2LT5zdGF0ZSAmPSB+Q09XQ09XT1BFTjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEhhbmRsaW5nIG9mIEkvTy1yZXF1ZXN0cyBmb3IgYSBjb3dkZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSoqIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSBjb3JlLWtlcm5lbCB0byBoYW5kbGUgdGhlIEkvTy1yZXF1ZXN0cwotKiogaW4gdGhlIHF1ZXVlCi0qLwotc3RhdGljIHZvaWQgY293bG9fcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKLXsKLQlzdHJ1Y3QgcmVxdWVzdAkJKnJlcTsKLQlzdHJ1Y3QgY293bG9vcF9kZXZpY2UJKmNvd2RldjsKLQotCURFQlVHUChEQ09XICJjb3dsb29wIC0gcmVxdWVzdCBmdW5jdGlvbiBjYWxsZWQuLi4uXG4iKTsKLQotCXdoaWxlKChyZXEgPSBibGtfcGVla19yZXF1ZXN0KHEpKSAhPSBOVUxMKSB7Ci0JCURFQlVHUChEQ09XICJjb3dsb29wIC0gZ290IG5leHQgcmVxdWVzdFxuIik7Ci0KLQkJaWYgKCEgYmxrX2ZzX3JlcXVlc3QocmVxKSkgewotICAgICAgICAgICAgICAgCQkgLyogdGhpcyBpcyBub3QgYSBub3JtYWwgZmlsZSBzeXN0ZW0gcmVxdWVzdCAqLwotICAgICAgICAgICAgICAgIAlfX2Jsa19lbmRfcmVxdWVzdF9jdXIocmVxLCAtRUlPKTsKLSAgICAgICAgICAgICAgICAJY29udGludWU7Ci0gICAgICAgIAl9Ci0JCWNvd2RldiA9IHJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwotCi0JCWlmIChjb3dkZXYtPmlvYnVzeSkKLQkJCXJldHVybjsKLQkJZWxzZQotCQkJY293ZGV2LT5pb2J1c3kgPSAxOwotCi0JCS8qCi0JCSoqIHdoZW4gbm8ga2VybmVsLXRocmVhZCBpcyBhdmFpbGFibGUsIHRoZSByZXF1ZXN0IHdpbGwKLQkJKiogcHJvZHVjZSBhbiBJL08tZXJyb3IKLQkJKi8KLQkJaWYgKCFjb3dkZXYtPnBpZCkgewotCQkJcHJpbnRrKEtFUk5fRVJSImNvd2xvb3AgLSBubyB0aHJlYWQgYXZhaWxhYmxlXG4iKTsKLQkJCV9fYmxrX2VuZF9yZXF1ZXN0X2N1cihyZXEsIC1FSU8pOwkvKiByZXF1ZXN0IGZhaWxlZCAqLwotCQkJY293ZGV2LT5pb2J1c3kJPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkqKiBoYW5kbGUgSS9PLXJlcXVlc3QgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGtlcm5lbC10aHJlYWQKLQkJKi8KLQkJY293ZGV2LT5yZXEgCT0gcmVxOwotCQljb3dkZXYtPnFmaWxsZWQJPSAxOwotCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jKCZjb3dkZXYtPndhaXRxKTsKLQotCQkvKgotCQkqKiBnZXQgb3V0IG9mIHRoaXMgZnVuY3Rpb24gbm93IHdoaWxlIHRoZSBJL08tcmVxdWVzdCBpcwotCQkqKiB1bmRlciB0cmVhdG1lbnQgb2YgdGhlIGtlcm5lbC10aHJlYWQ7IHRoaXMgZnVuY3Rpb24KLQkJKiogd2lsbCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgdGhlIGN1cnJlbnQgSS9PLXJlcXVlc3QgaGFzCi0JCSoqIGJlZW4gZmluaXNoZWQgYnkgdGhlIHRocmVhZAotCQkqLwotCQlyZXR1cm47Ci0JfQotfQotCi0vKgotKiogZGFlbW9uLXByb2Nlc3MgKGtlcm5lbC10aHJlYWQpIGV4ZWN1dGVzIHRoaXMgZnVuY3Rpb24KLSovCi1zdGF0aWMgaW50Ci1jb3dsb19kYWVtb24oc3RydWN0IGNvd2xvb3BfZGV2aWNlICpjb3dkZXYpCi17Ci0JaW50CXJ2OwotCWludCAgICAgbWlub3I7Ci0JY2hhcglteW5hbWVbMTZdOwotCi0JZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgbWF4Y293czsgbWlub3IrKykgewotCQlpZiAoY293ZGV2ID09IGNvd2RldmFsbFttaW5vcl0pIGJyZWFrOwotCX0KLQlzcHJpbnRmKG15bmFtZSwgImNvd2xvb3BkJWQiLCBtaW5vcik7Ci0KLSAgICAgICAgZGFlbW9uaXplKG15bmFtZSk7Ci0KLQl3aGlsZSAoIWNvd2Rldi0+Y2xvc2Vkb3duKSB7Ci0JCS8qCi0JCSoqIHNsZWVwIHdoaWxlIHdhaXRpbmcgZm9yIGFuIEkvTyByZXF1ZXN0OwotCQkqKiBub3RlIHRoYXQgbm8gbm9uLWludGVycnVwdGlibGUgd2FpdCBoYXMgYmVlbiB1c2VkCi0JCSoqIGJlY2F1c2UgdGhlIG5vbi1pbnRlcnJ1cHRpYmxlIHZlcnNpb24gb2YKLQkJKiogYSAqc3luY2hyb25vdXMqIHdha2VfdXAgZG9lcyBub3QgZXhpc3QgKGFueSBtb3JlKQotCQkqLwotCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNvd2Rldi0+d2FpdHEsIGNvd2Rldi0+cWZpbGxlZCkpewotCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsgLyogaWdub3JlIHNpZ25hbC1iYXNlZCB3YWtldXAgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGNvd2Rldi0+Y2xvc2Vkb3duKQkJLyogbW9kdWxlIHdpbGwgYmUgdW5sb2FkZWQgPyAqL3sKLQkJCWNvd2Rldi0+cGlkID0gMDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJLyoKLQkJKiogd29rZW4gdXAgYnkgdGhlIEkvTy1yZXF1ZXN0IGhhbmRsZXI6CXRyZWF0IHJlcXVlc3RlZCBJL08KLQkJKi8KLQkJY293ZGV2LT5xZmlsbGVkID0gMDsKLQotCQlydiA9IGNvd2xvX2RvX3JlcXVlc3QoY293ZGV2LT5yZXEpOwotCi0JCS8qCi0JCSoqIHJlYWNxdWlyZSB0aGUgcXVldWUtc3BpbmxvY2sgZm9yIG1hbmlwdWxhdGluZwotCQkqKiB0aGUgcmVxdWVzdC1xdWV1ZSBhbmQgZGVxdWV1ZSB0aGUgcmVxdWVzdAotCQkqLwotCQlzcGluX2xvY2tfaXJxKCZjb3dkZXYtPnJxbG9jayk7Ci0KLQkJX19ibGtfZW5kX3JlcXVlc3RfY3VyKGNvd2Rldi0+cmVxLCBydik7Ci0JCWNvd2Rldi0+aW9idXN5ID0gMDsKLQotCQkvKgotCQkqKiBpbml0aWF0ZSB0aGUgbmV4dCByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlCi0JCSovCi0JCWNvd2xvX3JlcXVlc3QoY293ZGV2LT5ycXVldWUpOwotCi0JCXNwaW5fdW5sb2NrX2lycSgmY293ZGV2LT5ycWxvY2spOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSoqIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUga2VybmVsIHRocmVhZAotKiogdG8gaGFuZGxlIHRoZSBxdWV1ZWQgSS9PLXJlcXVlc3RzCi0qKgotKiogcmV0dXJuczoKLSoqIAkwICAgLSBmYWlsCi0qKiAgICAgIDEgICAtIHN1Y2Nlc3MKLSovCi1zdGF0aWMgbG9uZyBpbnQKLWNvd2xvX2RvX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSkKLXsKLQl1bnNpZ25lZCBsb25nCQlsZW47Ci0JbG9uZyBpbnQJCXJ2OwotCWxvZmZfdCAJCQlvZmZzZXQ7Ci0Jc3RydWN0IGNvd2xvb3BfZGV2aWNlCSpjb3dkZXYgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQotCS8qCi0JKiogY2FsY3VsYXRlIHNvbWUgdmFyaWFibGVzIHdoaWNoIGFyZSBuZWVkZWQgbGF0ZXIgb24KLQkqLwotCWxlbiAgICAgPSAgICAgICAgICBibGtfcnFfY3VyX3NlY3RvcnMocmVxKSA8PCA5OwotCW9mZnNldCAgPSAobG9mZl90KSBibGtfcnFfcG9zKHJlcSkgICAgICAgICA8PCA5OwotCi0JREVCVUdQKERDT1ciY293bG9vcCAtIHJlcSBjbWQ9JWQgb2Zmc2V0PSVsbGQgbGVuPSVsdSBhZGRyPSVwXG4iLAotCQkJCSoocmVxLT5jbWQpLCBvZmZzZXQsIGxlbiwgcmVxLT5idWZmZXIpOwotCi0JLyoKLQkqKiBoYW5kbGUgUkVBRC0gb3IgV1JJVEUtcmVxdWVzdAotCSovCi0Jc3dpdGNoIChycV9kYXRhX2RpcihyZXEpKSB7Ci0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JICAgY2FzZSBSRUFEOgotCQlzd2l0Y2ggKCBjb3dsb19jaGVja2lvKGNvd2RldiwgbGVuLCBvZmZzZXQpICkgewotCQkgICBjYXNlIEFMTENPVzoKLQkJCXJ2ID0gY293bG9fcmVhZGNvdyhjb3dkZXYsIHJlcS0+YnVmZmVyLCBsZW4sIG9mZnNldCk7Ci0JCQlicmVhazsKLQotCQkgICBjYXNlIEFMTFJETzoKLQkJCXJ2ID0gY293bG9fcmVhZHJkbyhjb3dkZXYsIHJlcS0+YnVmZmVyLCBsZW4sIG9mZnNldCk7Ci0JCQlicmVhazsKLQotCSAgIAkgICBjYXNlIE1JWEVEVVA6Ci0JCQlydiA9IGNvd2xvX3JlYWRtaXgoY293ZGV2LCByZXEtPmJ1ZmZlciwgbGVuLCBvZmZzZXQpOwotCQkJYnJlYWs7Ci0KLQkJICAgZGVmYXVsdDoKLQkJCXJ2ID0gMDsJLyogbmV2ZXIgaGFwcGVucyAqLwotCQl9Ci0JCWJyZWFrOwotCi0JICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JICAgY2FzZSBXUklURToKLQkJc3dpdGNoICggY293bG9fY2hlY2tpbyhjb3dkZXYsIGxlbiwgb2Zmc2V0KSApIHsKLQkJICAgY2FzZSBBTExDT1c6Ci0JCQkvKgotCQkJKiogc3RyYWlnaHQtZm9yd2FyZCB3cml0ZSB3aWxsIGRvLi4uCi0JCQkqLwotCQkJREVCVUdQKERDT1ciY293bG9vcCAtIHdyaXRlIHN0cmFpZ2h0ICIpOwotCi0JCQlydiA9IGNvd2xvX3dyaXRlY293KGNvd2RldiwgcmVxLT5idWZmZXIsIGxlbiwgb2Zmc2V0KTsKLQkJCWJyZWFrOwkvKiBmcm9tIHN3aXRjaCAqLwotCi0JCSAgIGNhc2UgQUxMUkRPOgotCQkJaWYgKCAobGVuICYgTVVNQVNLKSA9PSAwKSB7Ci0JCQkJREVCVUdQKERDT1ciY293bG9vcCAtIHdyaXRlIHN0cmFpZ2h0ICIpOwotCi0JCQkJcnYgPSBjb3dsb193cml0ZWNvdyhjb3dkZXYsIHJlcS0+YnVmZmVyLAotCQkJCQkJCQlsZW4sIG9mZnNldCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkgICAJICAgY2FzZSBNSVhFRFVQOgotCQkJcnYgPSBjb3dsb193cml0ZW1peChjb3dkZXYsIHJlcS0+YnVmZmVyLCBsZW4sIG9mZnNldCk7Ci0JCQlicmVhazsKLQotCQkgICBkZWZhdWx0OgotCQkJcnYgPSAwOwkvKiBuZXZlciBoYXBwZW5zICovCi0JCX0KLQkJYnJlYWs7Ci0KLQkgICBkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb3dsb29wIC0gdW5yZWNvZ25pemVkIGNvbW1hbmQgJWRcbiIsICoocmVxLT5jbWQpKTsKLQkJcnYgPSAwOwotCX0KLQotCXJldHVybiAocnYgPD0gMCA/IDAgOiAxKTsKLX0KLQotLyoKLSoqIGNoZWNrIGZvciBhIGdpdmVuIEkvTy1yZXF1ZXN0IGlmIGFsbCB1bmRlcmx5aW5nIGJsb2NrcwotKiogKHdpdGggc2l6ZSBNQVBVTklUKSBhcmUgZWl0aGVyIGluIHRoZSByZWFkLW9ubHkgZmlsZSBvciBpbgotKiogdGhlIGNvd2ZpbGUgKG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3bykKLSoqCi0qKiByZXR1cm5zOgotKiogCUFMTFJETyAgLSBhbGwgdW5kZXJseWluZyBibG9ja3MgaW4gcmRvZmlsZQotKiogICAgICBBTExDT1cgIC0gYWxsIHVuZGVybHlpbmcgYmxvY2tzIGluIGNvd2ZpbGUKLSoqICAgICAgTUlYRURVUCAtIHVuZGVybHlpbmcgYmxvY2tzIHBhcnRseSBpbiByZG9maWxlIGFuZCBwYXJ0bHkgaW4gY293ZmlsZQotKi8KLXN0YXRpYyBpbnQKLWNvd2xvX2NoZWNraW8oc3RydWN0IGNvd2xvb3BfZGV2aWNlICpjb3dkZXYsIGludCBsZW4sIGxvZmZfdCBvZmZzZXQpCi17Ci0JdW5zaWduZWQgbG9uZwltYXBudW0sIGJ5dGVudW0sIGJpdG51bSwgYmxvY2tuciwgcGFydGxlbjsKLQlsb25nIGludAl0b3RjbnQsIGNvd2NudDsKLQljaGFyCQkqbWM7Ci0KLQkvKgotCSoqIG5vdGljZSB0aGF0IHRoZSByZXF1ZXN0ZWQgYmxvY2sgbWlnaHQgY3Jvc3MKLQkqKiBhIGJsb2Nrc2l6ZSBib3VuZGFyeSB3aGlsZSBvbmUgb2YgdGhlIGNvbmNlcm5lZAotCSoqIGJsb2NrcyByZXNpZGVzIGluIHRoZSByZWFkLW9ubHkgZmlsZSBhbmQgYW5vdGhlcgotCSoqIG9uZSBpbiB0aGUgY29weS1vbi13cml0ZSBmaWxlOyBpbiB0aGF0IGNhc2UgdGhlCi0gICAgICAgICoqIHJlcXVlc3Qgd2lsbCBiZSBicm9rZW4gdXAgaW50byBwaWVjZXMKLQkqLwotCWlmICggKGxlbiA8PSBNQVBVTklUKSAmJgotCSAgICAgKE1BUFVOSVQgLSAob2Zmc2V0ICYgTVVNQVNLKSA8PSBsZW4pICkgewotCQkvKgotCQkqKiBlYXN5IHNpdHVhdGlvbjoKLQkJKiogcmVxdWVzdGVkIGRhdGEtYmxvY2sgZW50aXJlbHkgZml0cyB3aXRoaW4KLQkJKiogdGhlIG1hcHVuaXQgdXNlZCBmb3IgdGhlIGJpdG1hcAotCQkqKiBjaGVjayBpZiB0aGF0IGJsb2NrIGlzIGxvY2F0ZWQgaW4gcmRvZmlsZSBvcgotCQkqKiBjb3dmaWxlCi0JCSovCi0JCWJsb2NrbnIgPSBvZmZzZXQgPj4gTVVTSElGVDsKLQotCQltYXBudW0gID0gQ0FMQ01BUCAoYmxvY2tucik7Ci0JCWJ5dGVudW0gPSBDQUxDQllURShibG9ja25yKTsKLQkJYml0bnVtICA9IENBTENCSVQgKGJsb2NrbnIpOwotCi0JCWlmICgqKCooY293ZGV2LT5tYXBjYWNoZSttYXBudW0pK2J5dGVudW0pJigxPDxiaXRudW0pKQotCQkJcmV0dXJuIEFMTENPVzsKLQkJZWxzZQotCQkJcmV0dXJuIEFMTFJETzsKLQl9Ci0KLQkvKgotCSoqIGxlc3MgZWFzeSBzaXR1YXRpb246Ci0JKiogdGhlIHJlcXVlc3RlZCBkYXRhLWJsb2NrIGRvZXMgbm90IGZpdCB3aXRoaW4gdGhlIG1hcHVuaXQKLQkqKiB1c2VkIGZvciB0aGUgYml0bWFwCi0JKiogY2hlY2sgaWYgKmFsbCogdW5kZXJseWluZyBibG9ja3MgaW52b2x2ZWQgcmVzaWRlIG9uIHRoZSByZG9maWxlCi0gICAgICAgCSoqIG9yIHRoZSBjb3dmaWxlIChzbyBzdGlsbCBubyBicmVha3VwIHJlcXVpcmVkKQotCSovCi0JZm9yIChjb3djbnQ9dG90Y250PTA7IGxlbiA+IDA7IGxlbi09cGFydGxlbiwgb2Zmc2V0Kz1wYXJ0bGVuLCB0b3RjbnQrKyl7Ci0JCS8qCi0JCSoqIGNhbGN1bGF0ZSBibG9ja25yIG9mIGludm9sdmVkIGJsb2NrCi0JCSovCi0JCWJsb2NrbnIgPSBvZmZzZXQgPj4gTVVTSElGVDsKLQotCQkvKgotCQkqKiBjYWxjdWxhdGUgcGFydGlhbCBsZW5ndGggZm9yIHRoaXMgdHJhbnNmZXIKLQkJKi8KLQkJcGFydGxlbiA9IE1BUFVOSVQgLSAob2Zmc2V0ICYgTVVNQVNLKTsKLQkJaWYgKHBhcnRsZW4gPiBsZW4pCi0JCQlwYXJ0bGVuID0gbGVuOwotCi0JCS8qCi0JCSoqIGlzIHRoaXMgYmxvY2sgbG9jYXRlZCBpbiB0aGUgY293ZmlsZQotCQkqLwotCQltYXBudW0gID0gQ0FMQ01BUCAoYmxvY2tucik7Ci0JCWJ5dGVudW0gPSBDQUxDQllURShibG9ja25yKTsKLQkJYml0bnVtICA9IENBTENCSVQgKGJsb2NrbnIpOwotCi0JCW1jCT0gKihjb3dkZXYtPm1hcGNhY2hlK21hcG51bSk7Ci0KLQkJaWYgKCoobWMrYnl0ZW51bSkmKDE8PGJpdG51bSkpCi0JCQljb3djbnQrKzs7Ci0KLQkJREVCVUdQKERDT1cKLQkJICAgICAgICJjb3dsb29wIC0gY2hlY2sgJWx1IC0gbWFwICVsdSwgYnl0ZSAlbHUsIGJpdCAlbHUsICIKLQkJICAgICAgICJjb3djbnQgJWxkLCB0b3RjbnQgJWxkICUwMnggJXBcbiIsCi0JCQlibG9ja25yLCBtYXBudW0sIGJ5dGVudW0sIGJpdG51bSwgY293Y250LCB0b3RjbnQsCi0JCQkqKG1jK2J5dGVudW0pLCBtYyk7Ci0JfQotCi0JaWYgKGNvd2NudCA9PSAwKQkvKiBhbGwgaW52b2x2ZWQgYmxvY2tzIG9uIHJkb2ZpbGU/ICovCi0JCXJldHVybiBBTExSRE87Ci0KLQlpZiAoY293Y250ID09IHRvdGNudCkJLyogYWxsIGludm9sdmVkIGJsb2NrcyBvbiBjb3dmaWxlPyAqLwotCQlyZXR1cm4gQUxMQ09XOwotCi0JLyoKLQkqKiBzaXR1YXRpb24gc29tZXdoYXQgbW9yZSBjb21wbGljYXRlZDoKLQkqKiBpbnZvbHZlZCB1bmRlcmx5aW5nIGJsb2NrcyBzcHJlYWQgb3ZlciBib3RoIGZpbGVzCi0JKi8KLQlyZXR1cm4gTUlYRURVUDsKLX0KLQotLyoKLSoqIHJlYWQgcmVxdWVzdGVkIGNodW5rIHBhcnRseSBmcm9tIHJkb2ZpbGUgYW5kIHBhcnRseSBmcm9tIGNvd2ZpbGUKLSoqCi0qKiByZXR1cm5zOgotKiogCTAgICAtIGZhaWwKLSoqICAgICAgMSAgIC0gc3VjY2VzcwotKi8KLXN0YXRpYyBpbnQKLWNvd2xvX3JlYWRtaXgoc3RydWN0IGNvd2xvb3BfZGV2aWNlICpjb3dkZXYsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgbG9mZl90IG9mZnNldCkKLXsKLQl1bnNpZ25lZCBsb25nCW1hcG51bSwgYnl0ZW51bSwgYml0bnVtLCBibG9ja25yLCBwYXJ0bGVuOwotCWxvbmcgaW50CXJ2OwotCWNoYXIJCSptYzsKLQotCS8qCi0JKiogY29tcGxpY2F0ZWQgYXBwcm9hY2g6IGJyZWFrdXAgcmVxdWlyZWQgb2YgcmVhZC1yZXF1ZXN0Ci0JKi8KLQlmb3IgKHJ2PTE7IGxlbiA+IDA7IGxlbi09cGFydGxlbiwgYnVmKz1wYXJ0bGVuLCBvZmZzZXQrPXBhcnRsZW4pIHsKLQkJLyoKLQkJKiogY2FsY3VsYXRlIGJsb2NrbnIgb2YgZW50aXJlIGJsb2NrCi0JCSovCi0JCWJsb2NrbnIgPSBvZmZzZXQgPj4gTVVTSElGVDsKLQotCQkvKgotCQkqKiBjYWxjdWxhdGUgcGFydGlhbCBsZW5ndGggZm9yIHRoaXMgdHJhbnNmZXIKLQkJKi8KLQkJcGFydGxlbiA9IE1BUFVOSVQgLSAob2Zmc2V0ICYgTVVNQVNLKTsKLQkJaWYgKHBhcnRsZW4gPiBsZW4pCi0JCQlwYXJ0bGVuID0gbGVuOwotCi0JCS8qCi0JCSoqIGlzIHRoaXMgYmxvY2sgbG9jYXRlZCBpbiB0aGUgY293ZmlsZQotCQkqLwotCQltYXBudW0gID0gQ0FMQ01BUCAoYmxvY2tucik7Ci0JCWJ5dGVudW0gPSBDQUxDQllURShibG9ja25yKTsKLQkJYml0bnVtICA9IENBTENCSVQgKGJsb2NrbnIpOwotCQltYwk9ICooY293ZGV2LT5tYXBjYWNoZSttYXBudW0pOwotCi0JCWlmICgqKG1jK2J5dGVudW0pJigxPDxiaXRudW0pKSB7Ci0JCQkvKgotCQkJKiogcmVhZCAocGFydGlhbCkgYmxvY2sgZnJvbSBjb3dmaWxlCi0JCQkqLwotCQkJREVCVUdQKERDT1ciY293bG9vcCAtIHNwbGl0IHJlYWQgIgotCQkJCSJjb3cgcGFydGxlbj0lbGQgb2ZmPSVsbGRcbiIsIHBhcnRsZW4sIG9mZnNldCk7Ci0KLQkJCWlmIChjb3dsb19yZWFkY293KGNvd2RldiwgYnVmLCBwYXJ0bGVuLCBvZmZzZXQpIDw9IDApCi0JCQkJcnYgPSAwOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSoqIHJlYWQgKHBhcnRpYWwpIGJsb2NrIGZyb20gcmRvZmlsZQotCQkJKi8KLQkJCURFQlVHUChEQ09XImNvd2xvb3AgLSBzcGxpdCByZWFkICIKLQkJCQkicmRvIHBhcnRsZW49JWxkIG9mZj0lbGxkXG4iLCBwYXJ0bGVuLCBvZmZzZXQpOwotCi0JCQlpZiAoY293bG9fcmVhZHJkbyhjb3dkZXYsIGJ1ZiwgcGFydGxlbiwgb2Zmc2V0KSA8PSAwKQotCQkJCXJ2ID0gMDsKLQkJfQotCX0KLQotCXJldHVybiBydjsKLX0KLQotLyoKLSoqIGNodW5rIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNvd2ZpbGUgbmVlZHMgcGllY2VzIHRvIGJlCi0qKiByZWFkIGZyb20gdGhlIHJkb2ZpbGUKLSoqCi0qKiByZXR1cm5zOgotKiogCTAgICAtIGZhaWwKLSoqICAgICAgMSAgIC0gc3VjY2VzcwotKi8KLXN0YXRpYyBpbnQKLWNvd2xvX3dyaXRlbWl4KHN0cnVjdCBjb3dsb29wX2RldmljZSAqY293ZGV2LCB2b2lkICpidWYsIGludCBsZW4sIGxvZmZfdCBvZmZzZXQpCi17Ci0JdW5zaWduZWQgbG9uZwltYXBudW0sIGJ5dGVudW0sIGJpdG51bSwgYmxvY2tuciwgcGFydGxlbjsKLQlsb25nIGludAlydjsKLQljaGFyCQkqbWM7Ci0KLQkvKgotCSoqIHNvbWV3aGF0IG1vcmUgY29tcGxpY2F0ZWQgc3R1ZmYgaXMgcmVxdWlyZWQ6Ci0JKiogaWYgdGhlIHJlcXVlc3QgaXMgbGFyZ2VyIHRoYW4gb25lIHVuZGVybHlpbmcKLQkqKiBibG9jayBvciBpcyBzcHJlYWQgb3ZlciB0d28gdW5kZXJseWluZyBibG9ja3MsCi0JKiogc3BsaXQgdGhlIHJlcXVlc3QgaW50byBwaWVjZXM7IGlmIGEgYmxvY2sgZG9lcyBub3QKLQkqKiBzdGFydCBhdCBhIGJsb2NrIGJvdW5kYXJ5LCB0YWtlIGNhcmUgdGhhdAotCSoqIHN1cnJvdW5kaW5nIGRhdGEgaXMgcmVhZCBmaXJzdCAoaWYgbmVlZGVkKSwKLQkqKiBmaXQgdGhlIG5ldyBkYXRhIGluIGFuZCB3cml0ZSBpdCBhcyBhIGZ1bGwgYmxvY2sKLQkqLwotCWZvciAocnY9MTsgbGVuID4gMDsgbGVuLT1wYXJ0bGVuLCBidWYrPXBhcnRsZW4sIG9mZnNldCs9cGFydGxlbikgewotCQkvKgotCQkqKiBjYWxjdWxhdGUgcGFydGlhbCBsZW5ndGggZm9yIHRoaXMgdHJhbnNmZXIKLQkJKi8KLQkJcGFydGxlbiA9IE1BUFVOSVQgLSAob2Zmc2V0ICYgTVVNQVNLKTsKLQkJaWYgKHBhcnRsZW4gPiBsZW4pCi0JCQlwYXJ0bGVuID0gbGVuOwotCi0JCS8qCi0JCSoqIGNhbGN1bGF0ZSBibG9ja25yIG9mIGVudGlyZSBibG9jawotCQkqLwotCQlibG9ja25yID0gb2Zmc2V0ID4+IE1VU0hJRlQ7Ci0KLQkJLyoKLQkJKiogaGFzIHRoaXMgYmxvY2sgYmVlbiB3cml0dGVuIGJlZm9yZT8KLQkJKi8KLQkJbWFwbnVtICA9IENBTENNQVAgKGJsb2NrbnIpOwotCQlieXRlbnVtID0gQ0FMQ0JZVEUoYmxvY2tucik7Ci0JCWJpdG51bSAgPSBDQUxDQklUIChibG9ja25yKTsKLQkJbWMJPSAqKGNvd2Rldi0+bWFwY2FjaGUrbWFwbnVtKTsKLQotCQlpZiAoKihtYytieXRlbnVtKSYoMTw8Yml0bnVtKSkgewotCQkJLyoKLQkJCSoqIGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gYmVmb3JlOwotCQkJKiogd3JpdGUgdHJhbnNwYXJhbnRseSB0byBjb3dmaWxlCi0JCQkqLwotCQkJREVCVUdQKERDT1cKLQkJCSAgICAgICAiY293bG9vcCAtIHNwbGl0d3IgdHJhbnNwXG4iKTsKLQotCQkJaWYgKGNvd2xvX3dyaXRlY293KGNvd2RldiwgYnVmLCBwYXJ0bGVuLCBvZmZzZXQpIDw9IDApCi0JCQkJcnYgPSAwOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSoqIGJsb2NrIGhhcyBuZXZlciBiZWVuIHdyaXR0ZW4gYmVmb3JlLAotCQkJKiogc28gcmVhZCBlbnRpcmUgYmxvY2sgZnJvbQotCQkJKiogcmVhZC1vbmx5IGZpbGUgZmlyc3QsIHVubGVzcwotCQkJKiogYSBmdWxsIGJsb2NrIGlzIHJlcXVlc3RlZCB0bwotCQkJKiogYmUgd3JpdHRlbgotCQkJKi8KLQkJCWlmIChwYXJ0bGVuIDwgTUFQVU5JVCkgewotCQkJCWlmIChjb3dsb19yZWFkcmRvKGNvd2RldiwgY293ZGV2LT5pb2J1ZiwKLQkJCQkgICAgICBNQVBVTklULCAobG9mZl90KWJsb2NrbnIgPDwgTVVTSElGVCkgPD0gMCkKLQkJCQkJcnYgPSAwOwotCQkJfQotCi0JCQkvKgotCQkJKiogdHJhbnNmZXIgbW9kaWZpZWQgcGFydCBpbnRvCi0JCQkqKiB0aGUgYmxvY2sganVzdCByZWFkCi0JCQkqLwotCQkJbWVtY3B5KGNvd2Rldi0+aW9idWYgKyAob2Zmc2V0ICYgTVVNQVNLKSwgYnVmLCBwYXJ0bGVuKTsKLQotCQkJLyoKLQkJCSoqIHdyaXRlIGVudGlyZSBibG9jayB0byBjb3dmaWxlCi0JCQkqLwotCQkJREVCVUdQKERDT1ciY293bG9vcCAtIHNwbGl0ICIKLQkJCQkicGFydGxlbj0lbGQgb2ZmPSVsbGRcbiIsCi0JCQkJcGFydGxlbiwgKGxvZmZfdClibG9ja25yIDw8IE1VU0hJRlQpOwotCi0JCQlpZiAoY293bG9fd3JpdGVjb3coY293ZGV2LCBjb3dkZXYtPmlvYnVmLCBNQVBVTklULAotCQkJCQkgICAgIChsb2ZmX3QpYmxvY2tuciA8PCBNVVNISUZUKSA8PSAwKQotCQkJCXJ2ID0gMDsKLQkJfQotCX0KLQotCXJldHVybiBydjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSS9PLXN1cHBvcnQgZm9yIHJlYWQtb25seSBmaWxlIGFuZCBjb3B5LW9uLXdyaXRlIGZpbGUgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotKiogcmVhZCBkYXRhIGZyb20gdGhlIHJlYWQtb25seSBmaWxlCi0qKgotKiogcmV0dXJuLXZhbHVlOiBzaW1pbGFyIHRvIHVzZXItbW9kZSByZWFkCi0qLwotc3RhdGljIGxvbmcgaW50Ci1jb3dsb19yZWFkcmRvKHN0cnVjdCBjb3dsb29wX2RldmljZSAqY293ZGV2LCB2b2lkICpidWYsIGludCBsZW4sIGxvZmZfdCBvZmZzZXQpCi17Ci0JbG9uZyBpbnQJcnY7Ci0JbW1fc2VnbWVudF90CW9sZF9mczsKLQlsb2ZmX3QJCXNhdmVvZmZzZXQgPSBvZmZzZXQ7Ci0KLQlERUJVR1AoRENPVyJjb3dsb29wIC0gcmVhZHJkbyBjYWxsZWRcbiIpOwotCi0gICAgICAgIG9sZF9mcyA9IGdldF9mcygpOwotCXNldF9mcyggZ2V0X2RzKCkgKTsKLQlydiA9IGNvd2Rldi0+cmRvZnAtPmZfb3AtPnJlYWQoY293ZGV2LT5yZG9mcCwgYnVmLCBsZW4sICZvZmZzZXQpOwotICAgICAgICBzZXRfZnMob2xkX2ZzKTsKLQotCWlmIChydiA8IGxlbikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb3dsb29wIC0gcmVhZC1mYWlsdXJlICVsZCBvbiByZG9maWxlIgotCQkgICAgICAgICAgICAgICAgICAgICItIG9mZnNldD0lbGxkIGxlbj0lZFxuIiwKLQkJCQkJcnYsIHNhdmVvZmZzZXQsIGxlbik7Ci0JfQotCi0JY293ZGV2LT5yZG9yZWFkcysrOwotCXJldHVybiBydjsKLX0KLQotLyoKLSoqIHJlYWQgY293ZmlsZSBmcm9tIGEgbW9kaWZpZWQgb2Zmc2V0LCBpLmUuIHNraXBwaW5nIHRoZSBiaXRtYXAgYW5kIGNvd2hlYWQKLSoqCi0qKiByZXR1cm4tdmFsdWU6IHNpbWlsYXIgdG8gdXNlci1tb2RlIHJlYWQKLSovCi1zdGF0aWMgbG9uZyBpbnQKLWNvd2xvX3JlYWRjb3coc3RydWN0IGNvd2xvb3BfZGV2aWNlICpjb3dkZXYsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgbG9mZl90IG9mZnNldCkKLXsKLQlERUJVR1AoRENPVyJjb3dsb29wIC0gcmVhZGNvdyBjYWxsZWRcbiIpOwotCi0Jb2Zmc2V0ICs9IGNvd2Rldi0+Y293aGVhZC0+ZG9mZnNldDsKLQotCXJldHVybiBjb3dsb19yZWFkY293cmF3KGNvd2RldiwgYnVmLCBsZW4sIG9mZnNldCk7Ci19Ci0KLS8qCi0qKiByZWFkIGNvd2ZpbGUgZnJvbSBhbiBhYnNvbHV0ZSBvZmZzZXQKLSoqCi0qKiByZXR1cm4tdmFsdWU6IHNpbWlsYXIgdG8gdXNlci1tb2RlIHJlYWQKLSovCi1zdGF0aWMgbG9uZyBpbnQKLWNvd2xvX3JlYWRjb3dyYXcoc3RydWN0IGNvd2xvb3BfZGV2aWNlICpjb3dkZXYsCi0JCQkJCXZvaWQgKmJ1ZiwgaW50IGxlbiwgbG9mZl90IG9mZnNldCkKLXsKLQlsb25nIGludAlydjsKLQltbV9zZWdtZW50X3QJb2xkX2ZzOwotCWxvZmZfdAkJc2F2ZW9mZnNldCA9IG9mZnNldDsKLQotCURFQlVHUChEQ09XImNvd2xvb3AgLSByZWFkY293cmF3IGNhbGxlZFxuIik7Ci0KLQkvKgotCSoqIGJlIHN1cmUgdGhhdCBjb3dmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZC13cml0ZQotCSovCi0JaWYgKCAhKGNvd2Rldi0+c3RhdGUgJiBDT1dDT1dPUEVOKSApIHsKLQkJIHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICAiY293bG9vcCAtIHJlYWQgcmVxdWVzdCBmcm9tIGNvd2ZpbGUgcmVmdXNlZFxuIik7Ci0KLQkJcmV0dXJuIC1FQkFERjsKLQl9Ci0KLQkvKgotCSoqIGlzc3VlIGxvdyBsZXZlbCByZWFkCi0JKi8KLSAgICAgICAgb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0Jc2V0X2ZzKCBnZXRfZHMoKSApOwotCXJ2ID0gY293ZGV2LT5jb3dmcC0+Zl9vcC0+cmVhZChjb3dkZXYtPmNvd2ZwLCBidWYsIGxlbiwgJm9mZnNldCk7Ci0gICAgICAgIHNldF9mcyhvbGRfZnMpOwotCi0JaWYgKHJ2IDwgbGVuKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJjb3dsb29wIC0gcmVhZC1mYWlsdXJlICVsZCBvbiBjb3dmaWxlIgotCQkgICAgICAgIi0gb2Zmc2V0PSVsbGQgbGVuPSVkXG4iLCBydiwgc2F2ZW9mZnNldCwgbGVuKTsKLQl9Ci0KLQljb3dkZXYtPmNvd3JlYWRzKys7Ci0JcmV0dXJuIHJ2OwotfQotCi0vKgotKiogd3JpdGUgY293ZmlsZSBmcm9tIGEgbW9kaWZpZWQgb2Zmc2V0LCBpLmUuIHNraXBwaW5nIHRoZSBiaXRtYXAgYW5kIGNvd2hlYWQKLSoqCi0qKiBpZiBhIGJsb2NrIGlzIHdyaXR0ZW4gZm9yIHRoZSBmaXJzdCB0aW1lIHdoaWxlIGl0cyBjb250ZW50cyBjb25zaXN0cwotKiogb2YgYmluYXJ5IHplcm9lcyBvbmx5LCB0aGUgY29uY2VybmluZyBiaXRtYXAgaXMgZmx1c2hlZCB0byB0aGUgY293ZmlsZQotKioKLSoqIHJldHVybi12YWx1ZTogc2ltaWxhciB0byB1c2VyLW1vZGUgd3JpdGUKLSovCi1zdGF0aWMgbG9uZyBpbnQKLWNvd2xvX3dyaXRlY293KHN0cnVjdCBjb3dsb29wX2RldmljZSAqY293ZGV2LCB2b2lkICpidWYsIGludCBsZW4sIGxvZmZfdCBvZmZzZXQpCi17Ci0JbG9uZyBpbnQJcnY7Ci0JdW5zaWduZWQgbG9uZwltYXBudW09MCwgbWFwYnl0ZT0wLCBtYXBiaXQ9MCwgY293YmxvY2s9MCwgcGFydGxlbjsKLQljaGFyCQkqdG1wcHRyLCAgKm1hcHB0ciA9IE5VTEw7Ci0JbG9mZl90CQl0bXBvZmZzZXQsIG1hcG9mZnNldCA9IDA7Ci0KLQlERUJVR1AoRENPVyJjb3dsb29wIC0gd3JpdGVjb3cgY2FsbGVkXG4iKTsKLQotCS8qCi0JKiogYmUgc3VyZSB0aGF0IGNvd2ZpbGUgaXMgb3BlbmVkIGZvciByZWFkLXdyaXRlCi0JKi8KLQlpZiAoICEoY293ZGV2LT5zdGF0ZSAmIENPV1JXQ09XT1BFTikgKSB7Ci0JCSBwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAgImNvd2xvb3AgLSBXcml0ZSByZXF1ZXN0IHRvIGNvd2ZpbGUgcmVmdXNlZFxuIik7Ci0KLQkJcmV0dXJuIC1FQkFERjsKLQl9Ci0KLQkvKgotCSoqIHdyaXRlIHRoZSBlbnRpcmUgYmxvY2sgdG8gdGhlIGNvd2ZpbGUKLQkqLwotCXRtcG9mZnNldCA9IG9mZnNldCArIGNvd2Rldi0+Y293aGVhZC0+ZG9mZnNldDsKLQotCXJ2ID0gY293bG9fd3JpdGVjb3dyYXcoY293ZGV2LCBidWYsIGxlbiwgdG1wb2Zmc2V0KTsKLQotCS8qCi0JKiogdmVyaWZ5IGlmIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgb24gZmlsZXN5c3RlbSBob2xkaW5nCi0JKiogdGhlIGNvd2ZpbGUKLQkqKiAgIC0gd2hlbiB0aGUgbGFzdCB3cml0ZSBmYWlsZWQgKG1pZ2h0IGJlIGNhdXNlZCBieSBsYWNrIG9mIHNwYWNlKQotCSoqICAgLSB3aGVuIGEgd2F0Y2hlciBpcyBhY3RpdmUgKHRvIHJlYWN0IGFkZXF1YXRseSkKLQkqKiAgIC0gd2hlbiB0aGUgcHJldmlvdXMgY2hlY2sgaW5kaWNhdGVkIGZzIHdhcyBhbG1vc3QgZnVsbAotCSoqICAgLSB3aXRoIHJlZ3VsYXIgaW50ZXJ2YWxzCi0JKi8KLQlpZiAoIChydiA8PSAwKQkJCQkgICAgICAgfHwKLQkgICAgIChjb3dkZXYtPnN0YXRlICAgICAgICAmIENPV1dBVENIRE9HKSAgICAgIHx8Ci0JICAgICAoY293ZGV2LT5ibGthdmFpbCAvIDIgPCBTUENERkxJTlRWTCkgICAgICB8fAotCSAgICAgKGNvd2Rldi0+Y293d3JpdGVzICAgICUgU1BDREZMSU5UVkwgPT0gMCkgKSB7Ci0JCXN0cnVjdCBrc3RhdGZzCQlrczsKLQotCQlpZiAodmZzX3N0YXRmcyhjb3dkZXYtPmNvd2ZwLT5mX2RlbnRyeSwgJmtzKT09MCl7Ci0JCQlpZiAoa3MuZl9iYXZhaWwgPD0gU1BDTUlOQkxLKSB7Ci0JCQkJc3dpdGNoIChrcy5mX2JhdmFpbCkgewotCQkJCSAgIGNhc2UgMDoKLQkJCQkgICBjYXNlIDE6Ci0JCQkJICAgY2FzZSAyOgotCQkJCSAgIGNhc2UgMzoKLQkJCQkJcHJpbnRrKEtFUk5fQUxFUlQKLQkJCQkJICAgICAgICJjb3dsb29wIC0gIgotCQkJCQkgICAgICAgIkFMRVJUOiBjb3dmaWxlIGZ1bGwhXG4iKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQkgICBkZWZhdWx0OgotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJCSAgICAgICAiY293bG9vcCAtIGNvd2ZpbGUgYWxtb3N0ICIKLQkJCQkJICAgICAgICJmdWxsIChvbmx5ICVsbHUgS2IgZnJlZSlcbiIsCi0JCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3MuZl9ic2l6ZSAqIGtzLmZfYmF2YWlsIC8xMDI0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNvd2Rldi0+YmxrdG90YWwgPSBrcy5mX2Jsb2NrczsKLQkJCWNvd2Rldi0+YmxrYXZhaWwgPSBrcy5mX2JhdmFpbDsKLQotCQkJLyoKLQkJCSoqIHdha2V1cCB3YXRjaGVyIGlmIHRocmVzaG9sZCBoYXMgYmVlbiByZWFjaGVkCi0JCQkqLwotCQkJaWYgKCAoY293ZGV2LT5zdGF0ZSAmIENPV1dBVENIRE9HKSAmJgotCQkJICAgIChjb3dkZXYtPndhdGNodGhyZXNoID49IGNvd2Rldi0+YmxrYXZhaWwpICkgewotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY293ZGV2LT53YXRjaHEpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHJ2IDw9IDApCi0JCXJldHVybiBydjsKLQotCURFQlVHUChEQ09XImNvd2xvb3AgLSBibG9jayB3cml0dGVuXG4iKTsKLQotCS8qCi0JKiogY2hlY2sgaWYgYmxvY2socykgaXMvYXJlIHdyaXR0ZW4gdG8gdGhlIGNvd2ZpbGUKLQkqKiBmb3IgdGhlIGZpcnN0IHRpbWU7IGlmIHNvLCBhZGFwdCB0aGUgYml0bWFwCi0JKi8KLQlmb3IgKDsgbGVuID4gMDsgbGVuLT1wYXJ0bGVuLCBvZmZzZXQrPXBhcnRsZW4sIGJ1Zis9cGFydGxlbikgewotCQkvKgotCQkqKiBjYWxjdWxhdGUgcGFydGlhbCBsZW5ndGggZm9yIHRoaXMgdHJhbnNmZXIKLQkJKi8KLQkJcGFydGxlbiA9IE1BUFVOSVQgLSAob2Zmc2V0ICYgTVVNQVNLKTsKLQkJaWYgKHBhcnRsZW4gPiBsZW4pCi0JCQlwYXJ0bGVuID0gbGVuOwotCi0JCS8qCi0JCSoqIGNhbGN1bGF0ZSBiaXRuciBvZiB3cml0dGVuIGNodW5rIG9mIGNvd2Jsb2NrCi0JCSovCi0JCWNvd2Jsb2NrID0gb2Zmc2V0ID4+IE1VU0hJRlQ7Ci0KLQkJbWFwbnVtICAgPSBDQUxDTUFQIChjb3dibG9jayk7Ci0JCW1hcGJ5dGUgID0gQ0FMQ0JZVEUoY293YmxvY2spOwotCQltYXBiaXQgICA9IENBTENCSVQgKGNvd2Jsb2NrKTsKLQotCQlpZiAoKigqKGNvd2Rldi0+bWFwY2FjaGUrbWFwbnVtKSttYXBieXRlKSAmICgxPDxtYXBiaXQpKQotCQkJY29udGludWU7CS8qIGFscmVhZHkgd3JpdHRlbiBiZWZvcmUgKi8KLQotCSAgICAgICAJLyoKLQkJKiogaWYgdGhlIGJsb2NrIGlzIHdyaXR0ZW4gZm9yIHRoZSBmaXJzdCB0aW1lLAotCQkqKiB0aGUgY29ycmVzcG9uZGluZyBiaXQgc2hvdWxkIGJlIHNldCBpbiB0aGUgYml0bWFwCi0JCSovCi0JCSooKihjb3dkZXYtPm1hcGNhY2hlK21hcG51bSkrbWFwYnl0ZSkgfD0gKDE8PG1hcGJpdCk7Ci0KLQkJY293ZGV2LT5ucmNvd2Jsb2NrcysrOwotCi0JCURFQlVHUChEQ09XImNvd2xvb3AgLSBiaXR1cGRhdGUgYmxrPSVsZCBtYXA9JWxkICIKLQkJICAgICAgICAiYnl0ZT0lbGQgYml0PSVsZFxuIiwKLQkJCWNvd2Jsb2NrLCBtYXBudW0sIG1hcGJ5dGUsIG1hcGJpdCk7Ci0KLQkJLyoKLQkJKiogY2hlY2sgaWYgdGhlIGNvd2hlYWQgaW4gdGhlIGNvd2ZpbGUgaXMgY3VycmVudGx5Ci0JCSoqIG1hcmtlZCBjbGVhbjsgaWYgc28sIG1hcmsgaXQgZGlydHkgYW5kIGZsdXNoIGl0Ci0JCSovCi0JCWlmICggIShjb3dkZXYtPmNvd2hlYWQtPmZsYWdzICY9IENPV0RJUlRZKSkgewotCQkJY293ZGV2LT5jb3doZWFkLT5mbGFncwl8PSBDT1dESVJUWTsKLQotCQkJY293bG9fd3JpdGVjb3dyYXcoY293ZGV2LCBjb3dkZXYtPmNvd2hlYWQsCi0JCQkJCQkJTUFQVU5JVCwgKGxvZmZfdCkwKTsKLQkJfQotCi0JCS8qCi0JCSoqIGlmIHRoZSB3cml0dGVuIGRhdGFibG9jayBjb250YWluZWQgYmluYXJ5IHplcm9lcywKLQkJKiogdGhlIGJpdG1hcCBibG9jayBzaG91bGQgYmUgbWFya2VkIHRvIGJlIGZsdXNoZWQgdG8gZGlzawotCQkqKiAoYmxvY2tzIGNvbnRhaW5pbmcgYWxsIHplcm9lcyBjYW5ub3QgYmUgcmVjb3ZlcmVkIGJ5Ci0JCSoqIHRoZSBjb3dyZXBhaXItcHJvZ3JhbSBsYXRlciBvbiBpZiBjb3dsb29wIGlzIG5vdCBwcm9wZXJseQotCQkqKiByZW1vdmVkIHZpYSBybW1vZCkKLQkJKi8KLQkJaWYgKCBtZW1jbXAoYnVmLCBhbGx6ZXJvZXMsIHBhcnRsZW4pICkgLyogbm90IGFsbCB6ZXJvZXM/ICovCi0JCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZmx1c2ggbmVlZGVkICovCi0KLQkJLyoKLQkJKiogY2FsY3VsYXRlIHBvc2l0aW9ucyBvZiBiaXRtYXAgYmxvY2sgdG8gYmUgZmx1c2hlZAotCQkqKiAtIHBvaW50ZXIgb2YgYml0bWFwIGJsb2NrIGluIG1lbW9yeQotCQkqKiAtIG9mZnNldCAgb2YgYml0bWFwIGJsb2NrIGluIGNvd2ZpbGUKLQkJKi8KLQkJdG1wcHRyICAgID0gKihjb3dkZXYtPm1hcGNhY2hlK21hcG51bSkgKyAobWFwYnl0ZSAmICh+TVVNQVNLKSk7Ci0JCXRtcG9mZnNldCA9IChsb2ZmX3QpIE1BUFVOSVQgKyBtYXBudW0gKiBNQVBDSFVOS1NaICsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGJ5dGUgJiAofk1VTUFTSykpOwotCi0JCS8qCi0JCSoqIGZsdXNoIGEgYml0bWFwIGJsb2NrIGF0IHRoZSBtb21lbnQgdGhhdCBhbGwgYml0cyBoYXZlCi0JCSoqIGJlZW4gc2V0IGluIHRoYXQgYmxvY2ssIGkuZS4gYXQgdGhlIG1vbWVudCB0aGF0IHdlCi0JCSoqIHN3aXRjaCB0byBhbm90aGVyIGJpdG1hcCBibG9jawotCQkqLwotCQlpZiAoIChtYXBvZmZzZXQgIT0gMCkgJiYgKG1hcG9mZnNldCAhPSB0bXBvZmZzZXQpICkgewotCQkJaWYgKGNvd2xvX3dyaXRlY293cmF3KGNvd2RldiwgbWFwcHRyLCBNQVBVTklULAotCQkJCQkJCW1hcG9mZnNldCkgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSAgICAgICAiY293bG9vcCAtIHdyaXRlLWZhaWx1cmUgb24gYml0bWFwIC0gIgotCQkJCSAgICAgICAiYmxrPSVsZCBtYXA9JWxkIGJ5dGU9JWxkIGJpdD0lbGRcbiIsCi0JCQkJICAJY293YmxvY2ssIG1hcG51bSwgbWFwYnl0ZSwgbWFwYml0KTsKLQkJCX0KLQotCQkJREVCVUdQKERDT1ciY293bG9vcCAtIGJpdG1hcCBibGsgd3JpdHRlbiAlbGxkXG4iLAotCQkJCQkJCQltYXBvZmZzZXQpOwotCQl9Ci0KLQkJLyoKLQkJKiogcmVtZW1iZXIgb2Zmc2V0IGluIGNvd2ZpbGUgYW5kIG9mZnNldCBpbiBtZW1vcnkKLQkJKiogZm9yIGJpdG1hcCB0byBiZSBmbHVzaGVkOyBmbHVzaGluZyB3aWxsIGJlIGRvbmUKLQkJKiogYXMgc29vbiBhcyBhbGwgdXBkYXRlcyBpbiB0aGlzIGJpdG1hcCBibG9jayBoYXZlCi0JCSoqIGJlZW4gZG9uZQotCQkqLwotCQltYXBvZmZzZXQgPSB0bXBvZmZzZXQ7Ci0JCW1hcHB0ciAgICA9IHRtcHB0cjsKLQl9Ci0KLQkvKgotCSoqIGFueSBuZXcgYmxvY2sgd3JpdHRlbiBjb250YWluaW5nIGJpbmFyeSB6ZXJvZXM/Ci0JKi8KLQlpZiAobWFwb2Zmc2V0KSB7Ci0JCWlmIChjb3dsb193cml0ZWNvd3Jhdyhjb3dkZXYsIG1hcHB0ciwgTUFQVU5JVCwgbWFwb2Zmc2V0KSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiY293bG9vcCAtIHdyaXRlLWZhaWx1cmUgb24gYml0bWFwIC0gIgotCQkJICAgICAgICJibGs9JWxkIG1hcD0lbGQgYnl0ZT0lbGQgYml0PSVsZFxuIiwKLQkJCSAgICAgICBjb3dibG9jaywgbWFwbnVtLCBtYXBieXRlLCBtYXBiaXQpOwotCQl9Ci0KLQkJREVCVUdQKERDT1ciY293bG9vcCAtIGJpdG1hcCBibG9jayB3cml0dGVuICVsbGRcbiIsIG1hcG9mZnNldCk7Ci0JfQotCi0JcmV0dXJuIHJ2OwotfQotCi0vKgotKiogd3JpdGUgY293ZmlsZSBmcm9tIGFuIGFic29sdXRlIG9mZnNldAotKioKLSoqIHJldHVybi12YWx1ZTogc2ltaWxhciB0byB1c2VyLW1vZGUgd3JpdGUKLSovCi1zdGF0aWMgbG9uZyBpbnQKLWNvd2xvX3dyaXRlY293cmF3KHN0cnVjdCBjb3dsb29wX2RldmljZSAqY293ZGV2LAotCQkJCQl2b2lkICpidWYsIGludCBsZW4sIGxvZmZfdCBvZmZzZXQpCi17Ci0JbG9uZyBpbnQJcnY7Ci0JbW1fc2VnbWVudF90CW9sZF9mczsKLQlsb2ZmX3QJCXNhdmVvZmZzZXQgPSBvZmZzZXQ7Ci0KLQlERUJVR1AoRENPVyJjb3dsb29wIC0gd3JpdGVjb3dyYXcgY2FsbGVkXG4iKTsKLQotCS8qCi0JKiogYmUgc3VyZSB0aGF0IGNvd2ZpbGUgaXMgb3BlbmVkIGZvciByZWFkLXdyaXRlCi0JKi8KLQlpZiAoICEoY293ZGV2LT5zdGF0ZSAmIENPV1JXQ09XT1BFTikgKSB7Ci0JCSBwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAgImNvd2xvb3AgLSB3cml0ZSByZXF1ZXN0IHRvIGNvd2ZpbGUgcmVmdXNlZFxuIik7Ci0KLQkJcmV0dXJuIC1FQkFERjsKLQl9Ci0KLQkvKgotCSoqIGlzc3VlIGxvdyBsZXZlbCB3cml0ZQotCSovCi0gICAgICAgIG9sZF9mcyA9IGdldF9mcygpOwotCXNldF9mcyggZ2V0X2RzKCkgKTsKLQlydiA9IGNvd2Rldi0+Y293ZnAtPmZfb3AtPndyaXRlKGNvd2Rldi0+Y293ZnAsIGJ1ZiwgbGVuLCAmb2Zmc2V0KTsKLSAgICAgICAgc2V0X2ZzKG9sZF9mcyk7Ci0KLQlpZiAocnYgPCBsZW4pIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImNvd2xvb3AgLSB3cml0ZS1mYWlsdXJlICVsZCBvbiBjb3dmaWxlIgotCQkgICAgICAgIi0gb2Zmc2V0PSVsbGQgbGVuPSVkXG4iLCBydiwgc2F2ZW9mZnNldCwgbGVuKTsKLQl9Ci0KLQljb3dkZXYtPmNvd3dyaXRlcysrOwotCXJldHVybiBydjsKLX0KLQotCi0vKgotKiogcmVhZHByb2MtZnVuY3Rpb246IGNhbGxlZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIC9wcm9jLWZpbGUgaXMgcmVhZAotKi8KLXN0YXRpYyBpbnQKLWNvd2xvX3JlYWRwcm9jKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBwb3MsIGludCBjbnQsIGludCAqZW9mLCB2b2lkICpwKQotewotCXN0cnVjdCBjb3dsb29wX2RldmljZSAqY293ZGV2ID0gcDsKLQotCXJldmlzaW9uW3NpemVvZiByZXZpc2lvbiAtIDNdID0gJ1wwJzsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwKLQkJIiAgIGNvd2xvb3AgdmVyc2lvbjogJTlzXG5cbiIKLQkJIiAgICAgIGRldmljZSBzdGF0ZTogJXMlcyVzJXNcbiIKLQkJIiAgIG51bWJlciBvZiBvcGVuczogJTlkXG4iCi0JCSIgICAgIHBpZCBvZiB0aHJlYWQ6ICU5ZFxuXG4iCi0JCSIgICAgcmVhZC1vbmx5IGZpbGU6ICU5c1xuIgotCQkiICAgICAgICAgIHJkb3JlYWRzOiAlOWx1XG5cbiIKLQkJImNvcHktb24td3JpdGUgZmlsZTogJTlzXG4iCi0JCSIgICAgIHN0YXRlIGNvd2ZpbGU6ICU5c1xuIgotCQkiICAgICBiaXRtYXAtYmxvY2tzOiAlOWx1IChvZiAlZCBieXRlcylcbiIKLQkJIiAgY293YmxvY2tzIGluIHVzZTogJTlsdSAob2YgJWQgYnl0ZXMpXG4iCi0JCSIgICAgICAgICAgY293cmVhZHM6ICU5bHVcbiIKLQkJIiAgICAgICAgIGNvd3dyaXRlczogJTlsdVxuIiwKLQkJCSZyZXZpc2lvblsxMV0sCi0KLQkJCWNvd2Rldi0+c3RhdGUgJiBDT1dERVZPUEVOICAgPyAiZGV2b3BlbiAiICAgOiAiIiwKLQkJCWNvd2Rldi0+c3RhdGUgJiBDT1dSV0NPV09QRU4gPyAiY293b3BlbnJ3ICIgOiAiIiwKLQkJCWNvd2Rldi0+c3RhdGUgJiBDT1dSRENPV09QRU4gPyAiY293b3BlbnJvICIgOiAiIiwKLQkJCWNvd2Rldi0+c3RhdGUgJiBDT1dXQVRDSERPRyAgPyAid2F0Y2hkb2cgIiAgOiAiIiwKLQotCQkJY293ZGV2LT5vcGVuY250LAotCQkJY293ZGV2LT5waWQsCi0JCQljb3dkZXYtPnJkb25hbWUsCi0JCQljb3dkZXYtPnJkb3JlYWRzLAotCQkJY293ZGV2LT5jb3duYW1lLAotCQkJY293ZGV2LT5jb3doZWFkLT5mbGFncyAmIENPV0RJUlRZID8gImRpcnR5IjoiY2xlYW4iLAotCQkJY293ZGV2LT5tYXBzaXplID4+IE1VU0hJRlQsIE1BUFVOSVQsCi0JCQljb3dkZXYtPm5yY293YmxvY2tzLCBNQVBVTklULAotCQkJY293ZGV2LT5jb3dyZWFkcywKLQkJCWNvd2Rldi0+Y293d3JpdGVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU2V0dXAgYW5kIGRlc3Ryb3kgY293ZGV2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotKiogb3BlbiBhbmQgcHJlcGFyZSBhIGNvd2RldmljZSAocmRvZmlsZSBhbmQgY293ZmlsZSkgYW5kIGFsbG9jYXRlIGJpdG1hcHMKLSoqCi0qKiByZXR1cm5zOgotKiogCTAgICAtIG9rYXkKLSoqICAgIDwgMCAgIC0gZXJyb3IgdmFsdWUKLSovCi1zdGF0aWMgaW50Ci1jb3dsb19vcGVucGFpcihjaGFyICpyZG9mLCBjaGFyICpjb3dmLCBpbnQgYXV0b3JlY292ZXIsIGludCBtaW5vcikKLXsKLQlsb25nIGludAkJcnY7Ci0Jc3RydWN0IGNvd2xvb3BfZGV2aWNlCSpjb3dkZXYgPSBjb3dkZXZhbGxbbWlub3JdOwotCXN0cnVjdCBrc3RhdGZzCQlrczsKLQotCWRvd24oJmNvd2RldmxvY2spOwotCi0JLyoKLQkqKiByZXF1ZXN0ZWQgZGV2aWNlIGV4aXN0cz8KLQkqLwotCWlmIChtaW5vciA+PSBtYXhjb3dzKSB7Ci0JCXVwKCZjb3dkZXZsb2NrKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyoKLQkqKiByZXF1ZXN0ZWQgZGV2aWNlIGFscmVhZHkgYXNzaWduZWQgdG8gY293ZGV2aWNlPwotCSovCi0JaWYgKGNvd2Rldi0+c3RhdGUgJiBDT1dERVZPUEVOKSB7Ci0JCXVwKCZjb3dkZXZsb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQkvKgotCSoqIGluaXRpYWxpemUgYWRtaW5pc3RyYXRpb24KLQkqLwotCW1lbXNldChjb3dkZXYsIDAsIHNpemVvZiAqY293ZGV2KTsKLQotCXNwaW5fbG9ja19pbml0ICAgICAoJmNvd2Rldi0+cnFsb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb3dkZXYtPndhaXRxKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb3dkZXYtPndhdGNocSk7Ci0KLQkvKgotCSoqIG9wZW4gdGhlIHJlYWQtb25seSBmaWxlCi0JKi8KLQlERUJVR1AoRENPVyJjb3dsb29wIC0gY2FsbCBvcGVucmRvLi4uLlxuIik7Ci0KLQlpZiAoIChydiA9IGNvd2xvX29wZW5yZG8oY293ZGV2LCByZG9mKSkgKSB7Ci0JCWNvd2xvX3VuZG9fb3BlbnJkbyhjb3dkZXYpOwotCQl1cCgmY293ZGV2bG9jayk7Ci0JCXJldHVybiBydjsKLQl9Ci0KLQkvKgotCSoqIG9wZW4gdGhlIGNvd2ZpbGUKLQkqLwotCURFQlVHUChEQ09XImNvd2xvb3AgLSBjYWxsIG9wZW5jb3cuLi4uXG4iKTsKLQotCWlmICggKHJ2ID0gY293bG9fb3BlbmNvdyhjb3dkZXYsIGNvd2YsIGF1dG9yZWNvdmVyKSkgKSB7Ci0JCWNvd2xvX3VuZG9fb3BlbnJkbyhjb3dkZXYpOwotCQljb3dsb191bmRvX29wZW5jb3coY293ZGV2KTsKLQkJdXAoJmNvd2RldmxvY2spOwotCQlyZXR1cm4gcnY7Ci0JfQotCi0JLyoKLQkqKiBhZG1pbmlzdGVyIHRvdGFsIGFuZCBhdmFpbGFibGUgc2l6ZSBvZiBmaWxlc3lzdGVtIGhvbGRpbmcgY293ZmlsZQotCSovCi0JaWYgKHZmc19zdGF0ZnMoY293ZGV2LT5jb3dmcC0+Zl9kZW50cnksICZrcyk9PTApIHsKLQkJY293ZGV2LT5ibGtzaXplICA9IGtzLmZfYnNpemU7Ci0JCWNvd2Rldi0+YmxrdG90YWwgPSBrcy5mX2Jsb2NrczsKLQkJY293ZGV2LT5ibGthdmFpbCA9IGtzLmZfYmF2YWlsOwotCX0gZWxzZSB7Ci0JCWNvd2Rldi0+Ymxrc2l6ZSAgPSAxMDI0OwkvKiBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvICovCi0JfQotCi0JLyoKLQkqKiBmbHVzaCB0aGUgKHJlY292ZXJlZCkgYml0bWFwcyBhbmQgY293aGVhZCB0byB0aGUgY293ZmlsZQotCSovCi0JREVCVUdQKERDT1ciY293bG9vcCAtIGNhbGwgY293c3luYy4uLi5cbiIpOwotCi0JY293bG9fc3luYygpOwotCi0JLyoKLQkqKiBhbGxvY2F0ZSBnZW5kaXNrIGZvciB0aGUgY293IGRldmljZQotCSovCi0JREVCVUdQKERDT1ciY293bG9vcCAtIGFsbG9jIGRpc2suLi4uXG4iKTsKLQotCWlmICgoY293ZGV2LT5nZCA9IGFsbG9jX2Rpc2soMSkpID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImNvd2xvb3AgLSB1bmFibGUgdG8gYWxsb2NfZGlzayBmb3IgY293bG9vcFxuIik7Ci0KLQkJY293bG9fdW5kb19vcGVucmRvKGNvd2Rldik7Ci0JCWNvd2xvX3VuZG9fb3BlbmNvdyhjb3dkZXYpOwotCQl1cCgmY293ZGV2bG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNvd2Rldi0+Z2QtPm1ham9yICAgICAgICA9IENPV01BSk9SOwotCWNvd2Rldi0+Z2QtPmZpcnN0X21pbm9yICA9IG1pbm9yOwotCWNvd2Rldi0+Z2QtPm1pbm9ycyAgICAgICA9IDE7Ci0JY293ZGV2LT5nZC0+Zm9wcyAgICAgICAgID0gJmNvd2xvX2ZvcHM7Ci0JY293ZGV2LT5nZC0+cHJpdmF0ZV9kYXRhID0gY293ZGV2OwotCXNwcmludGYoY293ZGV2LT5nZC0+ZGlza19uYW1lLCAiJXMlZCIsIERFVklDRV9OQU1FLCBtaW5vcik7Ci0KLQkvKiBpbiAuNSBLYiB1bml0cyAqLwotCXNldF9jYXBhY2l0eShjb3dkZXYtPmdkLCAoY293ZGV2LT5udW1ibG9ja3MqKE1BUFVOSVQvNTEyKSkpOwotCi0JREVCVUdQKERDT1ciY293bG9vcCAtIGluaXQgcmVxdWVzdCBxdWV1ZS4uLi5cbiIpOwotCi0JaWYgKChjb3dkZXYtPnJxdWV1ZSA9IGJsa19pbml0X3F1ZXVlKGNvd2xvX3JlcXVlc3QsICZjb3dkZXYtPnJxbG9jaykpCi0JCQkJCQkJCT09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImNvd2xvb3AgLSB1bmFibGUgdG8gZ2V0IHJlcXVlc3QgcXVldWUgZm9yIGNvd2xvb3BcbiIpOwotCi0JCWRlbF9nZW5kaXNrKGNvd2Rldi0+Z2QpOwotCQljb3dsb191bmRvX29wZW5yZG8oY293ZGV2KTsKLQkJY293bG9fdW5kb19vcGVuY293KGNvd2Rldik7Ci0JCXVwKCZjb3dkZXZsb2NrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShjb3dkZXYtPnJxdWV1ZSwgY293ZGV2LT5ibG9ja3N6KTsKLQljb3dkZXYtPmdkLT5xdWV1ZSA9IGNvd2Rldi0+cnF1ZXVlOwotCi0JLyoKLQkqKiBzdGFydCBrZXJuZWwgdGhyZWFkIHRvIGhhbmRsZSByZXF1ZXN0cwotCSovCi0JREVCVUdQKERDT1ciY293bG9vcCAtIGtpY2tvZmYgZGFlbW9uLi4uLlxuIik7Ci0KLQljb3dkZXYtPnBpZCA9IGtlcm5lbF90aHJlYWQoKGludCAoKikodm9pZCAqKSljb3dsb19kYWVtb24sIGNvd2RldiwgMCk7Ci0KLQkvKgotCSoqIGNyZWF0ZSBhIGZpbGUgYmVsb3cgZGlyZWN0b3J5IC9wcm9jL2NvdyBmb3IgdGhpcyBuZXcgY293ZGV2aWNlCi0JKi8KLQlpZiAoY293bG9fcHJvY2RpcikgewotCQljaGFyIAl0bXBuYW1lWzY0XTsKLQotCQlzcHJpbnRmKHRtcG5hbWUsICIlZCIsIG1pbm9yKTsKLQotCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KHRtcG5hbWUsIDAgLCBjb3dsb19wcm9jZGlyLAotCQkJCQkJY293bG9fcmVhZHByb2MsIGNvd2Rldik7Ci0JfQotCi0JY293ZGV2LT5zdGF0ZQl8PSBDT1dERVZPUEVOOwotCi0JY293ZGV2LT5yZG9uYW1lID0gcmRvZjsKLQljb3dkZXYtPmNvd25hbWUgPSBjb3dmOwotCi0JLyoKLQkqKiBlbmFibGUgdGhlIG5ldyBkaXNrOyB0aGlzIHRyaWdnZXJzIHRoZSBmaXJzdCByZXF1ZXN0IQotCSovCi0JREVCVUdQKERDT1ciY293bG9vcCAtIGNhbGwgYWRkX2Rpc2suLi4uXG4iKTsKLQotCWFkZF9kaXNrKGNvd2Rldi0+Z2QpOwotCi0JdXAoJmNvd2RldmxvY2spOwotCXJldHVybiAwOwotfQotCi0vKgotKiogY2xvc2UgYSBjb3dkZXZpY2UgKHBhaXIgb2YgcmRvZmlsZS9jb3dmaWxlKSBhbmQgcmVsZWFzZSBtZW1vcnkKLSoqCi0qKiByZXR1cm5zOgotKiogCTAgICAtIG9rYXkKLSoqICAgIDwgMCAgIC0gZXJyb3IgdmFsdWUKLSovCi1zdGF0aWMgaW50Ci1jb3dsb19jbG9zZXBhaXIoc3RydWN0IGNvd2xvb3BfZGV2aWNlICpjb3dkZXYpCi17Ci0JaW50IG1pbm9yOwotCi0JZG93bigmY293ZGV2bG9jayk7Ci0KLQkvKgotCSoqIGlmIGNvd2RldmljZSBpcyBub3QgYWN0aXZhdGVkIGF0IGFsbCwgcmVmdXNlCi0JKi8KLQlpZiAoICEoY293ZGV2LT5zdGF0ZSAmIENPV0RFVk9QRU4pICkgewotCQl1cCgmY293ZGV2bG9jayk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qCi0JKiogaWYgdGhpcyBjb3dkZXZpY2UgaXMgc3RpbGwgb3BlbiwgcmVmdXNlCi0JKi8KLQlpZiAoY293ZGV2LT5vcGVuY250ID4gMCkgewotCQl1cCgmY293ZGV2bG9jayk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JdXAoJmNvd2RldmxvY2spOwotCi0JLyoKLQkqKiB3YWtldXAgd2F0Y2hlciAoaWYgYW55KQotCSovCi0JaWYgKGNvd2Rldi0+c3RhdGUgJiBDT1dXQVRDSERPRykgewotCQljb3dkZXYtPndhdGNodGhyZXNoID0gY293ZGV2LT5ibGthdmFpbDsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjb3dkZXYtPndhdGNocSk7Ci0JfQotCi0JLyoKLQkqKiB3YWtldXAga2VybmVsLXRocmVhZCB0byBiZSBhYmxlIHRvIGV4aXQKLQkqKiBhbmQgd2FpdCB1bnRpbCBpdCBoYXMgZXhpdGVkCi0JKi8KLQljb3dkZXYtPmNsb3NlZG93biA9IDE7Ci0JY293ZGV2LT5xZmlsbGVkICAgPSAxOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY293ZGV2LT53YWl0cSk7Ci0KLSAgICAgICAJd2hpbGUgKGNvd2Rldi0+cGlkKQotICAgICAgICAgICAgICAgCXNjaGVkdWxlKCk7Ci0KLQlkZWxfZ2VuZGlzayhjb3dkZXYtPmdkKTsgIC8qIHJldmVydCB0aGUgYWxsb2NfZGlzaygpICovCi0JcHV0X2Rpc2soY293ZGV2LT5nZCk7ICAgICAvKiByZXZlcnQgdGhlIGFkZF9kaXNrKCkgICAqLwotCi0JaWYgKGNvd2xvX3Byb2NkaXIpIHsKLQkJY2hhciAJdG1wbmFtZVs2NF07Ci0KLQkJZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgbWF4Y293czsgbWlub3IrKykgewotCQkJaWYgKGNvd2RldiA9PSBjb3dkZXZhbGxbbWlub3JdKSBicmVhazsKLQkJfQotCQlzcHJpbnRmKHRtcG5hbWUsICIlZCIsIG1pbm9yKTsKLQotCQlyZW1vdmVfcHJvY19lbnRyeSh0bXBuYW1lLCBjb3dsb19wcm9jZGlyKTsKLQl9Ci0KLQlibGtfY2xlYW51cF9xdWV1ZShjb3dkZXYtPnJxdWV1ZSk7Ci0KLQkvKgotCSoqIHJlbGVhc2UgbWVtb3J5IGZvciBmaWxlbmFtZXMgaWYgdGhlc2UgbmFtZXMgaGF2ZQotCSoqIGJlZW4gYWxsb2NhdGVkIGR5bmFtaWNhbGx5Ci0JKi8KLQlpZiAoIChjb3dkZXYtPmNvd25hbWUpICYmIChjb3dkZXYtPmNvd25hbWUgIT0gY293ZmlsZSkpCi0JCWtmcmVlKGNvd2Rldi0+Y293bmFtZSk7Ci0KLQlpZiAoIChjb3dkZXYtPnJkb25hbWUpICYmIChjb3dkZXYtPnJkb25hbWUgIT0gcmRvZmlsZSkpCi0JCWtmcmVlKGNvd2Rldi0+cmRvbmFtZSk7Ci0KLQljb3dsb191bmRvX29wZW5yZG8oY293ZGV2KTsKLQljb3dsb191bmRvX29wZW5jb3coY293ZGV2KTsKLQotCWNvd2Rldi0+c3RhdGUgJj0gfkNPV0RFVk9QRU47Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSoqIG9wZW4gdGhlIHJlYWQtb25seSBmaWxlCi0qKgotKiogcmV0dXJuczoKLSoqIAkwICAgLSBva2F5Ci0qKiAgICA8IDAgICAtIGVycm9yIHZhbHVlCi0qLwotc3RhdGljIGludAotY293bG9fb3BlbnJkbyhzdHJ1Y3QgY293bG9vcF9kZXZpY2UgKmNvd2RldiwgY2hhciAqcmRvZikKLXsKLQlzdHJ1Y3QgZmlsZQkqZjsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlOwotCWxvbmcgaW50CWksIG5ydmFsOwotCi0JREVCVUdQKERDT1ciY293bG9vcCAtIG9wZW5yZG8gY2FsbGVkXG4iKTsKLQotCS8qCi0JKiogb3BlbiB0aGUgcmVhZC1vbmx5IGZpbGUKLQkqLwotICAgICAgICBpZigqcmRvZiA9PSAnXDAnKSB7Ci0gICAgIAkgICAgIAlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb3dsb29wIC0gc3BlY2lmeSBuYW1lIGZvciByZWFkLW9ubHkgZmlsZVxuXG4iKTsKLSAgICAgICAgIAlyZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0JZiA9IGZpbHBfb3BlbihyZG9mLCBPX1JET05MWXxPX0xBUkdFRklMRSwgMCk7Ci0KLQlpZiAoIChmID09IE5VTEwpIHx8IElTX0VSUihmKSApIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY293bG9vcCAtIG9wZW4gb2YgcmRvZmlsZSAlcyBmYWlsZWRcbiIsIHJkb2YpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljb3dkZXYtPnJkb2ZwID0gZjsKLQotCWlub2RlID0gZi0+Zl9kZW50cnktPmRfaW5vZGU7Ci0KLQlpZiAoICFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmICFTX0lTQkxLKGlub2RlLT5pX21vZGUpICkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb3dsb29wIC0gJXMgbm90IHJlZ3VsYXIgZmlsZSBvciBibG9ja2RldlxuIiwgcmRvZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCURFQlVHUChEQ09XImNvd2xvb3AgLSBkZXRlcm1pbmUgc2l6ZSByZG8uLi4uXG4iKTsKLQotCS8qCi0JKiogZGV0ZXJtaW5lIGJsb2NrLXNpemUgYW5kIHRvdGFsIHNpemUgb2YgcmVhZC1vbmx5IGZpbGUKLQkqLwotCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7Ci0JCS8qCi0JCSoqIHJlYWQtb25seSBmaWxlIGlzIGEgcmVndWxhciBmaWxlCi0JCSovCi0JCWNvd2Rldi0+YmxvY2tzeiAgID0gNTEyOwkvKiBvdGhlciB2YWx1ZSBmYWlscyAqLwotCQljb3dkZXYtPm51bWJsb2NrcyA9IGlub2RlLT5pX3NpemUgPj4gTVVTSElGVDsKLQotCQlpZiAoaW5vZGUtPmlfc2l6ZSAmIE1VTUFTSykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJjb3dsb29wIC0gcmRvZmlsZSAlcyB0cnVuY2F0ZWQgdG8gbXVsdGlwbGUgIgotCQkJICAgICAgICJvZiAlZCBieXRlc1xuIiwgcmRvZiwgTUFQVU5JVCk7Ci0JCX0KLQotCQlERUJVR1AoRENPVyJjb3dsb29wIC0gUk89cmVndWxhcjogbnVtYmxvY2tzPSVkLCBibG9ja3N6PSVkXG4iLAotCQkJY293ZGV2LT5udW1ibG9ja3MsIGNvd2Rldi0+YmxvY2tzeik7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJKiogcmVhZC1vbmx5IGZpbGUgaXMgYSBibG9jayBkZXZpY2UKLQkJKi8KLQkJY293ZGV2LT5iZWxvd2RldiAgPSBpbm9kZS0+aV9iZGV2OwotCQljb3dkZXYtPmJlbG93Z2QgICA9IGNvd2Rldi0+YmVsb3dkZXYtPmJkX2Rpc2s7IC8qIGdlbmRpc2sgKi8KLQotCQlpZiAoY293ZGV2LT5iZWxvd2Rldi0+YmRfcGFydCkgewotCQkJY293ZGV2LT5udW1ibG9ja3MgPSBjb3dkZXYtPmJlbG93ZGV2LT5iZF9wYXJ0LT5ucl9zZWN0cwotCQkJCQkJCQkvIChNQVBVTklULzUxMik7Ci0JCX0KLQotCQlpZiAoY293ZGV2LT5iZWxvd2dkKSB7Ci0JCQljb3dkZXYtPmJlbG93cSA9IGNvd2Rldi0+YmVsb3dnZC0+cXVldWU7Ci0KLQkJCWlmIChjb3dkZXYtPm51bWJsb2NrcyA9PSAwKSB7Ci0JCQkJY293ZGV2LT5udW1ibG9ja3MgPSBnZXRfY2FwYWNpdHkoY293ZGV2LT5iZWxvd2dkKQotICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJLyAoTUFQVU5JVC81MTIpOwotCQkJfQotCQl9Ci0KLQotCQlpZiAoY293ZGV2LT5iZWxvd3EpCi0JCQljb3dkZXYtPmJsb2Nrc3ogPSBxdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoY293ZGV2LT5iZWxvd3EpOwotCi0JCWlmIChjb3dkZXYtPmJsb2Nrc3ogPT0gMCkKLQkJCWNvd2Rldi0+YmxvY2tzeiA9IEJMT0NLX1NJWkU7IC8qIGRlZmF1bHQgMl4xMCAqLwotCi0JCURFQlVHUChEQ09XImNvd2xvb3AgLSBudW1ibG9ja3M9JWQsICIKLQkJICAgICAgICAgICAiYmxvY2tzej0lZCwgYmVsb3dnZD0lcCwgYmVsb3dxPSVwXG4iLAotCQkgIAljb3dkZXYtPm51bWJsb2NrcywgY293ZGV2LT5ibG9ja3N6LAotCQkJY293ZGV2LT5iZWxvd2dkLCBjb3dkZXYtPmJlbG93cSk7Ci0KLQkJREVCVUdQKERDT1ciY293bG9vcCAtIGJlbG93ZGV2LmJkX2Jsb2NrX3NpemU9JWRcbiIsCi0JCSAgCWNvd2Rldi0+YmVsb3dkZXYtPmJkX2Jsb2NrX3NpemUpOwotCX0KLQotCWlmIChjb3dkZXYtPm51bWJsb2NrcyA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY293bG9vcCAtICVzIGhhcyBubyBjb250ZW50c1xuIiwgcmRvZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JKiogcmVzZXJ2ZSBzcGFjZSBpbiBtZW1vcnkgYXMgZ2VuZXJpYyBJL08gYnVmZmVyCi0JKi8KLQljb3dkZXYtPmlvYnVmICA9IGttYWxsb2MoTUFQVU5JVCwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWNvd2Rldi0+aW9idWYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY293bG9vcCAtIGNhbm5vdCBnZXQgc3BhY2UgZm9yIGJ1ZmZlciAlZFxuIiwgTUFQVU5JVCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCURFQlVHUChEQ09XImNvd2xvb3AgLSBkZXRlcm1pbmUgZmluZ2VycHJpbnQgcmRvLi4uLlxuIik7Ci0KLQkvKgotCSoqIGRldGVybWluZSBmaW5nZXJwcmludCBmb3IgcmVhZC1vbmx5IGZpbGUKLQkqKiAJY2FsY3VsYXRlIGZpbmdlcnByaW50IGZyb20gZmlyc3QgZm91ciBkYXRhYmxvY2tzCi0JKioJd2hpY2ggZG8gbm90IGNvbnRhaW4gYmluYXJ5IHplcm9lcwotCSovCi0JZm9yIChpPTAsIGNvd2Rldi0+ZmluZ2VycHJpbnQ9MCwgbnJ2YWw9MDsKLQkJCShucnZhbCA8IDQpJiYoaSA8IGNvd2Rldi0+bnVtYmxvY2tzKTsgaSsrKSB7Ci0JCWludCAJCWo7Ci0JCXVuc2lnbmVkIGNoYXIJY3M7Ci0KLQkJLyoKLQkJKiogcmVhZCBuZXh0IGJsb2NrCi0JCSovCi0JCWlmIChjb3dsb19yZWFkcmRvKGNvd2RldiwgY293ZGV2LT5pb2J1ZiwgTUFQVU5JVCwKLQkJCQkJCShsb2ZmX3QpaSA8PCBNVVNISUZUKSA8IDEpCi0JCQlicmVhazsKLQotCQkvKgotCQkqKiBjYWxjdWxhdGUgZmluZ2VycHJpbnQgYnkgYWRkaW5nIGFsbCBieXRlLXZhbHVlcwotCQkqLwotCQlmb3IgKGo9MCwgY3M9MDsgaiA8IE1BUFVOSVQ7IGorKykKLQkJCWNzICs9ICooY293ZGV2LT5pb2J1ZitqKTsKLQotCQlpZiAoY3MgPT0gMCkJLyogYmxvY2sgcHJvYmFibHkgY29udGFpbmVkIHplcm9lcyAqLwotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJKiogc2hpZnQgYnl0ZS12YWx1ZSB0byBwcm9wZXIgcGxhY2UgaW4gZmluYWwgZmluZ2VycHJpbnQKLQkJKi8KLQkJY293ZGV2LT5maW5nZXJwcmludCB8PSBjcyA8PCAobnJ2YWwqOCk7Ci0JCW5ydmFsKys7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0qKiB1bmRvIG1lbW9yeSBhbGxvY3MgYW5kIGZpbGUgb3BlbnMgaXNzdWVkIHNvIGZhcgotKiogcmVsYXRlZCB0byB0aGUgcmVhZC1vbmx5IGZpbGUKLSovCi1zdGF0aWMgdm9pZAotY293bG9fdW5kb19vcGVucmRvKHN0cnVjdCBjb3dsb29wX2RldmljZSAqY293ZGV2KQotewotCWlmKGNvd2Rldi0+aW9idWYpOwotCQlrZnJlZShjb3dkZXYtPmlvYnVmKTsKLQotCWlmIChjb3dkZXYtPnJkb2ZwKQotICAJCWZpbHBfY2xvc2UoY293ZGV2LT5yZG9mcCwgMCk7Ci19Ci0KLS8qCi0qKiBvcGVuIHRoZSBjb3dmaWxlCi0qKgotKiogcmV0dXJuczoKLSoqIAkwICAgLSBva2F5Ci0qKiAgICA8IDAgICAtIGVycm9yIHZhbHVlCi0qLwotc3RhdGljIGludAotY293bG9fb3BlbmNvdyhzdHJ1Y3QgY293bG9vcF9kZXZpY2UgKmNvd2RldiwgY2hhciAqY293ZiwgaW50IGF1dG9yZWNvdmVyKQotewotCWxvbmcgaW50CQlpLCBydjsKLQlpbnQJCQltaW5vcjsKLQl1bnNpZ25lZCBsb25nCQluYjsKLQlzdHJ1Y3QgZmlsZQkJKmY7Ci0Jc3RydWN0IGlub2RlCQkqaW5vZGU7Ci0JbG9mZl90CQkJb2Zmc2V0OwotCXN0cnVjdCBjb3dsb29wX2RldmljZQkqY293dG1wOwotCi0JREVCVUdQKERDT1ciY293bG9vcCAtIG9wZW5jb3cgY2FsbGVkXG4iKTsKLQotCS8qCi0JKiogb3BlbiBjb3B5LW9uLXdyaXRlIGZpbGUgKHJlYWQtd3JpdGUpCi0JKi8KLSAgICAgICAgaWYgKGNvd2ZbMF0gPT0gJ1wwJykgewotICAgICAgICAgIAlwcmludGsoS0VSTl9FUlIKLSAgICAgICAgICAgICAgICAgImNvd2xvb3AgLSBzcGVjaWZ5IG5hbWUgb2YgY29weS1vbi13cml0ZSBmaWxlXG5cbiIpOwotICAgICAgICAgCXJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLQlmID0gZmlscF9vcGVuKGNvd2YsIE9fUkRXUnxPX0xBUkdFRklMRSwgMDYwMCk7Ci0KLQlpZiAoIChmID09IE5VTEwpIHx8IElTX0VSUihmKSApIHsKLQkJLyoKLQkJKiogbm9uLWV4aXN0aW5nIGNvd2ZpbGU6IHRyeSB0byBjcmVhdGUKLQkJKi8KLQkJZiA9IGZpbHBfb3Blbihjb3dmLCBPX1JEV1J8T19DUkVBVHxPX0xBUkdFRklMRSwgMDYwMCk7Ci0KLQkJaWYgKCAoZiA9PSBOVUxMKSB8fCBJU19FUlIoZikgKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgIAkgICJjb3dsb29wIC0gZmFpbGVkIHRvIG9wZW4gZmlsZSAlcyBmb3IgcmVhZC13cml0ZVxuXG4iLAotCQkgICAgICAgCQkJCQkJY293Zik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkgCX0KLQl9Ci0KLQljb3dkZXYtPmNvd2ZwID0gZjsKLQotCWlub2RlID0gZi0+Zl9kZW50cnktPmRfaW5vZGU7Ci0KLQlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb3dsb29wIC0gJXMgaXMgbm90IHJlZ3VsYXIgZmlsZVxuIiwgY293Zik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JKiogY2hlY2sgaWYgdGhpcyBjb3dmaWxlIGlzIGFscmVhZHkgaW4gdXNlIGZvciBhbm90aGVyIGNvd2RldmljZQotCSovCi0JZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgbWF4Y293czsgbWlub3IrKykgewotCi0JCWNvd3RtcCA9IGNvd2RldmFsbFttaW5vcl07Ci0KLQkJaWYgKCAhKGNvd3RtcC0+c3RhdGUgJiBDT1dERVZPUEVOKSApCi0JCQljb250aW51ZTsKLQotCQlpZiAoY293dG1wID09IGNvd2RldikKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChjb3d0bXAtPmNvd2ZwLT5mX2RlbnRyeS0+ZF9pbm9kZSA9PSBmLT5mX2RlbnRyeS0+ZF9pbm9kZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvd2xvb3AgLSAlczogYWxyZWFkeSBpbiB1c2UgYXMgY293XG4iLCBjb3dmKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQl9Ci0KLQkvKgotCSoqIG1hcmsgY293ZmlsZSBvcGVuIGZvciByZWFkLXdyaXRlCi0JKi8KLQljb3dkZXYtPnN0YXRlIHw9IENPV1JXQ09XT1BFTjsKLQotCS8qCi0JKiogY2FsY3VsYXRlIHNpemUgKGluIGJ5dGVzKSBmb3IgdG90YWwgYml0bWFwIGluIGNvd2ZpbGU7Ci0JKiogd2hlbiB0aGUgc2l6ZSBvZiB0aGUgY293aGVhZCBibG9jayBpcyBhZGRlZCwgdGhlIHN0YXJ0LW9mZnNldAotCSoqIGZvciB0aGUgbW9kaWZpZWQgZGF0YSBibG9ja3MgY2FuIGJlIGZvdW5kCi0JKi8KLQluYiA9IGNvd2Rldi0+bnVtYmxvY2tzOwotCi0JaWYgKG5iJTgpCQkvKiB0cmFuc2Zvcm0gI2JpdHMgdG8gI2J5dGVzICovCi0JCW5iKz04OyAgCS8qIHJvdW5kZWQgaWYgbmVjZXNzYXJ5ICAgICAgKi8KLQluYiAvPSA4OwotCi0JaWYgKG5iICYgTVVNQVNLKQkvKiByb3VuZCB1cCAjYnl0ZXMgdG8gTUFQVU5JVCBjaHVua3MgKi8KLQkJY293ZGV2LT5tYXBzaXplID0gKCAobmI+Pk1VU0hJRlQpICsxKSA8PCBNVVNISUZUOwotCWVsc2UKLQkJY293ZGV2LT5tYXBzaXplID0gbmI7Ci0KLQkvKgotCSoqIHJlc2VydmUgc3BhY2UgaW4gbWVtb3J5IGZvciB0aGUgY293aGVhZAotCSovCi0JY293ZGV2LT5jb3doZWFkID0ga21hbGxvYyhNQVBVTklULCBHRlBfS0VSTkVMKTsKLQotCWlmICghY293ZGV2LT5jb3doZWFkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY293bG9vcCAtIGNhbm5vdCBnZXQgc3BhY2UgZm9yIGNvd2hlYWQgJWRcbiIsCi0JCQkJCQkJCSAgICAgTUFQVU5JVCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbXNldChjb3dkZXYtPmNvd2hlYWQsIDAsIE1BUFVOSVQpOwotCi0JREVCVUdQKERDT1ciY293bG9vcCAtIHByZXBhcmUgY293aGVhZC4uLi5cbiIpOwotCi0JLyoKLQkqKiBjaGVjayBpZiB0aGUgY293ZmlsZSBleGlzdHMgb3Igc2hvdWxkIGJlIGNyZWF0ZWQKLQkqLwotCWlmIChpbm9kZS0+aV9zaXplICE9IDApIHsKLQkJLyoKLQkJKiogZXhpc3RpbmcgY293ZmlsZTogcmVhZCB0aGUgY293IGhlYWQKLQkJKi8KLQkJaWYgKGlub2RlLT5pX3NpemUgPCBNQVBVTklUKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiY293bG9vcCAtIGV4aXN0aW5nIGNvd2ZpbGUgJXMgdG9vIHNtYWxsXG4iLAotCQkJCWNvd2YpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQljb3dsb19yZWFkY293cmF3KGNvd2RldiwgY293ZGV2LT5jb3doZWFkLCBNQVBVTklULCAobG9mZl90KSAwKTsKLQotCQkvKgotCQkqKiB2ZXJpZnkgaWYgdGhlIGV4aXN0aW5nIGZpbGUgaXMgcmVhbGx5IGEgY293ZmlsZQotCQkqLwotCQlpZiAoY293ZGV2LT5jb3doZWFkLT5tYWdpYyAhPSBDT1dNQUdJQykgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvd2xvb3AgLSBjb3dmaWxlICVzIGhhcyBpbmNvcnJlY3QgZm9ybWF0XG4iLAotCQkJCWNvd2YpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKgotCQkqKiB2ZXJpZnkgdGhlIGNvd2hlYWQgdmVyc2lvbiBvZiB0aGUgY293ZmlsZQotCQkqLwotCQlpZiAoY293ZGV2LT5jb3doZWFkLT52ZXJzaW9uID4gQ09XVkVSU0lPTikgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvd2xvb3AgLSBjb3dmaWxlICVzIG5ld2VyIHRoYW4gdGhpcyBkcml2ZXJcbiIsCi0JCQkJY293Zik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCS8qCi0JCSoqIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgbm90IGEgcGFja2VkIGNvd2ZpbGUKLQkJKi8KLQkJaWYgKGNvd2Rldi0+Y293aGVhZC0+ZmxhZ3MgJiBDT1dQQUNLRUQpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICJjb3dsb29wIC0gcGFja2VkIGNvd2ZpbGUgJXMgbm90IGFjY2VwdGVkXG4iLCBjb3dmKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyoKLQkJKiogdmVyaWZ5IGlmIHRoZSBjb3dmaWxlIGhhcyBiZWVuIHByb3Blcmx5IGNsb3NlZAotCQkqLwotCQlpZiAoY293ZGV2LT5jb3doZWFkLT5mbGFncyAmIENPV0RJUlRZKSB7Ci0JCQkvKgotCQkJKiogY293ZmlsZSB3YXMgbm90IHByb3Blcmx5IGNsb3NlZDsKLQkJCSoqIGNoZWNrIGlmIGF1dG9tYXRpYyByZWNvdmVyeSBpcyByZXF1aXJlZAotCQkJKiogKGFjdHVhbCByZWNvdmVyeSB3aWxsIGJlIGRvbmUgbGF0ZXIgb24pCi0JCQkqLwotCQkJaWYgKCFhdXRvcmVjb3ZlcikgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAiY293bG9vcCAtIGNvd2ZpbGUgJXMgaXMgZGlydHkgIgotCQkJCSAgICAgICAiKG5vdCBwcm9wZXJseSBjbG9zZWQgYnkgcm1tb2Q/KVxuIiwKLQkJCQkJY293Zik7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJjb3dsb29wIC0gcnVuIGNvd3JlcGFpciBvciBzcGVjaWZ5ICIKLQkJCQkgICAgICAgIidvcHRpb249cicgdG8gcmVjb3ZlclxuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkqKiB2ZXJpZnkgaWYgdGhlIGNvd2ZpbGUgaXMgcmVhbGx5IHJlbGF0ZWQgdG8gdGhpcyByZG9maWxlCi0JCSovCi0JCWlmIChjb3dkZXYtPmNvd2hlYWQtPnJkb2Jsb2NrcyAhPSBjb3dkZXYtPm51bWJsb2NrcykgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAJICAgICAgICJjb3dsb29wIC0gY293ZmlsZSAlcyAoc2l6ZSAlbGxkKSBub3QgcmVsYXRlZCAiCi0JCSAgICAgICAJICAgICAgICJ0byByZG9maWxlIChzaXplICVsbGQpXG4iLAotCQkJCWNvd2YsCi0JCQkJKGxvbmcgbG9uZyljb3dkZXYtPmNvd2hlYWQtPnJkb2Jsb2NrcyA8PE1VU0hJRlQsCi0JCQkJKGxvbmcgbG9uZyljb3dkZXYtPm51bWJsb2NrcyA8PE1VU0hJRlQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoY293ZGV2LT5jb3doZWFkLT5yZG9maW5nZXJwcmludCAhPSBjb3dkZXYtPmZpbmdlcnByaW50KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgIAkgICAgICJjb3dsb29wIC0gY293ZmlsZSAlcyBub3QgcmVsYXRlZCB0byByZG9maWxlICIKLQkJCSAgICAgIiAoZmluZ2VycHJpbnQgZXJyIC0gcmRvZmlsZSBtb2RpZmllZD8pXG4iLCBjb3dmKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJKiogbmV3IGNvd2ZpbGU6IGRldGVybWluZSB0aGUgbWluaW1hbCBzaXplIChjb3doZWFkK2JpdG1hcCkKLQkJKi8KLQkJb2Zmc2V0ID0gKGxvZmZfdCkgTUFQVU5JVCArIGNvd2Rldi0+bWFwc2l6ZSAtIDE7Ci0KLQkJaWYgKCBjb3dsb193cml0ZWNvd3Jhdyhjb3dkZXYsICIiLCAxLCBvZmZzZXQpIDwgMSkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvd2xvb3AgLSBjYW5ub3Qgc2V0IGNvd2ZpbGUgdG8gc2l6ZSAlbGxkXG4iLAotCQkJCW9mZnNldCsxKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyoKLQkJKiogcHJlcGFyZSBuZXcgY293aGVhZAotCQkqLwotCQljb3dkZXYtPmNvd2hlYWQtPm1hZ2ljCQk9IENPV01BR0lDOwotCQljb3dkZXYtPmNvd2hlYWQtPnZlcnNpb24JPSBDT1dWRVJTSU9OOwotCQljb3dkZXYtPmNvd2hlYWQtPm1hcHVuaXQJPSBNQVBVTklUOwotCQljb3dkZXYtPmNvd2hlYWQtPm1hcHNpemUJPSBjb3dkZXYtPm1hcHNpemU7Ci0JCWNvd2Rldi0+Y293aGVhZC0+cmRvYmxvY2tzCT0gY293ZGV2LT5udW1ibG9ja3M7Ci0JCWNvd2Rldi0+Y293aGVhZC0+cmRvZmluZ2VycHJpbnQJPSBjb3dkZXYtPmZpbmdlcnByaW50OwotCQljb3dkZXYtPmNvd2hlYWQtPmNvd3VzZWQJPSAwOwotCi0JCS8qCi0JCSoqIGNhbGN1bGF0ZSBzdGFydCBvZmZzZXQgb2YgZGF0YSBpbiBjb3dmaWxlLAotCQkqKiByb3VuZGVkIHVwIHRvIG11bHRpcGxlIG9mIDRLIHRvIGF2b2lkCi0JCSoqIHVubmVjZXNzYXJ5IGRpc2stdXNhZ2UgZm9yIHdyaXR0ZW4gZGF0YWJsb2NrcyBpbgotCQkqKiB0aGUgc3BhcnNlZCBjb3dmaWxlIG9uIGUuZy4gNEsgZmlsZXN5c3RlbXMKLQkJKi8KLQkJY293ZGV2LT5jb3doZWFkLT5kb2Zmc2V0ID0KLQkJCSgoTUFQVU5JVCtjb3dkZXYtPm1hcHNpemUrNDA5NSk+PjEyKTw8MTI7Ci0JfQotCi0JY293ZGV2LT5jb3doZWFkLT5mbGFncwk9IDA7Ci0KLQlERUJVR1AoRENPVyJjb3dsb29wIC0gcmVzZXJ2ZSBzcGFjZSBiaXRtYXAuLi4uXG4iKTsKLQotCS8qCi0JKiogcmVzZXJ2ZSBzcGFjZSBpbiBtZW1vcnkgZm9yIHRoZSBlbnRpcmUgYml0bWFwIGFuZAotCSoqIGZpbGwgaXQgd2l0aCB0aGUgYml0bWFwLWRhdGEgZnJvbSBkaXNrOyB0aGUgZW50aXJlCi0JKiogYml0bWFwIGlzIGFsbG9jYXRlZCBpbiBzZXZlcmFsIGNodW5rcyBiZWNhdXNlIGttYWxsb2MKLQkqKiBoYXMgcmVzdHJpY3Rpb25zIHJlZ2FyZGluZyB0aGUgYWxsb3dlZCBzaXplIHBlciBrbWFsbG9jCi0JKi8KLQljb3dkZXYtPm1hcGNvdW50ID0gKGNvd2Rldi0+bWFwc2l6ZStNQVBDSFVOS1NaLTEpL01BUENIVU5LU1o7Ci0KLQkvKgotCSoqIHRoZSBzaXplIG9mIGV2ZXJ5IGJpdG1hcCBjaHVuayB3aWxsIGJlIE1BUENIVU5LU1ogYnl0ZXMsIGV4Y2VwdCBmb3IKLQkqKiB0aGUgbGFzdCBiaXRtYXAgY2h1bms6IGNhbGN1bGF0ZSByZW1haW5pbmcgc2l6ZSBmb3IgdGhpcyBjaHVuawotCSovCi0JaWYgKGNvd2Rldi0+bWFwc2l6ZSAlIE1BUENIVU5LU1ogPT0gMCkKLQkJY293ZGV2LT5tYXByZW1haW4gPSBNQVBDSFVOS1NaOwotCWVsc2UKLQkJY293ZGV2LT5tYXByZW1haW4gPSBjb3dkZXYtPm1hcHNpemUgJSBNQVBDSFVOS1NaOwotCi0JLyoKLQkqKiBhbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSBhbGwgcG9pbnRlcnMgZm9yIHRoZSBiaXRtYXAtY2h1bmtzCi0JKiogKGluaXRpYWxpemUgYXJlYSB3aXRoIHplcm9lcyB0byBhbGxvdyBwcm9wZXIgdW5kbykKLQkqLwotCWNvd2Rldi0+bWFwY2FjaGUgPSBrbWFsbG9jKGNvd2Rldi0+bWFwY291bnQgKiBzaXplb2YoY2hhciAqKSwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb3dkZXYtPm1hcGNhY2hlKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvd2xvb3AgLSBjYW4gbm90IGFsbG9jYXRlIHNwYWNlIGZvciBiaXRtYXAgcHRyc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbXNldChjb3dkZXYtPm1hcGNhY2hlLCAwLCBjb3dkZXYtPm1hcGNvdW50ICogc2l6ZW9mKGNoYXIgKikpOwotCi0JLyoKLQkqKiBhbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSB0aGUgYml0bWFwLWNodW5rcyB0aGVtc2VsdmVzCi0JKi8KLQlmb3IgKGk9MDsgaSA8IGNvd2Rldi0+bWFwY291bnQ7IGkrKykgewotCQlpZiAoaSA8IChjb3dkZXYtPm1hcGNvdW50LTEpKQotCQkJKihjb3dkZXYtPm1hcGNhY2hlK2kpID0ga21hbGxvYyhNQVBDSFVOS1NaLCBHRlBfS0VSTkVMKTsKLQkJZWxzZQotCQkJKihjb3dkZXYtPm1hcGNhY2hlK2kpID0ga21hbGxvYyhjb3dkZXYtPm1hcHJlbWFpbiwKLQkJCQkJCSAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwotCi0JCWlmICgqKGNvd2Rldi0+bWFwY2FjaGUraSkgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjb3dsb29wIC0gbm8gc3BhY2UgZm9yIGJpdG1hcGNodW5rICVsZCIKLQkJCQkJIiB0b3RtYXBzej0lbGQsIG1hcGNudD0lZCBtYXB1bml0PSVkXG4iLAotCQkJCQlpLCBjb3dkZXYtPm1hcHNpemUsIGNvd2Rldi0+bWFwY291bnQsCi0JCQkJCU1BUFVOSVQpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQlERUJVR1AoRENPVyJjb3dsb29wIC0gcmVhZCBiaXRtYXAgZnJvbSBjb3cuLi4uXG4iKTsKLQotCS8qCi0JKiogcmVhZCB0aGUgZW50aXJlIGJpdG1hcCBmcm9tIHRoZSBjb3dmaWxlIGludG8gdGhlIGluLW1lbW9yeSBjYWNoZTsKLQkqKiBjb3VudCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGFyZSBpbiB1c2UgYWxyZWFkeQotCSoqIChzdGF0aXN0aWNhbCBwdXJwb3NlcykKLQkqLwotCWZvciAoaT0wLCBvZmZzZXQ9TUFQVU5JVDsgaSA8IGNvd2Rldi0+bWFwY291bnQ7Ci0JCQkJCWkrKywgb2Zmc2V0Kz1NQVBDSFVOS1NaKSB7Ci0JCXVuc2lnbmVkIGxvbmcJbnVtYnl0ZXM7Ci0KLQkJaWYgKGkgPCAoY293ZGV2LT5tYXBjb3VudC0xKSkKLQkJCS8qCi0JCQkqKiBmdWxsIGJpdG1hcCBjaHVuawotCQkJKi8KLQkJCW51bWJ5dGVzID0gTUFQQ0hVTktTWjsKLQkJZWxzZQotCQkJLyoKLQkJCSoqIGxhc3QgYml0bWFwIGNodW5rOiBtaWdodCBiZSBwYXJ0bHkgZmlsbGVkCi0JCQkqLwotCQkJbnVtYnl0ZXMgPSBjb3dkZXYtPm1hcHJlbWFpbjsKLQotCQljb3dsb19yZWFkY293cmF3KGNvd2RldiwgKihjb3dkZXYtPm1hcGNhY2hlK2kpLAotCQkJCQkJCW51bWJ5dGVzLCBvZmZzZXQpOwotCX0KLQotCS8qCi0JKiogaWYgdGhlIGNvd2ZpbGUgd2FzIGRpcnR5IGFuZCBhdXRvbWF0aWMgcmVjb3ZlcnkgaXMgcmVxdWlyZWQsCi0JKiogcmVjb25zdHJ1Y3QgYSBwcm9wZXIgYml0bWFwIGluIG1lbW9yeSBub3cKLQkqLwotCWlmIChjb3dkZXYtPmNvd2hlYWQtPmZsYWdzICYgQ09XRElSVFkpIHsKLQkJdW5zaWduZWQgbG9uZyBsb25nCWJsb2NrbnVtOwotCQljaGFyCQkJZGF0YWJ1ZltNQVBVTklUXTsKLQkJdW5zaWduZWQgbG9uZwkJbWFwbnVtLCBtYXBieXRlLCBtYXBiaXQ7Ci0KLQkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3dsb29wIC0gcmVjb3ZlciBkaXJ0eSBjb3dmaWxlICVzLi4uLlxuIiwKLQkJCQkJCQljb3dmKTsKLQotCQkvKgotCQkqKiByZWFkIGFsbCBkYXRhIGJsb2NrcwotCQkqLwotCQlmb3IgKGJsb2NrbnVtPTAsIHJ2PTEsIG9mZnNldD0wOwotCQkJY293bG9fcmVhZGNvdyhjb3dkZXYsIGRhdGFidWYsIE1BUFVOSVQsIG9mZnNldCkgPiAwOwotCQkJYmxvY2tudW0rKywgb2Zmc2V0ICs9IE1BUFVOSVQpIHsKLQotCQkJLyoKLQkJCSoqIGlmIHRoaXMgZGF0YWJsb2NrIGNvbnRhaW5zIHJlYWwgZGF0YSAobm90IGJpbmFyeQotCQkJKiogemVyb2VzKSwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgYml0bWFwCi0JCQkqLwotCQkJaWYgKCBtZW1jbXAoZGF0YWJ1ZiwgYWxsemVyb2VzLCBNQVBVTklUKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQltYXBudW0gID0gQ0FMQ01BUCAoYmxvY2tudW0pOwotCQkJbWFwYnl0ZSA9IENBTENCWVRFKGJsb2NrbnVtKTsKLQkJCW1hcGJpdCAgPSBDQUxDQklUIChibG9ja251bSk7Ci0KLQkJCSooKihjb3dkZXYtPm1hcGNhY2hlK21hcG51bSkrbWFwYnl0ZSkgfD0gKDE8PG1hcGJpdCk7Ci0JCX0KLQotCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvd2xvb3AgLSBjb3dmaWxlIHJlY292ZXJ5IGNvbXBsZXRlZFxuIik7Ci0JfQotCi0JLyoKLQkqKiBjb3VudCBhbGwgYml0cyBzZXQgaW4gdGhlIGJpdG1hcHMgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzCi0JKi8KLQlmb3IgKGk9MCwgY293ZGV2LT5ucmNvd2Jsb2NrcyA9IDA7IGkgPCBjb3dkZXYtPm1hcGNvdW50OyBpKyspIHsKLQkJbG9uZwludW1ieXRlczsKLQkJY2hhcgkqcDsKLQotCQlpZiAoaSA8IChjb3dkZXYtPm1hcGNvdW50LTEpKQotCQkJbnVtYnl0ZXMgPSBNQVBDSFVOS1NaOwotCQllbHNlCi0JCQludW1ieXRlcyA9IGNvd2Rldi0+bWFwcmVtYWluOwotCi0JCXAgPSAqKGNvd2Rldi0+bWFwY2FjaGUraSk7Ci0KLQkJZm9yIChudW1ieXRlcy0tOyBudW1ieXRlcyA+PSAwOyBudW1ieXRlcy0tLCBwKyspIHsKLQkJCS8qCi0JCQkqKiBmb3Igb25seSBlaWdodCBjaGVja3MgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3Rpb24KLQkJCSoqIGlzIGZhc3RlciB0aGFuIGEgbG9vcC1jb25zdHJ1Y3Rpb24KLQkJCSovCi0JCQlpZiAoKCpwKSAmIDB4MDEpCWNvd2Rldi0+bnJjb3dibG9ja3MrKzsKLQkJCWlmICgoKnApICYgMHgwMikJY293ZGV2LT5ucmNvd2Jsb2NrcysrOwotCQkJaWYgKCgqcCkgJiAweDA0KQljb3dkZXYtPm5yY293YmxvY2tzKys7Ci0JCQlpZiAoKCpwKSAmIDB4MDgpCWNvd2Rldi0+bnJjb3dibG9ja3MrKzsKLQkJCWlmICgoKnApICYgMHgxMCkJY293ZGV2LT5ucmNvd2Jsb2NrcysrOwotCQkJaWYgKCgqcCkgJiAweDIwKQljb3dkZXYtPm5yY293YmxvY2tzKys7Ci0JCQlpZiAoKCpwKSAmIDB4NDApCWNvd2Rldi0+bnJjb3dibG9ja3MrKzsKLQkJCWlmICgoKnApICYgMHg4MCkJY293ZGV2LT5ucmNvd2Jsb2NrcysrOwotCQl9Ci0JfQotCi0JLyoKLQkqKiBjb25zaXN0ZW5jeS1jaGVjayBmb3IgbnVtYmVyIG9mIGJpdHMgc2V0IGluIGJpdG1hcAotCSovCi0JaWYgKCAhKGNvd2Rldi0+Y293aGVhZC0+ZmxhZ3MgJiBDT1dESVJUWSkgJiYKLQkgICAgKGNvd2Rldi0+Y293aGVhZC0+Y293dXNlZCAhPSBjb3dkZXYtPm5yY293YmxvY2tzKSApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb3dsb29wIC0gaW5jb25zaXN0ZW50IGNvd2ZpbGUgYWRtaVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotKiogdW5kbyBtZW1vcnkgYWxsb2NzIGFuZCBmaWxlIG9wZW5zIGlzc3VlZCBzbyBmYXIKLSoqIHJlbGF0ZWQgdG8gdGhlIGNvd2ZpbGUKLSovCi1zdGF0aWMgdm9pZAotY293bG9fdW5kb19vcGVuY293KHN0cnVjdCBjb3dsb29wX2RldmljZSAqY293ZGV2KQotewotCWludAlpOwotCi0JaWYgKGNvd2Rldi0+bWFwY2FjaGUpIHsKLQkJZm9yIChpPTA7IGkgPCBjb3dkZXYtPm1hcGNvdW50OyBpKyspIHsKLQkJCWlmICgqKGNvd2Rldi0+bWFwY2FjaGUraSkgIT0gTlVMTCkKLQkJCQlrZnJlZSggKihjb3dkZXYtPm1hcGNhY2hlK2kpICk7Ci0JCX0KLQotCQlrZnJlZShjb3dkZXYtPm1hcGNhY2hlKTsKLQl9Ci0KLQlpZiAoY293ZGV2LT5jb3doZWFkKQotCQlrZnJlZShjb3dkZXYtPmNvd2hlYWQpOwotCi0JaWYgKCAoY293ZGV2LT5zdGF0ZSAmIENPV0NPV09QRU4pICYmIChjb3dkZXYtPmNvd2ZwKSApCi0gIAkJZmlscF9jbG9zZShjb3dkZXYtPmNvd2ZwLCAwKTsKLQotCS8qCi0JKiogbWFyayBjb3dmaWxlIGNsb3NlZAotCSovCi0JY293ZGV2LT5zdGF0ZSAmPSB+Q09XQ09XT1BFTjsKLX0KLQotLyoKLSoqIGZsdXNoIHRoZSBlbnRpcmUgYml0bWFwIGFuZCB0aGUgY293aGVhZCAoY2xlYW4pIHRvIHRoZSBjb3dmaWxlCi0qKgotKiogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgY293ZGV2aWNlcy1sb2NrIHNldAotKi8KLXN0YXRpYyB2b2lkCi1jb3dsb19zeW5jKHZvaWQpCi17Ci0JaW50CQkJaSwgbWlub3I7Ci0JbG9mZl90CQkJb2Zmc2V0OwotCXN0cnVjdCBjb3dsb29wX2RldmljZQkqY293ZGV2OwotCi0JZm9yIChtaW5vcj0wOyBtaW5vciA8IG1heGNvd3M7ICBtaW5vcisrKSB7Ci0JCWNvd2RldiA9IGNvd2RldmFsbFttaW5vcl07Ci0JCWlmICggISAoY293ZGV2LT5zdGF0ZSAmIENPV1JXQ09XT1BFTikgKQotCQkJY29udGludWU7Ci0KLQkJZm9yIChpPTAsIG9mZnNldD1NQVBVTklUOyBpIDwgY293ZGV2LT5tYXBjb3VudDsKLQkJCQkJaSsrLCBvZmZzZXQgKz0gTUFQQ0hVTktTWikgewotCQkJdW5zaWduZWQgbG9uZwludW1ieXRlczsKLQotCQkJaWYgKGkgPCAoY293ZGV2LT5tYXBjb3VudC0xKSkKLQkJCQkvKgotCQkJCSoqIGZ1bGwgYml0bWFwIGNodW5rCi0JCQkJKi8KLQkJCQludW1ieXRlcyA9IE1BUENIVU5LU1o7Ci0JCQllbHNlCi0JCQkJLyoKLQkJCQkqKiBsYXN0IGJpdG1hcCBjaHVuazogbWlnaHQgYmUgcGFydGx5IGZpbGxlZAotCQkJCSovCi0JCQkJbnVtYnl0ZXMgPSBjb3dkZXYtPm1hcHJlbWFpbjsKLQotCQkJREVCVUdQKERDT1cKLQkJCSAgICAgICAiY293bG9vcCAtIGZsdXNoaW5nIGJpdG1hcCAlMmQgKCUzbGQgS2IpXG4iLAotCQkJCQkJCWksIG51bWJ5dGVzLzEwMjQpOwotCi0JCQlpZiAoY293bG9fd3JpdGVjb3dyYXcoY293ZGV2LCAqKGNvd2Rldi0+bWFwY2FjaGUraSksCi0JCQkJCQludW1ieXRlcywgb2Zmc2V0KSA8IG51bWJ5dGVzKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkqKiBmbHVzaCBjbGVhbiB1cC10by1kYXRlIGNvd2hlYWQgdG8gY293ZmlsZQotCQkqLwotCQljb3dkZXYtPmNvd2hlYWQtPmNvd3VzZWQJID0gY293ZGV2LT5ucmNvd2Jsb2NrczsKLQkJY293ZGV2LT5jb3doZWFkLT5mbGFncwkJJj0gfkNPV0RJUlRZOwotCi0JCURFQlVHUChEQ09XICJjb3dsb29wIC0gZmx1c2hpbmcgY293aGVhZCAoJTNkIEtiKVxuIiwKLQkJCQkJCQlNQVBVTklULzEwMjQpOwotCi0JCWNvd2xvX3dyaXRlY293cmF3KGNvd2RldiwgY293ZGV2LT5jb3doZWFkLCBNQVBVTklULCAobG9mZl90KSAwKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE1vZHVsZSBsb2FkaW5nL3VubG9hZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSoqIGNhbGxlZCBkdXJpbmcgaW5zbW9kL21vZHByb2JlCi0qLwotc3RhdGljIGludCBfX2luaXQKLWNvd2xvX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50CXJ2OwotCWludAltaW5vciwgdXB0b2Nvd3M7Ci0KLSAgICAgICAgcmV2aXNpb25bc2l6ZW9mIHJldmlzaW9uIC0gM10gPSAnXDAnOwotCi0gICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiY293bG9vcCAtIChDKSAyMDA5IEFUQ29tcHV0aW5nLm5sIC0gdmVyc2lvbjogJXNcbiIsICZyZXZpc2lvblsxMV0pOwotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgImNvd2xvb3AgLSBpbmZvOiB3d3cuQVRDb21wdXRpbmcubmwvY293bG9vcFxuIik7Ci0KLQltZW1zZXQoYWxsemVyb2VzLCAwLCBNQVBVTklUKTsKLQotCS8qCi0JKiogU2V0dXAgYWRtaW5pc3RyYXRpb24gZm9yIGFsbCBwb3NzaWJsZSBjb3dkZXZpY2VzLgotICAgICAgICAqKiBOb3RlIHRoYXQgdGhlaXIgbWlub3IgbnVtYmVycyBnbyBmcm9tIDAgdG8gTUFYQ09XUy0xIGluY2x1c2l2ZQotICAgICAgICAqKiBhbmQgbWlub3IgPT0gTUFYQ09XUy0xIGlzIHJlc2VydmVkIGZvciB0aGUgY29udHJvbCBkZXZpY2UuCi0JKi8KLQlpZiAoKG1heGNvd3MgPCAxKSB8fCAobWF4Y293cyA+IE1BWENPV1MpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJjb3dsb29wIC0gbWF4Y293cyBleGNlZWRzIG1heGltdW0gb2YgJWRcbiIsIE1BWENPV1MpOwotCi0gICAgICAgICAgICAgICAgbWF4Y293cyA9IERGTENPV1M7Ci0gICAgICAgIH0KLQotCS8qIGFsbG9jYXRlIHJvb20gZm9yIGEgdGFibGUgd2l0aCBhIHBvaW50ZXIgdG8gZWFjaCBjb3dsb29wX2RldmljZTogKi8KLSAgICAgICAgaWYgKCAoY293ZGV2YWxsID0ga21hbGxvYyhtYXhjb3dzICogc2l6ZW9mKHN0cnVjdCBjb3dsb29wX2RldmljZSAqKSwKLQkJCQkJCQlHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAgImNvd2xvb3AgLSBjYW4gbm90IGFsbG9jIHRhYmxlIGZvciAlZCBkZXZzXG4iLCBtYXhjb3dzKTsKLQkJdXB0b2Nvd3MgPSAwOwotCQlydiA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3Jfb3V0OwotCX0KLQltZW1zZXQoY293ZGV2YWxsLCAwLCBtYXhjb3dzICogc2l6ZW9mKHN0cnVjdCBjb3dsb29wX2RldmljZSAqKSk7Ci0JLyogdGhlbiBob29rIGFuIGFjdHVhbCBjb3dsb29wX2RldmljZSBzdHJ1Y3QgdG8gZWFjaCBwb2ludGVyOiAqLwotCWZvciAobWlub3I9MDsgbWlub3IgPCBtYXhjb3dzOyBtaW5vcisrKSB7Ci0JCWlmICgoY293ZGV2YWxsW21pbm9yXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb3dsb29wX2RldmljZSksCi0JCQkJCQlHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgICAgICJjb3dsb29wIC0gY2FuIG5vdCBhbGxvYyBhZG1pbi1zdHJ1Y3QgZm9yIGRldiBubyAlZFxuIiwgbWlub3IpOwotCi0JCQl1cHRvY293cyA9IG1pbm9yOyAvKiB0aGlzIGlzIGhvdyBmYXIgd2UgZ290Li4uLiAqLwotCQkJcnYgPSAtRU5PTUVNOwotCQkJZ290byBlcnJvcl9vdXQ7Ci0JCX0KLSAgICAgICAgCW1lbXNldChjb3dkZXZhbGxbbWlub3JdLCAwLCBzaXplb2Yoc3RydWN0IGNvd2xvb3BfZGV2aWNlKSk7Ci0JfQotCXVwdG9jb3dzID0gbWF4Y293czsgLyogd2UgZ290IGFsbCBkZXZpY2VzICovCi0KLQlzZW1hX2luaXQoJmNvd2RldmxvY2ssIDEpOwotCi0JLyoKLQkqKiByZWdpc3RlciBjb3dsb29wIG1vZHVsZQotCSovCi0JaWYgKCByZWdpc3Rlcl9ibGtkZXYoQ09XTUFKT1IsIERFVklDRV9OQU1FKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgImNvd2xvb3AgLSB1bmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciBjb3dsb29wXG4iLCBDT1dNQUpPUik7Ci0JCXJ2ID0gLUVJTzsKLQkJZ290byBlcnJvcl9vdXQ7Ci0JfQotCi0JLyoKLQkqKiBjcmVhdGUgYSBkaXJlY3RvcnkgYmVsb3cgL3Byb2MgdG8gYWxsb2NhdGUgYSBmaWxlCi0JKiogZm9yIGVhY2ggY293ZGV2aWNlIHRoYXQgaXMgYWxsb2NhdGVkIGxhdGVyIG9uCi0JKi8KLQljb3dsb19wcm9jZGlyID0gcHJvY19ta2RpcigiY293IiwgTlVMTCk7Ci0KLQkvKgotCSoqIGNoZWNrIGlmIGEgY293ZGV2aWNlIGhhcyB0byBiZSBvcGVuZWQgZHVyaW5nIGluc21vZC9tb2Rwcm9iZTsKLQkqKiB0d28gcGFyYW1ldGVycyBzaG91bGQgYmUgc3BlY2lmaWVkIHRoZW46IHJkb2ZpbGU9IGFuZCBjb3dmaWxlPQotCSovCi0JaWYoIChyZG9maWxlWzBdICE9ICdcMCcpICYmIChjb3dmaWxlWzBdICE9ICdcMCcpICkgewotCQljaGFyCSpwbyA9IG9wdGlvbjsKLQkJaW50CXdhbnRyZWNvdmVyID0gMDsKLQotCQkvKgotCQkqKiBjaGVjayBpZiBhdXRvbWF0aWMgcmVjb3ZlcnkgaXMgd2FudGVkCi0JCSovCi0JCXdoaWxlICgqcG8pIHsKLQkJCWlmICgqcG8gPT0gJ3InKSB7Ci0JCQkJd2FudHJlY292ZXIgPSAxOwotCQkJCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJcG8rKzsKLQkJfQotCi0JCS8qCi0JCSoqIG9wZW4gbmV3IGNvd2RldmljZSB3aXRoIG1pbm9yIG51bWJlciAwCi0JCSovCi0JCWlmICggKHJ2ID0gY293bG9fb3BlbnBhaXIocmRvZmlsZSwgY293ZmlsZSwgd2FudHJlY292ZXIsIDApKSkgewotCQkJcmVtb3ZlX3Byb2NfZW50cnkoImNvdyIsIE5VTEwpOwotCQkJdW5yZWdpc3Rlcl9ibGtkZXYoQ09XTUFKT1IsIERFVklDRV9OQU1FKTsKLQkJCWdvdG8gZXJyb3Jfb3V0OwotCQl9Ci0gICAgICAgIH0gZWxzZSB7Ci0JCS8qCi0JCSoqIGNoZWNrIGlmIG9ubHkgb25lIHBhcmFtZXRlciBoYXMgYmVlbiBzcGVjaWZpZWQKLQkJKi8KLQkJaWYoIChyZG9maWxlWzBdICE9ICdcMCcpIHx8IChjb3dmaWxlWzBdICE9ICdcMCcpICkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvd2xvb3AgLSBvbmx5IG9uZSBmaWxlbmFtZSBzcGVjaWZpZWRcbiIpOwotCQkJcmVtb3ZlX3Byb2NfZW50cnkoImNvdyIsIE5VTEwpOwotCQkJdW5yZWdpc3Rlcl9ibGtkZXYoQ09XTUFKT1IsIERFVklDRV9OQU1FKTsKLQkJCXJ2ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyb3Jfb3V0OwotCQl9Ci0JfQotCi0JLyoKLQkqKiBhbGxvY2F0ZSBmYWtlIGRpc2sgYXMgY29udHJvbCBjaGFubmVsIHRvIGhhbmRsZSB0aGUgcmVxdWVzdHMKLQkqKiB0byBhY3RpdmF0ZSBhbmQgZGVhY3RpdmF0ZSBjb3dkZXZpY2VzIGR5bmFtaWNhbGx5Ci0JKi8KLQlpZiAoIShjb3djdGxnZCA9IGFsbG9jX2Rpc2soMSkpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJjb3dsb29wIC0gdW5hYmxlIHRvIGFsbG9jX2Rpc2sgZm9yIGNvd2N0bFxuIik7Ci0KLQkJcmVtb3ZlX3Byb2NfZW50cnkoImNvdyIsIE5VTEwpOwotCQkodm9pZCkgY293bG9fY2xvc2VwYWlyKGNvd2RldmFsbFswXSk7Ci0JCXVucmVnaXN0ZXJfYmxrZGV2KENPV01BSk9SLCBERVZJQ0VfTkFNRSk7Ci0JCXJ2ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9vdXQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJmNvd2N0bHJxbG9jayk7Ci0JY293Y3RsZ2QtPm1ham9yICAgICAgICA9IENPV01BSk9SOwotCWNvd2N0bGdkLT5maXJzdF9taW5vciAgPSBDT1dDVEw7Ci0JY293Y3RsZ2QtPm1pbm9ycyAgICAgICA9IDE7Ci0JY293Y3RsZ2QtPmZvcHMgICAgICAgICA9ICZjb3dsb19mb3BzOwotCWNvd2N0bGdkLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCS8qIHRoZSBkZXZpY2UgaGFzIGNhcGFjaXR5IDAsIHNvIHRoZXJlIHdpbGwgYmUgbm8gcS1yZXF1ZXN0cyAqLwotCWNvd2N0bGdkLT5xdWV1ZSA9IGJsa19pbml0X3F1ZXVlKE5VTEwsICZjb3djdGxycWxvY2spOwotCXNwcmludGYoY293Y3RsZ2QtPmRpc2tfbmFtZSwgImNvd2N0bCIpOwotCXNldF9jYXBhY2l0eShjb3djdGxnZCwgMCk7Ci0KLQlhZGRfZGlzayhjb3djdGxnZCk7Ci0KLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJjb3dsb29wIC0gbnVtYmVyIG9mIGNvbmZpZ3VyZWQgY293ZGV2aWNlczogJWRcbiIsCi0JCQkJCQkJCW1heGNvd3MpOwotCWlmIChyZG9maWxlWzBdICE9ICdcMCcpIHsKLQkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJjb3dsb29wIC0gaW5pdGlhbGl6ZWQgb24gcmRvZmlsZT0lc1xuIiwKLQkJCQkJCQkJcmRvZmlsZSk7Ci0JfSBlbHNlIHsKLQkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJjb3dsb29wIC0gaW5pdGlhbGl6ZWQgd2l0aG91dCByZG9maWxlIHlldFxuIik7Ci0JfQotCXJldHVybiAwOwotCi1lcnJvcl9vdXQ6Ci0JZm9yIChtaW5vcj0wOyBtaW5vciA8IHVwdG9jb3dzIDsgbWlub3IrKykgewotCQlrZnJlZShjb3dkZXZhbGxbbWlub3JdKTsKLQl9Ci0Ja2ZyZWUoY293ZGV2YWxsKTsKLQlyZXR1cm4gcnY7Ci19Ci0KLS8qCi0qKiBjYWxsZWQgZHVyaW5nIHJtbW9kCi0qLwotc3RhdGljIHZvaWQgX19leGl0Ci1jb3dsb19jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCWludAltaW5vcjsKLQotCS8qCi0JKiogZmx1c2ggYml0bWFwcyBhbmQgY293aGVhZHMgdG8gdGhlIGNvd2ZpbGVzCi0JKi8KLQlkb3duKCZjb3dkZXZsb2NrKTsKLQljb3dsb19zeW5jKCk7Ci0JdXAoJmNvd2RldmxvY2spOwotCi0JLyoKLQkqKiBjbG9zZSBhbGwgY293ZGV2aWNlcwotCSovCi0JZm9yIChtaW5vcj0wOyBtaW5vciA8IG1heGNvd3M7ICBtaW5vcisrKQotCQkodm9pZCkgY293bG9fY2xvc2VwYWlyKGNvd2RldmFsbFttaW5vcl0pOwotCi0JdW5yZWdpc3Rlcl9ibGtkZXYoQ09XTUFKT1IsIERFVklDRV9OQU1FKTsKLQotCS8qCi0JKiogZ2V0IHJpZCBvZiAvcHJvYy9jb3cgYW5kIHVucmVnaXN0ZXIgdGhlIGRyaXZlcgotCSovCi0JcmVtb3ZlX3Byb2NfZW50cnkoImNvdyIsIE5VTEwpOwotCi0JZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgbWF4Y293czsgbWlub3IrKykgewotCQlrZnJlZShjb3dkZXZhbGxbbWlub3JdKTsKLQl9Ci0Ja2ZyZWUoY293ZGV2YWxsKTsKLQotCWRlbF9nZW5kaXNrKGNvd2N0bGdkKTsgIC8qIHJldmVydCB0aGUgYWxsb2NfZGlzaygpICovCi0JcHV0X2Rpc2sgICAoY293Y3RsZ2QpOyAgLyogcmV2ZXJ0IHRoZSBhZGRfZGlzaygpICAgKi8KLQlibGtfY2xlYW51cF9xdWV1ZShjb3djdGxnZC0+cXVldWUpOyAvKiBjbGVhbnVwIHRoZSBlbXB0eSBxdWV1ZSAqLwotCi0JcHJpbnRrKEtFUk5fTk9USUNFICJjb3dsb29wIC0gdW5sb2FkZWRcbiIpOwotfQotCi1tb2R1bGVfaW5pdChjb3dsb19pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChjb3dsb19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY293bG9vcC9jb3dsb29wLmggYi9kcml2ZXJzL3N0YWdpbmcvY293bG9vcC9jb3dsb29wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZDRhMzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Nvd2xvb3AvY293bG9vcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSoqIERPIE5PVCBNT0RJRlkgVEhFU0UgVkFMVUVTICh3b3VsZCBtYWtlIG9sZCBjb3dmaWxlcyB1bnVzYWJsZSkKLSovCi0jZGVmaW5lCU1BUFVOSVQJCTEwMjQJCS8qIGJsb2Nrc2l6ZSBmb3IgYml0IGluIGJpdG1hcCAgICAgICAqLwotI2RlZmluZQlNVVNISUZUCQkxMAkJLyogYml0c2hpZnQgIGZvciBiaXQgaW4gYml0bWFwICAgICAgICovCi0jZGVmaW5lCU1VTUFTSwkJMHgzZmYJCS8qIGJpdG1hc2sgICBmb3IgYml0IGluIGJpdG1hcCAgICAgICAqLwotCi0jZGVmaW5lCUNPV01BR0lDCTB4NTc0ZjQzN2YJLyogYnl0ZS1zd2FwcGVkICc3ZiBDIE8gVycgICAgICAgICAgICovCi0jZGVmaW5lCUNPV0RJUlRZCTB4MDEKLSNkZWZpbmUJQ09XUEFDS0VECTB4MDIKLSNkZWZpbmUJQ09XVkVSU0lPTgkxCi0KLXN0cnVjdCBjb3doZWFkCi17Ci0JaW50CQltYWdpYzsJCS8qIGlkZW50aWZpZXMgYSBjb3dmaWxlICAgICAgICAgICAgICAqLwotCXNob3J0CQl2ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIGNvd2hlYWQgICAgICAgICAgICAgICAgKi8KLQlzaG9ydAkJZmxhZ3M7ICAgIAkvKiBmbGFncyBpbmRpY2F0aW5nIHN0YXR1cyAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCW1hcHVuaXQ7CS8qIGJsb2Nrc2l6ZSBwZXIgYml0IGluIGJpdG1hcCAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJbWFwc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiBiaXRtYXAgKGJ5dGVzKSAgICAgICovCi0JdW5zaWduZWQgbG9uZwlkb2Zmc2V0OwkvKiBzdGFydC1vZmZzZXQgZGF0YWJsb2NrcyBpbiBjb3cgICAgKi8KLQl1bnNpZ25lZCBsb25nCXJkb2Jsb2NrczsJLyogc2l6ZSBvZiByZWxhdGVkIHJlYWQtb25seSBmaWxlICAgICovCi0JdW5zaWduZWQgbG9uZwlyZG9maW5nZXJwcmludDsJLyogZmluZ2VycHJpbnQgb2YgcmVhZC1vbmx5IGZpbGUgICAgICovCi0JdW5zaWduZWQgbG9uZwljb3d1c2VkOwkvKiBudW1iZXIgb2YgZGF0YWJsb2NrcyB1c2VkIGluIGNvdyAgKi8KLX07Ci0KLSNkZWZpbmUgQ09XREVWRElSCSIvZGV2L2Nvdy8iCi0jZGVmaW5lIENPV0RFVklDRQlDT1dERVZESVIgIiVsZCIKLSNkZWZpbmUgQ09XQ09OVFJPTAlDT1dERVZESVIgImN0bCIKLQotI2RlZmluZSBNQVhDT1dTCQkxMDI0Ci0jZGVmaW5lIENPV0NUTAkJKE1BWENPV1MtMSkJLyogbWlub3IgbnVtYmVyIG9mIC9kZXYvY293L2N0bCAgICAgKi8KLQotI2RlZmluZSBDT1dQUk9DRElSCSIvcHJvYy9jb3cvIgotI2RlZmluZSBDT1dQUk9DRklMRQlDT1dQUk9DRElSICIlZCIKLQotLyoKLSoqIGlvY3RsIHJlbGF0ZWQgc3R1ZmYKLSovCi0jZGVmaW5lIEFOWURFVgkJKCh1bnNpZ25lZCBsb25nKS0xKQotCi1zdHJ1Y3QgY293cGFpcgotewotCXVuc2lnbmVkIGNoYXIJKnJkb2ZpbGU7CS8qIHBhdGhuYW1lIG9mIHRoZSByZG9maWxlICAgICAgICAgICAqLwotCXVuc2lnbmVkIGNoYXIJKmNvd2ZpbGU7CS8qIHBhdGhuYW1lIG9mIHRoZSBjb3dmaWxlICAgICAgICAgICAqLwotCXVuc2lnbmVkIHNob3J0CXJkb2ZsZW47CS8qIGxlbmd0aCBvZiByZG9maWxlIHBhdGhuYW1lICAgICAgICAqLwotCXVuc2lnbmVkIHNob3J0CWNvd2ZsZW47CS8qIGxlbmd0aCBvZiBjb3dmaWxlIHBhdGhuYW1lICAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJZGV2aWNlOwkJLyogcmVxdWVzdGVkL3JldHVybmVkIGRldmljZSBudW1iZXIgICovCi19OwotCi1zdHJ1Y3QgY293d2F0Y2gKLXsKLQlpbnQgICAgICAJZmxhZ3M7CQkvKiByZXF1ZXN0IGZsYWdzICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nCWRldmljZTsJCS8qIHJlcXVlc3RlZCBkZXZpY2UgbnVtYmVyICAgICAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcJdGhyZXNob2xkOwkvKiBjb250aW51ZSBpZiBmcmVlIEtiIDwgdGhyZXNob2xkICAgKi8KLQl1bnNpZ25lZCBsb25nCXRvdGFsa2I7CS8qIHJldDogdG90YWwgZmlsZXN5c3RlbSBzaXplIChLYikgICAqLwotCXVuc2lnbmVkIGxvbmcJYXZhaWxrYjsJLyogcmV0OiBmcmVlICBmaWxlc3lzdGVtIHNpemUgKEtiKSAgICovCi19OwotCi0jZGVmaW5lCVdBVENIV0FJVAkweDAxCQkvKiBibG9jayB1bnRpbCB0aHJlc2hvbGQgcmVhY2hlZCAgICAgKi8KLQotI2RlZmluZQlDT1dTWU5DCQlfSU8gICgnQycsIDEpCi0jZGVmaW5lCUNPV01LUEFJUglfSU9XICgnQycsIDIsIHN0cnVjdCBjb3dwYWlyKQotI2RlZmluZQlDT1dSTVBBSVIJX0lPVyAoJ0MnLCAzLCB1bnNpZ25lZCBsb25nKQotI2RlZmluZQlDT1dXQVRDSAlfSU9XICgnQycsIDQsIHN0cnVjdCBjb3d3YXRjaCkKLSNkZWZpbmUJQ09XQ0xPU0UJX0lPVyAoJ0MnLCA1LCB1bnNpZ25lZCBsb25nKQotI2RlZmluZQlDT1dSRE9QRU4JX0lPVyAoJ0MnLCA2LCB1bnNpZ25lZCBsb25nKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jcGMtdXNiL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZTBiYzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotY29uZmlnIFVTQl9DUEMKLQl0cmlzdGF0ZSAiQ1BDIENBTiBVU0IgZHJpdmVyIgotCWRlcGVuZHMgb24gVVNCICYmIFBST0NfRlMKLQlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcGMtdXNiL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODMxNzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW9iai0kKENPTkZJR19VU0JfQ1BDKQkrPSBjcGMtdXNiLm8KLQotY3BjLXVzYi15IDo9IGNwYy11c2JfZHJ2Lm8gc2phMm0xNmNfMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3BjLXVzYi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxNzUyZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3BjLXVzYi9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotVGhpbmdzIHRvIGRvIGZvciB0aGlzIGRyaXZlciB0byBnZXQgbWVyZ2VkIGludG8gdGhlIG1haW4gcG9ydGlvbiBvZiB0aGUKLWtlcm5lbDoKLQktIGNoZWNrcGF0Y2ggY2xlYW51cHMKLQktIHNwYXJzZSBjbGVhbgotCS0gcmVtb3ZlIHByb2MgY29kZQotCS0gdGllIGludG8gQ0FOIHNvY2tldCBpbnRlcmZhY2VzIGlmIHBvc3NpYmxlCi0JLSBmaWd1cmUgb3V0IHNhbmUgdXNlcnNwYWNlIGFwaQotCS0gdXNlIGxpbnV4J3MgZXJyb3IgY29kZXMKLQotU2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3BjLXVzYi9jcGMtdXNiX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvY3BjLXVzYl9kcnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlY2E0Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3BjLXVzYi9jcGMtdXNiX2Rydi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4NCArMCwwIEBACi0vKgotICogQ1BDLVVTQiBDQU4gSW50ZXJmYWNlIEtlcm5lbCBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBFTVMgRHIuIFRob21hcyBXdWVuc2NoZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLQotCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotCi0jaW5jbHVkZSAiY3BjLmgiCi0KLSNpbmNsdWRlICJjcGNfaW50LmgiCi0jaW5jbHVkZSAiY3BjdXNiLmgiCi0KLSNpbmNsdWRlICJzamEybTE2Yy5oIgotCi0vKiBWZXJzaW9uIEluZm9ybWF0aW9uICovCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgICJTZWJhc3RpYW4gSGFhcyA8aGFhc0BlbXMtd3VlbnNjaGUuY29tPiIKLSNkZWZpbmUgRFJJVkVSX0RFU0MgICAgIkNQQy1VU0IgRHJpdmVyIGZvciBMaW51eCBLZXJuZWwgMi42IgotI2RlZmluZSBEUklWRVJfVkVSU0lPTiBDUENfRFJJVkVSX1ZFUlNJT04KLQotTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ci1NT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0KLS8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2VzICovCi0jZGVmaW5lIFVTQl9DUENVU0JfVkVORE9SX0lECTB4MTJENgotCi0jZGVmaW5lIFVTQl9DUENVU0JfTTE2Q19QUk9EVUNUX0lEICAgIDB4MDg4OAotI2RlZmluZSBVU0JfQ1BDVVNCX0xQQzIxMTlfUFJPRFVDVF9JRCAweDA0NDQKLQotI2RlZmluZSBDUENfVVNCX1BST0NfRElSICAgICBDUENfUFJPQ19ESVIgImNwYy11c2IiCi0KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXI7Ci1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jRW50cnk7Ci0KLS8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IGRlYnVnOwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08pOwotCi0vKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgY3BjdXNiX3RhYmxlW10gPSB7Ci0Je1VTQl9ERVZJQ0UoVVNCX0NQQ1VTQl9WRU5ET1JfSUQsIFVTQl9DUENVU0JfTTE2Q19QUk9EVUNUX0lEKX0sCi0Je1VTQl9ERVZJQ0UoVVNCX0NQQ1VTQl9WRU5ET1JfSUQsIFVTQl9DUENVU0JfTFBDMjExOV9QUk9EVUNUX0lEKX0sCi0Je30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGNwY3VzYl90YWJsZSk7Ci0KLS8qIHVzZSB0byBwcmV2ZW50IGtlcm5lbCBwYW5pYyBpZiBkcml2ZXIgaXMgdW5sb2FkZWQKLSAqIHdoaWxlIGEgcHJvZ3JhbW0gaGFzIHN0aWxsIG9wZW4gdGhlIGRldmljZQotICovCi1ERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChybW1vZFdxKTsKLWF0b21pY190IHVzZUNvdW50OwotCi1zdGF0aWMgQ1BDX1VTQl9UICpDUENVU0JfVGFibGVbQ1BDX1VTQl9DQVJEX0NOVF0gPSB7IDAgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgQ1BDVXNiQ250OwotCi0vKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkgKi8KLXN0YXRpYyBERUNMQVJFX01VVEVYKGRpc2Nvbm5lY3Rfc2VtKTsKLQotLyogbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotc3RhdGljIHNzaXplX3QgY3BjdXNiX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAotCQkJICAgbG9mZl90ICpwcG9zKTsKLXN0YXRpYyBzc2l6ZV90IGNwY3VzYl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAotCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3BjdXNiX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KTsKLXN0YXRpYyBpbnQgY3BjdXNiX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCBjcGN1c2JfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci0KLXN0YXRpYyBpbnQgY3BjdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCi0JCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwotc3RhdGljIHZvaWQgY3BjdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7Ci0KLXN0YXRpYyB2b2lkIGNwY3VzYl9yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyB2b2lkIGNwY3VzYl93cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7Ci1zdGF0aWMgdm9pZCBjcGN1c2JfcmVhZF9pbnRlcnJ1cHRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKLQotc3RhdGljIGludCBjcGN1c2Jfc2V0dXBfaW50cmVwKENQQ19VU0JfVCAqY2FyZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNwY3VzYl9mb3BzID0gewotCS8qCi0JICogVGhlIG93bmVyIGZpZWxkIGlzIHBhcnQgb2YgdGhlIG1vZHVsZS1sb2NraW5nCi0JICogbWVjaGFuaXNtLiBUaGUgaWRlYSBpcyB0aGF0IHRoZSBrZXJuZWwga25vd3MKLQkgKiB3aGljaCBtb2R1bGUgdG8gaW5jcmVtZW50IHRoZSB1c2UtY291bnRlciBvZgotCSAqIEJFRk9SRSBpdCBjYWxscyB0aGUgZGV2aWNlJ3Mgb3BlbigpIGZ1bmN0aW9uLgotCSAqIFRoaXMgYWxzbyBtZWFucyB0aGF0IHRoZSBrZXJuZWwgY2FuIGRlY3JlbWVudAotCSAqIHRoZSB1c2UtY291bnRlciBhZ2FpbiBiZWZvcmUgY2FsbGluZyByZWxlYXNlKCkKLQkgKiBvciBzaG91bGQgdGhlIG9wZW4oKSBmdW5jdGlvbiBmYWlsLgotCSAqLwotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCi0JLnJlYWQgPSBjcGN1c2JfcmVhZCwKLQkud3JpdGUgPSBjcGN1c2Jfd3JpdGUsCi0JLnBvbGwgPSBjcGN1c2JfcG9sbCwKLQkub3BlbiA9IGNwY3VzYl9vcGVuLAotCS5yZWxlYXNlID0gY3BjdXNiX3JlbGVhc2UsCi19OwotCi0vKgotICogdXNiIGNsYXNzIGRyaXZlciBpbmZvIGluIG9yZGVyIHRvIGdldCBhIG1pbm9yIG51bWJlciBmcm9tIHRoZSB1c2IgY29yZSwKLSAqIGFuZCB0byBoYXZlIHRoZSBkZXZpY2UgcmVnaXN0ZXJlZCB3aXRoIGRldmZzIGFuZCB0aGUgZHJpdmVyIGNvcmUKLSAqLwotc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIGNwY3VzYl9jbGFzcyA9IHsKLQkubmFtZSA9ICJ1c2IvY3BjX3VzYiVkIiwKLQkuZm9wcyA9ICZjcGN1c2JfZm9wcywKLQkubWlub3JfYmFzZSA9IENQQ19VU0JfQkFTRV9NTlIsCi19OwotCi0vKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY3BjdXNiX2RyaXZlciA9IHsKLQkubmFtZSA9ICJjcGMtdXNiIiwKLQkucHJvYmUgPSBjcGN1c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPSBjcGN1c2JfZGlzY29ubmVjdCwKLQkuaWRfdGFibGUgPSBjcGN1c2JfdGFibGUsCi19OwotCi1zdGF0aWMgaW50IGNwY3VzYl9jcmVhdGVfaW5mb19vdXRwdXQoY2hhciAqYnVmKQotewotCWludCBpID0gMCwgajsKLQotCWZvciAoaiA9IDA7IGogPCBDUENfVVNCX0NBUkRfQ05UOyBqKyspIHsKLQkJaWYgKENQQ1VTQl9UYWJsZVtqXSkgewotCQkJQ1BDX1VTQl9UICpjYXJkID0gQ1BDVVNCX1RhYmxlW2pdOwotCQkJQ1BDX0NIQU5fVCAqY2hhbiA9IGNhcmQtPmNoYW47Ci0KLQkJCS8qIE1JTk9SIENIQU5ORUxOTyBCVVNOTyBTTE9UTk8gKi8KLQkJCWkgKz0gc3ByaW50ZigmYnVmW2ldLCAiJWQgJXNcbiIsIGNoYW4tPm1pbm9yLAotCQkJCSAgICAgY2FyZC0+c2VyaWFsTnVtYmVyKTsKLQkJfQotCX0KLQotCXJldHVybiBpOwotfQotCi1zdGF0aWMgaW50IGNwY3VzYl9wcm9jX3JlYWRfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgbGVuID0gY3BjdXNiX2NyZWF0ZV9pbmZvX291dHB1dChwYWdlKTsKLQotCWlmIChsZW4gPD0gb2ZmICsgY291bnQpCi0JCSplb2YgPSAxOwotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0JbGVuIC09IG9mZjsKLQlpZiAobGVuID4gY291bnQpCi0JCWxlbiA9IGNvdW50OwotCWlmIChsZW4gPCAwKQotCQlsZW4gPSAwOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotLyoKLSAqIFJlbW92ZSBDUEMtVVNCIGFuZCBjbGVhbnVwCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcGN1c2JfZGVsZXRlKENQQ19VU0JfVCAqY2FyZCkKLXsKLQlpZiAoY2FyZCkgewotCQlpZiAoY2FyZC0+Y2hhbikgewotCQkJaWYgKGNhcmQtPmNoYW4tPmJ1ZikKLQkJCQl2ZnJlZShjYXJkLT5jaGFuLT5idWYpOwotCi0JCQlpZiAoY2FyZC0+Y2hhbi0+Q1BDV2FpdF9xKQotCQkJCWtmcmVlKGNhcmQtPmNoYW4tPkNQQ1dhaXRfcSk7Ci0KLQkJCWtmcmVlKGNhcmQtPmNoYW4pOwotCQl9Ci0KLQkJQ1BDVVNCX1RhYmxlW2NhcmQtPmlkeF0gPSBOVUxMOwotCQlrZnJlZShjYXJkKTsKLQl9Ci19Ci0KLS8qCi0gKiBzZXR1cCB0aGUgaW50ZXJydXB0IElOIGVuZHBvaW50IG9mIGEgc3BlY2lmaWMgQ1BDLVVTQiBkZXZpY2UKLSAqLwotc3RhdGljIGludCBjcGN1c2Jfc2V0dXBfaW50cmVwKENQQ19VU0JfVCAqY2FyZCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOwotCi0JZXAgPSAmY2FyZC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmVuZHBvaW50W2NhcmQtPm51bV9pbnRyX2luXS5kZXNjOwotCi0JY2FyZC0+aW50cl9pbl9idWZmZXJbMF0gPSAwOwotCWNhcmQtPmZyZWVfc2xvdHMgPSAxNTsJLyogaW5pdGlhbCBzaXplICovCi0KLQkvKiBzZXR1cCB0aGUgdXJiICovCi0JdXNiX2ZpbGxfaW50X3VyYihjYXJkLT5pbnRyX2luX3VyYiwgY2FyZC0+dWRldiwKLQkJCSB1c2JfcmN2aW50cGlwZShjYXJkLT51ZGV2LCBjYXJkLT5udW1faW50cl9pbiksCi0JCQkgY2FyZC0+aW50cl9pbl9idWZmZXIsCi0JCQkgc2l6ZW9mKGNhcmQtPmludHJfaW5fYnVmZmVyKSwKLQkJCSBjcGN1c2JfcmVhZF9pbnRlcnJ1cHRfY2FsbGJhY2ssCi0JCQkgY2FyZCwKLQkJCSBlcC0+YkludGVydmFsKTsKLQotCWNhcmQtPmludHJfaW5fdXJiLT5zdGF0dXMgPSAwOwkvKiBuZWVkZWQhICovCi0KLQkvKiBzdWJtaXQgdGhlIHVyYiAqLwotCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGNhcmQtPmludHJfaW5fdXJiLCBHRlBfS0VSTkVMKTsKLQotCWlmIChyZXR2YWwpCi0JCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyBpbnRyIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywKLQkJICAgIHJldHZhbCk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IGNwY3VzYl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCUNQQ19VU0JfVCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKLQlpbnQgc3VibWlub3I7Ci0JaW50IGosIHJldHZhbCA9IDA7Ci0KLQlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0KLQkvKiBwcmV2ZW50IGRpc2Nvbm5lY3RzICovCi0JZG93bigmZGlzY29ubmVjdF9zZW0pOwotCi0JaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZjcGN1c2JfZHJpdmVyLCBzdWJtaW5vcik7Ci0JaWYgKCFpbnRlcmZhY2UpIHsKLQkJZXJyKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWQiLAotCQkJCV9fZnVuY19fLCBzdWJtaW5vcik7Ci0JCXJldHZhbCA9IENQQ19FUlJfTk9fSU5URVJGQUNFX1BSRVNFTlQ7Ci0JCWdvdG8gZXhpdF9ub19kZXZpY2U7Ci0JfQotCi0JY2FyZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQlpZiAoIWNhcmQpIHsKLQkJcmV0dmFsID0gQ1BDX0VSUl9OT19JTlRFUkZBQ0VfUFJFU0VOVDsKLQkJZ290byBleGl0X25vX2RldmljZTsKLQl9Ci0KLQkvKiBsb2NrIHRoaXMgZGV2aWNlICovCi0JZG93bigmY2FyZC0+c2VtKTsKLQotCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkcml2ZXIgKi8KLQlpZiAoY2FyZC0+b3BlbikgewotCQlkYmcoImRldmljZSBhbHJlYWR5IG9wZW5lZCIpOwotCQlyZXR2YWwgPSBDUENfRVJSX0NIQU5ORUxfQUxSRUFEWV9PUEVOOwotCQlnb3RvIGV4aXRfb25fZXJyb3I7Ci0JfQotCi0JLyogc2F2ZSBvdXIgb2JqZWN0IGluIHRoZSBmaWxlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCWZvciAoaiA9IDA7IGogPCBDUENfVVNCX1VSQl9DTlQ7IGorKykgewotCQl1c2JfZmlsbF9idWxrX3VyYihjYXJkLT51cmJzW2pdLnVyYiwgY2FyZC0+dWRldiwKLQkJCQkgIHVzYl9yY3ZidWxrcGlwZShjYXJkLT51ZGV2LCBjYXJkLT5udW1fYnVsa19pbiksCi0JCQkJICBjYXJkLT51cmJzW2pdLmJ1ZmZlciwgY2FyZC0+dXJic1tqXS5zaXplLAotCQkJCSAgY3BjdXNiX3JlYWRfYnVsa19jYWxsYmFjaywgY2FyZCk7Ci0KLQkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoY2FyZC0+dXJic1tqXS51cmIsIEdGUF9LRVJORUwpOwotCi0JCWlmIChyZXR2YWwpIHsKLQkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLAotCQkJICAgIF9fZnVuY19fLCByZXR2YWwpOwotCQkJcmV0dmFsID0gQ1BDX0VSUl9UUkFOU01JU1NJT05fRkFJTEVEOwotCQkJZ290byBleGl0X29uX2Vycm9yOwotCQl9Ci0JfQotCi0JaW5mbygiJXMgLSAlZCBVUkIncyBzdWJtaXR0ZWQiLCBfX2Z1bmNfXywgaik7Ci0KLQlSZXNldEJ1ZmZlcihjYXJkLT5jaGFuKTsKLQotCWNwY3VzYl9zZXR1cF9pbnRyZXAoY2FyZCk7Ci0JY2FyZC0+b3BlbiA9IDE7Ci0KLQlhdG9taWNfaW5jKCZ1c2VDb3VudCk7Ci0KLWV4aXRfb25fZXJyb3I6Ci0JLyogdW5sb2NrIHRoaXMgZGV2aWNlICovCi0JdXAoJmNhcmQtPnNlbSk7Ci0KLWV4aXRfbm9fZGV2aWNlOgotCXVwKCZkaXNjb25uZWN0X3NlbSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNwY3VzYl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKLXsKLQlDUENfVVNCX1QgKmNhcmQgPSAoQ1BDX1VTQl9UICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMDsKLQotCWlmICghY2FyZCkgewotCQllcnIoIiVzIC0gZGV2aWNlIG9iamVjdCBsb3N0IiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlwb2xsX3dhaXQoZmlsZSwgY2FyZC0+Y2hhbi0+Q1BDV2FpdF9xLCB3YWl0KTsKLQotCWlmIChJc0J1ZmZlck5vdEVtcHR5KGNhcmQtPmNoYW4pIHx8ICEoY2FyZC0+cHJlc2VudCkpCi0JCXJldHZhbCB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7Ci0KLQlpZiAoY2FyZC0+ZnJlZV9zbG90cykKLQkJcmV0dmFsIHw9IChQT0xMT1VUIHwgUE9MTFdSTk9STSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IGNwY3VzYl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCUNQQ19VU0JfVCAqY2FyZCA9IChDUENfVVNCX1QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBqLCByZXR2YWwgPSAwOwotCi0JaWYgKGNhcmQgPT0gTlVMTCkgewotCQlkYmcoIiVzIC0gb2JqZWN0IGlzIE5VTEwiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBDUENfRVJSX05PX0lOVEVSRkFDRV9QUkVTRU5UOwotCX0KLQotCS8qIGxvY2sgb3VyIGRldmljZSAqLwotCWRvd24oJmNhcmQtPnNlbSk7Ci0KLQlpZiAoIWNhcmQtPm9wZW4pIHsKLQkJZGJnKCIlcyAtIGRldmljZSBub3Qgb3BlbmVkIiwgX19mdW5jX18pOwotCQlyZXR2YWwgPSBDUENfRVJSX05PX0lOVEVSRkFDRV9QUkVTRU5UOwotCQlnb3RvIGV4aXRfbm90X29wZW5lZDsKLQl9Ci0KLQkvKiBpZiBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCBraWxsIGFsbCB1cmJzICovCi0JaWYgKGNhcmQtPnByZXNlbnQpIHsKLQkJLyoga2lsbCByZWFkIHVyYnMgKi8KLQkJZm9yIChqID0gMDsgaiA8IENQQ19VU0JfVVJCX0NOVDsgaisrKSB7Ci0JCQl1c2Jfa2lsbF91cmIoY2FyZC0+dXJic1tqXS51cmIpOwotCQl9Ci0KLQkJLyoga2lsbCBpcnEgdXJiICovCi0JCXVzYl9raWxsX3VyYihjYXJkLT5pbnRyX2luX3VyYik7Ci0KLQkJLyoga2lsbCB3cml0ZSB1cmJzICovCi0JCWZvciAoaiA9IDA7IGogPCBDUENfVVNCX1VSQl9DTlQ7IGorKykgewotCQkJaWYgKGF0b21pY19yZWFkKCZjYXJkLT53clVyYnNbal0uYnVzeSkpIHsKLQkJCQl1c2Jfa2lsbF91cmIoY2FyZC0+d3JVcmJzW2pdLnVyYik7Ci0JCQkJd2FpdF9mb3JfY29tcGxldGlvbigmY2FyZC0+d3JVcmJzW2pdLmZpbmlzaGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCWF0b21pY19kZWMoJnVzZUNvdW50KTsKLQotCS8qIGxhc3QgcHJvY2VzcyBkZXRhY2hlZCAqLwotCWlmIChhdG9taWNfcmVhZCgmdXNlQ291bnQpID09IDApIHsKLQkJd2FrZV91cCgmcm1tb2RXcSk7Ci0JfQotCi0JaWYgKCFjYXJkLT5wcmVzZW50ICYmIGNhcmQtPm9wZW4pIHsKLQkJLyogdGhlIGRldmljZSB3YXMgdW5wbHVnZ2VkIGJlZm9yZSB0aGUgZmlsZSB3YXMgcmVsZWFzZWQgKi8KLQkJdXAoJmNhcmQtPnNlbSk7Ci0JCWNwY3VzYl9kZWxldGUoY2FyZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWNhcmQtPm9wZW4gPSAwOwotCi1leGl0X25vdF9vcGVuZWQ6Ci0JdXAoJmNhcmQtPnNlbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgY3BjdXNiX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAotCQkJICAgbG9mZl90ICpwcG9zKQotewotCUNQQ19VU0JfVCAqY2FyZCA9IChDUENfVVNCX1QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCUNQQ19DSEFOX1QgKmNoYW47Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoY291bnQgPCBzaXplb2YoQ1BDX01TR19UKSkKLQkJcmV0dXJuIENQQ19FUlJfVU5LTk9XTjsKLQotCS8qIGNoZWNrIGlmIGNhbiByZWFkIGZyb20gdGhlIGdpdmVuIGFkZHJlc3MgKi8KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gQ1BDX0VSUl9VTktOT1dOOwotCi0JLyogbG9jayB0aGlzIG9iamVjdCAqLwotCWRvd24oJmNhcmQtPnNlbSk7Ci0KLQkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KLQlpZiAoIWNhcmQtPnByZXNlbnQpIHsKLQkJdXAoJmNhcmQtPnNlbSk7Ci0JCXJldHVybiBDUENfRVJSX05PX0lOVEVSRkFDRV9QUkVTRU5UOwotCX0KLQotCWlmIChJc0J1ZmZlckVtcHR5KGNhcmQtPmNoYW4pKSB7Ci0JCXJldHZhbCA9IDA7Ci0JfSBlbHNlIHsKLQkJY2hhbiA9IGNhcmQtPmNoYW47Ci0KLSNpZiAwCi0JCS8qIGNvbnZlcnQgTFBDMjExOSBwYXJhbXMgYmFjayB0byBTSkExMDAwIHBhcmFtcyAqLwotCQlpZiAoY2FyZC0+ZGV2aWNlUmV2aXNpb24gPj0gMHgwMjAwCi0JCSAgICAmJiBjaGFuLT5idWZbY2hhbi0+b2lkeF0udHlwZSA9PSBDUENfTVNHX1RfQ0FOX1BSTVMpIHsKLQkJCUxQQzIxMTlfVE9fU0pBMTAwMF9QYXJhbXMoJmNoYW4tPmJ1ZltjaGFuLT5vaWR4XSk7Ci0JCX0KLSNlbmRpZgotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCAmY2hhbi0+YnVmW2NoYW4tPm9pZHhdLCBjb3VudCkgIT0gMCkgewotCQkJcmV0dmFsID0gQ1BDX0VSUl9JT19UUkFOU0ZFUjsKLQkJfSBlbHNlIHsKLQkJCWNoYW4tPm9pZHggPSAoY2hhbi0+b2lkeCArIDEpICUgQ1BDX01TR19CVUZfQ05UOwotCQkJY2hhbi0+V25SID0gMTsKLQkJCXJldHZhbCA9IHNpemVvZihDUENfTVNHX1QpOwotCQl9Ci0JfQotLyoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+c2xvY2ssIGZsYWdzKTsgKi8KLQotCS8qIHVubG9jayB0aGUgZGV2aWNlICovCi0JdXAoJmNhcmQtPnNlbSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0jZGVmaW5lIFNISUZUICAxCi1zdGF0aWMgaW5saW5lIHZvaWQgY3BjdXNiX2FsaWduX2J1ZmZlcl9hbGlnbm1lbnQodW5zaWduZWQgY2hhciAqYnVmKQotewotCS8qIENQQy1VU0IgdXBsb2FkcyBwYWNrZWQgYnl0ZXMuICovCi0JQ1BDX01TR19UICpjcGMgPSAoQ1BDX01TR19UICopIGJ1ZjsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjcGMtPmxlbmd0aCArICgyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsgaSsrKSB7Ci0JCSgodW5zaWduZWQgY2hhciAqKSAmY3BjLT5tc2dpZClbMSArIGldID0KLQkJICAgICgodW5zaWduZWQgY2hhciAqKSAmY3BjLT5tc2dpZClbMSArIFNISUZUICsgaV07Ci0JfQotfQotCi1zdGF0aWMgaW50IGNwY19nZXRfYnVmZmVyX2NvdW50KENQQ19DSEFOX1QgKmNoYW4pCi17Ci0JLyogY2hlY2sgdGhlIGJ1ZmZlciBwYXJhbWV0ZXJzICovCi0JaWYgKGNoYW4tPmlpZHggPT0gY2hhbi0+b2lkeCkKLQkJcmV0dXJuICFjaGFuLT5XblIgPyBDUENfTVNHX0JVRl9DTlQgOiAwOwotCWVsc2UgaWYgKGNoYW4tPmlpZHggPj0gY2hhbi0+b2lkeCkKLQkJcmV0dXJuIChjaGFuLT5paWR4IC0gY2hhbi0+b2lkeCkgJSBDUENfTVNHX0JVRl9DTlQ7Ci0KLQlyZXR1cm4gKGNoYW4tPmlpZHggKyBDUENfTVNHX0JVRl9DTlQgLSBjaGFuLT5vaWR4KSAlIENQQ19NU0dfQlVGX0NOVDsKLX0KLQotc3RhdGljIHNzaXplX3QgY3BjdXNiX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCi0JCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JQ1BDX1VTQl9UICpjYXJkID0gKENQQ19VU0JfVCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JQ1BDX1VTQl9XUklURV9VUkJfVCAqd3JVcmIgPSBOVUxMOwotCi0Jc3NpemVfdCBieXRlc193cml0dGVuID0gMDsKLQlpbnQgcmV0dmFsID0gMDsKLQlpbnQgajsKLQotCXVuc2lnbmVkIGNoYXIgKm9idWYgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgdHlwZSA9IDA7Ci0JQ1BDX01TR19UICppbmZvID0gTlVMTDsKLQotCWRiZygiJXMgLSBlbnRlcmVkIG1pbm9yICVkLCBjb3VudCA9ICV6dSwgcHJlc2VudCA9ICVkIiwKLQkgICAgX19mdW5jX18sIGNhcmQtPm1pbm9yLCBjb3VudCwgY2FyZC0+cHJlc2VudCk7Ci0KLQlpZiAoY291bnQgPiBzaXplb2YoQ1BDX01TR19UKSkKLQkJcmV0dXJuIENQQ19FUlJfVU5LTk9XTjsKLQotCS8qIGNoZWNrIGlmIGNhbiByZWFkIGZyb20gdGhlIGdpdmVuIGFkZHJlc3MgKi8KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiBDUENfRVJSX1VOS05PV047Ci0KLQkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCi0JZG93bigmY2FyZC0+c2VtKTsKLQotCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLwotCWlmICghY2FyZC0+cHJlc2VudCkgewotCQlyZXR2YWwgPSBDUENfRVJSX05PX0lOVEVSRkFDRV9QUkVTRU5UOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gd3JpdGUgKi8KLQlpZiAoY291bnQgPT0gMCkgewotCQlkYmcoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19mdW5jX18pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGNhcmQtPmZyZWVfc2xvdHMgPD0gNSkgewotCQlpbmZvID0gKENQQ19NU0dfVCAqKSBidWZmZXI7Ci0KLQkJaWYgKGluZm8tPnR5cGUgIT0gQ1BDX0NNRF9UX0NMRUFSX0NNRF9RVUVVRQotCQkgICAgfHwgY2FyZC0+ZnJlZV9zbG90cyA8PSAwKSB7Ci0JCQlkYmcoIiVzIC0gc2VuZCBidWZmZXIgZnVsbCBwbGVhc2UgdHJ5IGFnYWluICVkIiwKLQkJCSAgICBfX2Z1bmNfXywgY2FyZC0+ZnJlZV9zbG90cyk7Ci0JCQlyZXR2YWwgPSBDUENfRVJSX0NBTl9OT19UUkFOU01JVF9CVUY7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQkvKiBGaW5kIGEgZnJlZSB3cml0ZSB1cmIgKi8KLQlmb3IgKGogPSAwOyBqIDwgQ1BDX1VTQl9VUkJfQ05UOyBqKyspIHsKLQkJaWYgKCFhdG9taWNfcmVhZCgmY2FyZC0+d3JVcmJzW2pdLmJ1c3kpKSB7Ci0JCQl3clVyYiA9ICZjYXJkLT53clVyYnNbal07CS8qIHJlbWVtYmVyIGZvdW5kIFVSQiAqLwotCQkJYXRvbWljX3NldCgmd3JVcmItPmJ1c3ksIDEpOwkvKiBsb2NrIHRoaXMgVVJCICAgICAgKi8KLQkJCWluaXRfY29tcGxldGlvbigmd3JVcmItPmZpbmlzaGVkKTsJLyogaW5pdCBjb21wbGV0aW9uICAgICovCi0JCQlkYmcoIldSIFVSQiBuby4gJWQgc3RhcnRlZCIsIGopOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBkb24ndCBmb3VuZCB3cml0ZSB1cmIgc2F5IGVycm9yICovCi0JaWYgKCF3clVyYikgewotCQlkYmcoIiVzIC0gbm8gZnJlZSBzZW5kIHVyYiBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7Ci0JCXJldHZhbCA9IENQQ19FUlJfQ0FOX05PX1RSQU5TTUlUX0JVRjsKLQkJZ290byBleGl0OwotCX0KLQlkYmcoIlVSQiB3cml0ZSByZXEiKTsKLQotCW9idWYgPSAodW5zaWduZWQgY2hhciAqKSB3clVyYi0+dXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0KLQkvKiBjb3B5IHRoZSBkYXRhIGZyb20gdXNlcnNwYWNlIGludG8gb3VyIHRyYW5zZmVyIGJ1ZmZlcjsKLQkgKiB0aGlzIGlzIHRoZSBvbmx5IGNvcHkgcmVxdWlyZWQuCi0JICovCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZvYnVmWzRdLCBidWZmZXIsIGNvdW50KSAhPSAwKSB7Ci0JCWF0b21pY19zZXQoJndyVXJiLT5idXN5LCAwKTsJLyogcmVsZWFzZSB1cmIgKi8KLQkJcmV0dmFsID0gQ1BDX0VSUl9JT19UUkFOU0ZFUjsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIGNoZWNrIGlmIGl0IGlzIGEgRFJJVkVSIGluZm9ybWF0aW9uIG1lc3NhZ2UsIHNvIHdlIGNhbgotCSAqIHJlc3BvbnNlIHRvIHRoYXQgbWVzc2FnZSBhbmQgbm90IHRoZSBVU0IKLQkgKi8KLQlpbmZvID0gKENQQ19NU0dfVCAqKSAmb2J1Zls0XTsKLQotCWJ5dGVzX3dyaXR0ZW4gPSAxMSArIGluZm8tPmxlbmd0aDsKLQlpZiAoYnl0ZXNfd3JpdHRlbiA+PSB3clVyYi0+c2l6ZSkgewotCQlyZXR2YWwgPSBDUENfRVJSX0lPX1RSQU5TRkVSOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0Jc3dpdGNoIChpbmZvLT50eXBlKSB7Ci0JY2FzZSBDUENfQ01EX1RfQ0xFQVJfTVNHX1FVRVVFOgotCQlSZXNldEJ1ZmZlcihjYXJkLT5jaGFuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENQQ19DTURfVF9JTlFfTVNHX1FVRVVFX0NOVDoKLQkJcmV0dmFsID0gY3BjX2dldF9idWZmZXJfY291bnQoY2FyZC0+Y2hhbik7Ci0JCWF0b21pY19zZXQoJndyVXJiLT5idXN5LCAwKTsKLQotCQlnb3RvIGV4aXQ7Ci0KLQljYXNlIENQQ19DTURfVF9JTlFfSU5GTzoKLQkJaWYgKGluZm8tPm1zZy5pbmZvLnNvdXJjZSA9PSBDUENfSU5GT01TR19UX0RSSVZFUikgewotCQkJLyogcmVsZWFzZSB1cmIgY2F1c2Ugd2UnbGwgdXNlIGl0IGZvciBkcml2ZXIKLQkJCSAqIGluZm9ybWF0aW9uCi0JCQkgKi8KLQkJCWF0b21pY19zZXQoJndyVXJiLT5idXN5LCAwKTsKLQkJCWlmIChJc0J1ZmZlckZ1bGwoY2FyZC0+Y2hhbikpIHsKLQkJCQlyZXR2YWwgPSBDUENfRVJSX0lPX1RSQU5TRkVSOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQotCQkJLyogaXQgaXMgYSBkcml2ZXIgaW5mb3JtYXRpb24gcmVxdWVzdCBtZXNzYWdlIGFuZCB3ZSBoYXZlCi0JCQkgKiBmcmVlIHJ4IHNsb3RzIHRvIHN0b3JlIHRoZSByZXNwb25zZQotCQkJICovCi0JCQl0eXBlID0gaW5mby0+bXNnLmluZm8udHlwZTsKLQkJCWluZm8gPSAmY2FyZC0+Y2hhbi0+YnVmW2NhcmQtPmNoYW4tPmlpZHhdOwotCi0JCQlpbmZvLT50eXBlID0gQ1BDX01TR19UX0lORk87Ci0JCQlpbmZvLT5tc2cuaW5mby5zb3VyY2UgPSBDUENfSU5GT01TR19UX0RSSVZFUjsKLQkJCWluZm8tPm1zZy5pbmZvLnR5cGUgPSB0eXBlOwotCi0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgQ1BDX0lORk9NU0dfVF9WRVJTSU9OOgotCQkJCWluZm8tPmxlbmd0aCA9IHN0cmxlbihDUENfRFJJVkVSX1ZFUlNJT04pICsgMjsKLQkJCQlzcHJpbnRmKGluZm8tPm1zZy5pbmZvLm1zZywgIiVzXG4iLAotCQkJCQlDUENfRFJJVkVSX1ZFUlNJT04pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIENQQ19JTkZPTVNHX1RfU0VSSUFMOgotCQkJCWluZm8tPmxlbmd0aCA9IHN0cmxlbihDUENfRFJJVkVSX1NFUklBTCkgKyAyOwotCQkJCXNwcmludGYoaW5mby0+bXNnLmluZm8ubXNnLCAiJXNcbiIsCi0JCQkJCUNQQ19EUklWRVJfU0VSSUFMKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlpbmZvLT5sZW5ndGggPSAyOwotCQkJCWluZm8tPm1zZy5pbmZvLnR5cGUgPQotCQkJCSAgICBDUENfSU5GT01TR19UX1VOS05PV05fVFlQRTsKLQkJCX0KLQotCQkJY2FyZC0+Y2hhbi0+V25SID0gMDsKLQkJCWNhcmQtPmNoYW4tPmlpZHggPQotCQkJICAgIChjYXJkLT5jaGFuLT5paWR4ICsgMSkgJSBDUENfTVNHX0JVRl9DTlQ7Ci0KLQkJCXJldHZhbCA9IGluZm8tPmxlbmd0aDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlicmVhazsKLQljYXNlIENQQ19DTURfVF9DQU5fUFJNUzoKLQkJLyogQ2hlY2sgdGhlIGNvbnRyb2xsZXIgdHlwZS4gSWYgaXQncyB0aGUgbmV3IENQQy1VU0IsIG1ha2Ugc3VyZSBpZiB0aGVzZSBhcmUgU0pBMTAwMCBwYXJhbXMgKi8KLQkJaWYgKGluZm8tPm1zZy5jYW5wYXJhbXMuY2NfdHlwZSAhPSBTSkExMDAwCi0JCSAgICAmJiBpbmZvLT5tc2cuY2FucGFyYW1zLmNjX3R5cGUgIT0gTTE2Q19CQVNJQwotCQkgICAgJiYgKGNhcmQtPnByb2R1Y3RJZCA9PSBVU0JfQ1BDVVNCX0xQQzIxMTlfUFJPRFVDVF9JRAotCQkJJiYgaW5mby0+bXNnLmNhbnBhcmFtcy5jY190eXBlICE9IFNKQTEwMDApKSB7Ci0JCQkvKiBkb24ndCBmb3JnZXQgdG8gcmVsZWFzZSB0aGUgdXJiICovCi0JCQlhdG9taWNfc2V0KCZ3clVyYi0+YnVzeSwgMCk7Ci0JCQlyZXR2YWwgPSBDUENfRVJSX1dST05HX0NPTlRST0xMRVJfVFlQRTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQkvKiBqdXN0IGNvbnZlcnQgdGhlIHBhcmFtcyBpZiBpdCBpcyBhbiBvbGQgQ1BDLVVTQiB3aXRoIE0xNkMgY29udHJvbGxlciAqLwotCWlmIChjYXJkLT5wcm9kdWN0SWQgPT0gVVNCX0NQQ1VTQl9NMTZDX1BST0RVQ1RfSUQpIHsKLQkJLyogaWYgaXQgaXMgYSBwYXJhbWV0ZXIgbWVzc2FnZSBjb252ZXJ0IGl0IGZyb20gU0pBMTAwMCBjb250cm9sbGVyCi0JCSAqIHNldHRpbmdzIHRvIE0xNkMgQmFzaWMgY29udHJvbGxlciBzZXR0aW5ncwotCQkgKi8KLQkJU0pBMTAwMF9UT19NMTZDX0JBU0lDX1BhcmFtcygoQ1BDX01TR19UICopICZvYnVmWzRdKTsKLQl9Ci0KLQkvKiBkb24ndCBmb3JnZXQgdGhlIGJ5dGUgYWxpZ25tZW50ICovCi0JY3BjdXNiX2FsaWduX2J1ZmZlcl9hbGlnbm1lbnQoJm9idWZbNF0pOwotCi0JLyogc2V0dXAgYSB0aGUgNCBieXRlIGhlYWRlciAqLwotCW9idWZbMF0gPSBvYnVmWzFdID0gb2J1ZlsyXSA9IG9idWZbM10gPSAwOwotCi0JLyogdGhpcyB1cmIgd2FzIGFscmVhZHkgc2V0IHVwLCBleGNlcHQgZm9yIHRoaXMgd3JpdGUgc2l6ZSAqLwotCXdyVXJiLT51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBieXRlc193cml0dGVuICsgNDsKLQotCS8qIHNlbmQgdGhlIGRhdGEgb3V0IHRoZSBidWxrIHBvcnQgKi8KLQkvKiBhIGNoYXJhY3RlciBkZXZpY2Ugd3JpdGUgdXNlcyBHRlBfS0VSTkVMLAotCSAgIHVubGVzcyBhIHNwaW5sb2NrIGlzIGhlbGQgKi8KLQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih3clVyYi0+dXJiLCBHRlBfS0VSTkVMKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWF0b21pY19zZXQoJndyVXJiLT5idXN5LCAwKTsJLyogcmVsZWFzZSB1cmIgKi8KLQkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWQiLAotCQkgICAgX19mdW5jX18sIHJldHZhbCk7Ci0JfSBlbHNlIHsKLQkJcmV0dmFsID0gYnl0ZXNfd3JpdHRlbjsKLQl9Ci0KLWV4aXQ6Ci0JLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KLQl1cCgmY2FyZC0+c2VtKTsKLQotCWRiZygiJXMgLSBsZWF2ZWQiLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogY2FsbGJhY2sgZm9yIGludGVycnVwdCBJTiB1cmIKLSAqLwotc3RhdGljIHZvaWQgY3BjdXNiX3JlYWRfaW50ZXJydXB0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlDUENfVVNCX1QgKmNhcmQgPSAoQ1BDX1VTQl9UICopIHVyYi0+Y29udGV4dDsKLQlpbnQgcmV0dmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+c2xvY2ssIGZsYWdzKTsKLQotCWlmICghY2FyZC0+cHJlc2VudCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5zbG9jaywgZmxhZ3MpOwotCQlpbmZvKCIlcyAtIG5vIHN1Y2ggZGV2aWNlIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoICh1cmItPnN0YXR1cykgewotCWNhc2UgMDogLyogc3VjY2VzcyAqLwotCQljYXJkLT5mcmVlX3Nsb3RzID0gY2FyZC0+aW50cl9pbl9idWZmZXJbMV07Ci0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdXJiIHdhcyBraWxsZWQgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+c2xvY2ssIGZsYWdzKTsKLQkJZGJnKCIlcyAtIGludHIgdXJiIGtpbGxlZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCWluZm8oIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIGludHIgdXJiLCBlcnJvciAlZCIsCi0JCSAgICBfX2Z1bmNfXywgcmV0dmFsKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5zbG9jaywgZmxhZ3MpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZShjYXJkLT5jaGFuLT5DUENXYWl0X3EpOwotCi0JcmV0dXJuOwotfQotCi0jZGVmaW5lIFVOX1NISUZUICAxCi0jZGVmaW5lIENQQ01TR19IRUFERVJfTEVOX0ZJUk1XQVJFICAgMTEKLXN0YXRpYyBpbmxpbmUgaW50IGNwY3VzYl91bmFsaWduX2FuZF9jb3B5X2J1ZmZ5KHVuc2lnbmVkIGNoYXIgKm91dCwKLQkJCQkJCXVuc2lnbmVkIGNoYXIgKmluKQotewotCXVuc2lnbmVkIGludCBpLCBqOwotCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJb3V0W2ldID0gaW5baV07Ci0KLQlmb3IgKGogPSAwOyBqIDwgKGluWzFdICsgKENQQ01TR19IRUFERVJfTEVOX0ZJUk1XQVJFIC0gMykpOyBqKyspCi0JCW91dFtqICsgaSArIFVOX1NISUZUXSA9IGluW2ogKyBpXTsKLQotCXJldHVybiBpICsgajsKLX0KLQotLyoKLSAqIGNhbGxiYWNrIGZvciBidWxrIElOIHVyYgotICovCi1zdGF0aWMgdm9pZCBjcGN1c2JfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlDUENfVVNCX1QgKmNhcmQgPSAoQ1BDX1VTQl9UICopIHVyYi0+Y29udGV4dDsKLQlDUENfQ0hBTl9UICpjaGFuOwotCXVuc2lnbmVkIGNoYXIgKmlidWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlpbnQgcmV0dmFsLCBtc2dDbnQsIHN0YXJ0LCBhZ2FpbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghY2FyZCkgewotCQllcnIoIiVzIC0gZGV2aWNlIG9iamVjdCBsb3N0IiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnNsb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWNhcmQtPnByZXNlbnQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+c2xvY2ssIGZsYWdzKTsKLQkJaW5mbygiJXMgLSBubyBzdWNoIGRldmljZSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6CQkvKiBzdWNjZXNzICovCi0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdXJiIHdhcyBraWxsZWQgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+c2xvY2ssIGZsYWdzKTsKLQkJZGJnKCIlcyAtIHJlYWQgdXJiIGtpbGxlZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCWluZm8oIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQltc2dDbnQgPSBpYnVmWzBdICYgfjB4ODA7Ci0JCWFnYWluID0gaWJ1ZlswXSAmIDB4ODA7Ci0KLQkJLyogd2UgaGF2ZSBhIDQgYnl0ZSBoZWFkZXIgKi8KLQkJc3RhcnQgPSA0OwotCQljaGFuID0gY2FyZC0+Y2hhbjsKLQkJd2hpbGUgKG1zZ0NudCkgewotCQkJaWYgKCEoSXNCdWZmZXJGdWxsKGNhcmQtPmNoYW4pKSkgewotCQkJCXN0YXJ0ICs9Ci0JCQkJICAgIGNwY3VzYl91bmFsaWduX2FuZF9jb3B5X2J1ZmZ5KCh1bnNpZ25lZCBjaGFyICopCi0JCQkJCQkJICAmY2hhbi0+YnVmW2NoYW4tPmlpZHhdLCAmaWJ1ZltzdGFydF0pOwotCi0JCQkJaWYgKHN0YXJ0ID4gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKSB7Ci0JCQkJCWVycigiJWQgPiAlZCIsIHN0YXJ0LCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljaGFuLT5XblIgPSAwOwotCQkJCWNoYW4tPmlpZHggPSAoY2hhbi0+aWlkeCArIDEpICUgQ1BDX01TR19CVUZfQ05UOwotCQkJCW1zZ0NudC0tOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgY2FyZC0+dWRldiwKLQkJCSAgdXNiX3JjdmJ1bGtwaXBlKGNhcmQtPnVkZXYsIGNhcmQtPm51bV9idWxrX2luKSwKLQkJCSAgdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCSAgY3BjdXNiX3JlYWRfYnVsa19jYWxsYmFjaywgY2FyZCk7Ci0KLQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCi0JaWYgKHJldHZhbCkgewotCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgcmV0dmFsKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5zbG9jaywgZmxhZ3MpOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKGNhcmQtPmNoYW4tPkNQQ1dhaXRfcSk7Ci19Ci0KLS8qCi0gKiBjYWxsYmFjayBmb3IgYnVsayBJTiB1cmIKLSAqLwotc3RhdGljIHZvaWQgY3BjdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQotewotCUNQQ19VU0JfVCAqY2FyZCA9IChDUENfVVNCX1QgKikgdXJiLT5jb250ZXh0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGo7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+c2xvY2ssIGZsYWdzKTsKLQotCS8qIGZpbmQgdGhpcyB1cmIgKi8KLQlmb3IgKGogPSAwOyBqIDwgQ1BDX1VTQl9VUkJfQ05UOyBqKyspIHsKLQkJaWYgKGNhcmQtPndyVXJic1tqXS51cmIgPT0gdXJiKSB7Ci0JCQlkYmcoIlVSQiBmb3VuZCBuby4gJWQiLCBqKTsKLQkJCS8qIG5vdGlmeSBhbnlvbmUgd2FpdGluZyB0aGF0IHRoZSB3cml0ZSBoYXMgZmluaXNoZWQgKi8KLQkJCWNvbXBsZXRlKCZjYXJkLT53clVyYnNbal0uZmluaXNoZWQpOwotCQkJYXRvbWljX3NldCgmY2FyZC0+d3JVcmJzW2pdLmJ1c3ksIDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JY2FzZSAwOgkJLyogc3VjY2VzcyAqLwotCQlicmVhazsKLQljYXNlIC1FQ09OTlJFU0VUOgotCWNhc2UgLUVOT0VOVDoKLQljYXNlIC1FU0hVVERPV046Ci0JCS8qIHVyYiB3YXMga2lsbGVkICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnNsb2NrLCBmbGFncyk7Ci0JCWRiZygiJXMgLSB3cml0ZSB1cmIgbm8uICVkIGtpbGxlZCIsIF9fZnVuY19fLCBqKTsKLQkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCWluZm8oIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKLQkJYnJlYWs7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+c2xvY2ssIGZsYWdzKTsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZShjYXJkLT5jaGFuLT5DUENXYWl0X3EpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjcGN1c2JfZ2V0X2ZyZWVfc2xvdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IENQQ19VU0JfQ0FSRF9DTlQ7IGkrKykgewotCQlpZiAoIUNQQ1VTQl9UYWJsZVtpXSkKLQkJCXJldHVybiBpOwotCX0KLQotCXJldHVybiAtMTsKLX0KLQotLyoKLSAqIHByb2JlIGZ1bmN0aW9uIGZvciBuZXcgQ1BDLVVTQiBkZXZpY2VzCi0gKi8KLXN0YXRpYyBpbnQgY3BjdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCi0JCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi17Ci0JQ1BDX1VTQl9UICpjYXJkID0gTlVMTDsKLQlDUENfQ0hBTl9UICpjaGFuID0gTlVMTDsKLQotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKLQotCWludCBpLCBqLCByZXR2YWwgPSAtRU5PTUVNLCBzbG90OwotCi0Jc2xvdCA9IGNwY3VzYl9nZXRfZnJlZV9zbG90KCk7Ci0JaWYgKHNsb3QgPCAwKSB7Ci0JCWluZm8oIk5vIG1vcmUgZGV2aWNlcyBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCi0JY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKENQQ19VU0JfVCksIEdGUF9LRVJORUwpOwotCWlmICghY2FyZCkgewotCQllcnIoIk91dCBvZiBtZW1vcnkiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCUNQQ1VTQl9UYWJsZVtzbG90XSA9IGNhcmQ7Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCBzdHJ1Y3QgKi8KLQljYXJkLT5jaGFuID0ga21hbGxvYyhzaXplb2YoQ1BDX0NIQU5fVCksIEdGUF9LRVJORUwpOwotCWlmICghY2FyZC0+Y2hhbikgewotCQlrZnJlZShjYXJkKTsKLQkJZXJyKCJPdXQgb2YgbWVtb3J5Iik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNoYW4gPSBjYXJkLT5jaGFuOwotCW1lbXNldChjaGFuLCAwLCBzaXplb2YoQ1BDX0NIQU5fVCkpOwotCVJlc2V0QnVmZmVyKGNoYW4pOwotCi0JaW5pdF9NVVRFWCgmY2FyZC0+c2VtKTsKLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+c2xvY2spOwotCi0JY2FyZC0+dWRldiA9IHVkZXY7Ci0JY2FyZC0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOwotCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIpIHsKLQkJdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIGNhcmQtPnNlcmlhbE51bWJlciwKLQkJCQkgICAxMjgpOwotCQlpbmZvKCJTZXJpYWwgJXMiLCBjYXJkLT5zZXJpYWxOdW1iZXIpOwotCX0KLQotCWNhcmQtPnByb2R1Y3RJZCA9IHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0OwotCWluZm8oIlByb2R1Y3QgJXMiLAotCSAgICAgY2FyZC0+cHJvZHVjdElkID09IFVTQl9DUENVU0JfTFBDMjExOV9QUk9EVUNUX0lEID8KLQkJCSAiQ1BDLVVTQi9BUk03IiA6ICJDUEMtVVNCL00xNkMiKTsKLQotCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KLQkvKiBjaGVjayBvdXQgdGhlIGVuZHBvaW50cyAqLwotCS8qIHVzZSBvbmx5IHRoZSBmaXJzdCBidWxrLWluIGFuZCBidWxrLW91dCBlbmRwb2ludHMgKi8KLQlpZmFjZV9kZXNjID0gJmludGVyZmFjZS0+YWx0c2V0dGluZ1swXTsKLQlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKLQkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKLQotCQlpZiAoIWNhcmQtPm51bV9pbnRyX2luICYmCi0JCSAgICAoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCi0JCSAgICAgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkgewotCQkJY2FyZC0+aW50cl9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQkJY2FyZC0+bnVtX2ludHJfaW4gPSAxOwotCi0JCQlpZiAoIWNhcmQtPmludHJfaW5fdXJiKSB7Ci0JCQkJZXJyKCJObyBmcmVlIHVyYnMgYXZhaWxhYmxlIik7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQotCQkJZGJnKCJpbnRyX2luIHVyYiAlZCIsIGNhcmQtPm51bV9pbnRyX2luKTsKLQkJfQotCi0JCWlmICghY2FyZC0+bnVtX2J1bGtfaW4gJiYKLQkJICAgIChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pICYmCi0JCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKLQkJICAgICA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSkgewotCQkJY2FyZC0+bnVtX2J1bGtfaW4gPSAyOwotCQkJZm9yIChqID0gMDsgaiA8IENQQ19VU0JfVVJCX0NOVDsgaisrKSB7Ci0JCQkJY2FyZC0+dXJic1tqXS5zaXplID0gZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplOwotCQkJCWNhcmQtPnVyYnNbal0udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJCQlpZiAoIWNhcmQtPnVyYnNbal0udXJiKSB7Ci0JCQkJCWVycigiTm8gZnJlZSB1cmJzIGF2YWlsYWJsZSIpOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCQljYXJkLT51cmJzW2pdLmJ1ZmZlciA9Ci0JCQkJICAgIHVzYl9idWZmZXJfYWxsb2ModWRldiwKLQkJCQkJCSAgICAgY2FyZC0+dXJic1tqXS5zaXplLAotCQkJCQkJICAgICBHRlBfS0VSTkVMLAotCQkJCQkJICAgICAmY2FyZC0+dXJic1tqXS51cmItPnRyYW5zZmVyX2RtYSk7Ci0JCQkJaWYgKCFjYXJkLT51cmJzW2pdLmJ1ZmZlcikgewotCQkJCQllcnIoIkNvdWxkbid0IGFsbG9jYXRlIGJ1bGtfaW5fYnVmZmVyIik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJfQotCQkJaW5mbygiJXMgLSAlZCByZWFkaW5nIFVSQidzIGFsbG9jYXRlZCIsCi0JCQkgICAgIF9fZnVuY19fLCBDUENfVVNCX1VSQl9DTlQpOwotCQl9Ci0KLQkJaWYgKCFjYXJkLT5udW1fYnVsa19vdXQgJiYKLQkJICAgICEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCi0JCSAgICAgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpIHsKLQotCQkJY2FyZC0+bnVtX2J1bGtfb3V0ID0gMjsKLQotCQkJZm9yIChqID0gMDsgaiA8IENQQ19VU0JfVVJCX0NOVDsgaisrKSB7Ci0JCQkJY2FyZC0+d3JVcmJzW2pdLnNpemUgPQotCQkJCSAgICBlbmRwb2ludC0+d01heFBhY2tldFNpemU7Ci0JCQkJY2FyZC0+d3JVcmJzW2pdLnVyYiA9Ci0JCQkJICAgIHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKCFjYXJkLT53clVyYnNbal0udXJiKSB7Ci0JCQkJCWVycigiTm8gZnJlZSB1cmJzIGF2YWlsYWJsZSIpOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCQljYXJkLT53clVyYnNbal0uYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LAotCQkJCQkJCSAgICAgICBjYXJkLT53clVyYnNbal0uc2l6ZSwgR0ZQX0tFUk5FTCwKLQkJCQkJCQkgICAgICAgJmNhcmQtPndyVXJic1tqXS51cmItPnRyYW5zZmVyX2RtYSk7Ci0KLQkJCQlpZiAoIWNhcmQtPndyVXJic1tqXS5idWZmZXIpIHsKLQkJCQkJZXJyKCJDb3VsZG4ndCBhbGxvY2F0ZSBidWxrX291dF9idWZmZXIiKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0KLQkJCQl1c2JfZmlsbF9idWxrX3VyYihjYXJkLT53clVyYnNbal0udXJiLCB1ZGV2LAotCQkJCQkJdXNiX3NuZGJ1bGtwaXBlKHVkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKLQkJCQkJCWNhcmQtPndyVXJic1tqXS5idWZmZXIsCi0JCQkJCQljYXJkLT53clVyYnNbal0uc2l6ZSwKLQkJCQkJCWNwY3VzYl93cml0ZV9idWxrX2NhbGxiYWNrLAotCQkJCQkJY2FyZCk7Ci0JCQl9Ci0KLQkJCWluZm8oIiVzIC0gJWQgd3JpdGluZyBVUkIncyBhbGxvY2F0ZWQiLCBfX2Z1bmNfXywgQ1BDX1VTQl9VUkJfQ05UKTsKLQkJfQotCX0KLQotCWlmICghKGNhcmQtPm51bV9idWxrX2luICYmIGNhcmQtPm51bV9idWxrX291dCkpIHsKLQkJZXJyKCJDb3VsZG4ndCBmaW5kIGJvdGggYnVsay1pbiBhbmQgYnVsay1vdXQgZW5kcG9pbnRzIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogYWxsb3cgZGV2aWNlIHJlYWQsIHdyaXRlIGFuZCBpb2N0bCAqLwotCWNhcmQtPnByZXNlbnQgPSAxOwotCi0JLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBjYXJkKTsKLQlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KGludGVyZmFjZSwgJmNwY3VzYl9jbGFzcyk7Ci0KLQlpZiAocmV0dmFsKSB7Ci0JCS8qIHNvbWV0aGluZyBwcmV2ZW50ZWQgdXMgZnJvbSByZWdpc3RlcmluZyB0aGlzIGRyaXZlciAqLwotCQllcnIoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKLQkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWNhcmQtPmNoYW4tPm1pbm9yID0gY2FyZC0+bWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOwotCi0JY2hhbi0+YnVmID0gdm1hbGxvYyhzaXplb2YoQ1BDX01TR19UKSAqIENQQ19NU0dfQlVGX0NOVCk7Ci0JaWYgKGNoYW4tPmJ1ZiA9PSBOVUxMKSB7Ci0JCWVycigiT3V0IG9mIG1lbW9yeSIpOwotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQlpbmZvKCJBbGxvY2F0ZWQgbWVtb3J5IGZvciAlZCBtZXNzYWdlcyAoJWx1IGtieXRlcykiLAotCSAgICAgQ1BDX01TR19CVUZfQ05ULCAobG9uZyB1bnNpZ25lZCBpbnQpKHNpemVvZihDUENfTVNHX1QpICogQ1BDX01TR19CVUZfQ05UKSAvIDEwMDApOwotCW1lbXNldChjaGFuLT5idWYsIDAsIHNpemVvZihDUENfTVNHX1QpICogQ1BDX01TR19CVUZfQ05UKTsKLQotCVJlc2V0QnVmZmVyKGNoYW4pOwotCi0JY2FyZC0+Y2hhbi0+Q1BDV2FpdF9xID0ga21hbGxvYyhzaXplb2Yod2FpdF9xdWV1ZV9oZWFkX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNhcmQtPmNoYW4tPkNQQ1dhaXRfcSkgewotCQllcnIoIk91dCBvZiBtZW1vcnkiKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaW5pdF93YWl0cXVldWVfaGVhZChjYXJkLT5jaGFuLT5DUENXYWl0X3EpOwotCi0JQ1BDVVNCX1RhYmxlW3Nsb3RdID0gY2FyZDsKLQljYXJkLT5pZHggPSBzbG90OwotCUNQQ1VzYkNudCsrOwotCi0JLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLwotCWluZm8oIkRldmljZSBub3cgYXR0YWNoZWQgdG8gVVNCLSVkIiwgY2FyZC0+bWlub3IpOwotCXJldHVybiAwOwotCi1lcnJvcjoKLQlmb3IgKGogPSAwOyBqIDwgQ1BDX1VTQl9VUkJfQ05UOyBqKyspIHsKLQkJaWYgKGNhcmQtPnVyYnNbal0uYnVmZmVyKSB7Ci0JCQl1c2JfYnVmZmVyX2ZyZWUoY2FyZC0+dWRldiwgY2FyZC0+dXJic1tqXS5zaXplLAotCQkJCQljYXJkLT51cmJzW2pdLmJ1ZmZlciwKLQkJCQkJY2FyZC0+dXJic1tqXS51cmItPnRyYW5zZmVyX2RtYSk7Ci0JCQljYXJkLT51cmJzW2pdLmJ1ZmZlciA9IE5VTEw7Ci0JCX0KLQkJaWYgKGNhcmQtPnVyYnNbal0udXJiKSB7Ci0JCQl1c2JfZnJlZV91cmIoY2FyZC0+dXJic1tqXS51cmIpOwotCQkJY2FyZC0+dXJic1tqXS51cmIgPSBOVUxMOwotCQl9Ci0JfQotCi0JY3BjdXNiX2RlbGV0ZShjYXJkKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogY2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0KLSAqLwotc3RhdGljIHZvaWQgY3BjdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKLXsKLQlDUENfVVNCX1QgKmNhcmQgPSBOVUxMOwotCWludCBtaW5vciwgajsKLQotCS8qIHByZXZlbnQgcmFjZXMgd2l0aCBvcGVuKCkgKi8KLQlkb3duKCZkaXNjb25uZWN0X3NlbSk7Ci0KLQljYXJkID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLQotCWRvd24oJmNhcmQtPnNlbSk7Ci0KLQkvKiBwcmV2ZW50IGRldmljZSByZWFkLCB3cml0ZSBhbmQgaW9jdGwgKi8KLQljYXJkLT5wcmVzZW50ID0gMDsKLQotCW1pbm9yID0gY2FyZC0+bWlub3I7Ci0KLQkvKiBmcmVlIGFsbCB1cmJzIGFuZCB0aGVpciBidWZmZXJzICovCi0JZm9yIChqID0gMDsgaiA8IENQQ19VU0JfVVJCX0NOVDsgaisrKSB7Ci0JCS8qIHRlcm1pbmF0ZSBhbiBvbmdvaW5nIHdyaXRlICovCi0JCWlmIChhdG9taWNfcmVhZCgmY2FyZC0+d3JVcmJzW2pdLmJ1c3kpKSB7Ci0JCQl1c2Jfa2lsbF91cmIoY2FyZC0+d3JVcmJzW2pdLnVyYik7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjYXJkLT53clVyYnNbal0uZmluaXNoZWQpOwotCQl9Ci0JCXVzYl9idWZmZXJfZnJlZShjYXJkLT51ZGV2LCBjYXJkLT53clVyYnNbal0uc2l6ZSwKLQkJCQljYXJkLT53clVyYnNbal0uYnVmZmVyLAotCQkJCWNhcmQtPndyVXJic1tqXS51cmItPnRyYW5zZmVyX2RtYSk7Ci0JCXVzYl9mcmVlX3VyYihjYXJkLT53clVyYnNbal0udXJiKTsKLQl9Ci0JaW5mbygiJWQgd3JpdGUgVVJCcyBmcmVlZCIsIENQQ19VU0JfVVJCX0NOVCk7Ci0KLQkvKiBmcmVlIGFsbCB1cmJzIGFuZCB0aGVpciBidWZmZXJzICovCi0JZm9yIChqID0gMDsgaiA8IENQQ19VU0JfVVJCX0NOVDsgaisrKSB7Ci0JCXVzYl9idWZmZXJfZnJlZShjYXJkLT51ZGV2LCBjYXJkLT51cmJzW2pdLnNpemUsCi0JCQkJY2FyZC0+dXJic1tqXS5idWZmZXIsCi0JCQkJY2FyZC0+dXJic1tqXS51cmItPnRyYW5zZmVyX2RtYSk7Ci0JCXVzYl9mcmVlX3VyYihjYXJkLT51cmJzW2pdLnVyYik7Ci0JfQotCWluZm8oIiVkIHJlYWQgVVJCcyBmcmVlZCIsIENQQ19VU0JfVVJCX0NOVCk7Ci0JdXNiX2ZyZWVfdXJiKGNhcmQtPmludHJfaW5fdXJiKTsKLQotCS8qIGdpdmUgYmFjayBvdXIgbWlub3IgKi8KLQl1c2JfZGVyZWdpc3Rlcl9kZXYoaW50ZXJmYWNlLCAmY3BjdXNiX2NsYXNzKTsKLQotCXVwKCZjYXJkLT5zZW0pOwotCi0JLyogaWYgdGhlIGRldmljZSBpcyBvcGVuZWQsIGNwY3VzYl9yZWxlYXNlIHdpbGwgY2xlYW4gdGhpcyB1cCAqLwotCWlmICghY2FyZC0+b3BlbikKLQkJY3BjdXNiX2RlbGV0ZShjYXJkKTsKLQllbHNlCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZShjYXJkLT5jaGFuLT5DUENXYWl0X3EpOwotCi0JdXAoJmRpc2Nvbm5lY3Rfc2VtKTsKLQotCUNQQ1VzYkNudC0tOwotCWluZm8oIlVTQi0lZCBub3cgZGlzY29ubmVjdGVkIiwgbWlub3IpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBDUENVc2JfSW5pdCh2b2lkKQotewotCWludCByZXN1bHQsIGk7Ci0KLQlpbmZvKERSSVZFUl9ERVNDICIgdiIgRFJJVkVSX1ZFUlNJT04pOwotCWluZm8oIkJ1aWxkIG9uICIgX19EQVRFX18gIiBhdCAiIF9fVElNRV9fKTsKLQotCWZvciAoaSA9IDA7IGkgPCBDUENfVVNCX0NBUkRfQ05UOyBpKyspCi0JCUNQQ1VTQl9UYWJsZVtpXSA9IDA7Ci0KLQkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCi0JcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZjcGN1c2JfZHJpdmVyKTsKLQlpZiAocmVzdWx0KSB7Ci0JCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm9jRGlyID0gcHJvY19ta2RpcihDUENfVVNCX1BST0NfRElSLCBOVUxMKTsKLQlpZiAoIXByb2NEaXIpIHsKLQkJZXJyKCJDb3VsZCBub3QgY3JlYXRlIHByb2MgZW50cnkiKTsKLQl9IGVsc2UgewotCQlwcm9jRW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpbmZvIiwgMDQ0NCwgcHJvY0RpciwKLQkJCQkJCSAgIGNwY3VzYl9wcm9jX3JlYWRfaW5mbywKLQkJCQkJCSAgIE5VTEwpOwotCQlpZiAoIXByb2NFbnRyeSkgewotCQkJZXJyKCJDb3VsZCBub3QgY3JlYXRlIHByb2MgZW50cnkgJXMiLCBDUENfVVNCX1BST0NfRElSICIvaW5mbyIpOwotCQkJcmVtb3ZlX3Byb2NfZW50cnkoQ1BDX1VTQl9QUk9DX0RJUiwgTlVMTCk7Ci0JCQlwcm9jRGlyID0gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgQ1BDVXNiX0V4aXQodm9pZCkKLXsKLQl3YWl0X2V2ZW50KHJtbW9kV3EsICFhdG9taWNfcmVhZCgmdXNlQ291bnQpKTsKLQotCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLwotCXVzYl9kZXJlZ2lzdGVyKCZjcGN1c2JfZHJpdmVyKTsKLQotCWlmIChwcm9jRGlyKSB7Ci0JCWlmIChwcm9jRW50cnkpCi0JCQlyZW1vdmVfcHJvY19lbnRyeSgiaW5mbyIsIHByb2NEaXIpOwotCQlyZW1vdmVfcHJvY19lbnRyeShDUENfVVNCX1BST0NfRElSLCBOVUxMKTsKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KENQQ1VzYl9Jbml0KTsKLW1vZHVsZV9leGl0KENQQ1VzYl9FeGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcGMtdXNiL2NwYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvY3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmRhNWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvY3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoKLSAqIENQQyBDQU4gSW50ZXJmYWNlIERlZmluaXRpb25zCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDggRU1TIERyLiBUaG9tYXMgV3VlbnNjaGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpZm5kZWYgQ1BDX0hFQURFUgotI2RlZmluZSBDUENfSEVBREVSCi0KLS8qCi0gKiB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHVuaW9uIG1lbWJlcnMgd2l0aGluIGEgQ1BDX01TRwotICogdGhpcyB2YWx1ZSBjYW4gYmUgZGVmaW5lZCBieSB0aGUgY3VzdG9tZXIsIGJ1dCBoYXMgdG8gYmUKLSAqID49IDY0IGJ5dGVzCi0gKiBob3dldmVyLCBpZiBub3QgZGVmaW5lZCBiZWZvcmUsIHdlIHNldCBhIGxlbmd0aCBvZiA2NCBieXRlCi0gKi8KLSNpZiAhZGVmaW5lZChDUENfTVNHX0xFTikgfHwgKENQQ19NU0dfTEVOIDwgNjQpCi0jdW5kZWYgQ1BDX01TR19MRU4KLSNkZWZpbmUgQ1BDX01TR19MRU4gNjQKLSNlbmRpZgotCi0vKgotICogVHJhbnNtaXNzaW9uIG9mIGV2ZW50cyBmcm9tIENQQyBpbnRlcmZhY2VzIHRvIFBDIGNhbiBiZSBpbmRpdmlkdWFsbHkKLSAqIGNvbnRyb2xsZWQgcGVyIGV2ZW50IHR5cGUuIERlZmF1bHQgc3RhdGUgaXM6IGRvbid0IHRyYW5zbWl0Ci0gKiBDb250cm9sIHZhbHVlcyBhcmUgY29uc3RydWN0ZWQgYnkgYml0LW9yIG9mIFN1YmplY3QgYW5kIEFjdGlvbgotICogYW5kIHBhc3NlZCB0byBDUENfQ29udHJvbCgpCi0gKi8KLQotLyogQ29udHJvbC1WYWx1ZXMgZm9yIENQQ19Db250cm9sKCkgQ29tbWFuZCBTdWJqZWN0IFNlbGVjdGlvbiAqLwotI2RlZmluZSBDT05UUl9DQU5fTWVzc2FnZSAweDA0Ci0jZGVmaW5lIENPTlRSX0J1c2xvYWQJICAweDA4Ci0jZGVmaW5lCUNPTlRSX0NBTl9TdGF0ZQkgIDB4MEMKLSNkZWZpbmUJQ09OVFJfU2VuZEFjawkgIDB4MTAKLSNkZWZpbmUJQ09OVFJfRmlsdGVyCSAgMHgxNAotI2RlZmluZSBDT05UUl9DbWRRdWV1ZSAgICAweDE4CS8qIHJlc2VydmVkLCBkbyBub3QgdXNlICovCi0jZGVmaW5lIENPTlRSX0J1c0Vycm9yICAgIDB4MUMKLQotLyogQ29udHJvbCBDb21tYW5kIEFjdGlvbnMgKi8KLSNkZWZpbmUgQ09OVFJfQ09OVF9PRkYgICAgMAotI2RlZmluZSBDT05UUl9DT05UX09OICAgICAxCi0jZGVmaW5lIENPTlRSX1NJTkdfT04gICAgIDIKLS8qCi0gKiBDT05UUl9TSU5HX09OIGRvZXNuJ3QgY2hhbmdlIENPTlRSX0NPTlRfT04gc3RhdGUsIHNvIGl0IHNob3VsZCBiZQotICogcmVhZCBhczogdHJhbnNtaXQgYXQgbGVhc3Qgb25jZQotICovCi0KLS8qIGRlZmluZXMgZm9yIGNvbmZpcm1lZCByZXF1ZXN0ICovCi0jZGVmaW5lIERPX05PVF9DT05GSVJNIDAKLSNkZWZpbmUgRE9fQ09ORklSTSAgICAgMQotCi0vKiBldmVudCBmbGFncyAqLwotI2RlZmluZSBFVkVOVF9SRUFEIDB4MDEKLSNkZWZpbmUgRVZFTlRfV1JJVEUgMHgwMgotCi0vKgotICogTWVzc2FnZXMgZnJvbSBDUEMgdG8gUEMgY29udGFpbiBhIG1lc3NhZ2Ugb2JqZWN0IHR5cGUgZmllbGQuCi0gKiBUaGUgZm9sbG93aW5nIG1lc3NhZ2UgdHlwZXMgYXJlIHNlbnQgYnkgQ1BDIGFuZCBjYW4gYmUgdXNlZCBpbgotICogaGFuZGxlcnMsIG90aGVycyBzaG91bGQgYmUgaWdub3JlZC4KLSAqLwotI2RlZmluZSBDUENfTVNHX1RfUkVTWU5DICAgICAgICAwIC8qIE5vcm1hbGx5IHRvIGJlIGlnbm9yZWQgKi8KLSNkZWZpbmUgQ1BDX01TR19UX0NBTiAgICAgICAgICAgMSAvKiBDQU4gZGF0YSBmcmFtZSAqLwotI2RlZmluZSBDUENfTVNHX1RfQlVTTE9BRCAgICAgICAyIC8qIEJ1c2xvYWQgbWVzc2FnZSAqLwotI2RlZmluZSBDUENfTVNHX1RfU1RSSU5HICAgICAgICAzIC8qIE5vcm1hbGx5IHRvIGJlIGlnbm9yZWQgKi8KLSNkZWZpbmUgQ1BDX01TR19UX0NPTlRJICAgICAgICAgNCAvKiBOb3JtYWxseSB0byBiZSBpZ25vcmVkICovCi0jZGVmaW5lIENQQ19NU0dfVF9NRU0gICAgICAgICAgIDcgLyogTm9ybWFsbHkgbm90IHRvIGJlIGhhbmRsZWQgKi8KLSNkZWZpbmUJQ1BDX01TR19UX1JUUiAgICAgICAgICAgOCAvKiBDQU4gcmVtb3RlIGZyYW1lICovCi0jZGVmaW5lIENQQ19NU0dfVF9UWEFDSwkgICAgICAgIDkgLyogU2VuZCBhY2tub3dsZWRnZSAqLwotI2RlZmluZSBDUENfTVNHX1RfUE9XRVJVUCAgICAgIDEwIC8qIFBvd2VyLXVwIG1lc3NhZ2UgKi8KLSNkZWZpbmUJQ1BDX01TR19UX0NNRF9OTyAgICAgICAxMSAvKiBOb3JtYWxseSB0byBiZSBpZ25vcmVkICovCi0jZGVmaW5lCUNQQ19NU0dfVF9DQU5fUFJNUyAgICAgMTIgLyogQWN0dWFsIENBTiBwYXJhbWV0ZXJzICovCi0jZGVmaW5lCUNQQ19NU0dfVF9BQk9SVEVEICAgICAgMTMgLyogQ29tbWFuZCBhYm9ydGVkIG1lc3NhZ2UgKi8KLSNkZWZpbmUJQ1BDX01TR19UX0NBTlNUQVRFICAgICAxNCAvKiBDQU4gc3RhdGUgbWVzc2FnZSAqLwotI2RlZmluZSBDUENfTVNHX1RfUkVTRVQgICAgICAgIDE1IC8qIHVzZWQgdG8gcmVzZXQgQ0FOLUNvbnRyb2xsZXIgKi8KLSNkZWZpbmUJQ1BDX01TR19UX1hDQU4gICAgICAgICAxNiAvKiBYQ0FOIGRhdGEgZnJhbWUgKi8KLSNkZWZpbmUgQ1BDX01TR19UX1hSVFIgICAgICAgICAxNyAvKiBYQ0FOIHJlbW90ZSBmcmFtZSAqLwotI2RlZmluZSBDUENfTVNHX1RfSU5GTyAgICAgICAgIDE4IC8qIGluZm9ybWF0aW9uIHN0cmluZ3MgKi8KLSNkZWZpbmUgQ1BDX01TR19UX0NPTlRST0wgICAgICAxOSAvKiB1c2VkIGZvciBjb250cm9sIG9mIGludGVyZmFjZS9kcml2ZXIgYmVoYXZpb3VyICovCi0jZGVmaW5lIENQQ19NU0dfVF9DT05GSVJNICAgICAgMjAgLyogcmVzcG9uc2UgdHlwZSBmb3IgY29uZmlybWVkIHJlcXVlc3RzICovCi0jZGVmaW5lIENQQ19NU0dfVF9PVkVSUlVOICAgICAgMjEgLyogcmVzcG9uc2UgdHlwZSBmb3Igb3ZlcnJ1biBjb25kaXRpb25zICovCi0jZGVmaW5lIENQQ19NU0dfVF9LRUVQQUxJVkUgICAgMjIgLyogcmVzcG9uc2UgdHlwZSBmb3Iga2VlcCBhbGl2ZSBjb25kaXRpb25zICovCi0jZGVmaW5lIENQQ19NU0dfVF9DQU5FUlJPUiAgICAgMjMgLyogcmVzcG9uc2UgdHlwZSBmb3IgYnVzIGVycm9yIGNvbmRpdGlvbnMgKi8KLSNkZWZpbmUgQ1BDX01TR19UX0RJU0NPTk5FQ1RFRCAyNCAvKiByZXNwb25zZSB0eXBlIGZvciBhIGRpc2Nvbm5lY3RlZCBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgQ1BDX01TR19UX0VSUl9DT1VOVEVSICAyNSAvKiBSWC9UWCBlcnJvciBjb3VudGVyIG9mIENBTiBjb250cm9sbGVyICovCi0KLSNkZWZpbmUgQ1BDX01TR19UX0ZJUk1XQVJFICAgIDEwMCAvKiByZXNwb25zZSB0eXBlIGZvciBVU0IgZmlybXdhcmUgZG93bmxvYWQgKi8KLQotLyoKLSAqIE1lc3NhZ2VzIGZyb20gdGhlIFBDIHRvIHRoZSBDUEMgaW50ZXJmYWNlIGNvbnRhaW4gYSBjb21tYW5kIGZpZWxkCi0gKiBNb3N0IG9mIHRoZSBjb21tYW5kIHR5cGVzIGFyZSB3cmFwcGVkIGJ5IHRoZSBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgaGF2ZSB0aGVyZWZvcmUKLSAqIG5vcm1hbGx5IG5vdCB0byBiZSB1c2VkLgotICogSG93ZXZlciwgcHJvZ3JhbW1lcnMgd2hvIHdpc2ggdG8gY2lyY3VtdmVudCB0aGUgbGlicmFyeSBhbmQgdGFsayBkaXJlY3RseQotICogdG8gdGhlIGRyaXZlcnMgKG1haW5seSBMaW51eCBwcm9ncmFtbWVycykgY2FuIHVzZSB0aGUgZm9sbG93aW5nCi0gKiBjb21tYW5kIHR5cGVzOgotICovCi0jZGVmaW5lIENQQ19DTURfVF9DQU4gICAgICAgICAgICAgICAgIDEJLyogQ0FOIGRhdGEgZnJhbWUgKi8KLSNkZWZpbmUgQ1BDX0NNRF9UX0NPTlRST0wgICAgICAgICAgICAgMwkvKiB1c2VkIGZvciBjb250cm9sIG9mIGludGVyZmFjZS9kcml2ZXIgYmVoYXZpb3VyICovCi0jZGVmaW5lCUNQQ19DTURfVF9DQU5fUFJNUyAgICAgICAgICAgIDYJLyogc2V0IENBTiBwYXJhbWV0ZXJzICovCi0jZGVmaW5lCUNQQ19DTURfVF9DTEVBUkJVRiAgICAgICAgICAgIDgJLyogY2xlYXJzIGlucHV0IHF1ZXVlOyB0aGlzIGlzIGRlcHJpY2F0ZWQsIHVzZSBDUENfQ01EX1RfQ0xFQVJfTVNHX1FVRVVFIGluc3RlYWQgKi8KLSNkZWZpbmUJQ1BDX0NNRF9UX0lOUV9DQU5fUEFSTVMgICAgICAxMQkvKiBpbnF1aXJlIGFjdHVhbCBDQU4gcGFyYW1ldGVycyAqLwotI2RlZmluZQlDUENfQ01EX1RfRklMVEVSX1BSTVMgICAgICAgIDEyCS8qIHNldCBmaWx0ZXIgcGFyYW1ldGVyICovCi0jZGVmaW5lCUNQQ19DTURfVF9SVFIgICAgICAgICAgICAgICAgMTMJLyogQ0FOIHJlbW90ZSBmcmFtZSAqLwotI2RlZmluZQlDUENfQ01EX1RfQ0FOU1RBVEUgICAgICAgICAgIDE0CS8qIENBTiBzdGF0ZSBtZXNzYWdlICovCi0jZGVmaW5lCUNQQ19DTURfVF9YQ0FOICAgICAgICAgICAgICAgMTUJLyogWENBTiBkYXRhIGZyYW1lICovCi0jZGVmaW5lIENQQ19DTURfVF9YUlRSICAgICAgICAgICAgICAgMTYJLyogWENBTiByZW1vdGUgZnJhbWUgKi8KLSNkZWZpbmUgQ1BDX0NNRF9UX1JFU0VUICAgICAgICAgICAgICAxNwkvKiB1c2VkIHRvIHJlc2V0IENBTi1Db250cm9sbGVyICovCi0jZGVmaW5lIENQQ19DTURfVF9JTlFfSU5GTyAgICAgICAgICAgMTgJLyogbWlzY2VsbGFub3VzIGluZm9ybWF0aW9uIHN0cmluZ3MgKi8KLSNkZWZpbmUgQ1BDX0NNRF9UX09QRU5fQ0hBTiAgICAgICAgICAxOQkvKiBvcGVuIGEgY2hhbm5lbCAqLwotI2RlZmluZSBDUENfQ01EX1RfQ0xPU0VfQ0hBTiAgICAgICAgIDIwCS8qIGNsb3NlIGEgY2hhbm5lbCAqLwotI2RlZmluZSBDUENfQ01EX1RfQ05UQlVGICAgICAgICAgICAgIDIxCS8qIHRoaXMgaXMgZGVwcmljYXRlZCwgdXNlIENQQ19DTURfVF9JTlFfTVNHX1FVRVVFX0NOVCBpbnN0ZWFkICovCi0jZGVmaW5lIENQQ19DTURfVF9DQU5fRVhJVCAgICAgICAgICAyMDAgLyogZXhpdCB0aGUgQ0FOIChkaXNhYmxlIGludGVycnVwdHM7IHJlc2V0IGJvb3RyYXRlOyByZXNldCBvdXRwdXRfY250cjsgbW9kZSA9IDEpICovCi0KLSNkZWZpbmUgQ1BDX0NNRF9UX0lOUV9NU0dfUVVFVUVfQ05UICBDUENfQ01EX1RfQ05UQlVGICAgLyogaW5xdWlyZXMgdGhlIGNvdW50IG9mIGVsZW1lbnRzIGluIHRoZSBtZXNzYWdlIHF1ZXVlICovCi0jZGVmaW5lIENQQ19DTURfVF9JTlFfRVJSX0NPVU5URVIgICAgMjUJICAgICAgICAgICAgICAgIC8qIHJlcXVlc3QgdGhlIENBTiBjb250cm9sbGVycyBlcnJvciBjb3VudGVyICovCi0jZGVmaW5lCUNQQ19DTURfVF9DTEVBUl9NU0dfUVVFVUUgICAgQ1BDX0NNRF9UX0NMRUFSQlVGIC8qIGNsZWFyIENQQ19NU0cgcXVldWUgKi8KLSNkZWZpbmUJQ1BDX0NNRF9UX0NMRUFSX0NNRF9RVUVVRSAgICAyOAkgICAgICAgICAgICAgICAgLyogY2xlYXIgQ1BDX0NNRCBxdWV1ZSAqLwotI2RlZmluZSBDUENfQ01EX1RfRklSTVdBUkUgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgbXVzdCBub3QgYmUgdXNlZCAqLwotI2RlZmluZSBDUENfQ01EX1RfVVNCX1JFU0VUICAgICAgICAgMTAxICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgbXVzdCBub3QgYmUgdXNlZCAqLwotI2RlZmluZSBDUENfQ01EX1RfV0FJVF9OT1RJRlkgICAgICAgMTAyICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgbXVzdCBub3QgYmUgdXNlZCAqLwotI2RlZmluZSBDUENfQ01EX1RfV0FJVF9TRVRVUCAgICAgICAgMTAzICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgbXVzdCBub3QgYmUgdXNlZCAqLwotI2RlZmluZQlDUENfQ01EX1RfQUJPUlQgICAgICAgICAgICAgMjU1ICAgICAgICAgICAgICAgICAvKiBOb3JtYWxseSBub3QgdG8gYmUgdXNlZCAqLwotCi0vKiBkZWZpbml0aW9ucyBmb3IgQ1BDX01TR19UX0lORk8gaW5mb3JtYXRpb24gc291cmNlcyAqLwotI2RlZmluZSBDUENfSU5GT01TR19UX1VOS05PV05fU09VUkNFIDAKLSNkZWZpbmUgQ1BDX0lORk9NU0dfVF9JTlRFUkZBQ0UgICAgICAxCi0jZGVmaW5lIENQQ19JTkZPTVNHX1RfRFJJVkVSICAgICAgICAgMgotI2RlZmluZSBDUENfSU5GT01TR19UX0xJQlJBUlkgICAgICAgIDMKLQotLyogaW5mb3JtYXRpb24gdHlwZXMgKi8KLSNkZWZpbmUgQ1BDX0lORk9NU0dfVF9VTktOT1dOX1RZUEUgICAwCi0jZGVmaW5lIENQQ19JTkZPTVNHX1RfVkVSU0lPTiAgICAgICAgMQotI2RlZmluZSBDUENfSU5GT01TR19UX1NFUklBTCAgICAgICAgIDIKLQotLyogZGVmaW5pdGlvbnMgZm9yIGNvbnRyb2xsZXIgdHlwZXMgKi8KLSNkZWZpbmUgUENBODJDMjAwICAgMSAvKiBQaGlsaXBzIGJhc2ljIENBTiBjb250cm9sbGVyLCByZXBsYWNlZCBieSBTSkExMDAwICovCi0jZGVmaW5lIFNKQTEwMDAgICAgIDIgLyogUGhpbGlwcyBiYXNpYyBDQU4gY29udHJvbGxlciAqLwotI2RlZmluZSBBTjgyNTI3ICAgICAzIC8qIEludGVsIGZ1bGwgQ0FOIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgTTE2Q19CQVNJQyAgNCAvKiBNMTZDIGNvbnRyb2xsZXIgcnVubmluZyBpbiBiYXNpYyBDQU4gKG5vdCBmdWxsIENBTikgbW9kZSAqLwotCi0vKiBjaGFubmVsIG9wZW4gZXJyb3IgY29kZXMgKi8KLSNkZWZpbmUgQ1BDX0VSUl9OT19GUkVFX0NIQU5ORUwgICAgICAgICAgICAtMQkvKiBubyBtb3JlIGZyZWUgc3BhY2Ugd2l0aGluIHRoZSBjaGFubmVsIGFycmF5ICovCi0jZGVmaW5lIENQQ19FUlJfQ0hBTk5FTF9BTFJFQURZX09QRU4gICAgICAgLTIJLyogdGhlIGNoYW5uZWwgaXMgYWxyZWFkeSBvcGVuICovCi0jZGVmaW5lIENQQ19FUlJfQ0hBTk5FTF9OT1RfQUNUSVZFICAgICAgICAgLTMJLyogYWNjZXNzIHRvIGEgY2hhbm5lbCBub3QgYWN0aXZlIGZhaWxlZCAqLwotI2RlZmluZSBDUENfRVJSX05PX0RSSVZFUl9QUkVTRU5UICAgICAgICAgIC00CS8qIG5vIGRyaXZlciBhdCB0aGUgbG9jYXRpb24gc2VhcmNoZWQgYnkgdGhlIGxpYnJhcnkgKi8KLSNkZWZpbmUgQ1BDX0VSUl9OT19JTklGSUxFX1BSRVNFTlQgICAgICAgICAtNQkvKiB0aGUgbGlicmFyeSBjb3VsZCBub3QgZmluZCB0aGUgaW5pZmlsZSAqLwotI2RlZmluZSBDUENfRVJSX1dST05HX1BBUkFNRVRFUlMgICAgICAgICAgIC02CS8qIHdyb25nIHBhcmFtZXRlcnMgaW4gdGhlIGluaWZpbGUgKi8KLSNkZWZpbmUgQ1BDX0VSUl9OT19JTlRFUkZBQ0VfUFJFU0VOVCAgICAgICAtNwkvKiAxLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBpcyBub3QgY29ubmVjdGVkICovCi0JCQkJCQkvKiAyLiBUaGUgaW50ZXJmYWNlIChtb3N0bHkgQ1BDLVVTQikgd2FzIGRpc2Nvbm5lY3RlZCB1cG9uIG9wZXJhdGlvbiAqLwotI2RlZmluZSBDUENfRVJSX05PX01BVENISU5HX0NIQU5ORUwgICAgICAgIC04CS8qIHRoZSBkcml2ZXIgY291bGRuJ3QgZmluZCBhIG1hdGNoaW5nIGNoYW5uZWwgKi8KLSNkZWZpbmUgQ1BDX0VSUl9OT19CVUZGRVJfQVZBSUxBQkxFICAgICAgICAtOQkvKiB0aGUgZHJpdmVyIGNvdWxkbid0IGFsbG9jYXRlIGJ1ZmZlciBmb3IgbWVzc2FnZXMgKi8KLSNkZWZpbmUgQ1BDX0VSUl9OT19JTlRFUlJVUFQgICAgICAgICAgICAgICAtMTAJLyogdGhlIHJlcXVlc3RlZCBpbnRlcnJ1cHQgY291bGRuJ3QgYmUgY2xhaW1lZCAqLwotI2RlZmluZSBDUENfRVJSX05PX01BVENISU5HX0lOVEVSRkFDRSAgICAgIC0xMQkvKiBubyBpbnRlcmZhY2UgdHlwZSByZWxhdGVkIHRvIHRoaXMgY2hhbm5lbCB3YXMgZm91bmQgKi8KLSNkZWZpbmUgQ1BDX0VSUl9OT19SRVNPVVJDRVMgICAgICAgICAgICAgICAtMTIJLyogdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMgY291bGQgbm90IGJlIGNsYWltZWQgKi8KLSNkZWZpbmUgQ1BDX0VSUl9TT0NLRVQgICAgICAgICAgICAgICAgICAgICAtMTMJLyogZXJyb3IgY29uY2VybmluZyBUQ1Agc29ja2V0cyAqLwotCi0vKiBpbml0IGVycm9yIGNvZGVzICovCi0jZGVmaW5lIENQQ19FUlJfV1JPTkdfQ09OVFJPTExFUl9UWVBFICAgICAgLTE0CS8qIHdyb25nIENBTiBjb250cm9sbGVyIHR5cGUgd2l0aGluIGluaXRpYWxpemF0aW9uICovCi0jZGVmaW5lIENQQ19FUlJfTk9fUkVTRVRfTU9ERSAgICAgICAgICAgICAgLTE1CS8qIHRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBiZSBzZXQgaW50byByZXNldCBtb2RlICovCi0jZGVmaW5lIENQQ19FUlJfTk9fQ0FOX0FDQ0VTUyAgICAgICAgICAgICAgLTE2CS8qIHRoZSBDQU4gY29udHJvbGxlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQgKi8KLQotLyogdHJhbnNtaXQgZXJyb3IgY29kZXMgKi8KLSNkZWZpbmUgQ1BDX0VSUl9DQU5fV1JPTkdfSUQgICAgICAgICAgICAgICAtMjAJLyogdGhlIHByb3ZpZGVkIENBTiBpZCBpcyB0b28gYmlnICovCi0jZGVmaW5lIENQQ19FUlJfQ0FOX1dST05HX0xFTkdUSCAgICAgICAgICAgLTIxCS8qIHRoZSBwcm92aWRlZCBDQU4gbGVuZ3RoIGlzIHRvbyBsb25nICovCi0jZGVmaW5lIENQQ19FUlJfQ0FOX05PX1RSQU5TTUlUX0JVRiAgICAgICAgLTIyCS8qIHRoZSB0cmFuc21pdCBidWZmZXIgd2FzIG9jY3VwaWVkICovCi0jZGVmaW5lIENQQ19FUlJfQ0FOX1RSQU5TTUlUX1RJTUVPVVQgICAgICAgLTIzCS8qIFRoZSBtZXNzYWdlIGNvdWxkIG5vdCBiZSBzZW50IHdpdGhpbiBhICovCi0JCQkJCQkvKiBzcGVjaWZpZWQgdGltZSAqLwotCi0vKiBvdGhlciBlcnJvciBjb2RlcyAqLwotI2RlZmluZSBDUENfRVJSX1NFUlZJQ0VfTk9UX1NVUFBPUlRFRCAgICAgIC0zMAkvKiB0aGUgcmVxdWVzdGVkIHNlcnZpY2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgaW50ZXJmYWNlICovCi0jZGVmaW5lIENQQ19FUlJfSU9fVFJBTlNGRVIgICAgICAgICAgICAgICAgLTMxCS8qIGEgdHJhbnNtaXNzaW9uIGVycm9yIGRvd24gdG8gdGhlIGRyaXZlciBvY2N1cnJlZCAqLwotI2RlZmluZSBDUENfRVJSX1RSQU5TTUlTU0lPTl9GQUlMRUQgICAgICAgIC0zMgkvKiBhIHRyYW5zbWlzc2lvbiBlcnJvciBkb3duIHRvIHRoZSBpbnRlcmZhY2Ugb2NjdXJyZWQgKi8KLSNkZWZpbmUgQ1BDX0VSUl9UUkFOU01JU1NJT05fVElNRU9VVCAgICAgICAtMzMJLyogYSB0aW1lb3V0IG9jY3VycmVkIHdpdGhpbiB0cmFuc21pc3Npb24gdG8gdGhlIGludGVyZmFjZSAqLwotI2RlZmluZSBDUENfRVJSX09QX1NZU19OT1RfU1VQUE9SVEVEICAgICAgIC0zNQkvKiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIENQQ19FUlJfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgLTQwCS8qIGFuIHVua25vd24gZXJyb3Igb2N1cnJlZCAobW9zdGx5IElPQ1RMIGVycm9ycykgKi8KLQotI2RlZmluZSBDUENfRVJSX0xPQURJTkdfRExMICAgICAgICAgICAgICAgIC01MAkvKiB0aGUgbGlicmFyeSAnY3Bjd2luLmRsbCcgY291bGQgbm90IGJlIGxvYWRlZCAqLwotI2RlZmluZSBDUENfRVJSX0FTU0lHTklOR19GVU5DVElPTiAgICAgICAgIC01MQkvKiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGNvdWxkIG5vdCBiZSBhc3NpZ25lZCAqLwotI2RlZmluZSBDUENfRVJSX0RMTF9JTklUSUFMSVpBVElPTiAgICAgICAgIC01MgkvKiB0aGUgRExMIHdhcyBub3QgaW5pdGlhbGl6ZWQgY29ycmVjdGx5ICovCi0jZGVmaW5lIENQQ19FUlJfTUlTU0lOR19MSUNGSUxFICAgICAgICAgICAgLTU1CS8qIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpY2Vuc2VzIGRvZXMgbm90IGV4aXN0ICovCi0jZGVmaW5lIENQQ19FUlJfTUlTU0lOR19MSUNFTlNFICAgICAgICAgICAgLTU2CS8qIGEgcmVxdWlyZWQgbGljZW5zZSB3YXMgbm90IGZvdW5kICovCi0KLS8qIENBTiBzdGF0ZSBiaXQgdmFsdWVzLiBJZ25vcmUgYW55IGJpdHMgbm90IGxpc3RlZCAqLwotI2RlZmluZSBDUENfQ0FOX1NUQVRFX0JVU09GRiAgICAgMHg4MAotI2RlZmluZSBDUENfQ0FOX1NUQVRFX0VSUk9SICAgICAgMHg0MAotCi0vKiBNYXNrIHRvIGhlbHAgaWdub3JlIHVuZGVmaW5lZCBiaXRzICovCi0jZGVmaW5lIENQQ19DQU5fU1RBVEVfTUFTSyAgICAgICAweGMwCi0KLS8qCi0gKiBDQU4tTWVzc2FnZSByZXByZXNlbnRhdGlvbiBpbiBhIENQQ19NUwotICogTWVzc2FnZSBvYmplY3QgdHlwZSBpcyBDUENfTVNHX1RfQ0FOIG9yIENQQ19NU0dfVF9SVFIKLSAqIG9yIENQQ19NU0dfVF9YQ0FOIG9yIENQQ19NU0dfVF9YUlRSCi0gKi8KLXR5cGVkZWYgc3RydWN0IENQQ19DQU5fTVNHIHsKLQl1MzIgaWQ7Ci0JdTggbGVuZ3RoOwotCXU4IG1zZ1s4XTsKLX0gQ1BDX0NBTl9NU0dfVDsKLQotLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIENBTiBwYXJhbWV0ZXJzIGZvciB0aGUgUENBODJDMjAwIGNvbnRyb2xsZXIgKi8KLXR5cGVkZWYgc3RydWN0IENQQ19QQ0E4MkMyMDBfUEFSQU1TIHsKLQl1OCBhY2NfY29kZTsJLyogQWNjZXB0YW5jZS1jb2RlIGZvciByZWNlaXZlLCBTdGFuZGFyZDogMCAqLwotCXU4IGFjY19tYXNrOwkvKiBBY2NlcHRhbmNlLW1hc2sgZm9yIHJlY2VpdmUsIFN0YW5kYXJkOiAweGZmIChldmVyeXRoaW5nKSAqLwotCXU4IGJ0cjA7CS8qIEJ1cy10aW1pbmcgcmVnaXN0ZXIgMCAqLwotCXU4IGJ0cjE7CS8qIEJ1cy10aW1pbmcgcmVnaXN0ZXIgMSAqLwotCXU4IG91dHBfY29udHI7CS8qIE91dHB1dC1jb250cm9sIHJlZ2lzdGVyICovCi19IENQQ19QQ0E4MkMyMDBfUEFSQU1TX1Q7Ci0KLS8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBDQU4gcGFyYW1ldGVycyBmb3IgdGhlIFNKQTEwMDAgY29udHJvbGxlciAqLwotdHlwZWRlZiBzdHJ1Y3QgQ1BDX1NKQTEwMDBfUEFSQU1TIHsKLQl1OCBtb2RlOwkvKiBlbmFibGVzIHNpbmdsZSBvciBkdWFsIGFjY2VwdGFuY2UgZmlsdGVyaW5nICovCi0JdTggYWNjX2NvZGUwOwkvKiBBY2NlcHRhbmNlLWNvZGUgZm9yIHJlY2VpdmUsIFN0YW5kYXJkOiAwICovCi0JdTggYWNjX2NvZGUxOwotCXU4IGFjY19jb2RlMjsKLQl1OCBhY2NfY29kZTM7Ci0JdTggYWNjX21hc2swOwkvKiBBY2NlcHRhbmNlLW1hc2sgZm9yIHJlY2VpdmUsIFN0YW5kYXJkOiAweGZmIChldmVyeXRoaW5nKSAqLwotCXU4IGFjY19tYXNrMTsKLQl1OCBhY2NfbWFzazI7Ci0JdTggYWNjX21hc2szOwotCXU4IGJ0cjA7CS8qIEJ1cy10aW1pbmcgcmVnaXN0ZXIgMCAqLwotCXU4IGJ0cjE7CS8qIEJ1cy10aW1pbmcgcmVnaXN0ZXIgMSAqLwotCXU4IG91dHBfY29udHI7CS8qIE91dHB1dC1jb250cm9sIHJlZ2lzdGVyICovCi19IENQQ19TSkExMDAwX1BBUkFNU19UOwotCi0vKgotICogcmVwcmVzZW50YXRpb24gb2YgdGhlIENBTiBwYXJhbWV0ZXJzIGZvciB0aGUgTTE2QyBjb250cm9sbGVyCi0gKiBpbiBiYXNpYyBDQU4gbW9kZSAobWVhbnMgbm8gZnVsbCBDQU4pCi0gKi8KLXR5cGVkZWYgc3RydWN0IENQQ19NMTZDX0JBU0lDX1BBUkFNUyB7Ci0JdTggY29uMDsKLQl1OCBjb24xOwotCXU4IGN0bHIwOwotCXU4IGN0bHIxOwotCXU4IGNsazsKLQl1OCBhY2Nfc3RkX2NvZGUwOwotCXU4IGFjY19zdGRfY29kZTE7Ci0JdTggYWNjX2V4dF9jb2RlMDsKLQl1OCBhY2NfZXh0X2NvZGUxOwotCXU4IGFjY19leHRfY29kZTI7Ci0JdTggYWNjX2V4dF9jb2RlMzsKLQl1OCBhY2Nfc3RkX21hc2swOwotCXU4IGFjY19zdGRfbWFzazE7Ci0JdTggYWNjX2V4dF9tYXNrMDsKLQl1OCBhY2NfZXh0X21hc2sxOwotCXU4IGFjY19leHRfbWFzazI7Ci0JdTggYWNjX2V4dF9tYXNrMzsKLX0gQ1BDX00xNkNfQkFTSUNfUEFSQU1TX1Q7Ci0KLS8qIENBTiBwYXJhbXMgbWVzc2FnZSByZXByZXNlbnRhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgQ1BDX0NBTl9QQVJBTVMgewotCXU4IGNjX3R5cGU7CS8qIHJlcHJlc2VudHMgdGhlIGNvbnRyb2xsZXIgdHlwZSAqLwotCXVuaW9uIHsKLQkJQ1BDX00xNkNfQkFTSUNfUEFSQU1TX1QgbTE2Y19iYXNpYzsKLQkJQ1BDX1NKQTEwMDBfUEFSQU1TX1Qgc2phMTAwMDsKLQkJQ1BDX1BDQTgyQzIwMF9QQVJBTVNfVCBwY2E4MmMyMDA7Ci0JfSBjY19wYXJhbXM7Ci19IENQQ19DQU5fUEFSQU1TX1Q7Ci0KLS8qIENIQU4gaW5pdCBwYXJhbXMgcmVwcmVzZW50YXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IENQQ19DSEFOX1BBUkFNUyB7Ci0JaW50IGZkOwotfSBDUENfQ0hBTl9QQVJBTVNfVDsKLQotLyogQ0FOIGluaXQgcGFyYW1zIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IENQQ19JTklUX1BBUkFNUyB7Ci0JQ1BDX0NIQU5fUEFSQU1TX1QgY2hhbnBhcmFtczsKLQlDUENfQ0FOX1BBUkFNU19UIGNhbnBhcmFtczsKLX0gQ1BDX0lOSVRfUEFSQU1TX1Q7Ci0KLS8qIHN0cnVjdHVyZSBmb3IgY29uZmlybWVkIG1lc3NhZ2UgaGFuZGxpbmcgKi8KLXR5cGVkZWYgc3RydWN0IENQQ19DT05GSVJNIHsKLQl1OCByZXN1bHQ7IC8qIGVycm9yIGNvZGUgKi8KLX0gQ1BDX0NPTkZJUk1fVDsKLQotLyogc3RydWN0dXJlIGZvciBpbmZvcm1hdGlvbiByZXF1ZXN0cyAqLwotdHlwZWRlZiBzdHJ1Y3QgQ1BDX0lORk8gewotCXU4IHNvdXJjZTsgICAgICAgICAgICAgICAgIC8qIGludGVyZmFjZSwgZHJpdmVyIG9yIGxpYnJhcnkgKi8KLQl1OCB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uIG9yIHNlcmlhbCBudW1iZXIgKi8KLQljaGFyIG1zZ1tDUENfTVNHX0xFTiAtIDJdOyAvKiBzdHJpbmcgaG9sZGluZyB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uICovCi19IENQQ19JTkZPX1Q7Ci0KLS8qCi0gKiBPVkVSUlVOCi0gKiBJbiBnZW5lcmFsIHR3byB0eXBlcyBvZiBvdmVycnVuIG1heSBvY2N1ci4KLSAqIEEgaGFyZHdhcmUgb3ZlcnJ1biwgd2hlcmUgdGhlIENBTiBjb250cm9sbGVyCi0gKiBsb3N0IGEgbWVzc2FnZSwgYmVjYXVzZSB0aGUgaW50ZXJydXB0IHdhcwotICogbm90IGhhbmRsZWQgYmVmb3JlIHRoZSBuZXh0IG1lc3NnYWUgY29tZXMgaW4uCi0gKiBPciBhIHNvZnR3YXJlIG92ZXJydW4sIHdoZXJlIGkuZS4gYSByZWNlaXZlZAotICogbWVzc2FnZSBjb3VsZCBub3QgYmUgc3RvcmVkIGluIHRoZSBDUENfTVNHCi0gKiBidWZmZXIuCi0gKi8KLQotLyogQWZ0ZXIgYSBzb2Z0d2FyZSBvdmVycnVuIGhhcyBvY2N1cnJlZAotICogd2Ugd2FpdCB1bnRpbCB3ZSBoYXZlIENQQ19PVlJfR0FQIHNsb3RzCi0gKiBmcmVlIGluIHRoZSBDUENfTVNHIGJ1ZmZlci4KLSAqLwotI2RlZmluZSBDUENfT1ZSX0dBUCAgICAgICAgICAgICAgIDEwCi0KLS8qCi0gKiBUd28gdHlwZXMgb2Ygc29mdHdhcmUgb3ZlcnJ1biBtYXkgb2NjdXIuCi0gKiBBIHJlY2VpdmVkIENBTiBtZXNzYWdlIG9yIGEgQ0FOIHN0YXRlIGV2ZW50Ci0gKiBjYW4gY2F1c2UgYW4gb3ZlcnJ1bi4KLSAqIE5vdGU6IEEgQ1BDX0NNRCB3aGljaCB3b3VsZCBub3JtYWxseSBzdG9yZQotICogaXRzIHJlc3VsdCBpbW1lZGlhdGVseSBpbiB0aGUgQ1BDX01TRwotICogcXVldWUgbWF5IGZhaWwsIGJlY2F1c2UgdGhlIG1lc3NhZ2UgcXVldWUgaXMgZnVsbC4KLSAqIFRoaXMgd2lsbCBub3QgZ2VuZXJhdGUgYW4gb3ZlcnJ1biBtZXNzYWdlLCBidXQKLSAqIHdpbGwgaGFsdCBjb21tYW5kIGV4ZWN1dGlvbiwgdW50aWwgdGhpcyBjb21tYW5kCi0gKiBpcyBhYmxlIHRvIHN0b3JlIGl0cyBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIHF1ZXVlLgotICovCi0jZGVmaW5lIENQQ19PVlJfRVZFTlRfQ0FOICAgICAgIDB4MDEKLSNkZWZpbmUgQ1BDX09WUl9FVkVOVF9DQU5TVEFURSAgMHgwMgotI2RlZmluZSBDUENfT1ZSX0VWRU5UX0JVU0VSUk9SICAweDA0Ci0KLS8qCi0gKiBJZiB0aGUgQ0FOIGNvbnRyb2xsZXIgbG9zdCBhIG1lc3NhZ2UKLSAqIHdlIGluZGljYXRlIGl0IHdpdGggdGhlIGhpZ2hlc3QgYml0Ci0gKiBzZXQgaW4gdGhlIGNvdW50IGZpZWxkLgotICovCi0jZGVmaW5lIENQQ19PVlJfSFcgICAgICAgICAgICAgIDB4ODAKLQotLyogc3RydWN0dXJlIGZvciBvdmVycnVuIGNvbmRpdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1OCBldmVudDsKLQl1OCBjb3VudDsKLX0gQ1BDX09WRVJSVU5fVDsKLQotLyoKLSAqIENBTiBlcnJvcnMKLSAqIEVhY2ggQ0FOIGNvbnRyb2xsZXIgdHlwZSBoYXMgZGlmZmVyZW50Ci0gKiByZWdpc3RlcnMgdG8gcmVjb3JkIGVycm9ycy4KLSAqIFRoZXJlZm9yIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmljCi0gKiBlcnJvcnMgaXMgc2V0IHVwIGZvciBlYWNoIGNvbnRyb2xsZXIgaGVyZQotICovCi0KLS8qCi0gKiBTSkExMDAwIGVycm9yIHN0cnVjdHVyZQotICogc2VlIHRoZSBTSkExMDAwIGRhdGFzaGVldCBmb3IgZGV0YWlsZWQKLSAqIGV4cGxhbmF0aW9uIG9mIHRoZSByZWdpc3RlcnMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgQ1BDX1NKQTEwMDBfQ0FOX0VSUk9SIHsKLQl1OCBlY2M7ICAgLyogZXJyb3IgY2FwdHVyZSBjb2RlIHJlZ2lzdGVyICovCi0JdTggcnhlcnI7IC8qIFJYIGVycm9yIGNvdW50ZXIgcmVnaXN0ZXIgKi8KLQl1OCB0eGVycjsgLyogVFggZXJyb3IgY291bnRlciByZWdpc3RlciAqLwotfSBDUENfU0pBMTAwMF9DQU5fRVJST1JfVDsKLQotLyoKLSAqIE0xNkMgZXJyb3Igc3RydWN0dXJlCi0gKiBzZWUgdGhlIE0xNkMgZGF0YXNoZWV0IGZvciBkZXRhaWxlZAotICogZXhwbGFuYXRpb24gb2YgdGhlIHJlZ2lzdGVycwotICovCi10eXBlZGVmIHN0cnVjdCBDUENfTTE2Q19DQU5fRVJST1IgewotCXU4IHRiZDsJLyogdG8gYmUgZGVmaW5lZCAqLwotfSBDUENfTTE2Q19DQU5fRVJST1JfVDsKLQotLyogc3RydWN0dXJlIGZvciBDQU4gZXJyb3IgY29uZGl0aW9ucyAqLwotI2RlZmluZSAgQ1BDX0NBTl9FQ09ERV9FUlJGUkFNRSAgIDB4MDEKLXR5cGVkZWYgc3RydWN0IENQQ19DQU5fRVJST1IgewotCXU4IGVjb2RlOwotCXN0cnVjdCB7Ci0JCXU4IGNjX3R5cGU7IC8qIENBTiBjb250cm9sbGVyIHR5cGUgKi8KLQkJdW5pb24gewotCQkJQ1BDX1NKQTEwMDBfQ0FOX0VSUk9SX1Qgc2phMTAwMDsKLQkJCUNQQ19NMTZDX0NBTl9FUlJPUl9UIG0xNmM7Ci0JCX0gcmVnczsKLQl9IGNjOwotfSBDUENfQ0FOX0VSUk9SX1Q7Ci0KLS8qCi0gKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBSWC9UWCBlcnJvciBjb3VudGVyLgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXF1ZXN0IHRoZQotICogdmFsdWVzIG9mIHRoZSBDQU4gY29udHJvbGxlcnMgVFggYW5kIFJYCi0gKiBlcnJvciBjb3VudGVyLgotICovCi10eXBlZGVmIHN0cnVjdCBDUENfQ0FOX0VSUl9DT1VOVEVSIHsKLQl1OCByeDsKLQl1OCB0eDsKLX0gQ1BDX0NBTl9FUlJfQ09VTlRFUl9UOwotCi0vKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0cmFuc21pc3Npb25zIGZyb20gUEMgdG8gQ1BDIGFyZSBwcm90ZWN0ZWQgYWdhaW5zdCBsb3NzICovCi0jZGVmaW5lIENQQ19TRUNVUkVfVE9fQ1BDCTB4MDEKLQotLyogSWYgdGhpcyBmbGFnIGlzIHNldCwgdHJhbnNtaXNzaW9ucyBmcm9tIENQQyB0byBQQyBhcmUgcHJvdGVjdGVkIGFnYWluc3QgbG9zcyAqLwotI2RlZmluZSBDUENfU0VDVVJFX1RPX1BDCTB4MDIKLQotLyogSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIENBTi10cmFuc21pdCBidWZmZXIgaXMgY2hlY2tlZCB0byBiZSBmcmVlIGJlZm9yZSBzZW5kaW5nIGEgbWVzc2FnZSAqLwotI2RlZmluZSBDUENfU0VDVVJFX1NFTkQJCTB4MDQKLQotLyoKLSAqIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGUgZmxhZyBpcyBjaGVja2VkCi0gKiBhZnRlciBzZW5kaW5nIGEgbWVzc2FnZQotICogVEhJUyBJUyBDVVJSRU5UTFkgT05MWSBJTVBMRU1FTlRFRCBJTiBUSEUgUEFTU0lWRSBJTlRFUkZBQ0UgRFJJVkVSUwotICovCi0jZGVmaW5lIENQQ19TRUNVUkVfVFJBTlNNSVQJMHgwOAotCi0vKiBtYWluIG1lc3NhZ2UgdHlwZSB1c2VkIGJldHdlZW4gbGlicmFyeSBhbmQgYXBwbGljYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IENQQ19NU0cgewotCXU4IHR5cGU7CS8qIHR5cGUgb2YgbWVzc2FnZSAqLwotCXU4IGxlbmd0aDsJLyogbGVuZ3RoIG9mIGRhdGEgd2l0aGluIHVuaW9uICdtc2cnICovCi0JdTggbXNnaWQ7CS8qIGNvbmZpcm1hdGlvbiBoYW5kbGUgKi8KLQl1MzIgdHNfc2VjOwkvKiB0aW1lc3RhbXAgaW4gc2Vjb25kcyAqLwotCXUzMiB0c19uc2VjOwkvKiB0aW1lc3RhbXAgaW4gbmFubyBzZWNvbmRzICovCi0JdW5pb24gewotCQl1OCBnZW5lcmljW0NQQ19NU0dfTEVOXTsKLQkJQ1BDX0NBTl9NU0dfVCBjYW5tc2c7Ci0JCUNQQ19DQU5fUEFSQU1TX1QgY2FucGFyYW1zOwotCQlDUENfQ09ORklSTV9UIGNvbmZpcm1hdGlvbjsKLQkJQ1BDX0lORk9fVCBpbmZvOwotCQlDUENfT1ZFUlJVTl9UIG92ZXJydW47Ci0JCUNQQ19DQU5fRVJST1JfVCBlcnJvcjsKLQkJQ1BDX0NBTl9FUlJfQ09VTlRFUl9UIGVycl9jb3VudGVyOwotCQl1OCBidXNsb2FkOwotCQl1OCBjYW5zdGF0ZTsKLQl9IG1zZzsKLX0gQ1BDX01TR19UOwotCi0jZW5kaWYgLyogQ1BDX0hFQURFUiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvY3BjX2ludC5oIGIvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvY3BjX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODY3NGU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcGMtdXNiL2NwY19pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDUENMSUIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwOCBFTVMgRHIuIFRob21hcyBXdWVuc2NoZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKi8KLSNpZm5kZWYgQ1BDX0lOVF9ICi0jZGVmaW5lIENQQ19JTlRfSAotCi0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jZGVmaW5lIENQQ19NU0dfQlVGX0NOVAkxNTAwCi0KLSNkZWZpbmUgQ1BDX1BST0NfRElSICJkcml2ZXIvIgotCi0jdW5kZWYgZGJnCi0jdW5kZWYgZXJyCi0jdW5kZWYgaW5mbwotCi0vKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KLSNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgcHJpbnRrKCBLRVJOX0lORk8gZm9ybWF0ICJcbiIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQotI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIGRvIHsgcHJpbnRrKCBLRVJOX0lORk8gIkVSUk9SICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQotI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBkbyB7IHByaW50ayggS0VSTl9JTkZPIGZvcm1hdCAiXG4iICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLQotLyogTWFjcm9zIGhlbHAgdXNpbmcgb2Ygb3VyIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgSXNCdWZmZXJGdWxsKHgpICAgICAoISh4KS0+V25SKSAmJiAoKHgpLT5paWR4ID09ICh4KS0+b2lkeCkKLSNkZWZpbmUgSXNCdWZmZXJFbXB0eSh4KSAgICAoKHgpLT5XblIpICYmICgoeCktPmlpZHggPT0gKHgpLT5vaWR4KQotI2RlZmluZSBJc0J1ZmZlck5vdEVtcHR5KHgpICghKHgpLT5XblIpIHx8ICgoeCktPmlpZHggIT0gKHgpLT5vaWR4KQotI2RlZmluZSBSZXNldEJ1ZmZlcih4KSAgICAgIGRvIHsgKHgpLT5vaWR4ID0gKHgpLT5paWR4PTA7ICh4KS0+V25SID0gMTsgfSB3aGlsZSgwKTsKLQotI2RlZmluZSBDUENfQnVmV3JpdGVBbGxvd2VkICgoY2hhbi0+b2lkeCAhPSBjaGFuLT5paWR4KSB8fCBjaGFuLT5XblIpCi0KLXR5cGVkZWYgdm9pZCAoKmNoYW5fd3JpdGVfYnl0ZV90KSAodm9pZCAqY2hhbiwgdW5zaWduZWQgaW50IHJlZywKLQkJCQkgICB1bnNpZ25lZCBjaGFyIHZhbCk7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgKCpjaGFuX3JlYWRfYnl0ZV90KSAodm9pZCAqY2hhbiwgdW5zaWduZWQgaW50IHJlZyk7Ci0KLXR5cGVkZWYgc3RydWN0IENQQ19DSEFOIHsKLQl2b2lkIF9faW9tZW0gKiBjYW5CYXNlOwkvKiBiYXNlIGFkZHJlc3Mgb2YgU0pBMTAwMCAqLwotCWNoYW5fcmVhZF9ieXRlX3QgcmVhZF9ieXRlOwkvKiBDQU4gY29udHJvbGxlciByZWFkIGFjY2VzcyByb3V0aW5lICovCi0JY2hhbl93cml0ZV9ieXRlX3Qgd3JpdGVfYnl0ZTsJLyogQ0FOIGNvbnRyb2xsZXIgd3JpdGUgYWNjZXNzIHJvdXRpbmUgKi8KLQlDUENfTVNHX1QgKmJ1ZjsJCS8qIGJ1ZmZlciBmb3IgQ1BDIG1zZyAqLwotCXVuc2lnbmVkIGludCBpaWR4OwotCXVuc2lnbmVkIGludCBvaWR4OwotCXVuc2lnbmVkIGludCBXblI7Ci0JdW5zaWduZWQgaW50IG1pbm9yOwotCXVuc2lnbmVkIGludCBsb2NrZWQ7Ci0JdW5zaWduZWQgaW50IGlycURpc2FibGVkOwotCi0JdW5zaWduZWQgY2hhciBjcGNDdHJsQ0FOTWVzc2FnZTsKLQl1bnNpZ25lZCBjaGFyIGNwY0N0cmxDQU5TdGF0ZTsKLQl1bnNpZ25lZCBjaGFyIGNwY0N0cmxCVVNTdGF0ZTsKLQotCXVuc2lnbmVkIGNoYXIgY29udHJvbGxlclR5cGU7Ci0KLQl1bnNpZ25lZCBsb25nIG92clRpbWVTZWM7Ci0JdW5zaWduZWQgbG9uZyBvdnJUaW1lTlNlYzsKLQl1bnNpZ25lZCBsb25nIG92ckxvY2tlZEJ1ZmZlcjsKLQlDUENfT1ZFUlJVTl9UIG92cjsKLQotCS8qIGZvciBkZWJ1Z2dpbmcgb25seSAqLwotCXVuc2lnbmVkIGludCBoYW5kbGVkSXJxczsKLQl1bnNpZ25lZCBpbnQgbG9zdE1lc3NhZ2VzOwotCi0JdW5zaWduZWQgaW50IHNlbnRTdGRDYW47Ci0JdW5zaWduZWQgaW50IHNlbnRFeHRDYW47Ci0JdW5zaWduZWQgaW50IHNlbnRTdGRSdHI7Ci0JdW5zaWduZWQgaW50IHNlbnRFeHRSdHI7Ci0KLQl1bnNpZ25lZCBpbnQgcmVjdlN0ZENhbjsKLQl1bnNpZ25lZCBpbnQgcmVjdkV4dENhbjsKLQl1bnNpZ25lZCBpbnQgcmVjdlN0ZFJ0cjsKLQl1bnNpZ25lZCBpbnQgcmVjdkV4dFJ0cjsKLQotCXdhaXRfcXVldWVfaGVhZF90ICpDUENXYWl0X3E7Ci0KLQl2b2lkICpwcml2YXRlOwotfSBDUENfQ0hBTl9UOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcGMtdXNiL2NwY3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvY3BjdXNiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZGYzMGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NwYy11c2IvY3BjdXNiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKiBIZWFkZXIgZm9yIENQQy1VU0IgRHJpdmVyICoqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMQotICoKLSAqIENvbXBhbnk6ICBFTVMgRHIuIFRob21hcyBXdWVuc2NoZQotICogICAgICAgICAgIFNvbm5lbmhhbmcgMwotICogICAgICAgICAgIDg1MzA0IElsbW11ZW5zdGVyCi0gKiAgICAgICAgICAgUGhvbmU6ICs0OS04NDQxLTQ5MDI2MAotICogICAgICAgICAgIEZheDogICArNDktODQ0MS04MTg2MAotICogICAgICAgICAgIGVtYWlsOiBzdXBwb3J0QGVtcy13dWVuc2NoZS5jb20KLSAqICAgICAgICAgICBXV1c6ICAgd3d3LmVtcy13dWVuc2NoZS5jb20KLSAqLwotCi0jaWZuZGVmIENQQ1VTQl9ICi0jZGVmaW5lIENQQ1VTQl9ICi0KLSN1bmRlZiBlcnIKLSN1bmRlZiBkYmcKLSN1bmRlZiBpbmZvCi0KLS8qIFVzZSBvdXIgb3duIGRiZyBtYWNybyAqLwotI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHsgaWYgKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPICJDUEMtVVNCOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgZG8geyBwcmludGsoS0VSTl9JTkZPICJDUEMtVVNCOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBkbyB7IHByaW50ayhLRVJOX0lORk8gIkNQQy1VU0IoRVJST1IpOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDUENfVVNCX0NBUkRfQ05UICAgICAgNAotCi10eXBlZGVmIHN0cnVjdCBDUENfVVNCX1JFQURfVVJCIHsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXI7CS8qIHRoZSBidWZmZXIgdG8gc2VuZCBkYXRhICovCi0Jc2l6ZV90IHNpemU7CQkvKiB0aGUgc2l6ZSBvZiB0aGUgc2VuZCBidWZmZXIgKi8KLQlzdHJ1Y3QgdXJiICp1cmI7CS8qIHRoZSB1cmIgdXNlZCB0byBzZW5kIGRhdGEgKi8KLX0gQ1BDX1VTQl9SRUFEX1VSQl9UOwotCi10eXBlZGVmIHN0cnVjdCBDUENfVVNCX1dSSVRFX1VSQiB7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyOwkvKiB0aGUgYnVmZmVyIHRvIHNlbmQgZGF0YSAqLwotCXNpemVfdCBzaXplOwkJLyogdGhlIHNpemUgb2YgdGhlIHNlbmQgYnVmZmVyICovCi0Jc3RydWN0IHVyYiAqdXJiOwkvKiB0aGUgdXJiIHVzZWQgdG8gc2VuZCBkYXRhICovCi0JYXRvbWljX3QgYnVzeTsJCS8qIHRydWUgaWYgd3JpdGUgdXJiIGlzIGJ1c3kgKi8KLQlzdHJ1Y3QgY29tcGxldGlvbiBmaW5pc2hlZDsJLyogd2FpdCBmb3IgdGhlIHdyaXRlIHRvIGZpbmlzaCAqLwotfSBDUENfVVNCX1dSSVRFX1VSQl9UOwotCi0jZGVmaW5lIENQQ19VU0JfVVJCX0NOVCAgMTAKLQotdHlwZWRlZiBzdHJ1Y3QgQ1BDX1VTQiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8qIHNhdmUgb2ZmIHRoZSB1c2IgZGV2aWNlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOwkvKiB0aGUgaW50ZXJmYWNlIGZvciB0aGlzIGRldmljZSAqLwotCXVuc2lnbmVkIGNoYXIgbWlub3I7CS8qIHRoZSBzdGFydGluZyBtaW5vciBudW1iZXIgZm9yIHRoaXMgZGV2aWNlICovCi0JdW5zaWduZWQgY2hhciBudW1fcG9ydHM7CS8qIHRoZSBudW1iZXIgb2YgcG9ydHMgdGhpcyBkZXZpY2UgaGFzICovCi0JaW50IG51bV9pbnRyX2luOwkvKiBudW1iZXIgb2YgaW50ZXJydXB0IGluIGVuZHBvaW50cyB3ZSBoYXZlICovCi0JaW50IG51bV9idWxrX2luOwkvKiBudW1iZXIgb2YgYnVsayBpbiBlbmRwb2ludHMgd2UgaGF2ZSAqLwotCWludCBudW1fYnVsa19vdXQ7CS8qIG51bWJlciBvZiBidWxrIG91dCBlbmRwb2ludHMgd2UgaGF2ZSAqLwotCi0JQ1BDX1VTQl9SRUFEX1VSQl9UIHVyYnNbQ1BDX1VTQl9VUkJfQ05UXTsKLQotCXVuc2lnbmVkIGNoYXIgaW50cl9pbl9idWZmZXJbNF07CS8qIGludGVycnVwdCB0cmFuc2ZlciBidWZmZXIgKi8KLQlzdHJ1Y3QgdXJiICppbnRyX2luX3VyYjsJLyogaW50ZXJydXB0IHRyYW5zZmVyIHVyYiAqLwotCi0JQ1BDX1VTQl9XUklURV9VUkJfVCB3clVyYnNbQ1BDX1VTQl9VUkJfQ05UXTsKLQotCWludCBvcGVuOwkJLyogaWYgdGhlIHBvcnQgaXMgb3BlbiBvciBub3QgKi8KLQlpbnQgcHJlc2VudDsJCS8qIGlmIHRoZSBkZXZpY2UgaXMgbm90IGRpc2Nvbm5lY3RlZCAqLwotCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLwotCi0JaW50IGZyZWVfc2xvdHM7CQkvKiBmcmVlIHNlbmQgc2xvdHMgb2YgQ1BDLVVTQiAqLwotCWludCBpZHg7Ci0KLQlzcGlubG9ja190IHNsb2NrOwotCi0JY2hhciBzZXJpYWxOdW1iZXJbMTI4XTsJLyogc2VyaWFsIG51bWJlciAqLwotCWludCBwcm9kdWN0SWQ7CQkvKiBwcm9kdWN0IGlkIHRvIGRpZmZlciBiZXR3ZWVuIE0xNkMgYW5kIExQQzIxMTkgKi8KLQlDUENfQ0hBTl9UICpjaGFuOwotfSBDUENfVVNCX1Q7Ci0KLSNkZWZpbmUgQ1BDVGFibGUgICAgICAgICAgICAgICBDUENVU0JfVGFibGUKLQotI2RlZmluZSBDUENfRFJJVkVSX1ZFUlNJT04gIjAuNzI0IgotI2RlZmluZSBDUENfRFJJVkVSX1NFUklBTCAgIm5vdCBhcHBsaWNhYmxlIgotCi0jZGVmaW5lIE9CVUZfU0laRSAyNTUJCS8qIDQwOTYgKi8KLQotLyogcmVhZCB0aW1lb3V0cyAtLSBSRF9OQUtfVElNRU9VVCAqIFJEX0VYUElSRSA9IE51bWJlciBvZiBzZWNvbmRzICovCi0jZGVmaW5lIFJEX05BS19USU1FT1VUICgxMCpIWikJLyogRGVmYXVsdCBudW1iZXIgb2YgWCBzZWNvbmRzIHRvIHdhaXQgKi8KLSNkZWZpbmUgUkRfRVhQSVJFIDEyCQkvKiBOdW1iZXIgb2YgYXR0ZW1wdHMgdG8gd2FpdCBYIHNlY29uZHMgKi8KLQotI2RlZmluZSBDUENfVVNCX0JBU0VfTU5SIDAJLyogQ1BDLVVTQiBzdGFydCBhdCBtaW5vciAwICAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcGMtdXNiL3NqYTJtMTZjLmggYi9kcml2ZXJzL3N0YWdpbmcvY3BjLXVzYi9zamEybTE2Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTRiZDNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcGMtdXNiL3NqYTJtMTZjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jaWZuZGVmIF9TSkEyTTE2Q19ICi0jZGVmaW5lIF9TSkEyTTE2Q19ICi0KLSNpbmNsdWRlICJjcGMuaCIKLQotI2RlZmluZSBCQVVEUkFURV9UT0xFUkFOQ0VfUEVSQ0VOVAkxCi0jZGVmaW5lIFNBTVBMRVBPSU5UX1RPTEVSQU5DRV9QRVJDRU5UCTUKLSNkZWZpbmUgU0FNUExFUE9JTlRfVVBQRVJfTElNSVQJCTg4Ci0KLS8qIE0xNkMgcGFyYW1ldGVycyAqLwotc3RydWN0IEZJRUxEX0MwQ09OUiB7Ci0JdW5zaWduZWQgaW50IGJycDo0OwotCXVuc2lnbmVkIGludCBzYW06MTsKLQl1bnNpZ25lZCBpbnQgcHI6MzsKLQl1bnNpZ25lZCBpbnQgZHVtbXk6ODsKLX07Ci1zdHJ1Y3QgRklFTERfQzFDT05SIHsKLQl1bnNpZ25lZCBpbnQgcGgxOjM7Ci0JdW5zaWduZWQgaW50IHBoMjozOwotCXVuc2lnbmVkIGludCBzanc6MjsKLQl1bnNpZ25lZCBpbnQgZHVtbXk6ODsKLX07Ci10eXBlZGVmIHVuaW9uIEMwQ09OUiB7Ci0JdW5zaWduZWQgY2hhciBjMGNvbjsKLQlzdHJ1Y3QgRklFTERfQzBDT05SIGJjMGNvbjsKLX0gQzBDT05SX1Q7Ci10eXBlZGVmIHVuaW9uIEMxQ09OUiB7Ci0JdW5zaWduZWQgY2hhciBjMWNvbjsKLQlzdHJ1Y3QgRklFTERfQzFDT05SIGJjMWNvbjsKLX0gQzFDT05SX1Q7Ci0KLSNkZWZpbmUgU0pBX1RTRUcxCSgocFBhcmFtcy0+YnRyMSAmIDB4MGYpKzEpCi0jZGVmaW5lIFNKQV9UU0VHMgkoKChwUGFyYW1zLT5idHIxICYgMHg3MCk+PjQpKzEpCi0jZGVmaW5lIFNKQV9CUlAJCSgocFBhcmFtcy0+YnRyMCAmIDB4M2YpKzEpCi0jZGVmaW5lIFNKQV9TSlcJCSgocFBhcmFtcy0+YnRyMCAmIDB4YzApPj42KQotI2RlZmluZSBTSkFfU0FNCQkoKHBQYXJhbXMtPmJ0cjEgJiAweDgwKT4+NykKLWludCBiYXVkcmF0ZV9tMTZjKGludCBjbGssIGludCBicnAsIGludCBwciwgaW50IHBoMSwgaW50IHBoMik7Ci1pbnQgc2FtcGxlcG9pbnRfbTE2YyhpbnQgYnJwLCBpbnQgcHIsIGludCBwaDEsIGludCBwaDIpOwotaW50IFNKQTEwMDBfVE9fTTE2Q19CQVNJQ19QYXJhbXMoQ1BDX01TR19UICpwTXNnKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3BjLXVzYi9zamEybTE2Y18yLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3BjLXVzYi9zamEybTE2Y18yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDIzMGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NwYy11c2Ivc2phMm0xNmNfMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLDIwMDQgYnkgRU1TIERyLiBUaG9tYXMgV3VlbnNjaGUKLSoKLSogICAgICAgICAgICAgICAgICAtIEFsbCByaWdodHMgcmVzZXJ2ZWQgLQotKgotKiBUaGlzIGNvZGUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLCBlaXRoZXIKLSogZXhwcmVzc2VkIG9yIGltcGxpZWQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGxpYWJpbGl0eQotKiBjb25jZXJuaW5nIHRoZSBmcmVlZG9tIGZyb20gbWF0ZXJpYWwgZGVmZWN0cywgdGhlIGZpdG5lc3MgZm9yIHBhcnRpLQotKiBjdWxhciBwdXJwb3NlcyBvciB0aGUgZnJlZWRvbSBvZiBwcm9wcmlldGFyeSByaWdodHMgb2YgdGhpcmQgcGFydGllcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1vZHVsZSBuYW1lLjogY3BjdXNiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBJbmNsdWRlIGZpbGU6IGNwYy5oCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBQcm9qZWN0Li4uLi46IFdpbmRvd3MgRHJpdmVyIERldmVsb3BtZW50IEtpdAotKiBGaWxlbmFtZS4uLi46IHNqYTJtMTZjLmNwcAotKiBBdXRob3JzLi4uLi46IChHVSkgR2VyaGFyZCBVdHRlbnRoYWxlcgotKiAgICAgICAgICAgICAgIChDUykgQ2hyaXN0aWFuIFNjaG9ldHQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFNob3J0IGRlc2NyLjogY29udmVydHMgYmF1ZHJhdGUgYmV0d2VlbiBTSkExMDAwIGFuZCBNMTZDCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBEZXNjcmlwdGlvbi46IGhhbmRsZXMgdGhlIGJhdWRyYXRlIGNvbnZlcnNpb24gZnJvbSBTSkExMDAwIHBhcmFtZXRlcnMgdG8KLSogICAgICAgICAgICAgICBNMTZDIHBhcmFtZXRlcnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEFkZHJlc3MgICAgIDogRU1TIERyLiBUaG9tYXMgV3VlbnNjaGUKLSogICAgICAgICAgICAgICBTb25uZW5oYW5nIDMKLSogICAgICAgICAgICAgICBELTg1MzA0IElsbW11ZW5zdGVyCi0qICAgICAgICAgICAgICAgVGVsLiA6ICs0OS04NDQxLTQ5MDI2MAotKiAgICAgICAgICAgICAgIEZheC4gOiArNDktODQ0MS04MTg2MAotKiAgICAgICAgICAgICAgIGVtYWlsOiBzdXBwb3J0QGVtcy13dWVuc2NoZS5jb20KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpc3RvcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFZlcnNpb24gIERhdGUgICAgICAgIEF1dGggUmVtYXJrCi0qCi0qIDAxLjAwICAgID8/ICAgICAgICAgIEdVICAgLSBpbml0aWFsIHJlbGVhc2UKLSogMDEuMTAgICAgPz8/Pz8/Pz8/PyAgQ1MgICAtIGFkYXB0ZWQgdG8gZml0IGludG8gdGhlIFVTQiBXaW5kb3dzIGRyaXZlcgotKiAwMi4wMCAgICAxOC4wOC4yMDA0ICBHVSAgIC0gaW1wcm92ZWQgdGhlIGJhdWRyYXRlIGNhbGN1bGF0aW5nIGFsZ29yaXRobQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaW1wbGVtZW50ZWQgYWNjZXB0YW5jZSBmaWx0ZXJpbmcKLSogMDIuMTAgICAgMTAuMDkuMjAwNCAgQ1MgICAtIGFkYXB0ZWQgdG8gZml0IGludG8gdGhlIFVTQiBXaW5kb3dzIGRyaXZlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9EbydzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgSSBOIEMgTCBVIEQgRSBTCi0qLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0KLSNpbmNsdWRlICJjcGMuaCIKLSNpbmNsdWRlICJjcGNfaW50LmgiCi0jaW5jbHVkZSAiY3BjdXNiLmgiCi0KLSNpbmNsdWRlICJzamEybTE2Yy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGJhdWRyYXRlX20xNmMoaW50IGNsaywgaW50IGJycCwgaW50IHByLCBpbnQgcGgxLCBpbnQgcGgyKQotewotCXJldHVybiAoMTYwMDAwMDAgLyAoMSA8PCBjbGspKSAvIDIgLyAoYnJwICsgMSkgLyAoMSArIHByICsgMSArCi0JCQkJCQkJICAgIHBoMSArIDEgKyBwaDIgKwotCQkJCQkJCSAgICAxKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHNhbXBsZXBvaW50X20xNmMoaW50IGJycCwgaW50IHByLCBpbnQgcGgxLCBpbnQgcGgyKQotewotCXJldHVybiAoMTAwICogKDEgKyBwciArIDEgKyBwaDEgKyAxKSkgLyAoMSArIHByICsgMSArIHBoMSArIDEgKwotCQkJCQkJICBwaDIgKyAxKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBGdW5jdGlvbi4uLi4uOiBTSkExMDAwX1RPX00xNkNfQkFTSUNfUGFyYW1zCi0qCi0qIFRhc2suLi4uLi4uLi46IFRoaXMgcm91dGluZSBjb252ZXJ0cyBTSkExMDAwIENBTiBidHIgcGFyYW1ldGVycyBpbnRvIE0xNkMKLSogICAgICAgICAgICAgICAgcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUgc2FtcGxlIHBvaW50IGFuZCB0aGUgZXJyb3IuIEluCi0qICAgICAgICAgICAgICAgIGFkZGl0aW9uIGl0IGNvbnZlcnRzIHRoZSBhY2NlcHRhbmNlIGZpbHRlciBwYXJhbWV0ZXJzIHRvCi0qICAgICAgICAgICAgICAgIHN1aXQgdGhlIE0xNkMgcGFyYW1ldGVycwotKgotKiBQYXJhbWV0ZXJzLi4uOiBOb25lCi0qCi0qIFJldHVybiB2YWx1ZXM6IE5vbmUKLSoKLSogQ29tbWVudHMuLi4uLjoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgIEhpc3RvcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIDE5LjAxLjIwMDUgIENTICAgLSBtb2RpZmVkIHRoZSBjb252ZXJzaW9uIG9mIFNKQTEwMDAgZmlsdGVyIHBhcmFtcyBpbnRvCi0qICAgICAgICAgICAgICAgICAgICBNMTZDIHBhcmFtcy4gRHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3aXRoIHRoZQotKiAgICAgICAgICAgICAgICAgICAgb2xkZXIgODJDMjAwIENBTiBjb250cm9sbGVyIHRoZSBTSkExMDAwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFNKQTEwMDBfVE9fTTE2Q19CQVNJQ19QYXJhbXMoQ1BDX01TR19UICogaW4pCi17Ci0JaW50IHNqYUJhdWRyYXRlOwotCWludCBzamFTYW1wbGVwb2ludDsKLQlpbnQgKmJhdWRyYXRlX2Vycm9yOwkvLyBCUlBbMC4uMTVdLCBQUlswLi43XSwgUEgxWzAuLjddLCBQSDJbMC4uN10KLQlpbnQgKnNhbXBsZXBvaW50X2Vycm9yOwkvLyBCUlBbMC4uMTVdLCBQUlswLi43XSwgUEgxWzAuLjddLCBQSDJbMC4uN10KLQlpbnQgYmF1ZHJhdGVfZXJyb3JfbWVyazsKLQlpbnQgY2xrLCBicnAsIHByLCBwaDEsIHBoMjsKLQlpbnQgY2xrX21lcmssIGJycF9tZXJrLCBwcl9tZXJrLCBwaDFfbWVyaywgcGgyX21lcms7Ci0JaW50IGluZGV4OwotCXVuc2lnbmVkIGNoYXIgYWNjX2NvZGUwLCBhY2NfY29kZTEsIGFjY19jb2RlMiwgYWNjX2NvZGUzOwotCXVuc2lnbmVkIGNoYXIgYWNjX21hc2swLCBhY2NfbWFzazEsIGFjY19tYXNrMiwgYWNjX21hc2szOwotCUNQQ19NU0dfVCAqIG91dDsKLQlDMENPTlJfVCBjMGNvbjsKLQlDMUNPTlJfVCBjMWNvbjsKLQlpbnQgdG1wQWNjQ29kZTsKLQlpbnQgdG1wQWNjTWFzazsKLQotCSAgICAvLyB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIHBhcmFtZXRlcnMgaW50byBNMTZDIHBhcmFtZXRlcnMKLQkgICAgQ1BDX1NKQTEwMDBfUEFSQU1TX1QgKiBwUGFyYW1zOwotCi0JICAgIC8vIGNoZWNrIGlmIHRoZSB0eXBlIGlzIENBTiBwYXJhbWV0ZXJzIGFuZCBpZiB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIGdpdmVuIHBhcmFtcwotCSAgICBpZiAoaW4tPnR5cGUgIT0gQ1BDX0NNRF9UX0NBTl9QUk1TCi0JCXx8IGluLT5tc2cuY2FucGFyYW1zLmNjX3R5cGUgIT0gU0pBMTAwMCkKLQkJcmV0dXJuIDA7Ci0JcFBhcmFtcyA9Ci0JICAgIChDUENfU0pBMTAwMF9QQVJBTVNfVCAqKSAmIGluLT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5zamExMDAwOwotCWFjY19jb2RlMCA9IHBQYXJhbXMtPmFjY19jb2RlMDsKLQlhY2NfY29kZTEgPSBwUGFyYW1zLT5hY2NfY29kZTE7Ci0JYWNjX2NvZGUyID0gcFBhcmFtcy0+YWNjX2NvZGUyOwotCWFjY19jb2RlMyA9IHBQYXJhbXMtPmFjY19jb2RlMzsKLQlhY2NfbWFzazAgPSBwUGFyYW1zLT5hY2NfbWFzazA7Ci0JYWNjX21hc2sxID0gcFBhcmFtcy0+YWNjX21hc2sxOwotCWFjY19tYXNrMiA9IHBQYXJhbXMtPmFjY19tYXNrMjsKLQlhY2NfbWFzazMgPSBwUGFyYW1zLT5hY2NfbWFzazM7Ci0KLSNpZmRlZiBfREVCVUdfT1VUUFVUX0NBTl9QQVJBTVMKLQkgICAgaW5mbygiYWNjX2NvZGUwOiAlMi4yWGhcbiIsIGFjY19jb2RlMCk7Ci0JaW5mbygiYWNjX2NvZGUxOiAlMi4yWGhcbiIsIGFjY19jb2RlMSk7Ci0JaW5mbygiYWNjX2NvZGUyOiAlMi4yWGhcbiIsIGFjY19jb2RlMik7Ci0JaW5mbygiYWNjX2NvZGUzOiAlMi4yWGhcbiIsIGFjY19jb2RlMyk7Ci0JaW5mbygiYWNjX21hc2swOiAlMi4yWGhcbiIsIGFjY19tYXNrMCk7Ci0JaW5mbygiYWNjX21hc2sxOiAlMi4yWGhcbiIsIGFjY19tYXNrMSk7Ci0JaW5mbygiYWNjX21hc2syOiAlMi4yWGhcbiIsIGFjY19tYXNrMik7Ci0JaW5mbygiYWNjX21hc2szOiAlMi4yWGhcbiIsIGFjY19tYXNrMyk7Ci0KLSNlbmRpZgkvKiAgKi8KLQkgICAgaWYgKCEKLQkJIChiYXVkcmF0ZV9lcnJvciA9Ci0JCSAgKGludCAqKSB2bWFsbG9jKHNpemVvZihpbnQpICogMTYgKiA4ICogOCAqIDggKiA1KSkpIHsKLQkJZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC0zOwotCX0KLQlpZiAoIQotCSAgICAgIChzYW1wbGVwb2ludF9lcnJvciA9Ci0JICAgICAgIChpbnQgKikgdm1hbGxvYyhzaXplb2YoaW50KSAqIDE2ICogOCAqIDggKiA4ICogNSkpKSB7Ci0JCWVycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0JCXZmcmVlKGJhdWRyYXRlX2Vycm9yKTsKLQkJcmV0dXJuIC0zOwotCX0KLQltZW1zZXQoYmF1ZHJhdGVfZXJyb3IsIDB4ZmYsIHNpemVvZihiYXVkcmF0ZV9lcnJvcikpOwotCW1lbXNldChzYW1wbGVwb2ludF9lcnJvciwgMHhmZiwgc2l6ZW9mKGJhdWRyYXRlX2Vycm9yKSk7Ci0Jc2phQmF1ZHJhdGUgPQotCSAgICAxNjAwMDAwMCAvIDIgLyBTSkFfQlJQIC8gKDEgKyBTSkFfVFNFRzEgKyBTSkFfVFNFRzIpOwotCXNqYVNhbXBsZXBvaW50ID0KLQkgICAgMTAwICogKDEgKyBTSkFfVFNFRzEpIC8gKDEgKyBTSkFfVFNFRzEgKyBTSkFfVFNFRzIpOwotCWlmIChzamFCYXVkcmF0ZSA9PSAwKSB7Ci0JCXZmcmVlKGJhdWRyYXRlX2Vycm9yKTsKLQkJdmZyZWUoc2FtcGxlcG9pbnRfZXJyb3IpOwotCQlyZXR1cm4gLTI7Ci0JfQotCi0jaWZkZWYgX0RFQlVHX09VVFBVVF9DQU5fUEFSQU1TCi0JICAgIGluZm8oIlxuU3RhcnRpbmcgU0pBIENBTiBwYXJhbXNcbiIpOwotCWluZm8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCWluZm8oIlRTMSAgICAgOiAlMi4yWGggVFMyIDogJTIuMlhoXG4iLCBTSkFfVFNFRzEsIFNKQV9UU0VHMik7Ci0JaW5mbygiQlRSMCAgICA6ICUyLjJYaCBCVFIxOiAlMi4yWGhcbiIsIHBQYXJhbXMtPmJ0cjAsCi0JICAgICAgcFBhcmFtcy0+YnRyMSk7Ci0JaW5mbygiQmF1ZHJhdGU6ICVkLiVka0JhdWRcbiIsIHNqYUJhdWRyYXRlIC8gMTAwMCwKLQkgICAgICBzamFCYXVkcmF0ZSAlIDEwMDApOwotCWluZm8oIlNhbXBsZSBQOiAwLiVkXG4iLCBzamFTYW1wbGVwb2ludCk7Ci0JaW5mbygiXG4iKTsKLQotI2VuZGlmCS8qICAqLwotCSAgICBjMGNvbi5iYzBjb24uc2FtID0gU0pBX1NBTTsKLQljMWNvbi5iYzFjb24uc2p3ID0gU0pBX1NKVzsKLQotCSAgICAvLyBjYWxjdWxhdGUgZXJyb3JzIGZvciBhbGwgYmF1ZHJhdGVzCi0JICAgIGluZGV4ID0gMDsKLQlmb3IgKGNsayA9IDA7IGNsayA8IDU7IGNsaysrKSB7Ci0JCWZvciAoYnJwID0gMDsgYnJwIDwgMTY7IGJycCsrKSB7Ci0JCQlmb3IgKHByID0gMDsgcHIgPCA4OyBwcisrKSB7Ci0JCQkJZm9yIChwaDEgPSAwOyBwaDEgPCA4OyBwaDErKykgewotCQkJCQlmb3IgKHBoMiA9IDA7IHBoMiA8IDg7IHBoMisrKSB7Ci0JCQkJCQliYXVkcmF0ZV9lcnJvcltpbmRleF0gPQotCQkJCQkJICAgIDEwMCAqCi0JCQkJCQkgICAgYWJzKGJhdWRyYXRlX20xNmMKLQkJCQkJCQkoY2xrLCBicnAsIHByLCBwaDEsCi0JCQkJCQkJIHBoMikgLQotCQkJCQkJCXNqYUJhdWRyYXRlKSAvCi0JCQkJCQkgICAgc2phQmF1ZHJhdGU7Ci0JCQkJCQlzYW1wbGVwb2ludF9lcnJvcltpbmRleF0gPQotCQkJCQkJICAgIGFicyhzYW1wbGVwb2ludF9tMTZjCi0JCQkJCQkJKGJycCwgcHIsIHBoMSwKLQkJCQkJCQkgcGgyKSAtCi0JCQkJCQkJc2phU2FtcGxlcG9pbnQpOwotCi0jaWYgMAotCQkJCQkJICAgIGluZm8KLQkJCQkJCSAgICAoIkJhdWRyYXRlICAgICAgOiAlZCBrQmF1ZFxuIiwKLQkJCQkJCSAgICAgYmF1ZHJhdGVfbTE2YyhjbGssCi0JCQkJCQkJCSAgIGJycCwgcHIsCi0JCQkJCQkJCSAgIHBoMSwKLQkJCQkJCQkJICAgcGgyKSk7Ci0JCQkJCQlpbmZvCi0JCQkJCQkgICAgKCJCYXVkcmF0ZSBFcnJvcjogJWRcbiIsCi0JCQkJCQkgICAgIGJhdWRyYXRlX2Vycm9yCi0JCQkJCQkgICAgIFtpbmRleF0pOwotCQkJCQkJaW5mbwotCQkJCQkJICAgICgiU2FtcGxlIFAgRXJyb3I6ICVkXG4iLAotCQkJCQkJICAgICBzYW1wbGVwb2ludF9lcnJvcgotCQkJCQkJICAgICBbaW5kZXhdKTsKLQkJCQkJCWluZm8KLQkJCQkJCSAgICAoImNsayAgICAgICAgICAgOiAlZFxuIiwKLQkJCQkJCSAgICAgY2xrKTsKLQotI2VuZGlmCS8qICAqLwotCQkJCQkJICAgIGluZGV4Kys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkgICAgLy8gbWFyayBhbGwgYmF1ZHJhdGVfZXJyb3IgZW50cmllcyB3aGljaCBhcmUgb3V0ZXIgbGltaXRzCi0JICAgIGluZGV4ID0gMDsKLQlmb3IgKGNsayA9IDA7IGNsayA8IDU7IGNsaysrKSB7Ci0JCWZvciAoYnJwID0gMDsgYnJwIDwgMTY7IGJycCsrKSB7Ci0JCQlmb3IgKHByID0gMDsgcHIgPCA4OyBwcisrKSB7Ci0JCQkJZm9yIChwaDEgPSAwOyBwaDEgPCA4OyBwaDErKykgewotCQkJCQlmb3IgKHBoMiA9IDA7IHBoMiA8IDg7IHBoMisrKSB7Ci0JCQkJCQlpZiAoKGJhdWRyYXRlX2Vycm9yW2luZGV4XQotCQkJCQkJICAgICAgPgotCQkJCQkJICAgICAgQkFVRFJBVEVfVE9MRVJBTkNFX1BFUkNFTlQpCi0JCQkJCQkgICAgIHx8Ci0JCQkJCQkgICAgIChzYW1wbGVwb2ludF9lcnJvcgotCQkJCQkJICAgICAgIFtpbmRleF0gPgotCQkJCQkJICAgICAgIFNBTVBMRVBPSU5UX1RPTEVSQU5DRV9QRVJDRU5UKQotCQkJCQkJICAgICB8fAotCQkJCQkJICAgICAoc2FtcGxlcG9pbnRfbTE2YwotCQkJCQkJICAgICAgIChicnAsIHByLCBwaDEsCi0JCQkJCQkJcGgyKSA+Ci0JCQkJCQkgICAgICAgU0FNUExFUE9JTlRfVVBQRVJfTElNSVQpKQotCQkJCQkJewotCQkJCQkJCWJhdWRyYXRlX2Vycm9yCi0JCQkJCQkJICAgIFtpbmRleF0gPSAtMTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJICAgIGlmICgoKDEgKyBwciArIDEgKwotCQkJCQkJCSAgcGgxICsgMSArIHBoMiArCi0JCQkJCQkJICAxKSA8IDgpCi0JCQkJCQkJfHwKLQkJCQkJCQkoKDEgKyBwciArIDEgKwotCQkJCQkJCSAgcGgxICsgMSArIHBoMiArCi0JCQkJCQkJICAxKSA+IDI1KSkgewotCQkJCQkJCWJhdWRyYXRlX2Vycm9yCi0JCQkJCQkJICAgIFtpbmRleF0gPSAtMTsKLQkJCQkJCX0KLQotI2lmIDAKLQkJCQkJCSAgICBlbHNlIHsKLQkJCQkJCQlpbmZvCi0JCQkJCQkJICAgICgiQmF1ZHJhdGUgICAgICA6ICVkIGtCYXVkXG4iLAotCQkJCQkJCSAgICAgYmF1ZHJhdGVfbTE2YwotCQkJCQkJCSAgICAgKGNsaywgYnJwLCBwciwKLQkJCQkJCQkgICAgICBwaDEsIHBoMikpOwotCQkJCQkJCWluZm8KLQkJCQkJCQkgICAgKCJCYXVkcmF0ZSBFcnJvcjogJWRcbiIsCi0JCQkJCQkJICAgICBiYXVkcmF0ZV9lcnJvcgotCQkJCQkJCSAgICAgW2luZGV4XSk7Ci0JCQkJCQkJaW5mbwotCQkJCQkJCSAgICAoIlNhbXBsZSBQIEVycm9yOiAlZFxuIiwKLQkJCQkJCQkgICAgIHNhbXBsZXBvaW50X2Vycm9yCi0JCQkJCQkJICAgICBbaW5kZXhdKTsKLQkJCQkJCX0KLQotI2VuZGlmCS8qICAqLwotCQkJCQkJICAgIGluZGV4Kys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkgICAgLy8gZmluZCBsaXN0IG9mIG1pbmltdW0gb2YgYmF1ZHJhdGVfZXJyb3Igd2l0aGluIHVubWFya2VkIGVudHJpZXMKLQkgICAgY2xrX21lcmsgPSBicnBfbWVyayA9IHByX21lcmsgPSBwaDFfbWVyayA9IHBoMl9tZXJrID0gMDsKLQliYXVkcmF0ZV9lcnJvcl9tZXJrID0gMTAwOwotCWluZGV4ID0gMDsKLQlmb3IgKGNsayA9IDA7IGNsayA8IDU7IGNsaysrKSB7Ci0JCWZvciAoYnJwID0gMDsgYnJwIDwgMTY7IGJycCsrKSB7Ci0JCQlmb3IgKHByID0gMDsgcHIgPCA4OyBwcisrKSB7Ci0JCQkJZm9yIChwaDEgPSAwOyBwaDEgPCA4OyBwaDErKykgewotCQkJCQlmb3IgKHBoMiA9IDA7IHBoMiA8IDg7IHBoMisrKSB7Ci0JCQkJCQlpZiAoYmF1ZHJhdGVfZXJyb3JbaW5kZXhdCi0JCQkJCQkgICAgICE9IC0xKSB7Ci0JCQkJCQkJaWYgKGJhdWRyYXRlX2Vycm9yCi0JCQkJCQkJICAgICBbaW5kZXhdIDwKLQkJCQkJCQkgICAgIGJhdWRyYXRlX2Vycm9yX21lcmspCi0JCQkJCQkJewotCQkJCQkJCQliYXVkcmF0ZV9lcnJvcl9tZXJrCi0JCQkJCQkJCSAgICA9Ci0JCQkJCQkJCSAgICBiYXVkcmF0ZV9lcnJvcgotCQkJCQkJCQkgICAgW2luZGV4XTsKLQkJCQkJCQkJYnJwX21lcmsgPQotCQkJCQkJCQkgICAgYnJwOwotCQkJCQkJCQlwcl9tZXJrID0KLQkJCQkJCQkJICAgIHByOwotCQkJCQkJCQlwaDFfbWVyayA9Ci0JCQkJCQkJCSAgICBwaDE7Ci0JCQkJCQkJCXBoMl9tZXJrID0KLQkJCQkJCQkJICAgIHBoMjsKLQkJCQkJCQkJY2xrX21lcmsgPQotCQkJCQkJCQkgICAgY2xrOwotCi0jaWYgMAotCQkJCQkJCQkgICAgaW5mbwotCQkJCQkJCQkgICAgKCJicnA6ICUyLjJYaCBwcjogJTIuMlhoIHBoMTogJTIuMlhoIHBoMjogJTIuMlhoXG4iLAotCQkJCQkJCQkgICAgIGJycCwKLQkJCQkJCQkJICAgICBwciwKLQkJCQkJCQkJICAgICBwaDEsCi0JCQkJCQkJCSAgICAgcGgyKTsKLQkJCQkJCQkJaW5mbwotCQkJCQkJCQkgICAgKCJCYXVkcmF0ZSAgICAgIDogJWQga0JhdWRcbiIsCi0JCQkJCQkJCSAgICAgYmF1ZHJhdGVfbTE2YwotCQkJCQkJCQkgICAgIChjbGssCi0JCQkJCQkJCSAgICAgIGJycCwKLQkJCQkJCQkJICAgICAgcHIsCi0JCQkJCQkJCSAgICAgIHBoMSwKLQkJCQkJCQkJICAgICAgcGgyKSk7Ci0JCQkJCQkJCWluZm8KLQkJCQkJCQkJICAgICgiQmF1ZHJhdGUgRXJyb3I6ICVkXG4iLAotCQkJCQkJCQkgICAgIGJhdWRyYXRlX2Vycm9yCi0JCQkJCQkJCSAgICAgW2luZGV4XSk7Ci0JCQkJCQkJCWluZm8KLQkJCQkJCQkJICAgICgiU2FtcGxlIFAgRXJyb3I6ICVkXG4iLAotCQkJCQkJCQkgICAgIHNhbXBsZXBvaW50X2Vycm9yCi0JCQkJCQkJCSAgICAgW2luZGV4XSk7Ci0KLSNlbmRpZgkvKiAgKi8KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpbmRleCsrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmIChiYXVkcmF0ZV9lcnJvcl9tZXJrID09IDEwMCkgewotCQlpbmZvKCJFUlJPUjogQ291bGQgbm90IGNvbnZlcnQgQ0FOIGluaXQgcGFyYW1ldGVyXG4iKTsKLQkJdmZyZWUoYmF1ZHJhdGVfZXJyb3IpOwotCQl2ZnJlZShzYW1wbGVwb2ludF9lcnJvcik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkgICAgLy8gc2V0dGluZyBtMTZjIENBTiBwYXJhbWV0ZXIKLQkgICAgYzBjb24uYmMwY29uLmJycCA9IGJycF9tZXJrOwotCWMwY29uLmJjMGNvbi5wciA9IHByX21lcms7Ci0JYzFjb24uYmMxY29uLnBoMSA9IHBoMV9tZXJrOwotCWMxY29uLmJjMWNvbi5waDIgPSBwaDJfbWVyazsKLQotI2lmZGVmIF9ERUJVR19PVVRQVVRfQ0FOX1BBUkFNUwotCSAgICBpbmZvKCJcblJlc3VsdGluZyBNMTZDIENBTiBwYXJhbXNcbiIpOwotCWluZm8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCWluZm8oImNsayAgICAgOiAlMi4yWGhcbiIsIGNsa19tZXJrKTsKLQlpbmZvKCJwaDEgICAgIDogJTIuMlhoIHBoMjogJTIuMlhoXG4iLCBjMWNvbi5iYzFjb24ucGgxICsgMSwKLQkgICAgICBjMWNvbi5iYzFjb24ucGgyICsgMSk7Ci0JaW5mbygicHIgICAgICA6ICUyLjJYaCBicnA6ICUyLjJYaFxuIiwgYzBjb24uYmMwY29uLnByICsgMSwKLQkgICAgICBjMGNvbi5iYzBjb24uYnJwICsgMSk7Ci0JaW5mbygic2p3ICAgICA6ICUyLjJYaCBzYW06ICUyLjJYaFxuIiwgYzFjb24uYmMxY29uLnNqdywKLQkgICAgICBjMGNvbi5iYzBjb24uc2FtKTsKLQlpbmZvKCJjbzEgICAgIDogJTIuMlhoIGNvMDogJTIuMlhoXG4iLCBjMWNvbi5jMWNvbiwgYzBjb24uYzBjb24pOwotCWluZm8oIkJhdWRyYXRlOiAlZC4lZEJhdWRcbiIsCi0JICAgICAgIGJhdWRyYXRlX20xNmMoY2xrX21lcmssIGMwY29uLmJjMGNvbi5icnAsIGMwY29uLmJjMGNvbi5wciwKLQkJCSAgICAgYzFjb24uYmMxY29uLnBoMSwgYzFjb24uYmMxY29uLnBoMikgLyAxMDAwLAotCSAgICAgICBiYXVkcmF0ZV9tMTZjKGNsa19tZXJrLCBjMGNvbi5iYzBjb24uYnJwLCBjMGNvbi5iYzBjb24ucHIsCi0JCQkgICAgICBjMWNvbi5iYzFjb24ucGgxLCBjMWNvbi5iYzFjb24ucGgyKSAlIDEwMDApOwotCWluZm8oIlNhbXBsZSBQOiAwLiVkXG4iLAotCSAgICAgIHNhbXBsZXBvaW50X20xNmMoYzBjb24uYmMwY29uLmJycCwgYzBjb24uYmMwY29uLnByLAotCQkJICAgICAgIGMxY29uLmJjMWNvbi5waDEsIGMxY29uLmJjMWNvbi5waDIpKTsKLQlpbmZvKCJcbiIpOwotCi0jZW5kaWYJLyogICovCi0JICAgIG91dCA9IGluOwotCW91dC0+dHlwZSA9IDY7Ci0Jb3V0LT5sZW5ndGggPSBzaXplb2YoQ1BDX00xNkNfQkFTSUNfUEFSQU1TX1QpICsgMTsKLQlvdXQtPm1zZy5jYW5wYXJhbXMuY2NfdHlwZSA9IE0xNkNfQkFTSUM7Ci0Jb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmNvbjAgPSBjMGNvbi5jMGNvbjsKLQlvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuY29uMSA9IGMxY29uLmMxY29uOwotCW91dC0+bXNnLmNhbnBhcmFtcy5jY19wYXJhbXMubTE2Y19iYXNpYy5jdGxyMCA9IDB4NEM7Ci0Jb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmN0bHIxID0gMHgwMDsKLQlvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuY2xrID0gY2xrX21lcms7Ci0Jb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmFjY19zdGRfY29kZTAgPQotCSAgICBhY2NfY29kZTA7Ci0Jb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmFjY19zdGRfY29kZTEgPSBhY2NfY29kZTE7Ci0KLS8vICAgICAgaW5mbygiY29kZTA6IDB4JTIuMlgsIGNvZGUxOiAweCUyLjJYXG4iLCBvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX3N0ZF9jb2RlMCwgb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmFjY19zdGRfY29kZTEpOwotCSAgICB0bXBBY2NDb2RlID0gKGFjY19jb2RlMSA+PiA1KSArIChhY2NfY29kZTAgPDwgMyk7Ci0Jb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmFjY19zdGRfY29kZTAgPQotCSAgICAodW5zaWduZWQgY2hhcikgdG1wQWNjQ29kZTsKLQlvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX3N0ZF9jb2RlMSA9Ci0JICAgICh1bnNpZ25lZCBjaGFyKSAodG1wQWNjQ29kZSA+PiA4KTsKLQotLy8gICAgICBpbmZvKCJjb2RlMDogMHglMi4yWCwgY29kZTE6IDB4JTIuMlhcbiIsIG91dC0+bXNnLmNhbnBhcmFtcy5jY19wYXJhbXMubTE2Y19iYXNpYy5hY2Nfc3RkX2NvZGUwLCBvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX3N0ZF9jb2RlMSk7Ci0JICAgIG91dC0+bXNnLmNhbnBhcmFtcy5jY19wYXJhbXMubTE2Y19iYXNpYy5hY2Nfc3RkX21hc2swID0KLQkgICAgfmFjY19tYXNrMDsKLQlvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX3N0ZF9tYXNrMSA9Ci0JICAgIH5hY2NfbWFzazE7Ci0KLS8vICAgICAgaW5mbygibWFzazA6IDB4JTIuMlgsIG1hc2sxOiAweCUyLjJYXG4iLCBvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX3N0ZF9tYXNrMCwgb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmFjY19zdGRfbWFzazEpOwotCSAgICB0bXBBY2NNYXNrID0gKChhY2NfbWFzazEpID4+IDUpICsgKChhY2NfbWFzazApIDw8IDMpOwotCi0vLyAgICAgIGluZm8oInRtcEFjY01hc2s6IDB4JTQuNFhcbiIsIHRtcEFjY01hc2spOwotCSAgICBvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX3N0ZF9tYXNrMCA9Ci0JICAgICh1bnNpZ25lZCBjaGFyKSB+dG1wQWNjTWFzazsKLQlvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX3N0ZF9tYXNrMSA9Ci0JICAgICh1bnNpZ25lZCBjaGFyKSB+KHRtcEFjY01hc2sgPj4gOCk7Ci0KLS8vICAgICAgaW5mbygibWFzazA6IDB4JTIuMlgsIG1hc2sxOiAweCUyLjJYXG4iLCBvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX3N0ZF9tYXNrMCwgb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmFjY19zdGRfbWFzazEpOwotCSAgICBvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX2V4dF9jb2RlMCA9Ci0JICAgICh1bnNpZ25lZCBjaGFyKSB0bXBBY2NDb2RlOwotCW91dC0+bXNnLmNhbnBhcmFtcy5jY19wYXJhbXMubTE2Y19iYXNpYy5hY2NfZXh0X2NvZGUxID0KLQkgICAgKHVuc2lnbmVkIGNoYXIpICh0bXBBY2NDb2RlID4+IDgpOwotCW91dC0+bXNnLmNhbnBhcmFtcy5jY19wYXJhbXMubTE2Y19iYXNpYy5hY2NfZXh0X2NvZGUyID0gYWNjX2NvZGUyOwotCW91dC0+bXNnLmNhbnBhcmFtcy5jY19wYXJhbXMubTE2Y19iYXNpYy5hY2NfZXh0X2NvZGUzID0gYWNjX2NvZGUzOwotCW91dC0+bXNnLmNhbnBhcmFtcy5jY19wYXJhbXMubTE2Y19iYXNpYy5hY2NfZXh0X21hc2swID0KLQkgICAgKHVuc2lnbmVkIGNoYXIpIH50bXBBY2NNYXNrOwotCW91dC0+bXNnLmNhbnBhcmFtcy5jY19wYXJhbXMubTE2Y19iYXNpYy5hY2NfZXh0X21hc2sxID0KLQkgICAgKHVuc2lnbmVkIGNoYXIpIH4odG1wQWNjTWFzayA+PiA4KTsKLQlvdXQtPm1zZy5jYW5wYXJhbXMuY2NfcGFyYW1zLm0xNmNfYmFzaWMuYWNjX2V4dF9tYXNrMiA9Ci0JICAgIH5hY2NfbWFzazI7Ci0Jb3V0LT5tc2cuY2FucGFyYW1zLmNjX3BhcmFtcy5tMTZjX2Jhc2ljLmFjY19leHRfbWFzazMgPQotCSAgICB+YWNjX21hc2szOwotCXZmcmVlKGJhdWRyYXRlX2Vycm9yKTsKLQl2ZnJlZShzYW1wbGVwb2ludF9lcnJvcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9kY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2RzdC9kY29yZS5jCmluZGV4IGFjODU3NzMuLmMyNGU0ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvZGNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2Rjb3JlLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IHEtPnF1ZXVlZGF0YTsKIAlpbnQgZXJyID0gLUVJTzsKIAotCWlmIChiaW9fZW1wdHlfYmFycmllcihiaW8pICYmICFxLT5wcmVwYXJlX2Rpc2NhcmRfZm4pIHsKKwlpZiAoYmlvX2VtcHR5X2JhcnJpZXIoYmlvKSAmJiAhYmxrX3F1ZXVlX2Rpc2NhcmQocSkpIHsKIAkJLyoKIAkJICogVGhpcyBpcyBhIGRpcnR5XlduaWNlIGhhY2ssIGJ1dCBpZiB3ZSBjb21wbGV0ZSB0aGlzCiAJCSAqIG9wZXJhdGlvbiB3aXRoIC1FT1BOT1RTVVBQIGxpa2UgaW50ZW5kZWQsIFhGUwpAQCAtODQ3LDcgKzg0Nyw3IEBACiAvKgogICogQ29uZmlndXJhdGlvbiBwYXJzZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGNuX2RzdF9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2cpCitzdGF0aWMgdm9pZCBjbl9kc3RfY2FsbGJhY2soc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKm5zcCkKIHsKIAlzdHJ1Y3QgZHN0X2N0bCAqY3RsOwogCWludCBlcnI7CkBAIC04NTUsNiArODU1LDExIEBACiAJc3RydWN0IGRzdF9ub2RlICpuID0gTlVMTCwgKnRtcDsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIAorCWlmICghY2FwX3JhaXNlZChuc3AtPmVmZl9jYXAsIENBUF9TWVNfQURNSU4pKSB7CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKG1zZy0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBkc3RfY3RsKSkgewogCQllcnIgPSAtRUJBRE1TRzsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9hZGRyZXNzX21hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfYWRkcmVzc19tYXAuaAppbmRleCA2Mjk0ZDM4Li4yYzNkNjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9hZGRyZXNzX21hcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2FkZHJlc3NfbWFwLmgKQEAgLTIyMyw3ICsyMjMsNyBAQAogCiBleHRlcm4gaW5saW5lIHZvaWQgYWRkXzEwYml0KHUzMiAqdiwgaW50IG4pCiB7Ci0JKnYgPSBJTkRFWDEwKCp2ICsgbik7CisJKnYgPSBJTkRFWDEwKCp2ICsgbikgfCAoKnYgJiBFVF9ETUExMF9XUkFQKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5jCmluZGV4IDhmMmU5MWYuLjEwZTIxZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguYwpAQCAtMTE3NywxMiArMTE3NywyMCBAQAogCiBzdGF0aWMgaW5saW5lIHUzMiBidW1wX2Zicih1MzIgKmZiciwgdTMyIGxpbWl0KQogewotCXUzMiB2ID0gKmZicjsKLQlhZGRfMTBiaXQoJnYsIDEpOwotCWlmICh2ID4gbGltaXQpCi0JCXYgPSAoKmZiciAmIH5FVF9ETUExMF9NQVNLKSBeIEVUX0RNQTEwX1dSQVA7Ci0JKmZiciA9IHY7Ci0JcmV0dXJuIHY7CisgICAgICAgIHUzMiB2ID0gKmZicjsKKyAgICAgICAgdisrOworICAgICAgICAvKiBUaGlzIHdvcmtzIGZvciBhbGwgY2FzZXMgd2hlcmUgbGltaXQgPCAxMDI0LiBUaGUgMTAyMyBjYXNlCisgICAgICAgICAgIHdvcmtzIGJlY2F1c2UgMTAyMysrIGlzIDEwMjQgd2hpY2ggbWVhbnMgdGhlIGlmIGNvbmRpdGlvbiBpcyBub3QKKyAgICAgICAgICAgdGFrZW4gYnV0IHRoZSBjYXJyeSBvZiB0aGUgYml0IGludG8gdGhlIHdyYXAgYml0IHRvZ2dsZXMgdGhlIHdyYXAKKyAgICAgICAgICAgdmFsdWUgY29ycmVjdGx5ICovCisgICAgICAgIGlmICgodiAmIEVUX0RNQTEwX01BU0spID4gbGltaXQpIHsKKyAgICAgICAgICAgICAgICB2ICY9IH5FVF9ETUExMF9NQVNLOworICAgICAgICAgICAgICAgIHYgXj0gRVRfRE1BMTBfV1JBUDsKKyAgICAgICAgfQorICAgICAgICAvKiBGb3IgdGhlIDEwMjMgY2FzZSAqLworICAgICAgICB2ICY9IChFVF9ETUExMF9NQVNLfEVUX0RNQTEwX1dSQVApOworICAgICAgICAqZmJyID0gdjsKKyAgICAgICAgcmV0dXJuIHY7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKaW5kZXggZDE0ZWE4NC4uMTMwMWNhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlCkBAIC0zMiw4ICszMiwzIEBACiAKIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcwogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKLQotIyBVYnVudHUgOC4wNCBoYXMgQ09ORklHX1NORCB1bmRlZmluZWQsIHNvIGluY2x1ZGUgbHVtIHNvdW5kL2NvbmZpZy5oIHRvbwotaWZlcSAoJChDT05GSUdfU05EKSwpCi1FWFRSQV9DRkxBR1MgKz0gLWluY2x1ZGUgc291bmQvY29uZmlnLmgKLWVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvQ2hhbm5lbE1nbXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9DaGFubmVsTWdtdC5oCmluZGV4IGE4MzlkOGYuLmZhOTczZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9DaGFubmVsTWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9DaGFubmVsTWdtdC5oCkBAIC0yNiw2ICsyNiw3IEBACiAjZGVmaW5lIF9DSEFOTkVMX01HTVRfSF8KIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgIlJpbmdCdWZmZXIuaCIKICNpbmNsdWRlICJWbWJ1c0NoYW5uZWxJbnRlcmZhY2UuaCIKICNpbmNsdWRlICJWbWJ1c1BhY2tldEZvcm1hdC5oIgpAQCAtNTQsNyArNTUsNyBAQAogCUNoYW5uZWxNZXNzYWdlVmlld1JhbmdlUmVtb3ZlCQk9IDE4LAogI2VuZGlmCiAJQ2hhbm5lbE1lc3NhZ2VDb3VudAotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK307CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIHsKIAllbnVtIHZtYnVzX2NoYW5uZWxfbWVzc2FnZV90eXBlIE1lc3NhZ2VUeXBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L05ldFZzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L05ldFZzYy5jCmluZGV4IDE2MTBiODQuLmQzODRjMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9OZXRWc2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvTmV0VnNjLmMKQEAgLTEwNTIsNyArMTA1Miw3IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0KSkgewotCQlsaXN0X21vdmVfdGFpbCgmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCwgJmxpc3RIZWFkKTsKKwkJbGlzdF9tb3ZlX3RhaWwobmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdC5uZXh0LCAmbGlzdEhlYWQpOwogCQlpZiAoKytjb3VudCA9PSB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZUNvdW50ICsgMSkKIAkJCWJyZWFrOwogCX0KQEAgLTEwNzEsNyArMTA3MSw3IEBACiAJCS8qIFJldHVybiBpdCB0byB0aGUgZnJlZWxpc3QgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7CiAJCWZvciAoaSA9IGNvdW50OyBpICE9IDA7IGktLSkgewotCQkJbGlzdF9tb3ZlX3RhaWwoJmxpc3RIZWFkLAorCQkJbGlzdF9tb3ZlX3RhaWwobGlzdEhlYWQubmV4dCwKIAkJCQkgICAgICAgJm5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QpOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLApAQCAtMTA4NSw4ICsxMDg1LDcgQEAKIAl9CiAKIAkvKiBSZW1vdmUgdGhlIDFzdCBwYWNrZXQgdG8gcmVwcmVzZW50IHRoZSB4ZmVyIHBhZ2UgcGFja2V0IGl0c2VsZiAqLwotCXhmZXJwYWdlUGFja2V0ID0gbGlzdF9lbnRyeSgmbGlzdEhlYWQsIHN0cnVjdCB4ZmVycGFnZV9wYWNrZXQsCi0JCQkJICAgIExpc3RFbnRyeSk7CisJeGZlcnBhZ2VQYWNrZXQgPSAoc3RydWN0IHhmZXJwYWdlX3BhY2tldCopbGlzdEhlYWQubmV4dDsKIAlsaXN0X2RlbCgmeGZlcnBhZ2VQYWNrZXQtPkxpc3RFbnRyeSk7CiAKIAkvKiBUaGlzIGlzIGhvdyBtdWNoIHdlIGNhbiBzYXRpc2Z5ICovCkBAIC0xMTAyLDggKzExMDEsNyBAQAogCiAJLyogRWFjaCByYW5nZSByZXByZXNlbnRzIDEgUk5ESVMgcGt0IHRoYXQgY29udGFpbnMgMSBldGhlcm5ldCBmcmFtZSAqLwogCWZvciAoaSA9IDA7IGkgPCAoY291bnQgLSAxKTsgaSsrKSB7Ci0JCW5ldHZzY1BhY2tldCA9IGxpc3RfZW50cnkoJmxpc3RIZWFkLCBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCwKLQkJCQkJICBMaXN0RW50cnkpOworCQluZXR2c2NQYWNrZXQgPSAoc3RydWN0IGh2X25ldHZzY19wYWNrZXQqKWxpc3RIZWFkLm5leHQ7CiAJCWxpc3RfZGVsKCZuZXR2c2NQYWNrZXQtPkxpc3RFbnRyeSk7CiAKIAkJLyogSW5pdGlhbGl6ZSB0aGUgbmV0dnNjIHBhY2tldCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvaHYvVE9ETwppbmRleCA0ZDM5MGIyLi5kYmZiZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvVE9ETwpAQCAtMSwxMSArMSwxNyBAQAogVE9ETzoKIAktIGZpeCByZW1haW5pbmcgY2hlY2twYXRjaCB3YXJuaW5ncyBhbmQgZXJyb3JzCisJLSB1c2Ugb2YgLyoqIHdoZW4gaXQgaXMgbm90IGEga2VybmVsZG9jIGhlYWRlcgogCS0gcmVtb3ZlIFJpbmdCdWZmZXIuYyB0byB1cyBpbi1rZXJuZWwgcmluZ2J1ZmZlciBmdW5jdGlvbnMgaW5zdGVhZC4KIAktIGF1ZGl0IHRoZSB2bWJ1cyB0byB2ZXJpZnkgaXQgaXMgd29ya2luZyBwcm9wZXJseSB3aXRoIHRoZQogCSAgZHJpdmVyIG1vZGVsCisJLSBjb252ZXJ0IHZtYnVzIGRyaXZlciBpbnRlcmZhY2UgZnVuY3Rpb24gcG9pbnRlciB0YWJsZXMKKyAgICAgICAgICB0byBjb25zdGFudCwgYS5rLmEgdm1idXNfb3BzCiAJLSBzZWUgaWYgdGhlIHZtYnVzIGNhbiBiZSBtZXJnZWQgd2l0aCB0aGUgb3RoZXIgdmlydHVhbCBidXNzZXMKIAkgIGluIHRoZSBrZXJuZWwKIAktIGF1ZGl0IHRoZSBuZXR3b3JrIGRyaXZlcgorCSAgLSB1c2UgZXhpc3RpbmcgbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3QgaW4gbmV0d29yayBkZXZpY2UKKwkgIC0gY2hlY2tpbmcgZm9yIGNhcnJpZXIgaW5zaWRlIG9wZW4gaXMgd3JvbmcsIG5ldHdvcmsgZGV2aWNlIEFQSQorICAgICAgICAgICAgY29uZnVzaW9uPz8KIAktIGF1ZGl0IHRoZSBibG9jayBkcml2ZXIKIAktIGF1ZGl0IHRoZSBzY3NpIGRyaXZlcgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmMKaW5kZXggOGZlNTQzYi4uM2E0NzkzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L29zZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmgKaW5kZXggOTUwNDYwNC4uY2UwNjRlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L29zZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuaApAQCAtMjUsNiArMjUsNyBAQAogI2lmbmRlZiBfT1NEX0hfCiAjZGVmaW5lIF9PU0RfSF8KIAorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAvKiBEZWZpbmVzICovCiAjZGVmaW5lIEFMSUdOX1VQKHZhbHVlLCBhbGlnbikJKCgodmFsdWUpICYgKGFsaWduLTEpKSA/CQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfZHJ2LmMKaW5kZXggNTgyMzE4Zi4uODk0ZWVjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19kcnYuYwpAQCAtNTA3LDEyICs1MDcsMTIgQEAKIAogCWNoaWxkX2RldmljZV9vYmogPSAmY2hpbGRfZGV2aWNlX2N0eC0+ZGV2aWNlX29iajsKIAljaGlsZF9kZXZpY2Vfb2JqLT5jb250ZXh0ID0gY29udGV4dDsKLQltZW1jcHkoJmNoaWxkX2RldmljZV9vYmotPmRldmljZVR5cGUsICZ0eXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQltZW1jcHkoJmNoaWxkX2RldmljZV9vYmotPmRldmljZUluc3RhbmNlLCAmaW5zdGFuY2UsCisJbWVtY3B5KCZjaGlsZF9kZXZpY2Vfb2JqLT5kZXZpY2VUeXBlLCB0eXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwltZW1jcHkoJmNoaWxkX2RldmljZV9vYmotPmRldmljZUluc3RhbmNlLCBpbnN0YW5jZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKLQltZW1jcHkoJmNoaWxkX2RldmljZV9jdHgtPmNsYXNzX2lkLCAmdHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7Ci0JbWVtY3B5KCZjaGlsZF9kZXZpY2VfY3R4LT5kZXZpY2VfaWQsICZpbnN0YW5jZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisJbWVtY3B5KCZjaGlsZF9kZXZpY2VfY3R4LT5jbGFzc19pZCwgdHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisJbWVtY3B5KCZjaGlsZF9kZXZpY2VfY3R4LT5kZXZpY2VfaWQsIGluc3RhbmNlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAogCURQUklOVF9FWElUKFZNQlVTX0RSVik7CiAKQEAgLTUzNywxOCArNTM3LDcgQEAKIAlEUFJJTlRfREJHKFZNQlVTX0RSViwgImNoaWxkIGRldmljZSAoJXApIHJlZ2lzdGVyaW5nIiwKIAkJICAgY2hpbGRfZGV2aWNlX2N0eCk7CiAKLQkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCByZWdpc3RlcmVkIGFscmVhZHkgKi8KLQlpZiAoc3RybGVuKGRldl9uYW1lKCZjaGlsZF9kZXZpY2VfY3R4LT5kZXZpY2UpKSAhPSAwKSB7Ci0JCURQUklOVF9FUlIoVk1CVVNfRFJWLAotCQkJICAgImNoaWxkIGRldmljZSAoJXApIGFscmVhZHkgcmVnaXN0ZXJlZCAtIGJ1c2lkICVzIiwKLQkJCSAgIGNoaWxkX2RldmljZV9jdHgsCi0JCQkgICBkZXZfbmFtZSgmY2hpbGRfZGV2aWNlX2N0eC0+ZGV2aWNlKSk7Ci0KLQkJcmV0ID0gLTE7Ci0JCWdvdG8gQ2xlYW51cDsKLQl9Ci0KLQkvKiBTZXQgdGhlIGRldmljZSBidXMgaWQuIE90aGVyd2lzZSwgZGV2aWNlX3JlZ2lzdGVyKCl3aWxsIGZhaWwuICovCisJLyogU2V0IHRoZSBkZXZpY2UgbmFtZS4gT3RoZXJ3aXNlLCBkZXZpY2VfcmVnaXN0ZXIoKSB3aWxsIGZhaWwuICovCiAJZGV2X3NldF9uYW1lKCZjaGlsZF9kZXZpY2VfY3R4LT5kZXZpY2UsICJ2bWJ1c18wXyVkIiwKIAkJICAgICBhdG9taWNfaW5jX3JldHVybigmZGV2aWNlX251bSkpOwogCkBAIC01NzMsNyArNTYyLDYgQEAKIAkJRFBSSU5UX0lORk8oVk1CVVNfRFJWLCAiY2hpbGQgZGV2aWNlICglcCkgcmVnaXN0ZXJlZCIsCiAJCQkgICAgJmNoaWxkX2RldmljZV9jdHgtPmRldmljZSk7CiAKLUNsZWFudXA6CiAJRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKIAogCXJldHVybiByZXQ7CkBAIC02MjMsOCArNjExLDYgQEAKIHN0YXRpYyBpbnQgdm1idXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQogewogCXN0cnVjdCBkZXZpY2VfY29udGV4dCAqZGV2aWNlX2N0eCA9IGRldmljZV90b19kZXZpY2VfY29udGV4dChkZXZpY2UpOwotCWludCBpID0gMDsKLQlpbnQgbGVuID0gMDsKIAlpbnQgcmV0OwogCiAJRFBSSU5UX0VOVEVSKFZNQlVTX0RSVik7CkBAIC02NDQsOCArNjMwLDYgQEAKIAkJICAgIGRldmljZV9jdHgtPmNsYXNzX2lkLmRhdGFbMTRdLAogCQkgICAgZGV2aWNlX2N0eC0+Y2xhc3NfaWQuZGF0YVsxNV0pOwogCi0JZW52LT5lbnZwX2lkeCA9IGk7Ci0JZW52LT5idWZsZW4gPSBsZW47CiAJcmV0ID0gYWRkX3VldmVudF92YXIoZW52LCAiVk1CVVNfREVWSUNFX0NMQVNTX0dVSUQ9eyIKIAkJCSAgICAgIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgogCQkJICAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9IiwKQEAgLTY5MSw4ICs2NzUsNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQllbnYtPmVudnBbZW52LT5lbnZwX2lkeF0gPSBOVUxMOwotCiAJRFBSSU5UX0VYSVQoVk1CVVNfRFJWKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCmluZGV4IGJlYjk5YTUuLjQ1ODY2NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKQEAgLTQsNiArNCw3IEBACiAKIG1lbnVjb25maWcgSUlPCiAJdHJpc3RhdGUgIkluZHVzdHJpYWwgSS9PIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAhUzM5MAogCS0tLWhlbHAtLS0KIAkgIFRoZSBpbmR1c3RyaWFsIEkvTyBzdWJzeXN0ZW0gcHJvdmlkZXMgYSB1bmlmaWVkIGZyYW1ld29yayBmb3IKIAkgIGRyaXZlcnMgZm9yIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIGVtYmVkZGVkIHNlbnNvcnMgdXNpbmcgYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jCmluZGV4IDFmYTE4ZjIuLjc2OGY0NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSAiaWlvLmgiCiAjaW5jbHVkZSAidHJpZ2dlcl9jb25zdW1lci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjEuYwppbmRleCBlYThhNWVmLi5mYzIxMDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjEuYwpAQCAtMjM5LDEwICsyMzksNiBAQAogCXJldHVybiB0c2wyNTYxX3Bvd2VyZG93bihjbGllbnQpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDI5LCAweDM5LCAweDQ5LCBJMkNfQ0xJRU5UX0VORCB9OwotCi1JMkNfQ0xJRU5UX0lOU01PRDsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRzbDI1NjFfaWRbXSA9IHsKIAl7ICJ0c2wyNTYxIiwgMCB9LAogCXsgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL0tjb25maWcKaW5kZXggZDU0OWQwOC4uZjZjYzI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIE9UVVMKIAl0cmlzdGF0ZSAiQXRoZXJvcyBPVFVTIDgwMi4xMW4gVVNCIHdpcmVsZXNzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0IgJiYgV0xBTl84MDIxMSAmJiBNQUM4MDIxMQorCWRlcGVuZHMgb24gVVNCICYmIFdMQU4gJiYgTUFDODAyMTEKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQXRoZXJvcyA4MDIuMTFuIFVTQiBoYXJkd2FyZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wOWF1dGgvcDlhdXRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcDlhdXRoL3A5YXV0aC5jCmluZGV4IDkxMTFkY2IuLjhjY2ZmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wOWF1dGgvcDlhdXRoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3A5YXV0aC9wOWF1dGguYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJdXNlcl9idWZfcnVubmluZyA9IE5VTEw7CiAJaGFzaF9zdHIgPSBOVUxMOwogCW5vZGVfcHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNhcF9ub2RlKSwgR0ZQX0tFUk5FTCk7Ci0JdXNlcl9idWYgPSBremFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwl1c2VyX2J1ZiA9IGt6YWxsb2MoY291bnQrMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlX3B0ciB8fCAhdXNlcl9idWYpCiAJCWdvdG8gb3V0OwogCkBAIC0yMDcsNiArMjA3LDcgQEAKIAkJbGlzdF9hZGQoJihub2RlX3B0ci0+bGlzdCksICYoZGV2LT5oZWFkLT5saXN0KSk7CiAJCW5vZGVfcHRyID0gTlVMTDsKIAl9IGVsc2UgeworCQljaGFyICp0bXB1OwogCQlpZiAoIWNhcF9kZXZpY2VzWzBdLmhlYWQgfHwKIAkJCQlsaXN0X2VtcHR5KCYoY2FwX2RldmljZXNbMF0uaGVhZC0+bGlzdCkpKSB7CiAJCQlyZXR2YWwgPSAtRUlOVkFMOwpAQCAtMjE4LDEwICsyMTksMTAgQEAKIAkJICogbmVlZCB0byBzcGxpdCBpdCBhbmQgaGFzaCAndXNlcjFAdXNlcjInIHVzaW5nICdyYW5kb21zdHJpbmcnCiAJCSAqIGFzIHRoZSBrZXkuCiAJCSAqLwotCQl1c2VyX2J1Zl9ydW5uaW5nID0ga3N0cmR1cCh1c2VyX2J1ZiwgR0ZQX0tFUk5FTCk7Ci0JCXNvdXJjZV91c2VyID0gc3Ryc2VwKCZ1c2VyX2J1Zl9ydW5uaW5nLCAiQCIpOwotCQl0YXJnZXRfdXNlciA9IHN0cnNlcCgmdXNlcl9idWZfcnVubmluZywgIkAiKTsKLQkJcmFuZF9zdHIgPSBzdHJzZXAoJnVzZXJfYnVmX3J1bm5pbmcsICJAIik7CisJCXRtcHUgPSB1c2VyX2J1Zl9ydW5uaW5nID0ga3N0cmR1cCh1c2VyX2J1ZiwgR0ZQX0tFUk5FTCk7CisJCXNvdXJjZV91c2VyID0gc3Ryc2VwKCZ0bXB1LCAiQCIpOworCQl0YXJnZXRfdXNlciA9IHN0cnNlcCgmdG1wdSwgIkAiKTsKKwkJcmFuZF9zdHIgPSB0bXB1OwogCQlpZiAoIXNvdXJjZV91c2VyIHx8ICF0YXJnZXRfdXNlciB8fCAhcmFuZF9zdHIpIHsKIAkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKQEAgLTIyOSw3ICsyMzAsOCBAQAogCiAJCS8qIGhhc2ggdGhlIHN0cmluZyB1c2VyMUB1c2VyMiB3aXRoIHJhbmRfc3RyIGFzIHRoZSBrZXkgKi8KIAkJbGVuID0gc3RybGVuKHNvdXJjZV91c2VyKSArIHN0cmxlbih0YXJnZXRfdXNlcikgKyAxOwotCQloYXNoX3N0ciA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJLyogc3JjLCBALCBsZW4sIFwwICovCisJCWhhc2hfc3RyID0ga3phbGxvYyhsZW4rMSwgR0ZQX0tFUk5FTCk7CiAJCXN0cmNhdChoYXNoX3N0ciwgc291cmNlX3VzZXIpOwogCQlzdHJjYXQoaGFzaF9zdHIsICJAIik7CiAJCXN0cmNhdChoYXNoX3N0ciwgdGFyZ2V0X3VzZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwppbmRleCBkZDdkM2ZkLi40Y2UzOTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwpAQCAtMjA3MSwxMSArMjA3MSwxNSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGtleXBhZF9lbmFibGVkICYmIGtleXBhZF9pbml0aWFsaXplZCkKKwlpZiAoa2V5cGFkX2VuYWJsZWQgJiYga2V5cGFkX2luaXRpYWxpemVkKSB7CiAJCW1pc2NfZGVyZWdpc3Rlcigma2V5cGFkX2Rldik7CisJCWtleXBhZF9pbml0aWFsaXplZCA9IDA7CisJfQogCi0JaWYgKGxjZF9lbmFibGVkICYmIGxjZF9pbml0aWFsaXplZCkKKwlpZiAobGNkX2VuYWJsZWQgJiYgbGNkX2luaXRpYWxpemVkKSB7CiAJCW1pc2NfZGVyZWdpc3RlcigmbGNkX2Rldik7CisJCWxjZF9pbml0aWFsaXplZCA9IDA7CisJfQogCiAJcGFycG9ydF9yZWxlYXNlKHBwcnQpOwogCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHBydCk7CkBAIC0yMjExLDEzICsyMjE1LDE2IEBACiAJCWRlbF90aW1lcigmc2Nhbl90aW1lcik7CiAKIAlpZiAocHBydCAhPSBOVUxMKSB7Ci0JCWlmIChrZXlwYWRfZW5hYmxlZCkKKwkJaWYgKGtleXBhZF9lbmFibGVkKSB7CiAJCQltaXNjX2RlcmVnaXN0ZXIoJmtleXBhZF9kZXYpOworCQkJa2V5cGFkX2luaXRpYWxpemVkID0gMDsKKwkJfQogCiAJCWlmIChsY2RfZW5hYmxlZCkgewogCQkJcGFuZWxfbGNkX3ByaW50KCJceDBjTENEIGRyaXZlciAiIFBBTkVMX1ZFUlNJT04KIAkJCQkJIlxudW5sb2FkZWQuXHgxYltMY1x4MWJbTGJceDFiW0wtIik7CiAJCQltaXNjX2RlcmVnaXN0ZXIoJmxjZF9kZXYpOworCQkJbGNkX2luaXRpYWxpemVkID0gMDsKIAkJfQogCiAJCS8qIFRPRE86IGZyZWUgYWxsIGlucHV0IHNpZ25hbHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYyBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYwppbmRleCAwZDExMWRkLi4yZWI4ZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAicG9jaC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvY29uZmlnLmMKaW5kZXggOTBmOTYyZS4uNWQwNGJmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9jb25maWcuYwpAQCAtNTI3LDEwICs1MjcsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBwb2htZWxmc19jbl9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2cpCitzdGF0aWMgdm9pZCBwb2htZWxmc19jbl9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2csIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqbnNwKQogewogCWludCBlcnI7CiAKKwlpZiAoIWNhcF9yYWlzZWQobnNwLT5lZmZfY2FwLCBDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuOworCiAJc3dpdGNoIChtc2ctPmZsYWdzKSB7CiAJCWNhc2UgUE9ITUVMRlNfRkxBR1NfQUREOgogCQljYXNlIFBPSE1FTEZTX0ZMQUdTX0RFTDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZwppbmRleCA3ZjQ0ZTVlLi5lZmUzOGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogY29uZmlnIFJUMjg2MAogCXRyaXN0YXRlICJSYWxpbmsgMjg2MCB3aXJlbGVzcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOXzgwMjExCisJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2ICYmIFdMQU4KIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHRoZSBSYWxpbmsgMjg2MCB3aXJlbGVzcyBjaGlwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jCmluZGV4IGZiMTczNTUuLjg1N2ZmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhXzI4NjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMKQEAgLTM2Myw2ICszNjMsOCBAQAogCVVMT05HCQkJU3dJZHggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OwogCiAJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworCWlmICghcFR4RCkKKwkJcmV0dXJuIDA7CiAKIAlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKIAlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYwppbmRleCA5ZDU4OWMyLi4wMTljYzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMKQEAgLTI1LDYgKzI1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAogSU5UCVNob3dfU1NJRF9Qcm9jKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCmluZGV4IGIzOTZhOWIuLmVkMjdiODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKQEAgLTI1LDYgKzI1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAicnRfY29uZmlnLmgiCiAKIFVMT05HCVJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnCmluZGV4IDc2ODQxZjYuLmFlYTVjODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjb25maWcgUlQyODcwCiAJdHJpc3RhdGUgIlJhbGluayAyODcwLzMwNzAgd2lyZWxlc3Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBYODYgJiYgV0xBTl84MDIxMQorCWRlcGVuZHMgb24gVVNCICYmIFg4NiAmJiBXTEFOCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIHh4NzAgd2lyZWxlc3MgY2hpcHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL0tjb25maWcKaW5kZXggMjU1ZThlYS4uMmIzZjc0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKIGNvbmZpZyBSVDMwOTAKIAl0cmlzdGF0ZSAiUmFsaW5rIDMwOTAgd2lyZWxlc3Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYgJiYgV0xBTl84MDIxMQorCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDMwOTAgd2lyZWxlc3MgY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9pbmZvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1faW5mby5jCmluZGV4IDViZTA3MTQuLjNlNTFlOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9pbmZvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2luZm8uYwpAQCAtMzQsNiArMzQsNyBAQAogICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2xpbnV4LmMKaW5kZXggZDIyNDFlYy4uOWI5NGFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbGludXguYwpAQCAtMjUsNiArMjUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJydF9jb25maWcuaCIKIAogVUxPTkcJUlREZWJ1Z0xldmVsID0gUlRfREVCVUdfRVJST1I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcKaW5kZXggMjM2ZTQyNy4uMjAzYzc5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBSVEw4MTg3U0UKIAl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTg3U0UgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBXTEFOCiAJZGVwZW5kcyBvbiBXSVJFTEVTU19FWFQKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCmluZGV4IDAxM2MzZTEuLjRjNWQ2M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCkBAIC01MywxMCArNTMsOCBAQAogCiAJCWxpc3RfZGVsKHB0cik7CiAKLQkJaWYgKGVudHJ5LT5vcHMpIHsKKwkJaWYgKGVudHJ5LT5vcHMpCiAJCQllbnRyeS0+b3BzLT5kZWluaXQoZW50cnktPnByaXYpOwotCQkJbW9kdWxlX3B1dChlbnRyeS0+b3BzLT5vd25lcik7Ci0JCX0KIAkJa2ZyZWUoZW50cnkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwppbmRleCA2ZmJlNDg5Li4xODM5MmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0xODksMTAgKzE4OSw4IEBACiAJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKIAkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCA9IGllZWUtPmNyeXB0W2ldOwogCQlpZiAoY3J5cHQpIHsKLQkJCWlmIChjcnlwdC0+b3BzKSB7CisJCQlpZiAoY3J5cHQtPm9wcykKIAkJCQljcnlwdC0+b3BzLT5kZWluaXQoY3J5cHQtPnByaXYpOwotCQkJCW1vZHVsZV9wdXQoY3J5cHQtPm9wcy0+b3duZXIpOwotCQkJfQogCQkJa2ZyZWUoY3J5cHQpOwogCQkJaWVlZS0+Y3J5cHRbaV0gPSBOVUxMOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCA1OWIyYWI0Li4zMzRlNGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTI4MzksMTYgKzI4MzksMTIgQEAKIAkJZ290byBza2lwX2hvc3RfY3J5cHQ7CiAKIAlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQlpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKLQkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF93ZXAiKTsKKwlpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApCiAJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOwotCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7Ci0JCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfdGtpcCIpOworCWVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkKIAkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7Ci0JfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKLQkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF9jY21wIik7CisJZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKQogCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQl9CiAJaWYgKG9wcyA9PSBOVUxMKSB7CiAJCXByaW50aygidW5rbm93biBjcnlwdG8gYWxnICclcydcbiIsIHBhcmFtLT51LmNyeXB0LmFsZyk7CiAJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHOwpAQCAtMjg2OSw3ICsyODY1LDcgQEAKIAkJfQogCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CiAJCW5ld19jcnlwdC0+b3BzID0gb3BzOwotCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJaWYgKG5ld19jcnlwdC0+b3BzKQogCQkJbmV3X2NyeXB0LT5wcml2ID0KIAkJCQluZXdfY3J5cHQtPm9wcy0+aW5pdChwYXJhbS0+dS5jcnlwdC5pZHgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDhkOGJkZDAuLmEwOGI5N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0zMzEsMTIgKzMzMSwxMCBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKIAkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOwotCQlpZiAoIW5ld19jcnlwdC0+b3BzKSB7Ci0JCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOworCQlpZiAoIW5ld19jcnlwdC0+b3BzKQogCQkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOwotCQl9CiAKLQkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCWlmIChuZXdfY3J5cHQtPm9wcykKIAkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGtleSk7CiAKIAkJaWYgKCFuZXdfY3J5cHQtPm9wcyB8fCAhbmV3X2NyeXB0LT5wcml2KSB7CkBAIC00ODMsNyArNDgxLDcgQEAKICAgICAgICAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwogICAgICAgICBpbnQgaSwgaWR4LCByZXQgPSAwOwogICAgICAgICBpbnQgZ3JvdXBfa2V5ID0gMDsKLSAgICAgICAgY29uc3QgY2hhciAqYWxnLCAqbW9kdWxlOworICAgICAgICBjb25zdCBjaGFyICphbGc7CiAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOwogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKIApAQCAtNTM5LDE1ICs1MzcsMTIgQEAKICAgICAgICAgc3dpdGNoIChleHQtPmFsZykgewogICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfV0VQOgogICAgICAgICAgICAgICAgIGFsZyA9ICJXRVAiOwotICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfd2VwIjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CiAgICAgICAgICAgICAgICAgYWxnID0gIlRLSVAiOwotICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfdGtpcCI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgogICAgICAgICAgICAgICAgIGFsZyA9ICJDQ01QIjsKLSAgICAgICAgICAgICAgICBtb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X2NjbXAiOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKQEAgLTU1OCwxMCArNTUzLDggQEAKIC8vCXByaW50aygiOC0wOS0wOC05PT09PT0+JXMsIGFsZyBuYW1lOiVzXG4iLF9fZnVuY19fLCBhbGcpOwogCiAJIG9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOwotICAgICAgICBpZiAob3BzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0X21vZHVsZShtb2R1bGUpOworICAgICAgICBpZiAob3BzID09IE5VTEwpCiAgICAgICAgICAgICAgICAgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG9wcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKQEAgLTU4MSw3ICs1NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuZXdfY3J5cHQtPm9wcyA9IG9wczsKLSAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKyAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0LT5vcHMpCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChpZHgpOwogICAgICAgICAgICAgICAgIGlmIChuZXdfY3J5cHQtPnByaXYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUobmV3X2NyeXB0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL0tjb25maWcKaW5kZXggMzEwMGFhNS4uMzdlNGZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgUlRMODE5MkUKIAl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTkyRSBXaXJlbGVzcyBMQU4gTklDIGRyaXZlciIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFdMQU4KIAlkZXBlbmRzIG9uIFdJUkVMRVNTX0VYVAogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCmluZGV4IDFhOGVhOGEuLmIxYzU0OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpAQCAtNTMsMTQgKzUzLDggQEAKIAogCQlsaXN0X2RlbChwdHIpOwogCi0JCWlmIChlbnRyeS0+b3BzKSB7CisJCWlmIChlbnRyeS0+b3BzKQogCQkJZW50cnktPm9wcy0+ZGVpbml0KGVudHJ5LT5wcml2KTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JCQltb2R1bGVfcHV0KGVudHJ5LT5vcHMtPm93bmVyKTsKLSNlbHNlCi0JCQlfX01PRF9ERUNfVVNFX0NPVU5UKGVudHJ5LT5vcHMtPm93bmVyKTsKLSNlbmRpZgotCQl9CiAJCWtmcmVlKGVudHJ5KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCmluZGV4IDE2MjU2YTMuLjEyYzJhMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0yNDIsMTQgKzI0Miw4IEBACiAJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKIAkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCA9IGllZWUtPmNyeXB0W2ldOwogCQlpZiAoY3J5cHQpIHsKLQkJCWlmIChjcnlwdC0+b3BzKSB7CisJCQlpZiAoY3J5cHQtPm9wcykKIAkJCQljcnlwdC0+b3BzLT5kZWluaXQoY3J5cHQtPnByaXYpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkJCQltb2R1bGVfcHV0KGNyeXB0LT5vcHMtPm93bmVyKTsKLSNlbHNlCi0JCQkJX19NT0RfREVDX1VTRV9DT1VOVChjcnlwdC0+b3BzLT5vd25lcik7Ci0jZW5kaWYKLQkJCX0KIAkJCWtmcmVlKGNyeXB0KTsKIAkJCWllZWUtPmNyeXB0W2ldID0gTlVMTDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IDJmYzA0ZGYuLmVhZTdjNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTMyODQsMTcgKzMyODQsMTQgQEAKIAkJZ290byBza2lwX2hvc3RfY3J5cHQ7CiAKIAlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQlpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKLQkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF93ZXAiKTsKKwlpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApCiAJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOwotCQkvL3NldCBXRVA0MCBmaXJzdCwgaXQgd2lsbCBiZSBtb2RpZmllZCBhY2NvcmRpbmcgdG8gV0VQMTA0IG9yIFdFUDQwIGF0IG90aGVyIHBsYWNlCi0JfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApIHsKLQkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF90a2lwIik7CisJCS8qIHNldCBXRVA0MCBmaXJzdCwgaXQgd2lsbCBiZSBtb2RpZmllZCBhY2NvcmRpbmcgdG8gV0VQMTA0IG9yCisJCSAqIFdFUDQwIGF0IG90aGVyIHBsYWNlICovCisJZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKQogCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQl9IGVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkgewotCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X2NjbXAiKTsKKwllbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApCiAJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOwotCX0KIAlpZiAob3BzID09IE5VTEwpIHsKIAkJcHJpbnRrKCJ1bmtub3duIGNyeXB0byBhbGcgJyVzJ1xuIiwgcGFyYW0tPnUuY3J5cHQuYWxnKTsKIAkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEc7CkBAIC0zMzE1LDExICszMzEyLDcgQEAKIAkJfQogCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CiAJCW5ld19jcnlwdC0+b3BzID0gb3BzOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCi0jZWxzZQotCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X2luY19tb2RfY291bnQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKLSNlbmRpZgorCQlpZiAobmV3X2NyeXB0LT5vcHMpCiAJCQluZXdfY3J5cHQtPnByaXYgPQogCQkJCW5ld19jcnlwdC0+b3BzLT5pbml0KHBhcmFtLT51LmNyeXB0LmlkeCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDIyMzQ4MzEuLjRlMzRhMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtNDgyLDE1ICs0ODIsOSBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKIAkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOwotCQlpZiAoIW5ld19jcnlwdC0+b3BzKSB7Ci0JCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOworCQlpZiAoIW5ld19jcnlwdC0+b3BzKQogCQkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOwotCQl9Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKLSNlbHNlCi0JCWlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfaW5jX21vZF9jb3VudChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQotI2VuZGlmCisJCWlmIChuZXdfY3J5cHQtPm9wcykKIAkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGtleSk7CiAKIAkJaWYgKCFuZXdfY3J5cHQtPm9wcyB8fCAhbmV3X2NyeXB0LT5wcml2KSB7CkBAIC02NDQsNyArNjM4LDcgQEAKICAgICAgICAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwogICAgICAgICBpbnQgaSwgaWR4OwogICAgICAgICBpbnQgZ3JvdXBfa2V5ID0gMDsKLSAgICAgICAgY29uc3QgY2hhciAqYWxnLCAqbW9kdWxlOworICAgICAgICBjb25zdCBjaGFyICphbGc7CiAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOwogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKIApAQCAtNzExLDE1ICs3MDUsMTIgQEAKICAgICAgICAgc3dpdGNoIChleHQtPmFsZykgewogICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfV0VQOgogICAgICAgICAgICAgICAgIGFsZyA9ICJXRVAiOwotICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfd2VwIjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CiAgICAgICAgICAgICAgICAgYWxnID0gIlRLSVAiOwotICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfdGtpcCI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgogICAgICAgICAgICAgICAgIGFsZyA9ICJDQ01QIjsKLSAgICAgICAgICAgICAgICBtb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X2NjbXAiOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKQEAgLTczMCwxMCArNzIxLDggQEAKIAlwcmludGsoImFsZyBuYW1lOiVzXG4iLGFsZyk7CiAKIAkgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7Ci0gICAgICAgIGlmIChvcHMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RfbW9kdWxlKG1vZHVsZSk7CisgICAgICAgIGlmIChvcHMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKLSAgICAgICAgfQogICAgICAgICBpZiAob3BzID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBJRUVFODAyMTFfREVCVUdfV1goIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZXh0LT5hbGcpOwpAQCAtNzU4LDcgKzc0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5ld19jcnlwdC0+b3BzID0gb3BzOwotICAgICAgICAgICAgICAgIGlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQorICAgICAgICAgICAgICAgIGlmIChuZXdfY3J5cHQtPm9wcykKICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGlkeCk7CiAgICAgICAgICAgICAgICAgaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShuZXdfY3J5cHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYwppbmRleCBkNGZhNjU0Li5iMDgwMmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYwpAQCAtNDYsNiArNDYsNyBAQAogI3VuZGVmIERFQlVHX1RYX0RFU0MKIAogLy8jZGVmaW5lIENPTkZJR19SVEw4MTkyX0lPX01BUAorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgInI4MTkyRV9ody5oIgogI2luY2x1ZGUgInI4MTkyRS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9LY29uZmlnCmluZGV4IDc3MGY0MTIuLmI4Yzk1ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgUlRMODE5MlNVCiAJdHJpc3RhdGUgIlJlYWxUZWsgUlRMODE5MlNVIFdpcmVsZXNzIExBTiBOSUMgZHJpdmVyIgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTgogCWRlcGVuZHMgb24gV0lSRUxFU1NfRVhUCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwppbmRleCBkNzZhNTRkLi41MjFlN2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpAQCAtNTMsMTAgKzUzLDggQEAKIAogCQlsaXN0X2RlbChwdHIpOwogCi0JCWlmIChlbnRyeS0+b3BzKSB7CisJCWlmIChlbnRyeS0+b3BzKQogCQkJZW50cnktPm9wcy0+ZGVpbml0KGVudHJ5LT5wcml2KTsKLQkJCW1vZHVsZV9wdXQoZW50cnktPm9wcy0+b3duZXIpOwotCQl9CiAJCWtmcmVlKGVudHJ5KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKaW5kZXggNjhkYzhmYS4uYzMzODNiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtMjE2LDEwICsyMTYsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBpZWVlLT5jcnlwdFtpXTsKIAkJaWYgKGNyeXB0KSB7Ci0JCQlpZiAoY3J5cHQtPm9wcykgeworCQkJaWYgKGNyeXB0LT5vcHMpCiAJCQkJY3J5cHQtPm9wcy0+ZGVpbml0KGNyeXB0LT5wcml2KTsKLQkJCQltb2R1bGVfcHV0KGNyeXB0LT5vcHMtPm93bmVyKTsKLQkJCX0KIAkJCWtmcmVlKGNyeXB0KTsKIAkJCWllZWUtPmNyeXB0W2ldID0gTlVMTDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggYzY0YWUwMy4uZmQ4ZTExMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0zMDI2LDE3ICszMDI2LDE0IEBACiAJCWdvdG8gc2tpcF9ob3N0X2NyeXB0OwogCiAJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7Ci0JaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7Ci0JCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKQogCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQkJLy9zZXQgV0VQNDAgZmlyc3QsIGl0IHdpbGwgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIFdFUDEwNCBvciBXRVA0MCBhdCBvdGhlciBwbGFjZQotCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7Ci0JCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfdGtpcCIpOworCQkvKiBzZXQgV0VQNDAgZmlyc3QsIGl0IHdpbGwgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIFdFUDEwNCBvcgorCQkgKiBXRVA0MCBhdCBvdGhlciBwbGFjZSAqLworCWVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkKIAkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7Ci0JfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKLQkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF9jY21wIik7CisJZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKQogCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQl9CiAJaWYgKG9wcyA9PSBOVUxMKSB7CiAJCXByaW50aygidW5rbm93biBjcnlwdG8gYWxnICclcydcbiIsIHBhcmFtLT51LmNyeXB0LmFsZyk7CiAJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHOwpAQCAtMzA1OCw3ICszMDU1LDcgQEAKIAkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSkpOwogCQluZXdfY3J5cHQtPm9wcyA9IG9wczsKIAotCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJaWYgKG5ld19jcnlwdC0+b3BzKQogCQkJbmV3X2NyeXB0LT5wcml2ID0KIAkJCQluZXdfY3J5cHQtPm9wcy0+aW5pdChwYXJhbS0+dS5jcnlwdC5pZHgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDEwNzc1OTAuLjYxNDZjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0zNTgsMTEgKzM1OCw5IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSkpOwogCQluZXdfY3J5cHQtPm9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcygiV0VQIik7Ci0JCWlmICghbmV3X2NyeXB0LT5vcHMpIHsKLQkJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJCWlmICghbmV3X2NyeXB0LT5vcHMpCiAJCQluZXdfY3J5cHQtPm9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcygiV0VQIik7Ci0JCX0KLQkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCWlmIChuZXdfY3J5cHQtPm9wcykKIAkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGtleSk7CiAKIAkJaWYgKCFuZXdfY3J5cHQtPm9wcyB8fCAhbmV3X2NyeXB0LT5wcml2KSB7CkBAIC01MDcsNyArNTA1LDcgQEAKICAgICAgICAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwogICAgICAgICBpbnQgaSwgaWR4OwogICAgICAgICBpbnQgZ3JvdXBfa2V5ID0gMDsKLSAgICAgICAgY29uc3QgY2hhciAqYWxnLCAqbW9kdWxlOworICAgICAgICBjb25zdCBjaGFyICphbGc7CiAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOwogICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKIApAQCAtNTcwLDE1ICs1NjgsMTIgQEAKICAgICAgICAgc3dpdGNoIChleHQtPmFsZykgewogICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfV0VQOgogICAgICAgICAgICAgICAgIGFsZyA9ICJXRVAiOwotICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfd2VwIjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CiAgICAgICAgICAgICAgICAgYWxnID0gIlRLSVAiOwotICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfdGtpcCI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgogICAgICAgICAgICAgICAgIGFsZyA9ICJDQ01QIjsKLSAgICAgICAgICAgICAgICBtb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X2NjbXAiOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKQEAgLTU4OSwxMCArNTg0LDggQEAKIAlwcmludGsoImFsZyBuYW1lOiVzXG4iLGFsZyk7CiAKIAkgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7Ci0gICAgICAgIGlmIChvcHMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RfbW9kdWxlKCIlcyIsIG1vZHVsZSk7CisgICAgICAgIGlmIChvcHMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKLSAgICAgICAgfQogICAgICAgICBpZiAob3BzID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBJRUVFODAyMTFfREVCVUdfV1goIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZXh0LT5hbGcpOwpAQCAtNjEyLDcgKzYwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5ld19jcnlwdC0+b3BzID0gb3BzOwotICAgICAgICAgICAgICAgIGlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQorICAgICAgICAgICAgICAgIGlmIChuZXdfY3J5cHQtPm9wcykKICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGlkeCk7CiAgICAgICAgICAgICAgICAgaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShuZXdfY3J5cHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYwppbmRleCA4N2Y4YTExLi5mODkwYTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RsYzQ1eHgvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9zdGxjNDV4eC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDdmYjc1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zdGxjNDV4eC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1jb25maWcgU1RMQzQ1WFgKLQl0cmlzdGF0ZSAic3RsYzQ1NTAvNDU2MCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgV0xBTl84MDIxMSAmJiBTUElfTUFTVEVSICYmIEdFTkVSSUNfSEFSRElSUVMKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGEgZHJpdmVyIGZvciBzdGxjNDU1MCBhbmQgc3RsYzQ1NjAgY2hpcHNldHMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIHN0bGM0NXh4LiAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGxjNDV4eC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zdGxjNDV4eC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlMzI5MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3RsYzQ1eHgvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vYmotJChDT05GSUdfU1RMQzQ1WFgpCSs9IHN0bGM0NXh4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGxjNDV4eC9zdGxjNDV4eC5jIGIvZHJpdmVycy9zdGFnaW5nL3N0bGM0NXh4L3N0bGM0NXh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTllYjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N0bGM0NXh4L3N0bGM0NXh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTk0ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBzdGxjNDV4eAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogQ29udGFjdDogS2FsbGUgVmFsbyA8a2FsbGUudmFsb0Bub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAic3RsYzQ1eHguaCIKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLQotI2luY2x1ZGUgInN0bGM0NXh4X2xtYWMuaCIKLQotLyoKLSAqIGdwaW9zIHNob3VsZCBiZSBoYW5kbGVkIGluIGJvYXJkIGZpbGVzIGFuZCBwcm92aWRlZCB2aWEgcGxhdGZvcm0gZGF0YSwKLSAqIGJ1dCBiZWNhdXNlIGl0J3MgY3VycmVudGx5IGltcG9zc2libGUgZm9yIHN0bGM0NXh4IHRvIGhhdmUgYSBoZWFkZXIgZmlsZQotICogaW4gaW5jbHVkZS9saW51eCwgbGV0J3MgdXNlIG1vZHVsZSBwYXJhbWF0ZXJzIGZvciBub3cKLSAqLwotc3RhdGljIGludCBzdGxjNDV4eF9ncGlvX3Bvd2VyID0gOTc7Ci1tb2R1bGVfcGFyYW0oc3RsYzQ1eHhfZ3Bpb19wb3dlciwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc3RsYzQ1eHhfZ3Bpb19wb3dlciwgInN0bGM0NXh4IGdwaW8gbnVtYmVyIGZvciBwb3dlciBsaW5lIik7Ci0KLXN0YXRpYyBpbnQgc3RsYzQ1eHhfZ3Bpb19pcnEgPSA4NzsKLW1vZHVsZV9wYXJhbShzdGxjNDV4eF9ncGlvX2lycSwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc3RsYzQ1eHhfZ3Bpb19pcnEsICJzdGxjNDV4eCBncGlvIG51bWJlciBmb3IgaXJxIGxpbmUiKTsKLQotc3RhdGljIGNvbnN0IHU4IGRlZmF1bHRfY2FsX2NoYW5uZWxzW10gPSB7Ci0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDZjLCAweDA5LAotCTB4MDAsIDB4MDAsIDB4YzksIDB4ZmYsIDB4ZDgsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsCi0JMHgwMSwgMHgxMCwgMHgwMSwgMHgxMCwgMHgwMSwgMHgxMCwgMHgwMSwgMHhlMCwgMHgwMCwgMHhlMCwgMHgwMCwKLQkweGUwLCAweDAwLCAweGUwLCAweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLCAweGQwLAotCTB4MDAsIDB4NTQsIDB4MDEsIDB4YWIsIDB4ZjYsIDB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsCi0JMHhjMCwgMHg0MiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwKLQkweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDIyLCAweDAxLCAweDM3LCAweGE5LAotCTB4YzAsIDB4MzMsIDB4YzAsIDB4MzMsIDB4YzAsIDB4MzMsIDB4YzAsIDB4MzMsIDB4MDAsIDB4YmMsIDB4MDAsCi0JMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywKLQkweDAwLCAweGJjLCAweGZiLCAweDAwLCAweGNhLCAweDc5LCAweGMwLCAweDJiLCAweGMwLCAweDJiLCAweGMwLAotCTB4MmIsIDB4YzAsIDB4MmIsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsCi0JMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHhkMCwgMHgwMCwgMHg1ZCwKLQkweDU0LCAweGMwLCAweDIxLCAweGMwLCAweDIxLCAweGMwLCAweDIxLCAweGMwLCAweDIxLCAweDAwLCAweGFhLAotCTB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsCi0JMHhhYSwgMHgwMCwgMHhhYSwgMHhhNywgMHgwMCwgMHhhOSwgMHgzZCwgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywKLQkweGMwLCAweDE3LCAweGMwLCAweDE3LCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLAotCTB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4N2EsIDB4MDAsCi0JMHgwNiwgMHgyYywgMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwgMHgwMCwKLQkweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LAotCTB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDYsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcxLCAweDA5LCAweDAwLCAweDAwLCAweGM5LCAweGZmLCAweGQ4LAotCTB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsCi0JMHgxMCwgMHgwMSwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhkMCwKLQkweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLCAweDU0LCAweDAxLCAweGFiLCAweGY2LAotCTB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsIDB4MDAsIDB4Y2IsIDB4MDAsCi0JMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwKLQkweDAwLCAweGNiLCAweDIyLCAweDAxLCAweDM3LCAweGE5LCAweGMwLCAweDMzLCAweGMwLCAweDMzLCAweGMwLAotCTB4MzMsIDB4YzAsIDB4MzMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsCi0JMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHhmYiwgMHgwMCwgMHhjYSwKLQkweDc5LCAweGMwLCAweDJiLCAweGMwLCAweDJiLCAweGMwLCAweDJiLCAweGMwLCAweDJiLCAweDAwLCAweGI0LAotCTB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsCi0JMHhiNCwgMHgwMCwgMHhiNCwgMHhkMCwgMHgwMCwgMHg1ZCwgMHg1NCwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwKLQkweGMwLCAweDIxLCAweGMwLCAweDIxLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLAotCTB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4YTcsIDB4MDAsCi0JMHhhOSwgMHgzZCwgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywgMHgwMCwKLQkweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLAotCTB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4N2EsIDB4MDAsIDB4MDYsIDB4MmMsIDB4YzAsIDB4MGQsIDB4YzAsCi0JMHgwZCwgMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwKLQkweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDgwLCAweDgwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NiwKLQkweDA5LCAweDAwLCAweDAwLCAweGM5LCAweGZmLCAweGQ4LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotCTB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4ZjAsCi0JMHgwMCwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwKLQkweGQwLCAweDAwLCAweDU0LCAweDAxLCAweGFiLCAweGY2LCAweGMwLCAweDQyLCAweGMwLCAweDQyLCAweGMwLAotCTB4NDIsIDB4YzAsIDB4NDIsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsCi0JMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgyMiwgMHgwMSwgMHgzNywKLQkweGE5LCAweGMwLCAweDMzLCAweGMwLCAweDMzLCAweGMwLCAweDMzLCAweGMwLCAweDMzLCAweDAwLCAweGJjLAotCTB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsCi0JMHhiYywgMHgwMCwgMHhiYywgMHhmYiwgMHgwMCwgMHhjYSwgMHg3OSwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwKLQkweGMwLCAweDJiLCAweGMwLCAweDJiLCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLAotCTB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4ZDAsIDB4MDAsCi0JMHg1ZCwgMHg1NCwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwgMHgwMCwKLQkweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLAotCTB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4YTcsIDB4MDAsIDB4YTksIDB4M2QsIDB4YzAsIDB4MTcsIDB4YzAsCi0JMHgxNywgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwKLQkweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDdhLAotCTB4MDAsIDB4MDYsIDB4MmMsIDB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsCi0JMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwKLQkweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3YiwgMHgwOSwgMHgwMCwgMHgwMCwgMHhjOSwgMHhmZiwKLQkweGQ4LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDEwLCAweDAxLCAweDEwLCAweDAxLCAweDEwLAotCTB4MDEsIDB4MTAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsCi0JMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHg1NCwgMHgwMSwgMHhhYiwKLQkweGY2LCAweGMwLCAweDQyLCAweGMwLCAweDQyLCAweGMwLCAweDQyLCAweGMwLCAweDQyLCAweDAwLCAweGNiLAotCTB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsCi0JMHhjYiwgMHgwMCwgMHhjYiwgMHgyMiwgMHgwMSwgMHgzNywgMHhhOSwgMHhjMCwgMHgzMywgMHhjMCwgMHgzMywKLQkweGMwLCAweDMzLCAweGMwLCAweDMzLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLAotCTB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4ZmIsIDB4MDAsCi0JMHhjYSwgMHg3OSwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwgMHgwMCwKLQkweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LAotCTB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4ZDAsIDB4MDAsIDB4NWQsIDB4NTQsIDB4YzAsIDB4MjEsIDB4YzAsCi0JMHgyMSwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwKLQkweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweGE3LAotCTB4MDAsIDB4YTksIDB4M2QsIDB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsCi0JMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwKLQkweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDdhLCAweDAwLCAweDA2LCAweDJjLCAweGMwLCAweDBkLAotCTB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsCi0JMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHg4MCwKLQkweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHg4MCwgMHgwOSwgMHgwMCwgMHgwMCwgMHhjOSwgMHhmZiwgMHhkOCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAxLCAweDEwLCAweDAxLCAweDEwLCAweDAxLCAweDEwLCAweDAxLCAweDEwLCAweDAxLCAweGYwLCAweDAwLAotCTB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZDAsIDB4MDAsIDB4ZDAsIDB4MDAsIDB4ZDAsCi0JMHgwMCwgMHhkMCwgMHgwMCwgMHg1NCwgMHgwMSwgMHhhYiwgMHhmNiwgMHhjMCwgMHg0MiwgMHhjMCwgMHg0MiwKLQkweGMwLCAweDQyLCAweGMwLCAweDQyLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLAotCTB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MjIsIDB4MDEsCi0JMHgzNywgMHhhOSwgMHhjMCwgMHgzMywgMHhjMCwgMHgzMywgMHhjMCwgMHgzMywgMHhjMCwgMHgzMywgMHgwMCwKLQkweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLAotCTB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4ZmIsIDB4MDAsIDB4Y2EsIDB4NzksIDB4YzAsIDB4MmIsIDB4YzAsCi0JMHgyYiwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwKLQkweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweGQwLAotCTB4MDAsIDB4NWQsIDB4NTQsIDB4YzAsIDB4MjEsIDB4YzAsIDB4MjEsIDB4YzAsIDB4MjEsIDB4YzAsIDB4MjEsCi0JMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwKLQkweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweGE3LCAweDAwLCAweGE5LCAweDNkLCAweGMwLCAweDE3LAotCTB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsCi0JMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwKLQkweDdhLCAweDAwLCAweDA2LCAweDJjLCAweGMwLCAweDBkLCAweGMwLCAweDBkLCAweGMwLCAweDBkLCAweGMwLAotCTB4MGQsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsCi0JMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODUsIDB4MDksIDB4MDAsIDB4MDAsIDB4YzksCi0JMHhmZiwgMHhkOCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxMCwgMHgwMSwgMHgxMCwgMHgwMSwKLQkweDEwLCAweDAxLCAweDEwLCAweDAxLCAweGYwLCAweDAwLCAweGYwLCAweDAwLCAweGYwLCAweDAwLCAweGYwLAotCTB4MDAsIDB4ZDAsIDB4MDAsIDB4ZDAsIDB4MDAsIDB4ZDAsIDB4MDAsIDB4ZDAsIDB4MDAsIDB4NTQsIDB4MDEsCi0JMHhhYiwgMHhmNiwgMHhjMCwgMHg0MiwgMHhjMCwgMHg0MiwgMHhjMCwgMHg0MiwgMHhjMCwgMHg0MiwgMHgwMCwKLQkweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLAotCTB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MjIsIDB4MDEsIDB4MzcsIDB4YTksIDB4YzAsIDB4MzMsIDB4YzAsCi0JMHgzMywgMHhjMCwgMHgzMywgMHhjMCwgMHgzMywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywKLQkweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweGZiLAotCTB4MDAsIDB4Y2EsIDB4NzksIDB4YzAsIDB4MmIsIDB4YzAsIDB4MmIsIDB4YzAsIDB4MmIsIDB4YzAsIDB4MmIsCi0JMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwKLQkweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweGQwLCAweDAwLCAweDVkLCAweDU0LCAweGMwLCAweDIxLAotCTB4YzAsIDB4MjEsIDB4YzAsIDB4MjEsIDB4YzAsIDB4MjEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsCi0JMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwKLQkweGE3LCAweDAwLCAweGE5LCAweDNkLCAweGMwLCAweDE3LCAweGMwLCAweDE3LCAweGMwLCAweDE3LCAweGMwLAotCTB4MTcsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsCi0JMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHg3YSwgMHgwMCwgMHgwNiwgMHgyYywgMHhjMCwKLQkweDBkLCAweGMwLCAweDBkLCAweGMwLCAweDBkLCAweGMwLCAweDBkLCAweDAwLCAweDk2LCAweDAwLCAweDk2LAotCTB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsCi0JMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsCi0JMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4OGEsIDB4MDksIDB4MDAsIDB4MDAsIDB4YzksIDB4ZmYsIDB4ZDgsIDB4ZmYsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMSwgMHgxMCwgMHgwMSwgMHgxMCwgMHgwMSwgMHgxMCwgMHgwMSwgMHgxMCwgMHgwMSwgMHhmMCwKLQkweDAwLCAweGYwLCAweDAwLCAweGYwLCAweDAwLCAweGYwLCAweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLAotCTB4ZDAsIDB4MDAsIDB4ZDAsIDB4MDAsIDB4NTQsIDB4MDEsIDB4YWIsIDB4ZjYsIDB4YzAsIDB4NDIsIDB4YzAsCi0JMHg0MiwgMHhjMCwgMHg0MiwgMHhjMCwgMHg0MiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwKLQkweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDIyLAotCTB4MDEsIDB4MzcsIDB4YTksIDB4YzAsIDB4MzMsIDB4YzAsIDB4MzMsIDB4YzAsIDB4MzMsIDB4YzAsIDB4MzMsCi0JMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwKLQkweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweGZiLCAweDAwLCAweGNhLCAweDc5LCAweGMwLCAweDJiLAotCTB4YzAsIDB4MmIsIDB4YzAsIDB4MmIsIDB4YzAsIDB4MmIsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsCi0JMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwKLQkweGQwLCAweDAwLCAweDVkLCAweDU0LCAweGMwLCAweDIxLCAweGMwLCAweDIxLCAweGMwLCAweDIxLCAweGMwLAotCTB4MjEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsCi0JMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHhhNywgMHgwMCwgMHhhOSwgMHgzZCwgMHhjMCwKLQkweDE3LCAweGMwLCAweDE3LCAweGMwLCAweDE3LCAweGMwLCAweDE3LCAweDAwLCAweGEwLCAweDAwLCAweGEwLAotCTB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsCi0JMHhhMCwgMHg3YSwgMHgwMCwgMHgwNiwgMHgyYywgMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwKLQkweGMwLCAweDBkLCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLAotCTB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDA5LCAweDAwLCAweDAwLAotCTB4YzksIDB4ZmYsIDB4ZDgsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsCi0JMHgwMSwgMHgxMCwgMHgwMSwgMHgxMCwgMHgwMSwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwKLQkweGYwLCAweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLCAweDU0LAotCTB4MDEsIDB4YWIsIDB4ZjYsIDB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsCi0JMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwKLQkweGNiLCAweDAwLCAweGNiLCAweDAwLCAweGNiLCAweDIyLCAweDAxLCAweDM3LCAweGE5LCAweGMwLCAweDMzLAotCTB4YzAsIDB4MzMsIDB4YzAsIDB4MzMsIDB4YzAsIDB4MzMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsCi0JMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywKLQkweGZiLCAweDAwLCAweGNhLCAweDc5LCAweGMwLCAweDJiLCAweGMwLCAweDJiLCAweGMwLCAweDJiLCAweGMwLAotCTB4MmIsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsCi0JMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHgwMCwgMHhiNCwgMHhkMCwgMHgwMCwgMHg1ZCwgMHg1NCwgMHhjMCwKLQkweDIxLCAweGMwLCAweDIxLCAweGMwLCAweDIxLCAweGMwLCAweDIxLCAweDAwLCAweGFhLCAweDAwLCAweGFhLAotCTB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsCi0JMHhhYSwgMHhhNywgMHgwMCwgMHhhOSwgMHgzZCwgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywKLQkweGMwLCAweDE3LCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLAotCTB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4YTAsIDB4N2EsIDB4MDAsIDB4MDYsIDB4MmMsCi0JMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwgMHhjMCwgMHgwZCwgMHgwMCwgMHg5NiwgMHgwMCwKLQkweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LAotCTB4MDAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDYsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDk0LCAweDA5LCAweDAwLCAweDAwLCAweGM5LCAweGZmLCAweGQ4LCAweGZmLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsCi0JMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwKLQkweDAwLCAweGQwLCAweDAwLCAweGQwLCAweDAwLCAweDU0LCAweDAxLCAweGFiLCAweGY2LCAweGMwLCAweDQyLAotCTB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsIDB4YzAsIDB4NDIsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsCi0JMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwKLQkweDIyLCAweDAxLCAweDM3LCAweGE5LCAweGMwLCAweDMzLCAweGMwLCAweDMzLCAweGMwLCAweDMzLCAweGMwLAotCTB4MzMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsCi0JMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHgwMCwgMHhiYywgMHhmYiwgMHgwMCwgMHhjYSwgMHg3OSwgMHhjMCwKLQkweDJiLCAweGMwLCAweDJiLCAweGMwLCAweDJiLCAweGMwLCAweDJiLCAweDAwLCAweGI0LCAweDAwLCAweGI0LAotCTB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsCi0JMHhiNCwgMHhkMCwgMHgwMCwgMHg1ZCwgMHg1NCwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwKLQkweGMwLCAweDIxLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLAotCTB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4YWEsIDB4YTcsIDB4MDAsIDB4YTksIDB4M2QsCi0JMHhjMCwgMHgxNywgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywgMHhjMCwgMHgxNywgMHgwMCwgMHhhMCwgMHgwMCwKLQkweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLAotCTB4MDAsIDB4YTAsIDB4N2EsIDB4MDAsIDB4MDYsIDB4MmMsIDB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4YzAsCi0JMHgwZCwgMHhjMCwgMHgwZCwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwKLQkweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDgwLCAweDgwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHgwOSwgMHgwMCwKLQkweDAwLCAweGM5LCAweGZmLCAweGQ4LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDEwLCAweDAxLAotCTB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZjAsCi0JMHgwMCwgMHhmMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwKLQkweDU0LCAweDAxLCAweGFiLCAweGY2LCAweGMwLCAweDQyLCAweGMwLCAweDQyLCAweGMwLCAweDQyLCAweGMwLAotCTB4NDIsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsCi0JMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjYiwgMHgyMiwgMHgwMSwgMHgzNywgMHhhOSwgMHhjMCwKLQkweDMzLCAweGMwLCAweDMzLCAweGMwLCAweDMzLCAweGMwLCAweDMzLCAweDAwLCAweGJjLCAweDAwLCAweGJjLAotCTB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsCi0JMHhiYywgMHhmYiwgMHgwMCwgMHhjYSwgMHg3OSwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwKLQkweGMwLCAweDJiLCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLAotCTB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjQsIDB4ZDAsIDB4MDAsIDB4NWQsIDB4NTQsCi0JMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwgMHhjMCwgMHgyMSwgMHgwMCwgMHhhYSwgMHgwMCwKLQkweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLAotCTB4MDAsIDB4YWEsIDB4YTcsIDB4MDAsIDB4YTksIDB4M2QsIDB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsIDB4YzAsCi0JMHgxNywgMHhjMCwgMHgxNywgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwKLQkweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDAwLCAweGEwLCAweDdhLCAweDAwLCAweDA2LAotCTB4MmMsIDB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4MDAsIDB4OTYsCi0JMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwKLQkweDk2LCAweDAwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDA2LCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgMHgwOSwgMHgwMCwgMHgwMCwgMHhjOSwgMHhmZiwgMHhkOCwgMHhmZiwKLQkweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDEwLCAweDAxLCAweDEwLCAweDAxLCAweDEwLCAweDAxLCAweDEwLAotCTB4MDEsIDB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZDAsIDB4MDAsCi0JMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMCwgMHgwMCwgMHg1NCwgMHgwMSwgMHhhYiwgMHhmNiwgMHhjMCwKLQkweDQyLCAweGMwLCAweDQyLCAweGMwLCAweDQyLCAweGMwLCAweDQyLCAweDAwLCAweGNiLCAweDAwLCAweGNiLAotCTB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2IsIDB4MDAsCi0JMHhjYiwgMHgyMiwgMHgwMSwgMHgzNywgMHhhOSwgMHhjMCwgMHgzMywgMHhjMCwgMHgzMywgMHhjMCwgMHgzMywKLQkweGMwLCAweDMzLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLCAweGJjLCAweDAwLAotCTB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4MDAsIDB4YmMsIDB4ZmIsIDB4MDAsIDB4Y2EsIDB4NzksCi0JMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwgMHhjMCwgMHgyYiwgMHgwMCwgMHhiNCwgMHgwMCwKLQkweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LCAweDAwLCAweGI0LAotCTB4MDAsIDB4YjQsIDB4ZDAsIDB4MDAsIDB4NWQsIDB4NTQsIDB4YzAsIDB4MjEsIDB4YzAsIDB4MjEsIDB4YzAsCi0JMHgyMSwgMHhjMCwgMHgyMSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhhYSwKLQkweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweDAwLCAweGFhLCAweGE3LCAweDAwLCAweGE5LAotCTB4M2QsIDB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsIDB4YzAsIDB4MTcsIDB4MDAsIDB4YTAsCi0JMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHhhMCwgMHgwMCwKLQkweGEwLCAweDAwLCAweGEwLCAweDdhLCAweDAwLCAweDA2LCAweDJjLCAweGMwLCAweDBkLCAweGMwLCAweDBkLAotCTB4YzAsIDB4MGQsIDB4YzAsIDB4MGQsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTYsIDB4MDAsCi0JMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHg4MCwgMHg4MCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCB9OwotCi1zdGF0aWMgY29uc3QgdTggZGVmYXVsdF9jYWxfcnNzaVtdID0gewotCTB4MGEsIDB4MDEsIDB4NzIsIDB4ZmUsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDEsIDB4NzIsCi0JMHhmZSwgMHgxYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMSwgMHg3MiwgMHhmZSwgMHgxYSwgMHgwMCwKLQkweDAwLCAweDAwLCAweDBhLCAweDAxLCAweDcyLCAweGZlLCAweDFhLCAweDAwLCAweDAwLCAweDAwLCAweDBhLAotCTB4MDEsIDB4NzIsIDB4ZmUsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDEsIDB4NzIsIDB4ZmUsCi0JMHgxYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMSwgMHg3MiwgMHhmZSwgMHgxYSwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDBhLCAweDAxLCAweDcyLCAweGZlLCAweDFhLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAxLAotCTB4NzIsIDB4ZmUsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDEsIDB4NzIsIDB4ZmUsIDB4MWEsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMSwgMHg3MiwgMHhmZSwgMHgxYSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfdHhfZWRjZihzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMpOwotc3RhdGljIHZvaWQgc3RsYzQ1eHhfdHhfc2V0dXAoc3RydWN0IHN0bGM0NXh4ICpzdGxjKTsKLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3R4X3NjYW4oc3RydWN0IHN0bGM0NXh4ICpzdGxjKTsKLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3R4X3BzbShzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMsIGJvb2wgZW5hYmxlKTsKLXN0YXRpYyBpbnQgc3RsYzQ1eHhfdHhfbnVsbGZ1bmMoc3RydWN0IHN0bGM0NXh4ICpzdGxjLCBib29sIHBvd2Vyc2F2ZSk7Ci1zdGF0aWMgaW50IHN0bGM0NXh4X3R4X3BzcG9sbChzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMsIGJvb2wgcG93ZXJzYXZlKTsKLQotc3RhdGljIHNzaXplX3Qgc3RsYzQ1eHhfc3lzZnNfc2hvd19jYWxfcnNzaShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzc2l6ZV90IGxlbjsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCWxlbiA9IFBBR0VfU0laRTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCWlmIChzdGxjLT5jYWxfcnNzaSkKLQkJaGV4X2R1bXBfdG9fYnVmZmVyKHN0bGMtPmNhbF9yc3NpLCBSU1NJX0NBTF9BUlJBWV9MRU4sIDE2LAotCQkJCSAgIDIsIGJ1ZiwgbGVuLCAwKTsKLQltdXRleF91bmxvY2soJnN0bGMtPm11dGV4KTsKLQotCWxlbiA9IHN0cmxlbihidWYpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RsYzQ1eHhfc3lzZnNfc3RvcmVfY2FsX3Jzc2koc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzdGxjNDV4eCAqc3RsYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfRlVOQywgIiVzIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmc3RsYy0+bXV0ZXgpOwotCi0JaWYgKGNvdW50ICE9IFJTU0lfQ0FMX0FSUkFZX0xFTikgewotCQlzdGxjNDV4eF9lcnJvcigiaW52YWxpZCBjYWxfcnNzaSBsZW5ndGg6ICV6dSIsIGNvdW50KTsKLQkJY291bnQgPSAwOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0Ja2ZyZWUoc3RsYy0+Y2FsX3Jzc2kpOwotCi0Jc3RsYy0+Y2FsX3Jzc2kgPSBrbWVtZHVwKGJ1ZiwgUlNTSV9DQUxfQVJSQVlfTEVOLCBHRlBfS0VSTkVMKTsKLQotCWlmICghc3RsYy0+Y2FsX3Jzc2kpIHsKLQkJc3RsYzQ1eHhfZXJyb3IoImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNhbF9yc3NpIik7Ci0JCWNvdW50ID0gMDsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotIG91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZzdGxjLT5tdXRleCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0bGM0NXh4X3N5c2ZzX3Nob3dfY2FsX2NoYW5uZWxzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBzdGxjNDV4eCAqc3RsYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXNzaXplX3QgbGVuOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfRlVOQywgIiVzIiwgX19mdW5jX18pOwotCi0JbGVuID0gUEFHRV9TSVpFOwotCi0JbXV0ZXhfbG9jaygmc3RsYy0+bXV0ZXgpOwotCi0JaWYgKHN0bGMtPmNhbF9jaGFubmVscykKLQkJaGV4X2R1bXBfdG9fYnVmZmVyKHN0bGMtPmNhbF9jaGFubmVscywgQ0hBTk5FTF9DQUxfQVJSQVlfTEVOLAotCQkJCSAgIDE2LCAyLCBidWYsIGxlbiwgMCk7Ci0KLQltdXRleF91bmxvY2soJnN0bGMtPm11dGV4KTsKLQotCWxlbiA9IHN0cmxlbihidWYpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RsYzQ1eHhfc3lzZnNfc3RvcmVfY2FsX2NoYW5uZWxzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCWlmIChjb3VudCAhPSBDSEFOTkVMX0NBTF9BUlJBWV9MRU4pIHsKLQkJc3RsYzQ1eHhfZXJyb3IoImludmFsaWQgY2FsX2NoYW5uZWxzIHNpemU6ICV6dSAiLCBjb3VudCk7Ci0JCWNvdW50ID0gMDsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCWtmcmVlKHN0bGMtPmNhbF9jaGFubmVscyk7Ci0KLQlzdGxjLT5jYWxfY2hhbm5lbHMgPSBrbWVtZHVwKGJ1ZiwgY291bnQsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFzdGxjLT5jYWxfY2hhbm5lbHMpIHsKLQkJc3RsYzQ1eHhfZXJyb3IoImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNhbF9jaGFubmVscyIpOwotCQljb3VudCA9IDA7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZzdGxjLT5tdXRleCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0bGM0NXh4X3N5c2ZzX3Nob3dfdHhfYnVmKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHN0bGM0NXh4ICpzdGxjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHR4YnVmZmVyICplbnRyeTsKLQlzc2l6ZV90IGxlbiA9IDA7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMoKSIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZzdGxjLT50eF9zZW50LCB0eF9saXN0KSB7Ci0JCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIjB4JXg6IDB4JXgtMHgleFxuIiwKLQkJCSAgICAgICBlbnRyeS0+aGFuZGxlLCBlbnRyeS0+c3RhcnQsCi0JCQkgICAgICAgZW50cnktPmVuZCk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZzdGxjLT5tdXRleCk7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoY2FsX3Jzc2ksIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICBzdGxjNDV4eF9zeXNmc19zaG93X2NhbF9yc3NpLAotCQkgICBzdGxjNDV4eF9zeXNmc19zdG9yZV9jYWxfcnNzaSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY2FsX2NoYW5uZWxzLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgc3RsYzQ1eHhfc3lzZnNfc2hvd19jYWxfY2hhbm5lbHMsCi0JCSAgIHN0bGM0NXh4X3N5c2ZzX3N0b3JlX2NhbF9jaGFubmVscyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodHhfYnVmLCBTX0lSVUdPLCBzdGxjNDV4eF9zeXNmc19zaG93X3R4X2J1ZiwgTlVMTCk7Ci0KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3NwaV9yZWFkKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgICAgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQotewotCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFsyXTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKLQotCS8qIFdlIGZpcnN0IHB1c2ggdGhlIGFkZHJlc3MgKi8KLQlhZGRyID0gKGFkZHIgPDwgOCkgfCBBRERSX1JFQURfQklUXzE1OwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbSk7Ci0JbWVtc2V0KHQsIDAsIHNpemVvZih0KSk7Ci0KLQl0WzBdLnR4X2J1ZiA9ICZhZGRyOwotCXRbMF0ubGVuID0gMjsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFswXSwgJm0pOwotCi0JdFsxXS5yeF9idWYgPSBidWY7Ci0JdFsxXS5sZW4gPSBsZW47Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMV0sICZtKTsKLQotCXNwaV9zeW5jKHN0bGMtPnNwaSwgJm0pOwotfQotCi0KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3NwaV93cml0ZShzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCSAgICAgICB2b2lkICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB0WzNdOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwotCXUxNiBsYXN0X3dvcmQ7Ci0KLQkvKiBXZSBmaXJzdCBwdXNoIHRoZSBhZGRyZXNzICovCi0JYWRkciA9IGFkZHIgPDwgODsKLQotCXNwaV9tZXNzYWdlX2luaXQoJm0pOwotCW1lbXNldCh0LCAwLCBzaXplb2YodCkpOwotCi0JdFswXS50eF9idWYgPSAmYWRkcjsKLQl0WzBdLmxlbiA9IDI7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKLQotCXRbMV0udHhfYnVmID0gYnVmOwotCXRbMV0ubGVuID0gbGVuOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7Ci0KLQlpZiAobGVuICUgMikgewotCQlsYXN0X3dvcmQgPSAoKHU4ICopYnVmKVtsZW4gLSAxXTsKLQotCQl0WzJdLnR4X2J1ZiA9ICZsYXN0X3dvcmQ7Ci0JCXRbMl0ubGVuID0gMjsKLQkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMl0sICZtKTsKLQl9Ci0KLQlzcGlfc3luYyhzdGxjLT5zcGksICZtKTsKLX0KLQotc3RhdGljIHUxNiBzdGxjNDV4eF9yZWFkMTYoc3RydWN0IHN0bGM0NXh4ICpzdGxjLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JdTE2IHZhbDsKLQotCXN0bGM0NXh4X3NwaV9yZWFkKHN0bGMsIGFkZHIsICZ2YWwsIHNpemVvZih2YWwpKTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB1MzIgc3RsYzQ1eHhfcmVhZDMyKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCXUzMiB2YWw7Ci0KLQlzdGxjNDV4eF9zcGlfcmVhZChzdGxjLCBhZGRyLCAmdmFsLCBzaXplb2YodmFsKSk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZCBzdGxjNDV4eF93cml0ZTE2KHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgdW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgdmFsKQotewotCXN0bGM0NXh4X3NwaV93cml0ZShzdGxjLCBhZGRyLCAmdmFsLCBzaXplb2YodmFsKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3dyaXRlMzIoc3RydWN0IHN0bGM0NXh4ICpzdGxjLCB1bnNpZ25lZCBsb25nIGFkZHIsIHUzMiB2YWwpCi17Ci0Jc3RsYzQ1eHhfc3BpX3dyaXRlKHN0bGMsIGFkZHIsICZ2YWwsIHNpemVvZih2YWwpKTsKLX0KLQotc3RydWN0IHN0bGM0NXh4X3NwaV9yZWcgewotCXUxNiBhZGRyZXNzOwotCXUxNiBsZW5ndGg7Ci0JY2hhciAqbmFtZTsKLX07Ci0KLS8qIGNhbGxlciBtdXN0IGhvbGQgdHhfbG9jayAqLwotc3RhdGljIHZvaWQgc3RsYzQ1eHhfdHhidWZmZXJfZHVtcChzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMpCi17Ci0Jc3RydWN0IHR4YnVmZmVyICp0eGJ1ZmZlcjsKLQljaGFyICpidWYsICpwb3M7Ci0JaW50IGJ1Zl9sZW4sIGwsIGNvdW50OwotCi0JaWYgKCEoREVCVUdfTEVWRUwgJiBERUJVR19UWEJVRkZFUikpCi0JCXJldHVybjsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcygpIiwgX19mdW5jX18pOwotCi0JYnVmX2xlbiA9IDUwMDsKLQlidWYgPSBrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9BVE9NSUMpOwotCWlmICghYnVmKQotCQlyZXR1cm47Ci0KLQlwb3MgPSBidWY7Ci0JY291bnQgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0eGJ1ZmZlciwgJnN0bGMtPnR4YnVmZmVyLCBidWZmZXJfbGlzdCkgewotCQlsID0gc25wcmludGYocG9zLCBidWZfbGVuLCAiMHgleC0weCV4LCIsCi0JCQkgICAgIHR4YnVmZmVyLT5zdGFydCwgdHhidWZmZXItPmVuZCk7Ci0JCS8qIGRyb3AgdGhlIG51bGwgYnl0ZSAqLwotCQlwb3MgKz0gbDsKLQkJYnVmX2xlbiAtPSBsOwotCQljb3VudCsrOwotCX0KLQotCWlmIChjb3VudCA9PSAwKQotCQkqcG9zID0gJ1wwJzsKLQllbHNlCi0JCSotLXBvcyA9ICdcMCc7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19UWEJVRkZFUiwgInR4YnVmZmVyOiBpbiBidWZmZXIgJWQgcmVnaW9uczogJXMiLAotCQkgICAgICAgY291bnQsIGJ1Zik7Ci0KLQlrZnJlZShidWYpOwotfQotCi0vKiBjYWxsZXIgbXVzdCBob2xkIHR4X2xvY2sgKi8KLXN0YXRpYyBpbnQgc3RsYzQ1eHhfdHhidWZmZXJfZmluZChzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IHR4YnVmZmVyICp0eGJ1ZmZlcjsKLQlpbnQgcG9zOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfRlVOQywgIiVzKCkiLCBfX2Z1bmNfXyk7Ci0KLQlwb3MgPSBGSVJNV0FSRV9UWEJVRkZFUl9TVEFSVDsKLQotCWlmIChsaXN0X2VtcHR5KCZzdGxjLT50eGJ1ZmZlcikpCi0JCWdvdG8gb3V0OwotCi0JLyoKLQkgKiB0aGUgZW50cmllcyBpbiB0eGJ1ZmZlciBtdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXJlIGluCi0JICogdGhlIHJlYWwgYnVmZmVyCi0JICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0eGJ1ZmZlciwgJnN0bGMtPnR4YnVmZmVyLCBidWZmZXJfbGlzdCkgewotCQlpZiAocG9zICsgbGVuIDwgdHhidWZmZXItPnN0YXJ0KQotCQkJYnJlYWs7Ci0JCXBvcyA9IEFMSUdOKHR4YnVmZmVyLT5lbmQgKyAxLCA0KTsKLQl9Ci0KLQlpZiAocG9zICsgbGVuID4gRklSTVdBUkVfVFhCVUZGRVJfRU5EKQotCQkvKiBub3QgZW5vdWdoIHJvb20gKi8KLQkJcG9zID0gLTE7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19UWEJVRkZFUiwgInR4YnVmZmVyOiBmaW5kICV6dSBCOiAweCV4IiwgbGVuLCBwb3MpOwotCi1vdXQ6Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGludCBzdGxjNDV4eF90eGJ1ZmZlcl9hZGQoc3RydWN0IHN0bGM0NXh4ICpzdGxjLAotCQkJCSBzdHJ1Y3QgdHhidWZmZXIgKnR4YnVmZmVyKQotewotCXN0cnVjdCB0eGJ1ZmZlciAqciwgKnByZXYgPSBOVUxMOwotCi0JaWYgKGxpc3RfZW1wdHkoJnN0bGMtPnR4YnVmZmVyKSkgewotCQlsaXN0X2FkZCgmdHhidWZmZXItPmJ1ZmZlcl9saXN0LCAmc3RsYy0+dHhidWZmZXIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyID0gbGlzdF9maXJzdF9lbnRyeSgmc3RsYy0+dHhidWZmZXIsIHN0cnVjdCB0eGJ1ZmZlciwgYnVmZmVyX2xpc3QpOwotCi0JaWYgKHR4YnVmZmVyLT5zdGFydCA8IHItPnN0YXJ0KSB7Ci0JCS8qIGFkZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ICovCi0JCWxpc3RfYWRkKCZ0eGJ1ZmZlci0+YnVmZmVyX2xpc3QsICZzdGxjLT50eGJ1ZmZlcik7Ci0JCXJldHVybiAwOwotCX0KLQotCXByZXYgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJnN0bGMtPnR4YnVmZmVyLCBidWZmZXJfbGlzdCkgewotCQkvKiBza2lwIGZpcnN0IGVudHJ5LCB3ZSBjaGVja2VkIGZvciB0aGF0IGFib3ZlICovCi0JCWlmICghcHJldikgewotCQkJcHJldiA9IHI7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIGRvdWJsZS1jaGVjayBvdmVybGFwcyAqLwotCQlXQVJOX09OX09OQ0UodHhidWZmZXItPnN0YXJ0ID49IHItPnN0YXJ0ICYmCi0JCQkgICAgIHR4YnVmZmVyLT5zdGFydCA8PSByLT5lbmQpOwotCQlXQVJOX09OX09OQ0UodHhidWZmZXItPmVuZCA+PSByLT5zdGFydCAmJgotCQkJICAgICB0eGJ1ZmZlci0+ZW5kIDw9IHItPmVuZCk7Ci0KLQkJaWYgKHByZXYtPmVuZCA8IHR4YnVmZmVyLT5zdGFydCAmJgotCQkgICAgdHhidWZmZXItPmVuZCA8IHItPnN0YXJ0KSB7Ci0JCQkvKiBpbnNlcnQgYXQgdGhpcyBzcG90ICovCi0JCQlsaXN0X2FkZF90YWlsKCZ0eGJ1ZmZlci0+YnVmZmVyX2xpc3QsICZyLT5idWZmZXJfbGlzdCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXByZXYgPSByOwotCX0KLQotCS8qIG5vdCBmb3VuZCAqLwotCWxpc3RfYWRkX3RhaWwoJnR4YnVmZmVyLT5idWZmZXJfbGlzdCwgJnN0bGMtPnR4YnVmZmVyKTsKLQotCXJldHVybiAwOwotCi19Ci0KLS8qIGNhbGxlciBtdXN0IGhvbGQgdHhfbG9jayAqLwotc3RhdGljIHN0cnVjdCB0eGJ1ZmZlciAqc3RsYzQ1eHhfdHhidWZmZXJfYWxsb2Moc3RydWN0IHN0bGM0NXh4ICpzdGxjLAotCQkJCQkJIHNpemVfdCBmcmFtZV9sZW4pCi17Ci0Jc3RydWN0IHR4YnVmZmVyICplbnRyeSA9IE5VTEw7Ci0Jc2l6ZV90IGxlbjsKLQlpbnQgcG9zOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfRlVOQywgIiVzKCkiLCBfX2Z1bmNfXyk7Ci0KLQlsZW4gPSBGSVJNV0FSRV9UWEJVRkZFUl9IRUFERVIgKyBmcmFtZV9sZW4gKyBGSVJNV0FSRV9UWEJVRkZFUl9UUkFJTEVSOwotCXBvcyA9IHN0bGM0NXh4X3R4YnVmZmVyX2ZpbmQoc3RsYywgbGVuKTsKLQotCWlmIChwb3MgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQotCVdBUk5fT05fT05DRShwb3MgKyBsZW4gPiBGSVJNV0FSRV9UWEJVRkZFUl9FTkQpOwotCVdBUk5fT05fT05DRShwb3MgPCBGSVJNV0FSRV9UWEJVRkZFUl9TVEFSVCk7Ci0KLQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwotCWVudHJ5LT5zdGFydCA9IHBvczsKLQllbnRyeS0+ZnJhbWVfc3RhcnQgPSBwb3MgKyBGSVJNV0FSRV9UWEJVRkZFUl9IRUFERVI7Ci0JZW50cnktPmVuZCA9IGVudHJ5LT5zdGFydCArIGxlbiAtIDE7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19UWEJVRkZFUiwgInR4YnVmZmVyOiBhbGxvY2F0ZWQgMHgleC0weCV4IiwKLQkJICAgICAgIGVudHJ5LT5zdGFydCwgZW50cnktPmVuZCk7Ci0KLQlzdGxjNDV4eF90eGJ1ZmZlcl9hZGQoc3RsYywgZW50cnkpOwotCi0Jc3RsYzQ1eHhfdHhidWZmZXJfZHVtcChzdGxjKTsKLQotCXJldHVybiBlbnRyeTsKLX0KLQotLyogY2FsbGVyIG11c3QgaG9sZCB0eF9sb2NrICovCi1zdGF0aWMgdm9pZCBzdGxjNDV4eF90eGJ1ZmZlcl9mcmVlKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywKLQkJCQkgICBzdHJ1Y3QgdHhidWZmZXIgKnR4YnVmZmVyKQotewotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcygpIiwgX19mdW5jX18pOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfVFhCVUZGRVIsICJ0eGJ1ZmZlcjogZnJlZWQgMHgleC0weCV4IiwKLQkJICAgICAgIHR4YnVmZmVyLT5zdGFydCwgdHhidWZmZXItPmVuZCk7Ci0KLQlsaXN0X2RlbCgmdHhidWZmZXItPmJ1ZmZlcl9saXN0KTsKLQlrZnJlZSh0eGJ1ZmZlcik7Ci19Ci0KLQotc3RhdGljIGludCBzdGxjNDV4eF93YWl0X2JpdChzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMsIHUxNiByZWcsIHUzMiBtYXNrLAotCQkJICAgICB1MzIgZXhwZWN0ZWQpCi17Ci0JaW50IGk7Ci0JY2hhciBidWZmZXJbNF07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7Ci0JCXN0bGM0NXh4X3NwaV9yZWFkKHN0bGMsIHJlZywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0JCWlmICgoKCoodTMyICopYnVmZmVyKSAmIG1hc2spID09IGV4cGVjdGVkKQotCQkJcmV0dXJuIDE7Ci0JCW1zbGVlcCgxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdGxjNDV4eF9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBzdGxjNDV4eCAqc3RsYykKLXsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCWludCByZXQ7Ci0KLQkvKiBGSVhNRTogc2hvdWxkIGRyaXZlciB1c2UgaXQncyBvd24gc3RydWN0IGRldmljZT8gKi8KLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgIjM4MjYuYXJtIiwgJnN0bGMtPnNwaS0+ZGV2KTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCXN0bGM0NXh4X2Vycm9yKCJyZXF1ZXN0X2Zpcm13YXJlKCkgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKGZ3LT5zaXplICUgNCkgewotCQlzdGxjNDV4eF9lcnJvcigiZmlybXdhcmUgc2l6ZSBpcyBub3QgbXVsdGlwbGUgb2YgMzJiaXQ6ICV6dSIsCi0JCQkgICAgICAgZnctPnNpemUpOwotCQlyZXR1cm4gLUVJTFNFUTsgLyogSWxsZWdhbCBieXRlIHNlcXVlbmNlICAqLzsKLQl9Ci0KLQlpZiAoZnctPnNpemUgPCAxMDAwKSB7Ci0JCXN0bGM0NXh4X2Vycm9yKCJmaXJtd2FyZSBpcyB0b28gc21hbGw6ICV6dSIsIGZ3LT5zaXplKTsKLQkJcmV0dXJuIC1FSUxTRVE7Ci0JfQotCi0Jc3RsYy0+ZncgPSBrbWVtZHVwKGZ3LT5kYXRhLCBmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdGxjLT5mdykgewotCQlzdGxjNDV4eF9lcnJvcigiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZmlybXdhcmUiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3RsYy0+ZndfbGVuID0gZnctPnNpemU7Ci0KLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0bGM0NXh4X3VwbG9hZF9maXJtd2FyZShzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMpCi17Ci0Jc3RydWN0IHNfZG1hX3JlZ3MgZG1hX3JlZ3M7Ci0JdW5zaWduZWQgbG9uZyBmd19sZW4sIGZ3X2FkZHI7Ci0JbG9uZyBfZndfbGVuOwotCWludCByZXQ7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIXN0bGMtPmZ3KSB7Ci0JCXJldCA9IHN0bGM0NXh4X3JlcXVlc3RfZmlybXdhcmUoc3RsYyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBzdG9wIHRoZSBkZXZpY2UgKi8KLQlzdGxjNDV4eF93cml0ZTE2KHN0bGMsIFNQSV9BRFJTX0RFVl9DVFJMX1NUQVQsCi0JCQkgU1BJX0NUUkxfU1RBVF9IT1NUX09WRVJSSURFIHwgU1BJX0NUUkxfU1RBVF9IT1NUX1JFU0VUCi0JCQkgfCBTUElfQ1RSTF9TVEFUX1NUQVJUX0hBTFRFRCk7Ci0KLQltc2xlZXAoVEFSR0VUX0JPT1RfU0xFRVApOwotCi0Jc3RsYzQ1eHhfd3JpdGUxNihzdGxjLCBTUElfQURSU19ERVZfQ1RSTF9TVEFULAotCQkJIFNQSV9DVFJMX1NUQVRfSE9TVF9PVkVSUklERQotCQkJIHwgU1BJX0NUUkxfU1RBVF9TVEFSVF9IQUxURUQpOwotCi0JbXNsZWVwKFRBUkdFVF9CT09UX1NMRUVQKTsKLQotCWZ3X2FkZHIgPSBGSVJNV0FSRV9BRERSRVNTOwotCWZ3X2xlbiA9IHN0bGMtPmZ3X2xlbjsKLQotCXdoaWxlIChmd19sZW4gPiAwKSB7Ci0JCV9md19sZW4gPSAoZndfbGVuID4gU1BJX01BWF9QQUNLRVRfU0laRSkKLQkJCT8gU1BJX01BWF9QQUNLRVRfU0laRSA6IGZ3X2xlbjsKLQkJZG1hX3JlZ3MuY21kID0gU1BJX0RNQV9XUklURV9DVFJMX0VOQUJMRTsKLQkJZG1hX3JlZ3MubGVuID0gY3B1X3RvX2xlMTYoX2Z3X2xlbik7Ci0JCWRtYV9yZWdzLmFkZHIgPSBjcHVfdG9fbGUzMihmd19hZGRyKTsKLQotCQlmd19sZW4gLT0gX2Z3X2xlbjsKLQkJZndfYWRkciArPSBfZndfbGVuOwotCi0JCXN0bGM0NXh4X3dyaXRlMTYoc3RsYywgU1BJX0FEUlNfRE1BX1dSSVRFX0NUUkwsIGRtYV9yZWdzLmNtZCk7Ci0KLQkJaWYgKHN0bGM0NXh4X3dhaXRfYml0KHN0bGMsIFNQSV9BRFJTX0RNQV9XUklURV9DVFJMLAotCQkJCSAgICAgIEhPU1RfQUxMT1dFRCwgSE9TVF9BTExPV0VEKSA9PSAwKSB7Ci0JCQlzdGxjNDV4eF9lcnJvcigiZndfdXBsb2FkIG5vdCBhbGxvd2VkIHRvIERNQSB3cml0ZSIpOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQotCQlzdGxjNDV4eF93cml0ZTE2KHN0bGMsIFNQSV9BRFJTX0RNQV9XUklURV9MRU4sIGRtYV9yZWdzLmxlbik7Ci0JCXN0bGM0NXh4X3dyaXRlMzIoc3RsYywgU1BJX0FEUlNfRE1BX1dSSVRFX0JBU0UsIGRtYV9yZWdzLmFkZHIpOwotCi0JCXN0bGM0NXh4X3NwaV93cml0ZShzdGxjLCBTUElfQURSU19ETUFfREFUQSwgc3RsYy0+ZncsIF9md19sZW4pOwotCi0JCS8qIEZJWE1FOiBJIHRoaW5rIHRoaXMgZG9lc24ndCB3b3JrIGlmIGZpcm13YXJlIGlzIGxhcmdlLAotCQkgKiB0aGlzIGxvb3AgZ29lcyB0byBzZWNvbmQgcm91bmQuIGZ3LT5kYXRhIGlzIG5vdAotCQkgKiBpbmNyZWFzZWQgYXQgYWxsISAqLwotCX0KLQotCUJVR19PTihmd19sZW4gIT0gMCk7Ci0KLQkvKiBlbmFibGUgaG9zdCBpbnRlcnJ1cHRzICovCi0Jc3RsYzQ1eHhfd3JpdGUzMihzdGxjLCBTUElfQURSU19IT1NUX0lOVF9FTiwgU1BJX0hPU1RfSU5UU19ERUZBVUxUKTsKLQotCS8qIGJvb3QgdGhlIGRldmljZSAqLwotCXN0bGM0NXh4X3dyaXRlMTYoc3RsYywgU1BJX0FEUlNfREVWX0NUUkxfU1RBVCwKLQkJCSBTUElfQ1RSTF9TVEFUX0hPU1RfT1ZFUlJJREUgfCBTUElfQ1RSTF9TVEFUX0hPU1RfUkVTRVQKLQkJCSB8IFNQSV9DVFJMX1NUQVRfUkFNX0JPT1QpOwotCi0JbXNsZWVwKFRBUkdFVF9CT09UX1NMRUVQKTsKLQotCXN0bGM0NXh4X3dyaXRlMTYoc3RsYywgU1BJX0FEUlNfREVWX0NUUkxfU1RBVCwKLQkJCSBTUElfQ1RSTF9TVEFUX0hPU1RfT1ZFUlJJREUgfCBTUElfQ1RSTF9TVEFUX1JBTV9CT09UKTsKLQltc2xlZXAoVEFSR0VUX0JPT1RfU0xFRVApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGNhbGxlciBtdXN0IGhvbGQgdHhfbG9jayAqLwotc3RhdGljIHZvaWQgc3RsYzQ1eHhfY2hlY2tfdHhzZW50KHN0cnVjdCBzdGxjNDV4eCAqc3RsYykKLXsKLQlzdHJ1Y3QgdHhidWZmZXIgKmVudHJ5LCAqbjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbiwgJnN0bGMtPnR4X3NlbnQsIHR4X2xpc3QpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZW50cnktPmxpZmV0aW1lKSkgewotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlzdGxjNDV4eF93YXJuaW5nKCJmcmFtZSAweCV4IGxpZmV0aW1lIGV4Y2VlZGVkIiwKLQkJCQkJCSBlbnRyeS0+c3RhcnQpOwotCQkJbGlzdF9kZWwoJmVudHJ5LT50eF9saXN0KTsKLQkJCXNrYl9wdWxsKGVudHJ5LT5za2IsIGVudHJ5LT5oZWFkZXJfbGVuKTsKLQkJCWllZWU4MDIxMV90eF9zdGF0dXMoc3RsYy0+aHcsIGVudHJ5LT5za2IpOwotCQkJc3RsYzQ1eHhfdHhidWZmZXJfZnJlZShzdGxjLCBlbnRyeSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3Bvd2VyX29mZihzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMpCi17Ci0JZGlzYWJsZV9pcnEoZ3Bpb190b19pcnEoc3RsYzQ1eHhfZ3Bpb19pcnEpKTsKLQlncGlvX3NldF92YWx1ZShzdGxjNDV4eF9ncGlvX3Bvd2VyLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfcG93ZXJfb24oc3RydWN0IHN0bGM0NXh4ICpzdGxjKQotewotCWdwaW9fc2V0X3ZhbHVlKHN0bGM0NXh4X2dwaW9fcG93ZXIsIDEpOwotCWVuYWJsZV9pcnEoZ3Bpb190b19pcnEoc3RsYzQ1eHhfZ3Bpb19pcnEpKTsKLQotCS8qCi0JICogbmVlZCB0byB3YWl0IGEgd2hpbGUgYmVmb3JlIGRldmljZSBjYW4gYmUgYWNjZXNzZWQsIHRoZSBsZW5ndGgKLQkgKiBpcyBqdXN0IGEgZ3Vlc3MKLQkgKi8KLQltc2xlZXAoMTApOwotfQotCi0vKiBjYWxsZXIgbXVzdCBob2xkIHR4X2xvY2sgKi8KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X2ZsdXNoX3F1ZXVlcyhzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMpCi17Ci0Jc3RydWN0IHR4YnVmZmVyICplbnRyeTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmc3RsYy0+dHhfc2VudCkpIHsKLQkJZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzdGxjLT50eF9zZW50LAotCQkJCQkgc3RydWN0IHR4YnVmZmVyLCB0eF9saXN0KTsKLQkJbGlzdF9kZWwoJmVudHJ5LT50eF9saXN0KTsKLQkJZGV2X2tmcmVlX3NrYihlbnRyeS0+c2tiKTsKLQkJc3RsYzQ1eHhfdHhidWZmZXJfZnJlZShzdGxjLCBlbnRyeSk7Ci0JfQotCi0JV0FSTl9PTighbGlzdF9lbXB0eSgmc3RsYy0+dHhfc2VudCkpOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZzdGxjLT50eF9wZW5kaW5nKSkgewotCQllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJnN0bGMtPnR4X3BlbmRpbmcsCi0JCQkJCSBzdHJ1Y3QgdHhidWZmZXIsIHR4X2xpc3QpOwotCQlsaXN0X2RlbCgmZW50cnktPnR4X2xpc3QpOwotCQlkZXZfa2ZyZWVfc2tiKGVudHJ5LT5za2IpOwotCQlzdGxjNDV4eF90eGJ1ZmZlcl9mcmVlKHN0bGMsIGVudHJ5KTsKLQl9Ci0KLQlXQVJOX09OKCFsaXN0X2VtcHR5KCZzdGxjLT50eF9wZW5kaW5nKSk7Ci0JV0FSTl9PTighbGlzdF9lbXB0eSgmc3RsYy0+dHhidWZmZXIpKTsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfd29ya19yZXNldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHN0bGM0NXh4ICpzdGxjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzdGxjNDV4eCwKLQkJCQkJICAgICB3b3JrX3Jlc2V0KTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCWlmIChzdGxjLT5md19zdGF0ZSAhPSBGV19TVEFURV9SRVNFVCkKLQkJZ290byBvdXQ7Ci0KLQlzdGxjNDV4eF9wb3dlcl9vZmYoc3RsYyk7Ci0KLQltdXRleF91bmxvY2soJnN0bGMtPm11dGV4KTsKLQotCS8qIHdhaXQgdGhhdCBhbGwgd29ya19zdHJ1Y3RzIGhhdmUgZmluaXNoZWQsIHdlIGNhbid0IGhvbGQKLQkgKiBzdGxjLT5tdXRleCB0byBhdm9pZCBkZWFkbG9jayAqLwotCWNhbmNlbF93b3JrX3N5bmMoJnN0bGMtPndvcmspOwotCi0JLyogRklYTUU6IGZpbmQgb3V0IGdvb2QgdmFsdWUgdG8gd2FpdCBmb3IgY2hpcCBwb3dlciBkb3duICovCi0JbXNsZWVwKDEwMCk7Ci0KLQltdXRleF9sb2NrKCZzdGxjLT5tdXRleCk7Ci0KLQkvKiBGSVhNRTogd2Ugc2hvdWxkIGdyYWNlZnVsbHkgaGFuZGxlIGlmIHRoZSBzdGF0ZSBoYXMgY2hhbmdlZAotCSAqIGFmdGVyIHJlLWFjcXVpcmluZyBtdXRleCAqLwotCVdBUk5fT04oc3RsYy0+Zndfc3RhdGUgIT0gRldfU1RBVEVfUkVTRVQpOwotCi0Jc3Bpbl9sb2NrX2JoKCZzdGxjLT50eF9sb2NrKTsKLQlzdGxjNDV4eF9mbHVzaF9xdWV1ZXMoc3RsYyk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnN0bGMtPnR4X2xvY2spOwotCi0Jc3RsYy0+Zndfc3RhdGUgPSBGV19TVEFURV9SRVNFVFRJTkc7Ci0KLQlzdGxjNDV4eF9wb3dlcl9vbihzdGxjKTsKLQlzdGxjNDV4eF91cGxvYWRfZmlybXdhcmUoc3RsYyk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJnN0bGMtPm11dGV4KTsKLX0KLQotLyogY2FsbGVyIG11c3QgaG9sZCBtdXRleCAqLwotc3RhdGljIHZvaWQgc3RsYzQ1eHhfcmVzZXQoc3RydWN0IHN0bGM0NXh4ICpzdGxjKQotewotCXN0bGM0NXh4X3dhcm5pbmcoInJlc2V0dGluZyBmaXJtd2FyZSIpOwotCXN0bGMtPmZ3X3N0YXRlID0gRldfU1RBVEVfUkVTRVQ7Ci0JaWVlZTgwMjExX3N0b3BfcXVldWVzKHN0bGMtPmh3KTsKLQlxdWV1ZV93b3JrKHN0bGMtPmh3LT53b3JrcXVldWUsICZzdGxjLT53b3JrX3Jlc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfd29ya190eF90aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHN0bGM0NXh4LAotCQkJCQkgICAgIHdvcmtfdHhfdGltZW91dC53b3JrKTsKLQotCXN0bGM0NXh4X3dhcm5pbmcoInR4IHRpbWVvdXQiKTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCWlmIChzdGxjLT5md19zdGF0ZSAhPSBGV19TVEFURV9SRUFEWSkKLQkJZ290byBvdXQ7Ci0KLQlzdGxjNDV4eF9yZXNldChzdGxjKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmc3RsYy0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBzdGxjNDV4eF9pbnRfYWNrKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgdTMyIHZhbCkKLXsKLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQlzdGxjNDV4eF93cml0ZTMyKHN0bGMsIFNQSV9BRFJTX0hPU1RfSU5UX0FDSywgdmFsKTsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfd2FrZXVwKHN0cnVjdCBzdGxjNDV4eCAqc3RsYykKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JdTMyIGludHM7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQkvKiB3YWtlIHRoZSBjaGlwICovCi0Jc3RsYzQ1eHhfd3JpdGUzMihzdGxjLCBTUElfQURSU19BUk1fSU5URVJSVVBUUywgU1BJX1RBUkdFVF9JTlRfV0FLRVVQKTsKLQotCS8qIEFuZCB3YWl0IGZvciB0aGUgUkVBRFkgaW50ZXJydXB0ICovCi0JdGltZW91dCA9IGppZmZpZXMgKyBIWjsKLQotCWludHMgPSBzdGxjNDV4eF9yZWFkMzIoc3RsYywgU1BJX0FEUlNfSE9TVF9JTlRFUlJVUFRTKTsKLQl3aGlsZSAoIShpbnRzICYgU1BJX0hPU1RfSU5UX1JFQURZKSkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKLQkJCQlnb3RvIG91dDsKLQkJaW50cyA9IHN0bGM0NXh4X3JlYWQzMihzdGxjLCBTUElfQURSU19IT1NUX0lOVEVSUlVQVFMpOwotCX0KLQotCXN0bGM0NXh4X2ludF9hY2soc3RsYywgU1BJX0hPU1RfSU5UX1JFQURZKTsKLQotb3V0OgotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfc2xlZXAoc3RydWN0IHN0bGM0NXh4ICpzdGxjKQotewotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCXN0bGM0NXh4X3dyaXRlMzIoc3RsYywgU1BJX0FEUlNfQVJNX0lOVEVSUlVQVFMsIFNQSV9UQVJHRVRfSU5UX1NMRUVQKTsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfaW50X3JlYWR5KHN0cnVjdCBzdGxjNDV4eCAqc3RsYykKLXsKLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQlzdGxjNDV4eF93cml0ZTMyKHN0bGMsIFNQSV9BRFJTX0hPU1RfSU5UX0VOLAotCQkJIFNQSV9IT1NUX0lOVF9VUERBVEUgfCBTUElfSE9TVF9JTlRfU1dfVVBEQVRFKTsKLQotCXN3aXRjaCAoc3RsYy0+Zndfc3RhdGUpIHsKLQljYXNlIEZXX1NUQVRFX0JPT1RJTkc6Ci0JCXN0bGMtPmZ3X3N0YXRlID0gRldfU1RBVEVfUkVBRFk7Ci0JCWNvbXBsZXRlKCZzdGxjLT5md19jb21wKTsKLQkJYnJlYWs7Ci0JY2FzZSBGV19TVEFURV9SRVNFVFRJTkc6Ci0JCXN0bGMtPmZ3X3N0YXRlID0gRldfU1RBVEVfUkVBRFk7Ci0KLQkJc3RsYzQ1eHhfdHhfc2NhbihzdGxjKTsKLQkJc3RsYzQ1eHhfdHhfc2V0dXAoc3RsYyk7Ci0JCXN0bGM0NXh4X3R4X2VkY2Yoc3RsYyk7Ci0KLQkJaWVlZTgwMjExX3dha2VfcXVldWVzKHN0bGMtPmh3KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IHN0bGM0NXh4X3J4X3R4YWNrKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87Ci0Jc3RydWN0IHNfbG1fY29udHJvbCAqY29udHJvbDsKLQlzdHJ1Y3Qgc19sbW9fdHggKnR4OwotCXN0cnVjdCB0eGJ1ZmZlciAqZW50cnk7Ci0JaW50IGZvdW5kID0gMDsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCWNvbnRyb2wgPSAoc3RydWN0IHNfbG1fY29udHJvbCAqKSBza2ItPmRhdGE7Ci0JdHggPSAoc3RydWN0IHNfbG1vX3R4ICopIChjb250cm9sICsgMSk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmc3RsYy0+dHhfc2VudCkpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXN0bGM0NXh4X3dhcm5pbmcoIm5vIGZyYW1lcyB3YWl0aW5nIGZvciAiCi0JCQkJCSAiYWNrbm93bGVkZ2VtZW50Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmc3RsYy0+dHhfc2VudCwgdHhfbGlzdCkgewotCQlpZiAoY29udHJvbC0+aGFuZGxlID09IGVudHJ5LT5oYW5kbGUpIHsKLQkJCWZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKCFmb3VuZCkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJc3RsYzQ1eHhfd2FybmluZygiY291bGRuJ3QgZmluZCBmcmFtZSBmb3IgdHggYWNrIDB4JXgiLAotCQkJCQkgY29udHJvbC0+aGFuZGxlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX1RYLCAiVFggQUNLIDB4JXgiLCBlbnRyeS0+aGFuZGxlKTsKLQotCWlmIChlbnRyeS0+c3RhdHVzX25lZWRlZCkgewotCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihlbnRyeS0+c2tiKTsKLQotCQlpZiAoISh0eC0+ZmxhZ3MgJiBMTV9UWF9GQUlMRUQpKSB7Ci0JCQkvKiBmcmFtZSB3YXMgYWNrZWQgKi8KLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKLQkJCWluZm8tPnN0YXR1cy5hY2tfc2lnbmFsID0gdHgtPnJjcGkgLyAyIC0gMTEwOwotCQl9Ci0KLQkJc2tiX3B1bGwoZW50cnktPnNrYiwgZW50cnktPmhlYWRlcl9sZW4pOwotCi0JCWllZWU4MDIxMV90eF9zdGF0dXMoc3RsYy0+aHcsIGVudHJ5LT5za2IpOwotCX0KLQotCWxpc3RfZGVsKCZlbnRyeS0+dHhfbGlzdCk7Ci0KLQlzdGxjNDV4eF9jaGVja190eHNlbnQoc3RsYyk7Ci0JaWYgKGxpc3RfZW1wdHkoJnN0bGMtPnR4X3NlbnQpKQotCQkvKiB0aGVyZSBhcmUgbm8gcGVuZGluZyBmcmFtZXMsIHdlIGNhbiBzdG9wIHRoZSB0eCB0aW1lb3V0Ci0JCSAqIHRpbWVyICovCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnN0bGMtPndvcmtfdHhfdGltZW91dCk7Ci0KLQlzcGluX2xvY2tfYmgoJnN0bGMtPnR4X2xvY2spOwotCi0Jc3RsYzQ1eHhfdHhidWZmZXJfZnJlZShzdGxjLCBlbnRyeSk7Ci0KLQlpZiAoc3RsYy0+dHhfcXVldWVfc3RvcHBlZCAmJgotCSAgICBzdGxjNDV4eF90eGJ1ZmZlcl9maW5kKHN0bGMsIE1BWF9GUkFNRV9MRU4pICE9IC0xKSB7Ci0JCXN0bGM0NXh4X2RlYnVnKERFQlVHX1FVRVVFLCAicm9vbSBpbiB0eCBidWZmZXIsIHdha2luZyBxdWV1ZXMiKTsKLQkJaWVlZTgwMjExX3dha2VfcXVldWVzKHN0bGMtPmh3KTsKLQkJc3RsYy0+dHhfcXVldWVfc3RvcHBlZCA9IDA7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnN0bGMtPnR4X2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3RsYzQ1eHhfcnhfY29udHJvbChzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHNfbG1fY29udHJvbCAqY29udHJvbDsKLQlpbnQgcmV0ID0gMDsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCWNvbnRyb2wgPSAoc3RydWN0IHNfbG1fY29udHJvbCAqKSBza2ItPmRhdGE7Ci0KLQlzd2l0Y2ggKGNvbnRyb2wtPm9pZCkgewotCWNhc2UgTE1fT0lEX1RYOgotCQlyZXQgPSBzdGxjNDV4eF9yeF90eGFjayhzdGxjLCBza2IpOwotCQlicmVhazsKLQljYXNlIExNX09JRF9TRVRVUDoKLQljYXNlIExNX09JRF9TQ0FOOgotCWNhc2UgTE1fT0lEX1RSQVA6Ci0JY2FzZSBMTV9PSURfRURDRjoKLQljYXNlIExNX09JRF9LRVlDQUNIRToKLQljYXNlIExNX09JRF9QU006Ci0JY2FzZSBMTV9PSURfU1RBVFM6Ci0JY2FzZSBMTV9PSURfTEVEOgotCWRlZmF1bHQ6Ci0JCXN0bGM0NXh4X3dhcm5pbmcoInVuaGFuZGxlZCByeCBjb250cm9sIG9pZCAlZFxuIiwKLQkJCQkgY29udHJvbC0+b2lkKTsKLQkJYnJlYWs7Ci0JfQotCi0JZGV2X2tmcmVlX3NrYihza2IpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogY29waWVkIGZyb20gbWFjODAyMTEgKi8KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3BhcnNlX2VsZW1zKHU4ICpzdGFydCwgc2l6ZV90IGxlbiwKLQkJCQkgc3RydWN0IHN0bGM0NXh4X2llX3RpbSAqKnRpbSwKLQkJCQkgc2l6ZV90ICp0aW1fbGVuKQotewotCXNpemVfdCBsZWZ0ID0gbGVuOwotCXU4ICpwb3MgPSBzdGFydDsKLQotCXdoaWxlIChsZWZ0ID49IDIpIHsKLQkJdTggaWQsIGVsZW47Ci0KLQkJaWQgPSAqcG9zKys7Ci0JCWVsZW4gPSAqcG9zKys7Ci0JCWxlZnQgLT0gMjsKLQotCQlpZiAoZWxlbiA+IGxlZnQpCi0JCQlyZXR1cm47Ci0KLQkJc3dpdGNoIChpZCkgewotCQljYXNlIFdMQU5fRUlEX1RJTToKLQkJCSp0aW0gPSAoc3RydWN0IHN0bGM0NXh4X2llX3RpbSAqKSBwb3M7Ci0JCQkqdGltX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJbGVmdCAtPSBlbGVuOwotCQlwb3MgKz0gZWxlbjsKLQl9Ci19Ci0KLS8qCi0gKiBtYWM4MDIxMSBkb2Vzbid0IGhhdmUgc3VwcG9ydCBmb3IgYXNraW5nIGZyYW1lcyB3aXRoIFBTLVBvbGwsIHNvIGxldCdzCi0gKiBpbXBsZW1lbnQgaW4gdGhlIGRyaXZlciBmb3Igbm93LiBXZSBoYXZlIHRvIGFkZCBzdXBwb3J0IHRvIG1hYzgwMjExCi0gKiBsYXRlci4KLSAqLwotc3RhdGljIGludCBzdGxjNDV4eF9jaGVja19tb3JlX2RhdGEoc3RydWN0IHN0bGM0NXh4ICpzdGxjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBzX2xtX2RhdGFfaW4gKmRhdGEgPSAoc3RydWN0IHNfbG1fZGF0YV9pbiAqKSBza2ItPmRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQlzaXplX3QgbGVuOwotCXUxNiBmYzsKLQotCWhkciA9ICh2b2lkICopIHNrYi0+ZGF0YSArIHNpemVvZigqZGF0YSk7Ci0JbGVuID0gc2tiLT5sZW4gLSBzaXplb2YoKmRhdGEpOwotCi0JLyogbWluaW11bSBmcmFtZSBsZW5ndGggaXMgdGhlIG51bGwgZnJhbWUgbGVuZ3RoIDI0IGJ5dGVzICovCi0JaWYgKGxlbiA8IDI0KSB7Ci0JCXN0bGM0NXh4X3dhcm5pbmcoImludmFsaWQgZnJhbWUgbGVuZ3RoIHdoZW4gY2hlY2tpbmcgZm9yICIKLQkJCQkgIm1vcmUgZGF0YSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7Ci0JaWYgKCEoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKQotCQkvKiB0aGlzIGlzIG5vdCBmcm9tIERTICovCi0JCXJldHVybiAwOwotCi0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihoZHItPmFkZHIxLCBzdGxjLT5tYWNfYWRkcikgIT0gMCkKLQkJLyogdGhlIGZyYW1lIHdhcyBub3QgZm9yIHVzICovCi0JCXJldHVybiAwOwotCi0JaWYgKCEoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFREFUQSkpIHsKLQkJLyogQVAgaGFzIG5vIG1vcmUgZnJhbWVzIGJ1ZmZlcmVkIGZvciB1cyAqLwotCQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19QU00sICJhbGwgYnVmZmVyZWQgZnJhbWVzIHJldHJpZXZlZCIpOwotCQlzdGxjLT5wc3BvbGxpbmcgPSBmYWxzZTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogTU9SRURBVEEgYml0IGlzIHNldCwgbGV0J3MgYXNrIGZvciBhIG5ldyBmcmFtZSBmcm9tIHRoZSBBUCAqLwotCXN0bGM0NXh4X3R4X3BzcG9sbChzdGxjLCBzdGxjLT5wc20pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBtYWM4MDIxMSBjYW5ub3QgcmVhZCBUSU0gZnJvbSBiZWFjb25zLCBzbyBsZXQncyBhZGQgYSBoYWNrIHRvIHRoZQotICogZHJpdmVyLiBXZSBoYXZlIHRvIGFkZCBzdXBwb3J0IHRvIG1hYzgwMjExIGxhdGVyLgotICovCi1zdGF0aWMgaW50IHN0bGM0NXh4X3J4X2RhdGFfYmVhY29uKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3Qgc19sbV9kYXRhX2luICpkYXRhID0gKHN0cnVjdCBzX2xtX2RhdGFfaW4gKikgc2tiLT5kYXRhOwotCXNpemVfdCBsZW4gPSBza2ItPmxlbiwgdGltX2xlbiA9IDAsIGJhc2VsZW4sIHB2Ym1hcF9sZW47Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXN0cnVjdCBzdGxjNDV4eF9pZV90aW0gKnRpbSA9IE5VTEw7Ci0JaW50IGJtYXBfb2Zmc2V0LCBpbmRleCwgYWlkX2JpdDsKLQotCW1nbXQgPSAodm9pZCAqKSBza2ItPmRhdGEgKyBzaXplb2YoKmRhdGEpOwotCi0JYmFzZWxlbiA9ICh1OCAqKSBtZ210LT51LmJlYWNvbi52YXJpYWJsZSAtICh1OCAqKSBtZ210OwotCWlmIChiYXNlbGVuID4gbGVuKSB7Ci0JCXN0bGM0NXh4X3dhcm5pbmcoImludmFsaWQgYmFzZWxlbiBpbiBiZWFjb24iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3RsYzQ1eHhfcGFyc2VfZWxlbXMobWdtdC0+dS5iZWFjb24udmFyaWFibGUsIGxlbiAtIGJhc2VsZW4sICZ0aW0sCi0JCQkgICAgICZ0aW1fbGVuKTsKLQotCWlmICghdGltKSB7Ci0JCXN0bGM0NXh4X3dhcm5pbmcoImRpZG4ndCBmaW5kIHRpbSBmcm9tIGEgYmVhY29uIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWJtYXBfb2Zmc2V0ID0gdGltLT5ibWFwX2NvbnRyb2wgJiAweGZlOwotCWluZGV4ID0gc3RsYy0+YWlkIC8gOCAtIGJtYXBfb2Zmc2V0OwotCi0JcHZibWFwX2xlbiA9IHRpbV9sZW4gLSAzOwotCWlmIChpbmRleCA+IHB2Ym1hcF9sZW4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYWlkX2JpdCA9ICEhKHRpbS0+cHZibWFwW2luZGV4XSAmICgxIDw8IHN0bGMtPmFpZCAlIDgpKTsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX1BTTSwgImZjIDB4JXggZHVyYXRpb24gJWQgc2VxICVkIGR0aW0gJXUgIgotCQkgICAgICAgImJtYXBfY29udHJvbCAweCV4IGFpZF9iaXQgJWQiLAotCQkgICAgICAgbWdtdC0+ZnJhbWVfY29udHJvbCwgbWdtdC0+ZHVyYXRpb24sIG1nbXQtPnNlcV9jdHJsID4+IDQsCi0JCSAgICAgICB0aW0tPmR0aW1fY291bnQsIHRpbS0+Ym1hcF9jb250cm9sLCBhaWRfYml0KTsKLQotCWlmICghYWlkX2JpdCkKLQkJcmV0dXJuIDA7Ci0KLQlzdGxjLT5wc3BvbGxpbmcgPSB0cnVlOwotCXN0bGM0NXh4X3R4X3BzcG9sbChzdGxjLCBzdGxjLT5wc20pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3RsYzQ1eHhfcnhfZGF0YShzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBzX2xtX2RhdGFfaW4gKmRhdGEgPSAoc3RydWN0IHNfbG1fZGF0YV9pbiAqKSBza2ItPmRhdGE7Ci0JaW50IGFsaWduID0gMDsKLQl1OCAqcCwgYWxpZ25fbGVuOwotCXUxNiBsZW47Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoc3RsYy0+cHNtKSB7Ci0JCWlmIChkYXRhLT5mbGFncyAmIExNX0lOX0JFQUNPTikKLQkJCXN0bGM0NXh4X3J4X2RhdGFfYmVhY29uKHN0bGMsIHNrYik7Ci0JCWVsc2UgaWYgKHN0bGMtPnBzcG9sbGluZyAmJiAoZGF0YS0+ZmxhZ3MgJiBMTV9JTl9EQVRBKSkKLQkJCXN0bGM0NXh4X2NoZWNrX21vcmVfZGF0YShzdGxjLCBza2IpOwotCX0KLQotCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RhdHVzKSk7Ci0KLQlzdGF0dXMuZnJlcSA9IGRhdGEtPmZyZXF1ZW5jeTsKLQlzdGF0dXMuc2lnbmFsID0gZGF0YS0+cmNwaSAvIDIgLSAxMTA7Ci0KLQkvKiBsZXQncyBhc3N1bWUgdGhhdCBtYXhpbXVtIHJjcGkgdmFsdWUgaXMgMTQwICg9IDM1IGRCbSkgKi8KLQlzdGF0dXMucXVhbCA9IGRhdGEtPnJjcGkgKiAxMDAgLyAxNDA7Ci0KLQlzdGF0dXMuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0KLQkvKgotCSAqIEZJWE1FOiB0aGlzIGdpdmVzIHdhcm5pbmcgZnJvbSBfX2llZWU4MDIxMV9yeCgpCi0JICoKLQkgKiBzdGF0dXMucmF0ZV9pZHggPSBkYXRhLT5yYXRlOwotCSAqLwotCi0JbGVuID0gZGF0YS0+bGVuZ3RoOwotCi0JaWYgKGRhdGEtPmZsYWdzICYgTE1fRkxBR19BTElHTikKLQkJYWxpZ24gPSAxOwotCi0Jc2tiX3B1bGwoc2tiLCBzaXplb2YoKmRhdGEpKTsKLQotCWlmIChhbGlnbikgewotCQlwID0gc2tiLT5kYXRhOwotCQlhbGlnbl9sZW4gPSAqcDsKLQkJc2tiX3B1bGwoc2tiLCBhbGlnbl9sZW4pOwotCX0KLQotCXNrYl90cmltKHNrYiwgbGVuKTsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX1JYLCAicnggZGF0YSAweCVwICVkIEIiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQlzdGxjNDV4eF9kdW1wKERFQlVHX1JYX0NPTlRFTlQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCi0JbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7Ci0JaWVlZTgwMjExX3J4KHN0bGMtPmh3LCBza2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IHN0bGM0NXh4X3J4KHN0cnVjdCBzdGxjNDV4eCAqc3RsYykKLXsKLQlzdHJ1Y3Qgc19sbV9jb250cm9sICpjb250cm9sOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHJldDsKLQl1MTYgbGVuOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfRlVOQywgIiVzIiwgX19mdW5jX18pOwotCi0Jc3RsYzQ1eHhfd2FrZXVwKHN0bGMpOwotCi0JLyogZHVtbXkgcmVhZCB0byBmbHVzaCBTUEkgRE1BIGNvbnRyb2xsZXIgYnVnICovCi0Jc3RsYzQ1eHhfcmVhZDE2KHN0bGMsIFNQSV9BRFJTX0dFTl9QVVJQXzEpOwotCi0JbGVuID0gc3RsYzQ1eHhfcmVhZDE2KHN0bGMsIFNQSV9BRFJTX0RNQV9EQVRBKTsKLQotCWlmIChsZW4gPT0gMCkgewotCQlzdGxjNDV4eF93YXJuaW5nKCJyeCByZXF1ZXN0IG9mIHplcm8gYnl0ZXMiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOwotCWlmICghc2tiKSB7Ci0JCXN0bGM0NXh4X3dhcm5pbmcoImNvdWxkIG5vdCBhbGxvYyBza2IiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3RsYzQ1eHhfc3BpX3JlYWQoc3RsYywgU1BJX0FEUlNfRE1BX0RBVEEsIHNrYl9wdXQoc2tiLCBsZW4pLCBsZW4pOwotCi0Jc3RsYzQ1eHhfc2xlZXAoc3RsYyk7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19SWCwgInJ4IGZyYW1lIDB4JXAgJWQgQiIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCXN0bGM0NXh4X2R1bXAoREVCVUdfUlhfQ09OVEVOVCwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0KLQljb250cm9sID0gKHN0cnVjdCBzX2xtX2NvbnRyb2wgKikgc2tiLT5kYXRhOwotCi0JaWYgKGNvbnRyb2wtPmZsYWdzICYgTE1fRkxBR19DT05UUk9MKQotCQlyZXQgPSBzdGxjNDV4eF9yeF9jb250cm9sKHN0bGMsIHNrYik7Ci0JZWxzZQotCQlyZXQgPSBzdGxjNDV4eF9yeF9kYXRhKHN0bGMsIHNrYik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBzdGxjNDV4eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqY29uZmlnKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBjb25maWc7Ci0Jc3RydWN0IHN0bGM0NXh4ICpzdGxjID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19JUlEsICJJUlEiKTsKLQotCXF1ZXVlX3dvcmsoc3RsYy0+aHctPndvcmtxdWV1ZSwgJnN0bGMtPndvcmspOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHN0bGM0NXh4X3R4X2ZyYW1lKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgdTMyIGFkZHJlc3MsCi0JCQkgICAgIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3Qgc19kbWFfcmVncyBkbWFfcmVnczsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JaW50IHJldCA9IDA7Ci0JdTMyIGludHM7Ci0KLQlzdGxjLT50eF9mcmFtZXMrKzsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX1RYLCAidHggZnJhbWUgMHglcCAlenUgQiIsIGJ1ZiwgbGVuKTsKLQlzdGxjNDV4eF9kdW1wKERFQlVHX1RYX0NPTlRFTlQsIGJ1ZiwgbGVuKTsKLQotCXN0bGM0NXh4X3dha2V1cChzdGxjKTsKLQotCWRtYV9yZWdzLmNtZCAgPSBTUElfRE1BX1dSSVRFX0NUUkxfRU5BQkxFOwotCWRtYV9yZWdzLmxlbiAgPSBjcHVfdG9fbGUxNihsZW4pOwotCWRtYV9yZWdzLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyZXNzKTsKLQotCXN0bGM0NXh4X3NwaV93cml0ZShzdGxjLCBTUElfQURSU19ETUFfV1JJVEVfQ1RSTCwgJmRtYV9yZWdzLAotCQkJICAgc2l6ZW9mKGRtYV9yZWdzKSk7Ci0KLQlzdGxjNDV4eF9zcGlfd3JpdGUoc3RsYywgU1BJX0FEUlNfRE1BX0RBVEEsIGJ1ZiwgbGVuKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgMiAqIEhaOwotCWludHMgPSBzdGxjNDV4eF9yZWFkMzIoc3RsYywgU1BJX0FEUlNfSE9TVF9JTlRFUlJVUFRTKTsKLQl3aGlsZSAoIShpbnRzICYgU1BJX0hPU1RfSU5UX1dSX1JFQURZKSkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewotCQkJc3RsYzQ1eHhfd2FybmluZygiV1JfUkVBRFkgdGltZW91dCIpOwotCQkJcmV0ID0gLTE7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpbnRzID0gc3RsYzQ1eHhfcmVhZDMyKHN0bGMsIFNQSV9BRFJTX0hPU1RfSU5URVJSVVBUUyk7Ci0JfQotCi0Jc3RsYzQ1eHhfaW50X2FjayhzdGxjLCBTUElfSE9TVF9JTlRfV1JfUkVBRFkpOwotCi0Jc3RsYzQ1eHhfc2xlZXAoc3RsYyk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHN0bGM0NXh4X3dxX3R4KHN0cnVjdCBzdGxjNDV4eCAqc3RsYykKLXsKLQlzdHJ1Y3QgdHhidWZmZXIgKmVudHJ5OwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZzdGxjLT50eF9sb2NrKTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmc3RsYy0+dHhfcGVuZGluZykpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KHN0bGMtPnR4X3BlbmRpbmcubmV4dCwKLQkJCQkgICBzdHJ1Y3QgdHhidWZmZXIsIHR4X2xpc3QpOwotCi0JCWxpc3RfZGVsX2luaXQoJmVudHJ5LT50eF9saXN0KTsKLQotCQlzcGluX3VubG9ja19iaCgmc3RsYy0+dHhfbG9jayk7Ci0KLQkJcmV0ID0gc3RsYzQ1eHhfdHhfZnJhbWUoc3RsYywgZW50cnktPmZyYW1lX3N0YXJ0LAotCQkJCQllbnRyeS0+c2tiLT5kYXRhLCBlbnRyeS0+c2tiLT5sZW4pOwotCi0JCXNwaW5fbG9ja19iaCgmc3RsYy0+dHhfbG9jayk7Ci0KLQkJaWYgKHJldCA8IDApIHsKLQkJCS8qIGZyYW1lIHRyYW5zZmVyIHRvIGZpcm13YXJlIGJ1ZmZlciBmYWlsZWQgKi8KLQkJCS8qIEZJWE1FOiByZXBvcnQgdGhpcyB0byBtYWM4MDIxMSAqLwotCQkJZGV2X2tmcmVlX3NrYihlbnRyeS0+c2tiKTsKLQkJCXN0bGM0NXh4X3R4YnVmZmVyX2ZyZWUoc3RsYywgZW50cnkpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlsaXN0X2FkZCgmZW50cnktPnR4X2xpc3QsICZzdGxjLT50eF9zZW50KTsKLQkJcXVldWVfZGVsYXllZF93b3JrKHN0bGMtPmh3LT53b3JrcXVldWUsCi0JCQkJICAgJnN0bGMtPndvcmtfdHhfdGltZW91dCwKLQkJCQkgICBtc2Vjc190b19qaWZmaWVzKFRYX1RJTUVPVVQpKTsKLQl9Ci0KLW91dDoKLQlzcGluX3VubG9ja19iaCgmc3RsYy0+dHhfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHN0bGM0NXh4ICpzdGxjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzdGxjNDV4eCwgd29yayk7Ci0JdTMyIGludHM7Ci0JaW50IHJldDsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCWlmIChzdGxjLT5md19zdGF0ZSA9PSBGV19TVEFURV9PRkYgJiYKLQkgICAgc3RsYy0+Zndfc3RhdGUgPT0gRldfU1RBVEVfUkVTRVQpCi0JCWdvdG8gb3V0OwotCi0JaW50cyA9IHN0bGM0NXh4X3JlYWQzMihzdGxjLCBTUElfQURSU19IT1NUX0lOVEVSUlVQVFMpOwotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0JILCAiYmVnaW4gaG9zdF9pbnRzIDB4JTA4eCIsIGludHMpOwotCi0JaWYgKGludHMgJiBTUElfSE9TVF9JTlRfUkVBRFkpIHsKLQkJc3RsYzQ1eHhfaW50X3JlYWR5KHN0bGMpOwotCQlzdGxjNDV4eF9pbnRfYWNrKHN0bGMsIFNQSV9IT1NUX0lOVF9SRUFEWSk7Ci0JfQotCi0JaWYgKHN0bGMtPmZ3X3N0YXRlICE9IEZXX1NUQVRFX1JFQURZKQotCQlnb3RvIG91dDsKLQotCWlmIChpbnRzICYgU1BJX0hPU1RfSU5UX1VQREFURSkgewotCQlzdGxjNDV4eF9pbnRfYWNrKHN0bGMsIFNQSV9IT1NUX0lOVF9VUERBVEUpOwotCQlyZXQgPSBzdGxjNDV4eF9yeChzdGxjKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXN0bGM0NXh4X3Jlc2V0KHN0bGMpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JaWYgKGludHMgJiBTUElfSE9TVF9JTlRfU1dfVVBEQVRFKSB7Ci0JCXN0bGM0NXh4X2ludF9hY2soc3RsYywgU1BJX0hPU1RfSU5UX1NXX1VQREFURSk7Ci0JCXJldCA9IHN0bGM0NXh4X3J4KHN0bGMpOwotCQlpZiAocmV0IDwgMCkgewotCQkJc3RsYzQ1eHhfcmVzZXQoc3RsYyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCXJldCA9IHN0bGM0NXh4X3dxX3R4KHN0bGMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXN0bGM0NXh4X3Jlc2V0KHN0bGMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpbnRzID0gc3RsYzQ1eHhfcmVhZDMyKHN0bGMsIFNQSV9BRFJTX0hPU1RfSU5URVJSVVBUUyk7Ci0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfQkgsICJlbmQgaG9zdF9pbnRzIDB4JTA4eCIsIGludHMpOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZzdGxjLT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3R4X2VkY2Yoc3RydWN0IHN0bGM0NXh4ICpzdGxjKQotewotCXN0cnVjdCBzX2xtX2NvbnRyb2wgKmNvbnRyb2w7Ci0Jc3RydWN0IHNfbG1vX2VkY2YgKmVkY2Y7Ci0Jc2l6ZV90IGxlbiwgZWRjZl9sZW47Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQllZGNmX2xlbiA9IHNpemVvZigqZWRjZik7Ci0JbGVuID0gc2l6ZW9mKCpjb250cm9sKSArIGVkY2ZfbGVuOwotCWNvbnRyb2wgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JZWRjZiA9IChzdHJ1Y3Qgc19sbW9fZWRjZiAqKSAoY29udHJvbCArIDEpOwotCi0JY29udHJvbC0+ZmxhZ3MgPSBMTV9GTEFHX0NPTlRST0wgfCBMTV9DVFJMX09QU0VUOwotCWNvbnRyb2wtPmxlbmd0aCA9IGVkY2ZfbGVuOwotCWNvbnRyb2wtPm9pZCA9IExNX09JRF9FRENGOwotCi0JZWRjZi0+c2xvdHRpbWUgPSAweDE0OwotCWVkY2YtPnNpZnMgPSAxMDsKLQllZGNmLT5lb2ZwYWQgPSA2OwotCWVkY2YtPm1heGJ1cnN0ID0gMTUwMDsKLQotCWVkY2YtPnF1ZXVlc1swXS5haWZzID0gMjsKLQllZGNmLT5xdWV1ZXNbMF0ucGFkMCA9IDE7Ci0JZWRjZi0+cXVldWVzWzBdLmN3bWluID0gMzsKLQllZGNmLT5xdWV1ZXNbMF0uY3dtYXggPSA3OwotCWVkY2YtPnF1ZXVlc1swXS50eG9wID0gNDc7Ci0JZWRjZi0+cXVldWVzWzFdLmFpZnMgPSAyOwotCWVkY2YtPnF1ZXVlc1sxXS5wYWQwID0gMDsKLQllZGNmLT5xdWV1ZXNbMV0uY3dtaW4gPSA3OwotCWVkY2YtPnF1ZXVlc1sxXS5jd21heCA9IDE1OwotCWVkY2YtPnF1ZXVlc1sxXS50eG9wID0gOTQ7Ci0JZWRjZi0+cXVldWVzWzJdLmFpZnMgPSAzOwotCWVkY2YtPnF1ZXVlc1syXS5wYWQwID0gMDsKLQllZGNmLT5xdWV1ZXNbMl0uY3dtaW4gPSAxNTsKLQllZGNmLT5xdWV1ZXNbMl0uY3dtYXggPSAxMDIzOwotCWVkY2YtPnF1ZXVlc1syXS50eG9wID0gMDsKLQllZGNmLT5xdWV1ZXNbM10uYWlmcyA9IDc7Ci0JZWRjZi0+cXVldWVzWzNdLnBhZDAgPSAwOwotCWVkY2YtPnF1ZXVlc1szXS5jd21pbiA9IDE1OwotCWVkY2YtPnF1ZXVlc1szXS5jd21heCA9IDEwMjM7Ci0JZWRjZi0+cXVldWVzWzNdLnR4b3AgPSAwOwotCWVkY2YtPnF1ZXVlc1s0XS5haWZzID0gMTM7Ci0JZWRjZi0+cXVldWVzWzRdLnBhZDAgPSA5OTsKLQllZGNmLT5xdWV1ZXNbNF0uY3dtaW4gPSAzNDM3OwotCWVkY2YtPnF1ZXVlc1s0XS5jd21heCA9IDUxMjsKLQllZGNmLT5xdWV1ZXNbNF0udHhvcCA9IDEyOwotCWVkY2YtPnF1ZXVlc1s1XS5haWZzID0gMTQyOwotCWVkY2YtPnF1ZXVlc1s1XS5wYWQwID0gMTA5OwotCWVkY2YtPnF1ZXVlc1s1XS5jd21pbiA9IDg3NTY7Ci0JZWRjZi0+cXVldWVzWzVdLmN3bWF4ID0gNjsKLQllZGNmLT5xdWV1ZXNbNV0udHhvcCA9IDA7Ci0JZWRjZi0+cXVldWVzWzZdLmFpZnMgPSA0OwotCWVkY2YtPnF1ZXVlc1s2XS5wYWQwID0gMDsKLQllZGNmLT5xdWV1ZXNbNl0uY3dtaW4gPSAwOwotCWVkY2YtPnF1ZXVlc1s2XS5jd21heCA9IDU4NzA1OwotCWVkY2YtPnF1ZXVlc1s2XS50eG9wID0gMjU3MTY7Ci0JZWRjZi0+cXVldWVzWzddLmFpZnMgPSAwOwotCWVkY2YtPnF1ZXVlc1s3XS5wYWQwID0gMDsKLQllZGNmLT5xdWV1ZXNbN10uY3dtaW4gPSAwOwotCWVkY2YtPnF1ZXVlc1s3XS5jd21heCA9IDA7Ci0JZWRjZi0+cXVldWVzWzddLnR4b3AgPSAwOwotCi0Jc3RsYzQ1eHhfdHhfZnJhbWUoc3RsYywgRklSTVdBUkVfQ09ORklHX1NUQVJULCBjb250cm9sLCBsZW4pOwotCi0Ja2ZyZWUoY29udHJvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X3R4X3NldHVwKHN0cnVjdCBzdGxjNDV4eCAqc3RsYykKLXsKLQlzdHJ1Y3Qgc19sbV9jb250cm9sICpjb250cm9sOwotCXN0cnVjdCBzX2xtb19zZXR1cCAqc2V0dXA7Ci0Jc2l6ZV90IGxlbiwgc2V0dXBfbGVuOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfRlVOQywgIiVzIiwgX19mdW5jX18pOwotCi0Jc2V0dXBfbGVuID0gc2l6ZW9mKCpzZXR1cCk7Ci0JbGVuID0gc2l6ZW9mKCpjb250cm9sKSArIHNldHVwX2xlbjsKLQljb250cm9sID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCXNldHVwID0gKHN0cnVjdCBzX2xtb19zZXR1cCAqKSAoY29udHJvbCArIDEpOwotCi0JY29udHJvbC0+ZmxhZ3MgPSBMTV9GTEFHX0NPTlRST0wgfCBMTV9DVFJMX09QU0VUOwotCWNvbnRyb2wtPmxlbmd0aCA9IHNldHVwX2xlbjsKLQljb250cm9sLT5vaWQgPSBMTV9PSURfU0VUVVA7Ci0KLQlzZXR1cC0+ZmxhZ3MgPSBMTV9TRVRVUF9JTkZSQTsKLQlzZXR1cC0+YW50ZW5uYSA9IDI7Ci0Jc2V0dXAtPnJ4X2FsaWduID0gMDsKLQlzZXR1cC0+cnhfYnVmZmVyID0gRklSTVdBUkVfUlhCVUZGRVJfU1RBUlQ7Ci0Jc2V0dXAtPnJ4X210dSA9IEZJUk1XQVJFX01UVTsKLQlzZXR1cC0+ZnJvbnRlbmQgPSA1OwotCXNldHVwLT50aW1lb3V0ID0gMDsKLQlzZXR1cC0+dHJ1bmNhdGUgPSA0ODg5NjsKLQlzZXR1cC0+YnJhdGVtYXNrID0gMHhmZmZmZmZmZjsKLQlzZXR1cC0+cmVmX2Nsb2NrID0gNjQ0MjQ1MDk0OwotCXNldHVwLT5scGZfYmFuZHdpZHRoID0gNjU1MzU7Ci0Jc2V0dXAtPm9zY19zdGFydF9kZWxheSA9IDY1NTM1OwotCi0JbWVtY3B5KHNldHVwLT5tYWNhZGRyLCBzdGxjLT5tYWNfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShzZXR1cC0+YnNzaWQsIHN0bGMtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQlzdGxjNDV4eF90eF9mcmFtZShzdGxjLCBGSVJNV0FSRV9DT05GSUdfU1RBUlQsIGNvbnRyb2wsIGxlbik7Ci0KLQlrZnJlZShjb250cm9sKTsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfdHhfc2NhbihzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMpCi17Ci0Jc3RydWN0IHNfbG1fY29udHJvbCAqY29udHJvbDsKLQlzdHJ1Y3Qgc19sbW9fc2NhbiAqc2NhbjsKLQlzaXplX3QgbGVuLCBzY2FuX2xlbjsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCXNjYW5fbGVuID0gc2l6ZW9mKCpzY2FuKTsKLQlsZW4gPSBzaXplb2YoKmNvbnRyb2wpICsgc2Nhbl9sZW47Ci0JY29udHJvbCA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQlzY2FuID0gKHN0cnVjdCBzX2xtb19zY2FuICopIChjb250cm9sICsgMSk7Ci0KLQljb250cm9sLT5mbGFncyA9IExNX0ZMQUdfQ09OVFJPTCB8IExNX0NUUkxfT1BTRVQ7Ci0JY29udHJvbC0+bGVuZ3RoID0gc2Nhbl9sZW47Ci0JY29udHJvbC0+b2lkID0gTE1fT0lEX1NDQU47Ci0KLQlzY2FuLT5mbGFncyA9IExNX1NDQU5fRVhJVDsKLQlzY2FuLT5icmF0ZW1hc2sgPSAweDE1ZjsKLQlzY2FuLT5hbG9mdFswXSA9IDM7Ci0Jc2Nhbi0+YWxvZnRbMV0gPSAzOwotCXNjYW4tPmFsb2Z0WzJdID0gMTsKLQlzY2FuLT5hbG9mdFszXSA9IDA7Ci0Jc2Nhbi0+YWxvZnRbNF0gPSAwOwotCXNjYW4tPmFsb2Z0WzVdID0gMDsKLQlzY2FuLT5hbG9mdFs2XSA9IDA7Ci0Jc2Nhbi0+YWxvZnRbN10gPSAwOwotCi0JbWVtY3B5KCZzY2FuLT5yc3NpY2FsLCAmc3RsYy0+Y2FsX3Jzc2lbKHN0bGMtPmNoYW5uZWwgLSAxKSAqCi0JCQkJCSAgICAgICBSU1NJX0NBTF9MRU5dLAotCSAgICAgICBSU1NJX0NBTF9MRU4pOwotCW1lbWNweSgmc2Nhbi0+Y2hhbm5lbCwgJnN0bGMtPmNhbF9jaGFubmVsc1soc3RsYy0+Y2hhbm5lbCAtIDEpICoKLQkJCQkJCSAgIENIQU5ORUxfQ0FMX0xFTl0sCi0JICAgICAgIENIQU5ORUxfQ0FMX0xFTik7Ci0KLQlzdGxjNDV4eF90eF9mcmFtZShzdGxjLCBGSVJNV0FSRV9DT05GSUdfU1RBUlQsIGNvbnRyb2wsIGxlbik7Ci0KLQlrZnJlZShjb250cm9sKTsKLX0KLQotLyoKLSAqIGNhbGxlciBtdXN0IGhvbGQgbXV0ZXgKLSAqLwotc3RhdGljIGludCBzdGxjNDV4eF90eF9wc3BvbGwoc3RydWN0IHN0bGM0NXh4ICpzdGxjLCBib29sIHBvd2Vyc2F2ZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHNwb2xsOwotCWludCBwYXlsb2FkX2xlbiwgcGFkZGluZywgaTsKLQlzdHJ1Y3Qgc19sbV9kYXRhX291dCAqZGF0YTsKLQlzdHJ1Y3QgdHhidWZmZXIgKmVudHJ5OwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JY2hhciAqcGF5bG9hZDsKLQl1MTYgZmM7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHN0bGMtPmh3LT5leHRyYV90eF9oZWFkcm9vbSArIDE2KTsKLQlpZiAoIXNrYikgewotCQlzdGxjNDV4eF93YXJuaW5nKCJmYWlsZWQgdG8gYWxsb2NhdGUgcHNwb2xsIGZyYW1lIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlza2JfcmVzZXJ2ZShza2IsIHN0bGMtPmh3LT5leHRyYV90eF9oZWFkcm9vbSk7Ci0KLQlwc3BvbGwgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiX3B1dChza2IsIDE2KTsKLQltZW1zZXQocHNwb2xsLCAwLCAxNik7Ci0JZmMgPSBJRUVFODAyMTFfRlRZUEVfQ1RMIHwgSUVFRTgwMjExX1NUWVBFX1BTUE9MTDsKLQlpZiAocG93ZXJzYXZlKQotCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9QTTsKLQlwc3BvbGwtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihmYyk7Ci0JcHNwb2xsLT5kdXJhdGlvbl9pZCA9IGNwdV90b19sZTE2KHN0bGMtPmFpZCk7Ci0KLQkvKiBhaWQgaW4gUFMtUG9sbCBoYXMgaXRzIHR3byBNU0JzIGVhY2ggc2V0IHRvIDEgKi8KLQlwc3BvbGwtPmR1cmF0aW9uX2lkIHw9IGNwdV90b19sZTE2KDEgPDwgMTUpIHwgY3B1X3RvX2xlMTYoMSA8PCAxNCk7Ci0KLQltZW1jcHkocHNwb2xsLT5hZGRyMSwgc3RsYy0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkocHNwb2xsLT5hZGRyMiwgc3RsYy0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX1BTTSwgInNlbmRpbmcgUFMtUG9sbCBmcmFtZSB0byAlcE0gKHBvd2Vyc2F2ZSAlZCwgIgotCQkgICAgICAgImZjIDB4JXgsIGFpZCAlZCkiLCBwc3BvbGwtPmFkZHIxLAotCQkgICAgICAgcG93ZXJzYXZlLCBmYywgc3RsYy0+YWlkKTsKLQotCXNwaW5fbG9ja19iaCgmc3RsYy0+dHhfbG9jayk7Ci0KLQllbnRyeSA9IHN0bGM0NXh4X3R4YnVmZmVyX2FsbG9jKHN0bGMsIHNrYi0+bGVuKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZzdGxjLT50eF9sb2NrKTsKLQotCWlmICghZW50cnkpIHsKLQkJLyoKLQkJICogVGhlIHF1ZXVlIHNob3VsZCBiZSBzdG9wcGVkIGJlZm9yZSB0aGUgZmlybXdhcmUgYnVmZmVyCi0JCSAqIGlzIGZ1bGwsIHNvIGZpcm13YXJlIGJ1ZmZlciBzaG91bGQgYWx3YXlzIGhhdmUgZW5vdWdoCi0JCSAqIHNwYWNlLgotCQkgKgotCQkgKiBCdXQgSSdtIHRvbyBsYXp5IGFuZCBvbWl0IGl0IGZvciBub3cuCi0JCSAqLwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJc3RsYzQ1eHhfd2FybmluZygiZmlybXdhcmUgdHggYnVmZmVyIGZ1bGwgaXMgZnVsbCAiCi0JCQkJCSAiZm9yIG51bGwgZnJhbWUiKTsKLQkJcmV0dXJuIC1FTk9TUEM7Ci0JfQotCi0JcGF5bG9hZCA9IHNrYi0+ZGF0YTsKLQlwYXlsb2FkX2xlbiA9IHNrYi0+bGVuOwotCXBhZGRpbmcgPSAoaW50KSAoc2tiLT5kYXRhIC0gc2l6ZW9mKCpkYXRhKSkgJiAzOwotCWVudHJ5LT5oZWFkZXJfbGVuID0gc2l6ZW9mKCpkYXRhKSArIHBhZGRpbmc7Ci0KLQllbnRyeS0+c2tiID0gc2tiOwotCWVudHJ5LT5zdGF0dXNfbmVlZGVkID0gZmFsc2U7Ci0JZW50cnktPmhhbmRsZSA9ICh1MzIpIHNrYjsKLQllbnRyeS0+bGlmZXRpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhUWF9GUkFNRV9MSUZFVElNRSk7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19UWCwgInR4IGRhdGEgMHgleCAoMHglcCBwYXlsb2FkICVkIEIgIgotCQkgICAgICAgInBhZGRpbmcgJWQgaGVhZGVyX2xlbiAlZCkiLAotCQkgICAgICAgZW50cnktPmhhbmRsZSwgcGF5bG9hZCwgcGF5bG9hZF9sZW4sIHBhZGRpbmcsCi0JCSAgICAgICBlbnRyeS0+aGVhZGVyX2xlbik7Ci0Jc3RsYzQ1eHhfZHVtcChERUJVR19UWF9DT05URU5ULCBwYXlsb2FkLCBwYXlsb2FkX2xlbik7Ci0KLQlkYXRhID0gKHN0cnVjdCBzX2xtX2RhdGFfb3V0ICopIHNrYl9wdXNoKHNrYiwgZW50cnktPmhlYWRlcl9sZW4pOwotCi0JbWVtc2V0KGRhdGEsIDAsIGVudHJ5LT5oZWFkZXJfbGVuKTsKLQotCWlmIChwYWRkaW5nKQotCQlkYXRhLT5mbGFncyA9IExNX0ZMQUdfQUxJR047Ci0KLQlkYXRhLT5mbGFncyA9IExNX09VVF9CVVJTVDsKLQlkYXRhLT5sZW5ndGggPSBwYXlsb2FkX2xlbjsKLQlkYXRhLT5oYW5kbGUgPSBlbnRyeS0+aGFuZGxlOwotCWRhdGEtPmFpZCA9IDE7Ci0JZGF0YS0+cnRzX3JldHJpZXMgPSA3OwotCWRhdGEtPnJldHJpZXMgPSA3OwotCWRhdGEtPmFsb2Z0X2N0cmwgPSAwOwotCWRhdGEtPmNyeXB0X29mZnNldCA9IDU4OwotCWRhdGEtPmtleXR5cGUgPSAwOwotCWRhdGEtPmtleWxlbiA9IDA7Ci0JZGF0YS0+cXVldWUgPSBMTV9RVUVVRV9EQVRBMzsKLQlkYXRhLT5iYWNrbG9nID0gMzI7Ci0JZGF0YS0+YW50ZW5uYSA9IDI7Ci0JZGF0YS0+Y3RzID0gMzsKLQlkYXRhLT5wb3dlciA9IDEyNzsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWRhdGEtPmFsb2Z0W2ldID0gMDsKLQotCS8qCi0JICogY2hlY2sgaWYgdGhlcmUncyBlbm91Z2ggc3BhY2UgaW4gdHggYnVmZmVyCi0JICoKLQkgKiBGSVhNRTogaWdub3JlZCBmb3Igbm93Ci0JICovCi0KLQlzdGxjNDV4eF90eF9mcmFtZShzdGxjLCBlbnRyeS0+c3RhcnQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCi0JbGlzdF9hZGQoJmVudHJ5LT50eF9saXN0LCAmc3RsYy0+dHhfc2VudCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGNhbGxlciBtdXN0IGhvbGQgbXV0ZXgKLSAqCi0gKiBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBtYWM4MDIxMS9pZWVlODAyMTFfc2VuZF9udWxsZnVuYwotICovCi1zdGF0aWMgaW50IHN0bGM0NXh4X3R4X251bGxmdW5jKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgYm9vbCBwb3dlcnNhdmUpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKm51bGxmdW5jOwotCWludCBwYXlsb2FkX2xlbiwgcGFkZGluZywgaTsKLQlzdHJ1Y3Qgc19sbV9kYXRhX291dCAqZGF0YTsKLQlzdHJ1Y3QgdHhidWZmZXIgKmVudHJ5OwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JY2hhciAqcGF5bG9hZDsKLQl1MTYgZmM7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHN0bGMtPmh3LT5leHRyYV90eF9oZWFkcm9vbSArIDI0KTsKLQlpZiAoIXNrYikgewotCQlzdGxjNDV4eF93YXJuaW5nKCJmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBudWxsIGZyYW1lXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXNrYl9yZXNlcnZlKHNrYiwgc3RsYy0+aHctPmV4dHJhX3R4X2hlYWRyb29tKTsKLQotCW51bGxmdW5jID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYl9wdXQoc2tiLCAyNCk7Ci0JbWVtc2V0KG51bGxmdW5jLCAwLCAyNCk7Ci0JZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyB8Ci0JICAgICBJRUVFODAyMTFfRkNUTF9UT0RTOwotCi0JaWYgKHBvd2Vyc2F2ZSkKLQkJZmMgfD0gSUVFRTgwMjExX0ZDVExfUE07Ci0KLQludWxsZnVuYy0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KGZjKTsKLQltZW1jcHkobnVsbGZ1bmMtPmFkZHIxLCBzdGxjLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShudWxsZnVuYy0+YWRkcjIsIHN0bGMtPm1hY19hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG51bGxmdW5jLT5hZGRyMywgc3RsYy0+YnNzaWQsIEVUSF9BTEVOKTsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX1BTTSwgInNlbmRpbmcgTnVsbCBmcmFtZSB0byAlcE0gKHBvd2Vyc2F2ZSAlZCwgIgotCQkgICAgICAgImZjIDB4JXgpIiwgbnVsbGZ1bmMtPmFkZHIxLCBwb3dlcnNhdmUsIGZjKTsKLQotCXNwaW5fbG9ja19iaCgmc3RsYy0+dHhfbG9jayk7Ci0KLQllbnRyeSA9IHN0bGM0NXh4X3R4YnVmZmVyX2FsbG9jKHN0bGMsIHNrYi0+bGVuKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZzdGxjLT50eF9sb2NrKTsKLQotCWlmICghZW50cnkpIHsKLQkJLyoKLQkJICogVGhlIHF1ZXVlIHNob3VsZCBiZSBzdG9wcGVkIGJlZm9yZSB0aGUgZmlybXdhcmUgYnVmZmVyCi0JCSAqIGlzIGZ1bGwsIHNvIGZpcm13YXJlIGJ1ZmZlciBzaG91bGQgYWx3YXlzIGhhdmUgZW5vdWdoCi0JCSAqIHNwYWNlLgotCQkgKgotCQkgKiBCdXQgSSdtIHRvbyBsYXp5IGFuZCBvbWl0IGl0IGZvciBub3cuCi0JCSAqLwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJc3RsYzQ1eHhfd2FybmluZygiZmlybXdhcmUgdHggYnVmZmVyIGZ1bGwgaXMgZnVsbCAiCi0JCQkJCSAiZm9yIG51bGwgZnJhbWUiKTsKLQkJcmV0dXJuIC1FTk9TUEM7Ci0JfQotCi0JcGF5bG9hZCA9IHNrYi0+ZGF0YTsKLQlwYXlsb2FkX2xlbiA9IHNrYi0+bGVuOwotCXBhZGRpbmcgPSAoaW50KSAoc2tiLT5kYXRhIC0gc2l6ZW9mKCpkYXRhKSkgJiAzOwotCWVudHJ5LT5oZWFkZXJfbGVuID0gc2l6ZW9mKCpkYXRhKSArIHBhZGRpbmc7Ci0KLQllbnRyeS0+c2tiID0gc2tiOwotCWVudHJ5LT5zdGF0dXNfbmVlZGVkID0gZmFsc2U7Ci0JZW50cnktPmhhbmRsZSA9ICh1MzIpIHNrYjsKLQllbnRyeS0+bGlmZXRpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhUWF9GUkFNRV9MSUZFVElNRSk7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19UWCwgInR4IGRhdGEgMHgleCAoMHglcCBwYXlsb2FkICVkIEIgIgotCQkgICAgICAgInBhZGRpbmcgJWQgaGVhZGVyX2xlbiAlZCkiLAotCQkgICAgICAgZW50cnktPmhhbmRsZSwgcGF5bG9hZCwgcGF5bG9hZF9sZW4sIHBhZGRpbmcsCi0JCSAgICAgICBlbnRyeS0+aGVhZGVyX2xlbik7Ci0Jc3RsYzQ1eHhfZHVtcChERUJVR19UWF9DT05URU5ULCBwYXlsb2FkLCBwYXlsb2FkX2xlbik7Ci0KLQlkYXRhID0gKHN0cnVjdCBzX2xtX2RhdGFfb3V0ICopIHNrYl9wdXNoKHNrYiwgZW50cnktPmhlYWRlcl9sZW4pOwotCi0JbWVtc2V0KGRhdGEsIDAsIGVudHJ5LT5oZWFkZXJfbGVuKTsKLQotCWlmIChwYWRkaW5nKQotCQlkYXRhLT5mbGFncyA9IExNX0ZMQUdfQUxJR047Ci0KLQlkYXRhLT5mbGFncyA9IExNX09VVF9CVVJTVDsKLQlkYXRhLT5sZW5ndGggPSBwYXlsb2FkX2xlbjsKLQlkYXRhLT5oYW5kbGUgPSBlbnRyeS0+aGFuZGxlOwotCWRhdGEtPmFpZCA9IDE7Ci0JZGF0YS0+cnRzX3JldHJpZXMgPSA3OwotCWRhdGEtPnJldHJpZXMgPSA3OwotCWRhdGEtPmFsb2Z0X2N0cmwgPSAwOwotCWRhdGEtPmNyeXB0X29mZnNldCA9IDU4OwotCWRhdGEtPmtleXR5cGUgPSAwOwotCWRhdGEtPmtleWxlbiA9IDA7Ci0JZGF0YS0+cXVldWUgPSBMTV9RVUVVRV9EQVRBMzsKLQlkYXRhLT5iYWNrbG9nID0gMzI7Ci0JZGF0YS0+YW50ZW5uYSA9IDI7Ci0JZGF0YS0+Y3RzID0gMzsKLQlkYXRhLT5wb3dlciA9IDEyNzsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWRhdGEtPmFsb2Z0W2ldID0gMDsKLQotCS8qCi0JICogY2hlY2sgaWYgdGhlcmUncyBlbm91Z2ggc3BhY2UgaW4gdHggYnVmZmVyCi0JICoKLQkgKiBGSVhNRTogaWdub3JlZCBmb3Igbm93Ci0JICovCi0KLQlzdGxjNDV4eF90eF9mcmFtZShzdGxjLCBlbnRyeS0+c3RhcnQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCi0JbGlzdF9hZGQoJmVudHJ5LT50eF9saXN0LCAmc3RsYy0+dHhfc2VudCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogY2FsbGVyIG11c3QgaG9sZCBtdXRleCAqLwotc3RhdGljIHZvaWQgc3RsYzQ1eHhfdHhfcHNtKHN0cnVjdCBzdGxjNDV4eCAqc3RsYywgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHNfbG1fY29udHJvbCAqY29udHJvbDsKLQlzdHJ1Y3Qgc19sbW9fcHNtICpwc207Ci0Jc2l6ZV90IGxlbiwgcHNtX2xlbjsKLQotCVdBUk5fT04oIXN0bGMtPmFzc29jaWF0ZWQpOwotCVdBUk5fT04oc3RsYy0+YWlkIDwgMSk7Ci0JV0FSTl9PTihzdGxjLT5haWQgPiAyMDA3KTsKLQotCXBzbV9sZW4gPSBzaXplb2YoKnBzbSk7Ci0JbGVuID0gc2l6ZW9mKCpjb250cm9sKSArIHBzbV9sZW47Ci0JY29udHJvbCA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQlwc20gPSAoc3RydWN0IHNfbG1vX3BzbSAqKSAoY29udHJvbCArIDEpOwotCi0JY29udHJvbC0+ZmxhZ3MgPSBMTV9GTEFHX0NPTlRST0wgfCBMTV9DVFJMX09QU0VUOwotCWNvbnRyb2wtPmxlbmd0aCA9IHBzbV9sZW47Ci0JY29udHJvbC0+b2lkID0gTE1fT0lEX1BTTTsKLQotCWlmIChlbmFibGUpCi0JCXBzbS0+ZmxhZ3MgfD0gTE1fUFNNOwotCi0JcHNtLT5haWQgPSBzdGxjLT5haWQ7Ci0KLQlwc20tPmJlYWNvbl9yY3BpX3NraXBfbWF4ID0gNjA7Ci0KLQlwc20tPmludGVydmFsc1swXS5pbnRlcnZhbCA9IDE7Ci0JcHNtLT5pbnRlcnZhbHNbMF0ucGVyaW9kcyA9IDE7Ci0JcHNtLT5pbnRlcnZhbHNbMV0uaW50ZXJ2YWwgPSAxOwotCXBzbS0+aW50ZXJ2YWxzWzFdLnBlcmlvZHMgPSAxOwotCXBzbS0+aW50ZXJ2YWxzWzJdLmludGVydmFsID0gMTsKLQlwc20tPmludGVydmFsc1syXS5wZXJpb2RzID0gMTsKLQlwc20tPmludGVydmFsc1szXS5pbnRlcnZhbCA9IDE7Ci0JcHNtLT5pbnRlcnZhbHNbM10ucGVyaW9kcyA9IDE7Ci0KLQlwc20tPm5yID0gMDsKLQlwc20tPmV4Y2x1ZGVbMF0gPSAwOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfUFNNLCAic2VuZGluZyBMTV9PSURfUFNNIChhaWQgJWQsIGludGVydmFsICVkKSIsCi0JCSAgICAgICBwc20tPmFpZCwgcHNtLT5pbnRlcnZhbHNbMF0uaW50ZXJ2YWwpOwotCi0Jc3RsYzQ1eHhfdHhfZnJhbWUoc3RsYywgRklSTVdBUkVfQ09ORklHX1NUQVJULCBjb250cm9sLCBsZW4pOwotCi0Ja2ZyZWUoY29udHJvbCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3RsYzQ1eHhfb3BfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHN0bGM0NXh4ICpzdGxjID0gaHctPnByaXY7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwotCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZTsKLQlpbnQgcGF5bG9hZF9sZW4sIHBhZGRpbmcsIGk7Ci0Jc3RydWN0IHNfbG1fZGF0YV9vdXQgKmRhdGE7Ci0Jc3RydWN0IHR4YnVmZmVyICplbnRyeTsKLQljaGFyICpwYXlsb2FkOwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfRlVOQywgIiVzIiwgX19mdW5jX18pOwotCi0Jc3Bpbl9sb2NrX2JoKCZzdGxjLT50eF9sb2NrKTsKLQotCWVudHJ5ID0gc3RsYzQ1eHhfdHhidWZmZXJfYWxsb2Moc3RsYywgc2tiLT5sZW4pOwotCWlmICghZW50cnkpIHsKLQkJLyogdGhlIHF1ZXVlIHNob3VsZCBiZSBzdG9wcGVkIGJlZm9yZSB0aGUgZmlybXdhcmUgYnVmZmVyCi0JCSAqIGlzIGZ1bGwsIHNvIGZpcm13YXJlIGJ1ZmZlciBzaG91bGQgYWx3YXlzIGhhdmUgZW5vdWdoCi0JCSAqIHNwYWNlICovCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlzdGxjNDV4eF93YXJuaW5nKCJmaXJtd2FyZSBidWZmZXIgZnVsbCIpOwotCQlzcGluX3VubG9ja19iaCgmc3RsYy0+dHhfbG9jayk7Ci0JCXJldHVybiBORVRERVZfVFhfQlVTWTsKLQl9Ci0KLQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCi0JcGF5bG9hZCA9IHNrYi0+ZGF0YTsKLQlwYXlsb2FkX2xlbiA9IHNrYi0+bGVuOwotCXBhZGRpbmcgPSAoaW50KSAoc2tiLT5kYXRhIC0gc2l6ZW9mKCpkYXRhKSkgJiAzOwotCWVudHJ5LT5oZWFkZXJfbGVuID0gc2l6ZW9mKCpkYXRhKSArIHBhZGRpbmc7Ci0KLQllbnRyeS0+c2tiID0gc2tiOwotCWVudHJ5LT5zdGF0dXNfbmVlZGVkID0gdHJ1ZTsKLQllbnRyeS0+aGFuZGxlID0gKHUzMikgc2tiOwotCWVudHJ5LT5saWZldGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRYX0ZSQU1FX0xJRkVUSU1FKTsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX1RYLCAidHggZGF0YSAweCV4ICgweCVwIHBheWxvYWQgJWQgQiAiCi0JCSAgICAgICAicGFkZGluZyAlZCBoZWFkZXJfbGVuICVkKSIsCi0JCSAgICAgICBlbnRyeS0+aGFuZGxlLCBwYXlsb2FkLCBwYXlsb2FkX2xlbiwgcGFkZGluZywKLQkJICAgICAgIGVudHJ5LT5oZWFkZXJfbGVuKTsKLQlzdGxjNDV4eF9kdW1wKERFQlVHX1RYX0NPTlRFTlQsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKLQotCWRhdGEgPSAoc3RydWN0IHNfbG1fZGF0YV9vdXQgKikgc2tiX3B1c2goc2tiLCBlbnRyeS0+aGVhZGVyX2xlbik7Ci0KLQltZW1zZXQoZGF0YSwgMCwgZW50cnktPmhlYWRlcl9sZW4pOwotCi0JaWYgKHBhZGRpbmcpCi0JCWRhdGEtPmZsYWdzID0gTE1fRkxBR19BTElHTjsKLQotCWRhdGEtPmZsYWdzID0gTE1fT1VUX0JVUlNUOwotCWRhdGEtPmxlbmd0aCA9IHBheWxvYWRfbGVuOwotCWRhdGEtPmhhbmRsZSA9IGVudHJ5LT5oYW5kbGU7Ci0JZGF0YS0+YWlkID0gMTsKLQlkYXRhLT5ydHNfcmV0cmllcyA9IDc7Ci0JZGF0YS0+cmV0cmllcyA9IDc7Ci0JZGF0YS0+YWxvZnRfY3RybCA9IDA7Ci0JZGF0YS0+Y3J5cHRfb2Zmc2V0ID0gNTg7Ci0JZGF0YS0+a2V5dHlwZSA9IDA7Ci0JZGF0YS0+a2V5bGVuID0gMDsKLQlkYXRhLT5xdWV1ZSA9IDI7Ci0JZGF0YS0+YmFja2xvZyA9IDMyOwotCWRhdGEtPmFudGVubmEgPSAyOwotCWRhdGEtPmN0cyA9IDM7Ci0JZGF0YS0+cG93ZXIgPSAxMjc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXJhdGUgPSBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoc3RsYy0+aHcsIGluZm8pOwotCQlkYXRhLT5hbG9mdFtpXSA9IHJhdGUtPmh3X3ZhbHVlOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT50eF9saXN0LCAmc3RsYy0+dHhfcGVuZGluZyk7Ci0KLQkvKiBjaGVjayBpZiB0aGVyZSdzIGVub3VnaCBzcGFjZSBpbiB0eCBidWZmZXIgKi8KLQlpZiAoc3RsYzQ1eHhfdHhidWZmZXJfZmluZChzdGxjLCBNQVhfRlJBTUVfTEVOKSA9PSAtMSkgewotCQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19RVUVVRSwgInR4IGJ1ZmZlciBmdWxsLCBzdG9wcGluZyBxdWV1ZXMiKTsKLQkJc3RsYy0+dHhfcXVldWVfc3RvcHBlZCA9IDE7Ci0JCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhzdGxjLT5odyk7Ci0JfQotCi0JcXVldWVfd29yayhzdGxjLT5ody0+d29ya3F1ZXVlLCAmc3RsYy0+d29yayk7Ci0KLQlzcGluX3VubG9ja19iaCgmc3RsYy0+dHhfbG9jayk7Ci0KLQlyZXR1cm4gTkVUREVWX1RYX09LOwotfQotCi1zdGF0aWMgaW50IHN0bGM0NXh4X29wX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBzdGxjNDV4eCAqc3RsYyA9IGh3LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQlpbnQgcmV0ID0gMDsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCXN0bGMtPmZ3X3N0YXRlID0gRldfU1RBVEVfQk9PVElORzsKLQlzdGxjLT5jaGFubmVsID0gMTsKLQotCXN0bGM0NXh4X3Bvd2VyX29uKHN0bGMpOwotCi0JcmV0ID0gc3RsYzQ1eHhfdXBsb2FkX2Zpcm13YXJlKHN0bGMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXN0bGM0NXh4X3Bvd2VyX29mZihzdGxjKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXN0bGMtPnR4X3F1ZXVlX3N0b3BwZWQgPSAwOwotCi0JbXV0ZXhfdW5sb2NrKCZzdGxjLT5tdXRleCk7Ci0KLQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygyMDAwKTsKLQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnN0bGMtPmZ3X2NvbXAsCi0JCQkJCQkJICAgIHRpbWVvdXQpOwotCWlmICghdGltZW91dCkgewotCQlzdGxjNDV4eF9lcnJvcigiZmlybXdhcmUgYm9vdCBmYWlsZWQiKTsKLQkJc3RsYzQ1eHhfcG93ZXJfb2ZmKHN0bGMpOwotCQlyZXQgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfQk9PVCwgImZpcm13YXJlIGJvb3RlZCIpOwotCi0JLyogRklYTUU6IHNob3VsZCB3ZSB0YWtlIG11dGV4IGp1c3QgYWZ0ZXIgd2FpdF9mb3JfY29tcGxldGlvbigpPyAqLwotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCVdBUk5fT04oc3RsYy0+Zndfc3RhdGUgIT0gRldfU1RBVEVfUkVBRFkpOwotCi1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmc3RsYy0+bXV0ZXgpOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfb3Bfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMgPSBody0+cHJpdjsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCVdBUk5fT04oc3RsYy0+Zndfc3RhdGUgIT0gRldfU1RBVEVfUkVBRFkpOwotCi0Jc3RsYzQ1eHhfcG93ZXJfb2ZmKHN0bGMpOwotCi0JLyogRklYTUU6IG1ha2Ugc3VyZSB0aGF0IGFsbCB3b3JrX3N0cnVjdHMgaGF2ZSBjb21wbGV0ZWQgKi8KLQotCXNwaW5fbG9ja19iaCgmc3RsYy0+dHhfbG9jayk7Ci0Jc3RsYzQ1eHhfZmx1c2hfcXVldWVzKHN0bGMpOwotCXNwaW5fdW5sb2NrX2JoKCZzdGxjLT50eF9sb2NrKTsKLQotCXN0bGMtPmZ3X3N0YXRlID0gRldfU1RBVEVfT0ZGOwotCi0JbXV0ZXhfdW5sb2NrKCZzdGxjLT5tdXRleCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3RsYzQ1eHhfb3BfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQotewotCXN0cnVjdCBzdGxjNDV4eCAqc3RsYyA9IGh3LT5wcml2OwotCi0Jc3RsYzQ1eHhfZGVidWcoREVCVUdfRlVOQywgIiVzIiwgX19mdW5jX18pOwotCi0Jc3dpdGNoIChjb25mLT50eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JbWVtY3B5KHN0bGMtPm1hY19hZGRyLCBjb25mLT5tYWNfYWRkciwgRVRIX0FMRU4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0bGM0NXh4X29wX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKLXsKLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3RsYzQ1eHhfb3BfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKLXsKLQlzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMgPSBody0+cHJpdjsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJnN0bGMtPm11dGV4KTsKLQotCXN0bGMtPmNoYW5uZWwgPSBody0+Y29uZi5jaGFubmVsLT5od192YWx1ZTsKLQlzdGxjNDV4eF90eF9zY2FuKHN0bGMpOwotCXN0bGM0NXh4X3R4X3NldHVwKHN0bGMpOwotCXN0bGM0NXh4X3R4X2VkY2Yoc3RsYyk7Ci0KLQlpZiAoKGh3LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMpICE9IHN0bGMtPnBzbSkgewotCQlzdGxjLT5wc20gPSBody0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTOwotCQlpZiAoc3RsYy0+YXNzb2NpYXRlZCkgewotCQkJc3RsYzQ1eHhfdHhfcHNtKHN0bGMsIHN0bGMtPnBzbSk7Ci0JCQlzdGxjNDV4eF90eF9udWxsZnVuYyhzdGxjLCBzdGxjLT5wc20pOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZzdGxjLT5tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3RsYzQ1eHhfb3BfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAotCQkJCSAgICAgIGludCBtY19jb3VudCwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2X2FkZHJfbGlzdCAqbWNfbGlzdCkKLXsKLQkqdG90YWxfZmxhZ3MgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBzdGxjNDV4eF9vcF9ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkJIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmluZm8sCi0JCQkJCSB1MzIgY2hhbmdlZCkKLXsKLQlzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMgPSBody0+cHJpdjsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQltdXRleF9sb2NrKCZzdGxjLT5tdXRleCk7Ci0KLQltZW1jcHkoc3RsYy0+YnNzaWQsIGluZm8tPmJzc2lkLCBFVEhfQUxFTik7Ci0Jc3RsYzQ1eHhfdHhfc2V0dXAoc3RsYyk7Ci0KLQltdXRleF91bmxvY2soJnN0bGMtPm11dGV4KTsKLQotCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKLQkJc3RsYy0+YXNzb2NpYXRlZCA9IGluZm8tPmFzc29jOwotCQlpZiAoaW5mby0+YXNzb2MpCi0JCQlzdGxjLT5haWQgPSBpbmZvLT5haWQ7Ci0JCWVsc2UKLQkJCXN0bGMtPmFpZCA9IC0xOwotCi0JCWlmIChzdGxjLT5wc20pIHsKLQkJCXN0bGM0NXh4X3R4X3BzbShzdGxjLCBzdGxjLT5wc20pOwotCQkJc3RsYzQ1eHhfdHhfbnVsbGZ1bmMoc3RsYywgc3RsYy0+cHNtKTsKLQkJfQotCX0KLX0KLQotCi0vKiBjYW4ndCBiZSBjb25zdCwgbWFjODAyMTEgd3JpdGVzIHRvIHRoaXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgc3RsYzQ1eHhfcmF0ZXNbXSA9IHsKLQl7IC5iaXRyYXRlID0gMTAsICAuaHdfdmFsdWUgPSAwLCAgICAuaHdfdmFsdWVfc2hvcnQgPSAwLCB9LAotCXsgLmJpdHJhdGUgPSAyMCwgIC5od192YWx1ZSA9IDEsICAgIC5od192YWx1ZV9zaG9ydCA9IDEsIH0sCi0JeyAuYml0cmF0ZSA9IDU1LCAgLmh3X3ZhbHVlID0gMiwgICAgLmh3X3ZhbHVlX3Nob3J0ID0gMiwgfSwKLQl7IC5iaXRyYXRlID0gMTEwLCAuaHdfdmFsdWUgPSAzLCAgICAuaHdfdmFsdWVfc2hvcnQgPSAzLCB9LAotCXsgLmJpdHJhdGUgPSA2MCwgIC5od192YWx1ZSA9IDQsICAgIC5od192YWx1ZV9zaG9ydCA9IDQsIH0sCi0JeyAuYml0cmF0ZSA9IDkwLCAgLmh3X3ZhbHVlID0gNSwgICAgLmh3X3ZhbHVlX3Nob3J0ID0gNSwgfSwKLQl7IC5iaXRyYXRlID0gMTIwLCAuaHdfdmFsdWUgPSA2LCAgICAuaHdfdmFsdWVfc2hvcnQgPSA2LCB9LAotCXsgLmJpdHJhdGUgPSAxODAsIC5od192YWx1ZSA9IDcsICAgIC5od192YWx1ZV9zaG9ydCA9IDcsIH0sCi0JeyAuYml0cmF0ZSA9IDI0MCwgLmh3X3ZhbHVlID0gOCwgICAgLmh3X3ZhbHVlX3Nob3J0ID0gOCwgfSwKLQl7IC5iaXRyYXRlID0gMzYwLCAuaHdfdmFsdWUgPSA5LCAgICAuaHdfdmFsdWVfc2hvcnQgPSA5LCB9LAotCXsgLmJpdHJhdGUgPSA0ODAsIC5od192YWx1ZSA9IDEwLCAgIC5od192YWx1ZV9zaG9ydCA9IDEwLCB9LAotCXsgLmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDExLCAgIC5od192YWx1ZV9zaG9ydCA9IDExLCB9LAotfTsKLQotLyogY2FuJ3QgYmUgY29uc3QsIG1hYzgwMjExIHdyaXRlcyB0byB0aGlzICovCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHN0bGM0NXh4X2NoYW5uZWxzW10gPSB7Ci0JeyAuaHdfdmFsdWUgPSAxLCAuY2VudGVyX2ZyZXEgPSAyNDEyfSwKLQl7IC5od192YWx1ZSA9IDIsIC5jZW50ZXJfZnJlcSA9IDI0MTd9LAotCXsgLmh3X3ZhbHVlID0gMywgLmNlbnRlcl9mcmVxID0gMjQyMn0sCi0JeyAuaHdfdmFsdWUgPSA0LCAuY2VudGVyX2ZyZXEgPSAyNDI3fSwKLQl7IC5od192YWx1ZSA9IDUsIC5jZW50ZXJfZnJlcSA9IDI0MzJ9LAotCXsgLmh3X3ZhbHVlID0gNiwgLmNlbnRlcl9mcmVxID0gMjQzN30sCi0JeyAuaHdfdmFsdWUgPSA3LCAuY2VudGVyX2ZyZXEgPSAyNDQyfSwKLQl7IC5od192YWx1ZSA9IDgsIC5jZW50ZXJfZnJlcSA9IDI0NDd9LAotCXsgLmh3X3ZhbHVlID0gOSwgLmNlbnRlcl9mcmVxID0gMjQ1Mn0sCi0JeyAuaHdfdmFsdWUgPSAxMCwgLmNlbnRlcl9mcmVxID0gMjQ1N30sCi0JeyAuaHdfdmFsdWUgPSAxMSwgLmNlbnRlcl9mcmVxID0gMjQ2Mn0sCi0JeyAuaHdfdmFsdWUgPSAxMiwgLmNlbnRlcl9mcmVxID0gMjQ2N30sCi0JeyAuaHdfdmFsdWUgPSAxMywgLmNlbnRlcl9mcmVxID0gMjQ3Mn0sCi19OwotCi0vKiBjYW4ndCBiZSBjb25zdCwgbWFjODAyMTEgd3JpdGVzIHRvIHRoaXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIHN0bGM0NXh4X2JhbmRfMmdoeiA9IHsKLQkuY2hhbm5lbHMgPSBzdGxjNDV4eF9jaGFubmVscywKLQkubl9jaGFubmVscyA9IEFSUkFZX1NJWkUoc3RsYzQ1eHhfY2hhbm5lbHMpLAotCS5iaXRyYXRlcyA9IHN0bGM0NXh4X3JhdGVzLAotCS5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShzdGxjNDV4eF9yYXRlcyksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgc3RsYzQ1eHhfb3BzID0gewotCS5zdGFydCA9IHN0bGM0NXh4X29wX3N0YXJ0LAotCS5zdG9wID0gc3RsYzQ1eHhfb3Bfc3RvcCwKLQkuYWRkX2ludGVyZmFjZSA9IHN0bGM0NXh4X29wX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgPSBzdGxjNDV4eF9vcF9yZW1vdmVfaW50ZXJmYWNlLAotCS5jb25maWcgPSBzdGxjNDV4eF9vcF9jb25maWcsCi0JLmNvbmZpZ3VyZV9maWx0ZXIgPSBzdGxjNDV4eF9vcF9jb25maWd1cmVfZmlsdGVyLAotCS50eCA9IHN0bGM0NXh4X29wX3R4LAotCS5ic3NfaW5mb19jaGFuZ2VkID0gc3RsYzQ1eHhfb3BfYnNzX2luZm9fY2hhbmdlZCwKLX07Ci0KLXN0YXRpYyBpbnQgc3RsYzQ1eHhfcmVnaXN0ZXJfbWFjODAyMTEoc3RydWN0IHN0bGM0NXh4ICpzdGxjKQotewotCS8qIEZJWE1FOiBTRVRfSUVFRTgwMjExX1BFUk1fQUREUigpIHJlcXVpcmVzIGRlZmF1bHRfbWFjX2FkZHIKLQkgICB0byBiZSBub24tY29uc3QgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24gKi8KLQlzdGF0aWMgdTggZGVmYXVsdF9tYWNfYWRkcltFVEhfQUxFTl0gPSB7Ci0JCTB4MDAsIDB4MDIsIDB4ZWUsIDB4YzAsIDB4ZmYsIDB4ZWUKLQl9OwotCWludCByZXQ7Ci0KLQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihzdGxjLT5odywgZGVmYXVsdF9tYWNfYWRkcik7Ci0KLQlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoc3RsYy0+aHcpOwotCWlmIChyZXQpIHsKLQkJc3RsYzQ1eHhfZXJyb3IoInVuYWJsZSB0byByZWdpc3RlciBtYWM4MDIxMSBodzogJWQiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzdGxjNDV4eF9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3RsYzQ1eHhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzdGxjNDV4eCIsCi0JLmlkCQk9IC0xLAotCi0JLyogZGV2aWNlIG1vZGVsIGluc2lzdHMgdG8gaGF2ZSBhIHJlbGVhc2UgZnVuY3Rpb24gKi8KLQkuZGV2ICAgICAgICAgICAgPSB7Ci0JCS5yZWxlYXNlID0gc3RsYzQ1eHhfZGV2aWNlX3JlbGVhc2UsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHN0bGM0NXh4X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IHN0bGM0NXh4ICpzdGxjOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCWludCByZXQ7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQkvKiBtYWM4MDIxMSBhbGxvYyAqLwotCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZigqc3RsYyksICZzdGxjNDV4eF9vcHMpOwotCWlmICghaHcpIHsKLQkJc3RsYzQ1eHhfZXJyb3IoImNvdWxkIG5vdCBhbGxvYyBpZWVlODAyMTFfaHciKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogbWFjODAyMTEgY2xlYXJzIGh3LT5wcml2ICovCi0Jc3RsYyA9IGh3LT5wcml2OwotCi0Jc3RsYy0+aHcgPSBodzsKLQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBzdGxjKTsKLQlzdGxjLT5zcGkgPSBzcGk7Ci0KLQlzcGktPmJpdHNfcGVyX3dvcmQgPSAxNjsKLQlzcGktPm1heF9zcGVlZF9oeiA9IDI0MDAwMDAwOwotCi0JcmV0ID0gc3BpX3NldHVwKHNwaSk7Ci0JaWYgKHJldCA8IDApCi0JCXN0bGM0NXh4X2Vycm9yKCJzcGlfc2V0dXAgZmFpbGVkIik7Ci0KLQlyZXQgPSBncGlvX3JlcXVlc3Qoc3RsYzQ1eHhfZ3Bpb19wb3dlciwgInN0bGM0NXh4IHBvd2VyIik7Ci0JaWYgKHJldCA8IDApIHsKLQkJc3RsYzQ1eHhfZXJyb3IoInBvd2VyIEdQSU8gcmVxdWVzdCBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBncGlvX3JlcXVlc3Qoc3RsYzQ1eHhfZ3Bpb19pcnEsICJzdGxjNDV4eCBpcnEiKTsKLQlpZiAocmV0IDwgMCkgewotCQlzdGxjNDV4eF9lcnJvcigiaXJxIEdQSU8gcmVxdWVzdCBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0bGM0NXh4X2dwaW9fcG93ZXIsIDApOwotCWdwaW9fZGlyZWN0aW9uX2lucHV0KHN0bGM0NXh4X2dwaW9faXJxKTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKHN0bGM0NXh4X2dwaW9faXJxKSwKLQkJCSAgc3RsYzQ1eHhfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAic3RsYzQ1eHgiLAotCQkJICBzdGxjLT5zcGkpOwotCWlmIChyZXQgPCAwKQotCQkvKiBGSVhNRTogaGFuZGxlIHRoZSBlcnJvciAqLwotCQlzdGxjNDV4eF9lcnJvcigicmVxdWVzdF9pcnEoKSBmYWlsZWQiKTsKLQotCXNldF9pcnFfdHlwZShncGlvX3RvX2lycShzdGxjNDV4eF9ncGlvX2lycSksCi0JCSAgICAgSVJRX1RZUEVfRURHRV9SSVNJTkcpOwotCi0JZGlzYWJsZV9pcnEoZ3Bpb190b19pcnEoc3RsYzQ1eHhfZ3Bpb19pcnEpKTsKLQotCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc3RsYzQ1eHhfZGV2aWNlKTsKLQlpZiAocmV0KSB7Ci0JCXN0bGM0NXh4X2Vycm9yKCJDb3VsZG4ndCByZWdpc3RlciB3bGFuX29tYXAgZGV2aWNlLiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlkZXZfc2V0X2RydmRhdGEoJnN0bGM0NXh4X2RldmljZS5kZXYsIHN0bGMpOwotCi0JSU5JVF9XT1JLKCZzdGxjLT53b3JrLCBzdGxjNDV4eF93b3JrKTsKLQlJTklUX1dPUksoJnN0bGMtPndvcmtfcmVzZXQsIHN0bGM0NXh4X3dvcmtfcmVzZXQpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZzdGxjLT53b3JrX3R4X3RpbWVvdXQsIHN0bGM0NXh4X3dvcmtfdHhfdGltZW91dCk7Ci0JbXV0ZXhfaW5pdCgmc3RsYy0+bXV0ZXgpOwotCWluaXRfY29tcGxldGlvbigmc3RsYy0+ZndfY29tcCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnN0bGMtPnR4X2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZzdGxjLT50eGJ1ZmZlcik7Ci0JSU5JVF9MSVNUX0hFQUQoJnN0bGMtPnR4X3BlbmRpbmcpOwotCUlOSVRfTElTVF9IRUFEKCZzdGxjLT50eF9zZW50KTsKLQotCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1MgfAotCQlJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8Ci0JCUlFRUU4MDIxMV9IV19OT0lTRV9EQk07Ci0JLyogZm91ciBieXRlcyBmb3IgcGFkZGluZyAqLwotCWh3LT5leHRyYV90eF9oZWFkcm9vbSA9IHNpemVvZihzdHJ1Y3Qgc19sbV9kYXRhX291dCkgKyA0OwotCi0JLyogdW5pdCB1cyAqLwotCWh3LT5jaGFubmVsX2NoYW5nZV90aW1lID0gMTAwMDsKLQotCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pOwotCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmc3RsYzQ1eHhfYmFuZF8yZ2h6OwotCi0JU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZzcGktPmRldik7Ci0KLQlCVUlMRF9CVUdfT04oc2l6ZW9mKGRlZmF1bHRfY2FsX3Jzc2kpICE9IFJTU0lfQ0FMX0FSUkFZX0xFTik7Ci0JQlVJTERfQlVHX09OKHNpemVvZihkZWZhdWx0X2NhbF9jaGFubmVscykgIT0gQ0hBTk5FTF9DQUxfQVJSQVlfTEVOKTsKLQotCXN0bGMtPmNhbF9yc3NpID0ga21lbWR1cChkZWZhdWx0X2NhbF9yc3NpLCBSU1NJX0NBTF9BUlJBWV9MRU4sCi0JCQkJIEdGUF9LRVJORUwpOwotCXN0bGMtPmNhbF9jaGFubmVscyA9IGttZW1kdXAoZGVmYXVsdF9jYWxfY2hhbm5lbHMsCi0JCQkJICAgICBDSEFOTkVMX0NBTF9BUlJBWV9MRU4sCi0JCQkJICAgICBHRlBfS0VSTkVMKTsKLQotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3RsYzQ1eHhfZGV2aWNlLmRldiwgJmRldl9hdHRyX2NhbF9yc3NpKTsKLQlpZiAocmV0IDwgMCkgewotCQlzdGxjNDV4eF9lcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlIGNhbF9yc3NpIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3RsYzQ1eHhfZGV2aWNlLmRldiwgJmRldl9hdHRyX2NhbF9jaGFubmVscyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJc3RsYzQ1eHhfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZSBjYWxfY2hhbm5lbHMiKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzdGxjNDV4eF9kZXZpY2UuZGV2LCAmZGV2X2F0dHJfdHhfYnVmKTsKLQlpZiAocmV0IDwgMCkgewotCQlzdGxjNDV4eF9lcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlIHR4X2J1ZiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBzdGxjNDV4eF9yZWdpc3Rlcl9tYWM4MDIxMShzdGxjKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlzdGxjNDV4eF9pbmZvKCJ2IiBEUklWRVJfVkVSU0lPTiAiIGxvYWRlZCIpOwotCi0Jc3RsYzQ1eHhfaW5mbygiY29uZmlnIGJ1ZmZlciAweCV4LTB4JXgiLAotCQkgICAgICBGSVJNV0FSRV9DT05GSUdfU1RBUlQsIEZJUk1XQVJFX0NPTkZJR19FTkQpOwotCXN0bGM0NXh4X2luZm8oInR4IDB4JXgtMHgleCwgcnggMHgleC0weCV4IiwKLQkJICAgICAgRklSTVdBUkVfVFhCVUZGRVJfU1RBUlQsIEZJUk1XQVJFX1RYQlVGRkVSX0VORCwKLQkJICAgICAgRklSTVdBUkVfUlhCVUZGRVJfU1RBUlQsIEZJUk1XQVJFX1JYQlVGRkVSX0VORCk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzdGxjNDV4eF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgc3RsYzQ1eHggKnN0bGMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKLQotCXN0bGM0NXh4X2RlYnVnKERFQlVHX0ZVTkMsICIlcyIsIF9fZnVuY19fKTsKLQotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZzdGxjNDV4eF9kZXZpY2UpOwotCi0JaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoc3RsYy0+aHcpOwotCi0JZnJlZV9pcnEoZ3Bpb190b19pcnEoc3RsYzQ1eHhfZ3Bpb19pcnEpLCBzcGkpOwotCi0JZ3Bpb19mcmVlKHN0bGM0NXh4X2dwaW9fcG93ZXIpOwotCWdwaW9fZnJlZShzdGxjNDV4eF9ncGlvX2lycSk7Ci0KLQkvKiBGSVhNRTogZnJlZSBjYWxfY2hhbm5lbHMgYW5kIGNhbF9yc3NpPyAqLwotCi0Ja2ZyZWUoc3RsYy0+ZncpOwotCi0JbXV0ZXhfZGVzdHJveSgmc3RsYy0+bXV0ZXgpOwotCi0JLyogZnJlZXMgYWxzbyBzdGxjICovCi0JaWVlZTgwMjExX2ZyZWVfaHcoc3RsYy0+aHcpOwotCXN0bGMgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHN0bGM0NXh4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLyogdXNlIGN4MzExMHggbmFtZSBiZWNhdXNlIGJvYXJkLW44MDAuYyB1c2VzIHRoYXQgZm9yIHRoZQotCQkgKiBTUEkgcG9ydCAqLwotCQkubmFtZQkJPSAiY3gzMTEweCIsCi0JCS5idXMJCT0gJnNwaV9idXNfdHlwZSwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCi0KLQkucHJvYmUJCT0gc3RsYzQ1eHhfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzdGxjNDV4eF9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc3RsYzQ1eHhfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZzdGxjNDV4eF9zcGlfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkgewotCQlzdGxjNDV4eF9lcnJvcigiZmFpbGVkIHRvIHJlZ2lzdGVyIFNQSSBkcml2ZXI6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHN0bGM0NXh4X2V4aXQodm9pZCkKLXsKLQlzdGxjNDV4eF9kZWJ1ZyhERUJVR19GVU5DLCAiJXMiLCBfX2Z1bmNfXyk7Ci0KLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnN0bGM0NXh4X3NwaV9kcml2ZXIpOwotCi0Jc3RsYzQ1eHhfaW5mbygidW5sb2FkZWQiKTsKLX0KLQotbW9kdWxlX2luaXQoc3RsYzQ1eHhfaW5pdCk7Ci1tb2R1bGVfZXhpdChzdGxjNDV4eF9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiS2FsbGUgVmFsbyA8a2FsbGUudmFsb0Bub2tpYS5jb20+Iik7Ci1NT0RVTEVfQUxJQVMoInNwaTpjeDMxMTB4Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RsYzQ1eHgvc3RsYzQ1eHguaCBiL2RyaXZlcnMvc3RhZ2luZy9zdGxjNDV4eC9zdGxjNDV4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzk2YmJiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zdGxjNDV4eC9zdGxjNDV4eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBzdGxjNDV4eAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogQ29udGFjdDogS2FsbGUgVmFsbyA8a2FsbGUudmFsb0Bub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJzdGxjNDV4eF9sbWFjLmgiCi0KLSNkZWZpbmUgRFJJVkVSX05BTUUgInN0bGM0NXh4IgotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xLjMiCi0KLSNkZWZpbmUgRFJJVkVSX1BSRUZJWCBEUklWRVJfTkFNRSAiOiAiCi0KLWVudW0gewotCURFQlVHX05PTkUgPSAwLAotCURFQlVHX0ZVTkMgPSAxIDw8IDAsCi0JREVCVUdfSVJRID0gMSA8PCAxLAotCURFQlVHX0JIID0gMSA8PCAyLAotCURFQlVHX1JYID0gMSA8PCAzLAotCURFQlVHX1JYX0NPTlRFTlQgPSAxIDw8IDUsCi0JREVCVUdfVFggPSAxIDw8IDYsCi0JREVCVUdfVFhfQ09OVEVOVCA9IDEgPDwgOCwKLQlERUJVR19UWEJVRkZFUiA9IDEgPDwgOSwKLQlERUJVR19RVUVVRSA9IDEgPDwgMTAsCi0JREVCVUdfQk9PVCA9IDEgPDwgMTEsCi0JREVCVUdfUFNNID0gMSA8PCAxMiwKLQlERUJVR19BTEwgPSB+MCwKLX07Ci0KLSNkZWZpbmUgREVCVUdfTEVWRUwgREVCVUdfTk9ORQotLyogI2RlZmluZSBERUJVR19MRVZFTCBERUJVR19BTEwgKi8KLS8qICNkZWZpbmUgREVCVUdfTEVWRUwgKERFQlVHX1RYIHwgREVCVUdfUlggfCBERUJVR19JUlEpICovCi0vKiAjZGVmaW5lIERFQlVHX0xFVkVMIChERUJVR19UWCB8IERFQlVHX01FTVJFR0lPTiB8IERFQlVHX1FVRVVFKSAqLwotLyogI2RlZmluZSBERUJVR19MRVZFTCAoREVCVUdfTUVNUkVHSU9OIHwgREVCVUdfUVVFVUUpICovCi0KLSNkZWZpbmUgc3RsYzQ1eHhfZXJyb3IoZm10LCBhcmcuLi4pIFwKLQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX1BSRUZJWCAiRVJST1IgIiBmbXQgIlxuIiwgIyNhcmcpCi0KLSNkZWZpbmUgc3RsYzQ1eHhfd2FybmluZyhmbXQsIGFyZy4uLikgXAotCXByaW50ayhLRVJOX1dBUk5JTkcgRFJJVkVSX1BSRUZJWCAiV0FSTklORyAiIGZtdCAiXG4iLCAjI2FyZykKLQotI2RlZmluZSBzdGxjNDV4eF9pbmZvKGZtdCwgYXJnLi4uKSBcCi0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfUFJFRklYIGZtdCAiXG4iLCAjI2FyZykKLQotI2RlZmluZSBzdGxjNDV4eF9kZWJ1ZyhsZXZlbCwgZm10LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGxldmVsICYgREVCVUdfTEVWRUwpIFwKLQkJCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9QUkVGSVggZm10ICJcbiIsICMjYXJnKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgc3RsYzQ1eHhfZHVtcChsZXZlbCwgYnVmLCBsZW4pCQlcCi0JZG8geyBcCi0JCWlmIChsZXZlbCAmIERFQlVHX0xFVkVMKSBcCi0JCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCBcCi0JCQkJICAgICAgIDE2LCAxLCBidWYsIGxlbiwgMSk7CQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBNQUMyU1RSKGEpICgoYSlbMF0sIChhKVsxXSwgKGEpWzJdLCAoYSlbM10sIChhKVs0XSwgKGEpWzVdKQotI2RlZmluZSBNQUNTVFIgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgotCi0vKiBCaXQgMTUgaXMgcmVhZC93cml0ZSBiaXQ7IE9OID0gUkVBRCwgT0ZGID0gV1JJVEUgKi8KLSNkZWZpbmUgQUREUl9SRUFEX0JJVF8xNSAgMHg4MDAwCi0KLSNkZWZpbmUgU1BJX0FEUlNfQVJNX0lOVEVSUlVQVFMgICAgIDB4MDAKLSNkZWZpbmUgU1BJX0FEUlNfQVJNX0lOVF9FTgkgICAgMHgwNAotCi0jZGVmaW5lIFNQSV9BRFJTX0hPU1RfSU5URVJSVVBUUyAgICAweDA4Ci0jZGVmaW5lIFNQSV9BRFJTX0hPU1RfSU5UX0VOCSAgICAweDBjCi0jZGVmaW5lIFNQSV9BRFJTX0hPU1RfSU5UX0FDSwkgICAgMHgxMAotCi0jZGVmaW5lIFNQSV9BRFJTX0dFTl9QVVJQXzEgICAJICAgIDB4MTQKLSNkZWZpbmUgU1BJX0FEUlNfR0VOX1BVUlBfMiAgIAkgICAgMHgxOAotCi0vKiBoaWdoIHdvcmQgKi8KLSNkZWZpbmUgU1BJX0FEUlNfREVWX0NUUkxfU1RBVCAgICAgIDB4MjYKLQotI2RlZmluZSBTUElfQURSU19ETUFfREFUQSAgICAgIAkgICAgMHgyOAotCi0jZGVmaW5lIFNQSV9BRFJTX0RNQV9XUklURV9DVFJMICAgICAweDJjCi0jZGVmaW5lIFNQSV9BRFJTX0RNQV9XUklURV9MRU4gICAgICAweDJlCi0jZGVmaW5lIFNQSV9BRFJTX0RNQV9XUklURV9CQVNFICAgICAweDMwCi0KLSNkZWZpbmUgU1BJX0FEUlNfRE1BX1JFQURfQ1RSTCAgICAgIDB4MzQKLSNkZWZpbmUgU1BJX0FEUlNfRE1BX1JFQURfTEVOICAgICAgIDB4MzYKLSNkZWZpbmUgU1BJX0FEUlNfRE1BX1JFQURfQkFTRSAgICAgIDB4MzgKLQotI2RlZmluZSBTUElfQ1RSTF9TVEFUX0hPU1RfT1ZFUlJJREUgMHg4MDAwCi0jZGVmaW5lIFNQSV9DVFJMX1NUQVRfU1RBUlRfSEFMVEVEICAweDQwMDAKLSNkZWZpbmUgU1BJX0NUUkxfU1RBVF9SQU1fQk9PVCAgICAgIDB4MjAwMAotI2RlZmluZSBTUElfQ1RSTF9TVEFUX0hPU1RfUkVTRVQgICAgMHgxMDAwCi0jZGVmaW5lIFNQSV9DVFJMX1NUQVRfSE9TVF9DUFVfRU4gICAweDA4MDAKLQotI2RlZmluZSBTUElfRE1BX1dSSVRFX0NUUkxfRU5BQkxFICAgMHgwMDAxCi0jZGVmaW5lIFNQSV9ETUFfUkVBRF9DVFJMX0VOQUJMRSAgICAweDAwMDEKLSNkZWZpbmUgSE9TVF9BTExPV0VEICAgICAgICAgICAgICAgICgxIDw8IDcpCi0KLSNkZWZpbmUgRklSTVdBUkVfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAKLQotI2RlZmluZSBTUElfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgLyogbXNlYyAqLwotCi0jZGVmaW5lIFNQSV9NQVhfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAzMgotCi0jZGVmaW5lIFNQSV9NQVhfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgICAzMjc2NwotCi0jZGVmaW5lIFNQSV9UQVJHRVRfSU5UX1dBS0VVUCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNQSV9UQVJHRVRfSU5UX1NMRUVQICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNQSV9UQVJHRVRfSU5UX1JERE9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0KLSNkZWZpbmUgU1BJX1RBUkdFVF9JTlRfQ1RTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgU1BJX1RBUkdFVF9JTlRfRFIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLQotI2RlZmluZSBTUElfSE9TVF9JTlRfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTUElfSE9TVF9JTlRfV1JfUkVBRFkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTUElfSE9TVF9JTlRfU1dfVVBEQVRFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTUElfSE9TVF9JTlRfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotCi0vKiBjbGVhciB0byBzZW5kICovCi0jZGVmaW5lIFNQSV9IT1NUX0lOVF9DVFMJICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLQotLyogZGF0YSByZWFkeSAqLwotI2RlZmluZSBTUElfSE9TVF9JTlRfRFIJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotCi0jZGVmaW5lIFNQSV9IT1NUX0lOVFNfREVGQVVMVCBcCi0JKFNQSV9IT1NUX0lOVF9SRUFEWSB8IFNQSV9IT1NUX0lOVF9VUERBVEUgfCBTUElfSE9TVF9JTlRfU1dfVVBEQVRFKQotCi0jZGVmaW5lIFRBUkdFVF9CT09UX1NMRUVQIDUwCi0KLS8qIFRoZSBmaXJtd2FyZSBidWZmZXIgaXMgZGl2aWRlZCBpbnRvIHRocmVlIGFyZWFzOgotICoKLSAqIG8gY29uZmlnIGFyZWEgKGZvciBjb250cm9sIGNvbW1hbmRzKQotICogbyB0eCBidWZmZXIKLSAqIG8gcnggYnVmZmVyCi0gKi8KLSNkZWZpbmUgRklSTVdBUkVfQlVGRkVSX1NUQVJUIDB4MjAyMDAKLSNkZWZpbmUgRklSTVdBUkVfQlVGRkVSX0VORCAweDI3YzYwCi0jZGVmaW5lIEZJUk1XQVJFX0JVRkZFUl9MRU4gKEZJUk1XQVJFX0JVRkZFUl9FTkQgLSBGSVJNV0FSRV9CVUZGRVJfU1RBUlQpCi0jZGVmaW5lIEZJUk1XQVJFX01UVSAzMjQwCi0jZGVmaW5lIEZJUk1XQVJFX0NPTkZJR19QQVlMT0FEX0xFTiAxMDI0Ci0jZGVmaW5lIEZJUk1XQVJFX0NPTkZJR19TVEFSVCBGSVJNV0FSRV9CVUZGRVJfU1RBUlQKLSNkZWZpbmUgRklSTVdBUkVfQ09ORklHX0xFTiAoc2l6ZW9mKHN0cnVjdCBzX2xtX2NvbnRyb2wpICsgXAotCQkJICAgICBGSVJNV0FSRV9DT05GSUdfUEFZTE9BRF9MRU4pCi0jZGVmaW5lIEZJUk1XQVJFX0NPTkZJR19FTkQgKEZJUk1XQVJFX0NPTkZJR19TVEFSVCArIEZJUk1XQVJFX0NPTkZJR19MRU4gLSAxKQotI2RlZmluZSBGSVJNV0FSRV9SWEJVRkZFUl9MRU4gKDUgKiBGSVJNV0FSRV9NVFUgKyAxMDI0KQotI2RlZmluZSBGSVJNV0FSRV9SWEJVRkZFUl9TVEFSVCAoRklSTVdBUkVfQlVGRkVSX0VORCAtIEZJUk1XQVJFX1JYQlVGRkVSX0xFTikKLSNkZWZpbmUgRklSTVdBUkVfUlhCVUZGRVJfRU5EIChGSVJNV0FSRV9SWEJVRkZFUl9TVEFSVCArIFwKLQkJCSAgICAgICBGSVJNV0FSRV9SWEJVRkZFUl9MRU4gLSAxKQotI2RlZmluZSBGSVJNV0FSRV9UWEJVRkZFUl9TVEFSVCAoRklSTVdBUkVfQlVGRkVSX1NUQVJUICsgRklSTVdBUkVfQ09ORklHX0xFTikKLSNkZWZpbmUgRklSTVdBUkVfVFhCVUZGRVJfTEVOIChGSVJNV0FSRV9CVUZGRVJfTEVOIC0gRklSTVdBUkVfQ09ORklHX0xFTiAtIFwKLQkJCSAgICAgICBGSVJNV0FSRV9SWEJVRkZFUl9MRU4pCi0jZGVmaW5lIEZJUk1XQVJFX1RYQlVGRkVSX0VORCAoRklSTVdBUkVfVFhCVUZGRVJfU1RBUlQgKyBcCi0JCQkgICAgICAgRklSTVdBUkVfVFhCVUZGRVJfTEVOIC0gMSkKLQotI2RlZmluZSBGSVJNV0FSRV9UWEJVRkZFUl9IRUFERVIgMTAwCi0jZGVmaW5lIEZJUk1XQVJFX1RYQlVGRkVSX1RSQUlMRVIgNAotCi0vKiBGSVhNRTogY29tZSB1cCB3aXRoIGEgcHJvcGVyIHZhbHVlICovCi0jZGVmaW5lIE1BWF9GUkFNRV9MRU4gMjUwMAotCi0vKiB1bml0IGlzIG1zICovCi0jZGVmaW5lIFRYX0ZSQU1FX0xJRkVUSU1FIDIwMDAKLSNkZWZpbmUgVFhfVElNRU9VVCA0MDAwCi0KLSNkZWZpbmUgU1VQUE9SVEVEX0NIQU5ORUxTIDEzCi0KLS8qIEZJWE1FICovCi0vKiAjZGVmaW5lIENIQU5ORUxfQ0FMX0xFTiBvZmZzZXRvZihzdHJ1Y3Qgc19sbW9fc2NhbiwgYnJhdGVtYXNrKSAtIFwgKi8KLS8qIAlvZmZzZXRvZihzdHJ1Y3Qgc19sbW9fc2NhbiwgY2hhbm5lbCkgKi8KLSNkZWZpbmUgQ0hBTk5FTF9DQUxfTEVOIDI5MgotI2RlZmluZSBDSEFOTkVMX0NBTF9BUlJBWV9MRU4gKFNVUFBPUlRFRF9DSEFOTkVMUyAqIENIQU5ORUxfQ0FMX0xFTikKLS8qIEZJWE1FICovCi0vKiAjZGVmaW5lIFJTU0lfQ0FMX0xFTiBzaXplb2Yoc3RydWN0IHNfbG1vX3NjYW4pIC0gXCAqLwotLyogCW9mZnNldG9mKHN0cnVjdCBzX2xtb19zY2FuLCByc3NpY2FsKSAqLwotI2RlZmluZSBSU1NJX0NBTF9MRU4gOAotI2RlZmluZSBSU1NJX0NBTF9BUlJBWV9MRU4gKFNVUFBPUlRFRF9DSEFOTkVMUyAqIFJTU0lfQ0FMX0xFTikKLQotc3RydWN0IHNfZG1hX3JlZ3MgewotCXVuc2lnbmVkIHNob3J0IGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBsZW47Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotfTsKLQotc3RydWN0IHN0bGM0NXh4X2llX3RpbSB7Ci0JdTggZHRpbV9jb3VudDsKLQl1OCBkdGltX3BlcmlvZDsKLQl1OCBibWFwX2NvbnRyb2w7Ci0JdTggcHZibWFwWzI1MV07Ci19OwotCi1zdHJ1Y3QgdHhidWZmZXIgewotCS8qIGNhbiBiZSByZW1vdmVkIHdoZW4gc3dpdGNoZWQgdG8gc2tiIHF1ZXVlICovCi0Jc3RydWN0IGxpc3RfaGVhZCB0eF9saXN0OwotCi0Jc3RydWN0IGxpc3RfaGVhZCBidWZmZXJfbGlzdDsKLQotCWludCBzdGFydDsKLQlpbnQgZnJhbWVfc3RhcnQ7Ci0JaW50IGVuZDsKLQotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTMyIGhhbmRsZTsKLQotCWJvb2wgc3RhdHVzX25lZWRlZDsKLQotCWludCBoZWFkZXJfbGVuOwotCi0JLyogdW5pdCBqaWZmaWVzICovCi0JdW5zaWduZWQgbG9uZyBsaWZldGltZTsKLX07Ci0KLWVudW0gZndfc3RhdGUgewotCUZXX1NUQVRFX09GRiwKLQlGV19TVEFURV9CT09USU5HLAotCUZXX1NUQVRFX1JFQURZLAotCUZXX1NUQVRFX1JFU0VULAotCUZXX1NUQVRFX1JFU0VUVElORywKLX07Ci0KLXN0cnVjdCBzdGxjNDV4eCB7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19yZXNldDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcmtfdHhfdGltZW91dDsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci0Jc3RydWN0IGNvbXBsZXRpb24gZndfY29tcDsKLQotCi0JdTggYnNzaWRbRVRIX0FMRU5dOwotCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKLQlpbnQgY2hhbm5lbDsKLQotCXU4ICpjYWxfcnNzaTsKLQl1OCAqY2FsX2NoYW5uZWxzOwotCi0JZW51bSBmd19zdGF0ZSBmd19zdGF0ZTsKLQotCXNwaW5sb2NrX3QgdHhfbG9jazsKLQotCS8qIHByb3RlY3RlZCBieSB0eF9sb2NrICovCi0Jc3RydWN0IGxpc3RfaGVhZCB0eGJ1ZmZlcjsKLQotCS8qIHByb3RlY3RlZCBieSB0eF9sb2NrICovCi0Jc3RydWN0IGxpc3RfaGVhZCB0eF9wZW5kaW5nOwotCi0JLyogcHJvdGVjdGVkIGJ5IHR4X2xvY2sgKi8KLQlpbnQgdHhfcXVldWVfc3RvcHBlZDsKLQotCS8qIHByb3RlY3RlZCBieSBtdXRleCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgdHhfc2VudDsKLQotCWludCB0eF9mcmFtZXM7Ci0KLQl1OCAqZnc7Ci0JaW50IGZ3X2xlbjsKLQotCWJvb2wgcHNtOwotCWJvb2wgYXNzb2NpYXRlZDsKLQlpbnQgYWlkOwotCWJvb2wgcHNwb2xsaW5nOwotfTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RsYzQ1eHgvc3RsYzQ1eHhfbG1hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3N0bGM0NXh4L3N0bGM0NXh4X2xtYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1ZGI4MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3RsYzQ1eHgvc3RsYzQ1eHhfbG1hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIFRoaXMgaXMgdGhlIExNQUMgQVBJIGludGVyZmFjZSBoZWFkZXIgZmlsZSBmb3IgU1RMQzQ1NjAuICAgICAgICAJKgotKiAgQ29weXJpZ2h0IChDKSAyMDA3IENvbmV4YW50IFN5c3RlbXMsIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAgICAgICAgKgotKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgICAgKgotKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIJKgotKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgKgotKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YJKgotKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgKgotKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgKgotKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2xtYWNfaF9fCi0jZGVmaW5lIF9fbG1hY19oX18KLQotI2RlZmluZSBMTV9UT1BfVkFSSUFOVCAgICAgIDB4MDUwNgotI2RlZmluZSBMTV9CT1RUT01fVkFSSUFOVCAgIDB4MDUwNgotCi0vKgotICogTE1BQyAtIFVNQUMgaW50ZXJmYWNlIGRlZmluaXRpb246Ci0gKi8KLQotI2RlZmluZSBMTV9GTEFHX0NPTlRST0wgICAgIDB4ODAwMAotI2RlZmluZSBMTV9GTEFHX0FMSUdOICAgICAgIDB4NDAwMAotCi0jZGVmaW5lIExNX0NUUkxfT1BTRVQgICAgICAgMHgwMDAxCi0KLSNkZWZpbmUgTE1fT1VUX1BST01JU0MgICAgICAweDAwMDEKLSNkZWZpbmUgTE1fT1VUX1RJTUVTVEFNUCAgICAweDAwMDIKLSNkZWZpbmUgTE1fT1VUX1NFUU5SICAgICAgICAweDAwMDQKLSNkZWZpbmUgTE1fT1VUX0JVUlNUICAgICAgICAweDAwMTAKLSNkZWZpbmUgTE1fT1VUX05PQ0FOQ0VMICAgICAweDAwMjAKLSNkZWZpbmUgTE1fT1VUX0NMRUFSVElNICAgICAweDAwNDAKLSNkZWZpbmUgTE1fT1VUX0hJVENISElLRSAgICAweDAwODAKLSNkZWZpbmUgTE1fT1VUX0NPTVBSRVNTICAgICAweDAxMDAKLSNkZWZpbmUgTE1fT1VUX0NPTkNBVCAgICAgICAweDAyMDAKLSNkZWZpbmUgTE1fT1VUX1BDU19BQ0NFUFQgICAweDA0MDAKLSNkZWZpbmUgTE1fT1VUX1dBSVRFT1NQICAgICAweDA4MDAKLQotCi0jZGVmaW5lIExNX0FMT0ZUX1NQICAgICAgICAgMHgxMAotI2RlZmluZSBMTV9BTE9GVF9DVFMgICAgICAgIDB4MjAKLSNkZWZpbmUgTE1fQUxPRlRfUlRTICAgICAgICAweDQwCi0jZGVmaW5lIExNX0FMT0ZUX01BU0sgICAgICAgMHgxZgotI2RlZmluZSBMTV9BTE9GVF9SQVRFICAgICAgIDB4MGYKLQotI2RlZmluZSBMTV9JTl9GQ1NfR09PRCAgICAgIDB4MDAwMQotI2RlZmluZSBMTV9JTl9NQVRDSF9NQUMgICAgIDB4MDAwMgotI2RlZmluZSBMTV9JTl9NQ0JDICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBMTV9JTl9CRUFDT04gICAgICAgIDB4MDAwOAotI2RlZmluZSBMTV9JTl9NQVRDSF9CU1MgICAgIDB4MDAxMAotI2RlZmluZSBMTV9JTl9CQ0FTVF9CU1MgICAgIDB4MDAyMAotI2RlZmluZSBMTV9JTl9EQVRBICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBMTV9JTl9UUlVOQ0FURUQgICAgIDB4MDA4MAotCi0jZGVmaW5lIExNX0lOX1RSQU5TUEFSRU5UICAgMHgwMjAwCi0KLSNkZWZpbmUgTE1fUVVFVUVfQkVBQ09OICAgICAwCi0jZGVmaW5lIExNX1FVRVVFX1NDQU4gICAgICAgMQotI2RlZmluZSBMTV9RVUVVRV9NR1QgICAgICAgIDIKLSNkZWZpbmUgTE1fUVVFVUVfTUNCQyAgICAgICAzCi0jZGVmaW5lIExNX1FVRVVFX0RBVEEgICAgICAgNAotI2RlZmluZSBMTV9RVUVVRV9EQVRBMCAgICAgIDQKLSNkZWZpbmUgTE1fUVVFVUVfREFUQTEgICAgICA1Ci0jZGVmaW5lIExNX1FVRVVFX0RBVEEyICAgICAgNgotI2RlZmluZSBMTV9RVUVVRV9EQVRBMyAgICAgIDcKLQotI2RlZmluZSBMTV9TRVRVUF9JTkZSQSAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgTE1fU0VUVVBfSUJTUyAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIExNX1NFVFVQX1RSQU5TUEFSRU5UICAgIDB4MDAwOAotI2RlZmluZSBMTV9TRVRVUF9QUk9NSVNDVU9VUyAgICAweDAwMTAKLSNkZWZpbmUgTE1fU0VUVVBfSElCRVJOQVRFICAgICAgMHgwMDIwCi0jZGVmaW5lIExNX1NFVFVQX05PQUNLICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBMTV9TRVRVUF9SWF9ESVNBQkxFRCAgICAweDAwODAKLQotI2RlZmluZSBMTV9BTlRFTk5BXzAgICAgICAgICAgICAwCi0jZGVmaW5lIExNX0FOVEVOTkFfMSAgICAgICAgICAgIDEKLSNkZWZpbmUgTE1fQU5URU5OQV9ESVZFUlNJVFkgICAgMgotCi0jZGVmaW5lIExNX1RYX0ZBSUxFRCAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBMTV9UWF9QU00gICAgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgTE1fVFhfUFNNX0NBTkNFTExFRAkweDAwMDQKLQotI2RlZmluZSBMTV9TQ0FOX0VYSVQgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgTE1fU0NBTl9UUkFQICAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIExNX1NDQU5fQUNUSVZFICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBMTV9TQ0FOX0ZJTFRFUiAgICAgICAgICAweDAwMDgKLQotI2RlZmluZSBMTV9QU00gICAgICAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgTE1fUFNNX0RUSU0gICAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIExNX1BTTV9NQ0JDICAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBMTV9QU01fQ0hFQ0tTVU0gICAgICAgICAweDAwMDgKLSNkZWZpbmUgTE1fUFNNX1NLSVBfTU9SRV9EQVRBICAgMHgwMDEwCi0jZGVmaW5lIExNX1BTTV9CRUFDT05fVElNRU9VVCAgIDB4MDAyMAotI2RlZmluZSBMTV9QU01fSEZPU0xFRVAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgTE1fUFNNX0FVVE9TV0lUQ0hfU0xFRVAgMHgwMDgwCi0jZGVmaW5lCUxNX1BTTV9MUElUCQkweDAxMDAKLSNkZWZpbmUgTE1fUFNNX0JGX1VDQVNUX1NLSVAgICAgMHgwMjAwCi0jZGVmaW5lIExNX1BTTV9CRl9NQ0FTVF9TS0lQICAgIDB4MDQwMAotCi0vKiBoZm9zbGVlcCAqLwotI2RlZmluZSBMTV9QU01fU0xFRVBfT1BUSU9OX01BU0sgKExNX1BTTV9BVVRPU1dJVENIX1NMRUVQIHwgTE1fUFNNX0hGT1NMRUVQKQotI2RlZmluZSBMTV9QU01fU0xFRVBfT1BUSU9OX1NISUZUICAgICAgIDYKLS8qIGhmb3NsZWVwZW5kICovCi0jZGVmaW5lIExNX1BTTV9CRl9PUFRJT05fTUFTSyAoTE1fUFNNX0JGX01DQVNUX1NLSVAgfCBMTV9QU01fQkZfVUNBU1RfU0tJUCkKLSNkZWZpbmUgTE1fUFNNX0JGX09QVElPTl9TSElGVCAgOQotCi0KLSNkZWZpbmUgTE1fUFJJVkFDQ19XRVAgICAgICAgICAgMHgwMQotI2RlZmluZSBMTV9QUklWQUNDX1RLSVAgICAgICAgICAweDAyCi0jZGVmaW5lIExNX1BSSVZBQ0NfTUlDSEFFTCAgICAgIDB4MDQKLSNkZWZpbmUgTE1fUFJJVkFDQ19DQ1hfS1AgICAgICAgMHgwOAotI2RlZmluZSBMTV9QUklWQUNDX0NDWF9NSUMgICAgICAweDEwCi0jZGVmaW5lIExNX1BSSVZBQ0NfQUVTX0NDTVAgICAgIDB4MjAKLQotLyogc2l6ZSBvZiBzX2xtX2Rlc2NyIGluIHdvcmRzICovCi0jZGVmaW5lIExNX0RFU0NSX1NJWkVfV09SRFMgICAgIDExCi0KLSNpZm5kZWYgX19BU1NFTUJMRVJfXwotCi1lbnVtIHsKLSAgICBMTV9NT0RFX0NMSUVOVCA9IDAsCi0gICAgTE1fTU9ERV9BUAotfTsKLQotc3RydWN0IHNfbG1fZGVzY3IgewotICAgIHVpbnQxNl90IG1vZGVzOwotICAgIHVpbnQxNl90IGZsYWdzOwotICAgIHVpbnQzMl90IGJ1ZmZlcl9zdGFydDsKLSAgICB1aW50MzJfdCBidWZmZXJfZW5kOwotICAgIHVpbnQ4X3QgaGVhZGVyOwotICAgIHVpbnQ4X3QgdHJhaWxlcjsKLSAgICB1aW50OF90IHR4X3F1ZXVlczsKLSAgICB1aW50OF90IHR4X2RlcHRoOwotICAgIHVpbnQ4X3QgcHJpdmFjeTsKLSAgICB1aW50OF90IHJ4X2tleWNhY2hlOwotICAgIHVpbnQ4X3QgdGltX3NpemU7Ci0gICAgdWludDhfdCBwYWQxOwotICAgIHVpbnQ4X3QgcmF0ZXNbMTZdOwotICAgIHVpbnQzMl90IGxpbms7Ci0JdWludDE2X3QgbXR1OwotfTsKLQotCi1zdHJ1Y3Qgc19sbV9jb250cm9sIHsKLSAgICB1aW50MTZfdCBmbGFnczsKLSAgICB1aW50MTZfdCBsZW5ndGg7Ci0gICAgdWludDMyX3QgaGFuZGxlOwotICAgIHVpbnQxNl90IG9pZDsKLSAgICB1aW50MTZfdCBwYWQ7Ci0gICAgLyogdWludDhfdCBkYXRhW107ICovCi19OwotCi1lbnVtIHsKLSAgICBMTV9QUklWX05PTkUgPSAwLAotICAgIExNX1BSSVZfV0VQLAotICAgIExNX1BSSVZfVEtJUCwKLSAgICBMTV9QUklWX1RLSVBNSUNIQUVMLAotICAgIExNX1BSSVZfQ0NYX1dFUE1JQywKLSAgICBMTV9QUklWX0NDWF9LUE1JQywKLSAgICBMTV9QUklWX0NDWF9LUCwKLSAgICBMTV9QUklWX0FFU19DQ01QCi19OwotCi1lbnVtIHsKLSAgICBMTV9ERUNSWVBUX05PTkUsCi0gICAgTE1fREVDUllQVF9PSywKLSAgICBMTV9ERUNSWVBUX05PS0VZLAotICAgIExNX0RFQ1JZUFRfTk9NSUNIQUVMLAotICAgIExNX0RFQ1JZUFRfTk9DS0lQTUlDLAotICAgIExNX0RFQ1JZUFRfRkFJTF9XRVAsCi0gICAgTE1fREVDUllQVF9GQUlMX1RLSVAsCi0gICAgTE1fREVDUllQVF9GQUlMX01JQ0hBRUwsCi0gICAgTE1fREVDUllQVF9GQUlMX0NLSVBLUCwKLSAgICBMTV9ERUNSWVBUX0ZBSUxfQ0tJUE1JQywKLSAgICBMTV9ERUNSWVBUX0ZBSUxfQUVTQ0NNUAotfTsKLQotc3RydWN0IHNfbG1fZGF0YV9vdXQgewotICAgIHVpbnQxNl90IGZsYWdzOwotICAgIHVpbnQxNl90IGxlbmd0aDsKLSAgICB1aW50MzJfdCBoYW5kbGU7Ci0gICAgdWludDE2X3QgYWlkOwotICAgIHVpbnQ4X3QgcnRzX3JldHJpZXM7Ci0gICAgdWludDhfdCByZXRyaWVzOwotICAgIHVpbnQ4X3QgYWxvZnRbOF07Ci0gICAgdWludDhfdCBhbG9mdF9jdHJsOwotICAgIHVpbnQ4X3QgY3J5cHRfb2Zmc2V0OwotICAgIHVpbnQ4X3Qga2V5dHlwZTsKLSAgICB1aW50OF90IGtleWxlbjsKLSAgICB1aW50OF90IGtleVsxNl07Ci0gICAgdWludDhfdCBxdWV1ZTsKLSAgICB1aW50OF90IGJhY2tsb2c7Ci0gICAgdWludDE2X3QgZHVyYXRpb25zWzRdOwotICAgIHVpbnQ4X3QgYW50ZW5uYTsKLSAgICB1aW50OF90IGN0czsKLSAgICBpbnQxNl90IHBvd2VyOwotICAgIHVpbnQ4X3QgcGFkWzJdOwotICAgIC8qdWludDhfdCBkYXRhW107Ki8KLX07Ci0KLSNkZWZpbmUgTE1fUkNQSV9JTlZBTElEICAgICAgICAgKDB4ZmYpCi0KLXN0cnVjdCBzX2xtX2RhdGFfaW4gewotICAgIHVpbnQxNl90IGZsYWdzOwotICAgIHVpbnQxNl90IGxlbmd0aDsKLSAgICB1aW50MTZfdCBmcmVxdWVuY3k7Ci0gICAgdWludDhfdCBhbnRlbm5hOwotICAgIHVpbnQ4X3QgcmF0ZTsKLSAgICB1aW50OF90IHJjcGk7Ci0gICAgdWludDhfdCBzcTsKLSAgICB1aW50OF90IGRlY3J5cHQ7Ci0gICAgdWludDhfdCByc3NpX3JhdzsKLSAgICB1aW50MzJfdCBjbG9ja1syXTsKLSAgICAvKnVpbnQ4X3QgZGF0YVtdOyovCi19OwotCi11bmlvbiB1X2xtX2RhdGEgewotICAgIHN0cnVjdCBzX2xtX2RhdGFfb3V0IG91dDsKLSAgICBzdHJ1Y3Qgc19sbV9kYXRhX2luIGluOwotfTsKLQotZW51bSB7Ci0gICAgTE1fT0lEX1NFVFVQCT0gMCwKLSAgICBMTV9PSURfU0NBTgkJPSAxLAotICAgIExNX09JRF9UUkFQCQk9IDIsCi0gICAgTE1fT0lEX0VEQ0YJCT0gMywKLSAgICBMTV9PSURfS0VZQ0FDSEUJPSA0LAotICAgIExNX09JRF9QU00JCT0gNiwKLSAgICBMTV9PSURfVFhDQU5DRUwJPSA3LAotICAgIExNX09JRF9UWAkJPSA4LAotICAgIExNX09JRF9CVVJTVAk9IDksCi0gICAgTE1fT0lEX1NUQVRTCT0gMTAsCi0gICAgTE1fT0lEX0xFRAkJPSAxMywKLSAgICBMTV9PSURfVElNRVIJPSAxNSwKLSAgICBMTV9PSURfTkFWCQk9IDIwLAotICAgIExNX09JRF9QQ1MJCT0gMjIsCi0gICAgTE1fT0lEX0JUX0JBTEFOQ0VSICA9IDI4LAotICAgIExNX09JRF9HUk9VUF9BRERSRVNTX1RBQkxFCT0gMzAsCi0gICAgTE1fT0lEX0FSUFRBQkxFICAgICA9IDMxLAotICAgIExNX09JRF9CVF9PUFRJT05TID0gMzUKLX07Ci0KLWVudW0gewotICAgIExNX0ZST05URU5EX1VOS05PV04gPSAwLAotICAgIExNX0ZST05URU5EX0RVRVRURTMsCi0gICAgTE1fRlJPTlRFTkRfRFVFVFRFMiwKLSAgICBMTV9GUk9OVEVORF9GUklTQkVFLAotICAgIExNX0ZST05URU5EX0NST1NTQk9XLAotICAgIExNX0ZST05URU5EX0xPTkdCT1cKLX07Ci0KLQotI2RlZmluZSBJTlZBTElEX0xQRl9CQU5EV0lEVEggICAweGZmZmYKLSNkZWZpbmUgSU5WQUxJRF9PU0NfU1RBUlRfREVMQVkgMHhmZmZmCi0KLXN0cnVjdCBzX2xtb19zZXR1cCB7Ci0gICAgdWludDE2X3QgZmxhZ3M7Ci0gICAgdWludDhfdCAgbWFjYWRkcls2XTsKLSAgICB1aW50OF90ICBic3NpZFs2XTsKLSAgICB1aW50OF90ICBhbnRlbm5hOwotICAgIHVpbnQ4X3QgIHJ4X2FsaWduOwotICAgIHVpbnQzMl90IHJ4X2J1ZmZlcjsKLSAgICB1aW50MTZfdCByeF9tdHU7Ci0gICAgdWludDE2X3QgZnJvbnRlbmQ7Ci0gICAgdWludDE2X3QgdGltZW91dDsKLSAgICB1aW50MTZfdCB0cnVuY2F0ZTsKLSAgICB1aW50MzJfdCBicmF0ZW1hc2s7Ci0gICAgdWludDhfdCAgc2Jzc19vZmZzZXQ7Ci0gICAgdWludDhfdCAgbWNhc3Rfd2luZG93OwotICAgIHVpbnQ4X3QgIHJ4X3Jzc2lfdGhyZXNob2xkOwotICAgIHVpbnQ4X3QgIHJ4X2VkX3RocmVzaG9sZDsKLSAgICB1aW50MzJfdCByZWZfY2xvY2s7Ci0gICAgdWludDE2X3QgbHBmX2JhbmR3aWR0aDsKLSAgICB1aW50MTZfdCBvc2Nfc3RhcnRfZGVsYXk7Ci19OwotCi0KLXN0cnVjdCBzX2xtb19zY2FuIHsKLSAgICB1aW50MTZfdCBmbGFnczsKLSAgICB1aW50MTZfdCBkd2VsbDsKLSAgICB1aW50OF90IGNoYW5uZWxbMjkyXTsKLSAgICB1aW50MzJfdCBicmF0ZW1hc2s7Ci0gICAgdWludDhfdCAgYWxvZnRbOF07Ci0gICAgdWludDhfdCAgcnNzaWNhbFs4XTsKLX07Ci0KLQotZW51bSB7Ci0gICAgTE1fVFJBUF9TQ0FOID0gMCwKLSAgICBMTV9UUkFQX1RJTUVSLAotICAgIExNX1RSQVBfQkVBQ09OX1RYLAotICAgIExNX1RSQVBfRkFBX1JBRElPX09OLAotICAgIExNX1RSQVBfRkFBX1JBRElPX09GRiwKLSAgICBMTV9UUkFQX1JBREFSLAotICAgIExNX1RSQVBfTk9fQkVBQ09OLAotICAgIExNX1RSQVBfVEJUVCwKLSAgICBMTV9UUkFQX1NDT19FTlRFUiwKLSAgICBMTV9UUkFQX1NDT19FWElUCi19OwotCi1zdHJ1Y3Qgc19sbW9fdHJhcCB7Ci0gICAgdWludDE2X3QgZXZlbnQ7Ci0gICAgdWludDE2X3QgZnJlcXVlbmN5OwotfTsKLQotc3RydWN0IHNfbG1vX3RpbWVyIHsKLSAgICB1aW50MzJfdCBpbnRlcnZhbDsKLX07Ci0KLXN0cnVjdCBzX2xtb19uYXYgewotICAgIHVpbnQzMl90IHBlcmlvZDsKLX07Ci0KLQotc3RydWN0IHNfbG1vX2VkY2ZfcXVldWU7Ci0KLXN0cnVjdCBzX2xtb19lZGNmIHsKLSAgICB1aW50OF90ICBmbGFnczsKLSAgICB1aW50OF90ICBzbG90dGltZTsKLSAgICB1aW50OF90ICBzaWZzOwotICAgIHVpbnQ4X3QgIGVvZnBhZDsKLSAgICBzdHJ1Y3Qgc19sbW9fZWRjZl9xdWV1ZSB7Ci0JICAgIHVpbnQ4X3QgIGFpZnM7Ci0JICAgIHVpbnQ4X3QgIHBhZDA7Ci0JICAgIHVpbnQxNl90IGN3bWluOwotCSAgICB1aW50MTZfdCBjd21heDsKLQkgICAgdWludDE2X3QgdHhvcDsKLSAgICB9IHF1ZXVlc1s4XTsKLSAgICB1aW50OF90ICBtYXBwaW5nWzRdOwotICAgIHVpbnQxNl90IG1heGJ1cnN0OwotICAgIHVpbnQxNl90IHJvdW5kX3RyaXBfZGVsYXk7Ci19OwotCi1zdHJ1Y3Qgc19sbW9fa2V5Y2FjaGUgewotICAgIHVpbnQ4X3QgZW50cnk7Ci0gICAgdWludDhfdCBrZXlpZDsKLSAgICB1aW50OF90IGFkZHJlc3NbNl07Ci0gICAgdWludDhfdCBwYWRbMl07Ci0gICAgdWludDhfdCBrZXl0eXBlOwotICAgIHVpbnQ4X3Qga2V5bGVuOwotICAgIHVpbnQ4X3Qga2V5WzI0XTsKLX07Ci0KLQotc3RydWN0IHNfbG1faW50ZXJ2YWw7Ci0KLXN0cnVjdCBzX2xtb19wc20gewotICAgIHVpbnQxNl90ICAgIGZsYWdzOwotICAgIHVpbnQxNl90ICAgIGFpZDsKLSAgICBzdHJ1Y3Qgc19sbV9pbnRlcnZhbCB7Ci0JICAgIHVpbnQxNl90IGludGVydmFsOwotCSAgICB1aW50MTZfdCBwZXJpb2RzOwotICAgIH0gaW50ZXJ2YWxzWzRdOwotICAgIC8qIHVpbnQxNl90ICAgIHBhZDsgKi8KLSAgICB1aW50OF90ICAgICBiZWFjb25fcmNwaV9za2lwX21heDsKLSAgICB1aW50OF90ICAgICByY3BpX2RlbHRhX3RocmVzaG9sZDsKLSAgICB1aW50OF90ICAgICBucjsKLSAgICB1aW50OF90ICAgICBleGNsdWRlWzFdOwotfTsKLQotI2RlZmluZSBNQ19GSUxURVJfQUREUkVTU19OVU0gICA0Ci0KLXN0cnVjdCBzX2xtb19ncm91cF9hZGRyZXNzX3RhYmxlIHsKLSAgICB1aW50MTZfdCAgICBmaWx0ZXJfZW5hYmxlOwotICAgIHVpbnQxNl90ICAgIG51bV9hZGRyZXNzOwotICAgIHVpbnQ4X3QgICAgIG1hY2FkZHJfbGlzdFtNQ19GSUxURVJfQUREUkVTU19OVU1dWzZdOwotfTsKLQotc3RydWN0IHNfbG1vX3R4Y2FuY2VsIHsKLSAgICB1aW50MzJfdCBhZGRyZXNzWzFdOwotfTsKLQotCi1zdHJ1Y3Qgc19sbW9fdHggewotICAgIHVpbnQ4X3QgIGZsYWdzOwotICAgIHVpbnQ4X3QgIHJldHJpZXM7Ci0gICAgdWludDhfdCAgcmNwaTsKLSAgICB1aW50OF90ICBzcTsKLSAgICB1aW50MTZfdCBzZXFjdHJsOwotICAgIHVpbnQ4X3QgIGFudGVubmE7Ci0gICAgdWludDhfdCAgcGFkOwotfTsKLQotc3RydWN0IHNfbG1vX2J1cnN0IHsKLSAgICB1aW50OF90ICBmbGFnczsKLSAgICB1aW50OF90ICBxdWV1ZTsKLSAgICB1aW50OF90ICBiYWNrbG9nOwotICAgIHVpbnQ4X3QgIHBhZDsKLSAgICB1aW50MTZfdCBkdXJhdGlvbnNbMzJdOwotfTsKLQotc3RydWN0IHNfbG1vX3N0YXRzIHsKLSAgICB1aW50MzJfdCB2YWxpZDsKLSAgICB1aW50MzJfdCBmY3M7Ci0gICAgdWludDMyX3QgYWJvcnQ7Ci0gICAgdWludDMyX3QgcGh5YWJvcnQ7Ci0gICAgdWludDMyX3QgcnRzX3N1Y2Nlc3M7Ci0gICAgdWludDMyX3QgcnRzX2ZhaWw7Ci0gICAgdWludDMyX3QgdGltZXN0YW1wOwotICAgIHVpbnQzMl90IHRpbWVfdHg7Ci0gICAgdWludDMyX3Qgbm9pc2VmbG9vcjsKLSAgICB1aW50MzJfdCBzYW1wbGVfbm9pc2VbOF07Ci0gICAgdWludDMyX3Qgc2FtcGxlX2NjYTsKLSAgICB1aW50MzJfdCBzYW1wbGVfdHg7Ci19OwotCi0KLXN0cnVjdCBzX2xtb19sZWQgewotICAgIHVpbnQxNl90IGZsYWdzOwotICAgIHVpbnQxNl90IG1hc2tbMl07Ci0gICAgdWludDE2X3QgZGVsYXkvKlsyXSovOwotfTsKLQotCi1zdHJ1Y3Qgc19sbW9fYnRfYmFsYW5jZXIgewotICAgIHVpbnQxNl90IHByaW9fdGhyZXNoOwotICAgIHVpbnQxNl90IGFjbF90aHJlc2g7Ci19OwotCi0KLXN0cnVjdCBzX2xtb19hcnBfdGFibGUgewotICAgIHVpbnQxNl90ICAgIGZpbHRlcl9lbmFibGU7Ci0gICAgdWludDMyX3QgICAgaXBhZGRyOwotfTsKLQotI2VuZGlmIC8qIF9fQVNTRU1CTEVSX18gKi8KLQotI2VuZGlmIC8qIF9fbG1hY19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwppbmRleCAzZDJhODRjLi5lMTM5ZWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwppbmRleCA4OTYwZmE5Li4wMGZlMDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggN2Y5NmJjYS4uMDUxODYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtMTMzMiw3ICsxMzMyLDYgQEAKICAgICAgICAgZnJlZV9uZXRkZXYocERldmljZS0+ZGV2KTsKICAgICB9CiAKLQlrZnJlZShwRGV2aWNlKTsKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJkZXZpY2VfZGlzY29ubmVjdDMuLiBcbiIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvS2NvbmZpZwppbmRleCA5NDA0NjBjLi4xMzI2NzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVzM1VU5ECiAJdHJpc3RhdGUgIklTODlDMzUgV0xBTiBVU0IgZHJpdmVyIgotCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgV0xBTl84MDIxMSAmJiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBXTEFOICYmIFVTQiAmJiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwgZHJpdmVyIGZvciBXaW5ib25kIFdJRkkgY2FyZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCmluZGV4IDg5NTA3MjQuLjA2NzA4MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYwpAQCAtNTEsMTAgKzUxLDI2IEBACiAJLm5fYml0cmF0ZXMJPSBBUlJBWV9TSVpFKHdic29mdF9yYXRlcyksCiB9OwogCitzdGF0aWMgdm9pZCBoYWxfc2V0X2JlYWNvbl9wZXJpb2Qoc3RydWN0IGh3X2RhdGEgKnBId0RhdGEsIHUxNiBiZWFjb25fcGVyaW9kKQoreworCXUzMiB0bXA7CisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybjsKKworCXBId0RhdGEtPkJlYWNvblBlcmlvZCA9IGJlYWNvbl9wZXJpb2Q7CisJdG1wID0gcEh3RGF0YS0+QmVhY29uUGVyaW9kIDw8IDE2OworCXRtcCB8PSBwSHdEYXRhLT5Qcm9iZURlbGF5OworCVdiMzVSZWdfV3JpdGUocEh3RGF0YSwgMHgwODQ4LCB0bXApOworfQorCiBzdGF0aWMgaW50IHdic29mdF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKIHsKLQlwcmludGsoIndic29mdF9hZGQgaW50ZXJmYWNlIGNhbGxlZFxuIik7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJaGFsX3NldF9iZWFjb25fcGVyaW9kKCZwcml2LT5zSHdEYXRhLCBjb25mLT52aWYtPmJzc19jb25mLmJlYWNvbl9pbnQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgzLDEwICs5OSwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdTY0IHdic29mdF9wcmVwYXJlX211bHRpY2FzdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IG1jX2NvdW50LAorCQkJCSAgICBzdHJ1Y3QgZGV2X2FkZHJfbGlzdCAqbWNfbGlzdCkKK3sKKwlyZXR1cm4gbWNfY291bnQ7Cit9CisKIHN0YXRpYyB2b2lkIHdic29mdF9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKIAkJCQkgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCiAJCQkJICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCi0JCQkJICAgIGludCBtY19jb3VudCwgc3RydWN0IGRldl9tY19saXN0ICptY2xpc3QpCisJCQkJICAgIHU2NCBtdWx0aWNhc3QpCiB7CiAJdW5zaWduZWQgaW50IG5ld19mbGFnczsKIApAQCAtOTQsNyArMTE2LDcgQEAKIAogCWlmICgqdG90YWxfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpCiAJCW5ld19mbGFncyB8PSBGSUZfUFJPTUlTQ19JTl9CU1M7Ci0JZWxzZSBpZiAoKCp0b3RhbF9mbGFncyAmIEZJRl9BTExNVUxUSSkgfHwgKG1jX2NvdW50ID4gMzIpKQorCWVsc2UgaWYgKCgqdG90YWxfZmxhZ3MgJiBGSUZfQUxMTVVMVEkpIHx8IChtdWx0aWNhc3QgPiAzMikpCiAJCW5ld19mbGFncyB8PSBGSUZfQUxMTVVMVEk7CiAKIAlkZXYtPmZsYWdzICY9IH5JRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTOwpAQCAtMTM4LDE5ICsxNjAsNiBAQAogCVdiMzVSZWdfV3JpdGUocEh3RGF0YSwgMHgwODI0LCByZWctPk0yNF9NYWNDb250cm9sKTsKIH0KIAotc3RhdGljIHZvaWQgaGFsX3NldF9iZWFjb25fcGVyaW9kKHN0cnVjdCBod19kYXRhICpwSHdEYXRhLCB1MTYgYmVhY29uX3BlcmlvZCkKLXsKLQl1MzIgdG1wOwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlyZXR1cm47Ci0KLQlwSHdEYXRhLT5CZWFjb25QZXJpb2QgPSBiZWFjb25fcGVyaW9kOwotCXRtcCA9IHBId0RhdGEtPkJlYWNvblBlcmlvZCA8PCAxNjsKLQl0bXAgfD0gcEh3RGF0YS0+UHJvYmVEZWxheTsKLQlXYjM1UmVnX1dyaXRlKHBId0RhdGEsIDB4MDg0OCwgdG1wKTsKLX0KLQogc3RhdGljIHZvaWQKIGhhbF9zZXRfY3VycmVudF9jaGFubmVsX2V4KHN0cnVjdCBod19kYXRhICpwSHdEYXRhLCBDaGFuSW5mbyBjaGFubmVsKQogewpAQCAtMjQ0LDcgKzI1Myw2IEBACiBzdGF0aWMgaW50IHdic29mdF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1MzIgY2hhbmdlZCkKIHsKIAlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmRldi0+Y29uZjsKIAlDaGFuSW5mbyBjaDsKIAogCXByaW50aygid2Jzb2Z0X2NvbmZpZyBjYWxsZWRcbiIpOwpAQCAtMjU0LDcgKzI2Miw2IEBACiAJY2guQ2hhbk5vID0gMTsKIAogCWhhbF9zZXRfY3VycmVudF9jaGFubmVsKCZwcml2LT5zSHdEYXRhLCBjaCk7Ci0JaGFsX3NldF9iZWFjb25fcGVyaW9kKCZwcml2LT5zSHdEYXRhLCBjb25mLT5iZWFjb25faW50KTsKIAloYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QoJnByaXYtPnNId0RhdGEsIDEpOwogCWhhbF9zZXRfYWNjZXB0X3Byb21pc2N1b3VzKCZwcml2LT5zSHdEYXRhLCAxKTsKIAloYWxfc2V0X2FjY2VwdF9tdWx0aWNhc3QoJnByaXYtPnNId0RhdGEsIDEpOwpAQCAtMjc3LDYgKzI4NCw3IEBACiAJLmFkZF9pbnRlcmZhY2UJCT0gd2Jzb2Z0X2FkZF9pbnRlcmZhY2UsCiAJLnJlbW92ZV9pbnRlcmZhY2UJPSB3YnNvZnRfcmVtb3ZlX2ludGVyZmFjZSwKIAkuY29uZmlnCQkJPSB3YnNvZnRfY29uZmlnLAorCS5wcmVwYXJlX211bHRpY2FzdAk9IHdic29mdF9wcmVwYXJlX211bHRpY2FzdCwKIAkuY29uZmlndXJlX2ZpbHRlcgk9IHdic29mdF9jb25maWd1cmVfZmlsdGVyLAogCS5nZXRfc3RhdHMJCT0gd2Jzb2Z0X2dldF9zdGF0cywKIAkuZ2V0X3R4X3N0YXRzCQk9IHdic29mdF9nZXRfdHhfc3RhdHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZwppbmRleCA5OTU5YjY1Li5mNDQyOTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgUFJJU00yX1VTQgogCXRyaXN0YXRlICJQcmlzbTIuNS8zIFVTQiBkcml2ZXIiCi0JZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFVTQiAmJiBXSVJFTEVTU19FWFQKKwlkZXBlbmRzIG9uIFdMQU4gJiYgVVNCICYmIFdJUkVMRVNTX0VYVAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgdGhlIHdsYW4tbmcgcHJpc20gMi41LzMgVVNCIGRyaXZlciBmb3IgYSB3aWRlIHJhbmdlIG9mCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW8uYyBiL2RyaXZlcnMvdWlvL3Vpby5jCmluZGV4IDAzZWZiMDYuLmU5NDEzNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpby5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpby5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC91aW9fZHJpdmVyLmg+CkBAIC02NTgsNyArNjU5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB1aW9fdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB1aW9fdm1fb3BzID0gewogCS5vcGVuID0gdWlvX3ZtYV9vcGVuLAogCS5jbG9zZSA9IHVpb192bWFfY2xvc2UsCiAJLmZhdWx0ID0gdWlvX3ZtYV9mYXVsdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9LY29uZmlnCmluZGV4IGViZDcyMzcuLjI0MDc1MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvS2NvbmZpZwpAQCAtMjIsNyArMjIsNiBAQAogCWRlZmF1bHQgeSBpZiBQQ01DSUEgJiYgIU0zMlIJCQkjIHNsODExX2NzCiAJZGVmYXVsdCB5IGlmIEFSTQkJCQkjIFNMLTgxMQogCWRlZmF1bHQgeSBpZiBTVVBFUkgJCQkJIyByOGE2NjU5Ny1oY2QKLQlkZWZhdWx0IHkgaWYgTUlDUk9CTEFaRQogCWRlZmF1bHQgUENJCiAKICMgbWFueSBub24tUENJIFNPQyBjaGlwcyBlbWJlZCBPSENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jCmluZGV4IDMzM2VlMDIuLjI0NzNjZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIFVTQlRNQ19TSVpFX0lPQlVGRkVSCTIwNDgKIAogLyogRGVmYXVsdCBVU0IgdGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSAqLwotI2RlZmluZSBVU0JUTUNfVElNRU9VVAkJMTAKKyNkZWZpbmUgVVNCVE1DX1RJTUVPVVQJCTUwMDAKIAogLyoKICAqIE1heGltdW0gbnVtYmVyIG9mIHJlYWQgY3ljbGVzIHRvIGVtcHR5IGJ1bGsgaW4gZW5kcG9pbnQgZHVyaW5nIENMRUFSIGFuZApAQCAtOTkzLDcgKzk5Myw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5yZWFkCQk9IHVzYnRtY19yZWFkLAogCS53cml0ZQkJPSB1c2J0bWNfd3JpdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCmluZGV4IDMzMzUxMzEuLmExOGUzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnCkBAIC0yMjMsNiArMjIzLDcgQEAKIGNvbmZpZyBVU0JfR0FER0VUX1BYQTI1WAogCWJvb2xlYW4gIlBYQSAyNXggb3IgSVhQIDR4eCIKIAlkZXBlbmRzIG9uIChBUkNIX1BYQSAmJiBQWEEyNXgpIHx8IEFSQ0hfSVhQNFhYCisJc2VsZWN0IFVTQl9PVEdfVVRJTFMKIAloZWxwCiAJICAgSW50ZWwncyBQWEEgMjV4IHNlcmllcyBYU2NhbGUgQVJNLTVURSBwcm9jZXNzb3JzIGluY2x1ZGUKIAkgICBhbiBpbnRlZ3JhdGVkIGZ1bGwgc3BlZWQgVVNCIDEuMSBkZXZpY2UgY29udHJvbGxlci4gIFRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwppbmRleCBmMzdkZTI4Li4xNjdjYjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwpAQCAtNjEsMTEgKzYxLDYgQEAKICAqIHNpbXBsZXIsIE1pY3Jvc29mdCBwdXNoZXMgdGhlaXIgb3duIGFwcHJvYWNoOiBSTkRJUy4gIFRoZSBwdWJsaXNoZWQKICAqIFJORElTIHNwZWNzIGFyZSBhbWJpZ3VvdXMgYW5kIGFwcGVhciB0byBiZSBpbmNvbXBsZXRlLCBhbmQgYXJlIGFsc28KICAqIG5lZWRsZXNzbHkgY29tcGxleC4gIFRoZXkgYm9ycm93IG1vcmUgZnJvbSBDREMgQUNNIHRoYW4gQ0RDIEVDTS4KLSAqCi0gKiBXaGlsZSBDREMgRUNNLCBDREMgU3Vic2V0LCBhbmQgUk5ESVMgYXJlIGRlc2lnbmVkIHRvIGV4dGVuZCB0aGUgZXRoZXJuZXQKLSAqIGludGVyZmFjZSB0byB0aGUgdGFyZ2V0LCBDREMgRUVNIHdhcyBkZXNpZ25lZCB0byB1c2UgZXRoZXJuZXQgb3ZlciB0aGUgVVNCCi0gKiBsaW5rIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRhcmdldC4gIENEQyBFRU0gaXMgaW1wbGVtZW50ZWQgYXMgYW4gYWx0ZXJuYXRpdmUKLSAqIHRvIHRob3NlIG90aGVyIHByb3RvY29scyB3aGVuIHRoYXQgY29tbXVuaWNhdGlvbiBtb2RlbCBpcyBtb3JlIGFwcHJvcHJpYXRlCiAgKi8KIAogI2RlZmluZSBEUklWRVJfREVTQwkJIkV0aGVybmV0IEdhZGdldCIKQEAgLTE1Nyw4ICsxNTIsOCBAQAogI2RlZmluZSBSTkRJU19QUk9EVUNUX05VTQkweGE0YTIJLyogRXRoZXJuZXQvUk5ESVMgR2FkZ2V0ICovCiAKIC8qIEZvciBFRU0gZ2FkZ2V0cyAqLwotI2RlZmluZSBFRU1fVkVORE9SX05VTQkweDA1MjUJLyogSU5WQUxJRCAtIE5FRURTIFRPIEJFIEFMTE9DQVRFRCAqLwotI2RlZmluZSBFRU1fUFJPRFVDVF9OVU0JMHhhNGExCS8qIElOVkFMSUQgLSBORUVEUyBUTyBCRSBBTExPQ0FURUQgKi8KKyNkZWZpbmUgRUVNX1ZFTkRPUl9OVU0JCTB4MWQ2YgkvKiBMaW51eCBGb3VuZGF0aW9uICovCisjZGVmaW5lIEVFTV9QUk9EVUNUX05VTQkJMHgwMTAyCS8qIEVFTSBHYWRnZXQgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbG9vcGJhY2suYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2xvb3BiYWNrLmMKaW5kZXggZWI2ZGRmYy4uNmNiMjlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbG9vcGJhY2suYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9sb29wYmFjay5jCkBAIC0yMiw3ICsyMiw2IEBACiAvKiAjZGVmaW5lIFZFUkJPU0VfREVCVUcgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogI2luY2x1ZGUgImdfemVyby5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfb2JleC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfb2JleC5jCmluZGV4IDQ2ZDYyNjYuLmI0YTNiYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX29iZXguYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9vYmV4LmMKQEAgLTI0LDcgKzI0LDYgQEAKIC8qICNkZWZpbmUgVkVSQk9TRV9ERUJVRyAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAjaW5jbHVkZSAidV9zZXJpYWwuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NvdXJjZXNpbmsuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NvdXJjZXNpbmsuYwppbmRleCBiZmZlOTFkLi4wOWNiYTI3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc291cmNlc2luay5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NvdXJjZXNpbmsuYwpAQCAtMjIsNyArMjIsNiBAQAogLyogI2RlZmluZSBWRVJCT1NFX0RFQlVHICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNpbmNsdWRlICJnX3plcm8uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdWRjX2NvcmUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdWRjX2NvcmUuYwppbmRleCA0MmE3NGI4Li5mYTNkMTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VkY19jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91ZGNfY29yZS5jCkBAIC0yMTM5LDcgKzIxMzksNyBAQAogc3RhdGljIHZvaWQgZnNsX3VkY19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAljb21wbGV0ZSh1ZGNfY29udHJvbGxlci0+ZG9uZSk7Ci0JZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCB1ZGNfY29udHJvbGxlci0+ZXBfcWhfc2l6ZSwKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYtPnBhcmVudCwgdWRjX2NvbnRyb2xsZXItPmVwX3FoX3NpemUsCiAJCQl1ZGNfY29udHJvbGxlci0+ZXBfcWgsIHVkY19jb250cm9sbGVyLT5lcF9xaF9kbWEpOwogCWtmcmVlKHVkY19jb250cm9sbGVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jCmluZGV4IGM1MmE2ODEuLjAxZWUwYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lteF91ZGMuYwpAQCAtMTQwMiw3ICsxNDAyLDggQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCWludCByZXQgPSAwOwotCWludCBpLCByZXNfc2l6ZTsKKwlpbnQgaTsKKwlyZXNvdXJjZV9zaXplX3QgcmVzX3NpemU7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcmVzKSB7CkBAIC0xNDE2LDcgKzE0MTcsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyZXNfc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcmVzX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzX3NpemUsIHJlcy0+bmFtZSkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgJWQgYnl0ZXMgYXQgJWQgYWRkcmVzc1xuIiwKIAkJCXJlc19zaXplLCByZXMtPnN0YXJ0KTsKQEAgLTE1MjcsOCArMTUyOCw3IEBACiAJY2xrX2Rpc2FibGUoaW14X3VzYi0+Y2xrKTsKIAlpb3VubWFwKGlteF91c2ItPmJhc2UpOwogCi0JcmVsZWFzZV9tZW1fcmVnaW9uKGlteF91c2ItPnJlcy0+c3RhcnQsCi0JCWlteF91c2ItPnJlcy0+ZW5kIC0gaW14X3VzYi0+cmVzLT5zdGFydCArIDEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpbXhfdXNiLT5yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlteF91c2ItPnJlcykpOwogCiAJaWYgKHBkYXRhLT5leGl0KQogCQlwZGF0YS0+ZXhpdCgmcGRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKaW5kZXggYzQ0MzY3Zi4uYmYwZjY1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMKaW5kZXggMjk1MDAxNS4uMmQ4NjdmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHJpbnRlci5jCkBAIC04NzUsNyArODc1LDcgQEAKIH0KIAogLyogdXNlZCBhZnRlciBlbmRwb2ludCBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcmludGVyX2lvX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcmludGVyX2lvX29wZXJhdGlvbnMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLm9wZW4gPQkJcHJpbnRlcl9vcGVuLAogCS5yZWFkID0JCXByaW50ZXJfcmVhZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9yOGE2NjU5Ny11ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9yOGE2NjU5Ny11ZGMuaAppbmRleCAwMzA4N2U3Li45YTUzN2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcjhhNjY1OTctdWRjLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3I4YTY2NTk3LXVkYy5oCkBAIC0xMzEsMzEgKzEzMSw0OCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcjhhNjY1OTdfcmVhZF9maWZvKHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHUxNiAqYnVmLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKIAkJCQkgICAgICBpbnQgbGVuKQogeworCXVuc2lnbmVkIGxvbmcgZmlmb2FkZHIgPSByOGE2NjU5Ny0+cmVnICsgb2Zmc2V0OworCXVuc2lnbmVkIGludCBkYXRhOworCWludCBpOworCiAJaWYgKHI4YTY2NTk3LT5wZGF0YS0+b25fY2hpcCkgewotCQl1bnNpZ25lZCBsb25nIGZpZm9hZGRyID0gcjhhNjY1OTctPnJlZyArIG9mZnNldDsKLQkJdW5zaWduZWQgbG9uZyBjb3VudDsKLQkJdW5pb24gewotCQkJdW5zaWduZWQgbG9uZyBkd29yZDsKLQkJCXVuc2lnbmVkIGNoYXIgYnl0ZVs0XTsKLQkJfSBkYXRhOwotCQl1bnNpZ25lZCBjaGFyICpwYjsKLQkJaW50IGk7CisJCS8qIDMyLWJpdCBhY2Nlc3NlcyBmb3Igb25fY2hpcCBjb250cm9sbGVycyAqLwogCi0JCWNvdW50ID0gbGVuIC8gNDsKLQkJaW5zbChmaWZvYWRkciwgYnVmLCBjb3VudCk7CisJCS8qIGFsaWduZWQgYnVmIGNhc2UgKi8KKwkJaWYgKGxlbiA+PSA0ICYmICEoKHVuc2lnbmVkIGxvbmcpYnVmICYgMHgwMykpIHsKKwkJCWluc2woZmlmb2FkZHIsIGJ1ZiwgbGVuIC8gNCk7CisJCQlidWYgKz0gbGVuICYgfjB4MDM7CisJCQlsZW4gJj0gMHgwMzsKKwkJfQogCi0JCWlmIChsZW4gJiAweDAwMDAwMDAzKSB7Ci0JCQlkYXRhLmR3b3JkID0gaW5sKGZpZm9hZGRyKTsKLQkJCXBiID0gKHVuc2lnbmVkIGNoYXIgKilidWYgKyBjb3VudCAqIDQ7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKGxlbiAmIDB4MDAwMDAwMDMpOyBpKyspCi0JCQkJcGJbaV0gPSBkYXRhLmJ5dGVbaV07CisJCS8qIHVuYWxpZ25lZCBidWYgY2FzZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWlmICghKGkgJiAweDAzKSkKKwkJCQlkYXRhID0gaW5sKGZpZm9hZGRyKTsKKworCQkJYnVmW2ldID0gKGRhdGEgPj4gKChpICYgMHgwMykgKiA4KSkgJiAweGZmOwogCQl9CiAJfSBlbHNlIHsKLQkJbGVuID0gKGxlbiArIDEpIC8gMjsKLQkJaW5zdyhyOGE2NjU5Ny0+cmVnICsgb2Zmc2V0LCBidWYsIGxlbik7CisJCS8qIDE2LWJpdCBhY2Nlc3NlcyBmb3IgZXh0ZXJuYWwgY29udHJvbGxlcnMgKi8KKworCQkvKiBhbGlnbmVkIGJ1ZiBjYXNlICovCisJCWlmIChsZW4gPj0gMiAmJiAhKCh1bnNpZ25lZCBsb25nKWJ1ZiAmIDB4MDEpKSB7CisJCQlpbnN3KGZpZm9hZGRyLCBidWYsIGxlbiAvIDIpOworCQkJYnVmICs9IGxlbiAmIH4weDAxOworCQkJbGVuICY9IDB4MDE7CisJCX0KKworCQkvKiB1bmFsaWduZWQgYnVmIGNhc2UgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlpZiAoIShpICYgMHgwMSkpCisJCQkJZGF0YSA9IGludyhmaWZvYWRkcik7CisKKwkJCWJ1ZltpXSA9IChkYXRhID4+ICgoaSAmIDB4MDEpICogOCkpICYgMHhmZjsKKwkJfQogCX0KIH0KIApAQCAtMTY2LDM4ICsxODMsNDAgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHI4YTY2NTk3X3dyaXRlX2ZpZm8oc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NywKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHUxNiAqYnVmLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLAogCQkJCSAgICAgICBpbnQgbGVuKQogewogCXVuc2lnbmVkIGxvbmcgZmlmb2FkZHIgPSByOGE2NjU5Ny0+cmVnICsgb2Zmc2V0OworCWludCBhZGogPSAwOworCWludCBpOwogCiAJaWYgKHI4YTY2NTk3LT5wZGF0YS0+b25fY2hpcCkgewotCQl1bnNpZ25lZCBsb25nIGNvdW50OwotCQl1bnNpZ25lZCBjaGFyICpwYjsKLQkJaW50IGk7Ci0KLQkJY291bnQgPSBsZW4gLyA0OwotCQlvdXRzbChmaWZvYWRkciwgYnVmLCBjb3VudCk7Ci0KLQkJaWYgKGxlbiAmIDB4MDAwMDAwMDMpIHsKLQkJCXBiID0gKHVuc2lnbmVkIGNoYXIgKilidWYgKyBjb3VudCAqIDQ7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKGxlbiAmIDB4MDAwMDAwMDMpOyBpKyspIHsKLQkJCQlpZiAocjhhNjY1OTdfcmVhZChyOGE2NjU5NywgQ0ZJRk9TRUwpICYgQklHRU5EKQotCQkJCQlvdXRiKHBiW2ldLCBmaWZvYWRkciArIGkpOwotCQkJCWVsc2UKLQkJCQkJb3V0YihwYltpXSwgZmlmb2FkZHIgKyAzIC0gaSk7Ci0JCQl9CisJCS8qIDMyLWJpdCBhY2Nlc3Mgb25seSBpZiBidWYgaXMgMzItYml0IGFsaWduZWQgKi8KKwkJaWYgKGxlbiA+PSA0ICYmICEoKHVuc2lnbmVkIGxvbmcpYnVmICYgMHgwMykpIHsKKwkJCW91dHNsKGZpZm9hZGRyLCBidWYsIGxlbiAvIDQpOworCQkJYnVmICs9IGxlbiAmIH4weDAzOworCQkJbGVuICY9IDB4MDM7CiAJCX0KIAl9IGVsc2UgewotCQlpbnQgb2RkID0gbGVuICYgMHgwMDAxOwotCi0JCWxlbiA9IGxlbiAvIDI7Ci0JCW91dHN3KGZpZm9hZGRyLCBidWYsIGxlbik7Ci0JCWlmICh1bmxpa2VseShvZGQpKSB7Ci0JCQlidWYgPSAmYnVmW2xlbl07Ci0JCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSpidWYsIGZpZm9hZGRyKTsKKwkJLyogMTYtYml0IGFjY2VzcyBvbmx5IGlmIGJ1ZiBpcyAxNi1iaXQgYWxpZ25lZCAqLworCQlpZiAobGVuID49IDIgJiYgISgodW5zaWduZWQgbG9uZylidWYgJiAweDAxKSkgeworCQkJb3V0c3coZmlmb2FkZHIsIGJ1ZiwgbGVuIC8gMik7CisJCQlidWYgKz0gbGVuICYgfjB4MDE7CisJCQlsZW4gJj0gMHgwMTsKIAkJfQogCX0KKworCS8qIGFkanVzdCBmaWZvIGFkZHJlc3MgaW4gdGhlIGxpdHRsZSBlbmRpYW4gY2FzZSAqLworCWlmICghKHI4YTY2NTk3X3JlYWQocjhhNjY1OTcsIENGSUZPU0VMKSAmIEJJR0VORCkpIHsKKwkJaWYgKHI4YTY2NTk3LT5wZGF0YS0+b25fY2hpcCkKKwkJCWFkaiA9IDB4MDM7IC8qIDMyLWJpdCB3aWRlICovCisJCWVsc2UKKwkJCWFkaiA9IDB4MDE7IC8qIDE2LWJpdCB3aWRlICovCisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlvdXRiKGJ1ZltpXSwgZmlmb2FkZHIgKyBhZGogLSAoaSAmIGFkaikpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcjhhNjY1OTdfbWRmeShzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfYXVkaW8uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2F1ZGlvLmMKaW5kZXggYjUyMDBkNS4uODI1MjU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfYXVkaW8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9hdWRpby5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwppbmRleCBmODc1MWZmLi4yZmMwMmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKQEAgLTIzLDcgKzIzLDYgQEAKIC8qICNkZWZpbmUgVkVSQk9TRV9ERUJVRyAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKaW5kZXggM2VhMDU5My4uYjI1Y2RlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKQEAgLTE0MDAsNiArMTQwMCwxMCBAQAogCQlnb3RvIGZhaWw7CiAJfQogCisJcGVyaW9kID0gdXJiLT5pbnRlcnZhbDsKKwlpZiAoIXN0cmVhbS0+aGlnaHNwZWVkKQorCQlwZXJpb2QgPDw9IDM7CisKIAlub3cgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5mcmFtZV9pbmRleCkgJSBtb2Q7CiAKIAkvKiB3aGVuJ3MgdGhlIGxhc3QgdWZyYW1lIHRoaXMgdXJiIGNvdWxkIHN0YXJ0PyAqLwpAQCAtMTQxNywxNCArMTQyMSwxNSBAQAogCiAJCS8qIEZlbGwgYmVoaW5kIChieSB1cCB0byB0d2ljZSB0aGUgc2xvcCBhbW91bnQpPyAqLwogCQlpZiAoc3RhcnQgPj0gbWF4IC0gMiAqIDggKiBTQ0hFRFVMRV9TTE9QKQotCQkJc3RhcnQgKz0gc3RyZWFtLT5pbnRlcnZhbCAqIERJVl9ST1VORF9VUCgKLQkJCQkJbWF4IC0gc3RhcnQsIHN0cmVhbS0+aW50ZXJ2YWwpIC0gbW9kOworCQkJc3RhcnQgKz0gcGVyaW9kICogRElWX1JPVU5EX1VQKAorCQkJCQltYXggLSBzdGFydCwgcGVyaW9kKSAtIG1vZDsKIAogCQkvKiBUcmllZCB0byBzY2hlZHVsZSB0b28gZmFyIGludG8gdGhlIGZ1dHVyZT8gKi8KIAkJaWYgKHVubGlrZWx5KChzdGFydCArIHNjaGVkLT5zcGFuKSA+PSBtYXgpKSB7CiAJCQlzdGF0dXMgPSAtRUZCSUc7CiAJCQlnb3RvIGZhaWw7CiAJCX0KKwkJc3RyZWFtLT5uZXh0X3VmcmFtZSA9IHN0YXJ0OwogCQlnb3RvIHJlYWR5OwogCX0KIApAQCAtMTQ0MCwxMCArMTQ0NSw2IEBACiAKIAkvKiBOT1RFOiAgYXNzdW1lcyBVUkJfSVNPX0FTQVAsIHRvIGxpbWl0IGNvbXBsZXhpdHkvYnVncyAqLwogCi0JcGVyaW9kID0gdXJiLT5pbnRlcnZhbDsKLQlpZiAoIXN0cmVhbS0+aGlnaHNwZWVkKQotCQlwZXJpb2QgPDw9IDM7Ci0KIAkvKiBmaW5kIGEgdWZyYW1lIHNsb3Qgd2l0aCBlbm91Z2ggYmFuZHdpZHRoICovCiAJZm9yICg7IHN0YXJ0IDwgKHN0cmVhbS0+bmV4dF91ZnJhbWUgKyBwZXJpb2QpOyBzdGFydCsrKSB7CiAJCWludAkJZW5vdWdoX3NwYWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLWhjZC5jCmluZGV4IGUzNWQ4MjguLjVjNzc0YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTM2Mi1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDEzNjItaGNkLmMKQEAgLTIyODQsMTAgKzIyODQsMTAgQEAKIAlkZXZfaW5mbyhoY2QtPnNlbGYuY29udHJvbGxlciwgIklTUDEzNjIgTWVtb3J5IHVzYWdlOlxuIik7CiAJZGV2X2luZm8oaGNkLT5zZWxmLmNvbnRyb2xsZXIsICIgIElTVEw6ICAgIDIgKiAlNGQ6ICAgICAlNGQgQCAkJTA0eDokJTA0eFxuIiwKIAkJIGlzdGxfc2l6ZSAvIDIsIGlzdGxfc2l6ZSwgMCwgaXN0bF9zaXplIC8gMik7Ci0JZGV2X2luZm8oaGNkLT5zZWxmLmNvbnRyb2xsZXIsICIgIElOVEw6ICU0ZCAqICglM3UrOCk6ICAlNGQgQCAkJTA0eFxuIiwKKwlkZXZfaW5mbyhoY2QtPnNlbGYuY29udHJvbGxlciwgIiAgSU5UTDogJTRkICogKCUzbHUrOCk6ICAlNGQgQCAkJTA0eFxuIiwKIAkJIElTUDEzNjJfSU5UTF9CVUZGRVJTLCBpbnRsX2Jsa3NpemUgLSBQVERfSEVBREVSX1NJWkUsCiAJCSBpbnRsX3NpemUsIGlzdGxfc2l6ZSk7Ci0JZGV2X2luZm8oaGNkLT5zZWxmLmNvbnRyb2xsZXIsICIgIEFUTCA6ICU0ZCAqICglM3UrOCk6ICAlNGQgQCAkJTA0eFxuIiwKKwlkZXZfaW5mbyhoY2QtPnNlbGYuY29udHJvbGxlciwgIiAgQVRMIDogJTRkICogKCUzbHUrOCk6ICAlNGQgQCAkJTA0eFxuIiwKIAkJIGF0bF9idWZmZXJzLCBhdGxfYmxrc2l6ZSAtIFBURF9IRUFERVJfU0laRSwKIAkJIGF0bF9zaXplLCBpc3RsX3NpemUgKyBpbnRsX3NpemUpOwogCWRldl9pbmZvKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiICBVU0VEL0ZSRUU6ICAgJTRkICAgICAgJTRkXG4iLCB0b3RhbCwKQEAgLTI2NzcsMTIgKzI2NzcsMTIgQEAKIAlEQkcoMCwgIiVzOiBSZW1vdmluZyBIQ0RcbiIsIF9fZnVuY19fKTsKIAl1c2JfcmVtb3ZlX2hjZChoY2QpOwogCi0JREJHKDAsICIlczogVW5tYXBwaW5nIGRhdGFfcmVnIEAgJTA4eFxuIiwgX19mdW5jX18sCi0JICAgICh1MzIpaXNwMTM2Ml9oY2QtPmRhdGFfcmVnKTsKKwlEQkcoMCwgIiVzOiBVbm1hcHBpbmcgZGF0YV9yZWcgQCAlcFxuIiwgX19mdW5jX18sCisJICAgIGlzcDEzNjJfaGNkLT5kYXRhX3JlZyk7CiAJaW91bm1hcChpc3AxMzYyX2hjZC0+ZGF0YV9yZWcpOwogCi0JREJHKDAsICIlczogVW5tYXBwaW5nIGFkZHJfcmVnIEAgJTA4eFxuIiwgX19mdW5jX18sCi0JICAgICh1MzIpaXNwMTM2Ml9oY2QtPmFkZHJfcmVnKTsKKwlEQkcoMCwgIiVzOiBVbm1hcHBpbmcgYWRkcl9yZWcgQCAlcFxuIiwgX19mdW5jX18sCisJICAgIGlzcDEzNjJfaGNkLT5hZGRyX3JlZyk7CiAJaW91bm1hcChpc3AxMzYyX2hjZC0+YWRkcl9yZWcpOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKQEAgLTI4MTAsMTYgKzI4MTAsMTYgQEAKIAlyZXR1cm4gMDsKIAogIGVycjY6Ci0JREJHKDAsICIlczogRnJlZWluZyBkZXYgJTA4eFxuIiwgX19mdW5jX18sICh1MzIpaXNwMTM2Ml9oY2QpOworCURCRygwLCAiJXM6IEZyZWVpbmcgZGV2ICVwXG4iLCBfX2Z1bmNfXywgaXNwMTM2Ml9oY2QpOwogCXVzYl9wdXRfaGNkKGhjZCk7CiAgZXJyNToKLQlEQkcoMCwgIiVzOiBVbm1hcHBpbmcgZGF0YV9yZWcgQCAlMDh4XG4iLCBfX2Z1bmNfXywgKHUzMilkYXRhX3JlZyk7CisJREJHKDAsICIlczogVW5tYXBwaW5nIGRhdGFfcmVnIEAgJXBcbiIsIF9fZnVuY19fLCBkYXRhX3JlZyk7CiAJaW91bm1hcChkYXRhX3JlZyk7CiAgZXJyNDoKIAlEQkcoMCwgIiVzOiBSZWxlYXNpbmcgbWVtIHJlZ2lvbiAlMDhseFxuIiwgX19mdW5jX18sIChsb25nIHVuc2lnbmVkIGludClkYXRhLT5zdGFydCk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGRhdGEtPnN0YXJ0LCByZXNvdXJjZV9sZW4oZGF0YSkpOwogIGVycjM6Ci0JREJHKDAsICIlczogVW5tYXBwaW5nIGFkZHJfcmVnIEAgJTA4eFxuIiwgX19mdW5jX18sICh1MzIpYWRkcl9yZWcpOworCURCRygwLCAiJXM6IFVubWFwcGluZyBhZGRyX3JlZyBAICVwXG4iLCBfX2Z1bmNfXywgYWRkcl9yZWcpOwogCWlvdW5tYXAoYWRkcl9yZWcpOwogIGVycjI6CiAJREJHKDAsICIlczogUmVsZWFzaW5nIG1lbSByZWdpb24gJTA4bHhcbiIsIF9fZnVuY19fLCAobG9uZyB1bnNpZ25lZCBpbnQpYWRkci0+c3RhcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLmggYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDEzNjIuaAppbmRleCBmZTYwZjYyLi4xYTI1M2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDEzNjIuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDEzNjIuaApAQCAtNTgwLDcgKzU4MCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBBTElHTlNUQVQoc3RydWN0IGlzcDEzNjJfaGNkICppc3AxMzYyX2hjZCwgdm9pZCAqcHRyKQogewotCXVuc2lnbmVkIHAgPSAodW5zaWduZWQpcHRyOworCXVuc2lnbmVkIGxvbmcgcCA9ICh1bnNpZ25lZCBsb25nKXB0cjsKIAlpZiAoIShwICYgMHhmKSkKIAkJaXNwMTM2Ml9oY2QtPnN0YXQxNisrOwogCWVsc2UgaWYgKCEocCAmIDB4NykpCkBAIC03NzAsNyArNzcwLDcgQEAKIAlpZiAoIWxlbikKIAkJcmV0dXJuOwogCi0JaWYgKCh1bnNpZ25lZClkcCAmIDB4MSkgeworCWlmICgodW5zaWduZWQgbG9uZylkcCAmIDB4MSkgewogCQkvKiBub3QgYWxpZ25lZCAqLwogCQlmb3IgKDsgbGVuID4gMTsgbGVuIC09IDIpIHsKIAkJCWRhdGEgPSAqZHArKzsKQEAgLTk2Miw4ICs5NjIsOCBAQAogCiAJaXNwMTM2Ml93cml0ZV9kaXJhZGRyKGlzcDEzNjJfaGNkLCBvZmZzZXQsIGxlbik7CiAKLQlEQkcoMywgIiVzOiBSZWFkaW5nICVkIGJ5dGUgZnJvbSBidWZmZXIgQCUwNHggdG8gbWVtb3J5IEAgJTA4eFxuIiwgX19mdW5jX18sCi0JICAgIGxlbiwgb2Zmc2V0LCAodTMyKWJ1Zik7CisJREJHKDMsICIlczogUmVhZGluZyAlZCBieXRlIGZyb20gYnVmZmVyIEAlMDR4IHRvIG1lbW9yeSBAICVwXG4iLAorCSAgICBfX2Z1bmNfXywgbGVuLCBvZmZzZXQsIGJ1Zik7CiAKIAlpc3AxMzYyX3dyaXRlX3JlZzE2KGlzcDEzNjJfaGNkLCBIQ3VQSU5ULCBIQ3VQSU5UX0VPVCk7CiAJX1dBUk5fT04oKGlzcDEzNjJfcmVhZF9yZWcxNihpc3AxMzYyX2hjZCwgSEN1UElOVCkgJiBIQ3VQSU5UX0VPVCkpOwpAQCAtOTgyLDggKzk4Miw4IEBACiAKIAlpc3AxMzYyX3dyaXRlX2RpcmFkZHIoaXNwMTM2Ml9oY2QsIG9mZnNldCwgbGVuKTsKIAotCURCRygzLCAiJXM6IFdyaXRpbmcgJWQgYnl0ZSB0byBidWZmZXIgQCUwNHggZnJvbSBtZW1vcnkgQCAlMDh4XG4iLCBfX2Z1bmNfXywKLQkgICAgbGVuLCBvZmZzZXQsICh1MzIpYnVmKTsKKwlEQkcoMywgIiVzOiBXcml0aW5nICVkIGJ5dGUgdG8gYnVmZmVyIEAlMDR4IGZyb20gbWVtb3J5IEAgJXBcbiIsCisJICAgIF9fZnVuY19fLCBsZW4sIG9mZnNldCwgYnVmKTsKIAogCWlzcDEzNjJfd3JpdGVfcmVnMTYoaXNwMTM2Ml9oY2QsIEhDdVBJTlQsIEhDdVBJTlRfRU9UKTsKIAlfV0FSTl9PTigoaXNwMTM2Ml9yZWFkX3JlZzE2KGlzcDEzNjJfaGNkLCBIQ3VQSU5UKSAmIEhDdVBJTlRfRU9UKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKaW5kZXggYjUyOTRhOS4uZjFjMDYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYwpAQCAtNDgxLDM4ICs0ODEsNDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmCUNPTkZJR19QTQotc3RhdGljIGludCBvaGNpX2hjZF9weGEyN3hfZHJ2X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBvaGNpX2hjZF9weGEyN3hfZHJ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHB4YTI3eF9vaGNpICpvaGNpID0gdG9fcHhhMjd4X29oY2koaGNkKTsKIAogCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBvaGNpLT5vaGNpLm5leHRfc3RhdGVjaGFuZ2UpKQogCQltc2xlZXAoNSk7CiAJb2hjaS0+b2hjaS5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllczsKIAotCXB4YTI3eF9zdG9wX2hjKG9oY2ksICZwZGV2LT5kZXYpOworCXB4YTI3eF9zdG9wX2hjKG9oY2ksIGRldik7CiAJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9oY2lfaGNkX3B4YTI3eF9kcnZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IG9oY2lfaGNkX3B4YTI3eF9kcnZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBweGEyN3hfb2hjaSAqb2hjaSA9IHRvX3B4YTI3eF9vaGNpKGhjZCk7CisJc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSAqaW5mID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwogCWludCBzdGF0dXM7CiAKIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgb2hjaS0+b2hjaS5uZXh0X3N0YXRlY2hhbmdlKSkKIAkJbXNsZWVwKDUpOwogCW9oY2ktPm9oY2kubmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXM7CiAKLQlpZiAoKHN0YXR1cyA9IHB4YTI3eF9zdGFydF9oYyhvaGNpLCAmcGRldi0+ZGV2KSkgPCAwKQorCWlmICgoc3RhdHVzID0gcHhhMjd4X3N0YXJ0X2hjKG9oY2ksIGRldikpIDwgMCkKIAkJcmV0dXJuIHN0YXR1czsKIAorCS8qIFNlbGVjdCBQb3dlciBNYW5hZ2VtZW50IE1vZGUgKi8KKwlweGEyN3hfb2hjaV9zZWxlY3RfcG1tKG9oY2ksIGluZi0+cG9ydF9tb2RlKTsKKwogCW9oY2lfZmluaXNoX2NvbnRyb2xsZXJfcmVzdW1lKGhjZCk7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBvaGNpX2hjZF9weGEyN3hfcG1fb3BzID0geworCS5zdXNwZW5kCT0gb2hjaV9oY2RfcHhhMjd4X2Rydl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gb2hjaV9oY2RfcHhhMjd4X2Rydl9yZXN1bWUsCit9OwogI2VuZGlmCiAKIC8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwpAQCAtNTIyLDEzICs1MzEsMTIgQEAKIAkucHJvYmUJCT0gb2hjaV9oY2RfcHhhMjd4X2Rydl9wcm9iZSwKIAkucmVtb3ZlCQk9IG9oY2lfaGNkX3B4YTI3eF9kcnZfcmVtb3ZlLAogCS5zaHV0ZG93bgk9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBvaGNpX2hjZF9weGEyN3hfZHJ2X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBvaGNpX2hjZF9weGEyN3hfZHJ2X3Jlc3VtZSwKLSNlbmRpZgogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJweGEyN3gtb2hjaSIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmb2hjaV9oY2RfcHhhMjd4X3BtX29wcywKKyNlbmRpZgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCmluZGV4IDIzY2YzYmQuLjgzYjVmOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCkBAIC00NzUsNCArNDc1LDQgQEAKIAllbHNlIGlmIChwZGV2LT5jbGFzcyA9PSBQQ0lfQ0xBU1NfU0VSSUFMX1VTQl9YSENJKQogCQlxdWlya191c2JfaGFuZG9mZl94aGNpKHBkZXYpOwogfQotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHF1aXJrX3VzYl9lYXJseV9oYW5kb2ZmKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHF1aXJrX3VzYl9lYXJseV9oYW5kb2ZmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCmluZGV4IDc0OWI1MzcuLmUzM2QzNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYwpAQCAtMTAwMywxOSArMTAwMywyMCBAQAogCWlmIChzeXNzdHMgPT0gU0UwKSB7CiAJCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCB+QVRUQ0gsIGdldF9pbnRzdHNfcmVnKHBvcnQpKTsKIAkJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgQVRUQ0hFLCBnZXRfaW50ZW5iX3JlZyhwb3J0KSk7Ci0JCXJldHVybjsKKwl9IGVsc2UgeworCQlpZiAoc3lzc3RzID09IEZTX0pTVFMpCisJCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBIU0UsIGdldF9zeXNjZmdfcmVnKHBvcnQpKTsKKwkJZWxzZSBpZiAoc3lzc3RzID09IExTX0pTVFMpCisJCQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBIU0UsIGdldF9zeXNjZmdfcmVnKHBvcnQpKTsKKworCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgfkRUQ0gsIGdldF9pbnRzdHNfcmVnKHBvcnQpKTsKKwkJcjhhNjY1OTdfYnNldChyOGE2NjU5NywgRFRDSEUsIGdldF9pbnRlbmJfcmVnKHBvcnQpKTsKKworCQlpZiAocjhhNjY1OTctPmJ1c19zdXNwZW5kZWQpCisJCQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihyOGE2NjU5N190b19oY2QocjhhNjY1OTcpKTsKIAl9CiAKLQlpZiAoc3lzc3RzID09IEZTX0pTVFMpCi0JCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEhTRSwgZ2V0X3N5c2NmZ19yZWcocG9ydCkpOwotCWVsc2UgaWYgKHN5c3N0cyA9PSBMU19KU1RTKQotCQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBIU0UsIGdldF9zeXNjZmdfcmVnKHBvcnQpKTsKLQotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCB+RFRDSCwgZ2V0X2ludHN0c19yZWcocG9ydCkpOwotCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIERUQ0hFLCBnZXRfaW50ZW5iX3JlZyhwb3J0KSk7Ci0KLQlpZiAocjhhNjY1OTctPmJ1c19zdXNwZW5kZWQpCi0JCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKHI4YTY2NTk3X3RvX2hjZChyOGE2NjU5NykpOworCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMocjhhNjY1OTdfdG9faGNkKHI4YTY2NTk3KSk7CiB9CiAKIC8qIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHQgZGlzYWJsZWQgKi8KQEAgLTEwMjQsNiArMTAyNSw4IEBACiAJdTE2IHNwZWVkID0gZ2V0X3JoX3VzYl9zcGVlZChyOGE2NjU5NywgcG9ydCk7CiAJc3RydWN0IHI4YTY2NTk3X3Jvb3RfaHViICpyaCA9ICZyOGE2NjU5Ny0+cm9vdF9odWJbcG9ydF07CiAKKwlyaC0+cG9ydCAmPSB+KCgxIDw8IFVTQl9QT1JUX0ZFQVRfSElHSFNQRUVEKSB8CisJCSAgICAgICgxIDw8IFVTQl9QT1JUX0ZFQVRfTE9XU1BFRUQpKTsKIAlpZiAoc3BlZWQgPT0gSFNNT0RFKQogCQlyaC0+cG9ydCB8PSAoMSA8PCBVU0JfUE9SVF9GRUFUX0hJR0hTUEVFRCk7CiAJZWxzZSBpZiAoc3BlZWQgPT0gTFNNT0RFKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2FzbC5jIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL2FzbC5jCmluZGV4IGM2MzI0MzcuLjU2MmViYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9hc2wuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvYXNsLmMKQEAgLTExNSw2ICsxMTUsMTAgQEAKIAkJaWYgKHN0YXR1cyAmIFFURF9TVFNfSEFMVEVEKSB7CiAJCQkvKiBVZywgYW4gZXJyb3IuICovCiAJCQlwcm9jZXNzX2hhbHRlZF9xdGQod2hjLCBxc2V0LCB0ZCk7CisJCQkvKiBBIGhhbHRlZCBxVEQgYWx3YXlzIHRyaWdnZXJzIGFuIHVwZGF0ZQorCQkJICAgYmVjYXVzZSB0aGUgcXNldCB3YXMgZWl0aGVyIHJlbW92ZWQgb3IKKwkJCSAgIHJlYWN0aXZhdGVkLiAqLworCQkJdXBkYXRlIHw9IFdIQ19VUERBVEVfVVBEQVRFRDsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCkBAIC0zMDUsNiArMzA5LDcgQEAKIAlzdHJ1Y3Qgd2hjX3VyYiAqd3VyYiA9IHVyYi0+aGNwcml2OwogCXN0cnVjdCB3aGNfcXNldCAqcXNldCA9IHd1cmItPnFzZXQ7CiAJc3RydWN0IHdoY19zdGQgKnN0ZCwgKnQ7CisJYm9vbCBoYXNfcXRkID0gZmFsc2U7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zMTUsMTcgKzMyMCwyMSBAQAogCQlnb3RvIG91dDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdGQsIHQsICZxc2V0LT5zdGRzLCBsaXN0X25vZGUpIHsKLQkJaWYgKHN0ZC0+dXJiID09IHVyYikKKwkJaWYgKHN0ZC0+dXJiID09IHVyYikgeworCQkJaWYgKHN0ZC0+cXRkKQorCQkJCWhhc19xdGQgPSB0cnVlOwogCQkJcXNldF9mcmVlX3N0ZCh3aGMsIHN0ZCk7Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlzdGQtPnF0ZCA9IE5VTEw7IC8qIHNvIHRoaXMgc3RkIGlzIHJlLWFkZGVkIHdoZW4gdGhlIHFzZXQgaXMgKi8KIAl9CiAKLQlhc2xfcXNldF9yZW1vdmUod2hjLCBxc2V0KTsKLQl3dXJiLT5zdGF0dXMgPSBzdGF0dXM7Ci0Jd3VyYi0+aXNfYXN5bmMgPSB0cnVlOwotCXF1ZXVlX3dvcmsod2hjLT53b3JrcXVldWUsICZ3dXJiLT5kZXF1ZXVlX3dvcmspOwotCisJaWYgKGhhc19xdGQpIHsKKwkJYXNsX3FzZXRfcmVtb3ZlKHdoYywgcXNldCk7CisJCXd1cmItPnN0YXR1cyA9IHN0YXR1czsKKwkJd3VyYi0+aXNfYXN5bmMgPSB0cnVlOworCQlxdWV1ZV93b3JrKHdoYy0+d29ya3F1ZXVlLCAmd3VyYi0+ZGVxdWV1ZV93b3JrKTsKKwl9IGVsc2UKKwkJcXNldF9yZW1vdmVfdXJiKHdoYywgcXNldCwgdXJiLCBzdGF0dXMpOwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndoYy0+bG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvZGVidWcuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCmluZGV4IGNmMmQ0NTkuLjIyNzNjODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHpsX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGlfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRpX2ZvcHMgPSB7CiAJLm9wZW4gICAgPSBkaV9vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXNsX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhc2xfZm9wcyA9IHsKIAkub3BlbiAgICA9IGFzbF9vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHpsX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwemxfZm9wcyA9IHsKIAkub3BlbiAgICA9IHB6bF9vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvcHpsLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvcHpsLmMKaW5kZXggYTllMDViYS4uMGRiM2ZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL3B6bC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9wemwuYwpAQCAtMTIxLDYgKzEyMSwxMCBAQAogCQlpZiAoc3RhdHVzICYgUVREX1NUU19IQUxURUQpIHsKIAkJCS8qIFVnLCBhbiBlcnJvci4gKi8KIAkJCXByb2Nlc3NfaGFsdGVkX3F0ZCh3aGMsIHFzZXQsIHRkKTsKKwkJCS8qIEEgaGFsdGVkIHFURCBhbHdheXMgdHJpZ2dlcnMgYW4gdXBkYXRlCisJCQkgICBiZWNhdXNlIHRoZSBxc2V0IHdhcyBlaXRoZXIgcmVtb3ZlZCBvcgorCQkJICAgcmVhY3RpdmF0ZWQuICovCisJCQl1cGRhdGUgfD0gV0hDX1VQREFURV9VUERBVEVEOwogCQkJZ290byBkb25lOwogCQl9CiAKQEAgLTMzMyw2ICszMzcsNyBAQAogCXN0cnVjdCB3aGNfdXJiICp3dXJiID0gdXJiLT5oY3ByaXY7CiAJc3RydWN0IHdoY19xc2V0ICpxc2V0ID0gd3VyYi0+cXNldDsKIAlzdHJ1Y3Qgd2hjX3N0ZCAqc3RkLCAqdDsKKwlib29sIGhhc19xdGQgPSBmYWxzZTsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTM0MywxNyArMzQ4LDIyIEBACiAJCWdvdG8gb3V0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN0ZCwgdCwgJnFzZXQtPnN0ZHMsIGxpc3Rfbm9kZSkgewotCQlpZiAoc3RkLT51cmIgPT0gdXJiKQorCQlpZiAoc3RkLT51cmIgPT0gdXJiKSB7CisJCQlpZiAoc3RkLT5xdGQpCisJCQkJaGFzX3F0ZCA9IHRydWU7CiAJCQlxc2V0X2ZyZWVfc3RkKHdoYywgc3RkKTsKLQkJZWxzZQorCQl9IGVsc2UKIAkJCXN0ZC0+cXRkID0gTlVMTDsgLyogc28gdGhpcyBzdGQgaXMgcmUtYWRkZWQgd2hlbiB0aGUgcXNldCBpcyAqLwogCX0KIAotCXB6bF9xc2V0X3JlbW92ZSh3aGMsIHFzZXQpOwotCXd1cmItPnN0YXR1cyA9IHN0YXR1czsKLQl3dXJiLT5pc19hc3luYyA9IGZhbHNlOwotCXF1ZXVlX3dvcmsod2hjLT53b3JrcXVldWUsICZ3dXJiLT5kZXF1ZXVlX3dvcmspOwotCisJaWYgKGhhc19xdGQpIHsKKwkJcHpsX3FzZXRfcmVtb3ZlKHdoYywgcXNldCk7CisJCXVwZGF0ZV9wemxfaHdfdmlldyh3aGMpOworCQl3dXJiLT5zdGF0dXMgPSBzdGF0dXM7CisJCXd1cmItPmlzX2FzeW5jID0gZmFsc2U7CisJCXF1ZXVlX3dvcmsod2hjLT53b3JrcXVldWUsICZ3dXJiLT5kZXF1ZXVlX3dvcmspOworCX0gZWxzZQorCQlxc2V0X3JlbW92ZV91cmIod2hjLCBxc2V0LCB1cmIsIHN0YXR1cyk7CiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2hjLT5sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1oY2QuYwppbmRleCA5OTkxMWU3Li45MzJmOTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWhjZC5jCkBAIC0zMzUsNiArMzM1LDEyIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAl0ZW1wID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKTsKIAl4aGNpX2RiZyh4aGNpLCAib3AgcmVnIHN0YXR1cyA9IDB4JXhcbiIsIHRlbXApOworCWlmICh0ZW1wID09IDB4ZmZmZmZmZmYpIHsKKwkJeGhjaV9kYmcoeGhjaSwgIkhXIGRpZWQsIHBvbGxpbmcgc3RvcHBlZC5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKIAl0ZW1wID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+aXJfc2V0LT5pcnFfcGVuZGluZyk7CiAJeGhjaV9kYmcoeGhjaSwgImlyX3NldCAwIHBlbmRpbmcgPSAweCV4XG4iLCB0ZW1wKTsKIAl4aGNpX2RiZyh4aGNpLCAiTm8tb3AgY29tbWFuZHMgaGFuZGxlZCA9ICVkXG4iLCB4aGNpLT5ub29wc19oYW5kbGVkKTsKQEAgLTc3Niw2ICs3ODIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKKwl1MzIgdGVtcDsKIAlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2k7CiAJc3RydWN0IHhoY2lfdGQgKnRkOwogCXVuc2lnbmVkIGludCBlcF9pbmRleDsKQEAgLTc4OCw2ICs3OTUsMTcgQEAKIAlyZXQgPSB1c2JfaGNkX2NoZWNrX3VubGlua191cmIoaGNkLCB1cmIsIHN0YXR1cyk7CiAJaWYgKHJldCB8fCAhdXJiLT5oY3ByaXYpCiAJCWdvdG8gZG9uZTsKKwl0ZW1wID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKTsKKwlpZiAodGVtcCA9PSAweGZmZmZmZmZmKSB7CisJCXhoY2lfZGJnKHhoY2ksICJIVyBkaWVkLCBmcmVlaW5nIFRELlxuIik7CisJCXRkID0gKHN0cnVjdCB4aGNpX3RkICopIHVyYi0+aGNwcml2OworCisJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKGhjZCwgdXJiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCQl1c2JfaGNkX2dpdmViYWNrX3VyYih4aGNpX3RvX2hjZCh4aGNpKSwgdXJiLCAtRVNIVVRET1dOKTsKKwkJa2ZyZWUodGQpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXhoY2lfZGJnKHhoY2ksICJDYW5jZWwgVVJCICVwXG4iLCB1cmIpOwogCXhoY2lfZGJnKHhoY2ksICJFdmVudCByaW5nOlxuIik7CkBAIC04NzcsNyArODk1LDcgQEAKIAljdHJsX2N0eC0+ZHJvcF9mbGFncyB8PSBkcm9wX2ZsYWc7CiAJbmV3X2Ryb3BfZmxhZ3MgPSBjdHJsX2N0eC0+ZHJvcF9mbGFnczsKIAotCWN0cmxfY3R4LT5hZGRfZmxhZ3MgPSB+ZHJvcF9mbGFnOworCWN0cmxfY3R4LT5hZGRfZmxhZ3MgJj0gfmRyb3BfZmxhZzsKIAluZXdfYWRkX2ZsYWdzID0gY3RybF9jdHgtPmFkZF9mbGFnczsKIAogCWxhc3RfY3R4ID0geGhjaV9sYXN0X3ZhbGlkX2VuZHBvaW50KGN0cmxfY3R4LT5hZGRfZmxhZ3MpOwpAQCAtMTQxMCwxMSArMTQyOCwyMCBAQAogewogCXN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IGhjZF90b194aGNpKGhjZCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc3RhdGU7CiAKIAlpZiAodWRldi0+c2xvdF9pZCA9PSAwKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCS8qIERvbid0IGRpc2FibGUgdGhlIHNsb3QgaWYgdGhlIGhvc3QgY29udHJvbGxlciBpcyBkZWFkLiAqLworCXN0YXRlID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKTsKKwlpZiAoc3RhdGUgPT0gMHhmZmZmZmZmZikgeworCQl4aGNpX2ZyZWVfdmlydF9kZXZpY2UoeGhjaSwgdWRldi0+c2xvdF9pZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwogCWlmICh4aGNpX3F1ZXVlX3Nsb3RfY29udHJvbCh4aGNpLCBUUkJfRElTQUJMRV9TTE9ULCB1ZGV2LT5zbG90X2lkKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAJCXhoY2lfZGJnKHhoY2ksICJGSVhNRTogYWxsb2NhdGUgYSBjb21tYW5kIHJpbmcgc2VnbWVudFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3JpbzUwMC5jIGIvZHJpdmVycy91c2IvbWlzYy9yaW81MDAuYwppbmRleCBkNjQ1ZjM4Li4zMmQwMTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3JpbzUwMC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvcmlvNTAwLmMKQEAgLTQyOSw4ICs0MjksNyBAQAogCXJldHVybiByZWFkX2NvdW50OwogfQogCi1zdGF0aWMgc3RydWN0Ci1maWxlX29wZXJhdGlvbnMgdXNiX3Jpb19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX3Jpb19mb3BzID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5yZWFkID0JCXJlYWRfcmlvLAogCS53cml0ZSA9CXdyaXRlX3JpbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYl9pbml0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2JfaW5pdC5jCmluZGV4IDI3M2RlNWQuLjBhYjk5MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYl9pbml0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiX2luaXQuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAKICNpbmNsdWRlICJzaXN1c2IuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMKaW5kZXggMjkwOTJiOC4uNGZiMTIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jCkBAIC0zMTMsNyArMzEzLDggQEAKIAogCWlmIChsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSAhPSAweDAwMDEpIHsKIAkJZGV2X3dhcm4oJmludGVyZmFjZS0+ZGV2LCAiVVNCTENEIG1vZGVsIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CiAJfQogCQogCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCmluZGV4IGRmZGM0M2UuLjllZDNlNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYwpAQCAtMTE3NCw3ICsxMTc0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtb25fYmluX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbW9uX2Jpbl92bV9vcHMgPSB7CiAJLm9wZW4gPSAgICAgbW9uX2Jpbl92bWFfb3BlbiwKIAkuY2xvc2UgPSAgICBtb25fYmluX3ZtYV9jbG9zZSwKIAkuZmF1bHQgPSAgICBtb25fYmluX3ZtYV9mYXVsdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwppbmRleCA4MDNhZGNiLi5iODRhYmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCkBAIC04LDggKzgsOCBAQAogCiAjIChNKUhEUkMgPSAoTXVsdGlwb2ludCkgSGlnaHNwZWVkIER1YWwtUm9sZSBDb250cm9sbGVyCiBjb25maWcgVVNCX01VU0JfSERSQwotCWRlcGVuZHMgb24gKFVTQiB8fCBVU0JfR0FER0VUKSAmJiBIQVZFX0NMSwotCWRlcGVuZHMgb24gIVNVUEVSSAorCWRlcGVuZHMgb24gKFVTQiB8fCBVU0JfR0FER0VUKQorCWRlcGVuZHMgb24gKEFSTSB8fCBCTEFDS0ZJTikKIAlzZWxlY3QgTk9QX1VTQl9YQ0VJViBpZiBBUkNIX0RBVklOQ0kKIAlzZWxlY3QgVFdMNDAzMF9VU0IgaWYgTUFDSF9PTUFQXzM0MzBTRFAKIAlzZWxlY3QgTk9QX1VTQl9YQ0VJViBpZiBNQUNIX09NQVAzRVZNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMgYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMKaW5kZXggZjJmNjZlYi4uZmNlYzg3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAppbmRleCAzODFkNjQ4Li42YWE1ZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKQEAgLTk1LDYgKzk1LDEzIEBACiAjZW5kaWYKICNlbmRpZgkvKiBuZWVkIE1VU0IgZ2FkZ2V0IHNlbGVjdGlvbiAqLwogCisjaWZuZGVmIENPTkZJR19IQVZFX0NMSworLyogRHVtbXkgc3R1YiBmb3IgY2xrIGZyYW1ld29yayAqLworI2RlZmluZSBjbGtfZ2V0KGRldiwgaWQpCU5VTEwKKyNkZWZpbmUgY2xrX3B1dChjbG9jaykJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjbGtfZW5hYmxlKGNsb2NrKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY2xrX2Rpc2FibGUoY2xvY2spCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaAppbmRleCBmYmZkM2ZkLi5jYzFkNzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmgKQEAgLTQzOSwxNSArNDM5LDYgQEAKIC8qIE5vdCBpbXBsZW1lbnRlZCAtIEhXIGhhcyBzZXBlcmF0ZSBUeC9SeCBGSUZPICovCiAjZGVmaW5lIE1VU0JfVFhDU1JfTU9ERQkJCTB4MDAwMAogCi0vKgotICogRHVtbXkgc3R1YiBmb3IgY2xrIGZyYW1ld29yaywgaXQgd2lsbCBiZSByZW1vdmVkCi0gKiB1bnRpbCBCbGFja2ZpbiBzdXBwb3J0cyBjbGsgZnJhbWV3b3JrCi0gKi8KLSNkZWZpbmUgY2xrX2dldChkZXYsIGlkKQlOVUxMCi0jZGVmaW5lIGNsa19wdXQoY2xvY2spCQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgY2xrX2VuYWJsZShjbG9jaykJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGNsa19kaXNhYmxlKGNsb2NrKQlkbyB7fSB3aGlsZSAoMCkKLQogc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfdHhmaWZvc3oodm9pZCBfX2lvbWVtICptYmFzZSwgdTggY19zaXplKQogewogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwppbmRleCAyY2JmYWIzLi5iMTBhYzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwpAQCAtNTU0LDEzICs1NTQsMTIgQEAKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgYWlyY2FibGVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+cnhfbG9jayk7CiAJcHJpdi0+cnhfZmxhZ3MgfD0gVEhST1RUTEVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPnJ4X2xvY2spOwogfQogCiAvKiBCYXNlZCBvbiBmdGRpX3Npby5jIHVudGhyb3R0bGUgKi8KQEAgLTU2OSwxNCArNTY4LDEzIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IGFjdHVhbGx5X3Rocm90dGxlZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+cnhfbG9jayk7CiAJYWN0dWFsbHlfdGhyb3R0bGVkID0gcHJpdi0+cnhfZmxhZ3MgJiBBQ1RVQUxMWV9USFJPVFRMRUQ7CiAJcHJpdi0+cnhfZmxhZ3MgJj0gfihUSFJPVFRMRUQgfCBBQ1RVQUxMWV9USFJPVFRMRUQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPnJ4X2xvY2spOwogCiAJaWYgKGFjdHVhbGx5X3Rocm90dGxlZCkKIAkJc2NoZWR1bGVfd29yaygmcHJpdi0+cnhfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMKaW5kZXggNGEyMDhmZS4uNjk4MjUyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYwpAQCAtMTEzLDYgKzExMyw3IEBACiAJeyBVU0JfREVWSUNFKDB4MTY2QSwgMHgwMzAzKSB9LCAvKiBDbGlwc2FsIDU1MDBQQ1UgQy1CdXMgVVNCIGludGVyZmFjZSAqLwogCXsgVVNCX0RFVklDRSgweDE2RDYsIDB4MDAwMSkgfSwgLyogSmFibG90cm9uIHNlcmlhbCBpbnRlcmZhY2UgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxOEVGLCAweEUwMEYpIH0sIC8qIEVMViBVU0ItSTJDLUludGVyZmFjZSAqLworCXsgVVNCX0RFVklDRSgweDQxM0MsIDB4OTUwMCkgfSwgLyogRFc3MDAgR1BTIFVTQiBpbnRlcmZhY2UgKi8KIAl7IH0gLyogVGVybWluYXRpbmcgRW50cnkgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCmluZGV4IGUwYThiNzEuLmE1OTFlYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwpAQCAtMTE1NSwxMyArMTE1NSwxMiBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwogCXByaXYtPnJ4X2ZsYWdzID0gVEhST1RUTEVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogfQogCiAKQEAgLTExNzAsMTQgKzExNjksMTMgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCBhY3R1YWxseV90aHJvdHRsZWQsIHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJYWN0dWFsbHlfdGhyb3R0bGVkID0gcHJpdi0+cnhfZmxhZ3MgJiBBQ1RVQUxMWV9USFJPVFRMRUQ7CiAJcHJpdi0+cnhfZmxhZ3MgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCiAJaWYgKCFwcml2LT5jb21tX2lzX29rKQogCQlyZXR1cm47CkBAIC0xMTg1LDcgKzExODMsNyBAQAogCWlmIChhY3R1YWxseV90aHJvdHRsZWQpIHsKIAkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAKLQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOwogCQlpZiAocmVzdWx0KSB7CiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCAiCiAJCQkJCSJlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKaW5kZXggYWIzZGQ5OS4uNjhlODBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwpAQCAtODk4LDE2ICs4OTgsMTYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAotCS8qIHR1cm4gdGhyb3R0bGUgb2ZmICovCi0JcHJpdi0+ZHBfdGhyb3R0bGVkID0gMDsKLQlwcml2LT5kcF90aHJvdHRsZV9yZXN0YXJ0ID0gMDsKLQogCS8qIHJlc3RhcnQgcmVhZCBjaGFpbiAqLwogCWlmIChwcml2LT5kcF90aHJvdHRsZV9yZXN0YXJ0KSB7CiAJCXBvcnQtPnJlYWRfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCX0KIAorCS8qIHR1cm4gdGhyb3R0bGUgb2ZmICovCisJcHJpdi0+ZHBfdGhyb3R0bGVkID0gMDsKKwlwcml2LT5kcF90aHJvdHRsZV9yZXN0YXJ0ID0gMDsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKaW5kZXggMzNjOWU5Yy4uN2RkMGUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKQEAgLTM5MSw3ICszOTEsNyBAQAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Ci0JcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KQogCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IDRmODgzYjEuLjljNjBkNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC03NiwxMyArNzYsNyBAQAogCXVuc2lnbmVkIGxvbmcgbGFzdF9kdHJfcnRzOwkvKiBzYXZlZCBtb2RlbSBjb250cm9sIG91dHB1dHMgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBkZWx0YV9tc3Jfd2FpdDsgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLwogCWNoYXIgcHJldl9zdGF0dXMsIGRpZmZfc3RhdHVzOyAgICAgICAgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLwotCV9fdTggcnhfZmxhZ3M7CQkvKiByZWNlaXZlIHN0YXRlIGZsYWdzICh0aHJvdHRsaW5nKSAqLwotCXNwaW5sb2NrX3QgcnhfbG9jazsJLyogc3BpbmxvY2sgZm9yIHJlY2VpdmUgc3RhdGUgKi8KLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHJ4X3dvcms7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKLQlpbnQgcnhfcHJvY2Vzc2VkOwotCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXM7Ci0KIAlfX3UxNiBpbnRlcmZhY2U7CS8qIEZUMjIzMkMsIEZUMjIzMkggb3IgRlQ0MjMySCBwb3J0IGludGVyZmFjZQogCQkJCSAgICgwIGZvciBGVDIzMi8yNDUpICovCiAKQEAgLTczNywxMCArNzMxLDYgQEAKIC8qIENvbnN0YW50cyBmb3IgcmVhZCB1cmIgYW5kIHdyaXRlIHVyYiAqLwogI2RlZmluZSBCVUZTWiA1MTIKIAotLyogcnhfZmxhZ3MgKi8KLSNkZWZpbmUgVEhST1RUTEVECQkweDAxCi0jZGVmaW5lIEFDVFVBTExZX1RIUk9UVExFRAkweDAyCi0KIC8qIFVzZWQgZm9yIFRJT0NNSVdBSVQgKi8KICNkZWZpbmUgRlRESV9TVEFUVVNfQjBfTUFTSwkoRlRESV9SUzBfQ1RTIHwgRlRESV9SUzBfRFNSIHwgRlRESV9SUzBfUkkgfCBGVERJX1JTMF9STFNEKQogI2RlZmluZSBGVERJX1NUQVRVU19CMV9NQVNLCShGVERJX1JTX0JJKQpAQCAtNzYzLDcgKzc1Myw3IEBACiBzdGF0aWMgaW50ICBmdGRpX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIHN0YXRpYyB2b2lkIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIHZvaWQgZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyB2b2lkIGZ0ZGlfcHJvY2Vzc19yZWFkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBmdGRpX3Byb2Nlc3NfcmVhZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyB2b2lkIGZ0ZGlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqb2xkKTsKIHN0YXRpYyBpbnQgIGZ0ZGlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwpAQCAtMTIzNCw3ICsxMjI0LDYgQEAKIAkJCQkJKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOwogCXByaXYtPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKIAotCXR0eS0+bG93X2xhdGVuY3kgPSAocHJpdi0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKIAl3cml0ZV9sYXRlbmN5X3RpbWVyKHBvcnQpOwogCiBjaGVja19hbmRfZXhpdDoKQEAgLTE1MjcsNyArMTUxNiw2IEBACiAJfQogCiAJa3JlZl9pbml0KCZwcml2LT5rcmVmKTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cnhfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4X2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKIAkvKiBUaGlzIHdpbGwgcHVzaCB0aGUgY2hhcmFjdGVycyB0aHJvdWdoIGltbWVkaWF0ZWx5IHJhdGhlcgpAQCAtMTU0OSw3ICsxNTM3LDYgQEAKIAkJcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBCVUZTWjsKIAl9CiAKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+cnhfd29yaywgZnRkaV9wcm9jZXNzX3JlYWQpOwogCXByaXYtPnBvcnQgPSBwb3J0OwogCiAJLyogRnJlZSBwb3J0J3MgZXhpc3Rpbmcgd3JpdGUgdXJiIGFuZCB0cmFuc2ZlciBidWZmZXIuICovCkBAIC0xNjg2LDYgKzE2NzMsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmdGRpX3N1Ym1pdF9yZWFkX3VyYihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IHVyYiAqdXJiID0gcG9ydC0+cmVhZF91cmI7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlpbnQgcmVzdWx0OworCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZXJpYWwtPmRldiwKKwkJCSAgIHVzYl9yY3ZidWxrcGlwZShzZXJpYWwtPmRldiwKKwkJCQkJcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLAorCQkJICAgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkgICBmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBtZW1fZmxhZ3MpOworCWlmIChyZXN1bHQpCisJCWRldl9lcnIoJnBvcnQtPmRldiwKKwkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiBzdGF0aWMgaW50IGZ0ZGlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogeyAvKiBmdGRpX29wZW4gKi8KIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CkBAIC0xNzAwLDEyICsxNzA3LDYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwogCXByaXYtPnR4X2J5dGVzID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKLQlwcml2LT5yeF9ieXRlcyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHR0eSkKLQkJdHR5LT5sb3dfbGF0ZW5jeSA9IChwcml2LT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOwogCiAJd3JpdGVfbGF0ZW5jeV90aW1lcihwb3J0KTsKIApAQCAtMTcyNSwyMyArMTcyNiwxNCBAQAogCQlmdGRpX3NldF90ZXJtaW9zKHR0eSwgcG9ydCwgdHR5LT50ZXJtaW9zKTsKIAogCS8qIE5vdCB0aHJvdHRsZWQgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwotCXByaXYtPnJ4X2ZsYWdzICY9IH4oVEhST1RUTEVEIHwgQUNUVUFMTFlfVEhST1RUTEVEKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlwb3J0LT50aHJvdHRsZWQgPSAwOworCXBvcnQtPnRocm90dGxlX3JlcSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJLyogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UgKi8KLQlwcml2LT5yeF9wcm9jZXNzZWQgPSAwOwotCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBkZXYsCi0JCQl1c2JfcmN2YnVsa3BpcGUoZGV2LCBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCi0JCQlwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLAotCQkJCXBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQkJZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOwotCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKLQlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsCi0JCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmVzdWx0KTsKLQllbHNlCisJcmVzdWx0ID0gZnRkaV9zdWJtaXRfcmVhZF91cmIocG9ydCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXN1bHQpCiAJCWtyZWZfZ2V0KCZwcml2LT5rcmVmKTsKIAogCXJldHVybiByZXN1bHQ7CkBAIC0xNzg3LDEwICsxNzc5LDYgQEAKIAogCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKLQotCS8qIGNhbmNlbCBhbnkgc2NoZWR1bGVkIHJlYWRpbmcgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnJ4X3dvcmspOwotCiAJLyogc2h1dGRvd24gb3VyIGJ1bGsgcmVhZCAqLwogCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CiAJa3JlZl9wdXQoJnByaXYtPmtyZWYsIGZ0ZGlfc2lvX3ByaXZfcmVsZWFzZSk7CkBAIC0yMDEzLDI3MSArMjAwMSwxMjEgQEAKIAlyZXR1cm4gYnVmZmVyZWQ7CiB9CiAKK3N0YXRpYyBpbnQgZnRkaV9wcm9jZXNzX3BhY2tldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2LAorCQljaGFyICpwYWNrZXQsIGludCBsZW4pCit7CisJaW50IGk7CisJY2hhciBzdGF0dXM7CisJY2hhciBmbGFnOworCWNoYXIgKmNoOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCWlmIChsZW4gPCAyKSB7CisJCWRiZygibWFsZm9ybWVkIHBhY2tldCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDb21wYXJlIG5ldyBsaW5lIHN0YXR1cyB0byB0aGUgb2xkIG9uZSwgc2lnbmFsIGlmIGRpZmZlcmVudC8KKwkgICBOLkIuIHBhY2tldCBtYXkgYmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBvbmNlLCBidXQgZGlmZmVyZW5jZXMKKwkgICBhcmUgb25seSBwcm9jZXNzZWQgb25jZS4gICovCisJc3RhdHVzID0gcGFja2V0WzBdICYgRlRESV9TVEFUVVNfQjBfTUFTSzsKKwlpZiAoc3RhdHVzICE9IHByaXYtPnByZXZfc3RhdHVzKSB7CisJCXByaXYtPmRpZmZfc3RhdHVzIHw9IHN0YXR1cyBeIHByaXYtPnByZXZfc3RhdHVzOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKKwkJcHJpdi0+cHJldl9zdGF0dXMgPSBzdGF0dXM7CisJfQorCisJLyoKKwkgKiBBbHRob3VnaCB0aGUgZGV2aWNlIHVzZXMgYSBiaXRtYXNrIGFuZCBoZW5jZSBjYW4gaGF2ZSBtdWx0aXBsZQorCSAqIGVycm9ycyBvbiBhIHBhY2tldCAtIHRoZSBvcmRlciBoZXJlIHNldHMgdGhlIHByaW9yaXR5IHRoZSBlcnJvciBpcworCSAqIHJldHVybmVkIHRvIHRoZSB0dHkgbGF5ZXIuCisJICovCisJZmxhZyA9IFRUWV9OT1JNQUw7CisJaWYgKHBhY2tldFsxXSAmIEZURElfUlNfT0UpIHsKKwkJZmxhZyA9IFRUWV9PVkVSUlVOOworCQlkYmcoIk9WRVJSUlVOIGVycm9yIik7CisJfQorCWlmIChwYWNrZXRbMV0gJiBGVERJX1JTX0JJKSB7CisJCWZsYWcgPSBUVFlfQlJFQUs7CisJCWRiZygiQlJFQUsgcmVjZWl2ZWQiKTsKKwkJdXNiX3NlcmlhbF9oYW5kbGVfYnJlYWsocG9ydCk7CisJfQorCWlmIChwYWNrZXRbMV0gJiBGVERJX1JTX1BFKSB7CisJCWZsYWcgPSBUVFlfUEFSSVRZOworCQlkYmcoIlBBUklUWSBlcnJvciIpOworCX0KKwlpZiAocGFja2V0WzFdICYgRlRESV9SU19GRSkgeworCQlmbGFnID0gVFRZX0ZSQU1FOworCQlkYmcoIkZSQU1JTkcgZXJyb3IiKTsKKwl9CisKKwlsZW4gLT0gMjsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CS8qIHN0YXR1cyBvbmx5ICovCisJY2ggPSBwYWNrZXQgKyAyOworCisJaWYgKCEocG9ydC0+Y29uc29sZSAmJiBwb3J0LT5zeXNycSkgJiYgZmxhZyA9PSBUVFlfTk9STUFMKQorCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgY2gsIGxlbik7CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgY2grKykgeworCQkJaWYgKCF1c2Jfc2VyaWFsX2hhbmRsZV9zeXNycV9jaGFyKHR0eSwgcG9ydCwgKmNoKSkKKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksICpjaCwgZmxhZyk7CisJCX0KKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgZnRkaV9wcm9jZXNzX3JlYWQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdXJiICp1cmIgPSBwb3J0LT5yZWFkX3VyYjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJY2hhciAqZGF0YSA9IChjaGFyICopdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJaW50IGk7CisJaW50IGxlbjsKKwlpbnQgY291bnQgPSAwOworCisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkgKz0gcHJpdi0+bWF4X3BhY2tldF9zaXplKSB7CisJCWxlbiA9IG1pbl90KGludCwgdXJiLT5hY3R1YWxfbGVuZ3RoIC0gaSwgcHJpdi0+bWF4X3BhY2tldF9zaXplKTsKKwkJY291bnQgKz0gZnRkaV9wcm9jZXNzX3BhY2tldCh0dHksIHBvcnQsIHByaXYsICZkYXRhW2ldLCBsZW4pOworCX0KKworCWlmIChjb3VudCkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKK30KKwogc3RhdGljIHZvaWQgZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwotCXVuc2lnbmVkIGxvbmcgY291bnRyZWFkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwotCi0JaWYgKHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPiAwKSB7Ci0JCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWQgIgotCQkJImFjdHVhbF9sZW5ndGggJWQgbnVtYmVyIG9mIHBhY2tldHMgJWRcbiIsIF9fZnVuY19fLAotCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPm51bWJlcl9vZl9wYWNrZXRzKTsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgdHJhbnNmZXJfZmxhZ3MgJXhcbiIsIF9fZnVuY19fLAotCQkJdXJiLT50cmFuc2Zlcl9mbGFncyk7Ci0JfQotCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKLQotCWlmIChwb3J0LT5wb3J0LmNvdW50IDw9IDApCi0JCXJldHVybjsKLQotCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwotCWlmICghdHR5KSB7Ci0JCWRiZygiJXMgLSBiYWQgdHR5IHBvaW50ZXIgLSBleGl0aW5nIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQlpZiAoIXByaXYpIHsKLQkJZGJnKCIlcyAtIGJhZCBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyIC0gZXhpdGluZyIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHVyYiAhPSBwb3J0LT5yZWFkX3VyYikKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBOb3QgbXkgdXJiIVxuIiwgX19mdW5jX18pOwotCi0JaWYgKHN0YXR1cykgewotCQkvKiBUaGlzIHdpbGwgaGFwcGVuIGF0IGNsb3NlIGV2ZXJ5IHRpbWUgc28gaXQgaXMgYSBkYmcgbm90IGFuCi0JCSAgIGVyciAqLwotCQlkYmcoIih0aGlzIGlzIG9rIG9uIGNsb3NlKSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgc3RhdHVzKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogY291bnQgZGF0YSBieXRlcywgYnV0IG5vdCBzdGF0dXMgYnl0ZXMgKi8KLQljb3VudHJlYWQgPSB1cmItPmFjdHVhbF9sZW5ndGg7Ci0JY291bnRyZWFkIC09IDIgKiBESVZfUk9VTkRfVVAoY291bnRyZWFkLCBwcml2LT5tYXhfcGFja2V0X3NpemUpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+cnhfYnl0ZXMgKz0gY291bnRyZWFkOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKLQotCWZ0ZGlfcHJvY2Vzc19yZWFkKCZwcml2LT5yeF93b3JrLndvcmspOwotb3V0OgotCXR0eV9rcmVmX3B1dCh0dHkpOwotfSAvKiBmdGRpX3JlYWRfYnVsa19jYWxsYmFjayAqLwotCi0KLXN0YXRpYyB2b2lkIGZ0ZGlfcHJvY2Vzc19yZWFkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsgLyogZnRkaV9wcm9jZXNzX3JlYWQgKi8KLQlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmdGRpX3ByaXZhdGUsIHJ4X3dvcmsud29yayk7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHByaXYtPnBvcnQ7Ci0Jc3RydWN0IHVyYiAqdXJiOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0JY2hhciBlcnJvcl9mbGFnOwotCXVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0KLQlpbnQgaTsKLQlpbnQgcmVzdWx0OwotCWludCBuZWVkX2ZsaXA7Ci0JaW50IHBhY2tldF9vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKLQlpZiAocG9ydC0+cG9ydC5jb3VudCA8PSAwKQotCQlyZXR1cm47Ci0KLQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKLQlpZiAoIXR0eSkgewotCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsIF9fZnVuY19fKTsKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJZGJnKCIlcyAtIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkJCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAotCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JaWYgKCFwcml2KSB7Ci0JCWRiZygiJXMgLSBiYWQgcG9ydCBwcml2YXRlIGRhdGEgcG9pbnRlciAtIGV4aXRpbmciLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAorCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCWZ0ZGlfcHJvY2Vzc19yZWFkKHBvcnQpOwogCi0JdXJiID0gcG9ydC0+cmVhZF91cmI7Ci0JaWYgKCF1cmIpIHsKLQkJZGJnKCIlcyAtIGJhZCByZWFkX3VyYiBwb2ludGVyIC0gZXhpdGluZyIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCi0JaWYgKHByaXYtPnJ4X3Byb2Nlc3NlZCkgewotCQlkYmcoIiVzIC0gYWxyZWFkeSBwcm9jZXNzZWQ6ICVkIGJ5dGVzLCAlZCByZW1haW4iLCBfX2Z1bmNfXywKLQkJCQlwcml2LT5yeF9wcm9jZXNzZWQsCi0JCQkJdXJiLT5hY3R1YWxfbGVuZ3RoIC0gcHJpdi0+cnhfcHJvY2Vzc2VkKTsKLQl9IGVsc2UgewotCQkvKiBUaGUgZmlyc3QgdHdvIGJ5dGVzIG9mIGV2ZXJ5IHJlYWQgcGFja2V0IGFyZSBzdGF0dXMgKi8KLQkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDIpCi0JCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAotCQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKLQkJZWxzZQotCQkJZGJnKCJTdGF0dXMgb25seTogJTAzb28gJTAzb28iLCBkYXRhWzBdLCBkYXRhWzFdKTsKLQl9Ci0KLQotCS8qIFRPIERPIC0tIGNoZWNrIGZvciBodW5nIHVwIGxpbmUgYW5kIGhhbmRsZSBhcHByb3ByaWF0ZWx5OiAqLwotCS8qICAgc2VuZCBoYW5ndXAgICovCi0JLyogU2VlIGFjbS5jIC0geW91IGRvIGEgdHR5X2hhbmd1cCAgLSBlZyB0dHlfaGFuZ3VwKHR0eSkgKi8KLQkvKiBpZiBDRCBpcyBkcm9wcGVkIGFuZCB0aGUgbGluZSBpcyBub3QgQ0xPQ0FMIHRoZW4gd2Ugc2hvdWxkIGhhbmd1cCAqLwotCi0JbmVlZF9mbGlwID0gMDsKLQlmb3IgKHBhY2tldF9vZmZzZXQgPSBwcml2LT5yeF9wcm9jZXNzZWQ7Ci0JCXBhY2tldF9vZmZzZXQgPCB1cmItPmFjdHVhbF9sZW5ndGg7IHBhY2tldF9vZmZzZXQgKz0gcHJpdi0+bWF4X3BhY2tldF9zaXplKSB7Ci0JCWludCBsZW5ndGg7Ci0KLQkJLyogQ29tcGFyZSBuZXcgbGluZSBzdGF0dXMgdG8gdGhlIG9sZCBvbmUsIHNpZ25hbCBpZiBkaWZmZXJlbnQvCi0JCSAgIE4uQi4gcGFja2V0IG1heSBiZSBwcm9jZXNzZWQgbW9yZSB0aGFuIG9uY2UsIGJ1dCBkaWZmZXJlbmNlcwotCQkgICBhcmUgb25seSBwcm9jZXNzZWQgb25jZS4gICovCi0JCWNoYXIgbmV3X3N0YXR1cyA9IGRhdGFbcGFja2V0X29mZnNldCArIDBdICYKLQkJCQkJCUZURElfU1RBVFVTX0IwX01BU0s7Ci0JCWlmIChuZXdfc3RhdHVzICE9IHByaXYtPnByZXZfc3RhdHVzKSB7Ci0JCQlwcml2LT5kaWZmX3N0YXR1cyB8PQotCQkJCW5ld19zdGF0dXMgXiBwcml2LT5wcmV2X3N0YXR1czsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwotCQkJcHJpdi0+cHJldl9zdGF0dXMgPSBuZXdfc3RhdHVzOwotCQl9Ci0KLQkJbGVuZ3RoID0gbWluX3QodTMyLCBwcml2LT5tYXhfcGFja2V0X3NpemUsIHVyYi0+YWN0dWFsX2xlbmd0aC1wYWNrZXRfb2Zmc2V0KS0yOwotCQlpZiAobGVuZ3RoIDwgMCkgewotCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBiYWQgcGFja2V0IGxlbmd0aDogJWRcbiIsCi0JCQkJX19mdW5jX18sIGxlbmd0aCsyKTsKLQkJCWxlbmd0aCA9IDA7Ci0JCX0KLQotCQlpZiAocHJpdi0+cnhfZmxhZ3MgJiBUSFJPVFRMRUQpIHsKLQkJCWRiZygiJXMgLSB0aHJvdHRsZWQiLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBsZW5ndGgpIDwgbGVuZ3RoKSB7Ci0JCQkvKiBicmVhayBvdXQgJiB3YWl0IGZvciB0aHJvdHRsaW5nL3VudGhyb3R0bGluZyB0bwotCQkJICAgaGFwcGVuICovCi0JCQlkYmcoIiVzIC0gcmVjZWl2ZSByb29tIGxvdyIsIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSGFuZGxlIGVycm9ycyBhbmQgYnJlYWsgKi8KLQkJZXJyb3JfZmxhZyA9IFRUWV9OT1JNQUw7Ci0JCS8qIEFsdGhvdWdoIHRoZSBkZXZpY2UgdXNlcyBhIGJpdG1hc2sgYW5kIGhlbmNlIGNhbiBoYXZlCi0JCSAgIG11bHRpcGxlIGVycm9ycyBvbiBhIHBhY2tldCAtIHRoZSBvcmRlciBoZXJlIHNldHMgdGhlCi0JCSAgIHByaW9yaXR5IHRoZSBlcnJvciBpcyByZXR1cm5lZCB0byB0aGUgdHR5IGxheWVyICAqLwotCi0JCWlmIChkYXRhW3BhY2tldF9vZmZzZXQrMV0gJiBGVERJX1JTX09FKSB7Ci0JCQllcnJvcl9mbGFnID0gVFRZX09WRVJSVU47Ci0JCQlkYmcoIk9WRVJSUlVOIGVycm9yIik7Ci0JCX0KLQkJaWYgKGRhdGFbcGFja2V0X29mZnNldCsxXSAmIEZURElfUlNfQkkpIHsKLQkJCWVycm9yX2ZsYWcgPSBUVFlfQlJFQUs7Ci0JCQlkYmcoIkJSRUFLIHJlY2VpdmVkIik7Ci0JCQl1c2Jfc2VyaWFsX2hhbmRsZV9icmVhayhwb3J0KTsKLQkJfQotCQlpZiAoZGF0YVtwYWNrZXRfb2Zmc2V0KzFdICYgRlRESV9SU19QRSkgewotCQkJZXJyb3JfZmxhZyA9IFRUWV9QQVJJVFk7Ci0JCQlkYmcoIlBBUklUWSBlcnJvciIpOwotCQl9Ci0JCWlmIChkYXRhW3BhY2tldF9vZmZzZXQrMV0gJiBGVERJX1JTX0ZFKSB7Ci0JCQllcnJvcl9mbGFnID0gVFRZX0ZSQU1FOwotCQkJZGJnKCJGUkFNSU5HIGVycm9yIik7Ci0JCX0KLQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCWZvciAoaSA9IDI7IGkgPCBsZW5ndGgrMjsgaSsrKSB7Ci0JCQkJLyogTm90ZSB0aGF0IHRoZSBlcnJvciBmbGFnIGlzIGR1cGxpY2F0ZWQgZm9yCi0JCQkJICAgZXZlcnkgY2hhcmFjdGVyIHJlY2VpdmVkIHNpbmNlIHdlIGRvbid0IGtub3cKLQkJCQkgICB3aGljaCBjaGFyYWN0ZXIgaXQgYXBwbGllZCB0byAqLwotCQkJCWlmICghdXNiX3NlcmlhbF9oYW5kbGVfc3lzcnFfY2hhcih0dHksIHBvcnQsCi0JCQkJCQlkYXRhW3BhY2tldF9vZmZzZXQgKyBpXSkpCi0JCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwKLQkJCQkJCWRhdGFbcGFja2V0X29mZnNldCArIGldLAotCQkJCQkJZXJyb3JfZmxhZyk7Ci0JCQl9Ci0JCQluZWVkX2ZsaXAgPSAxOwotCQl9Ci0KLSNpZmRlZiBOT1RfQ09SUkVDVF9CVVRfS0VFUElOR19JVF9GT1JfTk9XCi0JCS8qIGlmIGEgcGFyaXR5IGVycm9yIGlzIGRldGVjdGVkIHlvdSBnZXQgc3RhdHVzIHBhY2tldHMgZm9yZXZlcgotCQkgICB1bnRpbCBhIGNoYXJhY3RlciBpcyBzZW50IHdpdGhvdXQgYSBwYXJpdHkgZXJyb3IuCi0JCSAgIFRoaXMgZG9lc24ndCB3b3JrIHdlbGwgc2luY2UgdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGEKLQkJICAgbmV2ZXIgZW5kaW5nIHN0cmVhbSBvZiBiYWQgZGF0YSAtIGV2ZW4gdGhvdWdoIG5ldyBkYXRhCi0JCSAgIGhhc24ndCBiZWVuIHNlbnQuIFRoZXJlZm9yZSBJIChiaWxsKSBoYXZlIHRha2VuIHRoaXMgb3V0LgotCQkgICBIb3dldmVyIC0gdGhpcyBtaWdodCBtYWtlIHNlbnNlIGZvciBmcmFtaW5nIGVycm9ycyBhbmQgc28gb24KLQkJICAgc28gSSBhbSBsZWF2aW5nIHRoZSBjb2RlIGluIGZvciBub3cuCi0JCSovCi0JCWVsc2UgewotCQkJaWYgKGVycm9yX2ZsYWcgIT0gVFRZX05PUk1BTCkgewotCQkJCWRiZygiZXJyb3JfZmxhZyBpcyBub3Qgbm9ybWFsIik7Ci0JCQkJLyogSW4gdGhpcyBjYXNlIGl0IGlzIGp1c3Qgc3RhdHVzIC0gaWYgdGhhdCBpcwotCQkJCSAgIGFuIGVycm9yIHNlbmQgYSBiYWQgY2hhcmFjdGVyICovCi0JCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMHhmZiwgZXJyb3JfZmxhZyk7Ci0JCQkJbmVlZF9mbGlwID0gMTsKLQkJCX0KLQkJfQotI2VuZGlmCi0JfSAvKiAiZm9yKHBhY2tldF9vZmZzZXQ9MC4uLiIgKi8KLQotCS8qIExvdyBsYXRlbmN5ICovCi0JaWYgKG5lZWRfZmxpcCkKLQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQotCWlmIChwYWNrZXRfb2Zmc2V0IDwgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCS8qIG5vdCBjb21wbGV0ZWx5IHByb2Nlc3NlZCAtIHJlY29yZCBwcm9ncmVzcyAqLwotCQlwcml2LT5yeF9wcm9jZXNzZWQgPSBwYWNrZXRfb2Zmc2V0OwotCQlkYmcoIiVzIC0gaW5jb21wbGV0ZSwgJWQgYnl0ZXMgcHJvY2Vzc2VkLCAlZCByZW1haW4iLAotCQkJCV9fZnVuY19fLCBwYWNrZXRfb2Zmc2V0LAotCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCAtIHBhY2tldF9vZmZzZXQpOwotCQkvKiBjaGVjayBpZiB3ZSB3ZXJlIHRocm90dGxlZCB3aGlsZSBwcm9jZXNzaW5nICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Ci0JCWlmIChwcml2LT5yeF9mbGFncyAmIFRIUk9UVExFRCkgewotCQkJcHJpdi0+cnhfZmxhZ3MgfD0gQUNUVUFMTFlfVEhST1RUTEVEOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwotCQkJZGJnKCIlcyAtIGRlZmVycmluZyByZW1haW5kZXIgdW50aWwgdW50aHJvdHRsZWQiLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Ci0JCS8qIGlmIHRoZSBwb3J0IGlzIGNsb3NlZCBzdG9wIHRyeWluZyB0byByZWFkICovCi0JCWlmIChwb3J0LT5wb3J0LmNvdW50ID4gMCkKLQkJCS8qIGRlbGF5IHByb2Nlc3Npbmcgb2YgcmVtYWluZGVyICovCi0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPnJ4X3dvcmssIDEpOwotCQllbHNlCi0JCQlkYmcoIiVzIC0gcG9ydCBpcyBjbG9zZWQiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIHVyYiBpcyBjb21wbGV0ZWx5IHByb2Nlc3NlZCAqLwotCXByaXYtPnJ4X3Byb2Nlc3NlZCA9IDA7Ci0KLQkvKiBpZiB0aGUgcG9ydCBpcyBjbG9zZWQgc3RvcCB0cnlpbmcgdG8gcmVhZCAqLwotCWlmIChwb3J0LT5wb3J0LmNvdW50ID4gMCkgewotCQkvKiBDb250aW51ZSB0cnlpbmcgdG8gYWx3YXlzIHJlYWQgICovCi0JCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKLQkJCXVzYl9yY3ZidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwKLQkJCQkJcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLAotCQkJcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJCXBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQkJZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOwotCi0JCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHJlc3VsdCkKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwKLQkJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKLQl9Ci1vdXQ6Ci0JdHR5X2tyZWZfcHV0KHR0eSk7Ci19IC8qIGZ0ZGlfcHJvY2Vzc19yZWFkICovCi0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXBvcnQtPnRocm90dGxlZCA9IHBvcnQtPnRocm90dGxlX3JlcTsKKwlpZiAoIXBvcnQtPnRocm90dGxlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJCWZ0ZGlfc3VibWl0X3JlYWRfdXJiKHBvcnQsIEdGUF9BVE9NSUMpOworCX0gZWxzZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Cit9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfYnJlYWtfY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKIHsKQEAgLTI2MDksMzMgKzI0NDcsMzEgQEAKIHN0YXRpYyB2b2lkIGZ0ZGlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKLQlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJcG9ydC0+dGhyb3R0bGVfcmVxID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKLQotc3RhdGljIHZvaWQgZnRkaV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit2b2lkIGZ0ZGlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JaW50IGFjdHVhbGx5X3Rocm90dGxlZDsKKwlpbnQgd2FzX3Rocm90dGxlZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Ci0JYWN0dWFsbHlfdGhyb3R0bGVkID0gcHJpdi0+cnhfZmxhZ3MgJiBBQ1RVQUxMWV9USFJPVFRMRUQ7Ci0JcHJpdi0+cnhfZmxhZ3MgJj0gfihUSFJPVFRMRUQgfCBBQ1RVQUxMWV9USFJPVFRMRUQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXdhc190aHJvdHRsZWQgPSBwb3J0LT50aHJvdHRsZWQ7CisJcG9ydC0+dGhyb3R0bGVkID0gcG9ydC0+dGhyb3R0bGVfcmVxID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoYWN0dWFsbHlfdGhyb3R0bGVkKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPnJ4X3dvcmssIDApOworCS8qIFJlc3VibWl0IHVyYiBpZiB0aHJvdHRsZWQgYW5kIG9wZW4uICovCisJaWYgKHdhc190aHJvdHRsZWQgJiYgdGVzdF9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+cG9ydC5mbGFncykpCisJCWZ0ZGlfc3VibWl0X3JlYWRfdXJiKHBvcnQsIEdGUF9LRVJORUwpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBmdGRpX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCmluZGV4IDIwNDMyZDMuLjVhYzkwMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwpAQCAtMTM5MCwxNCArMTM5MCwxMyBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAkvKiBzZXQgZmxhZywgZGF0YSByZWNlaXZlZCB3aWxsIGJlIHB1dCBpbnRvIGEgcXVldWUKIAkgICBmb3IgbGF0ZXIgcHJvY2Vzc2luZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmZ2FybWluX2RhdGFfcC0+bG9jayk7CiAJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgfD0gRkxBR1NfUVVFVUlOR3xGTEFHU19USFJPVFRMRUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmZ2FybWluX2RhdGFfcC0+bG9jayk7CiB9CiAKIApAQCAtMTQwNSwxMyArMTQwNCwxMiBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXM7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmZ2FybWluX2RhdGFfcC0+bG9jayk7CiAJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJj0gfkZMQUdTX1RIUk9UVExFRDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZnYXJtaW5fZGF0YV9wLT5sb2NrKTsKIAogCS8qIGluIG5hdGl2ZSBtb2RlIHNlbmQgcXVldWVkIGRhdGEgdG8gdHR5LCBpbgogCSAgIHNlcmlhbCBtb2RlIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSBoZXJlICovCkBAIC0xNDE5LDcgKzE0MTcsNyBAQAogCQlnYXJtaW5fZmx1c2hfcXVldWUoZ2FybWluX2RhdGFfcCk7CiAKIAlpZiAoMCAhPSAoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19CVUxLX0lOX0FDVElWRSkpIHsKLQkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChzdGF0dXMpCiAJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwppbmRleCBkZWJhMDhjLi5iYmUwMDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKQEAgLTU0Niw3ICs1NDYsNyBAQAogCiAJaWYgKHdhc190aHJvdHRsZWQpIHsKIAkJLyogUmVzdW1lIHJlYWRpbmcgZnJvbSBkZXZpY2UgKi8KLQkJdXNiX3NlcmlhbF9nZW5lcmljX3Jlc3VibWl0X3JlYWRfdXJiKHBvcnQsIEdGUF9LRVJORUwpOworCQlmbHVzaF9hbmRfcmVzdWJtaXRfcmVhZF91cmIocG9ydCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYwppbmRleCAyNGZjYzY0Li5kNjIzMWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKQEAgLTk2Niw2ICs5NjYsMTUgQEAKIHN0YXRpYyBpbnQgaXBhcV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCS8qIFNvbWUgb2YgdGhlIGRldmljZXMgaW4gaXBhcV9pZF90YWJsZVtdIGFyZSBjb21wb3NpdGUsIGFuZCB3ZQorCSAqIHNob3VsZG4ndCBiaW5kIHRvIGFsbCB0aGUgaW50ZXJmYWNlcy4gIFRoaXMgdGVzdCB3aWxsIHJ1bGUgb3V0CisJICogc29tZSBvYnZpb3VzbHkgaW52YWxpZCBwb3NzaWJpbGl0aWVzLgorCSAqLworCWlmIChzZXJpYWwtPm51bV9idWxrX2luIDwgc2VyaWFsLT5udW1fcG9ydHMgfHwKKwkJCXNlcmlhbC0+bnVtX2J1bGtfb3V0IDwgc2VyaWFsLT5udW1fcG9ydHMpCisJCXJldHVybiAtRU5PREVWOworCiAJaWYgKHNlcmlhbC0+ZGV2LT5hY3Rjb25maWctPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZSAhPSAxKSB7CiAJCS8qCiAJCSAqIEZJWE1FOiBIUCBpUGFxIHJ4MzcxNSwgcG9zc2libHkgb3RoZXJzLCBoYXZlIDEgY29uZmlnIHRoYXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggMjU3YzE2Yy4uMTI5NmEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTI5MCw3ICsyOTAsNyBAQAogCS8qIGp1c3QgcmVzdGFydCB0aGUgcmVjZWl2ZSBpbnRlcnJ1cHQgVVJCICovCiAJZGJnKCJrZXlzcGFuX3BkYV9yeF91bnRocm90dGxlIHBvcnQgJWQiLCBwb3J0LT5udW1iZXIpOwogCXBvcnQtPmludGVycnVwdF9pbl91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwotCWlmICh1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKSkKKwlpZiAodXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCkpCiAJCWRiZygiIHVzYl9zdWJtaXRfdXJiKHJlYWQgdXJiKSBmYWlsZWQiKTsKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCBmNzM3MzM3Li4zYTc4NzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTk1MSw3ICs5NTEsNyBAQAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Ci0JcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzdWx0KQogCQlkZXZfZXJyKCZwb3J0LT5kZXYsCiAJCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jCmluZGV4IGFkNDk5OGIuLmNkMDA5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jCkBAIC03NzcsMjAgKzc3NywxOSBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBtY3RfdTIzMl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGNvbnRyb2xfc3RhdGU7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKIAlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CiAJaWYgKENfQ1JUU0NUUyh0dHkpKSB7CiAJCXByaXYtPmNvbnRyb2xfc3RhdGUgJj0gflRJT0NNX1JUUzsKIAkJY29udHJvbF9zdGF0ZSA9IHByaXYtPmNvbnRyb2xfc3RhdGU7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKIAkJKHZvaWQpIG1jdF91MjMyX3NldF9tb2RlbV9jdHJsKHBvcnQtPnNlcmlhbCwgY29udHJvbF9zdGF0ZSk7CiAJfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCX0KIH0KIApAQCAtNzk5LDIwICs3OTgsMTkgQEAKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgbWN0X3UyMzJfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBjb250cm9sX3N0YXRlOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJaWYgKChwcml2LT5yeF9mbGFncyAmIFRIUk9UVExFRCkgJiYgQ19DUlRTQ1RTKHR0eSkpIHsKIAkJcHJpdi0+cnhfZmxhZ3MgJj0gflRIUk9UVExFRDsKIAkJcHJpdi0+Y29udHJvbF9zdGF0ZSB8PSBUSU9DTV9SVFM7CiAJCWNvbnRyb2xfc3RhdGUgPSBwcml2LT5jb250cm9sX3N0YXRlOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJCSh2b2lkKSBtY3RfdTIzMl9zZXRfbW9kZW1fY3RybChwb3J0LT5zZXJpYWwsIGNvbnRyb2xfc3RhdGUpOwogCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jCmluZGV4IDEwODVhNTcuLjgwZjU5YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGljb24uYwpAQCAtMzE0LDIxICszMTQsMjQgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlc3VsdDsKKwlpbnQgcmVzdWx0LCB3YXNfdGhyb3R0bGVkOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcHJpdi0+dGhyb3R0bGVkID0gZmFsc2U7CisJd2FzX3Rocm90dGxlZCA9IHByaXYtPmFjdHVhbGx5X3Rocm90dGxlZDsKIAlwcml2LT5hY3R1YWxseV90aHJvdHRsZWQgPSBmYWxzZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAlwcml2LT5idWxrX3JlYWRfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsCi0JCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJaWYgKHdhc190aHJvdHRsZWQpIHsKKwkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+YnVsa19yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQpCisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLAogCQkJCQkJCV9fZnVuY19fLCByZXN1bHQpOworCX0KIH0KIAogc3RhdGljIGludCBvcHRpY29uX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IGY2NmUzOTguLmNkNDRjNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKQEAgLTE2NSw2ICsxNjUsNyBAQAogI2RlZmluZSBIVUFXRUlfUFJPRFVDVF9FMTQzRAkJCTB4MTQzRAogI2RlZmluZSBIVUFXRUlfUFJPRFVDVF9FMTQzRQkJCTB4MTQzRQogI2RlZmluZSBIVUFXRUlfUFJPRFVDVF9FMTQzRgkJCTB4MTQzRgorI2RlZmluZSBIVUFXRUlfUFJPRFVDVF9FMTRBQwkJCTB4MTRBQwogCiAjZGVmaW5lIFFVQU5UQV9WRU5ET1JfSUQJCQkweDA0MDgKICNkZWZpbmUgUVVBTlRBX1BST0RVQ1RfUTEwMQkJCTB4RUEwMgpAQCAtMzE0LDEwICszMTUsMTQgQEAKICNkZWZpbmUgUUlTREFfUFJPRFVDVF9IMjBfNDUxNQkJCTB4NDUxNQogI2RlZmluZSBRSVNEQV9QUk9EVUNUX0gyMF80NTE5CQkJMHg0NTE5CiAKKy8qIFRMQVlURUNIIFBST0RVQ1RTICovCisjZGVmaW5lIFRMQVlURUNIX1ZFTkRPUl9JRAkJCTB4MjBCOQorI2RlZmluZSBUTEFZVEVDSF9QUk9EVUNUX1RFVTgwMAkJCTB4MTY4MgogCiAvKiBUT1NISUJBIFBST0RVQ1RTICovCiAjZGVmaW5lIFRPU0hJQkFfVkVORE9SX0lECQkJMHgwOTMwCiAjZGVmaW5lIFRPU0hJQkFfUFJPRFVDVF9IU0RQQV9NSU5JQ0FSRAkJMHgxMzAyCisjZGVmaW5lIFRPU0hJQkFfUFJPRFVDVF9HNDUwCQkJMHgwZDQ1CiAKICNkZWZpbmUgQUxJTktfVkVORE9SX0lECQkJCTB4MWUwZQogI2RlZmluZSBBTElOS19QUk9EVUNUXzNHVQkJCTB4OTIwMApAQCAtMzI2LDYgKzMzMSw5IEBACiAjZGVmaW5lIEFMQ0FURUxfVkVORE9SX0lECQkJMHgxYmJiCiAjZGVmaW5lIEFMQ0FURUxfUFJPRFVDVF9YMDYwUwkJCTB4MDAwMAogCisvKiBBaXJwbHVzIHByb2R1Y3RzICovCisjZGVmaW5lIEFJUlBMVVNfVkVORE9SX0lECQkJMHgxMDExCisjZGVmaW5lIEFJUlBMVVNfUFJPRFVDVF9NQ0Q2NTAJCQkweDMxOTgKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG9wdGlvbl9pZHNbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoT1BUSU9OX1ZFTkRPUl9JRCwgT1BUSU9OX1BST0RVQ1RfQ09MVCkgfSwKQEAgLTQyNCw2ICs0MzIsNyBAQAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oSFVBV0VJX1ZFTkRPUl9JRCwgSFVBV0VJX1BST0RVQ1RfRTE0M0QsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhIVUFXRUlfVkVORE9SX0lELCBIVUFXRUlfUFJPRFVDVF9FMTQzRSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEhVQVdFSV9WRU5ET1JfSUQsIEhVQVdFSV9QUk9EVUNUX0UxNDNGLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRShIVUFXRUlfVkVORE9SX0lELCBIVUFXRUlfUFJPRFVDVF9FMTRBQykgfSwKIAl7IFVTQl9ERVZJQ0UoQU1PSV9WRU5ET1JfSUQsIEFNT0lfUFJPRFVDVF85NTA4KSB9LAogCXsgVVNCX0RFVklDRShOT1ZBVEVMV0lSRUxFU1NfVkVORE9SX0lELCBOT1ZBVEVMV0lSRUxFU1NfUFJPRFVDVF9WNjQwKSB9LCAvKiBOb3ZhdGVsIE1lcmxpbiBWNjQwL1hWNjIwICovCiAJeyBVU0JfREVWSUNFKE5PVkFURUxXSVJFTEVTU19WRU5ET1JfSUQsIE5PVkFURUxXSVJFTEVTU19QUk9EVUNUX1Y2MjApIH0sIC8qIE5vdmF0ZWwgTWVybGluIFY2MjAvUzYyMCAqLwpAQCAtNTgxLDEwICs1OTAsMTMgQEAKIAl7IFVTQl9ERVZJQ0UoUUlTREFfVkVORE9SX0lELCBRSVNEQV9QUk9EVUNUX0gyMV80NTIzKSB9LAogCXsgVVNCX0RFVklDRShRSVNEQV9WRU5ET1JfSUQsIFFJU0RBX1BST0RVQ1RfSDIwXzQ1MTUpIH0sCiAJeyBVU0JfREVWSUNFKFFJU0RBX1ZFTkRPUl9JRCwgUUlTREFfUFJPRFVDVF9IMjBfNDUxOSkgfSwKKwl7IFVTQl9ERVZJQ0UoVE9TSElCQV9WRU5ET1JfSUQsIFRPU0hJQkFfUFJPRFVDVF9HNDUwKSB9LAogCXsgVVNCX0RFVklDRShUT1NISUJBX1ZFTkRPUl9JRCwgVE9TSElCQV9QUk9EVUNUX0hTRFBBX01JTklDQVJEICkgfSwgLyogVG9zaGliYSAzRyBIU0RQQSA9PSBOb3ZhdGVsIEV4cGVkaXRlIEVVODcwRCBNaW5pQ2FyZCAqLwogCXsgVVNCX0RFVklDRShBTElOS19WRU5ET1JfSUQsIDB4OTAwMCkgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEFMSU5LX1ZFTkRPUl9JRCwgQUxJTktfUFJPRFVDVF8zR1UsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFKEFMQ0FURUxfVkVORE9SX0lELCBBTENBVEVMX1BST0RVQ1RfWDA2MFMpIH0sCisJeyBVU0JfREVWSUNFKEFJUlBMVVNfVkVORE9SX0lELCBBSVJQTFVTX1BST0RVQ1RfTUNENjUwKSB9LAorCXsgVVNCX0RFVklDRShUTEFZVEVDSF9WRU5ET1JfSUQsIFRMQVlURUNIX1BST0RVQ1RfVEVVODAwKSB9LAogCXsgfSAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBvcHRpb25faWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vdGk2ODU4LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3RpNjg1OC5jCmluZGV4IDBmNGE3MGNlLi5jNjQ0ZTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3RpNjg1OC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vdGk2ODU4LmMKQEAgLTI4OCw3ICsyODgsNyBAQAogCiAJZGJnKCIlcygpOiBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIiLCBfX2Z1bmNfXyk7CiAJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Ci0JcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzKCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIgogCQkJCSIgd2l0aCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CkBAIC0zMzUsNyArMzM1LDcgQEAKIAogCQlkYmcoIiVzKCk6IHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiIsIF9fZnVuY19fKTsKIAkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Ci0JCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOworCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfTk9JTyk7CiAJCWlmIChyZXN1bHQgIT0gMCkgewogCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiCiAJCQkJIiB3aXRoIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKQEAgLTM0OSw3ICszNDksNyBAQAogCiAJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gY291bnQ7CiAJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOworCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX05PSU8pOwogCWlmIChyZXN1bHQgIT0gMCkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcygpOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCIKIAkJCSAgICAgICAiIHdpdGggZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCmluZGV4IDExMjhlMDEuLjllYzFhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKQEAgLTEwNDYsMTMgKzEwNDYsMTUgQEAKIAkvKiBvdmVycnVuIGlzIHNwZWNpYWwsIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBjaGFyICovCiAJaWYgKGxpbmVfc3RhdHVzICYgVUFSVF9PVkVSUlVOX0VSUk9SKQogCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKLQlpZiAocG9ydC0+Y29uc29sZSAmJiBwb3J0LT5zeXNycSkgeworCisJaWYgKHR0eV9mbGFnID09IFRUWV9OT1JNQUwgJiYgIShwb3J0LT5jb25zb2xlICYmIHBvcnQtPnN5c3JxKSkKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJZWxzZSB7CiAJCWludCBpOwogCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyArK2kpCiAJCQlpZiAoIXVzYl9zZXJpYWxfaGFuZGxlX3N5c3JxX2NoYXIodHR5LCBwb3J0LCBkYXRhW2ldKSkKIAkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbaV0sIHR0eV9mbGFnKTsKLQl9IGVsc2UKLQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJfQogCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYwppbmRleCA2OGZhMGU0Li41MDE5MzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCkBAIC0xNyw3ICsxNyw3IEBACiAgIFdob20gYmFzZWQgaGlzIG9uIHRoZSBLZXlzcGFuIGRyaXZlciBieSBIdWdoIEJsZW1pbmdzIDxodWdoQGJsZW1pbmdzLm9yZz4KICovCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYuMS4zLjciCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2LjEuMy44IgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJLZXZpbiBMbG95ZCwgRWxpbmEgUGFzaGV2YSwgTWF0dGhldyBTYWZhciwgUm9yeSBGaWxlciIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBEcml2ZXIgZm9yIFNpZXJyYSBXaXJlbGVzcyBVU0IgbW9kZW1zIgogCkBAIC0yOTYsNyArMjk2LDYgQEAKIAlpbnQgZHNyX3N0YXRlOwogCWludCBkY2Rfc3RhdGU7CiAJaW50IHJpX3N0YXRlOwotCiAJdW5zaWduZWQgaW50IG9wZW5lZDoxOwogfTsKIApAQCAtMzA2LDYgKzMwNSw4IEBACiAJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwogCV9fdTE2IGludGVyZmFjZSA9IDA7CiAJaW50IHZhbCA9IDA7CisJaW50IGRvX3NlbmQgPSAwOworCWludCByZXR2YWw7CiAKIAlkZXZfZGJnKCZwb3J0LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCkBAIC0zMjQsMTAgKzMyNSw3IEBACiAJCSAqLwogCQlpZiAocG9ydC0+aW50ZXJydXB0X2luX3VyYikgewogCQkJLyogc2VuZCBjb250cm9sIG1lc3NhZ2UgKi8KLQkJCXJldHVybiB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsCi0JCQkJdXNiX3JjdmN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKLQkJCQkweDIyLCAweDIxLCB2YWwsIGludGVyZmFjZSwKLQkJCQlOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJCQlkb19zZW5kID0gMTsKIAkJfQogCX0KIApAQCAtMzM5LDEyICszMzcsMTggQEAKIAkJCWludGVyZmFjZSA9IDE7CiAJCWVsc2UgaWYgKHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyA9PSA1KQogCQkJaW50ZXJmYWNlID0gMjsKLQkJcmV0dXJuIHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwKLQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQkweDIyLCAweDIxLCB2YWwsIGludGVyZmFjZSwKLQkJCU5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKworCQlkb19zZW5kID0gMTsKIAl9Ci0JcmV0dXJuIDA7CisJaWYgKCFkb19zZW5kKQorCQlyZXR1cm4gMDsKKworCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzZXJpYWwtPmludGVyZmFjZSk7CisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2JfcmN2Y3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAorCQkweDIyLCAweDIxLCB2YWwsIGludGVyZmFjZSwgTlVMTCwgMCwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzZXJpYWwtPmludGVyZmFjZSk7CisKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgdm9pZCBzaWVycmFfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKQEAgLTc3Myw4ICs3NzcsMTEgQEAKIAogCWlmIChzZXJpYWwtPmRldikgewogCQltdXRleF9sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOwotCQlpZiAoIXNlcmlhbC0+ZGlzY29ubmVjdGVkKQorCQlpZiAoIXNlcmlhbC0+ZGlzY29ubmVjdGVkKSB7CisJCQlzZXJpYWwtPmludGVyZmFjZS0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7CisJCQl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoc2VyaWFsLT5pbnRlcmZhY2UpOwogCQkJc2llcnJhX3NlbmRfc2V0dXAocG9ydCk7CisJCX0KIAkJbXV0ZXhfdW5sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOwogCQlzcGluX2xvY2tfaXJxKCZpbnRmZGF0YS0+c3VzcF9sb2NrKTsKIAkJcG9ydGRhdGEtPm9wZW5lZCA9IDA7CkBAIC03ODgsOCArNzk1LDYgQEAKIAkJCXNpZXJyYV9yZWxlYXNlX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tpXSk7CiAJCQlwb3J0ZGF0YS0+aW5fdXJic1tpXSA9IE5VTEw7CiAJCX0KLQkJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHNlcmlhbC0+aW50ZXJmYWNlKTsKLQkJc2VyaWFsLT5pbnRlcmZhY2UtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOwogCX0KIH0KIApAQCAtODI3LDYgKzgzMiw4IEBACiAJaWYgKGVycikgewogCQkvKiBnZXQgcmlkIG9mIGV2ZXJ5dGhpbmcgYXMgaW4gY2xvc2UgKi8KIAkJc2llcnJhX2Nsb3NlKHBvcnQpOworCQkvKiByZXN0b3JlIGJhbGFuY2UgZm9yIGF1dG9wbSAqLworCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc2VyaWFsLT5pbnRlcmZhY2UpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlzaWVycmFfc2VuZF9zZXR1cChwb3J0KTsKQEAgLTkxMiw5ICs5MTksMTAgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyB2b2lkIHN0b3BfcmVhZF93cml0ZV91cmJzKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JaW50IGksIGo7CisJaW50IGk7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKQEAgLTkyMiw4ICs5MzAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCQlmb3IgKGogPSAwOyBqIDwgTl9JTl9VUkI7IGorKykKLQkJCXVzYl9raWxsX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tqXSk7CisJCXNpZXJyYV9zdG9wX3J4X3VyYnMocG9ydCk7CiAJCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJnBvcnRkYXRhLT5hY3RpdmUpOwogCX0KIH0KQEAgLTk4OCw2ICs5OTUsMTAgQEAKIAogCXJldHVybiBlYyA/IC1FSU8gOiAwOwogfQorI2Vsc2UKKyNkZWZpbmUgc2llcnJhX3N1c3BlbmQgTlVMTAorI2RlZmluZSBzaWVycmFfcmVzdW1lIE5VTEwKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIHNpZXJyYV9kZXZpY2UgPSB7CiAJLmRyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zeW1ib2xzZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zeW1ib2xzZXJpYWwuYwppbmRleCBjYjdlOTVmLi5iMjgyYzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3ltYm9sc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3N5bWJvbHNlcmlhbC5jCkBAIC0xNjUsMzQgKzE2NSwzNiBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBzeW1ib2xfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwogCXByaXYtPnRocm90dGxlZCA9IHRydWU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIHN5bWJvbF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHN5bWJvbF9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlc3VsdDsKKwlib29sIHdhc190aHJvdHRsZWQ7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKIAlwcml2LT50aHJvdHRsZWQgPSBmYWxzZTsKKwl3YXNfdGhyb3R0bGVkID0gcHJpdi0+YWN0dWFsbHlfdGhyb3R0bGVkOwogCXByaXYtPmFjdHVhbGx5X3Rocm90dGxlZCA9IGZhbHNlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCiAJcHJpdi0+aW50X3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Ci0JcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+aW50X3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJlc3VsdCkKLQkJZGV2X2VycigmcG9ydC0+ZGV2LAotCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLAorCWlmICh3YXNfdGhyb3R0bGVkKSB7CisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPmludF91cmIsIEdGUF9LRVJORUwpOworCQlpZiAocmVzdWx0KQorCQkJZGV2X2VycigmcG9ydC0+ZGV2LAorCQkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKIAkJCQkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgc3ltYm9sX3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCmluZGV4IGZmNzVhMzUuLmJkM2ZhN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwpAQCAtMTU2LDcgKzE1Niw4IEBACiAJaWYgKHNlcmlhbC0+bWlub3IgIT0gU0VSSUFMX1RUWV9OT19NSU5PUikKIAkJcmV0dXJuX3NlcmlhbChzZXJpYWwpOwogCi0Jc2VyaWFsLT50eXBlLT5yZWxlYXNlKHNlcmlhbCk7CisJaWYgKHNlcmlhbC0+YXR0YWNoZWQpCisJCXNlcmlhbC0+dHlwZS0+cmVsZWFzZShzZXJpYWwpOwogCiAJLyogTm93IHRoYXQgbm90aGluZyBpcyB1c2luZyB0aGUgcG9ydHMsIHRoZXkgY2FuIGJlIGZyZWVkICovCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRfcG9pbnRlcnM7ICsraSkgewpAQCAtMTkyLDcgKzE5Myw3IEBACiAgKiBUaGlzIGlzIHRoZSBmaXJzdCBwbGFjZSBhIG5ldyB0dHkgZ2V0cyB1c2VkLiAgSGVuY2UgdGhpcyBpcyB3aGVyZSB3ZQogICogYWNxdWlyZSByZWZlcmVuY2VzIHRvIHRoZSB1c2Jfc2VyaWFsIHN0cnVjdHVyZSBhbmQgdGhlIGRyaXZlciBtb2R1bGUsCiAgKiB3aGVyZSB3ZSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHBvcnQsIGFuZCB3aGVyZSB3ZSBkbyBhbiBhdXRvcmVzdW1lLgotICogQWxsIHRoZXNlIGFjdGlvbnMgYXJlIHJldmVyc2VkIGluIHNlcmlhbF9yZWxlYXNlKCkuCisgKiBBbGwgdGhlc2UgYWN0aW9ucyBhcmUgcmV2ZXJzZWQgaW4gc2VyaWFsX2NsZWFudXAoKS4KICAqLwogc3RhdGljIGludCBzZXJpYWxfaW5zdGFsbChzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewpAQCAtMzM5LDE1ICszNDAsMTYgQEAKIH0KIAogLyoqCi0gKiBzZXJpYWxfcmVsZWFzZSAtIGZyZWUgcmVzb3VyY2VzIHBvc3QgY2xvc2UvaGFuZ3VwCisgKiBzZXJpYWxfY2xlYW51cCAtIGZyZWUgcmVzb3VyY2VzIHBvc3QgY2xvc2UvaGFuZ3VwCiAgKiBAcG9ydDogcG9ydCB0byBmcmVlIHVwCiAgKgogICogRG8gdGhlIHJlc291cmNlIGZyZWVpbmcgYW5kIHJlZmNvdW50IGRyb3BwaW5nIGZvciB0aGUgcG9ydC4KICAqIEF2b2lkIGZyZWVpbmcgdGhlIGNvbnNvbGUuCiAgKgotICogQ2FsbGVkIHdoZW4gdGhlIGxhc3QgdHR5IGtyZWYgaXMgZHJvcHBlZC4KKyAqIENhbGxlZCBhc3luY2hyb25vdXNseSBhZnRlciB0aGUgbGFzdCB0dHkga3JlZiBpcyBkcm9wcGVkLAorICogYW5kIHRoZSB0dHkgbGF5ZXIgaGFzIGFscmVhZHkgZG9uZSB0aGUgdHR5X3NodXRkb3duKHR0eSk7CiAgKi8KLXN0YXRpYyB2b2lkIHNlcmlhbF9yZWxlYXNlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCitzdGF0aWMgdm9pZCBzZXJpYWxfY2xlYW51cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWw7CkBAIC0zNjEsOSArMzYzLDYgQEAKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKLQkvKiBTdGFuZGFyZCBzaHV0ZG93biBwcm9jZXNzaW5nICovCi0JdHR5X3NodXRkb3duKHR0eSk7Ci0KIAl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKIAogCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKQEAgLTEwNjEsMTIgKzEwNjAsMTUgQEAKIAkJbW9kdWxlX3B1dCh0eXBlLT5kcml2ZXIub3duZXIpOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCWdvdG8gcHJvYmVfZXJyb3I7CisJCXNlcmlhbC0+YXR0YWNoZWQgPSAxOwogCQlpZiAocmV0dmFsID4gMCkgewogCQkJLyogcXVpZXRseSBhY2NlcHQgdGhpcyBkZXZpY2UsIGJ1dCBkb24ndCBiaW5kIHRvIGEKIAkJCSAgIHNlcmlhbCBwb3J0IGFzIGl0J3MgYWJvdXQgdG8gZGlzYXBwZWFyICovCiAJCQlzZXJpYWwtPm51bV9wb3J0cyA9IDA7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KKwl9IGVsc2UgeworCQlzZXJpYWwtPmF0dGFjaGVkID0gMTsKIAl9CiAKIAlpZiAoZ2V0X2ZyZWVfc2VyaWFsKHNlcmlhbCwgbnVtX3BvcnRzLCAmbWlub3IpID09IE5VTEwpIHsKQEAgLTExNjYsOCArMTE2OCwxMCBAQAogCiAJaWYgKHNlcmlhbC0+dHlwZS0+c3VzcGVuZCkgewogCQlyID0gc2VyaWFsLT50eXBlLT5zdXNwZW5kKHNlcmlhbCwgbWVzc2FnZSk7Ci0JCWlmIChyIDwgMCkKKwkJaWYgKHIgPCAwKSB7CisJCQlzZXJpYWwtPnN1c3BlbmRpbmcgPSAwOwogCQkJZ290byBlcnJfb3V0OworCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKQEAgLTEyMTAsNyArMTIxNCw3IEBACiAJLmNoYXJzX2luX2J1ZmZlciA9CXNlcmlhbF9jaGFyc19pbl9idWZmZXIsCiAJLnRpb2NtZ2V0ID0JCXNlcmlhbF90aW9jbWdldCwKIAkudGlvY21zZXQgPQkJc2VyaWFsX3Rpb2Ntc2V0LAotCS5zaHV0ZG93biA9IAkJc2VyaWFsX3JlbGVhc2UsCisJLmNsZWFudXAgPSAJCXNlcmlhbF9jbGVhbnVwLAogCS5pbnN0YWxsID0gCQlzZXJpYWxfaW5zdGFsbCwKIAkucHJvY19mb3BzID0JCSZzZXJpYWxfcHJvY19mb3BzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3Zpc29yLmMKaW5kZXggMWFhNWQyMC4uYWQxZjkyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3Zpc29yLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3Zpc29yLmMKQEAgLTUxMyw3ICs1MTMsOCBAQAogCQkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJCX0KIAkJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKLQkJcHJpdi0+Ynl0ZXNfaW4gKz0gYXZhaWxhYmxlX3Jvb207CisJCWlmICh0dHkpCisJCQlwcml2LT5ieXRlc19pbiArPSBhdmFpbGFibGVfcm9vbTsKIAogCX0gZWxzZSB7CiAJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CkBAIC01ODIsMTIgKzU4MywxMSBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB2aXNvcl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJcHJpdi0+dGhyb3R0bGVkID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKIH0KIAogCkBAIC01OTUsMjEgKzU5NSwyMyBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB2aXNvcl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlc3VsdDsKKwlpbnQgcmVzdWx0LCB3YXNfdGhyb3R0bGVkOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwogCXByaXYtPnRocm90dGxlZCA9IDA7CisJd2FzX3Rocm90dGxlZCA9IHByaXYtPmFjdHVhbGx5X3Rocm90dGxlZDsKIAlwcml2LT5hY3R1YWxseV90aHJvdHRsZWQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCi0JcG9ydC0+cmVhZF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwotCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmVzdWx0KQotCQlkZXZfZXJyKCZwb3J0LT5kZXYsCi0JCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJaWYgKHdhc190aHJvdHRsZWQpIHsKKwkJcG9ydC0+cmVhZF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXN1bHQpCisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLAogCQkJCQkJCV9fZnVuY19fLCByZXN1bHQpOworCX0KIH0KIAogc3RhdGljIGludCBwYWxtX29zXzNfcHJvYmUoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwppbmRleCA2MjQyNGVlLi4xMDkzZDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCkBAIC05NDksMTMgKzk0OSwxMiBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB3aGl0ZWhlYXRfcHJpdmF0ZSAqaW5mbyA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmaW5mby0+bG9jayk7CiAJaW5mby0+ZmxhZ3MgfD0gVEhST1RUTEVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJmluZm8tPmxvY2spOwogCiAJcmV0dXJuOwogfQpAQCAtOTY2LDE0ICs5NjUsMTMgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUgKmluZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IGFjdHVhbGx5X3Rocm90dGxlZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmaW5mby0+bG9jayk7CiAJYWN0dWFsbHlfdGhyb3R0bGVkID0gaW5mby0+ZmxhZ3MgJiBBQ1RVQUxMWV9USFJPVFRMRUQ7CiAJaW5mby0+ZmxhZ3MgJj0gfihUSFJPVFRMRUQgfCBBQ1RVQUxMWV9USFJPVFRMRUQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJmluZm8tPmxvY2spOwogCiAJaWYgKGFjdHVhbGx5X3Rocm90dGxlZCkKIAkJcnhfZGF0YV9zb2Z0aW50KCZpbmZvLT5yeF93b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IGUyMGRjNTIuLjU4OWY2YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtNjk2LDcgKzY5Niw3IEBACiAJCS8qIGRldmljZSBzdXBwb3J0cyBhbmQgbmVlZHMgYmlnZ2VyIHNlbnNlIGJ1ZmZlciAqLwogCQlpZiAodXMtPmZmbGFncyAmIFVTX0ZMX1NBTkVfU0VOU0UpCiAJCQlzZW5zZV9zaXplID0gfjA7Ci0KK1JldHJ5X1NlbnNlOgogCQlVU19ERUJVR1AoIklzc3VpbmcgYXV0by1SRVFVRVNUX1NFTlNFXG4iKTsKIAogCQlzY3NpX2VoX3ByZXBfY21uZChzcmIsICZzZXMsIE5VTEwsIDAsIHNlbnNlX3NpemUpOwpAQCAtNzIwLDYgKzcyMCwyMSBAQAogCQkJc3JiLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CiAJCQlnb3RvIEhhbmRsZV9FcnJvcnM7CiAJCX0KKworCQkvKiBTb21lIGRldmljZXMgY2xhaW0gdG8gc3VwcG9ydCBsYXJnZXIgc2Vuc2UgYnV0IGZhaWwgd2hlbgorCQkgKiB0cnlpbmcgdG8gcmVxdWVzdCBpdC4gV2hlbiBhIHRyYW5zcG9ydCBmYWlsdXJlIGhhcHBlbnMKKwkJICogdXNpbmcgVVNfRlNfU0FORV9TRU5TRSwgd2UgYWx3YXlzIHJldHJ5IHdpdGggYSBzdGFuZGFyZAorCQkgKiAoc21hbGwpIHNlbnNlIHJlcXVlc3QuIFRoaXMgZml4ZXMgc29tZSBVU0IgR1NNIG1vZGVtcworCQkgKi8KKwkJaWYgKHRlbXBfcmVzdWx0ID09IFVTQl9TVE9SX1RSQU5TUE9SVF9GQUlMRUQgJiYKKwkJICAgICh1cy0+ZmZsYWdzICYgVVNfRkxfU0FORV9TRU5TRSkgJiYKKwkJICAgIHNlbnNlX3NpemUgIT0gVVNfU0VOU0VfU0laRSkgeworCQkJVVNfREVCVUdQKCItLSBhdXRvLXNlbnNlIGZhaWx1cmUsIHJldHJ5IHNtYWxsIHNlbnNlXG4iKTsKKwkJCXNlbnNlX3NpemUgPSBVU19TRU5TRV9TSVpFOworCQkJZ290byBSZXRyeV9TZW5zZTsKKwkJfQorCisJCS8qIE90aGVyIGZhaWx1cmVzICovCiAJCWlmICh0ZW1wX3Jlc3VsdCAhPSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCkgewogCQkJVVNfREVCVUdQKCItLSBhdXRvLXNlbnNlIGZhaWx1cmVcbiIpOwogCkBAIC03NjgsMTcgKzc4MywzMiBAQAogCQkvKiBzZXQgdGhlIHJlc3VsdCBzbyB0aGUgaGlnaGVyIGxheWVycyBleHBlY3QgdGhpcyBkYXRhICovCiAJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCi0JCS8qIElmIHRoaW5ncyBhcmUgcmVhbGx5IG9rYXksIHRoZW4gbGV0J3Mgc2hvdyB0aGF0LiAgWmVybwotCQkgKiBvdXQgdGhlIHNlbnNlIGJ1ZmZlciBzbyB0aGUgaGlnaGVyIGxheWVycyB3b24ndCByZWFsaXplCi0JCSAqIHdlIGRpZCBhbiB1bnNvbGljaXRlZCBhdXRvLXNlbnNlLiAqLwotCQlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EICYmCi0JCQkvKiBGaWxlbWFyayAwLCBpZ25vcmUgRU9NLCBJTEkgMCwgbm8gc2Vuc2UgKi8KKwkJLyogV2Ugb2Z0ZW4gZ2V0IGVtcHR5IHNlbnNlIGRhdGEuICBUaGlzIGNvdWxkIGluZGljYXRlIHRoYXQKKwkJICogZXZlcnl0aGluZyB3b3JrZWQgb3IgdGhhdCB0aGVyZSB3YXMgYW4gdW5zcGVjaWZpZWQKKwkJICogcHJvYmxlbS4gIFdlIGhhdmUgdG8gZGVjaWRlIHdoaWNoLgorCQkgKi8KKwkJaWYgKAkvKiBGaWxlbWFyayAwLCBpZ25vcmUgRU9NLCBJTEkgMCwgbm8gc2Vuc2UgKi8KIAkJCQkoc3JiLT5zZW5zZV9idWZmZXJbMl0gJiAweGFmKSA9PSAwICYmCiAJCQkvKiBObyBBU0Mgb3IgQVNDUSAqLwogCQkJCXNyYi0+c2Vuc2VfYnVmZmVyWzEyXSA9PSAwICYmCiAJCQkJc3JiLT5zZW5zZV9idWZmZXJbMTNdID09IDApIHsKLQkJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKLQkJCXNyYi0+c2Vuc2VfYnVmZmVyWzBdID0gMHgwOworCisJCQkvKiBJZiB0aGluZ3MgYXJlIHJlYWxseSBva2F5LCB0aGVuIGxldCdzIHNob3cgdGhhdC4KKwkJCSAqIFplcm8gb3V0IHRoZSBzZW5zZSBidWZmZXIgc28gdGhlIGhpZ2hlciBsYXllcnMKKwkJCSAqIHdvbid0IHJlYWxpemUgd2UgZGlkIGFuIHVuc29saWNpdGVkIGF1dG8tc2Vuc2UuCisJCQkgKi8KKwkJCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0QpIHsKKwkJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CisJCQkJc3JiLT5zZW5zZV9idWZmZXJbMF0gPSAweDA7CisKKwkJCS8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0sIHJlcG9ydCBhbiB1bnNwZWNpZmllZAorCQkJICogaGFyZHdhcmUgZXJyb3IgdG8gcHJldmVudCB0aGUgaGlnaGVyIGxheWVycyBmcm9tCisJCQkgKiBlbnRlcmluZyBhbiBpbmZpbml0ZSByZXRyeSBsb29wLgorCQkJICovCisJCQl9IGVsc2UgeworCQkJCXNyYi0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJCXNyYi0+c2Vuc2VfYnVmZmVyWzJdID0gSEFSRFdBUkVfRVJST1I7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IDA3OWFlMGYuLmQ0ZjAzNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMTgyMyw2ICsxODIzLDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfUkVTSURVRSApLAogCisvKiBSZXBvcnRlZCBieSBTZXJnZXkgUGluYWV2IDxkZm9AYW50ZXgucnU+ICovCitVTlVTVUFMX0RFViggIDB4NDEwMiwgMHgxMDU5LCAweDAwMDAsICAweDAwMDAsCisgICAgICAgICAgICAgICAiaVJpdmVyIiwKKyAgICAgICAgICAgICAgICJQN0siLAorICAgICAgICAgICAgICAgVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisgICAgICAgICAgICAgICBVU19GTF9NQVhfU0VDVE9SU182NCApLAorCiAvKgogICogRGF2aWQgSMOkcmRlbWFuIDxkYXZpZEAyZ2VuLmNvbT4KICAqIFRoZSBrZXkgbWFrZXMgdGhlIFNDU0kgc3RhY2sgcHJpbnQgY29uZnVzaW5nIChidXQgaGFybWxlc3MpIG1lc3NhZ2VzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvc2VjdXJpdHkuYwppbmRleCBiMmYxNDlmLi40NTE2YzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMKQEAgLTIwMCwzNSArMjAwLDQwIEBACiB7CiAJaW50IHJlc3VsdCwgYnl0ZXMsIHNlY2Rfc2l6ZTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXNiX2Rldi0+ZGV2OwotCXN0cnVjdCB1c2Jfc2VjdXJpdHlfZGVzY3JpcHRvciBzZWNkOworCXN0cnVjdCB1c2Jfc2VjdXJpdHlfZGVzY3JpcHRvciAqc2VjZDsKIAljb25zdCBzdHJ1Y3QgdXNiX2VuY3J5cHRpb25fZGVzY3JpcHRvciAqZXRkLCAqY2NtMV9ldGQgPSBOVUxMOwotCXZvaWQgKnNlY2RfYnVmOwogCWNvbnN0IHZvaWQgKml0ciwgKnRvcDsKIAljaGFyIGJ1Zls2NF07CiAKKwlzZWNkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9zZWN1cml0eV9kZXNjcmlwdG9yKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlY2QgPT0gTlVMTCkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKIAlyZXN1bHQgPSB1c2JfZ2V0X2Rlc2NyaXB0b3IodXNiX2RldiwgVVNCX0RUX1NFQ1VSSVRZLAotCQkJCSAgICAwLCAmc2VjZCwgc2l6ZW9mKHNlY2QpKTsKKwkJCQkgICAgMCwgc2VjZCwgc2l6ZW9mKHN0cnVjdCB1c2Jfc2VjdXJpdHlfZGVzY3JpcHRvcikpOwogCWlmIChyZXN1bHQgPCBzaXplb2Yoc2VjZCkpIHsKIAkJZGV2X2VycihkZXYsICJDYW4ndCByZWFkIHNlY3VyaXR5IGRlc2NyaXB0b3Igb3IgIgogCQkJIm5vdCBlbm91Z2ggZGF0YTogJWRcbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyb3Jfc2VjZDsKKwkJZ290byBvdXQ7CiAJfQotCXNlY2Rfc2l6ZSA9IGxlMTZfdG9fY3B1KHNlY2Qud1RvdGFsTGVuZ3RoKTsKLQlzZWNkX2J1ZiA9IGttYWxsb2Moc2VjZF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2VjZF9idWYgPT0gTlVMTCkgeworCXNlY2Rfc2l6ZSA9IGxlMTZfdG9fY3B1KHNlY2QtPndUb3RhbExlbmd0aCk7CisJc2VjZCA9IGtyZWFsbG9jKHNlY2QsIHNlY2Rfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlY2QgPT0gTlVMTCkgewogCQlkZXZfZXJyKGRldiwgIkNhbid0IGFsbG9jYXRlIHNwYWNlIGZvciBzZWN1cml0eSBkZXNjcmlwdG9yc1xuIik7Ci0JCWdvdG8gZXJyb3Jfc2VjZF9hbGxvYzsKKwkJZ290byBvdXQ7CiAJfQogCXJlc3VsdCA9IHVzYl9nZXRfZGVzY3JpcHRvcih1c2JfZGV2LCBVU0JfRFRfU0VDVVJJVFksCi0JCQkJICAgIDAsIHNlY2RfYnVmLCBzZWNkX3NpemUpOworCQkJCSAgICAwLCBzZWNkLCBzZWNkX3NpemUpOwogCWlmIChyZXN1bHQgPCBzZWNkX3NpemUpIHsKIAkJZGV2X2VycihkZXYsICJDYW4ndCByZWFkIHNlY3VyaXR5IGRlc2NyaXB0b3Igb3IgIgogCQkJIm5vdCBlbm91Z2ggZGF0YTogJWRcbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyb3Jfc2VjZF9hbGw7CisJCWdvdG8gb3V0OwogCX0KIAlieXRlcyA9IDA7Ci0JaXRyID0gc2VjZF9idWYgKyBzaXplb2Yoc2VjZCk7Ci0JdG9wID0gc2VjZF9idWYgKyByZXN1bHQ7CisJaXRyID0gJnNlY2RbMV07CisJdG9wID0gKHZvaWQgKilzZWNkICsgcmVzdWx0OwogCXdoaWxlIChpdHIgPCB0b3ApIHsKIAkJZXRkID0gaXRyOwogCQlpZiAodG9wIC0gaXRyIDwgc2l6ZW9mKCpldGQpKSB7CkBAIC0yNTksMjQgKzI2NCwxNiBAQAogCQlkZXZfZXJyKGRldiwgIldVU0IgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBDQ00xIGVuY3J5cHRpb24sICIKIAkJCSJjYW4ndCB1c2UhXG4iKTsKIAkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcl9ub19jY20xOworCQlnb3RvIG91dDsKIAl9CiAJd3VzYl9kZXYtPmNjbTFfZXRkID0gKmNjbTFfZXRkOwogCWRldl9kYmcoZGV2LCAic3VwcG9ydGVkIGVuY3J5cHRpb246ICVzOyB1c2luZyAlcyAoMHglMDJ4LyUwMngpXG4iLAogCQlidWYsIHd1c2JfZXRfbmFtZShjY20xX2V0ZC0+YkVuY3J5cHRpb25UeXBlKSwKIAkJY2NtMV9ldGQtPmJFbmNyeXB0aW9uVmFsdWUsIGNjbTFfZXRkLT5iQXV0aEtleUluZGV4KTsKIAlyZXN1bHQgPSAwOwotCWtmcmVlKHNlY2RfYnVmKTsKIG91dDoKKwlrZnJlZShzZWNkKTsKIAlyZXR1cm4gcmVzdWx0OwotCi0KLWVycm9yX25vX2NjbTE6Ci1lcnJvcl9zZWNkX2FsbDoKLQlrZnJlZShzZWNkX2J1Zik7Ci1lcnJvcl9zZWNkX2FsbG9jOgotZXJyb3Jfc2VjZDoKLQlnb3RvIG91dDsKIH0KIAogdm9pZCB3dXNiX2Rldl9zZWNfcm0oc3RydWN0IHd1c2JfZGV2ICp3dXNiX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3V3Yi1kZWJ1Zy5jIGIvZHJpdmVycy91d2IvdXdiLWRlYnVnLmMKaW5kZXggNGE0Mjk5My4uMmVlY2VjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvdXdiLWRlYnVnLmMKKysrIGIvZHJpdmVycy91d2IvdXdiLWRlYnVnLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogCXJldHVybiByZXQgPCAwID8gcmV0IDogbGVuOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb21tYW5kX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb21tYW5kX2ZvcHMgPSB7CiAJLm9wZW4gICA9IGNvbW1hbmRfb3BlbiwKIAkud3JpdGUgID0gY29tbWFuZF93cml0ZSwKIAkucmVhZCAgID0gTlVMTCwKQEAgLTI1NSw3ICsyNTUsNyBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCByZXNlcnZhdGlvbnNfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZXNlcnZhdGlvbnNfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlc2VydmF0aW9uc19mb3BzID0gewogCS5vcGVuICAgID0gcmVzZXJ2YXRpb25zX29wZW4sCiAJLnJlYWQgICAgPSBzZXFfcmVhZCwKIAkubGxzZWVrICA9IHNlcV9sc2VlaywKQEAgLTI4Myw3ICsyODMsNyBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkcnBfYXZhaWxfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkcnBfYXZhaWxfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRycF9hdmFpbF9mb3BzID0gewogCS5vcGVuICAgID0gZHJwX2F2YWlsX29wZW4sCiAJLnJlYWQgICAgPSBzZXFfcmVhZCwKIAkubGxzZWVrICA9IHNlcV9sc2VlaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3doYy1yYy5jIGIvZHJpdmVycy91d2Ivd2hjLXJjLmMKaW5kZXggMWQ5YTZmNS4uMDE5NTBjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2Ivd2hjLXJjLmMKKysrIGIvZHJpdmVycy91d2Ivd2hjLXJjLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKaW5kZXggOTA4NjFjZC4uMDliZmE5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCkBAIC0zMSw2ICszMSwxMyBAQAogCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IHRoZSBMQ0QgcGFuZWxzIHVzdWFsbHkgZm91bmQgb24gU0hBUlAKIAkgIGNvcmdpIChDN3gwKSBhbmQgc3BpdHogKEN4eDAwKSBtb2RlbHMuCiAKK2NvbmZpZyBMQ0RfTE1TMjgzR0YwNQorCXRyaXN0YXRlICJTYW1zdW5nIExNUzI4M0dGMDUgTENEIgorCWRlcGVuZHMgb24gTENEX0NMQVNTX0RFVklDRSAmJiBTUElfTUFTVEVSICYmIEdFTkVSSUNfR1BJTworCWhlbHAKKwkgIFNQSSBkcml2ZXIgZm9yIFNhbXN1bmcgTE1TMjgzR0YwNS4gVGhpcyBwcm92aWRlcyBiYXNpYyBzdXBwb3J0CisJICBmb3IgcG93ZXJpbmcgdGhlIExDRCB1cC9kb3duIHRocm91Z2ggYSBzeXNmcyBpbnRlcmZhY2UuCisKIGNvbmZpZyBMQ0RfTFRWMzUwUVYKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBMVFYzNTBRViBMQ0QgUGFuZWwiCiAJZGVwZW5kcyBvbiBMQ0RfQ0xBU1NfREVWSUNFICYmIFNQSV9NQVNURVIKQEAgLTIyOSwzICsyMzYsMjkgQEAKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIFRhYmxldGtpb3NrIFNhaGFyYSBUb3VjaC1pVCwgc2F5IHkgdG8gZW5hYmxlIHRoZQogCSAgYmFja2xpZ2h0IGRyaXZlci4KKworY29uZmlnIEJBQ0tMSUdIVF9XTTgzMVgKKwl0cmlzdGF0ZSAiV004MzF4IFBNSUMgQmFja2xpZ2h0IERyaXZlciIKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgJiYgTUZEX1dNODMxWAorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgYmFja2xpZ2h0IGRyaXZlbiBieSB0aGUgSVNJTksgYW5kIERDREMgb2YgYQorCSAgV004MzF4IFBNSUMgc2F5IHkgdG8gZW5hYmxlIHRoZSBiYWNrbGlnaHQgZHJpdmVyIGZvciBpdC4KKworY29uZmlnIEJBQ0tMSUdIVF9BRFgKKwl0cmlzdGF0ZSAiQXZpb25pYyBEZXNpZ24gWGFudGhvcyBCYWNrbGlnaHQgRHJpdmVyIgorCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBBUkNIX1BYQV9BRFgKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgdGhlIGJhY2tsaWdodCBkcml2ZXIgb24gQXZpb25pYyBEZXNpZ24gWGFudGhvcy1iYXNlZAorCSAgYm9hcmRzLgorCitjb25maWcgQkFDS0xJR0hUX0FEUDU1MjAKKwl0cmlzdGF0ZSAiQmFja2xpZ2h0IERyaXZlciBmb3IgQURQNTUyMC9BRFA1NTAxIHVzaW5nIFdMRUQiCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFICYmIFBNSUNfQURQNTUyMAorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgTENEIGJhY2tsaWdodCBjb25uZWN0ZWQgdG8gdGhlIEJTVC9CTF9TTksgb3V0cHV0IG9mCisJICBBRFA1NTIwIG9yIEFEUDU1MDEsIHNheSBZIGhlcmUgdG8gZW5hYmxlIHRoaXMgZHJpdmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBhZHA1NTIwX2JsLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCmluZGV4IDRlYjE3OGMuLjlhNDA1NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCkBAIC0zLDYgKzMsNyBAQAogb2JqLSQoQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UpICAgICArPSBsY2Qubwogb2JqLSQoQ09ORklHX0xDRF9DT1JHSSkJCSAgICs9IGNvcmdpX2xjZC5vCiBvYmotJChDT05GSUdfTENEX0hQNzAwKQkJICAgKz0gam9ybmFkYTcyMF9sY2Qubworb2JqLSQoQ09ORklHX0xDRF9MTVMyODNHRjA1KQkgICArPSBsbXMyODNnZjA1Lm8KIG9iai0kKENPTkZJR19MQ0RfTFRWMzUwUVYpCSAgICs9IGx0djM1MHF2Lm8KIG9iai0kKENPTkZJR19MQ0RfSUxJOTMyMCkJICAgKz0gaWxpOTMyMC5vCiBvYmotJChDT05GSUdfTENEX1BMQVRGT1JNKQkgICArPSBwbGF0Zm9ybV9sY2QubwpAQCAtMjQsNCArMjUsNyBAQAogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9NQlBfTlZJRElBKSArPSBtYnBfbnZpZGlhX2JsLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfVE9TQSkJKz0gdG9zYV9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX1NBSEFSQSkJKz0ga2IzODg2X2JsLm8KK29iai0kKENPTkZJR19CQUNLTElHSFRfV004MzFYKQkrPSB3bTgzMXhfYmwubworb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9BRFgpICAgICs9IGFkeF9ibC5vCitvYmotJChDT05GSUdfQkFDS0xJR0hUX0FEUDU1MjApCSs9IGFkcDU1MjBfYmwubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwNWRhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDU1MjBfYmwuYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIEJhY2tsaWdodCBkcml2ZXIgZm9yIEFuYWxvZyBEZXZpY2VzIEFEUDU1MjAvQURQNTUwMSBNRkQgUE1JQ3MKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWRwNTUyMC5oPgorCitzdHJ1Y3QgYWRwNTUyMF9ibCB7CisJc3RydWN0IGRldmljZSAqbWFzdGVyOworCXN0cnVjdCBhZHA1NTIwX2JhY2tsaWdodF9wbGF0ZnJvbV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1bnNpZ25lZCBsb25nIGNhY2hlZF9kYXlsaWdodF9tYXg7CisJaW50IGlkOworCWludCBjdXJyZW50X2JyaWdodG5lc3M7Cit9OworCitzdGF0aWMgaW50IGFkcDU1MjBfYmxfc2V0KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCwgaW50IGJyaWdodG5lc3MpCit7CisJc3RydWN0IGFkcDU1MjBfYmwgKmRhdGEgPSBibF9nZXRfZGF0YShibCk7CisJc3RydWN0IGRldmljZSAqbWFzdGVyID0gZGF0YS0+bWFzdGVyOworCWludCByZXQgPSAwOworCisJaWYgKGRhdGEtPnBkYXRhLT5lbl9hbWJsX3NlbnMpIHsKKwkJaWYgKChicmlnaHRuZXNzID4gMCkgJiYgKGJyaWdodG5lc3MgPCBBRFA1MDIwX01BWF9CUklHSFRORVNTKSkgeworCQkJLyogRGlzYWJsZSBBbWJpZW50IExpZ2h0IGF1dG8gYWRqdXN0ICovCisJCQlyZXQgfD0gYWRwNTUyMF9jbHJfYml0cyhtYXN0ZXIsIEJMX0NPTlRST0wsCisJCQkJCUJMX0FVVE9fQURKKTsKKwkJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgREFZTElHSFRfTUFYLCBicmlnaHRuZXNzKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBNQVhfQlJJR0hUTkVTUyAtPiBFbmFibGUgQW1iaWVudCBMaWdodCBhdXRvIGFkanVzdAorCQkJICogcmVzdG9yZSBkYXlsaWdodCBsMyBzeXNmcyBicmlnaHRuZXNzCisJCQkgKi8KKwkJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgREFZTElHSFRfTUFYLAorCQkJCQkgZGF0YS0+Y2FjaGVkX2RheWxpZ2h0X21heCk7CisJCQlyZXQgfD0gYWRwNTUyMF9zZXRfYml0cyhtYXN0ZXIsIEJMX0NPTlRST0wsCisJCQkJCSBCTF9BVVRPX0FESik7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIERBWUxJR0hUX01BWCwgYnJpZ2h0bmVzcyk7CisJfQorCisJaWYgKGRhdGEtPmN1cnJlbnRfYnJpZ2h0bmVzcyAmJiBicmlnaHRuZXNzID09IDApCisJCXJldCB8PSBhZHA1NTIwX3NldF9iaXRzKG1hc3RlciwKKwkJCQlNT0RFX1NUQVRVUywgRElNX0VOKTsKKwllbHNlIGlmIChkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgPT0gMCAmJiBicmlnaHRuZXNzKQorCQlyZXQgfD0gYWRwNTUyMF9jbHJfYml0cyhtYXN0ZXIsCisJCQkJTU9ERV9TVEFUVVMsIERJTV9FTik7CisKKwlpZiAoIXJldCkKKwkJZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRwNTUyMF9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlpbnQgYnJpZ2h0bmVzcyA9IGJsLT5wcm9wcy5icmlnaHRuZXNzOworCWlmIChibC0+cHJvcHMucG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJYnJpZ2h0bmVzcyA9IDA7CisKKwlpZiAoYmwtPnByb3BzLmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWJyaWdodG5lc3MgPSAwOworCisJcmV0dXJuIGFkcDU1MjBfYmxfc2V0KGJsLCBicmlnaHRuZXNzKTsKK30KKworc3RhdGljIGludCBhZHA1NTIwX2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlzdHJ1Y3QgYWRwNTUyMF9ibCAqZGF0YSA9IGJsX2dldF9kYXRhKGJsKTsKKwlpbnQgZXJyb3I7CisJdWludDhfdCByZWdfdmFsOworCisJZXJyb3IgPSBhZHA1NTIwX3JlYWQoZGF0YS0+bWFzdGVyLCBCTF9WQUxVRSwgJnJlZ192YWwpOworCisJcmV0dXJuIGVycm9yID8gZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzIDogcmVnX3ZhbDsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGFkcDU1MjBfYmxfb3BzID0geworCS51cGRhdGVfc3RhdHVzCT0gYWRwNTUyMF9ibF91cGRhdGVfc3RhdHVzLAorCS5nZXRfYnJpZ2h0bmVzcwk9IGFkcDU1MjBfYmxfZ2V0X2JyaWdodG5lc3MsCit9OworCitzdGF0aWMgaW50IGFkcDU1MjBfYmxfc2V0dXAoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsKQoreworCXN0cnVjdCBhZHA1NTIwX2JsICpkYXRhID0gYmxfZ2V0X2RhdGEoYmwpOworCXN0cnVjdCBkZXZpY2UgKm1hc3RlciA9IGRhdGEtPm1hc3RlcjsKKwlzdHJ1Y3QgYWRwNTUyMF9iYWNrbGlnaHRfcGxhdGZyb21fZGF0YSAqcGRhdGEgPSBkYXRhLT5wZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgREFZTElHSFRfTUFYLCBwZGF0YS0+bDFfZGF5bGlnaHRfbWF4KTsKKwlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIERBWUxJR0hUX0RJTSwgcGRhdGEtPmwxX2RheWxpZ2h0X2RpbSk7CisKKwlpZiAocGRhdGEtPmVuX2FtYmxfc2VucykgeworCQlkYXRhLT5jYWNoZWRfZGF5bGlnaHRfbWF4ID0gcGRhdGEtPmwxX2RheWxpZ2h0X21heDsKKwkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBPRkZJQ0VfTUFYLCBwZGF0YS0+bDJfb2ZmaWNlX21heCk7CisJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgT0ZGSUNFX0RJTSwgcGRhdGEtPmwyX29mZmljZV9kaW0pOworCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIERBUktfTUFYLCBwZGF0YS0+bDNfZGFya19tYXgpOworCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIERBUktfRElNLCBwZGF0YS0+bDNfZGFya19kaW0pOworCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIEwyX1RSSVAsIHBkYXRhLT5sMl90cmlwKTsKKwkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBMMl9IWVMsIHBkYXRhLT5sMl9oeXN0KTsKKwkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBMM19UUklQLCBwZGF0YS0+bDNfdHJpcCk7CisJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgTDNfSFlTLCBwZGF0YS0+bDNfaHlzdCk7CisJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQUxTX0NNUFJfQ0ZHLAorCQkJQUxTX0NNUFJfQ0ZHX1ZBTChwZGF0YS0+YWJtbF9maWx0LCBMM19FTikpOworCX0KKworCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQkxfQ09OVFJPTCwKKwkJCUJMX0NUUkxfVkFMKHBkYXRhLT5mYWRlX2xlZF9sYXcsIHBkYXRhLT5lbl9hbWJsX3NlbnMpKTsKKworCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQkxfRkFERSwgRkFERV9WQUwocGRhdGEtPmZhZGVfaW4sCisJCQlwZGF0YS0+ZmFkZV9vdXQpKTsKKworCXJldCB8PSBhZHA1NTIwX3NldF9iaXRzKG1hc3RlciwgTU9ERV9TVEFUVVMsIEJMX0VOIHwgRElNX0VOKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDU1MjBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgYWRwNTUyMF9ibCAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnJvcjsKKwl1aW50OF90IHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwllcnJvciA9IGFkcDU1MjBfcmVhZChkYXRhLT5tYXN0ZXIsIHJlZywgJnJlZ192YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcmVnX3ZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDU1MjBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBpbnQgcmVnKQoreworCXN0cnVjdCBhZHA1NTIwX2JsICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlhZHA1NTIwX3dyaXRlKGRhdGEtPm1hc3RlciwgcmVnLCB2YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfZGFya19tYXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDU1MjBfc2hvdyhkZXYsIGJ1ZiwgREFSS19NQVgpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA1NTIwX2JsX2RhcmtfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA1NTIwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgREFSS19NQVgpOworfQorc3RhdGljIERFVklDRV9BVFRSKGRhcmtfbWF4LCAwNjY0LCBhZHA1NTIwX2JsX2RhcmtfbWF4X3Nob3csCisJCQlhZHA1NTIwX2JsX2RhcmtfbWF4X3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgYWRwNTUyMF9ibF9vZmZpY2VfbWF4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwNTUyMF9zaG93KGRldiwgYnVmLCBPRkZJQ0VfTUFYKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwNTUyMF9ibF9vZmZpY2VfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA1NTIwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgT0ZGSUNFX01BWCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIob2ZmaWNlX21heCwgMDY2NCwgYWRwNTUyMF9ibF9vZmZpY2VfbWF4X3Nob3csCisJCQlhZHA1NTIwX2JsX29mZmljZV9tYXhfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA1NTIwX2JsX2RheWxpZ2h0X21heF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDU1MjBfc2hvdyhkZXYsIGJ1ZiwgREFZTElHSFRfTUFYKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwNTUyMF9ibF9kYXlsaWdodF9tYXhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFkcDU1MjBfYmwgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhLT5jYWNoZWRfZGF5bGlnaHRfbWF4KTsKKwlyZXR1cm4gYWRwNTUyMF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIERBWUxJR0hUX01BWCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZGF5bGlnaHRfbWF4LCAwNjY0LCBhZHA1NTIwX2JsX2RheWxpZ2h0X21heF9zaG93LAorCQkJYWRwNTUyMF9ibF9kYXlsaWdodF9tYXhfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA1NTIwX2JsX2RhcmtfZGltX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwNTUyMF9zaG93KGRldiwgYnVmLCBEQVJLX0RJTSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfZGFya19kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwNTUyMF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIERBUktfRElNKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihkYXJrX2RpbSwgMDY2NCwgYWRwNTUyMF9ibF9kYXJrX2RpbV9zaG93LAorCQkJYWRwNTUyMF9ibF9kYXJrX2RpbV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfb2ZmaWNlX2RpbV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDU1MjBfc2hvdyhkZXYsIGJ1ZiwgT0ZGSUNFX0RJTSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfb2ZmaWNlX2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA1NTIwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgT0ZGSUNFX0RJTSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIob2ZmaWNlX2RpbSwgMDY2NCwgYWRwNTUyMF9ibF9vZmZpY2VfZGltX3Nob3csCisJCQlhZHA1NTIwX2JsX29mZmljZV9kaW1fc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA1NTIwX2JsX2RheWxpZ2h0X2RpbV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDU1MjBfc2hvdyhkZXYsIGJ1ZiwgREFZTElHSFRfRElNKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwNTUyMF9ibF9kYXlsaWdodF9kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwNTUyMF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIERBWUxJR0hUX0RJTSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZGF5bGlnaHRfZGltLCAwNjY0LCBhZHA1NTIwX2JsX2RheWxpZ2h0X2RpbV9zaG93LAorCQkJYWRwNTUyMF9ibF9kYXlsaWdodF9kaW1fc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRwNTUyMF9ibF9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2RhcmtfbWF4LmF0dHIsCisJJmRldl9hdHRyX2RhcmtfZGltLmF0dHIsCisJJmRldl9hdHRyX29mZmljZV9tYXguYXR0ciwKKwkmZGV2X2F0dHJfb2ZmaWNlX2RpbS5hdHRyLAorCSZkZXZfYXR0cl9kYXlsaWdodF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfZGF5bGlnaHRfZGltLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRwNTUyMF9ibF9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkcDU1MjBfYmxfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkcDU1MjBfYmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmw7CisJc3RydWN0IGFkcDU1MjBfYmwgKmRhdGE7CisJaW50IHJldCA9IDA7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPm1hc3RlciA9IHBkZXYtPmRldi5wYXJlbnQ7CisJZGF0YS0+cGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChkYXRhLT5wZGF0YSAgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGF0YS0+aWQgPSBwZGV2LT5pZDsKKwlkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgPSAwOworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CisKKwlibCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgZGF0YS0+bWFzdGVyLAorCQkJZGF0YSwgJmFkcDU1MjBfYmxfb3BzKTsKKwlpZiAoSVNfRVJSKGJsKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYmFja2xpZ2h0XG4iKTsKKwkJa2ZyZWUoZGF0YSk7CisJCXJldHVybiBQVFJfRVJSKGJsKTsKKwl9CisKKwlibC0+cHJvcHMubWF4X2JyaWdodG5lc3MgPQorCQlibC0+cHJvcHMuYnJpZ2h0bmVzcyA9IEFEUDUwMjBfTUFYX0JSSUdIVE5FU1M7CisKKwlpZiAoZGF0YS0+cGRhdGEtPmVuX2FtYmxfc2VucykKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZibC0+ZGV2LmtvYmosCisJCQkmYWRwNTUyMF9ibF9hdHRyX2dyb3VwKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2ZzXG4iKTsKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGJsKTsKKwkJa2ZyZWUoZGF0YSk7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYmwpOworCXJldCB8PSBhZHA1NTIwX2JsX3NldHVwKGJsKTsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhibCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHA1NTIwX2JsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhZHA1NTIwX2JsICpkYXRhID0gYmxfZ2V0X2RhdGEoYmwpOworCisJYWRwNTUyMF9jbHJfYml0cyhkYXRhLT5tYXN0ZXIsIE1PREVfU1RBVFVTLCBCTF9FTik7CisKKwlpZiAoZGF0YS0+cGRhdGEtPmVuX2FtYmxfc2VucykKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZibC0+ZGV2LmtvYmosCisJCQkJJmFkcDU1MjBfYmxfYXR0cl9ncm91cCk7CisKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmwpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWRwNTUyMF9ibF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlyZXR1cm4gYWRwNTUyMF9ibF9zZXQoYmwsIDApOworfQorCitzdGF0aWMgaW50IGFkcDU1MjBfYmxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhibCk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBhZHA1NTIwX2JsX3N1c3BlbmQJTlVMTAorI2RlZmluZSBhZHA1NTIwX2JsX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWRwNTUyMF9ibF9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImFkcDU1MjAtYmFja2xpZ2h0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWRwNTUyMF9ibF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkcDU1MjBfYmxfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGFkcDU1MjBfYmxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFkcDU1MjBfYmxfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWRwNTUyMF9ibF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWRwNTUyMF9ibF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRwNTUyMF9ibF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkcDU1MjBfYmxfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhZHA1NTIwX2JsX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZHA1NTIwX2JsX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFA1NTIwKDAxKSBCYWNrbGlnaHQgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFkcDU1MjAtYmFja2xpZ2h0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHhfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkeF9ibC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjM2JkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHhfYmwuYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkeC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEF2aW9uaWMgRGVzaWduIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFdyaXR0ZW4gYnkgVGhpZXJyeSBSZWRpbmcgPHRoaWVycnkucmVkaW5nQGF2aW9uaWMtZGVzaWduLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKy8qIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFEWF9CQUNLTElHSFRfQ09OVFJPTAkJMHgwMAorI2RlZmluZSBBRFhfQkFDS0xJR0hUX0NPTlRST0xfRU5BQkxFCSgxIDw8IDApCisjZGVmaW5lIEFEWF9CQUNLTElHSFRfQlJJR0hUTkVTUwkweDA4CisjZGVmaW5lIEFEWF9CQUNLTElHSFRfU1RBVFVTCQkweDEwCisjZGVmaW5lIEFEWF9CQUNLTElHSFRfRVJST1IJCTB4MTgKKworc3RydWN0IGFkeGJsIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCitzdGF0aWMgaW50IGFkeF9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxkZXYpCit7CisJc3RydWN0IGFkeGJsICpibCA9IGJsX2dldF9kYXRhKGJsZGV2KTsKKwl1MzIgdmFsdWU7CisKKwl2YWx1ZSA9IGJsZGV2LT5wcm9wcy5icmlnaHRuZXNzOworCXdyaXRlbCh2YWx1ZSwgYmwtPmJhc2UgKyBBRFhfQkFDS0xJR0hUX0JSSUdIVE5FU1MpOworCisJdmFsdWUgPSByZWFkbChibC0+YmFzZSArIEFEWF9CQUNLTElHSFRfQ09OVFJPTCk7CisKKwlpZiAoYmxkZXYtPnByb3BzLnN0YXRlICYgQkxfQ09SRV9GQkJMQU5LKQorCQl2YWx1ZSAmPSB+QURYX0JBQ0tMSUdIVF9DT05UUk9MX0VOQUJMRTsKKwllbHNlCisJCXZhbHVlIHw9IEFEWF9CQUNLTElHSFRfQ09OVFJPTF9FTkFCTEU7CisKKwl3cml0ZWwodmFsdWUsIGJsLT5iYXNlICsgQURYX0JBQ0tMSUdIVF9DT05UUk9MKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkeF9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsZGV2KQoreworCXN0cnVjdCBhZHhibCAqYmwgPSBibF9nZXRfZGF0YShibGRldik7CisJdTMyIGJyaWdodG5lc3M7CisKKwlicmlnaHRuZXNzID0gcmVhZGwoYmwtPmJhc2UgKyBBRFhfQkFDS0xJR0hUX0JSSUdIVE5FU1MpOworCXJldHVybiBicmlnaHRuZXNzICYgMHhmZjsKK30KKworc3RhdGljIGludCBhZHhfYmFja2xpZ2h0X2NoZWNrX2ZiKHN0cnVjdCBmYl9pbmZvICpmYikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGFkeF9iYWNrbGlnaHRfb3BzID0geworCS5vcHRpb25zID0gMCwKKwkudXBkYXRlX3N0YXR1cyA9IGFkeF9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1cywKKwkuZ2V0X2JyaWdodG5lc3MgPSBhZHhfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzLAorCS5jaGVja19mYiA9IGFkeF9iYWNrbGlnaHRfY2hlY2tfZmIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHhfYmFja2xpZ2h0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBhZHhibCAqYmw7CisJaW50IHJldCA9IDA7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCXJlc291cmNlX3NpemUocmVzKSwgcmVzLT5uYW1lKTsKKwlpZiAoIXJlcykgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCWJsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqYmwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJsKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWJsLT5iYXNlID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCXJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFibC0+YmFzZSkgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCWJsZGV2ID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihkZXZfbmFtZSgmcGRldi0+ZGV2KSwgJnBkZXYtPmRldiwgYmwsCisJCQkmYWR4X2JhY2tsaWdodF9vcHMpOworCWlmICghYmxkZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJYmxkZXYtPnByb3BzLm1heF9icmlnaHRuZXNzID0gMHhmZjsKKwlibGRldi0+cHJvcHMuYnJpZ2h0bmVzcyA9IDB4ZmY7CisJYmxkZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGJsZGV2KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkeF9iYWNrbGlnaHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsZGV2OworCWludCByZXQgPSAwOworCisJYmxkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCWJsZGV2LT5wcm9wcy5icmlnaHRuZXNzID0gMHhmZjsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhibGRldik7CisJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGJsZGV2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWR4X2JhY2tsaWdodF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHhfYmFja2xpZ2h0X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYWR4X2JhY2tsaWdodF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgYWR4X2JhY2tsaWdodF9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFkeF9iYWNrbGlnaHRfZHJpdmVyID0geworCS5wcm9iZSA9IGFkeF9iYWNrbGlnaHRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkeF9iYWNrbGlnaHRfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGFkeF9iYWNrbGlnaHRfc3VzcGVuZCwKKwkucmVzdW1lID0gYWR4X2JhY2tsaWdodF9yZXN1bWUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWR4LWJhY2tsaWdodCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZHhfYmFja2xpZ2h0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhZHhfYmFja2xpZ2h0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZHhfYmFja2xpZ2h0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWR4X2JhY2tsaWdodF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZHhfYmFja2xpZ2h0X2luaXQpOworbW9kdWxlX2V4aXQoYWR4X2JhY2tsaWdodF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVGhpZXJyeSBSZWRpbmcgPHRoaWVycnkucmVkaW5nQGF2aW9uaWMtZGVzaWduLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdmlvbmljIERlc2lnbiBYYW50aG9zIEJhY2tsaWdodCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKaW5kZXggMTU3MDU3Yy4uNjYxNWFjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKQEAgLTczLDYgKzczLDI3IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0ZCICovCiAKK3N0YXRpYyB2b2lkIGJhY2tsaWdodF9nZW5lcmF0ZV9ldmVudChzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQsCisJCQkJICAgICBlbnVtIGJhY2tsaWdodF91cGRhdGVfcmVhc29uIHJlYXNvbikKK3sKKwljaGFyICplbnZwWzJdOworCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIEJBQ0tMSUdIVF9VUERBVEVfU1lTRlM6CisJCWVudnBbMF0gPSAiU09VUkNFPXN5c2ZzIjsKKwkJYnJlYWs7CisJY2FzZSBCQUNLTElHSFRfVVBEQVRFX0hPVEtFWToKKwkJZW52cFswXSA9ICJTT1VSQ0U9aG90a2V5IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZW52cFswXSA9ICJTT1VSQ0U9dW5rbm93biI7CisJCWJyZWFrOworCX0KKwllbnZwWzFdID0gTlVMTDsKKwlrb2JqZWN0X3VldmVudF9lbnYoJmJkLT5kZXYua29iaiwgS09CSl9DSEFOR0UsIGVudnApOworCXN5c2ZzX25vdGlmeSgmYmQtPmRldi5rb2JqLCBOVUxMLCAiYWN0dWFsX2JyaWdodG5lc3MiKTsKK30KKwogc3RhdGljIHNzaXplX3QgYmFja2xpZ2h0X3Nob3dfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixjaGFyICpidWYpCiB7CkBAIC0xNDIsNiArMTYzLDggQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZiZC0+b3BzX2xvY2spOwogCisJYmFja2xpZ2h0X2dlbmVyYXRlX2V2ZW50KGJkLCBCQUNLTElHSFRfVVBEQVRFX1NZU0ZTKTsKKwogCXJldHVybiByYzsKIH0KIApAQCAtMjE0LDYgKzIzNywyNSBAQAogfTsKIAogLyoqCisgKiBiYWNrbGlnaHRfZm9yY2VfdXBkYXRlIC0gdGVsbCB0aGUgYmFja2xpZ2h0IHN1YnN5c3RlbSB0aGF0IGhhcmR3YXJlIHN0YXRlCisgKiAgIGhhcyBjaGFuZ2VkCisgKiBAYmQ6IHRoZSBiYWNrbGlnaHQgZGV2aWNlIHRvIHVwZGF0ZQorICoKKyAqIFVwZGF0ZXMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBiYWNrbGlnaHQgaW4gcmVzcG9uc2UgdG8gYSBoYXJkd2FyZSBldmVudCwKKyAqIGFuZCBnZW5lcmF0ZSBhIHVldmVudCB0byBub3RpZnkgdXNlcnNwYWNlCisgKi8KK3ZvaWQgYmFja2xpZ2h0X2ZvcmNlX3VwZGF0ZShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQsCisJCQkgICAgZW51bSBiYWNrbGlnaHRfdXBkYXRlX3JlYXNvbiByZWFzb24pCit7CisJbXV0ZXhfbG9jaygmYmQtPm9wc19sb2NrKTsKKwlpZiAoYmQtPm9wcyAmJiBiZC0+b3BzLT5nZXRfYnJpZ2h0bmVzcykKKwkJYmQtPnByb3BzLmJyaWdodG5lc3MgPSBiZC0+b3BzLT5nZXRfYnJpZ2h0bmVzcyhiZCk7CisJbXV0ZXhfdW5sb2NrKCZiZC0+b3BzX2xvY2spOworCWJhY2tsaWdodF9nZW5lcmF0ZV9ldmVudChiZCwgcmVhc29uKTsKK30KK0VYUE9SVF9TWU1CT0woYmFja2xpZ2h0X2ZvcmNlX3VwZGF0ZSk7CisKKy8qKgogICogYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlciAtIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBuZXcgb2JqZWN0IG9mCiAgKiAgIGJhY2tsaWdodF9kZXZpY2UgY2xhc3MuCiAgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIG5ldyBvYmplY3QobXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2RhOTAzeF9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZGE5MDN4X2JsLmMKaW5kZXggOTNiYjQzNC4uNzAxYTEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZGE5MDN4X2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZGE5MDN4X2JsLmMKQEAgLTE1NCwzNCArMTU0LDM4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZGE5MDN4X2JhY2tsaWdodF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkJIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgZGE5MDN4X2JhY2tsaWdodF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJcmV0dXJuIGRhOTAzeF9iYWNrbGlnaHRfc2V0KGJsLCAwKTsKIH0KIAotc3RhdGljIGludCBkYTkwM3hfYmFja2xpZ2h0X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBkYTkwM3hfYmFja2xpZ2h0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmwpOwogCXJldHVybiAwOwogfQotI2Vsc2UKLSNkZWZpbmUgZGE5MDN4X2JhY2tsaWdodF9zdXNwZW5kCU5VTEwKLSNkZWZpbmUgZGE5MDN4X2JhY2tsaWdodF9yZXN1bWUJCU5VTEwKKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIGRhOTAzeF9iYWNrbGlnaHRfcG1fb3BzID0geworCS5zdXNwZW5kCT0gZGE5MDN4X2JhY2tsaWdodF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gZGE5MDN4X2JhY2tsaWdodF9yZXN1bWUsCit9OwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhOTAzeF9iYWNrbGlnaHRfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJkYTkwM3gtYmFja2xpZ2h0IiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9ICZkYTkwM3hfYmFja2xpZ2h0X3BtX29wcywKKyNlbmRpZgogCX0sCiAJLnByb2JlCQk9IGRhOTAzeF9iYWNrbGlnaHRfcHJvYmUsCiAJLnJlbW92ZQkJPSBkYTkwM3hfYmFja2xpZ2h0X3JlbW92ZSwKLQkuc3VzcGVuZAk9IGRhOTAzeF9iYWNrbGlnaHRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGRhOTAzeF9iYWNrbGlnaHRfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZGE5MDN4X2JhY2tsaWdodF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9ocDY4MF9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvaHA2ODBfYmwuYwppbmRleCA1YmU1NWEyLi43ZmI0ZWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9ocDY4MF9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2hwNjgwX2JsLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCS51cGRhdGVfc3RhdHVzICA9IGhwNjgwYmxfc2V0X2ludGVuc2l0eSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGhwNjgwYmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhwNjgwYmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xtczI4M2dmMDUuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xtczI4M2dmMDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDdiNTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG1zMjgzZ2YwNS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogbG1zMjgzZ2YwNS5jIC0tIHN1cHBvcnQgZm9yIFNhbXN1bmcgTE1TMjgzR0YwNSBMQ0QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sY2QuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvbG1zMjgzZ2YwNS5oPgorCitzdHJ1Y3QgbG1zMjgzZ2YwNV9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKKwlzdHJ1Y3QgbGNkX2RldmljZQkqbGQ7Cit9OworCitzdHJ1Y3QgbG1zMjgzZ2YwNV9zZXEgeworCXVuc2lnbmVkIGNoYXIJCXJlZzsKKwl1bnNpZ25lZCBzaG9ydAkJdmFsdWU7CisJdW5zaWduZWQgY2hhcgkJZGVsYXk7Cit9OworCisvKiBNYWdpYyBzZXF1ZW5jZXMgc3VwcGxpZWQgYnkgbWFudWZhY3R1cmVyLCBmb3IgZGV0YWlscyByZWZlciB0byBkYXRhc2hlZXQgKi8KK3N0YXRpYyBzdHJ1Y3QgbG1zMjgzZ2YwNV9zZXEgZGlzcF9pbml0c2VxW10gPSB7CisJLyogUkVHLCBWQUxVRSwgREVMQVkgKi8KKwl7IDB4MDcsIDB4MDAwMCwgMCB9LAorCXsgMHgxMywgMHgwMDAwLCAxMCB9LAorCisJeyAweDExLCAweDMwMDQsIDAgfSwKKwl7IDB4MTQsIDB4MjAwRiwgMCB9LAorCXsgMHgxMCwgMHgxYTIwLCAwIH0sCisJeyAweDEzLCAweDAwNDAsIDUwIH0sCisKKwl7IDB4MTMsIDB4MDA2MCwgMCB9LAorCXsgMHgxMywgMHgwMDcwLCAyMDAgfSwKKworCXsgMHgwMSwgMHgwMTI3LCAwIH0sCisJeyAweDAyLAkweDA3MDAsIDAgfSwKKwl7IDB4MDMsIDB4MTAzMCwgMCB9LAorCXsgMHgwOCwgMHgwMjA4LCAwIH0sCisJeyAweDBCLCAweDA2MjAsIDAgfSwKKwl7IDB4MEMsIDB4MDExMCwgMCB9LAorCXsgMHgzMCwgMHgwMTIwLCAwIH0sCisJeyAweDMxLCAweDAxMjcsIDAgfSwKKwl7IDB4MzIsIDB4MDAwMCwgMCB9LAorCXsgMHgzMywgMHgwNTAzLCAwIH0sCisJeyAweDM0LCAweDA3MjcsIDAgfSwKKwl7IDB4MzUsIDB4MDEyNCwgMCB9LAorCXsgMHgzNiwgMHgwNzA2LCAwIH0sCisJeyAweDM3LCAweDA3MDEsIDAgfSwKKwl7IDB4MzgsIDB4MEYwMCwgMCB9LAorCXsgMHgzOSwgMHgwRjAwLCAwIH0sCisJeyAweDQwLCAweDAwMDAsIDAgfSwKKwl7IDB4NDEsIDB4MDAwMCwgMCB9LAorCXsgMHg0MiwgMHgwMTNmLCAwIH0sCisJeyAweDQzLCAweDAwMDAsIDAgfSwKKwl7IDB4NDQsIDB4MDEzZiwgMCB9LAorCXsgMHg0NSwgMHgwMDAwLCAwIH0sCisJeyAweDQ2LCAweGVmMDAsIDAgfSwKKwl7IDB4NDcsIDB4MDEzZiwgMCB9LAorCXsgMHg0OCwgMHgwMDAwLCAwIH0sCisJeyAweDA3LCAweDAwMTUsIDMwIH0sCisKKwl7IDB4MDcsIDB4MDAxNywgMCB9LAorCisJeyAweDIwLCAweDAwMDAsIDAgfSwKKwl7IDB4MjEsIDB4MDAwMCwgMCB9LAorCXsgMHgyMiwgMHgwMDAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbG1zMjgzZ2YwNV9zZXEgZGlzcF9wZHduc2VxW10gPSB7CisJeyAweDA3LCAweDAwMTYsIDMwIH0sCisKKwl7IDB4MDcsIDB4MDAwNCwgMCB9LAorCXsgMHgxMCwgMHgwMjIwLCAyMCB9LAorCisJeyAweDEzLCAweDAwNjAsIDUwIH0sCisKKwl7IDB4MTMsIDB4MDA0MCwgNTAgfSwKKworCXsgMHgxMywgMHgwMDAwLCAwIH0sCisJeyAweDEwLCAweDAwMDAsIDAgfQorfTsKKworCitzdGF0aWMgdm9pZCBsbXMyODNnZjA1X3Jlc2V0KHVuc2lnbmVkIGxvbmcgZ3BpbywgYm9vbCBpbnZlcnRlZCkKK3sKKwlncGlvX3NldF92YWx1ZShncGlvLCAhaW52ZXJ0ZWQpOworCW1kZWxheSgxMDApOworCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIGludmVydGVkKTsKKwltZGVsYXkoMjApOworCWdwaW9fc2V0X3ZhbHVlKGdwaW8sICFpbnZlcnRlZCk7CisJbWRlbGF5KDIwKTsKK30KKworc3RhdGljIHZvaWQgbG1zMjgzZ2YwNV90b2dnbGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCXN0cnVjdCBsbXMyODNnZjA1X3NlcSAqc2VxLCBpbnQgc3opCit7CisJY2hhciBidWZbM107CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3o7IGkrKykgeworCQlidWZbMF0gPSAweDc0OworCQlidWZbMV0gPSAweDAwOworCQlidWZbMl0gPSBzZXFbaV0ucmVnOworCQlzcGlfd3JpdGUoc3BpLCBidWYsIDMpOworCisJCWJ1ZlswXSA9IDB4NzY7CisJCWJ1ZlsxXSA9IHNlcVtpXS52YWx1ZSA+PiA4OworCQlidWZbMl0gPSBzZXFbaV0udmFsdWUgJiAweGZmOworCQlzcGlfd3JpdGUoc3BpLCBidWYsIDMpOworCisJCW1kZWxheShzZXFbaV0uZGVsYXkpOworCX0KK30KKworc3RhdGljIGludCBsbXMyODNnZjA1X3Bvd2VyX3NldChzdHJ1Y3QgbGNkX2RldmljZSAqbGQsIGludCBwb3dlcikKK3sKKwlzdHJ1Y3QgbG1zMjgzZ2YwNV9zdGF0ZSAqc3QgPSBsY2RfZ2V0X2RhdGEobGQpOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBzdC0+c3BpOworCXN0cnVjdCBsbXMyODNnZjA1X3BkYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocG93ZXIpIHsKKwkJaWYgKHBkYXRhKQorCQkJbG1zMjgzZ2YwNV9yZXNldChwZGF0YS0+cmVzZXRfZ3BpbywKKwkJCQkJcGRhdGEtPnJlc2V0X2ludmVydGVkKTsKKwkJbG1zMjgzZ2YwNV90b2dnbGUoc3BpLCBkaXNwX2luaXRzZXEsIEFSUkFZX1NJWkUoZGlzcF9pbml0c2VxKSk7CisJfSBlbHNlIHsKKwkJbG1zMjgzZ2YwNV90b2dnbGUoc3BpLCBkaXNwX3Bkd25zZXEsIEFSUkFZX1NJWkUoZGlzcF9wZHduc2VxKSk7CisJCWlmIChwZGF0YSkKKwkJCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5yZXNldF9ncGlvLAorCQkJCQlwZGF0YS0+cmVzZXRfaW52ZXJ0ZWQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxjZF9vcHMgbG1zX29wcyA9IHsKKwkuc2V0X3Bvd2VyCT0gbG1zMjgzZ2YwNV9wb3dlcl9zZXQsCisJLmdldF9wb3dlcgk9IE5VTEwsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBsbXMyODNnZjA1X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGxtczI4M2dmMDVfc3RhdGUgKnN0OworCXN0cnVjdCBsbXMyODNnZjA1X3BkYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGxjZF9kZXZpY2UgKmxkOworCWludCByZXQgPSAwOworCisJaWYgKHBkYXRhICE9IE5VTEwpIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5yZXNldF9ncGlvLCAiTE1TMjg1R0YwNSBSRVNFVCIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPnJlc2V0X2dwaW8sCisJCQkJCQkhcGRhdGEtPnJlc2V0X2ludmVydGVkKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxtczI4M2dmMDVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIk5vIG1lbW9yeSBmb3IgZGV2aWNlIHN0YXRlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJbGQgPSBsY2RfZGV2aWNlX3JlZ2lzdGVyKCJsbXMyODNnZjA1IiwgJnNwaS0+ZGV2LCBzdCwgJmxtc19vcHMpOworCWlmIChJU19FUlIobGQpKSB7CisJCXJldCA9IFBUUl9FUlIobGQpOworCQlnb3RvIGVycjI7CisJfQorCisJc3QtPnNwaSA9IHNwaTsKKwlzdC0+bGQgPSBsZDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHN0KTsKKworCS8qIGtpY2sgaW4gdGhlIExDRCAqLworCWlmIChwZGF0YSkKKwkJbG1zMjgzZ2YwNV9yZXNldChwZGF0YS0+cmVzZXRfZ3BpbywgcGRhdGEtPnJlc2V0X2ludmVydGVkKTsKKwlsbXMyODNnZjA1X3RvZ2dsZShzcGksIGRpc3BfaW5pdHNlcSwgQVJSQVlfU0laRShkaXNwX2luaXRzZXEpKTsKKworCXJldHVybiAwOworCitlcnIyOgorCWtmcmVlKHN0KTsKK2VycjoKKwlpZiAocGRhdGEgIT0gTlVMTCkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5yZXNldF9ncGlvKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGxtczI4M2dmMDVfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGxtczI4M2dmMDVfc3RhdGUgKnN0ID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisJc3RydWN0IGxtczI4M2dmMDVfcGRhdGEgKnBkYXRhID0gc3QtPnNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlsY2RfZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmxkKTsKKworCWlmIChwZGF0YSAhPSBOVUxMKQorCQlncGlvX2ZyZWUocGRhdGEtPnJlc2V0X2dwaW8pOworCisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBsbXMyODNnZjA1X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJsbXMyODNnZjA1IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gbG1zMjgzZ2YwNV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGxtczI4M2dmMDVfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGxtczI4M2dmMDVfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZsbXMyODNnZjA1X2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBsbXMyODNnZjA1X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmxtczI4M2dmMDVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobG1zMjgzZ2YwNV9pbml0KTsKK21vZHVsZV9leGl0KGxtczI4M2dmMDVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxDRDI4M0dGMDUgTENEIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYnBfbnZpZGlhX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYnBfbnZpZGlhX2JsLmMKaW5kZXggM2JiNGMwYS4uOWVkYjhkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbWJwX252aWRpYV9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L21icF9udmlkaWFfYmwuYwpAQCAtMTY2LDYgKzE2NiwxNSBAQAogCX0sCiAJewogCQkuY2FsbGJhY2sJPSBtYnBfZG1pX21hdGNoLAorCQkuaWRlbnQJCT0gIk1hY0Jvb2tBaXIgMSwxIiwKKwkJLm1hdGNoZXMJPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBcHBsZSBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tBaXIxLDEiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhCT0gKHZvaWQgKikmaW50ZWxfY2hpcHNldF9kYXRhLAorCX0sCisJeworCQkuY2FsbGJhY2sJPSBtYnBfZG1pX21hdGNoLAogCQkuaWRlbnQJCT0gIk1hY0Jvb2sgNSwxIiwKIAkJLm1hdGNoZXMJPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBcHBsZSBJbmMuIiksCkBAIC0xNzUsNiArMTg0LDE1IEBACiAJfSwKIAl7CiAJCS5jYWxsYmFjawk9IG1icF9kbWlfbWF0Y2gsCisJCS5pZGVudAkJPSAiTWFjQm9vayA1LDIiLAorCQkubWF0Y2hlcwk9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFwcGxlIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9vazUsMiIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEJPSAodm9pZCAqKSZudmlkaWFfY2hpcHNldF9kYXRhLAorCX0sCisJeworCQkuY2FsbGJhY2sJPSBtYnBfZG1pX21hdGNoLAogCQkuaWRlbnQJCT0gIk1hY0Jvb2tBaXIgMiwxIiwKIAkJLm1hdGNoZXMJPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBcHBsZSBJbmMuIiksCkBAIC0xOTEsNiArMjA5LDI0IEBACiAJCX0sCiAJCS5kcml2ZXJfZGF0YQk9ICh2b2lkICopJm52aWRpYV9jaGlwc2V0X2RhdGEsCiAJfSwKKwl7CisJCS5jYWxsYmFjawk9IG1icF9kbWlfbWF0Y2gsCisJCS5pZGVudAkJPSAiTWFjQm9va1BybyA1LDIiLAorCQkubWF0Y2hlcwk9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFwcGxlIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzUsMiIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEJPSAodm9pZCAqKSZudmlkaWFfY2hpcHNldF9kYXRhLAorCX0sCisJeworCQkuY2FsbGJhY2sJPSBtYnBfZG1pX21hdGNoLAorCQkuaWRlbnQJCT0gIk1hY0Jvb2tQcm8gNSw1IiwKKwkJLm1hdGNoZXMJPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBcHBsZSBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm81LDUiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhCT0gKHZvaWQgKikmbnZpZGlhX2NoaXBzZXRfZGF0YSwKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvd204MzF4X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC93bTgzMXhfYmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdiZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvd204MzF4X2JsLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBCYWNrbGlnaHQgZHJpdmVyIGZvciBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzF4IFBNSUNzCisgKgorICogQ29weXJpZ2h0IDIwMDkgV29sZnNvbiBNaWNyb2VsZWN0b25pY3MgcGxjCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L3BkYXRhLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9yZWd1bGF0b3IuaD4KKworc3RydWN0IHdtODMxeF9iYWNrbGlnaHRfZGF0YSB7CisJc3RydWN0IHdtODMxeCAqd204MzF4OworCWludCBpc2lua19yZWc7CisJaW50IGN1cnJlbnRfYnJpZ2h0bmVzczsKK307CisKK3N0YXRpYyBpbnQgd204MzF4X2JhY2tsaWdodF9zZXQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsLCBpbnQgYnJpZ2h0bmVzcykKK3sKKwlzdHJ1Y3Qgd204MzF4X2JhY2tsaWdodF9kYXRhICpkYXRhID0gYmxfZ2V0X2RhdGEoYmwpOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRhdGEtPndtODMxeDsKKwlpbnQgcG93ZXJfdXAgPSAhZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzICYmIGJyaWdodG5lc3M7CisJaW50IHBvd2VyX2Rvd24gPSBkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgJiYgIWJyaWdodG5lc3M7CisJaW50IHJldDsKKworCWlmIChwb3dlcl91cCkgeworCQkvKiBFbmFibGUgdGhlIElTSU5LICovCisJCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIGRhdGEtPmlzaW5rX3JlZywKKwkJCQkgICAgICBXTTgzMVhfQ1MxX0VOQSwgV004MzFYX0NTMV9FTkEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOworCisJCS8qIEVuYWJsZSB0aGUgREMtREMgKi8KKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0RDRENfRU5BQkxFLAorCQkJCSAgICAgIFdNODMxWF9EQzRfRU5BLCBXTTgzMVhfREM0X0VOQSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJfQorCisJaWYgKHBvd2VyX2Rvd24pIHsKKwkJLyogRENEQyBmaXJzdCAqLworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfRENEQ19FTkFCTEUsCisJCQkJICAgICAgV004MzFYX0RDNF9FTkEsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOworCisJCS8qIElTSU5LICovCisJCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIGRhdGEtPmlzaW5rX3JlZywKKwkJCQkgICAgICBXTTgzMVhfQ1MxX0RSSVZFIHwgV004MzFYX0NTMV9FTkEsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIFNldCB0aGUgbmV3IGJyaWdodG5lc3MgKi8KKwlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBkYXRhLT5pc2lua19yZWcsCisJCQkgICAgICBXTTgzMVhfQ1MxX0lTRUxfTUFTSywgYnJpZ2h0bmVzcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJaWYgKHBvd2VyX3VwKSB7CisJCS8qIERyaXZlIGN1cnJlbnQgdGhyb3VnaCB0aGUgSVNJTksgKi8KKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgZGF0YS0+aXNpbmtfcmVnLAorCQkJCSAgICAgIFdNODMxWF9DUzFfRFJJVkUsIFdNODMxWF9DUzFfRFJJVkUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKworCXJldHVybiAwOworCitlcnI6CisJLyogSWYgd2Ugd2VyZSBpbiB0aGUgbWlkZGxlIG9mIGEgcG93ZXIgdHJhbnNpdGlvbiBhbHdheXMgc2h1dCBkb3duCisJICogZm9yIHNhZmV0eS4KKwkgKi8KKwlpZiAocG93ZXJfdXAgfHwgcG93ZXJfZG93bikgeworCQl3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfRENEQ19FTkFCTEUsIFdNODMxWF9EQzRfRU5BLCAwKTsKKwkJd204MzF4X3NldF9iaXRzKHdtODMxeCwgZGF0YS0+aXNpbmtfcmVnLCBXTTgzMVhfQ1MxX0VOQSwgMCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTgzMXhfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsKQoreworCWludCBicmlnaHRuZXNzID0gYmwtPnByb3BzLmJyaWdodG5lc3M7CisKKwlpZiAoYmwtPnByb3BzLnBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWJyaWdodG5lc3MgPSAwOworCisJaWYgKGJsLT5wcm9wcy5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQorCQlicmlnaHRuZXNzID0gMDsKKworCWlmIChibC0+cHJvcHMuc3RhdGUgJiBCTF9DT1JFX1NVU1BFTkRFRCkKKwkJYnJpZ2h0bmVzcyA9IDA7CisKKwlyZXR1cm4gd204MzF4X2JhY2tsaWdodF9zZXQoYmwsIGJyaWdodG5lc3MpOworfQorCitzdGF0aWMgaW50IHdtODMxeF9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsKQoreworCXN0cnVjdCB3bTgzMXhfYmFja2xpZ2h0X2RhdGEgKmRhdGEgPSBibF9nZXRfZGF0YShibCk7CisJcmV0dXJuIGRhdGEtPmN1cnJlbnRfYnJpZ2h0bmVzczsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIHdtODMxeF9iYWNrbGlnaHRfb3BzID0geworCS5vcHRpb25zID0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLAorCS51cGRhdGVfc3RhdHVzCT0gd204MzF4X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzLAorCS5nZXRfYnJpZ2h0bmVzcwk9IHdtODMxeF9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3MsCit9OworCitzdGF0aWMgaW50IHdtODMxeF9iYWNrbGlnaHRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHdtODMxeF9wZGF0YSAqd204MzF4X3BkYXRhOworCXN0cnVjdCB3bTgzMXhfYmFja2xpZ2h0X3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3Qgd204MzF4X2JhY2tsaWdodF9kYXRhICpkYXRhOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibDsKKwlpbnQgcmV0LCBpLCBtYXhfaXNlbCwgaXNpbmtfcmVnLCBkY2RjX2NmZzsKKworCS8qIFdlIG5lZWQgcGxhdGZvcm0gZGF0YSAqLworCWlmIChwZGV2LT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhKSB7CisJCXdtODMxeF9wZGF0YSA9IHBkZXYtPmRldi5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CisJCXBkYXRhID0gd204MzF4X3BkYXRhLT5iYWNrbGlnaHQ7CisJfSBlbHNlIHsKKwkJcGRhdGEgPSBOVUxMOworCX0KKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpZ3VyZSBvdXQgdGhlIG1heGltdW0gY3VycmVudCB3ZSBjYW4gdXNlICovCisJZm9yIChpID0gMDsgaSA8IFdNODMxWF9JU0lOS19NQVhfSVNFTDsgaSsrKSB7CisJCWlmICh3bTgzMXhfaXNpbmt2X3ZhbHVlc1tpXSA+IHBkYXRhLT5tYXhfdUEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgbWF4X3VBOiAlZHVBXG4iLCBwZGF0YS0+bWF4X3VBKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1heF9pc2VsID0gaSAtIDE7CisKKwlpZiAocGRhdGEtPm1heF91QSAhPSB3bTgzMXhfaXNpbmt2X3ZhbHVlc1ttYXhfaXNlbF0pCisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIk1heGltdW0gY3VycmVudCBpcyAlZHVBIG5vdCAlZHVBIGFzIHJlcXVlc3RlZFxuIiwKKwkJCSB3bTgzMXhfaXNpbmt2X3ZhbHVlc1ttYXhfaXNlbF0sIHBkYXRhLT5tYXhfdUEpOworCisJc3dpdGNoIChwZGF0YS0+aXNpbmspIHsKKwljYXNlIDE6CisJCWlzaW5rX3JlZyA9IFdNODMxWF9DVVJSRU5UX1NJTktfMTsKKwkJZGNkY19jZmcgPSAwOworCQlicmVhazsKKwljYXNlIDI6CisJCWlzaW5rX3JlZyA9IFdNODMxWF9DVVJSRU5UX1NJTktfMjsKKwkJZGNkY19jZmcgPSBXTTgzMVhfREM0X0ZCU1JDOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIElTSU5LICVkXG4iLCBwZGF0YS0+aXNpbmspOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb25maWd1cmUgdGhlIElTSU5LIHRvIHVzZSBmb3IgZmVlZGJhY2sgKi8KKwlyZXQgPSB3bTgzMXhfcmVnX3VubG9jayh3bTgzMXgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0RDNF9DT05UUk9MLCBXTTgzMVhfREM0X0ZCU1JDLAorCQkJICAgICAgZGNkY19jZmcpOworCisJd204MzF4X3JlZ19sb2NrKHdtODMxeCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPndtODMxeCA9IHdtODMxeDsKKwlkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgPSAwOworCWRhdGEtPmlzaW5rX3JlZyA9IGlzaW5rX3JlZzsKKworCWJsID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3Rlcigid204MzF4IiwgJnBkZXYtPmRldiwKKwkJCWRhdGEsICZ3bTgzMXhfYmFja2xpZ2h0X29wcyk7CisJaWYgKElTX0VSUihibCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGJhY2tsaWdodFxuIik7CisJCWtmcmVlKGRhdGEpOworCQlyZXR1cm4gUFRSX0VSUihibCk7CisJfQorCisJYmwtPnByb3BzLm1heF9icmlnaHRuZXNzID0gbWF4X2lzZWw7CisJYmwtPnByb3BzLmJyaWdodG5lc3MgPSBtYXhfaXNlbDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGJsKTsKKworCS8qIERpc2FibGUgdGhlIERDREMgaWYgaXQgd2FzIHN0YXJ0ZWQgc28gd2UgY2FuIGJvb3RzdHJhcCAqLworCXdtODMxeF9zZXRfYml0cyh3bTgzMXgsIFdNODMxWF9EQ0RDX0VOQUJMRSwgV004MzFYX0RDNF9FTkEsIDApOworCisKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhibCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzMXhfYmFja2xpZ2h0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB3bTgzMXhfYmFja2xpZ2h0X2RhdGEgKmRhdGEgPSBibF9nZXRfZGF0YShibCk7CisKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmwpOworCWtmcmVlKGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3bTgzMXhfYmFja2xpZ2h0X2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAid204MzF4LWJhY2tsaWdodCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHdtODMxeF9iYWNrbGlnaHRfcHJvYmUsCisJLnJlbW92ZQkJPSB3bTgzMXhfYmFja2xpZ2h0X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdtODMxeF9iYWNrbGlnaHRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndtODMxeF9iYWNrbGlnaHRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHdtODMxeF9iYWNrbGlnaHRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3bTgzMXhfYmFja2xpZ2h0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd204MzF4X2JhY2tsaWdodF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQod204MzF4X2JhY2tsaWdodF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYWNrbGlnaHQgRHJpdmVyIGZvciBXTTgzMXggUE1JQ3MiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODMxeC1iYWNrbGlnaHQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZGE4eHgtZmIuYyBiL2RyaXZlcnMvdmlkZW8vZGE4eHgtZmIuYwppbmRleCA0MmUxMDA1Li5kMDY1ODk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2RhOHh4LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9kYTh4eC1mYi5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPHZpZGVvL2RhOHh4LWZiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZiX2RlZmlvLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RlZmlvLmMKaW5kZXggMGE3YTY2Ny4uYzI3YWIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYl9kZWZpby5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJfZGVmaW8uYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZmJfZGVmZXJyZWRfaW9fdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBmYl9kZWZlcnJlZF9pb192bV9vcHMgPSB7CiAJLmZhdWx0CQk9IGZiX2RlZmVycmVkX2lvX2ZhdWx0LAogCS5wYWdlX21rd3JpdGUJPSBmYl9kZWZlcnJlZF9pb19ta3dyaXRlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwppbmRleCBhMWYyZTdjLi45OWJiZDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKKysrIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCkBAIC0xODAwLDcgKzE4MDAsNyBAQAogIAkJZ2xvYmFsID0gMTsKICAJfQogCi0gCWlmICghZ2xvYmFsICYmICFzdHJzdHIob3B0aW9ucywgImZiOiIpKSB7CisgCWlmICghZ2xvYmFsICYmICFzdHJjaHIob3B0aW9ucywgJzonKSkgewogIAkJZmJfbW9kZV9vcHRpb24gPSBvcHRpb25zOwogIAkJZ2xvYmFsID0gMTsKICAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRkaS5jIGIvZHJpdmVycy92aWRlby9tc20vbWRkaS5jCmluZGV4IGYyZGU1YTEuLjVjNWExYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kZGkuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZGRpLmMKQEAgLTI3LDggKzI3LDYgQEAKICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCiAjaW5jbHVkZSA8bWFjaC9tc21fZmIuaD4KICNpbmNsdWRlICJtZGRpX2h3LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2JsaXp6YXJkLmMKaW5kZXggZDVlNTk1NS4uNzBkYWRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2JsaXp6YXJkLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2JsaXp6YXJkLmMKQEAgLTkzLDcgKzkzLDcgQEAKIH07CiAKIC8qIFRoZXNlIG5lZWQgdG8gYmUgc2F2ZWQgLyByZXN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHJlc3QuICovCi1zdGF0aWMgc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0IGJsaXp6YXJkX3BsbF9yZWdzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0IGJsaXp6YXJkX3BsbF9yZWdzW10gPSB7CiAJewogCQkuc3RhcnQJPSAweDA0LAkJLyogRG9uJ3Qgc2F2ZSBQTEwgY3RybCAoMHgwQykgKi8KIAkJLmVuZAk9IDB4MGEsCkBAIC0xMDQsNyArMTA0LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCBibGl6emFyZF9nZW5fcmVnc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCBibGl6emFyZF9nZW5fcmVnc1tdID0gewogCXsKIAkJLnN0YXJ0CT0gMHgxOCwJCS8qIFNEUkFNIGNvbnRyb2wgKi8KIAkJLmVuZAk9IDB4MjAsCkBAIC0xOTEsNyArMTkxLDcgQEAKIAogCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldjsKIAlzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYJKmV4dGlmOwotCXN0cnVjdCBsY2RfY3RybAkJKmludF9jdHJsOworCWNvbnN0IHN0cnVjdCBsY2RfY3RybAkqaW50X2N0cmw7CiAKIAl2b2lkCQkJKCpwb3dlcl91cCkoc3RydWN0IGRldmljZSAqZGV2KTsKIAl2b2lkCQkJKCpwb3dlcl9kb3duKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpAQCAtMTM3Miw3ICsxMzcyLDcgQEAKIAkJCSAgICgxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjApOwogfQogCi1zdGF0aWMgdm9pZCBfc2F2ZV9yZWdzKHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCAqbGlzdCwgaW50IGNudCkKK3N0YXRpYyB2b2lkIF9zYXZlX3JlZ3MoY29uc3Qgc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0ICpsaXN0LCBpbnQgY250KQogewogCWludCBpOwogCkBAIC0xMzgzLDcgKzEzODMsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX3Jlc3RvcmVfcmVncyhzdHJ1Y3QgYmxpenphcmRfcmVnX2xpc3QgKmxpc3QsIGludCBjbnQpCitzdGF0aWMgdm9pZCBfcmVzdG9yZV9yZWdzKGNvbnN0IHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCAqbGlzdCwgaW50IGNudCkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYwppbmRleCA4MGExMWQwLi5mMTZlNDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYwpAQCAtMTAzNSw3ICsxMDM1LDcgQEAKIAlhdG9taWNfZGVjKCZkaXNwYy5tYXBfY291bnRbcGxhbmVdKTsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtbWFwX3VzZXJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtbWFwX3VzZXJfb3BzID0gewogCS5vcGVuID0gbW1hcF91c2VyX29wZW4sCiAJLmNsb3NlID0gbW1hcF91c2VyX2Nsb3NlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jIGIvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKaW5kZXggMTI1ZTYwNS4uMGQwYzhjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogICogU2V0IGZiX2luZm8uZml4IGZpZWxkcyBhbmQgYWxzbyB1cGRhdGVzIGZiZGV2LgogICogV2hlbiBjYWxsaW5nIHRoaXMgZmJfaW5mby52YXIgbXVzdCBiZSBzZXQgdXAgYWxyZWFkeS4KICAqLwotc3RhdGljIHZvaWQgc2V0X2ZiX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqZmJpKQorc3RhdGljIHZvaWQgc2V0X2ZiX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBpbnQgZnJvbV9pbml0KQogewogCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4ID0gJmZiaS0+Zml4OwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmZiaS0+dmFyOwpAQCAtNDAzLDEwICs0MDMsMTYgQEAKIAogCXJnID0gJnBsYW5lLT5mYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdOwogCWZiaS0+c2NyZWVuX2Jhc2UJPSByZy0+dmFkZHI7Ci0JbXV0ZXhfbG9jaygmZmJpLT5tbV9sb2NrKTsKLQlmaXgtPnNtZW1fc3RhcnQJCT0gcmctPnBhZGRyOwotCWZpeC0+c21lbV9sZW4JCT0gcmctPnNpemU7Ci0JbXV0ZXhfdW5sb2NrKCZmYmktPm1tX2xvY2spOworCisJaWYgKCFmcm9tX2luaXQpIHsKKwkJbXV0ZXhfbG9jaygmZmJpLT5tbV9sb2NrKTsKKwkJZml4LT5zbWVtX3N0YXJ0CQk9IHJnLT5wYWRkcjsKKwkJZml4LT5zbWVtX2xlbgkJPSByZy0+c2l6ZTsKKwkJbXV0ZXhfdW5sb2NrKCZmYmktPm1tX2xvY2spOworCX0gZWxzZSB7CisJCWZpeC0+c21lbV9zdGFydAkJPSByZy0+cGFkZHI7CisJCWZpeC0+c21lbV9sZW4JCT0gcmctPnNpemU7CisJfQogCiAJZml4LT50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwogCWJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CkBAIC03MDQsNyArNzEwLDcgQEAKIAlpbnQgciA9IDA7CiAKIAlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOwotCXNldF9mYl9maXgoZmJpKTsKKwlzZXRfZmJfZml4KGZiaSwgMCk7CiAJciA9IGN0cmxfY2hhbmdlX21vZGUoZmJpKTsKIAlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CiAKQEAgLTkwNCw3ICs5MTAsNyBAQAogCQlpZiAob2xkX3NpemUgIT0gc2l6ZSkgewogCQkJaWYgKHNpemUpIHsKIAkJCQltZW1jcHkoJmZiaS0+dmFyLCBuZXdfdmFyLCBzaXplb2YoZmJpLT52YXIpKTsKLQkJCQlzZXRfZmJfZml4KGZiaSk7CisJCQkJc2V0X2ZiX2ZpeChmYmksIDApOwogCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIFNldCB0aGVzZSBleHBsaWNpdGx5IHRvIGluZGljYXRlIHRoYXQgdGhlCkBAIC0xNTA0LDcgKzE1MTAsNyBAQAogCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBmYmRldi0+cGFuZWwtPmJwcDsKIAogCXNldF9mYl92YXIoaW5mbywgdmFyKTsKLQlzZXRfZmJfZml4KGluZm8pOworCXNldF9mYl9maXgoaW5mbywgMSk7CiAKIAlyID0gZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMTYsIDApOwogCWlmIChyICE9IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKaW5kZXggNjUwNjExNy4uMTgyMGM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9weGFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcHhhZmIuYwpAQCAtMTYzOCwyNCArMTYzOCwyNiBAQAogICogUG93ZXIgbWFuYWdlbWVudCBob29rcy4gIE5vdGUgdGhhdCB3ZSB3b24ndCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dCwKICAqIHVubGlrZSB0aGUgYmxhbmsgZnVuY3Rpb25zIGFib3ZlLCBzbyB3ZSBtYXkgc2xlZXAuCiAgKi8KLXN0YXRpYyBpbnQgcHhhZmJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhZmJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHB4YWZiX2luZm8gKmZiaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHB4YWZiX2luZm8gKmZiaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJc2V0X2N0cmxyX3N0YXRlKGZiaSwgQ19ESVNBQkxFX1BNKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBweGFmYl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBweGFmYl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBweGFmYl9pbmZvICpmYmkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBweGFmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXNldF9jdHJscl9zdGF0ZShmYmksIENfRU5BQkxFX1BNKTsKIAlyZXR1cm4gMDsKIH0KLSNlbHNlCi0jZGVmaW5lIHB4YWZiX3N1c3BlbmQJTlVMTAotI2RlZmluZSBweGFmYl9yZXN1bWUJTlVMTAorCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgcHhhZmJfcG1fb3BzID0geworCS5zdXNwZW5kCT0gcHhhZmJfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHB4YWZiX3Jlc3VtZSwKK307CiAjZW5kaWYKIAogc3RhdGljIGludCBfX2RldmluaXQgcHhhZmJfaW5pdF92aWRlb19tZW1vcnkoc3RydWN0IHB4YWZiX2luZm8gKmZiaSkKQEAgLTIwODEsNiArMjA4Myw5IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAorCWlmIChjcHVfaXNfcHhhM3h4KCkgJiYgaW5mLT5hY2NlbGVyYXRpb25fZW5hYmxlZCkKKwkJZmJpLT5mYi5maXguYWNjZWwgPSBGQl9BQ0NFTF9QWEEzWFg7CisKIAlmYmktPmJhY2tsaWdodF9wb3dlciA9IGluZi0+cHhhZmJfYmFja2xpZ2h0X3Bvd2VyOwogCWZiaS0+bGNkX3Bvd2VyID0gaW5mLT5weGFmYl9sY2RfcG93ZXI7CiAKQEAgLTIwOTEsMTQgKzIwOTYsMTQgQEAKIAkJZ290byBmYWlsZWRfZmJpOwogCX0KIAotCXIgPSByZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSwgZGV2LT5uYW1lKTsKKwlyID0gcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpLCBkZXYtPm5hbWUpOwogCWlmIChyID09IE5VTEwpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJL08gbWVtb3J5XG4iKTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGZhaWxlZF9mYmk7CiAJfQogCi0JZmJpLT5tbWlvX2Jhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEpOworCWZiaS0+bW1pb19iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CiAJaWYgKGZiaS0+bW1pb19iYXNlID09IE5VTEwpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIEkvTyBtZW1vcnlcbiIpOwogCQlyZXQgPSAtRUJVU1k7CkBAIC0yMTk3LDcgKzIyMDIsNyBAQAogZmFpbGVkX2ZyZWVfaW86CiAJaW91bm1hcChmYmktPm1taW9fYmFzZSk7CiBmYWlsZWRfZnJlZV9yZXM6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CiBmYWlsZWRfZmJpOgogCWNsa19wdXQoZmJpLT5jbGspOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CkBAIC0yMjM3LDcgKzIyNDIsNyBAQAogCWlvdW5tYXAoZmJpLT5tbWlvX2Jhc2UpOwogCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKIAogCWNsa19wdXQoZmJpLT5jbGspOwogCWtmcmVlKGZiaSk7CkBAIC0yMjQ4LDExICsyMjUzLDEyIEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGFmYl9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHB4YWZiX3Byb2JlLAogCS5yZW1vdmUgCT0gX19kZXZleGl0X3AocHhhZmJfcmVtb3ZlKSwKLQkuc3VzcGVuZAk9IHB4YWZiX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBweGFmYl9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkubmFtZQk9ICJweGEyeHgtZmIiLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmcHhhZmJfcG1fb3BzLAorI2VuZGlmCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdXZlc2FmYi5jIGIvZHJpdmVycy92aWRlby91dmVzYWZiLmMKaW5kZXggZTk4YmFmNi4uZTM1MjMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby91dmVzYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby91dmVzYWZiLmMKQEAgLTY3LDExICs2NywxNCBAQAogICogZmluZCB0aGUga2VybmVsIHBhcnQgb2YgdGhlIHRhc2sgc3RydWN0LCBjb3B5IHRoZSByZWdpc3RlcnMgYW5kCiAgKiB0aGUgYnVmZmVyIGNvbnRlbnRzIGFuZCB0aGVuIGNvbXBsZXRlIHRoZSB0YXNrLgogICovCi1zdGF0aWMgdm9pZCB1dmVzYWZiX2NuX2NhbGxiYWNrKHN0cnVjdCBjbl9tc2cgKm1zZykKK3N0YXRpYyB2b2lkIHV2ZXNhZmJfY25fY2FsbGJhY2soc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKm5zcCkKIHsKIAlzdHJ1Y3QgdXZlc2FmYl90YXNrICp1dGFzazsKIAlzdHJ1Y3QgdXZlc2FmYl9rdGFzayAqdGFzazsKIAorCWlmICghY2FwX3JhaXNlZChuc3AtPmVmZl9jYXAsIENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm47CisKIAlpZiAobXNnLT5zZXEgPj0gVVZFU0FGQl9UQVNLU19NQVgpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMKaW5kZXggMjAwYzIyZi4uOWRkNTg4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fYmFsbG9vbi5jCkBAIC0xOSw3ICsxOSw2IEBACiAgKi8KIC8vI2RlZmluZSBERUJVRwogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpby5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fYmFsbG9vbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CkBAIC0yNDgsNyArMjQ3LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCB2aXJ0YmFsbG9vbl9yZW1vdmUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdmlydGJhbGxvb25fcmVtb3ZlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQogewogCXN0cnVjdCB2aXJ0aW9fYmFsbG9vbiAqdmIgPSB2ZGV2LT5wcml2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKaW5kZXggNGExZjFlYi4uMjhkOWNmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCisrKyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYwpAQCAtNTMwLDE5ICs1MzAsMjIgQEAKIAkJCWVyciA9IFBUUl9FUlIodnFzW2ldKTsKIAkJCWdvdG8gZXJyb3JfZmluZDsKIAkJfQorCisJCWlmICghdnBfZGV2LT5wZXJfdnFfdmVjdG9ycyB8fCBtc2l4X3ZlYyA9PSBWSVJUSU9fTVNJX05PX1ZFQ1RPUikKKwkJCWNvbnRpbnVlOworCiAJCS8qIGFsbG9jYXRlIHBlci12cSBpcnEgaWYgYXZhaWxhYmxlIGFuZCBuZWNlc3NhcnkgKi8KLQkJaWYgKHZwX2Rldi0+cGVyX3ZxX3ZlY3RvcnMpIHsKLQkJCXNucHJpbnRmKHZwX2Rldi0+bXNpeF9uYW1lc1ttc2l4X3ZlY10sCi0JCQkJIHNpemVvZiAqdnBfZGV2LT5tc2l4X25hbWVzLAotCQkJCSAiJXMtJXMiLAotCQkJCSBkZXZfbmFtZSgmdnBfZGV2LT52ZGV2LmRldiksIG5hbWVzW2ldKTsKLQkJCWVyciA9IHJlcXVlc3RfaXJxKG1zaXhfdmVjLCB2cmluZ19pbnRlcnJ1cHQsIDAsCi0JCQkJCSAgdnBfZGV2LT5tc2l4X25hbWVzW21zaXhfdmVjXSwKLQkJCQkJICB2cXNbaV0pOwotCQkJaWYgKGVycikgewotCQkJCXZwX2RlbF92cSh2cXNbaV0pOwotCQkJCWdvdG8gZXJyb3JfZmluZDsKLQkJCX0KKwkJc25wcmludGYodnBfZGV2LT5tc2l4X25hbWVzW21zaXhfdmVjXSwKKwkJCSBzaXplb2YgKnZwX2Rldi0+bXNpeF9uYW1lcywKKwkJCSAiJXMtJXMiLAorCQkJIGRldl9uYW1lKCZ2cF9kZXYtPnZkZXYuZGV2KSwgbmFtZXNbaV0pOworCQllcnIgPSByZXF1ZXN0X2lycSh2cF9kZXYtPm1zaXhfZW50cmllc1ttc2l4X3ZlY10udmVjdG9yLAorCQkJCSAgdnJpbmdfaW50ZXJydXB0LCAwLAorCQkJCSAgdnBfZGV2LT5tc2l4X25hbWVzW21zaXhfdmVjXSwKKwkJCQkgIHZxc1tpXSk7CisJCWlmIChlcnIpIHsKKwkJCXZwX2RlbF92cSh2cXNbaV0pOworCQkJZ290byBlcnJvcl9maW5kOwogCQl9CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKaW5kZXggZjUzNjAwNS4uZmJkMmVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jCkBAIC0yODUsNiArMjg1LDkgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJLyogT25seSBnZXQgdXNlZCBhcnJheSBlbnRyaWVzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGV4cG9zZWQgYnkgaG9zdC4gKi8KKwlybWIoKTsKKwogCWkgPSB2cS0+dnJpbmcudXNlZC0+cmluZ1t2cS0+bGFzdF91c2VkX2lkeCV2cS0+dnJpbmcubnVtXS5pZDsKIAkqbGVuID0gdnEtPnZyaW5nLnVzZWQtPnJpbmdbdnEtPmxhc3RfdXNlZF9pZHgldnEtPnZyaW5nLm51bV0ubGVuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZseW5xL3ZseW5xLmMgYi9kcml2ZXJzL3ZseW5xL3ZseW5xLmMKaW5kZXggYmEzZDcxZi4uOTU1NGFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92bHlucS92bHlucS5jCisrKyBiL2RyaXZlcnMvdmx5bnEvdmx5bnEuYwpAQCAtNzAyLDcgKzcwMiw3IEBACiAJZGV2LT5tZW1fc3RhcnQgPSBtZW1fcmVzLT5zdGFydDsKIAlkZXYtPm1lbV9lbmQgPSBtZW1fcmVzLT5lbmQ7CiAKLQlsZW4gPSByZWdzX3Jlcy0+ZW5kIC0gcmVnc19yZXMtPnN0YXJ0OworCWxlbiA9IHJlc291cmNlX3NpemUocmVnc19yZXMpOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlZ3NfcmVzLT5zdGFydCwgbGVuLCBkZXZfbmFtZSgmZGV2LT5kZXYpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCByZXF1ZXN0IHZseW5xIHJlZ2lzdGVyc1xuIiwKIAkJICAgICAgIGRldl9uYW1lKCZkZXYtPmRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ4Mi5jIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ4Mi5jCmluZGV4IGRmNTJjYjMuLjQwNmNhYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczI0ODIuYworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDgyLmMKQEAgLTI0LDE5ICsyNCw2IEBACiAjaW5jbHVkZSAiLi4vdzFfaW50LmgiCiAKIC8qKgotICogQWRkcmVzcyBpcyBzZWxlY3RlZCB1c2luZyAyIHBpbnMsIHJlc3VsdGluZyBpbiA0IHBvc3NpYmxlIGFkZHJlc3Nlcy4KLSAqICAweDE4LCAweDE5LCAweDFhLCAweDFiCi0gKiBIb3dldmVyLCB0aGUgY2hpcCBjYW5ub3QgYmUgZGV0ZWN0ZWQgd2l0aG91dCBkb2luZyBhbiBpMmMgd3JpdGUsCi0gKiBzbyB1c2UgdGhlIGZvcmNlIG1vZHVsZSBwYXJhbWV0ZXIuCi0gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qKgotICogSW5zbW9kIHBhcmFtZXRlcnMKLSAqLwotSTJDX0NMSUVOVF9JTlNNT0RfMShkczI0ODIpOwotCi0vKioKICAqIFRoZSBEUzI0ODIgcmVnaXN0ZXJzIC0gdGhlcmUgYXJlIDMgcmVnaXN0ZXJzIHRoYXQgYXJlIGFkZHJlc3NlZCBieSBhIHJlYWQKICAqIHBvaW50ZXIuIFRoZSByZWFkIHBvaW50ZXIgaXMgc2V0IGJ5IHRoZSBsYXN0IGNvbW1hbmQgZXhlY3V0ZWQuCiAgKgpAQCAtOTYsOCArODMsNiBAQAogCiBzdGF0aWMgaW50IGRzMjQ4Ml9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKTsKLXN0YXRpYyBpbnQgZHMyNDgyX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQga2luZCwKLQkJCSBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pOwogc3RhdGljIGludCBkczI0ODJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogCiAKQEAgLTExNyw4ICsxMDIsNiBAQAogCS5wcm9iZQkJPSBkczI0ODJfcHJvYmUsCiAJLnJlbW92ZQkJPSBkczI0ODJfcmVtb3ZlLAogCS5pZF90YWJsZQk9IGRzMjQ4Ml9pZCwKLQkuZGV0ZWN0CQk9IGRzMjQ4Ml9kZXRlY3QsCi0JLmFkZHJlc3NfZGF0YQk9ICZhZGRyX2RhdGEsCiB9OwogCiAvKgpAQCAtNDI1LDE5ICs0MDgsNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgZHMyNDgyX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQga2luZCwKLQkJCSBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCi17Ci0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCi0JCQkJICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEgfAotCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfQllURSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jc3RybGNweShpbmZvLT50eXBlLCAiZHMyNDgyIiwgSTJDX05BTUVfU0laRSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBkczI0ODJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTQ0Niw2ICs0MTYsMTEgQEAKIAlpbnQgdGVtcDE7CiAJaW50IGlkeDsKIAorCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBIHwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMyNDgyX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmMgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwppbmRleCA1MmNjYjNkLi40NWMxMjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYworKysgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgdm9pZCB3MV9jbl9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2cpCitzdGF0aWMgdm9pZCB3MV9jbl9jYWxsYmFjayhzdHJ1Y3QgY25fbXNnICptc2csIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqbnNwKQogewogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CiAJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKaW5kZXggZmYzZWI4Zi4uMzcxMWI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtMjgyLDYgKzI4MiwxMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbnVjOTAwX3dkdC4KIAorY29uZmlnIEFEWF9XQVRDSERPRworCXRyaXN0YXRlICJBdmlvbmljIERlc2lnbiBYYW50aG9zIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gQVJDSF9QWEFfQURYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgb24gQXZpb25pYworCSAgRGVzaWduIFhhbnRob3MgYm9hcmRzLgorCiAjIEFWUjMyIEFyY2hpdGVjdHVyZQogCiBjb25maWcgQVQzMkFQNzAwWF9XRFQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCmluZGV4IDM0OGIzYjguLjY5OTE5OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKKysrIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQpAQCAtNDUsNiArNDUsNyBAQAogb2JqLSQoQ09ORklHX0NPSDkwMTMyN19XQVRDSERPRykgKz0gY29oOTAxMzI3X3dkdC5vCiBvYmotJChDT05GSUdfU1RNUDNYWFhfV0FUQ0hET0cpICs9IHN0bXAzeHh4X3dkdC5vCiBvYmotJChDT05GSUdfTlVDOTAwX1dBVENIRE9HKSArPSBudWM5MDBfd2R0Lm8KK29iai0kKENPTkZJR19BRFhfV0FUQ0hET0cpICs9IGFkeF93ZHQubwogCiAjIEFWUjMyIEFyY2hpdGVjdHVyZQogb2JqLSQoQ09ORklHX0FUMzJBUDcwMFhfV0RUKSArPSBhdDMyYXA3MDB4X3dkdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2FkeF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYWR4X3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWZiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL2FkeF93ZHQuYwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEF2aW9uaWMgRGVzaWduIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisKKyNkZWZpbmUgV0FUQ0hET0dfTkFNRSAiYWR4LXdkdCIKKworLyogcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZQlBRFhfV0RUX0NPTlRST0wJCTB4MDAKKyNkZWZpbmUJQURYX1dEVF9DT05UUk9MX0VOQUJMRQkoMSA8PCAwKQorI2RlZmluZQlBRFhfV0RUX0NPTlRST0xfblJFU0VUCSgxIDw8IDEpCisjZGVmaW5lCUFEWF9XRFRfVElNRU9VVAkJMHgwOAorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYWR4X3dkdF9kZXY7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkcml2ZXJfb3BlbjsKKworI2RlZmluZQlXRFRfU1RBVEVfU1RPUAkwCisjZGVmaW5lCVdEVF9TVEFURV9TVEFSVAkxCisKK3N0cnVjdCBhZHhfd2R0IHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGludCBzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgd2FrZTsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gYWR4X3dkdF9pbmZvID0geworCS5pZGVudGl0eSA9ICJBdmlvbmljIERlc2lnbiBYYW50aG9zIFdhdGNoZG9nIiwKKwkub3B0aW9ucyA9IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HLAorfTsKKworc3RhdGljIHZvaWQgYWR4X3dkdF9zdGFydF9sb2NrZWQoc3RydWN0IGFkeF93ZHQgKndkdCkKK3sKKwl1MzIgY3RybDsKKworCWN0cmwgPSByZWFkbCh3ZHQtPmJhc2UgKyBBRFhfV0RUX0NPTlRST0wpOworCWN0cmwgfD0gQURYX1dEVF9DT05UUk9MX0VOQUJMRTsKKwl3cml0ZWwoY3RybCwgd2R0LT5iYXNlICsgQURYX1dEVF9DT05UUk9MKTsKKwl3ZHQtPnN0YXRlID0gV0RUX1NUQVRFX1NUQVJUOworfQorCitzdGF0aWMgdm9pZCBhZHhfd2R0X3N0YXJ0KHN0cnVjdCBhZHhfd2R0ICp3ZHQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHQtPmxvY2ssIGZsYWdzKTsKKwlhZHhfd2R0X3N0YXJ0X2xvY2tlZCh3ZHQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndkdC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhZHhfd2R0X3N0b3BfbG9ja2VkKHN0cnVjdCBhZHhfd2R0ICp3ZHQpCit7CisJdTMyIGN0cmw7CisKKwljdHJsID0gcmVhZGwod2R0LT5iYXNlICsgQURYX1dEVF9DT05UUk9MKTsKKwljdHJsICY9IH5BRFhfV0RUX0NPTlRST0xfRU5BQkxFOworCXdyaXRlbChjdHJsLCB3ZHQtPmJhc2UgKyBBRFhfV0RUX0NPTlRST0wpOworCXdkdC0+c3RhdGUgPSBXRFRfU1RBVEVfU1RPUDsKK30KKworc3RhdGljIHZvaWQgYWR4X3dkdF9zdG9wKHN0cnVjdCBhZHhfd2R0ICp3ZHQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHQtPmxvY2ssIGZsYWdzKTsKKwlhZHhfd2R0X3N0b3BfbG9ja2VkKHdkdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkeF93ZHRfc2V0X3RpbWVvdXQoc3RydWN0IGFkeF93ZHQgKndkdCwgdW5zaWduZWQgbG9uZyBzZWNvbmRzKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IHNlY29uZHMgKiAxMDAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN0YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndkdC0+bG9jaywgZmxhZ3MpOworCXN0YXRlID0gd2R0LT5zdGF0ZTsKKwlhZHhfd2R0X3N0b3BfbG9ja2VkKHdkdCk7CisJd3JpdGVsKHRpbWVvdXQsIHdkdC0+YmFzZSArIEFEWF9XRFRfVElNRU9VVCk7CisKKwlpZiAoc3RhdGUgPT0gV0RUX1NUQVRFX1NUQVJUKQorCQlhZHhfd2R0X3N0YXJ0X2xvY2tlZCh3ZHQpOworCisJd2R0LT50aW1lb3V0ID0gdGltZW91dDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZHQtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWR4X3dkdF9nZXRfdGltZW91dChzdHJ1Y3QgYWR4X3dkdCAqd2R0LCB1bnNpZ25lZCBsb25nICpzZWNvbmRzKQoreworCSpzZWNvbmRzID0gd2R0LT50aW1lb3V0IC8gMTAwMDsKK30KKworc3RhdGljIHZvaWQgYWR4X3dkdF9rZWVwYWxpdmUoc3RydWN0IGFkeF93ZHQgKndkdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndkdC0+bG9jaywgZmxhZ3MpOworCXdyaXRlbCh3ZHQtPnRpbWVvdXQsIHdkdC0+YmFzZSArIEFEWF9XRFRfVElNRU9VVCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYWR4X3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhZHhfd2R0ICp3ZHQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShhZHhfd2R0X2Rldik7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZHJpdmVyX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gd2R0OworCWFkeF93ZHRfc2V0X3RpbWVvdXQod2R0LCAzMCk7CisJYWR4X3dkdF9zdGFydCh3ZHQpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGFkeF93ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWR4X3dkdCAqd2R0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJYWR4X3dkdF9zdG9wKHdkdCk7CisJY2xlYXJfYml0KDAsICZkcml2ZXJfb3Blbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgYWR4X3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFkeF93ZHQgKndkdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwl1bnNpZ25lZCBsb25nIF9fdXNlciAqcCA9IGFyZ3A7CisJdW5zaWduZWQgbG9uZyBzZWNvbmRzID0gMDsKKwl1bnNpZ25lZCBpbnQgb3B0aW9uczsKKwlsb25nIHJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmYWR4X3dkdF9pbmZvLCBzaXplb2YoYWR4X3dkdF9pbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlhZHhfd2R0X2tlZXBhbGl2ZSh3ZHQpOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGdldF91c2VyKHNlY29uZHMsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYWR4X3dkdF9zZXRfdGltZW91dCh3ZHQsIHNlY29uZHMpOworCisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlhZHhfd2R0X2dldF90aW1lb3V0KHdkdCwgJnNlY29uZHMpOworCQlyZXR1cm4gcHV0X3VzZXIoc2Vjb25kcywgcCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmb3B0aW9ucywgYXJncCwgc2l6ZW9mKG9wdGlvbnMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCWFkeF93ZHRfc3RvcCh3ZHQpOworCQkJcmV0ID0gMDsKKwkJfQorCisJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJYWR4X3dkdF9zdGFydCh3ZHQpOworCQkJcmV0ID0gMDsKKwkJfQorCisJCXJldHVybiByZXQ7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIHNzaXplX3QgYWR4X3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYWR4X3dkdCAqd2R0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGxlbikKKwkJYWR4X3dkdF9rZWVwYWxpdmUod2R0KTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkeF93ZHRfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5vcGVuID0gYWR4X3dkdF9vcGVuLAorCS5yZWxlYXNlID0gYWR4X3dkdF9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGFkeF93ZHRfaW9jdGwsCisJLndyaXRlID0gYWR4X3dkdF93cml0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhZHhfd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJmFkeF93ZHRfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkeF93ZHRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgYWR4X3dkdCAqd2R0OworCWludCByZXQgPSAwOworCXUzMiBjdHJsOworCisJd2R0ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqd2R0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3ZHQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIFdEVCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmd2R0LT5sb2NrKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG9idGFpbiBJL08gbWVtb3J5IHJlZ2lvblxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmVzID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsIHJlcy0+bmFtZSk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlcXVlc3QgSS9PIG1lbW9yeSByZWdpb25cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXdkdC0+YmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQlyZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlpZiAoIXdkdC0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVtYXAgSS9PIG1lbW9yeSByZWdpb25cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIGRpc2FibGUgd2F0Y2hkb2cgYW5kIHJlYm9vdCBvbiB0aW1lb3V0ICovCisJY3RybCA9IHJlYWRsKHdkdC0+YmFzZSArIEFEWF9XRFRfQ09OVFJPTCk7CisJY3RybCAmPSB+QURYX1dEVF9DT05UUk9MX0VOQUJMRTsKKwljdHJsICY9IH5BRFhfV0RUX0NPTlRST0xfblJFU0VUOworCXdyaXRlbChjdHJsLCB3ZHQtPmJhc2UgKyBBRFhfV0RUX0NPTlRST0wpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgd2R0KTsKKwlhZHhfd2R0X2RldiA9IHBkZXY7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZhZHhfd2R0X21pc2NkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3IgJWQgIgorCQkJCSIoZXJyPSVkKVxuIiwgV0FUQ0hET0dfTUlOT1IsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkeF93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFkeF93ZHQgKndkdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJbWlzY19kZXJlZ2lzdGVyKCZhZHhfd2R0X21pc2NkZXYpOworCWFkeF93ZHRfc3RvcCh3ZHQpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkeF93ZHRfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWR4X3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJYWR4X3dkdF9zdG9wKHdkdCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWR4X3dkdF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGFkeF93ZHQgKndkdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJd2R0LT53YWtlID0gKHdkdC0+c3RhdGUgPT0gV0RUX1NUQVRFX1NUQVJUKSA/IDEgOiAwOworCWFkeF93ZHRfc3RvcCh3ZHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR4X3dkdF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYWR4X3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAod2R0LT53YWtlKQorCQlhZHhfd2R0X3N0YXJ0KHdkdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIGFkeF93ZHRfcG1fb3BzID0geworCS5zdXNwZW5kID0gYWR4X3dkdF9zdXNwZW5kLAorCS5yZXN1bWUgPSBhZHhfd2R0X3Jlc3VtZSwKK307CisKKyMgIGRlZmluZSBBRFhfV0RUX1BNX09QUwkoJmFkeF93ZHRfcG1fb3BzKQorI2Vsc2UKKyMgIGRlZmluZSBBRFhfV0RUX1BNX09QUwlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWR4X3dkdF9kcml2ZXIgPSB7CisJLnByb2JlID0gYWR4X3dkdF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWR4X3dkdF9yZW1vdmUpLAorCS5zaHV0ZG93biA9IGFkeF93ZHRfc2h1dGRvd24sCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBXQVRDSERPR19OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtID0gQURYX1dEVF9QTV9PUFMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkeF93ZHRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFkeF93ZHRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFkeF93ZHRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhZHhfd2R0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFkeF93ZHRfaW5pdCk7Cittb2R1bGVfZXhpdChhZHhfd2R0X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkF2aW9uaWMgRGVzaWduIFhhbnRob3MgV2F0Y2hkb2cgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJUaGllcnJ5IFJlZGluZyA8dGhpZXJyeS5yZWRpbmdAYXZpb25pYy1kZXNpZ24uZGU+Iik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3Jpb3dkLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3Jpb3dkLmMKaW5kZXggMWU4ZjAyZi4uZDNjODI0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9yaW93ZC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvcmlvd2QuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHApOwogCXJpb3dkX2RldmljZSA9IHA7Ci0JZXJyID0gMDsKKwlyZXR1cm4gMDsKIAogb3V0X2lvdW5tYXA6CiAJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwLT5yZWdzLCAyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmZzL3hlbmJ1cy5jIGIvZHJpdmVycy94ZW4veGVuZnMveGVuYnVzLmMKaW5kZXggYTk1OTJkOS4uNmM0MjY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuZnMveGVuYnVzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuZnMveGVuYnVzLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL01ha2VmaWxlIGIvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggNWVhODBiMS4uZjRjYTBjNyAxMDA2NDQKLS0tIGEvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTY3LDEwICs2NywxNSBAQAogZnctc2hpcHBlZC0kKENPTkZJR19FMTAwKSArPSBlMTAwL2QxMDFtX3Vjb2RlLmJpbiBlMTAwL2QxMDFzX3Vjb2RlLmJpbiBcCiAJCQkgICAgIGUxMDAvZDEwMmVfdWNvZGUuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX01ZUklfU0JVUykgKz0gbXlyaWNvbS9sYW5haS5iaW4KLWZ3LXNoaXBwZWQtJChDT05GSUdfUENNQ0lBX1BDTkVUKSArPSBjaXMvTEEtUENNLmNpcyBjaXMvUENNTE0yOC5jaXMKK2Z3LXNoaXBwZWQtJChDT05GSUdfUENNQ0lBX1BDTkVUKSArPSBjaXMvTEEtUENNLmNpcyBjaXMvUENNTE0yOC5jaXMgXAorCQkJCSAgICAgY2lzL0RQODM5MDMuY2lzIGNpcy9ORTJLLmNpcyBcCisJCQkJICAgICBjaXMvdGFtYXJhY2suY2lzIGNpcy9QRS0yMDAuY2lzCiBmdy1zaGlwcGVkLSQoQ09ORklHX1BDTUNJQV8zQzU4OSkgKz0gY2lzLzNDWEVNNTU2LmNpcwogZnctc2hpcHBlZC0kKENPTkZJR19QQ01DSUFfM0M1NzQpICs9IGNpcy8zQ0NGRU01NTYuY2lzCi1mdy1zaGlwcGVkLSQoQ09ORklHX1NFUklBTF84MjUwX0NTKSArPSBjaXMvTVQ1NjM0WkxYLmNpcyBjaXMvUlMtQ09NLTJQLmNpcworZnctc2hpcHBlZC0kKENPTkZJR19TRVJJQUxfODI1MF9DUykgKz0gY2lzL01UNTYzNFpMWC5jaXMgY2lzL1JTLUNPTS0yUC5jaXMgXAorCQkJCSAgICAgICBjaXMvQ09NcGFkMi5jaXMgY2lzL0NPTXBhZDQuY2lzIFwKKwkJCQkgICAgICAgY2lzL1NXXzU1NV9TRVIuY2lzIGNpcy9TV183eHhfU0VSLmNpcyBcCisJCQkJICAgICAgIGNpcy9TV184eHhfU0VSLmNpcwogZnctc2hpcHBlZC0kKENPTkZJR19QQ01DSUFfU01DOTFDOTIpICs9IG9zaXRlY2gvWGlsaW54N09ELmJpbgogZnctc2hpcHBlZC0kKENPTkZJR19TQ1NJX0FEVkFOU1lTKSArPSBhZHZhbnN5cy9tY29kZS5iaW4gYWR2YW5zeXMvMzhDMTYwMC5iaW4gXAogCQkJCSAgICAgIGFkdmFuc3lzLzM1NTAuYmluIGFkdmFuc3lzLzM4QzA4MDAuYmluCmRpZmYgLS1naXQgYS9maXJtd2FyZS9XSEVOQ0UgYi9maXJtd2FyZS9XSEVOQ0UKaW5kZXggM2Y4YzRmNi4uN2E4YWRjMCAxMDA2NDQKLS0tIGEvZmlybXdhcmUvV0hFTkNFCisrKyBiL2Zpcm13YXJlL1dIRU5DRQpAQCAtNTk3LDYgKzU5NywxMCBAQAogCiBGaWxlOiBjaXMvTEEtUENNLmNpcwogICAgICAgY2lzL1BDTUxNMjguY2lzCisgICAgICBjaXMvRFA4MzkwMy5jaXMKKyAgICAgIGNpcy9ORTJLLmNpcworICAgICAgY2lzL3RhbWFyYWNrLmNpcworICAgICAgY2lzL1BFLTIwMC5jaXMKIAogTGljZW5jZTogR1BMCiAKQEAgLTYyOCw2ICs2MzIsMTEgQEAKIAogRmlsZTogY2lzL01UNTYzNFpMWC5jaXMKICAgICAgIGNpcy9SUy1DT00tMlAuY2lzCisgICAgICBjaXMvQ09NcGFkMi5jaXMKKyAgICAgIGNpcy9DT01wYWQ0LmNpcworICAgICAgY2lzL1NXXzU1NV9TRVIuY2lzCisgICAgICBjaXMvU1dfN3h4X1NFUi5jaXMKKyAgICAgIGNpcy9TV184eHhfU0VSLmNpcwogCiBMaWNlbmNlOiBHUEwKIApkaWZmIC0tZ2l0IGEvZmlybXdhcmUvY2lzL0NPTXBhZDIuY2lzLmloZXggYi9maXJtd2FyZS9jaXMvQ09NcGFkMi5jaXMuaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjcxYzVlCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvY2lzL0NPTXBhZDIuY2lzLmloZXgKQEAgLTAsMCArMSwxMSBAQAorOjEwMDAwMDAwMDEwMzAwMDBGRjE1MUYwNDAxNDE0NDU2NDE0RTU0NDVCMQorOjEwMDAxMDAwNDM0ODAwNDM0RjRENzA2MTY0MkQzMzMyMkYzODM1MDAxMworOjEwMDAyMDAwMzEyRTMwMDAwMEZGMjEwMjAyMDExQTA1MDEwNTAwMDFGNgorOjEwMDAzMDAwMDMxQjBFQzE4MTE4QUE2MUU4MDIwN0U4MDMwNzMwQjg2NAorOjEwMDA0MDAwOUUxQjA4ODIwMTA4QUE2MDMwMDMwRjFCMDg4MzAxMDg2OQorOjEwMDA1MDAwQUE2MDQwMDMwRjFCMDg4NDAxMDhBQTYwNTAwMzBGMUIwRAorOjBEMDA2MDAwMDg4NTAxMDhBQTYwNjAwMzBGMTQwMEZGMDA2RQorOjAwMDAwMDAxRkYKKyMKKyMgUmVwbGFjZW1lbnQgQ0lTIGZvciBBZHZhbnRlY2ggQ09NcGFkLTMyLzg1CisjCmRpZmYgLS1naXQgYS9maXJtd2FyZS9jaXMvQ09NcGFkNC5jaXMuaWhleCBiL2Zpcm13YXJlL2Npcy9DT01wYWQ0LmNpcy5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmJlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9jaXMvQ09NcGFkNC5jaXMuaWhleApAQCAtMCwwICsxLDkgQEAKKzoxMDAwMDAwMDAxMDMwMDAwRkYxNTFGMDQwMTQxNDQ1NjQxNEU1NDQ1QjEKKzoxMDAwMTAwMDQzNDgwMDQzNEY0RDcwNjE2NDJEMzMzMjJGMzgzNTQyRDEKKzoxMDAwMjAwMDJEMzQwMDAwMDBGRjIxMDIwMjAxMUEwNTAxMDIwMDAxMjcKKzoxMDAwMzAwMDAxMUIwQkMxODExOEFBNjA0MDAyMUYzMEI4OUUxQjA4MkIKKzowQzAwNDAwMDgyMDEwOEFBNjA0MDAzMUYxNDAwRkYwMEFBCis6MDAwMDAwMDFGRgorIworIyBSZXBsYWNlbWVudCBDSVMgZm9yIEFkdmFudGVjaCBDT01wYWQtMzIvODVCLTQKKyMKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2Npcy9EUDgzOTAzLmNpcy5paGV4IGIvZmlybXdhcmUvY2lzL0RQODM5MDMuY2lzLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3M2VhMwotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2Npcy9EUDgzOTAzLmNpcy5paGV4CkBAIC0wLDAgKzEsMTQgQEAKKzoxMDAwMDAwMDAxMDMwMDAwRkYxNTI5MDQwMTRENzU2Qzc0Njk2Njc1QzQKKzoxMDAwMTAwMDZFNjM3NDY5NkY2RTIwNDM2MTcyNjQwMDAwMDA0RTUzMUEKKzoxMDAwMjAwMDQzMjA0RDQ2MjA0QzQxNEUyRjRENkY2NDY1NkQwMEZGQkYKKzoxMDAwMzAwMDIwMDQ3NTAxMDAwMDIxMDIwMDAwMDYwQjAyMDA0OTAwQTcKKzoxMDAwNDAwMDAwMDAwMDZBMDAwMDAwRkYwMDEzMDM0MzQ5NTMyMTAyMkYKKzoxMDAwNTAwMDA2MDAxQTA2MDUxNzIwMTA3NzAyMUIwQzk3MDE3OTAxN0MKKzoxMDAwNjAwMDU1NjUzMEZGRkYyODQwMDBGRjAwMTMwMzQzNDk1MzIxMkIKKzoxMDAwNzAwMDAyMDIwMDFBMDYwNTA3NDAxMDc3MDIxQjA5ODcwMTE5QzIKKzowODAwODAwMDAxNTUyMzMwRkZGRkZGMDBEMgorOjAwMDAwMDAxRkYKKyMKKyMgVGhpcyBDSVMgaXMgZm9yIGNhcmRzIGJhc2VkIG9uIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisjIERQODM5MDMgTXVsdGlwbGUgRnVuY3Rpb24gSW50ZXJmYWNlIENoaXAKKyMKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2Npcy9ORTJLLmNpcy5paGV4IGIvZmlybXdhcmUvY2lzL05FMksuY2lzLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiNDBmYwotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2Npcy9ORTJLLmNpcy5paGV4CkBAIC0wLDAgKzEsOCBAQAorOjEwMDAwMDAwMDEwMzAwMDBGRjE1MTUwNDAxNTA0MzRENDM0OTQxMDAxMQorOjEwMDAxMDAwNDU3NDY4NjU3MjZFNjU3NDAwMDAwMEZGMjEwMjA2MDA3OQorOjEwMDAyMDAwMUEwNTAxMjBGODAzMDMxQjA5RTAwMTE5MDE1NTY1MzA4OQorOjA2MDAzMDAwRkZGRjE0MDBGRjAwQjkKKzowMDAwMDAwMUZGCisjCisjIFJlcGxhY2VtZW50IENJUyBmb3IgdmFyaW91cyBidXN0ZWQgTkUyMDAwLWNvbXBhdGlibGUgY2FyZHMKKyMKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2Npcy9QRS0yMDAuY2lzLmloZXggYi9maXJtd2FyZS9jaXMvUEUtMjAwLmNpcy5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZGJkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9jaXMvUEUtMjAwLmNpcy5paGV4CkBAIC0wLDAgKzEsOSBAQAorOjEwMDAwMDAwMDEwMzAwMDBGRjE1MUUwNDAxNTA0RDU4MjAyMDIwMDA2MAorOjEwMDAxMDAwNTA0NTJEMzIzMDMwMDA0NTU0NDg0NTUyNEU0NTU0MDAyRAorOjEwMDAyMDAwNTIzMDMxMDBGRjIxMDIwNjAzMUEwNTAxMDEwMDAxMDFDRgorOjEwMDAzMDAwMUIwRUMxODExOTAxNTVFMDUxMDAwRjEwMEYzMEZGRkY1OQorOjA0MDA0MDAwMTQwMEZGMDBBOQorOjAwMDAwMDAxRkYKKyMKKyMgUmVwbGFjZW1lbnQgQ0lTIGZvciBQRS0yMDAgZXRoZXJuZXQgY2FyZAorIwpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvY2lzL1NXXzU1NV9TRVIuY2lzLmloZXggYi9maXJtd2FyZS9jaXMvU1dfNTU1X1NFUi5jaXMuaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjkzNDhhCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvY2lzL1NXXzU1NV9TRVIuY2lzLmloZXgKQEAgLTAsMCArMSwxMiBAQAorOjEwMDAwMDAwMDEwMUZGMTcwMzQxMDBGRjIwMDQzRjAxMTAwNzIxMDJGNworOjEwMDAxMDAwMDIwMDE1MkEwNzAwNTM2OTY1NzI3MjYxMjA1NzY5NzJFMAorOjEwMDAyMDAwNjU2QzY1NzM3MzAwNDE2OTcyNDM2MTcyNjQyMDM1MzU5NAorOjEwMDAzMDAwMzUwMDQxMzUzNTM1MDA1MjY1NzYyMDMxMDBGRjFBMDUwRgorOjEwMDA0MDAwMDEwMzAwMDc3MzFCMEJFMDAxMThBMzYwRjgwMzA3MzBERQorOjEwMDA1MDAwQkMzRjFCMDhBMTAxMDhBMzYwRjgwMjA3MUIwOEEyMDEwRQorOjEwMDA2MDAwMDhBMzYwRTgwMzA3MUIwOEEzMDEwOEEzNjBFODAyMDdEMAorOjBBMDA3MDAwMUIwNEE0MDEwODIzMTQwMEZGMDA4NAorOjAwMDAwMDAxRkYKKyMKKyMgUmVwbGFjZW1lbnQgQ0lTIGZvciBBQzU1NSBwcm92aWRlZCBieSBTaWVycmEgV2lyZWxlc3MKKyMKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2Npcy9TV183eHhfU0VSLmNpcy5paGV4IGIvZmlybXdhcmUvY2lzL1NXXzd4eF9TRVIuY2lzLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlNDRhZAotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2Npcy9TV183eHhfU0VSLmNpcy5paGV4CkBAIC0wLDAgKzEsMTMgQEAKKzoxMDAwMDAwMDAxMDFGRjE3MDM0MTAwRkYyMDA0OTIwMTEwMDcyMTAyQTQKKzoxMDAwMTAwMDAyMDAxNTM3MDcwMDUzNjk2NTcyNzI2MTIwNTc2OTcyRDMKKzoxMDAwMjAwMDY1NkM2NTczNzMwMDQxNDMzNzMxMzAyRjQxNDMzNzM1NzkKKzoxMDAwMzAwMDMwMDA0NzUwNTI1MzIwNEU2NTc0Nzc2RjcyNkIyMDQxRTkKKzoxMDAwNDAwMDY0NjE3MDc0NjU3MjAwNTIzMTAwRkYxQTA1MDEwMzAwOEIKKzoxMDAwNTAwMDA3NzMxQjEwRTAwMTE5Nzg0RDU1NUQyNUEzNjBGODAzNjcKKzoxMDAwNjAwMDA3MzBCQzg2MUIwOEExMDEwOEEzNjBGODAyMDcxQjA4MjMKKzoxMDAwNzAwMEEyMDEwOEEzNjBFODAzMDcxQjA4QTMwMTA4QTM2MEU4MjYKKzowQzAwODAwMDAyMDcxQjA0QTQwMTA4MjMxNDAwRkYwMDY5Cis6MDAwMDAwMDFGRgorIworIyBSZXBsYWNlbWVudCBDSVMgZm9yIEFDN3h4IHByb3ZpZGVkIGJ5IFNpZXJyYSBXaXJlbGVzcworIwpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvY2lzL1NXXzh4eF9TRVIuY2lzLmloZXggYi9maXJtd2FyZS9jaXMvU1dfOHh4X1NFUi5jaXMuaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmNmZTYzCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvY2lzL1NXXzh4eF9TRVIuY2lzLmloZXgKQEAgLTAsMCArMSwxMyBAQAorOjEwMDAwMDAwMDEwMUZGMTcwMzQxMDBGRjIwMDQ5MjAxMTAwNzIxMDJBNAorOjEwMDAxMDAwMDIwMDE1MkYwNzAwNTM2OTY1NzI3MjYxMjA1NzY5NzJEQgorOjEwMDAyMDAwNjU2QzY1NzM3MzAwNDE0MzM4MzUzMDAwMzM0NzIwNEVBQgorOjEwMDAzMDAwNjU3NDc3NkY3MjZCMjA0MTY0NjE3MDc0NjU3MjAwNTJGMQorOjEwMDA0MDAwMzEwMEZGMUEwNTAxMDMwMDA3NzMxQjEwRTAwMTE5Nzg0NgorOjEwMDA1MDAwNEQ1NTVEMjVBMzYwRjg0ODA3MzBCQzg2MUIwOEExMDFGQgorOjEwMDA2MDAwMDhBMzYwRjg0NzA3MUIwOEEyMDEwOEEzNjBFODQ4MDczNworOjEwMDA3MDAwMUIwOEEzMDEwOEEzNjBFODQ3MDcxQjA0QTQwMTA4MjM4OQorOjA0MDA4MDAwMTQwMEZGMDA2OQorOjAwMDAwMDAxRkYKKyMKKyMgUmVwbGFjZW1lbnQgQ0lTIGZvciBBQzh4eCBwcm92aWRlZCBieSBTaWVycmEgV2lyZWxlc3MKKyMKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2Npcy90YW1hcmFjay5jaXMuaWhleCBiL2Zpcm13YXJlL2Npcy90YW1hcmFjay5jaXMuaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTg2NTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvY2lzL3RhbWFyYWNrLmNpcy5paGV4CkBAIC0wLDAgKzEsMTAgQEAKKzoxMDAwMDAwMDAxMDNENDAwRkYxNzAzNDEwMEZGMTUyNDA0MDE1NDQxRUMKKzoxMDAwMTAwMDRENDE1MjQxNDM0QjAwNDU3NDY4NjU3MjZFNjU3NDAwRjIKKzoxMDAwMjAwMDQxMDAzMDMwMzQzNzM0MzMzMTMxMzgzMDMwMzEwMEZGMzMKKzoxMDAwMzAwMDIxMDIwNjAwMUEwNTAxMjBGODAzMDMxQjE0RTA4MTE5QjAKKzoxMDAwNDAwMDNGNTU0RDVEMDY4NjQ2MjZFNTUxMDAwRjEwMEYzMEZGRTcKKzowNTAwNTAwMEZGMTQwMEZGMDA5OQorOjAwMDAwMDAxRkYKKyMKKyMgUmVwbGFjZW1lbnQgQ0lTIGZvciBTdXJlY29tLCBUYW1hcmFjayBORTIwMDAgY2FyZHMKKyMKZGlmZiAtLWdpdCBhL2ZzLzlwL0tjb25maWcgYi9mcy85cC9LY29uZmlnCmluZGV4IDc0ZTA3MjMuLjc5NTIzMzcgMTAwNjQ0Ci0tLSBhL2ZzLzlwL0tjb25maWcKKysrIGIvZnMvOXAvS2NvbmZpZwpAQCAtOCwzICs4LDEyIEBACiAJICBTZWUgPGh0dHA6Ly92OWZzLnNmLm5ldD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyA5UF9GU0NBQ0hFCisJYm9vbCAiRW5hYmxlIDlQIGNsaWVudCBjYWNoaW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIDlQX0ZTPW0gJiYgRlNDQUNIRSB8fCA5UF9GUz15ICYmIEZTQ0FDSEU9eQorCWhlbHAKKwkgIENob29zZSBZIGhlcmUgdG8gZW5hYmxlIHBlcnNpc3RlbnQsIHJlYWQtb25seSBsb2NhbAorCSAgY2FjaGluZyBzdXBwb3J0IGZvciA5cCBjbGllbnRzIHVzaW5nIEZTLUNhY2hlCisKZGlmZiAtLWdpdCBhL2ZzLzlwL01ha2VmaWxlIGIvZnMvOXAvTWFrZWZpbGUKaW5kZXggYmM3ZjBkMS4uMWE5NDBlYyAxMDA2NDQKLS0tIGEvZnMvOXAvTWFrZWZpbGUKKysrIGIvZnMvOXAvTWFrZWZpbGUKQEAgLTgsNSArOCw2IEBACiAJdmZzX2Rpci5vIFwKIAl2ZnNfZGVudHJ5Lm8gXAogCXY5ZnMubyBcCi0JZmlkLm8gXAorCWZpZC5vCiAKKzlwLSQoQ09ORklHXzlQX0ZTQ0FDSEUpICs9IGNhY2hlLm8KZGlmZiAtLWdpdCBhL2ZzLzlwL2NhY2hlLmMgYi9mcy85cC9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzk0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC9jYWNoZS5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogVjlGUyBjYWNoZSBkZWZpbml0aW9ucy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IGJ5IEFiaGlzaGVrIEt1bGthcm5pIDxhZGt1bGthckB1bWFpbC5pdS5lZHU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bmV0LzlwLzlwLmg+CisKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2RlZmluZSBDQUNIRVRBR19MRU4gIDExCisKK3N0cnVjdCBrbWVtX2NhY2hlICp2Y29va2llX2NhY2hlOworCitzdHJ1Y3QgZnNjYWNoZV9uZXRmcyB2OWZzX2NhY2hlX25ldGZzID0geworCS5uYW1lIAkJPSAiOXAiLAorCS52ZXJzaW9uIAk9IDAsCit9OworCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vKQoreworCXN0cnVjdCB2OWZzX2Nvb2tpZSAqdmNvb2tpZSA9IChzdHJ1Y3Qgdjlmc19jb29raWUgKikgZm9vOworCXZjb29raWUtPmZzY2FjaGUgPSBOVUxMOworCXZjb29raWUtPnFpZCA9IE5VTEw7CisJaW5vZGVfaW5pdF9vbmNlKCZ2Y29va2llLT5pbm9kZSk7Cit9CisKKy8qKgorICogdjlmc19pbml0X3Zjb29raWVjYWNoZSAtIGluaXRpYWxpemUgYSBjYWNoZSBmb3IgdmNvb2tpZXMgdG8gbWFpbnRhaW4KKyAqCQkJICAgIHZjb29raWUgdG8gaW5vZGUgbWFwcGluZworICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCisKK3N0YXRpYyBpbnQgdjlmc19pbml0X3Zjb29raWVjYWNoZSh2b2lkKQoreworCXZjb29raWVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidmNvb2tpZV9jYWNoZSIsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCB2OWZzX2Nvb2tpZSksCisJCQkJCSAgMCwgKFNMQUJfUkVDTEFJTV9BQ0NPVU5UfAorCQkJCQkgICAgICBTTEFCX01FTV9TUFJFQUQpLAorCQkJCQkgIGluaXRfb25jZSk7CisJaWYgKCF2Y29va2llX2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHY5ZnNfZGVzdHJveV92Y29va2llY2FjaGUgLSBkZXN0cm95IHRoZSBjYWNoZSBvZiB2Y29va2llcworICoKKyAqLworCitzdGF0aWMgdm9pZCB2OWZzX2Rlc3Ryb3lfdmNvb2tpZWNhY2hlKHZvaWQpCit7CisJa21lbV9jYWNoZV9kZXN0cm95KHZjb29raWVfY2FjaGUpOworfQorCitpbnQgX192OWZzX2NhY2hlX3JlZ2lzdGVyKHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB2OWZzX2luaXRfdmNvb2tpZWNhY2hlKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZnNjYWNoZV9yZWdpc3Rlcl9uZXRmcygmdjlmc19jYWNoZV9uZXRmcyk7Cit9CisKK3ZvaWQgX192OWZzX2NhY2hlX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl2OWZzX2Rlc3Ryb3lfdmNvb2tpZWNhY2hlKCk7CisJZnNjYWNoZV91bnJlZ2lzdGVyX25ldGZzKCZ2OWZzX2NhY2hlX25ldGZzKTsKK30KKworLyoqCisgKiB2OWZzX3JhbmRvbV9jYWNoZXRhZyAtIEdlbmVyYXRlIGEgcmFuZG9tIHRhZyB0byBiZSBhc3NvY2lhdGVkCisgKgkJCSAgd2l0aCBhIG5ldyBjYWNoZSBzZXNzaW9uLgorICoKKyAqIFRoZSB2YWx1ZSBvZiBqaWZmaWVzIGlzIHVzZWQgZm9yIGEgZmFpcmx5IHJhbmRvbWx5IGNhY2hlIHRhZy4KKyAqLworCitzdGF0aWMKK2ludCB2OWZzX3JhbmRvbV9jYWNoZXRhZyhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKQoreworCXY5c2VzLT5jYWNoZXRhZyA9IGttYWxsb2MoQ0FDSEVUQUdfTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXY5c2VzLT5jYWNoZXRhZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gc2NucHJpbnRmKHY5c2VzLT5jYWNoZXRhZywgQ0FDSEVUQUdfTEVOLCAiJWx1IiwgamlmZmllcyk7Cit9CisKK3N0YXRpYyB1aW50MTZfdCB2OWZzX2NhY2hlX3Nlc3Npb25fZ2V0X2tleShjb25zdCB2b2lkICpjb29raWVfbmV0ZnNfZGF0YSwKKwkJCQkJICAgdm9pZCAqYnVmZmVyLCB1aW50MTZfdCBidWZtYXgpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwl1aW50MTZfdCBrbGVuID0gMDsKKworCXY5c2VzID0gKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqKWNvb2tpZV9uZXRmc19kYXRhOworCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAic2Vzc2lvbiAlcCBidWYgJXAgc2l6ZSAldSIsIHY5c2VzLAorCQkgICBidWZmZXIsIGJ1Zm1heCk7CisKKwlpZiAodjlzZXMtPmNhY2hldGFnKQorCQlrbGVuID0gc3RybGVuKHY5c2VzLT5jYWNoZXRhZyk7CisKKwlpZiAoa2xlbiA+IGJ1Zm1heCkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoYnVmZmVyLCB2OXNlcy0+Y2FjaGV0YWcsIGtsZW4pOworCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAiY2FjaGUgc2Vzc2lvbiB0YWcgJXMiLCB2OXNlcy0+Y2FjaGV0YWcpOworCXJldHVybiBrbGVuOworfQorCitjb25zdCBzdHJ1Y3QgZnNjYWNoZV9jb29raWVfZGVmIHY5ZnNfY2FjaGVfc2Vzc2lvbl9pbmRleF9kZWYgPSB7CisJLm5hbWUgCQk9ICI5UC5zZXNzaW9uIiwKKwkudHlwZSAJCT0gRlNDQUNIRV9DT09LSUVfVFlQRV9JTkRFWCwKKwkuZ2V0X2tleSAJPSB2OWZzX2NhY2hlX3Nlc3Npb25fZ2V0X2tleSwKK307CisKK3ZvaWQgdjlmc19jYWNoZV9zZXNzaW9uX2dldF9jb29raWUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcykKK3sKKwkvKiBJZiBubyBjYWNoZSBzZXNzaW9uIHRhZyB3YXMgc3BlY2lmaWVkLCB3ZSBnZW5lcmF0ZSBhIHJhbmRvbSBvbmUuICovCisJaWYgKCF2OXNlcy0+Y2FjaGV0YWcpCisJCXY5ZnNfcmFuZG9tX2NhY2hldGFnKHY5c2VzKTsKKworCXY5c2VzLT5mc2NhY2hlID0gZnNjYWNoZV9hY3F1aXJlX2Nvb2tpZSh2OWZzX2NhY2hlX25ldGZzLnByaW1hcnlfaW5kZXgsCisJCQkJCQkmdjlmc19jYWNoZV9zZXNzaW9uX2luZGV4X2RlZiwKKwkJCQkJCXY5c2VzKTsKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX0ZTQywgInNlc3Npb24gJXAgZ2V0IGNvb2tpZSAlcCIsIHY5c2VzLAorCQkgICB2OXNlcy0+ZnNjYWNoZSk7Cit9CisKK3ZvaWQgdjlmc19jYWNoZV9zZXNzaW9uX3B1dF9jb29raWUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcykKK3sKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX0ZTQywgInNlc3Npb24gJXAgcHV0IGNvb2tpZSAlcCIsIHY5c2VzLAorCQkgICB2OXNlcy0+ZnNjYWNoZSk7CisJZnNjYWNoZV9yZWxpbnF1aXNoX2Nvb2tpZSh2OXNlcy0+ZnNjYWNoZSwgMCk7CisJdjlzZXMtPmZzY2FjaGUgPSBOVUxMOworfQorCisKK3N0YXRpYyB1aW50MTZfdCB2OWZzX2NhY2hlX2lub2RlX2dldF9rZXkoY29uc3Qgdm9pZCAqY29va2llX25ldGZzX2RhdGEsCisJCQkJCSB2b2lkICpidWZmZXIsIHVpbnQxNl90IGJ1Zm1heCkKK3sKKwljb25zdCBzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSBjb29raWVfbmV0ZnNfZGF0YTsKKwltZW1jcHkoYnVmZmVyLCAmdmNvb2tpZS0+cWlkLT5wYXRoLCBzaXplb2YodmNvb2tpZS0+cWlkLT5wYXRoKSk7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX0ZTQywgImlub2RlICVwIGdldCBrZXkgJWxsdSIsICZ2Y29va2llLT5pbm9kZSwKKwkJICAgdmNvb2tpZS0+cWlkLT5wYXRoKTsKKwlyZXR1cm4gc2l6ZW9mKHZjb29raWUtPnFpZC0+cGF0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHY5ZnNfY2FjaGVfaW5vZGVfZ2V0X2F0dHIoY29uc3Qgdm9pZCAqY29va2llX25ldGZzX2RhdGEsCisJCQkJICAgICAgdWludDY0X3QgKnNpemUpCit7CisJY29uc3Qgc3RydWN0IHY5ZnNfY29va2llICp2Y29va2llID0gY29va2llX25ldGZzX2RhdGE7CisJKnNpemUgPSBpX3NpemVfcmVhZCgmdmNvb2tpZS0+aW5vZGUpOworCisJUDlfRFBSSU5USyhQOV9ERUJVR19GU0MsICJpbm9kZSAlcCBnZXQgYXR0ciAlbGx1IiwgJnZjb29raWUtPmlub2RlLAorCQkgICAqc2l6ZSk7Cit9CisKK3N0YXRpYyB1aW50MTZfdCB2OWZzX2NhY2hlX2lub2RlX2dldF9hdXgoY29uc3Qgdm9pZCAqY29va2llX25ldGZzX2RhdGEsCisJCQkJCSB2b2lkICpidWZmZXIsIHVpbnQxNl90IGJ1ZmxlbikKK3sKKwljb25zdCBzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSBjb29raWVfbmV0ZnNfZGF0YTsKKwltZW1jcHkoYnVmZmVyLCAmdmNvb2tpZS0+cWlkLT52ZXJzaW9uLCBzaXplb2YodmNvb2tpZS0+cWlkLT52ZXJzaW9uKSk7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX0ZTQywgImlub2RlICVwIGdldCBhdXggJXUiLCAmdmNvb2tpZS0+aW5vZGUsCisJCSAgIHZjb29raWUtPnFpZC0+dmVyc2lvbik7CisJcmV0dXJuIHNpemVvZih2Y29va2llLT5xaWQtPnZlcnNpb24pOworfQorCitzdGF0aWMgZW51bQorZnNjYWNoZV9jaGVja2F1eCB2OWZzX2NhY2hlX2lub2RlX2NoZWNrX2F1eCh2b2lkICpjb29raWVfbmV0ZnNfZGF0YSwKKwkJCQkJICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJCQkJICAgIHVpbnQxNl90IGJ1ZmxlbikKK3sKKwljb25zdCBzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSBjb29raWVfbmV0ZnNfZGF0YTsKKworCWlmIChidWZsZW4gIT0gc2l6ZW9mKHZjb29raWUtPnFpZC0+dmVyc2lvbikpCisJCXJldHVybiBGU0NBQ0hFX0NIRUNLQVVYX09CU09MRVRFOworCisJaWYgKG1lbWNtcChidWZmZXIsICZ2Y29va2llLT5xaWQtPnZlcnNpb24sCisJCSAgIHNpemVvZih2Y29va2llLT5xaWQtPnZlcnNpb24pKSkKKwkJcmV0dXJuIEZTQ0FDSEVfQ0hFQ0tBVVhfT0JTT0xFVEU7CisKKwlyZXR1cm4gRlNDQUNIRV9DSEVDS0FVWF9PS0FZOworfQorCitzdGF0aWMgdm9pZCB2OWZzX2NhY2hlX2lub2RlX25vd191bmNhY2hlZCh2b2lkICpjb29raWVfbmV0ZnNfZGF0YSkKK3sKKwlzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSBjb29raWVfbmV0ZnNfZGF0YTsKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCXBnb2ZmX3QgZmlyc3Q7CisJaW50IGxvb3AsIG5yX3BhZ2VzOworCisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKKwlmaXJzdCA9IDA7CisKKwlmb3IgKDs7KSB7CisJCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXAoJnB2ZWMsIHZjb29raWUtPmlub2RlLmlfbWFwcGluZywKKwkJCQkJICBmaXJzdCwKKwkJCQkJICBQQUdFVkVDX1NJWkUgLSBwYWdldmVjX2NvdW50KCZwdmVjKSk7CisJCWlmICghbnJfcGFnZXMpCisJCQlicmVhazsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbnJfcGFnZXM7IGxvb3ArKykKKwkJCUNsZWFyUGFnZUZzQ2FjaGUocHZlYy5wYWdlc1tsb29wXSk7CisKKwkJZmlyc3QgPSBwdmVjLnBhZ2VzW25yX3BhZ2VzIC0gMV0tPmluZGV4ICsgMTsKKworCQlwdmVjLm5yID0gbnJfcGFnZXM7CisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KK30KKworY29uc3Qgc3RydWN0IGZzY2FjaGVfY29va2llX2RlZiB2OWZzX2NhY2hlX2lub2RlX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJPSAiOXAuaW5vZGUiLAorCS50eXBlCQk9IEZTQ0FDSEVfQ09PS0lFX1RZUEVfREFUQUZJTEUsCisJLmdldF9rZXkJPSB2OWZzX2NhY2hlX2lub2RlX2dldF9rZXksCisJLmdldF9hdHRyCT0gdjlmc19jYWNoZV9pbm9kZV9nZXRfYXR0ciwKKwkuZ2V0X2F1eAk9IHY5ZnNfY2FjaGVfaW5vZGVfZ2V0X2F1eCwKKwkuY2hlY2tfYXV4CT0gdjlmc19jYWNoZV9pbm9kZV9jaGVja19hdXgsCisJLm5vd191bmNhY2hlZAk9IHY5ZnNfY2FjaGVfaW5vZGVfbm93X3VuY2FjaGVkLAorfTsKKwordm9pZCB2OWZzX2NhY2hlX2lub2RlX2dldF9jb29raWUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWU7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuOworCisJdmNvb2tpZSA9IHY5ZnNfaW5vZGUyY29va2llKGlub2RlKTsKKwlpZiAodmNvb2tpZS0+ZnNjYWNoZSkKKwkJcmV0dXJuOworCisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGlub2RlKTsKKwl2Y29va2llLT5mc2NhY2hlID0gZnNjYWNoZV9hY3F1aXJlX2Nvb2tpZSh2OXNlcy0+ZnNjYWNoZSwKKwkJCQkJCSAgJnY5ZnNfY2FjaGVfaW5vZGVfaW5kZXhfZGVmLAorCQkJCQkJICB2Y29va2llKTsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAiaW5vZGUgJXAgZ2V0IGNvb2tpZSAlcCIsIGlub2RlLAorCQkgICB2Y29va2llLT5mc2NhY2hlKTsKK30KKwordm9pZCB2OWZzX2NhY2hlX2lub2RlX3B1dF9jb29raWUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSB2OWZzX2lub2RlMmNvb2tpZShpbm9kZSk7CisKKwlpZiAoIXZjb29raWUtPmZzY2FjaGUpCisJCXJldHVybjsKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX0ZTQywgImlub2RlICVwIHB1dCBjb29raWUgJXAiLCBpbm9kZSwKKwkJICAgdmNvb2tpZS0+ZnNjYWNoZSk7CisKKwlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKHZjb29raWUtPmZzY2FjaGUsIDApOworCXZjb29raWUtPmZzY2FjaGUgPSBOVUxMOworfQorCit2b2lkIHY5ZnNfY2FjaGVfaW5vZGVfZmx1c2hfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHY5ZnNfY29va2llICp2Y29va2llID0gdjlmc19pbm9kZTJjb29raWUoaW5vZGUpOworCisJaWYgKCF2Y29va2llLT5mc2NhY2hlKQorCQlyZXR1cm47CisJUDlfRFBSSU5USyhQOV9ERUJVR19GU0MsICJpbm9kZSAlcCBmbHVzaCBjb29raWUgJXAiLCBpbm9kZSwKKwkJICAgdmNvb2tpZS0+ZnNjYWNoZSk7CisKKwlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKHZjb29raWUtPmZzY2FjaGUsIDEpOworCXZjb29raWUtPmZzY2FjaGUgPSBOVUxMOworfQorCit2b2lkIHY5ZnNfY2FjaGVfaW5vZGVfc2V0X2Nvb2tpZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSB2OWZzX2lub2RlMmNvb2tpZShpbm9kZSk7CisJc3RydWN0IHA5X2ZpZCAqZmlkOworCisJaWYgKCF2Y29va2llLT5mc2NhY2hlKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJnZjb29raWUtPmxvY2spOworCWZpZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKQorCQl2OWZzX2NhY2hlX2lub2RlX2ZsdXNoX2Nvb2tpZShpbm9kZSk7CisJZWxzZQorCQl2OWZzX2NhY2hlX2lub2RlX2dldF9jb29raWUoaW5vZGUpOworCisJc3Bpbl91bmxvY2soJnZjb29raWUtPmxvY2spOworfQorCit2b2lkIHY5ZnNfY2FjaGVfaW5vZGVfcmVzZXRfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHY5ZnNfY29va2llICp2Y29va2llID0gdjlmc19pbm9kZTJjb29raWUoaW5vZGUpOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisJc3RydWN0IGZzY2FjaGVfY29va2llICpvbGQ7CisKKwlpZiAoIXZjb29raWUtPmZzY2FjaGUpCisJCXJldHVybjsKKworCW9sZCA9IHZjb29raWUtPmZzY2FjaGU7CisKKwlzcGluX2xvY2soJnZjb29raWUtPmxvY2spOworCWZzY2FjaGVfcmVsaW5xdWlzaF9jb29raWUodmNvb2tpZS0+ZnNjYWNoZSwgMSk7CisKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOworCXZjb29raWUtPmZzY2FjaGUgPSBmc2NhY2hlX2FjcXVpcmVfY29va2llKHY5c2VzLT5mc2NhY2hlLAorCQkJCQkJICAmdjlmc19jYWNoZV9pbm9kZV9pbmRleF9kZWYsCisJCQkJCQkgIHZjb29raWUpOworCisJUDlfRFBSSU5USyhQOV9ERUJVR19GU0MsICJpbm9kZSAlcCByZXZhbGlkYXRpbmcgY29va2llIG9sZCAlcCBuZXcgJXAiLAorCQkgICBpbm9kZSwgb2xkLCB2Y29va2llLT5mc2NhY2hlKTsKKworCXNwaW5fdW5sb2NrKCZ2Y29va2llLT5sb2NrKTsKK30KKworaW50IF9fdjlmc19mc2NhY2hlX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCB2OWZzX2Nvb2tpZSAqdmNvb2tpZSA9IHY5ZnNfaW5vZGUyY29va2llKGlub2RlKTsKKworCUJVR19PTighdmNvb2tpZS0+ZnNjYWNoZSk7CisKKwlpZiAoUGFnZUZzQ2FjaGUocGFnZSkpIHsKKwkJaWYgKGZzY2FjaGVfY2hlY2tfcGFnZV93cml0ZSh2Y29va2llLT5mc2NhY2hlLCBwYWdlKSkgeworCQkJaWYgKCEoZ2ZwICYgX19HRlBfV0FJVCkpCisJCQkJcmV0dXJuIDA7CisJCQlmc2NhY2hlX3dhaXRfb25fcGFnZV93cml0ZSh2Y29va2llLT5mc2NhY2hlLCBwYWdlKTsKKwkJfQorCisJCWZzY2FjaGVfdW5jYWNoZV9wYWdlKHZjb29raWUtPmZzY2FjaGUsIHBhZ2UpOworCQlDbGVhclBhZ2VGc0NhY2hlKHBhZ2UpOworCX0KKworCXJldHVybiAxOworfQorCit2b2lkIF9fdjlmc19mc2NhY2hlX2ludmFsaWRhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSB2OWZzX2lub2RlMmNvb2tpZShpbm9kZSk7CisKKwlCVUdfT04oIXZjb29raWUtPmZzY2FjaGUpOworCisJaWYgKFBhZ2VGc0NhY2hlKHBhZ2UpKSB7CisJCWZzY2FjaGVfd2FpdF9vbl9wYWdlX3dyaXRlKHZjb29raWUtPmZzY2FjaGUsIHBhZ2UpOworCQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCQlmc2NhY2hlX3VuY2FjaGVfcGFnZSh2Y29va2llLT5mc2NhY2hlLCBwYWdlKTsKKwkJQ2xlYXJQYWdlRnNDYWNoZShwYWdlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHY5ZnNfdmZzX3JlYWRwYWdlX2NvbXBsZXRlKHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpkYXRhLAorCQkJCSAgICAgICBpbnQgZXJyb3IpCit7CisJaWYgKCFlcnJvcikKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJdW5sb2NrX3BhZ2UocGFnZSk7Cit9CisKKy8qKgorICogX192OWZzX3JlYWRwYWdlX2Zyb21fZnNjYWNoZSAtIHJlYWQgYSBwYWdlIGZyb20gY2FjaGUKKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIHBhZ2VzIGFyZSBpbiBjYWNoZSBhbmQgYSBCSU8gaXMgc3VibWl0dGVkLAorICogMSBpZiB0aGUgcGFnZXMgYXJlIG5vdCBpbiBjYWNoZSBhbmQgLWVycm9yIG90aGVyd2lzZS4KKyAqLworCitpbnQgX192OWZzX3JlYWRwYWdlX2Zyb21fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCB2OWZzX2Nvb2tpZSAqdmNvb2tpZSA9IHY5ZnNfaW5vZGUyY29va2llKGlub2RlKTsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAiaW5vZGUgJXAgcGFnZSAlcCIsIGlub2RlLCBwYWdlKTsKKwlpZiAoIXZjb29raWUtPmZzY2FjaGUpCisJCXJldHVybiAtRU5PQlVGUzsKKworCXJldCA9IGZzY2FjaGVfcmVhZF9vcl9hbGxvY19wYWdlKHZjb29raWUtPmZzY2FjaGUsCisJCQkJCSBwYWdlLAorCQkJCQkgdjlmc192ZnNfcmVhZHBhZ2VfY29tcGxldGUsCisJCQkJCSBOVUxMLAorCQkJCQkgR0ZQX0tFUk5FTCk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIC1FTk9CVUZTOgorCWNhc2UgLUVOT0RBVEE6CisJCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAicGFnZS9pbm9kZSBub3QgaW4gY2FjaGUgJWQiLCByZXQpOworCQlyZXR1cm4gMTsKKwljYXNlIDA6CisJCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAiQklPIHN1Ym1pdHRlZCIpOworCQlyZXR1cm4gcmV0OworCWRlZmF1bHQ6CisJCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAicmV0ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9Cit9CisKKy8qKgorICogX192OWZzX3JlYWRwYWdlc19mcm9tX2ZzY2FjaGUgLSByZWFkIG11bHRpcGxlIHBhZ2VzIGZyb20gY2FjaGUKKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIHBhZ2VzIGFyZSBpbiBjYWNoZSBhbmQgYSBCSU8gaXMgc3VibWl0dGVkLAorICogMSBpZiB0aGUgcGFnZXMgYXJlIG5vdCBpbiBjYWNoZSBhbmQgLWVycm9yIG90aGVyd2lzZS4KKyAqLworCitpbnQgX192OWZzX3JlYWRwYWdlc19mcm9tX2ZzY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsCisJCQkJICB1bnNpZ25lZCAqbnJfcGFnZXMpCit7CisJaW50IHJldDsKKwljb25zdCBzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSB2OWZzX2lub2RlMmNvb2tpZShpbm9kZSk7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX0ZTQywgImlub2RlICVwIHBhZ2VzICV1IiwgaW5vZGUsICpucl9wYWdlcyk7CisJaWYgKCF2Y29va2llLT5mc2NhY2hlKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlyZXQgPSBmc2NhY2hlX3JlYWRfb3JfYWxsb2NfcGFnZXModmNvb2tpZS0+ZnNjYWNoZSwKKwkJCQkJICBtYXBwaW5nLCBwYWdlcywgbnJfcGFnZXMsCisJCQkJCSAgdjlmc192ZnNfcmVhZHBhZ2VfY29tcGxldGUsCisJCQkJCSAgTlVMTCwKKwkJCQkJICBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgLUVOT0JVRlM6CisJY2FzZSAtRU5PREFUQToKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19GU0MsICJwYWdlcy9pbm9kZXMgbm90IGluIGNhY2hlICVkIiwgcmV0KTsKKwkJcmV0dXJuIDE7CisJY2FzZSAwOgorCQlCVUdfT04oIWxpc3RfZW1wdHkocGFnZXMpKTsKKwkJQlVHX09OKCpucl9wYWdlcyAhPSAwKTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19GU0MsICJCSU8gc3VibWl0dGVkIik7CisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19GU0MsICJyZXQgJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KK30KKworLyoqCisgKiBfX3Y5ZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZSAtIHdyaXRlIGEgcGFnZSB0byB0aGUgY2FjaGUKKyAqCisgKi8KKwordm9pZCBfX3Y5ZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCB2OWZzX2Nvb2tpZSAqdmNvb2tpZSA9IHY5ZnNfaW5vZGUyY29va2llKGlub2RlKTsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAiaW5vZGUgJXAgcGFnZSAlcCIsIGlub2RlLCBwYWdlKTsKKwlyZXQgPSBmc2NhY2hlX3dyaXRlX3BhZ2UodmNvb2tpZS0+ZnNjYWNoZSwgcGFnZSwgR0ZQX0tFUk5FTCk7CisJUDlfRFBSSU5USyhQOV9ERUJVR19GU0MsICJyZXQgPSAgJWQiLCByZXQpOworCWlmIChyZXQgIT0gMCkKKwkJdjlmc191bmNhY2hlX3BhZ2UoaW5vZGUsIHBhZ2UpOworfQpkaWZmIC0tZ2l0IGEvZnMvOXAvY2FjaGUuaCBiL2ZzLzlwL2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0MTkyYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL2NhY2hlLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBWOUZTIGNhY2hlIGRlZmluaXRpb25zLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgYnkgQWJoaXNoZWsgS3Vsa2FybmkgPGFka3Vsa2FyQHVtYWlsLml1LmVkdT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfOVBfQ0FDSEVfSAorI2lmZGVmIENPTkZJR185UF9GU0NBQ0hFCisjaW5jbHVkZSA8bGludXgvZnNjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqdmNvb2tpZV9jYWNoZTsKKworc3RydWN0IHY5ZnNfY29va2llIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGlub2RlIGlub2RlOworCXN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqZnNjYWNoZTsKKwlzdHJ1Y3QgcDlfcWlkICpxaWQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2OWZzX2Nvb2tpZSAqdjlmc19pbm9kZTJjb29raWUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgdjlmc19jb29raWUsIGlub2RlKTsKK30KKworZXh0ZXJuIHN0cnVjdCBmc2NhY2hlX25ldGZzIHY5ZnNfY2FjaGVfbmV0ZnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGZzY2FjaGVfY29va2llX2RlZiB2OWZzX2NhY2hlX3Nlc3Npb25faW5kZXhfZGVmOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmc2NhY2hlX2Nvb2tpZV9kZWYgdjlmc19jYWNoZV9pbm9kZV9pbmRleF9kZWY7CisKK2V4dGVybiB2b2lkIHY5ZnNfY2FjaGVfc2Vzc2lvbl9nZXRfY29va2llKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOworZXh0ZXJuIHZvaWQgdjlmc19jYWNoZV9zZXNzaW9uX3B1dF9jb29raWUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyk7CisKK2V4dGVybiB2b2lkIHY5ZnNfY2FjaGVfaW5vZGVfZ2V0X2Nvb2tpZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiB2b2lkIHY5ZnNfY2FjaGVfaW5vZGVfcHV0X2Nvb2tpZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiB2b2lkIHY5ZnNfY2FjaGVfaW5vZGVfZmx1c2hfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgdjlmc19jYWNoZV9pbm9kZV9zZXRfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiB2b2lkIHY5ZnNfY2FjaGVfaW5vZGVfcmVzZXRfY29va2llKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCitleHRlcm4gaW50IF9fdjlmc19jYWNoZV9yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiB2b2lkIF9fdjlmc19jYWNoZV91bnJlZ2lzdGVyKHZvaWQpOworCitleHRlcm4gaW50IF9fdjlmc19mc2NhY2hlX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwKTsKK2V4dGVybiB2b2lkIF9fdjlmc19mc2NhY2hlX2ludmFsaWRhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CitleHRlcm4gaW50IF9fdjlmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIGludCBfX3Y5ZnNfcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywKKwkJCQkJIHVuc2lnbmVkICpucl9wYWdlcyk7CitleHRlcm4gdm9pZCBfX3Y5ZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CisKKworLyoqCisgKiB2OWZzX2NhY2hlX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgdjlmcyBmaWxlIHN5c3RlbSB3aXRoIHRoZSBjYWNoZQorICovCitzdGF0aWMgaW5saW5lIGludCB2OWZzX2NhY2hlX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIF9fdjlmc19jYWNoZV9yZWdpc3RlcigpOworfQorCisvKioKKyAqIHY5ZnNfY2FjaGVfdW5yZWdpc3RlciAtIFVucmVnaXN0ZXIgdjlmcyBmcm9tIHRoZSBjYWNoZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdjlmc19jYWNoZV91bnJlZ2lzdGVyKHZvaWQpCit7CisJX192OWZzX2NhY2hlX3VucmVnaXN0ZXIoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdjlmc19mc2NhY2hlX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJICAgIGdmcF90IGdmcCkKK3sKKwlyZXR1cm4gX192OWZzX2ZzY2FjaGVfcmVsZWFzZV9wYWdlKHBhZ2UsIGdmcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2OWZzX2ZzY2FjaGVfaW52YWxpZGF0ZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCV9fdjlmc19mc2NhY2hlX2ludmFsaWRhdGVfcGFnZShwYWdlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdjlmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gX192OWZzX3JlYWRwYWdlX2Zyb21fZnNjYWNoZShpbm9kZSwgcGFnZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHY5ZnNfcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsCisJCQkJCSAgICAgIHVuc2lnbmVkICpucl9wYWdlcykKK3sKKwlyZXR1cm4gX192OWZzX3JlYWRwYWdlc19mcm9tX2ZzY2FjaGUoaW5vZGUsIG1hcHBpbmcsIHBhZ2VzLAorCQkJCQkgICAgIG5yX3BhZ2VzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHY5ZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKFBhZ2VGc0NhY2hlKHBhZ2UpKQorCQlfX3Y5ZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZShpbm9kZSwgcGFnZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2OWZzX3VuY2FjaGVfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSB2OWZzX2lub2RlMmNvb2tpZShpbm9kZSk7CisJZnNjYWNoZV91bmNhY2hlX3BhZ2UodmNvb2tpZS0+ZnNjYWNoZSwgcGFnZSk7CisJQlVHX09OKFBhZ2VGc0NhY2hlKHBhZ2UpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHY5ZnNfdmNvb2tpZV9zZXRfcWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBwOV9xaWQgKnFpZCkKK3sKKwlzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWUgPSB2OWZzX2lub2RlMmNvb2tpZShpbm9kZSk7CisJc3Bpbl9sb2NrKCZ2Y29va2llLT5sb2NrKTsKKwl2Y29va2llLT5xaWQgPSBxaWQ7CisJc3Bpbl91bmxvY2soJnZjb29raWUtPmxvY2spOworfQorCisjZWxzZSAvKiBDT05GSUdfOVBfRlNDQUNIRSAqLworCitzdGF0aWMgaW5saW5lIGludCB2OWZzX2NhY2hlX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2OWZzX2NhY2hlX3VucmVnaXN0ZXIodm9pZCkge30KKworc3RhdGljIGlubGluZSBpbnQgdjlmc19mc2NhY2hlX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJICAgIGdmcF90IGdmcCkgeworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdjlmc19mc2NhY2hlX2ludmFsaWRhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkge30KKworc3RhdGljIGlubGluZSBpbnQgdjlmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gLUVOT0JVRlM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHY5ZnNfcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsCisJCQkJCSAgICAgIHVuc2lnbmVkICpucl9wYWdlcykKK3sKKwlyZXR1cm4gLUVOT0JVRlM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2OWZzX3JlYWRwYWdlX3RvX2ZzY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHN0cnVjdCBwYWdlICpwYWdlKQore30KKworc3RhdGljIGlubGluZSB2b2lkIHY5ZnNfdW5jYWNoZV9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlKQore30KKworc3RhdGljIGlubGluZSB2b2lkIHY5ZnNfdmNvb2tpZV9zZXRfcWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBwOV9xaWQgKnFpZCkKK3t9CisKKyNlbmRpZiAvKiBDT05GSUdfOVBfRlNDQUNIRSAqLworI2VuZGlmIC8qIF85UF9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9mcy85cC92OWZzLmMgYi9mcy85cC92OWZzLmMKaW5kZXggZjcwMDNjZi4uY2Y2MmIwNSAxMDA2NDQKLS0tIGEvZnMvOXAvdjlmcy5jCisrKyBiL2ZzLzlwL3Y5ZnMuYwpAQCAtMzQsMjEgKzM0LDI1IEBACiAjaW5jbHVkZSA8bmV0LzlwL3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgInY5ZnMuaCIKICNpbmNsdWRlICJ2OWZzX3Zmcy5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodjlmc19zZXNzaW9ubGlzdF9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQodjlmc19zZXNzaW9ubGlzdCk7CiAKIC8qCi0gICogT3B0aW9uIFBhcnNpbmcgKGNvZGUgaW5zcGlyZWQgYnkgTkZTIGNvZGUpCi0gICogIE5PVEU6IGVhY2ggdHJhbnNwb3J0IHdpbGwgcGFyc2UgaXRzIG93biBvcHRpb25zCi0gICovCisgKiBPcHRpb24gUGFyc2luZyAoY29kZSBpbnNwaXJlZCBieSBORlMgY29kZSkKKyAqICBOT1RFOiBlYWNoIHRyYW5zcG9ydCB3aWxsIHBhcnNlIGl0cyBvd24gb3B0aW9ucworICovCiAKIGVudW0gewogCS8qIE9wdGlvbnMgdGhhdCB0YWtlIGludGVnZXIgYXJndW1lbnRzICovCiAJT3B0X2RlYnVnLCBPcHRfZGZsdHVpZCwgT3B0X2RmbHRnaWQsIE9wdF9hZmlkLAogCS8qIFN0cmluZyBvcHRpb25zICovCi0JT3B0X3VuYW1lLCBPcHRfcmVtb3RlbmFtZSwgT3B0X3RyYW5zLAorCU9wdF91bmFtZSwgT3B0X3JlbW90ZW5hbWUsIE9wdF90cmFucywgT3B0X2NhY2hlLCBPcHRfY2FjaGV0YWcsCiAJLyogT3B0aW9ucyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzICovCiAJT3B0X25vZGV2bWFwLAogCS8qIENhY2hlIG9wdGlvbnMgKi8KLQlPcHRfY2FjaGVfbG9vc2UsCisJT3B0X2NhY2hlX2xvb3NlLCBPcHRfZnNjYWNoZSwKIAkvKiBBY2Nlc3Mgb3B0aW9ucyAqLwogCU9wdF9hY2Nlc3MsCiAJLyogRXJyb3IgdG9rZW4gKi8KQEAgLTYzLDggKzY3LDEwIEBACiAJe09wdF91bmFtZSwgInVuYW1lPSVzIn0sCiAJe09wdF9yZW1vdGVuYW1lLCAiYW5hbWU9JXMifSwKIAl7T3B0X25vZGV2bWFwLCAibm9kZXZtYXAifSwKLQl7T3B0X2NhY2hlX2xvb3NlLCAiY2FjaGU9bG9vc2UifSwKKwl7T3B0X2NhY2hlLCAiY2FjaGU9JXMifSwKIAl7T3B0X2NhY2hlX2xvb3NlLCAibG9vc2UifSwKKwl7T3B0X2ZzY2FjaGUsICJmc2NhY2hlIn0sCisJe09wdF9jYWNoZXRhZywgImNhY2hldGFnPSVzIn0sCiAJe09wdF9hY2Nlc3MsICJhY2Nlc3M9JXMifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CkBAIC04OSwxNiArOTUsMTYgQEAKIAl2OXNlcy0+YWZpZCA9IH4wOwogCXY5c2VzLT5kZWJ1ZyA9IDA7CiAJdjlzZXMtPmNhY2hlID0gMDsKKyNpZmRlZiBDT05GSUdfOVBfRlNDQUNIRQorCXY5c2VzLT5jYWNoZXRhZyA9IE5VTEw7CisjZW5kaWYKIAogCWlmICghb3B0cykKIAkJcmV0dXJuIDA7CiAKIAlvcHRpb25zID0ga3N0cmR1cChvcHRzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW9wdGlvbnMpIHsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19FUlJPUiwKLQkJCSAgICJmYWlsZWQgdG8gYWxsb2NhdGUgY29weSBvZiBvcHRpb24gc3RyaW5nXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWlmICghb3B0aW9ucykKKwkJZ290byBmYWlsX29wdGlvbl9hbGxvYzsKIAogCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewogCQlpbnQgdG9rZW47CkBAIC0xNDMsMTYgKzE0OSwzMyBAQAogCQljYXNlIE9wdF9jYWNoZV9sb29zZToKIAkJCXY5c2VzLT5jYWNoZSA9IENBQ0hFX0xPT1NFOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X2ZzY2FjaGU6CisJCQl2OXNlcy0+Y2FjaGUgPSBDQUNIRV9GU0NBQ0hFOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NhY2hldGFnOgorI2lmZGVmIENPTkZJR185UF9GU0NBQ0hFCisJCQl2OXNlcy0+Y2FjaGV0YWcgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2FjaGU6CisJCQlzID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKKwkJCWlmICghcykKKwkJCQlnb3RvIGZhaWxfb3B0aW9uX2FsbG9jOworCisJCQlpZiAoc3RyY21wKHMsICJsb29zZSIpID09IDApCisJCQkJdjlzZXMtPmNhY2hlID0gQ0FDSEVfTE9PU0U7CisJCQllbHNlIGlmIChzdHJjbXAocywgImZzY2FjaGUiKSA9PSAwKQorCQkJCXY5c2VzLT5jYWNoZSA9IENBQ0hFX0ZTQ0FDSEU7CisJCQllbHNlCisJCQkJdjlzZXMtPmNhY2hlID0gQ0FDSEVfTk9ORTsKKwkJCWtmcmVlKHMpOworCQkJYnJlYWs7CiAKIAkJY2FzZSBPcHRfYWNjZXNzOgogCQkJcyA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7Ci0JCQlpZiAoIXMpIHsKLQkJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX0VSUk9SLAotCQkJCQkgICAiZmFpbGVkIHRvIGFsbG9jYXRlIGNvcHkiCi0JCQkJCSAgICIgb2Ygb3B0aW9uIGFyZ3VtZW50XG4iKTsKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYgKCFzKQorCQkJCWdvdG8gZmFpbF9vcHRpb25fYWxsb2M7CisKIAkJCXY5c2VzLT5mbGFncyAmPSB+VjlGU19BQ0NFU1NfTUFTSzsKIAkJCWlmIChzdHJjbXAocywgInVzZXIiKSA9PSAwKQogCQkJCXY5c2VzLT5mbGFncyB8PSBWOUZTX0FDQ0VTU19VU0VSOwpAQCAtMTczLDYgKzE5NiwxMSBAQAogCX0KIAlrZnJlZShvcHRpb25zKTsKIAlyZXR1cm4gcmV0OworCitmYWlsX29wdGlvbl9hbGxvYzoKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX0VSUk9SLAorCQkgICAiZmFpbGVkIHRvIGFsbG9jYXRlIGNvcHkgb2Ygb3B0aW9uIGFyZ3VtZW50XG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogLyoqCkBAIC0yMDAsNiArMjI4LDEwIEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAorCXNwaW5fbG9jaygmdjlmc19zZXNzaW9ubGlzdF9sb2NrKTsKKwlsaXN0X2FkZCgmdjlzZXMtPnNsaXN0LCAmdjlmc19zZXNzaW9ubGlzdCk7CisJc3Bpbl91bmxvY2soJnY5ZnNfc2Vzc2lvbmxpc3RfbG9jayk7CisKIAl2OXNlcy0+ZmxhZ3MgPSBWOUZTX0VYVEVOREVEIHwgVjlGU19BQ0NFU1NfVVNFUjsKIAlzdHJjcHkodjlzZXMtPnVuYW1lLCBWOUZTX0RFRlVTRVIpOwogCXN0cmNweSh2OXNlcy0+YW5hbWUsIFY5RlNfREVGQU5BTUUpOwpAQCAtMjQ5LDYgKzI4MSwxMSBAQAogCWVsc2UKIAkJZmlkLT51aWQgPSB+MDsKIAorI2lmZGVmIENPTkZJR185UF9GU0NBQ0hFCisJLyogcmVnaXN0ZXIgdGhlIHNlc3Npb24gZm9yIGNhY2hpbmcgKi8KKwl2OWZzX2NhY2hlX3Nlc3Npb25fZ2V0X2Nvb2tpZSh2OXNlcyk7CisjZW5kaWYKKwogCXJldHVybiBmaWQ7CiAKIGVycm9yOgpAQCAtMjY4LDggKzMwNSwxOCBAQAogCQl2OXNlcy0+Y2xudCA9IE5VTEw7CiAJfQogCisjaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKKwlpZiAodjlzZXMtPmZzY2FjaGUpIHsKKwkJdjlmc19jYWNoZV9zZXNzaW9uX3B1dF9jb29raWUodjlzZXMpOworCQlrZnJlZSh2OXNlcy0+Y2FjaGV0YWcpOworCX0KKyNlbmRpZgogCV9fcHV0bmFtZSh2OXNlcy0+dW5hbWUpOwogCV9fcHV0bmFtZSh2OXNlcy0+YW5hbWUpOworCisJc3Bpbl9sb2NrKCZ2OWZzX3Nlc3Npb25saXN0X2xvY2spOworCWxpc3RfZGVsKCZ2OXNlcy0+c2xpc3QpOworCXNwaW5fdW5sb2NrKCZ2OWZzX3Nlc3Npb25saXN0X2xvY2spOwogfQogCiAvKioKQEAgLTI4NiwyNSArMzMzLDEzMiBAQAogCiBleHRlcm4gaW50IHY5ZnNfZXJyb3JfaW5pdCh2b2lkKTsKIAorc3RhdGljIHN0cnVjdCBrb2JqZWN0ICp2OWZzX2tvYmo7CisKKyNpZmRlZiBDT05GSUdfOVBfRlNDQUNIRQogLyoqCi0gKiB2OWZzX2luaXQgLSBJbml0aWFsaXplIG1vZHVsZQorICogY2FjaGVzX3Nob3cgLSBsaXN0IGNhY2hlcyBhc3NvY2lhdGVkIHdpdGggYSBzZXNzaW9uCisgKgorICogUmV0dXJucyB0aGUgc2l6ZSBvZiBidWZmZXIgd3JpdHRlbi4KKyAqLworCitzdGF0aWMgc3NpemVfdCBjYWNoZXNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IG4gPSAwLCBjb3VudCA9IDAsIGxpbWl0ID0gUEFHRV9TSVpFOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisKKwlzcGluX2xvY2soJnY5ZnNfc2Vzc2lvbmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2OXNlcywgJnY5ZnNfc2Vzc2lvbmxpc3QsIHNsaXN0KSB7CisJCWlmICh2OXNlcy0+Y2FjaGV0YWcpIHsKKwkJCW4gPSBzbnByaW50ZihidWYsIGxpbWl0LCAiJXNcbiIsIHY5c2VzLT5jYWNoZXRhZyk7CisJCQlpZiAobiA8IDApIHsKKwkJCQljb3VudCA9IG47CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNvdW50ICs9IG47CisJCQlsaW1pdCAtPSBuOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJnY5ZnNfc2Vzc2lvbmxpc3RfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHY5ZnNfYXR0cl9jYWNoZSA9IF9fQVRUUl9STyhjYWNoZXMpOworI2VuZGlmIC8qIENPTkZJR185UF9GU0NBQ0hFICovCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2OWZzX2F0dHJzW10gPSB7CisjaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKKwkmdjlmc19hdHRyX2NhY2hlLmF0dHIsCisjZW5kaWYKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdjlmc19hdHRyX2dyb3VwID0geworCS5hdHRycyA9IHY5ZnNfYXR0cnMsCit9OworCisvKioKKyAqIHY5ZnNfc3lzZnNfaW5pdCAtIEluaXRpYWxpemUgdGhlIHY5ZnMgc3lzZnMgaW50ZXJmYWNlCisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc19zeXNmc19pbml0KHZvaWQpCit7CisJdjlmc19rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiOXAiLCBmc19rb2JqKTsKKwlpZiAoIXY5ZnNfa29iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKHY5ZnNfa29iaiwgJnY5ZnNfYXR0cl9ncm91cCkpIHsKKwkJa29iamVjdF9wdXQodjlmc19rb2JqKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc19zeXNmc19jbGVhbnVwIC0gVW5yZWdpc3RlciB0aGUgdjlmcyBzeXNmcyBpbnRlcmZhY2UKKyAqCisgKi8KKworc3RhdGljIHZvaWQgdjlmc19zeXNmc19jbGVhbnVwKHZvaWQpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKHY5ZnNfa29iaiwgJnY5ZnNfYXR0cl9ncm91cCk7CisJa29iamVjdF9wdXQodjlmc19rb2JqKTsKK30KKworLyoqCisgKiBpbml0X3Y5ZnMgLSBJbml0aWFsaXplIG1vZHVsZQogICoKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3Y5ZnModm9pZCkKIHsKKwlpbnQgZXJyOwogCXByaW50ayhLRVJOX0lORk8gIkluc3RhbGxpbmcgdjlmcyA5cDIwMDAgZmlsZSBzeXN0ZW0gc3VwcG9ydFxuIik7CiAJLyogVE9ETzogU2V0dXAgbGlzdCBvZiByZWdpc3RlcmVkIHRyYXNucG9ydCBtb2R1bGVzICovCi0JcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnY5ZnNfZnNfdHlwZSk7CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdjlmc19mc190eXBlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBmaWxlc3lzdGVtXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSB2OWZzX2NhY2hlX3JlZ2lzdGVyKCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgdjlmcyBmb3IgY2FjaGluZ1xuIik7CisJCWdvdG8gb3V0X2ZzX3VucmVnOworCX0KKworCWVyciA9IHY5ZnNfc3lzZnNfaW5pdCgpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggc3lzZnNcbiIpOworCQlnb3RvIG91dF9zeXNmc19jbGVhbnVwOworCX0KKworCXJldHVybiAwOworCitvdXRfc3lzZnNfY2xlYW51cDoKKwl2OWZzX3N5c2ZzX2NsZWFudXAoKTsKKworb3V0X2ZzX3VucmVnOgorCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdjlmc19mc190eXBlKTsKKworCXJldHVybiBlcnI7CiB9CiAKIC8qKgotICogdjlmc19pbml0IC0gc2h1dGRvd24gbW9kdWxlCisgKiBleGl0X3Y5ZnMgLSBzaHV0ZG93biBtb2R1bGUKICAqCiAgKi8KIAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdjlmcyh2b2lkKQogeworCXY5ZnNfc3lzZnNfY2xlYW51cCgpOworCXY5ZnNfY2FjaGVfdW5yZWdpc3RlcigpOwogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdjlmc19mc190eXBlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5oIGIvZnMvOXAvdjlmcy5oCmluZGV4IDM4NzYyYmYuLjAxOWY0Y2MgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnMuaAorKysgYi9mcy85cC92OWZzLmgKQEAgLTUxLDYgKzUxLDcgQEAKIGVudW0gcDlfY2FjaGVfbW9kZXMgewogCUNBQ0hFX05PTkUsCiAJQ0FDSEVfTE9PU0UsCisJQ0FDSEVfRlNDQUNIRSwKIH07CiAKIC8qKgpAQCAtNjAsNiArNjEsOCBAQAogICogQGRlYnVnOiBkZWJ1ZyBsZXZlbAogICogQGFmaWQ6IGF1dGhlbnRpY2F0aW9uIGhhbmRsZQogICogQGNhY2hlOiBjYWNoZSBtb2RlIG9mIHR5cGUgJnA5X2NhY2hlX21vZGVzCisgKiBAY2FjaGV0YWc6IHRoZSB0YWcgb2YgdGhlIGNhY2hlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24KKyAqIEBmc2NhY2hlOiBzZXNzaW9uIGNvb2tpZSBhc3NvY2lhdGVkIHdpdGggRlMtQ2FjaGUKICAqIEBvcHRpb25zOiBjb3B5IG9mIG9wdGlvbnMgc3RyaW5nIGdpdmVuIGJ5IHVzZXIKICAqIEB1bmFtZTogc3RyaW5nIHVzZXIgbmFtZSB0byBtb3VudCBoaWVyYXJjaHkgYXMKICAqIEBhbmFtZTogbW91bnQgc3BlY2lmaWVyIGZvciByZW1vdGUgaGllcmFyY2h5CkBAIC02OCw3ICs3MSw3IEBACiAgKiBAZGZsdGdpZDogZGVmYXVsdCBudW1lcmljIGdyb3VwaWQgdG8gbW91bnQgaGllcmFyY2h5IGFzCiAgKiBAdWlkOiBpZiAlVjlGU19BQ0NFU1NfU0lOR0xFLCB0aGUgbnVtZXJpYyB1aWQgd2hpY2ggbW91bnRlZCB0aGUgaGllcmFyY2h5CiAgKiBAY2xudDogcmVmZXJlbmNlIHRvIDlQIG5ldHdvcmsgY2xpZW50IGluc3RhbnRpYXRlZCBmb3IgdGhpcyBzZXNzaW9uCi0gKiBAZGVidWdmc19kaXI6IHJlZmVyZW5jZSB0byBkZWJ1Z2ZzX2RpciB3aGljaCBjYW4gYmUgdXNlZCBmb3IgYWRkJ2wgZGVidWcKKyAqIEBzbGlzdDogcmVmZXJlbmNlIHRvIGxpc3Qgb2YgcmVnaXN0ZXJlZCA5cCBzZXNzaW9ucwogICoKICAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIHN0YXRlIGZvciBlYWNoIHNlc3Npb24gaW5zdGFuY2UgZXN0YWJsaXNoZWQgZHVyaW5nCiAgKiBhIHN5c19tb3VudCgpIC4KQEAgLTg0LDYgKzg3LDEwIEBACiAJdW5zaWduZWQgc2hvcnQgZGVidWc7CiAJdW5zaWduZWQgaW50IGFmaWQ7CiAJdW5zaWduZWQgaW50IGNhY2hlOworI2lmZGVmIENPTkZJR185UF9GU0NBQ0hFCisJY2hhciAqY2FjaGV0YWc7CisJc3RydWN0IGZzY2FjaGVfY29va2llICpmc2NhY2hlOworI2VuZGlmCiAKIAljaGFyICp1bmFtZTsJCS8qIHVzZXIgbmFtZSB0byBtb3VudCBhcyAqLwogCWNoYXIgKmFuYW1lOwkJLyogbmFtZSBvZiByZW1vdGUgaGllcmFyY2h5IGJlaW5nIG1vdW50ZWQgKi8KQEAgLTkyLDExICs5OSw5IEBACiAJdW5zaWduZWQgaW50IGRmbHRnaWQ7CS8qIGRlZmF1bHQgZ2lkIGZvciBsZWdhY3kgc3VwcG9ydCAqLwogCXUzMiB1aWQ7CQkvKiBpZiBBQ0NFU1NfU0lOR0xFLCB0aGUgdWlkIHRoYXQgaGFzIGFjY2VzcyAqLwogCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CS8qIDlwIGNsaWVudCAqLwotCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOworCXN0cnVjdCBsaXN0X2hlYWQgc2xpc3Q7IC8qIGxpc3Qgb2Ygc2Vzc2lvbnMgcmVnaXN0ZXJlZCB3aXRoIHY5ZnMgKi8KIH07CiAKLWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICp2OWZzX2RlYnVnZnNfcm9vdDsKLQogc3RydWN0IHA5X2ZpZCAqdjlmc19zZXNzaW9uX2luaXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICosIGNvbnN0IGNoYXIgKiwKIAkJCQkJCQkJCWNoYXIgKik7CiB2b2lkIHY5ZnNfc2Vzc2lvbl9jbG9zZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Y5ZnNfdmZzLmggYi9mcy85cC92OWZzX3Zmcy5oCmluZGV4IGYwYzdkZTcuLjNhNzU2MGUgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnNfdmZzLmgKKysrIGIvZnMvOXAvdjlmc192ZnMuaApAQCAtNDQsNyArNDQsMTMgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgdjlmc19kZW50cnlfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgdjlmc19jYWNoZWRfZGVudHJ5X29wZXJhdGlvbnM7CiAKKyNpZmRlZiBDT05GSUdfOVBfRlNDQUNIRQorc3RydWN0IGlub2RlICp2OWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwordm9pZCB2OWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CisjZW5kaWYKKwogc3RydWN0IGlub2RlICp2OWZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSk7Cit2b2lkIHY5ZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBpbm9fdCB2OWZzX3FpZDJpbm8oc3RydWN0IHA5X3FpZCAqcWlkKTsKIHZvaWQgdjlmc19zdGF0Mmlub2RlKHN0cnVjdCBwOV93c3RhdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopOwogaW50IHY5ZnNfZGlyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2FkZHIuYyBiL2ZzLzlwL3Zmc19hZGRyLmMKaW5kZXggOTI4MjgyOC4uOTBlMzg0NCAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2FkZHIuYworKysgYi9mcy85cC92ZnNfYWRkci5jCkBAIC0zOCw2ICszOCw3IEBACiAKICNpbmNsdWRlICJ2OWZzLmgiCiAjaW5jbHVkZSAidjlmc192ZnMuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgogCiAvKioKICAqIHY5ZnNfdmZzX3JlYWRwYWdlIC0gcmVhZCBhbiBlbnRpcmUgcGFnZSBpbiBmcm9tIDlQCkBAIC01MiwxOCArNTMsMzEgQEAKIAlpbnQgcmV0dmFsOwogCWxvZmZfdCBvZmZzZXQ7CiAJY2hhciAqYnVmZmVyOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKKwlpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJcbiIpOworCisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKworCXJldHZhbCA9IHY5ZnNfcmVhZHBhZ2VfZnJvbV9mc2NhY2hlKGlub2RlLCBwYWdlKTsKKwlpZiAocmV0dmFsID09IDApCisJCXJldHVybiByZXR2YWw7CisKIAlidWZmZXIgPSBrbWFwKHBhZ2UpOwogCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwogCiAJcmV0dmFsID0gdjlmc19maWxlX3JlYWRuKGZpbHAsIGJ1ZmZlciwgTlVMTCwgUEFHRV9DQUNIRV9TSVpFLCBvZmZzZXQpOwotCWlmIChyZXR2YWwgPCAwKQorCWlmIChyZXR2YWwgPCAwKSB7CisJCXY5ZnNfdW5jYWNoZV9wYWdlKGlub2RlLCBwYWdlKTsKIAkJZ290byBkb25lOworCX0KIAogCW1lbXNldChidWZmZXIgKyByZXR2YWwsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHJldHZhbCk7CiAJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJdjlmc19yZWFkcGFnZV90b19mc2NhY2hlKGlub2RlLCBwYWdlKTsKIAlyZXR2YWwgPSAwOwogCiBkb25lOgpAQCAtNzIsNiArODYsNzggQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCisvKioKKyAqIHY5ZnNfdmZzX3JlYWRwYWdlcyAtIHJlYWQgYSBzZXQgb2YgcGFnZXMgZnJvbSA5UAorICoKKyAqIEBmaWxwOiBmaWxlIGJlaW5nIHJlYWQKKyAqIEBtYXBwaW5nOiB0aGUgYWRkcmVzcyBzcGFjZQorICogQHBhZ2VzOiBsaXN0IG9mIHBhZ2VzIHRvIHJlYWQKKyAqIEBucl9wYWdlczogY291bnQgb2YgcGFnZXMgdG8gcmVhZAorICoKKyAqLworCitzdGF0aWMgaW50IHY5ZnNfdmZzX3JlYWRwYWdlcyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiaW5vZGU6ICVwIGZpbGU6ICVwXG4iLCBpbm9kZSwgZmlscCk7CisKKwlyZXQgPSB2OWZzX3JlYWRwYWdlc19mcm9tX2ZzY2FjaGUoaW5vZGUsIG1hcHBpbmcsIHBhZ2VzLCAmbnJfcGFnZXMpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlYWRfY2FjaGVfcGFnZXMobWFwcGluZywgcGFnZXMsICh2b2lkICopdjlmc192ZnNfcmVhZHBhZ2UsIGZpbHApOworCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiICA9ICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdjlmc19yZWxlYXNlX3BhZ2UgLSByZWxlYXNlIHRoZSBwcml2YXRlIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCBhIHBhZ2UKKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIHBhZ2UgY2FuIGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KKworc3RhdGljIGludCB2OWZzX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwKQoreworCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdjlmc19mc2NhY2hlX3JlbGVhc2VfcGFnZShwYWdlLCBnZnApOworfQorCisvKioKKyAqIHY5ZnNfaW52YWxpZGF0ZV9wYWdlIC0gSW52YWxpZGF0ZSBhIHBhZ2UgY29tcGxldGVseSBvciBwYXJ0aWFsbHkKKyAqCisgKiBAcGFnZTogc3RydWN0dXJlIHRvIHBhZ2UKKyAqIEBvZmZzZXQ6IG9mZnNldCBpbiB0aGUgcGFnZQorICovCisKK3N0YXRpYyB2b2lkIHY5ZnNfaW52YWxpZGF0ZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0ID09IDApCisJCXY5ZnNfZnNjYWNoZV9pbnZhbGlkYXRlX3BhZ2UocGFnZSk7Cit9CisKKy8qKgorICogdjlmc19sYXVuZGVyX3BhZ2UgLSBXcml0ZWJhY2sgYSBkaXJ0eSBwYWdlCisgKiBTaW5jZSB0aGUgd3JpdGVzIGdvIGRpcmVjdGx5IHRvIHRoZSBzZXJ2ZXIsIHdlIHNpbXBseSByZXR1cm4gYSAwCisgKiBoZXJlIHRvIGluZGljYXRlIHN1Y2Nlc3MuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCB2OWZzX2xhdW5kZXJfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gMDsKK30KKwogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2OWZzX2FkZHJfb3BlcmF0aW9ucyA9IHsKICAgICAgIC5yZWFkcGFnZSA9IHY5ZnNfdmZzX3JlYWRwYWdlLAorICAgICAgLnJlYWRwYWdlcyA9IHY5ZnNfdmZzX3JlYWRwYWdlcywKKyAgICAgIC5yZWxlYXNlcGFnZSA9IHY5ZnNfcmVsZWFzZV9wYWdlLAorICAgICAgLmludmFsaWRhdGVwYWdlID0gdjlmc19pbnZhbGlkYXRlX3BhZ2UsCisgICAgICAubGF1bmRlcl9wYWdlID0gdjlmc19sYXVuZGVyX3BhZ2UsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2Rpci5jIGIvZnMvOXAvdmZzX2Rpci5jCmluZGV4IDg3M2NkMzEuLjE1Y2NlNTMgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19kaXIuYworKysgYi9mcy85cC92ZnNfZGlyLmMKQEAgLTQwLDYgKzQwLDI0IEBACiAjaW5jbHVkZSAiZmlkLmgiCiAKIC8qKgorICogc3RydWN0IHA5X3JkaXIgLSByZWFkZGlyIGFjY291bnRpbmcKKyAqIEBtdXRleDogbXV0ZXggcHJvdGVjdGluZyByZWFkZGlyCisgKiBAaGVhZDogc3RhcnQgb2Zmc2V0IG9mIGN1cnJlbnQgZGlycmVhZCBidWZmZXIKKyAqIEB0YWlsOiBlbmQgb2Zmc2V0IG9mIGN1cnJlbnQgZGlycmVhZCBidWZmZXIKKyAqIEBidWY6IGRpcnJlYWQgYnVmZmVyCisgKgorICogcHJpdmF0ZSBzdHJ1Y3R1cmUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgcmVhZGRpcgorICogYWxsb2NhdGVkIG9uIGRlbWFuZAorICovCisKK3N0cnVjdCBwOV9yZGlyIHsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IGhlYWQ7CisJaW50IHRhaWw7CisJdWludDhfdCAqYnVmOworfTsKKworLyoqCiAgKiBkdF90eXBlIC0gcmV0dXJuIGZpbGUgdHlwZQogICogQG1pc3RhdDogbWlzdGF0IHN0cnVjdHVyZQogICoKQEAgLTcwLDU2ICs4OCw3OSBAQAogewogCWludCBvdmVyOwogCXN0cnVjdCBwOV93c3RhdCBzdDsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCXN0cnVjdCBwOV9maWQgKmZpZDsKIAlpbnQgYnVmbGVuOwotCWNoYXIgKnN0YXRidWY7Ci0JaW50IG4sIGkgPSAwOworCWludCByZWNsZW4gPSAwOworCXN0cnVjdCBwOV9yZGlyICpyZGlyOwogCiAJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJuYW1lICVzXG4iLCBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJZmlkID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJYnVmbGVuID0gZmlkLT5jbG50LT5tc2l6ZSAtIFA5X0lPSERSU1o7Ci0Jc3RhdGJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0YXRidWYpCi0JCXJldHVybiAtRU5PTUVNOwogCi0Jd2hpbGUgKDEpIHsKLQkJZXJyID0gdjlmc19maWxlX3JlYWRuKGZpbHAsIHN0YXRidWYsIE5VTEwsIGJ1ZmxlbiwKLQkJCQkJCQkJZmlkLT5yZGlyX2Zwb3MpOwotCQlpZiAoZXJyIDw9IDApCi0JCQlicmVhazsKKwkvKiBhbGxvY2F0ZSByZGlyIG9uIGRlbWFuZCAqLworCWlmICghZmlkLT5yZGlyKSB7CisJCXJkaXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcDlfcmRpcikgKyBidWZsZW4sIEdGUF9LRVJORUwpOwogCi0JCW4gPSBlcnI7Ci0JCXdoaWxlIChpIDwgbikgewotCQkJZXJyID0gcDlzdGF0X3JlYWQoc3RhdGJ1ZiArIGksIGJ1Zmxlbi1pLCAmc3QsCi0JCQkJCQkJZmlkLT5jbG50LT5kb3R1KTsKKwkJaWYgKHJkaXIgPT0gTlVMTCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlzcGluX2xvY2soJmZpbHAtPmZfZGVudHJ5LT5kX2xvY2spOworCQlpZiAoIWZpZC0+cmRpcikgeworCQkJcmRpci0+YnVmID0gKHVpbnQ4X3QgKilyZGlyICsgc2l6ZW9mKHN0cnVjdCBwOV9yZGlyKTsKKwkJCW11dGV4X2luaXQoJnJkaXItPm11dGV4KTsKKwkJCXJkaXItPmhlYWQgPSByZGlyLT50YWlsID0gMDsKKwkJCWZpZC0+cmRpciA9ICh2b2lkICopIHJkaXI7CisJCQlyZGlyID0gTlVMTDsKKwkJfQorCQlzcGluX3VubG9jaygmZmlscC0+Zl9kZW50cnktPmRfbG9jayk7CisJCWtmcmVlKHJkaXIpOworCX0KKwlyZGlyID0gKHN0cnVjdCBwOV9yZGlyICopIGZpZC0+cmRpcjsKKworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcmRpci0+bXV0ZXgpOworCXdoaWxlIChlcnIgPT0gMCkgeworCQlpZiAocmRpci0+dGFpbCA9PSByZGlyLT5oZWFkKSB7CisJCQllcnIgPSB2OWZzX2ZpbGVfcmVhZG4oZmlscCwgcmRpci0+YnVmLCBOVUxMLAorCQkJCQkJCWJ1ZmxlbiwgZmlscC0+Zl9wb3MpOworCQkJaWYgKGVyciA8PSAwKQorCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCisJCQlyZGlyLT5oZWFkID0gMDsKKwkJCXJkaXItPnRhaWwgPSBlcnI7CisJCX0KKworCQl3aGlsZSAocmRpci0+aGVhZCA8IHJkaXItPnRhaWwpIHsKKwkJCWVyciA9IHA5c3RhdF9yZWFkKHJkaXItPmJ1ZiArIHJkaXItPmhlYWQsCisJCQkJCQlidWZsZW4gLSByZGlyLT5oZWFkLCAmc3QsCisJCQkJCQlmaWQtPmNsbnQtPmRvdHUpOwogCQkJaWYgKGVycikgewogCQkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicmV0dXJuZWQgJWRcbiIsIGVycik7CiAJCQkJZXJyID0gLUVJTzsKIAkJCQlwOXN0YXRfZnJlZSgmc3QpOwotCQkJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCX0KLQotCQkJaSArPSBzdC5zaXplKzI7Ci0JCQlmaWQtPnJkaXJfZnBvcyArPSBzdC5zaXplKzI7CisJCQlyZWNsZW4gPSBzdC5zaXplKzI7CiAKIAkJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgc3QubmFtZSwgc3RybGVuKHN0Lm5hbWUpLAogCQkJICAgIGZpbHAtPmZfcG9zLCB2OWZzX3FpZDJpbm8oJnN0LnFpZCksIGR0X3R5cGUoJnN0KSk7CiAKLQkJCWZpbHAtPmZfcG9zICs9IHN0LnNpemUrMjsKLQogCQkJcDlzdGF0X2ZyZWUoJnN0KTsKIAogCQkJaWYgKG92ZXIpIHsKIAkJCQllcnIgPSAwOwotCQkJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJCX0KKwkJCXJkaXItPmhlYWQgKz0gcmVjbGVuOworCQkJZmlscC0+Zl9wb3MgKz0gcmVjbGVuOwogCQl9CiAJfQogCi1mcmVlX2FuZF9leGl0OgotCWtmcmVlKHN0YXRidWYpOwordW5sb2NrX2FuZF9leGl0OgorCW11dGV4X3VubG9jaygmcmRpci0+bXV0ZXgpOworZXhpdDoKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZmlsZS5jIGIvZnMvOXAvdmZzX2ZpbGUuYwppbmRleCA2OGJmMmFmLi4zOTAyYmY0IDEwMDY0NAotLS0gYS9mcy85cC92ZnNfZmlsZS5jCisrKyBiL2ZzLzlwL3Zmc19maWxlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPG5ldC85cC85cC5oPgpAQCAtNDAsNiArNDEsNyBAQAogI2luY2x1ZGUgInY5ZnMuaCIKICNpbmNsdWRlICJ2OWZzX3Zmcy5oIgogI2luY2x1ZGUgImZpZC5oIgorI2luY2x1ZGUgImNhY2hlLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY5ZnNfY2FjaGVkX2ZpbGVfb3BlcmF0aW9uczsKIApAQCAtNzIsNyArNzQsNyBAQAogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlpZiAob21vZGUgJiBQOV9PVFJVTkMpIHsKLQkJCWlub2RlLT5pX3NpemUgPSAwOworCQkJaV9zaXplX3dyaXRlKGlub2RlLCAwKTsKIAkJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCX0KIAkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpICYmICghdjlmc19leHRlbmRlZCh2OXNlcykpKQpAQCAtODUsNiArODcsMTAgQEAKIAkJLyogZW5hYmxlIGNhY2hlZCBmaWxlIG9wdGlvbnMgKi8KIAkJaWYoZmlsZS0+Zl9vcCA9PSAmdjlmc19maWxlX29wZXJhdGlvbnMpCiAJCQlmaWxlLT5mX29wID0gJnY5ZnNfY2FjaGVkX2ZpbGVfb3BlcmF0aW9uczsKKworI2lmZGVmIENPTkZJR185UF9GU0NBQ0hFCisJCXY5ZnNfY2FjaGVfaW5vZGVfc2V0X2Nvb2tpZShpbm9kZSwgZmlsZSk7CisjZW5kaWYKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIxMCw2ICsyMTYsNyBAQAogCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IG9yaWdpbiA9ICpvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBwZ19zdGFydCwgcGdfZW5kOwogCiAJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJkYXRhICVwIGNvdW50ICVkIG9mZnNldCAleFxuIiwgZGF0YSwKIAkJKGludCljb3VudCwgKGludCkqb2Zmc2V0KTsKQEAgLTIyNSw3ICsyMzIsNyBAQAogCQlpZiAoY291bnQgPCByc2l6ZSkKIAkJCXJzaXplID0gY291bnQ7CiAKLQkJbiA9IHA5X2NsaWVudF93cml0ZShmaWQsIE5VTEwsIGRhdGErdG90YWwsICpvZmZzZXQrdG90YWwsCisJCW4gPSBwOV9jbGllbnRfd3JpdGUoZmlkLCBOVUxMLCBkYXRhK3RvdGFsLCBvcmlnaW4rdG90YWwsCiAJCQkJCQkJCQlyc2l6ZSk7CiAJCWlmIChuIDw9IDApCiAJCQlicmVhazsKQEAgLTIzNCwxNCArMjQxLDE0IEBACiAJfSB3aGlsZSAoY291bnQgPiAwKTsKIAogCWlmICh0b3RhbCA+IDApIHsKLQkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgb3JpZ2luLAotCQkJCQkJCQlvcmlnaW4rdG90YWwpOworCQlwZ19zdGFydCA9IG9yaWdpbiA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlwZ19lbmQgPSAob3JpZ2luICsgdG90YWwgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlpZiAoaW5vZGUtPmlfbWFwcGluZyAmJiBpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzKQorCQkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywKKwkJCQkJCSAgICAgIHBnX3N0YXJ0LCBwZ19lbmQpOwogCQkqb2Zmc2V0ICs9IHRvdGFsOwotCX0KLQotCWlmICgqb2Zmc2V0ID4gaW5vZGUtPmlfc2l6ZSkgewotCQlpbm9kZS0+aV9zaXplID0gKm9mZnNldDsKLQkJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTIgLSAxKSA+PiA5OworCQlpX3NpemVfd3JpdGUoaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSArIHRvdGFsKTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gKGlfc2l6ZV9yZWFkKGlub2RlKSArIDUxMiAtIDEpID4+IDk7CiAJfQogCiAJaWYgKG4gPCAwKQpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2lub2RlLmMgYi9mcy85cC92ZnNfaW5vZGUuYwppbmRleCAwNmEyMjNkLi4xOGY3NGVjIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGUuYworKysgYi9mcy85cC92ZnNfaW5vZGUuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgInY5ZnMuaCIKICNpbmNsdWRlICJ2OWZzX3Zmcy5oIgogI2luY2x1ZGUgImZpZC5oIgorI2luY2x1ZGUgImNhY2hlLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZXh0OwpAQCAtMTk3LDYgKzE5OCwzOSBAQAogCXdzdGF0LT5leHRlbnNpb24gPSBOVUxMOwogfQogCisjaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKKy8qKgorICogdjlmc19hbGxvY19pbm9kZSAtIGhlbHBlciBmdW5jdGlvbiB0byBhbGxvY2F0ZSBhbiBpbm9kZQorICogVGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCBiZWZvcmUgc2V0dGluZyB1cCB0aGUgaW5vZGUgc28gdGhhdCB3ZQorICogY2FuIGFzc29jaWF0ZSBhIHZjb29raWUgd2l0aCBlYWNoIGlub2RlLgorICoKKyAqLworCitzdHJ1Y3QgaW5vZGUgKnY5ZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgdjlmc19jb29raWUgKnZjb29raWU7CisJdmNvb2tpZSA9IChzdHJ1Y3Qgdjlmc19jb29raWUgKilrbWVtX2NhY2hlX2FsbG9jKHZjb29raWVfY2FjaGUsCisJCQkJCQkJIEdGUF9LRVJORUwpOworCWlmICghdmNvb2tpZSkKKwkJcmV0dXJuIE5VTEw7CisKKwl2Y29va2llLT5mc2NhY2hlID0gTlVMTDsKKwl2Y29va2llLT5xaWQgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZ2Y29va2llLT5sb2NrKTsKKwlyZXR1cm4gJnZjb29raWUtPmlub2RlOworfQorCisvKioKKyAqIHY5ZnNfZGVzdHJveV9pbm9kZSAtIGRlc3Ryb3kgYW4gaW5vZGUKKyAqCisgKi8KKwordm9pZCB2OWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUodmNvb2tpZV9jYWNoZSwgdjlmc19pbm9kZTJjb29raWUoaW5vZGUpKTsKK30KKyNlbmRpZgorCiAvKioKICAqIHY5ZnNfZ2V0X2lub2RlIC0gaGVscGVyIGZ1bmN0aW9uIHRvIHNldHVwIGFuIGlub2RlCiAgKiBAc2I6IHN1cGVyYmxvY2sKQEAgLTMyNiw2ICszNjAsMjEgQEAKIH0KICovCiAKKworLyoqCisgKiB2OWZzX2NsZWFyX2lub2RlIC0gcmVsZWFzZSBhbiBpbm9kZQorICogQGlub2RlOiBpbm9kZSB0byByZWxlYXNlCisgKgorICovCit2b2lkIHY5ZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisKKyNpZmRlZiBDT05GSUdfOVBfRlNDQUNIRQorCXY5ZnNfY2FjaGVfaW5vZGVfcHV0X2Nvb2tpZShpbm9kZSk7CisjZW5kaWYKK30KKwogLyoqCiAgKiB2OWZzX2lub2RlX2Zyb21fZmlkIC0gcG9wdWxhdGUgYW4gaW5vZGUgYnkgaXNzdWluZyBhIGF0dHJpYnV0ZSByZXF1ZXN0CiAgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KQEAgLTM1Niw4ICs0MDUsMTQgQEAKIAogCXY5ZnNfc3RhdDJpbm9kZShzdCwgcmV0LCBzYik7CiAJcmV0LT5pX2lubyA9IHY5ZnNfcWlkMmlubygmc3QtPnFpZCk7CisKKyNpZmRlZiBDT05GSUdfOVBfRlNDQUNIRQorCXY5ZnNfdmNvb2tpZV9zZXRfcWlkKHJldCwgJnN0LT5xaWQpOworCXY5ZnNfY2FjaGVfaW5vZGVfZ2V0X2Nvb2tpZShyZXQpOworI2VuZGlmCiAJcDlzdGF0X2ZyZWUoc3QpOwogCWtmcmVlKHN0KTsKKwogCXJldHVybiByZXQ7CiAKIGVycm9yOgpAQCAtNzUxLDcgKzgwNiw3IEBACiAJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJkZW50cnk6ICVwXG4iLCBkZW50cnkpOwogCWVyciA9IC1FUEVSTTsKIAl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGVudHJ5LT5kX2lub2RlKTsKLQlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFKQorCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpCiAJCXJldHVybiBzaW1wbGVfZ2V0YXR0cihtbnQsIGRlbnRyeSwgc3RhdCk7CiAKIAlmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKQEAgLTg3MiwxMCArOTI3LDEwIEBACiAJfSBlbHNlCiAJCWlub2RlLT5pX3JkZXYgPSAwOwogCi0JaW5vZGUtPmlfc2l6ZSA9IHN0YXQtPmxlbmd0aDsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIHN0YXQtPmxlbmd0aCk7CiAKIAkvKiBub3QgcmVhbCBudW1iZXIgb2YgYmxvY2tzLCBidXQgNTEyIGJ5dGUgb25lcyAuLi4gKi8KLQlpbm9kZS0+aV9ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMiAtIDEpID4+IDk7CisJaW5vZGUtPmlfYmxvY2tzID0gKGlfc2l6ZV9yZWFkKGlub2RlKSArIDUxMiAtIDEpID4+IDk7CiB9CiAKIC8qKgpAQCAtOTM5LDggKzk5NCw3IEBACiAJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCiAJCSIlcyAtPiAlcyAoJXMpXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lLCBzdC0+ZXh0ZW5zaW9uLCBidWZmZXIpOwogCi0JcmV0dmFsID0gYnVmbGVuOwotCisJcmV0dmFsID0gc3RybmxlbihidWZmZXIsIGJ1Zmxlbik7CiBkb25lOgogCWtmcmVlKHN0KTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTAwNyw3ICsxMDYxLDcgQEAKIAkJCV9fcHV0bmFtZShsaW5rKTsKIAkJCWxpbmsgPSBFUlJfUFRSKGxlbik7CiAJCX0gZWxzZQotCQkJbGlua1tsZW5dID0gMDsKKwkJCWxpbmtbbWluKGxlbiwgUEFUSF9NQVgtMSldID0gMDsKIAl9CiAJbmRfc2V0X2xpbmsobmQsIGxpbmspOwogCmRpZmYgLS1naXQgYS9mcy85cC92ZnNfc3VwZXIuYyBiL2ZzLzlwL3Zmc19zdXBlci5jCmluZGV4IDg5NjFmMWEuLjE0YTg2NDQgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19zdXBlci5jCisrKyBiL2ZzLzlwL3Zmc19zdXBlci5jCkBAIC00NCwyMSArNDQsOSBAQAogI2luY2x1ZGUgInY5ZnNfdmZzLmgiCiAjaW5jbHVkZSAiZmlkLmgiCiAKLXN0YXRpYyB2b2lkIHY5ZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHY5ZnNfc3VwZXJfb3BzOwogCiAvKioKLSAqIHY5ZnNfY2xlYXJfaW5vZGUgLSByZWxlYXNlIGFuIGlub2RlCi0gKiBAaW5vZGU6IGlub2RlIHRvIHJlbGVhc2UKLSAqCi0gKi8KLQotc3RhdGljIHZvaWQgdjlmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKLX0KLQotLyoqCiAgKiB2OWZzX3NldF9zdXBlciAtIHNldCB0aGUgc3VwZXJibG9jawogICogQHM6IHN1cGVyIGJsb2NrCiAgKiBAZGF0YTogZmlsZSBzeXN0ZW0gc3BlY2lmaWMgZGF0YQpAQCAtMjIwLDYgKzIwOCwxMCBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdjlmc19zdXBlcl9vcHMgPSB7CisjaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKKwkuYWxsb2NfaW5vZGUgPSB2OWZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlID0gdjlmc19kZXN0cm95X2lub2RlLAorI2VuZGlmCiAJLnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnMsCiAJLmNsZWFyX2lub2RlID0gdjlmc19jbGVhcl9pbm9kZSwKIAkuc2hvd19vcHRpb25zID0gZ2VuZXJpY19zaG93X29wdGlvbnMsCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCBkNGJmOGNhLi42NGQ0NGVmIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTEzNSw4ICsxMzUsOCBAQAogCiBjb25maWcgSFVHRVRMQkZTCiAJYm9vbCAiSHVnZVRMQiBmaWxlIHN5c3RlbSBzdXBwb3J0IgotCWRlcGVuZHMgb24gWDg2IHx8IElBNjQgfHwgUFBDNjQgfHwgU1BBUkM2NCB8fCAoU1VQRVJIICYmIE1NVSkgfHwgXAotCQkgICAoUzM5MCAmJiA2NEJJVCkgfHwgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUyB8fCBCUk9LRU4KKwlkZXBlbmRzIG9uIFg4NiB8fCBJQTY0IHx8IFNQQVJDNjQgfHwgKFMzOTAgJiYgNjRCSVQpIHx8IFwKKwkJICAgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUyB8fCBCUk9LRU4KIAloZWxwCiAJICBodWdldGxiZnMgaXMgYSBmaWxlc3lzdGVtIGJhY2tpbmcgZm9yIEh1Z2VUTEIgcGFnZXMsIGJhc2VkIG9uCiAJICByYW1mcy4gRm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IGl0LCBzYXkgWSBoZXJlIGFuZCByZWFkCmRpZmYgLS1naXQgYS9mcy9hZGZzL2lub2RlLmMgYi9mcy9hZGZzL2lub2RlLmMKaW5kZXggNzk4Y2IwNy4uM2Y1N2NlNCAxMDA2NDQKLS0tIGEvZnMvYWRmcy9pbm9kZS5jCisrKyBiL2ZzL2FkZnMvaW5vZGUuYwpAQCAtMTksOSArMTksNiBAQAogYWRmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJICAgICAgIGludCBjcmVhdGUpCiB7Ci0JaWYgKGJsb2NrIDwgMCkKLQkJZ290byBhYm9ydF9uZWdhdGl2ZTsKLQogCWlmICghY3JlYXRlKSB7CiAJCWlmIChibG9jayA+PSBpbm9kZS0+aV9ibG9ja3MpCiAJCQlnb3RvIGFib3J0X3Rvb2JpZzsKQEAgLTM0LDEwICszMSw2IEBACiAJLyogZG9uJ3Qgc3VwcG9ydCBhbGxvY2F0aW9uIG9mIGJsb2NrcyB5ZXQgKi8KIAlyZXR1cm4gLUVJTzsKIAotYWJvcnRfbmVnYXRpdmU6Ci0JYWRmc19lcnJvcihpbm9kZS0+aV9zYiwgImJsb2NrICVkIDwgMCIsIGJsb2NrKTsKLQlyZXR1cm4gLUVJTzsKLQogYWJvcnRfdG9vYmlnOgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2NhY2hlLmggYi9mcy9hZnMvY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0ZjZiNC4uMDAwMDAwMAotLS0gYS9mcy9hZnMvY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIEFGUyBsb2NhbCBjYWNoZSBtYW5hZ2VtZW50IGludGVyZmFjZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnNjYWNoZS5oPgpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ludGVybmFsLmggYi9mcy9hZnMvaW50ZXJuYWwuaAppbmRleCAxMDZiZTY2Li42ZWNlMmExIDEwMDY0NAotLS0gYS9mcy9hZnMvaW50ZXJuYWwuaAorKysgYi9mcy9hZnMvaW50ZXJuYWwuaApAQCAtMTgsMTAgKzE4LDEwIEBACiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2NhY2hlLmg+CiAKICNpbmNsdWRlICJhZnMuaCIKICNpbmNsdWRlICJhZnNfdmwuaCIKLSNpbmNsdWRlICJjYWNoZS5oIgogCiAjZGVmaW5lIEFGU19DRUxMX01BWF9BRERSUyAxNQogCmRpZmYgLS1naXQgYS9mcy9hbm9uX2lub2Rlcy5jIGIvZnMvYW5vbl9pbm9kZXMuYwppbmRleCBkMTFjNTFmLi4yY2E3YTdjIDEwMDY0NAotLS0gYS9mcy9hbm9uX2lub2Rlcy5jCisrKyBiL2ZzL2Fub25faW5vZGVzLmMKQEAgLTgsOCArOCwxMCBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvY3JlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9mcy9hdHRyLmMgYi9mcy9hdHRyLmMKaW5kZXggOWZlMWIxYi4uOTZkMzk0YiAxMDA2NDQKLS0tIGEvZnMvYXR0ci5jCisrKyBiL2ZzL2F0dHIuYwpAQCAtMTgsNyArMTgsNyBAQAogLyogVGFrZW4gb3ZlciBmcm9tIHRoZSBvbGQgY29kZS4uLiAqLwogCiAvKiBQT1NJWCBVSUQvR0lEIHZlcmlmaWNhdGlvbiBmb3Igc2V0dGluZyBpbm9kZSBhdHRyaWJ1dGVzLiAqLwotaW50IGlub2RlX2NoYW5nZV9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCitpbnQgaW5vZGVfY2hhbmdlX29rKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKIAlpbnQgcmV0dmFsID0gLUVQRVJNOwogCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOwpAQCAtNjAsOSArNjAsNTEgQEAKIGVycm9yOgogCXJldHVybiByZXR2YWw7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaW5vZGVfY2hhbmdlX29rKTsKIAorLyoqCisgKiBpbm9kZV9uZXdzaXplX29rIC0gbWF5IHRoaXMgaW5vZGUgYmUgdHJ1bmNhdGVkIHRvIGEgZ2l2ZW4gc2l6ZQorICogQGlub2RlOgl0aGUgaW5vZGUgdG8gYmUgdHJ1bmNhdGVkCisgKiBAb2Zmc2V0Ogl0aGUgbmV3IHNpemUgdG8gYXNzaWduIHRvIHRoZSBpbm9kZQorICogQFJldHVybnM6CTAgb24gc3VjY2VzcywgLXZlIGVycm5vIG9uIGZhaWx1cmUKKyAqCisgKiBpbm9kZV9uZXdzaXplX29rIHdpbGwgY2hlY2sgZmlsZXN5c3RlbSBsaW1pdHMgYW5kIHVsaW1pdHMgdG8gY2hlY2sgdGhhdCB0aGUKKyAqIG5ldyBpbm9kZSBzaXplIGlzIHdpdGhpbiBsaW1pdHMuIGlub2RlX25ld3NpemVfb2sgd2lsbCBhbHNvIHNlbmQgU0lHWEZTWgorICogd2hlbiBuZWNlc3NhcnkuIENhbGxlciBtdXN0IG5vdCBwcm9jZWVkIHdpdGggaW5vZGUgc2l6ZSBjaGFuZ2UgaWYgZmFpbHVyZSBpcworICogcmV0dXJuZWQuIEBpbm9kZSBtdXN0IGJlIGEgZmlsZSAobm90IGRpcmVjdG9yeSksIHdpdGggYXBwcm9wcmlhdGUKKyAqIHBlcm1pc3Npb25zIHRvIGFsbG93IHRydW5jYXRlIChpbm9kZV9uZXdzaXplX29rIGRvZXMgTk9UIGNoZWNrIHRoZXNlCisgKiBjb25kaXRpb25zKS4KKyAqCisgKiBpbm9kZV9uZXdzaXplX29rIG11c3QgYmUgY2FsbGVkIHdpdGggaV9tdXRleCBoZWxkLgorICovCitpbnQgaW5vZGVfbmV3c2l6ZV9vayhjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0KQoreworCWlmIChpbm9kZS0+aV9zaXplIDwgb2Zmc2V0KSB7CisJCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisKKwkJbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0ZTSVpFXS5ybGltX2N1cjsKKwkJaWYgKGxpbWl0ICE9IFJMSU1fSU5GSU5JVFkgJiYgb2Zmc2V0ID4gbGltaXQpCisJCQlnb3RvIG91dF9zaWc7CisJCWlmIChvZmZzZXQgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykKKwkJCWdvdG8gb3V0X2JpZzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB0cnVuY2F0aW9uIG9mIGluLXVzZSBzd2FwZmlsZXMgaXMgZGlzYWxsb3dlZCAtIGl0IHdvdWxkCisJCSAqIGNhdXNlIHN1YnNlcXVlbnQgc3dhcG91dCB0byBzY3JpYmJsZSBvbiB0aGUgbm93LWZyZWVkCisJCSAqIGJsb2Nrcy4KKwkJICovCisJCWlmIChJU19TV0FQRklMRShpbm9kZSkpCisJCQlyZXR1cm4gLUVUWFRCU1k7CisJfQorCisJcmV0dXJuIDA7CitvdXRfc2lnOgorCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOworb3V0X2JpZzoKKwlyZXR1cm4gLUVGQklHOworfQorRVhQT1JUX1NZTUJPTChpbm9kZV9uZXdzaXplX29rKTsKKwogaW50IGlub2RlX3NldGF0dHIoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBpYXR0ciAqIGF0dHIpCiB7CiAJdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CmRpZmYgLS1naXQgYS9mcy9iZWZzL2xpbnV4dmZzLmMgYi9mcy9iZWZzL2xpbnV4dmZzLmMKaW5kZXggZGQzNzZjMS4uMzNiYWYyNyAxMDA2NDQKLS0tIGEvZnMvYmVmcy9saW51eHZmcy5jCisrKyBiL2ZzL2JlZnMvbGludXh2ZnMuYwpAQCAtNzM3LDEyICs3MzcsNyBAQAogewogCWtmcmVlKEJFRlNfU0Ioc2IpLT5tb3VudF9vcHRzLmlvY2hhcnNldCk7CiAJQkVGU19TQihzYiktPm1vdW50X29wdHMuaW9jaGFyc2V0ID0gTlVMTDsKLQotCWlmIChCRUZTX1NCKHNiKS0+bmxzKSB7Ci0JCXVubG9hZF9ubHMoQkVGU19TQihzYiktPm5scyk7Ci0JCUJFRlNfU0Ioc2IpLT5ubHMgPSBOVUxMOwotCX0KLQorCXVubG9hZF9ubHMoQkVGU19TQihzYiktPm5scyk7CiAJa2ZyZWUoc2ItPnNfZnNfaW5mbyk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmLmMgYi9mcy9iaW5mbXRfZWxmLmMKaW5kZXggNDQyZDk0Zi4uYjliM2JiNSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtMTcxMSw0MiArMTcxMSw1MiBAQAogCWludCBudW1ub3RlOwogfTsKIAotc3RhdGljIGludCBmaWxsX25vdGVfaW5mbyhzdHJ1Y3QgZWxmaGRyICplbGYsIGludCBwaGRycywKLQkJCSAgc3RydWN0IGVsZl9ub3RlX2luZm8gKmluZm8sCi0JCQkgIGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBlbGZfbm90ZV9pbmZvX2luaXQoc3RydWN0IGVsZl9ub3RlX2luZm8gKmluZm8pCiB7Ci0jZGVmaW5lCU5VTV9OT1RFUwk2Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdDsKLQotCWluZm8tPm5vdGVzID0gTlVMTDsKLQlpbmZvLT5wcnN0YXR1cyA9IE5VTEw7Ci0JaW5mby0+cHNpbmZvID0gTlVMTDsKLQlpbmZvLT5mcHUgPSBOVUxMOwotI2lmZGVmIEVMRl9DT1JFX0NPUFlfWEZQUkVHUwotCWluZm8tPnhmcHUgPSBOVUxMOwotI2VuZGlmCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwogCUlOSVRfTElTVF9IRUFEKCZpbmZvLT50aHJlYWRfbGlzdCk7CiAKLQlpbmZvLT5ub3RlcyA9IGttYWxsb2MoTlVNX05PVEVTICogc2l6ZW9mKHN0cnVjdCBtZW1lbGZub3RlKSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBzaXggRUxGIG5vdGVzICovCisJaW5mby0+bm90ZXMgPSBrbWFsbG9jKDYgKiBzaXplb2Yoc3RydWN0IG1lbWVsZm5vdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8tPm5vdGVzKQogCQlyZXR1cm4gMDsKIAlpbmZvLT5wc2luZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mby0+cHNpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvLT5wc2luZm8pCi0JCXJldHVybiAwOworCQlnb3RvIG5vdGVzX2ZyZWU7CiAJaW5mby0+cHJzdGF0dXMgPSBrbWFsbG9jKHNpemVvZigqaW5mby0+cHJzdGF0dXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8tPnByc3RhdHVzKQotCQlyZXR1cm4gMDsKKwkJZ290byBwc2luZm9fZnJlZTsKIAlpbmZvLT5mcHUgPSBrbWFsbG9jKHNpemVvZigqaW5mby0+ZnB1KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvLT5mcHUpCi0JCXJldHVybiAwOworCQlnb3RvIHByc3RhdHVzX2ZyZWU7CiAjaWZkZWYgRUxGX0NPUkVfQ09QWV9YRlBSRUdTCiAJaW5mby0+eGZwdSA9IGttYWxsb2Moc2l6ZW9mKCppbmZvLT54ZnB1KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvLT54ZnB1KQotCQlyZXR1cm4gMDsKKwkJZ290byBmcHVfZnJlZTsKICNlbmRpZgorCXJldHVybiAxOworI2lmZGVmIEVMRl9DT1JFX0NPUFlfWEZQUkVHUworIGZwdV9mcmVlOgorCWtmcmVlKGluZm8tPmZwdSk7CisjZW5kaWYKKyBwcnN0YXR1c19mcmVlOgorCWtmcmVlKGluZm8tPnByc3RhdHVzKTsKKyBwc2luZm9fZnJlZToKKwlrZnJlZShpbmZvLT5wc2luZm8pOworIG5vdGVzX2ZyZWU6CisJa2ZyZWUoaW5mby0+bm90ZXMpOworCXJldHVybiAwOworfQogCi0JaW5mby0+dGhyZWFkX3N0YXR1c19zaXplID0gMDsKK3N0YXRpYyBpbnQgZmlsbF9ub3RlX2luZm8oc3RydWN0IGVsZmhkciAqZWxmLCBpbnQgcGhkcnMsCisJCQkgIHN0cnVjdCBlbGZfbm90ZV9pbmZvICppbmZvLAorCQkJICBsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0OworCisJaWYgKCFlbGZfbm90ZV9pbmZvX2luaXQoaW5mbykpCisJCXJldHVybiAwOworCiAJaWYgKHNpZ25yKSB7CiAJCXN0cnVjdCBjb3JlX3RocmVhZCAqY3Q7CiAJCXN0cnVjdCBlbGZfdGhyZWFkX3N0YXR1cyAqZXRzOwpAQCAtMTgwNiw4ICsxODE2LDYgQEAKICNlbmRpZgogCiAJcmV0dXJuIDE7Ci0KLSN1bmRlZiBOVU1fTk9URVMKIH0KIAogc3RhdGljIHNpemVfdCBnZXRfbm90ZV9pbmZvX3NpemUoc3RydWN0IGVsZl9ub3RlX2luZm8gKmluZm8pCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMgYi9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKaW5kZXggNzYyODU0Ny4uMzg1MDJjNiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZl9mZHBpYy5jCisrKyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwpAQCAtMjgzLDIwICsyODMsMjMgQEAKIAl9CiAKIAlzdGFja19zaXplID0gZXhlY19wYXJhbXMuc3RhY2tfc2l6ZTsKLQlpZiAoc3RhY2tfc2l6ZSA8IGludGVycF9wYXJhbXMuc3RhY2tfc2l6ZSkKLQkJc3RhY2tfc2l6ZSA9IGludGVycF9wYXJhbXMuc3RhY2tfc2l6ZTsKLQogCWlmIChleGVjX3BhcmFtcy5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNfU1RBQ0spCiAJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0VOQUJMRV9YOwogCWVsc2UgaWYgKGV4ZWNfcGFyYW1zLmZsYWdzICYgRUxGX0ZEUElDX0ZMQUdfTk9FWEVDX1NUQUNLKQogCQlleGVjdXRhYmxlX3N0YWNrID0gRVhTVEFDS19ESVNBQkxFX1g7Ci0JZWxzZSBpZiAoaW50ZXJwX3BhcmFtcy5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNfU1RBQ0spCi0JCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0VOQUJMRV9YOwotCWVsc2UgaWYgKGludGVycF9wYXJhbXMuZmxhZ3MgJiBFTEZfRkRQSUNfRkxBR19OT0VYRUNfU1RBQ0spCi0JCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0RJU0FCTEVfWDsKIAllbHNlCiAJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0RFRkFVTFQ7CiAKKwlpZiAoc3RhY2tfc2l6ZSA9PSAwKSB7CisJCXN0YWNrX3NpemUgPSBpbnRlcnBfcGFyYW1zLnN0YWNrX3NpemU7CisJCWlmIChpbnRlcnBfcGFyYW1zLmZsYWdzICYgRUxGX0ZEUElDX0ZMQUdfRVhFQ19TVEFDSykKKwkJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0VOQUJMRV9YOworCQllbHNlIGlmIChpbnRlcnBfcGFyYW1zLmZsYWdzICYgRUxGX0ZEUElDX0ZMQUdfTk9FWEVDX1NUQUNLKQorCQkJZXhlY3V0YWJsZV9zdGFjayA9IEVYU1RBQ0tfRElTQUJMRV9YOworCQllbHNlCisJCQlleGVjdXRhYmxlX3N0YWNrID0gRVhTVEFDS19ERUZBVUxUOworCX0KKwogCXJldHZhbCA9IC1FTk9FWEVDOwogCWlmIChzdGFja19zaXplID09IDApCiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZmxhdC5jIGIvZnMvYmluZm10X2ZsYXQuYwppbmRleCBlOTJmMjI5Li5hMjc5NjY1IDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZmxhdC5jCisrKyBiL2ZzL2JpbmZtdF9mbGF0LmMKQEAgLTI3OCw4ICsyNzgsNiBAQAogCQlyZXQgPSBicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsIGJ1ZiwgTEJVRlNJWkUsICZmcG9zKTsKIAkJaWYgKHJldCA8PSAwKQogCQkJYnJlYWs7Ci0JCWlmIChyZXQgPj0gKHVuc2lnbmVkIGxvbmcpIC00MDk2KQotCQkJYnJlYWs7CiAJCWxlbiAtPSByZXQ7CiAKIAkJc3RybS5uZXh0X2luID0gYnVmOwpAQCAtMzM1LDcgKzMzMyw3IEBACiAJCQkJCSIoJWQgIT0gJWQpIiwgKHVuc2lnbmVkKSByLCBjdXJpZCwgaWQpOwogCQkJZ290byBmYWlsZWQ7CiAJCX0gZWxzZSBpZiAoICEgcC0+bGliX2xpc3RbaWRdLmxvYWRlZCAmJgotCQkJCWxvYWRfZmxhdF9zaGFyZWRfbGlicmFyeShpZCwgcCkgPiAodW5zaWduZWQgbG9uZykgLTQwOTYpIHsKKwkJCQlJU19FUlJfVkFMVUUobG9hZF9mbGF0X3NoYXJlZF9saWJyYXJ5KGlkLCBwKSkpIHsKIAkJCXByaW50aygiQklORk1UX0ZMQVQ6IGZhaWxlZCB0byBsb2FkIGxpYnJhcnkgJWQiLCBpZCk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQpAQCAtNTQ1LDcgKzU0Myw3IEBACiAJCXRleHRwb3MgPSBkb19tbWFwKGJwcm0tPmZpbGUsIDAsIHRleHRfbGVuLCBQUk9UX1JFQUR8UFJPVF9FWEVDLAogCQkJCSAgTUFQX1BSSVZBVEV8TUFQX0VYRUNVVEFCTEUsIDApOwogCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQkJaWYgKCF0ZXh0cG9zICB8fCB0ZXh0cG9zID49ICh1bnNpZ25lZCBsb25nKSAtNDA5NikgeworCQlpZiAoIXRleHRwb3MgfHwgSVNfRVJSX1ZBTFVFKHRleHRwb3MpKSB7CiAJCQlpZiAoIXRleHRwb3MpCiAJCQkJdGV4dHBvcyA9ICh1bnNpZ25lZCBsb25nKSAtRU5PTUVNOwogCQkJcHJpbnRrKCJVbmFibGUgdG8gbW1hcCBwcm9jZXNzIHRleHQsIGVycm5vICVkXG4iLCAoaW50KS10ZXh0cG9zKTsKQEAgLTU2MCw3ICs1NTgsNyBAQAogCQkJUFJPVF9SRUFEfFBST1RfV1JJVEV8UFJPVF9FWEVDLCBNQVBfUFJJVkFURSwgMCk7CiAJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCi0JCWlmIChyZWFsZGF0YXN0YXJ0ID09IDAgfHwgcmVhbGRhdGFzdGFydCA+PSAodW5zaWduZWQgbG9uZyktNDA5NikgeworCQlpZiAocmVhbGRhdGFzdGFydCA9PSAwIHx8IElTX0VSUl9WQUxVRShyZWFsZGF0YXN0YXJ0KSkgewogCQkJaWYgKCFyZWFsZGF0YXN0YXJ0KQogCQkJCXJlYWxkYXRhc3RhcnQgPSAodW5zaWduZWQgbG9uZykgLUVOT01FTTsKIAkJCXByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIFJBTSBmb3IgcHJvY2VzcyBkYXRhLCBlcnJubyAlZFxuIiwKQEAgLTU4Nyw3ICs1ODUsNyBAQAogCQkJcmVzdWx0ID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLCAoY2hhciAqKSBkYXRhcG9zLAogCQkJCQlkYXRhX2xlbiArIChyZWxvY3MgKiBzaXplb2YodW5zaWduZWQgbG9uZykpLCAmZnBvcyk7CiAJCX0KLQkJaWYgKHJlc3VsdCA+PSAodW5zaWduZWQgbG9uZyktNDA5NikgeworCQlpZiAoSVNfRVJSX1ZBTFVFKHJlc3VsdCkpIHsKIAkJCXByaW50aygiVW5hYmxlIHRvIHJlYWQgZGF0YStic3MsIGVycm5vICVkXG4iLCAoaW50KS1yZXN1bHQpOwogCQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCB0ZXh0cG9zLCB0ZXh0X2xlbik7CiAJCQlkb19tdW5tYXAoY3VycmVudC0+bW0sIHJlYWxkYXRhc3RhcnQsIGRhdGFfbGVuICsgZXh0cmEpOwpAQCAtNjA3LDcgKzYwNSw3IEBACiAJCQlQUk9UX1JFQUQgfCBQUk9UX0VYRUMgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgMCk7CiAJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCi0JCWlmICghdGV4dHBvcyAgfHwgdGV4dHBvcyA+PSAodW5zaWduZWQgbG9uZykgLTQwOTYpIHsKKwkJaWYgKCF0ZXh0cG9zIHx8IElTX0VSUl9WQUxVRSh0ZXh0cG9zKSkgewogCQkJaWYgKCF0ZXh0cG9zKQogCQkJCXRleHRwb3MgPSAodW5zaWduZWQgbG9uZykgLUVOT01FTTsKIAkJCXByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIFJBTSBmb3IgcHJvY2VzcyB0ZXh0L2RhdGEsIGVycm5vICVkXG4iLApAQCAtNjQxLDcgKzYzOSw3IEBACiAJCQlmcG9zID0gMDsKIAkJCXJlc3VsdCA9IGJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwKIAkJCQkJKGNoYXIgKikgdGV4dHBvcywgdGV4dF9sZW4sICZmcG9zKTsKLQkJCWlmIChyZXN1bHQgPCAodW5zaWduZWQgbG9uZykgLTQwOTYpCisJCQlpZiAoIUlTX0VSUl9WQUxVRShyZXN1bHQpKQogCQkJCXJlc3VsdCA9IGRlY29tcHJlc3NfZXhlYyhicHJtLCB0ZXh0X2xlbiwgKGNoYXIgKikgZGF0YXBvcywKIAkJCQkJCSBkYXRhX2xlbiArIChyZWxvY3MgKiBzaXplb2YodW5zaWduZWQgbG9uZykpLCAwKTsKIAkJfQpAQCAtNjUxLDEzICs2NDksMTMgQEAKIAkJCWZwb3MgPSAwOwogCQkJcmVzdWx0ID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLAogCQkJCQkoY2hhciAqKSB0ZXh0cG9zLCB0ZXh0X2xlbiwgJmZwb3MpOwotCQkJaWYgKHJlc3VsdCA8ICh1bnNpZ25lZCBsb25nKSAtNDA5NikgeworCQkJaWYgKCFJU19FUlJfVkFMVUUocmVzdWx0KSkgewogCQkJCWZwb3MgPSBudG9obChoZHItPmRhdGFfc3RhcnQpOwogCQkJCXJlc3VsdCA9IGJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgKGNoYXIgKikgZGF0YXBvcywKIAkJCQkJZGF0YV9sZW4gKyAocmVsb2NzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSwgJmZwb3MpOwogCQkJfQogCQl9Ci0JCWlmIChyZXN1bHQgPj0gKHVuc2lnbmVkIGxvbmcpLTQwOTYpIHsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXN1bHQpKSB7CiAJCQlwcmludGsoIlVuYWJsZSB0byByZWFkIGNvZGUrZGF0YStic3MsIGVycm5vICVkXG4iLChpbnQpLXJlc3VsdCk7CiAJCQlkb19tdW5tYXAoY3VycmVudC0+bW0sIHRleHRwb3MsIHRleHRfbGVuICsgZGF0YV9sZW4gKyBleHRyYSArCiAJCQkJTUFYX1NIQVJFRF9MSUJTICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKQEAgLTgzNSw3ICs4MzMsNyBAQAogCiAJcmVzID0gcHJlcGFyZV9iaW5wcm0oJmJwcm0pOwogCi0JaWYgKHJlcyA8PSAodW5zaWduZWQgbG9uZyktNDA5NikKKwlpZiAoIUlTX0VSUl9WQUxVRShyZXMpKQogCQlyZXMgPSBsb2FkX2ZsYXRfZmlsZSgmYnBybSwgbGlicywgaWQsIE5VTEwpOwogCiAJYWJvcnRfY3JlZHMoYnBybS5jcmVkKTsKQEAgLTg4MCw3ICs4NzgsNyBAQAogCXN0YWNrX2xlbiArPSBGTEFUX0RBVEFfQUxJR04gLSAxOyAgLyogcmVzZXJ2ZSBmb3IgdXBjb21pbmcgYWxpZ25tZW50ICovCiAJCiAJcmVzID0gbG9hZF9mbGF0X2ZpbGUoYnBybSwgJmxpYmluZm8sIDAsICZzdGFja19sZW4pOwotCWlmIChyZXMgPiAodW5zaWduZWQgbG9uZyktNDA5NikKKwlpZiAoSVNfRVJSX1ZBTFVFKHJlcykpCiAJCXJldHVybiByZXM7CiAJCiAJLyogVXBkYXRlIGRhdGEgc2VnbWVudCBwb2ludGVycyBmb3IgYWxsIGxpYnJhcmllcyAqLwpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCA3NjczODAwLi4xMmRhNWRiIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtMjQ5LDYgKzI0OSw3IEBACiAKIAltZW1wb29sX2ZyZWUocCwgYnMtPmJpb19wb29sKTsKIH0KK0VYUE9SVF9TWU1CT0woYmlvX2ZyZWUpOwogCiB2b2lkIGJpb19pbml0KHN0cnVjdCBiaW8gKmJpbykKIHsKQEAgLTI1Nyw2ICsyNTgsNyBAQAogCWJpby0+YmlfY29tcF9jcHUgPSAtMTsKIAlhdG9taWNfc2V0KCZiaW8tPmJpX2NudCwgMSk7CiB9CitFWFBPUlRfU1lNQk9MKGJpb19pbml0KTsKIAogLyoqCiAgKiBiaW9fYWxsb2NfYmlvc2V0IC0gYWxsb2NhdGUgYSBiaW8gZm9yIEkvTwpAQCAtMzExLDYgKzMxMyw3IEBACiAJbWVtcG9vbF9mcmVlKHAsIGJzLT5iaW9fcG9vbCk7CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MKGJpb19hbGxvY19iaW9zZXQpOwogCiBzdGF0aWMgdm9pZCBiaW9fZnNfZGVzdHJ1Y3RvcihzdHJ1Y3QgYmlvICpiaW8pCiB7CkBAIC0zMjIsOCArMzI1LDE2IEBACiAgKglAZ2ZwX21hc2s6IGFsbG9jYXRpb24gbWFzayB0byB1c2UKICAqCUBucl9pb3ZlY3M6IG51bWJlciBvZiBpb3ZlY3MKICAqCi0gKglBbGxvY2F0ZSBhIG5ldyBiaW8gd2l0aCBAbnJfaW92ZWNzIGJ2ZWNzLiAgSWYgQGdmcF9tYXNrCi0gKgljb250YWlucyBfX0dGUF9XQUlULCB0aGUgYWxsb2NhdGlvbiBpcyBndWFyYW50ZWVkIHRvIHN1Y2NlZWQuCisgKgliaW9fYWxsb2Mgd2lsbCBhbGxvY2F0ZSBhIGJpbyBhbmQgYXNzb2NpYXRlZCBiaW9fdmVjIGFycmF5IHRoYXQgY2FuIGhvbGQKKyAqCWF0IGxlYXN0IEBucl9pb3ZlY3MgZW50cmllcy4gQWxsb2NhdGlvbnMgd2lsbCBiZSBkb25lIGZyb20gdGhlCisgKglmc19iaW9fc2V0LiBBbHNvIHNlZSBAYmlvX2FsbG9jX2Jpb3NldCBhbmQgQGJpb19rbWFsbG9jLgorICoKKyAqCUlmICVfX0dGUF9XQUlUIGlzIHNldCwgdGhlbiBiaW9fYWxsb2Mgd2lsbCBhbHdheXMgYmUgYWJsZSB0byBhbGxvY2F0ZQorICoJYSBiaW8uIFRoaXMgaXMgZHVlIHRvIHRoZSBtZW1wb29sIGd1YXJhbnRlZXMuIFRvIG1ha2UgdGhpcyB3b3JrLCBjYWxsZXJzCisgKgltdXN0IG5ldmVyIGFsbG9jYXRlIG1vcmUgdGhhbiAxIGJpbyBhdCBhIHRpbWUgZnJvbSB0aGlzIHBvb2wuIENhbGxlcnMKKyAqCXRoYXQgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gMSBiaW8gbXVzdCBhbHdheXMgc3VibWl0IHRoZSBwcmV2aW91c2x5CisgKglhbGxvY2F0ZWQgYmlvIGZvciBJTyBiZWZvcmUgYXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBhIG5ldyBvbmUuIEZhaWx1cmUgdG8KKyAqCWRvIHNvIGNhbiBjYXVzZSBsaXZlbG9ja3MgdW5kZXIgbWVtb3J5IHByZXNzdXJlLgogICoKICAqCVJFVFVSTlM6CiAgKglQb2ludGVyIHRvIG5ldyBiaW8gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgpAQCAtMzM3LDYgKzM0OCw3IEBACiAKIAlyZXR1cm4gYmlvOwogfQorRVhQT1JUX1NZTUJPTChiaW9fYWxsb2MpOwogCiBzdGF0aWMgdm9pZCBiaW9fa21hbGxvY19kZXN0cnVjdG9yKHN0cnVjdCBiaW8gKmJpbykKIHsKQEAgLTM0NiwyMSArMzU4LDEzIEBACiB9CiAKIC8qKgotICogYmlvX2FsbG9jIC0gYWxsb2NhdGUgYSBiaW8gZm9yIEkvTworICogYmlvX2ttYWxsb2MgLSBhbGxvY2F0ZSBhIGJpbyBmb3IgSS9PIHVzaW5nIGttYWxsb2MoKQogICogQGdmcF9tYXNrOiAgIHRoZSBHRlBfIG1hc2sgZ2l2ZW4gdG8gdGhlIHNsYWIgYWxsb2NhdG9yCiAgKiBAbnJfaW92ZWNzOgludW1iZXIgb2YgaW92ZWNzIHRvIHByZS1hbGxvY2F0ZQogICoKICAqIERlc2NyaXB0aW9uOgotICogICBiaW9fYWxsb2Mgd2lsbCBhbGxvY2F0ZSBhIGJpbyBhbmQgYXNzb2NpYXRlZCBiaW9fdmVjIGFycmF5IHRoYXQgY2FuIGhvbGQKLSAqICAgYXQgbGVhc3QgQG5yX2lvdmVjcyBlbnRyaWVzLiBBbGxvY2F0aW9ucyB3aWxsIGJlIGRvbmUgZnJvbSB0aGUKLSAqICAgZnNfYmlvX3NldC4gQWxzbyBzZWUgQGJpb19hbGxvY19iaW9zZXQuCi0gKgotICogICBJZiAlX19HRlBfV0FJVCBpcyBzZXQsIHRoZW4gYmlvX2FsbG9jIHdpbGwgYWx3YXlzIGJlIGFibGUgdG8gYWxsb2NhdGUKLSAqICAgYSBiaW8uIFRoaXMgaXMgZHVlIHRvIHRoZSBtZW1wb29sIGd1YXJhbnRlZXMuIFRvIG1ha2UgdGhpcyB3b3JrLCBjYWxsZXJzCi0gKiAgIG11c3QgbmV2ZXIgYWxsb2NhdGUgbW9yZSB0aGFuIDEgYmlvIGF0IGEgdGltZSBmcm9tIHRoaXMgcG9vbC4gQ2FsbGVycwotICogICB0aGF0IG5lZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIDEgYmlvIG11c3QgYWx3YXlzIHN1Ym1pdCB0aGUgcHJldmlvdXNseQotICogICBhbGxvY2F0ZWQgYmlvIGZvciBJTyBiZWZvcmUgYXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBhIG5ldyBvbmUuIEZhaWx1cmUgdG8KLSAqICAgZG8gc28gY2FuIGNhdXNlIGxpdmVsb2NrcyB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCisgKiAgIEFsbG9jYXRlIGEgbmV3IGJpbyB3aXRoIEBucl9pb3ZlY3MgYnZlY3MuICBJZiBAZ2ZwX21hc2sgY29udGFpbnMKKyAqICAgJV9fR0ZQX1dBSVQsIHRoZSBhbGxvY2F0aW9uIGlzIGd1YXJhbnRlZWQgdG8gc3VjY2VlZC4KICAqCiAgKiovCiBzdHJ1Y3QgYmlvICpiaW9fa21hbGxvYyhnZnBfdCBnZnBfbWFzaywgaW50IG5yX2lvdmVjcykKQEAgLTM4MCw2ICszODQsNyBAQAogCiAJcmV0dXJuIGJpbzsKIH0KK0VYUE9SVF9TWU1CT0woYmlvX2ttYWxsb2MpOwogCiB2b2lkIHplcm9fZmlsbF9iaW8oc3RydWN0IGJpbyAqYmlvKQogewpAQCAtNDAyLDcgKzQwNyw3IEBACiAgKgogICogRGVzY3JpcHRpb246CiAgKiAgIFB1dCBhIHJlZmVyZW5jZSB0byBhICZzdHJ1Y3QgYmlvLCBlaXRoZXIgb25lIHlvdSBoYXZlIGdvdHRlbiB3aXRoCi0gKiAgIGJpb19hbGxvYyBvciBiaW9fZ2V0LiBUaGUgbGFzdCBwdXQgb2YgYSBiaW8gd2lsbCBmcmVlIGl0LgorICogICBiaW9fYWxsb2MsIGJpb19nZXQgb3IgYmlvX2Nsb25lLiBUaGUgbGFzdCBwdXQgb2YgYSBiaW8gd2lsbCBmcmVlIGl0LgogICoqLwogdm9pZCBiaW9fcHV0KHN0cnVjdCBiaW8gKmJpbykKIHsKQEAgLTQxNiw2ICs0MjEsNyBAQAogCQliaW8tPmJpX2Rlc3RydWN0b3IoYmlvKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKGJpb19wdXQpOwogCiBpbmxpbmUgaW50IGJpb19waHlzX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CkBAIC00MjQsNiArNDMwLDcgQEAKIAogCXJldHVybiBiaW8tPmJpX3BoeXNfc2VnbWVudHM7CiB9CitFWFBPUlRfU1lNQk9MKGJpb19waHlzX3NlZ21lbnRzKTsKIAogLyoqCiAgKiAJX19iaW9fY2xvbmUJLQljbG9uZSBhIGJpbwpAQCAtNDUxLDYgKzQ1OCw3IEBACiAJYmlvLT5iaV9zaXplID0gYmlvX3NyYy0+Ymlfc2l6ZTsKIAliaW8tPmJpX2lkeCA9IGJpb19zcmMtPmJpX2lkeDsKIH0KK0VYUE9SVF9TWU1CT0woX19iaW9fY2xvbmUpOwogCiAvKioKICAqCWJpb19jbG9uZQktCWNsb25lIGEgYmlvCkBAIC00ODIsNiArNDkwLDcgQEAKIAogCXJldHVybiBiOwogfQorRVhQT1JUX1NZTUJPTChiaW9fY2xvbmUpOwogCiAvKioKICAqCWJpb19nZXRfbnJfdmVjcwkJLSByZXR1cm4gYXBwcm94IG51bWJlciBvZiB2ZWNzCkBAIC01MDUsNiArNTE0LDcgQEAKIAogCXJldHVybiBucl9wYWdlczsKIH0KK0VYUE9SVF9TWU1CT0woYmlvX2dldF9ucl92ZWNzKTsKIAogc3RhdGljIGludCBfX2Jpb19hZGRfcGFnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZQogCQkJICAqcGFnZSwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IG9mZnNldCwKQEAgLTYzNSw2ICs2NDUsNyBAQAogCXJldHVybiBfX2Jpb19hZGRfcGFnZShxLCBiaW8sIHBhZ2UsIGxlbiwgb2Zmc2V0LAogCQkJICAgICAgcXVldWVfbWF4X2h3X3NlY3RvcnMocSkpOwogfQorRVhQT1JUX1NZTUJPTChiaW9fYWRkX3BjX3BhZ2UpOwogCiAvKioKICAqCWJpb19hZGRfcGFnZQktCWF0dGVtcHQgdG8gYWRkIHBhZ2UgdG8gYmlvCkBAIC02NTUsNiArNjY2LDcgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJpby0+YmlfYmRldik7CiAJcmV0dXJuIF9fYmlvX2FkZF9wYWdlKHEsIGJpbywgcGFnZSwgbGVuLCBvZmZzZXQsIHF1ZXVlX21heF9zZWN0b3JzKHEpKTsKIH0KK0VYUE9SVF9TWU1CT0woYmlvX2FkZF9wYWdlKTsKIAogc3RydWN0IGJpb19tYXBfZGF0YSB7CiAJc3RydWN0IGJpb192ZWMgKmlvdmVjczsKQEAgLTc3Niw2ICs3ODgsNyBAQAogCWJpb19wdXQoYmlvKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChiaW9fdW5jb3B5X3VzZXIpOwogCiAvKioKICAqCWJpb19jb3B5X3VzZXJfaW92CS0JY29weSB1c2VyIGRhdGEgdG8gYmlvCkBAIC05MjAsNiArOTMzLDcgQEAKIAogCXJldHVybiBiaW9fY29weV91c2VyX2lvdihxLCBtYXBfZGF0YSwgJmlvdiwgMSwgd3JpdGVfdG9fdm0sIGdmcF9tYXNrKTsKIH0KK0VYUE9SVF9TWU1CT0woYmlvX2NvcHlfdXNlcik7CiAKIHN0YXRpYyBzdHJ1Y3QgYmlvICpfX2Jpb19tYXBfdXNlcl9pb3Yoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkJICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKQEAgLTEwNTAsNiArMTA2NCw3IEBACiAKIAlyZXR1cm4gYmlvX21hcF91c2VyX2lvdihxLCBiZGV2LCAmaW92LCAxLCB3cml0ZV90b192bSwgZ2ZwX21hc2spOwogfQorRVhQT1JUX1NZTUJPTChiaW9fbWFwX3VzZXIpOwogCiAvKioKICAqCWJpb19tYXBfdXNlcl9pb3YgLSBtYXAgdXNlciBzZ19pb3ZlYyB0YWJsZSBpbnRvIGJpbwpAQCAtMTExNywxMyArMTEzMiwxMyBAQAogCV9fYmlvX3VubWFwX3VzZXIoYmlvKTsKIAliaW9fcHV0KGJpbyk7CiB9CitFWFBPUlRfU1lNQk9MKGJpb191bm1hcF91c2VyKTsKIAogc3RhdGljIHZvaWQgYmlvX21hcF9rZXJuX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKIHsKIAliaW9fcHV0KGJpbyk7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBiaW8gKl9fYmlvX21hcF9rZXJuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB2b2lkICpkYXRhLAogCQkJCSAgdW5zaWduZWQgaW50IGxlbiwgZ2ZwX3QgZ2ZwX21hc2spCiB7CkBAIC0xMTg5LDYgKzEyMDQsNyBAQAogCWJpb19wdXQoYmlvKTsKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIH0KK0VYUE9SVF9TWU1CT0woYmlvX21hcF9rZXJuKTsKIAogc3RhdGljIHZvaWQgYmlvX2NvcHlfa2Vybl9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7CkBAIC0xMjUwLDYgKzEyNjYsNyBAQAogCiAJcmV0dXJuIGJpbzsKIH0KK0VYUE9SVF9TWU1CT0woYmlvX2NvcHlfa2Vybik7CiAKIC8qCiAgKiBiaW9fc2V0X3BhZ2VzX2RpcnR5KCkgYW5kIGJpb19jaGVja19wYWdlc19kaXJ0eSgpIGFyZSBzdXBwb3J0IGZ1bmN0aW9ucwpAQCAtMTQwMCw2ICsxNDE3LDcgQEAKIAlpZiAoYmlvLT5iaV9lbmRfaW8pCiAJCWJpby0+YmlfZW5kX2lvKGJpbywgZXJyb3IpOwogfQorRVhQT1JUX1NZTUJPTChiaW9fZW5kaW8pOwogCiB2b2lkIGJpb19wYWlyX3JlbGVhc2Uoc3RydWN0IGJpb19wYWlyICpicCkKIHsKQEAgLTE0MTAsNiArMTQyOCw3IEBACiAJCW1lbXBvb2xfZnJlZShicCwgYnAtPmJpbzIuYmlfcHJpdmF0ZSk7CiAJfQogfQorRVhQT1JUX1NZTUJPTChiaW9fcGFpcl9yZWxlYXNlKTsKIAogc3RhdGljIHZvaWQgYmlvX3BhaXJfZW5kXzEoc3RydWN0IGJpbyAqYmksIGludCBlcnIpCiB7CkBAIC0xNDc3LDYgKzE0OTYsNyBAQAogCiAJcmV0dXJuIGJwOwogfQorRVhQT1JUX1NZTUJPTChiaW9fc3BsaXQpOwogCiAvKioKICAqICAgICAgYmlvX3NlY3Rvcl9vZmZzZXQgLSBGaW5kIGhhcmR3YXJlIHNlY3RvciBvZmZzZXQgaW4gYmlvCkBAIC0xNTQ3LDYgKzE1NjcsNyBAQAogCiAJa2ZyZWUoYnMpOwogfQorRVhQT1JUX1NZTUJPTChiaW9zZXRfZnJlZSk7CiAKIC8qKgogICogYmlvc2V0X2NyZWF0ZSAgLSBDcmVhdGUgYSBiaW9fc2V0CkBAIC0xNTkyLDYgKzE2MTMsNyBAQAogCWJpb3NldF9mcmVlKGJzKTsKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woYmlvc2V0X2NyZWF0ZSk7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBiaW92ZWNfaW5pdF9zbGFicyh2b2lkKQogewpAQCAtMTYzNiwyOSArMTY1OCw0IEBACiAKIAlyZXR1cm4gMDsKIH0KLQogc3Vic3lzX2luaXRjYWxsKGluaXRfYmlvKTsKLQotRVhQT1JUX1NZTUJPTChiaW9fYWxsb2MpOwotRVhQT1JUX1NZTUJPTChiaW9fa21hbGxvYyk7Ci1FWFBPUlRfU1lNQk9MKGJpb19wdXQpOwotRVhQT1JUX1NZTUJPTChiaW9fZnJlZSk7Ci1FWFBPUlRfU1lNQk9MKGJpb19lbmRpbyk7Ci1FWFBPUlRfU1lNQk9MKGJpb19pbml0KTsKLUVYUE9SVF9TWU1CT0woX19iaW9fY2xvbmUpOwotRVhQT1JUX1NZTUJPTChiaW9fY2xvbmUpOwotRVhQT1JUX1NZTUJPTChiaW9fcGh5c19zZWdtZW50cyk7Ci1FWFBPUlRfU1lNQk9MKGJpb19hZGRfcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKGJpb19hZGRfcGNfcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKGJpb19nZXRfbnJfdmVjcyk7Ci1FWFBPUlRfU1lNQk9MKGJpb19tYXBfdXNlcik7Ci1FWFBPUlRfU1lNQk9MKGJpb191bm1hcF91c2VyKTsKLUVYUE9SVF9TWU1CT0woYmlvX21hcF9rZXJuKTsKLUVYUE9SVF9TWU1CT0woYmlvX2NvcHlfa2Vybik7Ci1FWFBPUlRfU1lNQk9MKGJpb19wYWlyX3JlbGVhc2UpOwotRVhQT1JUX1NZTUJPTChiaW9fc3BsaXQpOwotRVhQT1JUX1NZTUJPTChiaW9fY29weV91c2VyKTsKLUVYUE9SVF9TWU1CT0woYmlvX3VuY29weV91c2VyKTsKLUVYUE9SVF9TWU1CT0woYmlvc2V0X2NyZWF0ZSk7Ci1FWFBPUlRfU1lNQk9MKGJpb3NldF9mcmVlKTsKLUVYUE9SVF9TWU1CT0woYmlvX2FsbG9jX2Jpb3NldCk7CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IDVkMWVkNTAuLjhiZWQwNTUgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC0yMTYsOCArMjE2LDYgQEAKICAqIGZyZWV6ZV9iZGV2ICAtLSAgbG9jayBhIGZpbGVzeXN0ZW0gYW5kIGZvcmNlIGl0IGludG8gYSBjb25zaXN0ZW50IHN0YXRlCiAgKiBAYmRldjoJYmxvY2tkZXZpY2UgdG8gbG9jawogICoKLSAqIFRoaXMgdGFrZXMgdGhlIGJsb2NrIGRldmljZSBiZF9tb3VudF9zZW0gdG8gbWFrZSBzdXJlIG5vIG5ldyBtb3VudHMKLSAqIGhhcHBlbiBvbiBiZGV2IHVudGlsIHRoYXdfYmRldigpIGlzIGNhbGxlZC4KICAqIElmIGEgc3VwZXJibG9jayBpcyBmb3VuZCBvbiB0aGlzIGRldmljZSwgd2UgdGFrZSB0aGUgc191bW91bnQgc2VtYXBob3JlCiAgKiBvbiBpdCB0byBtYWtlIHN1cmUgbm9ib2R5IHVubW91bnRzIHVudGlsIHRoZSBzbmFwc2hvdCBjcmVhdGlvbiBpcyBkb25lLgogICogVGhlIHJlZmVyZW5jZSBjb3VudGVyIChiZF9mc2ZyZWV6ZV9jb3VudCkgZ3VhcmFudGVlcyB0aGF0IG9ubHkgdGhlIGxhc3QKQEAgLTIzMiw0NiArMjMwLDU1IEBACiAJaW50IGVycm9yID0gMDsKIAogCW11dGV4X2xvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKLQlpZiAoYmRldi0+YmRfZnNmcmVlemVfY291bnQgPiAwKSB7Ci0JCWJkZXYtPmJkX2ZzZnJlZXplX2NvdW50Kys7CisJaWYgKCsrYmRldi0+YmRfZnNmcmVlemVfY291bnQgPiAxKSB7CisJCS8qCisJCSAqIFdlIGRvbid0IGV2ZW4gbmVlZCB0byBncmFiIGEgcmVmZXJlbmNlIC0gdGhlIGZpcnN0IGNhbGwKKwkJICogdG8gZnJlZXplX2JkZXYgZ3JhYiBhbiBhY3RpdmUgcmVmZXJlbmNlIGFuZCBvbmx5IHRoZSBsYXN0CisJCSAqIHRoYXdfYmRldiBkcm9wcyBpdC4KKwkJICovCiAJCXNiID0gZ2V0X3N1cGVyKGJkZXYpOworCQlkcm9wX3N1cGVyKHNiKTsKIAkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9mc2ZyZWV6ZV9tdXRleCk7CiAJCXJldHVybiBzYjsKIAl9Ci0JYmRldi0+YmRfZnNmcmVlemVfY291bnQrKzsKIAotCWRvd24oJmJkZXYtPmJkX21vdW50X3NlbSk7Ci0Jc2IgPSBnZXRfc3VwZXIoYmRldik7Ci0JaWYgKHNiICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0JCXNiLT5zX2Zyb3plbiA9IFNCX0ZSRUVaRV9XUklURTsKLQkJc21wX3dtYigpOwotCi0JCXN5bmNfZmlsZXN5c3RlbShzYik7Ci0KLQkJc2ItPnNfZnJvemVuID0gU0JfRlJFRVpFX1RSQU5TOwotCQlzbXBfd21iKCk7Ci0KLQkJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKLQotCQlpZiAoc2ItPnNfb3AtPmZyZWV6ZV9mcykgewotCQkJZXJyb3IgPSBzYi0+c19vcC0+ZnJlZXplX2ZzKHNiKTsKLQkJCWlmIChlcnJvcikgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkiVkZTOkZpbGVzeXN0ZW0gZnJlZXplIGZhaWxlZFxuIik7Ci0JCQkJc2ItPnNfZnJvemVuID0gU0JfVU5GUk9aRU47Ci0JCQkJZHJvcF9zdXBlcihzYik7Ci0JCQkJdXAoJmJkZXYtPmJkX21vdW50X3NlbSk7Ci0JCQkJYmRldi0+YmRfZnNmcmVlemVfY291bnQtLTsKLQkJCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKLQkJCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7Ci0JCQl9Ci0JCX0KKwlzYiA9IGdldF9hY3RpdmVfc3VwZXIoYmRldik7CisJaWYgKCFzYikKKwkJZ290byBvdXQ7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHNiKTsKKwkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9mc2ZyZWV6ZV9tdXRleCk7CisJCXJldHVybiBzYjsKIAl9CiAKKwlzYi0+c19mcm96ZW4gPSBTQl9GUkVFWkVfV1JJVEU7CisJc21wX3dtYigpOworCisJc3luY19maWxlc3lzdGVtKHNiKTsKKworCXNiLT5zX2Zyb3plbiA9IFNCX0ZSRUVaRV9UUkFOUzsKKwlzbXBfd21iKCk7CisKKwlzeW5jX2Jsb2NrZGV2KHNiLT5zX2JkZXYpOworCisJaWYgKHNiLT5zX29wLT5mcmVlemVfZnMpIHsKKwkJZXJyb3IgPSBzYi0+c19vcC0+ZnJlZXplX2ZzKHNiKTsKKwkJaWYgKGVycm9yKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiVkZTOkZpbGVzeXN0ZW0gZnJlZXplIGZhaWxlZFxuIik7CisJCQlzYi0+c19mcm96ZW4gPSBTQl9VTkZST1pFTjsKKwkJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHNiKTsKKwkJCWJkZXYtPmJkX2ZzZnJlZXplX2NvdW50LS07CisJCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKKwkJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwkJfQorCX0KKwl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKKworIG91dDoKIAlzeW5jX2Jsb2NrZGV2KGJkZXYpOwogCW11dGV4X3VubG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOwotCi0JcmV0dXJuIHNiOwkvKiB0aGF3X2JkZXYgcmVsZWFzZXMgcy0+c191bW91bnQgYW5kIGJkX21vdW50X3NlbSAqLworCXJldHVybiBzYjsJLyogdGhhd19iZGV2IHJlbGVhc2VzIHMtPnNfdW1vdW50ICovCiB9CiBFWFBPUlRfU1lNQk9MKGZyZWV6ZV9iZGV2KTsKIApAQCAtMjg0LDQ0ICsyOTEsNDQgQEAKICAqLwogaW50IHRoYXdfYmRldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWludCBlcnJvciA9IDA7CisJaW50IGVycm9yID0gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKLQlpZiAoIWJkZXYtPmJkX2ZzZnJlZXplX2NvdW50KSB7Ci0JCW11dGV4X3VubG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaWYgKCFiZGV2LT5iZF9mc2ZyZWV6ZV9jb3VudCkKKwkJZ290byBvdXRfdW5sb2NrOwogCi0JYmRldi0+YmRfZnNmcmVlemVfY291bnQtLTsKLQlpZiAoYmRldi0+YmRfZnNmcmVlemVfY291bnQgPiAwKSB7Ci0JCWlmIChzYikKLQkJCWRyb3Bfc3VwZXIoc2IpOwotCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKLQkJcmV0dXJuIDA7Ci0JfQorCWVycm9yID0gMDsKKwlpZiAoLS1iZGV2LT5iZF9mc2ZyZWV6ZV9jb3VudCA+IDApCisJCWdvdG8gb3V0X3VubG9jazsKIAotCWlmIChzYikgewotCQlCVUdfT04oc2ItPnNfYmRldiAhPSBiZGV2KTsKLQkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0JCQlpZiAoc2ItPnNfb3AtPnVuZnJlZXplX2ZzKSB7Ci0JCQkJZXJyb3IgPSBzYi0+c19vcC0+dW5mcmVlemVfZnMoc2IpOwotCQkJCWlmIChlcnJvcikgewotCQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkJCSJWRlM6RmlsZXN5c3RlbSB0aGF3IGZhaWxlZFxuIik7Ci0JCQkJCXNiLT5zX2Zyb3plbiA9IFNCX0ZSRUVaRV9UUkFOUzsKLQkJCQkJYmRldi0+YmRfZnNmcmVlemVfY291bnQrKzsKLQkJCQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9mc2ZyZWV6ZV9tdXRleCk7Ci0JCQkJCXJldHVybiBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCQlzYi0+c19mcm96ZW4gPSBTQl9VTkZST1pFTjsKLQkJCXNtcF93bWIoKTsKLQkJCXdha2VfdXAoJnNiLT5zX3dhaXRfdW5mcm96ZW4pOworCWlmICghc2IpCisJCWdvdG8gb3V0X3VubG9jazsKKworCUJVR19PTihzYi0+c19iZGV2ICE9IGJkZXYpOworCWRvd25fd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlnb3RvIG91dF9kZWFjdGl2YXRlOworCisJaWYgKHNiLT5zX29wLT51bmZyZWV6ZV9mcykgeworCQllcnJvciA9IHNiLT5zX29wLT51bmZyZWV6ZV9mcyhzYik7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIlZGUzpGaWxlc3lzdGVtIHRoYXcgZmFpbGVkXG4iKTsKKwkJCXNiLT5zX2Zyb3plbiA9IFNCX0ZSRUVaRV9UUkFOUzsKKwkJCWJkZXYtPmJkX2ZzZnJlZXplX2NvdW50Kys7CisJCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKKwkJCXJldHVybiBlcnJvcjsKIAkJfQotCQlkcm9wX3N1cGVyKHNiKTsKIAl9CiAKLQl1cCgmYmRldi0+YmRfbW91bnRfc2VtKTsKKwlzYi0+c19mcm96ZW4gPSBTQl9VTkZST1pFTjsKKwlzbXBfd21iKCk7CisJd2FrZV91cCgmc2ItPnNfd2FpdF91bmZyb3plbik7CisKK291dF9kZWFjdGl2YXRlOgorCWlmIChzYikKKwkJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIoc2IpOworb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQzMCw3ICs0MzcsNiBAQAogCiAJbWVtc2V0KGJkZXYsIDAsIHNpemVvZigqYmRldikpOwogCW11dGV4X2luaXQoJmJkZXYtPmJkX211dGV4KTsKLQlzZW1hX2luaXQoJmJkZXYtPmJkX21vdW50X3NlbSwgMSk7CiAJSU5JVF9MSVNUX0hFQUQoJmJkZXYtPmJkX2lub2Rlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmJkZXYtPmJkX2xpc3QpOwogI2lmZGVmIENPTkZJR19TWVNGUwpAQCAtMTI0Miw4ICsxMjQ4LDggQEAKIAkJCWJkX3NldF9zaXplKGJkZXYsIChsb2ZmX3QpYmRldi0+YmRfcGFydC0+bnJfc2VjdHMgPDwgOSk7CiAJCX0KIAl9IGVsc2UgewotCQlwdXRfZGlzayhkaXNrKTsKIAkJbW9kdWxlX3B1dChkaXNrLT5mb3BzLT5vd25lcik7CisJCXB1dF9kaXNrKGRpc2spOwogCQlkaXNrID0gTlVMTDsKIAkJaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpIHsKIAkJCWlmIChiZGV2LT5iZF9kaXNrLT5mb3BzLT5vcGVuKSB7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9hY2wuYyBiL2ZzL2J0cmZzL2FjbC5jCmluZGV4IGYxMjg0MjcuLjM2MTYwNDIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2FjbC5jCisrKyBiL2ZzL2J0cmZzL2FjbC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAiYnRyZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgogCi0jaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAorI2lmZGVmIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wKIAogc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKmJ0cmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7CkBAIC0zMTMsNyArMzEzLDcgQEAKIAkuc2V0CT0gYnRyZnNfeGF0dHJfYWNsX2FjY2Vzc19zZXQsCiB9OwogCi0jZWxzZSAvKiBDT05GSUdfRlNfUE9TSVhfQUNMICovCisjZWxzZSAvKiBDT05GSUdfQlRSRlNfRlNfUE9TSVhfQUNMICovCiAKIGludCBidHJmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTMyNSw0ICszMjUsNCBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogQ09ORklHX0ZTX1BPU0lYX0FDTCAqLworI2VuZGlmIC8qIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wgKi8KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5jIGIvZnMvYnRyZnMvYXN5bmMtdGhyZWFkLmMKaW5kZXggMDE5ZThhZi4uYzA4NjFlNyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvYXN5bmMtdGhyZWFkLmMKKysrIGIvZnMvYnRyZnMvYXN5bmMtdGhyZWFkLmMKQEAgLTQ4LDYgKzQ4LDkgQEAKIAkvKiBudW1iZXIgb2YgdGhpbmdzIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KIAlhdG9taWNfdCBudW1fcGVuZGluZzsKIAorCS8qIHJlZmVyZW5jZSBjb3VudGVyIGZvciB0aGlzIHN0cnVjdCAqLworCWF0b21pY190IHJlZnM7CisKIAl1bnNpZ25lZCBsb25nIHNlcXVlbmNlOwogCiAJLyogcHJvdGVjdHMgdGhlIHBlbmRpbmcgbGlzdC4gKi8KQEAgLTYxLDYgKzY0LDUxIEBACiB9OwogCiAvKgorICogYnRyZnNfc3RhcnRfd29ya2VycyB1c2VzIGt0aHJlYWRfcnVuLCB3aGljaCBjYW4gYmxvY2sgd2FpdGluZyBmb3IgbWVtb3J5CisgKiBmb3IgYSB2ZXJ5IGxvbmcgdGltZS4gIEl0IHdpbGwgYWN0dWFsbHkgdGhyb3R0bGUgb24gcGFnZSB3cml0ZWJhY2ssCisgKiBhbmQgc28gaXQgbWF5IG5vdCBtYWtlIHByb2dyZXNzIHVudGlsIGFmdGVyIG91ciBidHJmcyB3b3JrZXIgdGhyZWFkcworICogcHJvY2VzcyBhbGwgb2YgdGhlIHBlbmRpbmcgd29yayBzdHJ1Y3RzIGluIHRoZWlyIHF1ZXVlCisgKgorICogVGhpcyBtZWFucyB3ZSBjYW4ndCB1c2UgYnRyZnNfc3RhcnRfd29ya2VycyBmcm9tIGluc2lkZSBhIGJ0cmZzIHdvcmtlcgorICogdGhyZWFkIHRoYXQgaXMgdXNlZCBhcyBwYXJ0IG9mIGNsZWFuaW5nIGRpcnR5IG1lbW9yeSwgd2hpY2ggcHJldHR5IG11Y2gKKyAqIGludm9sdmVzIGFsbCBvZiB0aGUgd29ya2VyIHRocmVhZHMuCisgKgorICogSW5zdGVhZCB3ZSBoYXZlIGEgaGVscGVyIHF1ZXVlIHdobyBuZXZlciBoYXMgbW9yZSB0aGFuIG9uZSB0aHJlYWQKKyAqIHdoZXJlIHdlIHNjaGVkdWxlciB0aHJlYWQgc3RhcnQgb3BlcmF0aW9ucy4gIFRoaXMgd29ya2VyX3N0YXJ0IHN0cnVjdAorICogaXMgdXNlZCB0byBjb250YWluIHRoZSB3b3JrIGFuZCBob2xkIGEgcG9pbnRlciB0byB0aGUgcXVldWUgdGhhdCBuZWVkcworICogYW5vdGhlciB3b3JrZXIuCisgKi8KK3N0cnVjdCB3b3JrZXJfc3RhcnQgeworCXN0cnVjdCBidHJmc193b3JrIHdvcms7CisJc3RydWN0IGJ0cmZzX3dvcmtlcnMgKnF1ZXVlOworfTsKKworc3RhdGljIHZvaWQgc3RhcnRfbmV3X3dvcmtlcl9mdW5jKHN0cnVjdCBidHJmc193b3JrICp3b3JrKQoreworCXN0cnVjdCB3b3JrZXJfc3RhcnQgKnN0YXJ0OworCXN0YXJ0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3b3JrZXJfc3RhcnQsIHdvcmspOworCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoc3RhcnQtPnF1ZXVlLCAxKTsKKwlrZnJlZShzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfbmV3X3dvcmtlcihzdHJ1Y3QgYnRyZnNfd29ya2VycyAqcXVldWUpCit7CisJc3RydWN0IHdvcmtlcl9zdGFydCAqc3RhcnQ7CisJaW50IHJldDsKKworCXN0YXJ0ID0ga3phbGxvYyhzaXplb2YoKnN0YXJ0KSwgR0ZQX05PRlMpOworCWlmICghc3RhcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJc3RhcnQtPndvcmsuZnVuYyA9IHN0YXJ0X25ld193b3JrZXJfZnVuYzsKKwlzdGFydC0+cXVldWUgPSBxdWV1ZTsKKwlyZXQgPSBidHJmc19xdWV1ZV93b3JrZXIocXVldWUtPmF0b21pY193b3JrZXJfc3RhcnQsICZzdGFydC0+d29yayk7CisJaWYgKHJldCkKKwkJa2ZyZWUoc3RhcnQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBoZWxwZXIgZnVuY3Rpb24gdG8gbW92ZSBhIHRocmVhZCBvbnRvIHRoZSBpZGxlIGxpc3QgYWZ0ZXIgaXQKICAqIGhhcyBmaW5pc2hlZCBzb21lIHJlcXVlc3RzLgogICovCkBAIC03MSw3ICsxMTksMTIgQEAKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtlci0+d29ya2Vycy0+bG9jaywgZmxhZ3MpOwogCQl3b3JrZXItPmlkbGUgPSAxOwotCQlsaXN0X21vdmUoJndvcmtlci0+d29ya2VyX2xpc3QsICZ3b3JrZXItPndvcmtlcnMtPmlkbGVfbGlzdCk7CisKKwkJLyogdGhlIGxpc3QgbWF5IGJlIGVtcHR5IGlmIHRoZSB3b3JrZXIgaXMganVzdCBzdGFydGluZyAqLworCQlpZiAoIWxpc3RfZW1wdHkoJndvcmtlci0+d29ya2VyX2xpc3QpKSB7CisJCQlsaXN0X21vdmUoJndvcmtlci0+d29ya2VyX2xpc3QsCisJCQkJICZ3b3JrZXItPndvcmtlcnMtPmlkbGVfbGlzdCk7CisJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29ya2VyLT53b3JrZXJzLT5sb2NrLCBmbGFncyk7CiAJfQogfQpAQCAtODcsMjMgKzE0MCw1MSBAQAogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29ya2VyLT53b3JrZXJzLT5sb2NrLCBmbGFncyk7CiAJCXdvcmtlci0+aWRsZSA9IDA7Ci0JCWxpc3RfbW92ZV90YWlsKCZ3b3JrZXItPndvcmtlcl9saXN0LAotCQkJICAgICAgICZ3b3JrZXItPndvcmtlcnMtPndvcmtlcl9saXN0KTsKKworCQlpZiAoIWxpc3RfZW1wdHkoJndvcmtlci0+d29ya2VyX2xpc3QpKSB7CisJCQlsaXN0X21vdmVfdGFpbCgmd29ya2VyLT53b3JrZXJfbGlzdCwKKwkJCQkgICAgICAmd29ya2VyLT53b3JrZXJzLT53b3JrZXJfbGlzdCk7CisJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29ya2VyLT53b3JrZXJzLT5sb2NrLCBmbGFncyk7CiAJfQogfQogCitzdGF0aWMgdm9pZCBjaGVja19wZW5kaW5nX3dvcmtlcl9jcmVhdGVzKHN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXIpCit7CisJc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMgPSB3b3JrZXItPndvcmtlcnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJtYigpOworCWlmICghd29ya2Vycy0+YXRvbWljX3N0YXJ0X3BlbmRpbmcpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJaWYgKCF3b3JrZXJzLT5hdG9taWNfc3RhcnRfcGVuZGluZykKKwkJZ290byBvdXQ7CisKKwl3b3JrZXJzLT5hdG9taWNfc3RhcnRfcGVuZGluZyA9IDA7CisJaWYgKHdvcmtlcnMtPm51bV93b3JrZXJzICsgd29ya2Vycy0+bnVtX3dvcmtlcnNfc3RhcnRpbmcgPj0KKwkgICAgd29ya2Vycy0+bWF4X3dvcmtlcnMpCisJCWdvdG8gb3V0OworCisJd29ya2Vycy0+bnVtX3dvcmtlcnNfc3RhcnRpbmcgKz0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJc3RhcnRfbmV3X3dvcmtlcih3b3JrZXJzKTsKKwlyZXR1cm47CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyBub2lubGluZSBpbnQgcnVuX29yZGVyZWRfY29tcGxldGlvbnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsCiAJCQkJCSAgICBzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJaWYgKCF3b3JrZXJzLT5vcmRlcmVkKQogCQlyZXR1cm4gMDsKIAogCXNldF9iaXQoV09SS19ET05FX0JJVCwgJndvcmstPmZsYWdzKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZ3b3JrZXJzLT5vcmRlcl9sb2NrKTsKIAogCXdoaWxlICgxKSB7CiAJCWlmICghbGlzdF9lbXB0eSgmd29ya2Vycy0+cHJpb19vcmRlcl9saXN0KSkgewpAQCAtMTI2LDQ1ICsyMDcsMTE4IEBACiAJCWlmICh0ZXN0X2FuZF9zZXRfYml0KFdPUktfT1JERVJfRE9ORV9CSVQsICZ3b3JrLT5mbGFncykpCiAJCQlicmVhazsKIAotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrKCZ3b3JrZXJzLT5vcmRlcl9sb2NrKTsKIAogCQl3b3JrLT5vcmRlcmVkX2Z1bmMod29yayk7CiAKIAkJLyogbm93IHRha2UgdGhlIGxvY2sgYWdhaW4gYW5kIGNhbGwgdGhlIGZyZWVpbmcgY29kZSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29ya2Vycy0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2soJndvcmtlcnMtPm9yZGVyX2xvY2spOwogCQlsaXN0X2RlbCgmd29yay0+b3JkZXJfbGlzdCk7CiAJCXdvcmstPm9yZGVyZWRfZnJlZSh3b3JrKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2soJndvcmtlcnMtPm9yZGVyX2xvY2spOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBwdXRfd29ya2VyKHN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXIpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJndvcmtlci0+cmVmcykpCisJCWtmcmVlKHdvcmtlcik7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X3dvcmtlcl9zaHV0ZG93bihzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCAqd29ya2VyKQoreworCWludCBmcmVlaXQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmd29ya2VyLT5sb2NrKTsKKwlzcGluX2xvY2soJndvcmtlci0+d29ya2Vycy0+bG9jayk7CisJaWYgKHdvcmtlci0+d29ya2Vycy0+bnVtX3dvcmtlcnMgPiAxICYmCisJICAgIHdvcmtlci0+aWRsZSAmJgorCSAgICAhd29ya2VyLT53b3JraW5nICYmCisJICAgICFsaXN0X2VtcHR5KCZ3b3JrZXItPndvcmtlcl9saXN0KSAmJgorCSAgICBsaXN0X2VtcHR5KCZ3b3JrZXItPnByaW9fcGVuZGluZykgJiYKKwkgICAgbGlzdF9lbXB0eSgmd29ya2VyLT5wZW5kaW5nKSAmJgorCSAgICBhdG9taWNfcmVhZCgmd29ya2VyLT5udW1fcGVuZGluZykgPT0gMCkgeworCQlmcmVlaXQgPSAxOworCQlsaXN0X2RlbF9pbml0KCZ3b3JrZXItPndvcmtlcl9saXN0KTsKKwkJd29ya2VyLT53b3JrZXJzLT5udW1fd29ya2Vycy0tOworCX0KKwlzcGluX3VubG9jaygmd29ya2VyLT53b3JrZXJzLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJndvcmtlci0+bG9jayk7CisKKwlpZiAoZnJlZWl0KQorCQlwdXRfd29ya2VyKHdvcmtlcik7CisJcmV0dXJuIGZyZWVpdDsKK30KKworc3RhdGljIHN0cnVjdCBidHJmc193b3JrICpnZXRfbmV4dF93b3JrKHN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXIsCisJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnByaW9faGVhZCwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfd29yayAqd29yayA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyID0gTlVMTDsKKworCWlmKCFsaXN0X2VtcHR5KHByaW9faGVhZCkpCisJCWN1ciA9IHByaW9faGVhZC0+bmV4dDsKKworCXNtcF9tYigpOworCWlmICghbGlzdF9lbXB0eSgmd29ya2VyLT5wcmlvX3BlbmRpbmcpKQorCQlnb3RvIHJlZmlsbDsKKworCWlmICghbGlzdF9lbXB0eShoZWFkKSkKKwkJY3VyID0gaGVhZC0+bmV4dDsKKworCWlmIChjdXIpCisJCWdvdG8gb3V0OworCityZWZpbGw6CisJc3Bpbl9sb2NrX2lycSgmd29ya2VyLT5sb2NrKTsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJndvcmtlci0+cHJpb19wZW5kaW5nLCBwcmlvX2hlYWQpOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmd29ya2VyLT5wZW5kaW5nLCBoZWFkKTsKKworCWlmICghbGlzdF9lbXB0eShwcmlvX2hlYWQpKQorCQljdXIgPSBwcmlvX2hlYWQtPm5leHQ7CisJZWxzZSBpZiAoIWxpc3RfZW1wdHkoaGVhZCkpCisJCWN1ciA9IGhlYWQtPm5leHQ7CisJc3Bpbl91bmxvY2tfaXJxKCZ3b3JrZXItPmxvY2spOworCisJaWYgKCFjdXIpCisJCWdvdG8gb3V0X2ZhaWw7CisKK291dDoKKwl3b3JrID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc193b3JrLCBsaXN0KTsKKworb3V0X2ZhaWw6CisJcmV0dXJuIHdvcms7Cit9CisKIC8qCiAgKiBtYWluIGxvb3AgZm9yIHNlcnZpY2luZyB3b3JrIGl0ZW1zCiAgKi8KIHN0YXRpYyBpbnQgd29ya2VyX2xvb3Aodm9pZCAqYXJnKQogewogCXN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXIgPSBhcmc7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHByaW9faGVhZDsKIAlzdHJ1Y3QgYnRyZnNfd29yayAqd29yazsKKworCUlOSVRfTElTVF9IRUFEKCZoZWFkKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpb19oZWFkKTsKKwogCWRvIHsKLQkJc3Bpbl9sb2NrX2lycSgmd29ya2VyLT5sb2NrKTsKLWFnYWluX2xvY2tlZDoKK2FnYWluOgogCQl3aGlsZSAoMSkgewotCQkJaWYgKCFsaXN0X2VtcHR5KCZ3b3JrZXItPnByaW9fcGVuZGluZykpCi0JCQkJY3VyID0gd29ya2VyLT5wcmlvX3BlbmRpbmcubmV4dDsKLQkJCWVsc2UgaWYgKCFsaXN0X2VtcHR5KCZ3b3JrZXItPnBlbmRpbmcpKQotCQkJCWN1ciA9IHdvcmtlci0+cGVuZGluZy5uZXh0OwotCQkJZWxzZQorCisKKwkJCXdvcmsgPSBnZXRfbmV4dF93b3JrKHdvcmtlciwgJnByaW9faGVhZCwgJmhlYWQpOworCQkJaWYgKCF3b3JrKQogCQkJCWJyZWFrOwogCi0JCQl3b3JrID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc193b3JrLCBsaXN0KTsKIAkJCWxpc3RfZGVsKCZ3b3JrLT5saXN0KTsKIAkJCWNsZWFyX2JpdChXT1JLX1FVRVVFRF9CSVQsICZ3b3JrLT5mbGFncyk7CiAKIAkJCXdvcmstPndvcmtlciA9IHdvcmtlcjsKLQkJCXNwaW5fdW5sb2NrX2lycSgmd29ya2VyLT5sb2NrKTsKIAogCQkJd29yay0+ZnVuYyh3b3JrKTsKIApAQCAtMTc1LDkgKzMyOSwxMyBAQAogCQkJICovCiAJCQlydW5fb3JkZXJlZF9jb21wbGV0aW9ucyh3b3JrZXItPndvcmtlcnMsIHdvcmspOwogCi0JCQlzcGluX2xvY2tfaXJxKCZ3b3JrZXItPmxvY2spOwotCQkJY2hlY2tfaWRsZV93b3JrZXIod29ya2VyKTsKKwkJCWNoZWNrX3BlbmRpbmdfd29ya2VyX2NyZWF0ZXMod29ya2VyKTsKKwogCQl9CisKKwkJc3Bpbl9sb2NrX2lycSgmd29ya2VyLT5sb2NrKTsKKwkJY2hlY2tfaWRsZV93b3JrZXIod29ya2VyKTsKKwogCQlpZiAoZnJlZXppbmcoY3VycmVudCkpIHsKIAkJCXdvcmtlci0+d29ya2luZyA9IDA7CiAJCQlzcGluX3VubG9ja19pcnEoJndvcmtlci0+bG9jayk7CkBAIC0yMTYsOCArMzc0LDEwIEBACiAJCQkJc3Bpbl9sb2NrX2lycSgmd29ya2VyLT5sb2NrKTsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJCWlmICghbGlzdF9lbXB0eSgmd29ya2VyLT5wZW5kaW5nKSB8fAotCQkJCSAgICAhbGlzdF9lbXB0eSgmd29ya2VyLT5wcmlvX3BlbmRpbmcpKQotCQkJCQlnb3RvIGFnYWluX2xvY2tlZDsKKwkJCQkgICAgIWxpc3RfZW1wdHkoJndvcmtlci0+cHJpb19wZW5kaW5nKSkgeworCQkJCQlzcGluX3VubG9ja19pcnEoJndvcmtlci0+bG9jayk7CisJCQkJCWdvdG8gYWdhaW47CisJCQkJfQogCiAJCQkJLyoKIAkJCQkgKiB0aGlzIG1ha2VzIHN1cmUgd2UgZ2V0IGEgd2FrZXVwIHdoZW4gc29tZW9uZQpAQCAtMjI2LDggKzM4NiwxMyBAQAogCQkJCXdvcmtlci0+d29ya2luZyA9IDA7CiAJCQkJc3Bpbl91bmxvY2tfaXJxKCZ3b3JrZXItPmxvY2spOwogCi0JCQkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQkJCXNjaGVkdWxlKCk7CisJCQkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJCQkJc2NoZWR1bGVfdGltZW91dChIWiAqIDEyMCk7CisJCQkJCWlmICghd29ya2VyLT53b3JraW5nICYmCisJCQkJCSAgICB0cnlfd29ya2VyX3NodXRkb3duKHdvcmtlcikpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQogCQkJfQogCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQl9CkBAIC0yNDIsNDEgKzQwNyw2MSBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKmN1cjsKIAlzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCAqd29ya2VyOworCWludCBjYW5fc3RvcDsKIAorCXNwaW5fbG9ja19pcnEoJndvcmtlcnMtPmxvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJndvcmtlcnMtPmlkbGVfbGlzdCwgJndvcmtlcnMtPndvcmtlcl9saXN0KTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJndvcmtlcnMtPndvcmtlcl9saXN0KSkgewogCQljdXIgPSB3b3JrZXJzLT53b3JrZXJfbGlzdC5uZXh0OwogCQl3b3JrZXIgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQsCiAJCQkJICAgIHdvcmtlcl9saXN0KTsKLQkJa3RocmVhZF9zdG9wKHdvcmtlci0+dGFzayk7Ci0JCWxpc3RfZGVsKCZ3b3JrZXItPndvcmtlcl9saXN0KTsKLQkJa2ZyZWUod29ya2VyKTsKKworCQlhdG9taWNfaW5jKCZ3b3JrZXItPnJlZnMpOworCQl3b3JrZXJzLT5udW1fd29ya2VycyAtPSAxOworCQlpZiAoIWxpc3RfZW1wdHkoJndvcmtlci0+d29ya2VyX2xpc3QpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZ3b3JrZXItPndvcmtlcl9saXN0KTsKKwkJCXB1dF93b3JrZXIod29ya2VyKTsKKwkJCWNhbl9zdG9wID0gMTsKKwkJfSBlbHNlCisJCQljYW5fc3RvcCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSgmd29ya2Vycy0+bG9jayk7CisJCWlmIChjYW5fc3RvcCkKKwkJCWt0aHJlYWRfc3RvcCh3b3JrZXItPnRhc2spOworCQlzcGluX2xvY2tfaXJxKCZ3b3JrZXJzLT5sb2NrKTsKKwkJcHV0X3dvcmtlcih3b3JrZXIpOwogCX0KKwlzcGluX3VubG9ja19pcnEoJndvcmtlcnMtPmxvY2spOwogCXJldHVybiAwOwogfQogCiAvKgogICogc2ltcGxlIGluaXQgb24gc3RydWN0IGJ0cmZzX3dvcmtlcnMKICAqLwotdm9pZCBidHJmc19pbml0X3dvcmtlcnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsIGNoYXIgKm5hbWUsIGludCBtYXgpCit2b2lkIGJ0cmZzX2luaXRfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycywgY2hhciAqbmFtZSwgaW50IG1heCwKKwkJCXN0cnVjdCBidHJmc193b3JrZXJzICphc3luY19oZWxwZXIpCiB7CiAJd29ya2Vycy0+bnVtX3dvcmtlcnMgPSAwOworCXdvcmtlcnMtPm51bV93b3JrZXJzX3N0YXJ0aW5nID0gMDsKIAlJTklUX0xJU1RfSEVBRCgmd29ya2Vycy0+d29ya2VyX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZ3b3JrZXJzLT5pZGxlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZ3b3JrZXJzLT5vcmRlcl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmd29ya2Vycy0+cHJpb19vcmRlcl9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmd29ya2Vycy0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJndvcmtlcnMtPm9yZGVyX2xvY2spOwogCXdvcmtlcnMtPm1heF93b3JrZXJzID0gbWF4OwogCXdvcmtlcnMtPmlkbGVfdGhyZXNoID0gMzI7CiAJd29ya2Vycy0+bmFtZSA9IG5hbWU7CiAJd29ya2Vycy0+b3JkZXJlZCA9IDA7CisJd29ya2Vycy0+YXRvbWljX3N0YXJ0X3BlbmRpbmcgPSAwOworCXdvcmtlcnMtPmF0b21pY193b3JrZXJfc3RhcnQgPSBhc3luY19oZWxwZXI7CiB9CiAKIC8qCiAgKiBzdGFydHMgbmV3IHdvcmtlciB0aHJlYWRzLiAgVGhpcyBkb2VzIG5vdCBlbmZvcmNlIHRoZSBtYXggd29ya2VyCiAgKiBjb3VudCBpbiBjYXNlIHlvdSBuZWVkIHRvIHRlbXBvcmFyaWx5IGdvIHBhc3QgaXQuCiAgKi8KLWludCBidHJmc19zdGFydF93b3JrZXJzKHN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzLCBpbnQgbnVtX3dvcmtlcnMpCitzdGF0aWMgaW50IF9fYnRyZnNfc3RhcnRfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycywKKwkJCQkgaW50IG51bV93b3JrZXJzKQogewogCXN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXI7CiAJaW50IHJldCA9IDA7CkBAIC0yOTMsNyArNDc4LDkgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJndvcmtlci0+cHJpb19wZW5kaW5nKTsKIAkJSU5JVF9MSVNUX0hFQUQoJndvcmtlci0+d29ya2VyX2xpc3QpOwogCQlzcGluX2xvY2tfaW5pdCgmd29ya2VyLT5sb2NrKTsKKwogCQlhdG9taWNfc2V0KCZ3b3JrZXItPm51bV9wZW5kaW5nLCAwKTsKKwkJYXRvbWljX3NldCgmd29ya2VyLT5yZWZzLCAxKTsKIAkJd29ya2VyLT53b3JrZXJzID0gd29ya2VyczsKIAkJd29ya2VyLT50YXNrID0ga3RocmVhZF9ydW4od29ya2VyX2xvb3AsIHdvcmtlciwKIAkJCQkJICAgImJ0cmZzLSVzLSVkIiwgd29ya2Vycy0+bmFtZSwKQEAgLTMwMywxMSArNDkwLDEyIEBACiAJCQlrZnJlZSh3b3JrZXIpOwogCQkJZ290byBmYWlsOwogCQl9Ci0KIAkJc3Bpbl9sb2NrX2lycSgmd29ya2Vycy0+bG9jayk7CiAJCWxpc3RfYWRkX3RhaWwoJndvcmtlci0+d29ya2VyX2xpc3QsICZ3b3JrZXJzLT5pZGxlX2xpc3QpOwogCQl3b3JrZXItPmlkbGUgPSAxOwogCQl3b3JrZXJzLT5udW1fd29ya2VycysrOworCQl3b3JrZXJzLT5udW1fd29ya2Vyc19zdGFydGluZy0tOworCQlXQVJOX09OKHdvcmtlcnMtPm51bV93b3JrZXJzX3N0YXJ0aW5nIDwgMCk7CiAJCXNwaW5fdW5sb2NrX2lycSgmd29ya2Vycy0+bG9jayk7CiAJfQogCXJldHVybiAwOwpAQCAtMzE2LDYgKzUwNCwxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBidHJmc19zdGFydF93b3JrZXJzKHN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzLCBpbnQgbnVtX3dvcmtlcnMpCit7CisJc3Bpbl9sb2NrX2lycSgmd29ya2Vycy0+bG9jayk7CisJd29ya2Vycy0+bnVtX3dvcmtlcnNfc3RhcnRpbmcgKz0gbnVtX3dvcmtlcnM7CisJc3Bpbl91bmxvY2tfaXJxKCZ3b3JrZXJzLT5sb2NrKTsKKwlyZXR1cm4gX19idHJmc19zdGFydF93b3JrZXJzKHdvcmtlcnMsIG51bV93b3JrZXJzKTsKK30KKwogLyoKICAqIHJ1biB0aHJvdWdoIHRoZSBsaXN0IGFuZCBmaW5kIGEgd29ya2VyIHRocmVhZCB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGxvdAogICogdG8gZG8gcmlnaHQgbm93LiAgVGhpcyBjYW4gcmV0dXJuIG51bGwgaWYgd2UgYXJlbid0IHlldCBhdCB0aGUgdGhyZWFkCkBAIC0zMjUsNyArNTIxLDEwIEBACiB7CiAJc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQgKndvcmtlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OwotCWludCBlbmZvcmNlX21pbiA9IHdvcmtlcnMtPm51bV93b3JrZXJzIDwgd29ya2Vycy0+bWF4X3dvcmtlcnM7CisJaW50IGVuZm9yY2VfbWluOworCisJZW5mb3JjZV9taW4gPSAod29ya2Vycy0+bnVtX3dvcmtlcnMgKyB3b3JrZXJzLT5udW1fd29ya2Vyc19zdGFydGluZykgPAorCQl3b3JrZXJzLT5tYXhfd29ya2VyczsKIAogCS8qCiAJICogaWYgd2UgZmluZCBhbiBpZGxlIHRocmVhZCwgZG9uJ3QgbW92ZSBpdCB0byB0aGUgZW5kIG9mIHRoZQpAQCAtMzUwLDcgKzU0OSw2IEBACiAJICovCiAJbmV4dCA9IHdvcmtlcnMtPndvcmtlcl9saXN0Lm5leHQ7CiAJd29ya2VyID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCwgd29ya2VyX2xpc3QpOwotCWF0b21pY19pbmMoJndvcmtlci0+bnVtX3BlbmRpbmcpOwogCXdvcmtlci0+c2VxdWVuY2UrKzsKIAogCWlmICh3b3JrZXItPnNlcXVlbmNlICUgd29ya2Vycy0+aWRsZV90aHJlc2ggPT0gMCkKQEAgLTM2NywzNSArNTY1LDQ5IEBACiB7CiAJc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQgKndvcmtlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmZhbGxiYWNrOwogCiBhZ2FpbjoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd29ya2Vycy0+bG9jaywgZmxhZ3MpOwogCXdvcmtlciA9IG5leHRfd29ya2VyKHdvcmtlcnMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKIAogCWlmICghd29ya2VyKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7Ci0JCWlmICh3b3JrZXJzLT5udW1fd29ya2VycyA+PSB3b3JrZXJzLT5tYXhfd29ya2VycykgewotCQkJc3RydWN0IGxpc3RfaGVhZCAqZmFsbGJhY2sgPSBOVUxMOwotCQkJLyoKLQkJCSAqIHdlIGhhdmUgZmFpbGVkIHRvIGZpbmQgYW55IHdvcmtlcnMsIGp1c3QKLQkJCSAqIHJldHVybiB0aGUgZm9yY2Ugb25lCi0JCQkgKi8KLQkJCWlmICghbGlzdF9lbXB0eSgmd29ya2Vycy0+d29ya2VyX2xpc3QpKQotCQkJCWZhbGxiYWNrID0gd29ya2Vycy0+d29ya2VyX2xpc3QubmV4dDsKLQkJCWlmICghbGlzdF9lbXB0eSgmd29ya2Vycy0+aWRsZV9saXN0KSkKLQkJCQlmYWxsYmFjayA9IHdvcmtlcnMtPmlkbGVfbGlzdC5uZXh0OwotCQkJQlVHX09OKCFmYWxsYmFjayk7Ci0JCQl3b3JrZXIgPSBsaXN0X2VudHJ5KGZhbGxiYWNrLAotCQkJCSAgc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQsIHdvcmtlcl9saXN0KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHdvcmtlcnMtPm51bV93b3JrZXJzICsgd29ya2Vycy0+bnVtX3dvcmtlcnNfc3RhcnRpbmcgPj0KKwkJICAgIHdvcmtlcnMtPm1heF93b3JrZXJzKSB7CisJCQlnb3RvIGZhbGxiYWNrOworCQl9IGVsc2UgaWYgKHdvcmtlcnMtPmF0b21pY193b3JrZXJfc3RhcnQpIHsKKwkJCXdvcmtlcnMtPmF0b21pY19zdGFydF9wZW5kaW5nID0gMTsKKwkJCWdvdG8gZmFsbGJhY2s7CiAJCX0gZWxzZSB7CisJCQl3b3JrZXJzLT5udW1fd29ya2Vyc19zdGFydGluZysrOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29ya2Vycy0+bG9jaywgZmxhZ3MpOwogCQkJLyogd2UncmUgYmVsb3cgdGhlIGxpbWl0LCBzdGFydCBhbm90aGVyIHdvcmtlciAqLwotCQkJYnRyZnNfc3RhcnRfd29ya2Vycyh3b3JrZXJzLCAxKTsKKwkJCV9fYnRyZnNfc3RhcnRfd29ya2Vycyh3b3JrZXJzLCAxKTsKIAkJCWdvdG8gYWdhaW47CiAJCX0KIAl9CisJZ290byBmb3VuZDsKKworZmFsbGJhY2s6CisJZmFsbGJhY2sgPSBOVUxMOworCS8qCisJICogd2UgaGF2ZSBmYWlsZWQgdG8gZmluZCBhbnkgd29ya2VycywganVzdAorCSAqIHJldHVybiB0aGUgZmlyc3Qgb25lIHdlIGNhbiBmaW5kLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmd29ya2Vycy0+d29ya2VyX2xpc3QpKQorCQlmYWxsYmFjayA9IHdvcmtlcnMtPndvcmtlcl9saXN0Lm5leHQ7CisJaWYgKCFsaXN0X2VtcHR5KCZ3b3JrZXJzLT5pZGxlX2xpc3QpKQorCQlmYWxsYmFjayA9IHdvcmtlcnMtPmlkbGVfbGlzdC5uZXh0OworCUJVR19PTighZmFsbGJhY2spOworCXdvcmtlciA9IGxpc3RfZW50cnkoZmFsbGJhY2ssCisJCSAgc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQsIHdvcmtlcl9saXN0KTsKK2ZvdW5kOgorCS8qCisJICogdGhpcyBtYWtlcyBzdXJlIHRoZSB3b3JrZXIgZG9lc24ndCBleGl0IGJlZm9yZSBpdCBpcyBwbGFjZWQKKwkgKiBvbnRvIGEgYnVzeS9pZGxlIGxpc3QKKwkgKi8KKwlhdG9taWNfaW5jKCZ3b3JrZXItPm51bV9wZW5kaW5nKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHdvcmtlcjsKIH0KIApAQCAtNDI3LDcgKzYzOSw3IEBACiAJCXNwaW5fbG9jaygmd29ya2VyLT53b3JrZXJzLT5sb2NrKTsKIAkJd29ya2VyLT5pZGxlID0gMDsKIAkJbGlzdF9tb3ZlX3RhaWwoJndvcmtlci0+d29ya2VyX2xpc3QsCi0JCQkgICAgICAgJndvcmtlci0+d29ya2Vycy0+d29ya2VyX2xpc3QpOworCQkJICAgICAgJndvcmtlci0+d29ya2Vycy0+d29ya2VyX2xpc3QpOwogCQlzcGluX3VubG9jaygmd29ya2VyLT53b3JrZXJzLT5sb2NrKTsKIAl9CiAJaWYgKCF3b3JrZXItPndvcmtpbmcpIHsKQEAgLTQzNSw5ICs2NDcsOSBAQAogCQl3b3JrZXItPndvcmtpbmcgPSAxOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlci0+bG9jaywgZmxhZ3MpOwogCWlmICh3YWtlKQogCQl3YWtlX3VwX3Byb2Nlc3Mod29ya2VyLT50YXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXItPmxvY2ssIGZsYWdzKTsKIG91dDoKIAogCXJldHVybiAwOwpAQCAtNDYzLDE0ICs2NzUsMTggQEAKIAogCXdvcmtlciA9IGZpbmRfd29ya2VyKHdvcmtlcnMpOwogCWlmICh3b3JrZXJzLT5vcmRlcmVkKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJCS8qCisJCSAqIHlvdSdyZSBub3QgYWxsb3dlZCB0byBkbyBvcmRlcmVkIHF1ZXVlcyBmcm9tIGFuCisJCSAqIGludGVycnVwdCBoYW5kbGVyCisJCSAqLworCQlzcGluX2xvY2soJndvcmtlcnMtPm9yZGVyX2xvY2spOwogCQlpZiAodGVzdF9iaXQoV09SS19ISUdIX1BSSU9fQklULCAmd29yay0+ZmxhZ3MpKSB7CiAJCQlsaXN0X2FkZF90YWlsKCZ3b3JrLT5vcmRlcl9saXN0LAogCQkJCSAgICAgICZ3b3JrZXJzLT5wcmlvX29yZGVyX2xpc3QpOwogCQl9IGVsc2UgewogCQkJbGlzdF9hZGRfdGFpbCgmd29yay0+b3JkZXJfbGlzdCwgJndvcmtlcnMtPm9yZGVyX2xpc3QpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2soJndvcmtlcnMtPm9yZGVyX2xvY2spOwogCX0gZWxzZSB7CiAJCUlOSVRfTElTVF9IRUFEKCZ3b3JrLT5vcmRlcl9saXN0KTsKIAl9CkBAIC00ODEsNyArNjk3LDYgQEAKIAkJbGlzdF9hZGRfdGFpbCgmd29yay0+bGlzdCwgJndvcmtlci0+cHJpb19wZW5kaW5nKTsKIAllbHNlCiAJCWxpc3RfYWRkX3RhaWwoJndvcmstPmxpc3QsICZ3b3JrZXItPnBlbmRpbmcpOwotCWF0b21pY19pbmMoJndvcmtlci0+bnVtX3BlbmRpbmcpOwogCWNoZWNrX2J1c3lfd29ya2VyKHdvcmtlcik7CiAKIAkvKgpAQCAtNDkyLDEwICs3MDcsMTAgQEAKIAkJd2FrZSA9IDE7CiAJd29ya2VyLT53b3JraW5nID0gMTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlci0+bG9jaywgZmxhZ3MpOwotCiAJaWYgKHdha2UpCiAJCXdha2VfdXBfcHJvY2Vzcyh3b3JrZXItPnRhc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlci0+bG9jaywgZmxhZ3MpOworCiBvdXQ6CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9hc3luYy10aHJlYWQuaCBiL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5oCmluZGV4IDFiNTExYzEuLjUwNzc3NDYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5oCisrKyBiL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5oCkBAIC02NCw2ICs2NCw4IEBACiAJLyogY3VycmVudCBudW1iZXIgb2YgcnVubmluZyB3b3JrZXJzICovCiAJaW50IG51bV93b3JrZXJzOwogCisJaW50IG51bV93b3JrZXJzX3N0YXJ0aW5nOworCiAJLyogbWF4IG51bWJlciBvZiB3b3JrZXJzIGFsbG93ZWQuICBjaGFuZ2VkIGJ5IGJ0cmZzX3N0YXJ0X3dvcmtlcnMgKi8KIAlpbnQgbWF4X3dvcmtlcnM7CiAKQEAgLTczLDYgKzc1LDE2IEBACiAJLyogZm9yY2UgY29tcGxldGlvbnMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBxdWV1ZWQgKi8KIAlpbnQgb3JkZXJlZDsKIAorCS8qIG1vcmUgd29ya2VycyByZXF1aXJlZCwgYnV0IGluIGFuIGludGVycnVwdCBoYW5kbGVyICovCisJaW50IGF0b21pY19zdGFydF9wZW5kaW5nOworCisJLyoKKwkgKiBhcmUgd2UgYWxsb3dlZCB0byBzbGVlcCB3aGlsZSBzdGFydGluZyB3b3JrZXJzIG9yIGFyZSB3ZSByZXF1aXJlZAorCSAqIHRvIHN0YXJ0IHRoZW0gYXQgYSBsYXRlciB0aW1lPyAgSWYgd2UgY2FuJ3Qgc2xlZXAsIHRoaXMgaW5kaWNhdGVzCisJICogd2hpY2ggcXVldWUgd2UgbmVlZCB0byB1c2UgdG8gc2NoZWR1bGUgdGhyZWFkIGNyZWF0aW9uLgorCSAqLworCXN0cnVjdCBidHJmc193b3JrZXJzICphdG9taWNfd29ya2VyX3N0YXJ0OworCiAJLyogbGlzdCB3aXRoIGFsbCB0aGUgd29yayB0aHJlYWRzLiAgVGhlIHdvcmtlcnMgb24gdGhlIGlkbGUgdGhyZWFkCiAJICogbWF5IGJlIGFjdGl2ZWx5IHNlcnZpY2luZyBqb2JzLCBidXQgdGhleSBoYXZlbid0IHlldCBoaXQgdGhlCiAJICogaWRsZSB0aHJlc2ggbGltaXQgYWJvdmUuCkBAIC05MCw2ICsxMDIsOSBAQAogCS8qIGxvY2sgZm9yIGZpbmRpbmcgdGhlIG5leHQgd29ya2VyIHRocmVhZCB0byBxdWV1ZSBvbiAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAorCS8qIGxvY2sgZm9yIHRoZSBvcmRlcmVkIGxpc3RzICovCisJc3BpbmxvY2tfdCBvcmRlcl9sb2NrOworCiAJLyogZXh0cmEgbmFtZSBmb3IgdGhpcyB3b3JrZXIsIHVzZWQgZm9yIGN1cnJlbnQtPm5hbWUgKi8KIAljaGFyICpuYW1lOwogfTsKQEAgLTk3LDcgKzExMiw4IEBACiBpbnQgYnRyZnNfcXVldWVfd29ya2VyKHN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzLCBzdHJ1Y3QgYnRyZnNfd29yayAqd29yayk7CiBpbnQgYnRyZnNfc3RhcnRfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycywgaW50IG51bV93b3JrZXJzKTsKIGludCBidHJmc19zdG9wX3dvcmtlcnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMpOwotdm9pZCBidHJmc19pbml0X3dvcmtlcnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsIGNoYXIgKm5hbWUsIGludCBtYXgpOwordm9pZCBidHJmc19pbml0X3dvcmtlcnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsIGNoYXIgKm5hbWUsIGludCBtYXgsCisJCQlzdHJ1Y3QgYnRyZnNfd29ya2VycyAqYXN5bmNfc3RhcnRlcik7CiBpbnQgYnRyZnNfcmVxdWV1ZV93b3JrKHN0cnVjdCBidHJmc193b3JrICp3b3JrKTsKIHZvaWQgYnRyZnNfc2V0X3dvcmtfaGlnaF9wcmlvKHN0cnVjdCBidHJmc193b3JrICp3b3JrKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYnRyZnNfaW5vZGUuaCBiL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmgKaW5kZXggZWExZWEwYS4uZjY3ODNhNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvYnRyZnNfaW5vZGUuaAorKysgYi9mcy9idHJmcy9idHJmc19pbm9kZS5oCkBAIC04Niw2ICs4NiwxMiBAQAogCSAqIHRyYW5zaWQgb2YgdGhlIHRyYW5zX2hhbmRsZSB0aGF0IGxhc3QgbW9kaWZpZWQgdGhpcyBpbm9kZQogCSAqLwogCXU2NCBsYXN0X3RyYW5zOworCisJLyoKKwkgKiBsb2cgdHJhbnNpZCB3aGVuIHRoaXMgaW5vZGUgd2FzIGxhc3QgbW9kaWZpZWQKKwkgKi8KKwl1NjQgbGFzdF9zdWJfdHJhbnM7CisKIAkvKgogCSAqIHRyYW5zaWQgdGhhdCBsYXN0IGxvZ2dlZCB0aGlzIGlub2RlCiAJICovCkBAIC0xMjgsNiArMTM0LDE2IEBACiAJdTY0IGxhc3RfdW5saW5rX3RyYW5zOwogCiAJLyoKKwkgKiBDb3VudGVycyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgZXh0ZW50IGl0ZW0ncyB3ZSBtYXkgdXNlIGR1ZQorCSAqIHRvIGRlbGFsbG9jIGFuZCBzdWNoLiAgb3V0c3RhbmRpbmdfZXh0ZW50cyBpcyB0aGUgbnVtYmVyIG9mIGV4dGVudAorCSAqIGl0ZW1zIHdlIHRoaW5rIHdlJ2xsIGVuZCB1cCB1c2luZywgYW5kIHJlc2VydmVkX2V4dGVudHMgaXMgdGhlIG51bWJlcgorCSAqIG9mIGV4dGVudCBpdGVtcyB3ZSd2ZSByZXNlcnZlZCBtZXRhZGF0YSBmb3IuCisJICovCisJc3BpbmxvY2tfdCBhY2NvdW50aW5nX2xvY2s7CisJaW50IHJlc2VydmVkX2V4dGVudHM7CisJaW50IG91dHN0YW5kaW5nX2V4dGVudHM7CisKKwkvKgogCSAqIG9yZGVyZWRfZGF0YV9jbG9zZSBpcyBzZXQgYnkgdHJ1bmNhdGUgd2hlbiBhIGZpbGUgdGhhdCB1c2VkCiAJICogdG8gaGF2ZSBnb29kIGRhdGEgaGFzIGJlZW4gdHJ1bmNhdGVkIHRvIHplcm8uICBXaGVuIGl0IGlzIHNldAogCSAqIHRoZSBidHJmcyBmaWxlIHJlbGVhc2UgY2FsbCB3aWxsIGFkZCB0aGlzIGlub2RlIHRvIHRoZQpAQCAtMTM4LDYgKzE1NCw3IEBACiAJICogb2YgdGhlc2UuCiAJICovCiAJdW5zaWduZWQgb3JkZXJlZF9kYXRhX2Nsb3NlOjE7CisJdW5zaWduZWQgZHVtbXlfaW5vZGU6MTsKIAogCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CiB9OwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY29tcHJlc3Npb24uYyBiL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMKaW5kZXggOWQ4YmE0ZC4uYTExYTMyMCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY29tcHJlc3Npb24uYworKysgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5jCkBAIC01MDYsMTAgKzUwNiwxMCBAQAogCQkgKi8KIAkJc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChwYWdlKTsKIAkJbG9ja19leHRlbnQodHJlZSwgbGFzdF9vZmZzZXQsIGVuZCwgR0ZQX05PRlMpOwotCQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCQlyZWFkX2xvY2soJmVtX3RyZWUtPmxvY2spOwogCQllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBsYXN0X29mZnNldCwKIAkJCQkJICAgUEFHRV9DQUNIRV9TSVpFKTsKLQkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCQlyZWFkX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAKIAkJaWYgKCFlbSB8fCBsYXN0X29mZnNldCA8IGVtLT5zdGFydCB8fAogCQkgICAgKGxhc3Rfb2Zmc2V0ICsgUEFHRV9DQUNIRV9TSVpFID4gZXh0ZW50X21hcF9lbmQoZW0pKSB8fApAQCAtNTkzLDExICs1OTMsMTEgQEAKIAllbV90cmVlID0gJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZTsKIAogCS8qIHdlIG5lZWQgdGhlIGFjdHVhbCBzdGFydGluZyBvZmZzZXQgb2YgdGhpcyBleHRlbnQgaW4gdGhlIGZpbGUgKi8KLQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCXJlYWRfbG9jaygmZW1fdHJlZS0+bG9jayk7CiAJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwKIAkJCQkgICBwYWdlX29mZnNldChiaW8tPmJpX2lvX3ZlYy0+YnZfcGFnZSksCiAJCQkJICAgUEFHRV9DQUNIRV9TSVpFKTsKLQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJcmVhZF91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCiAJY29tcHJlc3NlZF9sZW4gPSBlbS0+YmxvY2tfbGVuOwogCWNiID0ga21hbGxvYyhjb21wcmVzc2VkX2Jpb19zaXplKHJvb3QsIGNvbXByZXNzZWRfbGVuKSwgR0ZQX05PRlMpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuYyBiL2ZzL2J0cmZzL2N0cmVlLmMKaW5kZXggM2ZkY2MwNS4uZWM5NmYzYSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY3RyZWUuYworKysgYi9mcy9idHJmcy9jdHJlZS5jCkBAIC0yODUzLDYgKzI4NTMsMTIgQEAKIAlpbnQgc3BsaXQ7CiAJaW50IG51bV9kb3VibGVzID0gMDsKIAorCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisJaWYgKGV4dGVuZCAmJiBkYXRhX3NpemUgKyBidHJmc19pdGVtX3NpemVfbnIobCwgc2xvdCkgKworCSAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pID4gQlRSRlNfTEVBRl9EQVRBX1NJWkUocm9vdCkpCisJCXJldHVybiAtRU9WRVJGTE9XOworCiAJLyogZmlyc3QgdHJ5IHRvIG1ha2Ugc29tZSByb29tIGJ5IHB1c2hpbmcgbGVmdCBhbmQgcmlnaHQgKi8KIAlpZiAoZGF0YV9zaXplICYmIGluc19rZXktPnR5cGUgIT0gQlRSRlNfRElSX0lURU1fS0VZKSB7CiAJCXdyZXQgPSBwdXNoX2xlYWZfcmlnaHQodHJhbnMsIHJvb3QsIHBhdGgsIGRhdGFfc2l6ZSwgMCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9jdHJlZS5oIGIvZnMvYnRyZnMvY3RyZWUuaAppbmRleCA4Mzc0MzVjLi40NDRiM2U5IDEwMDY0NAotLS0gYS9mcy9idHJmcy9jdHJlZS5oCisrKyBiL2ZzL2J0cmZzL2N0cmVlLmgKQEAgLTExNCw2ICsxMTQsMTAgQEAKICAqLwogI2RlZmluZSBCVFJGU19ERVZfSVRFTVNfT0JKRUNUSUQgMVVMTAogCisjZGVmaW5lIEJUUkZTX0JUUkVFX0lOT0RFX09CSkVDVElEIDEKKworI2RlZmluZSBCVFJGU19FTVBUWV9TVUJWT0xfRElSX09CSkVDVElEIDIKKwogLyoKICAqIHdlIGNhbiBhY3R1YWxseSBzdG9yZSBtdWNoIGJpZ2dlciBuYW1lcywgYnV0IGxldHMgbm90IGNvbmZ1c2UgdGhlIHJlc3QKICAqIG9mIGxpbnV4CkBAIC02NzAsMjEgKzY3NCwyOSBAQAogCXU2NCBieXRlc19yZXNlcnZlZDsJLyogdG90YWwgYnl0ZXMgdGhlIGFsbG9jYXRvciBoYXMgcmVzZXJ2ZWQgZm9yCiAJCQkJICAgY3VycmVudCBhbGxvY2F0aW9ucyAqLwogCXU2NCBieXRlc19yZWFkb25seTsJLyogdG90YWwgYnl0ZXMgdGhhdCBhcmUgcmVhZCBvbmx5ICovCi0KLQkvKiBkZWxhbGxvYyBhY2NvdW50aW5nICovCi0JdTY0IGJ5dGVzX2RlbGFsbG9jOwkvKiBudW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgZm9yIGFsbG9jYXRpb24sCi0JCQkJICAgdGhpcyBzcGFjZSBpcyBub3QgbmVjZXNzYXJpbHkgcmVzZXJ2ZWQgeWV0Ci0JCQkJICAgYnkgdGhlIGFsbG9jYXRvciAqLworCXU2NCBieXRlc19zdXBlcjsJLyogdG90YWwgYnl0ZXMgcmVzZXJ2ZWQgZm9yIHRoZSBzdXBlciBibG9ja3MgKi8KKwl1NjQgYnl0ZXNfcm9vdDsJCS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGNvbW1pdCBhCisJCQkJICAgdHJhbnNhY3Rpb24gKi8KIAl1NjQgYnl0ZXNfbWF5X3VzZTsJLyogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5IGJlIHVzZWQgZm9yCi0JCQkJICAgZGVsYWxsb2MgKi8KKwkJCQkgICBkZWxhbGxvYy9hbGxvY2F0aW9ucyAqLworCXU2NCBieXRlc19kZWxhbGxvYzsJLyogbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSByZXNlcnZlZCBmb3IKKwkJCQkgICBkZWxheWVkIGFsbG9jYXRpb24gKi8KIAogCWludCBmdWxsOwkJLyogaW5kaWNhdGVzIHRoYXQgd2UgY2Fubm90IGFsbG9jYXRlIGFueSBtb3JlCiAJCQkJICAgY2h1bmtzIGZvciB0aGlzIHNwYWNlICovCiAJaW50IGZvcmNlX2FsbG9jOwkvKiBzZXQgaWYgd2UgbmVlZCB0byBmb3JjZSBhIGNodW5rIGFsbG9jIGZvcgogCQkJCSAgIHRoaXMgc3BhY2UgKi8KKwlpbnQgZm9yY2VfZGVsYWxsb2M7CS8qIG1ha2UgcGVvcGxlIHN0YXJ0IGRvaW5nIGZpbGVtYXBfZmx1c2ggdW50aWwKKwkJCQkgICB3ZSdyZSB1bmRlciBhIHRocmVzaG9sZCAqLwogCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCisJLyogZm9yIGNvbnRyb2xsaW5nIGhvdyB3ZSBmcmVlIHVwIHNwYWNlIGZvciBhbGxvY2F0aW9ucyAqLworCXdhaXRfcXVldWVfaGVhZF90IGFsbG9jYXRlX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZmx1c2hfd2FpdDsKKwlpbnQgYWxsb2NhdGluZ19jaHVuazsKKwlpbnQgZmx1c2hpbmc7CisKIAkvKiBmb3IgYmxvY2sgZ3JvdXBzIGluIG91ciBzYW1lIHR5cGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGJsb2NrX2dyb3VwczsKIAlzcGlubG9ja190IGxvY2s7CkBAIC03MjYsNiArNzM4LDE1IEBACiAJQlRSRlNfQ0FDSEVfRklOSVNIRUQJPSAyLAogfTsKIAorc3RydWN0IGJ0cmZzX2NhY2hpbmdfY29udHJvbCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBtdXRleCBtdXRleDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXA7CisJdTY0IHByb2dyZXNzOworCWF0b21pY190IGNvdW50OworfTsKKwogc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlIHsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfaXRlbSBpdGVtOwpAQCAtNzMzLDYgKzc1NCw3IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCXU2NCBwaW5uZWQ7CiAJdTY0IHJlc2VydmVkOworCXU2NCBieXRlc19zdXBlcjsKIAl1NjQgZmxhZ3M7CiAJdTY0IHNlY3RvcnNpemU7CiAJaW50IGV4dGVudHNfdGhyZXNoOwpAQCAtNzQyLDggKzc2NCw5IEBACiAJaW50IGRpcnR5OwogCiAJLyogY2FjaGUgdHJhY2tpbmcgc3R1ZmYgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBjYWNoaW5nX3E7CiAJaW50IGNhY2hlZDsKKwlzdHJ1Y3QgYnRyZnNfY2FjaGluZ19jb250cm9sICpjYWNoaW5nX2N0bDsKKwl1NjQgbGFzdF9ieXRlX3RvX3VucGluOwogCiAJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87CiAKQEAgLTc4MiwxMyArODA1LDE2IEBACiAKIAkvKiB0aGUgbG9nIHJvb3QgdHJlZSBpcyBhIGRpcmVjdG9yeSBvZiBhbGwgdGhlIG90aGVyIGxvZyByb290cyAqLwogCXN0cnVjdCBidHJmc19yb290ICpsb2dfcm9vdF90cmVlOworCisJc3BpbmxvY2tfdCBmc19yb290c19yYWRpeF9sb2NrOwogCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgZnNfcm9vdHNfcmFkaXg7CiAKIAkvKiBibG9jayBncm91cCBjYWNoZSBzdHVmZiAqLwogCXNwaW5sb2NrX3QgYmxvY2tfZ3JvdXBfY2FjaGVfbG9jazsKIAlzdHJ1Y3QgcmJfcm9vdCBibG9ja19ncm91cF9jYWNoZV90cmVlOwogCi0Jc3RydWN0IGV4dGVudF9pb190cmVlIHBpbm5lZF9leHRlbnRzOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSBmcmVlZF9leHRlbnRzWzJdOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqcGlubmVkX2V4dGVudHM7CiAKIAkvKiBsb2dpY2FsLT5waHlzaWNhbCBleHRlbnQgbWFwcGluZyAqLwogCXN0cnVjdCBidHJmc19tYXBwaW5nX3RyZWUgbWFwcGluZ190cmVlOwpAQCAtODIyLDExICs4NDgsNyBAQAogCXN0cnVjdCBtdXRleCB0cmFuc2FjdGlvbl9rdGhyZWFkX211dGV4OwogCXN0cnVjdCBtdXRleCBjbGVhbmVyX211dGV4OwogCXN0cnVjdCBtdXRleCBjaHVua19tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggZHJvcF9tdXRleDsKIAlzdHJ1Y3QgbXV0ZXggdm9sdW1lX211dGV4OwotCXN0cnVjdCBtdXRleCB0cmVlX3JlbG9jX211dGV4OwotCXN0cnVjdCByd19zZW1hcGhvcmUgZXh0ZW50X2NvbW1pdF9zZW07Ci0KIAkvKgogCSAqIHRoaXMgcHJvdGVjdHMgdGhlIG9yZGVyZWQgb3BlcmF0aW9ucyBsaXN0IG9ubHkgd2hpbGUgd2UgYXJlCiAJICogcHJvY2Vzc2luZyBhbGwgb2YgdGhlIGVudHJpZXMgb24gaXQuICBUaGlzIHdheSB3ZSBtYWtlCkBAIC04MzUsMTAgKzg1NywxNiBAQAogCSAqIGJlZm9yZSBqdW1waW5nIGludG8gdGhlIG1haW4gY29tbWl0LgogCSAqLwogCXN0cnVjdCBtdXRleCBvcmRlcmVkX29wZXJhdGlvbnNfbXV0ZXg7CisJc3RydWN0IHJ3X3NlbWFwaG9yZSBleHRlbnRfY29tbWl0X3NlbTsKKworCXN0cnVjdCByd19zZW1hcGhvcmUgc3Vidm9sX3NlbTsKKworCXN0cnVjdCBzcmN1X3N0cnVjdCBzdWJ2b2xfc3JjdTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhhc2hlcnM7CiAJc3RydWN0IGxpc3RfaGVhZCBkZWFkX3Jvb3RzOworCXN0cnVjdCBsaXN0X2hlYWQgY2FjaGluZ19ibG9ja19ncm91cHM7CiAKIAlhdG9taWNfdCBucl9hc3luY19zdWJtaXRzOwogCWF0b21pY190IGFzeW5jX3N1Ym1pdF9kcmFpbmluZzsKQEAgLTg4Miw2ICs5MTAsNyBAQAogCSAqIEEgdGhpcmQgcG9vbCBkb2VzIHN1Ym1pdF9iaW8gdG8gYXZvaWQgZGVhZGxvY2tpbmcgd2l0aCB0aGUgb3RoZXIKIAkgKiB0d28KIAkgKi8KKwlzdHJ1Y3QgYnRyZnNfd29ya2VycyBnZW5lcmljX3dvcmtlcjsKIAlzdHJ1Y3QgYnRyZnNfd29ya2VycyB3b3JrZXJzOwogCXN0cnVjdCBidHJmc193b3JrZXJzIGRlbGFsbG9jX3dvcmtlcnM7CiAJc3RydWN0IGJ0cmZzX3dvcmtlcnMgZW5kaW9fd29ya2VyczsKQEAgLTg4OSw2ICs5MTgsNyBAQAogCXN0cnVjdCBidHJmc193b3JrZXJzIGVuZGlvX21ldGFfd3JpdGVfd29ya2VyczsKIAlzdHJ1Y3QgYnRyZnNfd29ya2VycyBlbmRpb193cml0ZV93b3JrZXJzOwogCXN0cnVjdCBidHJmc193b3JrZXJzIHN1Ym1pdF93b3JrZXJzOworCXN0cnVjdCBidHJmc193b3JrZXJzIGVub3NwY193b3JrZXJzOwogCS8qCiAJICogZml4dXAgd29ya2VycyB0YWtlIGRpcnR5IHBhZ2VzIHRoYXQgZGlkbid0IHByb3Blcmx5IGdvIHRocm91Z2gKIAkgKiB0aGUgY293IG1lY2hhbmlzbSBhbmQgbWFrZSB0aGVtIHNhZmUgdG8gd3JpdGUuICBJdCBoYXBwZW5zCkBAIC05NzksNyArMTAwOSwxMCBAQAogCWF0b21pY190IGxvZ193cml0ZXJzOwogCWF0b21pY190IGxvZ19jb21taXRbMl07CiAJdW5zaWduZWQgbG9uZyBsb2dfdHJhbnNpZDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfbG9nX2NvbW1pdDsKIAl1bnNpZ25lZCBsb25nIGxvZ19iYXRjaDsKKwlwaWRfdCBsb2dfc3RhcnRfcGlkOworCWJvb2wgbG9nX211bHRpcGxlX3BpZHM7CiAKIAl1NjQgb2JqZWN0aWQ7CiAJdTY0IGxhc3RfdHJhbnM7CkBAIC05OTYsMTAgKzEwMjksMTIgQEAKIAl1MzIgc3RyaXBlc2l6ZTsKIAogCXUzMiB0eXBlOwotCXU2NCBoaWdoZXN0X2lub2RlOwotCXU2NCBsYXN0X2lub2RlX2FsbG9jOworCisJdTY0IGhpZ2hlc3Rfb2JqZWN0aWQ7CiAJaW50IHJlZl9jb3dzOwogCWludCB0cmFja19kaXJ0eTsKKwlpbnQgaW5fcmFkaXg7CisKIAl1NjQgZGVmcmFnX3RyYW5zX3N0YXJ0OwogCXN0cnVjdCBidHJmc19rZXkgZGVmcmFnX3Byb2dyZXNzOwogCXN0cnVjdCBidHJmc19rZXkgZGVmcmFnX21heDsKQEAgLTExMTgsNiArMTE1Myw3IEBACiAjZGVmaW5lIEJUUkZTX01PVU5UX0ZMVVNIT05DT01NSVQgICAgICAgKDEgPDwgNykKICNkZWZpbmUgQlRSRlNfTU9VTlRfU1NEX1NQUkVBRAkJKDEgPDwgOCkKICNkZWZpbmUgQlRSRlNfTU9VTlRfTk9TU0QJCSgxIDw8IDkpCisjZGVmaW5lIEJUUkZTX01PVU5UX0RJU0NBUkQJCSgxIDw8IDEwKQogCiAjZGVmaW5lIGJ0cmZzX2NsZWFyX29wdChvLCBvcHQpCQkoKG8pICY9IH5CVFJGU19NT1VOVF8jI29wdCkKICNkZWZpbmUgYnRyZnNfc2V0X29wdChvLCBvcHQpCQkoKG8pIHw9IEJUUkZTX01PVU5UXyMjb3B0KQpAQCAtMTkyMCw4ICsxOTU2LDggQEAKIGludCBidHJmc19ydW5fZGVsYXllZF9yZWZzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogaW50IGJ0cmZzX2xvb2t1cF9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBzdGFydCwgdTY0IGxlbik7Ci1pbnQgYnRyZnNfdXBkYXRlX3Bpbm5lZF9leHRlbnRzKHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJCXU2NCBieXRlbnIsIHU2NCBudW0sIGludCBwaW4pOworaW50IGJ0cmZzX3Bpbl9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgICAgdTY0IGJ5dGVuciwgdTY0IG51bSwgaW50IHJlc2VydmVkKTsKIGludCBidHJmc19kcm9wX2xlYWZfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmKTsKIGludCBidHJmc19jcm9zc19yZWZfZXhpc3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0xOTcxLDkgKzIwMDcsMTAgQEAKIAkJICAgICAgdTY0IHJvb3Rfb2JqZWN0aWQsIHU2NCBvd25lciwgdTY0IG9mZnNldCk7CiAKIGludCBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHN0YXJ0LCB1NjQgbGVuKTsKK2ludCBidHJmc19wcmVwYXJlX2V4dGVudF9jb21taXQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogaW50IGJ0cmZzX2ZpbmlzaF9leHRlbnRfY29tbWl0KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJICAgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdW5waW4pOworCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKIGludCBidHJmc19pbmNfZXh0ZW50X3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLCB1NjQgcGFyZW50LApAQCAtMTk4NCw2ICsyMDIxLDcgQEAKIGludCBidHJmc19leHRlbnRfcmVhZG9ubHkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIpOwogaW50IGJ0cmZzX2ZyZWVfYmxvY2tfZ3JvdXBzKHN0cnVjdCBidHJmc19mc19pbmZvICppbmZvKTsKIGludCBidHJmc19yZWFkX2Jsb2NrX2dyb3VwcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgYnRyZnNfY2FuX3JlbG9jYXRlKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZW5yKTsKIGludCBidHJmc19tYWtlX2Jsb2NrX2dyb3VwKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlc191c2VkLAogCQkJICAgdTY0IHR5cGUsIHU2NCBjaHVua19vYmplY3RpZCwgdTY0IGNodW5rX29mZnNldCwKQEAgLTE5OTcsNyArMjAzNSwxMiBAQAogdm9pZCBidHJmc19zZXRfaW5vZGVfc3BhY2VfaW5mbyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppb25kZSk7CiB2b2lkIGJ0cmZzX2NsZWFyX3NwYWNlX2luZm9fZnVsbChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyk7CiAKLWludCBidHJmc19jaGVja19tZXRhZGF0YV9mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19yZXNlcnZlX21ldGFkYXRhX3NwYWNlKHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgbnVtX2l0ZW1zKTsKK2ludCBidHJmc191bnJlc2VydmVfbWV0YWRhdGFfc3BhY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGludCBudW1faXRlbXMpOworaW50IGJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9mb3JfZGVsYWxsb2Moc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwgaW50IG51bV9pdGVtcyk7CitpbnQgYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9mb3JfZGVsYWxsb2Moc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBudW1faXRlbXMpOwogaW50IGJ0cmZzX2NoZWNrX2RhdGFfZnJlZV9zcGFjZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQl1NjQgYnl0ZXMpOwogdm9pZCBidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCkBAIC0yMDA2LDcgKzIwNDksNiBAQAogCQkJCSB1NjQgYnl0ZXMpOwogdm9pZCBidHJmc19kZWxhbGxvY19mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICAgdTY0IGJ5dGVzKTsKLXZvaWQgYnRyZnNfZnJlZV9waW5uZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyk7CiAvKiBjdHJlZS5jICovCiBpbnQgYnRyZnNfYmluX3NlYXJjaChzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHN0cnVjdCBidHJmc19rZXkgKmtleSwKIAkJICAgICBpbnQgbGV2ZWwsIGludCAqc2xvdCk7CkBAIC0yMTAwLDEyICsyMTQyLDE1IEBACiAJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcGFyZW50KTsKIC8qIHJvb3QtaXRlbS5jICovCiBpbnQgYnRyZnNfZmluZF9yb290X3JlZihzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAotCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKLQkJICAgdTY0IHJvb3RfaWQsIHU2NCByZWZfaWQpOworCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQl1NjQgcm9vdF9pZCwgdTY0IHJlZl9pZCk7CiBpbnQgYnRyZnNfYWRkX3Jvb3RfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCwKLQkJICAgICAgIHU2NCByb290X2lkLCB1OCB0eXBlLCB1NjQgcmVmX2lkLAotCQkgICAgICAgdTY0IGRpcmlkLCB1NjQgc2VxdWVuY2UsCisJCSAgICAgICB1NjQgcm9vdF9pZCwgdTY0IHJlZl9pZCwgdTY0IGRpcmlkLCB1NjQgc2VxdWVuY2UsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4pOworaW50IGJ0cmZzX2RlbF9yb290X3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QsCisJCSAgICAgICB1NjQgcm9vdF9pZCwgdTY0IHJlZl9pZCwgdTY0IGRpcmlkLCB1NjQgKnNlcXVlbmNlLAogCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKTsKIGludCBidHJmc19kZWxfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCSAgIHN0cnVjdCBidHJmc19rZXkgKmtleSk7CkBAIC0yMTIwLDYgKzIxNjUsNyBAQAogaW50IGJ0cmZzX3NlYXJjaF9yb290KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgc2VhcmNoX3N0YXJ0LAogCQkgICAgICB1NjQgKmZvdW5kX29iamVjdGlkKTsKIGludCBidHJmc19maW5kX2RlYWRfcm9vdHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBvYmplY3RpZCk7CitpbnQgYnRyZnNfZmluZF9vcnBoYW5fcm9vdHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCk7CiBpbnQgYnRyZnNfc2V0X3Jvb3Rfbm9kZShzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICppdGVtLAogCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGUpOwogLyogZGlyLWl0ZW0uYyAqLwpAQCAtMjEzOCw2ICsyMTg0LDEwIEBACiAJCQkgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHU2NCBkaXIsCiAJCQkgICAgdTY0IG9iamVjdGlkLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sCiAJCQkgICAgaW50IG1vZCk7CitzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKgorYnRyZnNfc2VhcmNoX2Rpcl9pbmRleF9pdGVtKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCB1NjQgZGlyaWQsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKTsKIHN0cnVjdCBidHJmc19kaXJfaXRlbSAqYnRyZnNfbWF0Y2hfZGlyX2l0ZW1fbmFtZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAogCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKTsKQEAgLTIxNjAsNiArMjIxMCw3IEBACiAJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2Zmc2V0KTsKIGludCBidHJmc19kZWxfb3JwaGFuX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2Zmc2V0KTsKK2ludCBidHJmc19maW5kX29ycGhhbl9pdGVtKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2Zmc2V0KTsKIAogLyogaW5vZGUtbWFwLmMgKi8KIGludCBidHJmc19maW5kX2ZyZWVfb2JqZWN0aWQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0yMjMyLDYgKzIyODMsMTAgQEAKIGludCBidHJmc19hZGRfbGluayhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJICAgc3RydWN0IGlub2RlICpwYXJlbnRfaW5vZGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwgaW50IGFkZF9iYWNrcmVmLCB1NjQgaW5kZXgpOworaW50IGJ0cmZzX3VubGlua19zdWJ2b2woc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCXN0cnVjdCBpbm9kZSAqZGlyLCB1NjQgb2JqZWN0aWQsCisJCQljb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4pOwogaW50IGJ0cmZzX3RydW5jYXRlX2lub2RlX2l0ZW1zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBuZXdfc2l6ZSwKQEAgLTIyNDIsNyArMjI5Nyw3IEBACiBpbnQgYnRyZnNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiBpbnQgYnRyZnNfY3JlYXRlX3N1YnZvbF9yb290KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqbmV3X3Jvb3QsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290LAogCQkJICAgICB1NjQgbmV3X2RpcmlkLCB1NjQgYWxsb2NfaGludCk7CiBpbnQgYnRyZnNfbWVyZ2VfYmlvX2hvb2soc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJIHNpemVfdCBzaXplLCBzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKTsKQEAgLTIyNTgsNiArMjMxMyw3IEBACiB2b2lkIGJ0cmZzX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogc3RydWN0IGlub2RlICpidHJmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHZvaWQgYnRyZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgYnRyZnNfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBidHJmc19pbml0X2NhY2hlcCh2b2lkKTsKIHZvaWQgYnRyZnNfZGVzdHJveV9jYWNoZXAodm9pZCk7CiBsb25nIGJ0cmZzX2lvY3RsX3RyYW5zX2VuZChzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0yMjc1LDYgKzIzMzEsOCBAQAogaW50IGJ0cmZzX29ycGhhbl9kZWwoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBidHJmc19vcnBoYW5fY2xlYW51cChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CiBpbnQgYnRyZnNfY29udF9leHBhbmQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpOworaW50IGJ0cmZzX2ludmFsaWRhdGVfaW5vZGVzKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYnRyZnNfZGVudHJ5X29wZXJhdGlvbnM7CiAKIC8qIGlvY3RsLmMgKi8KIGxvbmcgYnRyZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKQEAgLTIyODYsMTEgKzIzNDQsMTEgQEAKIGludCBidHJmc19kcm9wX2V4dGVudF9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCQkgICAgaW50IHNraXBfcGlubmVkKTsKIGludCBidHJmc19jaGVja19maWxlKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0cmZzX2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0cmZzX2ZpbGVfb3BlcmF0aW9uczsKIGludCBidHJmc19kcm9wX2V4dGVudHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJICAgICAgIHU2NCBzdGFydCwgdTY0IGVuZCwgdTY0IGxvY2tlZF9lbmQsCi0JCSAgICAgICB1NjQgaW5saW5lX2xpbWl0LCB1NjQgKmhpbnRfYmxvY2spOworCQkgICAgICAgdTY0IGlubGluZV9saW1pdCwgdTY0ICpoaW50X2Jsb2NrLCBpbnQgZHJvcF9jYWNoZSk7CiBpbnQgYnRyZnNfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKQEAgLTIzMTcsNyArMjM3NSw3IEBACiBpbnQgYnRyZnNfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCk7CiAKIC8qIGFjbC5jICovCi0jaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAorI2lmZGVmIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wKIGludCBidHJmc19jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOwogI2Vsc2UKICNkZWZpbmUgYnRyZnNfY2hlY2tfYWNsIE5VTEwKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpci1pdGVtLmMgYi9mcy9idHJmcy9kaXItaXRlbS5jCmluZGV4IDFkNzAyMzYuLmYzYTYwNzUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2Rpci1pdGVtLmMKKysrIGIvZnMvYnRyZnMvZGlyLWl0ZW0uYwpAQCAtMjgxLDYgKzI4MSw1MyBAQAogCXJldHVybiBidHJmc19tYXRjaF9kaXJfaXRlbV9uYW1lKHJvb3QsIHBhdGgsIG5hbWUsIG5hbWVfbGVuKTsKIH0KIAorc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICoKK2J0cmZzX3NlYXJjaF9kaXJfaW5kZXhfaXRlbShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IGRpcmlkLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbikKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmRpOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXUzMiBucml0ZW1zOworCWludCByZXQ7CisKKwlrZXkub2JqZWN0aWQgPSBkaXJpZDsKKwlrZXkudHlwZSA9IEJUUkZTX0RJUl9JTkRFWF9LRVk7CisJa2V5Lm9mZnNldCA9IDA7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisKKwl3aGlsZSAoMSkgeworCQlpZiAocGF0aC0+c2xvdHNbMF0gPj0gbnJpdGVtcykgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwkJCWlmIChyZXQgPiAwKQorCQkJCWJyZWFrOworCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworCQkJY29udGludWU7CisJCX0KKworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoa2V5Lm9iamVjdGlkICE9IGRpcmlkIHx8IGtleS50eXBlICE9IEJUUkZTX0RJUl9JTkRFWF9LRVkpCisJCQlicmVhazsKKworCQlkaSA9IGJ0cmZzX21hdGNoX2Rpcl9pdGVtX25hbWUocm9vdCwgcGF0aCwgbmFtZSwgbmFtZV9sZW4pOworCQlpZiAoZGkpCisJCQlyZXR1cm4gZGk7CisKKwkJcGF0aC0+c2xvdHNbMF0rKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0cnVjdCBidHJmc19kaXJfaXRlbSAqYnRyZnNfbG9va3VwX3hhdHRyKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCB1NjQgZGlyLApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGlzay1pby5jIGIvZnMvYnRyZnMvZGlzay1pby5jCmluZGV4IDZjNDE3MzEuLjAyYjZhZmIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2Rpc2staW8uYworKysgYi9mcy9idHJmcy9kaXNrLWlvLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBleHRlbnRfaW9fb3BzIGJ0cmVlX2V4dGVudF9pb19vcHM7CiBzdGF0aWMgdm9pZCBlbmRfd29ya3F1ZXVlX2ZuKHN0cnVjdCBidHJmc193b3JrICp3b3JrKTsKK3N0YXRpYyB2b2lkIGZyZWVfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CiAKIHN0YXRpYyBhdG9taWNfdCBidHJmc19iZGlfbnVtID0gQVRPTUlDX0lOSVQoMCk7CiAKQEAgLTEyMywxNSArMTI0LDE1IEBACiAJc3RydWN0IGV4dGVudF9tYXAgKmVtOwogCWludCByZXQ7CiAKLQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCXJlYWRfbG9jaygmZW1fdHJlZS0+bG9jayk7CiAJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgc3RhcnQsIGxlbik7CiAJaWYgKGVtKSB7CiAJCWVtLT5iZGV2ID0KIAkJCUJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKLQkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCQlyZWFkX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAJCWdvdG8gb3V0OwogCX0KLQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJcmVhZF91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCiAJZW0gPSBhbGxvY19leHRlbnRfbWFwKEdGUF9OT0ZTKTsKIAlpZiAoIWVtKSB7CkBAIC0xNDQsNyArMTQ1LDcgQEAKIAllbS0+YmxvY2tfc3RhcnQgPSAwOwogCWVtLT5iZGV2ID0gQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OwogCi0Jc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwl3cml0ZV9sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAlyZXQgPSBhZGRfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0pOwogCWlmIChyZXQgPT0gLUVFWElTVCkgewogCQl1NjQgZmFpbGVkX3N0YXJ0ID0gZW0tPnN0YXJ0OwpAQCAtMTYzLDcgKzE2NCw3IEBACiAJCWZyZWVfZXh0ZW50X21hcChlbSk7CiAJCWVtID0gTlVMTDsKIAl9Ci0Jc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCXdyaXRlX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAKIAlpZiAocmV0KQogCQllbSA9IEVSUl9QVFIocmV0KTsKQEAgLTgyMSwxNCArODIyLDE0IEBACiAKIGludCBidHJmc193cml0ZV90cmVlX2Jsb2NrKHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYpCiB7Ci0JcmV0dXJuIGJ0cmZzX2ZkYXRhd3JpdGVfcmFuZ2UoYnVmLT5maXJzdF9wYWdlLT5tYXBwaW5nLCBidWYtPnN0YXJ0LAotCQkJCSAgICAgIGJ1Zi0+c3RhcnQgKyBidWYtPmxlbiAtIDEsIFdCX1NZTkNfQUxMKTsKKwlyZXR1cm4gZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKGJ1Zi0+Zmlyc3RfcGFnZS0+bWFwcGluZywgYnVmLT5zdGFydCwKKwkJCQkJYnVmLT5zdGFydCArIGJ1Zi0+bGVuIC0gMSk7CiB9CiAKIGludCBidHJmc193YWl0X3RyZWVfYmxvY2tfd3JpdGViYWNrKHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYpCiB7Ci0JcmV0dXJuIGJ0cmZzX3dhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2UoYnVmLT5maXJzdF9wYWdlLT5tYXBwaW5nLAotCQkJCSAgYnVmLT5zdGFydCwgYnVmLT5zdGFydCArIGJ1Zi0+bGVuIC0gMSk7CisJcmV0dXJuIGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKGJ1Zi0+Zmlyc3RfcGFnZS0+bWFwcGluZywKKwkJCQkgICAgICAgYnVmLT5zdGFydCwgYnVmLT5zdGFydCArIGJ1Zi0+bGVuIC0gMSk7CiB9CiAKIHN0cnVjdCBleHRlbnRfYnVmZmVyICpyZWFkX3RyZWVfYmxvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCkBAIC04OTUsOCArODk2LDcgQEAKIAlyb290LT5mc19pbmZvID0gZnNfaW5mbzsKIAlyb290LT5vYmplY3RpZCA9IG9iamVjdGlkOwogCXJvb3QtPmxhc3RfdHJhbnMgPSAwOwotCXJvb3QtPmhpZ2hlc3RfaW5vZGUgPSAwOwotCXJvb3QtPmxhc3RfaW5vZGVfYWxsb2MgPSAwOworCXJvb3QtPmhpZ2hlc3Rfb2JqZWN0aWQgPSAwOwogCXJvb3QtPm5hbWUgPSBOVUxMOwogCXJvb3QtPmluX3N5c2ZzID0gMDsKIAlyb290LT5pbm9kZV90cmVlLnJiX25vZGUgPSBOVUxMOwpAQCAtOTE3LDYgKzkxNyw3IEBACiAJYXRvbWljX3NldCgmcm9vdC0+bG9nX3dyaXRlcnMsIDApOwogCXJvb3QtPmxvZ19iYXRjaCA9IDA7CiAJcm9vdC0+bG9nX3RyYW5zaWQgPSAwOworCXJvb3QtPmxhc3RfbG9nX2NvbW1pdCA9IDA7CiAJZXh0ZW50X2lvX3RyZWVfaW5pdCgmcm9vdC0+ZGlydHlfbG9nX3BhZ2VzLAogCQkJICAgICBmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nLCBHRlBfTk9GUyk7CiAKQEAgLTk1MiwxNCArOTUzLDE2IEBACiAJCSAgICAgcm9vdCwgZnNfaW5mbywgb2JqZWN0aWQpOwogCXJldCA9IGJ0cmZzX2ZpbmRfbGFzdF9yb290KHRyZWVfcm9vdCwgb2JqZWN0aWQsCiAJCQkJICAgJnJvb3QtPnJvb3RfaXRlbSwgJnJvb3QtPnJvb3Rfa2V5KTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJQlVHX09OKHJldCk7CiAKIAlnZW5lcmF0aW9uID0gYnRyZnNfcm9vdF9nZW5lcmF0aW9uKCZyb290LT5yb290X2l0ZW0pOwogCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgYnRyZnNfcm9vdF9sZXZlbCgmcm9vdC0+cm9vdF9pdGVtKSk7CiAJcm9vdC0+bm9kZSA9IHJlYWRfdHJlZV9ibG9jayhyb290LCBidHJmc19yb290X2J5dGVucigmcm9vdC0+cm9vdF9pdGVtKSwKIAkJCQkgICAgIGJsb2Nrc2l6ZSwgZ2VuZXJhdGlvbik7Ci0Jcm9vdC0+Y29tbWl0X3Jvb3QgPSBidHJmc19yb290X25vZGUocm9vdCk7CiAJQlVHX09OKCFyb290LT5ub2RlKTsKKwlyb290LT5jb21taXRfcm9vdCA9IGJ0cmZzX3Jvb3Rfbm9kZShyb290KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA4NSw2ICsxMDg4LDcgQEAKIAlXQVJOX09OKHJvb3QtPmxvZ19yb290KTsKIAlyb290LT5sb2dfcm9vdCA9IGxvZ19yb290OwogCXJvb3QtPmxvZ190cmFuc2lkID0gMDsKKwlyb290LT5sYXN0X2xvZ19jb21taXQgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC0xMDk1LDcgKzEwOTksNiBAQAogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gdHJlZV9yb290LT5mc19pbmZvOwogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsOwotCXU2NCBoaWdoZXN0X2lub2RlOwogCXU2NCBnZW5lcmF0aW9uOwogCXUzMiBibG9ja3NpemU7CiAJaW50IHJldCA9IDA7CkBAIC0xMTEwLDcgKzExMTMsNyBAQAogCQkJa2ZyZWUocm9vdCk7CiAJCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCQl9Ci0JCWdvdG8gaW5zZXJ0OworCQlnb3RvIG91dDsKIAl9CiAKIAlfX3NldHVwX3Jvb3QodHJlZV9yb290LT5ub2Rlc2l6ZSwgdHJlZV9yb290LT5sZWFmc2l6ZSwKQEAgLTExMjAsMzkgKzExMjMsMzAgQEAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCUJVR19PTighcGF0aCk7CiAJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgdHJlZV9yb290LCBsb2NhdGlvbiwgcGF0aCwgMCwgMCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWlmIChyZXQgPiAwKQotCQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBvdXQ7CisJaWYgKHJldCA9PSAwKSB7CisJCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwkJcmVhZF9leHRlbnRfYnVmZmVyKGwsICZyb290LT5yb290X2l0ZW0sCisJCQkJYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGwsIHBhdGgtPnNsb3RzWzBdKSwKKwkJCQlzaXplb2Yocm9vdC0+cm9vdF9pdGVtKSk7CisJCW1lbWNweSgmcm9vdC0+cm9vdF9rZXksIGxvY2F0aW9uLCBzaXplb2YoKmxvY2F0aW9uKSk7CiAJfQotCWwgPSBwYXRoLT5ub2Rlc1swXTsKLQlyZWFkX2V4dGVudF9idWZmZXIobCwgJnJvb3QtPnJvb3RfaXRlbSwKLQkgICAgICAgYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGwsIHBhdGgtPnNsb3RzWzBdKSwKLQkgICAgICAgc2l6ZW9mKHJvb3QtPnJvb3RfaXRlbSkpOwotCW1lbWNweSgmcm9vdC0+cm9vdF9rZXksIGxvY2F0aW9uLCBzaXplb2YoKmxvY2F0aW9uKSk7Ci0JcmV0ID0gMDsKLW91dDoKLQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCWlmIChyZXQpIHsKLQkJa2ZyZWUocm9vdCk7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0ID0gLUVOT0VOVDsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CisKIAlnZW5lcmF0aW9uID0gYnRyZnNfcm9vdF9nZW5lcmF0aW9uKCZyb290LT5yb290X2l0ZW0pOwogCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgYnRyZnNfcm9vdF9sZXZlbCgmcm9vdC0+cm9vdF9pdGVtKSk7CiAJcm9vdC0+bm9kZSA9IHJlYWRfdHJlZV9ibG9jayhyb290LCBidHJmc19yb290X2J5dGVucigmcm9vdC0+cm9vdF9pdGVtKSwKIAkJCQkgICAgIGJsb2Nrc2l6ZSwgZ2VuZXJhdGlvbik7CiAJcm9vdC0+Y29tbWl0X3Jvb3QgPSBidHJmc19yb290X25vZGUocm9vdCk7CiAJQlVHX09OKCFyb290LT5ub2RlKTsKLWluc2VydDoKLQlpZiAobG9jYXRpb24tPm9iamVjdGlkICE9IEJUUkZTX1RSRUVfTE9HX09CSkVDVElEKSB7CitvdXQ6CisJaWYgKGxvY2F0aW9uLT5vYmplY3RpZCAhPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCkKIAkJcm9vdC0+cmVmX2Nvd3MgPSAxOwotCQlyZXQgPSBidHJmc19maW5kX2hpZ2hlc3RfaW5vZGUocm9vdCwgJmhpZ2hlc3RfaW5vZGUpOwotCQlpZiAocmV0ID09IDApIHsKLQkJCXJvb3QtPmhpZ2hlc3RfaW5vZGUgPSBoaWdoZXN0X2lub2RlOwotCQkJcm9vdC0+bGFzdF9pbm9kZV9hbGxvYyA9IGhpZ2hlc3RfaW5vZGU7Ci0JCX0KLQl9CisKIAlyZXR1cm4gcm9vdDsKIH0KIApAQCAtMTE4NywzOSArMTE4MSw2NiBAQAogCQlyZXR1cm4gZnNfaW5mby0+ZGV2X3Jvb3Q7CiAJaWYgKGxvY2F0aW9uLT5vYmplY3RpZCA9PSBCVFJGU19DU1VNX1RSRUVfT0JKRUNUSUQpCiAJCXJldHVybiBmc19pbmZvLT5jc3VtX3Jvb3Q7Ci0KK2FnYWluOgorCXNwaW5fbG9jaygmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CiAJcm9vdCA9IHJhZGl4X3RyZWVfbG9va3VwKCZmc19pbmZvLT5mc19yb290c19yYWRpeCwKIAkJCQkgKHVuc2lnbmVkIGxvbmcpbG9jYXRpb24tPm9iamVjdGlkKTsKKwlzcGluX3VubG9jaygmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CiAJaWYgKHJvb3QpCiAJCXJldHVybiByb290OwogCisJcmV0ID0gYnRyZnNfZmluZF9vcnBoYW5faXRlbShmc19pbmZvLT50cmVlX3Jvb3QsIGxvY2F0aW9uLT5vYmplY3RpZCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSAtRU5PRU5UOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCiAJcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19yYWRpeChmc19pbmZvLT50cmVlX3Jvb3QsIGxvY2F0aW9uKTsKIAlpZiAoSVNfRVJSKHJvb3QpKQogCQlyZXR1cm4gcm9vdDsKIAorCVdBUk5fT04oYnRyZnNfcm9vdF9yZWZzKCZyb290LT5yb290X2l0ZW0pID09IDApOwogCXNldF9hbm9uX3N1cGVyKCZyb290LT5hbm9uX3N1cGVyLCBOVUxMKTsKIAorCXJldCA9IHJhZGl4X3RyZWVfcHJlbG9hZChHRlBfTk9GUyAmIH5fX0dGUF9ISUdITUVNKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlzcGluX2xvY2soJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCXJldCA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZmc19pbmZvLT5mc19yb290c19yYWRpeCwKIAkJCQkodW5zaWduZWQgbG9uZylyb290LT5yb290X2tleS5vYmplY3RpZCwKIAkJCQlyb290KTsKKwlpZiAocmV0ID09IDApCisJCXJvb3QtPmluX3JhZGl4ID0gMTsKKwlzcGluX3VubG9jaygmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CisJcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOwogCWlmIChyZXQpIHsKLQkJZnJlZV9leHRlbnRfYnVmZmVyKHJvb3QtPm5vZGUpOwotCQlrZnJlZShyb290KTsKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwkJaWYgKHJldCA9PSAtRUVYSVNUKSB7CisJCQlmcmVlX2ZzX3Jvb3Qocm9vdCk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCWdvdG8gZmFpbDsKIAl9Ci0JaWYgKCEoZnNfaW5mby0+c2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0JCXJldCA9IGJ0cmZzX2ZpbmRfZGVhZF9yb290cyhmc19pbmZvLT50cmVlX3Jvb3QsCi0JCQkJCSAgICByb290LT5yb290X2tleS5vYmplY3RpZCk7Ci0JCUJVR19PTihyZXQpOworCisJcmV0ID0gYnRyZnNfZmluZF9kZWFkX3Jvb3RzKGZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkgICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQpOworCVdBUk5fT04ocmV0KTsKKworCWlmICghKGZzX2luZm8tPnNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKIAkJYnRyZnNfb3JwaGFuX2NsZWFudXAocm9vdCk7Ci0JfQorCiAJcmV0dXJuIHJvb3Q7CitmYWlsOgorCWZyZWVfZnNfcm9vdChyb290KTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCiBzdHJ1Y3QgYnRyZnNfcm9vdCAqYnRyZnNfcmVhZF9mc19yb290KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAogCQkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uLAogCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQogeworCXJldHVybiBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShmc19pbmZvLCBsb2NhdGlvbik7CisjaWYgMAogCXN0cnVjdCBidHJmc19yb290ICpyb290OwogCWludCByZXQ7CiAKQEAgLTEyMzYsNyArMTI1Nyw3IEBACiAJCWtmcmVlKHJvb3QpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KLSNpZiAwCisKIAlyZXQgPSBidHJmc19zeXNmc19hZGRfcm9vdChyb290KTsKIAlpZiAocmV0KSB7CiAJCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5ub2RlKTsKQEAgLTEyNDQsOSArMTI2NSw5IEBACiAJCWtmcmVlKHJvb3QpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KLSNlbmRpZgogCXJvb3QtPmluX3N5c2ZzID0gMTsKIAlyZXR1cm4gcm9vdDsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW50IGJ0cmZzX2Nvbmdlc3RlZF9mbih2b2lkICpjb25nZXN0ZWRfZGF0YSwgaW50IGJkaV9iaXRzKQpAQCAtMTMyNSw5ICsxMzQ2LDkgQEAKIAlvZmZzZXQgPSBwYWdlX29mZnNldChwYWdlKTsKIAogCWVtX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmV4dGVudF90cmVlOwotCXNwaW5fbG9jaygmZW1fdHJlZS0+bG9jayk7CisJcmVhZF9sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBvZmZzZXQsIFBBR0VfQ0FDSEVfU0laRSk7Ci0Jc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCXJlYWRfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAlpZiAoIWVtKSB7CiAJCV9fdW5wbHVnX2lvX2ZuKGJkaSwgcGFnZSk7CiAJCXJldHVybjsKQEAgLTEzNjAsOCArMTM4MSwxMCBAQAogCiAJZXJyID0gYmRpX3JlZ2lzdGVyKGJkaSwgTlVMTCwgImJ0cmZzLSVkIiwKIAkJCQlhdG9taWNfaW5jX3JldHVybigmYnRyZnNfYmRpX251bSkpOwotCWlmIChlcnIpCisJaWYgKGVycikgeworCQliZGlfZGVzdHJveShiZGkpOwogCQlyZXR1cm4gZXJyOworCX0KIAogCWJkaS0+cmFfcGFnZXMJPSBkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXM7CiAJYmRpLT51bnBsdWdfaW9fZm4JPSBidHJmc191bnBsdWdfaW9fZm47CkBAIC0xNDUxLDkgKzE0NzQsMTIgQEAKIAkJCWJyZWFrOwogCiAJCXZmc19jaGVja19mcm96ZW4ocm9vdC0+ZnNfaW5mby0+c2IsIFNCX0ZSRUVaRV9XUklURSk7Ci0JCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOwotCQlidHJmc19jbGVhbl9vbGRfc25hcHNob3RzKHJvb3QpOwotCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOworCisJCWlmICghKHJvb3QtPmZzX2luZm8tPnNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgorCQkgICAgbXV0ZXhfdHJ5bG9jaygmcm9vdC0+ZnNfaW5mby0+Y2xlYW5lcl9tdXRleCkpIHsKKwkJCWJ0cmZzX2NsZWFuX29sZF9zbmFwc2hvdHMocm9vdCk7CisJCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOworCQl9CiAKIAkJaWYgKGZyZWV6aW5nKGN1cnJlbnQpKSB7CiAJCQlyZWZyaWdlcmF0b3IoKTsKQEAgLTE1NTgsMTUgKzE1ODQsMzYgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KLQlJTklUX1JBRElYX1RSRUUoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LCBHRlBfTk9GUyk7CisKKwlyZXQgPSBpbml0X3NyY3Vfc3RydWN0KCZmc19pbmZvLT5zdWJ2b2xfc3JjdSk7CisJaWYgKHJldCkgeworCQllcnIgPSByZXQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBzZXR1cF9iZGkoZnNfaW5mbywgJmZzX2luZm8tPmJkaSk7CisJaWYgKHJldCkgeworCQllcnIgPSByZXQ7CisJCWdvdG8gZmFpbF9zcmN1OworCX0KKworCWZzX2luZm8tPmJ0cmVlX2lub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWZzX2luZm8tPmJ0cmVlX2lub2RlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9iZGk7CisJfQorCisJSU5JVF9SQURJWF9UUkVFKCZmc19pbmZvLT5mc19yb290c19yYWRpeCwgR0ZQX0FUT01JQyk7CiAJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPnRyYW5zX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZmc19pbmZvLT5kZWFkX3Jvb3RzKTsKIAlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+aGFzaGVycyk7CiAJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPmRlbGFsbG9jX2lub2Rlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPm9yZGVyZWRfb3BlcmF0aW9ucyk7CisJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPmNhY2hpbmdfYmxvY2tfZ3JvdXBzKTsKIAlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+ZGVsYWxsb2NfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPm5ld190cmFuc19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+cmVmX2NhY2hlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKIAogCWluaXRfY29tcGxldGlvbigmZnNfaW5mby0+a29ial91bnJlZ2lzdGVyKTsKIAlmc19pbmZvLT50cmVlX3Jvb3QgPSB0cmVlX3Jvb3Q7CkBAIC0xNTg1LDEyICsxNjMyLDcgQEAKIAlmc19pbmZvLT5zYiA9IHNiOwogCWZzX2luZm8tPm1heF9leHRlbnQgPSAodTY0KS0xOwogCWZzX2luZm8tPm1heF9pbmxpbmUgPSA4MTkyICogMTAyNDsKLQlpZiAoc2V0dXBfYmRpKGZzX2luZm8sICZmc19pbmZvLT5iZGkpKQotCQlnb3RvIGZhaWxfYmRpOwotCWZzX2luZm8tPmJ0cmVlX2lub2RlID0gbmV3X2lub2RlKHNiKTsKLQlmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9pbm8gPSAxOwotCWZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX25saW5rID0gMTsKLQlmc19pbmZvLT5tZXRhZGF0YV9yYXRpbyA9IDg7CisJZnNfaW5mby0+bWV0YWRhdGFfcmF0aW8gPSAwOwogCiAJZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsCiAJCQkJCSAgbnVtX29ubGluZV9jcHVzKCkgKyAyLCA4KTsKQEAgLTE2MDIsNiArMTY0NCw4IEBACiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBibGtzaXplX2JpdHMoNDA5Nik7CiAJc2ItPnNfYmRpID0gJmZzX2luZm8tPmJkaTsKIAorCWZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX2lubyA9IEJUUkZTX0JUUkVFX0lOT0RFX09CSkVDVElEOworCWZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX25saW5rID0gMTsKIAkvKgogCSAqIHdlIHNldCB0aGUgaV9zaXplIG9uIHRoZSBidHJlZSBpbm9kZSB0byB0aGUgbWF4IHBvc3NpYmxlIGludC4KIAkgKiB0aGUgcmVhbCBlbmQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgZGV0ZXJtaW5lZCBieSBhbGwgb2YKQEAgLTE2MjAsMjggKzE2NjQsMzIgQEAKIAogCUJUUkZTX0koZnNfaW5mby0+YnRyZWVfaW5vZGUpLT5pb190cmVlLm9wcyA9ICZidHJlZV9leHRlbnRfaW9fb3BzOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmJsb2NrX2dyb3VwX2NhY2hlX2xvY2spOwotCWZzX2luZm8tPmJsb2NrX2dyb3VwX2NhY2hlX3RyZWUucmJfbm9kZSA9IE5VTEw7Ci0KLQlleHRlbnRfaW9fdHJlZV9pbml0KCZmc19pbmZvLT5waW5uZWRfZXh0ZW50cywKLQkJCSAgICAgZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZywgR0ZQX05PRlMpOwotCWZzX2luZm8tPmRvX2JhcnJpZXJzID0gMTsKLQogCUJUUkZTX0koZnNfaW5mby0+YnRyZWVfaW5vZGUpLT5yb290ID0gdHJlZV9yb290OwogCW1lbXNldCgmQlRSRlNfSShmc19pbmZvLT5idHJlZV9pbm9kZSktPmxvY2F0aW9uLCAwLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleSkpOworCUJUUkZTX0koZnNfaW5mby0+YnRyZWVfaW5vZGUpLT5kdW1teV9pbm9kZSA9IDE7CiAJaW5zZXJ0X2lub2RlX2hhc2goZnNfaW5mby0+YnRyZWVfaW5vZGUpOwogCisJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmJsb2NrX2dyb3VwX2NhY2hlX2xvY2spOworCWZzX2luZm8tPmJsb2NrX2dyb3VwX2NhY2hlX3RyZWUucmJfbm9kZSA9IE5VTEw7CisKKwlleHRlbnRfaW9fdHJlZV9pbml0KCZmc19pbmZvLT5mcmVlZF9leHRlbnRzWzBdLAorCQkJICAgICBmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nLCBHRlBfTk9GUyk7CisJZXh0ZW50X2lvX3RyZWVfaW5pdCgmZnNfaW5mby0+ZnJlZWRfZXh0ZW50c1sxXSwKKwkJCSAgICAgZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZywgR0ZQX05PRlMpOworCWZzX2luZm8tPnBpbm5lZF9leHRlbnRzID0gJmZzX2luZm8tPmZyZWVkX2V4dGVudHNbMF07CisJZnNfaW5mby0+ZG9fYmFycmllcnMgPSAxOworCisKIAltdXRleF9pbml0KCZmc19pbmZvLT50cmFuc19tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZnNfaW5mby0+b3JkZXJlZF9vcGVyYXRpb25zX211dGV4KTsKIAltdXRleF9pbml0KCZmc19pbmZvLT50cmVlX2xvZ19tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmZnNfaW5mby0+ZHJvcF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZnNfaW5mby0+Y2h1bmtfbXV0ZXgpOwogCW11dGV4X2luaXQoJmZzX2luZm8tPnRyYW5zYWN0aW9uX2t0aHJlYWRfbXV0ZXgpOwogCW11dGV4X2luaXQoJmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOwogCW11dGV4X2luaXQoJmZzX2luZm8tPnZvbHVtZV9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmZnNfaW5mby0+dHJlZV9yZWxvY19tdXRleCk7CiAJaW5pdF9yd3NlbSgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOworCWluaXRfcndzZW0oJmZzX2luZm8tPnN1YnZvbF9zZW0pOwogCiAJYnRyZnNfaW5pdF9mcmVlX2NsdXN0ZXIoJmZzX2luZm8tPm1ldGFfYWxsb2NfY2x1c3Rlcik7CiAJYnRyZnNfaW5pdF9mcmVlX2NsdXN0ZXIoJmZzX2luZm8tPmRhdGFfYWxsb2NfY2x1c3Rlcik7CkBAIC0xNzAxLDIwICsxNzQ5LDI0IEBACiAJCWdvdG8gZmFpbF9pcHV0OwogCX0KIAotCS8qCi0JICogd2UgbmVlZCB0byBzdGFydCBhbGwgdGhlIGVuZF9pbyB3b3JrZXJzIHVwIGZyb250IGJlY2F1c2UgdGhlCi0JICogcXVldWUgd29yayBmdW5jdGlvbiBnZXRzIGNhbGxlZCBhdCBpbnRlcnJ1cHQgdGltZSwgYW5kIHNvIGl0Ci0JICogY2Fubm90IGR5bmFtaWNhbGx5IGdyb3cuCi0JICovCisJYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT5nZW5lcmljX3dvcmtlciwKKwkJCSAgICJnZW53b3JrIiwgMSwgTlVMTCk7CisKIAlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPndvcmtlcnMsICJ3b3JrZXIiLAotCQkJICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSk7CisJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplLAorCQkJICAgJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKIAogCWJ0cmZzX2luaXRfd29ya2VycygmZnNfaW5mby0+ZGVsYWxsb2Nfd29ya2VycywgImRlbGFsbG9jIiwKLQkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCQkJICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSwKKwkJCSAgICZmc19pbmZvLT5nZW5lcmljX3dvcmtlcik7CiAKIAlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPnN1Ym1pdF93b3JrZXJzLCAic3VibWl0IiwKIAkJCSAgIG1pbl90KHU2NCwgZnNfZGV2aWNlcy0+bnVtX2RldmljZXMsCi0JCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKSk7CisJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKSwKKwkJCSAgICZmc19pbmZvLT5nZW5lcmljX3dvcmtlcik7CisJYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT5lbm9zcGNfd29ya2VycywgImVub3NwYyIsCisJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplLAorCQkJICAgJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKIAogCS8qIGEgaGlnaGVyIGlkbGUgdGhyZXNoIG9uIHRoZSBzdWJtaXQgd29ya2VycyBtYWtlcyBpdCBtdWNoIG1vcmUKIAkgKiBsaWtlbHkgdGhhdCBiaW9zIHdpbGwgYmUgc2VuZCBkb3duIGluIGEgc2FuZSBvcmRlciB0byB0aGUKQEAgLTE3MjgsMTUgKzE3ODAsMjAgQEAKIAlmc19pbmZvLT5kZWxhbGxvY193b3JrZXJzLmlkbGVfdGhyZXNoID0gMjsKIAlmc19pbmZvLT5kZWxhbGxvY193b3JrZXJzLm9yZGVyZWQgPSAxOwogCi0JYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT5maXh1cF93b3JrZXJzLCAiZml4dXAiLCAxKTsKKwlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMsICJmaXh1cCIsIDEsCisJCQkgICAmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIpOwogCWJ0cmZzX2luaXRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fd29ya2VycywgImVuZGlvIiwKLQkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCQkJICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSwKKwkJCSAgICZmc19pbmZvLT5nZW5lcmljX3dvcmtlcik7CiAJYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dvcmtlcnMsICJlbmRpby1tZXRhIiwKLQkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCQkJICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSwKKwkJCSAgICZmc19pbmZvLT5nZW5lcmljX3dvcmtlcik7CiAJYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dyaXRlX3dvcmtlcnMsCi0JCQkgICAiZW5kaW8tbWV0YS13cml0ZSIsIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCQkJICAgImVuZGlvLW1ldGEtd3JpdGUiLCBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplLAorCQkJICAgJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKIAlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX3dyaXRlX3dvcmtlcnMsICJlbmRpby13cml0ZSIsCi0JCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKTsKKwkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUsCisJCQkgICAmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIpOwogCiAJLyoKIAkgKiBlbmRpb3MgYXJlIGxhcmdlbHkgcGFyYWxsZWwgYW5kIHNob3VsZCBoYXZlIGEgdmVyeQpAQCAtMTc0NSwyMCArMTgwMiwxOSBAQAogCWZzX2luZm8tPmVuZGlvX3dvcmtlcnMuaWRsZV90aHJlc2ggPSA0OwogCWZzX2luZm8tPmVuZGlvX21ldGFfd29ya2Vycy5pZGxlX3RocmVzaCA9IDQ7CiAKLQlmc19pbmZvLT5lbmRpb193cml0ZV93b3JrZXJzLmlkbGVfdGhyZXNoID0gNjQ7Ci0JZnNfaW5mby0+ZW5kaW9fbWV0YV93cml0ZV93b3JrZXJzLmlkbGVfdGhyZXNoID0gNjQ7CisJZnNfaW5mby0+ZW5kaW9fd3JpdGVfd29ya2Vycy5pZGxlX3RocmVzaCA9IDI7CisJZnNfaW5mby0+ZW5kaW9fbWV0YV93cml0ZV93b3JrZXJzLmlkbGVfdGhyZXNoID0gMjsKIAogCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPndvcmtlcnMsIDEpOworCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyLCAxKTsKIAlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5zdWJtaXRfd29ya2VycywgMSk7CiAJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+ZGVsYWxsb2Nfd29ya2VycywgMSk7CiAJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+Zml4dXBfd29ya2VycywgMSk7Ci0JYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fd29ya2VycywgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSk7Ci0JYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fbWV0YV93b3JrZXJzLAotCQkJICAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOwotCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX21ldGFfd3JpdGVfd29ya2VycywKLQkJCSAgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKTsKLQlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb193cml0ZV93b3JrZXJzLAotCQkJICAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX3dvcmtlcnMsIDEpOworCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX21ldGFfd29ya2VycywgMSk7CisJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fbWV0YV93cml0ZV93b3JrZXJzLCAxKTsKKwlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb193cml0ZV93b3JrZXJzLCAxKTsKKwlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbm9zcGNfd29ya2VycywgMSk7CiAKIAlmc19pbmZvLT5iZGkucmFfcGFnZXMgKj0gYnRyZnNfc3VwZXJfbnVtX2RldmljZXMoZGlza19zdXBlcik7CiAJZnNfaW5mby0+YmRpLnJhX3BhZ2VzID0gbWF4KGZzX2luZm8tPmJkaS5yYV9wYWdlcywKQEAgLTE5MTgsNiArMTk3NCw5IEBACiAJCX0KIAl9CiAKKwlyZXQgPSBidHJmc19maW5kX29ycGhhbl9yb290cyh0cmVlX3Jvb3QpOworCUJVR19PTihyZXQpOworCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCXJldCA9IGJ0cmZzX3JlY292ZXJfcmVsb2NhdGlvbih0cmVlX3Jvb3QpOwogCQlCVUdfT04ocmV0KTsKQEAgLTE5NjEsNiArMjAyMCw3IEBACiAJZnJlZV9leHRlbnRfYnVmZmVyKGNodW5rX3Jvb3QtPm5vZGUpOwogCWZyZWVfZXh0ZW50X2J1ZmZlcihjaHVua19yb290LT5jb21taXRfcm9vdCk7CiBmYWlsX3NiX2J1ZmZlcjoKKwlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMpOwogCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+ZGVsYWxsb2Nfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT53b3JrZXJzKTsKQEAgLTE5NjksNiArMjAyOSw3IEBACiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dyaXRlX3dvcmtlcnMpOwogCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fd3JpdGVfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5zdWJtaXRfd29ya2Vycyk7CisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5lbm9zcGNfd29ya2Vycyk7CiBmYWlsX2lwdXQ6CiAJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIoZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CiAJaXB1dChmc19pbmZvLT5idHJlZV9pbm9kZSk7CkBAIC0xOTc3LDYgKzIwMzgsOCBAQAogCWJ0cmZzX21hcHBpbmdfdHJlZV9mcmVlKCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOwogZmFpbF9iZGk6CiAJYmRpX2Rlc3Ryb3koJmZzX2luZm8tPmJkaSk7CitmYWlsX3NyY3U6CisJY2xlYW51cF9zcmN1X3N0cnVjdCgmZnNfaW5mby0+c3Vidm9sX3NyY3UpOwogZmFpbDoKIAlrZnJlZShleHRlbnRfcm9vdCk7CiAJa2ZyZWUodHJlZV9yb290KTsKQEAgLTIyMzYsMjAgKzIyOTksMjkgQEAKIAogaW50IGJ0cmZzX2ZyZWVfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7Ci0JV0FSTl9PTighUkJfRU1QVFlfUk9PVCgmcm9vdC0+aW5vZGVfdHJlZSkpOworCXNwaW5fbG9jaygmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXhfbG9jayk7CiAJcmFkaXhfdHJlZV9kZWxldGUoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LAogCQkJICAodW5zaWduZWQgbG9uZylyb290LT5yb290X2tleS5vYmplY3RpZCk7CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOworCisJaWYgKGJ0cmZzX3Jvb3RfcmVmcygmcm9vdC0+cm9vdF9pdGVtKSA9PSAwKQorCQlzeW5jaHJvbml6ZV9zcmN1KCZmc19pbmZvLT5zdWJ2b2xfc3JjdSk7CisKKwlmcmVlX2ZzX3Jvb3Qocm9vdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlXQVJOX09OKCFSQl9FTVBUWV9ST09UKCZyb290LT5pbm9kZV90cmVlKSk7CiAJaWYgKHJvb3QtPmFub25fc3VwZXIuc19kZXYpIHsKIAkJZG93bl93cml0ZSgmcm9vdC0+YW5vbl9zdXBlci5zX3Vtb3VudCk7CiAJCWtpbGxfYW5vbl9zdXBlcigmcm9vdC0+YW5vbl9zdXBlcik7CiAJfQotCWlmIChyb290LT5ub2RlKQotCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+bm9kZSk7Ci0JaWYgKHJvb3QtPmNvbW1pdF9yb290KQotCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+Y29tbWl0X3Jvb3QpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5ub2RlKTsKKwlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+Y29tbWl0X3Jvb3QpOwogCWtmcmVlKHJvb3QtPm5hbWUpOwogCWtmcmVlKHJvb3QpOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRlbF9mc19yb290cyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbykKQEAgLTIyNTgsNiArMjMzMCwyMCBAQAogCXN0cnVjdCBidHJmc19yb290ICpnYW5nWzhdOwogCWludCBpOwogCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZmc19pbmZvLT5kZWFkX3Jvb3RzKSkgeworCQlnYW5nWzBdID0gbGlzdF9lbnRyeShmc19pbmZvLT5kZWFkX3Jvb3RzLm5leHQsCisJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCwgcm9vdF9saXN0KTsKKwkJbGlzdF9kZWwoJmdhbmdbMF0tPnJvb3RfbGlzdCk7CisKKwkJaWYgKGdhbmdbMF0tPmluX3JhZGl4KSB7CisJCQlidHJmc19mcmVlX2ZzX3Jvb3QoZnNfaW5mbywgZ2FuZ1swXSk7CisJCX0gZWxzZSB7CisJCQlmcmVlX2V4dGVudF9idWZmZXIoZ2FuZ1swXS0+bm9kZSk7CisJCQlmcmVlX2V4dGVudF9idWZmZXIoZ2FuZ1swXS0+Y29tbWl0X3Jvb3QpOworCQkJa2ZyZWUoZ2FuZ1swXSk7CisJCX0KKwl9CisKIAl3aGlsZSAoMSkgewogCQlyZXQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZmc19pbmZvLT5mc19yb290c19yYWRpeCwKIAkJCQkJICAgICAodm9pZCAqKilnYW5nLCAwLApAQCAtMjI4Nyw5ICsyMzczLDYgQEAKIAkJcm9vdF9vYmplY3RpZCA9IGdhbmdbcmV0IC0gMV0tPnJvb3Rfa2V5Lm9iamVjdGlkICsgMTsKIAkJZm9yIChpID0gMDsgaSA8IHJldDsgaSsrKSB7CiAJCQlyb290X29iamVjdGlkID0gZ2FuZ1tpXS0+cm9vdF9rZXkub2JqZWN0aWQ7Ci0JCQlyZXQgPSBidHJmc19maW5kX2RlYWRfcm9vdHMoZnNfaW5mby0+dHJlZV9yb290LAotCQkJCQkJICAgIHJvb3Rfb2JqZWN0aWQpOwotCQkJQlVHX09OKHJldCk7CiAJCQlidHJmc19vcnBoYW5fY2xlYW51cChnYW5nW2ldKTsKIAkJfQogCQlyb290X29iamVjdGlkKys7CkBAIC0yMzU5LDEyICsyNDQyLDEyIEBACiAJZnJlZV9leHRlbnRfYnVmZmVyKHJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdC0+Y29tbWl0X3Jvb3QpOwogCiAJYnRyZnNfZnJlZV9ibG9ja19ncm91cHMocm9vdC0+ZnNfaW5mbyk7Ci0JYnRyZnNfZnJlZV9waW5uZWRfZXh0ZW50cyhyb290LT5mc19pbmZvKTsKIAogCWRlbF9mc19yb290cyhmc19pbmZvKTsKIAogCWlwdXQoZnNfaW5mby0+YnRyZWVfaW5vZGUpOwogCisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5nZW5lcmljX3dvcmtlcik7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5maXh1cF93b3JrZXJzKTsKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmRlbGFsbG9jX3dvcmtlcnMpOwogCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+d29ya2Vycyk7CkBAIC0yMzczLDExICsyNDU2LDEzIEBACiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dyaXRlX3dvcmtlcnMpOwogCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fd3JpdGVfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5zdWJtaXRfd29ya2Vycyk7CisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5lbm9zcGNfd29ya2Vycyk7CiAKIAlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2luZm8tPmZzX2RldmljZXMpOwogCWJ0cmZzX21hcHBpbmdfdHJlZV9mcmVlKCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOwogCiAJYmRpX2Rlc3Ryb3koJmZzX2luZm8tPmJkaSk7CisJY2xlYW51cF9zcmN1X3N0cnVjdCgmZnNfaW5mby0+c3Vidm9sX3NyY3UpOwogCiAJa2ZyZWUoZnNfaW5mby0+ZXh0ZW50X3Jvb3QpOwogCWtmcmVlKGZzX2luZm8tPnRyZWVfcm9vdCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHBvcnQuYyBiL2ZzL2J0cmZzL2V4cG9ydC5jCmluZGV4IDk1OTZiNDAuLmJhNWMzZmQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4cG9ydC5jCisrKyBiL2ZzL2J0cmZzL2V4cG9ydC5jCkBAIC0yOCw3ICsyOCw3IEBACiAJbGVuICA9IEJUUkZTX0ZJRF9TSVpFX05PTl9DT05ORUNUQUJMRTsKIAl0eXBlID0gRklMRUlEX0JUUkZTX1dJVEhPVVRfUEFSRU5UOwogCi0JZmlkLT5vYmplY3RpZCA9IEJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi5vYmplY3RpZDsKKwlmaWQtPm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOwogCWZpZC0+cm9vdF9vYmplY3RpZCA9IEJUUkZTX0koaW5vZGUpLT5yb290LT5vYmplY3RpZDsKIAlmaWQtPmdlbiA9IGlub2RlLT5pX2dlbmVyYXRpb247CiAKQEAgLTYwLDM0ICs2MCw2MSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYnRyZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgb2JqZWN0aWQsCi0JCQkJICAgICAgIHU2NCByb290X29iamVjdGlkLCB1MzIgZ2VuZXJhdGlvbikKKwkJCQkgICAgICAgdTY0IHJvb3Rfb2JqZWN0aWQsIHUzMiBnZW5lcmF0aW9uLAorCQkJCSAgICAgICBpbnQgY2hlY2tfZ2VuZXJhdGlvbikKIHsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IGJ0cmZzX3NiKHNiKS0+ZnNfaW5mbzsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlpbnQgaW5kZXg7CisJaW50IGVyciA9IDA7CisKKwlpZiAob2JqZWN0aWQgPCBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKIAogCWtleS5vYmplY3RpZCA9IHJvb3Rfb2JqZWN0aWQ7CiAJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX1JPT1RfSVRFTV9LRVkpOwogCWtleS5vZmZzZXQgPSAodTY0KS0xOwogCi0Jcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKGJ0cmZzX3NiKHNiKS0+ZnNfaW5mbywgJmtleSk7Ci0JaWYgKElTX0VSUihyb290KSkKLQkJcmV0dXJuIEVSUl9DQVNUKHJvb3QpOworCWluZGV4ID0gc3JjdV9yZWFkX2xvY2soJmZzX2luZm8tPnN1YnZvbF9zcmN1KTsKKworCXJvb3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShmc19pbmZvLCAma2V5KTsKKwlpZiAoSVNfRVJSKHJvb3QpKSB7CisJCWVyciA9IFBUUl9FUlIocm9vdCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoYnRyZnNfcm9vdF9yZWZzKCZyb290LT5yb290X2l0ZW0pID09IDApIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBmYWlsOworCX0KIAogCWtleS5vYmplY3RpZCA9IG9iamVjdGlkOwogCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19JTk9ERV9JVEVNX0tFWSk7CiAJa2V5Lm9mZnNldCA9IDA7CiAKIAlpbm9kZSA9IGJ0cmZzX2lnZXQoc2IsICZrZXksIHJvb3QpOwotCWlmIChJU19FUlIoaW5vZGUpKQotCQlyZXR1cm4gKHZvaWQgKilpbm9kZTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJZ290byBmYWlsOworCX0KIAotCWlmIChnZW5lcmF0aW9uICE9IGlub2RlLT5pX2dlbmVyYXRpb24pIHsKKwlzcmN1X3JlYWRfdW5sb2NrKCZmc19pbmZvLT5zdWJ2b2xfc3JjdSwgaW5kZXgpOworCisJaWYgKGNoZWNrX2dlbmVyYXRpb24gJiYgZ2VuZXJhdGlvbiAhPSBpbm9kZS0+aV9nZW5lcmF0aW9uKSB7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKIAl9CiAKLQlyZXR1cm4gZF9vYnRhaW5fYWxpYXMoaW5vZGUpOworCWRlbnRyeSA9IGRfb2J0YWluX2FsaWFzKGlub2RlKTsKKwlpZiAoIUlTX0VSUihkZW50cnkpKQorCQlkZW50cnktPmRfb3AgPSAmYnRyZnNfZGVudHJ5X29wZXJhdGlvbnM7CisJcmV0dXJuIGRlbnRyeTsKK2ZhaWw6CisJc3JjdV9yZWFkX3VubG9jaygmZnNfaW5mby0+c3Vidm9sX3NyY3UsIGluZGV4KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYnRyZnNfZmhfdG9fcGFyZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmaWQgKmZoLApAQCAtMTExLDcgKzEzOCw3IEBACiAJb2JqZWN0aWQgPSBmaWQtPnBhcmVudF9vYmplY3RpZDsKIAlnZW5lcmF0aW9uID0gZmlkLT5wYXJlbnRfZ2VuOwogCi0JcmV0dXJuIGJ0cmZzX2dldF9kZW50cnkoc2IsIG9iamVjdGlkLCByb290X29iamVjdGlkLCBnZW5lcmF0aW9uKTsKKwlyZXR1cm4gYnRyZnNfZ2V0X2RlbnRyeShzYiwgb2JqZWN0aWQsIHJvb3Rfb2JqZWN0aWQsIGdlbmVyYXRpb24sIDEpOwogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYnRyZnNfZmhfdG9fZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmaWQgKmZoLApAQCAtMTMzLDY2ICsxNjAsNzYgQEAKIAlyb290X29iamVjdGlkID0gZmlkLT5yb290X29iamVjdGlkOwogCWdlbmVyYXRpb24gPSBmaWQtPmdlbjsKIAotCXJldHVybiBidHJmc19nZXRfZGVudHJ5KHNiLCBvYmplY3RpZCwgcm9vdF9vYmplY3RpZCwgZ2VuZXJhdGlvbik7CisJcmV0dXJuIGJ0cmZzX2dldF9kZW50cnkoc2IsIG9iamVjdGlkLCByb290X29iamVjdGlkLCBnZW5lcmF0aW9uLCAxKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmJ0cmZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCiB7CiAJc3RydWN0IGlub2RlICpkaXIgPSBjaGlsZC0+ZF9pbm9kZTsKKwlzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShkaXIpLT5yb290OwotCXN0cnVjdCBidHJmc19rZXkga2V5OwogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOwotCWludCBzbG90OwotCXU2NCBvYmplY3RpZDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9yZWYgKnJlZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKIAlpbnQgcmV0OwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAotCWtleS5vYmplY3RpZCA9IGRpci0+aV9pbm87Ci0JYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0lOT0RFX1JFRl9LRVkpOwotCWtleS5vZmZzZXQgPSAodTY0KS0xOworCWlmIChkaXItPmlfaW5vID09IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpIHsKKwkJa2V5Lm9iamVjdGlkID0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQ7CisJCWtleS50eXBlID0gQlRSRlNfUk9PVF9CQUNLUkVGX0tFWTsKKwkJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJCXJvb3QgPSByb290LT5mc19pbmZvLT50cmVlX3Jvb3Q7CisJfSBlbHNlIHsKKwkJa2V5Lm9iamVjdGlkID0gZGlyLT5pX2lubzsKKwkJa2V5LnR5cGUgPSBCVFJGU19JTk9ERV9SRUZfS0VZOworCQlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKwl9CiAKIAlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQkvKiBFcnJvciAqLwotCQlidHJmc19mcmVlX3BhdGgocGF0aCk7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQotCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKLQlzbG90ID0gcGF0aC0+c2xvdHNbMF07Ci0JaWYgKHJldCkgewotCQkvKiBidHJmc19zZWFyY2hfc2xvdCgpIHJldHVybnMgdGhlIHNsb3Qgd2hlcmUgd2UnZCB3YW50IHRvCi0JCSAgIGluc2VydCBhIGJhY2tyZWYgZm9yIHBhcmVudCBpbm9kZSAjMHhGRkZGRkZGRkZGRkZGRkZGLgotCQkgICBUaGUgX3JlYWxfIGJhY2tyZWYsIHRlbGxpbmcgdXMgd2hhdCB0aGUgcGFyZW50IGlub2RlCi0JCSAgIF9hY3R1YWxseV8gaXMsIHdpbGwgYmUgaW4gdGhlIHNsb3QgX2JlZm9yZV8gdGhlIG9uZQotCQkgICB0aGF0IGJ0cmZzX3NlYXJjaF9zbG90KCkgcmV0dXJucy4gKi8KLQkJaWYgKCFzbG90KSB7Ci0JCQkvKiBVbmxlc3MgdGhlcmUgaXMgX25vXyBrZXkgaW4gdGhlIHRyZWUgYmVmb3JlLi4uICovCi0JCQlidHJmc19mcmVlX3BhdGgocGF0aCk7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKLQkJfQotCQlzbG90LS07CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCUJVR19PTihyZXQgPT0gMCk7CisJaWYgKHBhdGgtPnNsb3RzWzBdID09IDApIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBmYWlsOwogCX0KIAotCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAma2V5LCBzbG90KTsKKwlwYXRoLT5zbG90c1swXS0tOworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CisJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBrZXkub2JqZWN0aWQgfHwgZm91bmRfa2V5LnR5cGUgIT0ga2V5LnR5cGUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChmb3VuZF9rZXkudHlwZSA9PSBCVFJGU19ST09UX0JBQ0tSRUZfS0VZKSB7CisJCXJlZiA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3RfcmVmKTsKKwkJa2V5Lm9iamVjdGlkID0gYnRyZnNfcm9vdF9yZWZfZGlyaWQobGVhZiwgcmVmKTsKKwl9IGVsc2UgeworCQlrZXkub2JqZWN0aWQgPSBmb3VuZF9rZXkub2Zmc2V0OworCX0KIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAKLQlpZiAoa2V5Lm9iamVjdGlkICE9IGRpci0+aV9pbm8gfHwga2V5LnR5cGUgIT0gQlRSRlNfSU5PREVfUkVGX0tFWSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGZvdW5kX2tleS50eXBlID09IEJUUkZTX1JPT1RfQkFDS1JFRl9LRVkpIHsKKwkJcmV0dXJuIGJ0cmZzX2dldF9kZW50cnkocm9vdC0+ZnNfaW5mby0+c2IsIGtleS5vYmplY3RpZCwKKwkJCQkJZm91bmRfa2V5Lm9mZnNldCwgMCwgMCk7CisJfQogCi0Jb2JqZWN0aWQgPSBrZXkub2Zmc2V0OwotCi0JLyogSWYgd2UgYXJlIGFscmVhZHkgYXQgdGhlIHJvb3Qgb2YgYSBzdWJ2b2wsIHJldHVybiB0aGUgcmVhbCByb290ICovCi0JaWYgKG9iamVjdGlkID09IGRpci0+aV9pbm8pCi0JCXJldHVybiBkZ2V0KGRpci0+aV9zYi0+c19yb290KTsKLQotCS8qIEJ1aWxkIGEgbmV3IGtleSBmb3IgdGhlIGlub2RlIGl0ZW0gKi8KLQlrZXkub2JqZWN0aWQgPSBvYmplY3RpZDsKLQlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfSU5PREVfSVRFTV9LRVkpOworCWtleS50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CiAJa2V5Lm9mZnNldCA9IDA7Ci0KLQlyZXR1cm4gZF9vYnRhaW5fYWxpYXMoYnRyZnNfaWdldChyb290LT5mc19pbmZvLT5zYiwgJmtleSwgcm9vdCkpOworCWRlbnRyeSA9IGRfb2J0YWluX2FsaWFzKGJ0cmZzX2lnZXQocm9vdC0+ZnNfaW5mby0+c2IsICZrZXksIHJvb3QpKTsKKwlpZiAoIUlTX0VSUihkZW50cnkpKQorCQlkZW50cnktPmRfb3AgPSAmYnRyZnNfZGVudHJ5X29wZXJhdGlvbnM7CisJcmV0dXJuIGRlbnRyeTsKK2ZhaWw6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIGNvbnN0IHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBidHJmc19leHBvcnRfb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYyBiL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKaW5kZXggNTM1Zjg1Yi4uZTIzOGEwYyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYworKysgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCkBAIC0zMiwxMiArMzIsMTIgQEAKICNpbmNsdWRlICJsb2NraW5nLmgiCiAjaW5jbHVkZSAiZnJlZS1zcGFjZS1jYWNoZS5oIgogCi1zdGF0aWMgaW50IHVwZGF0ZV9yZXNlcnZlZF9leHRlbnRzKHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJCSAgIHU2NCBieXRlbnIsIHU2NCBudW0sIGludCByZXNlcnZlKTsKIHN0YXRpYyBpbnQgdXBkYXRlX2Jsb2NrX2dyb3VwKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkgICAgICB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLCBpbnQgYWxsb2MsCiAJCQkgICAgICBpbnQgbWFya19mcmVlKTsKK3N0YXRpYyBpbnQgdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwKKwkJCQkgICB1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSk7CiBzdGF0aWMgaW50IF9fYnRyZnNfZnJlZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcywgdTY0IHBhcmVudCwKQEAgLTU3LDEwICs1NywxOSBAQAogCQkJCSAgICAgdTY0IHBhcmVudCwgdTY0IHJvb3Rfb2JqZWN0aWQsCiAJCQkJICAgICB1NjQgZmxhZ3MsIHN0cnVjdCBidHJmc19kaXNrX2tleSAqa2V5LAogCQkJCSAgICAgaW50IGxldmVsLCBzdHJ1Y3QgYnRyZnNfa2V5ICppbnMpOwotCiBzdGF0aWMgaW50IGRvX2NodW5rX2FsbG9jKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QsIHU2NCBhbGxvY19ieXRlcywKIAkJCSAgdTY0IGZsYWdzLCBpbnQgZm9yY2UpOworc3RhdGljIGludCBwaW5fZG93bl9ieXRlcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJICB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLAorCQkJICBpbnQgaXNfZGF0YSwgaW50IHJlc2VydmVkLAorCQkJICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqKm11c3RfY2xlYW4pOworc3RhdGljIGludCBmaW5kX25leHRfa2V5KHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgbGV2ZWwsCisJCQkgc3RydWN0IGJ0cmZzX2tleSAqa2V5KTsKK3N0YXRpYyB2b2lkIGR1bXBfc3BhY2VfaW5mbyhzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqaW5mbywgdTY0IGJ5dGVzLAorCQkJICAgIGludCBkdW1wX2Jsb2NrX2dyb3Vwcyk7CiAKIHN0YXRpYyBub2lubGluZSBpbnQKIGJsb2NrX2dyb3VwX2NhY2hlX2RvbmUoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSkKQEAgLTE1MywzNCArMTYyLDM0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIFdlIGFsd2F5cyBzZXQgRVhURU5UX0xPQ0tFRCBmb3IgdGhlIHN1cGVyIG1pcnJvciBleHRlbnRzIHNvIHdlIGRvbid0Ci0gKiBvdmVyd3JpdGUgdGhlbSwgc28gdGhvc2UgYml0cyBuZWVkIHRvIGJlIHVuc2V0LiAgQWxzbywgaWYgd2UgYXJlIHVubW91bnRpbmcKLSAqIHdpdGggcGlubmVkIGV4dGVudHMgc3RpbGwgc2l0dGluZyB0aGVyZSBiZWNhdXNlIHdlIGhhZCBhIGJsb2NrIGdyb3VwIGNhY2hpbmcsCi0gKiB3ZSBuZWVkIHRvIGNsZWFyIHRob3NlIG5vdywgc2luY2Ugd2UgYXJlIGRvbmUuCi0gKi8KLXZvaWQgYnRyZnNfZnJlZV9waW5uZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgYWRkX2V4Y2x1ZGVkX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBudW1fYnl0ZXMpCiB7Ci0JdTY0IHN0YXJ0LCBlbmQsIGxhc3QgPSAwOwotCWludCByZXQ7Ci0KLQl3aGlsZSAoMSkgewotCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoJmluZm8tPnBpbm5lZF9leHRlbnRzLCBsYXN0LAotCQkJCQkgICAgJnN0YXJ0LCAmZW5kLAotCQkJCQkgICAgRVhURU5UX0xPQ0tFRHxFWFRFTlRfRElSVFkpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0KLQkJY2xlYXJfZXh0ZW50X2JpdHMoJmluZm8tPnBpbm5lZF9leHRlbnRzLCBzdGFydCwgZW5kLAotCQkJCSAgRVhURU5UX0xPQ0tFRHxFWFRFTlRfRElSVFksIEdGUF9OT0ZTKTsKLQkJbGFzdCA9IGVuZCsxOwotCX0KKwl1NjQgZW5kID0gc3RhcnQgKyBudW1fYnl0ZXMgLSAxOworCXNldF9leHRlbnRfYml0cygmcm9vdC0+ZnNfaW5mby0+ZnJlZWRfZXh0ZW50c1swXSwKKwkJCXN0YXJ0LCBlbmQsIEVYVEVOVF9VUFRPREFURSwgR0ZQX05PRlMpOworCXNldF9leHRlbnRfYml0cygmcm9vdC0+ZnNfaW5mby0+ZnJlZWRfZXh0ZW50c1sxXSwKKwkJCXN0YXJ0LCBlbmQsIEVYVEVOVF9VUFRPREFURSwgR0ZQX05PRlMpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlbW92ZV9zYl9mcm9tX2NhY2hlKHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUpCitzdGF0aWMgdm9pZCBmcmVlX2V4Y2x1ZGVkX2V4dGVudHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlKQogewotCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gcm9vdC0+ZnNfaW5mbzsKKwl1NjQgc3RhcnQsIGVuZDsKKworCXN0YXJ0ID0gY2FjaGUtPmtleS5vYmplY3RpZDsKKwllbmQgPSBzdGFydCArIGNhY2hlLT5rZXkub2Zmc2V0IC0gMTsKKworCWNsZWFyX2V4dGVudF9iaXRzKCZyb290LT5mc19pbmZvLT5mcmVlZF9leHRlbnRzWzBdLAorCQkJICBzdGFydCwgZW5kLCBFWFRFTlRfVVBUT0RBVEUsIEdGUF9OT0ZTKTsKKwljbGVhcl9leHRlbnRfYml0cygmcm9vdC0+ZnNfaW5mby0+ZnJlZWRfZXh0ZW50c1sxXSwKKwkJCSAgc3RhcnQsIGVuZCwgRVhURU5UX1VQVE9EQVRFLCBHRlBfTk9GUyk7Cit9CisKK3N0YXRpYyBpbnQgZXhjbHVkZV9zdXBlcl9zdHJpcGVzKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlKQorewogCXU2NCBieXRlbnI7CiAJdTY0ICpsb2dpY2FsOwogCWludCBzdHJpcGVfbGVuOwpAQCAtMTkyLDE3ICsyMDEsNDIgQEAKIAkJCQkgICAgICAgY2FjaGUtPmtleS5vYmplY3RpZCwgYnl0ZW5yLAogCQkJCSAgICAgICAwLCAmbG9naWNhbCwgJm5yLCAmc3RyaXBlX2xlbik7CiAJCUJVR19PTihyZXQpOworCiAJCXdoaWxlIChuci0tKSB7Ci0JCQl0cnlfbG9ja19leHRlbnQoJmZzX2luZm8tPnBpbm5lZF9leHRlbnRzLAotCQkJCQlsb2dpY2FsW25yXSwKLQkJCQkJbG9naWNhbFtucl0gKyBzdHJpcGVfbGVuIC0gMSwgR0ZQX05PRlMpOworCQkJY2FjaGUtPmJ5dGVzX3N1cGVyICs9IHN0cmlwZV9sZW47CisJCQlyZXQgPSBhZGRfZXhjbHVkZWRfZXh0ZW50KHJvb3QsIGxvZ2ljYWxbbnJdLAorCQkJCQkJICBzdHJpcGVfbGVuKTsKKwkJCUJVR19PTihyZXQpOwogCQl9CisKIAkJa2ZyZWUobG9naWNhbCk7CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfY2FjaGluZ19jb250cm9sICoKK2dldF9jYWNoaW5nX2NvbnRyb2woc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfY2FjaGluZ19jb250cm9sICpjdGw7CisKKwlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKKwlpZiAoY2FjaGUtPmNhY2hlZCAhPSBCVFJGU19DQUNIRV9TVEFSVEVEKSB7CisJCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCWN0bCA9IGNhY2hlLT5jYWNoaW5nX2N0bDsKKwlhdG9taWNfaW5jKCZjdGwtPmNvdW50KTsKKwlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCXJldHVybiBjdGw7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9jYWNoaW5nX2NvbnRyb2woc3RydWN0IGJ0cmZzX2NhY2hpbmdfY29udHJvbCAqY3RsKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjdGwtPmNvdW50KSkKKwkJa2ZyZWUoY3RsKTsKK30KKwogLyoKICAqIHRoaXMgaXMgb25seSBjYWxsZWQgYnkgY2FjaGVfYmxvY2tfZ3JvdXAsIHNpbmNlIHdlIGNvdWxkIGhhdmUgZnJlZWQgZXh0ZW50cwogICogd2UgbmVlZCB0byBjaGVjayB0aGUgcGlubmVkX2V4dGVudHMgZm9yIGFueSBleHRlbnRzIHRoYXQgY2FuJ3QgYmUgdXNlZCB5ZXQKQEAgLTIxNSw5ICsyNDksOSBAQAogCWludCByZXQ7CiAKIAl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJcmV0ID0gZmluZF9maXJzdF9leHRlbnRfYml0KCZpbmZvLT5waW5uZWRfZXh0ZW50cywgc3RhcnQsCisJCXJldCA9IGZpbmRfZmlyc3RfZXh0ZW50X2JpdChpbmZvLT5waW5uZWRfZXh0ZW50cywgc3RhcnQsCiAJCQkJCSAgICAmZXh0ZW50X3N0YXJ0LCAmZXh0ZW50X2VuZCwKLQkJCQkJICAgIEVYVEVOVF9ESVJUWXxFWFRFTlRfTE9DS0VEKTsKKwkJCQkJICAgIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9VUFRPREFURSk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIApAQCAtMjQ5LDIyICsyODMsMjcgQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwID0gZGF0YTsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IGJsb2NrX2dyb3VwLT5mc19pbmZvOwotCXU2NCBsYXN0ID0gMDsKKwlzdHJ1Y3QgYnRyZnNfY2FjaGluZ19jb250cm9sICpjYWNoaW5nX2N0bCA9IGJsb2NrX2dyb3VwLT5jYWNoaW5nX2N0bDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QgPSBmc19pbmZvLT5leHRlbnRfcm9vdDsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKLQlpbnQgc2xvdDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAl1NjQgdG90YWxfZm91bmQgPSAwOwotCi0JQlVHX09OKCFmc19pbmZvKTsKKwl1NjQgbGFzdCA9IDA7CisJdTMyIG5yaXRlbXM7CisJaW50IHJldCA9IDA7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlhdG9taWNfaW5jKCZibG9ja19ncm91cC0+c3BhY2VfaW5mby0+Y2FjaGluZ190aHJlYWRzKTsKKwlleGNsdWRlX3N1cGVyX3N0cmlwZXMoZXh0ZW50X3Jvb3QsIGJsb2NrX2dyb3VwKTsKKwlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5zcGFjZV9pbmZvLT5sb2NrKTsKKwlibG9ja19ncm91cC0+c3BhY2VfaW5mby0+Ynl0ZXNfc3VwZXIgKz0gYmxvY2tfZ3JvdXAtPmJ5dGVzX3N1cGVyOworCXNwaW5fdW5sb2NrKCZibG9ja19ncm91cC0+c3BhY2VfaW5mby0+bG9jayk7CisKIAlsYXN0ID0gbWF4X3QodTY0LCBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkLCBCVFJGU19TVVBFUl9JTkZPX09GRlNFVCk7CisKIAkvKgogCSAqIFdlIGRvbid0IHdhbnQgdG8gZGVhZGxvY2sgd2l0aCBzb21lYm9keSB0cnlpbmcgdG8gYWxsb2NhdGUgYSBuZXcKIAkgKiBleHRlbnQgZm9yIHRoZSBleHRlbnQgcm9vdCB3aGlsZSBhbHNvIHRyeWluZyB0byBzZWFyY2ggdGhlIGV4dGVudApAQCAtMjc3LDc0ICszMTYsNjQgQEAKIAogCWtleS5vYmplY3RpZCA9IGxhc3Q7CiAJa2V5Lm9mZnNldCA9IDA7Ci0JYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0VYVEVOVF9JVEVNX0tFWSk7CisJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfSVRFTV9LRVk7CiBhZ2FpbjoKKwltdXRleF9sb2NrKCZjYWNoaW5nX2N0bC0+bXV0ZXgpOwogCS8qIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjb21taXRfcm9vdCBkb2Vzbid0IGRpc2FwcGVhciAqLwogCWRvd25fcmVhZCgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOwogCi0JcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgZnNfaW5mby0+ZXh0ZW50X3Jvb3QsICZrZXksIHBhdGgsIDAsIDApOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIGV4dGVudF9yb290LCAma2V5LCBwYXRoLCAwLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworCiAJd2hpbGUgKDEpIHsKIAkJc21wX21iKCk7Ci0JCWlmIChibG9ja19ncm91cC0+ZnNfaW5mby0+Y2xvc2luZyA+IDEpIHsKKwkJaWYgKGZzX2luZm8tPmNsb3NpbmcgPiAxKSB7CiAJCQlsYXN0ID0gKHU2NCktMTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwotCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07Ci0JCWlmIChzbG90ID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpKSB7Ci0JCQlyZXQgPSBidHJmc19uZXh0X2xlYWYoZnNfaW5mby0+ZXh0ZW50X3Jvb3QsIHBhdGgpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBlcnI7Ci0JCQllbHNlIGlmIChyZXQpCisJCWlmIChwYXRoLT5zbG90c1swXSA8IG5yaXRlbXMpIHsKKwkJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAma2V5LCBwYXRoLT5zbG90c1swXSk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBmaW5kX25leHRfa2V5KHBhdGgsIDAsICZrZXkpOworCQkJaWYgKHJldCkKIAkJCQlicmVhazsKIAotCQkJaWYgKG5lZWRfcmVzY2hlZCgpIHx8Ci0JCQkgICAgYnRyZnNfdHJhbnNhY3Rpb25faW5fY29tbWl0KGZzX2luZm8pKSB7Ci0JCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwotCi0JCQkJLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaWYgdGhlCi0JCQkJICogbGVhZiBpcyBlbXB0eSBqdXN0IG1vdmUgb24uCi0JCQkJICovCi0JCQkJaWYgKGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpID09IDApCi0JCQkJCWJyZWFrOwotCQkJCS8qCi0JCQkJICogd2UgbmVlZCB0byBjb3B5IHRoZSBrZXkgb3V0IHNvIHRoYXQKLQkJCQkgKiB3ZSBhcmUgc3VyZSB0aGUgbmV4dCBzZWFyY2ggYWR2YW5jZXMKLQkJCQkgKiB1cyBmb3J3YXJkIGluIHRoZSBidHJlZS4KLQkJCQkgKi8KLQkJCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgMCk7Ci0JCQkJYnRyZnNfcmVsZWFzZV9wYXRoKGZzX2luZm8tPmV4dGVudF9yb290LCBwYXRoKTsKLQkJCQl1cF9yZWFkKCZmc19pbmZvLT5leHRlbnRfY29tbWl0X3NlbSk7CisJCQljYWNoaW5nX2N0bC0+cHJvZ3Jlc3MgPSBsYXN0OworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKGV4dGVudF9yb290LCBwYXRoKTsKKwkJCXVwX3JlYWQoJmZzX2luZm8tPmV4dGVudF9jb21taXRfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmY2FjaGluZ19jdGwtPm11dGV4KTsKKwkJCWlmIChidHJmc190cmFuc2FjdGlvbl9pbl9jb21taXQoZnNfaW5mbykpCiAJCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJCQlnb3RvIGFnYWluOwotCQkJfQorCQkJZWxzZQorCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJZ290byBhZ2FpbjsKKwkJfQogCisJCWlmIChrZXkub2JqZWN0aWQgPCBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkKSB7CisJCQlwYXRoLT5zbG90c1swXSsrOwogCQkJY29udGludWU7CiAJCX0KLQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHNsb3QpOwotCQlpZiAoa2V5Lm9iamVjdGlkIDwgYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCkKLQkJCWdvdG8gbmV4dDsKIAogCQlpZiAoa2V5Lm9iamVjdGlkID49IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKwogCQkgICAgYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpCiAJCQlicmVhazsKIAotCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmtleSkgPT0gQlRSRlNfRVhURU5UX0lURU1fS0VZKSB7CisJCWlmIChrZXkudHlwZSA9PSBCVFJGU19FWFRFTlRfSVRFTV9LRVkpIHsKIAkJCXRvdGFsX2ZvdW5kICs9IGFkZF9uZXdfZnJlZV9zcGFjZShibG9ja19ncm91cCwKIAkJCQkJCQkgIGZzX2luZm8sIGxhc3QsCiAJCQkJCQkJICBrZXkub2JqZWN0aWQpOwogCQkJbGFzdCA9IGtleS5vYmplY3RpZCArIGtleS5vZmZzZXQ7Ci0JCX0KIAotCQlpZiAodG90YWxfZm91bmQgPiAoMTAyNCAqIDEwMjQgKiAyKSkgewotCQkJdG90YWxfZm91bmQgPSAwOwotCQkJd2FrZV91cCgmYmxvY2tfZ3JvdXAtPmNhY2hpbmdfcSk7CisJCQlpZiAodG90YWxfZm91bmQgPiAoMTAyNCAqIDEwMjQgKiAyKSkgeworCQkJCXRvdGFsX2ZvdW5kID0gMDsKKwkJCQl3YWtlX3VwKCZjYWNoaW5nX2N0bC0+d2FpdCk7CisJCQl9CiAJCX0KLW5leHQ6CiAJCXBhdGgtPnNsb3RzWzBdKys7CiAJfQogCXJldCA9IDA7CkBAIC0zNTIsMzMgKzM4MSw2NSBAQAogCXRvdGFsX2ZvdW5kICs9IGFkZF9uZXdfZnJlZV9zcGFjZShibG9ja19ncm91cCwgZnNfaW5mbywgbGFzdCwKIAkJCQkJICBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsKIAkJCQkJICBibG9ja19ncm91cC0+a2V5Lm9mZnNldCk7CisJY2FjaGluZ19jdGwtPnByb2dyZXNzID0gKHU2NCktMTsKIAogCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCWJsb2NrX2dyb3VwLT5jYWNoaW5nX2N0bCA9IE5VTEw7CiAJYmxvY2tfZ3JvdXAtPmNhY2hlZCA9IEJUUkZTX0NBQ0hFX0ZJTklTSEVEOwogCXNwaW5fdW5sb2NrKCZibG9ja19ncm91cC0+bG9jayk7CiAKIGVycjoKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJdXBfcmVhZCgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOwotCWF0b21pY19kZWMoJmJsb2NrX2dyb3VwLT5zcGFjZV9pbmZvLT5jYWNoaW5nX3RocmVhZHMpOwotCXdha2VfdXAoJmJsb2NrX2dyb3VwLT5jYWNoaW5nX3EpOwogCisJZnJlZV9leGNsdWRlZF9leHRlbnRzKGV4dGVudF9yb290LCBibG9ja19ncm91cCk7CisKKwltdXRleF91bmxvY2soJmNhY2hpbmdfY3RsLT5tdXRleCk7CisJd2FrZV91cCgmY2FjaGluZ19jdGwtPndhaXQpOworCisJcHV0X2NhY2hpbmdfY29udHJvbChjYWNoaW5nX2N0bCk7CisJYXRvbWljX2RlYygmYmxvY2tfZ3JvdXAtPnNwYWNlX2luZm8tPmNhY2hpbmdfdGhyZWFkcyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY2FjaGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSkKIHsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IGNhY2hlLT5mc19pbmZvOworCXN0cnVjdCBidHJmc19jYWNoaW5nX2NvbnRyb2wgKmNhY2hpbmdfY3RsOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCWludCByZXQgPSAwOwogCisJc21wX21iKCk7CisJaWYgKGNhY2hlLT5jYWNoZWQgIT0gQlRSRlNfQ0FDSEVfTk8pCisJCXJldHVybiAwOworCisJY2FjaGluZ19jdGwgPSBremFsbG9jKHNpemVvZigqY2FjaGluZ19jdGwpLCBHRlBfS0VSTkVMKTsKKwlCVUdfT04oIWNhY2hpbmdfY3RsKTsKKworCUlOSVRfTElTVF9IRUFEKCZjYWNoaW5nX2N0bC0+bGlzdCk7CisJbXV0ZXhfaW5pdCgmY2FjaGluZ19jdGwtPm11dGV4KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWNoaW5nX2N0bC0+d2FpdCk7CisJY2FjaGluZ19jdGwtPmJsb2NrX2dyb3VwID0gY2FjaGU7CisJY2FjaGluZ19jdGwtPnByb2dyZXNzID0gY2FjaGUtPmtleS5vYmplY3RpZDsKKwkvKiBvbmUgZm9yIGNhY2hpbmcga3RocmVhZCwgb25lIGZvciBjYWNoaW5nIGJsb2NrIGdyb3VwIGxpc3QgKi8KKwlhdG9taWNfc2V0KCZjYWNoaW5nX2N0bC0+Y291bnQsIDIpOworCiAJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CiAJaWYgKGNhY2hlLT5jYWNoZWQgIT0gQlRSRlNfQ0FDSEVfTk8pIHsKIAkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKLQkJcmV0dXJuIHJldDsKKwkJa2ZyZWUoY2FjaGluZ19jdGwpOworCQlyZXR1cm4gMDsKIAl9CisJY2FjaGUtPmNhY2hpbmdfY3RsID0gY2FjaGluZ19jdGw7CiAJY2FjaGUtPmNhY2hlZCA9IEJUUkZTX0NBQ0hFX1NUQVJURUQ7CiAJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKIAorCWRvd25fd3JpdGUoJmZzX2luZm8tPmV4dGVudF9jb21taXRfc2VtKTsKKwlsaXN0X2FkZF90YWlsKCZjYWNoaW5nX2N0bC0+bGlzdCwgJmZzX2luZm8tPmNhY2hpbmdfYmxvY2tfZ3JvdXBzKTsKKwl1cF93cml0ZSgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOworCisJYXRvbWljX2luYygmY2FjaGUtPnNwYWNlX2luZm8tPmNhY2hpbmdfdGhyZWFkcyk7CisKIAl0c2sgPSBrdGhyZWFkX3J1bihjYWNoaW5nX2t0aHJlYWQsIGNhY2hlLCAiYnRyZnMtY2FjaGUtJWxsdVxuIiwKIAkJCSAgY2FjaGUtPmtleS5vYmplY3RpZCk7CiAJaWYgKElTX0VSUih0c2spKSB7CkBAIC0xNTA3LDIzICsxNTY4LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmZGVmIEJJT19SV19ESVNDQVJECiBzdGF0aWMgdm9pZCBidHJmc19pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkJdTY0IHN0YXJ0LCB1NjQgbGVuKQogewogCWJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0ID4+IDksIGxlbiA+PiA5LCBHRlBfS0VSTkVMLAogCQkJICAgICBESVNDQVJEX0ZMX0JBUlJJRVIpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgYnRyZnNfZGlzY2FyZF9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCiAJCQkJdTY0IG51bV9ieXRlcykKIHsKLSNpZmRlZiBCSU9fUldfRElTQ0FSRAogCWludCByZXQ7CiAJdTY0IG1hcF9sZW5ndGggPSBudW1fYnl0ZXM7CiAJc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqbXVsdGkgPSBOVUxMOwogCisJaWYgKCFidHJmc190ZXN0X29wdChyb290LCBESVNDQVJEKSkKKwkJcmV0dXJuIDA7CisKIAkvKiBUZWxsIHRoZSBibG9jayBkZXZpY2UocykgdGhhdCB0aGUgc2VjdG9ycyBjYW4gYmUgZGlzY2FyZGVkICovCiAJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKCZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWUsIFJFQUQsCiAJCQkgICAgICBieXRlbnIsICZtYXBfbGVuZ3RoLCAmbXVsdGksIDApOwpAQCAtMTU0Myw5ICsxNjA0LDYgQEAKIAl9CiAKIAlyZXR1cm4gcmV0OwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgogfQogCiBpbnQgYnRyZnNfaW5jX2V4dGVudF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0xNjU3LDcgKzE3MTUsNiBAQAogCQkJCQkJIHBhcmVudCwgcmVmX3Jvb3QsIGZsYWdzLAogCQkJCQkJIHJlZi0+b2JqZWN0aWQsIHJlZi0+b2Zmc2V0LAogCQkJCQkJICZpbnMsIG5vZGUtPnJlZl9tb2QpOwotCQl1cGRhdGVfcmVzZXJ2ZWRfZXh0ZW50cyhyb290LCBpbnMub2JqZWN0aWQsIGlucy5vZmZzZXQsIDApOwogCX0gZWxzZSBpZiAobm9kZS0+YWN0aW9uID09IEJUUkZTX0FERF9ERUxBWUVEX1JFRikgewogCQlyZXQgPSBfX2J0cmZzX2luY19leHRlbnRfcmVmKHRyYW5zLCByb290LCBub2RlLT5ieXRlbnIsCiAJCQkJCSAgICAgbm9kZS0+bnVtX2J5dGVzLCBwYXJlbnQsCkBAIC0xNzgzLDcgKzE4NDAsNiBAQAogCQkJCQkJZXh0ZW50X29wLT5mbGFnc190b19zZXQsCiAJCQkJCQkmZXh0ZW50X29wLT5rZXksCiAJCQkJCQlyZWYtPmxldmVsLCAmaW5zKTsKLQkJdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMocm9vdCwgaW5zLm9iamVjdGlkLCBpbnMub2Zmc2V0LCAwKTsKIAl9IGVsc2UgaWYgKG5vZGUtPmFjdGlvbiA9PSBCVFJGU19BRERfREVMQVlFRF9SRUYpIHsKIAkJcmV0ID0gX19idHJmc19pbmNfZXh0ZW50X3JlZih0cmFucywgcm9vdCwgbm9kZS0+Ynl0ZW5yLAogCQkJCQkgICAgIG5vZGUtPm51bV9ieXRlcywgcGFyZW50LCByZWZfcm9vdCwKQEAgLTE4MTgsMTYgKzE4NzQsMzIgQEAKIAkJQlVHX09OKGV4dGVudF9vcCk7CiAJCWhlYWQgPSBidHJmc19kZWxheWVkX25vZGVfdG9faGVhZChub2RlKTsKIAkJaWYgKGluc2VydF9yZXNlcnZlZCkgeworCQkJaW50IG1hcmtfZnJlZSA9IDA7CisJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbXVzdF9jbGVhbiA9IE5VTEw7CisKKwkJCXJldCA9IHBpbl9kb3duX2J5dGVzKHRyYW5zLCByb290LCBOVUxMLAorCQkJCQkgICAgIG5vZGUtPmJ5dGVuciwgbm9kZS0+bnVtX2J5dGVzLAorCQkJCQkgICAgIGhlYWQtPmlzX2RhdGEsIDEsICZtdXN0X2NsZWFuKTsKKwkJCWlmIChyZXQgPiAwKQorCQkJCW1hcmtfZnJlZSA9IDE7CisKKwkJCWlmIChtdXN0X2NsZWFuKSB7CisJCQkJY2xlYW5fdHJlZV9ibG9jayhOVUxMLCByb290LCBtdXN0X2NsZWFuKTsKKwkJCQlidHJmc190cmVlX3VubG9jayhtdXN0X2NsZWFuKTsKKwkJCQlmcmVlX2V4dGVudF9idWZmZXIobXVzdF9jbGVhbik7CisJCQl9CiAJCQlpZiAoaGVhZC0+aXNfZGF0YSkgewogCQkJCXJldCA9IGJ0cmZzX2RlbF9jc3Vtcyh0cmFucywgcm9vdCwKIAkJCQkJCSAgICAgIG5vZGUtPmJ5dGVuciwKIAkJCQkJCSAgICAgIG5vZGUtPm51bV9ieXRlcyk7CiAJCQkJQlVHX09OKHJldCk7CiAJCQl9Ci0JCQlidHJmc191cGRhdGVfcGlubmVkX2V4dGVudHMocm9vdCwgbm9kZS0+Ynl0ZW5yLAotCQkJCQkJICAgIG5vZGUtPm51bV9ieXRlcywgMSk7Ci0JCQl1cGRhdGVfcmVzZXJ2ZWRfZXh0ZW50cyhyb290LCBub2RlLT5ieXRlbnIsCi0JCQkJCQlub2RlLT5udW1fYnl0ZXMsIDApOworCQkJaWYgKG1hcmtfZnJlZSkgeworCQkJCXJldCA9IGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KHJvb3QsCisJCQkJCQkJbm9kZS0+Ynl0ZW5yLAorCQkJCQkJCW5vZGUtPm51bV9ieXRlcyk7CisJCQkJQlVHX09OKHJldCk7CisJCQl9CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZoZWFkLT5tdXRleCk7CiAJCXJldHVybiAwOwpAQCAtMjY5Miw2MCArMjc2NCw0NDggQEAKIAkJCQkJCSAgICAgICBhbGxvY190YXJnZXQpOwogfQogCitzdGF0aWMgdTY0IGNhbGN1bGF0ZV9ieXRlc19uZWVkZWQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGludCBudW1faXRlbXMpCit7CisJdTY0IG51bV9ieXRlczsKKwlpbnQgbGV2ZWw7CisKKwlsZXZlbCA9IEJUUkZTX01BWF9MRVZFTCAtIDI7CisJLyoKKwkgKiBOT1RFOiB0aGVzZSBjYWxjdWxhdGlvbnMgYXJlIGFic29sdXRlbHkgdGhlIHdvcnN0IHBvc3NpYmxlIGNhc2UuCisJICogVGhpcyBhc3N1bWVzIHRoYXQgX2V2ZXJ5XyBpdGVtIHdlIGluc2VydCB3aWxsIHJlcXVpcmUgYSBuZXcgbGVhZiwgYW5kCisJICogdGhhdCB0aGUgdHJlZSBoYXMgZ3Jvd24gdG8gaXRzIG1heGltdW0gbGV2ZWwgc2l6ZS4KKwkgKi8KKworCS8qCisJICogZm9yIGV2ZXJ5IGl0ZW0gd2UgaW5zZXJ0IHdlIGNvdWxkIGluc2VydCBib3RoIGFuIGV4dGVudCBpdGVtIGFuZCBhCisJICogZXh0ZW50IHJlZiBpdGVtLiAgVGhlbiBmb3IgZXZlciBpdGVtIHdlIGluc2VydCwgd2Ugd2lsbCBuZWVkIHRvIGNvdworCSAqIGJvdGggdGhlIG9yaWdpbmFsIGxlYWYsIHBsdXMgdGhlIGxlYWYgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IG9mIGl0LgorCSAqCisJICogVW5sZXNzIHdlIGFyZSB0YWxraW5nIGFib3V0IHRoZSBleHRlbnQgcm9vdCwgdGhlbiB3ZSBqdXN0IHdhbnQgdGhlCisJICogbnVtYmVyIG9mIGl0ZW1zICogMiwgc2luY2Ugd2UganVzdCBuZWVkIHRoZSBleHRlbnQgaXRlbSBwbHVzIGl0cyByZWYuCisJICovCisJaWYgKHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QpCisJCW51bV9ieXRlcyA9IG51bV9pdGVtcyAqIDI7CisJZWxzZQorCQludW1fYnl0ZXMgPSAobnVtX2l0ZW1zICsgKDIgKiBudW1faXRlbXMpKSAqIDM7CisKKwkvKgorCSAqIG51bV9ieXRlcyBpcyB0b3RhbCBudW1iZXIgb2YgbGVhdmVzIHdlIGNvdWxkIG5lZWQgdGltZXMgdGhlIGxlYWYKKwkgKiBzaXplLCBhbmQgdGhlbiBmb3IgZXZlcnkgbGVhZiB3ZSBjb3VsZCBlbmQgdXAgY293J2luZyAyIG5vZGVzIHBlcgorCSAqIGxldmVsLCBkb3duIHRvIHRoZSBsZWFmIGxldmVsLgorCSAqLworCW51bV9ieXRlcyA9IChudW1fYnl0ZXMgKiByb290LT5sZWFmc2l6ZSkgKworCQkobnVtX2J5dGVzICogKGxldmVsICogMikpICogcm9vdC0+bm9kZXNpemU7CisKKwlyZXR1cm4gbnVtX2J5dGVzOworfQorCiAvKgotICogZm9yIG5vdyB0aGlzIGp1c3QgbWFrZXMgc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IDUlIG9mIG91ciBtZXRhZGF0YSBzcGFjZSBmcmVlCi0gKiBmb3IgdXNlLgorICogVW5yZXNlcnZlIG1ldGFkYXRhIHNwYWNlIGZvciBkZWxhbGxvYy4gIElmIHdlIGhhdmUgbGVzcyByZXNlcnZlZCBjcmVkaXRzIHRoYW4KKyAqIHdlIGhhdmUgZXh0ZW50cywgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCiAgKi8KLWludCBidHJmc19jaGVja19tZXRhZGF0YV9mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19yb290ICpyb290KQoraW50IGJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9mb3JfZGVsYWxsb2Moc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwgaW50IG51bV9pdGVtcykKIHsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CiAJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKm1ldGFfc2luZm87Ci0JdTY0IGFsbG9jX3RhcmdldCwgdGhyZXNoOwotCWludCBjb21taXR0ZWQgPSAwLCByZXQ7CisJdTY0IG51bV9ieXRlczsKKwl1NjQgYWxsb2NfdGFyZ2V0OworCWJvb2wgYnVnID0gZmFsc2U7CiAKIAkvKiBnZXQgdGhlIHNwYWNlIGluZm8gZm9yIHdoZXJlIHRoZSBtZXRhZGF0YSB3aWxsIGxpdmUgKi8KIAlhbGxvY190YXJnZXQgPSBidHJmc19nZXRfYWxsb2NfcHJvZmlsZShyb290LCAwKTsKIAltZXRhX3NpbmZvID0gX19maW5kX3NwYWNlX2luZm8oaW5mbywgYWxsb2NfdGFyZ2V0KTsKIAorCW51bV9ieXRlcyA9IGNhbGN1bGF0ZV9ieXRlc19uZWVkZWQocm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsCisJCQkJCSAgIG51bV9pdGVtcyk7CisKKwlzcGluX2xvY2soJm1ldGFfc2luZm8tPmxvY2spOworCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmFjY291bnRpbmdfbG9jayk7CisJaWYgKEJUUkZTX0koaW5vZGUpLT5yZXNlcnZlZF9leHRlbnRzIDw9CisJICAgIEJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzKSB7CisJCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+YWNjb3VudGluZ19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJm1ldGFfc2luZm8tPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5hY2NvdW50aW5nX2xvY2spOworCisJQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHMtLTsKKwlCVUdfT04oQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHMgPCAwKTsKKworCWlmIChtZXRhX3NpbmZvLT5ieXRlc19kZWxhbGxvYyA8IG51bV9ieXRlcykgeworCQlidWcgPSB0cnVlOworCQltZXRhX3NpbmZvLT5ieXRlc19kZWxhbGxvYyA9IDA7CisJfSBlbHNlIHsKKwkJbWV0YV9zaW5mby0+Ynl0ZXNfZGVsYWxsb2MgLT0gbnVtX2J5dGVzOworCX0KKwlzcGluX3VubG9jaygmbWV0YV9zaW5mby0+bG9jayk7CisKKwlCVUdfT04oYnVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19mb3JjZV9kZWxhbGxvYyhzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqbWV0YV9zaW5mbykKK3sKKwl1NjQgdGhyZXNoOworCisJdGhyZXNoID0gbWV0YV9zaW5mby0+Ynl0ZXNfdXNlZCArIG1ldGFfc2luZm8tPmJ5dGVzX3Jlc2VydmVkICsKKwkJbWV0YV9zaW5mby0+Ynl0ZXNfcGlubmVkICsgbWV0YV9zaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKworCQltZXRhX3NpbmZvLT5ieXRlc19zdXBlciArIG1ldGFfc2luZm8tPmJ5dGVzX3Jvb3QgKworCQltZXRhX3NpbmZvLT5ieXRlc19tYXlfdXNlOworCisJdGhyZXNoID0gbWV0YV9zaW5mby0+dG90YWxfYnl0ZXMgLSB0aHJlc2g7CisJdGhyZXNoICo9IDgwOworCWRvX2Rpdih0aHJlc2gsIDEwMCk7CisJaWYgKHRocmVzaCA8PSBtZXRhX3NpbmZvLT5ieXRlc19kZWxhbGxvYykKKwkJbWV0YV9zaW5mby0+Zm9yY2VfZGVsYWxsb2MgPSAxOworCWVsc2UKKwkJbWV0YV9zaW5mby0+Zm9yY2VfZGVsYWxsb2MgPSAwOworfQorCitzdHJ1Y3QgYXN5bmNfZmx1c2ggeworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICppbmZvOworCXN0cnVjdCBidHJmc193b3JrIHdvcms7Cit9OworCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBmbHVzaF9kZWxhbGxvY19hc3luYyhzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgYXN5bmNfZmx1c2ggKmFzeW5jOworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICppbmZvOworCisJYXN5bmMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFzeW5jX2ZsdXNoLCB3b3JrKTsKKwlyb290ID0gYXN5bmMtPnJvb3Q7CisJaW5mbyA9IGFzeW5jLT5pbmZvOworCisJYnRyZnNfc3RhcnRfZGVsYWxsb2NfaW5vZGVzKHJvb3QpOworCXdha2VfdXAoJmluZm8tPmZsdXNoX3dhaXQpOworCWJ0cmZzX3dhaXRfb3JkZXJlZF9leHRlbnRzKHJvb3QsIDApOworCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKwlpbmZvLT5mbHVzaGluZyA9IDA7CisJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCXdha2VfdXAoJmluZm8tPmZsdXNoX3dhaXQpOworCisJa2ZyZWUoYXN5bmMpOworfQorCitzdGF0aWMgdm9pZCB3YWl0X29uX2ZsdXNoKHN0cnVjdCBidHJmc19zcGFjZV9pbmZvICppbmZvKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXU2NCB1c2VkOworCisJd2hpbGUgKDEpIHsKKwkJcHJlcGFyZV90b193YWl0KCZpbmZvLT5mbHVzaF93YWl0LCAmd2FpdCwKKwkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisJCWlmICghaW5mby0+Zmx1c2hpbmcpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdXNlZCA9IGluZm8tPmJ5dGVzX3VzZWQgKyBpbmZvLT5ieXRlc19yZXNlcnZlZCArCisJCQlpbmZvLT5ieXRlc19waW5uZWQgKyBpbmZvLT5ieXRlc19yZWFkb25seSArCisJCQlpbmZvLT5ieXRlc19zdXBlciArIGluZm8tPmJ5dGVzX3Jvb3QgKworCQkJaW5mby0+Ynl0ZXNfbWF5X3VzZSArIGluZm8tPmJ5dGVzX2RlbGFsbG9jOworCQlpZiAodXNlZCA8IGluZm8tPnRvdGFsX2J5dGVzKSB7CisJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJCXNjaGVkdWxlKCk7CisJfQorCWZpbmlzaF93YWl0KCZpbmZvLT5mbHVzaF93YWl0LCAmd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX2RlbGFsbG9jKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYXN5bmNfZmx1c2ggKmFzeW5jOworCWJvb2wgd2FpdCA9IGZhbHNlOworCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKworCWlmICghaW5mby0+Zmx1c2hpbmcpIHsKKwkJaW5mby0+Zmx1c2hpbmcgPSAxOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5mbHVzaF93YWl0KTsKKwl9IGVsc2UgeworCQl3YWl0ID0gdHJ1ZTsKKwl9CisKKwlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisKKwlpZiAod2FpdCkgeworCQl3YWl0X29uX2ZsdXNoKGluZm8pOworCQlyZXR1cm47CisJfQorCisJYXN5bmMgPSBremFsbG9jKHNpemVvZigqYXN5bmMpLCBHRlBfTk9GUyk7CisJaWYgKCFhc3luYykKKwkJZ290byBmbHVzaDsKKworCWFzeW5jLT5yb290ID0gcm9vdDsKKwlhc3luYy0+aW5mbyA9IGluZm87CisJYXN5bmMtPndvcmsuZnVuYyA9IGZsdXNoX2RlbGFsbG9jX2FzeW5jOworCisJYnRyZnNfcXVldWVfd29ya2VyKCZyb290LT5mc19pbmZvLT5lbm9zcGNfd29ya2VycywKKwkJCSAgICZhc3luYy0+d29yayk7CisJd2FpdF9vbl9mbHVzaChpbmZvKTsKKwlyZXR1cm47CisKK2ZsdXNoOgorCWJ0cmZzX3N0YXJ0X2RlbGFsbG9jX2lub2Rlcyhyb290KTsKKwlidHJmc193YWl0X29yZGVyZWRfZXh0ZW50cyhyb290LCAwKTsKKworCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisJaW5mby0+Zmx1c2hpbmcgPSAwOworCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwl3YWtlX3VwKCZpbmZvLT5mbHVzaF93YWl0KTsKK30KKworc3RhdGljIGludCBtYXliZV9hbGxvY2F0ZV9jaHVuayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKmluZm8pCit7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpkaXNrX3N1cGVyID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJYm9vbCB3YWl0ID0gZmFsc2U7CisJaW50IHJldCA9IDA7CisJdTY0IG1pbl9tZXRhZGF0YTsKKwl1NjQgZnJlZV9zcGFjZTsKKworCWZyZWVfc3BhY2UgPSBidHJmc19zdXBlcl90b3RhbF9ieXRlcyhkaXNrX3N1cGVyKTsKKwkvKgorCSAqIHdlIGFsbG93IHRoZSBtZXRhZGF0YSB0byBncm93IHRvIGEgbWF4IG9mIGVpdGhlciA1Z2Igb3IgNSUgb2YgdGhlCisJICogc3BhY2UgaW4gdGhlIHZvbHVtZS4KKwkgKi8KKwltaW5fbWV0YWRhdGEgPSBtaW4oKHU2NCk1ICogMTAyNCAqIDEwMjQgKiAxMDI0LAorCQkJICAgICBkaXY2NF91NjQoZnJlZV9zcGFjZSAqIDUsIDEwMCkpOworCWlmIChpbmZvLT50b3RhbF9ieXRlcyA+PSBtaW5fbWV0YWRhdGEpIHsKKwkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaW5mby0+ZnVsbCkgeworCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCWlmICghaW5mby0+YWxsb2NhdGluZ19jaHVuaykgeworCQlpbmZvLT5mb3JjZV9hbGxvYyA9IDE7CisJCWluZm8tPmFsbG9jYXRpbmdfY2h1bmsgPSAxOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5hbGxvY2F0ZV93YWl0KTsKKwl9IGVsc2UgeworCQl3YWl0ID0gdHJ1ZTsKKwl9CisKKwlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisKKwlpZiAod2FpdCkgeworCQl3YWl0X2V2ZW50KGluZm8tPmFsbG9jYXRlX3dhaXQsCisJCQkgICAhaW5mby0+YWxsb2NhdGluZ19jaHVuayk7CisJCXJldHVybiAxOworCX0KKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJaWYgKCF0cmFucykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBkb19jaHVua19hbGxvYyh0cmFucywgcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsCisJCQkgICAgIDQwOTYgKyAyICogMTAyNCAqIDEwMjQsCisJCQkgICAgIGluZm8tPmZsYWdzLCAwKTsKKwlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0Oworb3V0OgorCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisJaW5mby0+YWxsb2NhdGluZ19jaHVuayA9IDA7CisJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCXdha2VfdXAoJmluZm8tPmFsbG9jYXRlX3dhaXQpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXNlcnZlIG1ldGFkYXRhIHNwYWNlIGZvciBkZWxhbGxvYy4KKyAqLworaW50IGJ0cmZzX3Jlc2VydmVfbWV0YWRhdGFfZm9yX2RlbGFsbG9jKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbnVtX2l0ZW1zKQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqbWV0YV9zaW5mbzsKKwl1NjQgbnVtX2J5dGVzOworCXU2NCB1c2VkOworCXU2NCBhbGxvY190YXJnZXQ7CisJaW50IGZsdXNoZWQgPSAwOworCWludCBmb3JjZV9kZWxhbGxvYzsKKworCS8qIGdldCB0aGUgc3BhY2UgaW5mbyBmb3Igd2hlcmUgdGhlIG1ldGFkYXRhIHdpbGwgbGl2ZSAqLworCWFsbG9jX3RhcmdldCA9IGJ0cmZzX2dldF9hbGxvY19wcm9maWxlKHJvb3QsIDApOworCW1ldGFfc2luZm8gPSBfX2ZpbmRfc3BhY2VfaW5mbyhpbmZvLCBhbGxvY190YXJnZXQpOworCisJbnVtX2J5dGVzID0gY2FsY3VsYXRlX2J5dGVzX25lZWRlZChyb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCwKKwkJCQkJICAgbnVtX2l0ZW1zKTsKIGFnYWluOgogCXNwaW5fbG9jaygmbWV0YV9zaW5mby0+bG9jayk7Ci0JaWYgKCFtZXRhX3NpbmZvLT5mdWxsKQotCQl0aHJlc2ggPSBtZXRhX3NpbmZvLT50b3RhbF9ieXRlcyAqIDgwOwotCWVsc2UKLQkJdGhyZXNoID0gbWV0YV9zaW5mby0+dG90YWxfYnl0ZXMgKiA5NTsKIAotCWRvX2Rpdih0aHJlc2gsIDEwMCk7CisJZm9yY2VfZGVsYWxsb2MgPSBtZXRhX3NpbmZvLT5mb3JjZV9kZWxhbGxvYzsKIAotCWlmIChtZXRhX3NpbmZvLT5ieXRlc191c2VkICsgbWV0YV9zaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKwotCSAgICBtZXRhX3NpbmZvLT5ieXRlc19waW5uZWQgKyBtZXRhX3NpbmZvLT5ieXRlc19yZWFkb25seSA+IHRocmVzaCkgewotCQlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKLQkJaWYgKCFtZXRhX3NpbmZvLT5mdWxsKSB7Ci0JCQltZXRhX3NpbmZvLT5mb3JjZV9hbGxvYyA9IDE7CisJaWYgKHVubGlrZWx5KCFtZXRhX3NpbmZvLT5ieXRlc19yb290KSkKKwkJbWV0YV9zaW5mby0+Ynl0ZXNfcm9vdCA9IGNhbGN1bGF0ZV9ieXRlc19uZWVkZWQocm9vdCwgNik7CisKKwlpZiAoIWZsdXNoZWQpCisJCW1ldGFfc2luZm8tPmJ5dGVzX2RlbGFsbG9jICs9IG51bV9ieXRlczsKKworCXVzZWQgPSBtZXRhX3NpbmZvLT5ieXRlc191c2VkICsgbWV0YV9zaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKworCQltZXRhX3NpbmZvLT5ieXRlc19waW5uZWQgKyBtZXRhX3NpbmZvLT5ieXRlc19yZWFkb25seSArCisJCW1ldGFfc2luZm8tPmJ5dGVzX3N1cGVyICsgbWV0YV9zaW5mby0+Ynl0ZXNfcm9vdCArCisJCW1ldGFfc2luZm8tPmJ5dGVzX21heV91c2UgKyBtZXRhX3NpbmZvLT5ieXRlc19kZWxhbGxvYzsKKworCWlmICh1c2VkID4gbWV0YV9zaW5mby0+dG90YWxfYnl0ZXMpIHsKKwkJZmx1c2hlZCsrOworCisJCWlmIChmbHVzaGVkID09IDEpIHsKKwkJCWlmIChtYXliZV9hbGxvY2F0ZV9jaHVuayhyb290LCBtZXRhX3NpbmZvKSkKKwkJCQlnb3RvIGFnYWluOworCQkJZmx1c2hlZCsrOworCQl9IGVsc2UgewogCQkJc3Bpbl91bmxvY2soJm1ldGFfc2luZm8tPmxvY2spOworCQl9CiAKLQkJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7Ci0JCQlpZiAoIXRyYW5zKQotCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQlyZXQgPSBkb19jaHVua19hbGxvYyh0cmFucywgcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsCi0JCQkJCSAgICAgMiAqIDEwMjQgKiAxMDI0LCBhbGxvY190YXJnZXQsIDApOwotCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwkJaWYgKGZsdXNoZWQgPT0gMikgeworCQkJZmlsZW1hcF9mbHVzaChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCWdvdG8gYWdhaW47CisJCX0gZWxzZSBpZiAoZmx1c2hlZCA9PSAzKSB7CisJCQlmbHVzaF9kZWxhbGxvYyhyb290LCBtZXRhX3NpbmZvKTsKIAkJCWdvdG8gYWdhaW47CiAJCX0KKwkJc3Bpbl9sb2NrKCZtZXRhX3NpbmZvLT5sb2NrKTsKKwkJbWV0YV9zaW5mby0+Ynl0ZXNfZGVsYWxsb2MgLT0gbnVtX2J5dGVzOwogCQlzcGluX3VubG9jaygmbWV0YV9zaW5mby0+bG9jayk7Ci0KLQkJaWYgKCFjb21taXR0ZWQpIHsKLQkJCWNvbW1pdHRlZCA9IDE7Ci0JCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7Ci0JCQlpZiAoIXRyYW5zKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJCWdvdG8gYWdhaW47Ci0JCX0KKwkJcHJpbnRrKEtFUk5fRVJSICJlbm9zcGMsIGhhcyAlZCwgcmVzZXJ2ZWQgJWRcbiIsCisJCSAgICAgICBCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cywKKwkJICAgICAgIEJUUkZTX0koaW5vZGUpLT5yZXNlcnZlZF9leHRlbnRzKTsKKwkJZHVtcF9zcGFjZV9pbmZvKG1ldGFfc2luZm8sIDAsIDApOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CisKKwlCVFJGU19JKGlub2RlKS0+cmVzZXJ2ZWRfZXh0ZW50cysrOworCWNoZWNrX2ZvcmNlX2RlbGFsbG9jKG1ldGFfc2luZm8pOworCXNwaW5fdW5sb2NrKCZtZXRhX3NpbmZvLT5sb2NrKTsKKworCWlmICghZmx1c2hlZCAmJiBmb3JjZV9kZWxhbGxvYykKKwkJZmlsZW1hcF9mbHVzaChpbm9kZS0+aV9tYXBwaW5nKTsKKworCXJldHVybiAwOworfQorCisvKgorICogdW5yZXNlcnZlIG51bV9pdGVtcyBudW1iZXIgb2YgaXRlbXMgd29ydGggb2YgbWV0YWRhdGEgc3BhY2UuICBUaGlzIG5lZWRzIHRvCisgKiBiZSBwYWlyZWQgd2l0aCBidHJmc19yZXNlcnZlX21ldGFkYXRhX3NwYWNlLgorICoKKyAqIE5PVEU6IGlmIHlvdSBoYXZlIHRoZSBvcHRpb24sIHJ1biB0aGlzIF9BRlRFUl8geW91IGRvIGEKKyAqIGJ0cmZzX2VuZF90cmFuc2FjdGlvbiwgc2luY2UgYnRyZnNfZW5kX3RyYW5zYWN0aW9uIHdpbGwgcnVuIGRlbGF5ZWQgcmVmCisgKiBvcHJhdGlvbnMgd2hpY2ggd2lsbCByZXN1bHQgaW4gbW9yZSB1c2VkIG1ldGFkYXRhLCBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZQorICogY2FuIGRvIHRoYXQgd2l0aG91dCBpc3N1ZS4KKyAqLworaW50IGJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IG51bV9pdGVtcykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKm1ldGFfc2luZm87CisJdTY0IG51bV9ieXRlczsKKwl1NjQgYWxsb2NfdGFyZ2V0OworCWJvb2wgYnVnID0gZmFsc2U7CisKKwkvKiBnZXQgdGhlIHNwYWNlIGluZm8gZm9yIHdoZXJlIHRoZSBtZXRhZGF0YSB3aWxsIGxpdmUgKi8KKwlhbGxvY190YXJnZXQgPSBidHJmc19nZXRfYWxsb2NfcHJvZmlsZShyb290LCAwKTsKKwltZXRhX3NpbmZvID0gX19maW5kX3NwYWNlX2luZm8oaW5mbywgYWxsb2NfdGFyZ2V0KTsKKworCW51bV9ieXRlcyA9IGNhbGN1bGF0ZV9ieXRlc19uZWVkZWQocm9vdCwgbnVtX2l0ZW1zKTsKKworCXNwaW5fbG9jaygmbWV0YV9zaW5mby0+bG9jayk7CisJaWYgKG1ldGFfc2luZm8tPmJ5dGVzX21heV91c2UgPCBudW1fYnl0ZXMpIHsKKwkJYnVnID0gdHJ1ZTsKKwkJbWV0YV9zaW5mby0+Ynl0ZXNfbWF5X3VzZSA9IDA7CisJfSBlbHNlIHsKKwkJbWV0YV9zaW5mby0+Ynl0ZXNfbWF5X3VzZSAtPSBudW1fYnl0ZXM7CisJfQorCXNwaW5fdW5sb2NrKCZtZXRhX3NpbmZvLT5sb2NrKTsKKworCUJVR19PTihidWcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXNlcnZlIHNvbWUgbWV0YWRhdGEgc3BhY2UgZm9yIHVzZS4gIFdlJ2xsIGNhbGN1bGF0ZSB0aGUgd29yc3RlIGNhc2UgbnVtYmVyCisgKiBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBtb2RpZnkgbnVtX2l0ZW1zIG51bWJlciBvZiBpdGVtcy4gIElmIHdlCisgKiBoYXZlIHNwYWNlLCBmYW50YXN0aWMsIGlmIG5vdCwgeW91IGdldCAtRU5PU1BDLiAgUGxlYXNlIGNhbGwKKyAqIGJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZSB3aGVuIHlvdSBhcmUgZG9uZSBmb3IgdGhlIF9TQU1FXyBudW1iZXIgb2YKKyAqIGl0ZW1zIHlvdSByZXNlcnZlZCwgc2luY2Ugd2hhdGV2ZXIgbWV0YWRhdGEgeW91IG5lZWRlZCBzaG91bGQgaGF2ZSBhbHJlYWR5CisgKiBiZWVuIGFsbG9jYXRlZC4KKyAqCisgKiBUaGlzIHdpbGwgY29tbWl0IHRoZSB0cmFuc2FjdGlvbiB0byBtYWtlIG1vcmUgc3BhY2UgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2gKKyAqIG1ldGFkYXRhIHNwYWNlLiAgVEhlIG9ubHkgdGltZSB3ZSBkb24ndCBkbyB0aGlzIGlzIGlmIHdlJ3JlIHJlc2VydmluZyBzcGFjZQorICogaW5zaWRlIG9mIGEgdHJhbnNhY3Rpb24sIHRoZW4gd2Ugd2lsbCBqdXN0IHJldHVybiAtRU5PU1BDIGFuZCBpdCBpcyB0aGUKKyAqIGNhbGxlcnMgcmVzcG9uc2liaWxpdHkgdG8gaGFuZGxlIGl0IHByb3Blcmx5LgorICovCitpbnQgYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IG51bV9pdGVtcykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKm1ldGFfc2luZm87CisJdTY0IG51bV9ieXRlczsKKwl1NjQgdXNlZDsKKwl1NjQgYWxsb2NfdGFyZ2V0OworCWludCByZXRyaWVzID0gMDsKKworCS8qIGdldCB0aGUgc3BhY2UgaW5mbyBmb3Igd2hlcmUgdGhlIG1ldGFkYXRhIHdpbGwgbGl2ZSAqLworCWFsbG9jX3RhcmdldCA9IGJ0cmZzX2dldF9hbGxvY19wcm9maWxlKHJvb3QsIDApOworCW1ldGFfc2luZm8gPSBfX2ZpbmRfc3BhY2VfaW5mbyhpbmZvLCBhbGxvY190YXJnZXQpOworCisJbnVtX2J5dGVzID0gY2FsY3VsYXRlX2J5dGVzX25lZWRlZChyb290LCBudW1faXRlbXMpOworYWdhaW46CisJc3Bpbl9sb2NrKCZtZXRhX3NpbmZvLT5sb2NrKTsKKworCWlmICh1bmxpa2VseSghbWV0YV9zaW5mby0+Ynl0ZXNfcm9vdCkpCisJCW1ldGFfc2luZm8tPmJ5dGVzX3Jvb3QgPSBjYWxjdWxhdGVfYnl0ZXNfbmVlZGVkKHJvb3QsIDYpOworCisJaWYgKCFyZXRyaWVzKQorCQltZXRhX3NpbmZvLT5ieXRlc19tYXlfdXNlICs9IG51bV9ieXRlczsKKworCXVzZWQgPSBtZXRhX3NpbmZvLT5ieXRlc191c2VkICsgbWV0YV9zaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKworCQltZXRhX3NpbmZvLT5ieXRlc19waW5uZWQgKyBtZXRhX3NpbmZvLT5ieXRlc19yZWFkb25seSArCisJCW1ldGFfc2luZm8tPmJ5dGVzX3N1cGVyICsgbWV0YV9zaW5mby0+Ynl0ZXNfcm9vdCArCisJCW1ldGFfc2luZm8tPmJ5dGVzX21heV91c2UgKyBtZXRhX3NpbmZvLT5ieXRlc19kZWxhbGxvYzsKKworCWlmICh1c2VkID4gbWV0YV9zaW5mby0+dG90YWxfYnl0ZXMpIHsKKwkJcmV0cmllcysrOworCQlpZiAocmV0cmllcyA9PSAxKSB7CisJCQlpZiAobWF5YmVfYWxsb2NhdGVfY2h1bmsocm9vdCwgbWV0YV9zaW5mbykpCisJCQkJZ290byBhZ2FpbjsKKwkJCXJldHJpZXMrKzsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrKCZtZXRhX3NpbmZvLT5sb2NrKTsKKwkJfQorCisJCWlmIChyZXRyaWVzID09IDIpIHsKKwkJCWZsdXNoX2RlbGFsbG9jKHJvb3QsIG1ldGFfc2luZm8pOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlzcGluX2xvY2soJm1ldGFfc2luZm8tPmxvY2spOworCQltZXRhX3NpbmZvLT5ieXRlc19tYXlfdXNlIC09IG51bV9ieXRlczsKKwkJc3Bpbl91bmxvY2soJm1ldGFfc2luZm8tPmxvY2spOworCisJCWR1bXBfc3BhY2VfaW5mbyhtZXRhX3NpbmZvLCAwLCAwKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJY2hlY2tfZm9yY2VfZGVsYWxsb2MobWV0YV9zaW5mbyk7CiAJc3Bpbl91bmxvY2soJm1ldGFfc2luZm8tPmxvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0yNzY1LDEzICszMjI1LDE2IEBACiAJYnl0ZXMgPSAoYnl0ZXMgKyByb290LT5zZWN0b3JzaXplIC0gMSkgJiB+KCh1NjQpcm9vdC0+c2VjdG9yc2l6ZSAtIDEpOwogCiAJZGF0YV9zaW5mbyA9IEJUUkZTX0koaW5vZGUpLT5zcGFjZV9pbmZvOworCWlmICghZGF0YV9zaW5mbykKKwkJZ290byBhbGxvYzsKKwogYWdhaW46CiAJLyogbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIHRvIGhhbmRsZSB0aGUgZGF0YSBmaXJzdCAqLwogCXNwaW5fbG9jaygmZGF0YV9zaW5mby0+bG9jayk7CiAJaWYgKGRhdGFfc2luZm8tPnRvdGFsX2J5dGVzIC0gZGF0YV9zaW5mby0+Ynl0ZXNfdXNlZCAtCiAJICAgIGRhdGFfc2luZm8tPmJ5dGVzX2RlbGFsbG9jIC0gZGF0YV9zaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgLQogCSAgICBkYXRhX3NpbmZvLT5ieXRlc19waW5uZWQgLSBkYXRhX3NpbmZvLT5ieXRlc19yZWFkb25seSAtCi0JICAgIGRhdGFfc2luZm8tPmJ5dGVzX21heV91c2UgPCBieXRlcykgeworCSAgICBkYXRhX3NpbmZvLT5ieXRlc19tYXlfdXNlIC0gZGF0YV9zaW5mby0+Ynl0ZXNfc3VwZXIgPCBieXRlcykgewogCQlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKIAogCQkvKgpAQCAtMjc4Myw3ICszMjQ2LDcgQEAKIAogCQkJZGF0YV9zaW5mby0+Zm9yY2VfYWxsb2MgPSAxOwogCQkJc3Bpbl91bmxvY2soJmRhdGFfc2luZm8tPmxvY2spOwotCithbGxvYzoKIAkJCWFsbG9jX3RhcmdldCA9IGJ0cmZzX2dldF9hbGxvY19wcm9maWxlKHJvb3QsIDEpOwogCQkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKIAkJCWlmICghdHJhbnMpCkBAIC0yNzk1LDEyICszMjU4LDE3IEBACiAJCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OworCisJCQlpZiAoIWRhdGFfc2luZm8pIHsKKwkJCQlidHJmc19zZXRfaW5vZGVfc3BhY2VfaW5mbyhyb290LCBpbm9kZSk7CisJCQkJZGF0YV9zaW5mbyA9IEJUUkZTX0koaW5vZGUpLT5zcGFjZV9pbmZvOworCQkJfQogCQkJZ290byBhZ2FpbjsKIAkJfQogCQlzcGluX3VubG9jaygmZGF0YV9zaW5mby0+bG9jayk7CiAKIAkJLyogY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCB0cnkgYWdhaW4gKi8KLQkJaWYgKCFjb21taXR0ZWQpIHsKKwkJaWYgKCFjb21taXR0ZWQgJiYgIXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpIHsKIAkJCWNvbW1pdHRlZCA9IDE7CiAJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CiAJCQlpZiAoIXRyYW5zKQpAQCAtMjgyOCw3ICszMjk2LDcgQEAKIAlCVFJGU19JKGlub2RlKS0+cmVzZXJ2ZWRfYnl0ZXMgKz0gYnl0ZXM7CiAJc3Bpbl91bmxvY2soJmRhdGFfc2luZm8tPmxvY2spOwogCi0JcmV0dXJuIGJ0cmZzX2NoZWNrX21ldGFkYXRhX2ZyZWVfc3BhY2Uocm9vdCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yOTI3LDE3ICszMzk1LDE1IEBACiAJQlVHX09OKCFzcGFjZV9pbmZvKTsKIAogCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7Ci0JaWYgKHNwYWNlX2luZm8tPmZvcmNlX2FsbG9jKSB7CisJaWYgKHNwYWNlX2luZm8tPmZvcmNlX2FsbG9jKQogCQlmb3JjZSA9IDE7Ci0JCXNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID0gMDsKLQl9CiAJaWYgKHNwYWNlX2luZm8tPmZ1bGwpIHsKIAkJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOwogCQlnb3RvIG91dDsKIAl9CiAKIAl0aHJlc2ggPSBzcGFjZV9pbmZvLT50b3RhbF9ieXRlcyAtIHNwYWNlX2luZm8tPmJ5dGVzX3JlYWRvbmx5OwotCXRocmVzaCA9IGRpdl9mYWN0b3IodGhyZXNoLCA2KTsKKwl0aHJlc2ggPSBkaXZfZmFjdG9yKHRocmVzaCwgOCk7CiAJaWYgKCFmb3JjZSAmJgogCSAgIChzcGFjZV9pbmZvLT5ieXRlc191c2VkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkICsKIAkgICAgc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKyBhbGxvY19ieXRlcykgPCB0aHJlc2gpIHsKQEAgLTI5NTEsNyArMzQxNyw3IEBACiAJICogd2Uga2VlcCBhIHJlYXNvbmFibGUgbnVtYmVyIG9mIG1ldGFkYXRhIGNodW5rcyBhbGxvY2F0ZWQgaW4gdGhlCiAJICogRlMgYXMgd2VsbC4KIAkgKi8KLQlpZiAoZmxhZ3MgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSB7CisJaWYgKGZsYWdzICYgQlRSRlNfQkxPQ0tfR1JPVVBfREFUQSAmJiBmc19pbmZvLT5tZXRhZGF0YV9yYXRpbykgewogCQlmc19pbmZvLT5kYXRhX2NodW5rX2FsbG9jYXRpb25zKys7CiAJCWlmICghKGZzX2luZm8tPmRhdGFfY2h1bmtfYWxsb2NhdGlvbnMgJQogCQkgICAgICBmc19pbmZvLT5tZXRhZGF0YV9yYXRpbykpCkBAIC0yOTU5LDggKzM0MjUsMTEgQEAKIAl9CiAKIAlyZXQgPSBidHJmc19hbGxvY19jaHVuayh0cmFucywgZXh0ZW50X3Jvb3QsIGZsYWdzKTsKKwlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOwogCWlmIChyZXQpCiAJCXNwYWNlX2luZm8tPmZ1bGwgPSAxOworCXNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID0gMDsKKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZleHRlbnRfcm9vdC0+ZnNfaW5mby0+Y2h1bmtfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0zMDA5LDEwICszNDc4LDEyIEBACiAJCW51bV9ieXRlcyA9IG1pbih0b3RhbCwgY2FjaGUtPmtleS5vZmZzZXQgLSBieXRlX2luX2dyb3VwKTsKIAkJaWYgKGFsbG9jKSB7CiAJCQlvbGRfdmFsICs9IG51bV9ieXRlczsKKwkJCWJ0cmZzX3NldF9ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSwgb2xkX3ZhbCk7CisJCQljYWNoZS0+cmVzZXJ2ZWQgLT0gbnVtX2J5dGVzOwogCQkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3VzZWQgKz0gbnVtX2J5dGVzOworCQkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkIC09IG51bV9ieXRlczsKIAkJCWlmIChjYWNoZS0+cm8pCiAJCQkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3JlYWRvbmx5IC09IG51bV9ieXRlczsKLQkJCWJ0cmZzX3NldF9ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSwgb2xkX3ZhbCk7CiAJCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwogCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKIAkJfSBlbHNlIHsKQEAgLTMwNTcsMTI3ICszNTI4LDEzNiBAQAogCXJldHVybiBieXRlbnI7CiB9CiAKLWludCBidHJmc191cGRhdGVfcGlubmVkX2V4dGVudHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJdTY0IGJ5dGVuciwgdTY0IG51bSwgaW50IHBpbikKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGhpbiB0cmFuc2FjdGlvbgorICovCitpbnQgYnRyZnNfcGluX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgICB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZWQpCiB7Ci0JdTY0IGxlbjsKLQlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOwogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOwogCi0JaWYgKHBpbikKLQkJc2V0X2V4dGVudF9kaXJ0eSgmZnNfaW5mby0+cGlubmVkX2V4dGVudHMsCi0JCQkJYnl0ZW5yLCBieXRlbnIgKyBudW0gLSAxLCBHRlBfTk9GUyk7CisJY2FjaGUgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAoZnNfaW5mbywgYnl0ZW5yKTsKKwlCVUdfT04oIWNhY2hlKTsKIAotCXdoaWxlIChudW0gPiAwKSB7Ci0JCWNhY2hlID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKGZzX2luZm8sIGJ5dGVucik7Ci0JCUJVR19PTighY2FjaGUpOwotCQlsZW4gPSBtaW4obnVtLCBjYWNoZS0+a2V5Lm9mZnNldCAtCi0JCQkgIChieXRlbnIgLSBjYWNoZS0+a2V5Lm9iamVjdGlkKSk7Ci0JCWlmIChwaW4pIHsKLQkJCXNwaW5fbG9jaygmY2FjaGUtPnNwYWNlX2luZm8tPmxvY2spOwotCQkJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7Ci0JCQljYWNoZS0+cGlubmVkICs9IGxlbjsKLQkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19waW5uZWQgKz0gbGVuOwotCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKLQkJCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7Ci0JCQlmc19pbmZvLT50b3RhbF9waW5uZWQgKz0gbGVuOwotCQl9IGVsc2UgewotCQkJaW50IHVucGluID0gMDsKLQotCQkJLyoKLQkJCSAqIGluIG9yZGVyIHRvIG5vdCByYWNlIHdpdGggdGhlIGJsb2NrIGdyb3VwIGNhY2hpbmcsIHdlCi0JCQkgKiBvbmx5IHdhbnQgdG8gdW5waW4gdGhlIGV4dGVudCBpZiB3ZSBhcmUgY2FjaGVkLiAgSWYKLQkJCSAqIHdlIGFyZW4ndCBjYWNoZWQsIHdlIHdhbnQgdG8gc3RhcnQgYXN5bmMgY2FjaGluZyB0aGlzCi0JCQkgKiBibG9jayBncm91cCBzbyB3ZSBjYW4gZnJlZSB0aGUgZXh0ZW50IHRoZSBuZXh0IHRpbWUKLQkJCSAqIGFyb3VuZC4KLQkJCSAqLwotCQkJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7Ci0JCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKLQkJCXVucGluID0gKGNhY2hlLT5jYWNoZWQgPT0gQlRSRlNfQ0FDSEVfRklOSVNIRUQpOwotCQkJaWYgKGxpa2VseSh1bnBpbikpIHsKLQkJCQljYWNoZS0+cGlubmVkIC09IGxlbjsKLQkJCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkIC09IGxlbjsKLQkJCQlmc19pbmZvLT50b3RhbF9waW5uZWQgLT0gbGVuOwotCQkJfQotCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKLQkJCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7Ci0KLQkJCWlmIChsaWtlbHkodW5waW4pKQotCQkJCWNsZWFyX2V4dGVudF9kaXJ0eSgmZnNfaW5mby0+cGlubmVkX2V4dGVudHMsCi0JCQkJCQkgICBieXRlbnIsIGJ5dGVuciArIGxlbiAtMSwKLQkJCQkJCSAgIEdGUF9OT0ZTKTsKLQkJCWVsc2UKLQkJCQljYWNoZV9ibG9ja19ncm91cChjYWNoZSk7Ci0KLQkJCWlmICh1bnBpbikKLQkJCQlidHJmc19hZGRfZnJlZV9zcGFjZShjYWNoZSwgYnl0ZW5yLCBsZW4pOwotCQl9Ci0JCWJ0cmZzX3B1dF9ibG9ja19ncm91cChjYWNoZSk7Ci0JCWJ5dGVuciArPSBsZW47Ci0JCW51bSAtPSBsZW47CisJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CisJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJY2FjaGUtPnBpbm5lZCArPSBudW1fYnl0ZXM7CisJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3Bpbm5lZCArPSBudW1fYnl0ZXM7CisJaWYgKHJlc2VydmVkKSB7CisJCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CiAJfQorCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJc3Bpbl91bmxvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKKworCWJ0cmZzX3B1dF9ibG9ja19ncm91cChjYWNoZSk7CisKKwlzZXRfZXh0ZW50X2RpcnR5KGZzX2luZm8tPnBpbm5lZF9leHRlbnRzLAorCQkJIGJ5dGVuciwgYnl0ZW5yICsgbnVtX2J5dGVzIC0gMSwgR0ZQX05PRlMpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVwZGF0ZV9yZXNlcnZlZF9leHRlbnRzKHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJCSAgIHU2NCBieXRlbnIsIHU2NCBudW0sIGludCByZXNlcnZlKQorc3RhdGljIGludCB1cGRhdGVfcmVzZXJ2ZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgIHU2NCBudW1fYnl0ZXMsIGludCByZXNlcnZlKQogewotCXU2NCBsZW47Ci0Jc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZTsKLQlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CisJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJaWYgKHJlc2VydmUpIHsKKwkJY2FjaGUtPnJlc2VydmVkICs9IG51bV9ieXRlczsKKwkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICs9IG51bV9ieXRlczsKKwl9IGVsc2UgeworCQljYWNoZS0+cmVzZXJ2ZWQgLT0gbnVtX2J5dGVzOworCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgLT0gbnVtX2J5dGVzOworCX0KKwlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CisJcmV0dXJuIDA7Cit9CiAKLQl3aGlsZSAobnVtID4gMCkgewotCQljYWNoZSA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChmc19pbmZvLCBieXRlbnIpOwotCQlCVUdfT04oIWNhY2hlKTsKLQkJbGVuID0gbWluKG51bSwgY2FjaGUtPmtleS5vZmZzZXQgLQotCQkJICAoYnl0ZW5yIC0gY2FjaGUtPmtleS5vYmplY3RpZCkpOworaW50IGJ0cmZzX3ByZXBhcmVfZXh0ZW50X2NvbW1pdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX2NhY2hpbmdfY29udHJvbCAqbmV4dDsKKwlzdHJ1Y3QgYnRyZnNfY2FjaGluZ19jb250cm9sICpjYWNoaW5nX2N0bDsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOworCisJZG93bl93cml0ZSgmZnNfaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNhY2hpbmdfY3RsLCBuZXh0LAorCQkJCSAmZnNfaW5mby0+Y2FjaGluZ19ibG9ja19ncm91cHMsIGxpc3QpIHsKKwkJY2FjaGUgPSBjYWNoaW5nX2N0bC0+YmxvY2tfZ3JvdXA7CisJCWlmIChibG9ja19ncm91cF9jYWNoZV9kb25lKGNhY2hlKSkgeworCQkJY2FjaGUtPmxhc3RfYnl0ZV90b191bnBpbiA9ICh1NjQpLTE7CisJCQlsaXN0X2RlbF9pbml0KCZjYWNoaW5nX2N0bC0+bGlzdCk7CisJCQlwdXRfY2FjaGluZ19jb250cm9sKGNhY2hpbmdfY3RsKTsKKwkJfSBlbHNlIHsKKwkJCWNhY2hlLT5sYXN0X2J5dGVfdG9fdW5waW4gPSBjYWNoaW5nX2N0bC0+cHJvZ3Jlc3M7CisJCX0KKwl9CisKKwlpZiAoZnNfaW5mby0+cGlubmVkX2V4dGVudHMgPT0gJmZzX2luZm8tPmZyZWVkX2V4dGVudHNbMF0pCisJCWZzX2luZm8tPnBpbm5lZF9leHRlbnRzID0gJmZzX2luZm8tPmZyZWVkX2V4dGVudHNbMV07CisJZWxzZQorCQlmc19pbmZvLT5waW5uZWRfZXh0ZW50cyA9ICZmc19pbmZvLT5mcmVlZF9leHRlbnRzWzBdOworCisJdXBfd3JpdGUoJmZzX2luZm8tPmV4dGVudF9jb21taXRfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bnBpbl9leHRlbnRfcmFuZ2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSA9IE5VTEw7CisJdTY0IGxlbjsKKworCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKKwkJaWYgKCFjYWNoZSB8fAorCQkgICAgc3RhcnQgPj0gY2FjaGUtPmtleS5vYmplY3RpZCArIGNhY2hlLT5rZXkub2Zmc2V0KSB7CisJCQlpZiAoY2FjaGUpCisJCQkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGNhY2hlKTsKKwkJCWNhY2hlID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKGZzX2luZm8sIHN0YXJ0KTsKKwkJCUJVR19PTighY2FjaGUpOworCQl9CisKKwkJbGVuID0gY2FjaGUtPmtleS5vYmplY3RpZCArIGNhY2hlLT5rZXkub2Zmc2V0IC0gc3RhcnQ7CisJCWxlbiA9IG1pbihsZW4sIGVuZCArIDEgLSBzdGFydCk7CisKKwkJaWYgKHN0YXJ0IDwgY2FjaGUtPmxhc3RfYnl0ZV90b191bnBpbikgeworCQkJbGVuID0gbWluKGxlbiwgY2FjaGUtPmxhc3RfYnl0ZV90b191bnBpbiAtIHN0YXJ0KTsKKwkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGNhY2hlLCBzdGFydCwgbGVuKTsKKwkJfQogCiAJCXNwaW5fbG9jaygmY2FjaGUtPnNwYWNlX2luZm8tPmxvY2spOwogCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKLQkJaWYgKHJlc2VydmUpIHsKLQkJCWNhY2hlLT5yZXNlcnZlZCArPSBsZW47Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbGVuOwotCQl9IGVsc2UgewotCQkJY2FjaGUtPnJlc2VydmVkIC09IGxlbjsKLQkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBsZW47Ci0JCX0KKwkJY2FjaGUtPnBpbm5lZCAtPSBsZW47CisJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19waW5uZWQgLT0gbGVuOwogCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwogCQlzcGluX3VubG9jaygmY2FjaGUtPnNwYWNlX2luZm8tPmxvY2spOworCisJCXN0YXJ0ICs9IGxlbjsKKwl9CisKKwlpZiAoY2FjaGUpCiAJCWJ0cmZzX3B1dF9ibG9ja19ncm91cChjYWNoZSk7Ci0JCWJ5dGVuciArPSBsZW47Ci0JCW51bSAtPSBsZW47Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgYnRyZnNfY29weV9waW5uZWQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqY29weSkKLXsKLQl1NjQgbGFzdCA9IDA7Ci0JdTY0IHN0YXJ0OwotCXU2NCBlbmQ7Ci0Jc3RydWN0IGV4dGVudF9pb190cmVlICpwaW5uZWRfZXh0ZW50cyA9ICZyb290LT5mc19pbmZvLT5waW5uZWRfZXh0ZW50czsKLQlpbnQgcmV0OwotCi0Jd2hpbGUgKDEpIHsKLQkJcmV0ID0gZmluZF9maXJzdF9leHRlbnRfYml0KHBpbm5lZF9leHRlbnRzLCBsYXN0LAotCQkJCQkgICAgJnN0YXJ0LCAmZW5kLCBFWFRFTlRfRElSVFkpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0KLQkJc2V0X2V4dGVudF9kaXJ0eShjb3B5LCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7Ci0JCWxhc3QgPSBlbmQgKyAxOwotCX0KIAlyZXR1cm4gMDsKIH0KIAogaW50IGJ0cmZzX2ZpbmlzaF9leHRlbnRfY29tbWl0KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJICAgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdW5waW4pCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByb290LT5mc19pbmZvOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdW5waW47CiAJdTY0IHN0YXJ0OwogCXU2NCBlbmQ7CiAJaW50IHJldDsKIAorCWlmIChmc19pbmZvLT5waW5uZWRfZXh0ZW50cyA9PSAmZnNfaW5mby0+ZnJlZWRfZXh0ZW50c1swXSkKKwkJdW5waW4gPSAmZnNfaW5mby0+ZnJlZWRfZXh0ZW50c1sxXTsKKwllbHNlCisJCXVucGluID0gJmZzX2luZm8tPmZyZWVkX2V4dGVudHNbMF07CisKIAl3aGlsZSAoMSkgewogCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQodW5waW4sIDAsICZzdGFydCwgJmVuZCwKIAkJCQkJICAgIEVYVEVOVF9ESVJUWSk7CkBAIC0zMTg2LDEwICszNjY2LDggQEAKIAogCQlyZXQgPSBidHJmc19kaXNjYXJkX2V4dGVudChyb290LCBzdGFydCwgZW5kICsgMSAtIHN0YXJ0KTsKIAotCQkvKiB1bmxvY2tzIHRoZSBwaW5uZWQgbXV0ZXggKi8KLQkJYnRyZnNfdXBkYXRlX3Bpbm5lZF9leHRlbnRzKHJvb3QsIHN0YXJ0LCBlbmQgKyAxIC0gc3RhcnQsIDApOwogCQljbGVhcl9leHRlbnRfZGlydHkodW5waW4sIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKLQorCQl1bnBpbl9leHRlbnRfcmFuZ2Uocm9vdCwgc3RhcnQsIGVuZCk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIApAQCAtMzE5OSw3ICszNjc3LDggQEAKIHN0YXRpYyBpbnQgcGluX2Rvd25fYnl0ZXMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKLQkJCSAgdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcywgaW50IGlzX2RhdGEsCisJCQkgIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsCisJCQkgIGludCBpc19kYXRhLCBpbnQgcmVzZXJ2ZWQsCiAJCQkgIHN0cnVjdCBleHRlbnRfYnVmZmVyICoqbXVzdF9jbGVhbikKIHsKIAlpbnQgZXJyID0gMDsKQEAgLTMyMDgsNiArMzY4NywxNCBAQAogCWlmIChpc19kYXRhKQogCQlnb3RvIHBpbml0OwogCisJLyoKKwkgKiBkaXNjYXJkIGlzIHNsb29vb3csIGFuZCBzbyB0cmlnZ2VyaW5nIGRpc2NhcmRzIG9uCisJICogaW5kaXZpZHVhbCBidHJlZSBibG9ja3MgaXNuJ3QgYSBnb29kIHBsYW4uICBKdXN0CisJICogcGluIGV2ZXJ5dGhpbmcgaW4gZGlzY2FyZCBtb2RlLgorCSAqLworCWlmIChidHJmc190ZXN0X29wdChyb290LCBESVNDQVJEKSkKKwkJZ290byBwaW5pdDsKKwogCWJ1ZiA9IGJ0cmZzX2ZpbmRfdHJlZV9ibG9jayhyb290LCBieXRlbnIsIG51bV9ieXRlcyk7CiAJaWYgKCFidWYpCiAJCWdvdG8gcGluaXQ7CkBAIC0zMjMxLDE1ICszNzE4LDE1IEBACiAJfQogCWZyZWVfZXh0ZW50X2J1ZmZlcihidWYpOwogcGluaXQ6Ci0JYnRyZnNfc2V0X3BhdGhfYmxvY2tpbmcocGF0aCk7CisJaWYgKHBhdGgpCisJCWJ0cmZzX3NldF9wYXRoX2Jsb2NraW5nKHBhdGgpOwogCS8qIHVubG9ja3MgdGhlIHBpbm5lZCBtdXRleCAqLwotCWJ0cmZzX3VwZGF0ZV9waW5uZWRfZXh0ZW50cyhyb290LCBieXRlbnIsIG51bV9ieXRlcywgMSk7CisJYnRyZnNfcGluX2V4dGVudChyb290LCBieXRlbnIsIG51bV9ieXRlcywgcmVzZXJ2ZWQpOwogCiAJQlVHX09OKGVyciA8IDApOwogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgX19idHJmc19mcmVlX2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQl1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLCB1NjQgcGFyZW50LApAQCAtMzQxMyw3ICszOTAwLDcgQEAKIAkJfQogCiAJCXJldCA9IHBpbl9kb3duX2J5dGVzKHRyYW5zLCByb290LCBwYXRoLCBieXRlbnIsCi0JCQkJICAgICBudW1fYnl0ZXMsIGlzX2RhdGEsICZtdXN0X2NsZWFuKTsKKwkJCQkgICAgIG51bV9ieXRlcywgaXNfZGF0YSwgMCwgJm11c3RfY2xlYW4pOwogCQlpZiAocmV0ID4gMCkKIAkJCW1hcmtfZnJlZSA9IDE7CiAJCUJVR19PTihyZXQgPCAwKTsKQEAgLTM1NDQsOCArNDAzMSw3IEBACiAJaWYgKHJvb3Rfb2JqZWN0aWQgPT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpIHsKIAkJV0FSTl9PTihvd25lciA+PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKTsKIAkJLyogdW5sb2NrcyB0aGUgcGlubmVkIG11dGV4ICovCi0JCWJ0cmZzX3VwZGF0ZV9waW5uZWRfZXh0ZW50cyhyb290LCBieXRlbnIsIG51bV9ieXRlcywgMSk7Ci0JCXVwZGF0ZV9yZXNlcnZlZF9leHRlbnRzKHJvb3QsIGJ5dGVuciwgbnVtX2J5dGVzLCAwKTsKKwkJYnRyZnNfcGluX2V4dGVudChyb290LCBieXRlbnIsIG51bV9ieXRlcywgMSk7CiAJCXJldCA9IDA7CiAJfSBlbHNlIGlmIChvd25lciA8IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpIHsKIAkJcmV0ID0gYnRyZnNfYWRkX2RlbGF5ZWRfdHJlZV9yZWYodHJhbnMsIGJ5dGVuciwgbnVtX2J5dGVzLApAQCAtMzU4NSwxOSArNDA3MSwzMyBAQAogd2FpdF9ibG9ja19ncm91cF9jYWNoZV9wcm9ncmVzcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAogCQkJCXU2NCBudW1fYnl0ZXMpCiB7CisJc3RydWN0IGJ0cmZzX2NhY2hpbmdfY29udHJvbCAqY2FjaGluZ19jdGw7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAKLQlwcmVwYXJlX3RvX3dhaXQoJmNhY2hlLT5jYWNoaW5nX3EsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0KLQlpZiAoYmxvY2tfZ3JvdXBfY2FjaGVfZG9uZShjYWNoZSkpIHsKLQkJZmluaXNoX3dhaXQoJmNhY2hlLT5jYWNoaW5nX3EsICZ3YWl0KTsKKwljYWNoaW5nX2N0bCA9IGdldF9jYWNoaW5nX2NvbnRyb2woY2FjaGUpOworCWlmICghY2FjaGluZ19jdGwpCiAJCXJldHVybiAwOwotCX0KLQlzY2hlZHVsZSgpOwotCWZpbmlzaF93YWl0KCZjYWNoZS0+Y2FjaGluZ19xLCAmd2FpdCk7CiAKLQl3YWl0X2V2ZW50KGNhY2hlLT5jYWNoaW5nX3EsIGJsb2NrX2dyb3VwX2NhY2hlX2RvbmUoY2FjaGUpIHx8CisJd2FpdF9ldmVudChjYWNoaW5nX2N0bC0+d2FpdCwgYmxvY2tfZ3JvdXBfY2FjaGVfZG9uZShjYWNoZSkgfHwKIAkJICAgKGNhY2hlLT5mcmVlX3NwYWNlID49IG51bV9ieXRlcykpOworCisJcHV0X2NhY2hpbmdfY29udHJvbChjYWNoaW5nX2N0bCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQKK3dhaXRfYmxvY2tfZ3JvdXBfY2FjaGVfZG9uZShzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlKQoreworCXN0cnVjdCBidHJmc19jYWNoaW5nX2NvbnRyb2wgKmNhY2hpbmdfY3RsOworCURFRklORV9XQUlUKHdhaXQpOworCisJY2FjaGluZ19jdGwgPSBnZXRfY2FjaGluZ19jb250cm9sKGNhY2hlKTsKKwlpZiAoIWNhY2hpbmdfY3RsKQorCQlyZXR1cm4gMDsKKworCXdhaXRfZXZlbnQoY2FjaGluZ19jdGwtPndhaXQsIGJsb2NrX2dyb3VwX2NhY2hlX2RvbmUoY2FjaGUpKTsKKworCXB1dF9jYWNoaW5nX2NvbnRyb2woY2FjaGluZ19jdGwpOwogCXJldHVybiAwOwogfQogCkBAIC0zNjM1LDYgKzQxMzUsOCBAQAogCWludCBsYXN0X3B0cl9sb29wID0gMDsKIAlpbnQgbG9vcCA9IDA7CiAJYm9vbCBmb3VuZF91bmNhY2hlZF9iZyA9IGZhbHNlOworCWJvb2wgZmFpbGVkX2NsdXN0ZXJfcmVmaWxsID0gZmFsc2U7CisJYm9vbCBmYWlsZWRfYWxsb2MgPSBmYWxzZTsKIAogCVdBUk5fT04obnVtX2J5dGVzIDwgcm9vdC0+c2VjdG9yc2l6ZSk7CiAJYnRyZnNfc2V0X2tleV90eXBlKGlucywgQlRSRlNfRVhURU5UX0lURU1fS0VZKTsKQEAgLTM3MzIsNyArNDIzNCwxNiBAQAogCQlpZiAodW5saWtlbHkoYmxvY2tfZ3JvdXAtPnJvKSkKIAkJCWdvdG8gbG9vcDsKIAotCQlpZiAobGFzdF9wdHIpIHsKKwkJLyoKKwkJICogT2sgd2Ugd2FudCB0byB0cnkgYW5kIHVzZSB0aGUgY2x1c3RlciBhbGxvY2F0b3IsIHNvIGxldHMgbG9vaworCQkgKiB0aGVyZSwgdW5sZXNzIHdlIGFyZSBvbiBMT09QX05PX0VNUFRZX1NJWkUsIHNpbmNlIHdlIHdpbGwKKwkJICogaGF2ZSB0cmllZCB0aGUgY2x1c3RlciBhbGxvY2F0b3IgcGxlbnR5IG9mIHRpbWVzIGF0IHRoaXMKKwkJICogcG9pbnQgYW5kIG5vdCBoYXZlIGZvdW5kIGFueXRoaW5nLCBzbyB3ZSBhcmUgbGlrZWx5IHdheSB0b28KKwkJICogZnJhZ21lbnRlZCBmb3IgdGhlIGNsdXN0ZXJpbmcgc3R1ZmYgdG8gZmluZCBhbnl0aGluZywgc28gbGV0cworCQkgKiBqdXN0IHNraXAgaXQgYW5kIGxldCB0aGUgYWxsb2NhdG9yIGZpbmQgd2hhdGV2ZXIgYmxvY2sgaXQgY2FuCisJCSAqIGZpbmQKKwkJICovCisJCWlmIChsYXN0X3B0ciAmJiBsb29wIDwgTE9PUF9OT19FTVBUWV9TSVpFKSB7CiAJCQkvKgogCQkJICogdGhlIHJlZmlsbCBsb2NrIGtlZXBzIG91dCBvdGhlcgogCQkJICogcGVvcGxlIHRyeWluZyB0byBzdGFydCBhIG5ldyBjbHVzdGVyCkBAIC0zODA3LDkgKzQzMTgsMTEgQEAKIAkJCQkJc3Bpbl91bmxvY2soJmxhc3RfcHRyLT5yZWZpbGxfbG9jayk7CiAJCQkJCWdvdG8gY2hlY2tzOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoIWNhY2hlZCAmJiBsb29wID4gTE9PUF9DQUNISU5HX05PV0FJVCkgeworCQkJfSBlbHNlIGlmICghY2FjaGVkICYmIGxvb3AgPiBMT09QX0NBQ0hJTkdfTk9XQUlUCisJCQkJICAgJiYgIWZhaWxlZF9jbHVzdGVyX3JlZmlsbCkgewogCQkJCXNwaW5fdW5sb2NrKCZsYXN0X3B0ci0+cmVmaWxsX2xvY2spOwogCisJCQkJZmFpbGVkX2NsdXN0ZXJfcmVmaWxsID0gdHJ1ZTsKIAkJCQl3YWl0X2Jsb2NrX2dyb3VwX2NhY2hlX3Byb2dyZXNzKGJsb2NrX2dyb3VwLAogCQkJCSAgICAgICBudW1fYnl0ZXMgKyBlbXB0eV9jbHVzdGVyICsgZW1wdHlfc2l6ZSk7CiAJCQkJZ290byBoYXZlX2Jsb2NrX2dyb3VwOwpAQCAtMzgyMSwyNSArNDMzNCwzMCBAQAogCQkJICogY2x1c3Rlci4gIEZyZWUgdGhlIGNsdXN0ZXIgd2UndmUgYmVlbiB0cnlpbmcKIAkJCSAqIHRvIHVzZSwgYW5kIGdvIHRvIHRoZSBuZXh0IGJsb2NrIGdyb3VwCiAJCQkgKi8KLQkJCWlmIChsb29wIDwgTE9PUF9OT19FTVBUWV9TSVpFKSB7Ci0JCQkJYnRyZnNfcmV0dXJuX2NsdXN0ZXJfdG9fZnJlZV9zcGFjZShOVUxMLAotCQkJCQkJCQkgICBsYXN0X3B0cik7Ci0JCQkJc3Bpbl91bmxvY2soJmxhc3RfcHRyLT5yZWZpbGxfbG9jayk7Ci0JCQkJZ290byBsb29wOwotCQkJfQorCQkJYnRyZnNfcmV0dXJuX2NsdXN0ZXJfdG9fZnJlZV9zcGFjZShOVUxMLCBsYXN0X3B0cik7CiAJCQlzcGluX3VubG9jaygmbGFzdF9wdHItPnJlZmlsbF9sb2NrKTsKKwkJCWdvdG8gbG9vcDsKIAkJfQogCiAJCW9mZnNldCA9IGJ0cmZzX2ZpbmRfc3BhY2VfZm9yX2FsbG9jKGJsb2NrX2dyb3VwLCBzZWFyY2hfc3RhcnQsCiAJCQkJCQkgICAgbnVtX2J5dGVzLCBlbXB0eV9zaXplKTsKLQkJaWYgKCFvZmZzZXQgJiYgKGNhY2hlZCB8fCAoIWNhY2hlZCAmJgotCQkJCQkgICBsb29wID09IExPT1BfQ0FDSElOR19OT1dBSVQpKSkgewotCQkJZ290byBsb29wOwotCQl9IGVsc2UgaWYgKCFvZmZzZXQgJiYgKCFjYWNoZWQgJiYKLQkJCQkgICAgICAgbG9vcCA+IExPT1BfQ0FDSElOR19OT1dBSVQpKSB7CisJCS8qCisJCSAqIElmIHdlIGRpZG4ndCBmaW5kIGEgY2h1bmssIGFuZCB3ZSBoYXZlbid0IGZhaWxlZCBvbiB0aGlzCisJCSAqIGJsb2NrIGdyb3VwIGJlZm9yZSwgYW5kIHRoaXMgYmxvY2sgZ3JvdXAgaXMgaW4gdGhlIG1pZGRsZSBvZgorCQkgKiBjYWNoaW5nIGFuZCB3ZSBhcmUgb2sgd2l0aCB3YWl0aW5nLCB0aGVuIGdvIGFoZWFkIGFuZCB3YWl0CisJCSAqIGZvciBwcm9ncmVzcyB0byBiZSBtYWRlLCBhbmQgc2V0IGZhaWxlZF9hbGxvYyB0byB0cnVlLgorCQkgKgorCQkgKiBJZiBmYWlsZWRfYWxsb2MgaXMgdHJ1ZSB0aGVuIHdlJ3ZlIGFscmVhZHkgd2FpdGVkIG9uIHRoaXMKKwkJICogYmxvY2sgZ3JvdXAgb25jZSBhbmQgc2hvdWxkIG1vdmUgb24gdG8gdGhlIG5leHQgYmxvY2sgZ3JvdXAuCisJCSAqLworCQlpZiAoIW9mZnNldCAmJiAhZmFpbGVkX2FsbG9jICYmICFjYWNoZWQgJiYKKwkJICAgIGxvb3AgPiBMT09QX0NBQ0hJTkdfTk9XQUlUKSB7CiAJCQl3YWl0X2Jsb2NrX2dyb3VwX2NhY2hlX3Byb2dyZXNzKGJsb2NrX2dyb3VwLAotCQkJCQludW1fYnl0ZXMgKyBlbXB0eV9zaXplKTsKKwkJCQkJCW51bV9ieXRlcyArIGVtcHR5X3NpemUpOworCQkJZmFpbGVkX2FsbG9jID0gdHJ1ZTsKIAkJCWdvdG8gaGF2ZV9ibG9ja19ncm91cDsKKwkJfSBlbHNlIGlmICghb2Zmc2V0KSB7CisJCQlnb3RvIGxvb3A7CiAJCX0KIGNoZWNrczoKIAkJc2VhcmNoX3N0YXJ0ID0gc3RyaXBlX2FsaWduKHJvb3QsIG9mZnNldCk7CkBAIC0zODgxLDkgKzQzOTksMTMgQEAKIAkJCQkJICAgICBzZWFyY2hfc3RhcnQgLSBvZmZzZXQpOwogCQlCVUdfT04ob2Zmc2V0ID4gc2VhcmNoX3N0YXJ0KTsKIAorCQl1cGRhdGVfcmVzZXJ2ZWRfZXh0ZW50cyhibG9ja19ncm91cCwgbnVtX2J5dGVzLCAxKTsKKwogCQkvKiB3ZSBhcmUgYWxsIGdvb2QsIGxldHMgcmV0dXJuICovCiAJCWJyZWFrOwogbG9vcDoKKwkJZmFpbGVkX2NsdXN0ZXJfcmVmaWxsID0gZmFsc2U7CisJCWZhaWxlZF9hbGxvYyA9IGZhbHNlOwogCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwogCX0KIAl1cF9yZWFkKCZzcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKQEAgLTM5NDEsMjEgKzQ0NjMsMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBkdW1wX3NwYWNlX2luZm8oc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKmluZm8sIHU2NCBieXRlcykKK3N0YXRpYyB2b2lkIGR1bXBfc3BhY2VfaW5mbyhzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqaW5mbywgdTY0IGJ5dGVzLAorCQkJICAgIGludCBkdW1wX2Jsb2NrX2dyb3VwcykKIHsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOwogCisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKIAlwcmludGsoS0VSTl9JTkZPICJzcGFjZV9pbmZvIGhhcyAlbGx1IGZyZWUsIGlzICVzZnVsbFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoaW5mby0+dG90YWxfYnl0ZXMgLSBpbmZvLT5ieXRlc191c2VkIC0KLQkJCQkgICAgaW5mby0+Ynl0ZXNfcGlubmVkIC0gaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQpLAorCQkJCSAgICBpbmZvLT5ieXRlc19waW5uZWQgLSBpbmZvLT5ieXRlc19yZXNlcnZlZCAtCisJCQkJICAgIGluZm8tPmJ5dGVzX3N1cGVyKSwKIAkgICAgICAgKGluZm8tPmZ1bGwpID8gIiIgOiAibm90ICIpOwogCXByaW50ayhLRVJOX0lORk8gInNwYWNlX2luZm8gdG90YWw9JWxsdSwgcGlubmVkPSVsbHUsIGRlbGFsbG9jPSVsbHUsIgotCSAgICAgICAiIG1heV91c2U9JWxsdSwgdXNlZD0lbGx1XG4iLAorCSAgICAgICAiIG1heV91c2U9JWxsdSwgdXNlZD0lbGx1LCByb290PSVsbHUsIHN1cGVyPSVsbHUsIHJlc2VydmVkPSVsbHUiCisJICAgICAgICJcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5mby0+dG90YWxfYnl0ZXMsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5mby0+Ynl0ZXNfcGlubmVkLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluZm8tPmJ5dGVzX2RlbGFsbG9jLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluZm8tPmJ5dGVzX21heV91c2UsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5mby0+Ynl0ZXNfdXNlZCk7CisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5mby0+Ynl0ZXNfdXNlZCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbmZvLT5ieXRlc19yb290LAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluZm8tPmJ5dGVzX3N1cGVyLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluZm8tPmJ5dGVzX3Jlc2VydmVkKTsKKwlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisKKwlpZiAoIWR1bXBfYmxvY2tfZ3JvdXBzKQorCQlyZXR1cm47CiAKIAlkb3duX3JlYWQoJmluZm8tPmdyb3Vwc19zZW0pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGUsICZpbmZvLT5ibG9ja19ncm91cHMsIGxpc3QpIHsKQEAgLTM5NzMsMTIgKzQ1MDYsMTIgQEAKIAl1cF9yZWFkKCZpbmZvLT5ncm91cHNfc2VtKTsKIH0KIAotc3RhdGljIGludCBfX2J0cmZzX3Jlc2VydmVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJICB1NjQgbnVtX2J5dGVzLCB1NjQgbWluX2FsbG9jX3NpemUsCi0JCQkJICB1NjQgZW1wdHlfc2l6ZSwgdTY0IGhpbnRfYnl0ZSwKLQkJCQkgIHU2NCBzZWFyY2hfZW5kLCBzdHJ1Y3QgYnRyZnNfa2V5ICppbnMsCi0JCQkJICB1NjQgZGF0YSkKK2ludCBidHJmc19yZXNlcnZlX2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSB1NjQgbnVtX2J5dGVzLCB1NjQgbWluX2FsbG9jX3NpemUsCisJCQkgdTY0IGVtcHR5X3NpemUsIHU2NCBoaW50X2J5dGUsCisJCQkgdTY0IHNlYXJjaF9lbmQsIHN0cnVjdCBidHJmc19rZXkgKmlucywKKwkJCSB1NjQgZGF0YSkKIHsKIAlpbnQgcmV0OwogCXU2NCBzZWFyY2hfc3RhcnQgPSAwOwpAQCAtNDAyMyw3ICs0NTU2LDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBhbGxvY2F0aW9uIGZhaWxlZCBmbGFncyAlbGx1LCAiCiAJCSAgICAgICAid2FudGVkICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZGF0YSwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbnVtX2J5dGVzKTsKLQkJZHVtcF9zcGFjZV9pbmZvKHNpbmZvLCBudW1fYnl0ZXMpOworCQlkdW1wX3NwYWNlX2luZm8oc2luZm8sIG51bV9ieXRlcywgMSk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTQwNDQsMjUgKzQ1NzcsOCBAQAogCXJldCA9IGJ0cmZzX2Rpc2NhcmRfZXh0ZW50KHJvb3QsIHN0YXJ0LCBsZW4pOwogCiAJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoY2FjaGUsIHN0YXJ0LCBsZW4pOworCXVwZGF0ZV9yZXNlcnZlZF9leHRlbnRzKGNhY2hlLCBsZW4sIDApOwogCWJ0cmZzX3B1dF9ibG9ja19ncm91cChjYWNoZSk7Ci0JdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMocm9vdCwgc3RhcnQsIGxlbiwgMCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKLQkJCQkgIHU2NCBudW1fYnl0ZXMsIHU2NCBtaW5fYWxsb2Nfc2l6ZSwKLQkJCQkgIHU2NCBlbXB0eV9zaXplLCB1NjQgaGludF9ieXRlLAotCQkJCSAgdTY0IHNlYXJjaF9lbmQsIHN0cnVjdCBidHJmc19rZXkgKmlucywKLQkJCQkgIHU2NCBkYXRhKQotewotCWludCByZXQ7Ci0JcmV0ID0gX19idHJmc19yZXNlcnZlX2V4dGVudCh0cmFucywgcm9vdCwgbnVtX2J5dGVzLCBtaW5fYWxsb2Nfc2l6ZSwKLQkJCQkgICAgIGVtcHR5X3NpemUsIGhpbnRfYnl0ZSwgc2VhcmNoX2VuZCwgaW5zLAotCQkJCSAgICAgZGF0YSk7Ci0JaWYgKCFyZXQpCi0JCXVwZGF0ZV9yZXNlcnZlZF9leHRlbnRzKHJvb3QsIGlucy0+b2JqZWN0aWQsIGlucy0+b2Zmc2V0LCAxKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00MjIzLDE1ICs0NzM5LDQ2IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwOworCXN0cnVjdCBidHJmc19jYWNoaW5nX2NvbnRyb2wgKmNhY2hpbmdfY3RsOworCXU2NCBzdGFydCA9IGlucy0+b2JqZWN0aWQ7CisJdTY0IG51bV9ieXRlcyA9IGlucy0+b2Zmc2V0OwogCiAJYmxvY2tfZ3JvdXAgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAocm9vdC0+ZnNfaW5mbywgaW5zLT5vYmplY3RpZCk7CiAJY2FjaGVfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwotCXdhaXRfZXZlbnQoYmxvY2tfZ3JvdXAtPmNhY2hpbmdfcSwKLQkJICAgYmxvY2tfZ3JvdXBfY2FjaGVfZG9uZShibG9ja19ncm91cCkpOworCWNhY2hpbmdfY3RsID0gZ2V0X2NhY2hpbmdfY29udHJvbChibG9ja19ncm91cCk7CiAKLQlyZXQgPSBidHJmc19yZW1vdmVfZnJlZV9zcGFjZShibG9ja19ncm91cCwgaW5zLT5vYmplY3RpZCwKLQkJCQkgICAgICBpbnMtPm9mZnNldCk7Ci0JQlVHX09OKHJldCk7CisJaWYgKCFjYWNoaW5nX2N0bCkgeworCQlCVUdfT04oIWJsb2NrX2dyb3VwX2NhY2hlX2RvbmUoYmxvY2tfZ3JvdXApKTsKKwkJcmV0ID0gYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIHN0YXJ0LCBudW1fYnl0ZXMpOworCQlCVUdfT04ocmV0KTsKKwl9IGVsc2UgeworCQltdXRleF9sb2NrKCZjYWNoaW5nX2N0bC0+bXV0ZXgpOworCisJCWlmIChzdGFydCA+PSBjYWNoaW5nX2N0bC0+cHJvZ3Jlc3MpIHsKKwkJCXJldCA9IGFkZF9leGNsdWRlZF9leHRlbnQocm9vdCwgc3RhcnQsIG51bV9ieXRlcyk7CisJCQlCVUdfT04ocmV0KTsKKwkJfSBlbHNlIGlmIChzdGFydCArIG51bV9ieXRlcyA8PSBjYWNoaW5nX2N0bC0+cHJvZ3Jlc3MpIHsKKwkJCXJldCA9IGJ0cmZzX3JlbW92ZV9mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLAorCQkJCQkJICAgICAgc3RhcnQsIG51bV9ieXRlcyk7CisJCQlCVUdfT04ocmV0KTsKKwkJfSBlbHNlIHsKKwkJCW51bV9ieXRlcyA9IGNhY2hpbmdfY3RsLT5wcm9ncmVzcyAtIHN0YXJ0OworCQkJcmV0ID0gYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsCisJCQkJCQkgICAgICBzdGFydCwgbnVtX2J5dGVzKTsKKwkJCUJVR19PTihyZXQpOworCisJCQlzdGFydCA9IGNhY2hpbmdfY3RsLT5wcm9ncmVzczsKKwkJCW51bV9ieXRlcyA9IGlucy0+b2JqZWN0aWQgKyBpbnMtPm9mZnNldCAtCisJCQkJICAgIGNhY2hpbmdfY3RsLT5wcm9ncmVzczsKKwkJCXJldCA9IGFkZF9leGNsdWRlZF9leHRlbnQocm9vdCwgc3RhcnQsIG51bV9ieXRlcyk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCisJCW11dGV4X3VubG9jaygmY2FjaGluZ19jdGwtPm11dGV4KTsKKwkJcHV0X2NhY2hpbmdfY29udHJvbChjYWNoaW5nX2N0bCk7CisJfQorCisJdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMoYmxvY2tfZ3JvdXAsIGlucy0+b2Zmc2V0LCAxKTsKIAlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwogCXJldCA9IGFsbG9jX3Jlc2VydmVkX2ZpbGVfZXh0ZW50KHRyYW5zLCByb290LCAwLCByb290X29iamVjdGlkLAogCQkJCQkgMCwgb3duZXIsIG9mZnNldCwgaW5zLCAxKTsKQEAgLTQyNTUsOSArNDgwMiw5IEBACiAJaW50IHJldDsKIAl1NjQgZmxhZ3MgPSAwOwogCi0JcmV0ID0gX19idHJmc19yZXNlcnZlX2V4dGVudCh0cmFucywgcm9vdCwgbnVtX2J5dGVzLCBudW1fYnl0ZXMsCi0JCQkJICAgICBlbXB0eV9zaXplLCBoaW50X2J5dGUsIHNlYXJjaF9lbmQsCi0JCQkJICAgICBpbnMsIDApOworCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHRyYW5zLCByb290LCBudW1fYnl0ZXMsIG51bV9ieXRlcywKKwkJCQkgICBlbXB0eV9zaXplLCBoaW50X2J5dGUsIHNlYXJjaF9lbmQsCisJCQkJICAgaW5zLCAwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC00MjY4LDcgKzQ4MTUsNiBAQAogCX0gZWxzZQogCQlCVUdfT04ocGFyZW50ID4gMCk7CiAKLQl1cGRhdGVfcmVzZXJ2ZWRfZXh0ZW50cyhyb290LCBpbnMtPm9iamVjdGlkLCBpbnMtPm9mZnNldCwgMSk7CiAJaWYgKHJvb3Rfb2JqZWN0aWQgIT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpIHsKIAkJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfZXh0ZW50X29wICpleHRlbnRfb3A7CiAJCWV4dGVudF9vcCA9IGttYWxsb2Moc2l6ZW9mKCpleHRlbnRfb3ApLCBHRlBfTk9GUyk7CkBAIC00MzQ3LDQzMCArNDg5Myw2IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotI2lmIDAKLWludCBidHJmc19kcm9wX2xlYWZfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmKQotewotCXU2NCBkaXNrX2J5dGVucjsKLQl1NjQgbnVtX2J5dGVzOwotCXN0cnVjdCBidHJmc19rZXkga2V5OwotCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKLQl1MzIgbnJpdGVtczsKLQlpbnQgaTsKLQlpbnQgcmV0OwotCi0JQlVHX09OKCFidHJmc19pc19sZWFmKGxlYWYpKTsKLQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJpdGVtczsgaSsrKSB7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgaSk7Ci0KLQkJLyogb25seSBleHRlbnRzIGhhdmUgcmVmZXJlbmNlcywgc2tpcCBldmVyeXRoaW5nIGVsc2UgKi8KLQkJaWYgKGJ0cmZzX2tleV90eXBlKCZrZXkpICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkKLQkJCWNvbnRpbnVlOwotCi0JCWZpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgaSwgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOwotCi0JCS8qIGlubGluZSBleHRlbnRzIGxpdmUgaW4gdGhlIGJ0cmVlLCB0aGV5IGRvbid0IGhhdmUgcmVmcyAqLwotCQlpZiAoYnRyZnNfZmlsZV9leHRlbnRfdHlwZShsZWFmLCBmaSkgPT0KLQkJICAgIEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkKLQkJCWNvbnRpbnVlOwotCi0JCWRpc2tfYnl0ZW5yID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmkpOwotCi0JCS8qIGhvbGVzIGRvbid0IGhhdmUgcmVmcyAqLwotCQlpZiAoZGlza19ieXRlbnIgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCW51bV9ieXRlcyA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsIGZpKTsKLQkJcmV0ID0gYnRyZnNfZnJlZV9leHRlbnQodHJhbnMsIHJvb3QsIGRpc2tfYnl0ZW5yLCBudW1fYnl0ZXMsCi0JCQkJCWxlYWYtPnN0YXJ0LCAwLCBrZXkub2JqZWN0aWQsIDApOwotCQlCVUdfT04ocmV0KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBub2lubGluZSBpbnQgY2FjaGVfZHJvcF9sZWFmX3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJCXN0cnVjdCBidHJmc19sZWFmX3JlZiAqcmVmKQotewotCWludCBpOwotCWludCByZXQ7Ci0Jc3RydWN0IGJ0cmZzX2V4dGVudF9pbmZvICppbmZvOwotCXN0cnVjdCByZWZzb3J0ICpzb3J0ZWQ7Ci0KLQlpZiAocmVmLT5ucml0ZW1zID09IDApCi0JCXJldHVybiAwOwotCi0Jc29ydGVkID0ga21hbGxvYyhzaXplb2YoKnNvcnRlZCkgKiByZWYtPm5yaXRlbXMsIEdGUF9OT0ZTKTsKLQlmb3IgKGkgPSAwOyBpIDwgcmVmLT5ucml0ZW1zOyBpKyspIHsKLQkJc29ydGVkW2ldLmJ5dGVuciA9IHJlZi0+ZXh0ZW50c1tpXS5ieXRlbnI7Ci0JCXNvcnRlZFtpXS5zbG90ID0gaTsKLQl9Ci0Jc29ydChzb3J0ZWQsIHJlZi0+bnJpdGVtcywgc2l6ZW9mKHN0cnVjdCByZWZzb3J0KSwgcmVmc29ydF9jbXAsIE5VTEwpOwotCi0JLyoKLQkgKiB0aGUgaXRlbXMgaW4gdGhlIHJlZiB3ZXJlIHNvcnRlZCB3aGVuIHRoZSByZWYgd2FzIGluc2VydGVkCi0JICogaW50byB0aGUgcmVmIGNhY2hlLCBzbyB0aGlzIGlzIGFscmVhZHkgaW4gb3JkZXIKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcmVmLT5ucml0ZW1zOyBpKyspIHsKLQkJaW5mbyA9IHJlZi0+ZXh0ZW50cyArIHNvcnRlZFtpXS5zbG90OwotCQlyZXQgPSBidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgaW5mby0+Ynl0ZW5yLAotCQkJCQkgIGluZm8tPm51bV9ieXRlcywgcmVmLT5ieXRlbnIsCi0JCQkJCSAgcmVmLT5vd25lciwgcmVmLT5nZW5lcmF0aW9uLAotCQkJCQkgIGluZm8tPm9iamVjdGlkLCAwKTsKLQotCQlhdG9taWNfaW5jKCZyb290LT5mc19pbmZvLT50aHJvdHRsZV9nZW4pOwotCQl3YWtlX3VwKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl90aHJvdHRsZSk7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCi0JCUJVR19PTihyZXQpOwotCQlpbmZvKys7Ci0JfQotCi0Ja2ZyZWUoc29ydGVkKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGRyb3Bfc25hcF9sb29rdXBfcmVmY291bnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHN0YXJ0LAotCQkJCSAgICAgdTY0IGxlbiwgdTMyICpyZWZzKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBidHJmc19sb29rdXBfZXh0ZW50X3JlZnModHJhbnMsIHJvb3QsIHN0YXJ0LCBsZW4sIHJlZnMpOwotCUJVR19PTihyZXQpOwotCi0jaWYgMCAvKiBzb21lIGRlYnVnZ2luZyBjb2RlIGluIGNhc2Ugd2Ugc2VlIHByb2JsZW1zIGhlcmUgKi8KLQkvKiBpZiB0aGUgcmVmcyBjb3VudCBpcyBvbmUsIGl0IHdvbid0IGdldCBpbmNyZWFzZWQgYWdhaW4uICBCdXQKLQkgKiBpZiB0aGUgcmVmIGNvdW50IGlzID4gMSwgc29tZW9uZSBtYXkgYmUgZGVjcmVhc2luZyBpdCBhdAotCSAqIHRoZSBzYW1lIHRpbWUgd2UgYXJlLgotCSAqLwotCWlmICgqcmVmcyAhPSAxKSB7Ci0JCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYiA9IE5VTEw7Ci0JCWViID0gYnRyZnNfZmluZF9jcmVhdGVfdHJlZV9ibG9jayhyb290LCBzdGFydCwgbGVuKTsKLQkJaWYgKGViKQotCQkJYnRyZnNfdHJlZV9sb2NrKGViKTsKLQotCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT5hbGxvY19tdXRleCk7Ci0JCXJldCA9IGxvb2t1cF9leHRlbnRfcmVmKE5VTEwsIHJvb3QsIHN0YXJ0LCBsZW4sIHJlZnMpOwotCQlCVUdfT04ocmV0KTsKLQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5hbGxvY19tdXRleCk7Ci0KLQkJaWYgKGViKSB7Ci0JCQlidHJmc190cmVlX3VubG9jayhlYik7Ci0JCQlmcmVlX2V4dGVudF9idWZmZXIoZWIpOwotCQl9Ci0JCWlmICgqcmVmcyA9PSAxKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGJsb2NrICVsbHUgd2VudCBkb3duIHRvIG9uZSAiCi0JCQkgICAgICAgImR1cmluZyBkcm9wX3NuYXBcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQpOwotCQl9Ci0KLQl9Ci0jZW5kaWYKLQotCWNvbmRfcmVzY2hlZCgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqIHRoaXMgaXMgdXNlZCB3aGlsZSBkZWxldGluZyBvbGQgc25hcHNob3RzLCBhbmQgaXQgZHJvcHMgdGhlIHJlZnMKLSAqIG9uIGEgd2hvbGUgc3VidHJlZSBzdGFydGluZyBmcm9tIGEgbGV2ZWwgMSBub2RlLgotICoKLSAqIFRoZSBpZGVhIGlzIHRvIHNvcnQgYWxsIHRoZSBsZWFmIHBvaW50ZXJzLCBhbmQgdGhlbiBkcm9wIHRoZQotICogcmVmIG9uIGFsbCB0aGUgbGVhdmVzIGluIG9yZGVyLiAgTW9zdCBvZiB0aGUgdGltZSB0aGUgbGVhdmVzCi0gKiB3aWxsIGhhdmUgcmVmIGNhY2hlIGVudHJpZXMsIHNvIG5vIGxlYWYgSU9zIHdpbGwgYmUgcmVxdWlyZWQgdG8KLSAqIGZpbmQgdGhlIGV4dGVudHMgdGhleSBoYXZlIHJlZmVyZW5jZXMgb24uCi0gKgotICogRm9yIGVhY2ggbGVhZiwgYW55IHJlZmVyZW5jZXMgaXQgaGFzIGFyZSBhbHNvIGRyb3BwZWQgaW4gb3JkZXIKLSAqCi0gKiBUaGlzIGVuZHMgdXAgZHJvcHBpbmcgdGhlIHJlZmVyZW5jZXMgaW4gc29tZXRoaW5nIGNsb3NlIHRvIG9wdGltYWwKLSAqIG9yZGVyIGZvciByZWFkaW5nIGFuZCBtb2RpZnlpbmcgdGhlIGV4dGVudCBhbGxvY2F0aW9uIHRyZWUuCi0gKi8KLXN0YXRpYyBub2lubGluZSBpbnQgZHJvcF9sZXZlbF9vbmVfcmVmcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoKQotewotCXU2NCBieXRlbnI7Ci0JdTY0IHJvb3Rfb3duZXI7Ci0JdTY0IHJvb3RfZ2VuOwotCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYiA9IHBhdGgtPm5vZGVzWzFdOwotCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOwotCXN0cnVjdCBidHJmc19sZWFmX3JlZiAqcmVmOwotCXN0cnVjdCByZWZzb3J0ICpzb3J0ZWQgPSBOVUxMOwotCWludCBucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMoZWIpOwotCWludCByZXQ7Ci0JaW50IGk7Ci0JaW50IHJlZmkgPSAwOwotCWludCBzbG90ID0gcGF0aC0+c2xvdHNbMV07Ci0JdTMyIGJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgMCk7Ci0JdTMyIHJlZnM7Ci0KLQlpZiAobnJpdGVtcyA9PSAwKQotCQlnb3RvIG91dDsKLQotCXJvb3Rfb3duZXIgPSBidHJmc19oZWFkZXJfb3duZXIoZWIpOwotCXJvb3RfZ2VuID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oZWIpOwotCXNvcnRlZCA9IGttYWxsb2Moc2l6ZW9mKCpzb3J0ZWQpICogbnJpdGVtcywgR0ZQX05PRlMpOwotCi0JLyoKLQkgKiBzdGVwIG9uZSwgc29ydCBhbGwgdGhlIGxlYWYgcG9pbnRlcnMgc28gd2UgZG9uJ3Qgc2NyaWJibGUKLQkgKiByYW5kb21seSBpbnRvIHRoZSBleHRlbnQgYWxsb2NhdGlvbiB0cmVlCi0JICovCi0JZm9yIChpID0gc2xvdDsgaSA8IG5yaXRlbXM7IGkrKykgewotCQlzb3J0ZWRbcmVmaV0uYnl0ZW5yID0gYnRyZnNfbm9kZV9ibG9ja3B0cihlYiwgaSk7Ci0JCXNvcnRlZFtyZWZpXS5zbG90ID0gaTsKLQkJcmVmaSsrOwotCX0KLQotCS8qCi0JICogbnJpdGVtcyB3b24ndCBiZSB6ZXJvLCBidXQgaWYgd2UncmUgcGlja2luZyB1cCBkcm9wX3NuYXBzaG90Ci0JICogYWZ0ZXIgYSBjcmFzaCwgc2xvdCBtaWdodCBiZSA+IDAsIHNvIGRvdWJsZSBjaGVjayB0aGluZ3MKLQkgKiBqdXN0IGluIGNhc2UuCi0JICovCi0JaWYgKHJlZmkgPT0gMCkKLQkJZ290byBvdXQ7Ci0KLQlzb3J0KHNvcnRlZCwgcmVmaSwgc2l6ZW9mKHN0cnVjdCByZWZzb3J0KSwgcmVmc29ydF9jbXAsIE5VTEwpOwotCi0JLyoKLQkgKiB0aGUgZmlyc3QgbG9vcCBmcmVlcyBldmVyeXRoaW5nIHRoZSBsZWF2ZXMgcG9pbnQgdG8KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcmVmaTsgaSsrKSB7Ci0JCXU2NCBwdHJfZ2VuOwotCi0JCWJ5dGVuciA9IHNvcnRlZFtpXS5ieXRlbnI7Ci0KLQkJLyoKLQkJICogY2hlY2sgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGlzIGxlYWYuICBJZiBpdCBpcyA+IDEKLQkJICogd2UganVzdCBkZWNyZW1lbnQgaXQgYmVsb3cgYW5kIGRvbid0IHVwZGF0ZSBhbnkKLQkJICogb2YgdGhlIHJlZnMgdGhlIGxlYWYgcG9pbnRzIHRvLgotCQkgKi8KLQkJcmV0ID0gZHJvcF9zbmFwX2xvb2t1cF9yZWZjb3VudCh0cmFucywgcm9vdCwgYnl0ZW5yLAotCQkJCQkJYmxvY2tzaXplLCAmcmVmcyk7Ci0JCUJVR19PTihyZXQpOwotCQlpZiAocmVmcyAhPSAxKQotCQkJY29udGludWU7Ci0KLQkJcHRyX2dlbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24oZWIsIHNvcnRlZFtpXS5zbG90KTsKLQotCQkvKgotCQkgKiB0aGUgbGVhZiBvbmx5IGhhZCBvbmUgcmVmZXJlbmNlLCB3aGljaCBtZWFucyB0aGUKLQkJICogb25seSB0aGluZyBwb2ludGluZyB0byB0aGlzIGxlYWYgaXMgdGhlIHNuYXBzaG90Ci0JCSAqIHdlJ3JlIGRlbGV0aW5nLiAgSXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZSByZWZlcmVuY2UKLQkJICogY291bnQgdG8gaW5jcmVhc2UgYWdhaW4gbGF0ZXIKLQkJICoKLQkJICogVGhlIHJlZmVyZW5jZSBjYWNoZSBpcyBjaGVja2VkIGZvciB0aGUgbGVhZiwKLQkJICogYW5kIGlmIGZvdW5kIHdlJ2xsIGJlIGFibGUgdG8gZHJvcCBhbnkgcmVmcyBoZWxkIGJ5Ci0JCSAqIHRoZSBsZWFmIHdpdGhvdXQgbmVlZGluZyB0byByZWFkIGl0IGluLgotCQkgKi8KLQkJcmVmID0gYnRyZnNfbG9va3VwX2xlYWZfcmVmKHJvb3QsIGJ5dGVucik7Ci0JCWlmIChyZWYgJiYgcmVmLT5nZW5lcmF0aW9uICE9IHB0cl9nZW4pIHsKLQkJCWJ0cmZzX2ZyZWVfbGVhZl9yZWYocm9vdCwgcmVmKTsKLQkJCXJlZiA9IE5VTEw7Ci0JCX0KLQkJaWYgKHJlZikgewotCQkJcmV0ID0gY2FjaGVfZHJvcF9sZWFmX3JlZih0cmFucywgcm9vdCwgcmVmKTsKLQkJCUJVR19PTihyZXQpOwotCQkJYnRyZnNfcmVtb3ZlX2xlYWZfcmVmKHJvb3QsIHJlZik7Ci0JCQlidHJmc19mcmVlX2xlYWZfcmVmKHJvb3QsIHJlZik7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogdGhlIGxlYWYgd2Fzbid0IGluIHRoZSByZWZlcmVuY2UgY2FjaGUsIHNvCi0JCQkgKiB3ZSBoYXZlIHRvIHJlYWQgaXQuCi0JCQkgKi8KLQkJCWxlYWYgPSByZWFkX3RyZWVfYmxvY2socm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsCi0JCQkJCSAgICAgICBwdHJfZ2VuKTsKLQkJCXJldCA9IGJ0cmZzX2Ryb3BfbGVhZl9yZWYodHJhbnMsIHJvb3QsIGxlYWYpOwotCQkJQlVHX09OKHJldCk7Ci0JCQlmcmVlX2V4dGVudF9idWZmZXIobGVhZik7Ci0JCX0KLQkJYXRvbWljX2luYygmcm9vdC0+ZnNfaW5mby0+dGhyb3R0bGVfZ2VuKTsKLQkJd2FrZV91cCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fdGhyb3R0bGUpOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci0KLQkvKgotCSAqIHJ1biB0aHJvdWdoIHRoZSBsb29wIGFnYWluIHRvIGZyZWUgdGhlIHJlZnMgb24gdGhlIGxlYXZlcy4KLQkgKiBUaGlzIGlzIGZhc3RlciB0aGFuIGRvaW5nIGl0IGluIHRoZSBsb29wIGFib3ZlIGJlY2F1c2UKLQkgKiB0aGUgbGVhdmVzIGFyZSBsaWtlbHkgdG8gYmUgY2x1c3RlcmVkIHRvZ2V0aGVyLiAgV2UgZW5kIHVwCi0JICogd29ya2luZyBpbiBuaWNlIGNodW5rcyBvbiB0aGUgZXh0ZW50IGFsbG9jYXRpb24gdHJlZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcmVmaTsgaSsrKSB7Ci0JCWJ5dGVuciA9IHNvcnRlZFtpXS5ieXRlbnI7Ci0JCXJldCA9IGJ0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBieXRlbnIsCi0JCQkJCWJsb2Nrc2l6ZSwgZWItPnN0YXJ0LAotCQkJCQlyb290X293bmVyLCByb290X2dlbiwgMCwgMSk7Ci0JCUJVR19PTihyZXQpOwotCi0JCWF0b21pY19pbmMoJnJvb3QtPmZzX2luZm8tPnRocm90dGxlX2dlbik7Ci0JCXdha2VfdXAoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3Rocm90dGxlKTsKLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQotb3V0OgotCWtmcmVlKHNvcnRlZCk7Ci0KLQkvKgotCSAqIHVwZGF0ZSB0aGUgcGF0aCB0byBzaG93IHdlJ3ZlIHByb2Nlc3NlZCB0aGUgZW50aXJlIGxldmVsIDEKLQkgKiBub2RlLiAgVGhpcyB3aWxsIGdldCBzYXZlZCBpbnRvIHRoZSByb290J3MgZHJvcF9zbmFwc2hvdF9wcm9ncmVzcwotCSAqIGZpZWxkIHNvIHRoZXNlIGRyb3BzIGFyZSBub3QgcmVwZWF0ZWQgYWdhaW4gaWYgdGhpcyB0cmFuc2FjdGlvbgotCSAqIGNvbW1pdHMuCi0JICovCi0JcGF0aC0+c2xvdHNbMV0gPSBucml0ZW1zOwotCXJldHVybiAwOwotfQotCi0vKgotICogaGVscGVyIGZ1bmN0aW9uIGZvciBkcm9wX3NuYXBzaG90LCB0aGlzIHdhbGtzIGRvd24gdGhlIHRyZWUgZHJvcHBpbmcgcmVmCi0gKiBjb3VudHMgYXMgaXQgZ29lcy4KLSAqLwotc3RhdGljIG5vaW5saW5lIGludCB3YWxrX2Rvd25fdHJlZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKLQkJCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgaW50ICpsZXZlbCkKLXsKLQl1NjQgcm9vdF9vd25lcjsKLQl1NjQgcm9vdF9nZW47Ci0JdTY0IGJ5dGVucjsKLQl1NjQgcHRyX2dlbjsKLQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbmV4dDsKLQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqY3VyOwotCXN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQ7Ci0JdTMyIGJsb2Nrc2l6ZTsKLQlpbnQgcmV0OwotCXUzMiByZWZzOwotCi0JV0FSTl9PTigqbGV2ZWwgPCAwKTsKLQlXQVJOX09OKCpsZXZlbCA+PSBCVFJGU19NQVhfTEVWRUwpOwotCXJldCA9IGRyb3Bfc25hcF9sb29rdXBfcmVmY291bnQodHJhbnMsIHJvb3QsIHBhdGgtPm5vZGVzWypsZXZlbF0tPnN0YXJ0LAotCQkJCXBhdGgtPm5vZGVzWypsZXZlbF0tPmxlbiwgJnJlZnMpOwotCUJVR19PTihyZXQpOwotCWlmIChyZWZzID4gMSkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIHdhbGsgZG93biB0byB0aGUgbGFzdCBub2RlIGxldmVsIGFuZCBmcmVlIGFsbCB0aGUgbGVhdmVzCi0JICovCi0Jd2hpbGUgKCpsZXZlbCA+PSAwKSB7Ci0JCVdBUk5fT04oKmxldmVsIDwgMCk7Ci0JCVdBUk5fT04oKmxldmVsID49IEJUUkZTX01BWF9MRVZFTCk7Ci0JCWN1ciA9IHBhdGgtPm5vZGVzWypsZXZlbF07Ci0KLQkJaWYgKGJ0cmZzX2hlYWRlcl9sZXZlbChjdXIpICE9ICpsZXZlbCkKLQkJCVdBUk5fT04oMSk7Ci0KLQkJaWYgKHBhdGgtPnNsb3RzWypsZXZlbF0gPj0KLQkJICAgIGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGN1cikpCi0JCQlicmVhazsKLQotCQkvKiB0aGUgbmV3IGNvZGUgZ29lcyBkb3duIHRvIGxldmVsIDEgYW5kIGRvZXMgYWxsIHRoZQotCQkgKiBsZWF2ZXMgcG9pbnRlZCB0byB0aGF0IG5vZGUgaW4gYnVsay4gIFNvLCB0aGlzIGNoZWNrCi0JCSAqIGZvciBsZXZlbCAwIHdpbGwgYWx3YXlzIGJlIGZhbHNlLgotCQkgKgotCQkgKiBCdXQsIHRoZSBkaXNrIGZvcm1hdCBhbGxvd3MgdGhlIGRyb3Bfc25hcHNob3RfcHJvZ3Jlc3MKLQkJICogZmllbGQgaW4gdGhlIHJvb3QgdG8gbGVhdmUgdGhpbmdzIGluIGEgc3RhdGUgd2hlcmUKLQkJICogYSBsZWFmIHdpbGwgbmVlZCBjbGVhbmluZyB1cCBoZXJlLiAgSWYgc29tZW9uZSBjcmFzaGVzCi0JCSAqIHdpdGggdGhlIG9sZCBjb2RlIGFuZCB0aGVuIGJvb3RzIHdpdGggdGhlIG5ldyBjb2RlLAotCQkgKiB3ZSBtaWdodCBmaW5kIGEgbGVhZiBoZXJlLgotCQkgKi8KLQkJaWYgKCpsZXZlbCA9PSAwKSB7Ci0JCQlyZXQgPSBidHJmc19kcm9wX2xlYWZfcmVmKHRyYW5zLCByb290LCBjdXIpOwotCQkJQlVHX09OKHJldCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIG9uY2Ugd2UgZ2V0IHRvIGxldmVsIG9uZSwgcHJvY2VzcyB0aGUgd2hvbGUgbm9kZQotCQkgKiBhdCBvbmNlLCBpbmNsdWRpbmcgZXZlcnl0aGluZyBiZWxvdyBpdC4KLQkJICovCi0JCWlmICgqbGV2ZWwgPT0gMSkgewotCQkJcmV0ID0gZHJvcF9sZXZlbF9vbmVfcmVmcyh0cmFucywgcm9vdCwgcGF0aCk7Ci0JCQlCVUdfT04ocmV0KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYnl0ZW5yID0gYnRyZnNfbm9kZV9ibG9ja3B0cihjdXIsIHBhdGgtPnNsb3RzWypsZXZlbF0pOwotCQlwdHJfZ2VuID0gYnRyZnNfbm9kZV9wdHJfZ2VuZXJhdGlvbihjdXIsIHBhdGgtPnNsb3RzWypsZXZlbF0pOwotCQlibG9ja3NpemUgPSBidHJmc19sZXZlbF9zaXplKHJvb3QsICpsZXZlbCAtIDEpOwotCi0JCXJldCA9IGRyb3Bfc25hcF9sb29rdXBfcmVmY291bnQodHJhbnMsIHJvb3QsIGJ5dGVuciwKLQkJCQkJCWJsb2Nrc2l6ZSwgJnJlZnMpOwotCQlCVUdfT04ocmV0KTsKLQotCQkvKgotCQkgKiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHJlZmVyZW5jZSwgd2UgZG9uJ3QgbmVlZAotCQkgKiB0byByZWFkIHRoYXQgbm9kZSB0byBkcm9wIGFueSByZWZlcmVuY2VzIGl0IGhhcy4gIFdlCi0JCSAqIGp1c3QgZHJvcCB0aGUgcmVmIHdlIGhvbGQgb24gdGhhdCBub2RlIGFuZCBtb3ZlIG9uIHRvIHRoZQotCQkgKiBuZXh0IHNsb3QgaW4gdGhpcyBsZXZlbC4KLQkJICovCi0JCWlmIChyZWZzICE9IDEpIHsKLQkJCXBhcmVudCA9IHBhdGgtPm5vZGVzWypsZXZlbF07Ci0JCQlyb290X293bmVyID0gYnRyZnNfaGVhZGVyX293bmVyKHBhcmVudCk7Ci0JCQlyb290X2dlbiA9IGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKHBhcmVudCk7Ci0JCQlwYXRoLT5zbG90c1sqbGV2ZWxdKys7Ci0KLQkJCXJldCA9IGJ0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBieXRlbnIsCi0JCQkJCQlibG9ja3NpemUsIHBhcmVudC0+c3RhcnQsCi0JCQkJCQlyb290X293bmVyLCByb290X2dlbiwKLQkJCQkJCSpsZXZlbCAtIDEsIDEpOwotCQkJQlVHX09OKHJldCk7Ci0KLQkJCWF0b21pY19pbmMoJnJvb3QtPmZzX2luZm8tPnRocm90dGxlX2dlbik7Ci0JCQl3YWtlX3VwKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl90aHJvdHRsZSk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiB3ZSBuZWVkIHRvIGtlZXAgZnJlZWluZyB0aGluZ3MgaW4gdGhlIG5leHQgbGV2ZWwgZG93bi4KLQkJICogcmVhZCB0aGUgYmxvY2sgYW5kIGxvb3AgYXJvdW5kIHRvIHByb2Nlc3MgaXQKLQkJICovCi0JCW5leHQgPSByZWFkX3RyZWVfYmxvY2socm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsIHB0cl9nZW4pOwotCQlXQVJOX09OKCpsZXZlbCA8PSAwKTsKLQkJaWYgKHBhdGgtPm5vZGVzWypsZXZlbC0xXSkKLQkJCWZyZWVfZXh0ZW50X2J1ZmZlcihwYXRoLT5ub2Rlc1sqbGV2ZWwtMV0pOwotCQlwYXRoLT5ub2Rlc1sqbGV2ZWwtMV0gPSBuZXh0OwotCQkqbGV2ZWwgPSBidHJmc19oZWFkZXJfbGV2ZWwobmV4dCk7Ci0JCXBhdGgtPnNsb3RzWypsZXZlbF0gPSAwOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci1vdXQ6Ci0JV0FSTl9PTigqbGV2ZWwgPCAwKTsKLQlXQVJOX09OKCpsZXZlbCA+PSBCVFJGU19NQVhfTEVWRUwpOwotCi0JaWYgKHBhdGgtPm5vZGVzWypsZXZlbF0gPT0gcm9vdC0+bm9kZSkgewotCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdOwotCQlieXRlbnIgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5zdGFydDsKLQl9IGVsc2UgewotCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1sqbGV2ZWwgKyAxXTsKLQkJYnl0ZW5yID0gYnRyZnNfbm9kZV9ibG9ja3B0cihwYXJlbnQsIHBhdGgtPnNsb3RzWypsZXZlbCArIDFdKTsKLQl9Ci0KLQlibG9ja3NpemUgPSBidHJmc19sZXZlbF9zaXplKHJvb3QsICpsZXZlbCk7Ci0Jcm9vdF9vd25lciA9IGJ0cmZzX2hlYWRlcl9vd25lcihwYXJlbnQpOwotCXJvb3RfZ2VuID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ocGFyZW50KTsKLQotCS8qCi0JICogY2xlYW51cCBhbmQgZnJlZSB0aGUgcmVmZXJlbmNlIG9uIHRoZSBsYXN0IG5vZGUKLQkgKiB3ZSBwcm9jZXNzZWQKLQkgKi8KLQlyZXQgPSBidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsCi0JCQkJICBwYXJlbnQtPnN0YXJ0LCByb290X293bmVyLCByb290X2dlbiwKLQkJCQkgICpsZXZlbCwgMSk7Ci0JZnJlZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWypsZXZlbF0pOwotCXBhdGgtPm5vZGVzWypsZXZlbF0gPSBOVUxMOwotCi0JKmxldmVsICs9IDE7Ci0JQlVHX09OKHJldCk7Ci0KLQljb25kX3Jlc2NoZWQoKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiBzdHJ1Y3Qgd2Fsa19jb250cm9sIHsKIAl1NjQgcmVmc1tCVFJGU19NQVhfTEVWRUxdOwogCXU2NCBmbGFnc1tCVFJGU19NQVhfTEVWRUxdOwpAQCAtNDc4MCwxOSArNDkwMiw5OSBAQAogCWludCBzaGFyZWRfbGV2ZWw7CiAJaW50IHVwZGF0ZV9yZWY7CiAJaW50IGtlZXBfbG9ja3M7CisJaW50IHJlYWRhX3Nsb3Q7CisJaW50IHJlYWRhX2NvdW50OwogfTsKIAogI2RlZmluZSBEUk9QX1JFRkVSRU5DRQkxCiAjZGVmaW5lIFVQREFURV9CQUNLUkVGCTIKIAorc3RhdGljIG5vaW5saW5lIHZvaWQgcmVhZGFfd2Fsa19kb3duKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICAgICBzdHJ1Y3Qgd2Fsa19jb250cm9sICp3YywKKwkJCQkgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoKQoreworCXU2NCBieXRlbnI7CisJdTY0IGdlbmVyYXRpb247CisJdTY0IHJlZnM7CisJdTY0IGZsYWdzOworCXU2NCBsYXN0ID0gMDsKKwl1MzIgbnJpdGVtczsKKwl1MzIgYmxvY2tzaXplOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKwlpbnQgcmV0OworCWludCBzbG90OworCWludCBucmVhZCA9IDA7CisKKwlpZiAocGF0aC0+c2xvdHNbd2MtPmxldmVsXSA8IHdjLT5yZWFkYV9zbG90KSB7CisJCXdjLT5yZWFkYV9jb3VudCA9IHdjLT5yZWFkYV9jb3VudCAqIDIgLyAzOworCQl3Yy0+cmVhZGFfY291bnQgPSBtYXgod2MtPnJlYWRhX2NvdW50LCAyKTsKKwl9IGVsc2UgeworCQl3Yy0+cmVhZGFfY291bnQgPSB3Yy0+cmVhZGFfY291bnQgKiAzIC8gMjsKKwkJd2MtPnJlYWRhX2NvdW50ID0gbWluX3QoaW50LCB3Yy0+cmVhZGFfY291bnQsCisJCQkJCUJUUkZTX05PREVQVFJTX1BFUl9CTE9DSyhyb290KSk7CisJfQorCisJZWIgPSBwYXRoLT5ub2Rlc1t3Yy0+bGV2ZWxdOworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhlYik7CisJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZShyb290LCB3Yy0+bGV2ZWwgLSAxKTsKKworCWZvciAoc2xvdCA9IHBhdGgtPnNsb3RzW3djLT5sZXZlbF07IHNsb3QgPCBucml0ZW1zOyBzbG90KyspIHsKKwkJaWYgKG5yZWFkID49IHdjLT5yZWFkYV9jb3VudCkKKwkJCWJyZWFrOworCisJCWNvbmRfcmVzY2hlZCgpOworCQlieXRlbnIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKGViLCBzbG90KTsKKwkJZ2VuZXJhdGlvbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24oZWIsIHNsb3QpOworCisJCWlmIChzbG90ID09IHBhdGgtPnNsb3RzW3djLT5sZXZlbF0pCisJCQlnb3RvIHJlYWRhOworCisJCWlmICh3Yy0+c3RhZ2UgPT0gVVBEQVRFX0JBQ0tSRUYgJiYKKwkJICAgIGdlbmVyYXRpb24gPD0gcm9vdC0+cm9vdF9rZXkub2Zmc2V0KQorCQkJY29udGludWU7CisKKwkJLyogV2UgZG9uJ3QgbG9jayB0aGUgdHJlZSBibG9jaywgaXQncyBPSyB0byBiZSByYWN5IGhlcmUgKi8KKwkJcmV0ID0gYnRyZnNfbG9va3VwX2V4dGVudF9pbmZvKHRyYW5zLCByb290LCBieXRlbnIsIGJsb2Nrc2l6ZSwKKwkJCQkJICAgICAgICZyZWZzLCAmZmxhZ3MpOworCQlCVUdfT04ocmV0KTsKKwkJQlVHX09OKHJlZnMgPT0gMCk7CisKKwkJaWYgKHdjLT5zdGFnZSA9PSBEUk9QX1JFRkVSRU5DRSkgeworCQkJaWYgKHJlZnMgPT0gMSkKKwkJCQlnb3RvIHJlYWRhOworCisJCQlpZiAod2MtPmxldmVsID09IDEgJiYKKwkJCSAgICAoZmxhZ3MgJiBCVFJGU19CTE9DS19GTEFHX0ZVTExfQkFDS1JFRikpCisJCQkJY29udGludWU7CisJCQlpZiAoIXdjLT51cGRhdGVfcmVmIHx8CisJCQkgICAgZ2VuZXJhdGlvbiA8PSByb290LT5yb290X2tleS5vZmZzZXQpCisJCQkJY29udGludWU7CisJCQlidHJmc19ub2RlX2tleV90b19jcHUoZWIsICZrZXksIHNsb3QpOworCQkJcmV0ID0gYnRyZnNfY29tcF9jcHVfa2V5cygma2V5LAorCQkJCQkJICAmd2MtPnVwZGF0ZV9wcm9ncmVzcyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmICh3Yy0+bGV2ZWwgPT0gMSAmJgorCQkJICAgIChmbGFncyAmIEJUUkZTX0JMT0NLX0ZMQUdfRlVMTF9CQUNLUkVGKSkKKwkJCQljb250aW51ZTsKKwkJfQorcmVhZGE6CisJCXJldCA9IHJlYWRhaGVhZF90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplLAorCQkJCQkgICBnZW5lcmF0aW9uKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlsYXN0ID0gYnl0ZW5yICsgYmxvY2tzaXplOworCQlucmVhZCsrOworCX0KKwl3Yy0+cmVhZGFfc2xvdCA9IHNsb3Q7Cit9CisKIC8qCiAgKiBoZXBsZXIgdG8gcHJvY2VzcyB0cmVlIGJsb2NrIHdoaWxlIHdhbGtpbmcgZG93biB0aGUgdHJlZS4KICAqCi0gKiB3aGVuIHdjLT5zdGFnZSA9PSBEUk9QX1JFRkVSRU5DRSwgdGhpcyBmdW5jdGlvbiBjaGVja3MKLSAqIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgYmxvY2suIGlmIHRoZSBibG9jayBpcyBzaGFyZWQgYW5kCi0gKiB3ZSBuZWVkIHVwZGF0ZSBiYWNrIHJlZnMgZm9yIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUKLSAqIGJsb2NrLCB0aGlzIGZ1bmN0aW9uIGNoYW5nZXMgd2MtPnN0YWdlIHRvIFVQREFURV9CQUNLUkVGCi0gKgogICogd2hlbiB3Yy0+c3RhZ2UgPT0gVVBEQVRFX0JBQ0tSRUYsIHRoaXMgZnVuY3Rpb24gdXBkYXRlcwogICogYmFjayByZWZzIGZvciBwb2ludGVycyBpbiB0aGUgYmxvY2suCiAgKgpAQCAtNDgwMSwxMSArNTAwMywxMCBAQAogc3RhdGljIG5vaW5saW5lIGludCB3YWxrX2Rvd25fcHJvYyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKLQkJCQkgICBzdHJ1Y3Qgd2Fsa19jb250cm9sICp3YykKKwkJCQkgICBzdHJ1Y3Qgd2Fsa19jb250cm9sICp3YywgaW50IGxvb2t1cF9pbmZvKQogewogCWludCBsZXZlbCA9IHdjLT5sZXZlbDsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIgPSBwYXRoLT5ub2Rlc1tsZXZlbF07Ci0Jc3RydWN0IGJ0cmZzX2tleSBrZXk7CiAJdTY0IGZsYWcgPSBCVFJGU19CTE9DS19GTEFHX0ZVTExfQkFDS1JFRjsKIAlpbnQgcmV0OwogCkBAIC00ODE3LDggKzUwMTgsOSBAQAogCSAqIHdoZW4gcmVmZXJlbmNlIGNvdW50IG9mIHRyZWUgYmxvY2sgaXMgMSwgaXQgd29uJ3QgaW5jcmVhc2UKIAkgKiBhZ2Fpbi4gb25jZSBmdWxsIGJhY2tyZWYgZmxhZyBpcyBzZXQsIHdlIG5ldmVyIGNsZWFyIGl0LgogCSAqLwotCWlmICgod2MtPnN0YWdlID09IERST1BfUkVGRVJFTkNFICYmIHdjLT5yZWZzW2xldmVsXSAhPSAxKSB8fAotCSAgICAod2MtPnN0YWdlID09IFVQREFURV9CQUNLUkVGICYmICEod2MtPmZsYWdzW2xldmVsXSAmIGZsYWcpKSkgeworCWlmIChsb29rdXBfaW5mbyAmJgorCSAgICAoKHdjLT5zdGFnZSA9PSBEUk9QX1JFRkVSRU5DRSAmJiB3Yy0+cmVmc1tsZXZlbF0gIT0gMSkgfHwKKwkgICAgICh3Yy0+c3RhZ2UgPT0gVVBEQVRFX0JBQ0tSRUYgJiYgISh3Yy0+ZmxhZ3NbbGV2ZWxdICYgZmxhZykpKSkgewogCQlCVUdfT04oIXBhdGgtPmxvY2tzW2xldmVsXSk7CiAJCXJldCA9IGJ0cmZzX2xvb2t1cF9leHRlbnRfaW5mbyh0cmFucywgcm9vdCwKIAkJCQkJICAgICAgIGViLT5zdGFydCwgZWItPmxlbiwKQEAgLTQ4MjgsMjEgKzUwMzAsNiBAQAogCQlCVUdfT04od2MtPnJlZnNbbGV2ZWxdID09IDApOwogCX0KIAotCWlmICh3Yy0+c3RhZ2UgPT0gRFJPUF9SRUZFUkVOQ0UgJiYKLQkgICAgd2MtPnVwZGF0ZV9yZWYgJiYgd2MtPnJlZnNbbGV2ZWxdID4gMSkgewotCQlCVUdfT04oZWIgPT0gcm9vdC0+bm9kZSk7Ci0JCUJVR19PTihwYXRoLT5zbG90c1tsZXZlbF0gPiAwKTsKLQkJaWYgKGxldmVsID09IDApCi0JCQlidHJmc19pdGVtX2tleV90b19jcHUoZWIsICZrZXksIHBhdGgtPnNsb3RzW2xldmVsXSk7Ci0JCWVsc2UKLQkJCWJ0cmZzX25vZGVfa2V5X3RvX2NwdShlYiwgJmtleSwgcGF0aC0+c2xvdHNbbGV2ZWxdKTsKLQkJaWYgKGJ0cmZzX2hlYWRlcl9vd25lcihlYikgPT0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgJiYKLQkJICAgIGJ0cmZzX2NvbXBfY3B1X2tleXMoJmtleSwgJndjLT51cGRhdGVfcHJvZ3Jlc3MpID49IDApIHsKLQkJCXdjLT5zdGFnZSA9IFVQREFURV9CQUNLUkVGOwotCQkJd2MtPnNoYXJlZF9sZXZlbCA9IGxldmVsOwotCQl9Ci0JfQotCiAJaWYgKHdjLT5zdGFnZSA9PSBEUk9QX1JFRkVSRU5DRSkgewogCQlpZiAod2MtPnJlZnNbbGV2ZWxdID4gMSkKIAkJCXJldHVybiAxOwpAQCAtNDg3OSw2ICs1MDY2LDEzNiBAQAogfQogCiAvKgorICogaGVwbGVyIHRvIHByb2Nlc3MgdHJlZSBibG9jayBwb2ludGVyLgorICoKKyAqIHdoZW4gd2MtPnN0YWdlID09IERST1BfUkVGRVJFTkNFLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcworICogcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBibG9jayBwb2ludGVkIHRvLiBpZiB0aGUgYmxvY2sKKyAqIGlzIHNoYXJlZCBhbmQgd2UgbmVlZCB1cGRhdGUgYmFjayByZWZzIGZvciB0aGUgc3VidHJlZQorICogcm9vdGVkIGF0IHRoZSBibG9jaywgdGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHdjLT5zdGFnZSB0bworICogVVBEQVRFX0JBQ0tSRUYuIGlmIHRoZSBibG9jayBpcyBzaGFyZWQgYW5kIHRoZXJlIGlzIG5vCisgKiBuZWVkIHRvIHVwZGF0ZSBiYWNrLCB0aGlzIGZ1bmN0aW9uIGRyb3BzIHRoZSByZWZlcmVuY2UKKyAqIHRvIHRoZSBibG9jay4KKyAqCisgKiBOT1RFOiByZXR1cm4gdmFsdWUgMSBtZWFucyB3ZSBzaG91bGQgc3RvcCB3YWxraW5nIGRvd24uCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgZG9fd2Fsa19kb3duKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjLCBpbnQgKmxvb2t1cF9pbmZvKQoreworCXU2NCBieXRlbnI7CisJdTY0IGdlbmVyYXRpb247CisJdTY0IHBhcmVudDsKKwl1MzIgYmxvY2tzaXplOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpuZXh0OworCWludCBsZXZlbCA9IHdjLT5sZXZlbDsKKwlpbnQgcmVhZGEgPSAwOworCWludCByZXQgPSAwOworCisJZ2VuZXJhdGlvbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24ocGF0aC0+bm9kZXNbbGV2ZWxdLAorCQkJCQkgICAgICAgcGF0aC0+c2xvdHNbbGV2ZWxdKTsKKwkvKgorCSAqIGlmIHRoZSBsb3dlciBsZXZlbCBibG9jayB3YXMgY3JlYXRlZCBiZWZvcmUgdGhlIHNuYXBzaG90CisJICogd2FzIGNyZWF0ZWQsIHdlIGtub3cgdGhlcmUgaXMgbm8gbmVlZCB0byB1cGRhdGUgYmFjayByZWZzCisJICogZm9yIHRoZSBzdWJ0cmVlCisJICovCisJaWYgKHdjLT5zdGFnZSA9PSBVUERBVEVfQkFDS1JFRiAmJgorCSAgICBnZW5lcmF0aW9uIDw9IHJvb3QtPnJvb3Rfa2V5Lm9mZnNldCkgeworCQkqbG9va3VwX2luZm8gPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlieXRlbnIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKHBhdGgtPm5vZGVzW2xldmVsXSwgcGF0aC0+c2xvdHNbbGV2ZWxdKTsKKwlibG9ja3NpemUgPSBidHJmc19sZXZlbF9zaXplKHJvb3QsIGxldmVsIC0gMSk7CisKKwluZXh0ID0gYnRyZnNfZmluZF90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplKTsKKwlpZiAoIW5leHQpIHsKKwkJbmV4dCA9IGJ0cmZzX2ZpbmRfY3JlYXRlX3RyZWVfYmxvY2socm9vdCwgYnl0ZW5yLCBibG9ja3NpemUpOworCQlyZWFkYSA9IDE7CisJfQorCWJ0cmZzX3RyZWVfbG9jayhuZXh0KTsKKwlidHJmc19zZXRfbG9ja19ibG9ja2luZyhuZXh0KTsKKworCXJldCA9IGJ0cmZzX2xvb2t1cF9leHRlbnRfaW5mbyh0cmFucywgcm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsCisJCQkJICAgICAgICZ3Yy0+cmVmc1tsZXZlbCAtIDFdLAorCQkJCSAgICAgICAmd2MtPmZsYWdzW2xldmVsIC0gMV0pOworCUJVR19PTihyZXQpOworCUJVR19PTih3Yy0+cmVmc1tsZXZlbCAtIDFdID09IDApOworCSpsb29rdXBfaW5mbyA9IDA7CisKKwlpZiAod2MtPnN0YWdlID09IERST1BfUkVGRVJFTkNFKSB7CisJCWlmICh3Yy0+cmVmc1tsZXZlbCAtIDFdID4gMSkgeworCQkJaWYgKGxldmVsID09IDEgJiYKKwkJCSAgICAod2MtPmZsYWdzWzBdICYgQlRSRlNfQkxPQ0tfRkxBR19GVUxMX0JBQ0tSRUYpKQorCQkJCWdvdG8gc2tpcDsKKworCQkJaWYgKCF3Yy0+dXBkYXRlX3JlZiB8fAorCQkJICAgIGdlbmVyYXRpb24gPD0gcm9vdC0+cm9vdF9rZXkub2Zmc2V0KQorCQkJCWdvdG8gc2tpcDsKKworCQkJYnRyZnNfbm9kZV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzW2xldmVsXSwgJmtleSwKKwkJCQkJICAgICAgcGF0aC0+c2xvdHNbbGV2ZWxdKTsKKwkJCXJldCA9IGJ0cmZzX2NvbXBfY3B1X2tleXMoJmtleSwgJndjLT51cGRhdGVfcHJvZ3Jlc3MpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBza2lwOworCisJCQl3Yy0+c3RhZ2UgPSBVUERBVEVfQkFDS1JFRjsKKwkJCXdjLT5zaGFyZWRfbGV2ZWwgPSBsZXZlbCAtIDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobGV2ZWwgPT0gMSAmJgorCQkgICAgKHdjLT5mbGFnc1swXSAmIEJUUkZTX0JMT0NLX0ZMQUdfRlVMTF9CQUNLUkVGKSkKKwkJCWdvdG8gc2tpcDsKKwl9CisKKwlpZiAoIWJ0cmZzX2J1ZmZlcl91cHRvZGF0ZShuZXh0LCBnZW5lcmF0aW9uKSkgeworCQlidHJmc190cmVlX3VubG9jayhuZXh0KTsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKG5leHQpOworCQluZXh0ID0gTlVMTDsKKwkJKmxvb2t1cF9pbmZvID0gMTsKKwl9CisKKwlpZiAoIW5leHQpIHsKKwkJaWYgKHJlYWRhICYmIGxldmVsID09IDEpCisJCQlyZWFkYV93YWxrX2Rvd24odHJhbnMsIHJvb3QsIHdjLCBwYXRoKTsKKwkJbmV4dCA9IHJlYWRfdHJlZV9ibG9jayhyb290LCBieXRlbnIsIGJsb2Nrc2l6ZSwgZ2VuZXJhdGlvbik7CisJCWJ0cmZzX3RyZWVfbG9jayhuZXh0KTsKKwkJYnRyZnNfc2V0X2xvY2tfYmxvY2tpbmcobmV4dCk7CisJfQorCisJbGV2ZWwtLTsKKwlCVUdfT04obGV2ZWwgIT0gYnRyZnNfaGVhZGVyX2xldmVsKG5leHQpKTsKKwlwYXRoLT5ub2Rlc1tsZXZlbF0gPSBuZXh0OworCXBhdGgtPnNsb3RzW2xldmVsXSA9IDA7CisJcGF0aC0+bG9ja3NbbGV2ZWxdID0gMTsKKwl3Yy0+bGV2ZWwgPSBsZXZlbDsKKwlpZiAod2MtPmxldmVsID09IDEpCisJCXdjLT5yZWFkYV9zbG90ID0gMDsKKwlyZXR1cm4gMDsKK3NraXA6CisJd2MtPnJlZnNbbGV2ZWwgLSAxXSA9IDA7CisJd2MtPmZsYWdzW2xldmVsIC0gMV0gPSAwOworCWlmICh3Yy0+c3RhZ2UgPT0gRFJPUF9SRUZFUkVOQ0UpIHsKKwkJaWYgKHdjLT5mbGFnc1tsZXZlbF0gJiBCVFJGU19CTE9DS19GTEFHX0ZVTExfQkFDS1JFRikgeworCQkJcGFyZW50ID0gcGF0aC0+bm9kZXNbbGV2ZWxdLT5zdGFydDsKKwkJfSBlbHNlIHsKKwkJCUJVR19PTihyb290LT5yb290X2tleS5vYmplY3RpZCAhPQorCQkJICAgICAgIGJ0cmZzX2hlYWRlcl9vd25lcihwYXRoLT5ub2Rlc1tsZXZlbF0pKTsKKwkJCXBhcmVudCA9IDA7CisJCX0KKworCQlyZXQgPSBidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsIHBhcmVudCwKKwkJCQkJcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsIGxldmVsIC0gMSwgMCk7CisJCUJVR19PTihyZXQpOworCX0KKwlidHJmc190cmVlX3VubG9jayhuZXh0KTsKKwlmcmVlX2V4dGVudF9idWZmZXIobmV4dCk7CisJKmxvb2t1cF9pbmZvID0gMTsKKwlyZXR1cm4gMTsKK30KKworLyoKICAqIGhlcGxlciB0byBwcm9jZXNzIHRyZWUgYmxvY2sgd2hpbGUgd2Fsa2luZyB1cCB0aGUgdHJlZS4KICAqCiAgKiB3aGVuIHdjLT5zdGFnZSA9PSBEUk9QX1JFRkVSRU5DRSwgdGhpcyBmdW5jdGlvbiBkcm9wcwpAQCAtNDkwNSw3ICs1MjIyLDYgQEAKIAkJaWYgKGxldmVsIDwgd2MtPnNoYXJlZF9sZXZlbCkKIAkJCWdvdG8gb3V0OwogCi0JCUJVR19PTih3Yy0+cmVmc1tsZXZlbF0gPD0gMSk7CiAJCXJldCA9IGZpbmRfbmV4dF9rZXkocGF0aCwgbGV2ZWwgKyAxLCAmd2MtPnVwZGF0ZV9wcm9ncmVzcyk7CiAJCWlmIChyZXQgPiAwKQogCQkJd2MtPnVwZGF0ZV9yZWYgPSAwOwpAQCAtNDkzNiw4ICs1MjUyLDYgQEAKIAkJCQlwYXRoLT5sb2Nrc1tsZXZlbF0gPSAwOwogCQkJCXJldHVybiAxOwogCQkJfQotCQl9IGVsc2UgewotCQkJQlVHX09OKGxldmVsICE9IDApOwogCQl9CiAJfQogCkBAIC00OTkwLDM5ICs1MzA0LDI4IEBACiAJCQkJICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCiAJCQkJICAgc3RydWN0IHdhbGtfY29udHJvbCAqd2MpCiB7Ci0Jc3RydWN0IGV4dGVudF9idWZmZXIgKm5leHQ7Ci0Jc3RydWN0IGV4dGVudF9idWZmZXIgKmN1cjsKLQl1NjQgYnl0ZW5yOwotCXU2NCBwdHJfZ2VuOwotCXUzMiBibG9ja3NpemU7CiAJaW50IGxldmVsID0gd2MtPmxldmVsOworCWludCBsb29rdXBfaW5mbyA9IDE7CiAJaW50IHJldDsKIAogCXdoaWxlIChsZXZlbCA+PSAwKSB7Ci0JCWN1ciA9IHBhdGgtPm5vZGVzW2xldmVsXTsKLQkJQlVHX09OKHBhdGgtPnNsb3RzW2xldmVsXSA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhjdXIpKTsKKwkJaWYgKHBhdGgtPnNsb3RzW2xldmVsXSA+PQorCQkgICAgYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbbGV2ZWxdKSkKKwkJCWJyZWFrOwogCi0JCXJldCA9IHdhbGtfZG93bl9wcm9jKHRyYW5zLCByb290LCBwYXRoLCB3Yyk7CisJCXJldCA9IHdhbGtfZG93bl9wcm9jKHRyYW5zLCByb290LCBwYXRoLCB3YywgbG9va3VwX2luZm8pOwogCQlpZiAocmV0ID4gMCkKIAkJCWJyZWFrOwogCiAJCWlmIChsZXZlbCA9PSAwKQogCQkJYnJlYWs7CiAKLQkJYnl0ZW5yID0gYnRyZnNfbm9kZV9ibG9ja3B0cihjdXIsIHBhdGgtPnNsb3RzW2xldmVsXSk7Ci0JCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgbGV2ZWwgLSAxKTsKLQkJcHRyX2dlbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24oY3VyLCBwYXRoLT5zbG90c1tsZXZlbF0pOwotCi0JCW5leHQgPSByZWFkX3RyZWVfYmxvY2socm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsIHB0cl9nZW4pOwotCQlidHJmc190cmVlX2xvY2sobmV4dCk7Ci0JCWJ0cmZzX3NldF9sb2NrX2Jsb2NraW5nKG5leHQpOwotCi0JCWxldmVsLS07Ci0JCUJVR19PTihsZXZlbCAhPSBidHJmc19oZWFkZXJfbGV2ZWwobmV4dCkpOwotCQlwYXRoLT5ub2Rlc1tsZXZlbF0gPSBuZXh0OwotCQlwYXRoLT5zbG90c1tsZXZlbF0gPSAwOwotCQlwYXRoLT5sb2Nrc1tsZXZlbF0gPSAxOwotCQl3Yy0+bGV2ZWwgPSBsZXZlbDsKKwkJcmV0ID0gZG9fd2Fsa19kb3duKHRyYW5zLCByb290LCBwYXRoLCB3YywgJmxvb2t1cF9pbmZvKTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCXBhdGgtPnNsb3RzW2xldmVsXSsrOworCQkJY29udGludWU7CisJCX0KKwkJbGV2ZWwgPSB3Yy0+bGV2ZWw7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNTExMiw5ICs1NDE1LDcgQEAKIAkJCWVyciA9IHJldDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWJ0cmZzX25vZGVfa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1tsZXZlbF0sICZrZXksCi0JCQkJICAgICAgcGF0aC0+c2xvdHNbbGV2ZWxdKTsKLQkJV0FSTl9PTihtZW1jbXAoJmtleSwgJndjLT51cGRhdGVfcHJvZ3Jlc3MsIHNpemVvZihrZXkpKSk7CisJCVdBUk5fT04ocmV0ID4gMCk7CiAKIAkJLyoKIAkJICogdW5sb2NrIG91ciBwYXRoLCB0aGlzIGlzIHNhZmUgYmVjYXVzZSBvbmx5IHRoaXMKQEAgLTUxNDksNiArNTQ1MCw3IEBACiAJd2MtPnN0YWdlID0gRFJPUF9SRUZFUkVOQ0U7CiAJd2MtPnVwZGF0ZV9yZWYgPSB1cGRhdGVfcmVmOwogCXdjLT5rZWVwX2xvY2tzID0gMDsKKwl3Yy0+cmVhZGFfY291bnQgPSBCVFJGU19OT0RFUFRSU19QRVJfQkxPQ0socm9vdCk7CiAKIAl3aGlsZSAoMSkgewogCQlyZXQgPSB3YWxrX2Rvd25fdHJlZSh0cmFucywgcm9vdCwgcGF0aCwgd2MpOwpAQCAtNTIwMSw5ICs1NTAzLDI0IEBACiAJcmV0ID0gYnRyZnNfZGVsX3Jvb3QodHJhbnMsIHRyZWVfcm9vdCwgJnJvb3QtPnJvb3Rfa2V5KTsKIAlCVUdfT04ocmV0KTsKIAotCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5ub2RlKTsKLQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+Y29tbWl0X3Jvb3QpOwotCWtmcmVlKHJvb3QpOworCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCAhPSBCVFJGU19UUkVFX1JFTE9DX09CSkVDVElEKSB7CisJCXJldCA9IGJ0cmZzX2ZpbmRfbGFzdF9yb290KHRyZWVfcm9vdCwgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCSAgIE5VTEwsIE5VTEwpOworCQlCVUdfT04ocmV0IDwgMCk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlyZXQgPSBidHJmc19kZWxfb3JwaGFuX2l0ZW0odHJhbnMsIHRyZWVfcm9vdCwKKwkJCQkJCSAgICByb290LT5yb290X2tleS5vYmplY3RpZCk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCX0KKworCWlmIChyb290LT5pbl9yYWRpeCkgeworCQlidHJmc19mcmVlX2ZzX3Jvb3QodHJlZV9yb290LT5mc19pbmZvLCByb290KTsKKwl9IGVsc2UgeworCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+bm9kZSk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5jb21taXRfcm9vdCk7CisJCWtmcmVlKHJvb3QpOworCX0KIG91dDoKIAlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHRyZWVfcm9vdCk7CiAJa2ZyZWUod2MpOwpAQCAtNTI1NSw2ICs1NTcyLDcgQEAKIAl3Yy0+c3RhZ2UgPSBEUk9QX1JFRkVSRU5DRTsKIAl3Yy0+dXBkYXRlX3JlZiA9IDA7CiAJd2MtPmtlZXBfbG9ja3MgPSAxOworCXdjLT5yZWFkYV9jb3VudCA9IEJUUkZTX05PREVQVFJTX1BFUl9CTE9DSyhyb290KTsKIAogCXdoaWxlICgxKSB7CiAJCXdyZXQgPSB3YWxrX2Rvd25fdHJlZSh0cmFucywgcm9vdCwgcGF0aCwgd2MpOwpAQCAtNTM5Nyw5ICs1NzE1LDkgQEAKIAlsb2NrX2V4dGVudCgmQlRSRlNfSShyZWxvY19pbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKIAl3aGlsZSAoMSkgewogCQlpbnQgcmV0OwotCQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCQl3cml0ZV9sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAkJcmV0ID0gYWRkX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGVtKTsKLQkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCQl3cml0ZV91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCQlpZiAocmV0ICE9IC1FRVhJU1QpIHsKIAkJCWZyZWVfZXh0ZW50X21hcChlbSk7CiAJCQlicmVhazsKQEAgLTY4NDIsMjg3ICs3MTYwLDg2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAwCi1zdGF0aWMgaW50IF9faW5zZXJ0X29ycGhhbl9pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJIHU2NCBvYmplY3RpZCwgdTY0IHNpemUpCisvKgorICogY2hlY2tzIHRvIHNlZSBpZiBpdHMgZXZlbiBwb3NzaWJsZSB0byByZWxvY2F0ZSB0aGlzIGJsb2NrIGdyb3VwLgorICoKKyAqIEByZXR1cm4gLSAtMSBpZiBpdCdzIG5vdCBhIGdvb2QgaWRlYSB0byByZWxvY2F0ZSB0aGlzIGJsb2NrIGdyb3VwLCAwIGlmIGl0cworICogb2sgdG8gZ28gYWhlYWQgYW5kIHRyeS4KKyAqLworaW50IGJ0cmZzX2Nhbl9yZWxvY2F0ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVucikKIHsKLQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKLQlzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqaXRlbTsKLQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKLQlpbnQgcmV0OwotCi0JcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlpZiAoIXBhdGgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwotCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pbm9kZSh0cmFucywgcm9vdCwgcGF0aCwgb2JqZWN0aWQpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwotCWl0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOwotCW1lbXNldF9leHRlbnRfYnVmZmVyKGxlYWYsIDAsICh1bnNpZ25lZCBsb25nKWl0ZW0sIHNpemVvZigqaXRlbSkpOwotCWJ0cmZzX3NldF9pbm9kZV9nZW5lcmF0aW9uKGxlYWYsIGl0ZW0sIDEpOwotCWJ0cmZzX3NldF9pbm9kZV9zaXplKGxlYWYsIGl0ZW0sIHNpemUpOwotCWJ0cmZzX3NldF9pbm9kZV9tb2RlKGxlYWYsIGl0ZW0sIFNfSUZSRUcgfCAwNjAwKTsKLQlidHJmc19zZXRfaW5vZGVfZmxhZ3MobGVhZiwgaXRlbSwgQlRSRlNfSU5PREVfTk9DT01QUkVTUyk7Ci0JYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7Ci0JYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOwotb3V0OgotCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgbm9pbmxpbmUgc3RydWN0IGlub2RlICpjcmVhdGVfcmVsb2NfaW5vZGUoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCi0JCQkJCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqZ3JvdXApCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7Ci0Jc3RydWN0IGJ0cmZzX2tleSByb290X2tleTsKLQl1NjQgb2JqZWN0aWQgPSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEOwotCWludCBlcnIgPSAwOwotCi0Jcm9vdF9rZXkub2JqZWN0aWQgPSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQ7Ci0Jcm9vdF9rZXkudHlwZSA9IEJUUkZTX1JPT1RfSVRFTV9LRVk7Ci0Jcm9vdF9rZXkub2Zmc2V0ID0gKHU2NCktMTsKLQlyb290ID0gYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUoZnNfaW5mbywgJnJvb3Rfa2V5KTsKLQlpZiAoSVNfRVJSKHJvb3QpKQotCQlyZXR1cm4gRVJSX0NBU1Qocm9vdCk7Ci0KLQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOwotCUJVR19PTighdHJhbnMpOwotCi0JZXJyID0gYnRyZnNfZmluZF9mcmVlX29iamVjdGlkKHRyYW5zLCByb290LCBvYmplY3RpZCwgJm9iamVjdGlkKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCWVyciA9IF9faW5zZXJ0X29ycGhhbl9pbm9kZSh0cmFucywgcm9vdCwgb2JqZWN0aWQsIGdyb3VwLT5rZXkub2Zmc2V0KTsKLQlCVUdfT04oZXJyKTsKLQotCWVyciA9IGJ0cmZzX2luc2VydF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgb2JqZWN0aWQsIDAsIDAsIDAsCi0JCQkJICAgICAgIGdyb3VwLT5rZXkub2Zmc2V0LCAwLCBncm91cC0+a2V5Lm9mZnNldCwKLQkJCQkgICAgICAgMCwgMCwgMCk7Ci0JQlVHX09OKGVycik7Ci0KLQlpbm9kZSA9IGJ0cmZzX2lnZXRfbG9ja2VkKHJvb3QtPmZzX2luZm8tPnNiLCBvYmplY3RpZCwgcm9vdCk7Ci0JaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKLQkJQlRSRlNfSShpbm9kZSktPnJvb3QgPSByb290OwotCQlCVFJGU19JKGlub2RlKS0+bG9jYXRpb24ub2JqZWN0aWQgPSBvYmplY3RpZDsKLQkJQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLnR5cGUgPSBCVFJGU19JTk9ERV9JVEVNX0tFWTsKLQkJQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLm9mZnNldCA9IDA7Ci0JCWJ0cmZzX3JlYWRfbG9ja2VkX2lub2RlKGlub2RlKTsKLQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JCUJVR19PTihpc19iYWRfaW5vZGUoaW5vZGUpKTsKLQl9IGVsc2UgewotCQlCVUdfT04oMSk7Ci0JfQotCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSBncm91cC0+a2V5Lm9iamVjdGlkOwotCi0JZXJyID0gYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOwotb3V0OgotCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JaWYgKGVycikgewotCQlpZiAoaW5vZGUpCi0JCQlpcHV0KGlub2RlKTsKLQkJaW5vZGUgPSBFUlJfUFRSKGVycik7Ci0JfQotCXJldHVybiBpbm9kZTsKLX0KLQotaW50IGJ0cmZzX3JlbG9jX2Nsb25lX2NzdW1zKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBmaWxlX3BvcywgdTY0IGxlbikKLXsKLQotCXN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSAqc3VtczsKLQlzdHJ1Y3QgYnRyZnNfc2VjdG9yX3N1bSAqc2VjdG9yX3N1bTsKLQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQ7Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc2l6ZV90IG9mZnNldDsKLQlpbnQgcmV0OwotCXU2NCBkaXNrX2J5dGVucjsKLQotCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKLQotCW9yZGVyZWQgPSBidHJmc19sb29rdXBfb3JkZXJlZF9leHRlbnQoaW5vZGUsIGZpbGVfcG9zKTsKLQlCVUdfT04ob3JkZXJlZC0+ZmlsZV9vZmZzZXQgIT0gZmlsZV9wb3MgfHwgb3JkZXJlZC0+bGVuICE9IGxlbik7Ci0KLQlkaXNrX2J5dGVuciA9IGZpbGVfcG9zICsgQlRSRlNfSShpbm9kZSktPmluZGV4X2NudDsKLQlyZXQgPSBidHJmc19sb29rdXBfY3N1bXNfcmFuZ2Uocm9vdC0+ZnNfaW5mby0+Y3N1bV9yb290LCBkaXNrX2J5dGVuciwKLQkJCQkgICAgICAgZGlza19ieXRlbnIgKyBsZW4gLSAxLCAmbGlzdCk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7Ci0JCXN1bXMgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgc3RydWN0IGJ0cmZzX29yZGVyZWRfc3VtLCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmc3Vtcy0+bGlzdCk7Ci0KLQkJc2VjdG9yX3N1bSA9IHN1bXMtPnN1bXM7Ci0JCXN1bXMtPmJ5dGVuciA9IG9yZGVyZWQtPnN0YXJ0OwotCi0JCW9mZnNldCA9IDA7Ci0JCXdoaWxlIChvZmZzZXQgPCBzdW1zLT5sZW4pIHsKLQkJCXNlY3Rvcl9zdW0tPmJ5dGVuciArPSBvcmRlcmVkLT5zdGFydCAtIGRpc2tfYnl0ZW5yOwotCQkJc2VjdG9yX3N1bSsrOwotCQkJb2Zmc2V0ICs9IHJvb3QtPnNlY3RvcnNpemU7Ci0JCX0KLQotCQlidHJmc19hZGRfb3JkZXJlZF9zdW0oaW5vZGUsIG9yZGVyZWQsIHN1bXMpOwotCX0KLQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBidHJmc19yZWxvY2F0ZV9ibG9ja19ncm91cChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGdyb3VwX3N0YXJ0KQotewotCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOwotCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwotCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gcm9vdC0+ZnNfaW5mbzsKLQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKLQlzdHJ1Y3QgaW5vZGUgKnJlbG9jX2lub2RlOwogCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXA7Ci0Jc3RydWN0IGJ0cmZzX2tleSBrZXk7Ci0JdTY0IHNraXBwZWQ7Ci0JdTY0IGN1cl9ieXRlOwotCXU2NCB0b3RhbF9mb3VuZDsKLQl1MzIgbnJpdGVtczsKLQlpbnQgcmV0OwotCWludCBwcm9ncmVzczsKLQlpbnQgcGFzcyA9IDA7CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87CisJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKKwlpbnQgZnVsbCA9IDA7CisJaW50IHJldCA9IDA7CiAKLQlyb290ID0gcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CisJYmxvY2tfZ3JvdXAgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAocm9vdC0+ZnNfaW5mbywgYnl0ZW5yKTsKIAotCWJsb2NrX2dyb3VwID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKGluZm8sIGdyb3VwX3N0YXJ0KTsKLQlCVUdfT04oIWJsb2NrX2dyb3VwKTsKKwkvKiBvZGQsIGNvdWxkbid0IGZpbmQgdGhlIGJsb2NrIGdyb3VwLCBsZWF2ZSBpdCBhbG9uZSAqLworCWlmICghYmxvY2tfZ3JvdXApCisJCXJldHVybiAtMTsKIAotCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIHJlbG9jYXRpbmcgYmxvY2sgZ3JvdXAgJWxsdSBmbGFncyAlbGx1XG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2tfZ3JvdXAtPmZsYWdzKTsKKwkvKiBubyBieXRlcyB1c2VkLCB3ZSdyZSBnb29kICovCisJaWYgKCFidHJmc19ibG9ja19ncm91cF91c2VkKCZibG9ja19ncm91cC0+aXRlbSkpCisJCWdvdG8gb3V0OwogCi0JcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCXNwYWNlX2luZm8gPSBibG9ja19ncm91cC0+c3BhY2VfaW5mbzsKKwlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOwogCi0JcmVsb2NfaW5vZGUgPSBjcmVhdGVfcmVsb2NfaW5vZGUoaW5mbywgYmxvY2tfZ3JvdXApOwotCUJVR19PTihJU19FUlIocmVsb2NfaW5vZGUpKTsKKwlmdWxsID0gc3BhY2VfaW5mby0+ZnVsbDsKIAotCV9fYWxsb2NfY2h1bmtfZm9yX3Nocmluayhyb290LCBibG9ja19ncm91cCwgMSk7Ci0Jc2V0X2Jsb2NrX2dyb3VwX3JlYWRvbmx5KGJsb2NrX2dyb3VwKTsKKwkvKgorCSAqIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZ3JvdXAgd2UgaGF2ZSBpbiB0aGlzIHNwYWNlLCB3ZSBjYW4ndAorCSAqIHJlbG9jYXRlIGl0IHVubGVzcyB3ZSdyZSBhYmxlIHRvIGFsbG9jYXRlIGEgbmV3IGNodW5rIGJlbG93LgorCSAqCisJICogT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gaW4gdGhlIHNwYWNlIHRvIGhhbmRsZQorCSAqIGFsbCBvZiB0aGUgZXh0ZW50cyBmcm9tIHRoaXMgYmxvY2sgZ3JvdXAuICBJZiB3ZSBjYW4sIHdlJ3JlIGdvb2QKKwkgKi8KKwlpZiAoKHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzICE9IGJsb2NrX2dyb3VwLT5rZXkub2Zmc2V0KSAmJgorCSAgIChzcGFjZV9pbmZvLT5ieXRlc191c2VkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKworCSAgICBzcGFjZV9pbmZvLT5ieXRlc19waW5uZWQgKyBzcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSArCisJICAgIGJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJmJsb2NrX2dyb3VwLT5pdGVtKSA8CisJICAgIHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzKSkgeworCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAKLQlidHJmc19zdGFydF9kZWxhbGxvY19pbm9kZXMoaW5mby0+dHJlZV9yb290KTsKLQlidHJmc193YWl0X29yZGVyZWRfZXh0ZW50cyhpbmZvLT50cmVlX3Jvb3QsIDApOwotYWdhaW46Ci0Jc2tpcHBlZCA9IDA7Ci0JdG90YWxfZm91bmQgPSAwOwotCXByb2dyZXNzID0gMDsKLQlrZXkub2JqZWN0aWQgPSBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkOwotCWtleS5vZmZzZXQgPSAwOwotCWtleS50eXBlID0gMDsKLQljdXJfYnl0ZSA9IGtleS5vYmplY3RpZDsKKwkvKgorCSAqIG9rIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNwYWNlLCBidXQgbWF5YmUgd2UgaGF2ZSBmcmVlIHNwYWNlIG9uIG91cgorCSAqIGRldmljZXMgdG8gYWxsb2NhdGUgbmV3IGNodW5rcyBmb3IgcmVsb2NhdGlvbiwgc28gbG9vcCB0aHJvdWdoIG91cgorCSAqIGFsbG9jIGRldmljZXMgYW5kIGd1ZXNzIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlLiAgSG93ZXZlciwgaWYgd2UKKwkgKiB3ZXJlIG1hcmtlZCBhcyBmdWxsLCB0aGVuIHdlIGtub3cgdGhlcmUgYXJlbid0IGVub3VnaCBjaHVua3MsIGFuZCB3ZQorCSAqIGNhbiBqdXN0IHJldHVybi4KKwkgKi8KKwlyZXQgPSAtMTsKKwlpZiAoZnVsbCkKKwkJZ290byBvdXQ7CiAKLQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKGluZm8tPnRyZWVfcm9vdCwgMSk7Ci0JYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCBpbmZvLT50cmVlX3Jvb3QpOworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmNodW5rX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmZzX2RldmljZXMtPmFsbG9jX2xpc3QsIGRldl9hbGxvY19saXN0KSB7CisJCXU2NCBtaW5fZnJlZSA9IGJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJmJsb2NrX2dyb3VwLT5pdGVtKTsKKwkJdTY0IGRldl9vZmZzZXQsIG1heF9hdmFpbDsKIAotCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOwotCWJ0cmZzX2NsZWFuX29sZF9zbmFwc2hvdHMoaW5mby0+dHJlZV9yb290KTsKLQlidHJmc19yZW1vdmVfbGVhZl9yZWZzKGluZm8tPnRyZWVfcm9vdCwgKHU2NCktMSwgMSk7Ci0JbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5jbGVhbmVyX211dGV4KTsKLQotCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24oaW5mby0+dHJlZV9yb290LCAxKTsKLQlidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIGluZm8tPnRyZWVfcm9vdCk7Ci0KLQl3aGlsZSAoMSkgewotCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLW5leHQ6Ci0JCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKLQkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOwotCQlpZiAocGF0aC0+c2xvdHNbMF0gPj0gbnJpdGVtcykgewotCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBvdXQ7Ci0JCQlpZiAocmV0ID09IDEpIHsKLQkJCQlyZXQgPSAwOworCQkvKgorCQkgKiBjaGVjayB0byBtYWtlIHN1cmUgd2UgY2FuIGFjdHVhbGx5IGZpbmQgYSBjaHVuayB3aXRoIGVub3VnaAorCQkgKiBzcGFjZSB0byBmaXQgb3VyIGJsb2NrIGdyb3VwIGluLgorCQkgKi8KKwkJaWYgKGRldmljZS0+dG90YWxfYnl0ZXMgPiBkZXZpY2UtPmJ5dGVzX3VzZWQgKyBtaW5fZnJlZSkgeworCQkJcmV0ID0gZmluZF9mcmVlX2Rldl9leHRlbnQoTlVMTCwgZGV2aWNlLCBtaW5fZnJlZSwKKwkJCQkJCSAgICZkZXZfb2Zmc2V0LCAmbWF4X2F2YWlsKTsKKwkJCWlmICghcmV0KQogCQkJCWJyZWFrOwotCQkJfQotCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwotCQkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworCQkJcmV0ID0gLTE7CiAJCX0KLQotCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOwotCi0JCWlmIChrZXkub2JqZWN0aWQgPj0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCArCi0JCSAgICBibG9ja19ncm91cC0+a2V5Lm9mZnNldCkKLQkJCWJyZWFrOwotCi0JCWlmIChwcm9ncmVzcyAmJiBuZWVkX3Jlc2NoZWQoKSkgewotCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOwotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQlwcm9ncmVzcyA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwcm9ncmVzcyA9IDE7Ci0KLQkJaWYgKGJ0cmZzX2tleV90eXBlKCZrZXkpICE9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWSB8fAotCQkgICAga2V5Lm9iamVjdGlkICsga2V5Lm9mZnNldCA8PSBjdXJfYnl0ZSkgewotCQkJcGF0aC0+c2xvdHNbMF0rKzsKLQkJCWdvdG8gbmV4dDsKLQkJfQotCi0JCXRvdGFsX2ZvdW5kKys7Ci0JCWN1cl9ieXRlID0ga2V5Lm9iamVjdGlkICsga2V5Lm9mZnNldDsKLQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOwotCi0JCV9fYWxsb2NfY2h1bmtfZm9yX3Nocmluayhyb290LCBibG9ja19ncm91cCwgMCk7Ci0JCXJldCA9IHJlbG9jYXRlX29uZV9leHRlbnQocm9vdCwgcGF0aCwgJmtleSwgYmxvY2tfZ3JvdXAsCi0JCQkJCSAgcmVsb2NfaW5vZGUsIHBhc3MpOwotCQlCVUdfT04ocmV0IDwgMCk7Ci0JCWlmIChyZXQgPiAwKQotCQkJc2tpcHBlZCsrOwotCi0JCWtleS5vYmplY3RpZCA9IGN1cl9ieXRlOwotCQlrZXkudHlwZSA9IDA7Ci0JCWtleS5vZmZzZXQgPSAwOwogCX0KLQotCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKLQotCWlmIChwYXNzID09IDApIHsKLQkJYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKHJlbG9jX2lub2RlLCAwLCAodTY0KS0xKTsKLQkJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHJlbG9jX2lub2RlLT5pX21hcHBpbmcsIDAsIC0xKTsKLQl9Ci0KLQlpZiAodG90YWxfZm91bmQgPiAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIGZvdW5kICVsbHUgZXh0ZW50cyBpbiBwYXNzICVkXG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0b3RhbF9mb3VuZCwgcGFzcyk7Ci0JCXBhc3MrKzsKLQkJaWYgKHRvdGFsX2ZvdW5kID09IHNraXBwZWQgJiYgcGFzcyA+IDIpIHsKLQkJCWlwdXQocmVsb2NfaW5vZGUpOwotCQkJcmVsb2NfaW5vZGUgPSBjcmVhdGVfcmVsb2NfaW5vZGUoaW5mbywgYmxvY2tfZ3JvdXApOwotCQkJcGFzcyA9IDA7Ci0JCX0KLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQkvKiBkZWxldGUgcmVsb2NfaW5vZGUgKi8KLQlpcHV0KHJlbG9jX2lub2RlKTsKLQotCS8qIHVucGluIGV4dGVudHMgaW4gdGhpcyByYW5nZSAqLwotCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24oaW5mby0+dHJlZV9yb290LCAxKTsKLQlidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIGluZm8tPnRyZWVfcm9vdCk7Ci0KLQlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKLQlXQVJOX09OKGJsb2NrX2dyb3VwLT5waW5uZWQgPiAwKTsKLQlXQVJOX09OKGJsb2NrX2dyb3VwLT5yZXNlcnZlZCA+IDApOwotCVdBUk5fT04oYnRyZnNfYmxvY2tfZ3JvdXBfdXNlZCgmYmxvY2tfZ3JvdXAtPml0ZW0pID4gMCk7Ci0Jc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKLQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwotCXJldCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5jaHVua19tdXRleCk7CiBvdXQ6Ci0JYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWJ0cmZzX3B1dF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CiAJcmV0dXJuIHJldDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgaW50IGZpbmRfZmlyc3RfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpCkBAIC03MTY1LDggKzcyODIsMTggQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwOwogCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvOworCXN0cnVjdCBidHJmc19jYWNoaW5nX2NvbnRyb2wgKmNhY2hpbmdfY3RsOwogCXN0cnVjdCByYl9ub2RlICpuOwogCisJZG93bl93cml0ZSgmaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOworCXdoaWxlICghbGlzdF9lbXB0eSgmaW5mby0+Y2FjaGluZ19ibG9ja19ncm91cHMpKSB7CisJCWNhY2hpbmdfY3RsID0gbGlzdF9lbnRyeShpbmZvLT5jYWNoaW5nX2Jsb2NrX2dyb3Vwcy5uZXh0LAorCQkJCQkgc3RydWN0IGJ0cmZzX2NhY2hpbmdfY29udHJvbCwgbGlzdCk7CisJCWxpc3RfZGVsKCZjYWNoaW5nX2N0bC0+bGlzdCk7CisJCXB1dF9jYWNoaW5nX2NvbnRyb2woY2FjaGluZ19jdGwpOworCX0KKwl1cF93cml0ZSgmaW5mby0+ZXh0ZW50X2NvbW1pdF9zZW0pOworCiAJc3Bpbl9sb2NrKCZpbmZvLT5ibG9ja19ncm91cF9jYWNoZV9sb2NrKTsKIAl3aGlsZSAoKG4gPSByYl9sYXN0KCZpbmZvLT5ibG9ja19ncm91cF9jYWNoZV90cmVlKSkgIT0gTlVMTCkgewogCQlibG9ja19ncm91cCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSwKQEAgLTcxODAsOCArNzMwNyw3IEBACiAJCXVwX3dyaXRlKCZibG9ja19ncm91cC0+c3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CiAKIAkJaWYgKGJsb2NrX2dyb3VwLT5jYWNoZWQgPT0gQlRSRlNfQ0FDSEVfU1RBUlRFRCkKLQkJCXdhaXRfZXZlbnQoYmxvY2tfZ3JvdXAtPmNhY2hpbmdfcSwKLQkJCQkgICBibG9ja19ncm91cF9jYWNoZV9kb25lKGJsb2NrX2dyb3VwKSk7CisJCQl3YWl0X2Jsb2NrX2dyb3VwX2NhY2hlX2RvbmUoYmxvY2tfZ3JvdXApOwogCiAJCWJ0cmZzX3JlbW92ZV9mcmVlX3NwYWNlX2NhY2hlKGJsb2NrX2dyb3VwKTsKIApAQCAtNzI1MSw3ICs3Mzc3LDYgQEAKIAkJc3Bpbl9sb2NrX2luaXQoJmNhY2hlLT5sb2NrKTsKIAkJc3Bpbl9sb2NrX2luaXQoJmNhY2hlLT50cmVlX2xvY2spOwogCQljYWNoZS0+ZnNfaW5mbyA9IGluZm87Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhY2hlLT5jYWNoaW5nX3EpOwogCQlJTklUX0xJU1RfSEVBRCgmY2FjaGUtPmxpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmY2FjaGUtPmNsdXN0ZXJfbGlzdCk7CiAKQEAgLTcyNzMsOCArNzM5OCw2IEBACiAJCWNhY2hlLT5mbGFncyA9IGJ0cmZzX2Jsb2NrX2dyb3VwX2ZsYWdzKCZjYWNoZS0+aXRlbSk7CiAJCWNhY2hlLT5zZWN0b3JzaXplID0gcm9vdC0+c2VjdG9yc2l6ZTsKIAotCQlyZW1vdmVfc2JfZnJvbV9jYWNoZShyb290LCBjYWNoZSk7Ci0KIAkJLyoKIAkJICogY2hlY2sgZm9yIHR3byBjYXNlcywgZWl0aGVyIHdlIGFyZSBmdWxsLCBhbmQgdGhlcmVmb3JlCiAJCSAqIGRvbid0IG5lZWQgdG8gYm90aGVyIHdpdGggdGhlIGNhY2hpbmcgd29yayBzaW5jZSB3ZSB3b24ndApAQCAtNzI4MywxMyArNzQwNiwxOSBAQAogCQkgKiB0aW1lLCBwYXJ0aWN1bGFybHkgaW4gdGhlIGZ1bGwgY2FzZS4KIAkJICovCiAJCWlmIChmb3VuZF9rZXkub2Zmc2V0ID09IGJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJmNhY2hlLT5pdGVtKSkgeworCQkJZXhjbHVkZV9zdXBlcl9zdHJpcGVzKHJvb3QsIGNhY2hlKTsKKwkJCWNhY2hlLT5sYXN0X2J5dGVfdG9fdW5waW4gPSAodTY0KS0xOwogCQkJY2FjaGUtPmNhY2hlZCA9IEJUUkZTX0NBQ0hFX0ZJTklTSEVEOworCQkJZnJlZV9leGNsdWRlZF9leHRlbnRzKHJvb3QsIGNhY2hlKTsKIAkJfSBlbHNlIGlmIChidHJmc19ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSkgPT0gMCkgeworCQkJZXhjbHVkZV9zdXBlcl9zdHJpcGVzKHJvb3QsIGNhY2hlKTsKKwkJCWNhY2hlLT5sYXN0X2J5dGVfdG9fdW5waW4gPSAodTY0KS0xOwogCQkJY2FjaGUtPmNhY2hlZCA9IEJUUkZTX0NBQ0hFX0ZJTklTSEVEOwogCQkJYWRkX25ld19mcmVlX3NwYWNlKGNhY2hlLCByb290LT5mc19pbmZvLAogCQkJCQkgICBmb3VuZF9rZXkub2JqZWN0aWQsCiAJCQkJCSAgIGZvdW5kX2tleS5vYmplY3RpZCArCiAJCQkJCSAgIGZvdW5kX2tleS5vZmZzZXQpOworCQkJZnJlZV9leGNsdWRlZF9leHRlbnRzKHJvb3QsIGNhY2hlKTsKIAkJfQogCiAJCXJldCA9IHVwZGF0ZV9zcGFjZV9pbmZvKGluZm8sIGNhY2hlLT5mbGFncywgZm91bmRfa2V5Lm9mZnNldCwKQEAgLTcyOTcsNiArNzQyNiwxMCBAQAogCQkJCQkmc3BhY2VfaW5mbyk7CiAJCUJVR19PTihyZXQpOwogCQljYWNoZS0+c3BhY2VfaW5mbyA9IHNwYWNlX2luZm87CisJCXNwaW5fbG9jaygmY2FjaGUtPnNwYWNlX2luZm8tPmxvY2spOworCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfc3VwZXIgKz0gY2FjaGUtPmJ5dGVzX3N1cGVyOworCQlzcGluX3VubG9jaygmY2FjaGUtPnNwYWNlX2luZm8tPmxvY2spOworCiAJCWRvd25fd3JpdGUoJnNwYWNlX2luZm8tPmdyb3Vwc19zZW0pOwogCQlsaXN0X2FkZF90YWlsKCZjYWNoZS0+bGlzdCwgJnNwYWNlX2luZm8tPmJsb2NrX2dyb3Vwcyk7CiAJCXVwX3dyaXRlKCZzcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKQEAgLTczNDYsNyArNzQ3OSw2IEBACiAJYXRvbWljX3NldCgmY2FjaGUtPmNvdW50LCAxKTsKIAlzcGluX2xvY2tfaW5pdCgmY2FjaGUtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZjYWNoZS0+dHJlZV9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWNoZS0+Y2FjaGluZ19xKTsKIAlJTklUX0xJU1RfSEVBRCgmY2FjaGUtPmxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+Y2x1c3Rlcl9saXN0KTsKIApAQCAtNzM1NSwxNSArNzQ4NywyMyBAQAogCWNhY2hlLT5mbGFncyA9IHR5cGU7CiAJYnRyZnNfc2V0X2Jsb2NrX2dyb3VwX2ZsYWdzKCZjYWNoZS0+aXRlbSwgdHlwZSk7CiAKKwljYWNoZS0+bGFzdF9ieXRlX3RvX3VucGluID0gKHU2NCktMTsKIAljYWNoZS0+Y2FjaGVkID0gQlRSRlNfQ0FDSEVfRklOSVNIRUQ7Ci0JcmVtb3ZlX3NiX2Zyb21fY2FjaGUocm9vdCwgY2FjaGUpOworCWV4Y2x1ZGVfc3VwZXJfc3RyaXBlcyhyb290LCBjYWNoZSk7CiAKIAlhZGRfbmV3X2ZyZWVfc3BhY2UoY2FjaGUsIHJvb3QtPmZzX2luZm8sIGNodW5rX29mZnNldCwKIAkJCSAgIGNodW5rX29mZnNldCArIHNpemUpOwogCisJZnJlZV9leGNsdWRlZF9leHRlbnRzKHJvb3QsIGNhY2hlKTsKKwogCXJldCA9IHVwZGF0ZV9zcGFjZV9pbmZvKHJvb3QtPmZzX2luZm8sIGNhY2hlLT5mbGFncywgc2l6ZSwgYnl0ZXNfdXNlZCwKIAkJCQkmY2FjaGUtPnNwYWNlX2luZm8pOwogCUJVR19PTihyZXQpOworCisJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CisJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3N1cGVyICs9IGNhY2hlLT5ieXRlc19zdXBlcjsKKwlzcGluX3VubG9jaygmY2FjaGUtPnNwYWNlX2luZm8tPmxvY2spOworCiAJZG93bl93cml0ZSgmY2FjaGUtPnNwYWNlX2luZm8tPmdyb3Vwc19zZW0pOwogCWxpc3RfYWRkX3RhaWwoJmNhY2hlLT5saXN0LCAmY2FjaGUtPnNwYWNlX2luZm8tPmJsb2NrX2dyb3Vwcyk7CiAJdXBfd3JpdGUoJmNhY2hlLT5zcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKQEAgLTc0MjksOCArNzU2OSw3IEBACiAJdXBfd3JpdGUoJmJsb2NrX2dyb3VwLT5zcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKIAogCWlmIChibG9ja19ncm91cC0+Y2FjaGVkID09IEJUUkZTX0NBQ0hFX1NUQVJURUQpCi0JCXdhaXRfZXZlbnQoYmxvY2tfZ3JvdXAtPmNhY2hpbmdfcSwKLQkJCSAgIGJsb2NrX2dyb3VwX2NhY2hlX2RvbmUoYmxvY2tfZ3JvdXApKTsKKwkJd2FpdF9ibG9ja19ncm91cF9jYWNoZV9kb25lKGJsb2NrX2dyb3VwKTsKIAogCWJ0cmZzX3JlbW92ZV9mcmVlX3NwYWNlX2NhY2hlKGJsb2NrX2dyb3VwKTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X2lvLmMgYi9mcy9idHJmcy9leHRlbnRfaW8uYwppbmRleCA2ODI2MDE4Li45NjU3N2U4IDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfaW8uYworKysgYi9mcy9idHJmcy9leHRlbnRfaW8uYwpAQCAtMjgwLDYgKzI4MCwxNCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBtZXJnZV9jYihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBleHRlbnRfc3RhdGUgKm5ldywKKwkJICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcikKK3sKKwlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+bWVyZ2VfZXh0ZW50X2hvb2spCisJCXRyZWUtPm9wcy0+bWVyZ2VfZXh0ZW50X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwgbmV3LAorCQkJCQkgICAgIG90aGVyKTsKK30KKwogLyoKICAqIHV0aWxpdHkgZnVuY3Rpb24gdG8gbG9vayBmb3IgbWVyZ2UgY2FuZGlkYXRlcyBpbnNpZGUgYSBnaXZlbiByYW5nZS4KICAqIEFueSBleHRlbnRzIHdpdGggbWF0Y2hpbmcgc3RhdGUgYXJlIG1lcmdlZCB0b2dldGhlciBpbnRvIGEgc2luZ2xlCkBAIC0zMDMsNiArMzExLDcgQEAKIAkJb3RoZXIgPSByYl9lbnRyeShvdGhlcl9ub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLCByYl9ub2RlKTsKIAkJaWYgKG90aGVyLT5lbmQgPT0gc3RhdGUtPnN0YXJ0IC0gMSAmJgogCQkgICAgb3RoZXItPnN0YXRlID09IHN0YXRlLT5zdGF0ZSkgeworCQkJbWVyZ2VfY2IodHJlZSwgc3RhdGUsIG90aGVyKTsKIAkJCXN0YXRlLT5zdGFydCA9IG90aGVyLT5zdGFydDsKIAkJCW90aGVyLT50cmVlID0gTlVMTDsKIAkJCXJiX2VyYXNlKCZvdGhlci0+cmJfbm9kZSwgJnRyZWUtPnN0YXRlKTsKQEAgLTMxNCwzMyArMzIzLDM3IEBACiAJCW90aGVyID0gcmJfZW50cnkob3RoZXJfbm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CiAJCWlmIChvdGhlci0+c3RhcnQgPT0gc3RhdGUtPmVuZCArIDEgJiYKIAkJICAgIG90aGVyLT5zdGF0ZSA9PSBzdGF0ZS0+c3RhdGUpIHsKKwkJCW1lcmdlX2NiKHRyZWUsIHN0YXRlLCBvdGhlcik7CiAJCQlvdGhlci0+c3RhcnQgPSBzdGF0ZS0+c3RhcnQ7CiAJCQlzdGF0ZS0+dHJlZSA9IE5VTEw7CiAJCQlyYl9lcmFzZSgmc3RhdGUtPnJiX25vZGUsICZ0cmVlLT5zdGF0ZSk7CiAJCQlmcmVlX2V4dGVudF9zdGF0ZShzdGF0ZSk7CisJCQlzdGF0ZSA9IE5VTEw7CiAJCX0KIAl9CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3N0YXRlX2NiKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKK3N0YXRpYyBpbnQgc2V0X3N0YXRlX2NiKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKIAkJCSBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKIAkJCSB1bnNpZ25lZCBsb25nIGJpdHMpCiB7CiAJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPnNldF9iaXRfaG9vaykgewotCQl0cmVlLT5vcHMtPnNldF9iaXRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LCBzdGF0ZS0+c3RhcnQsCi0JCQkJCXN0YXRlLT5lbmQsIHN0YXRlLT5zdGF0ZSwgYml0cyk7CisJCXJldHVybiB0cmVlLT5vcHMtPnNldF9iaXRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LAorCQkJCQkgICAgICAgc3RhdGUtPnN0YXJ0LCBzdGF0ZS0+ZW5kLAorCQkJCQkgICAgICAgc3RhdGUtPnN0YXRlLCBiaXRzKTsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgY2xlYXJfc3RhdGVfY2Ioc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAogCQkJICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCiAJCQkgICB1bnNpZ25lZCBsb25nIGJpdHMpCiB7Ci0JaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPmNsZWFyX2JpdF9ob29rKSB7Ci0JCXRyZWUtPm9wcy0+Y2xlYXJfYml0X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwgc3RhdGUtPnN0YXJ0LAotCQkJCQkgIHN0YXRlLT5lbmQsIHN0YXRlLT5zdGF0ZSwgYml0cyk7Ci0JfQorCWlmICh0cmVlLT5vcHMgJiYgdHJlZS0+b3BzLT5jbGVhcl9iaXRfaG9vaykKKwkJdHJlZS0+b3BzLT5jbGVhcl9iaXRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LCBzdGF0ZSwgYml0cyk7CiB9CiAKIC8qCkBAIC0zNTgsNiArMzcxLDcgQEAKIAkJCWludCBiaXRzKQogewogCXN0cnVjdCByYl9ub2RlICpub2RlOworCWludCByZXQ7CiAKIAlpZiAoZW5kIDwgc3RhcnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBlbmQgPCBzdGFydCAlbGx1ICVsbHVcbiIsCkBAIC0zNjUsMTIgKzM3OSwxNSBAQAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCk7CiAJCVdBUk5fT04oMSk7CiAJfQotCWlmIChiaXRzICYgRVhURU5UX0RJUlRZKQotCQl0cmVlLT5kaXJ0eV9ieXRlcyArPSBlbmQgLSBzdGFydCArIDE7Ci0Jc2V0X3N0YXRlX2NiKHRyZWUsIHN0YXRlLCBiaXRzKTsKLQlzdGF0ZS0+c3RhdGUgfD0gYml0czsKIAlzdGF0ZS0+c3RhcnQgPSBzdGFydDsKIAlzdGF0ZS0+ZW5kID0gZW5kOworCXJldCA9IHNldF9zdGF0ZV9jYih0cmVlLCBzdGF0ZSwgYml0cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChiaXRzICYgRVhURU5UX0RJUlRZKQorCQl0cmVlLT5kaXJ0eV9ieXRlcyArPSBlbmQgLSBzdGFydCArIDE7CisJc3RhdGUtPnN0YXRlIHw9IGJpdHM7CiAJbm9kZSA9IHRyZWVfaW5zZXJ0KCZ0cmVlLT5zdGF0ZSwgZW5kLCAmc3RhdGUtPnJiX25vZGUpOwogCWlmIChub2RlKSB7CiAJCXN0cnVjdCBleHRlbnRfc3RhdGUgKmZvdW5kOwpAQCAtMzg3LDYgKzQwNCwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNwbGl0X2NiKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywKKwkJICAgICB1NjQgc3BsaXQpCit7CisJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPnNwbGl0X2V4dGVudF9ob29rKQorCQlyZXR1cm4gdHJlZS0+b3BzLT5zcGxpdF9leHRlbnRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LAorCQkJCQkJICAgIG9yaWcsIHNwbGl0KTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIHNwbGl0IGEgZ2l2ZW4gZXh0ZW50IHN0YXRlIHN0cnVjdCBpbiB0d28sIGluc2VydGluZyB0aGUgcHJlYWxsb2NhdGVkCiAgKiBzdHJ1Y3QgJ3ByZWFsbG9jJyBhcyB0aGUgbmV3bHkgY3JlYXRlZCBzZWNvbmQgaGFsZi4gICdzcGxpdCcgaW5kaWNhdGVzIGFuCkBAIC00MDUsNiArNDMxLDkgQEAKIAkJICAgICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnByZWFsbG9jLCB1NjQgc3BsaXQpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwlzcGxpdF9jYih0cmVlLCBvcmlnLCBzcGxpdCk7CisKIAlwcmVhbGxvYy0+c3RhcnQgPSBvcmlnLT5zdGFydDsKIAlwcmVhbGxvYy0+ZW5kID0gc3BsaXQgLSAxOwogCXByZWFsbG9jLT5zdGF0ZSA9IG9yaWctPnN0YXRlOwpAQCAtNDMxLDcgKzQ2MCw4IEBACiAJCQkgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCBiaXRzLCBpbnQgd2FrZSwKIAkJCSAgICBpbnQgZGVsZXRlKQogewotCWludCByZXQgPSBzdGF0ZS0+c3RhdGUgJiBiaXRzOworCWludCBiaXRzX3RvX2NsZWFyID0gYml0cyAmIH5FWFRFTlRfRE9fQUNDT1VOVElORzsKKwlpbnQgcmV0ID0gc3RhdGUtPnN0YXRlICYgYml0c190b19jbGVhcjsKIAogCWlmICgoYml0cyAmIEVYVEVOVF9ESVJUWSkgJiYgKHN0YXRlLT5zdGF0ZSAmIEVYVEVOVF9ESVJUWSkpIHsKIAkJdTY0IHJhbmdlID0gc3RhdGUtPmVuZCAtIHN0YXRlLT5zdGFydCArIDE7CkBAIC00MzksNyArNDY5LDcgQEAKIAkJdHJlZS0+ZGlydHlfYnl0ZXMgLT0gcmFuZ2U7CiAJfQogCWNsZWFyX3N0YXRlX2NiKHRyZWUsIHN0YXRlLCBiaXRzKTsKLQlzdGF0ZS0+c3RhdGUgJj0gfmJpdHM7CisJc3RhdGUtPnN0YXRlICY9IH5iaXRzX3RvX2NsZWFyOwogCWlmICh3YWtlKQogCQl3YWtlX3VwKCZzdGF0ZS0+d3EpOwogCWlmIChkZWxldGUgfHwgc3RhdGUtPnN0YXRlID09IDApIHsKQEAgLTQ3MSwxMCArNTAxLDE0IEBACiAgKiBiaXRzIHdlcmUgYWxyZWFkeSBzZXQsIG9yIHplcm8gaWYgbm9uZSBvZiB0aGUgYml0cyB3ZXJlIGFscmVhZHkgc2V0LgogICovCiBpbnQgY2xlYXJfZXh0ZW50X2JpdChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKLQkJICAgICBpbnQgYml0cywgaW50IHdha2UsIGludCBkZWxldGUsIGdmcF90IG1hc2spCisJCSAgICAgaW50IGJpdHMsIGludCB3YWtlLCBpbnQgZGVsZXRlLAorCQkgICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKipjYWNoZWRfc3RhdGUsCisJCSAgICAgZ2ZwX3QgbWFzaykKIHsKIAlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpjYWNoZWQ7CiAJc3RydWN0IGV4dGVudF9zdGF0ZSAqcHJlYWxsb2MgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpuZXh0X25vZGU7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAJdTY0IGxhc3RfZW5kOwogCWludCBlcnI7CkBAIC00ODgsNiArNTIyLDE3IEBACiAJfQogCiAJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKKwlpZiAoY2FjaGVkX3N0YXRlKSB7CisJCWNhY2hlZCA9ICpjYWNoZWRfc3RhdGU7CisJCSpjYWNoZWRfc3RhdGUgPSBOVUxMOworCQljYWNoZWRfc3RhdGUgPSBOVUxMOworCQlpZiAoY2FjaGVkICYmIGNhY2hlZC0+dHJlZSAmJiBjYWNoZWQtPnN0YXJ0ID09IHN0YXJ0KSB7CisJCQlhdG9taWNfZGVjKCZjYWNoZWQtPnJlZnMpOworCQkJc3RhdGUgPSBjYWNoZWQ7CisJCQlnb3RvIGhpdF9uZXh0OworCQl9CisJCWZyZWVfZXh0ZW50X3N0YXRlKGNhY2hlZCk7CisJfQogCS8qCiAJICogdGhpcyBzZWFyY2ggd2lsbCBmaW5kIHRoZSBleHRlbnRzIHRoYXQgZW5kIGFmdGVyCiAJICogb3VyIHJhbmdlIHN0YXJ0cwpAQCAtNDk2LDYgKzU0MSw3IEBACiAJaWYgKCFub2RlKQogCQlnb3RvIG91dDsKIAlzdGF0ZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOworaGl0X25leHQ6CiAJaWYgKHN0YXRlLT5zdGFydCA+IGVuZCkKIAkJZ290byBvdXQ7CiAJV0FSTl9PTihzdGF0ZS0+ZW5kIDwgc3RhcnQpOwpAQCAtNTI2LDEzICs1NzIsMTEgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQlpZiAoc3RhdGUtPmVuZCA8PSBlbmQpIHsKLQkJCXNldCB8PSBjbGVhcl9zdGF0ZV9iaXQodHJlZSwgc3RhdGUsIGJpdHMsCi0JCQkJCXdha2UsIGRlbGV0ZSk7CisJCQlzZXQgfD0gY2xlYXJfc3RhdGVfYml0KHRyZWUsIHN0YXRlLCBiaXRzLCB3YWtlLAorCQkJCQkgICAgICAgZGVsZXRlKTsKIAkJCWlmIChsYXN0X2VuZCA9PSAodTY0KS0xKQogCQkJCWdvdG8gb3V0OwogCQkJc3RhcnQgPSBsYXN0X2VuZCArIDE7Ci0JCX0gZWxzZSB7Ci0JCQlzdGFydCA9IHN0YXRlLT5zdGFydDsKIAkJfQogCQlnb3RvIHNlYXJjaF9hZ2FpbjsKIAl9CkBAIC01NDcsMTkgKzU5MSwzMCBAQAogCQkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGUoR0ZQX0FUT01JQyk7CiAJCWVyciA9IHNwbGl0X3N0YXRlKHRyZWUsIHN0YXRlLCBwcmVhbGxvYywgZW5kICsgMSk7CiAJCUJVR19PTihlcnIgPT0gLUVFWElTVCk7Ci0KIAkJaWYgKHdha2UpCiAJCQl3YWtlX3VwKCZzdGF0ZS0+d3EpOwotCQlzZXQgfD0gY2xlYXJfc3RhdGVfYml0KHRyZWUsIHByZWFsbG9jLCBiaXRzLAotCQkJCSAgICAgICB3YWtlLCBkZWxldGUpOworCisJCXNldCB8PSBjbGVhcl9zdGF0ZV9iaXQodHJlZSwgcHJlYWxsb2MsIGJpdHMsIHdha2UsIGRlbGV0ZSk7CisKIAkJcHJlYWxsb2MgPSBOVUxMOwogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAoc3RhdGUtPmVuZCA8IGVuZCAmJiBwcmVhbGxvYyAmJiAhbmVlZF9yZXNjaGVkKCkpCisJCW5leHRfbm9kZSA9IHJiX25leHQoJnN0YXRlLT5yYl9ub2RlKTsKKwllbHNlCisJCW5leHRfbm9kZSA9IE5VTEw7CisKIAlzZXQgfD0gY2xlYXJfc3RhdGVfYml0KHRyZWUsIHN0YXRlLCBiaXRzLCB3YWtlLCBkZWxldGUpOwogCWlmIChsYXN0X2VuZCA9PSAodTY0KS0xKQogCQlnb3RvIG91dDsKIAlzdGFydCA9IGxhc3RfZW5kICsgMTsKKwlpZiAoc3RhcnQgPD0gZW5kICYmIG5leHRfbm9kZSkgeworCQlzdGF0ZSA9IHJiX2VudHJ5KG5leHRfbm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwKKwkJCQkgcmJfbm9kZSk7CisJCWlmIChzdGF0ZS0+c3RhcnQgPT0gc3RhcnQpCisJCQlnb3RvIGhpdF9uZXh0OworCX0KIAlnb3RvIHNlYXJjaF9hZ2FpbjsKIAogb3V0OgpAQCAtNjQxLDQwICs2OTYsNTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3N0YXRlX2JpdHMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorc3RhdGljIGludCBzZXRfc3RhdGVfYml0cyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCiAJCQkgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKIAkJCSAgIGludCBiaXRzKQogeworCWludCByZXQ7CisKKwlyZXQgPSBzZXRfc3RhdGVfY2IodHJlZSwgc3RhdGUsIGJpdHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAoKGJpdHMgJiBFWFRFTlRfRElSVFkpICYmICEoc3RhdGUtPnN0YXRlICYgRVhURU5UX0RJUlRZKSkgewogCQl1NjQgcmFuZ2UgPSBzdGF0ZS0+ZW5kIC0gc3RhdGUtPnN0YXJ0ICsgMTsKIAkJdHJlZS0+ZGlydHlfYnl0ZXMgKz0gcmFuZ2U7CiAJfQotCXNldF9zdGF0ZV9jYih0cmVlLCBzdGF0ZSwgYml0cyk7CiAJc3RhdGUtPnN0YXRlIHw9IGJpdHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2FjaGVfc3RhdGUoc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCisJCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkX3B0cikKK3sKKwlpZiAoY2FjaGVkX3B0ciAmJiAhKCpjYWNoZWRfcHRyKSkgeworCQlpZiAoc3RhdGUtPnN0YXRlICYgKEVYVEVOVF9JT0JJVFMgfCBFWFRFTlRfQk9VTkRBUlkpKSB7CisJCQkqY2FjaGVkX3B0ciA9IHN0YXRlOworCQkJYXRvbWljX2luYygmc3RhdGUtPnJlZnMpOworCQl9CisJfQogfQogCiAvKgotICogc2V0IHNvbWUgYml0cyBvbiBhIHJhbmdlIGluIHRoZSB0cmVlLiAgVGhpcyBtYXkgcmVxdWlyZSBhbGxvY2F0aW9ucwotICogb3Igc2xlZXBpbmcsIHNvIHRoZSBnZnAgbWFzayBpcyB1c2VkIHRvIGluZGljYXRlIHdoYXQgaXMgYWxsb3dlZC4KKyAqIHNldCBzb21lIGJpdHMgb24gYSByYW5nZSBpbiB0aGUgdHJlZS4gIFRoaXMgbWF5IHJlcXVpcmUgYWxsb2NhdGlvbnMgb3IKKyAqIHNsZWVwaW5nLCBzbyB0aGUgZ2ZwIG1hc2sgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGF0IGlzIGFsbG93ZWQuCiAgKgotICogSWYgJ2V4Y2x1c2l2ZScgPT0gMSwgdGhpcyB3aWxsIGZhaWwgd2l0aCAtRUVYSVNUIGlmIHNvbWUgcGFydCBvZiB0aGUKLSAqIHJhbmdlIGFscmVhZHkgaGFzIHRoZSBkZXNpcmVkIGJpdHMgc2V0LiAgVGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZwotICogcmFuZ2UgaXMgcmV0dXJuZWQgaW4gZmFpbGVkX3N0YXJ0IGluIHRoaXMgY2FzZS4KKyAqIElmIGFueSBvZiB0aGUgZXhjbHVzaXZlIGJpdHMgYXJlIHNldCwgdGhpcyB3aWxsIGZhaWwgd2l0aCAtRUVYSVNUIGlmIHNvbWUKKyAqIHBhcnQgb2YgdGhlIHJhbmdlIGFscmVhZHkgaGFzIHRoZSBkZXNpcmVkIGJpdHMgc2V0LiAgVGhlIHN0YXJ0IG9mIHRoZQorICogZXhpc3RpbmcgcmFuZ2UgaXMgcmV0dXJuZWQgaW4gZmFpbGVkX3N0YXJ0IGluIHRoaXMgY2FzZS4KICAqCi0gKiBbc3RhcnQsIGVuZF0gaXMgaW5jbHVzaXZlCi0gKiBUaGlzIHRha2VzIHRoZSB0cmVlIGxvY2suCisgKiBbc3RhcnQsIGVuZF0gaXMgaW5jbHVzaXZlIFRoaXMgdGFrZXMgdGhlIHRyZWUgbG9jay4KICAqLworCiBzdGF0aWMgaW50IHNldF9leHRlbnRfYml0KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAotCQkJICBpbnQgYml0cywgaW50IGV4Y2x1c2l2ZSwgdTY0ICpmYWlsZWRfc3RhcnQsCisJCQkgIGludCBiaXRzLCBpbnQgZXhjbHVzaXZlX2JpdHMsIHU2NCAqZmFpbGVkX3N0YXJ0LAorCQkJICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkX3N0YXRlLAogCQkJICBnZnBfdCBtYXNrKQogewogCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOwogCXN0cnVjdCBleHRlbnRfc3RhdGUgKnByZWFsbG9jID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAlpbnQgZXJyID0gMDsKLQlpbnQgc2V0OwogCXU2NCBsYXN0X3N0YXJ0OwogCXU2NCBsYXN0X2VuZDsKKwogYWdhaW46CiAJaWYgKCFwcmVhbGxvYyAmJiAobWFzayAmIF9fR0ZQX1dBSVQpKSB7CiAJCXByZWFsbG9jID0gYWxsb2NfZXh0ZW50X3N0YXRlKG1hc2spOwpAQCAtNjgzLDYgKzc1NywxMyBAQAogCX0KIAogCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7CisJaWYgKGNhY2hlZF9zdGF0ZSAmJiAqY2FjaGVkX3N0YXRlKSB7CisJCXN0YXRlID0gKmNhY2hlZF9zdGF0ZTsKKwkJaWYgKHN0YXRlLT5zdGFydCA9PSBzdGFydCAmJiBzdGF0ZS0+dHJlZSkgeworCQkJbm9kZSA9ICZzdGF0ZS0+cmJfbm9kZTsKKwkJCWdvdG8gaGl0X25leHQ7CisJCX0KKwl9CiAJLyoKIAkgKiB0aGlzIHNlYXJjaCB3aWxsIGZpbmQgYWxsIHRoZSBleHRlbnRzIHRoYXQgZW5kIGFmdGVyCiAJICogb3VyIHJhbmdlIHN0YXJ0cy4KQEAgLTY5NCw4ICs3NzUsOCBAQAogCQlCVUdfT04oZXJyID09IC1FRVhJU1QpOwogCQlnb3RvIG91dDsKIAl9Ci0KIAlzdGF0ZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOworaGl0X25leHQ6CiAJbGFzdF9zdGFydCA9IHN0YXRlLT5zdGFydDsKIAlsYXN0X2VuZCA9IHN0YXRlLT5lbmQ7CiAKQEAgLTcwNiwxNyArNzg3LDMyIEBACiAJICogSnVzdCBsb2NrIHdoYXQgd2UgZm91bmQgYW5kIGtlZXAgZ29pbmcKIAkgKi8KIAlpZiAoc3RhdGUtPnN0YXJ0ID09IHN0YXJ0ICYmIHN0YXRlLT5lbmQgPD0gZW5kKSB7Ci0JCXNldCA9IHN0YXRlLT5zdGF0ZSAmIGJpdHM7Ci0JCWlmIChzZXQgJiYgZXhjbHVzaXZlKSB7CisJCXN0cnVjdCByYl9ub2RlICpuZXh0X25vZGU7CisJCWlmIChzdGF0ZS0+c3RhdGUgJiBleGNsdXNpdmVfYml0cykgewogCQkJKmZhaWxlZF9zdGFydCA9IHN0YXRlLT5zdGFydDsKIAkJCWVyciA9IC1FRVhJU1Q7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgYml0cyk7CisKKwkJZXJyID0gc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsIGJpdHMpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJY2FjaGVfc3RhdGUoc3RhdGUsIGNhY2hlZF9zdGF0ZSk7CiAJCW1lcmdlX3N0YXRlKHRyZWUsIHN0YXRlKTsKIAkJaWYgKGxhc3RfZW5kID09ICh1NjQpLTEpCiAJCQlnb3RvIG91dDsKKwogCQlzdGFydCA9IGxhc3RfZW5kICsgMTsKKwkJaWYgKHN0YXJ0IDwgZW5kICYmIHByZWFsbG9jICYmICFuZWVkX3Jlc2NoZWQoKSkgeworCQkJbmV4dF9ub2RlID0gcmJfbmV4dChub2RlKTsKKwkJCWlmIChuZXh0X25vZGUpIHsKKwkJCQlzdGF0ZSA9IHJiX2VudHJ5KG5leHRfbm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwKKwkJCQkJCSByYl9ub2RlKTsKKwkJCQlpZiAoc3RhdGUtPnN0YXJ0ID09IHN0YXJ0KQorCQkJCQlnb3RvIGhpdF9uZXh0OworCQkJfQorCQl9CiAJCWdvdG8gc2VhcmNoX2FnYWluOwogCX0KIApAQCAtNzM3LDggKzgzMyw3IEBACiAJICogZGVzaXJlZCBiaXQgb24gaXQuCiAJICovCiAJaWYgKHN0YXRlLT5zdGFydCA8IHN0YXJ0KSB7Ci0JCXNldCA9IHN0YXRlLT5zdGF0ZSAmIGJpdHM7Ci0JCWlmIChleGNsdXNpdmUgJiYgc2V0KSB7CisJCWlmIChzdGF0ZS0+c3RhdGUgJiBleGNsdXNpdmVfYml0cykgewogCQkJKmZhaWxlZF9zdGFydCA9IHN0YXJ0OwogCQkJZXJyID0gLUVFWElTVDsKIAkJCWdvdG8gb3V0OwpAQCAtNzQ5LDEzICs4NDQsMTQgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQlpZiAoc3RhdGUtPmVuZCA8PSBlbmQpIHsKLQkJCXNldF9zdGF0ZV9iaXRzKHRyZWUsIHN0YXRlLCBiaXRzKTsKKwkJCWVyciA9IHNldF9zdGF0ZV9iaXRzKHRyZWUsIHN0YXRlLCBiaXRzKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCQljYWNoZV9zdGF0ZShzdGF0ZSwgY2FjaGVkX3N0YXRlKTsKIAkJCW1lcmdlX3N0YXRlKHRyZWUsIHN0YXRlKTsKIAkJCWlmIChsYXN0X2VuZCA9PSAodTY0KS0xKQogCQkJCWdvdG8gb3V0OwogCQkJc3RhcnQgPSBsYXN0X2VuZCArIDE7Ci0JCX0gZWxzZSB7Ci0JCQlzdGFydCA9IHN0YXRlLT5zdGFydDsKIAkJfQogCQlnb3RvIHNlYXJjaF9hZ2FpbjsKIAl9CkBAIC03NzQsMTAgKzg3MCwxMyBAQAogCQkJdGhpc19lbmQgPSBsYXN0X3N0YXJ0IC0gMTsKIAkJZXJyID0gaW5zZXJ0X3N0YXRlKHRyZWUsIHByZWFsbG9jLCBzdGFydCwgdGhpc19lbmQsCiAJCQkJICAgYml0cyk7Ci0JCXByZWFsbG9jID0gTlVMTDsKIAkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKLQkJaWYgKGVycikKKwkJaWYgKGVycikgeworCQkJcHJlYWxsb2MgPSBOVUxMOwogCQkJZ290byBvdXQ7CisJCX0KKwkJY2FjaGVfc3RhdGUocHJlYWxsb2MsIGNhY2hlZF9zdGF0ZSk7CisJCXByZWFsbG9jID0gTlVMTDsKIAkJc3RhcnQgPSB0aGlzX2VuZCArIDE7CiAJCWdvdG8gc2VhcmNoX2FnYWluOwogCX0KQEAgLTc4OCw4ICs4ODcsNyBAQAogCSAqIG9uIHRoZSBmaXJzdCBoYWxmCiAJICovCiAJaWYgKHN0YXRlLT5zdGFydCA8PSBlbmQgJiYgc3RhdGUtPmVuZCA+IGVuZCkgewotCQlzZXQgPSBzdGF0ZS0+c3RhdGUgJiBiaXRzOwotCQlpZiAoZXhjbHVzaXZlICYmIHNldCkgeworCQlpZiAoc3RhdGUtPnN0YXRlICYgZXhjbHVzaXZlX2JpdHMpIHsKIAkJCSpmYWlsZWRfc3RhcnQgPSBzdGFydDsKIAkJCWVyciA9IC1FRVhJU1Q7CiAJCQlnb3RvIG91dDsKQEAgLTc5Nyw3ICs4OTUsMTIgQEAKIAkJZXJyID0gc3BsaXRfc3RhdGUodHJlZSwgc3RhdGUsIHByZWFsbG9jLCBlbmQgKyAxKTsKIAkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKIAotCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBwcmVhbGxvYywgYml0cyk7CisJCWVyciA9IHNldF9zdGF0ZV9iaXRzKHRyZWUsIHByZWFsbG9jLCBiaXRzKTsKKwkJaWYgKGVycikgeworCQkJcHJlYWxsb2MgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJY2FjaGVfc3RhdGUocHJlYWxsb2MsIGNhY2hlZF9zdGF0ZSk7CiAJCW1lcmdlX3N0YXRlKHRyZWUsIHByZWFsbG9jKTsKIAkJcHJlYWxsb2MgPSBOVUxMOwogCQlnb3RvIG91dDsKQEAgLTgyNiw4NiArOTI5LDY1IEBACiAJCSAgICAgZ2ZwX3QgbWFzaykKIHsKIAlyZXR1cm4gc2V0X2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX0RJUlRZLCAwLCBOVUxMLAotCQkJICAgICAgbWFzayk7Ci19Ci0KLWludCBzZXRfZXh0ZW50X29yZGVyZWQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCSAgICAgICBnZnBfdCBtYXNrKQotewotCXJldHVybiBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfT1JERVJFRCwgMCwgTlVMTCwgbWFzayk7CisJCQkgICAgICBOVUxMLCBtYXNrKTsKIH0KIAogaW50IHNldF9leHRlbnRfYml0cyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKIAkJICAgIGludCBiaXRzLCBnZnBfdCBtYXNrKQogewogCXJldHVybiBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBiaXRzLCAwLCBOVUxMLAotCQkJICAgICAgbWFzayk7CisJCQkgICAgICBOVUxMLCBtYXNrKTsKIH0KIAogaW50IGNsZWFyX2V4dGVudF9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkgICAgICBpbnQgYml0cywgZ2ZwX3QgbWFzaykKIHsKLQlyZXR1cm4gY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBiaXRzLCAwLCAwLCBtYXNrKTsKKwlyZXR1cm4gY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBiaXRzLCAwLCAwLCBOVUxMLCBtYXNrKTsKIH0KIAogaW50IHNldF9leHRlbnRfZGVsYWxsb2Moc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCSAgICAgZ2ZwX3QgbWFzaykKIHsKIAlyZXR1cm4gc2V0X2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwKLQkJCSAgICAgIEVYVEVOVF9ERUxBTExPQyB8IEVYVEVOVF9ESVJUWSwKLQkJCSAgICAgIDAsIE5VTEwsIG1hc2spOworCQkJICAgICAgRVhURU5UX0RFTEFMTE9DIHwgRVhURU5UX0RJUlRZIHwgRVhURU5UX1VQVE9EQVRFLAorCQkJICAgICAgMCwgTlVMTCwgTlVMTCwgbWFzayk7CiB9CiAKIGludCBjbGVhcl9leHRlbnRfZGlydHkoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCSAgICAgICBnZnBfdCBtYXNrKQogewogCXJldHVybiBjbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsCi0JCQkJRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DLCAwLCAwLCBtYXNrKTsKLX0KLQotaW50IGNsZWFyX2V4dGVudF9vcmRlcmVkKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAotCQkJIGdmcF90IG1hc2spCi17Ci0JcmV0dXJuIGNsZWFyX2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX09SREVSRUQsIDEsIDAsIG1hc2spOworCQkJCUVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8CisJCQkJRVhURU5UX0RPX0FDQ09VTlRJTkcsIDAsIDAsCisJCQkJTlVMTCwgbWFzayk7CiB9CiAKIGludCBzZXRfZXh0ZW50X25ldyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKIAkJICAgICBnZnBfdCBtYXNrKQogewogCXJldHVybiBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTkVXLCAwLCBOVUxMLAotCQkJICAgICAgbWFzayk7CisJCQkgICAgICBOVUxMLCBtYXNrKTsKIH0KIAogc3RhdGljIGludCBjbGVhcl9leHRlbnRfbmV3KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkgICAgICAgZ2ZwX3QgbWFzaykKIHsKLQlyZXR1cm4gY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTkVXLCAwLCAwLCBtYXNrKTsKKwlyZXR1cm4gY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTkVXLCAwLCAwLAorCQkJCU5VTEwsIG1hc2spOwogfQogCiBpbnQgc2V0X2V4dGVudF91cHRvZGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKIAkJCWdmcF90IG1hc2spCiB7CiAJcmV0dXJuIHNldF9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9VUFRPREFURSwgMCwgTlVMTCwKLQkJCSAgICAgIG1hc2spOworCQkJICAgICAgTlVMTCwgbWFzayk7CiB9CiAKIHN0YXRpYyBpbnQgY2xlYXJfZXh0ZW50X3VwdG9kYXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LAogCQkJCSB1NjQgZW5kLCBnZnBfdCBtYXNrKQogewotCXJldHVybiBjbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9VUFRPREFURSwgMCwgMCwgbWFzayk7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2V4dGVudF93cml0ZWJhY2soc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCQkgZ2ZwX3QgbWFzaykKLXsKLQlyZXR1cm4gc2V0X2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX1dSSVRFQkFDSywKLQkJCSAgICAgIDAsIE5VTEwsIG1hc2spOwotfQotCi1zdGF0aWMgaW50IGNsZWFyX2V4dGVudF93cml0ZWJhY2soc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsCi0JCQkJICB1NjQgZW5kLCBnZnBfdCBtYXNrKQotewotCXJldHVybiBjbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9XUklURUJBQ0ssIDEsIDAsIG1hc2spOworCXJldHVybiBjbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9VUFRPREFURSwgMCwgMCwKKwkJCQlOVUxMLCBtYXNrKTsKIH0KIAogaW50IHdhaXRfb25fZXh0ZW50X3dyaXRlYmFjayhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCkKQEAgLTkxNywxMyArOTk5LDE1IEBACiAgKiBlaXRoZXIgaW5zZXJ0IG9yIGxvY2sgc3RhdGUgc3RydWN0IGJldHdlZW4gc3RhcnQgYW5kIGVuZCB1c2UgbWFzayB0byB0ZWxsCiAgKiB1cyBpZiB3YWl0aW5nIGlzIGRlc2lyZWQuCiAgKi8KLWludCBsb2NrX2V4dGVudChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwgZ2ZwX3QgbWFzaykKK2ludCBsb2NrX2V4dGVudF9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgIGludCBiaXRzLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkX3N0YXRlLCBnZnBfdCBtYXNrKQogewogCWludCBlcnI7CiAJdTY0IGZhaWxlZF9zdGFydDsKIAl3aGlsZSAoMSkgewotCQllcnIgPSBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTE9DS0VELCAxLAotCQkJCSAgICAgJmZhaWxlZF9zdGFydCwgbWFzayk7CisJCWVyciA9IHNldF9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQgfCBiaXRzLAorCQkJCSAgICAgRVhURU5UX0xPQ0tFRCwgJmZhaWxlZF9zdGFydCwKKwkJCQkgICAgIGNhY2hlZF9zdGF0ZSwgbWFzayk7CiAJCWlmIChlcnIgPT0gLUVFWElTVCAmJiAobWFzayAmIF9fR0ZQX1dBSVQpKSB7CiAJCQl3YWl0X2V4dGVudF9iaXQodHJlZSwgZmFpbGVkX3N0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQpOwogCQkJc3RhcnQgPSBmYWlsZWRfc3RhcnQ7CkBAIC05MzUsMjcgKzEwMTksNDAgQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgbG9ja19leHRlbnQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsIGdmcF90IG1hc2spCit7CisJcmV0dXJuIGxvY2tfZXh0ZW50X2JpdHModHJlZSwgc3RhcnQsIGVuZCwgMCwgTlVMTCwgbWFzayk7Cit9CisKIGludCB0cnlfbG9ja19leHRlbnQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCSAgICBnZnBfdCBtYXNrKQogewogCWludCBlcnI7CiAJdTY0IGZhaWxlZF9zdGFydDsKIAotCWVyciA9IHNldF9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQsIDEsCi0JCQkgICAgICZmYWlsZWRfc3RhcnQsIG1hc2spOworCWVyciA9IHNldF9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQsIEVYVEVOVF9MT0NLRUQsCisJCQkgICAgICZmYWlsZWRfc3RhcnQsIE5VTEwsIG1hc2spOwogCWlmIChlcnIgPT0gLUVFWElTVCkgewogCQlpZiAoZmFpbGVkX3N0YXJ0ID4gc3RhcnQpCiAJCQljbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBmYWlsZWRfc3RhcnQgLSAxLAotCQkJCQkgRVhURU5UX0xPQ0tFRCwgMSwgMCwgbWFzayk7CisJCQkJCSBFWFRFTlRfTE9DS0VELCAxLCAwLCBOVUxMLCBtYXNrKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAxOwogfQogCitpbnQgdW5sb2NrX2V4dGVudF9jYWNoZWQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqKmNhY2hlZCwgZ2ZwX3QgbWFzaykKK3sKKwlyZXR1cm4gY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTE9DS0VELCAxLCAwLCBjYWNoZWQsCisJCQkJbWFzayk7Cit9CisKIGludCB1bmxvY2tfZXh0ZW50KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkgIGdmcF90IG1hc2spCiB7Ci0JcmV0dXJuIGNsZWFyX2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX0xPQ0tFRCwgMSwgMCwgbWFzayk7CisJcmV0dXJuIGNsZWFyX2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX0xPQ0tFRCwgMSwgMCwgTlVMTCwKKwkJCQltYXNrKTsKIH0KIAogLyoKQEAgLTk3NCw3ICsxMDcxLDYgQEAKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQlpbmRleCsrOwogCX0KLQlzZXRfZXh0ZW50X2RpcnR5KHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTk0LDcgKzEwOTAsNiBAQAogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCWluZGV4Kys7CiAJfQotCXNldF9leHRlbnRfd3JpdGViYWNrKHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIzMiw2ICsxMzI3LDcgQEAKIAl1NjQgZGVsYWxsb2Nfc3RhcnQ7CiAJdTY0IGRlbGFsbG9jX2VuZDsKIAl1NjQgZm91bmQ7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqY2FjaGVkX3N0YXRlID0gTlVMTDsKIAlpbnQgcmV0OwogCWludCBsb29wcyA9IDA7CiAKQEAgLTEyNjksNiArMTM2NSw3IEBACiAJCS8qIHNvbWUgb2YgdGhlIHBhZ2VzIGFyZSBnb25lLCBsZXRzIGF2b2lkIGxvb3BpbmcgYnkKIAkJICogc2hvcnRlbmluZyB0aGUgc2l6ZSBvZiB0aGUgZGVsYWxsb2MgcmFuZ2Ugd2UncmUgc2VhcmNoaW5nCiAJCSAqLworCQlmcmVlX2V4dGVudF9zdGF0ZShjYWNoZWRfc3RhdGUpOwogCQlpZiAoIWxvb3BzKSB7CiAJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICgqc3RhcnQpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOwogCQkJbWF4X2J5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OwpAQCAtMTI4MiwxOCArMTM3OSwyMSBAQAogCUJVR19PTihyZXQpOwogCiAJLyogc3RlcCB0aHJlZSwgbG9jayB0aGUgc3RhdGUgYml0cyBmb3IgdGhlIHdob2xlIHJhbmdlICovCi0JbG9ja19leHRlbnQodHJlZSwgZGVsYWxsb2Nfc3RhcnQsIGRlbGFsbG9jX2VuZCwgR0ZQX05PRlMpOworCWxvY2tfZXh0ZW50X2JpdHModHJlZSwgZGVsYWxsb2Nfc3RhcnQsIGRlbGFsbG9jX2VuZCwKKwkJCSAwLCAmY2FjaGVkX3N0YXRlLCBHRlBfTk9GUyk7CiAKIAkvKiB0aGVuIHRlc3QgdG8gbWFrZSBzdXJlIGl0IGlzIGFsbCBzdGlsbCBkZWxhbGxvYyAqLwogCXJldCA9IHRlc3RfcmFuZ2VfYml0KHRyZWUsIGRlbGFsbG9jX3N0YXJ0LCBkZWxhbGxvY19lbmQsCi0JCQkgICAgIEVYVEVOVF9ERUxBTExPQywgMSk7CisJCQkgICAgIEVYVEVOVF9ERUxBTExPQywgMSwgY2FjaGVkX3N0YXRlKTsKIAlpZiAoIXJldCkgewotCQl1bmxvY2tfZXh0ZW50KHRyZWUsIGRlbGFsbG9jX3N0YXJ0LCBkZWxhbGxvY19lbmQsIEdGUF9OT0ZTKTsKKwkJdW5sb2NrX2V4dGVudF9jYWNoZWQodHJlZSwgZGVsYWxsb2Nfc3RhcnQsIGRlbGFsbG9jX2VuZCwKKwkJCQkgICAgICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKIAkJX191bmxvY2tfZm9yX2RlbGFsbG9jKGlub2RlLCBsb2NrZWRfcGFnZSwKIAkJCSAgICAgIGRlbGFsbG9jX3N0YXJ0LCBkZWxhbGxvY19lbmQpOwogCQljb25kX3Jlc2NoZWQoKTsKIAkJZ290byBhZ2FpbjsKIAl9CisJZnJlZV9leHRlbnRfc3RhdGUoY2FjaGVkX3N0YXRlKTsKIAkqc3RhcnQgPSBkZWxhbGxvY19zdGFydDsKIAkqZW5kID0gZGVsYWxsb2NfZW5kOwogb3V0X2ZhaWxlZDoKQEAgLTEzMDMsMTEgKzE0MDMsNyBAQAogaW50IGV4dGVudF9jbGVhcl91bmxvY2tfZGVsYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCiAJCQkJdTY0IHN0YXJ0LCB1NjQgZW5kLCBzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UsCi0JCQkJaW50IHVubG9ja19wYWdlcywKLQkJCQlpbnQgY2xlYXJfdW5sb2NrLAotCQkJCWludCBjbGVhcl9kZWxhbGxvYywgaW50IGNsZWFyX2RpcnR5LAotCQkJCWludCBzZXRfd3JpdGViYWNrLAotCQkJCWludCBlbmRfd3JpdGViYWNrKQorCQkJCXVuc2lnbmVkIGxvbmcgb3ApCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZXNbMTZdOwpAQCAtMTMxNywxNiArMTQxMywyMSBAQAogCWludCBpOwogCWludCBjbGVhcl9iaXRzID0gMDsKIAotCWlmIChjbGVhcl91bmxvY2spCisJaWYgKG9wICYgRVhURU5UX0NMRUFSX1VOTE9DSykKIAkJY2xlYXJfYml0cyB8PSBFWFRFTlRfTE9DS0VEOwotCWlmIChjbGVhcl9kaXJ0eSkKKwlpZiAob3AgJiBFWFRFTlRfQ0xFQVJfRElSVFkpCiAJCWNsZWFyX2JpdHMgfD0gRVhURU5UX0RJUlRZOwogCi0JaWYgKGNsZWFyX2RlbGFsbG9jKQorCWlmIChvcCAmIEVYVEVOVF9DTEVBUl9ERUxBTExPQykKIAkJY2xlYXJfYml0cyB8PSBFWFRFTlRfREVMQUxMT0M7CiAKLQljbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIGNsZWFyX2JpdHMsIDEsIDAsIEdGUF9OT0ZTKTsKLQlpZiAoISh1bmxvY2tfcGFnZXMgfHwgY2xlYXJfZGlydHkgfHwgc2V0X3dyaXRlYmFjayB8fCBlbmRfd3JpdGViYWNrKSkKKwlpZiAob3AgJiBFWFRFTlRfQ0xFQVJfQUNDT1VOVElORykKKwkJY2xlYXJfYml0cyB8PSBFWFRFTlRfRE9fQUNDT1VOVElORzsKKworCWNsZWFyX2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgY2xlYXJfYml0cywgMSwgMCwgTlVMTCwgR0ZQX05PRlMpOworCWlmICghKG9wICYgKEVYVEVOVF9DTEVBUl9VTkxPQ0tfUEFHRSB8IEVYVEVOVF9DTEVBUl9ESVJUWSB8CisJCSAgICBFWFRFTlRfU0VUX1dSSVRFQkFDSyB8IEVYVEVOVF9FTkRfV1JJVEVCQUNLIHwKKwkJICAgIEVYVEVOVF9TRVRfUFJJVkFURTIpKSkKIAkJcmV0dXJuIDA7CiAKIAl3aGlsZSAobnJfcGFnZXMgPiAwKSB7CkBAIC0xMzM0LDE3ICsxNDM1LDIxIEBACiAJCQkJICAgICBtaW5fdCh1bnNpZ25lZCBsb25nLAogCQkJCSAgICAgbnJfcGFnZXMsIEFSUkFZX1NJWkUocGFnZXMpKSwgcGFnZXMpOwogCQlmb3IgKGkgPSAwOyBpIDwgcmV0OyBpKyspIHsKKworCQkJaWYgKG9wICYgRVhURU5UX1NFVF9QUklWQVRFMikKKwkJCQlTZXRQYWdlUHJpdmF0ZTIocGFnZXNbaV0pOworCiAJCQlpZiAocGFnZXNbaV0gPT0gbG9ja2VkX3BhZ2UpIHsKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKGNsZWFyX2RpcnR5KQorCQkJaWYgKG9wICYgRVhURU5UX0NMRUFSX0RJUlRZKQogCQkJCWNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKHBhZ2VzW2ldKTsKLQkJCWlmIChzZXRfd3JpdGViYWNrKQorCQkJaWYgKG9wICYgRVhURU5UX1NFVF9XUklURUJBQ0spCiAJCQkJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2VzW2ldKTsKLQkJCWlmIChlbmRfd3JpdGViYWNrKQorCQkJaWYgKG9wICYgRVhURU5UX0VORF9XUklURUJBQ0spCiAJCQkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2VzW2ldKTsKLQkJCWlmICh1bmxvY2tfcGFnZXMpCisJCQlpZiAob3AgJiBFWFRFTlRfQ0xFQVJfVU5MT0NLX1BBR0UpCiAJCQkJdW5sb2NrX3BhZ2UocGFnZXNbaV0pOwogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKIAkJfQpAQCAtMTQ3NiwxNCArMTU4MSwxNyBAQAogICogcmFuZ2UgaXMgZm91bmQgc2V0LgogICovCiBpbnQgdGVzdF9yYW5nZV9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCSAgIGludCBiaXRzLCBpbnQgZmlsbGVkKQorCQkgICBpbnQgYml0cywgaW50IGZpbGxlZCwgc3RydWN0IGV4dGVudF9zdGF0ZSAqY2FjaGVkKQogewogCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAlpbnQgYml0c2V0ID0gMDsKIAogCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7Ci0Jbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKKwlpZiAoY2FjaGVkICYmIGNhY2hlZC0+dHJlZSAmJiBjYWNoZWQtPnN0YXJ0ID09IHN0YXJ0KQorCQlub2RlID0gJmNhY2hlZC0+cmJfbm9kZTsKKwllbHNlCisJCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBzdGFydCk7CiAJd2hpbGUgKG5vZGUgJiYgc3RhcnQgPD0gZW5kKSB7CiAJCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CiAKQEAgLTE1MDMsNiArMTYxMSwxMCBAQAogCQkJYml0c2V0ID0gMDsKIAkJCWJyZWFrOwogCQl9CisKKwkJaWYgKHN0YXRlLT5lbmQgPT0gKHU2NCktMSkKKwkJCWJyZWFrOworCiAJCXN0YXJ0ID0gc3RhdGUtPmVuZCArIDE7CiAJCWlmIChzdGFydCA+IGVuZCkKIAkJCWJyZWFrOwpAQCAtMTUyNiw3ICsxNjM4LDcgQEAKIHsKIAl1NjQgc3RhcnQgPSAodTY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJdTY0IGVuZCA9IHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKLQlpZiAodGVzdF9yYW5nZV9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX1VQVE9EQVRFLCAxKSkKKwlpZiAodGVzdF9yYW5nZV9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX1VQVE9EQVRFLCAxLCBOVUxMKSkKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCXJldHVybiAwOwogfQpAQCAtMTU0MCw3ICsxNjUyLDcgQEAKIHsKIAl1NjQgc3RhcnQgPSAodTY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJdTY0IGVuZCA9IHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKLQlpZiAoIXRlc3RfcmFuZ2VfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQsIDApKQorCWlmICghdGVzdF9yYW5nZV9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX0xPQ0tFRCwgMCwgTlVMTCkpCiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCXJldHVybiAwOwogfQpAQCAtMTU1MiwxMCArMTY2NCw3IEBACiBzdGF0aWMgaW50IGNoZWNrX3BhZ2Vfd3JpdGViYWNrKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKIAkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JdTY0IHN0YXJ0ID0gKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOwotCXU2NCBlbmQgPSBzdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7Ci0JaWYgKCF0ZXN0X3JhbmdlX2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfV1JJVEVCQUNLLCAwKSkKLQkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYxMywxMyArMTcyMiwxMSBAQAogCQl9CiAKIAkJaWYgKCF1cHRvZGF0ZSkgewotCQkJY2xlYXJfZXh0ZW50X3VwdG9kYXRlKHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9BVE9NSUMpOworCQkJY2xlYXJfZXh0ZW50X3VwdG9kYXRlKHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKIAkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwogCQkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCQl9CiAKLQkJY2xlYXJfZXh0ZW50X3dyaXRlYmFjayh0cmVlLCBzdGFydCwgZW5kLCBHRlBfQVRPTUlDKTsKLQogCQlpZiAod2hvbGVfcGFnZSkKIAkJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJZWxzZQpAQCAtMTk4Myw3ICsyMDkwLDggQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qIHRoZSBnZXRfZXh0ZW50IGZ1bmN0aW9uIGFscmVhZHkgY29waWVkIGludG8gdGhlIHBhZ2UgKi8KLQkJaWYgKHRlc3RfcmFuZ2VfYml0KHRyZWUsIGN1ciwgY3VyX2VuZCwgRVhURU5UX1VQVE9EQVRFLCAxKSkgeworCQlpZiAodGVzdF9yYW5nZV9iaXQodHJlZSwgY3VyLCBjdXJfZW5kLAorCQkJCSAgIEVYVEVOVF9VUFRPREFURSwgMSwgTlVMTCkpIHsKIAkJCWNoZWNrX3BhZ2VfdXB0b2RhdGUodHJlZSwgcGFnZSk7CiAJCQl1bmxvY2tfZXh0ZW50KHRyZWUsIGN1ciwgY3VyICsgaW9zaXplIC0gMSwgR0ZQX05PRlMpOwogCQkJY3VyID0gY3VyICsgaW9zaXplOwpAQCAtMjA3OCw2ICsyMTg2LDcgQEAKIAl1NjQgaW9zaXplOwogCXU2NCB1bmxvY2tfc3RhcnQ7CiAJc2VjdG9yX3Qgc2VjdG9yOworCXN0cnVjdCBleHRlbnRfc3RhdGUgKmNhY2hlZF9zdGF0ZSA9IE5VTEw7CiAJc3RydWN0IGV4dGVudF9tYXAgKmVtOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJaW50IHJldDsKQEAgLTIxMjQsNiArMjIzMyw3IEBACiAJZGVsYWxsb2NfZW5kID0gMDsKIAlwYWdlX3N0YXJ0ZWQgPSAwOwogCWlmICghZXBkLT5leHRlbnRfbG9ja2VkKSB7CisJCXU2NCBkZWxhbGxvY190b193cml0ZSA9IDA7CiAJCS8qCiAJCSAqIG1ha2Ugc3VyZSB0aGUgd2JjIG1hcHBpbmcgaW5kZXggaXMgYXQgbGVhc3QgdXBkYXRlZAogCQkgKiB0byB0aGlzIHBhZ2UuCkBAIC0yMTQzLDggKzIyNTMsMjQgQEAKIAkJCXRyZWUtPm9wcy0+ZmlsbF9kZWxhbGxvYyhpbm9kZSwgcGFnZSwgZGVsYWxsb2Nfc3RhcnQsCiAJCQkJCQkgZGVsYWxsb2NfZW5kLCAmcGFnZV9zdGFydGVkLAogCQkJCQkJICZucl93cml0dGVuKTsKKwkJCS8qCisJCQkgKiBkZWxhbGxvY19lbmQgaXMgYWxyZWFkeSBvbmUgbGVzcyB0aGFuIHRoZSB0b3RhbAorCQkJICogbGVuZ3RoLCBzbyB3ZSBkb24ndCBzdWJ0cmFjdCBvbmUgZnJvbQorCQkJICogUEFHRV9DQUNIRV9TSVpFCisJCQkgKi8KKwkJCWRlbGFsbG9jX3RvX3dyaXRlICs9IChkZWxhbGxvY19lbmQgLSBkZWxhbGxvY19zdGFydCArCisJCQkJCSAgICAgIFBBR0VfQ0FDSEVfU0laRSkgPj4KKwkJCQkJICAgICAgUEFHRV9DQUNIRV9TSElGVDsKIAkJCWRlbGFsbG9jX3N0YXJ0ID0gZGVsYWxsb2NfZW5kICsgMTsKIAkJfQorCQlpZiAod2JjLT5ucl90b193cml0ZSA8IGRlbGFsbG9jX3RvX3dyaXRlKSB7CisJCQlpbnQgdGhyZXNoID0gODE5MjsKKworCQkJaWYgKGRlbGFsbG9jX3RvX3dyaXRlIDwgdGhyZXNoICogMikKKwkJCQl0aHJlc2ggPSBkZWxhbGxvY190b193cml0ZTsKKwkJCXdiYy0+bnJfdG9fd3JpdGUgPSBtaW5fdCh1NjQsIGRlbGFsbG9jX3RvX3dyaXRlLAorCQkJCQkJIHRocmVzaCk7CisJCX0KIAogCQkvKiBkaWQgdGhlIGZpbGwgZGVsYWxsb2MgZnVuY3Rpb24gYWxyZWFkeSB1bmxvY2sgYW5kIHN0YXJ0CiAJCSAqIHRoZSBJTz8KQEAgLTIxNjAsMTUgKzIyODYsMTAgQEAKIAkJCWdvdG8gZG9uZV91bmxvY2tlZDsKIAkJfQogCX0KLQlsb2NrX2V4dGVudCh0cmVlLCBzdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKLQotCXVubG9ja19zdGFydCA9IHN0YXJ0OwotCiAJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPndyaXRlcGFnZV9zdGFydF9ob29rKSB7CiAJCXJldCA9IHRyZWUtPm9wcy0+d3JpdGVwYWdlX3N0YXJ0X2hvb2socGFnZSwgc3RhcnQsCiAJCQkJCQkgICAgICBwYWdlX2VuZCk7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikgewotCQkJdW5sb2NrX2V4dGVudCh0cmVlLCBzdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKIAkJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CiAJCQl1cGRhdGVfbnJfd3JpdHRlbihwYWdlLCB3YmMsIG5yX3dyaXR0ZW4pOwogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CkBAIC0yMTg0LDEyICsyMzA1LDcgQEAKIAl1cGRhdGVfbnJfd3JpdHRlbihwYWdlLCB3YmMsIG5yX3dyaXR0ZW4gKyAxKTsKIAogCWVuZCA9IHBhZ2VfZW5kOwotCWlmICh0ZXN0X3JhbmdlX2JpdCh0cmVlLCBzdGFydCwgcGFnZV9lbmQsIEVYVEVOVF9ERUxBTExPQywgMCkpCi0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnMgZGVsYWxsb2MgYml0cyBhZnRlciBsb2NrX2V4dGVudFxuIik7Ci0KIAlpZiAobGFzdF9ieXRlIDw9IHN0YXJ0KSB7Ci0JCWNsZWFyX2V4dGVudF9kaXJ0eSh0cmVlLCBzdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKLQkJdW5sb2NrX2V4dGVudCh0cmVlLCBzdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKIAkJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPndyaXRlcGFnZV9lbmRfaW9faG9vaykKIAkJCXRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKHBhZ2UsIHN0YXJ0LAogCQkJCQkJCSBwYWdlX2VuZCwgTlVMTCwgMSk7CkBAIC0yMTk3LDEzICsyMzEzLDEwIEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlzZXRfZXh0ZW50X3VwdG9kYXRlKHRyZWUsIHN0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOwogCWJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAogCXdoaWxlIChjdXIgPD0gZW5kKSB7CiAJCWlmIChjdXIgPj0gbGFzdF9ieXRlKSB7Ci0JCQljbGVhcl9leHRlbnRfZGlydHkodHJlZSwgY3VyLCBwYWdlX2VuZCwgR0ZQX05PRlMpOwotCQkJdW5sb2NrX2V4dGVudCh0cmVlLCB1bmxvY2tfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CiAJCQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKQogCQkJCXRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKHBhZ2UsIGN1ciwKIAkJCQkJCQkgcGFnZV9lbmQsIE5VTEwsIDEpOwpAQCAtMjIzNSwxMiArMjM0OCw2IEBACiAJCSAqLwogCQlpZiAoY29tcHJlc3NlZCB8fCBibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0hPTEUgfHwKIAkJICAgIGJsb2NrX3N0YXJ0ID09IEVYVEVOVF9NQVBfSU5MSU5FKSB7Ci0JCQljbGVhcl9leHRlbnRfZGlydHkodHJlZSwgY3VyLAotCQkJCQkgICBjdXIgKyBpb3NpemUgLSAxLCBHRlBfTk9GUyk7Ci0KLQkJCXVubG9ja19leHRlbnQodHJlZSwgdW5sb2NrX3N0YXJ0LCBjdXIgKyBpb3NpemUgLSAxLAotCQkJCSAgICAgIEdGUF9OT0ZTKTsKLQogCQkJLyoKIAkJCSAqIGVuZF9pbyBub3RpZmljYXRpb24gZG9lcyBub3QgaGFwcGVuIGhlcmUgZm9yCiAJCQkgKiBjb21wcmVzc2VkIGV4dGVudHMKQEAgLTIyNjUsMTMgKzIzNzIsMTIgQEAKIAkJfQogCQkvKiBsZWF2ZSB0aGlzIG91dCB1bnRpbCB3ZSBoYXZlIGEgcGFnZV9ta3dyaXRlIGNhbGwgKi8KIAkJaWYgKDAgJiYgIXRlc3RfcmFuZ2VfYml0KHRyZWUsIGN1ciwgY3VyICsgaW9zaXplIC0gMSwKLQkJCQkgICBFWFRFTlRfRElSVFksIDApKSB7CisJCQkJICAgRVhURU5UX0RJUlRZLCAwLCBOVUxMKSkgewogCQkJY3VyID0gY3VyICsgaW9zaXplOwogCQkJcGdfb2Zmc2V0ICs9IGlvc2l6ZTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJY2xlYXJfZXh0ZW50X2RpcnR5KHRyZWUsIGN1ciwgY3VyICsgaW9zaXplIC0gMSwgR0ZQX05PRlMpOwogCQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+d3JpdGVwYWdlX2lvX2hvb2spIHsKIAkJCXJldCA9IHRyZWUtPm9wcy0+d3JpdGVwYWdlX2lvX2hvb2socGFnZSwgY3VyLAogCQkJCQkJY3VyICsgaW9zaXplIC0gMSk7CkBAIC0yMzA5LDEyICsyNDE1LDEyIEBACiAJCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCX0KLQlpZiAodW5sb2NrX3N0YXJ0IDw9IHBhZ2VfZW5kKQotCQl1bmxvY2tfZXh0ZW50KHRyZWUsIHVubG9ja19zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAogZG9uZV91bmxvY2tlZDoKIAorCS8qIGRyb3Agb3VyIHJlZmVyZW5jZSBvbiBhbnkgY2FjaGVkIHN0YXRlcyAqLworCWZyZWVfZXh0ZW50X3N0YXRlKGNhY2hlZF9zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzMzksOSArMjQ0NSw5IEBACiAJCQkgICAgIHdyaXRlcGFnZV90IHdyaXRlcGFnZSwgdm9pZCAqZGF0YSwKIAkJCSAgICAgdm9pZCAoKmZsdXNoX2ZuKSh2b2lkICopKQogewotCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwogCWludCByZXQgPSAwOwogCWludCBkb25lID0gMDsKKwlpbnQgbnJfdG9fd3JpdGVfZG9uZSA9IDA7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAlpbnQgbnJfcGFnZXM7CiAJcGdvZmZfdCBpbmRleDsKQEAgLTIzNjEsNyArMjQ2Nyw3IEBACiAJCXNjYW5uZWQgPSAxOwogCX0KIHJldHJ5OgotCXdoaWxlICghZG9uZSAmJiAoaW5kZXggPD0gZW5kKSAmJgorCXdoaWxlICghZG9uZSAmJiAhbnJfdG9fd3JpdGVfZG9uZSAmJiAoaW5kZXggPD0gZW5kKSAmJgogCSAgICAgICAobnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cF90YWcoJnB2ZWMsIG1hcHBpbmcsICZpbmRleCwKIAkJCSAgICAgIFBBR0VDQUNIRV9UQUdfRElSVFksIG1pbihlbmQgLSBpbmRleCwKIAkJCQkgIChwZ29mZl90KVBBR0VWRUNfU0laRS0xKSArIDEpKSkgewpAQCAtMjQxMiwxMiArMjUxOCwxNSBAQAogCQkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQkJCXJldCA9IDA7CiAJCQl9Ci0JCQlpZiAocmV0IHx8IHdiYy0+bnJfdG9fd3JpdGUgPD0gMCkKKwkJCWlmIChyZXQpCiAJCQkJZG9uZSA9IDE7Ci0JCQlpZiAod2JjLT5ub25ibG9ja2luZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKLQkJCQl3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24gPSAxOwotCQkJCWRvbmUgPSAxOwotCQkJfQorCisJCQkvKgorCQkJICogdGhlIGZpbGVzeXN0ZW0gbWF5IGNob29zZSB0byBidW1wIHVwIG5yX3RvX3dyaXRlLgorCQkJICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdG8gaG9ub3IgdGhlIG5ldyBucl90b193cml0ZQorCQkJICogYXQgYW55IHRpbWUKKwkJCSAqLworCQkJbnJfdG9fd3JpdGVfZG9uZSA9IHdiYy0+bnJfdG9fd3JpdGUgPD0gMDsKIAkJfQogCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwogCQljb25kX3Jlc2NoZWQoKTsKQEAgLTI2MDQsMTAgKzI3MTMsMTEgQEAKIAkJcmV0dXJuIDA7CiAKIAlsb2NrX2V4dGVudCh0cmVlLCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7Ci0Jd2FpdF9vbl9leHRlbnRfd3JpdGViYWNrKHRyZWUsIHN0YXJ0LCBlbmQpOworCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CiAJY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLAotCQkJIEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MsCi0JCQkgMSwgMSwgR0ZQX05PRlMpOworCQkJIEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MgfAorCQkJIEVYVEVOVF9ET19BQ0NPVU5USU5HLAorCQkJIDEsIDEsIE5VTEwsIEdGUF9OT0ZTKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY4Nyw3ICsyNzk3LDcgQEAKIAkJICAgICFpc25ldyAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpICYmCiAJCSAgICAoYmxvY2tfb2ZmX2VuZCA+IHRvIHx8IGJsb2NrX29mZl9zdGFydCA8IGZyb20pICYmCiAJCSAgICAhdGVzdF9yYW5nZV9iaXQodHJlZSwgYmxvY2tfc3RhcnQsIGN1cl9lbmQsCi0JCQkJICAgIEVYVEVOVF9VUFRPREFURSwgMSkpIHsKKwkJCQkgICAgRVhURU5UX1VQVE9EQVRFLCAxLCBOVUxMKSkgewogCQkJdTY0IHNlY3RvcjsKIAkJCXU2NCBleHRlbnRfb2Zmc2V0ID0gYmxvY2tfc3RhcnQgLSBlbS0+c3RhcnQ7CiAJCQlzaXplX3QgaW9zaXplOwpAQCAtMjcwMSw3ICsyODExLDcgQEAKIAkJCSAqLwogCQkJc2V0X2V4dGVudF9iaXQodHJlZSwgYmxvY2tfc3RhcnQsCiAJCQkJICAgICAgIGJsb2NrX3N0YXJ0ICsgaW9zaXplIC0gMSwKLQkJCQkgICAgICAgRVhURU5UX0xPQ0tFRCwgMCwgTlVMTCwgR0ZQX05PRlMpOworCQkJCSAgICAgICBFWFRFTlRfTE9DS0VELCAwLCBOVUxMLCBOVUxMLCBHRlBfTk9GUyk7CiAJCQlyZXQgPSBzdWJtaXRfZXh0ZW50X3BhZ2UoUkVBRCwgdHJlZSwgcGFnZSwKIAkJCQkJIHNlY3RvciwgaW9zaXplLCBwYWdlX29mZnNldCwgZW0tPmJkZXYsCiAJCQkJCSBOVUxMLCAxLApAQCAtMjc0MiwxMyArMjg1MiwxOCBAQAogCWludCByZXQgPSAxOwogCiAJaWYgKHRlc3RfcmFuZ2VfYml0KHRyZWUsIHN0YXJ0LCBlbmQsCi0JCQkgICBFWFRFTlRfSU9CSVRTIHwgRVhURU5UX09SREVSRUQsIDApKQorCQkJICAgRVhURU5UX0lPQklUUywgMCwgTlVMTCkpCiAJCXJldCA9IDA7CiAJZWxzZSB7CiAJCWlmICgobWFzayAmIEdGUF9OT0ZTKSA9PSBHRlBfTk9GUykKIAkJCW1hc2sgPSBHRlBfTk9GUzsKLQkJY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfVVBUT0RBVEUsCi0JCQkJIDEsIDEsIG1hc2spOworCQkvKgorCQkgKiBhdCB0aGlzIHBvaW50IHdlIGNhbiBzYWZlbHkgY2xlYXIgZXZlcnl0aGluZyBleGNlcHQgdGhlCisJCSAqIGxvY2tlZCBiaXQgYW5kIHRoZSBub2RhdGFzdW0gYml0CisJCSAqLworCQljbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsCisJCQkJIH4oRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9OT0RBVEFTVU0pLAorCQkJCSAwLCAwLCBOVUxMLCBtYXNrKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI3NzEsMjkgKzI4ODYsMjggQEAKIAkJdTY0IGxlbjsKIAkJd2hpbGUgKHN0YXJ0IDw9IGVuZCkgewogCQkJbGVuID0gZW5kIC0gc3RhcnQgKyAxOwotCQkJc3Bpbl9sb2NrKCZtYXAtPmxvY2spOworCQkJd3JpdGVfbG9jaygmbWFwLT5sb2NrKTsKIAkJCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKG1hcCwgc3RhcnQsIGxlbik7CiAJCQlpZiAoIWVtIHx8IElTX0VSUihlbSkpIHsKLQkJCQlzcGluX3VubG9jaygmbWFwLT5sb2NrKTsKKwkJCQl3cml0ZV91bmxvY2soJm1hcC0+bG9jayk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAodGVzdF9iaXQoRVhURU5UX0ZMQUdfUElOTkVELCAmZW0tPmZsYWdzKSB8fAogCQkJICAgIGVtLT5zdGFydCAhPSBzdGFydCkgewotCQkJCXNwaW5fdW5sb2NrKCZtYXAtPmxvY2spOworCQkJCXdyaXRlX3VubG9jaygmbWFwLT5sb2NrKTsKIAkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOwogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKCF0ZXN0X3JhbmdlX2JpdCh0cmVlLCBlbS0+c3RhcnQsCiAJCQkJCSAgICBleHRlbnRfbWFwX2VuZChlbSkgLSAxLAotCQkJCQkgICAgRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9XUklURUJBQ0sgfAotCQkJCQkgICAgRVhURU5UX09SREVSRUQsCi0JCQkJCSAgICAwKSkgeworCQkJCQkgICAgRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9XUklURUJBQ0ssCisJCQkJCSAgICAwLCBOVUxMKSkgewogCQkJCXJlbW92ZV9leHRlbnRfbWFwcGluZyhtYXAsIGVtKTsKIAkJCQkvKiBvbmNlIGZvciB0aGUgcmIgdHJlZSAqLwogCQkJCWZyZWVfZXh0ZW50X21hcChlbSk7CiAJCQl9CiAJCQlzdGFydCA9IGV4dGVudF9tYXBfZW5kKGVtKTsKLQkJCXNwaW5fdW5sb2NrKCZtYXAtPmxvY2spOworCQkJd3JpdGVfdW5sb2NrKCZtYXAtPmxvY2spOwogCiAJCQkvKiBvbmNlIGZvciB1cyAqLwogCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKQEAgLTMyMDMsNyArMzMxNyw3IEBACiAJaW50IHVwdG9kYXRlOwogCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAKLQlyZXQgPSB0ZXN0X3JhbmdlX2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfVVBUT0RBVEUsIDEpOworCXJldCA9IHRlc3RfcmFuZ2VfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9VUFRPREFURSwgMSwgTlVMTCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIDE7CiAJd2hpbGUgKHN0YXJ0IDw9IGVuZCkgewpAQCAtMzIzMyw3ICszMzQ3LDcgQEAKIAkJcmV0dXJuIDE7CiAKIAlyZXQgPSB0ZXN0X3JhbmdlX2JpdCh0cmVlLCBlYi0+c3RhcnQsIGViLT5zdGFydCArIGViLT5sZW4gLSAxLAotCQkJICAgRVhURU5UX1VQVE9EQVRFLCAxKTsKKwkJCSAgIEVYVEVOVF9VUFRPREFURSwgMSwgTlVMTCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzI2OSw3ICszMzgzLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodGVzdF9yYW5nZV9iaXQodHJlZSwgZWItPnN0YXJ0LCBlYi0+c3RhcnQgKyBlYi0+bGVuIC0gMSwKLQkJCSAgIEVYVEVOVF9VUFRPREFURSwgMSkpIHsKKwkJCSAgIEVYVEVOVF9VUFRPREFURSwgMSwgTlVMTCkpIHsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uaCBiL2ZzL2J0cmZzL2V4dGVudF9pby5oCmluZGV4IDViYzIwYWIuLjM2ZGUyNTAgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5oCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5oCkBAIC0xMywxMCArMTMsOSBAQAogI2RlZmluZSBFWFRFTlRfREVGUkFHICgxIDw8IDYpCiAjZGVmaW5lIEVYVEVOVF9ERUZSQUdfRE9ORSAoMSA8PCA3KQogI2RlZmluZSBFWFRFTlRfQlVGRkVSX0ZJTExFRCAoMSA8PCA4KQotI2RlZmluZSBFWFRFTlRfT1JERVJFRCAoMSA8PCA5KQotI2RlZmluZSBFWFRFTlRfT1JERVJFRF9NRVRBREFUQSAoMSA8PCAxMCkKLSNkZWZpbmUgRVhURU5UX0JPVU5EQVJZICgxIDw8IDExKQotI2RlZmluZSBFWFRFTlRfTk9EQVRBU1VNICgxIDw8IDEyKQorI2RlZmluZSBFWFRFTlRfQk9VTkRBUlkgKDEgPDwgOSkKKyNkZWZpbmUgRVhURU5UX05PREFUQVNVTSAoMSA8PCAxMCkKKyNkZWZpbmUgRVhURU5UX0RPX0FDQ09VTlRJTkcgKDEgPDwgMTEpCiAjZGVmaW5lIEVYVEVOVF9JT0JJVFMgKEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfV1JJVEVCQUNLKQogCiAvKiBmbGFncyBmb3IgYmlvIHN1Ym1pc3Npb24gKi8KQEAgLTI3LDYgKzI2LDE2IEBACiAjZGVmaW5lIEVYVEVOVF9CVUZGRVJfQkxPQ0tJTkcgMQogI2RlZmluZSBFWFRFTlRfQlVGRkVSX0RJUlRZIDIKIAorLyogdGhlc2UgYXJlIGZsYWdzIGZvciBleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jICovCisjZGVmaW5lIEVYVEVOVF9DTEVBUl9VTkxPQ0tfUEFHRSAweDEKKyNkZWZpbmUgRVhURU5UX0NMRUFSX1VOTE9DSwkgMHgyCisjZGVmaW5lIEVYVEVOVF9DTEVBUl9ERUxBTExPQwkgMHg0CisjZGVmaW5lIEVYVEVOVF9DTEVBUl9ESVJUWQkgMHg4CisjZGVmaW5lIEVYVEVOVF9TRVRfV1JJVEVCQUNLCSAweDEwCisjZGVmaW5lIEVYVEVOVF9FTkRfV1JJVEVCQUNLCSAweDIwCisjZGVmaW5lIEVYVEVOVF9TRVRfUFJJVkFURTIJIDB4NDAKKyNkZWZpbmUgRVhURU5UX0NMRUFSX0FDQ09VTlRJTkcgIDB4ODAKKwogLyoKICAqIHBhZ2UtPnByaXZhdGUgdmFsdWVzLiAgRXZlcnkgcGFnZSB0aGF0IGlzIGNvbnRyb2xsZWQgYnkgdGhlIGV4dGVudAogICogbWFwIGhhcyBwYWdlLT5wcml2YXRlIHNldCB0byBvbmUuCkBAIC02Miw4ICs3MSwxMyBAQAogCQkJCSAgICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgdXB0b2RhdGUpOwogCWludCAoKnNldF9iaXRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgb2xkLCB1bnNpZ25lZCBsb25nIGJpdHMpOwotCWludCAoKmNsZWFyX2JpdF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBvbGQsIHVuc2lnbmVkIGxvbmcgYml0cyk7CisJaW50ICgqY2xlYXJfYml0X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBiaXRzKTsKKwlpbnQgKCptZXJnZV9leHRlbnRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqbmV3LAorCQkJCSBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcik7CisJaW50ICgqc3BsaXRfZXh0ZW50X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBleHRlbnRfc3RhdGUgKm9yaWcsIHU2NCBzcGxpdCk7CiAJaW50ICgqd3JpdGVfY2FjaGVfcGFnZXNfbG9ja19ob29rKShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiB9OwogCkBAIC04MSwxMCArOTUsMTQgQEAKIAl1NjQgc3RhcnQ7CiAJdTY0IGVuZDsgLyogaW5jbHVzaXZlICovCiAJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKKworCS8qIEFERCBORVcgRUxFTUVOVFMgQUZURVIgVEhJUyAqLwogCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKIAlhdG9taWNfdCByZWZzOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CisJdTY0IHNwbGl0X3N0YXJ0OworCXU2NCBzcGxpdF9lbmQ7CiAKIAkvKiBmb3IgdXNlIGJ5IHRoZSBGUyAqLwogCXU2NCBwcml2YXRlOwpAQCAtMTQyLDYgKzE2MCw4IEBACiAJCQkgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkgICAgIGdmcF90IG1hc2spOwogaW50IGxvY2tfZXh0ZW50KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLCBnZnBfdCBtYXNrKTsKK2ludCBsb2NrX2V4dGVudF9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgIGludCBiaXRzLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkLCBnZnBfdCBtYXNrKTsKIGludCB1bmxvY2tfZXh0ZW50KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLCBnZnBfdCBtYXNrKTsKIGludCB0cnlfbG9ja19leHRlbnQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCSAgICBnZnBfdCBtYXNrKTsKQEAgLTE1NSwxMSArMTc1LDEyIEBACiAJCSAgICAgdTY0IG1heF9ieXRlcywgdW5zaWduZWQgbG9uZyBiaXRzKTsKIAogaW50IHRlc3RfcmFuZ2VfYml0KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAotCQkgICBpbnQgYml0cywgaW50IGZpbGxlZCk7CisJCSAgIGludCBiaXRzLCBpbnQgZmlsbGVkLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpjYWNoZWRfc3RhdGUpOwogaW50IGNsZWFyX2V4dGVudF9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkgICAgICBpbnQgYml0cywgZ2ZwX3QgbWFzayk7CiBpbnQgY2xlYXJfZXh0ZW50X2JpdChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKLQkJICAgICBpbnQgYml0cywgaW50IHdha2UsIGludCBkZWxldGUsIGdmcF90IG1hc2spOworCQkgICAgIGludCBiaXRzLCBpbnQgd2FrZSwgaW50IGRlbGV0ZSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqKmNhY2hlZCwKKwkJICAgICBnZnBfdCBtYXNrKTsKIGludCBzZXRfZXh0ZW50X2JpdHMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCSAgICBpbnQgYml0cywgZ2ZwX3QgbWFzayk7CiBpbnQgc2V0X2V4dGVudF91cHRvZGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKQEAgLTI3OCw5ICsyOTksNSBAQAogaW50IGV4dGVudF9jbGVhcl91bmxvY2tfZGVsYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCiAJCQkJdTY0IHN0YXJ0LCB1NjQgZW5kLCBzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UsCi0JCQkJaW50IHVubG9ja19wYWdlLAotCQkJCWludCBjbGVhcl91bmxvY2ssCi0JCQkJaW50IGNsZWFyX2RlbGFsbG9jLCBpbnQgY2xlYXJfZGlydHksCi0JCQkJaW50IHNldF93cml0ZWJhY2ssCi0JCQkJaW50IGVuZF93cml0ZWJhY2spOworCQkJCXVuc2lnbmVkIGxvbmcgb3ApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfbWFwLmMgYi9mcy9idHJmcy9leHRlbnRfbWFwLmMKaW5kZXggMzBjOTM2NS4uMmM3MjZiNyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X21hcC5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9tYXAuYwpAQCAtMzYsNyArMzYsNyBAQAogdm9pZCBleHRlbnRfbWFwX3RyZWVfaW5pdChzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLCBnZnBfdCBtYXNrKQogewogCXRyZWUtPm1hcC5yYl9ub2RlID0gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmdHJlZS0+bG9jayk7CisJcndsb2NrX2luaXQoJnRyZWUtPmxvY2spOwogfQogCiAvKioKQEAgLTE5OCw2ICsxOTgsNTYgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHVucGluX2V4dGVudF9jYWNoZShzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGV4dGVudF9tYXAgKm1lcmdlID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCisJd3JpdGVfbG9jaygmdHJlZS0+bG9jayk7CisJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcodHJlZSwgc3RhcnQsIGxlbik7CisKKwlXQVJOX09OKGVtLT5zdGFydCAhPSBzdGFydCB8fCAhZW0pOworCisJaWYgKCFlbSkKKwkJZ290byBvdXQ7CisKKwljbGVhcl9iaXQoRVhURU5UX0ZMQUdfUElOTkVELCAmZW0tPmZsYWdzKTsKKworCWlmIChlbS0+c3RhcnQgIT0gMCkgeworCQlyYiA9IHJiX3ByZXYoJmVtLT5yYl9ub2RlKTsKKwkJaWYgKHJiKQorCQkJbWVyZ2UgPSByYl9lbnRyeShyYiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCQlpZiAocmIgJiYgbWVyZ2FibGVfbWFwcyhtZXJnZSwgZW0pKSB7CisJCQllbS0+c3RhcnQgPSBtZXJnZS0+c3RhcnQ7CisJCQllbS0+bGVuICs9IG1lcmdlLT5sZW47CisJCQllbS0+YmxvY2tfbGVuICs9IG1lcmdlLT5ibG9ja19sZW47CisJCQllbS0+YmxvY2tfc3RhcnQgPSBtZXJnZS0+YmxvY2tfc3RhcnQ7CisJCQltZXJnZS0+aW5fdHJlZSA9IDA7CisJCQlyYl9lcmFzZSgmbWVyZ2UtPnJiX25vZGUsICZ0cmVlLT5tYXApOworCQkJZnJlZV9leHRlbnRfbWFwKG1lcmdlKTsKKwkJfQorCX0KKworCXJiID0gcmJfbmV4dCgmZW0tPnJiX25vZGUpOworCWlmIChyYikKKwkJbWVyZ2UgPSByYl9lbnRyeShyYiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCWlmIChyYiAmJiBtZXJnYWJsZV9tYXBzKGVtLCBtZXJnZSkpIHsKKwkJZW0tPmxlbiArPSBtZXJnZS0+bGVuOworCQllbS0+YmxvY2tfbGVuICs9IG1lcmdlLT5sZW47CisJCXJiX2VyYXNlKCZtZXJnZS0+cmJfbm9kZSwgJnRyZWUtPm1hcCk7CisJCW1lcmdlLT5pbl90cmVlID0gMDsKKwkJZnJlZV9leHRlbnRfbWFwKG1lcmdlKTsKKwl9CisKKwlmcmVlX2V4dGVudF9tYXAoZW0pOworb3V0OgorCXdyaXRlX3VubG9jaygmdHJlZS0+bG9jayk7CisJcmV0dXJuIHJldDsKKworfQorCiAvKioKICAqIGFkZF9leHRlbnRfbWFwcGluZyAtIGFkZCBuZXcgZXh0ZW50IG1hcCB0byB0aGUgZXh0ZW50IHRyZWUKICAqIEB0cmVlOgl0cmVlIHRvIGluc2VydCBuZXcgbWFwIGluCkBAIC0yMjIsNyArMjcyLDYgQEAKIAkJcmV0ID0gLUVFWElTVDsKIAkJZ290byBvdXQ7CiAJfQotCWFzc2VydF9zcGluX2xvY2tlZCgmdHJlZS0+bG9jayk7CiAJcmIgPSB0cmVlX2luc2VydCgmdHJlZS0+bWFwLCBlbS0+c3RhcnQsICZlbS0+cmJfbm9kZSk7CiAJaWYgKHJiKSB7CiAJCXJldCA9IC1FRVhJU1Q7CkBAIC0yODUsNyArMzM0LDYgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IE5VTEw7CiAJdTY0IGVuZCA9IHJhbmdlX2VuZChzdGFydCwgbGVuKTsKIAotCWFzc2VydF9zcGluX2xvY2tlZCgmdHJlZS0+bG9jayk7CiAJcmJfbm9kZSA9IF9fdHJlZV9zZWFyY2goJnRyZWUtPm1hcCwgc3RhcnQsICZwcmV2LCAmbmV4dCk7CiAJaWYgKCFyYl9ub2RlICYmIHByZXYpIHsKIAkJZW0gPSByYl9lbnRyeShwcmV2LCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7CkBAIC0zMTksNiArMzY3LDU0IEBACiB9CiAKIC8qKgorICogc2VhcmNoX2V4dGVudF9tYXBwaW5nIC0gZmluZCBhIG5lYXJieSBleHRlbnQgbWFwCisgKiBAdHJlZToJdHJlZSB0byBsb29rdXAgaW4KKyAqIEBzdGFydDoJYnl0ZSBvZmZzZXQgdG8gc3RhcnQgdGhlIHNlYXJjaAorICogQGxlbjoJbGVuZ3RoIG9mIHRoZSBsb29rdXAgcmFuZ2UKKyAqCisgKiBGaW5kIGFuZCByZXR1cm4gdGhlIGZpcnN0IGV4dGVudF9tYXAgc3RydWN0IGluIEB0cmVlIHRoYXQgaW50ZXJzZWN0cyB0aGUKKyAqIFtzdGFydCwgbGVuXSByYW5nZS4KKyAqCisgKiBJZiBvbmUgY2FuJ3QgYmUgZm91bmQsIGFueSBuZWFyYnkgZXh0ZW50IG1heSBiZSByZXR1cm5lZAorICovCitzdHJ1Y3QgZXh0ZW50X21hcCAqc2VhcmNoX2V4dGVudF9tYXBwaW5nKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsCisJCQkJCSB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwcmV2ID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IE5VTEw7CisKKwlyYl9ub2RlID0gX190cmVlX3NlYXJjaCgmdHJlZS0+bWFwLCBzdGFydCwgJnByZXYsICZuZXh0KTsKKwlpZiAoIXJiX25vZGUgJiYgcHJldikgeworCQllbSA9IHJiX2VudHJ5KHByZXYsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKKwkJZ290byBmb3VuZDsKKwl9CisJaWYgKCFyYl9ub2RlICYmIG5leHQpIHsKKwkJZW0gPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7CisJCWdvdG8gZm91bmQ7CisJfQorCWlmICghcmJfbm9kZSkgeworCQllbSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoSVNfRVJSKHJiX25vZGUpKSB7CisJCWVtID0gRVJSX1BUUihQVFJfRVJSKHJiX25vZGUpKTsKKwkJZ290byBvdXQ7CisJfQorCWVtID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCWdvdG8gZm91bmQ7CisKKwllbSA9IE5VTEw7CisJZ290byBvdXQ7CisKK2ZvdW5kOgorCWF0b21pY19pbmMoJmVtLT5yZWZzKTsKK291dDoKKwlyZXR1cm4gZW07Cit9CisKKy8qKgogICogcmVtb3ZlX2V4dGVudF9tYXBwaW5nIC0gcmVtb3ZlcyBhbiBleHRlbnRfbWFwIGZyb20gdGhlIGV4dGVudCB0cmVlCiAgKiBAdHJlZToJZXh0ZW50IHRyZWUgdG8gcmVtb3ZlIGZyb20KICAqIEBlbToJCWV4dGVudCBtYXAgYmVlaW5nIHJlbW92ZWQKQEAgLTMzMSw3ICs0MjcsNiBAQAogCWludCByZXQgPSAwOwogCiAJV0FSTl9PTih0ZXN0X2JpdChFWFRFTlRfRkxBR19QSU5ORUQsICZlbS0+ZmxhZ3MpKTsKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJnRyZWUtPmxvY2spOwogCXJiX2VyYXNlKCZlbS0+cmJfbm9kZSwgJnRyZWUtPm1hcCk7CiAJZW0tPmluX3RyZWUgPSAwOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfbWFwLmggYi9mcy9idHJmcy9leHRlbnRfbWFwLmgKaW5kZXggZmI2ZWVlZi4uYWI2ZDc0YiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X21hcC5oCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9tYXAuaApAQCAtMzEsNyArMzEsNyBAQAogCiBzdHJ1Y3QgZXh0ZW50X21hcF90cmVlIHsKIAlzdHJ1Y3QgcmJfcm9vdCBtYXA7Ci0Jc3BpbmxvY2tfdCBsb2NrOworCXJ3bG9ja190IGxvY2s7CiB9OwogCiBzdGF0aWMgaW5saW5lIHU2NCBleHRlbnRfbWFwX2VuZChzdHJ1Y3QgZXh0ZW50X21hcCAqZW0pCkBAIC01OSw0ICs1OSw3IEBACiB2b2lkIGZyZWVfZXh0ZW50X21hcChzdHJ1Y3QgZXh0ZW50X21hcCAqZW0pOwogaW50IF9faW5pdCBleHRlbnRfbWFwX2luaXQodm9pZCk7CiB2b2lkIGV4dGVudF9tYXBfZXhpdCh2b2lkKTsKK2ludCB1bnBpbl9leHRlbnRfY2FjaGUoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgbGVuKTsKK3N0cnVjdCBleHRlbnRfbWFwICpzZWFyY2hfZXh0ZW50X21hcHBpbmcoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwKKwkJCQkJIHU2NCBzdGFydCwgdTY0IGxlbik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUuYyBiL2ZzL2J0cmZzL2ZpbGUuYwppbmRleCA0YjgzMzk3Li4wNjU1MGFmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLmMKKysrIGIvZnMvYnRyZnMvZmlsZS5jCkBAIC0xMTIsOCArMTEyLDYgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgaTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmRlbnRyeShmaWxlKS0+ZF9pbm9kZTsKLQlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7Ci0JdTY0IGhpbnRfYnl0ZTsKIAl1NjQgbnVtX2J5dGVzOwogCXU2NCBzdGFydF9wb3M7CiAJdTY0IGVuZF9vZl9sYXN0X2Jsb2NrOwpAQCAtMTI1LDIzICsxMjMsMTAgQEAKIAkJICAgIHJvb3QtPnNlY3RvcnNpemUgLSAxKSAmIH4oKHU2NClyb290LT5zZWN0b3JzaXplIC0gMSk7CiAKIAllbmRfb2ZfbGFzdF9ibG9jayA9IHN0YXJ0X3BvcyArIG51bV9ieXRlcyAtIDE7CisJZXJyID0gYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyhpbm9kZSwgc3RhcnRfcG9zLCBlbmRfb2ZfbGFzdF9ibG9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCWxvY2tfZXh0ZW50KGlvX3RyZWUsIHN0YXJ0X3BvcywgZW5kX29mX2xhc3RfYmxvY2ssIEdGUF9OT0ZTKTsKLQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7Ci0JaWYgKCF0cmFucykgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOwotCWhpbnRfYnl0ZSA9IDA7Ci0KLQlzZXRfZXh0ZW50X3VwdG9kYXRlKGlvX3RyZWUsIHN0YXJ0X3BvcywgZW5kX29mX2xhc3RfYmxvY2ssIEdGUF9OT0ZTKTsKLQotCS8qIGNoZWNrIGZvciByZXNlcnZlZCBleHRlbnRzIG9uIGVhY2ggcGFnZSwgd2UgZG9uJ3Qgd2FudAotCSAqIHRvIHJlc2V0IHRoZSBkZWxhbGxvYyBiaXQgb24gdGhpbmdzIHRoYXQgYWxyZWFkeSBoYXZlCi0JICogZXh0ZW50cyByZXNlcnZlZC4KLQkgKi8KLQlidHJmc19zZXRfZXh0ZW50X2RlbGFsbG9jKGlub2RlLCBzdGFydF9wb3MsIGVuZF9vZl9sYXN0X2Jsb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnAgPSBwYWdlc1tpXTsKIAkJU2V0UGFnZVVwdG9kYXRlKHApOwpAQCAtMTU1LDkgKzE0MCw2IEBACiAJCSAqIGF0IHRoaXMgdGltZS4KIAkJICovCiAJfQotCWVyciA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci1vdXRfdW5sb2NrOgotCXVubG9ja19leHRlbnQoaW9fdHJlZSwgc3RhcnRfcG9zLCBlbmRfb2ZfbGFzdF9ibG9jaywgR0ZQX05PRlMpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE4OSwxOCArMTcxLDE4IEBACiAJCWlmICghc3BsaXQyKQogCQkJc3BsaXQyID0gYWxsb2NfZXh0ZW50X21hcChHRlBfTk9GUyk7CiAKLQkJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJd3JpdGVfbG9jaygmZW1fdHJlZS0+bG9jayk7CiAJCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIHN0YXJ0LCBsZW4pOwogCQlpZiAoIWVtKSB7Ci0JCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJCQl3cml0ZV91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCQkJYnJlYWs7CiAJCX0KIAkJZmxhZ3MgPSBlbS0+ZmxhZ3M7CiAJCWlmIChza2lwX3Bpbm5lZCAmJiB0ZXN0X2JpdChFWFRFTlRfRkxBR19QSU5ORUQsICZlbS0+ZmxhZ3MpKSB7Ci0JCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAJCQlpZiAoZW0tPnN0YXJ0IDw9IHN0YXJ0ICYmCiAJCQkgICAgKCF0ZXN0ZW5kIHx8IGVtLT5zdGFydCArIGVtLT5sZW4gPj0gc3RhcnQgKyBsZW4pKSB7CiAJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCQl3cml0ZV91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKHN0YXJ0IDwgZW0tPnN0YXJ0KSB7CkBAIC0yMTAsNiArMTkyLDcgQEAKIAkJCQlzdGFydCA9IGVtLT5zdGFydCArIGVtLT5sZW47CiAJCQl9CiAJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJd3JpdGVfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWNvbXByZXNzZWQgPSB0ZXN0X2JpdChFWFRFTlRfRkxBR19DT01QUkVTU0VELCAmZW0tPmZsYWdzKTsKQEAgLTI2MCw3ICsyNDMsNyBAQAogCQkJZnJlZV9leHRlbnRfbWFwKHNwbGl0KTsKIAkJCXNwbGl0ID0gTlVMTDsKIAkJfQotCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJCXdyaXRlX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAKIAkJLyogb25jZSBmb3IgdXMgKi8KIAkJZnJlZV9leHRlbnRfbWFwKGVtKTsKQEAgLTI4OSw3ICsyNzIsNyBAQAogbm9pbmxpbmUgaW50IGJ0cmZzX2Ryb3BfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLCB1NjQgbG9ja2VkX2VuZCwKLQkJICAgICAgIHU2NCBpbmxpbmVfbGltaXQsIHU2NCAqaGludF9ieXRlKQorCQkgICAgICAgdTY0IGlubGluZV9saW1pdCwgdTY0ICpoaW50X2J5dGUsIGludCBkcm9wX2NhY2hlKQogewogCXU2NCBleHRlbnRfZW5kID0gMDsKIAl1NjQgc2VhcmNoX3N0YXJ0ID0gc3RhcnQ7CkBAIC0zMTQsNyArMjk3LDggQEAKIAlpbnQgcmV0OwogCiAJaW5saW5lX2xpbWl0ID0gMDsKLQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgc3RhcnQsIGVuZCAtIDEsIDApOworCWlmIChkcm9wX2NhY2hlKQorCQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgc3RhcnQsIGVuZCAtIDEsIDApOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCkBAIC04OTQsNyArODc4LDggQEAKIAkJCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKIAogCQljbGVhcl9leHRlbnRfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0X3BvcywKLQkJCQkgIGxhc3RfcG9zIC0gMSwgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DLAorCQkJCSAgbGFzdF9wb3MgLSAxLCBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MgfAorCQkJCSAgRVhURU5UX0RPX0FDQ09VTlRJTkcsCiAJCQkJICBHRlBfTk9GUyk7CiAJCXVubG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAogCQkJICAgICAgc3RhcnRfcG9zLCBsYXN0X3BvcyAtIDEsIEdGUF9OT0ZTKTsKQEAgLTkzNiwyMSArOTIxLDM1IEBACiAJc3RhcnRfcG9zID0gcG9zOwogCiAJdmZzX2NoZWNrX2Zyb3plbihpbm9kZS0+aV9zYiwgU0JfRlJFRVpFX1dSSVRFKTsKKworCS8qIGRvIHRoZSByZXNlcnZlIGJlZm9yZSB0aGUgbXV0ZXggbG9jayBpbiBjYXNlIHdlIGhhdmUgdG8gZG8gc29tZQorCSAqIGZsdXNoaW5nLiAgV2Ugd291bGRuJ3QgZGVhZGxvY2ssIGJ1dCB0aGlzIGlzIG1vcmUgcG9saXRlLgorCSAqLworCWVyciA9IGJ0cmZzX3Jlc2VydmVfbWV0YWRhdGFfZm9yX2RlbGFsbG9jKHJvb3QsIGlub2RlLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9ub2xvY2s7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKIAljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKIAllcnIgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCAmcG9zLCAmY291bnQsIFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X25vbG9jazsKKwkJZ290byBvdXQ7CisKIAlpZiAoY291bnQgPT0gMCkKLQkJZ290byBvdXRfbm9sb2NrOworCQlnb3RvIG91dDsKIAogCWVyciA9IGZpbGVfcmVtb3ZlX3N1aWQoZmlsZSk7CiAJaWYgKGVycikKLQkJZ290byBvdXRfbm9sb2NrOworCQlnb3RvIG91dDsKKwogCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CiAKIAlwYWdlcyA9IGttYWxsb2MobnJwdHJzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKIAotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwkvKiBnZW5lcmljX3dyaXRlX2NoZWNrcyBjYW4gY2hhbmdlIG91ciBwb3MgKi8KKwlzdGFydF9wb3MgPSBwb3M7CisKIAlCVFJGU19JKGlub2RlKS0+c2VxdWVuY2UrKzsKIAlmaXJzdF9pbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWxhc3RfaW5kZXggPSAocG9zICsgY291bnQpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CkBAIC0xMDI0LDkgKzEwMjMsOCBAQAogCQl9CiAKIAkJaWYgKHdpbGxfd3JpdGUpIHsKLQkJCWJ0cmZzX2ZkYXRhd3JpdGVfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgcG9zLAotCQkJCQkgICAgICAgcG9zICsgd3JpdGVfYnl0ZXMgLSAxLAotCQkJCQkgICAgICAgV0JfU1lOQ19BTEwpOworCQkJZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHBvcywKKwkJCQkJCSBwb3MgKyB3cml0ZV9ieXRlcyAtIDEpOwogCQl9IGVsc2UgewogCQkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucihpbm9kZS0+aV9tYXBwaW5nLAogCQkJCQkJCSAgIG51bV9wYWdlcyk7CkBAIC0xMDQ3LDYgKzEwNDUsNyBAQAogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChyZXQpCiAJCWVyciA9IHJldDsKKwlidHJmc191bnJlc2VydmVfbWV0YWRhdGFfZm9yX2RlbGFsbG9jKHJvb3QsIGlub2RlLCAxKTsKIAogb3V0X25vbG9jazoKIAlrZnJlZShwYWdlcyk7CkBAIC0xMDg3LDggKzEwODYsMTAgQEAKIAkJCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAkJCQllbHNlCiAJCQkJCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JCQl9IGVsc2UgeworCQkJfSBlbHNlIGlmIChyZXQgIT0gQlRSRlNfTk9fTE9HX1NZTkMpIHsKIAkJCQlidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCQkJfSBlbHNlIHsKKwkJCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCQkJfQogCQl9CiAJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsKQEAgLTExMzgsNiArMTEzOSwxMyBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOwogCisKKwkvKiB3ZSB3YWl0IGZpcnN0LCBzaW5jZSB0aGUgd3JpdGViYWNrIG1heSBjaGFuZ2UgdGhlIGlub2RlICovCisJcm9vdC0+bG9nX2JhdGNoKys7CisJLyogdGhlIFZGUyBjYWxsZWQgZmlsZW1hcF9mZGF0YXdyaXRlIGZvciB1cyAqLworCWJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShpbm9kZSwgMCwgKHU2NCktMSk7CisJcm9vdC0+bG9nX2JhdGNoKys7CisKIAkvKgogCSAqIGNoZWNrIHRoZSB0cmFuc2FjdGlvbiB0aGF0IGxhc3QgbW9kaWZpZWQgdGhpcyBpbm9kZQogCSAqIGFuZCBzZWUgaWYgaXRzIGFscmVhZHkgYmVlbiBjb21taXR0ZWQKQEAgLTExNDUsNiArMTE1MywxMSBAQAogCWlmICghQlRSRlNfSShpbm9kZSktPmxhc3RfdHJhbnMpCiAJCWdvdG8gb3V0OwogCisJLyoKKwkgKiBpZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0aGF0IGNoYW5nZWQgdGhpcyBmaWxlIHdhcyBiZWZvcmUKKwkgKiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgd2UgY2FuIGJhaWwgb3V0IG5vdyB3aXRob3V0IGFueQorCSAqIHN5bmNpbmcKKwkgKi8KIAltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAJaWYgKEJUUkZTX0koaW5vZGUpLT5sYXN0X3RyYW5zIDw9CiAJICAgIHJvb3QtPmZzX2luZm8tPmxhc3RfdHJhbnNfY29tbWl0dGVkKSB7CkBAIC0xMTU0LDEzICsxMTY3LDYgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKLQlyb290LT5sb2dfYmF0Y2grKzsKLQlmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7Ci0JYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCAwLCAodTY0KS0xKTsKLQlyb290LT5sb2dfYmF0Y2grKzsKLQotCWlmIChkYXRhc3luYyAmJiAhKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9QQUdFUykpCi0JCWdvdG8gb3V0OwogCS8qCiAJICogb2sgd2UgaGF2ZW4ndCBjb21taXR0ZWQgdGhlIHRyYW5zYWN0aW9uIHlldCwgbGV0cyBkbyBhIGNvbW1pdAogCSAqLwpAQCAtMTE4OSwyMSArMTE5NSwyNSBAQAogCSAqLwogCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAotCWlmIChyZXQgPiAwKSB7Ci0JCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gYnRyZnNfc3luY19sb2codHJhbnMsIHJvb3QpOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwotCQllbHNlCisJaWYgKHJldCAhPSBCVFJGU19OT19MT0dfU1lOQykgeworCQlpZiAocmV0ID4gMCkgewogCQkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGJ0cmZzX3N5bmNfbG9nKHRyYW5zLCByb290KTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCQkJZWxzZQorCQkJCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCX0KIAltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogb3V0OgogCXJldHVybiByZXQgPiAwID8gRUlPIDogcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGJ0cmZzX2ZpbGVfdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBidHJmc19maWxlX3ZtX29wcyA9IHsKIAkuZmF1bHQJCT0gZmlsZW1hcF9mYXVsdCwKIAkucGFnZV9ta3dyaXRlCT0gYnRyZnNfcGFnZV9ta3dyaXRlLAogfTsKQEAgLTEyMTUsNyArMTIyNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnRyZnNfZmlsZV9vcGVyYXRpb25zID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidHJmc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKIAkuYWlvX3JlYWQgICAgICAgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCmRpZmYgLS1naXQgYS9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMgYi9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMKaW5kZXggNWVkY2VlMy4uNWMyY2FhZCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jCisrKyBiL2ZzL2J0cmZzL2ZyZWUtc3BhY2UtY2FjaGUuYwpAQCAtMjU5LDcgKzI1OSw5IEBACiAKIHN0YXRpYyB2b2lkIHJlY2FsY3VsYXRlX3RocmVzaG9sZHMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCkKIHsKLQl1NjQgbWF4X2J5dGVzLCBwb3NzaWJsZV9ieXRlczsKKwl1NjQgbWF4X2J5dGVzOworCXU2NCBiaXRtYXBfYnl0ZXM7CisJdTY0IGV4dGVudF9ieXRlczsKIAogCS8qCiAJICogVGhlIGdvYWwgaXMgdG8ga2VlcCB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB1c2VkIHBlciAxZ2Igb2Ygc3BhY2UKQEAgLTI2OSwyMiArMjcxLDI3IEBACiAJbWF4X2J5dGVzID0gTUFYX0NBQ0hFX0JZVEVTX1BFUl9HSUcgKgogCQkoZGl2NjRfdTY0KGJsb2NrX2dyb3VwLT5rZXkub2Zmc2V0LCAxMDI0ICogMTAyNCAqIDEwMjQpKTsKIAotCXBvc3NpYmxlX2J5dGVzID0gKGJsb2NrX2dyb3VwLT50b3RhbF9iaXRtYXBzICogUEFHRV9DQUNIRV9TSVpFKSArCi0JCShzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UpICoKLQkJIGJsb2NrX2dyb3VwLT5leHRlbnRzX3RocmVzaCk7CisJLyoKKwkgKiB3ZSB3YW50IHRvIGFjY291bnQgZm9yIDEgbW9yZSBiaXRtYXAgdGhhbiB3aGF0IHdlIGhhdmUgc28gd2UgY2FuIG1ha2UKKwkgKiBzdXJlIHdlIGRvbid0IGdvIG92ZXIgb3VyIG92ZXJhbGwgZ29hbCBvZiBNQVhfQ0FDSEVfQllURVNfUEVSX0dJRyBhcworCSAqIHdlIGFkZCBtb3JlIGJpdG1hcHMuCisJICovCisJYml0bWFwX2J5dGVzID0gKGJsb2NrX2dyb3VwLT50b3RhbF9iaXRtYXBzICsgMSkgKiBQQUdFX0NBQ0hFX1NJWkU7CiAKLQlpZiAocG9zc2libGVfYnl0ZXMgPiBtYXhfYnl0ZXMpIHsKLQkJaW50IGV4dGVudF9ieXRlcyA9IG1heF9ieXRlcyAtCi0JCQkoYmxvY2tfZ3JvdXAtPnRvdGFsX2JpdG1hcHMgKiBQQUdFX0NBQ0hFX1NJWkUpOwotCi0JCWlmIChleHRlbnRfYnl0ZXMgPD0gMCkgewotCQkJYmxvY2tfZ3JvdXAtPmV4dGVudHNfdGhyZXNoID0gMDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJsb2NrX2dyb3VwLT5leHRlbnRzX3RocmVzaCA9IGV4dGVudF9ieXRlcyAvCi0JCQkoc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlKSk7CisJaWYgKGJpdG1hcF9ieXRlcyA+PSBtYXhfYnl0ZXMpIHsKKwkJYmxvY2tfZ3JvdXAtPmV4dGVudHNfdGhyZXNoID0gMDsKKwkJcmV0dXJuOwogCX0KKworCS8qCisJICogd2Ugd2FudCB0aGUgZXh0ZW50IGVudHJ5IHRocmVzaG9sZCB0byBhbHdheXMgYmUgYXQgbW9zdCAxLzIgdGhlIG1heHcKKwkgKiBieXRlcyB3ZSBjYW4gaGF2ZSwgb3Igd2hhdGV2ZXIgaXMgbGVzcyB0aGFuIHRoYXQuCisJICovCisJZXh0ZW50X2J5dGVzID0gbWF4X2J5dGVzIC0gYml0bWFwX2J5dGVzOworCWV4dGVudF9ieXRlcyA9IG1pbl90KHU2NCwgZXh0ZW50X2J5dGVzLCBkaXY2NF91NjQobWF4X2J5dGVzLCAyKSk7CisKKwlibG9ja19ncm91cC0+ZXh0ZW50c190aHJlc2ggPQorCQlkaXY2NF91NjQoZXh0ZW50X2J5dGVzLCAoc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlKSkpOwogfQogCiBzdGF0aWMgdm9pZCBiaXRtYXBfY2xlYXJfYml0cyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLApAQCAtNDAzLDYgKzQxMCw3IEBACiAJQlVHX09OKGJsb2NrX2dyb3VwLT50b3RhbF9iaXRtYXBzID49IG1heF9iaXRtYXBzKTsKIAogCWluZm8tPm9mZnNldCA9IG9mZnNldF90b19iaXRtYXAoYmxvY2tfZ3JvdXAsIG9mZnNldCk7CisJaW5mby0+Ynl0ZXMgPSAwOwogCWxpbmtfZnJlZV9zcGFjZShibG9ja19ncm91cCwgaW5mbyk7CiAJYmxvY2tfZ3JvdXAtPnRvdGFsX2JpdG1hcHMrKzsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUtaXRlbS5jIGIvZnMvYnRyZnMvaW5vZGUtaXRlbS5jCmluZGV4IDZiNjI3YzYuLjcyY2UzYzEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lub2RlLWl0ZW0uYworKysgYi9mcy9idHJmcy9pbm9kZS1pdGVtLmMKQEAgLTE0OSw2ICsxNDksOCBAQAogCQlwdHIgPSAodW5zaWduZWQgbG9uZykocmVmICsgMSk7CiAJCXJldCA9IDA7CiAJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPT0gLUVPVkVSRkxPVykKKwkJCXJldCA9IC1FTUxJTks7CiAJCWdvdG8gb3V0OwogCX0gZWxzZSB7CiAJCXJlZiA9IGJ0cmZzX2l0ZW1fcHRyKHBhdGgtPm5vZGVzWzBdLCBwYXRoLT5zbG90c1swXSwKQEAgLTE3Nyw4ICsxNzksNiBAQAogCiAJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZrZXksCiAJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBidHJmc19pbm9kZV9pdGVtKSk7Ci0JaWYgKHJldCA9PSAwICYmIG9iamVjdGlkID4gcm9vdC0+aGlnaGVzdF9pbm9kZSkKLQkJcm9vdC0+aGlnaGVzdF9pbm9kZSA9IG9iamVjdGlkOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLW1hcC5jIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKaW5kZXggOWFiYmNlZC4uYzU2ZWI1OSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUtbWFwLmMKKysrIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKQEAgLTQzLDkgKzQzLDEwIEBACiAJCXNsb3QgPSBwYXRoLT5zbG90c1swXSAtIDE7CiAJCWwgPSBwYXRoLT5ub2Rlc1swXTsKIAkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGwsICZmb3VuZF9rZXksIHNsb3QpOwotCQkqb2JqZWN0aWQgPSBmb3VuZF9rZXkub2JqZWN0aWQ7CisJCSpvYmplY3RpZCA9IG1heF90KHU2NCwgZm91bmRfa2V5Lm9iamVjdGlkLAorCQkJCSAgQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCAtIDEpOwogCX0gZWxzZSB7Ci0JCSpvYmplY3RpZCA9IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQ7CisJCSpvYmplY3RpZCA9IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQgLSAxOwogCX0KIAlyZXQgPSAwOwogZXJyb3I6CkBAIC01Myw5MSArNTQsMjcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogd2Fsa3MgdGhlIGJ0cmVlIG9mIGFsbG9jYXRlZCBpbm9kZXMgYW5kIGZpbmQgYSBob2xlLgotICovCiBpbnQgYnRyZnNfZmluZF9mcmVlX29iamVjdGlkKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgICAgdTY0IGRpcmlkLCB1NjQgKm9iamVjdGlkKQogewotCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwotCXN0cnVjdCBidHJmc19rZXkga2V5OwogCWludCByZXQ7Ci0JaW50IHNsb3QgPSAwOwotCXU2NCBsYXN0X2lubyA9IDA7Ci0JaW50IHN0YXJ0X2ZvdW5kOwotCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsOwotCXN0cnVjdCBidHJmc19rZXkgc2VhcmNoX2tleTsKLQl1NjQgc2VhcmNoX3N0YXJ0ID0gZGlyaWQ7Ci0KIAltdXRleF9sb2NrKCZyb290LT5vYmplY3RpZF9tdXRleCk7Ci0JaWYgKHJvb3QtPmxhc3RfaW5vZGVfYWxsb2MgPj0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCAmJgotCSAgICByb290LT5sYXN0X2lub2RlX2FsbG9jIDwgQlRSRlNfTEFTVF9GUkVFX09CSkVDVElEKSB7Ci0JCSpvYmplY3RpZCA9ICsrcm9vdC0+bGFzdF9pbm9kZV9hbGxvYzsKLQkJbXV0ZXhfdW5sb2NrKCZyb290LT5vYmplY3RpZF9tdXRleCk7Ci0JCXJldHVybiAwOworCisJaWYgKHVubGlrZWx5KHJvb3QtPmhpZ2hlc3Rfb2JqZWN0aWQgPCBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSkgeworCQlyZXQgPSBidHJmc19maW5kX2hpZ2hlc3RfaW5vZGUocm9vdCwgJnJvb3QtPmhpZ2hlc3Rfb2JqZWN0aWQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CiAJfQotCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKLQlzZWFyY2hfc3RhcnQgPSBtYXgoc2VhcmNoX3N0YXJ0LCAodTY0KUJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpOwotCXNlYXJjaF9rZXkub2JqZWN0aWQgPSBzZWFyY2hfc3RhcnQ7Ci0Jc2VhcmNoX2tleS50eXBlID0gMDsKLQlzZWFyY2hfa2V5Lm9mZnNldCA9IDA7CiAKLQlzdGFydF9mb3VuZCA9IDA7Ci0JcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZzZWFyY2hfa2V5LCBwYXRoLCAwLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXdoaWxlICgxKSB7Ci0JCWwgPSBwYXRoLT5ub2Rlc1swXTsKLQkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwotCQlpZiAoc2xvdCA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsKSkgewotCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOwotCQkJaWYgKHJldCA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBlcnJvcjsKLQkJCWlmICghc3RhcnRfZm91bmQpIHsKLQkJCQkqb2JqZWN0aWQgPSBzZWFyY2hfc3RhcnQ7Ci0JCQkJc3RhcnRfZm91bmQgPSAxOwotCQkJCWdvdG8gZm91bmQ7Ci0JCQl9Ci0JCQkqb2JqZWN0aWQgPSBsYXN0X2lubyA+IHNlYXJjaF9zdGFydCA/Ci0JCQkJbGFzdF9pbm8gOiBzZWFyY2hfc3RhcnQ7Ci0JCQlnb3RvIGZvdW5kOwotCQl9Ci0JCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsLCAma2V5LCBzbG90KTsKLQkJaWYgKGtleS5vYmplY3RpZCA+PSBzZWFyY2hfc3RhcnQpIHsKLQkJCWlmIChzdGFydF9mb3VuZCkgewotCQkJCWlmIChsYXN0X2lubyA8IHNlYXJjaF9zdGFydCkKLQkJCQkJbGFzdF9pbm8gPSBzZWFyY2hfc3RhcnQ7Ci0JCQkJaWYgKGtleS5vYmplY3RpZCA+IGxhc3RfaW5vKSB7Ci0JCQkJCSpvYmplY3RpZCA9IGxhc3RfaW5vOwotCQkJCQlnb3RvIGZvdW5kOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoa2V5Lm9iamVjdGlkID4gc2VhcmNoX3N0YXJ0KSB7Ci0JCQkJKm9iamVjdGlkID0gc2VhcmNoX3N0YXJ0OwotCQkJCWdvdG8gZm91bmQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKGtleS5vYmplY3RpZCA+PSBCVFJGU19MQVNUX0ZSRUVfT0JKRUNUSUQpCi0JCQlicmVhazsKLQotCQlzdGFydF9mb3VuZCA9IDE7Ci0JCWxhc3RfaW5vID0ga2V5Lm9iamVjdGlkICsgMTsKLQkJcGF0aC0+c2xvdHNbMF0rKzsKKwlpZiAodW5saWtlbHkocm9vdC0+aGlnaGVzdF9vYmplY3RpZCA+PSBCVFJGU19MQVNUX0ZSRUVfT0JKRUNUSUQpKSB7CisJCXJldCA9IC1FTk9TUEM7CisJCWdvdG8gb3V0OwogCX0KLQlCVUdfT04oMSk7Ci1mb3VuZDoKLQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7Ci0JYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwotCUJVR19PTigqb2JqZWN0aWQgPCBzZWFyY2hfc3RhcnQpOwotCW11dGV4X3VubG9jaygmcm9vdC0+b2JqZWN0aWRfbXV0ZXgpOwotCXJldHVybiAwOwotZXJyb3I6Ci0JYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOwotCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKworCSpvYmplY3RpZCA9ICsrcm9vdC0+aGlnaGVzdF9vYmplY3RpZDsKKwlyZXQgPSAwOworb3V0OgogCW11dGV4X3VubG9jaygmcm9vdC0+b2JqZWN0aWRfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS5jIGIvZnMvYnRyZnMvaW5vZGUuYwppbmRleCA5MDk2ZmQwLi5kYWUxMmRjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTYyLDcgKzYyLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBidHJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBidHJmc19hb3BzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYnRyZnNfc3ltbGlua19hb3BzOwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnRyZnNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0cmZzX2Rpcl9maWxlX29wZXJhdGlvbnM7CiBzdGF0aWMgc3RydWN0IGV4dGVudF9pb19vcHMgYnRyZnNfZXh0ZW50X2lvX29wczsKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpidHJmc19pbm9kZV9jYWNoZXA7CkBAIC0yMzEsNyArMjMxLDggQEAKIAl9CiAKIAlyZXQgPSBidHJmc19kcm9wX2V4dGVudHModHJhbnMsIHJvb3QsIGlub2RlLCBzdGFydCwKLQkJCQkgYWxpZ25lZF9lbmQsIGFsaWduZWRfZW5kLCBzdGFydCwgJmhpbnRfYnl0ZSk7CisJCQkJIGFsaWduZWRfZW5kLCBhbGlnbmVkX2VuZCwgc3RhcnQsCisJCQkJICZoaW50X2J5dGUsIDEpOwogCUJVR19PTihyZXQpOwogCiAJaWYgKGlzaXplID4gYWN0dWFsX2VuZCkKQEAgLTI0MCw3ICsyNDEsNyBAQAogCQkJCSAgIGlubGluZV9sZW4sIGNvbXByZXNzZWRfc2l6ZSwKIAkJCQkgICBjb21wcmVzc2VkX3BhZ2VzKTsKIAlCVUdfT04ocmV0KTsKLQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgc3RhcnQsIGFsaWduZWRfZW5kLCAwKTsKKwlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgc3RhcnQsIGFsaWduZWRfZW5kIC0gMSwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQyMyw5ICs0MjQsMTIgQEAKIAkJCSAqIGFuZCBmcmVlIHVwIG91ciB0ZW1wIHBhZ2VzLgogCQkJICovCiAJCQlleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jKGlub2RlLAotCQkJCQkJICAgICAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCi0JCQkJCQkgICAgIHN0YXJ0LCBlbmQsIE5VTEwsIDEsIDAsCi0JCQkJCQkgICAgIDAsIDEsIDEsIDEpOworCQkJICAgICAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkgICAgIHN0YXJ0LCBlbmQsIE5VTEwsCisJCQkgICAgIEVYVEVOVF9DTEVBUl9VTkxPQ0tfUEFHRSB8IEVYVEVOVF9DTEVBUl9ESVJUWSB8CisJCQkgICAgIEVYVEVOVF9DTEVBUl9ERUxBTExPQyB8CisJCQkgICAgIEVYVEVOVF9DTEVBUl9BQ0NPVU5USU5HIHwKKwkJCSAgICAgRVhURU5UX1NFVF9XUklURUJBQ0sgfCBFWFRFTlRfRU5EX1dSSVRFQkFDSyk7CiAJCQlyZXQgPSAwOwogCQkJZ290byBmcmVlX3BhZ2VzX291dDsKIAkJfQpAQCAtNjExLDkgKzYxNSw5IEBACiAJCXNldF9iaXQoRVhURU5UX0ZMQUdfQ09NUFJFU1NFRCwgJmVtLT5mbGFncyk7CiAKIAkJd2hpbGUgKDEpIHsKLQkJCXNwaW5fbG9jaygmZW1fdHJlZS0+bG9jayk7CisJCQl3cml0ZV9sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAkJCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBlbSk7Ci0JCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJCQl3cml0ZV91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCQkJaWYgKHJldCAhPSAtRUVYSVNUKSB7CiAJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKIAkJCQlicmVhazsKQEAgLTYzNiwxMSArNjQwLDE0IEBACiAJCSAqIGNsZWFyIGRpcnR5LCBzZXQgd3JpdGViYWNrIGFuZCB1bmxvY2sgdGhlIHBhZ2VzLgogCQkgKi8KIAkJZXh0ZW50X2NsZWFyX3VubG9ja19kZWxhbGxvYyhpbm9kZSwKLQkJCQkJICAgICAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCi0JCQkJCSAgICAgYXN5bmNfZXh0ZW50LT5zdGFydCwKLQkJCQkJICAgICBhc3luY19leHRlbnQtPnN0YXJ0ICsKLQkJCQkJICAgICBhc3luY19leHRlbnQtPnJhbV9zaXplIC0gMSwKLQkJCQkJICAgICBOVUxMLCAxLCAxLCAwLCAxLCAxLCAwKTsKKwkJCQkmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkJYXN5bmNfZXh0ZW50LT5zdGFydCwKKwkJCQlhc3luY19leHRlbnQtPnN0YXJ0ICsKKwkJCQlhc3luY19leHRlbnQtPnJhbV9zaXplIC0gMSwKKwkJCQlOVUxMLCBFWFRFTlRfQ0xFQVJfVU5MT0NLX1BBR0UgfAorCQkJCUVYVEVOVF9DTEVBUl9VTkxPQ0sgfAorCQkJCUVYVEVOVF9DTEVBUl9ERUxBTExPQyB8CisJCQkJRVhURU5UX0NMRUFSX0RJUlRZIHwgRVhURU5UX1NFVF9XUklURUJBQ0spOwogCiAJCXJldCA9IGJ0cmZzX3N1Ym1pdF9jb21wcmVzc2VkX3dyaXRlKGlub2RlLAogCQkJCSAgICBhc3luY19leHRlbnQtPnN0YXJ0LApAQCAtNzExLDkgKzcxOCwxNSBAQAogCQkJCQkgICAgc3RhcnQsIGVuZCwgMCwgTlVMTCk7CiAJCWlmIChyZXQgPT0gMCkgewogCQkJZXh0ZW50X2NsZWFyX3VubG9ja19kZWxhbGxvYyhpbm9kZSwKLQkJCQkJCSAgICAgJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAotCQkJCQkJICAgICBzdGFydCwgZW5kLCBOVUxMLCAxLCAxLAotCQkJCQkJICAgICAxLCAxLCAxLCAxKTsKKwkJCQkgICAgICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkgICAgIHN0YXJ0LCBlbmQsIE5VTEwsCisJCQkJICAgICBFWFRFTlRfQ0xFQVJfVU5MT0NLX1BBR0UgfAorCQkJCSAgICAgRVhURU5UX0NMRUFSX1VOTE9DSyB8CisJCQkJICAgICBFWFRFTlRfQ0xFQVJfREVMQUxMT0MgfAorCQkJCSAgICAgRVhURU5UX0NMRUFSX0FDQ09VTlRJTkcgfAorCQkJCSAgICAgRVhURU5UX0NMRUFSX0RJUlRZIHwKKwkJCQkgICAgIEVYVEVOVF9TRVRfV1JJVEVCQUNLIHwKKwkJCQkgICAgIEVYVEVOVF9FTkRfV1JJVEVCQUNLKTsKIAkJCSpucl93cml0dGVuID0gKm5yX3dyaXR0ZW4gKwogCQkJICAgICAoZW5kIC0gc3RhcnQgKyBQQUdFX0NBQ0hFX1NJWkUpIC8gUEFHRV9DQUNIRV9TSVpFOwogCQkJKnBhZ2Vfc3RhcnRlZCA9IDE7CkBAIC03MjUsOSArNzM4LDIwIEBACiAJQlVHX09OKGRpc2tfbnVtX2J5dGVzID4KIAkgICAgICAgYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpKTsKIAorCisJcmVhZF9sb2NrKCZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWUubG9jayk7CisJZW0gPSBzZWFyY2hfZXh0ZW50X21hcHBpbmcoJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZSwKKwkJCQkgICBzdGFydCwgbnVtX2J5dGVzKTsKKwlpZiAoZW0pIHsKKwkJYWxsb2NfaGludCA9IGVtLT5ibG9ja19zdGFydDsKKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwl9CisJcmVhZF91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZS5sb2NrKTsKIAlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgc3RhcnQsIHN0YXJ0ICsgbnVtX2J5dGVzIC0gMSwgMCk7CiAKIAl3aGlsZSAoZGlza19udW1fYnl0ZXMgPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgb3A7CisKIAkJY3VyX2FsbG9jX3NpemUgPSBtaW4oZGlza19udW1fYnl0ZXMsIHJvb3QtPmZzX2luZm8tPm1heF9leHRlbnQpOwogCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudCh0cmFucywgcm9vdCwgY3VyX2FsbG9jX3NpemUsCiAJCQkJCSAgIHJvb3QtPnNlY3RvcnNpemUsIDAsIGFsbG9jX2hpbnQsCkBAIC03MzcsNyArNzYxLDYgQEAKIAkJZW0gPSBhbGxvY19leHRlbnRfbWFwKEdGUF9OT0ZTKTsKIAkJZW0tPnN0YXJ0ID0gc3RhcnQ7CiAJCWVtLT5vcmlnX3N0YXJ0ID0gZW0tPnN0YXJ0OwotCiAJCXJhbV9zaXplID0gaW5zLm9mZnNldDsKIAkJZW0tPmxlbiA9IGlucy5vZmZzZXQ7CiAKQEAgLTc0Nyw5ICs3NzAsOSBAQAogCQlzZXRfYml0KEVYVEVOVF9GTEFHX1BJTk5FRCwgJmVtLT5mbGFncyk7CiAKIAkJd2hpbGUgKDEpIHsKLQkJCXNwaW5fbG9jaygmZW1fdHJlZS0+bG9jayk7CisJCQl3cml0ZV9sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAkJCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBlbSk7Ci0JCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJCQl3cml0ZV91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCQkJaWYgKHJldCAhPSAtRUVYSVNUKSB7CiAJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKIAkJCQlicmVhazsKQEAgLTc3NiwxMSArNzk5LDE3IEBACiAJCS8qIHdlJ3JlIG5vdCBkb2luZyBjb21wcmVzc2VkIElPLCBkb24ndCB1bmxvY2sgdGhlIGZpcnN0CiAJCSAqIHBhZ2UgKHdoaWNoIHRoZSBjYWxsZXIgZXhwZWN0cyB0byBzdGF5IGxvY2tlZCksIGRvbid0CiAJCSAqIGNsZWFyIGFueSBkaXJ0eSBiaXRzIGFuZCBkb24ndCBzZXQgYW55IHdyaXRlYmFjayBiaXRzCisJCSAqCisJCSAqIERvIHNldCB0aGUgUHJpdmF0ZTIgYml0IHNvIHdlIGtub3cgdGhpcyBwYWdlIHdhcyBwcm9wZXJseQorCQkgKiBzZXR1cCBmb3Igd3JpdGVwYWdlCiAJCSAqLworCQlvcCA9IHVubG9jayA/IEVYVEVOVF9DTEVBUl9VTkxPQ0tfUEFHRSA6IDA7CisJCW9wIHw9IEVYVEVOVF9DTEVBUl9VTkxPQ0sgfCBFWFRFTlRfQ0xFQVJfREVMQUxMT0MgfAorCQkJRVhURU5UX1NFVF9QUklWQVRFMjsKKwogCQlleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jKGlub2RlLCAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCiAJCQkJCSAgICAgc3RhcnQsIHN0YXJ0ICsgcmFtX3NpemUgLSAxLAotCQkJCQkgICAgIGxvY2tlZF9wYWdlLCB1bmxvY2ssIDEsCi0JCQkJCSAgICAgMSwgMCwgMCwgMCk7CisJCQkJCSAgICAgbG9ja2VkX3BhZ2UsIG9wKTsKIAkJZGlza19udW1fYnl0ZXMgLT0gY3VyX2FsbG9jX3NpemU7CiAJCW51bV9ieXRlcyAtPSBjdXJfYWxsb2Nfc2l6ZTsKIAkJYWxsb2NfaGludCA9IGlucy5vYmplY3RpZCArIGlucy5vZmZzZXQ7CkBAIC04NTIsOCArODgxLDggQEAKIAl1NjQgY3VyX2VuZDsKIAlpbnQgbGltaXQgPSAxMCAqIDEwMjQgKiAxMDQyOwogCi0JY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQgfAotCQkJIEVYVEVOVF9ERUxBTExPQywgMSwgMCwgR0ZQX05PRlMpOworCWNsZWFyX2V4dGVudF9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTE9DS0VELAorCQkJIDEsIDAsIE5VTEwsIEdGUF9OT0ZTKTsKIAl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKIAkJYXN5bmNfY293ID0ga21hbGxvYyhzaXplb2YoKmFzeW5jX2NvdyksIEdGUF9OT0ZTKTsKIAkJYXN5bmNfY293LT5pbm9kZSA9IGlub2RlOwpAQCAtOTk0LDYgKzEwMjMsNyBAQAogCiAJCWlmIChmb3VuZF9rZXkub2Zmc2V0ID4gY3VyX29mZnNldCkgewogCQkJZXh0ZW50X2VuZCA9IGZvdW5kX2tleS5vZmZzZXQ7CisJCQlleHRlbnRfdHlwZSA9IDA7CiAJCQlnb3RvIG91dF9jaGVjazsKIAkJfQogCkBAIC0xMDgwLDkgKzExMTAsOSBAQAogCQkJZW0tPmJkZXYgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKIAkJCXNldF9iaXQoRVhURU5UX0ZMQUdfUElOTkVELCAmZW0tPmZsYWdzKTsKIAkJCXdoaWxlICgxKSB7Ci0JCQkJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJCQl3cml0ZV9sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAkJCQlyZXQgPSBhZGRfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0pOwotCQkJCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJCQl3cml0ZV91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCQkJCWlmIChyZXQgIT0gLUVFWElTVCkgewogCQkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOwogCQkJCQlicmVhazsKQEAgLTExMDAsOCArMTEzMCwxMCBAQAogCQlCVUdfT04ocmV0KTsKIAogCQlleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jKGlub2RlLCAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCi0JCQkJCWN1cl9vZmZzZXQsIGN1cl9vZmZzZXQgKyBudW1fYnl0ZXMgLSAxLAotCQkJCQlsb2NrZWRfcGFnZSwgMSwgMSwgMSwgMCwgMCwgMCk7CisJCQkJY3VyX29mZnNldCwgY3VyX29mZnNldCArIG51bV9ieXRlcyAtIDEsCisJCQkJbG9ja2VkX3BhZ2UsIEVYVEVOVF9DTEVBUl9VTkxPQ0tfUEFHRSB8CisJCQkJRVhURU5UX0NMRUFSX1VOTE9DSyB8IEVYVEVOVF9DTEVBUl9ERUxBTExPQyB8CisJCQkJRVhURU5UX1NFVF9QUklWQVRFMik7CiAJCWN1cl9vZmZzZXQgPSBleHRlbnRfZW5kOwogCQlpZiAoY3VyX29mZnNldCA+IGVuZCkKIAkJCWJyZWFrOwpAQCAtMTE0Nyw2ICsxMTc5LDg5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBidHJmc19zcGxpdF9leHRlbnRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvcmlnLCB1NjQgc3BsaXQpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwl1NjQgc2l6ZTsKKworCWlmICghKG9yaWctPnN0YXRlICYgRVhURU5UX0RFTEFMTE9DKSkKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gb3JpZy0+ZW5kIC0gb3JpZy0+c3RhcnQgKyAxOworCWlmIChzaXplID4gcm9vdC0+ZnNfaW5mby0+bWF4X2V4dGVudCkgeworCQl1NjQgbnVtX2V4dGVudHM7CisJCXU2NCBuZXdfc2l6ZTsKKworCQluZXdfc2l6ZSA9IG9yaWctPmVuZCAtIHNwbGl0ICsgMTsKKwkJbnVtX2V4dGVudHMgPSBkaXY2NF91NjQoc2l6ZSArIHJvb3QtPmZzX2luZm8tPm1heF9leHRlbnQgLSAxLAorCQkJCQlyb290LT5mc19pbmZvLT5tYXhfZXh0ZW50KTsKKworCQkvKgorCQkgKiBpZiB3ZSBicmVhayBhIGxhcmdlIGV4dGVudCB1cCB0aGVuIGxlYXZlIG91c3RhbmRpbmdfZXh0ZW50cworCQkgKiBiZSwgc2luY2Ugd2UndmUgYWxyZWFkeSBhY2NvdW50ZWQgZm9yIHRoZSBsYXJnZSBleHRlbnQuCisJCSAqLworCQlpZiAoZGl2NjRfdTY0KG5ld19zaXplICsgcm9vdC0+ZnNfaW5mby0+bWF4X2V4dGVudCAtIDEsCisJCQkgICAgICByb290LT5mc19pbmZvLT5tYXhfZXh0ZW50KSA8IG51bV9leHRlbnRzKQorCQkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+YWNjb3VudGluZ19sb2NrKTsKKwlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cysrOworCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+YWNjb3VudGluZ19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogZXh0ZW50X2lvLmMgbWVyZ2VfZXh0ZW50X2hvb2ssIHVzZWQgdG8gdHJhY2sgbWVyZ2VkIGRlbGF5ZWQgYWxsb2NhdGlvbgorICogZXh0ZW50cyBzbyB3ZSBjYW4ga2VlcCB0cmFjayBvZiBuZXcgZXh0ZW50cyB0aGF0IGFyZSBqdXN0IG1lcmdlZCBvbnRvIG9sZAorICogZXh0ZW50cywgc3VjaCBhcyB3aGVuIHdlIGFyZSBkb2luZyBzZXF1ZW50aWFsIHdyaXRlcywgc28gd2UgY2FuIHByb3Blcmx5CisgKiBhY2NvdW50IGZvciB0aGUgbWV0YWRhdGEgc3BhY2Ugd2UnbGwgbmVlZC4KKyAqLworc3RhdGljIGludCBidHJmc19tZXJnZV9leHRlbnRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm5ldywKKwkJCQkgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcikKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXU2NCBuZXdfc2l6ZSwgb2xkX3NpemU7CisJdTY0IG51bV9leHRlbnRzOworCisJLyogbm90IGRlbGFsbG9jLCBpZ25vcmUgaXQgKi8KKwlpZiAoIShvdGhlci0+c3RhdGUgJiBFWFRFTlRfREVMQUxMT0MpKQorCQlyZXR1cm4gMDsKKworCW9sZF9zaXplID0gb3RoZXItPmVuZCAtIG90aGVyLT5zdGFydCArIDE7CisJaWYgKG5ldy0+c3RhcnQgPCBvdGhlci0+c3RhcnQpCisJCW5ld19zaXplID0gb3RoZXItPmVuZCAtIG5ldy0+c3RhcnQgKyAxOworCWVsc2UKKwkJbmV3X3NpemUgPSBuZXctPmVuZCAtIG90aGVyLT5zdGFydCArIDE7CisKKwkvKiB3ZSdyZSBub3QgYmlnZ2VyIHRoYW4gdGhlIG1heCwgdW5yZXNlcnZlIHRoZSBzcGFjZSBhbmQgZ28gKi8KKwlpZiAobmV3X3NpemUgPD0gcm9vdC0+ZnNfaW5mby0+bWF4X2V4dGVudCkgeworCQlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5hY2NvdW50aW5nX2xvY2spOworCQlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cy0tOworCQlzcGluX3VubG9jaygmQlRSRlNfSShpbm9kZSktPmFjY291bnRpbmdfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgd2UgZ3JldyBieSBhbm90aGVyIG1heF9leHRlbnQsIGp1c3QgcmV0dXJuLCB3ZSB3YW50IHRvIGtlZXAgdGhhdAorCSAqIHJlc2VydmVkIGFtb3VudC4KKwkgKi8KKwludW1fZXh0ZW50cyA9IGRpdjY0X3U2NChvbGRfc2l6ZSArIHJvb3QtPmZzX2luZm8tPm1heF9leHRlbnQgLSAxLAorCQkJCXJvb3QtPmZzX2luZm8tPm1heF9leHRlbnQpOworCWlmIChkaXY2NF91NjQobmV3X3NpemUgKyByb290LT5mc19pbmZvLT5tYXhfZXh0ZW50IC0gMSwKKwkJICAgICAgcm9vdC0+ZnNfaW5mby0+bWF4X2V4dGVudCkgPiBudW1fZXh0ZW50cykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5hY2NvdW50aW5nX2xvY2spOworCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzLS07CisJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5hY2NvdW50aW5nX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBleHRlbnRfaW8uYyBzZXRfYml0X2hvb2ssIHVzZWQgdG8gdHJhY2sgZGVsYXllZCBhbGxvY2F0aW9uCiAgKiBieXRlcyBpbiB0aGlzIGZpbGUsIGFuZCB0byBtYWludGFpbiB0aGUgbGlzdCBvZiBpbm9kZXMgdGhhdApAQCAtMTE1NSw2ICsxMjcwLDcgQEAKIHN0YXRpYyBpbnQgYnRyZnNfc2V0X2JpdF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwgdTY0IGVuZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2xkLCB1bnNpZ25lZCBsb25nIGJpdHMpCiB7CisKIAkvKgogCSAqIHNldF9iaXQgYW5kIGNsZWFyIGJpdCBob29rcyBub3JtYWxseSByZXF1aXJlIF9pcnFzYXZlL3Jlc3RvcmUKIAkgKiBidXQgaW4gdGhpcyBjYXNlLCB3ZSBhcmUgb25seSB0ZXN0ZWluZyBmb3IgdGhlIERFTEFMTE9DCkBAIC0xMTYyLDYgKzEyNzgsMTAgQEAKIAkgKi8KIAlpZiAoIShvbGQgJiBFWFRFTlRfREVMQUxMT0MpICYmIChiaXRzICYgRVhURU5UX0RFTEFMTE9DKSkgewogCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCisJCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmFjY291bnRpbmdfbG9jayk7CisJCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzKys7CisJCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+YWNjb3VudGluZ19sb2NrKTsKIAkJYnRyZnNfZGVsYWxsb2NfcmVzZXJ2ZV9zcGFjZShyb290LCBpbm9kZSwgZW5kIC0gc3RhcnQgKyAxKTsKIAkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKIAkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2J5dGVzICs9IGVuZCAtIHN0YXJ0ICsgMTsKQEAgLTExNzgsMjIgKzEyOTgsMzEgQEAKIC8qCiAgKiBleHRlbnRfaW8uYyBjbGVhcl9iaXRfaG9vaywgc2VlIHNldF9iaXRfaG9vayBmb3Igd2h5CiAgKi8KLXN0YXRpYyBpbnQgYnRyZnNfY2xlYXJfYml0X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAotCQkJIHVuc2lnbmVkIGxvbmcgb2xkLCB1bnNpZ25lZCBsb25nIGJpdHMpCitzdGF0aWMgaW50IGJ0cmZzX2NsZWFyX2JpdF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGxvbmcgYml0cykKIHsKIAkvKgogCSAqIHNldF9iaXQgYW5kIGNsZWFyIGJpdCBob29rcyBub3JtYWxseSByZXF1aXJlIF9pcnFzYXZlL3Jlc3RvcmUKIAkgKiBidXQgaW4gdGhpcyBjYXNlLCB3ZSBhcmUgb25seSB0ZXN0ZWluZyBmb3IgdGhlIERFTEFMTE9DCiAJICogYml0LCB3aGljaCBpcyBvbmx5IHNldCBvciBjbGVhcmVkIHdpdGggaXJxcyBvbgogCSAqLwotCWlmICgob2xkICYgRVhURU5UX0RFTEFMTE9DKSAmJiAoYml0cyAmIEVYVEVOVF9ERUxBTExPQykpIHsKKwlpZiAoKHN0YXRlLT5zdGF0ZSAmIEVYVEVOVF9ERUxBTExPQykgJiYgKGJpdHMgJiBFWFRFTlRfREVMQUxMT0MpKSB7CiAJCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CiAKKwkJaWYgKGJpdHMgJiBFWFRFTlRfRE9fQUNDT1VOVElORykgeworCQkJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+YWNjb3VudGluZ19sb2NrKTsKKwkJCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzLS07CisJCQlzcGluX3VubG9jaygmQlRSRlNfSShpbm9kZSktPmFjY291bnRpbmdfbG9jayk7CisJCQlidHJmc191bnJlc2VydmVfbWV0YWRhdGFfZm9yX2RlbGFsbG9jKHJvb3QsIGlub2RlLCAxKTsKKwkJfQorCiAJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfbG9jayk7Ci0JCWlmIChlbmQgLSBzdGFydCArIDEgPiByb290LT5mc19pbmZvLT5kZWxhbGxvY19ieXRlcykgeworCQlpZiAoc3RhdGUtPmVuZCAtIHN0YXRlLT5zdGFydCArIDEgPgorCQkgICAgcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfYnl0ZXMpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIHdhcm5pbmc6IGRlbGFsbG9jIGFjY291bnQgIgogCQkJICAgICAgICIlbGx1ICVsbHVcbiIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmQgLSBzdGFydCArIDEsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCSAgICAgICBzdGF0ZS0+ZW5kIC0gc3RhdGUtPnN0YXJ0ICsgMSwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQogCQkJICAgICAgIHJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2J5dGVzKTsKIAkJCWJ0cmZzX2RlbGFsbG9jX2ZyZWVfc3BhY2Uocm9vdCwgaW5vZGUsICh1NjQpLTEpOwpAQCAtMTIwMSw5ICsxMzMwLDEyIEBACiAJCQlCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfYnl0ZXMgPSAwOwogCQl9IGVsc2UgewogCQkJYnRyZnNfZGVsYWxsb2NfZnJlZV9zcGFjZShyb290LCBpbm9kZSwKLQkJCQkJCSAgZW5kIC0gc3RhcnQgKyAxKTsKLQkJCXJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2J5dGVzIC09IGVuZCAtIHN0YXJ0ICsgMTsKLQkJCUJUUkZTX0koaW5vZGUpLT5kZWxhbGxvY19ieXRlcyAtPSBlbmQgLSBzdGFydCArIDE7CisJCQkJCQkgIHN0YXRlLT5lbmQgLQorCQkJCQkJICBzdGF0ZS0+c3RhcnQgKyAxKTsKKwkJCXJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2J5dGVzIC09IHN0YXRlLT5lbmQgLQorCQkJCXN0YXRlLT5zdGFydCArIDE7CisJCQlCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfYnl0ZXMgLT0gc3RhdGUtPmVuZCAtCisJCQkJc3RhdGUtPnN0YXJ0ICsgMTsKIAkJfQogCQlpZiAoQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2J5dGVzID09IDAgJiYKIAkJICAgICFsaXN0X2VtcHR5KCZCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfaW5vZGVzKSkgewpAQCAtMTM3NCwxMCArMTUwNiw4IEBACiAJbG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOwogCiAJLyogYWxyZWFkeSBvcmRlcmVkPyBXZSdyZSBkb25lICovCi0JaWYgKHRlc3RfcmFuZ2VfYml0KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsCi0JCQkgICAgIEVYVEVOVF9PUkRFUkVELCAwKSkgeworCWlmIChQYWdlUHJpdmF0ZTIocGFnZSkpCiAJCWdvdG8gb3V0OwotCX0KIAogCW9yZGVyZWQgPSBidHJmc19sb29rdXBfb3JkZXJlZF9leHRlbnQoaW5vZGUsIHBhZ2Vfc3RhcnQpOwogCWlmIChvcmRlcmVkKSB7CkBAIC0xNDEzLDExICsxNTQzLDkgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgYnRyZnNfd3JpdGVwYWdlX2ZpeHVwICpmaXh1cDsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwotCWludCByZXQ7CiAKLQlyZXQgPSB0ZXN0X3JhbmdlX2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsCi0JCQkgICAgIEVYVEVOVF9PUkRFUkVELCAwKTsKLQlpZiAocmV0KQorCS8qIHRoaXMgcGFnZSBpcyBwcm9wZXJseSBpbiB0aGUgb3JkZXJlZCBsaXN0ICovCisJaWYgKFRlc3RDbGVhclBhZ2VQcml2YXRlMihwYWdlKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoUGFnZUNoZWNrZWQocGFnZSkpCkBAIC0xNDU1LDkgKzE1ODMsMTkgQEAKIAlCVUdfT04oIXBhdGgpOwogCiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOworCisJLyoKKwkgKiB3ZSBtYXkgYmUgcmVwbGFjaW5nIG9uZSBleHRlbnQgaW4gdGhlIHRyZWUgd2l0aCBhbm90aGVyLgorCSAqIFRoZSBuZXcgZXh0ZW50IGlzIHBpbm5lZCBpbiB0aGUgZXh0ZW50IG1hcCwgYW5kIHdlIGRvbid0IHdhbnQKKwkgKiB0byBkcm9wIGl0IGZyb20gdGhlIGNhY2hlIHVudGlsIGl0IGlzIGNvbXBsZXRlbHkgaW4gdGhlIGJ0cmVlLgorCSAqCisJICogU28sIHRlbGwgYnRyZnNfZHJvcF9leHRlbnRzIHRvIGxlYXZlIHRoaXMgZXh0ZW50IGluIHRoZSBjYWNoZS4KKwkgKiB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHVucGluIGl0IGFuZCBhbGxvdyBpdCB0byBiZSBtZXJnZWQKKwkgKiB3aXRoIHRoZSBvdGhlcnMuCisJICovCiAJcmV0ID0gYnRyZnNfZHJvcF9leHRlbnRzKHRyYW5zLCByb290LCBpbm9kZSwgZmlsZV9wb3MsCiAJCQkJIGZpbGVfcG9zICsgbnVtX2J5dGVzLCBsb2NrZWRfZW5kLAotCQkJCSBmaWxlX3BvcywgJmhpbnQpOworCQkJCSBmaWxlX3BvcywgJmhpbnQsIDApOwogCUJVR19PTihyZXQpOwogCiAJaW5zLm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOwpAQCAtMTQ4NSw3ICsxNjIzLDYgQEAKIAlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKIAogCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgbnVtX2J5dGVzKTsKLQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgZmlsZV9wb3MsIGZpbGVfcG9zICsgbnVtX2J5dGVzIC0gMSwgMCk7CiAKIAlpbnMub2JqZWN0aWQgPSBkaXNrX2J5dGVucjsKIAlpbnMub2Zmc2V0ID0gZGlza19udW1fYnl0ZXM7CkBAIC0xNTk2LDYgKzE3MzMsOSBAQAogCQkJCQkJb3JkZXJlZF9leHRlbnQtPmxlbiwKIAkJCQkJCWNvbXByZXNzZWQsIDAsIDAsCiAJCQkJCQlCVFJGU19GSUxFX0VYVEVOVF9SRUcpOworCQl1bnBpbl9leHRlbnRfY2FjaGUoJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZSwKKwkJCQkgICBvcmRlcmVkX2V4dGVudC0+ZmlsZV9vZmZzZXQsCisJCQkJICAgb3JkZXJlZF9leHRlbnQtPmxlbik7CiAJCUJVR19PTihyZXQpOwogCX0KIAl1bmxvY2tfZXh0ZW50KGlvX3RyZWUsIG9yZGVyZWRfZXh0ZW50LT5maWxlX29mZnNldCwKQEAgLTE2MjMsNiArMTc2Myw3IEBACiBzdGF0aWMgaW50IGJ0cmZzX3dyaXRlcGFnZV9lbmRfaW9faG9vayhzdHJ1Y3QgcGFnZSAqcGFnZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkJCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgdXB0b2RhdGUpCiB7CisJQ2xlYXJQYWdlUHJpdmF0ZTIocGFnZSk7CiAJcmV0dXJuIGJ0cmZzX2ZpbmlzaF9vcmRlcmVkX2lvKHBhZ2UtPm1hcHBpbmctPmhvc3QsIHN0YXJ0LCBlbmQpOwogfQogCkBAIC0xNjY5LDEzICsxODEwLDEzIEBACiAJCWZhaWxyZWMtPmxhc3RfbWlycm9yID0gMDsKIAkJZmFpbHJlYy0+YmlvX2ZsYWdzID0gMDsKIAotCQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCQlyZWFkX2xvY2soJmVtX3RyZWUtPmxvY2spOwogCQllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBzdGFydCwgZmFpbHJlYy0+bGVuKTsKIAkJaWYgKGVtLT5zdGFydCA+IHN0YXJ0IHx8IGVtLT5zdGFydCArIGVtLT5sZW4gPCBzdGFydCkgewogCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKIAkJCWVtID0gTlVMTDsKIAkJfQotCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJCXJlYWRfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAogCQlpZiAoIWVtIHx8IElTX0VSUihlbSkpIHsKIAkJCWtmcmVlKGZhaWxyZWMpOwpAQCAtMTc5NCw3ICsxOTM1LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAocm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgPT0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElEICYmCi0JICAgIHRlc3RfcmFuZ2VfYml0KGlvX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9OT0RBVEFTVU0sIDEpKSB7CisJICAgIHRlc3RfcmFuZ2VfYml0KGlvX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9OT0RBVEFTVU0sIDEsIE5VTEwpKSB7CiAJCWNsZWFyX2V4dGVudF9iaXRzKGlvX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9OT0RBVEFTVU0sCiAJCQkJICBHRlBfTk9GUyk7CiAJCXJldHVybiAwOwpAQCAtMjM1Miw2ICsyNDkzLDY5IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGJ0cmZzX3VubGlua19zdWJ2b2woc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCXN0cnVjdCBpbm9kZSAqZGlyLCB1NjQgb2JqZWN0aWQsCisJCQljb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4pCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpkaTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwl1NjQgaW5kZXg7CisJaW50IHJldDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRpID0gYnRyZnNfbG9va3VwX2Rpcl9pdGVtKHRyYW5zLCByb290LCBwYXRoLCBkaXItPmlfaW5vLAorCQkJCSAgIG5hbWUsIG5hbWVfbGVuLCAtMSk7CisJQlVHX09OKCFkaSB8fCBJU19FUlIoZGkpKTsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlidHJmc19kaXJfaXRlbV9rZXlfdG9fY3B1KGxlYWYsIGRpLCAma2V5KTsKKwlXQVJOX09OKGtleS50eXBlICE9IEJUUkZTX1JPT1RfSVRFTV9LRVkgfHwga2V5Lm9iamVjdGlkICE9IG9iamVjdGlkKTsKKwlyZXQgPSBidHJmc19kZWxldGVfb25lX2Rpcl9uYW1lKHRyYW5zLCByb290LCBwYXRoLCBkaSk7CisJQlVHX09OKHJldCk7CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCisJcmV0ID0gYnRyZnNfZGVsX3Jvb3RfcmVmKHRyYW5zLCByb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCisJCQkJIG9iamVjdGlkLCByb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJCQkgZGlyLT5pX2lubywgJmluZGV4LCBuYW1lLCBuYW1lX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJQlVHX09OKHJldCAhPSAtRU5PRU5UKTsKKwkJZGkgPSBidHJmc19zZWFyY2hfZGlyX2luZGV4X2l0ZW0ocm9vdCwgcGF0aCwgZGlyLT5pX2lubywKKwkJCQkJCSBuYW1lLCBuYW1lX2xlbik7CisJCUJVR19PTighZGkgfHwgSVNfRVJSKGRpKSk7CisKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCWluZGV4ID0ga2V5Lm9mZnNldDsKKwl9CisKKwlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaW5kZXhfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgZGlyLT5pX2lubywKKwkJCQkJIGluZGV4LCBuYW1lLCBuYW1lX2xlbiwgLTEpOworCUJVR19PTighZGkgfHwgSVNfRVJSKGRpKSk7CisKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJYnRyZnNfZGlyX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCBkaSwgJmtleSk7CisJV0FSTl9PTihrZXkudHlwZSAhPSBCVFJGU19ST09UX0lURU1fS0VZIHx8IGtleS5vYmplY3RpZCAhPSBvYmplY3RpZCk7CisJcmV0ID0gYnRyZnNfZGVsZXRlX29uZV9kaXJfbmFtZSh0cmFucywgcm9vdCwgcGF0aCwgZGkpOworCUJVR19PTihyZXQpOworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCWJ0cmZzX2lfc2l6ZV93cml0ZShkaXIsIGRpci0+aV9zaXplIC0gbmFtZV9sZW4gKiAyKTsKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBkaXIpOworCUJVR19PTihyZXQpOworCWRpci0+aV9zYi0+c19kaXJ0ID0gMTsKKworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBidHJmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CkBAIC0yMzYxLDI5ICsyNTY1LDMxIEBACiAJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CiAJdW5zaWduZWQgbG9uZyBuciA9IDA7CiAKLQkvKgotCSAqIHRoZSBGSVJTVF9GUkVFX09CSkVDVElEIGNoZWNrIG1ha2VzIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHJtZGlyCi0JICogdGhlIHJvb3Qgb2YgYSBzdWJ2b2x1bWUgb3Igc25hcHNob3QKLQkgKi8KIAlpZiAoaW5vZGUtPmlfc2l6ZSA+IEJUUkZTX0VNUFRZX0RJUl9TSVpFIHx8Ci0JICAgIGlub2RlLT5pX2lubyA9PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSB7CisJICAgIGlub2RlLT5pX2lubyA9PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKQogCQlyZXR1cm4gLUVOT1RFTVBUWTsKLQl9CiAKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOwogCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKIAorCWlmICh1bmxpa2VseShpbm9kZS0+aV9pbm8gPT0gQlRSRlNfRU1QVFlfU1VCVk9MX0RJUl9PQkpFQ1RJRCkpIHsKKwkJZXJyID0gYnRyZnNfdW5saW5rX3N1YnZvbCh0cmFucywgcm9vdCwgZGlyLAorCQkJCQkgIEJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi5vYmplY3RpZCwKKwkJCQkJICBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCQkgIGRlbnRyeS0+ZF9uYW1lLmxlbik7CisJCWdvdG8gb3V0OworCX0KKwogCWVyciA9IGJ0cmZzX29ycGhhbl9hZGQodHJhbnMsIGlub2RlKTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWxfdHJhbnM7CisJCWdvdG8gb3V0OwogCiAJLyogbm93IHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkgKi8KIAllcnIgPSBidHJmc191bmxpbmtfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX2lub2RlLAogCQkJCSBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOwogCWlmICghZXJyKQogCQlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIDApOwotCi1mYWlsX3RyYW5zOgorb3V0OgogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CiAJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CkBAIC0yODI2LDEyICszMDMyLDIyIEBACiAKIAlpZiAoKG9mZnNldCAmIChibG9ja3NpemUgLSAxKSkgPT0gMCkKIAkJZ290byBvdXQ7CisJcmV0ID0gYnRyZnNfY2hlY2tfZGF0YV9mcmVlX3NwYWNlKHJvb3QsIGlub2RlLCBQQUdFX0NBQ0hFX1NJWkUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9mb3JfZGVsYWxsb2Mocm9vdCwgaW5vZGUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCiAJcmV0ID0gLUVOT01FTTsKIGFnYWluOgogCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgpOwotCWlmICghcGFnZSkKKwlpZiAoIXBhZ2UpIHsKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKHJvb3QsIGlub2RlLCBQQUdFX0NBQ0hFX1NJWkUpOworCQlidHJmc191bnJlc2VydmVfbWV0YWRhdGFfZm9yX2RlbGFsbG9jKHJvb3QsIGlub2RlLCAxKTsKIAkJZ290byBvdXQ7CisJfQogCiAJcGFnZV9zdGFydCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwogCXBhZ2VfZW5kID0gcGFnZV9zdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7CkBAIC0yODY0LDcgKzMwODAsMTYgQEAKIAkJZ290byBhZ2FpbjsKIAl9CiAKLQlidHJmc19zZXRfZXh0ZW50X2RlbGFsbG9jKGlub2RlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCk7CisJY2xlYXJfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwKKwkJCSAgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DIHwgRVhURU5UX0RPX0FDQ09VTlRJTkcsCisJCQkgIEdGUF9OT0ZTKTsKKworCXJldCA9IGJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kKTsKKwlpZiAocmV0KSB7CisJCXVubG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwogCXJldCA9IDA7CiAJaWYgKG9mZnNldCAhPSBQQUdFX0NBQ0hFX1NJWkUpIHsKIAkJa2FkZHIgPSBrbWFwKHBhZ2UpOwpAQCAtMjg3Nyw2ICszMTAyLDkgQEAKIAl1bmxvY2tfZXh0ZW50KGlvX3RyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CiAKIG91dF91bmxvY2s6CisJaWYgKHJldCkKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKHJvb3QsIGlub2RlLCBQQUdFX0NBQ0hFX1NJWkUpOworCWJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9mb3JfZGVsYWxsb2Mocm9vdCwgaW5vZGUsIDEpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIG91dDoKQEAgLTI4OTUsMTcgKzMxMjMsMTUgQEAKIAl1NjQgbGFzdF9ieXRlOwogCXU2NCBjdXJfb2Zmc2V0OwogCXU2NCBob2xlX3NpemU7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAogCWlmIChzaXplIDw9IGhvbGVfc3RhcnQpCiAJCXJldHVybiAwOwogCi0JZXJyID0gYnRyZnNfY2hlY2tfbWV0YWRhdGFfZnJlZV9zcGFjZShyb290KTsKKwllcnIgPSBidHJmc190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlidHJmc190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOwotCiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICpvcmRlcmVkOwogCQlidHJmc193YWl0X29yZGVyZWRfcmFuZ2UoaW5vZGUsIGhvbGVfc3RhcnQsCkBAIC0yOTM1LDE1ICszMTYxLDIxIEBACiAJCQkJCQkgY3VyX29mZnNldCwKIAkJCQkJCSBjdXJfb2Zmc2V0ICsgaG9sZV9zaXplLAogCQkJCQkJIGJsb2NrX2VuZCwKLQkJCQkJCSBjdXJfb2Zmc2V0LCAmaGludF9ieXRlKTsKKwkJCQkJCSBjdXJfb2Zmc2V0LCAmaGludF9ieXRlLCAxKTsKIAkJCWlmIChlcnIpCiAJCQkJYnJlYWs7CisKKwkJCWVyciA9IGJ0cmZzX3Jlc2VydmVfbWV0YWRhdGFfc3BhY2Uocm9vdCwgMSk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCiAJCQllcnIgPSBidHJmc19pbnNlcnRfZmlsZV9leHRlbnQodHJhbnMsIHJvb3QsCiAJCQkJCWlub2RlLT5pX2lubywgY3VyX29mZnNldCwgMCwKIAkJCQkJMCwgaG9sZV9zaXplLCAwLCBob2xlX3NpemUsCiAJCQkJCTAsIDAsIDApOwogCQkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIGhvbGVfc3RhcnQsCiAJCQkJCWxhc3RfYnl0ZSAtIDEsIDApOworCQkJYnRyZnNfdW5yZXNlcnZlX21ldGFkYXRhX3NwYWNlKHJvb3QsIDEpOwogCQl9CiAJCWZyZWVfZXh0ZW50X21hcChlbSk7CiAJCWN1cl9vZmZzZXQgPSBsYXN0X2J5dGU7CkBAIC0zMDAzLDYgKzMyMzUsMTEgQEAKIAl9CiAJYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCAwLCAodTY0KS0xKTsKIAorCWlmIChpbm9kZS0+aV9ubGluayA+IDApIHsKKwkJQlVHX09OKGJ0cmZzX3Jvb3RfcmVmcygmcm9vdC0+cm9vdF9pdGVtKSAhPSAwKTsKKwkJZ290byBub19kZWxldGU7CisJfQorCiAJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCAwKTsKIAl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CiAKQEAgLTMwNzAsMjkgKzMzMDcsNjcgQEAKICAqIGlzIGtpbmQgb2YgbGlrZSBjcm9zc2luZyBhIG1vdW50IHBvaW50LgogICovCiBzdGF0aWMgaW50IGZpeHVwX3RyZWVfcm9vdF9sb2NhdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKLQkJCSAgICAgc3RydWN0IGJ0cmZzX2tleSAqbG9jYXRpb24sCi0JCQkgICAgIHN0cnVjdCBidHJmc19yb290ICoqc3ViX3Jvb3QsCi0JCQkgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKKwkJCQkgICAgc3RydWN0IGlub2RlICpkaXIsCisJCQkJICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2tleSAqbG9jYXRpb24sCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICoqc3ViX3Jvb3QpCiB7Ci0Jc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqcmk7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290OworCXN0cnVjdCBidHJmc19yb290X3JlZiAqcmVmOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCWludCByZXQ7CisJaW50IGVyciA9IDA7CiAKLQlpZiAoYnRyZnNfa2V5X3R5cGUobG9jYXRpb24pICE9IEJUUkZTX1JPT1RfSVRFTV9LRVkpCi0JCXJldHVybiAwOwotCWlmIChsb2NhdGlvbi0+b2JqZWN0aWQgPT0gQlRSRlNfUk9PVF9UUkVFX09CSkVDVElEKQotCQlyZXR1cm4gMDsKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CiAKLQkqc3ViX3Jvb3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Qocm9vdC0+ZnNfaW5mbywgbG9jYXRpb24sCi0JCQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCQkJCWRlbnRyeS0+ZF9uYW1lLmxlbik7Ci0JaWYgKElTX0VSUigqc3ViX3Jvb3QpKQotCQlyZXR1cm4gUFRSX0VSUigqc3ViX3Jvb3QpOworCWVyciA9IC1FTk9FTlQ7CisJcmV0ID0gYnRyZnNfZmluZF9yb290X3JlZihyb290LT5mc19pbmZvLT50cmVlX3Jvb3QsIHBhdGgsCisJCQkJICBCVFJGU19JKGRpciktPnJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCSAgbG9jYXRpb24tPm9iamVjdGlkKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgPCAwKQorCQkJZXJyID0gcmV0OworCQlnb3RvIG91dDsKKwl9CiAKLQlyaSA9ICYoKnN1Yl9yb290KS0+cm9vdF9pdGVtOwotCWxvY2F0aW9uLT5vYmplY3RpZCA9IGJ0cmZzX3Jvb3RfZGlyaWQocmkpOwotCWJ0cmZzX3NldF9rZXlfdHlwZShsb2NhdGlvbiwgQlRSRlNfSU5PREVfSVRFTV9LRVkpOworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlyZWYgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX3Jvb3RfcmVmKTsKKwlpZiAoYnRyZnNfcm9vdF9yZWZfZGlyaWQobGVhZiwgcmVmKSAhPSBkaXItPmlfaW5vIHx8CisJICAgIGJ0cmZzX3Jvb3RfcmVmX25hbWVfbGVuKGxlYWYsIHJlZikgIT0gZGVudHJ5LT5kX25hbWUubGVuKQorCQlnb3RvIG91dDsKKworCXJldCA9IG1lbWNtcF9leHRlbnRfYnVmZmVyKGxlYWYsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcpKHJlZiArIDEpLAorCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLmxlbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LCBwYXRoKTsKKworCW5ld19yb290ID0gYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUocm9vdC0+ZnNfaW5mbywgbG9jYXRpb24pOworCWlmIChJU19FUlIobmV3X3Jvb3QpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X3Jvb3QpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYnRyZnNfcm9vdF9yZWZzKCZuZXdfcm9vdC0+cm9vdF9pdGVtKSA9PSAwKSB7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCSpzdWJfcm9vdCA9IG5ld19yb290OworCWxvY2F0aW9uLT5vYmplY3RpZCA9IGJ0cmZzX3Jvb3RfZGlyaWQoJm5ld19yb290LT5yb290X2l0ZW0pOworCWxvY2F0aW9uLT50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CiAJbG9jYXRpb24tPm9mZnNldCA9IDA7Ci0KLQlyZXR1cm4gMDsKKwllcnIgPSAwOworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBpbm9kZV90cmVlX2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMzEwMSwxMSArMzM3NiwxMyBAQAogCXN0cnVjdCBidHJmc19pbm9kZSAqZW50cnk7CiAJc3RydWN0IHJiX25vZGUgKipwOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQ7Ci0KIGFnYWluOgogCXAgPSAmcm9vdC0+aW5vZGVfdHJlZS5yYl9ub2RlOwogCXBhcmVudCA9IE5VTEw7CiAKKwlpZiAoaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2soJnJvb3QtPmlub2RlX2xvY2spOwogCXdoaWxlICgqcCkgewogCQlwYXJlbnQgPSAqcDsKQEAgLTMxMzIsMTMgKzM0MDksODcgQEAKIHN0YXRpYyB2b2lkIGlub2RlX3RyZWVfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlpbnQgZW1wdHkgPSAwOwogCiAJc3Bpbl9sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKIAlpZiAoIVJCX0VNUFRZX05PREUoJkJUUkZTX0koaW5vZGUpLT5yYl9ub2RlKSkgewogCQlyYl9lcmFzZSgmQlRSRlNfSShpbm9kZSktPnJiX25vZGUsICZyb290LT5pbm9kZV90cmVlKTsKIAkJUkJfQ0xFQVJfTk9ERSgmQlRSRlNfSShpbm9kZSktPnJiX25vZGUpOworCQllbXB0eSA9IFJCX0VNUFRZX1JPT1QoJnJvb3QtPmlub2RlX3RyZWUpOwogCX0KIAlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7CisKKwlpZiAoZW1wdHkgJiYgYnRyZnNfcm9vdF9yZWZzKCZyb290LT5yb290X2l0ZW0pID09IDApIHsKKwkJc3luY2hyb25pemVfc3JjdSgmcm9vdC0+ZnNfaW5mby0+c3Vidm9sX3NyY3UpOworCQlzcGluX2xvY2soJnJvb3QtPmlub2RlX2xvY2spOworCQllbXB0eSA9IFJCX0VNUFRZX1JPT1QoJnJvb3QtPmlub2RlX3RyZWUpOworCQlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7CisJCWlmIChlbXB0eSkKKwkJCWJ0cmZzX2FkZF9kZWFkX3Jvb3Qocm9vdCk7CisJfQorfQorCitpbnQgYnRyZnNfaW52YWxpZGF0ZV9pbm9kZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IHJiX25vZGUgKnByZXY7CisJc3RydWN0IGJ0cmZzX2lub2RlICplbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXU2NCBvYmplY3RpZCA9IDA7CisKKwlXQVJOX09OKGJ0cmZzX3Jvb3RfcmVmcygmcm9vdC0+cm9vdF9pdGVtKSAhPSAwKTsKKworCXNwaW5fbG9jaygmcm9vdC0+aW5vZGVfbG9jayk7CithZ2FpbjoKKwlub2RlID0gcm9vdC0+aW5vZGVfdHJlZS5yYl9ub2RlOworCXByZXYgPSBOVUxMOworCXdoaWxlIChub2RlKSB7CisJCXByZXYgPSBub2RlOworCQllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19pbm9kZSwgcmJfbm9kZSk7CisKKwkJaWYgKG9iamVjdGlkIDwgZW50cnktPnZmc19pbm9kZS5pX2lubykKKwkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQllbHNlIGlmIChvYmplY3RpZCA+IGVudHJ5LT52ZnNfaW5vZGUuaV9pbm8pCisJCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlpZiAoIW5vZGUpIHsKKwkJd2hpbGUgKHByZXYpIHsKKwkJCWVudHJ5ID0gcmJfZW50cnkocHJldiwgc3RydWN0IGJ0cmZzX2lub2RlLCByYl9ub2RlKTsKKwkJCWlmIChvYmplY3RpZCA8PSBlbnRyeS0+dmZzX2lub2RlLmlfaW5vKSB7CisJCQkJbm9kZSA9IHByZXY7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmV2ID0gcmJfbmV4dChwcmV2KTsKKwkJfQorCX0KKwl3aGlsZSAobm9kZSkgeworCQllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19pbm9kZSwgcmJfbm9kZSk7CisJCW9iamVjdGlkID0gZW50cnktPnZmc19pbm9kZS5pX2lubyArIDE7CisJCWlub2RlID0gaWdyYWIoJmVudHJ5LT52ZnNfaW5vZGUpOworCQlpZiAoaW5vZGUpIHsKKwkJCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKKwkJCWlmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpID4gMSkKKwkJCQlkX3BydW5lX2FsaWFzZXMoaW5vZGUpOworCQkJLyoKKwkJCSAqIGJ0cmZzX2Ryb3BfaW5vZGUgd2lsbCByZW1vdmUgaXQgZnJvbQorCQkJICogdGhlIGlub2RlIGNhY2hlIHdoZW4gaXRzIHVzYWdlIGNvdW50CisJCQkgKiBoaXRzIHplcm8uCisJCQkgKi8KKwkJCWlwdXQoaW5vZGUpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlzcGluX2xvY2soJnJvb3QtPmlub2RlX2xvY2spOworCQkJZ290byBhZ2FpbjsKKwkJfQorCisJCWlmIChjb25kX3Jlc2NoZWRfbG9jaygmcm9vdC0+aW5vZGVfbG9jaykpCisJCQlnb3RvIGFnYWluOworCisJCW5vZGUgPSByYl9uZXh0KG5vZGUpOworCX0KKwlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBub2lubGluZSB2b2lkIGluaXRfYnRyZnNfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMzE0OCw2ICszNDk5LDcgQEAKIAliaS0+Z2VuZXJhdGlvbiA9IDA7CiAJYmktPnNlcXVlbmNlID0gMDsKIAliaS0+bGFzdF90cmFucyA9IDA7CisJYmktPmxhc3Rfc3ViX3RyYW5zID0gMDsKIAliaS0+bG9nZ2VkX3RyYW5zID0gMDsKIAliaS0+ZGVsYWxsb2NfYnl0ZXMgPSAwOwogCWJpLT5yZXNlcnZlZF9ieXRlcyA9IDA7CkBAIC0zMjI1LDE1ICszNTc3LDQxIEBACiAJcmV0dXJuIGlub2RlOwogfQogCitzdGF0aWMgc3RydWN0IGlub2RlICpuZXdfc2ltcGxlX2RpcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19rZXkgKmtleSwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdF9idHJmc19pKGlub2RlKTsKKworCUJUUkZTX0koaW5vZGUpLT5yb290ID0gcm9vdDsKKwltZW1jcHkoJkJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbiwga2V5LCBzaXplb2YoKmtleSkpOworCUJUUkZTX0koaW5vZGUpLT5kdW1teV9pbm9kZSA9IDE7CisKKwlpbm9kZS0+aV9pbm8gPSBCVFJGU19FTVBUWV9TVUJWT0xfRElSX09CSkVDVElEOworCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lYVUdPOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKworCXJldHVybiBpbm9kZTsKK30KKwogc3RydWN0IGlub2RlICpidHJmc19sb29rdXBfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgYnRyZnNfaW5vZGUgKmJpID0gQlRSRlNfSShkaXIpOwotCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gYmktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGRpciktPnJvb3Q7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnN1Yl9yb290ID0gcm9vdDsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGxvY2F0aW9uOworCWludCBpbmRleDsKIAlpbnQgcmV0OwogCisJZGVudHJ5LT5kX29wID0gJmJ0cmZzX2RlbnRyeV9vcGVyYXRpb25zOworCiAJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IEJUUkZTX05BTUVfTEVOKQogCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKIApAQCAtMzI0MiwyOSArMzYyMCw1MiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCi0JaW5vZGUgPSBOVUxMOwotCWlmIChsb2NhdGlvbi5vYmplY3RpZCkgewotCQlyZXQgPSBmaXh1cF90cmVlX3Jvb3RfbG9jYXRpb24ocm9vdCwgJmxvY2F0aW9uLCAmc3ViX3Jvb3QsCi0JCQkJCQlkZW50cnkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JCWlmIChyZXQgPiAwKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Ci0JCWlub2RlID0gYnRyZnNfaWdldChkaXItPmlfc2IsICZsb2NhdGlvbiwgc3ViX3Jvb3QpOwotCQlpZiAoSVNfRVJSKGlub2RlKSkKLQkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CisJaWYgKGxvY2F0aW9uLm9iamVjdGlkID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKGxvY2F0aW9uLnR5cGUgPT0gQlRSRlNfSU5PREVfSVRFTV9LRVkpIHsKKwkJaW5vZGUgPSBidHJmc19pZ2V0KGRpci0+aV9zYiwgJmxvY2F0aW9uLCByb290KTsKKwkJcmV0dXJuIGlub2RlOwogCX0KKworCUJVR19PTihsb2NhdGlvbi50eXBlICE9IEJUUkZTX1JPT1RfSVRFTV9LRVkpOworCisJaW5kZXggPSBzcmN1X3JlYWRfbG9jaygmcm9vdC0+ZnNfaW5mby0+c3Vidm9sX3NyY3UpOworCXJldCA9IGZpeHVwX3RyZWVfcm9vdF9sb2NhdGlvbihyb290LCBkaXIsIGRlbnRyeSwKKwkJCQkgICAgICAgJmxvY2F0aW9uLCAmc3ViX3Jvb3QpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgIT0gLUVOT0VOVCkKKwkJCWlub2RlID0gRVJSX1BUUihyZXQpOworCQllbHNlCisJCQlpbm9kZSA9IG5ld19zaW1wbGVfZGlyKGRpci0+aV9zYiwgJmxvY2F0aW9uLCBzdWJfcm9vdCk7CisJfSBlbHNlIHsKKwkJaW5vZGUgPSBidHJmc19pZ2V0KGRpci0+aV9zYiwgJmxvY2F0aW9uLCBzdWJfcm9vdCk7CisJfQorCXNyY3VfcmVhZF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnN1YnZvbF9zcmN1LCBpbmRleCk7CisKIAlyZXR1cm4gaW5vZGU7CiB9CiAKK3N0YXRpYyBpbnQgYnRyZnNfZGVudHJ5X2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CisKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSAmJiAhSVNfUk9PVChkZW50cnkpKQorCQlkZW50cnkgPSBkZW50cnktPmRfcGFyZW50OworCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlyb290ID0gQlRSRlNfSShkZW50cnktPmRfaW5vZGUpLT5yb290OworCQlpZiAoYnRyZnNfcm9vdF9yZWZzKCZyb290LT5yb290X2l0ZW0pID09IDApCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpidHJmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCi0JaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IEJUUkZTX05BTUVfTEVOKQotCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKLQogCWlub2RlID0gYnRyZnNfbG9va3VwX2RlbnRyeShkaXIsIGRlbnRyeSk7CiAJaWYgKElTX0VSUihpbm9kZSkpCiAJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CkBAIC0zNjAzLDkgKzQwMDQsNiBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBmYWlsOwogCi0JaWYgKG9iamVjdGlkID4gcm9vdC0+aGlnaGVzdF9pbm9kZSkKLQkJcm9vdC0+aGlnaGVzdF9pbm9kZSA9IG9iamVjdGlkOwotCiAJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCiAJaWYgKGRpciAmJiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSkgewpAQCAtMzY3MywyNiArNDA3MSwzNSBAQAogCQkgICBzdHJ1Y3QgaW5vZGUgKnBhcmVudF9pbm9kZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLCBpbnQgYWRkX2JhY2tyZWYsIHU2NCBpbmRleCkKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShwYXJlbnRfaW5vZGUpLT5yb290OwogCi0Ja2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOwotCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19JTk9ERV9JVEVNX0tFWSk7Ci0Ja2V5Lm9mZnNldCA9IDA7CisJaWYgKHVubGlrZWx5KGlub2RlLT5pX2lubyA9PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSkgeworCQltZW1jcHkoJmtleSwgJkJUUkZTX0koaW5vZGUpLT5yb290LT5yb290X2tleSwgc2l6ZW9mKGtleSkpOworCX0gZWxzZSB7CisJCWtleS5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwkJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0lOT0RFX0lURU1fS0VZKTsKKwkJa2V5Lm9mZnNldCA9IDA7CisJfQogCi0JcmV0ID0gYnRyZnNfaW5zZXJ0X2Rpcl9pdGVtKHRyYW5zLCByb290LCBuYW1lLCBuYW1lX2xlbiwKLQkJCQkgICAgcGFyZW50X2lub2RlLT5pX2lubywKLQkJCQkgICAgJmtleSwgYnRyZnNfaW5vZGVfdHlwZShpbm9kZSksCi0JCQkJICAgIGluZGV4KTsKKwlpZiAodW5saWtlbHkoaW5vZGUtPmlfaW5vID09IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpKSB7CisJCXJldCA9IGJ0cmZzX2FkZF9yb290X3JlZih0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LAorCQkJCQkga2V5Lm9iamVjdGlkLCByb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJCQkJIHBhcmVudF9pbm9kZS0+aV9pbm8sCisJCQkJCSBpbmRleCwgbmFtZSwgbmFtZV9sZW4pOworCX0gZWxzZSBpZiAoYWRkX2JhY2tyZWYpIHsKKwkJcmV0ID0gYnRyZnNfaW5zZXJ0X2lub2RlX3JlZih0cmFucywgcm9vdCwKKwkJCQkJICAgICBuYW1lLCBuYW1lX2xlbiwgaW5vZGUtPmlfaW5vLAorCQkJCQkgICAgIHBhcmVudF9pbm9kZS0+aV9pbm8sIGluZGV4KTsKKwl9CisKIAlpZiAocmV0ID09IDApIHsKLQkJaWYgKGFkZF9iYWNrcmVmKSB7Ci0JCQlyZXQgPSBidHJmc19pbnNlcnRfaW5vZGVfcmVmKHRyYW5zLCByb290LAotCQkJCQkJICAgICBuYW1lLCBuYW1lX2xlbiwKLQkJCQkJCSAgICAgaW5vZGUtPmlfaW5vLAotCQkJCQkJICAgICBwYXJlbnRfaW5vZGUtPmlfaW5vLAotCQkJCQkJICAgICBpbmRleCk7Ci0JCX0KKwkJcmV0ID0gYnRyZnNfaW5zZXJ0X2Rpcl9pdGVtKHRyYW5zLCByb290LCBuYW1lLCBuYW1lX2xlbiwKKwkJCQkJICAgIHBhcmVudF9pbm9kZS0+aV9pbm8sICZrZXksCisJCQkJCSAgICBidHJmc19pbm9kZV90eXBlKGlub2RlKSwgaW5kZXgpOworCQlCVUdfT04ocmV0KTsKKwogCQlidHJmc19pX3NpemVfd3JpdGUocGFyZW50X2lub2RlLCBwYXJlbnRfaW5vZGUtPmlfc2l6ZSArCiAJCQkJICAgbmFtZV9sZW4gKiAyKTsKIAkJcGFyZW50X2lub2RlLT5pX210aW1lID0gcGFyZW50X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwpAQCAtMzczMiwxMSArNDEzOSwxOCBAQAogCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSBidHJmc19jaGVja19tZXRhZGF0YV9mcmVlX3NwYWNlKHJvb3QpOworCS8qCisJICogMiBmb3IgaW5vZGUgaXRlbSBhbmQgcmVmCisJICogMiBmb3IgZGlyIGl0ZW1zCisJICogMSBmb3IgeGF0dHIgaWYgc2VsaW51eCBpcyBvbgorCSAqLworCWVyciA9IGJ0cmZzX3Jlc2VydmVfbWV0YWRhdGFfc3BhY2Uocm9vdCwgNSk7CiAJaWYgKGVycikKLQkJZ290byBmYWlsOworCQlyZXR1cm4gZXJyOwogCiAJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlpZiAoIXRyYW5zKQorCQlnb3RvIGZhaWw7CiAJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOwogCiAJZXJyID0gYnRyZnNfZmluZF9mcmVlX29iamVjdGlkKHRyYW5zLCByb290LCBkaXItPmlfaW5vLCAmb2JqZWN0aWQpOwpAQCAtMzc3NCw2ICs0MTg4LDcgQEAKIAluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKIAlidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOwogZmFpbDoKKwlidHJmc191bnJlc2VydmVfbWV0YWRhdGFfc3BhY2Uocm9vdCwgNSk7CiAJaWYgKGRyb3BfaW5vZGUpIHsKIAkJaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKQEAgLTM3OTQsMTAgKzQyMDksMTggQEAKIAl1NjQgb2JqZWN0aWQ7CiAJdTY0IGluZGV4ID0gMDsKIAotCWVyciA9IGJ0cmZzX2NoZWNrX21ldGFkYXRhX2ZyZWVfc3BhY2Uocm9vdCk7CisJLyoKKwkgKiAyIGZvciBpbm9kZSBpdGVtIGFuZCByZWYKKwkgKiAyIGZvciBkaXIgaXRlbXMKKwkgKiAxIGZvciB4YXR0ciBpZiBzZWxpbnV4IGlzIG9uCisJICovCisJZXJyID0gYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA1KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCXJldHVybiBlcnI7CisKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCWlmICghdHJhbnMpCisJCWdvdG8gZmFpbDsKIAlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CiAKIAllcnIgPSBidHJmc19maW5kX2ZyZWVfb2JqZWN0aWQodHJhbnMsIHJvb3QsIGRpci0+aV9pbm8sICZvYmplY3RpZCk7CkBAIC0zODM4LDYgKzQyNjEsNyBAQAogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CiBmYWlsOgorCWJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA1KTsKIAlpZiAoZHJvcF9pbm9kZSkgewogCQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwpAQCAtMzg2MCwxMCArNDI4NCwxNiBAQAogCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWJ0cmZzX2luY19ubGluayhpbm9kZSk7Ci0JZXJyID0gYnRyZnNfY2hlY2tfbWV0YWRhdGFfZnJlZV9zcGFjZShyb290KTsKKwkvKgorCSAqIDEgaXRlbSBmb3IgaW5vZGUgcmVmCisJICogMiBpdGVtcyBmb3IgZGlyIGl0ZW1zCisJICovCisJZXJyID0gYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCAzKTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCXJldHVybiBlcnI7CisKKwlidHJmc19pbmNfbmxpbmsoaW5vZGUpOworCiAJZXJyID0gYnRyZnNfc2V0X2lub2RlX2luZGV4KGRpciwgJmluZGV4KTsKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWw7CkBAIC0zODc1LDIwICs0MzA1LDE5IEBACiAKIAllcnIgPSBidHJmc19hZGRfbm9uZGlyKHRyYW5zLCBkZW50cnksIGlub2RlLCAxLCBpbmRleCk7CiAKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKIAkJZHJvcF9pbm9kZSA9IDE7Ci0KLQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7Ci0JZXJyID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7Ci0KLQlpZiAoZXJyKQotCQlkcm9wX2lub2RlID0gMTsKKwl9IGVsc2UgeworCQlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CisJCWVyciA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCQlCVUdfT04oZXJyKTsKKwkJYnRyZnNfbG9nX25ld19uYW1lKHRyYW5zLCBpbm9kZSwgTlVMTCwgZGVudHJ5LT5kX3BhcmVudCk7CisJfQogCiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7Ci0KLQlidHJmc19sb2dfbmV3X25hbWUodHJhbnMsIGlub2RlLCBOVUxMLCBkZW50cnktPmRfcGFyZW50KTsKIAlidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOwogZmFpbDoKKwlidHJmc191bnJlc2VydmVfbWV0YWRhdGFfc3BhY2Uocm9vdCwgMyk7CiAJaWYgKGRyb3BfaW5vZGUpIHsKIAkJaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKQEAgLTM5MDgsMTcgKzQzMzcsMjEgQEAKIAl1NjQgaW5kZXggPSAwOwogCXVuc2lnbmVkIGxvbmcgbnIgPSAxOwogCi0JZXJyID0gYnRyZnNfY2hlY2tfbWV0YWRhdGFfZnJlZV9zcGFjZShyb290KTsKKwkvKgorCSAqIDIgaXRlbXMgZm9yIGlub2RlIGFuZCByZWYKKwkgKiAyIGl0ZW1zIGZvciBkaXIgaXRlbXMKKwkgKiAxIGZvciB4YXR0ciBpZiBzZWxpbnV4IGlzIG9uCisJICovCisJZXJyID0gYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA1KTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF91bmxvY2s7CisJCXJldHVybiBlcnI7CiAKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOwotCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKLQotCWlmIChJU19FUlIodHJhbnMpKSB7Ci0JCWVyciA9IFBUUl9FUlIodHJhbnMpOworCWlmICghdHJhbnMpIHsKKwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CiAKIAllcnIgPSBidHJmc19maW5kX2ZyZWVfb2JqZWN0aWQodHJhbnMsIHJvb3QsIGRpci0+aV9pbm8sICZvYmplY3RpZCk7CiAJaWYgKGVycikgewpAQCAtMzk2Nyw2ICs0NDAwLDcgQEAKIAlidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOwogCiBvdXRfdW5sb2NrOgorCWJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA1KTsKIAlpZiAoZHJvcF9vbl9lcnIpCiAJCWlwdXQoaW5vZGUpOwogCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocm9vdCwgbnIpOwpAQCAtNDA2NCwxMSArNDQ5OCwxMSBAQAogCWludCBjb21wcmVzc2VkOwogCiBhZ2FpbjoKLQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCXJlYWRfbG9jaygmZW1fdHJlZS0+bG9jayk7CiAJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgc3RhcnQsIGxlbik7CiAJaWYgKGVtKQogCQllbS0+YmRldiA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OwotCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwlyZWFkX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAKIAlpZiAoZW0pIHsKIAkJaWYgKGVtLT5zdGFydCA+IHN0YXJ0IHx8IGVtLT5zdGFydCArIGVtLT5sZW4gPD0gc3RhcnQpCkBAIC00MjE1LDYgKzQ2NDksMTEgQEAKIAkJCQltYXAgPSBrbWFwKHBhZ2UpOwogCQkJCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBtYXAgKyBwZ19vZmZzZXQsIHB0ciwKIAkJCQkJCSAgIGNvcHlfc2l6ZSk7CisJCQkJaWYgKHBnX29mZnNldCArIGNvcHlfc2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJCQltZW1zZXQobWFwICsgcGdfb2Zmc2V0ICsgY29weV9zaXplLCAwLAorCQkJCQkgICAgICAgUEFHRV9DQUNIRV9TSVpFIC0gcGdfb2Zmc2V0IC0KKwkJCQkJICAgICAgIGNvcHlfc2l6ZSk7CisJCQkJfQogCQkJCWt1bm1hcChwYWdlKTsKIAkJCX0KIAkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwpAQCAtNDI1OSw3ICs0Njk4LDcgQEAKIAl9CiAKIAllcnIgPSAwOwotCXNwaW5fbG9jaygmZW1fdHJlZS0+bG9jayk7CisJd3JpdGVfbG9jaygmZW1fdHJlZS0+bG9jayk7CiAJcmV0ID0gYWRkX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGVtKTsKIAkvKiBpdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWVvbmUgaW5zZXJ0ZWQgdGhlIGV4dGVudCBpbnRvIHRoZSB0cmVlCiAJICogd2hpbGUgd2UgaGFkIHRoZSBsb2NrIGRyb3BwZWQuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQKQEAgLTQyOTksNyArNDczOCw3IEBACiAJCQllcnIgPSAwOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwl3cml0ZV91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogb3V0OgogCWlmIChwYXRoKQogCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CkBAIC00Mzk4LDEzICs0ODM3LDIxIEBACiAJdTY0IHBhZ2Vfc3RhcnQgPSBwYWdlX29mZnNldChwYWdlKTsKIAl1NjQgcGFnZV9lbmQgPSBwYWdlX3N0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKIAorCisJLyoKKwkgKiB3ZSBoYXZlIHRoZSBwYWdlIGxvY2tlZCwgc28gbmV3IHdyaXRlYmFjayBjYW4ndCBzdGFydCwKKwkgKiBhbmQgdGhlIGRpcnR5IGJpdCB3b24ndCBiZSBjbGVhcmVkIHdoaWxlIHdlIGFyZSBoZXJlLgorCSAqCisJICogV2FpdCBmb3IgSU8gb24gdGhpcyBwYWdlIHNvIHRoYXQgd2UgY2FuIHNhZmVseSBjbGVhcgorCSAqIHRoZSBQYWdlUHJpdmF0ZTIgYml0IGFuZCBkbyBvcmRlcmVkIGFjY291bnRpbmcKKwkgKi8KIAl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCiAJdHJlZSA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5pb190cmVlOwogCWlmIChvZmZzZXQpIHsKIAkJYnRyZnNfcmVsZWFzZXBhZ2UocGFnZSwgR0ZQX05PRlMpOwogCQlyZXR1cm47CiAJfQotCiAJbG9ja19leHRlbnQodHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKIAlvcmRlcmVkID0gYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KHBhZ2UtPm1hcHBpbmctPmhvc3QsCiAJCQkJCSAgIHBhZ2Vfb2Zmc2V0KHBhZ2UpKTsKQEAgLTQ0MTUsMTYgKzQ4NjIsMjIgQEAKIAkJICovCiAJCWNsZWFyX2V4dGVudF9iaXQodHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsCiAJCQkJIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8Ci0JCQkJIEVYVEVOVF9MT0NLRUQsIDEsIDAsIEdGUF9OT0ZTKTsKLQkJYnRyZnNfZmluaXNoX29yZGVyZWRfaW8ocGFnZS0+bWFwcGluZy0+aG9zdCwKLQkJCQkJcGFnZV9zdGFydCwgcGFnZV9lbmQpOworCQkJCSBFWFRFTlRfTE9DS0VEIHwgRVhURU5UX0RPX0FDQ09VTlRJTkcsIDEsIDAsCisJCQkJIE5VTEwsIEdGUF9OT0ZTKTsKKwkJLyoKKwkJICogd2hvZXZlciBjbGVhcmVkIHRoZSBwcml2YXRlIGJpdCBpcyByZXNwb25zaWJsZQorCQkgKiBmb3IgdGhlIGZpbmlzaF9vcmRlcmVkX2lvCisJCSAqLworCQlpZiAoVGVzdENsZWFyUGFnZVByaXZhdGUyKHBhZ2UpKSB7CisJCQlidHJmc19maW5pc2hfb3JkZXJlZF9pbyhwYWdlLT5tYXBwaW5nLT5ob3N0LAorCQkJCQkJcGFnZV9zdGFydCwgcGFnZV9lbmQpOworCQl9CiAJCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKIAkJbG9ja19leHRlbnQodHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKIAl9CiAJY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwKIAkJIEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MgfAotCQkgRVhURU5UX09SREVSRUQsCi0JCSAxLCAxLCBHRlBfTk9GUyk7CisJCSBFWFRFTlRfRE9fQUNDT1VOVElORywgMSwgMSwgTlVMTCwgR0ZQX05PRlMpOwogCV9fYnRyZnNfcmVsZWFzZXBhZ2UocGFnZSwgR0ZQX05PRlMpOwogCiAJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKQEAgLTQ0NzMsNiArNDkyNiwxMyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlyZXQgPSBidHJmc19yZXNlcnZlX21ldGFkYXRhX2Zvcl9kZWxhbGxvYyhyb290LCBpbm9kZSwgMSk7CisJaWYgKHJldCkgeworCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2Uocm9vdCwgaW5vZGUsIFBBR0VfQ0FDSEVfU0laRSk7CisJCXJldCA9IFZNX0ZBVUxUX1NJR0JVUzsKKwkJZ290byBvdXQ7CisJfQorCiAJcmV0ID0gVk1fRkFVTFRfTk9QQUdFOyAvKiBtYWtlIHRoZSBWTSByZXRyeSB0aGUgZmF1bHQgKi8KIGFnYWluOgogCWxvY2tfcGFnZShwYWdlKTsKQEAgLTQ1MDQsNyArNDk2NCwyNCBAQAogCQlnb3RvIGFnYWluOwogCX0KIAotCWJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kKTsKKwkvKgorCSAqIFhYWCAtIHBhZ2VfbWt3cml0ZSBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBwYWdlIGlzIGRpcnRpZWQsIGV2ZW4KKwkgKiBpZiBpdCB3YXMgYWxyZWFkeSBkaXJ0eSwgc28gZm9yIHNwYWNlIGFjY291bnRpbmcgcmVhc29ucyB3ZSBuZWVkIHRvCisJICogY2xlYXIgYW55IGRlbGFsbG9jIGJpdHMgZm9yIHRoZSByYW5nZSB3ZSBhcmUgZml4aW5nIHRvIHNhdmUuICBUaGVyZQorCSAqIGlzIHByb2JhYmx5IGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCBidXQgZm9yIG5vdyBrZWVwIGNvbnNpc3RlbnQgd2l0aAorCSAqIHByZXBhcmVfcGFnZXMgaW4gdGhlIG5vcm1hbCB3cml0ZSBwYXRoLgorCSAqLworCWNsZWFyX2V4dGVudF9iaXRzKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsCisJCQkgIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8IEVYVEVOVF9ET19BQ0NPVU5USU5HLAorCQkJICBHRlBfTk9GUyk7CisKKwlyZXQgPSBidHJmc19zZXRfZXh0ZW50X2RlbGFsbG9jKGlub2RlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCk7CisJaWYgKHJldCkgeworCQl1bmxvY2tfZXh0ZW50KGlvX3RyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CisJCXJldCA9IFZNX0ZBVUxUX1NJR0JVUzsKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKHJvb3QsIGlub2RlLCBQQUdFX0NBQ0hFX1NJWkUpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQogCXJldCA9IDA7CiAKIAkvKiBwYWdlIGlzIHdob2xseSBvciBwYXJ0aWFsbHkgaW5zaWRlIEVPRiAqLwpAQCAtNDUyMSwxMSArNDk5OCwxNyBAQAogCX0KIAlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwogCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAotCUJUUkZTX0koaW5vZGUpLT5sYXN0X3RyYW5zID0gcm9vdC0+ZnNfaW5mby0+Z2VuZXJhdGlvbiArIDE7CisJQlRSRlNfSShpbm9kZSktPmxhc3RfdHJhbnMgPSByb290LT5mc19pbmZvLT5nZW5lcmF0aW9uOworCUJUUkZTX0koaW5vZGUpLT5sYXN0X3N1Yl90cmFucyA9IEJUUkZTX0koaW5vZGUpLT5yb290LT5sb2dfdHJhbnNpZDsKKwogCXVubG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKIAogb3V0X3VubG9jazoKKwlidHJmc191bnJlc2VydmVfbWV0YWRhdGFfZm9yX2RlbGFsbG9jKHJvb3QsIGlub2RlLCAxKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIFZNX0ZBVUxUX0xPQ0tFRDsKIAl1bmxvY2tfcGFnZShwYWdlKTsKIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtNDU0NCw3ICs1MDI3LDkgQEAKIAlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQogCQlyZXR1cm47CiAKLQlidHJmc190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOworCXJldCA9IGJ0cmZzX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuOwogCWJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShpbm9kZSwgaW5vZGUtPmlfc2l6ZSAmICh+bWFzayksICh1NjQpLTEpOwogCiAJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKQEAgLTQ1OTQsMTEgKzUwNzksMTEgQEAKICAqIGNyZWF0ZSBhIG5ldyBzdWJ2b2x1bWUgZGlyZWN0b3J5L2lub2RlIChoZWxwZXIgZm9yIHRoZSBpb2N0bCkuCiAgKi8KIGludCBidHJmc19jcmVhdGVfc3Vidm9sX3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpuZXdfcm9vdCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqbmV3X3Jvb3QsCiAJCQkgICAgIHU2NCBuZXdfZGlyaWQsIHU2NCBhbGxvY19oaW50KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0JaW50IGVycm9yOworCWludCBlcnI7CiAJdTY0IGluZGV4ID0gMDsKIAogCWlub2RlID0gYnRyZnNfbmV3X2lub2RlKHRyYW5zLCBuZXdfcm9vdCwgTlVMTCwgIi4uIiwgMiwgbmV3X2RpcmlkLApAQCAtNDYxMSwxMSArNTA5NiwxMCBAQAogCWlub2RlLT5pX25saW5rID0gMTsKIAlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIDApOwogCi0JZXJyb3IgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIG5ld19yb290LCBpbm9kZSk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7CisJZXJyID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCBuZXdfcm9vdCwgaW5vZGUpOworCUJVR19PTihlcnIpOwogCi0JZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlpcHV0KGlub2RlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDY0MCw3ICs1MTI0LDExIEBACiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJZWktPmxhc3RfdHJhbnMgPSAwOworCWVpLT5sYXN0X3N1Yl90cmFucyA9IDA7CiAJZWktPmxvZ2dlZF90cmFucyA9IDA7CisJZWktPm91dHN0YW5kaW5nX2V4dGVudHMgPSAwOworCWVpLT5yZXNlcnZlZF9leHRlbnRzID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmZWktPmFjY291bnRpbmdfbG9jayk7CiAJYnRyZnNfb3JkZXJlZF9pbm9kZV90cmVlX2luaXQoJmVpLT5vcmRlcmVkX3RyZWUpOwogCUlOSVRfTElTVF9IRUFEKCZlaS0+aV9vcnBoYW4pOwogCUlOSVRfTElTVF9IRUFEKCZlaS0+b3JkZXJlZF9vcGVyYXRpb25zKTsKQEAgLTQ2OTMsNiArNTE4MSwxNiBAQAogCWttZW1fY2FjaGVfZnJlZShidHJmc19pbm9kZV9jYWNoZXAsIEJUUkZTX0koaW5vZGUpKTsKIH0KIAordm9pZCBidHJmc19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKworCWlmIChpbm9kZS0+aV9ubGluayA+IDAgJiYgYnRyZnNfcm9vdF9yZWZzKCZyb290LT5yb290X2l0ZW0pID09IDApCisJCWdlbmVyaWNfZGVsZXRlX2lub2RlKGlub2RlKTsKKwllbHNlCisJCWdlbmVyaWNfZHJvcF9pbm9kZShpbm9kZSk7Cit9CisKIHN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28pCiB7CiAJc3RydWN0IGJ0cmZzX2lub2RlICplaSA9IChzdHJ1Y3QgYnRyZnNfaW5vZGUgKikgZm9vOwpAQCAtNDc2MSwzMSArNTI1OSwzNyBAQAogewogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOwogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShvbGRfZGlyKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGVzdCA9IEJUUkZTX0kobmV3X2RpciktPnJvb3Q7CiAJc3RydWN0IGlub2RlICpuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgdGltZXNwZWMgY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJdTY0IGluZGV4ID0gMDsKKwl1NjQgcm9vdF9vYmplY3RpZDsKIAlpbnQgcmV0OwogCi0JLyogd2UncmUgbm90IGFsbG93ZWQgdG8gcmVuYW1lIGJldHdlZW4gc3Vidm9sdW1lcyAqLwotCWlmIChCVFJGU19JKG9sZF9pbm9kZSktPnJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkICE9Ci0JICAgIEJUUkZTX0kobmV3X2RpciktPnJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkKQorCWlmIChuZXdfZGlyLT5pX2lubyA9PSBCVFJGU19FTVBUWV9TVUJWT0xfRElSX09CSkVDVElEKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyogd2Ugb25seSBhbGxvdyByZW5hbWUgc3Vidm9sdW1lIGxpbmsgYmV0d2VlbiBzdWJ2b2x1bWVzICovCisJaWYgKG9sZF9pbm9kZS0+aV9pbm8gIT0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCAmJiByb290ICE9IGRlc3QpCiAJCXJldHVybiAtRVhERVY7CiAKKwlpZiAob2xkX2lub2RlLT5pX2lubyA9PSBCVFJGU19FTVBUWV9TVUJWT0xfRElSX09CSkVDVElEIHx8CisJICAgIChuZXdfaW5vZGUgJiYgbmV3X2lub2RlLT5pX2lubyA9PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSkKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisKIAlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkgJiYgbmV3X2lub2RlICYmCi0JICAgIG5ld19pbm9kZS0+aV9zaXplID4gQlRSRlNfRU1QVFlfRElSX1NJWkUpIHsKKwkgICAgbmV3X2lub2RlLT5pX3NpemUgPiBCVFJGU19FTVBUWV9ESVJfU0laRSkKIAkJcmV0dXJuIC1FTk9URU1QVFk7Ci0JfQogCi0JLyogdG8gcmVuYW1lIGEgc25hcHNob3Qgb3Igc3Vidm9sdW1lLCB3ZSBuZWVkIHRvIGp1Z2dsZSB0aGUKLQkgKiBiYWNrcmVmcy4gIFRoaXMgaXNuJ3QgY29kZWQgeWV0CisJLyoKKwkgKiAyIGl0ZW1zIGZvciBkaXIgaXRlbXMKKwkgKiAxIGl0ZW0gZm9yIG9ycGhhbiBlbnRyeQorCSAqIDEgaXRlbSBmb3IgcmVmCiAJICovCi0JaWYgKG9sZF9pbm9kZS0+aV9pbm8gPT0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCkKLQkJcmV0dXJuIC1FWERFVjsKLQotCXJldCA9IGJ0cmZzX2NoZWNrX21ldGFkYXRhX2ZyZWVfc3BhY2Uocm9vdCk7CisJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA0KTsKIAlpZiAocmV0KQotCQlnb3RvIG91dF91bmxvY2s7CisJCXJldHVybiByZXQ7CiAKIAkvKgogCSAqIHdlJ3JlIHVzaW5nIHJlbmFtZSB0byByZXBsYWNlIG9uZSBmaWxlIHdpdGggYW5vdGhlci4KQEAgLTQ3OTYsOCArNTMwMCw0MCBAQAogCSAgICBvbGRfaW5vZGUtPmlfc2l6ZSA+IEJUUkZTX09SREVSRURfT1BFUkFUSU9OU19GTFVTSF9MSU1JVCkKIAkJZmlsZW1hcF9mbHVzaChvbGRfaW5vZGUtPmlfbWFwcGluZyk7CiAKLQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCS8qIGNsb3NlIHRoZSByYWN5IHdpbmRvdyB3aXRoIHNuYXBzaG90IGNyZWF0ZS9kZXN0cm95IGlvY3RsICovCisJaWYgKG9sZF9pbm9kZS0+aV9pbm8gPT0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCkKKwkJZG93bl9yZWFkKCZyb290LT5mc19pbmZvLT5zdWJ2b2xfc2VtKTsKIAorCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBuZXdfZGlyKTsKKworCWlmIChkZXN0ICE9IHJvb3QpCisJCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCBkZXN0KTsKKworCXJldCA9IGJ0cmZzX3NldF9pbm9kZV9pbmRleChuZXdfZGlyLCAmaW5kZXgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwlpZiAodW5saWtlbHkob2xkX2lub2RlLT5pX2lubyA9PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSkgeworCQkvKiBmb3JjZSBmdWxsIGxvZyBjb21taXQgaWYgc3Vidm9sdW1lIGludm9sdmVkLiAqLworCQlyb290LT5mc19pbmZvLT5sYXN0X3RyYW5zX2xvZ19mdWxsX2NvbW1pdCA9IHRyYW5zLT50cmFuc2lkOworCX0gZWxzZSB7CisJCXJldCA9IGJ0cmZzX2luc2VydF9pbm9kZV9yZWYodHJhbnMsIGRlc3QsCisJCQkJCSAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCSAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQkJICAgICBvbGRfaW5vZGUtPmlfaW5vLAorCQkJCQkgICAgIG5ld19kaXItPmlfaW5vLCBpbmRleCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9mYWlsOworCQkvKgorCQkgKiB0aGlzIGlzIGFuIHVnbHkgbGl0dGxlIHJhY2UsIGJ1dCB0aGUgcmVuYW1lIGlzIHJlcXVpcmVkCisJCSAqIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIHdlIGNyYXNoLCB0aGUgaW5vZGUgaXMgZWl0aGVyIGF0IHRoZQorCQkgKiBvbGQgbmFtZSBvciB0aGUgbmV3IG9uZS4gIHBpbm5pbmcgdGhlIGxvZyB0cmFuc2FjdGlvbiBsZXRzCisJCSAqIHVzIG1ha2Ugc3VyZSB3ZSBkb24ndCBhbGxvdyBhIGxvZyBjb21taXQgdG8gY29tZSBpbiBhZnRlcgorCQkgKiB3ZSB1bmxpbmsgdGhlIG5hbWUgYnV0IGJlZm9yZSB3ZSBhZGQgdGhlIG5ldyBuYW1lIGJhY2sgaW4uCisJCSAqLworCQlidHJmc19waW5fbG9nX3RyYW5zKHJvb3QpOworCX0KIAkvKgogCSAqIG1ha2Ugc3VyZSB0aGUgaW5vZGUgZ2V0cyBmbHVzaGVkIGlmIGl0IGlzIHJlcGxhY2luZwogCSAqIHNvbWV0aGluZy4KQEAgLTQ4MDcsMTggKzUzNDMsNiBAQAogCQlidHJmc19hZGRfb3JkZXJlZF9vcGVyYXRpb24odHJhbnMsIHJvb3QsIG9sZF9pbm9kZSk7CiAJfQogCi0JLyoKLQkgKiB0aGlzIGlzIGFuIHVnbHkgbGl0dGxlIHJhY2UsIGJ1dCB0aGUgcmVuYW1lIGlzIHJlcXVpcmVkIHRvIG1ha2UKLQkgKiBzdXJlIHRoYXQgaWYgd2UgY3Jhc2gsIHRoZSBpbm9kZSBpcyBlaXRoZXIgYXQgdGhlIG9sZCBuYW1lCi0JICogb3IgdGhlIG5ldyBvbmUuICBwaW5uaW5nIHRoZSBsb2cgdHJhbnNhY3Rpb24gbGV0cyB1cyBtYWtlIHN1cmUKLQkgKiB3ZSBkb24ndCBhbGxvdyBhIGxvZyBjb21taXQgdG8gY29tZSBpbiBhZnRlciB3ZSB1bmxpbmsgdGhlCi0JICogbmFtZSBidXQgYmVmb3JlIHdlIGFkZCB0aGUgbmV3IG5hbWUgYmFjayBpbi4KLQkgKi8KLQlidHJmc19waW5fbG9nX3RyYW5zKHJvb3QpOwotCi0JYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBuZXdfZGlyKTsKLQotCWJ0cmZzX2luY19ubGluayhvbGRfZGVudHJ5LT5kX2lub2RlKTsKIAlvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IGN0aW1lOwogCW5ld19kaXItPmlfY3RpbWUgPSBuZXdfZGlyLT5pX210aW1lID0gY3RpbWU7CiAJb2xkX2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CkBAIC00ODI2LDQ3ICs1MzUwLDYwIEBACiAJaWYgKG9sZF9kZW50cnktPmRfcGFyZW50ICE9IG5ld19kZW50cnktPmRfcGFyZW50KQogCQlidHJmc19yZWNvcmRfdW5saW5rX2Rpcih0cmFucywgb2xkX2Rpciwgb2xkX2lub2RlLCAxKTsKIAotCXJldCA9IGJ0cmZzX3VubGlua19pbm9kZSh0cmFucywgcm9vdCwgb2xkX2Rpciwgb2xkX2RlbnRyeS0+ZF9pbm9kZSwKLQkJCQkgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCQkJIG9sZF9kZW50cnktPmRfbmFtZS5sZW4pOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2ZhaWw7CisJaWYgKHVubGlrZWx5KG9sZF9pbm9kZS0+aV9pbm8gPT0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCkpIHsKKwkJcm9vdF9vYmplY3RpZCA9IEJUUkZTX0kob2xkX2lub2RlKS0+cm9vdC0+cm9vdF9rZXkub2JqZWN0aWQ7CisJCXJldCA9IGJ0cmZzX3VubGlua19zdWJ2b2wodHJhbnMsIHJvb3QsIG9sZF9kaXIsIHJvb3Rfb2JqZWN0aWQsCisJCQkJCW9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCQlvbGRfZGVudHJ5LT5kX25hbWUubGVuKTsKKwl9IGVsc2UgeworCQlidHJmc19pbmNfbmxpbmsob2xkX2RlbnRyeS0+ZF9pbm9kZSk7CisJCXJldCA9IGJ0cmZzX3VubGlua19pbm9kZSh0cmFucywgcm9vdCwgb2xkX2RpciwKKwkJCQkJIG9sZF9kZW50cnktPmRfaW5vZGUsCisJCQkJCSBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkJIG9sZF9kZW50cnktPmRfbmFtZS5sZW4pOworCX0KKwlCVUdfT04ocmV0KTsKIAogCWlmIChuZXdfaW5vZGUpIHsKIAkJbmV3X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCQlyZXQgPSBidHJmc191bmxpbmtfaW5vZGUodHJhbnMsIHJvb3QsIG5ld19kaXIsCi0JCQkJCSBuZXdfZGVudHJ5LT5kX2lub2RlLAotCQkJCQkgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCQkJCSBuZXdfZGVudHJ5LT5kX25hbWUubGVuKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2ZhaWw7CisJCWlmICh1bmxpa2VseShuZXdfaW5vZGUtPmlfaW5vID09CisJCQkgICAgIEJUUkZTX0VNUFRZX1NVQlZPTF9ESVJfT0JKRUNUSUQpKSB7CisJCQlyb290X29iamVjdGlkID0gQlRSRlNfSShuZXdfaW5vZGUpLT5sb2NhdGlvbi5vYmplY3RpZDsKKwkJCXJldCA9IGJ0cmZzX3VubGlua19zdWJ2b2wodHJhbnMsIGRlc3QsIG5ld19kaXIsCisJCQkJCQlyb290X29iamVjdGlkLAorCQkJCQkJbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCQluZXdfZGVudHJ5LT5kX25hbWUubGVuKTsKKwkJCUJVR19PTihuZXdfaW5vZGUtPmlfbmxpbmsgPT0gMCk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBidHJmc191bmxpbmtfaW5vZGUodHJhbnMsIGRlc3QsIG5ld19kaXIsCisJCQkJCQkgbmV3X2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJCSBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkJCSBuZXdfZGVudHJ5LT5kX25hbWUubGVuKTsKKwkJfQorCQlCVUdfT04ocmV0KTsKIAkJaWYgKG5ld19pbm9kZS0+aV9ubGluayA9PSAwKSB7CiAJCQlyZXQgPSBidHJmc19vcnBoYW5fYWRkKHRyYW5zLCBuZXdfZGVudHJ5LT5kX2lub2RlKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXRfZmFpbDsKKwkJCUJVR19PTihyZXQpOwogCQl9Ci0KIAl9Ci0JcmV0ID0gYnRyZnNfc2V0X2lub2RlX2luZGV4KG5ld19kaXIsICZpbmRleCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfZmFpbDsKIAotCXJldCA9IGJ0cmZzX2FkZF9saW5rKHRyYW5zLCBuZXdfZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSwKLQkJCSAgICAgb2xkX2lub2RlLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCSAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwgMSwgaW5kZXgpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2ZhaWw7CisJcmV0ID0gYnRyZnNfYWRkX2xpbmsodHJhbnMsIG5ld19kaXIsIG9sZF9pbm9kZSwKKwkJCSAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgIG5ld19kZW50cnktPmRfbmFtZS5sZW4sIDAsIGluZGV4KTsKKwlCVUdfT04ocmV0KTsKIAotCWJ0cmZzX2xvZ19uZXdfbmFtZSh0cmFucywgb2xkX2lub2RlLCBvbGRfZGlyLAotCQkJCSAgICAgICBuZXdfZGVudHJ5LT5kX3BhcmVudCk7CisJaWYgKG9sZF9pbm9kZS0+aV9pbm8gIT0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCkgeworCQlidHJmc19sb2dfbmV3X25hbWUodHJhbnMsIG9sZF9pbm9kZSwgb2xkX2RpciwKKwkJCQkgICBuZXdfZGVudHJ5LT5kX3BhcmVudCk7CisJCWJ0cmZzX2VuZF9sb2dfdHJhbnMocm9vdCk7CisJfQogb3V0X2ZhaWw6Ci0KLQkvKiB0aGlzIGJ0cmZzX2VuZF9sb2dfdHJhbnMganVzdCBhbGxvd3MgdGhlIGN1cnJlbnQKLQkgKiBsb2ctc3ViIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlCi0JICovCi0JYnRyZnNfZW5kX2xvZ190cmFucyhyb290KTsKIAlidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOwotb3V0X3VubG9jazoKKworCWlmIChvbGRfaW5vZGUtPmlfaW5vID09IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpCisJCXVwX3JlYWQoJnJvb3QtPmZzX2luZm8tPnN1YnZvbF9zZW0pOworCisJYnRyZnNfdW5yZXNlcnZlX21ldGFkYXRhX3NwYWNlKHJvb3QsIDQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ5MzgsMTEgKzU0NzUsMTggQEAKIAlpZiAobmFtZV9sZW4gPiBCVFJGU19NQVhfSU5MSU5FX0RBVEFfU0laRShyb290KSkKIAkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CiAKLQllcnIgPSBidHJmc19jaGVja19tZXRhZGF0YV9mcmVlX3NwYWNlKHJvb3QpOworCS8qCisJICogMiBpdGVtcyBmb3IgaW5vZGUgaXRlbSBhbmQgcmVmCisJICogMiBpdGVtcyBmb3IgZGlyIGl0ZW1zCisJICogMSBpdGVtIGZvciB4YXR0ciBpZiBzZWxpbnV4IGlzIG9uCisJICovCisJZXJyID0gYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA1KTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9mYWlsOworCQlyZXR1cm4gZXJyOwogCiAJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlpZiAoIXRyYW5zKQorCQlnb3RvIG91dF9mYWlsOwogCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKIAogCWVyciA9IGJ0cmZzX2ZpbmRfZnJlZV9vYmplY3RpZCh0cmFucywgcm9vdCwgZGlyLT5pX2lubywgJm9iamVjdGlkKTsKQEAgLTUwMjMsNiArNTU2Nyw3IEBACiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CiAJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHRyYW5zLCByb290KTsKIG91dF9mYWlsOgorCWJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA1KTsKIAlpZiAoZHJvcF9pbm9kZSkgewogCQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwpAQCAtNTA0NCw2ICs1NTg5LDExIEBACiAKIAl3aGlsZSAobnVtX2J5dGVzID4gMCkgewogCQlhbGxvY19zaXplID0gbWluKG51bV9ieXRlcywgcm9vdC0+ZnNfaW5mby0+bWF4X2V4dGVudCk7CisKKwkJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCiAJCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHRyYW5zLCByb290LCBhbGxvY19zaXplLAogCQkJCQkgICByb290LT5zZWN0b3JzaXplLCAwLCBhbGxvY19oaW50LAogCQkJCQkgICAodTY0KS0xLCAmaW5zLCAxKTsKQEAgLTUwNTgsOSArNTYwOCwxMiBAQAogCQkJCQkJICAwLCAwLCAwLAogCQkJCQkJICBCVFJGU19GSUxFX0VYVEVOVF9QUkVBTExPQyk7CiAJCUJVR19PTihyZXQpOworCQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgY3VyX29mZnNldCwKKwkJCQkJY3VyX29mZnNldCArIGlucy5vZmZzZXQgLTEsIDApOwogCQludW1fYnl0ZXMgLT0gaW5zLm9mZnNldDsKIAkJY3VyX29mZnNldCArPSBpbnMub2Zmc2V0OwogCQlhbGxvY19oaW50ID0gaW5zLm9iamVjdGlkICsgaW5zLm9mZnNldDsKKwkJYnRyZnNfdW5yZXNlcnZlX21ldGFkYXRhX3NwYWNlKHJvb3QsIDEpOwogCX0KIG91dDoKIAlpZiAoY3VyX29mZnNldCA+IHN0YXJ0KSB7CkBAIC01MjIzLDcgKzU3NzYsOCBAQAogCS5sb29rdXAJCT0gYnRyZnNfbG9va3VwLAogCS5wZXJtaXNzaW9uCT0gYnRyZnNfcGVybWlzc2lvbiwKIH07Ci1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidHJmc19kaXJfZmlsZV9vcGVyYXRpb25zID0geworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidHJmc19kaXJfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAogCS5yZWFkZGlyCT0gYnRyZnNfcmVhbF9yZWFkZGlyLApAQCAtNTI0NSw2ICs1Nzk5LDggQEAKIAkucmVhZHBhZ2VfaW9fZmFpbGVkX2hvb2sgPSBidHJmc19pb19mYWlsZWRfaG9vaywKIAkuc2V0X2JpdF9ob29rID0gYnRyZnNfc2V0X2JpdF9ob29rLAogCS5jbGVhcl9iaXRfaG9vayA9IGJ0cmZzX2NsZWFyX2JpdF9ob29rLAorCS5tZXJnZV9leHRlbnRfaG9vayA9IGJ0cmZzX21lcmdlX2V4dGVudF9ob29rLAorCS5zcGxpdF9leHRlbnRfaG9vayA9IGJ0cmZzX3NwbGl0X2V4dGVudF9ob29rLAogfTsKIAogLyoKQEAgLTUyNjksNiArNTgyNSw3IEBACiAJLmludmFsaWRhdGVwYWdlID0gYnRyZnNfaW52YWxpZGF0ZXBhZ2UsCiAJLnJlbGVhc2VwYWdlCT0gYnRyZnNfcmVsZWFzZXBhZ2UsCiAJLnNldF9wYWdlX2RpcnR5CT0gYnRyZnNfc2V0X3BhZ2VfZGlydHksCisJLmVycm9yX3JlbW92ZV9wYWdlID0gZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGJ0cmZzX3N5bWxpbmtfYW9wcyA9IHsKQEAgLTUzMDksMyArNTg2Niw3IEBACiAJLmxpc3R4YXR0cgk9IGJ0cmZzX2xpc3R4YXR0ciwKIAkucmVtb3ZleGF0dHIJPSBidHJmc19yZW1vdmV4YXR0ciwKIH07CisKK2NvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBidHJmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9kZWxldGUJPSBidHJmc19kZW50cnlfZGVsZXRlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lvY3RsLmMgYi9mcy9idHJmcy9pb2N0bC5jCmluZGV4IGJkODhmMjUuLmNkYmIwNTQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lvY3RsLmMKKysrIGIvZnMvYnRyZnMvaW9jdGwuYwpAQCAtMjMwLDggKzIzMCw4IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSByb290X2l0ZW07CiAJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290ID0gcm9vdDsKLQlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqbmV3X3Jvb3Q7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwogCWludCByZXQ7CiAJaW50IGVycjsKIAl1NjQgb2JqZWN0aWQ7CkBAIC0yMzksOSArMjM5LDE1IEBACiAJdTY0IGluZGV4ID0gMDsKIAl1bnNpZ25lZCBsb25nIG5yID0gMTsKIAotCXJldCA9IGJ0cmZzX2NoZWNrX21ldGFkYXRhX2ZyZWVfc3BhY2Uocm9vdCk7CisJLyoKKwkgKiAxIC0gaW5vZGUgaXRlbQorCSAqIDIgLSByZWZzCisJICogMSAtIHJvb3QgaXRlbQorCSAqIDIgLSBkaXIgaXRlbXMKKwkgKi8KKwlyZXQgPSBidHJmc19yZXNlcnZlX21ldGFkYXRhX3NwYWNlKHJvb3QsIDYpOwogCWlmIChyZXQpCi0JCWdvdG8gZmFpbF9jb21taXQ7CisJCXJldHVybiByZXQ7CiAKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOwogCUJVR19PTighdHJhbnMpOwpAQCAtMzA0LDExICszMTAsMTcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGZhaWw7CiAKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKwluZXdfcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKHJvb3QtPmZzX2luZm8sICZrZXkpOworCUJVR19PTihJU19FUlIobmV3X3Jvb3QpKTsKKworCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCBuZXdfcm9vdCk7CisKKwlyZXQgPSBidHJmc19jcmVhdGVfc3Vidm9sX3Jvb3QodHJhbnMsIG5ld19yb290LCBuZXdfZGlyaWQsCisJCQkJICAgICAgIEJUUkZTX0koZGlyKS0+YmxvY2tfZ3JvdXApOwogCS8qCiAJICogaW5zZXJ0IHRoZSBkaXJlY3RvcnkgaXRlbQogCSAqLwotCWtleS5vZmZzZXQgPSAodTY0KS0xOwotCWRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CiAJcmV0ID0gYnRyZnNfc2V0X2lub2RlX2luZGV4KGRpciwgJmluZGV4KTsKIAlCVUdfT04ocmV0KTsKIApAQCAtMzIyLDQzICszMzQsMjAgQEAKIAlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGRpcik7CiAJQlVHX09OKHJldCk7CiAKLQkvKiBhZGQgdGhlIGJhY2tyZWYgZmlyc3QgKi8KIAlyZXQgPSBidHJmc19hZGRfcm9vdF9yZWYodHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKLQkJCQkgb2JqZWN0aWQsIEJUUkZTX1JPT1RfQkFDS1JFRl9LRVksCi0JCQkJIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCSBvYmplY3RpZCwgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCiAJCQkJIGRpci0+aV9pbm8sIGluZGV4LCBuYW1lLCBuYW1lbGVuKTsKIAogCUJVR19PTihyZXQpOwogCi0JLyogbm93IGFkZCB0aGUgZm9yd2FyZCByZWYgKi8KLQlyZXQgPSBidHJmc19hZGRfcm9vdF9yZWYodHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKLQkJCQkgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsIEJUUkZTX1JPT1RfUkVGX0tFWSwKLQkJCQkgb2JqZWN0aWQsCi0JCQkJIGRpci0+aV9pbm8sIGluZGV4LCBuYW1lLCBuYW1lbGVuKTsKLQotCUJVR19PTihyZXQpOwotCi0JcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWxfY29tbWl0OwotCi0JbmV3X3Jvb3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShyb290LT5mc19pbmZvLCAma2V5KTsKLQlCVUdfT04oIW5ld19yb290KTsKLQotCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24obmV3X3Jvb3QsIDEpOwotCUJVR19PTighdHJhbnMpOwotCi0JcmV0ID0gYnRyZnNfY3JlYXRlX3N1YnZvbF9yb290KHRyYW5zLCBuZXdfcm9vdCwgZGVudHJ5LCBuZXdfZGlyaWQsCi0JCQkJICAgICAgIEJUUkZTX0koZGlyKS0+YmxvY2tfZ3JvdXApOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDsKLQorCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBidHJmc19sb29rdXBfZGVudHJ5KGRpciwgZGVudHJ5KSk7CiBmYWlsOgogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwotCWVyciA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgbmV3X3Jvb3QpOworCWVyciA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJaWYgKGVyciAmJiAhcmV0KQogCQlyZXQgPSBlcnI7Ci1mYWlsX2NvbW1pdDoKKworCWJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA2KTsKIAlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzc1LDE5ICszNjQsMjcgQEAKIAlpZiAoIXJvb3QtPnJlZl9jb3dzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IGJ0cmZzX2NoZWNrX21ldGFkYXRhX2ZyZWVfc3BhY2Uocm9vdCk7CisJLyoKKwkgKiAxIC0gaW5vZGUgaXRlbQorCSAqIDIgLSByZWZzCisJICogMSAtIHJvb3QgaXRlbQorCSAqIDIgLSBkaXIgaXRlbXMKKwkgKi8KKwlyZXQgPSBidHJmc19yZXNlcnZlX21ldGFkYXRhX3NwYWNlKHJvb3QsIDYpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbF91bmxvY2s7CiAKIAlwZW5kaW5nX3NuYXBzaG90ID0ga3phbGxvYyhzaXplb2YoKnBlbmRpbmdfc25hcHNob3QpLCBHRlBfTk9GUyk7CiAJaWYgKCFwZW5kaW5nX3NuYXBzaG90KSB7CiAJCXJldCA9IC1FTk9NRU07CisJCWJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA2KTsKIAkJZ290byBmYWlsX3VubG9jazsKIAl9CiAJcGVuZGluZ19zbmFwc2hvdC0+bmFtZSA9IGttYWxsb2MobmFtZWxlbiArIDEsIEdGUF9OT0ZTKTsKIAlpZiAoIXBlbmRpbmdfc25hcHNob3QtPm5hbWUpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJa2ZyZWUocGVuZGluZ19zbmFwc2hvdCk7CisJCWJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA2KTsKIAkJZ290byBmYWlsX3VubG9jazsKIAl9CiAJbWVtY3B5KHBlbmRpbmdfc25hcHNob3QtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOwpAQCAtNDIwLDE0ICs0MTcsMTUgQEAKICAqIHN5c19ta2RpcmF0IGFuZCB2ZnNfbWtkaXIsIGJ1dCB3ZSBvbmx5IGRvIGEgc2luZ2xlIGNvbXBvbmVudCBsb29rdXAKICAqIGluc2lkZSB0aGlzIGZpbGVzeXN0ZW0gc28gaXQncyBxdWl0ZSBhIGJpdCBzaW1wbGVyLgogICovCi1zdGF0aWMgbm9pbmxpbmUgaW50IGJ0cmZzX21rc3Vidm9sKHN0cnVjdCBwYXRoICpwYXJlbnQsIGNoYXIgKm5hbWUsCi0JCQkJICAgaW50IG1vZGUsIGludCBuYW1lbGVuLAorc3RhdGljIG5vaW5saW5lIGludCBidHJmc19ta3N1YnZvbChzdHJ1Y3QgcGF0aCAqcGFyZW50LAorCQkJCSAgIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAogCQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpzbmFwX3NyYykKIHsKKwlzdHJ1Y3QgaW5vZGUgKmRpciAgPSBwYXJlbnQtPmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJaW50IGVycm9yOwogCi0JbXV0ZXhfbG9ja19uZXN0ZWQoJnBhcmVudC0+ZGVudHJ5LT5kX2lub2RlLT5pX211dGV4LCBJX01VVEVYX1BBUkVOVCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmRpci0+aV9tdXRleCwgSV9NVVRFWF9QQVJFTlQpOwogCiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LT5kZW50cnksIG5hbWVsZW4pOwogCWVycm9yID0gUFRSX0VSUihkZW50cnkpOwpAQCAtNDM4LDk5ICs0MzYsMzkgQEAKIAlpZiAoZGVudHJ5LT5kX2lub2RlKQogCQlnb3RvIG91dF9kcHV0OwogCi0JaWYgKCFJU19QT1NJWEFDTChwYXJlbnQtPmRlbnRyeS0+ZF9pbm9kZSkpCi0JCW1vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKLQogCWVycm9yID0gbW50X3dhbnRfd3JpdGUocGFyZW50LT5tbnQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZHB1dDsKIAotCWVycm9yID0gYnRyZnNfbWF5X2NyZWF0ZShwYXJlbnQtPmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5KTsKKwllcnJvciA9IGJ0cmZzX21heV9jcmVhdGUoZGlyLCBkZW50cnkpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZHJvcF93cml0ZTsKIAotCS8qCi0JICogQWN0dWFsbHkgcGVyZm9ybSB0aGUgbG93LWxldmVsIHN1YnZvbHVtZSBjcmVhdGlvbiBhZnRlciBhbGwKLQkgKiB0aGlzIFZGUyBmdXp6LgotCSAqCi0JICogRXZlbnR1YWxseSB3ZSB3YW50IHRvIHBhc3MgaW4gYW4gaW5vZGUgdW5kZXIgd2hpY2ggd2UgY3JlYXRlIHRoaXMKLQkgKiBzdWJ2b2x1bWUsIGJ1dCBmb3Igbm93IGFsbCBhcmUgdW5kZXIgdGhlIGZpbGVzeXN0ZW0gcm9vdC4KLQkgKgotCSAqIEFsc28gd2Ugc2hvdWxkIHBhc3Mgb24gdGhlIG1vZGUgZXZlbnR1YWxseSB0byBhbGxvdyBjcmVhdGluZyBuZXcKLQkgKiBzdWJ2b2x1bWUgd2l0aCBzcGVjaWZpYyBtb2RlIGJpdHMuCi0JICovCisJZG93bl9yZWFkKCZCVFJGU19JKGRpciktPnJvb3QtPmZzX2luZm8tPnN1YnZvbF9zZW0pOworCisJaWYgKGJ0cmZzX3Jvb3RfcmVmcygmQlRSRlNfSShkaXIpLT5yb290LT5yb290X2l0ZW0pID09IDApCisJCWdvdG8gb3V0X3VwX3JlYWQ7CisKIAlpZiAoc25hcF9zcmMpIHsKLQkJc3RydWN0IGRlbnRyeSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudDsKLQkJc3RydWN0IGRlbnRyeSAqdGVzdCA9IGRpci0+ZF9wYXJlbnQ7Ci0JCXN0cnVjdCBidHJmc19wYXRoICpwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCQlpbnQgcmV0OwotCQl1NjQgdGVzdF9vaWQ7Ci0JCXU2NCBwYXJlbnRfb2lkID0gQlRSRlNfSShkaXItPmRfaW5vZGUpLT5yb290LT5yb290X2tleS5vYmplY3RpZDsKLQotCQl0ZXN0X29pZCA9IHNuYXBfc3JjLT5yb290X2tleS5vYmplY3RpZDsKLQotCQlyZXQgPSBidHJmc19maW5kX3Jvb3RfcmVmKHNuYXBfc3JjLT5mc19pbmZvLT50cmVlX3Jvb3QsCi0JCQkJCSAgcGF0aCwgcGFyZW50X29pZCwgdGVzdF9vaWQpOwotCQlpZiAocmV0ID09IDApCi0JCQlnb3RvIGNyZWF0ZTsKLQkJYnRyZnNfcmVsZWFzZV9wYXRoKHNuYXBfc3JjLT5mc19pbmZvLT50cmVlX3Jvb3QsIHBhdGgpOwotCi0JCS8qIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCBjcmVhdGluZyBhIGRpcmVjdG9yeSBsb29wCi0JCSAqIGJ5IHRha2luZyBhIHNuYXBzaG90IG9mIHNvbWV0aGluZyB0aGF0IGhhcyBvdXIgY3VycmVudAotCQkgKiBzdWJ2b2wgaW4gaXRzIGRpcmVjdG9yeSB0cmVlLiAgU28sIHRoaXMgbG9vcHMgdGhyb3VnaAotCQkgKiB0aGUgZGVudHJpZXMgYW5kIGNoZWNrcyB0aGUgZm9yd2FyZCByZWZzIGZvciBlYWNoIHN1YnZvbHVtZQotCQkgKiB0byBzZWUgaWYgaXMgcmVmZXJlbmNlcyB0aGUgc3Vidm9sdW1lIHdoZXJlIHdlIGFyZQotCQkgKiBwbGFjaW5nIHRoaXMgbmV3IHNuYXBzaG90LgotCQkgKi8KLQkJd2hpbGUgKDEpIHsKLQkJCWlmICghdGVzdCB8fAotCQkJICAgIGRpciA9PSBzbmFwX3NyYy0+ZnNfaW5mby0+c2ItPnNfcm9vdCB8fAotCQkJICAgIHRlc3QgPT0gc25hcF9zcmMtPmZzX2luZm8tPnNiLT5zX3Jvb3QgfHwKLQkJCSAgICB0ZXN0LT5kX2lub2RlLT5pX3NiICE9IHNuYXBfc3JjLT5mc19pbmZvLT5zYikgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKFNfSVNMTksodGVzdC0+ZF9pbm9kZS0+aV9tb2RlKSkgewotCQkJCXByaW50ayhLRVJOX0lORk8gIkJ0cmZzIHN5bWxpbmsgaW4gc25hcHNob3QgIgotCQkJCSAgICAgICAicGF0aCwgZmFpbGVkXG4iKTsKLQkJCQllcnJvciA9IC1FTUxJTks7Ci0JCQkJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwotCQkJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7Ci0JCQl9Ci0JCQl0ZXN0X29pZCA9Ci0JCQkJQlRSRlNfSSh0ZXN0LT5kX2lub2RlKS0+cm9vdC0+cm9vdF9rZXkub2JqZWN0aWQ7Ci0JCQlyZXQgPSBidHJmc19maW5kX3Jvb3RfcmVmKHNuYXBfc3JjLT5mc19pbmZvLT50cmVlX3Jvb3QsCi0JCQkJICBwYXRoLCB0ZXN0X29pZCwgcGFyZW50X29pZCk7Ci0JCQlpZiAocmV0ID09IDApIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJCdHJmcyBzbmFwc2hvdCBjcmVhdGlvbiAiCi0JCQkJICAgICAgICJmYWlsZWQsIGxvb3BpbmdcbiIpOwotCQkJCWVycm9yID0gLUVNTElOSzsKLQkJCQlidHJmc19mcmVlX3BhdGgocGF0aCk7Ci0JCQkJZ290byBvdXRfZHJvcF93cml0ZTsKLQkJCX0KLQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChzbmFwX3NyYy0+ZnNfaW5mby0+dHJlZV9yb290LCBwYXRoKTsKLQkJCXRlc3QgPSB0ZXN0LT5kX3BhcmVudDsKLQkJfQotY3JlYXRlOgotCQlidHJmc19mcmVlX3BhdGgocGF0aCk7Ci0JCWVycm9yID0gY3JlYXRlX3NuYXBzaG90KHNuYXBfc3JjLCBkZW50cnksIG5hbWUsIG5hbWVsZW4pOworCQllcnJvciA9IGNyZWF0ZV9zbmFwc2hvdChzbmFwX3NyYywgZGVudHJ5LAorCQkJCQluYW1lLCBuYW1lbGVuKTsKIAl9IGVsc2UgewotCQllcnJvciA9IGNyZWF0ZV9zdWJ2b2woQlRSRlNfSShwYXJlbnQtPmRlbnRyeS0+ZF9pbm9kZSktPnJvb3QsCi0JCQkJICAgICAgZGVudHJ5LCBuYW1lLCBuYW1lbGVuKTsKKwkJZXJyb3IgPSBjcmVhdGVfc3Vidm9sKEJUUkZTX0koZGlyKS0+cm9vdCwgZGVudHJ5LAorCQkJCSAgICAgIG5hbWUsIG5hbWVsZW4pOwogCX0KLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7Ci0KLQlmc25vdGlmeV9ta2RpcihwYXJlbnQtPmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5KTsKKwlpZiAoIWVycm9yKQorCQlmc25vdGlmeV9ta2RpcihkaXIsIGRlbnRyeSk7CitvdXRfdXBfcmVhZDoKKwl1cF9yZWFkKCZCVFJGU19JKGRpciktPnJvb3QtPmZzX2luZm8tPnN1YnZvbF9zZW0pOwogb3V0X2Ryb3Bfd3JpdGU6CiAJbW50X2Ryb3Bfd3JpdGUocGFyZW50LT5tbnQpOwogb3V0X2RwdXQ6CiAJZHB1dChkZW50cnkpOwogb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnBhcmVudC0+ZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CiAJcmV0dXJuIGVycm9yOwogfQogCi0KIHN0YXRpYyBpbnQgYnRyZnNfZGVmcmFnX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CkBAIC01OTYsOSArNTM0LDggQEAKIAkJY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZSk7CiAKIAkJYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyhpbm9kZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQpOwotCi0JCXVubG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKIAkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCXVubG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucihpbm9kZS0+aV9tYXBwaW5nLCAxKTsKQEAgLTYwOSw3ICs1NDYsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJ0cmZzX2lvY3RsX3Jlc2l6ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBub2lubGluZSBpbnQgYnRyZnNfaW9jdGxfcmVzaXplKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQl2b2lkIF9fdXNlciAqYXJnKQogewogCXU2NCBuZXdfc2l6ZTsKIAl1NjQgb2xkX3NpemU7CkBAIC03MTgsMTAgKzY1Niw3IEBACiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGZkZW50cnkoZmlsZSktPmRfaW5vZGUpLT5yb290OwogCXN0cnVjdCBidHJmc19pb2N0bF92b2xfYXJncyAqdm9sX2FyZ3M7Ci0Jc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpkaTsKLQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgZmlsZSAqc3JjX2ZpbGU7Ci0JdTY0IHJvb3RfZGlyaWQ7CiAJaW50IG5hbWVsZW47CiAJaW50IHJldCA9IDA7CiAKQEAgLTczOSwzMiArNjc0LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlpZiAoIXBhdGgpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jcm9vdF9kaXJpZCA9IHJvb3QtPmZzX2luZm8tPnNiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfaW5vLAotCWRpID0gYnRyZnNfbG9va3VwX2Rpcl9pdGVtKE5VTEwsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKLQkJCSAgICBwYXRoLCByb290X2RpcmlkLAotCQkJICAgIHZvbF9hcmdzLT5uYW1lLCBuYW1lbGVuLCAwKTsKLQlidHJmc19mcmVlX3BhdGgocGF0aCk7Ci0KLQlpZiAoZGkgJiYgIUlTX0VSUihkaSkpIHsKLQkJcmV0ID0gLUVFWElTVDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKElTX0VSUihkaSkpIHsKLQkJcmV0ID0gUFRSX0VSUihkaSk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWlmIChzdWJ2b2wpIHsKLQkJcmV0ID0gYnRyZnNfbWtzdWJ2b2woJmZpbGUtPmZfcGF0aCwgdm9sX2FyZ3MtPm5hbWUsCi0JCQkJICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUsCi0JCQkJICAgICBuYW1lbGVuLCBOVUxMKTsKKwkJcmV0ID0gYnRyZnNfbWtzdWJ2b2woJmZpbGUtPmZfcGF0aCwgdm9sX2FyZ3MtPm5hbWUsIG5hbWVsZW4sCisJCQkJICAgICBOVUxMKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgaW5vZGUgKnNyY19pbm9kZTsKIAkJc3JjX2ZpbGUgPSBmZ2V0KHZvbF9hcmdzLT5mZCk7CkBAIC03ODEsMTcgKzY5MywxNTcgQEAKIAkJCWZwdXQoc3JjX2ZpbGUpOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJcmV0ID0gYnRyZnNfbWtzdWJ2b2woJmZpbGUtPmZfcGF0aCwgdm9sX2FyZ3MtPm5hbWUsCi0JCQkgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSwKLQkJCSAgICAgbmFtZWxlbiwgQlRSRlNfSShzcmNfaW5vZGUpLT5yb290KTsKKwkJcmV0ID0gYnRyZnNfbWtzdWJ2b2woJmZpbGUtPmZfcGF0aCwgdm9sX2FyZ3MtPm5hbWUsIG5hbWVsZW4sCisJCQkJICAgICBCVFJGU19JKHNyY19pbm9kZSktPnJvb3QpOwogCQlmcHV0KHNyY19maWxlKTsKIAl9Ci0KIG91dDoKIAlrZnJlZSh2b2xfYXJncyk7CiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIGhlbHBlciB0byBjaGVjayBpZiB0aGUgc3Vidm9sdW1lIHJlZmVyZW5jZXMgb3RoZXIgc3Vidm9sdW1lcworICovCitzdGF0aWMgbm9pbmxpbmUgaW50IG1heV9kZXN0cm95X3N1YnZvbChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlpbnQgcmV0OworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJa2V5Lm9iamVjdGlkID0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQ7CisJa2V5LnR5cGUgPSBCVFJGU19ST09UX1JFRl9LRVk7CisJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCisJCQkJJmtleSwgcGF0aCwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCUJVR19PTihyZXQgPT0gMCk7CisKKwlyZXQgPSAwOworCWlmIChwYXRoLT5zbG90c1swXSA+IDApIHsKKwkJcGF0aC0+c2xvdHNbMF0tLTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAma2V5LCBwYXRoLT5zbG90c1swXSk7CisJCWlmIChrZXkub2JqZWN0aWQgPT0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgJiYKKwkJICAgIGtleS50eXBlID09IEJUUkZTX1JPT1RfUkVGX0tFWSkKKwkJCXJldCA9IC1FTk9URU1QVFk7CisJfQorb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IGJ0cmZzX2lvY3RsX3NuYXBfZGVzdHJveShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGZkZW50cnkoZmlsZSk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGRpciktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmRlc3QgPSBOVUxMOworCXN0cnVjdCBidHJmc19pb2N0bF92b2xfYXJncyAqdm9sX2FyZ3M7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJaW50IG5hbWVsZW47CisJaW50IHJldDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXZvbF9hcmdzID0gbWVtZHVwX3VzZXIoYXJnLCBzaXplb2YoKnZvbF9hcmdzKSk7CisJaWYgKElTX0VSUih2b2xfYXJncykpCisJCXJldHVybiBQVFJfRVJSKHZvbF9hcmdzKTsKKworCXZvbF9hcmdzLT5uYW1lW0JUUkZTX1BBVEhfTkFNRV9NQVhdID0gJ1wwJzsKKwluYW1lbGVuID0gc3RybGVuKHZvbF9hcmdzLT5uYW1lKTsKKwlpZiAoc3RyY2hyKHZvbF9hcmdzLT5uYW1lLCAnLycpIHx8CisJICAgIHN0cm5jbXAodm9sX2FyZ3MtPm5hbWUsICIuLiIsIG5hbWVsZW4pID09IDApIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gbW50X3dhbnRfd3JpdGUoZmlsZS0+Zl9wYXRoLm1udCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrX25lc3RlZCgmZGlyLT5pX211dGV4LCBJX01VVEVYX1BBUkVOVCk7CisJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4odm9sX2FyZ3MtPm5hbWUsIHBhcmVudCwgbmFtZWxlbik7CisJaWYgKElTX0VSUihkZW50cnkpKSB7CisJCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKKwkJZ290byBvdXRfdW5sb2NrX2RpcjsKKwl9CisKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgeworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIG91dF9kcHV0OworCX0KKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9pbm8gIT0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9kcHV0OworCX0KKworCWRlc3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwllcnIgPSBkX2ludmFsaWRhdGUoZGVudHJ5KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlkb3duX3dyaXRlKCZyb290LT5mc19pbmZvLT5zdWJ2b2xfc2VtKTsKKworCWVyciA9IG1heV9kZXN0cm95X3N1YnZvbChkZXN0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91cF93cml0ZTsKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJcmV0ID0gYnRyZnNfdW5saW5rX3N1YnZvbCh0cmFucywgcm9vdCwgZGlyLAorCQkJCWRlc3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJZGVudHJ5LT5kX25hbWUubGVuKTsKKwlCVUdfT04ocmV0KTsKKworCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCBkZXN0KTsKKworCW1lbXNldCgmZGVzdC0+cm9vdF9pdGVtLmRyb3BfcHJvZ3Jlc3MsIDAsCisJCXNpemVvZihkZXN0LT5yb290X2l0ZW0uZHJvcF9wcm9ncmVzcykpOworCWRlc3QtPnJvb3RfaXRlbS5kcm9wX2xldmVsID0gMDsKKwlidHJmc19zZXRfcm9vdF9yZWZzKCZkZXN0LT5yb290X2l0ZW0sIDApOworCisJcmV0ID0gYnRyZnNfaW5zZXJ0X29ycGhhbl9pdGVtKHRyYW5zLAorCQkJCXJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQlkZXN0LT5yb290X2tleS5vYmplY3RpZCk7CisJQlVHX09OKHJldCk7CisKKwlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCUJVR19PTihyZXQpOworCWlub2RlLT5pX2ZsYWdzIHw9IFNfREVBRDsKK291dF91cF93cml0ZToKKwl1cF93cml0ZSgmcm9vdC0+ZnNfaW5mby0+c3Vidm9sX3NlbSk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCWlmICghZXJyKSB7CisJCXNocmlua19kY2FjaGVfc2Iocm9vdC0+ZnNfaW5mby0+c2IpOworCQlidHJmc19pbnZhbGlkYXRlX2lub2RlcyhkZXN0KTsKKwkJZF9kZWxldGUoZGVudHJ5KTsKKwl9CitvdXRfZHB1dDoKKwlkcHV0KGRlbnRyeSk7CitvdXRfdW5sb2NrX2RpcjoKKwltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CisJbW50X2Ryb3Bfd3JpdGUoZmlsZS0+Zl9wYXRoLm1udCk7CitvdXQ6CisJa2ZyZWUodm9sX2FyZ3MpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgYnRyZnNfaW9jdGxfZGVmcmFnKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmZGVudHJ5KGZpbGUpLT5kX2lub2RlOwpAQCAtODY1LDggKzkxNyw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGxvbmcgYnRyZnNfaW9jdGxfY2xvbmUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgc3JjZmQsCi0JCXU2NCBvZmYsIHU2NCBvbGVuLCB1NjQgZGVzdG9mZikKK3N0YXRpYyBub2lubGluZSBsb25nIGJ0cmZzX2lvY3RsX2Nsb25lKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIHNyY2ZkLAorCQkJCSAgICAgICB1NjQgb2ZmLCB1NjQgb2xlbiwgdTY0IGRlc3RvZmYpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKQEAgLTk3Niw3ICsxMDI4LDcgQEAKIAogCS8qIHB1bmNoIGhvbGUgaW4gZGVzdGluYXRpb24gZmlyc3QgKi8KIAlidHJmc19kcm9wX2V4dGVudHModHJhbnMsIHJvb3QsIGlub2RlLCBvZmYsIG9mZiArIGxlbiwKLQkJCSAgIG9mZiArIGxlbiwgMCwgJmhpbnRfYnl0ZSk7CisJCQkgICBvZmYgKyBsZW4sIDAsICZoaW50X2J5dGUsIDEpOwogCiAJLyogY2xvbmUgZGF0YSAqLwogCWtleS5vYmplY3RpZCA9IHNyYy0+aV9pbm87CkBAIC0xMDcxLDkgKzExMjMsMTAgQEAKIAkJCQkJZGF0YW8gKz0gb2ZmIC0ga2V5Lm9mZnNldDsKIAkJCQkJZGF0YWwgLT0gb2ZmIC0ga2V5Lm9mZnNldDsKIAkJCQl9Ci0JCQkJaWYgKGtleS5vZmZzZXQgKyBkYXRhbyArIGRhdGFsICsga2V5Lm9mZnNldCA+Ci0JCQkJICAgIG9mZiArIGxlbikKLQkJCQkJZGF0YWwgPSBvZmYgKyBsZW4gLSBrZXkub2Zmc2V0IC0gZGF0YW87CisKKwkJCQlpZiAoa2V5Lm9mZnNldCArIGRhdGFsID4gb2ZmICsgbGVuKQorCQkJCQlkYXRhbCA9IG9mZiArIGxlbiAtIGtleS5vZmZzZXQ7CisKIAkJCQkvKiBkaXNrbyA9PSAwIG1lYW5zIGl0J3MgYSBob2xlICovCiAJCQkJaWYgKCFkaXNrbykKIAkJCQkJZGF0YW8gPSAwOwpAQCAtMTE4MiwxNSArMTIzNSwxNSBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmZGVudHJ5KGZpbGUpLT5kX2lub2RlOwogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CiAJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAorCXJldCA9IC1FUEVSTTsKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhKSB7Ci0JCXJldCA9IC1FSU5QUk9HUkVTUzsKIAkJZ290byBvdXQ7Ci0JfQorCisJcmV0ID0gLUVJTlBST0dSRVNTOworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpCisJCWdvdG8gb3V0OwogCiAJcmV0ID0gbW50X3dhbnRfd3JpdGUoZmlsZS0+Zl9wYXRoLm1udCk7CiAJaWYgKHJldCkKQEAgLTEyMDAsMTIgKzEyNTMsMTkgQEAKIAlyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKys7CiAJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKKwlyZXQgPSAtRU5PTUVNOwogCXRyYW5zID0gYnRyZnNfc3RhcnRfaW9jdGxfdHJhbnNhY3Rpb24ocm9vdCwgMCk7Ci0JaWYgKHRyYW5zKQotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSB0cmFuczsKLQllbHNlCi0JCXJldCA9IC1FTk9NRU07Ci0JLypwcmludGsoS0VSTl9JTkZPICJidHJmc19pb2N0bF90cmFuc19zdGFydCBvbiAlcFxuIiwgZmlsZSk7Ki8KKwlpZiAoIXRyYW5zKQorCQlnb3RvIG91dF9kcm9wOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdHJhbnM7CisJcmV0dXJuIDA7CisKK291dF9kcm9wOgorCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwlyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zLS07CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJbW50X2Ryb3Bfd3JpdGUoZmlsZS0+Zl9wYXRoLm1udCk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEyMjEsMjQgKzEyODEsMjAgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmRlbnRyeShmaWxlKS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOwotCWludCByZXQgPSAwOwogCiAJdHJhbnMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCF0cmFucykgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlpZiAoIXRyYW5zKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCisJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwogCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKIAlyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zLS07CiAJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKIAltbnRfZHJvcF93cml0ZShmaWxlLT5mX3BhdGgubW50KTsKLQotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIGxvbmcgYnRyZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludApAQCAtMTI1OCw2ICsxMzE0LDggQEAKIAkJcmV0dXJuIGJ0cmZzX2lvY3RsX3NuYXBfY3JlYXRlKGZpbGUsIGFyZ3AsIDApOwogCWNhc2UgQlRSRlNfSU9DX1NVQlZPTF9DUkVBVEU6CiAJCXJldHVybiBidHJmc19pb2N0bF9zbmFwX2NyZWF0ZShmaWxlLCBhcmdwLCAxKTsKKwljYXNlIEJUUkZTX0lPQ19TTkFQX0RFU1RST1k6CisJCXJldHVybiBidHJmc19pb2N0bF9zbmFwX2Rlc3Ryb3koZmlsZSwgYXJncCk7CiAJY2FzZSBCVFJGU19JT0NfREVGUkFHOgogCQlyZXR1cm4gYnRyZnNfaW9jdGxfZGVmcmFnKGZpbGUpOwogCWNhc2UgQlRSRlNfSU9DX1JFU0laRToKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lvY3RsLmggYi9mcy9idHJmcy9pb2N0bC5oCmluZGV4IGIzMjBiMTAuLmJjNDk5MTQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lvY3RsLmgKKysrIGIvZnMvYnRyZnMvaW9jdGwuaApAQCAtNjUsNSArNjUsNiBAQAogCiAjZGVmaW5lIEJUUkZTX0lPQ19TVUJWT0xfQ1JFQVRFIF9JT1coQlRSRlNfSU9DVExfTUFHSUMsIDE0LCBcCiAJCQkJICAgc3RydWN0IGJ0cmZzX2lvY3RsX3ZvbF9hcmdzKQotCisjZGVmaW5lIEJUUkZTX0lPQ19TTkFQX0RFU1RST1kgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgMTUsIFwKKwkJCQlzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL29yZGVyZWQtZGF0YS5jIGIvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmMKaW5kZXggN2IyZjQwMS4uNTc5OWJjNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmMKKysrIGIvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmMKQEAgLTE1OSw4ICsxNTksNiBAQAogICoKICAqIGxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBleHRlbnQKICAqCi0gKiBUaGlzIGFsc28gc2V0cyB0aGUgRVhURU5UX09SREVSRUQgYml0IG9uIHRoZSByYW5nZSBpbiB0aGUgaW5vZGUuCi0gKgogICogVGhlIHRyZWUgaXMgZ2l2ZW4gYSBzaW5nbGUgcmVmZXJlbmNlIG9uIHRoZSBvcmRlcmVkIGV4dGVudCB0aGF0IHdhcwogICogaW5zZXJ0ZWQuCiAgKi8KQEAgLTE4MSw2ICsxNzksNyBAQAogCWVudHJ5LT5zdGFydCA9IHN0YXJ0OwogCWVudHJ5LT5sZW4gPSBsZW47CiAJZW50cnktPmRpc2tfbGVuID0gZGlza19sZW47CisJZW50cnktPmJ5dGVzX2xlZnQgPSBsZW47CiAJZW50cnktPmlub2RlID0gaW5vZGU7CiAJaWYgKHR5cGUgIT0gQlRSRlNfT1JERVJFRF9JT19ET05FICYmIHR5cGUgIT0gQlRSRlNfT1JERVJFRF9DT01QTEVURSkKIAkJc2V0X2JpdCh0eXBlLCAmZW50cnktPmZsYWdzKTsKQEAgLTE5NSw5ICsxOTQsNiBAQAogCQkJICAgJmVudHJ5LT5yYl9ub2RlKTsKIAlCVUdfT04obm9kZSk7CiAKLQlzZXRfZXh0ZW50X29yZGVyZWQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBmaWxlX29mZnNldCwKLQkJCSAgIGVudHJ5X2VuZChlbnRyeSkgLSAxLCBHRlBfTk9GUyk7Ci0KIAlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5vcmRlcmVkX2V4dGVudF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZlbnRyeS0+cm9vdF9leHRlbnRfbGlzdCwKIAkJICAgICAgJkJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5vcmRlcmVkX2V4dGVudHMpOwpAQCAtMjQxLDEzICsyMzcsMTAgQEAKIAlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9pbm9kZV90cmVlICp0cmVlOwogCXN0cnVjdCByYl9ub2RlICpub2RlOwogCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqZW50cnk7Ci0Jc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb190cmVlOwogCWludCByZXQ7CiAKIAl0cmVlID0gJkJUUkZTX0koaW5vZGUpLT5vcmRlcmVkX3RyZWU7CiAJbXV0ZXhfbG9jaygmdHJlZS0+bXV0ZXgpOwotCWNsZWFyX2V4dGVudF9vcmRlcmVkKGlvX3RyZWUsIGZpbGVfb2Zmc2V0LCBmaWxlX29mZnNldCArIGlvX3NpemUgLSAxLAotCQkJICAgICBHRlBfTk9GUyk7CiAJbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIGZpbGVfb2Zmc2V0KTsKIAlpZiAoIW5vZGUpIHsKIAkJcmV0ID0gMTsKQEAgLTI2MCwxMSArMjUzLDE2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IHRlc3RfcmFuZ2VfYml0KGlvX3RyZWUsIGVudHJ5LT5maWxlX29mZnNldCwKLQkJCSAgICAgZW50cnktPmZpbGVfb2Zmc2V0ICsgZW50cnktPmxlbiAtIDEsCi0JCQkgICAgIEVYVEVOVF9PUkRFUkVELCAwKTsKLQlpZiAocmV0ID09IDApCisJaWYgKGlvX3NpemUgPiBlbnRyeS0+Ynl0ZXNfbGVmdCkgeworCQlwcmludGsoS0VSTl9DUklUICJiYWQgb3JkZXJlZCBhY2NvdW50aW5nIGxlZnQgJWxsdSBzaXplICVsbHVcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWVudHJ5LT5ieXRlc19sZWZ0LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpb19zaXplKTsKKwl9CisJZW50cnktPmJ5dGVzX2xlZnQgLT0gaW9fc2l6ZTsKKwlpZiAoZW50cnktPmJ5dGVzX2xlZnQgPT0gMCkKIAkJcmV0ID0gdGVzdF9hbmRfc2V0X2JpdChCVFJGU19PUkRFUkVEX0lPX0RPTkUsICZlbnRyeS0+ZmxhZ3MpOworCWVsc2UKKwkJcmV0ID0gMTsKIG91dDoKIAltdXRleF91bmxvY2soJnRyZWUtPm11dGV4KTsKIAlyZXR1cm4gcmV0ID09IDA7CkBAIC0zMDgsNiArMzA2LDEyIEBACiAJdHJlZS0+bGFzdCA9IE5VTEw7CiAJc2V0X2JpdChCVFJGU19PUkRFUkVEX0NPTVBMRVRFLCAmZW50cnktPmZsYWdzKTsKIAorCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmFjY291bnRpbmdfbG9jayk7CisJQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMtLTsKKwlzcGluX3VubG9jaygmQlRSRlNfSShpbm9kZSktPmFjY291bnRpbmdfbG9jayk7CisJYnRyZnNfdW5yZXNlcnZlX21ldGFkYXRhX2Zvcl9kZWxhbGxvYyhCVFJGU19JKGlub2RlKS0+cm9vdCwKKwkJCQkJICAgICAgaW5vZGUsIDEpOworCiAJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+b3JkZXJlZF9leHRlbnRfbG9jayk7CiAJbGlzdF9kZWxfaW5pdCgmZW50cnktPnJvb3RfZXh0ZW50X2xpc3QpOwogCkBAIC00NjAsNyArNDY0LDcgQEAKIAkgKiBzdGFydCBJTyBvbiBhbnkgZGlydHkgb25lcyBzbyB0aGUgd2FpdCBkb2Vzbid0IHN0YWxsIHdhaXRpbmcKIAkgKiBmb3IgcGRmbHVzaCB0byBmaW5kIHRoZW0KIAkgKi8KLQlidHJmc19mZGF0YXdyaXRlX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQsIFdCX1NZTkNfQUxMKTsKKwlmaWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CiAJaWYgKHdhaXQpIHsKIAkJd2FpdF9ldmVudChlbnRyeS0+d2FpdCwgdGVzdF9iaXQoQlRSRlNfT1JERVJFRF9DT01QTEVURSwKIAkJCQkJCSAmZW50cnktPmZsYWdzKSk7CkBAIC00NzYsNiArNDgwLDcgQEAKIAl1NjQgb3JpZ19lbmQ7CiAJdTY0IHdhaXRfZW5kOwogCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKwlpbnQgZm91bmQ7CiAKIAlpZiAoc3RhcnQgKyBsZW4gPCBzdGFydCkgewogCQlvcmlnX2VuZCA9IElOVF9MSU1JVChsb2ZmX3QpOwpAQCAtNDg5LDE5ICs0OTQsMTggQEAKIAkvKiBzdGFydCBJTyBhY3Jvc3MgdGhlIHJhbmdlIGZpcnN0IHRvIGluc3RhbnRpYXRlIGFueSBkZWxhbGxvYwogCSAqIGV4dGVudHMKIAkgKi8KLQlidHJmc19mZGF0YXdyaXRlX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBvcmlnX2VuZCwgV0JfU1lOQ19BTEwpOworCWZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgb3JpZ19lbmQpOwogCiAJLyogVGhlIGNvbXByZXNzaW9uIGNvZGUgd2lsbCBsZWF2ZSBwYWdlcyBsb2NrZWQgYnV0IHJldHVybiBmcm9tCiAJICogd3JpdGVwYWdlIHdpdGhvdXQgc2V0dGluZyB0aGUgcGFnZSB3cml0ZWJhY2suICBTdGFydGluZyBhZ2FpbgogCSAqIHdpdGggV0JfU1lOQ19BTEwgd2lsbCBlbmQgdXAgd2FpdGluZyBmb3IgdGhlIElPIHRvIGFjdHVhbGx5IHN0YXJ0LgogCSAqLwotCWJ0cmZzX2ZkYXRhd3JpdGVfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIG9yaWdfZW5kLCBXQl9TWU5DX0FMTCk7CisJZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBvcmlnX2VuZCk7CiAKLQlidHJmc193YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsCi0JCQkJCSAgIHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsCi0JCQkJCSAgIG9yaWdfZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCWZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBvcmlnX2VuZCk7CiAKIAllbmQgPSBvcmlnX2VuZDsKKwlmb3VuZCA9IDA7CiAJd2hpbGUgKDEpIHsKIAkJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9maXJzdF9vcmRlcmVkX2V4dGVudChpbm9kZSwgZW5kKTsKIAkJaWYgKCFvcmRlcmVkKQpAQCAtNTE0LDYgKzUxOCw3IEBACiAJCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CiAJCQlicmVhazsKIAkJfQorCQlmb3VuZCsrOwogCQlidHJmc19zdGFydF9vcmRlcmVkX2V4dGVudChpbm9kZSwgb3JkZXJlZCwgMSk7CiAJCWVuZCA9IG9yZGVyZWQtPmZpbGVfb2Zmc2V0OwogCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CkBAIC01MjEsOCArNTI2LDggQEAKIAkJCWJyZWFrOwogCQllbmQtLTsKIAl9Ci0JaWYgKHRlc3RfcmFuZ2VfYml0KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgc3RhcnQsIG9yaWdfZW5kLAotCQkJICAgRVhURU5UX09SREVSRUQgfCBFWFRFTlRfREVMQUxMT0MsIDApKSB7CisJaWYgKGZvdW5kIHx8IHRlc3RfcmFuZ2VfYml0KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgc3RhcnQsIG9yaWdfZW5kLAorCQkJICAgRVhURU5UX0RFTEFMTE9DLCAwLCBOVUxMKSkgewogCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCQlnb3RvIGFnYWluOwogCX0KQEAgLTYxMyw3ICs2MTgsNyBAQAogCSAqLwogCWlmICh0ZXN0X3JhbmdlX2JpdChpb190cmVlLCBkaXNrX2lfc2l6ZSwKIAkJCSAgIG9yZGVyZWQtPmZpbGVfb2Zmc2V0ICsgb3JkZXJlZC0+bGVuIC0gMSwKLQkJCSAgIEVYVEVOVF9ERUxBTExPQywgMCkpIHsKKwkJCSAgIEVYVEVOVF9ERUxBTExPQywgMCwgTlVMTCkpIHsKIAkJZ290byBvdXQ7CiAJfQogCS8qCkBAIC02NjQsNyArNjY5LDcgQEAKIAkgKi8KIAlpZiAoaV9zaXplX3Rlc3QgPiBlbnRyeV9lbmQob3JkZXJlZCkgJiYKIAkgICAgIXRlc3RfcmFuZ2VfYml0KGlvX3RyZWUsIGVudHJ5X2VuZChvcmRlcmVkKSwgaV9zaXplX3Rlc3QgLSAxLAotCQkJICAgRVhURU5UX0RFTEFMTE9DLCAwKSkgeworCQkJICAgRVhURU5UX0RFTEFMTE9DLCAwLCBOVUxMKSkgewogCQluZXdfaV9zaXplID0gbWluX3QodTY0LCBpX3NpemVfdGVzdCwgaV9zaXplX3JlYWQoaW5vZGUpKTsKIAl9CiAJQlRSRlNfSShpbm9kZSktPmRpc2tfaV9zaXplID0gbmV3X2lfc2l6ZTsKQEAgLTcxNSw4OSArNzIwLDYgQEAKIH0KIAogCi0vKioKLSAqIHRha2VuIGZyb20gbW0vZmlsZW1hcC5jIGJlY2F1c2UgaXQgaXNuJ3QgZXhwb3J0ZWQKLSAqCi0gKiBfX2ZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZSAtIHN0YXJ0IHdyaXRlYmFjayBvbiBtYXBwaW5nIGRpcnR5IHBhZ2VzIGluIHJhbmdlCi0gKiBAbWFwcGluZzoJYWRkcmVzcyBzcGFjZSBzdHJ1Y3R1cmUgdG8gd3JpdGUKLSAqIEBzdGFydDoJb2Zmc2V0IGluIGJ5dGVzIHdoZXJlIHRoZSByYW5nZSBzdGFydHMKLSAqIEBlbmQ6CW9mZnNldCBpbiBieXRlcyB3aGVyZSB0aGUgcmFuZ2UgZW5kcyAoaW5jbHVzaXZlKQotICogQHN5bmNfbW9kZToJZW5hYmxlIHN5bmNocm9ub3VzIG9wZXJhdGlvbgotICoKLSAqIFN0YXJ0IHdyaXRlYmFjayBhZ2FpbnN0IGFsbCBvZiBhIG1hcHBpbmcncyBkaXJ0eSBwYWdlcyB0aGF0IGxpZQotICogd2l0aGluIHRoZSBieXRlIG9mZnNldHMgPHN0YXJ0LCBlbmQ+IGluY2x1c2l2ZS4KLSAqCi0gKiBJZiBzeW5jX21vZGUgaXMgV0JfU1lOQ19BTEwgdGhlbiB0aGlzIGlzIGEgImRhdGEgaW50ZWdyaXR5IiBvcGVyYXRpb24sIGFzCi0gKiBvcHBvc2VkIHRvIGEgcmVndWxhciBtZW1vcnkgY2xlYW5zaW5nIHdyaXRlYmFjay4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLSAqIHRoZXNlIHR3byBvcGVyYXRpb25zIGlzIHRoYXQgaWYgYSBkaXJ0eSBwYWdlL2J1ZmZlciBpcyBlbmNvdW50ZXJlZCwgaXQgbXVzdAotICogYmUgd2FpdGVkIHVwb24sIGFuZCBub3QganVzdCBza2lwcGVkIG92ZXIuCi0gKi8KLWludCBidHJmc19mZGF0YXdyaXRlX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3Qgc3RhcnQsCi0JCQkgICBsb2ZmX3QgZW5kLCBpbnQgc3luY19tb2RlKQotewotCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7Ci0JCS5zeW5jX21vZGUgPSBzeW5jX21vZGUsCi0JCS5ucl90b193cml0ZSA9IG1hcHBpbmctPm5ycGFnZXMgKiAyLAotCQkucmFuZ2Vfc3RhcnQgPSBzdGFydCwKLQkJLnJhbmdlX2VuZCA9IGVuZCwKLQl9OwotCXJldHVybiBidHJmc193cml0ZXBhZ2VzKG1hcHBpbmcsICZ3YmMpOwotfQotCi0vKioKLSAqIHRha2VuIGZyb20gbW0vZmlsZW1hcC5jIGJlY2F1c2UgaXQgaXNuJ3QgZXhwb3J0ZWQKLSAqCi0gKiB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlIC0gd2FpdCBmb3Igd3JpdGViYWNrIHRvIGNvbXBsZXRlCi0gKiBAbWFwcGluZzoJdGFyZ2V0IGFkZHJlc3Nfc3BhY2UKLSAqIEBzdGFydDoJYmVnaW5uaW5nIHBhZ2UgaW5kZXgKLSAqIEBlbmQ6CWVuZGluZyBwYWdlIGluZGV4Ci0gKgotICogV2FpdCBmb3Igd3JpdGViYWNrIHRvIGNvbXBsZXRlIGFnYWluc3QgcGFnZXMgaW5kZXhlZCBieSBzdGFydC0+ZW5kCi0gKiBpbmNsdXNpdmUKLSAqLwotaW50IGJ0cmZzX3dhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkJICAgICAgIHBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kKQotewotCXN0cnVjdCBwYWdldmVjIHB2ZWM7Ci0JaW50IG5yX3BhZ2VzOwotCWludCByZXQgPSAwOwotCXBnb2ZmX3QgaW5kZXg7Ci0KLQlpZiAoZW5kIDwgc3RhcnQpCi0JCXJldHVybiAwOwotCi0JcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKLQlpbmRleCA9IHN0YXJ0OwotCXdoaWxlICgoaW5kZXggPD0gZW5kKSAmJgotCQkJKG5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXBfdGFnKCZwdmVjLCBtYXBwaW5nLCAmaW5kZXgsCi0JCQlQQUdFQ0FDSEVfVEFHX1dSSVRFQkFDSywKLQkJCW1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFLTEpICsgMSkpICE9IDApIHsKLQkJdW5zaWduZWQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwotCi0JCQkvKiB1bnRpbCByYWRpeCB0cmVlIGxvb2t1cCBhY2NlcHRzIGVuZF9pbmRleCAqLwotCQkJaWYgKHBhZ2UtPmluZGV4ID4gZW5kKQotCQkJCWNvbnRpbnVlOwotCi0JCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCQkJaWYgKFBhZ2VFcnJvcihwYWdlKSkKLQkJCQlyZXQgPSAtRUlPOwotCQl9Ci0JCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCX0KLQotCS8qIENoZWNrIGZvciBvdXRzdGFuZGluZyB3cml0ZSBlcnJvcnMgKi8KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFTX0VOT1NQQywgJm1hcHBpbmctPmZsYWdzKSkKLQkJcmV0ID0gLUVOT1NQQzsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFTX0VJTywgJm1hcHBpbmctPmZsYWdzKSkKLQkJcmV0ID0gLUVJTzsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qCiAgKiBhZGQgYSBnaXZlbiBpbm9kZSB0byB0aGUgbGlzdCBvZiBpbm9kZXMgdGhhdCBtdXN0IGJlIGZ1bGx5IG9uCiAgKiBkaXNrIGJlZm9yZSBhIHRyYW5zYWN0aW9uIGNvbW1pdCBmaW5pc2hlcy4KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL29yZGVyZWQtZGF0YS5oIGIvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmgKaW5kZXggM2QzMWM4OC4uZjgyZTg3NCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmgKKysrIGIvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmgKQEAgLTg1LDYgKzg1LDkgQEAKIAkvKiBleHRlbnQgbGVuZ3RoIG9uIGRpc2sgKi8KIAl1NjQgZGlza19sZW47CiAKKwkvKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzdGlsbCBuZWVkIHdyaXRpbmcgKi8KKwl1NjQgYnl0ZXNfbGVmdDsKKwogCS8qIGZsYWdzIChkZXNjcmliZWQgYWJvdmUpICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTUwLDEwICsxNTMsNiBAQAogaW50IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZCk7CiBpbnQgYnRyZnNfZmluZF9vcmRlcmVkX3N1bShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgb2Zmc2V0LCB1NjQgZGlza19ieXRlbnIsIHUzMiAqc3VtKTsKLWludCBidHJmc193YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJCSAgICAgICBwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCk7Ci1pbnQgYnRyZnNfZmRhdGF3cml0ZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IHN0YXJ0LAotCQkJICAgbG9mZl90IGVuZCwgaW50IHN5bmNfbW9kZSk7CiBpbnQgYnRyZnNfd2FpdF9vcmRlcmVkX2V4dGVudHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGludCBub2Nvd19vbmx5KTsKIGludCBidHJmc19ydW5fb3JkZXJlZF9vcGVyYXRpb25zKHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgd2FpdCk7CiBpbnQgYnRyZnNfYWRkX29yZGVyZWRfb3BlcmF0aW9uKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvb3JwaGFuLmMgYi9mcy9idHJmcy9vcnBoYW4uYwppbmRleCAzYzBkNTJhLi43OWNiYTVmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9vcnBoYW4uYworKysgYi9mcy9idHJmcy9vcnBoYW4uYwpAQCAtNjUsMyArNjUsMjMgQEAKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJcmV0dXJuIHJldDsKIH0KKworaW50IGJ0cmZzX2ZpbmRfb3JwaGFuX2l0ZW0oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBvZmZzZXQpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJaW50IHJldDsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX09SUEhBTl9PQkpFQ1RJRDsKKwlrZXkudHlwZSA9IEJUUkZTX09SUEhBTl9JVEVNX0tFWTsKKwlrZXkub2Zmc2V0ID0gb2Zmc2V0OworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CisKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3JlbG9jYXRpb24uYyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwppbmRleCBjMDRmN2YyLi5jZmNjOTNjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMKKysrIGIvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCkBAIC0xMjEsNiArMTIxLDE1IEBACiAJaW50IG5yOwogfTsKIAorI2RlZmluZSBNQVhfRVhURU5UUyAxMjgKKworc3RydWN0IGZpbGVfZXh0ZW50X2NsdXN0ZXIgeworCXU2NCBzdGFydDsKKwl1NjQgZW5kOworCXU2NCBib3VuZGFyeVtNQVhfRVhURU5UU107CisJdW5zaWduZWQgaW50IG5yOworfTsKKwogc3RydWN0IHJlbG9jX2NvbnRyb2wgewogCS8qIGJsb2NrIGdyb3VwIHRvIHJlbG9jYXRlICovCiAJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cDsKQEAgLTIxODAsNyArMjE4OSw3IEBACiAJCQkJc3RydWN0IHJlbG9jX2NvbnRyb2wgKnJjKQogewogCWlmICh0ZXN0X3JhbmdlX2JpdCgmcmMtPnByb2Nlc3NlZF9ibG9ja3MsIGJ5dGVuciwKLQkJCSAgIGJ5dGVuciArIGJsb2Nrc2l6ZSAtIDEsIEVYVEVOVF9ESVJUWSwgMSkpCisJCQkgICBieXRlbnIgKyBibG9ja3NpemUgLSAxLCBFWFRFTlRfRElSVFksIDEsIE5VTEwpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1MjksNTYgKzI1MzgsOTQgQEAKIH0KIAogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjawotaW50IHJlbG9jYXRlX2lub2RlX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwgdTY0IGxlbikKK2ludCBzZXR1cF9leHRlbnRfbWFwcGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkgdTY0IGJsb2NrX3N0YXJ0KQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCWludCByZXQgPSAwOworCisJZW0gPSBhbGxvY19leHRlbnRfbWFwKEdGUF9OT0ZTKTsKKwlpZiAoIWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVtLT5zdGFydCA9IHN0YXJ0OworCWVtLT5sZW4gPSBlbmQgKyAxIC0gc3RhcnQ7CisJZW0tPmJsb2NrX2xlbiA9IGVtLT5sZW47CisJZW0tPmJsb2NrX3N0YXJ0ID0gYmxvY2tfc3RhcnQ7CisJZW0tPmJkZXYgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKKwlzZXRfYml0KEVYVEVOVF9GTEFHX1BJTk5FRCwgJmVtLT5mbGFncyk7CisKKwlsb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKKwl3aGlsZSAoMSkgeworCQl3cml0ZV9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJcmV0ID0gYWRkX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGVtKTsKKwkJd3JpdGVfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJaWYgKHJldCAhPSAtRUVYSVNUKSB7CisJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJYnJlYWs7CisJCX0KKwkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBlbmQsIDApOworCX0KKwl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgc3RhcnQsIGVuZCwgR0ZQX05PRlMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVsb2NhdGVfZmlsZV9leHRlbnRfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3QgZmlsZV9leHRlbnRfY2x1c3RlciAqY2x1c3RlcikKIHsKIAl1NjQgcGFnZV9zdGFydDsKIAl1NjQgcGFnZV9lbmQ7Ci0JdW5zaWduZWQgbG9uZyBpOwotCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXg7CisJdTY0IG9mZnNldCA9IEJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQ7CisJdW5zaWduZWQgbG9uZyBpbmRleDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7Ci0JdW5zaWduZWQgaW50IHRvdGFsX3JlYWQgPSAwOwotCXVuc2lnbmVkIGludCB0b3RhbF9kaXJ0eSA9IDA7CisJdW5zaWduZWQgaW50IGRpcnR5X3BhZ2UgPSAwOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXN0cnVjdCBmaWxlX3JhX3N0YXRlICpyYTsKLQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQ7Ci0Jc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb190cmVlOworCWludCBuciA9IDA7CiAJaW50IHJldCA9IDA7CiAKKwlpZiAoIWNsdXN0ZXItPm5yKQorCQlyZXR1cm4gMDsKKwogCXJhID0ga3phbGxvYyhzaXplb2YoKnJhKSwgR0ZQX05PRlMpOwogCWlmICghcmEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCWZpcnN0X2luZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlsYXN0X2luZGV4ID0gKHN0YXJ0ICsgbGVuIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpbmRleCA9IChjbHVzdGVyLT5zdGFydCAtIG9mZnNldCkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlsYXN0X2luZGV4ID0gKGNsdXN0ZXItPmVuZCAtIG9mZnNldCkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAotCS8qIG1ha2Ugc3VyZSB0aGUgZGlydHkgdHJpY2sgcGxheWVkIGJ5IHRoZSBjYWxsZXIgd29yayAqLwotCXdoaWxlICgxKSB7Ci0JCXJldCA9IGludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsCi0JCQkJCQkgICAgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXgpOwotCQlpZiAocmV0ICE9IC1FQlVTWSkKLQkJCWJyZWFrOwotCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKLQl9CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJaV9zaXplX3dyaXRlKGlub2RlLCBjbHVzdGVyLT5lbmQgKyAxIC0gb2Zmc2V0KTsKKwlyZXQgPSBzZXR1cF9leHRlbnRfbWFwcGluZyhpbm9kZSwgY2x1c3Rlci0+c3RhcnQgLSBvZmZzZXQsCisJCQkJICAgY2x1c3Rlci0+ZW5kIC0gb2Zmc2V0LCBjbHVzdGVyLT5zdGFydCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJZmlsZV9yYV9zdGF0ZV9pbml0KHJhLCBpbm9kZS0+aV9tYXBwaW5nKTsKIAotCWZvciAoaSA9IGZpcnN0X2luZGV4IDsgaSA8PSBsYXN0X2luZGV4OyBpKyspIHsKLQkJaWYgKHRvdGFsX3JlYWQgJSByYS0+cmFfcGFnZXMgPT0gMCkgewotCQkJYnRyZnNfZm9yY2VfcmEoaW5vZGUtPmlfbWFwcGluZywgcmEsIE5VTEwsIGksCi0JCQkJbWluKGxhc3RfaW5kZXgsIHJhLT5yYV9wYWdlcyArIGkgLSAxKSk7Ci0JCX0KLQkJdG90YWxfcmVhZCsrOwotYWdhaW46Ci0JCWlmICgoKHU2NClpIDw8IFBBR0VfQ0FDSEVfU0hJRlQpID4gaV9zaXplX3JlYWQoaW5vZGUpKQotCQkJQlVHX09OKDEpOwotCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGkpOworCVdBUk5fT04oY2x1c3Rlci0+c3RhcnQgIT0gY2x1c3Rlci0+Ym91bmRhcnlbMF0pOworCXdoaWxlIChpbmRleCA8PSBsYXN0X2luZGV4KSB7CisJCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCk7CiAJCWlmICghcGFnZSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCXBhZ2VfY2FjaGVfc3luY19yZWFkYWhlYWQoaW5vZGUtPmlfbWFwcGluZywKKwkJCQkJCSAgcmEsIE5VTEwsIGluZGV4LAorCQkJCQkJICBsYXN0X2luZGV4ICsgMSAtIGluZGV4KTsKKwkJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOworCQkJaWYgKCFwYWdlKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CiAJCX0KKworCQlpZiAoUGFnZVJlYWRhaGVhZChwYWdlKSkgeworCQkJcGFnZV9jYWNoZV9hc3luY19yZWFkYWhlYWQoaW5vZGUtPmlfbWFwcGluZywKKwkJCQkJCSAgIHJhLCBOVUxMLCBwYWdlLCBpbmRleCwKKwkJCQkJCSAgIGxhc3RfaW5kZXggKyAxIC0gaW5kZXgpOworCQl9CisKIAkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKIAkJCWJ0cmZzX3JlYWRwYWdlKE5VTEwsIHBhZ2UpOwogCQkJbG9ja19wYWdlKHBhZ2UpOwpAQCAtMjU4OSw3NSArMjYzNiw3OSBAQAogCQkJCWdvdG8gb3V0X3VubG9jazsKIAkJCX0KIAkJfQotCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCiAJCXBhZ2Vfc3RhcnQgPSAodTY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJCXBhZ2VfZW5kID0gcGFnZV9zdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7Ci0JCWxvY2tfZXh0ZW50KGlvX3RyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CiAKLQkJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9vcmRlcmVkX2V4dGVudChpbm9kZSwgcGFnZV9zdGFydCk7Ci0JCWlmIChvcmRlcmVkKSB7Ci0JCQl1bmxvY2tfZXh0ZW50KGlvX3RyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7Ci0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWJ0cmZzX3N0YXJ0X29yZGVyZWRfZXh0ZW50KGlub2RlLCBvcmRlcmVkLCAxKTsKLQkJCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKLQkJCWdvdG8gYWdhaW47Ci0JCX0KKwkJbG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAorCQkJICAgIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CisKIAkJc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChwYWdlKTsKIAotCQlpZiAoaSA9PSBmaXJzdF9pbmRleCkKLQkJCXNldF9leHRlbnRfYml0cyhpb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwKKwkJaWYgKG5yIDwgY2x1c3Rlci0+bnIgJiYKKwkJICAgIHBhZ2Vfc3RhcnQgKyBvZmZzZXQgPT0gY2x1c3Rlci0+Ym91bmRhcnlbbnJdKSB7CisJCQlzZXRfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAorCQkJCQlwYWdlX3N0YXJ0LCBwYWdlX2VuZCwKIAkJCQkJRVhURU5UX0JPVU5EQVJZLCBHRlBfTk9GUyk7CisJCQlucisrOworCQl9CiAJCWJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kKTsKIAogCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKLQkJdG90YWxfZGlydHkrKzsKKwkJZGlydHlfcGFnZSsrOwogCi0JCXVubG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwkJdW5sb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkgICAgICBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCisJCWluZGV4Kys7CisJCWlmIChuciA8IGNsdXN0ZXItPm5yICYmCisJCSAgICBwYWdlX2VuZCArIDEgKyBvZmZzZXQgPT0gY2x1c3Rlci0+Ym91bmRhcnlbbnJdKSB7CisJCQliYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yKGlub2RlLT5pX21hcHBpbmcsCisJCQkJCQkJICAgZGlydHlfcGFnZSk7CisJCQlkaXJ0eV9wYWdlID0gMDsKKwkJfQogCX0KKwlpZiAoZGlydHlfcGFnZSkgeworCQliYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yKGlub2RlLT5pX21hcHBpbmcsCisJCQkJCQkgICBkaXJ0eV9wYWdlKTsKKwl9CisJV0FSTl9PTihuciAhPSBjbHVzdGVyLT5ucik7CiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWtmcmVlKHJhKTsKLQliYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yKGlub2RlLT5pX21hcHBpbmcsIHRvdGFsX2RpcnR5KTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCi1pbnQgcmVsb2NhdGVfZGF0YV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ0cmZzX2tleSAqZXh0ZW50X2tleSkKK2ludCByZWxvY2F0ZV9kYXRhX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnRyZnNfa2V5ICpleHRlbnRfa2V5LAorCQkJIHN0cnVjdCBmaWxlX2V4dGVudF9jbHVzdGVyICpjbHVzdGVyKQogewotCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7Ci0Jc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7Ci0Jc3RydWN0IGV4dGVudF9tYXAgKmVtOwotCXU2NCBzdGFydCA9IGV4dGVudF9rZXktPm9iamVjdGlkIC0gQlRSRlNfSShpbm9kZSktPmluZGV4X2NudDsKLQl1NjQgZW5kID0gc3RhcnQgKyBleHRlbnRfa2V5LT5vZmZzZXQgLSAxOworCWludCByZXQ7CiAKLQllbSA9IGFsbG9jX2V4dGVudF9tYXAoR0ZQX05PRlMpOwotCWVtLT5zdGFydCA9IHN0YXJ0OwotCWVtLT5sZW4gPSBleHRlbnRfa2V5LT5vZmZzZXQ7Ci0JZW0tPmJsb2NrX2xlbiA9IGV4dGVudF9rZXktPm9mZnNldDsKLQllbS0+YmxvY2tfc3RhcnQgPSBleHRlbnRfa2V5LT5vYmplY3RpZDsKLQllbS0+YmRldiA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OwotCXNldF9iaXQoRVhURU5UX0ZMQUdfUElOTkVELCAmZW0tPmZsYWdzKTsKLQotCS8qIHNldHVwIGV4dGVudCBtYXAgdG8gY2hlYXQgYnRyZnNfcmVhZHBhZ2UgKi8KLQlsb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKLQl3aGlsZSAoMSkgewotCQlpbnQgcmV0OwotCQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOwotCQlyZXQgPSBhZGRfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0pOwotCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7Ci0JCWlmIChyZXQgIT0gLUVFWElTVCkgewotCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBzdGFydCwgZW5kLCAwKTsKKwlpZiAoY2x1c3Rlci0+bnIgPiAwICYmIGV4dGVudF9rZXktPm9iamVjdGlkICE9IGNsdXN0ZXItPmVuZCArIDEpIHsKKwkJcmV0ID0gcmVsb2NhdGVfZmlsZV9leHRlbnRfY2x1c3Rlcihpbm9kZSwgY2x1c3Rlcik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQljbHVzdGVyLT5uciA9IDA7CiAJfQotCXVubG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7CiAKLQlyZXR1cm4gcmVsb2NhdGVfaW5vZGVfcGFnZXMoaW5vZGUsIHN0YXJ0LCBleHRlbnRfa2V5LT5vZmZzZXQpOworCWlmICghY2x1c3Rlci0+bnIpCisJCWNsdXN0ZXItPnN0YXJ0ID0gZXh0ZW50X2tleS0+b2JqZWN0aWQ7CisJZWxzZQorCQlCVUdfT04oY2x1c3Rlci0+bnIgPj0gTUFYX0VYVEVOVFMpOworCWNsdXN0ZXItPmVuZCA9IGV4dGVudF9rZXktPm9iamVjdGlkICsgZXh0ZW50X2tleS0+b2Zmc2V0IC0gMTsKKwljbHVzdGVyLT5ib3VuZGFyeVtjbHVzdGVyLT5ucl0gPSBleHRlbnRfa2V5LT5vYmplY3RpZDsKKwljbHVzdGVyLT5ucisrOworCisJaWYgKGNsdXN0ZXItPm5yID49IE1BWF9FWFRFTlRTKSB7CisJCXJldCA9IHJlbG9jYXRlX2ZpbGVfZXh0ZW50X2NsdXN0ZXIoaW5vZGUsIGNsdXN0ZXIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJY2x1c3Rlci0+bnIgPSAwOworCX0KKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIEJUUkZTX0NPTVBBVF9FWFRFTlRfVFJFRV9WMApAQCAtMzIwMywxMCArMzI1NCwxMiBAQAogCXJldHVybiAwOwogfQogCisKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IHJlbG9jYXRlX2Jsb2NrX2dyb3VwKHN0cnVjdCByZWxvY19jb250cm9sICpyYykKIHsKIAlzdHJ1Y3QgcmJfcm9vdCBibG9ja3MgPSBSQl9ST09UOwogCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBmaWxlX2V4dGVudF9jbHVzdGVyICpjbHVzdGVyOwogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zID0gTlVMTDsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpOwpAQCAtMzIxNiwxMCArMzI2OSwxNyBAQAogCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAKKwljbHVzdGVyID0ga3phbGxvYyhzaXplb2YoKmNsdXN0ZXIpLCBHRlBfTk9GUyk7CisJaWYgKCFjbHVzdGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXJjLT5leHRlbnRzX2ZvdW5kID0gMDsKKwlyYy0+ZXh0ZW50c19za2lwcGVkID0gMDsKKwogCXJjLT5zZWFyY2hfc3RhcnQgPSByYy0+YmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZDsKIAljbGVhcl9leHRlbnRfYml0cygmcmMtPnByb2Nlc3NlZF9ibG9ja3MsIDAsICh1NjQpLTEsIEVYVEVOVF9ESVJUWSwKIAkJCSAgR0ZQX05PRlMpOwpAQCAtMzMwNiwxNCArMzM2NiwxNSBAQAogCQl9CiAKIAkJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7Ci0JCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcmMtPmV4dGVudF9yb290KTsKKwkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByYy0+ZXh0ZW50X3Jvb3QpOwogCQl0cmFucyA9IE5VTEw7CiAJCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocmMtPmV4dGVudF9yb290LCBucik7CiAKIAkJaWYgKHJjLT5zdGFnZSA9PSBNT1ZFX0RBVEFfRVhURU5UUyAmJgogCQkgICAgKGZsYWdzICYgQlRSRlNfRVhURU5UX0ZMQUdfREFUQSkpIHsKIAkJCXJjLT5mb3VuZF9maWxlX2V4dGVudCA9IDE7Ci0JCQlyZXQgPSByZWxvY2F0ZV9kYXRhX2V4dGVudChyYy0+ZGF0YV9pbm9kZSwgJmtleSk7CisJCQlyZXQgPSByZWxvY2F0ZV9kYXRhX2V4dGVudChyYy0+ZGF0YV9pbm9kZSwKKwkJCQkJCSAgICZrZXksIGNsdXN0ZXIpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQllcnIgPSByZXQ7CiAJCQkJYnJlYWs7CkBAIC0zMzI4LDYgKzMzODksMTQgQEAKIAkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyYy0+ZXh0ZW50X3Jvb3QsIG5yKTsKIAl9CiAKKwlpZiAoIWVycikgeworCQlyZXQgPSByZWxvY2F0ZV9maWxlX2V4dGVudF9jbHVzdGVyKHJjLT5kYXRhX2lub2RlLCBjbHVzdGVyKTsKKwkJaWYgKHJldCA8IDApCisJCQllcnIgPSByZXQ7CisJfQorCisJa2ZyZWUoY2x1c3Rlcik7CisKIAlyYy0+Y3JlYXRlX3JlbG9jX3Jvb3QgPSAwOwogCXNtcF9tYigpOwogCkBAIC0zMzQ4LDggKzM0MTcsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5zZXJ0X29ycGhhbl9pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJIHU2NCBvYmplY3RpZCwgdTY0IHNpemUpCisJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2JqZWN0aWQpCiB7CiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKml0ZW07CkBAIC0zMzY4LDcgKzM0MzYsNyBAQAogCWl0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOwogCW1lbXNldF9leHRlbnRfYnVmZmVyKGxlYWYsIDAsICh1bnNpZ25lZCBsb25nKWl0ZW0sIHNpemVvZigqaXRlbSkpOwogCWJ0cmZzX3NldF9pbm9kZV9nZW5lcmF0aW9uKGxlYWYsIGl0ZW0sIDEpOwotCWJ0cmZzX3NldF9pbm9kZV9zaXplKGxlYWYsIGl0ZW0sIHNpemUpOworCWJ0cmZzX3NldF9pbm9kZV9zaXplKGxlYWYsIGl0ZW0sIDApOwogCWJ0cmZzX3NldF9pbm9kZV9tb2RlKGxlYWYsIGl0ZW0sIFNfSUZSRUcgfCAwNjAwKTsKIAlidHJmc19zZXRfaW5vZGVfZmxhZ3MobGVhZiwgaXRlbSwgQlRSRlNfSU5PREVfTk9DT01QUkVTUyk7CiAJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CkBAIC0zNDA0LDEyICszNDcyLDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCWVyciA9IF9faW5zZXJ0X29ycGhhbl9pbm9kZSh0cmFucywgcm9vdCwgb2JqZWN0aWQsIGdyb3VwLT5rZXkub2Zmc2V0KTsKLQlCVUdfT04oZXJyKTsKLQotCWVyciA9IGJ0cmZzX2luc2VydF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgb2JqZWN0aWQsIDAsIDAsIDAsCi0JCQkJICAgICAgIGdyb3VwLT5rZXkub2Zmc2V0LCAwLCBncm91cC0+a2V5Lm9mZnNldCwKLQkJCQkgICAgICAgMCwgMCwgMCk7CisJZXJyID0gX19pbnNlcnRfb3JwaGFuX2lub2RlKHRyYW5zLCByb290LCBvYmplY3RpZCk7CiAJQlVHX09OKGVycik7CiAKIAlrZXkub2JqZWN0aWQgPSBvYmplY3RpZDsKQEAgLTM0NTUsNyArMzUxOCw3IEBACiAJQlVHX09OKCFyYy0+YmxvY2tfZ3JvdXApOwogCiAJYnRyZnNfaW5pdF93b3JrZXJzKCZyYy0+d29ya2VycywgInJlbG9jYXRlIiwKLQkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCQkJICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSwgTlVMTCk7CiAKIAlyYy0+ZXh0ZW50X3Jvb3QgPSBleHRlbnRfcm9vdDsKIAlidHJmc19wcmVwYXJlX2Jsb2NrX2dyb3VwX3JlbG9jYXRpb24oZXh0ZW50X3Jvb3QsIHJjLT5ibG9ja19ncm91cCk7CkBAIC0zNDc1LDE0ICszNTM4LDE1IEBACiAJYnRyZnNfd2FpdF9vcmRlcmVkX2V4dGVudHMoZnNfaW5mby0+dHJlZV9yb290LCAwKTsKIAogCXdoaWxlICgxKSB7Ci0JCW11dGV4X2xvY2soJmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOwotCQlidHJmc19jbGVhbl9vbGRfc25hcHNob3RzKGZzX2luZm8tPnRyZWVfcm9vdCk7Ci0JCW11dGV4X3VubG9jaygmZnNfaW5mby0+Y2xlYW5lcl9tdXRleCk7Ci0KIAkJcmMtPmV4dGVudHNfZm91bmQgPSAwOwogCQlyYy0+ZXh0ZW50c19za2lwcGVkID0gMDsKIAorCQltdXRleF9sb2NrKCZmc19pbmZvLT5jbGVhbmVyX211dGV4KTsKKworCQlidHJmc19jbGVhbl9vbGRfc25hcHNob3RzKGZzX2luZm8tPnRyZWVfcm9vdCk7CiAJCXJldCA9IHJlbG9jYXRlX2Jsb2NrX2dyb3VwKHJjKTsKKworCQltdXRleF91bmxvY2soJmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZXJyID0gcmV0OwogCQkJYnJlYWs7CkBAIC0zNTE0LDEwICszNTc4LDEwIEBACiAJCX0KIAl9CiAKLQlmaWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UoZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZywKLQkJCQkgcmMtPmJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQsCi0JCQkJIHJjLT5ibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsKLQkJCQkgcmMtPmJsb2NrX2dyb3VwLT5rZXkub2Zmc2V0IC0gMSk7CisJZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nLAorCQkJCSAgICAgcmMtPmJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQsCisJCQkJICAgICByYy0+YmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCArCisJCQkJICAgICByYy0+YmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQgLSAxKTsKIAogCVdBUk5fT04ocmMtPmJsb2NrX2dyb3VwLT5waW5uZWQgPiAwKTsKIAlXQVJOX09OKHJjLT5ibG9ja19ncm91cC0+cmVzZXJ2ZWQgPiAwKTsKQEAgLTM1MzAsNiArMzU5NCwyNiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IG1hcmtfZ2FyYmFnZV9yb290KHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCWludCByZXQ7CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwgMSk7CisKKwltZW1zZXQoJnJvb3QtPnJvb3RfaXRlbS5kcm9wX3Byb2dyZXNzLCAwLAorCQlzaXplb2Yocm9vdC0+cm9vdF9pdGVtLmRyb3BfcHJvZ3Jlc3MpKTsKKwlyb290LT5yb290X2l0ZW0uZHJvcF9sZXZlbCA9IDA7CisJYnRyZnNfc2V0X3Jvb3RfcmVmcygmcm9vdC0+cm9vdF9pdGVtLCAwKTsKKwlyZXQgPSBidHJmc191cGRhdGVfcm9vdCh0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LAorCQkJCSZyb290LT5yb290X2tleSwgJnJvb3QtPnJvb3RfaXRlbSk7CisJQlVHX09OKHJldCk7CisKKwlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCk7CisJQlVHX09OKHJldCk7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiByZWNvdmVyIHJlbG9jYXRpb24gaW50ZXJydXB0ZWQgYnkgc3lzdGVtIGNyYXNoLgogICoKQEAgLTM1ODksOCArMzY3MywxMiBAQAogCQkJZnNfcm9vdCA9IHJlYWRfZnNfcm9vdChyb290LT5mc19pbmZvLAogCQkJCQkgICAgICAgcmVsb2Nfcm9vdC0+cm9vdF9rZXkub2Zmc2V0KTsKIAkJCWlmIChJU19FUlIoZnNfcm9vdCkpIHsKLQkJCQllcnIgPSBQVFJfRVJSKGZzX3Jvb3QpOwotCQkJCWdvdG8gb3V0OworCQkJCXJldCA9IFBUUl9FUlIoZnNfcm9vdCk7CisJCQkJaWYgKHJldCAhPSAtRU5PRU5UKSB7CisJCQkJCWVyciA9IHJldDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCW1hcmtfZ2FyYmFnZV9yb290KHJlbG9jX3Jvb3QpOwogCQkJfQogCQl9CiAKQEAgLTM2MTMsNyArMzcwMSw3IEBACiAJbWFwcGluZ190cmVlX2luaXQoJnJjLT5yZWxvY19yb290X3RyZWUpOwogCUlOSVRfTElTVF9IRUFEKCZyYy0+cmVsb2Nfcm9vdHMpOwogCWJ0cmZzX2luaXRfd29ya2VycygmcmMtPndvcmtlcnMsICJyZWxvY2F0ZSIsCi0JCQkgICByb290LT5mc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKTsKKwkJCSAgIHJvb3QtPmZzX2luZm8tPnRocmVhZF9wb29sX3NpemUsIE5VTEwpOwogCXJjLT5leHRlbnRfcm9vdCA9IHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290OwogCiAJc2V0X3JlbG9jX2NvbnRyb2wocmMpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcm9vdC10cmVlLmMgYi9mcy9idHJmcy9yb290LXRyZWUuYwppbmRleCAwZGRjNmQ2Li45MzUxNDI4IDEwMDY0NAotLS0gYS9mcy9idHJmcy9yb290LXRyZWUuYworKysgYi9mcy9idHJmcy9yb290LXRyZWUuYwpAQCAtOTQsMTcgKzk0LDIzIEBACiAJCWdvdG8gb3V0OwogCiAJQlVHX09OKHJldCA9PSAwKTsKLQlsID0gcGF0aC0+bm9kZXNbMF07Ci0JQlVHX09OKHBhdGgtPnNsb3RzWzBdID09IDApOwotCXNsb3QgPSBwYXRoLT5zbG90c1swXSAtIDE7Ci0JYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGwsICZmb3VuZF9rZXksIHNsb3QpOwotCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gb2JqZWN0aWQpIHsKKwlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkgewogCQlyZXQgPSAxOwogCQlnb3RvIG91dDsKIAl9Ci0JcmVhZF9leHRlbnRfYnVmZmVyKGwsIGl0ZW0sIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsLCBzbG90KSwKLQkJCSAgIHNpemVvZigqaXRlbSkpOwotCW1lbWNweShrZXksICZmb3VuZF9rZXksIHNpemVvZihmb3VuZF9rZXkpKTsKKwlsID0gcGF0aC0+bm9kZXNbMF07CisJc2xvdCA9IHBhdGgtPnNsb3RzWzBdIC0gMTsKKwlidHJmc19pdGVtX2tleV90b19jcHUobCwgJmZvdW5kX2tleSwgc2xvdCk7CisJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBvYmplY3RpZCB8fAorCSAgICBmb3VuZF9rZXkudHlwZSAhPSBCVFJGU19ST09UX0lURU1fS0VZKSB7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoaXRlbSkKKwkJcmVhZF9leHRlbnRfYnVmZmVyKGwsIGl0ZW0sIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsLCBzbG90KSwKKwkJCQkgICBzaXplb2YoKml0ZW0pKTsKKwlpZiAoa2V5KQorCQltZW1jcHkoa2V5LCAmZm91bmRfa2V5LCBzaXplb2YoZm91bmRfa2V5KSk7CiAJcmV0ID0gMDsKIG91dDoKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CkBAIC0yNDksNiArMjU1LDU5IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGJ0cmZzX2ZpbmRfb3JwaGFuX3Jvb3RzKHN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJaW50IGVyciA9IDA7CisJaW50IHJldDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX09SUEhBTl9PQkpFQ1RJRDsKKwlrZXkudHlwZSA9IEJUUkZTX09SUEhBTl9JVEVNX0tFWTsKKwlrZXkub2Zmc2V0ID0gMDsKKworCXdoaWxlICgxKSB7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHRyZWVfcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIgPSByZXQ7CisJCQlicmVhazsKKwkJfQorCisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpKSB7CisJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYodHJlZV9yb290LCBwYXRoKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWVyciA9IHJldDsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlicmVhazsKKwkJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJfQorCisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAma2V5LCBwYXRoLT5zbG90c1swXSk7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aCh0cmVlX3Jvb3QsIHBhdGgpOworCisJCWlmIChrZXkub2JqZWN0aWQgIT0gQlRSRlNfT1JQSEFOX09CSkVDVElEIHx8CisJCSAgICBrZXkudHlwZSAhPSBCVFJGU19PUlBIQU5fSVRFTV9LRVkpCisJCQlicmVhazsKKworCQlyZXQgPSBidHJmc19maW5kX2RlYWRfcm9vdHModHJlZV9yb290LCBrZXkub2Zmc2V0KTsKKwkJaWYgKHJldCkgeworCQkJZXJyID0gcmV0OworCQkJYnJlYWs7CisJCX0KKworCQlrZXkub2Zmc2V0Kys7CisJfQorCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiBlcnI7Cit9CisKIC8qIGRyb3AgdGhlIHJvb3QgaXRlbSBmb3IgJ2tleScgZnJvbSAncm9vdCcgKi8KIGludCBidHJmc19kZWxfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCSAgIHN0cnVjdCBidHJmc19rZXkgKmtleSkKQEAgLTI3OCwzMSArMzM3LDU3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmIDAgLyogdGhpcyB3aWxsIGdldCB1c2VkIHdoZW4gc25hcHNob3QgZGVsZXRpb24gaXMgaW1wbGVtZW50ZWQgKi8KIGludCBidHJmc19kZWxfcm9vdF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAotCQkgICAgICAgdTY0IHJvb3RfaWQsIHU4IHR5cGUsIHU2NCByZWZfaWQpCisJCSAgICAgICB1NjQgcm9vdF9pZCwgdTY0IHJlZl9pZCwgdTY0IGRpcmlkLCB1NjQgKnNlcXVlbmNlLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKQorCiB7Ci0Jc3RydWN0IGJ0cmZzX2tleSBrZXk7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9yZWYgKnJlZjsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmV0OwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJa2V5Lm9iamVjdGlkID0gcm9vdF9pZDsKLQlrZXkudHlwZSA9IHR5cGU7CisJa2V5LnR5cGUgPSBCVFJGU19ST09UX0JBQ0tSRUZfS0VZOwogCWtleS5vZmZzZXQgPSByZWZfaWQ7Ci0KK2FnYWluOgogCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCB0cmVlX3Jvb3QsICZrZXksIHBhdGgsIC0xLCAxKTsKLQlCVUdfT04ocmV0KTsKKwlCVUdfT04ocmV0IDwgMCk7CisJaWYgKHJldCA9PSAwKSB7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJcmVmID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdF9yZWYpOwogCi0JcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHRyZWVfcm9vdCwgcGF0aCk7Ci0JQlVHX09OKHJldCk7CisJCVdBUk5fT04oYnRyZnNfcm9vdF9yZWZfZGlyaWQobGVhZiwgcmVmKSAhPSBkaXJpZCk7CisJCVdBUk5fT04oYnRyZnNfcm9vdF9yZWZfbmFtZV9sZW4obGVhZiwgcmVmKSAhPSBuYW1lX2xlbik7CisJCXB0ciA9ICh1bnNpZ25lZCBsb25nKShyZWYgKyAxKTsKKwkJV0FSTl9PTihtZW1jbXBfZXh0ZW50X2J1ZmZlcihsZWFmLCBuYW1lLCBwdHIsIG5hbWVfbGVuKSk7CisJCSpzZXF1ZW5jZSA9IGJ0cmZzX3Jvb3RfcmVmX3NlcXVlbmNlKGxlYWYsIHJlZik7CisKKwkJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHRyZWVfcm9vdCwgcGF0aCk7CisJCUJVR19PTihyZXQpOworCX0gZWxzZQorCQllcnIgPSAtRU5PRU5UOworCisJaWYgKGtleS50eXBlID09IEJUUkZTX1JPT1RfQkFDS1JFRl9LRVkpIHsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHRyZWVfcm9vdCwgcGF0aCk7CisJCWtleS5vYmplY3RpZCA9IHJlZl9pZDsKKwkJa2V5LnR5cGUgPSBCVFJGU19ST09UX1JFRl9LRVk7CisJCWtleS5vZmZzZXQgPSByb290X2lkOworCQlnb3RvIGFnYWluOworCX0KIAogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnI7CiB9Ci0jZW5kaWYKIAogaW50IGJ0cmZzX2ZpbmRfcm9vdF9yZWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCwKIAkJICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCkBAIC0zMTksNyArNDA0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KIC8qCiAgKiBhZGQgYSBidHJmc19yb290X3JlZiBpdGVtLiAgdHlwZSBpcyBlaXRoZXIgQlRSRlNfUk9PVF9SRUZfS0VZCiAgKiBvciBCVFJGU19ST09UX0JBQ0tSRUZfS0VZLgpAQCAtMzM1LDggKzQxOSw3IEBACiAgKi8KIGludCBidHJmc19hZGRfcm9vdF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAotCQkgICAgICAgdTY0IHJvb3RfaWQsIHU4IHR5cGUsIHU2NCByZWZfaWQsCi0JCSAgICAgICB1NjQgZGlyaWQsIHU2NCBzZXF1ZW5jZSwKKwkJICAgICAgIHU2NCByb290X2lkLCB1NjQgcmVmX2lkLCB1NjQgZGlyaWQsIHU2NCBzZXF1ZW5jZSwKIAkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbikKIHsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKQEAgLTM0NiwxMyArNDI5LDE0IEBACiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAJdW5zaWduZWQgbG9uZyBwdHI7CiAKLQogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWtleS5vYmplY3RpZCA9IHJvb3RfaWQ7Ci0Ja2V5LnR5cGUgPSB0eXBlOworCWtleS50eXBlID0gQlRSRlNfUk9PVF9CQUNLUkVGX0tFWTsKIAlrZXkub2Zmc2V0ID0gcmVmX2lkOwotCithZ2FpbjoKIAlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgdHJlZV9yb290LCBwYXRoLCAma2V5LAogCQkJCSAgICAgIHNpemVvZigqcmVmKSArIG5hbWVfbGVuKTsKIAlCVUdfT04ocmV0KTsKQEAgLTM2Niw2ICs0NTAsMTQgQEAKIAl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIG5hbWUsIHB0ciwgbmFtZV9sZW4pOwogCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlYWYpOwogCisJaWYgKGtleS50eXBlID09IEJUUkZTX1JPT1RfQkFDS1JFRl9LRVkpIHsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHRyZWVfcm9vdCwgcGF0aCk7CisJCWtleS5vYmplY3RpZCA9IHJlZl9pZDsKKwkJa2V5LnR5cGUgPSBCVFJGU19ST09UX1JFRl9LRVk7CisJCWtleS5vZmZzZXQgPSByb290X2lkOworCQlnb3RvIGFnYWluOworCX0KKwogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3VwZXIuYyBiL2ZzL2J0cmZzL3N1cGVyLmMKaW5kZXggMmRiMTdjZC4uNzUyYTU0NiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvc3VwZXIuYworKysgYi9mcy9idHJmcy9zdXBlci5jCkBAIC02Niw3ICs2Niw4IEBACiAJT3B0X2RlZ3JhZGVkLCBPcHRfc3Vidm9sLCBPcHRfZGV2aWNlLCBPcHRfbm9kYXRhc3VtLCBPcHRfbm9kYXRhY293LAogCU9wdF9tYXhfZXh0ZW50LCBPcHRfbWF4X2lubGluZSwgT3B0X2FsbG9jX3N0YXJ0LCBPcHRfbm9iYXJyaWVyLAogCU9wdF9zc2QsIE9wdF9ub3NzZCwgT3B0X3NzZF9zcHJlYWQsIE9wdF90aHJlYWRfcG9vbCwgT3B0X25vYWNsLAotCU9wdF9jb21wcmVzcywgT3B0X25vdHJlZWxvZywgT3B0X3JhdGlvLCBPcHRfZmx1c2hvbmNvbW1pdCwgT3B0X2VyciwKKwlPcHRfY29tcHJlc3MsIE9wdF9ub3RyZWVsb2csIE9wdF9yYXRpbywgT3B0X2ZsdXNob25jb21taXQsCisJT3B0X2Rpc2NhcmQsIE9wdF9lcnIsCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC04OCw2ICs4OSw3IEBACiAJe09wdF9ub3RyZWVsb2csICJub3RyZWVsb2cifSwKIAl7T3B0X2ZsdXNob25jb21taXQsICJmbHVzaG9uY29tbWl0In0sCiAJe09wdF9yYXRpbywgIm1ldGFkYXRhX3JhdGlvPSVkIn0sCisJe09wdF9kaXNjYXJkLCAiZGlzY2FyZCJ9LAogCXtPcHRfZXJyLCBOVUxMfSwKIH07CiAKQEAgLTI1Nyw2ICsyNTksOSBAQAogCQkJCSAgICAgICBpbmZvLT5tZXRhZGF0YV9yYXRpbyk7CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfZGlzY2FyZDoKKwkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBESVNDQVJEKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTM0NCw3ICszNDksOSBAQAogCXNiLT5zX2V4cG9ydF9vcCA9ICZidHJmc19leHBvcnRfb3BzOwogCXNiLT5zX3hhdHRyID0gYnRyZnNfeGF0dHJfaGFuZGxlcnM7CiAJc2ItPnNfdGltZV9ncmFuID0gMTsKKyNpZmRlZiBDT05GSUdfQlRSRlNfRlNfUE9TSVhfQUNMCiAJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CisjZW5kaWYKIAogCXRyZWVfcm9vdCA9IG9wZW5fY3RyZWUoc2IsIGZzX2RldmljZXMsIChjaGFyICopZGF0YSk7CiAKQEAgLTY3Niw2ICs2ODMsNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYnRyZnNfc3VwZXJfb3BzID0geworCS5kcm9wX2lub2RlCT0gYnRyZnNfZHJvcF9pbm9kZSwKIAkuZGVsZXRlX2lub2RlCT0gYnRyZnNfZGVsZXRlX2lub2RlLAogCS5wdXRfc3VwZXIJPSBidHJmc19wdXRfc3VwZXIsCiAJLnN5bmNfZnMJPSBidHJmc19zeW5jX2ZzLApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKaW5kZXggY2RiYjUwMi4uYmNhODJhNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYworKysgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCkBAIC0xMDQsNyArMTA0LDYgQEAKIHsKIAlpZiAocm9vdC0+cmVmX2Nvd3MgJiYgcm9vdC0+bGFzdF90cmFucyA8IHRyYW5zLT50cmFuc2lkKSB7CiAJCVdBUk5fT04ocm9vdCA9PSByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCk7Ci0JCVdBUk5fT04ocm9vdC0+cm9vdF9pdGVtLnJlZnMgPT0gMCk7CiAJCVdBUk5fT04ocm9vdC0+Y29tbWl0X3Jvb3QgIT0gcm9vdC0+bm9kZSk7CiAKIAkJcmFkaXhfdHJlZV90YWdfc2V0KCZyb290LT5mc19pbmZvLT5mc19yb290c19yYWRpeCwKQEAgLTE4Nyw2ICsxODYsOSBAQAogCWgtPmFsbG9jX2V4Y2x1ZGVfc3RhcnQgPSAwOwogCWgtPmRlbGF5ZWRfcmVmX3VwZGF0ZXMgPSAwOwogCisJaWYgKCFjdXJyZW50LT5qb3VybmFsX2luZm8pCisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IGg7CisKIAlyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uLT51c2VfY291bnQrKzsKIAlyZWNvcmRfcm9vdF9pbl90cmFucyhoLCByb290KTsKIAltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKQEAgLTMxOCw2ICszMjAsOSBAQAogCQl3YWtlX3VwKCZjdXJfdHJhbnMtPndyaXRlcl93YWl0KTsKIAlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIAltdXRleF91bmxvY2soJmluZm8tPnRyYW5zX211dGV4KTsKKworCWlmIChjdXJyZW50LT5qb3VybmFsX2luZm8gPT0gdHJhbnMpCisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CiAJbWVtc2V0KHRyYW5zLCAwLCBzaXplb2YoKnRyYW5zKSk7CiAJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX3RyYW5zX2hhbmRsZV9jYWNoZXAsIHRyYW5zKTsKIApAQCAtMzM5LDEwICszNDQsMTAgQEAKIC8qCiAgKiB3aGVuIGJ0cmVlIGJsb2NrcyBhcmUgYWxsb2NhdGVkLCB0aGV5IGhhdmUgc29tZSBjb3JyZXNwb25kaW5nIGJpdHMgc2V0IGZvcgogICogdGhlbSBpbiBvbmUgb2YgdHdvIGV4dGVudF9pbyB0cmVlcy4gIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgYWxsIG9mCi0gKiB0aG9zZSBleHRlbnRzIGFyZSBvbiBkaXNrIGZvciB0cmFuc2FjdGlvbiBvciBsb2cgY29tbWl0CisgKiB0aG9zZSBleHRlbnRzIGFyZSBzZW50IHRvIGRpc2sgYnV0IGRvZXMgbm90IHdhaXQgb24gdGhlbQogICovCi1pbnQgYnRyZnNfd3JpdGVfYW5kX3dhaXRfbWFya2VkX2V4dGVudHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZGlydHlfcGFnZXMpCitpbnQgYnRyZnNfd3JpdGVfbWFya2VkX2V4dGVudHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgICAgc3RydWN0IGV4dGVudF9pb190cmVlICpkaXJ0eV9wYWdlcykKIHsKIAlpbnQgcmV0OwogCWludCBlcnIgPSAwOwpAQCAtMzg5LDYgKzM5NCwyOSBAQAogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQl9CiAJfQorCWlmIChlcnIpCisJCXdlcnIgPSBlcnI7CisJcmV0dXJuIHdlcnI7Cit9CisKKy8qCisgKiB3aGVuIGJ0cmVlIGJsb2NrcyBhcmUgYWxsb2NhdGVkLCB0aGV5IGhhdmUgc29tZSBjb3JyZXNwb25kaW5nIGJpdHMgc2V0IGZvcgorICogdGhlbSBpbiBvbmUgb2YgdHdvIGV4dGVudF9pbyB0cmVlcy4gIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgYWxsIG9mCisgKiB0aG9zZSBleHRlbnRzIGFyZSBvbiBkaXNrIGZvciB0cmFuc2FjdGlvbiBvciBsb2cgY29tbWl0LiAgV2Ugd2FpdAorICogb24gYWxsIHRoZSBwYWdlcyBhbmQgY2xlYXIgdGhlbSBmcm9tIHRoZSBkaXJ0eSBwYWdlcyBzdGF0ZSB0cmVlCisgKi8KK2ludCBidHJmc193YWl0X21hcmtlZF9leHRlbnRzKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgc3RydWN0IGV4dGVudF9pb190cmVlICpkaXJ0eV9wYWdlcykKK3sKKwlpbnQgcmV0OworCWludCBlcnIgPSAwOworCWludCB3ZXJyID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgaW5vZGUgKmJ0cmVlX2lub2RlID0gcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGU7CisJdTY0IHN0YXJ0ID0gMDsKKwl1NjQgZW5kOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisKIAl3aGlsZSAoMSkgewogCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoZGlydHlfcGFnZXMsIDAsICZzdGFydCwgJmVuZCwKIAkJCQkJICAgIEVYVEVOVF9ESVJUWSk7CkBAIC00MTksNiArNDQ3LDIyIEBACiAJcmV0dXJuIHdlcnI7CiB9CiAKKy8qCisgKiB3aGVuIGJ0cmVlIGJsb2NrcyBhcmUgYWxsb2NhdGVkLCB0aGV5IGhhdmUgc29tZSBjb3JyZXNwb25kaW5nIGJpdHMgc2V0IGZvcgorICogdGhlbSBpbiBvbmUgb2YgdHdvIGV4dGVudF9pbyB0cmVlcy4gIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgYWxsIG9mCisgKiB0aG9zZSBleHRlbnRzIGFyZSBvbiBkaXNrIGZvciB0cmFuc2FjdGlvbiBvciBsb2cgY29tbWl0CisgKi8KK2ludCBidHJmc193cml0ZV9hbmRfd2FpdF9tYXJrZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJc3RydWN0IGV4dGVudF9pb190cmVlICpkaXJ0eV9wYWdlcykKK3sKKwlpbnQgcmV0OworCWludCByZXQyOworCisJcmV0ID0gYnRyZnNfd3JpdGVfbWFya2VkX2V4dGVudHMocm9vdCwgZGlydHlfcGFnZXMpOworCXJldDIgPSBidHJmc193YWl0X21hcmtlZF9leHRlbnRzKHJvb3QsIGRpcnR5X3BhZ2VzKTsKKwlyZXR1cm4gcmV0IHx8IHJldDI7Cit9CisKIGludCBidHJmc193cml0ZV9hbmRfd2FpdF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQogewpAQCAtNzIwLDcgKzc2NCw4IEBACiAJbWVtY3B5KG5ld19yb290X2l0ZW0sICZyb290LT5yb290X2l0ZW0sIHNpemVvZigqbmV3X3Jvb3RfaXRlbSkpOwogCiAJa2V5Lm9iamVjdGlkID0gb2JqZWN0aWQ7Ci0Ja2V5Lm9mZnNldCA9IDA7CisJLyogcmVjb3JkIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBjcmVhdGVkIGluIGtleS5vZmZzZXQgKi8KKwlrZXkub2Zmc2V0ID0gdHJhbnMtPnRyYW5zaWQ7CiAJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX1JPT1RfSVRFTV9LRVkpOwogCiAJb2xkID0gYnRyZnNfbG9ja19yb290X25vZGUocm9vdCk7CkBAIC03NDMsNiArNzg4LDcgQEAKIAltZW1jcHkoJnBlbmRpbmctPnJvb3Rfa2V5LCAma2V5LCBzaXplb2Yoa2V5KSk7CiBmYWlsOgogCWtmcmVlKG5ld19yb290X2l0ZW0pOworCWJ0cmZzX3VucmVzZXJ2ZV9tZXRhZGF0YV9zcGFjZShyb290LCA2KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NzgsMjQgKzgyNCwxNCBAQAogCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcGFyZW50X3Jvb3QsIHBhcmVudF9pbm9kZSk7CiAJQlVHX09OKHJldCk7CiAKLQkvKiBhZGQgdGhlIGJhY2tyZWYgZmlyc3QgKi8KIAlyZXQgPSBidHJmc19hZGRfcm9vdF9yZWYodHJhbnMsIHBhcmVudF9yb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCiAJCQkJIHBlbmRpbmctPnJvb3Rfa2V5Lm9iamVjdGlkLAotCQkJCSBCVFJGU19ST09UX0JBQ0tSRUZfS0VZLAogCQkJCSBwYXJlbnRfcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCiAJCQkJIHBhcmVudF9pbm9kZS0+aV9pbm8sIGluZGV4LCBwZW5kaW5nLT5uYW1lLAogCQkJCSBuYW1lbGVuKTsKIAogCUJVR19PTihyZXQpOwogCi0JLyogbm93IGFkZCB0aGUgZm9yd2FyZCByZWYgKi8KLQlyZXQgPSBidHJmc19hZGRfcm9vdF9yZWYodHJhbnMsIHBhcmVudF9yb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCi0JCQkJIHBhcmVudF9yb290LT5yb290X2tleS5vYmplY3RpZCwKLQkJCQkgQlRSRlNfUk9PVF9SRUZfS0VZLAotCQkJCSBwZW5kaW5nLT5yb290X2tleS5vYmplY3RpZCwKLQkJCQkgcGFyZW50X2lub2RlLT5pX2lubywgaW5kZXgsIHBlbmRpbmctPm5hbWUsCi0JCQkJIG5hbWVsZW4pOwotCiAJaW5vZGUgPSBidHJmc19sb29rdXBfZGVudHJ5KHBhcmVudF9pbm9kZSwgcGVuZGluZy0+ZGVudHJ5KTsKIAlkX2luc3RhbnRpYXRlKHBlbmRpbmctPmRlbnRyeSwgaW5vZGUpOwogZmFpbDoKQEAgLTg3NCw3ICs5MTAsNiBAQAogCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDE7CiAJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICpjdXJfdHJhbnM7CiAJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICpwcmV2X3RyYW5zID0gTlVMTDsKLQlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnBpbm5lZF9jb3B5OwogCURFRklORV9XQUlUKHdhaXQpOwogCWludCByZXQ7CiAJaW50IHNob3VsZF9ncm93ID0gMDsKQEAgLTkxNSwxMyArOTUwLDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcGlubmVkX2NvcHkgPSBrbWFsbG9jKHNpemVvZigqcGlubmVkX2NvcHkpLCBHRlBfTk9GUyk7Ci0JaWYgKCFwaW5uZWRfY29weSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlleHRlbnRfaW9fdHJlZV9pbml0KHBpbm5lZF9jb3B5LAotCQkJICAgICByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nLCBHRlBfTk9GUyk7Ci0KIAl0cmFucy0+dHJhbnNhY3Rpb24tPmluX2NvbW1pdCA9IDE7CiAJdHJhbnMtPnRyYW5zYWN0aW9uLT5ibG9ja2VkID0gMTsKIAlpZiAoY3VyX3RyYW5zLT5saXN0LnByZXYgIT0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xpc3QpIHsKQEAgLTEwMTksNiArMTA0Nyw4IEBACiAJcmV0ID0gY29tbWl0X2Nvd29ubHlfcm9vdHModHJhbnMsIHJvb3QpOwogCUJVR19PTihyZXQpOwogCisJYnRyZnNfcHJlcGFyZV9leHRlbnRfY29tbWl0KHRyYW5zLCByb290KTsKKwogCWN1cl90cmFucyA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247CiAJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7CiAJcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbiA9IE5VTEw7CkBAIC0xMDQyLDggKzEwNzIsNiBAQAogCW1lbWNweSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwgJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCiAJICAgICAgIHNpemVvZihyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSk7CiAKLQlidHJmc19jb3B5X3Bpbm5lZChyb290LCBwaW5uZWRfY29weSk7Ci0KIAl0cmFucy0+dHJhbnNhY3Rpb24tPmJsb2NrZWQgPSAwOwogCiAJd2FrZV91cCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCk7CkBAIC0xMDU5LDggKzEwODcsNyBAQAogCSAqLwogCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJlZV9sb2dfbXV0ZXgpOwogCi0JYnRyZnNfZmluaXNoX2V4dGVudF9jb21taXQodHJhbnMsIHJvb3QsIHBpbm5lZF9jb3B5KTsKLQlrZnJlZShwaW5uZWRfY29weSk7CisJYnRyZnNfZmluaXNoX2V4dGVudF9jb21taXQodHJhbnMsIHJvb3QpOwogCiAJLyogZG8gdGhlIGRpcmVjdG9yeSBpbnNlcnRzIG9mIGFueSBwZW5kaW5nIHNuYXBzaG90IGNyZWF0aW9ucyAqLwogCWZpbmlzaF9wZW5kaW5nX3NuYXBzaG90cyh0cmFucywgcm9vdC0+ZnNfaW5mbyk7CkBAIC0xMDc4LDYgKzExMDUsOSBAQAogCiAJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CiAKKwlpZiAoY3VycmVudC0+am91cm5hbF9pbmZvID09IHRyYW5zKQorCQljdXJyZW50LT5qb3VybmFsX2luZm8gPSBOVUxMOworCiAJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX3RyYW5zX2hhbmRsZV9jYWNoZXAsIHRyYW5zKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA5Niw4ICsxMTI2LDEzIEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CiAJCXJvb3QgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgc3RydWN0IGJ0cmZzX3Jvb3QsIHJvb3RfbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJvb3QtPnJvb3RfbGlzdCk7Ci0JCWJ0cmZzX2Ryb3Bfc25hcHNob3Qocm9vdCwgMCk7CisJCWxpc3RfZGVsKCZyb290LT5yb290X2xpc3QpOworCisJCWlmIChidHJmc19oZWFkZXJfYmFja3JlZl9yZXYocm9vdC0+bm9kZSkgPAorCQkgICAgQlRSRlNfTUlYRURfQkFDS1JFRl9SRVYpCisJCQlidHJmc19kcm9wX3NuYXBzaG90KHJvb3QsIDApOworCQllbHNlCisJCQlidHJmc19kcm9wX3NuYXBzaG90KHJvb3QsIDEpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmggYi9mcy9idHJmcy90cmFuc2FjdGlvbi5oCmluZGV4IDY2M2M2NzQuLmQ0ZTNlN2EgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmgKKysrIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uaApAQCAtNzksNiArNzksNyBAQAogCQkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCUJUUkZTX0koaW5vZGUpLT5sYXN0X3RyYW5zID0gdHJhbnMtPnRyYW5zYWN0aW9uLT50cmFuc2lkOworCUJUUkZTX0koaW5vZGUpLT5sYXN0X3N1Yl90cmFucyA9IEJUUkZTX0koaW5vZGUpLT5yb290LT5sb2dfdHJhbnNpZDsKIH0KIAogaW50IGJ0cmZzX2VuZF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKQEAgLTEwNyw1ICsxMDgsOSBAQAogCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290KTsKIGludCBidHJmc193cml0ZV9hbmRfd2FpdF9tYXJrZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJc3RydWN0IGV4dGVudF9pb190cmVlICpkaXJ0eV9wYWdlcyk7CitpbnQgYnRyZnNfd3JpdGVfbWFya2VkX2V4dGVudHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZGlydHlfcGFnZXMpOworaW50IGJ0cmZzX3dhaXRfbWFya2VkX2V4dGVudHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZGlydHlfcGFnZXMpOwogaW50IGJ0cmZzX3RyYW5zYWN0aW9uX2luX2NvbW1pdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyZWUtbG9nLmMgYi9mcy9idHJmcy90cmVlLWxvZy5jCmluZGV4IDMwYzBkNDUuLjc0MTY2NmEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyZWUtbG9nLmMKKysrIGIvZnMvYnRyZnMvdHJlZS1sb2cuYwpAQCAtMTM3LDExICsxMzcsMjAgQEAKIAogCW11dGV4X2xvY2soJnJvb3QtPmxvZ19tdXRleCk7CiAJaWYgKHJvb3QtPmxvZ19yb290KSB7CisJCWlmICghcm9vdC0+bG9nX3N0YXJ0X3BpZCkgeworCQkJcm9vdC0+bG9nX3N0YXJ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKKwkJCXJvb3QtPmxvZ19tdWx0aXBsZV9waWRzID0gZmFsc2U7CisJCX0gZWxzZSBpZiAocm9vdC0+bG9nX3N0YXJ0X3BpZCAhPSBjdXJyZW50LT5waWQpIHsKKwkJCXJvb3QtPmxvZ19tdWx0aXBsZV9waWRzID0gdHJ1ZTsKKwkJfQorCiAJCXJvb3QtPmxvZ19iYXRjaCsrOwogCQlhdG9taWNfaW5jKCZyb290LT5sb2dfd3JpdGVycyk7CiAJCW11dGV4X3VubG9jaygmcm9vdC0+bG9nX211dGV4KTsKIAkJcmV0dXJuIDA7CiAJfQorCXJvb3QtPmxvZ19tdWx0aXBsZV9waWRzID0gZmFsc2U7CisJcm9vdC0+bG9nX3N0YXJ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKIAltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX2xvZ19tdXRleCk7CiAJaWYgKCFyb290LT5mc19pbmZvLT5sb2dfcm9vdF90cmVlKSB7CiAJCXJldCA9IGJ0cmZzX2luaXRfbG9nX3Jvb3RfdHJlZSh0cmFucywgcm9vdC0+ZnNfaW5mbyk7CkBAIC0yNjMsOCArMjcyLDggQEAKIAkJCSAgICAgIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjLCB1NjQgZ2VuKQogewogCWlmICh3Yy0+cGluKQotCQlidHJmc191cGRhdGVfcGlubmVkX2V4dGVudHMobG9nLT5mc19pbmZvLT5leHRlbnRfcm9vdCwKLQkJCQkJICAgIGViLT5zdGFydCwgZWItPmxlbiwgMSk7CisJCWJ0cmZzX3Bpbl9leHRlbnQobG9nLT5mc19pbmZvLT5leHRlbnRfcm9vdCwKKwkJCQkgZWItPnN0YXJ0LCBlYi0+bGVuLCAwKTsKIAogCWlmIChidHJmc19idWZmZXJfdXB0b2RhdGUoZWIsIGdlbikpIHsKIAkJaWYgKHdjLT53cml0ZSkKQEAgLTUzNCw3ICs1NDMsNyBAQAogCXNhdmVkX25ieXRlcyA9IGlub2RlX2dldF9ieXRlcyhpbm9kZSk7CiAJLyogZHJvcCBhbnkgb3ZlcmxhcHBpbmcgZXh0ZW50cyAqLwogCXJldCA9IGJ0cmZzX2Ryb3BfZXh0ZW50cyh0cmFucywgcm9vdCwgaW5vZGUsCi0JCQkgc3RhcnQsIGV4dGVudF9lbmQsIGV4dGVudF9lbmQsIHN0YXJ0LCAmYWxsb2NfaGludCk7CisJCQkgc3RhcnQsIGV4dGVudF9lbmQsIGV4dGVudF9lbmQsIHN0YXJ0LCAmYWxsb2NfaGludCwgMSk7CiAJQlVHX09OKHJldCk7CiAKIAlpZiAoZm91bmRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9SRUcgfHwKQEAgLTE5NzEsNiArMTk4MCw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nID0gcm9vdC0+bG9nX3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZ19yb290X3RyZWUgPSByb290LT5mc19pbmZvLT5sb2dfcm9vdF90cmVlOworCXU2NCBsb2dfdHJhbnNpZCA9IDA7CiAKIAltdXRleF9sb2NrKCZyb290LT5sb2dfbXV0ZXgpOwogCWluZGV4MSA9IHJvb3QtPmxvZ190cmFuc2lkICUgMjsKQEAgLTE5ODcsMTAgKzE5OTcsMTEgQEAKIAogCXdoaWxlICgxKSB7CiAJCXVuc2lnbmVkIGxvbmcgYmF0Y2ggPSByb290LT5sb2dfYmF0Y2g7Ci0JCW11dGV4X3VubG9jaygmcm9vdC0+bG9nX211dGV4KTsKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JCW11dGV4X2xvY2soJnJvb3QtPmxvZ19tdXRleCk7Ci0KKwkJaWYgKHJvb3QtPmxvZ19tdWx0aXBsZV9waWRzKSB7CisJCQltdXRleF91bmxvY2soJnJvb3QtPmxvZ19tdXRleCk7CisJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJCW11dGV4X2xvY2soJnJvb3QtPmxvZ19tdXRleCk7CisJCX0KIAkJd2FpdF9mb3Jfd3JpdGVyKHRyYW5zLCByb290KTsKIAkJaWYgKGJhdGNoID09IHJvb3QtPmxvZ19iYXRjaCkKIAkJCWJyZWFrOwpAQCAtMjAwMywxNCArMjAxNCwxOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBidHJmc193cml0ZV9hbmRfd2FpdF9tYXJrZWRfZXh0ZW50cyhsb2csICZsb2ctPmRpcnR5X2xvZ19wYWdlcyk7CisJLyogd2Ugc3RhcnQgSU8gb24gIGFsbCB0aGUgbWFya2VkIGV4dGVudHMgaGVyZSwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisJICogd2FpdCBmb3IgdGhlbSB1bnRpbCBsYXRlci4KKwkgKi8KKwlyZXQgPSBidHJmc193cml0ZV9tYXJrZWRfZXh0ZW50cyhsb2csICZsb2ctPmRpcnR5X2xvZ19wYWdlcyk7CiAJQlVHX09OKHJldCk7CiAKIAlidHJmc19zZXRfcm9vdF9ub2RlKCZsb2ctPnJvb3RfaXRlbSwgbG9nLT5ub2RlKTsKIAogCXJvb3QtPmxvZ19iYXRjaCA9IDA7CisJbG9nX3RyYW5zaWQgPSByb290LT5sb2dfdHJhbnNpZDsKIAlyb290LT5sb2dfdHJhbnNpZCsrOwogCWxvZy0+bG9nX3RyYW5zaWQgPSByb290LT5sb2dfdHJhbnNpZDsKKwlyb290LT5sb2dfc3RhcnRfcGlkID0gMDsKIAlzbXBfbWIoKTsKIAkvKgogCSAqIGxvZyB0cmVlIGhhcyBiZWVuIGZsdXNoZWQgdG8gZGlzaywgbmV3IG1vZGlmaWNhdGlvbnMgb2YKQEAgLTIwMzYsNiArMjA1Miw3IEBACiAKIAlpbmRleDIgPSBsb2dfcm9vdF90cmVlLT5sb2dfdHJhbnNpZCAlIDI7CiAJaWYgKGF0b21pY19yZWFkKCZsb2dfcm9vdF90cmVlLT5sb2dfY29tbWl0W2luZGV4Ml0pKSB7CisJCWJ0cmZzX3dhaXRfbWFya2VkX2V4dGVudHMobG9nLCAmbG9nLT5kaXJ0eV9sb2dfcGFnZXMpOwogCQl3YWl0X2xvZ19jb21taXQodHJhbnMsIGxvZ19yb290X3RyZWUsCiAJCQkJbG9nX3Jvb3RfdHJlZS0+bG9nX3RyYW5zaWQpOwogCQltdXRleF91bmxvY2soJmxvZ19yb290X3RyZWUtPmxvZ19tdXRleCk7CkBAIC0yMDU1LDYgKzIwNzIsNyBAQAogCSAqIGNoZWNrIHRoZSBmdWxsIGNvbW1pdCBmbGFnIGFnYWluCiAJICovCiAJaWYgKHJvb3QtPmZzX2luZm8tPmxhc3RfdHJhbnNfbG9nX2Z1bGxfY29tbWl0ID09IHRyYW5zLT50cmFuc2lkKSB7CisJCWJ0cmZzX3dhaXRfbWFya2VkX2V4dGVudHMobG9nLCAmbG9nLT5kaXJ0eV9sb2dfcGFnZXMpOwogCQltdXRleF91bmxvY2soJmxvZ19yb290X3RyZWUtPmxvZ19tdXRleCk7CiAJCXJldCA9IC1FQUdBSU47CiAJCWdvdG8gb3V0X3dha2VfbG9nX3Jvb3Q7CkBAIC0yMDYzLDYgKzIwODEsNyBAQAogCXJldCA9IGJ0cmZzX3dyaXRlX2FuZF93YWl0X21hcmtlZF9leHRlbnRzKGxvZ19yb290X3RyZWUsCiAJCQkJJmxvZ19yb290X3RyZWUtPmRpcnR5X2xvZ19wYWdlcyk7CiAJQlVHX09OKHJldCk7CisJYnRyZnNfd2FpdF9tYXJrZWRfZXh0ZW50cyhsb2csICZsb2ctPmRpcnR5X2xvZ19wYWdlcyk7CiAKIAlidHJmc19zZXRfc3VwZXJfbG9nX3Jvb3QoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQsCiAJCQkJbG9nX3Jvb3RfdHJlZS0+bm9kZS0+c3RhcnQpOwpAQCAtMjA4Miw5ICsyMTAxLDE0IEBACiAJICogdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24gb3Blbiwgc28gYSBmdWxsIGNvbW1pdCBjYW4ndCBob3AKIAkgKiBpbiBhbmQgY2F1c2UgcHJvYmxlbXMgZWl0aGVyLgogCSAqLwotCXdyaXRlX2N0cmVlX3N1cGVyKHRyYW5zLCByb290LT5mc19pbmZvLT50cmVlX3Jvb3QsIDIpOworCXdyaXRlX2N0cmVlX3N1cGVyKHRyYW5zLCByb290LT5mc19pbmZvLT50cmVlX3Jvb3QsIDEpOwogCXJldCA9IDA7CiAKKwltdXRleF9sb2NrKCZyb290LT5sb2dfbXV0ZXgpOworCWlmIChyb290LT5sYXN0X2xvZ19jb21taXQgPCBsb2dfdHJhbnNpZCkKKwkJcm9vdC0+bGFzdF9sb2dfY29tbWl0ID0gbG9nX3RyYW5zaWQ7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5sb2dfbXV0ZXgpOworCiBvdXRfd2FrZV9sb2dfcm9vdDoKIAlhdG9taWNfc2V0KCZsb2dfcm9vdF90cmVlLT5sb2dfY29tbWl0W2luZGV4Ml0sIDApOwogCXNtcF9tYigpOwpAQCAtMjg0MSw3ICsyODY1LDcgQEAKIAkJaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+ZF9pbm9kZSB8fCBzYiAhPSBwYXJlbnQtPmRfaW5vZGUtPmlfc2IpCiAJCQlicmVhazsKIAotCQlpZiAocGFyZW50ID09IHNiLT5zX3Jvb3QpCisJCWlmIChJU19ST09UKHBhcmVudCkpCiAJCQlicmVhazsKIAogCQlwYXJlbnQgPSBwYXJlbnQtPmRfcGFyZW50OwpAQCAtMjg1Miw2ICsyODc2LDIxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBpbm9kZV9pbl9sb2coc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZyb290LT5sb2dfbXV0ZXgpOworCWlmIChCVFJGU19JKGlub2RlKS0+bG9nZ2VkX3RyYW5zID09IHRyYW5zLT50cmFuc2lkICYmCisJICAgIEJUUkZTX0koaW5vZGUpLT5sYXN0X3N1Yl90cmFucyA8PSByb290LT5sYXN0X2xvZ19jb21taXQpCisJCXJldCA9IDE7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5sb2dfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKwogLyoKICAqIGhlbHBlciBmdW5jdGlvbiBhcm91bmQgYnRyZnNfbG9nX2lub2RlIHRvIG1ha2Ugc3VyZSBuZXdseSBjcmVhdGVkCiAgKiBwYXJlbnQgZGlyZWN0b3JpZXMgYWxzbyBlbmQgdXAgaW4gdGhlIGxvZy4gIEEgbWluaW1hbCBpbm9kZSBhbmQgYmFja3JlZgpAQCAtMjg4MCwxMSArMjkxOSwyMiBAQAogCQlnb3RvIGVuZF9ub190cmFuczsKIAl9CiAKKwlpZiAocm9vdCAhPSBCVFJGU19JKGlub2RlKS0+cm9vdCB8fAorCSAgICBidHJmc19yb290X3JlZnMoJnJvb3QtPnJvb3RfaXRlbSkgPT0gMCkgeworCQlyZXQgPSAxOworCQlnb3RvIGVuZF9ub190cmFuczsKKwl9CisKIAlyZXQgPSBjaGVja19wYXJlbnRfZGlyc19mb3Jfc3luYyh0cmFucywgaW5vZGUsIHBhcmVudCwKIAkJCQkJIHNiLCBsYXN0X2NvbW1pdHRlZCk7CiAJaWYgKHJldCkKIAkJZ290byBlbmRfbm9fdHJhbnM7CiAKKwlpZiAoaW5vZGVfaW5fbG9nKHRyYW5zLCBpbm9kZSkpIHsKKwkJcmV0ID0gQlRSRlNfTk9fTE9HX1NZTkM7CisJCWdvdG8gZW5kX25vX3RyYW5zOworCX0KKwogCXN0YXJ0X2xvZ190cmFucyh0cmFucywgcm9vdCk7CiAKIAlyZXQgPSBidHJmc19sb2dfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlLCBpbm9kZV9vbmx5KTsKQEAgLTI5MDcsMTIgKzI5NTcsMTUgQEAKIAkJCWJyZWFrOwogCiAJCWlub2RlID0gcGFyZW50LT5kX2lub2RlOworCQlpZiAocm9vdCAhPSBCVFJGU19JKGlub2RlKS0+cm9vdCkKKwkJCWJyZWFrOworCiAJCWlmIChCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiA+CiAJCSAgICByb290LT5mc19pbmZvLT5sYXN0X3RyYW5zX2NvbW1pdHRlZCkgewogCQkJcmV0ID0gYnRyZnNfbG9nX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSwgaW5vZGVfb25seSk7CiAJCQlCVUdfT04ocmV0KTsKIAkJfQotCQlpZiAocGFyZW50ID09IHNiLT5zX3Jvb3QpCisJCWlmIChJU19ST09UKHBhcmVudCkpCiAJCQlicmVhazsKIAogCQlwYXJlbnQgPSBwYXJlbnQtPmRfcGFyZW50OwpAQCAtMjk1MSw3ICszMDA0LDYgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IHRtcF9rZXk7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZzsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IGxvZ19yb290X3RyZWUtPmZzX2luZm87Ci0JdTY0IGhpZ2hlc3RfaW5vZGU7CiAJc3RydWN0IHdhbGtfY29udHJvbCB3YyA9IHsKIAkJLnByb2Nlc3NfZnVuYyA9IHByb2Nlc3Nfb25lX2J1ZmZlciwKIAkJLnN0YWdlID0gMCwKQEAgLTMwMTAsMTEgKzMwNjIsNiBAQAogCQkJCQkJICAgICAgcGF0aCk7CiAJCQlCVUdfT04ocmV0KTsKIAkJfQotCQlyZXQgPSBidHJmc19maW5kX2hpZ2hlc3RfaW5vZGUod2MucmVwbGF5X2Rlc3QsICZoaWdoZXN0X2lub2RlKTsKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQl3Yy5yZXBsYXlfZGVzdC0+aGlnaGVzdF9pbm9kZSA9IGhpZ2hlc3RfaW5vZGU7Ci0JCQl3Yy5yZXBsYXlfZGVzdC0+bGFzdF9pbm9kZV9hbGxvYyA9IGhpZ2hlc3RfaW5vZGU7Ci0JCX0KIAogCQlrZXkub2Zmc2V0ID0gZm91bmRfa2V5Lm9mZnNldCAtIDE7CiAJCXdjLnJlcGxheV9kZXN0LT5sb2dfcm9vdCA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmVlLWxvZy5oIGIvZnMvYnRyZnMvdHJlZS1sb2cuaAppbmRleCBkMDljNzYwLi4wNzc2ZWFjIDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmVlLWxvZy5oCisrKyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmgKQEAgLTE5LDYgKzE5LDkgQEAKICNpZm5kZWYgX19UUkVFX0xPR18KICNkZWZpbmUgX19UUkVFX0xPR18KIAorLyogcmV0dXJuIHZhbHVlIGZvciBidHJmc19sb2dfZGVudHJ5X3NhZmUgdGhhdCBtZWFucyB3ZSBkb24ndCBuZWVkIHRvIGxvZyBpdCBhdCBhbGwgKi8KKyNkZWZpbmUgQlRSRlNfTk9fTE9HX1NZTkMgMjU2CisKIGludCBidHJmc19zeW5jX2xvZyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogaW50IGJ0cmZzX2ZyZWVfbG9nKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy92b2x1bWVzLmMgYi9mcy9idHJmcy92b2x1bWVzLmMKaW5kZXggNWNmNDA1Yi4uN2VkYTQ4MyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdm9sdW1lcy5jCisrKyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJCSAqIGlzIG5vdyBjb25nZXN0ZWQuICBCYWNrIG9mZiBhbmQgbGV0IG90aGVyIHdvcmsgc3RydWN0cwogCQkgKiBydW4gaW5zdGVhZAogCQkgKi8KLQkJaWYgKHBlbmRpbmcgJiYgYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpICYmIGJhdGNoX3J1biA+IDMyICYmCisJCWlmIChwZW5kaW5nICYmIGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSAmJiBiYXRjaF9ydW4gPiA4ICYmCiAJCSAgICBmc19pbmZvLT5mc19kZXZpY2VzLT5vcGVuX2RldmljZXMgPiAxKSB7CiAJCQlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jOwogCkBAIC00NDYsOCArNDQ2LDEwIEBACiAJCQlnb3RvIGVycm9yOwogCiAJCWRldmljZS0+bmFtZSA9IGtzdHJkdXAob3JpZ19kZXYtPm5hbWUsIEdGUF9OT0ZTKTsKLQkJaWYgKCFkZXZpY2UtPm5hbWUpCisJCWlmICghZGV2aWNlLT5uYW1lKSB7CisJCQlrZnJlZShkZXZpY2UpOwogCQkJZ290byBlcnJvcjsKKwkJfQogCiAJCWRldmljZS0+ZGV2aWQgPSBvcmlnX2Rldi0+ZGV2aWQ7CiAJCWRldmljZS0+d29yay5mdW5jID0gcGVuZGluZ19iaW9zX2ZuOwpAQCAtNzE5LDEwICs3MjEsOSBAQAogICogY2FsbGVkIHZlcnkgaW5mcmVxdWVudGx5IGFuZCB0aGF0IGEgZ2l2ZW4gZGV2aWNlIGhhcyBhIHNtYWxsIG51bWJlcgogICogb2YgZXh0ZW50cwogICovCi1zdGF0aWMgbm9pbmxpbmUgaW50IGZpbmRfZnJlZV9kZXZfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCQkgc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlLAotCQkJCQkgdTY0IG51bV9ieXRlcywgdTY0ICpzdGFydCwKLQkJCQkJIHU2NCAqbWF4X2F2YWlsKQoraW50IGZpbmRfZnJlZV9kZXZfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSwgdTY0IG51bV9ieXRlcywKKwkJCSB1NjQgKnN0YXJ0LCB1NjQgKm1heF9hdmFpbCkKIHsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGRldmljZS0+ZGV2X3Jvb3Q7CkBAIC0xNzM2LDYgKzE3MzcsMTAgQEAKIAlleHRlbnRfcm9vdCA9IHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290OwogCWVtX3RyZWUgPSAmcm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlLm1hcF90cmVlOwogCisJcmV0ID0gYnRyZnNfY2FuX3JlbG9jYXRlKGV4dGVudF9yb290LCBjaHVua19vZmZzZXQpOworCWlmIChyZXQpCisJCXJldHVybiAtRU5PU1BDOworCiAJLyogc3RlcCBvbmUsIHJlbG9jYXRlIGFsbCB0aGUgZXh0ZW50cyBpbnNpZGUgdGhpcyBjaHVuayAqLwogCXJldCA9IGJ0cmZzX3JlbG9jYXRlX2Jsb2NrX2dyb3VwKGV4dGVudF9yb290LCBjaHVua19vZmZzZXQpOwogCUJVR19PTihyZXQpOwpAQCAtMTc0OSw5ICsxNzU0LDkgQEAKIAkgKiBzdGVwIHR3bywgZGVsZXRlIHRoZSBkZXZpY2UgZXh0ZW50cyBhbmQgdGhlCiAJICogY2h1bmsgdHJlZSBlbnRyaWVzCiAJICovCi0Jc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwlyZWFkX2xvY2soJmVtX3RyZWUtPmxvY2spOwogCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGNodW5rX29mZnNldCwgMSk7Ci0Jc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCXJlYWRfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAogCUJVR19PTihlbS0+c3RhcnQgPiBjaHVua19vZmZzZXQgfHwKIAkgICAgICAgZW0tPnN0YXJ0ICsgZW0tPmxlbiA8IGNodW5rX29mZnNldCk7CkBAIC0xNzgwLDkgKzE3ODUsOSBAQAogCXJldCA9IGJ0cmZzX3JlbW92ZV9ibG9ja19ncm91cCh0cmFucywgZXh0ZW50X3Jvb3QsIGNodW5rX29mZnNldCk7CiAJQlVHX09OKHJldCk7CiAKLQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCXdyaXRlX2xvY2soJmVtX3RyZWUtPmxvY2spOwogCXJlbW92ZV9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBlbSk7Ci0Jc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCXdyaXRlX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAKIAlrZnJlZShtYXApOwogCWVtLT5iZGV2ID0gTlVMTDsKQEAgLTE4MDcsMTIgKzE4MTIsMTUgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKIAl1NjQgY2h1bmtfdHJlZSA9IGNodW5rX3Jvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkOwogCXU2NCBjaHVua190eXBlOworCWJvb2wgcmV0cmllZCA9IGZhbHNlOworCWludCBmYWlsZWQgPSAwOwogCWludCByZXQ7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKK2FnYWluOgogCWtleS5vYmplY3RpZCA9IEJUUkZTX0ZJUlNUX0NIVU5LX1RSRUVfT0JKRUNUSUQ7CiAJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CiAJa2V5LnR5cGUgPSBCVFJGU19DSFVOS19JVEVNX0tFWTsKQEAgLTE4NDIsNyArMTg1MCwxMCBAQAogCQkJcmV0ID0gYnRyZnNfcmVsb2NhdGVfY2h1bmsoY2h1bmtfcm9vdCwgY2h1bmtfdHJlZSwKIAkJCQkJCSAgIGZvdW5kX2tleS5vYmplY3RpZCwKIAkJCQkJCSAgIGZvdW5kX2tleS5vZmZzZXQpOwotCQkJQlVHX09OKHJldCk7CisJCQlpZiAocmV0ID09IC1FTk9TUEMpCisJCQkJZmFpbGVkKys7CisJCQllbHNlIGlmIChyZXQpCisJCQkJQlVHKCk7CiAJCX0KIAogCQlpZiAoZm91bmRfa2V5Lm9mZnNldCA9PSAwKQpAQCAtMTg1MCw2ICsxODYxLDE0IEBACiAJCWtleS5vZmZzZXQgPSBmb3VuZF9rZXkub2Zmc2V0IC0gMTsKIAl9CiAJcmV0ID0gMDsKKwlpZiAoZmFpbGVkICYmICFyZXRyaWVkKSB7CisJCWZhaWxlZCA9IDA7CisJCXJldHJpZWQgPSB0cnVlOworCQlnb3RvIGFnYWluOworCX0gZWxzZSBpZiAoZmFpbGVkICYmIHJldHJpZWQpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0ID0gLUVOT1NQQzsKKwl9CiBlcnJvcjoKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJcmV0dXJuIHJldDsKQEAgLTE4OTQsNiArMTkxMyw4IEBACiAJCQljb250aW51ZTsKIAogCQlyZXQgPSBidHJmc19zaHJpbmtfZGV2aWNlKGRldmljZSwgb2xkX3NpemUgLSBzaXplX3RvX2ZyZWUpOworCQlpZiAocmV0ID09IC1FTk9TUEMpCisJCQlicmVhazsKIAkJQlVHX09OKHJldCk7CiAKIAkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihkZXZfcm9vdCwgMSk7CkBAIC0xOTM4LDkgKzE5NTksOCBAQAogCQljaHVuayA9IGJ0cmZzX2l0ZW1fcHRyKHBhdGgtPm5vZGVzWzBdLAogCQkJCSAgICAgICBwYXRoLT5zbG90c1swXSwKIAkJCQkgICAgICAgc3RydWN0IGJ0cmZzX2NodW5rKTsKLQkJa2V5Lm9mZnNldCA9IGZvdW5kX2tleS5vZmZzZXQ7CiAJCS8qIGNodW5rIHplcm8gaXMgc3BlY2lhbCAqLwotCQlpZiAoa2V5Lm9mZnNldCA9PSAwKQorCQlpZiAoZm91bmRfa2V5Lm9mZnNldCA9PSAwKQogCQkJYnJlYWs7CiAKIAkJYnRyZnNfcmVsZWFzZV9wYXRoKGNodW5rX3Jvb3QsIHBhdGgpOwpAQCAtMTk0OCw3ICsxOTY4LDggQEAKIAkJCQkJICAgY2h1bmtfcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCiAJCQkJCSAgIGZvdW5kX2tleS5vYmplY3RpZCwKIAkJCQkJICAgZm91bmRfa2V5Lm9mZnNldCk7Ci0JCUJVR19PTihyZXQpOworCQlCVUdfT04ocmV0ICYmIHJldCAhPSAtRU5PU1BDKTsKKwkJa2V5Lm9mZnNldCA9IGZvdW5kX2tleS5vZmZzZXQgLSAxOwogCX0KIAlyZXQgPSAwOwogZXJyb3I6CkBAIC0xOTc0LDEwICsxOTk1LDEzIEBACiAJdTY0IGNodW5rX29mZnNldDsKIAlpbnQgcmV0OwogCWludCBzbG90OworCWludCBmYWlsZWQgPSAwOworCWJvb2wgcmV0cmllZCA9IGZhbHNlOwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsOwogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfY29weSA9ICZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OwogCXU2NCBvbGRfdG90YWwgPSBidHJmc19zdXBlcl90b3RhbF9ieXRlcyhzdXBlcl9jb3B5KTsKKwl1NjQgb2xkX3NpemUgPSBkZXZpY2UtPnRvdGFsX2J5dGVzOwogCXU2NCBkaWZmID0gZGV2aWNlLT50b3RhbF9ieXRlcyAtIG5ld19zaXplOwogCiAJaWYgKG5ld19zaXplID49IGRldmljZS0+dG90YWxfYnl0ZXMpCkBAIC0xOTg3LDEyICsyMDExLDYgQEAKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKLQlpZiAoIXRyYW5zKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KIAlwYXRoLT5yZWFkYSA9IDI7CiAKIAlsb2NrX2NodW5rcyhyb290KTsKQEAgLTIwMDEsOCArMjAxOSw4IEBACiAJaWYgKGRldmljZS0+d3JpdGVhYmxlKQogCQlkZXZpY2UtPmZzX2RldmljZXMtPnRvdGFsX3J3X2J5dGVzIC09IGRpZmY7CiAJdW5sb2NrX2NodW5rcyhyb290KTsKLQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCithZ2FpbjoKIAlrZXkub2JqZWN0aWQgPSBkZXZpY2UtPmRldmlkOwogCWtleS5vZmZzZXQgPSAodTY0KS0xOwogCWtleS50eXBlID0gQlRSRlNfREVWX0VYVEVOVF9LRVk7CkBAIC0yMDE3LDYgKzIwMzUsNyBAQAogCQkJZ290byBkb25lOwogCQlpZiAocmV0KSB7CiAJCQlyZXQgPSAwOworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjAyNCwxNCArMjA0MywxOCBAQAogCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CiAJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsLCAma2V5LCBwYXRoLT5zbG90c1swXSk7CiAKLQkJaWYgKGtleS5vYmplY3RpZCAhPSBkZXZpY2UtPmRldmlkKQorCQlpZiAoa2V5Lm9iamVjdGlkICE9IGRldmljZS0+ZGV2aWQpIHsKKwkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKIAkJCWJyZWFrOworCQl9CiAKIAkJZGV2X2V4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKGwsIHNsb3QsIHN0cnVjdCBidHJmc19kZXZfZXh0ZW50KTsKIAkJbGVuZ3RoID0gYnRyZnNfZGV2X2V4dGVudF9sZW5ndGgobCwgZGV2X2V4dGVudCk7CiAKLQkJaWYgKGtleS5vZmZzZXQgKyBsZW5ndGggPD0gbmV3X3NpemUpCisJCWlmIChrZXkub2Zmc2V0ICsgbGVuZ3RoIDw9IG5ld19zaXplKSB7CisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CiAJCQlicmVhazsKKwkJfQogCiAJCWNodW5rX3RyZWUgPSBidHJmc19kZXZfZXh0ZW50X2NodW5rX3RyZWUobCwgZGV2X2V4dGVudCk7CiAJCWNodW5rX29iamVjdGlkID0gYnRyZnNfZGV2X2V4dGVudF9jaHVua19vYmplY3RpZChsLCBkZXZfZXh0ZW50KTsKQEAgLTIwNDAsOCArMjA2MywyNiBAQAogCiAJCXJldCA9IGJ0cmZzX3JlbG9jYXRlX2NodW5rKHJvb3QsIGNodW5rX3RyZWUsIGNodW5rX29iamVjdGlkLAogCQkJCQkgICBjaHVua19vZmZzZXQpOwotCQlpZiAocmV0KQorCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PU1BDKQogCQkJZ290byBkb25lOworCQlpZiAocmV0ID09IC1FTk9TUEMpCisJCQlmYWlsZWQrKzsKKwkJa2V5Lm9mZnNldCAtPSAxOworCX0KKworCWlmIChmYWlsZWQgJiYgIXJldHJpZWQpIHsKKwkJZmFpbGVkID0gMDsKKwkJcmV0cmllZCA9IHRydWU7CisJCWdvdG8gYWdhaW47CisJfSBlbHNlIGlmIChmYWlsZWQgJiYgcmV0cmllZCkgeworCQlyZXQgPSAtRU5PU1BDOworCQlsb2NrX2NodW5rcyhyb290KTsKKworCQlkZXZpY2UtPnRvdGFsX2J5dGVzID0gb2xkX3NpemU7CisJCWlmIChkZXZpY2UtPndyaXRlYWJsZSkKKwkJCWRldmljZS0+ZnNfZGV2aWNlcy0+dG90YWxfcndfYnl0ZXMgKz0gZGlmZjsKKwkJdW5sb2NrX2NodW5rcyhyb290KTsKKwkJZ290byBkb25lOwogCX0KIAogCS8qIFNocmlua2luZyBzdWNjZWVkZWQsIGVsc2Ugd2Ugd291bGQgYmUgYXQgImRvbmUiLiAqLwpAQCAtMjI5NCw5ICsyMzM1LDkgQEAKIAllbS0+YmxvY2tfbGVuID0gZW0tPmxlbjsKIAogCWVtX3RyZWUgPSAmZXh0ZW50X3Jvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZS5tYXBfdHJlZTsKLQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCXdyaXRlX2xvY2soJmVtX3RyZWUtPmxvY2spOwogCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBlbSk7Ci0Jc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCXdyaXRlX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAJQlVHX09OKHJldCk7CiAJZnJlZV9leHRlbnRfbWFwKGVtKTsKIApAQCAtMjQ5MSw5ICsyNTMyLDkgQEAKIAlpbnQgcmVhZG9ubHkgPSAwOwogCWludCBpOwogCi0Jc3Bpbl9sb2NrKCZtYXBfdHJlZS0+bWFwX3RyZWUubG9jayk7CisJcmVhZF9sb2NrKCZtYXBfdHJlZS0+bWFwX3RyZWUubG9jayk7CiAJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoJm1hcF90cmVlLT5tYXBfdHJlZSwgY2h1bmtfb2Zmc2V0LCAxKTsKLQlzcGluX3VubG9jaygmbWFwX3RyZWUtPm1hcF90cmVlLmxvY2spOworCXJlYWRfdW5sb2NrKCZtYXBfdHJlZS0+bWFwX3RyZWUubG9jayk7CiAJaWYgKCFlbSkKIAkJcmV0dXJuIDE7CiAKQEAgLTI1MTgsMTEgKzI1NTksMTEgQEAKIAlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CiAKIAl3aGlsZSAoMSkgewotCQlzcGluX2xvY2soJnRyZWUtPm1hcF90cmVlLmxvY2spOworCQl3cml0ZV9sb2NrKCZ0cmVlLT5tYXBfdHJlZS5sb2NrKTsKIAkJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoJnRyZWUtPm1hcF90cmVlLCAwLCAodTY0KS0xKTsKIAkJaWYgKGVtKQogCQkJcmVtb3ZlX2V4dGVudF9tYXBwaW5nKCZ0cmVlLT5tYXBfdHJlZSwgZW0pOwotCQlzcGluX3VubG9jaygmdHJlZS0+bWFwX3RyZWUubG9jayk7CisJCXdyaXRlX3VubG9jaygmdHJlZS0+bWFwX3RyZWUubG9jayk7CiAJCWlmICghZW0pCiAJCQlicmVhazsKIAkJa2ZyZWUoZW0tPmJkZXYpOwpAQCAtMjU0MCw5ICsyNTgxLDkgQEAKIAlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICplbV90cmVlID0gJm1hcF90cmVlLT5tYXBfdHJlZTsKIAlpbnQgcmV0OwogCi0Jc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwlyZWFkX2xvY2soJmVtX3RyZWUtPmxvY2spOwogCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGxvZ2ljYWwsIGxlbik7Ci0Jc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCXJlYWRfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKIAlCVUdfT04oIWVtKTsKIAogCUJVR19PTihlbS0+c3RhcnQgPiBsb2dpY2FsIHx8IGVtLT5zdGFydCArIGVtLT5sZW4gPCBsb2dpY2FsKTsKQEAgLTI2MDQsOSArMjY0NSw5IEBACiAJCWF0b21pY19zZXQoJm11bHRpLT5lcnJvciwgMCk7CiAJfQogCi0Jc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwlyZWFkX2xvY2soJmVtX3RyZWUtPmxvY2spOwogCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGxvZ2ljYWwsICpsZW5ndGgpOwotCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwlyZWFkX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CiAKIAlpZiAoIWVtICYmIHVucGx1Z19wYWdlKQogCQlyZXR1cm4gMDsKQEAgLTI3NjMsOSArMjgwNCw5IEBACiAJdTY0IHN0cmlwZV9ucjsKIAlpbnQgaSwgaiwgbnIgPSAwOwogCi0Jc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwlyZWFkX2xvY2soJmVtX3RyZWUtPmxvY2spOwogCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGNodW5rX3N0YXJ0LCAxKTsKLQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJcmVhZF91bmxvY2soJmVtX3RyZWUtPmxvY2spOwogCiAJQlVHX09OKCFlbSB8fCBlbS0+c3RhcnQgIT0gY2h1bmtfc3RhcnQpOwogCW1hcCA9IChzdHJ1Y3QgbWFwX2xvb2t1cCAqKWVtLT5iZGV2OwpAQCAtMzA1Myw5ICszMDk0LDkgQEAKIAlsb2dpY2FsID0ga2V5LT5vZmZzZXQ7CiAJbGVuZ3RoID0gYnRyZnNfY2h1bmtfbGVuZ3RoKGxlYWYsIGNodW5rKTsKIAotCXNwaW5fbG9jaygmbWFwX3RyZWUtPm1hcF90cmVlLmxvY2spOworCXJlYWRfbG9jaygmbWFwX3RyZWUtPm1hcF90cmVlLmxvY2spOwogCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKCZtYXBfdHJlZS0+bWFwX3RyZWUsIGxvZ2ljYWwsIDEpOwotCXNwaW5fdW5sb2NrKCZtYXBfdHJlZS0+bWFwX3RyZWUubG9jayk7CisJcmVhZF91bmxvY2soJm1hcF90cmVlLT5tYXBfdHJlZS5sb2NrKTsKIAogCS8qIGFscmVhZHkgbWFwcGVkPyAqLwogCWlmIChlbSAmJiBlbS0+c3RhcnQgPD0gbG9naWNhbCAmJiBlbS0+c3RhcnQgKyBlbS0+bGVuID4gbG9naWNhbCkgewpAQCAtMzExNCw5ICszMTU1LDkgQEAKIAkJbWFwLT5zdHJpcGVzW2ldLmRldi0+aW5fZnNfbWV0YWRhdGEgPSAxOwogCX0KIAotCXNwaW5fbG9jaygmbWFwX3RyZWUtPm1hcF90cmVlLmxvY2spOworCXdyaXRlX2xvY2soJm1hcF90cmVlLT5tYXBfdHJlZS5sb2NrKTsKIAlyZXQgPSBhZGRfZXh0ZW50X21hcHBpbmcoJm1hcF90cmVlLT5tYXBfdHJlZSwgZW0pOwotCXNwaW5fdW5sb2NrKCZtYXBfdHJlZS0+bWFwX3RyZWUubG9jayk7CisJd3JpdGVfdW5sb2NrKCZtYXBfdHJlZS0+bWFwX3RyZWUubG9jayk7CiAJQlVHX09OKHJldCk7CiAJZnJlZV9leHRlbnRfbWFwKGVtKTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5oIGIvZnMvYnRyZnMvdm9sdW1lcy5oCmluZGV4IDUxMzlhODMuLjMxYjBmYWIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuaAorKysgYi9mcy9idHJmcy92b2x1bWVzLmgKQEAgLTE4MSw0ICsxODEsNyBAQAogdm9pZCBidHJmc191bmxvY2tfdm9sdW1lcyh2b2lkKTsKIHZvaWQgYnRyZnNfbG9ja192b2x1bWVzKHZvaWQpOwogaW50IGJ0cmZzX2NodW5rX3JlYWRvbmx5KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgY2h1bmtfb2Zmc2V0KTsKK2ludCBmaW5kX2ZyZWVfZGV2X2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UsIHU2NCBudW1fYnl0ZXMsCisJCQkgdTY0ICpzdGFydCwgdTY0ICptYXhfYXZhaWwpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9idHJmcy94YXR0ci5jIGIvZnMvYnRyZnMveGF0dHIuYwppbmRleCBhOWQzYmY0Li5iNmRkNTk2IDEwMDY0NAotLS0gYS9mcy9idHJmcy94YXR0ci5jCisrKyBiL2ZzL2J0cmZzL3hhdHRyLmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogICogYXR0cmlidXRlcyBhcmUgaGFuZGxlZCBkaXJlY3RseS4KICAqLwogc3RydWN0IHhhdHRyX2hhbmRsZXIgKmJ0cmZzX3hhdHRyX2hhbmRsZXJzW10gPSB7Ci0jaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAorI2lmZGVmIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wKIAkmYnRyZnNfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyLAogCSZidHJmc194YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyLAogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IDIwOWY3ZjEuLjZmYTUzMDIgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0yODAsNyArMjgwLDcgQEAKIEVYUE9SVF9TWU1CT0woaW52YWxpZGF0ZV9iZGV2KTsKIAogLyoKLSAqIEtpY2sgcGRmbHVzaCB0aGVuIHRyeSB0byBmcmVlIHVwIHNvbWUgWk9ORV9OT1JNQUwgbWVtb3J5LgorICogS2ljayB0aGUgd3JpdGViYWNrIHRocmVhZHMgdGhlbiB0cnkgdG8gZnJlZSB1cCBzb21lIFpPTkVfTk9STUFMIG1lbW9yeS4KICAqLwogc3RhdGljIHZvaWQgZnJlZV9tb3JlX21lbW9yeSh2b2lkKQogewpAQCAtMTcwOSw5ICsxNzA5LDkgQEAKIAkJLyoKIAkJICogSWYgaXQncyBhIGZ1bGx5IG5vbi1ibG9ja2luZyB3cml0ZSBhdHRlbXB0IGFuZCB3ZSBjYW5ub3QKIAkJICogbG9jayB0aGUgYnVmZmVyIHRoZW4gcmVkaXJ0eSB0aGUgcGFnZS4gIE5vdGUgdGhhdCB0aGlzIGNhbgotCQkgKiBwb3RlbnRpYWxseSBjYXVzZSBhIGJ1c3ktd2FpdCBsb29wIGZyb20gcGRmbHVzaCBhbmQga3N3YXBkCi0JCSAqIGFjdGl2aXR5LCBidXQgdGhvc2UgY29kZSBwYXRocyBoYXZlIHRoZWlyIG93biBoaWdoZXItbGV2ZWwKLQkJICogdGhyb3R0bGluZy4KKwkJICogcG90ZW50aWFsbHkgY2F1c2UgYSBidXN5LXdhaXQgbG9vcCBmcm9tIHdyaXRlYmFjayB0aHJlYWRzCisJCSAqIGFuZCBrc3dhcGQgYWN0aXZpdHksIGJ1dCB0aG9zZSBjb2RlIHBhdGhzIGhhdmUgdGhlaXIgb3duCisJCSAqIGhpZ2hlci1sZXZlbCB0aHJvdHRsaW5nLgogCQkgKi8KIAkJaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSB8fCAhd2JjLT5ub25ibG9ja2luZykgewogCQkJbG9ja19idWZmZXIoYmgpOwpAQCAtMjIzOSwxNiArMjIzOSwxMCBAQAogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl2b2lkICpmc2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKIAlpbnQgZXJyOwogCi0JZXJyID0gLUVGQklHOwotICAgICAgICBsaW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfRlNJWkVdLnJsaW1fY3VyOwotCWlmIChsaW1pdCAhPSBSTElNX0lORklOSVRZICYmIHNpemUgPiAobG9mZl90KWxpbWl0KSB7Ci0JCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKHNpemUgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykKKwllcnIgPSBpbm9kZV9uZXdzaXplX29rKGlub2RlLCBzaXplKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAogCWVyciA9IHBhZ2VjYWNoZV93cml0ZV9iZWdpbihOVUxMLCBtYXBwaW5nLCBzaXplLCAwLApAQCAtMzIxNCw3ICszMjA4LDcgQEAKICAqIHN0aWxsIHJ1bm5pbmcgb2Jzb2xldGUgZmx1c2ggZGFlbW9ucywgc28gd2UgdGVybWluYXRlIHRoZW0gaGVyZS4KICAqCiAgKiBVc2Ugb2YgYmRmbHVzaCgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBrZXJuZWwuCi0gKiBUaGUgYHBkZmx1c2gnIGtlcm5lbCB0aHJlYWRzIGZ1bGx5IHJlcGxhY2UgYmRmbHVzaCBkYWVtb25zIGFuZCB0aGlzIGNhbGwuCisgKiBUaGUgYGZsdXNoLVgnIGtlcm5lbCB0aHJlYWRzIGZ1bGx5IHJlcGxhY2UgYmRmbHVzaCBkYWVtb25zIGFuZCB0aGlzIGNhbGwuCiAgKi8KIFNZU0NBTExfREVGSU5FMihiZGZsdXNoLCBpbnQsIGZ1bmMsIGxvbmcsIGRhdGEpCiB7CmRpZmYgLS1naXQgYS9mcy9jaGFyX2Rldi5jIGIvZnMvY2hhcl9kZXYuYwppbmRleCAzY2JjNTdmLi5kNmRiOTMzIDEwMDY0NAotLS0gYS9mcy9jaGFyX2Rldi5jCisrKyBiL2ZzL2NoYXJfZGV2LmMKQEAgLTI2NCw3ICsyNjQsNiBAQAogewogCXN0cnVjdCBjaGFyX2RldmljZV9zdHJ1Y3QgKmNkOwogCXN0cnVjdCBjZGV2ICpjZGV2OwotCWNoYXIgKnM7CiAJaW50IGVyciA9IC1FTk9NRU07CiAKIAljZCA9IF9fcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvciwgYmFzZW1pbm9yLCBjb3VudCwgbmFtZSk7CkBAIC0yNzgsOCArMjc3LDYgQEAKIAljZGV2LT5vd25lciA9IGZvcHMtPm93bmVyOwogCWNkZXYtPm9wcyA9IGZvcHM7CiAJa29iamVjdF9zZXRfbmFtZSgmY2Rldi0+a29iaiwgIiVzIiwgbmFtZSk7Ci0JZm9yIChzID0gc3RyY2hyKGtvYmplY3RfbmFtZSgmY2Rldi0+a29iaiksJy8nKTsgczsgcyA9IHN0cmNocihzLCAnLycpKQotCQkqcyA9ICchJzsKIAkJCiAJZXJyID0gY2Rldl9hZGQoY2RldiwgTUtERVYoY2QtPm1ham9yLCBiYXNlbWlub3IpLCBjb3VudCk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvS2NvbmZpZyBiL2ZzL2NpZnMvS2NvbmZpZwppbmRleCA2OTk0YTBmLi44MGYzNTI1IDEwMDY0NAotLS0gYS9mcy9jaWZzL0tjb25maWcKKysrIGIvZnMvY2lmcy9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCXRyaXN0YXRlICJDSUZTIHN1cHBvcnQgKGFkdmFuY2VkIG5ldHdvcmsgZmlsZXN5c3RlbSwgU01CRlMgc3VjY2Vzc29yKSIKIAlkZXBlbmRzIG9uIElORVQKIAlzZWxlY3QgTkxTCisJc2VsZWN0IFNMT1dfV09SSwogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGNsaWVudCBWRlMgbW9kdWxlIGZvciB0aGUgQ29tbW9uIEludGVybmV0IEZpbGUgU3lzdGVtCiAJICAoQ0lGUykgcHJvdG9jb2wgd2hpY2ggaXMgdGhlIHN1Y2Nlc3NvciB0byB0aGUgU2VydmVyIE1lc3NhZ2UgQmxvY2sKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IGQ3OWNlMmUuLjlhNWU0ZjUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtNjQsOSArNjQsNiBAQAogdW5zaWduZWQgaW50IGV4dGVuZGVkX3NlY3VyaXR5ID0gQ0lGU1NFQ19ERUY7CiAvKiB1bnNpZ25lZCBpbnQgbnRsbXYyX3N1cHBvcnQgPSAwOyAqLwogdW5zaWduZWQgaW50IHNpZ25fQ0lGU19QRFVzID0gMTsKLWV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9wbG9ja1RocmVhZDsgLyogcmVtb3ZlIHNwYXJzZSB3YXJuaW5nICovCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgKm9wbG9ja1RocmVhZCA9IE5VTEw7Ci0vKiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICogZG5vdGlmeVRocmVhZDsgcmVtb3ZlIHNwYXJzZSB3YXJuaW5nICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY2lmc19zdXBlcl9vcHM7CiB1bnNpZ25lZCBpbnQgQ0lGU01heEJ1ZlNpemUgPSBDSUZTX01BWF9NU0dTSVpFOwogbW9kdWxlX3BhcmFtKENJRlNNYXhCdWZTaXplLCBpbnQsIDApOwpAQCAtMTg1LDggKzE4Miw3IEBACiAJCQljaWZzX3NiLT5tb3VudGRhdGEgPSBOVUxMOwogCQl9CiAjZW5kaWYKLQkJaWYgKGNpZnNfc2ItPmxvY2FsX25scykKLQkJCXVubG9hZF9ubHMoY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJdW5sb2FkX25scyhjaWZzX3NiLT5sb2NhbF9ubHMpOwogCQlrZnJlZShjaWZzX3NiKTsKIAl9CiAJcmV0dXJuIHJjOwpAQCAtOTczLDg5ICs5NjksMTIgQEAKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19vcGxvY2tfY2FjaGVwKTsKIH0KIAotc3RhdGljIGludCBjaWZzX29wbG9ja190aHJlYWQodm9pZCAqZHVtbXlhcmcpCi17Ci0Jc3RydWN0IG9wbG9ja19xX2VudHJ5ICpvcGxvY2tfaXRlbTsKLQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCV9fdTE2ICBuZXRmaWQ7Ci0JaW50IHJjLCB3YWl0cmMgPSAwOwotCi0Jc2V0X2ZyZWV6YWJsZSgpOwotCWRvIHsKLQkJaWYgKHRyeV90b19mcmVlemUoKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fbG9jaygmY2lmc19vcGxvY2tfbG9jayk7Ci0JCWlmIChsaXN0X2VtcHR5KCZjaWZzX29wbG9ja19saXN0KSkgewotCQkJc3Bpbl91bmxvY2soJmNpZnNfb3Bsb2NrX2xvY2spOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMzkqSFopOwotCQl9IGVsc2UgewotCQkJb3Bsb2NrX2l0ZW0gPSBsaXN0X2VudHJ5KGNpZnNfb3Bsb2NrX2xpc3QubmV4dCwKLQkJCQkJCXN0cnVjdCBvcGxvY2tfcV9lbnRyeSwgcWhlYWQpOwotCQkJY0ZZSSgxLCAoImZvdW5kIG9wbG9jayBpdGVtIHRvIHdyaXRlIG91dCIpKTsKLQkJCXBUY29uID0gb3Bsb2NrX2l0ZW0tPnRjb247Ci0JCQlpbm9kZSA9IG9wbG9ja19pdGVtLT5waW5vZGU7Ci0JCQluZXRmaWQgPSBvcGxvY2tfaXRlbS0+bmV0ZmlkOwotCQkJc3Bpbl91bmxvY2soJmNpZnNfb3Bsb2NrX2xvY2spOwotCQkJRGVsZXRlT3Bsb2NrUUVudHJ5KG9wbG9ja19pdGVtKTsKLQkJCS8qIGNhbiBub3QgZ3JhYiBpbm9kZSBzZW0gaGVyZSBzaW5jZSBpdCB3b3VsZAotCQkJCWRlYWRsb2NrIHdoZW4gb3Bsb2NrIHJlY2VpdmVkIG9uIGRlbGV0ZQotCQkJCXNpbmNlIHZmc191bmxpbmsgaG9sZHMgdGhlIGlfbXV0ZXggYWNyb3NzCi0JCQkJdGhlIGNhbGwgKi8KLQkJCS8qIG11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsqLwotCQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKLSNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKLQkJCQlpZiAoQ0lGU19JKGlub2RlKS0+Y2xpZW50Q2FuQ2FjaGVBbGwgPT0gMCkKLQkJCQkJYnJlYWtfbGVhc2UoaW5vZGUsIEZNT0RFX1JFQUQpOwotCQkJCWVsc2UgaWYgKENJRlNfSShpbm9kZSktPmNsaWVudENhbkNhY2hlUmVhZCA9PSAwKQotCQkJCQlicmVha19sZWFzZShpbm9kZSwgRk1PREVfV1JJVEUpOwotI2VuZGlmCi0JCQkJcmMgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7Ci0JCQkJaWYgKENJRlNfSShpbm9kZSktPmNsaWVudENhbkNhY2hlUmVhZCA9PSAwKSB7Ci0JCQkJCXdhaXRyYyA9IGZpbGVtYXBfZmRhdGF3YWl0KAotCQkJCQkJCSAgICAgIGlub2RlLT5pX21hcHBpbmcpOwotCQkJCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShpbm9kZSk7Ci0JCQkJfQotCQkJCWlmIChyYyA9PSAwKQotCQkJCQlyYyA9IHdhaXRyYzsKLQkJCX0gZWxzZQotCQkJCXJjID0gMDsKLQkJCS8qIG11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOyovCi0JCQlpZiAocmMpCi0JCQkJQ0lGU19JKGlub2RlKS0+d3JpdGVfYmVoaW5kX3JjID0gcmM7Ci0JCQljRllJKDEsICgiT3Bsb2NrIGZsdXNoIGlub2RlICVwIHJjICVkIiwKLQkJCQlpbm9kZSwgcmMpKTsKLQotCQkJCS8qIHJlbGVhc2luZyBzdGFsZSBvcGxvY2sgYWZ0ZXIgcmVjZW50IHJlY29ubmVjdAotCQkJCW9mIHNtYiBzZXNzaW9uIHVzaW5nIGEgbm93IGluY29ycmVjdCBmaWxlCi0JCQkJaGFuZGxlIGlzIG5vdCBhIGRhdGEgaW50ZWdyaXR5IGlzc3VlIGJ1dCBkbwotCQkJCW5vdCBib3RoZXIgc2VuZGluZyBhbiBvcGxvY2sgcmVsZWFzZSBpZiBzZXNzaW9uCi0JCQkJdG8gc2VydmVyIHN0aWxsIGlzIGRpc2Nvbm5lY3RlZCBzaW5jZSBvcGxvY2sKLQkJCQlhbHJlYWR5IHJlbGVhc2VkIGJ5IHRoZSBzZXJ2ZXIgaW4gdGhhdCBjYXNlICovCi0JCQlpZiAoIXBUY29uLT5uZWVkX3JlY29ubmVjdCkgewotCQkJCXJjID0gQ0lGU1NNQkxvY2soMCwgcFRjb24sIG5ldGZpZCwKLQkJCQkJCTAgLyogbGVuICovICwgMCAvKiBvZmZzZXQgKi8sIDAsCi0JCQkJCQkwLCBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UsCi0JCQkJCQlmYWxzZSAvKiB3YWl0IGZsYWcgKi8pOwotCQkJCWNGWUkoMSwgKCJPcGxvY2sgcmVsZWFzZSByYyA9ICVkIiwgcmMpKTsKLQkJCX0KLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOyAgLyogeWllbGQgaW4gY2FzZSBxIHdlcmUgY29ycnVwdCAqLwotCQl9Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBfX2luaXQKIGluaXRfY2lmcyh2b2lkKQogewogCWludCByYyA9IDA7CiAJY2lmc19wcm9jX2luaXQoKTsKIAlJTklUX0xJU1RfSEVBRCgmY2lmc190Y3Bfc2VzX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjaWZzX29wbG9ja19saXN0KTsKICNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKIAlJTklUX0xJU1RfSEVBRCgmR2xvYmFsRG5vdGlmeVJlcUxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZHbG9iYWxEbm90aWZ5UnNwX1EpOwpAQCAtMTA4NCw3ICsxMDAzLDYgQEAKIAlyd2xvY2tfaW5pdCgmR2xvYmFsU01CU2VzbG9jayk7CiAJcndsb2NrX2luaXQoJmNpZnNfdGNwX3Nlc19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmR2xvYmFsTWlkX0xvY2spOwotCXNwaW5fbG9ja19pbml0KCZjaWZzX29wbG9ja19sb2NrKTsKIAogCWlmIChjaWZzX21heF9wZW5kaW5nIDwgMikgewogCQljaWZzX21heF9wZW5kaW5nID0gMjsKQEAgLTExMTksMTYgKzEwMzcsMTMgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0X3VucmVnaXN0ZXJfa2V5X3R5cGU7CiAjZW5kaWYKLQlvcGxvY2tUaHJlYWQgPSBrdGhyZWFkX3J1bihjaWZzX29wbG9ja190aHJlYWQsIE5VTEwsICJjaWZzb3Bsb2NrZCIpOwotCWlmIChJU19FUlIob3Bsb2NrVGhyZWFkKSkgewotCQlyYyA9IFBUUl9FUlIob3Bsb2NrVGhyZWFkKTsKLQkJY0VSUk9SKDEsICgiZXJyb3IgJWQgY3JlYXRlIG9wbG9jayB0aHJlYWQiLCByYykpOwotCQlnb3RvIG91dF91bnJlZ2lzdGVyX2Rmc19rZXlfdHlwZTsKLQl9CisJcmMgPSBzbG93X3dvcmtfcmVnaXN0ZXJfdXNlcigpOworCWlmIChyYykKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9yZXNvbHZlcl9rZXk7CiAKIAlyZXR1cm4gMDsKIAotIG91dF91bnJlZ2lzdGVyX2Rmc19rZXlfdHlwZToKKyBvdXRfdW5yZWdpc3Rlcl9yZXNvbHZlcl9rZXk6CiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAogCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX2Ruc19yZXNvbHZlcik7CiAgb3V0X3VucmVnaXN0ZXJfa2V5X3R5cGU6CkBAIC0xMTY1LDcgKzEwODAsNiBAQAogCWNpZnNfZGVzdHJveV9pbm9kZWNhY2hlKCk7CiAJY2lmc19kZXN0cm95X21pZHMoKTsKIAljaWZzX2Rlc3Ryb3lfcmVxdWVzdF9idWZzKCk7Ci0Ja3RocmVhZF9zdG9wKG9wbG9ja1RocmVhZCk7CiB9CiAKIE1PRFVMRV9BVVRIT1IoIlN0ZXZlIEZyZW5jaCA8c2ZyZW5jaEB1cy5pYm0uY29tPiIpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZ2xvYi5oIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCmluZGV4IDZjZmM4MWEuLjVkMGZkZTEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2dsb2IuaAorKysgYi9mcy9jaWZzL2NpZnNnbG9iLmgKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvc2xvdy13b3JrLmg+CiAjaW5jbHVkZSAiY2lmc19mc19zYi5oIgogI2luY2x1ZGUgImNpZnNhY2wuaCIKIC8qCkBAIC0zNDYsMTQgKzM0NywxNiBAQAogCS8qIGxvY2sgc2NvcGUgaWQgKDAgaWYgbm9uZSkgKi8KIAlzdHJ1Y3QgZmlsZSAqcGZpbGU7IC8qIG5lZWRlZCBmb3Igd3JpdGVwYWdlICovCiAJc3RydWN0IGlub2RlICpwSW5vZGU7IC8qIG5lZWRlZCBmb3Igb3Bsb2NrIGJyZWFrICovCisJc3RydWN0IHZmc21vdW50ICptbnQ7CiAJc3RydWN0IG11dGV4IGxvY2tfbXV0ZXg7CiAJc3RydWN0IGxpc3RfaGVhZCBsbGlzdDsgLyogbGlzdCBvZiBieXRlIHJhbmdlIGxvY2tzIHdlIGhhdmUuICovCiAJYm9vbCBjbG9zZVBlbmQ6MTsJLyogZmlsZSBpcyBtYXJrZWQgdG8gY2xvc2UgKi8KIAlib29sIGludmFsaWRIYW5kbGU6MTsJLyogZmlsZSBjbG9zZWQgdmlhIHNlc3Npb24gYWJlbmQgKi8KLQlib29sIG1lc3NhZ2VNb2RlOjE7CS8qIGZvciBwaXBlczogbWVzc2FnZSB2cyBieXRlIG1vZGUgKi8KKwlib29sIG9wbG9ja19icmVha19jYW5jZWxsZWQ6MTsKIAlhdG9taWNfdCBjb3VudDsJCS8qIHJlZmVyZW5jZSBjb3VudCAqLwogCXN0cnVjdCBtdXRleCBmaF9tdXRleDsgLyogcHJldmVudHMgcmVvcGVuIHJhY2UgYWZ0ZXIgZGVhZCBzZXMqLwogCXN0cnVjdCBjaWZzX3NlYXJjaF9pbmZvIHNyY2hfaW5mOworCXN0cnVjdCBzbG93X3dvcmsgb3Bsb2NrX2JyZWFrOyAvKiBzbG93X3dvcmsgam9iIGZvciBvcGxvY2sgYnJlYWtzICovCiB9OwogCiAvKiBUYWtlIGEgcmVmZXJlbmNlIG9uIHRoZSBmaWxlIHByaXZhdGUgZGF0YSAqLwpAQCAtMzY1LDggKzM2OCwxMCBAQAogLyogUmVsZWFzZSBhIHJlZmVyZW5jZSBvbiB0aGUgZmlsZSBwcml2YXRlIGRhdGEgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBjaWZzRmlsZUluZm9fcHV0KHN0cnVjdCBjaWZzRmlsZUluZm8gKmNpZnNfZmlsZSkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2lmc19maWxlLT5jb3VudCkpCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNpZnNfZmlsZS0+Y291bnQpKSB7CisJCWlwdXQoY2lmc19maWxlLT5wSW5vZGUpOwogCQlrZnJlZShjaWZzX2ZpbGUpOworCX0KIH0KIAogLyoKQEAgLTM4Miw3ICszODcsNiBAQAogCXVuc2lnbmVkIGxvbmcgdGltZTsJLyogamlmZmllcyBvZiBsYXN0IHVwZGF0ZS9jaGVjayBvZiBpbm9kZSAqLwogCWJvb2wgY2xpZW50Q2FuQ2FjaGVSZWFkOjE7CS8qIHJlYWQgb3Bsb2NrICovCiAJYm9vbCBjbGllbnRDYW5DYWNoZUFsbDoxOwkvKiByZWFkIGFuZCB3cml0ZWJlaGluZCBvcGxvY2sgKi8KLQlib29sIG9wbG9ja1BlbmRpbmc6MTsKIAlib29sIGRlbGV0ZV9wZW5kaW5nOjE7CQkvKiBERUxFVEVfT05fQ0xPU0UgaXMgc2V0ICovCiAJdTY0ICBzZXJ2ZXJfZW9mOwkJLyogY3VycmVudCBmaWxlIHNpemUgb24gc2VydmVyICovCiAJdTY0ICB1bmlxdWVpZDsJCQkvKiBzZXJ2ZXIgaW5vZGUgbnVtYmVyICovCkBAIC01ODUsOSArNTg5LDkgQEAKICNkZWZpbmUgICBDSUZTU0VDX01VU1RfTEFOTUFOCTB4MTAwMTAKICNkZWZpbmUgICBDSUZTU0VDX01VU1RfUExOVFhUCTB4MjAwMjAKICNpZmRlZiBDT05GSUdfQ0lGU19VUENBTEwKLSNkZWZpbmUgICBDSUZTU0VDX01BU0sgICAgICAgICAgMHhBRjBBRiAvKiBhbGxvd3Mgd2VhayBzZWN1cml0eSBidXQgYWxzbyBrcmI1ICovCisjZGVmaW5lICAgQ0lGU1NFQ19NQVNLICAgICAgICAgIDB4QkYwQkYgLyogYWxsb3dzIHdlYWsgc2VjdXJpdHkgYnV0IGFsc28ga3JiNSAqLwogI2Vsc2UKLSNkZWZpbmUgICBDSUZTU0VDX01BU0sgICAgICAgICAgMHhBNzBBNyAvKiBjdXJyZW50IGZsYWdzIHN1cHBvcnRlZCBpZiB3ZWFrICovCisjZGVmaW5lICAgQ0lGU1NFQ19NQVNLICAgICAgICAgIDB4QjcwQjcgLyogY3VycmVudCBmbGFncyBzdXBwb3J0ZWQgaWYgd2VhayAqLwogI2VuZGlmIC8qIFVQQ0FMTCAqLwogI2Vsc2UgLyogZG8gbm90IGFsbG93IHdlYWsgcHcgaGFzaCAqLwogI2lmZGVmIENPTkZJR19DSUZTX1VQQ0FMTApAQCAtNjY5LDEyICs2NzMsNiBAQAogICovCiBHTE9CQUxfRVhURVJOIHJ3bG9ja190IEdsb2JhbFNNQlNlc2xvY2s7CiAKLS8qIEdsb2JhbCBsaXN0IG9mIG9wbG9ja3MgKi8KLUdMT0JBTF9FWFRFUk4gc3RydWN0IGxpc3RfaGVhZCBjaWZzX29wbG9ja19saXN0OwotCi0vKiBQcm90ZWN0cyB0aGUgY2lmc19vcGxvY2tfbGlzdCAqLwotR0xPQkFMX0VYVEVSTiBzcGlubG9ja190IGNpZnNfb3Bsb2NrX2xvY2s7Ci0KIC8qIE91dHN0YW5kaW5nIGRpciBub3RpZnkgcmVxdWVzdHMgKi8KIEdMT0JBTF9FWFRFUk4gc3RydWN0IGxpc3RfaGVhZCBHbG9iYWxEbm90aWZ5UmVxTGlzdDsKIC8qIERpck5vdGlmeSByZXNwb25zZSBxdWV1ZSAqLwpAQCAtNzI1LDMgKzcyMyw0IEBACiBHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBjaWZzX21pbl9zbWFsbDsgIC8qIG1pbiBzaXplIG9mIHNtYWxsIGJ1ZiBwb29sICovCiBHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBjaWZzX21heF9wZW5kaW5nOyAvKiBNQVggcmVxdWVzdHMgYXQgb25jZSB0byBzZXJ2ZXIqLwogCitleHRlcm4gY29uc3Qgc3RydWN0IHNsb3dfd29ya19vcHMgY2lmc19vcGxvY2tfYnJlYWtfb3BzOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcHJvdG8uaCBiL2ZzL2NpZnMvY2lmc3Byb3RvLmgKaW5kZXggZGE4ZmJmNS4uNjkyOGMyNCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzcHJvdG8uaAorKysgYi9mcy9jaWZzL2NpZnNwcm90by5oCkBAIC04NiwxOCArODYsMTcgQEAKIAkJCSAgICAgY29uc3QgaW50IHN0YWdlLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY3ApOwogZXh0ZXJuIF9fdTE2IEdldE5leHRNaWQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKTsKLWV4dGVybiBzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKkFsbG9jT3Bsb2NrUUVudHJ5KHN0cnVjdCBpbm9kZSAqLCB1MTYsCi0JCQkJCQkgc3RydWN0IGNpZnNUY29uSW5mbyAqKTsKLWV4dGVybiB2b2lkIERlbGV0ZU9wbG9ja1FFbnRyeShzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKik7Ci1leHRlcm4gdm9pZCBEZWxldGVUY29uT3Bsb2NrUUVudHJpZXMoc3RydWN0IGNpZnNUY29uSW5mbyAqKTsKIGV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgY2lmc19OVHRpbWVUb1VuaXgoX19sZTY0IHV0Y19uYW5vc2Vjb25kc19zaW5jZV8xNjAxKTsKIGV4dGVybiB1NjQgY2lmc19Vbml4VGltZVRvTlQoc3RydWN0IHRpbWVzcGVjKTsKIGV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgY252cnREb3NVbml4VG0oX19sZTE2IGxlX2RhdGUsIF9fbGUxNiBsZV90aW1lLAogCQkJCSAgICAgIGludCBvZmZzZXQpOwogCitleHRlcm4gc3RydWN0IGNpZnNGaWxlSW5mbyAqY2lmc19uZXdfZmlsZWluZm8oc3RydWN0IGlub2RlICpuZXdpbm9kZSwKKwkJCQlfX3UxNiBmaWxlSGFuZGxlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgdmZzbW91bnQgKm1udCwgdW5zaWduZWQgaW50IG9mbGFncyk7CiBleHRlcm4gaW50IGNpZnNfcG9zaXhfb3BlbihjaGFyICpmdWxsX3BhdGgsIHN0cnVjdCBpbm9kZSAqKnBpbm9kZSwKLQkJCSAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlLCBpbnQgb2ZsYWdzLAotCQkJICAgaW50ICpwb3Bsb2NrLCBfX3UxNiAqcG5ldGZpZCwgaW50IHhpZCk7CisJCQkgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwgaW50IG1vZGUsIGludCBvZmxhZ3MsCisJCQkgICBfX3UzMiAqcG9wbG9jaywgX191MTYgKnBuZXRmaWQsIGludCB4aWQpOwogZXh0ZXJuIHZvaWQgY2lmc191bml4X2Jhc2ljX3RvX2ZhdHRyKHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0ciwKIAkJCQkgICAgIEZJTEVfVU5JWF9CQVNJQ19JTkZPICppbmZvLAogCQkJCSAgICAgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYik7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IDMwMWUzMDcuLjk0MTQ0MWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC05NCw2ICs5NCw3IEBACiAJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgdG1wMSwgJnBUY29uLT5vcGVuRmlsZUxpc3QpIHsKIAkJb3Blbl9maWxlID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjaWZzRmlsZUluZm8sIHRsaXN0KTsKIAkJb3Blbl9maWxlLT5pbnZhbGlkSGFuZGxlID0gdHJ1ZTsKKwkJb3Blbl9maWxlLT5vcGxvY2tfYnJlYWtfY2FuY2VsbGVkID0gdHJ1ZTsKIAl9CiAJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKIAkvKiBCQiBBZGQgY2FsbCB0byBpbnZhbGlkYXRlX2lub2RlcyhzYikgZm9yIGFsbCBzdXBlcmJsb2NrcyBtb3VudGVkCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IGQ0OTY4MjQuLmIwOTA5ODAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0xNTc3LDcgKzE1NzcsOCBAQAogCiBvdXRfZXJyOgogCWlmICh0Y3Bfc2VzKSB7Ci0JCWtmcmVlKHRjcF9zZXMtPmhvc3RuYW1lKTsKKwkJaWYgKCFJU19FUlIodGNwX3Nlcy0+aG9zdG5hbWUpKQorCQkJa2ZyZWUodGNwX3Nlcy0+aG9zdG5hbWUpOwogCQlpZiAodGNwX3Nlcy0+c3NvY2tldCkKIAkJCXNvY2tfcmVsZWFzZSh0Y3Bfc2VzLT5zc29ja2V0KTsKIAkJa2ZyZWUodGNwX3Nlcyk7CkBAIC0xNjcwLDcgKzE2NzEsNiBAQAogCUNJRlNTTUJURGlzKHhpZCwgdGNvbik7CiAJX0ZyZWVYaWQoeGlkKTsKIAotCURlbGV0ZVRjb25PcGxvY2tRRW50cmllcyh0Y29uKTsKIAl0Y29uSW5mb0ZyZWUodGNvbik7CiAJY2lmc19wdXRfc21iX3NlcyhzZXMpOwogfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9kaXIuYyBiL2ZzL2NpZnMvZGlyLmMKaW5kZXggYTY0MjRjZi4uNjI3YTYwYSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9kaXIuYworKysgYi9mcy9jaWZzL2Rpci5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSAiY2lmc2ZzLmgiCiAjaW5jbHVkZSAiY2lmc3BkdS5oIgogI2luY2x1ZGUgImNpZnNnbG9iLmgiCkBAIC0xMjksNDQgKzEzMCw0NSBAQAogCXJldHVybiBmdWxsX3BhdGg7CiB9CiAKLXN0YXRpYyB2b2lkCi1jaWZzX2ZpbGxfZmlsZWluZm8oc3RydWN0IGlub2RlICpuZXdpbm9kZSwgX191MTYgZmlsZUhhbmRsZSwKLQkJCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIGJvb2wgd3JpdGVfb25seSkKK3N0cnVjdCBjaWZzRmlsZUluZm8gKgorY2lmc19uZXdfZmlsZWluZm8oc3RydWN0IGlub2RlICpuZXdpbm9kZSwgX191MTYgZmlsZUhhbmRsZSwKKwkJICBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZmc21vdW50ICptbnQsIHVuc2lnbmVkIGludCBvZmxhZ3MpCiB7CiAJaW50IG9wbG9jayA9IDA7CiAJc3RydWN0IGNpZnNGaWxlSW5mbyAqcENpZnNGaWxlOwogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKG1udC0+bW50X3NiKTsKIAogCXBDaWZzRmlsZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaWZzRmlsZUluZm8pLCBHRlBfS0VSTkVMKTsKLQogCWlmIChwQ2lmc0ZpbGUgPT0gTlVMTCkKLQkJcmV0dXJuOworCQlyZXR1cm4gcENpZnNGaWxlOwogCiAJaWYgKG9wbG9ja0VuYWJsZWQpCiAJCW9wbG9jayA9IFJFUV9PUExPQ0s7CiAKIAlwQ2lmc0ZpbGUtPm5ldGZpZCA9IGZpbGVIYW5kbGU7CiAJcENpZnNGaWxlLT5waWQgPSBjdXJyZW50LT50Z2lkOwotCXBDaWZzRmlsZS0+cElub2RlID0gbmV3aW5vZGU7CisJcENpZnNGaWxlLT5wSW5vZGUgPSBpZ3JhYihuZXdpbm9kZSk7CisJcENpZnNGaWxlLT5tbnQgPSBtbnQ7CisJcENpZnNGaWxlLT5wZmlsZSA9IGZpbGU7CiAJcENpZnNGaWxlLT5pbnZhbGlkSGFuZGxlID0gZmFsc2U7CiAJcENpZnNGaWxlLT5jbG9zZVBlbmQgPSBmYWxzZTsKIAltdXRleF9pbml0KCZwQ2lmc0ZpbGUtPmZoX211dGV4KTsKIAltdXRleF9pbml0KCZwQ2lmc0ZpbGUtPmxvY2tfbXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZwQ2lmc0ZpbGUtPmxsaXN0KTsKIAlhdG9taWNfc2V0KCZwQ2lmc0ZpbGUtPmNvdW50LCAxKTsKKwlzbG93X3dvcmtfaW5pdCgmcENpZnNGaWxlLT5vcGxvY2tfYnJlYWssICZjaWZzX29wbG9ja19icmVha19vcHMpOwogCi0JLyogc2V0IHRoZSBmb2xsb3dpbmcgaW4gb3BlbiBub3cKLQkJCXBDaWZzRmlsZS0+cGZpbGUgPSBmaWxlOyAqLwogCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOwotCWxpc3RfYWRkKCZwQ2lmc0ZpbGUtPnRsaXN0LCAmdGNvbi0+b3BlbkZpbGVMaXN0KTsKKwlsaXN0X2FkZCgmcENpZnNGaWxlLT50bGlzdCwgJmNpZnNfc2ItPnRjb24tPm9wZW5GaWxlTGlzdCk7CiAJcENpZnNJbm9kZSA9IENJRlNfSShuZXdpbm9kZSk7CiAJaWYgKHBDaWZzSW5vZGUpIHsKIAkJLyogaWYgcmVhZGFibGUgZmlsZSBpbnN0YW5jZSBwdXQgZmlyc3QgaW4gbGlzdCovCi0JCWlmICh3cml0ZV9vbmx5KQorCQlpZiAob2ZsYWdzICYgRk1PREVfUkVBRCkKKwkJCWxpc3RfYWRkKCZwQ2lmc0ZpbGUtPmZsaXN0LCAmcENpZnNJbm9kZS0+b3BlbkZpbGVMaXN0KTsKKwkJZWxzZQogCQkJbGlzdF9hZGRfdGFpbCgmcENpZnNGaWxlLT5mbGlzdCwKIAkJCQkgICAgICAmcENpZnNJbm9kZS0+b3BlbkZpbGVMaXN0KTsKLQkJZWxzZQotCQkJbGlzdF9hZGQoJnBDaWZzRmlsZS0+Zmxpc3QsICZwQ2lmc0lub2RlLT5vcGVuRmlsZUxpc3QpOwogCiAJCWlmICgob3Bsb2NrICYgMHhGKSA9PSBPUExPQ0tfRVhDTFVTSVZFKSB7CiAJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IHRydWU7CkBAIC0xNzYsMTggKzE3OCwxOCBAQAogCQkJCXBDaWZzSW5vZGUtPmNsaWVudENhbkNhY2hlUmVhZCA9IHRydWU7CiAJfQogCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisKKwlyZXR1cm4gcENpZnNGaWxlOwogfQogCiBpbnQgY2lmc19wb3NpeF9vcGVuKGNoYXIgKmZ1bGxfcGF0aCwgc3RydWN0IGlub2RlICoqcGlub2RlLAotCQkgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUsIGludCBvZmxhZ3MsCi0JCSAgICBpbnQgKnBvcGxvY2ssIF9fdTE2ICpwbmV0ZmlkLCBpbnQgeGlkKQorCQkgICAgc3RydWN0IHZmc21vdW50ICptbnQsIGludCBtb2RlLCBpbnQgb2ZsYWdzLAorCQkgICAgX191MzIgKnBvcGxvY2ssIF9fdTE2ICpwbmV0ZmlkLCBpbnQgeGlkKQogewogCWludCByYzsKLQlfX3UzMiBvcGxvY2s7Ci0JYm9vbCB3cml0ZV9vbmx5ID0gZmFsc2U7CiAJRklMRV9VTklYX0JBU0lDX0lORk8gKnByZXNwX2RhdGE7CiAJX191MzIgcG9zaXhfZmxhZ3MgPSAwOwotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihtbnQtPm1udF9zYik7CiAJc3RydWN0IGNpZnNfZmF0dHIgZmF0dHI7CiAKIAljRllJKDEsICgicG9zaXggb3BlbiAlcyIsIGZ1bGxfcGF0aCkpOwpAQCAtMjIzLDEyICsyMjUsOSBAQAogCWlmIChvZmxhZ3MgJiBPX0RJUkVDVCkKIAkJcG9zaXhfZmxhZ3MgfD0gU01CX09fRElSRUNUOwogCi0JaWYgKCEob2ZsYWdzICYgRk1PREVfUkVBRCkpCi0JCXdyaXRlX29ubHkgPSB0cnVlOwotCiAJbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCXJjID0gQ0lGU1BPU0lYQ3JlYXRlKHhpZCwgY2lmc19zYi0+dGNvbiwgcG9zaXhfZmxhZ3MsIG1vZGUsCi0JCQlwbmV0ZmlkLCBwcmVzcF9kYXRhLCAmb3Bsb2NrLCBmdWxsX3BhdGgsCisJCQlwbmV0ZmlkLCBwcmVzcF9kYXRhLCBwb3Bsb2NrLCBmdWxsX3BhdGgsCiAJCQljaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKIAkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogCWlmIChyYykKQEAgLTI0NCw3ICsyNDMsNyBAQAogCiAJLyogZ2V0IG5ldyBpbm9kZSBhbmQgc2V0IGl0IHVwICovCiAJaWYgKCpwaW5vZGUgPT0gTlVMTCkgewotCQkqcGlub2RlID0gY2lmc19pZ2V0KHNiLCAmZmF0dHIpOworCQkqcGlub2RlID0gY2lmc19pZ2V0KG1udC0+bW50X3NiLCAmZmF0dHIpOwogCQlpZiAoISpwaW5vZGUpIHsKIAkJCXJjID0gLUVOT01FTTsKIAkJCWdvdG8gcG9zaXhfb3Blbl9yZXQ7CkBAIC0yNTMsNyArMjUyLDcgQEAKIAkJY2lmc19mYXR0cl90b19pbm9kZSgqcGlub2RlLCAmZmF0dHIpOwogCX0KIAotCWNpZnNfZmlsbF9maWxlaW5mbygqcGlub2RlLCAqcG5ldGZpZCwgY2lmc19zYi0+dGNvbiwgd3JpdGVfb25seSk7CisJY2lmc19uZXdfZmlsZWluZm8oKnBpbm9kZSwgKnBuZXRmaWQsIE5VTEwsIG1udCwgb2ZsYWdzKTsKIAogcG9zaXhfb3Blbl9yZXQ6CiAJa2ZyZWUocHJlc3BfZGF0YSk7CkBAIC0yODAsNyArMjc5LDcgQEAKIAlpbnQgcmMgPSAtRU5PRU5UOwogCWludCB4aWQ7CiAJaW50IGNyZWF0ZV9vcHRpb25zID0gQ1JFQVRFX05PVF9ESVI7Ci0JaW50IG9wbG9jayA9IDA7CisJX191MzIgb3Bsb2NrID0gMDsKIAlpbnQgb2ZsYWdzOwogCWJvb2wgcG9zaXhfY3JlYXRlID0gZmFsc2U7CiAJLyoKQEAgLTI5OCw3ICsyOTcsNiBAQAogCUZJTEVfQUxMX0lORk8gKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGlub2RlICpuZXdpbm9kZSA9IE5VTEw7CiAJaW50IGRpc3Bvc2l0aW9uID0gRklMRV9PVkVSV1JJVEVfSUY7Ci0JYm9vbCB3cml0ZV9vbmx5ID0gZmFsc2U7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIApAQCAtMzIzLDcgKzMyMSw3IEBACiAJaWYgKHRjb24tPnVuaXhfZXh0ICYmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSAmJgogCSAgICAoQ0lGU19VTklYX1BPU0lYX1BBVEhfT1BTX0NBUCAmCiAJCQlsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpKSkgewotCQlyYyA9IGNpZnNfcG9zaXhfb3BlbihmdWxsX3BhdGgsICZuZXdpbm9kZSwgaW5vZGUtPmlfc2IsCisJCXJjID0gY2lmc19wb3NpeF9vcGVuKGZ1bGxfcGF0aCwgJm5ld2lub2RlLCBuZC0+cGF0aC5tbnQsCiAJCQkJICAgICBtb2RlLCBvZmxhZ3MsICZvcGxvY2ssICZmaWxlSGFuZGxlLCB4aWQpOwogCQkvKiBFSU8gY291bGQgaW5kaWNhdGUgdGhhdCAocG9zaXggb3Blbikgb3BlcmF0aW9uIGlzIG5vdAogCQkgICBzdXBwb3J0ZWQsIGRlc3BpdGUgd2hhdCBzZXJ2ZXIgY2xhaW1lZCBpbiBjYXBhYmlsaXR5CkBAIC0zNTEsMTEgKzM0OSw4IEBACiAJCWRlc2lyZWRBY2Nlc3MgPSAwOwogCQlpZiAob2ZsYWdzICYgRk1PREVfUkVBRCkKIAkJCWRlc2lyZWRBY2Nlc3MgfD0gR0VORVJJQ19SRUFEOyAvKiBpcyB0aGlzIHRvbyBsaXR0bGU/ICovCi0JCWlmIChvZmxhZ3MgJiBGTU9ERV9XUklURSkgeworCQlpZiAob2ZsYWdzICYgRk1PREVfV1JJVEUpCiAJCQlkZXNpcmVkQWNjZXNzIHw9IEdFTkVSSUNfV1JJVEU7Ci0JCQlpZiAoIShvZmxhZ3MgJiBGTU9ERV9SRUFEKSkKLQkJCQl3cml0ZV9vbmx5ID0gdHJ1ZTsKLQkJfQogCiAJCWlmICgob2ZsYWdzICYgKE9fQ1JFQVQgfCBPX0VYQ0wpKSA9PSAoT19DUkVBVCB8IE9fRVhDTCkpCiAJCQlkaXNwb3NpdGlvbiA9IEZJTEVfQ1JFQVRFOwpAQCAtNDcwLDggKzQ2NSw4IEBACiAJCS8qIG1rbm9kIGNhc2UgLSBkbyBub3QgbGVhdmUgZmlsZSBvcGVuICovCiAJCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIGZpbGVIYW5kbGUpOwogCX0gZWxzZSBpZiAoIShwb3NpeF9jcmVhdGUpICYmIChuZXdpbm9kZSkpIHsKLQkJCWNpZnNfZmlsbF9maWxlaW5mbyhuZXdpbm9kZSwgZmlsZUhhbmRsZSwKLQkJCQkJY2lmc19zYi0+dGNvbiwgd3JpdGVfb25seSk7CisJCQljaWZzX25ld19maWxlaW5mbyhuZXdpbm9kZSwgZmlsZUhhbmRsZSwgTlVMTCwKKwkJCQkJCW5kLT5wYXRoLm1udCwgb2ZsYWdzKTsKIAl9CiBjaWZzX2NyZWF0ZV9vdXQ6CiAJa2ZyZWUoYnVmKTsKQEAgLTYxMSw3ICs2MDYsNyBAQAogewogCWludCB4aWQ7CiAJaW50IHJjID0gMDsgLyogdG8gZ2V0IGFyb3VuZCBzcHVyaW91cyBnY2Mgd2FybmluZywgc2V0IHRvIHplcm8gaGVyZSAqLwotCWludCBvcGxvY2sgPSAwOworCV9fdTMyIG9wbG9jayA9IDA7CiAJX191MTYgZmlsZUhhbmRsZSA9IDA7CiAJYm9vbCBwb3NpeF9vcGVuID0gZmFsc2U7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKQEAgLTY4Myw4ICs2NzgsNyBAQAogCQlpZiAoIShuZC0+ZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVCB8IExPT0tVUF9ESVJFQ1RPUlkpKSAmJgogCQkgICAgIChuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikgJiYgIXBUY29uLT5icm9rZW5fcG9zaXhfb3BlbiAmJgogCQkgICAgIChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0NSRUFUKSkgewotCQkJcmMgPSBjaWZzX3Bvc2l4X29wZW4oZnVsbF9wYXRoLCAmbmV3SW5vZGUsCi0JCQkJCXBhcmVudF9kaXJfaW5vZGUtPmlfc2IsCisJCQlyYyA9IGNpZnNfcG9zaXhfb3BlbihmdWxsX3BhdGgsICZuZXdJbm9kZSwgbmQtPnBhdGgubW50LAogCQkJCQluZC0+aW50ZW50Lm9wZW4uY3JlYXRlX21vZGUsCiAJCQkJCW5kLT5pbnRlbnQub3Blbi5mbGFncywgJm9wbG9jaywKIAkJCQkJJmZpbGVIYW5kbGUsIHhpZCk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IGZhN2JlYWMuLjQyOTMzN2UgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlICJjaWZzZnMuaCIKICNpbmNsdWRlICJjaWZzcGR1LmgiCkBAIC0zOSwyNyArNDAsNiBAQAogI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKICNpbmNsdWRlICJjaWZzX2ZzX3NiLmgiCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNpZnNGaWxlSW5mbyAqY2lmc19pbml0X3ByaXZhdGUoCi0Jc3RydWN0IGNpZnNGaWxlSW5mbyAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCXN0cnVjdCBmaWxlICpmaWxlLCBfX3UxNiBuZXRmaWQpCi17Ci0JbWVtc2V0KHByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBjaWZzRmlsZUluZm8pKTsKLQlwcml2YXRlX2RhdGEtPm5ldGZpZCA9IG5ldGZpZDsKLQlwcml2YXRlX2RhdGEtPnBpZCA9IGN1cnJlbnQtPnRnaWQ7Ci0JbXV0ZXhfaW5pdCgmcHJpdmF0ZV9kYXRhLT5maF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmcHJpdmF0ZV9kYXRhLT5sb2NrX211dGV4KTsKLQlJTklUX0xJU1RfSEVBRCgmcHJpdmF0ZV9kYXRhLT5sbGlzdCk7Ci0JcHJpdmF0ZV9kYXRhLT5wZmlsZSA9IGZpbGU7IC8qIG5lZWRlZCBmb3Igd3JpdGVwYWdlICovCi0JcHJpdmF0ZV9kYXRhLT5wSW5vZGUgPSBpbm9kZTsKLQlwcml2YXRlX2RhdGEtPmludmFsaWRIYW5kbGUgPSBmYWxzZTsKLQlwcml2YXRlX2RhdGEtPmNsb3NlUGVuZCA9IGZhbHNlOwotCS8qIEluaXRpYWxpemUgcmVmZXJlbmNlIGNvdW50IHRvIG9uZS4gIFRoZSBwcml2YXRlIGRhdGEgaXMKLQlmcmVlZCBvbiB0aGUgcmVsZWFzZSBvZiB0aGUgbGFzdCByZWZlcmVuY2UgKi8KLQlhdG9taWNfc2V0KCZwcml2YXRlX2RhdGEtPmNvdW50LCAxKTsKLQotCXJldHVybiBwcml2YXRlX2RhdGE7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGNpZnNfY29udmVydF9mbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJaWYgKChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRE9OTFkpCkBAIC0xMjMsOSArMTAzLDExIEBACiB9CiAKIC8qIGFsbCBhcmd1bWVudHMgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5IGluIGNhbGxlciAqLwotc3RhdGljIGlubGluZSBpbnQgY2lmc19wb3NpeF9vcGVuX2lub2RlX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlLAotCQkJc3RydWN0IGNpZnNGaWxlSW5mbyAqcENpZnNGaWxlLCBpbnQgb3Bsb2NrLCB1MTYgbmV0ZmlkKQorc3RhdGljIGlubGluZSBpbnQKK2NpZnNfcG9zaXhfb3Blbl9pbm9kZV9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlLAorCQkJICAgICBzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpwQ2lmc0ZpbGUsIF9fdTMyIG9wbG9jaywKKwkJCSAgICAgdTE2IG5ldGZpZCkKIHsKIAogCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOwpAQCAtMjE5LDE3ICsyMDEsNiBAQAogCXN0cnVjdCB0aW1lc3BlYyB0ZW1wOwogCWludCByYzsKIAotCS8qIHdhbnQgaGFuZGxlcyB3ZSBjYW4gdXNlIHRvIHJlYWQgd2l0aCBmaXJzdAotCSAgIGluIHRoZSBsaXN0IHNvIHdlIGRvIG5vdCBoYXZlIHRvIHdhbGsgdGhlCi0JICAgbGlzdCB0byBzZWFyY2ggZm9yIG9uZSBpbiB3cml0ZV9iZWdpbiAqLwotCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmcENpZnNGaWxlLT5mbGlzdCwKLQkJCSAgICAgICZwQ2lmc0lub2RlLT5vcGVuRmlsZUxpc3QpOwotCX0gZWxzZSB7Ci0JCWxpc3RfYWRkKCZwQ2lmc0ZpbGUtPmZsaXN0LAotCQkJICZwQ2lmc0lub2RlLT5vcGVuRmlsZUxpc3QpOwotCX0KLQl3cml0ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOwogCWlmIChwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQpIHsKIAkJLyogd2UgaGF2ZSB0aGUgaW5vZGUgb3BlbiBzb21ld2hlcmUgZWxzZQogCQkgICBubyBuZWVkIHRvIGRpc2NhcmQgY2FjaGUgZGF0YSAqLwpAQCAtMjc5LDcgKzI1MCw4IEBACiBpbnQgY2lmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWludCByYyA9IC1FQUNDRVM7Ci0JaW50IHhpZCwgb3Bsb2NrOworCWludCB4aWQ7CisJX191MzIgb3Bsb2NrOwogCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CiAJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbjsKIAlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpwQ2lmc0ZpbGU7CkBAIC0zMjQsNyArMjk2LDcgQEAKIAkJCWxlNjRfdG9fY3B1KHRjb24tPmZzVW5peEluZm8uQ2FwYWJpbGl0eSkpKSB7CiAJCWludCBvZmxhZ3MgPSAoaW50KSBjaWZzX3Bvc2l4X2NvbnZlcnRfZmxhZ3MoZmlsZS0+Zl9mbGFncyk7CiAJCS8qIGNhbiBub3QgcmVmcmVzaCBpbm9kZSBpbmZvIHNpbmNlIHNpemUgY291bGQgYmUgc3RhbGUgKi8KLQkJcmMgPSBjaWZzX3Bvc2l4X29wZW4oZnVsbF9wYXRoLCAmaW5vZGUsIGlub2RlLT5pX3NiLAorCQlyYyA9IGNpZnNfcG9zaXhfb3BlbihmdWxsX3BhdGgsICZpbm9kZSwgZmlsZS0+Zl9wYXRoLm1udCwKIAkJCQkgICAgIGNpZnNfc2ItPm1udF9maWxlX21vZGUgLyogaWdub3JlZCAqLywKIAkJCQkgICAgIG9mbGFncywgJm9wbG9jaywgJm5ldGZpZCwgeGlkKTsKIAkJaWYgKHJjID09IDApIHsKQEAgLTQxNCwyNCArMzg2LDE3IEBACiAJCWNGWUkoMSwgKCJjaWZzX29wZW4gcmV0dXJuZWQgMHgleCIsIHJjKSk7CiAJCWdvdG8gb3V0OwogCX0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPQotCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2lmc0ZpbGVJbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlwQ2lmc0ZpbGUgPSBjaWZzX25ld19maWxlaW5mbyhpbm9kZSwgbmV0ZmlkLCBmaWxlLCBmaWxlLT5mX3BhdGgubW50LAorCQkJCQlmaWxlLT5mX2ZsYWdzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBwQ2lmc0ZpbGU7CiAJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCXBDaWZzRmlsZSA9IGNpZnNfaW5pdF9wcml2YXRlKGZpbGUtPnByaXZhdGVfZGF0YSwgaW5vZGUsIGZpbGUsIG5ldGZpZCk7Ci0Jd3JpdGVfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7Ci0JbGlzdF9hZGQoJnBDaWZzRmlsZS0+dGxpc3QsICZ0Y29uLT5vcGVuRmlsZUxpc3QpOwogCi0JcENpZnNJbm9kZSA9IENJRlNfSShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKLQlpZiAocENpZnNJbm9kZSkgewotCQlyYyA9IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoaW5vZGUsIGZpbGUsIHBDaWZzSW5vZGUsCi0JCQkJCSAgICBwQ2lmc0ZpbGUsIHRjb24sCi0JCQkJCSAgICAmb3Bsb2NrLCBidWYsIGZ1bGxfcGF0aCwgeGlkKTsKLQl9IGVsc2UgewotCQl3cml0ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOwotCX0KKwlyYyA9IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoaW5vZGUsIGZpbGUsIHBDaWZzSW5vZGUsIHBDaWZzRmlsZSwgdGNvbiwKKwkJCQkgICAgJm9wbG9jaywgYnVmLCBmdWxsX3BhdGgsIHhpZCk7CiAKIAlpZiAob3Bsb2NrICYgQ0lGU19DUkVBVEVfQUNUSU9OKSB7CiAJCS8qIHRpbWUgdG8gc2V0IG1vZGUgd2hpY2ggd2UgY2FuIG5vdCBzZXQgZWFybGllciBkdWUgdG8KQEAgLTQ3NCw3ICs0MzksOCBAQAogc3RhdGljIGludCBjaWZzX3Jlb3Blbl9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBib29sIGNhbl9mbHVzaCkKIHsKIAlpbnQgcmMgPSAtRUFDQ0VTOwotCWludCB4aWQsIG9wbG9jazsKKwlpbnQgeGlkOworCV9fdTMyIG9wbG9jazsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CiAJc3RydWN0IGNpZnNGaWxlSW5mbyAqcENpZnNGaWxlOwpAQCAtNTQzLDcgKzUwOSw3IEBACiAJCQlsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpKSkgewogCQlpbnQgb2ZsYWdzID0gKGludCkgY2lmc19wb3NpeF9jb252ZXJ0X2ZsYWdzKGZpbGUtPmZfZmxhZ3MpOwogCQkvKiBjYW4gbm90IHJlZnJlc2ggaW5vZGUgaW5mbyBzaW5jZSBzaXplIGNvdWxkIGJlIHN0YWxlICovCi0JCXJjID0gY2lmc19wb3NpeF9vcGVuKGZ1bGxfcGF0aCwgTlVMTCwgaW5vZGUtPmlfc2IsCisJCXJjID0gY2lmc19wb3NpeF9vcGVuKGZ1bGxfcGF0aCwgTlVMTCwgZmlsZS0+Zl9wYXRoLm1udCwKIAkJCQkgICAgIGNpZnNfc2ItPm1udF9maWxlX21vZGUgLyogaWdub3JlZCAqLywKIAkJCQkgICAgIG9mbGFncywgJm9wbG9jaywgJm5ldGZpZCwgeGlkKTsKIAkJaWYgKHJjID09IDApIHsKQEAgLTIzMDgsNiArMjI3NCw3MyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQKK2NpZnNfb3Bsb2NrX2JyZWFrKHN0cnVjdCBzbG93X3dvcmsgKndvcmspCit7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNpZnNGaWxlSW5mbywKKwkJCQkJCSAgb3Bsb2NrX2JyZWFrKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gY2ZpbGUtPnBJbm9kZTsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGlub2RlKTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihjZmlsZS0+bW50LT5tbnRfc2IpOworCWludCByYywgd2FpdHJjID0gMDsKKworCWlmIChpbm9kZSAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCisJCWlmIChjaW5vZGUtPmNsaWVudENhbkNhY2hlQWxsID09IDApCisJCQlicmVha19sZWFzZShpbm9kZSwgRk1PREVfUkVBRCk7CisJCWVsc2UgaWYgKGNpbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID09IDApCisJCQlicmVha19sZWFzZShpbm9kZSwgRk1PREVfV1JJVEUpOworI2VuZGlmCisJCXJjID0gZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOworCQlpZiAoY2lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPT0gMCkgeworCQkJd2FpdHJjID0gZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7CisJCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShpbm9kZSk7CisJCX0KKwkJaWYgKCFyYykKKwkJCXJjID0gd2FpdHJjOworCQlpZiAocmMpCisJCQljaW5vZGUtPndyaXRlX2JlaGluZF9yYyA9IHJjOworCQljRllJKDEsICgiT3Bsb2NrIGZsdXNoIGlub2RlICVwIHJjICVkIiwgaW5vZGUsIHJjKSk7CisJfQorCisJLyoKKwkgKiByZWxlYXNpbmcgc3RhbGUgb3Bsb2NrIGFmdGVyIHJlY2VudCByZWNvbm5lY3Qgb2Ygc21iIHNlc3Npb24gdXNpbmcKKwkgKiBhIG5vdyBpbmNvcnJlY3QgZmlsZSBoYW5kbGUgaXMgbm90IGEgZGF0YSBpbnRlZ3JpdHkgaXNzdWUgYnV0IGRvCisJICogbm90IGJvdGhlciBzZW5kaW5nIGFuIG9wbG9jayByZWxlYXNlIGlmIHNlc3Npb24gdG8gc2VydmVyIHN0aWxsIGlzCisJICogZGlzY29ubmVjdGVkIHNpbmNlIG9wbG9jayBhbHJlYWR5IHJlbGVhc2VkIGJ5IHRoZSBzZXJ2ZXIKKwkgKi8KKwlpZiAoIWNmaWxlLT5jbG9zZVBlbmQgJiYgIWNmaWxlLT5vcGxvY2tfYnJlYWtfY2FuY2VsbGVkKSB7CisJCXJjID0gQ0lGU1NNQkxvY2soMCwgY2lmc19zYi0+dGNvbiwgY2ZpbGUtPm5ldGZpZCwgMCwgMCwgMCwgMCwKKwkJCQkgTE9DS0lOR19BTkRYX09QTE9DS19SRUxFQVNFLCBmYWxzZSk7CisJCWNGWUkoMSwgKCJPcGxvY2sgcmVsZWFzZSByYyA9ICVkIiwgcmMpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfb3Bsb2NrX2JyZWFrX2dldChzdHJ1Y3Qgc2xvd193b3JrICp3b3JrKQoreworCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjaWZzRmlsZUluZm8sCisJCQkJCQkgIG9wbG9ja19icmVhayk7CisJbW50Z2V0KGNmaWxlLT5tbnQpOworCWNpZnNGaWxlSW5mb19nZXQoY2ZpbGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorY2lmc19vcGxvY2tfYnJlYWtfcHV0KHN0cnVjdCBzbG93X3dvcmsgKndvcmspCit7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNpZnNGaWxlSW5mbywKKwkJCQkJCSAgb3Bsb2NrX2JyZWFrKTsKKwltbnRwdXQoY2ZpbGUtPm1udCk7CisJY2lmc0ZpbGVJbmZvX3B1dChjZmlsZSk7Cit9CisKK2NvbnN0IHN0cnVjdCBzbG93X3dvcmtfb3BzIGNpZnNfb3Bsb2NrX2JyZWFrX29wcyA9IHsKKwkuZ2V0X3JlZgk9IGNpZnNfb3Bsb2NrX2JyZWFrX2dldCwKKwkucHV0X3JlZgk9IGNpZnNfb3Bsb2NrX2JyZWFrX3B1dCwKKwkuZXhlY3V0ZQk9IGNpZnNfb3Bsb2NrX2JyZWFrLAorfTsKKwogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzID0gewogCS5yZWFkcGFnZSA9IGNpZnNfcmVhZHBhZ2UsCiAJLnJlYWRwYWdlcyA9IGNpZnNfcmVhZHBhZ2VzLApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IDFmMDljNzYxLi41ZTI0OTI1IDEwMDY0NAotLS0gYS9mcy9jaWZzL2lub2RlLmMKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC0xNTU3LDU3ICsxNTU3LDI0IEBACiAKIHN0YXRpYyBpbnQgY2lmc192bXRydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQpCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisJbG9mZl90IG9sZHNpemU7CisJaW50IGVycjsKIAogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JaWYgKGlub2RlLT5pX3NpemUgPCBvZmZzZXQpCi0JCWdvdG8gZG9fZXhwYW5kOwotCS8qCi0JICogdHJ1bmNhdGlvbiBvZiBpbi11c2Ugc3dhcGZpbGVzIGlzIGRpc2FsbG93ZWQgLSBpdCB3b3VsZCBjYXVzZQotCSAqIHN1YnNlcXVlbnQgc3dhcG91dCB0byBzY3JpYmJsZSBvbiB0aGUgbm93LWZyZWVkIGJsb2Nrcy4KLQkgKi8KLQlpZiAoSVNfU1dBUEZJTEUoaW5vZGUpKSB7CisJZXJyID0gaW5vZGVfbmV3c2l6ZV9vayhpbm9kZSwgb2Zmc2V0KTsKKwlpZiAoZXJyKSB7CiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJZ290byBvdXRfYnVzeTsKKwkJZ290byBvdXQ7CiAJfQotCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0KTsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JLyoKLQkgKiB1bm1hcF9tYXBwaW5nX3JhbmdlIGlzIGNhbGxlZCB0d2ljZSwgZmlyc3Qgc2ltcGx5IGZvciBlZmZpY2llbmN5Ci0JICogc28gdGhhdCB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBkb2VzIGZld2VyIHNpbmdsZS1wYWdlIHVubWFwcy4gSG93ZXZlcgotCSAqIGFmdGVyIHRoaXMgZmlyc3QgY2FsbCwgYW5kIGJlZm9yZSB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBmaW5pc2hlcywKLQkgKiBpdCBpcyBwb3NzaWJsZSBmb3IgcHJpdmF0ZSBwYWdlcyB0byBiZSBDT1dlZCwgd2hpY2ggcmVtYWluIGFmdGVyCi0JICogdHJ1bmNhdGVfaW5vZGVfcGFnZXMgZmluaXNoZXMsIGhlbmNlIHRoZSBzZWNvbmQgdW5tYXBfbWFwcGluZ19yYW5nZQotCSAqIGNhbGwgbXVzdCBiZSBtYWRlIGZvciBjb3JyZWN0bmVzcy4KLQkgKi8KLQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsIG9mZnNldCArIFBBR0VfU0laRSAtIDEsIDAsIDEpOwotCXRydW5jYXRlX2lub2RlX3BhZ2VzKG1hcHBpbmcsIG9mZnNldCk7Ci0JdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKLQlnb3RvIG91dF90cnVuY2F0ZTsKIAotZG9fZXhwYW5kOgotCWxpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9GU0laRV0ucmxpbV9jdXI7Ci0JaWYgKGxpbWl0ICE9IFJMSU1fSU5GSU5JVFkgJiYgb2Zmc2V0ID4gbGltaXQpIHsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwotCQlnb3RvIG91dF9zaWc7Ci0JfQotCWlmIChvZmZzZXQgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykgewotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JCWdvdG8gb3V0X2JpZzsKLQl9CisJb2xkc2l6ZSA9IGlub2RlLT5pX3NpemU7CiAJaV9zaXplX3dyaXRlKGlub2RlLCBvZmZzZXQpOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLW91dF90cnVuY2F0ZToKKwl0cnVuY2F0ZV9wYWdlY2FjaGUoaW5vZGUsIG9sZHNpemUsIG9mZnNldCk7CiAJaWYgKGlub2RlLT5pX29wLT50cnVuY2F0ZSkKIAkJaW5vZGUtPmlfb3AtPnRydW5jYXRlKGlub2RlKTsKLQlyZXR1cm4gMDsKLW91dF9zaWc6Ci0Jc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7Ci1vdXRfYmlnOgotCXJldHVybiAtRUZCSUc7Ci1vdXRfYnVzeToKLQlyZXR1cm4gLUVUWFRCU1k7CitvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9taXNjLmMgYi9mcy9jaWZzL21pc2MuYwppbmRleCBlMDc5YTkxLi4wMjQxYjI1IDEwMDY0NAotLS0gYS9mcy9jaWZzL21pc2MuYworKysgYi9mcy9jaWZzL21pc2MuYwpAQCAtMzIsNyArMzIsNiBAQAogCiBleHRlcm4gbWVtcG9vbF90ICpjaWZzX3NtX3JlcV9wb29scDsKIGV4dGVybiBtZW1wb29sX3QgKmNpZnNfcmVxX3Bvb2xwOwotZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqb3Bsb2NrVGhyZWFkOwogCiAvKiBUaGUgeGlkIHNlcnZlcyBhcyBhIHVzZWZ1bCBpZGVudGlmaWVyIGZvciBlYWNoIGluY29taW5nIHZmcyByZXF1ZXN0LAogICAgaW4gYSBzaW1pbGFyIHdheSB0byB0aGUgbWlkIHdoaWNoIGlzIHVzZWZ1bCB0byB0cmFjayBlYWNoIHNlbnQgc21iLApAQCAtNTAwLDYgKzQ5OSw3IEBACiAJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbjsKIAlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqcENpZnNJbm9kZTsKIAlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpuZXRmaWxlOworCWludCByYzsKIAogCWNGWUkoMSwgKCJDaGVja2luZyBmb3Igb3Bsb2NrIGJyZWFrIG9yIGRub3RpZnkgcmVzcG9uc2UiKSk7CiAJaWYgKChwU01CLT5oZHIuQ29tbWFuZCA9PSBTTUJfQ09NX05UX1RSQU5TQUNUKSAmJgpAQCAtNTYyLDMwICs1NjIsNDAgQEAKIAkJCQljb250aW51ZTsKIAogCQkJY2lmc19zdGF0c19pbmMoJnRjb24tPm51bV9vcGxvY2tfYnJrcyk7Ci0JCQl3cml0ZV9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CiAJCQlsaXN0X2Zvcl9lYWNoKHRtcDIsICZ0Y29uLT5vcGVuRmlsZUxpc3QpIHsKIAkJCQluZXRmaWxlID0gbGlzdF9lbnRyeSh0bXAyLCBzdHJ1Y3QgY2lmc0ZpbGVJbmZvLAogCQkJCQkJICAgICB0bGlzdCk7CiAJCQkJaWYgKHBTTUItPkZpZCAhPSBuZXRmaWxlLT5uZXRmaWQpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKLQkJCQlyZWFkX3VubG9jaygmY2lmc190Y3Bfc2VzX2xvY2spOworCQkJCS8qCisJCQkJICogZG9uJ3QgZG8gYW55dGhpbmcgaWYgZmlsZSBpcyBhYm91dCB0byBiZQorCQkJCSAqIGNsb3NlZCBhbnl3YXkuCisJCQkJICovCisJCQkJaWYgKG5ldGZpbGUtPmNsb3NlUGVuZCkgeworCQkJCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCQkJCXJlYWRfdW5sb2NrKCZjaWZzX3RjcF9zZXNfbG9jayk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwogCQkJCWNGWUkoMSwgKCJmaWxlIGlkIG1hdGNoLCBvcGxvY2sgYnJlYWsiKSk7CiAJCQkJcENpZnNJbm9kZSA9IENJRlNfSShuZXRmaWxlLT5wSW5vZGUpOwogCQkJCXBDaWZzSW5vZGUtPmNsaWVudENhbkNhY2hlQWxsID0gZmFsc2U7CiAJCQkJaWYgKHBTTUItPk9wbG9ja0xldmVsID09IDApCiAJCQkJCXBDaWZzSW5vZGUtPmNsaWVudENhbkNhY2hlUmVhZCA9IGZhbHNlOwotCQkJCXBDaWZzSW5vZGUtPm9wbG9ja1BlbmRpbmcgPSB0cnVlOwotCQkJCUFsbG9jT3Bsb2NrUUVudHJ5KG5ldGZpbGUtPnBJbm9kZSwKLQkJCQkJCSAgbmV0ZmlsZS0+bmV0ZmlkLCB0Y29uKTsKLQkJCQljRllJKDEsICgiYWJvdXQgdG8gd2FrZSB1cCBvcGxvY2sgdGhyZWFkIikpOwotCQkJCWlmIChvcGxvY2tUaHJlYWQpCi0JCQkJCXdha2VfdXBfcHJvY2VzcyhvcGxvY2tUaHJlYWQpOwotCisJCQkJcmMgPSBzbG93X3dvcmtfZW5xdWV1ZSgmbmV0ZmlsZS0+b3Bsb2NrX2JyZWFrKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJY0VSUk9SKDEsICgiZmFpbGVkIHRvIGVucXVldWUgb3Bsb2NrICIKKwkJCQkJCSAgICJicmVhazogJWRcbiIsIHJjKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV0ZmlsZS0+b3Bsb2NrX2JyZWFrX2NhbmNlbGxlZCA9IGZhbHNlOworCQkJCX0KKwkJCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCQkJcmVhZF91bmxvY2soJmNpZnNfdGNwX3Nlc19sb2NrKTsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KLQkJCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CiAJCQlyZWFkX3VubG9jaygmY2lmc190Y3Bfc2VzX2xvY2spOwogCQkJY0ZZSSgxLCAoIk5vIG1hdGNoaW5nIGZpbGUgZm9yIG9wbG9jayBicmVhayIpKTsKIAkJCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9yZWFkZGlyLmMgYi9mcy9jaWZzL3JlYWRkaXIuYwppbmRleCBmODIzYTRhLi4xZjA5OGNhIDEwMDY0NAotLS0gYS9mcy9jaWZzL3JlYWRkaXIuYworKysgYi9mcy9jaWZzL3JlYWRkaXIuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJfQogfQogCi12b2lkCitzdGF0aWMgdm9pZAogY2lmc19kaXJfaW5mb190b19mYXR0cihzdHJ1Y3QgY2lmc19mYXR0ciAqZmF0dHIsIEZJTEVfRElSRUNUT1JZX0lORk8gKmluZm8sCiAJCSAgICAgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQogewpAQCAtMTYxLDcgKzE2MSw3IEBACiAJY2lmc19maWxsX2NvbW1vbl9pbmZvKGZhdHRyLCBjaWZzX3NiKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGNpZnNfc3RkX2luZm9fdG9fZmF0dHIoc3RydWN0IGNpZnNfZmF0dHIgKmZhdHRyLCBGSU5EX0ZJTEVfU1RBTkRBUkRfSU5GTyAqaW5mbywKIAkJICAgICAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCiB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3RyYW5zcG9ydC5jIGIvZnMvY2lmcy90cmFuc3BvcnQuYwppbmRleCAxZGE0YWIyLi4wN2I4ZTcxIDEwMDY0NAotLS0gYS9mcy9jaWZzL3RyYW5zcG9ydC5jCisrKyBiL2ZzL2NpZnMvdHJhbnNwb3J0LmMKQEAgLTEwMyw1NiArMTAzLDYgQEAKIAltZW1wb29sX2ZyZWUobWlkRW50cnksIGNpZnNfbWlkX3Bvb2xwKTsKIH0KIAotc3RydWN0IG9wbG9ja19xX2VudHJ5ICoKLUFsbG9jT3Bsb2NrUUVudHJ5KHN0cnVjdCBpbm9kZSAqcGlub2RlLCBfX3UxNiBmaWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24pCi17Ci0Jc3RydWN0IG9wbG9ja19xX2VudHJ5ICp0ZW1wOwotCWlmICgocGlub2RlID09IE5VTEwpIHx8ICh0Y29uID09IE5VTEwpKSB7Ci0JCWNFUlJPUigxLCAoIk51bGwgcGFybXMgcGFzc2VkIHRvIEFsbG9jT3Bsb2NrUUVudHJ5IikpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdGVtcCA9IChzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKikga21lbV9jYWNoZV9hbGxvYyhjaWZzX29wbG9ja19jYWNoZXAsCi0JCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKHRlbXAgPT0gTlVMTCkKLQkJcmV0dXJuIHRlbXA7Ci0JZWxzZSB7Ci0JCXRlbXAtPnBpbm9kZSA9IHBpbm9kZTsKLQkJdGVtcC0+dGNvbiA9IHRjb247Ci0JCXRlbXAtPm5ldGZpZCA9IGZpZDsKLQkJc3Bpbl9sb2NrKCZjaWZzX29wbG9ja19sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmdGVtcC0+cWhlYWQsICZjaWZzX29wbG9ja19saXN0KTsKLQkJc3Bpbl91bmxvY2soJmNpZnNfb3Bsb2NrX2xvY2spOwotCX0KLQlyZXR1cm4gdGVtcDsKLX0KLQotdm9pZCBEZWxldGVPcGxvY2tRRW50cnkoc3RydWN0IG9wbG9ja19xX2VudHJ5ICpvcGxvY2tFbnRyeSkKLXsKLQlzcGluX2xvY2soJmNpZnNfb3Bsb2NrX2xvY2spOwotICAgIC8qIHNob3VsZCB3ZSBjaGVjayBpZiBsaXN0IGVtcHR5IGZpcnN0PyAqLwotCWxpc3RfZGVsKCZvcGxvY2tFbnRyeS0+cWhlYWQpOwotCXNwaW5fdW5sb2NrKCZjaWZzX29wbG9ja19sb2NrKTsKLQlrbWVtX2NhY2hlX2ZyZWUoY2lmc19vcGxvY2tfY2FjaGVwLCBvcGxvY2tFbnRyeSk7Ci19Ci0KLQotdm9pZCBEZWxldGVUY29uT3Bsb2NrUUVudHJpZXMoc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbikKLXsKLQlzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKnRlbXA7Ci0KLQlpZiAodGNvbiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2soJmNpZnNfb3Bsb2NrX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcCwgJmNpZnNfb3Bsb2NrX2xpc3QsIHFoZWFkKSB7Ci0JCWlmICgodGVtcC0+dGNvbikgJiYgKHRlbXAtPnRjb24gPT0gdGNvbikpIHsKLQkJCWxpc3RfZGVsKCZ0ZW1wLT5xaGVhZCk7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUoY2lmc19vcGxvY2tfY2FjaGVwLCB0ZW1wKTsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmY2lmc19vcGxvY2tfbG9jayk7Ci19Ci0KIHN0YXRpYyBpbnQKIHNtYl9zZW5kdihzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBrdmVjICppb3YsIGludCBuX3ZlYykKIHsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvY29kYV9pbnQuaCBiL2ZzL2NvZGEvY29kYV9pbnQuaAppbmRleCA4Y2NkNWVkLi5kOTk4NjBhIDEwMDY0NAotLS0gYS9mcy9jb2RhL2NvZGFfaW50LmgKKysrIGIvZnMvY29kYS9jb2RhX2ludC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfQ09EQV9JTlRfCiAKIHN0cnVjdCBkZW50cnk7CitzdHJ1Y3QgZmlsZTsKIAogZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGNvZGFfZnNfdHlwZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGNvZGFfdGltZW91dDsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvcHNkZXYuYyBiL2ZzL2NvZGEvcHNkZXYuYwppbmRleCAwMzc2YWM2Li5iZTQzOTJjIDEwMDY0NAotLS0gYS9mcy9jb2RhL3BzZGV2LmMKKysrIGIvZnMvY29kYS9wc2Rldi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggM2FhNDg4My4uNmMxOTA0MCAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTc2OCwxMyArNzY4LDEzIEBACiAJCQkJIGNoYXIgX191c2VyICogdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQkgdm9pZCBfX3VzZXIgKiBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdHlwZV9wYWdlOworCWNoYXIgKmtlcm5lbF90eXBlOwogCXVuc2lnbmVkIGxvbmcgZGF0YV9wYWdlOwotCXVuc2lnbmVkIGxvbmcgZGV2X3BhZ2U7CisJY2hhciAqa2VybmVsX2RldjsKIAljaGFyICpkaXJfcGFnZTsKIAlpbnQgcmV0dmFsOwogCi0JcmV0dmFsID0gY29weV9tb3VudF9vcHRpb25zICh0eXBlLCAmdHlwZV9wYWdlKTsKKwlyZXR2YWwgPSBjb3B5X21vdW50X3N0cmluZyh0eXBlLCAma2VybmVsX3R5cGUpOwogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtNzgzLDM4ICs3ODMsMzggQEAKIAlpZiAoSVNfRVJSKGRpcl9wYWdlKSkKIAkJZ290byBvdXQxOwogCi0JcmV0dmFsID0gY29weV9tb3VudF9vcHRpb25zIChkZXZfbmFtZSwgJmRldl9wYWdlKTsKKwlyZXR2YWwgPSBjb3B5X21vdW50X3N0cmluZyhkZXZfbmFtZSwgJmtlcm5lbF9kZXYpOwogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIG91dDI7CiAKLQlyZXR2YWwgPSBjb3B5X21vdW50X29wdGlvbnMgKGRhdGEsICZkYXRhX3BhZ2UpOworCXJldHZhbCA9IGNvcHlfbW91bnRfb3B0aW9ucyhkYXRhLCAmZGF0YV9wYWdlKTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBvdXQzOwogCiAJcmV0dmFsID0gLUVJTlZBTDsKIAotCWlmICh0eXBlX3BhZ2UgJiYgZGF0YV9wYWdlKSB7Ci0JCWlmICghc3RyY21wKChjaGFyICopdHlwZV9wYWdlLCBTTUJGU19OQU1FKSkgeworCWlmIChrZXJuZWxfdHlwZSAmJiBkYXRhX3BhZ2UpIHsKKwkJaWYgKCFzdHJjbXAoa2VybmVsX3R5cGUsIFNNQkZTX05BTUUpKSB7CiAJCQlkb19zbWJfc3VwZXJfZGF0YV9jb252KCh2b2lkICopZGF0YV9wYWdlKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKChjaGFyICopdHlwZV9wYWdlLCBOQ1BGU19OQU1FKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjbXAoa2VybmVsX3R5cGUsIE5DUEZTX05BTUUpKSB7CiAJCQlkb19uY3Bfc3VwZXJfZGF0YV9jb252KCh2b2lkICopZGF0YV9wYWdlKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKChjaGFyICopdHlwZV9wYWdlLCBORlM0X05BTUUpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChrZXJuZWxfdHlwZSwgTkZTNF9OQU1FKSkgewogCQkJaWYgKGRvX25mczRfc3VwZXJfZGF0YV9jb252KCh2b2lkICopIGRhdGFfcGFnZSkpCiAJCQkJZ290byBvdXQ0OwogCQl9CiAJfQogCi0JcmV0dmFsID0gZG9fbW91bnQoKGNoYXIqKWRldl9wYWdlLCBkaXJfcGFnZSwgKGNoYXIqKXR5cGVfcGFnZSwKKwlyZXR2YWwgPSBkb19tb3VudChrZXJuZWxfZGV2LCBkaXJfcGFnZSwga2VybmVsX3R5cGUsCiAJCQlmbGFncywgKHZvaWQqKWRhdGFfcGFnZSk7CiAKICBvdXQ0OgogCWZyZWVfcGFnZShkYXRhX3BhZ2UpOwogIG91dDM6Ci0JZnJlZV9wYWdlKGRldl9wYWdlKTsKKwlrZnJlZShrZXJuZWxfZGV2KTsKICBvdXQyOgogCXB1dG5hbWUoZGlyX3BhZ2UpOwogIG91dDE6Ci0JZnJlZV9wYWdlKHR5cGVfcGFnZSk7CisJa2ZyZWUoa2VybmVsX3R5cGUpOwogIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTUzMiw2ICsxNTMyLDggQEAKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBvdXQ7CiAKKwljdXJyZW50LT5zdGFja19zdGFydCA9IGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjazsKKwogCS8qIGV4ZWN2ZSBzdWNjZWVkZWQgKi8KIAljdXJyZW50LT5mcy0+aW5fZXhlYyA9IDA7CiAJY3VycmVudC0+aW5fZXhlY3ZlID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb3djb21tcy5jIGIvZnMvZGxtL2xvd2NvbW1zLmMKaW5kZXggMjQwY2VmMS4uNzA3MzZlYiAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvd2NvbW1zLmMKKysrIGIvZnMvZGxtL2xvd2NvbW1zLmMKQEAgLTMxNiw2ICszMTYsMTAgQEAKIHsKIAlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uOwogCisJLyogd2l0aCBzY3RwIHRoZXJlJ3Mgbm8gY29ubmVjdGluZyB3aXRob3V0IHNlbmRpbmcgKi8KKwlpZiAoZGxtX2NvbmZpZy5jaV9wcm90b2NvbCAhPSAwKQorCQlyZXR1cm4gMDsKKwogCWlmIChub2RlaWQgPT0gZGxtX291cl9ub2RlaWQoKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTQ1NSw5ICs0NTksOSBAQAogCQkJaW50IHByaW1fbGVuLCByZXQ7CiAJCQlpbnQgYWRkcl9sZW47CiAJCQlzdHJ1Y3QgY29ubmVjdGlvbiAqbmV3X2NvbjsKLQkJCXN0cnVjdCBmaWxlICpmaWxlOwogCQkJc2N0cF9wZWVsb2ZmX2FyZ190IHBhcmc7CiAJCQlpbnQgcGFyZ2xlbiA9IHNpemVvZihwYXJnKTsKKwkJCWludCBlcnI7CiAKIAkJCS8qCiAJCQkgKiBXZSBnZXQgdGhpcyBiZWZvcmUgYW55IGRhdGEgZm9yIGFuIGFzc29jaWF0aW9uLgpAQCAtNTEyLDE5ICs1MTYsMjIgQEAKIAkJCXJldCA9IGtlcm5lbF9nZXRzb2Nrb3B0KGNvbi0+c29jaywgSVBQUk9UT19TQ1RQLAogCQkJCQkJU0NUUF9TT0NLT1BUX1BFRUxPRkYsCiAJCQkJCQkodm9pZCAqKSZwYXJnLCAmcGFyZ2xlbik7Ci0JCQlpZiAocmV0KSB7CisJCQlpZiAocmV0IDwgMCkgewogCQkJCWxvZ19wcmludCgiQ2FuJ3QgcGVlbCBvZmYgYSBzb2NrZXQgZm9yICIKLQkJCQkJICAiY29ubmVjdGlvbiAlZCB0byBub2RlICVkOiBlcnI9JWRcbiIsCisJCQkJCSAgImNvbm5lY3Rpb24gJWQgdG8gbm9kZSAlZDogZXJyPSVkIiwKIAkJCQkJICBwYXJnLmFzc29jaWQsIG5vZGVpZCwgcmV0KTsKKwkJCQlyZXR1cm47CiAJCQl9Ci0JCQlmaWxlID0gZmdldChwYXJnLnNkKTsKLQkJCW5ld19jb24tPnNvY2sgPSBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCQluZXdfY29uLT5zb2NrID0gc29ja2ZkX2xvb2t1cChwYXJnLnNkLCAmZXJyKTsKKwkJCWlmICghbmV3X2Nvbi0+c29jaykgeworCQkJCWxvZ19wcmludCgic29ja2ZkX2xvb2t1cCBlcnJvciAlZCIsIGVycik7CisJCQkJcmV0dXJuOworCQkJfQogCQkJYWRkX3NvY2sobmV3X2Nvbi0+c29jaywgbmV3X2Nvbik7Ci0JCQlmcHV0KGZpbGUpOwotCQkJcHV0X3VudXNlZF9mZChwYXJnLnNkKTsKKwkJCXNvY2tmZF9wdXQobmV3X2Nvbi0+c29jayk7CiAKLQkJCWxvZ19wcmludCgiZ290IG5ldy9yZXN0YXJ0ZWQgYXNzb2NpYXRpb24gJWQgbm9kZWlkICVkIiwKLQkJCQkgKGludClzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZCwgbm9kZWlkKTsKKwkJCWxvZ19wcmludCgiY29ubmVjdGluZyB0byAlZCBzY3RwIGFzc29jaWF0aW9uICVkIiwKKwkJCQkgbm9kZWlkLCAoaW50KXNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX2Fzc29jX2lkKTsKIAogCQkJLyogU2VuZCBhbnkgcGVuZGluZyB3cml0ZXMgKi8KIAkJCWNsZWFyX2JpdChDRl9DT05ORUNUX1BFTkRJTkcsICZuZXdfY29uLT5mbGFncyk7CkBAIC04MzcsOCArODQ0LDYgQEAKIAlpZiAoY29uLT5yZXRyaWVzKysgPiBNQVhfQ09OTkVDVF9SRVRSSUVTKQogCQlyZXR1cm47CiAKLQlsb2dfcHJpbnQoIkluaXRpYXRpbmcgYXNzb2NpYXRpb24gd2l0aCBub2RlICVkIiwgY29uLT5ub2RlaWQpOwotCiAJaWYgKG5vZGVpZF90b19hZGRyKGNvbi0+bm9kZWlkLCAoc3RydWN0IHNvY2thZGRyICopJnJlbV9hZGRyKSkgewogCQlsb2dfcHJpbnQoIm5vIGFkZHJlc3MgZm9yIG5vZGVpZCAlZCIsIGNvbi0+bm9kZWlkKTsKIAkJcmV0dXJuOwpAQCAtODU1LDExICs4NjAsMTQgQEAKIAlvdXRtZXNzYWdlLm1zZ19mbGFncyA9IE1TR19FT1I7CiAKIAlzcGluX2xvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKLQllID0gbGlzdF9lbnRyeShjb24tPndyaXRlcXVldWUubmV4dCwgc3RydWN0IHdyaXRlcXVldWVfZW50cnksCi0JCSAgICAgICBsaXN0KTsKIAotCUJVR19PTigoc3RydWN0IGxpc3RfaGVhZCAqKSBlID09ICZjb24tPndyaXRlcXVldWUpOworCWlmIChsaXN0X2VtcHR5KCZjb24tPndyaXRlcXVldWUpKSB7CisJCXNwaW5fdW5sb2NrKCZjb24tPndyaXRlcXVldWVfbG9jayk7CisJCWxvZ19wcmludCgid3JpdGVxdWV1ZSBlbXB0eSBmb3Igbm9kZWlkICVkIiwgY29uLT5ub2RlaWQpOworCQlyZXR1cm47CisJfQogCisJZSA9IGxpc3RfZmlyc3RfZW50cnkoJmNvbi0+d3JpdGVxdWV1ZSwgc3RydWN0IHdyaXRlcXVldWVfZW50cnksIGxpc3QpOwogCWxlbiA9IGUtPmxlbjsKIAlvZmZzZXQgPSBlLT5vZmZzZXQ7CiAJc3Bpbl91bmxvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2Ryb3BfY2FjaGVzLmMgYi9mcy9kcm9wX2NhY2hlcy5jCmluZGV4IGEyZWRiNzkuLjMxZjRiMGUgMTAwNjQ0Ci0tLSBhL2ZzL2Ryb3BfY2FjaGVzLmMKKysrIGIvZnMvZHJvcF9jYWNoZXMuYwpAQCAtNjMsOSArNjMsOSBAQAogfQogCiBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQorCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CiAJaWYgKHdyaXRlKSB7CiAJCWlmIChzeXNjdGxfZHJvcF9jYWNoZXMgJiAxKQogCQkJZHJvcF9wYWdlY2FjaGUoKTsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL0tjb25maWcgYi9mcy9lY3J5cHRmcy9LY29uZmlnCmluZGV4IDBjNzU0ZTYuLjFjZDZkOWQgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL0tjb25maWcKKysrIGIvZnMvZWNyeXB0ZnMvS2NvbmZpZwpAQCAtMSw2ICsxLDkgQEAKIGNvbmZpZyBFQ1JZUFRfRlMKIAl0cmlzdGF0ZSAiZUNyeXB0IGZpbGVzeXN0ZW0gbGF5ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBLRVlTICYmIENSWVBUTyAmJiBORVQKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBLRVlTICYmIENSWVBUTworCXNlbGVjdCBDUllQVE9fRUNCCisJc2VsZWN0IENSWVBUT19DQkMKKwlzZWxlY3QgQ1JZUFRPX01ENQogCWhlbHAKIAkgIEVuY3J5cHRlZCBmaWxlc3lzdGVtIHRoYXQgb3BlcmF0ZXMgb24gdGhlIFZGUyBsYXllci4gIFNlZQogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9lY3J5cHRmcy50eHQ+IHRvIGxlYXJuIG1vcmUgYWJvdXQKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2NyeXB0by5jIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKaW5kZXggYjkxODUxZi4uZmJiNmU1ZSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKKysrIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKQEAgLTI0NSwxMyArMjQ1LDExIEBACiAJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihjcnlwdF9zdGF0LT50Zm0pOwogCWlmIChjcnlwdF9zdGF0LT5oYXNoX3RmbSkKIAkJY3J5cHRvX2ZyZWVfaGFzaChjcnlwdF9zdGF0LT5oYXNoX3RmbSk7Ci0JbXV0ZXhfbG9jaygmY3J5cHRfc3RhdC0+a2V5c2lnX2xpc3RfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShrZXlfc2lnLCBrZXlfc2lnX3RtcCwKIAkJCQkgJmNyeXB0X3N0YXQtPmtleXNpZ19saXN0LCBjcnlwdF9zdGF0X2xpc3QpIHsKIAkJbGlzdF9kZWwoJmtleV9zaWctPmNyeXB0X3N0YXRfbGlzdCk7CiAJCWttZW1fY2FjaGVfZnJlZShlY3J5cHRmc19rZXlfc2lnX2NhY2hlLCBrZXlfc2lnKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5rZXlzaWdfbGlzdF9tdXRleCk7CiAJbWVtc2V0KGNyeXB0X3N0YXQsIDAsIHNpemVvZihzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCkpOwogfQogCkBAIC01MTEsMTMgKzUwOSwxNCBAQAogCQkJCSAgKyBleHRlbnRfb2Zmc2V0KSwgY3J5cHRfc3RhdCk7CiAJCXJjID0gZWNyeXB0ZnNfd3JpdGVfbG93ZXIoZWNyeXB0ZnNfaW5vZGUsIGVuY19leHRlbnRfdmlydCwKIAkJCQkJICBvZmZzZXQsIGNyeXB0X3N0YXQtPmV4dGVudF9zaXplKTsKLQkJaWYgKHJjKSB7CisJCWlmIChyYyA8IDApIHsKIAkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGF0dGVtcHRpbmcgIgogCQkJCQkidG8gd3JpdGUgbG93ZXIgcGFnZTsgcmMgPSBbJWRdIgogCQkJCQkiXG4iLCByYyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KKwlyYyA9IDA7CiBvdXQ6CiAJaWYgKGVuY19leHRlbnRfcGFnZSkgewogCQlrdW5tYXAoZW5jX2V4dGVudF9wYWdlKTsKQEAgLTYzMyw3ICs2MzIsNyBAQAogCQlyYyA9IGVjcnlwdGZzX3JlYWRfbG93ZXIoZW5jX2V4dGVudF92aXJ0LCBvZmZzZXQsCiAJCQkJCSBjcnlwdF9zdGF0LT5leHRlbnRfc2l6ZSwKIAkJCQkJIGVjcnlwdGZzX2lub2RlKTsKLQkJaWYgKHJjKSB7CisJCWlmIChyYyA8IDApIHsKIAkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGF0dGVtcHRpbmcgIgogCQkJCQkidG8gcmVhZCBsb3dlciBwYWdlOyByYyA9IFslZF0iCiAJCQkJCSJcbiIsIHJjKTsKQEAgLTc5Nyw2ICs3OTYsNyBAQAogCWtmcmVlKGZ1bGxfYWxnX25hbWUpOwogCWlmIChJU19FUlIoY3J5cHRfc3RhdC0+dGZtKSkgewogCQlyYyA9IFBUUl9FUlIoY3J5cHRfc3RhdC0+dGZtKTsKKwkJY3J5cHRfc3RhdC0+dGZtID0gTlVMTDsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiY3J5cHRmczogaW5pdF9jcnlwdF9jdHgoKTogIgogCQkJCSJFcnJvciBpbml0aWFsaXppbmcgY2lwaGVyIFslc11cbiIsCiAJCQkJY3J5cHRfc3RhdC0+Y2lwaGVyKTsKQEAgLTkyNSw3ICs5MjUsOSBAQAogCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKmdsb2JhbF9hdXRoX3RvazsKIAlpbnQgcmMgPSAwOwogCisJbXV0ZXhfbG9jaygmY3J5cHRfc3RhdC0+a2V5c2lnX2xpc3RfbXV0ZXgpOwogCW11dGV4X2xvY2soJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0X211dGV4KTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2xvYmFsX2F1dGhfdG9rLAogCQkJICAgICZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdCwKIAkJCSAgICBtb3VudF9jcnlwdF9zdGF0X2xpc3QpIHsKQEAgLTkzNCwxMyArOTM2LDEzIEBACiAJCXJjID0gZWNyeXB0ZnNfYWRkX2tleXNpZyhjcnlwdF9zdGF0LCBnbG9iYWxfYXV0aF90b2stPnNpZyk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhZGRpbmcga2V5c2lnOyByYyA9IFslZF1cbiIsIHJjKTsKLQkJCW11dGV4X3VubG9jaygKLQkJCQkmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3RfbXV0ZXgpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleCk7CisKIG91dDoKKwltdXRleF91bmxvY2soJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmtleXNpZ19saXN0X211dGV4KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEyMTIsMTQgKzEyMTQsMTUgQEAKIAkJY3J5cHRfc3RhdC0+ZXh0ZW50X3NpemUgPSBFQ1JZUFRGU19ERUZBVUxUX0VYVEVOVF9TSVpFOwogCXJjID0gZWNyeXB0ZnNfcmVhZF9sb3dlcihkYXRhLCAwLCBjcnlwdF9zdGF0LT5leHRlbnRfc2l6ZSwKIAkJCQkgZWNyeXB0ZnNfaW5vZGUpOwotCWlmIChyYykgeworCWlmIChyYyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgcmVhZGluZyBoZWFkZXIgcmVnaW9uOyByYyA9IFslZF1cbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgcmMpOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKCFjb250YWluc19lY3J5cHRmc19tYXJrZXIoZGF0YSArIEVDUllQVEZTX0ZJTEVfU0laRV9CWVRFUykpIHsKIAkJcmMgPSAtRUlOVkFMOwotCX0KKwl9IGVsc2UKKwkJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTEzMTQsMTAgKzEzMTcsMTEgQEAKIAogCXJjID0gZWNyeXB0ZnNfd3JpdGVfbG93ZXIoZWNyeXB0ZnNfZGVudHJ5LT5kX2lub2RlLCB2aXJ0LAogCQkJCSAgMCwgdmlydF9sZW4pOwotCWlmIChyYykKKwlpZiAocmMgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIHdyaXRlIGhlYWRlciAiCi0JCSAgICAgICAiaW5mb3JtYXRpb24gdG8gbG93ZXIgZmlsZTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIHJjKTsKKwkJICAgICAgICJpbmZvcm1hdGlvbiB0byBsb3dlciBmaWxlOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJZWxzZQorCQlyYyA9IDA7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNTk3LDcgKzE2MDEsNyBAQAogCX0KIAlyYyA9IGVjcnlwdGZzX3JlYWRfbG93ZXIocGFnZV92aXJ0LCAwLCBjcnlwdF9zdGF0LT5leHRlbnRfc2l6ZSwKIAkJCQkgZWNyeXB0ZnNfaW5vZGUpOwotCWlmICghcmMpCisJaWYgKHJjID49IDApCiAJCXJjID0gZWNyeXB0ZnNfcmVhZF9oZWFkZXJzX3ZpcnQocGFnZV92aXJ0LCBjcnlwdF9zdGF0LAogCQkJCQkJZWNyeXB0ZnNfZGVudHJ5LAogCQkJCQkJRUNSWVBURlNfVkFMSURBVEVfSEVBREVSX1NJWkUpOwpAQCAtMTcwMiw3ICsxNzA2LDcgQEAKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBzdXBwb3J0IGZvciByZXF1ZXN0ZWQgZmlsZW5hbWUgIgogCQkgICAgICAgImVuY3J5cHRpb24gbWV0aG9kIGluIHRoaXMgcmVsZWFzZVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9UU1VQUDsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBvdXQ7CiAJfQogb3V0OgpAQCAtMTc2Myw3ICsxNzY3LDcgQEAKIAlpZiAoSVNfRVJSKCprZXlfdGZtKSkgewogCQlyYyA9IFBUUl9FUlIoKmtleV90Zm0pOwogCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBjcnlwdG8gY2lwaGVyIHdpdGggbmFtZSAiCi0JCSAgICAgICAiWyVzXTsgcmMgPSBbJWRdXG4iLCBjaXBoZXJfbmFtZSwgcmMpOworCQkgICAgICAgIlslc107IHJjID0gWyVkXVxuIiwgZnVsbF9hbGdfbmFtZSwgcmMpOwogCQlnb3RvIG91dDsKIAl9CiAJY3J5cHRvX2Jsa2NpcGhlcl9zZXRfZmxhZ3MoKmtleV90Zm0sIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKTsKQEAgLTE3NzYsNyArMTc4MCw4IEBACiAJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleSgqa2V5X3RmbSwgZHVtbXlfa2V5LCAqa2V5X3NpemUpOwogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gc2V0IGtleSBvZiBzaXplIFslemRdIGZvciAiCi0JCSAgICAgICAiY2lwaGVyIFslc107IHJjID0gWyVkXVxuIiwgKmtleV9zaXplLCBjaXBoZXJfbmFtZSwgcmMpOworCQkgICAgICAgImNpcGhlciBbJXNdOyByYyA9IFslZF1cbiIsICprZXlfc2l6ZSwgZnVsbF9hbGdfbmFtZSwKKwkJICAgICAgIHJjKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMTY2LDcgKzIxNzEsNyBAQAogCQkJKCplbmNvZGVkX25hbWUpWygqZW5jb2RlZF9uYW1lX3NpemUpXSA9ICdcMCc7CiAJCQkoKmVuY29kZWRfbmFtZV9zaXplKSsrOwogCQl9IGVsc2UgewotCQkJcmMgPSAtRU5PVFNVUFA7CisJCQlyYyA9IC1FT1BOT1RTVVBQOwogCQl9CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNvZGUgIgpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvaW5vZGUuYyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKaW5kZXggMmYwOTQ1ZC4uMDU2ZmVkNjIgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2lub2RlLmMKKysrIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwpAQCAtNDc2LDYgKzQ3Niw3IEBACiAJc3RydWN0IGlub2RlICpsb3dlcl9kaXJfaW5vZGUgPSBlY3J5cHRmc19pbm9kZV90b19sb3dlcihkaXIpOwogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2Rpcl9kZW50cnk7CiAKKwlkZ2V0KGxvd2VyX2RlbnRyeSk7CiAJbG93ZXJfZGlyX2RlbnRyeSA9IGxvY2tfcGFyZW50KGxvd2VyX2RlbnRyeSk7CiAJcmMgPSB2ZnNfdW5saW5rKGxvd2VyX2Rpcl9pbm9kZSwgbG93ZXJfZGVudHJ5KTsKIAlpZiAocmMpIHsKQEAgLTQ4OSw2ICs0OTAsNyBAQAogCWRfZHJvcChkZW50cnkpOwogb3V0X3VubG9jazoKIAl1bmxvY2tfZGlyKGxvd2VyX2Rpcl9kZW50cnkpOworCWRwdXQobG93ZXJfZGVudHJ5KTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCmluZGV4IDI1OTUyNWMuLmEwYTc4NDcgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKKysrIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwpAQCAtNDE2LDcgKzQxNiw5IEBACiAJCQkgICAgJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0LAogCQkJICAgIG1vdW50X2NyeXB0X3N0YXRfbGlzdCkgewogCQlpZiAobWVtY21wKHdhbGtlci0+c2lnLCBzaWcsIEVDUllQVEZTX1NJR19TSVpFX0hFWCkgPT0gMCkgewotCQkJKCpnbG9iYWxfYXV0aF90b2spID0gd2Fsa2VyOworCQkJcmMgPSBrZXlfdmFsaWRhdGUod2Fsa2VyLT5nbG9iYWxfYXV0aF90b2tfa2V5KTsKKwkJCWlmICghcmMpCisJCQkJKCpnbG9iYWxfYXV0aF90b2spID0gd2Fsa2VyOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC02MTIsNyArNjE0LDEyIEBACiAJfQogCS8qIFRPRE86IFN1cHBvcnQgb3RoZXIga2V5IG1vZHVsZXMgdGhhbiBwYXNzcGhyYXNlIGZvcgogCSAqIGZpbGVuYW1lIGVuY3J5cHRpb24gKi8KLQlCVUdfT04ocy0+YXV0aF90b2stPnRva2VuX3R5cGUgIT0gRUNSWVBURlNfUEFTU1dPUkQpOworCWlmIChzLT5hdXRoX3Rvay0+dG9rZW5fdHlwZSAhPSBFQ1JZUFRGU19QQVNTV09SRCkgeworCQlyYyA9IC1FT1BOT1RTVVBQOworCQlwcmludGsoS0VSTl9JTkZPICIlczogRmlsZW5hbWUgZW5jcnlwdGlvbiBvbmx5IHN1cHBvcnRzICIKKwkJICAgICAgICJwYXNzd29yZCB0b2tlbnNcbiIsIF9fZnVuY19fKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQogCXNnX2luaXRfb25lKAogCQkmcy0+aGFzaF9zZywKIAkJKHU4ICopcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LApAQCAtOTEwLDcgKzkxNywxMiBAQAogCX0KIAkvKiBUT0RPOiBTdXBwb3J0IG90aGVyIGtleSBtb2R1bGVzIHRoYW4gcGFzc3BocmFzZSBmb3IKIAkgKiBmaWxlbmFtZSBlbmNyeXB0aW9uICovCi0JQlVHX09OKHMtPmF1dGhfdG9rLT50b2tlbl90eXBlICE9IEVDUllQVEZTX1BBU1NXT1JEKTsKKwlpZiAocy0+YXV0aF90b2stPnRva2VuX3R5cGUgIT0gRUNSWVBURlNfUEFTU1dPUkQpIHsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZpbGVuYW1lIGVuY3J5cHRpb24gb25seSBzdXBwb3J0cyAiCisJCSAgICAgICAicGFzc3dvcmQgdG9rZW5zXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KIAlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KAogCQlzLT5kZXNjLnRmbSwKIAkJcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LApAQCAtMTMxNiw4ICsxMzI4LDEwIEBACiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXRfZnJlZTsKIAl9Ci0JZWNyeXB0ZnNfY2lwaGVyX2NvZGVfdG9fc3RyaW5nKGNyeXB0X3N0YXQtPmNpcGhlciwKLQkJCQkgICAgICAgKHUxNilkYXRhWygqcGFja2V0X3NpemUpXSk7CisJcmMgPSBlY3J5cHRmc19jaXBoZXJfY29kZV90b19zdHJpbmcoY3J5cHRfc3RhdC0+Y2lwaGVyLAorCQkJCQkgICAgKHUxNilkYXRhWygqcGFja2V0X3NpemUpXSk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9mcmVlOwogCS8qIEEgbGl0dGxlIGV4dHJhIHdvcmsgdG8gZGlmZmVyZW50aWF0ZSBhbW9uZyB0aGUgQUVTIGtleQogCSAqIHNpemVzOyBzZWUgUkZDMjQ0MCAqLwogCXN3aXRjaChkYXRhWygqcGFja2V0X3NpemUpKytdKSB7CkBAIC0xMzI4LDcgKzEzNDIsOSBAQAogCQljcnlwdF9zdGF0LT5rZXlfc2l6ZSA9CiAJCQkoKm5ld19hdXRoX3RvayktPnNlc3Npb25fa2V5LmVuY3J5cHRlZF9rZXlfc2l6ZTsKIAl9Ci0JZWNyeXB0ZnNfaW5pdF9jcnlwdF9jdHgoY3J5cHRfc3RhdCk7CisJcmMgPSBlY3J5cHRmc19pbml0X2NyeXB0X2N0eChjcnlwdF9zdGF0KTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2ZyZWU7CiAJaWYgKHVubGlrZWx5KGRhdGFbKCpwYWNrZXRfc2l6ZSkrK10gIT0gMHgwMykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiT25seSBTMksgSUQgMyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkXG4iKTsKIAkJcmMgPSAtRU5PU1lTOwpAQCAtMjM2NiwyMSArMjM4MiwxOCBAQAogaW50IGVjcnlwdGZzX2FkZF9rZXlzaWcoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsIGNoYXIgKnNpZykKIHsKIAlzdHJ1Y3QgZWNyeXB0ZnNfa2V5X3NpZyAqbmV3X2tleV9zaWc7Ci0JaW50IHJjID0gMDsKIAogCW5ld19rZXlfc2lnID0ga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19rZXlfc2lnX2NhY2hlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19rZXlfc2lnKSB7Ci0JCXJjID0gLUVOT01FTTsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiRXJyb3IgYWxsb2NhdGluZyBmcm9tIGVjcnlwdGZzX2tleV9zaWdfY2FjaGVcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1lbWNweShuZXdfa2V5X3NpZy0+a2V5c2lnLCBzaWcsIEVDUllQVEZTX1NJR19TSVpFX0hFWCk7Ci0JbXV0ZXhfbG9jaygmY3J5cHRfc3RhdC0+a2V5c2lnX2xpc3RfbXV0ZXgpOworCS8qIENhbGxlciBtdXN0IGhvbGQga2V5c2lnX2xpc3RfbXV0ZXggKi8KIAlsaXN0X2FkZCgmbmV3X2tleV9zaWctPmNyeXB0X3N0YXRfbGlzdCwgJmNyeXB0X3N0YXQtPmtleXNpZ19saXN0KTsKLQltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmtleXNpZ19saXN0X211dGV4KTsKLW91dDoKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2dsb2JhbF9hdXRoX3Rva19jYWNoZTsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2t0aHJlYWQuYyBiL2ZzL2VjcnlwdGZzL2t0aHJlYWQuYwppbmRleCBjNmQ3YTRkLi5lMTRjZjdlIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9rdGhyZWFkLmMKKysrIGIvZnMvZWNyeXB0ZnMva3RocmVhZC5jCkBAIC0xMzYsNiArMTM2LDcgQEAKIAkJCSAgICAgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQpCiB7CiAJc3RydWN0IGVjcnlwdGZzX29wZW5fcmVxICpyZXE7CisJaW50IGZsYWdzID0gT19MQVJHRUZJTEU7CiAJaW50IHJjID0gMDsKIAogCS8qIENvcnJlc3BvbmRpbmcgZHB1dCgpIGFuZCBtbnRwdXQoKSBhcmUgZG9uZSB3aGVuIHRoZQpAQCAtMTQzLDEwICsxNDQsMTQgQEAKIAkgKiBkZXN0cm95ZWQuICovCiAJZGdldChsb3dlcl9kZW50cnkpOwogCW1udGdldChsb3dlcl9tbnQpOwotCSgqbG93ZXJfZmlsZSkgPSBkZW50cnlfb3Blbihsb3dlcl9kZW50cnksIGxvd2VyX21udCwKLQkJCQkgICAgKE9fUkRXUiB8IE9fTEFSR0VGSUxFKSwgY3JlZCk7CisJZmxhZ3MgfD0gSVNfUkRPTkxZKGxvd2VyX2RlbnRyeS0+ZF9pbm9kZSkgPyBPX1JET05MWSA6IE9fUkRXUjsKKwkoKmxvd2VyX2ZpbGUpID0gZGVudHJ5X29wZW4obG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsIGZsYWdzLCBjcmVkKTsKIAlpZiAoIUlTX0VSUigqbG93ZXJfZmlsZSkpCiAJCWdvdG8gb3V0OworCWlmIChmbGFncyAmIE9fUkRPTkxZKSB7CisJCXJjID0gUFRSX0VSUigoKmxvd2VyX2ZpbGUpKTsKKwkJZ290byBvdXQ7CisJfQogCXJlcSA9IGttZW1fY2FjaGVfYWxsb2MoZWNyeXB0ZnNfb3Blbl9yZXFfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghcmVxKSB7CiAJCXJjID0gLUVOT01FTTsKQEAgLTE4MCwyMSArMTg1LDggQEAKIAkJICAgICAgIF9fZnVuY19fKTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQlpZiAoSVNfRVJSKCpyZXEtPmxvd2VyX2ZpbGUpKSB7CisJaWYgKElTX0VSUigqcmVxLT5sb3dlcl9maWxlKSkKIAkJcmMgPSBQVFJfRVJSKCpyZXEtPmxvd2VyX2ZpbGUpOwotCQlkZ2V0KGxvd2VyX2RlbnRyeSk7Ci0JCW1udGdldChsb3dlcl9tbnQpOwotCQkoKmxvd2VyX2ZpbGUpID0gZGVudHJ5X29wZW4obG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsCi0JCQkJCSAgICAoT19SRE9OTFkgfCBPX0xBUkdFRklMRSksIGNyZWQpOwotCQlpZiAoSVNfRVJSKCpsb3dlcl9maWxlKSkgewotCQkJcmMgPSBQVFJfRVJSKCpyZXEtPmxvd2VyX2ZpbGUpOwotCQkJKCpsb3dlcl9maWxlKSA9IE5VTEw7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgYXR0ZW1wdGluZyBwcml2aWxlZ2VkICIKLQkJCSAgICAgICAib3BlbiBvZiBsb3dlciBmaWxlIHdpdGggZWl0aGVyIFJXIG9yIFJPICIKLQkJCSAgICAgICAicGVybXM7IHJjID0gWyVkXS4gR2l2aW5nIHVwLlxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCQl9Ci0JfQogb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJnJlcS0+bXV4KTsKIG91dF9mcmVlOgpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWFpbi5jIGIvZnMvZWNyeXB0ZnMvbWFpbi5jCmluZGV4IDlmMGFhOTguLmM2YWM4NWQgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21haW4uYworKysgYi9mcy9lY3J5cHRmcy9tYWluLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9mc19zdGFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2ltYS5oPgogI2luY2x1ZGUgImVjcnlwdGZzX2tlcm5lbC5oIgogCiAvKioKQEAgLTExOCw2ICsxMTksNyBAQAogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7CiAJc3RydWN0IGVjcnlwdGZzX2lub2RlX2luZm8gKmlub2RlX2luZm8gPQogCQllY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGVjcnlwdGZzX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IG9wZW5lZF9sb3dlcl9maWxlID0gMDsKIAlpbnQgcmMgPSAwOwogCiAJbXV0ZXhfbG9jaygmaW5vZGVfaW5mby0+bG93ZXJfZmlsZV9tdXRleCk7CkBAIC0xMjksMTUgKzEzMSwxNyBAQAogCQlsb3dlcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZWNyeXB0ZnNfZGVudHJ5KTsKIAkJcmMgPSBlY3J5cHRmc19wcml2aWxlZ2VkX29wZW4oJmlub2RlX2luZm8tPmxvd2VyX2ZpbGUsCiAJCQkJCSAgICAgIGxvd2VyX2RlbnRyeSwgbG93ZXJfbW50LCBjcmVkKTsKLQkJaWYgKHJjIHx8IElTX0VSUihpbm9kZV9pbmZvLT5sb3dlcl9maWxlKSkgeworCQlpZiAocmMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3Igb3BlbmluZyBsb3dlciBwZXJzaXN0ZW50IGZpbGUgIgogCQkJICAgICAgICJmb3IgbG93ZXJfZGVudHJ5IFsweCVwXSBhbmQgbG93ZXJfbW50IFsweCVwXTsgIgogCQkJICAgICAgICJyYyA9IFslZF1cbiIsIGxvd2VyX2RlbnRyeSwgbG93ZXJfbW50LCByYyk7Ci0JCQlyYyA9IFBUUl9FUlIoaW5vZGVfaW5mby0+bG93ZXJfZmlsZSk7CiAJCQlpbm9kZV9pbmZvLT5sb3dlcl9maWxlID0gTlVMTDsKLQkJfQorCQl9IGVsc2UKKwkJCW9wZW5lZF9sb3dlcl9maWxlID0gMTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZpbm9kZV9pbmZvLT5sb3dlcl9maWxlX211dGV4KTsKKwlpZiAob3BlbmVkX2xvd2VyX2ZpbGUpCisJCWltYV9jb3VudHNfZ2V0KGlub2RlX2luZm8tPmxvd2VyX2ZpbGUpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbW1hcC5jIGIvZnMvZWNyeXB0ZnMvbW1hcC5jCmluZGV4IDA1NzcyYWUuLmRmNGNlOTkgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21tYXAuYworKysgYi9mcy9lY3J5cHRmcy9tbWFwLmMKQEAgLTM5Niw5ICszOTYsMTEgQEAKIAlyYyA9IGVjcnlwdGZzX3dyaXRlX2xvd2VyKGVjcnlwdGZzX2lub2RlLCBmaWxlX3NpemVfdmlydCwgMCwKIAkJCQkgIHNpemVvZih1NjQpKTsKIAlrZnJlZShmaWxlX3NpemVfdmlydCk7Ci0JaWYgKHJjKQorCWlmIChyYyA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdyaXRpbmcgZmlsZSBzaXplIHRvIGhlYWRlcjsgIgogCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwllbHNlCisJCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9yZWFkX3dyaXRlLmMgYi9mcy9lY3J5cHRmcy9yZWFkX3dyaXRlLmMKaW5kZXggYTEzN2M2ZS4uMGNjNGZhZiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL2VjcnlwdGZzL3JlYWRfd3JpdGUuYwpAQCAtMzQsMTUgKzM0LDE0IEBACiAgKgogICogV3JpdGUgZGF0YSB0byB0aGUgbG93ZXIgZmlsZS4KICAqCi0gKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzczsgbm9uLXplcm8gb24gZXJyb3IKKyAqIFJldHVybnMgYnl0ZXMgd3JpdHRlbiBvbiBzdWNjZXNzOyBsZXNzIHRoYW4gemVybyBvbiBlcnJvcgogICovCiBpbnQgZWNyeXB0ZnNfd3JpdGVfbG93ZXIoc3RydWN0IGlub2RlICplY3J5cHRmc19pbm9kZSwgY2hhciAqZGF0YSwKIAkJCSBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgZWNyeXB0ZnNfaW5vZGVfaW5mbyAqaW5vZGVfaW5mbzsKLQlzc2l6ZV90IG9jdGV0c193cml0dGVuOwogCW1tX3NlZ21lbnRfdCBmc19zYXZlOwotCWludCByYyA9IDA7CisJc3NpemVfdCByYzsKIAogCWlub2RlX2luZm8gPSBlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGVjcnlwdGZzX2lub2RlKTsKIAltdXRleF9sb2NrKCZpbm9kZV9pbmZvLT5sb3dlcl9maWxlX211dGV4KTsKQEAgLTUwLDE0ICs0OSw5IEBACiAJaW5vZGVfaW5mby0+bG93ZXJfZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CiAJZnNfc2F2ZSA9IGdldF9mcygpOwogCXNldF9mcyhnZXRfZHMoKSk7Ci0Jb2N0ZXRzX3dyaXR0ZW4gPSB2ZnNfd3JpdGUoaW5vZGVfaW5mby0+bG93ZXJfZmlsZSwgZGF0YSwgc2l6ZSwKLQkJCQkgICAmaW5vZGVfaW5mby0+bG93ZXJfZmlsZS0+Zl9wb3MpOworCXJjID0gdmZzX3dyaXRlKGlub2RlX2luZm8tPmxvd2VyX2ZpbGUsIGRhdGEsIHNpemUsCisJCSAgICAgICAmaW5vZGVfaW5mby0+bG93ZXJfZmlsZS0+Zl9wb3MpOwogCXNldF9mcyhmc19zYXZlKTsKLQlpZiAob2N0ZXRzX3dyaXR0ZW4gPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG9jdGV0c193cml0dGVuID0gWyV0ZF07ICIKLQkJICAgICAgICJleHBlY3RlZCBbJXRkXVxuIiwgX19mdW5jX18sIG9jdGV0c193cml0dGVuLCBzaXplKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KIAltdXRleF91bmxvY2soJmlub2RlX2luZm8tPmxvd2VyX2ZpbGVfbXV0ZXgpOwogCW1hcmtfaW5vZGVfZGlydHlfc3luYyhlY3J5cHRmc19pbm9kZSk7CiAJcmV0dXJuIHJjOwpAQCAtOTEsNiArODUsOCBAQAogCQkgICsgb2Zmc2V0X2luX3BhZ2UpOwogCXZpcnQgPSBrbWFwKHBhZ2VfZm9yX2xvd2VyKTsKIAlyYyA9IGVjcnlwdGZzX3dyaXRlX2xvd2VyKGVjcnlwdGZzX2lub2RlLCB2aXJ0LCBvZmZzZXQsIHNpemUpOworCWlmIChyYyA+IDApCisJCXJjID0gMDsKIAlrdW5tYXAocGFnZV9mb3JfbG93ZXIpOwogCXJldHVybiByYzsKIH0KQEAgLTIyOSwzMCArMjI1LDI0IEBACiAgKiBSZWFkIEBzaXplIGJ5dGVzIG9mIGRhdGEgYXQgYnl0ZSBvZmZzZXQgQG9mZnNldCBmcm9tIHRoZSBsb3dlcgogICogaW5vZGUgaW50byBtZW1vcnkgbG9jYXRpb24gQGRhdGEuCiAgKgotICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG9uIGVycm9yCisgKiBSZXR1cm5zIGJ5dGVzIHJlYWQgb24gc3VjY2VzczsgMCBvbiBFT0Y7IGxlc3MgdGhhbiB6ZXJvIG9uIGVycm9yCiAgKi8KIGludCBlY3J5cHRmc19yZWFkX2xvd2VyKGNoYXIgKmRhdGEsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBzaXplLAogCQkJc3RydWN0IGlub2RlICplY3J5cHRmc19pbm9kZSkKIHsKIAlzdHJ1Y3QgZWNyeXB0ZnNfaW5vZGVfaW5mbyAqaW5vZGVfaW5mbyA9CiAJCWVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZWNyeXB0ZnNfaW5vZGUpOwotCXNzaXplX3Qgb2N0ZXRzX3JlYWQ7CiAJbW1fc2VnbWVudF90IGZzX3NhdmU7Ci0JaW50IHJjID0gMDsKKwlzc2l6ZV90IHJjOwogCiAJbXV0ZXhfbG9jaygmaW5vZGVfaW5mby0+bG93ZXJfZmlsZV9tdXRleCk7CiAJQlVHX09OKCFpbm9kZV9pbmZvLT5sb3dlcl9maWxlKTsKIAlpbm9kZV9pbmZvLT5sb3dlcl9maWxlLT5mX3BvcyA9IG9mZnNldDsKIAlmc19zYXZlID0gZ2V0X2ZzKCk7CiAJc2V0X2ZzKGdldF9kcygpKTsKLQlvY3RldHNfcmVhZCA9IHZmc19yZWFkKGlub2RlX2luZm8tPmxvd2VyX2ZpbGUsIGRhdGEsIHNpemUsCi0JCQkgICAgICAgJmlub2RlX2luZm8tPmxvd2VyX2ZpbGUtPmZfcG9zKTsKKwlyYyA9IHZmc19yZWFkKGlub2RlX2luZm8tPmxvd2VyX2ZpbGUsIGRhdGEsIHNpemUsCisJCSAgICAgICZpbm9kZV9pbmZvLT5sb3dlcl9maWxlLT5mX3Bvcyk7CiAJc2V0X2ZzKGZzX3NhdmUpOwotCWlmIChvY3RldHNfcmVhZCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogb2N0ZXRzX3JlYWQgPSBbJXRkXTsgIgotCQkgICAgICAgImV4cGVjdGVkIFsldGRdXG4iLCBfX2Z1bmNfXywgb2N0ZXRzX3JlYWQsIHNpemUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQogCW11dGV4X3VubG9jaygmaW5vZGVfaW5mby0+bG93ZXJfZmlsZV9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMjg0LDYgKzI3NCw4IEBACiAJb2Zmc2V0ID0gKCgoKGxvZmZfdClwYWdlX2luZGV4KSA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIG9mZnNldF9pbl9wYWdlKTsKIAl2aXJ0ID0ga21hcChwYWdlX2Zvcl9lY3J5cHRmcyk7CiAJcmMgPSBlY3J5cHRmc19yZWFkX2xvd2VyKHZpcnQsIG9mZnNldCwgc2l6ZSwgZWNyeXB0ZnNfaW5vZGUpOworCWlmIChyYyA+IDApCisJCXJjID0gMDsKIAlrdW5tYXAocGFnZV9mb3JfZWNyeXB0ZnMpOwogCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VfZm9yX2VjcnlwdGZzKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9zdXBlci5jIGIvZnMvZWNyeXB0ZnMvc3VwZXIuYwppbmRleCAxMmQ2NDk2Li5iMTVhNDNhIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9zdXBlci5jCisrKyBiL2ZzL2VjcnlwdGZzL3N1cGVyLmMKQEAgLTc3LDcgKzc3LDYgQEAKIAlzdHJ1Y3QgZWNyeXB0ZnNfaW5vZGVfaW5mbyAqaW5vZGVfaW5mbzsKIAogCWlub2RlX2luZm8gPSBlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGlub2RlKTsKLQltdXRleF9sb2NrKCZpbm9kZV9pbmZvLT5sb3dlcl9maWxlX211dGV4KTsKIAlpZiAoaW5vZGVfaW5mby0+bG93ZXJfZmlsZSkgewogCQlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnkgPQogCQkJaW5vZGVfaW5mby0+bG93ZXJfZmlsZS0+Zl9kZW50cnk7CkBAIC04OSw3ICs4OCw2IEBACiAJCQlkX2Ryb3AobG93ZXJfZGVudHJ5KTsKIAkJfQogCX0KLQltdXRleF91bmxvY2soJmlub2RlX2luZm8tPmxvd2VyX2ZpbGVfbXV0ZXgpOwogCWVjcnlwdGZzX2Rlc3Ryb3lfY3J5cHRfc3RhdCgmaW5vZGVfaW5mby0+Y3J5cHRfc3RhdCk7CiAJa21lbV9jYWNoZV9mcmVlKGVjcnlwdGZzX2lub2RlX2luZm9fY2FjaGUsIGlub2RlX2luZm8pOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDVjODMzYzEuLmQ0OWJlNmIgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9mc19zdHJ1Y3QuaD4KKyNpbmNsdWRlIDxsaW51eC9waXBlX2ZzX2kuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC02Myw2ICs2NCw3IEBACiAKIGludCBjb3JlX3VzZXNfcGlkOwogY2hhciBjb3JlX3BhdHRlcm5bQ09SRU5BTUVfTUFYX1NJWkVdID0gImNvcmUiOwordW5zaWduZWQgaW50IGNvcmVfcGlwZV9saW1pdDsKIGludCBzdWlkX2R1bXBhYmxlID0gMDsKIAogLyogVGhlIG1heGltYWwgbGVuZ3RoIG9mIGNvcmVfcGF0dGVybiBpcyBhbHNvIHNwZWNpZmllZCBpbiBzeXNjdGwuYyAqLwpAQCAtMTM5MywxOCArMTM5NSwxNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWludCBzZXRfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKm5ldykKK3ZvaWQgc2V0X2JpbmZtdChzdHJ1Y3QgbGludXhfYmluZm10ICpuZXcpCiB7Ci0Jc3RydWN0IGxpbnV4X2JpbmZtdCAqb2xkID0gY3VycmVudC0+YmluZm10OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAKLQlpZiAobmV3KSB7Ci0JCWlmICghdHJ5X21vZHVsZV9nZXQobmV3LT5tb2R1bGUpKQotCQkJcmV0dXJuIC0xOwotCX0KLQljdXJyZW50LT5iaW5mbXQgPSBuZXc7Ci0JaWYgKG9sZCkKLQkJbW9kdWxlX3B1dChvbGQtPm1vZHVsZSk7Ci0JcmV0dXJuIDA7CisJaWYgKG1tLT5iaW5mbXQpCisJCW1vZHVsZV9wdXQobW0tPmJpbmZtdC0+bW9kdWxlKTsKKworCW1tLT5iaW5mbXQgPSBuZXc7CisJaWYgKG5ldykKKwkJX19tb2R1bGVfZ2V0KG5ldy0+bW9kdWxlKTsKIH0KIAogRVhQT1JUX1NZTUJPTChzZXRfYmluZm10KTsKQEAgLTE3MjgsNiArMTcyOCwyOSBAQAogCXJldHVybiAocmV0ID49IDIpID8gMiA6IHJldDsKIH0KIAorc3RhdGljIHZvaWQgd2FpdF9mb3JfZHVtcF9oZWxwZXJzKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGU7CisKKwlwaXBlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9waXBlOworCisJcGlwZV9sb2NrKHBpcGUpOworCXBpcGUtPnJlYWRlcnMrKzsKKwlwaXBlLT53cml0ZXJzLS07CisKKwl3aGlsZSAoKHBpcGUtPnJlYWRlcnMgPiAxKSAmJiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYygmcGlwZS0+d2FpdCk7CisJCWtpbGxfZmFzeW5jKCZwaXBlLT5mYXN5bmNfcmVhZGVycywgU0lHSU8sIFBPTExfSU4pOworCQlwaXBlX3dhaXQocGlwZSk7CisJfQorCisJcGlwZS0+cmVhZGVycy0tOworCXBpcGUtPndyaXRlcnMrKzsKKwlwaXBlX3VubG9jayhwaXBlKTsKKworfQorCisKIHZvaWQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGNvcmVfc3RhdGUgY29yZV9zdGF0ZTsKQEAgLTE3NDQsMTEgKzE3NjcsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGNvcmVfbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0NPUkVdLnJsaW1fY3VyOwogCWNoYXIgKipoZWxwZXJfYXJndiA9IE5VTEw7CiAJaW50IGhlbHBlcl9hcmdjID0gMDsKLQljaGFyICpkZWxpbWl0OworCWludCBkdW1wX2NvdW50ID0gMDsKKwlzdGF0aWMgYXRvbWljX3QgY29yZV9kdW1wX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CiAKIAlhdWRpdF9jb3JlX2R1bXBzKHNpZ25yKTsKIAotCWJpbmZtdCA9IGN1cnJlbnQtPmJpbmZtdDsKKwliaW5mbXQgPSBtbS0+YmluZm10OwogCWlmICghYmluZm10IHx8ICFiaW5mbXQtPmNvcmVfZHVtcCkKIAkJZ290byBmYWlsOwogCkBAIC0xNzk5LDU0ICsxODIzLDYzIEBACiAgCWxvY2tfa2VybmVsKCk7CiAJaXNwaXBlID0gZm9ybWF0X2NvcmVuYW1lKGNvcmVuYW1lLCBzaWducik7CiAJdW5sb2NrX2tlcm5lbCgpOwotCS8qCi0JICogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIHRoZSBSTElNSVRfQ09SRSB2YWx1ZSBpZiBjb3JlX3BhdHRlcm4gcG9pbnRzCi0JICogdG8gYSBwaXBlLiAgU2luY2Ugd2UncmUgbm90IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIGZpbGVzeXN0ZW0KLQkgKiBSTElNSVRfQ09SRSBkb2Vzbid0IHJlYWxseSBhcHBseSwgYXMgbm8gYWN0dWFsIGNvcmUgZmlsZSB3aWxsIGJlCi0JICogY3JlYXRlZCB1bmxlc3MgdGhlIHBpcGUgcmVhZGVyIGNob3NlcyB0byB3cml0ZSBvdXQgdGhlIGNvcmUgZmlsZQotCSAqIGF0IHdoaWNoIHBvaW50IGZpbGUgc2l6ZSBsaW1pdHMgYW5kIHBlcm1pc3Npb25zIHdpbGwgYmUgaW1wb3NlZAotCSAqIGFzIGl0IGRvZXMgd2l0aCBhbnkgb3RoZXIgcHJvY2VzcwotCSAqLworCiAJaWYgKCghaXNwaXBlKSAmJiAoY29yZV9saW1pdCA8IGJpbmZtdC0+bWluX2NvcmVkdW1wKSkKIAkJZ290byBmYWlsX3VubG9jazsKIAogIAlpZiAoaXNwaXBlKSB7CisJCWlmIChjb3JlX2xpbWl0ID09IDApIHsKKwkJCS8qCisJCQkgKiBOb3JtYWxseSBjb3JlIGxpbWl0cyBhcmUgaXJyZWxldmFudCB0byBwaXBlcywgc2luY2UKKwkJCSAqIHdlJ3JlIG5vdCB3cml0aW5nIHRvIHRoZSBmaWxlIHN5c3RlbSwgYnV0IHdlIHVzZQorCQkJICogY29yZV9saW1pdCBvZiAwIGhlcmUgYXMgYSBzcGVhY2lhbCB2YWx1ZS4gQW55CisJCQkgKiBub24temVybyBsaW1pdCBnZXRzIHNldCB0byBSTElNX0lORklOSVRZIGJlbG93LCBidXQKKwkJCSAqIGEgbGltaXQgb2YgMCBza2lwcyB0aGUgZHVtcC4gIFRoaXMgaXMgYSBjb25zaXN0ZW50CisJCQkgKiB3YXkgdG8gY2F0Y2ggcmVjdXJzaXZlIGNyYXNoZXMuICBXZSBjYW4gc3RpbGwgY3Jhc2gKKwkJCSAqIGlmIHRoZSBjb3JlX3BhdHRlcm4gYmluYXJ5IHNldHMgUkxJTV9DT1JFID0gICEwCisJCQkgKiBidXQgaXQgcnVucyBhcyByb290LCBhbmQgY2FuIGRvIGxvdHMgb2Ygc3R1cGlkIHRoaW5ncworCQkJICogTm90ZSB0aGF0IHdlIHVzZSB0YXNrX3RnaWRfdm5yIGhlcmUgdG8gZ3JhYiB0aGUgcGlkCisJCQkgKiBvZiB0aGUgcHJvY2VzcyBncm91cCBsZWFkZXIuICBUaGF0IHdheSB3ZSBnZXQgdGhlCisJCQkgKiByaWdodCBwaWQgaWYgYSB0aHJlYWQgaW4gYSBtdWx0aS10aHJlYWRlZAorCQkJICogY29yZV9wYXR0ZXJuIHByb2Nlc3MgZGllcy4KKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJQcm9jZXNzICVkKCVzKSBoYXMgUkxJTUlUX0NPUkUgc2V0IHRvIDBcbiIsCisJCQkJdGFza190Z2lkX3ZucihjdXJyZW50KSwgY3VycmVudC0+Y29tbSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBYm9ydGluZyBjb3JlXG4iKTsKKwkJCWdvdG8gZmFpbF91bmxvY2s7CisJCX0KKworCQlkdW1wX2NvdW50ID0gYXRvbWljX2luY19yZXR1cm4oJmNvcmVfZHVtcF9jb3VudCk7CisJCWlmIChjb3JlX3BpcGVfbGltaXQgJiYgKGNvcmVfcGlwZV9saW1pdCA8IGR1bXBfY291bnQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQaWQgJWQoJXMpIG92ZXIgY29yZV9waXBlX2xpbWl0XG4iLAorCQkJICAgICAgIHRhc2tfdGdpZF92bnIoY3VycmVudCksIGN1cnJlbnQtPmNvbW0pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2tpcHBpbmcgY29yZSBkdW1wXG4iKTsKKwkJCWdvdG8gZmFpbF9kcm9wY291bnQ7CisJCX0KKwogCQloZWxwZXJfYXJndiA9IGFyZ3Zfc3BsaXQoR0ZQX0tFUk5FTCwgY29yZW5hbWUrMSwgJmhlbHBlcl9hcmdjKTsKIAkJaWYgKCFoZWxwZXJfYXJndikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZhaWxfdW5sb2NrOwotCQl9Ci0JCS8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nIGJlZm9yZSB0aGUgZmlyc3Qgb3B0aW9uICovCi0JCWRlbGltaXQgPSBzdHJjaHIoY29yZW5hbWUsICcgJyk7Ci0JCWlmIChkZWxpbWl0KQotCQkJKmRlbGltaXQgPSAnXDAnOwotCQlkZWxpbWl0ID0gc3RycmNocihoZWxwZXJfYXJndlswXSwgJy8nKTsKLQkJaWYgKGRlbGltaXQpCi0JCQlkZWxpbWl0Kys7Ci0JCWVsc2UKLQkJCWRlbGltaXQgPSBoZWxwZXJfYXJndlswXTsKLQkJaWYgKCFzdHJjbXAoZGVsaW1pdCwgY3VycmVudC0+Y29tbSkpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiUmVjdXJzaXZlIGNvcmUgZHVtcCBkZXRlY3RlZCwgIgotCQkJCQkiYWJvcnRpbmdcbiIpOwotCQkJZ290byBmYWlsX3VubG9jazsKKwkJCWdvdG8gZmFpbF9kcm9wY291bnQ7CiAJCX0KIAogCQljb3JlX2xpbWl0ID0gUkxJTV9JTkZJTklUWTsKIAogCQkvKiBTSUdQSVBFIGNhbiBoYXBwZW4sIGJ1dCBpdCdzIGp1c3QgbmV2ZXIgcHJvY2Vzc2VkICovCi0gCQlpZiAoY2FsbF91c2VybW9kZWhlbHBlcl9waXBlKGNvcmVuYW1lKzEsIGhlbHBlcl9hcmd2LCBOVUxMLAorCQlpZiAoY2FsbF91c2VybW9kZWhlbHBlcl9waXBlKGhlbHBlcl9hcmd2WzBdLCBoZWxwZXJfYXJndiwgTlVMTCwKIAkJCQkmZmlsZSkpIHsKICAJCQlwcmludGsoS0VSTl9JTkZPICJDb3JlIGR1bXAgdG8gJXMgcGlwZSBmYWlsZWRcbiIsCiAJCQkgICAgICAgY29yZW5hbWUpOwotIAkJCWdvdG8gZmFpbF91bmxvY2s7CisJCQlnb3RvIGZhaWxfZHJvcGNvdW50OwogIAkJfQogIAl9IGVsc2UKICAJCWZpbGUgPSBmaWxwX29wZW4oY29yZW5hbWUsCiAJCQkJIE9fQ1JFQVQgfCAyIHwgT19OT0ZPTExPVyB8IE9fTEFSR0VGSUxFIHwgZmxhZywKIAkJCQkgMDYwMCk7CiAJaWYgKElTX0VSUihmaWxlKSkKLQkJZ290byBmYWlsX3VubG9jazsKKwkJZ290byBmYWlsX2Ryb3Bjb3VudDsKIAlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKGlub2RlLT5pX25saW5rID4gMSkKIAkJZ290byBjbG9zZV9mYWlsOwkvKiBtdWx0aXBsZSBsaW5rcyAtIGRvbid0IGR1bXAgKi8KQEAgLTE4NzUsNyArMTkwOCwxMiBAQAogCWlmIChyZXR2YWwpCiAJCWN1cnJlbnQtPnNpZ25hbC0+Z3JvdXBfZXhpdF9jb2RlIHw9IDB4ODA7CiBjbG9zZV9mYWlsOgorCWlmIChpc3BpcGUgJiYgY29yZV9waXBlX2xpbWl0KQorCQl3YWl0X2Zvcl9kdW1wX2hlbHBlcnMoZmlsZSk7CiAJZmlscF9jbG9zZShmaWxlLCBOVUxMKTsKK2ZhaWxfZHJvcGNvdW50OgorCWlmIChkdW1wX2NvdW50KQorCQlhdG9taWNfZGVjKCZjb3JlX2R1bXBfY291bnQpOwogZmFpbF91bmxvY2s6CiAJaWYgKGhlbHBlcl9hcmd2KQogCQlhcmd2X2ZyZWUoaGVscGVyX2FyZ3YpOwpkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvc3VwZXIuYyBiL2ZzL2V4b2ZzL3N1cGVyLmMKaW5kZXggNWFiMTBjMy4uOWY1MDBkZSAxMDA2NDQKLS0tIGEvZnMvZXhvZnMvc3VwZXIuYworKysgYi9mcy9leG9mcy9zdXBlci5jCkBAIC0yMTQsNyArMjE0LDYgQEAKIAl9CiAKIAlsb2NrX3N1cGVyKHNiKTsKLQlsb2NrX2tlcm5lbCgpOwogCXNiaSA9IHNiLT5zX2ZzX2luZm87CiAJZnNjYi0+c19uZXh0aWQgPSBjcHVfdG9fbGU2NChzYmktPnNfbmV4dGlkKTsKIAlmc2NiLT5zX251bWZpbGVzID0gY3B1X3RvX2xlMzIoc2JpLT5zX251bWZpbGVzKTsKQEAgLTI0NSw3ICsyNDQsNiBAQAogb3V0OgogCWlmIChvcikKIAkJb3NkX2VuZF9yZXF1ZXN0KG9yKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJdW5sb2NrX3N1cGVyKHNiKTsKIAlrZnJlZShmc2NiKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjY4LDggKzI2Niw2IEBACiAJaW50IG51bV9wZW5kOwogCXN0cnVjdCBleG9mc19zYl9pbmZvICpzYmkgPSBzYi0+c19mc19pbmZvOwogCi0JbG9ja19rZXJuZWwoKTsKLQogCWlmIChzYi0+c19kaXJ0KQogCQlleG9mc193cml0ZV9zdXBlcihzYik7CiAKQEAgLTI4Niw4ICsyODIsNiBAQAogCW9zZHVsZF9wdXRfZGV2aWNlKHNiaS0+c19kZXYpOwogCWtmcmVlKHNiLT5zX2ZzX2luZm8pOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwotCi0JdW5sb2NrX2tlcm5lbCgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9pbm9kZS5jIGIvZnMvZXh0Mi9pbm9kZS5jCmluZGV4IDFjMTYzOGYuLmFkZTYzNDAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvaW5vZGUuYworKysgYi9mcy9leHQyL2lub2RlLmMKQEAgLTgxOSw2ICs4MTksNyBAQAogCS53cml0ZXBhZ2VzCQk9IGV4dDJfd3JpdGVwYWdlcywKIAkubWlncmF0ZXBhZ2UJCT0gYnVmZmVyX21pZ3JhdGVfcGFnZSwKIAkuaXNfcGFydGlhbGx5X3VwdG9kYXRlCT0gYmxvY2tfaXNfcGFydGlhbGx5X3VwdG9kYXRlLAorCS5lcnJvcl9yZW1vdmVfcGFnZQk9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwogCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGV4dDJfYW9wc194aXAgPSB7CkBAIC04MzcsNiArODM4LDcgQEAKIAkuZGlyZWN0X0lPCQk9IGV4dDJfZGlyZWN0X0lPLAogCS53cml0ZXBhZ2VzCQk9IGV4dDJfd3JpdGVwYWdlcywKIAkubWlncmF0ZXBhZ2UJCT0gYnVmZmVyX21pZ3JhdGVfcGFnZSwKKwkuZXJyb3JfcmVtb3ZlX3BhZ2UJPSBnZW5lcmljX2Vycm9yX3JlbW92ZV9wYWdlLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaW5vZGUuYyBiL2ZzL2V4dDMvaW5vZGUuYwppbmRleCBjZDA5OGE3Li5hY2YxYjE0IDEwMDY0NAotLS0gYS9mcy9leHQzL2lub2RlLmMKKysrIGIvZnMvZXh0My9pbm9kZS5jCkBAIC0xODMwLDYgKzE4MzAsNyBAQAogCS5kaXJlY3RfSU8JCT0gZXh0M19kaXJlY3RfSU8sCiAJLm1pZ3JhdGVwYWdlCQk9IGJ1ZmZlcl9taWdyYXRlX3BhZ2UsCiAJLmlzX3BhcnRpYWxseV91cHRvZGF0ZSAgPSBibG9ja19pc19wYXJ0aWFsbHlfdXB0b2RhdGUsCisJLmVycm9yX3JlbW92ZV9wYWdlCT0gZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGV4dDNfd3JpdGViYWNrX2FvcHMgPSB7CkBAIC0xODQ1LDYgKzE4NDYsNyBAQAogCS5kaXJlY3RfSU8JCT0gZXh0M19kaXJlY3RfSU8sCiAJLm1pZ3JhdGVwYWdlCQk9IGJ1ZmZlcl9taWdyYXRlX3BhZ2UsCiAJLmlzX3BhcnRpYWxseV91cHRvZGF0ZSAgPSBibG9ja19pc19wYXJ0aWFsbHlfdXB0b2RhdGUsCisJLmVycm9yX3JlbW92ZV9wYWdlCT0gZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGV4dDNfam91cm5hbGxlZF9hb3BzID0gewpAQCAtMTg1OSw2ICsxODYxLDcgQEAKIAkuaW52YWxpZGF0ZXBhZ2UJCT0gZXh0M19pbnZhbGlkYXRlcGFnZSwKIAkucmVsZWFzZXBhZ2UJCT0gZXh0M19yZWxlYXNlcGFnZSwKIAkuaXNfcGFydGlhbGx5X3VwdG9kYXRlICA9IGJsb2NrX2lzX3BhcnRpYWxseV91cHRvZGF0ZSwKKwkuZXJyb3JfcmVtb3ZlX3BhZ2UJPSBnZW5lcmljX2Vycm9yX3JlbW92ZV9wYWdlLAogfTsKIAogdm9pZCBleHQzX3NldF9hb3BzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggNzI3NDNkMy4uN2E1MjBhOCAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtMjMyMSw3ICsyMzIxLDE4IEBACiAKIAlpZiAoIXNiaCkKIAkJcmV0dXJuIGVycm9yOwotCWVzLT5zX3d0aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJLyoKKwkgKiBJZiB0aGUgZmlsZSBzeXN0ZW0gaXMgbW91bnRlZCByZWFkLW9ubHksIGRvbid0IHVwZGF0ZSB0aGUKKwkgKiBzdXBlcmJsb2NrIHdyaXRlIHRpbWUuICBUaGlzIGF2b2lkcyB1cGRhdGluZyB0aGUgc3VwZXJibG9jaworCSAqIHdyaXRlIHRpbWUgd2hlbiB3ZSBhcmUgbW91bnRpbmcgdGhlIHJvb3QgZmlsZSBzeXN0ZW0KKwkgKiByZWFkL29ubHkgYnV0IHdlIG5lZWQgdG8gcmVwbGF5IHRoZSBqb3VybmFsOyBhdCB0aGF0IHBvaW50LAorCSAqIGZvciBwZW9wbGUgd2hvIGFyZSBlYXN0IG9mIEdNVCBhbmQgd2hvIG1ha2UgdGhlaXIgY2xvY2sKKwkgKiB0aWNrIGluIGxvY2FsdGltZSBmb3IgV2luZG93cyBidWctZm9yLWJ1ZyBjb21wYXRpYmlsaXR5LAorCSAqIHRoZSBjbG9jayBpcyBzZXQgaW4gdGhlIGZ1dHVyZSwgYW5kIHRoaXMgd2lsbCBjYXVzZSBlMmZzY2sKKwkgKiB0byBjb21wbGFpbiBhbmQgZm9yY2UgYSBmdWxsIGZpbGUgc3lzdGVtIGNoZWNrLgorCSAqLworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJZXMtPnNfd3RpbWUgPSBjcHVfdG9fbGUzMihnZXRfc2Vjb25kcygpKTsKIAllcy0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDNfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKIAllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDNfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKIAlCVUZGRVJfVFJBQ0Uoc2JoLCAibWFya2luZyBkaXJ0eSIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9LY29uZmlnIGIvZnMvZXh0NC9LY29uZmlnCmluZGV4IGQ1YzBlYTIuLjlmMmQ0NWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvS2NvbmZpZworKysgYi9mcy9leHQ0L0tjb25maWcKQEAgLTI2LDIwICsyNiw2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBFWFQ0REVWX0NPTVBBVAotCWJvb2wgIkVuYWJsZSBleHQ0ZGV2IGNvbXBhdGliaWxpdHkiCi0JZGVwZW5kcyBvbiBFWFQ0X0ZTCi0JaGVscAotCSAgU3RhcnRpbmcgd2l0aCAyLjYuMjgsIHRoZSBuYW1lIG9mIHRoZSBleHQ0IGZpbGVzeXN0ZW0gd2FzCi0JICByZW5hbWVkIGZyb20gZXh0NGRldiB0byBleHQ0LiAgVW5mb3J0dW5hdGVseSB0aGVyZSBhcmUgc29tZQotCSAgbGVnYWN5IHVzZXJzcGFjZSBwcm9ncmFtcyAoc3VjaCBhcyBrbGliYydzIGZzdHlwZSkgaGF2ZQotCSAgImV4dDRkZXYiIGhhcmRjb2RlZC4KLQotCSAgVG8gZW5hYmxlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHNvIHRoYXQgc3lzdGVtcyB0aGF0IGFyZQotCSAgc3RpbGwgZXhwZWN0aW5nIHRvIG1vdW50IGV4dDQgZmlsZXN5c3RlbXMgdXNpbmcgZXh0NGRldiwKLQkgIGNob29zZSBZIGhlcmUuICAgVGhpcyBmZWF0dXJlIHdpbGwgZ28gYXdheSBieSAyLjYuMzEsIHNvCi0JICBwbGVhc2UgYXJyYW5nZSB0byBnZXQgeW91ciB1c2Vyc3BhY2UgcHJvZ3JhbXMgZml4ZWQhCi0KIGNvbmZpZyBFWFQ0X0ZTX1hBVFRSCiAJYm9vbCAiRXh0NCBleHRlbmRlZCBhdHRyaWJ1dGVzIgogCWRlcGVuZHMgb24gRVhUNF9GUwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAppbmRleCBlMjI3ZWVhLi4wMGQxNTNmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAorKysgYi9mcy9leHQ0L2V4dDQuaApAQCAtNjUsNiArNjUsMTIgQEAKIC8qIGRhdGEgdHlwZSBmb3IgYmxvY2sgZ3JvdXAgbnVtYmVyICovCiB0eXBlZGVmIHVuc2lnbmVkIGludCBleHQ0X2dyb3VwX3Q7CiAKKy8qCisgKiBGbGFncyB1c2VkIGluIG1iYWxsb2MncyBhbGxvY2F0aW9uX2NvbnRleHQgZmxhZ3MgZmllbGQuICAKKyAqCisgKiBBbHNvIHVzZWQgdG8gc2hvdyB3aGF0J3MgZ29pbmcgb24gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aGVuIHRoZQorICogZmxhZyBmaWVsZCBpcyBleHBvcnRlZCB2aWEgdGhlIHRyYWNlcG9ydCBpbnRlcmZhY2UKKyAqLwogCiAvKiBwcmVmZXIgZ29hbCBhZ2Fpbi4gbGVuZ3RoICovCiAjZGVmaW5lIEVYVDRfTUJfSElOVF9NRVJHRQkJMHgwMDAxCkBAIC0xMjcsNiArMTMzLDE2IEBACiAJaW50IHBhZ2VzX3dyaXR0ZW47CiAJaW50IHJldHZhbDsKIH07CisjZGVmaW5lCURJT19BSU9fVU5XUklUVEVOCTB4MQordHlwZWRlZiBzdHJ1Y3QgZXh0NF9pb19lbmQgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJCS8qIHBlci1maWxlIGZpbmlzaGVkIEFJTyBsaXN0ICovCisJc3RydWN0IGlub2RlCQkqaW5vZGU7CQkvKiBmaWxlIGJlaW5nIHdyaXR0ZW4gdG8gKi8KKwl1bnNpZ25lZCBpbnQJCWZsYWc7CQkvKiB1bndyaXR0ZW4gb3Igbm90ICovCisJaW50CQkJZXJyb3I7CQkvKiBJL08gZXJyb3IgY29kZSAqLworCWV4dDRfbGJsa190CQlvZmZzZXQ7CQkvKiBvZmZzZXQgaW4gdGhlIGZpbGUgKi8KKwlzaXplX3QJCQlzaXplOwkJLyogc2l6ZSBvZiB0aGUgZXh0ZW50ICovCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CQkvKiBkYXRhIHdvcmsgcXVldWUgKi8KK30gZXh0NF9pb19lbmRfdDsKIAogLyoKICAqIFNwZWNpYWwgaW5vZGVzIG51bWJlcnMKQEAgLTM0Nyw3ICszNjMsMTYgQEAKIAkvKiBDYWxsIGV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoKSBhZnRlciBzdWNjZXNzZnVsbHkgCiAJICAgYWxsb2NhdGluZyB0aGUgYmxvY2tzICovCiAjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19VUERBVEVfUkVTRVJWRV9TUEFDRQkweDAwMDgKLQorCS8qIGNhbGxlciBpcyBmcm9tIHRoZSBkaXJlY3QgSU8gcGF0aCwgcmVxdWVzdCB0byBjcmVhdGlvbiBvZiBhbgorCXVuaXRpYWxpemVkIGV4dGVudHMgaWYgbm90IGFsbG9jYXRlZCwgc3BsaXQgdGhlIHVuaW5pdGlhbGl6ZWQKKwlleHRlbnQgaWYgYmxvY2tzIGhhcyBiZWVuIHByZWFsbG9jYXRlZCBhbHJlYWR5Ki8KKyNkZWZpbmUgRVhUNF9HRVRfQkxPQ0tTX0RJTwkJCTB4MDAxMAorI2RlZmluZSBFWFQ0X0dFVF9CTE9DS1NfQ09OVkVSVAkJCTB4MDAyMAorI2RlZmluZSBFWFQ0X0dFVF9CTE9DS1NfRElPX0NSRUFURV9FWFQJCShFWFQ0X0dFVF9CTE9DS1NfRElPfFwKKwkJCQkJIEVYVDRfR0VUX0JMT0NLU19DUkVBVEVfVU5JTklUX0VYVCkKKwkvKiBDb252ZXJ0IGV4dGVudCB0byBpbml0aWFsaXplZCBhZnRlciBkaXJlY3QgSU8gY29tcGxldGUgKi8KKyNkZWZpbmUgRVhUNF9HRVRfQkxPQ0tTX0RJT19DT05WRVJUX0VYVAkJKEVYVDRfR0VUX0JMT0NLU19DT05WRVJUfFwKKwkJCQkJIEVYVDRfR0VUX0JMT0NLU19ESU9fQ1JFQVRFX0VYVCkKIAogLyoKICAqIGlvY3RsIGNvbW1hbmRzCkBAIC01MDAsOCArNTI1LDggQEAKIHN0YXRpYyBpbmxpbmUgX19sZTMyIGV4dDRfZW5jb2RlX2V4dHJhX3RpbWUoc3RydWN0IHRpbWVzcGVjICp0aW1lKQogewogICAgICAgIHJldHVybiBjcHVfdG9fbGUzMigoc2l6ZW9mKHRpbWUtPnR2X3NlYykgPiA0ID8KLQkJCSAgIHRpbWUtPnR2X3NlYyA+PiAzMiA6IDApIHwKLQkJCSAgICgodGltZS0+dHZfbnNlYyA8PCAyKSAmIEVYVDRfTlNFQ19NQVNLKSk7CisJCQkgICAodGltZS0+dHZfc2VjID4+IDMyKSAmIEVYVDRfRVBPQ0hfTUFTSyA6IDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0aW1lLT50dl9uc2VjIDw8IEVYVDRfRVBPQ0hfQklUUykgJiBFWFQ0X05TRUNfTUFTSykpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9kZWNvZGVfZXh0cmFfdGltZShzdHJ1Y3QgdGltZXNwZWMgKnRpbWUsIF9fbGUzMiBleHRyYSkKQEAgLTUwOSw3ICs1MzQsNyBAQAogICAgICAgIGlmIChzaXplb2YodGltZS0+dHZfc2VjKSA+IDQpCiAJICAgICAgIHRpbWUtPnR2X3NlYyB8PSAoX191NjQpKGxlMzJfdG9fY3B1KGV4dHJhKSAmIEVYVDRfRVBPQ0hfTUFTSykKIAkJCSAgICAgICA8PCAzMjsKLSAgICAgICB0aW1lLT50dl9uc2VjID0gKGxlMzJfdG9fY3B1KGV4dHJhKSAmIEVYVDRfTlNFQ19NQVNLKSA+PiAyOworICAgICAgIHRpbWUtPnR2X25zZWMgPSAobGUzMl90b19jcHUoZXh0cmEpICYgRVhUNF9OU0VDX01BU0spID4+IEVYVDRfRVBPQ0hfQklUUzsKIH0KIAogI2RlZmluZSBFWFQ0X0lOT0RFX1NFVF9YVElNRSh4dGltZSwgaW5vZGUsIHJhd19pbm9kZSkJCQkgICAgICAgXApAQCAtNjcyLDYgKzY5NywxMSBAQAogCV9fdTE2IGlfZXh0cmFfaXNpemU7CiAKIAlzcGlubG9ja190IGlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jazsKKworCS8qIGNvbXBsZXRlZCBhc3luYyBESU9zIHRoYXQgbWlnaHQgbmVlZCB1bndyaXR0ZW4gZXh0ZW50cyBoYW5kbGluZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaV9haW9fZGlvX2NvbXBsZXRlX2xpc3Q7CisJLyogY3VycmVudCBpb19lbmQgc3RydWN0dXJlIGZvciBhc3luYyBESU8gd3JpdGUqLworCWV4dDRfaW9fZW5kX3QgKmN1cl9haW9fZGlvOwogfTsKIAogLyoKQEAgLTcxMyw2ICs3NDMsNyBAQAogI2RlZmluZSBFWFQ0X01PVU5UX1FVT1RBCQkweDgwMDAwIC8qIFNvbWUgcXVvdGEgb3B0aW9uIHNldCAqLwogI2RlZmluZSBFWFQ0X01PVU5UX1VTUlFVT1RBCQkweDEwMDAwMCAvKiAib2xkIiB1c2VyIHF1b3RhICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfR1JQUVVPVEEJCTB4MjAwMDAwIC8qICJvbGQiIGdyb3VwIHF1b3RhICovCisjZGVmaW5lIEVYVDRfTU9VTlRfSk9VUk5BTF9DSEVDS1NVTQkweDgwMDAwMCAvKiBKb3VybmFsIGNoZWNrc3VtcyAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0pPVVJOQUxfQVNZTkNfQ09NTUlUCTB4MTAwMDAwMCAvKiBKb3VybmFsIEFzeW5jIENvbW1pdCAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0lfVkVSU0lPTiAgICAgICAgICAgIDB4MjAwMDAwMCAvKiBpX3ZlcnNpb24gc3VwcG9ydCAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0RFTEFMTE9DCQkweDgwMDAwMDAgLyogRGVsYWxsb2Mgc3VwcG9ydCAqLwpAQCAtOTQyLDE4ICs5NzMsMTEgQEAKIAl1bnNpZ25lZCBpbnQgc19tYl9zdGF0czsKIAl1bnNpZ25lZCBpbnQgc19tYl9vcmRlcjJfcmVxczsKIAl1bnNpZ25lZCBpbnQgc19tYl9ncm91cF9wcmVhbGxvYzsKKwl1bnNpZ25lZCBpbnQgc19tYXhfd3JpdGViYWNrX21iX2J1bXA7CiAJLyogd2hlcmUgbGFzdCBhbGxvY2F0aW9uIHdhcyBkb25lIC0gZm9yIHN0cmVhbSBhbGxvY2F0aW9uICovCiAJdW5zaWduZWQgbG9uZyBzX21iX2xhc3RfZ3JvdXA7CiAJdW5zaWduZWQgbG9uZyBzX21iX2xhc3Rfc3RhcnQ7CiAKLQkvKiBoaXN0b3J5IHRvIGRlYnVnIHBvbGljeSAqLwotCXN0cnVjdCBleHQ0X21iX2hpc3RvcnkgKnNfbWJfaGlzdG9yeTsKLQlpbnQgc19tYl9oaXN0b3J5X2N1cjsKLQlpbnQgc19tYl9oaXN0b3J5X21heDsKLQlpbnQgc19tYl9oaXN0b3J5X251bTsKLQlzcGlubG9ja190IHNfbWJfaGlzdG9yeV9sb2NrOwotCWludCBzX21iX2hpc3RvcnlfZmlsdGVyOwotCiAJLyogc3RhdHMgZm9yIGJ1ZGR5IGFsbG9jYXRvciAqLwogCXNwaW5sb2NrX3Qgc19tYl9wYV9sb2NrOwogCWF0b21pY190IHNfYmFsX3JlcXM7CS8qIG51bWJlciBvZiByZXFzIHdpdGggbGVuID4gMSAqLwpAQCAtOTgwLDYgKzEwMDQsOSBAQAogCiAJdW5zaWduZWQgaW50IHNfbG9nX2dyb3Vwc19wZXJfZmxleDsKIAlzdHJ1Y3QgZmxleF9ncm91cHMgKnNfZmxleF9ncm91cHM7CisKKwkvKiB3b3JrcXVldWUgZm9yIGRpbyB1bndyaXR0ZW4gKi8KKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZGlvX3Vud3JpdHRlbl93cTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGV4dDRfc2JfaW5mbyAqRVhUNF9TQihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpAQCAtMTM5Nyw3ICsxNDI0LDcgQEAKIAkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBmcm9tKTsKIGV4dGVybiBpbnQgZXh0NF9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKTsKIGV4dGVybiBxc2l6ZV90IGV4dDRfZ2V0X3Jlc2VydmVkX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotCitleHRlcm4gaW50IGZsdXNoX2Fpb19kaW9fY29tcGxldGVkX0lPKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogLyogaW9jdGwuYyAqLwogZXh0ZXJuIGxvbmcgZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGxvbmcgZXh0NF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKQEAgLTE2OTksNiArMTcyNiw4IEBACiBleHRlcm4gdm9pZCBleHQ0X2V4dF9yZWxlYXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBsb25nIGV4dDRfZmFsbG9jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LAogCQkJICBsb2ZmX3QgbGVuKTsKK2V4dGVybiBpbnQgZXh0NF9jb252ZXJ0X3Vud3JpdHRlbl9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsCisJCQkgIGxvZmZfdCBsZW4pOwogZXh0ZXJuIGludCBleHQ0X2dldF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgIHNlY3Rvcl90IGJsb2NrLCB1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcywKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBmbGFncyk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oIGIvZnMvZXh0NC9leHQ0X2V4dGVudHMuaAppbmRleCA2MTY1MmYxLi4yY2E2ODY0IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCisrKyBiL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKQEAgLTIyMCw2ICsyMjAsMTEgQEAKIAkJKGxlMTZfdG9fY3B1KGV4dC0+ZWVfbGVuKSAtIEVYVF9JTklUX01BWF9MRU4pKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X21hcmtfaW5pdGlhbGl6ZWQoc3RydWN0IGV4dDRfZXh0ZW50ICpleHQpCit7CisJZXh0LT5lZV9sZW4gPSBjcHVfdG9fbGUxNihleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleHQpKTsKK30KKwogZXh0ZXJuIGludCBleHQ0X2V4dF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYmxvY2tzKTsKIGV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0X3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4KTsKIGV4dGVybiBleHQ0X2ZzYmxrX3QgaWR4X3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICopOwpAQCAtMjM1LDcgKzI0MCw3IEBACiAJCQkJIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAogCQkJCSBzdHJ1Y3QgZXh0NF9leHRlbnQgKik7CiBleHRlcm4gdW5zaWduZWQgaW50IGV4dDRfZXh0X2NoZWNrX292ZXJsYXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBleHQ0X2V4dGVudCAqLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqKTsKLWV4dGVybiBpbnQgZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGV4dDRfZXh0X3BhdGggKiwgc3RydWN0IGV4dDRfZXh0ZW50ICopOworZXh0ZXJuIGludCBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqLCBzdHJ1Y3QgZXh0NF9leHRlbnQgKiwgaW50KTsKIGV4dGVybiBpbnQgZXh0NF9leHRfd2Fsa19zcGFjZShzdHJ1Y3QgaW5vZGUgKiwgZXh0NF9sYmxrX3QsIGV4dDRfbGJsa190LAogCQkJCQkJCWV4dF9wcmVwYXJlX2NhbGxiYWNrLCB2b2lkICopOwogZXh0ZXJuIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpleHQ0X2V4dF9maW5kX2V4dGVudChzdHJ1Y3QgaW5vZGUgKiwgZXh0NF9sYmxrX3QsCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfamJkMi5oIGIvZnMvZXh0NC9leHQ0X2piZDIuaAppbmRleCAxMzlmYjhjLi5hMjg2NTk4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfamJkMi5oCisrKyBiL2ZzL2V4dDQvZXh0NF9qYmQyLmgKQEAgLTE2MSwxMSArMTYxLDEzIEBACiBoYW5kbGVfdCAqZXh0NF9qb3VybmFsX3N0YXJ0X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBuYmxvY2tzKTsKIGludCBfX2V4dDRfam91cm5hbF9zdG9wKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlKTsKIAotI2RlZmluZSBFWFQ0X05PSk9VUk5BTF9IQU5ETEUJKChoYW5kbGVfdCAqKSAweDEpCisjZGVmaW5lIEVYVDRfTk9KT1VSTkFMX01BWF9SRUZfQ09VTlQgKCh1bnNpZ25lZCBsb25nKSA0MDk2KQogCisvKiBOb3RlOiAgRG8gbm90IHVzZSB0aGlzIGZvciBOVUxMIGhhbmRsZXMuICBUaGlzIGlzIG9ubHkgdG8gZGV0ZXJtaW5lIGlmCisgKiBhIHByb3Blcmx5IGFsbG9jYXRlZCBoYW5kbGUgaXMgdXNpbmcgYSBqb3VybmFsIG9yIG5vdC4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZV90ICpoYW5kbGUpCiB7Ci0JaWYgKGhhbmRsZSA9PSBFWFQ0X05PSk9VUk5BTF9IQU5ETEUpCisJaWYgKCh1bnNpZ25lZCBsb25nKWhhbmRsZSA8IEVYVDRfTk9KT1VSTkFMX01BWF9SRUZfQ09VTlQpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCA3YTM4MzI1Li4xMDUzOWUzIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYworKysgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtNzIzLDcgKzcyMyw3IEBACiAgKiBpbnNlcnQgbmV3IGluZGV4IFtAbG9naWNhbDtAcHRyXSBpbnRvIHRoZSBibG9jayBhdCBAY3VycDsKICAqIGNoZWNrIHdoZXJlIHRvIGluc2VydDogYmVmb3JlIEBjdXJwIG9yIGFmdGVyIEBjdXJwCiAgKi8KLXN0YXRpYyBpbnQgZXh0NF9leHRfaW5zZXJ0X2luZGV4KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCitpbnQgZXh0NF9leHRfaW5zZXJ0X2luZGV4KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKmN1cnAsCiAJCQkJaW50IGxvZ2ljYWwsIGV4dDRfZnNibGtfdCBwdHIpCiB7CkBAIC0xNTg2LDcgKzE1ODYsNyBAQAogICovCiBpbnQgZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAotCQkJCXN0cnVjdCBleHQ0X2V4dGVudCAqbmV3ZXh0KQorCQkJCXN0cnVjdCBleHQ0X2V4dGVudCAqbmV3ZXh0LCBpbnQgZmxhZykKIHsKIAlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LCAqZmV4OwpAQCAtMTYwMiw3ICsxNjAyLDggQEAKIAlCVUdfT04ocGF0aFtkZXB0aF0ucF9oZHIgPT0gTlVMTCk7CiAKIAkvKiB0cnkgdG8gaW5zZXJ0IGJsb2NrIGludG8gZm91bmQgZXh0ZW50IGFuZCByZXR1cm4gKi8KLQlpZiAoZXggJiYgZXh0NF9jYW5fZXh0ZW50c19iZV9tZXJnZWQoaW5vZGUsIGV4LCBuZXdleHQpKSB7CisJaWYgKGV4ICYmIChmbGFnICE9IEVYVDRfR0VUX0JMT0NLU19ESU9fQ1JFQVRFX0VYVCkKKwkJJiYgZXh0NF9jYW5fZXh0ZW50c19iZV9tZXJnZWQoaW5vZGUsIGV4LCBuZXdleHQpKSB7CiAJCWV4dF9kZWJ1ZygiYXBwZW5kIFslZF0lZCBibG9jayB0byAlZDpbJWRdJWQgKGZyb20gJWxsdSlcbiIsCiAJCQkJZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAogCQkJCWV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCksCkBAIC0xNzIyLDcgKzE3MjMsOCBAQAogCiBtZXJnZToKIAkvKiB0cnkgdG8gbWVyZ2UgZXh0ZW50cyB0byB0aGUgcmlnaHQgKi8KLQlleHQ0X2V4dF90cnlfdG9fbWVyZ2UoaW5vZGUsIHBhdGgsIG5lYXJleCk7CisJaWYgKGZsYWcgIT0gRVhUNF9HRVRfQkxPQ0tTX0RJT19DUkVBVEVfRVhUKQorCQlleHQ0X2V4dF90cnlfdG9fbWVyZ2UoaW5vZGUsIHBhdGgsIG5lYXJleCk7CiAKIAkvKiB0cnkgdG8gbWVyZ2UgZXh0ZW50cyB0byB0aGUgbGVmdCAqLwogCkBAIC0yMzc4LDYgKzIzODAsNyBAQAogCSAqLwogCiAJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkgeworI2lmIGRlZmluZWQoQUdHUkVTU0lWRV9URVNUKSB8fCBkZWZpbmVkKENIRUNLX0JJTlNFQVJDSCkgfHwgZGVmaW5lZChFWFRFTlRTX1NUQVRTKQogCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBmaWxlIGV4dGVudHMgZW5hYmxlZCIpOwogI2lmZGVmIEFHR1JFU1NJVkVfVEVTVAogCQlwcmludGsoIiwgYWdncmVzc2l2ZSB0ZXN0cyIpOwpAQCAtMjM4OSw2ICsyMzkyLDcgQEAKIAkJcHJpbnRrKCIsIHN0YXRzIik7CiAjZW5kaWYKIAkJcHJpbnRrKCJcbiIpOworI2VuZGlmCiAjaWZkZWYgRVhURU5UU19TVEFUUwogCQlzcGluX2xvY2tfaW5pdCgmRVhUNF9TQihzYiktPnNfZXh0X3N0YXRzX2xvY2spOwogCQlFWFQ0X1NCKHNiKS0+c19leHRfbWluID0gMSA8PCAzMDsKQEAgLTI0OTAsNyArMjQ5NCw2IEBACiB9CiAKICNkZWZpbmUgRVhUNF9FWFRfWkVST19MRU4gNwotCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZXh0NF9leHRfZ2V0X2Jsb2NrcygpIGlmIHNvbWVvbmUgdHJpZXMgdG8gd3JpdGUKICAqIHRvIGFuIHVuaW5pdGlhbGl6ZWQgZXh0ZW50LiBJdCBtYXkgcmVzdWx0IGluIHNwbGl0dGluZyB0aGUgdW5pbml0aWFsaXplZApAQCAtMjU4Myw3ICsyNTg2LDggQEAKIAkJCWV4My0+ZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihpYmxvY2spOwogCQkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MywgbmV3YmxvY2spOwogCQkJZXgzLT5lZV9sZW4gPSBjcHVfdG9fbGUxNihhbGxvY2F0ZWQpOwotCQkJZXJyID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBleDMpOworCQkJZXJyID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLAorCQkJCQkJCWV4MywgMCk7CiAJCQlpZiAoZXJyID09IC1FTk9TUEMpIHsKIAkJCQllcnIgPSAgZXh0NF9leHRfemVyb291dChpbm9kZSwgJm9yaWdfZXgpOwogCQkJCWlmIChlcnIpCkBAIC0yNjM5LDcgKzI2NDMsNyBAQAogCQlleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgzLCBuZXdibG9jayArIG1heF9ibG9ja3MpOwogCQlleDMtPmVlX2xlbiA9IGNwdV90b19sZTE2KGFsbG9jYXRlZCAtIG1heF9ibG9ja3MpOwogCQlleHQ0X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoZXgzKTsKLQkJZXJyID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBleDMpOworCQllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIGV4MywgMCk7CiAJCWlmIChlcnIgPT0gLUVOT1NQQykgewogCQkJZXJyID0gIGV4dDRfZXh0X3plcm9vdXQoaW5vZGUsICZvcmlnX2V4KTsKIAkJCWlmIChlcnIpCkBAIC0yNzU3LDcgKzI3NjEsNyBAQAogCWVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7CiAJZ290byBvdXQ7CiBpbnNlcnQ6Ci0JZXJyID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCAmbmV3ZXgpOworCWVyciA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJm5ld2V4LCAwKTsKIAlpZiAoZXJyID09IC1FTk9TUEMpIHsKIAkJZXJyID0gIGV4dDRfZXh0X3plcm9vdXQoaW5vZGUsICZvcmlnX2V4KTsKIAkJaWYgKGVycikKQEAgLTI3ODUsNiArMjc4OSwzMjQgQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV4dDRfZXh0X2dldF9ibG9ja3MoKSBmcm9tCisgKiBleHQ0X2dldF9ibG9ja3NfZGlvX3dyaXRlKCkgd2hlbiBESU8gdG8gd3JpdGUKKyAqIHRvIGFuIHVuaW5pdGlhbGl6ZWQgZXh0ZW50LgorICoKKyAqIFdyaXRpbmcgdG8gYW4gdW5pbml0aXplZCBleHRlbnQgbWF5IHJlc3VsdCBpbiBzcGxpdHRpbmcgdGhlIHVuaW5pdGlhbGl6ZWQKKyAqIGV4dGVudCBpbnRvIG11bHRpcGxlIC9pbnRpYWxpemVkIHVuaW50aWFsaXplZCBleHRlbnRzICh1cCB0byB0aHJlZSkKKyAqIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJpbGl0aWVzOgorICogICBhPiBUaGVyZSBpcyBubyBzcGxpdCByZXF1aXJlZDogRW50aXJlIGV4dGVudCBzaG91bGQgYmUgdW5pbml0aWFsaXplZAorICogICBiPiBTcGxpdHMgaW4gdHdvIGV4dGVudHM6IFdyaXRlIGlzIGhhcHBlbmluZyBhdCBlaXRoZXIgZW5kIG9mIHRoZSBleHRlbnQKKyAqICAgYz4gU3BsaXRzIGluIHRocmVlIGV4dGVudHM6IFNvbW9uZSBpcyB3cml0aW5nIGluIG1pZGRsZSBvZiB0aGUgZXh0ZW50CisgKgorICogT25lIG9mIG1vcmUgaW5kZXggYmxvY2tzIG1heWJlIG5lZWRlZCBpZiB0aGUgZXh0ZW50IHRyZWUgZ3JvdyBhZnRlcgorICogdGhlIHVuaW50aWFsaXplZCBleHRlbnQgc3BsaXQuIFRvIHByZXZlbnQgRU5PU1BDIG9jY3VyIGF0IHRoZSBJTworICogY29tcGxldGUsIHdlIG5lZWQgdG8gc3BsaXQgdGhlIHVuaW5pdGlhbGl6ZWQgZXh0ZW50IGJlZm9yZSBESU8gc3VibWl0CisgKiB0aGUgSU8uIFRoZSB1bmluaXRpbGl6ZWQgZXh0ZW50IGNhbGxlZCBhdCB0aGlzIHRpbWUgd2lsbCBiZSBzcGxpdAorICogaW50byB0aHJlZSB1bmluaXRpYWxpemVkIGV4dGVudChhdCBtb3N0KS4gQWZ0ZXIgSU8gY29tcGxldGUsIHRoZSBwYXJ0CisgKiBiZWluZyBmaWxsZWQgd2lsbCBiZSBjb252ZXJ0IHRvIGluaXRpYWxpemVkIGJ5IHRoZSBlbmRfaW8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqIHZpYSBleHQ0X2NvbnZlcnRfdW53cml0dGVuX2V4dGVudHMoKS4KKyAqLworc3RhdGljIGludCBleHQ0X3NwbGl0X3Vud3JpdHRlbl9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAorCQkJCQlleHQ0X2xibGtfdCBpYmxvY2ssCisJCQkJCXVuc2lnbmVkIGludCBtYXhfYmxvY2tzLAorCQkJCQlpbnQgZmxhZ3MpCit7CisJc3RydWN0IGV4dDRfZXh0ZW50ICpleCwgbmV3ZXgsIG9yaWdfZXg7CisJc3RydWN0IGV4dDRfZXh0ZW50ICpleDEgPSBOVUxMOworCXN0cnVjdCBleHQ0X2V4dGVudCAqZXgyID0gTlVMTDsKKwlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4MyA9IE5VTEw7CisJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CisJZXh0NF9sYmxrX3QgZWVfYmxvY2s7CisJdW5zaWduZWQgaW50IGFsbG9jYXRlZCwgZWVfbGVuLCBkZXB0aDsKKwlleHQ0X2ZzYmxrX3QgbmV3YmxvY2s7CisJaW50IGVyciA9IDA7CisJaW50IHJldCA9IDA7CisKKwlleHRfZGVidWcoImV4dDRfc3BsaXRfdW53cml0dGVuX2V4dGVudHM6IGlub2RlICVsdSwiCisJCSAgImlibG9jayAlbGx1LCBtYXhfYmxvY2tzICV1XG4iLCBpbm9kZS0+aV9pbm8sCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylpYmxvY2ssIG1heF9ibG9ja3MpOworCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwllaCA9IHBhdGhbZGVwdGhdLnBfaGRyOworCWV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7CisJZWVfYmxvY2sgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCWVlX2xlbiA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKwlhbGxvY2F0ZWQgPSBlZV9sZW4gLSAoaWJsb2NrIC0gZWVfYmxvY2spOworCW5ld2Jsb2NrID0gaWJsb2NrIC0gZWVfYmxvY2sgKyBleHRfcGJsb2NrKGV4KTsKKwlleDIgPSBleDsKKwlvcmlnX2V4LmVlX2Jsb2NrID0gZXgtPmVlX2Jsb2NrOworCW9yaWdfZXguZWVfbGVuICAgPSBjcHVfdG9fbGUxNihlZV9sZW4pOworCWV4dDRfZXh0X3N0b3JlX3BibG9jaygmb3JpZ19leCwgZXh0X3BibG9jayhleCkpOworCisJLyoKKyAJICogaWYgdGhlIGVudGlyZSB1bmludGlhbGl6ZWQgZXh0ZW50IGxlbmd0aCBsZXNzIHRoYW4KKyAJICogdGhlIHNpemUgb2YgZXh0ZW50IHRvIHdyaXRlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNwbGl0CisgCSAqIHVuaW5pdGlhbGl6ZWQgZXh0ZW50CisgCSAqLworIAlpZiAoYWxsb2NhdGVkIDw9IG1heF9ibG9ja3MpCisJCXJldHVybiByZXQ7CisKKwllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJLyogZXgxOiBlZV9ibG9jayB0byBpYmxvY2sgLSAxIDogdW5pbml0aWFsaXplZCAqLworCWlmIChpYmxvY2sgPiBlZV9ibG9jaykgeworCQlleDEgPSBleDsKKwkJZXgxLT5lZV9sZW4gPSBjcHVfdG9fbGUxNihpYmxvY2sgLSBlZV9ibG9jayk7CisJCWV4dDRfZXh0X21hcmtfdW5pbml0aWFsaXplZChleDEpOworCQlleDIgPSAmbmV3ZXg7CisJfQorCS8qCisJICogZm9yIHNhbml0eSwgdXBkYXRlIHRoZSBsZW5ndGggb2YgdGhlIGV4MiBleHRlbnQgYmVmb3JlCisJICogd2UgaW5zZXJ0IGV4MywgaWYgZXgxIGlzIE5VTEwuIFRoaXMgaXMgdG8gYXZvaWQgdGVtcG9yYXJ5CisJICogb3ZlcmxhcCBvZiBibG9ja3MuCisJICovCisJaWYgKCFleDEgJiYgYWxsb2NhdGVkID4gbWF4X2Jsb2NrcykKKwkJZXgyLT5lZV9sZW4gPSBjcHVfdG9fbGUxNihtYXhfYmxvY2tzKTsKKwkvKiBleDM6IHRvIGVlX2Jsb2NrICsgZWVfbGVuIDogdW5pbml0aWFsaXNlZCAqLworCWlmIChhbGxvY2F0ZWQgPiBtYXhfYmxvY2tzKSB7CisJCXVuc2lnbmVkIGludCBuZXdkZXB0aDsKKwkJZXgzID0gJm5ld2V4OworCQlleDMtPmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoaWJsb2NrICsgbWF4X2Jsb2Nrcyk7CisJCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleDMsIG5ld2Jsb2NrICsgbWF4X2Jsb2Nrcyk7CisJCWV4My0+ZWVfbGVuID0gY3B1X3RvX2xlMTYoYWxsb2NhdGVkIC0gbWF4X2Jsb2Nrcyk7CisJCWV4dDRfZXh0X21hcmtfdW5pbml0aWFsaXplZChleDMpOworCQllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIGV4MywgZmxhZ3MpOworCQlpZiAoZXJyID09IC1FTk9TUEMpIHsKKwkJCWVyciA9ICBleHQ0X2V4dF96ZXJvb3V0KGlub2RlLCAmb3JpZ19leCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZml4X2V4dGVudF9sZW47CisJCQkvKiB1cGRhdGUgdGhlIGV4dGVudCBsZW5ndGggYW5kIG1hcmsgYXMgaW5pdGlhbGl6ZWQgKi8KKwkJCWV4LT5lZV9ibG9jayA9IG9yaWdfZXguZWVfYmxvY2s7CisJCQlleC0+ZWVfbGVuICAgPSBvcmlnX2V4LmVlX2xlbjsKKwkJCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZXh0X3BibG9jaygmb3JpZ19leCkpOworCQkJZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGRlcHRoKTsKKwkJCS8qIHplcm9lZCB0aGUgZnVsbCBleHRlbnQgKi8KKwkJCS8qIGJsb2NrcyBhdmFpbGFibGUgZnJvbSBpYmxvY2sgKi8KKwkJCXJldHVybiBhbGxvY2F0ZWQ7CisKKwkJfSBlbHNlIGlmIChlcnIpCisJCQlnb3RvIGZpeF9leHRlbnRfbGVuOworCQkvKgorCQkgKiBUaGUgZGVwdGgsIGFuZCBoZW5jZSBlaCAmIGV4IG1pZ2h0IGNoYW5nZQorCQkgKiBhcyBwYXJ0IG9mIHRoZSBpbnNlcnQgYWJvdmUuCisJCSAqLworCQluZXdkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CisJCS8qCisJCSAqIHVwZGF0ZSB0aGUgZXh0ZW50IGxlbmd0aCBhZnRlciBzdWNjZXNzZnVsIGluc2VydCBvZiB0aGUKKwkJICogc3BsaXQgZXh0ZW50CisJCSAqLworCQlvcmlnX2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGVlX2xlbiAtCisJCQkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleDMpKTsKKwkJZGVwdGggPSBuZXdkZXB0aDsKKwkJZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpOworCQlwYXRoID0gZXh0NF9leHRfZmluZF9leHRlbnQoaW5vZGUsIGlibG9jaywgcGF0aCk7CisJCWlmIChJU19FUlIocGF0aCkpIHsKKwkJCWVyciA9IFBUUl9FUlIocGF0aCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQllaCA9IHBhdGhbZGVwdGhdLnBfaGRyOworCQlleCA9IHBhdGhbZGVwdGhdLnBfZXh0OworCQlpZiAoZXgyICE9ICZuZXdleCkKKwkJCWV4MiA9IGV4OworCisJCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGRlcHRoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWFsbG9jYXRlZCA9IG1heF9ibG9ja3M7CisJfQorCS8qCisJICogSWYgdGhlcmUgd2FzIGEgY2hhbmdlIG9mIGRlcHRoIGFzIHBhcnQgb2YgdGhlCisJICogaW5zZXJ0aW9uIG9mIGV4MyBhYm92ZSwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGxlbmd0aAorCSAqIG9mIHRoZSBleDEgZXh0ZW50IGFnYWluIGhlcmUKKwkgKi8KKwlpZiAoZXgxICYmIGV4MSAhPSBleCkgeworCQlleDEgPSBleDsKKwkJZXgxLT5lZV9sZW4gPSBjcHVfdG9fbGUxNihpYmxvY2sgLSBlZV9ibG9jayk7CisJCWV4dDRfZXh0X21hcmtfdW5pbml0aWFsaXplZChleDEpOworCQlleDIgPSAmbmV3ZXg7CisJfQorCS8qCisJICogZXgyOiBpYmxvY2sgdG8gaWJsb2NrICsgbWF4YmxvY2tzLTEgOiB0byBiZSBkaXJlY3QgSU8gd3JpdHRlbiwKKwkgKiB1bmluaXRpYWxpc2VkIHN0aWxsLgorCSAqLworCWV4Mi0+ZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihpYmxvY2spOworCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleDIsIG5ld2Jsb2NrKTsKKwlleDItPmVlX2xlbiA9IGNwdV90b19sZTE2KGFsbG9jYXRlZCk7CisJZXh0NF9leHRfbWFya191bmluaXRpYWxpemVkKGV4Mik7CisJaWYgKGV4MiAhPSBleCkKKwkJZ290byBpbnNlcnQ7CisJLyogTWFyayBtb2RpZmllZCBleHRlbnQgYXMgZGlydHkgKi8KKwllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCWV4dF9kZWJ1Zygib3V0IGhlcmVcbiIpOworCWdvdG8gb3V0OworaW5zZXJ0OgorCWVyciA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJm5ld2V4LCBmbGFncyk7CisJaWYgKGVyciA9PSAtRU5PU1BDKSB7CisJCWVyciA9ICBleHQ0X2V4dF96ZXJvb3V0KGlub2RlLCAmb3JpZ19leCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZpeF9leHRlbnRfbGVuOworCQkvKiB1cGRhdGUgdGhlIGV4dGVudCBsZW5ndGggYW5kIG1hcmsgYXMgaW5pdGlhbGl6ZWQgKi8KKwkJZXgtPmVlX2Jsb2NrID0gb3JpZ19leC5lZV9ibG9jazsKKwkJZXgtPmVlX2xlbiAgID0gb3JpZ19leC5lZV9sZW47CisJCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZXh0X3BibG9jaygmb3JpZ19leCkpOworCQlleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCQkvKiB6ZXJvIG91dCB0aGUgZmlyc3QgaGFsZiAqLworCQlyZXR1cm4gYWxsb2NhdGVkOworCX0gZWxzZSBpZiAoZXJyKQorCQlnb3RvIGZpeF9leHRlbnRfbGVuOworb3V0OgorCWV4dDRfZXh0X3Nob3dfbGVhZihpbm9kZSwgcGF0aCk7CisJcmV0dXJuIGVyciA/IGVyciA6IGFsbG9jYXRlZDsKKworZml4X2V4dGVudF9sZW46CisJZXgtPmVlX2Jsb2NrID0gb3JpZ19leC5lZV9ibG9jazsKKwlleC0+ZWVfbGVuICAgPSBvcmlnX2V4LmVlX2xlbjsKKwlleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIGV4dF9wYmxvY2soJm9yaWdfZXgpKTsKKwlleHQ0X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoZXgpOworCWV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7CisJcmV0dXJuIGVycjsKK30KK3N0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X3Vud3JpdHRlbl9leHRlbnRzX2RpbyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKK3sKKwlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OworCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOworCWludCBkZXB0aDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwllaCA9IHBhdGhbZGVwdGhdLnBfaGRyOworCWV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7CisKKwllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJLyogZmlyc3QgbWFyayB0aGUgZXh0ZW50IGFzIGluaXRpYWxpemVkICovCisJZXh0NF9leHRfbWFya19pbml0aWFsaXplZChleCk7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gc2VlIGlmIGl0IGNhbiBiZSBtZXJnZWQgd2l0aCB0aGUgZXh0ZW50CisJICogb24gdGhlIGxlZnQuCisJICovCisJaWYgKGV4ID4gRVhUX0ZJUlNUX0VYVEVOVChlaCkpIHsKKwkJLyoKKwkJICogVG8gbWVyZ2UgbGVmdCwgcGFzcyAiZXggLSAxIiB0byB0cnlfdG9fbWVyZ2UoKSwKKwkJICogc2luY2UgaXQgbWVyZ2VzIHRvd2FyZHMgcmlnaHQgX29ubHlfLgorCQkgKi8KKwkJcmV0ID0gZXh0NF9leHRfdHJ5X3RvX21lcmdlKGlub2RlLCBwYXRoLCBleCAtIDEpOworCQlpZiAocmV0KSB7CisJCQllcnIgPSBleHQ0X2V4dF9jb3JyZWN0X2luZGV4ZXMoaGFuZGxlLCBpbm9kZSwgcGF0aCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQkJZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOworCQkJZXgtLTsKKwkJfQorCX0KKwkvKgorCSAqIFRyeSB0byBNZXJnZSB0b3dhcmRzIHJpZ2h0LgorCSAqLworCXJldCA9IGV4dDRfZXh0X3RyeV90b19tZXJnZShpbm9kZSwgcGF0aCwgZXgpOworCWlmIChyZXQpIHsKKwkJZXJyID0gZXh0NF9leHRfY29ycmVjdF9pbmRleGVzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKKwl9CisJLyogTWFyayBtb2RpZmllZCBleHRlbnQgYXMgZGlydHkgKi8KKwllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworb3V0OgorCWV4dDRfZXh0X3Nob3dfbGVhZihpbm9kZSwgcGF0aCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorZXh0NF9leHRfaGFuZGxlX3VuaW5pdGlhbGl6ZWRfZXh0ZW50cyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJZXh0NF9sYmxrX3QgaWJsb2NrLCB1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcywKKwkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBpbnQgZmxhZ3MsCisJCQl1bnNpZ25lZCBpbnQgYWxsb2NhdGVkLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCWV4dDRfZnNibGtfdCBuZXdibG9jaykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZXJyID0gMDsKKwlleHQ0X2lvX2VuZF90ICppbyA9IEVYVDRfSShpbm9kZSktPmN1cl9haW9fZGlvOworCisJZXh0X2RlYnVnKCJleHQ0X2V4dF9oYW5kbGVfdW5pbml0aWFsaXplZF9leHRlbnRzOiBpbm9kZSAlbHUsIGxvZ2ljYWwiCisJCSAgImJsb2NrICVsbHUsIG1heF9ibG9ja3MgJXUsIGZsYWdzICVkLCBhbGxvY2F0ZWQgJXUiLAorCQkgIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgbG9uZylpYmxvY2ssIG1heF9ibG9ja3MsCisJCSAgZmxhZ3MsIGFsbG9jYXRlZCk7CisJZXh0NF9leHRfc2hvd19sZWFmKGlub2RlLCBwYXRoKTsKKworCS8qIERJTyBnZXRfYmxvY2soKSBiZWZvcmUgc3VibWl0IHRoZSBJTywgc3BsaXQgdGhlIGV4dGVudCAqLworCWlmIChmbGFncyA9PSBFWFQ0X0dFVF9CTE9DS1NfRElPX0NSRUFURV9FWFQpIHsKKwkJcmV0ID0gZXh0NF9zcGxpdF91bndyaXR0ZW5fZXh0ZW50cyhoYW5kbGUsCisJCQkJCQlpbm9kZSwgcGF0aCwgaWJsb2NrLAorCQkJCQkJbWF4X2Jsb2NrcywgZmxhZ3MpOworCQkvKiBmbGFnIHRoZSBpb19lbmQgc3RydWN0IHRoYXQgd2UgbmVlZCBjb252ZXJ0IHdoZW4gSU8gZG9uZSAqLworCQlpZiAoaW8pCisJCQlpby0+ZmxhZyA9IERJT19BSU9fVU5XUklUVEVOOworCQlnb3RvIG91dDsKKwl9CisJLyogRElPIGVuZF9pbyBjb21wbGV0ZSwgY29udmVydCB0aGUgZmlsbGVkIGV4dGVudCB0byB3cml0dGVuICovCisJaWYgKGZsYWdzID09IEVYVDRfR0VUX0JMT0NLU19ESU9fQ09OVkVSVF9FWFQpIHsKKwkJcmV0ID0gZXh0NF9jb252ZXJ0X3Vud3JpdHRlbl9leHRlbnRzX2RpbyhoYW5kbGUsIGlub2RlLAorCQkJCQkJCXBhdGgpOworCQlnb3RvIG91dDI7CisJfQorCS8qIGJ1ZmZlcmVkIElPIGNhc2UgKi8KKwkvKgorCSAqIHJlcGVhdCBmYWxsb2NhdGUgY3JlYXRpb24gcmVxdWVzdAorCSAqIHdlIGFscmVhZHkgaGF2ZSBhbiB1bndyaXR0ZW4gZXh0ZW50CisJICovCisJaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX1VOSU5JVF9FWFQpCisJCWdvdG8gbWFwX291dDsKKworCS8qIGJ1ZmZlcmVkIFJFQUQgb3IgYnVmZmVyZWQgd3JpdGVfYmVnaW4oKSBsb29rdXAgKi8KKwlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCkgeworCQkvKgorCQkgKiBXZSBoYXZlIGJsb2NrcyByZXNlcnZlZCBhbHJlYWR5LiAgV2UKKwkJICogcmV0dXJuIGFsbG9jYXRlZCBibG9ja3Mgc28gdGhhdCBkZWxhbGxvYworCQkgKiB3b24ndCBkbyBibG9jayByZXNlcnZhdGlvbiBmb3IgdXMuICBCdXQKKwkJICogdGhlIGJ1ZmZlciBoZWFkIHdpbGwgYmUgdW5tYXBwZWQgc28gdGhhdAorCQkgKiBhIHJlYWQgZnJvbSB0aGUgYmxvY2sgcmV0dXJucyAwcy4KKwkJICovCisJCXNldF9idWZmZXJfdW53cml0dGVuKGJoX3Jlc3VsdCk7CisJCWdvdG8gb3V0MTsKKwl9CisKKwkvKiBidWZmZXJlZCB3cml0ZSwgd3JpdGVwYWdlIHRpbWUsIGNvbnZlcnQqLworCXJldCA9IGV4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6ZWQoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCXBhdGgsIGlibG9jaywKKwkJCQkJCW1heF9ibG9ja3MpOworb3V0OgorCWlmIChyZXQgPD0gMCkgeworCQllcnIgPSByZXQ7CisJCWdvdG8gb3V0MjsKKwl9IGVsc2UKKwkJYWxsb2NhdGVkID0gcmV0OworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CittYXBfb3V0OgorCXNldF9idWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCk7CitvdXQxOgorCWlmIChhbGxvY2F0ZWQgPiBtYXhfYmxvY2tzKQorCQlhbGxvY2F0ZWQgPSBtYXhfYmxvY2tzOworCWV4dDRfZXh0X3Nob3dfbGVhZihpbm9kZSwgcGF0aCk7CisJYmhfcmVzdWx0LT5iX2JkZXYgPSBpbm9kZS0+aV9zYi0+c19iZGV2OworCWJoX3Jlc3VsdC0+Yl9ibG9ja25yID0gbmV3YmxvY2s7CitvdXQyOgorCWlmIChwYXRoKSB7CisJCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKKwkJa2ZyZWUocGF0aCk7CisJfQorCXJldHVybiBlcnIgPyBlcnIgOiBhbGxvY2F0ZWQ7Cit9CisvKgogICogQmxvY2sgYWxsb2NhdGlvbi9tYXAvcHJlYWxsb2NhdGlvbiByb3V0aW5lIGZvciBleHRlbnRzIGJhc2VkIGZpbGVzCiAgKgogICoKQEAgLTI4MTQsNiArMzEzNiw3IEBACiAJaW50IGVyciA9IDAsIGRlcHRoLCByZXQsIGNhY2hlX3R5cGU7CiAJdW5zaWduZWQgaW50IGFsbG9jYXRlZCA9IDA7CiAJc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyOworCWV4dDRfaW9fZW5kX3QgKmlvID0gRVhUNF9JKGlub2RlKS0+Y3VyX2Fpb19kaW87CiAKIAlfX2NsZWFyX2JpdChCSF9OZXcsICZiaF9yZXN1bHQtPmJfc3RhdGUpOwogCWV4dF9kZWJ1ZygiYmxvY2tzICV1LyV1IHJlcXVlc3RlZCBmb3IgaW5vZGUgJWx1XG4iLApAQCAtMjg4OSwzMyArMzIxMiwxMCBAQAogCQkJCQkJCUVYVDRfRVhUX0NBQ0hFX0VYVEVOVCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfVU5JTklUX0VYVCkKLQkJCQlnb3RvIG91dDsKLQkJCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKSB7Ci0JCQkJaWYgKGFsbG9jYXRlZCA+IG1heF9ibG9ja3MpCi0JCQkJCWFsbG9jYXRlZCA9IG1heF9ibG9ja3M7Ci0JCQkJLyoKLQkJCQkgKiBXZSBoYXZlIGJsb2NrcyByZXNlcnZlZCBhbHJlYWR5LiAgV2UKLQkJCQkgKiByZXR1cm4gYWxsb2NhdGVkIGJsb2NrcyBzbyB0aGF0IGRlbGFsbG9jCi0JCQkJICogd29uJ3QgZG8gYmxvY2sgcmVzZXJ2YXRpb24gZm9yIHVzLiAgQnV0Ci0JCQkJICogdGhlIGJ1ZmZlciBoZWFkIHdpbGwgYmUgdW5tYXBwZWQgc28gdGhhdAotCQkJCSAqIGEgcmVhZCBmcm9tIHRoZSBibG9jayByZXR1cm5zIDBzLgotCQkJCSAqLwotCQkJCXNldF9idWZmZXJfdW53cml0dGVuKGJoX3Jlc3VsdCk7Ci0JCQkJYmhfcmVzdWx0LT5iX2JkZXYgPSBpbm9kZS0+aV9zYi0+c19iZGV2OwotCQkJCWJoX3Jlc3VsdC0+Yl9ibG9ja25yID0gbmV3YmxvY2s7Ci0JCQkJZ290byBvdXQyOwotCQkJfQotCi0JCQlyZXQgPSBleHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkJCXBhdGgsIGlibG9jaywKLQkJCQkJCQkJbWF4X2Jsb2Nrcyk7Ci0JCQlpZiAocmV0IDw9IDApIHsKLQkJCQllcnIgPSByZXQ7Ci0JCQkJZ290byBvdXQyOwotCQkJfSBlbHNlCi0JCQkJYWxsb2NhdGVkID0gcmV0OwotCQkJZ290byBvdXRuZXc7CisJCQlyZXQgPSBleHQ0X2V4dF9oYW5kbGVfdW5pbml0aWFsaXplZF9leHRlbnRzKGhhbmRsZSwKKwkJCQkJaW5vZGUsIGlibG9jaywgbWF4X2Jsb2NrcywgcGF0aCwKKwkJCQkJZmxhZ3MsIGFsbG9jYXRlZCwgYmhfcmVzdWx0LCBuZXdibG9jayk7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCkBAIC0yOTg2LDkgKzMyODYsMjEgQEAKIAkvKiB0cnkgdG8gaW5zZXJ0IG5ldyBleHRlbnQgaW50byBmb3VuZCBsZWFmIGFuZCByZXR1cm4gKi8KIAlleHQ0X2V4dF9zdG9yZV9wYmxvY2soJm5ld2V4LCBuZXdibG9jayk7CiAJbmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYoYXIubGVuKTsKLQlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfVU5JTklUX0VYVCkgIC8qIE1hcmsgdW5pbml0aWFsaXplZCAqLworCS8qIE1hcmsgdW5pbml0aWFsaXplZCAqLworCWlmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19VTklOSVRfRVhUKXsKIAkJZXh0NF9leHRfbWFya191bmluaXRpYWxpemVkKCZuZXdleCk7Ci0JZXJyID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCAmbmV3ZXgpOworCQkvKgorCQkgKiBpb19lbmQgc3RydWN0dXJlIHdhcyBjcmVhdGVkIGZvciBldmVyeSBhc3luYworCQkgKiBkaXJlY3QgSU8gd3JpdGUgdG8gdGhlIG1pZGRsZSBvZiB0aGUgZmlsZS4KKwkJICogVG8gYXZvaWQgdW5lY2Vzc2FyeSBjb252ZXJ0aW9uIGZvciBldmVyeSBhaW8gZGlvIHJld3JpdGUKKwkJICogdG8gdGhlIG1pZCBvZiBmaWxlLCBoZXJlIHdlIGZsYWcgdGhlIElPIHRoYXQgaXMgcmVhbGx5CisJCSAqIG5lZWQgdGhlIGNvbnZlcnRpb24uCisJCSAqCisJCSAqLworCQlpZiAoaW8gJiYgZmxhZ3MgPT0gRVhUNF9HRVRfQkxPQ0tTX0RJT19DUkVBVEVfRVhUKQorCQkJaW8tPmZsYWcgPSBESU9fQUlPX1VOV1JJVFRFTjsKKwl9CisJZXJyID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCAmbmV3ZXgsIGZsYWdzKTsKIAlpZiAoZXJyKSB7CiAJCS8qIGZyZWUgZGF0YSBibG9ja3Mgd2UganVzdCBhbGxvY2F0ZWQgKi8KIAkJLyogbm90IGEgZ29vZCBpZGVhIHRvIGNhbGwgZGlzY2FyZCBoZXJlIGRpcmVjdGx5LApAQCAtMzAwMiw3ICszMzE0LDYgQEAKIAkvKiBwcmV2aW91cyByb3V0aW5lIGNvdWxkIHVzZSBibG9jayB3ZSBhbGxvY2F0ZWQgKi8KIAluZXdibG9jayA9IGV4dF9wYmxvY2soJm5ld2V4KTsKIAlhbGxvY2F0ZWQgPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbigmbmV3ZXgpOwotb3V0bmV3OgogCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CiAKIAkvKiBDYWNoZSBvbmx5IHdoZW4gaXQgaXMgX25vdF8gYW4gdW5pbml0aWFsaXplZCBleHRlbnQgKi8KQEAgLTMyMDEsNiArMzUxMiw2MyBAQAogfQogCiAvKgorICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGEgcmFuZ2Ugb2YgYmxvY2tzIHRvIHdyaXR0ZW4gZXh0ZW50cworICogVGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIHdpbGwgcGFzcyB0aGUgc3RhcnQgb2Zmc2V0IGFuZCB0aGUgc2l6ZS4KKyAqIGFsbCB1bndyaXR0ZW4gZXh0ZW50cyB3aXRoaW4gdGhpcyByYW5nZSB3aWxsIGJlIGNvbnZlcnRlZCB0bworICogd3JpdHRlbiBleHRlbnRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGRpcmVjdCBJTyBlbmQgaW8gY2FsbCBiYWNrCisgKiBmdW5jdGlvbiwgdG8gY29udmVydCB0aGUgZmFsbG9jYXRlZCBleHRlbnRzIGFmdGVyIElPIGlzIGNvbXBsZXRlZC4KKyAqLworaW50IGV4dDRfY29udmVydF91bndyaXR0ZW5fZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICBsb2ZmX3QgbGVuKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJZXh0NF9sYmxrX3QgYmxvY2s7CisJdW5zaWduZWQgaW50IG1heF9ibG9ja3M7CisJaW50IHJldCA9IDA7CisJaW50IHJldDIgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCBtYXBfYmg7CisJdW5zaWduZWQgaW50IGNyZWRpdHMsIGJsa2JpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOworCisJYmxvY2sgPSBvZmZzZXQgPj4gYmxrYml0czsKKwkvKgorCSAqIFdlIGNhbid0IGp1c3QgY29udmVydCBsZW4gdG8gbWF4X2Jsb2NrcyBiZWNhdXNlCisJICogSWYgYmxvY2tzaXplID0gNDA5NiBvZmZzZXQgPSAzMDcyIGFuZCBsZW4gPSAyMDQ4CisJICovCisJbWF4X2Jsb2NrcyA9IChFWFQ0X0JMT0NLX0FMSUdOKGxlbiArIG9mZnNldCwgYmxrYml0cykgPj4gYmxrYml0cykKKwkJCQkJCQktIGJsb2NrOworCS8qCisJICogY3JlZGl0cyB0byBpbnNlcnQgMSBleHRlbnQgaW50byBleHRlbnQgdHJlZQorCSAqLworCWNyZWRpdHMgPSBleHQ0X2NodW5rX3RyYW5zX2Jsb2Nrcyhpbm9kZSwgbWF4X2Jsb2Nrcyk7CisJd2hpbGUgKHJldCA+PSAwICYmIHJldCA8IG1heF9ibG9ja3MpIHsKKwkJYmxvY2sgPSBibG9jayArIHJldDsKKwkJbWF4X2Jsb2NrcyA9IG1heF9ibG9ja3MgLSByZXQ7CisJCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgY3JlZGl0cyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQkJYnJlYWs7CisJCX0KKwkJbWFwX2JoLmJfc3RhdGUgPSAwOworCQlyZXQgPSBleHQ0X2dldF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmxvY2ssCisJCQkJICAgICAgbWF4X2Jsb2NrcywgJm1hcF9iaCwKKwkJCQkgICAgICBFWFQ0X0dFVF9CTE9DS1NfRElPX0NPTlZFUlRfRVhUKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlXQVJOX09OKHJldCA8PSAwKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGV4dDRfZXh0X2dldF9ibG9ja3MgIgorCQkJCSAgICAicmV0dXJuZWQgZXJyb3IgaW5vZGUjJWx1LCBibG9jaz0ldSwgIgorCQkJCSAgICAibWF4X2Jsb2Nrcz0ldSIsIF9fZnVuY19fLAorCQkJCSAgICBpbm9kZS0+aV9pbm8sIGJsb2NrLCBtYXhfYmxvY2tzKTsKKwkJfQorCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCXJldDIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQlpZiAocmV0IDw9IDAgfHwgcmV0MiApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldCA+IDAgPyByZXQyIDogcmV0OworfQorLyoKICAqIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBmb3IgZWFjaCBleHRlbnQgdG8gZ2F0aGVyIEZJRU1BUCBpbmZvcm1hdGlvbi4KICAqLwogc3RhdGljIGludCBleHQ0X2V4dF9maWVtYXBfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZpbGUuYyBiL2ZzL2V4dDQvZmlsZS5jCmluZGV4IDVjYTNlY2EuLjk2MzA1ODMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZmlsZS5jCisrKyBiL2ZzL2V4dDQvZmlsZS5jCkBAIC04MSw3ICs4MSw3IEBACiAJcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGV4dDRfZmlsZV92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGV4dDRfZmlsZV92bV9vcHMgPSB7CiAJLmZhdWx0CQk9IGZpbGVtYXBfZmF1bHQsCiAJLnBhZ2VfbWt3cml0ZSAgID0gZXh0NF9wYWdlX21rd3JpdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9mc3luYy5jIGIvZnMvZXh0NC9mc3luYy5jCmluZGV4IDA3NDc1NzQuLjJiMTUzMTIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZnN5bmMuYworKysgYi9mcy9leHQ0L2ZzeW5jLmMKQEAgLTQ0LDYgKzQ0LDggQEAKICAqCiAgKiBXaGF0IHdlIGRvIGlzIGp1c3Qga2ljayBvZmYgYSBjb21taXQgYW5kIHdhaXQgb24gaXQuICBUaGlzIHdpbGwgc25hcHNob3QgdGhlCiAgKiBpbm9kZSB0byBkaXNrLgorICoKKyAqIGlfbXV0ZXggbG9jayBpcyBoZWxkIHdoZW4gZW50ZXJpbmcgYW5kIGV4aXRpbmcgdGhpcyBmdW5jdGlvbgogICovCiAKIGludCBleHQ0X3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCkBAIC01Niw2ICs1OCw5IEBACiAKIAl0cmFjZV9leHQ0X3N5bmNfZmlsZShmaWxlLCBkZW50cnksIGRhdGFzeW5jKTsKIAorCXJldCA9IGZsdXNoX2Fpb19kaW9fY29tcGxldGVkX0lPKGlub2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CiAJLyoKIAkgKiBkYXRhPXdyaXRlYmFjazoKIAkgKiAgVGhlIGNhbGxlcidzIGZpbGVtYXBfZmRhdGF3cml0ZSgpL3dhaXQgd2lsbCBzeW5jIHRoZSBkYXRhLgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDNhNzk4NzMuLjVjNWJjNWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAiZXh0NF9qYmQyLmgiCiAjaW5jbHVkZSAieGF0dHIuaCIKQEAgLTExNDUsNiArMTE0Niw2NCBAQAogfQogCiAvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29udGlndW91cyBkaXJ0eSBwYWdlcyBpbiBhIGdpdmVuIGlub2RlCisgKiBzdGFydGluZyBhdCBwYWdlIGZyYW1lIGlkeC4KKyAqLworc3RhdGljIHBnb2ZmX3QgZXh0NF9udW1fZGlydHlfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBpZHgsCisJCQkJICAgIHVuc2lnbmVkIGludCBtYXhfcGFnZXMpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXBnb2ZmX3QJaW5kZXg7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlwZ29mZl90IG51bSA9IDA7CisJaW50IGksIG5yX3BhZ2VzLCBkb25lID0gMDsKKworCWlmIChtYXhfcGFnZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKKwl3aGlsZSAoIWRvbmUpIHsKKwkJaW5kZXggPSBpZHg7CisJCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXBfdGFnKCZwdmVjLCBtYXBwaW5nLCAmaW5kZXgsCisJCQkJCSAgICAgIFBBR0VDQUNIRV9UQUdfRElSVFksCisJCQkJCSAgICAgIChwZ29mZl90KVBBR0VWRUNfU0laRSk7CisJCWlmIChucl9wYWdlcyA9PSAwKQorCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKworCQkJbG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKHVubGlrZWx5KHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykgfHwKKwkJCSAgICAhUGFnZURpcnR5KHBhZ2UpIHx8CisJCQkgICAgUGFnZVdyaXRlYmFjayhwYWdlKSB8fAorCQkJICAgIHBhZ2UtPmluZGV4ICE9IGlkeCkgeworCQkJCWRvbmUgPSAxOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCQkJZG8geworCQkJCQlpZiAoIWJ1ZmZlcl9kZWxheShiaCkgJiYKKwkJCQkJICAgICFidWZmZXJfdW53cml0dGVuKGJoKSkKKwkJCQkJCWRvbmUgPSAxOworCQkJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJCQl9IHdoaWxlICghZG9uZSAmJiAoYmggIT0gaGVhZCkpOworCQkJfQorCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlpZiAoZG9uZSkKKwkJCQlicmVhazsKKwkJCWlkeCsrOworCQkJbnVtKys7CisJCQlpZiAobnVtID49IG1heF9wYWdlcykKKwkJCQlicmVhazsKKwkJfQorCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCX0KKwlyZXR1cm4gbnVtOworfQorCisvKgogICogVGhlIGV4dDRfZ2V0X2Jsb2NrcygpIGZ1bmN0aW9uIHRyaWVzIHRvIGxvb2sgdXAgdGhlIHJlcXVlc3RlZCBibG9ja3MsCiAgKiBhbmQgcmV0dXJucyBpZiB0aGUgYmxvY2tzIGFyZSBhbHJlYWR5IG1hcHBlZC4KICAqCkBAIC0xMTc1LDYgKzEyMzQsOSBAQAogCWNsZWFyX2J1ZmZlcl9tYXBwZWQoYmgpOwogCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOwogCisJZXh0X2RlYnVnKCJleHQ0X2dldF9ibG9ja3MoKTogaW5vZGUgJWx1LCBmbGFnICVkLCBtYXhfYmxvY2tzICV1LCIKKwkJICAibG9naWNhbCBibG9jayAlbHVcbiIsIGlub2RlLT5pX2lubywgZmxhZ3MsIG1heF9ibG9ja3MsCisJCSAgKHVuc2lnbmVkIGxvbmcpYmxvY2spOwogCS8qCiAJICogVHJ5IHRvIHNlZSBpZiB3ZSBjYW4gZ2V0IHRoZSBibG9jayB3aXRob3V0IHJlcXVlc3RpbmcgYSBuZXcKIAkgKiBmaWxlIHN5c3RlbSBibG9jay4KQEAgLTE3OTYsMTEgKzE4NTgsMTEgQEAKIAogCWlmIChleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHNiaSwgdG90YWwpKSB7CiAJCXNwaW5fdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOworCQl2ZnNfZHFfcmVsZWFzZV9yZXNlcnZhdGlvbl9ibG9jayhpbm9kZSwgdG90YWwpOwogCQlpZiAoZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkgewogCQkJeWllbGQoKTsKIAkJCWdvdG8gcmVwZWF0OwogCQl9Ci0JCXZmc19kcV9yZWxlYXNlX3Jlc2VydmF0aW9uX2Jsb2NrKGlub2RlLCB0b3RhbCk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KIAlFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzICs9IG5yYmxvY2tzOwpAQCAtMjA5MiwxOCArMjE1NCwxOCBAQAogc3RhdGljIHZvaWQgZXh0NF9wcmludF9mcmVlX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOwotCXByaW50ayhLRVJOX0VNRVJHICJUb3RhbCBmcmVlIGJsb2NrcyBjb3VudCAlbGxkXG4iLAotCQkJZXh0NF9jb3VudF9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYikpOwotCXByaW50ayhLRVJOX0VNRVJHICJGcmVlL0RpcnR5IGJsb2NrIGRldGFpbHNcbiIpOwotCXByaW50ayhLRVJOX0VNRVJHICJmcmVlX2Jsb2Nrcz0lbGxkXG4iLAotCQkJKGxvbmcgbG9uZylwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpKTsKLQlwcmludGsoS0VSTl9FTUVSRyAiZGlydHlfYmxvY2tzPSVsbGRcbiIsCi0JCQkobG9uZyBsb25nKXBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIpKTsKLQlwcmludGsoS0VSTl9FTUVSRyAiQmxvY2sgcmVzZXJ2YXRpb24gZGV0YWlsc1xuIik7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgImlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M9JXVcbiIsCi0JCQlFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzKTsKLQlwcmludGsoS0VSTl9FTUVSRyAiaV9yZXNlcnZlZF9tZXRhX2Jsb2Nrcz0ldVxuIiwKLQkJCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MpOworCXByaW50ayhLRVJOX0NSSVQgIlRvdGFsIGZyZWUgYmxvY2tzIGNvdW50ICVsbGRcbiIsCisJICAgICAgIGV4dDRfY291bnRfZnJlZV9ibG9ja3MoaW5vZGUtPmlfc2IpKTsKKwlwcmludGsoS0VSTl9DUklUICJGcmVlL0RpcnR5IGJsb2NrIGRldGFpbHNcbiIpOworCXByaW50ayhLRVJOX0NSSVQgImZyZWVfYmxvY2tzPSVsbGRcbiIsCisJICAgICAgIChsb25nIGxvbmcpIHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcikpOworCXByaW50ayhLRVJOX0NSSVQgImRpcnR5X2Jsb2Nrcz0lbGxkXG4iLAorCSAgICAgICAobG9uZyBsb25nKSBwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyKSk7CisJcHJpbnRrKEtFUk5fQ1JJVCAiQmxvY2sgcmVzZXJ2YXRpb24gZGV0YWlsc1xuIik7CisJcHJpbnRrKEtFUk5fQ1JJVCAiaV9yZXNlcnZlZF9kYXRhX2Jsb2Nrcz0ldVxuIiwKKwkgICAgICAgRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2Nrcyk7CisJcHJpbnRrKEtFUk5fQ1JJVCAiaV9yZXNlcnZlZF9tZXRhX2Jsb2Nrcz0ldVxuIiwKKwkgICAgICAgRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2Nrcyk7CiAJcmV0dXJuOwogfQogCkBAIC0yMTg5LDE0ICsyMjUxLDE0IEBACiAJCSAqIHdyaXRlcGFnZSBhbmQgd3JpdGVwYWdlcyB3aWxsIGFnYWluIHRyeSB0byB3cml0ZQogCQkgKiB0aGUgc2FtZS4KIAkJICovCi0JCXByaW50ayhLRVJOX0VNRVJHICIlcyBibG9jayBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgaW5vZGUgJWx1ICIKLQkJCQkgICJhdCBsb2dpY2FsIG9mZnNldCAlbGx1IHdpdGggbWF4IGJsb2NrcyAiCi0JCQkJICAiJXpkIHdpdGggZXJyb3IgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgbXBkLT5pbm9kZS0+aV9pbm8sCi0JCQkJICAodW5zaWduZWQgbG9uZyBsb25nKW5leHQsCi0JCQkJICBtcGQtPmJfc2l6ZSA+PiBtcGQtPmlub2RlLT5pX2Jsa2JpdHMsIGVycik7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJUaGlzIHNob3VsZCBub3QgaGFwcGVuLiEhICIKLQkJCQkJIkRhdGEgd2lsbCBiZSBsb3N0XG4iKTsKKwkJZXh0NF9tc2cobXBkLT5pbm9kZS0+aV9zYiwgS0VSTl9DUklULAorCQkJICJkZWxheWVkIGJsb2NrIGFsbG9jYXRpb24gZmFpbGVkIGZvciBpbm9kZSAlbHUgYXQgIgorCQkJICJsb2dpY2FsIG9mZnNldCAlbGx1IHdpdGggbWF4IGJsb2NrcyAlemQgd2l0aCAiCisJCQkgImVycm9yICVkXG4iLCBtcGQtPmlub2RlLT5pX2lubywKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBuZXh0LAorCQkJIG1wZC0+Yl9zaXplID4+IG1wZC0+aW5vZGUtPmlfYmxrYml0cywgZXJyKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiVGhpcyBzaG91bGQgbm90IGhhcHBlbiEhICAiCisJCSAgICAgICAiRGF0YSB3aWxsIGJlIGxvc3RcbiIpOwogCQlpZiAoZXJyID09IC1FTk9TUEMpIHsKIAkJCWV4dDRfcHJpbnRfZnJlZV9ibG9ja3MobXBkLT5pbm9kZSk7CiAJCX0KQEAgLTI3NDMsOCArMjgwNSwxMCBAQAogCWludCBub19ucndyaXRlX2luZGV4X3VwZGF0ZTsKIAlpbnQgcGFnZXNfd3JpdHRlbiA9IDA7CiAJbG9uZyBwYWdlc19za2lwcGVkOworCXVuc2lnbmVkIGludCBtYXhfcGFnZXM7CiAJaW50IHJhbmdlX2N5Y2xpYywgY3ljbGVkID0gMSwgaW9fZG9uZSA9IDA7Ci0JaW50IG5lZWRlZF9ibG9ja3MsIHJldCA9IDAsIG5yX3RvX3dyaXRlYnVtcCA9IDA7CisJaW50IG5lZWRlZF9ibG9ja3MsIHJldCA9IDA7CisJbG9uZyBkZXNpcmVkX25yX3RvX3dyaXRlLCBucl90b193cml0ZWJ1bXAgPSAwOwogCWxvZmZfdCByYW5nZV9zdGFydCA9IHdiYy0+cmFuZ2Vfc3RhcnQ7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihtYXBwaW5nLT5ob3N0LT5pX3NiKTsKIApAQCAtMjc3MSwxNiArMjgzNSw2IEBACiAJaWYgKHVubGlrZWx5KHNiaS0+c19tb3VudF9mbGFncyAmIEVYVDRfTUZfRlNfQUJPUlRFRCkpCiAJCXJldHVybiAtRVJPRlM7CiAKLQkvKgotCSAqIE1ha2Ugc3VyZSBucl90b193cml0ZSBpcyA+PSBzYmktPnNfbWJfc3RyZWFtX3JlcXVlc3QKLQkgKiBUaGlzIG1ha2Ugc3VyZSBzbWFsbCBmaWxlcyBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbgotCSAqIHNpbmdsZSBhdHRlbXB0LiBUaGlzIGVuc3VyZSB0aGF0IHNtYWxsIGZpbGVzCi0JICogZ2V0IGxlc3MgZnJhZ21lbnRlZC4KLQkgKi8KLQlpZiAod2JjLT5ucl90b193cml0ZSA8IHNiaS0+c19tYl9zdHJlYW1fcmVxdWVzdCkgewotCQlucl90b193cml0ZWJ1bXAgPSBzYmktPnNfbWJfc3RyZWFtX3JlcXVlc3QgLSB3YmMtPm5yX3RvX3dyaXRlOwotCQl3YmMtPm5yX3RvX3dyaXRlID0gc2JpLT5zX21iX3N0cmVhbV9yZXF1ZXN0OwotCX0KIAlpZiAod2JjLT5yYW5nZV9zdGFydCA9PSAwICYmIHdiYy0+cmFuZ2VfZW5kID09IExMT05HX01BWCkKIAkJcmFuZ2Vfd2hvbGUgPSAxOwogCkBAIC0yNzk1LDYgKzI4NDksMzYgQEAKIAl9IGVsc2UKIAkJaW5kZXggPSB3YmMtPnJhbmdlX3N0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKKwkvKgorCSAqIFRoaXMgd29ya3MgYXJvdW5kIHR3byBmb3JtcyBvZiBzdHVwaWRpdHkuICBUaGUgZmlyc3QgaXMgaW4KKwkgKiB0aGUgd3JpdGViYWNrIGNvZGUsIHdoaWNoIGNhcHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCisJICogd3JpdHRlbiB0byBiZSAxMDI0IHBhZ2VzLiAgVGhpcyBpcyB3cm9uZyBvbiBtdWx0aXBsZQorCSAqIGxldmVsczsgZGlmZmVyZW50IGFyY2hpdGVjdHVlcyBoYXZlIGEgZGlmZmVyZW50IHBhZ2Ugc2l6ZSwKKwkgKiB3aGljaCBjaGFuZ2VzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHdoaWNoIGdldHMKKwkgKiB3cml0dGVuLiAgU2Vjb25kbHksIDQgbWVnYWJ5dGVzIGlzIHdheSB0b28gc21hbGwuICBYRlMKKwkgKiBmb3JjZXMgdGhpcyB2YWx1ZSB0byBiZSAxNiBtZWdhYnl0ZXMgYnkgbXVsdGlwbHlpbmcKKwkgKiBucl90b193cml0ZSBwYXJhbWV0ZXIgYnkgZm91ciwgYW5kIHRoZW4gcmVsaWVzIG9uIGl0cworCSAqIGFsbG9jYXRvciB0byBhbGxvY2F0ZSBsYXJnZXIgZXh0ZW50cyB0byBtYWtlIHRoZW0KKwkgKiBjb250aWd1b3VzLiAgVW5mb3J0dW5hdGVseSB0aGlzIGJyaW5ncyB1cyB0byB0aGUgc2Vjb25kCisJICogc3R1cGlkaXR5LCB3aGljaCBpcyB0aGF0IGV4dDQncyBtYmFsbG9jIGNvZGUgb25seSBhbGxvY2F0ZXMKKwkgKiBhdCBtb3N0IDIwNDggYmxvY2tzLiAgU28gd2UgZm9yY2UgY29udGlndW91cyB3cml0ZXMgdXAgdG8KKwkgKiB0aGUgbnVtYmVyIG9mIGRpcnR5IGJsb2NrcyBpbiB0aGUgaW5vZGUsIG9yCisJICogc2JpLT5tYXhfd3JpdGViYWNrX21iX2J1bXAgd2hpY2hldmVyIGlzIHNtYWxsZXIuCisJICovCisJbWF4X3BhZ2VzID0gc2JpLT5zX21heF93cml0ZWJhY2tfbWJfYnVtcCA8PCAoMjAgLSBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAoIXJhbmdlX2N5Y2xpYyAmJiByYW5nZV93aG9sZSkKKwkJZGVzaXJlZF9ucl90b193cml0ZSA9IHdiYy0+bnJfdG9fd3JpdGUgKiA4OworCWVsc2UKKwkJZGVzaXJlZF9ucl90b193cml0ZSA9IGV4dDRfbnVtX2RpcnR5X3BhZ2VzKGlub2RlLCBpbmRleCwKKwkJCQkJCQkgICBtYXhfcGFnZXMpOworCWlmIChkZXNpcmVkX25yX3RvX3dyaXRlID4gbWF4X3BhZ2VzKQorCQlkZXNpcmVkX25yX3RvX3dyaXRlID0gbWF4X3BhZ2VzOworCisJaWYgKHdiYy0+bnJfdG9fd3JpdGUgPCBkZXNpcmVkX25yX3RvX3dyaXRlKSB7CisJCW5yX3RvX3dyaXRlYnVtcCA9IGRlc2lyZWRfbnJfdG9fd3JpdGUgLSB3YmMtPm5yX3RvX3dyaXRlOworCQl3YmMtPm5yX3RvX3dyaXRlID0gZGVzaXJlZF9ucl90b193cml0ZTsKKwl9CisKIAltcGQud2JjID0gd2JjOwogCW1wZC5pbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAKQEAgLTI4MjIsMTAgKzI5MDYsOSBAQAogCQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIG5lZWRlZF9ibG9ja3MpOwogCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBqYmQyX3N0YXJ0OiAiCisJCQlleHQ0X21zZyhpbm9kZS0+aV9zYiwgS0VSTl9DUklULCAiJXM6IGpiZDJfc3RhcnQ6ICIKIAkJCSAgICAgICAiJWxkIHBhZ2VzLCBpbm8gJWx1OyBlcnIgJWRcbiIsIF9fZnVuY19fLAogCQkJCXdiYy0+bnJfdG9fd3JpdGUsIGlub2RlLT5pX2lubywgcmV0KTsKLQkJCWR1bXBfc3RhY2soKTsKIAkJCWdvdG8gb3V0X3dyaXRlcGFnZXM7CiAJCX0KIApAQCAtMjg5Nyw5ICsyOTgwLDEwIEBACiAJCWdvdG8gcmV0cnk7CiAJfQogCWlmIChwYWdlc19za2lwcGVkICE9IHdiYy0+cGFnZXNfc2tpcHBlZCkKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIlRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gbGVhdmluZyAlcyAiCi0JCQkJIndpdGggbnJfdG9fd3JpdGUgPSAlbGQgcmV0ID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHdiYy0+bnJfdG9fd3JpdGUsIHJldCk7CisJCWV4dDRfbXNnKGlub2RlLT5pX3NiLCBLRVJOX0NSSVQsCisJCQkgIlRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gbGVhdmluZyAlcyAiCisJCQkgIndpdGggbnJfdG9fd3JpdGUgPSAlbGQgcmV0ID0gJWRcbiIsCisJCQkgX19mdW5jX18sIHdiYy0+bnJfdG9fd3JpdGUsIHJldCk7CiAKIAkvKiBVcGRhdGUgaW5kZXggKi8KIAlpbmRleCArPSBwYWdlc193cml0dGVuOwpAQCAtMjkxNCw3ICsyOTk4LDggQEAKIG91dF93cml0ZXBhZ2VzOgogCWlmICghbm9fbnJ3cml0ZV9pbmRleF91cGRhdGUpCiAJCXdiYy0+bm9fbnJ3cml0ZV9pbmRleF91cGRhdGUgPSAwOwotCXdiYy0+bnJfdG9fd3JpdGUgLT0gbnJfdG9fd3JpdGVidW1wOworCWlmICh3YmMtPm5yX3RvX3dyaXRlID4gbnJfdG9fd3JpdGVidW1wKQorCQl3YmMtPm5yX3RvX3dyaXRlIC09IG5yX3RvX3dyaXRlYnVtcDsKIAl3YmMtPnJhbmdlX3N0YXJ0ID0gcmFuZ2Vfc3RhcnQ7CiAJdHJhY2VfZXh0NF9kYV93cml0ZXBhZ2VzX3Jlc3VsdChpbm9kZSwgd2JjLCByZXQsIHBhZ2VzX3dyaXR0ZW4pOwogCXJldHVybiByZXQ7CkBAIC0zMjcyLDYgKzMzNTcsOCBAQAogfQogCiAvKgorICogT19ESVJFQ1QgZm9yIGV4dDMgKG9yIGluZGlyZWN0IG1hcCkgYmFzZWQgZmlsZXMKKyAqCiAgKiBJZiB0aGUgT19ESVJFQ1Qgd3JpdGUgd2lsbCBleHRlbmQgdGhlIGZpbGUgdGhlbiBhZGQgdGhpcyBpbm9kZSB0byB0aGUKICAqIG9ycGhhbiBsaXN0LiAgU28gcmVjb3Zlcnkgd2lsbCB0cnVuY2F0ZSBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplCiAgKiBpZiB0aGUgbWFjaGluZSBjcmFzaGVzIGR1cmluZyB0aGUgd3JpdGUuCkBAIC0zMjgwLDcgKzMzNjcsNyBAQAogICogY3Jhc2hlcyB0aGVuIHN0YWxlIGRpc2sgZGF0YSBfbWF5XyBiZSBleHBvc2VkIGluc2lkZSB0aGUgZmlsZS4gQnV0IGN1cnJlbnQKICAqIFZGUyBjb2RlIGZhbGxzIGJhY2sgaW50byBidWZmZXJlZCBwYXRoIGluIHRoYXQgY2FzZSBzbyB3ZSBhcmUgc2FmZS4KICAqLwotc3RhdGljIHNzaXplX3QgZXh0NF9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCitzdGF0aWMgc3NpemVfdCBleHQ0X2luZF9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKIHsKQEAgLTMyOTEsNiArMzM3OCw3IEBACiAJc3NpemVfdCByZXQ7CiAJaW50IG9ycGhhbiA9IDA7CiAJc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCWludCByZXRyaWVzID0gMDsKIAogCWlmIChydyA9PSBXUklURSkgewogCQlsb2ZmX3QgZmluYWxfc2l6ZSA9IG9mZnNldCArIGNvdW50OwpAQCAtMzMxMyw5ICszNDAxLDEyIEBACiAJCX0KIAl9CiAKK3JldHJ5OgogCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKIAkJCQkgb2Zmc2V0LCBucl9zZWdzLAogCQkJCSBleHQ0X2dldF9ibG9jaywgTlVMTCk7CisJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CiAKIAlpZiAob3JwaGFuKSB7CiAJCWludCBlcnI7CkBAIC0zMzU0LDYgKzM0NDUsMzU5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyogTWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHdlIG1hcCBmb3IgZGlyZWN0IElPIGF0IG9uY2UuICovCisKK3N0YXRpYyBpbnQgZXh0NF9nZXRfYmxvY2tfZGlvX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbWF4X2Jsb2NrcyA9IGJoX3Jlc3VsdC0+Yl9zaXplID4+IGlub2RlLT5pX2Jsa2JpdHM7CisJaW50IGRpb19jcmVkaXRzOworCisJZXh0NF9kZWJ1ZygiZXh0NF9nZXRfYmxvY2tfZGlvX3dyaXRlOiBpbm9kZSAlbHUsIGNyZWF0ZSBmbGFnICVkXG4iLAorCQkgICBpbm9kZS0+aV9pbm8sIGNyZWF0ZSk7CisJLyoKKwkgKiBESU8gVkZTIGNvZGUgcGFzc2VzIGNyZWF0ZSA9IDAgZmxhZyBmb3Igd3JpdGUgdG8KKwkgKiB0aGUgbWlkZGxlIG9mIGZpbGUuIEl0IGRvZXMgdGhpcyB0byBhdm9pZCBibG9jaworCSAqIGFsbG9jYXRpb24gZm9yIGhvbGVzLCB0byBwcmV2ZW50IGV4cG9zZSBzdGFsZSBkYXRhCisJICogb3V0IHdoZW4gdGhlcmUgaXMgcGFyYWxsZWwgYnVmZmVyZWQgcmVhZCAod2hpY2ggZG9lcworCSAqIG5vdCBob2xkIHRoZSBpX211dGV4IGxvY2spIHdoaWxlIGRpcmVjdCBJTyB3cml0ZSBoYXMKKwkgKiBub3QgY29tcGxldGVkLiBESU8gcmVxdWVzdCBvbiBob2xlcyBmaW5hbGx5IGZhbGxzIGJhY2sKKwkgKiB0byBidWZmZXJlZCBJTyBmb3IgdGhpcyByZWFzb24uCisJICoKKwkgKiBGb3IgZXh0NCBleHRlbnQgYmFzZWQgZmlsZSwgc2luY2Ugd2Ugc3VwcG9ydCBmYWxsb2NhdGUsCisJICogbmV3IGFsbG9jYXRlZCBleHRlbnQgYXMgdW5pbml0aWFsaXplZCwgZm9yIGhvbGVzLCB3ZQorCSAqIGNvdWxkIGZhbGxvY2F0ZSBibG9ja3MgZm9yIGhvbGVzLCB0aHVzIHBhcmFsbGVsCisJICogYnVmZmVyZWQgSU8gcmVhZCB3aWxsIHplcm8gb3V0IHRoZSBwYWdlIHdoZW4gcmVhZCBvbgorCSAqIGEgaG9sZSB3aGlsZSBwYXJhbGxlbCBESU8gd3JpdGUgdG8gdGhlIGhvbGUgaGFzIG5vdCBjb21wbGV0ZWQuCisJICoKKwkgKiB3aGVuIHdlIGNvbWUgaGVyZSwgd2Uga25vdyBpdCdzIGEgZGlyZWN0IElPIHdyaXRlIHRvCisJICogdG8gdGhlIG1pZGRsZSBvZiBmaWxlICg8aV9zaXplKQorCSAqIHNvIGl0J3Mgc2FmZSB0byBvdmVycmlkZSB0aGUgY3JlYXRlIGZsYWcgZnJvbSBWRlMuCisJICovCisJY3JlYXRlID0gRVhUNF9HRVRfQkxPQ0tTX0RJT19DUkVBVEVfRVhUOworCisJaWYgKG1heF9ibG9ja3MgPiBESU9fTUFYX0JMT0NLUykKKwkJbWF4X2Jsb2NrcyA9IERJT19NQVhfQkxPQ0tTOworCWRpb19jcmVkaXRzID0gZXh0NF9jaHVua190cmFuc19ibG9ja3MoaW5vZGUsIG1heF9ibG9ja3MpOworCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgZGlvX2NyZWRpdHMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSBleHQ0X2dldF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLCBtYXhfYmxvY2tzLCBiaF9yZXN1bHQsCisJCQkgICAgICBjcmVhdGUpOworCWlmIChyZXQgPiAwKSB7CisJCWJoX3Jlc3VsdC0+Yl9zaXplID0gKHJldCA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKKwkJcmV0ID0gMDsKKwl9CisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBleHQ0X2ZyZWVfaW9fZW5kKGV4dDRfaW9fZW5kX3QgKmlvKQoreworCUJVR19PTighaW8pOworCWlwdXQoaW8tPmlub2RlKTsKKwlrZnJlZShpbyk7Cit9CitzdGF0aWMgdm9pZCBkdW1wX2Fpb19kaW9fbGlzdChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKyNpZmRlZglFWFQ0X0RFQlVHCisJc3RydWN0IGxpc3RfaGVhZCAqY3VyLCAqYmVmb3JlLCAqYWZ0ZXI7CisJZXh0NF9pb19lbmRfdCAqaW8sICppbzAsICppbzE7CisKKwlpZiAobGlzdF9lbXB0eSgmRVhUNF9JKGlub2RlKS0+aV9haW9fZGlvX2NvbXBsZXRlX2xpc3QpKXsKKwkJZXh0NF9kZWJ1ZygiaW5vZGUgJWx1IGFpbyBkaW8gbGlzdCBpcyBlbXB0eVxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuOworCX0KKworCWV4dDRfZGVidWcoIkR1bXAgaW5vZGUgJWx1IGFpb19kaW9fY29tcGxldGVkX0lPIGxpc3QgXG4iLCBpbm9kZS0+aV9pbm8pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW8sICZFWFQ0X0koaW5vZGUpLT5pX2Fpb19kaW9fY29tcGxldGVfbGlzdCwgbGlzdCl7CisJCWN1ciA9ICZpby0+bGlzdDsKKwkJYmVmb3JlID0gY3VyLT5wcmV2OworCQlpbzAgPSBjb250YWluZXJfb2YoYmVmb3JlLCBleHQ0X2lvX2VuZF90LCBsaXN0KTsKKwkJYWZ0ZXIgPSBjdXItPm5leHQ7CisJCWlvMSA9IGNvbnRhaW5lcl9vZihhZnRlciwgZXh0NF9pb19lbmRfdCwgbGlzdCk7CisKKwkJZXh0NF9kZWJ1ZygiaW8gMHglcCBmcm9tIGlub2RlICVsdSxwcmV2IDB4JXAsbmV4dCAweCVwXG4iLAorCQkJICAgIGlvLCBpbm9kZS0+aV9pbm8sIGlvMCwgaW8xKTsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIGNoZWNrIGEgcmFuZ2Ugb2Ygc3BhY2UgYW5kIGNvbnZlcnQgdW53cml0dGVuIGV4dGVudHMgdG8gd3JpdHRlbi4KKyAqLworc3RhdGljIGludCBleHQ0X2VuZF9haW9fZGlvX25vbG9jayhleHQ0X2lvX2VuZF90ICppbykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaW8tPmlub2RlOworCWxvZmZfdCBvZmZzZXQgPSBpby0+b2Zmc2V0OworCXNpemVfdCBzaXplID0gaW8tPnNpemU7CisJaW50IHJldCA9IDA7CisKKwlleHQ0X2RlYnVnKCJlbmRfYWlvX2Rpb19vbmxvY2s6IGlvIDB4JXAgZnJvbSBpbm9kZSAlbHUsbGlzdC0+bmV4dCAweCVwLCIKKwkJICAgImxpc3QtPnByZXYgMHglcFxuIiwKKwkgICAgICAgICAgIGlvLCBpbm9kZS0+aV9pbm8sIGlvLT5saXN0Lm5leHQsIGlvLT5saXN0LnByZXYpOworCisJaWYgKGxpc3RfZW1wdHkoJmlvLT5saXN0KSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpby0+ZmxhZyAhPSBESU9fQUlPX1VOV1JJVFRFTikKKwkJcmV0dXJuIHJldDsKKworCWlmIChvZmZzZXQgKyBzaXplIDw9IGlfc2l6ZV9yZWFkKGlub2RlKSkKKwkJcmV0ID0gZXh0NF9jb252ZXJ0X3Vud3JpdHRlbl9leHRlbnRzKGlub2RlLCBvZmZzZXQsIHNpemUpOworCisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBmYWlsZWQgdG8gY29udmVydCB1bndyaXR0ZW4iCisJCQkiZXh0ZW50cyB0byB3cml0dGVuIGV4dGVudHMsIGVycm9yIGlzICVkIgorCQkJIiBpbyBpcyBzdGlsbCBvbiBpbm9kZSAlbHUgYWlvIGRpbyBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmV0LCBpbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGNsZWFyIHRoZSBESU8gQUlPIHVud3JpdHRlbiBmbGFnICovCisJaW8tPmZsYWcgPSAwOworCXJldHVybiByZXQ7Cit9CisvKgorICogd29yayBvbiBjb21wbGV0ZWQgYWlvIGRpbyBJTywgdG8gY29udmVydCB1bndyaXR0ZW4gZXh0ZW50cyB0byBleHRlbnRzCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfZW5kX2Fpb19kaW9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJZXh0NF9pb19lbmRfdCAqaW8gID0gY29udGFpbmVyX29mKHdvcmssIGV4dDRfaW9fZW5kX3QsIHdvcmspOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpby0+aW5vZGU7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJcmV0ID0gZXh0NF9lbmRfYWlvX2Rpb19ub2xvY2soaW8pOworCWlmIChyZXQgPj0gMCkgeworCQlpZiAoIWxpc3RfZW1wdHkoJmlvLT5saXN0KSkKKwkJCWxpc3RfZGVsX2luaXQoJmlvLT5saXN0KTsKKwkJZXh0NF9mcmVlX2lvX2VuZChpbyk7CisJfQorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworfQorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gZXh0NF9zeW5jX2ZpbGUoKS4KKyAqCisgKiBXaGVuIEFJTyBESU8gSU8gaXMgY29tcGxldGVkLCB0aGUgd29yayB0byBjb252ZXJ0IHVud3JpdHRlbgorICogZXh0ZW50cyB0byB3cml0dGVuIGlzIHF1ZXVlZCBvbiB3b3JrcXVldWUgYnV0IG1heSBub3QgZ2V0IGltbWVkaWF0ZWx5CisgKiBzY2hlZHVsZWQuIFdoZW4gZnN5bmMgaXMgY2FsbGVkLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUKKyAqIGNvbnZlcnNpb24gaXMgY29tcGxldGUgYmVmb3JlIGZzeW5jIHJldHVybnMuCisgKiBUaGUgaW5vZGUga2VlcHMgdHJhY2sgb2YgYSBsaXN0IG9mIGNvbXBsZXRlZCBBSU8gZnJvbSBESU8gcGF0aAorICogdGhhdCBtaWdodCBuZWVkcyB0byBkbyB0aGUgY29udmVyc2lvbi4gVGhpcyBmdW5jdGlvbiB3YWxrcyB0aHJvdWdoCisgKiB0aGUgbGlzdCBhbmQgY29udmVydCB0aGUgcmVsYXRlZCB1bndyaXR0ZW4gZXh0ZW50cyB0byB3cml0dGVuLgorICovCitpbnQgZmx1c2hfYWlvX2Rpb19jb21wbGV0ZWRfSU8oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlleHQ0X2lvX2VuZF90ICppbzsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0MiA9IDA7CisKKwlpZiAobGlzdF9lbXB0eSgmRVhUNF9JKGlub2RlKS0+aV9haW9fZGlvX2NvbXBsZXRlX2xpc3QpKQorCQlyZXR1cm4gcmV0OworCisJZHVtcF9haW9fZGlvX2xpc3QoaW5vZGUpOworCXdoaWxlICghbGlzdF9lbXB0eSgmRVhUNF9JKGlub2RlKS0+aV9haW9fZGlvX2NvbXBsZXRlX2xpc3QpKXsKKwkJaW8gPSBsaXN0X2VudHJ5KEVYVDRfSShpbm9kZSktPmlfYWlvX2Rpb19jb21wbGV0ZV9saXN0Lm5leHQsCisJCQkJZXh0NF9pb19lbmRfdCwgbGlzdCk7CisJCS8qCisJCSAqIENhbGxpbmcgZXh0NF9lbmRfYWlvX2Rpb19ub2xvY2soKSB0byBjb252ZXJ0IGNvbXBsZXRlZAorCQkgKiBJTyB0byB3cml0dGVuLgorCQkgKgorCQkgKiBXaGVuIGV4dDRfc3luY19maWxlKCkgaXMgY2FsbGVkLCBydW5fcXVldWUoKSBtYXkgYWxyZWFkeQorCQkgKiBhYm91dCB0byBmbHVzaCB0aGUgd29yayBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaW8gc3RydWN0dXJlLgorCQkgKiBJdCB3aWxsIGJlIHVwc2V0IGlmIGl0IGZvdW5kcyB0aGUgaW8gc3RydWN0dXJlIHJlbGF0ZWQKKwkJICogdG8gdGhlIHdvcmstdG8tYmUgc2NoZWR1bGUgaXMgZnJlZWQuCisJCSAqCisJCSAqIFRodXMgd2UgbmVlZCB0byBrZWVwIHRoZSBpbyBzdHJ1Y3R1cmUgc3RpbGwgdmFsaWQgaGVyZSBhZnRlcgorCQkgKiBjb252ZXJ0aW9uIGZpbmlzaGVkLiBUaGUgaW8gc3RydWN0dXJlIGhhcyBhIGZsYWcgdG8KKwkJICogYXZvaWQgZG91YmxlIGNvbnZlcnRpbmcgZnJvbSBib3RoIGZzeW5jIGFuZCBiYWNrZ3JvdW5kIHdvcmsKKwkJICogcXVldWUgd29yay4KKwkJICovCisJCXJldCA9IGV4dDRfZW5kX2Fpb19kaW9fbm9sb2NrKGlvKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXQyID0gcmV0OworCQllbHNlCisJCQlsaXN0X2RlbF9pbml0KCZpby0+bGlzdCk7CisJfQorCXJldHVybiAocmV0MiA8IDApID8gcmV0MiA6IDA7Cit9CisKK3N0YXRpYyBleHQ0X2lvX2VuZF90ICpleHQ0X2luaXRfaW9fZW5kIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWV4dDRfaW9fZW5kX3QgKmlvID0gTlVMTDsKKworCWlvID0ga21hbGxvYyhzaXplb2YoKmlvKSwgR0ZQX05PRlMpOworCisJaWYgKGlvKSB7CisJCWlncmFiKGlub2RlKTsKKwkJaW8tPmlub2RlID0gaW5vZGU7CisJCWlvLT5mbGFnID0gMDsKKwkJaW8tPm9mZnNldCA9IDA7CisJCWlvLT5zaXplID0gMDsKKwkJaW8tPmVycm9yID0gMDsKKwkJSU5JVF9XT1JLKCZpby0+d29yaywgZXh0NF9lbmRfYWlvX2Rpb193b3JrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmlvLT5saXN0KTsKKwl9CisKKwlyZXR1cm4gaW87Cit9CisKK3N0YXRpYyB2b2lkIGV4dDRfZW5kX2lvX2RpbyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvZmZfdCBvZmZzZXQsCisJCQkgICAgc3NpemVfdCBzaXplLCB2b2lkICpwcml2YXRlKQoreworICAgICAgICBleHQ0X2lvX2VuZF90ICppb19lbmQgPSBpb2NiLT5wcml2YXRlOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKworCWV4dF9kZWJ1ZygiZXh0NF9lbmRfaW9fZGlvKCk6IGlvX2VuZCAweCVwIgorCQkgICJmb3IgaW5vZGUgJWx1LCBpb2NiIDB4JXAsIG9mZnNldCAlbGx1LCBzaXplICVsbHVcbiIsCisgCQkgIGlvY2ItPnByaXZhdGUsIGlvX2VuZC0+aW5vZGUtPmlfaW5vLCBpb2NiLCBvZmZzZXQsCisJCSAgc2l6ZSk7CisJLyogaWYgbm90IGFzeW5jIGRpcmVjdCBJTyBvciBkaW8gd2l0aCAwIGJ5dGVzIHdyaXRlLCBqdXN0IHJldHVybiAqLworCWlmICghaW9fZW5kIHx8ICFzaXplKQorCQlyZXR1cm47CisKKwkvKiBpZiBub3QgYWlvIGRpbyB3aXRoIHVud3JpdHRlbiBleHRlbnRzLCBqdXN0IGZyZWUgaW8gYW5kIHJldHVybiAqLworCWlmIChpb19lbmQtPmZsYWcgIT0gRElPX0FJT19VTldSSVRURU4peworCQlleHQ0X2ZyZWVfaW9fZW5kKGlvX2VuZCk7CisJCWlvY2ItPnByaXZhdGUgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJaW9fZW5kLT5vZmZzZXQgPSBvZmZzZXQ7CisJaW9fZW5kLT5zaXplID0gc2l6ZTsKKwl3cSA9IEVYVDRfU0IoaW9fZW5kLT5pbm9kZS0+aV9zYiktPmRpb191bndyaXR0ZW5fd3E7CisKKwkvKiBxdWV1ZSB0aGUgd29yayB0byBjb252ZXJ0IHVud3JpdHRlbiBleHRlbnRzIHRvIHdyaXR0ZW4gKi8KKwlxdWV1ZV93b3JrKHdxLCAmaW9fZW5kLT53b3JrKTsKKworCS8qIEFkZCB0aGUgaW9fZW5kIHRvIHBlci1pbm9kZSBjb21wbGV0ZWQgYWlvIGRpbyBsaXN0Ki8KKwlsaXN0X2FkZF90YWlsKCZpb19lbmQtPmxpc3QsCisJCSAmRVhUNF9JKGlvX2VuZC0+aW5vZGUpLT5pX2Fpb19kaW9fY29tcGxldGVfbGlzdCk7CisJaW9jYi0+cHJpdmF0ZSA9IE5VTEw7Cit9CisvKgorICogRm9yIGV4dDQgZXh0ZW50IGZpbGVzLCBleHQ0IHdpbGwgZG8gZGlyZWN0LWlvIHdyaXRlIHRvIGhvbGVzLAorICogcHJlYWxsb2NhdGVkIGV4dGVudHMsIGFuZCB0aG9zZSB3cml0ZSBleHRlbmQgdGhlIGZpbGUsIG5vIG5lZWQgdG8KKyAqIGZhbGwgYmFjayB0byBidWZmZXJlZCBJTy4KKyAqCisgKiBGb3IgaG9sZXMsIHdlIGZhbGxvY2F0ZSB0aG9zZSBibG9ja3MsIG1hcmsgdGhlbSBhcyB1bmludGlhbGl6ZWQKKyAqIElmIHRob3NlIGJsb2NrcyB3ZXJlIHByZWFsbG9jYXRlZCwgd2UgbWFyayBzdXJlIHRoZXkgYXJlIHNwbGl0ZWQsIGJ1dAorICogc3RpbGwga2VlcCB0aGUgcmFuZ2UgdG8gd3JpdGUgYXMgdW5pbnRpYWxpemVkLgorICoKKyAqIFRoZSB1bndycml0dGVuIGV4dGVudHMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gd3JpdHRlbiB3aGVuIERJTyBpcyBjb21wbGV0ZWQuCisgKiBGb3IgYXN5bmMgZGlyZWN0IElPLCBzaW5jZSB0aGUgSU8gbWF5IHN0aWxsIHBlbmRpbmcgd2hlbiByZXR1cm4sIHdlCisgKiBzZXQgdXAgYW4gZW5kX2lvIGNhbGwgYmFjayBmdW5jdGlvbiwgd2hpY2ggd2lsbCBkbyB0aGUgY29udmVydGlvbgorICogd2hlbiBhc3luYyBkaXJlY3QgSU8gY29tcGxldGVkLgorICoKKyAqIElmIHRoZSBPX0RJUkVDVCB3cml0ZSB3aWxsIGV4dGVuZCB0aGUgZmlsZSB0aGVuIGFkZCB0aGlzIGlub2RlIHRvIHRoZQorICogb3JwaGFuIGxpc3QuICBTbyByZWNvdmVyeSB3aWxsIHRydW5jYXRlIGl0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNpemUKKyAqIGlmIHRoZSBtYWNoaW5lIGNyYXNoZXMgZHVyaW5nIHRoZSB3cml0ZS4KKyAqCisgKi8KK3N0YXRpYyBzc2l6ZV90IGV4dDRfZXh0X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXNzaXplX3QgcmV0OworCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKworCWxvZmZfdCBmaW5hbF9zaXplID0gb2Zmc2V0ICsgY291bnQ7CisJaWYgKHJ3ID09IFdSSVRFICYmIGZpbmFsX3NpemUgPD0gaW5vZGUtPmlfc2l6ZSkgeworCQkvKgorIAkJICogV2UgY291bGQgZGlyZWN0IHdyaXRlIHRvIGhvbGVzIGFuZCBmYWxsb2NhdGUuCisJCSAqCisgCQkgKiBBbGxvY2F0ZWQgYmxvY2tzIHRvIGZpbGwgdGhlIGhvbGUgYXJlIG1hcmtlZCBhcyB1bmluaXRpYWxpemVkCisgCQkgKiB0byBwcmV2ZW50IHBhcmFsZWwgYnVmZmVyZWQgcmVhZCB0byBleHBvc2UgdGhlIHN0YWxlIGRhdGEKKyAJCSAqIGJlZm9yZSBESU8gY29tcGxldGUgdGhlIGRhdGEgSU8uCisJCSAqCisgCQkgKiBBcyB0byBwcmV2aW91c2x5IGZhbGxvY2F0ZWQgZXh0ZW50cywgZXh0NCBnZXRfYmxvY2sKKyAJCSAqIHdpbGwganVzdCBzaW1wbHkgbWFyayB0aGUgYnVmZmVyIG1hcHBlZCBidXQgc3RpbGwKKyAJCSAqIGtlZXAgdGhlIGV4dGVudHMgdW5pbml0aWFsaXplZC4KKyAJCSAqCisJCSAqIGZvciBub24gQUlPIGNhc2UsIHdlIHdpbGwgY29udmVydCB0aG9zZSB1bndyaXR0ZW4gZXh0ZW50cworCQkgKiB0byB3cml0dGVuIGFmdGVyIHJldHVybiBiYWNrIGZyb20gYmxvY2tkZXZfZGlyZWN0X0lPLgorCQkgKgorCQkgKiBmb3IgYXN5bmMgRElPLCB0aGUgY29udmVyc2lvbiBuZWVkcyB0byBiZSBkZWZlcmVkIHdoZW4KKwkJICogdGhlIElPIGlzIGNvbXBsZXRlZC4gVGhlIGV4dDQgZW5kX2lvIGNhbGxiYWNrIGZ1bmN0aW9uCisJCSAqIHdpbGwgYmUgY2FsbGVkIHRvIHRha2UgY2FyZSBvZiB0aGUgY29udmVyc2lvbiB3b3JrLgorCQkgKiBIZXJlIGZvciBhc3luYyBjYXNlLCB3ZSBhbGxvY2F0ZSBhbiBpb19lbmQgc3RydWN0dXJlIHRvCisJCSAqIGhvb2sgdG8gdGhlIGlvY2IuCisgCQkgKi8KKwkJaW9jYi0+cHJpdmF0ZSA9IE5VTEw7CisJCUVYVDRfSShpbm9kZSktPmN1cl9haW9fZGlvID0gTlVMTDsKKwkJaWYgKCFpc19zeW5jX2tpb2NiKGlvY2IpKSB7CisJCQlpb2NiLT5wcml2YXRlID0gZXh0NF9pbml0X2lvX2VuZChpbm9kZSk7CisJCQlpZiAoIWlvY2ItPnByaXZhdGUpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkvKgorCQkJICogd2Ugc2F2ZSB0aGUgaW8gc3RydWN0dXJlIGZvciBjdXJyZW50IGFzeW5jCisJCQkgKiBkaXJlY3QgSU8sIHNvIHRoYXQgbGF0ZXIgZXh0NF9nZXRfYmxvY2tzKCkKKwkJCSAqIGNvdWxkIGZsYWcgdGhlIGlvIHN0cnVjdHVyZSB3aGV0aGVyIHRoZXJlCisJCQkgKiBpcyBhIHVud3JpdHRlbiBleHRlbnRzIG5lZWRzIHRvIGJlIGNvbnZlcnRlZAorCQkJICogd2hlbiBJTyBpcyBjb21wbGV0ZWQuCisJCQkgKi8KKwkJCUVYVDRfSShpbm9kZSktPmN1cl9haW9fZGlvID0gaW9jYi0+cHJpdmF0ZTsKKwkJfQorCisJCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsCisJCQkJCSBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJCSBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJCSBleHQ0X2dldF9ibG9ja19kaW9fd3JpdGUsCisJCQkJCSBleHQ0X2VuZF9pb19kaW8pOworCQlpZiAoaW9jYi0+cHJpdmF0ZSkKKwkJCUVYVDRfSShpbm9kZSktPmN1cl9haW9fZGlvID0gTlVMTDsKKwkJLyoKKwkJICogVGhlIGlvX2VuZCBzdHJ1Y3R1cmUgdGFrZXMgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlLAorCQkgKiB0aGF0IHN0cnVjdHVyZSBuZWVkcyB0byBiZSBkZXN0cm95ZWQgYW5kIHRoZQorCQkgKiByZWZlcmVuY2UgdG8gdGhlIGlub2RlIG5lZWQgdG8gYmUgZHJvcHBlZCwgd2hlbiBJTyBpcworCQkgKiBjb21wbGV0ZSwgZXZlbiB3aXRoIDAgYnl0ZSB3cml0ZSwgb3IgZmFpbGVkLgorCQkgKgorCQkgKiBJbiB0aGUgc3VjY2Vzc2Z1bCBBSU8gRElPIGNhc2UsIHRoZSBpb19lbmQgc3RydWN0dXJlIHdpbGwgYmUKKwkJICogZGVzY3Ryb3llZCBhbmQgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgd2lsbCBiZSBkcm9wcGVkCisJCSAqIGFmdGVyIHRoZSBlbmRfaW8gY2FsbCBiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKwkJICoKKwkJICogSW4gdGhlIGNhc2UgdGhlcmUgaXMgMCBieXRlIHdyaXRlLCBvciBlcnJvciBjYXNlLCBzaW5jZQorCQkgKiBWRlMgZGlyZWN0IElPIHdvbid0IGludm9rZSB0aGUgZW5kX2lvIGNhbGwgYmFjayBmdW5jdGlvbiwKKwkJICogd2UgbmVlZCB0byBmcmVlIHRoZSBlbmRfaW8gc3RydWN0dXJlIGhlcmUuCisJCSAqLworCQlpZiAocmV0ICE9IC1FSU9DQlFVRVVFRCAmJiByZXQgPD0gMCAmJiBpb2NiLT5wcml2YXRlKSB7CisJCQlleHQ0X2ZyZWVfaW9fZW5kKGlvY2ItPnByaXZhdGUpOworCQkJaW9jYi0+cHJpdmF0ZSA9IE5VTEw7CisJCX0gZWxzZSBpZiAocmV0ID4gMCkKKwkJCS8qCisJCQkgKiBmb3Igbm9uIEFJTyBjYXNlLCBzaW5jZSB0aGUgSU8gaXMgYWxyZWFkeQorCQkJICogY29tcGxldGVkLCB3ZSBjb3VsZCBkbyB0aGUgY29udmVydGlvbiByaWdodCBoZXJlCisJCQkgKi8KKwkJCXJldCA9IGV4dDRfY29udmVydF91bndyaXR0ZW5fZXh0ZW50cyhpbm9kZSwKKwkJCQkJCQkJb2Zmc2V0LCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGZvciB3cml0ZSB0aGUgdGhlIGVuZCBvZiBmaWxlIGNhc2UsIHdlIGZhbGwgYmFjayB0byBvbGQgd2F5ICovCisJcmV0dXJuIGV4dDRfaW5kX2RpcmVjdF9JTyhydywgaW9jYiwgaW92LCBvZmZzZXQsIG5yX3NlZ3MpOworfQorCitzdGF0aWMgc3NpemVfdCBleHQ0X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCisJaWYgKEVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpCisJCXJldHVybiBleHQ0X2V4dF9kaXJlY3RfSU8ocncsIGlvY2IsIGlvdiwgb2Zmc2V0LCBucl9zZWdzKTsKKworCXJldHVybiBleHQ0X2luZF9kaXJlY3RfSU8ocncsIGlvY2IsIGlvdiwgb2Zmc2V0LCBucl9zZWdzKTsKK30KKwogLyoKICAqIFBhZ2VzIGNhbiBiZSBtYXJrZWQgZGlydHkgY29tcGxldGVseSBhc3luY2hyb25vdXNseSBmcm9tIGV4dDQncyBqb3VybmFsbGluZwogICogYWN0aXZpdHkuICBCeSBmaWxlbWFwX3N5bmNfcHRlKCksIHRyeV90b191bm1hcF9vbmUoKSwgZXRjLiAgV2UgY2Fubm90IGRvCkBAIC0zMzg2LDYgKzM4MzAsNyBAQAogCS5kaXJlY3RfSU8JCT0gZXh0NF9kaXJlY3RfSU8sCiAJLm1pZ3JhdGVwYWdlCQk9IGJ1ZmZlcl9taWdyYXRlX3BhZ2UsCiAJLmlzX3BhcnRpYWxseV91cHRvZGF0ZSAgPSBibG9ja19pc19wYXJ0aWFsbHlfdXB0b2RhdGUsCisJLmVycm9yX3JlbW92ZV9wYWdlCT0gZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGV4dDRfd3JpdGViYWNrX2FvcHMgPSB7CkBAIC0zNDAxLDYgKzM4NDYsNyBAQAogCS5kaXJlY3RfSU8JCT0gZXh0NF9kaXJlY3RfSU8sCiAJLm1pZ3JhdGVwYWdlCQk9IGJ1ZmZlcl9taWdyYXRlX3BhZ2UsCiAJLmlzX3BhcnRpYWxseV91cHRvZGF0ZSAgPSBibG9ja19pc19wYXJ0aWFsbHlfdXB0b2RhdGUsCisJLmVycm9yX3JlbW92ZV9wYWdlCT0gZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGV4dDRfam91cm5hbGxlZF9hb3BzID0gewpAQCAtMzQxNSw2ICszODYxLDcgQEAKIAkuaW52YWxpZGF0ZXBhZ2UJCT0gZXh0NF9pbnZhbGlkYXRlcGFnZSwKIAkucmVsZWFzZXBhZ2UJCT0gZXh0NF9yZWxlYXNlcGFnZSwKIAkuaXNfcGFydGlhbGx5X3VwdG9kYXRlICA9IGJsb2NrX2lzX3BhcnRpYWxseV91cHRvZGF0ZSwKKwkuZXJyb3JfcmVtb3ZlX3BhZ2UJPSBnZW5lcmljX2Vycm9yX3JlbW92ZV9wYWdlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0NF9kYV9hb3BzID0gewpAQCAtMzQzMSw2ICszODc4LDcgQEAKIAkuZGlyZWN0X0lPCQk9IGV4dDRfZGlyZWN0X0lPLAogCS5taWdyYXRlcGFnZQkJPSBidWZmZXJfbWlncmF0ZV9wYWdlLAogCS5pc19wYXJ0aWFsbHlfdXB0b2RhdGUgID0gYmxvY2tfaXNfcGFydGlhbGx5X3VwdG9kYXRlLAorCS5lcnJvcl9yZW1vdmVfcGFnZQk9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwogCiB2b2lkIGV4dDRfc2V0X2FvcHMoc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTQ1NDcsOCArNDk5NSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZXh0NF9kb191cGRhdGVfaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCXN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsCi0JCQkJaW50IGRvX3N5bmMpCisJCQkJc3RydWN0IGV4dDRfaWxvYyAqaWxvYykKIHsKIAlzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoaWxvYyk7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwpAQCAtNDY0OSwyMiArNTA5NiwxMCBAQAogCQlyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUgPSBjcHVfdG9fbGUxNihlaS0+aV9leHRyYV9pc2l6ZSk7CiAJfQogCi0JLyoKLQkgKiBJZiB3ZSdyZSBub3QgdXNpbmcgYSBqb3VybmFsIGFuZCB3ZSB3ZXJlIGNhbGxlZCBmcm9tCi0JICogZXh0NF93cml0ZV9pbm9kZSgpIHRvIHN5bmMgdGhlIGlub2RlIChtYWtpbmcgZG9fc3luYyB0cnVlKSwKLQkgKiB3ZSBjYW4ganVzdCB1c2Ugc3luY19kaXJ0eV9idWZmZXIoKSBkaXJlY3RseSB0byBkbyBvdXIgZGlydHkKLQkgKiB3b3JrLiAgVGVzdGluZyBzX2pvdXJuYWwgaGVyZSBpcyBhIGJpdCByZWR1bmRhbnQgYnV0IGl0J3MKLQkgKiB3b3J0aCBpdCB0byBhdm9pZCBwb3RlbnRpYWwgZnV0dXJlIHRyb3VibGUuCi0JICovCi0JaWYgKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2pvdXJuYWwgPT0gTlVMTCAmJiBkb19zeW5jKSB7Ci0JCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgc3luY19kaXJ0eV9idWZmZXIiKTsKLQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwotCX0gZWxzZSB7Ci0JCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKLQkJcmMgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7Ci0JCWlmICghZXJyKQotCQkJZXJyID0gcmM7Ci0JfQorCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwlyYyA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcmM7CiAJZWktPmlfc3RhdGUgJj0gfkVYVDRfU1RBVEVfTkVXOwogCiBvdXRfYnJlbHNlOgpAQCAtNDczMiw4ICs1MTY3LDE2IEBACiAJCWVyciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gZXh0NF9kb191cGRhdGVfaW5vZGUoRVhUNF9OT0pPVVJOQUxfSEFORExFLAotCQkJCQkgICBpbm9kZSwgJmlsb2MsIHdhaXQpOworCQlpZiAod2FpdCkKKwkJCXN5bmNfZGlydHlfYnVmZmVyKGlsb2MuYmgpOworCQlpZiAoYnVmZmVyX3JlcShpbG9jLmJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGlsb2MuYmgpKSB7CisJCQlleHQ0X2Vycm9yKGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKKwkJCQkgICAiSU8gZXJyb3Igc3luY2luZyBpbm9kZSwgIgorCQkJCSAgICJpbm9kZT0lbHUsIGJsb2NrPSVsbHUiLAorCQkJCSAgIGlub2RlLT5pX2lubywKKwkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWlsb2MuYmgtPmJfYmxvY2tucik7CisJCQllcnIgPSAtRUlPOworCQl9CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC01MDI5LDcgKzU0NzIsNyBAQAogCWdldF9iaChpbG9jLT5iaCk7CiAKIAkvKiBleHQ0X2RvX3VwZGF0ZV9pbm9kZSgpIGRvZXMgamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhICovCi0JZXJyID0gZXh0NF9kb191cGRhdGVfaW5vZGUoaGFuZGxlLCBpbm9kZSwgaWxvYywgMCk7CisJZXJyID0gZXh0NF9kb191cGRhdGVfaW5vZGUoaGFuZGxlLCBpbm9kZSwgaWxvYyk7CiAJcHV0X2JoKGlsb2MtPmJoKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTE3MywyNyArNTYxNiwxNCBAQAogICovCiB2b2lkIGV4dDRfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQloYW5kbGVfdCAqY3VycmVudF9oYW5kbGUgPSBleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKIAloYW5kbGVfdCAqaGFuZGxlOwogCi0JaWYgKCFleHQ0X2hhbmRsZV92YWxpZChjdXJyZW50X2hhbmRsZSkpIHsKLQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGN1cnJlbnRfaGFuZGxlLCBpbm9kZSk7Ci0JCXJldHVybjsKLQl9Ci0KIAloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJZ290byBvdXQ7Ci0JaWYgKGN1cnJlbnRfaGFuZGxlICYmCi0JCWN1cnJlbnRfaGFuZGxlLT5oX3RyYW5zYWN0aW9uICE9IGhhbmRsZS0+aF90cmFuc2FjdGlvbikgewotCQkvKiBUaGlzIHRhc2sgaGFzIGEgdHJhbnNhY3Rpb24gb3BlbiBhZ2FpbnN0IGEgZGlmZmVyZW50IGZzICovCi0JCXByaW50ayhLRVJOX0VNRVJHICIlczogdHJhbnNhY3Rpb25zIGRvIG5vdCBtYXRjaCFcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJamJkX2RlYnVnKDUsICJtYXJraW5nIGRpcnR5LiAgb3V0ZXIgaGFuZGxlPSVwXG4iLAotCQkJCWN1cnJlbnRfaGFuZGxlKTsKLQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCX0KKworCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwogCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiBvdXQ6CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmMgYi9mcy9leHQ0L21iYWxsb2MuYwppbmRleCBlOWM2MTg5Li5iYmExMjgyIDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuYworKysgYi9mcy9leHQ0L21iYWxsb2MuYwpAQCAtMjA5NiwyMDcgKzIwOTYsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZmRlZiBFWFQ0X01CX0hJU1RPUlkKLXN0cnVjdCBleHQ0X21iX3Byb2Nfc2Vzc2lvbiB7Ci0Jc3RydWN0IGV4dDRfbWJfaGlzdG9yeSAqaGlzdG9yeTsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwotCWludCBzdGFydDsKLQlpbnQgbWF4OwotfTsKLQotc3RhdGljIHZvaWQgKmV4dDRfbWJfaGlzdG9yeV9za2lwX2VtcHR5KHN0cnVjdCBleHQ0X21iX3Byb2Nfc2Vzc2lvbiAqcywKLQkJCQkJc3RydWN0IGV4dDRfbWJfaGlzdG9yeSAqaHMsCi0JCQkJCWludCBmaXJzdCkKLXsKLQlpZiAoaHMgPT0gcy0+aGlzdG9yeSArIHMtPm1heCkKLQkJaHMgPSBzLT5oaXN0b3J5OwotCWlmICghZmlyc3QgJiYgaHMgPT0gcy0+aGlzdG9yeSArIHMtPnN0YXJ0KQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAoaHMtPm9yaWcuZmVfbGVuID09IDApIHsKLQkJaHMrKzsKLQkJaWYgKGhzID09IHMtPmhpc3RvcnkgKyBzLT5tYXgpCi0JCQlocyA9IHMtPmhpc3Rvcnk7Ci0JCWlmIChocyA9PSBzLT5oaXN0b3J5ICsgcy0+c3RhcnQpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGhzOwotfQotCi1zdGF0aWMgdm9pZCAqZXh0NF9tYl9zZXFfaGlzdG9yeV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGV4dDRfbWJfcHJvY19zZXNzaW9uICpzID0gc2VxLT5wcml2YXRlOwotCXN0cnVjdCBleHQ0X21iX2hpc3RvcnkgKmhzOwotCWludCBsID0gKnBvczsKLQotCWlmIChsID09IDApCi0JCXJldHVybiBTRVFfU1RBUlRfVE9LRU47Ci0JaHMgPSBleHQ0X21iX2hpc3Rvcnlfc2tpcF9lbXB0eShzLCBzLT5oaXN0b3J5ICsgcy0+c3RhcnQsIDEpOwotCWlmICghaHMpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgtLWwgJiYgKGhzID0gZXh0NF9tYl9oaXN0b3J5X3NraXBfZW1wdHkocywgKytocywgMCkpICE9IE5VTEwpOwotCXJldHVybiBoczsKLX0KLQotc3RhdGljIHZvaWQgKmV4dDRfbWJfc2VxX2hpc3RvcnlfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwKLQkJCQkgICAgICBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgZXh0NF9tYl9wcm9jX3Nlc3Npb24gKnMgPSBzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGV4dDRfbWJfaGlzdG9yeSAqaHMgPSB2OwotCi0JKysqcG9zOwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKLQkJcmV0dXJuIGV4dDRfbWJfaGlzdG9yeV9za2lwX2VtcHR5KHMsIHMtPmhpc3RvcnkgKyBzLT5zdGFydCwgMSk7Ci0JZWxzZQotCQlyZXR1cm4gZXh0NF9tYl9oaXN0b3J5X3NraXBfZW1wdHkocywgKytocywgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0NF9tYl9zZXFfaGlzdG9yeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCWNoYXIgYnVmWzI1XSwgYnVmMlsyNV0sIGJ1ZjNbMjVdLCAqZm10OwotCXN0cnVjdCBleHQ0X21iX2hpc3RvcnkgKmhzID0gdjsKLQotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHJpbnRmKHNlcSwgIiUtNXMgJS04cyAlLTIzcyAlLTIzcyAlLTIzcyAlLTVzICIKLQkJCQkiJS01cyAlLTJzICUtNnMgJS01cyAlLTVzICUtNnNcbiIsCi0JCQkgICJwaWQiLCAiaW5vZGUiLCAib3JpZ2luYWwiLCAiZ29hbCIsICJyZXN1bHQiLCAiZm91bmQiLAotCQkJICAgImdycHMiLCAiY3IiLCAiZmxhZ3MiLCAibWVyZ2UiLCAidGFpbCIsICJicm9rZW4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGhzLT5vcCA9PSBFWFQ0X01CX0hJU1RPUllfQUxMT0MpIHsKLQkJZm10ID0gIiUtNXUgJS04dSAlLTIzcyAlLTIzcyAlLTIzcyAlLTV1ICUtNXUgJS0ydSAiCi0JCQkiMHglMDR4ICUtNXMgJS01dSAlLTZ1XG4iOwotCQlzcHJpbnRmKGJ1ZjIsICIldS8lZC8ldUAldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCi0JCQlocy0+cmVzdWx0LmZlX3N0YXJ0LCBocy0+cmVzdWx0LmZlX2xlbiwKLQkJCWhzLT5yZXN1bHQuZmVfbG9naWNhbCk7Ci0JCXNwcmludGYoYnVmLCAiJXUvJWQvJXVAJXUiLCBocy0+b3JpZy5mZV9ncm91cCwKLQkJCWhzLT5vcmlnLmZlX3N0YXJ0LCBocy0+b3JpZy5mZV9sZW4sCi0JCQlocy0+b3JpZy5mZV9sb2dpY2FsKTsKLQkJc3ByaW50ZihidWYzLCAiJXUvJWQvJXVAJXUiLCBocy0+Z29hbC5mZV9ncm91cCwKLQkJCWhzLT5nb2FsLmZlX3N0YXJ0LCBocy0+Z29hbC5mZV9sZW4sCi0JCQlocy0+Z29hbC5mZV9sb2dpY2FsKTsKLQkJc2VxX3ByaW50ZihzZXEsIGZtdCwgaHMtPnBpZCwgaHMtPmlubywgYnVmLCBidWYzLCBidWYyLAotCQkJCWhzLT5mb3VuZCwgaHMtPmdyb3VwcywgaHMtPmNyLCBocy0+ZmxhZ3MsCi0JCQkJaHMtPm1lcmdlZCA/ICJNIiA6ICIiLCBocy0+dGFpbCwKLQkJCQlocy0+YnVkZHkgPyAxIDw8IGhzLT5idWRkeSA6IDApOwotCX0gZWxzZSBpZiAoaHMtPm9wID09IEVYVDRfTUJfSElTVE9SWV9QUkVBTExPQykgewotCQlmbXQgPSAiJS01dSAlLTh1ICUtMjNzICUtMjNzICUtMjNzXG4iOwotCQlzcHJpbnRmKGJ1ZjIsICIldS8lZC8ldUAldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCi0JCQlocy0+cmVzdWx0LmZlX3N0YXJ0LCBocy0+cmVzdWx0LmZlX2xlbiwKLQkJCWhzLT5yZXN1bHQuZmVfbG9naWNhbCk7Ci0JCXNwcmludGYoYnVmLCAiJXUvJWQvJXVAJXUiLCBocy0+b3JpZy5mZV9ncm91cCwKLQkJCWhzLT5vcmlnLmZlX3N0YXJ0LCBocy0+b3JpZy5mZV9sZW4sCi0JCQlocy0+b3JpZy5mZV9sb2dpY2FsKTsKLQkJc2VxX3ByaW50ZihzZXEsIGZtdCwgaHMtPnBpZCwgaHMtPmlubywgYnVmLCAiIiwgYnVmMik7Ci0JfSBlbHNlIGlmIChocy0+b3AgPT0gRVhUNF9NQl9ISVNUT1JZX0RJU0NBUkQpIHsKLQkJc3ByaW50ZihidWYyLCAiJXUvJWQvJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAotCQkJaHMtPnJlc3VsdC5mZV9zdGFydCwgaHMtPnJlc3VsdC5mZV9sZW4pOwotCQlzZXFfcHJpbnRmKHNlcSwgIiUtNXUgJS04dSAlLTIzcyBkaXNjYXJkXG4iLAotCQkJCWhzLT5waWQsIGhzLT5pbm8sIGJ1ZjIpOwotCX0gZWxzZSBpZiAoaHMtPm9wID09IEVYVDRfTUJfSElTVE9SWV9GUkVFKSB7Ci0JCXNwcmludGYoYnVmMiwgIiV1LyVkLyV1IiwgaHMtPnJlc3VsdC5mZV9ncm91cCwKLQkJCWhzLT5yZXN1bHQuZmVfc3RhcnQsIGhzLT5yZXN1bHQuZmVfbGVuKTsKLQkJc2VxX3ByaW50ZihzZXEsICIlLTV1ICUtOHUgJS0yM3MgZnJlZVxuIiwKLQkJCQlocy0+cGlkLCBocy0+aW5vLCBidWYyKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4dDRfbWJfc2VxX2hpc3Rvcnlfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKLXsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBleHQ0X21iX3NlcV9oaXN0b3J5X29wcyA9IHsKLQkuc3RhcnQgID0gZXh0NF9tYl9zZXFfaGlzdG9yeV9zdGFydCwKLQkubmV4dCAgID0gZXh0NF9tYl9zZXFfaGlzdG9yeV9uZXh0LAotCS5zdG9wICAgPSBleHQ0X21iX3NlcV9oaXN0b3J5X3N0b3AsCi0JLnNob3cgICA9IGV4dDRfbWJfc2VxX2hpc3Rvcnlfc2hvdywKLX07Ci0KLXN0YXRpYyBpbnQgZXh0NF9tYl9zZXFfaGlzdG9yeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBQREUoaW5vZGUpLT5kYXRhOwotCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwotCXN0cnVjdCBleHQ0X21iX3Byb2Nfc2Vzc2lvbiAqczsKLQlpbnQgcmM7Ci0JaW50IHNpemU7Ci0KLQlpZiAodW5saWtlbHkoc2JpLT5zX21iX2hpc3RvcnkgPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOwotCWlmIChzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCXMtPnNiID0gc2I7Ci0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXh0NF9tYl9oaXN0b3J5KSAqIHNiaS0+c19tYl9oaXN0b3J5X21heDsKLQlzLT5oaXN0b3J5ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAocy0+aGlzdG9yeSA9PSBOVUxMKSB7Ci0JCWtmcmVlKHMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzcGluX2xvY2soJnNiaS0+c19tYl9oaXN0b3J5X2xvY2spOwotCW1lbWNweShzLT5oaXN0b3J5LCBzYmktPnNfbWJfaGlzdG9yeSwgc2l6ZSk7Ci0Jcy0+bWF4ID0gc2JpLT5zX21iX2hpc3RvcnlfbWF4OwotCXMtPnN0YXJ0ID0gc2JpLT5zX21iX2hpc3RvcnlfY3VyICUgcy0+bWF4OwotCXNwaW5fdW5sb2NrKCZzYmktPnNfbWJfaGlzdG9yeV9sb2NrKTsKLQotCXJjID0gc2VxX29wZW4oZmlsZSwgJmV4dDRfbWJfc2VxX2hpc3Rvcnlfb3BzKTsKLQlpZiAocmMgPT0gMCkgewotCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCQltLT5wcml2YXRlID0gczsKLQl9IGVsc2UgewotCQlrZnJlZShzLT5oaXN0b3J5KTsKLQkJa2ZyZWUocyk7Ci0JfQotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgaW50IGV4dDRfbWJfc2VxX2hpc3RvcnlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGV4dDRfbWJfcHJvY19zZXNzaW9uICpzID0gc2VxLT5wcml2YXRlOwotCWtmcmVlKHMtPmhpc3RvcnkpOwotCWtmcmVlKHMpOwotCXJldHVybiBzZXFfcmVsZWFzZShpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGV4dDRfbWJfc2VxX2hpc3Rvcnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGV4dDRfbWJfcHJvY19zZXNzaW9uICpzID0gc2VxLT5wcml2YXRlOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBzLT5zYjsKLQljaGFyIHN0clszMl07Ci0JaW50IHZhbHVlOwotCi0JaWYgKGNvdW50ID49IHNpemVvZihzdHIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogJXMgc3RyaW5nIHRvbyBsb25nLCBtYXggJXUgYnl0ZXNcbiIsCi0JCQkJIm1iX2hpc3RvcnkiLCAoaW50KXNpemVvZihzdHIpKTsKLQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHN0ciwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7Ci0JaWYgKHZhbHVlIDwgMCkKLQkJcmV0dXJuIC1FUkFOR0U7Ci0JRVhUNF9TQihzYiktPnNfbWJfaGlzdG9yeV9maWx0ZXIgPSB2YWx1ZTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0NF9tYl9zZXFfaGlzdG9yeV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBleHQ0X21iX3NlcV9oaXN0b3J5X29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IGV4dDRfbWJfc2VxX2hpc3Rvcnlfd3JpdGUsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBleHQ0X21iX3NlcV9oaXN0b3J5X3JlbGVhc2UsCi19OwotCiBzdGF0aWMgdm9pZCAqZXh0NF9tYl9zZXFfZ3JvdXBzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2VxLT5wcml2YXRlOwpAQCAtMjM5Niw4MiArMjE5NSw2IEBACiAJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyB2b2lkIGV4dDRfbWJfaGlzdG9yeV9yZWxlYXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0KLQlpZiAoc2JpLT5zX3Byb2MgIT0gTlVMTCkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgibWJfZ3JvdXBzIiwgc2JpLT5zX3Byb2MpOwotCQlpZiAoc2JpLT5zX21iX2hpc3RvcnlfbWF4KQotCQkJcmVtb3ZlX3Byb2NfZW50cnkoIm1iX2hpc3RvcnkiLCBzYmktPnNfcHJvYyk7Ci0JfQotCWtmcmVlKHNiaS0+c19tYl9oaXN0b3J5KTsKLX0KLQotc3RhdGljIHZvaWQgZXh0NF9tYl9oaXN0b3J5X2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQlpbnQgaTsKLQotCWlmIChzYmktPnNfcHJvYyAhPSBOVUxMKSB7Ci0JCWlmIChzYmktPnNfbWJfaGlzdG9yeV9tYXgpCi0JCQlwcm9jX2NyZWF0ZV9kYXRhKCJtYl9oaXN0b3J5IiwgU19JUlVHTywgc2JpLT5zX3Byb2MsCi0JCQkJCSAmZXh0NF9tYl9zZXFfaGlzdG9yeV9mb3BzLCBzYik7Ci0JCXByb2NfY3JlYXRlX2RhdGEoIm1iX2dyb3VwcyIsIFNfSVJVR08sIHNiaS0+c19wcm9jLAotCQkJCSAmZXh0NF9tYl9zZXFfZ3JvdXBzX2ZvcHMsIHNiKTsKLQl9Ci0KLQlzYmktPnNfbWJfaGlzdG9yeV9jdXIgPSAwOwotCXNwaW5fbG9ja19pbml0KCZzYmktPnNfbWJfaGlzdG9yeV9sb2NrKTsKLQlpID0gc2JpLT5zX21iX2hpc3RvcnlfbWF4ICogc2l6ZW9mKHN0cnVjdCBleHQ0X21iX2hpc3RvcnkpOwotCXNiaS0+c19tYl9oaXN0b3J5ID0gaSA/IGt6YWxsb2MoaSwgR0ZQX0tFUk5FTCkgOiBOVUxMOwotCS8qIGlmIHdlIGNhbid0IGFsbG9jYXRlIGhpc3RvcnksIHRoZW4gd2Ugc2ltcGxlIHdvbid0IHVzZSBpdCAqLwotfQotCi1zdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIHZvaWQKLWV4dDRfbWJfc3RvcmVfaGlzdG9yeShzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKQotewotCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoYWMtPmFjX3NiKTsKLQlzdHJ1Y3QgZXh0NF9tYl9oaXN0b3J5IGg7Ci0KLQlpZiAoc2JpLT5zX21iX2hpc3RvcnkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKCEoYWMtPmFjX29wICYgc2JpLT5zX21iX2hpc3RvcnlfZmlsdGVyKSkKLQkJcmV0dXJuOwotCi0JaC5vcCA9IGFjLT5hY19vcDsKLQloLnBpZCA9IGN1cnJlbnQtPnBpZDsKLQloLmlubyA9IGFjLT5hY19pbm9kZSA/IGFjLT5hY19pbm9kZS0+aV9pbm8gOiAwOwotCWgub3JpZyA9IGFjLT5hY19vX2V4OwotCWgucmVzdWx0ID0gYWMtPmFjX2JfZXg7Ci0JaC5mbGFncyA9IGFjLT5hY19mbGFnczsKLQloLmZvdW5kID0gYWMtPmFjX2ZvdW5kOwotCWguZ3JvdXBzID0gYWMtPmFjX2dyb3Vwc19zY2FubmVkOwotCWguY3IgPSBhYy0+YWNfY3JpdGVyaWE7Ci0JaC50YWlsID0gYWMtPmFjX3RhaWw7Ci0JaC5idWRkeSA9IGFjLT5hY19idWRkeTsKLQloLm1lcmdlZCA9IDA7Ci0JaWYgKGFjLT5hY19vcCA9PSBFWFQ0X01CX0hJU1RPUllfQUxMT0MpIHsKLQkJaWYgKGFjLT5hY19nX2V4LmZlX3N0YXJ0ID09IGFjLT5hY19iX2V4LmZlX3N0YXJ0ICYmCi0JCQkJYWMtPmFjX2dfZXguZmVfZ3JvdXAgPT0gYWMtPmFjX2JfZXguZmVfZ3JvdXApCi0JCQloLm1lcmdlZCA9IDE7Ci0JCWguZ29hbCA9IGFjLT5hY19nX2V4OwotCQloLnJlc3VsdCA9IGFjLT5hY19mX2V4OwotCX0KLQotCXNwaW5fbG9jaygmc2JpLT5zX21iX2hpc3RvcnlfbG9jayk7Ci0JbWVtY3B5KHNiaS0+c19tYl9oaXN0b3J5ICsgc2JpLT5zX21iX2hpc3RvcnlfY3VyLCAmaCwgc2l6ZW9mKGgpKTsKLQlpZiAoKytzYmktPnNfbWJfaGlzdG9yeV9jdXIgPj0gc2JpLT5zX21iX2hpc3RvcnlfbWF4KQotCQlzYmktPnNfbWJfaGlzdG9yeV9jdXIgPSAwOwotCXNwaW5fdW5sb2NrKCZzYmktPnNfbWJfaGlzdG9yeV9sb2NrKTsKLX0KLQotI2Vsc2UKLSNkZWZpbmUgZXh0NF9tYl9oaXN0b3J5X3JlbGVhc2Uoc2IpCi0jZGVmaW5lIGV4dDRfbWJfaGlzdG9yeV9pbml0KHNiKQotI2VuZGlmCi0KIAogLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGV4dDRfZ3JvdXBfaW5mbyBkYXRhIGZvciB0aGUgZ2l2ZW4gZ3JvdXAuICovCiBpbnQgZXh0NF9tYl9hZGRfZ3JvdXBpbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZ3JvdXBfdCBncm91cCwKQEAgLTI2OTAsNyArMjQxMyw2IEBACiAJc2JpLT5zX21iX3N0YXRzID0gTUJfREVGQVVMVF9TVEFUUzsKIAlzYmktPnNfbWJfc3RyZWFtX3JlcXVlc3QgPSBNQl9ERUZBVUxUX1NUUkVBTV9USFJFU0hPTEQ7CiAJc2JpLT5zX21iX29yZGVyMl9yZXFzID0gTUJfREVGQVVMVF9PUkRFUjJfUkVRUzsKLQlzYmktPnNfbWJfaGlzdG9yeV9maWx0ZXIgPSBFWFQ0X01CX0hJU1RPUllfREVGQVVMVDsKIAlzYmktPnNfbWJfZ3JvdXBfcHJlYWxsb2MgPSBNQl9ERUZBVUxUX0dST1VQX1BSRUFMTE9DOwogCiAJc2JpLT5zX2xvY2FsaXR5X2dyb3VwcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZXh0NF9sb2NhbGl0eV9ncm91cCk7CkBAIC0yNzA4LDEyICsyNDMwLDEyIEBACiAJCXNwaW5fbG9ja19pbml0KCZsZy0+bGdfcHJlYWxsb2NfbG9jayk7CiAJfQogCi0JZXh0NF9tYl9oaXN0b3J5X2luaXQoc2IpOworCWlmIChzYmktPnNfcHJvYykKKwkJcHJvY19jcmVhdGVfZGF0YSgibWJfZ3JvdXBzIiwgU19JUlVHTywgc2JpLT5zX3Byb2MsCisJCQkJICZleHQ0X21iX3NlcV9ncm91cHNfZm9wcywgc2IpOwogCiAJaWYgKHNiaS0+c19qb3VybmFsKQogCQlzYmktPnNfam91cm5hbC0+al9jb21taXRfY2FsbGJhY2sgPSByZWxlYXNlX2Jsb2Nrc19vbl9jb21taXQ7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBtYmFsbG9jIGVuYWJsZWRcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzkwLDcgKzI1MTIsOCBAQAogCX0KIAogCWZyZWVfcGVyY3B1KHNiaS0+c19sb2NhbGl0eV9ncm91cHMpOwotCWV4dDRfbWJfaGlzdG9yeV9yZWxlYXNlKHNiKTsKKwlpZiAoc2JpLT5zX3Byb2MpCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYl9ncm91cHMiLCBzYmktPnNfcHJvYyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMyNzYsNyArMjk5OSwxMCBAQAogCQkJYXRvbWljX2luYygmc2JpLT5zX2JhbF9icmVha3MpOwogCX0KIAotCWV4dDRfbWJfc3RvcmVfaGlzdG9yeShhYyk7CisJaWYgKGFjLT5hY19vcCA9PSBFWFQ0X01CX0hJU1RPUllfQUxMT0MpCisJCXRyYWNlX2V4dDRfbWJhbGxvY19hbGxvYyhhYyk7CisJZWxzZQorCQl0cmFjZV9leHQ0X21iYWxsb2NfcHJlYWxsb2MoYWMpOwogfQogCiAvKgpAQCAtMzc3Niw3ICszNTAyLDYgQEAKIAlpZiAoYWMpIHsKIAkJYWMtPmFjX3NiID0gc2I7CiAJCWFjLT5hY19pbm9kZSA9IHBhLT5wYV9pbm9kZTsKLQkJYWMtPmFjX29wID0gRVhUNF9NQl9ISVNUT1JZX0RJU0NBUkQ7CiAJfQogCiAJd2hpbGUgKGJpdCA8IGVuZCkgewpAQCAtMzc5Niw3ICszNTIxLDcgQEAKIAkJCWFjLT5hY19iX2V4LmZlX3N0YXJ0ID0gYml0OwogCQkJYWMtPmFjX2JfZXguZmVfbGVuID0gbmV4dCAtIGJpdDsKIAkJCWFjLT5hY19iX2V4LmZlX2xvZ2ljYWwgPSAwOwotCQkJZXh0NF9tYl9zdG9yZV9oaXN0b3J5KGFjKTsKKwkJCXRyYWNlX2V4dDRfbWJhbGxvY19kaXNjYXJkKGFjKTsKIAkJfQogCiAJCXRyYWNlX2V4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYShhYywgcGEsIGdycF9ibGtfc3RhcnQgKyBiaXQsCkBAIC0zODMxLDkgKzM1NTYsNiBAQAogCWV4dDRfZ3JvdXBfdCBncm91cDsKIAlleHQ0X2dycGJsa190IGJpdDsKIAotCWlmIChhYykKLQkJYWMtPmFjX29wID0gRVhUNF9NQl9ISVNUT1JZX0RJU0NBUkQ7Ci0KIAl0cmFjZV9leHQ0X21iX3JlbGVhc2VfZ3JvdXBfcGEoYWMsIHBhKTsKIAlCVUdfT04ocGEtPnBhX2RlbGV0ZWQgPT0gMCk7CiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgcGEtPnBhX3BzdGFydCwgJmdyb3VwLCAmYml0KTsKQEAgLTM4NDgsNyArMzU3MCw3IEBACiAJCWFjLT5hY19iX2V4LmZlX3N0YXJ0ID0gYml0OwogCQlhYy0+YWNfYl9leC5mZV9sZW4gPSBwYS0+cGFfbGVuOwogCQlhYy0+YWNfYl9leC5mZV9sb2dpY2FsID0gMDsKLQkJZXh0NF9tYl9zdG9yZV9oaXN0b3J5KGFjKTsKKwkJdHJhY2VfZXh0NF9tYmFsbG9jX2Rpc2NhcmQoYWMpOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDE4OSw3ICszOTExLDYgQEAKIAlzaXplID0gYWMtPmFjX29fZXguZmVfbG9naWNhbCArIGFjLT5hY19vX2V4LmZlX2xlbjsKIAlpc2l6ZSA9IChpX3NpemVfcmVhZChhYy0+YWNfaW5vZGUpICsgYWMtPmFjX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpCiAJCT4+IGJzYml0czsKLQlzaXplID0gbWF4KHNpemUsIGlzaXplKTsKIAogCWlmICgoc2l6ZSA9PSBpc2l6ZSkgJiYKIAkgICAgIWV4dDRfZnNfaXNfYnVzeShzYmkpICYmCkBAIC00MTk5LDYgKzM5MjAsNyBAQAogCX0KIAogCS8qIGRvbid0IHVzZSBncm91cCBhbGxvY2F0aW9uIGZvciBsYXJnZSBmaWxlcyAqLworCXNpemUgPSBtYXgoc2l6ZSwgaXNpemUpOwogCWlmIChzaXplID49IHNiaS0+c19tYl9zdHJlYW1fcmVxdWVzdCkgewogCQlhYy0+YWNfZmxhZ3MgfD0gRVhUNF9NQl9TVFJFQU1fQUxMT0M7CiAJCXJldHVybjsKQEAgLTQ3MzksNyArNDQ2MSw2IEBACiAKIAlhYyA9IGttZW1fY2FjaGVfYWxsb2MoZXh0NF9hY19jYWNoZXAsIEdGUF9OT0ZTKTsKIAlpZiAoYWMpIHsKLQkJYWMtPmFjX29wID0gRVhUNF9NQl9ISVNUT1JZX0ZSRUU7CiAJCWFjLT5hY19pbm9kZSA9IGlub2RlOwogCQlhYy0+YWNfc2IgPSBzYjsKIAl9CkBAIC00ODA2LDcgKzQ1MjcsNyBAQAogCQlhYy0+YWNfYl9leC5mZV9ncm91cCA9IGJsb2NrX2dyb3VwOwogCQlhYy0+YWNfYl9leC5mZV9zdGFydCA9IGJpdDsKIAkJYWMtPmFjX2JfZXguZmVfbGVuID0gY291bnQ7Ci0JCWV4dDRfbWJfc3RvcmVfaGlzdG9yeShhYyk7CisJCXRyYWNlX2V4dDRfbWJhbGxvY19mcmVlKGFjKTsKIAl9CiAKIAllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGJsb2NrX2dyb3VwLCAmZTRiKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5oIGIvZnMvZXh0NC9tYmFsbG9jLmgKaW5kZXggMTg4ZDNkNy4uMGNhODExMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmgKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmgKQEAgLTUyLDE4ICs1Miw4IEBACiAjZGVmaW5lIG1iX2RlYnVnKG4sIGZtdCwgYS4uLikKICNlbmRpZgogCi0vKgotICogd2l0aCBFWFQ0X01CX0hJU1RPUlkgbWJhbGxvYyBzdG9yZXMgbGFzdCBOIGFsbG9jYXRpb25zIGluIG1lbW9yeQotICogYW5kIHlvdSBjYW4gbW9uaXRvciBpdCBpbiAvcHJvYy9mcy9leHQ0LzxkZXY+L21iX2hpc3RvcnkKLSAqLwotI2RlZmluZSBFWFQ0X01CX0hJU1RPUlkKICNkZWZpbmUgRVhUNF9NQl9ISVNUT1JZX0FMTE9DCQkxCS8qIGFsbG9jYXRpb24gKi8KICNkZWZpbmUgRVhUNF9NQl9ISVNUT1JZX1BSRUFMTE9DCTIJLyogcHJlYWxsb2NhdGVkIGJsb2NrcyB1c2VkICovCi0jZGVmaW5lIEVYVDRfTUJfSElTVE9SWV9ESVNDQVJECQk0CS8qIHByZWFsbG9jYXRpb24gZGlzY2FyZGVkICovCi0jZGVmaW5lIEVYVDRfTUJfSElTVE9SWV9GUkVFCQk4CS8qIGZyZWUgKi8KLQotI2RlZmluZSBFWFQ0X01CX0hJU1RPUllfREVGQVVMVAkJKEVYVDRfTUJfSElTVE9SWV9BTExPQyB8IFwKLQkJCQkJIEVYVDRfTUJfSElTVE9SWV9QUkVBTExPQykKIAogLyoKICAqIEhvdyBsb25nIG1iYWxsb2MgY2FuIGxvb2sgZm9yIGEgYmVzdCBleHRlbnQgKGluIGZvdW5kIGV4dGVudHMpCkBAIC04NCw3ICs3NCw3IEBACiAgKiB3aXRoICdleHQ0X21iX3N0YXRzJyBhbGxvY2F0b3Igd2lsbCBjb2xsZWN0IHN0YXRzIHRoYXQgd2lsbCBiZQogICogc2hvd24gYXQgdW1vdW50LiBUaGUgY29sbGVjdGluZyBjb3N0cyB0aG91Z2ghCiAgKi8KLSNkZWZpbmUgTUJfREVGQVVMVF9TVEFUUwkJMQorI2RlZmluZSBNQl9ERUZBVUxUX1NUQVRTCQkwCiAKIC8qCiAgKiBmaWxlcyBzbWFsbGVyIHRoYW4gTUJfREVGQVVMVF9TVFJFQU1fVEhSRVNIT0xEIGFyZSBzZXJ2ZWQKQEAgLTIxNywyMiArMjA3LDYgQEAKICNkZWZpbmUgQUNfU1RBVFVTX0ZPVU5ECQkyCiAjZGVmaW5lIEFDX1NUQVRVU19CUkVBSwkJMwogCi1zdHJ1Y3QgZXh0NF9tYl9oaXN0b3J5IHsKLQlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCBvcmlnOwkvKiBvcmlnIGFsbG9jYXRpb24gKi8KLQlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCBnb2FsOwkvKiBnb2FsIGFsbG9jYXRpb24gKi8KLQlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCByZXN1bHQ7CS8qIHJlc3VsdCBhbGxvY2F0aW9uICovCi0JdW5zaWduZWQgcGlkOwotCXVuc2lnbmVkIGlubzsKLQlfX3UxNiBmb3VuZDsJLyogaG93IG1hbnkgZXh0ZW50cyBoYXZlIGJlZW4gZm91bmQgKi8KLQlfX3UxNiBncm91cHM7CS8qIGhvdyBtYW55IGdyb3VwcyBoYXZlIGJlZW4gc2Nhbm5lZCAqLwotCV9fdTE2IHRhaWw7CS8qIHdoYXQgdGFpbCBicm9rZSBzb21lIGJ1ZGR5ICovCi0JX191MTYgYnVkZHk7CS8qIGJ1ZGR5IHRoZSB0YWlsIF5eXiBicm9rZSAqLwotCV9fdTE2IGZsYWdzOwotCV9fdTggY3I6MzsJLyogd2hpY2ggcGhhc2UgdGhlIHJlc3VsdCBleHRlbnQgd2FzIGZvdW5kIGF0ICovCi0JX191OCBvcDo0OwotCV9fdTggbWVyZ2VkOjE7Ci19OwotCiBzdHJ1Y3QgZXh0NF9idWRkeSB7CiAJc3RydWN0IHBhZ2UgKmJkX2J1ZGR5X3BhZ2U7CiAJdm9pZCAqYmRfYnVkZHk7CkBAIC0yNDcsMTMgKzIyMSw2IEBACiAjZGVmaW5lIEVYVDRfTUJfQklUTUFQKGU0YikJKChlNGIpLT5iZF9iaXRtYXApCiAjZGVmaW5lIEVYVDRfTUJfQlVERFkoZTRiKQkoKGU0YiktPmJkX2J1ZGR5KQogCi0jaWZuZGVmIEVYVDRfTUJfSElTVE9SWQotc3RhdGljIGlubGluZSB2b2lkIGV4dDRfbWJfc3RvcmVfaGlzdG9yeShzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKQotewotCXJldHVybjsKLX0KLSNlbmRpZgotCiAjZGVmaW5lIGluX3JhbmdlKGIsIGZpcnN0LCBsZW4pCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPD0gKGZpcnN0KSArIChsZW4pIC0gMSkKIAogc3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9ncnBfb2Zmc190b19ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuYwppbmRleCBiZjUxOWYyLi5hOTNkNWI4IDEwMDY0NAotLS0gYS9mcy9leHQ0L21pZ3JhdGUuYworKysgYi9mcy9leHQ0L21pZ3JhdGUuYwpAQCAtNzUsNyArNzUsNyBAQAogCQkJCWdvdG8gZXJyX291dDsKIAkJfQogCX0KLQlyZXR2YWwgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZuZXdleHQpOworCXJldHZhbCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgJm5ld2V4dCwgMCk7CiBlcnJfb3V0OgogCWlmIChwYXRoKSB7CiAJCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbW92ZV9leHRlbnQuYyBiL2ZzL2V4dDQvbW92ZV9leHRlbnQuYwppbmRleCBjMDdhMjkxLi4yNWI2YjE0IDEwMDY0NAotLS0gYS9mcy9leHQ0L21vdmVfZXh0ZW50LmMKKysrIGIvZnMvZXh0NC9tb3ZlX2V4dGVudC5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAkJCWdvdG8gb3V0OwogCiAJCWlmIChleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgb3JpZ19pbm9kZSwKLQkJCQkJb3JpZ19wYXRoLCBuZXdfZXh0KSkKKwkJCQkJb3JpZ19wYXRoLCBuZXdfZXh0LCAwKSkKIAkJCWdvdG8gb3V0OwogCX0KIApAQCAtMzMzLDcgKzMzMyw3IEBACiAJCQlnb3RvIG91dDsKIAogCQlpZiAoZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIG9yaWdfaW5vZGUsCi0JCQkJCSAgIG9yaWdfcGF0aCwgZW5kX2V4dCkpCisJCQkJCSAgIG9yaWdfcGF0aCwgZW5kX2V4dCwgMCkpCiAJCQlnb3RvIG91dDsKIAl9CiBvdXQ6CkBAIC0xMDAxLDE0ICsxMDAxLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogb3JpZyBhbmQgZG9ub3Igc2hvdWxkIGJlIGRpZmZlcmVudCBmaWxlICovCi0JaWYgKG9yaWdfaW5vZGUtPmlfaW5vID09IGRvbm9yX2lub2RlLT5pX2lubykgewotCQlleHQ0X2RlYnVnKCJleHQ0IG1vdmUgZXh0ZW50OiBUaGUgYXJndW1lbnQgZmlsZXMgc2hvdWxkIG5vdCAiCi0JCQkiYmUgc2FtZSBmaWxlIFtpbm86b3JpZyAlbHUsIGRvbm9yICVsdV1cbiIsCi0JCQlvcmlnX2lub2RlLT5pX2lubywgZG9ub3JfaW5vZGUtPmlfaW5vKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJLyogRXh0NCBtb3ZlIGV4dGVudCBzdXBwb3J0cyBvbmx5IGV4dGVudCBiYXNlZCBmaWxlICovCiAJaWYgKCEoRVhUNF9JKG9yaWdfaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9FWFRFTlRTX0ZMKSkgewogCQlleHQ0X2RlYnVnKCJleHQ0IG1vdmUgZXh0ZW50OiBvcmlnIGZpbGUgaXMgbm90IGV4dGVudHMgIgpAQCAtMTIzMiw2ICsxMjI0LDE0IEBACiAJaW50IGJsb2NrX2xlbl9pbl9wYWdlOwogCWludCB1bmluaXQ7CiAKKwkvKiBvcmlnIGFuZCBkb25vciBzaG91bGQgYmUgZGlmZmVyZW50IGZpbGUgKi8KKwlpZiAob3JpZ19pbm9kZS0+aV9pbm8gPT0gZG9ub3JfaW5vZGUtPmlfaW5vKSB7CisJCWV4dDRfZGVidWcoImV4dDQgbW92ZSBleHRlbnQ6IFRoZSBhcmd1bWVudCBmaWxlcyBzaG91bGQgbm90ICIKKwkJCSJiZSBzYW1lIGZpbGUgW2lubzpvcmlnICVsdSwgZG9ub3IgJWx1XVxuIiwKKwkJCW9yaWdfaW5vZGUtPmlfaW5vLCBkb25vcl9pbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBwcm90ZWN0IG9yaWcgYW5kIGRvbm9yIGFnYWluc3QgYSB0cnVuY2F0ZSAqLwogCXJldDEgPSBtZXh0X2lub2RlX2RvdWJsZV9sb2NrKG9yaWdfaW5vZGUsIGRvbm9yX2lub2RlKTsKIAlpZiAocmV0MSA8IDApCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggNDJmODFkMi4uN2M4ZmU4MCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtMjA3Niw3ICsyMDc2LDggQEAKIAlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJLyogZXh0NF9oYW5kbGVfdmFsaWQoKSBhc3N1bWVzIGEgdmFsaWQgaGFuZGxlX3QgcG9pbnRlciAqLworCWlmIChoYW5kbGUgJiYgIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCiAJCXJldHVybiAwOwogCiAJbXV0ZXhfbG9jaygmRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfb3JwaGFuX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IGRmNTM5YmEuLmQ0Y2E5MmEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTUwLDEzICs1MCw2IEBACiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvZXh0NC5oPgogCi1zdGF0aWMgaW50IGRlZmF1bHRfbWJfaGlzdG9yeV9sZW5ndGggPSAxMDAwOwotCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVmYXVsdF9tYl9oaXN0b3J5X2xlbmd0aCwgZGVmYXVsdF9tYl9oaXN0b3J5X2xlbmd0aCwKLQkJICAgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVmYXVsdF9tYl9oaXN0b3J5X2xlbmd0aCwKLQkJICJEZWZhdWx0IG51bWJlciBvZiBlbnRyaWVzIHNhdmVkIGZvciBtYl9oaXN0b3J5Iik7Ci0KIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZXh0NF9wcm9jX3Jvb3Q7CiBzdGF0aWMgc3RydWN0IGtzZXQgKmV4dDRfa3NldDsKIApAQCAtMTg5LDYgKzE4MiwzNiBAQAogCQliZy0+YmdfaXRhYmxlX3VudXNlZF9oaSA9IGNwdV90b19sZTE2KGNvdW50ID4+IDE2KTsKIH0KIAorCisvKiBKdXN0IGluY3JlbWVudCB0aGUgbm9uLXBvaW50ZXIgaGFuZGxlIHZhbHVlICovCitzdGF0aWMgaGFuZGxlX3QgKmV4dDRfZ2V0X25vam91cm5hbCh2b2lkKQoreworCWhhbmRsZV90ICpoYW5kbGUgPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJdW5zaWduZWQgbG9uZyByZWZfY250ID0gKHVuc2lnbmVkIGxvbmcpaGFuZGxlOworCisJQlVHX09OKHJlZl9jbnQgPj0gRVhUNF9OT0pPVVJOQUxfTUFYX1JFRl9DT1VOVCk7CisKKwlyZWZfY250Kys7CisJaGFuZGxlID0gKGhhbmRsZV90ICopcmVmX2NudDsKKworCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IGhhbmRsZTsKKwlyZXR1cm4gaGFuZGxlOworfQorCisKKy8qIERlY3JlbWVudCB0aGUgbm9uLXBvaW50ZXIgaGFuZGxlIHZhbHVlICovCitzdGF0aWMgdm9pZCBleHQ0X3B1dF9ub2pvdXJuYWwoaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZl9jbnQgPSAodW5zaWduZWQgbG9uZyloYW5kbGU7CisKKwlCVUdfT04ocmVmX2NudCA9PSAwKTsKKworCXJlZl9jbnQtLTsKKwloYW5kbGUgPSAoaGFuZGxlX3QgKilyZWZfY250OworCisJY3VycmVudC0+am91cm5hbF9pbmZvID0gaGFuZGxlOworfQorCiAvKgogICogV3JhcHBlcnMgZm9yIGpiZDJfam91cm5hbF9zdGFydC9lbmQuCiAgKgpAQCAtMjE1LDExICsyMzgsNyBAQAogCQl9CiAJCXJldHVybiBqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbCwgbmJsb2Nrcyk7CiAJfQotCS8qCi0JICogV2UncmUgbm90IGpvdXJuYWxpbmcsIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kaWNhdGlvbi4KLQkgKi8KLQljdXJyZW50LT5qb3VybmFsX2luZm8gPSBFWFQ0X05PSk9VUk5BTF9IQU5ETEU7Ci0JcmV0dXJuIGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwlyZXR1cm4gZXh0NF9nZXRfbm9qb3VybmFsKCk7CiB9CiAKIC8qCkBAIC0yMzUsMTEgKzI1NCw3IEBACiAJaW50IHJjOwogCiAJaWYgKCFleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7Ci0JCS8qCi0JCSAqIERvIHRoaXMgaGVyZSBzaW5jZSB3ZSBkb24ndCBjYWxsIGpiZDJfam91cm5hbF9zdG9wKCkgaW4KLQkJICogbm8tam91cm5hbCBtb2RlLgotCQkgKi8KLQkJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKwkJZXh0NF9wdXRfbm9qb3VybmFsKGhhbmRsZSk7CiAJCXJldHVybiAwOwogCX0KIAlzYiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX3ByaXZhdGU7CkBAIC01ODAsNiArNTk1LDkgQEAKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CiAJaW50IGksIGVycjsKIAorCWZsdXNoX3dvcmtxdWV1ZShzYmktPmRpb191bndyaXR0ZW5fd3EpOworCWRlc3Ryb3lfd29ya3F1ZXVlKHNiaS0+ZGlvX3Vud3JpdHRlbl93cSk7CisKIAlsb2NrX3N1cGVyKHNiKTsKIAlsb2NrX2tlcm5lbCgpOwogCWlmIChzYi0+c19kaXJ0KQpAQCAtNjg0LDYgKzcwMiw4IEBACiAJZWktPmlfYWxsb2NhdGVkX21ldGFfYmxvY2tzID0gMDsKIAllaS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmKGVpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spKTsKKwlJTklUX0xJU1RfSEVBRCgmZWktPmlfYWlvX2Rpb19jb21wbGV0ZV9saXN0KTsKKwllaS0+Y3VyX2Fpb19kaW8gPSBOVUxMOwogCiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwogfQpAQCAtMTA1Miw3ICsxMDcyLDcgQEAKIAlPcHRfam91cm5hbF91cGRhdGUsIE9wdF9qb3VybmFsX2RldiwKIAlPcHRfam91cm5hbF9jaGVja3N1bSwgT3B0X2pvdXJuYWxfYXN5bmNfY29tbWl0LAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAotCU9wdF9kYXRhX2Vycl9hYm9ydCwgT3B0X2RhdGFfZXJyX2lnbm9yZSwgT3B0X21iX2hpc3RvcnlfbGVuZ3RoLAorCU9wdF9kYXRhX2Vycl9hYm9ydCwgT3B0X2RhdGFfZXJyX2lnbm9yZSwKIAlPcHRfdXNyanF1b3RhLCBPcHRfZ3JwanF1b3RhLCBPcHRfb2ZmdXNyanF1b3RhLCBPcHRfb2ZmZ3JwanF1b3RhLAogCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X3F1b3RhLCBPcHRfbm9xdW90YSwKIAlPcHRfaWdub3JlLCBPcHRfYmFycmllciwgT3B0X25vYmFycmllciwgT3B0X2VyciwgT3B0X3Jlc2l6ZSwKQEAgLTEwOTksNyArMTExOSw2IEBACiAJe09wdF9kYXRhX3dyaXRlYmFjaywgImRhdGE9d3JpdGViYWNrIn0sCiAJe09wdF9kYXRhX2Vycl9hYm9ydCwgImRhdGFfZXJyPWFib3J0In0sCiAJe09wdF9kYXRhX2Vycl9pZ25vcmUsICJkYXRhX2Vycj1pZ25vcmUifSwKLQl7T3B0X21iX2hpc3RvcnlfbGVuZ3RoLCAibWJfaGlzdG9yeV9sZW5ndGg9JXUifSwKIAl7T3B0X29mZnVzcmpxdW90YSwgInVzcmpxdW90YT0ifSwKIAl7T3B0X3VzcmpxdW90YSwgInVzcmpxdW90YT0lcyJ9LAogCXtPcHRfb2ZmZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSJ9LApAQCAtMTI4MSw5ICsxMzAwLDExIEBACiAJCQkqam91cm5hbF9kZXZudW0gPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfam91cm5hbF9jaGVja3N1bToKLQkJCWJyZWFrOwkvKiBLZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBKT1VSTkFMX0NIRUNLU1VNKTsKKwkJCWJyZWFrOwogCQljYXNlIE9wdF9qb3VybmFsX2FzeW5jX2NvbW1pdDoKIAkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgSk9VUk5BTF9BU1lOQ19DT01NSVQpOworCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBKT1VSTkFMX0NIRUNLU1VNKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2xvYWQ6CiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PTE9BRCk7CkBAIC0xMzQwLDEzICsxMzYxLDYgQEAKIAkJY2FzZSBPcHRfZGF0YV9lcnJfaWdub3JlOgogCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERBVEFfRVJSX0FCT1JUKTsKIAkJCWJyZWFrOwotCQljYXNlIE9wdF9tYl9oaXN0b3J5X2xlbmd0aDoKLQkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQotCQkJCXJldHVybiAwOwotCQkJaWYgKG9wdGlvbiA8IDApCi0JCQkJcmV0dXJuIDA7Ci0JCQlzYmktPnNfbWJfaGlzdG9yeV9tYXggPSBvcHRpb247Ci0JCQlicmVhazsKICNpZmRlZiBDT05GSUdfUVVPVEEKIAkJY2FzZSBPcHRfdXNyanF1b3RhOgogCQkJcXR5cGUgPSBVU1JRVU9UQTsKQEAgLTE2NDYsMTMgKzE2NjAsNiBAQAogCQkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwKIAkJCXNiaS0+c19tb3VudF9vcHQpOwogCi0JaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpIHsKLQkJZXh0NF9tc2coc2IsIEtFUk5fSU5GTywgIiVzIGpvdXJuYWwgb24gJXMiLAotCQkgICAgICAgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9pbm9kZSA/ICJpbnRlcm5hbCIgOgotCQkgICAgICAgImV4dGVybmFsIiwgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9kZXZuYW1lKTsKLQl9IGVsc2UgewotCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAibm8gam91cm5hbCIpOwotCX0KIAlyZXR1cm4gcmVzOwogfQogCkBAIC0yMTk3LDYgKzIyMDQsNyBAQAogRVhUNF9SV19BVFRSX1NCSV9VSShtYl9vcmRlcjJfcmVxLCBzX21iX29yZGVyMl9yZXFzKTsKIEVYVDRfUldfQVRUUl9TQklfVUkobWJfc3RyZWFtX3JlcSwgc19tYl9zdHJlYW1fcmVxdWVzdCk7CiBFWFQ0X1JXX0FUVFJfU0JJX1VJKG1iX2dyb3VwX3ByZWFsbG9jLCBzX21iX2dyb3VwX3ByZWFsbG9jKTsKK0VYVDRfUldfQVRUUl9TQklfVUkobWF4X3dyaXRlYmFja19tYl9idW1wLCBzX21heF93cml0ZWJhY2tfbWJfYnVtcCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpleHQ0X2F0dHJzW10gPSB7CiAJQVRUUl9MSVNUKGRlbGF5ZWRfYWxsb2NhdGlvbl9ibG9ja3MpLApAQCAtMjIxMCw2ICsyMjE4LDcgQEAKIAlBVFRSX0xJU1QobWJfb3JkZXIyX3JlcSksCiAJQVRUUl9MSVNUKG1iX3N0cmVhbV9yZXEpLAogCUFUVFJfTElTVChtYl9ncm91cF9wcmVhbGxvYyksCisJQVRUUl9MSVNUKG1heF93cml0ZWJhY2tfbWJfYnVtcCksCiAJTlVMTCwKIH07CiAKQEAgLTI0MTMsNyArMjQyMiw2IEBACiAJc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCA9IEpCRDJfREVGQVVMVF9NQVhfQ09NTUlUX0FHRSAqIEhaOwogCXNiaS0+c19taW5fYmF0Y2hfdGltZSA9IEVYVDRfREVGX01JTl9CQVRDSF9USU1FOwogCXNiaS0+c19tYXhfYmF0Y2hfdGltZSA9IEVYVDRfREVGX01BWF9CQVRDSF9USU1FOwotCXNiaS0+c19tYl9oaXN0b3J5X21heCA9IGRlZmF1bHRfbWJfaGlzdG9yeV9sZW5ndGg7CiAKIAlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJBUlJJRVIpOwogCkBAIC0yNjc5LDYgKzI2ODcsNyBAQAogCX0KIAogCXNiaS0+c19zdHJpcGUgPSBleHQ0X2dldF9zdHJpcGVfc2l6ZShzYmkpOworCXNiaS0+c19tYXhfd3JpdGViYWNrX21iX2J1bXAgPSAxMjg7CiAKIAkvKgogCSAqIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZQpAQCAtMjc1MiwxNCArMjc2MSwyMCBAQAogCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJfQogCi0JamJkMl9qb3VybmFsX3NldF9mZWF0dXJlcyhzYmktPnNfam91cm5hbCwKLQkJCQkgIEpCRDJfRkVBVFVSRV9DT01QQVRfQ0hFQ0tTVU0sIDAsIDApOwotCWlmICh0ZXN0X29wdChzYiwgSk9VUk5BTF9BU1lOQ19DT01NSVQpKQotCQlqYmQyX2pvdXJuYWxfc2V0X2ZlYXR1cmVzKHNiaS0+c19qb3VybmFsLCAwLCAwLAorCWlmICh0ZXN0X29wdChzYiwgSk9VUk5BTF9BU1lOQ19DT01NSVQpKSB7CisJCWpiZDJfam91cm5hbF9zZXRfZmVhdHVyZXMoc2JpLT5zX2pvdXJuYWwsCisJCQkJSkJEMl9GRUFUVVJFX0NPTVBBVF9DSEVDS1NVTSwgMCwKIAkJCQlKQkQyX0ZFQVRVUkVfSU5DT01QQVRfQVNZTkNfQ09NTUlUKTsKLQllbHNlCisJfSBlbHNlIGlmICh0ZXN0X29wdChzYiwgSk9VUk5BTF9DSEVDS1NVTSkpIHsKKwkJamJkMl9qb3VybmFsX3NldF9mZWF0dXJlcyhzYmktPnNfam91cm5hbCwKKwkJCQlKQkQyX0ZFQVRVUkVfQ09NUEFUX0NIRUNLU1VNLCAwLCAwKTsKIAkJamJkMl9qb3VybmFsX2NsZWFyX2ZlYXR1cmVzKHNiaS0+c19qb3VybmFsLCAwLCAwLAogCQkJCUpCRDJfRkVBVFVSRV9JTkNPTVBBVF9BU1lOQ19DT01NSVQpOworCX0gZWxzZSB7CisJCWpiZDJfam91cm5hbF9jbGVhcl9mZWF0dXJlcyhzYmktPnNfam91cm5hbCwKKwkJCQlKQkQyX0ZFQVRVUkVfQ09NUEFUX0NIRUNLU1VNLCAwLAorCQkJCUpCRDJfRkVBVFVSRV9JTkNPTVBBVF9BU1lOQ19DT01NSVQpOworCX0KIAogCS8qIFdlIGhhdmUgbm93IHVwZGF0ZWQgdGhlIGpvdXJuYWwgaWYgcmVxdWlyZWQsIHNvIHdlIGNhbgogCSAqIHZhbGlkYXRlIHRoZSBkYXRhIGpvdXJuYWxpbmcgbW9kZS4gKi8KQEAgLTI3OTgsNiArMjgxMywxMiBAQAogCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PQkgpOwogCQl9CiAJfQorCUVYVDRfU0Ioc2IpLT5kaW9fdW53cml0dGVuX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiZXh0NC1kaW8tdW53cml0dGVuIik7CisJaWYgKCFFWFQ0X1NCKHNiKS0+ZGlvX3Vud3JpdHRlbl93cSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGZhaWxlZCB0byBjcmVhdGUgRElPIHdvcmtxdWV1ZVxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50X3dxOworCX0KKwogCS8qCiAJICogVGhlIGpiZDJfam91cm5hbF9sb2FkIHdpbGwgaGF2ZSBkb25lIGFueSBuZWNlc3NhcnkgbG9nIHJlY292ZXJ5LAogCSAqIHNvIHdlIGNhbiBzYWZlbHkgbW91bnQgdGhlIHJlc3Qgb2YgdGhlIGZpbGVzeXN0ZW0gbm93LgpAQCAtMjg0OSwxMiArMjg3MCwxMiBAQAogCQkJICJhdmFpbGFibGUiKTsKIAl9CiAKLQlpZiAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBKSB7CisJaWYgKHRlc3Rfb3B0KHNiLCBERUxBTExPQykgJiYKKwkgICAgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkpIHsKIAkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgIklnbm9yaW5nIGRlbGFsbG9jIG9wdGlvbiAtICIKIAkJCSAicmVxdWVzdGVkIGRhdGEgam91cm5hbGluZyBtb2RlIik7CiAJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBERUxBTExPQyk7Ci0JfSBlbHNlIGlmICh0ZXN0X29wdChzYiwgREVMQUxMT0MpKQotCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAiZGVsYXllZCBhbGxvY2F0aW9uIGVuYWJsZWQiKTsKKwl9CiAKIAllcnIgPSBleHQ0X3NldHVwX3N5c3RlbV96b25lKHNiKTsKIAlpZiAoZXJyKSB7CkBAIC0yOTEwLDYgKzI5MzEsOCBAQAogCiBmYWlsZWRfbW91bnQ0OgogCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIm1vdW50IGZhaWxlZCIpOworCWRlc3Ryb3lfd29ya3F1ZXVlKEVYVDRfU0Ioc2IpLT5kaW9fdW53cml0dGVuX3dxKTsKK2ZhaWxlZF9tb3VudF93cToKIAlleHQ0X3JlbGVhc2Vfc3lzdGVtX3pvbmUoc2IpOwogCWlmIChzYmktPnNfam91cm5hbCkgewogCQlqYmQyX2pvdXJuYWxfZGVzdHJveShzYmktPnNfam91cm5hbCk7CkBAIC0zMTY0LDkgKzMxODcsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKQkQyX0JBUlJJRVIpCi0JCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sICJiYXJyaWVycyBlbmFibGVkIik7Ci0JZWxzZQorCWlmICghKGpvdXJuYWwtPmpfZmxhZ3MgJiBKQkQyX0JBUlJJRVIpKQogCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAiYmFycmllcnMgZGlzYWJsZWQiKTsKIAogCWlmICghcmVhbGx5X3JlYWRfb25seSAmJiB0ZXN0X29wdChzYiwgVVBEQVRFX0pPVVJOQUwpKSB7CkBAIC0zMzYxLDExICszMzgyLDEzIEBACiB7CiAJaW50IHJldCA9IDA7CiAJdGlkX3QgdGFyZ2V0OworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCiAJdHJhY2VfZXh0NF9zeW5jX2ZzKHNiLCB3YWl0KTsKLQlpZiAoamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLCAmdGFyZ2V0KSkgeworCWZsdXNoX3dvcmtxdWV1ZShzYmktPmRpb191bndyaXR0ZW5fd3EpOworCWlmIChqYmQyX2pvdXJuYWxfc3RhcnRfY29tbWl0KHNiaS0+c19qb3VybmFsLCAmdGFyZ2V0KSkgewogCQlpZiAod2FpdCkKLQkJCWpiZDJfbG9nX3dhaXRfY29tbWl0KEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwsIHRhcmdldCk7CisJCQlqYmQyX2xvZ193YWl0X2NvbW1pdChzYmktPnNfam91cm5hbCwgdGFyZ2V0KTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTM5NTEsMjcgKzM5NzQsNiBAQAogCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKIH07CiAKLSNpZmRlZiBDT05GSUdfRVhUNERFVl9DT01QQVQKLXN0YXRpYyBpbnQgZXh0NGRldl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywKLQkJCSAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsc3RydWN0IHZmc21vdW50ICptbnQpCi17Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mcyAoJXMpOiBVcGRhdGUgeW91ciB1c2Vyc3BhY2UgcHJvZ3JhbXMgIgotCSAgICAgICAidG8gbW91bnQgdXNpbmcgZXh0NFxuIiwgZGV2X25hbWUpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnMgKCVzKTogZXh0NGRldiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAiCi0JICAgICAgICJ3aWxsIGdvIGF3YXkgYnkgMi42LjMxXG4iLCBkZXZfbmFtZSk7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0NF9maWxsX3N1cGVyLG1udCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBleHQ0ZGV2X2ZzX3R5cGUgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJleHQ0ZGV2IiwKLQkuZ2V0X3NiCQk9IGV4dDRkZXZfZ2V0X3NiLAotCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKLQkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCi19OwotTU9EVUxFX0FMSUFTKCJleHQ0ZGV2Iik7Ci0jZW5kaWYKLQogc3RhdGljIGludCBfX2luaXQgaW5pdF9leHQ0X2ZzKHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTM5OTYsMTMgKzM5OTgsNiBAQAogCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV4dDRfZnNfdHlwZSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0jaWZkZWYgQ09ORklHX0VYVDRERVZfQ09NUEFUCi0JZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0NGRldl9mc190eXBlKTsKLQlpZiAoZXJyKSB7Ci0JCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0NF9mc190eXBlKTsKLQkJZ290byBvdXQ7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIDA7CiBvdXQ6CiAJZGVzdHJveV9pbm9kZWNhY2hlKCk7CkBAIC00MDIxLDkgKzQwMTYsNiBAQAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZXh0NF9mcyh2b2lkKQogewogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0NF9mc190eXBlKTsKLSNpZmRlZiBDT05GSUdfRVhUNERFVl9DT01QQVQKLQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV4dDRkZXZfZnNfdHlwZSk7Ci0jZW5kaWYKIAlkZXN0cm95X2lub2RlY2FjaGUoKTsKIAlleGl0X2V4dDRfeGF0dHIoKTsKIAlleGl0X2V4dDRfbWJhbGxvYygpOwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdC5oIGIvZnMvZmF0L2ZhdC5oCmluZGV4IGFkYjBlNzIuLjdkYjA5NzkgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9mYXQuaAorKysgYi9mcy9mYXQvZmF0LmgKQEAgLTMyMyw3ICszMjMsNyBAQAogLyogZmF0L21pc2MuYyAqLwogZXh0ZXJuIHZvaWQgZmF0X2ZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpIF9fY29sZDsKLWV4dGVybiB2b2lkIGZhdF9jbHVzdGVyc19mbHVzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2V4dGVybiBpbnQgZmF0X2NsdXN0ZXJzX2ZsdXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogZXh0ZXJuIGludCBmYXRfY2hhaW5fYWRkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuZXdfZGNsdXMsIGludCBucl9jbHVzdGVyKTsKIGV4dGVybiB2b2lkIGZhdF90aW1lX2ZhdDJ1bml4KHN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmksIHN0cnVjdCB0aW1lc3BlYyAqdHMsCiAJCQkgICAgICBfX2xlMTYgX190aW1lLCBfX2xlMTYgX19kYXRlLCB1OCB0aW1lX2NzKTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggODk3MGQ4Yy4uNzZiNzk2MSAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTQ1MSwxMiArNDUxLDE2IEBACiAKIHN0YXRpYyBpbnQgZmF0X3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCiB7Ci0JbG9ja19zdXBlcihzYik7Ci0JZmF0X2NsdXN0ZXJzX2ZsdXNoKHNiKTsKLQlzYi0+c19kaXJ0ID0gMDsKLQl1bmxvY2tfc3VwZXIoc2IpOworCWludCBlcnIgPSAwOwogCi0JcmV0dXJuIDA7CisJaWYgKHNiLT5zX2RpcnQpIHsKKwkJbG9ja19zdXBlcihzYik7CisJCXNiLT5zX2RpcnQgPSAwOworCQllcnIgPSBmYXRfY2x1c3RlcnNfZmx1c2goc2IpOworCQl1bmxvY2tfc3VwZXIoc2IpOworCX0KKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGZhdF9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTQ3MCwxOSArNDc0LDExIEBACiAKIAlpcHV0KHNiaS0+ZmF0X2lub2RlKTsKIAotCWlmIChzYmktPm5sc19kaXNrKSB7Ci0JCXVubG9hZF9ubHMoc2JpLT5ubHNfZGlzayk7Ci0JCXNiaS0+bmxzX2Rpc2sgPSBOVUxMOwotCQlzYmktPm9wdGlvbnMuY29kZXBhZ2UgPSBmYXRfZGVmYXVsdF9jb2RlcGFnZTsKLQl9Ci0JaWYgKHNiaS0+bmxzX2lvKSB7Ci0JCXVubG9hZF9ubHMoc2JpLT5ubHNfaW8pOwotCQlzYmktPm5sc19pbyA9IE5VTEw7Ci0JfQotCWlmIChzYmktPm9wdGlvbnMuaW9jaGFyc2V0ICE9IGZhdF9kZWZhdWx0X2lvY2hhcnNldCkgeworCXVubG9hZF9ubHMoc2JpLT5ubHNfZGlzayk7CisJdW5sb2FkX25scyhzYmktPm5sc19pbyk7CisKKwlpZiAoc2JpLT5vcHRpb25zLmlvY2hhcnNldCAhPSBmYXRfZGVmYXVsdF9pb2NoYXJzZXQpCiAJCWtmcmVlKHNiaS0+b3B0aW9ucy5pb2NoYXJzZXQpOwotCQlzYmktPm9wdGlvbnMuaW9jaGFyc2V0ID0gZmF0X2RlZmF1bHRfaW9jaGFyc2V0OwotCX0KIAogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCWtmcmVlKHNiaSk7CkBAIC04MjAsNyArODE2LDcgQEAKIAkJCXNlcV9wdXRzKG0sICIsc2hvcnRuYW1lPW1peGVkIik7CiAJCQlicmVhazsKIAkJY2FzZSBWRkFUX1NGTl9ESVNQTEFZX0xPV0VSIHwgVkZBVF9TRk5fQ1JFQVRFX1dJTjk1OgotCQkJLyogc2VxX3B1dHMobSwgIixzaG9ydG5hbWU9bG93ZXIiKTsgKi8KKwkJCXNlcV9wdXRzKG0sICIsc2hvcnRuYW1lPWxvd2VyIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXNlcV9wdXRzKG0sICIsc2hvcnRuYW1lPXVua25vd24iKTsKQEAgLTk3MSw3ICs5NjcsNyBAQAogCW9wdHMtPmNvZGVwYWdlID0gZmF0X2RlZmF1bHRfY29kZXBhZ2U7CiAJb3B0cy0+aW9jaGFyc2V0ID0gZmF0X2RlZmF1bHRfaW9jaGFyc2V0OwogCWlmIChpc192ZmF0KSB7Ci0JCW9wdHMtPnNob3J0bmFtZSA9IFZGQVRfU0ZOX0RJU1BMQVlfTE9XRVJ8VkZBVF9TRk5fQ1JFQVRFX1dJTjk1OworCQlvcHRzLT5zaG9ydG5hbWUgPSBWRkFUX1NGTl9ESVNQTEFZX1dJTk5UfFZGQVRfU0ZOX0NSRUFURV9XSU45NTsKIAkJb3B0cy0+cm9kaXIgPSAwOwogCX0gZWxzZSB7CiAJCW9wdHMtPnNob3J0bmFtZSA9IDA7CmRpZmYgLS1naXQgYS9mcy9mYXQvbWlzYy5jIGIvZnMvZmF0L21pc2MuYwppbmRleCA0ZTM1YmU4Li4wZjU1ZjVjIDEwMDY0NAotLS0gYS9mcy9mYXQvbWlzYy5jCisrKyBiL2ZzL2ZhdC9taXNjLmMKQEAgLTQzLDE5ICs0MywxOSBAQAogCiAvKiBGbHVzaGVzIHRoZSBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyBvbiBGQVQzMiAqLwogLyogWFhYOiBOZWVkIHRvIHdyaXRlIG9uZSBwZXIgRlNJTkZPIGJsb2NrLiAgQ3VycmVudGx5IG9ubHkgd3JpdGVzIDEgKi8KLXZvaWQgZmF0X2NsdXN0ZXJzX2ZsdXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitpbnQgZmF0X2NsdXN0ZXJzX2ZsdXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBmYXRfYm9vdF9mc2luZm8gKmZzaW5mbzsKIAogCWlmIChzYmktPmZhdF9iaXRzICE9IDMyKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJYmggPSBzYl9icmVhZChzYiwgc2JpLT5mc2luZm9fc2VjdG9yKTsKIAlpZiAoYmggPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZBVDogYnJlYWQgZmFpbGVkIGluIGZhdF9jbHVzdGVyc19mbHVzaFxuIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJZnNpbmZvID0gKHN0cnVjdCBmYXRfYm9vdF9mc2luZm8gKiliaC0+Yl9kYXRhOwpAQCAtNzQsNiArNzQsOCBAQAogCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJfQogCWJyZWxzZShiaCk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9uYW1laV92ZmF0LmMgYi9mcy9mYXQvbmFtZWlfdmZhdC5jCmluZGV4IGNiNmU4MzUuLmY1NjVmMjQgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9uYW1laV92ZmF0LmMKKysrIGIvZnMvZmF0L25hbWVpX3ZmYXQuYwpAQCAtNDk5LDE3ICs0OTksMTAgQEAKIAlpbnQgY2hhcmxlbjsKIAogCWlmICh1dGY4KSB7Ci0JCWludCBuYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKLQotCQkqb3V0bGVuID0gdXRmOHNfdG9fdXRmMTZzKG5hbWUsIFBBVEhfTUFYLCAod2NoYXJfdCAqKSBvdXRuYW1lKTsKLQotCQkvKgotCQkgKiBXZSBzdHJpcHBlZCAnLidzIGJlZm9yZSBhbmQgc2V0IGxlbiBhcHByb3ByaWF0ZWx5LAotCQkgKiBidXQgdXRmOHNfdG9fdXRmMTZzIGRvZXNuJ3QgY2FyZSBhYm91dCBsZW4KLQkJICovCi0JCSpvdXRsZW4gLT0gKG5hbWVfbGVuIC0gbGVuKTsKLQotCQlpZiAoKm91dGxlbiA+IDI1NSkKKwkJKm91dGxlbiA9IHV0ZjhzX3RvX3V0ZjE2cyhuYW1lLCBsZW4sICh3Y2hhcl90ICopb3V0bmFtZSk7CisJCWlmICgqb3V0bGVuIDwgMCkKKwkJCXJldHVybiAqb3V0bGVuOworCQllbHNlIGlmICgqb3V0bGVuID4gMjU1KQogCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CiAKIAkJb3AgPSAmb3V0bmFtZVsqb3V0bGVuICogc2l6ZW9mKHdjaGFyX3QpXTsKZGlmZiAtLWdpdCBhL2ZzL2ZjbnRsLmMgYi9mcy9mY250bC5jCmluZGV4IGFlNDEzMDguLmZjMDg5ZjIgMTAwNjQ0Ci0tLSBhL2ZzL2ZjbnRsLmMKKysrIGIvZnMvZmNudGwuYwpAQCAtMjYzLDYgKzI2Myw3OSBAQAogCXJldHVybiBwaWQ7CiB9CiAKK3N0YXRpYyBpbnQgZl9zZXRvd25fZXgoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBmX293bmVyX2V4ICogX191c2VyIG93bmVyX3AgPSAodm9pZCAqIF9fdXNlcilhcmc7CisJc3RydWN0IGZfb3duZXJfZXggb3duZXI7CisJc3RydWN0IHBpZCAqcGlkOworCWludCB0eXBlOworCWludCByZXQ7CisKKwlyZXQgPSBjb3B5X2Zyb21fdXNlcigmb3duZXIsIG93bmVyX3AsIHNpemVvZihvd25lcikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKG93bmVyLnR5cGUpIHsKKwljYXNlIEZfT1dORVJfVElEOgorCQl0eXBlID0gUElEVFlQRV9NQVg7CisJCWJyZWFrOworCisJY2FzZSBGX09XTkVSX1BJRDoKKwkJdHlwZSA9IFBJRFRZUEVfUElEOworCQlicmVhazsKKworCWNhc2UgRl9PV05FUl9HSUQ6CisJCXR5cGUgPSBQSURUWVBFX1BHSUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCXBpZCA9IGZpbmRfdnBpZChvd25lci5waWQpOworCWlmIChvd25lci5waWQgJiYgIXBpZCkKKwkJcmV0ID0gLUVTUkNIOworCWVsc2UKKwkJcmV0ID0gX19mX3NldG93bihmaWxwLCBwaWQsIHR5cGUsIDEpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmX2dldG93bl9leChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGZfb3duZXJfZXggKiBfX3VzZXIgb3duZXJfcCA9ICh2b2lkICogX191c2VyKWFyZzsKKwlzdHJ1Y3QgZl9vd25lcl9leCBvd25lcjsKKwlpbnQgcmV0ID0gMDsKKworCXJlYWRfbG9jaygmZmlscC0+Zl9vd25lci5sb2NrKTsKKwlvd25lci5waWQgPSBwaWRfdm5yKGZpbHAtPmZfb3duZXIucGlkKTsKKwlzd2l0Y2ggKGZpbHAtPmZfb3duZXIucGlkX3R5cGUpIHsKKwljYXNlIFBJRFRZUEVfTUFYOgorCQlvd25lci50eXBlID0gRl9PV05FUl9USUQ7CisJCWJyZWFrOworCisJY2FzZSBQSURUWVBFX1BJRDoKKwkJb3duZXIudHlwZSA9IEZfT1dORVJfUElEOworCQlicmVhazsKKworCWNhc2UgUElEVFlQRV9QR0lEOgorCQlvd25lci50eXBlID0gRl9PV05FUl9HSUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJlYWRfdW5sb2NrKCZmaWxwLT5mX293bmVyLmxvY2spOworCisJaWYgKCFyZXQpCisJCXJldCA9IGNvcHlfdG9fdXNlcihvd25lcl9wLCAmb3duZXIsIHNpemVvZihvd25lcikpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBsb25nIGRvX2ZjbnRsKGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCiAJCXN0cnVjdCBmaWxlICpmaWxwKQogewpAQCAtMzEzLDYgKzM4NiwxMiBAQAogCWNhc2UgRl9TRVRPV046CiAJCWVyciA9IGZfc2V0b3duKGZpbHAsIGFyZywgMSk7CiAJCWJyZWFrOworCWNhc2UgRl9HRVRPV05fRVg6CisJCWVyciA9IGZfZ2V0b3duX2V4KGZpbHAsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgRl9TRVRPV05fRVg6CisJCWVyciA9IGZfc2V0b3duX2V4KGZpbHAsIGFyZyk7CisJCWJyZWFrOwogCWNhc2UgRl9HRVRTSUc6CiAJCWVyciA9IGZpbHAtPmZfb3duZXIuc2lnbnVtOwogCQlicmVhazsKQEAgLTQyOCw4ICs1MDcsNyBAQAogCiBzdGF0aWMgdm9pZCBzZW5kX3NpZ2lvX3RvX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkJICAgICAgIHN0cnVjdCBmb3duX3N0cnVjdCAqZm93biwKLQkJCSAgICAgICBpbnQgZmQsCi0JCQkgICAgICAgaW50IHJlYXNvbikKKwkJCSAgICAgICBpbnQgZmQsIGludCByZWFzb24sIGludCBncm91cCkKIHsKIAkvKgogCSAqIEZfU0VUU0lHIGNhbiBjaGFuZ2UgLT5zaWdudW0gbG9ja2xlc3MgaW4gcGFyYWxsZWwsIG1ha2UKQEAgLTQ2MSwxMSArNTM5LDExIEBACiAJCQllbHNlCiAJCQkJc2kuc2lfYmFuZCA9IGJhbmRfdGFibGVbcmVhc29uIC0gUE9MTF9JTl07CiAJCQlzaS5zaV9mZCAgICA9IGZkOwotCQkJaWYgKCFncm91cF9zZW5kX3NpZ19pbmZvKHNpZ251bSwgJnNpLCBwKSkKKwkJCWlmICghZG9fc2VuZF9zaWdfaW5mbyhzaWdudW0sICZzaSwgcCwgZ3JvdXApKQogCQkJCWJyZWFrOwogCQkvKiBmYWxsLXRocm91Z2g6IGZhbGwgYmFjayBvbiB0aGUgb2xkIHBsYWluIFNJR0lPIHNpZ25hbCAqLwogCQljYXNlIDA6Ci0JCQlncm91cF9zZW5kX3NpZ19pbmZvKFNJR0lPLCBTRU5EX1NJR19QUklWLCBwKTsKKwkJCWRvX3NlbmRfc2lnX2luZm8oU0lHSU8sIFNFTkRfU0lHX1BSSVYsIHAsIGdyb3VwKTsKIAl9CiB9CiAKQEAgLTQ3NCwxNiArNTUyLDIzIEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCWVudW0gcGlkX3R5cGUgdHlwZTsKIAlzdHJ1Y3QgcGlkICpwaWQ7CisJaW50IGdyb3VwID0gMTsKIAkKIAlyZWFkX2xvY2soJmZvd24tPmxvY2spOworCiAJdHlwZSA9IGZvd24tPnBpZF90eXBlOworCWlmICh0eXBlID09IFBJRFRZUEVfTUFYKSB7CisJCWdyb3VwID0gMDsKKwkJdHlwZSA9IFBJRFRZUEVfUElEOworCX0KKwogCXBpZCA9IGZvd24tPnBpZDsKIAlpZiAoIXBpZCkKIAkJZ290byBvdXRfdW5sb2NrX2Zvd247CiAJCiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlkb19lYWNoX3BpZF90YXNrKHBpZCwgdHlwZSwgcCkgewotCQlzZW5kX3NpZ2lvX3RvX3Rhc2socCwgZm93biwgZmQsIGJhbmQpOworCQlzZW5kX3NpZ2lvX3RvX3Rhc2socCwgZm93biwgZmQsIGJhbmQsIGdyb3VwKTsKIAl9IHdoaWxlX2VhY2hfcGlkX3Rhc2socGlkLCB0eXBlLCBwKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAgb3V0X3VubG9ja19mb3duOgpAQCAtNDkxLDEwICs1NzYsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQgc2VuZF9zaWd1cmdfdG9fdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmb3duX3N0cnVjdCAqZm93bikKKwkJCQlzdHJ1Y3QgZm93bl9zdHJ1Y3QgKmZvd24sIGludCBncm91cCkKIHsKIAlpZiAoc2lnaW9fcGVybShwLCBmb3duLCBTSUdVUkcpKQotCQlncm91cF9zZW5kX3NpZ19pbmZvKFNJR1VSRywgU0VORF9TSUdfUFJJViwgcCk7CisJCWRvX3NlbmRfc2lnX2luZm8oU0lHVVJHLCBTRU5EX1NJR19QUklWLCBwLCBncm91cCk7CiB9CiAKIGludCBzZW5kX3NpZ3VyZyhzdHJ1Y3QgZm93bl9zdHJ1Y3QgKmZvd24pCkBAIC01MDIsMTAgKzU4NywxNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAllbnVtIHBpZF90eXBlIHR5cGU7CiAJc3RydWN0IHBpZCAqcGlkOworCWludCBncm91cCA9IDE7CiAJaW50IHJldCA9IDA7CiAJCiAJcmVhZF9sb2NrKCZmb3duLT5sb2NrKTsKKwogCXR5cGUgPSBmb3duLT5waWRfdHlwZTsKKwlpZiAodHlwZSA9PSBQSURUWVBFX01BWCkgeworCQlncm91cCA9IDA7CisJCXR5cGUgPSBQSURUWVBFX1BJRDsKKwl9CisKIAlwaWQgPSBmb3duLT5waWQ7CiAJaWYgKCFwaWQpCiAJCWdvdG8gb3V0X3VubG9ja19mb3duOwpAQCAtNTE0LDcgKzYwNiw3IEBACiAJCiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlkb19lYWNoX3BpZF90YXNrKHBpZCwgdHlwZSwgcCkgewotCQlzZW5kX3NpZ3VyZ190b190YXNrKHAsIGZvd24pOworCQlzZW5kX3NpZ3VyZ190b190YXNrKHAsIGZvd24sIGdyb3VwKTsKIAl9IHdoaWxlX2VhY2hfcGlkX3Rhc2socGlkLCB0eXBlLCBwKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAgb3V0X3VubG9ja19mb3duOgpkaWZmIC0tZ2l0IGEvZnMvZmlsZS5jIGIvZnMvZmlsZS5jCmluZGV4IGYzMTMzMTQuLjg3ZTEyOTAgMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGUuYworKysgYi9mcy9maWxlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmMKaW5kZXggMzM0Y2UzOS4uOGViNDQwNCAxMDA2NDQKLS0tIGEvZnMvZmlsZV90YWJsZS5jCisrKyBiL2ZzL2ZpbGVfdGFibGUuYwpAQCAtNzQsMTQgKzc0LDE0IEBACiAgKiBIYW5kbGUgbnJfZmlsZXMgc3lzY3RsCiAgKi8KICNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCi1pbnQgcHJvY19ucl9maWxlcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAoraW50IHByb2NfbnJfZmlsZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJZmlsZXNfc3RhdC5ucl9maWxlcyA9IGdldF9ucl9maWxlcygpOwotCXJldHVybiBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXR1cm4gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiB9CiAjZWxzZQotaW50IHByb2NfbnJfZmlsZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2ludCBwcm9jX25yX2ZpbGVzKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXJldHVybiAtRU5PU1lTOwpkaWZmIC0tZ2l0IGEvZnMvZnMtd3JpdGViYWNrLmMgYi9mcy9mcy13cml0ZWJhY2suYwppbmRleCA4ZTFlNWUxLi45ZDUzNjBjIDEwMDY0NAotLS0gYS9mcy9mcy13cml0ZWJhY2suYworKysgYi9mcy9mcy13cml0ZWJhY2suYwpAQCAtNDEsOCArNDEsOSBAQAogCWxvbmcgbnJfcGFnZXM7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAllbnVtIHdyaXRlYmFja19zeW5jX21vZGVzIHN5bmNfbW9kZTsKLQlpbnQgZm9yX2t1cGRhdGU7Ci0JaW50IHJhbmdlX2N5Y2xpYzsKKwlpbnQgZm9yX2t1cGRhdGU6MTsKKwlpbnQgcmFuZ2VfY3ljbGljOjE7CisJaW50IGZvcl9iYWNrZ3JvdW5kOjE7CiB9OwogCiAvKgpAQCAtMjQ5LDE0ICsyNTAsMjUgQEAKICAqICAgY29tcGxldGlvbi4gQ2FsbGVyIG5lZWQgbm90IGhvbGQgc2Igc191bW91bnQgc2VtYXBob3JlLgogICoKICAqLwotdm9pZCBiZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMpCit2b2lkIGJkaV9zdGFydF93cml0ZWJhY2soc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSBsb25nIG5yX3BhZ2VzKQogewogCXN0cnVjdCB3Yl93cml0ZWJhY2tfYXJncyBhcmdzID0geworCQkuc2IJCT0gc2IsCiAJCS5zeW5jX21vZGUJPSBXQl9TWU5DX05PTkUsCiAJCS5ucl9wYWdlcwk9IG5yX3BhZ2VzLAogCQkucmFuZ2VfY3ljbGljCT0gMSwKIAl9OwogCisJLyoKKwkgKiBXZSB0cmVhdCBAbnJfcGFnZXM9MCBhcyB0aGUgc3BlY2lhbCBjYXNlIHRvIGRvIGJhY2tncm91bmQgd3JpdGViYWNrLAorCSAqIGllLiB0byBzeW5jIHBhZ2VzIHVudGlsIHRoZSBiYWNrZ3JvdW5kIGRpcnR5IHRocmVzaG9sZCBpcyByZWFjaGVkLgorCSAqLworCWlmICghbnJfcGFnZXMpIHsKKwkJYXJncy5ucl9wYWdlcyA9IExPTkdfTUFYOworCQlhcmdzLmZvcl9iYWNrZ3JvdW5kID0gMTsKKwl9CisKIAliZGlfYWxsb2NfcXVldWVfd29yayhiZGksICZhcmdzKTsKIH0KIApAQCAtMzEwLDcgKzMyMiw3IEBACiAJICogRm9yIGlub2RlcyBiZWluZyBjb25zdGFudGx5IHJlZGlydGllZCwgZGlydGllZF93aGVuIGNhbiBnZXQgc3R1Y2suCiAJICogSXQgX2FwcGVhcnNfIHRvIGJlIGluIHRoZSBmdXR1cmUsIGJ1dCBpcyBhY3R1YWxseSBpbiBkaXN0YW50IHBhc3QuCiAJICogVGhpcyB0ZXN0IGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IHN1Y2ggd3JhcHBlZC1hcm91bmQgcmVsYXRpdmUgdGltZXMKLQkgKiBmcm9tIHBlcm1hbmVudGx5IHN0b3BwaW5nIHRoZSB3aG9sZSBwZGZsdXNoIHdyaXRlYmFjay4KKwkgKiBmcm9tIHBlcm1hbmVudGx5IHN0b3BwaW5nIHRoZSB3aG9sZSBiZGkgd3JpdGViYWNrLgogCSAqLwogCXJldCA9IHJldCAmJiB0aW1lX2JlZm9yZV9lcShpbm9kZS0+ZGlydGllZF93aGVuLCBqaWZmaWVzKTsKICNlbmRpZgpAQCAtMzI0LDEzICszMzYsMzggQEAKIAkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkaXNwYXRjaF9xdWV1ZSwKIAkJCQl1bnNpZ25lZCBsb25nICpvbGRlcl90aGFuX3RoaXMpCiB7CisJTElTVF9IRUFEKHRtcCk7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBkb19zYl9zb3J0ID0gMDsKKwogCXdoaWxlICghbGlzdF9lbXB0eShkZWxheWluZ19xdWV1ZSkpIHsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IGxpc3RfZW50cnkoZGVsYXlpbmdfcXVldWUtPnByZXYsCi0JCQkJCQlzdHJ1Y3QgaW5vZGUsIGlfbGlzdCk7CisJCWlub2RlID0gbGlzdF9lbnRyeShkZWxheWluZ19xdWV1ZS0+cHJldiwgc3RydWN0IGlub2RlLCBpX2xpc3QpOwogCQlpZiAob2xkZXJfdGhhbl90aGlzICYmCiAJCSAgICBpbm9kZV9kaXJ0aWVkX2FmdGVyKGlub2RlLCAqb2xkZXJfdGhhbl90aGlzKSkKIAkJCWJyZWFrOwotCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsIGRpc3BhdGNoX3F1ZXVlKTsKKwkJaWYgKHNiICYmIHNiICE9IGlub2RlLT5pX3NiKQorCQkJZG9fc2Jfc29ydCA9IDE7CisJCXNiID0gaW5vZGUtPmlfc2I7CisJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnRtcCk7CisJfQorCisJLyoganVzdCBvbmUgc2IgaW4gbGlzdCwgc3BsaWNlIHRvIGRpc3BhdGNoX3F1ZXVlIGFuZCB3ZSdyZSBkb25lICovCisJaWYgKCFkb19zYl9zb3J0KSB7CisJCWxpc3Rfc3BsaWNlKCZ0bXAsIGRpc3BhdGNoX3F1ZXVlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1vdmUgaW5vZGVzIGZyb20gb25lIHN1cGVyYmxvY2sgdG9nZXRoZXIgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcCkpIHsKKwkJaW5vZGUgPSBsaXN0X2VudHJ5KHRtcC5wcmV2LCBzdHJ1Y3QgaW5vZGUsIGlfbGlzdCk7CisJCXNiID0gaW5vZGUtPmlfc2I7CisJCWxpc3RfZm9yX2VhY2hfcHJldl9zYWZlKHBvcywgbm9kZSwgJnRtcCkgeworCQkJaW5vZGUgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGlub2RlLCBpX2xpc3QpOworCQkJaWYgKGlub2RlLT5pX3NiID09IHNiKQorCQkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgZGlzcGF0Y2hfcXVldWUpOworCQl9CiAJfQogfQogCkBAIC00MzksOCArNDc2LDE4IEBACiAJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKIAlpbm9kZS0+aV9zdGF0ZSAmPSB+SV9TWU5DOwogCWlmICghKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlORyB8IElfQ0xFQVIpKSkgewotCQlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpICYmCi0JCSAgICBtYXBwaW5nX3RhZ2dlZChtYXBwaW5nLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKSkgeworCQlpZiAoKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9QQUdFUykgJiYgd2JjLT5mb3Jfa3VwZGF0ZSkgeworCQkJLyoKKwkJCSAqIE1vcmUgcGFnZXMgZ2V0IGRpcnRpZWQgYnkgYSBmYXN0IGRpcnRpZXIuCisJCQkgKi8KKwkJCWdvdG8gc2VsZWN0X3F1ZXVlOworCQl9IGVsc2UgaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgeworCQkJLyoKKwkJCSAqIEF0IGxlYXN0IFhGUyB3aWxsIHJlZGlydHkgdGhlIGlub2RlIGR1cmluZyB0aGUKKwkJCSAqIHdyaXRlYmFjayAoZGVsYWxsb2MpIGFuZCBvbiBpbyBjb21wbGV0aW9uIChpc2l6ZSkuCisJCQkgKi8KKwkJCXJlZGlydHlfdGFpbChpbm9kZSk7CisJCX0gZWxzZSBpZiAobWFwcGluZ190YWdnZWQobWFwcGluZywgUEFHRUNBQ0hFX1RBR19ESVJUWSkpIHsKIAkJCS8qCiAJCQkgKiBXZSBkaWRuJ3Qgd3JpdGUgYmFjayBhbGwgdGhlIHBhZ2VzLiAgbmZzX3dyaXRlcGFnZXMoKQogCQkJICogc29tZXRpbWVzIGJhbGVzIG91dCB3aXRob3V0IGRvaW5nIGFueXRoaW5nLiBSZWRpcnR5CkBAIC00NjIsNiArNTA5LDcgQEAKIAkJCQkgKiBzb29uIGFzIHRoZSBxdWV1ZSBiZWNvbWVzIHVuY29uZ2VzdGVkLgogCQkJCSAqLwogCQkJCWlub2RlLT5pX3N0YXRlIHw9IElfRElSVFlfUEFHRVM7CitzZWxlY3RfcXVldWU6CiAJCQkJaWYgKHdiYy0+bnJfdG9fd3JpdGUgPD0gMCkgewogCQkJCQkvKgogCQkJCQkgKiBzbGljZSB1c2VkIHVwOiBxdWV1ZSBmb3IgbmV4dCB0dXJuCkBAIC00ODQsMTIgKzUzMiw2IEBACiAJCQkJaW5vZGUtPmlfc3RhdGUgfD0gSV9ESVJUWV9QQUdFUzsKIAkJCQlyZWRpcnR5X3RhaWwoaW5vZGUpOwogCQkJfQotCQl9IGVsc2UgaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgewotCQkJLyoKLQkJCSAqIFNvbWVvbmUgcmVkaXJ0aWVkIHRoZSBpbm9kZSB3aGlsZSB3ZXJlIHdyaXRpbmcgYmFjawotCQkJICogdGhlIHBhZ2VzLgotCQkJICovCi0JCQlyZWRpcnR5X3RhaWwoaW5vZGUpOwogCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkpIHsKIAkJCS8qCiAJCQkgKiBUaGUgaW5vZGUgaXMgY2xlYW4sIGludXNlCkBAIC01MDYsNiArNTQ4LDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgdW5waW5fc2JfZm9yX3dyaXRlYmFjayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKipwc2IpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9ICpwc2I7CisKKwlpZiAoc2IpIHsKKwkJdXBfcmVhZCgmc2ItPnNfdW1vdW50KTsKKwkJcHV0X3N1cGVyKHNiKTsKKwkJKnBzYiA9IE5VTEw7CisJfQorfQorCiAvKgogICogRm9yIFdCX1NZTkNfTk9ORSB3cml0ZWJhY2ssIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSB0aGUgc2IgcGlubmVkCiAgKiBiZWZvcmUgY2FsbGluZyB3cml0ZWJhY2suIFNvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIHBpbiBpdCwgc28gaXQgZG9lc24ndApAQCAtNTE1LDExICs1NjgsMjAgQEAKICAqIDEgaWYgd2UgZmFpbGVkLgogICovCiBzdGF0aWMgaW50IHBpbl9zYl9mb3Jfd3JpdGViYWNrKHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAotCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHN1cGVyX2Jsb2NrICoqcHNiKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAogCS8qCisJICogSWYgdGhpcyBzYiBpcyBhbHJlYWR5IHBpbm5lZCwgbm90aGluZyBtb3JlIHRvIGRvLiBJZiBub3QgYW5kCisJICogKnBzYiBpcyBub24tTlVMTCwgdW5waW4gdGhlIG9sZCBvbmUgZmlyc3QKKwkgKi8KKwlpZiAoc2IgPT0gKnBzYikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKnBzYikKKwkJdW5waW5fc2JfZm9yX3dyaXRlYmFjayhwc2IpOworCisJLyoKIAkgKiBDYWxsZXIgbXVzdCBhbHJlYWR5IGhvbGQgdGhlIHJlZiBmb3IgdGhpcwogCSAqLwogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkgewpAQCAtNTMyLDcgKzU5NCw3IEBACiAJaWYgKGRvd25fcmVhZF90cnlsb2NrKCZzYi0+c191bW91bnQpKSB7CiAJCWlmIChzYi0+c19yb290KSB7CiAJCQlzcGluX3VubG9jaygmc2JfbG9jayk7Ci0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gcGlubmVkOwogCQl9CiAJCS8qCiAJCSAqIHVtb3VudGVkLCBkcm9wIHJ3c2VtIGFnYWluIGFuZCBmYWxsIHRocm91Z2ggdG8gZmFpbHVyZQpAQCAtNTQzLDI0ICs2MDUsMTUgQEAKIAlzYi0+c19jb3VudC0tOwogCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKIAlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgdW5waW5fc2JfZm9yX3dyaXRlYmFjayhzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKLQkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKLQotCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkKLQkJcmV0dXJuOwotCi0JdXBfcmVhZCgmc2ItPnNfdW1vdW50KTsKLQlwdXRfc3VwZXIoc2IpOworcGlubmVkOgorCSpwc2IgPSBzYjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgd3JpdGViYWNrX2lub2Rlc193YihzdHJ1Y3QgYmRpX3dyaXRlYmFjayAqd2IsCiAJCQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHdiYy0+c2I7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHdiYy0+c2IsICpwaW5fc2IgPSBOVUxMOwogCWNvbnN0IGludCBpc19ibGtkZXZfc2IgPSBzYl9pc19ibGtkZXZfc2Ioc2IpOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwkvKiBsaXZlbG9jayBhdm9pZGFuY2UgKi8KIApAQCAtNjE5LDcgKzY3Miw3IEBACiAJCWlmIChpbm9kZV9kaXJ0aWVkX2FmdGVyKGlub2RlLCBzdGFydCkpCiAJCQlicmVhazsKIAotCQlpZiAocGluX3NiX2Zvcl93cml0ZWJhY2sod2JjLCBpbm9kZSkpIHsKKwkJaWYgKHBpbl9zYl9mb3Jfd3JpdGViYWNrKHdiYywgaW5vZGUsICZwaW5fc2IpKSB7CiAJCQlyZXF1ZXVlX2lvKGlub2RlKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC02MjgsNyArNjgxLDYgQEAKIAkJX19pZ2V0KGlub2RlKTsKIAkJcGFnZXNfc2tpcHBlZCA9IHdiYy0+cGFnZXNfc2tpcHBlZDsKIAkJd3JpdGViYWNrX3NpbmdsZV9pbm9kZShpbm9kZSwgd2JjKTsKLQkJdW5waW5fc2JfZm9yX3dyaXRlYmFjayh3YmMsIGlub2RlKTsKIAkJaWYgKHdiYy0+cGFnZXNfc2tpcHBlZCAhPSBwYWdlc19za2lwcGVkKSB7CiAJCQkvKgogCQkJICogd3JpdGViYWNrIGlzIG5vdCBtYWtpbmcgcHJvZ3Jlc3MgZHVlIHRvIGxvY2tlZApAQCAtNjQ4LDYgKzcwMCw4IEBACiAJCQl3YmMtPm1vcmVfaW8gPSAxOwogCX0KIAorCXVucGluX3NiX2Zvcl93cml0ZWJhY2soJnBpbl9zYik7CisKIAlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CiAJLyogTGVhdmUgYW55IHVud3JpdHRlbiBpbm9kZXMgb24gYl9pbyAqLwogfQpAQCAtNzA2LDYgKzc2MCw3IEBACiAJfTsKIAl1bnNpZ25lZCBsb25nIG9sZGVzdF9qaWY7CiAJbG9uZyB3cm90ZSA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZTsKIAogCWlmICh3YmMuZm9yX2t1cGRhdGUpIHsKIAkJd2JjLm9sZGVyX3RoYW5fdGhpcyA9ICZvbGRlc3RfamlmOwpAQCAtNzE5LDIwICs3NzQsMTYgQEAKIAogCWZvciAoOzspIHsKIAkJLyoKLQkJICogRG9uJ3QgZmx1c2ggYW55dGhpbmcgZm9yIG5vbi1pbnRlZ3JpdHkgd3JpdGViYWNrIHdoZXJlCi0JCSAqIG5vIG5yX3BhZ2VzIHdhcyBnaXZlbgorCQkgKiBTdG9wIHdyaXRlYmFjayB3aGVuIG5yX3BhZ2VzIGhhcyBiZWVuIGNvbnN1bWVkCiAJCSAqLwotCQlpZiAoIWFyZ3MtPmZvcl9rdXBkYXRlICYmIGFyZ3MtPm5yX3BhZ2VzIDw9IDAgJiYKLQkJICAgICBhcmdzLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FKQorCQlpZiAoYXJncy0+bnJfcGFnZXMgPD0gMCkKIAkJCWJyZWFrOwogCiAJCS8qCi0JCSAqIElmIG5vIHNwZWNpZmljIHBhZ2VzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMganVzdCBhCi0JCSAqIHBlcmlvZGljIGJhY2tncm91bmQgd3JpdGVvdXQgYW5kIHdlIGFyZSBiZWxvdyB0aGUKLQkJICogYmFja2dyb3VuZCBkaXJ0eSB0aHJlc2hvbGQsIGRvbid0IGRvIGFueXRoaW5nCisJCSAqIEZvciBiYWNrZ3JvdW5kIHdyaXRlb3V0LCBzdG9wIHdoZW4gd2UgYXJlIGJlbG93IHRoZQorCQkgKiBiYWNrZ3JvdW5kIGRpcnR5IHRocmVzaG9sZAogCQkgKi8KLQkJaWYgKGFyZ3MtPmZvcl9rdXBkYXRlICYmIGFyZ3MtPm5yX3BhZ2VzIDw9IDAgJiYKLQkJICAgICFvdmVyX2Jncm91bmRfdGhyZXNoKCkpCisJCWlmIChhcmdzLT5mb3JfYmFja2dyb3VuZCAmJiAhb3Zlcl9iZ3JvdW5kX3RocmVzaCgpKQogCQkJYnJlYWs7CiAKIAkJd2JjLm1vcmVfaW8gPSAwOwpAQCAtNzQ0LDEzICs3OTUsMzIgQEAKIAkJd3JvdGUgKz0gTUFYX1dSSVRFQkFDS19QQUdFUyAtIHdiYy5ucl90b193cml0ZTsKIAogCQkvKgotCQkgKiBJZiB3ZSByYW4gb3V0IG9mIHN0dWZmIHRvIHdyaXRlLCBiYWlsIHVubGVzcyBtb3JlX2lvIGdvdCBzZXQKKwkJICogSWYgd2UgY29uc3VtZWQgZXZlcnl0aGluZywgc2VlIGlmIHdlIGhhdmUgbW9yZQogCQkgKi8KLQkJaWYgKHdiYy5ucl90b193cml0ZSA+IDAgfHwgd2JjLnBhZ2VzX3NraXBwZWQgPiAwKSB7Ci0JCQlpZiAod2JjLm1vcmVfaW8gJiYgIXdiYy5mb3Jfa3VwZGF0ZSkKLQkJCQljb250aW51ZTsKKwkJaWYgKHdiYy5ucl90b193cml0ZSA8PSAwKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIERpZG4ndCB3cml0ZSBldmVyeXRoaW5nIGFuZCB3ZSBkb24ndCBoYXZlIG1vcmUgSU8sIGJhaWwKKwkJICovCisJCWlmICghd2JjLm1vcmVfaW8pCiAJCQlicmVhazsKKwkJLyoKKwkJICogRGlkIHdlIHdyaXRlIHNvbWV0aGluZz8gVHJ5IGZvciBtb3JlCisJCSAqLworCQlpZiAod2JjLm5yX3RvX3dyaXRlIDwgTUFYX1dSSVRFQkFDS19QQUdFUykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBOb3RoaW5nIHdyaXR0ZW4uIFdhaXQgZm9yIHNvbWUgaW5vZGUgdG8KKwkJICogYmVjb21lIGF2YWlsYWJsZSBmb3Igd3JpdGViYWNrLiBPdGhlcndpc2UKKwkJICogd2UnbGwganVzdCBidXN5bG9vcC4KKwkJICovCisJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJCWlmICghbGlzdF9lbXB0eSgmd2ItPmJfbW9yZV9pbykpICB7CisJCQlpbm9kZSA9IGxpc3RfZW50cnkod2ItPmJfbW9yZV9pby5wcmV2LAorCQkJCQkJc3RydWN0IGlub2RlLCBpX2xpc3QpOworCQkJaW5vZGVfd2FpdF9mb3Jfd3JpdGViYWNrKGlub2RlKTsKIAkJfQorCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CiAJfQogCiAJcmV0dXJuIHdyb3RlOwpAQCAtMTA2MCw5ICsxMTMwLDYgQEAKICAqIElmIG9sZGVyX3RoYW5fdGhpcyBpcyBub24tTlVMTCwgdGhlbiBvbmx5IHdyaXRlIG91dCBpbm9kZXMgd2hpY2gKICAqIGhhZCB0aGVpciBmaXJzdCBkaXJ0eWluZyBhdCBhIHRpbWUgZWFybGllciB0aGFuICpvbGRlcl90aGFuX3RoaXMuCiAgKgotICogSWYgd2UncmUgYSBwZGxmdXNoIHRocmVhZCwgdGhlbiBpbXBsZW1lbnQgcGRmbHVzaCBjb2xsaXNpb24gYXZvaWRhbmNlCi0gKiBhZ2FpbnN0IHRoZSBlbnRpcmUgbGlzdC4KLSAqCiAgKiBJZiBgYmRpJyBpcyBub24temVybyB0aGVuIHdlJ3JlIGJlaW5nIGFza2VkIHRvIHdyaXRlYmFjayBhIHNwZWNpZmljIHF1ZXVlLgogICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGJsb2NrZGV2IHN1cGVyYmxvY2sncyBpbm9kZXMgYXJlIGJhY2tlZCBieQogICogYSB2YXJpZXR5IG9mIHF1ZXVlcywgc28gYWxsIGlub2RlcyBhcmUgc2VhcmNoZWQuICBGb3Igb3RoZXIgc3VwZXJibG9ja3MsCkBAIC0xMTQxLDcgKzEyMDgsNyBAQAogCW5yX3RvX3dyaXRlID0gbnJfZGlydHkgKyBucl91bnN0YWJsZSArCiAJCQkoaW5vZGVzX3N0YXQubnJfaW5vZGVzIC0gaW5vZGVzX3N0YXQubnJfdW51c2VkKTsKIAotCWJkaV93cml0ZWJhY2tfYWxsKHNiLCBucl90b193cml0ZSk7CisJYmRpX3N0YXJ0X3dyaXRlYmFjayhzYi0+c19iZGksIHNiLCBucl90b193cml0ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHdyaXRlYmFja19pbm9kZXNfc2IpOwogCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuYwppbmRleCBlNzAzNjU0Li45OTJmNmM5IDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rpci5jCisrKyBiL2ZzL2Z1c2UvZGlyLmMKQEAgLTEyNzYsMTQgKzEyNzYsOSBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgewotCQl1bnNpZ25lZCBsb25nIGxpbWl0OwotCQlpZiAoSVNfU1dBUEZJTEUoaW5vZGUpKQotCQkJcmV0dXJuIC1FVFhUQlNZOwotCQlsaW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfRlNJWkVdLnJsaW1fY3VyOwotCQlpZiAobGltaXQgIT0gUkxJTV9JTkZJTklUWSAmJiBhdHRyLT5pYV9zaXplID4gKGxvZmZfdCkgbGltaXQpIHsKLQkJCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwotCQkJcmV0dXJuIC1FRkJJRzsKLQkJfQorCQllcnIgPSBpbm9kZV9uZXdzaXplX29rKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJCWlzX3RydW5jYXRlID0gdHJ1ZTsKIAl9CiAKQEAgLTEzNTAsOCArMTM0NSw3IEBACiAJICogRlVTRV9OT1dSSVRFLCBvdGhlcndpc2UgZnVzZV9sYXVuZGVyX3BhZ2UoKSB3b3VsZCBkZWFkbG9jay4KIAkgKi8KIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiBvbGRzaXplICE9IG91dGFyZy5hdHRyLnNpemUpIHsKLQkJaWYgKG91dGFyZy5hdHRyLnNpemUgPCBvbGRzaXplKQotCQkJZnVzZV90cnVuY2F0ZShpbm9kZS0+aV9tYXBwaW5nLCBvdXRhcmcuYXR0ci5zaXplKTsKKwkJdHJ1bmNhdGVfcGFnZWNhY2hlKGlub2RlLCBvbGRzaXplLCBvdXRhcmcuYXR0ci5zaXplKTsKIAkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIoaW5vZGUtPmlfbWFwcGluZyk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jCmluZGV4IGNiYzQ2NDAuLmEzNDkyZjcgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZmlsZS5jCisrKyBiL2ZzL2Z1c2UvZmlsZS5jCkBAIC0xMzEzLDcgKzEzMTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGZ1c2VfZmlsZV92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGZ1c2VfZmlsZV92bV9vcHMgPSB7CiAJLmNsb3NlCQk9IGZ1c2Vfdm1hX2Nsb3NlLAogCS5mYXVsdAkJPSBmaWxlbWFwX2ZhdWx0LAogCS5wYWdlX21rd3JpdGUJPSBmdXNlX3BhZ2VfbWt3cml0ZSwKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IGZjOWM3OWYuLjAxY2M0NjIgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtNjA2LDggKzYwNiw2IEBACiB2b2lkIGZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXNfY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmdXNlX2F0dHIgKmF0dHIsCiAJCQkJICAgdTY0IGF0dHJfdmFsaWQpOwogCi12b2lkIGZ1c2VfdHJ1bmNhdGUoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBvZmZzZXQpOwotCiAvKioKICAqIEluaXRpYWxpemUgdGhlIGNsaWVudCBkZXZpY2UKICAqLwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IDZkYTk0N2QuLjFhODIyY2UgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTE0MCwxNCArMTQwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBmdXNlX3RydW5jYXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3Qgb2Zmc2V0KQotewotCS8qIFNlZSB2bXRydW5jYXRlKCkgKi8KLQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsIG9mZnNldCArIFBBR0VfU0laRSAtIDEsIDAsIDEpOwotCXRydW5jYXRlX2lub2RlX3BhZ2VzKG1hcHBpbmcsIG9mZnNldCk7Ci0JdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKLX0KLQogdm9pZCBmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzX2NvbW1vbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZnVzZV9hdHRyICphdHRyLAogCQkJCSAgIHU2NCBhdHRyX3ZhbGlkKQogewpAQCAtMjA1LDggKzE5Nyw3IEBACiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIG9sZHNpemUgIT0gYXR0ci0+c2l6ZSkgewotCQlpZiAoYXR0ci0+c2l6ZSA8IG9sZHNpemUpCi0JCQlmdXNlX3RydW5jYXRlKGlub2RlLT5pX21hcHBpbmcsIGF0dHItPnNpemUpOworCQl0cnVuY2F0ZV9wYWdlY2FjaGUoaW5vZGUsIG9sZHNpemUsIGF0dHItPnNpemUpOwogCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMihpbm9kZS0+aV9tYXBwaW5nKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9mcy9nZnMyL2FvcHMuYyBiL2ZzL2dmczIvYW9wcy5jCmluZGV4IDdlYmFlOWEuLjY5NGI1ZDQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYW9wcy5jCisrKyBiL2ZzL2dmczIvYW9wcy5jCkBAIC0xMTM1LDYgKzExMzUsNyBAQAogCS5kaXJlY3RfSU8gPSBnZnMyX2RpcmVjdF9JTywKIAkubWlncmF0ZXBhZ2UgPSBidWZmZXJfbWlncmF0ZV9wYWdlLAogCS5pc19wYXJ0aWFsbHlfdXB0b2RhdGUgPSBibG9ja19pc19wYXJ0aWFsbHlfdXB0b2RhdGUsCisJLmVycm9yX3JlbW92ZV9wYWdlID0gZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGdmczJfb3JkZXJlZF9hb3BzID0gewpAQCAtMTE1MSw2ICsxMTUyLDcgQEAKIAkuZGlyZWN0X0lPID0gZ2ZzMl9kaXJlY3RfSU8sCiAJLm1pZ3JhdGVwYWdlID0gYnVmZmVyX21pZ3JhdGVfcGFnZSwKIAkuaXNfcGFydGlhbGx5X3VwdG9kYXRlID0gYmxvY2tfaXNfcGFydGlhbGx5X3VwdG9kYXRlLAorCS5lcnJvcl9yZW1vdmVfcGFnZSA9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBnZnMyX2pkYXRhX2FvcHMgPSB7CkBAIC0xMTY2LDYgKzExNjgsNyBAQAogCS5pbnZhbGlkYXRlcGFnZSA9IGdmczJfaW52YWxpZGF0ZXBhZ2UsCiAJLnJlbGVhc2VwYWdlID0gZ2ZzMl9yZWxlYXNlcGFnZSwKIAkuaXNfcGFydGlhbGx5X3VwdG9kYXRlID0gYmxvY2tfaXNfcGFydGlhbGx5X3VwdG9kYXRlLAorCS5lcnJvcl9yZW1vdmVfcGFnZSA9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwogCiB2b2lkIGdmczJfc2V0X2FvcHMoc3RydWN0IGlub2RlICppbm9kZSkKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZmlsZS5jIGIvZnMvZ2ZzMi9maWxlLmMKaW5kZXggMTY2ZjM4Zi4uNGViMzA4YSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9maWxlLmMKKysrIGIvZnMvZ2ZzMi9maWxlLmMKQEAgLTQxOCw3ICs0MTgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ2ZzMl92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGdmczJfdm1fb3BzID0gewogCS5mYXVsdCA9IGZpbGVtYXBfZmF1bHQsCiAJLnBhZ2VfbWt3cml0ZSA9IGdmczJfcGFnZV9ta3dyaXRlLAogfTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2lub2RlLmMgYi9mcy9nZnMyL29wc19pbm9kZS5jCmluZGV4IGMzYWMxODAuLjI0NzQzNmMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2lub2RlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfaW5vZGUuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KZGlmZiAtLWdpdCBhL2ZzL2hmcy9idHJlZS5jIGIvZnMvaGZzL2J0cmVlLmMKaW5kZXggOWI5ZDYzOS4uMDUyZjIxNCAxMDA2NDQKLS0tIGEvZnMvaGZzL2J0cmVlLmMKKysrIGIvZnMvaGZzL2J0cmVlLmMKQEAgLTU4LDYgKzU4LDExIEBACiAJfQogCXVubG9ja19uZXdfaW5vZGUodHJlZS0+aW5vZGUpOwogCisJaWYgKCFIRlNfSSh0cmVlLT5pbm9kZSktPmZpcnN0X2Jsb2NrcykgeworCQlwcmludGsoS0VSTl9FUlIgImhmczogaW52YWxpZCBidHJlZSBleHRlbnQgcmVjb3JkcyAoMCBzaXplKS5cbiIpOworCQlnb3RvIGZyZWVfaW5vZGU7CisJfQorCiAJbWFwcGluZyA9IHRyZWUtPmlub2RlLT5pX21hcHBpbmc7CiAJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIDAsIE5VTEwpOwogCWlmIChJU19FUlIocGFnZSkpCmRpZmYgLS1naXQgYS9mcy9oZnMvbWRiLmMgYi9mcy9oZnMvbWRiLmMKaW5kZXggN2I2MTY1Zi4uOGJiZTAzYyAxMDA2NDQKLS0tIGEvZnMvaGZzL21kYi5jCisrKyBiL2ZzL2hmcy9tZGIuYwpAQCAtMzQ0LDEwICszNDQsOCBAQAogCWJyZWxzZShIRlNfU0Ioc2IpLT5tZGJfYmgpOwogCWJyZWxzZShIRlNfU0Ioc2IpLT5hbHRfbWRiX2JoKTsKIAotCWlmIChIRlNfU0Ioc2IpLT5ubHNfaW8pCi0JCXVubG9hZF9ubHMoSEZTX1NCKHNiKS0+bmxzX2lvKTsKLQlpZiAoSEZTX1NCKHNiKS0+bmxzX2Rpc2spCi0JCXVubG9hZF9ubHMoSEZTX1NCKHNiKS0+bmxzX2Rpc2spOworCXVubG9hZF9ubHMoSEZTX1NCKHNiKS0+bmxzX2lvKTsKKwl1bmxvYWRfbmxzKEhGU19TQihzYiktPm5sc19kaXNrKTsKIAogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpSEZTX1NCKHNiKS0+Yml0bWFwLCBQQUdFX1NJWkUgPCA4MTkyID8gMSA6IDApOwogCWtmcmVlKEhGU19TQihzYikpOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9zdXBlci5jIGIvZnMvaGZzcGx1cy9zdXBlci5jCmluZGV4IGMwNzU5ZmUuLjQzMDIyZjMgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvc3VwZXIuYworKysgYi9mcy9oZnNwbHVzL3N1cGVyLmMKQEAgLTIyOSw4ICsyMjksNyBAQAogCWlwdXQoSEZTUExVU19TQihzYikuYWxsb2NfZmlsZSk7CiAJaXB1dChIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKTsKIAlicmVsc2UoSEZTUExVU19TQihzYikuc192aGJoKTsKLQlpZiAoSEZTUExVU19TQihzYikubmxzKQotCQl1bmxvYWRfbmxzKEhGU1BMVVNfU0Ioc2IpLm5scyk7CisJdW5sb2FkX25scyhIRlNQTFVTX1NCKHNiKS5ubHMpOwogCWtmcmVlKHNiLT5zX2ZzX2luZm8pOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCkBAIC00NjQsOCArNDYzLDcgQEAKIAogY2xlYW51cDoKIAloZnNwbHVzX3B1dF9zdXBlcihzYik7Ci0JaWYgKG5scykKLQkJdW5sb2FkX25scyhubHMpOworCXVubG9hZF9ubHMobmxzKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3dyYXBwZXIuYyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCmluZGV4IDE3NWQwOGUuLmJlZDc4YWM4IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3dyYXBwZXIuYworKysgYi9mcy9oZnNwbHVzL3dyYXBwZXIuYwpAQCAtOTksNiArOTksMTAgQEAKIAogCWlmIChoZnNwbHVzX2dldF9sYXN0X3Nlc3Npb24oc2IsICZwYXJ0X3N0YXJ0LCAmcGFydF9zaXplKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCh1NjQpcGFydF9zdGFydCArIHBhcnRfc2l6ZSA+IDB4MTAwMDAwMDAwVUxMKSB7CisJCXByX2VycigiaGZzOiB2b2x1bWVzIGxhcmdlciB0aGFuIDJUQiBhcmUgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJd2hpbGUgKDEpIHsKIAkJYmggPSBzYl9icmVhZDUxMihzYiwgcGFydF9zdGFydCArIEhGU1BMVVNfVk9MSEVBRF9TRUNUT1IsIHZoZHIpOwogCQlpZiAoIWJoKQpkaWZmIC0tZ2l0IGEvZnMvaHVnZXRsYmZzL2lub2RlLmMgYi9mcy9odWdldGxiZnMvaW5vZGUuYwppbmRleCBlYmE2ZDU1Li44N2ExMjU4IDEwMDY0NAotLS0gYS9mcy9odWdldGxiZnMvaW5vZGUuYworKysgYi9mcy9odWdldGxiZnMvaW5vZGUuYwpAQCAtMzgwLDM2ICszODAsMTEgQEAKIAogc3RhdGljIHZvaWQgaHVnZXRsYmZzX2ZvcmdldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSBfX3JlbGVhc2VzKGlub2RlX2xvY2spCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwotCi0JaWYgKCFobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpIHsKLQkJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiAoSV9ESVJUWXxJX1NZTkMpKSkKLQkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX3VudXNlZCk7Ci0JCWlub2Rlc19zdGF0Lm5yX3VudXNlZCsrOwotCQlpZiAoIXNiIHx8IChzYi0+c19mbGFncyAmIE1TX0FDVElWRSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKLQkJCXJldHVybjsKLQkJfQotCQlpbm9kZS0+aV9zdGF0ZSB8PSBJX1dJTExfRlJFRTsKLQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwotCQkvKgotCQkgKiB3cml0ZV9pbm9kZV9ub3cgaXMgYSBub29wIGFzIHdlIHNldCBCRElfQ0FQX05PX1dSSVRFQkFDSwotCQkgKiBpbiBvdXIgYmFja2luZ19kZXZfaW5mby4KLQkJICovCi0JCXdyaXRlX2lub2RlX25vdyhpbm9kZSwgMSk7Ci0JCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7Ci0JCWlub2RlLT5pX3N0YXRlICY9IH5JX1dJTExfRlJFRTsKLQkJaW5vZGVzX3N0YXQubnJfdW51c2VkLS07Ci0JCWhsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9oYXNoKTsKKwlpZiAoZ2VuZXJpY19kZXRhY2hfaW5vZGUoaW5vZGUpKSB7CisJCXRydW5jYXRlX2h1Z2VwYWdlcyhpbm9kZSwgMCk7CisJCWNsZWFyX2lub2RlKGlub2RlKTsKKwkJZGVzdHJveV9pbm9kZShpbm9kZSk7CiAJfQotCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOwotCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOwotCWlub2RlLT5pX3N0YXRlIHw9IElfRlJFRUlORzsKLQlpbm9kZXNfc3RhdC5ucl9pbm9kZXMtLTsKLQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7Ci0JdHJ1bmNhdGVfaHVnZXBhZ2VzKGlub2RlLCAwKTsKLQljbGVhcl9pbm9kZShpbm9kZSk7Ci0JZGVzdHJveV9pbm9kZShpbm9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGh1Z2V0bGJmc19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC05MzYsMTUgKzkxMSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmh1Z2V0bGJmc192ZnNtb3VudDsKIAotc3RhdGljIGludCBjYW5fZG9faHVnZXRsYl9zaG0oaW50IGNyZWF0X2ZsYWdzKQorc3RhdGljIGludCBjYW5fZG9faHVnZXRsYl9zaG0odm9pZCkKIHsKLQlpZiAoY3JlYXRfZmxhZ3MgIT0gSFVHRVRMQl9TSE1GU19JTk9ERSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNhcGFibGUoQ0FQX0lQQ19MT0NLKSkKLQkJcmV0dXJuIDE7Ci0JaWYgKGluX2dyb3VwX3Aoc3lzY3RsX2h1Z2V0bGJfc2htX2dyb3VwKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGNhcGFibGUoQ0FQX0lQQ19MT0NLKSB8fCBpbl9ncm91cF9wKHN5c2N0bF9odWdldGxiX3NobV9ncm91cCk7CiB9CiAKIHN0cnVjdCBmaWxlICpodWdldGxiX2ZpbGVfc2V0dXAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsIGludCBhY2N0ZmxhZywKQEAgLTk2MCw3ICs5MjksNyBAQAogCWlmICghaHVnZXRsYmZzX3Zmc21vdW50KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAotCWlmICghY2FuX2RvX2h1Z2V0bGJfc2htKGNyZWF0X2ZsYWdzKSkgeworCWlmIChjcmVhdF9mbGFncyA9PSBIVUdFVExCX1NITUZTX0lOT0RFICYmICFjYW5fZG9faHVnZXRsYl9zaG0oKSkgewogCQkqdXNlciA9IGN1cnJlbnRfdXNlcigpOwogCQlpZiAodXNlcl9zaG1fbG9jayhzaXplLCAqdXNlcikpIHsKIAkJCVdBUk5fT05DRSgxLApkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggNzY1ODJiMC4uNGQ4ZTNiZSAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC0xMjQxLDcgKzEyNDEsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19kZWxldGVfaW5vZGUpOwogCi1zdGF0aWMgdm9pZCBnZW5lcmljX2ZvcmdldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorLyoqCisgKglnZW5lcmljX2RldGFjaF9pbm9kZSAtIHJlbW92ZSBpbm9kZSBmcm9tIGlub2RlIGxpc3RzCisgKglAaW5vZGU6IGlub2RlIHRvIHJlbW92ZQorICoKKyAqCVJlbW92ZSBpbm9kZSBmcm9tIGlub2RlIGxpc3RzLCB3cml0ZSBpdCBpZiBpdCdzIGRpcnR5LiBUaGlzIGlzIGp1c3QgYW4KKyAqCWludGVybmFsIFZGUyBoZWxwZXIgZXhwb3J0ZWQgZm9yIGh1Z2V0bGJmcy4gRG8gbm90IHVzZSEKKyAqCisgKglSZXR1cm5zIDEgaWYgaW5vZGUgc2hvdWxkIGJlIGNvbXBsZXRlbHkgZGVzdHJveWVkLgorICovCitpbnQgZ2VuZXJpY19kZXRhY2hfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAKQEAgLTEyNTEsNyArMTI2MCw3IEBACiAJCWlub2Rlc19zdGF0Lm5yX3VudXNlZCsrOwogCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19BQ1RJVkUpIHsKIAkJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOwogCQl9CiAJCVdBUk5fT04oaW5vZGUtPmlfc3RhdGUgJiBJX05FVyk7CiAJCWlub2RlLT5pX3N0YXRlIHw9IElfV0lMTF9GUkVFOwpAQCAtMTI2OSw2ICsxMjc4LDE0IEBACiAJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOwogCWlub2Rlc19zdGF0Lm5yX2lub2Rlcy0tOwogCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdlbmVyaWNfZGV0YWNoX2lub2RlKTsKKworc3RhdGljIHZvaWQgZ2VuZXJpY19mb3JnZXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIWdlbmVyaWNfZGV0YWNoX2lub2RlKGlub2RlKSkKKwkJcmV0dXJuOwogCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCiAJCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAljbGVhcl9pbm9kZShpbm9kZSk7CkBAIC0xMzk5LDMxICsxNDE2LDMxIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93OwogCi0JaWYgKG1udF93YW50X3dyaXRlKG1udCkpCi0JCXJldHVybjsKIAlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBTX05PQVRJTUUpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAJaWYgKElTX05PQVRJTUUoaW5vZGUpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCWlmICgoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJaWYgKG1udC0+bW50X2ZsYWdzICYgTU5UX05PQVRJTUUpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAJaWYgKChtbnQtPm1udF9mbGFncyAmIE1OVF9OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJbm93ID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAogCWlmICghcmVsYXRpbWVfbmVlZF91cGRhdGUobW50LCBpbm9kZSwgbm93KSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCWlmICh0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfYXRpbWUsICZub3cpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOworCisJaWYgKG1udF93YW50X3dyaXRlKG1udCkpCisJCXJldHVybjsKIAogCWlub2RlLT5pX2F0aW1lID0gbm93OwogCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7Ci1vdXQ6CiAJbW50X2Ryb3Bfd3JpdGUobW50KTsKIH0KIEVYUE9SVF9TWU1CT0wodG91Y2hfYXRpbWUpOwpAQCAtMTQ0NCwzNCArMTQ2MSwzNyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCB0aW1lc3BlYyBub3c7Ci0JaW50IHN5bmNfaXQgPSAwOwotCWludCBlcnI7CisJZW51bSB7IFNfTVRJTUUgPSAxLCBTX0NUSU1FID0gMiwgU19WRVJTSU9OID0gNCB9IHN5bmNfaXQgPSAwOwogCisJLyogRmlyc3QgdHJ5IHRvIGV4aGF1c3QgYWxsIGF2ZW51ZXMgdG8gbm90IHN5bmMgKi8KIAlpZiAoSVNfTk9DTVRJTUUoaW5vZGUpKQogCQlyZXR1cm47CiAKLQllcnIgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbGUpOwotCWlmIChlcnIpCisJbm93ID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9tdGltZSwgJm5vdykpCisJCXN5bmNfaXQgPSBTX01USU1FOworCisJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfY3RpbWUsICZub3cpKQorCQlzeW5jX2l0IHw9IFNfQ1RJTUU7CisKKwlpZiAoSVNfSV9WRVJTSU9OKGlub2RlKSkKKwkJc3luY19pdCB8PSBTX1ZFUlNJT047CisKKwlpZiAoIXN5bmNfaXQpCiAJCXJldHVybjsKIAotCW5vdyA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7Ci0JaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZub3cpKSB7Ci0JCWlub2RlLT5pX210aW1lID0gbm93OwotCQlzeW5jX2l0ID0gMTsKLQl9CisJLyogRmluYWxseSBhbGxvd2VkIHRvIHdyaXRlPyBUYWtlcyBsb2NrLiAqLworCWlmIChtbnRfd2FudF93cml0ZV9maWxlKGZpbGUpKQorCQlyZXR1cm47CiAKLQlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9jdGltZSwgJm5vdykpIHsKLQkJaW5vZGUtPmlfY3RpbWUgPSBub3c7Ci0JCXN5bmNfaXQgPSAxOwotCX0KLQotCWlmIChJU19JX1ZFUlNJT04oaW5vZGUpKSB7CisJLyogT25seSBjaGFuZ2UgaW5vZGUgaW5zaWRlIHRoZSBsb2NrIHJlZ2lvbiAqLworCWlmIChzeW5jX2l0ICYgU19WRVJTSU9OKQogCQlpbm9kZV9pbmNfaXZlcnNpb24oaW5vZGUpOwotCQlzeW5jX2l0ID0gMTsKLQl9Ci0KLQlpZiAoc3luY19pdCkKLQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKKwlpZiAoc3luY19pdCAmIFNfQ1RJTUUpCisJCWlub2RlLT5pX2N0aW1lID0gbm93OworCWlmIChzeW5jX2l0ICYgU19NVElNRSkKKwkJaW5vZGUtPmlfbXRpbWUgPSBub3c7CisJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKIAltbnRfZHJvcF93cml0ZShmaWxlLT5mX3BhdGgubW50KTsKIH0KIEVYUE9SVF9TWU1CT0woZmlsZV91cGRhdGVfdGltZSk7CkBAIC0xNTk5LDcgKzE2MTksOCBAQAogCWVsc2UgaWYgKFNfSVNTT0NLKG1vZGUpKQogCQlpbm9kZS0+aV9mb3AgPSAmYmFkX3NvY2tfZm9wczsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICJpbml0X3NwZWNpYWxfaW5vZGU6IGJvZ3VzIGlfbW9kZSAoJW8pXG4iLAotCQkgICAgICAgbW9kZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJpbml0X3NwZWNpYWxfaW5vZGU6IGJvZ3VzIGlfbW9kZSAoJW8pIGZvciIKKwkJCQkgICIgaW5vZGUgJXM6JWx1XG4iLCBtb2RlLCBpbm9kZS0+aV9zYi0+c19pZCwKKwkJCQkgIGlub2RlLT5pX2lubyk7CiB9CiBFWFBPUlRfU1lNQk9MKGluaXRfc3BlY2lhbF9pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9pbnRlcm5hbC5oIGIvZnMvaW50ZXJuYWwuaAppbmRleCBkNTVlZjU2Li41MTUxNzViIDEwMDY0NAotLS0gYS9mcy9pbnRlcm5hbC5oCisrKyBiL2ZzL2ludGVybmFsLmgKQEAgLTU3LDYgKzU3LDcgQEAKICAqIG5hbWVzcGFjZS5jCiAgKi8KIGV4dGVybiBpbnQgY29weV9tb3VudF9vcHRpb25zKGNvbnN0IHZvaWQgX191c2VyICosIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gaW50IGNvcHlfbW91bnRfc3RyaW5nKGNvbnN0IHZvaWQgX191c2VyICosIGNoYXIgKiopOwogCiBleHRlcm4gdm9pZCBmcmVlX3Zmc21udChzdHJ1Y3QgdmZzbW91bnQgKik7CiBleHRlcm4gc3RydWN0IHZmc21vdW50ICphbGxvY192ZnNtbnQoY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL2ZzL2lvY3RsLmMgYi9mcy9pb2N0bC5jCmluZGV4IDU2MTI4ODAuLjdiMTdhMTQgMTAwNjQ0Ci0tLSBhL2ZzL2lvY3RsLmMKKysrIGIvZnMvaW9jdGwuYwpAQCAtMTYyLDIwICsxNjIsMjEgQEAKIHN0YXRpYyBpbnQgZmllbWFwX2NoZWNrX3JhbmdlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgICAgIHU2NCBzdGFydCwgdTY0IGxlbiwgdTY0ICpuZXdfbGVuKQogeworCXU2NCBtYXhieXRlcyA9ICh1NjQpIHNiLT5zX21heGJ5dGVzOworCiAJKm5ld19sZW4gPSBsZW47CiAKIAlpZiAobGVuID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHN0YXJ0ID4gc2ItPnNfbWF4Ynl0ZXMpCisJaWYgKHN0YXJ0ID4gbWF4Ynl0ZXMpCiAJCXJldHVybiAtRUZCSUc7CiAKIAkvKgogCSAqIFNocmluayByZXF1ZXN0IHNjb3BlIHRvIHdoYXQgdGhlIGZzIGNhbiBhY3R1YWxseSBoYW5kbGUuCiAJICovCi0JaWYgKChsZW4gPiBzYi0+c19tYXhieXRlcykgfHwKLQkgICAgKHNiLT5zX21heGJ5dGVzIC0gbGVuKSA8IHN0YXJ0KQotCQkqbmV3X2xlbiA9IHNiLT5zX21heGJ5dGVzIC0gc3RhcnQ7CisJaWYgKGxlbiA+IG1heGJ5dGVzIHx8IChtYXhieXRlcyAtIGxlbikgPCBzdGFydCkKKwkJKm5ld19sZW4gPSBtYXhieXRlcyAtIHN0YXJ0OwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9pc29mcy9pbm9kZS5jIGIvZnMvaXNvZnMvaW5vZGUuYwppbmRleCA4NWY5NmJjLi42YjRkY2Q0IDEwMDY0NAotLS0gYS9mcy9pc29mcy9pbm9kZS5jCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTQ2LDEwICs0Niw3IEBACiAjaWZkZWYgQ09ORklHX0pPTElFVAogCWxvY2tfa2VybmVsKCk7CiAKLQlpZiAoc2JpLT5zX25sc19pb2NoYXJzZXQpIHsKLQkJdW5sb2FkX25scyhzYmktPnNfbmxzX2lvY2hhcnNldCk7Ci0JCXNiaS0+c19ubHNfaW9jaGFyc2V0ID0gTlVMTDsKLQl9CisJdW5sb2FkX25scyhzYmktPnNfbmxzX2lvY2hhcnNldCk7CiAKIAl1bmxvY2tfa2VybmVsKCk7CiAjZW5kaWYKQEAgLTkxMiw4ICs5MDksNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiBvdXRfbm9faW5vZGU6CiAjaWZkZWYgQ09ORklHX0pPTElFVAotCWlmIChzYmktPnNfbmxzX2lvY2hhcnNldCkKLQkJdW5sb2FkX25scyhzYmktPnNfbmxzX2lvY2hhcnNldCk7CisJdW5sb2FkX25scyhzYmktPnNfbmxzX2lvY2hhcnNldCk7CiAjZW5kaWYKIAlnb3RvIG91dF9mcmVlc2JpOwogb3V0X25vX3JlYWQ6CmRpZmYgLS1naXQgYS9mcy9qYmQyL2NoZWNrcG9pbnQuYyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCmluZGV4IDVkNzBiM2UuLmNhMGY1ZWIgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY2hlY2twb2ludC5jCisrKyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCkBAIC02NDMsNiArNjQzLDcgQEAKIAogaW50IF9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQogeworCXN0cnVjdCB0cmFuc2FjdGlvbl9jaHBfc3RhdHNfcyAqc3RhdHM7CiAJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CiAJam91cm5hbF90ICpqb3VybmFsOwogCWludCByZXQgPSAwOwpAQCAtNjc5LDYgKzY4MCwxMiBAQAogCiAJLyogT0ssIHRoYXQgd2FzIHRoZSBsYXN0IGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uOiB3ZSBjYW4gbm93CiAJICAgc2FmZWx5IHJlbW92ZSB0aGlzIHRyYW5zYWN0aW9uIGZyb20gdGhlIGxvZyAqLworCXN0YXRzID0gJnRyYW5zYWN0aW9uLT50X2NocF9zdGF0czsKKwlpZiAoc3RhdHMtPmNzX2NocF90aW1lKQorCQlzdGF0cy0+Y3NfY2hwX3RpbWUgPSBqYmQyX3RpbWVfZGlmZihzdGF0cy0+Y3NfY2hwX3RpbWUsCisJCQkJCQkgICAgamlmZmllcyk7CisJdHJhY2VfamJkMl9jaGVja3BvaW50X3N0YXRzKGpvdXJuYWwtPmpfZnNfZGV2LT5iZF9kZXYsCisJCQkJICAgIHRyYW5zYWN0aW9uLT50X3RpZCwgc3RhdHMpOwogCiAJX19qYmQyX2pvdXJuYWxfZHJvcF90cmFuc2FjdGlvbihqb3VybmFsLCB0cmFuc2FjdGlvbik7CiAJa2ZyZWUodHJhbnNhY3Rpb24pOwpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggMjZkOTkxZC4uZDRjZmQ2ZCAxMDA2NDQKLS0tIGEvZnMvamJkMi9jb21taXQuYworKysgYi9mcy9qYmQyL2NvbW1pdC5jCkBAIC00MTAsMTAgKzQxMCwxMCBAQAogCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3luY2hyb25vdXNfY29tbWl0KQogCQl3cml0ZV9vcCA9IFdSSVRFX1NZTkNfUExVRzsKIAl0cmFjZV9qYmQyX2NvbW1pdF9sb2NraW5nKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7Ci0Jc3RhdHMudS5ydW4ucnNfd2FpdCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9tYXhfd2FpdDsKLQlzdGF0cy51LnJ1bi5yc19sb2NrZWQgPSBqaWZmaWVzOwotCXN0YXRzLnUucnVuLnJzX3J1bm5pbmcgPSBqYmQyX3RpbWVfZGlmZihjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhcnQsCi0JCQkJCQlzdGF0cy51LnJ1bi5yc19sb2NrZWQpOworCXN0YXRzLnJ1bi5yc193YWl0ID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X21heF93YWl0OworCXN0YXRzLnJ1bi5yc19sb2NrZWQgPSBqaWZmaWVzOworCXN0YXRzLnJ1bi5yc19ydW5uaW5nID0gamJkMl90aW1lX2RpZmYoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXJ0LAorCQkJCQkgICAgICBzdGF0cy5ydW4ucnNfbG9ja2VkKTsKIAogCXNwaW5fbG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKIAl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3VwZGF0ZXMpIHsKQEAgLTQ4Niw5ICs0ODYsOSBAQAogCWpiZDJfam91cm5hbF9zd2l0Y2hfcmV2b2tlX3RhYmxlKGpvdXJuYWwpOwogCiAJdHJhY2VfamJkMl9jb21taXRfZmx1c2hpbmcoam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKLQlzdGF0cy51LnJ1bi5yc19mbHVzaGluZyA9IGppZmZpZXM7Ci0Jc3RhdHMudS5ydW4ucnNfbG9ja2VkID0gamJkMl90aW1lX2RpZmYoc3RhdHMudS5ydW4ucnNfbG9ja2VkLAotCQkJCQkgICAgICAgc3RhdHMudS5ydW4ucnNfZmx1c2hpbmcpOworCXN0YXRzLnJ1bi5yc19mbHVzaGluZyA9IGppZmZpZXM7CisJc3RhdHMucnVuLnJzX2xvY2tlZCA9IGpiZDJfdGltZV9kaWZmKHN0YXRzLnJ1bi5yc19sb2NrZWQsCisJCQkJCSAgICAgc3RhdHMucnVuLnJzX2ZsdXNoaW5nKTsKIAogCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfRkxVU0g7CiAJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gY29tbWl0X3RyYW5zYWN0aW9uOwpAQCAtNTIzLDExICs1MjMsMTEgQEAKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAogCXRyYWNlX2piZDJfY29tbWl0X2xvZ2dpbmcoam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKLQlzdGF0cy51LnJ1bi5yc19sb2dnaW5nID0gamlmZmllczsKLQlzdGF0cy51LnJ1bi5yc19mbHVzaGluZyA9IGpiZDJfdGltZV9kaWZmKHN0YXRzLnUucnVuLnJzX2ZsdXNoaW5nLAotCQkJCQkJIHN0YXRzLnUucnVuLnJzX2xvZ2dpbmcpOwotCXN0YXRzLnUucnVuLnJzX2Jsb2NrcyA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzOwotCXN0YXRzLnUucnVuLnJzX2Jsb2Nrc19sb2dnZWQgPSAwOworCXN0YXRzLnJ1bi5yc19sb2dnaW5nID0gamlmZmllczsKKwlzdGF0cy5ydW4ucnNfZmx1c2hpbmcgPSBqYmQyX3RpbWVfZGlmZihzdGF0cy5ydW4ucnNfZmx1c2hpbmcsCisJCQkJCSAgICAgICBzdGF0cy5ydW4ucnNfbG9nZ2luZyk7CisJc3RhdHMucnVuLnJzX2Jsb2NrcyA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzOworCXN0YXRzLnJ1bi5yc19ibG9ja3NfbG9nZ2VkID0gMDsKIAogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzIDw9CiAJCSBjb21taXRfdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyk7CkBAIC02OTUsNyArNjk1LDcgQEAKIAkJCQlzdWJtaXRfYmgod3JpdGVfb3AsIGJoKTsKIAkJCX0KIAkJCWNvbmRfcmVzY2hlZCgpOwotCQkJc3RhdHMudS5ydW4ucnNfYmxvY2tzX2xvZ2dlZCArPSBidWZzOworCQkJc3RhdHMucnVuLnJzX2Jsb2Nrc19sb2dnZWQgKz0gYnVmczsKIAogCQkJLyogRm9yY2UgYSBuZXcgZGVzY3JpcHRvciB0byBiZSBnZW5lcmF0ZWQgbmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSByb3VuZCB0aGUgbG9vcC4gKi8KQEAgLTk4OCwzMyArOTg4LDMwIEBACiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfQ09NTUlUKTsKIAogCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGFydCA9IGppZmZpZXM7Ci0Jc3RhdHMudS5ydW4ucnNfbG9nZ2luZyA9IGpiZDJfdGltZV9kaWZmKHN0YXRzLnUucnVuLnJzX2xvZ2dpbmcsCi0JCQkJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhcnQpOworCXN0YXRzLnJ1bi5yc19sb2dnaW5nID0gamJkMl90aW1lX2RpZmYoc3RhdHMucnVuLnJzX2xvZ2dpbmcsCisJCQkJCSAgICAgIGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGFydCk7CiAKIAkvKgotCSAqIEZpbGUgdGhlIHRyYW5zYWN0aW9uIGZvciBoaXN0b3J5CisJICogRmlsZSB0aGUgdHJhbnNhY3Rpb24gc3RhdGlzdGljcwogCSAqLwotCXN0YXRzLnRzX3R5cGUgPSBKQkQyX1NUQVRTX1JVTjsKIAlzdGF0cy50c190aWQgPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkOwotCXN0YXRzLnUucnVuLnJzX2hhbmRsZV9jb3VudCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQ7Ci0Jc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2hpc3RvcnlfbG9jayk7Ci0JbWVtY3B5KGpvdXJuYWwtPmpfaGlzdG9yeSArIGpvdXJuYWwtPmpfaGlzdG9yeV9jdXIsICZzdGF0cywKLQkJCXNpemVvZihzdGF0cykpOwotCWlmICgrK2pvdXJuYWwtPmpfaGlzdG9yeV9jdXIgPT0gam91cm5hbC0+al9oaXN0b3J5X21heCkKLQkJam91cm5hbC0+al9oaXN0b3J5X2N1ciA9IDA7CisJc3RhdHMucnVuLnJzX2hhbmRsZV9jb3VudCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQ7CisJdHJhY2VfamJkMl9ydW5fc3RhdHMoam91cm5hbC0+al9mc19kZXYtPmJkX2RldiwKKwkJCSAgICAgY29tbWl0X3RyYW5zYWN0aW9uLT50X3RpZCwgJnN0YXRzLnJ1bik7CiAKIAkvKgogCSAqIENhbGN1bGF0ZSBvdmVyYWxsIHN0YXRzCiAJICovCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2hpc3RvcnlfbG9jayk7CiAJam91cm5hbC0+al9zdGF0cy50c190aWQrKzsKLQlqb3VybmFsLT5qX3N0YXRzLnUucnVuLnJzX3dhaXQgKz0gc3RhdHMudS5ydW4ucnNfd2FpdDsKLQlqb3VybmFsLT5qX3N0YXRzLnUucnVuLnJzX3J1bm5pbmcgKz0gc3RhdHMudS5ydW4ucnNfcnVubmluZzsKLQlqb3VybmFsLT5qX3N0YXRzLnUucnVuLnJzX2xvY2tlZCArPSBzdGF0cy51LnJ1bi5yc19sb2NrZWQ7Ci0Jam91cm5hbC0+al9zdGF0cy51LnJ1bi5yc19mbHVzaGluZyArPSBzdGF0cy51LnJ1bi5yc19mbHVzaGluZzsKLQlqb3VybmFsLT5qX3N0YXRzLnUucnVuLnJzX2xvZ2dpbmcgKz0gc3RhdHMudS5ydW4ucnNfbG9nZ2luZzsKLQlqb3VybmFsLT5qX3N0YXRzLnUucnVuLnJzX2hhbmRsZV9jb3VudCArPSBzdGF0cy51LnJ1bi5yc19oYW5kbGVfY291bnQ7Ci0Jam91cm5hbC0+al9zdGF0cy51LnJ1bi5yc19ibG9ja3MgKz0gc3RhdHMudS5ydW4ucnNfYmxvY2tzOwotCWpvdXJuYWwtPmpfc3RhdHMudS5ydW4ucnNfYmxvY2tzX2xvZ2dlZCArPSBzdGF0cy51LnJ1bi5yc19ibG9ja3NfbG9nZ2VkOworCWpvdXJuYWwtPmpfc3RhdHMucnVuLnJzX3dhaXQgKz0gc3RhdHMucnVuLnJzX3dhaXQ7CisJam91cm5hbC0+al9zdGF0cy5ydW4ucnNfcnVubmluZyArPSBzdGF0cy5ydW4ucnNfcnVubmluZzsKKwlqb3VybmFsLT5qX3N0YXRzLnJ1bi5yc19sb2NrZWQgKz0gc3RhdHMucnVuLnJzX2xvY2tlZDsKKwlqb3VybmFsLT5qX3N0YXRzLnJ1bi5yc19mbHVzaGluZyArPSBzdGF0cy5ydW4ucnNfZmx1c2hpbmc7CisJam91cm5hbC0+al9zdGF0cy5ydW4ucnNfbG9nZ2luZyArPSBzdGF0cy5ydW4ucnNfbG9nZ2luZzsKKwlqb3VybmFsLT5qX3N0YXRzLnJ1bi5yc19oYW5kbGVfY291bnQgKz0gc3RhdHMucnVuLnJzX2hhbmRsZV9jb3VudDsKKwlqb3VybmFsLT5qX3N0YXRzLnJ1bi5yc19ibG9ja3MgKz0gc3RhdHMucnVuLnJzX2Jsb2NrczsKKwlqb3VybmFsLT5qX3N0YXRzLnJ1bi5yc19ibG9ja3NfbG9nZ2VkICs9IHN0YXRzLnJ1bi5yc19ibG9ja3NfbG9nZ2VkOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2hpc3RvcnlfbG9jayk7CiAKIAljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX0ZJTklTSEVEOwpkaWZmIC0tZ2l0IGEvZnMvamJkMi9qb3VybmFsLmMgYi9mcy9qYmQyL2pvdXJuYWwuYwppbmRleCA1M2I4NmUxLi5iMGFiNTIxIDEwMDY0NAotLS0gYS9mcy9qYmQyL2pvdXJuYWwuYworKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtMTM2LDEwICsxMzYsNiBAQAogCWpvdXJuYWwtPmpfdGFzayA9IGN1cnJlbnQ7CiAJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKIAotCXByaW50ayhLRVJOX0lORk8gImtqb3VybmFsZDIgc3RhcnRpbmc6IHBpZCAlZCwgZGV2ICVzLCAiCi0JICAgICAgICJjb21taXQgaW50ZXJ2YWwgJWxkIHNlY29uZHNcbiIsIGN1cnJlbnQtPnBpZCwKLQkgICAgICAgam91cm5hbC0+al9kZXZuYW1lLCBqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbCAvIEhaKTsKLQogCS8qCiAJICogQW5kIG5vdywgd2FpdCBmb3JldmVyIGZvciBjb21taXQgd2FrZXVwIGV2ZW50cy4KIAkgKi8KQEAgLTIyMyw3ICsyMTksOCBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKIAotCXQgPSBrdGhyZWFkX3J1bihram91cm5hbGQyLCBqb3VybmFsLCAia2pvdXJuYWxkMiIpOworCXQgPSBrdGhyZWFkX3J1bihram91cm5hbGQyLCBqb3VybmFsLCAiamJkMi8lcyIsCisJCQlqb3VybmFsLT5qX2Rldm5hbWUpOwogCWlmIChJU19FUlIodCkpCiAJCXJldHVybiBQVFJfRVJSKHQpOwogCkBAIC02NzksMTUzICs2NzYsNiBAQAogCWludCBtYXg7CiB9OwogCi1zdGF0aWMgdm9pZCAqamJkMl9oaXN0b3J5X3NraXBfZW1wdHkoc3RydWN0IGpiZDJfc3RhdHNfcHJvY19zZXNzaW9uICpzLAotCQkJCQlzdHJ1Y3QgdHJhbnNhY3Rpb25fc3RhdHNfcyAqdHMsCi0JCQkJCWludCBmaXJzdCkKLXsKLQlpZiAodHMgPT0gcy0+c3RhdHMgKyBzLT5tYXgpCi0JCXRzID0gcy0+c3RhdHM7Ci0JaWYgKCFmaXJzdCAmJiB0cyA9PSBzLT5zdGF0cyArIHMtPnN0YXJ0KQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAodHMtPnRzX3R5cGUgPT0gMCkgewotCQl0cysrOwotCQlpZiAodHMgPT0gcy0+c3RhdHMgKyBzLT5tYXgpCi0JCQl0cyA9IHMtPnN0YXRzOwotCQlpZiAodHMgPT0gcy0+c3RhdHMgKyBzLT5zdGFydCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gdHM7Ci0KLX0KLQotc3RhdGljIHZvaWQgKmpiZDJfc2VxX2hpc3Rvcnlfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBqYmQyX3N0YXRzX3Byb2Nfc2Vzc2lvbiAqcyA9IHNlcS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgdHJhbnNhY3Rpb25fc3RhdHNfcyAqdHM7Ci0JaW50IGwgPSAqcG9zOwotCi0JaWYgKGwgPT0gMCkKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQl0cyA9IGpiZDJfaGlzdG9yeV9za2lwX2VtcHR5KHMsIHMtPnN0YXRzICsgcy0+c3RhcnQsIDEpOwotCWlmICghdHMpCi0JCXJldHVybiBOVUxMOwotCWwtLTsKLQl3aGlsZSAobCkgewotCQl0cyA9IGpiZDJfaGlzdG9yeV9za2lwX2VtcHR5KHMsICsrdHMsIDApOwotCQlpZiAoIXRzKQotCQkJYnJlYWs7Ci0JCWwtLTsKLQl9Ci0JcmV0dXJuIHRzOwotfQotCi1zdGF0aWMgdm9pZCAqamJkMl9zZXFfaGlzdG9yeV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgamJkMl9zdGF0c19wcm9jX3Nlc3Npb24gKnMgPSBzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IHRyYW5zYWN0aW9uX3N0YXRzX3MgKnRzID0gdjsKLQotCSsrKnBvczsKLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCi0JCXJldHVybiBqYmQyX2hpc3Rvcnlfc2tpcF9lbXB0eShzLCBzLT5zdGF0cyArIHMtPnN0YXJ0LCAxKTsKLQllbHNlCi0JCXJldHVybiBqYmQyX2hpc3Rvcnlfc2tpcF9lbXB0eShzLCArK3RzLCAwKTsKLX0KLQotc3RhdGljIGludCBqYmQyX3NlcV9oaXN0b3J5X3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IHRyYW5zYWN0aW9uX3N0YXRzX3MgKnRzID0gdjsKLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKLQkJc2VxX3ByaW50ZihzZXEsICIlLTRzICUtNXMgJS01cyAlLTVzICUtNXMgJS01cyAlLTVzICUtNnMgJS01cyAiCi0JCQkJIiUtNXMgJS01cyAlLTVzICUtNXMgJS01c1xuIiwgIlIvQyIsICJ0aWQiLAotCQkJCSJ3YWl0IiwgInJ1biIsICJsb2NrIiwgImZsdXNoIiwgImxvZyIsICJobmRscyIsCi0JCQkJImJsb2NrIiwgImlubG9nIiwgImN0aW1lIiwgIndyaXRlIiwgImRyb3AiLAotCQkJCSJjbG9zZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHRzLT50c190eXBlID09IEpCRDJfU1RBVFNfUlVOKQotCQlzZXFfcHJpbnRmKHNlcSwgIiUtNHMgJS01bHUgJS01dSAlLTV1ICUtNXUgJS01dSAlLTV1ICIKLQkJCQkiJS02bHUgJS01bHUgJS01bHVcbiIsICJSIiwgdHMtPnRzX3RpZCwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKHRzLT51LnJ1bi5yc193YWl0KSwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKHRzLT51LnJ1bi5yc19ydW5uaW5nKSwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKHRzLT51LnJ1bi5yc19sb2NrZWQpLAotCQkJCWppZmZpZXNfdG9fbXNlY3ModHMtPnUucnVuLnJzX2ZsdXNoaW5nKSwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKHRzLT51LnJ1bi5yc19sb2dnaW5nKSwKLQkJCQl0cy0+dS5ydW4ucnNfaGFuZGxlX2NvdW50LAotCQkJCXRzLT51LnJ1bi5yc19ibG9ja3MsCi0JCQkJdHMtPnUucnVuLnJzX2Jsb2Nrc19sb2dnZWQpOwotCWVsc2UgaWYgKHRzLT50c190eXBlID09IEpCRDJfU1RBVFNfQ0hFQ0tQT0lOVCkKLQkJc2VxX3ByaW50ZihzZXEsICIlLTRzICUtNWx1ICU0OHMgJS01dSAlLTVsdSAlLTVsdSAlLTVsdVxuIiwKLQkJCQkiQyIsIHRzLT50c190aWQsICIgIiwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKHRzLT51LmNocC5jc19jaHBfdGltZSksCi0JCQkJdHMtPnUuY2hwLmNzX3dyaXR0ZW4sIHRzLT51LmNocC5jc19kcm9wcGVkLAotCQkJCXRzLT51LmNocC5jc19mb3JjZWRfdG9fY2xvc2UpOwotCWVsc2UKLQkJSl9BU1NFUlQoMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGpiZDJfc2VxX2hpc3Rvcnlfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKLXsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBqYmQyX3NlcV9oaXN0b3J5X29wcyA9IHsKLQkuc3RhcnQgID0gamJkMl9zZXFfaGlzdG9yeV9zdGFydCwKLQkubmV4dCAgID0gamJkMl9zZXFfaGlzdG9yeV9uZXh0LAotCS5zdG9wICAgPSBqYmQyX3NlcV9oaXN0b3J5X3N0b3AsCi0JLnNob3cgICA9IGpiZDJfc2VxX2hpc3Rvcnlfc2hvdywKLX07Ci0KLXN0YXRpYyBpbnQgamJkMl9zZXFfaGlzdG9yeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWpvdXJuYWxfdCAqam91cm5hbCA9IFBERShpbm9kZSktPmRhdGE7Ci0Jc3RydWN0IGpiZDJfc3RhdHNfcHJvY19zZXNzaW9uICpzOwotCWludCByYywgc2l6ZTsKLQotCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOwotCWlmIChzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IHRyYW5zYWN0aW9uX3N0YXRzX3MpICogam91cm5hbC0+al9oaXN0b3J5X21heDsKLQlzLT5zdGF0cyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHMtPnN0YXRzID09IE5VTEwpIHsKLQkJa2ZyZWUocyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlzcGluX2xvY2soJmpvdXJuYWwtPmpfaGlzdG9yeV9sb2NrKTsKLQltZW1jcHkocy0+c3RhdHMsIGpvdXJuYWwtPmpfaGlzdG9yeSwgc2l6ZSk7Ci0Jcy0+bWF4ID0gam91cm5hbC0+al9oaXN0b3J5X21heDsKLQlzLT5zdGFydCA9IGpvdXJuYWwtPmpfaGlzdG9yeV9jdXIgJSBzLT5tYXg7Ci0Jc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfaGlzdG9yeV9sb2NrKTsKLQotCXJjID0gc2VxX29wZW4oZmlsZSwgJmpiZDJfc2VxX2hpc3Rvcnlfb3BzKTsKLQlpZiAocmMgPT0gMCkgewotCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCW0tPnByaXZhdGUgPSBzOwotCX0gZWxzZSB7Ci0JCWtmcmVlKHMtPnN0YXRzKTsKLQkJa2ZyZWUocyk7Ci0JfQotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgaW50IGpiZDJfc2VxX2hpc3RvcnlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgamJkMl9zdGF0c19wcm9jX3Nlc3Npb24gKnMgPSBzZXEtPnByaXZhdGU7Ci0KLQlrZnJlZShzLT5zdGF0cyk7Ci0Ja2ZyZWUocyk7Ci0JcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamJkMl9zZXFfaGlzdG9yeV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSBqYmQyX3NlcV9oaXN0b3J5X29wZW4sCi0JLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlICAgICAgICA9IGpiZDJfc2VxX2hpc3RvcnlfcmVsZWFzZSwKLX07Ci0KIHN0YXRpYyB2b2lkICpqYmQyX3NlcV9pbmZvX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKIAlyZXR1cm4gKnBvcyA/IE5VTEwgOiBTRVFfU1RBUlRfVE9LRU47CkBAIC04NDIsMjkgKzY5MiwyOSBAQAogCiAJaWYgKHYgIT0gU0VRX1NUQVJUX1RPS0VOKQogCQlyZXR1cm4gMDsKLQlzZXFfcHJpbnRmKHNlcSwgIiVsdSB0cmFuc2FjdGlvbiwgZWFjaCB1cHRvICV1IGJsb2Nrc1xuIiwKKwlzZXFfcHJpbnRmKHNlcSwgIiVsdSB0cmFuc2FjdGlvbiwgZWFjaCB1cCB0byAldSBibG9ja3NcbiIsCiAJCQlzLT5zdGF0cy0+dHNfdGlkLAogCQkJcy0+am91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycyk7CiAJaWYgKHMtPnN0YXRzLT50c190aWQgPT0gMCkKIAkJcmV0dXJuIDA7CiAJc2VxX3ByaW50ZihzZXEsICJhdmVyYWdlOiBcbiAgJXVtcyB3YWl0aW5nIGZvciB0cmFuc2FjdGlvblxuIiwKLQkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+dS5ydW4ucnNfd2FpdCAvIHMtPnN0YXRzLT50c190aWQpKTsKKwkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+cnVuLnJzX3dhaXQgLyBzLT5zdGF0cy0+dHNfdGlkKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgICV1bXMgcnVubmluZyB0cmFuc2FjdGlvblxuIiwKLQkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+dS5ydW4ucnNfcnVubmluZyAvIHMtPnN0YXRzLT50c190aWQpKTsKKwkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+cnVuLnJzX3J1bm5pbmcgLyBzLT5zdGF0cy0+dHNfdGlkKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgICV1bXMgdHJhbnNhY3Rpb24gd2FzIGJlaW5nIGxvY2tlZFxuIiwKLQkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+dS5ydW4ucnNfbG9ja2VkIC8gcy0+c3RhdHMtPnRzX3RpZCkpOworCSAgICBqaWZmaWVzX3RvX21zZWNzKHMtPnN0YXRzLT5ydW4ucnNfbG9ja2VkIC8gcy0+c3RhdHMtPnRzX3RpZCkpOwogCXNlcV9wcmludGYoc2VxLCAiICAldW1zIGZsdXNoaW5nIGRhdGEgKGluIG9yZGVyZWQgbW9kZSlcbiIsCi0JICAgIGppZmZpZXNfdG9fbXNlY3Mocy0+c3RhdHMtPnUucnVuLnJzX2ZsdXNoaW5nIC8gcy0+c3RhdHMtPnRzX3RpZCkpOworCSAgICBqaWZmaWVzX3RvX21zZWNzKHMtPnN0YXRzLT5ydW4ucnNfZmx1c2hpbmcgLyBzLT5zdGF0cy0+dHNfdGlkKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgICV1bXMgbG9nZ2luZyB0cmFuc2FjdGlvblxuIiwKLQkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+dS5ydW4ucnNfbG9nZ2luZyAvIHMtPnN0YXRzLT50c190aWQpKTsKKwkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+cnVuLnJzX2xvZ2dpbmcgLyBzLT5zdGF0cy0+dHNfdGlkKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgICVsbHV1cyBhdmVyYWdlIHRyYW5zYWN0aW9uIGNvbW1pdCB0aW1lXG4iLAogCQkgICBkaXZfdTY0KHMtPmpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZSwgMTAwMCkpOwogCXNlcV9wcmludGYoc2VxLCAiICAlbHUgaGFuZGxlcyBwZXIgdHJhbnNhY3Rpb25cbiIsCi0JICAgIHMtPnN0YXRzLT51LnJ1bi5yc19oYW5kbGVfY291bnQgLyBzLT5zdGF0cy0+dHNfdGlkKTsKKwkgICAgcy0+c3RhdHMtPnJ1bi5yc19oYW5kbGVfY291bnQgLyBzLT5zdGF0cy0+dHNfdGlkKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgJWx1IGJsb2NrcyBwZXIgdHJhbnNhY3Rpb25cbiIsCi0JICAgIHMtPnN0YXRzLT51LnJ1bi5yc19ibG9ja3MgLyBzLT5zdGF0cy0+dHNfdGlkKTsKKwkgICAgcy0+c3RhdHMtPnJ1bi5yc19ibG9ja3MgLyBzLT5zdGF0cy0+dHNfdGlkKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgJWx1IGxvZ2dlZCBibG9ja3MgcGVyIHRyYW5zYWN0aW9uXG4iLAotCSAgICBzLT5zdGF0cy0+dS5ydW4ucnNfYmxvY2tzX2xvZ2dlZCAvIHMtPnN0YXRzLT50c190aWQpOworCSAgICBzLT5zdGF0cy0+cnVuLnJzX2Jsb2Nrc19sb2dnZWQgLyBzLT5zdGF0cy0+dHNfdGlkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIwLDcgKzc3MCw3IEBACiAJcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamJkMl9zZXFfaW5mb19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamJkMl9zZXFfaW5mb19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICAgICAgICAgPSBqYmQyX3NlcV9pbmZvX29wZW4sCiAJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCkBAIC05MzQsOCArNzg0LDYgQEAKIHsKIAlqb3VybmFsLT5qX3Byb2NfZW50cnkgPSBwcm9jX21rZGlyKGpvdXJuYWwtPmpfZGV2bmFtZSwgcHJvY19qYmQyX3N0YXRzKTsKIAlpZiAoam91cm5hbC0+al9wcm9jX2VudHJ5KSB7Ci0JCXByb2NfY3JlYXRlX2RhdGEoImhpc3RvcnkiLCBTX0lSVUdPLCBqb3VybmFsLT5qX3Byb2NfZW50cnksCi0JCQkJICZqYmQyX3NlcV9oaXN0b3J5X2ZvcHMsIGpvdXJuYWwpOwogCQlwcm9jX2NyZWF0ZV9kYXRhKCJpbmZvIiwgU19JUlVHTywgam91cm5hbC0+al9wcm9jX2VudHJ5LAogCQkJCSAmamJkMl9zZXFfaW5mb19mb3BzLCBqb3VybmFsKTsKIAl9CkBAIC05NDQsMjcgKzc5Miw5IEBACiBzdGF0aWMgdm9pZCBqYmQyX3N0YXRzX3Byb2NfZXhpdChqb3VybmFsX3QgKmpvdXJuYWwpCiB7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImluZm8iLCBqb3VybmFsLT5qX3Byb2NfZW50cnkpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJoaXN0b3J5Iiwgam91cm5hbC0+al9wcm9jX2VudHJ5KTsKIAlyZW1vdmVfcHJvY19lbnRyeShqb3VybmFsLT5qX2Rldm5hbWUsIHByb2NfamJkMl9zdGF0cyk7CiB9CiAKLXN0YXRpYyB2b2lkIGpvdXJuYWxfaW5pdF9zdGF0cyhqb3VybmFsX3QgKmpvdXJuYWwpCi17Ci0JaW50IHNpemU7Ci0KLQlpZiAoIXByb2NfamJkMl9zdGF0cykKLQkJcmV0dXJuOwotCi0Jam91cm5hbC0+al9oaXN0b3J5X21heCA9IDEwMDsKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCB0cmFuc2FjdGlvbl9zdGF0c19zKSAqIGpvdXJuYWwtPmpfaGlzdG9yeV9tYXg7Ci0Jam91cm5hbC0+al9oaXN0b3J5ID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWpvdXJuYWwtPmpfaGlzdG9yeSkgewotCQlqb3VybmFsLT5qX2hpc3RvcnlfbWF4ID0gMDsKLQkJcmV0dXJuOwotCX0KLQlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9oaXN0b3J5X2xvY2spOwotfQotCiAvKgogICogTWFuYWdlbWVudCBmb3Igam91cm5hbCBjb250cm9sIGJsb2NrczogZnVuY3Rpb25zIHRvIGNyZWF0ZSBhbmQKICAqIGRlc3Ryb3kgam91cm5hbF90IHN0cnVjdHVyZXMsIGFuZCB0byBpbml0aWFsaXNlIGFuZCByZWFkIGV4aXN0aW5nCkBAIC0xMDA5LDcgKzgzOSw3IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlqb3VybmFsX2luaXRfc3RhdHMoam91cm5hbCk7CisJc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfaGlzdG9yeV9sb2NrKTsKIAogCXJldHVybiBqb3VybmFsOwogZmFpbDoKQEAgLTExMTUsNyArOTQ1LDcgQEAKIAl3aGlsZSAoKHAgPSBzdHJjaHIocCwgJy8nKSkpCiAJCSpwID0gJyEnOwogCXAgPSBqb3VybmFsLT5qX2Rldm5hbWUgKyBzdHJsZW4oam91cm5hbC0+al9kZXZuYW1lKTsKLQlzcHJpbnRmKHAsICI6JWx1Iiwgam91cm5hbC0+al9pbm9kZS0+aV9pbm8pOworCXNwcmludGYocCwgIi0lbHUiLCBqb3VybmFsLT5qX2lub2RlLT5pX2lubyk7CiAJamJkX2RlYnVnKDEsCiAJCSAgImpvdXJuYWwgJXA6IGlub2RlICVzLyVsZCwgc2l6ZSAlTGQsIGJpdHMgJWQsIGJsa3NpemUgJWxkXG4iLAogCQkgIGpvdXJuYWwsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDM3ZTZkY2QuLjIyMzRjNzMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC0xNzgsMTMgKzE3OCwxMSBAQAogCXJjID0gamZzX3Vtb3VudChzYik7CiAJaWYgKHJjKQogCQlqZnNfZXJyKCJqZnNfdW1vdW50IGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkIiwgcmMpOwotCWlmIChzYmktPm5sc190YWIpCi0JCXVubG9hZF9ubHMoc2JpLT5ubHNfdGFiKTsKLQlzYmktPm5sc190YWIgPSBOVUxMOworCisJdW5sb2FkX25scyhzYmktPm5sc190YWIpOwogCiAJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoc2JpLT5kaXJlY3RfaW5vZGUtPmlfbWFwcGluZywgMCk7CiAJaXB1dChzYmktPmRpcmVjdF9pbm9kZSk7Ci0Jc2JpLT5kaXJlY3RfaW5vZGUgPSBOVUxMOwogCiAJa2ZyZWUoc2JpKTsKIApAQCAtMzQ3LDggKzM0NSw3IEBACiAKIAlpZiAobmxzX21hcCAhPSAodm9pZCAqKSAtMSkgewogCQkvKiBEaXNjYXJkIG9sZCAoaWYgcmVtb3VudCkgKi8KLQkJaWYgKHNiaS0+bmxzX3RhYikKLQkJCXVubG9hZF9ubHMoc2JpLT5ubHNfdGFiKTsKKwkJdW5sb2FkX25scyhzYmktPm5sc190YWIpOwogCQlzYmktPm5sc190YWIgPSBubHNfbWFwOwogCX0KIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2ZzL2xpYmZzLmMgYi9mcy9saWJmcy5jCmluZGV4IGRjZWMzZDMuLjIxOTU3NmMgMTAwNjQ0Ci0tLSBhL2ZzL2xpYmZzLmMKKysrIGIvZnMvbGliZnMuYwpAQCAtNTI3LDE0ICs1MjcsMTggQEAKIAkJCQljb25zdCB2b2lkICpmcm9tLCBzaXplX3QgYXZhaWxhYmxlKQogewogCWxvZmZfdCBwb3MgPSAqcHBvczsKKwlzaXplX3QgcmV0OworCiAJaWYgKHBvcyA8IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChwb3MgPj0gYXZhaWxhYmxlKQorCWlmIChwb3MgPj0gYXZhaWxhYmxlIHx8ICFjb3VudCkKIAkJcmV0dXJuIDA7CiAJaWYgKGNvdW50ID4gYXZhaWxhYmxlIC0gcG9zKQogCQljb3VudCA9IGF2YWlsYWJsZSAtIHBvczsKLQlpZiAoY29weV90b191c2VyKHRvLCBmcm9tICsgcG9zLCBjb3VudCkpCisJcmV0ID0gY29weV90b191c2VyKHRvLCBmcm9tICsgcG9zLCBjb3VudCk7CisJaWYgKHJldCA9PSBjb3VudCkKIAkJcmV0dXJuIC1FRkFVTFQ7CisJY291bnQgLT0gcmV0OwogCSpwcG9zID0gcG9zICsgY291bnQ7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtNzM1LDEwICs3MzksMTEgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoYXR0ci0+c2V0X2J1ZiwgYnVmLCBzaXplKSkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSBsZW47IC8qIGNsYWltIHdlIGdvdCB0aGUgd2hvbGUgaW5wdXQgKi8KIAlhdHRyLT5zZXRfYnVmW3NpemVdID0gJ1wwJzsKIAl2YWwgPSBzaW1wbGVfc3RydG9sKGF0dHItPnNldF9idWYsIE5VTEwsIDApOwotCWF0dHItPnNldChhdHRyLT5kYXRhLCB2YWwpOworCXJldCA9IGF0dHItPnNldChhdHRyLT5kYXRhLCB2YWwpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gbGVuOyAvKiBvbiBzdWNjZXNzLCBjbGFpbSB3ZSBnb3QgdGhlIHdob2xlIGlucHV0ICovCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZhdHRyLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3hkci5jIGIvZnMvbG9ja2QveGRyLmMKaW5kZXggMDMzNmYyYi4uYjU4M2FiMCAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyLmMKKysrIGIvZnMvbG9ja2QveGRyLmMKQEAgLTgsNyArOCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mcy5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyNC5jIGIvZnMvbG9ja2QveGRyNC5jCmluZGV4IGUxZDUyODYuLmFkOWRiYmMgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3hkcjQuYworKysgYi9mcy9sb2NrZC94ZHI0LmMKQEAgLTksNyArOSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mcy5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgpkaWZmIC0tZ2l0IGEvZnMvbmFtZXNwYWNlLmMgYi9mcy9uYW1lc3BhY2UuYwppbmRleCA3MjMwNzg3Li5iZGMzY2I0IDEwMDY0NAotLS0gYS9mcy9uYW1lc3BhY2UuYworKysgYi9mcy9uYW1lc3BhY2UuYwpAQCAtMTY0MCw3ICsxNjQwLDcgQEAKIHsKIAlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKIAotCWlmICghdHlwZSB8fCAhbWVtY2hyKHR5cGUsIDAsIFBBR0VfU0laRSkpCisJaWYgKCF0eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHdlIG5lZWQgY2FwYWJpbGl0aWVzLi4uICovCkBAIC0xODcxLDYgKzE4NzEsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGNvcHlfbW91bnRfc3RyaW5nKGNvbnN0IHZvaWQgX191c2VyICpkYXRhLCBjaGFyICoqd2hlcmUpCit7CisJY2hhciAqdG1wOworCisJaWYgKCFkYXRhKSB7CisJCSp3aGVyZSA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCXRtcCA9IHN0cm5kdXBfdXNlcihkYXRhLCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIodG1wKSkKKwkJcmV0dXJuIFBUUl9FUlIodG1wKTsKKworCSp3aGVyZSA9IHRtcDsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIEZsYWdzIGlzIGEgMzItYml0IHZhbHVlIHRoYXQgYWxsb3dzIHVwIHRvIDMxIG5vbi1mcyBkZXBlbmRlbnQgZmxhZ3MgdG8KICAqIGJlIGdpdmVuIHRvIHRoZSBtb3VudCgpIGNhbGwgKGllOiByZWFkLW9ubHksIG5vLWRldiwgbm8tc3VpZCBldGMpLgpAQCAtMTkwMCw4ICsxOTE3LDYgQEAKIAogCWlmICghZGlyX25hbWUgfHwgISpkaXJfbmFtZSB8fCAhbWVtY2hyKGRpcl9uYW1lLCAwLCBQQUdFX1NJWkUpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGV2X25hbWUgJiYgIW1lbWNocihkZXZfbmFtZSwgMCwgUEFHRV9TSVpFKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZGF0YV9wYWdlKQogCQkoKGNoYXIgKilkYXRhX3BhZ2UpW1BBR0VfU0laRSAtIDFdID0gMDsKQEAgLTIwNzAsNDAgKzIwODUsNDIgQEAKIFNZU0NBTExfREVGSU5FNShtb3VudCwgY2hhciBfX3VzZXIgKiwgZGV2X25hbWUsIGNoYXIgX191c2VyICosIGRpcl9uYW1lLAogCQljaGFyIF9fdXNlciAqLCB0eXBlLCB1bnNpZ25lZCBsb25nLCBmbGFncywgdm9pZCBfX3VzZXIgKiwgZGF0YSkKIHsKLQlpbnQgcmV0dmFsOworCWludCByZXQ7CisJY2hhciAqa2VybmVsX3R5cGU7CisJY2hhciAqa2VybmVsX2RpcjsKKwljaGFyICprZXJuZWxfZGV2OwogCXVuc2lnbmVkIGxvbmcgZGF0YV9wYWdlOwotCXVuc2lnbmVkIGxvbmcgdHlwZV9wYWdlOwotCXVuc2lnbmVkIGxvbmcgZGV2X3BhZ2U7Ci0JY2hhciAqZGlyX3BhZ2U7CiAKLQlyZXR2YWwgPSBjb3B5X21vdW50X29wdGlvbnModHlwZSwgJnR5cGVfcGFnZSk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7CisJcmV0ID0gY29weV9tb3VudF9zdHJpbmcodHlwZSwgJmtlcm5lbF90eXBlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfdHlwZTsKIAotCWRpcl9wYWdlID0gZ2V0bmFtZShkaXJfbmFtZSk7Ci0JcmV0dmFsID0gUFRSX0VSUihkaXJfcGFnZSk7Ci0JaWYgKElTX0VSUihkaXJfcGFnZSkpCi0JCWdvdG8gb3V0MTsKKwlrZXJuZWxfZGlyID0gZ2V0bmFtZShkaXJfbmFtZSk7CisJaWYgKElTX0VSUihrZXJuZWxfZGlyKSkgeworCQlyZXQgPSBQVFJfRVJSKGtlcm5lbF9kaXIpOworCQlnb3RvIG91dF9kaXI7CisJfQogCi0JcmV0dmFsID0gY29weV9tb3VudF9vcHRpb25zKGRldl9uYW1lLCAmZGV2X3BhZ2UpOwotCWlmIChyZXR2YWwgPCAwKQotCQlnb3RvIG91dDI7CisJcmV0ID0gY29weV9tb3VudF9zdHJpbmcoZGV2X25hbWUsICZrZXJuZWxfZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZGV2OwogCi0JcmV0dmFsID0gY29weV9tb3VudF9vcHRpb25zKGRhdGEsICZkYXRhX3BhZ2UpOwotCWlmIChyZXR2YWwgPCAwKQotCQlnb3RvIG91dDM7CisJcmV0ID0gY29weV9tb3VudF9vcHRpb25zKGRhdGEsICZkYXRhX3BhZ2UpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9kYXRhOwogCi0JcmV0dmFsID0gZG9fbW91bnQoKGNoYXIgKilkZXZfcGFnZSwgZGlyX3BhZ2UsIChjaGFyICopdHlwZV9wYWdlLAotCQkJICBmbGFncywgKHZvaWQgKilkYXRhX3BhZ2UpOworCXJldCA9IGRvX21vdW50KGtlcm5lbF9kZXYsIGtlcm5lbF9kaXIsIGtlcm5lbF90eXBlLCBmbGFncywKKwkJKHZvaWQgKikgZGF0YV9wYWdlKTsKKwogCWZyZWVfcGFnZShkYXRhX3BhZ2UpOwotCi1vdXQzOgotCWZyZWVfcGFnZShkZXZfcGFnZSk7Ci1vdXQyOgotCXB1dG5hbWUoZGlyX3BhZ2UpOwotb3V0MToKLQlmcmVlX3BhZ2UodHlwZV9wYWdlKTsKLQlyZXR1cm4gcmV0dmFsOworb3V0X2RhdGE6CisJa2ZyZWUoa2VybmVsX2Rldik7CitvdXRfZGV2OgorCXB1dG5hbWUoa2VybmVsX2Rpcik7CitvdXRfZGlyOgorCWtmcmVlKGtlcm5lbF90eXBlKTsKK291dF90eXBlOgorCXJldHVybiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9pbm9kZS5jIGIvZnMvbmNwZnMvaW5vZGUuYwppbmRleCBiOTljZTIwLi5jZjk4ZGExIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9pbm9kZS5jCisrKyBiL2ZzL25jcGZzL2lub2RlLmMKQEAgLTc0NiwxNiArNzQ2LDggQEAKIAogI2lmZGVmIENPTkZJR19OQ1BGU19OTFMKIAkvKiB1bmxvYWQgdGhlIE5MUyBjaGFyc2V0cyAqLwotCWlmIChzZXJ2ZXItPm5sc192b2wpCi0JewotCQl1bmxvYWRfbmxzKHNlcnZlci0+bmxzX3ZvbCk7Ci0JCXNlcnZlci0+bmxzX3ZvbCA9IE5VTEw7Ci0JfQotCWlmIChzZXJ2ZXItPm5sc19pbykKLQl7Ci0JCXVubG9hZF9ubHMoc2VydmVyLT5ubHNfaW8pOwotCQlzZXJ2ZXItPm5sc19pbyA9IE5VTEw7Ci0JfQorCXVubG9hZF9ubHMoc2VydmVyLT5ubHNfdm9sKTsKKwl1bmxvYWRfbmxzKHNlcnZlci0+bmxzX2lvKTsKICNlbmRpZiAvKiBDT05GSUdfTkNQRlNfTkxTICovCiAKIAlpZiAoc2VydmVyLT5pbmZvX2ZpbHApCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9pb2N0bC5jIGIvZnMvbmNwZnMvaW9jdGwuYwppbmRleCA1M2E3ZWQ3Li4wZDU4Y2FmIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9pb2N0bC5jCisrKyBiL2ZzL25jcGZzL2lvY3RsLmMKQEAgLTIyMywxMCArMjIzLDggQEAKIAlvbGRzZXRfaW8gPSBzZXJ2ZXItPm5sc19pbzsKIAlzZXJ2ZXItPm5sc19pbyA9IGlvY2hhcnNldDsKIAotCWlmIChvbGRzZXRfY3ApCi0JCXVubG9hZF9ubHMob2xkc2V0X2NwKTsKLQlpZiAob2xkc2V0X2lvKQotCQl1bmxvYWRfbmxzKG9sZHNldF9pbyk7CisJdW5sb2FkX25scyhvbGRzZXRfY3ApOworCXVubG9hZF9ubHMob2xkc2V0X2lvKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbW1hcC5jIGIvZnMvbmNwZnMvbW1hcC5jCmluZGV4IDVkOGRjYjkuLjE1NDU4ZGUgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL21tYXAuYworKysgYi9mcy9uY3Bmcy9tbWFwLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAlyZXR1cm4gVk1fRkFVTFRfTUFKT1I7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbmNwX2ZpbGVfbW1hcCA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG5jcF9maWxlX21tYXAgPQogewogCS5mYXVsdCA9IG5jcF9maWxlX21tYXBfZmF1bHQsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IDE1MjAyNTMuLjk5ZWExOTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTY0OCw4ICs2NDgsNiBAQAogCQkuaG9zdG5hbWUJPSBjbHAtPmNsX2hvc3RuYW1lLAogCQkuYWRkcmVzcwk9IChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xwLT5jbF9hZGRyLAogCQkuYWRkcmxlbgk9IGNscC0+Y2xfYWRkcmxlbiwKLQkJLnByb3RvY29sCT0gc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9UQ1AgPwotCQkJCQkJSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUCwKIAkJLm5mc192ZXJzaW9uCT0gY2xwLT5ycGNfb3BzLT52ZXJzaW9uLAogCQkubm9yZXN2cG9ydAk9IHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9SRVNWUE9SVCA/CiAJCQkJCTEgOiAwLApAQCAtNjYwLDYgKzY1OCwxNCBAQAogCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKQogCQlyZXR1cm4gMDsKIAorCXN3aXRjaCAoY2xwLT5jbF9wcm90bykgeworCQlkZWZhdWx0OgorCQkJbmxtX2luaXQucHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKwkJCWJyZWFrOworCQljYXNlIFhQUlRfVFJBTlNQT1JUX1VEUDoKKwkJCW5sbV9pbml0LnByb3RvY29sID0gSVBQUk9UT19VRFA7CisJfQorCiAJaG9zdCA9IG5sbWNsbnRfaW5pdCgmbmxtX2luaXQpOwogCWlmIChJU19FUlIoaG9zdCkpCiAJCXJldHVybiBQVFJfRVJSKGhvc3QpOwpAQCAtNzg3LDcgKzc5Myw3IEBACiAJZHByaW50aygiLS0+IG5mc19pbml0X3NlcnZlcigpXG4iKTsKIAogI2lmZGVmIENPTkZJR19ORlNfVjMKLQlpZiAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykKKwlpZiAoZGF0YS0+dmVyc2lvbiA9PSAzKQogCQljbF9pbml0LnJwY19vcHMgPSAmbmZzX3YzX2NsaWVudG9wczsKICNlbmRpZgogCkBAIC05NjQsNiArOTcwLDcgQEAKIAl0YXJnZXQtPmFjZGlybWluID0gc291cmNlLT5hY2Rpcm1pbjsKIAl0YXJnZXQtPmFjZGlybWF4ID0gc291cmNlLT5hY2Rpcm1heDsKIAl0YXJnZXQtPmNhcHMgPSBzb3VyY2UtPmNhcHM7CisJdGFyZ2V0LT5vcHRpb25zID0gc291cmNlLT5vcHRpb25zOwogfQogCiAvKgpAQCAtMTE3Myw3ICsxMTgwLDcgQEAKIAkJCQkgICAgICAxLCBmbGFncyAmIE5GU19NT1VOVF9OT1JFU1ZQT1JUKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIGVycm9yOwotCW1lbWNweShjbHAtPmNsX2lwYWRkciwgaXBfYWRkciwgc2l6ZW9mKGNscC0+Y2xfaXBhZGRyKSk7CisJc3RybGNweShjbHAtPmNsX2lwYWRkciwgaXBfYWRkciwgc2l6ZW9mKGNscC0+Y2xfaXBhZGRyKSk7CiAKIAllcnJvciA9IG5mc19pZG1hcF9uZXcoY2xwKTsKIAlpZiAoZXJyb3IgPCAwKSB7CmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyLmMgYi9mcy9uZnMvZGlyLmMKaW5kZXggMzIwNjJjMy4uN2NiMjk4NSAxMDA2NDQKLS0tIGEvZnMvbmZzL2Rpci5jCisrKyBiL2ZzL25mcy9kaXIuYwpAQCAtMTUzNiw2ICsxNTM2LDggQEAKIAkJb2xkX2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCisJbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlKTsKKwogCWRfZHJvcChkZW50cnkpOwogCWVycm9yID0gTkZTX1BST1RPKGRpciktPmxpbmsoaW5vZGUsIGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKIAlpZiAoZXJyb3IgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzL2RpcmVjdC5jIGIvZnMvbmZzL2RpcmVjdC5jCmluZGV4IDZjMzIxMDAuLmUxZDQxNWUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXJlY3QuYworKysgYi9mcy9uZnMvZGlyZWN0LmMKQEAgLTQ1Nyw2ICs0NTcsNyBAQAogCX07CiAJc3RydWN0IHJwY190YXNrX3NldHVwIHRhc2tfc2V0dXBfZGF0YSA9IHsKIAkJLnJwY19jbGllbnQgPSBORlNfQ0xJRU5UKGlub2RlKSwKKwkJLnJwY19tZXNzYWdlID0gJm1zZywKIAkJLmNhbGxiYWNrX29wcyA9ICZuZnNfd3JpdGVfZGlyZWN0X29wcywKIAkJLndvcmtxdWV1ZSA9IG5mc2lvZF93b3JrcXVldWUsCiAJCS5mbGFncyA9IFJQQ19UQVNLX0FTWU5DLApkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZpbGUuYyBiL2ZzL25mcy9maWxlLmMKaW5kZXggNTAyMWI3NS4uZjVmZGQzOSAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZpbGUuYworKysgYi9mcy9uZnMvZmlsZS5jCkBAIC01OSw3ICs1OSw3IEBACiBzdGF0aWMgaW50IG5mc19mbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwogc3RhdGljIGludCBuZnNfc2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUsIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZV9sb2NrICoqZmwpOwogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG5mc19maWxlX3ZtX29wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbmZzX2ZpbGVfdm1fb3BzOwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5mc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBuZnNfZmlsZV9sbHNlZWssCkBAIC01MjUsNiArNTI1LDcgQEAKIAkuZGlyZWN0X0lPID0gbmZzX2RpcmVjdF9JTywKIAkubWlncmF0ZXBhZ2UgPSBuZnNfbWlncmF0ZV9wYWdlLAogCS5sYXVuZGVyX3BhZ2UgPSBuZnNfbGF1bmRlcl9wYWdlLAorCS5lcnJvcl9yZW1vdmVfcGFnZSA9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwogCiAvKgpAQCAtNTcxLDcgKzU3Miw3IEBACiAJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBuZnNfZmlsZV92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG5mc19maWxlX3ZtX29wcyA9IHsKIAkuZmF1bHQgPSBmaWxlbWFwX2ZhdWx0LAogCS5wYWdlX21rd3JpdGUgPSBuZnNfdm1fcGFnZV9ta3dyaXRlLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9mc2NhY2hlLmMgYi9mcy9uZnMvZnNjYWNoZS5jCmluZGV4IDM3OWJlNjcuLjcwZmFkNjkgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9mc2NhY2hlLmMKKysrIGIvZnMvbmZzL2ZzY2FjaGUuYwpAQCAtNTgsMTcgKzU4LDM0IEBACiAvKgogICogR2V0IHRoZSBjYWNoZSBjb29raWUgZm9yIGFuIE5GUyBzdXBlcmJsb2NrLiAgV2UgaGF2ZSB0byBoYW5kbGUKICAqIHVuaXF1aWZpY2F0aW9uIGhlcmUgYmVjYXVzZSB0aGUgY2FjaGUgZG9lc24ndCBkbyBpdCBmb3IgdXMuCisgKgorICogVGhlIGRlZmF1bHQgdW5pcXVpZmllciBpcyBqdXN0IGFuIGVtcHR5IHN0cmluZywgYnV0IGl0IG1heSBiZSBvdmVycmlkZGVuCisgKiBlaXRoZXIgYnkgdGhlICdmc2M9eHh4JyBvcHRpb24gdG8gbW91bnQsIG9yIGJ5IGluaGVyaXRpbmcgaXQgZnJvbSB0aGUgcGFyZW50CisgKiBzdXBlcmJsb2NrIGFjcm9zcyBhbiBhdXRvbW91bnQgcG9pbnQgb2Ygc29tZSBuYXR1cmUuCiAgKi8KLXZvaWQgbmZzX2ZzY2FjaGVfZ2V0X3N1cGVyX2Nvb2tpZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSAgc3RydWN0IG5mc19wYXJzZWRfbW91bnRfZGF0YSAqZGF0YSkKK3ZvaWQgbmZzX2ZzY2FjaGVfZ2V0X3N1cGVyX2Nvb2tpZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICp1bmlxLAorCQkJCSAgc3RydWN0IG5mc19jbG9uZV9tb3VudCAqbW50ZGF0YSkKIHsKIAlzdHJ1Y3QgbmZzX2ZzY2FjaGVfa2V5ICprZXksICp4a2V5OwogCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NCKHNiKTsKIAlzdHJ1Y3QgcmJfbm9kZSAqKnAsICpwYXJlbnQ7Ci0JY29uc3QgY2hhciAqdW5pcSA9IGRhdGEtPmZzY2FjaGVfdW5pcSA/OiAiIjsKIAlpbnQgZGlmZiwgdWxlbjsKIAotCXVsZW4gPSBzdHJsZW4odW5pcSk7CisJaWYgKHVuaXEpIHsKKwkJdWxlbiA9IHN0cmxlbih1bmlxKTsKKwl9IGVsc2UgaWYgKG1udGRhdGEpIHsKKwkJc3RydWN0IG5mc19zZXJ2ZXIgKm1udF9zID0gTkZTX1NCKG1udGRhdGEtPnNiKTsKKwkJaWYgKG1udF9zLT5mc2NhY2hlX2tleSkgeworCQkJdW5pcSA9IG1udF9zLT5mc2NhY2hlX2tleS0+a2V5LnVuaXF1aWZpZXI7CisJCQl1bGVuID0gbW50X3MtPmZzY2FjaGVfa2V5LT5rZXkudW5pcV9sZW47CisJCX0KKwl9CisKKwlpZiAoIXVuaXEpIHsKKwkJdW5pcSA9ICIiOworCQl1bGVuID0gMTsKKwl9CisKIAlrZXkgPSBremFsbG9jKHNpemVvZigqa2V5KSArIHVsZW4sIEdGUF9LRVJORUwpOwogCWlmICgha2V5KQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9mcy9uZnMvZnNjYWNoZS5oIGIvZnMvbmZzL2ZzY2FjaGUuaAppbmRleCA2ZTgwOWJiLi5iOWM1NzJkIDEwMDY0NAotLS0gYS9mcy9uZnMvZnNjYWNoZS5oCisrKyBiL2ZzL25mcy9mc2NhY2hlLmgKQEAgLTc0LDcgKzc0LDggQEAKIGV4dGVybiB2b2lkIG5mc19mc2NhY2hlX3JlbGVhc2VfY2xpZW50X2Nvb2tpZShzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKIAogZXh0ZXJuIHZvaWQgbmZzX2ZzY2FjaGVfZ2V0X3N1cGVyX2Nvb2tpZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKLQkJCQkJIHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGEgKik7CisJCQkJCSBjb25zdCBjaGFyICosCisJCQkJCSBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICopOwogZXh0ZXJuIHZvaWQgbmZzX2ZzY2FjaGVfcmVsZWFzZV9zdXBlcl9jb29raWUoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCiBleHRlcm4gdm9pZCBuZnNfZnNjYWNoZV9pbml0X2lub2RlX2Nvb2tpZShzdHJ1Y3QgaW5vZGUgKik7CkBAIC0xNzMsNyArMTc0LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIG5mc19mc2NhY2hlX2dldF9zdXBlcl9jb29raWUoCiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQlzdHJ1Y3QgbmZzX3BhcnNlZF9tb3VudF9kYXRhICpkYXRhKQorCWNvbnN0IGNoYXIgKnVuaXEsCisJc3RydWN0IG5mc19jbG9uZV9tb3VudCAqbW50ZGF0YSkKIHsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBuZnNfZnNjYWNoZV9yZWxlYXNlX3N1cGVyX2Nvb2tpZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKSB7fQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lub2RlLmMgYi9mcy9uZnMvaW5vZGUuYwppbmRleCAwNjAwMjJiLi5mYWEwOTE4IDEwMDY0NAotLS0gYS9mcy9uZnMvaW5vZGUuYworKysgYi9mcy9uZnMvaW5vZGUuYwpAQCAtNDU4LDQ5ICs0NTgsMjEgQEAKICAqLwogc3RhdGljIGludCBuZnNfdm10cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IG9mZnNldCkKIHsKLQlpZiAoaV9zaXplX3JlYWQoaW5vZGUpIDwgb2Zmc2V0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisJbG9mZl90IG9sZHNpemU7CisJaW50IGVycjsKIAotCQlsaW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfRlNJWkVdLnJsaW1fY3VyOwotCQlpZiAobGltaXQgIT0gUkxJTV9JTkZJTklUWSAmJiBvZmZzZXQgPiBsaW1pdCkKLQkJCWdvdG8gb3V0X3NpZzsKLQkJaWYgKG9mZnNldCA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKQotCQkJZ290byBvdXRfYmlnOwotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCQlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZnNldCk7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJZXJyID0gaW5vZGVfbmV3c2l6ZV9vayhpbm9kZSwgb2Zmc2V0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKIAotCQkvKgotCQkgKiB0cnVuY2F0aW9uIG9mIGluLXVzZSBzd2FwZmlsZXMgaXMgZGlzYWxsb3dlZCAtIGl0IHdvdWxkCi0JCSAqIGNhdXNlIHN1YnNlcXVlbnQgc3dhcG91dCB0byBzY3JpYmJsZSBvbiB0aGUgbm93LWZyZWVkCi0JCSAqIGJsb2Nrcy4KLQkJICovCi0JCWlmIChJU19TV0FQRklMRShpbm9kZSkpCi0JCQlyZXR1cm4gLUVUWFRCU1k7Ci0JCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0KTsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJb2xkc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJaV9zaXplX3dyaXRlKGlub2RlLCBvZmZzZXQpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAotCQkvKgotCQkgKiB1bm1hcF9tYXBwaW5nX3JhbmdlIGlzIGNhbGxlZCB0d2ljZSwgZmlyc3Qgc2ltcGx5IGZvcgotCQkgKiBlZmZpY2llbmN5IHNvIHRoYXQgdHJ1bmNhdGVfaW5vZGVfcGFnZXMgZG9lcyBmZXdlcgotCQkgKiBzaW5nbGUtcGFnZSB1bm1hcHMuICBIb3dldmVyIGFmdGVyIHRoaXMgZmlyc3QgY2FsbCwgYW5kCi0JCSAqIGJlZm9yZSB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBmaW5pc2hlcywgaXQgaXMgcG9zc2libGUgZm9yCi0JCSAqIHByaXZhdGUgcGFnZXMgdG8gYmUgQ09XZWQsIHdoaWNoIHJlbWFpbiBhZnRlcgotCQkgKiB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBmaW5pc2hlcywgaGVuY2UgdGhlIHNlY29uZAotCQkgKiB1bm1hcF9tYXBwaW5nX3JhbmdlIGNhbGwgbXVzdCBiZSBtYWRlIGZvciBjb3JyZWN0bmVzcy4KLQkJICovCi0JCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7Ci0JCXRydW5jYXRlX2lub2RlX3BhZ2VzKG1hcHBpbmcsIG9mZnNldCk7Ci0JCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7Ci0JfQotCXJldHVybiAwOwotb3V0X3NpZzoKLQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKLW91dF9iaWc6Ci0JcmV0dXJuIC1FRkJJRzsKKwl0cnVuY2F0ZV9wYWdlY2FjaGUoaW5vZGUsIG9sZHNpemUsIG9mZnNldCk7CitvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzMnhkci5jIGIvZnMvbmZzL25mczJ4ZHIuYwppbmRleCBjODYyYzkzLi41ZTA3OGIyIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzMnhkci5jCisrKyBiL2ZzL25mcy9uZnMyeGRyLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzcHJvYy5jIGIvZnMvbmZzL25mczNwcm9jLmMKaW5kZXggZWU2YTEzZi4uM2Y4ODgxZCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczNwcm9jLmMKKysrIGIvZnMvbmZzL25mczNwcm9jLmMKQEAgLTcsNyArNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzeGRyLmMgYi9mcy9uZnMvbmZzM3hkci5jCmluZGV4IDM1ODY5YTQuLjVmZTU0OTIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMzeGRyLmMKKysrIGIvZnMvbmZzL25mczN4ZHIuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRuYW1lc3BhY2UuYyBiL2ZzL25mcy9uZnM0bmFtZXNwYWNlLmMKaW5kZXggMjYzNmMyNi4uZmEzNDA4ZiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRuYW1lc3BhY2UuYworKysgYi9mcy9uZnMvbmZzNG5hbWVzcGFjZS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogCW1udF9wYXRoID0gbmZzNF9wYXRobmFtZV9zdHJpbmcoJmxvY2F0aW9uLT5yb290cGF0aCwgcGFnZTIsIFBBR0VfU0laRSk7CiAJaWYgKElTX0VSUihtbnRfcGF0aCkpCi0JCXJldHVybiBtbnQ7CisJCXJldHVybiBFUlJfQ0FTVChtbnRfcGF0aCk7CiAJbW91bnRkYXRhLT5tbnRfcGF0aCA9IG1udF9wYXRoOwogCW1heGJ1ZmxlbiA9IG1udF9wYXRoIC0gMSAtIHBhZ2UyOwogCkBAIC0xMzIsMTUgKzEzMiwxNSBAQAogCQlpZiAoYnVmLT5sZW4gPD0gMCB8fCBidWYtPmxlbiA+PSBtYXhidWZsZW4pCiAJCQljb250aW51ZTsKIAotCQltb3VudGRhdGEtPmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI7Ci0KIAkJaWYgKG1lbWNocihidWYtPmRhdGEsIElQVjZfU0NPUEVfREVMSU1JVEVSLCBidWYtPmxlbikpCiAJCQljb250aW51ZTsKLQkJbW91bnRkYXRhLT5hZGRybGVuID0gbmZzX3BhcnNlX3NlcnZlcl9uYW1lKGJ1Zi0+ZGF0YSwKLQkJCQlidWYtPmxlbiwKLQkJCQltb3VudGRhdGEtPmFkZHIsIG1vdW50ZGF0YS0+YWRkcmxlbik7CisKKwkJbW91bnRkYXRhLT5hZGRybGVuID0gbmZzX3BhcnNlX3NlcnZlcl9uYW1lKGJ1Zi0+ZGF0YSwgYnVmLT5sZW4sCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwogCQlpZiAobW91bnRkYXRhLT5hZGRybGVuID09IDApCiAJCQljb250aW51ZTsKKworCQltb3VudGRhdGEtPmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI7CiAJCXJwY19zZXRfcG9ydChtb3VudGRhdGEtPmFkZHIsIE5GU19QT1JUKTsKIAogCQltZW1jcHkocGFnZTIsIGJ1Zi0+ZGF0YSwgYnVmLT5sZW4pOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCBiZTY1NDRhLi5mZjM3NDU0IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHByb2MuYworKysgYi9mcy9uZnMvbmZzNHByb2MuYwpAQCAtMzYsNyArMzYsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC03MywxMiArNzIsMTcgQEAKIC8qIFByZXZlbnQgbGVha3Mgb2YgTkZTdjQgZXJyb3JzIGludG8gdXNlcmxhbmQgKi8KIHN0YXRpYyBpbnQgbmZzNF9tYXBfZXJyb3JzKGludCBlcnIpCiB7Ci0JaWYgKGVyciA8IC0xMDAwKSB7CisJaWYgKGVyciA+PSAtMTAwMCkKKwkJcmV0dXJuIGVycjsKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgLU5GUzRFUlJfUkVTT1VSQ0U6CisJCXJldHVybiAtRVJFTU9URUlPOworCWRlZmF1bHQ6CiAJCWRwcmludGsoIiVzIGNvdWxkIG5vdCBoYW5kbGUgTkZTdjQgZXJyb3IgJWRcbiIsCiAJCQkJX19mdW5jX18sIC1lcnIpOwotCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CiAJfQotCXJldHVybiBlcnI7CisJcmV0dXJuIC1FSU87CiB9CiAKIC8qCkBAIC0zMDYxLDkgKzMwNjUsNiBAQAogCWlmICh0aW1lX2JlZm9yZShjbHAtPmNsX2xhc3RfcmVuZXdhbCx0aW1lc3RhbXApKQogCQljbHAtPmNsX2xhc3RfcmVuZXdhbCA9IHRpbWVzdGFtcDsKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKLQlkcHJpbnRrKCIlcyBjYWxsaW5nIHB1dF9ycGNjcmVkIG9uIHJwY19jcmVkICVwXG4iLCBfX2Z1bmNfXywKLQkJCQl0YXNrLT50a19tc2cucnBjX2NyZWQpOwotCXB1dF9ycGNjcmVkKHRhc2stPnRrX21zZy5ycGNfY3JlZCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX2NhbGxfb3BzIG5mczRfcmVuZXdfb3BzID0gewpAQCAtNDg3OCw3ICs0ODc5LDYgQEAKIAluZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QoY2xwLCB0YXNrLT50a19tc2cucnBjX3Jlc3ApOwogCWRwcmludGsoIiVzIHJwY19jcmVkICVwXG4iLCBfX2Z1bmNfXywgdGFzay0+dGtfbXNnLnJwY19jcmVkKTsKIAotCXB1dF9ycGNjcmVkKHRhc2stPnRrX21zZy5ycGNfY3JlZCk7CiAJa2ZyZWUodGFzay0+dGtfbXNnLnJwY19hcmdwKTsKIAlrZnJlZSh0YXNrLT50a19tc2cucnBjX3Jlc3ApOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHJlbmV3ZC5jIGIvZnMvbmZzL25mczRyZW5ld2QuYwppbmRleCBlMjdjNmNlLi4wMTU2YzAxIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHJlbmV3ZC5jCisrKyBiL2ZzL25mcy9uZnM0cmVuZXdkLmMKQEAgLTEyNywxMiArMTI3LDYgQEAKIH0KIAogdm9pZAotbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQotewotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnNlcnZlci0+bmZzX2NsaWVudC0+Y2xfcmVuZXdkKTsKLX0KLQotdm9pZAogbmZzNF9raWxsX3JlbmV3ZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2xwLT5jbF9yZW5ld2QpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggY2ZjMzBkMy4uMjBiNGUzMCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczR4ZHIuYworKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CkBAIC01NjgyLDcgKzU2ODEsNiBAQAogCXsgTkZTNEVSUl9TRVJWRVJGQVVMVCwJLUVTRVJWRVJGQVVMVAl9LAogCXsgTkZTNEVSUl9CQURUWVBFLAktRUJBRFRZUEUJfSwKIAl7IE5GUzRFUlJfTE9DS0VELAktRUFHQUlOCQl9LAotCXsgTkZTNEVSUl9SRVNPVVJDRSwJLUVSRU1PVEVJTwl9LAogCXsgTkZTNEVSUl9TWU1MSU5LLAktRUxPT1AJCX0sCiAJeyBORlM0RVJSX09QX0lMTEVHQUwsCS1FT1BOT1RTVVBQCX0sCiAJeyBORlM0RVJSX0RFQURMT0NLLAktRURFQURMSwl9LApkaWZmIC0tZ2l0IGEvZnMvbmZzL3Byb2MuYyBiL2ZzL25mcy9wcm9jLmMKaW5kZXggN2JlNzJkOS4uZWY1ODM4NSAxMDA2NDQKLS0tIGEvZnMvbmZzL3Byb2MuYworKysgYi9mcy9uZnMvcHJvYy5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9zdXBlci5jCmluZGV4IGYxY2MwNTguLjkwYmU1NTEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9zdXBlci5jCisrKyBiL2ZzL25mcy9zdXBlci5jCkBAIC03MjgsNiArNzI4LDI5IEBACiAJdW5sb2NrX2tlcm5lbCgpOwogfQogCitzdGF0aWMgc3RydWN0IG5mc19wYXJzZWRfbW91bnRfZGF0YSAqbmZzX2FsbG9jX3BhcnNlZF9tb3VudF9kYXRhKHVuc2lnbmVkIGludCB2ZXJzaW9uKQoreworCXN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGEgKmRhdGE7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSkgeworCQlkYXRhLT5yc2l6ZQkJPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKKwkJZGF0YS0+d3NpemUJCT0gTkZTX01BWF9GSUxFX0lPX1NJWkU7CisJCWRhdGEtPmFjcmVnbWluCQk9IE5GU19ERUZfQUNSRUdNSU47CisJCWRhdGEtPmFjcmVnbWF4CQk9IE5GU19ERUZfQUNSRUdNQVg7CisJCWRhdGEtPmFjZGlybWluCQk9IE5GU19ERUZfQUNESVJNSU47CisJCWRhdGEtPmFjZGlybWF4CQk9IE5GU19ERUZfQUNESVJNQVg7CisJCWRhdGEtPm1vdW50X3NlcnZlci5wb3J0CT0gTkZTX1VOU1BFQ19QT1JUOworCQlkYXRhLT5uZnNfc2VydmVyLnBvcnQJPSBORlNfVU5TUEVDX1BPUlQ7CisJCWRhdGEtPm5mc19zZXJ2ZXIucHJvdG9jb2wgPSBYUFJUX1RSQU5TUE9SVF9UQ1A7CisJCWRhdGEtPmF1dGhfZmxhdm9yc1swXQk9IFJQQ19BVVRIX1VOSVg7CisJCWRhdGEtPmF1dGhfZmxhdm9yX2xlbgk9IDE7CisJCWRhdGEtPnZlcnNpb24JCT0gdmVyc2lvbjsKKwkJZGF0YS0+bWlub3J2ZXJzaW9uCT0gMDsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisKIC8qCiAgKiBTYW5pdHktY2hlY2sgYSBzZXJ2ZXIgYWRkcmVzcyBwcm92aWRlZCBieSB0aGUgbW91bnQgY29tbWFuZC4KICAqCkBAIC03NTUsMTUgKzc3OCwxMyBAQAogICogU2VsZWN0IGJldHdlZW4gYSBkZWZhdWx0IHBvcnQgdmFsdWUgYW5kIGEgdXNlci1zcGVjaWZpZWQgcG9ydCB2YWx1ZS4KICAqIElmIGEgemVybyB2YWx1ZSBpcyBzZXQsIHRoZW4gYXV0b2JpbmQgd2lsbCBiZSB1c2VkLgogICovCi1zdGF0aWMgdm9pZCBuZnNfc2V0X2RlZmF1bHRfcG9ydChzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3QgaW50IHBhcnNlZF9wb3J0LAorc3RhdGljIHZvaWQgbmZzX3NldF9wb3J0KHN0cnVjdCBzb2NrYWRkciAqc2FwLCBpbnQgKnBvcnQsCiAJCQkJIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRlZmF1bHRfcG9ydCkKIHsKLQl1bnNpZ25lZCBzaG9ydCBwb3J0ID0gZGVmYXVsdF9wb3J0OworCWlmICgqcG9ydCA9PSBORlNfVU5TUEVDX1BPUlQpCisJCSpwb3J0ID0gZGVmYXVsdF9wb3J0OwogCi0JaWYgKHBhcnNlZF9wb3J0ICE9IE5GU19VTlNQRUNfUE9SVCkKLQkJcG9ydCA9IHBhcnNlZF9wb3J0OwotCi0JcnBjX3NldF9wb3J0KHNhcCwgcG9ydCk7CisJcnBjX3NldF9wb3J0KHNhcCwgKnBvcnQpOwogfQogCiAvKgpAQCAtMTIzMiw2ICsxMjUzLDcgQEAKIAkJCWRlZmF1bHQ6CiAJCQkJZGZwcmludGsoTU9VTlQsICJORlM6ICAgdW5yZWNvZ25pemVkICIKIAkJCQkJCSJ0cmFuc3BvcnQgcHJvdG9jb2xcbiIpOworCQkJCWtmcmVlKHN0cmluZyk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE0MzAsMTAgKzE0NTIsMTMgQEAKIAlpbnQgc3RhdHVzOwogCiAJaWYgKGFyZ3MtPm1vdW50X3NlcnZlci52ZXJzaW9uID09IDApIHsKLQkJaWYgKGFyZ3MtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpCi0JCQlhcmdzLT5tb3VudF9zZXJ2ZXIudmVyc2lvbiA9IE5GU19NTlQzX1ZFUlNJT047Ci0JCWVsc2UKLQkJCWFyZ3MtPm1vdW50X3NlcnZlci52ZXJzaW9uID0gTkZTX01OVF9WRVJTSU9OOworCQlzd2l0Y2ggKGFyZ3MtPnZlcnNpb24pIHsKKwkJCWRlZmF1bHQ6CisJCQkJYXJncy0+bW91bnRfc2VydmVyLnZlcnNpb24gPSBORlNfTU5UM19WRVJTSU9OOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWFyZ3MtPm1vdW50X3NlcnZlci52ZXJzaW9uID0gTkZTX01OVF9WRVJTSU9OOworCQl9CiAJfQogCXJlcXVlc3QudmVyc2lvbiA9IGFyZ3MtPm1vdW50X3NlcnZlci52ZXJzaW9uOwogCkBAIC0xNDUxLDcgKzE0NzYsNyBAQAogCQlhcmdzLT5tb3VudF9zZXJ2ZXIuYWRkcmxlbiA9IGFyZ3MtPm5mc19zZXJ2ZXIuYWRkcmxlbjsKIAl9CiAJcmVxdWVzdC5zYWxlbiA9IGFyZ3MtPm1vdW50X3NlcnZlci5hZGRybGVuOwotCW5mc19zZXRfZGVmYXVsdF9wb3J0KHJlcXVlc3Quc2FwLCBhcmdzLT5tb3VudF9zZXJ2ZXIucG9ydCwgMCk7CisJbmZzX3NldF9wb3J0KHJlcXVlc3Quc2FwLCAmYXJncy0+bW91bnRfc2VydmVyLnBvcnQsIDApOwogCiAJLyoKIAkgKiBOb3cgYXNrIHRoZSBtb3VudCBzZXJ2ZXIgdG8gbWFwIG91ciBleHBvcnQgcGF0aApAQCAtMTYzNCwyMCArMTY1OSw2IEBACiAJaWYgKGRhdGEgPT0gTlVMTCkKIAkJZ290byBvdXRfbm9fZGF0YTsKIAotCWFyZ3MtPmZsYWdzCQk9IChORlNfTU9VTlRfVkVSMyB8IE5GU19NT1VOVF9UQ1ApOwotCWFyZ3MtPnJzaXplCQk9IE5GU19NQVhfRklMRV9JT19TSVpFOwotCWFyZ3MtPndzaXplCQk9IE5GU19NQVhfRklMRV9JT19TSVpFOwotCWFyZ3MtPmFjcmVnbWluCQk9IE5GU19ERUZfQUNSRUdNSU47Ci0JYXJncy0+YWNyZWdtYXgJCT0gTkZTX0RFRl9BQ1JFR01BWDsKLQlhcmdzLT5hY2Rpcm1pbgkJPSBORlNfREVGX0FDRElSTUlOOwotCWFyZ3MtPmFjZGlybWF4CQk9IE5GU19ERUZfQUNESVJNQVg7Ci0JYXJncy0+bW91bnRfc2VydmVyLnBvcnQJPSBORlNfVU5TUEVDX1BPUlQ7Ci0JYXJncy0+bmZzX3NlcnZlci5wb3J0CT0gTkZTX1VOU1BFQ19QT1JUOwotCWFyZ3MtPm5mc19zZXJ2ZXIucHJvdG9jb2wgPSBYUFJUX1RSQU5TUE9SVF9UQ1A7Ci0JYXJncy0+YXV0aF9mbGF2b3JzWzBdCT0gUlBDX0FVVEhfVU5JWDsKLQlhcmdzLT5hdXRoX2ZsYXZvcl9sZW4JPSAxOwotCWFyZ3MtPm1pbm9ydmVyc2lvbgk9IDA7Ci0KIAlzd2l0Y2ggKGRhdGEtPnZlcnNpb24pIHsKIAljYXNlIDE6CiAJCWRhdGEtPm5hbWxlbiA9IDA7CkBAIC0xNzU1LDcgKzE3NjYsNyBAQAogCQkJZ290byBvdXRfdjRfbm90X2NvbXBpbGVkOwogI2VuZGlmCiAKLQkJbmZzX3NldF9kZWZhdWx0X3BvcnQoc2FwLCBhcmdzLT5uZnNfc2VydmVyLnBvcnQsIDApOworCQluZnNfc2V0X3BvcnQoc2FwLCAmYXJncy0+bmZzX3NlcnZlci5wb3J0LCAwKTsKIAogCQluZnNfc2V0X21vdW50X3RyYW5zcG9ydF9wcm90b2NvbChhcmdzKTsKIApAQCAtMTc3OCw3ICsxNzg5LDcgQEAKIAl9CiAKICNpZm5kZWYgQ09ORklHX05GU19WMwotCWlmIChhcmdzLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKQorCWlmIChhcmdzLT52ZXJzaW9uID09IDMpCiAJCWdvdG8gb3V0X3YzX25vdF9jb21waWxlZDsKICNlbmRpZiAvKiAhQ09ORklHX05GU19WMyAqLwogCkBAIC0xODM2LDkgKzE4NDcsMTAgQEAKIAkgICAgZGF0YS0+YWNkaXJtaW4gIT0gbmZzcy0+YWNkaXJtaW4gLyBIWiB8fAogCSAgICBkYXRhLT5hY2Rpcm1heCAhPSBuZnNzLT5hY2Rpcm1heCAvIEhaIHx8CiAJICAgIGRhdGEtPnRpbWVvICE9ICgxMFUgKiBuZnNzLT5jbGllbnQtPmNsX3RpbWVvdXQtPnRvX2luaXR2YWwgLyBIWikgfHwKKwkgICAgZGF0YS0+bmZzX3NlcnZlci5wb3J0ICE9IG5mc3MtPnBvcnQgfHwKIAkgICAgZGF0YS0+bmZzX3NlcnZlci5hZGRybGVuICE9IG5mc3MtPm5mc19jbGllbnQtPmNsX2FkZHJsZW4gfHwKLQkgICAgbWVtY21wKCZkYXRhLT5uZnNfc2VydmVyLmFkZHJlc3MsICZuZnNzLT5uZnNfY2xpZW50LT5jbF9hZGRyLAotCQkgICBkYXRhLT5uZnNfc2VydmVyLmFkZHJsZW4pICE9IDApCisJICAgICFycGNfY21wX2FkZHIoKHN0cnVjdCBzb2NrYWRkciAqKSZkYXRhLT5uZnNfc2VydmVyLmFkZHJlc3MsCisJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbmZzcy0+bmZzX2NsaWVudC0+Y2xfYWRkcikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIDA7CkBAIC0xODgxLDYgKzE4OTMsNyBAQAogCWRhdGEtPmFjZGlybWluID0gbmZzcy0+YWNkaXJtaW4gLyBIWjsKIAlkYXRhLT5hY2Rpcm1heCA9IG5mc3MtPmFjZGlybWF4IC8gSFo7CiAJZGF0YS0+dGltZW8gPSAxMFUgKiBuZnNzLT5jbGllbnQtPmNsX3RpbWVvdXQtPnRvX2luaXR2YWwgLyBIWjsKKwlkYXRhLT5uZnNfc2VydmVyLnBvcnQgPSBuZnNzLT5wb3J0OwogCWRhdGEtPm5mc19zZXJ2ZXIuYWRkcmxlbiA9IG5mc3MtPm5mc19jbGllbnQtPmNsX2FkZHJsZW47CiAJbWVtY3B5KCZkYXRhLT5uZnNfc2VydmVyLmFkZHJlc3MsICZuZnNzLT5uZnNfY2xpZW50LT5jbF9hZGRyLAogCQlkYXRhLT5uZnNfc2VydmVyLmFkZHJsZW4pOwpAQCAtMTkzNiw3ICsxOTQ5LDcgQEAKIAlpZiAoZGF0YS0+YnNpemUpCiAJCXNiLT5zX2Jsb2Nrc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPmJzaXplLCAmc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCi0JaWYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgeworCWlmIChzZXJ2ZXItPm5mc19jbGllbnQtPnJwY19vcHMtPnZlcnNpb24gPT0gMykgewogCQkvKiBUaGUgVkZTIHNob3VsZG4ndCBhcHBseSB0aGUgdW1hc2sgdG8gbW9kZSBiaXRzLiBXZSB3aWxsIGRvCiAJCSAqIHNvIG91cnNlbHZlcyB3aGVuIG5lY2Vzc2FyeS4KIAkJICovCkBAIC0xOTYwLDcgKzE5NzMsNyBAQAogCXNiLT5zX2Jsb2Nrc2l6ZSA9IG9sZF9zYi0+c19ibG9ja3NpemU7CiAJc2ItPnNfbWF4Ynl0ZXMgPSBvbGRfc2ItPnNfbWF4Ynl0ZXM7CiAKLQlpZiAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7CisJaWYgKHNlcnZlci0+bmZzX2NsaWVudC0+cnBjX29wcy0+dmVyc2lvbiA9PSAzKSB7CiAJCS8qIFRoZSBWRlMgc2hvdWxkbid0IGFwcGx5IHRoZSB1bWFzayB0byBtb2RlIGJpdHMuIFdlIHdpbGwgZG8KIAkJICogc28gb3Vyc2VsdmVzIHdoZW4gbmVjZXNzYXJ5LgogCQkgKi8KQEAgLTIwOTQsNyArMjEwNyw3IEBACiAJfTsKIAlpbnQgZXJyb3IgPSAtRU5PTUVNOwogCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IG5mc19hbGxvY19wYXJzZWRfbW91bnRfZGF0YSgzKTsKIAltbnRmaCA9IGt6YWxsb2Moc2l6ZW9mKCptbnRmaCksIEdGUF9LRVJORUwpOwogCWlmIChkYXRhID09IE5VTEwgfHwgbW50ZmggPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZV9maDsKQEAgLTIxNDQsNyArMjE1Nyw4IEBACiAJaWYgKCFzLT5zX3Jvb3QpIHsKIAkJLyogaW5pdGlhbCBzdXBlcmJsb2NrL3Jvb3QgY3JlYXRpb24gKi8KIAkJbmZzX2ZpbGxfc3VwZXIocywgZGF0YSk7Ci0JCW5mc19mc2NhY2hlX2dldF9zdXBlcl9jb29raWUocywgZGF0YSk7CisJCW5mc19mc2NhY2hlX2dldF9zdXBlcl9jb29raWUoCisJCQlzLCBkYXRhID8gZGF0YS0+ZnNjYWNoZV91bmlxIDogTlVMTCwgTlVMTCk7CiAJfQogCiAJbW50cm9vdCA9IG5mc19nZXRfcm9vdChzLCBtbnRmaCk7CkBAIC0yMjQ1LDYgKzIyNTksNyBAQAogCWlmICghcy0+c19yb290KSB7CiAJCS8qIGluaXRpYWwgc3VwZXJibG9jay9yb290IGNyZWF0aW9uICovCiAJCW5mc19jbG9uZV9zdXBlcihzLCBkYXRhLT5zYik7CisJCW5mc19mc2NhY2hlX2dldF9zdXBlcl9jb29raWUocywgTlVMTCwgZGF0YSk7CiAJfQogCiAJbW50cm9vdCA9IG5mc19nZXRfcm9vdChzLCBkYXRhLT5maCk7CkBAIC0yMzE3LDcgKzIzMzIsNyBAQAogewogCXN0cnVjdCBzb2NrYWRkciAqc2FwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhcmdzLT5uZnNfc2VydmVyLmFkZHJlc3M7CiAKLQluZnNfc2V0X2RlZmF1bHRfcG9ydChzYXAsIGFyZ3MtPm5mc19zZXJ2ZXIucG9ydCwgTkZTX1BPUlQpOworCW5mc19zZXRfcG9ydChzYXAsICZhcmdzLT5uZnNfc2VydmVyLnBvcnQsIE5GU19QT1JUKTsKIAogCW5mc192YWxpZGF0ZV90cmFuc3BvcnRfcHJvdG9jb2woYXJncyk7CiAKQEAgLTIzNjIsMTggKzIzNzcsNiBAQAogCWlmIChkYXRhID09IE5VTEwpCiAJCWdvdG8gb3V0X25vX2RhdGE7CiAKLQlhcmdzLT5yc2l6ZQkJPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKLQlhcmdzLT53c2l6ZQkJPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKLQlhcmdzLT5hY3JlZ21pbgkJPSBORlNfREVGX0FDUkVHTUlOOwotCWFyZ3MtPmFjcmVnbWF4CQk9IE5GU19ERUZfQUNSRUdNQVg7Ci0JYXJncy0+YWNkaXJtaW4JCT0gTkZTX0RFRl9BQ0RJUk1JTjsKLQlhcmdzLT5hY2Rpcm1heAkJPSBORlNfREVGX0FDRElSTUFYOwotCWFyZ3MtPm5mc19zZXJ2ZXIucG9ydAk9IE5GU19VTlNQRUNfUE9SVDsKLQlhcmdzLT5hdXRoX2ZsYXZvcnNbMF0JPSBSUENfQVVUSF9VTklYOwotCWFyZ3MtPmF1dGhfZmxhdm9yX2xlbgk9IDE7Ci0JYXJncy0+dmVyc2lvbgkJPSA0OwotCWFyZ3MtPm1pbm9ydmVyc2lvbgk9IDA7Ci0KIAlzd2l0Y2ggKGRhdGEtPnZlcnNpb24pIHsKIAljYXNlIDE6CiAJCWlmIChkYXRhLT5ob3N0X2FkZHJsZW4gPiBzaXplb2YoYXJncy0+bmZzX3NlcnZlci5hZGRyZXNzKSkKQEAgLTI1MDgsNyArMjUxMSw4IEBACiAJaWYgKCFzLT5zX3Jvb3QpIHsKIAkJLyogaW5pdGlhbCBzdXBlcmJsb2NrL3Jvb3QgY3JlYXRpb24gKi8KIAkJbmZzNF9maWxsX3N1cGVyKHMpOwotCQluZnNfZnNjYWNoZV9nZXRfc3VwZXJfY29va2llKHMsIGRhdGEpOworCQluZnNfZnNjYWNoZV9nZXRfc3VwZXJfY29va2llKAorCQkJcywgZGF0YSA/IGRhdGEtPmZzY2FjaGVfdW5pcSA6IE5VTEwsIE5VTEwpOwogCX0KIAogCW1udHJvb3QgPSBuZnM0X2dldF9yb290KHMsIG1udGZoKTsKQEAgLTI2NTYsNyArMjY2MCw3IEBACiAJc3RydWN0IG5mc19wYXJzZWRfbW91bnRfZGF0YSAqZGF0YTsKIAlpbnQgZXJyb3IgPSAtRU5PTUVNOwogCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IG5mc19hbGxvY19wYXJzZWRfbW91bnRfZGF0YSg0KTsKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQlnb3RvIG91dF9mcmVlX2RhdGE7CiAKQEAgLTI2ODYsNyArMjY5MCw2IEBACiAJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAJbmZzX3N1cGVyX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc2IpOwogCWtpbGxfYW5vbl9zdXBlcihzYik7Ci0JbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzZXJ2ZXIpOwogCW5mc19mc2NhY2hlX3JlbGVhc2Vfc3VwZXJfY29va2llKHNiKTsKIAluZnNfZnJlZV9zZXJ2ZXIoc2VydmVyKTsKIAlkcHJpbnRrKCI8LS0gJXNcbiIsIF9fZnVuY19fKTsKQEAgLTI3NDEsNiArMjc0NCw3IEBACiAJaWYgKCFzLT5zX3Jvb3QpIHsKIAkJLyogaW5pdGlhbCBzdXBlcmJsb2NrL3Jvb3QgY3JlYXRpb24gKi8KIAkJbmZzNF9jbG9uZV9zdXBlcihzLCBkYXRhLT5zYik7CisJCW5mc19mc2NhY2hlX2dldF9zdXBlcl9jb29raWUocywgTlVMTCwgZGF0YSk7CiAJfQogCiAJbW50cm9vdCA9IG5mczRfZ2V0X3Jvb3QocywgZGF0YS0+ZmgpOwpAQCAtMjgyMiw2ICsyODI2LDcgQEAKIAlpZiAoIXMtPnNfcm9vdCkgewogCQkvKiBpbml0aWFsIHN1cGVyYmxvY2svcm9vdCBjcmVhdGlvbiAqLwogCQluZnM0X2ZpbGxfc3VwZXIocyk7CisJCW5mc19mc2NhY2hlX2dldF9zdXBlcl9jb29raWUocywgTlVMTCwgZGF0YSk7CiAJfQogCiAJbW50cm9vdCA9IG5mczRfZ2V0X3Jvb3QocywgJm1udGZoKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGlkbWFwLmMgYi9mcy9uZnNkL25mczRpZG1hcC5jCmluZGV4IGNkZmE4NmYuLmJhMmMxOTkgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGlkbWFwLmMKKysrIGIvZnMvbmZzZC9uZnM0aWRtYXAuYwpAQCAtMzgsNyArMzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDAwMzg4ZDIuLjVjMDFmYzEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiBleHRlcm4gaW50IG5mc2RfcG9vbF9zdGF0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIGV4dGVybiBpbnQgbmZzZF9wb29sX3N0YXRzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwb29sX3N0YXRzX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwb29sX3N0YXRzX29wZXJhdGlvbnMgPSB7CiAJLm9wZW4JCT0gbmZzZF9wb29sX3N0YXRzX29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvYnRub2RlLmMgYi9mcy9uaWxmczIvYnRub2RlLmMKaW5kZXggNmEyNzExZi4uODRjMjUzOCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2J0bm9kZS5jCisrKyBiL2ZzL25pbGZzMi9idG5vZGUuYwpAQCAtMzYsNiArMzYsNyBAQAogCiB2b2lkIG5pbGZzX2J0bm9kZV9jYWNoZV9pbml0X29uY2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJ0bmMpCiB7CisJbWVtc2V0KGJ0bmMsIDAsIHNpemVvZigqYnRuYykpOwogCUlOSVRfUkFESVhfVFJFRSgmYnRuYy0+cGFnZV90cmVlLCBHRlBfQVRPTUlDKTsKIAlzcGluX2xvY2tfaW5pdCgmYnRuYy0+dHJlZV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmYnRuYy0+cHJpdmF0ZV9saXN0KTsKQEAgLTg2LDYgKzg3LDcgQEAKIAkJCWJyZWxzZShiaCk7CiAJCQlCVUcoKTsKIAkJfQorCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKIAkJYmgtPmJfYmRldiA9IE5JTEZTX0lfTklMRlMoaW5vZGUpLT5uc19iZGV2OwogCQliaC0+Yl9ibG9ja25yID0gYmxvY2tucjsKIAkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOwpAQCAtMjc1LDggKzI3Nyw3IEBACiAJCQkJICAgICAgICJpbnZhbGlkIG9sZGtleSAlbGxkIChuZXdrZXk9JWxsZCkiLAogCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9sZGtleSwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdrZXkpOwotCQlpZiAoIXRlc3Rfc2V0X2J1ZmZlcl9kaXJ0eShvYmgpICYmIFRlc3RTZXRQYWdlRGlydHkob3BhZ2UpKQotCQkJQlVHKCk7CisJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KG9iaCk7CiAKIAkJc3Bpbl9sb2NrX2lycSgmYnRuYy0+dHJlZV9sb2NrKTsKIAkJcmFkaXhfdHJlZV9kZWxldGUoJmJ0bmMtPnBhZ2VfdHJlZSwgb2xka2V5KTsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9kaXIuYyBiL2ZzL25pbGZzMi9kaXIuYwppbmRleCAxYTRmYTA0Li5lMDk3MDk5IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvZGlyLmMKKysrIGIvZnMvbmlsZnMyL2Rpci5jCkBAIC02OTcsNyArNjk3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuaWxmc19kaXJfb3BlcmF0aW9ucyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmlsZnNfZGlyX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCiAJLnJlYWRkaXIJPSBuaWxmc19yZWFkZGlyLApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2ZpbGUuYyBiL2ZzL25pbGZzMi9maWxlLmMKaW5kZXggZmM4Mjc4Yy4uMzAyOTJkZiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2ZpbGUuYworKysgYi9mcy9uaWxmczIvZmlsZS5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG5pbGZzX2ZpbGVfdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBuaWxmc19maWxlX3ZtX29wcyA9IHsKIAkuZmF1bHQJCT0gZmlsZW1hcF9mYXVsdCwKIAkucGFnZV9ta3dyaXRlCT0gbmlsZnNfcGFnZV9ta3dyaXRlLAogfTsKQEAgLTEzNCw3ICsxMzQsNyBAQAogICogV2UgaGF2ZSBtb3N0bHkgTlVMTCdzIGhlcmU6IHRoZSBjdXJyZW50IGRlZmF1bHRzIGFyZSBvayBmb3IKICAqIHRoZSBuaWxmcyBmaWxlc3lzdGVtLgogICovCi1zdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5pbGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmlsZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJPSBkb19zeW5jX3JlYWQsCiAJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvaW5vZGUuYyBiL2ZzL25pbGZzMi9pbm9kZS5jCmluZGV4IDJkMmM1MDEuLjUwNDAyMjAgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9pbm9kZS5jCisrKyBiL2ZzL25pbGZzMi9pbm9kZS5jCkBAIC00MDAsNiArNDAwLDcgQEAKIAlpaS0+aV9kaXJfYWNsID0gU19JU1JFRyhpbm9kZS0+aV9tb2RlKSA/CiAJCTAgOiBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZGlyX2FjbCk7CiAjZW5kaWYKKwlpaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKIAlpaS0+aV9jbm8gPSAwOwogCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZ2VuZXJhdGlvbik7CiAKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9tZHQuYyBiL2ZzL25pbGZzMi9tZHQuYwppbmRleCBiMThjNDk5Li5mNjMyNjExIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbWR0LmMKKysrIGIvZnMvbmlsZnMyL21kdC5jCkBAIC00MzMsNyArNDMzLDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBkZWZfbWR0X2lvcHM7Ci1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWZfbWR0X2ZvcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWZfbWR0X2ZvcHM7CiAKIC8qCiAgKiBOSUxGUzIgdXNlcyBwc2V1ZG8gaW5vZGVzIGZvciBtZXRhIGRhdGEgZmlsZXMgc3VjaCBhcyBEQVQsIGNwZmlsZSwgc3VmaWxlLApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL25pbGZzLmggYi9mcy9uaWxmczIvbmlsZnMuaAppbmRleCBiYWQ3MzY4Li40ZGE2ZjY3IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbmlsZnMuaAorKysgYi9mcy9uaWxmczIvbmlsZnMuaApAQCAtMjk0LDkgKzI5NCw5IEBACiAvKgogICogSW5vZGVzIGFuZCBmaWxlcyBvcGVyYXRpb25zCiAgKi8KLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5pbGZzX2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmlsZnNfZGlyX29wZXJhdGlvbnM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmlsZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwotZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmlsZnNfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmlsZnNfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbmlsZnNfYW9wczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuaWxmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuaWxmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc2VnbWVudC5jIGIvZnMvbmlsZnMyL3NlZ21lbnQuYwppbmRleCA2ODNkZjg5Li42ZWZmNjZhIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc2VnbWVudC5jCisrKyBiL2ZzL25pbGZzMi9zZWdtZW50LmMKQEAgLTI0NjgsMTcgKzI0NjgsMjIgQEAKIAkvKiBDbGVhciByZXF1ZXN0cyAoZXZlbiB3aGVuIHRoZSBjb25zdHJ1Y3Rpb24gZmFpbGVkKSAqLwogCXNwaW5fbG9jaygmc2NpLT5zY19zdGF0ZV9sb2NrKTsKIAotCXNjaS0+c2Nfc3RhdGUgJj0gfk5JTEZTX1NFR0NUT1JfQ09NTUlUOwotCiAJaWYgKHJlcS0+bW9kZSA9PSBTQ19MU0VHX1NSKSB7CisJCXNjaS0+c2Nfc3RhdGUgJj0gfk5JTEZTX1NFR0NUT1JfQ09NTUlUOwogCQlzY2ktPnNjX3NlcV9kb25lID0gcmVxLT5zZXFfYWNjZXB0ZWQ7CiAJCW5pbGZzX3NlZ2N0b3Jfd2FrZXVwKHNjaSwgcmVxLT5zY19lcnIgPyA6IHJlcS0+c2JfZXJyKTsKIAkJc2NpLT5zY19mbHVzaF9yZXF1ZXN0ID0gMDsKLQl9IGVsc2UgaWYgKHJlcS0+bW9kZSA9PSBTQ19GTFVTSF9GSUxFKQotCQlzY2ktPnNjX2ZsdXNoX3JlcXVlc3QgJj0gfkZMVVNIX0ZJTEVfQklUOwotCWVsc2UgaWYgKHJlcS0+bW9kZSA9PSBTQ19GTFVTSF9EQVQpCi0JCXNjaS0+c2NfZmx1c2hfcmVxdWVzdCAmPSB+RkxVU0hfREFUX0JJVDsKKwl9IGVsc2UgeworCQlpZiAocmVxLT5tb2RlID09IFNDX0ZMVVNIX0ZJTEUpCisJCQlzY2ktPnNjX2ZsdXNoX3JlcXVlc3QgJj0gfkZMVVNIX0ZJTEVfQklUOworCQllbHNlIGlmIChyZXEtPm1vZGUgPT0gU0NfRkxVU0hfREFUKQorCQkJc2NpLT5zY19mbHVzaF9yZXF1ZXN0ICY9IH5GTFVTSF9EQVRfQklUOwogCisJCS8qIHJlLWVuYWJsZSB0aW1lciBpZiBjaGVja3BvaW50IGNyZWF0aW9uIHdhcyBub3QgZG9uZSAqLworCQlpZiAoc2NpLT5zY190aW1lciAmJiAoc2NpLT5zY19zdGF0ZSAmIE5JTEZTX1NFR0NUT1JfQ09NTUlUKSAmJgorCQkgICAgdGltZV9iZWZvcmUoamlmZmllcywgc2NpLT5zY190aW1lci0+ZXhwaXJlcykpCisJCQlhZGRfdGltZXIoc2NpLT5zY190aW1lcik7CisJfQogCXNwaW5fdW5sb2NrKCZzY2ktPnNjX3N0YXRlX2xvY2spOwogfQogCmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2Jhc2UuYyBiL2ZzL25scy9ubHNfYmFzZS5jCmluZGV4IDQ3N2QzN2QuLjQ0YTg4YTkgMTAwNjQ0Ci0tLSBhL2ZzL25scy9ubHNfYmFzZS5jCisrKyBiL2ZzL25scy9ubHNfYmFzZS5jCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogCXdoaWxlICgqcyAmJiBsZW4gPiAwKSB7CiAJCWlmICgqcyAmIDB4ODApIHsKIAkJCXNpemUgPSB1dGY4X3RvX3V0ZjMyKHMsIGxlbiwgJnUpOwotCQkJaWYgKHNpemUgPCAwKSB7Ci0JCQkJLyogSWdub3JlIGNoYXJhY3RlciBhbmQgbW92ZSBvbiAqLwotCQkJCXNpemUgPSAxOwotCQkJfSBlbHNlIGlmICh1ID49IFBMQU5FX1NJWkUpIHsKKwkJCWlmIChzaXplIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKHUgPj0gUExBTkVfU0laRSkgewogCQkJCXUgLT0gUExBTkVfU0laRTsKIAkJCQkqb3ArKyA9ICh3Y2hhcl90KSAoU1VSUk9HQVRFX1BBSVIgfAogCQkJCQkJKCh1ID4+IDEwKSAmIFNVUlJPR0FURV9CSVRTKSk7CkBAIC0yNzAsNyArMjcwLDggQEAKIAogdm9pZCB1bmxvYWRfbmxzKHN0cnVjdCBubHNfdGFibGUgKm5scykKIHsKLQltb2R1bGVfcHV0KG5scy0+b3duZXIpOworCWlmIChubHMpCisJCW1vZHVsZV9wdXQobmxzLT5vd25lcik7CiB9CiAKIHN0YXRpYyBjb25zdCB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvZG5vdGlmeS9kbm90aWZ5LmMgYi9mcy9ub3RpZnkvZG5vdGlmeS9kbm90aWZ5LmMKaW5kZXggODI4YTg4OS4uN2U1NGU1MiAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2Rub3RpZnkvZG5vdGlmeS5jCisrKyBiL2ZzL25vdGlmeS9kbm90aWZ5L2Rub3RpZnkuYwpAQCAtOTEsNiArOTEsNyBAQAogCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqZG47CiAJc3RydWN0IGRub3RpZnlfc3RydWN0ICoqcHJldjsKIAlzdHJ1Y3QgZm93bl9zdHJ1Y3QgKmZvd247CisJX191MzIgdGVzdF9tYXNrID0gZXZlbnQtPm1hc2sgJiB+RlNfRVZFTlRfT05fQ0hJTEQ7CiAKIAl0b190ZWxsID0gZXZlbnQtPnRvX3RlbGw7CiAKQEAgLTEwNiw3ICsxMDcsNyBAQAogCXNwaW5fbG9jaygmZW50cnktPmxvY2spOwogCXByZXYgPSAmZG5lbnRyeS0+ZG47CiAJd2hpbGUgKChkbiA9ICpwcmV2KSAhPSBOVUxMKSB7Ci0JCWlmICgoZG4tPmRuX21hc2sgJiBldmVudC0+bWFzaykgPT0gMCkgeworCQlpZiAoKGRuLT5kbl9tYXNrICYgdGVzdF9tYXNrKSA9PSAwKSB7CiAJCQlwcmV2ID0gJmRuLT5kbl9uZXh0OwogCQkJY29udGludWU7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9pbm9kZV9tYXJrLmMgYi9mcy9ub3RpZnkvaW5vZGVfbWFyay5jCmluZGV4IGM4YTA3YzYuLjMxNjVkODUgMTAwNjQ0Ci0tLSBhL2ZzL25vdGlmeS9pbm9kZV9tYXJrLmMKKysrIGIvZnMvbm90aWZ5L2lub2RlX21hcmsuYwpAQCAtMzI0LDExICszMjQsMTEgQEAKIAlzcGluX2xvY2soJmdyb3VwLT5tYXJrX2xvY2spOwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAKLQllbnRyeS0+Z3JvdXAgPSBncm91cDsKLQllbnRyeS0+aW5vZGUgPSBpbm9kZTsKLQogCWxlbnRyeSA9IGZzbm90aWZ5X2ZpbmRfbWFya19lbnRyeShncm91cCwgaW5vZGUpOwogCWlmICghbGVudHJ5KSB7CisJCWVudHJ5LT5ncm91cCA9IGdyb3VwOworCQllbnRyeS0+aW5vZGUgPSBpbm9kZTsKKwogCQlobGlzdF9hZGRfaGVhZCgmZW50cnktPmlfbGlzdCwgJmlub2RlLT5pX2Zzbm90aWZ5X21hcmtfZW50cmllcyk7CiAJCWxpc3RfYWRkKCZlbnRyeS0+Z19saXN0LCAmZ3JvdXAtPm1hcmtfZW50cmllcyk7CiAKZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYyBiL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYwppbmRleCAzODE2ZDU3Li5iOGJmNTNiIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvbm90aWZpY2F0aW9uLmMKKysrIGIvZnMvbm90aWZ5L25vdGlmaWNhdGlvbi5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkJCS8qIHJlbWVtYmVyLCBhZnRlciBvbGQgd2FzIHB1dCBvbiB0aGUgd2FpdF9xIHdlIGFyZW4ndAogCQkJICogYWxsb3dlZCB0byBsb29rIGF0IHRoZSBpbm9kZSBhbnkgbW9yZSwgb25seSB0aGluZwogCQkJICogbGVmdCB0byBjaGVjayB3YXMgaWYgdGhlIGZpbGVfbmFtZSBpcyB0aGUgc2FtZSAqLwotCQkJaWYgKG9sZC0+bmFtZV9sZW4gJiYKKwkJCWlmICghb2xkLT5uYW1lX2xlbiB8fAogCQkJICAgICFzdHJjbXAob2xkLT5maWxlX25hbWUsIG5ldy0+ZmlsZV9uYW1lKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hb3BzLmMgYi9mcy9udGZzL2FvcHMuYwppbmRleCBiMzhmOTQ0Li5jZmNlNTNjIDEwMDY0NAotLS0gYS9mcy9udGZzL2FvcHMuYworKysgYi9mcy9udGZzL2FvcHMuYwpAQCAtMTU1MCw2ICsxNTUwLDcgQEAKIAkubWlncmF0ZXBhZ2UJPSBidWZmZXJfbWlncmF0ZV9wYWdlLAkvKiBNb3ZlIGEgcGFnZSBjYWNoZSBwYWdlIGZyb20KIAkJCQkJCSAgIG9uZSBwaHlzaWNhbCBwYWdlIHRvIGFuCiAJCQkJCQkgICBvdGhlci4gKi8KKwkuZXJyb3JfcmVtb3ZlX3BhZ2UgPSBnZW5lcmljX2Vycm9yX3JlbW92ZV9wYWdlLAogfTsKIAogLyoqCkBAIC0xNTY5LDYgKzE1NzAsNyBAQAogCS5taWdyYXRlcGFnZQk9IGJ1ZmZlcl9taWdyYXRlX3BhZ2UsCS8qIE1vdmUgYSBwYWdlIGNhY2hlIHBhZ2UgZnJvbQogCQkJCQkJICAgb25lIHBoeXNpY2FsIHBhZ2UgdG8gYW4KIAkJCQkJCSAgIG90aGVyLiAqLworCS5lcnJvcl9yZW1vdmVfcGFnZSA9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwogCiAjaWZkZWYgTlRGU19SVwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9zdXBlci5jIGIvZnMvbnRmcy9zdXBlci5jCmluZGV4IGFiYWFhMWMuLjgwYjA0NzcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvc3VwZXIuYworKysgYi9mcy9udGZzL3N1cGVyLmMKQEAgLTIwMSw4ICsyMDEsNyBAQAogCQkJCQkJdiwgb2xkX25scy0+Y2hhcnNldCk7CiAJCQkJbmxzX21hcCA9IG9sZF9ubHM7CiAJCQl9IGVsc2UgLyogbmxzX21hcCAqLyB7Ci0JCQkJaWYgKG9sZF9ubHMpCi0JCQkJCXVubG9hZF9ubHMob2xkX25scyk7CisJCQkJdW5sb2FkX25scyhvbGRfbmxzKTsKIAkJCX0KIAkJfSBlbHNlIGlmICghc3RyY21wKHAsICJ1dGY4IikpIHsKIAkJCWJvb2wgdmFsID0gZmFsc2U7CkBAIC0yNDI3LDEwICsyNDI2LDkgQEAKIAkJbnRmc19mcmVlKHZvbC0+dXBjYXNlKTsKIAkJdm9sLT51cGNhc2UgPSBOVUxMOwogCX0KLQlpZiAodm9sLT5ubHNfbWFwKSB7Ci0JCXVubG9hZF9ubHModm9sLT5ubHNfbWFwKTsKLQkJdm9sLT5ubHNfbWFwID0gTlVMTDsKLQl9CisKKwl1bmxvYWRfbmxzKHZvbC0+bmxzX21hcCk7CisKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKIAlrZnJlZSh2b2wpOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmMgYi9mcy9vY2ZzMi9hb3BzLmMKaW5kZXggNzJlNzYwNi4uZGViMmIxMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5jCisrKyBiL2ZzL29jZnMyL2FvcHMuYwpAQCAtMjAyMiw0ICsyMDIyLDUgQEAKIAkucmVsZWFzZXBhZ2UJCT0gb2NmczJfcmVsZWFzZXBhZ2UsCiAJLm1pZ3JhdGVwYWdlCQk9IGJ1ZmZlcl9taWdyYXRlX3BhZ2UsCiAJLmlzX3BhcnRpYWxseV91cHRvZGF0ZQk9IGJsb2NrX2lzX3BhcnRpYWxseV91cHRvZGF0ZSwKKwkuZXJyb3JfcmVtb3ZlX3BhZ2UJPSBnZW5lcmljX2Vycm9yX3JlbW92ZV9wYWdlLAogfTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDA5Y2MyNWQuLmM0NTJkMTEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtOTY2LDcgKzk2Niw3IEBACiB9CiAjZW5kaWYgIC8qIENPTkZJR19ERUJVR19GUyAqLwogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvMmhiX2RlYnVnX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvMmhiX2RlYnVnX2ZvcHMgPSB7CiAJLm9wZW4gPQkJbzJoYl9kZWJ1Z19vcGVuLAogCS5yZWxlYXNlID0JbzJoYl9kZWJ1Z19yZWxlYXNlLAogCS5yZWFkID0JCW8yaGJfZGVidWdfcmVhZCwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbmV0ZGVidWcuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvbmV0ZGVidWcuYwppbmRleCBjZmIyYmU3Li5kYTc5NGJjIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL25ldGRlYnVnLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9uZXRkZWJ1Zy5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAlyZXR1cm4gc2VxX3JlbGVhc2VfcHJpdmF0ZShpbm9kZSwgZmlsZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5zdF9zZXFfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5zdF9zZXFfZm9wcyA9IHsKIAkub3BlbiA9IG5zdF9mb3Bfb3BlbiwKIAkucmVhZCA9IHNlcV9yZWFkLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCkBAIC0zODgsNyArMzg4LDcgQEAKIAlyZXR1cm4gc2VxX3JlbGVhc2VfcHJpdmF0ZShpbm9kZSwgZmlsZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNjX3NlcV9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2Nfc2VxX2ZvcHMgPSB7CiAJLm9wZW4gPSBzY19mb3Bfb3BlbiwKIAkucmVhZCA9IHNlcV9yZWFkLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMgYi9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMKaW5kZXggODFlZmY4ZS4uMDFjZjhjYyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWFzdC5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1hc3QuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWNvbnZlcnQuYyBiL2ZzL29jZnMyL2RsbS9kbG1jb252ZXJ0LmMKaW5kZXggNzU5OTdiNC4uY2E5NmJjZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWNvbnZlcnQuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtY29udmVydC5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuYyBiL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jCmluZGV4IGM1Yzg4MTIuLjQyYjBiYWQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KQEAgLTQ3OSw3ICs0NzgsNyBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19wdXJnZWxpc3RfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX3B1cmdlbGlzdF9mb3BzID0gewogCS5vcGVuID0JCWRlYnVnX3B1cmdlbGlzdF9vcGVuLAogCS5yZWxlYXNlID0JZGVidWdfYnVmZmVyX3JlbGVhc2UsCiAJLnJlYWQgPQkJZGVidWdfYnVmZmVyX3JlYWQsCkBAIC01MzksNyArNTM4LDcgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfbWxlX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19tbGVfZm9wcyA9IHsKIAkub3BlbiA9CQlkZWJ1Z19tbGVfb3BlbiwKIAkucmVsZWFzZSA9CWRlYnVnX2J1ZmZlcl9yZWxlYXNlLAogCS5yZWFkID0JCWRlYnVnX2J1ZmZlcl9yZWFkLApAQCAtNzQyLDcgKzc0MSw3IEBACiAJcmV0dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19sb2NrcmVzX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19sb2NrcmVzX2ZvcHMgPSB7CiAJLm9wZW4gPQkJZGVidWdfbG9ja3Jlc19vcGVuLAogCS5yZWxlYXNlID0JZGVidWdfbG9ja3Jlc19yZWxlYXNlLAogCS5yZWFkID0JCXNlcV9yZWFkLApAQCAtOTI2LDcgKzkyNSw3IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX3N0YXRlX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19zdGF0ZV9mb3BzID0gewogCS5vcGVuID0JCWRlYnVnX3N0YXRlX29wZW4sCiAJLnJlbGVhc2UgPQlkZWJ1Z19idWZmZXJfcmVsZWFzZSwKIAkucmVhZCA9CQlkZWJ1Z19idWZmZXJfcmVhZCwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwppbmRleCA0ZDllNmIyLi4wMzM0MDAwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWxvY2suYyBiL2ZzL29jZnMyL2RsbS9kbG1sb2NrLmMKaW5kZXggODNhOWYyOS4uNDM3Njk4ZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWxvY2suYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtbG9jay5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMgYi9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKaW5kZXggZjhiNjUzZi4uODNiY2FmMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMgYi9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYwppbmRleCA0M2U2ZTMyLi5kOWZhM2QyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jIGIvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jCmluZGV4IDk4NTY5ZTguLjUyZWMwMjAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG10aHJlYWQuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtdGhyZWFkLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG11bmxvY2suYyBiL2ZzL29jZnMyL2RsbS9kbG11bmxvY2suYwppbmRleCA3NTZmNWIwLi4wMGY1M2IyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtdW5sb2NrLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbXVubG9jay5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9tbWFwLmMgYi9mcy9vY2ZzMi9tbWFwLmMKaW5kZXggYjYwNjQ5Ni4uMzk3Mzc2MSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbW1hcC5jCisrKyBiL2ZzL29jZnMyL21tYXAuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBvY2ZzMl9maWxlX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgb2NmczJfZmlsZV92bV9vcHMgPSB7CiAJLmZhdWx0CQk9IG9jZnMyX2ZhdWx0LAogCS5wYWdlX21rd3JpdGUJPSBvY2ZzMl9wYWdlX21rd3JpdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggMjRmZWI0NC4uYzBlNDhhZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CkBAIC0zNzQsNyArMzczLDcgQEAKIH0KICNlbmRpZgkvKiBDT05GSUdfREVCVUdfRlMgKi8KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfb3NiX2RlYnVnX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvY2ZzMl9vc2JfZGVidWdfZm9wcyA9IHsKIAkub3BlbiA9CQlvY2ZzMl9vc2JfZGVidWdfb3BlbiwKIAkucmVsZWFzZSA9CW9jZnMyX2RlYnVnX3JlbGVhc2UsCiAJLnJlYWQgPQkJb2NmczJfZGVidWdfcmVhZCwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N5bWxpbmsuYyBiL2ZzL29jZnMyL3N5bWxpbmsuYwppbmRleCA1NzlkZDFiLi5lMzQyMTAzIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zeW1saW5rLmMKKysrIGIvZnMvb2NmczIvc3ltbGluay5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfTkFNRUkKZGlmZiAtLWdpdCBhL2ZzL29tZnMvZGlyLmMgYi9mcy9vbWZzL2Rpci5jCmluZGV4IDM2ODBiYWUuLmI0MmQ2MjQgMTAwNjQ0Ci0tLSBhL2ZzL29tZnMvZGlyLmMKKysrIGIvZnMvb21mcy9kaXIuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJLnJtZGlyID0gb21mc19ybWRpciwKIH07CiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21mc19kaXJfb3BlcmF0aW9ucyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21mc19kaXJfb3BlcmF0aW9ucyA9IHsKIAkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCiAJLnJlYWRkaXIgPSBvbWZzX3JlYWRkaXIsCiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCmRpZmYgLS1naXQgYS9mcy9vbWZzL2ZpbGUuYyBiL2ZzL29tZnMvZmlsZS5jCmluZGV4IDQ4NDVmYmIuLjM5OTQ4N2MgMTAwNjQ0Ci0tLSBhL2ZzL29tZnMvZmlsZS5jCisrKyBiL2ZzL29tZnMvZmlsZS5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBvbWZzX2dldF9ibG9jayk7CiB9CiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21mc19maWxlX29wZXJhdGlvbnMgPSB7Citjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9tZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkID0gZG9fc3luY19yZWFkLAogCS53cml0ZSA9IGRvX3N5bmNfd3JpdGUsCmRpZmYgLS1naXQgYS9mcy9vbWZzL29tZnMuaCBiL2ZzL29tZnMvb21mcy5oCmluZGV4IGRmNzEwMzkuLmViZTJmZGIgMTAwNjQ0Ci0tLSBhL2ZzL29tZnMvb21mcy5oCisrKyBiL2ZzL29tZnMvb21mcy5oCkBAIC00NCwxNCArNDQsMTQgQEAKIGV4dGVybiBpbnQgb21mc19jbGVhcl9yYW5nZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgYmxvY2ssIGludCBjb3VudCk7CiAKIC8qIGRpci5jICovCi1leHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvbWZzX2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21mc19kaXJfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBvbWZzX2Rpcl9pbm9wczsKIGV4dGVybiBpbnQgb21mc19tYWtlX2VtcHR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogZXh0ZXJuIGludCBvbWZzX2lzX2JhZChzdHJ1Y3Qgb21mc19zYl9pbmZvICpzYmksIHN0cnVjdCBvbWZzX2hlYWRlciAqaGVhZGVyLAogCQkJdTY0IGZzYmxvY2spOwogCiAvKiBmaWxlLmMgKi8KLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9tZnNfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21mc19maWxlX29wZXJhdGlvbnM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb21mc19maWxlX2lub3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgb21mc19hb3BzOwogZXh0ZXJuIHZvaWQgb21mc19tYWtlX2VtcHR5X3RhYmxlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvZnMvcGlwZS5jIGIvZnMvcGlwZS5jCmluZGV4IDUyYzQxNTEuLmFlMTdkMDIgMTAwNjQ0Ci0tLSBhL2ZzL3BpcGUuYworKysgYi9mcy9waXBlLmMKQEAgLTc3NywzNiArNzc3LDU1IEBACiBzdGF0aWMgaW50CiBwaXBlX3JlYWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQkvKiBXZSBjb3VsZCBoYXZlIHBlcmhhcHMgdXNlZCBhdG9taWNfdCwgYnV0IHRoaXMgYW5kIGZyaWVuZHMKLQkgICBiZWxvdyBhcmUgdGhlIG9ubHkgcGxhY2VzLiAgU28gaXQgZG9lc24ndCBzZWVtIHdvcnRod2hpbGUuICAqLworCWludCByZXQgPSAtRU5PRU5UOworCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCWlub2RlLT5pX3BpcGUtPnJlYWRlcnMrKzsKKworCWlmIChpbm9kZS0+aV9waXBlKSB7CisJCXJldCA9IDA7CisJCWlub2RlLT5pX3BpcGUtPnJlYWRlcnMrKzsKKwl9CisKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQKIHBpcGVfd3JpdGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKwogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQlpbm9kZS0+aV9waXBlLT53cml0ZXJzKys7CisKKwlpZiAoaW5vZGUtPmlfcGlwZSkgeworCQlyZXQgPSAwOworCQlpbm9kZS0+aV9waXBlLT53cml0ZXJzKys7CisJfQorCiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CiBwaXBlX3Jkd3Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKwogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJaW5vZGUtPmlfcGlwZS0+cmVhZGVycysrOwotCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJaW5vZGUtPmlfcGlwZS0+d3JpdGVycysrOworCisJaWYgKGlub2RlLT5pX3BpcGUpIHsKKwkJcmV0ID0gMDsKKwkJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlpbm9kZS0+aV9waXBlLT5yZWFkZXJzKys7CisJCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCWlub2RlLT5pX3BpcGUtPndyaXRlcnMrKzsKKwl9CisKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9wcm9jL2FycmF5LmMgYi9mcy9wcm9jL2FycmF5LmMKaW5kZXggMGM2YmM2MC4uMDdmNzdhNyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9hcnJheS5jCisrKyBiL2ZzL3Byb2MvYXJyYXkuYwpAQCAtMzIyLDYgKzMyMiw4IEBACiAJCQlwLT5uaXZjc3cpOwogfQogCisjaWZkZWYgQ09ORklHX01NVQorCiBzdHJ1Y3Qgc3RhY2tfc3RhdHMgewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXVuc2lnbmVkIGxvbmcJc3RhcnRwYWdlOwpAQCAtNDAyLDYgKzQwNCwxMSBAQAogCQltbXB1dChtbSk7CiAJfQogfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHRhc2tfc2hvd19zdGFja191c2FnZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKK30KKyNlbmRpZgkJLyogQ09ORklHX01NVSAqLwogCiBpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLAogCQkJc3RydWN0IHBpZCAqcGlkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCmRpZmYgLS1naXQgYS9mcy9wcm9jL2tjb3JlLmMgYi9mcy9wcm9jL2tjb3JlLmMKaW5kZXggNTYwMTMzNy4uYTQ0YTc4OSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9rY29yZS5jCisrKyBiL2ZzL3Byb2Mva2NvcmUuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCmRpZmYgLS1naXQgYS9mcy9wcm9jL21lbWluZm8uYyBiL2ZzL3Byb2MvbWVtaW5mby5jCmluZGV4IDE3MWUwNTIuLmE2NTIzOWMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbWVtaW5mby5jCisrKyBiL2ZzL3Byb2MvbWVtaW5mby5jCkBAIC05Nyw3ICs5NywxMSBAQAogCQkiQ29tbWl0dGVkX0FTOiAgICU4bHUga0JcbiIKIAkJIlZtYWxsb2NUb3RhbDogICAlOGx1IGtCXG4iCiAJCSJWbWFsbG9jVXNlZDogICAgJThsdSBrQlxuIgotCQkiVm1hbGxvY0NodW5rOiAgICU4bHUga0JcbiIsCisJCSJWbWFsbG9jQ2h1bms6ICAgJThsdSBrQlxuIgorI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQorCQkiSGFyZHdhcmVDb3JydXB0ZWQ6ICU1bHUga0JcbiIKKyNlbmRpZgorCQksCiAJCUsoaS50b3RhbHJhbSksCiAJCUsoaS5mcmVlcmFtKSwKIAkJSyhpLmJ1ZmZlcnJhbSksCkBAIC0xNDQsNiArMTQ4LDkgQEAKIAkJKHVuc2lnbmVkIGxvbmcpVk1BTExPQ19UT1RBTCA+PiAxMCwKIAkJdm1pLnVzZWQgPj4gMTAsCiAJCXZtaS5sYXJnZXN0X2NodW5rID4+IDEwCisjaWZkZWYgQ09ORklHX01FTU9SWV9GQUlMVVJFCisJCSxhdG9taWNfbG9uZ19yZWFkKCZtY2VfYmFkX3BhZ2VzKSA8PCAoUEFHRV9TSElGVCAtIDEwKQorI2VuZGlmCiAJCSk7CiAKIAlodWdldGxiX3JlcG9ydF9tZW1pbmZvKG0pOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wYWdlLmMgYi9mcy9wcm9jL3BhZ2UuYwppbmRleCAyMjgxYzJjLi41MDMzY2UwIDEwMDY0NAotLS0gYS9mcy9wcm9jL3BhZ2UuYworKysgYi9mcy9wcm9jL3BhZ2UuYwpAQCAtOTQsNiArOTQsNyBAQAogI2RlZmluZSBLUEZfQ09NUE9VTkRfVEFJTAkxNgogI2RlZmluZSBLUEZfSFVHRQkJMTcKICNkZWZpbmUgS1BGX1VORVZJQ1RBQkxFCQkxOAorI2RlZmluZSBLUEZfSFdQT0lTT04JCTE5CiAjZGVmaW5lIEtQRl9OT1BBR0UJCTIwCiAKICNkZWZpbmUgS1BGX0tTTQkJCTIxCkBAIC0xODAsNiArMTgxLDEwIEBACiAJdSB8PSBrcGZfY29weV9iaXQoaywgS1BGX1VORVZJQ1RBQkxFLAlQR191bmV2aWN0YWJsZSk7CiAJdSB8PSBrcGZfY29weV9iaXQoaywgS1BGX01MT0NLRUQsCVBHX21sb2NrZWQpOwogCisjaWZkZWYgQ09ORklHX01FTU9SWV9GQUlMVVJFCisJdSB8PSBrcGZfY29weV9iaXQoaywgS1BGX0hXUE9JU09OLAlQR19od3BvaXNvbik7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19JQTY0X1VOQ0FDSEVEX0FMTE9DQVRPUgogCXUgfD0ga3BmX2NvcHlfYml0KGssIEtQRl9VTkNBQ0hFRCwJUEdfdW5jYWNoZWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKaW5kZXggOWIxZTRlOS4uZjY2N2U4YSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCisrKyBiL2ZzL3Byb2MvcHJvY19zeXNjdGwuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAKIAkvKiBjYXJlZnVsOiBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBuYXN0eSBoZXJlICovCiAJcmVzID0gY291bnQ7Ci0JZXJyb3IgPSB0YWJsZS0+cHJvY19oYW5kbGVyKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmLCAmcmVzLCBwcG9zKTsKKwllcnJvciA9IHRhYmxlLT5wcm9jX2hhbmRsZXIodGFibGUsIHdyaXRlLCBidWYsICZyZXMsIHBwb3MpOwogCWlmICghZXJyb3IpCiAJCWVycm9yID0gcmVzOwogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvcHJvYy91cHRpbWUuYyBiL2ZzL3Byb2MvdXB0aW1lLmMKaW5kZXggMGMxMGEwYi4uNzY2YjFkNCAxMDA2NDQKLS0tIGEvZnMvcHJvYy91cHRpbWUuYworKysgYi9mcy9wcm9jL3VwdGltZS5jCkBAIC00LDEzICs0LDE4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CiAKIHN0YXRpYyBpbnQgdXB0aW1lX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IHRpbWVzcGVjIHVwdGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMgaWRsZTsKLQljcHV0aW1lX3QgaWRsZXRpbWUgPSBjcHV0aW1lX2FkZChpbml0X3Rhc2sudXRpbWUsIGluaXRfdGFzay5zdGltZSk7CisJaW50IGk7CisJY3B1dGltZV90IGlkbGV0aW1lID0gY3B1dGltZV96ZXJvOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCWlkbGV0aW1lID0gY3B1dGltZTY0X2FkZChpZGxldGltZSwga3N0YXRfY3B1KGkpLmNwdXN0YXQuaWRsZSk7CiAKIAlkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSgmdXB0aW1lKTsKIAltb25vdG9uaWNfdG9fYm9vdGJhc2VkKCZ1cHRpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvZmlsZS1ub21tdS5jIGIvZnMvcmFtZnMvZmlsZS1ub21tdS5jCmluZGV4IDExZjBjMDYuLjMyZmFlNDAgMTAwNjQ0Ci0tLSBhL2ZzL3JhbWZzL2ZpbGUtbm9tbXUuYworKysgYi9mcy9yYW1mcy9maWxlLW5vbW11LmMKQEAgLTY5LDE0ICs2OSwxMSBAQAogCS8qIG1ha2UgdmFyaW91cyBjaGVja3MgKi8KIAlvcmRlciA9IGdldF9vcmRlcihuZXdzaXplKTsKIAlpZiAodW5saWtlbHkob3JkZXIgPj0gTUFYX09SREVSKSkKLQkJZ290byB0b29fYmlnOworCQlyZXR1cm4gLUVGQklHOwogCi0JbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0ZTSVpFXS5ybGltX2N1cjsKLQlpZiAobGltaXQgIT0gUkxJTV9JTkZJTklUWSAmJiBuZXdzaXplID4gbGltaXQpCi0JCWdvdG8gZnNpemVfZXhjZWVkZWQ7Ci0KLQlpZiAobmV3c2l6ZSA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKQotCQlnb3RvIHRvb19iaWc7CisJcmV0ID0gaW5vZGVfbmV3c2l6ZV9vayhpbm9kZSwgbmV3c2l6ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlfc2l6ZV93cml0ZShpbm9kZSwgbmV3c2l6ZSk7CiAKQEAgLTExOCwxMiArMTE1LDcgQEAKIAogCXJldHVybiAwOwogCi0gZnNpemVfZXhjZWVkZWQ6Ci0Jc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7Ci0gdG9vX2JpZzoKLQlyZXR1cm4gLUVGQklHOwotCi0gYWRkX2Vycm9yOgorYWRkX2Vycm9yOgogCXdoaWxlIChsb29wIDwgbnBhZ2VzKQogCQlfX2ZyZWVfcGFnZShwYWdlcyArIGxvb3ArKyk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCA2YzhjNTVkLi4zYWMyODk4IDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC04MzksOSArODM5LDYgQEAKIAkJbWF4ID0gbWluKGluX2lub2RlLT5pX3NiLT5zX21heGJ5dGVzLCBvdXRfaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpOwogCiAJcG9zID0gKnBwb3M7Ci0JcmV0dmFsID0gLUVJTlZBTDsKLQlpZiAodW5saWtlbHkocG9zIDwgMCkpCi0JCWdvdG8gZnB1dF9vdXQ7CiAJaWYgKHVubGlrZWx5KHBvcyArIGNvdW50ID4gbWF4KSkgewogCQlyZXR2YWwgPSAtRU9WRVJGTE9XOwogCQlpZiAocG9zID49IG1heCkKZGlmZiAtLWdpdCBhL2ZzL3JvbWZzL3N0b3JhZ2UuYyBiL2ZzL3JvbWZzL3N0b3JhZ2UuYwppbmRleCBiMzIwOGFkLi43MWUyYjRkIDEwMDY0NAotLS0gYS9mcy9yb21mcy9zdG9yYWdlLmMKKysrIGIvZnMvcm9tZnMvc3RvcmFnZS5jCkBAIC0yNTMsMTEgKzI1MywxMSBAQAogCiAjaWZkZWYgQ09ORklHX1JPTUZTX09OX01URAogCWlmIChzYi0+c19tdGQpCi0JCXJldHVybiByb21mc19tdGRfc3RybmxlbihzYiwgcG9zLCBsaW1pdCk7CisJCXJldHVybiByb21mc19tdGRfc3RybmxlbihzYiwgcG9zLCBtYXhsZW4pOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JPTUZTX09OX0JMT0NLCiAJaWYgKHNiLT5zX2JkZXYpCi0JCXJldHVybiByb21mc19ibGtfc3RybmxlbihzYiwgcG9zLCBsaW1pdCk7CisJCXJldHVybiByb21mc19ibGtfc3RybmxlbihzYiwgcG9zLCBtYXhsZW4pOwogI2VuZGlmCiAJcmV0dXJuIC1FSU87CiB9CmRpZmYgLS1naXQgYS9mcy9yb21mcy9zdXBlci5jIGIvZnMvcm9tZnMvc3VwZXIuYwppbmRleCA0N2YxMzJkLi5jMTE3ZmE4IDEwMDY0NAotLS0gYS9mcy9yb21mcy9zdXBlci5jCisrKyBiL2ZzL3JvbWZzL3N1cGVyLmMKQEAgLTUyOCw3ICs1MjgsNyBAQAogCXBvcyA9IChST01GSF9TSVpFICsgbGVuICsgMSArIFJPTUZIX1BBRCkgJiBST01GSF9NQVNLOwogCiAJcm9vdCA9IHJvbWZzX2lnZXQoc2IsIHBvcyk7Ci0JaWYgKCFyb290KQorCWlmIChJU19FUlIocm9vdCkpCiAJCWdvdG8gZXJyb3I7CiAKIAlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3QpOwpkaWZmIC0tZ2l0IGEvZnMvc2VsZWN0LmMgYi9mcy9zZWxlY3QuYwppbmRleCBhMjAxZmMzLi5mZDM4Y2UyIDEwMDY0NAotLS0gYS9mcy9zZWxlY3QuYworKysgYi9mcy9zZWxlY3QuYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZnMvc2VxX2ZpbGUuYyBiL2ZzL3NlcV9maWxlLmMKaW5kZXggNmM5NTkyNy4uZWFlN2Q5ZCAxMDA2NDQKLS0tIGEvZnMvc2VxX2ZpbGUuYworKysgYi9mcy9zZXFfZmlsZS5jCkBAIC00MjksMjAgKzQyOSwyMSBAQAogICovCiBpbnQgc2VxX3BhdGgoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcGF0aCAqcGF0aCwgY2hhciAqZXNjKQogewotCWlmIChtLT5jb3VudCA8IG0tPnNpemUpIHsKLQkJY2hhciAqcyA9IG0tPmJ1ZiArIG0tPmNvdW50OwotCQljaGFyICpwID0gZF9wYXRoKHBhdGgsIHMsIG0tPnNpemUgLSBtLT5jb3VudCk7CisJY2hhciAqYnVmOworCXNpemVfdCBzaXplID0gc2VxX2dldF9idWYobSwgJmJ1Zik7CisJaW50IHJlcyA9IC0xOworCisJaWYgKHNpemUpIHsKKwkJY2hhciAqcCA9IGRfcGF0aChwYXRoLCBidWYsIHNpemUpOwogCQlpZiAoIUlTX0VSUihwKSkgewotCQkJcyA9IG1hbmdsZV9wYXRoKHMsIHAsIGVzYyk7Ci0JCQlpZiAocykgewotCQkJCXAgPSBtLT5idWYgKyBtLT5jb3VudDsKLQkJCQltLT5jb3VudCA9IHMgLSBtLT5idWY7Ci0JCQkJcmV0dXJuIHMgLSBwOwotCQkJfQorCQkJY2hhciAqZW5kID0gbWFuZ2xlX3BhdGgoYnVmLCBwLCBlc2MpOworCQkJaWYgKGVuZCkKKwkJCQlyZXMgPSBlbmQgLSBidWY7CiAJCX0KIAl9Ci0JbS0+Y291bnQgPSBtLT5zaXplOwotCXJldHVybiAtMTsKKwlzZXFfY29tbWl0KG0sIHJlcyk7CisKKwlyZXR1cm4gcmVzOwogfQogRVhQT1JUX1NZTUJPTChzZXFfcGF0aCk7CiAKQEAgLTQ1NCwyNiArNDU1LDI4IEBACiBpbnQgc2VxX3BhdGhfcm9vdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgcGF0aCAqcm9vdCwKIAkJICBjaGFyICplc2MpCiB7Ci0JaW50IGVyciA9IC1FTkFNRVRPT0xPTkc7Ci0JaWYgKG0tPmNvdW50IDwgbS0+c2l6ZSkgewotCQljaGFyICpzID0gbS0+YnVmICsgbS0+Y291bnQ7CisJY2hhciAqYnVmOworCXNpemVfdCBzaXplID0gc2VxX2dldF9idWYobSwgJmJ1Zik7CisJaW50IHJlcyA9IC1FTkFNRVRPT0xPTkc7CisKKwlpZiAoc2l6ZSkgewogCQljaGFyICpwOwogCiAJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwotCQlwID0gX19kX3BhdGgocGF0aCwgcm9vdCwgcywgbS0+c2l6ZSAtIG0tPmNvdW50KTsKKwkJcCA9IF9fZF9wYXRoKHBhdGgsIHJvb3QsIGJ1Ziwgc2l6ZSk7CiAJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCWVyciA9IFBUUl9FUlIocCk7CisJCXJlcyA9IFBUUl9FUlIocCk7CiAJCWlmICghSVNfRVJSKHApKSB7Ci0JCQlzID0gbWFuZ2xlX3BhdGgocywgcCwgZXNjKTsKLQkJCWlmIChzKSB7Ci0JCQkJcCA9IG0tPmJ1ZiArIG0tPmNvdW50OwotCQkJCW0tPmNvdW50ID0gcyAtIG0tPmJ1ZjsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KKwkJCWNoYXIgKmVuZCA9IG1hbmdsZV9wYXRoKGJ1ZiwgcCwgZXNjKTsKKwkJCWlmIChlbmQpCisJCQkJcmVzID0gZW5kIC0gYnVmOworCQkJZWxzZQorCQkJCXJlcyA9IC1FTkFNRVRPT0xPTkc7CiAJCX0KIAl9Ci0JbS0+Y291bnQgPSBtLT5zaXplOwotCXJldHVybiBlcnI7CisJc2VxX2NvbW1pdChtLCByZXMpOworCisJcmV0dXJuIHJlcyA8IDAgPyByZXMgOiAwOwogfQogCiAvKgpAQCAtNDgxLDIwICs0ODQsMjEgQEAKICAqLwogaW50IHNlcV9kZW50cnkoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmVzYykKIHsKLQlpZiAobS0+Y291bnQgPCBtLT5zaXplKSB7Ci0JCWNoYXIgKnMgPSBtLT5idWYgKyBtLT5jb3VudDsKLQkJY2hhciAqcCA9IGRlbnRyeV9wYXRoKGRlbnRyeSwgcywgbS0+c2l6ZSAtIG0tPmNvdW50KTsKKwljaGFyICpidWY7CisJc2l6ZV90IHNpemUgPSBzZXFfZ2V0X2J1ZihtLCAmYnVmKTsKKwlpbnQgcmVzID0gLTE7CisKKwlpZiAoc2l6ZSkgeworCQljaGFyICpwID0gZGVudHJ5X3BhdGgoZGVudHJ5LCBidWYsIHNpemUpOwogCQlpZiAoIUlTX0VSUihwKSkgewotCQkJcyA9IG1hbmdsZV9wYXRoKHMsIHAsIGVzYyk7Ci0JCQlpZiAocykgewotCQkJCXAgPSBtLT5idWYgKyBtLT5jb3VudDsKLQkJCQltLT5jb3VudCA9IHMgLSBtLT5idWY7Ci0JCQkJcmV0dXJuIHMgLSBwOwotCQkJfQorCQkJY2hhciAqZW5kID0gbWFuZ2xlX3BhdGgoYnVmLCBwLCBlc2MpOworCQkJaWYgKGVuZCkKKwkJCQlyZXMgPSBlbmQgLSBidWY7CiAJCX0KIAl9Ci0JbS0+Y291bnQgPSBtLT5zaXplOwotCXJldHVybiAtMTsKKwlzZXFfY29tbWl0KG0sIHJlcyk7CisKKwlyZXR1cm4gcmVzOwogfQogCiBpbnQgc2VxX2JpdG1hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdHMsCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9pbm9kZS5jIGIvZnMvc21iZnMvaW5vZGUuYwppbmRleCAxNDAyZDJkLi4xYzRjOGYwIDEwMDY0NAotLS0gYS9mcy9zbWJmcy9pbm9kZS5jCisrKyBiL2ZzL3NtYmZzL2lub2RlLmMKQEAgLTQ1OSwxNCArNDU5LDggQEAKIHN0YXRpYyB2b2lkCiBzbWJfdW5sb2FkX25scyhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKIHsKLQlpZiAoc2VydmVyLT5yZW1vdGVfbmxzKSB7Ci0JCXVubG9hZF9ubHMoc2VydmVyLT5yZW1vdGVfbmxzKTsKLQkJc2VydmVyLT5yZW1vdGVfbmxzID0gTlVMTDsKLQl9Ci0JaWYgKHNlcnZlci0+bG9jYWxfbmxzKSB7Ci0JCXVubG9hZF9ubHMoc2VydmVyLT5sb2NhbF9ubHMpOwotCQlzZXJ2ZXItPmxvY2FsX25scyA9IE5VTEw7Ci0JfQorCXVubG9hZF9ubHMoc2VydmVyLT5yZW1vdGVfbmxzKTsKKwl1bmxvYWRfbmxzKHNlcnZlci0+bG9jYWxfbmxzKTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IDBlNzIwN2IuLjE5ZWI3MGIgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtNDY1LDYgKzQ2NSw0OCBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGdldF9zdXBlcik7CisKKy8qKgorICogZ2V0X2FjdGl2ZV9zdXBlciAtIGdldCBhbiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBzdXBlcmJsb2NrIG9mIGEgZGV2aWNlCisgKiBAYmRldjogZGV2aWNlIHRvIGdldCB0aGUgc3VwZXJibG9jayBmb3IKKyAqCisgKiBTY2FucyB0aGUgc3VwZXJibG9jayBsaXN0IGFuZCBmaW5kcyB0aGUgc3VwZXJibG9jayBvZiB0aGUgZmlsZSBzeXN0ZW0KKyAqIG1vdW50ZWQgb24gdGhlIGRldmljZSBnaXZlbi4gIFJldHVybnMgdGhlIHN1cGVyYmxvY2sgd2l0aCBhbiBhY3RpdmUKKyAqIHJlZmVyZW5jZSBhbmQgc191bW91bnQgaGVsZCBleGNsdXNpdmVseSBvciAlTlVMTCBpZiBub25lIHdhcyBmb3VuZC4KKyAqLworc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfYWN0aXZlX3N1cGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCWlmICghYmRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2soJnNiX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZzdXBlcl9ibG9ja3MsIHNfbGlzdCkgeworCQlpZiAoc2ItPnNfYmRldiAhPSBiZGV2KQorCQkJY29udGludWU7CisKKwkJc2ItPnNfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlkb3duX3dyaXRlKCZzYi0+c191bW91bnQpOworCQlpZiAoc2ItPnNfcm9vdCkgeworCQkJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwkJCWlmIChzYi0+c19jb3VudCA+IFNfQklBUykgeworCQkJCWF0b21pY19pbmMoJnNiLT5zX2FjdGl2ZSk7CisJCQkJc2ItPnNfY291bnQtLTsKKwkJCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCQkJcmV0dXJuIHNiOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQl9CisJCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOworCQlwdXRfc3VwZXIoc2IpOworCQl5aWVsZCgpOworCQlzcGluX2xvY2soJnNiX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CiAgCiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiB1c2VyX2dldF9zdXBlcihkZXZfdCBkZXYpCiB7CkBAIC01MjcsMTEgKzU2OSwxNSBAQAogewogCWludCByZXR2YWw7CiAJaW50IHJlbW91bnRfcnc7Ci0JCisKKwlpZiAoc2ItPnNfZnJvemVuICE9IFNCX1VORlJPWkVOKQorCQlyZXR1cm4gLUVCVVNZOworCiAjaWZkZWYgQ09ORklHX0JMT0NLCiAJaWYgKCEoZmxhZ3MgJiBNU19SRE9OTFkpICYmIGJkZXZfcmVhZF9vbmx5KHNiLT5zX2JkZXYpKQogCQlyZXR1cm4gLUVBQ0NFUzsKICNlbmRpZgorCiAJaWYgKGZsYWdzICYgTVNfUkRPTkxZKQogCQlhY2N0X2F1dG9fY2xvc2Uoc2IpOwogCXNocmlua19kY2FjaGVfc2Ioc2IpOwpAQCAtNzQzLDkgKzc4OSwxNCBAQAogCSAqIHdpbGwgcHJvdGVjdCB0aGUgbG9ja2ZzIGNvZGUgZnJvbSB0cnlpbmcgdG8gc3RhcnQgYSBzbmFwc2hvdAogCSAqIHdoaWxlIHdlIGFyZSBtb3VudGluZwogCSAqLwotCWRvd24oJmJkZXYtPmJkX21vdW50X3NlbSk7CisJbXV0ZXhfbG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOworCWlmIChiZGV2LT5iZF9mc2ZyZWV6ZV9jb3VudCA+IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9mc2ZyZWV6ZV9tdXRleCk7CisJCWVycm9yID0gLUVCVVNZOworCQlnb3RvIGVycm9yX2JkZXY7CisJfQogCXMgPSBzZ2V0KGZzX3R5cGUsIHRlc3RfYmRldl9zdXBlciwgc2V0X2JkZXZfc3VwZXIsIGJkZXYpOwotCXVwKCZiZGV2LT5iZF9tb3VudF9zZW0pOworCW11dGV4X3VubG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOwogCWlmIChJU19FUlIocykpCiAJCWdvdG8gZXJyb3JfczsKIApAQCAtODkyLDYgKzk0MywxNiBAQAogIAlpZiAoZXJyb3IpCiAgCQlnb3RvIG91dF9zYjsKIAorCS8qCisJICogZmlsZXN5c3RlbXMgc2hvdWxkIG5ldmVyIHNldCBzX21heGJ5dGVzIGxhcmdlciB0aGFuIE1BWF9MRlNfRklMRVNJWkUKKwkgKiBidXQgc19tYXhieXRlcyB3YXMgYW4gdW5zaWduZWQgbG9uZyBsb25nIGZvciBtYW55IHJlbGVhc2VzLiBUaHJvdworCSAqIHRoaXMgd2FybmluZyBmb3IgYSBsaXR0bGUgd2hpbGUgdG8gdHJ5IGFuZCBjYXRjaCBmaWxlc3lzdGVtcyB0aGF0CisJICogdmlvbGF0ZSB0aGlzIHJ1bGUuIFRoaXMgd2FybmluZyBzaG91bGQgYmUgZWl0aGVyIHJlbW92ZWQgb3IKKwkgKiBjb252ZXJ0ZWQgdG8gYSBCVUcoKSBpbiAyLjYuMzQuCisJICovCisJV0FSTigobW50LT5tbnRfc2ItPnNfbWF4Ynl0ZXMgPCAwKSwgIiVzIHNldCBzYi0+c19tYXhieXRlcyB0byAiCisJCSJuZWdhdGl2ZSB2YWx1ZSAoJWxsZClcbiIsIHR5cGUtPm5hbWUsIG1udC0+bW50X3NiLT5zX21heGJ5dGVzKTsKKwogCW1udC0+bW50X21vdW50cG9pbnQgPSBtbnQtPm1udF9yb290OwogCW1udC0+bW50X3BhcmVudCA9IG1udDsKIAl1cF93cml0ZSgmbW50LT5tbnRfc2ItPnNfdW1vdW50KTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2Jpbi5jIGIvZnMvc3lzZnMvYmluLmMKaW5kZXggMjUyNDcxNC4uNjBjNzAyYiAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvYmluLmMKKysrIGIvZnMvc3lzZnMvYmluLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAlzdHJ1Y3QgbXV0ZXgJCQltdXRleDsKIAl2b2lkCQkJCSpidWZmZXI7CiAJaW50CQkJCW1tYXBwZWQ7Ci0Jc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IAkqdm1fb3BzOworCWNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCAqdm1fb3BzOwogCXN0cnVjdCBmaWxlCQkJKmZpbGU7CiAJc3RydWN0IGhsaXN0X25vZGUJCWxpc3Q7CiB9OwpAQCAtMzMxLDcgKzMzMSw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBiaW5fdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBiaW5fdm1fb3BzID0gewogCS5vcGVuCQk9IGJpbl92bWFfb3BlbiwKIAkuY2xvc2UJCT0gYmluX3ZtYV9jbG9zZSwKIAkuZmF1bHQJCT0gYmluX2ZhdWx0LApkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZGlyLmMgYi9mcy9zeXNmcy9kaXIuYwppbmRleCAwMDUwZmM0Li5lMDIwMTgzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9kaXIuYworKysgYi9mcy9zeXNmcy9kaXIuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgInN5c2ZzLmgiCiAKIERFRklORV9NVVRFWChzeXNmc19tdXRleCk7CkBAIC0yODUsNiArMjg2LDkgQEAKIAkJc3lzZnNfcHV0KHNkLT5zX3N5bWxpbmsudGFyZ2V0X3NkKTsKIAlpZiAoc3lzZnNfdHlwZShzZCkgJiBTWVNGU19DT1BZX05BTUUpCiAJCWtmcmVlKHNkLT5zX25hbWUpOworCWlmIChzZC0+c19pYXR0ciAmJiBzZC0+c19pYXR0ci0+aWFfc2VjZGF0YSkKKwkJc2VjdXJpdHlfcmVsZWFzZV9zZWNjdHgoc2QtPnNfaWF0dHItPmlhX3NlY2RhdGEsCisJCQkJCXNkLT5zX2lhdHRyLT5pYV9zZWNkYXRhX2xlbik7CiAJa2ZyZWUoc2QtPnNfaWF0dHIpOwogCXN5c2ZzX2ZyZWVfaW5vKHNkLT5zX2lubyk7CiAJa21lbV9jYWNoZV9mcmVlKHN5c2ZzX2Rpcl9jYWNoZXAsIHNkKTsKQEAgLTg5NCw3ICs4OTgsOCBAQAogCiAJbXV0ZXhfbG9jaygmc3lzZnNfcmVuYW1lX211dGV4KTsKIAlCVUdfT04oIXNkLT5zX3BhcmVudCk7Ci0JbmV3X3BhcmVudF9zZCA9IG5ld19wYXJlbnRfa29iai0+c2QgPyBuZXdfcGFyZW50X2tvYmotPnNkIDogJnN5c2ZzX3Jvb3Q7CisJbmV3X3BhcmVudF9zZCA9IChuZXdfcGFyZW50X2tvYmogJiYgbmV3X3BhcmVudF9rb2JqLT5zZCkgPworCQluZXdfcGFyZW50X2tvYmotPnNkIDogJnN5c2ZzX3Jvb3Q7CiAKIAllcnJvciA9IDA7CiAJaWYgKHNkLT5zX3BhcmVudCA9PSBuZXdfcGFyZW50X3NkKQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IDU2MWE5YzAuLmY1ZWE0NjggMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2ZpbGUuYworKysgYi9mcy9zeXNmcy9maWxlLmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogCXN0cnVjdCBzeXNmc19vcGVuX2RpcmVudCAqb2QsICpuZXdfb2QgPSBOVUxMOwogCiAgcmV0cnk6Ci0Jc3Bpbl9sb2NrKCZzeXNmc19vcGVuX2RpcmVudF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZzeXNmc19vcGVuX2RpcmVudF9sb2NrKTsKIAogCWlmICghc2QtPnNfYXR0ci5vcGVuICYmIG5ld19vZCkgewogCQlzZC0+c19hdHRyLm9wZW4gPSBuZXdfb2Q7CkBAIC0yODEsNyArMjgxLDcgQEAKIAkJbGlzdF9hZGRfdGFpbCgmYnVmZmVyLT5saXN0LCAmb2QtPmJ1ZmZlcnMpOwogCX0KIAotCXNwaW5fdW5sb2NrKCZzeXNmc19vcGVuX2RpcmVudF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnN5c2ZzX29wZW5fZGlyZW50X2xvY2spOwogCiAJaWYgKG9kKSB7CiAJCWtmcmVlKG5ld19vZCk7CkBAIC0zMTUsOCArMzE1LDkgQEAKIAkJCQkgIHN0cnVjdCBzeXNmc19idWZmZXIgKmJ1ZmZlcikKIHsKIAlzdHJ1Y3Qgc3lzZnNfb3Blbl9kaXJlbnQgKm9kID0gc2QtPnNfYXR0ci5vcGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2soJnN5c2ZzX29wZW5fZGlyZW50X2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZzeXNmc19vcGVuX2RpcmVudF9sb2NrLCBmbGFncyk7CiAKIAlsaXN0X2RlbCgmYnVmZmVyLT5saXN0KTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmb2QtPnJlZmNudCkpCkBAIC0zMjQsNyArMzI1LDcgQEAKIAllbHNlCiAJCW9kID0gTlVMTDsKIAotCXNwaW5fdW5sb2NrKCZzeXNmc19vcGVuX2RpcmVudF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeXNmc19vcGVuX2RpcmVudF9sb2NrLCBmbGFncyk7CiAKIAlrZnJlZShvZCk7CiB9CkBAIC00NTYsOCArNDU3LDkgQEAKIHZvaWQgc3lzZnNfbm90aWZ5X2RpcmVudChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKIHsKIAlzdHJ1Y3Qgc3lzZnNfb3Blbl9kaXJlbnQgKm9kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2soJnN5c2ZzX29wZW5fZGlyZW50X2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZzeXNmc19vcGVuX2RpcmVudF9sb2NrLCBmbGFncyk7CiAKIAlvZCA9IHNkLT5zX2F0dHIub3BlbjsKIAlpZiAob2QpIHsKQEAgLTQ2NSw3ICs0NjcsNyBAQAogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm9kLT5wb2xsKTsKIAl9CiAKLQlzcGluX3VubG9jaygmc3lzZnNfb3Blbl9kaXJlbnRfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3lzZnNfb3Blbl9kaXJlbnRfbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfbm90aWZ5X2RpcmVudCk7CiAKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2ZpbGUuYyBiL2ZzL3ViaWZzL2ZpbGUuYwppbmRleCAyZTY0ODFhLi4xMDA5YWRjIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9maWxlLmMKKysrIGIvZnMvdWJpZnMvZmlsZS5jCkBAIC0xNTM0LDcgKzE1MzQsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdWJpZnNfZmlsZV92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHViaWZzX2ZpbGVfdm1fb3BzID0gewogCS5mYXVsdCAgICAgICAgPSBmaWxlbWFwX2ZhdWx0LAogCS5wYWdlX21rd3JpdGUgPSB1Ymlmc192bV9wYWdlX21rd3JpdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCmluZGV4IGQ1ZTU1NTkuLmMyZTMwZWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKQEAgLTE4NiwxOSArMTg2LDM3IEBACiB9CiAKIC8qCisgKiBJZiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGlvZW5kIGlzIGJleW9uZCB0aGUgY3VycmVudCBFT0YsCisgKiByZXR1cm4gdGhlIG5ldyBFT0YgdmFsdWUsIG90aGVyd2lzZSB6ZXJvLgorICovCitTVEFUSUMgeGZzX2ZzaXplX3QKK3hmc19pb2VuZF9uZXdfZW9mKAorCXhmc19pb2VuZF90CQkqaW9lbmQpCit7CisJeGZzX2lub2RlX3QJCSppcCA9IFhGU19JKGlvZW5kLT5pb19pbm9kZSk7CisJeGZzX2ZzaXplX3QJCWlzaXplOworCXhmc19mc2l6ZV90CQlic2l6ZTsKKworCWJzaXplID0gaW9lbmQtPmlvX29mZnNldCArIGlvZW5kLT5pb19zaXplOworCWlzaXplID0gTUFYKGlwLT5pX3NpemUsIGlwLT5pX25ld19zaXplKTsKKwlpc2l6ZSA9IE1JTihpc2l6ZSwgYnNpemUpOworCXJldHVybiBpc2l6ZSA+IGlwLT5pX2QuZGlfc2l6ZSA/IGlzaXplIDogMDsKK30KKworLyoKICAqIFVwZGF0ZSBvbi1kaXNrIGZpbGUgc2l6ZSBub3cgdGhhdCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdG8gZGlzay4KICAqIFRoZSBjdXJyZW50IGluLW1lbW9yeSBmaWxlIHNpemUgaXMgaV9zaXplLiAgSWYgYSB3cml0ZSBpcyBiZXlvbmQKICAqIGVvZiBpX25ld19zaXplIHdpbGwgYmUgdGhlIGludGVuZGVkIGZpbGUgc2l6ZSB1bnRpbCBpX3NpemUgaXMKICAqIHVwZGF0ZWQuICBJZiB0aGlzIHdyaXRlIGRvZXMgbm90IGV4dGVuZCBhbGwgdGhlIHdheSB0byB0aGUgdmFsaWQKICAqIGZpbGUgc2l6ZSB0aGVuIHJlc3RyaWN0IHRoaXMgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIHdyaXRlLgogICovCisKIFNUQVRJQyB2b2lkCiB4ZnNfc2V0ZmlsZXNpemUoCiAJeGZzX2lvZW5kX3QJCSppb2VuZCkKIHsKIAl4ZnNfaW5vZGVfdAkJKmlwID0gWEZTX0koaW9lbmQtPmlvX2lub2RlKTsKIAl4ZnNfZnNpemVfdAkJaXNpemU7Ci0JeGZzX2ZzaXplX3QJCWJzaXplOwogCiAJQVNTRVJUKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpOwogCUFTU0VSVChpb2VuZC0+aW9fdHlwZSAhPSBJT01BUF9SRUFEKTsKQEAgLTIwNiwxNiArMjI0LDEwIEBACiAJaWYgKHVubGlrZWx5KGlvZW5kLT5pb19lcnJvcikpCiAJCXJldHVybjsKIAotCWJzaXplID0gaW9lbmQtPmlvX29mZnNldCArIGlvZW5kLT5pb19zaXplOwotCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0KLQlpc2l6ZSA9IE1BWChpcC0+aV9zaXplLCBpcC0+aV9uZXdfc2l6ZSk7Ci0JaXNpemUgPSBNSU4oaXNpemUsIGJzaXplKTsKLQotCWlmIChpcC0+aV9kLmRpX3NpemUgPCBpc2l6ZSkgeworCWlzaXplID0geGZzX2lvZW5kX25ld19lb2YoaW9lbmQpOworCWlmIChpc2l6ZSkgewogCQlpcC0+aV9kLmRpX3NpemUgPSBpc2l6ZTsKLQkJaXAtPmlfdXBkYXRlX2NvcmUgPSAxOwogCQl4ZnNfbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlwKTsKIAl9CiAKQEAgLTQwNCwxMCArNDE2LDE2IEBACiAJc3RydWN0IGJpbwkqYmlvKQogewogCWF0b21pY19pbmMoJmlvZW5kLT5pb19yZW1haW5pbmcpOwotCiAJYmlvLT5iaV9wcml2YXRlID0gaW9lbmQ7CiAJYmlvLT5iaV9lbmRfaW8gPSB4ZnNfZW5kX2JpbzsKIAorCS8qCisJICogSWYgdGhlIEkvTyBpcyBiZXlvbmQgRU9GIHdlIG1hcmsgdGhlIGlub2RlIGRpcnR5IGltbWVkaWF0ZWx5CisJICogYnV0IGRvbid0IHVwZGF0ZSB0aGUgaW5vZGUgc2l6ZSB1bnRpbCBJL08gY29tcGxldGlvbi4KKwkgKi8KKwlpZiAoeGZzX2lvZW5kX25ld19lb2YoaW9lbmQpKQorCQl4ZnNfbWFya19pbm9kZV9kaXJ0eV9zeW5jKFhGU19JKGlvZW5kLT5pb19pbm9kZSkpOworCiAJc3VibWl0X2JpbyhXUklURSwgYmlvKTsKIAlBU1NFUlQoIWJpb19mbGFnZ2VkKGJpbywgQklPX0VPUE5PVFNVUFApKTsKIAliaW9fcHV0KGJpbyk7CkBAIC0xNjM1LDQgKzE2NTMsNSBAQAogCS5kaXJlY3RfSU8JCT0geGZzX3ZtX2RpcmVjdF9JTywKIAkubWlncmF0ZXBhZ2UJCT0gYnVmZmVyX21pZ3JhdGVfcGFnZSwKIAkuaXNfcGFydGlhbGx5X3VwdG9kYXRlICA9IGJsb2NrX2lzX3BhcnRpYWxseV91cHRvZGF0ZSwKKwkuZXJyb3JfcmVtb3ZlX3BhZ2UJPSBnZW5lcmljX2Vycm9yX3JlbW92ZV9wYWdlLAogfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwppbmRleCA5ODhkOGY4Li5lZmY2MWUyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC00Miw3ICs0Miw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB4ZnNfZmlsZV92bV9vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHhmc19maWxlX3ZtX29wczsKIAogU1RBVElDIHNzaXplX3QKIHhmc19maWxlX2Fpb19yZWFkKApAQCAtMTc2LDE0ICsxNzYsNyBAQAogCXN0cnVjdCBkZW50cnkJCSpkZW50cnksCiAJaW50CQkJZGF0YXN5bmMpCiB7Ci0Jc3RydWN0IGlub2RlCQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7Ci0JaW50CQkJZXJyb3I7Ci0KLQkvKiBjYXB0dXJlIHNpemUgdXBkYXRlcyBpbiBJL08gY29tcGxldGlvbiBiZWZvcmUgd3JpdGluZyB0aGUgaW5vZGUuICovCi0JZXJyb3IgPSBmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGRlbnRyeS0+ZF9pbm9kZSk7CiAKIAl4ZnNfaWZsYWdzX2NsZWFyKGlwLCBYRlNfSVRSVU5DQVRFRCk7CiAJcmV0dXJuIC14ZnNfZnN5bmMoaXApOwpAQCAtMjgwLDcgKzI3Myw3IEBACiAJLmZzeW5jCQk9IHhmc19maWxlX2ZzeW5jLAogfTsKIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB4ZnNfZmlsZV92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHhmc19maWxlX3ZtX29wcyA9IHsKIAkuZmF1bHQJCT0gZmlsZW1hcF9mYXVsdCwKIAkucGFnZV9ta3dyaXRlCT0geGZzX3ZtX3BhZ2VfbWt3cml0ZSwKIH07CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKaW5kZXggZGEwMTU5ZC4uY2Q0MmVmNyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpAQCAtNTcsMTkgKzU3LDIyIEBACiAjaW5jbHVkZSA8bGludXgvZmllbWFwLmg+CiAKIC8qCi0gKiBCcmluZyB0aGUgYXRpbWUgaW4gdGhlIFhGUyBpbm9kZSB1cHRvZGF0ZS4KLSAqIFVzZWQgYmVmb3JlIGxvZ2dpbmcgdGhlIGlub2RlIHRvIGRpc2sgb3Igd2hlbiB0aGUgTGludXggaW5vZGUgZ29lcyBhd2F5LgorICogQnJpbmcgdGhlIHRpbWVzdGFtcHMgaW4gdGhlIFhGUyBpbm9kZSB1cHRvZGF0ZS4KKyAqCisgKiBVc2VkIGJlZm9yZSB3cml0aW5nIHRoZSBpbm9kZSB0byBkaXNrLgogICovCiB2b2lkCi14ZnNfc3luY2hyb25pemVfYXRpbWUoCit4ZnNfc3luY2hyb25pemVfdGltZXMoCiAJeGZzX2lub2RlX3QJKmlwKQogewogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBWRlNfSShpcCk7CiAKLQlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfQ0xFQVIpKSB7Ci0JCWlwLT5pX2QuZGlfYXRpbWUudF9zZWMgPSAoX19pbnQzMl90KWlub2RlLT5pX2F0aW1lLnR2X3NlYzsKLQkJaXAtPmlfZC5kaV9hdGltZS50X25zZWMgPSAoX19pbnQzMl90KWlub2RlLT5pX2F0aW1lLnR2X25zZWM7Ci0JfQorCWlwLT5pX2QuZGlfYXRpbWUudF9zZWMgPSAoX19pbnQzMl90KWlub2RlLT5pX2F0aW1lLnR2X3NlYzsKKwlpcC0+aV9kLmRpX2F0aW1lLnRfbnNlYyA9IChfX2ludDMyX3QpaW5vZGUtPmlfYXRpbWUudHZfbnNlYzsKKwlpcC0+aV9kLmRpX2N0aW1lLnRfc2VjID0gKF9faW50MzJfdClpbm9kZS0+aV9jdGltZS50dl9zZWM7CisJaXAtPmlfZC5kaV9jdGltZS50X25zZWMgPSAoX19pbnQzMl90KWlub2RlLT5pX2N0aW1lLnR2X25zZWM7CisJaXAtPmlfZC5kaV9tdGltZS50X3NlYyA9IChfX2ludDMyX3QpaW5vZGUtPmlfbXRpbWUudHZfc2VjOworCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gKF9faW50MzJfdClpbm9kZS0+aV9tdGltZS50dl9uc2VjOwogfQogCiAvKgpAQCAtMTA2LDMyICsxMDksMjAgQEAKIAlpZiAoKGZsYWdzICYgWEZTX0lDSEdUSU1FX01PRCkgJiYKIAkgICAgIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9tdGltZSwgJnR2KSkgewogCQlpbm9kZS0+aV9tdGltZSA9IHR2OwotCQlpcC0+aV9kLmRpX210aW1lLnRfc2VjID0gKF9faW50MzJfdCl0di50dl9zZWM7Ci0JCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gKF9faW50MzJfdCl0di50dl9uc2VjOwogCQlzeW5jX2l0ID0gMTsKIAl9CiAJaWYgKChmbGFncyAmIFhGU19JQ0hHVElNRV9DSEcpICYmCiAJICAgICF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfY3RpbWUsICZ0dikpIHsKIAkJaW5vZGUtPmlfY3RpbWUgPSB0djsKLQkJaXAtPmlfZC5kaV9jdGltZS50X3NlYyA9IChfX2ludDMyX3QpdHYudHZfc2VjOwotCQlpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYyA9IChfX2ludDMyX3QpdHYudHZfbnNlYzsKIAkJc3luY19pdCA9IDE7CiAJfQogCiAJLyoKLQkgKiBXZSB1cGRhdGUgdGhlIGlfdXBkYXRlX2NvcmUgZmllbGQgX2FmdGVyXyBjaGFuZ2luZwotCSAqIHRoZSB0aW1lc3RhbXBzIGluIG9yZGVyIHRvIGNvb3JkaW5hdGUgcHJvcGVybHkgd2l0aAotCSAqIHhmc19pZmx1c2goKSBzbyB0aGF0IHdlIGRvbid0IGxvc2UgdGltZXN0YW1wIHVwZGF0ZXMuCi0JICogVGhpcyBrZWVwcyB1cyBmcm9tIGhhdmluZyB0byBob2xkIHRoZSBpbm9kZSBsb2NrCi0JICogd2hpbGUgZG9pbmcgdGhpcy4gIFdlIHVzZSB0aGUgU1lOQ0hST05JWkUgbWFjcm8gdG8KLQkgKiBlbnN1cmUgdGhhdCB0aGUgY29tcGlsZXIgZG9lcyBub3QgcmVvcmRlciB0aGUgdXBkYXRlCi0JICogb2YgaV91cGRhdGVfY29yZSBhYm92ZSB0aGUgdGltZXN0YW1wIHVwZGF0ZXMgYWJvdmUuCisJICogVXBkYXRlIGNvbXBsZXRlIC0gbm93IG1ha2Ugc3VyZSBldmVyeW9uZSBrbm93cyB0aGF0IHRoZSBpbm9kZQorCSAqIGlzIGRpcnR5LgogCSAqLwotCWlmIChzeW5jX2l0KSB7Ci0JCVNZTkNIUk9OSVpFKCk7Ci0JCWlwLT5pX3VwZGF0ZV9jb3JlID0gMTsKKwlpZiAoc3luY19pdCkKIAkJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyhpcCk7Ci0JfQogfQogCiAvKgpAQCAtNTA2LDEwICs0OTcsOCBAQAogCXN0YXQtPmdpZCA9IGlwLT5pX2QuZGlfZ2lkOwogCXN0YXQtPmlubyA9IGlwLT5pX2lubzsKIAlzdGF0LT5hdGltZSA9IGlub2RlLT5pX2F0aW1lOwotCXN0YXQtPm10aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfbXRpbWUudF9zZWM7Ci0Jc3RhdC0+bXRpbWUudHZfbnNlYyA9IGlwLT5pX2QuZGlfbXRpbWUudF9uc2VjOwotCXN0YXQtPmN0aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfY3RpbWUudF9zZWM7Ci0Jc3RhdC0+Y3RpbWUudHZfbnNlYyA9IGlwLT5pX2QuZGlfY3RpbWUudF9uc2VjOworCXN0YXQtPm10aW1lID0gaW5vZGUtPmlfbXRpbWU7CisJc3RhdC0+Y3RpbWUgPSBpbm9kZS0+aV9jdGltZTsKIAlzdGF0LT5ibG9ja3MgPQogCQlYRlNfRlNCX1RPX0JCKG1wLCBpcC0+aV9kLmRpX25ibG9ja3MgKyBpcC0+aV9kZWxheWVkX2Jsa3MpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCmluZGV4IDQ5ZTRhNmEuLjA3MjA1MGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCkBAIC02NjcsNyArNjY3LDcgQEAKIAkJeGlwLT5pX25ld19zaXplID0gbmV3X3NpemU7CiAKIAlpZiAobGlrZWx5KCEoaW9mbGFncyAmIElPX0lOVklTKSkpCi0JCXhmc19pY2hndGltZSh4aXAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwkJZmlsZV91cGRhdGVfdGltZShmaWxlKTsKIAogCS8qCiAJICogSWYgdGhlIG9mZnNldCBpcyBiZXlvbmQgdGhlIHNpemUgb2YgdGhlIGZpbGUsIHdlIGhhdmUgYSBjb3VwbGUKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3F1b3Rhb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19xdW90YW9wcy5jCmluZGV4IDllNDFmOTEuLjNkNGEwYzggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3F1b3Rhb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfcXVvdGFvcHMuYwpAQCAtODAsNyArODAsNyBAQAogCiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCQlyZXR1cm4gLUVST0ZTOwotCWlmICghWEZTX0lTX1FVT1RBX1JVTk5JTkcobXApKQorCWlmIChvcCAhPSBRX1hRVU9UQVJNICYmICFYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpCiAJCXJldHVybiAtRU5PU1lTOwogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IGJkZDQxYzguLjE4YTRiOGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtOTc3LDYgKzk3NywyOCBAQAogfQogCiAvKgorICogRGlydHkgdGhlIFhGUyBpbm9kZSB3aGVuIG1hcmtfaW5vZGVfZGlydHlfc3luYygpIGlzIGNhbGxlZCBzbyB0aGF0CisgKiB3ZSBjYXRjaCB1bmxvZ2dlZCBWRlMgbGV2ZWwgdXBkYXRlcyB0byB0aGUgaW5vZGUuIENhcmUgbXVzdCBiZSB0YWtlbgorICogaGVyZSAtIHRoZSB0cmFuc2FjdGlvbiBjb2RlIGNhbGxzIG1hcmtfaW5vZGVfZGlydHlfc3luYygpIHRvIG1hcmsgdGhlCisgKiBWRlMgaW5vZGUgZGlydHkgaW4gYSB0cmFuc2FjdGlvbiBhbmQgY2xlYXJzIHRoZSBpX3VwZGF0ZV9jb3JlIGZpZWxkOworICogaXQgbXVzdCBjbGVhciB0aGUgZmllbGQgYWZ0ZXIgY2FsbGluZyBtYXJrX2lub2RlX2RpcnR5X3N5bmMoKSB0bworICogY29ycmVjdGx5IGluZGljYXRlIHRoYXQgdGhlIGRpcnR5IHN0YXRlIGhhcyBiZWVuIHByb3BhZ2F0ZWQgaW50byB0aGUKKyAqIGlub2RlIGxvZyBpdGVtLgorICoKKyAqIFdlIG5lZWQgdGhlIGJhcnJpZXIoKSB0byBtYWludGFpbiBjb3JyZWN0IG9yZGVyaW5nIGJldHdlZW4gdW5sb2dnZWQKKyAqIHVwZGF0ZXMgYW5kIHRoZSB0cmFuc2FjdGlvbiBjb21taXQgY29kZSB0aGF0IGNsZWFycyB0aGUgaV91cGRhdGVfY29yZQorICogZmllbGQuIFRoaXMgcmVxdWlyZXMgYWxsIHVwZGF0ZXMgdG8gYmUgY29tcGxldGVkIGJlZm9yZSBtYXJraW5nIHRoZQorICogaW5vZGUgZGlydHkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZnNfZGlydHlfaW5vZGUoCisJc3RydWN0IGlub2RlCSppbm9kZSkKK3sKKwliYXJyaWVyKCk7CisJWEZTX0koaW5vZGUpLT5pX3VwZGF0ZV9jb3JlID0gMTsKK30KKworLyoKICAqIEF0dGVtcHQgdG8gZmx1c2ggdGhlIGlub2RlLCB0aGlzIHdpbGwgYWN0dWFsbHkgZmFpbAogICogaWYgdGhlIGlub2RlIGlzIHBpbm5lZCwgYnV0IHdlIGRpcnR5IHRoZSBpbm9kZSBhZ2FpbgogICogYXQgdGhlIHBvaW50IHdoZW4gaXQgaXMgdW5waW5uZWQgYWZ0ZXIgYSBsb2cgd3JpdGUsCkBAIC0xMTI2LDcgKzExNDgsNyBAQAogfQogCiBTVEFUSUMgaW50Ci14ZnNfZnNfc3luY19zdXBlcigKK3hmc19mc19zeW5jX2ZzKAogCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCiAJaW50CQkJd2FpdCkKIHsKQEAgLTExMzQsMjMgKzExNTYsMjMgQEAKIAlpbnQJCQllcnJvcjsKIAogCS8qCi0JICogVHJlYXQgYSBzeW5jIG9wZXJhdGlvbiBsaWtlIGEgZnJlZXplLiAgVGhpcyBpcyB0byB3b3JrCi0JICogYXJvdW5kIGEgcmFjZSBpbiBzeW5jX2lub2RlcygpIHdoaWNoIHdvcmtzIGluIHR3byBwaGFzZXMKLQkgKiAtIGFuIGFzeW5jaHJvbm91cyBmbHVzaCwgd2hpY2ggY2FuIHdyaXRlIG91dCBhbiBpbm9kZQotCSAqIHdpdGhvdXQgd2FpdGluZyBmb3IgZmlsZSBzaXplIHVwZGF0ZXMgdG8gY29tcGxldGUsIGFuZCBhCi0JICogc3luY2hyb25vdXMgZmx1c2gsIHdoaWNoIHdvbnQgZG8gYW55dGhpbmcgYmVjYXVzZSB0aGUKLQkgKiBhc3luYyBmbHVzaCByZW1vdmVkIHRoZSBpbm9kZSdzIGRpcnR5IGZsYWcuICBBbHNvCi0JICogc3luY19pbm9kZXMoKSB3aWxsIG5vdCBzZWUgYW55IGZpbGVzIHRoYXQganVzdCBoYXZlCi0JICogb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zIHRvIGJlIGZsdXNoZWQgYmVjYXVzZSB3ZSBkb24ndAotCSAqIGRpcnR5IHRoZSBMaW51eCBpbm9kZSB1bnRpbCBhZnRlciB0aGUgdHJhbnNhY3Rpb24gSS9PCi0JICogY29tcGxldGVzLgorCSAqIE5vdCBtdWNoIHdlIGNhbiBkbyBmb3IgdGhlIGZpcnN0IGFzeW5jIHBhc3MuICBXcml0aW5nIG91dCB0aGUKKwkgKiBzdXBlcmJsb2NrIHdvdWxkIGJlIGNvdW50ZXItcHJvZHVjdGl2ZSBhcyB3ZSBhcmUgZ29pbmcgdG8gcmVkaXJ0eQorCSAqIHdoZW4gd3JpdGluZyBvdXQgb3RoZXIgZGF0YSBhbmQgbWV0YWRhdGEgKGFuZCB3cml0aW5nIG91dCBhIHNpbmdsZQorCSAqIGJsb2NrIGlzIHF1aXRlIGZhc3QgYW55d2F5KS4KKwkgKgorCSAqIFRyeSB0byBhc3luY2hyb25vdXNseSBraWNrIG9mZiBxdW90YSBzeW5jaW5nIGF0IGxlYXN0LgogCSAqLwotCWlmICh3YWl0IHx8IHVubGlrZWx5KHNiLT5zX2Zyb3plbiA9PSBTQl9GUkVFWkVfV1JJVEUpKQotCQllcnJvciA9IHhmc19xdWllc2NlX2RhdGEobXApOwotCWVsc2UKLQkJZXJyb3IgPSB4ZnNfc3luY19mc2RhdGEobXAsIDApOworCWlmICghd2FpdCkgeworCQl4ZnNfcW1fc3luYyhtcCwgU1lOQ19UUllMT0NLKTsKKwkJcmV0dXJuIDA7CisJfQogCi0JaWYgKHVubGlrZWx5KGxhcHRvcF9tb2RlKSkgeworCWVycm9yID0geGZzX3F1aWVzY2VfZGF0YShtcCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCisJaWYgKGxhcHRvcF9tb2RlKSB7CiAJCWludAlwcmV2X3N5bmNfc2VxID0gbXAtPm1fc3luY19zZXE7CiAKIAkJLyoKQEAgLTExNjksNyArMTE5MSw3IEBACiAJCQkJbXAtPm1fc3luY19zZXEgIT0gcHJldl9zeW5jX3NlcSk7CiAJfQogCi0JcmV0dXJuIC1lcnJvcjsKKwlyZXR1cm4gMDsKIH0KIAogU1RBVElDIGludApAQCAtMTUzOSwxMCArMTU2MSwxMSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHhmc19zdXBlcl9vcGVyYXRpb25zID0gewogCS5hbGxvY19pbm9kZQkJPSB4ZnNfZnNfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJCT0geGZzX2ZzX2Rlc3Ryb3lfaW5vZGUsCisJLmRpcnR5X2lub2RlCQk9IHhmc19mc19kaXJ0eV9pbm9kZSwKIAkud3JpdGVfaW5vZGUJCT0geGZzX2ZzX3dyaXRlX2lub2RlLAogCS5jbGVhcl9pbm9kZQkJPSB4ZnNfZnNfY2xlYXJfaW5vZGUsCiAJLnB1dF9zdXBlcgkJPSB4ZnNfZnNfcHV0X3N1cGVyLAotCS5zeW5jX2ZzCQk9IHhmc19mc19zeW5jX3N1cGVyLAorCS5zeW5jX2ZzCQk9IHhmc19mc19zeW5jX2ZzLAogCS5mcmVlemVfZnMJCT0geGZzX2ZzX2ZyZWV6ZSwKIAkuc3RhdGZzCQkJPSB4ZnNfZnNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCQk9IHhmc19mc19yZW1vdW50LApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jCmluZGV4IDMyMGJlNmEuLjk2MWRmMGEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMKQEAgLTMwOSwxMSArMzA5LDE1IEBACiBTVEFUSUMgaW50CiB4ZnNfY29tbWl0X2R1bW15X3RyYW5zKAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAotCXVpbnQJCQlsb2dfZmxhZ3MpCisJdWludAkJCWZsYWdzKQogewogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gbXAtPm1fcm9vdGlwOwogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwOwogCWludAkJCWVycm9yOworCWludAkJCWxvZ19mbGFncyA9IFhGU19MT0dfRk9SQ0U7CisKKwlpZiAoZmxhZ3MgJiBTWU5DX1dBSVQpCisJCWxvZ19mbGFncyB8PSBYRlNfTE9HX1NZTkM7CiAKIAkvKgogCSAqIFB1dCBhIGR1bW15IHRyYW5zYWN0aW9uIGluIHRoZSBsb2cgdG8gdGVsbCByZWNvdmVyeQpAQCAtMzMxLDEzICszMzUsMTIgQEAKIAl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwotCS8qIFhYWChoY2gpOiBpZ25vcmluZyB0aGUgZXJyb3IgaGVyZS4uICovCiAJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKLQogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKKwkvKiB0aGUgbG9nIGZvcmNlIGVuc3VyZXMgdGhpcyB0cmFuc2FjdGlvbiBpcyBwdXNoZWQgdG8gZGlzayAqLwogCXhmc19sb2dfZm9yY2UobXAsIDAsIGxvZ19mbGFncyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycm9yOwogfQogCiBpbnQKQEAgLTM4NSw3ICszODgsMjAgQEAKIAllbHNlCiAJCVhGU19CVUZfQVNZTkMoYnApOwogCi0JcmV0dXJuIHhmc19id3JpdGUobXAsIGJwKTsKKwllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIGRhdGEgaW50ZWdyaXR5IHN5bmMgbWFrZSBzdXJlIGFsbCBwZW5kaW5nIGJ1ZmZlcnMKKwkgKiBhcmUgZmx1c2hlZCBvdXQgZm9yIHRoZSBsb2cgY292ZXJhZ2UgY2hlY2sgYmVsb3cuCisJICovCisJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQorCQl4ZnNfZmx1c2hfYnVmdGFyZyhtcC0+bV9kZGV2X3RhcmdwLCAxKTsKKworCWlmICh4ZnNfbG9nX25lZWRfY292ZXJlZChtcCkpCisJCWVycm9yID0geGZzX2NvbW1pdF9kdW1teV90cmFucyhtcCwgZmxhZ3MpOworCXJldHVybiBlcnJvcjsKIAogIG91dF9icmVsc2U6CiAJeGZzX2J1Zl9yZWxzZShicCk7CkBAIC00MTksMTQgKzQzNSwxNiBAQAogCS8qIHB1c2ggbm9uLWJsb2NraW5nICovCiAJeGZzX3N5bmNfZGF0YShtcCwgMCk7CiAJeGZzX3FtX3N5bmMobXAsIFNZTkNfVFJZTE9DSyk7Ci0JeGZzX2ZpbGVzdHJlYW1fZmx1c2gobXApOwogCi0JLyogcHVzaCBhbmQgYmxvY2sgKi8KKwkvKiBwdXNoIGFuZCBibG9jayB0aWxsIGNvbXBsZXRlICovCiAJeGZzX3N5bmNfZGF0YShtcCwgU1lOQ19XQUlUKTsKIAl4ZnNfcW1fc3luYyhtcCwgU1lOQ19XQUlUKTsKIAorCS8qIGRyb3AgaW5vZGUgcmVmZXJlbmNlcyBwaW5uZWQgYnkgZmlsZXN0cmVhbXMgKi8KKwl4ZnNfZmlsZXN0cmVhbV9mbHVzaChtcCk7CisKIAkvKiB3cml0ZSBzdXBlcmJsb2NrIGFuZCBob292ZXIgdXAgc2h1dGRvd24gZXJyb3JzICovCi0JZXJyb3IgPSB4ZnNfc3luY19mc2RhdGEobXAsIDApOworCWVycm9yID0geGZzX3N5bmNfZnNkYXRhKG1wLCBTWU5DX1dBSVQpOwogCiAJLyogZmx1c2ggZGF0YS1vbmx5IGRldmljZXMgKi8KIAlpZiAobXAtPm1fcnRkZXZfdGFyZ3ApCkBAIC01NzAsOCArNTg4LDYgQEAKIAkJLyogZGdjOiBlcnJvcnMgaWdub3JlZCBoZXJlICovCiAJCWVycm9yID0geGZzX3FtX3N5bmMobXAsIFNZTkNfVFJZTE9DSyk7CiAJCWVycm9yID0geGZzX3N5bmNfZnNkYXRhKG1wLCBTWU5DX1RSWUxPQ0spOwotCQlpZiAoeGZzX2xvZ19uZWVkX2NvdmVyZWQobXApKQotCQkJZXJyb3IgPSB4ZnNfY29tbWl0X2R1bW15X3RyYW5zKG1wLCBYRlNfTE9HX0ZPUkNFKTsKIAl9CiAJbXAtPm1fc3luY19zZXErKzsKIAl3YWtlX3VwKCZtcC0+bV93YWl0X3NpbmdsZV9zeW5jX3Rhc2spOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuYwppbmRleCA5MTZjMGZmLi5jNWJjNjdjIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuYwpAQCAtMjYsNyArMjYsNiBAQAogeGZzX3N0YXRzX2NsZWFyX3Byb2NfaGFuZGxlcigKIAljdGxfdGFibGUJKmN0bCwKIAlpbnQJCXdyaXRlLAotCXN0cnVjdCBmaWxlCSpmaWxwLAogCXZvaWQJCV9fdXNlciAqYnVmZmVyLAogCXNpemVfdAkJKmxlbnAsCiAJbG9mZl90CQkqcHBvcykKQEAgLTM0LDcgKzMzLDcgQEAKIAlpbnQJCWMsIHJldCwgKnZhbHAgPSBjdGwtPmRhdGE7CiAJX191aW50MzJfdAl2bl9hY3RpdmU7CiAKLQlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heChjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAlpZiAoIXJldCAmJiB3cml0ZSAmJiAqdmFscCkgewogCQlwcmludGsoIlhGUyBDbGVhcmluZyB4ZnNzdGF0c1xuIik7CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKaW5kZXggNGU0Mjc2Yi4uNWQxYTNiOSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYwpAQCAtODc2LDcgKzg3Niw2IEBACiAJCWlwLT5pX2dkcXVvdCA9IE5VTEw7CiAJfQogCXhmc19pcHV0KGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JSVJFTEUoaXApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RmcmFnLmMgYi9mcy94ZnMveGZzX2RmcmFnLmMKaW5kZXggNzQ2NWY5ZS4uYWI4OWE3ZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kZnJhZy5jCisrKyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwpAQCAtMjA2LDEwICsyMDYsMTAgQEAKIAkgKiBwcm9jZXNzIHRoYXQgdGhlIGZpbGUgd2FzIG5vdCBjaGFuZ2VkIG91dCBmcm9tCiAJICogdW5kZXIgaXQuCiAJICovCi0JaWYgKChzYnAtPmJzX2N0aW1lLnR2X3NlYyAhPSBpcC0+aV9kLmRpX2N0aW1lLnRfc2VjKSB8fAotCSAgICAoc2JwLT5ic19jdGltZS50dl9uc2VjICE9IGlwLT5pX2QuZGlfY3RpbWUudF9uc2VjKSB8fAotCSAgICAoc2JwLT5ic19tdGltZS50dl9zZWMgIT0gaXAtPmlfZC5kaV9tdGltZS50X3NlYykgfHwKLQkgICAgKHNicC0+YnNfbXRpbWUudHZfbnNlYyAhPSBpcC0+aV9kLmRpX210aW1lLnRfbnNlYykpIHsKKwlpZiAoKHNicC0+YnNfY3RpbWUudHZfc2VjICE9IFZGU19JKGlwKS0+aV9jdGltZS50dl9zZWMpIHx8CisJICAgIChzYnAtPmJzX2N0aW1lLnR2X25zZWMgIT0gVkZTX0koaXApLT5pX2N0aW1lLnR2X25zZWMpIHx8CisJICAgIChzYnAtPmJzX210aW1lLnR2X3NlYyAhPSBWRlNfSShpcCktPmlfbXRpbWUudHZfc2VjKSB8fAorCSAgICAoc2JwLT5ic19tdGltZS50dl9uc2VjICE9IFZGU19JKGlwKS0+aV9tdGltZS50dl9uc2VjKSkgewogCQllcnJvciA9IFhGU19FUlJPUihFQlVTWSk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5jIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuYwppbmRleCBmYTkxM2U0NS4uNDFhZDUzNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX2xlYWYuYworKysgYi9mcy94ZnMveGZzX2RpcjJfbGVhZi5jCkBAIC04NTQsNiArODU0LDcgQEAKIAkJCSAqLwogCQkJcmFfd2FudCA9IGhvd21hbnkoYnVmc2l6ZSArIG1wLT5tX2RpcmJsa3NpemUsCiAJCQkJCSAgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKSAtIDE7CisJCQlBU1NFUlQocmFfd2FudCA+PSAwKTsKIAogCQkJLyoKIAkJCSAqIElmIHdlIGRvbid0IGhhdmUgYXMgbWFueSBhcyB3ZSB3YW50LCBhbmQgd2UgaGF2ZW4ndApAQCAtMTA4OCw3ICsxMDg5LDggQEAKIAkJICovCiAJCXB0ciArPSBsZW5ndGg7CiAJCWN1cm9mZiArPSBsZW5ndGg7Ci0JCWJ1ZnNpemUgLT0gbGVuZ3RoOworCQkvKiBidWZzaXplIG1heSBoYXZlIGp1c3QgYmVlbiBhIGd1ZXNzOyBkb24ndCBnbyBuZWdhdGl2ZSAqLworCQlidWZzaXplID0gYnVmc2l6ZSA+IGxlbmd0aCA/IGJ1ZnNpemUgLSBsZW5ndGggOiAwOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5jIGIvZnMveGZzL3hmc19pYWxsb2MuYwppbmRleCBhYjY0ZjNlLi4wNzg1Nzk3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmMKQEAgLTg4MCw2ICs4ODAsNyBAQAogCQkJCSAqIE5vdCBpbiByYW5nZSAtIHNhdmUgbGFzdCBzZWFyY2gKIAkJCQkgKiBsb2NhdGlvbiBhbmQgYWxsb2NhdGUgYSBuZXcgaW5vZGUKIAkJCQkgKi8KKwkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CiAJCQkJcGFnLT5wYWdsX2xlZnRyZWMgPSB0cmVjLmlyX3N0YXJ0aW5vOwogCQkJCXBhZy0+cGFnbF9yaWdodHJlYyA9IHJlYy5pcl9zdGFydGlubzsKIAkJCQlwYWctPnBhZ2xfcGFnaW5vID0gcGFnaW5vOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5jIGIvZnMveGZzL3hmc19pbm9kZS5jCmluZGV4IGMxZGM3ZWYuLmI5MmE0ZmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX2lub2RlLmMKQEAgLTMwNjgsOSArMzA2OCw5IEBACiAJU1lOQ0hST05JWkUoKTsKIAogCS8qCi0JICogTWFrZSBzdXJlIHRvIGdldCB0aGUgbGF0ZXN0IGF0aW1lIGZyb20gdGhlIExpbnV4IGlub2RlLgorCSAqIE1ha2Ugc3VyZSB0byBnZXQgdGhlIGxhdGVzdCB0aW1lc3RhbXBzIGZyb20gdGhlIExpbnV4IGlub2RlLgogCSAqLwotCXhmc19zeW5jaHJvbml6ZV9hdGltZShpcCk7CisJeGZzX3N5bmNocm9uaXplX3RpbWVzKGlwKTsKIAogCWlmIChYRlNfVEVTVF9FUlJPUihiZTE2X3RvX2NwdShkaXAtPmRpX21hZ2ljKSAhPSBYRlNfRElOT0RFX01BR0lDLAogCQkJICAgICAgIG1wLCBYRlNfRVJSVEFHX0lGTFVTSF8xLCBYRlNfUkFORE9NX0lGTFVTSF8xKSkgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5oIGIvZnMveGZzL3hmc19pbm9kZS5oCmluZGV4IDBiMzhiOWEuLjQxNTU1ZGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuaAorKysgYi9mcy94ZnMveGZzX2lub2RlLmgKQEAgLTUwNCw3ICs1MDQsNyBAQAogdm9pZAkJeGZzX2xvY2tfaW5vZGVzKHhmc19pbm9kZV90ICoqLCBpbnQsIHVpbnQpOwogdm9pZAkJeGZzX2xvY2tfdHdvX2lub2Rlcyh4ZnNfaW5vZGVfdCAqLCB4ZnNfaW5vZGVfdCAqLCB1aW50KTsKIAotdm9pZAkJeGZzX3N5bmNocm9uaXplX2F0aW1lKHhmc19pbm9kZV90ICopOwordm9pZAkJeGZzX3N5bmNocm9uaXplX3RpbWVzKHhmc19pbm9kZV90ICopOwogdm9pZAkJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyh4ZnNfaW5vZGVfdCAqKTsKIAogI2lmIGRlZmluZWQoWEZTX0lOT0RFX1RSQUNFKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwppbmRleCA0N2Q1YjY2Li45Nzk0Yjg3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwpAQCAtMjMyLDYgKzIzMiwxNSBAQAogCW52ZWNzCSAgICAgPSAxOwogCiAJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIGxpbnV4IGlub2RlIGlzIGRpcnR5LiBXZSBkbyB0aGlzIGJlZm9yZQorCSAqIGNsZWFyaW5nIGlfdXBkYXRlX2NvcmUgYXMgdGhlIFZGUyB3aWxsIGNhbGwgYmFjayBpbnRvCisJICogWEZTIGhlcmUgYW5kIHNldCBpX3VwZGF0ZV9jb3JlLCBzbyB3ZSBuZWVkIHRvIGRpcnR5IHRoZQorCSAqIGlub2RlIGZpcnN0IHNvIHRoYXQgdGhlIG9yZGVyaW5nIG9mIGlfdXBkYXRlX2NvcmUgYW5kCisJICogdW5sb2dnZWQgbW9kaWZpY2F0aW9ucyBzdGlsbCB3b3JrcyBhcyBkZXNjcmliZWQgYmVsb3cuCisJICovCisJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyhpcCk7CisKKwkvKgogCSAqIENsZWFyIGlfdXBkYXRlX2NvcmUgaWYgdGhlIHRpbWVzdGFtcHMgKG9yIGFueSBvdGhlcgogCSAqIG5vbi10cmFuc2FjdGlvbmFsIG1vZGlmaWNhdGlvbikgbmVlZCBmbHVzaGluZy9sb2dnaW5nCiAJICogYW5kIHdlJ3JlIGFib3V0IHRvIGxvZyB0aGVtIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGNvcmUuCkBAIC0yNjMsMTQgKzI3Miw5IEBACiAJfQogCiAJLyoKLQkgKiBNYWtlIHN1cmUgdG8gZ2V0IHRoZSBsYXRlc3QgYXRpbWUgZnJvbSB0aGUgTGludXggaW5vZGUuCisJICogTWFrZSBzdXJlIHRvIGdldCB0aGUgbGF0ZXN0IHRpbWVzdGFtcHMgZnJvbSB0aGUgTGludXggaW5vZGUuCiAJICovCi0JeGZzX3N5bmNocm9uaXplX2F0aW1lKGlwKTsKLQotCS8qCi0JICogbWFrZSBzdXJlIHRoZSBsaW51eCBpbm9kZSBpcyBkaXJ0eQotCSAqLwotCXhmc19tYXJrX2lub2RlX2RpcnR5X3N5bmMoaXApOworCXhmc19zeW5jaHJvbml6ZV90aW1lcyhpcCk7CiAKIAl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmlwLT5pX2Q7CiAJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHN0cnVjdCB4ZnNfaWNkaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pdGFibGUuYyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKaW5kZXggYjY4ZjkxMC4uNjJlZmFiMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pdGFibGUuYworKysgYi9mcy94ZnMveGZzX2l0YWJsZS5jCkBAIC01OSw2ICs1OSw3IEBACiB7CiAJeGZzX2ljZGlub2RlX3QJKmRpYzsJLyogZGlub2RlIGNvcmUgaW5mbyBwb2ludGVyICovCiAJeGZzX2lub2RlX3QJKmlwOwkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgaW5vZGUJKmlub2RlOwogCWludAkJZXJyb3I7CiAKIAllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sCkBAIC03Miw2ICs3Myw3IEBACiAJQVNTRVJUKGlwLT5pX2ltYXAuaW1fYmxrbm8gIT0gMCk7CiAKIAlkaWMgPSAmaXAtPmlfZDsKKwlpbm9kZSA9IFZGU19JKGlwKTsKIAogCS8qIHhmc19pZ2V0IHJldHVybnMgdGhlIGZvbGxvd2luZyB3aXRob3V0IG5lZWRpbmcKIAkgKiBmdXJ0aGVyIGNoYW5nZS4KQEAgLTgzLDE2ICs4NSwxOSBAQAogCWJ1Zi0+YnNfdWlkID0gZGljLT5kaV91aWQ7CiAJYnVmLT5ic19naWQgPSBkaWMtPmRpX2dpZDsKIAlidWYtPmJzX3NpemUgPSBkaWMtPmRpX3NpemU7CisKIAkvKgotCSAqIFdlIGFyZSByZWFkaW5nIHRoZSBhdGltZSBmcm9tIHRoZSBMaW51eCBpbm9kZSBiZWNhdXNlIHRoZQotCSAqIGRpbm9kZSBtaWdodCBub3QgYmUgdXB0b2RhdGUuCisJICogV2UgbmVlZCB0byByZWFkIHRoZSB0aW1lc3RhbXBzIGZyb20gdGhlIExpbnV4IGlub2RlIGJlY2F1c2UKKwkgKiB0aGUgVkZTIGtlZXBzIHdyaXRpbmcgZGlyZWN0bHkgaW50byB0aGUgaW5vZGUgc3RydWN0dXJlIGluc3RlYWQKKwkgKiBvZiB0ZWxsaW5nIHVzIGFib3V0IHRoZSB1cGRhdGVzLgogCSAqLwotCWJ1Zi0+YnNfYXRpbWUudHZfc2VjID0gVkZTX0koaXApLT5pX2F0aW1lLnR2X3NlYzsKLQlidWYtPmJzX2F0aW1lLnR2X25zZWMgPSBWRlNfSShpcCktPmlfYXRpbWUudHZfbnNlYzsKLQlidWYtPmJzX210aW1lLnR2X3NlYyA9IGRpYy0+ZGlfbXRpbWUudF9zZWM7Ci0JYnVmLT5ic19tdGltZS50dl9uc2VjID0gZGljLT5kaV9tdGltZS50X25zZWM7Ci0JYnVmLT5ic19jdGltZS50dl9zZWMgPSBkaWMtPmRpX2N0aW1lLnRfc2VjOwotCWJ1Zi0+YnNfY3RpbWUudHZfbnNlYyA9IGRpYy0+ZGlfY3RpbWUudF9uc2VjOworCWJ1Zi0+YnNfYXRpbWUudHZfc2VjID0gaW5vZGUtPmlfYXRpbWUudHZfc2VjOworCWJ1Zi0+YnNfYXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2F0aW1lLnR2X25zZWM7CisJYnVmLT5ic19tdGltZS50dl9zZWMgPSBpbm9kZS0+aV9tdGltZS50dl9zZWM7CisJYnVmLT5ic19tdGltZS50dl9uc2VjID0gaW5vZGUtPmlfbXRpbWUudHZfbnNlYzsKKwlidWYtPmJzX2N0aW1lLnR2X3NlYyA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYzsKKwlidWYtPmJzX2N0aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9uc2VjOworCiAJYnVmLT5ic194ZmxhZ3MgPSB4ZnNfaXAyeGZsYWdzKGlwKTsKIAlidWYtPmJzX2V4dHNpemUgPSBkaWMtPmRpX2V4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CiAJYnVmLT5ic19leHRlbnRzID0gZGljLT5kaV9uZXh0ZW50czsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwppbmRleCBhNDM0ZjI4Li5iNTcyZjdlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKKysrIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCkBAIC0yNDc2LDEyICsyNDc2LDYgQEAKIAlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkgfHwgaXAtPmlfZGVsYXllZF9ibGtzID09IDApOwogCiAJLyoKLQkgKiBNYWtlIHN1cmUgdGhlIGF0aW1lIGluIHRoZSBYRlMgaW5vZGUgaXMgY29ycmVjdCBiZWZvcmUgZnJlZWluZyB0aGUKLQkgKiBMaW51eCBpbm9kZS4KLQkgKi8KLQl4ZnNfc3luY2hyb25pemVfYXRpbWUoaXApOwotCi0JLyoKIAkgKiBJZiB3ZSBoYXZlIG5vdGhpbmcgdG8gZmx1c2ggd2l0aCB0aGlzIGlub2RlIHRoZW4gY29tcGxldGUgdGhlCiAJICogdGVhcmRvd24gbm93LCBvdGhlcndpc2UgYnJlYWsgdGhlIGxpbmsgYmV0d2VlbiB0aGUgeGZzIGlub2RlIGFuZCB0aGUKIAkgKiBsaW51eCBpbm9kZSBhbmQgY2xlYW4gdXAgdGhlIHhmcyBpbm9kZSBsYXRlci4gVGhpcyBhdm9pZHMgZmx1c2hpbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggMWNlZjEzOS4uM2NkOWNjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTcwLDcgKzcwLDYgQEAKIAlBQ1BJX0JVU19UWVBFX1BPV0VSLAogCUFDUElfQlVTX1RZUEVfUFJPQ0VTU09SLAogCUFDUElfQlVTX1RZUEVfVEhFUk1BTCwKLQlBQ1BJX0JVU19UWVBFX1NZU1RFTSwKIAlBQ1BJX0JVU19UWVBFX1BPV0VSX0JVVFRPTiwKIAlBQ1BJX0JVU19UWVBFX1NMRUVQX0JVVFRPTiwKIAlBQ1BJX0JVU19ERVZJQ0VfVFlQRV9DT1VOVApAQCAtMTQyLDEwICsxNDEsNyBAQAogCiBzdHJ1Y3QgYWNwaV9kZXZpY2VfZmxhZ3MgewogCXUzMiBkeW5hbWljX3N0YXR1czoxOwotCXUzMiBoYXJkd2FyZV9pZDoxOwotCXUzMiBjb21wYXRpYmxlX2lkczoxOwogCXUzMiBidXNfYWRkcmVzczoxOwotCXUzMiB1bmlxdWVfaWQ6MTsKIAl1MzIgcmVtb3ZhYmxlOjE7CiAJdTMyIGVqZWN0YWJsZToxOwogCXUzMiBsb2NrYWJsZToxOwpAQCAtMTU0LDcgKzE1MCw3IEBACiAJdTMyIHBlcmZvcm1hbmNlX21hbmFnZWFibGU6MTsKIAl1MzIgd2FrZV9jYXBhYmxlOjE7CS8qIFdha2V1cChfUFJXKSBzdXBwb3J0ZWQ/ICovCiAJdTMyIGZvcmNlX3Bvd2VyX3N0YXRlOjE7Ci0JdTMyIHJlc2VydmVkOjE5OworCXUzMiByZXNlcnZlZDoyMjsKIH07CiAKIC8qIEZpbGUgU3lzdGVtICovCkBAIC0xNzIsMjAgKzE2OCwyMyBAQAogdHlwZWRlZiBjaGFyIGFjcGlfZGV2aWNlX25hbWVbNDBdOwogdHlwZWRlZiBjaGFyIGFjcGlfZGV2aWNlX2NsYXNzWzIwXTsKIAorc3RydWN0IGFjcGlfaGFyZHdhcmVfaWQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwljaGFyICppZDsKK307CisKIHN0cnVjdCBhY3BpX2RldmljZV9wbnAgewogCWFjcGlfYnVzX2lkIGJ1c19pZDsJLyogT2JqZWN0IG5hbWUgKi8KIAlhY3BpX2J1c19hZGRyZXNzIGJ1c19hZGRyZXNzOwkvKiBfQURSICovCi0JY2hhciAqaGFyZHdhcmVfaWQ7CS8qIF9ISUQgKi8KLQlzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZF9saXN0ICpjaWRfbGlzdDsJLyogX0NJRHMgKi8KIAljaGFyICp1bmlxdWVfaWQ7CS8qIF9VSUQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlkczsJCS8qIF9ISUQgYW5kIF9DSURzICovCiAJYWNwaV9kZXZpY2VfbmFtZSBkZXZpY2VfbmFtZTsJLyogRHJpdmVyLWRldGVybWluZWQgKi8KIAlhY3BpX2RldmljZV9jbGFzcyBkZXZpY2VfY2xhc3M7CS8qICAgICAgICAiICAgICAgICAgICovCiB9OwogCiAjZGVmaW5lIGFjcGlfZGV2aWNlX2JpZChkKQkoKGQpLT5wbnAuYnVzX2lkKQogI2RlZmluZSBhY3BpX2RldmljZV9hZHIoZCkJKChkKS0+cG5wLmJ1c19hZGRyZXNzKQotI2RlZmluZSBhY3BpX2RldmljZV9oaWQoZCkJKChkKS0+cG5wLmhhcmR3YXJlX2lkKQotI2RlZmluZSBhY3BpX2RldmljZV91aWQoZCkJKChkKS0+cG5wLnVuaXF1ZV9pZCkKK2NoYXIgKmFjcGlfZGV2aWNlX2hpZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAjZGVmaW5lIGFjcGlfZGV2aWNlX25hbWUoZCkJKChkKS0+cG5wLmRldmljZV9uYW1lKQogI2RlZmluZSBhY3BpX2RldmljZV9jbGFzcyhkKQkoKGQpLT5wbnAuZGV2aWNlX2NsYXNzKQogCkBAIC0yNjIsNyArMjYxLDggQEAKIC8qIERldmljZSAqLwogCiBzdHJ1Y3QgYWNwaV9kZXZpY2UgewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlpbnQgZGV2aWNlX3R5cGU7CisJYWNwaV9oYW5kbGUgaGFuZGxlOwkJLyogbm8gaGFuZGxlIGZvciBmaXhlZCBoYXJkd2FyZSAqLwogCXN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50OwogCXN0cnVjdCBsaXN0X2hlYWQgY2hpbGRyZW47CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwpAQCAtMzIyLDYgKzMyMiw4IEBACiAKIGludCBhY3BpX2J1c19nZXRfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfZGV2aWNlICoqZGV2aWNlKTsKIHZvaWQgYWNwaV9idXNfZGF0YV9oYW5kbGVyKGFjcGlfaGFuZGxlIGhhbmRsZSwgdm9pZCAqY29udGV4dCk7CithY3BpX3N0YXR1cyBhY3BpX2J1c19nZXRfc3RhdHVzX2hhbmRsZShhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqc3RhKTsKIGludCBhY3BpX2J1c19nZXRfc3RhdHVzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIGludCBhY3BpX2J1c19nZXRfcG93ZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnN0YXRlKTsKIGludCBhY3BpX2J1c19zZXRfcG93ZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2J1dHRvbi5oIGIvaW5jbHVkZS9hY3BpL2J1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWVhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FjcGkvYnV0dG9uLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBBQ1BJX0JVVFRPTl9ICisjZGVmaW5lIEFDUElfQlVUVE9OX0gKKworI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19BQ1BJX0JVVFRPTikgfHwgZGVmaW5lZChDT05GSUdfQUNQSV9CVVRUT05fTU9EVUxFKQorZXh0ZXJuIGludCBhY3BpX2xpZF9ub3RpZmllcl9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiBpbnQgYWNwaV9saWRfbm90aWZpZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiBpbnQgYWNwaV9saWRfb3Blbih2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhY3BpX2xpZF9ub3RpZmllcl9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgYWNwaV9saWRfbm90aWZpZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgYWNwaV9saWRfb3Blbih2b2lkKQoreworCXJldHVybiAxOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0FDUElfQlVUVE9OKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX0JVVFRPTl9NT0RVTEUpICovCisKKyNlbmRpZiAvKiBBQ1BJX0JVVFRPTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKaW5kZXggNGQzZTQ4My4uMGMzZGQ4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaApAQCAtNzMsNiArNzMsMTkgQEAKICNkZWZpbmUgRl9TRVRTSUcJMTAJLyogZm9yIHNvY2tldHMuICovCiAjZGVmaW5lIEZfR0VUU0lHCTExCS8qIGZvciBzb2NrZXRzLiAqLwogI2VuZGlmCisjaWZuZGVmIEZfU0VUT1dOX0VYCisjZGVmaW5lIEZfU0VUT1dOX0VYCTEyCisjZGVmaW5lIEZfR0VUT1dOX0VYCTEzCisjZW5kaWYKKworI2RlZmluZSBGX09XTkVSX1RJRAkwCisjZGVmaW5lIEZfT1dORVJfUElECTEKKyNkZWZpbmUgRl9PV05FUl9HSUQJMgorCitzdHJ1Y3QgZl9vd25lcl9leCB7CisJaW50CXR5cGU7CisJcGlkX3QJcGlkOworfTsKIAogLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KICNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAppbmRleCA5Y2NhMzc4Li42NmQ2MTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX0FTTV9HRU5FUklDX0dQSU9fSAogI2RlZmluZSBfQVNNX0dFTkVSSUNfR1BJT19ICiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvaGFyZGlycS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9oYXJkaXJxLmgKaW5kZXggMjNiYjRkYS4uNjJmNTkwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9oYXJkaXJxLmgKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKIHR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIF9fc29mdGlycV9wZW5kaW5nOworCXVuc2lnbmVkIGludCBfX3NvZnRpcnFfcGVuZGluZzsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkIGlycV9jcHVzdGF0X3Q7CiAKICNpbmNsdWRlIDxsaW51eC9pcnFfY3B1c3RhdC5oPgkvKiBTdGFuZGFyZCBtYXBwaW5ncyBmb3IgaXJxX2NwdXN0YXRfdCBhYm92ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oCmluZGV4IGRkNjNiZDMuLjVlZTEzYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgTUFEVl9SRU1PVkUJOQkJLyogcmVtb3ZlIHRoZXNlIHBhZ2VzICYgcmVzb3VyY2VzICovCiAjZGVmaW5lIE1BRFZfRE9OVEZPUksJMTAJCS8qIGRvbid0IGluaGVyaXQgYWNyb3NzIGZvcmsgKi8KICNkZWZpbmUgTUFEVl9ET0ZPUksJMTEJCS8qIGRvIGluaGVyaXQgYWNyb3NzIGZvcmsgKi8KKyNkZWZpbmUgTUFEVl9IV1BPSVNPTgkxMDAJCS8qIHBvaXNvbiBhIHBhZ2UgZm9yIHRlc3RpbmcgKi8KIAogI2RlZmluZSBNQURWX01FUkdFQUJMRSAgIDEyCQkvKiBLU00gbWF5IG1lcmdlIGlkZW50aWNhbCBwYWdlcyAqLwogI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCQkvKiBLU00gbWF5IG5vdCBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmgKaW5kZXggYzg0MDcxOS4uOTQyZDMwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmgKQEAgLTgyLDYgKzgyLDcgQEAKICNpZmRlZiBfX0FSQ0hfU0lfVFJBUE5PCiAJCQlpbnQgX3RyYXBubzsJLyogVFJBUCAjIHdoaWNoIGNhdXNlZCB0aGUgc2lnbmFsICovCiAjZW5kaWYKKwkJCXNob3J0IF9hZGRyX2xzYjsgLyogTFNCIG9mIHRoZSByZXBvcnRlZCBhZGRyZXNzICovCiAJCX0gX3NpZ2ZhdWx0OwogCiAJCS8qIFNJR1BPTEwgKi8KQEAgLTExMiw2ICsxMTMsNyBAQAogI2lmZGVmIF9fQVJDSF9TSV9UUkFQTk8KICNkZWZpbmUgc2lfdHJhcG5vCV9zaWZpZWxkcy5fc2lnZmF1bHQuX3RyYXBubwogI2VuZGlmCisjZGVmaW5lIHNpX2FkZHJfbHNiCV9zaWZpZWxkcy5fc2lnZmF1bHQuX2FkZHJfbHNiCiAjZGVmaW5lIHNpX2JhbmQJCV9zaWZpZWxkcy5fc2lncG9sbC5fYmFuZAogI2RlZmluZSBzaV9mZAkJX3NpZmllbGRzLl9zaWdwb2xsLl9mZAogCkBAIC0xOTIsNyArMTk0LDExIEBACiAjZGVmaW5lIEJVU19BRFJBTE4JKF9fU0lfRkFVTFR8MSkJLyogaW52YWxpZCBhZGRyZXNzIGFsaWdubWVudCAqLwogI2RlZmluZSBCVVNfQURSRVJSCShfX1NJX0ZBVUxUfDIpCS8qIG5vbi1leGlzdGFudCBwaHlzaWNhbCBhZGRyZXNzICovCiAjZGVmaW5lIEJVU19PQkpFUlIJKF9fU0lfRkFVTFR8MykJLyogb2JqZWN0IHNwZWNpZmljIGhhcmR3YXJlIGVycm9yICovCi0jZGVmaW5lIE5TSUdCVVMJCTMKKy8qIGhhcmR3YXJlIG1lbW9yeSBlcnJvciBjb25zdW1lZCBvbiBhIG1hY2hpbmUgY2hlY2s6IGFjdGlvbiByZXF1aXJlZCAqLworI2RlZmluZSBCVVNfTUNFRVJSX0FSCShfX1NJX0ZBVUxUfDQpCisvKiBoYXJkd2FyZSBtZW1vcnkgZXJyb3IgZGV0ZWN0ZWQgaW4gcHJvY2VzcyBidXQgbm90IGNvbnN1bWVkOiBhY3Rpb24gb3B0aW9uYWwqLworI2RlZmluZSBCVVNfTUNFRVJSX0FPCShfX1NJX0ZBVUxUfDUpCisjZGVmaW5lIE5TSUdCVVMJCTUKIAogLyoKICAqIFNJR1RSQVAgc2lfY29kZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdG9wb2xvZ3kuaAppbmRleCA4OGJhZGEyLi41MTBkZjM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy90b3BvbG9neS5oCkBAIC0zNyw5ICszNyw2IEBACiAjaWZuZGVmIHBhcmVudF9ub2RlCiAjZGVmaW5lIHBhcmVudF9ub2RlKG5vZGUpCSgodm9pZCkobm9kZSksMCkKICNlbmRpZgotI2lmbmRlZiBub2RlX3RvX2NwdW1hc2sKLSNkZWZpbmUgbm9kZV90b19jcHVtYXNrKG5vZGUpCSgodm9pZClub2RlLCBjcHVfb25saW5lX21hcCkKLSNlbmRpZgogI2lmbmRlZiBjcHVtYXNrX29mX25vZGUKICNkZWZpbmUgY3B1bWFza19vZl9ub2RlKG5vZGUpCSgodm9pZClub2RlLCBjcHVfb25saW5lX21hc2spCiAjZW5kaWYKQEAgLTU1LDE4ICs1Miw0IEBACiAKICNlbmRpZgkvKiBDT05GSUdfTlVNQSAqLwogCi0vKgotICogcmV0dXJucyBwb2ludGVyIHRvIGNwdW1hc2sgZm9yIHNwZWNpZmllZCBub2RlCi0gKiBEZXByZWNhdGVkOiB1c2UgImNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrID0gY3B1bWFza19vZl9ub2RlKG5vZGUpIgotICovCi0jaWZuZGVmIG5vZGVfdG9fY3B1bWFza19wdHIKLQotI2RlZmluZQlub2RlX3RvX2NwdW1hc2tfcHRyKHYsIG5vZGUpIAkJCQkJXAotCQljcHVtYXNrX3QgXyMjdiA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsJCQlcCi0JCWNvbnN0IGNwdW1hc2tfdCAqdiA9ICZfIyN2Ci0KLSNkZWZpbmUgbm9kZV90b19jcHVtYXNrX3B0cl9uZXh0KHYsIG5vZGUpCQkJCVwKLQkJCSAgXyMjdiA9IG5vZGVfdG9fY3B1bWFzayhub2RlKQotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfVE9QT0xPR1lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCmluZGV4IDI5Y2E4ZjUuLmI2ZTgxOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKQEAgLTcyMSwxMiArNzIxLDEyIEBACiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7CQkJCQkJXAogCS5kYXRhIDogQVQoQUREUiguZGF0YSkgLSBMT0FEX09GRlNFVCkgewkJCQlcCiAJCUlOSVRfVEFTS19EQVRBKGluaXR0YXNrKQkJCQlcCisJCU5PU0FWRV9EQVRBCQkJCQkJXAorCQlQQUdFX0FMSUdORURfREFUQShwYWdlYWxpZ25lZCkJCQkJXAogCQlDQUNIRUxJTkVfQUxJR05FRF9EQVRBKGNhY2hlbGluZSkJCQlcCiAJCVJFQURfTU9TVExZX0RBVEEoY2FjaGVsaW5lKQkJCQlcCiAJCURBVEFfREFUQQkJCQkJCVwKIAkJQ09OU1RSVUNUT1JTCQkJCQkJXAotCQlOT1NBVkVfREFUQQkJCQkJCVwKLQkJUEFHRV9BTElHTkVEX0RBVEEocGFnZWFsaWduZWQpCQkJCVwKIAl9CiAKICNkZWZpbmUgSU5JVF9URVhUX1NFQ1RJT04oaW5pdHRleHRfYWxpZ24pCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCmluZGV4IGFlMWU5ZTEuLmI2OTM0N2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaApAQCAtMzg3LDYgKzM4Nyw3IEBACiAgKiBAZ2V0X21vZGVzOiBnZXQgbW9kZSBsaXN0IGZvciB0aGlzIGNvbm5lY3RvcgogICogQHNldF9wcm9wZXJ0eTogcHJvcGVydHkgZm9yIHRoaXMgY29ubmVjdG9yIG1heSBuZWVkIHVwZGF0ZQogICogQGRlc3Ryb3k6IG1ha2Ugb2JqZWN0IGdvIGF3YXkKKyAqIEBmb3JjZTogbm90aWZ5IHRoZSBkcml2ZXIgdGhlIGNvbm5lY3RvciBpcyBmb3JjZWQgb24KICAqCiAgKiBFYWNoIENSVEMgbWF5IGhhdmUgb25lIG9yIG1vcmUgY29ubmVjdG9ycyBhdHRhY2hlZCB0byBpdC4gIFRoZSBmdW5jdGlvbnMKICAqIGJlbG93IGFsbG93IHRoZSBjb3JlIERSTSBjb2RlIHRvIGNvbnRyb2wgY29ubmVjdG9ycywgZW51bWVyYXRlIGF2YWlsYWJsZSBtb2RlcywKQEAgLTQwMSw2ICs0MDIsNyBAQAogCWludCAoKnNldF9wcm9wZXJ0eSkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCiAJCQkgICAgIHVpbnQ2NF90IHZhbCk7CiAJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworCXZvaWQgKCpmb3JjZSkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CiB9OwogCiBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgewpAQCAtNDI5LDYgKzQzMSwxMyBAQAogCXZvaWQgKmhlbHBlcl9wcml2YXRlOwogfTsKIAorZW51bSBkcm1fY29ubmVjdG9yX2ZvcmNlIHsKKwlEUk1fRk9SQ0VfVU5TUEVDSUZJRUQsCisJRFJNX0ZPUkNFX09GRiwKKwlEUk1fRk9SQ0VfT04sICAgICAgICAgLyogZm9yY2Ugb24gYW5hbG9nIHBhcnQgbm9ybWFsbHkgKi8KKwlEUk1fRk9SQ0VfT05fRElHSVRBTCwgLyogZm9yIERWSS1JIHVzZSBkaWdpdGFsIGNvbm5lY3RvciAqLworfTsKKwogLyoqCiAgKiBkcm1fY29ubmVjdG9yIC0gY2VudHJhbCBEUk0gY29ubmVjdG9yIGNvbnRyb2wgc3RydWN0dXJlCiAgKiBAY3J0YzogQ1JUQyB0aGlzIGNvbm5lY3RvciBpcyBjdXJyZW50bHkgY29ubmVjdGVkIHRvLCBOVUxMIGlmIG5vbmUKQEAgLTQ3OCw5ICs0ODcsMTIgQEAKIAogCXZvaWQgKmhlbHBlcl9wcml2YXRlOwogCisJLyogZm9yY2VkIG9uIGNvbm5lY3RvciAqLworCWVudW0gZHJtX2Nvbm5lY3Rvcl9mb3JjZSBmb3JjZTsKIAl1aW50MzJfdCBlbmNvZGVyX2lkc1tEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSXTsKIAl1aW50MzJfdCBmb3JjZV9lbmNvZGVyX2lkOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsgLyogY3VycmVudGx5IGFjdGl2ZSBlbmNvZGVyICovCisJdm9pZCAqZmJfaGVscGVyX3ByaXZhdGU7CiB9OwogCiAvKioKQEAgLTc0Niw3ICs3NTgsNyBAQAogZXh0ZXJuIGJvb2wgZHJtX2RldGVjdF9oZG1pX21vbml0b3Ioc3RydWN0IGVkaWQgKmVkaWQpOwogZXh0ZXJuIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fY3Z0X21vZGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQlpbnQgaGRpc3BsYXksIGludCB2ZGlzcGxheSwgaW50IHZyZWZyZXNoLAotCQkJCWJvb2wgcmVkdWNlZCwgYm9vbCBpbnRlcmxhY2VkKTsKKwkJCQlib29sIHJlZHVjZWQsIGJvb2wgaW50ZXJsYWNlZCwgYm9vbCBtYXJnaW5zKTsKIGV4dGVybiBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZHJtX2d0Zl9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJaW50IGhkaXNwbGF5LCBpbnQgdmRpc3BsYXksIGludCB2cmVmcmVzaCwKIAkJCQlib29sIGludGVybGFjZWQsIGludCBtYXJnaW5zKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKaW5kZXggNGM4ZGFjYS4uYjI5ZTIwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKQEAgLTM5LDYgKzM5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAKKyNpbmNsdWRlICJkcm1fZmJfaGVscGVyLmgiCiBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIHsKIAkvKgogCSAqIENvbnRyb2wgcG93ZXIgbGV2ZWxzIG9uIHRoZSBDUlRDLiAgSWYgdGhlIG1vZGUgcGFzc2VkIGluIGlzCkBAIC02MCw2ICs2MSw5IEBACiAJLyogTW92ZSB0aGUgY3J0YyBvbiB0aGUgY3VycmVudCBmYiB0byB0aGUgZ2l2ZW4gcG9zaXRpb24gKm9wdGlvbmFsKiAqLwogCWludCAoKm1vZGVfc2V0X2Jhc2UpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAogCQkJICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpOworCisJLyogcmVsb2FkIHRoZSBjdXJyZW50IGNydGMgTFVUICovCisJdm9pZCAoKmxvYWRfbHV0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogfTsKIAogc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyB7CkBAIC0xMTksMTAgKzEyMywxMSBAQAogCWVuY29kZXItPmhlbHBlcl9wcml2YXRlID0gKHZvaWQgKilmdW5jczsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRybV9jb25uZWN0b3JfaGVscGVyX2FkZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorc3RhdGljIGlubGluZSBpbnQgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCQkJCSAgICBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgKmZ1bmNzKQogewogCWNvbm5lY3Rvci0+aGVscGVyX3ByaXZhdGUgPSAodm9pZCAqKWZ1bmNzOworCXJldHVybiBkcm1fZmJfaGVscGVyX2FkZF9jb25uZWN0b3IoY29ubmVjdG9yKTsKIH0KIAogZXh0ZXJuIGludCBkcm1faGVscGVyX3Jlc3VtZV9mb3JjZV9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCmluZGV4IDg4ZmZmYmQuLjU4Yzg5MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKQEAgLTM1LDkgKzM1LDMwIEBACiAJc3RydWN0IGRybV9tb2RlX3NldCBtb2RlX3NldDsKIH07CiAKKwogc3RydWN0IGRybV9mYl9oZWxwZXJfZnVuY3MgewogCXZvaWQgKCpnYW1tYV9zZXQpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2IHJlZCwgdTE2IGdyZWVuLAogCQkJICB1MTYgYmx1ZSwgaW50IHJlZ25vKTsKKwl2b2lkICgqZ2FtbWFfZ2V0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUxNiAqcmVkLCB1MTYgKmdyZWVuLAorCQkJICB1MTYgKmJsdWUsIGludCByZWdubyk7Cit9OworCisvKiBtb2RlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lICovCitzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9jbWRsaW5lX21vZGUgeworCWJvb2wgc3BlY2lmaWVkOworCWJvb2wgcmVmcmVzaF9zcGVjaWZpZWQ7CisJYm9vbCBicHBfc3BlY2lmaWVkOworCWludCB4cmVzLCB5cmVzOworCWludCBicHA7CisJaW50IHJlZnJlc2g7CisJYm9vbCByYjsKKwlib29sIGludGVybGFjZTsKKwlib29sIGN2dDsKKwlib29sIG1hcmdpbnM7Cit9OworCitzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9jb25uZWN0b3IgeworCXN0cnVjdCBkcm1fZmJfaGVscGVyX2NtZGxpbmVfbW9kZSBjbWRsaW5lX21vZGU7CiB9OwogCiBzdHJ1Y3QgZHJtX2ZiX2hlbHBlciB7CkBAIC01MiwxMSArNzMsMTQgQEAKIH07CiAKIGludCBkcm1fZmJfaGVscGVyX3NpbmdsZV9mYl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgaW50IHByZWZlcnJlZF9icHAsCiAJCQkJICBpbnQgKCpmYl9jcmVhdGUpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCQkgICB1aW50MzJfdCBmYl93aWR0aCwKIAkJCQkJCSAgIHVpbnQzMl90IGZiX2hlaWdodCwKIAkJCQkJCSAgIHVpbnQzMl90IHN1cmZhY2Vfd2lkdGgsCiAJCQkJCQkgICB1aW50MzJfdCBzdXJmYWNlX2hlaWdodCwKKwkJCQkJCSAgIHVpbnQzMl90IHN1cmZhY2VfZGVwdGgsCisJCQkJCQkgICB1aW50MzJfdCBzdXJmYWNlX2JwcCwKIAkJCQkJCSAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKipmYl9wdHIpKTsKIGludCBkcm1fZmJfaGVscGVyX2luaXRfY3J0Y19jb3VudChzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLCBpbnQgY3J0Y19jb3VudCwKIAkJCQkgIGludCBtYXhfY29ubik7CkBAIC03Nyw2ICsxMDEsMTEgQEAKIHZvaWQgZHJtX2ZiX2hlbHBlcl9yZXN0b3JlKHZvaWQpOwogdm9pZCBkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKIAkJCSAgICB1aW50MzJfdCBmYl93aWR0aCwgdWludDMyX3QgZmJfaGVpZ2h0KTsKLXZvaWQgZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdWludDMyX3QgcGl0Y2gpOwordm9pZCBkcm1fZmJfaGVscGVyX2ZpbGxfZml4KHN0cnVjdCBmYl9pbmZvICppbmZvLCB1aW50MzJfdCBwaXRjaCwKKwkJCSAgICB1aW50MzJfdCBkZXB0aCk7CisKK2ludCBkcm1fZmJfaGVscGVyX2FkZF9jb25uZWN0b3Ioc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CitpbnQgZHJtX2ZiX2hlbHBlcl9wYXJzZV9jb21tYW5kX2xpbmUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgZHJtX2ZiX2hlbHBlcl9zZXRjbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oIGIvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCmluZGV4IDg1MzUwODQuLmU2ZjNiMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKQEAgLTgwLDcgKzgwLDcgQEAKIAl7MHgxMDAyLCAweDUxNTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyMDB9LCBcCiAJezB4MTAwMiwgMHg1MTU5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMTAwfSwgXAogCXsweDEwMDIsIDB4NTE1QSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjEwMH0sIFwKLQl7MHgxMDAyLCAweDUxNUUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB9LCBcCisJezB4MTAwMiwgMHg1MTVFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMTAwfFJBREVPTl9TSU5HTEVfQ1JUQ30sIFwKIAl7MHgxMDAyLCAweDU0NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzODB8UkFERU9OX0lTX01PQklMSVRZfSwgXAogCXsweDEwMDIsIDB4NTQ2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM4MHxSQURFT05fSVNfTU9CSUxJVFl9LCBcCiAJezB4MTAwMiwgMHg1NDY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMzgwfFJBREVPTl9JU19NT0JJTElUWX0sIFwKQEAgLTExMyw3ICsxMTMsNyBAQAogCXsweDEwMDIsIDB4NTk2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjI4MH0sIFwKIAl7MHgxMDAyLCAweDU5NjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCiAJezB4MTAwMiwgMHg1OTY1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAotCXsweDEwMDIsIDB4NTk2OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjEwMH0sIFwKKwl7MHgxMDAyLCAweDU5NjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYxMDB8UkFERU9OX1NJTkdMRV9DUlRDfSwgXAogCXsweDEwMDIsIDB4NWE0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzQwMHxSQURFT05fSVNfSUdQfFJBREVPTl9JU19JR1BHQVJUfSwgXAogCXsweDEwMDIsIDB4NWE0MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzQwMHxSQURFT05fSVNfSUdQfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fSVNfSUdQR0FSVH0sIFwKIAl7MHgxMDAyLCAweDVhNjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlM0MDB8UkFERU9OX0lTX0lHUHxSQURFT05fSVNfSUdQR0FSVH0sIFwKQEAgLTU1Miw2ICs1NTIsNyBAQAogCXsweDgwODYsIDB4MmUxMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIDB4ZmZmZjAwLCAwfSwgXAogCXsweDgwODYsIDB4MmUyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIDB4ZmZmZjAwLCAwfSwgXAogCXsweDgwODYsIDB4MmUzMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIDB4ZmZmZjAwLCAwfSwgXAorCXsweDgwODYsIDB4MmU0MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIDB4ZmZmZjAwLCAwfSwgXAogCXsweDgwODYsIDB4YTAwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIDB4ZmZmZjAwLCAwfSwgXAogCXsweDgwODYsIDB4YTAxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIDB4ZmZmZjAwLCAwfSwgXAogCXsweDgwODYsIDB4MzVlOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIDB4ZmZmZjAwLCAwfSwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaCBiL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmgKaW5kZXggOGUxZTkyNS4uN2UwY2IxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaAorKysgYi9pbmNsdWRlL2RybS9pOTE1X2RybS5oCkBAIC0xODUsNiArMTg1LDcgQEAKICNkZWZpbmUgRFJNX0k5MTVfR0VNX0dFVF9BUEVSVFVSRSAweDIzCiAjZGVmaW5lIERSTV9JOTE1X0dFTV9NTUFQX0dUVAkweDI0CiAjZGVmaW5lIERSTV9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRAkweDI1CisjZGVmaW5lIERSTV9JOTE1X0dFTV9NQURWSVNFCTB4MjYKIAogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUCQlEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfSU5JVCwgZHJtX2k5MTVfaW5pdF90KQogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9GTFVTSAkJRFJNX0lPICggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0ZMVVNIKQpAQCAtMjIxLDYgKzIyMiw3IEBACiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfVElMSU5HCURSTV9JT1dSIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0dFVF9USUxJTkcsIHN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3RpbGluZykKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9BUEVSVFVSRQlEUk1fSU9SICAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9HRVRfQVBFUlRVUkUsIHN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X2FwZXJ0dXJlKQogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRVRfUElQRV9GUk9NX0NSVENfSUQgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFVF9QSVBFX0ZST01fQ1JUQ19JRCwgc3RydWN0IGRybV9pbnRlbF9nZXRfcGlwZV9mcm9tX2NydGNfaWQpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9NQURWSVNFCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fTUFEVklTRSwgc3RydWN0IGRybV9pOTE1X2dlbV9tYWR2aXNlKQogCiAvKiBBbGxvdyBkcml2ZXJzIHRvIHN1Ym1pdCBiYXRjaGJ1ZmZlcnMgZGlyZWN0bHkgdG8gaGFyZHdhcmUsIHJlbHlpbmcKICAqIG9uIHRoZSBzZWN1cml0eSBtZWNoYW5pc21zIHByb3ZpZGVkIGJ5IGhhcmR3YXJlLgpAQCAtNjY3LDQgKzY2OSwyMSBAQAogCV9fdTMyIHBpcGU7CiB9OwogCisjZGVmaW5lIEk5MTVfTUFEVl9XSUxMTkVFRCAwCisjZGVmaW5lIEk5MTVfTUFEVl9ET05UTkVFRCAxCisjZGVmaW5lIF9fSTkxNV9NQURWX1BVUkdFRCAyIC8qIGludGVybmFsIHN0YXRlICovCisKK3N0cnVjdCBkcm1faTkxNV9nZW1fbWFkdmlzZSB7CisJLyoqIEhhbmRsZSBvZiB0aGUgYnVmZmVyIHRvIGNoYW5nZSB0aGUgYmFja2luZyBzdG9yZSBhZHZpY2UgKi8KKwlfX3UzMiBoYW5kbGU7CisKKwkvKiBBZHZpY2U6IGVpdGhlciB0aGUgYnVmZmVyIHdpbGwgYmUgbmVlZGVkIGFnYWluIGluIHRoZSBuZWFyIGZ1dHVyZSwKKwkgKiAgICAgICAgIG9yIHdvbnQgYmUgYW5kIGNvdWxkIGJlIGRpc2NhcmRlZCB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCisJICovCisJX191MzIgbWFkdjsKKworCS8qKiBXaGV0aGVyIHRoZSBiYWNraW5nIHN0b3JlIHN0aWxsIGV4aXN0cy4gKi8KKwlfX3UzMiByZXRhaW5lZDsKK307CisKICNlbmRpZgkJCQkvKiBfSTkxNV9EUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKaW5kZXggY2ZmNGExMC4uMWZlZWQ3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTEyNiw2ICsxMjYsNyBAQAogaGVhZGVyLXkgKz0gbmw4MDIxMS5oCiBoZWFkZXIteSArPSBwYXJhbS5oCiBoZWFkZXIteSArPSBwY2lfcmVncy5oCitoZWFkZXIteSArPSBwZXJmX2V2ZW50LmgKIGhlYWRlci15ICs9IHBma2V5djIuaAogaGVhZGVyLXkgKz0gcGcuaAogaGVhZGVyLXkgKz0gcGhhbnRvbS5oCkBAIC0zNjMsNiArMzY0LDcgQEAKIHVuaWZkZWYteSArPSB2aWRlb2RldjIuaAogdW5pZmRlZi15ICs9IHZpZGVvZGV2LmgKIHVuaWZkZWYteSArPSB2aXJ0aW9fY29uZmlnLmgKK3VuaWZkZWYteSArPSB2aXJ0aW9faWRzLmgKIHVuaWZkZWYteSArPSB2aXJ0aW9fYmxrLmgKIHVuaWZkZWYteSArPSB2aXJ0aW9fbmV0LmgKIHVuaWZkZWYteSArPSB2aXJ0aW9fOXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oIGIvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oCmluZGV4IDg4MDEzMGYuLjkxMDFlZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWdwX2JhY2tlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FncF9iYWNrZW5kLmgKQEAgLTUzLDcgKzUzLDcgQEAKIAlpbnQgY3VycmVudF9tZW1vcnk7CiAJYm9vbCBjYW50X3VzZV9hcGVydHVyZTsKIAl1bnNpZ25lZCBsb25nIHBhZ2VfbWFzazsKLQlzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wczsKKwljb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKnZtX29wczsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21tYy5oIGIvaW5jbHVkZS9saW51eC9hbWJhL21tY2kuaApzaW1pbGFyaXR5IGluZGV4IDYzJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21tYy5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L2FtYmEvbW1jaS5oCmluZGV4IGI0OTBlY2MuLjZiNDI0MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbW1jLmgKKysrIGIvaW5jbHVkZS9saW51eC9hbWJhL21tY2kuaApAQCAtMSwxNyArMSwxOCBAQAogLyoKLSAqICBhcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21tYy5oCisgKiAgaW5jbHVkZS9saW51eC9hbWJhL21tY2kuaAogICovCi0jaWZuZGVmIEFTTUFSTV9NQUNIX01NQ19ICi0jZGVmaW5lIEFTTUFSTV9NQUNIX01NQ19ICisjaWZuZGVmIEFNQkFfTU1DSV9ICisjZGVmaW5lIEFNQkFfTU1DSV9ICiAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogCi1zdHJ1Y3QgbW1jX3BsYXRmb3JtX2RhdGEgeworc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSB7CiAJdW5zaWduZWQgaW50IG9jcl9tYXNrOwkJCS8qIGF2YWlsYWJsZSB2b2x0YWdlcyAqLwogCXUzMiAoKnRyYW5zbGF0ZV92ZGQpKHN0cnVjdCBkZXZpY2UgKiwgdW5zaWduZWQgaW50KTsKIAl1bnNpZ25lZCBpbnQgKCpzdGF0dXMpKHN0cnVjdCBkZXZpY2UgKik7CiAJaW50CWdwaW9fd3A7CiAJaW50CWdwaW9fY2Q7CisJdW5zaWduZWQgbG9uZyBjYXBhYmlsaXRpZXM7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDAyMi5oIGIvaW5jbHVkZS9saW51eC9hbWJhL3BsMDIyLmgKaW5kZXggZGNhZDBmZi4uZTQ4MzZjNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDAyMi5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDAyMi5oCkBAIC0xMzYsMTIgKzEzNiwxMiBAQAogCiAvKioKICAqIGVudW0gU1BJIENsb2NrIFBoYXNlIC0gY2xvY2sgcGhhc2UgKE1vdG9yb2xhIFNQSSBpbnRlcmZhY2Ugb25seSkKLSAqIEBTU1BfQ0xLX1JJU0lOR19FREdFOiBSZWNlaXZlIGRhdGEgb24gcmlzaW5nIGVkZ2UKLSAqIEBTU1BfQ0xLX0ZBTExJTkdfRURHRTogUmVjZWl2ZSBkYXRhIG9uIGZhbGxpbmcgZWRnZQorICogQFNTUF9DTEtfRklSU1RfRURHRTogUmVjZWl2ZSBkYXRhIG9uIGZpcnN0IGVkZ2UgdHJhbnNpdGlvbiAoYWN0dWFsIGRpcmVjdGlvbiBkZXBlbmRzIG9uIHBvbGFyaXR5KQorICogQFNTUF9DTEtfU0VDT05EX0VER0U6IFJlY2VpdmUgZGF0YSBvbiBzZWNvbmQgZWRnZSB0cmFuc2l0aW9uIChhY3R1YWwgZGlyZWN0aW9uIGRlcGVuZHMgb24gcG9sYXJpdHkpCiAgKi8KIGVudW0gc3NwX3NwaV9jbGtfcGhhc2UgewotCVNTUF9DTEtfUklTSU5HX0VER0UsCi0JU1NQX0NMS19GQUxMSU5HX0VER0UKKwlTU1BfQ0xLX0ZJUlNUX0VER0UsCisJU1NQX0NMS19TRUNPTkRfRURHRQogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FzeW5jX3R4LmggYi9pbmNsdWRlL2xpbnV4L2FzeW5jX3R4LmgKaW5kZXggNWZjMmVmOC4uYTFjNDg2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hc3luY190eC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXN5bmNfdHguaApAQCAtNTgsMjUgKzU4LDYwIEBACiAgKiBhcnJheS4KICAqIEBBU1lOQ19UWF9BQ0s6IGltbWVkaWF0ZWx5IGFjayB0aGUgZGVzY3JpcHRvciwgcHJlY2x1ZGVzIHNldHRpbmcgdXAgYQogICogZGVwZW5kZW5jeSBjaGFpbgotICogQEFTWU5DX1RYX0RFUF9BQ0s6IGFjayB0aGUgZGVwZW5kZW5jeSBkZXNjcmlwdG9yLiAgVXNlZnVsIGZvciBjaGFpbmluZy4KKyAqIEBBU1lOQ19UWF9GRU5DRTogc3BlY2lmeSB0aGF0IHRoZSBuZXh0IG9wZXJhdGlvbiBpbiB0aGUgZGVwZW5kZW5jeQorICogY2hhaW4gdXNlcyB0aGlzIG9wZXJhdGlvbidzIHJlc3VsdCBhcyBhbiBpbnB1dAogICovCiBlbnVtIGFzeW5jX3R4X2ZsYWdzIHsKIAlBU1lOQ19UWF9YT1JfWkVST19EU1QJID0gKDEgPDwgMCksCiAJQVNZTkNfVFhfWE9SX0RST1BfRFNUCSA9ICgxIDw8IDEpLAotCUFTWU5DX1RYX0FDSwkJID0gKDEgPDwgMyksCi0JQVNZTkNfVFhfREVQX0FDSwkgPSAoMSA8PCA0KSwKKwlBU1lOQ19UWF9BQ0sJCSA9ICgxIDw8IDIpLAorCUFTWU5DX1RYX0ZFTkNFCQkgPSAoMSA8PCAzKSwKK307CisKKy8qKgorICogc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgLSBhc3luY190eCBzdWJtaXNzaW9uL2NvbXBsZXRpb24gbW9kaWZpZXJzCisgKiBAZmxhZ3M6IHN1Ym1pc3Npb24gbW9kaWZpZXJzCisgKiBAZGVwZW5kX3R4OiBwYXJlbnQgZGVwZW5kZW5jeSBvZiB0aGUgY3VycmVudCBvcGVyYXRpb24gYmVpbmcgc3VibWl0dGVkCisgKiBAY2JfZm46IGNhbGxiYWNrIHJvdXRpbmUgdG8gcnVuIGF0IG9wZXJhdGlvbiBjb21wbGV0aW9uCisgKiBAY2JfcGFyYW06IHBhcmFtZXRlciBmb3IgdGhlIGNhbGxiYWNrIHJvdXRpbmUKKyAqIEBzY3JpYmJsZTogY2FsbGVyIHByb3ZpZGVkIHNwYWNlIGZvciBkbWEvcGFnZSBhZGRyZXNzIGNvbnZlcnNpb25zCisgKi8KK3N0cnVjdCBhc3luY19zdWJtaXRfY3RsIHsKKwllbnVtIGFzeW5jX3R4X2ZsYWdzIGZsYWdzOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwZW5kX3R4OworCWRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbjsKKwl2b2lkICpjYl9wYXJhbTsKKwl2b2lkICpzY3JpYmJsZTsKIH07CiAKICNpZmRlZiBDT05GSUdfRE1BX0VOR0lORQogI2RlZmluZSBhc3luY190eF9pc3N1ZV9wZW5kaW5nX2FsbCBkbWFfaXNzdWVfcGVuZGluZ19hbGwKKworLyoqCisgKiBhc3luY190eF9pc3N1ZV9wZW5kaW5nIC0gc2VuZCBwZW5kaW5nIGRlc2NyaXB0b3IgdG8gdGhlIGhhcmR3YXJlIGNoYW5uZWwKKyAqIEB0eDogZGVzY3JpcHRvciBoYW5kbGUgdG8gcmV0cmlldmUgaGFyZHdhcmUgY29udGV4dAorICoKKyAqIE5vdGU6IGFueSBkZXBlbmRlbnQgb3BlcmF0aW9ucyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGlzc3VlZCBieQorICogYXN5bmNfdHhfY2hhbm5lbF9zd2l0Y2gsIG9yIChpbiB0aGUgY2FzZSBvZiBubyBjaGFubmVsIHN3aXRjaCkgd2lsbAorICogYmUgYWxyZWFkeSBwZW5kaW5nIG9uIHRoaXMgY2hhbm5lbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFzeW5jX3R4X2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKK3sKKwlpZiAobGlrZWx5KHR4KSkgeworCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSB0eC0+Y2hhbjsKKwkJc3RydWN0IGRtYV9kZXZpY2UgKmRtYSA9IGNoYW4tPmRldmljZTsKKworCQlkbWEtPmRldmljZV9pc3N1ZV9wZW5kaW5nKGNoYW4pOworCX0KK30KICNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQVNZTkNfVFhfRklORF9DSEFOTkVMCiAjaW5jbHVkZSA8YXNtL2FzeW5jX3R4Lmg+CiAjZWxzZQogI2RlZmluZSBhc3luY190eF9maW5kX2NoYW5uZWwoZGVwLCB0eXBlLCBkc3QsIGRzdF9jb3VudCwgc3JjLCBzcmNfY291bnQsIGxlbikgXAogCSBfX2FzeW5jX3R4X2ZpbmRfY2hhbm5lbChkZXAsIHR5cGUpCiBzdHJ1Y3QgZG1hX2NoYW4gKgotX19hc3luY190eF9maW5kX2NoYW5uZWwoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXBlbmRfdHgsCi0JZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSB0eF90eXBlKTsKK19fYXN5bmNfdHhfZmluZF9jaGFubmVsKHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQsCisJCQllbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIHR4X3R5cGUpOwogI2VuZGlmIC8qIENPTkZJR19BUkNIX0hBU19BU1lOQ19UWF9GSU5EX0NIQU5ORUwgKi8KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgYXN5bmNfdHhfaXNzdWVfcGVuZGluZ19hbGwodm9pZCkKQEAgLTg0LDEwICsxMTksMTYgQEAKIAlkbyB7IH0gd2hpbGUgKDApOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYXN5bmNfdHhfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQoreworCWRvIHsgfSB3aGlsZSAoMCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRtYV9jaGFuICoKLWFzeW5jX3R4X2ZpbmRfY2hhbm5lbChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKLQllbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIHR4X3R5cGUsIHN0cnVjdCBwYWdlICoqZHN0LCBpbnQgZHN0X2NvdW50LAotCXN0cnVjdCBwYWdlICoqc3JjLCBpbnQgc3JjX2NvdW50LCBzaXplX3QgbGVuKQorYXN5bmNfdHhfZmluZF9jaGFubmVsKHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQsCisJCSAgICAgIGVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgdHhfdHlwZSwgc3RydWN0IHBhZ2UgKipkc3QsCisJCSAgICAgIGludCBkc3RfY291bnQsIHN0cnVjdCBwYWdlICoqc3JjLCBpbnQgc3JjX2NvdW50LAorCQkgICAgICBzaXplX3QgbGVuKQogewogCXJldHVybiBOVUxMOwogfQpAQCAtOTksNDYgKzE0MCw3MCBAQAogICogQGNiX2ZuX3BhcmFtOiBwYXJhbWV0ZXIgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgcm91dGluZQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWFzeW5jX3R4X3N5bmNfZXBpbG9nKGRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiwgdm9pZCAqY2JfZm5fcGFyYW0pCithc3luY190eF9zeW5jX2VwaWxvZyhzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KQogewotCWlmIChjYl9mbikKLQkJY2JfZm4oY2JfZm5fcGFyYW0pOworCWlmIChzdWJtaXQtPmNiX2ZuKQorCQlzdWJtaXQtPmNiX2ZuKHN1Ym1pdC0+Y2JfcGFyYW0pOwogfQogCi12b2lkCi1hc3luY190eF9zdWJtaXQoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4LAotCWVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3MsIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwZW5kX3R4LAotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiwgdm9pZCAqY2JfZm5fcGFyYW0pOwordHlwZWRlZiB1bmlvbiB7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXN0cnVjdCBwYWdlICpwYWdlOworCWRtYV9hZGRyX3QgZG1hOworfSBhZGRyX2NvbnZfdDsKKworc3RhdGljIGlubGluZSB2b2lkCitpbml0X2FzeW5jX3N1Ym1pdChzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqYXJncywgZW51bSBhc3luY190eF9mbGFncyBmbGFncywKKwkJICBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4LAorCQkgIGRtYV9hc3luY190eF9jYWxsYmFjayBjYl9mbiwgdm9pZCAqY2JfcGFyYW0sCisJCSAgYWRkcl9jb252X3QgKnNjcmliYmxlKQoreworCWFyZ3MtPmZsYWdzID0gZmxhZ3M7CisJYXJncy0+ZGVwZW5kX3R4ID0gdHg7CisJYXJncy0+Y2JfZm4gPSBjYl9mbjsKKwlhcmdzLT5jYl9wYXJhbSA9IGNiX3BhcmFtOworCWFyZ3MtPnNjcmliYmxlID0gc2NyaWJibGU7Cit9CisKK3ZvaWQgYXN5bmNfdHhfc3VibWl0KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCwKKwkJICAgICBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KTsKIAogc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKIGFzeW5jX3hvcihzdHJ1Y3QgcGFnZSAqZGVzdCwgc3RydWN0IHBhZ2UgKipzcmNfbGlzdCwgdW5zaWduZWQgaW50IG9mZnNldCwKLQlpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgZW51bSBhc3luY190eF9mbGFncyBmbGFncywKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm4sIHZvaWQgKmNiX2ZuX3BhcmFtKTsKKwkgIGludCBzcmNfY250LCBzaXplX3QgbGVuLCBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KTsKIAogc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKLWFzeW5jX3hvcl96ZXJvX3N1bShzdHJ1Y3QgcGFnZSAqZGVzdCwgc3RydWN0IHBhZ2UgKipzcmNfbGlzdCwKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwKLQl1MzIgKnJlc3VsdCwgZW51bSBhc3luY190eF9mbGFncyBmbGFncywKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm4sIHZvaWQgKmNiX2ZuX3BhcmFtKTsKK2FzeW5jX3hvcl92YWwoc3RydWN0IHBhZ2UgKmRlc3QsIHN0cnVjdCBwYWdlICoqc3JjX2xpc3QsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJICAgICAgaW50IHNyY19jbnQsIHNpemVfdCBsZW4sIGVudW0gc3VtX2NoZWNrX2ZsYWdzICpyZXN1bHQsCisJICAgICAgc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCk7CiAKIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCiBhc3luY19tZW1jcHkoc3RydWN0IHBhZ2UgKmRlc3QsIHN0cnVjdCBwYWdlICpzcmMsIHVuc2lnbmVkIGludCBkZXN0X29mZnNldCwKLQl1bnNpZ25lZCBpbnQgc3JjX29mZnNldCwgc2l6ZV90IGxlbiwgZW51bSBhc3luY190eF9mbGFncyBmbGFncywKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm4sIHZvaWQgKmNiX2ZuX3BhcmFtKTsKKwkgICAgIHVuc2lnbmVkIGludCBzcmNfb2Zmc2V0LCBzaXplX3QgbGVuLAorCSAgICAgc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCk7CiAKIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCiBhc3luY19tZW1zZXQoc3RydWN0IHBhZ2UgKmRlc3QsIGludCB2YWwsIHVuc2lnbmVkIGludCBvZmZzZXQsCi0Jc2l6ZV90IGxlbiwgZW51bSBhc3luY190eF9mbGFncyBmbGFncywKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2JfZm4sIHZvaWQgKmNiX2ZuX3BhcmFtKTsKKwkgICAgIHNpemVfdCBsZW4sIHN0cnVjdCBhc3luY19zdWJtaXRfY3RsICpzdWJtaXQpOworCitzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmFzeW5jX3RyaWdnZXJfY2FsbGJhY2soc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCk7CiAKIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCi1hc3luY190cmlnZ2VyX2NhbGxiYWNrKGVudW0gYXN5bmNfdHhfZmxhZ3MgZmxhZ3MsCi0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXBlbmRfdHgsCi0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNiX2ZuLCB2b2lkICpjYl9mbl9wYXJhbSk7Cithc3luY19nZW5fc3luZHJvbWUoc3RydWN0IHBhZ2UgKipibG9ja3MsIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCBzcmNfY250LAorCQkgICBzaXplX3QgbGVuLCBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KTsKKworc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2FzeW5jX3N5bmRyb21lX3ZhbChzdHJ1Y3QgcGFnZSAqKmJsb2NrcywgdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHNyY19jbnQsCisJCSAgIHNpemVfdCBsZW4sIGVudW0gc3VtX2NoZWNrX2ZsYWdzICpwcXJlcywgc3RydWN0IHBhZ2UgKnNwYXJlLAorCQkgICBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KTsKKworc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2FzeW5jX3JhaWQ2XzJkYXRhX3JlY292KGludCBzcmNfbnVtLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwgaW50IGZhaWxiLAorCQkJc3RydWN0IHBhZ2UgKipwdHJzLCBzdHJ1Y3QgYXN5bmNfc3VibWl0X2N0bCAqc3VibWl0KTsKKworc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2FzeW5jX3JhaWQ2X2RhdGFwX3JlY292KGludCBzcmNfbnVtLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwKKwkJCXN0cnVjdCBwYWdlICoqcHRycywgc3RydWN0IGFzeW5jX3N1Ym1pdF9jdGwgKnN1Ym1pdCk7CiAKIHZvaWQgYXN5bmNfdHhfcXVpZXNjZShzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKip0eCk7CiAjZW5kaWYgLyogX0FTWU5DX1RYX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0YS5oIGIvaW5jbHVkZS9saW51eC9hdGEuaAppbmRleCA2Mjk5YTI1Li40ZmIzNTczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRhLmgKQEAgLTMzNCw5ICszMzQsMTIgQEAKIAlTRVRGRUFUVVJFU19TQVRBX0RJU0FCTEUgPSAweDkwLCAvKiBEaXNhYmxlIHVzZSBvZiBTQVRBIGZlYXR1cmUgKi8KIAogCS8qIFNFVEZFQVRVUkUgU2VjdG9yIGNvdW50cyBmb3IgU0FUQSBmZWF0dXJlcyAqLwotCVNBVEFfQU4JCQk9IDB4MDUsICAvKiBBc3luY2hyb25vdXMgTm90aWZpY2F0aW9uICovCi0JU0FUQV9ESVBNCQk9IDB4MDMsICAvKiBEZXZpY2UgSW5pdGlhdGVkIFBvd2VyIE1hbmFnZW1lbnQgKi8KLQlTQVRBX0ZQRE1BX0FBCQk9IDB4MDIsICAvKiBETUEgU2V0dXAgRklTIEF1dG8tQWN0aXZhdGUgKi8KKwlTQVRBX0ZQRE1BX09GRlNFVAk9IDB4MDEsCS8qIEZQRE1BIG5vbi16ZXJvIGJ1ZmZlciBvZmZzZXRzICovCisJU0FUQV9GUERNQV9BQQkJPSAweDAyLCAvKiBGUERNQSBTZXR1cCBGSVMgQXV0by1BY3RpdmF0ZSAqLworCVNBVEFfRElQTQkJPSAweDAzLAkvKiBEZXZpY2UgSW5pdGlhdGVkIFBvd2VyIE1hbmFnZW1lbnQgKi8KKwlTQVRBX0ZQRE1BX0lOX09SREVSCT0gMHgwNCwJLyogRlBETUEgaW4tb3JkZXIgZGF0YSBkZWxpdmVyeSAqLworCVNBVEFfQU4JCQk9IDB4MDUsCS8qIEFzeW5jaHJvbm91cyBOb3RpZmljYXRpb24gKi8KKwlTQVRBX1NTUAkJPSAweDA2LAkvKiBTb2Z0d2FyZSBTZXR0aW5ncyBQcmVzZXJ2YXRpb24gKi8KIAogCS8qIGZlYXR1cmUgdmFsdWVzIGZvciBTRVRfTUFYICovCiAJQVRBX1NFVF9NQVhfQUREUgk9IDB4MDAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWRldi5oIGIvaW5jbHVkZS9saW51eC9hdG1kZXYuaAppbmRleCAwODZlNWMzLi44MTdiMjM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWRldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZGV2LmgKQEAgLTM5Nyw3ICszOTcsNyBAQAogCWludCAoKmdldHNvY2tvcHQpKHN0cnVjdCBhdG1fdmNjICp2Y2MsaW50IGxldmVsLGludCBvcHRuYW1lLAogCSAgICB2b2lkIF9fdXNlciAqb3B0dmFsLGludCBvcHRsZW4pOwogCWludCAoKnNldHNvY2tvcHQpKHN0cnVjdCBhdG1fdmNjICp2Y2MsaW50IGxldmVsLGludCBvcHRuYW1lLAotCSAgICB2b2lkIF9fdXNlciAqb3B0dmFsLGludCBvcHRsZW4pOworCSAgICB2b2lkIF9fdXNlciAqb3B0dmFsLHVuc2lnbmVkIGludCBvcHRsZW4pOwogCWludCAoKnNlbmQpKHN0cnVjdCBhdG1fdmNjICp2Y2Msc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJaW50ICgqc2VuZF9vYW0pKHN0cnVjdCBhdG1fdmNjICp2Y2Msdm9pZCAqY2VsbCxpbnQgZmxhZ3MpOwogCXZvaWQgKCpwaHlfcHV0KShzdHJ1Y3QgYXRtX2RldiAqZGV2LHVuc2lnbmVkIGNoYXIgdmFsdWUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmggYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKaW5kZXggMGVlMzNjMi4uYjQ0OWU3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaApAQCAtMTAxLDcgKzEwMSw4IEBACiAJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIGludCBiZGlfcmVnaXN0ZXJfZGV2KHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGRldl90IGRldik7CiB2b2lkIGJkaV91bnJlZ2lzdGVyKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpOwotdm9pZCBiZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMpOwordm9pZCBiZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJbG9uZyBucl9wYWdlcyk7CiBpbnQgYmRpX3dyaXRlYmFja190YXNrKHN0cnVjdCBiZGlfd3JpdGViYWNrICp3Yik7CiBpbnQgYmRpX2hhc19kaXJ0eV9pbyhzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iYWNrbGlnaHQuaCBiL2luY2x1ZGUvbGludXgvYmFja2xpZ2h0LmgKaW5kZXggNzljYTJkYS4uMGY1ZjU3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iYWNrbGlnaHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JhY2tsaWdodC5oCkBAIC0yNyw2ICsyNywxMSBAQAogICogQW55IG90aGVyIHVzZSBvZiB0aGUgbG9ja3MgYmVsb3cgaXMgcHJvYmFibHkgd3JvbmcuCiAgKi8KIAorZW51bSBiYWNrbGlnaHRfdXBkYXRlX3JlYXNvbiB7CisJQkFDS0xJR0hUX1VQREFURV9IT1RLRVksCisJQkFDS0xJR0hUX1VQREFURV9TWVNGUywKK307CisKIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlOwogc3RydWN0IGZiX2luZm87CiAKQEAgLTEwMCw2ICsxMDUsOCBAQAogZXh0ZXJuIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAJc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkZXZkYXRhLCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyAqb3BzKTsKIGV4dGVybiB2b2lkIGJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpOworZXh0ZXJuIHZvaWQgYmFja2xpZ2h0X2ZvcmNlX3VwZGF0ZShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQsCisJCQkJICAgZW51bSBiYWNrbGlnaHRfdXBkYXRlX3JlYXNvbiByZWFzb24pOwogCiAjZGVmaW5lIHRvX2JhY2tsaWdodF9kZXZpY2Uob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSwgZGV2KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCmluZGV4IDIwNDZiNWIuLmFlY2U0ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCkBAIC0xMjAsNyArMTIwLDcgQEAKIGV4dGVybiBpbnQgcHJlcGFyZV9icHJtX2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwogZXh0ZXJuIHZvaWQgaW5zdGFsbF9leGVjX2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwogZXh0ZXJuIHZvaWQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIGludCBzZXRfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKm5ldyk7CitleHRlcm4gdm9pZCBzZXRfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKm5ldyk7CiBleHRlcm4gdm9pZCBmcmVlX2Jwcm0oc3RydWN0IGxpbnV4X2JpbnBybSAqKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IGUyM2E4NmMuLjIyMWNlY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtODIsNyArODIsNiBAQAogZW51bSB7CiAJUkVRX0xCX09QX0VKRUNUCT0gMHg0MCwJCS8qIGVqZWN0IHJlcXVlc3QgKi8KIAlSRVFfTEJfT1BfRkxVU0ggPSAweDQxLAkJLyogZmx1c2ggcmVxdWVzdCAqLwotCVJFUV9MQl9PUF9ESVNDQVJEID0gMHg0MiwJLyogZGlzY2FyZCBzZWN0b3JzICovCiB9OwogCiAvKgpAQCAtMjYxLDcgKzI2MCw2IEBACiB0eXBlZGVmIGludCAobWFrZV9yZXF1ZXN0X2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CiB0eXBlZGVmIGludCAocHJlcF9ycV9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiB2b2lkICh1bnBsdWdfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKLXR5cGVkZWYgaW50IChwcmVwYXJlX2Rpc2NhcmRfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIAogc3RydWN0IGJpb192ZWM7CiBzdHJ1Y3QgYnZlY19tZXJnZV9kYXRhIHsKQEAgLTMxMyw2ICszMTEsNyBAQAogCXVuc2lnbmVkIGludAkJYWxpZ25tZW50X29mZnNldDsKIAl1bnNpZ25lZCBpbnQJCWlvX21pbjsKIAl1bnNpZ25lZCBpbnQJCWlvX29wdDsKKwl1bnNpZ25lZCBpbnQJCW1heF9kaXNjYXJkX3NlY3RvcnM7CiAKIAl1bnNpZ25lZCBzaG9ydAkJbG9naWNhbF9ibG9ja19zaXplOwogCXVuc2lnbmVkIHNob3J0CQltYXhfaHdfc2VnbWVudHM7CkBAIC0zNDAsNyArMzM5LDYgQEAKIAltYWtlX3JlcXVlc3RfZm4JCSptYWtlX3JlcXVlc3RfZm47CiAJcHJlcF9ycV9mbgkJKnByZXBfcnFfZm47CiAJdW5wbHVnX2ZuCQkqdW5wbHVnX2ZuOwotCXByZXBhcmVfZGlzY2FyZF9mbgkqcHJlcGFyZV9kaXNjYXJkX2ZuOwogCW1lcmdlX2J2ZWNfZm4JCSptZXJnZV9idmVjX2ZuOwogCXByZXBhcmVfZmx1c2hfZm4JKnByZXBhcmVfZmx1c2hfZm47CiAJc29mdGlycV9kb25lX2ZuCQkqc29mdGlycV9kb25lX2ZuOwpAQCAtNDYwLDYgKzQ1OCw3IEBACiAjZGVmaW5lIFFVRVVFX0ZMQUdfVklSVCAgICAgICAgUVVFVUVfRkxBR19OT05ST1QgLyogcGFyYXZpcnQgZGV2aWNlICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfSU9fU1RBVCAgICAgMTUJLyogZG8gSU8gc3RhdHMgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19DUQkgICAgICAgMTYJLyogaGFyZHdhcmUgZG9lcyBxdWV1aW5nICovCisjZGVmaW5lIFFVRVVFX0ZMQUdfRElTQ0FSRCAgICAgMTcJLyogc3VwcG9ydHMgRElTQ0FSRCAqLwogCiAjZGVmaW5lIFFVRVVFX0ZMQUdfREVGQVVMVAkoKDEgPDwgUVVFVUVfRkxBR19JT19TVEFUKSB8CQlcCiAJCQkJICgxIDw8IFFVRVVFX0ZMQUdfQ0xVU1RFUikgfAkJXApAQCAtNTkxLDYgKzU5MCw3IEBACiAjZGVmaW5lIGJsa19xdWV1ZV9mbHVzaGluZyhxKQkoKHEpLT5vcmRzZXEpCiAjZGVmaW5lIGJsa19xdWV1ZV9zdGFja2FibGUocSkJXAogCXRlc3RfYml0KFFVRVVFX0ZMQUdfU1RBQ0tBQkxFLCAmKHEpLT5xdWV1ZV9mbGFncykKKyNkZWZpbmUgYmxrX3F1ZXVlX2Rpc2NhcmQocSkJdGVzdF9iaXQoUVVFVUVfRkxBR19ESVNDQVJELCAmKHEpLT5xdWV1ZV9mbGFncykKIAogI2RlZmluZSBibGtfZnNfcmVxdWVzdChycSkJKChycSktPmNtZF90eXBlID09IFJFUV9UWVBFX0ZTKQogI2RlZmluZSBibGtfcGNfcmVxdWVzdChycSkJKChycSktPmNtZF90eXBlID09IFJFUV9UWVBFX0JMT0NLX1BDKQpAQCAtOTI5LDYgKzkyOSw4IEBACiBleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCBzaG9ydCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21heF9kaXNjYXJkX3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCXVuc2lnbmVkIGludCBtYXhfZGlzY2FyZF9zZWN0b3JzKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3BoeXNpY2FsX2Jsb2NrX3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2FsaWdubWVudF9vZmZzZXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCkBAIC05NTUsNyArOTU3LDYgQEAKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfdXBkYXRlX2RtYV9hbGlnbm1lbnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9zb2Z0aXJxX2RvbmUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc29mdGlycV9kb25lX2ZuICopOwotZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3NldF9kaXNjYXJkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHByZXBhcmVfZGlzY2FyZF9mbiAqKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9ycV90aW1lZF9vdXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgcnFfdGltZWRfb3V0X2ZuICopOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwpAQCAtMTA4MCwyNSArMTA4MSwzNyBAQAogCXJldHVybiBxLT5saW1pdHMucGh5c2ljYWxfYmxvY2tfc2l6ZTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYmRldl9waHlzaWNhbF9ibG9ja19zaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJcmV0dXJuIHF1ZXVlX3BoeXNpY2FsX2Jsb2NrX3NpemUoYmRldl9nZXRfcXVldWUoYmRldikpOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBxdWV1ZV9pb19taW4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJcmV0dXJuIHEtPmxpbWl0cy5pb19taW47CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGJkZXZfaW9fbWluKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJcmV0dXJuIHF1ZXVlX2lvX21pbihiZGV2X2dldF9xdWV1ZShiZGV2KSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHF1ZXVlX2lvX29wdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlyZXR1cm4gcS0+bGltaXRzLmlvX29wdDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYmRldl9pb19vcHQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlyZXR1cm4gcXVldWVfaW9fb3B0KGJkZXZfZ2V0X3F1ZXVlKGJkZXYpKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcXVldWVfYWxpZ25tZW50X29mZnNldChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKLQlpZiAocSAmJiBxLT5saW1pdHMubWlzYWxpZ25lZCkKKwlpZiAocS0+bGltaXRzLm1pc2FsaWduZWQpCiAJCXJldHVybiAtMTsKIAotCWlmIChxICYmIHEtPmxpbWl0cy5hbGlnbm1lbnRfb2Zmc2V0KQotCQlyZXR1cm4gcS0+bGltaXRzLmFsaWdubWVudF9vZmZzZXQ7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcS0+bGltaXRzLmFsaWdubWVudF9vZmZzZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX3NlY3Rvcl9hbGlnbm1lbnRfb2Zmc2V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLApAQCAtMTEwOCw2ICsxMTIxLDE5IEBACiAJCSYgKHEtPmxpbWl0cy5pb19taW4gLSAxKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYmRldl9hbGlnbm1lbnRfb2Zmc2V0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKKworCWlmIChxLT5saW1pdHMubWlzYWxpZ25lZCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpCisJCXJldHVybiBiZGV2LT5iZF9wYXJ0LT5hbGlnbm1lbnRfb2Zmc2V0OworCisJcmV0dXJuIHEtPmxpbWl0cy5hbGlnbm1lbnRfb2Zmc2V0OworfQorCiBzdGF0aWMgaW5saW5lIGludCBxdWV1ZV9kbWFfYWxpZ25tZW50KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXJldHVybiBxID8gcS0+ZG1hX2FsaWdubWVudCA6IDUxMTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmggYi9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCmluZGV4IDdlNDM1MGUuLjNiNzNiOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaApAQCAtMTk4LDYgKzE5OCw3IEBACiAJCQkgICBjaGFyIF9fdXNlciAqYXJnKTsKIGV4dGVybiBpbnQgYmxrX3RyYWNlX3N0YXJ0c3RvcChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHN0YXJ0KTsKIGV4dGVybiBpbnQgYmxrX3RyYWNlX3JlbW92ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CitleHRlcm4gdm9pZCBibGtfdHJhY2VfcmVtb3ZlX3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGJsa190cmFjZV9pbml0X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIGV4dGVybiBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGJsa190cmFjZV9hdHRyX2dyb3VwOwpAQCAtMjExLDYgKzIxMiw3IEBACiAjIGRlZmluZSBibGtfdHJhY2Vfc3RhcnRzdG9wKHEsIHN0YXJ0KQkJCSgtRU5PVFRZKQogIyBkZWZpbmUgYmxrX3RyYWNlX3JlbW92ZShxKQkJCQkoLUVOT1RUWSkKICMgZGVmaW5lIGJsa19hZGRfdHJhY2VfbXNnKHEsIGZtdCwgLi4uKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIGJsa190cmFjZV9yZW1vdmVfc3lzZnMoZGV2KQkJCWRvIHsgfSB3aGlsZSAoMCkKIHN0YXRpYyBpbmxpbmUgaW50IGJsa190cmFjZV9pbml0X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmggYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCmluZGV4IDkwYmJhOWUuLjAwMDhkZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaApAQCAtMzcsNyArMzcsNyBAQAogZXh0ZXJuIGludCBjZ3JvdXBzdGF0c19idWlsZChzdHJ1Y3QgY2dyb3Vwc3RhdHMgKnN0YXRzLAogCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiAKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY2dyb3VwX29wZXJhdGlvbnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2Nncm91cF9vcGVyYXRpb25zOwogCiAvKiBEZWZpbmUgdGhlIGVudW1lcmF0aW9uIG9mIGFsbCBjZ3JvdXAgc3Vic3lzdGVtcyAqLwogI2RlZmluZSBTVUJTWVMoX3gpIF94ICMjIF9zdWJzeXNfaWQsCkBAIC0xNDEsNiArMTQxLDM4IEBACiAJQ0dSUF9XQUlUX09OX1JNRElSLAogfTsKIAorLyogd2hpY2ggcGlkbGlzdCBmaWxlIGFyZSB3ZSB0YWxraW5nIGFib3V0PyAqLworZW51bSBjZ3JvdXBfZmlsZXR5cGUgeworCUNHUk9VUF9GSUxFX1BST0NTLAorCUNHUk9VUF9GSUxFX1RBU0tTLAorfTsKKworLyoKKyAqIEEgcGlkbGlzdCBpcyBhIGxpc3Qgb2YgcGlkcyB0aGF0IHZpcnR1YWxseSByZXByZXNlbnRzIHRoZSBjb250ZW50cyBvZiBvbmUKKyAqIG9mIHRoZSBjZ3JvdXAgZmlsZXMgKCJwcm9jcyIgb3IgInRhc2tzIikuIFdlIGtlZXAgYSBsaXN0IG9mIHN1Y2ggcGlkbGlzdHMsCisgKiBhIHBhaXIgKG9uZSBlYWNoIGZvciBwcm9jcywgdGFza3MpIGZvciBlYWNoIHBpZCBuYW1lc3BhY2UgdGhhdCdzIHJlbGV2YW50CisgKiB0byB0aGUgY2dyb3VwLgorICovCitzdHJ1Y3QgY2dyb3VwX3BpZGxpc3QgeworCS8qCisJICogdXNlZCB0byBmaW5kIHdoaWNoIHBpZGxpc3QgaXMgd2FudGVkLiBkb2Vzbid0IGNoYW5nZSBhcyBsb25nIGFzCisJICogdGhpcyBwYXJ0aWN1bGFyIGxpc3Qgc3RheXMgaW4gdGhlIGxpc3QuCisJICovCisJc3RydWN0IHsgZW51bSBjZ3JvdXBfZmlsZXR5cGUgdHlwZTsgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zOyB9IGtleTsKKwkvKiBhcnJheSBvZiB4aWRzICovCisJcGlkX3QgKmxpc3Q7CisJLyogaG93IG1hbnkgZWxlbWVudHMgdGhlIGFib3ZlIGxpc3QgaGFzICovCisJaW50IGxlbmd0aDsKKwkvKiBob3cgbWFueSBmaWxlcyBhcmUgdXNpbmcgdGhlIGN1cnJlbnQgYXJyYXkgKi8KKwlpbnQgdXNlX2NvdW50OworCS8qIGVhY2ggb2YgdGhlc2Ugc3RvcmVkIGluIGEgbGlzdCBieSBpdHMgY2dyb3VwICovCisJc3RydWN0IGxpc3RfaGVhZCBsaW5rczsKKwkvKiBwb2ludGVyIHRvIHRoZSBjZ3JvdXAgd2UgYmVsb25nIHRvLCBmb3IgbGlzdCByZW1vdmFsIHB1cnBvc2VzICovCisJc3RydWN0IGNncm91cCAqb3duZXI7CisJLyogcHJvdGVjdHMgdGhlIG90aGVyIGZpZWxkcyAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgbXV0ZXg7Cit9OworCiBzdHJ1Y3QgY2dyb3VwIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogInVuc2lnbmVkIGxvbmciIHNvIGJpdG9wcyB3b3JrICovCiAKQEAgLTE3OSwxMSArMjExLDEyIEBACiAJICovCiAJc3RydWN0IGxpc3RfaGVhZCByZWxlYXNlX2xpc3Q7CiAKLQkvKiBwaWRzX211dGV4IHByb3RlY3RzIHBpZHNfbGlzdCBhbmQgY2FjaGVkIHBpZCBhcnJheXMuICovCi0Jc3RydWN0IHJ3X3NlbWFwaG9yZSBwaWRzX211dGV4OwotCi0JLyogTGlua2VkIGxpc3Qgb2Ygc3RydWN0IGNncm91cF9waWRzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBwaWRzX2xpc3Q7CisJLyoKKwkgKiBsaXN0IG9mIHBpZGxpc3RzLCB1cCB0byB0d28gZm9yIGVhY2ggbmFtZXNwYWNlIChvbmUgZm9yIHByb2NzLCBvbmUKKwkgKiBmb3IgdGFza3MpOyBjcmVhdGVkIG9uIGRlbWFuZC4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHBpZGxpc3RzOworCXN0cnVjdCBtdXRleCBwaWRsaXN0X211dGV4OwogCiAJLyogRm9yIFJDVS1wcm90ZWN0ZWQgZGVsZXRpb24gKi8KIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CkBAIC0yMjcsNiArMjYwLDkgQEAKIAkgKiBkdXJpbmcgc3Vic3lzdGVtIHJlZ2lzdHJhdGlvbiAoYXQgYm9vdCB0aW1lKS4KIAkgKi8KIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqc3Vic3lzW0NHUk9VUF9TVUJTWVNfQ09VTlRdOworCisJLyogRm9yIFJDVS1wcm90ZWN0ZWQgZGVsZXRpb24gKi8KKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CiB9OwogCiAvKgpAQCAtMzg5LDEwICs0MjUsMTEgQEAKIAkJCQkJCSAgc3RydWN0IGNncm91cCAqY2dycCk7CiAJaW50ICgqcHJlX2Rlc3Ryb3kpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCk7CiAJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCk7Ci0JaW50ICgqY2FuX2F0dGFjaCkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAotCQkJICBzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisJaW50ICgqY2FuX2F0dGFjaCkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwLAorCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgYm9vbCB0aHJlYWRncm91cCk7CiAJdm9pZCAoKmF0dGFjaCkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwLAotCQkJc3RydWN0IGNncm91cCAqb2xkX2NncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKwkJCXN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCWJvb2wgdGhyZWFkZ3JvdXApOwogCXZvaWQgKCpmb3JrKShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAJdm9pZCAoKmV4aXQpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIAlpbnQgKCpwb3B1bGF0ZSkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25maWdmcy5oIGIvaW5jbHVkZS9saW51eC9jb25maWdmcy5oCmluZGV4IDdmNjI3NzcuLmRkYjdhOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29uZmlnZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmgKQEAgLTI3LDggKzI3LDggQEAKICAqCiAgKiBjb25maWdmcyBDb3B5cmlnaHQgKEMpIDIwMDUgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCi0gKiBQbGVhc2UgcmVhZCBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzLnR4dCBiZWZvcmUgdXNpbmcgdGhlCi0gKiBjb25maWdmcyBpbnRlcmZhY2UsIEVTUEVDSUFMTFkgdGhlIHBhcnRzIGFib3V0IHJlZmVyZW5jZSBjb3VudHMgYW5kCisgKiBQbGVhc2UgcmVhZCBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dCBiZWZvcmUgdXNpbmcKKyAqIHRoZSBjb25maWdmcyBpbnRlcmZhY2UsIEVTUEVDSUFMTFkgdGhlIHBhcnRzIGFib3V0IHJlZmVyZW5jZSBjb3VudHMgYW5kCiAgKiBpdGVtIGRlc3RydWN0b3JzLgogICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmggYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCmluZGV4IDQ3ZWJmNDEuLjNhMTQ2MTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaApAQCAtMTMyLDExICsxMzIsOCBAQAogfTsKIAogc3RydWN0IGNuX2NhbGxiYWNrX2RhdGEgewotCXZvaWQgKCpkZXN0cnVjdF9kYXRhKSAodm9pZCAqKTsKLQl2b2lkICpkZGF0YTsKLQkKLQl2b2lkICpjYWxsYmFja19wcml2OwotCXZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBjbl9tc2cgKik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgY25fbXNnICosIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqKTsKIAogCXZvaWQgKmZyZWU7CiB9OwpAQCAtMTY3LDExICsxNjQsMTEgQEAKIAlzdHJ1Y3QgY25fcXVldWVfZGV2ICpjYmRldjsKIH07CiAKLWludCBjbl9hZGRfY2FsbGJhY2soc3RydWN0IGNiX2lkICosIGNoYXIgKiwgdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IGNuX21zZyAqKSk7CitpbnQgY25fYWRkX2NhbGxiYWNrKHN0cnVjdCBjYl9pZCAqLCBjaGFyICosIHZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBjbl9tc2cgKiwgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICopKTsKIHZvaWQgY25fZGVsX2NhbGxiYWNrKHN0cnVjdCBjYl9pZCAqKTsKIGludCBjbl9uZXRsaW5rX3NlbmQoc3RydWN0IGNuX21zZyAqLCB1MzIsIGdmcF90KTsKIAotaW50IGNuX3F1ZXVlX2FkZF9jYWxsYmFjayhzdHJ1Y3QgY25fcXVldWVfZGV2ICpkZXYsIGNoYXIgKm5hbWUsIHN0cnVjdCBjYl9pZCAqaWQsIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGNuX21zZyAqKSk7CitpbnQgY25fcXVldWVfYWRkX2NhbGxiYWNrKHN0cnVjdCBjbl9xdWV1ZV9kZXYgKmRldiwgY2hhciAqbmFtZSwgc3RydWN0IGNiX2lkICppZCwgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgY25fbXNnICosIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqKSk7CiB2b2lkIGNuX3F1ZXVlX2RlbF9jYWxsYmFjayhzdHJ1Y3QgY25fcXVldWVfZGV2ICpkZXYsIHN0cnVjdCBjYl9pZCAqaWQpOwogCiBpbnQgcXVldWVfY25fd29yayhzdHJ1Y3QgY25fY2FsbGJhY2tfZW50cnkgKmNicSwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKaW5kZXggNDQ3MTdlYi4uNzlhMjM0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKQEAgLTI5MSw4ICsyOTEsMTUgQEAKIGludCBjcHVmcmVxX2dldF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIGludCBjcHUpOwogaW50IGNwdWZyZXFfdXBkYXRlX3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1KTsKIAorI2lmZGVmIENPTkZJR19DUFVfRlJFUQogLyogcXVlcnkgdGhlIGN1cnJlbnQgQ1BVIGZyZXF1ZW5jeSAoaW4ga0h6KS4gSWYgemVybywgY3B1ZnJlcSBjb3VsZG4ndCBkZXRlY3QgaXQgKi8KIHVuc2lnbmVkIGludCBjcHVmcmVxX2dldCh1bnNpZ25lZCBpbnQgY3B1KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVmcmVxX2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiAwOworfQorI2VuZGlmCiAKIC8qIHF1ZXJ5IHRoZSBsYXN0IGtub3duIENQVSBmcmVxIChpbiBrSHopLiBJZiB6ZXJvLCBjcHVmcmVxIGNvdWxkbid0IGRldGVjdCBpdCAqLwogI2lmZGVmIENPTkZJR19DUFVfRlJFUQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVtYXNrLmggYi9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaAppbmRleCA5YjFkNDU4Li43ODljZjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaApAQCAtMyw0NDQgKzMsMzcgQEAKIAogLyoKICAqIENwdW1hc2tzIHByb3ZpZGUgYSBiaXRtYXAgc3VpdGFibGUgZm9yIHJlcHJlc2VudGluZyB0aGUKLSAqIHNldCBvZiBDUFUncyBpbiBhIHN5c3RlbSwgb25lIGJpdCBwb3NpdGlvbiBwZXIgQ1BVIG51bWJlci4KLSAqCi0gKiBUaGUgbmV3IGNwdW1hc2tfIG9wcyB0YWtlIGEgInN0cnVjdCBjcHVtYXNrICoiOyB0aGUgb2xkIG9uZXMKLSAqIHVzZSBjcHVtYXNrX3QuCi0gKgotICogU2VlIGRldGFpbGVkIGNvbW1lbnRzIGluIHRoZSBmaWxlIGxpbnV4L2JpdG1hcC5oIGRlc2NyaWJpbmcgdGhlCi0gKiBkYXRhIHR5cGUgb24gd2hpY2ggdGhlc2UgY3B1bWFza3MgYXJlIGJhc2VkLgotICoKLSAqIEZvciBkZXRhaWxzIG9mIGNwdW1hc2tfc2NucHJpbnRmKCkgYW5kIGNwdW1hc2tfcGFyc2VfdXNlcigpLAotICogc2VlIGJpdG1hcF9zY25wcmludGYoKSBhbmQgYml0bWFwX3BhcnNlX3VzZXIoKSBpbiBsaWIvYml0bWFwLmMuCi0gKiBGb3IgZGV0YWlscyBvZiBjcHVsaXN0X3NjbnByaW50ZigpIGFuZCBjcHVsaXN0X3BhcnNlKCksIHNlZQotICogYml0bWFwX3Njbmxpc3RwcmludGYoKSBhbmQgYml0bWFwX3BhcnNlbGlzdCgpLCBhbHNvIGluIGJpdG1hcC5jLgotICogRm9yIGRldGFpbHMgb2YgY3B1X3JlbWFwKCksIHNlZSBiaXRtYXBfYml0cmVtYXAgaW4gbGliL2JpdG1hcC5jCi0gKiBGb3IgZGV0YWlscyBvZiBjcHVzX3JlbWFwKCksIHNlZSBiaXRtYXBfcmVtYXAgaW4gbGliL2JpdG1hcC5jLgotICogRm9yIGRldGFpbHMgb2YgY3B1c19vbnRvKCksIHNlZSBiaXRtYXBfb250byBpbiBsaWIvYml0bWFwLmMuCi0gKiBGb3IgZGV0YWlscyBvZiBjcHVzX2ZvbGQoKSwgc2VlIGJpdG1hcF9mb2xkIGluIGxpYi9iaXRtYXAuYy4KLSAqCi0gKiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCi0gKiBOb3RlOiBUaGUgYWx0ZXJuYXRlIG9wZXJhdGlvbnMgd2l0aCB0aGUgc3VmZml4ICJfbnIiIGFyZSB1c2VkCi0gKiAgICAgICB0byBsaW1pdCB0aGUgcmFuZ2Ugb2YgdGhlIGxvb3AgdG8gbnJfY3B1X2lkcyBpbnN0ZWFkIG9mCi0gKiAgICAgICBOUl9DUFVTIHdoZW4gTlJfQ1BVUyA+IDY0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgotICogICAgICAgSWYgTlJfQ1BVUyBpcyA8PSA2NCB0aGVuIG1vc3QgYXNzZW1ibGVyIGJpdG1hc2sKLSAqICAgICAgIG9wZXJhdG9ycyBleGVjdXRlIGZhc3RlciB3aXRoIGEgY29uc3RhbnQgcmFuZ2UsIHNvCi0gKiAgICAgICB0aGUgb3BlcmF0b3Igd2lsbCBjb250aW51ZSB0byB1c2UgTlJfQ1BVUy4KLSAqCi0gKiAgICAgICBBbm90aGVyIGNvbnNpZGVyYXRpb24gaXMgdGhhdCBucl9jcHVfaWRzIGlzIGluaXRpYWxpemVkCi0gKiAgICAgICB0byBOUl9DUFVTIGFuZCBpc24ndCBsb3dlcmVkIHVudGlsIHRoZSBwb3NzaWJsZSBjcHVzIGFyZQotICogICAgICAgZGlzY292ZXJlZCAoaW5jbHVkaW5nIGFueSBkaXNhYmxlZCBjcHVzKS4gIFNvIGVhcmx5IHVzZXMKLSAqICAgICAgIHdpbGwgc3BhbiB0aGUgZW50aXJlIHJhbmdlIG9mIE5SX0NQVVMuCi0gKiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCi0gKgotICogVGhlIG9ic29sZXNjZW50IGNwdW1hc2sgb3BlcmF0aW9ucyBhcmU6Ci0gKgotICogdm9pZCBjcHVfc2V0KGNwdSwgbWFzaykJCXR1cm4gb24gYml0ICdjcHUnIGluIG1hc2sKLSAqIHZvaWQgY3B1X2NsZWFyKGNwdSwgbWFzaykJCXR1cm4gb2ZmIGJpdCAnY3B1JyBpbiBtYXNrCi0gKiB2b2lkIGNwdXNfc2V0YWxsKG1hc2spCQlzZXQgYWxsIGJpdHMKLSAqIHZvaWQgY3B1c19jbGVhcihtYXNrKQkJY2xlYXIgYWxsIGJpdHMKLSAqIGludCBjcHVfaXNzZXQoY3B1LCBtYXNrKQkJdHJ1ZSBpZmYgYml0ICdjcHUnIHNldCBpbiBtYXNrCi0gKiBpbnQgY3B1X3Rlc3RfYW5kX3NldChjcHUsIG1hc2spCXRlc3QgYW5kIHNldCBiaXQgJ2NwdScgaW4gbWFzawotICoKLSAqIGludCBjcHVzX2FuZChkc3QsIHNyYzEsIHNyYzIpCWRzdCA9IHNyYzEgJiBzcmMyICBbaW50ZXJzZWN0aW9uXQotICogdm9pZCBjcHVzX29yKGRzdCwgc3JjMSwgc3JjMikJZHN0ID0gc3JjMSB8IHNyYzIgIFt1bmlvbl0KLSAqIHZvaWQgY3B1c194b3IoZHN0LCBzcmMxLCBzcmMyKQlkc3QgPSBzcmMxIF4gc3JjMgotICogaW50IGNwdXNfYW5kbm90KGRzdCwgc3JjMSwgc3JjMikJZHN0ID0gc3JjMSAmIH5zcmMyCi0gKiB2b2lkIGNwdXNfY29tcGxlbWVudChkc3QsIHNyYykJZHN0ID0gfnNyYwotICoKLSAqIGludCBjcHVzX2VxdWFsKG1hc2sxLCBtYXNrMikJCURvZXMgbWFzazEgPT0gbWFzazI/Ci0gKiBpbnQgY3B1c19pbnRlcnNlY3RzKG1hc2sxLCBtYXNrMikJRG8gbWFzazEgYW5kIG1hc2syIGludGVyc2VjdD8KLSAqIGludCBjcHVzX3N1YnNldChtYXNrMSwgbWFzazIpCUlzIG1hc2sxIGEgc3Vic2V0IG9mIG1hc2syPwotICogaW50IGNwdXNfZW1wdHkobWFzaykJCQlJcyBtYXNrIGVtcHR5IChubyBiaXRzIHNldHMpPwotICogaW50IGNwdXNfZnVsbChtYXNrKQkJCUlzIG1hc2sgZnVsbCAoYWxsIGJpdHMgc2V0cyk/Ci0gKiBpbnQgY3B1c193ZWlnaHQobWFzaykJCUhhbW1pbmcgd2VpZ2ggLSBudW1iZXIgb2Ygc2V0IGJpdHMKLSAqIGludCBjcHVzX3dlaWdodF9ucihtYXNrKQkJU2FtZSB1c2luZyBucl9jcHVfaWRzIGluc3RlYWQgb2YgTlJfQ1BVUwotICoKLSAqIHZvaWQgY3B1c19zaGlmdF9yaWdodChkc3QsIHNyYywgbikJU2hpZnQgcmlnaHQKLSAqIHZvaWQgY3B1c19zaGlmdF9sZWZ0KGRzdCwgc3JjLCBuKQlTaGlmdCBsZWZ0Ci0gKgotICogaW50IGZpcnN0X2NwdShtYXNrKQkJCU51bWJlciBsb3dlc3Qgc2V0IGJpdCwgb3IgTlJfQ1BVUwotICogaW50IG5leHRfY3B1KGNwdSwgbWFzaykJCU5leHQgY3B1IHBhc3QgJ2NwdScsIG9yIE5SX0NQVVMKLSAqIGludCBuZXh0X2NwdV9ucihjcHUsIG1hc2spCQlOZXh0IGNwdSBwYXN0ICdjcHUnLCBvciBucl9jcHVfaWRzCi0gKgotICogY3B1bWFza190IGNwdW1hc2tfb2ZfY3B1KGNwdSkJUmV0dXJuIGNwdW1hc2sgd2l0aCBiaXQgJ2NwdScgc2V0Ci0gKgkJCQkJKGNhbiBiZSB1c2VkIGFzIGFuIGx2YWx1ZSkKLSAqIENQVV9NQVNLX0FMTAkJCQlJbml0aWFsaXplciAtIGFsbCBiaXRzIHNldAotICogQ1BVX01BU0tfTk9ORQkJCUluaXRpYWxpemVyIC0gbm8gYml0cyBzZXQKLSAqIHVuc2lnbmVkIGxvbmcgKmNwdXNfYWRkcihtYXNrKQlBcnJheSBvZiB1bnNpZ25lZCBsb25nJ3MgaW4gbWFzawotICoKLSAqIENQVU1BU0tfQUxMT0Mga21hbGxvYydzIGEgc3RydWN0dXJlIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgbWFueSBjcHVtYXNrX3QKLSAqIHZhcmlhYmxlcywgYW5kIENQVU1BU0tfUFRSIHByb3ZpZGVzIHBvaW50ZXJzIHRvIGVhY2ggZmllbGQuCi0gKgotICogVGhlIHN0cnVjdHVyZSBzaG91bGQgYmUgZGVmaW5lZCBzb21ldGhpbmcgbGlrZSB0aGlzOgotICogc3RydWN0IG15X2NwdW1hc2tzIHsKLSAqCWNwdW1hc2tfdCBtYXNrMTsKLSAqCWNwdW1hc2tfdCBtYXNrMjsKLSAqIH07Ci0gKgotICogVXNhZ2UgaXMgdGhlbjoKLSAqCUNQVU1BU0tfQUxMT0MobXlfY3B1bWFza3MpOwotICoJQ1BVTUFTS19QVFIobWFzazEsIG15X2NwdW1hc2tzKTsKLSAqCUNQVU1BU0tfUFRSKG1hc2syLCBteV9jcHVtYXNrcyk7Ci0gKgotICoJLS0tIERPIE5PVCByZWZlcmVuY2UgY3B1bWFza190IHBvaW50ZXJzIHVudGlsIHRoaXMgY2hlY2sgLS0tCi0gKglpZiAobXlfY3B1bWFza3MgPT0gTlVMTCkKLSAqCQkia21hbGxvYyBmYWlsZWQiLi4uCi0gKgotICogUmVmZXJlbmNlcyBhcmUgbm93IHBvaW50ZXJzIHRvIHRoZSBjcHVtYXNrX3QgdmFyaWFibGVzICgqbWFzazEsIC4uLikKLSAqCi0gKmlmIE5SX0NQVVMgPiBCSVRTX1BFUl9MT05HCi0gKiAgIENQVU1BU0tfQUxMT0MobSkJCQlEZWNsYXJlcyBhbmQgYWxsb2NhdGVzIHN0cnVjdCBtICptID0KLSAqCQkJCQkJa21hbGxvYyhzaXplb2YoKm0pLCBHRlBfS0VSTkVMKQotICogICBDUFVNQVNLX0ZSRUUobSkJCQlNYWNybyBmb3Iga2ZyZWUobSkKLSAqZWxzZQotICogICBDUFVNQVNLX0FMTE9DKG0pCQkJRGVjbGFyZXMgc3RydWN0IG0gX20sICptID0gJl9tCi0gKiAgIENQVU1BU0tfRlJFRShtKQkJCU5vcAotICplbmRpZgotICogICBDUFVNQVNLX1BUUih2LCBtKQkJCURlY2xhcmVzIGNwdW1hc2tfdCAqdiA9ICYobS0+dikKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIGludCBjcHVtYXNrX3NjbnByaW50ZihidWYsIGxlbiwgbWFzaykgRm9ybWF0IGNwdW1hc2sgZm9yIHByaW50aW5nCi0gKiBpbnQgY3B1bWFza19wYXJzZV91c2VyKHVidWYsIHVsZW4sIG1hc2spCVBhcnNlIGFzY2lpIHN0cmluZyBhcyBjcHVtYXNrCi0gKiBpbnQgY3B1bGlzdF9zY25wcmludGYoYnVmLCBsZW4sIG1hc2spIEZvcm1hdCBjcHVtYXNrIGFzIGxpc3QgZm9yIHByaW50aW5nCi0gKiBpbnQgY3B1bGlzdF9wYXJzZShidWYsIG1hcCkJCVBhcnNlIGFzY2lpIHN0cmluZyBhcyBjcHVsaXN0Ci0gKiBpbnQgY3B1X3JlbWFwKG9sZGJpdCwgb2xkLCBuZXcpCW5ld2JpdCA9IG1hcChvbGQsIG5ldykob2xkYml0KQotICogdm9pZCBjcHVzX3JlbWFwKGRzdCwgc3JjLCBvbGQsIG5ldykJKmRzdCA9IG1hcChvbGQsIG5ldykoc3JjKQotICogdm9pZCBjcHVzX29udG8oZHN0LCBvcmlnLCByZWxtYXApCSpkc3QgPSBvcmlnIHJlbGF0aXZlIHRvIHJlbG1hcAotICogdm9pZCBjcHVzX2ZvbGQoZHN0LCBvcmlnLCBzeikJZHN0IGJpdHMgPSBvcmlnIGJpdHMgbW9kIHN6Ci0gKgotICogZm9yX2VhY2hfY3B1X21hc2soY3B1LCBtYXNrKQkJZm9yLWxvb3AgY3B1IG92ZXIgbWFzayB1c2luZyBOUl9DUFVTCi0gKiBmb3JfZWFjaF9jcHVfbWFza19ucihjcHUsIG1hc2spCWZvci1sb29wIGNwdSBvdmVyIG1hc2sgdXNpbmcgbnJfY3B1X2lkcwotICoKLSAqIGludCBudW1fb25saW5lX2NwdXMoKQkJTnVtYmVyIG9mIG9ubGluZSBDUFVzCi0gKiBpbnQgbnVtX3Bvc3NpYmxlX2NwdXMoKQkJTnVtYmVyIG9mIGFsbCBwb3NzaWJsZSBDUFVzCi0gKiBpbnQgbnVtX3ByZXNlbnRfY3B1cygpCQlOdW1iZXIgb2YgcHJlc2VudCBDUFVzCi0gKgotICogaW50IGNwdV9vbmxpbmUoY3B1KQkJCUlzIHNvbWUgY3B1IG9ubGluZT8KLSAqIGludCBjcHVfcG9zc2libGUoY3B1KQkJSXMgc29tZSBjcHUgcG9zc2libGU/Ci0gKiBpbnQgY3B1X3ByZXNlbnQoY3B1KQkJCUlzIHNvbWUgY3B1IHByZXNlbnQgKGNhbiBzY2hlZHVsZSk/Ci0gKgotICogaW50IGFueV9vbmxpbmVfY3B1KG1hc2spCQlGaXJzdCBvbmxpbmUgY3B1IGluIG1hc2sKLSAqCi0gKiBmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQkJZm9yLWxvb3AgY3B1IG92ZXIgY3B1X3Bvc3NpYmxlX21hcAotICogZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCQlmb3ItbG9vcCBjcHUgb3ZlciBjcHVfb25saW5lX21hcAotICogZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KQkJZm9yLWxvb3AgY3B1IG92ZXIgY3B1X3ByZXNlbnRfbWFwCi0gKgotICogU3VidGxldHk6Ci0gKiAxKSBUaGUgJ3R5cGUtY2hlY2tlZCcgZm9ybSBvZiBjcHVfaXNzZXQoKSBjYXVzZXMgZ2NjICgzLjMuMiwgYW55d2F5KQotICogICAgdG8gZ2VuZXJhdGUgc2xpZ2h0bHkgd29yc2UgY29kZS4gIE5vdGUgZm9yIGV4YW1wbGUgdGhlIGFkZGl0aW9uYWwKLSAqICAgIDQwIGxpbmVzIG9mIGFzc2VtYmx5IGNvZGUgY29tcGlsaW5nIHRoZSAiZm9yIGVhY2ggcG9zc2libGUgY3B1IgotICogICAgbG9vcHMgYnVyaWVkIGluIHRoZSBkaXNrX3N0YXRfcmVhZCgpIG1hY3JvcyBjYWxscyB3aGVuIGNvbXBpbGluZwotICogICAgZHJpdmVycy9ibG9jay9nZW5oZC5jIChhcmNoIGkzODYsIENPTkZJR19TTVA9eSkuICBTbyB1c2UgYSBzaW1wbGUKLSAqICAgIG9uZS1saW5lICNkZWZpbmUgZm9yIGNwdV9pc3NldCgpLCBpbnN0ZWFkIG9mIHdyYXBwaW5nIGFuIGlubGluZQotICogICAgaW5zaWRlIGEgbWFjcm8sIHRoZSB3YXkgd2UgZG8gdGhlIG90aGVyIGNhbGxzLgorICogc2V0IG9mIENQVSdzIGluIGEgc3lzdGVtLCBvbmUgYml0IHBvc2l0aW9uIHBlciBDUFUgbnVtYmVyLiAgSW4gZ2VuZXJhbCwKKyAqIG9ubHkgbnJfY3B1X2lkcyAoPD0gTlJfQ1BVUykgYml0cyBhcmUgdmFsaWQuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KIAogdHlwZWRlZiBzdHJ1Y3QgY3B1bWFzayB7IERFQ0xBUkVfQklUTUFQKGJpdHMsIE5SX0NQVVMpOyB9IGNwdW1hc2tfdDsKLWV4dGVybiBjcHVtYXNrX3QgX3VudXNlZF9jcHVtYXNrX2FyZ187Ci0KLSNpZm5kZWYgQ09ORklHX0RJU0FCTEVfT0JTT0xFVEVfQ1BVTUFTS19GVU5DVElPTlMKLSNkZWZpbmUgY3B1X3NldChjcHUsIGRzdCkgX19jcHVfc2V0KChjcHUpLCAmKGRzdCkpCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfc2V0KGludCBjcHUsIHZvbGF0aWxlIGNwdW1hc2tfdCAqZHN0cCkKLXsKLQlzZXRfYml0KGNwdSwgZHN0cC0+Yml0cyk7Ci19Ci0KLSNkZWZpbmUgY3B1X2NsZWFyKGNwdSwgZHN0KSBfX2NwdV9jbGVhcigoY3B1KSwgJihkc3QpKQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1X2NsZWFyKGludCBjcHUsIHZvbGF0aWxlIGNwdW1hc2tfdCAqZHN0cCkKLXsKLQljbGVhcl9iaXQoY3B1LCBkc3RwLT5iaXRzKTsKLX0KLQotI2RlZmluZSBjcHVzX3NldGFsbChkc3QpIF9fY3B1c19zZXRhbGwoJihkc3QpLCBOUl9DUFVTKQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1c19zZXRhbGwoY3B1bWFza190ICpkc3RwLCBpbnQgbmJpdHMpCi17Ci0JYml0bWFwX2ZpbGwoZHN0cC0+Yml0cywgbmJpdHMpOwotfQotCi0jZGVmaW5lIGNwdXNfY2xlYXIoZHN0KSBfX2NwdXNfY2xlYXIoJihkc3QpLCBOUl9DUFVTKQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1c19jbGVhcihjcHVtYXNrX3QgKmRzdHAsIGludCBuYml0cykKLXsKLQliaXRtYXBfemVybyhkc3RwLT5iaXRzLCBuYml0cyk7Ci19Ci0KLS8qIE5vIHN0YXRpYyBpbmxpbmUgdHlwZSBjaGVja2luZyAtIHNlZSBTdWJ0bGV0eSAoMSkgYWJvdmUuICovCi0jZGVmaW5lIGNwdV9pc3NldChjcHUsIGNwdW1hc2spIHRlc3RfYml0KChjcHUpLCAoY3B1bWFzaykuYml0cykKLQotI2RlZmluZSBjcHVfdGVzdF9hbmRfc2V0KGNwdSwgY3B1bWFzaykgX19jcHVfdGVzdF9hbmRfc2V0KChjcHUpLCAmKGNwdW1hc2spKQotc3RhdGljIGlubGluZSBpbnQgX19jcHVfdGVzdF9hbmRfc2V0KGludCBjcHUsIGNwdW1hc2tfdCAqYWRkcikKLXsKLQlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdChjcHUsIGFkZHItPmJpdHMpOwotfQotCi0jZGVmaW5lIGNwdXNfYW5kKGRzdCwgc3JjMSwgc3JjMikgX19jcHVzX2FuZCgmKGRzdCksICYoc3JjMSksICYoc3JjMiksIE5SX0NQVVMpCi1zdGF0aWMgaW5saW5lIGludCBfX2NwdXNfYW5kKGNwdW1hc2tfdCAqZHN0cCwgY29uc3QgY3B1bWFza190ICpzcmMxcCwKLQkJCQkJY29uc3QgY3B1bWFza190ICpzcmMycCwgaW50IG5iaXRzKQotewotCXJldHVybiBiaXRtYXBfYW5kKGRzdHAtPmJpdHMsIHNyYzFwLT5iaXRzLCBzcmMycC0+Yml0cywgbmJpdHMpOwotfQotCi0jZGVmaW5lIGNwdXNfb3IoZHN0LCBzcmMxLCBzcmMyKSBfX2NwdXNfb3IoJihkc3QpLCAmKHNyYzEpLCAmKHNyYzIpLCBOUl9DUFVTKQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1c19vcihjcHVtYXNrX3QgKmRzdHAsIGNvbnN0IGNwdW1hc2tfdCAqc3JjMXAsCi0JCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjMnAsIGludCBuYml0cykKLXsKLQliaXRtYXBfb3IoZHN0cC0+Yml0cywgc3JjMXAtPmJpdHMsIHNyYzJwLT5iaXRzLCBuYml0cyk7Ci19Ci0KLSNkZWZpbmUgY3B1c194b3IoZHN0LCBzcmMxLCBzcmMyKSBfX2NwdXNfeG9yKCYoZHN0KSwgJihzcmMxKSwgJihzcmMyKSwgTlJfQ1BVUykKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdXNfeG9yKGNwdW1hc2tfdCAqZHN0cCwgY29uc3QgY3B1bWFza190ICpzcmMxcCwKLQkJCQkJY29uc3QgY3B1bWFza190ICpzcmMycCwgaW50IG5iaXRzKQotewotCWJpdG1hcF94b3IoZHN0cC0+Yml0cywgc3JjMXAtPmJpdHMsIHNyYzJwLT5iaXRzLCBuYml0cyk7Ci19Ci0KLSNkZWZpbmUgY3B1c19hbmRub3QoZHN0LCBzcmMxLCBzcmMyKSBcCi0JCQkJX19jcHVzX2FuZG5vdCgmKGRzdCksICYoc3JjMSksICYoc3JjMiksIE5SX0NQVVMpCi1zdGF0aWMgaW5saW5lIGludCBfX2NwdXNfYW5kbm90KGNwdW1hc2tfdCAqZHN0cCwgY29uc3QgY3B1bWFza190ICpzcmMxcCwKLQkJCQkJY29uc3QgY3B1bWFza190ICpzcmMycCwgaW50IG5iaXRzKQotewotCXJldHVybiBiaXRtYXBfYW5kbm90KGRzdHAtPmJpdHMsIHNyYzFwLT5iaXRzLCBzcmMycC0+Yml0cywgbmJpdHMpOwotfQotCi0jZGVmaW5lIGNwdXNfY29tcGxlbWVudChkc3QsIHNyYykgX19jcHVzX2NvbXBsZW1lbnQoJihkc3QpLCAmKHNyYyksIE5SX0NQVVMpCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVzX2NvbXBsZW1lbnQoY3B1bWFza190ICpkc3RwLAotCQkJCQljb25zdCBjcHVtYXNrX3QgKnNyY3AsIGludCBuYml0cykKLXsKLQliaXRtYXBfY29tcGxlbWVudChkc3RwLT5iaXRzLCBzcmNwLT5iaXRzLCBuYml0cyk7Ci19Ci0KLSNkZWZpbmUgY3B1c19lcXVhbChzcmMxLCBzcmMyKSBfX2NwdXNfZXF1YWwoJihzcmMxKSwgJihzcmMyKSwgTlJfQ1BVUykKLXN0YXRpYyBpbmxpbmUgaW50IF9fY3B1c19lcXVhbChjb25zdCBjcHVtYXNrX3QgKnNyYzFwLAotCQkJCQljb25zdCBjcHVtYXNrX3QgKnNyYzJwLCBpbnQgbmJpdHMpCi17Ci0JcmV0dXJuIGJpdG1hcF9lcXVhbChzcmMxcC0+Yml0cywgc3JjMnAtPmJpdHMsIG5iaXRzKTsKLX0KLQotI2RlZmluZSBjcHVzX2ludGVyc2VjdHMoc3JjMSwgc3JjMikgX19jcHVzX2ludGVyc2VjdHMoJihzcmMxKSwgJihzcmMyKSwgTlJfQ1BVUykKLXN0YXRpYyBpbmxpbmUgaW50IF9fY3B1c19pbnRlcnNlY3RzKGNvbnN0IGNwdW1hc2tfdCAqc3JjMXAsCi0JCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjMnAsIGludCBuYml0cykKLXsKLQlyZXR1cm4gYml0bWFwX2ludGVyc2VjdHMoc3JjMXAtPmJpdHMsIHNyYzJwLT5iaXRzLCBuYml0cyk7Ci19Ci0KLSNkZWZpbmUgY3B1c19zdWJzZXQoc3JjMSwgc3JjMikgX19jcHVzX3N1YnNldCgmKHNyYzEpLCAmKHNyYzIpLCBOUl9DUFVTKQotc3RhdGljIGlubGluZSBpbnQgX19jcHVzX3N1YnNldChjb25zdCBjcHVtYXNrX3QgKnNyYzFwLAotCQkJCQljb25zdCBjcHVtYXNrX3QgKnNyYzJwLCBpbnQgbmJpdHMpCi17Ci0JcmV0dXJuIGJpdG1hcF9zdWJzZXQoc3JjMXAtPmJpdHMsIHNyYzJwLT5iaXRzLCBuYml0cyk7Ci19Ci0KLSNkZWZpbmUgY3B1c19lbXB0eShzcmMpIF9fY3B1c19lbXB0eSgmKHNyYyksIE5SX0NQVVMpCi1zdGF0aWMgaW5saW5lIGludCBfX2NwdXNfZW1wdHkoY29uc3QgY3B1bWFza190ICpzcmNwLCBpbnQgbmJpdHMpCi17Ci0JcmV0dXJuIGJpdG1hcF9lbXB0eShzcmNwLT5iaXRzLCBuYml0cyk7Ci19Ci0KLSNkZWZpbmUgY3B1c19mdWxsKGNwdW1hc2spIF9fY3B1c19mdWxsKCYoY3B1bWFzayksIE5SX0NQVVMpCi1zdGF0aWMgaW5saW5lIGludCBfX2NwdXNfZnVsbChjb25zdCBjcHVtYXNrX3QgKnNyY3AsIGludCBuYml0cykKLXsKLQlyZXR1cm4gYml0bWFwX2Z1bGwoc3JjcC0+Yml0cywgbmJpdHMpOwotfQotCi0jZGVmaW5lIGNwdXNfd2VpZ2h0KGNwdW1hc2spIF9fY3B1c193ZWlnaHQoJihjcHVtYXNrKSwgTlJfQ1BVUykKLXN0YXRpYyBpbmxpbmUgaW50IF9fY3B1c193ZWlnaHQoY29uc3QgY3B1bWFza190ICpzcmNwLCBpbnQgbmJpdHMpCi17Ci0JcmV0dXJuIGJpdG1hcF93ZWlnaHQoc3JjcC0+Yml0cywgbmJpdHMpOwotfQotCi0jZGVmaW5lIGNwdXNfc2hpZnRfcmlnaHQoZHN0LCBzcmMsIG4pIFwKLQkJCV9fY3B1c19zaGlmdF9yaWdodCgmKGRzdCksICYoc3JjKSwgKG4pLCBOUl9DUFVTKQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1c19zaGlmdF9yaWdodChjcHVtYXNrX3QgKmRzdHAsCi0JCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjcCwgaW50IG4sIGludCBuYml0cykKLXsKLQliaXRtYXBfc2hpZnRfcmlnaHQoZHN0cC0+Yml0cywgc3JjcC0+Yml0cywgbiwgbmJpdHMpOwotfQotCi0jZGVmaW5lIGNwdXNfc2hpZnRfbGVmdChkc3QsIHNyYywgbikgXAotCQkJX19jcHVzX3NoaWZ0X2xlZnQoJihkc3QpLCAmKHNyYyksIChuKSwgTlJfQ1BVUykKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdXNfc2hpZnRfbGVmdChjcHVtYXNrX3QgKmRzdHAsCi0JCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjcCwgaW50IG4sIGludCBuYml0cykKLXsKLQliaXRtYXBfc2hpZnRfbGVmdChkc3RwLT5iaXRzLCBzcmNwLT5iaXRzLCBuLCBuYml0cyk7Ci19Ci0jZW5kaWYgLyogIUNPTkZJR19ESVNBQkxFX09CU09MRVRFX0NQVU1BU0tfRlVOQ1RJT05TICovCiAKIC8qKgotICogdG9fY3B1bWFzayAtIGNvbnZlcnQgYW4gTlJfQ1BVUyBiaXRtYXAgdG8gYSBzdHJ1Y3QgY3B1bWFzayAqCi0gKiBAYml0bWFwOiB0aGUgYml0bWFwCisgKiBjcHVtYXNrX2JpdHMgLSBnZXQgdGhlIGJpdHMgaW4gYSBjcHVtYXNrCisgKiBAbWFza3A6IHRoZSBzdHJ1Y3QgY3B1bWFzayAqCiAgKgotICogVGhlcmUgYXJlIGEgZmV3IHBsYWNlcyB3aGVyZSBjcHVtYXNrX3Zhcl90IGlzbid0IGFwcHJvcHJpYXRlIGFuZAotICogc3RhdGljIGNwdW1hc2tzIG11c3QgYmUgdXNlZCAoZWcuIHZlcnkgZWFybHkgYm9vdCksIHlldCB3ZSBkb24ndAotICogZXhwb3NlIHRoZSBkZWZpbml0aW9uIG9mICdzdHJ1Y3QgY3B1bWFzaycuCi0gKgotICogVGhpcyBkb2VzIHRoZSBjb252ZXJzaW9uLCBhbmQgY2FuIGJlIHVzZWQgYXMgYSBjb25zdGFudCBpbml0aWFsaXplci4KKyAqIFlvdSBzaG91bGQgb25seSBhc3N1bWUgbnJfY3B1X2lkcyBiaXRzIG9mIHRoaXMgbWFzayBhcmUgdmFsaWQuICBUaGlzIGlzCisgKiBhIG1hY3JvIHNvIGl0J3MgY29uc3QtY29ycmVjdC4KICAqLwotI2RlZmluZSB0b19jcHVtYXNrKGJpdG1hcCkJCQkJCQlcCi0JKChzdHJ1Y3QgY3B1bWFzayAqKSgxID8gKGJpdG1hcCkJCQkJXAotCQkJICAgIDogKHZvaWQgKilzaXplb2YoX19jaGVja19pc19iaXRtYXAoYml0bWFwKSkpKQotCi1zdGF0aWMgaW5saW5lIGludCBfX2NoZWNrX2lzX2JpdG1hcChjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXApCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBTcGVjaWFsLWNhc2UgZGF0YSBzdHJ1Y3R1cmUgZm9yICJzaW5nbGUgYml0IHNldCBvbmx5IiBjb25zdGFudCBDUFUgbWFza3MuCi0gKgotICogV2UgcHJlLWdlbmVyYXRlIGFsbCB0aGUgNjQgKG9yIDMyKSBwb3NzaWJsZSBiaXQgcG9zaXRpb25zLCB3aXRoIGVub3VnaAotICogcGFkZGluZyB0byB0aGUgbGVmdCBhbmQgdGhlIHJpZ2h0LCBhbmQgcmV0dXJuIHRoZSBjb25zdGFudCBwb2ludGVyCi0gKiBhcHByb3ByaWF0ZWx5IG9mZnNldC4KLSAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcKLQljcHVfYml0X2JpdG1hcFtCSVRTX1BFUl9MT05HKzFdW0JJVFNfVE9fTE9OR1MoTlJfQ1BVUyldOwotCi1zdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpnZXRfY3B1X21hc2sodW5zaWduZWQgaW50IGNwdSkKLXsKLQljb25zdCB1bnNpZ25lZCBsb25nICpwID0gY3B1X2JpdF9iaXRtYXBbMSArIGNwdSAlIEJJVFNfUEVSX0xPTkddOwotCXAgLT0gY3B1IC8gQklUU19QRVJfTE9ORzsKLQlyZXR1cm4gdG9fY3B1bWFzayhwKTsKLX0KLQotI2lmbmRlZiBDT05GSUdfRElTQUJMRV9PQlNPTEVURV9DUFVNQVNLX0ZVTkNUSU9OUwotLyoKLSAqIEluIGNhc2VzIHdoZXJlIHdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGNwdW1hc2sgaW1tZWRpYXRlbHksCi0gKiBnY2Mgb3B0aW1pemVzIGl0IG91dCAoaXQncyBhIGNvbnN0YW50KSBhbmQgdGhlcmUncyBubyBodWdlIHN0YWNrCi0gKiB2YXJpYWJsZSBjcmVhdGVkOgotICovCi0jZGVmaW5lIGNwdW1hc2tfb2ZfY3B1KGNwdSkgKCpnZXRfY3B1X21hc2soY3B1KSkKLQotCi0jZGVmaW5lIENQVV9NQVNLX0xBU1RfV09SRCBCSVRNQVBfTEFTVF9XT1JEX01BU0soTlJfQ1BVUykKLQotI2lmIE5SX0NQVVMgPD0gQklUU19QRVJfTE9ORwotCi0jZGVmaW5lIENQVV9NQVNLX0FMTAkJCQkJCQlcCi0oY3B1bWFza190KSB7IHsJCQkJCQkJCVwKLQlbQklUU19UT19MT05HUyhOUl9DUFVTKS0xXSA9IENQVV9NQVNLX0xBU1RfV09SRAkJCVwKLX0gfQotCi0jZGVmaW5lIENQVV9NQVNLX0FMTF9QVFIJKCZDUFVfTUFTS19BTEwpCi0KLSNlbHNlCi0KLSNkZWZpbmUgQ1BVX01BU0tfQUxMCQkJCQkJCVwKLShjcHVtYXNrX3QpIHsgewkJCQkJCQkJXAotCVswIC4uLiBCSVRTX1RPX0xPTkdTKE5SX0NQVVMpLTJdID0gfjBVTCwJCQlcCi0JW0JJVFNfVE9fTE9OR1MoTlJfQ1BVUyktMV0gPSBDUFVfTUFTS19MQVNUX1dPUkQJCQlcCi19IH0KLQotLyogY3B1X21hc2tfYWxsIGlzIGluIGluaXQvbWFpbi5jICovCi1leHRlcm4gY3B1bWFza190IGNwdV9tYXNrX2FsbDsKLSNkZWZpbmUgQ1BVX01BU0tfQUxMX1BUUgkoJmNwdV9tYXNrX2FsbCkKLQotI2VuZGlmCi0KLSNkZWZpbmUgQ1BVX01BU0tfTk9ORQkJCQkJCQlcCi0oY3B1bWFza190KSB7IHsJCQkJCQkJCVwKLQlbMCAuLi4gQklUU19UT19MT05HUyhOUl9DUFVTKS0xXSA9ICAwVUwJCQkJXAotfSB9Ci0KLSNkZWZpbmUgQ1BVX01BU0tfQ1BVMAkJCQkJCQlcCi0oY3B1bWFza190KSB7IHsJCQkJCQkJCVwKLQlbMF0gPSAgMVVMCQkJCQkJCVwKLX0gfQotCi0jZGVmaW5lIGNwdXNfYWRkcihzcmMpICgoc3JjKS5iaXRzKQotCi0jaWYgTlJfQ1BVUyA+IEJJVFNfUEVSX0xPTkcKLSNkZWZpbmUJQ1BVTUFTS19BTExPQyhtKQlzdHJ1Y3QgbSAqbSA9IGttYWxsb2Moc2l6ZW9mKCptKSwgR0ZQX0tFUk5FTCkKLSNkZWZpbmUJQ1BVTUFTS19GUkVFKG0pCQlrZnJlZShtKQotI2Vsc2UKLSNkZWZpbmUJQ1BVTUFTS19BTExPQyhtKQlzdHJ1Y3QgbSBfbSwgKm0gPSAmX20KLSNkZWZpbmUJQ1BVTUFTS19GUkVFKG0pCi0jZW5kaWYKLSNkZWZpbmUJQ1BVTUFTS19QVFIodiwgbSkgCWNwdW1hc2tfdCAqdiA9ICYobS0+dikKLQotI2RlZmluZSBjcHVfcmVtYXAob2xkYml0LCBvbGQsIG5ldykgXAotCQlfX2NwdV9yZW1hcCgob2xkYml0KSwgJihvbGQpLCAmKG5ldyksIE5SX0NQVVMpCi1zdGF0aWMgaW5saW5lIGludCBfX2NwdV9yZW1hcChpbnQgb2xkYml0LAotCQljb25zdCBjcHVtYXNrX3QgKm9sZHAsIGNvbnN0IGNwdW1hc2tfdCAqbmV3cCwgaW50IG5iaXRzKQotewotCXJldHVybiBiaXRtYXBfYml0cmVtYXAob2xkYml0LCBvbGRwLT5iaXRzLCBuZXdwLT5iaXRzLCBuYml0cyk7Ci19Ci0KLSNkZWZpbmUgY3B1c19yZW1hcChkc3QsIHNyYywgb2xkLCBuZXcpIFwKLQkJX19jcHVzX3JlbWFwKCYoZHN0KSwgJihzcmMpLCAmKG9sZCksICYobmV3KSwgTlJfQ1BVUykKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdXNfcmVtYXAoY3B1bWFza190ICpkc3RwLCBjb25zdCBjcHVtYXNrX3QgKnNyY3AsCi0JCWNvbnN0IGNwdW1hc2tfdCAqb2xkcCwgY29uc3QgY3B1bWFza190ICpuZXdwLCBpbnQgbmJpdHMpCi17Ci0JYml0bWFwX3JlbWFwKGRzdHAtPmJpdHMsIHNyY3AtPmJpdHMsIG9sZHAtPmJpdHMsIG5ld3AtPmJpdHMsIG5iaXRzKTsKLX0KLQotI2RlZmluZSBjcHVzX29udG8oZHN0LCBvcmlnLCByZWxtYXApIFwKLQkJX19jcHVzX29udG8oJihkc3QpLCAmKG9yaWcpLCAmKHJlbG1hcCksIE5SX0NQVVMpCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVzX29udG8oY3B1bWFza190ICpkc3RwLCBjb25zdCBjcHVtYXNrX3QgKm9yaWdwLAotCQljb25zdCBjcHVtYXNrX3QgKnJlbG1hcHAsIGludCBuYml0cykKLXsKLQliaXRtYXBfb250byhkc3RwLT5iaXRzLCBvcmlncC0+Yml0cywgcmVsbWFwcC0+Yml0cywgbmJpdHMpOwotfQotCi0jZGVmaW5lIGNwdXNfZm9sZChkc3QsIG9yaWcsIHN6KSBcCi0JCV9fY3B1c19mb2xkKCYoZHN0KSwgJihvcmlnKSwgc3osIE5SX0NQVVMpCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVzX2ZvbGQoY3B1bWFza190ICpkc3RwLCBjb25zdCBjcHVtYXNrX3QgKm9yaWdwLAotCQlpbnQgc3osIGludCBuYml0cykKLXsKLQliaXRtYXBfZm9sZChkc3RwLT5iaXRzLCBvcmlncC0+Yml0cywgc3osIG5iaXRzKTsKLX0KLSNlbmRpZiAvKiAhQ09ORklHX0RJU0FCTEVfT0JTT0xFVEVfQ1BVTUFTS19GVU5DVElPTlMgKi8KKyNkZWZpbmUgY3B1bWFza19iaXRzKG1hc2twKSAoKG1hc2twKS0+Yml0cykKIAogI2lmIE5SX0NQVVMgPT0gMQotCiAjZGVmaW5lIG5yX2NwdV9pZHMJCTEKLSNpZm5kZWYgQ09ORklHX0RJU0FCTEVfT0JTT0xFVEVfQ1BVTUFTS19GVU5DVElPTlMKLSNkZWZpbmUgZmlyc3RfY3B1KHNyYykJCSh7ICh2b2lkKShzcmMpOyAwOyB9KQotI2RlZmluZSBuZXh0X2NwdShuLCBzcmMpCSh7ICh2b2lkKShzcmMpOyAxOyB9KQotI2RlZmluZSBhbnlfb25saW5lX2NwdShtYXNrKQkwCi0jZGVmaW5lIGZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykJXAotCWZvciAoKGNwdSkgPSAwOyAoY3B1KSA8IDE7IChjcHUpKyssICh2b2lkKW1hc2spCi0jZW5kaWYgLyogIUNPTkZJR19ESVNBQkxFX09CU09MRVRFX0NQVU1BU0tfRlVOQ1RJT05TICovCi0jZWxzZSAvKiBOUl9DUFVTID4gMSAqLwotCisjZWxzZQogZXh0ZXJuIGludCBucl9jcHVfaWRzOwotI2lmbmRlZiBDT05GSUdfRElTQUJMRV9PQlNPTEVURV9DUFVNQVNLX0ZVTkNUSU9OUwotaW50IF9fZmlyc3RfY3B1KGNvbnN0IGNwdW1hc2tfdCAqc3JjcCk7Ci1pbnQgX19uZXh0X2NwdShpbnQgbiwgY29uc3QgY3B1bWFza190ICpzcmNwKTsKLWludCBfX2FueV9vbmxpbmVfY3B1KGNvbnN0IGNwdW1hc2tfdCAqbWFzayk7Ci0KLSNkZWZpbmUgZmlyc3RfY3B1KHNyYykJCV9fZmlyc3RfY3B1KCYoc3JjKSkKLSNkZWZpbmUgbmV4dF9jcHUobiwgc3JjKQlfX25leHRfY3B1KChuKSwgJihzcmMpKQotI2RlZmluZSBhbnlfb25saW5lX2NwdShtYXNrKSBfX2FueV9vbmxpbmVfY3B1KCYobWFzaykpCi0jZGVmaW5lIGZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykJCQlcCi0JZm9yICgoY3B1KSA9IC0xOwkJCQlcCi0JCShjcHUpID0gbmV4dF9jcHUoKGNwdSksIChtYXNrKSksCVwKLQkJKGNwdSkgPCBOUl9DUFVTOyApCi0jZW5kaWYgLyogIUNPTkZJR19ESVNBQkxFX09CU09MRVRFX0NQVU1BU0tfRlVOQ1RJT05TICovCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfRElTQUJMRV9PQlNPTEVURV9DUFVNQVNLX0ZVTkNUSU9OUwotI2lmIE5SX0NQVVMgPD0gNjQKLQotI2RlZmluZSBuZXh0X2NwdV9ucihuLCBzcmMpCQluZXh0X2NwdShuLCBzcmMpCi0jZGVmaW5lIGNwdXNfd2VpZ2h0X25yKGNwdW1hc2spCQljcHVzX3dlaWdodChjcHVtYXNrKQotI2RlZmluZSBmb3JfZWFjaF9jcHVfbWFza19ucihjcHUsIG1hc2spCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykKLQotI2Vsc2UgLyogTlJfQ1BVUyA+IDY0ICovCi0KLWludCBfX25leHRfY3B1X25yKGludCBuLCBjb25zdCBjcHVtYXNrX3QgKnNyY3ApOwotI2RlZmluZSBuZXh0X2NwdV9ucihuLCBzcmMpCV9fbmV4dF9jcHVfbnIoKG4pLCAmKHNyYykpCi0jZGVmaW5lIGNwdXNfd2VpZ2h0X25yKGNwdW1hc2spCV9fY3B1c193ZWlnaHQoJihjcHVtYXNrKSwgbnJfY3B1X2lkcykKLSNkZWZpbmUgZm9yX2VhY2hfY3B1X21hc2tfbnIoY3B1LCBtYXNrKQkJCVwKLQlmb3IgKChjcHUpID0gLTE7CQkJCVwKLQkJKGNwdSkgPSBuZXh0X2NwdV9ucigoY3B1KSwgKG1hc2spKSwJXAotCQkoY3B1KSA8IG5yX2NwdV9pZHM7ICkKLQotI2VuZGlmIC8qIE5SX0NQVVMgPiA2NCAqLwotI2VuZGlmIC8qICFDT05GSUdfRElTQUJMRV9PQlNPTEVURV9DUFVNQVNLX0ZVTkNUSU9OUyAqLworI2lmZGVmIENPTkZJR19DUFVNQVNLX09GRlNUQUNLCisvKiBBc3N1bWluZyBOUl9DUFVTIGlzIGh1Z2UsIGEgcnVudGltZSBsaW1pdCBpcyBtb3JlIGVmZmljaWVudC4gIEFsc28sCisgKiBub3QgYWxsIGJpdHMgbWF5IGJlIGFsbG9jYXRlZC4gKi8KKyNkZWZpbmUgbnJfY3B1bWFza19iaXRzCW5yX2NwdV9pZHMKKyNlbHNlCisjZGVmaW5lIG5yX2NwdW1hc2tfYml0cwlOUl9DUFVTCisjZW5kaWYKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgcGFydGljdWxhciBzeXN0ZW0gY3B1bWFza3MgYW5kIG9wZXJhdGlvbnMgbWFuYWdlCkBAIC00ODcsMTIgKzgwLDYgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY29uc3QgY3B1X3ByZXNlbnRfbWFzazsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY29uc3QgY3B1X2FjdGl2ZV9tYXNrOwogCi0vKiBUaGVzZSBzdHJpcCBjb25zdCwgYXMgdHJhZGl0aW9uYWxseSB0aGV5IHdlcmVuJ3QgY29uc3QuICovCi0jZGVmaW5lIGNwdV9wb3NzaWJsZV9tYXAJKCooY3B1bWFza190ICopY3B1X3Bvc3NpYmxlX21hc2spCi0jZGVmaW5lIGNwdV9vbmxpbmVfbWFwCQkoKihjcHVtYXNrX3QgKiljcHVfb25saW5lX21hc2spCi0jZGVmaW5lIGNwdV9wcmVzZW50X21hcAkJKCooY3B1bWFza190ICopY3B1X3ByZXNlbnRfbWFzaykKLSNkZWZpbmUgY3B1X2FjdGl2ZV9tYXAJCSgqKGNwdW1hc2tfdCAqKWNwdV9hY3RpdmVfbWFzaykKLQogI2lmIE5SX0NQVVMgPiAxCiAjZGVmaW5lIG51bV9vbmxpbmVfY3B1cygpCWNwdW1hc2tfd2VpZ2h0KGNwdV9vbmxpbmVfbWFzaykKICNkZWZpbmUgbnVtX3Bvc3NpYmxlX2NwdXMoKQljcHVtYXNrX3dlaWdodChjcHVfcG9zc2libGVfbWFzaykKQEAgLTUxMSwzNSArOTgsNiBAQAogI2RlZmluZSBjcHVfYWN0aXZlKGNwdSkJCSgoY3B1KSA9PSAwKQogI2VuZGlmCiAKLSNkZWZpbmUgY3B1X2lzX29mZmxpbmUoY3B1KQl1bmxpa2VseSghY3B1X29ubGluZShjcHUpKQotCi0vKiBUaGVzZSBhcmUgdGhlIG5ldyB2ZXJzaW9ucyBvZiB0aGUgY3B1bWFzayBvcGVyYXRvcnM6IHBhc3NlZCBieSBwb2ludGVyLgotICogVGhlIG9sZGVyIHZlcnNpb25zIHdpbGwgYmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlc2UsIHRoZW4gZGVsZXRlZC4gKi8KLSNkZWZpbmUgY3B1bWFza19iaXRzKG1hc2twKSAoKG1hc2twKS0+Yml0cykKLQotI2lmIE5SX0NQVVMgPD0gQklUU19QRVJfTE9ORwotI2RlZmluZSBDUFVfQklUU19BTEwJCQkJCQlcCi17CQkJCQkJCQlcCi0JW0JJVFNfVE9fTE9OR1MoTlJfQ1BVUyktMV0gPSBDUFVfTUFTS19MQVNUX1dPUkQJXAotfQotCi0jZWxzZSAvKiBOUl9DUFVTID4gQklUU19QRVJfTE9ORyAqLwotCi0jZGVmaW5lIENQVV9CSVRTX0FMTAkJCQkJCVwKLXsJCQkJCQkJCVwKLQlbMCAuLi4gQklUU19UT19MT05HUyhOUl9DUFVTKS0yXSA9IH4wVUwsCQlcCi0JW0JJVFNfVE9fTE9OR1MoTlJfQ1BVUyktMV0gPSBDUFVfTUFTS19MQVNUX1dPUkQJCVwKLX0KLSNlbmRpZiAvKiBOUl9DUFVTID4gQklUU19QRVJfTE9ORyAqLwotCi0jaWZkZWYgQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0sKLS8qIEFzc3VtaW5nIE5SX0NQVVMgaXMgaHVnZSwgYSBydW50aW1lIGxpbWl0IGlzIG1vcmUgZWZmaWNpZW50LiAgQWxzbywKLSAqIG5vdCBhbGwgYml0cyBtYXkgYmUgYWxsb2NhdGVkLiAqLwotI2RlZmluZSBucl9jcHVtYXNrX2JpdHMJbnJfY3B1X2lkcwotI2Vsc2UKLSNkZWZpbmUgbnJfY3B1bWFza19iaXRzCU5SX0NQVVMKLSNlbmRpZgotCiAvKiB2ZXJpZnkgY3B1IGFyZ3VtZW50IHRvIGNwdW1hc2tfKiBvcGVyYXRvcnMgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdW1hc2tfY2hlY2sodW5zaWduZWQgaW50IGNwdSkKIHsKQEAgLTExMDAsNCArNjU4LDI0MSBAQAogdm9pZCBpbml0X2NwdV9wcmVzZW50KGNvbnN0IHN0cnVjdCBjcHVtYXNrICpzcmMpOwogdm9pZCBpbml0X2NwdV9wb3NzaWJsZShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqc3JjKTsKIHZvaWQgaW5pdF9jcHVfb25saW5lKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpzcmMpOworCisvKioKKyAqIHRvX2NwdW1hc2sgLSBjb252ZXJ0IGFuIE5SX0NQVVMgYml0bWFwIHRvIGEgc3RydWN0IGNwdW1hc2sgKgorICogQGJpdG1hcDogdGhlIGJpdG1hcAorICoKKyAqIFRoZXJlIGFyZSBhIGZldyBwbGFjZXMgd2hlcmUgY3B1bWFza192YXJfdCBpc24ndCBhcHByb3ByaWF0ZSBhbmQKKyAqIHN0YXRpYyBjcHVtYXNrcyBtdXN0IGJlIHVzZWQgKGVnLiB2ZXJ5IGVhcmx5IGJvb3QpLCB5ZXQgd2UgZG9uJ3QKKyAqIGV4cG9zZSB0aGUgZGVmaW5pdGlvbiBvZiAnc3RydWN0IGNwdW1hc2snLgorICoKKyAqIFRoaXMgZG9lcyB0aGUgY29udmVyc2lvbiwgYW5kIGNhbiBiZSB1c2VkIGFzIGEgY29uc3RhbnQgaW5pdGlhbGl6ZXIuCisgKi8KKyNkZWZpbmUgdG9fY3B1bWFzayhiaXRtYXApCQkJCQkJXAorCSgoc3RydWN0IGNwdW1hc2sgKikoMSA/IChiaXRtYXApCQkJCVwKKwkJCSAgICA6ICh2b2lkICopc2l6ZW9mKF9fY2hlY2tfaXNfYml0bWFwKGJpdG1hcCkpKSkKKworc3RhdGljIGlubGluZSBpbnQgX19jaGVja19pc19iaXRtYXAoY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwKQoreworCXJldHVybiAxOworfQorCisvKgorICogU3BlY2lhbC1jYXNlIGRhdGEgc3RydWN0dXJlIGZvciAic2luZ2xlIGJpdCBzZXQgb25seSIgY29uc3RhbnQgQ1BVIG1hc2tzLgorICoKKyAqIFdlIHByZS1nZW5lcmF0ZSBhbGwgdGhlIDY0IChvciAzMikgcG9zc2libGUgYml0IHBvc2l0aW9ucywgd2l0aCBlbm91Z2gKKyAqIHBhZGRpbmcgdG8gdGhlIGxlZnQgYW5kIHRoZSByaWdodCwgYW5kIHJldHVybiB0aGUgY29uc3RhbnQgcG9pbnRlcgorICogYXBwcm9wcmlhdGVseSBvZmZzZXQuCisgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nCisJY3B1X2JpdF9iaXRtYXBbQklUU19QRVJfTE9ORysxXVtCSVRTX1RPX0xPTkdTKE5SX0NQVVMpXTsKKworc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZ2V0X2NwdV9tYXNrKHVuc2lnbmVkIGludCBjcHUpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IGNwdV9iaXRfYml0bWFwWzEgKyBjcHUgJSBCSVRTX1BFUl9MT05HXTsKKwlwIC09IGNwdSAvIEJJVFNfUEVSX0xPTkc7CisJcmV0dXJuIHRvX2NwdW1hc2socCk7Cit9CisKKyNkZWZpbmUgY3B1X2lzX29mZmxpbmUoY3B1KQl1bmxpa2VseSghY3B1X29ubGluZShjcHUpKQorCisjaWYgTlJfQ1BVUyA8PSBCSVRTX1BFUl9MT05HCisjZGVmaW5lIENQVV9CSVRTX0FMTAkJCQkJCVwKK3sJCQkJCQkJCVwKKwlbQklUU19UT19MT05HUyhOUl9DUFVTKS0xXSA9IENQVV9NQVNLX0xBU1RfV09SRAlcCit9CisKKyNlbHNlIC8qIE5SX0NQVVMgPiBCSVRTX1BFUl9MT05HICovCisKKyNkZWZpbmUgQ1BVX0JJVFNfQUxMCQkJCQkJXAorewkJCQkJCQkJXAorCVswIC4uLiBCSVRTX1RPX0xPTkdTKE5SX0NQVVMpLTJdID0gfjBVTCwJCVwKKwlbQklUU19UT19MT05HUyhOUl9DUFVTKS0xXSA9IENQVV9NQVNLX0xBU1RfV09SRAkJXAorfQorI2VuZGlmIC8qIE5SX0NQVVMgPiBCSVRTX1BFUl9MT05HICovCisKKy8qCisgKgorICogRnJvbSBoZXJlIGRvd24sIGFsbCBvYnNvbGV0ZS4gIFVzZSBjcHVtYXNrXyB2YXJpYW50cyEKKyAqCisgKi8KKyNpZm5kZWYgQ09ORklHX0RJU0FCTEVfT0JTT0xFVEVfQ1BVTUFTS19GVU5DVElPTlMKKy8qIFRoZXNlIHN0cmlwIGNvbnN0LCBhcyB0cmFkaXRpb25hbGx5IHRoZXkgd2VyZW4ndCBjb25zdC4gKi8KKyNkZWZpbmUgY3B1X3Bvc3NpYmxlX21hcAkoKihjcHVtYXNrX3QgKiljcHVfcG9zc2libGVfbWFzaykKKyNkZWZpbmUgY3B1X29ubGluZV9tYXAJCSgqKGNwdW1hc2tfdCAqKWNwdV9vbmxpbmVfbWFzaykKKyNkZWZpbmUgY3B1X3ByZXNlbnRfbWFwCQkoKihjcHVtYXNrX3QgKiljcHVfcHJlc2VudF9tYXNrKQorI2RlZmluZSBjcHVfYWN0aXZlX21hcAkJKCooY3B1bWFza190ICopY3B1X2FjdGl2ZV9tYXNrKQorCisjZGVmaW5lIGNwdW1hc2tfb2ZfY3B1KGNwdSkgKCpnZXRfY3B1X21hc2soY3B1KSkKKworI2RlZmluZSBDUFVfTUFTS19MQVNUX1dPUkQgQklUTUFQX0xBU1RfV09SRF9NQVNLKE5SX0NQVVMpCisKKyNpZiBOUl9DUFVTIDw9IEJJVFNfUEVSX0xPTkcKKworI2RlZmluZSBDUFVfTUFTS19BTEwJCQkJCQkJXAorKGNwdW1hc2tfdCkgeyB7CQkJCQkJCQlcCisJW0JJVFNfVE9fTE9OR1MoTlJfQ1BVUyktMV0gPSBDUFVfTUFTS19MQVNUX1dPUkQJCQlcCit9IH0KKworI2Vsc2UKKworI2RlZmluZSBDUFVfTUFTS19BTEwJCQkJCQkJXAorKGNwdW1hc2tfdCkgeyB7CQkJCQkJCQlcCisJWzAgLi4uIEJJVFNfVE9fTE9OR1MoTlJfQ1BVUyktMl0gPSB+MFVMLAkJCVwKKwlbQklUU19UT19MT05HUyhOUl9DUFVTKS0xXSA9IENQVV9NQVNLX0xBU1RfV09SRAkJCVwKK30gfQorCisjZW5kaWYKKworI2RlZmluZSBDUFVfTUFTS19OT05FCQkJCQkJCVwKKyhjcHVtYXNrX3QpIHsgewkJCQkJCQkJXAorCVswIC4uLiBCSVRTX1RPX0xPTkdTKE5SX0NQVVMpLTFdID0gIDBVTAkJCQlcCit9IH0KKworI2RlZmluZSBDUFVfTUFTS19DUFUwCQkJCQkJCVwKKyhjcHVtYXNrX3QpIHsgewkJCQkJCQkJXAorCVswXSA9ICAxVUwJCQkJCQkJXAorfSB9CisKKyNpZiBOUl9DUFVTID09IDEKKyNkZWZpbmUgZmlyc3RfY3B1KHNyYykJCSh7ICh2b2lkKShzcmMpOyAwOyB9KQorI2RlZmluZSBuZXh0X2NwdShuLCBzcmMpCSh7ICh2b2lkKShzcmMpOyAxOyB9KQorI2RlZmluZSBhbnlfb25saW5lX2NwdShtYXNrKQkwCisjZGVmaW5lIGZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykJXAorCWZvciAoKGNwdSkgPSAwOyAoY3B1KSA8IDE7IChjcHUpKyssICh2b2lkKW1hc2spCisjZWxzZSAvKiBOUl9DUFVTID4gMSAqLworaW50IF9fZmlyc3RfY3B1KGNvbnN0IGNwdW1hc2tfdCAqc3JjcCk7CitpbnQgX19uZXh0X2NwdShpbnQgbiwgY29uc3QgY3B1bWFza190ICpzcmNwKTsKK2ludCBfX2FueV9vbmxpbmVfY3B1KGNvbnN0IGNwdW1hc2tfdCAqbWFzayk7CisKKyNkZWZpbmUgZmlyc3RfY3B1KHNyYykJCV9fZmlyc3RfY3B1KCYoc3JjKSkKKyNkZWZpbmUgbmV4dF9jcHUobiwgc3JjKQlfX25leHRfY3B1KChuKSwgJihzcmMpKQorI2RlZmluZSBhbnlfb25saW5lX2NwdShtYXNrKSBfX2FueV9vbmxpbmVfY3B1KCYobWFzaykpCisjZGVmaW5lIGZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykJCQlcCisJZm9yICgoY3B1KSA9IC0xOwkJCQlcCisJCShjcHUpID0gbmV4dF9jcHUoKGNwdSksIChtYXNrKSksCVwKKwkJKGNwdSkgPCBOUl9DUFVTOyApCisjZW5kaWYgLyogU01QICovCisKKyNpZiBOUl9DUFVTIDw9IDY0CisKKyNkZWZpbmUgZm9yX2VhY2hfY3B1X21hc2tfbnIoY3B1LCBtYXNrKQlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIG1hc2spCisKKyNlbHNlIC8qIE5SX0NQVVMgPiA2NCAqLworCitpbnQgX19uZXh0X2NwdV9ucihpbnQgbiwgY29uc3QgY3B1bWFza190ICpzcmNwKTsKKyNkZWZpbmUgZm9yX2VhY2hfY3B1X21hc2tfbnIoY3B1LCBtYXNrKQkJCVwKKwlmb3IgKChjcHUpID0gLTE7CQkJCVwKKwkJKGNwdSkgPSBfX25leHRfY3B1X25yKChjcHUpLCAmKG1hc2spKSwJXAorCQkoY3B1KSA8IG5yX2NwdV9pZHM7ICkKKworI2VuZGlmIC8qIE5SX0NQVVMgPiA2NCAqLworCisjZGVmaW5lIGNwdXNfYWRkcihzcmMpICgoc3JjKS5iaXRzKQorCisjZGVmaW5lIGNwdV9zZXQoY3B1LCBkc3QpIF9fY3B1X3NldCgoY3B1KSwgJihkc3QpKQorc3RhdGljIGlubGluZSB2b2lkIF9fY3B1X3NldChpbnQgY3B1LCB2b2xhdGlsZSBjcHVtYXNrX3QgKmRzdHApCit7CisJc2V0X2JpdChjcHUsIGRzdHAtPmJpdHMpOworfQorCisjZGVmaW5lIGNwdV9jbGVhcihjcHUsIGRzdCkgX19jcHVfY2xlYXIoKGNwdSksICYoZHN0KSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdV9jbGVhcihpbnQgY3B1LCB2b2xhdGlsZSBjcHVtYXNrX3QgKmRzdHApCit7CisJY2xlYXJfYml0KGNwdSwgZHN0cC0+Yml0cyk7Cit9CisKKyNkZWZpbmUgY3B1c19zZXRhbGwoZHN0KSBfX2NwdXNfc2V0YWxsKCYoZHN0KSwgTlJfQ1BVUykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdXNfc2V0YWxsKGNwdW1hc2tfdCAqZHN0cCwgaW50IG5iaXRzKQoreworCWJpdG1hcF9maWxsKGRzdHAtPmJpdHMsIG5iaXRzKTsKK30KKworI2RlZmluZSBjcHVzX2NsZWFyKGRzdCkgX19jcHVzX2NsZWFyKCYoZHN0KSwgTlJfQ1BVUykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdXNfY2xlYXIoY3B1bWFza190ICpkc3RwLCBpbnQgbmJpdHMpCit7CisJYml0bWFwX3plcm8oZHN0cC0+Yml0cywgbmJpdHMpOworfQorCisvKiBObyBzdGF0aWMgaW5saW5lIHR5cGUgY2hlY2tpbmcgLSBzZWUgU3VidGxldHkgKDEpIGFib3ZlLiAqLworI2RlZmluZSBjcHVfaXNzZXQoY3B1LCBjcHVtYXNrKSB0ZXN0X2JpdCgoY3B1KSwgKGNwdW1hc2spLmJpdHMpCisKKyNkZWZpbmUgY3B1X3Rlc3RfYW5kX3NldChjcHUsIGNwdW1hc2spIF9fY3B1X3Rlc3RfYW5kX3NldCgoY3B1KSwgJihjcHVtYXNrKSkKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3B1X3Rlc3RfYW5kX3NldChpbnQgY3B1LCBjcHVtYXNrX3QgKmFkZHIpCit7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoY3B1LCBhZGRyLT5iaXRzKTsKK30KKworI2RlZmluZSBjcHVzX2FuZChkc3QsIHNyYzEsIHNyYzIpIF9fY3B1c19hbmQoJihkc3QpLCAmKHNyYzEpLCAmKHNyYzIpLCBOUl9DUFVTKQorc3RhdGljIGlubGluZSBpbnQgX19jcHVzX2FuZChjcHVtYXNrX3QgKmRzdHAsIGNvbnN0IGNwdW1hc2tfdCAqc3JjMXAsCisJCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjMnAsIGludCBuYml0cykKK3sKKwlyZXR1cm4gYml0bWFwX2FuZChkc3RwLT5iaXRzLCBzcmMxcC0+Yml0cywgc3JjMnAtPmJpdHMsIG5iaXRzKTsKK30KKworI2RlZmluZSBjcHVzX29yKGRzdCwgc3JjMSwgc3JjMikgX19jcHVzX29yKCYoZHN0KSwgJihzcmMxKSwgJihzcmMyKSwgTlJfQ1BVUykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdXNfb3IoY3B1bWFza190ICpkc3RwLCBjb25zdCBjcHVtYXNrX3QgKnNyYzFwLAorCQkJCQljb25zdCBjcHVtYXNrX3QgKnNyYzJwLCBpbnQgbmJpdHMpCit7CisJYml0bWFwX29yKGRzdHAtPmJpdHMsIHNyYzFwLT5iaXRzLCBzcmMycC0+Yml0cywgbmJpdHMpOworfQorCisjZGVmaW5lIGNwdXNfeG9yKGRzdCwgc3JjMSwgc3JjMikgX19jcHVzX3hvcigmKGRzdCksICYoc3JjMSksICYoc3JjMiksIE5SX0NQVVMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcHVzX3hvcihjcHVtYXNrX3QgKmRzdHAsIGNvbnN0IGNwdW1hc2tfdCAqc3JjMXAsCisJCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjMnAsIGludCBuYml0cykKK3sKKwliaXRtYXBfeG9yKGRzdHAtPmJpdHMsIHNyYzFwLT5iaXRzLCBzcmMycC0+Yml0cywgbmJpdHMpOworfQorCisjZGVmaW5lIGNwdXNfYW5kbm90KGRzdCwgc3JjMSwgc3JjMikgXAorCQkJCV9fY3B1c19hbmRub3QoJihkc3QpLCAmKHNyYzEpLCAmKHNyYzIpLCBOUl9DUFVTKQorc3RhdGljIGlubGluZSBpbnQgX19jcHVzX2FuZG5vdChjcHVtYXNrX3QgKmRzdHAsIGNvbnN0IGNwdW1hc2tfdCAqc3JjMXAsCisJCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjMnAsIGludCBuYml0cykKK3sKKwlyZXR1cm4gYml0bWFwX2FuZG5vdChkc3RwLT5iaXRzLCBzcmMxcC0+Yml0cywgc3JjMnAtPmJpdHMsIG5iaXRzKTsKK30KKworI2RlZmluZSBjcHVzX2VxdWFsKHNyYzEsIHNyYzIpIF9fY3B1c19lcXVhbCgmKHNyYzEpLCAmKHNyYzIpLCBOUl9DUFVTKQorc3RhdGljIGlubGluZSBpbnQgX19jcHVzX2VxdWFsKGNvbnN0IGNwdW1hc2tfdCAqc3JjMXAsCisJCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjMnAsIGludCBuYml0cykKK3sKKwlyZXR1cm4gYml0bWFwX2VxdWFsKHNyYzFwLT5iaXRzLCBzcmMycC0+Yml0cywgbmJpdHMpOworfQorCisjZGVmaW5lIGNwdXNfaW50ZXJzZWN0cyhzcmMxLCBzcmMyKSBfX2NwdXNfaW50ZXJzZWN0cygmKHNyYzEpLCAmKHNyYzIpLCBOUl9DUFVTKQorc3RhdGljIGlubGluZSBpbnQgX19jcHVzX2ludGVyc2VjdHMoY29uc3QgY3B1bWFza190ICpzcmMxcCwKKwkJCQkJY29uc3QgY3B1bWFza190ICpzcmMycCwgaW50IG5iaXRzKQoreworCXJldHVybiBiaXRtYXBfaW50ZXJzZWN0cyhzcmMxcC0+Yml0cywgc3JjMnAtPmJpdHMsIG5iaXRzKTsKK30KKworI2RlZmluZSBjcHVzX3N1YnNldChzcmMxLCBzcmMyKSBfX2NwdXNfc3Vic2V0KCYoc3JjMSksICYoc3JjMiksIE5SX0NQVVMpCitzdGF0aWMgaW5saW5lIGludCBfX2NwdXNfc3Vic2V0KGNvbnN0IGNwdW1hc2tfdCAqc3JjMXAsCisJCQkJCWNvbnN0IGNwdW1hc2tfdCAqc3JjMnAsIGludCBuYml0cykKK3sKKwlyZXR1cm4gYml0bWFwX3N1YnNldChzcmMxcC0+Yml0cywgc3JjMnAtPmJpdHMsIG5iaXRzKTsKK30KKworI2RlZmluZSBjcHVzX2VtcHR5KHNyYykgX19jcHVzX2VtcHR5KCYoc3JjKSwgTlJfQ1BVUykKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3B1c19lbXB0eShjb25zdCBjcHVtYXNrX3QgKnNyY3AsIGludCBuYml0cykKK3sKKwlyZXR1cm4gYml0bWFwX2VtcHR5KHNyY3AtPmJpdHMsIG5iaXRzKTsKK30KKworI2RlZmluZSBjcHVzX3dlaWdodChjcHVtYXNrKSBfX2NwdXNfd2VpZ2h0KCYoY3B1bWFzayksIE5SX0NQVVMpCitzdGF0aWMgaW5saW5lIGludCBfX2NwdXNfd2VpZ2h0KGNvbnN0IGNwdW1hc2tfdCAqc3JjcCwgaW50IG5iaXRzKQoreworCXJldHVybiBiaXRtYXBfd2VpZ2h0KHNyY3AtPmJpdHMsIG5iaXRzKTsKK30KKworI2RlZmluZSBjcHVzX3NoaWZ0X2xlZnQoZHN0LCBzcmMsIG4pIFwKKwkJCV9fY3B1c19zaGlmdF9sZWZ0KCYoZHN0KSwgJihzcmMpLCAobiksIE5SX0NQVVMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcHVzX3NoaWZ0X2xlZnQoY3B1bWFza190ICpkc3RwLAorCQkJCQljb25zdCBjcHVtYXNrX3QgKnNyY3AsIGludCBuLCBpbnQgbmJpdHMpCit7CisJYml0bWFwX3NoaWZ0X2xlZnQoZHN0cC0+Yml0cywgc3JjcC0+Yml0cywgbiwgbmJpdHMpOworfQorI2VuZGlmIC8qICFDT05GSUdfRElTQUJMRV9PQlNPTEVURV9DUFVNQVNLX0ZVTkNUSU9OUyAqLworCiAjZW5kaWYgLyogX19MSU5VWF9DUFVNQVNLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3JlZC5oIGIvaW5jbHVkZS9saW51eC9jcmVkLmgKaW5kZXggZmIzNzE2MC4uNGUzMzg3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcmVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcmVkLmgKQEAgLTE3NiwyMyArMTc2LDcgQEAKIGV4dGVybiB2b2lkIF9fdmFsaWRhdGVfcHJvY2Vzc19jcmVkcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwKIAkJCQkgICAgIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQpOwogCi1zdGF0aWMgaW5saW5lIGJvb2wgY3JlZHNfYXJlX2ludmFsaWQoY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQpCi17Ci0JaWYgKGNyZWQtPm1hZ2ljICE9IENSRURfTUFHSUMpCi0JCXJldHVybiB0cnVlOwotCWlmIChhdG9taWNfcmVhZCgmY3JlZC0+dXNhZ2UpIDwgYXRvbWljX3JlYWQoJmNyZWQtPnN1YnNjcmliZXJzKSkKLQkJcmV0dXJuIHRydWU7Ci0jaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NFTElOVVgKLQlpZiAoc2VsaW51eF9pc19lbmFibGVkKCkpIHsKLQkJaWYgKCh1bnNpZ25lZCBsb25nKSBjcmVkLT5zZWN1cml0eSA8IFBBR0VfU0laRSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoKCoodTMyICopY3JlZC0+c2VjdXJpdHkgJiAweGZmZmZmZjAwKSA9PQotCQkgICAgKFBPSVNPTl9GUkVFIDw8IDI0IHwgUE9JU09OX0ZSRUUgPDwgMTYgfCBQT0lTT05fRlJFRSA8PCA4KSkKLQkJCXJldHVybiB0cnVlOwotCX0KLSNlbmRpZgotCXJldHVybiBmYWxzZTsKLX0KK2V4dGVybiBib29sIGNyZWRzX2FyZV9pbnZhbGlkKGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkKTsKIAogc3RhdGljIGlubGluZSB2b2lkIF9fdmFsaWRhdGVfY3JlZHMoY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCiAJCQkJICAgIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxpbmUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYS5oIGIvaW5jbHVkZS9saW51eC9kY2EuaAppbmRleCA5YzIwYzdlLi5kMjdhN2EwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhLmgKQEAgLTIwLDYgKzIwLDkgQEAKICAqLwogI2lmbmRlZiBEQ0FfSAogI2RlZmluZSBEQ0FfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKIC8qIERDQSBQcm92aWRlciBBUEkgKi8KIAogLyogRENBIE5vdGlmaWVyIEludGVyZmFjZSAqLwpAQCAtMzYsNiArMzksMTIgQEAKIAlpbnQJCQkgaWQ7CiB9OwogCitzdHJ1Y3QgZGNhX2RvbWFpbiB7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJZGNhX3Byb3ZpZGVyczsKKwlzdHJ1Y3QgcGNpX2J1cwkJKnBjaV9yYzsKK307CisKIHN0cnVjdCBkY2Ffb3BzIHsKIAlpbnQJKCphZGRfcmVxdWVzdGVyKSAgICAoc3RydWN0IGRjYV9wcm92aWRlciAqLCBzdHJ1Y3QgZGV2aWNlICopOwogCWludAkoKnJlbW92ZV9yZXF1ZXN0ZXIpIChzdHJ1Y3QgZGNhX3Byb3ZpZGVyICosIHN0cnVjdCBkZXZpY2UgKik7CkBAIC00Nyw3ICs1Niw3IEBACiBzdHJ1Y3QgZGNhX3Byb3ZpZGVyICphbGxvY19kY2FfcHJvdmlkZXIoc3RydWN0IGRjYV9vcHMgKm9wcywgaW50IHByaXZfc2l6ZSk7CiB2b2lkIGZyZWVfZGNhX3Byb3ZpZGVyKHN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYSk7CiBpbnQgcmVnaXN0ZXJfZGNhX3Byb3ZpZGVyKHN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYSwgc3RydWN0IGRldmljZSAqZGV2KTsKLXZvaWQgdW5yZWdpc3Rlcl9kY2FfcHJvdmlkZXIoc3RydWN0IGRjYV9wcm92aWRlciAqZGNhKTsKK3ZvaWQgdW5yZWdpc3Rlcl9kY2FfcHJvdmlkZXIoc3RydWN0IGRjYV9wcm92aWRlciAqZGNhLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmRjYV9wcml2KHN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGVidWdmcy5oIGIvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKaW5kZXggZWI1YzJiYS4uZmMxYjkzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKQEAgLTksNyArOSw3IEBACiAgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqICBkZWJ1Z2ZzIGlzIGZvciBwZW9wbGUgdG8gdXNlIGluc3RlYWQgb2YgL3Byb2Mgb3IgL3N5cy4KLSAqICBTZWUgRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBTZWUgRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2ZpbGVzeXN0ZW1zIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAogI2lmbmRlZiBfREVCVUdGU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggYWNhMzFiZi4uMmVhM2U0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC0xMjQsNyArMTI0LDkgQEAKIAlzdHJ1Y3QgYnVzX3R5cGUJCSpidXM7CiAKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7Ci0JY29uc3QgY2hhciAJCSptb2RfbmFtZTsJLyogdXNlZCBmb3IgYnVpbHQtaW4gbW9kdWxlcyAqLworCWNvbnN0IGNoYXIJCSptb2RfbmFtZTsJLyogdXNlZCBmb3IgYnVpbHQtaW4gbW9kdWxlcyAqLworCisJYm9vbCBzdXBwcmVzc19iaW5kX2F0dHJzOwkvKiBkaXNhYmxlcyBiaW5kL3VuYmluZCB2aWEgc3lzZnMgKi8KIAogCWludCAoKnByb2JlKSAoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpyZW1vdmUpIChzdHJ1Y3QgZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaCBiL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKaW5kZXggZmZlZmJhOC4uMmI5ZjJhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCkBAIC00OCwxOSArNDgsMjAgQEAKIAogLyoqCiAgKiBlbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIC0gRE1BIHRyYW5zYWN0aW9uIHR5cGVzL2luZGV4ZXMKKyAqCisgKiBOb3RlOiBUaGUgRE1BX0FTWU5DX1RYIGNhcGFiaWxpdHkgaXMgbm90IHRvIGJlIHNldCBieSBkcml2ZXJzLiAgSXQgaXMKKyAqIGF1dG9tYXRpY2FsbHkgc2V0IGFzIGRtYSBkZXZpY2VzIGFyZSByZWdpc3RlcmVkLgogICovCiBlbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIHsKIAlETUFfTUVNQ1BZLAogCURNQV9YT1IsCi0JRE1BX1BRX1hPUiwKLQlETUFfRFVBTF9YT1IsCi0JRE1BX1BRX1VQREFURSwKLQlETUFfWkVST19TVU0sCi0JRE1BX1BRX1pFUk9fU1VNLAorCURNQV9QUSwKKwlETUFfWE9SX1ZBTCwKKwlETUFfUFFfVkFMLAogCURNQV9NRU1TRVQsCi0JRE1BX01FTUNQWV9DUkMzMkMsCiAJRE1BX0lOVEVSUlVQVCwKIAlETUFfUFJJVkFURSwKKwlETUFfQVNZTkNfVFgsCiAJRE1BX1NMQVZFLAogfTsKIApAQCAtNzAsMTggKzcxLDI1IEBACiAKIC8qKgogICogZW51bSBkbWFfY3RybF9mbGFncyAtIERNQSBmbGFncyB0byBhdWdtZW50IG9wZXJhdGlvbiBwcmVwYXJhdGlvbiwKLSAqIAljb250cm9sIGNvbXBsZXRpb24sIGFuZCBjb21tdW5pY2F0ZSBzdGF0dXMuCisgKiAgY29udHJvbCBjb21wbGV0aW9uLCBhbmQgY29tbXVuaWNhdGUgc3RhdHVzLgogICogQERNQV9QUkVQX0lOVEVSUlVQVCAtIHRyaWdnZXIgYW4gaW50ZXJydXB0IChjYWxsYmFjaykgdXBvbiBjb21wbGV0aW9uIG9mCi0gKiAJdGhpcyB0cmFuc2FjdGlvbgorICogIHRoaXMgdHJhbnNhY3Rpb24KICAqIEBETUFfQ1RSTF9BQ0sgLSB0aGUgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV1c2VkIHVudGlsIHRoZSBjbGllbnQKLSAqIAlhY2tub3dsZWRnZXMgcmVjZWlwdCwgaS5lLiBoYXMgaGFzIGEgY2hhbmNlIHRvIGVzdGFibGlzaCBhbnkKLSAqIAlkZXBlbmRlbmN5IGNoYWlucworICogIGFja25vd2xlZGdlcyByZWNlaXB0LCBpLmUuIGhhcyBoYXMgYSBjaGFuY2UgdG8gZXN0YWJsaXNoIGFueSBkZXBlbmRlbmN5CisgKiAgY2hhaW5zCiAgKiBARE1BX0NPTVBMX1NLSVBfU1JDX1VOTUFQIC0gc2V0IHRvIGRpc2FibGUgZG1hLXVubWFwcGluZyB0aGUgc291cmNlIGJ1ZmZlcihzKQogICogQERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVAgLSBzZXQgdG8gZGlzYWJsZSBkbWEtdW5tYXBwaW5nIHRoZSBkZXN0aW5hdGlvbihzKQogICogQERNQV9DT01QTF9TUkNfVU5NQVBfU0lOR0xFIC0gc2V0IHRvIGRvIHRoZSBzb3VyY2UgZG1hLXVubWFwcGluZyBhcyBzaW5nbGUKICAqIAkoaWYgbm90IHNldCwgZG8gdGhlIHNvdXJjZSBkbWEtdW5tYXBwaW5nIGFzIHBhZ2UpCiAgKiBARE1BX0NPTVBMX0RFU1RfVU5NQVBfU0lOR0xFIC0gc2V0IHRvIGRvIHRoZSBkZXN0aW5hdGlvbiBkbWEtdW5tYXBwaW5nIGFzIHNpbmdsZQogICogCShpZiBub3Qgc2V0LCBkbyB0aGUgZGVzdGluYXRpb24gZG1hLXVubWFwcGluZyBhcyBwYWdlKQorICogQERNQV9QUkVQX1BRX0RJU0FCTEVfUCAtIHByZXZlbnQgZ2VuZXJhdGlvbiBvZiBQIHdoaWxlIGdlbmVyYXRpbmcgUQorICogQERNQV9QUkVQX1BRX0RJU0FCTEVfUSAtIHByZXZlbnQgZ2VuZXJhdGlvbiBvZiBRIHdoaWxlIGdlbmVyYXRpbmcgUAorICogQERNQV9QUkVQX0NPTlRJTlVFIC0gaW5kaWNhdGUgdG8gYSBkcml2ZXIgdGhhdCBpdCBpcyByZXVzaW5nIGJ1ZmZlcnMgYXMKKyAqICBzb3VyY2VzIHRoYXQgd2VyZSB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXMgb3BlcmF0aW9uLCBpbiB0aGUgY2FzZSBvZiBhIFBRCisgKiAgb3BlcmF0aW9uIGl0IGNvbnRpbnVlcyB0aGUgY2FsY3VsYXRpb24gd2l0aCBuZXcgc291cmNlcworICogQERNQV9QUkVQX0ZFTkNFIC0gdGVsbCB0aGUgZHJpdmVyIHRoYXQgc3Vic2VxdWVudCBvcGVyYXRpb25zIGRlcGVuZAorICogIG9uIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24KICAqLwogZW51bSBkbWFfY3RybF9mbGFncyB7CiAJRE1BX1BSRVBfSU5URVJSVVBUID0gKDEgPDwgMCksCkBAIC05MCw5ICs5OCwzMiBAQAogCURNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVAgPSAoMSA8PCAzKSwKIAlETUFfQ09NUExfU1JDX1VOTUFQX1NJTkdMRSA9ICgxIDw8IDQpLAogCURNQV9DT01QTF9ERVNUX1VOTUFQX1NJTkdMRSA9ICgxIDw8IDUpLAorCURNQV9QUkVQX1BRX0RJU0FCTEVfUCA9ICgxIDw8IDYpLAorCURNQV9QUkVQX1BRX0RJU0FCTEVfUSA9ICgxIDw8IDcpLAorCURNQV9QUkVQX0NPTlRJTlVFID0gKDEgPDwgOCksCisJRE1BX1BSRVBfRkVOQ0UgPSAoMSA8PCA5KSwKIH07CiAKIC8qKgorICogZW51bSBzdW1fY2hlY2tfYml0cyAtIGJpdCBwb3NpdGlvbiBvZiBwcV9jaGVja19mbGFncworICovCitlbnVtIHN1bV9jaGVja19iaXRzIHsKKwlTVU1fQ0hFQ0tfUCA9IDAsCisJU1VNX0NIRUNLX1EgPSAxLAorfTsKKworLyoqCisgKiBlbnVtIHBxX2NoZWNrX2ZsYWdzIC0gcmVzdWx0IG9mIGFzeW5jX3t4b3IscHF9X3plcm9fc3VtIG9wZXJhdGlvbnMKKyAqIEBTVU1fQ0hFQ0tfUF9SRVNVTFQgLSAxIGlmIHhvciB6ZXJvIHN1bSBlcnJvciwgMCBvdGhlcndpc2UKKyAqIEBTVU1fQ0hFQ0tfUV9SRVNVTFQgLSAxIGlmIHJlZWQtc29sb21vbiB6ZXJvIHN1bSBlcnJvciwgMCBvdGhlcndpc2UKKyAqLworZW51bSBzdW1fY2hlY2tfZmxhZ3MgeworCVNVTV9DSEVDS19QX1JFU1VMVCA9ICgxIDw8IFNVTV9DSEVDS19QKSwKKwlTVU1fQ0hFQ0tfUV9SRVNVTFQgPSAoMSA8PCBTVU1fQ0hFQ0tfUSksCit9OworCisKKy8qKgogICogZG1hX2NhcF9tYXNrX3QgLSBjYXBhYmlsaXRpZXMgYml0bWFwIG1vZGVsZWQgYWZ0ZXIgY3B1bWFza190LgogICogU2VlIGxpbnV4L2NwdW1hc2suaAogICovCkBAIC0xODAsOCArMjExLDYgQEAKICAqIEBmbGFnczogZmxhZ3MgdG8gYXVnbWVudCBvcGVyYXRpb24gcHJlcGFyYXRpb24sIGNvbnRyb2wgY29tcGxldGlvbiwgYW5kCiAgKiAJY29tbXVuaWNhdGUgc3RhdHVzCiAgKiBAcGh5czogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcgotICogQHR4X2xpc3Q6IGRyaXZlciBjb21tb24gZmllbGQgZm9yIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIG11bHRpcGxlCi0gKglkZXNjcmlwdG9ycwogICogQGNoYW46IHRhcmdldCBjaGFubmVsIGZvciB0aGlzIG9wZXJhdGlvbgogICogQHR4X3N1Ym1pdDogc2V0IHRoZSBwcmVwYXJlZCBkZXNjcmlwdG9yKHMpIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBlbmdpbmUKICAqIEBjYWxsYmFjazogcm91dGluZSB0byBjYWxsIGFmdGVyIHRoaXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlCkBAIC0xOTUsNyArMjI0LDYgQEAKIAlkbWFfY29va2llX3QgY29va2llOwogCWVudW0gZG1hX2N0cmxfZmxhZ3MgZmxhZ3M7IC8qIG5vdCBhICdsb25nJyB0byBwYWNrIHdpdGggY29va2llICovCiAJZG1hX2FkZHJfdCBwaHlzOwotCXN0cnVjdCBsaXN0X2hlYWQgdHhfbGlzdDsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CiAJZG1hX2Nvb2tpZV90ICgqdHhfc3VibWl0KShzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KTsKIAlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7CkBAIC0yMTMsNiArMjQxLDExIEBACiAgKiBAZ2xvYmFsX25vZGU6IGxpc3RfaGVhZCBmb3IgZ2xvYmFsIGRtYV9kZXZpY2VfbGlzdAogICogQGNhcF9tYXNrOiBvbmUgb3IgbW9yZSBkbWFfY2FwYWJpbGl0eSBmbGFncwogICogQG1heF94b3I6IG1heGltdW0gbnVtYmVyIG9mIHhvciBzb3VyY2VzLCAwIGlmIG5vIGNhcGFiaWxpdHkKKyAqIEBtYXhfcHE6IG1heGltdW0gbnVtYmVyIG9mIFBRIHNvdXJjZXMgYW5kIFBRLWNvbnRpbnVlIGNhcGFiaWxpdHkKKyAqIEBjb3B5X2FsaWduOiBhbGlnbm1lbnQgc2hpZnQgZm9yIG1lbWNweSBvcGVyYXRpb25zCisgKiBAeG9yX2FsaWduOiBhbGlnbm1lbnQgc2hpZnQgZm9yIHhvciBvcGVyYXRpb25zCisgKiBAcHFfYWxpZ246IGFsaWdubWVudCBzaGlmdCBmb3IgcHEgb3BlcmF0aW9ucworICogQGZpbGxfYWxpZ246IGFsaWdubWVudCBzaGlmdCBmb3IgbWVtc2V0IG9wZXJhdGlvbnMKICAqIEBkZXZfaWQ6IHVuaXF1ZSBkZXZpY2UgSUQKICAqIEBkZXY6IHN0cnVjdCBkZXZpY2UgcmVmZXJlbmNlIGZvciBkbWEgbWFwcGluZyBhcGkKICAqIEBkZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXM6IGFsbG9jYXRlIHJlc291cmNlcyBhbmQgcmV0dXJuIHRoZQpAQCAtMjIwLDcgKzI1Myw5IEBACiAgKiBAZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXM6IHJlbGVhc2UgRE1BIGNoYW5uZWwncyByZXNvdXJjZXMKICAqIEBkZXZpY2VfcHJlcF9kbWFfbWVtY3B5OiBwcmVwYXJlcyBhIG1lbWNweSBvcGVyYXRpb24KICAqIEBkZXZpY2VfcHJlcF9kbWFfeG9yOiBwcmVwYXJlcyBhIHhvciBvcGVyYXRpb24KLSAqIEBkZXZpY2VfcHJlcF9kbWFfemVyb19zdW06IHByZXBhcmVzIGEgemVyb19zdW0gb3BlcmF0aW9uCisgKiBAZGV2aWNlX3ByZXBfZG1hX3hvcl92YWw6IHByZXBhcmVzIGEgeG9yIHZhbGlkYXRpb24gb3BlcmF0aW9uCisgKiBAZGV2aWNlX3ByZXBfZG1hX3BxOiBwcmVwYXJlcyBhIHBxIG9wZXJhdGlvbgorICogQGRldmljZV9wcmVwX2RtYV9wcV92YWw6IHByZXBhcmVzIGEgcHF6ZXJvX3N1bSBvcGVyYXRpb24KICAqIEBkZXZpY2VfcHJlcF9kbWFfbWVtc2V0OiBwcmVwYXJlcyBhIG1lbXNldCBvcGVyYXRpb24KICAqIEBkZXZpY2VfcHJlcF9kbWFfaW50ZXJydXB0OiBwcmVwYXJlcyBhbiBlbmQgb2YgY2hhaW4gaW50ZXJydXB0IG9wZXJhdGlvbgogICogQGRldmljZV9wcmVwX3NsYXZlX3NnOiBwcmVwYXJlcyBhIHNsYXZlIGRtYSBvcGVyYXRpb24KQEAgLTIzNSw3ICsyNzAsMTMgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNoYW5uZWxzOwogCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsX25vZGU7CiAJZG1hX2NhcF9tYXNrX3QgIGNhcF9tYXNrOwotCWludCBtYXhfeG9yOworCXVuc2lnbmVkIHNob3J0IG1heF94b3I7CisJdW5zaWduZWQgc2hvcnQgbWF4X3BxOworCXU4IGNvcHlfYWxpZ247CisJdTggeG9yX2FsaWduOworCXU4IHBxX2FsaWduOworCXU4IGZpbGxfYWxpZ247CisJI2RlZmluZSBETUFfSEFTX1BRX0NPTlRJTlVFICgxIDw8IDE1KQogCiAJaW50IGRldl9pZDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CkBAIC0yNDksOSArMjkwLDE3IEBACiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICooKmRldmljZV9wcmVwX2RtYV94b3IpKAogCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZGVzdCwgZG1hX2FkZHJfdCAqc3JjLAogCQl1bnNpZ25lZCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICooKmRldmljZV9wcmVwX2RtYV96ZXJvX3N1bSkoCisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICooKmRldmljZV9wcmVwX2RtYV94b3JfdmFsKSgKIAkJc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90ICpzcmMsCXVuc2lnbmVkIGludCBzcmNfY250LAotCQlzaXplX3QgbGVuLCB1MzIgKnJlc3VsdCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCXNpemVfdCBsZW4sIGVudW0gc3VtX2NoZWNrX2ZsYWdzICpyZXN1bHQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKCpkZXZpY2VfcHJlcF9kbWFfcHEpKAorCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgKmRzdCwgZG1hX2FkZHJfdCAqc3JjLAorCQl1bnNpZ25lZCBpbnQgc3JjX2NudCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2NmLAorCQlzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKigqZGV2aWNlX3ByZXBfZG1hX3BxX3ZhbCkoCisJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCAqcHEsIGRtYV9hZGRyX3QgKnNyYywKKwkJdW5zaWduZWQgaW50IHNyY19jbnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNjZiwgc2l6ZV90IGxlbiwKKwkJZW51bSBzdW1fY2hlY2tfZmxhZ3MgKnBxcmVzLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKigqZGV2aWNlX3ByZXBfZG1hX21lbXNldCkoCiAJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkZXN0LCBpbnQgdmFsdWUsIHNpemVfdCBsZW4sCiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOwpAQCAtMjcwLDYgKzMxOSw5NiBAQAogCXZvaWQgKCpkZXZpY2VfaXNzdWVfcGVuZGluZykoc3RydWN0IGRtYV9jaGFuICpjaGFuKTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBkbWFlbmdpbmVfY2hlY2tfYWxpZ24odTggYWxpZ24sIHNpemVfdCBvZmYxLCBzaXplX3Qgb2ZmMiwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgbWFzazsKKworCWlmICghYWxpZ24pCisJCXJldHVybiB0cnVlOworCW1hc2sgPSAoMSA8PCBhbGlnbikgLSAxOworCWlmIChtYXNrICYgKG9mZjEgfCBvZmYyIHwgbGVuKSkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZG1hX2NvcHlfYWxpZ25lZChzdHJ1Y3QgZG1hX2RldmljZSAqZGV2LCBzaXplX3Qgb2ZmMSwKKwkJCQkgICAgICAgc2l6ZV90IG9mZjIsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGRtYWVuZ2luZV9jaGVja19hbGlnbihkZXYtPmNvcHlfYWxpZ24sIG9mZjEsIG9mZjIsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19kbWFfeG9yX2FsaWduZWQoc3RydWN0IGRtYV9kZXZpY2UgKmRldiwgc2l6ZV90IG9mZjEsCisJCQkJICAgICAgc2l6ZV90IG9mZjIsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGRtYWVuZ2luZV9jaGVja19hbGlnbihkZXYtPnhvcl9hbGlnbiwgb2ZmMSwgb2ZmMiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2RtYV9wcV9hbGlnbmVkKHN0cnVjdCBkbWFfZGV2aWNlICpkZXYsIHNpemVfdCBvZmYxLAorCQkJCSAgICAgc2l6ZV90IG9mZjIsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGRtYWVuZ2luZV9jaGVja19hbGlnbihkZXYtPnBxX2FsaWduLCBvZmYxLCBvZmYyLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZG1hX2ZpbGxfYWxpZ25lZChzdHJ1Y3QgZG1hX2RldmljZSAqZGV2LCBzaXplX3Qgb2ZmMSwKKwkJCQkgICAgICAgc2l6ZV90IG9mZjIsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGRtYWVuZ2luZV9jaGVja19hbGlnbihkZXYtPmZpbGxfYWxpZ24sIG9mZjEsIG9mZjIsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3NldF9tYXhwcShzdHJ1Y3QgZG1hX2RldmljZSAqZG1hLCBpbnQgbWF4cHEsIGludCBoYXNfcHFfY29udGludWUpCit7CisJZG1hLT5tYXhfcHEgPSBtYXhwcTsKKwlpZiAoaGFzX3BxX2NvbnRpbnVlKQorCQlkbWEtPm1heF9wcSB8PSBETUFfSEFTX1BRX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZG1hZl9jb250aW51ZShlbnVtIGRtYV9jdHJsX2ZsYWdzIGZsYWdzKQoreworCXJldHVybiAoZmxhZ3MgJiBETUFfUFJFUF9DT05USU5VRSkgPT0gRE1BX1BSRVBfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBkbWFmX3BfZGlzYWJsZWRfY29udGludWUoZW51bSBkbWFfY3RybF9mbGFncyBmbGFncykKK3sKKwllbnVtIGRtYV9jdHJsX2ZsYWdzIG1hc2sgPSBETUFfUFJFUF9DT05USU5VRSB8IERNQV9QUkVQX1BRX0RJU0FCTEVfUDsKKworCXJldHVybiAoZmxhZ3MgJiBtYXNrKSA9PSBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZG1hX2Rldl9oYXNfcHFfY29udGludWUoc3RydWN0IGRtYV9kZXZpY2UgKmRtYSkKK3sKKwlyZXR1cm4gKGRtYS0+bWF4X3BxICYgRE1BX0hBU19QUV9DT05USU5VRSkgPT0gRE1BX0hBU19QUV9DT05USU5VRTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGRtYV9kZXZfdG9fbWF4cHEoc3RydWN0IGRtYV9kZXZpY2UgKmRtYSkKK3sKKwlyZXR1cm4gZG1hLT5tYXhfcHEgJiB+RE1BX0hBU19QUV9DT05USU5VRTsKK30KKworLyogZG1hX21heHBxIC0gcmVkdWNlIG1heHBxIGluIHRoZSBmYWNlIG9mIGNvbnRpbnVlZCBvcGVyYXRpb25zCisgKiBAZG1hIC0gZG1hIGRldmljZSB3aXRoIFBRIGNhcGFiaWxpdHkKKyAqIEBmbGFncyAtIHRvIGNoZWNrIGlmIERNQV9QUkVQX0NPTlRJTlVFIGFuZCBETUFfUFJFUF9QUV9ESVNBQkxFX1AgYXJlIHNldAorICoKKyAqIFdoZW4gYW4gZW5naW5lIGRvZXMgbm90IHN1cHBvcnQgbmF0aXZlIGNvbnRpbnVhdGlvbiB3ZSBuZWVkIDMgZXh0cmEKKyAqIHNvdXJjZSBzbG90cyB0byByZXVzZSBQIGFuZCBRIHdpdGggdGhlIGZvbGxvd2luZyBjb2VmZmljaWVudHM6CisgKiAxLyB7MDB9ICogUCA6IHJlbW92ZSBQIGZyb20gUScsIGJ1dCB1c2UgaXQgYXMgYSBzb3VyY2UgZm9yIFAnCisgKiAyLyB7MDF9ICogUSA6IHVzZSBRIHRvIGNvbnRpbnVlIFEnIGNhbGN1bGF0aW9uCisgKiAzLyB7MDB9ICogUSA6IHN1YnRyYWN0IFEgZnJvbSBQJyB0byBjYW5jZWwgKDIpCisgKgorICogSW4gdGhlIGNhc2Ugd2hlcmUgUCBpcyBkaXNhYmxlZCB3ZSBvbmx5IG5lZWQgMSBleHRyYSBzb3VyY2U6CisgKiAxLyB7MDF9ICogUSA6IHVzZSBRIHRvIGNvbnRpbnVlIFEnIGNhbGN1bGF0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXhwcShzdHJ1Y3QgZG1hX2RldmljZSAqZG1hLCBlbnVtIGRtYV9jdHJsX2ZsYWdzIGZsYWdzKQoreworCWlmIChkbWFfZGV2X2hhc19wcV9jb250aW51ZShkbWEpIHx8ICFkbWFmX2NvbnRpbnVlKGZsYWdzKSkKKwkJcmV0dXJuIGRtYV9kZXZfdG9fbWF4cHEoZG1hKTsKKwllbHNlIGlmIChkbWFmX3BfZGlzYWJsZWRfY29udGludWUoZmxhZ3MpKQorCQlyZXR1cm4gZG1hX2Rldl90b19tYXhwcShkbWEpIC0gMTsKKwllbHNlIGlmIChkbWFmX2NvbnRpbnVlKGZsYWdzKSkKKwkJcmV0dXJuIGRtYV9kZXZfdG9fbWF4cHEoZG1hKSAtIDM7CisJQlVHKCk7Cit9CisKIC8qIC0tLSBwdWJsaWMgRE1BIGVuZ2luZSBBUEkgLS0tICovCiAKICNpZmRlZiBDT05GSUdfRE1BX0VOR0lORQpAQCAtMjk5LDcgKzQzOCwxMSBAQAogI2lmZGVmIENPTkZJR19BU1lOQ19UWF9ETUEKICNkZWZpbmUgYXN5bmNfZG1hZW5naW5lX2dldCgpCWRtYWVuZ2luZV9nZXQoKQogI2RlZmluZSBhc3luY19kbWFlbmdpbmVfcHV0KCkJZG1hZW5naW5lX3B1dCgpCisjaWZkZWYgQ09ORklHX0FTWU5DX1RYX0RJU0FCTEVfQ0hBTk5FTF9TV0lUQ0gKKyNkZWZpbmUgYXN5bmNfZG1hX2ZpbmRfY2hhbm5lbCh0eXBlKSBkbWFfZmluZF9jaGFubmVsKERNQV9BU1lOQ19UWCkKKyNlbHNlCiAjZGVmaW5lIGFzeW5jX2RtYV9maW5kX2NoYW5uZWwodHlwZSkgZG1hX2ZpbmRfY2hhbm5lbCh0eXBlKQorI2VuZGlmIC8qIENPTkZJR19BU1lOQ19UWF9ESVNBQkxFX0NIQU5ORUxfU1dJVENIICovCiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGFzeW5jX2RtYWVuZ2luZV9nZXQodm9pZCkKIHsKQEAgLTMxMiw3ICs0NTUsNyBAQAogewogCXJldHVybiBOVUxMOwogfQotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0FTWU5DX1RYX0RNQSAqLwogCiBkbWFfY29va2llX3QgZG1hX2FzeW5jX21lbWNweV9idWZfdG9fYnVmKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKIAl2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGYuaCBiL2luY2x1ZGUvbGludXgvZWxmLmgKaW5kZXggNDVhOTM3Yi4uOTBhNGVkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZi5oCkBAIC0zNjEsNiArMzYxLDcgQEAKICNkZWZpbmUgTlRfUFBDX1ZTWAkweDEwMgkJLyogUG93ZXJQQyBWU1ggcmVnaXN0ZXJzICovCiAjZGVmaW5lIE5UXzM4Nl9UTFMJMHgyMDAJCS8qIGkzODYgVExTIHNsb3RzIChzdHJ1Y3QgdXNlcl9kZXNjKSAqLwogI2RlZmluZSBOVF8zODZfSU9QRVJNCTB4MjAxCQkvKiB4ODYgaW8gcGVybWlzc2lvbiBiaXRtYXAgKDE9ZGVueSkgKi8KKyNkZWZpbmUgTlRfUFJYU1RBVFVTCTB4MzAwCQkvKiBzMzkwIHVwcGVyIHJlZ2lzdGVyIGhhbHZlcyAqLwogCiAKIC8qIE5vdGUgaGVhZGVyIGluIGEgUFRfTk9URSBzZWN0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKaW5kZXggZjg0N2RmOS4uYTM0YmRmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmIuaApAQCAtMTMzLDYgKzEzMyw3IEBACiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjIzMCA5NgkvKiBOZW9NYWdpYyBOTTIyMzAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjM2MCA5NwkvKiBOZW9NYWdpYyBOTTIzNjAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjM4MCA5OAkvKiBOZW9NYWdpYyBOTTIzODAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1BYQTNYWAkJIDk5CS8qIFBYQTN4eAkJCSovCiAKICNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFNCAgICAgICAgMHg4MAkvKiBTMyBTYXZhZ2U0ICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRTNEICAgICAgIDB4ODEJLyogUzMgU2F2YWdlM0QgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDUxODAzNTIuLjI2MjBhOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTMwMCw2ICszMDAsMTAgQEAKICNkZWZpbmUgQkxLVFJBQ0VTVE9QIF9JTygweDEyLDExNykKICNkZWZpbmUgQkxLVFJBQ0VURUFSRE9XTiBfSU8oMHgxMiwxMTgpCiAjZGVmaW5lIEJMS0RJU0NBUkQgX0lPKDB4MTIsMTE5KQorI2RlZmluZSBCTEtJT01JTiBfSU8oMHgxMiwxMjApCisjZGVmaW5lIEJMS0lPT1BUIF9JTygweDEyLDEyMSkKKyNkZWZpbmUgQkxLQUxJR05PRkYgX0lPKDB4MTIsMTIyKQorI2RlZmluZSBCTEtQQlNaR0VUIF9JTygweDEyLDEyMykKIAogI2RlZmluZSBCTUFQX0lPQ1RMIDEJCS8qIG9ic29sZXRlIC0ga2VwdCBmb3IgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBGSUJNQVAJICAgX0lPKDB4MDAsMSkJLyogYm1hcCBhY2Nlc3MgKi8KQEAgLTU5NSw2ICs1OTksNyBAQAogCWludCAoKmxhdW5kZXJfcGFnZSkgKHN0cnVjdCBwYWdlICopOwogCWludCAoKmlzX3BhcnRpYWxseV91cHRvZGF0ZSkgKHN0cnVjdCBwYWdlICosIHJlYWRfZGVzY3JpcHRvcl90ICosCiAJCQkJCXVuc2lnbmVkIGxvbmcpOworCWludCAoKmVycm9yX3JlbW92ZV9wYWdlKShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKIH07CiAKIC8qCkBAIC02NDAsNyArNjQ1LDYgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgliZF9zdXBlcjsKIAlpbnQJCQliZF9vcGVuZXJzOwogCXN0cnVjdCBtdXRleAkJYmRfbXV0ZXg7CS8qIG9wZW4vY2xvc2UgbXV0ZXggKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCWJkX21vdW50X3NlbTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWJkX2lub2RlczsKIAl2b2lkICoJCQliZF9ob2xkZXI7CiAJaW50CQkJYmRfaG9sZGVyczsKQEAgLTEzMTUsNyArMTMxOSw3IEBACiAJdW5zaWduZWQgbG9uZwkJc19ibG9ja3NpemU7CiAJdW5zaWduZWQgY2hhcgkJc19ibG9ja3NpemVfYml0czsKIAl1bnNpZ25lZCBjaGFyCQlzX2RpcnQ7Ci0JdW5zaWduZWQgbG9uZyBsb25nCXNfbWF4Ynl0ZXM7CS8qIE1heCBmaWxlIHNpemUgKi8KKwlsb2ZmX3QJCQlzX21heGJ5dGVzOwkvKiBNYXggZmlsZSBzaXplICovCiAJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUJKnNfdHlwZTsKIAljb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucwkqc19vcDsKIAljb25zdCBzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucwkqZHFfb3A7CkBAIC0yMTU2LDYgKzIxNjAsNyBAQAogZXh0ZXJuIGludCBpbm9kZV9uZWVkc19zeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIHZvaWQgZ2VuZXJpY19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gdm9pZCBnZW5lcmljX2Ryb3BfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gaW50IGdlbmVyaWNfZGV0YWNoX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiBleHRlcm4gc3RydWN0IGlub2RlICppbG9va3VwNV9ub3dhaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJdW5zaWduZWQgbG9uZyBoYXNodmFsLCBpbnQgKCp0ZXN0KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKSwKQEAgLTIzMzQsNiArMjMzOSw3IEBACiBleHRlcm4gdm9pZCBwdXRfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnMpOwogZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpnZXRfZnNfdHlwZShjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zdXBlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOworZXh0ZXJuIHN0cnVjdCBzdXBlcl9ibG9jayAqZ2V0X2FjdGl2ZV9zdXBlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKIGV4dGVybiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnVzZXJfZ2V0X3N1cGVyKGRldl90KTsKIGV4dGVybiB2b2lkIGRyb3Bfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKQEAgLTIzODEsNyArMjM4Nyw4IEBACiAjZGVmaW5lIGJ1ZmZlcl9taWdyYXRlX3BhZ2UgTlVMTAogI2VuZGlmCiAKLWV4dGVybiBpbnQgaW5vZGVfY2hhbmdlX29rKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaWF0dHIgKik7CitleHRlcm4gaW50IGlub2RlX2NoYW5nZV9vayhjb25zdCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlhdHRyICopOworZXh0ZXJuIGludCBpbm9kZV9uZXdzaXplX29rKGNvbnN0IHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3Qgb2Zmc2V0KTsKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGlub2RlX3NldGF0dHIoc3RydWN0IGlub2RlICosIHN0cnVjdCBpYXR0ciAqKTsKIAogZXh0ZXJuIHZvaWQgZmlsZV91cGRhdGVfdGltZShzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0yNDQzLDcgKzI0NTAsNyBAQAogCV9fc2ltcGxlX2F0dHJfY2hlY2tfZm9ybWF0KF9fZm10LCAwdWxsKTsJCQlcCiAJcmV0dXJuIHNpbXBsZV9hdHRyX29wZW4oaW5vZGUsIGZpbGUsIF9fZ2V0LCBfX3NldCwgX19mbXQpOwlcCiB9CQkJCQkJCQkJXAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgX19mb3BzID0gewkJCQlcCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBfX2ZvcHMgPSB7CQkJCVwKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCQkJCQkJXAogCS5vcGVuCSA9IF9fZm9wcyAjIyBfb3BlbiwJCQkJCVwKIAkucmVsZWFzZSA9IHNpbXBsZV9hdHRyX3JlbGVhc2UsCQkJCQlcCkBAIC0yNDY3LDcgKzI0NzQsNyBAQAogCQkJICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpOwogCiBzdHJ1Y3QgY3RsX3RhYmxlOwotaW50IHByb2NfbnJfZmlsZXMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19ucl9maWxlcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKIAogaW50IF9faW5pdCBnZXRfZmlsZXN5c3RlbV9saXN0KGNoYXIgKmJ1Zik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9mdHJhY2UuaAppbmRleCAzYzA5MjRhLi4wYjRmOTdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKQEAgLTE5LDcgKzE5LDcgQEAKIGV4dGVybiBpbnQgZnRyYWNlX2VuYWJsZWQ7CiBleHRlcm4gaW50CiBmdHJhY2VfZW5hYmxlX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkgICAgIHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQkgICAgIGxvZmZfdCAqcHBvcyk7CiAKIHR5cGVkZWYgdm9pZCAoKmZ0cmFjZV9mdW5jX3QpKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGxvbmcgcGFyZW50X2lwKTsKQEAgLTk0LDcgKzk0LDcgQEAKIGV4dGVybiBpbnQgc3RhY2tfdHJhY2VyX2VuYWJsZWQ7CiBpbnQKIHN0YWNrX3RyYWNlX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCiAJCSAgIGxvZmZfdCAqcHBvcyk7CiAjZW5kaWYKIApAQCAtMjQxLDcgKzI0MSw3IEBACiAjIGRlZmluZSBmdHJhY2Vfc2V0X2ZpbHRlcihidWYsIGxlbiwgcmVzZXQpCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGZ0cmFjZV9kaXNhYmxlX2RhZW1vbigpCQlkbyB7IH0gd2hpbGUgKDApCiAjIGRlZmluZSBmdHJhY2VfZW5hYmxlX2RhZW1vbigpCQkJZG8geyB9IHdoaWxlICgwKQotc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9yZWxlYXNlKHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9yZWxlYXNlX21vZChzdHJ1Y3QgbW9kdWxlICptb2QpIHt9CiBzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9mdHJhY2VfY29tbWFuZChzdHJ1Y3QgZnRyYWNlX2Z1bmNfY29tbWFuZCAqY21kKQogewogCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdXRleC5oIGIvaW5jbHVkZS9saW51eC9mdXRleC5oCmluZGV4IDM0OTU2YzguLjFlNWEyNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnV0ZXguaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKQEAgLTQsMTEgKzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotc3RydWN0IGlub2RlOwotc3RydWN0IG1tX3N0cnVjdDsKLXN0cnVjdCB0YXNrX3N0cnVjdDsKLXVuaW9uIGt0aW1lOwotCiAvKiBTZWNvbmQgYXJndW1lbnQgdG8gZnV0ZXggc3lzY2FsbCAqLwogCiAKQEAgLTM4LDggKzMzLDggQEAKICNkZWZpbmUgRlVURVhfTE9DS19QSV9QUklWQVRFCShGVVRFWF9MT0NLX1BJIHwgRlVURVhfUFJJVkFURV9GTEFHKQogI2RlZmluZSBGVVRFWF9VTkxPQ0tfUElfUFJJVkFURQkoRlVURVhfVU5MT0NLX1BJIHwgRlVURVhfUFJJVkFURV9GTEFHKQogI2RlZmluZSBGVVRFWF9UUllMT0NLX1BJX1BSSVZBVEUgKEZVVEVYX1RSWUxPQ0tfUEkgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCi0jZGVmaW5lIEZVVEVYX1dBSVRfQklUU0VUX1BSSVZBVEUJKEZVVEVYX1dBSVRfQklUUyB8IEZVVEVYX1BSSVZBVEVfRkxBRykKLSNkZWZpbmUgRlVURVhfV0FLRV9CSVRTRVRfUFJJVkFURQkoRlVURVhfV0FLRV9CSVRTIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9XQUlUX0JJVFNFVF9QUklWQVRFCShGVVRFWF9XQUlUX0JJVFNFVCB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfV0FLRV9CSVRTRVRfUFJJVkFURQkoRlVURVhfV0FLRV9CSVRTRVQgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCiAjZGVmaW5lIEZVVEVYX1dBSVRfUkVRVUVVRV9QSV9QUklWQVRFCShGVVRFWF9XQUlUX1JFUVVFVUVfUEkgfCBcCiAJCQkJCSBGVVRFWF9QUklWQVRFX0ZMQUcpCiAjZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFX1BJX1BSSVZBVEUJKEZVVEVYX0NNUF9SRVFVRVVFX1BJIHwgXApAQCAtMTI5LDYgKzEyNCwxMSBAQAogI2RlZmluZSBGVVRFWF9CSVRTRVRfTUFUQ0hfQU5ZCTB4ZmZmZmZmZmYKIAogI2lmZGVmIF9fS0VSTkVMX18KK3N0cnVjdCBpbm9kZTsKK3N0cnVjdCBtbV9zdHJ1Y3Q7CitzdHJ1Y3QgdGFza19zdHJ1Y3Q7Cit1bmlvbiBrdGltZTsKKwogbG9uZyBkb19mdXRleCh1MzIgX191c2VyICp1YWRkciwgaW50IG9wLCB1MzIgdmFsLCB1bmlvbiBrdGltZSAqdGltZW91dCwKIAkgICAgICB1MzIgX191c2VyICp1YWRkcjIsIHUzMiB2YWwyLCB1MzIgdmFsMyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKaW5kZXggMTc2ZTdlZS4uNDFhNTlhZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCkBAIC0zLDE1ICszLDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCitzdHJ1Y3QgY3RsX3RhYmxlOworc3RydWN0IHVzZXJfc3RydWN0OworCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogCiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2htLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKLXN0cnVjdCBjdGxfdGFibGU7Ci1zdHJ1Y3QgdXNlcl9zdHJ1Y3Q7Ci0KIGludCBQYWdlSHVnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX3ZtX2h1Z2V0bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKQEAgLTIwLDkgKzIwLDkgQEAKIH0KIAogdm9pZCByZXNldF92bWFfcmVzdl9odWdlX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLWludCBodWdldGxiX3N5c2N0bF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwotaW50IGh1Z2V0bGJfb3ZlcmNvbW1pdF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwotaW50IGh1Z2V0bGJfdHJlYXRfbW92YWJsZV9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworaW50IGh1Z2V0bGJfc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitpbnQgaHVnZXRsYl9vdmVyY29tbWl0X2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitpbnQgaHVnZXRsYl90cmVhdF9tb3ZhYmxlX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiBpbnQgY29weV9odWdldGxiX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqLCBzdHJ1Y3QgbW1fc3RydWN0ICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIGludCBmb2xsb3dfaHVnZXRsYl9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosCiAJCQlzdHJ1Y3QgcGFnZSAqKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqLApAQCAtMTYzLDcgKzE2Myw3IEBACiB9CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh1Z2V0bGJmc19maWxlX29wZXJhdGlvbnM7Ci1leHRlcm4gc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGh1Z2V0bGJfdm1fb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBodWdldGxiX3ZtX29wczsKIHN0cnVjdCBmaWxlICpodWdldGxiX2ZpbGVfc2V0dXAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsIGludCBhY2N0LAogCQkJCXN0cnVjdCB1c2VyX3N0cnVjdCAqKnVzZXIsIGludCBjcmVhdF9mbGFncyk7CiBpbnQgaHVnZXRsYl9nZXRfcXVvdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvbmcgZGVsdGEpOwpAQCAtMTg3LDcgKzE4NywxMSBAQAogCiAjZGVmaW5lIGlzX2ZpbGVfaHVnZXBhZ2VzKGZpbGUpCQkJMAogI2RlZmluZSBzZXRfZmlsZV9odWdlcGFnZXMoZmlsZSkJCUJVRygpCi0jZGVmaW5lIGh1Z2V0bGJfZmlsZV9zZXR1cChuYW1lLHNpemUsYWNjdCx1c2VyLGNyZWF0KQlFUlJfUFRSKC1FTk9TWVMpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmaWxlICpodWdldGxiX2ZpbGVfc2V0dXAoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsCisJCWludCBhY2N0ZmxhZywgc3RydWN0IHVzZXJfc3RydWN0ICoqdXNlciwgaW50IGNyZWF0X2ZsYWdzKQoreworCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworfQogCiAjZW5kaWYgLyogIUNPTkZJR19IVUdFVExCRlMgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvYWRwNTU4OC5oIGIvaW5jbHVkZS9saW51eC9pMmMvYWRwNTU4OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNWRiODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy9hZHA1NTg4LmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIEFuYWxvZyBEZXZpY2VzIEFEUDU1ODggSS9PIEV4cGFuZGVyIGFuZCBRV0VSVFkgS2V5cGFkIENvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX0FEUDU1ODhfSAorI2RlZmluZSBfQURQNTU4OF9ICisKKyNkZWZpbmUgREVWX0lEIDB4MDAJCS8qIERldmljZSBJRCAqLworI2RlZmluZSBDRkcgMHgwMQkJLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlcjEgKi8KKyNkZWZpbmUgSU5UX1NUQVQgMHgwMgkJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBLRVlfTENLX0VDX1NUQVQgMHgwMwkvKiBLZXkgTG9jayBhbmQgRXZlbnQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBLZXlfRVZFTlRBIDB4MDQJCS8qIEtleSBFdmVudCBSZWdpc3RlciBBICovCisjZGVmaW5lIEtleV9FVkVOVEIgMHgwNQkJLyogS2V5IEV2ZW50IFJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgS2V5X0VWRU5UQyAweDA2CQkvKiBLZXkgRXZlbnQgUmVnaXN0ZXIgQyAqLworI2RlZmluZSBLZXlfRVZFTlREIDB4MDcJCS8qIEtleSBFdmVudCBSZWdpc3RlciBEICovCisjZGVmaW5lIEtleV9FVkVOVEUgMHgwOAkJLyogS2V5IEV2ZW50IFJlZ2lzdGVyIEUgKi8KKyNkZWZpbmUgS2V5X0VWRU5URiAweDA5CQkvKiBLZXkgRXZlbnQgUmVnaXN0ZXIgRiAqLworI2RlZmluZSBLZXlfRVZFTlRHIDB4MEEJCS8qIEtleSBFdmVudCBSZWdpc3RlciBHICovCisjZGVmaW5lIEtleV9FVkVOVEggMHgwQgkJLyogS2V5IEV2ZW50IFJlZ2lzdGVyIEggKi8KKyNkZWZpbmUgS2V5X0VWRU5USSAweDBDCQkvKiBLZXkgRXZlbnQgUmVnaXN0ZXIgSSAqLworI2RlZmluZSBLZXlfRVZFTlRKIDB4MEQJCS8qIEtleSBFdmVudCBSZWdpc3RlciBKICovCisjZGVmaW5lIEtQX0xDS19UTVIgMHgwRQkJLyogS2V5cGFkIExvY2sxIHRvIExvY2syIFRpbWVyICovCisjZGVmaW5lIFVOTE9DSzEgMHgwRgkJLyogVW5sb2NrIEtleTEgKi8KKyNkZWZpbmUgVU5MT0NLMiAweDEwCQkvKiBVbmxvY2sgS2V5MiAqLworI2RlZmluZSBHUElPX0lOVF9TVEFUMSAweDExCS8qIEdQSU8gSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBHUElPX0lOVF9TVEFUMiAweDEyCS8qIEdQSU8gSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBHUElPX0lOVF9TVEFUMyAweDEzCS8qIEdQSU8gSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBHUElPX0RBVF9TVEFUMSAweDE0CS8qIEdQSU8gRGF0YSBTdGF0dXMsIFJlYWQgdHdpY2UgdG8gY2xlYXIgKi8KKyNkZWZpbmUgR1BJT19EQVRfU1RBVDIgMHgxNQkvKiBHUElPIERhdGEgU3RhdHVzLCBSZWFkIHR3aWNlIHRvIGNsZWFyICovCisjZGVmaW5lIEdQSU9fREFUX1NUQVQzIDB4MTYJLyogR1BJTyBEYXRhIFN0YXR1cywgUmVhZCB0d2ljZSB0byBjbGVhciAqLworI2RlZmluZSBHUElPX0RBVF9PVVQxIDB4MTcJLyogR1BJTyBEQVRBIE9VVCAqLworI2RlZmluZSBHUElPX0RBVF9PVVQyIDB4MTgJLyogR1BJTyBEQVRBIE9VVCAqLworI2RlZmluZSBHUElPX0RBVF9PVVQzIDB4MTkJLyogR1BJTyBEQVRBIE9VVCAqLworI2RlZmluZSBHUElPX0lOVF9FTjEgMHgxQQkvKiBHUElPIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgR1BJT19JTlRfRU4yIDB4MUIJLyogR1BJTyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIEdQSU9fSU5UX0VOMyAweDFDCS8qIEdQSU8gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBLUF9HUElPMSAweDFECQkvKiBLZXlwYWQgb3IgR1BJTyBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgS1BfR1BJTzIgMHgxRQkJLyogS2V5cGFkIG9yIEdQSU8gU2VsZWN0aW9uICovCisjZGVmaW5lIEtQX0dQSU8zIDB4MUYJCS8qIEtleXBhZCBvciBHUElPIFNlbGVjdGlvbiAqLworI2RlZmluZSBHUElfRU0xIDB4MjAJCS8qIEdQSSBFdmVudCBNb2RlIDEgKi8KKyNkZWZpbmUgR1BJX0VNMiAweDIxCQkvKiBHUEkgRXZlbnQgTW9kZSAyICovCisjZGVmaW5lIEdQSV9FTTMgMHgyMgkJLyogR1BJIEV2ZW50IE1vZGUgMyAqLworI2RlZmluZSBHUElPX0RJUjEgMHgyMwkJLyogR1BJTyBEYXRhIERpcmVjdGlvbiAqLworI2RlZmluZSBHUElPX0RJUjIgMHgyNAkJLyogR1BJTyBEYXRhIERpcmVjdGlvbiAqLworI2RlZmluZSBHUElPX0RJUjMgMHgyNQkJLyogR1BJTyBEYXRhIERpcmVjdGlvbiAqLworI2RlZmluZSBHUElPX0lOVF9MVkwxIDB4MjYJLyogR1BJTyBFZGdlL0xldmVsIERldGVjdCAqLworI2RlZmluZSBHUElPX0lOVF9MVkwyIDB4MjcJLyogR1BJTyBFZGdlL0xldmVsIERldGVjdCAqLworI2RlZmluZSBHUElPX0lOVF9MVkwzIDB4MjgJLyogR1BJTyBFZGdlL0xldmVsIERldGVjdCAqLworI2RlZmluZSBEZWJvdW5jZV9ESVMxIDB4MjkJLyogRGVib3VuY2UgRGlzYWJsZSAqLworI2RlZmluZSBEZWJvdW5jZV9ESVMyIDB4MkEJLyogRGVib3VuY2UgRGlzYWJsZSAqLworI2RlZmluZSBEZWJvdW5jZV9ESVMzIDB4MkIJLyogRGVib3VuY2UgRGlzYWJsZSAqLworI2RlZmluZSBHUElPX1BVTEwxIDB4MkMJCS8qIEdQSU8gUHVsbCBEaXNhYmxlICovCisjZGVmaW5lIEdQSU9fUFVMTDIgMHgyRAkJLyogR1BJTyBQdWxsIERpc2FibGUgKi8KKyNkZWZpbmUgR1BJT19QVUxMMyAweDJFCQkvKiBHUElPIFB1bGwgRGlzYWJsZSAqLworI2RlZmluZSBDTVBfQ0ZHX1NUQVQgMHgzMAkvKiBDb21wYXJhdG9yIENvbmZpZ3VyYXRpb24gYW5kIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBDTVBfQ09ORkdfU0VOUzEgMHgzMQkvKiBTZW5zb3IxIENvbXBhcmF0b3IgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBDTVBfQ09ORkdfU0VOUzIgMHgzMgkvKiBMMiBMaWdodCBTZW5zb3IgUmVmZXJlbmNlIExldmVsLCBPdXRwdXQgRmFsbGluZyBmb3IgU2Vuc29yIDEgKi8KKyNkZWZpbmUgQ01QMV9MVkwyX1RSSVAgMHgzMwkvKiBMMiBMaWdodCBTZW5zb3IgSHlzdGVyZXNpcyAoQWN0aXZlIHdoZW4gT3V0cHV0IFJpc2luZykgZm9yIFNlbnNvciAxICovCisjZGVmaW5lIENNUDFfTFZMMl9IWVMgMHgzNAkvKiBMMyBMaWdodCBTZW5zb3IgUmVmZXJlbmNlIExldmVsLCBPdXRwdXQgRmFsbGluZyBGb3IgU2Vuc29yIDEgKi8KKyNkZWZpbmUgQ01QMV9MVkwzX1RSSVAgMHgzNQkvKiBMMyBMaWdodCBTZW5zb3IgSHlzdGVyZXNpcyAoQWN0aXZlIHdoZW4gT3V0cHV0IFJpc2luZykgRm9yIFNlbnNvciAxICovCisjZGVmaW5lIENNUDFfTFZMM19IWVMgMHgzNgkvKiBTZW5zb3IgMiBDb21wYXJhdG9yIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ01QMl9MVkwyX1RSSVAgMHgzNwkvKiBMMiBMaWdodCBTZW5zb3IgUmVmZXJlbmNlIExldmVsLCBPdXRwdXQgRmFsbGluZyBmb3IgU2Vuc29yIDIgKi8KKyNkZWZpbmUgQ01QMl9MVkwyX0hZUyAweDM4CS8qIEwyIExpZ2h0IFNlbnNvciBIeXN0ZXJlc2lzIChBY3RpdmUgd2hlbiBPdXRwdXQgUmlzaW5nKSBmb3IgU2Vuc29yIDIgKi8KKyNkZWZpbmUgQ01QMl9MVkwzX1RSSVAgMHgzOQkvKiBMMyBMaWdodCBTZW5zb3IgUmVmZXJlbmNlIExldmVsLCBPdXRwdXQgRmFsbGluZyBGb3IgU2Vuc29yIDIgKi8KKyNkZWZpbmUgQ01QMl9MVkwzX0hZUyAweDNBCS8qIEwzIExpZ2h0IFNlbnNvciBIeXN0ZXJlc2lzIChBY3RpdmUgd2hlbiBPdXRwdXQgUmlzaW5nKSBGb3IgU2Vuc29yIDIgKi8KKyNkZWZpbmUgQ01QMV9BRENfREFUX1IxIDB4M0IJLyogQ29tcGFyYXRvciAxIEFEQyBkYXRhIFJlZ2lzdGVyMSAqLworI2RlZmluZSBDTVAxX0FEQ19EQVRfUjIgMHgzQwkvKiBDb21wYXJhdG9yIDEgQURDIGRhdGEgUmVnaXN0ZXIyICovCisjZGVmaW5lIENNUDJfQURDX0RBVF9SMSAweDNECS8qIENvbXBhcmF0b3IgMiBBREMgZGF0YSBSZWdpc3RlcjEgKi8KKyNkZWZpbmUgQ01QMl9BRENfREFUX1IyIDB4M0UJLyogQ29tcGFyYXRvciAyIEFEQyBkYXRhIFJlZ2lzdGVyMiAqLworCisjZGVmaW5lIEFEUDU1ODhfREVWSUNFX0lEX01BU0sJMHhGCisKKy8qIFB1dCBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBpbiBpMmNfYm9hcmRfaW5mbyBwbGF0Zm9ybV9kYXRhICovCisKKyNkZWZpbmUgQURQNTU4OF9LRVlNQVBTSVpFCTgwCisKK3N0cnVjdCBhZHA1NTg4X2twYWRfcGxhdGZvcm1fZGF0YSB7CisJaW50IHJvd3M7CQkJLyogTnVtYmVyIG9mIHJvd3MgKi8KKwlpbnQgY29sczsJCQkvKiBOdW1iZXIgb2YgY29sdW1ucyAqLworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICprZXltYXA7CS8qIFBvaW50ZXIgdG8ga2V5bWFwICovCisJdW5zaWduZWQgc2hvcnQga2V5bWFwc2l6ZTsJLyogS2V5bWFwIHNpemUgKi8KKwl1bnNpZ25lZCByZXBlYXQ6MTsJCS8qIEVuYWJsZSBrZXkgcmVwZWF0ICovCisJdW5zaWduZWQgZW5fa2V5bG9jazoxOwkJLyogRW5hYmxlIEtleSBMb2NrIGZlYXR1cmUgKi8KKwl1bnNpZ25lZCBzaG9ydCB1bmxvY2tfa2V5MTsJLyogVW5sb2NrIEtleSAxICovCisJdW5zaWduZWQgc2hvcnQgdW5sb2NrX2tleTI7CS8qIFVubG9jayBLZXkgMiAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9tY3M1MDAwX3RzLmggYi9pbmNsdWRlL2xpbnV4L2kyYy9tY3M1MDAwX3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExMTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL21jczUwMDBfdHMuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogbWNzNTAwMF90cy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01DUzUwMDBfVFNfSAorI2RlZmluZSBfX0xJTlVYX01DUzUwMDBfVFNfSAorCisvKiBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgTUVMRkFTIE1DUy01MDAwIHRvdWNoc2NyZWVuIGRyaXZlciAqLworc3RydWN0IG1jczUwMDBfdHNfcGxhdGZvcm1fZGF0YSB7CisJdm9pZCAoKmNmZ19waW4pKHZvaWQpOworCWludCB4X3NpemU7CisJaW50IHlfc2l6ZTsKK307CisKKyNlbmRpZgkvKiBfX0xJTlVYX01DUzUwMDBfVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvdHdsNDAzMC5oIGIvaW5jbHVkZS9saW51eC9pMmMvdHdsNDAzMC5oCmluZGV4IDJkMDJkZmQuLjUwODgyNGVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvdHdsNDAzMC5oCkBAIC0zNDksMTEgKzM0OSwxMSBAQAogCWludAkJaXJxX2xpbmU7CiB9OwogCi0vKiBCb2FyZHMgaGF2ZSB1bmlxZSBtYXBwaW5ncyBvZiB7Y29sLCByb3d9IC0tPiBrZXljb2RlLgotICogQ29sdW1uIGFuZCByb3cgYXJlIDQgYml0cywgYnV0IHJhbmdlIG9ubHkgZnJvbSAwLi43LgorLyogQm9hcmRzIGhhdmUgdW5pcWUgbWFwcGluZ3Mgb2Yge3JvdywgY29sfSAtLT4ga2V5Y29kZS4KKyAqIENvbHVtbiBhbmQgcm93IGFyZSA4IGJpdHMgZWFjaCwgYnV0IHJhbmdlIG9ubHkgZnJvbSAwLi43LgogICogYSBQRVJTSVNURU5UX0tFWSBpcyAiYWx3YXlzIG9uIiBhbmQgbmV2ZXIgcmVwb3J0ZWQuCiAgKi8KLSNkZWZpbmUgUEVSU0lTVEVOVF9LRVkoYywgcikJS0VZKChjKSwgKHIpLCBLRVlfUkVTRVJWRUQpCisjZGVmaW5lIFBFUlNJU1RFTlRfS0VZKHIsIGMpCUtFWSgociksIChjKSwgS0VZX1JFU0VSVkVEKQogCiBzdHJ1Y3QgdHdsNDAzMF9rZXlwYWRfZGF0YSB7CiAJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSAqa2V5bWFwX2RhdGE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2k4MDQyLmggYi9pbmNsdWRlL2xpbnV4L2k4MDQyLmgKaW5kZXggNzkwN2E3Mi4uNjBjMzM2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pODA0Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvaTgwNDIuaApAQCAtNyw2ICs3LDcgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qCiAgKiBTdGFuZGFyZCBjb21tYW5kcy4KQEAgLTMwLDYgKzMxLDM1IEBACiAjZGVmaW5lIEk4MDQyX0NNRF9NVVhfUEZYCTB4MDA5MAogI2RlZmluZSBJODA0Ml9DTURfTVVYX1NFTkQJMHgxMDkwCiAKK3N0cnVjdCBzZXJpbzsKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklPX0k4MDQyKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJT19JODA0Ml9NT0RVTEUpCisKK3ZvaWQgaTgwNDJfbG9ja19jaGlwKHZvaWQpOwordm9pZCBpODA0Ml91bmxvY2tfY2hpcCh2b2lkKTsKIGludCBpODA0Ml9jb21tYW5kKHVuc2lnbmVkIGNoYXIgKnBhcmFtLCBpbnQgY29tbWFuZCk7Citib29sIGk4MDQyX2NoZWNrX3BvcnRfb3duZXIoY29uc3Qgc3RydWN0IHNlcmlvICopOworCisjZWxzZQorCit2b2lkIGk4MDQyX2xvY2tfY2hpcCh2b2lkKQoreworfQorCit2b2lkIGk4MDQyX3VubG9ja19jaGlwKHZvaWQpCit7Cit9CisKK2ludCBpODA0Ml9jb21tYW5kKHVuc2lnbmVkIGNoYXIgKnBhcmFtLCBpbnQgY29tbWFuZCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworYm9vbCBpODA0Ml9jaGVja19wb3J0X293bmVyKGNvbnN0IHN0cnVjdCBzZXJpbyAqc2VyaW8pCit7CisJcmV0dXJuIGZhbHNlOworfQorCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oIGIvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaAppbmRleCA1ZWI5YjBmLi41YTlhYWU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlfX3UxNgkJCWZsYWdzOwogCV9fdTE2CQkJX19yZXNlcnZlZDsKIAlfX3UzMgkJCWRhdGFsZW47Ci0JX191MzIJCQlyc19kZWxheTsKKwlfX3UzMgkJCV9fcmVzZXJ2ZWQyOwogCS8qIGRhdGEgZm9sbG93cyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0LmggYi9pbmNsdWRlL2xpbnV4L2luaXQuaAppbmRleCA0MDBhZGJiLi5mZjhiZGU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXQuaApAQCAtMjcxLDYgKzI3MSw3IEBACiAjZWxzZSAvKiBNT0RVTEUgKi8KIAogLyogRG9uJ3QgdXNlIHRoZXNlIGluIG1vZHVsZXMsIGJ1dCBzb21lIHBlb3BsZSBkby4uLiAqLworI2RlZmluZSBlYXJseV9pbml0Y2FsbChmbikJCW1vZHVsZV9pbml0KGZuKQogI2RlZmluZSBjb3JlX2luaXRjYWxsKGZuKQkJbW9kdWxlX2luaXQoZm4pCiAjZGVmaW5lIHBvc3Rjb3JlX2luaXRjYWxsKGZuKQkJbW9kdWxlX2luaXQoZm4pCiAjZGVmaW5lIGFyY2hfaW5pdGNhbGwoZm4pCQltb2R1bGVfaW5pdChmbikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQuaAppbmRleCA4YjNiYzNlLi4wY2NmYzMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lucHV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCkBAIC0xMTIzLDcgKzExMjMsNyBAQAogCXN0cnVjdCBtdXRleCBtdXRleDsKIAogCXVuc2lnbmVkIGludCB1c2VyczsKLQlpbnQgZ29pbmdfYXdheTsKKwlib29sIGdvaW5nX2F3YXk7CiAKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggOGU5ZTE1MS4uN2NhNzJiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxbnIuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgpAQCAtODQsNyArODMsNiBAQAogICogc3RydWN0IGlycWFjdGlvbiAtIHBlciBpbnRlcnJ1cHQgYWN0aW9uIGRlc2NyaXB0b3IKICAqIEBoYW5kbGVyOglpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbgogICogQGZsYWdzOglmbGFncyAoc2VlIElSUUZfKiBhYm92ZSkKLSAqIEBtYXNrOglubyBjb21tZW50IGFzIGl0IGlzIHVzZWxlc3MgYW5kIGFib3V0IHRvIGJlIHJlbW92ZWQKICAqIEBuYW1lOgluYW1lIG9mIHRoZSBkZXZpY2UKICAqIEBkZXZfaWQ6CWNvb2tpZSB0byBpZGVudGlmeSB0aGUgZGV2aWNlCiAgKiBAbmV4dDoJcG9pbnRlciB0byB0aGUgbmV4dCBpcnFhY3Rpb24gZm9yIHNoYXJlZCBpbnRlcnJ1cHRzCkBAIC05Nyw3ICs5NSw2IEBACiBzdHJ1Y3QgaXJxYWN0aW9uIHsKIAlpcnFfaGFuZGxlcl90IGhhbmRsZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQljcHVtYXNrX3QgbWFzazsKIAljb25zdCBjaGFyICpuYW1lOwogCXZvaWQgKmRldl9pZDsKIAlzdHJ1Y3QgaXJxYWN0aW9uICpuZXh0OwpAQCAtNjEyLDYgKzYwOSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfcG9sbF9hbGxfc2hhcmVkX2lycXModm9pZCkgeyB9CiAjZW5kaWYKIAorc3RydWN0IHNlcV9maWxlOwogaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpOwogCiBzdHJ1Y3QgaXJxX2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwYy5oIGIvaW5jbHVkZS9saW51eC9pcGMuaAppbmRleCBiODgyNjEwLi4zYjE1OTRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBjLmgKQEAgLTc4LDggKzc4LDYgQEAKICNkZWZpbmUgSVBDQ0FMTCh2ZXJzaW9uLG9wKQkoKHZlcnNpb24pPDwxNiB8IChvcCkpCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2RlZmluZSBJUENNTkkgMzI3NjggIC8qIDw9IE1BWF9JTlQgbGltaXQgZm9yIGlwYyBhcnJheXMgKGluY2x1ZGluZyBzeXNjdGwgY2hhbmdlcykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkMi5oIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKaW5kZXggNTI2OTVkMy4uZjEwMTFmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQyLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKQEAgLTQ2NCw5ICs0NjQsOSBAQAogICovCiBzdHJ1Y3QgdHJhbnNhY3Rpb25fY2hwX3N0YXRzX3MgewogCXVuc2lnbmVkIGxvbmcJCWNzX2NocF90aW1lOwotCXVuc2lnbmVkIGxvbmcJCWNzX2ZvcmNlZF90b19jbG9zZTsKLQl1bnNpZ25lZCBsb25nCQljc193cml0dGVuOwotCXVuc2lnbmVkIGxvbmcJCWNzX2Ryb3BwZWQ7CisJX191MzIJCQljc19mb3JjZWRfdG9fY2xvc2U7CisJX191MzIJCQljc193cml0dGVuOworCV9fdTMyCQkJY3NfZHJvcHBlZDsKIH07CiAKIC8qIFRoZSB0cmFuc2FjdGlvbl90IHR5cGUgaXMgdGhlIGd1dHMgb2YgdGhlIGpvdXJuYWxpbmcgbWVjaGFuaXNtLiAgSXQKQEAgLTY2OCwyMyArNjY4LDE2IEBACiAJdW5zaWduZWQgbG9uZwkJcnNfZmx1c2hpbmc7CiAJdW5zaWduZWQgbG9uZwkJcnNfbG9nZ2luZzsKIAotCXVuc2lnbmVkIGxvbmcJCXJzX2hhbmRsZV9jb3VudDsKLQl1bnNpZ25lZCBsb25nCQlyc19ibG9ja3M7Ci0JdW5zaWduZWQgbG9uZwkJcnNfYmxvY2tzX2xvZ2dlZDsKKwlfX3UzMgkJCXJzX2hhbmRsZV9jb3VudDsKKwlfX3UzMgkJCXJzX2Jsb2NrczsKKwlfX3UzMgkJCXJzX2Jsb2Nrc19sb2dnZWQ7CiB9OwogCiBzdHJ1Y3QgdHJhbnNhY3Rpb25fc3RhdHNfcyB7Ci0JaW50IAkJCXRzX3R5cGU7CiAJdW5zaWduZWQgbG9uZwkJdHNfdGlkOwotCXVuaW9uIHsKLQkJc3RydWN0IHRyYW5zYWN0aW9uX3J1bl9zdGF0c19zIHJ1bjsKLQkJc3RydWN0IHRyYW5zYWN0aW9uX2NocF9zdGF0c19zIGNocDsKLQl9IHU7CisJc3RydWN0IHRyYW5zYWN0aW9uX3J1bl9zdGF0c19zIHJ1bjsKIH07CiAKLSNkZWZpbmUgSkJEMl9TVEFUU19SVU4JCTEKLSNkZWZpbmUgSkJEMl9TVEFUU19DSEVDS1BPSU5UCTIKLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBqYmQyX3RpbWVfZGlmZih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKQEAgLTk4OCwxMiArOTgxLDYgQEAKIAkvKgogCSAqIEpvdXJuYWwgc3RhdGlzdGljcwogCSAqLwotCXN0cnVjdCB0cmFuc2FjdGlvbl9zdGF0c19zICpqX2hpc3Rvcnk7Ci0JaW50CQkJal9oaXN0b3J5X21heDsKLQlpbnQJCQlqX2hpc3RvcnlfY3VyOwotCS8qCi0JICogUHJvdGVjdCB0aGUgdHJhbnNhY3Rpb25zIHN0YXRpc3RpY3MgaGlzdG9yeQotCSAqLwogCXNwaW5sb2NrX3QJCWpfaGlzdG9yeV9sb2NrOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqal9wcm9jX2VudHJ5OwogCXN0cnVjdCB0cmFuc2FjdGlvbl9zdGF0c19zIGpfc3RhdHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCBkM2NkMjNmLi5mNGUzMTg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTY1OSw2ICs2NTksMTIgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAorI2lmbmRlZiBfX0VYUE9SVEVEX0hFQURFUlNfXworI2lmbmRlZiBfX0tFUk5FTF9fCisjd2FybmluZyBBdHRlbXB0IHRvIHVzZSBrZXJuZWwgaGVhZGVycyBmcm9tIHVzZXIgc3BhY2UsIHNlZSBodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvS2VybmVsSGVhZGVycworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0VYUE9SVEVEX0hFQURFUlNfXyAqLworCiAjZGVmaW5lIFNJX0xPQURfU0hJRlQJMTYKIHN0cnVjdCBzeXNpbmZvIHsKIAlsb25nIHVwdGltZTsJCQkvKiBTZWNvbmRzIHNpbmNlIGJvb3QgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3JlZi5oIGIvaW5jbHVkZS9saW51eC9rcmVmLmgKaW5kZXggMGNlZjZiYS4uYjBjYjBlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rcmVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9rcmVmLmgKQEAgLTE2LDcgKzE2LDYgQEAKICNkZWZpbmUgX0tSRUZfSF8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiBzdHJ1Y3Qga3JlZiB7CiAJYXRvbWljX3QgcmVmY291bnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCA3NjMxOWJmLi44NzY5ODY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTQxOCw2ICs0MTgsMTcgQEAKIAkJCQkgIEFUQV9USU1JTkdfQUNUSVZFIHwgQVRBX1RJTUlOR19SRUNPVkVSIHwKIAkJCQkgIEFUQV9USU1JTkdfRE1BQ0tfSE9MRCB8IEFUQV9USU1JTkdfQ1lDTEUgfAogCQkJCSAgQVRBX1RJTUlOR19VRE1BLAorCisJLyogQUNQSSBjb25zdGFudHMgKi8KKwlBVEFfQUNQSV9GSUxURVJfU0VUWEZFUgk9IDEgPDwgMCwKKwlBVEFfQUNQSV9GSUxURVJfTE9DSwk9IDEgPDwgMSwKKwlBVEFfQUNQSV9GSUxURVJfRElQTQk9IDEgPDwgMiwKKwlBVEFfQUNQSV9GSUxURVJfRlBETUFfT0ZGU0VUID0gMSA8PCAzLAkvKiBGUERNQSBub24temVybyBvZmZzZXQgKi8KKwlBVEFfQUNQSV9GSUxURVJfRlBETUFfQUEgPSAxIDw8IDQsCS8qIEZQRE1BIGF1dG8gYWN0aXZhdGUgKi8KKworCUFUQV9BQ1BJX0ZJTFRFUl9ERUZBVUxUCT0gQVRBX0FDUElfRklMVEVSX1NFVFhGRVIgfAorCQkJCSAgQVRBX0FDUElfRklMVEVSX0xPQ0sgfAorCQkJCSAgQVRBX0FDUElfRklMVEVSX0RJUE0sCiB9OwogCiBlbnVtIGF0YV94ZmVyX21hc2sgewpAQCAtNTg3LDYgKzU5OCw3IEBACiAjaWZkZWYgQ09ORklHX0FUQV9BQ1BJCiAJYWNwaV9oYW5kbGUJCWFjcGlfaGFuZGxlOwogCXVuaW9uIGFjcGlfb2JqZWN0CSpndGZfY2FjaGU7CisJdW5zaWduZWQgaW50CQlndGZfZmlsdGVyOwogI2VuZGlmCiAJLyogbl9zZWN0b3IgaXMgQ0xFQVJfQkVHSU4sIHJlYWQgY29tbWVudCBhYm92ZSBDTEVBUl9CRUdJTiAqLwogCXU2NAkJCW5fc2VjdG9yczsJLyogc2l6ZSBvZiBkZXZpY2UsIGlmIEFUQSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJwczIuaCBiL2luY2x1ZGUvbGludXgvbGlicHMyLmgKaW5kZXggZmNmNWZiZS4uNzk2MDNhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJwczIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYnBzMi5oCkBAIC00NCw2ICs0NCw4IEBACiB2b2lkIHBzMl9pbml0KHN0cnVjdCBwczJkZXYgKnBzMmRldiwgc3RydWN0IHNlcmlvICpzZXJpbyk7CiBpbnQgcHMyX3NlbmRieXRlKHN0cnVjdCBwczJkZXYgKnBzMmRldiwgdW5zaWduZWQgY2hhciBieXRlLCBpbnQgdGltZW91dCk7CiB2b2lkIHBzMl9kcmFpbihzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIGludCBtYXhieXRlcywgaW50IHRpbWVvdXQpOwordm9pZCBwczJfYmVnaW5fY29tbWFuZChzdHJ1Y3QgcHMyZGV2ICpwczJkZXYpOwordm9pZCBwczJfZW5kX2NvbW1hbmQoc3RydWN0IHBzMmRldiAqcHMyZGV2KTsKIGludCBfX3BzMl9jb21tYW5kKHN0cnVjdCBwczJkZXYgKnBzMmRldiwgdW5zaWduZWQgY2hhciAqcGFyYW0sIGludCBjb21tYW5kKTsKIGludCBwczJfY29tbWFuZChzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHVuc2lnbmVkIGNoYXIgKnBhcmFtLCBpbnQgY29tbWFuZCk7CiBpbnQgcHMyX2hhbmRsZV9hY2soc3RydWN0IHBzMmRldiAqcHMyZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saW5rYWdlLmggYi9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaAppbmRleCA2OTFmNTkxLi41MTI2Y2NlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaApAQCAtNTcsNiArNTcsNyBAQAogCiAjaWZkZWYgX19BU1NFTUJMWV9fCiAKKyNpZm5kZWYgTElOS0VSX1NDUklQVAogI2RlZmluZSBBTElHTiBfX0FMSUdOCiAjZGVmaW5lIEFMSUdOX1NUUiBfX0FMSUdOX1NUUgogCkBAIC02Niw2ICs2Nyw3IEBACiAgIEFMSUdOOyBcCiAgIG5hbWU6CiAjZW5kaWYKKyNlbmRpZiAvKiBMSU5LRVJfU0NSSVBUICovCiAKICNpZm5kZWYgV0VBSwogI2RlZmluZSBXRUFLKG5hbWUpCSAgIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKaW5kZXggZTQ2YTA3My4uYmY5MjEzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKQEAgLTExOCw2ICsxMTgsOSBAQAogCiBleHRlcm4gYm9vbCBtZW1fY2dyb3VwX29vbV9jYWxsZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIHZvaWQgbWVtX2Nncm91cF91cGRhdGVfbWFwcGVkX2ZpbGVfc3RhdChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHZhbCk7Cit1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfc29mdF9saW1pdF9yZWNsYWltKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIsCisJCQkJCQlnZnBfdCBnZnBfbWFzaywgaW50IG5pZCwKKwkJCQkJCWludCB6aWQpOwogI2Vsc2UgLyogQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIgKi8KIHN0cnVjdCBtZW1fY2dyb3VwOwogCkBAIC0yNzYsNiArMjc5LDEzIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zb2Z0X2xpbWl0X3JlY2xhaW0oc3RydWN0IHpvbmUgKnpvbmUsIGludCBvcmRlciwKKwkJCQkJICAgIGdmcF90IGdmcF9tYXNrLCBpbnQgbmlkLCBpbnQgemlkKQoreworCXJldHVybiAwOworfQorCiAjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9NRU1fQ09OVCAqLwogCiAjZW5kaWYgLyogX0xJTlVYX01FTUNPTlRST0xfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L3BtdS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L3BtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOGNiYjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvcG11LmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvcG11LmggLS0gUE1VIGZvciBXTTgzMXgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19NRkRfV004MzFYX1BNVV9IX18KKyNkZWZpbmUgX19NRkRfV004MzFYX1BNVV9IX18KKworLyoKKyAqIFIxNjM4NyAoMHg0MDAzKSAtIFBvd2VyIFN0YXRlCisgKi8KKyNkZWZpbmUgV004MzFYX0NISVBfT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQ0hJUF9PTiAqLworI2RlZmluZSBXTTgzMVhfQ0hJUF9PTl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDSElQX09OICovCisjZGVmaW5lIFdNODMxWF9DSElQX09OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIENISVBfT04gKi8KKyNkZWZpbmUgV004MzFYX0NISVBfT05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0hJUF9PTiAqLworI2RlZmluZSBXTTgzMVhfQ0hJUF9TTFAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBDSElQX1NMUCAqLworI2RlZmluZSBXTTgzMVhfQ0hJUF9TTFBfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBDSElQX1NMUCAqLworI2RlZmluZSBXTTgzMVhfQ0hJUF9TTFBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBDSElQX1NMUCAqLworI2RlZmluZSBXTTgzMVhfQ0hJUF9TTFBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDSElQX1NMUCAqLworI2RlZmluZSBXTTgzMVhfUkVGX0xQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBSRUZfTFAgKi8KKyNkZWZpbmUgV004MzFYX1JFRl9MUF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogUkVGX0xQICovCisjZGVmaW5lIFdNODMxWF9SRUZfTFBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIFJFRl9MUCAqLworI2RlZmluZSBXTTgzMVhfUkVGX0xQX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSRUZfTFAgKi8KKyNkZWZpbmUgV004MzFYX1BXUlNUQVRFX0RMWV9NQVNLICAgICAgICAgICAgICAgIDB4MEMwMCAgLyogUFdSU1RBVEVfRExZIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTgzMVhfUFdSU1RBVEVfRExZX1NISUZUICAgICAgICAgICAgICAgICAgIDEwICAvKiBQV1JTVEFURV9ETFkgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODMxWF9QV1JTVEFURV9ETFlfV0lEVEggICAgICAgICAgICAgICAgICAgIDIgIC8qIFBXUlNUQVRFX0RMWSAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004MzFYX1NXUlNUX0RMWSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogU1dSU1RfRExZICovCisjZGVmaW5lIFdNODMxWF9TV1JTVF9ETFlfTUFTSyAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIFNXUlNUX0RMWSAqLworI2RlZmluZSBXTTgzMVhfU1dSU1RfRExZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBTV1JTVF9ETFkgKi8KKyNkZWZpbmUgV004MzFYX1NXUlNUX0RMWV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1dSU1RfRExZICovCisjZGVmaW5lIFdNODMxWF9VU0IxMDBNQV9TVEFSVFVQX01BU0sgICAgICAgICAgICAweDAwMzAgIC8qIFVTQjEwME1BX1NUQVJUVVAgLSBbNTo0XSAqLworI2RlZmluZSBXTTgzMVhfVVNCMTAwTUFfU1RBUlRVUF9TSElGVCAgICAgICAgICAgICAgICA0ICAvKiBVU0IxMDBNQV9TVEFSVFVQIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004MzFYX1VTQjEwME1BX1NUQVJUVVBfV0lEVEggICAgICAgICAgICAgICAgMiAgLyogVVNCMTAwTUFfU1RBUlRVUCAtIFs1OjRdICovCisjZGVmaW5lIFdNODMxWF9VU0JfQ1VSUl9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIFVTQl9DVVJSX1NUUyAqLworI2RlZmluZSBXTTgzMVhfVVNCX0NVUlJfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBVU0JfQ1VSUl9TVFMgKi8KKyNkZWZpbmUgV004MzFYX1VTQl9DVVJSX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgMyAgLyogVVNCX0NVUlJfU1RTICovCisjZGVmaW5lIFdNODMxWF9VU0JfQ1VSUl9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIFVTQl9DVVJSX1NUUyAqLworI2RlZmluZSBXTTgzMVhfVVNCX0lMSU1fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBVU0JfSUxJTSAtIFsyOjBdICovCisjZGVmaW5lIFdNODMxWF9VU0JfSUxJTV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFVTQl9JTElNIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004MzFYX1VTQl9JTElNX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogVVNCX0lMSU0gLSBbMjowXSAqLworCisvKgorICogUjE2Mzk3ICgweDQwMEQpIC0gU3lzdGVtIFN0YXR1cworICovCisjZGVmaW5lIFdNODMxWF9USFdfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIFRIV19TVFMgKi8KKyNkZWZpbmUgV004MzFYX1RIV19TVFNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogVEhXX1NUUyAqLworI2RlZmluZSBXTTgzMVhfVEhXX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBUSFdfU1RTICovCisjZGVmaW5lIFdNODMxWF9USFdfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRIV19TVFMgKi8KKyNkZWZpbmUgV004MzFYX1BXUl9TUkNfQkFUVCAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogUFdSX1NSQ19CQVRUICovCisjZGVmaW5lIFdNODMxWF9QV1JfU1JDX0JBVFRfTUFTSyAgICAgICAgICAgICAgICAweDA0MDAgIC8qIFBXUl9TUkNfQkFUVCAqLworI2RlZmluZSBXTTgzMVhfUFdSX1NSQ19CQVRUX1NISUZUICAgICAgICAgICAgICAgICAgIDEwICAvKiBQV1JfU1JDX0JBVFQgKi8KKyNkZWZpbmUgV004MzFYX1BXUl9TUkNfQkFUVF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogUFdSX1NSQ19CQVRUICovCisjZGVmaW5lIFdNODMxWF9QV1JfV0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIFBXUl9XQUxMICovCisjZGVmaW5lIFdNODMxWF9QV1JfV0FMTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIFBXUl9XQUxMICovCisjZGVmaW5lIFdNODMxWF9QV1JfV0FMTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIFBXUl9XQUxMICovCisjZGVmaW5lIFdNODMxWF9QV1JfV0FMTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXUl9XQUxMICovCisjZGVmaW5lIFdNODMxWF9QV1JfVVNCICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFBXUl9VU0IgKi8KKyNkZWZpbmUgV004MzFYX1BXUl9VU0JfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogUFdSX1VTQiAqLworI2RlZmluZSBXTTgzMVhfUFdSX1VTQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBQV1JfVVNCICovCisjZGVmaW5lIFdNODMxWF9QV1JfVVNCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXUl9VU0IgKi8KKyNkZWZpbmUgV004MzFYX01BSU5fU1RBVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxRiAgLyogTUFJTl9TVEFURSAtIFs0OjBdICovCisjZGVmaW5lIFdNODMxWF9NQUlOX1NUQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1BSU5fU1RBVEUgLSBbNDowXSAqLworI2RlZmluZSBXTTgzMVhfTUFJTl9TVEFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBNQUlOX1NUQVRFIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNjQ1NiAoMHg0MDQ4KSAtIENoYXJnZXIgQ29udHJvbCAxCisgKi8KKyNkZWZpbmUgV004MzFYX0NIR19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQ0hHX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDSEdfRU5BICovCisjZGVmaW5lIFdNODMxWF9DSEdfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIENIR19FTkEgKi8KKyNkZWZpbmUgV004MzFYX0NIR19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0hHX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0ZSQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBDSEdfRlJDICovCisjZGVmaW5lIFdNODMxWF9DSEdfRlJDX01BU0sgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIENIR19GUkMgKi8KKyNkZWZpbmUgV004MzFYX0NIR19GUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogQ0hHX0ZSQyAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDSEdfRlJDICovCisjZGVmaW5lIFdNODMxWF9DSEdfSVRFUk1fTUFTSyAgICAgICAgICAgICAgICAgICAweDFDMDAgIC8qIENIR19JVEVSTSAtIFsxMjoxMF0gKi8KKyNkZWZpbmUgV004MzFYX0NIR19JVEVSTV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogQ0hHX0lURVJNIC0gWzEyOjEwXSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0lURVJNX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBDSEdfSVRFUk0gLSBbMTI6MTBdICovCisjZGVmaW5lIFdNODMxWF9DSEdfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIENIR19GQVNUICovCisjZGVmaW5lIFdNODMxWF9DSEdfRkFTVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIENIR19GQVNUICovCisjZGVmaW5lIFdNODMxWF9DSEdfRkFTVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIENIR19GQVNUICovCisjZGVmaW5lIFdNODMxWF9DSEdfRkFTVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENIR19GQVNUICovCisjZGVmaW5lIFdNODMxWF9DSEdfSU1PTl9FTkEgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIENIR19JTU9OX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0lNT05fRU5BX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBDSEdfSU1PTl9FTkEgKi8KKyNkZWZpbmUgV004MzFYX0NIR19JTU9OX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0hHX0lNT05fRU5BICovCisjZGVmaW5lIFdNODMxWF9DSEdfSU1PTl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIENIR19JTU9OX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0NISVBfVEVNUF9NT04gICAgICAgICAgICAgICAgMHgwMDAxICAvKiBDSEdfQ0hJUF9URU1QX01PTiAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0NISVBfVEVNUF9NT05fTUFTSyAgICAgICAgICAgMHgwMDAxICAvKiBDSEdfQ0hJUF9URU1QX01PTiAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0NISVBfVEVNUF9NT05fU0hJRlQgICAgICAgICAgICAgICAwICAvKiBDSEdfQ0hJUF9URU1QX01PTiAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0NISVBfVEVNUF9NT05fV0lEVEggICAgICAgICAgICAgICAxICAvKiBDSEdfQ0hJUF9URU1QX01PTiAqLworCisvKgorICogUjE2NDU3ICgweDQwNDkpIC0gQ2hhcmdlciBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTgzMVhfQ0hHX09GRl9NU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBDSEdfT0ZGX01TSyAqLworI2RlZmluZSBXTTgzMVhfQ0hHX09GRl9NU0tfTUFTSyAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBDSEdfT0ZGX01TSyAqLworI2RlZmluZSBXTTgzMVhfQ0hHX09GRl9NU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBDSEdfT0ZGX01TSyAqLworI2RlZmluZSBXTTgzMVhfQ0hHX09GRl9NU0tfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBDSEdfT0ZGX01TSyAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1RJTUVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwRjAwICAvKiBDSEdfVElNRSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1RJTUVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBDSEdfVElNRSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1RJTUVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBDSEdfVElNRSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1RSS0xfSUxJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEMwICAvKiBDSEdfVFJLTF9JTElNIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004MzFYX0NIR19UUktMX0lMSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgNiAgLyogQ0hHX1RSS0xfSUxJTSAtIFs3OjZdICovCisjZGVmaW5lIFdNODMxWF9DSEdfVFJLTF9JTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDIgIC8qIENIR19UUktMX0lMSU0gLSBbNzo2XSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDMwICAvKiBDSEdfVlNFTCAtIFs1OjRdICovCisjZGVmaW5lIFdNODMxWF9DSEdfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIENIR19WU0VMIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004MzFYX0NIR19WU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQ0hHX1ZTRUwgLSBbNTo0XSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0ZBU1RfSUxJTV9NQVNLICAgICAgICAgICAgICAgMHgwMDBGICAvKiBDSEdfRkFTVF9JTElNIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004MzFYX0NIR19GQVNUX0lMSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogQ0hHX0ZBU1RfSUxJTSAtIFszOjBdICovCisjZGVmaW5lIFdNODMxWF9DSEdfRkFTVF9JTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDQgIC8qIENIR19GQVNUX0lMSU0gLSBbMzowXSAqLworCisvKgorICogUjE2NDU4ICgweDQwNEEpIC0gQ2hhcmdlciBTdGF0dXMKKyAqLworI2RlZmluZSBXTTgzMVhfQkFUVF9PVl9TVFMgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBCQVRUX09WX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQkFUVF9PVl9TVFNfTUFTSyAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBCQVRUX09WX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQkFUVF9PVl9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBCQVRUX09WX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQkFUVF9PVl9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBCQVRUX09WX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1NUQVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHg3MDAwICAvKiBDSEdfU1RBVEUgLSBbMTQ6MTJdICovCisjZGVmaW5lIFdNODMxWF9DSEdfU1RBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIENIR19TVEFURSAtIFsxNDoxMl0gKi8KKyNkZWZpbmUgV004MzFYX0NIR19TVEFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogQ0hHX1NUQVRFIC0gWzE0OjEyXSAqLworI2RlZmluZSBXTTgzMVhfQkFUVF9IT1RfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBCQVRUX0hPVF9TVFMgKi8KKyNkZWZpbmUgV004MzFYX0JBVFRfSE9UX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogQkFUVF9IT1RfU1RTICovCisjZGVmaW5lIFdNODMxWF9CQVRUX0hPVF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEgIC8qIEJBVFRfSE9UX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQkFUVF9IT1RfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBCQVRUX0hPVF9TVFMgKi8KKyNkZWZpbmUgV004MzFYX0JBVFRfQ09MRF9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogQkFUVF9DT0xEX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQkFUVF9DT0xEX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwNDAwICAvKiBCQVRUX0NPTERfU1RTICovCisjZGVmaW5lIFdNODMxWF9CQVRUX0NPTERfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgMTAgIC8qIEJBVFRfQ09MRF9TVFMgKi8KKyNkZWZpbmUgV004MzFYX0JBVFRfQ09MRF9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQkFUVF9DT0xEX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1RPUE9GRiAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBDSEdfVE9QT0ZGICovCisjZGVmaW5lIFdNODMxWF9DSEdfVE9QT0ZGX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIENIR19UT1BPRkYgKi8KKyNkZWZpbmUgV004MzFYX0NIR19UT1BPRkZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogQ0hHX1RPUE9GRiAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1RPUE9GRl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDSEdfVE9QT0ZGICovCisjZGVmaW5lIFdNODMxWF9DSEdfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIENIR19BQ1RJVkUgKi8KKyNkZWZpbmUgV004MzFYX0NIR19BQ1RJVkVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQ0hHX0FDVElWRSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX0FDVElWRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBDSEdfQUNUSVZFICovCisjZGVmaW5lIFdNODMxWF9DSEdfQUNUSVZFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENIR19BQ1RJVkUgKi8KKyNkZWZpbmUgV004MzFYX0NIR19USU1FX0VMQVBTRURfTUFTSyAgICAgICAgICAgIDB4MDBGRiAgLyogQ0hHX1RJTUVfRUxBUFNFRCAtIFs3OjBdICovCisjZGVmaW5lIFdNODMxWF9DSEdfVElNRV9FTEFQU0VEX1NISUZUICAgICAgICAgICAgICAgIDAgIC8qIENIR19USU1FX0VMQVBTRUQgLSBbNzowXSAqLworI2RlZmluZSBXTTgzMVhfQ0hHX1RJTUVfRUxBUFNFRF9XSURUSCAgICAgICAgICAgICAgICA4ICAvKiBDSEdfVElNRV9FTEFQU0VEIC0gWzc6MF0gKi8KKworI2RlZmluZSBXTTgzMVhfQ0hHX1NUQVRFX09GRiAgICAgICAgICgwIDw8IFdNODMxWF9DSEdfU1RBVEVfU0hJRlQpCisjZGVmaW5lIFdNODMxWF9DSEdfU1RBVEVfVFJJQ0tMRSAgICAgKDEgPDwgV004MzFYX0NIR19TVEFURV9TSElGVCkKKyNkZWZpbmUgV004MzFYX0NIR19TVEFURV9GQVNUICAgICAgICAoMiA8PCBXTTgzMVhfQ0hHX1NUQVRFX1NISUZUKQorI2RlZmluZSBXTTgzMVhfQ0hHX1NUQVRFX1RSSUNLTEVfT1QgICgzIDw8IFdNODMxWF9DSEdfU1RBVEVfU0hJRlQpCisjZGVmaW5lIFdNODMxWF9DSEdfU1RBVEVfRkFTVF9PVCAgICAgKDQgPDwgV004MzFYX0NIR19TVEFURV9TSElGVCkKKyNkZWZpbmUgV004MzFYX0NIR19TVEFURV9ERUZFQ1RJVkUgICAoNSA8PCBXTTgzMVhfQ0hHX1NUQVRFX1NISUZUKQorCisvKgorICogUjE2NDU5ICgweDQwNEIpIC0gQmFja3VwIENoYXJnZXIgQ29udHJvbAorICovCisjZGVmaW5lIFdNODMxWF9CS1VQX0NIR19FTkEgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEJLVVBfQ0hHX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9DSEdfRU5BX01BU0sgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBCS1VQX0NIR19FTkEgKi8KKyNkZWZpbmUgV004MzFYX0JLVVBfQ0hHX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAxNSAgLyogQktVUF9DSEdfRU5BICovCisjZGVmaW5lIFdNODMxWF9CS1VQX0NIR19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEJLVVBfQ0hHX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9DSEdfU1RTICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBCS1VQX0NIR19TVFMgKi8KKyNkZWZpbmUgV004MzFYX0JLVVBfQ0hHX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogQktVUF9DSEdfU1RTICovCisjZGVmaW5lIFdNODMxWF9CS1VQX0NIR19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTQgIC8qIEJLVVBfQ0hHX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQktVUF9DSEdfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBCS1VQX0NIR19TVFMgKi8KKyNkZWZpbmUgV004MzFYX0JLVVBfQ0hHX01PREUgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogQktVUF9DSEdfTU9ERSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9DSEdfTU9ERV9NQVNLICAgICAgICAgICAgICAgMHgxMDAwICAvKiBCS1VQX0NIR19NT0RFICovCisjZGVmaW5lIFdNODMxWF9CS1VQX0NIR19NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgMTIgIC8qIEJLVVBfQ0hHX01PREUgKi8KKyNkZWZpbmUgV004MzFYX0JLVVBfQ0hHX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQktVUF9DSEdfTU9ERSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9CQVRUX0RFVF9FTkEgICAgICAgICAgICAgICAgMHgwODAwICAvKiBCS1VQX0JBVFRfREVUX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9CQVRUX0RFVF9FTkFfTUFTSyAgICAgICAgICAgMHgwODAwICAvKiBCS1VQX0JBVFRfREVUX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9CQVRUX0RFVF9FTkFfU0hJRlQgICAgICAgICAgICAgIDExICAvKiBCS1VQX0JBVFRfREVUX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9CQVRUX0RFVF9FTkFfV0lEVEggICAgICAgICAgICAgICAxICAvKiBCS1VQX0JBVFRfREVUX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9CQVRUX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBCS1VQX0JBVFRfU1RTICovCisjZGVmaW5lIFdNODMxWF9CS1VQX0JBVFRfU1RTX01BU0sgICAgICAgICAgICAgICAweDA0MDAgIC8qIEJLVVBfQkFUVF9TVFMgKi8KKyNkZWZpbmUgV004MzFYX0JLVVBfQkFUVF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAxMCAgLyogQktVUF9CQVRUX1NUUyAqLworI2RlZmluZSBXTTgzMVhfQktVUF9CQVRUX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBCS1VQX0JBVFRfU1RTICovCisjZGVmaW5lIFdNODMxWF9CS1VQX0NIR19WTElNICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEJLVVBfQ0hHX1ZMSU0gKi8KKyNkZWZpbmUgV004MzFYX0JLVVBfQ0hHX1ZMSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDAxMCAgLyogQktVUF9DSEdfVkxJTSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9DSEdfVkxJTV9TSElGVCAgICAgICAgICAgICAgICAgICA0ICAvKiBCS1VQX0NIR19WTElNICovCisjZGVmaW5lIFdNODMxWF9CS1VQX0NIR19WTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEJLVVBfQ0hHX1ZMSU0gKi8KKyNkZWZpbmUgV004MzFYX0JLVVBfQ0hHX0lMSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDAwMyAgLyogQktVUF9DSEdfSUxJTSAtIFsxOjBdICovCisjZGVmaW5lIFdNODMxWF9CS1VQX0NIR19JTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIEJLVVBfQ0hHX0lMSU0gLSBbMTowXSAqLworI2RlZmluZSBXTTgzMVhfQktVUF9DSEdfSUxJTV9XSURUSCAgICAgICAgICAgICAgICAgICAyICAvKiBCS1VQX0NIR19JTElNIC0gWzE6MF0gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvc3RhdHVzLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvc3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjMDkwZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9zdGF0dXMuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogaW5jbHVkZS9saW51eC9tZmQvd204MzF4L3N0YXR1cy5oIC0tIFN0YXR1cyBMRURzIGZvciBXTTgzMXgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19NRkRfV004MzFYX1NUQVRVU19IX18KKyNkZWZpbmUgX19NRkRfV004MzFYX1NUQVRVU19IX18KKworI2RlZmluZSBXTTgzMVhfTEVEX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEMwMDAgIC8qIExFRF9TUkMgLSBbMTU6MTRdICovCisjZGVmaW5lIFdNODMxWF9MRURfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogTEVEX1NSQyAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV004MzFYX0xFRF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBMRURfU1JDIC0gWzE1OjE0XSAqLworI2RlZmluZSBXTTgzMVhfTEVEX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAzMDAgIC8qIExFRF9NT0RFIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004MzFYX0xFRF9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBMRURfTU9ERSAtIFs5OjhdICovCisjZGVmaW5lIFdNODMxWF9MRURfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTEVEX01PREUgLSBbOTo4XSAqLworI2RlZmluZSBXTTgzMVhfTEVEX1NFUV9MRU5fTUFTSyAgICAgICAgICAgICAgICAweDAwMzAgIC8qIExFRF9TRVFfTEVOIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004MzFYX0xFRF9TRVFfTEVOX1NISUZUICAgICAgICAgICAgICAgICAgICA0ICAvKiBMRURfU0VRX0xFTiAtIFs1OjRdICovCisjZGVmaW5lIFdNODMxWF9MRURfU0VRX0xFTl9XSURUSCAgICAgICAgICAgICAgICAgICAgMiAgLyogTEVEX1NFUV9MRU4gLSBbNTo0XSAqLworI2RlZmluZSBXTTgzMVhfTEVEX0RVUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMEMgIC8qIExFRF9EVVIgLSBbMzoyXSAqLworI2RlZmluZSBXTTgzMVhfTEVEX0RVUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExFRF9EVVIgLSBbMzoyXSAqLworI2RlZmluZSBXTTgzMVhfTEVEX0RVUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExFRF9EVVIgLSBbMzoyXSAqLworI2RlZmluZSBXTTgzMVhfTEVEX0RVVFlfQ1lDX01BU0sgICAgICAgICAgICAgICAweDAwMDMgIC8qIExFRF9EVVRZX0NZQyAtIFsxOjBdICovCisjZGVmaW5lIFdNODMxWF9MRURfRFVUWV9DWUNfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogTEVEX0RVVFlfQ1lDIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004MzFYX0xFRF9EVVRZX0NZQ19XSURUSCAgICAgICAgICAgICAgICAgICAyICAvKiBMRURfRFVUWV9DWUMgLSBbMTowXSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCBiNmVhZTVlLi4yNGMzOTU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0yODgsNyArMjg4LDcgQEAKICNpZmRlZiBDT05GSUdfTU1VCiBleHRlcm4gaW50IGlzX3ZtYWxsb2Nfb3JfbW9kdWxlX2FkZHIoY29uc3Qgdm9pZCAqeCk7CiAjZWxzZQotc3RhdGljIGludCBpc192bWFsbG9jX29yX21vZHVsZV9hZGRyKGNvbnN0IHZvaWQgKngpCitzdGF0aWMgaW5saW5lIGludCBpc192bWFsbG9jX29yX21vZHVsZV9hZGRyKGNvbnN0IHZvaWQgKngpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC02OTUsMTEgKzY5NSwxMiBAQAogI2RlZmluZSBWTV9GQVVMVF9TSUdCVVMJMHgwMDAyCiAjZGVmaW5lIFZNX0ZBVUxUX01BSk9SCTB4MDAwNAogI2RlZmluZSBWTV9GQVVMVF9XUklURQkweDAwMDgJLyogU3BlY2lhbCBjYXNlIGZvciBnZXRfdXNlcl9wYWdlcyAqLworI2RlZmluZSBWTV9GQVVMVF9IV1BPSVNPTiAweDAwMTAJLyogSGl0IHBvaXNvbmVkIHBhZ2UgKi8KIAogI2RlZmluZSBWTV9GQVVMVF9OT1BBR0UJMHgwMTAwCS8qIC0+ZmF1bHQgaW5zdGFsbGVkIHRoZSBwdGUsIG5vdCByZXR1cm4gcGFnZSAqLwogI2RlZmluZSBWTV9GQVVMVF9MT0NLRUQJMHgwMjAwCS8qIC0+ZmF1bHQgbG9ja2VkIHRoZSByZXR1cm5lZCBwYWdlICovCiAKLSNkZWZpbmUgVk1fRkFVTFRfRVJST1IJKFZNX0ZBVUxUX09PTSB8IFZNX0ZBVUxUX1NJR0JVUykKKyNkZWZpbmUgVk1fRkFVTFRfRVJST1IJKFZNX0ZBVUxUX09PTSB8IFZNX0ZBVUxUX1NJR0JVUyB8IFZNX0ZBVUxUX0hXUE9JU09OKQogCiAvKgogICogQ2FuIGJlIGNhbGxlZCBieSB0aGUgcGFnZWZhdWx0IGhhbmRsZXIgd2hlbiBpdCBnZXRzIGEgVk1fRkFVTFRfT09NLgpAQCAtNzkxLDggKzc5MiwxNCBAQAogCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgaG9sZWJlZ2luLCBob2xlbGVuLCAwKTsKIH0KIAotZXh0ZXJuIGludCB2bXRydW5jYXRlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb2ZmX3Qgb2Zmc2V0KTsKLWV4dGVybiBpbnQgdm10cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGVuZCk7CitleHRlcm4gdm9pZCB0cnVuY2F0ZV9wYWdlY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9sZCwgbG9mZl90IG5ldyk7CitleHRlcm4gaW50IHZtdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCk7CitleHRlcm4gaW50IHZtdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGVuZCk7CisKK2ludCB0cnVuY2F0ZV9pbm9kZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CitpbnQgZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHBhZ2UgKnBhZ2UpOworCitpbnQgaW52YWxpZGF0ZV9pbm9kZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIAogI2lmZGVmIENPTkZJR19NTVUKIGV4dGVybiBpbnQgaGFuZGxlX21tX2ZhdWx0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKQEAgLTEyNzksNyArMTI4Niw3IEBACiAjZGVmaW5lIGluX2dhdGVfYXJlYSh0YXNrLCBhZGRyKSAoeyh2b2lkKXRhc2s7IGluX2dhdGVfYXJlYV9ub190YXNrKGFkZHIpO30pCiAjZW5kaWYJLyogX19IQVZFX0FSQ0hfR0FURV9BUkVBICovCiAKLWludCBkcm9wX2NhY2hlc19zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKK2ludCBkcm9wX2NhY2hlc19zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIHVuc2lnbmVkIGxvbmcgc2hyaW5rX3NsYWIodW5zaWduZWQgbG9uZyBzY2FubmVkLCBnZnBfdCBnZnBfbWFzaywKIAkJCXVuc2lnbmVkIGxvbmcgbHJ1X3BhZ2VzKTsKQEAgLTEzMDgsNSArMTMxNSwxMiBAQAogZXh0ZXJuIGludCBhY2NvdW50X2xvY2tlZF9tZW1vcnkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBybGltaXQgKnJsaW0sCiAJCQkJIHNpemVfdCBzaXplKTsKIGV4dGVybiB2b2lkIHJlZnVuZF9sb2NrZWRfbWVtb3J5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzaXplX3Qgc2l6ZSk7CisKK2V4dGVybiB2b2lkIG1lbW9yeV9mYWlsdXJlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgdHJhcG5vKTsKK2V4dGVybiBpbnQgX19tZW1vcnlfZmFpbHVyZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IHRyYXBubywgaW50IHJlZik7CitleHRlcm4gaW50IHN5c2N0bF9tZW1vcnlfZmFpbHVyZV9lYXJseV9raWxsOworZXh0ZXJuIGludCBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfcmVjb3Zlcnk7CitleHRlcm4gYXRvbWljX2xvbmdfdCBtY2VfYmFkX3BhZ2VzOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9NTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKaW5kZXggMDA0MjA5MC4uODRhNTI0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaApAQCAtMTcxLDcgKzE3MSw3IEBACiAJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYTsJLyogU2VyaWFsaXplZCBieSBwYWdlX3RhYmxlX2xvY2sgKi8KIAogCS8qIEZ1bmN0aW9uIHBvaW50ZXJzIHRvIGRlYWwgd2l0aCB0aGlzIHN0cnVjdC4gKi8KLQlzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgKiB2bV9vcHM7CisJY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICp2bV9vcHM7CiAKIAkvKiBJbmZvcm1hdGlvbiBhYm91dCBvdXIgYmFja2luZyBzdG9yZTogKi8KIAl1bnNpZ25lZCBsb25nIHZtX3Bnb2ZmOwkJLyogT2Zmc2V0ICh3aXRoaW4gdm1fZmlsZSkgaW4gUEFHRV9TSVpFCkBAIC0yNDAsNiArMjQwLDggQEAKIAogCXVuc2lnbmVkIGxvbmcgc2F2ZWRfYXV4dltBVF9WRUNUT1JfU0laRV07IC8qIGZvciAvcHJvYy9QSUQvYXV4diAqLwogCisJc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10OworCiAJY3B1bWFza190IGNwdV92bV9tYXNrOwogCiAJLyogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIE1NIGNvbnRleHQgKi8KQEAgLTI1OSwxMSArMjYxLDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsgLyogTXVzdCB1c2UgYXRvbWljIGJpdG9wcyB0byBhY2Nlc3MgdGhlIGJpdHMgKi8KIAogCXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlOyAvKiBjb3JlZHVtcGluZyBzdXBwb3J0ICovCi0KLQkvKiBhaW8gYml0cyAqLworI2lmZGVmIENPTkZJR19BSU8KIAlzcGlubG9ja190CQlpb2N0eF9sb2NrOwogCXN0cnVjdCBobGlzdF9oZWFkCWlvY3R4X2xpc3Q7Ci0KKyNlbmRpZgogI2lmZGVmIENPTkZJR19NTV9PV05FUgogCS8qCiAJICogIm93bmVyIiBwb2ludHMgdG8gYSB0YXNrIHRoYXQgaXMgcmVnYXJkZWQgYXMgdGhlIGNhbm9uaWNhbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCmluZGV4IDgxYmI0MjMuLmVhZjM2MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgTElOVVhfTU1DX0hPU1RfSAogCiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY29yZS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCA2NTJlZjAxLi42Zjc1NjE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTc1NSwyMSArNzU1LDIwIEBACiAKIC8qIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gc2V0dXAgdGhlIHBlciB6b25lIHBhZ2VzIG1pbiB2YWx1ZXMgKi8KIHN0cnVjdCBjdGxfdGFibGU7Ci1zdHJ1Y3QgZmlsZTsKLWludCBtaW5fZnJlZV9rYnl0ZXNfc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosIAoraW50IG1pbl9mcmVlX2tieXRlc19zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIGV4dGVybiBpbnQgc3lzY3RsX2xvd21lbV9yZXNlcnZlX3JhdGlvW01BWF9OUl9aT05FUy0xXTsKLWludCBsb3dtZW1fcmVzZXJ2ZV9yYXRpb19zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKK2ludCBsb3dtZW1fcmVzZXJ2ZV9yYXRpb19zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKLWludCBwZXJjcHVfcGFnZWxpc3RfZnJhY3Rpb25fc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCitpbnQgcGVyY3B1X3BhZ2VsaXN0X2ZyYWN0aW9uX3N5c2N0bF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LAogCQkJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogaW50IHN5c2N0bF9taW5fdW5tYXBwZWRfcmF0aW9fc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCi0JCQlzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIGludCBzeXNjdGxfbWluX3NsYWJfcmF0aW9fc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCi0JCQlzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAogZXh0ZXJuIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCi0JCQlzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIGV4dGVybiBjaGFyIG51bWFfem9uZWxpc3Rfb3JkZXJbXTsKICNkZWZpbmUgTlVNQV9aT05FTElTVF9PUkRFUl9MRU4gMTYJLyogc3RyaW5nIGJ1ZmZlciBzaXplICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kdWxlLmggYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCmluZGV4IDFjNzU1YjIuLjQ4MmVmYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaApAQCAtMTI4LDcgKzEyOCwxMCBAQAogICovCiAjZGVmaW5lIE1PRFVMRV9MSUNFTlNFKF9saWNlbnNlKSBNT0RVTEVfSU5GTyhsaWNlbnNlLCBfbGljZW5zZSkKIAotLyogQXV0aG9yLCBpZGVhbGx5IG9mIGZvcm0gTkFNRVssIE5BTUVdKlsgYW5kIE5BTUVdICovCisvKgorICogQXV0aG9yKHMpLCB1c2UgIk5hbWUgPGVtYWlsPiIgb3IganVzdCAiTmFtZSIsIGZvciBtdWx0aXBsZQorICogYXV0aG9ycyB1c2UgbXVsdGlwbGUgTU9EVUxFX0FVVEhPUigpIHN0YXRlbWVudHMvbGluZXMuCisgKi8KICNkZWZpbmUgTU9EVUxFX0FVVEhPUihfYXV0aG9yKSBNT0RVTEVfSU5GTyhhdXRob3IsIF9hdXRob3IpCiAgIAogLyogV2hhdCB5b3VyIG1vZHVsZSBkb2VzLiAqLwpAQCAtMzA4LDEwICszMTEsMTQgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JLyogV2Uga2VlcCB0aGUgc3ltYm9sIGFuZCBzdHJpbmcgdGFibGVzIGZvciBrYWxsc3ltcy4gKi8KLQlFbGZfU3ltICpzeW10YWI7Ci0JdW5zaWduZWQgaW50IG51bV9zeW10YWI7Ci0JY2hhciAqc3RydGFiOworCS8qCisJICogV2Uga2VlcCB0aGUgc3ltYm9sIGFuZCBzdHJpbmcgdGFibGVzIGZvciBrYWxsc3ltcy4KKwkgKiBUaGUgY29yZV8qIGZpZWxkcyBiZWxvdyBhcmUgdGVtcG9yYXJ5LCBsb2FkZXItb25seSAodGhleQorCSAqIGNvdWxkIHJlYWxseSBiZSBkaXNjYXJkZWQgYWZ0ZXIgbW9kdWxlIGluaXQpLgorCSAqLworCUVsZl9TeW0gKnN5bXRhYiwgKmNvcmVfc3ltdGFiOworCXVuc2lnbmVkIGludCBudW1fc3ltdGFiLCBjb3JlX251bV9zeW1zOworCWNoYXIgKnN0cnRhYiwgKmNvcmVfc3RydGFiOwogCiAJLyogU2VjdGlvbiBhdHRyaWJ1dGVzICovCiAJc3RydWN0IG1vZHVsZV9zZWN0X2F0dHJzICpzZWN0X2F0dHJzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGVwYXJhbS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGVwYXJhbS5oCmluZGV4IDY1NDdjM2MuLjgyYTkxMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kdWxlcGFyYW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZXBhcmFtLmgKQEAgLTM3LDcgKzM3LDYgQEAKIHR5cGVkZWYgaW50ICgqcGFyYW1fZ2V0X2ZuKShjaGFyICpidWZmZXIsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKIAogLyogRmxhZyBiaXRzIGZvciBrZXJuZWxfcGFyYW0uZmxhZ3MgKi8KLSNkZWZpbmUgS1BBUkFNX0tNQUxMT0NFRAkxCiAjZGVmaW5lIEtQQVJBTV9JU0JPT0wJCTIKIAogc3RydWN0IGtlcm5lbF9wYXJhbSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21yb3V0ZS5oIGIvaW5jbHVkZS9saW51eC9tcm91dGUuaAppbmRleCAwZDQ1YjRlLi4wOGJjNzc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXJvdXRlLmgKQEAgLTE0NSwxNCArMTQ1LDE0IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKLWV4dGVybiBpbnQgaXBfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKiwgaW50LCBjaGFyIF9fdXNlciAqLCBpbnQpOworZXh0ZXJuIGludCBpcF9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqLCBpbnQsIGNoYXIgX191c2VyICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gaW50IGlwX21yb3V0ZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICosIGludCwgY2hhciBfX3VzZXIgKiwgaW50IF9fdXNlciAqKTsKIGV4dGVybiBpbnQgaXBtcl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwogZXh0ZXJuIGludCBpcF9tcl9pbml0KHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUKIGludCBpcF9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc29jaywKLQkJCSBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlyZXR1cm4gLUVOT1BST1RPT1BUOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tcm91dGU2LmggYi9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaAppbmRleCA0M2RjOTdlLi5iMTkxODY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaAorKysgYi9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaApAQCAtMTM0LDcgKzEzNCw3IEBACiBzdHJ1Y3Qgc29jazsKIAogI2lmZGVmIENPTkZJR19JUFY2X01ST1VURQotZXh0ZXJuIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKiwgaW50LCBjaGFyIF9fdXNlciAqLCBpbnQpOworZXh0ZXJuIGludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKiwgaW50LCBjaGFyIF9fdXNlciAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCBpcDZfbXJvdXRlX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKiwgaW50LCBjaGFyIF9fdXNlciAqLCBpbnQgX191c2VyICopOwogZXh0ZXJuIGludCBpcDZfbXJfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50IGlwNm1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7CkBAIC0xNDMsNyArMTQzLDcgQEAKICNlbHNlCiBzdGF0aWMgaW5saW5lCiBpbnQgaXA2X21yb3V0ZV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzb2NrLAotCQkJICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSAgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJcmV0dXJuIC1FTk9QUk9UT09QVDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0LmggYi9pbmNsdWRlL2xpbnV4L25ldC5oCmluZGV4IDkwNDBhMTAuLjUyOWEwOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMTc4LDExICsxNzgsMTEgQEAKIAlpbnQJCSgqbGlzdGVuKSAgICAoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxlbik7CiAJaW50CQkoKnNodXRkb3duKSAgKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBmbGFncyk7CiAJaW50CQkoKnNldHNvY2tvcHQpKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwKLQkJCQkgICAgICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CisJCQkJICAgICAgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogCWludAkJKCpnZXRzb2Nrb3B0KShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsCiAJCQkJICAgICAgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7CiAJaW50CQkoKmNvbXBhdF9zZXRzb2Nrb3B0KShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsCi0JCQkJICAgICAgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworCQkJCSAgICAgIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIAlpbnQJCSgqY29tcGF0X2dldHNvY2tvcHQpKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwKIAkJCQkgICAgICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKIAlpbnQJCSgqc2VuZG1zZykgICAoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLApAQCAtMjU2LDcgKzI1Niw3IEBACiBleHRlcm4gaW50IGtlcm5lbF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkgICAgIGNoYXIgKm9wdHZhbCwgaW50ICpvcHRsZW4pOwogZXh0ZXJuIGludCBrZXJuZWxfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICAgICBjaGFyICpvcHR2YWwsIGludCBvcHRsZW4pOworCQkJICAgICBjaGFyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogZXh0ZXJuIGludCBrZXJuZWxfc2VuZHBhZ2Uoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvZmZzZXQsCiAJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKIGV4dGVybiBpbnQga2VybmVsX3NvY2tfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwpAQCAtMzEzLDcgKzMxMyw3IEBACiBTT0NLQ0FMTF9XUkFQKG5hbWUsIGxpc3RlbiwgKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZW4pLCAoc29jaywgbGVuKSkgXAogU09DS0NBTExfV1JBUChuYW1lLCBzaHV0ZG93biwgKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBmbGFncyksIChzb2NrLCBmbGFncykpIFwKIFNPQ0tDQUxMX1dSQVAobmFtZSwgc2V0c29ja29wdCwgKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIFwKLQkJCSBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKSwgKHNvY2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikpIFwKKwkJCSBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKSwgKHNvY2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikpIFwKIFNPQ0tDQUxMX1dSQVAobmFtZSwgZ2V0c29ja29wdCwgKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIFwKIAkJCSBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pLCAoc29jaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKSkgXAogU09DS0NBTExfV1JBUChuYW1lLCBzZW5kbXNnLCAoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgbGVuKSwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggOTQ5NThjMS4uODEyYTVmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC01NTcsNyArNTU3LDcgQEAKICAqCUNhbGxiYWNrIHVzZXMgd2hlbiB0aGUgdHJhbnNtaXR0ZXIgaGFzIG5vdCBtYWRlIGFueSBwcm9ncmVzcwogICoJZm9yIGRldi0+d2F0Y2hkb2cgdGlja3MuCiAgKgotICogc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqICgqZ2V0X3N0YXRzKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyAqIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiAoKm5kb19nZXRfc3RhdHMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogICoJQ2FsbGVkIHdoZW4gYSB1c2VyIHdhbnRzIHRvIGdldCB0aGUgbmV0d29yayBkZXZpY2UgdXNhZ2UKICAqCXN0YXRpc3RpY3MuIElmIG5vdCBkZWZpbmVkLCB0aGUgY291bnRlcnMgaW4gZGV2LT5zdGF0cyB3aWxsCiAgKgliZSB1c2VkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKaW5kZXggNDhjZmU1MS4uNjEzMmI1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCkBAIC0yMjEsMTIgKzIyMSwxMiBAQAogCiAvKiBDYWxsIHNldHNvY2tvcHQoKSAqLwogaW50IG5mX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCB1X2ludDhfdCBwZiwgaW50IG9wdHZhbCwgY2hhciBfX3VzZXIgKm9wdCwKLQkJICBpbnQgbGVuKTsKKwkJICB1bnNpZ25lZCBpbnQgbGVuKTsKIGludCBuZl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgdV9pbnQ4X3QgcGYsIGludCBvcHR2YWwsIGNoYXIgX191c2VyICpvcHQsCiAJCSAgaW50ICpsZW4pOwogCiBpbnQgY29tcGF0X25mX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCB1X2ludDhfdCBwZiwgaW50IG9wdHZhbCwKLQkJY2hhciBfX3VzZXIgKm9wdCwgaW50IGxlbik7CisJCWNoYXIgX191c2VyICpvcHQsIHVuc2lnbmVkIGludCBsZW4pOwogaW50IGNvbXBhdF9uZl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgdV9pbnQ4X3QgcGYsIGludCBvcHR2YWwsCiAJCWNoYXIgX191c2VyICpvcHQsIGludCAqbGVuKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAppbmRleCAwODBmNmJhLi5hYjVkMzEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApAQCAtMTg3LDYgKzE4Nyw3IEBACiBleHRlcm4gdm9pZCBuZXRsaW5rX2tlcm5lbF9yZWxlYXNlKHN0cnVjdCBzb2NrICpzayk7CiBleHRlcm4gaW50IF9fbmV0bGlua19jaGFuZ2Vfbmdyb3VwcyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBncm91cHMpOwogZXh0ZXJuIGludCBuZXRsaW5rX2NoYW5nZV9uZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGdyb3Vwcyk7CitleHRlcm4gdm9pZCBfX25ldGxpbmtfY2xlYXJfbXVsdGljYXN0X3VzZXJzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGdyb3VwKTsKIGV4dGVybiB2b2lkIG5ldGxpbmtfY2xlYXJfbXVsdGljYXN0X3VzZXJzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGdyb3VwKTsKIGV4dGVybiB2b2lkIG5ldGxpbmtfYWNrKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgZXJyKTsKIGV4dGVybiBpbnQgbmV0bGlua19oYXNfbGlzdGVuZXJzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGdyb3VwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IGY2YjkwMjQuLmQwOWRiMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtNDAsNyArNDAsNiBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAppbmRleCAxM2RlNzg5Li42YjIwMmIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaApAQCAtNTEsNiArNTEsOSBAQAogICogUEdfYnVkZHkgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQgdGhlIHBhZ2UgaXMgZnJlZSBhbmQgaW4gdGhlIGJ1ZGR5IHN5c3RlbQogICogKHNlZSBtbS9wYWdlX2FsbG9jLmMpLgogICoKKyAqIFBHX2h3cG9pc29uIGluZGljYXRlcyB0aGF0IGEgcGFnZSBnb3QgY29ycnVwdGVkIGluIGhhcmR3YXJlIGFuZCBjb250YWlucworICogZGF0YSB3aXRoIGluY29ycmVjdCBFQ0MgYml0cyB0aGF0IHRyaWdnZXJlZCBhIG1hY2hpbmUgY2hlY2suIEFjY2Vzc2luZyBpcworICogbm90IHNhZmUgc2luY2UgaXQgbWF5IGNhdXNlIGFub3RoZXIgbWFjaGluZSBjaGVjay4gRG9uJ3QgdG91Y2ghCiAgKi8KIAogLyoKQEAgLTEwMiw2ICsxMDUsOSBAQAogI2lmZGVmIENPTkZJR19BUkNIX1VTRVNfUEdfVU5DQUNIRUQKIAlQR191bmNhY2hlZCwJCS8qIFBhZ2UgaGFzIGJlZW4gbWFwcGVkIGFzIHVuY2FjaGVkICovCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkUKKwlQR19od3BvaXNvbiwJCS8qIGhhcmR3YXJlIHBvaXNvbmVkIHBhZ2UuIERvbid0IHRvdWNoICovCisjZW5kaWYKIAlfX05SX1BBR0VGTEFHUywKIAogCS8qIEZpbGVzeXN0ZW1zICovCkBAIC0yNjksNiArMjc1LDE1IEBACiBQQUdFRkxBR19GQUxTRShVbmNhY2hlZCkKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX01FTU9SWV9GQUlMVVJFCitQQUdFRkxBRyhIV1BvaXNvbiwgaHdwb2lzb24pCitURVNUU0VURkxBRyhIV1BvaXNvbiwgaHdwb2lzb24pCisjZGVmaW5lIF9fUEdfSFdQT0lTT04gKDFVTCA8PCBQR19od3BvaXNvbikKKyNlbHNlCitQQUdFRkxBR19GQUxTRShIV1BvaXNvbikKKyNkZWZpbmUgX19QR19IV1BPSVNPTiAwCisjZW5kaWYKKwogc3RhdGljIGlubGluZSBpbnQgUGFnZVVwdG9kYXRlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWludCByZXQgPSB0ZXN0X2JpdChQR191cHRvZGF0ZSwgJihwYWdlKS0+ZmxhZ3MpOwpAQCAtMzkzLDcgKzQwOCw3IEBACiAJIDEgPDwgUEdfcHJpdmF0ZSB8IDEgPDwgUEdfcHJpdmF0ZV8yIHwgXAogCSAxIDw8IFBHX2J1ZGR5CSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgMSA8PCBQR19yZXNlcnZlZCB8IFwKIAkgMSA8PCBQR19zbGFiCSB8IDEgPDwgUEdfc3dhcGNhY2hlIHwgMSA8PCBQR19hY3RpdmUgfCBcCi0JIDEgPDwgUEdfdW5ldmljdGFibGUgfCBfX1BHX01MT0NLRUQpCisJIDEgPDwgUEdfdW5ldmljdGFibGUgfCBfX1BHX01MT0NLRUQgfCBfX1BHX0hXUE9JU09OKQogCiAvKgogICogRmxhZ3MgY2hlY2tlZCB3aGVuIGEgcGFnZSBpcyBwcmVwcGVkIGZvciByZXR1cm4gYnkgdGhlIHBhZ2UgYWxsb2NhdG9yLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oCmluZGV4IGFkYTc3OWYuLjRiOTM4ZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZV9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2VfY2dyb3VwLmgKQEAgLTM4LDYgKzM4LDcgQEAKIAlQQ0dfTE9DSywgIC8qIHBhZ2UgY2dyb3VwIGlzIGxvY2tlZCAqLwogCVBDR19DQUNIRSwgLyogY2hhcmdlZCBhcyBjYWNoZSAqLwogCVBDR19VU0VELCAvKiB0aGlzIG9iamVjdCBpcyBpbiB1c2UuICovCisJUENHX0FDQ1RfTFJVLCAvKiBwYWdlIGhhcyBiZWVuIGFjY291bnRlZCBmb3IgKi8KIH07CiAKICNkZWZpbmUgVEVTVFBDR0ZMQUcodW5hbWUsIGxuYW1lKQkJCVwKQEAgLTUyLDExICs1MywyMyBAQAogc3RhdGljIGlubGluZSB2b2lkIENsZWFyUGFnZUNncm91cCMjdW5hbWUoc3RydWN0IHBhZ2VfY2dyb3VwICpwYykJXAogCXsgY2xlYXJfYml0KFBDR18jI2xuYW1lLCAmcGMtPmZsYWdzKTsgIH0KIAorI2RlZmluZSBURVNUQ0xFQVJQQ0dGTEFHKHVuYW1lLCBsbmFtZSkJCQlcCitzdGF0aWMgaW5saW5lIGludCBUZXN0Q2xlYXJQYWdlQ2dyb3VwIyN1bmFtZShzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjKQlcCisJeyByZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KFBDR18jI2xuYW1lLCAmcGMtPmZsYWdzKTsgIH0KKwogLyogQ2FjaGUgZmxhZyBpcyBzZXQgb25seSBvbmNlIChhdCBhbGxvY2F0aW9uKSAqLwogVEVTVFBDR0ZMQUcoQ2FjaGUsIENBQ0hFKQorQ0xFQVJQQ0dGTEFHKENhY2hlLCBDQUNIRSkKK1NFVFBDR0ZMQUcoQ2FjaGUsIENBQ0hFKQogCiBURVNUUENHRkxBRyhVc2VkLCBVU0VEKQogQ0xFQVJQQ0dGTEFHKFVzZWQsIFVTRUQpCitTRVRQQ0dGTEFHKFVzZWQsIFVTRUQpCisKK1NFVFBDR0ZMQUcoQWNjdExSVSwgQUNDVF9MUlUpCitDTEVBUlBDR0ZMQUcoQWNjdExSVSwgQUNDVF9MUlUpCitURVNUUENHRkxBRyhBY2N0TFJVLCBBQ0NUX0xSVSkKK1RFU1RDTEVBUlBDR0ZMQUcoQWNjdExSVSwgQUNDVF9MUlUpCiAKIHN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfY2dyb3VwX25pZChzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCA3ODAzNTY1Li5iMGYwZjM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMzc5LDkgKzM3OSw2IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDYwMF9JREUJMHg0MzhjCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDcwMF9TQVRBCTB4NDM5MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9JWFA3MDBfSURFCTB4NDM5YwotLyogQU1EIFNCIENoaXBzZXQgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfU0I5MDBfSURFCSAweDc4MGMKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfU0I5MDBfU0FUQV9JREUgMHg3ODAwCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WTFNJCQkweDEwMDQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzU5MgkweDAwMDUKQEAgLTQ4NSw2ICs0ODIsOSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV9JQ09NX1YyX09ORV9QT1JUX1JWWF9PTkVfUE9SVF9NRE1fUENJRSAweDAzNjEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fSUNPTV9GT1VSX1BPUlRfTU9ERUwJMHgyNTIKIAorI2RlZmluZSBQQ0lfU1VCVkVORE9SX0lEX0lCTQkJMHgxMDE0CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfSUJNX1NBVFVSTl9TRVJJQUxfT05FX1BPUlQJMHgwM2Q0CisKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9VTklTWVMJCTB4MTAxOAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1VOSVNZU19ETUFfRElSRUNUT1IgMHgwMDFDCiAKQEAgLTU1Myw5ICs1NTMsMTAgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X1VEQyAgICAweDIwOTYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X1VPQyAgICAweDIwOTcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0lERSAgICAweDIwOUEKLQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9MWF9WSURFTyAgMHgyMDgxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xYX0FFUyAgICAweDIwODIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfSFVEU09OMl9JREUJCTB4NzgwYworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9IVURTT04yX1NBVEFfSURFCTB4NzgwMAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFJJREVOVAkJMHgxMDIzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFgJMHgyMDAwCkBAIC03NzYsNiArNzc3LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9YNTE1CQkweDgwMzYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9YWDEyCQkweDgwMzkKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9YWDEyX0ZNCTB4ODAzYgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJX1hJTzIwMDBBCTB4ODIzMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzExMzAJCTB4YWMxMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzEwMzEJCTB4YWMxMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJXzExMzEJCTB4YWMxNQpAQCAtMjE2MSw2ICsyMTYzLDEwIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURESURBVEFfQVBDSTc0MjBfMyAgICAgIDB4NzAwRAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FERElEQVRBX0FQQ0k3MzAwXzMgICAgICAweDcwMEUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BRERJREFUQV9BUENJNzgwMF8zICAgICAgMHg3MDBGCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURESURBVEFfQVBDSWU3MzAwICAgICAgIDB4NzAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FERElEQVRBX0FQQ0llNzQyMCAgICAgICAweDcwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BRERJREFUQV9BUENJZTc1MDAgICAgICAgMHg3MDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURESURBVEFfQVBDSWU3ODAwICAgICAgIDB4NzAxMwogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUERDCQkweDE1ZTkKIApAQCAtMjUyNyw2ICsyNTMzLDE2IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRTc1MjVfTUNICTB4MzU5ZQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfQ05CCTB4MzYwYgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZCRF9DTkIJMHgzNjBjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0YwCTB4MzcxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfSlNGMQkweDM3MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX0pTRjIJMHgzNzEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0YzCTB4MzcxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfSlNGNAkweDM3MTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX0pTRjUJMHgzNzE1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y2CTB4MzcxNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfSlNGNwkweDM3MTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX0pTRjgJMHgzNzE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y5CTB4MzcxOQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDEwXzAJMHgzYTE0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIMTBfMQkweDNhMTYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0gxMF8yCTB4M2ExOApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJmX2NvdW50ZXIuaCBiL2luY2x1ZGUvbGludXgvcGVyZl9jb3VudGVyLmgKaW5kZXggMzY4YmQ3MC4uN2I3ZmJmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJmX2NvdW50ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmZfY291bnRlci5oCkBAIC0zNjEsNyArMzYxLDcgQEAKIAkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOwogCSAqCXUzMgkJCQlwaWQsIHBwaWQ7CiAJICoJdTMyCQkJCXRpZCwgcHRpZDsKLQkgKgl7IHU2NAkJCQl0aW1lOyAgICAgfSAmJiBQRVJGX1NBTVBMRV9USU1FCisJICoJdTY0CQkJCXRpbWU7CiAJICogfTsKIAkgKi8KIAlQRVJGX0VWRU5UX0ZPUksJCQk9IDcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCmluZGV4IGFjZWZhZjcuLjllNzAxMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCkBAIC0zNTcsNyArMzU3LDcgQEAKIAkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOwogCSAqCXUzMgkJCQlwaWQsIHBwaWQ7CiAJICoJdTMyCQkJCXRpZCwgcHRpZDsKLQkgKgl7IHU2NAkJCQl0aW1lOyAgICAgfSAmJiBQRVJGX1NBTVBMRV9USU1FCisJICoJdTY0CQkJCXRpbWU7CiAJICogfTsKIAkgKi8KIAlQRVJGX1JFQ09SRF9GT1JLCQkJPSA3LApAQCAtNDQyLDYgKzQ0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogI2RlZmluZSBQRVJGX01BWF9TVEFDS19ERVBUSAkJMjU1CkBAIC00NzAsOCArNDcxLDggQEAKIAkJCXVuc2lnbmVkIGxvbmcJZXZlbnRfYmFzZTsKIAkJCWludAkJaWR4OwogCQl9OwotCQl1bmlvbiB7IC8qIHNvZnR3YXJlICovCi0JCQlhdG9taWM2NF90CWNvdW50OworCQlzdHJ1Y3QgeyAvKiBzb2Z0d2FyZSAqLworCQkJczY0CQlyZW1haW5pbmc7CiAJCQlzdHJ1Y3QgaHJ0aW1lcglocnRpbWVyOwogCQl9OwogCX07CkBAIC01MTMsNiArNTE0LDEwIEBACiAKIHN0cnVjdCBwZXJmX21tYXBfZGF0YSB7CiAJc3RydWN0IHJjdV9oZWFkCQkJcmN1X2hlYWQ7CisjaWZkZWYgQ09ORklHX1BFUkZfVVNFX1ZNQUxMT0MKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcms7CisjZW5kaWYKKwlpbnQJCQkJZGF0YV9vcmRlcjsKIAlpbnQJCQkJbnJfcGFnZXM7CS8qIG5yIG9mIGRhdGEgcGFnZXMgICovCiAJaW50CQkJCXdyaXRhYmxlOwkvKiBhcmUgd2Ugd3JpdGFibGUgICAqLwogCWludAkJCQlucl9sb2NrZWQ7CS8qIG5yIHBhZ2VzIG1sb2NrZWQgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bob25ldC5oIGIvaW5jbHVkZS9saW51eC9waG9uZXQuaAppbmRleCAxZWY1YTA3Li5lNTEyNmNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bob25ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGhvbmV0LmgKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgUE5QSVBFX0lGSU5ERVgJCTIKIAogI2RlZmluZSBQTkFERFJfQU5ZCQkwCisjZGVmaW5lIFBOQUREUl9CUk9BRENBU1QJMHhGQwogI2RlZmluZSBQTlBPUlRfUkVTT1VSQ0VfUk9VVElORwkwCiAKIC8qIFZhbHVlcyBmb3IgUE5QSVBFX0VOQ0FQIG9wdGlvbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb2xsLmggYi9pbmNsdWRlL2xpbnV4L3BvbGwuaAppbmRleCBmYTI4N2YyLi42NjczNzQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BvbGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BvbGwuaApAQCAtNiwxMCArNiwxMCBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKIC8qIH44MzIgYnl0ZXMgb2Ygc3RhY2sgc3BhY2UgdXNlZCBtYXggaW4gc3lzX3NlbGVjdC9zeXNfcG9sbCBiZWZvcmUgYWxsb2NhdGluZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaCBiL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmgKaW5kZXggNTk0YzQ5NC4uYjVkMDk2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oCkBAIC0zOSw2ICszOSwxMyBAQAogfTsKIAogZW51bSB7CisJUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1VOS05PV04gPSAwLAorCVBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FLAorCVBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UUklDS0xFLAorCVBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNULAorfTsKKworZW51bSB7CiAJUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOID0gMCwKIAlQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0QsCiAJUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVCwKQEAgLTU4LDkgKzY1LDE5IEBACiAJUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTGlNbiwKIH07CiAKK2VudW0geworCVBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9VTktOT1dOID0gMCwKKwlQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfQ1JJVElDQUwsCisJUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0xPVywKKwlQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTk9STUFMLAorCVBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9ISUdILAorCVBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9GVUxMLAorfTsKKwogZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgewogCS8qIFByb3BlcnRpZXMgb2YgdHlwZSBgaW50JyAqLwogCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUyA9IDAsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCiAJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAogCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCiAJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLApAQCAtODksNiArMTA2LDcgQEAKIAlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XLAogCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9BVkcsCiAJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksIC8qIGluIHBlcmNlbnRzISAqLworCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAogCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCiAJUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5ULAogCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XLApAQCAtMTI2LDYgKzE0NCw3IEBACiAJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpOwogCXZvaWQgKCpleHRlcm5hbF9wb3dlcl9jaGFuZ2VkKShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpOworCXZvaWQgKCpzZXRfY2hhcmdlZCkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KTsKIAogCS8qIEZvciBBUE0gZW11bGF0aW9uLCB0aGluayBsZWdhY3kgdXNlcnNwYWNlLiAqLwogCWludCB1c2VfZm9yX2FwbTsKQEAgLTE2NSw4ICsxODQsMTAgQEAKIAlpbnQgdXNlX2Zvcl9hcG07CiB9OwogCitleHRlcm4gc3RydWN0IHBvd2VyX3N1cHBseSAqcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgcG93ZXJfc3VwcGx5X2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KTsKIGV4dGVybiBpbnQgcG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KTsKK2V4dGVybiBpbnQgcG93ZXJfc3VwcGx5X3NldF9iYXR0ZXJ5X2NoYXJnZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1BPV0VSX1NVUFBMWSkgfHwgZGVmaW5lZChDT05GSUdfUE9XRVJfU1VQUExZX01PRFVMRSkKIGV4dGVybiBpbnQgcG93ZXJfc3VwcGx5X2lzX3N5c3RlbV9zdXBwbGllZCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJjdGwuaCBiL2luY2x1ZGUvbGludXgvcHJjdGwuaAppbmRleCAwN2JmZjY2Li5hM2JhZWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmN0bC5oCkBAIC04OCw0ICs4OCwxOCBAQAogI2RlZmluZSBQUl9UQVNLX1BFUkZfRVZFTlRTX0RJU0FCTEUJCTMxCiAjZGVmaW5lIFBSX1RBU0tfUEVSRl9FVkVOVFNfRU5BQkxFCQkzMgogCisvKgorICogU2V0IGVhcmx5L2xhdGUga2lsbCBtb2RlIGZvciBod3BvaXNvbiBtZW1vcnkgY29ycnVwdGlvbi4KKyAqIFRoaXMgaW5mbHVlbmNlcyB3aGVuIHRoZSBwcm9jZXNzIGdldHMga2lsbGVkIG9uIGEgbWVtb3J5IGNvcnJ1cHRpb24uCisgKi8KKyNkZWZpbmUgUFJfTUNFX0tJTEwJMzMKKyMgZGVmaW5lIFBSX01DRV9LSUxMX0NMRUFSICAgMAorIyBkZWZpbmUgUFJfTUNFX0tJTExfU0VUICAgICAxCisKKyMgZGVmaW5lIFBSX01DRV9LSUxMX0xBVEUgICAgMAorIyBkZWZpbmUgUFJfTUNFX0tJTExfRUFSTFkgICAxCisjIGRlZmluZSBQUl9NQ0VfS0lMTF9ERUZBVUxUIDIKKworI2RlZmluZSBQUl9NQ0VfS0lMTF9HRVQgMzQKKwogI2VuZGlmIC8qIF9MSU5VWF9QUkNUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhbWZzLmggYi9pbmNsdWRlL2xpbnV4L3JhbWZzLmgKaW5kZXggMzdhYWYyYi4uNGU3NjhkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYW1mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFtZnMuaApAQCAtMTcsNyArMTcsNyBAQAogI2VuZGlmCiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfb3BlcmF0aW9uczsKLWV4dGVybiBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ2VuZXJpY19maWxlX3ZtX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ2VuZXJpY19maWxlX3ZtX29wczsKIGV4dGVybiBpbnQgX19pbml0IGluaXRfcm9vdGZzKHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaCBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAppbmRleCA2ZmUwMzYzLi4zZWJkMGI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCkBAIC03Nyw3ICs3Nyw3IEBACiAjZXJyb3IgIlVua25vd24gUkNVIGltcGxlbWVudGF0aW9uIHNwZWNpZmllZCB0byBrZXJuZWwgY29uZmlndXJhdGlvbiIKICNlbmRpZgogCi0jZGVmaW5lIFJDVV9IRUFEX0lOSVQgCXsgLm5leHQgPSBOVUxMLCAuZnVuYyA9IE5VTEwgfQorI2RlZmluZSBSQ1VfSEVBRF9JTklUCXsgLm5leHQgPSBOVUxMLCAuZnVuYyA9IE5VTEwgfQogI2RlZmluZSBSQ1VfSEVBRChoZWFkKSBzdHJ1Y3QgcmN1X2hlYWQgaGVhZCA9IFJDVV9IRUFEX0lOSVQKICNkZWZpbmUgSU5JVF9SQ1VfSEVBRChwdHIpIGRvIHsgXAogICAgICAgIChwdHIpLT5uZXh0ID0gTlVMTDsgKHB0ciktPmZ1bmMgPSBOVUxMOyBcCkBAIC0xMjksMTIgKzEyOSw2IEBACiAJcmN1X3JlYWRfYWNxdWlyZSgpOwogfQogCi0vKioKLSAqIHJjdV9yZWFkX3VubG9jayAtIG1hcmtzIHRoZSBlbmQgb2YgYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLgotICoKLSAqIFNlZSByY3VfcmVhZF9sb2NrKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLQogLyoKICAqIFNvIHdoZXJlIGlzIHJjdV93cml0ZV9sb2NrKCk/ICBJdCBkb2VzIG5vdCBleGlzdCwgYXMgdGhlcmUgaXMgbm8KICAqIHdheSBmb3Igd3JpdGVycyB0byBsb2NrIG91dCBSQ1UgcmVhZGVycy4gIFRoaXMgaXMgYSBmZWF0dXJlLCBub3QKQEAgLTE0NCw2ICsxMzgsMTIgQEAKICAqIHVzZWQgYXMgd2VsbC4gIFJDVSBkb2VzIG5vdCBjYXJlIGhvdyB0aGUgd3JpdGVycyBrZWVwIG91dCBvZiBlYWNoCiAgKiBvdGhlcnMnIHdheSwgYXMgbG9uZyBhcyB0aGV5IGRvIHNvLgogICovCisKKy8qKgorICogcmN1X3JlYWRfdW5sb2NrIC0gbWFya3MgdGhlIGVuZCBvZiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uCisgKgorICogU2VlIHJjdV9yZWFkX2xvY2soKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLwogc3RhdGljIGlubGluZSB2b2lkIHJjdV9yZWFkX3VubG9jayh2b2lkKQogewogCXJjdV9yZWFkX3JlbGVhc2UoKTsKQEAgLTE5Niw2ICsxOTYsOCBAQAogCV9fYWNxdWlyZShSQ1VfU0NIRUQpOwogCXJjdV9yZWFkX2FjcXVpcmUoKTsKIH0KKworLyogVXNlZCBieSBsb2NrZGVwIGFuZCB0cmFjaW5nOiBjYW5ub3QgYmUgdHJhY2VkLCBjYW5ub3QgY2FsbCBsb2NrZGVwLiAqLwogc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgcmN1X3JlYWRfbG9ja19zY2hlZF9ub3RyYWNlKHZvaWQpCiB7CiAJcHJlZW1wdF9kaXNhYmxlX25vdHJhY2UoKTsKQEAgLTIxMyw2ICsyMTUsOCBAQAogCV9fcmVsZWFzZShSQ1VfU0NIRUQpOwogCXByZWVtcHRfZW5hYmxlKCk7CiB9CisKKy8qIFVzZWQgYnkgbG9ja2RlcCBhbmQgdHJhY2luZzogY2Fubm90IGJlIHRyYWNlZCwgY2Fubm90IGNhbGwgbG9ja2RlcC4gKi8KIHN0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIHJjdV9yZWFkX3VubG9ja19zY2hlZF9ub3RyYWNlKHZvaWQpCiB7CiAJX19yZWxlYXNlKFJDVV9TQ0hFRCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCmluZGV4IDM3NjgyNzcuLjk2NDJjNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oCkBAIC0zMCwxMCArMzAsMTQgQEAKICNpZm5kZWYgX19MSU5VWF9SQ1VUUkVFX0gKICNkZWZpbmUgX19MSU5VWF9SQ1VUUkVFX0gKIAorc3RydWN0IG5vdGlmaWVyX2Jsb2NrOworCiBleHRlcm4gdm9pZCByY3Vfc2NoZWRfcXMoaW50IGNwdSk7CiBleHRlcm4gdm9pZCByY3VfYmhfcXMoaW50IGNwdSk7Ci0KK2V4dGVybiBpbnQgcmN1X2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSk7CiBleHRlcm4gaW50IHJjdV9uZWVkc19jcHUoaW50IGNwdSk7CitleHRlcm4gaW50IHJjdV9leHBlZGl0ZWRfdG9ydHVyZV9zdGF0cyhjaGFyICpwYWdlKTsKIAogI2lmZGVmIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVCiAKQEAgLTcyLDExICs3Niw3IEBACiAKIGV4dGVybiB2b2lkIGNhbGxfcmN1X3NjaGVkKHN0cnVjdCByY3VfaGVhZCAqaGVhZCwKIAkJCSAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZCh2b2lkKQotewotCXN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCgpOwotfQorZXh0ZXJuIHZvaWQgc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZCh2b2lkKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHN5bmNocm9uaXplX3JjdV9iaF9leHBlZGl0ZWQodm9pZCkKIHsKQEAgLTg1LDE2ICs4NSwxMSBAQAogCiBleHRlcm4gdm9pZCBfX3JjdV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgcmN1X2NoZWNrX2NhbGxiYWNrcyhpbnQgY3B1LCBpbnQgdXNlcik7Ci1leHRlcm4gdm9pZCByY3VfcmVzdGFydF9jcHUoaW50IGNwdSk7CiAKIGV4dGVybiBsb25nIHJjdV9iYXRjaGVzX2NvbXBsZXRlZCh2b2lkKTsKIGV4dGVybiBsb25nIHJjdV9iYXRjaGVzX2NvbXBsZXRlZF9iaCh2b2lkKTsKIGV4dGVybiBsb25nIHJjdV9iYXRjaGVzX2NvbXBsZXRlZF9zY2hlZCh2b2lkKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHJjdV9pbml0X3NjaGVkKHZvaWQpCi17Ci19Ci0KICNpZmRlZiBDT05GSUdfTk9fSFoKIHZvaWQgcmN1X2VudGVyX25vaHoodm9pZCk7CiB2b2lkIHJjdV9leGl0X25vaHoodm9pZCk7CkBAIC0xMDcsNyArMTAyLDcgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfTk9fSFogKi8KIAotLyogQSBjb250ZXh0IHN3aXRjaCBpcyBhIGdyYWNlIHBlcmlvZCBmb3IgcmN1dHJlZS4gKi8KKy8qIEEgY29udGV4dCBzd2l0Y2ggaXMgYSBncmFjZSBwZXJpb2QgZm9yIFJDVS1zY2hlZCBhbmQgUkNVLWJoLiAqLwogc3RhdGljIGlubGluZSBpbnQgcmN1X2Jsb2NraW5nX2lzX2dwKHZvaWQpCiB7CiAJcmV0dXJuIG51bV9vbmxpbmVfY3B1cygpID09IDE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlbGF5LmggYi9pbmNsdWRlL2xpbnV4L3JlbGF5LmgKaW5kZXggOTUzZmMwNS4uMTRhODZiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWxheS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVsYXkuaApAQCAtMTQwLDcgKzE0MCw3IEBACiAJICogY2F1c2UgcmVsYXlfb3BlbigpIHRvIGNyZWF0ZSBhIHNpbmdsZSBnbG9iYWwgYnVmZmVyIHJhdGhlcgogCSAqIHRoYW4gdGhlIGRlZmF1bHQgc2V0IG9mIHBlci1jcHUgYnVmZmVycy4KIAkgKgotCSAqIFNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JlbGF5ZnMudHh0IGZvciBtb3JlIGluZm8uCisJICogU2VlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmVsYXkudHh0IGZvciBtb3JlIGluZm8uCiAJICovCiAJc3RydWN0IGRlbnRyeSAqKCpjcmVhdGVfYnVmX2ZpbGUpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJCQkgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVzX2NvdW50ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVzX2NvdW50ZXIuaAppbmRleCA1MTFmNDJmLi5mY2I5ODg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Jlc19jb3VudGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZXNfY291bnRlci5oCkBAIC0zNSw2ICszNSwxMCBAQAogCSAqLwogCXVuc2lnbmVkIGxvbmcgbG9uZyBsaW1pdDsKIAkvKgorCSAqIHRoZSBsaW1pdCB0aGF0IHVzYWdlIGNhbiBiZSBleGNlZWQKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgc29mdF9saW1pdDsKKwkvKgogCSAqIHRoZSBudW1iZXIgb2YgdW5zdWNjZXNzZnVsIGF0dGVtcHRzIHRvIGNvbnN1bWUgdGhlIHJlc291cmNlCiAJICovCiAJdW5zaWduZWQgbG9uZyBsb25nIGZhaWxjbnQ7CkBAIC04Nyw2ICs5MSw3IEBACiAJUkVTX01BWF9VU0FHRSwKIAlSRVNfTElNSVQsCiAJUkVTX0ZBSUxDTlQsCisJUkVTX1NPRlRfTElNSVQsCiB9OwogCiAvKgpAQCAtMTMyLDYgKzEzNywzNiBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHJlc19jb3VudGVyX3NvZnRfbGltaXRfY2hlY2tfbG9ja2VkKHN0cnVjdCByZXNfY291bnRlciAqY250KQoreworCWlmIChjbnQtPnVzYWdlIDwgY250LT5zb2Z0X2xpbWl0KQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBHZXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdXNhZ2UgYW5kIHRoZSBzb2Z0IGxpbWl0CisgKiBAY250OiBUaGUgY291bnRlcgorICoKKyAqIFJldHVybnMgMCBpZiB1c2FnZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gc29mdCBsaW1pdAorICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB1c2FnZSBhbmQgc29mdCBsaW1pdCwgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworcmVzX2NvdW50ZXJfc29mdF9saW1pdF9leGNlc3Moc3RydWN0IHJlc19jb3VudGVyICpjbnQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGV4Y2VzczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNudC0+bG9jaywgZmxhZ3MpOworCWlmIChjbnQtPnVzYWdlIDw9IGNudC0+c29mdF9saW1pdCkKKwkJZXhjZXNzID0gMDsKKwllbHNlCisJCWV4Y2VzcyA9IGNudC0+dXNhZ2UgLSBjbnQtPnNvZnRfbGltaXQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY250LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGV4Y2VzczsKK30KKwogLyoKICAqIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlY3QgaWYgdGhlIGNncm91cCBpcyB3aXRoaW4gaXQncyBsaW1pdCBvcgogICogbm90LiBJdCdzIGN1cnJlbnRseSBjYWxsZWQgZnJvbSBjZ3JvdXBfcnNzX3ByZXBhcmUoKQpAQCAtMTQ3LDYgKzE4MiwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCByZXNfY291bnRlcl9jaGVja191bmRlcl9zb2Z0X2xpbWl0KHN0cnVjdCByZXNfY291bnRlciAqY250KQoreworCWJvb2wgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY250LT5sb2NrLCBmbGFncyk7CisJcmV0ID0gcmVzX2NvdW50ZXJfc29mdF9saW1pdF9jaGVja19sb2NrZWQoY250KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbnQtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVzX2NvdW50ZXJfcmVzZXRfbWF4KHN0cnVjdCByZXNfY291bnRlciAqY250KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xODAsNCArMjI2LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK3Jlc19jb3VudGVyX3NldF9zb2Z0X2xpbWl0KHN0cnVjdCByZXNfY291bnRlciAqY250LAorCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzb2Z0X2xpbWl0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY250LT5sb2NrLCBmbGFncyk7CisJY250LT5zb2Z0X2xpbWl0ID0gc29mdF9saW1pdDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbnQtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JtYXAuaCBiL2luY2x1ZGUvbGludXgvcm1hcC5oCmluZGV4IDQ3Nzg0MWQuLmNiMGJhNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcm1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcm1hcC5oCkBAIC04MSw3ICs4MSwxOSBAQAogICovCiBpbnQgcGFnZV9yZWZlcmVuY2VkKHN0cnVjdCBwYWdlICosIGludCBpc19sb2NrZWQsCiAJCQlzdHJ1Y3QgbWVtX2Nncm91cCAqY250LCB1bnNpZ25lZCBsb25nICp2bV9mbGFncyk7Ci1pbnQgdHJ5X3RvX3VubWFwKHN0cnVjdCBwYWdlICosIGludCBpZ25vcmVfcmVmcyk7CitlbnVtIHR0dV9mbGFncyB7CisJVFRVX1VOTUFQID0gMCwJCQkvKiB1bm1hcCBtb2RlICovCisJVFRVX01JR1JBVElPTiA9IDEsCQkvKiBtaWdyYXRpb24gbW9kZSAqLworCVRUVV9NVU5MT0NLID0gMiwJCS8qIG11bmxvY2sgbW9kZSAqLworCVRUVV9BQ1RJT05fTUFTSyA9IDB4ZmYsCisKKwlUVFVfSUdOT1JFX01MT0NLID0gKDEgPDwgOCksCS8qIGlnbm9yZSBtbG9jayAqLworCVRUVV9JR05PUkVfQUNDRVNTID0gKDEgPDwgOSksCS8qIGRvbid0IGFnZSAqLworCVRUVV9JR05PUkVfSFdQT0lTT04gPSAoMSA8PCAxMCksLyogY29ycnVwdGVkIHBhZ2UgaXMgcmVjb3ZlcmFibGUgKi8KK307CisjZGVmaW5lIFRUVV9BQ1RJT04oeCkgKCh4KSAmIFRUVV9BQ1RJT05fTUFTSykKKworaW50IHRyeV90b191bm1hcChzdHJ1Y3QgcGFnZSAqLCBlbnVtIHR0dV9mbGFncyBmbGFncyk7CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSBtbS9maWxlbWFwX3hpcC5jIHRvIHVubWFwIGVtcHR5IHplcm8gcGFnZQpAQCAtMTA4LDYgKzEyMCwxMyBAQAogICovCiBpbnQgdHJ5X3RvX211bmxvY2soc3RydWN0IHBhZ2UgKik7CiAKKy8qCisgKiBDYWxsZWQgYnkgbWVtb3J5LWZhaWx1cmUuYyB0byBraWxsIHByb2Nlc3Nlcy4KKyAqLworc3RydWN0IGFub25fdm1hICpwYWdlX2xvY2tfYW5vbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UpOwordm9pZCBwYWdlX3VubG9ja19hbm9uX3ZtYShzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKTsKK2ludCBwYWdlX21hcHBlZF9pbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKwogI2Vsc2UJLyogIUNPTkZJR19NTVUgKi8KIAogI2RlZmluZSBhbm9uX3ZtYV9pbml0KCkJCWRvIHt9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IGNiZjJhM2IuLjc1ZTZlNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTMwOSw3ICszMDksNyBAQAogZXh0ZXJuIHZvaWQgdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZyh2b2lkKTsKIGV4dGVybiB2b2lkIHRvdWNoX2FsbF9zb2Z0bG9ja3VwX3dhdGNoZG9ncyh2b2lkKTsKIGV4dGVybiBpbnQgcHJvY19kb3NvZnRsb2NrdXBfdGhyZXNoKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJICAgIHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCSAgICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CiBleHRlcm4gdW5zaWduZWQgaW50ICBzb2Z0bG9ja3VwX3BhbmljOwogZXh0ZXJuIGludCBzb2Z0bG9ja3VwX3RocmVzaDsKQEAgLTMzMSw3ICszMzEsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3lzY3RsX2h1bmdfdGFza190aW1lb3V0X3NlY3M7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNjdGxfaHVuZ190YXNrX3dhcm5pbmdzOwogZXh0ZXJuIGludCBwcm9jX2RvaHVuZ190YXNrX3RpbWVvdXRfc2VjcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJCQkgc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsCisJCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCQkgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOwogI2VuZGlmCiAKQEAgLTEyNzEsNyArMTI3MSw2IEBACiAJc3RydWN0IG1tX3N0cnVjdCAqbW0sICphY3RpdmVfbW07CiAKIC8qIHRhc2sgc3RhdGUgKi8KLQlzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQ7CiAJaW50IGV4aXRfc3RhdGU7CiAJaW50IGV4aXRfY29kZSwgZXhpdF9zaWduYWw7CiAJaW50IHBkZWF0aF9zaWduYWw7ICAvKiAgVGhlIHNpZ25hbCBzZW50IHdoZW4gdGhlIHBhcmVudCBkaWVzICAqLwpAQCAtMTczNSw2ICsxNzM0LDcgQEAKICNkZWZpbmUgUEZfRVhJVFBJRE9ORQkweDAwMDAwMDA4CS8qIHBpIGV4aXQgZG9uZSBvbiBzaHV0IGRvd24gKi8KICNkZWZpbmUgUEZfVkNQVQkJMHgwMDAwMDAxMAkvKiBJJ20gYSB2aXJ0dWFsIENQVSAqLwogI2RlZmluZSBQRl9GT1JLTk9FWEVDCTB4MDAwMDAwNDAJLyogZm9ya2VkIGJ1dCBkaWRuJ3QgZXhlYyAqLworI2RlZmluZSBQRl9NQ0VfUFJPQ0VTUyAgMHgwMDAwMDA4MCAgICAgIC8qIHByb2Nlc3MgcG9saWN5IG9uIG1jZSBlcnJvcnMgKi8KICNkZWZpbmUgUEZfU1VQRVJQUklWCTB4MDAwMDAxMDAJLyogdXNlZCBzdXBlci11c2VyIHByaXZpbGVnZXMgKi8KICNkZWZpbmUgUEZfRFVNUENPUkUJMHgwMDAwMDIwMAkvKiBkdW1wZWQgY29yZSAqLwogI2RlZmluZSBQRl9TSUdOQUxFRAkweDAwMDAwNDAwCS8qIGtpbGxlZCBieSBhIHNpZ25hbCAqLwpAQCAtMTc1NCw2ICsxNzU0LDcgQEAKICNkZWZpbmUgUEZfU1BSRUFEX1BBR0UJMHgwMTAwMDAwMAkvKiBTcHJlYWQgcGFnZSBjYWNoZSBvdmVyIGNwdXNldCAqLwogI2RlZmluZSBQRl9TUFJFQURfU0xBQgkweDAyMDAwMDAwCS8qIFNwcmVhZCBzb21lIHNsYWIgY2FjaGVzIG92ZXIgY3B1c2V0ICovCiAjZGVmaW5lIFBGX1RIUkVBRF9CT1VORAkweDA0MDAwMDAwCS8qIFRocmVhZCBib3VuZCB0byBzcGVjaWZpYyBjcHUgKi8KKyNkZWZpbmUgUEZfTUNFX0VBUkxZICAgIDB4MDgwMDAwMDAgICAgICAvKiBFYXJseSBraWxsIGZvciBtY2UgcHJvY2VzcyBwb2xpY3kgKi8KICNkZWZpbmUgUEZfTUVNUE9MSUNZCTB4MTAwMDAwMDAJLyogTm9uLWRlZmF1bHQgTlVNQSBtZW1wb2xpY3kgKi8KICNkZWZpbmUgUEZfTVVURVhfVEVTVEVSCTB4MjAwMDAwMDAJLyogVGhyZWFkIGJlbG9uZ3MgdG8gdGhlIHJ0IG11dGV4IHRlc3RlciAqLwogI2RlZmluZSBQRl9GUkVFWkVSX1NLSVAJMHg0MDAwMDAwMAkvKiBGcmVlemVyIHNob3VsZCBub3QgY291bnQgaXQgYXMgZnJlZXplYWJsZSAqLwpAQCAtMTgxNywxMCArMTgxOCwxMyBAQAogCXJldHVybiAwOwogfQogI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0sKIHN0YXRpYyBpbmxpbmUgaW50IHNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjcHVtYXNrX3QgbmV3X21hc2spCiB7CiAJcmV0dXJuIHNldF9jcHVzX2FsbG93ZWRfcHRyKHAsICZuZXdfbWFzayk7CiB9CisjZW5kaWYKIAogLyoKICAqIEFyY2hpdGVjdHVyZXMgY2FuIHNldCB0aGlzIHRvIDEgaWYgdGhleSBoYXZlIHNwZWNpZmllZApAQCAtMTkwMyw3ICsxOTA3LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3RpbWVyX21pZ3JhdGlvbjsKIAogaW50IHNjaGVkX25yX2xhdGVuY3lfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsCisJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLAogCQlsb2ZmX3QgKnBwb3MpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCkBAIC0xOTIxLDcgKzE5MjUsNyBAQAogZXh0ZXJuIGludCBzeXNjdGxfc2NoZWRfcnRfcnVudGltZTsKIAogaW50IHNjaGVkX3J0X2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpOwogCiBleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9jb21wYXRfeWllbGQ7CkBAIC0yMDU2LDYgKzIwNjAsNyBAQAogZXh0ZXJuIGludCBraWxsX3BpZChzdHJ1Y3QgcGlkICpwaWQsIGludCBzaWcsIGludCBwcml2KTsKIGV4dGVybiBpbnQga2lsbF9wcm9jX2luZm8oaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqLCBwaWRfdCk7CiBleHRlcm4gaW50IGRvX25vdGlmeV9wYXJlbnQoc3RydWN0IHRhc2tfc3RydWN0ICosIGludCk7CitleHRlcm4gdm9pZCBfX3dha2VfdXBfcGFyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQpOwogZXh0ZXJuIHZvaWQgZm9yY2Vfc2lnKGludCwgc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgZm9yY2Vfc2lnX3NwZWNpZmljKGludCwgc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIGludCBzZW5kX3NpZyhpbnQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBpbnQpOwpAQCAtMjMzMyw3ICsyMzM4LDEwIEBACiAJcmV0dXJuIHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTsKIH0KIAotZXh0ZXJuIGludCBfX2ZhdGFsX3NpZ25hbF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CitzdGF0aWMgaW5saW5lIGludCBfX2ZhdGFsX3NpZ25hbF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gdW5saWtlbHkoc2lnaXNtZW1iZXIoJnAtPnBlbmRpbmcuc2lnbmFsLCBTSUdLSUxMKSk7Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGZhdGFsX3NpZ25hbF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaCBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAppbmRleCBkMDUwYjY2Li4yMzllNDBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKKysrIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJcmV0dXJuIFBBR0VfQUxJR04obW1hcF9taW5fYWRkcik7CiAJcmV0dXJuIGhpbnQ7CiB9Ci1leHRlcm4gaW50IG1tYXBfbWluX2FkZHJfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2V4dGVybiBpbnQgbW1hcF9taW5fYWRkcl9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQkJIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKIAogI2lmZGVmIENPTkZJR19TRUNVUklUWQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXFfZmlsZS5oIGIvaW5jbHVkZS9saW51eC9zZXFfZmlsZS5oCmluZGV4IDBjNmE4NmIuLjgzNjZkOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VxX2ZpbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcV9maWxlLmgKQEAgLTM1LDYgKzM1LDQ0IEBACiAKICNkZWZpbmUgU0VRX1NLSVAgMQogCisvKioKKyAqIHNlcV9nZXRfYnVmIC0gZ2V0IGJ1ZmZlciB0byB3cml0ZSBhcmJpdHJhcnkgZGF0YSB0bworICogQG06IHRoZSBzZXFfZmlsZSBoYW5kbGUKKyAqIEBidWZwOiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgaXMgc3RvcmVkIGhlcmUKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciwgb3IgemVybyBpZgorICogdGhlcmUncyBubyBzcGFjZS4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3Qgc2VxX2dldF9idWYoc3RydWN0IHNlcV9maWxlICptLCBjaGFyICoqYnVmcCkKK3sKKwlCVUdfT04obS0+Y291bnQgPiBtLT5zaXplKTsKKwlpZiAobS0+Y291bnQgPCBtLT5zaXplKQorCQkqYnVmcCA9IG0tPmJ1ZiArIG0tPmNvdW50OworCWVsc2UKKwkJKmJ1ZnAgPSBOVUxMOworCisJcmV0dXJuIG0tPnNpemUgLSBtLT5jb3VudDsKK30KKworLyoqCisgKiBzZXFfY29tbWl0IC0gY29tbWl0IGRhdGEgdG8gdGhlIGJ1ZmZlcgorICogQG06IHRoZSBzZXFfZmlsZSBoYW5kbGUKKyAqIEBudW06IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29tbWl0CisgKgorICogQ29tbWl0IEBudW0gYnl0ZXMgb2YgZGF0YSB3cml0dGVuIHRvIGEgYnVmZmVyIHByZXZpb3VzbHkgYWNxdWlyZWQKKyAqIGJ5IHNlcV9idWZfZ2V0LiAgVG8gc2lnbmFsIGFuIGVycm9yIGNvbmRpdGlvbiwgb3IgdGhhdCB0aGUgZGF0YQorICogZGlkbid0IGZpdCBpbiB0aGUgYXZhaWxhYmxlIHNwYWNlLCBwYXNzIGEgbmVnYXRpdmUgQG51bSB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNlcV9jb21taXQoc3RydWN0IHNlcV9maWxlICptLCBpbnQgbnVtKQoreworCWlmIChudW0gPCAwKSB7CisJCW0tPmNvdW50ID0gbS0+c2l6ZTsKKwl9IGVsc2UgeworCQlCVUdfT04obS0+Y291bnQgKyBudW0gPiBtLT5zaXplKTsKKwkJbS0+Y291bnQgKz0gbnVtOworCX0KK30KKwogY2hhciAqbWFuZ2xlX3BhdGgoY2hhciAqcywgY2hhciAqcCwgY2hhciAqZXNjKTsKIGludCBzZXFfb3BlbihzdHJ1Y3QgZmlsZSAqLCBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgKik7CiBzc2l6ZV90IHNlcV9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4IGQ1OGU0NjAuLmRiNTMyY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTE3Niw2ICsxNzYsOSBAQAogLyogUXVhbGNvbW0gTVNNIFNvQ3MgKi8KICNkZWZpbmUgUE9SVF9NU00JODgKIAorLyogQkNNNjN4eCBmYW1pbHkgU29DcyAqLworI2RlZmluZSBQT1JUX0JDTTYzWFgJODkKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CkBAIC00NzcsNyArNDgwLDcgQEAKIAogLyoqCiAgKgl1YXJ0X2hhbmRsZV9kY2RfY2hhbmdlIC0gaGFuZGxlIGEgY2hhbmdlIG9mIGNhcnJpZXIgZGV0ZWN0IHN0YXRlCi0gKglAcG9ydDogdWFydF9wb3J0IHN0cnVjdHVyZSBmb3IgdGhlIG9wZW4gcG9ydAorICoJQHVwb3J0OiB1YXJ0X3BvcnQgc3RydWN0dXJlIGZvciB0aGUgb3BlbiBwb3J0CiAgKglAc3RhdHVzOiBuZXcgY2FycmllciBkZXRlY3Qgc3RhdHVzLCBub256ZXJvIGlmIGFjdGl2ZQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTUwMyw3ICs1MDYsNyBAQAogCiAvKioKICAqCXVhcnRfaGFuZGxlX2N0c19jaGFuZ2UgLSBoYW5kbGUgYSBjaGFuZ2Ugb2YgY2xlYXItdG8tc2VuZCBzdGF0ZQotICoJQHBvcnQ6IHVhcnRfcG9ydCBzdHJ1Y3R1cmUgZm9yIHRoZSBvcGVuIHBvcnQKKyAqCUB1cG9ydDogdWFydF9wb3J0IHN0cnVjdHVyZSBmb3IgdGhlIG9wZW4gcG9ydAogICoJQHN0YXR1czogbmV3IGNsZWFyIHRvIHNlbmQgc3RhdHVzLCBub256ZXJvIGlmIGFjdGl2ZQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCmluZGV4IGM3NTUyODMuLmFiOTI3MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaApAQCAtMjMzLDYgKzIzMyw4IEBACiB9CiAKIGV4dGVybiBpbnQgbmV4dF9zaWduYWwoc3RydWN0IHNpZ3BlbmRpbmcgKnBlbmRpbmcsIHNpZ3NldF90ICptYXNrKTsKK2V4dGVybiBpbnQgZG9fc2VuZF9zaWdfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGJvb2wgZ3JvdXApOwogZXh0ZXJuIGludCBncm91cF9zZW5kX3NpZ19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogZXh0ZXJuIGludCBfX2dyb3VwX3NlbmRfc2lnX2luZm8oaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gbG9uZyBkb19ydF90Z3NpZ3F1ZXVlaW5mbyhwaWRfdCB0Z2lkLCBwaWRfdCBwaWQsIGludCBzaWcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCBkZjdiMjNhLi5iY2RkNjYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTM1NCw4ICszNTQsOCBAQAogCQkJCWlwdnNfcHJvcGVydHk6MSwKIAkJCQlwZWVrZWQ6MSwKIAkJCQluZl90cmFjZToxOworCV9fYmUxNgkJCXByb3RvY29sOjE2OwogCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MxKTsKLQlfX2JlMTYJCQlwcm90b2NvbDsKIAogCXZvaWQJCQkoKmRlc3RydWN0b3IpKHN0cnVjdCBza19idWZmICpza2IpOwogI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKQEAgLTM2Nyw3ICszNjcsNiBAQAogI2VuZGlmCiAKIAlpbnQJCQlpaWY7Ci0JX191MTYJCQlxdWV1ZV9tYXBwaW5nOwogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAlfX3UxNgkJCXRjX2luZGV4OwkvKiB0cmFmZmljIGNvbnRyb2wgaW5kZXggKi8KICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKQEAgLTM3Niw2ICszNzUsNyBAQAogI2VuZGlmCiAKIAlrbWVtY2hlY2tfYml0ZmllbGRfYmVnaW4oZmxhZ3MyKTsKKwlfX3UxNgkJCXF1ZXVlX21hcHBpbmc6MTY7CiAjaWZkZWYgQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEUKIAlfX3U4CQkJbmRpc2Nfbm9kZXR5cGU6MjsKICNlbmRpZgpAQCAtMTc1Nyw2ICsxNzU3LDggQEAKIAkJCQkJCSAgICAgaW50IHRvX29mZnNldCwKIAkJCQkJCSAgICAgaW50IHNpemUpOwogZXh0ZXJuIHZvaWQJICAgICAgIHNrYl9mcmVlX2RhdGFncmFtKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdm9pZAkgICAgICAgc2tiX2ZyZWVfZGF0YWdyYW1fbG9ja2VkKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCXN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludAkgICAgICAgc2tiX2tpbGxfZGF0YWdyYW0oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgdW5zaWduZWQgaW50IGZsYWdzKTsKIGV4dGVybiBfX3dzdW0JICAgICAgIHNrYl9jaGVja3N1bShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXAuaCBiL2luY2x1ZGUvbGludXgvc21wLmgKaW5kZXggOWUzZDhhZi4uMzljNjRiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtcC5oCkBAIC03MywxNSArNzMsNiBAQAogdm9pZCBzbXBfY2FsbF9mdW5jdGlvbl9tYW55KGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLAogCQkJICAgIHZvaWQgKCpmdW5jKSh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgYm9vbCB3YWl0KTsKIAotLyogRGVwcmVjYXRlZDogVXNlIHNtcF9jYWxsX2Z1bmN0aW9uX21hbnkgd2hpY2ggdGFrZXMgYSBwb2ludGVyIHRvIHRoZSBtYXNrLiAqLwotc3RhdGljIGlubGluZSBpbnQKLXNtcF9jYWxsX2Z1bmN0aW9uX21hc2soY3B1bWFza190IG1hc2ssIHZvaWQoKmZ1bmMpKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLAotCQkgICAgICAgaW50IHdhaXQpCi17Ci0Jc21wX2NhbGxfZnVuY3Rpb25fbWFueSgmbWFzaywgZnVuYywgaW5mbywgd2FpdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdWlkLCBzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqZGF0YSwKIAkJCQlpbnQgd2FpdCk7CiAKQEAgLTE0NCw4ICsxMzUsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkgeyB9CiAjZGVmaW5lIG51bV9ib290aW5nX2NwdXMoKQkJCTEKICNkZWZpbmUgc21wX3ByZXBhcmVfYm9vdF9jcHUoKQkJCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBzbXBfY2FsbF9mdW5jdGlvbl9tYXNrKG1hc2ssIGZ1bmMsIGluZm8sIHdhaXQpIFwKLQkJCSh1cF9zbXBfY2FsbF9mdW5jdGlvbihmdW5jLCBpbmZvKSkKICNkZWZpbmUgc21wX2NhbGxfZnVuY3Rpb25fbWFueShtYXNrLCBmdW5jLCBpbmZvLCB3YWl0KSBcCiAJCQkodXBfc21wX2NhbGxfZnVuY3Rpb24oZnVuYywgaW5mbykpCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9jYWxsX3NpbmdsZV9kYXRhKHZvaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCAzYjQ2MWRmLi4zMjczYTBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTE2LDcgKzE2LDcgQEAKIAkJCQkvKiBfU1NfTUFYU0laRSB2YWx1ZSBtaW51cyBzaXplIG9mIHNzX2ZhbWlseSAqLwogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChfS19TU19BTElHTlNJWkUpKSk7CS8qIGZvcmNlIGRlc2lyZWQgYWxpZ25tZW50ICovCiAKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8YXNtL3NvY2tldC5oPgkJCS8qIGFyY2gtZGVwZW5kZW50IGRlZmluZXMJKi8KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CQkvKiB0aGUgU0lPQ3h4eCBJL08gY29udHJvbHMJKi8KQEAgLTEwMSwyMSArMTAxLDYgQEAKIAkJCSAgICAgICgoY2hhciAqKShjbXNnKSAtIChjaGFyICopKG1oZHIpLT5tc2dfY29udHJvbCkpKQogCiAvKgotICoJVGhpcyBtZXNzIHdpbGwgZ28gYXdheSB3aXRoIGdsaWJjCi0gKi8KLSAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIF9fS0lOTElORSBzdGF0aWMgaW5saW5lCi0jZWxpZiAgZGVmaW5lZChfX0dOVUNfXykgCi0jZGVmaW5lIF9fS0lOTElORSBzdGF0aWMgX19pbmxpbmVfXwotI2VsaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSNkZWZpbmUgX19LSU5MSU5FIHN0YXRpYyBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIF9fS0lOTElORSBzdGF0aWMKLSNlbmRpZgotCi0KLS8qCiAgKglHZXQgdGhlIG5leHQgY21zZyBoZWFkZXIKICAqCiAgKglQTEVBU0UsIGRvIG5vdCB0b3VjaCB0aGlzIGZ1bmN0aW9uLiBJZiB5b3UgdGhpbmssIHRoYXQgaXQgaXMKQEAgLTEyOCw3ICsxMTMsNyBAQAogICoJYW5jaWxsYXJ5IG9iamVjdCBEQVRBLgkJCQktLUFOSyAoOTgwNzMxKQogICovCiAgCi1fX0tJTkxJTkUgc3RydWN0IGNtc2doZHIgKiBfX2Ntc2dfbnh0aGRyKHZvaWQgKl9fY3RsLCBfX2tlcm5lbF9zaXplX3QgX19zaXplLAorc3RhdGljIGlubGluZSBzdHJ1Y3QgY21zZ2hkciAqIF9fY21zZ19ueHRoZHIodm9pZCAqX19jdGwsIF9fa2VybmVsX3NpemVfdCBfX3NpemUsCiAJCQkJCSAgICAgICBzdHJ1Y3QgY21zZ2hkciAqX19jbXNnKQogewogCXN0cnVjdCBjbXNnaGRyICogX19wdHI7CkBAIC0xNDAsNyArMTI1LDcgQEAKIAlyZXR1cm4gX19wdHI7CiB9CiAKLV9fS0lOTElORSBzdHJ1Y3QgY21zZ2hkciAqIGNtc2dfbnh0aGRyIChzdHJ1Y3QgbXNnaGRyICpfX21zZywgc3RydWN0IGNtc2doZHIgKl9fY21zZykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNtc2doZHIgKiBjbXNnX254dGhkciAoc3RydWN0IG1zZ2hkciAqX19tc2csIHN0cnVjdCBjbXNnaGRyICpfX2Ntc2cpCiB7CiAJcmV0dXJuIF9fY21zZ19ueHRoZHIoX19tc2ctPm1zZ19jb250cm9sLCBfX21zZy0+bXNnX2NvbnRyb2xsZW4sIF9fY21zZyk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9sbXMyODNnZjA1LmggYi9pbmNsdWRlL2xpbnV4L3NwaS9sbXMyODNnZjA1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ZDI1NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL2xtczI4M2dmMDUuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogbG1zMjgzZ2YwNS5oIC0gUGxhdGZvcm0gZ2x1ZSBmb3IgU2Ftc3VuZyBMTVMyODNHRjA1IExDRAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpZm5kZWYgX0lOQ0xVREVfTElOVVhfU1BJX0xNUzI4M0dGMDVfSF8KKyNkZWZpbmUgX0lOQ0xVREVfTElOVVhfU1BJX0xNUzI4M0dGMDVfSF8KKworc3RydWN0IGxtczI4M2dmMDVfcGRhdGEgeworCXVuc2lnbmVkIGxvbmcJcmVzZXRfZ3BpbzsKKwlib29sCQlyZXNldF9pbnZlcnRlZDsKK307CisKKyNlbmRpZiAvKiBfSU5DTFVERV9MSU5VWF9TUElfTE1TMjgzR0YwNV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdHJpbmcuaCBiL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKaW5kZXggNDg5MDE5ZS4uYjg1MDg4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdHJpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCkBAIC02Miw3ICs2Miw3IEBACiAjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlJDSFIKIGV4dGVybiBjaGFyICogc3RycmNocihjb25zdCBjaGFyICosaW50KTsKICNlbmRpZgotZXh0ZXJuIGNoYXIgKiBzdHJzdHJpcChjaGFyICopOworZXh0ZXJuIGNoYXIgKiBfX211c3RfY2hlY2sgc3Ryc3RyaXAoY2hhciAqKTsKICNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSU1RSCiBleHRlcm4gY2hhciAqIHN0cnN0cihjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaAppbmRleCA3ZGE0NjZiLi5mNWNjMDg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaApAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAvKgpAQCAtMTE3LDE0ICsxMTgsMTQgQEAKIHN0YXRpYyBpbmxpbmUgX19iZTMyICoKIHhkcl9lbmNvZGVfaHlwZXIoX19iZTMyICpwLCBfX3U2NCB2YWwpCiB7Ci0JKihfX2JlNjQgKilwID0gY3B1X3RvX2JlNjQodmFsKTsKKwlwdXRfdW5hbGlnbmVkX2JlNjQodmFsLCBwKTsKIAlyZXR1cm4gcCArIDI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX19iZTMyICoKIHhkcl9kZWNvZGVfaHlwZXIoX19iZTMyICpwLCBfX3U2NCAqdmFscCkKIHsKLQkqdmFscCA9IGJlNjRfdG9fY3B1cCgoX19iZTY0ICopcCk7CisJKnZhbHAgPSBnZXRfdW5hbGlnbmVkX2JlNjQocCk7CiAJcmV0dXJuIHAgKyAyOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDZjOTkwZTYuLjRlYzkwMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC0zNCwxNiArMzQsMzggQEAKICAqIHRoZSB0eXBlL29mZnNldCBpbnRvIHRoZSBwdGUgYXMgNS8yNyBhcyB3ZWxsLgogICovCiAjZGVmaW5lIE1BWF9TV0FQRklMRVNfU0hJRlQJNQotI2lmbmRlZiBDT05GSUdfTUlHUkFUSU9OCi0jZGVmaW5lIE1BWF9TV0FQRklMRVMJCSgxIDw8IE1BWF9TV0FQRklMRVNfU0hJRlQpCisKKy8qCisgKiBVc2Ugc29tZSBvZiB0aGUgc3dhcCBmaWxlcyBudW1iZXJzIGZvciBvdGhlciBwdXJwb3Nlcy4gVGhpcworICogaXMgYSBjb252ZW5pZW50IHdheSB0byBob29rIGludG8gdGhlIFZNIHRvIHRyaWdnZXIgc3BlY2lhbAorICogYWN0aW9ucyBvbiBmYXVsdHMuCisgKi8KKworLyoKKyAqIE5VTUEgbm9kZSBtZW1vcnkgbWlncmF0aW9uIHN1cHBvcnQKKyAqLworI2lmZGVmIENPTkZJR19NSUdSQVRJT04KKyNkZWZpbmUgU1dQX01JR1JBVElPTl9OVU0gMgorI2RlZmluZSBTV1BfTUlHUkFUSU9OX1JFQUQJKE1BWF9TV0FQRklMRVMgKyBTV1BfSFdQT0lTT05fTlVNKQorI2RlZmluZSBTV1BfTUlHUkFUSU9OX1dSSVRFCShNQVhfU1dBUEZJTEVTICsgU1dQX0hXUE9JU09OX05VTSArIDEpCiAjZWxzZQotLyogVXNlIGxhc3QgdHdvIGVudHJpZXMgZm9yIHBhZ2UgbWlncmF0aW9uIHN3YXAgZW50cmllcyAqLwotI2RlZmluZSBNQVhfU1dBUEZJTEVTCQkoKDEgPDwgTUFYX1NXQVBGSUxFU19TSElGVCktMikKLSNkZWZpbmUgU1dQX01JR1JBVElPTl9SRUFECU1BWF9TV0FQRklMRVMKLSNkZWZpbmUgU1dQX01JR1JBVElPTl9XUklURQkoTUFYX1NXQVBGSUxFUyArIDEpCisjZGVmaW5lIFNXUF9NSUdSQVRJT05fTlVNIDAKICNlbmRpZgogCiAvKgorICogSGFuZGxpbmcgb2YgaGFyZHdhcmUgcG9pc29uZWQgcGFnZXMgd2l0aCBtZW1vcnkgY29ycnVwdGlvbi4KKyAqLworI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQorI2RlZmluZSBTV1BfSFdQT0lTT05fTlVNIDEKKyNkZWZpbmUgU1dQX0hXUE9JU09OCQlNQVhfU1dBUEZJTEVTCisjZWxzZQorI2RlZmluZSBTV1BfSFdQT0lTT05fTlVNIDAKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9TV0FQRklMRVMgXAorCSgoMSA8PCBNQVhfU1dBUEZJTEVTX1NISUZUKSAtIFNXUF9NSUdSQVRJT05fTlVNIC0gU1dQX0hXUE9JU09OX05VTSkKKworLyoKICAqIE1hZ2ljIGhlYWRlciBmb3IgYSBzd2FwIGFyZWEuIFRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB1bmlvbiBpcwogICogd2hhdCB0aGUgc3dhcCBtYWdpYyBsb29rcyBsaWtlIGZvciB0aGUgb2xkIChsaW1pdGVkIHRvIDEyOE1CKQogICogc3dhcCBhcmVhIGZvcm1hdCwgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB1bmlvbiBhZGRzIC0gaW4gdGhlCkBAIC0yMTcsNiArMjM5LDExIEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCiAJCQkJCQkgIGdmcF90IGdmcF9tYXNrLCBib29sIG5vc3dhcCwKIAkJCQkJCSAgdW5zaWduZWQgaW50IHN3YXBwaW5lc3MpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZV96b25lKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJCQlnZnBfdCBnZnBfbWFzaywgYm9vbCBub3N3YXAsCisJCQkJCQl1bnNpZ25lZCBpbnQgc3dhcHBpbmVzcywKKwkJCQkJCXN0cnVjdCB6b25lICp6b25lLAorCQkJCQkJaW50IG5pZCk7CiBleHRlcm4gaW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1vZGUsIGludCBmaWxlKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNocmlua19hbGxfbWVtb3J5KHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOwogZXh0ZXJuIGludCB2bV9zd2FwcGluZXNzOwpAQCAtMjQwLDcgKzI2Nyw3IEBACiBleHRlcm4gdm9pZCBzY2FuX21hcHBpbmdfdW5ldmljdGFibGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKik7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNjYW5fdW5ldmljdGFibGVfcGFnZXM7Ci1leHRlcm4gaW50IHNjYW5fdW5ldmljdGFibGVfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKK2V4dGVybiBpbnQgc2Nhbl91bmV2aWN0YWJsZV9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LAogCQkJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogZXh0ZXJuIGludCBzY2FuX3VuZXZpY3RhYmxlX3JlZ2lzdGVyX25vZGUoc3RydWN0IG5vZGUgKm5vZGUpOwogZXh0ZXJuIHZvaWQgc2Nhbl91bmV2aWN0YWJsZV91bnJlZ2lzdGVyX25vZGUoc3RydWN0IG5vZGUgKm5vZGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmggYi9pbmNsdWRlL2xpbnV4L3N3YXBvcHMuaAppbmRleCA2ZWMzOWFiLi5jZDQyZTMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXBvcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXBvcHMuaApAQCAtMTMxLDMgKzEzMSw0MSBAQAogCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQorLyoKKyAqIFN1cHBvcnQgZm9yIGhhcmR3YXJlIHBvaXNvbmVkIHBhZ2VzCisgKi8KK3N0YXRpYyBpbmxpbmUgc3dwX2VudHJ5X3QgbWFrZV9od3BvaXNvbl9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCXJldHVybiBzd3BfZW50cnkoU1dQX0hXUE9JU09OLCBwYWdlX3RvX3BmbihwYWdlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2h3cG9pc29uX2VudHJ5KHN3cF9lbnRyeV90IGVudHJ5KQoreworCXJldHVybiBzd3BfdHlwZShlbnRyeSkgPT0gU1dQX0hXUE9JU09OOworfQorI2Vsc2UKKworc3RhdGljIGlubGluZSBzd3BfZW50cnlfdCBtYWtlX2h3cG9pc29uX2VudHJ5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBzd3BfZW50cnkoMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2h3cG9pc29uX2VudHJ5KHN3cF9lbnRyeV90IHN3cCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0ZBSUxVUkUpIHx8IGRlZmluZWQoQ09ORklHX01JR1JBVElPTikKK3N0YXRpYyBpbmxpbmUgaW50IG5vbl9zd2FwX2VudHJ5KHN3cF9lbnRyeV90IGVudHJ5KQoreworCXJldHVybiBzd3BfdHlwZShlbnRyeSkgPj0gTUFYX1NXQVBGSUxFUzsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBub25fc3dhcF9lbnRyeShzd3BfZW50cnlfdCBlbnRyeSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggZTc2ZDNiMi4uMWU0NzQzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCi1zdHJ1Y3QgZmlsZTsKIHN0cnVjdCBjb21wbGV0aW9uOwogCiAjZGVmaW5lIENUTF9NQVhOQU1FIDEwCQkvKiBob3cgbWFueSBwYXRoIGNvbXBvbmVudHMgZG8gd2UgYWxsb3cgaW4gYQpAQCAtOTc3LDI1ICs5NzYsMjUgQEAKIAkJCSB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOwogCi10eXBlZGVmIGludCBwcm9jX2hhbmRsZXIgKHN0cnVjdCBjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCit0eXBlZGVmIGludCBwcm9jX2hhbmRsZXIgKHN0cnVjdCBjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAogCQkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CiAKLWV4dGVybiBpbnQgcHJvY19kb3N0cmluZyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKK2V4dGVybiBpbnQgcHJvY19kb3N0cmluZyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCSB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwotZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLAorZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LAogCQkJIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7Ci1leHRlcm4gaW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLAorZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwotZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCitleHRlcm4gaW50IHByb2NfZG9pbnR2ZWNfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQkgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKLWV4dGVybiBpbnQgcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKK2V4dGVybiBpbnQgcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKLWV4dGVybiBpbnQgcHJvY19kb2ludHZlY19tc19qaWZmaWVzKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLAorZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCiAJCQkJICAgIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7Ci1leHRlcm4gaW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCitleHRlcm4gaW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCiAJCQkJICB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogZXh0ZXJuIGludCBwcm9jX2RvdWxvbmd2ZWNfbXNfamlmZmllc19taW5tYXgoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCwKLQkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworCQkJCSAgICAgIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiAKIGV4dGVybiBpbnQgZG9fc3lzY3RsIChpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJICAgICAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZS5oIGIvaW5jbHVkZS9saW51eC90aW1lLmgKaW5kZXggNTY3ODdjMC4uZmUwNGU1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lLmgKQEAgLTE1NSw2ICsxNTUsMzQgQEAKIHN0cnVjdCB0bXM7CiBleHRlcm4gdm9pZCBkb19zeXNfdGltZXMoc3RydWN0IHRtcyAqKTsKIAorLyoKKyAqIFNpbWlsYXIgdG8gdGhlIHN0cnVjdCB0bSBpbiB1c2Vyc3BhY2UgPHRpbWUuaD4sIGJ1dCBpdCBuZWVkcyB0byBiZSBoZXJlIHNvCisgKiB0aGF0IHRoZSBrZXJuZWwgc291cmNlIGlzIHNlbGYgY29udGFpbmVkLgorICovCitzdHJ1Y3QgdG0geworCS8qCisJICogdGhlIG51bWJlciBvZiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUsIG5vcm1hbGx5IGluIHRoZSByYW5nZQorCSAqIDAgdG8gNTksIGJ1dCBjYW4gYmUgdXAgdG8gNjAgdG8gYWxsb3cgZm9yIGxlYXAgc2Vjb25kcworCSAqLworCWludCB0bV9zZWM7CisJLyogdGhlIG51bWJlciBvZiBtaW51dGVzIGFmdGVyIHRoZSBob3VyLCBpbiB0aGUgcmFuZ2UgMCB0byA1OSovCisJaW50IHRtX21pbjsKKwkvKiB0aGUgbnVtYmVyIG9mIGhvdXJzIHBhc3QgbWlkbmlnaHQsIGluIHRoZSByYW5nZSAwIHRvIDIzICovCisJaW50IHRtX2hvdXI7CisJLyogdGhlIGRheSBvZiB0aGUgbW9udGgsIGluIHRoZSByYW5nZSAxIHRvIDMxICovCisJaW50IHRtX21kYXk7CisJLyogdGhlIG51bWJlciBvZiBtb250aHMgc2luY2UgSmFudWFyeSwgaW4gdGhlIHJhbmdlIDAgdG8gMTEgKi8KKwlpbnQgdG1fbW9uOworCS8qIHRoZSBudW1iZXIgb2YgeWVhcnMgc2luY2UgMTkwMCAqLworCWxvbmcgdG1feWVhcjsKKwkvKiB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgU3VuZGF5LCBpbiB0aGUgcmFuZ2UgMCB0byA2ICovCisJaW50IHRtX3dkYXk7CisJLyogdGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIEphbnVhcnkgMSwgaW4gdGhlIHJhbmdlIDAgdG8gMzY1ICovCisJaW50IHRtX3lkYXk7Cit9OworCit2b2lkIHRpbWVfdG9fdG0odGltZV90IHRvdGFsc2VjcywgaW50IG9mZnNldCwgc3RydWN0IHRtICpyZXN1bHQpOworCiAvKioKICAqIHRpbWVzcGVjX3RvX25zIC0gQ29udmVydCB0aW1lc3BlYyB0byBuYW5vc2Vjb25kcwogICogQHRzOgkJcG9pbnRlciB0byB0aGUgdGltZXNwZWMgdmFyaWFibGUgdG8gYmUgY29udmVydGVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmggYi9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKaW5kZXggODA5YjI2Yy4uNTdlNjM1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaApAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQkJfCAxKlNEX0JBTEFOQ0VfRk9SSwkJCVwKIAkJCQl8IDAqU0RfQkFMQU5DRV9XQUtFCQkJXAogCQkJCXwgMSpTRF9XQUtFX0FGRklORQkJCVwKLQkJCQl8IDEqU0RfUFJFRkVSX0xPQ0FMCQkJXAorCQkJCXwgMCpTRF9QUkVGRVJfTE9DQUwJCQlcCiAJCQkJfCAwKlNEX1NIQVJFX0NQVVBPV0VSCQkJXAogCQkJCXwgMSpTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTCQlcCiAJCQkJfCAwKlNEX1NFUklBTElaRQkJCVwKQEAgLTE2Miw3ICsxNjIsNyBAQAogCQkJCXwgMSpTRF9CQUxBTkNFX0ZPUksJCQlcCiAJCQkJfCAwKlNEX0JBTEFOQ0VfV0FLRQkJCVwKIAkJCQl8IDEqU0RfV0FLRV9BRkZJTkUJCQlcCi0JCQkJfCAxKlNEX1BSRUZFUl9MT0NBTAkJCVwKKwkJCQl8IDAqU0RfUFJFRkVSX0xPQ0FMCQkJXAogCQkJCXwgMCpTRF9TSEFSRV9DUFVQT1dFUgkJCVwKIAkJCQl8IDAqU0RfU0hBUkVfUEtHX1JFU09VUkNFUwkJXAogCQkJCXwgMCpTRF9TRVJJQUxJWkUJCQlcCkBAIC0yMTEsMTIgKzIxMSw2IEBACiAjaWZuZGVmIHRvcG9sb2d5X2NvcmVfaWQKICNkZWZpbmUgdG9wb2xvZ3lfY29yZV9pZChjcHUpCQkJKCh2b2lkKShjcHUpLCAwKQogI2VuZGlmCi0jaWZuZGVmIHRvcG9sb2d5X3RocmVhZF9zaWJsaW5ncwotI2RlZmluZSB0b3BvbG9neV90aHJlYWRfc2libGluZ3MoY3B1KQkJY3B1bWFza19vZl9jcHUoY3B1KQotI2VuZGlmCi0jaWZuZGVmIHRvcG9sb2d5X2NvcmVfc2libGluZ3MKLSNkZWZpbmUgdG9wb2xvZ3lfY29yZV9zaWJsaW5ncyhjcHUpCQljcHVtYXNrX29mX2NwdShjcHUpCi0jZW5kaWYKICNpZm5kZWYgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2sKICNkZWZpbmUgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soY3B1KQkJY3B1bWFza19vZihjcHUpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHJhY2Vfc2VxLmggYi9pbmNsdWRlL2xpbnV4L3RyYWNlX3NlcS5oCmluZGV4IGMxMzRkZDEuLjA5MDc3ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHJhY2Vfc2VxLmgKKysrIGIvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaApAQCAtNyw3ICs3LDcgQEAKIAogLyoKICAqIFRyYWNlIHNlcXVlbmNlcyBhcmUgdXNlZCB0byBhbGxvdyBhIGZ1bmN0aW9uIHRvIGNhbGwgc2V2ZXJhbCBvdGhlciBmdW5jdGlvbnMKLSAqIHRvIGNyZWF0ZSBhIHN0cmluZyBvZiBkYXRhIHRvIHVzZSAodXAgdG8gYSBtYXggb2YgUEFHRV9TSVpFLgorICogdG8gY3JlYXRlIGEgc3RyaW5nIG9mIGRhdGEgdG8gdXNlICh1cCB0byBhIG1heCBvZiBQQUdFX1NJWkUpLgogICovCiAKIHN0cnVjdCB0cmFjZV9zZXEgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFjZWhvb2suaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vob29rLmgKaW5kZXggMTdiYTgyZWYuLjFlYjQ0YTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHJhY2Vob29rLmgKKysrIGIvaW5jbHVkZS9saW51eC90cmFjZWhvb2suaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBUcmFjaW5nIGhvb2tzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAogICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKQEAgLTQ2MywyMiArNDYzLDM4IEBACiAKIC8qKgogICogdHJhY2Vob29rX25vdGlmeV9qY3RsIC0gcmVwb3J0IGFib3V0IGpvYiBjb250cm9sIHN0b3AvY29udGludWUKLSAqIEBub3RpZnk6CQlub256ZXJvIGlmIHRoaXMgaXMgdGhlIGxhc3QgdGhyZWFkIGluIHRoZSBncm91cCB0byBzdG9wCisgKiBAbm90aWZ5OgkJemVybywgJUNMRF9TVE9QUEVEIG9yICVDTERfQ09OVElOVUVECiAgKiBAd2h5OgkJJUNMRF9TVE9QUEVEIG9yICVDTERfQ09OVElOVUVECiAgKgogICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBtaWdodCBjYWxsIGRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcCgpLgotICogSXQncyBjYWxsZWQgd2hlbiBhYm91dCB0byBzdG9wIGZvciBqb2IgY29udHJvbDsgd2UgYXJlIGFscmVhZHkgaW4KLSAqICVUQVNLX1NUT1BQRUQgc3RhdGUsIGFib3V0IHRvIGNhbGwgc2NoZWR1bGUoKS4gIEl0J3MgYWxzbyBjYWxsZWQgd2hlbgotICogYSBkZWxheWVkICVDTERfU1RPUFBFRCBvciAlQ0xEX0NPTlRJTlVFRCByZXBvcnQgaXMgcmVhZHkgdG8gYmUgbWFkZS4KICAqCi0gKiBSZXR1cm4gbm9uemVybyB0byBnZW5lcmF0ZSBhICVTSUdDSExEIHdpdGggQHdoeSwgd2hpY2ggaXMKLSAqIG5vcm1hbCBpZiBAbm90aWZ5IGlzIG5vbnplcm8uCisgKiBAbm90aWZ5IGlzIHplcm8gaWYgd2Ugd291bGQgbm90IG9yZGluYXJpbHkgc2VuZCBhICVTSUdDSExELAorICogb3IgaXMgdGhlICVDTERfU1RPUFBFRCBvciAlQ0xEX0NPTlRJTlVFRCAuc2lfY29kZSBmb3IgJVNJR0NITEQuCiAgKgotICogQ2FsbGVkIHdpdGggbm8gbG9ja3MgaGVsZC4KKyAqIEB3aHkgaXMgJUNMRF9TVE9QUEVEIHdoZW4gYWJvdXQgdG8gc3RvcCBmb3Igam9iIGNvbnRyb2w7CisgKiB3ZSBhcmUgYWxyZWFkeSBpbiAlVEFTS19TVE9QUEVEIHN0YXRlLCBhYm91dCB0byBjYWxsIHNjaGVkdWxlKCkuCisgKiBJdCBtaWdodCBhbHNvIGJlIHRoYXQgd2UgaGF2ZSBqdXN0IGV4aXRlZCAoY2hlY2sgJVBGX0VYSVRJTkcpLAorICogYnV0IG5lZWQgdG8gcmVwb3J0IHRoYXQgYSBncm91cC13aWRlIHN0b3AgaXMgY29tcGxldGUuCisgKgorICogQHdoeSBpcyAlQ0xEX0NPTlRJTlVFRCB3aGVuIHdha2luZyB1cCBhZnRlciBqb2IgY29udHJvbCBzdG9wIGFuZAorICogcmVhZHkgdG8gbWFrZSBhIGRlbGF5ZWQgQG5vdGlmeSByZXBvcnQuCisgKgorICogUmV0dXJuIHRoZSAlQ0xEXyogdmFsdWUgZm9yICVTSUdDSExELCBvciB6ZXJvIHRvIGdlbmVyYXRlIG5vIHNpZ25hbC4KKyAqCisgKiBDYWxsZWQgd2l0aCB0aGUgc2lnbG9jayBoZWxkLgogICovCiBzdGF0aWMgaW5saW5lIGludCB0cmFjZWhvb2tfbm90aWZ5X2pjdGwoaW50IG5vdGlmeSwgaW50IHdoeSkKIHsKLQlyZXR1cm4gbm90aWZ5IHx8IChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKTsKKwlyZXR1cm4gbm90aWZ5ID86IChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSA/IHdoeSA6IDA7Cit9CisKKy8qKgorICogdHJhY2Vob29rX2ZpbmlzaF9qY3RsIC0gcmVwb3J0IGFib3V0IHJldHVybiBmcm9tIGpvYiBjb250cm9sIHN0b3AKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBieSBkb19zaWduYWxfc3RvcCgpIGFmdGVyIHdha2V1cC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHRyYWNlaG9va19maW5pc2hfamN0bCh2b2lkKQorewogfQogCiAjZGVmaW5lIERFQVRIX1JFQVAJCQktMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFjZXBvaW50LmggYi9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaAppbmRleCA2M2EzZjdhLi4yYWFjOGE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaApAQCAtNCw3ICs0LDcgQEAKIC8qCiAgKiBLZXJuZWwgVHJhY2Vwb2ludCBBUEkuCiAgKgotICogU2VlIERvY3VtZW50YXRpb24vdHJhY2Vwb2ludC50eHQuCisgKiBTZWUgRG9jdW1lbnRhdGlvbi90cmFjZS90cmFjZXBvaW50cy50eHQuCiAgKgogICogKEMpIENvcHlyaWdodCAyMDA4IE1hdGhpZXUgRGVzbm95ZXJzIDxtYXRoaWV1LmRlc25veWVyc0Bwb2x5bXRsLmNhPgogICoKQEAgLTM2LDcgKzM2LDcgQEAKICNpZm5kZWYgREVDTEFSRV9UUkFDRQogCiAjZGVmaW5lIFRQX1BST1RPKGFyZ3MuLi4pCWFyZ3MKLSNkZWZpbmUgVFBfQVJHUyhhcmdzLi4uKQkJYXJncworI2RlZmluZSBUUF9BUkdTKGFyZ3MuLi4pCWFyZ3MKIAogI2lmZGVmIENPTkZJR19UUkFDRVBPSU5UUwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eV9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvdHR5X2RyaXZlci5oCmluZGV4IDM1NjYxMjkuLmIwODY3NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5X2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5X2RyaXZlci5oCkBAIC00NSw4ICs0NSwxNiBAQAogICoKICAqIHZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwogICoKLSAqIAlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIHR0eSBkZXZpY2UgaXMgY2xvc2VkIGZvcgotICoJdGhlIGxhc3QgdGltZSBmcmVlaW5nIHVwIHRoZSByZXNvdXJjZXMuCisgKiAJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IHdoZW4gYSBwYXJ0aWN1bGFyIHR0eSBkZXZpY2UKKyAqCWlzIGNsb3NlZCBmb3IgdGhlIGxhc3QgdGltZSBmcmVlaW5nIHVwIHRoZSByZXNvdXJjZXMuCisgKgorICoKKyAqIHZvaWQgKCpjbGVhbnVwKShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CisgKgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhc3luY2hyb25vdXNseSB3aGVuIGEgcGFydGljdWxhciB0dHkgZGV2aWNlCisgKglpcyBjbG9zZWQgZm9yIHRoZSBsYXN0IHRpbWUgZnJlZWluZyB1cCB0aGUgcmVzb3VyY2VzLiBUaGlzIGlzCisgKglhY3R1YWxseSB0aGUgc2Vjb25kIHBhcnQgb2Ygc2h1dGRvd24gZm9yIHJvdXRpbmVzIHRoYXQgbWlnaHQgc2xlZXAuCisgKgogICoKICAqIGludCAoKndyaXRlKShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKICAqIAkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKQEAgLTIzMyw2ICsyNDEsNyBAQAogCWludCAgKCpvcGVuKShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKIAl2b2lkICgqY2xvc2UpKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisJdm9pZCAoKmNsZWFudXApKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogCWludCAgKCp3cml0ZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCiAJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIAlpbnQgICgqcHV0X2NoYXIpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91bmFsaWduZWQvYmVfYnl0ZXNoaWZ0LmggYi9pbmNsdWRlL2xpbnV4L3VuYWxpZ25lZC9iZV9ieXRlc2hpZnQuaAppbmRleCA0NmRkMTJjLi45MzU2YjI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VuYWxpZ25lZC9iZV9ieXRlc2hpZnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VuYWxpZ25lZC9iZV9ieXRlc2hpZnQuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX0xJTlVYX1VOQUxJR05FRF9CRV9CWVRFU0hJRlRfSAogI2RlZmluZSBfTElOVVhfVU5BTElHTkVEX0JFX0JZVEVTSElGVF9ICiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiBzdGF0aWMgaW5saW5lIHUxNiBfX2dldF91bmFsaWduZWRfYmUxNihjb25zdCB1OCAqcCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdW5hbGlnbmVkL2xlX2J5dGVzaGlmdC5oIGIvaW5jbHVkZS9saW51eC91bmFsaWduZWQvbGVfYnl0ZXNoaWZ0LmgKaW5kZXggNTk3NzdlOS4uYmUzNzZmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91bmFsaWduZWQvbGVfYnl0ZXNoaWZ0LmgKKysrIGIvaW5jbHVkZS9saW51eC91bmFsaWduZWQvbGVfYnl0ZXNoaWZ0LmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9MSU5VWF9VTkFMSUdORURfTEVfQllURVNISUZUX0gKICNkZWZpbmUgX0xJTlVYX1VOQUxJR05FRF9MRV9CWVRFU0hJRlRfSAogCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RhdGljIGlubGluZSB1MTYgX19nZXRfdW5hbGlnbmVkX2xlMTYoY29uc3QgdTggKnApCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaCBiL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oCmluZGV4IGMxN2ViNjQuLmNlOTExZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oCkBAIC0xNTAsNiArMTUwLDcgQEAKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkJKmludGVyZmFjZTsKIAl1bnNpZ25lZCBjaGFyCQkJZGlzY29ubmVjdGVkOjE7CiAJdW5zaWduZWQgY2hhcgkJCXN1c3BlbmRpbmc6MTsKKwl1bnNpZ25lZCBjaGFyCQkJYXR0YWNoZWQ6MTsKIAl1bnNpZ25lZCBjaGFyCQkJbWlub3I7CiAJdW5zaWduZWQgY2hhcgkJCW51bV9wb3J0czsKIAl1bnNpZ25lZCBjaGFyCQkJbnVtX3BvcnRfcG9pbnRlcnM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi91c2JuZXQuaCBiL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCmluZGV4IGJiNjllMjUuLmY4MTQ3MzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oCkBAIC04OSw2ICs4OSw3IEBACiAjZGVmaW5lIEZMQUdfRlJBTUlOR19BWCAweDAwNDAJCS8qIEFYODg3NzIvMTc4IHBhY2tldHMgKi8KICNkZWZpbmUgRkxBR19XTEFOCTB4MDA4MAkJLyogdXNlICJ3bGFuJWQiIG5hbWVzICovCiAjZGVmaW5lIEZMQUdfQVZPSURfVU5MSU5LX1VSQlMgMHgwMTAwCS8qIGRvbid0IHVubGluayB1cmJzIGF0IHVzYm5ldF9zdG9wKCkgKi8KKyNkZWZpbmUgRkxBR19TRU5EX1pMUAkweDAyMDAJCS8qIGh3IHJlcXVpcmVzIFpMUHMgYXJlIHNlbnQgKi8KIAogCiAJLyogaW5pdCBkZXZpY2UgLi4uIGNhbiBzbGVlcCwgb3IgY2F1c2UgcHJvYmUoKSBmYWlsdXJlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaCBiL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oCmluZGV4IDM2NTZiMzAuLjY5ZjM5OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKIHN0cnVjdCB1dHNfbmFtZXNwYWNlIHsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92Z2FhcmIuaCBiL2luY2x1ZGUvbGludXgvdmdhYXJiLmgKaW5kZXggOTIzZjkwNC4uMmRmYWEyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92Z2FhcmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZnYWFyYi5oCkBAIC0xLDUgKzEsNiBAQAogLyoKLSAqIHZnYWFyYi5jCisgKiBUaGUgVkdBIGFyaWJpdGVyIG1hbmFnZXMgVkdBIHNwYWNlIHJvdXRpbmcgYW5kIFZHQSByZXNvdXJjZSBkZWNvZGUgdG8KKyAqIGFsbG93IG11bHRpcGxlIFZHQSBkZXZpY2VzIHRvIGJlIHVzZWQgaW4gYSBzeXN0ZW0gaW4gYSBzYWZlIHdheS4KICAqCiAgKiAoQykgQ29weXJpZ2h0IDIwMDUgQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgogICogKEMpIENvcHlyaWdodCAyMDA3IFBhdWxvIFIuIFphbm9uaSA8cHJ6YW5vbmlAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fOXAuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvXzlwLmgKaW5kZXggZWE3MjI2YS4uMDk1ZTEwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9fOXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb185cC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfTElOVVhfVklSVElPXzlQX0gKIC8qIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CiAgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4gKi8KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgogCiAvKiBNYXhpbXVtIG51bWJlciBvZiB2aXJ0aW8gY2hhbm5lbHMgcGVyIHBhcnRpdGlvbiAoMSBmb3Igbm93KSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oCmluZGV4IDA5ZDczMDAuLjE0MThmMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2JhbGxvb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19iYWxsb29uLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9MSU5VWF9WSVJUSU9fQkFMTE9PTl9ICiAvKiBUaGlzIGhlYWRlciBpcyBCU0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVudAogICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuICovCisjaW5jbHVkZSA8bGludXgvdmlydGlvX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KIAogLyogVGhlIGZlYXR1cmUgYml0bWFwIGZvciB2aXJ0aW8gYmFsbG9vbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fYmxrLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaAppbmRleCAxNWNiNjY2Li5mZDI5NGM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaApAQCAtMyw2ICszLDcgQEAKIC8qIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CiAgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4gKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CiAKIC8qIEZlYXR1cmUgYml0cyAqLwpAQCAtMTMsMTEgKzE0LDggQEAKICNkZWZpbmUgVklSVElPX0JMS19GX1JPCQk1CS8qIERpc2sgaXMgcmVhZC1vbmx5ICovCiAjZGVmaW5lIFZJUlRJT19CTEtfRl9CTEtfU0laRQk2CS8qIEJsb2NrIHNpemUgb2YgZGlzayBpcyBhdmFpbGFibGUqLwogI2RlZmluZSBWSVJUSU9fQkxLX0ZfU0NTSQk3CS8qIFN1cHBvcnRzIHNjc2kgY29tbWFuZCBwYXNzdGhydSAqLwotI2RlZmluZSBWSVJUSU9fQkxLX0ZfSURFTlRJRlkJOAkvKiBBVEEgSURFTlRJRlkgc3VwcG9ydGVkICovCiAjZGVmaW5lIFZJUlRJT19CTEtfRl9GTFVTSAk5CS8qIENhY2hlIGZsdXNoIGNvbW1hbmQgc3VwcG9ydCAqLwogCi0jZGVmaW5lIFZJUlRJT19CTEtfSURfQllURVMJKHNpemVvZihfX3UxNlsyNTZdKSkJLyogSURFTlRJRlkgREFUQSAqLwotCiBzdHJ1Y3QgdmlydGlvX2Jsa19jb25maWcgewogCS8qIFRoZSBjYXBhY2l0eSAoaW4gNTEyLWJ5dGUgc2VjdG9ycykuICovCiAJX191NjQgY2FwYWNpdHk7CkBAIC0zMyw3ICszMSw2IEBACiAJfSBnZW9tZXRyeTsKIAkvKiBibG9jayBzaXplIG9mIGRldmljZSAoaWYgVklSVElPX0JMS19GX0JMS19TSVpFKSAqLwogCV9fdTMyIGJsa19zaXplOwotCV9fdTggaWRlbnRpZnlbVklSVElPX0JMS19JRF9CWVRFU107CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oCmluZGV4IGI1ZjUxOTguLmZlODg1MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25zb2xlLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9MSU5VWF9WSVJUSU9fQ09OU09MRV9ICiAjZGVmaW5lIF9MSU5VWF9WSVJUSU9fQ09OU09MRV9ICiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgogLyogVGhpcyBoZWFkZXIsIGV4Y2x1ZGluZyB0aGUgI2lmZGVmIF9fS0VSTkVMX18gcGFydCwgaXMgQlNEIGxpY2Vuc2VkIHNvCiAgKiBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19uZXQuaAppbmRleCAxZjQxNzM0Li4wODVlNDIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19uZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19uZXQuaApAQCAtMyw2ICszLDcgQEAKIC8qIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CiAgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4gKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fcm5nLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ybmcuaAppbmRleCA0ODEyMWMzLi5jNGQ1ZGU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ybmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ybmcuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX0xJTlVYX1ZJUlRJT19STkdfSAogLyogVGhpcyBoZWFkZXIgaXMgQlNEIGxpY2Vuc2VkIHNvIGFueW9uZSBjYW4gdXNlIHRoZSBkZWZpbml0aW9ucyB0byBpbXBsZW1lbnQKICAqIGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLiAqLworI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uZmlnLmg+CiAKICNlbmRpZiAvKiBfTElOVVhfVklSVElPX1JOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dtOTd4eC5oIGIvaW5jbHVkZS9saW51eC93bTk3eHguaAppbmRleCAwYzk4NzgxLi4zOGU4YzRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dtOTd4eC5oCisrKyBiL2luY2x1ZGUvbGludXgvd205N3h4LmgKQEAgLTI5Myw2ICsyOTMsMjQgQEAKIAl1MTYgc3VzcGVuZF9tb2RlOyAgICAgICAgICAgICAgIC8qIFBSUCBpbiBzdXNwZW5kIG1vZGUgKi8KIH07CiAKK3N0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSB7CisJaW50CWJhdHRfYXV4OworCWludAl0ZW1wX2F1eDsKKwlpbnQJY2hhcmdlX2dwaW87CisJaW50CW1pbl92b2x0YWdlOworCWludAltYXhfdm9sdGFnZTsKKwlpbnQJYmF0dF9kaXY7CisJaW50CWJhdHRfbXVsdDsKKwlpbnQJdGVtcF9kaXY7CisJaW50CXRlbXBfbXVsdDsKKwlpbnQJYmF0dF90ZWNoOworCWNoYXIJKmJhdHRfbmFtZTsKK307CisKK3N0cnVjdCB3bTk3eHhfcGRhdGEgeworCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YQkqYmF0dF9wZGF0YTsJLyogYmF0dGVyeSBkYXRhICovCit9OworCiAvKgogICogQ29kZWMgR1BJTyBhY2Nlc3MgKG5vdCBzdXBwb3J0ZWQgb24gV005NzA1KQogICogVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IGNvZGVjIEdQSU8gYW5kIFZpcnR1YWwgR1BJTyBzdGF0dXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dtOTd4eF9iYXR0LmggYi9pbmNsdWRlL2xpbnV4L3dtOTd4eF9iYXR0LmgKaW5kZXggOTY4MWQxYS4uYTFkNjQxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93bTk3eHhfYmF0dC5oCisrKyBiL2luY2x1ZGUvbGludXgvd205N3h4X2JhdHQuaApAQCAtMywyMiArMywxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvd205N3h4Lmg+CiAKLXN0cnVjdCB3bTk3eHhfYmF0dF9pbmZvIHsKLQlpbnQJYmF0dF9hdXg7Ci0JaW50CXRlbXBfYXV4OwotCWludAljaGFyZ2VfZ3BpbzsKLQlpbnQJbWluX3ZvbHRhZ2U7Ci0JaW50CW1heF92b2x0YWdlOwotCWludAliYXR0X2RpdjsKLQlpbnQJYmF0dF9tdWx0OwotCWludAl0ZW1wX2RpdjsKLQlpbnQJdGVtcF9tdWx0OwotCWludAliYXR0X3RlY2g7Ci0JY2hhcgkqYmF0dF9uYW1lOwotfTsKKyN3YXJuaW5nIFRoaXMgZmlsZSB3aWxsIGJlIHJlbW92ZWQgc29vbiwgdXNlIHdtOTd4eC5oIGluc3RlYWQhCisKKyNkZWZpbmUgd205N3h4X2JhdHRfaW5mbyB3bTk3eHhfYmF0dF9wZGF0YQogCiAjaWZkZWYgQ09ORklHX0JBVFRFUllfV005N1hYCi12b2lkIF9faW5pdCB3bTk3eHhfYmF0X3NldF9wZGF0YShzdHJ1Y3Qgd205N3h4X2JhdHRfaW5mbyAqZGF0YSk7Cit2b2lkIHdtOTd4eF9iYXRfc2V0X3BkYXRhKHN0cnVjdCB3bTk3eHhfYmF0dF9pbmZvICpkYXRhKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgd205N3h4X2JhdF9zZXRfcGRhdGEoc3RydWN0IHdtOTd4eF9iYXR0X2luZm8gKmRhdGEpIHt9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCmluZGV4IDdlZjBjN2IuLmNmMjRjMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaApAQCAtMjA3LDYgKzIwNyw3IEBACiAKIGV4dGVybiB2b2lkIGZsdXNoX3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpOwogZXh0ZXJuIHZvaWQgZmx1c2hfc2NoZWR1bGVkX3dvcmsodm9pZCk7CitleHRlcm4gdm9pZCBmbHVzaF9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yayk7CiAKIGV4dGVybiBpbnQgc2NoZWR1bGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogZXh0ZXJuIGludCBzY2hlZHVsZV93b3JrX29uKGludCBjcHUsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAppbmRleCA3NWNmNTg2Li42NmViZGRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKQEAgLTExMCwyMSArMTEwLDIwIEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBkZXRlcm1pbmVfZGlydHlhYmxlX21lbW9yeSh2b2lkKTsKIAogZXh0ZXJuIGludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpOwogZXh0ZXJuIGludCBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpOwogZXh0ZXJuIGludCBkaXJ0eV9yYXRpb19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKIAkJbG9mZl90ICpwcG9zKTsKIGV4dGVybiBpbnQgZGlydHlfYnl0ZXNfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCiAJCWxvZmZfdCAqcHBvcyk7CiAKIHN0cnVjdCBjdGxfdGFibGU7Ci1zdHJ1Y3QgZmlsZTsKLWludCBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCitpbnQgZGlydHlfd3JpdGViYWNrX2NlbnRpc2Vjc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LAogCQkJCSAgICAgIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiAKIHZvaWQgZ2V0X2RpcnR5X2xpbWl0cyh1bnNpZ25lZCBsb25nICpwYmFja2dyb3VuZCwgdW5zaWduZWQgbG9uZyAqcGRpcnR5LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvOXAvOXAuaCBiL2luY2x1ZGUvbmV0LzlwLzlwLmgKaW5kZXggYjc3YzE0Ny4uYTdmYjU0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvOXAvOXAuaAorKysgYi9pbmNsdWRlL25ldC85cC85cC5oCkBAIC0zOCw2ICszOCw4IEBACiAgKiBAUDlfREVCVUdfU0xBQlM6IG1lbW9yeSBtYW5hZ2VtZW50IHRyYWNpbmcKICAqIEBQOV9ERUJVR19GQ0FMTDogdmVyYm9zZSBkdW1wIG9mIHByb3RvY29sIG1lc3NhZ2VzCiAgKiBAUDlfREVCVUdfRklEOiBmaWQgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gdHJhY2tpbmcKKyAqIEBQOV9ERUJVR19QS1Q6IHBhY2tldCBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nCisgKiBAUDlfREVCVUdfRlNDOiBGUy1jYWNoZSB0cmFjaW5nCiAgKgogICogVGhlc2UgZmxhZ3MgYXJlIHBhc3NlZCBhdCBtb3VudCB0aW1lIHRvIHR1cm4gb24gdmFyaW91cyBsZXZlbHMgb2YKICAqIHZlcmJvc2l0eSBhbmQgdHJhY2luZyB3aGljaCB3aWxsIGJlIG91dHB1dCB0byB0aGUgc3lzdGVtIGxvZ3MuCkBAIC01NCw2ICs1Niw3IEBACiAJUDlfREVCVUdfRkNBTEwgPQkoMTw8OCksCiAJUDlfREVCVUdfRklEID0JCSgxPDw5KSwKIAlQOV9ERUJVR19QS1QgPQkJKDE8PDEwKSwKKwlQOV9ERUJVR19GU0MgPQkJKDE8PDExKSwKIH07CiAKICNpZmRlZiBDT05GSUdfTkVUXzlQX0RFQlVHCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC85cC9jbGllbnQuaCBiL2luY2x1ZGUvbmV0LzlwL2NsaWVudC5oCmluZGV4IGUyNjgxMjIuLmZiMDBiMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0LzlwL2NsaWVudC5oCisrKyBiL2luY2x1ZGUvbmV0LzlwL2NsaWVudC5oCkBAIC0xNTksOCArMTU5LDcgQEAKICAqIEBxaWQ6IHRoZSAmcDlfcWlkIHNlcnZlciBpZGVudGlmaWVyIHRoaXMgaGFuZGxlIHBvaW50cyB0bwogICogQGlvdW5pdDogdGhlIHNlcnZlciByZXBvcnRlZCBtYXhpbXVtIHRyYW5zYWN0aW9uIHNpemUgZm9yIHRoaXMgZmlsZQogICogQHVpZDogdGhlIG51bWVyaWMgdWlkIG9mIHRoZSBsb2NhbCB1c2VyIHdobyBvd25zIHRoaXMgaGFuZGxlCi0gKiBAYXV4OiB0cmFuc3BvcnQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKHVudXNlZD8pCi0gKiBAcmRpcl9mcG9zOiB0cmFja3Mgb2Zmc2V0IG9mIGZpbGUgcG9zaXRpb24gd2hlbiByZWFkaW5nIGRpcmVjdG9yeSBjb250ZW50cworICogQHJkaXI6IHJlYWRkaXIgYWNjb3VudGluZyBzdHJ1Y3R1cmUgKGFsbG9jYXRlZCBvbiBkZW1hbmQpCiAgKiBAZmxpc3Q6IHBlci1jbGllbnQtaW5zdGFuY2UgZmlkIHRyYWNraW5nCiAgKiBAZGxpc3Q6IHBlci1kZW50cnkgZmlkIHRyYWNraW5nCiAgKgpAQCAtMTc0LDkgKzE3Myw5IEBACiAJc3RydWN0IHA5X3FpZCBxaWQ7CiAJdTMyIGlvdW5pdDsKIAl1aWRfdCB1aWQ7Ci0Jdm9pZCAqYXV4OwogCi0JaW50IHJkaXJfZnBvczsKKwl2b2lkICpyZGlyOworCiAJc3RydWN0IGxpc3RfaGVhZCBmbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRsaXN0OwkvKiBsaXN0IG9mIGFsbCBmaWRzIGF0dGFjaGVkIHRvIGEgZGVudHJ5ICovCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY29tcGF0LmggYi9pbmNsdWRlL25ldC9jb21wYXQuaAppbmRleCA1YmJmOGJmLi43YzMwMDI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jb21wYXQuaAorKysgYi9pbmNsdWRlL25ldC9jb21wYXQuaApAQCAtNDAsOCArNDAsOCBAQAogCiBleHRlcm4gaW50IGNtc2doZHJfZnJvbV91c2VyX2NvbXBhdF90b19rZXJuKHN0cnVjdCBtc2doZHIgKiwgc3RydWN0IHNvY2sgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwogCi1leHRlcm4gaW50IGNvbXBhdF9tY19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICosIGludCwgaW50LCBjaGFyIF9fdXNlciAqLCBpbnQsCi0JaW50ICgqKShzdHJ1Y3Qgc29jayAqLCBpbnQsIGludCwgY2hhciBfX3VzZXIgKiwgaW50KSk7CitleHRlcm4gaW50IGNvbXBhdF9tY19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICosIGludCwgaW50LCBjaGFyIF9fdXNlciAqLCB1bnNpZ25lZCBpbnQsCisJaW50ICgqKShzdHJ1Y3Qgc29jayAqLCBpbnQsIGludCwgY2hhciBfX3VzZXIgKiwgdW5zaWduZWQgaW50KSk7CiBleHRlcm4gaW50IGNvbXBhdF9tY19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICosIGludCwgaW50LCBjaGFyIF9fdXNlciAqLAogCWludCBfX3VzZXIgKiwgaW50ICgqKShzdHJ1Y3Qgc29jayAqLCBpbnQsIGludCwgY2hhciBfX3VzZXIgKiwKIAkJCQlpbnQgX191c2VyICopKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCmluZGV4IDAzY2ZmZDkuLjY5NmQ2ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaApAQCAtNDgsMTMgKzQ4LDEzIEBACiAJdTE2CSAgICBuZXRfaGVhZGVyX2xlbjsKIAl1MTYJICAgIHNvY2thZGRyX2xlbjsKIAlpbnQJICAgICgqc2V0c29ja29wdCkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCAKLQkJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworCQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbik7CiAJaW50CSAgICAoKmdldHNvY2tvcHQpKHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgCiAJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwogI2lmZGVmIENPTkZJR19DT01QQVQKIAlpbnQJICAgICgqY29tcGF0X3NldHNvY2tvcHQpKHN0cnVjdCBzb2NrICpzaywKIAkJCQlpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogCWludAkgICAgKCpjb21wYXRfZ2V0c29ja29wdCkoc3RydWN0IHNvY2sgKnNrLAogCQkJCWludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKQEAgLTMzMiw1ICszMzIsNSBAQAogZXh0ZXJuIGludCBpbmV0X2Nza19jb21wYXRfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkJICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKIGV4dGVybiBpbnQgaW5ldF9jc2tfY29tcGF0X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworCQkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogI2VuZGlmIC8qIF9JTkVUX0NPTk5FQ1RJT05fU09DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCmluZGV4IGI2M2I4MGYuLmY5M2FkOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCkBAIC0xMzAsMTEgKzEzMCwxMSBAQAogCV9fdTE2CQkJdHdfbnVtOwogCWttZW1jaGVja19iaXRmaWVsZF9iZWdpbihmbGFncyk7CiAJLyogQW5kIHRoZXNlIGFyZSBvdXJzLiAqLwotCV9fdTgJCQl0d19pcHY2b25seToxLAotCQkJCXR3X3RyYW5zcGFyZW50OjE7Ci0JLyogMTQgYml0cyBob2xlLCB0cnkgdG8gcGFjayAqLworCXVuc2lnbmVkIGludAkJdHdfaXB2Nm9ubHkgICAgIDogMSwKKwkJCQl0d190cmFuc3BhcmVudCAgOiAxLAorCQkJCXR3X3BhZAkJOiAxNCwJLyogMTQgYml0cyBob2xlICovCisJCQkJdHdfaXB2Nl9vZmZzZXQgIDogMTY7CiAJa21lbWNoZWNrX2JpdGZpZWxkX2VuZChmbGFncyk7Ci0JX191MTYJCQl0d19pcHY2X29mZnNldDsKIAl1bnNpZ25lZCBsb25nCQl0d190dGQ7CiAJc3RydWN0IGluZXRfYmluZF9idWNrZXQJKnR3X3RiOwogCXN0cnVjdCBobGlzdF9ub2RlCXR3X2RlYXRoX25vZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCA3MmMzNjkyLi4yZjQ3ZTU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTM4MSwxMCArMzgxLDEwIEBACiBleHRlcm4gdm9pZAlpcF9jbXNnX3JlY3Yoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQJaXBfY21zZ19zZW5kKHN0cnVjdCBuZXQgKm5ldCwKIAkJCSAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3QgaXBjbV9jb29raWUgKmlwYyk7Ci1leHRlcm4gaW50CWlwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKK2V4dGVybiBpbnQJaXBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogZXh0ZXJuIGludAlpcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKIGV4dGVybiBpbnQJY29tcGF0X2lwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsCi0JCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CisJCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbik7CiBleHRlcm4gaW50CWNvbXBhdF9pcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLAogCQkJaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7CiBleHRlcm4gaW50CWlwX3JhX2NvbnRyb2woc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBjaGFyIG9uLCB2b2lkICgqZGVzdHJ1Y3Rvcikoc3RydWN0IHNvY2sgKikpOwpAQCAtMzk5LDcgKzM5OSw3IEBACiAgKiBmZWQgaW50byB0aGUgcm91dGluZyBjYWNoZSBzaG91bGQgdXNlIHRoZXNlIGhhbmRsZXJzLgogICovCiBpbnQgaXB2NF9kb2ludF9hbmRfZmx1c2goY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKLQkJCSBzdHJ1Y3QgZmlsZSogZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKIGludCBpcHY0X2RvaW50X2FuZF9mbHVzaF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAogCQkJCSAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwX2ZpYi5oIGIvaW5jbHVkZS9uZXQvaXBfZmliLmgKaW5kZXggZWY5MWZlOS4uNGQyMmZhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBfZmliLmgKQEAgLTIxMCw3ICsyMTAsOCBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHJ0bV9pcHY0X3BvbGljeVtdOwogZXh0ZXJuIHZvaWQJCWlwX2ZpYl9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBmaWJfdmFsaWRhdGVfc291cmNlKF9fYmUzMiBzcmMsIF9fYmUzMiBkc3QsIHU4IHRvcywgaW50IG9pZiwKLQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMzIgKnNwZWNfZHN0LCB1MzIgKml0YWcpOworCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiAqc3BlY19kc3QsCisJCQkgICAgICAgdTMyICppdGFnLCB1MzIgbWFyayk7CiBleHRlcm4gdm9pZCBmaWJfc2VsZWN0X2RlZmF1bHQoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZscCwKIAkJCSAgICAgICBzdHJ1Y3QgZmliX3Jlc3VsdCAqcmVzKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBpcC5oIGIvaW5jbHVkZS9uZXQvaXBpcC5oCmluZGV4IDVkMzAzNmYuLjg3YWNmOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwaXAuaAorKysgYi9pbmNsdWRlL25ldC9pcGlwLmgKQEAgLTEyLDcgKzEyLDYgQEAKIAlzdHJ1Y3QgaXBfdHVubmVsCSpuZXh0OwogCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiAKLQlpbnQJCQlyZWN1cnNpb247CS8qIERlcHRoIG9mIGhhcmRfc3RhcnRfeG1pdCByZWN1cnNpb24gKi8KIAlpbnQJCQllcnJfY291bnQ7CS8qIE51bWJlciBvZiBhcnJpdmVkIElDTVAgZXJyb3JzICovCiAJdW5zaWduZWQgbG9uZwkJZXJyX3RpbWU7CS8qIFRpbWUgd2hlbiB0aGUgbGFzdCBJQ01QIGVycm9yIGFycml2ZWQgKi8KIApAQCAtMjgsMTggKzI3LDExIEBACiAJdW5zaWduZWQgaW50CQkJcHJsX2NvdW50OwkvKiAjIG9mIGVudHJpZXMgaW4gUFJMICovCiB9OwogCi0vKiBJU0FUQVA6IGRlZmF1bHQgaW50ZXJ2YWwgYmV0d2VlbiBSUyBpbiBzZWNvbmR5ICovCi0jZGVmaW5lIElQVFVOTkVMX1JTX0RFRkFVTFRfREVMQVkJKDkwMCkKLQogc3RydWN0IGlwX3R1bm5lbF9wcmxfZW50cnkKIHsKIAlzdHJ1Y3QgaXBfdHVubmVsX3BybF9lbnRyeQkqbmV4dDsKIAlfX2JlMzIJCQkJYWRkcjsKIAl1MTYJCQkJZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkJCXJzX2RlbGF5OwotCXN0cnVjdCB0aW1lcl9saXN0CQlyc190aW1lcjsKLQlzdHJ1Y3QgaXBfdHVubmVsCQkqdHVubmVsOwotCXNwaW5sb2NrX3QJCQlsb2NrOwogfTsKIAogI2RlZmluZSBJUFRVTk5FTF9YTUlUKCkgZG8gewkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwdjYuaCBiL2luY2x1ZGUvbmV0L2lwdjYuaAppbmRleCBhZDlhNTExLi44YzMxZDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHY2LmgKKysrIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCkBAIC01NTAsNyArNTUwLDcgQEAKIGV4dGVybiBpbnQJCQlpcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIAogCQkJCQkJaW50IG9wdG5hbWUsCiAJCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCAKLQkJCQkJCWludCBvcHRsZW4pOworCQkJCQkJdW5zaWduZWQgaW50IG9wdGxlbik7CiBleHRlcm4gaW50CQkJaXB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCAKIAkJCQkJCWludCBvcHRuYW1lLAogCQkJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgCkBAIC01NTksNyArNTU5LDcgQEAKIAkJCQkJCWludCBsZXZlbCwKIAkJCQkJCWludCBvcHRuYW1lLAogCQkJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwKLQkJCQkJCWludCBvcHRsZW4pOworCQkJCQkJdW5zaWduZWQgaW50IG9wdGxlbik7CiBleHRlcm4gaW50CQkJY29tcGF0X2lwdjZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCQlpbnQgbGV2ZWwsCiAJCQkJCQlpbnQgb3B0bmFtZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L21hYzgwMjExLmggYi9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCmluZGV4IDQ2Njg1OWIuLmM3NWI5NjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaApAQCAtMTY2OSw2ICsxNjY5LDggQEAKICAqIHRvIHRoaXMgZnVuY3Rpb24gYW5kIGllZWU4MDIxMV9yeF9pcnFzYWZlKCkgbWF5IG5vdCBiZSBtaXhlZCBmb3IgYQogICogc2luZ2xlIGhhcmR3YXJlLgogICoKKyAqIE5vdGUgdGhhdCByaWdodCBub3csIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZC4KKyAqCiAgKiBAaHc6IHRoZSBoYXJkd2FyZSB0aGlzIGZyYW1lIGNhbWUgaW4gb24KICAqIEBza2I6IHRoZSBidWZmZXIgdG8gcmVjZWl2ZSwgb3duZWQgYnkgbWFjODAyMTEgYWZ0ZXIgdGhpcyBjYWxsCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25kaXNjLmggYi9pbmNsdWRlL25ldC9uZGlzYy5oCmluZGV4IDE0NTllZDMuLmY3NmYyMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25kaXNjLmgKKysrIGIvaW5jbHVkZS9uZXQvbmRpc2MuaApAQCAtNTUsNyArNTUsNiBAQAogI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KIAogc3RydWN0IGN0bF90YWJsZTsKLXN0cnVjdCBmaWxlOwogc3RydWN0IGluZXQ2X2RldjsKIHN0cnVjdCBuZXRfZGV2aWNlOwogc3RydWN0IG5ldF9wcm90b19mYW1pbHk7CkBAIC0xMzksNyArMTM4LDYgQEAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiBleHRlcm4gaW50IAkJCW5kaXNjX2lmaW5mb19zeXNjdGxfY2hhbmdlKHN0cnVjdCBjdGxfdGFibGUgKmN0bCwKIAkJCQkJCQkgICBpbnQgd3JpdGUsCi0JCQkJCQkJICAgc3RydWN0IGZpbGUgKiBmaWxwLAogCQkJCQkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsCiAJCQkJCQkJICAgc2l6ZV90ICpsZW5wLAogCQkJCQkJCSAgIGxvZmZfdCAqcHBvcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCmluZGV4IDQyZDAwY2UuLjZlNWYwZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCkBAIC01NDQsNyArNTQ0LDcgQEAKIAkJCQkJIGludCBsZXZlbCwKIAkJCQkJIGludCBvcHRuYW1lLAogCQkJCQkgY2hhciBfX3VzZXIgKm9wdHZhbCwKLQkJCQkJIGludCBvcHRsZW4pOworCQkJCQkgdW5zaWduZWQgaW50IG9wdGxlbik7CiAJaW50CQkoKmdldHNvY2tvcHQpCShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSBpbnQgbGV2ZWwsCiAJCQkJCSBpbnQgb3B0bmFtZSwKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQkJCQkgaW50IGxldmVsLAogCQkJCQkgaW50IG9wdG5hbWUsCiAJCQkJCSBjaGFyIF9fdXNlciAqb3B0dmFsLAotCQkJCQkgaW50IG9wdGxlbik7CisJCQkJCSB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIAlpbnQJCSgqY29tcGF0X2dldHNvY2tvcHQpCShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSBpbnQgbGV2ZWwsCiAJCQkJCSBpbnQgb3B0bmFtZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCA5NTA0MDlkLi45Zjk2Mzk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC0yMjYsMTIgKzIyNiwxMiBAQAogI2RlZmluZSBza19wcm90CQkJX19za19jb21tb24uc2tjX3Byb3QKICNkZWZpbmUgc2tfbmV0CQkJX19za19jb21tb24uc2tjX25ldAogCWttZW1jaGVja19iaXRmaWVsZF9iZWdpbihmbGFncyk7Ci0JdW5zaWduZWQgY2hhcgkJc2tfc2h1dGRvd24gOiAyLAotCQkJCXNrX25vX2NoZWNrIDogMiwKLQkJCQlza191c2VybG9ja3MgOiA0OworCXVuc2lnbmVkIGludAkJc2tfc2h1dGRvd24gIDogMiwKKwkJCQlza19ub19jaGVjayAgOiAyLAorCQkJCXNrX3VzZXJsb2NrcyA6IDQsCisJCQkJc2tfcHJvdG9jb2wgIDogOCwKKwkJCQlza190eXBlICAgICAgOiAxNjsKIAlrbWVtY2hlY2tfYml0ZmllbGRfZW5kKGZsYWdzKTsKLQl1bnNpZ25lZCBjaGFyCQlza19wcm90b2NvbDsKLQl1bnNpZ25lZCBzaG9ydAkJc2tfdHlwZTsKIAlpbnQJCQlza19yY3ZidWY7CiAJc29ja2V0X2xvY2tfdAkJc2tfbG9jazsKIAkvKgpAQCAtNjI0LDcgKzYyNCw3IEBACiAJdm9pZAkJCSgqc2h1dGRvd24pKHN0cnVjdCBzb2NrICpzaywgaW50IGhvdyk7CiAJaW50CQkJKCpzZXRzb2Nrb3B0KShzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgCiAJCQkJCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLAotCQkJCQlpbnQgb3B0bGVuKTsKKwkJCQkJdW5zaWduZWQgaW50IG9wdGxlbik7CiAJaW50CQkJKCpnZXRzb2Nrb3B0KShzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgCiAJCQkJCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCAKIAkJCQkJaW50IF9fdXNlciAqb3B0aW9uKTsgIAkgCkBAIC02MzIsNyArNjMyLDcgQEAKIAlpbnQJCQkoKmNvbXBhdF9zZXRzb2Nrb3B0KShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCWludCBsZXZlbCwKIAkJCQkJaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsCi0JCQkJCWludCBvcHRsZW4pOworCQkJCQl1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIAlpbnQJCQkoKmNvbXBhdF9nZXRzb2Nrb3B0KShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCWludCBsZXZlbCwKIAkJCQkJaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsCkBAIC05NTEsNyArOTUxLDcgQEAKIAogZXh0ZXJuIGludAkJCXNvY2tfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsCiAJCQkJCQlpbnQgb3AsIGNoYXIgX191c2VyICpvcHR2YWwsCi0JCQkJCQlpbnQgb3B0bGVuKTsKKwkJCQkJCXVuc2lnbmVkIGludCBvcHRsZW4pOwogCiBleHRlcm4gaW50CQkJc29ja19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwKIAkJCQkJCWludCBvcCwgY2hhciBfX3VzZXIgKm9wdHZhbCwgCkBAIC05OTMsNyArOTkzLDcgQEAKIGV4dGVybiBpbnQJCQlzb2NrX25vX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqLCBpbnQgLCBpbnQsCiAJCQkJCQkgICBjaGFyIF9fdXNlciAqLCBpbnQgX191c2VyICopOwogZXh0ZXJuIGludAkJCXNvY2tfbm9fc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICosIGludCwgaW50LAotCQkJCQkJICAgY2hhciBfX3VzZXIgKiwgaW50KTsKKwkJCQkJCSAgIGNoYXIgX191c2VyICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgICAgIHNvY2tfbm9fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHNvY2tldCAqLAogCQkJCQkJc3RydWN0IG1zZ2hkciAqLCBzaXplX3QpOwogZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgICAgICBzb2NrX25vX3JlY3Ztc2coc3RydWN0IGtpb2NiICosIHN0cnVjdCBzb2NrZXQgKiwKQEAgLTEwMTUsMTEgKzEwMTUsMTEgQEAKIGV4dGVybiBpbnQgc29ja19jb21tb25fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgc29ja19jb21tb25fc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CisJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIGV4dGVybiBpbnQgY29tcGF0X3NvY2tfY29tbW9uX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLAogCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKIGV4dGVybiBpbnQgY29tcGF0X3NvY2tfY29tbW9uX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLAotCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CisJCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIAogZXh0ZXJuIHZvaWQgc2tfY29tbW9uX3JlbGVhc2Uoc3RydWN0IHNvY2sgKnNrKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCA1NmI3NjAyLi4wM2E0OWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtMzk0LDEzICszOTQsMTMgQEAKIAkJCQkJICAgICAgIGludCBfX3VzZXIgKm9wdGxlbik7CiBleHRlcm4gaW50CQkJdGNwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIAogCQkJCQkgICAgICAgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIAotCQkJCQkgICAgICAgaW50IG9wdGxlbik7CisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIGV4dGVybiBpbnQJCQljb21wYXRfdGNwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLAogCQkJCQlpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwogZXh0ZXJuIGludAkJCWNvbXBhdF90Y3Bfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCWludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIGV4dGVybiB2b2lkCQkJdGNwX3NldF9rZWVwYWxpdmUoc3RydWN0IHNvY2sgKnNrLCBpbnQgdmFsKTsKIGV4dGVybiBpbnQJCQl0Y3BfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgIHN0cnVjdCBtc2doZHIgKm1zZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcC5oIGIvaW5jbHVkZS9uZXQvdWRwLmgKaW5kZXggNWZiMDI5Zi4uZjk4YWJkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdWRwLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwLmgKQEAgLTE0NCw3ICsxNDQsNyBAQAogZXh0ZXJuIGludCAJdWRwX2xpYl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCSAgICAgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKIGV4dGVybiBpbnQgCXVkcF9saWJfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbiwKKwkJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuLAogCQkJCSAgIGludCAoKnB1c2hfcGVuZGluZ19mcmFtZXMpKHN0cnVjdCBzb2NrICopKTsKIAogZXh0ZXJuIHN0cnVjdCBzb2NrICp1ZHA0X2xpYl9sb29rdXAoc3RydWN0IG5ldCAqbmV0LCBfX2JlMzIgc2FkZHIsIF9fYmUxNiBzcG9ydCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3dleHQuaCBiL2luY2x1ZGUvbmV0L3dleHQuaAppbmRleCA2ZDc2YTM5Li4zZjJiOTRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC93ZXh0LmgKKysrIGIvaW5jbHVkZS9uZXQvd2V4dC5oCkBAIC0xNCw2ICsxNCw3IEBACiAJCQkgICAgIHZvaWQgX191c2VyICphcmcpOwogZXh0ZXJuIGludCBjb21wYXRfd2V4dF9oYW5kbGVfaW9jdGwoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgY21kLAogCQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gc3RydWN0IGl3X3N0YXRpc3RpY3MgKmdldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCB3ZXh0X3Byb2NfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9zcy5oIGIvaW5jbHVkZS9wY21jaWEvc3MuaAppbmRleCA5YTNiNDk4Li5lMGY2ZmViIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9zcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL3NzLmgKQEAgLTI2Miw2ICsyNjIsOCBAQAogCXN0cnVjdCBkZXZpY2UJCQlkZXY7CiAJLyogZGF0YSBpbnRlcm5hbCB0byB0aGUgc29ja2V0IGRyaXZlciAqLwogCXZvaWQJCQkJKmRyaXZlcl9kYXRhOworCS8qIHN0YXR1cyBvZiB0aGUgY2FyZCBkdXJpbmcgcmVzdW1lIGZyb20gYSBzeXN0ZW0gc2xlZXAgc3RhdGUgKi8KKwlpbnQJCQkJcmVzdW1lX3N0YXR1czsKIH07CiAKIApAQCAtMjc5LDcgKzI4MSw5IEBACiBleHRlcm4gc3RydWN0IHBjY2FyZF9yZXNvdXJjZV9vcHMgcGNjYXJkX25vbnN0YXRpY19vcHM7CiAKIC8qIHNvY2tldCBkcml2ZXJzIGFyZSBleHBlY3RlZCB0byB1c2UgdGhlc2UgY2FsbGJhY2tzIGluIHRoZWlyIC5kcnYgc3RydWN0ICovCi1leHRlcm4gaW50IHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworZXh0ZXJuIGludCBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBwY21jaWFfc29ja2V0X2Rldl9lYXJseV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHBjbWNpYV9zb2NrZXRfZGV2X2xhdGVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiAvKiBzb2NrZXQgZHJpdmVycyB1c2UgdGhpcyBjYWxsYmFjayBpbiB0aGVpciBJUlEgaGFuZGxlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmggYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAppbmRleCA4ODdlNTdlLi5hNzJlZGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaApAQCAtMzAzLDYgKzMwMyw3IEBACiAJaW50CQkJY21kc19tYXg7CS8qIHNpemUgb2YgY21kcyBhcnJheSAqLwogCXN0cnVjdCBpc2NzaV90YXNrCSoqY21kczsJCS8qIE9yaWdpbmFsIENtZHMgYXJyICovCiAJc3RydWN0IGlzY3NpX3Bvb2wJY21kcG9vbDsJLyogUERVJ3MgcG9vbCAqLworCXZvaWQJCQkqZGRfZGF0YTsJLyogTExEIHByaXZhdGUgZGF0YSAqLwogfTsKIAogZW51bSB7CkBAIC0zNjMsNyArMzY0LDcgQEAKICAqLwogZXh0ZXJuIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqCiBpc2NzaV9zZXNzaW9uX3NldHVwKHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKiwgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCi0JCSAgICB1aW50MTZfdCwgaW50LCB1aW50MzJfdCwgdW5zaWduZWQgaW50KTsKKwkJICAgIHVpbnQxNl90LCBpbnQsIGludCwgdWludDMyX3QsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBpc2NzaV9zZXNzaW9uX3RlYXJkb3duKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqKTsKIGV4dGVybiB2b2lkIGlzY3NpX3Nlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICopOwogZXh0ZXJuIGludCBpc2NzaV9zZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaS5oCmluZGV4IDA4NDQ3OGUuLjM0YzQ2YWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2kuaApAQCAtMTI5LDYgKzEyOSw5IEBACiAjZGVmaW5lIE1JX1JFUE9SVF9UQVJHRVRfUEdTICAweDBhCiAvKiB2YWx1ZXMgZm9yIG1haW50ZW5hbmNlIG91dCAqLwogI2RlZmluZSBNT19TRVRfVEFSR0VUX1BHUyAgICAgMHgwYQorLyogdmFsdWVzIGZvciB2YXJpYWJsZSBsZW5ndGggY29tbWFuZCAqLworI2RlZmluZSBSRUFEXzMyCQkgICAgICAweDA5CisjZGVmaW5lIFdSSVRFXzMyCSAgICAgIDB4MGIKIAogLyogVmFsdWVzIGZvciBUMTAvMDQtMjYycjcgKi8KICNkZWZpbmUJQVRBXzE2CQkgICAgICAweDg1CS8qIDE2LWJ5dGUgcGFzcy10aHJ1ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKaW5kZXggMzg3OGQxZC4uYTVlODg1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaApAQCAtMjI5LDEwICsyMjksNiBAQAogCS8qIE9TLUhCQTogUHJvdGVjdGVkLCBIQkEtVGFyZ2V0OiBQcm90ZWN0ZWQgKi8KIAlTQ1NJX1BST1RfUkVBRF9QQVNTLAogCVNDU0lfUFJPVF9XUklURV9QQVNTLAotCi0JLyogT1MtSEJBOiBQcm90ZWN0ZWQsIEhCQS1UYXJnZXQ6IFByb3RlY3RlZCwgY2hlY2tzdW0gY29udmVyc2lvbiAqLwotCVNDU0lfUFJPVF9SRUFEX0NPTlZFUlQsCi0JU0NTSV9QUk9UX1dSSVRFX0NPTlZFUlQsCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9zZXRfcHJvdF9vcChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLCB1bnNpZ25lZCBjaGFyIG9wKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IGI2MmEwOTcuLjZlNzI4YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTc5OCw5ICs3OTgsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNjc2lfaG9zdF9kaWZfY2FwYWJsZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgaW50IHRhcmdldF90eXBlKQogewogCXN3aXRjaCAodGFyZ2V0X3R5cGUpIHsKLQljYXNlIDE6IHJldHVybiBzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESUZfVFlQRTFfUFJPVEVDVElPTjsKLQljYXNlIDI6IHJldHVybiBzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESUZfVFlQRTJfUFJPVEVDVElPTjsKLQljYXNlIDM6IHJldHVybiBzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESUZfVFlQRTNfUFJPVEVDVElPTjsKKwljYXNlIDE6CisJCWlmIChzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESUZfVFlQRTFfUFJPVEVDVElPTikKKwkJCXJldHVybiB0YXJnZXRfdHlwZTsKKwljYXNlIDI6CisJCWlmIChzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESUZfVFlQRTJfUFJPVEVDVElPTikKKwkJCXJldHVybiB0YXJnZXRfdHlwZTsKKwljYXNlIDM6CisJCWlmIChzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESUZfVFlQRTNfUFJPVEVDVElPTikKKwkJCXJldHVybiB0YXJnZXRfdHlwZTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTgwOCwxMyArODE0LDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNjc2lfaG9zdF9kaXhfY2FwYWJsZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgaW50IHRhcmdldF90eXBlKQogeworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5URUdSSVRZKQogCXN3aXRjaCAodGFyZ2V0X3R5cGUpIHsKIAljYXNlIDA6IHJldHVybiBzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESVhfVFlQRTBfUFJPVEVDVElPTjsKIAljYXNlIDE6IHJldHVybiBzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESVhfVFlQRTFfUFJPVEVDVElPTjsKIAljYXNlIDI6IHJldHVybiBzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESVhfVFlQRTJfUFJPVEVDVElPTjsKIAljYXNlIDM6IHJldHVybiBzaG9zdC0+cHJvdF9jYXBhYmlsaXRpZXMgJiBTSE9TVF9ESVhfVFlQRTNfUFJPVEVDVElPTjsKIAl9Ci0KKyNlbmRpZgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaAppbmRleCBkODZhZjk0Li4wMDQwNWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmgKQEAgLTQ4OCw2ICs0ODgsMzkgQEAKIAkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPm9sZF9zZWN0b3IpCiApOwogCitUUkFDRV9FVkVOVChibG9ja19ycV9yZW1hcCwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGRldl90IGRldiwKKwkJIHNlY3Rvcl90IGZyb20pLAorCisJVFBfQVJHUyhxLCBycSwgZGV2LCBmcm9tKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkpCisJCV9fZmllbGQoIHNlY3Rvcl90LAlzZWN0b3IJCSkKKwkJX19maWVsZCggdW5zaWduZWQgaW50LAlucl9zZWN0b3IJKQorCQlfX2ZpZWxkKCBkZXZfdCwJCW9sZF9kZXYJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCW9sZF9zZWN0b3IJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gZGlza19kZXZ0KHJxLT5ycV9kaXNrKTsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJsa19ycV9wb3MocnEpOworCQlfX2VudHJ5LT5ucl9zZWN0b3IJPSBibGtfcnFfc2VjdG9ycyhycSk7CisJCV9fZW50cnktPm9sZF9kZXYJPSBkZXY7CisJCV9fZW50cnktPm9sZF9zZWN0b3IJPSBmcm9tOworCQlibGtfZmlsbF9yd2JzX3JxKF9fZW50cnktPnJ3YnMsIHJxKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAlbGx1ICsgJXUgPC0gKCVkLCVkKSAlbGx1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yd2JzLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwKKwkJICBNQUpPUihfX2VudHJ5LT5vbGRfZGV2KSwgTUlOT1IoX19lbnRyeS0+b2xkX2RldiksCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5vbGRfc2VjdG9yKQorKTsKKwogI2VuZGlmIC8qIF9UUkFDRV9CTE9DS19IICovCiAKIC8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCmluZGV4IGMxYmQ4ZjEuLmQwOTU1MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKQEAgLTExLDYgKzExLDcgQEAKIHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdDsKIHN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlOwogc3RydWN0IGV4dDRfaW5vZGVfaW5mbzsKK3N0cnVjdCBtcGFnZV9kYV9kYXRhOwogCiAjZGVmaW5lIEVYVDRfSShpbm9kZSkgKGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IGV4dDRfaW5vZGVfaW5mbywgdmZzX2lub2RlKSkKIApAQCAtMjM2LDYgKzIzNyw3IEBACiAJCV9fZmllbGQoCWNoYXIsCWZvcl9rdXBkYXRlCQkpCiAJCV9fZmllbGQoCWNoYXIsCWZvcl9yZWNsYWltCQkpCiAJCV9fZmllbGQoCWNoYXIsCXJhbmdlX2N5Y2xpYwkJKQorCQlfX2ZpZWxkKCAgICAgICBwZ29mZl90LAl3cml0ZWJhY2tfaW5kZXgJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC0yNDksMTUgKzI1MSwxNyBAQAogCQlfX2VudHJ5LT5mb3Jfa3VwZGF0ZQk9IHdiYy0+Zm9yX2t1cGRhdGU7CiAJCV9fZW50cnktPmZvcl9yZWNsYWltCT0gd2JjLT5mb3JfcmVjbGFpbTsKIAkJX19lbnRyeS0+cmFuZ2VfY3ljbGljCT0gd2JjLT5yYW5nZV9jeWNsaWM7CisJCV9fZW50cnktPndyaXRlYmFja19pbmRleCA9IGlub2RlLT5pX21hcHBpbmctPndyaXRlYmFja19pbmRleDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgaW5vICVsdSBucl90b193cml0ZSAlbGQgcGFnZXNfc2tpcHBlZCAlbGQgcmFuZ2Vfc3RhcnQgJWxsdSByYW5nZV9lbmQgJWxsdSBub25ibG9ja2luZyAlZCBmb3Jfa3VwZGF0ZSAlZCBmb3JfcmVjbGFpbSAlZCByYW5nZV9jeWNsaWMgJWQiLAorCVRQX3ByaW50aygiZGV2ICVzIGlubyAlbHUgbnJfdG9fd3JpdGUgJWxkIHBhZ2VzX3NraXBwZWQgJWxkIHJhbmdlX3N0YXJ0ICVsbHUgcmFuZ2VfZW5kICVsbHUgbm9uYmxvY2tpbmcgJWQgZm9yX2t1cGRhdGUgJWQgZm9yX3JlY2xhaW0gJWQgcmFuZ2VfY3ljbGljICVkIHdyaXRlYmFja19pbmRleCAlbHUiLAogCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5ucl90b193cml0ZSwKIAkJICBfX2VudHJ5LT5wYWdlc19za2lwcGVkLCBfX2VudHJ5LT5yYW5nZV9zdGFydCwKIAkJICBfX2VudHJ5LT5yYW5nZV9lbmQsIF9fZW50cnktPm5vbmJsb2NraW5nLAogCQkgIF9fZW50cnktPmZvcl9rdXBkYXRlLCBfX2VudHJ5LT5mb3JfcmVjbGFpbSwKLQkJICBfX2VudHJ5LT5yYW5nZV9jeWNsaWMpCisJCSAgX19lbnRyeS0+cmFuZ2VfY3ljbGljLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT53cml0ZWJhY2tfaW5kZXgpCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X2RhX3dyaXRlX3BhZ2VzLApAQCAtMzA5LDYgKzMxMyw3IEBACiAJCV9fZmllbGQoCWNoYXIsCWVuY291bnRlcmVkX2Nvbmdlc3Rpb24JKQogCQlfX2ZpZWxkKAljaGFyLAltb3JlX2lvCQkJKQkKIAkJX19maWVsZCgJY2hhciwJbm9fbnJ3cml0ZV9pbmRleF91cGRhdGUgKQorCQlfX2ZpZWxkKCAgICAgICBwZ29mZl90LAl3cml0ZWJhY2tfaW5kZXgJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC0zMjAsMTQgKzMyNSwxNiBAQAogCQlfX2VudHJ5LT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uCT0gd2JjLT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uOwogCQlfX2VudHJ5LT5tb3JlX2lvCT0gd2JjLT5tb3JlX2lvOwogCQlfX2VudHJ5LT5ub19ucndyaXRlX2luZGV4X3VwZGF0ZSA9IHdiYy0+bm9fbnJ3cml0ZV9pbmRleF91cGRhdGU7CisJCV9fZW50cnktPndyaXRlYmFja19pbmRleCA9IGlub2RlLT5pX21hcHBpbmctPndyaXRlYmFja19pbmRleDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgaW5vICVsdSByZXQgJWQgcGFnZXNfd3JpdHRlbiAlZCBwYWdlc19za2lwcGVkICVsZCBjb25nZXN0aW9uICVkIG1vcmVfaW8gJWQgbm9fbnJ3cml0ZV9pbmRleF91cGRhdGUgJWQiLAorCVRQX3ByaW50aygiZGV2ICVzIGlubyAlbHUgcmV0ICVkIHBhZ2VzX3dyaXR0ZW4gJWQgcGFnZXNfc2tpcHBlZCAlbGQgY29uZ2VzdGlvbiAlZCBtb3JlX2lvICVkIG5vX25yd3JpdGVfaW5kZXhfdXBkYXRlICVkIHdyaXRlYmFja19pbmRleCAlbHUiLAogCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5yZXQsCiAJCSAgX19lbnRyeS0+cGFnZXNfd3JpdHRlbiwgX19lbnRyeS0+cGFnZXNfc2tpcHBlZCwKIAkJICBfX2VudHJ5LT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uLCBfX2VudHJ5LT5tb3JlX2lvLAotCQkgIF9fZW50cnktPm5vX25yd3JpdGVfaW5kZXhfdXBkYXRlKQorCQkgIF9fZW50cnktPm5vX25yd3JpdGVfaW5kZXhfdXBkYXRlLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT53cml0ZWJhY2tfaW5kZXgpCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X2RhX3dyaXRlX2JlZ2luLApAQCAtNzM3LDYgKzc0NCwxNjkgQEAKIAkJICBfX2VudHJ5LT5kYXRhX2Jsb2NrcywgX19lbnRyeS0+bWV0YV9ibG9ja3MpCiApOwogCitUUkFDRV9FVkVOVChleHQ0X21iYWxsb2NfYWxsb2MsCisJVFBfUFJPVE8oc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYyksCisKKwlUUF9BUkdTKGFjKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCisJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCisJCV9fZmllbGQoCV9fdTE2LAlmb3VuZAkJCSkKKwkJX19maWVsZCgJX191MTYsCWdyb3VwcwkJCSkKKwkJX19maWVsZCgJX191MTYsCWJ1ZGR5CQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwJZmxhZ3MJCQkpCisJCV9fZmllbGQoCV9fdTE2LAl0YWlsCQkJKQorCQlfX2ZpZWxkKAlfX3U4LAljcgkJCSkKKwkJX19maWVsZCgJX191MzIsIAlvcmlnX2xvZ2ljYWwJCSkKKwkJX19maWVsZCgJICBpbnQsCW9yaWdfc3RhcnQJCSkKKwkJX19maWVsZCgJX191MzIsIAlvcmlnX2dyb3VwCQkpCisJCV9fZmllbGQoCSAgaW50LAlvcmlnX2xlbgkJKQorCQlfX2ZpZWxkKAlfX3UzMiwgCWdvYWxfbG9naWNhbAkJKQorCQlfX2ZpZWxkKAkgIGludCwJZ29hbF9zdGFydAkJKQorCQlfX2ZpZWxkKAlfX3UzMiwgCWdvYWxfZ3JvdXAJCSkKKwkJX19maWVsZCgJICBpbnQsCWdvYWxfbGVuCQkpCisJCV9fZmllbGQoCV9fdTMyLCAJcmVzdWx0X2xvZ2ljYWwJCSkKKwkJX19maWVsZCgJICBpbnQsCXJlc3VsdF9zdGFydAkJKQorCQlfX2ZpZWxkKAlfX3UzMiwgCXJlc3VsdF9ncm91cAkJKQorCQlfX2ZpZWxkKAkgIGludCwJcmVzdWx0X2xlbgkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGFjLT5hY19pbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPmlubwkJPSBhYy0+YWNfaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5mb3VuZAkJPSBhYy0+YWNfZm91bmQ7CisJCV9fZW50cnktPmZsYWdzCQk9IGFjLT5hY19mbGFnczsKKwkJX19lbnRyeS0+Z3JvdXBzCQk9IGFjLT5hY19ncm91cHNfc2Nhbm5lZDsKKwkJX19lbnRyeS0+YnVkZHkJCT0gYWMtPmFjX2J1ZGR5OworCQlfX2VudHJ5LT50YWlsCQk9IGFjLT5hY190YWlsOworCQlfX2VudHJ5LT5jcgkJPSBhYy0+YWNfY3JpdGVyaWE7CisJCV9fZW50cnktPm9yaWdfbG9naWNhbAk9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWw7CisJCV9fZW50cnktPm9yaWdfc3RhcnQJPSBhYy0+YWNfb19leC5mZV9zdGFydDsKKwkJX19lbnRyeS0+b3JpZ19ncm91cAk9IGFjLT5hY19vX2V4LmZlX2dyb3VwOworCQlfX2VudHJ5LT5vcmlnX2xlbgk9IGFjLT5hY19vX2V4LmZlX2xlbjsKKwkJX19lbnRyeS0+Z29hbF9sb2dpY2FsCT0gYWMtPmFjX2dfZXguZmVfbG9naWNhbDsKKwkJX19lbnRyeS0+Z29hbF9zdGFydAk9IGFjLT5hY19nX2V4LmZlX3N0YXJ0OworCQlfX2VudHJ5LT5nb2FsX2dyb3VwCT0gYWMtPmFjX2dfZXguZmVfZ3JvdXA7CisJCV9fZW50cnktPmdvYWxfbGVuCT0gYWMtPmFjX2dfZXguZmVfbGVuOworCQlfX2VudHJ5LT5yZXN1bHRfbG9naWNhbAk9IGFjLT5hY19mX2V4LmZlX2xvZ2ljYWw7CisJCV9fZW50cnktPnJlc3VsdF9zdGFydAk9IGFjLT5hY19mX2V4LmZlX3N0YXJ0OworCQlfX2VudHJ5LT5yZXN1bHRfZ3JvdXAJPSBhYy0+YWNfZl9leC5mZV9ncm91cDsKKwkJX19lbnRyeS0+cmVzdWx0X2xlbgk9IGFjLT5hY19mX2V4LmZlX2xlbjsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJXMgaW5vZGUgJWx1IG9yaWcgJXUvJWQvJXVAJXUgZ29hbCAldS8lZC8ldUAldSAiCisJCSAgInJlc3VsdCAldS8lZC8ldUAldSBibGtzICV1IGdycHMgJXUgY3IgJXUgZmxhZ3MgMHglMDR4ICIKKwkJICAidGFpbCAldSBicm9rZW4gJXUiLAorCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICBfX2VudHJ5LT5vcmlnX2dyb3VwLCBfX2VudHJ5LT5vcmlnX3N0YXJ0LAorCQkgIF9fZW50cnktPm9yaWdfbGVuLCBfX2VudHJ5LT5vcmlnX2xvZ2ljYWwsCisJCSAgX19lbnRyeS0+Z29hbF9ncm91cCwgX19lbnRyeS0+Z29hbF9zdGFydCwKKwkJICBfX2VudHJ5LT5nb2FsX2xlbiwgX19lbnRyeS0+Z29hbF9sb2dpY2FsLAorCQkgIF9fZW50cnktPnJlc3VsdF9ncm91cCwgX19lbnRyeS0+cmVzdWx0X3N0YXJ0LAorCQkgIF9fZW50cnktPnJlc3VsdF9sZW4sIF9fZW50cnktPnJlc3VsdF9sb2dpY2FsLAorCQkgIF9fZW50cnktPmZvdW5kLCBfX2VudHJ5LT5ncm91cHMsIF9fZW50cnktPmNyLAorCQkgIF9fZW50cnktPmZsYWdzLCBfX2VudHJ5LT50YWlsLAorCQkgIF9fZW50cnktPmJ1ZGR5ID8gMSA8PCBfX2VudHJ5LT5idWRkeSA6IDApCispOworCitUUkFDRV9FVkVOVChleHQ0X21iYWxsb2NfcHJlYWxsb2MsCisJVFBfUFJPVE8oc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYyksCisKKwlUUF9BUkdTKGFjKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCisJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCisJCV9fZmllbGQoCV9fdTMyLCAJb3JpZ19sb2dpY2FsCQkpCisJCV9fZmllbGQoCSAgaW50LAlvcmlnX3N0YXJ0CQkpCisJCV9fZmllbGQoCV9fdTMyLCAJb3JpZ19ncm91cAkJKQorCQlfX2ZpZWxkKAkgIGludCwJb3JpZ19sZW4JCSkKKwkJX19maWVsZCgJX191MzIsIAlyZXN1bHRfbG9naWNhbAkJKQorCQlfX2ZpZWxkKAkgIGludCwJcmVzdWx0X3N0YXJ0CQkpCisJCV9fZmllbGQoCV9fdTMyLCAJcmVzdWx0X2dyb3VwCQkpCisJCV9fZmllbGQoCSAgaW50LAlyZXN1bHRfbGVuCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYWMtPmFjX2lub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+aW5vCQk9IGFjLT5hY19pbm9kZS0+aV9pbm87CisJCV9fZW50cnktPm9yaWdfbG9naWNhbAk9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWw7CisJCV9fZW50cnktPm9yaWdfc3RhcnQJPSBhYy0+YWNfb19leC5mZV9zdGFydDsKKwkJX19lbnRyeS0+b3JpZ19ncm91cAk9IGFjLT5hY19vX2V4LmZlX2dyb3VwOworCQlfX2VudHJ5LT5vcmlnX2xlbgk9IGFjLT5hY19vX2V4LmZlX2xlbjsKKwkJX19lbnRyeS0+cmVzdWx0X2xvZ2ljYWwJPSBhYy0+YWNfYl9leC5mZV9sb2dpY2FsOworCQlfX2VudHJ5LT5yZXN1bHRfc3RhcnQJPSBhYy0+YWNfYl9leC5mZV9zdGFydDsKKwkJX19lbnRyeS0+cmVzdWx0X2dyb3VwCT0gYWMtPmFjX2JfZXguZmVfZ3JvdXA7CisJCV9fZW50cnktPnJlc3VsdF9sZW4JPSBhYy0+YWNfYl9leC5mZV9sZW47CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVzIGlub2RlICVsdSBvcmlnICV1LyVkLyV1QCV1IHJlc3VsdCAldS8lZC8ldUAldSIsCisJCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgIF9fZW50cnktPm9yaWdfZ3JvdXAsIF9fZW50cnktPm9yaWdfc3RhcnQsCisJCSAgX19lbnRyeS0+b3JpZ19sZW4sIF9fZW50cnktPm9yaWdfbG9naWNhbCwKKwkJICBfX2VudHJ5LT5yZXN1bHRfZ3JvdXAsIF9fZW50cnktPnJlc3VsdF9zdGFydCwKKwkJICBfX2VudHJ5LT5yZXN1bHRfbGVuLCBfX2VudHJ5LT5yZXN1bHRfbG9naWNhbCkKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfbWJhbGxvY19kaXNjYXJkLAorCVRQX1BST1RPKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMpLAorCisJVFBfQVJHUyhhYyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQorCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQorCQlfX2ZpZWxkKAlfX3UzMiwgCXJlc3VsdF9sb2dpY2FsCQkpCisJCV9fZmllbGQoCSAgaW50LAlyZXN1bHRfc3RhcnQJCSkKKwkJX19maWVsZCgJX191MzIsIAlyZXN1bHRfZ3JvdXAJCSkKKwkJX19maWVsZCgJICBpbnQsCXJlc3VsdF9sZW4JCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkJPSBhYy0+YWNfaW5vZGUtPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5pbm8JCT0gYWMtPmFjX2lub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+cmVzdWx0X2xvZ2ljYWwJPSBhYy0+YWNfYl9leC5mZV9sb2dpY2FsOworCQlfX2VudHJ5LT5yZXN1bHRfc3RhcnQJPSBhYy0+YWNfYl9leC5mZV9zdGFydDsKKwkJX19lbnRyeS0+cmVzdWx0X2dyb3VwCT0gYWMtPmFjX2JfZXguZmVfZ3JvdXA7CisJCV9fZW50cnktPnJlc3VsdF9sZW4JPSBhYy0+YWNfYl9leC5mZV9sZW47CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVzIGlub2RlICVsdSBleHRlbnQgJXUvJWQvJXVAJXUgIiwKKwkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCisJCSAgX19lbnRyeS0+cmVzdWx0X2dyb3VwLCBfX2VudHJ5LT5yZXN1bHRfc3RhcnQsCisJCSAgX19lbnRyeS0+cmVzdWx0X2xlbiwgX19lbnRyeS0+cmVzdWx0X2xvZ2ljYWwpCispOworCitUUkFDRV9FVkVOVChleHQ0X21iYWxsb2NfZnJlZSwKKwlUUF9QUk9UTyhzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKSwKKworCVRQX0FSR1MoYWMpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKKwkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKKwkJX19maWVsZCgJX191MzIsIAlyZXN1bHRfbG9naWNhbAkJKQorCQlfX2ZpZWxkKAkgIGludCwJcmVzdWx0X3N0YXJ0CQkpCisJCV9fZmllbGQoCV9fdTMyLCAJcmVzdWx0X2dyb3VwCQkpCisJCV9fZmllbGQoCSAgaW50LAlyZXN1bHRfbGVuCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYWMtPmFjX2lub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+aW5vCQk9IGFjLT5hY19pbm9kZS0+aV9pbm87CisJCV9fZW50cnktPnJlc3VsdF9sb2dpY2FsCT0gYWMtPmFjX2JfZXguZmVfbG9naWNhbDsKKwkJX19lbnRyeS0+cmVzdWx0X3N0YXJ0CT0gYWMtPmFjX2JfZXguZmVfc3RhcnQ7CisJCV9fZW50cnktPnJlc3VsdF9ncm91cAk9IGFjLT5hY19iX2V4LmZlX2dyb3VwOworCQlfX2VudHJ5LT5yZXN1bHRfbGVuCT0gYWMtPmFjX2JfZXguZmVfbGVuOworCSksCisKKwlUUF9wcmludGsoImRldiAlcyBpbm9kZSAlbHUgZXh0ZW50ICV1LyVkLyV1QCV1ICIsCisJCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgIF9fZW50cnktPnJlc3VsdF9ncm91cCwgX19lbnRyeS0+cmVzdWx0X3N0YXJ0LAorCQkgIF9fZW50cnktPnJlc3VsdF9sZW4sIF9fZW50cnktPnJlc3VsdF9sb2dpY2FsKQorKTsKKwogI2VuZGlmIC8qIF9UUkFDRV9FWFQ0X0ggKi8KIAogLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9qYmQyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9qYmQyLmgKaW5kZXggYjg1MWYwYi4uM2M2MGI3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvamJkMi5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2piZDIuaApAQCAtNyw2ICs3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgogCitzdHJ1Y3QgdHJhbnNhY3Rpb25fY2hwX3N0YXRzX3M7CitzdHJ1Y3QgdHJhbnNhY3Rpb25fcnVuX3N0YXRzX3M7CisKIFRSQUNFX0VWRU5UKGpiZDJfY2hlY2twb2ludCwKIAogCVRQX1BST1RPKGpvdXJuYWxfdCAqam91cm5hbCwgaW50IHJlc3VsdCksCkBAIC0xNjIsNiArMTY1LDgxIEBACiAJCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vKQogKTsKIAorVFJBQ0VfRVZFTlQoamJkMl9ydW5fc3RhdHMsCisJVFBfUFJPVE8oZGV2X3QgZGV2LCB1bnNpZ25lZCBsb25nIHRpZCwKKwkJIHN0cnVjdCB0cmFuc2FjdGlvbl9ydW5fc3RhdHNfcyAqc3RhdHMpLAorCisJVFBfQVJHUyhkZXYsIHRpZCwgc3RhdHMpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJCWRldl90LAlkZXYJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJdGlkCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGxvbmcsCXdhaXQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJcnVubmluZwkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAlsb2NrZWQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJZmx1c2hpbmcJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAlsb2dnaW5nCQkpCisJCV9fZmllbGQoCQlfX3UzMiwJaGFuZGxlX2NvdW50CSkKKwkJX19maWVsZCgJCV9fdTMyLAlibG9ja3MJCSkKKwkJX19maWVsZCgJCV9fdTMyLAlibG9ja3NfbG9nZ2VkCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkJPSBkZXY7CisJCV9fZW50cnktPnRpZAkJPSB0aWQ7CisJCV9fZW50cnktPndhaXQJCT0gc3RhdHMtPnJzX3dhaXQ7CisJCV9fZW50cnktPnJ1bm5pbmcJPSBzdGF0cy0+cnNfcnVubmluZzsKKwkJX19lbnRyeS0+bG9ja2VkCQk9IHN0YXRzLT5yc19sb2NrZWQ7CisJCV9fZW50cnktPmZsdXNoaW5nCT0gc3RhdHMtPnJzX2ZsdXNoaW5nOworCQlfX2VudHJ5LT5sb2dnaW5nCT0gc3RhdHMtPnJzX2xvZ2dpbmc7CisJCV9fZW50cnktPmhhbmRsZV9jb3VudAk9IHN0YXRzLT5yc19oYW5kbGVfY291bnQ7CisJCV9fZW50cnktPmJsb2NrcwkJPSBzdGF0cy0+cnNfYmxvY2tzOworCQlfX2VudHJ5LT5ibG9ja3NfbG9nZ2VkCT0gc3RhdHMtPnJzX2Jsb2Nrc19sb2dnZWQ7CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVzIHRpZCAlbHUgd2FpdCAldSBydW5uaW5nICV1IGxvY2tlZCAldSBmbHVzaGluZyAldSAiCisJCSAgImxvZ2dpbmcgJXUgaGFuZGxlX2NvdW50ICV1IGJsb2NrcyAldSBibG9ja3NfbG9nZ2VkICV1IiwKKwkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksIF9fZW50cnktPnRpZCwKKwkJICBqaWZmaWVzX3RvX21zZWNzKF9fZW50cnktPndhaXQpLAorCQkgIGppZmZpZXNfdG9fbXNlY3MoX19lbnRyeS0+cnVubmluZyksCisJCSAgamlmZmllc190b19tc2VjcyhfX2VudHJ5LT5sb2NrZWQpLAorCQkgIGppZmZpZXNfdG9fbXNlY3MoX19lbnRyeS0+Zmx1c2hpbmcpLAorCQkgIGppZmZpZXNfdG9fbXNlY3MoX19lbnRyeS0+bG9nZ2luZyksCisJCSAgX19lbnRyeS0+aGFuZGxlX2NvdW50LCBfX2VudHJ5LT5ibG9ja3MsCisJCSAgX19lbnRyeS0+YmxvY2tzX2xvZ2dlZCkKKyk7CisKK1RSQUNFX0VWRU5UKGpiZDJfY2hlY2twb2ludF9zdGF0cywKKwlUUF9QUk9UTyhkZXZfdCBkZXYsIHVuc2lnbmVkIGxvbmcgdGlkLAorCQkgc3RydWN0IHRyYW5zYWN0aW9uX2NocF9zdGF0c19zICpzdGF0cyksCisKKwlUUF9BUkdTKGRldiwgdGlkLCBzdGF0cyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAkJZGV2X3QsCWRldgkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAl0aWQJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJY2hwX3RpbWUJKQorCQlfX2ZpZWxkKAkJX191MzIsCWZvcmNlZF90b19jbG9zZQkpCisJCV9fZmllbGQoCQlfX3UzMiwJd3JpdHRlbgkJKQorCQlfX2ZpZWxkKAkJX191MzIsCWRyb3BwZWQJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkJPSBkZXY7CisJCV9fZW50cnktPnRpZAkJPSB0aWQ7CisJCV9fZW50cnktPmNocF90aW1lCT0gc3RhdHMtPmNzX2NocF90aW1lOworCQlfX2VudHJ5LT5mb3JjZWRfdG9fY2xvc2U9IHN0YXRzLT5jc19mb3JjZWRfdG9fY2xvc2U7CisJCV9fZW50cnktPndyaXR0ZW4JPSBzdGF0cy0+Y3Nfd3JpdHRlbjsKKwkJX19lbnRyeS0+ZHJvcHBlZAk9IHN0YXRzLT5jc19kcm9wcGVkOworCSksCisKKwlUUF9wcmludGsoImRldiAlcyB0aWQgJWx1IGNocF90aW1lICV1IGZvcmNlZF90b19jbG9zZSAldSAiCisJCSAgIndyaXR0ZW4gJXUgZHJvcHBlZCAldSIsCisJCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT50aWQsCisJCSAgamlmZmllc190b19tc2VjcyhfX2VudHJ5LT5jaHBfdGltZSksCisJCSAgX19lbnRyeS0+Zm9yY2VkX3RvX2Nsb3NlLCBfX2VudHJ5LT53cml0dGVuLCBfX2VudHJ5LT5kcm9wcGVkKQorKTsKKwogI2VuZGlmIC8qIF9UUkFDRV9KQkQyX0ggKi8KIAogLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy93b3JrcXVldWUuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dvcmtxdWV1ZS5oCmluZGV4IGZjZmQ5YTEuLmU0NjEyZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dvcmtxdWV1ZS5oCkBAIC0yNiw3ICsyNiw3IEBACiAJCV9fZW50cnktPmZ1bmMJCT0gd29yay0+ZnVuYzsKIAkpLAogCi0JVFBfcHJpbnRrKCJ0aHJlYWQ9JXM6JWQgZnVuYz0lcEYiLCBfX2VudHJ5LT50aHJlYWRfY29tbSwKKwlUUF9wcmludGsoInRocmVhZD0lczolZCBmdW5jPSVwZiIsIF9fZW50cnktPnRocmVhZF9jb21tLAogCQlfX2VudHJ5LT50aHJlYWRfcGlkLCBfX2VudHJ5LT5mdW5jKQogKTsKIApAQCAtNDgsNyArNDgsNyBAQAogCQlfX2VudHJ5LT5mdW5jCQk9IHdvcmstPmZ1bmM7CiAJKSwKIAotCVRQX3ByaW50aygidGhyZWFkPSVzOiVkIGZ1bmM9JXBGIiwgX19lbnRyeS0+dGhyZWFkX2NvbW0sCisJVFBfcHJpbnRrKCJ0aHJlYWQ9JXM6JWQgZnVuYz0lcGYiLCBfX2VudHJ5LT50aHJlYWRfY29tbSwKIAkJX19lbnRyeS0+dGhyZWFkX3BpZCwgX19lbnRyeS0+ZnVuYykKICk7CiAKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCAwYWE2NTc5Li5mNTE1ODY0IDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0yOTcsNyArMjk3LDcgQEAKIAogY29uZmlnIEFVRElUU1lTQ0FMTAogCWJvb2wgIkVuYWJsZSBzeXN0ZW0tY2FsbCBhdWRpdGluZyBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVVESVQgJiYgKFg4NiB8fCBQUEMgfHwgUFBDNjQgfHwgUzM5MCB8fCBJQTY0IHx8IFVNTCB8fCBTUEFSQzY0fHwgU1VQRVJIKQorCWRlcGVuZHMgb24gQVVESVQgJiYgKFg4NiB8fCBQUEMgfHwgUzM5MCB8fCBJQTY0IHx8IFVNTCB8fCBTUEFSQzY0IHx8IFNVUEVSSCkKIAlkZWZhdWx0IHkgaWYgU0VDVVJJVFlfU0VMSU5VWAogCWhlbHAKIAkgIEVuYWJsZSBsb3ctb3ZlcmhlYWQgc3lzdGVtLWNhbGwgYXVkaXRpbmcgaW5mcmFzdHJ1Y3R1cmUgdGhhdApAQCAtOTIxLDYgKzkyMSwxMSBAQAogCWhlbHAKIAkgIFNlZSB0b29scy9wZXJmL2Rlc2lnbi50eHQgZm9yIGRldGFpbHMuCiAKK2NvbmZpZyBQRVJGX1VTRV9WTUFMTE9DCisJYm9vbAorCWhlbHAKKwkgIFNlZSB0b29scy9wZXJmL2Rlc2lnbi50eHQgZm9yIGRldGFpbHMKKwogbWVudSAiS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMiCiAKIGNvbmZpZyBQRVJGX0VWRU5UUwpAQCAtOTc2LDYgKzk4MSwxOSBAQAogCiAJICBTYXkgTiBpZiB1bnN1cmUuCiAKK2NvbmZpZyBERUJVR19QRVJGX1VTRV9WTUFMTE9DCisJZGVmYXVsdCBuCisJYm9vbCAiRGVidWc6IHVzZSB2bWFsbG9jIHRvIGJhY2sgcGVyZiBtbWFwKCkgYnVmZmVycyIKKwlkZXBlbmRzIG9uIFBFUkZfRVZFTlRTICYmIERFQlVHX0tFUk5FTAorCXNlbGVjdCBQRVJGX1VTRV9WTUFMTE9DCisJaGVscAorCSBVc2Ugdm1hbGxvYyBtZW1vcnkgdG8gYmFjayBwZXJmIG1tYXAoKSBidWZmZXJzLgorCisJIE1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB0aGUgdm1hbGxvYyBjb2RlIG9uIHBsYXRmb3JtcworCSB0aGF0IGRvbid0IHJlcXVpcmUgaXQuCisKKwkgU2F5IE4gaWYgdW5zdXJlLgorCiBlbmRtZW51CiAKIGNvbmZpZyBWTV9FVkVOVF9DT1VOVEVSUwpAQCAtMTAwNiwxNCArMTAyNCw2IEBACiAJICBTTFVCIHN5c2ZzIHN1cHBvcnQuIC9zeXMvc2xhYiB3aWxsIG5vdCBleGlzdCBhbmQgdGhlcmUgd2lsbCBiZQogCSAgbm8gc3VwcG9ydCBmb3IgY2FjaGUgdmFsaWRhdGlvbiBldGMuCiAKLWNvbmZpZyBTVFJJUF9BU01fU1lNUwotCWJvb2wgIlN0cmlwIGFzc2VtYmxlci1nZW5lcmF0ZWQgc3ltYm9scyBkdXJpbmcgbGluayIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBTdHJpcCBpbnRlcm5hbCBhc3NlbWJsZXItZ2VuZXJhdGVkIHN5bWJvbHMgZHVyaW5nIGEgbGluayAoc3ltYm9scwotCSAgdGhhdCBsb29rIGxpa2UgJy5MeHh4Jykgc28gdGhleSBkb24ndCBwb2xsdXRlIHRoZSBvdXRwdXQgb2YKLQkgIGdldF93Y2hhbigpIGFuZCBzdWNobGlrZS4KLQogY29uZmlnIENPTVBBVF9CUksKIAlib29sICJEaXNhYmxlIGhlYXAgcmFuZG9taXphdGlvbiIKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggNjEwNzIyMy4uNTk4OGRlYiAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgpAQCAtMzYwLDExICszNTksNiBAQAogCiAjZWxzZQogCi0jaWYgTlJfQ1BVUyA+IEJJVFNfUEVSX0xPTkcKLWNwdW1hc2tfdCBjcHVfbWFza19hbGwgX19yZWFkX21vc3RseSA9IENQVV9NQVNLX0FMTDsKLUVYUE9SVF9TWU1CT0woY3B1X21hc2tfYWxsKTsKLSNlbmRpZgotCiAvKiBTZXR1cCBudW1iZXIgb2YgcG9zc2libGUgcHJvY2Vzc29yIGlkcyAqLwogaW50IG5yX2NwdV9pZHMgX19yZWFkX21vc3RseSA9IE5SX0NQVVM7CiBFWFBPUlRfU1lNQk9MKG5yX2NwdV9pZHMpOwpAQCAtNzg0LDcgKzc3OCw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBkb19iYXNpY19zZXR1cCh2b2lkKQogewotCXJjdV9pbml0X3NjaGVkKCk7IC8qIG5lZWRlZCBieSBtb2R1bGVfaW5pdCBzdGFnZS4gKi8KIAlpbml0X3dvcmtxdWV1ZXMoKTsKIAljcHVzZXRfaW5pdF9zbXAoKTsKIAl1c2VybW9kZWhlbHBlcl9pbml0KCk7CmRpZmYgLS1naXQgYS9pcGMvaXBjX3N5c2N0bC5jIGIvaXBjL2lwY19zeXNjdGwuYwppbmRleCA0MGVhYjczLi43ZDM3MDQ3IDEwMDY0NAotLS0gYS9pcGMvaXBjX3N5c2N0bC5jCisrKyBiL2lwYy9pcGNfc3lzY3RsLmMKQEAgLTI3LDE4ICsyNywxOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfU1lTQ1RMCi1zdGF0aWMgaW50IHByb2NfaXBjX2RvaW50dmVjKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IHByb2NfaXBjX2RvaW50dmVjKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgY3RsX3RhYmxlIGlwY190YWJsZTsKIAltZW1jcHkoJmlwY190YWJsZSwgdGFibGUsIHNpemVvZihpcGNfdGFibGUpKTsKIAlpcGNfdGFibGUuZGF0YSA9IGdldF9pcGModGFibGUpOwogCi0JcmV0dXJuIHByb2NfZG9pbnR2ZWMoJmlwY190YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0dXJuIHByb2NfZG9pbnR2ZWMoJmlwY190YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiB9CiAKIHN0YXRpYyBpbnQgcHJvY19pcGNfY2FsbGJhY2tfZG9pbnR2ZWMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKKwl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgY3RsX3RhYmxlIGlwY190YWJsZTsKIAlzaXplX3QgbGVucF9iZWYgPSAqbGVucDsKQEAgLTQ3LDcgKzQ3LDcgQEAKIAltZW1jcHkoJmlwY190YWJsZSwgdGFibGUsIHNpemVvZihpcGNfdGFibGUpKTsKIAlpcGNfdGFibGUuZGF0YSA9IGdldF9pcGModGFibGUpOwogCi0JcmMgPSBwcm9jX2RvaW50dmVjKCZpcGNfdGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJjID0gcHJvY19kb2ludHZlYygmaXBjX3RhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAogCWlmICh3cml0ZSAmJiAhcmMgJiYgbGVucF9iZWYgPT0gKmxlbnApCiAJCS8qCkBAIC02MSwxMyArNjEsMTMgQEAKIH0KIAogc3RhdGljIGludCBwcm9jX2lwY19kb3Vsb25ndmVjX21pbm1heChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0Jc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQorCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBjdGxfdGFibGUgaXBjX3RhYmxlOwogCW1lbWNweSgmaXBjX3RhYmxlLCB0YWJsZSwgc2l6ZW9mKGlwY190YWJsZSkpOwogCWlwY190YWJsZS5kYXRhID0gZ2V0X2lwYyh0YWJsZSk7CiAKLQlyZXR1cm4gcHJvY19kb3Vsb25ndmVjX21pbm1heCgmaXBjX3RhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLAorCXJldHVybiBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KCZpcGNfdGFibGUsIHdyaXRlLCBidWZmZXIsCiAJCQkJCWxlbnAsIHBwb3MpOwogfQogCkBAIC05NSw3ICs5NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcHJvY19pcGNhdXRvX2RvaW50dmVjX21pbm1heChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0Jc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQorCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBjdGxfdGFibGUgaXBjX3RhYmxlOwogCXNpemVfdCBsZW5wX2JlZiA9ICpsZW5wOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJaXBjX3RhYmxlLmRhdGEgPSBnZXRfaXBjKHRhYmxlKTsKIAlvbGR2YWwgPSAqKChpbnQgKikoaXBjX3RhYmxlLmRhdGEpKTsKIAotCXJjID0gcHJvY19kb2ludHZlY19taW5tYXgoJmlwY190YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmMgPSBwcm9jX2RvaW50dmVjX21pbm1heCgmaXBjX3RhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAogCWlmICh3cml0ZSAmJiAhcmMgJiYgbGVucF9iZWYgPT0gKmxlbnApIHsKIAkJaW50IG5ld3ZhbCA9ICooKGludCAqKShpcGNfdGFibGUuZGF0YSkpOwpkaWZmIC0tZ2l0IGEvaXBjL21xX3N5c2N0bC5jIGIvaXBjL21xX3N5c2N0bC5jCmluZGV4IDI0YWU0NmQuLjhhMDU4NzEgMTAwNjQ0Ci0tLSBhL2lwYy9tcV9zeXNjdGwuYworKysgYi9pcGMvbXFfc3lzY3RsLmMKQEAgLTMxLDI0ICszMSwyNCBAQAogCXJldHVybiB3aGljaDsKIH0KIAotc3RhdGljIGludCBwcm9jX21xX2RvaW50dmVjKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IHByb2NfbXFfZG9pbnR2ZWMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBjdGxfdGFibGUgbXFfdGFibGU7CiAJbWVtY3B5KCZtcV90YWJsZSwgdGFibGUsIHNpemVvZihtcV90YWJsZSkpOwogCW1xX3RhYmxlLmRhdGEgPSBnZXRfbXEodGFibGUpOwogCi0JcmV0dXJuIHByb2NfZG9pbnR2ZWMoJm1xX3RhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXR1cm4gcHJvY19kb2ludHZlYygmbXFfdGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogfQogCiBzdGF0aWMgaW50IHByb2NfbXFfZG9pbnR2ZWNfbWlubWF4KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCisJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGN0bF90YWJsZSBtcV90YWJsZTsKIAltZW1jcHkoJm1xX3RhYmxlLCB0YWJsZSwgc2l6ZW9mKG1xX3RhYmxlKSk7CiAJbXFfdGFibGUuZGF0YSA9IGdldF9tcSh0YWJsZSk7CiAKLQlyZXR1cm4gcHJvY19kb2ludHZlY19taW5tYXgoJm1xX3RhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLAorCXJldHVybiBwcm9jX2RvaW50dmVjX21pbm1heCgmbXFfdGFibGUsIHdyaXRlLCBidWZmZXIsCiAJCQkJCWxlbnAsIHBwb3MpOwogfQogI2Vsc2UKZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCA5ZWIxNDg4Li40NjQ2OTRlIDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC01NSw3ICs1NSw3IEBACiAjZGVmaW5lIHNobV9maWxlX2RhdGEoZmlsZSkgKCooKHN0cnVjdCBzaG1fZmlsZV9kYXRhICoqKSYoZmlsZSktPnByaXZhdGVfZGF0YSkpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNobV9maWxlX29wZXJhdGlvbnM7Ci1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNobV92bV9vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNobV92bV9vcHM7CiAKICNkZWZpbmUgc2htX2lkcyhucykJKChucyktPmlkc1tJUENfU0hNX0lEU10pCiAKQEAgLTMxMiw3ICszMTIsNyBAQAogCS5nZXRfdW5tYXBwZWRfYXJlYQk9IHNobV9nZXRfdW5tYXBwZWRfYXJlYSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc2htX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc2htX3ZtX29wcyA9IHsKIAkub3Blbgk9IHNobV9vcGVuLAkvKiBjYWxsYmFjayBmb3IgYSBuZXcgdm0tYXJlYSBvcGVuICovCiAJLmNsb3NlCT0gc2htX2Nsb3NlLAkvKiBjYWxsYmFjayBmb3Igd2hlbiB0aGUgdm0tYXJlYSBpcyByZWxlYXNlZCAqLwogCS5mYXVsdAk9IHNobV9mYXVsdCwKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCAxODdjODliLi5iOGQ0Y2Q4IDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC01OCw3ICs1OCw2IEBACiBvYmotJChDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCkgKz0gYmFja3RyYWNldGVzdC5vCiBvYmotJChDT05GSUdfQ09NUEFUKSArPSBjb21wYXQubwogb2JqLSQoQ09ORklHX0NHUk9VUFMpICs9IGNncm91cC5vCi1vYmotJChDT05GSUdfQ0dST1VQX0RFQlVHKSArPSBjZ3JvdXBfZGVidWcubwogb2JqLSQoQ09ORklHX0NHUk9VUF9GUkVFWkVSKSArPSBjZ3JvdXBfZnJlZXplci5vCiBvYmotJChDT05GSUdfQ1BVU0VUUykgKz0gY3B1c2V0Lm8KIG9iai0kKENPTkZJR19DR1JPVVBfTlMpICs9IG5zX2Nncm91cC5vCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IGRlZmMyZTYuLjVmZWVkMjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC04NTUsMTggKzg1NSwyNCBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBBVURJVF9TSUdOQUxfSU5GTzoKLQkJZXJyID0gc2VjdXJpdHlfc2VjaWRfdG9fc2VjY3R4KGF1ZGl0X3NpZ19zaWQsICZjdHgsICZsZW4pOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJbGVuID0gMDsKKwkJaWYgKGF1ZGl0X3NpZ19zaWQpIHsKKwkJCWVyciA9IHNlY3VyaXR5X3NlY2lkX3RvX3NlY2N0eChhdWRpdF9zaWdfc2lkLCAmY3R4LCAmbGVuKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQogCQlzaWdfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpzaWdfZGF0YSkgKyBsZW4sIEdGUF9LRVJORUwpOwogCQlpZiAoIXNpZ19kYXRhKSB7Ci0JCQlzZWN1cml0eV9yZWxlYXNlX3NlY2N0eChjdHgsIGxlbik7CisJCQlpZiAoYXVkaXRfc2lnX3NpZCkKKwkJCQlzZWN1cml0eV9yZWxlYXNlX3NlY2N0eChjdHgsIGxlbik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzaWdfZGF0YS0+dWlkID0gYXVkaXRfc2lnX3VpZDsKIAkJc2lnX2RhdGEtPnBpZCA9IGF1ZGl0X3NpZ19waWQ7Ci0JCW1lbWNweShzaWdfZGF0YS0+Y3R4LCBjdHgsIGxlbik7Ci0JCXNlY3VyaXR5X3JlbGVhc2Vfc2VjY3R4KGN0eCwgbGVuKTsKKwkJaWYgKGF1ZGl0X3NpZ19zaWQpIHsKKwkJCW1lbWNweShzaWdfZGF0YS0+Y3R4LCBjdHgsIGxlbik7CisJCQlzZWN1cml0eV9yZWxlYXNlX3NlY2N0eChjdHgsIGxlbik7CisJCX0KIAkJYXVkaXRfc2VuZF9yZXBseShORVRMSU5LX0NCKHNrYikucGlkLCBzZXEsIEFVRElUX1NJR05BTF9JTkZPLAogCQkJCTAsIDAsIHNpZ19kYXRhLCBzaXplb2YoKnNpZ19kYXRhKSArIGxlbik7CiAJCWtmcmVlKHNpZ19kYXRhKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdF93YXRjaC5jIGIva2VybmVsL2F1ZGl0X3dhdGNoLmMKaW5kZXggMGU5NmRiYy4uY2M3ZTg3OSAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0X3dhdGNoLmMKKysrIGIva2VybmVsL2F1ZGl0X3dhdGNoLmMKQEAgLTQ1LDggKzQ1LDggQEAKIAogc3RydWN0IGF1ZGl0X3dhdGNoIHsKIAlhdG9taWNfdAkJY291bnQ7CS8qIHJlZmVyZW5jZSBjb3VudCAqLwotCWNoYXIJCQkqcGF0aDsJLyogaW5zZXJ0aW9uIHBhdGggKi8KIAlkZXZfdAkJCWRldjsJLyogYXNzb2NpYXRlZCBzdXBlcmJsb2NrIGRldmljZSAqLworCWNoYXIJCQkqcGF0aDsJLyogaW5zZXJ0aW9uIHBhdGggKi8KIAl1bnNpZ25lZCBsb25nCQlpbm87CS8qIGFzc29jaWF0ZWQgaW5vZGUgbnVtYmVyICovCiAJc3RydWN0IGF1ZGl0X3BhcmVudAkqcGFyZW50OyAvKiBhc3NvY2lhdGVkIHBhcmVudCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJd2xpc3Q7CS8qIGVudHJ5IGluIHBhcmVudC0+d2F0Y2hlcyBsaXN0ICovCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRzYy5jIGIva2VybmVsL2F1ZGl0c2MuYwppbmRleCA2OGQzYzZhLi4yNjdlNDg0IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRzYy5jCisrKyBiL2tlcm5lbC9hdWRpdHNjLmMKQEAgLTE2OCwxMiArMTY4LDEyIEBACiAJaW50CQkgICAgaW5fc3lzY2FsbDsJLyogMSBpZiB0YXNrIGlzIGluIGEgc3lzY2FsbCAqLwogCWVudW0gYXVkaXRfc3RhdGUgICAgc3RhdGUsIGN1cnJlbnRfc3RhdGU7CiAJdW5zaWduZWQgaW50CSAgICBzZXJpYWw7ICAgICAvKiBzZXJpYWwgbnVtYmVyIGZvciByZWNvcmQgKi8KLQlzdHJ1Y3QgdGltZXNwZWMJICAgIGN0aW1lOyAgICAgIC8qIHRpbWUgb2Ygc3lzY2FsbCBlbnRyeSAqLwogCWludAkJICAgIG1ham9yOyAgICAgIC8qIHN5c2NhbGwgbnVtYmVyICovCisJc3RydWN0IHRpbWVzcGVjCSAgICBjdGltZTsgICAgICAvKiB0aW1lIG9mIHN5c2NhbGwgZW50cnkgKi8KIAl1bnNpZ25lZCBsb25nCSAgICBhcmd2WzRdOyAgICAvKiBzeXNjYWxsIGFyZ3VtZW50cyAqLwotCWludAkJICAgIHJldHVybl92YWxpZDsgLyogcmV0dXJuIGNvZGUgaXMgdmFsaWQgKi8KIAlsb25nCQkgICAgcmV0dXJuX2NvZGU7Lyogc3lzY2FsbCByZXR1cm4gY29kZSAqLwogCXU2NAkJICAgIHByaW87CisJaW50CQkgICAgcmV0dXJuX3ZhbGlkOyAvKiByZXR1cm4gY29kZSBpcyB2YWxpZCAqLwogCWludAkJICAgIG5hbWVfY291bnQ7CiAJc3RydWN0IGF1ZGl0X25hbWVzICBuYW1lc1tBVURJVF9OQU1FU107CiAJY2hhciAqCQkgICAgZmlsdGVya2V5OwkvKiBrZXkgZm9yIHJ1bGUgdGhhdCB0cmlnZ2VyZWQgcmVjb3JkICovCkBAIC0xOTgsOCArMTk4LDggQEAKIAljaGFyCQkgICAgdGFyZ2V0X2NvbW1bVEFTS19DT01NX0xFTl07CiAKIAlzdHJ1Y3QgYXVkaXRfdHJlZV9yZWZzICp0cmVlcywgKmZpcnN0X3RyZWVzOwotCWludCB0cmVlX2NvdW50OwogCXN0cnVjdCBsaXN0X2hlYWQga2lsbGVkX3RyZWVzOworCWludCB0cmVlX2NvdW50OwogCiAJaW50IHR5cGU7CiAJdW5pb24gewpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IGNkODNkOTkuLjAyNDlmNGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00OCw2ICs0OSw4IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+IC8qIFRPRE86IHJlcGxhY2Ugd2l0aCBtb3JlIHNvcGhpc3RpY2F0ZWQgYXJyYXkgKi8KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIApAQCAtNjAsNiArNjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nncm91cF9zdWJzeXMuaD4KIH07CiAKKyNkZWZpbmUgTUFYX0NHUk9VUF9ST09UX05BTUVMRU4gNjQKKwogLyoKICAqIEEgY2dyb3VwZnNfcm9vdCByZXByZXNlbnRzIHRoZSByb290IG9mIGEgY2dyb3VwIGhpZXJhcmNoeSwKICAqIGFuZCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgc3VwZXJibG9jayB0byBmb3JtIGFuIGFjdGl2ZQpAQCAtNzQsNiArNzksOSBAQAogCSAqLwogCXVuc2lnbmVkIGxvbmcgc3Vic3lzX2JpdHM7CiAKKwkvKiBVbmlxdWUgaWQgZm9yIHRoaXMgaGllcmFyY2h5LiAqLworCWludCBoaWVyYXJjaHlfaWQ7CisKIAkvKiBUaGUgYml0bWFzayBvZiBzdWJzeXN0ZW1zIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGlzIGhpZXJhcmNoeSAqLwogCXVuc2lnbmVkIGxvbmcgYWN0dWFsX3N1YnN5c19iaXRzOwogCkBAIC05NCw2ICsxMDIsOSBAQAogCiAJLyogVGhlIHBhdGggdG8gdXNlIGZvciByZWxlYXNlIG5vdGlmaWNhdGlvbnMuICovCiAJY2hhciByZWxlYXNlX2FnZW50X3BhdGhbUEFUSF9NQVhdOworCisJLyogVGhlIG5hbWUgZm9yIHRoaXMgaGllcmFyY2h5IC0gbWF5IGJlIGVtcHR5ICovCisJY2hhciBuYW1lW01BWF9DR1JPVVBfUk9PVF9OQU1FTEVOXTsKIH07CiAKIC8qCkBAIC0xNDEsNiArMTUyLDEwIEBACiBzdGF0aWMgTElTVF9IRUFEKHJvb3RzKTsKIHN0YXRpYyBpbnQgcm9vdF9jb3VudDsKIAorc3RhdGljIERFRklORV9JREEoaGllcmFyY2h5X2lkYSk7CitzdGF0aWMgaW50IG5leHRfaGllcmFyY2h5X2lkOworc3RhdGljIERFRklORV9TUElOTE9DSyhoaWVyYXJjaHlfaWRfbG9jayk7CisKIC8qIGR1bW15dG9wIGlzIGEgc2hvcnRoYW5kIGZvciB0aGUgZHVtbXkgaGllcmFyY2h5J3MgdG9wIGNncm91cCAqLwogI2RlZmluZSBkdW1teXRvcCAoJnJvb3Rub2RlLnRvcF9jZ3JvdXApCiAKQEAgLTIwMSw2ICsyMTYsNyBAQAogCSAqIGNncm91cCwgYW5jaG9yZWQgb24gY2dyb3VwLT5jc3Nfc2V0cwogCSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgY2dycF9saW5rX2xpc3Q7CisJc3RydWN0IGNncm91cCAqY2dycDsKIAkvKgogCSAqIExpc3QgcnVubmluZyB0aHJvdWdoIGNnX2Nncm91cF9saW5rcyBwb2ludGluZyBhdCBhCiAJICogc2luZ2xlIGNzc19zZXQgb2JqZWN0LCBhbmNob3JlZCBvbiBjc3Nfc2V0LT5jZ19saW5rcwpAQCAtMjI3LDggKzI0MywxMSBAQAogc3RhdGljIERFRklORV9SV0xPQ0soY3NzX3NldF9sb2NrKTsKIHN0YXRpYyBpbnQgY3NzX3NldF9jb3VudDsKIAotLyogaGFzaCB0YWJsZSBmb3IgY2dyb3VwIGdyb3Vwcy4gVGhpcyBpbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2UgdG8KLSAqIGZpbmQgYW4gZXhpc3RpbmcgY3NzX3NldCAqLworLyoKKyAqIGhhc2ggdGFibGUgZm9yIGNncm91cCBncm91cHMuIFRoaXMgaW1wcm92ZXMgdGhlIHBlcmZvcm1hbmNlIHRvIGZpbmQKKyAqIGFuIGV4aXN0aW5nIGNzc19zZXQuIFRoaXMgaGFzaCBkb2Vzbid0IChjdXJyZW50bHkpIHRha2UgaW50bworICogYWNjb3VudCBjZ3JvdXBzIGluIGVtcHR5IGhpZXJhcmNoaWVzLgorICovCiAjZGVmaW5lIENTU19TRVRfSEFTSF9CSVRTCTcKICNkZWZpbmUgQ1NTX1NFVF9UQUJMRV9TSVpFCSgxIDw8IENTU19TRVRfSEFTSF9CSVRTKQogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGNzc19zZXRfdGFibGVbQ1NTX1NFVF9UQUJMRV9TSVpFXTsKQEAgLTI0OCw0OCArMjY3LDIyIEBACiAJcmV0dXJuICZjc3Nfc2V0X3RhYmxlW2luZGV4XTsKIH0KIAorc3RhdGljIHZvaWQgZnJlZV9jc3Nfc2V0X3JjdShzdHJ1Y3QgcmN1X2hlYWQgKm9iaikKK3sKKwlzdHJ1Y3QgY3NzX3NldCAqY2cgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY3NzX3NldCwgcmN1X2hlYWQpOworCWtmcmVlKGNnKTsKK30KKwogLyogV2UgZG9uJ3QgbWFpbnRhaW4gdGhlIGxpc3RzIHJ1bm5pbmcgdGhyb3VnaCBlYWNoIGNzc19zZXQgdG8gaXRzCiAgKiB0YXNrIHVudGlsIGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIGNncm91cF9pdGVyX3N0YXJ0KCkuIFRoaXMKICAqIHJlZHVjZXMgdGhlIGZvcmsoKS9leGl0KCkgb3ZlcmhlYWQgZm9yIHBlb3BsZSB3aG8gaGF2ZSBjZ3JvdXBzCiAgKiBjb21waWxlZCBpbnRvIHRoZWlyIGtlcm5lbCBidXQgbm90IGFjdHVhbGx5IGluIHVzZSAqLwogc3RhdGljIGludCB1c2VfdGFza19jc3Nfc2V0X2xpbmtzIF9fcmVhZF9tb3N0bHk7CiAKLS8qIFdoZW4gd2UgY3JlYXRlIG9yIGRlc3Ryb3kgYSBjc3Nfc2V0LCB0aGUgb3BlcmF0aW9uIHNpbXBseQotICogdGFrZXMvcmVsZWFzZXMgYSByZWZlcmVuY2UgY291bnQgb24gYWxsIHRoZSBjZ3JvdXBzIHJlZmVyZW5jZWQKLSAqIGJ5IHN1YnN5c3RlbXMgaW4gdGhpcyBjc3Nfc2V0LiBUaGlzIGNhbiBlbmQgdXAgbXVsdGlwbGUtY291bnRpbmcKLSAqIHNvbWUgY2dyb3VwcywgYnV0IHRoYXQncyBPSyAtIHRoZSByZWYtY291bnQgaXMganVzdCBhCi0gKiBidXN5L25vdC1idXN5IGluZGljYXRvcjsgZW5zdXJpbmcgdGhhdCB3ZSBvbmx5IGNvdW50IGVhY2ggY2dyb3VwCi0gKiBvbmNlIHdvdWxkIHJlcXVpcmUgdGFraW5nIGEgZ2xvYmFsIGxvY2sgdG8gZW5zdXJlIHRoYXQgbm8KLSAqIHN1YnN5c3RlbXMgbW92ZWQgYmV0d2VlbiBoaWVyYXJjaGllcyB3aGlsZSB3ZSB3ZXJlIGRvaW5nIHNvLgotICoKLSAqIFBvc3NpYmxlIFRPRE86IGRlY2lkZSBhdCBib290IHRpbWUgYmFzZWQgb24gdGhlIG51bWJlciBvZgotICogcmVnaXN0ZXJlZCBzdWJzeXN0ZW1zIGFuZCB0aGUgbnVtYmVyIG9mIENQVXMgb3IgTlVNQSBub2RlcyB3aGV0aGVyCi0gKiBpdCdzIGJldHRlciBmb3IgcGVyZm9ybWFuY2UgdG8gcmVmLWNvdW50IGV2ZXJ5IHN1YnN5c3RlbSwgb3IgdG8KLSAqIHRha2UgYSBnbG9iYWwgbG9jayBhbmQgb25seSBhZGQgb25lIHJlZiBjb3VudCB0byBlYWNoIGhpZXJhcmNoeS4KLSAqLwotCi0vKgotICogdW5saW5rIGEgY3NzX3NldCBmcm9tIHRoZSBsaXN0IGFuZCBmcmVlIGl0Ci0gKi8KLXN0YXRpYyB2b2lkIHVubGlua19jc3Nfc2V0KHN0cnVjdCBjc3Nfc2V0ICpjZykKK3N0YXRpYyB2b2lkIF9fcHV0X2Nzc19zZXQoc3RydWN0IGNzc19zZXQgKmNnLCBpbnQgdGFza2V4aXQpCiB7CiAJc3RydWN0IGNnX2Nncm91cF9saW5rICpsaW5rOwogCXN0cnVjdCBjZ19jZ3JvdXBfbGluayAqc2F2ZWRfbGluazsKLQotCWhsaXN0X2RlbCgmY2ctPmhsaXN0KTsKLQljc3Nfc2V0X2NvdW50LS07Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGluaywgc2F2ZWRfbGluaywgJmNnLT5jZ19saW5rcywKLQkJCQkgY2dfbGlua19saXN0KSB7Ci0JCWxpc3RfZGVsKCZsaW5rLT5jZ19saW5rX2xpc3QpOwotCQlsaXN0X2RlbCgmbGluay0+Y2dycF9saW5rX2xpc3QpOwotCQlrZnJlZShsaW5rKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fcHV0X2Nzc19zZXQoc3RydWN0IGNzc19zZXQgKmNnLCBpbnQgdGFza2V4aXQpCi17Ci0JaW50IGk7CiAJLyoKIAkgKiBFbnN1cmUgdGhhdCB0aGUgcmVmY291bnQgZG9lc24ndCBoaXQgemVybyB3aGlsZSBhbnkgcmVhZGVycwogCSAqIGNhbiBzZWUgaXQuIFNpbWlsYXIgdG8gYXRvbWljX2RlY19hbmRfbG9jaygpLCBidXQgZm9yIGFuCkBAIC0zMDIsMjEgKzI5NSwyOCBAQAogCQl3cml0ZV91bmxvY2soJmNzc19zZXRfbG9jayk7CiAJCXJldHVybjsKIAl9Ci0JdW5saW5rX2Nzc19zZXQoY2cpOwotCXdyaXRlX3VubG9jaygmY3NzX3NldF9sb2NrKTsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQlmb3IgKGkgPSAwOyBpIDwgQ0dST1VQX1NVQlNZU19DT1VOVDsgaSsrKSB7Ci0JCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSByY3VfZGVyZWZlcmVuY2UoY2ctPnN1YnN5c1tpXS0+Y2dyb3VwKTsKKwkvKiBUaGlzIGNzc19zZXQgaXMgZGVhZC4gdW5saW5rIGl0IGFuZCByZWxlYXNlIGNncm91cCByZWZjb3VudHMgKi8KKwlobGlzdF9kZWwoJmNnLT5obGlzdCk7CisJY3NzX3NldF9jb3VudC0tOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxpbmssIHNhdmVkX2xpbmssICZjZy0+Y2dfbGlua3MsCisJCQkJIGNnX2xpbmtfbGlzdCkgeworCQlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gbGluay0+Y2dycDsKKwkJbGlzdF9kZWwoJmxpbmstPmNnX2xpbmtfbGlzdCk7CisJCWxpc3RfZGVsKCZsaW5rLT5jZ3JwX2xpbmtfbGlzdCk7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjZ3JwLT5jb3VudCkgJiYKIAkJICAgIG5vdGlmeV9vbl9yZWxlYXNlKGNncnApKSB7CiAJCQlpZiAodGFza2V4aXQpCiAJCQkJc2V0X2JpdChDR1JQX1JFTEVBU0FCTEUsICZjZ3JwLT5mbGFncyk7CiAJCQljaGVja19mb3JfcmVsZWFzZShjZ3JwKTsKIAkJfQorCisJCWtmcmVlKGxpbmspOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQlrZnJlZShjZyk7CisKKwl3cml0ZV91bmxvY2soJmNzc19zZXRfbG9jayk7CisJY2FsbF9yY3UoJmNnLT5yY3VfaGVhZCwgZnJlZV9jc3Nfc2V0X3JjdSk7CiB9CiAKIC8qCkBAIC0zMzgsNiArMzM4LDc4IEBACiB9CiAKIC8qCisgKiBjb21wYXJlX2Nzc19zZXRzIC0gaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kX2V4aXN0aW5nX2Nzc19zZXQoKS4KKyAqIEBjZzogY2FuZGlkYXRlIGNzc19zZXQgYmVpbmcgdGVzdGVkCisgKiBAb2xkX2NnOiBleGlzdGluZyBjc3Nfc2V0IGZvciBhIHRhc2sKKyAqIEBuZXdfY2dycDogY2dyb3VwIHRoYXQncyBiZWluZyBlbnRlcmVkIGJ5IHRoZSB0YXNrCisgKiBAdGVtcGxhdGU6IGRlc2lyZWQgc2V0IG9mIGNzcyBwb2ludGVycyBpbiBjc3Nfc2V0IChwcmUtY2FsY3VsYXRlZCkKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgImNnIiBtYXRjaGVzICJvbGRfY2ciIGV4Y2VwdCBmb3IgdGhlIGhpZXJhcmNoeQorICogd2hpY2ggIm5ld19jZ3JwIiBiZWxvbmdzIHRvLCBmb3Igd2hpY2ggaXQgc2hvdWxkIG1hdGNoICJuZXdfY2dycCIuCisgKi8KK3N0YXRpYyBib29sIGNvbXBhcmVfY3NzX3NldHMoc3RydWN0IGNzc19zZXQgKmNnLAorCQkJICAgICBzdHJ1Y3QgY3NzX3NldCAqb2xkX2NnLAorCQkJICAgICBzdHJ1Y3QgY2dyb3VwICpuZXdfY2dycCwKKwkJCSAgICAgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKnRlbXBsYXRlW10pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbDEsICpsMjsKKworCWlmIChtZW1jbXAodGVtcGxhdGUsIGNnLT5zdWJzeXMsIHNpemVvZihjZy0+c3Vic3lzKSkpIHsKKwkJLyogTm90IGFsbCBzdWJzeXN0ZW1zIG1hdGNoZWQgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQ29tcGFyZSBjZ3JvdXAgcG9pbnRlcnMgaW4gb3JkZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorCSAqIGRpZmZlcmVudCBjZ3JvdXBzIGluIGhlaXJhcmNoaWVzIHdpdGggbm8gc3Vic3lzdGVtcy4gV2UKKwkgKiBjb3VsZCBnZXQgYnkgd2l0aCBqdXN0IHRoaXMgY2hlY2sgYWxvbmUgKGFuZCBza2lwIHRoZQorCSAqIG1lbWNtcCBhYm92ZSkgYnV0IG9uIG1vc3Qgc2V0dXBzIHRoZSBtZW1jbXAgY2hlY2sgd2lsbAorCSAqIGF2b2lkIHRoZSBuZWVkIGZvciB0aGlzIG1vcmUgZXhwZW5zaXZlIGNoZWNrIG9uIGFsbW9zdCBhbGwKKwkgKiBjYW5kaWRhdGVzLgorCSAqLworCisJbDEgPSAmY2ctPmNnX2xpbmtzOworCWwyID0gJm9sZF9jZy0+Y2dfbGlua3M7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGNnX2Nncm91cF9saW5rICpjZ2wxLCAqY2dsMjsKKwkJc3RydWN0IGNncm91cCAqY2cxLCAqY2cyOworCisJCWwxID0gbDEtPm5leHQ7CisJCWwyID0gbDItPm5leHQ7CisJCS8qIFNlZSBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgLSBib3RoIGxpc3RzIGFyZSBlcXVhbCBsZW5ndGguICovCisJCWlmIChsMSA9PSAmY2ctPmNnX2xpbmtzKSB7CisJCQlCVUdfT04obDIgIT0gJm9sZF9jZy0+Y2dfbGlua3MpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlCVUdfT04obDIgPT0gJm9sZF9jZy0+Y2dfbGlua3MpOworCQl9CisJCS8qIExvY2F0ZSB0aGUgY2dyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlc2UgbGlua3MuICovCisJCWNnbDEgPSBsaXN0X2VudHJ5KGwxLCBzdHJ1Y3QgY2dfY2dyb3VwX2xpbmssIGNnX2xpbmtfbGlzdCk7CisJCWNnbDIgPSBsaXN0X2VudHJ5KGwyLCBzdHJ1Y3QgY2dfY2dyb3VwX2xpbmssIGNnX2xpbmtfbGlzdCk7CisJCWNnMSA9IGNnbDEtPmNncnA7CisJCWNnMiA9IGNnbDItPmNncnA7CisJCS8qIEhpZXJhcmNoaWVzIHNob3VsZCBiZSBsaW5rZWQgaW4gdGhlIHNhbWUgb3JkZXIuICovCisJCUJVR19PTihjZzEtPnJvb3QgIT0gY2cyLT5yb290KTsKKworCQkvKgorCQkgKiBJZiB0aGlzIGhpZXJhcmNoeSBpcyB0aGUgaGllcmFyY2h5IG9mIHRoZSBjZ3JvdXAKKwkJICogdGhhdCdzIGNoYW5naW5nLCB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGlzCisJCSAqIGNzc19zZXQgcG9pbnRzIHRvIHRoZSBuZXcgY2dyb3VwOyBpZiBpdCdzIGFueSBvdGhlcgorCQkgKiBoaWVyYXJjaHksIHRoZW4gdGhpcyBjc3Nfc2V0IHNob3VsZCBwb2ludCB0byB0aGUKKwkJICogc2FtZSBjZ3JvdXAgYXMgdGhlIG9sZCBjc3Nfc2V0LgorCQkgKi8KKwkJaWYgKGNnMS0+cm9vdCA9PSBuZXdfY2dycC0+cm9vdCkgeworCQkJaWYgKGNnMSAhPSBuZXdfY2dycCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlpZiAoY2cxICE9IGNnMikKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCiAgKiBmaW5kX2V4aXN0aW5nX2Nzc19zZXQoKSBpcyBhIGhlbHBlciBmb3IKICAqIGZpbmRfY3NzX3NldCgpLCBhbmQgY2hlY2tzIHRvIHNlZSB3aGV0aGVyIGFuIGV4aXN0aW5nCiAgKiBjc3Nfc2V0IGlzIHN1aXRhYmxlLgpAQCAtMzc4LDEwICs0NTAsMTEgQEAKIAogCWhoZWFkID0gY3NzX3NldF9oYXNoKHRlbXBsYXRlKTsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShjZywgbm9kZSwgaGhlYWQsIGhsaXN0KSB7Ci0JCWlmICghbWVtY21wKHRlbXBsYXRlLCBjZy0+c3Vic3lzLCBzaXplb2YoY2ctPnN1YnN5cykpKSB7Ci0JCQkvKiBBbGwgc3Vic3lzdGVtcyBtYXRjaGVkICovCi0JCQlyZXR1cm4gY2c7Ci0JCX0KKwkJaWYgKCFjb21wYXJlX2Nzc19zZXRzKGNnLCBvbGRjZywgY2dycCwgdGVtcGxhdGUpKQorCQkJY29udGludWU7CisKKwkJLyogVGhpcyBjc3Nfc2V0IG1hdGNoZXMgd2hhdCB3ZSBuZWVkICovCisJCXJldHVybiBjZzsKIAl9CiAKIAkvKiBObyBleGlzdGluZyBjZ3JvdXAgZ3JvdXAgbWF0Y2hlZCAqLwpAQCAtNDM1LDggKzUwOCwxNCBAQAogCWxpbmsgPSBsaXN0X2ZpcnN0X2VudHJ5KHRtcF9jZ19saW5rcywgc3RydWN0IGNnX2Nncm91cF9saW5rLAogCQkJCWNncnBfbGlua19saXN0KTsKIAlsaW5rLT5jZyA9IGNnOworCWxpbmstPmNncnAgPSBjZ3JwOworCWF0b21pY19pbmMoJmNncnAtPmNvdW50KTsKIAlsaXN0X21vdmUoJmxpbmstPmNncnBfbGlua19saXN0LCAmY2dycC0+Y3NzX3NldHMpOwotCWxpc3RfYWRkKCZsaW5rLT5jZ19saW5rX2xpc3QsICZjZy0+Y2dfbGlua3MpOworCS8qCisJICogQWx3YXlzIGFkZCBsaW5rcyB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdCBzbyB0aGF0IHRoZSBsaXN0CisJICogaXMgc29ydGVkIGJ5IG9yZGVyIG9mIGhpZXJhcmNoeSBjcmVhdGlvbgorCSAqLworCWxpc3RfYWRkX3RhaWwoJmxpbmstPmNnX2xpbmtfbGlzdCwgJmNnLT5jZ19saW5rcyk7CiB9CiAKIC8qCkBAIC00NTEsMTEgKzUzMCwxMSBAQAogewogCXN0cnVjdCBjc3Nfc2V0ICpyZXM7CiAJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKnRlbXBsYXRlW0NHUk9VUF9TVUJTWVNfQ09VTlRdOwotCWludCBpOwogCiAJc3RydWN0IGxpc3RfaGVhZCB0bXBfY2dfbGlua3M7CiAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGhlYWQ7CisJc3RydWN0IGNnX2Nncm91cF9saW5rICpsaW5rOwogCiAJLyogRmlyc3Qgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGNncm91cCBncm91cCB0aGF0IG1hdGNoZXMKIAkgKiB0aGUgZGVzaXJlZCBzZXQgKi8KQEAgLTQ4OSwyMCArNTY4LDEyIEBACiAKIAl3cml0ZV9sb2NrKCZjc3Nfc2V0X2xvY2spOwogCS8qIEFkZCByZWZlcmVuY2UgY291bnRzIGFuZCBsaW5rcyBmcm9tIHRoZSBuZXcgY3NzX3NldC4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgQ0dST1VQX1NVQlNZU19DT1VOVDsgaSsrKSB7Ci0JCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSByZXMtPnN1YnN5c1tpXS0+Y2dyb3VwOwotCQlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MgPSBzdWJzeXNbaV07Ci0JCWF0b21pY19pbmMoJmNncnAtPmNvdW50KTsKLQkJLyoKLQkJICogV2Ugd2FudCB0byBhZGQgYSBsaW5rIG9uY2UgcGVyIGNncm91cCwgc28gd2UKLQkJICogb25seSBkbyBpdCBmb3IgdGhlIGZpcnN0IHN1YnN5c3RlbSBpbiBlYWNoCi0JCSAqIGhpZXJhcmNoeQotCQkgKi8KLQkJaWYgKHNzLT5yb290LT5zdWJzeXNfbGlzdC5uZXh0ID09ICZzcy0+c2libGluZykKLQkJCWxpbmtfY3NzX3NldCgmdG1wX2NnX2xpbmtzLCByZXMsIGNncnApOworCWxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJm9sZGNnLT5jZ19saW5rcywgY2dfbGlua19saXN0KSB7CisJCXN0cnVjdCBjZ3JvdXAgKmMgPSBsaW5rLT5jZ3JwOworCQlpZiAoYy0+cm9vdCA9PSBjZ3JwLT5yb290KQorCQkJYyA9IGNncnA7CisJCWxpbmtfY3NzX3NldCgmdG1wX2NnX2xpbmtzLCByZXMsIGMpOwogCX0KLQlpZiAobGlzdF9lbXB0eSgmcm9vdG5vZGUuc3Vic3lzX2xpc3QpKQotCQlsaW5rX2Nzc19zZXQoJnRtcF9jZ19saW5rcywgcmVzLCBkdW1teXRvcCk7CiAKIAlCVUdfT04oIWxpc3RfZW1wdHkoJnRtcF9jZ19saW5rcykpOwogCkBAIC01MTgsNiArNTg5LDQxIEBACiB9CiAKIC8qCisgKiBSZXR1cm4gdGhlIGNncm91cCBmb3IgInRhc2siIGZyb20gdGhlIGdpdmVuIGhpZXJhcmNoeS4gTXVzdCBiZQorICogY2FsbGVkIHdpdGggY2dyb3VwX211dGV4IGhlbGQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2dyb3VwICp0YXNrX2Nncm91cF9mcm9tX3Jvb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkgICAgc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGNzc19zZXQgKmNzczsKKwlzdHJ1Y3QgY2dyb3VwICpyZXMgPSBOVUxMOworCisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmNncm91cF9tdXRleCkpOworCXJlYWRfbG9jaygmY3NzX3NldF9sb2NrKTsKKwkvKgorCSAqIE5vIG5lZWQgdG8gbG9jayB0aGUgdGFzayAtIHNpbmNlIHdlIGhvbGQgY2dyb3VwX211dGV4IHRoZQorCSAqIHRhc2sgY2FuJ3QgY2hhbmdlIGdyb3Vwcywgc28gdGhlIG9ubHkgdGhpbmcgdGhhdCBjYW4gaGFwcGVuCisJICogaXMgdGhhdCBpdCBleGl0cyBhbmQgaXRzIGNzcyBpcyBzZXQgYmFjayB0byBpbml0X2Nzc19zZXQuCisJICovCisJY3NzID0gdGFzay0+Y2dyb3VwczsKKwlpZiAoY3NzID09ICZpbml0X2Nzc19zZXQpIHsKKwkJcmVzID0gJnJvb3QtPnRvcF9jZ3JvdXA7CisJfSBlbHNlIHsKKwkJc3RydWN0IGNnX2Nncm91cF9saW5rICpsaW5rOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZjc3MtPmNnX2xpbmtzLCBjZ19saW5rX2xpc3QpIHsKKwkJCXN0cnVjdCBjZ3JvdXAgKmMgPSBsaW5rLT5jZ3JwOworCQkJaWYgKGMtPnJvb3QgPT0gcm9vdCkgeworCQkJCXJlcyA9IGM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmNzc19zZXRfbG9jayk7CisJQlVHX09OKCFyZXMpOworCXJldHVybiByZXM7Cit9CisKKy8qCiAgKiBUaGVyZSBpcyBvbmUgZ2xvYmFsIGNncm91cCBtdXRleC4gV2UgYWxzbyByZXF1aXJlIHRha2luZwogICogdGFza19sb2NrKCkgd2hlbiBkZXJlZmVyZW5jaW5nIGEgdGFzaydzIGNncm91cCBzdWJzeXMgcG9pbnRlcnMuCiAgKiBTZWUgIlRoZSB0YXNrX2xvY2soKSBleGNlcHRpb24iLCBhdCB0aGUgZW5kIG9mIHRoaXMgY29tbWVudC4KQEAgLTU5Nyw3ICs3MDMsNyBAQAogc3RhdGljIGludCBjZ3JvdXBfcm1kaXIoc3RydWN0IGlub2RlICp1bnVzZWRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogc3RhdGljIGludCBjZ3JvdXBfcG9wdWxhdGVfZGlyKHN0cnVjdCBjZ3JvdXAgKmNncnApOwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNncm91cF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY2dyb3Vwc3RhdHNfb3BlcmF0aW9uczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY2dyb3Vwc3RhdHNfb3BlcmF0aW9uczsKIAogc3RhdGljIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIGNncm91cF9iYWNraW5nX2Rldl9pbmZvID0gewogCS5uYW1lCQk9ICJjZ3JvdXAiLApAQCAtNjc3LDYgKzc4MywxMiBAQAogCQkgKi8KIAkJZGVhY3RpdmF0ZV9zdXBlcihjZ3JwLT5yb290LT5zYik7CiAKKwkJLyoKKwkJICogaWYgd2UncmUgZ2V0dGluZyByaWQgb2YgdGhlIGNncm91cCwgcmVmY291bnQgc2hvdWxkIGVuc3VyZQorCQkgKiB0aGF0IHRoZXJlIGFyZSBubyBwaWRsaXN0cyBsZWZ0LgorCQkgKi8KKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZjZ3JwLT5waWRsaXN0cykpOworCiAJCWNhbGxfcmN1KCZjZ3JwLT5yY3VfaGVhZCwgZnJlZV9jZ3JvdXBfcmN1KTsKIAl9CiAJaXB1dChpbm9kZSk7CkBAIC04NDEsNiArOTUzLDggQEAKIAkJc2VxX3B1dHMoc2VxLCAiLG5vcHJlZml4Iik7CiAJaWYgKHN0cmxlbihyb290LT5yZWxlYXNlX2FnZW50X3BhdGgpKQogCQlzZXFfcHJpbnRmKHNlcSwgIixyZWxlYXNlX2FnZW50PSVzIiwgcm9vdC0+cmVsZWFzZV9hZ2VudF9wYXRoKTsKKwlpZiAoc3RybGVuKHJvb3QtPm5hbWUpKQorCQlzZXFfcHJpbnRmKHNlcSwgIixuYW1lPSVzIiwgcm9vdC0+bmFtZSk7CiAJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCXJldHVybiAwOwogfQpAQCAtODQ5LDYgKzk2MywxMiBAQAogCXVuc2lnbmVkIGxvbmcgc3Vic3lzX2JpdHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyICpyZWxlYXNlX2FnZW50OworCWNoYXIgKm5hbWU7CisJLyogVXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBlbXB0eSBzdWJzeXN0ZW0gKi8KKwlib29sIG5vbmU7CisKKwlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqbmV3X3Jvb3Q7CisKIH07CiAKIC8qIENvbnZlcnQgYSBoaWVyYXJjaHkgc3BlY2lmaWVyIGludG8gYSBiaXRtYXNrIG9mIHN1YnN5c3RlbXMgYW5kCkBAIC04NjMsOSArOTgzLDcgQEAKIAltYXNrID0gfigxVUwgPDwgY3B1c2V0X3N1YnN5c19pZCk7CiAjZW5kaWYKIAotCW9wdHMtPnN1YnN5c19iaXRzID0gMDsKLQlvcHRzLT5mbGFncyA9IDA7Ci0Jb3B0cy0+cmVsZWFzZV9hZ2VudCA9IE5VTEw7CisJbWVtc2V0KG9wdHMsIDAsIHNpemVvZigqb3B0cykpOwogCiAJd2hpbGUgKCh0b2tlbiA9IHN0cnNlcCgmbywgIiwiKSkgIT0gTlVMTCkgewogCQlpZiAoISp0b2tlbikKQEAgLTg3OSwxNyArOTk3LDQyIEBACiAJCQkJaWYgKCFzcy0+ZGlzYWJsZWQpCiAJCQkJCW9wdHMtPnN1YnN5c19iaXRzIHw9IDF1bCA8PCBpOwogCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sICJub25lIikpIHsKKwkJCS8qIEV4cGxpY2l0bHkgaGF2ZSBubyBzdWJzeXN0ZW1zICovCisJCQlvcHRzLT5ub25lID0gdHJ1ZTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRva2VuLCAibm9wcmVmaXgiKSkgewogCQkJc2V0X2JpdChST09UX05PUFJFRklYLCAmb3B0cy0+ZmxhZ3MpOwogCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRva2VuLCAicmVsZWFzZV9hZ2VudD0iLCAxNCkpIHsKIAkJCS8qIFNwZWNpZnlpbmcgdHdvIHJlbGVhc2UgYWdlbnRzIGlzIGZvcmJpZGRlbiAqLwogCQkJaWYgKG9wdHMtPnJlbGVhc2VfYWdlbnQpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlvcHRzLT5yZWxlYXNlX2FnZW50ID0ga3phbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7CisJCQlvcHRzLT5yZWxlYXNlX2FnZW50ID0KKwkJCQlrc3RybmR1cCh0b2tlbiArIDE0LCBQQVRIX01BWCwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW9wdHMtPnJlbGVhc2VfYWdlbnQpCiAJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQlzdHJuY3B5KG9wdHMtPnJlbGVhc2VfYWdlbnQsIHRva2VuICsgMTQsIFBBVEhfTUFYIC0gMSk7Ci0JCQlvcHRzLT5yZWxlYXNlX2FnZW50W1BBVEhfTUFYIC0gMV0gPSAwOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRva2VuLCAibmFtZT0iLCA1KSkgeworCQkJaW50IGk7CisJCQljb25zdCBjaGFyICpuYW1lID0gdG9rZW4gKyA1OworCQkJLyogQ2FuJ3Qgc3BlY2lmeSBhbiBlbXB0eSBuYW1lICovCisJCQlpZiAoIXN0cmxlbihuYW1lKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCS8qIE11c3QgbWF0Y2ggW1x3Li1dKyAqLworCQkJZm9yIChpID0gMDsgaSA8IHN0cmxlbihuYW1lKTsgaSsrKSB7CisJCQkJY2hhciBjID0gbmFtZVtpXTsKKwkJCQlpZiAoaXNhbG51bShjKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKChjID09ICcuJykgfHwgKGMgPT0gJy0nKSB8fCAoYyA9PSAnXycpKQorCQkJCQljb250aW51ZTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIFNwZWNpZnlpbmcgdHdvIG5hbWVzIGlzIGZvcmJpZGRlbiAqLworCQkJaWYgKG9wdHMtPm5hbWUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlvcHRzLT5uYW1lID0ga3N0cm5kdXAobmFtZSwKKwkJCQkJICAgICAgTUFYX0NHUk9VUF9ST09UX05BTUVMRU4sCisJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFvcHRzLT5uYW1lKQorCQkJCXJldHVybiAtRU5PTUVNOwogCQl9IGVsc2UgewogCQkJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzOwogCQkJaW50IGk7CkBAIC05MDYsNiArMTA0OSw4IEBACiAJCX0KIAl9CiAKKwkvKiBDb25zaXN0ZW5jeSBjaGVja3MgKi8KKwogCS8qCiAJICogT3B0aW9uIG5vcHJlZml4IHdhcyBpbnRyb2R1Y2VkIGp1c3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKIAkgKiB3aXRoIHRoZSBvbGQgY3B1c2V0LCBzbyB3ZSBhbGxvdyBub3ByZWZpeCBvbmx5IGlmIG1vdW50aW5nIGp1c3QKQEAgLTkxNSw4ICsxMDYwLDE2IEBACiAJICAgIChvcHRzLT5zdWJzeXNfYml0cyAmIG1hc2spKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFdlIGNhbid0IGhhdmUgYW4gZW1wdHkgaGllcmFyY2h5ICovCi0JaWYgKCFvcHRzLT5zdWJzeXNfYml0cykKKworCS8qIENhbid0IHNwZWNpZnkgIm5vbmUiIGFuZCBzb21lIHN1YnN5c3RlbXMgKi8KKwlpZiAob3B0cy0+c3Vic3lzX2JpdHMgJiYgb3B0cy0+bm9uZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFdlIGVpdGhlciBoYXZlIHRvIHNwZWNpZnkgYnkgbmFtZSBvciBieSBzdWJzeXN0ZW1zLiAoU28gYWxsCisJICogZW1wdHkgaGllcmFyY2hpZXMgbXVzdCBoYXZlIGEgbmFtZSkuCisJICovCisJaWYgKCFvcHRzLT5zdWJzeXNfYml0cyAmJiAhb3B0cy0+bmFtZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKQEAgLTk0NCw2ICsxMDk3LDEyIEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKKwkvKiBEb24ndCBhbGxvdyBuYW1lIHRvIGNoYW5nZSBhdCByZW1vdW50ICovCisJaWYgKG9wdHMubmFtZSAmJiBzdHJjbXAob3B0cy5uYW1lLCByb290LT5uYW1lKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCiAJcmV0ID0gcmViaW5kX3N1YnN5c3RlbXMocm9vdCwgb3B0cy5zdWJzeXNfYml0cyk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtOTU1LDYgKzExMTQsNyBAQAogCQlzdHJjcHkocm9vdC0+cmVsZWFzZV9hZ2VudF9wYXRoLCBvcHRzLnJlbGVhc2VfYWdlbnQpOwogIG91dF91bmxvY2s6CiAJa2ZyZWUob3B0cy5yZWxlYXNlX2FnZW50KTsKKwlrZnJlZShvcHRzLm5hbWUpOwogCW11dGV4X3VubG9jaygmY2dyb3VwX211dGV4KTsKIAltdXRleF91bmxvY2soJmNncnAtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJdW5sb2NrX2tlcm5lbCgpOwpAQCAtOTc0LDkgKzExMzQsMTAgQEAKIAlJTklUX0xJU1RfSEVBRCgmY2dycC0+Y2hpbGRyZW4pOwogCUlOSVRfTElTVF9IRUFEKCZjZ3JwLT5jc3Nfc2V0cyk7CiAJSU5JVF9MSVNUX0hFQUQoJmNncnAtPnJlbGVhc2VfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNncnAtPnBpZHNfbGlzdCk7Ci0JaW5pdF9yd3NlbSgmY2dycC0+cGlkc19tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmNncnAtPnBpZGxpc3RzKTsKKwltdXRleF9pbml0KCZjZ3JwLT5waWRsaXN0X211dGV4KTsKIH0KKwogc3RhdGljIHZvaWQgaW5pdF9jZ3JvdXBfcm9vdChzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdCkKIHsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gJnJvb3QtPnRvcF9jZ3JvdXA7CkBAIC05ODgsMzMgKzExNDksMTA2IEBACiAJaW5pdF9jZ3JvdXBfaG91c2VrZWVwaW5nKGNncnApOwogfQogCitzdGF0aWMgYm9vbCBpbml0X3Jvb3RfaWQoc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QpCit7CisJaW50IHJldCA9IDA7CisKKwlkbyB7CisJCWlmICghaWRhX3ByZV9nZXQoJmhpZXJhcmNoeV9pZGEsIEdGUF9LRVJORUwpKQorCQkJcmV0dXJuIGZhbHNlOworCQlzcGluX2xvY2soJmhpZXJhcmNoeV9pZF9sb2NrKTsKKwkJLyogVHJ5IHRvIGFsbG9jYXRlIHRoZSBuZXh0IHVudXNlZCBJRCAqLworCQlyZXQgPSBpZGFfZ2V0X25ld19hYm92ZSgmaGllcmFyY2h5X2lkYSwgbmV4dF9oaWVyYXJjaHlfaWQsCisJCQkJCSZyb290LT5oaWVyYXJjaHlfaWQpOworCQlpZiAocmV0ID09IC1FTk9TUEMpCisJCQkvKiBUcnkgYWdhaW4gc3RhcnRpbmcgZnJvbSAwICovCisJCQlyZXQgPSBpZGFfZ2V0X25ldygmaGllcmFyY2h5X2lkYSwgJnJvb3QtPmhpZXJhcmNoeV9pZCk7CisJCWlmICghcmV0KSB7CisJCQluZXh0X2hpZXJhcmNoeV9pZCA9IHJvb3QtPmhpZXJhcmNoeV9pZCArIDE7CisJCX0gZWxzZSBpZiAocmV0ICE9IC1FQUdBSU4pIHsKKwkJCS8qIENhbiBvbmx5IGdldCBoZXJlIGlmIHRoZSAzMS1iaXQgSURSIGlzIGZ1bGwgLi4uICovCisJCQlCVUdfT04ocmV0KTsKKwkJfQorCQlzcGluX3VubG9jaygmaGllcmFyY2h5X2lkX2xvY2spOworCX0gd2hpbGUgKHJldCk7CisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBpbnQgY2dyb3VwX3Rlc3Rfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqbmV3ID0gZGF0YTsKKwlzdHJ1Y3QgY2dyb3VwX3NiX29wdHMgKm9wdHMgPSBkYXRhOwogCXN0cnVjdCBjZ3JvdXBmc19yb290ICpyb290ID0gc2ItPnNfZnNfaW5mbzsKIAotCS8qIEZpcnN0IGNoZWNrIHN1YnN5c3RlbXMgKi8KLQlpZiAobmV3LT5zdWJzeXNfYml0cyAhPSByb290LT5zdWJzeXNfYml0cykKLQkgICAgcmV0dXJuIDA7CisJLyogSWYgd2UgYXNrZWQgZm9yIGEgbmFtZSB0aGVuIGl0IG11c3QgbWF0Y2ggKi8KKwlpZiAob3B0cy0+bmFtZSAmJiBzdHJjbXAob3B0cy0+bmFtZSwgcm9vdC0+bmFtZSkpCisJCXJldHVybiAwOwogCi0JLyogTmV4dCBjaGVjayBmbGFncyAqLwotCWlmIChuZXctPmZsYWdzICE9IHJvb3QtPmZsYWdzKQorCS8qCisJICogSWYgd2UgYXNrZWQgZm9yIHN1YnN5c3RlbXMgKG9yIGV4cGxpY2l0bHkgZm9yIG5vCisJICogc3Vic3lzdGVtcykgdGhlbiB0aGV5IG11c3QgbWF0Y2gKKwkgKi8KKwlpZiAoKG9wdHMtPnN1YnN5c19iaXRzIHx8IG9wdHMtPm5vbmUpCisJICAgICYmIChvcHRzLT5zdWJzeXNfYml0cyAhPSByb290LT5zdWJzeXNfYml0cykpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqY2dyb3VwX3Jvb3RfZnJvbV9vcHRzKHN0cnVjdCBjZ3JvdXBfc2Jfb3B0cyAqb3B0cykKK3sKKwlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdDsKKworCWlmICghb3B0cy0+c3Vic3lzX2JpdHMgJiYgIW9wdHMtPm5vbmUpCisJCXJldHVybiBOVUxMOworCisJcm9vdCA9IGt6YWxsb2Moc2l6ZW9mKCpyb290KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyb290KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICghaW5pdF9yb290X2lkKHJvb3QpKSB7CisJCWtmcmVlKHJvb3QpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJaW5pdF9jZ3JvdXBfcm9vdChyb290KTsKKworCXJvb3QtPnN1YnN5c19iaXRzID0gb3B0cy0+c3Vic3lzX2JpdHM7CisJcm9vdC0+ZmxhZ3MgPSBvcHRzLT5mbGFnczsKKwlpZiAob3B0cy0+cmVsZWFzZV9hZ2VudCkKKwkJc3RyY3B5KHJvb3QtPnJlbGVhc2VfYWdlbnRfcGF0aCwgb3B0cy0+cmVsZWFzZV9hZ2VudCk7CisJaWYgKG9wdHMtPm5hbWUpCisJCXN0cmNweShyb290LT5uYW1lLCBvcHRzLT5uYW1lKTsKKwlyZXR1cm4gcm9vdDsKK30KKworc3RhdGljIHZvaWQgY2dyb3VwX2Ryb3Bfcm9vdChzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdCkKK3sKKwlpZiAoIXJvb3QpCisJCXJldHVybjsKKworCUJVR19PTighcm9vdC0+aGllcmFyY2h5X2lkKTsKKwlzcGluX2xvY2soJmhpZXJhcmNoeV9pZF9sb2NrKTsKKwlpZGFfcmVtb3ZlKCZoaWVyYXJjaHlfaWRhLCByb290LT5oaWVyYXJjaHlfaWQpOworCXNwaW5fdW5sb2NrKCZoaWVyYXJjaHlfaWRfbG9jayk7CisJa2ZyZWUocm9vdCk7Cit9CisKIHN0YXRpYyBpbnQgY2dyb3VwX3NldF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QgPSBkYXRhOworCXN0cnVjdCBjZ3JvdXBfc2Jfb3B0cyAqb3B0cyA9IGRhdGE7CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgbmV3IHJvb3QsIHdlIGNhbid0IHNldCB1cCBhIG5ldyBzYiAqLworCWlmICghb3B0cy0+bmV3X3Jvb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJQlVHX09OKCFvcHRzLT5zdWJzeXNfYml0cyAmJiAhb3B0cy0+bm9uZSk7CiAKIAlyZXQgPSBzZXRfYW5vbl9zdXBlcihzYiwgTlVMTCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXNiLT5zX2ZzX2luZm8gPSByb290OwotCXJvb3QtPnNiID0gc2I7CisJc2ItPnNfZnNfaW5mbyA9IG9wdHMtPm5ld19yb290OworCW9wdHMtPm5ld19yb290LT5zYiA9IHNiOwogCiAJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKQEAgLTEwNTEsNDggKzEyODUsNDMgQEAKIAkJCSB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKIAlzdHJ1Y3QgY2dyb3VwX3NiX29wdHMgb3B0czsKKwlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdDsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwotCXN0cnVjdCBjZ3JvdXBmc19yb290ICpyb290OwotCXN0cnVjdCBsaXN0X2hlYWQgdG1wX2NnX2xpbmtzOworCXN0cnVjdCBjZ3JvdXBmc19yb290ICpuZXdfcm9vdDsKIAogCS8qIEZpcnN0IGZpbmQgdGhlIGRlc2lyZWQgc2V0IG9mIHN1YnN5c3RlbXMgKi8KIAlyZXQgPSBwYXJzZV9jZ3JvdXBmc19vcHRpb25zKGRhdGEsICZvcHRzKTsKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKG9wdHMucmVsZWFzZV9hZ2VudCk7Ci0JCXJldHVybiByZXQ7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZXJyOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIG5ldyBjZ3JvdXAgcm9vdC4gV2UgbWF5IG5vdCBuZWVkIGl0IGlmIHdlJ3JlCisJICogcmV1c2luZyBhbiBleGlzdGluZyBoaWVyYXJjaHkuCisJICovCisJbmV3X3Jvb3QgPSBjZ3JvdXBfcm9vdF9mcm9tX29wdHMoJm9wdHMpOworCWlmIChJU19FUlIobmV3X3Jvb3QpKSB7CisJCXJldCA9IFBUUl9FUlIobmV3X3Jvb3QpOworCQlnb3RvIG91dF9lcnI7CiAJfQorCW9wdHMubmV3X3Jvb3QgPSBuZXdfcm9vdDsKIAotCXJvb3QgPSBremFsbG9jKHNpemVvZigqcm9vdCksIEdGUF9LRVJORUwpOwotCWlmICghcm9vdCkgewotCQlrZnJlZShvcHRzLnJlbGVhc2VfYWdlbnQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpbml0X2Nncm91cF9yb290KHJvb3QpOwotCXJvb3QtPnN1YnN5c19iaXRzID0gb3B0cy5zdWJzeXNfYml0czsKLQlyb290LT5mbGFncyA9IG9wdHMuZmxhZ3M7Ci0JaWYgKG9wdHMucmVsZWFzZV9hZ2VudCkgewotCQlzdHJjcHkocm9vdC0+cmVsZWFzZV9hZ2VudF9wYXRoLCBvcHRzLnJlbGVhc2VfYWdlbnQpOwotCQlrZnJlZShvcHRzLnJlbGVhc2VfYWdlbnQpOwotCX0KLQotCXNiID0gc2dldChmc190eXBlLCBjZ3JvdXBfdGVzdF9zdXBlciwgY2dyb3VwX3NldF9zdXBlciwgcm9vdCk7Ci0KKwkvKiBMb2NhdGUgYW4gZXhpc3Rpbmcgb3IgbmV3IHNiIGZvciB0aGlzIGhpZXJhcmNoeSAqLworCXNiID0gc2dldChmc190eXBlLCBjZ3JvdXBfdGVzdF9zdXBlciwgY2dyb3VwX3NldF9zdXBlciwgJm9wdHMpOwogCWlmIChJU19FUlIoc2IpKSB7Ci0JCWtmcmVlKHJvb3QpOwotCQlyZXR1cm4gUFRSX0VSUihzYik7CisJCXJldCA9IFBUUl9FUlIoc2IpOworCQljZ3JvdXBfZHJvcF9yb290KG9wdHMubmV3X3Jvb3QpOworCQlnb3RvIG91dF9lcnI7CiAJfQogCi0JaWYgKHNiLT5zX2ZzX2luZm8gIT0gcm9vdCkgewotCQkvKiBSZXVzaW5nIGFuIGV4aXN0aW5nIHN1cGVyYmxvY2sgKi8KLQkJQlVHX09OKHNiLT5zX3Jvb3QgPT0gTlVMTCk7Ci0JCWtmcmVlKHJvb3QpOwotCQlyb290ID0gTlVMTDsKLQl9IGVsc2UgewotCQkvKiBOZXcgc3VwZXJibG9jayAqLworCXJvb3QgPSBzYi0+c19mc19pbmZvOworCUJVR19PTighcm9vdCk7CisJaWYgKHJvb3QgPT0gb3B0cy5uZXdfcm9vdCkgeworCQkvKiBXZSB1c2VkIHRoZSBuZXcgcm9vdCBzdHJ1Y3R1cmUsIHNvIHRoaXMgaXMgYSBuZXcgaGllcmFyY2h5ICovCisJCXN0cnVjdCBsaXN0X2hlYWQgdG1wX2NnX2xpbmtzOwogCQlzdHJ1Y3QgY2dyb3VwICpyb290X2NncnAgPSAmcm9vdC0+dG9wX2Nncm91cDsKIAkJc3RydWN0IGlub2RlICppbm9kZTsKKwkJc3RydWN0IGNncm91cGZzX3Jvb3QgKmV4aXN0aW5nX3Jvb3Q7CiAJCWludCBpOwogCiAJCUJVR19PTihzYi0+c19yb290ICE9IE5VTEwpOwpAQCAtMTEwNSw2ICsxMzM0LDE4IEBACiAJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkJbXV0ZXhfbG9jaygmY2dyb3VwX211dGV4KTsKIAorCQlpZiAoc3RybGVuKHJvb3QtPm5hbWUpKSB7CisJCQkvKiBDaGVjayBmb3IgbmFtZSBjbGFzaGVzIHdpdGggZXhpc3RpbmcgbW91bnRzICovCisJCQlmb3JfZWFjaF9hY3RpdmVfcm9vdChleGlzdGluZ19yb290KSB7CisJCQkJaWYgKCFzdHJjbXAoZXhpc3Rpbmdfcm9vdC0+bmFtZSwgcm9vdC0+bmFtZSkpIHsKKwkJCQkJcmV0ID0gLUVCVVNZOworCQkJCQltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CisJCQkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCQkJCQlnb3RvIGRyb3BfbmV3X3N1cGVyOworCQkJCX0KKwkJCX0KKwkJfQorCiAJCS8qCiAJCSAqIFdlJ3JlIGFjY2Vzc2luZyBjc3Nfc2V0X2NvdW50IHdpdGhvdXQgbG9ja2luZwogCQkgKiBjc3Nfc2V0X2xvY2sgaGVyZSwgYnV0IHRoYXQncyBPSyAtIGl0IGNhbiBvbmx5IGJlCkBAIC0xMTIzLDcgKzEzNjQsOCBAQAogCQlpZiAocmV0ID09IC1FQlVTWSkgewogCQkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JCQlnb3RvIGZyZWVfY2dfbGlua3M7CisJCQlmcmVlX2NnX2xpbmtzKCZ0bXBfY2dfbGlua3MpOworCQkJZ290byBkcm9wX25ld19zdXBlcjsKIAkJfQogCiAJCS8qIEVCVVNZIHNob3VsZCBiZSB0aGUgb25seSBlcnJvciBoZXJlICovCkBAIC0xMTU1LDE3ICsxMzk3LDI3IEBACiAJCUJVR19PTihyb290LT5udW1iZXJfb2ZfY2dyb3VwcyAhPSAxKTsKIAogCQljZ3JvdXBfcG9wdWxhdGVfZGlyKHJvb3RfY2dycCk7Ci0JCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIHJlLXVzZWQgYW4gZXhpc3RpbmcgaGllcmFyY2h5IC0gdGhlIG5ldyByb290IChpZgorCQkgKiBhbnkpIGlzIG5vdCBuZWVkZWQKKwkJICovCisJCWNncm91cF9kcm9wX3Jvb3Qob3B0cy5uZXdfcm9vdCk7CiAJfQogCiAJc2ltcGxlX3NldF9tbnQobW50LCBzYik7CisJa2ZyZWUob3B0cy5yZWxlYXNlX2FnZW50KTsKKwlrZnJlZShvcHRzLm5hbWUpOwogCXJldHVybiAwOwogCi0gZnJlZV9jZ19saW5rczoKLQlmcmVlX2NnX2xpbmtzKCZ0bXBfY2dfbGlua3MpOwogIGRyb3BfbmV3X3N1cGVyOgogCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHNiKTsKKyBvdXRfZXJyOgorCWtmcmVlKG9wdHMucmVsZWFzZV9hZ2VudCk7CisJa2ZyZWUob3B0cy5uYW1lKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyMTEsNyArMTQ2Myw3IEBACiAJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCiAJa2lsbF9saXR0ZXJfc3VwZXIoc2IpOwotCWtmcmVlKHJvb3QpOworCWNncm91cF9kcm9wX3Jvb3Qocm9vdCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjZ3JvdXBfZnNfdHlwZSA9IHsKQEAgLTEyNzYsMjcgKzE1MjgsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUmV0dXJuIHRoZSBmaXJzdCBzdWJzeXN0ZW0gYXR0YWNoZWQgdG8gYSBjZ3JvdXAncyBoaWVyYXJjaHksIGFuZAotICogaXRzIHN1YnN5c3RlbSBpZC4KLSAqLwotCi1zdGF0aWMgdm9pZCBnZXRfZmlyc3Rfc3Vic3lzKGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnAsCi0JCQlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqKmNzcywgaW50ICpzdWJzeXNfaWQpCi17Ci0JY29uc3Qgc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QgPSBjZ3JwLT5yb290OwotCWNvbnN0IHN0cnVjdCBjZ3JvdXBfc3Vic3lzICp0ZXN0X3NzOwotCUJVR19PTihsaXN0X2VtcHR5KCZyb290LT5zdWJzeXNfbGlzdCkpOwotCXRlc3Rfc3MgPSBsaXN0X2VudHJ5KHJvb3QtPnN1YnN5c19saXN0Lm5leHQsCi0JCQkgICAgIHN0cnVjdCBjZ3JvdXBfc3Vic3lzLCBzaWJsaW5nKTsKLQlpZiAoY3NzKSB7Ci0JCSpjc3MgPSBjZ3JwLT5zdWJzeXNbdGVzdF9zcy0+c3Vic3lzX2lkXTsKLQkJQlVHX09OKCEqY3NzKTsKLQl9Ci0JaWYgKHN1YnN5c19pZCkKLQkJKnN1YnN5c19pZCA9IHRlc3Rfc3MtPnN1YnN5c19pZDsKLX0KLQogLyoqCiAgKiBjZ3JvdXBfYXR0YWNoX3Rhc2sgLSBhdHRhY2ggdGFzayAndHNrJyB0byBjZ3JvdXAgJ2NncnAnCiAgKiBAY2dycDogdGhlIGNncm91cCB0aGUgdGFzayBpcyBhdHRhY2hpbmcgdG8KQEAgLTEzMTMsMTggKzE1NDQsMTUgQEAKIAlzdHJ1Y3QgY3NzX3NldCAqY2c7CiAJc3RydWN0IGNzc19zZXQgKm5ld2NnOwogCXN0cnVjdCBjZ3JvdXBmc19yb290ICpyb290ID0gY2dycC0+cm9vdDsKLQlpbnQgc3Vic3lzX2lkOwotCi0JZ2V0X2ZpcnN0X3N1YnN5cyhjZ3JwLCBOVUxMLCAmc3Vic3lzX2lkKTsKIAogCS8qIE5vdGhpbmcgdG8gZG8gaWYgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiB0aGF0IGNncm91cCAqLwotCW9sZGNncnAgPSB0YXNrX2Nncm91cCh0c2ssIHN1YnN5c19pZCk7CisJb2xkY2dycCA9IHRhc2tfY2dyb3VwX2Zyb21fcm9vdCh0c2ssIHJvb3QpOwogCWlmIChjZ3JwID09IG9sZGNncnApCiAJCXJldHVybiAwOwogCiAJZm9yX2VhY2hfc3Vic3lzKHJvb3QsIHNzKSB7CiAJCWlmIChzcy0+Y2FuX2F0dGFjaCkgewotCQkJcmV0dmFsID0gc3MtPmNhbl9hdHRhY2goc3MsIGNncnAsIHRzayk7CisJCQlyZXR2YWwgPSBzcy0+Y2FuX2F0dGFjaChzcywgY2dycCwgdHNrLCBmYWxzZSk7CiAJCQlpZiAocmV0dmFsKQogCQkJCXJldHVybiByZXR2YWw7CiAJCX0KQEAgLTEzNjIsNyArMTU5MCw3IEBACiAKIAlmb3JfZWFjaF9zdWJzeXMocm9vdCwgc3MpIHsKIAkJaWYgKHNzLT5hdHRhY2gpCi0JCQlzcy0+YXR0YWNoKHNzLCBjZ3JwLCBvbGRjZ3JwLCB0c2spOworCQkJc3MtPmF0dGFjaChzcywgY2dycCwgb2xkY2dycCwgdHNrLCBmYWxzZSk7CiAJfQogCXNldF9iaXQoQ0dSUF9SRUxFQVNBQkxFLCAmb2xkY2dycC0+ZmxhZ3MpOwogCXN5bmNocm9uaXplX3JjdSgpOwpAQCAtMTQyMywxNSArMTY1MSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogVGhlIHZhcmlvdXMgdHlwZXMgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIGEgY2dyb3VwIGZpbGUgc3lzdGVtICovCi1lbnVtIGNncm91cF9maWxldHlwZSB7Ci0JRklMRV9ST09ULAotCUZJTEVfRElSLAotCUZJTEVfVEFTS0xJU1QsCi0JRklMRV9OT1RJRllfT05fUkVMRUFTRSwKLQlGSUxFX1JFTEVBU0VfQUdFTlQsCi19OwotCiAvKioKICAqIGNncm91cF9sb2NrX2xpdmVfZ3JvdXAgLSB0YWtlIGNncm91cF9tdXRleCBhbmQgY2hlY2sgdGhhdCBjZ3JwIGlzIGFsaXZlLgogICogQGNncnA6IHRoZSBjZ3JvdXAgdG8gYmUgY2hlY2tlZCBmb3IgbGl2ZW5lc3MKQEAgLTE0OTEsMTQgKzE3MTAsMTMgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlidWZmZXJbbmJ5dGVzXSA9IDA7ICAgICAvKiBudWwtdGVybWluYXRlICovCi0Jc3Ryc3RyaXAoYnVmZmVyKTsKIAlpZiAoY2Z0LT53cml0ZV91NjQpIHsKLQkJdTY0IHZhbCA9IHNpbXBsZV9zdHJ0b3VsbChidWZmZXIsICZlbmQsIDApOworCQl1NjQgdmFsID0gc2ltcGxlX3N0cnRvdWxsKHN0cnN0cmlwKGJ1ZmZlciksICZlbmQsIDApOwogCQlpZiAoKmVuZCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlyZXR2YWwgPSBjZnQtPndyaXRlX3U2NChjZ3JwLCBjZnQsIHZhbCk7CiAJfSBlbHNlIHsKLQkJczY0IHZhbCA9IHNpbXBsZV9zdHJ0b2xsKGJ1ZmZlciwgJmVuZCwgMCk7CisJCXM2NCB2YWwgPSBzaW1wbGVfc3RydG9sbChzdHJzdHJpcChidWZmZXIpLCAmZW5kLCAwKTsKIAkJaWYgKCplbmQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dmFsID0gY2Z0LT53cml0ZV9zNjQoY2dycCwgY2Z0LCB2YWwpOwpAQCAtMTUzNCw4ICsxNzUyLDcgQEAKIAl9CiAKIAlidWZmZXJbbmJ5dGVzXSA9IDA7ICAgICAvKiBudWwtdGVybWluYXRlICovCi0Jc3Ryc3RyaXAoYnVmZmVyKTsKLQlyZXR2YWwgPSBjZnQtPndyaXRlX3N0cmluZyhjZ3JwLCBjZnQsIGJ1ZmZlcik7CisJcmV0dmFsID0gY2Z0LT53cml0ZV9zdHJpbmcoY2dycCwgY2Z0LCBzdHJzdHJpcChidWZmZXIpKTsKIAlpZiAoIXJldHZhbCkKIAkJcmV0dmFsID0gbmJ5dGVzOwogb3V0OgpAQCAtMTY0NCw3ICsxODYxLDcgQEAKIAlyZXR1cm4gc2luZ2xlX3JlbGVhc2UoaW5vZGUsIGZpbGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjZ3JvdXBfc2VxZmlsZV9vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2dyb3VwX3NlcWZpbGVfb3BlcmF0aW9ucyA9IHsKIAkucmVhZCA9IHNlcV9yZWFkLAogCS53cml0ZSA9IGNncm91cF9maWxlX3dyaXRlLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCkBAIC0xNzAzLDcgKzE5MjAsNyBAQAogCXJldHVybiBzaW1wbGVfcmVuYW1lKG9sZF9kaXIsIG9sZF9kZW50cnksIG5ld19kaXIsIG5ld19kZW50cnkpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjZ3JvdXBfZmlsZV9vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2dyb3VwX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkucmVhZCA9IGNncm91cF9maWxlX3JlYWQsCiAJLndyaXRlID0gY2dyb3VwX2ZpbGVfd3JpdGUsCiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCkBAIC0xODc2LDcgKzIwOTMsNyBAQAogICogdGhlIHN0YXJ0IG9mIGEgY3NzX3NldAogICovCiBzdGF0aWMgdm9pZCBjZ3JvdXBfYWR2YW5jZV9pdGVyKHN0cnVjdCBjZ3JvdXAgKmNncnAsCi0JCQkJCSAgc3RydWN0IGNncm91cF9pdGVyICppdCkKKwkJCQlzdHJ1Y3QgY2dyb3VwX2l0ZXIgKml0KQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmwgPSBpdC0+Y2dfbGluazsKIAlzdHJ1Y3QgY2dfY2dyb3VwX2xpbmsgKmxpbms7CkBAIC0yMTI5LDcgKzIzNDYsNyBAQAogfQogCiAvKgotICogU3R1ZmYgZm9yIHJlYWRpbmcgdGhlICd0YXNrcycgZmlsZS4KKyAqIFN0dWZmIGZvciByZWFkaW5nIHRoZSAndGFza3MnLydwcm9jcycgZmlsZXMuCiAgKgogICogUmVhZGluZyB0aGlzIGZpbGUgY2FuIHJldHVybiBsYXJnZSBhbW91bnRzIG9mIGRhdGEgaWYgYSBjZ3JvdXAgaGFzCiAgKiAqbG90cyogb2YgYXR0YWNoZWQgdGFza3MuIFNvIGl0IG1heSBuZWVkIHNldmVyYWwgY2FsbHMgdG8gcmVhZCgpLApAQCAtMjEzOSwyNyArMjM1NiwxOTYgQEAKICAqLwogCiAvKgotICogTG9hZCBpbnRvICdwaWRhcnJheScgdXAgdG8gJ25waWRzJyBvZiB0aGUgdGFza3MgdXNpbmcgY2dyb3VwCi0gKiAnY2dycCcuICBSZXR1cm4gYWN0dWFsIG51bWJlciBvZiBwaWRzIGxvYWRlZC4gIE5vIG5lZWQgdG8KLSAqIHRhc2tfbG9jayhwKSB3aGVuIHJlYWRpbmcgb3V0IHAtPmNncm91cCwgc2luY2Ugd2UncmUgaW4gYW4gUkNVCi0gKiByZWFkIHNlY3Rpb24sIHNvIHRoZSBjc3Nfc2V0IGNhbid0IGdvIGF3YXksIGFuZCBpcwotICogaW1tdXRhYmxlIGFmdGVyIGNyZWF0aW9uLgorICogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zICJmaXgiIHRoZSBpc3N1ZSB3aGVyZSB0aGVyZSBhcmUgbW9yZSBwaWRzCisgKiB0aGFuIGttYWxsb2Mgd2lsbCBnaXZlIG1lbW9yeSBmb3I7IGluIHN1Y2ggY2FzZXMsIHdlIHVzZSB2bWFsbG9jL3ZmcmVlLgorICogVE9ETzogcmVwbGFjZSB3aXRoIGEga2VybmVsLXdpZGUgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtCiAgKi8KLXN0YXRpYyBpbnQgcGlkX2FycmF5X2xvYWQocGlkX3QgKnBpZGFycmF5LCBpbnQgbnBpZHMsIHN0cnVjdCBjZ3JvdXAgKmNncnApCisjZGVmaW5lIFBJRExJU1RfVE9PX0xBUkdFKGMpICgoYykgKiBzaXplb2YocGlkX3QpID4gKFBBR0VfU0laRSAqIDIpKQorc3RhdGljIHZvaWQgKnBpZGxpc3RfYWxsb2NhdGUoaW50IGNvdW50KQogewotCWludCBuID0gMCwgcGlkOworCWlmIChQSURMSVNUX1RPT19MQVJHRShjb3VudCkpCisJCXJldHVybiB2bWFsbG9jKGNvdW50ICogc2l6ZW9mKHBpZF90KSk7CisJZWxzZQorCQlyZXR1cm4ga21hbGxvYyhjb3VudCAqIHNpemVvZihwaWRfdCksIEdGUF9LRVJORUwpOworfQorc3RhdGljIHZvaWQgcGlkbGlzdF9mcmVlKHZvaWQgKnApCit7CisJaWYgKGlzX3ZtYWxsb2NfYWRkcihwKSkKKwkJdmZyZWUocCk7CisJZWxzZQorCQlrZnJlZShwKTsKK30KK3N0YXRpYyB2b2lkICpwaWRsaXN0X3Jlc2l6ZSh2b2lkICpwLCBpbnQgbmV3Y291bnQpCit7CisJdm9pZCAqbmV3bGlzdDsKKwkvKiBub3RlOiBpZiBuZXcgYWxsb2MgZmFpbHMsIG9sZCBwIHdpbGwgc3RpbGwgYmUgdmFsaWQgZWl0aGVyIHdheSAqLworCWlmIChpc192bWFsbG9jX2FkZHIocCkpIHsKKwkJbmV3bGlzdCA9IHZtYWxsb2MobmV3Y291bnQgKiBzaXplb2YocGlkX3QpKTsKKwkJaWYgKCFuZXdsaXN0KQorCQkJcmV0dXJuIE5VTEw7CisJCW1lbWNweShuZXdsaXN0LCBwLCBuZXdjb3VudCAqIHNpemVvZihwaWRfdCkpOworCQl2ZnJlZShwKTsKKwl9IGVsc2UgeworCQluZXdsaXN0ID0ga3JlYWxsb2MocCwgbmV3Y291bnQgKiBzaXplb2YocGlkX3QpLCBHRlBfS0VSTkVMKTsKKwl9CisJcmV0dXJuIG5ld2xpc3Q7Cit9CisKKy8qCisgKiBwaWRsaXN0X3VuaXEgLSBnaXZlbiBhIGttYWxsb2MoKWVkIGxpc3QsIHN0cmlwIG91dCBhbGwgZHVwbGljYXRlIGVudHJpZXMKKyAqIElmIHRoZSBuZXcgc3RyaXBwZWQgbGlzdCBpcyBzdWZmaWNpZW50bHkgc21hbGxlciBhbmQgdGhlcmUncyBlbm91Z2ggbWVtb3J5CisgKiB0byBhbGxvY2F0ZSBhIG5ldyBidWZmZXIsIHdpbGwgbGV0IGdvIG9mIHRoZSB1bm5lZWRlZCBtZW1vcnkuIFJldHVybnMgdGhlCisgKiBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzLgorICovCisvKiBpcyB0aGUgc2l6ZSBkaWZmZXJlbmNlIGVub3VnaCB0aGF0IHdlIHNob3VsZCByZS1hbGxvY2F0ZSB0aGUgYXJyYXk/ICovCisjZGVmaW5lIFBJRExJU1RfUkVBTExPQ19ESUZGRVJFTkNFKG9sZCwgbmV3KSAoKG9sZCkgLSBQQUdFX1NJWkUgPj0gKG5ldykpCitzdGF0aWMgaW50IHBpZGxpc3RfdW5pcShwaWRfdCAqKnAsIGludCBsZW5ndGgpCit7CisJaW50IHNyYywgZGVzdCA9IDE7CisJcGlkX3QgKmxpc3QgPSAqcDsKKwlwaWRfdCAqbmV3bGlzdDsKKworCS8qCisJICogd2UgcHJlc3VtZSB0aGUgMHRoIGVsZW1lbnQgaXMgdW5pcXVlLCBzbyBpIHN0YXJ0cyBhdCAxLiB0cml2aWFsCisJICogZWRnZSBjYXNlcyBmaXJzdDsgbm8gd29yayBuZWVkcyB0byBiZSBkb25lIGZvciBlaXRoZXIKKwkgKi8KKwlpZiAobGVuZ3RoID09IDAgfHwgbGVuZ3RoID09IDEpCisJCXJldHVybiBsZW5ndGg7CisJLyogc3JjIGFuZCBkZXN0IHdhbGsgZG93biB0aGUgbGlzdDsgZGVzdCBjb3VudHMgdW5pcXVlIGVsZW1lbnRzICovCisJZm9yIChzcmMgPSAxOyBzcmMgPCBsZW5ndGg7IHNyYysrKSB7CisJCS8qIGZpbmQgbmV4dCB1bmlxdWUgZWxlbWVudCAqLworCQl3aGlsZSAobGlzdFtzcmNdID09IGxpc3Rbc3JjLTFdKSB7CisJCQlzcmMrKzsKKwkJCWlmIChzcmMgPT0gbGVuZ3RoKQorCQkJCWdvdG8gYWZ0ZXI7CisJCX0KKwkJLyogZGVzdCBhbHdheXMgcG9pbnRzIHRvIHdoZXJlIHRoZSBuZXh0IHVuaXF1ZSBlbGVtZW50IGdvZXMgKi8KKwkJbGlzdFtkZXN0XSA9IGxpc3Rbc3JjXTsKKwkJZGVzdCsrOworCX0KK2FmdGVyOgorCS8qCisJICogaWYgdGhlIGxlbmd0aCBkaWZmZXJlbmNlIGlzIGxhcmdlIGVub3VnaCwgd2Ugd2FudCB0byBhbGxvY2F0ZSBhCisJICogc21hbGxlciBidWZmZXIgdG8gc2F2ZSBtZW1vcnkuIGlmIHRoaXMgZmFpbHMgZHVlIHRvIG91dCBvZiBtZW1vcnksCisJICogd2UnbGwganVzdCBzdGF5IHdpdGggd2hhdCB3ZSd2ZSBnb3QuCisJICovCisJaWYgKFBJRExJU1RfUkVBTExPQ19ESUZGRVJFTkNFKGxlbmd0aCwgZGVzdCkpIHsKKwkJbmV3bGlzdCA9IHBpZGxpc3RfcmVzaXplKGxpc3QsIGRlc3QpOworCQlpZiAobmV3bGlzdCkKKwkJCSpwID0gbmV3bGlzdDsKKwl9CisJcmV0dXJuIGRlc3Q7Cit9CisKK3N0YXRpYyBpbnQgY21wcGlkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuICoocGlkX3QgKilhIC0gKihwaWRfdCAqKWI7Cit9CisKKy8qCisgKiBmaW5kIHRoZSBhcHByb3ByaWF0ZSBwaWRsaXN0IGZvciBvdXIgcHVycG9zZSAoZ2l2ZW4gcHJvY3MgdnMgdGFza3MpCisgKiByZXR1cm5zIHdpdGggdGhlIGxvY2sgb24gdGhhdCBwaWRsaXN0IGFscmVhZHkgaGVsZCwgYW5kIHRha2VzIGNhcmUKKyAqIG9mIHRoZSB1c2UgY291bnQsIG9yIHJldHVybnMgTlVMTCB3aXRoIG5vIGxvY2tzIGhlbGQgaWYgd2UncmUgb3V0IG9mCisgKiBtZW1vcnkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2dyb3VwX3BpZGxpc3QgKmNncm91cF9waWRsaXN0X2ZpbmQoc3RydWN0IGNncm91cCAqY2dycCwKKwkJCQkJCSAgZW51bSBjZ3JvdXBfZmlsZXR5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgY2dyb3VwX3BpZGxpc3QgKmw7CisJLyogZG9uJ3QgbmVlZCB0YXNrX25zcHJveHkoKSBpZiB3ZSdyZSBsb29raW5nIGF0IG91cnNlbGYgKi8KKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMgPSBnZXRfcGlkX25zKGN1cnJlbnQtPm5zcHJveHktPnBpZF9ucyk7CisJLyoKKwkgKiBXZSBjYW4ndCBkcm9wIHRoZSBwaWRsaXN0X211dGV4IGJlZm9yZSB0YWtpbmcgdGhlIGwtPm11dGV4IGluIGNhc2UKKwkgKiB0aGUgbGFzdCByZWYtaG9sZGVyIGlzIHRyeWluZyB0byByZW1vdmUgbCBmcm9tIHRoZSBsaXN0IGF0IHRoZSBzYW1lCisJICogdGltZS4gSG9sZGluZyB0aGUgcGlkbGlzdF9tdXRleCBwcmVjbHVkZXMgc29tZWJvZHkgdGFraW5nIHdoaWNoZXZlcgorCSAqIGxpc3Qgd2UgZmluZCBvdXQgZnJvbSB1bmRlciB1cyAtIGNvbXBhcmUgcmVsZWFzZV9waWRfYXJyYXkoKS4KKwkgKi8KKwltdXRleF9sb2NrKCZjZ3JwLT5waWRsaXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGwsICZjZ3JwLT5waWRsaXN0cywgbGlua3MpIHsKKwkJaWYgKGwtPmtleS50eXBlID09IHR5cGUgJiYgbC0+a2V5Lm5zID09IG5zKSB7CisJCQkvKiBmb3VuZCBhIG1hdGNoaW5nIGxpc3QgLSBkcm9wIHRoZSBleHRyYSByZWZjb3VudCAqLworCQkJcHV0X3BpZF9ucyhucyk7CisJCQkvKiBtYWtlIHN1cmUgbCBkb2Vzbid0IHZhbmlzaCBvdXQgZnJvbSB1bmRlciB1cyAqLworCQkJZG93bl93cml0ZSgmbC0+bXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZjZ3JwLT5waWRsaXN0X211dGV4KTsKKwkJCWwtPnVzZV9jb3VudCsrOworCQkJcmV0dXJuIGw7CisJCX0KKwl9CisJLyogZW50cnkgbm90IGZvdW5kOyBjcmVhdGUgYSBuZXcgb25lICovCisJbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjZ3JvdXBfcGlkbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghbCkgeworCQltdXRleF91bmxvY2soJmNncnAtPnBpZGxpc3RfbXV0ZXgpOworCQlwdXRfcGlkX25zKG5zKTsKKwkJcmV0dXJuIGw7CisJfQorCWluaXRfcndzZW0oJmwtPm11dGV4KTsKKwlkb3duX3dyaXRlKCZsLT5tdXRleCk7CisJbC0+a2V5LnR5cGUgPSB0eXBlOworCWwtPmtleS5ucyA9IG5zOworCWwtPnVzZV9jb3VudCA9IDA7IC8qIGRvbid0IGluY3JlbWVudCBoZXJlICovCisJbC0+bGlzdCA9IE5VTEw7CisJbC0+b3duZXIgPSBjZ3JwOworCWxpc3RfYWRkKCZsLT5saW5rcywgJmNncnAtPnBpZGxpc3RzKTsKKwltdXRleF91bmxvY2soJmNncnAtPnBpZGxpc3RfbXV0ZXgpOworCXJldHVybiBsOworfQorCisvKgorICogTG9hZCBhIGNncm91cCdzIHBpZGFycmF5IHdpdGggZWl0aGVyIHByb2NzJyB0Z2lkcyBvciB0YXNrcycgcGlkcworICovCitzdGF0aWMgaW50IHBpZGxpc3RfYXJyYXlfbG9hZChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBlbnVtIGNncm91cF9maWxldHlwZSB0eXBlLAorCQkJICAgICAgc3RydWN0IGNncm91cF9waWRsaXN0ICoqbHApCit7CisJcGlkX3QgKmFycmF5OworCWludCBsZW5ndGg7CisJaW50IHBpZCwgbiA9IDA7IC8qIHVzZWQgZm9yIHBvcHVsYXRpbmcgdGhlIGFycmF5ICovCiAJc3RydWN0IGNncm91cF9pdGVyIGl0OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCXN0cnVjdCBjZ3JvdXBfcGlkbGlzdCAqbDsKKworCS8qCisJICogSWYgY2dyb3VwIGdldHMgbW9yZSB1c2VycyBhZnRlciB3ZSByZWFkIGNvdW50LCB3ZSB3b24ndCBoYXZlCisJICogZW5vdWdoIHNwYWNlIC0gdG91Z2guICBUaGlzIHJhY2UgaXMgaW5kaXN0aW5ndWlzaGFibGUgdG8gdGhlCisJICogY2FsbGVyIGZyb20gdGhlIGNhc2UgdGhhdCB0aGUgYWRkaXRpb25hbCBjZ3JvdXAgdXNlcnMgZGlkbid0CisJICogc2hvdyB1cCB1bnRpbCBzb21ldGltZSBsYXRlciBvbi4KKwkgKi8KKwlsZW5ndGggPSBjZ3JvdXBfdGFza19jb3VudChjZ3JwKTsKKwlhcnJheSA9IHBpZGxpc3RfYWxsb2NhdGUobGVuZ3RoKTsKKwlpZiAoIWFycmF5KQorCQlyZXR1cm4gLUVOT01FTTsKKwkvKiBub3csIHBvcHVsYXRlIHRoZSBhcnJheSAqLwogCWNncm91cF9pdGVyX3N0YXJ0KGNncnAsICZpdCk7CiAJd2hpbGUgKCh0c2sgPSBjZ3JvdXBfaXRlcl9uZXh0KGNncnAsICZpdCkpKSB7Ci0JCWlmICh1bmxpa2VseShuID09IG5waWRzKSkKKwkJaWYgKHVubGlrZWx5KG4gPT0gbGVuZ3RoKSkKIAkJCWJyZWFrOwotCQlwaWQgPSB0YXNrX3BpZF92bnIodHNrKTsKLQkJaWYgKHBpZCA+IDApCi0JCQlwaWRhcnJheVtuKytdID0gcGlkOworCQkvKiBnZXQgdGdpZCBvciBwaWQgZm9yIHByb2NzIG9yIHRhc2tzIGZpbGUgcmVzcGVjdGl2ZWx5ICovCisJCWlmICh0eXBlID09IENHUk9VUF9GSUxFX1BST0NTKQorCQkJcGlkID0gdGFza190Z2lkX3Zucih0c2spOworCQllbHNlCisJCQlwaWQgPSB0YXNrX3BpZF92bnIodHNrKTsKKwkJaWYgKHBpZCA+IDApIC8qIG1ha2Ugc3VyZSB0byBvbmx5IHVzZSB2YWxpZCByZXN1bHRzICovCisJCQlhcnJheVtuKytdID0gcGlkOwogCX0KIAljZ3JvdXBfaXRlcl9lbmQoY2dycCwgJml0KTsKLQlyZXR1cm4gbjsKKwlsZW5ndGggPSBuOworCS8qIG5vdyBzb3J0ICYgKGlmIHByb2NzKSBzdHJpcCBvdXQgZHVwbGljYXRlcyAqLworCXNvcnQoYXJyYXksIGxlbmd0aCwgc2l6ZW9mKHBpZF90KSwgY21wcGlkLCBOVUxMKTsKKwlpZiAodHlwZSA9PSBDR1JPVVBfRklMRV9QUk9DUykKKwkJbGVuZ3RoID0gcGlkbGlzdF91bmlxKCZhcnJheSwgbGVuZ3RoKTsKKwlsID0gY2dyb3VwX3BpZGxpc3RfZmluZChjZ3JwLCB0eXBlKTsKKwlpZiAoIWwpIHsKKwkJcGlkbGlzdF9mcmVlKGFycmF5KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIHN0b3JlIGFycmF5LCBmcmVlaW5nIG9sZCBpZiBuZWNlc3NhcnkgLSBsb2NrIGFscmVhZHkgaGVsZCAqLworCXBpZGxpc3RfZnJlZShsLT5saXN0KTsKKwlsLT5saXN0ID0gYXJyYXk7CisJbC0+bGVuZ3RoID0gbGVuZ3RoOworCWwtPnVzZV9jb3VudCsrOworCXVwX3dyaXRlKCZsLT5tdXRleCk7CisJKmxwID0gbDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0yMjE2LDM3ICsyNjAyLDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIENhY2hlIHBpZHMgZm9yIGFsbCB0aHJlYWRzIGluIHRoZSBzYW1lIHBpZCBuYW1lc3BhY2UgdGhhdCBhcmUKLSAqIG9wZW5pbmcgdGhlIHNhbWUgInRhc2tzIiBmaWxlLgotICovCi1zdHJ1Y3QgY2dyb3VwX3BpZHMgewotCS8qIFRoZSBub2RlIGluIGNncnAtPnBpZHNfbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQkvKiBUaGUgY2dyb3VwIHRob3NlIHBpZHMgYmVsb25nIHRvICovCi0Jc3RydWN0IGNncm91cCAqY2dycDsKLQkvKiBUaGUgbmFtZXBzYWNlIHRob3NlIHBpZHMgYmVsb25nIHRvICovCi0Jc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zOwotCS8qIEFycmF5IG9mIHByb2Nlc3MgaWRzIGluIHRoZSBjZ3JvdXAgKi8KLQlwaWRfdCAqdGFza3NfcGlkczsKLQkvKiBIb3cgbWFueSBmaWxlcyBhcmUgdXNpbmcgdGhlIHRoaXMgdGFza3NfcGlkcyBhcnJheSAqLwotCWludCB1c2VfY291bnQ7Ci0JLyogTGVuZ3RoIG9mIHRoZSBjdXJyZW50IHRhc2tzX3BpZHMgYXJyYXkgKi8KLQlpbnQgbGVuZ3RoOwotfTsKLQotc3RhdGljIGludCBjbXBwaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLQlyZXR1cm4gKihwaWRfdCAqKWEgLSAqKHBpZF90ICopYjsKLX0KIAogLyoKLSAqIHNlcV9maWxlIG1ldGhvZHMgZm9yIHRoZSAidGFza3MiIGZpbGUuIFRoZSBzZXFfZmlsZSBwb3NpdGlvbiBpcyB0aGUKKyAqIHNlcV9maWxlIG1ldGhvZHMgZm9yIHRoZSB0YXNrcy9wcm9jcyBmaWxlcy4gVGhlIHNlcV9maWxlIHBvc2l0aW9uIGlzIHRoZQogICogbmV4dCBwaWQgdG8gZGlzcGxheTsgdGhlIHNlcV9maWxlIGl0ZXJhdG9yIGlzIGEgcG9pbnRlciB0byB0aGUgcGlkCi0gKiBpbiB0aGUgY2dyb3VwLT50YXNrc19waWRzIGFycmF5LgorICogaW4gdGhlIGNncm91cC0+bC0+bGlzdCBhcnJheS4KICAqLwogCi1zdGF0aWMgdm9pZCAqY2dyb3VwX3Rhc2tzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqY2dyb3VwX3BpZGxpc3Rfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKIHsKIAkvKgogCSAqIEluaXRpYWxseSB3ZSByZWNlaXZlIGEgcG9zaXRpb24gdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0bwpAQCAtMjI1NCw0OCArMjYxNyw0NSBAQAogCSAqIGFmdGVyIGEgc2VlayB0byB0aGUgc3RhcnQpLiBVc2UgYSBiaW5hcnktc2VhcmNoIHRvIGZpbmQgdGhlCiAJICogbmV4dCBwaWQgdG8gZGlzcGxheSwgaWYgYW55CiAJICovCi0Jc3RydWN0IGNncm91cF9waWRzICpjcCA9IHMtPnByaXZhdGU7Ci0Jc3RydWN0IGNncm91cCAqY2dycCA9IGNwLT5jZ3JwOworCXN0cnVjdCBjZ3JvdXBfcGlkbGlzdCAqbCA9IHMtPnByaXZhdGU7CiAJaW50IGluZGV4ID0gMCwgcGlkID0gKnBvczsKIAlpbnQgKml0ZXI7CiAKLQlkb3duX3JlYWQoJmNncnAtPnBpZHNfbXV0ZXgpOworCWRvd25fcmVhZCgmbC0+bXV0ZXgpOwogCWlmIChwaWQpIHsKLQkJaW50IGVuZCA9IGNwLT5sZW5ndGg7CisJCWludCBlbmQgPSBsLT5sZW5ndGg7CiAKIAkJd2hpbGUgKGluZGV4IDwgZW5kKSB7CiAJCQlpbnQgbWlkID0gKGluZGV4ICsgZW5kKSAvIDI7Ci0JCQlpZiAoY3AtPnRhc2tzX3BpZHNbbWlkXSA9PSBwaWQpIHsKKwkJCWlmIChsLT5saXN0W21pZF0gPT0gcGlkKSB7CiAJCQkJaW5kZXggPSBtaWQ7CiAJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKGNwLT50YXNrc19waWRzW21pZF0gPD0gcGlkKQorCQkJfSBlbHNlIGlmIChsLT5saXN0W21pZF0gPD0gcGlkKQogCQkJCWluZGV4ID0gbWlkICsgMTsKIAkJCWVsc2UKIAkJCQllbmQgPSBtaWQ7CiAJCX0KIAl9CiAJLyogSWYgd2UncmUgb2ZmIHRoZSBlbmQgb2YgdGhlIGFycmF5LCB3ZSdyZSBkb25lICovCi0JaWYgKGluZGV4ID49IGNwLT5sZW5ndGgpCisJaWYgKGluZGV4ID49IGwtPmxlbmd0aCkKIAkJcmV0dXJuIE5VTEw7CiAJLyogVXBkYXRlIHRoZSBhYnN0cmFjdCBwb3NpdGlvbiB0byBiZSB0aGUgYWN0dWFsIHBpZCB0aGF0IHdlIGZvdW5kICovCi0JaXRlciA9IGNwLT50YXNrc19waWRzICsgaW5kZXg7CisJaXRlciA9IGwtPmxpc3QgKyBpbmRleDsKIAkqcG9zID0gKml0ZXI7CiAJcmV0dXJuIGl0ZXI7CiB9CiAKLXN0YXRpYyB2b2lkIGNncm91cF90YXNrc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3N0YXRpYyB2b2lkIGNncm91cF9waWRsaXN0X3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQogewotCXN0cnVjdCBjZ3JvdXBfcGlkcyAqY3AgPSBzLT5wcml2YXRlOwotCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjcC0+Y2dycDsKLQl1cF9yZWFkKCZjZ3JwLT5waWRzX211dGV4KTsKKwlzdHJ1Y3QgY2dyb3VwX3BpZGxpc3QgKmwgPSBzLT5wcml2YXRlOworCXVwX3JlYWQoJmwtPm11dGV4KTsKIH0KIAotc3RhdGljIHZvaWQgKmNncm91cF90YXNrc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqY2dyb3VwX3BpZGxpc3RfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBjZ3JvdXBfcGlkcyAqY3AgPSBzLT5wcml2YXRlOwotCWludCAqcCA9IHY7Ci0JaW50ICplbmQgPSBjcC0+dGFza3NfcGlkcyArIGNwLT5sZW5ndGg7Ci0KKwlzdHJ1Y3QgY2dyb3VwX3BpZGxpc3QgKmwgPSBzLT5wcml2YXRlOworCXBpZF90ICpwID0gdjsKKwlwaWRfdCAqZW5kID0gbC0+bGlzdCArIGwtPmxlbmd0aDsKIAkvKgogCSAqIEFkdmFuY2UgdG8gdGhlIG5leHQgcGlkIGluIHRoZSBhcnJheS4gSWYgdGhpcyBnb2VzIG9mZiB0aGUKIAkgKiBlbmQsIHdlJ3JlIGRvbmUKQEAgLTIzMDksMTI0ICsyNjY5LDEwNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBjZ3JvdXBfdGFza3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCitzdGF0aWMgaW50IGNncm91cF9waWRsaXN0X3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQogewogCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZFxuIiwgKihpbnQgKil2KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjZ3JvdXBfdGFza3Nfc2VxX29wZXJhdGlvbnMgPSB7Ci0JLnN0YXJ0ID0gY2dyb3VwX3Rhc2tzX3N0YXJ0LAotCS5zdG9wID0gY2dyb3VwX3Rhc2tzX3N0b3AsCi0JLm5leHQgPSBjZ3JvdXBfdGFza3NfbmV4dCwKLQkuc2hvdyA9IGNncm91cF90YXNrc19zaG93LAorLyoKKyAqIHNlcV9vcGVyYXRpb25zIGZ1bmN0aW9ucyBmb3IgaXRlcmF0aW5nIG9uIHBpZGxpc3RzIHRocm91Z2ggc2VxX2ZpbGUgLQorICogaW5kZXBlbmRlbnQgb2Ygd2hldGhlciBpdCdzIHRhc2tzIG9yIHByb2NzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY2dyb3VwX3BpZGxpc3Rfc2VxX29wZXJhdGlvbnMgPSB7CisJLnN0YXJ0ID0gY2dyb3VwX3BpZGxpc3Rfc3RhcnQsCisJLnN0b3AgPSBjZ3JvdXBfcGlkbGlzdF9zdG9wLAorCS5uZXh0ID0gY2dyb3VwX3BpZGxpc3RfbmV4dCwKKwkuc2hvdyA9IGNncm91cF9waWRsaXN0X3Nob3csCiB9OwogCi1zdGF0aWMgdm9pZCByZWxlYXNlX2Nncm91cF9waWRfYXJyYXkoc3RydWN0IGNncm91cF9waWRzICpjcCkKK3N0YXRpYyB2b2lkIGNncm91cF9yZWxlYXNlX3BpZF9hcnJheShzdHJ1Y3QgY2dyb3VwX3BpZGxpc3QgKmwpCiB7Ci0Jc3RydWN0IGNncm91cCAqY2dycCA9IGNwLT5jZ3JwOwotCi0JZG93bl93cml0ZSgmY2dycC0+cGlkc19tdXRleCk7Ci0JQlVHX09OKCFjcC0+dXNlX2NvdW50KTsKLQlpZiAoIS0tY3AtPnVzZV9jb3VudCkgewotCQlsaXN0X2RlbCgmY3AtPmxpc3QpOwotCQlwdXRfcGlkX25zKGNwLT5ucyk7Ci0JCWtmcmVlKGNwLT50YXNrc19waWRzKTsKLQkJa2ZyZWUoY3ApOworCS8qCisJICogdGhlIGNhc2Ugd2hlcmUgd2UncmUgdGhlIGxhc3QgdXNlciBvZiB0aGlzIHBhcnRpY3VsYXIgcGlkbGlzdCB3aWxsCisJICogaGF2ZSB1cyByZW1vdmUgaXQgZnJvbSB0aGUgY2dyb3VwJ3MgbGlzdCwgd2hpY2ggZW50YWlscyB0YWtpbmcgdGhlCisJICogbXV0ZXguIHNpbmNlIGluIHBpZGxpc3RfZmluZCB0aGUgcGlkbGlzdC0+bG9jayBkZXBlbmRzIG9uIGNncm91cC0+CisJICogcGlkbGlzdF9tdXRleCwgd2UgaGF2ZSB0byB0YWtlIHBpZGxpc3RfbXV0ZXggZmlyc3QuCisJICovCisJbXV0ZXhfbG9jaygmbC0+b3duZXItPnBpZGxpc3RfbXV0ZXgpOworCWRvd25fd3JpdGUoJmwtPm11dGV4KTsKKwlCVUdfT04oIWwtPnVzZV9jb3VudCk7CisJaWYgKCEtLWwtPnVzZV9jb3VudCkgeworCQkvKiB3ZSdyZSB0aGUgbGFzdCB1c2VyIGlmIHJlZmNvdW50IGlzIDA7IHJlbW92ZSBhbmQgZnJlZSAqLworCQlsaXN0X2RlbCgmbC0+bGlua3MpOworCQltdXRleF91bmxvY2soJmwtPm93bmVyLT5waWRsaXN0X211dGV4KTsKKwkJcGlkbGlzdF9mcmVlKGwtPmxpc3QpOworCQlwdXRfcGlkX25zKGwtPmtleS5ucyk7CisJCXVwX3dyaXRlKCZsLT5tdXRleCk7CisJCWtmcmVlKGwpOworCQlyZXR1cm47CiAJfQotCXVwX3dyaXRlKCZjZ3JwLT5waWRzX211dGV4KTsKKwltdXRleF91bmxvY2soJmwtPm93bmVyLT5waWRsaXN0X211dGV4KTsKKwl1cF93cml0ZSgmbC0+bXV0ZXgpOwogfQogCi1zdGF0aWMgaW50IGNncm91cF90YXNrc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBjZ3JvdXBfcGlkbGlzdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBzZXFfZmlsZSAqc2VxOwotCXN0cnVjdCBjZ3JvdXBfcGlkcyAqY3A7Ci0KKwlzdHJ1Y3QgY2dyb3VwX3BpZGxpc3QgKmw7CiAJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCiAJCXJldHVybiAwOwotCi0Jc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNwID0gc2VxLT5wcml2YXRlOwotCi0JcmVsZWFzZV9jZ3JvdXBfcGlkX2FycmF5KGNwKTsKKwkvKgorCSAqIHRoZSBzZXFfZmlsZSB3aWxsIG9ubHkgYmUgaW5pdGlhbGl6ZWQgaWYgdGhlIGZpbGUgd2FzIG9wZW5lZCBmb3IKKwkgKiByZWFkaW5nOyBoZW5jZSB3ZSBjaGVjayBpZiBpdCdzIG5vdCBudWxsIG9ubHkgaW4gdGhhdCBjYXNlLgorCSAqLworCWwgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPnByaXZhdGU7CisJY2dyb3VwX3JlbGVhc2VfcGlkX2FycmF5KGwpOwogCXJldHVybiBzZXFfcmVsZWFzZShpbm9kZSwgZmlsZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNncm91cF90YXNrc19vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2dyb3VwX3BpZGxpc3Rfb3BlcmF0aW9ucyA9IHsKIAkucmVhZCA9IHNlcV9yZWFkLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCiAJLndyaXRlID0gY2dyb3VwX2ZpbGVfd3JpdGUsCi0JLnJlbGVhc2UgPSBjZ3JvdXBfdGFza3NfcmVsZWFzZSwKKwkucmVsZWFzZSA9IGNncm91cF9waWRsaXN0X3JlbGVhc2UsCiB9OwogCiAvKgotICogSGFuZGxlIGFuIG9wZW4gb24gJ3Rhc2tzJyBmaWxlLiAgUHJlcGFyZSBhbiBhcnJheSBjb250YWluaW5nIHRoZQotICogcHJvY2VzcyBpZCdzIG9mIHRhc2tzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgY2dyb3VwIGJlaW5nIG9wZW5lZC4KKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGhhbmRsZSBvcGVucyBvbiBhIGZpbGUgdGhhdCBkaXNwbGF5cyBhIHBpZGxpc3QKKyAqICh0YXNrcyBvciBwcm9jcykuIFByZXBhcmUgYW4gYXJyYXkgb2YgdGhlIHByb2Nlc3MvdGhyZWFkIElEcyBvZiB3aG9ldmVyJ3MKKyAqIGluIHRoZSBjZ3JvdXAuCiAgKi8KLQotc3RhdGljIGludCBjZ3JvdXBfdGFza3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKnVudXNlZCwgc3RydWN0IGZpbGUgKmZpbGUpCisvKiBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSB0d28gYmVsb3cgaXQgKi8KK3N0YXRpYyBpbnQgY2dyb3VwX3BpZGxpc3Rfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgZW51bSBjZ3JvdXBfZmlsZXR5cGUgdHlwZSkKIHsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gX19kX2NncnAoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKLQlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnM7Ci0Jc3RydWN0IGNncm91cF9waWRzICpjcDsKLQlwaWRfdCAqcGlkYXJyYXk7Ci0JaW50IG5waWRzOworCXN0cnVjdCBjZ3JvdXBfcGlkbGlzdCAqbDsKIAlpbnQgcmV0dmFsOwogCiAJLyogTm90aGluZyB0byBkbyBmb3Igd3JpdGUtb25seSBmaWxlcyAqLwogCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQogCQlyZXR1cm4gMDsKIAotCS8qCi0JICogSWYgY2dyb3VwIGdldHMgbW9yZSB1c2VycyBhZnRlciB3ZSByZWFkIGNvdW50LCB3ZSB3b24ndCBoYXZlCi0JICogZW5vdWdoIHNwYWNlIC0gdG91Z2guICBUaGlzIHJhY2UgaXMgaW5kaXN0aW5ndWlzaGFibGUgdG8gdGhlCi0JICogY2FsbGVyIGZyb20gdGhlIGNhc2UgdGhhdCB0aGUgYWRkaXRpb25hbCBjZ3JvdXAgdXNlcnMgZGlkbid0Ci0JICogc2hvdyB1cCB1bnRpbCBzb21ldGltZSBsYXRlciBvbi4KLQkgKi8KLQlucGlkcyA9IGNncm91cF90YXNrX2NvdW50KGNncnApOwotCXBpZGFycmF5ID0ga21hbGxvYyhucGlkcyAqIHNpemVvZihwaWRfdCksIEdGUF9LRVJORUwpOwotCWlmICghcGlkYXJyYXkpCi0JCXJldHVybiAtRU5PTUVNOwotCW5waWRzID0gcGlkX2FycmF5X2xvYWQocGlkYXJyYXksIG5waWRzLCBjZ3JwKTsKLQlzb3J0KHBpZGFycmF5LCBucGlkcywgc2l6ZW9mKHBpZF90KSwgY21wcGlkLCBOVUxMKTsKKwkvKiBoYXZlIHRoZSBhcnJheSBwb3B1bGF0ZWQgKi8KKwlyZXR2YWwgPSBwaWRsaXN0X2FycmF5X2xvYWQoY2dycCwgdHlwZSwgJmwpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJLyogY29uZmlndXJlIGZpbGUgaW5mb3JtYXRpb24gKi8KKwlmaWxlLT5mX29wID0gJmNncm91cF9waWRsaXN0X29wZXJhdGlvbnM7CiAKLQkvKgotCSAqIFN0b3JlIHRoZSBhcnJheSBpbiB0aGUgY2dyb3VwLCBmcmVlaW5nIHRoZSBvbGQKLQkgKiBhcnJheSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlkb3duX3dyaXRlKCZjZ3JwLT5waWRzX211dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZjZ3JwLT5waWRzX2xpc3QsIGxpc3QpIHsKLQkJaWYgKG5zID09IGNwLT5ucykKLQkJCWdvdG8gZm91bmQ7Ci0JfQotCi0JY3AgPSBremFsbG9jKHNpemVvZigqY3ApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNwKSB7Ci0JCXVwX3dyaXRlKCZjZ3JwLT5waWRzX211dGV4KTsKLQkJa2ZyZWUocGlkYXJyYXkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JY3AtPmNncnAgPSBjZ3JwOwotCWNwLT5ucyA9IG5zOwotCWdldF9waWRfbnMobnMpOwotCWxpc3RfYWRkKCZjcC0+bGlzdCwgJmNncnAtPnBpZHNfbGlzdCk7Ci1mb3VuZDoKLQlrZnJlZShjcC0+dGFza3NfcGlkcyk7Ci0JY3AtPnRhc2tzX3BpZHMgPSBwaWRhcnJheTsKLQljcC0+bGVuZ3RoID0gbnBpZHM7Ci0JY3AtPnVzZV9jb3VudCsrOwotCXVwX3dyaXRlKCZjZ3JwLT5waWRzX211dGV4KTsKLQotCWZpbGUtPmZfb3AgPSAmY2dyb3VwX3Rhc2tzX29wZXJhdGlvbnM7Ci0KLQlyZXR2YWwgPSBzZXFfb3BlbihmaWxlLCAmY2dyb3VwX3Rhc2tzX3NlcV9vcGVyYXRpb25zKTsKKwlyZXR2YWwgPSBzZXFfb3BlbihmaWxlLCAmY2dyb3VwX3BpZGxpc3Rfc2VxX29wZXJhdGlvbnMpOwogCWlmIChyZXR2YWwpIHsKLQkJcmVsZWFzZV9jZ3JvdXBfcGlkX2FycmF5KGNwKTsKKwkJY2dyb3VwX3JlbGVhc2VfcGlkX2FycmF5KGwpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQkoKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPnByaXZhdGUgPSBjcDsKKwkoKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPnByaXZhdGUgPSBsOwogCXJldHVybiAwOwogfQorc3RhdGljIGludCBjZ3JvdXBfdGFza3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKnVudXNlZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGNncm91cF9waWRsaXN0X29wZW4oZmlsZSwgQ0dST1VQX0ZJTEVfVEFTS1MpOworfQorc3RhdGljIGludCBjZ3JvdXBfcHJvY3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKnVudXNlZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGNncm91cF9waWRsaXN0X29wZW4oZmlsZSwgQ0dST1VQX0ZJTEVfUFJPQ1MpOworfQogCiBzdGF0aWMgdTY0IGNncm91cF9yZWFkX25vdGlmeV9vbl9yZWxlYXNlKHN0cnVjdCBjZ3JvdXAgKmNncnAsCiAJCQkJCSAgICBzdHJ1Y3QgY2Z0eXBlICpjZnQpCkBAIC0yNDQ5LDIxICsyNzkyLDI3IEBACiAvKgogICogZm9yIHRoZSBjb21tb24gZnVuY3Rpb25zLCAncHJpdmF0ZScgZ2l2ZXMgdGhlIHR5cGUgb2YgZmlsZQogICovCisvKiBmb3IgaHlzdGVyaWNhbCByYWlzaW5zLCB3ZSBjYW4ndCBwdXQgdGhpcyBvbiB0aGUgb2xkZXIgZmlsZXMgKi8KKyNkZWZpbmUgQ0dST1VQX0ZJTEVfR0VORVJJQ19QUkVGSVggImNncm91cC4iCiBzdGF0aWMgc3RydWN0IGNmdHlwZSBmaWxlc1tdID0gewogCXsKIAkJLm5hbWUgPSAidGFza3MiLAogCQkub3BlbiA9IGNncm91cF90YXNrc19vcGVuLAogCQkud3JpdGVfdTY0ID0gY2dyb3VwX3Rhc2tzX3dyaXRlLAotCQkucmVsZWFzZSA9IGNncm91cF90YXNrc19yZWxlYXNlLAotCQkucHJpdmF0ZSA9IEZJTEVfVEFTS0xJU1QsCisJCS5yZWxlYXNlID0gY2dyb3VwX3BpZGxpc3RfcmVsZWFzZSwKIAkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKIAl9LAotCisJeworCQkubmFtZSA9IENHUk9VUF9GSUxFX0dFTkVSSUNfUFJFRklYICJwcm9jcyIsCisJCS5vcGVuID0gY2dyb3VwX3Byb2NzX29wZW4sCisJCS8qIC53cml0ZV91NjQgPSBjZ3JvdXBfcHJvY3Nfd3JpdGUsIFRPRE8gKi8KKwkJLnJlbGVhc2UgPSBjZ3JvdXBfcGlkbGlzdF9yZWxlYXNlLAorCQkubW9kZSA9IFNfSVJVR08sCisJfSwKIAl7CiAJCS5uYW1lID0gIm5vdGlmeV9vbl9yZWxlYXNlIiwKIAkJLnJlYWRfdTY0ID0gY2dyb3VwX3JlYWRfbm90aWZ5X29uX3JlbGVhc2UsCiAJCS53cml0ZV91NjQgPSBjZ3JvdXBfd3JpdGVfbm90aWZ5X29uX3JlbGVhc2UsCi0JCS5wcml2YXRlID0gRklMRV9OT1RJRllfT05fUkVMRUFTRSwKIAl9LAogfTsKIApAQCAtMjQ3Miw3ICsyODIxLDYgQEAKIAkucmVhZF9zZXFfc3RyaW5nID0gY2dyb3VwX3JlbGVhc2VfYWdlbnRfc2hvdywKIAkud3JpdGVfc3RyaW5nID0gY2dyb3VwX3JlbGVhc2VfYWdlbnRfd3JpdGUsCiAJLm1heF93cml0ZV9sZW4gPSBQQVRIX01BWCwKLQkucHJpdmF0ZSA9IEZJTEVfUkVMRUFTRV9BR0VOVCwKIH07CiAKIHN0YXRpYyBpbnQgY2dyb3VwX3BvcHVsYXRlX2RpcihzdHJ1Y3QgY2dyb3VwICpjZ3JwKQpAQCAtMjg3OSw2ICszMjI3LDcgQEAKIAlpbml0X3Rhc2suY2dyb3VwcyA9ICZpbml0X2Nzc19zZXQ7CiAKIAlpbml0X2Nzc19zZXRfbGluay5jZyA9ICZpbml0X2Nzc19zZXQ7CisJaW5pdF9jc3Nfc2V0X2xpbmsuY2dycCA9IGR1bW15dG9wOwogCWxpc3RfYWRkKCZpbml0X2Nzc19zZXRfbGluay5jZ3JwX2xpbmtfbGlzdCwKIAkJICZyb290bm9kZS50b3BfY2dyb3VwLmNzc19zZXRzKTsKIAlsaXN0X2FkZCgmaW5pdF9jc3Nfc2V0X2xpbmsuY2dfbGlua19saXN0LApAQCAtMjkzMyw3ICszMjgyLDcgQEAKIAkvKiBBZGQgaW5pdF9jc3Nfc2V0IHRvIHRoZSBoYXNoIHRhYmxlICovCiAJaGhlYWQgPSBjc3Nfc2V0X2hhc2goaW5pdF9jc3Nfc2V0LnN1YnN5cyk7CiAJaGxpc3RfYWRkX2hlYWQoJmluaXRfY3NzX3NldC5obGlzdCwgaGhlYWQpOwotCisJQlVHX09OKCFpbml0X3Jvb3RfaWQoJnJvb3Rub2RlKSk7CiAJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmY2dyb3VwX2ZzX3R5cGUpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKQEAgLTI5ODYsMTUgKzMzMzUsMTYgQEAKIAlmb3JfZWFjaF9hY3RpdmVfcm9vdChyb290KSB7CiAJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzczsKIAkJc3RydWN0IGNncm91cCAqY2dycDsKLQkJaW50IHN1YnN5c19pZDsKIAkJaW50IGNvdW50ID0gMDsKIAotCQlzZXFfcHJpbnRmKG0sICIlbHU6Iiwgcm9vdC0+c3Vic3lzX2JpdHMpOworCQlzZXFfcHJpbnRmKG0sICIlZDoiLCByb290LT5oaWVyYXJjaHlfaWQpOwogCQlmb3JfZWFjaF9zdWJzeXMocm9vdCwgc3MpCiAJCQlzZXFfcHJpbnRmKG0sICIlcyVzIiwgY291bnQrKyA/ICIsIiA6ICIiLCBzcy0+bmFtZSk7CisJCWlmIChzdHJsZW4ocm9vdC0+bmFtZSkpCisJCQlzZXFfcHJpbnRmKG0sICIlc25hbWU9JXMiLCBjb3VudCA/ICIsIiA6ICIiLAorCQkJCSAgIHJvb3QtPm5hbWUpOwogCQlzZXFfcHV0YyhtLCAnOicpOwotCQlnZXRfZmlyc3Rfc3Vic3lzKCZyb290LT50b3BfY2dyb3VwLCBOVUxMLCAmc3Vic3lzX2lkKTsKLQkJY2dycCA9IHRhc2tfY2dyb3VwKHRzaywgc3Vic3lzX2lkKTsKKwkJY2dycCA9IHRhc2tfY2dyb3VwX2Zyb21fcm9vdCh0c2ssIHJvb3QpOwogCQlyZXR2YWwgPSBjZ3JvdXBfcGF0aChjZ3JwLCBidWYsIFBBR0VfU0laRSk7CiAJCWlmIChyZXR2YWwgPCAwKQogCQkJZ290byBvdXRfdW5sb2NrOwpAQCAtMzAxNyw3ICszMzY3LDcgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19jZ3JvdXBfc2hvdywgcGlkKTsKIH0KIAotc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2Nncm91cF9vcGVyYXRpb25zID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2Nncm91cF9vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IGNncm91cF9vcGVuLAogCS5yZWFkCQk9IHNlcV9yZWFkLAogCS5sbHNlZWsJCT0gc2VxX2xzZWVrLApAQCAtMzAzMyw4ICszMzgzLDggQEAKIAltdXRleF9sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBDR1JPVVBfU1VCU1lTX0NPVU5UOyBpKyspIHsKIAkJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzID0gc3Vic3lzW2ldOwotCQlzZXFfcHJpbnRmKG0sICIlc1x0JWx1XHQlZFx0JWRcbiIsCi0JCQkgICBzcy0+bmFtZSwgc3MtPnJvb3QtPnN1YnN5c19iaXRzLAorCQlzZXFfcHJpbnRmKG0sICIlc1x0JWRcdCVkXHQlZFxuIiwKKwkJCSAgIHNzLT5uYW1lLCBzcy0+cm9vdC0+aGllcmFyY2h5X2lkLAogCQkJICAgc3MtPnJvb3QtPm51bWJlcl9vZl9jZ3JvdXBzLCAhc3MtPmRpc2FibGVkKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwpAQCAtMzA0Niw3ICszMzk2LDcgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19jZ3JvdXBzdGF0c19zaG93LCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jZ3JvdXBzdGF0c19vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jZ3JvdXBzdGF0c19vcGVyYXRpb25zID0gewogCS5vcGVuID0gY2dyb3Vwc3RhdHNfb3BlbiwKIAkucmVhZCA9IHNlcV9yZWFkLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCkBAIC0zMzIwLDEzICszNjcwLDExIEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgY2dyb3VwICp0YXJnZXQ7Ci0JaW50IHN1YnN5c19pZDsKIAogCWlmIChjZ3JwID09IGR1bW15dG9wKQogCQlyZXR1cm4gMTsKIAotCWdldF9maXJzdF9zdWJzeXMoY2dycCwgTlVMTCwgJnN1YnN5c19pZCk7Ci0JdGFyZ2V0ID0gdGFza19jZ3JvdXAodGFzaywgc3Vic3lzX2lkKTsKKwl0YXJnZXQgPSB0YXNrX2Nncm91cF9mcm9tX3Jvb3QodGFzaywgY2dycC0+cm9vdCk7CiAJd2hpbGUgKGNncnAgIT0gdGFyZ2V0ICYmIGNncnAhPSBjZ3JwLT50b3BfY2dyb3VwKQogCQljZ3JwID0gY2dycC0+cGFyZW50OwogCXJldCA9IChjZ3JwID09IHRhcmdldCk7CkBAIC0zMzU4LDggKzM3MDYsMTAgQEAKIHZvaWQgX19jc3NfcHV0KHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCiB7CiAJc3RydWN0IGNncm91cCAqY2dycCA9IGNzcy0+Y2dyb3VwOworCWludCB2YWw7CiAJcmN1X3JlYWRfbG9jaygpOwotCWlmIChhdG9taWNfZGVjX3JldHVybigmY3NzLT5yZWZjbnQpID09IDEpIHsKKwl2YWwgPSBhdG9taWNfZGVjX3JldHVybigmY3NzLT5yZWZjbnQpOworCWlmICh2YWwgPT0gMSkgewogCQlpZiAobm90aWZ5X29uX3JlbGVhc2UoY2dycCkpIHsKIAkJCXNldF9iaXQoQ0dSUF9SRUxFQVNBQkxFLCAmY2dycC0+ZmxhZ3MpOwogCQkJY2hlY2tfZm9yX3JlbGVhc2UoY2dycCk7CkBAIC0zMzY3LDYgKzM3MTcsNyBAQAogCQljZ3JvdXBfd2FrZXVwX3JtZGlyX3dhaXRlcihjZ3JwKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisJV0FSTl9PTl9PTkNFKHZhbCA8IDEpOwogfQogCiAvKgpAQCAtMzY5MywzICs0MDQ0LDE1NCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ0dST1VQX0RFQlVHCitzdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmRlYnVnX2NyZWF0ZShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCisJCQkJCQkgICBzdHJ1Y3QgY2dyb3VwICpjb250KQoreworCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MgPSBremFsbG9jKHNpemVvZigqY3NzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWNzcykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZXR1cm4gY3NzOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19kZXN0cm95KHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY29udCkKK3sKKwlrZnJlZShjb250LT5zdWJzeXNbZGVidWdfc3Vic3lzX2lkXSk7Cit9CisKK3N0YXRpYyB1NjQgY2dyb3VwX3JlZmNvdW50X3JlYWQoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNmdHlwZSAqY2Z0KQoreworCXJldHVybiBhdG9taWNfcmVhZCgmY29udC0+Y291bnQpOworfQorCitzdGF0aWMgdTY0IGRlYnVnX3Rhc2tjb3VudF9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCkKK3sKKwlyZXR1cm4gY2dyb3VwX3Rhc2tfY291bnQoY29udCk7Cit9CisKK3N0YXRpYyB1NjQgY3VycmVudF9jc3Nfc2V0X3JlYWQoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNmdHlwZSAqY2Z0KQoreworCXJldHVybiAodTY0KSh1bnNpZ25lZCBsb25nKWN1cnJlbnQtPmNncm91cHM7Cit9CisKK3N0YXRpYyB1NjQgY3VycmVudF9jc3Nfc2V0X3JlZmNvdW50X3JlYWQoc3RydWN0IGNncm91cCAqY29udCwKKwkJCQkJICAgc3RydWN0IGNmdHlwZSAqY2Z0KQoreworCXU2NCBjb3VudDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwljb3VudCA9IGF0b21pY19yZWFkKCZjdXJyZW50LT5jZ3JvdXBzLT5yZWZjb3VudCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGN1cnJlbnRfY3NzX3NldF9jZ19saW5rc19yZWFkKHN0cnVjdCBjZ3JvdXAgKmNvbnQsCisJCQkJCSBzdHJ1Y3QgY2Z0eXBlICpjZnQsCisJCQkJCSBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgY2dfY2dyb3VwX2xpbmsgKmxpbms7CisJc3RydWN0IGNzc19zZXQgKmNnOworCisJcmVhZF9sb2NrKCZjc3Nfc2V0X2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKKwljZyA9IHJjdV9kZXJlZmVyZW5jZShjdXJyZW50LT5jZ3JvdXBzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZjZy0+Y2dfbGlua3MsIGNnX2xpbmtfbGlzdCkgeworCQlzdHJ1Y3QgY2dyb3VwICpjID0gbGluay0+Y2dycDsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQlpZiAoYy0+ZGVudHJ5KQorCQkJbmFtZSA9IGMtPmRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJCWVsc2UKKwkJCW5hbWUgPSAiPyI7CisJCXNlcV9wcmludGYoc2VxLCAiUm9vdCAlZCBncm91cCAlc1xuIiwKKwkJCSAgIGMtPnJvb3QtPmhpZXJhcmNoeV9pZCwgbmFtZSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJlYWRfdW5sb2NrKCZjc3Nfc2V0X2xvY2spOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9UQVNLU19TSE9XTl9QRVJfQ1NTIDI1CitzdGF0aWMgaW50IGNncm91cF9jc3NfbGlua3NfcmVhZChzdHJ1Y3QgY2dyb3VwICpjb250LAorCQkJCSBzdHJ1Y3QgY2Z0eXBlICpjZnQsCisJCQkJIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBjZ19jZ3JvdXBfbGluayAqbGluazsKKworCXJlYWRfbG9jaygmY3NzX3NldF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZjb250LT5jc3Nfc2V0cywgY2dycF9saW5rX2xpc3QpIHsKKwkJc3RydWN0IGNzc19zZXQgKmNnID0gbGluay0+Y2c7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwkJaW50IGNvdW50ID0gMDsKKwkJc2VxX3ByaW50ZihzZXEsICJjc3Nfc2V0ICVwXG4iLCBjZyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodGFzaywgJmNnLT50YXNrcywgY2dfbGlzdCkgeworCQkJaWYgKGNvdW50KysgPiBNQVhfVEFTS1NfU0hPV05fUEVSX0NTUykgeworCQkJCXNlcV9wdXRzKHNlcSwgIiAgLi4uXG4iKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgIHRhc2sgJWRcbiIsCisJCQkJCSAgIHRhc2tfcGlkX3Zucih0YXNrKSk7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmNzc19zZXRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgcmVsZWFzYWJsZV9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQ0dSUF9SRUxFQVNBQkxFLCAmY2dycC0+ZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGNmdHlwZSBkZWJ1Z19maWxlc1tdID0gIHsKKwl7CisJCS5uYW1lID0gImNncm91cF9yZWZjb3VudCIsCisJCS5yZWFkX3U2NCA9IGNncm91cF9yZWZjb3VudF9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJ0YXNrY291bnQiLAorCQkucmVhZF91NjQgPSBkZWJ1Z190YXNrY291bnRfcmVhZCwKKwl9LAorCisJeworCQkubmFtZSA9ICJjdXJyZW50X2Nzc19zZXQiLAorCQkucmVhZF91NjQgPSBjdXJyZW50X2Nzc19zZXRfcmVhZCwKKwl9LAorCisJeworCQkubmFtZSA9ICJjdXJyZW50X2Nzc19zZXRfcmVmY291bnQiLAorCQkucmVhZF91NjQgPSBjdXJyZW50X2Nzc19zZXRfcmVmY291bnRfcmVhZCwKKwl9LAorCisJeworCQkubmFtZSA9ICJjdXJyZW50X2Nzc19zZXRfY2dfbGlua3MiLAorCQkucmVhZF9zZXFfc3RyaW5nID0gY3VycmVudF9jc3Nfc2V0X2NnX2xpbmtzX3JlYWQsCisJfSwKKworCXsKKwkJLm5hbWUgPSAiY2dyb3VwX2Nzc19saW5rcyIsCisJCS5yZWFkX3NlcV9zdHJpbmcgPSBjZ3JvdXBfY3NzX2xpbmtzX3JlYWQsCisJfSwKKworCXsKKwkJLm5hbWUgPSAicmVsZWFzYWJsZSIsCisJCS5yZWFkX3U2NCA9IHJlbGVhc2FibGVfcmVhZCwKKwl9LAorfTsKKworc3RhdGljIGludCBkZWJ1Z19wb3B1bGF0ZShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNvbnQpCit7CisJcmV0dXJuIGNncm91cF9hZGRfZmlsZXMoY29udCwgc3MsIGRlYnVnX2ZpbGVzLAorCQkJCUFSUkFZX1NJWkUoZGVidWdfZmlsZXMpKTsKK30KKworc3RydWN0IGNncm91cF9zdWJzeXMgZGVidWdfc3Vic3lzID0geworCS5uYW1lID0gImRlYnVnIiwKKwkuY3JlYXRlID0gZGVidWdfY3JlYXRlLAorCS5kZXN0cm95ID0gZGVidWdfZGVzdHJveSwKKwkucG9wdWxhdGUgPSBkZWJ1Z19wb3B1bGF0ZSwKKwkuc3Vic3lzX2lkID0gZGVidWdfc3Vic3lzX2lkLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfQ0dST1VQX0RFQlVHICovCmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwX2RlYnVnLmMgYi9rZXJuZWwvY2dyb3VwX2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTJkNzkuLjAwMDAwMDAKLS0tIGEva2VybmVsL2Nncm91cF9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBrZXJuZWwvY2dyb3VwX2RlYnVnLmMgLSBFeGFtcGxlIGNncm91cCBzdWJzeXN0ZW0gdGhhdAotICogZXhwb3NlcyBkZWJ1ZyBpbmZvCi0gKgotICogQ29weXJpZ2h0IChDKSBHb29nbGUgSW5jLCAyMDA3Ci0gKgotICogRGV2ZWxvcGVkIGJ5IFBhdWwgTWVuYWdlIChtZW5hZ2VAZ29vZ2xlLmNvbSkKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqZGVidWdfY3JlYXRlKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKLQkJCQkJCSAgIHN0cnVjdCBjZ3JvdXAgKmNvbnQpCi17Ci0Jc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcyA9IGt6YWxsb2Moc2l6ZW9mKCpjc3MpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghY3NzKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCXJldHVybiBjc3M7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlYnVnX2Rlc3Ryb3koc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjb250KQotewotCWtmcmVlKGNvbnQtPnN1YnN5c1tkZWJ1Z19zdWJzeXNfaWRdKTsKLX0KLQotc3RhdGljIHU2NCBjZ3JvdXBfcmVmY291bnRfcmVhZChzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZjb250LT5jb3VudCk7Ci19Ci0KLXN0YXRpYyB1NjQgdGFza2NvdW50X3JlYWQoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNmdHlwZSAqY2Z0KQotewotCXU2NCBjb3VudDsKLQotCWNvdW50ID0gY2dyb3VwX3Rhc2tfY291bnQoY29udCk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgdTY0IGN1cnJlbnRfY3NzX3NldF9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCkKLXsKLQlyZXR1cm4gKHU2NCkobG9uZyljdXJyZW50LT5jZ3JvdXBzOwotfQotCi1zdGF0aWMgdTY0IGN1cnJlbnRfY3NzX3NldF9yZWZjb3VudF9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNvbnQsCi0JCQkJCSAgIHN0cnVjdCBjZnR5cGUgKmNmdCkKLXsKLQl1NjQgY291bnQ7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JY291bnQgPSBhdG9taWNfcmVhZCgmY3VycmVudC0+Y2dyb3Vwcy0+cmVmY291bnQpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHU2NCByZWxlYXNhYmxlX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0KQotewotCXJldHVybiB0ZXN0X2JpdChDR1JQX1JFTEVBU0FCTEUsICZjZ3JwLT5mbGFncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2Z0eXBlIGZpbGVzW10gPSAgewotCXsKLQkJLm5hbWUgPSAiY2dyb3VwX3JlZmNvdW50IiwKLQkJLnJlYWRfdTY0ID0gY2dyb3VwX3JlZmNvdW50X3JlYWQsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhc2tjb3VudCIsCi0JCS5yZWFkX3U2NCA9IHRhc2tjb3VudF9yZWFkLAotCX0sCi0KLQl7Ci0JCS5uYW1lID0gImN1cnJlbnRfY3NzX3NldCIsCi0JCS5yZWFkX3U2NCA9IGN1cnJlbnRfY3NzX3NldF9yZWFkLAotCX0sCi0KLQl7Ci0JCS5uYW1lID0gImN1cnJlbnRfY3NzX3NldF9yZWZjb3VudCIsCi0JCS5yZWFkX3U2NCA9IGN1cnJlbnRfY3NzX3NldF9yZWZjb3VudF9yZWFkLAotCX0sCi0KLQl7Ci0JCS5uYW1lID0gInJlbGVhc2FibGUiLAotCQkucmVhZF91NjQgPSByZWxlYXNhYmxlX3JlYWQsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgZGVidWdfcG9wdWxhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjb250KQotewotCXJldHVybiBjZ3JvdXBfYWRkX2ZpbGVzKGNvbnQsIHNzLCBmaWxlcywgQVJSQVlfU0laRShmaWxlcykpOwotfQotCi1zdHJ1Y3QgY2dyb3VwX3N1YnN5cyBkZWJ1Z19zdWJzeXMgPSB7Ci0JLm5hbWUgPSAiZGVidWciLAotCS5jcmVhdGUgPSBkZWJ1Z19jcmVhdGUsCi0JLmRlc3Ryb3kgPSBkZWJ1Z19kZXN0cm95LAotCS5wb3B1bGF0ZSA9IGRlYnVnX3BvcHVsYXRlLAotCS5zdWJzeXNfaWQgPSBkZWJ1Z19zdWJzeXNfaWQsCi19OwpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cF9mcmVlemVyLmMgYi9rZXJuZWwvY2dyb3VwX2ZyZWV6ZXIuYwppbmRleCBmYjI0OWUyLi41OWU5ZWY2IDEwMDY0NAotLS0gYS9rZXJuZWwvY2dyb3VwX2ZyZWV6ZXIuYworKysgYi9rZXJuZWwvY2dyb3VwX2ZyZWV6ZXIuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZnJlZXplcl9jYW5fYXR0YWNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKIAkJCSAgICAgIHN0cnVjdCBjZ3JvdXAgKm5ld19jZ3JvdXAsCi0JCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCisJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGJvb2wgdGhyZWFkZ3JvdXApCiB7CiAJc3RydWN0IGZyZWV6ZXIgKmZyZWV6ZXI7CiAKQEAgLTE3Nyw2ICsxNzcsMTkgQEAKIAlpZiAoZnJlZXplci0+c3RhdGUgPT0gQ0dST1VQX0ZST1pFTikKIAkJcmV0dXJuIC1FQlVTWTsKIAorCWlmICh0aHJlYWRncm91cCkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmM7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjLCAmdGFzay0+dGhyZWFkX2dyb3VwLCB0aHJlYWRfZ3JvdXApIHsKKwkJCWlmIChpc190YXNrX2Zyb3plbl9lbm91Z2goYykpIHsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1c2V0LmMgYi9rZXJuZWwvY3B1c2V0LmMKaW5kZXggN2U3NWE0MS4uYjVjYjQ2OSAxMDA2NDQKLS0tIGEva2VybmVsL2NwdXNldC5jCisrKyBiL2tlcm5lbC9jcHVzZXQuYwpAQCAtMTMyNCw5ICsxMzI0LDEwIEBACiBzdGF0aWMgY3B1bWFza192YXJfdCBjcHVzX2F0dGFjaDsKIAogLyogQ2FsbGVkIGJ5IGNncm91cHMgdG8gZGV0ZXJtaW5lIGlmIGEgY3B1c2V0IGlzIHVzYWJsZTsgY2dyb3VwX211dGV4IGhlbGQgKi8KLXN0YXRpYyBpbnQgY3B1c2V0X2Nhbl9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAotCQkJICAgICBzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3N0YXRpYyBpbnQgY3B1c2V0X2Nhbl9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjb250LAorCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgYm9vbCB0aHJlYWRncm91cCkKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBjcHVzZXQgKmNzID0gY2dyb3VwX2NzKGNvbnQpOwogCiAJaWYgKGNwdW1hc2tfZW1wdHkoY3MtPmNwdXNfYWxsb3dlZCkgfHwgbm9kZXNfZW1wdHkoY3MtPm1lbXNfYWxsb3dlZCkpCkBAIC0xMzQzLDE4ICsxMzQ0LDUxIEBACiAJaWYgKHRzay0+ZmxhZ3MgJiBQRl9USFJFQURfQk9VTkQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHNlY3VyaXR5X3Rhc2tfc2V0c2NoZWR1bGVyKHRzaywgMCwgTlVMTCk7CisJcmV0ID0gc2VjdXJpdHlfdGFza19zZXRzY2hlZHVsZXIodHNrLCAwLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh0aHJlYWRncm91cCkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmM7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjLCAmdHNrLT50aHJlYWRfZ3JvdXAsIHRocmVhZF9ncm91cCkgeworCQkJcmV0ID0gc2VjdXJpdHlfdGFza19zZXRzY2hlZHVsZXIoYywgMCwgTlVMTCk7CisJCQlpZiAocmV0KSB7CisJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNwdXNldF9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAotCQkJICBzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2dyb3VwICpvbGRjb250LAotCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3N0YXRpYyB2b2lkIGNwdXNldF9hdHRhY2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbm9kZW1hc2tfdCAqdG8sCisJCQkgICAgICAgc3RydWN0IGNwdXNldCAqY3MpCit7CisJaW50IGVycjsKKwkvKgorCSAqIGNhbl9hdHRhY2ggYmVmb3JlaGFuZCBzaG91bGQgZ3VhcmFudGVlIHRoYXQgdGhpcyBkb2Vzbid0IGZhaWwuCisJICogVE9ETzogaGF2ZSBhIGJldHRlciB3YXkgdG8gaGFuZGxlIGZhaWx1cmUgaGVyZQorCSAqLworCWVyciA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKHRzaywgY3B1c19hdHRhY2gpOworCVdBUk5fT05fT05DRShlcnIpOworCisJdGFza19sb2NrKHRzayk7CisJY3B1c2V0X2NoYW5nZV90YXNrX25vZGVtYXNrKHRzaywgdG8pOworCXRhc2tfdW5sb2NrKHRzayk7CisJY3B1c2V0X3VwZGF0ZV90YXNrX3NwcmVhZF9mbGFnKGNzLCB0c2spOworCit9CisKK3N0YXRpYyB2b2lkIGNwdXNldF9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjb250LAorCQkJICBzdHJ1Y3QgY2dyb3VwICpvbGRjb250LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCSAgYm9vbCB0aHJlYWRncm91cCkKIHsKIAlub2RlbWFza190IGZyb20sIHRvOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCBjcHVzZXQgKmNzID0gY2dyb3VwX2NzKGNvbnQpOwogCXN0cnVjdCBjcHVzZXQgKm9sZGNzID0gY2dyb3VwX2NzKG9sZGNvbnQpOwotCWludCBlcnI7CiAKIAlpZiAoY3MgPT0gJnRvcF9jcHVzZXQpIHsKIAkJY3B1bWFza19jb3B5KGNwdXNfYXR0YWNoLCBjcHVfcG9zc2libGVfbWFzayk7CkBAIC0xMzYzLDE1ICsxMzk3LDE5IEBACiAJCWd1YXJhbnRlZV9vbmxpbmVfY3B1cyhjcywgY3B1c19hdHRhY2gpOwogCQlndWFyYW50ZWVfb25saW5lX21lbXMoY3MsICZ0byk7CiAJfQotCWVyciA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKHRzaywgY3B1c19hdHRhY2gpOwotCWlmIChlcnIpCi0JCXJldHVybjsKIAotCXRhc2tfbG9jayh0c2spOwotCWNwdXNldF9jaGFuZ2VfdGFza19ub2RlbWFzayh0c2ssICZ0byk7Ci0JdGFza191bmxvY2sodHNrKTsKLQljcHVzZXRfdXBkYXRlX3Rhc2tfc3ByZWFkX2ZsYWcoY3MsIHRzayk7CisJLyogZG8gcGVyLXRhc2sgbWlncmF0aW9uIHN0dWZmIHBvc3NpYmx5IGZvciBlYWNoIGluIHRoZSB0aHJlYWRncm91cCAqLworCWNwdXNldF9hdHRhY2hfdGFzayh0c2ssICZ0bywgY3MpOworCWlmICh0aHJlYWRncm91cCkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmM7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYywgJnRzay0+dGhyZWFkX2dyb3VwLCB0aHJlYWRfZ3JvdXApIHsKKwkJCWNwdXNldF9hdHRhY2hfdGFzayhjLCAmdG8sIGNzKTsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CiAKKwkvKiBjaGFuZ2UgbW07IG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlIGV2ZW4gaWYgdGhyZWFkZ3JvdXAgKi8KIAlmcm9tID0gb2xkY3MtPm1lbXNfYWxsb3dlZDsKIAl0byA9IGNzLT5tZW1zX2FsbG93ZWQ7CiAJbW0gPSBnZXRfdGFza19tbSh0c2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NyZWQuYyBiL2tlcm5lbC9jcmVkLmMKaW5kZXggZDdmN2EwMS4uZGQ3NmNmZSAxMDA2NDQKLS0tIGEva2VybmVsL2NyZWQuYworKysgYi9rZXJuZWwvY3JlZC5jCkBAIC03ODIsNiArNzgyLDI1IEBACiAKICNpZmRlZiBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMKIAorYm9vbCBjcmVkc19hcmVfaW52YWxpZChjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCkKK3sKKwlpZiAoY3JlZC0+bWFnaWMgIT0gQ1JFRF9NQUdJQykKKwkJcmV0dXJuIHRydWU7CisJaWYgKGF0b21pY19yZWFkKCZjcmVkLT51c2FnZSkgPCBhdG9taWNfcmVhZCgmY3JlZC0+c3Vic2NyaWJlcnMpKQorCQlyZXR1cm4gdHJ1ZTsKKyNpZmRlZiBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWAorCWlmIChzZWxpbnV4X2lzX2VuYWJsZWQoKSkgeworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGNyZWQtPnNlY3VyaXR5IDwgUEFHRV9TSVpFKQorCQkJcmV0dXJuIHRydWU7CisJCWlmICgoKih1MzIgKiljcmVkLT5zZWN1cml0eSAmIDB4ZmZmZmZmMDApID09CisJCSAgICAoUE9JU09OX0ZSRUUgPDwgMjQgfCBQT0lTT05fRlJFRSA8PCAxNiB8IFBPSVNPTl9GUkVFIDw8IDgpKQorCQkJcmV0dXJuIHRydWU7CisJfQorI2VuZGlmCisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTChjcmVkc19hcmVfaW52YWxpZCk7CisKIC8qCiAgKiBkdW1wIGludmFsaWQgY3JlZGVudGlhbHMKICAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggNjBkNmZkYy4uZjc4NjRhYyAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC0zNTksMTAgKzM1OSw4IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyOwogCi0JaWYgKHRhc2tfc2Vzc2lvbihjdXJyKSAhPSBwaWQpIHsKKwlpZiAodGFza19zZXNzaW9uKGN1cnIpICE9IHBpZCkKIAkJY2hhbmdlX3BpZChjdXJyLCBQSURUWVBFX1NJRCwgcGlkKTsKLQkJcHJvY19zaWRfY29ubmVjdG9yKGN1cnIpOwotCX0KIAogCWlmICh0YXNrX3BncnAoY3VycikgIT0gcGlkKQogCQljaGFuZ2VfcGlkKGN1cnIsIFBJRFRZUEVfUEdJRCwgcGlkKTsKQEAgLTk3Niw4ICs5NzQsNiBAQAogCQlkaXNhc3NvY2lhdGVfY3R0eSgxKTsKIAogCW1vZHVsZV9wdXQodGFza190aHJlYWRfaW5mbyh0c2spLT5leGVjX2RvbWFpbi0+bW9kdWxlKTsKLQlpZiAodHNrLT5iaW5mbXQpCi0JCW1vZHVsZV9wdXQodHNrLT5iaW5mbXQtPm1vZHVsZSk7CiAKIAlwcm9jX2V4aXRfY29ubmVjdG9yKHRzayk7CiAKQEAgLTk5Myw4ICs5ODksNiBAQAogCXRzay0+bWVtcG9saWN5ID0gTlVMTDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19GVVRFWAotCWlmICh1bmxpa2VseSghbGlzdF9lbXB0eSgmdHNrLT5waV9zdGF0ZV9saXN0KSkpCi0JCWV4aXRfcGlfc3RhdGVfbGlzdCh0c2spOwogCWlmICh1bmxpa2VseShjdXJyZW50LT5waV9zdGF0ZV9jYWNoZSkpCiAJCWtmcmVlKGN1cnJlbnQtPnBpX3N0YXRlX2NhY2hlKTsKICNlbmRpZgpAQCAtMTA5NywyOCArMTA5MSwyOCBAQAogCWludCBfX3VzZXIJCSp3b19zdGF0OwogCXN0cnVjdCBydXNhZ2UgX191c2VyCSp3b19ydXNhZ2U7CiAKKwl3YWl0X3F1ZXVlX3QJCWNoaWxkX3dhaXQ7CiAJaW50CQkJbm90YXNrX2Vycm9yOwogfTsKIAotc3RhdGljIHN0cnVjdCBwaWQgKnRhc2tfcGlkX3R5cGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBlbnVtIHBpZF90eXBlIHR5cGUpCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgcGlkICp0YXNrX3BpZF90eXBlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgZW51bSBwaWRfdHlwZSB0eXBlKQogewotCXN0cnVjdCBwaWQgKnBpZCA9IE5VTEw7Ci0JaWYgKHR5cGUgPT0gUElEVFlQRV9QSUQpCi0JCXBpZCA9IHRhc2stPnBpZHNbdHlwZV0ucGlkOwotCWVsc2UgaWYgKHR5cGUgPCBQSURUWVBFX01BWCkKLQkJcGlkID0gdGFzay0+Z3JvdXBfbGVhZGVyLT5waWRzW3R5cGVdLnBpZDsKLQlyZXR1cm4gcGlkOworCWlmICh0eXBlICE9IFBJRFRZUEVfUElEKQorCQl0YXNrID0gdGFzay0+Z3JvdXBfbGVhZGVyOworCXJldHVybiB0YXNrLT5waWRzW3R5cGVdLnBpZDsKK30KKworc3RhdGljIGludCBlbGlnaWJsZV9waWQoc3RydWN0IHdhaXRfb3B0cyAqd28sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4Jd28tPndvX3R5cGUgPT0gUElEVFlQRV9NQVggfHwKKwkJdGFza19waWRfdHlwZShwLCB3by0+d29fdHlwZSkgPT0gd28tPndvX3BpZDsKIH0KIAogc3RhdGljIGludCBlbGlnaWJsZV9jaGlsZChzdHJ1Y3Qgd2FpdF9vcHRzICp3bywgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCWludCBlcnI7Ci0KLQlpZiAod28tPndvX3R5cGUgPCBQSURUWVBFX01BWCkgewotCQlpZiAodGFza19waWRfdHlwZShwLCB3by0+d29fdHlwZSkgIT0gd28tPndvX3BpZCkKLQkJCXJldHVybiAwOwotCX0KLQorCWlmICghZWxpZ2libGVfcGlkKHdvLCBwKSkKKwkJcmV0dXJuIDA7CiAJLyogV2FpdCBmb3IgYWxsIGNoaWxkcmVuIChjbG9uZSBhbmQgbm90KSBpZiBfX1dBTEwgaXMgc2V0OwogCSAqIG90aGVyd2lzZSwgd2FpdCBmb3IgY2xvbmUgY2hpbGRyZW4gKm9ubHkqIGlmIF9fV0NMT05FIGlzCiAJICogc2V0OyBvdGhlcndpc2UsIHdhaXQgZm9yIG5vbi1jbG9uZSBjaGlsZHJlbiAqb25seSouICAoTm90ZToKQEAgLTExMjgsMTAgKzExMjIsNiBAQAogCSAgICAmJiAhKHdvLT53b19mbGFncyAmIF9fV0FMTCkpCiAJCXJldHVybiAwOwogCi0JZXJyID0gc2VjdXJpdHlfdGFza193YWl0KHApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAlyZXR1cm4gMTsKIH0KIApAQCAtMTE0NCwxOCArMTEzNCwyMCBAQAogCiAJcHV0X3Rhc2tfc3RydWN0KHApOwogCWluZm9wID0gd28tPndvX2luZm87Ci0JaWYgKCFyZXR2YWwpCi0JCXJldHZhbCA9IHB1dF91c2VyKFNJR0NITEQsICZpbmZvcC0+c2lfc2lnbm8pOwotCWlmICghcmV0dmFsKQotCQlyZXR2YWwgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX2Vycm5vKTsKLQlpZiAoIXJldHZhbCkKLQkJcmV0dmFsID0gcHV0X3VzZXIoKHNob3J0KXdoeSwgJmluZm9wLT5zaV9jb2RlKTsKLQlpZiAoIXJldHZhbCkKLQkJcmV0dmFsID0gcHV0X3VzZXIocGlkLCAmaW5mb3AtPnNpX3BpZCk7Ci0JaWYgKCFyZXR2YWwpCi0JCXJldHZhbCA9IHB1dF91c2VyKHVpZCwgJmluZm9wLT5zaV91aWQpOwotCWlmICghcmV0dmFsKQotCQlyZXR2YWwgPSBwdXRfdXNlcihzdGF0dXMsICZpbmZvcC0+c2lfc3RhdHVzKTsKKwlpZiAoaW5mb3ApIHsKKwkJaWYgKCFyZXR2YWwpCisJCQlyZXR2YWwgPSBwdXRfdXNlcihTSUdDSExELCAmaW5mb3AtPnNpX3NpZ25vKTsKKwkJaWYgKCFyZXR2YWwpCisJCQlyZXR2YWwgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX2Vycm5vKTsKKwkJaWYgKCFyZXR2YWwpCisJCQlyZXR2YWwgPSBwdXRfdXNlcigoc2hvcnQpd2h5LCAmaW5mb3AtPnNpX2NvZGUpOworCQlpZiAoIXJldHZhbCkKKwkJCXJldHZhbCA9IHB1dF91c2VyKHBpZCwgJmluZm9wLT5zaV9waWQpOworCQlpZiAoIXJldHZhbCkKKwkJCXJldHZhbCA9IHB1dF91c2VyKHVpZCwgJmluZm9wLT5zaV91aWQpOworCQlpZiAoIXJldHZhbCkKKwkJCXJldHZhbCA9IHB1dF91c2VyKHN0YXR1cywgJmluZm9wLT5zaV9zdGF0dXMpOworCX0KIAlpZiAoIXJldHZhbCkKIAkJcmV0dmFsID0gcGlkOwogCXJldHVybiByZXR2YWw7CkBAIC0xNDg1LDEzICsxNDc3LDE0IEBACiAgKiB0aGVuIC0+bm90YXNrX2Vycm9yIGlzIDAgaWYgQHAgaXMgYW4gZWxpZ2libGUgY2hpbGQsCiAgKiBvciBhbm90aGVyIGVycm9yIGZyb20gc2VjdXJpdHlfdGFza193YWl0KCksIG9yIHN0aWxsIC1FQ0hJTEQuCiAgKi8KLXN0YXRpYyBpbnQgd2FpdF9jb25zaWRlcl90YXNrKHN0cnVjdCB3YWl0X29wdHMgKndvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCwKLQkJCQlpbnQgcHRyYWNlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCitzdGF0aWMgaW50IHdhaXRfY29uc2lkZXJfdGFzayhzdHJ1Y3Qgd2FpdF9vcHRzICp3bywgaW50IHB0cmFjZSwKKwkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJaW50IHJldCA9IGVsaWdpYmxlX2NoaWxkKHdvLCBwKTsKIAlpZiAoIXJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IHNlY3VyaXR5X3Rhc2tfd2FpdChwKTsKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKIAkJLyoKIAkJICogSWYgd2UgaGF2ZSBub3QgeWV0IHNlZW4gYW55IGVsaWdpYmxlIGNoaWxkLApAQCAtMTU1Myw3ICsxNTQ2LDcgQEAKIAkJICogRG8gbm90IGNvbnNpZGVyIGRldGFjaGVkIHRocmVhZHMuCiAJCSAqLwogCQlpZiAoIXRhc2tfZGV0YWNoZWQocCkpIHsKLQkJCWludCByZXQgPSB3YWl0X2NvbnNpZGVyX3Rhc2sod28sIHRzaywgMCwgcCk7CisJCQlpbnQgcmV0ID0gd2FpdF9jb25zaWRlcl90YXNrKHdvLCAwLCBwKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMTU2Nyw3ICsxNTYwLDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZ0c2stPnB0cmFjZWQsIHB0cmFjZV9lbnRyeSkgewotCQlpbnQgcmV0ID0gd2FpdF9jb25zaWRlcl90YXNrKHdvLCB0c2ssIDEsIHApOworCQlpbnQgcmV0ID0gd2FpdF9jb25zaWRlcl90YXNrKHdvLCAxLCBwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtMTU3NSwxNSArMTU2OCwzOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGNoaWxkX3dhaXRfY2FsbGJhY2sod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLAorCQkJCWludCBzeW5jLCB2b2lkICprZXkpCit7CisJc3RydWN0IHdhaXRfb3B0cyAqd28gPSBjb250YWluZXJfb2Yod2FpdCwgc3RydWN0IHdhaXRfb3B0cywKKwkJCQkJCWNoaWxkX3dhaXQpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGtleTsKKworCWlmICghZWxpZ2libGVfcGlkKHdvLCBwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHdvLT53b19mbGFncyAmIF9fV05PVEhSRUFEKSAmJiB3YWl0LT5wcml2YXRlICE9IHAtPnBhcmVudCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZGVmYXVsdF93YWtlX2Z1bmN0aW9uKHdhaXQsIG1vZGUsIHN5bmMsIGtleSk7Cit9CisKK3ZvaWQgX193YWtlX3VwX3BhcmVudChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGFyZW50KQoreworCV9fd2FrZV91cF9zeW5jX2tleSgmcGFyZW50LT5zaWduYWwtPndhaXRfY2hsZGV4aXQsCisJCQkJVEFTS19JTlRFUlJVUFRJQkxFLCAxLCBwKTsKK30KKwogc3RhdGljIGxvbmcgZG9fd2FpdChzdHJ1Y3Qgd2FpdF9vcHRzICp3bykKIHsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlpbnQgcmV0dmFsOwogCiAJdHJhY2Vfc2NoZWRfcHJvY2Vzc193YWl0KHdvLT53b19waWQpOwogCi0JYWRkX3dhaXRfcXVldWUoJmN1cnJlbnQtPnNpZ25hbC0+d2FpdF9jaGxkZXhpdCwmd2FpdCk7CisJaW5pdF93YWl0cXVldWVfZnVuY19lbnRyeSgmd28tPmNoaWxkX3dhaXQsIGNoaWxkX3dhaXRfY2FsbGJhY2spOworCXdvLT5jaGlsZF93YWl0LnByaXZhdGUgPSBjdXJyZW50OworCWFkZF93YWl0X3F1ZXVlKCZjdXJyZW50LT5zaWduYWwtPndhaXRfY2hsZGV4aXQsICZ3by0+Y2hpbGRfd2FpdCk7CiByZXBlYXQ6CiAJLyoKIAkgKiBJZiB0aGVyZSBpcyBub3RoaW5nIHRoYXQgY2FuIG1hdGNoIG91ciBjcml0aWVyYSBqdXN0IGdldCBvdXQuCkBAIC0xNjI0LDMyICsxNjQwLDcgQEAKIAl9CiBlbmQ6CiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZjdXJyZW50LT5zaWduYWwtPndhaXRfY2hsZGV4aXQsJndhaXQpOwotCWlmICh3by0+d29faW5mbykgewotCQlzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKmluZm9wID0gd28tPndvX2luZm87Ci0KLQkJaWYgKHJldHZhbCA+IDApCi0JCQlyZXR2YWwgPSAwOwotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBGb3IgYSBXTk9IQU5HIHJldHVybiwgY2xlYXIgb3V0IGFsbCB0aGUgZmllbGRzCi0JCQkgKiB3ZSB3b3VsZCBzZXQgc28gdGhlIHVzZXIgY2FuIGVhc2lseSB0ZWxsIHRoZQotCQkJICogZGlmZmVyZW5jZS4KLQkJCSAqLwotCQkJaWYgKCFyZXR2YWwpCi0JCQkJcmV0dmFsID0gcHV0X3VzZXIoMCwgJmluZm9wLT5zaV9zaWdubyk7Ci0JCQlpZiAoIXJldHZhbCkKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX2Vycm5vKTsKLQkJCWlmICghcmV0dmFsKQotCQkJCXJldHZhbCA9IHB1dF91c2VyKDAsICZpbmZvcC0+c2lfY29kZSk7Ci0JCQlpZiAoIXJldHZhbCkKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX3BpZCk7Ci0JCQlpZiAoIXJldHZhbCkKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX3VpZCk7Ci0JCQlpZiAoIXJldHZhbCkKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX3N0YXR1cyk7Ci0JCX0KLQl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmN1cnJlbnQtPnNpZ25hbC0+d2FpdF9jaGxkZXhpdCwgJndvLT5jaGlsZF93YWl0KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xNjk0LDYgKzE2ODUsMjkgQEAKIAl3by53b19zdGF0CT0gTlVMTDsKIAl3by53b19ydXNhZ2UJPSBydTsKIAlyZXQgPSBkb193YWl0KCZ3byk7CisKKwlpZiAocmV0ID4gMCkgeworCQlyZXQgPSAwOworCX0gZWxzZSBpZiAoaW5mb3ApIHsKKwkJLyoKKwkJICogRm9yIGEgV05PSEFORyByZXR1cm4sIGNsZWFyIG91dCBhbGwgdGhlIGZpZWxkcworCQkgKiB3ZSB3b3VsZCBzZXQgc28gdGhlIHVzZXIgY2FuIGVhc2lseSB0ZWxsIHRoZQorCQkgKiBkaWZmZXJlbmNlLgorCQkgKi8KKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX3NpZ25vKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX2Vycm5vKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX2NvZGUpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHB1dF91c2VyKDAsICZpbmZvcC0+c2lfcGlkKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBwdXRfdXNlcigwLCAmaW5mb3AtPnNpX3VpZCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcHV0X3VzZXIoMCwgJmluZm9wLT5zaV9zdGF0dXMpOworCX0KKwogCXB1dF9waWQocGlkKTsKIAogCS8qIGF2b2lkIFJFR1BBUk0gYnJlYWthZ2Ugb24geDg2OiAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNTFhZDBiMC4uMTY2YjhjNCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC05MSw3ICs5MSw3IEBACiAJaW50IGNwdTsKIAlpbnQgdG90YWwgPSAwOwogCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKIAkJdG90YWwgKz0gcGVyX2NwdShwcm9jZXNzX2NvdW50cywgY3B1KTsKIAogCXJldHVybiB0b3RhbDsKQEAgLTQzNCw2ICs0MzQsMTQgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogCitzdGF0aWMgdm9pZCBtbV9pbml0X2FpbyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKyNpZmRlZiBDT05GSUdfQUlPCisJc3Bpbl9sb2NrX2luaXQoJm1tLT5pb2N0eF9sb2NrKTsKKwlJTklUX0hMSVNUX0hFQUQoJm1tLT5pb2N0eF9saXN0KTsKKyNlbmRpZgorfQorCiBzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqIG1tX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqIG1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJYXRvbWljX3NldCgmbW0tPm1tX3VzZXJzLCAxKTsKQEAgLTQ0NywxMCArNDU1LDkgQEAKIAlzZXRfbW1fY291bnRlcihtbSwgZmlsZV9yc3MsIDApOwogCXNldF9tbV9jb3VudGVyKG1tLCBhbm9uX3JzcywgMCk7CiAJc3Bpbl9sb2NrX2luaXQoJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZtbS0+aW9jdHhfbG9jayk7Ci0JSU5JVF9ITElTVF9IRUFEKCZtbS0+aW9jdHhfbGlzdCk7CiAJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IFRBU0tfVU5NQVBQRURfQkFTRTsKIAltbS0+Y2FjaGVkX2hvbGVfc2l6ZSA9IH4wVUw7CisJbW1faW5pdF9haW8obW0pOwogCW1tX2luaXRfb3duZXIobW0sIHApOwogCiAJaWYgKGxpa2VseSghbW1fYWxsb2NfcGdkKG1tKSkpIHsKQEAgLTUxMSw2ICs1MTgsOCBAQAogCQkJc3Bpbl91bmxvY2soJm1tbGlzdF9sb2NrKTsKIAkJfQogCQlwdXRfc3dhcF90b2tlbihtbSk7CisJCWlmIChtbS0+YmluZm10KQorCQkJbW9kdWxlX3B1dChtbS0+YmluZm10LT5tb2R1bGUpOwogCQltbWRyb3AobW0pOwogCX0KIH0KQEAgLTU2MSwxMiArNTcwLDE4IEBACiAKIAkvKiBHZXQgcmlkIG9mIGFueSBmdXRleGVzIHdoZW4gcmVsZWFzaW5nIHRoZSBtbSAqLwogI2lmZGVmIENPTkZJR19GVVRFWAotCWlmICh1bmxpa2VseSh0c2stPnJvYnVzdF9saXN0KSkKKwlpZiAodW5saWtlbHkodHNrLT5yb2J1c3RfbGlzdCkpIHsKIAkJZXhpdF9yb2J1c3RfbGlzdCh0c2spOworCQl0c2stPnJvYnVzdF9saXN0ID0gTlVMTDsKKwl9CiAjaWZkZWYgQ09ORklHX0NPTVBBVAotCWlmICh1bmxpa2VseSh0c2stPmNvbXBhdF9yb2J1c3RfbGlzdCkpCisJaWYgKHVubGlrZWx5KHRzay0+Y29tcGF0X3JvYnVzdF9saXN0KSkgewogCQljb21wYXRfZXhpdF9yb2J1c3RfbGlzdCh0c2spOworCQl0c2stPmNvbXBhdF9yb2J1c3RfbGlzdCA9IE5VTEw7CisJfQogI2VuZGlmCisJaWYgKHVubGlrZWx5KCFsaXN0X2VtcHR5KCZ0c2stPnBpX3N0YXRlX2xpc3QpKSkKKwkJZXhpdF9waV9zdGF0ZV9saXN0KHRzayk7CiAjZW5kaWYKIAogCS8qIEdldCByaWQgb2YgYW55IGNhY2hlZCByZWdpc3RlciBzdGF0ZSAqLwpAQCAtNjM2LDkgKzY1MSwxNCBAQAogCW1tLT5oaXdhdGVyX3JzcyA9IGdldF9tbV9yc3MobW0pOwogCW1tLT5oaXdhdGVyX3ZtID0gbW0tPnRvdGFsX3ZtOwogCisJaWYgKG1tLT5iaW5mbXQgJiYgIXRyeV9tb2R1bGVfZ2V0KG1tLT5iaW5mbXQtPm1vZHVsZSkpCisJCWdvdG8gZnJlZV9wdDsKKwogCXJldHVybiBtbTsKIAogZnJlZV9wdDoKKwkvKiBkb24ndCBwdXQgYmluZm10IGluIG1tcHV0LCB3ZSBoYXZlbid0IGdvdCBtb2R1bGUgeWV0ICovCisJbW0tPmJpbmZtdCA9IE5VTEw7CiAJbW1wdXQobW0pOwogCiBmYWlsX25vbWVtOgpAQCAtOTc5LDYgKzk5OSwxNiBAQAogCWlmICgoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TSUdIQU5EKSAmJiAhKGNsb25lX2ZsYWdzICYgQ0xPTkVfVk0pKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAorCS8qCisJICogU2libGluZ3Mgb2YgZ2xvYmFsIGluaXQgcmVtYWluIGFzIHpvbWJpZXMgb24gZXhpdCBzaW5jZSB0aGV5IGFyZQorCSAqIG5vdCByZWFwZWQgYnkgdGhlaXIgcGFyZW50IChzd2FwcGVyKS4gVG8gc29sdmUgdGhpcyBhbmQgdG8gYXZvaWQKKwkgKiBtdWx0aS1yb290ZWQgcHJvY2VzcyB0cmVlcywgcHJldmVudCBnbG9iYWwgYW5kIGNvbnRhaW5lci1pbml0cworCSAqIGZyb20gY3JlYXRpbmcgc2libGluZ3MuCisJICovCisJaWYgKChjbG9uZV9mbGFncyAmIENMT05FX1BBUkVOVCkgJiYKKwkJCQljdXJyZW50LT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX1VOS0lMTEFCTEUpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCiAJcmV0dmFsID0gc2VjdXJpdHlfdGFza19jcmVhdGUoY2xvbmVfZmxhZ3MpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZm9ya19vdXQ7CkBAIC0xMDIwLDkgKzEwNTAsNiBAQAogCWlmICghdHJ5X21vZHVsZV9nZXQodGFza190aHJlYWRfaW5mbyhwKS0+ZXhlY19kb21haW4tPm1vZHVsZSkpCiAJCWdvdG8gYmFkX2ZvcmtfY2xlYW51cF9jb3VudDsKIAotCWlmIChwLT5iaW5mbXQgJiYgIXRyeV9tb2R1bGVfZ2V0KHAtPmJpbmZtdC0+bW9kdWxlKSkKLQkJZ290byBiYWRfZm9ya19jbGVhbnVwX3B1dF9kb21haW47Ci0KIAlwLT5kaWRfZXhlYyA9IDA7CiAJZGVsYXlhY2N0X3Rza19pbml0KHApOwkvKiBNdXN0IHJlbWFpbiBhZnRlciBkdXBfdGFza19zdHJ1Y3QoKSAqLwogCWNvcHlfZmxhZ3MoY2xvbmVfZmxhZ3MsIHApOwpAQCAtMTMxMCw5ICsxMzM3LDYgQEAKICNlbmRpZgogCWNncm91cF9leGl0KHAsIGNncm91cF9jYWxsYmFja3NfZG9uZSk7CiAJZGVsYXlhY2N0X3Rza19mcmVlKHApOwotCWlmIChwLT5iaW5mbXQpCi0JCW1vZHVsZV9wdXQocC0+YmluZm10LT5tb2R1bGUpOwotYmFkX2ZvcmtfY2xlYW51cF9wdXRfZG9tYWluOgogCW1vZHVsZV9wdXQodGFza190aHJlYWRfaW5mbyhwKS0+ZXhlY19kb21haW4tPm1vZHVsZSk7CiBiYWRfZm9ya19jbGVhbnVwX2NvdW50OgogCWF0b21pY19kZWMoJnAtPmNyZWQtPnVzZXItPnByb2Nlc3Nlcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDI0OGRkMTEuLmZiNjVlODIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC04OSwzNiArODksMzYgQEAKIAl1bmlvbiBmdXRleF9rZXkga2V5OwogfTsKIAotLyoKLSAqIFdlIHVzZSB0aGlzIGhhc2hlZCB3YWl0cXVldWUgaW5zdGVhZCBvZiBhIG5vcm1hbCB3YWl0X3F1ZXVlX3QsIHNvCisvKioKKyAqIHN0cnVjdCBmdXRleF9xIC0gVGhlIGhhc2hlZCBmdXRleCBxdWV1ZSBlbnRyeSwgb25lIHBlciB3YWl0aW5nIHRhc2sKKyAqIEB0YXNrOgkJdGhlIHRhc2sgd2FpdGluZyBvbiB0aGUgZnV0ZXgKKyAqIEBsb2NrX3B0cjoJCXRoZSBoYXNoIGJ1Y2tldCBsb2NrCisgKiBAa2V5OgkJdGhlIGtleSB0aGUgZnV0ZXggaXMgaGFzaGVkIG9uCisgKiBAcGlfc3RhdGU6CQlvcHRpb25hbCBwcmlvcml0eSBpbmhlcml0YW5jZSBzdGF0ZQorICogQHJ0X3dhaXRlcjoJCXJ0X3dhaXRlciBzdG9yYWdlIGZvciB1c2Ugd2l0aCByZXF1ZXVlX3BpCisgKiBAcmVxdWV1ZV9waV9rZXk6CXRoZSByZXF1ZXVlX3BpIHRhcmdldCBmdXRleCBrZXkKKyAqIEBiaXRzZXQ6CQliaXRzZXQgZm9yIHRoZSBvcHRpb25hbCBiaXRtYXNrZWQgd2FrZXVwCisgKgorICogV2UgdXNlIHRoaXMgaGFzaGVkIHdhaXRxdWV1ZSwgaW5zdGVhZCBvZiBhIG5vcm1hbCB3YWl0X3F1ZXVlX3QsIHNvCiAgKiB3ZSBjYW4gd2FrZSBvbmx5IHRoZSByZWxldmFudCBvbmVzIChoYXNoZWQgcXVldWVzIG1heSBiZSBzaGFyZWQpLgogICoKICAqIEEgZnV0ZXhfcSBoYXMgYSB3b2tlbiBzdGF0ZSwganVzdCBsaWtlIHRhc2tzIGhhdmUgVEFTS19SVU5OSU5HLgogICogSXQgaXMgY29uc2lkZXJlZCB3b2tlbiB3aGVuIHBsaXN0X25vZGVfZW1wdHkoJnEtPmxpc3QpIHx8IHEtPmxvY2tfcHRyID09IDAuCiAgKiBUaGUgb3JkZXIgb2Ygd2FrdXAgaXMgYWx3YXlzIHRvIG1ha2UgdGhlIGZpcnN0IGNvbmRpdGlvbiB0cnVlLCB0aGVuCi0gKiB3YWtlIHVwIHEtPndhaXRlciwgdGhlbiBtYWtlIHRoZSBzZWNvbmQgY29uZGl0aW9uIHRydWUuCisgKiB0aGUgc2Vjb25kLgorICoKKyAqIFBJIGZ1dGV4ZXMgYXJlIHR5cGljYWxseSB3b2tlbiBiZWZvcmUgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBoYXNoIGxpc3QgdmlhCisgKiB0aGUgcnRfbXV0ZXggY29kZS4gU2VlIHVucXVldWVfbWVfcGkoKS4KICAqLwogc3RydWN0IGZ1dGV4X3EgewogCXN0cnVjdCBwbGlzdF9ub2RlIGxpc3Q7Ci0JLyogV2FpdGVyIHJlZmVyZW5jZSAqLworCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCi0JLyogV2hpY2ggaGFzaCBsaXN0IGxvY2sgdG8gdXNlOiAqLwogCXNwaW5sb2NrX3QgKmxvY2tfcHRyOwotCi0JLyogS2V5IHdoaWNoIHRoZSBmdXRleCBpcyBoYXNoZWQgb246ICovCiAJdW5pb24gZnV0ZXhfa2V5IGtleTsKLQotCS8qIE9wdGlvbmFsIHByaW9yaXR5IGluaGVyaXRhbmNlIHN0YXRlOiAqLwogCXN0cnVjdCBmdXRleF9waV9zdGF0ZSAqcGlfc3RhdGU7Ci0KLQkvKiBydF93YWl0ZXIgc3RvcmFnZSBmb3IgcmVxdWV1ZV9waTogKi8KIAlzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICpydF93YWl0ZXI7Ci0KLQkvKiBUaGUgZXhwZWN0ZWQgcmVxdWV1ZSBwaSB0YXJnZXQgZnV0ZXgga2V5OiAqLwogCXVuaW9uIGZ1dGV4X2tleSAqcmVxdWV1ZV9waV9rZXk7Ci0KLQkvKiBCaXRzZXQgZm9yIHRoZSBvcHRpb25hbCBiaXRtYXNrZWQgd2FrZXVwICovCiAJdTMyIGJpdHNldDsKIH07CiAKQEAgLTE1MCw3ICsxNTAsOCBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBtYXRjaF9mdXRleCh1bmlvbiBmdXRleF9rZXkgKmtleTEsIHVuaW9uIGZ1dGV4X2tleSAqa2V5MikKIHsKLQlyZXR1cm4gKGtleTEtPmJvdGgud29yZCA9PSBrZXkyLT5ib3RoLndvcmQKKwlyZXR1cm4gKGtleTEgJiYga2V5MgorCQkmJiBrZXkxLT5ib3RoLndvcmQgPT0ga2V5Mi0+Ym90aC53b3JkCiAJCSYmIGtleTEtPmJvdGgucHRyID09IGtleTItPmJvdGgucHRyCiAJCSYmIGtleTEtPmJvdGgub2Zmc2V0ID09IGtleTItPmJvdGgub2Zmc2V0KTsKIH0KQEAgLTE5OCwxMSArMTk5LDEyIEBACiB9CiAKIC8qKgotICogZ2V0X2Z1dGV4X2tleSAtIEdldCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSB0aGUga2V5cyBmb3IgYSBmdXRleC4KLSAqIEB1YWRkcjogdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBmdXRleAotICogQGZzaGFyZWQ6IDAgZm9yIGEgUFJPQ0VTU19QUklWQVRFIGZ1dGV4LCAxIGZvciBQUk9DRVNTX1NIQVJFRAotICogQGtleTogYWRkcmVzcyB3aGVyZSByZXN1bHQgaXMgc3RvcmVkLgotICogQHJ3OiBtYXBwaW5nIG5lZWRzIHRvIGJlIHJlYWQvd3JpdGUgKHZhbHVlczogVkVSSUZZX1JFQUQsIFZFUklGWV9XUklURSkKKyAqIGdldF9mdXRleF9rZXkoKSAtIEdldCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSB0aGUga2V5cyBmb3IgYSBmdXRleAorICogQHVhZGRyOgl2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGZ1dGV4CisgKiBAZnNoYXJlZDoJMCBmb3IgYSBQUk9DRVNTX1BSSVZBVEUgZnV0ZXgsIDEgZm9yIFBST0NFU1NfU0hBUkVECisgKiBAa2V5OglhZGRyZXNzIHdoZXJlIHJlc3VsdCBpcyBzdG9yZWQuCisgKiBAcnc6CQltYXBwaW5nIG5lZWRzIHRvIGJlIHJlYWQvd3JpdGUgKHZhbHVlczogVkVSSUZZX1JFQUQsCisgKiAJCVZFUklGWV9XUklURSkKICAqCiAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciAwCiAgKiBUaGUga2V5IHdvcmRzIGFyZSBzdG9yZWQgaW4gKmtleSBvbiBzdWNjZXNzLgpAQCAtMjg4LDggKzI5MCw4IEBACiAJZHJvcF9mdXRleF9rZXlfcmVmcyhrZXkpOwogfQogCi0vKgotICogZmF1bHRfaW5fdXNlcl93cml0ZWFibGUgLSBmYXVsdCBpbiB1c2VyIGFkZHJlc3MgYW5kIHZlcmlmeSBSVyBhY2Nlc3MKKy8qKgorICogZmF1bHRfaW5fdXNlcl93cml0ZWFibGUoKSAtIEZhdWx0IGluIHVzZXIgYWRkcmVzcyBhbmQgdmVyaWZ5IFJXIGFjY2VzcwogICogQHVhZGRyOglwb2ludGVyIHRvIGZhdWx0aW5nIHVzZXIgc3BhY2UgYWRkcmVzcwogICoKICAqIFNsb3cgcGF0aCB0byBmaXh1cCB0aGUgZmF1bHQgd2UganVzdCB0b29rIGluIHRoZSBhdG9taWMgd3JpdGUKQEAgLTMwOSw4ICszMTEsOCBAQAogCiAvKioKICAqIGZ1dGV4X3RvcF93YWl0ZXIoKSAtIFJldHVybiB0aGUgaGlnaGVzdCBwcmlvcml0eSB3YWl0ZXIgb24gYSBmdXRleAotICogQGhiOiAgICAgdGhlIGhhc2ggYnVja2V0IHRoZSBmdXRleF9xJ3MgcmVzaWRlIGluCi0gKiBAa2V5OiAgICB0aGUgZnV0ZXgga2V5ICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIG90aGVyIGZ1dGV4IGZ1dGV4X3EncykKKyAqIEBoYjoJCXRoZSBoYXNoIGJ1Y2tldCB0aGUgZnV0ZXhfcSdzIHJlc2lkZSBpbgorICogQGtleToJdGhlIGZ1dGV4IGtleSAodG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBvdGhlciBmdXRleCBmdXRleF9xJ3MpCiAgKgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaGIgbG9jayBoZWxkLgogICovCkBAIC01ODgsNyArNTkwLDcgQEAKIH0KIAogLyoqCi0gKiBmdXRleF9sb2NrX3BpX2F0b21pYygpIC0gYXRvbWljIHdvcmsgcmVxdWlyZWQgdG8gYWNxdWlyZSBhIHBpIGF3YXJlIGZ1dGV4CisgKiBmdXRleF9sb2NrX3BpX2F0b21pYygpIC0gQXRvbWljIHdvcmsgcmVxdWlyZWQgdG8gYWNxdWlyZSBhIHBpIGF3YXJlIGZ1dGV4CiAgKiBAdWFkZHI6CQl0aGUgcGkgZnV0ZXggdXNlciBhZGRyZXNzCiAgKiBAaGI6CQkJdGhlIHBpIGZ1dGV4IGhhc2ggYnVja2V0CiAgKiBAa2V5OgkJdGhlIGZ1dGV4IGtleSBhc3NvY2lhdGVkIHdpdGggdWFkZHIgYW5kIGhiCkBAIC05MTUsOCArOTE3LDggQEAKIAloYjEgPSBoYXNoX2Z1dGV4KCZrZXkxKTsKIAloYjIgPSBoYXNoX2Z1dGV4KCZrZXkyKTsKIAotCWRvdWJsZV9sb2NrX2hiKGhiMSwgaGIyKTsKIHJldHJ5X3ByaXZhdGU6CisJZG91YmxlX2xvY2tfaGIoaGIxLCBoYjIpOwogCW9wX3JldCA9IGZ1dGV4X2F0b21pY19vcF9pbnVzZXIob3AsIHVhZGRyMik7CiAJaWYgKHVubGlrZWx5KG9wX3JldCA8IDApKSB7CiAKQEAgLTEwMTEsOSArMTAxMyw5IEBACiAKIC8qKgogICogcmVxdWV1ZV9waV93YWtlX2Z1dGV4KCkgLSBXYWtlIGEgdGFzayB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrIGR1cmluZyByZXF1ZXVlCi0gKiBxOgl0aGUgZnV0ZXhfcQotICoga2V5Ogl0aGUga2V5IG9mIHRoZSByZXF1ZXVlIHRhcmdldCBmdXRleAotICogaGI6ICB0aGUgaGFzaF9idWNrZXQgb2YgdGhlIHJlcXVldWUgdGFyZ2V0IGZ1dGV4CisgKiBAcToJCXRoZSBmdXRleF9xCisgKiBAa2V5Ogl0aGUga2V5IG9mIHRoZSByZXF1ZXVlIHRhcmdldCBmdXRleAorICogQGhiOgkJdGhlIGhhc2hfYnVja2V0IG9mIHRoZSByZXF1ZXVlIHRhcmdldCBmdXRleAogICoKICAqIER1cmluZyBmdXRleF9yZXF1ZXVlLCB3aXRoIHJlcXVldWVfcGk9MSwgaXQgaXMgcG9zc2libGUgdG8gYWNxdWlyZSB0aGUKICAqIHRhcmdldCBmdXRleCBpZiBpdCBpcyB1bmNvbnRlbmRlZCBvciB2aWEgYSBsb2NrIHN0ZWFsLiAgU2V0IHRoZSBmdXRleF9xIGtleQpAQCAtMTAyNyw3ICsxMDI5LDYgQEAKIHZvaWQgcmVxdWV1ZV9waV93YWtlX2Z1dGV4KHN0cnVjdCBmdXRleF9xICpxLCB1bmlvbiBmdXRleF9rZXkgKmtleSwKIAkJCSAgIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIpCiB7Ci0JZHJvcF9mdXRleF9rZXlfcmVmcygmcS0+a2V5KTsKIAlnZXRfZnV0ZXhfa2V5X3JlZnMoa2V5KTsKIAlxLT5rZXkgPSAqa2V5OwogCkBAIC0xMjI1LDYgKzEyMjYsNyBAQAogCQkgKi8KIAkJaWYgKHJldCA9PSAxKSB7CiAJCQlXQVJOX09OKHBpX3N0YXRlKTsKKwkJCWRyb3BfY291bnQrKzsKIAkJCXRhc2tfY291bnQrKzsKIAkJCXJldCA9IGdldF9mdXRleF92YWx1ZV9sb2NrZWQoJmN1cnZhbDIsIHVhZGRyMik7CiAJCQlpZiAoIXJldCkKQEAgLTEzMDMsNiArMTMwNSw3IEBACiAJCQlpZiAocmV0ID09IDEpIHsKIAkJCQkvKiBXZSBnb3QgdGhlIGxvY2suICovCiAJCQkJcmVxdWV1ZV9waV93YWtlX2Z1dGV4KHRoaXMsICZrZXkyLCBoYjIpOworCQkJCWRyb3BfY291bnQrKzsKIAkJCQljb250aW51ZTsKIAkJCX0gZWxzZSBpZiAocmV0KSB7CiAJCQkJLyogLUVERUFETEsgKi8KQEAgLTEzNTAsNiArMTM1MywyNSBAQAogCXJldHVybiBoYjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkCitxdWV1ZV91bmxvY2soc3RydWN0IGZ1dGV4X3EgKnEsIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIpCit7CisJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKKwlkcm9wX2Z1dGV4X2tleV9yZWZzKCZxLT5rZXkpOworfQorCisvKioKKyAqIHF1ZXVlX21lKCkgLSBFbnF1ZXVlIHRoZSBmdXRleF9xIG9uIHRoZSBmdXRleF9oYXNoX2J1Y2tldAorICogQHE6CVRoZSBmdXRleF9xIHRvIGVucXVldWUKKyAqIEBoYjoJVGhlIGRlc3RpbmF0aW9uIGhhc2ggYnVja2V0CisgKgorICogVGhlIGhiLT5sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLCBhbmQgaXMgcmVsZWFzZWQgaGVyZS4gQSBjYWxsIHRvCisgKiBxdWV1ZV9tZSgpIGlzIHR5cGljYWxseSBwYWlyZWQgd2l0aCBleGFjdGx5IG9uZSBjYWxsIHRvIHVucXVldWVfbWUoKS4gIFRoZQorICogZXhjZXB0aW9ucyBpbnZvbHZlIHRoZSBQSSByZWxhdGVkIG9wZXJhdGlvbnMsIHdoaWNoIG1heSB1c2UgdW5xdWV1ZV9tZV9waSgpCisgKiBvciBub3RoaW5nIGlmIHRoZSB1bnF1ZXVlIGlzIGRvbmUgYXMgcGFydCBvZiB0aGUgd2FrZSBwcm9jZXNzIGFuZCB0aGUgdW5xdWV1ZQorICogc3RhdGUgaXMgaW1wbGljaXQgaW4gdGhlIHN0YXRlIG9mIHdva2VuIHRhc2sgKHNlZSBmdXRleF93YWl0X3JlcXVldWVfcGkoKSBmb3IKKyAqIGFuIGV4YW1wbGUpLgorICovCiBzdGF0aWMgaW5saW5lIHZvaWQgcXVldWVfbWUoc3RydWN0IGZ1dGV4X3EgKnEsIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIpCiB7CiAJaW50IHByaW87CkBAIC0xMzczLDE5ICsxMzk1LDE3IEBACiAJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1xdWV1ZV91bmxvY2soc3RydWN0IGZ1dGV4X3EgKnEsIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIpCi17Ci0Jc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKLQlkcm9wX2Z1dGV4X2tleV9yZWZzKCZxLT5rZXkpOwotfQotCi0vKgotICogcXVldWVfbWUgYW5kIHVucXVldWVfbWUgbXVzdCBiZSBjYWxsZWQgYXMgYSBwYWlyLCBlYWNoCi0gKiBleGFjdGx5IG9uY2UuICBUaGV5IGFyZSBjYWxsZWQgd2l0aCB0aGUgaGFzaGVkIHNwaW5sb2NrIGhlbGQuCisvKioKKyAqIHVucXVldWVfbWUoKSAtIFJlbW92ZSB0aGUgZnV0ZXhfcSBmcm9tIGl0cyBmdXRleF9oYXNoX2J1Y2tldAorICogQHE6CVRoZSBmdXRleF9xIHRvIHVucXVldWUKKyAqCisgKiBUaGUgcS0+bG9ja19wdHIgbXVzdCBub3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLiBBIGNhbGwgdG8gdW5xdWV1ZV9tZSgpIG11c3QKKyAqIGJlIHBhaXJlZCB3aXRoIGV4YWN0bHkgb25lIGVhcmxpZXIgY2FsbCB0byBxdWV1ZV9tZSgpLgorICoKKyAqIFJldHVybnM6CisgKiAgIDEgLSBpZiB0aGUgZnV0ZXhfcSB3YXMgc3RpbGwgcXVldWVkIChhbmQgd2UgcmVtb3ZlZCB1bnF1ZXVlZCBpdCkKKyAqICAgMCAtIGlmIHRoZSBmdXRleF9xIHdhcyBhbHJlYWR5IHJlbW92ZWQgYnkgdGhlIHdha2luZyB0aHJlYWQKICAqLwotCi0vKiBSZXR1cm4gMSBpZiB3ZSB3ZXJlIHN0aWxsIHF1ZXVlZCAoaWUuIDAgbWVhbnMgd2Ugd2VyZSB3b2tlbikgKi8KIHN0YXRpYyBpbnQgdW5xdWV1ZV9tZShzdHJ1Y3QgZnV0ZXhfcSAqcSkKIHsKIAlzcGlubG9ja190ICpsb2NrX3B0cjsKQEAgLTE2MzgsMTcgKzE2NTgsMTQgQEAKIHN0YXRpYyB2b2lkIGZ1dGV4X3dhaXRfcXVldWVfbWUoc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYiwgc3RydWN0IGZ1dGV4X3EgKnEsCiAJCQkJc3RydWN0IGhydGltZXJfc2xlZXBlciAqdGltZW91dCkKIHsKLQlxdWV1ZV9tZShxLCBoYik7Ci0KIAkvKgotCSAqIFRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBzY2hlZHVsaW5nIHNpbmNlIHRoZSBxdWV1ZV9tZSgpLCBhcyB3ZQotCSAqIGNhbm5vdCBob2xkIGEgc3BpbmxvY2sgYWNyb3NzIHRoZSBnZXRfdXNlcigpIGluIGNhc2UgaXQKLQkgKiBmYXVsdHMsIGFuZCB3ZSBjYW5ub3QganVzdCBzZXQgVEFTS19JTlRFUlJVUFRJQkxFIHN0YXRlIHdoZW4KLQkgKiBxdWV1ZWluZyBvdXJzZWx2ZXMgaW50byB0aGUgZnV0ZXggaGFzaC4gVGhpcyBjb2RlIHRodXMgaGFzIHRvCi0JICogcmVseSBvbiB0aGUgZnV0ZXhfd2FrZSgpIGNvZGUgcmVtb3ZpbmcgdXMgZnJvbSBoYXNoIHdoZW4gaXQKLQkgKiB3YWtlcyB1cyB1cC4KKwkgKiBUaGUgdGFzayBzdGF0ZSBpcyBndWFyYW50ZWVkIHRvIGJlIHNldCBiZWZvcmUgYW5vdGhlciB0YXNrIGNhbgorCSAqIHdha2UgaXQuIHNldF9jdXJyZW50X3N0YXRlKCkgaXMgaW1wbGVtZW50ZWQgdXNpbmcgc2V0X21iKCkgYW5kCisJICogcXVldWVfbWUoKSBjYWxscyBzcGluX3VubG9jaygpIHVwb24gY29tcGxldGlvbiwgYm90aCBzZXJpYWxpemluZworCSAqIGFjY2VzcyB0byB0aGUgaGFzaCBsaXN0IGFuZCBmb3JjaW5nIGFub3RoZXIgbWVtb3J5IGJhcnJpZXIuCiAJICovCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlxdWV1ZV9tZShxLCBoYik7CiAKIAkvKiBBcm0gdGhlIHRpbWVyICovCiAJaWYgKHRpbWVvdXQpIHsKQEAgLTE2NTgsOCArMTY3NSw4IEBACiAJfQogCiAJLyoKLQkgKiAhcGxpc3Rfbm9kZV9lbXB0eSgpIGlzIHNhZmUgaGVyZSB3aXRob3V0IGFueSBsb2NrLgotCSAqIHEubG9ja19wdHIgIT0gMCBpcyBub3Qgc2FmZSwgYmVjYXVzZSBvZiBvcmRlcmluZyBhZ2FpbnN0IHdha2V1cC4KKwkgKiBJZiB3ZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBoYXNoIGxpc3QsIHRoZW4gYW5vdGhlciB0YXNrCisJICogaGFzIHRyaWVkIHRvIHdha2UgdXMsIGFuZCB3ZSBjYW4gc2tpcCB0aGUgY2FsbCB0byBzY2hlZHVsZSgpLgogCSAqLwogCWlmIChsaWtlbHkoIXBsaXN0X25vZGVfZW1wdHkoJnEtPmxpc3QpKSkgewogCQkvKgpAQCAtMTc3Niw2ICsxNzkzLDcgQEAKIAkJCQkJICAgICBjdXJyZW50LT50aW1lcl9zbGFja19ucyk7CiAJfQogCityZXRyeToKIAkvKiBQcmVwYXJlIHRvIHdhaXQgb24gdWFkZHIuICovCiAJcmV0ID0gZnV0ZXhfd2FpdF9zZXR1cCh1YWRkciwgdmFsLCBmc2hhcmVkLCAmcSwgJmhiKTsKIAlpZiAocmV0KQpAQCAtMTc5Myw5ICsxODExLDE0IEBACiAJCWdvdG8gb3V0X3B1dF9rZXk7CiAKIAkvKgotCSAqIFdlIGV4cGVjdCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSwgYnV0IGFub3RoZXIgdGhyZWFkIG1heQotCSAqIGhhdmUgaGFuZGxlZCBpdCBmb3IgdXMgYWxyZWFkeS4KKwkgKiBXZSBleHBlY3Qgc2lnbmFsX3BlbmRpbmcoY3VycmVudCksIGJ1dCB3ZSBtaWdodCBiZSB0aGUKKwkgKiB2aWN0aW0gb2YgYSBzcHVyaW91cyB3YWtldXAgYXMgd2VsbC4KIAkgKi8KKwlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJnEua2V5KTsKKwkJZ290byByZXRyeTsKKwl9CisKIAlyZXQgPSAtRVJFU1RBUlRTWVM7CiAJaWYgKCFhYnNfdGltZSkKIAkJZ290byBvdXRfcHV0X2tleTsKQEAgLTIxMDIsMTEgKzIxMjUsMTIgQEAKIAkJICogVW5xdWV1ZSB0aGUgZnV0ZXhfcSBhbmQgZGV0ZXJtaW5lIHdoaWNoIGl0IHdhcy4KIAkJICovCiAJCXBsaXN0X2RlbCgmcS0+bGlzdCwgJnEtPmxpc3QucGxpc3QpOwotCQlkcm9wX2Z1dGV4X2tleV9yZWZzKCZxLT5rZXkpOwogCisJCS8qIEhhbmRsZSBzcHVyaW91cyB3YWtldXBzIGdyYWNlZnVsbHkgKi8KKwkJcmV0ID0gLUVXT1VMREJMT0NLOwogCQlpZiAodGltZW91dCAmJiAhdGltZW91dC0+dGFzaykKIAkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCWVsc2UKKwkJZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlyZXQgPSAtRVJFU1RBUlROT0lOVFI7CiAJfQogCXJldHVybiByZXQ7CkBAIC0yMTE0LDEyICsyMTM4LDEyIEBACiAKIC8qKgogICogZnV0ZXhfd2FpdF9yZXF1ZXVlX3BpKCkgLSBXYWl0IG9uIHVhZGRyIGFuZCB0YWtlIHVhZGRyMgotICogQHVhZGRyOgl0aGUgZnV0ZXggd2UgaW5pdGlhbHlsIHdhaXQgb24gKG5vbi1waSkKKyAqIEB1YWRkcjoJdGhlIGZ1dGV4IHdlIGluaXRpYWxseSB3YWl0IG9uIChub24tcGkpCiAgKiBAZnNoYXJlZDoJd2hldGhlciB0aGUgZnV0ZXhlcyBhcmUgc2hhcmVkICgxKSBvciBub3QgKDApLiAgVGhleSBtdXN0IGJlCiAgKiAJCXRoZSBzYW1lIHR5cGUsIG5vIHJlcXVldWVpbmcgZnJvbSBwcml2YXRlIHRvIHNoYXJlZCwgZXRjLgogICogQHZhbDoJdGhlIGV4cGVjdGVkIHZhbHVlIG9mIHVhZGRyCiAgKiBAYWJzX3RpbWU6CWFic29sdXRlIHRpbWVvdXQKLSAqIEBiaXRzZXQ6CTMyIGJpdCB3YWtldXAgYml0c2V0IHNldCBieSB1c2Vyc3BhY2UsIGRlZmF1bHRzIHRvIGFsbC4KKyAqIEBiaXRzZXQ6CTMyIGJpdCB3YWtldXAgYml0c2V0IHNldCBieSB1c2Vyc3BhY2UsIGRlZmF1bHRzIHRvIGFsbAogICogQGNsb2NrcnQ6CXdoZXRoZXIgdG8gdXNlIENMT0NLX1JFQUxUSU1FICgxKSBvciBDTE9DS19NT05PVE9OSUMgKDApCiAgKiBAdWFkZHIyOgl0aGUgcGkgZnV0ZXggd2Ugd2lsbCB0YWtlIHByaW9yIHRvIHJldHVybmluZyB0byB1c2VyLXNwYWNlCiAgKgpAQCAtMjI0Niw3ICsyMjcwLDcgQEAKIAkJcmVzID0gZml4dXBfb3duZXIodWFkZHIyLCBmc2hhcmVkLCAmcSwgIXJldCk7CiAJCS8qCiAJCSAqIElmIGZpeHVwX293bmVyKCkgcmV0dXJuZWQgYW4gZXJyb3IsIHByb3Byb2dhdGUgdGhhdC4gIElmIGl0Ci0JCSAqIGFjcXVpcmVkIHRoZSBsb2NrLCBjbGVhciBvdXIgLUVUSU1FRE9VVCBvciAtRUlOVFIuCisJCSAqIGFjcXVpcmVkIHRoZSBsb2NrLCBjbGVhciAtRVRJTUVET1VUIG9yIC1FSU5UUi4KIAkJICovCiAJCWlmIChyZXMpCiAJCQlyZXQgPSAocmVzIDwgMCkgPyByZXMgOiAwOwpAQCAtMjMwMiw5ICsyMzI2LDkgQEAKICAqLwogCiAvKioKLSAqIHN5c19zZXRfcm9idXN0X2xpc3QgLSBzZXQgdGhlIHJvYnVzdC1mdXRleCBsaXN0IGhlYWQgb2YgYSB0YXNrCi0gKiBAaGVhZDogcG9pbnRlciB0byB0aGUgbGlzdC1oZWFkCi0gKiBAbGVuOiBsZW5ndGggb2YgdGhlIGxpc3QtaGVhZCwgYXMgdXNlcnNwYWNlIGV4cGVjdHMKKyAqIHN5c19zZXRfcm9idXN0X2xpc3QoKSAtIFNldCB0aGUgcm9idXN0LWZ1dGV4IGxpc3QgaGVhZCBvZiBhIHRhc2sKKyAqIEBoZWFkOglwb2ludGVyIHRvIHRoZSBsaXN0LWhlYWQKKyAqIEBsZW46CWxlbmd0aCBvZiB0aGUgbGlzdC1oZWFkLCBhcyB1c2Vyc3BhY2UgZXhwZWN0cwogICovCiBTWVNDQUxMX0RFRklORTIoc2V0X3JvYnVzdF9saXN0LCBzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKiwgaGVhZCwKIAkJc2l6ZV90LCBsZW4pCkBAIC0yMzIzLDEwICsyMzQ3LDEwIEBACiB9CiAKIC8qKgotICogc3lzX2dldF9yb2J1c3RfbGlzdCAtIGdldCB0aGUgcm9idXN0LWZ1dGV4IGxpc3QgaGVhZCBvZiBhIHRhc2sKLSAqIEBwaWQ6IHBpZCBvZiB0aGUgcHJvY2VzcyBbemVybyBmb3IgY3VycmVudCB0YXNrXQotICogQGhlYWRfcHRyOiBwb2ludGVyIHRvIGEgbGlzdC1oZWFkIHBvaW50ZXIsIHRoZSBrZXJuZWwgZmlsbHMgaXQgaW4KLSAqIEBsZW5fcHRyOiBwb2ludGVyIHRvIGEgbGVuZ3RoIGZpZWxkLCB0aGUga2VybmVsIGZpbGxzIGluIHRoZSBoZWFkZXIgc2l6ZQorICogc3lzX2dldF9yb2J1c3RfbGlzdCgpIC0gR2V0IHRoZSByb2J1c3QtZnV0ZXggbGlzdCBoZWFkIG9mIGEgdGFzaworICogQHBpZDoJcGlkIG9mIHRoZSBwcm9jZXNzIFt6ZXJvIGZvciBjdXJyZW50IHRhc2tdCisgKiBAaGVhZF9wdHI6CXBvaW50ZXIgdG8gYSBsaXN0LWhlYWQgcG9pbnRlciwgdGhlIGtlcm5lbCBmaWxscyBpdCBpbgorICogQGxlbl9wdHI6CXBvaW50ZXIgdG8gYSBsZW5ndGggZmllbGQsIHRoZSBrZXJuZWwgZmlsbHMgaW4gdGhlIGhlYWRlciBzaXplCiAgKi8KIFNZU0NBTExfREVGSU5FMyhnZXRfcm9idXN0X2xpc3QsIGludCwgcGlkLAogCQlzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKiBfX3VzZXIgKiwgaGVhZF9wdHIsCmRpZmYgLS1naXQgYS9rZXJuZWwvZ2Nvdi9LY29uZmlnIGIva2VybmVsL2djb3YvS2NvbmZpZwppbmRleCA2NTRlZmQwLi43MGEyOThkIDEwMDY0NAotLS0gYS9rZXJuZWwvZ2Nvdi9LY29uZmlnCisrKyBiL2tlcm5lbC9nY292L0tjb25maWcKQEAgLTM0LDcgKzM0LDcgQEAKIGNvbmZpZyBHQ09WX1BST0ZJTEVfQUxMCiAJYm9vbCAiUHJvZmlsZSBlbnRpcmUgS2VybmVsIgogCWRlcGVuZHMgb24gR0NPVl9LRVJORUwKLQlkZXBlbmRzIG9uIFMzOTAgfHwgWDg2IHx8IChQUEMgJiYgRVhQRVJJTUVOVEFMKQorCWRlcGVuZHMgb24gUzM5MCB8fCBYODYgfHwgKFBQQyAmJiBFWFBFUklNRU5UQUwpIHx8IE1JQ1JPQkxBWkUKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJVGhpcyBvcHRpb25zIGFjdGl2YXRlcyBwcm9maWxpbmcgZm9yIHRoZSBlbnRpcmUga2VybmVsLgpkaWZmIC0tZ2l0IGEva2VybmVsL2hydGltZXIuYyBiL2tlcm5lbC9ocnRpbWVyLmMKaW5kZXggZTVkOThjZS4uM2UxYzM2ZSAxMDA2NDQKLS0tIGEva2VybmVsL2hydGltZXIuYworKysgYi9rZXJuZWwvaHJ0aW1lci5jCkBAIC01MDksMTMgKzUwOSwxNCBAQAogICogbmV4dCBldmVudAogICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgYmFzZS0+bG9jayBoZWxkCiAgKi8KLXN0YXRpYyB2b2lkIGhydGltZXJfZm9yY2VfcmVwcm9ncmFtKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSkKK3N0YXRpYyB2b2lkCitocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UsIGludCBza2lwX2VxdWFsKQogewogCWludCBpOwogCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UgPSBjcHVfYmFzZS0+Y2xvY2tfYmFzZTsKLQlrdGltZV90IGV4cGlyZXM7CisJa3RpbWVfdCBleHBpcmVzLCBleHBpcmVzX25leHQ7CiAKLQljcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQgPSBLVElNRV9NQVg7CisJZXhwaXJlc19uZXh0LnR2NjQgPSBLVElNRV9NQVg7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKywgYmFzZSsrKSB7CiAJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKQEAgLTUzMSwxMCArNTMyLDE1IEBACiAJCSAqLwogCQlpZiAoZXhwaXJlcy50djY0IDwgMCkKIAkJCWV4cGlyZXMudHY2NCA9IDA7Ci0JCWlmIChleHBpcmVzLnR2NjQgPCBjcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQpCi0JCQljcHVfYmFzZS0+ZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKKwkJaWYgKGV4cGlyZXMudHY2NCA8IGV4cGlyZXNfbmV4dC50djY0KQorCQkJZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKIAl9CiAKKwlpZiAoc2tpcF9lcXVhbCAmJiBleHBpcmVzX25leHQudHY2NCA9PSBjcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQpCisJCXJldHVybjsKKworCWNwdV9iYXNlLT5leHBpcmVzX25leHQudHY2NCA9IGV4cGlyZXNfbmV4dC50djY0OworCiAJaWYgKGNwdV9iYXNlLT5leHBpcmVzX25leHQudHY2NCAhPSBLVElNRV9NQVgpCiAJCXRpY2tfcHJvZ3JhbV9ldmVudChjcHVfYmFzZS0+ZXhwaXJlc19uZXh0LCAxKTsKIH0KQEAgLTYxNyw3ICs2MjMsNyBAQAogCWJhc2UtPmNsb2NrX2Jhc2VbQ0xPQ0tfUkVBTFRJTUVdLm9mZnNldCA9CiAJCXRpbWVzcGVjX3RvX2t0aW1lKHJlYWx0aW1lX29mZnNldCk7CiAKLQlocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShiYXNlKTsKKwlocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShiYXNlLCAwKTsKIAlzcGluX3VubG9jaygmYmFzZS0+bG9jayk7CiB9CiAKQEAgLTcyMCw4ICs3MjYsNiBAQAogCS8qICJSZXRyaWdnZXIiIHRoZSBpbnRlcnJ1cHQgdG8gZ2V0IHRoaW5ncyBnb2luZyAqLwogCXJldHJpZ2dlcl9uZXh0X2V2ZW50KE5VTEwpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiU3dpdGNoZWQgdG8gaGlnaCByZXNvbHV0aW9uIG1vZGUgb24gQ1BVICVkXG4iLAotCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXJldHVybiAxOwogfQogCkBAIC03MzAsNyArNzM0LDggQEAKIHN0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfaHJlc19hY3RpdmUodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9pc19ocmVzX2VuYWJsZWQodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9zd2l0Y2hfdG9faHJlcyh2b2lkKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9mb3JjZV9yZXByb2dyYW0oc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmJhc2UpIHsgfQorc3RhdGljIGlubGluZSB2b2lkCitocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSwgaW50IHNraXBfZXF1YWwpIHsgfQogc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCiAJCQkJCSAgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlLAogCQkJCQkgICAgaW50IHdha2V1cCkKQEAgLTg3MywxOSArODc4LDI5IEBACiAJCQkgICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3RhdGUsIGludCByZXByb2dyYW0pCiB7Ci0JaWYgKHRpbWVyLT5zdGF0ZSAmIEhSVElNRVJfU1RBVEVfRU5RVUVVRUQpIHsKLQkJLyoKLQkJICogUmVtb3ZlIHRoZSB0aW1lciBmcm9tIHRoZSByYnRyZWUgYW5kIHJlcGxhY2UgdGhlCi0JCSAqIGZpcnN0IGVudHJ5IHBvaW50ZXIgaWYgbmVjZXNzYXJ5LgotCQkgKi8KLQkJaWYgKGJhc2UtPmZpcnN0ID09ICZ0aW1lci0+bm9kZSkgewotCQkJYmFzZS0+Zmlyc3QgPSByYl9uZXh0KCZ0aW1lci0+bm9kZSk7Ci0JCQkvKiBSZXByb2dyYW0gdGhlIGNsb2NrIGV2ZW50IGRldmljZS4gaWYgZW5hYmxlZCAqLwotCQkJaWYgKHJlcHJvZ3JhbSAmJiBocnRpbWVyX2hyZXNfYWN0aXZlKCkpCi0JCQkJaHJ0aW1lcl9mb3JjZV9yZXByb2dyYW0oYmFzZS0+Y3B1X2Jhc2UpOworCWlmICghKHRpbWVyLT5zdGF0ZSAmIEhSVElNRVJfU1RBVEVfRU5RVUVVRUQpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogUmVtb3ZlIHRoZSB0aW1lciBmcm9tIHRoZSByYnRyZWUgYW5kIHJlcGxhY2UgdGhlIGZpcnN0CisJICogZW50cnkgcG9pbnRlciBpZiBuZWNlc3NhcnkuCisJICovCisJaWYgKGJhc2UtPmZpcnN0ID09ICZ0aW1lci0+bm9kZSkgeworCQliYXNlLT5maXJzdCA9IHJiX25leHQoJnRpbWVyLT5ub2RlKTsKKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisJCS8qIFJlcHJvZ3JhbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlLiBpZiBlbmFibGVkICovCisJCWlmIChyZXByb2dyYW0gJiYgaHJ0aW1lcl9ocmVzX2FjdGl2ZSgpKSB7CisJCQlrdGltZV90IGV4cGlyZXM7CisKKwkJCWV4cGlyZXMgPSBrdGltZV9zdWIoaHJ0aW1lcl9nZXRfZXhwaXJlcyh0aW1lciksCisJCQkJCSAgICBiYXNlLT5vZmZzZXQpOworCQkJaWYgKGJhc2UtPmNwdV9iYXNlLT5leHBpcmVzX25leHQudHY2NCA9PSBleHBpcmVzLnR2NjQpCisJCQkJaHJ0aW1lcl9mb3JjZV9yZXByb2dyYW0oYmFzZS0+Y3B1X2Jhc2UsIDEpOwogCQl9Ci0JCXJiX2VyYXNlKCZ0aW1lci0+bm9kZSwgJmJhc2UtPmFjdGl2ZSk7CisjZW5kaWYKIAl9CisJcmJfZXJhc2UoJnRpbWVyLT5ub2RlLCAmYmFzZS0+YWN0aXZlKTsKK291dDoKIAl0aW1lci0+c3RhdGUgPSBuZXdzdGF0ZTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2h1bmdfdGFzay5jIGIva2VybmVsL2h1bmdfdGFzay5jCmluZGV4IDAyMmE0OTIuLmQ0ZTg0MTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9odW5nX3Rhc2suYworKysgYi9rZXJuZWwvaHVuZ190YXNrLmMKQEAgLTE3MSwxMiArMTcxLDEyIEBACiAgKiBQcm9jZXNzIHVwZGF0aW5nIG9mIHRpbWVvdXQgc3lzY3RsCiAgKi8KIGludCBwcm9jX2RvaHVuZ190YXNrX3RpbWVvdXRfc2VjcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJCSAgc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsCisJCQkJICB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCSAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldCA9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJaWYgKHJldCB8fCAhd3JpdGUpCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9oYW5kbGUuYyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKaW5kZXggYTgxY2Y4MC4uMTdjNzFiYiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9oYW5kbGUuYworKysgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2ttb2QuYyBiL2tlcm5lbC9rbW9kLmMKaW5kZXggNjg5ZDIwZi4uOWZjYjUzYSAxMDA2NDQKLS0tIGEva2VybmVsL2ttb2QuYworKysgYi9rZXJuZWwva21vZC5jCkBAIC0xNDMsNyArMTQzLDYgQEAKIHN0YXRpYyBpbnQgX19fX2NhbGxfdXNlcm1vZGVoZWxwZXIodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICpzdWJfaW5mbyA9IGRhdGE7Ci0JZW51bSB1bWhfd2FpdCB3YWl0ID0gc3ViX2luZm8tPndhaXQ7CiAJaW50IHJldHZhbDsKIAogCUJVR19PTihhdG9taWNfcmVhZCgmc3ViX2luZm8tPmNyZWQtPnVzYWdlKSAhPSAxKTsKQEAgLTE4NSwxNCArMTg0LDEwIEBACiAJICovCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAwKTsKIAotCWlmICh3YWl0ID09IFVNSF9XQUlUX0VYRUMpCi0JCWNvbXBsZXRlKHN1Yl9pbmZvLT5jb21wbGV0ZSk7Ci0KIAlyZXR2YWwgPSBrZXJuZWxfZXhlY3ZlKHN1Yl9pbmZvLT5wYXRoLCBzdWJfaW5mby0+YXJndiwgc3ViX2luZm8tPmVudnApOwogCiAJLyogRXhlYyBmYWlsZWQ/ICovCi0JaWYgKHdhaXQgIT0gVU1IX1dBSVRfRVhFQykKLQkJc3ViX2luZm8tPnJldHZhbCA9IHJldHZhbDsKKwlzdWJfaW5mby0+cmV0dmFsID0gcmV0dmFsOwogCWRvX2V4aXQoMCk7CiB9CiAKQEAgLTI3MSwxNCArMjY2LDE2IEBACiAKIAlzd2l0Y2ggKHdhaXQpIHsKIAljYXNlIFVNSF9OT19XQUlUOgotCWNhc2UgVU1IX1dBSVRfRVhFQzoKIAkJYnJlYWs7CiAKIAljYXNlIFVNSF9XQUlUX1BST0M6CiAJCWlmIChwaWQgPiAwKQogCQkJYnJlYWs7CiAJCXN1Yl9pbmZvLT5yZXR2YWwgPSBwaWQ7Ci0JCWJyZWFrOworCQkvKiBGQUxMVEhST1VHSCAqLworCisJY2FzZSBVTUhfV0FJVF9FWEVDOgorCQljb21wbGV0ZShzdWJfaW5mby0+Y29tcGxldGUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggY2ZhZGMxMi4uNTI0MGQ3NSAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC0xMzMzLDcgKzEzMzMsNyBAQAogCXJldHVybiBzZXFfb3BlbihmaWxwLCAma3Byb2Jlc19zZXFfb3BzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc19rcHJvYmVzX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2twcm9iZXNfb3BlcmF0aW9ucyA9IHsKIAkub3BlbiAgICAgICAgICAgPSBrcHJvYmVzX29wZW4sCiAJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLApAQCAtMTUxNSw3ICsxNTE1LDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfa3AgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2twID0gewogCS5yZWFkID0gICAgICAgICByZWFkX2VuYWJsZWRfZmlsZV9ib29sLAogCS53cml0ZSA9ICAgICAgICB3cml0ZV9lbmFibGVkX2ZpbGVfYm9vbCwKIH07CmRpZmYgLS1naXQgYS9rZXJuZWwva3RocmVhZC5jIGIva2VybmVsL2t0aHJlYWQuYwppbmRleCA1ZmU3MDk5Li5hYjdhZTU3IDEwMDY0NAotLS0gYS9rZXJuZWwva3RocmVhZC5jCisrKyBiL2tlcm5lbC9rdGhyZWFkLmMKQEAgLTE1MCwyOSArMTUwLDYgQEAKIEVYUE9SVF9TWU1CT0woa3RocmVhZF9jcmVhdGUpOwogCiAvKioKLSAqIGt0aHJlYWRfYmluZCAtIGJpbmQgYSBqdXN0LWNyZWF0ZWQga3RocmVhZCB0byBhIGNwdS4KLSAqIEBrOiB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgotICogQGNwdTogY3B1IChtaWdodCBub3QgYmUgb25saW5lLCBtdXN0IGJlIHBvc3NpYmxlKSBmb3IgQGsgdG8gcnVuIG9uLgotICoKLSAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0X2NwdXNfYWxsb3dlZCgpLAotICogZXhjZXB0IHRoYXQgQGNwdSBkb2Vzbid0IG5lZWQgdG8gYmUgb25saW5lLCBhbmQgdGhlIHRocmVhZCBtdXN0IGJlCi0gKiBzdG9wcGVkIChpLmUuLCBqdXN0IHJldHVybmVkIGZyb20ga3RocmVhZF9jcmVhdGUoKSkuCi0gKi8KLXZvaWQga3RocmVhZF9iaW5kKHN0cnVjdCB0YXNrX3N0cnVjdCAqaywgdW5zaWduZWQgaW50IGNwdSkKLXsKLQkvKiBNdXN0IGhhdmUgZG9uZSBzY2hlZHVsZSgpIGluIGt0aHJlYWQoKSBiZWZvcmUgd2Ugc2V0X3Rhc2tfY3B1ICovCi0JaWYgKCF3YWl0X3Rhc2tfaW5hY3RpdmUoaywgVEFTS19VTklOVEVSUlVQVElCTEUpKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybjsKLQl9Ci0Jc2V0X3Rhc2tfY3B1KGssIGNwdSk7Ci0Jay0+Y3B1c19hbGxvd2VkID0gY3B1bWFza19vZl9jcHUoY3B1KTsKLQlrLT5ydC5ucl9jcHVzX2FsbG93ZWQgPSAxOwotCWstPmZsYWdzIHw9IFBGX1RIUkVBRF9CT1VORDsKLX0KLUVYUE9SVF9TWU1CT0woa3RocmVhZF9iaW5kKTsKLQotLyoqCiAgKiBrdGhyZWFkX3N0b3AgLSBzdG9wIGEgdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KICAqIEBrOiB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgogICoKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NrZGVwLmMgYi9rZXJuZWwvbG9ja2RlcC5jCmluZGV4IDM4MTVhYzFkLi45YWY1NjcyIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NrZGVwLmMKQEAgLTE0Miw2ICsxNDIsMTEgQEAKICNpZmRlZiBDT05GSUdfTE9DS19TVEFUCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxvY2tfY2xhc3Nfc3RhdHNbTUFYX0xPQ0tERVBfS0VZU10sIGxvY2tfc3RhdHMpOwogCitzdGF0aWMgaW5saW5lIHU2NCBsb2Nrc3RhdF9jbG9jayh2b2lkKQoreworCXJldHVybiBjcHVfY2xvY2soc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKwogc3RhdGljIGludCBsb2NrX3BvaW50KHVuc2lnbmVkIGxvbmcgcG9pbnRzW10sIHVuc2lnbmVkIGxvbmcgaXApCiB7CiAJaW50IGk7CkBAIC0xNTgsNyArMTYzLDcgQEAKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIHZvaWQgbG9ja190aW1lX2luYyhzdHJ1Y3QgbG9ja190aW1lICpsdCwgczY0IHRpbWUpCitzdGF0aWMgdm9pZCBsb2NrX3RpbWVfaW5jKHN0cnVjdCBsb2NrX3RpbWUgKmx0LCB1NjQgdGltZSkKIHsKIAlpZiAodGltZSA+IGx0LT5tYXgpCiAJCWx0LT5tYXggPSB0aW1lOwpAQCAtMjM0LDEyICsyMzksMTIgQEAKIHN0YXRpYyB2b2lkIGxvY2tfcmVsZWFzZV9ob2xkdGltZShzdHJ1Y3QgaGVsZF9sb2NrICpobG9jaykKIHsKIAlzdHJ1Y3QgbG9ja19jbGFzc19zdGF0cyAqc3RhdHM7Ci0JczY0IGhvbGR0aW1lOworCXU2NCBob2xkdGltZTsKIAogCWlmICghbG9ja19zdGF0KQogCQlyZXR1cm47CiAKLQlob2xkdGltZSA9IHNjaGVkX2Nsb2NrKCkgLSBobG9jay0+aG9sZHRpbWVfc3RhbXA7CisJaG9sZHRpbWUgPSBsb2Nrc3RhdF9jbG9jaygpIC0gaGxvY2stPmhvbGR0aW1lX3N0YW1wOwogCiAJc3RhdHMgPSBnZXRfbG9ja19zdGF0cyhobG9ja19jbGFzcyhobG9jaykpOwogCWlmIChobG9jay0+cmVhZCkKQEAgLTI3OTIsNyArMjc5Nyw3IEBACiAJaGxvY2stPnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzOwogI2lmZGVmIENPTkZJR19MT0NLX1NUQVQKIAlobG9jay0+d2FpdHRpbWVfc3RhbXAgPSAwOwotCWhsb2NrLT5ob2xkdGltZV9zdGFtcCA9IHNjaGVkX2Nsb2NrKCk7CisJaGxvY2stPmhvbGR0aW1lX3N0YW1wID0gbG9ja3N0YXRfY2xvY2soKTsKICNlbmRpZgogCiAJaWYgKGNoZWNrID09IDIgJiYgIW1hcmtfaXJxZmxhZ3MoY3VyciwgaGxvY2spKQpAQCAtMzMyMiw3ICszMzI3LDcgQEAKIAlpZiAoaGxvY2stPmluc3RhbmNlICE9IGxvY2spCiAJCXJldHVybjsKIAotCWhsb2NrLT53YWl0dGltZV9zdGFtcCA9IHNjaGVkX2Nsb2NrKCk7CisJaGxvY2stPndhaXR0aW1lX3N0YW1wID0gbG9ja3N0YXRfY2xvY2soKTsKIAogCWNvbnRlbnRpb25fcG9pbnQgPSBsb2NrX3BvaW50KGhsb2NrX2NsYXNzKGhsb2NrKS0+Y29udGVudGlvbl9wb2ludCwgaXApOwogCWNvbnRlbmRpbmdfcG9pbnQgPSBsb2NrX3BvaW50KGhsb2NrX2NsYXNzKGhsb2NrKS0+Y29udGVuZGluZ19wb2ludCwKQEAgLTMzNDUsOCArMzM1MCw3IEBACiAJc3RydWN0IGhlbGRfbG9jayAqaGxvY2ssICpwcmV2X2hsb2NrOwogCXN0cnVjdCBsb2NrX2NsYXNzX3N0YXRzICpzdGF0czsKIAl1bnNpZ25lZCBpbnQgZGVwdGg7Ci0JdTY0IG5vdzsKLQlzNjQgd2FpdHRpbWUgPSAwOworCXU2NCBub3csIHdhaXR0aW1lID0gMDsKIAlpbnQgaSwgY3B1OwogCiAJZGVwdGggPSBjdXJyLT5sb2NrZGVwX2RlcHRoOwpAQCAtMzM3NCw3ICszMzc4LDcgQEAKIAogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpZiAoaGxvY2stPndhaXR0aW1lX3N0YW1wKSB7Ci0JCW5vdyA9IHNjaGVkX2Nsb2NrKCk7CisJCW5vdyA9IGxvY2tzdGF0X2Nsb2NrKCk7CiAJCXdhaXR0aW1lID0gbm93IC0gaGxvY2stPndhaXR0aW1lX3N0YW1wOwogCQlobG9jay0+aG9sZHRpbWVfc3RhbXAgPSBub3c7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IGU2YmM0YjIuLjhiN2Q4ODAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTE3OTcsNiArMTc5NywxNyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZnJlZV9tb2RpbmZvKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSAqYXR0cjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IChhdHRyID0gbW9kaW5mb19hdHRyc1tpXSk7IGkrKykgeworCQlpZiAoYXR0ci0+ZnJlZSkKKwkJCWF0dHItPmZyZWUobW9kKTsKKwl9Cit9CisKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKIAogLyogbG9va3VwIHN5bWJvbCBpbiBnaXZlbiByYW5nZSBvZiBrZXJuZWxfc3ltYm9scyAqLwpAQCAtMTg2MiwxMyArMTg3Myw5MyBAQAogCXJldHVybiAnPyc7CiB9CiAKK3N0YXRpYyBib29sIGlzX2NvcmVfc3ltYm9sKGNvbnN0IEVsZl9TeW0gKnNyYywgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hudW0pCit7CisJY29uc3QgRWxmX1NoZHIgKnNlYzsKKworCWlmIChzcmMtPnN0X3NobmR4ID09IFNITl9VTkRFRgorCSAgICB8fCBzcmMtPnN0X3NobmR4ID49IHNobnVtCisJICAgIHx8ICFzcmMtPnN0X25hbWUpCisJCXJldHVybiBmYWxzZTsKKworCXNlYyA9IHNlY2hkcnMgKyBzcmMtPnN0X3NobmR4OworCWlmICghKHNlYy0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpCisjaWZuZGVmIENPTkZJR19LQUxMU1lNU19BTEwKKwkgICAgfHwgIShzZWMtPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikKKyNlbmRpZgorCSAgICB8fCAoc2VjLT5zaF9lbnRzaXplICYgSU5JVF9PRkZTRVRfTUFTSykpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwKKwkJCQkgICBFbGZfU2hkciAqc2VjaGRycywKKwkJCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCisJCQkJICAgdW5zaWduZWQgaW50IHN0cmluZGV4LAorCQkJCSAgIGNvbnN0IEVsZl9FaGRyICpoZHIsCisJCQkJICAgY29uc3QgY2hhciAqc2Vjc3RyaW5ncywKKwkJCQkgICB1bnNpZ25lZCBsb25nICpwc3Ryb2ZmcywKKwkJCQkgICB1bnNpZ25lZCBsb25nICpzdHJtYXApCit7CisJdW5zaWduZWQgbG9uZyBzeW1vZmZzOworCUVsZl9TaGRyICpzeW1zZWN0ID0gc2VjaGRycyArIHN5bWluZGV4OworCUVsZl9TaGRyICpzdHJzZWN0ID0gc2VjaGRycyArIHN0cmluZGV4OworCWNvbnN0IEVsZl9TeW0gKnNyYzsKKwljb25zdCBjaGFyICpzdHJ0YWI7CisJdW5zaWduZWQgaW50IGksIG5zcmMsIG5kc3Q7CisKKwkvKiBQdXQgc3ltYm9sIHNlY3Rpb24gYXQgZW5kIG9mIGluaXQgcGFydCBvZiBtb2R1bGUuICovCisJc3ltc2VjdC0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DOworCXN5bXNlY3QtPnNoX2VudHNpemUgPSBnZXRfb2Zmc2V0KG1vZCwgJm1vZC0+aW5pdF9zaXplLCBzeW1zZWN0LAorCQkJCQkgc3ltaW5kZXgpIHwgSU5JVF9PRkZTRVRfTUFTSzsKKwlERUJVR1AoIlx0JXNcbiIsIHNlY3N0cmluZ3MgKyBzeW1zZWN0LT5zaF9uYW1lKTsKKworCXNyYyA9ICh2b2lkICopaGRyICsgc3ltc2VjdC0+c2hfb2Zmc2V0OworCW5zcmMgPSBzeW1zZWN0LT5zaF9zaXplIC8gc2l6ZW9mKCpzcmMpOworCXN0cnRhYiA9ICh2b2lkICopaGRyICsgc3Ryc2VjdC0+c2hfb2Zmc2V0OworCWZvciAobmRzdCA9IGkgPSAxOyBpIDwgbnNyYzsgKytpLCArK3NyYykKKwkJaWYgKGlzX2NvcmVfc3ltYm9sKHNyYywgc2VjaGRycywgaGRyLT5lX3NobnVtKSkgeworCQkJdW5zaWduZWQgaW50IGogPSBzcmMtPnN0X25hbWU7CisKKwkJCXdoaWxlKCFfX3Rlc3RfYW5kX3NldF9iaXQoaiwgc3RybWFwKSAmJiBzdHJ0YWJbal0pCisJCQkJKytqOworCQkJKytuZHN0OworCQl9CisKKwkvKiBBcHBlbmQgcm9vbSBmb3IgY29yZSBzeW1ib2xzIGF0IGVuZCBvZiBjb3JlIHBhcnQuICovCisJc3ltb2ZmcyA9IEFMSUdOKG1vZC0+Y29yZV9zaXplLCBzeW1zZWN0LT5zaF9hZGRyYWxpZ24gPzogMSk7CisJbW9kLT5jb3JlX3NpemUgPSBzeW1vZmZzICsgbmRzdCAqIHNpemVvZihFbGZfU3ltKTsKKworCS8qIFB1dCBzdHJpbmcgdGFibGUgc2VjdGlvbiBhdCBlbmQgb2YgaW5pdCBwYXJ0IG9mIG1vZHVsZS4gKi8KKwlzdHJzZWN0LT5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CisJc3Ryc2VjdC0+c2hfZW50c2l6ZSA9IGdldF9vZmZzZXQobW9kLCAmbW9kLT5pbml0X3NpemUsIHN0cnNlY3QsCisJCQkJCSBzdHJpbmRleCkgfCBJTklUX09GRlNFVF9NQVNLOworCURFQlVHUCgiXHQlc1xuIiwgc2Vjc3RyaW5ncyArIHN0cnNlY3QtPnNoX25hbWUpOworCisJLyogQXBwZW5kIHJvb20gZm9yIGNvcmUgc3ltYm9scycgc3RyaW5ncyBhdCBlbmQgb2YgY29yZSBwYXJ0LiAqLworCSpwc3Ryb2ZmcyA9IG1vZC0+Y29yZV9zaXplOworCV9fc2V0X2JpdCgwLCBzdHJtYXApOworCW1vZC0+Y29yZV9zaXplICs9IGJpdG1hcF93ZWlnaHQoc3RybWFwLCBzdHJzZWN0LT5zaF9zaXplKTsKKworCXJldHVybiBzeW1vZmZzOworfQorCiBzdGF0aWMgdm9pZCBhZGRfa2FsbHN5bXMoc3RydWN0IG1vZHVsZSAqbW9kLAogCQkJIEVsZl9TaGRyICpzZWNoZHJzLAorCQkJIHVuc2lnbmVkIGludCBzaG51bSwKIAkJCSB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCiAJCQkgdW5zaWduZWQgaW50IHN0cmluZGV4LAotCQkJIGNvbnN0IGNoYXIgKnNlY3N0cmluZ3MpCisJCQkgdW5zaWduZWQgbG9uZyBzeW1vZmZzLAorCQkJIHVuc2lnbmVkIGxvbmcgc3Ryb2ZmcywKKwkJCSBjb25zdCBjaGFyICpzZWNzdHJpbmdzLAorCQkJIHVuc2lnbmVkIGxvbmcgKnN0cm1hcCkKIHsKLQl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaSwgbmRzdDsKKwljb25zdCBFbGZfU3ltICpzcmM7CisJRWxmX1N5bSAqZHN0OworCWNoYXIgKnM7CiAKIAltb2QtPnN5bXRhYiA9ICh2b2lkICopc2VjaGRyc1tzeW1pbmRleF0uc2hfYWRkcjsKIAltb2QtPm51bV9zeW10YWIgPSBzZWNoZHJzW3N5bWluZGV4XS5zaF9zaXplIC8gc2l6ZW9mKEVsZl9TeW0pOwpAQCAtMTg3OCwxMyArMTk2OSw0NiBAQAogCWZvciAoaSA9IDA7IGkgPCBtb2QtPm51bV9zeW10YWI7IGkrKykKIAkJbW9kLT5zeW10YWJbaV0uc3RfaW5mbwogCQkJPSBlbGZfdHlwZSgmbW9kLT5zeW10YWJbaV0sIHNlY2hkcnMsIHNlY3N0cmluZ3MsIG1vZCk7CisKKwltb2QtPmNvcmVfc3ltdGFiID0gZHN0ID0gbW9kLT5tb2R1bGVfY29yZSArIHN5bW9mZnM7CisJc3JjID0gbW9kLT5zeW10YWI7CisJKmRzdCA9ICpzcmM7CisJZm9yIChuZHN0ID0gaSA9IDE7IGkgPCBtb2QtPm51bV9zeW10YWI7ICsraSwgKytzcmMpIHsKKwkJaWYgKCFpc19jb3JlX3N5bWJvbChzcmMsIHNlY2hkcnMsIHNobnVtKSkKKwkJCWNvbnRpbnVlOworCQlkc3RbbmRzdF0gPSAqc3JjOworCQlkc3RbbmRzdF0uc3RfbmFtZSA9IGJpdG1hcF93ZWlnaHQoc3RybWFwLCBkc3RbbmRzdF0uc3RfbmFtZSk7CisJCSsrbmRzdDsKKwl9CisJbW9kLT5jb3JlX251bV9zeW1zID0gbmRzdDsKKworCW1vZC0+Y29yZV9zdHJ0YWIgPSBzID0gbW9kLT5tb2R1bGVfY29yZSArIHN0cm9mZnM7CisJZm9yICgqcyA9IDAsIGkgPSAxOyBpIDwgc2VjaGRyc1tzdHJpbmRleF0uc2hfc2l6ZTsgKytpKQorCQlpZiAodGVzdF9iaXQoaSwgc3RybWFwKSkKKwkJCSorK3MgPSBtb2QtPnN0cnRhYltpXTsKIH0KICNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsCisJCQkJCSAgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkJCSAgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCQkJCQkgIHVuc2lnbmVkIGludCBzdHJpbmRleCwKKwkJCQkJICBjb25zdCBFbGZfRWhkciAqaGRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKnNlY3N0cmluZ3MsCisJCQkJCSAgdW5zaWduZWQgbG9uZyAqcHN0cm9mZnMsCisJCQkJCSAgdW5zaWduZWQgbG9uZyAqc3RybWFwKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2thbGxzeW1zKHN0cnVjdCBtb2R1bGUgKm1vZCwKIAkJCQlFbGZfU2hkciAqc2VjaGRycywKKwkJCQl1bnNpZ25lZCBpbnQgc2hudW0sCiAJCQkJdW5zaWduZWQgaW50IHN5bWluZGV4LAogCQkJCXVuc2lnbmVkIGludCBzdHJpbmRleCwKLQkJCQljb25zdCBjaGFyICpzZWNzdHJpbmdzKQorCQkJCXVuc2lnbmVkIGxvbmcgc3ltb2ZmcywKKwkJCQl1bnNpZ25lZCBsb25nIHN0cm9mZnMsCisJCQkJY29uc3QgY2hhciAqc2Vjc3RyaW5ncywKKwkJCQljb25zdCB1bnNpZ25lZCBsb25nICpzdHJtYXApCiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX0tBTExTWU1TICovCkBAIC0xOTU5LDYgKzIwODMsOCBAQAogCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAlsb25nIGVyciA9IDA7CiAJdm9pZCAqcGVyY3B1ID0gTlVMTCwgKnB0ciA9IE5VTEw7IC8qIFN0b3BzIHNwdXJpb3VzIGdjYyB3YXJuaW5nICovCisJdW5zaWduZWQgbG9uZyBzeW1vZmZzLCBzdHJvZmZzLCAqc3RybWFwOworCiAJbW1fc2VnbWVudF90IG9sZF9mczsKIAogCURFQlVHUCgibG9hZF9tb2R1bGU6IHVtb2Q9JXAsIGxlbj0lbHUsIHVhcmdzPSVwXG4iLApAQCAtMjA0MCwxMSArMjE2Niw2IEBACiAJLyogRG9uJ3Qga2VlcCBtb2RpbmZvIGFuZCB2ZXJzaW9uIHNlY3Rpb25zLiAqLwogCXNlY2hkcnNbaW5mb2luZGV4XS5zaF9mbGFncyAmPSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwogCXNlY2hkcnNbdmVyc2luZGV4XS5zaF9mbGFncyAmPSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwotI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCS8qIEtlZXAgc3ltYm9sIGFuZCBzdHJpbmcgdGFibGVzIGZvciBkZWNvZGluZyBsYXRlci4gKi8KLQlzZWNoZHJzW3N5bWluZGV4XS5zaF9mbGFncyB8PSBTSEZfQUxMT0M7Ci0Jc2VjaGRyc1tzdHJpbmRleF0uc2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwotI2VuZGlmCiAKIAkvKiBDaGVjayBtb2R1bGUgc3RydWN0IHZlcnNpb24gbm93LCBiZWZvcmUgd2UgdHJ5IHRvIHVzZSBtb2R1bGUuICovCiAJaWYgKCFjaGVja19tb2RzdHJ1Y3RfdmVyc2lvbihzZWNoZHJzLCB2ZXJzaW5kZXgsIG1vZCkpIHsKQEAgLTIwODAsNiArMjIwMSwxMyBAQAogCQlnb3RvIGZyZWVfaGRyOwogCX0KIAorCXN0cm1hcCA9IGt6YWxsb2MoQklUU19UT19MT05HUyhzZWNoZHJzW3N0cmluZGV4XS5zaF9zaXplKQorCQkJICogc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cm1hcCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfbW9kOworCX0KKwogCWlmIChmaW5kX21vZHVsZShtb2QtPm5hbWUpKSB7CiAJCWVyciA9IC1FRVhJU1Q7CiAJCWdvdG8gZnJlZV9tb2Q7CkBAIC0yMTA5LDYgKzIyMzcsOCBAQAogCSAgIHRoaXMgaXMgZG9uZSBnZW5lcmljYWxseTsgdGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55CiAJICAgc3BlY2lhbCBjYXNlcyBmb3IgdGhlIGFyY2hpdGVjdHVyZXMuICovCiAJbGF5b3V0X3NlY3Rpb25zKG1vZCwgaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzKTsKKwlzeW1vZmZzID0gbGF5b3V0X3N5bXRhYihtb2QsIHNlY2hkcnMsIHN5bWluZGV4LCBzdHJpbmRleCwgaGRyLAorCQkJCXNlY3N0cmluZ3MsICZzdHJvZmZzLCBzdHJtYXApOwogCiAJLyogRG8gdGhlIGFsbG9jcy4gKi8KIAlwdHIgPSBtb2R1bGVfYWxsb2NfdXBkYXRlX2JvdW5kcyhtb2QtPmNvcmVfc2l6ZSk7CkBAIC0yMzEzLDcgKzI0NDMsMTAgQEAKIAlwZXJjcHVfbW9kY29weShtb2QtPnBlcmNwdSwgKHZvaWQgKilzZWNoZHJzW3BjcHVpbmRleF0uc2hfYWRkciwKIAkJICAgICAgIHNlY2hkcnNbcGNwdWluZGV4XS5zaF9zaXplKTsKIAotCWFkZF9rYWxsc3ltcyhtb2QsIHNlY2hkcnMsIHN5bWluZGV4LCBzdHJpbmRleCwgc2Vjc3RyaW5ncyk7CisJYWRkX2thbGxzeW1zKG1vZCwgc2VjaGRycywgaGRyLT5lX3NobnVtLCBzeW1pbmRleCwgc3RyaW5kZXgsCisJCSAgICAgc3ltb2Zmcywgc3Ryb2Zmcywgc2Vjc3RyaW5ncywgc3RybWFwKTsKKwlrZnJlZShzdHJtYXApOworCXN0cm1hcCA9IE5VTEw7CiAKIAlpZiAoIW1vZC0+dGFpbnRzKSB7CiAJCXN0cnVjdCBfZGRlYnVnICpkZWJ1ZzsKQEAgLTIzODUsMTMgKzI1MTgsMTQgQEAKIAlzeW5jaHJvbml6ZV9zY2hlZCgpOwogCW1vZHVsZV9hcmNoX2NsZWFudXAobW9kKTsKICBjbGVhbnVwOgorCWZyZWVfbW9kaW5mbyhtb2QpOwogCWtvYmplY3RfZGVsKCZtb2QtPm1rb2JqLmtvYmopOwogCWtvYmplY3RfcHV0KCZtb2QtPm1rb2JqLmtvYmopOwogIGZyZWVfdW5sb2FkOgogCW1vZHVsZV91bmxvYWRfZnJlZShtb2QpOwogI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRV9VTkxPQUQpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKLSBmcmVlX2luaXQ6CiAJcGVyY3B1X21vZGZyZWUobW9kLT5yZWZwdHIpOworIGZyZWVfaW5pdDoKICNlbmRpZgogCW1vZHVsZV9mcmVlKG1vZCwgbW9kLT5tb2R1bGVfaW5pdCk7CiAgZnJlZV9jb3JlOgpAQCAtMjQwMiw2ICsyNTM2LDcgQEAKIAkJcGVyY3B1X21vZGZyZWUocGVyY3B1KTsKICBmcmVlX21vZDoKIAlrZnJlZShhcmdzKTsKKwlrZnJlZShzdHJtYXApOwogIGZyZWVfaGRyOgogCXZmcmVlKGhkcik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTI0OTEsNiArMjYyNiwxMSBAQAogCS8qIERyb3AgaW5pdGlhbCByZWZlcmVuY2UuICovCiAJbW9kdWxlX3B1dChtb2QpOwogCXRyaW1faW5pdF9leHRhYmxlKG1vZCk7CisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisJbW9kLT5udW1fc3ltdGFiID0gbW9kLT5jb3JlX251bV9zeW1zOworCW1vZC0+c3ltdGFiID0gbW9kLT5jb3JlX3N5bXRhYjsKKwltb2QtPnN0cnRhYiA9IG1vZC0+Y29yZV9zdHJ0YWI7CisjZW5kaWYKIAltb2R1bGVfZnJlZShtb2QsIG1vZC0+bW9kdWxlX2luaXQpOwogCW1vZC0+bW9kdWxlX2luaXQgPSBOVUxMOwogCW1vZC0+aW5pdF9zaXplID0gMDsKQEAgLTI5NTIsNyArMzA5Miw2IEBACiAJCSAgIHN0cnVjdCBtb2R2ZXJzaW9uX2luZm8gKnZlciwKIAkJICAgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3AsCiAJCSAgIHN0cnVjdCBrZXJuZWxfc3ltYm9sICprcywKLQkJICAgc3RydWN0IG1hcmtlciAqbWFya2VyLAogCQkgICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdHApCiB7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXgtZGVidWcuYyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCmluZGV4IDUwZDAyMmUuLmVjODE1YTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCisrKyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9uc19jZ3JvdXAuYyBiL2tlcm5lbC9uc19jZ3JvdXAuYwppbmRleCA1YWE4NTRmLi4yYTVkZmVjIDEwMDY0NAotLS0gYS9rZXJuZWwvbnNfY2dyb3VwLmMKKysrIGIva2VybmVsL25zX2Nncm91cC5jCkBAIC00Miw4ICs0Miw4IEBACiAgKiAgICAgICAoaGVuY2UgZWl0aGVyIHlvdSBhcmUgaW4gdGhlIHNhbWUgY2dyb3VwIGFzIHRhc2ssIG9yIGluIGFuCiAgKiAgICAgICAgYW5jZXN0b3IgY2dyb3VwIHRoZXJlb2YpCiAgKi8KLXN0YXRpYyBpbnQgbnNfY2FuX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCi0JCXN0cnVjdCBjZ3JvdXAgKm5ld19jZ3JvdXAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyBpbnQgbnNfY2FuX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKm5ld19jZ3JvdXAsCisJCQkgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBib29sIHRocmVhZGdyb3VwKQogewogCWlmIChjdXJyZW50ICE9IHRhc2spIHsKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQpAQCAtNTYsNiArNTYsMTggQEAKIAlpZiAoIWNncm91cF9pc19kZXNjZW5kYW50KG5ld19jZ3JvdXAsIHRhc2spKQogCQlyZXR1cm4gLUVQRVJNOwogCisJaWYgKHRocmVhZGdyb3VwKSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqYzsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjLCAmdGFzay0+dGhyZWFkX2dyb3VwLCB0aHJlYWRfZ3JvdXApIHsKKwkJCWlmICghY2dyb3VwX2lzX2Rlc2NlbmRhbnQobmV3X2Nncm91cCwgYykpIHsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJfQorCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcGFuaWMuYyBiL2tlcm5lbC9wYW5pYy5jCmluZGV4IGJjZGVmMjYuLjk2YjQ1ZDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYW5pYy5jCisrKyBiL2tlcm5lbC9wYW5pYy5jCkBAIC05MCw2ICs5MCw4IEBACiAKIAlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmcGFuaWNfbm90aWZpZXJfbGlzdCwgMCwgYnVmKTsKIAorCWJ1c3Rfc3BpbmxvY2tzKDApOworCiAJaWYgKCFwYW5pY19ibGluaykKIAkJcGFuaWNfYmxpbmsgPSBub19ibGluazsKIApAQCAtMTM2LDcgKzEzOCw2IEBACiAJCW1kZWxheSgxKTsKIAkJaSsrOwogCX0KLQlidXN0X3NwaW5sb2NrcygwKTsKIH0KIAogRVhQT1JUX1NZTUJPTChwYW5pYyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcGFyYW1zLmMgYi9rZXJuZWwvcGFyYW1zLmMKaW5kZXggN2Y2OTEyYy4uZDY1NmMyNyAxMDA2NDQKLS0tIGEva2VybmVsL3BhcmFtcy5jCisrKyBiL2tlcm5lbC9wYXJhbXMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC04Nyw3ICs4OCw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgYXJnc1tpXTsgaSsrKSB7Ci0JCWlmIChhcmdzW2ldID09ICcgJyAmJiAhaW5fcXVvdGUpCisJCWlmIChpc3NwYWNlKGFyZ3NbaV0pICYmICFpbl9xdW90ZSkKIAkJCWJyZWFrOwogCQlpZiAoZXF1YWxzID09IDApIHsKIAkJCWlmIChhcmdzW2ldID09ICc9JykKQEAgLTEyMSw3ICsxMjIsNyBAQAogCQluZXh0ID0gYXJncyArIGk7CiAKIAkvKiBDaGV3IHVwIHRyYWlsaW5nIHNwYWNlcy4gKi8KLQl3aGlsZSAoKm5leHQgPT0gJyAnKQorCXdoaWxlIChpc3NwYWNlKCpuZXh0KSkKIAkJbmV4dCsrOwogCXJldHVybiBuZXh0OwogfQpAQCAtMTM4LDcgKzEzOSw3IEBACiAJREVCVUdQKCJQYXJzaW5nIEFSR1M6ICVzXG4iLCBhcmdzKTsKIAogCS8qIENoZXcgbGVhZGluZyBzcGFjZXMgKi8KLQl3aGlsZSAoKmFyZ3MgPT0gJyAnKQorCXdoaWxlIChpc3NwYWNlKCphcmdzKSkKIAkJYXJncysrOwogCiAJd2hpbGUgKCphcmdzKSB7CkBAIC0yMTcsMTUgKzIxOCwxMSBAQAogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAKLQlpZiAoa3AtPmZsYWdzICYgS1BBUkFNX0tNQUxMT0NFRCkKLQkJa2ZyZWUoKihjaGFyICoqKWtwLT5hcmcpOwotCiAJLyogVGhpcyBpcyBhIGhhY2suICBXZSBjYW4ndCBuZWVkIHRvIHN0cmR1cCBpbiBlYXJseSBib290LCBhbmQgd2UKIAkgKiBkb24ndCBuZWVkIHRvOyB0aGlzIG1hbmdsZWQgY29tbWFuZGxpbmUgaXMgcHJlc2VydmVkLiAqLwogCWlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKSB7Ci0JCWtwLT5mbGFncyB8PSBLUEFSQU1fS01BTExPQ0VEOwogCQkqKGNoYXIgKiopa3AtPmFyZyA9IGtzdHJkdXAodmFsLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFrcC0+YXJnKQorCQlpZiAoISooY2hhciAqKilrcC0+YXJnKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfSBlbHNlCiAJCSooY29uc3QgY2hhciAqKilrcC0+YXJnID0gdmFsOwpAQCAtMzAzLDYgKzMwMCw3IEBACiAJCSAgICAgICB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4LAogCQkgICAgICAgdm9pZCAqZWxlbSwgaW50IGVsZW1zaXplLAogCQkgICAgICAgaW50ICgqc2V0KShjb25zdCBjaGFyICosIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKSwKKwkJICAgICAgIHUxNiBmbGFncywKIAkJICAgICAgIHVuc2lnbmVkIGludCAqbnVtKQogewogCWludCByZXQ7CkBAIC0zMTIsNiArMzEwLDcgQEAKIAkvKiBHZXQgdGhlIG5hbWUgcmlnaHQgZm9yIGVycm9ycy4gKi8KIAlrcC5uYW1lID0gbmFtZTsKIAlrcC5hcmcgPSBlbGVtOworCWtwLmZsYWdzID0gZmxhZ3M7CiAKIAkvKiBObyBlcXVhbHMgc2lnbj8gKi8KIAlpZiAoIXZhbCkgewpAQCAtMzU3LDcgKzM1Niw4IEBACiAJdW5zaWduZWQgaW50IHRlbXBfbnVtOwogCiAJcmV0dXJuIHBhcmFtX2FycmF5KGtwLT5uYW1lLCB2YWwsIDEsIGFyci0+bWF4LCBhcnItPmVsZW0sCi0JCQkgICBhcnItPmVsZW1zaXplLCBhcnItPnNldCwgYXJyLT5udW0gPzogJnRlbXBfbnVtKTsKKwkJCSAgIGFyci0+ZWxlbXNpemUsIGFyci0+c2V0LCBrcC0+ZmxhZ3MsCisJCQkgICBhcnItPm51bSA/OiAmdGVtcF9udW0pOwogfQogCiBpbnQgcGFyYW1fYXJyYXlfZ2V0KGNoYXIgKmJ1ZmZlciwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCkBAIC02MDQsMTEgKzYwNCw3IEBACiAKIHZvaWQgZGVzdHJveV9wYXJhbXMoY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbSAqcGFyYW1zLCB1bnNpZ25lZCBudW0pCiB7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCi0JCWlmIChwYXJhbXNbaV0uZmxhZ3MgJiBLUEFSQU1fS01BTExPQ0VEKQotCQkJa2ZyZWUoKihjaGFyICoqKXBhcmFtc1tpXS5hcmcpOworCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBmcmVlIGttYWxsb2NlZCBjaGFycCBwYXJhbWV0ZXJzLiAgSXQgZG9lc24ndC4gKi8KIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGtlcm5lbF9hZGRfc3lzZnNfcGFyYW0oY29uc3QgY2hhciAqbmFtZSwKZGlmZiAtLWdpdCBhL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDc2YWM0ZGIuLjdmMjk2NDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Ztc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KQEAgLTEwMzAsMTQgKzEwMzEsMTAgQEAKIAl1cGRhdGVfY29udGV4dF90aW1lKGN0eCk7CiAKIAlwZXJmX2Rpc2FibGUoKTsKLQlpZiAoY3R4LT5ucl9hY3RpdmUpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJmN0eC0+Z3JvdXBfbGlzdCwgZ3JvdXBfZW50cnkpIHsKLQkJCWlmIChldmVudCAhPSBldmVudC0+Z3JvdXBfbGVhZGVyKQotCQkJCWV2ZW50X3NjaGVkX291dChldmVudCwgY3B1Y3R4LCBjdHgpOwotCQkJZWxzZQotCQkJCWdyb3VwX3NjaGVkX291dChldmVudCwgY3B1Y3R4LCBjdHgpOwotCQl9Ci0JfQorCWlmIChjdHgtPm5yX2FjdGl2ZSkKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJmN0eC0+Z3JvdXBfbGlzdCwgZ3JvdXBfZW50cnkpCisJCQlncm91cF9zY2hlZF9vdXQoZXZlbnQsIGNwdWN0eCwgY3R4KTsKKwogCXBlcmZfZW5hYmxlKCk7CiAgb3V0OgogCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOwpAQCAtMTI1OCwxMiArMTI1NSw4IEBACiAJCWlmIChldmVudC0+Y3B1ICE9IC0xICYmIGV2ZW50LT5jcHUgIT0gY3B1KQogCQkJY29udGludWU7CiAKLQkJaWYgKGV2ZW50ICE9IGV2ZW50LT5ncm91cF9sZWFkZXIpCi0JCQlldmVudF9zY2hlZF9pbihldmVudCwgY3B1Y3R4LCBjdHgsIGNwdSk7Ci0JCWVsc2UgewotCQkJaWYgKGdyb3VwX2Nhbl9nb19vbihldmVudCwgY3B1Y3R4LCAxKSkKLQkJCQlncm91cF9zY2hlZF9pbihldmVudCwgY3B1Y3R4LCBjdHgsIGNwdSk7Ci0JCX0KKwkJaWYgKGdyb3VwX2Nhbl9nb19vbihldmVudCwgY3B1Y3R4LCAxKSkKKwkJCWdyb3VwX3NjaGVkX2luKGV2ZW50LCBjcHVjdHgsIGN0eCwgY3B1KTsKIAogCQkvKgogCQkgKiBJZiB0aGlzIHBpbm5lZCBncm91cCBoYXNuJ3QgYmVlbiBzY2hlZHVsZWQsCkBAIC0xMjkxLDE1ICsxMjg0LDkgQEAKIAkJaWYgKGV2ZW50LT5jcHUgIT0gLTEgJiYgZXZlbnQtPmNwdSAhPSBjcHUpCiAJCQljb250aW51ZTsKIAotCQlpZiAoZXZlbnQgIT0gZXZlbnQtPmdyb3VwX2xlYWRlcikgewotCQkJaWYgKGV2ZW50X3NjaGVkX2luKGV2ZW50LCBjcHVjdHgsIGN0eCwgY3B1KSkKKwkJaWYgKGdyb3VwX2Nhbl9nb19vbihldmVudCwgY3B1Y3R4LCBjYW5fYWRkX2h3KSkKKwkJCWlmIChncm91cF9zY2hlZF9pbihldmVudCwgY3B1Y3R4LCBjdHgsIGNwdSkpCiAJCQkJY2FuX2FkZF9odyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ3JvdXBfY2FuX2dvX29uKGV2ZW50LCBjcHVjdHgsIGNhbl9hZGRfaHcpKSB7Ci0JCQkJaWYgKGdyb3VwX3NjaGVkX2luKGV2ZW50LCBjcHVjdHgsIGN0eCwgY3B1KSkKLQkJCQkJY2FuX2FkZF9odyA9IDA7Ci0JCQl9Ci0JCX0KIAl9CiAJcGVyZl9lbmFibGUoKTsKICBvdXQ6CkBAIC0xMzY4LDcgKzEzNTUsNyBAQAogCXU2NCBpbnRlcnJ1cHRzLCBmcmVxOwogCiAJc3Bpbl9sb2NrKCZjdHgtPmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZjdHgtPmdyb3VwX2xpc3QsIGdyb3VwX2VudHJ5KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZXZlbnQsICZjdHgtPmV2ZW50X2xpc3QsIGV2ZW50X2VudHJ5KSB7CiAJCWlmIChldmVudC0+c3RhdGUgIT0gUEVSRl9FVkVOVF9TVEFURV9BQ1RJVkUpCiAJCQljb250aW51ZTsKIApAQCAtMjEwNSw0OSArMjA5MiwzMSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCi1zdGF0aWMgaW50IHBlcmZfbW1hcF9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJmX2RhdGFfc2l6ZShzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOwotCWludCByZXQgPSBWTV9GQVVMVF9TSUdCVVM7Ci0KLQlpZiAodm1mLT5mbGFncyAmIEZBVUxUX0ZMQUdfTUtXUklURSkgewotCQlpZiAodm1mLT5wZ29mZiA9PSAwKQotCQkJcmV0ID0gMDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JZGF0YSA9IHJjdV9kZXJlZmVyZW5jZShldmVudC0+ZGF0YSk7Ci0JaWYgKCFkYXRhKQotCQlnb3RvIHVubG9jazsKLQotCWlmICh2bWYtPnBnb2ZmID09IDApIHsKLQkJdm1mLT5wYWdlID0gdmlydF90b19wYWdlKGRhdGEtPnVzZXJfcGFnZSk7Ci0JfSBlbHNlIHsKLQkJaW50IG5yID0gdm1mLT5wZ29mZiAtIDE7Ci0KLQkJaWYgKCh1bnNpZ25lZCluciA+IGRhdGEtPm5yX3BhZ2VzKQotCQkJZ290byB1bmxvY2s7Ci0KLQkJaWYgKHZtZi0+ZmxhZ3MgJiBGQVVMVF9GTEFHX1dSSVRFKQotCQkJZ290byB1bmxvY2s7Ci0KLQkJdm1mLT5wYWdlID0gdmlydF90b19wYWdlKGRhdGEtPmRhdGFfcGFnZXNbbnJdKTsKLQl9Ci0KLQlnZXRfcGFnZSh2bWYtPnBhZ2UpOwotCXZtZi0+cGFnZS0+bWFwcGluZyA9IHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nOwotCXZtZi0+cGFnZS0+aW5kZXggICA9IHZtZi0+cGdvZmY7Ci0KLQlyZXQgPSAwOwotdW5sb2NrOgotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZGF0YS0+bnJfcGFnZXMgPDwgKFBBR0VfU0hJRlQgKyBkYXRhLT5kYXRhX29yZGVyKTsKIH0KIAotc3RhdGljIGludCBwZXJmX21tYXBfZGF0YV9hbGxvYyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBucl9wYWdlcykKKyNpZm5kZWYgQ09ORklHX1BFUkZfVVNFX1ZNQUxMT0MKKworLyoKKyAqIEJhY2sgcGVyZl9tbWFwKCkgd2l0aCByZWd1bGFyIEdGUF9LRVJORUwtMCBwYWdlcy4KKyAqLworCitzdGF0aWMgc3RydWN0IHBhZ2UgKgorcGVyZl9tbWFwX3RvX3BhZ2Uoc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCWlmIChwZ29mZiA+IGRhdGEtPm5yX3BhZ2VzKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChwZ29mZiA9PSAwKQorCQlyZXR1cm4gdmlydF90b19wYWdlKGRhdGEtPnVzZXJfcGFnZSk7CisKKwlyZXR1cm4gdmlydF90b19wYWdlKGRhdGEtPmRhdGFfcGFnZXNbcGdvZmYgLSAxXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKgorcGVyZl9tbWFwX2RhdGFfYWxsb2Moc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbnJfcGFnZXMpCiB7CiAJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKQEAgLTIxNzIsMTkgKzIxNDEsMTAgQEAKIAkJCWdvdG8gZmFpbF9kYXRhX3BhZ2VzOwogCX0KIAorCWRhdGEtPmRhdGFfb3JkZXIgPSAwOwogCWRhdGEtPm5yX3BhZ2VzID0gbnJfcGFnZXM7Ci0JYXRvbWljX3NldCgmZGF0YS0+bG9jaywgLTEpOwogCi0JaWYgKGV2ZW50LT5hdHRyLndhdGVybWFyaykgewotCQlkYXRhLT53YXRlcm1hcmsgPSBtaW5fdChsb25nLCBQQUdFX1NJWkUgKiBucl9wYWdlcywKLQkJCQkgICAgICBldmVudC0+YXR0ci53YWtldXBfd2F0ZXJtYXJrKTsKLQl9Ci0JaWYgKCFkYXRhLT53YXRlcm1hcmspCi0JCWRhdGEtPndhdGVybWFyayA9IG1heChQQUdFX1NJWkUsIFBBR0VfU0laRSAqIG5yX3BhZ2VzIC8gNCk7Ci0KLQlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPmRhdGEsIGRhdGEpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGRhdGE7CiAKIGZhaWxfZGF0YV9wYWdlczoKIAlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCkBAIC0yMTk2LDcgKzIxNTYsNyBAQAogCWtmcmVlKGRhdGEpOwogCiBmYWlsOgotCXJldHVybiAtRU5PTUVNOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBwZXJmX21tYXBfZnJlZV9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkcikKQEAgLTIyMDcsMjggKzIxNjcsMTY5IEBACiAJX19mcmVlX3BhZ2UocGFnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fcGVyZl9tbWFwX2RhdGFfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKnJjdV9oZWFkKQorc3RhdGljIHZvaWQgcGVyZl9tbWFwX2RhdGFfZnJlZShzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOwogCWludCBpOwogCi0JZGF0YSA9IGNvbnRhaW5lcl9vZihyY3VfaGVhZCwgc3RydWN0IHBlcmZfbW1hcF9kYXRhLCByY3VfaGVhZCk7Ci0KIAlwZXJmX21tYXBfZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWRhdGEtPnVzZXJfcGFnZSk7CiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yX3BhZ2VzOyBpKyspCiAJCXBlcmZfbW1hcF9mcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YS0+ZGF0YV9wYWdlc1tpXSk7Cit9CiAKKyNlbHNlCisKKy8qCisgKiBCYWNrIHBlcmZfbW1hcCgpIHdpdGggdm1hbGxvYyBtZW1vcnkuCisgKgorICogUmVxdWlyZWQgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBoYXZlIGQtY2FjaGUgYWxpYXNpbmcgaXNzdWVzLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqCitwZXJmX21tYXBfdG9fcGFnZShzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCit7CisJaWYgKHBnb2ZmID4gKDFVTCA8PCBkYXRhLT5kYXRhX29yZGVyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdm1hbGxvY190b19wYWdlKCh2b2lkICopZGF0YS0+dXNlcl9wYWdlICsgcGdvZmYgKiBQQUdFX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX21tYXBfdW5tYXJrX3BhZ2Uodm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZtYWxsb2NfdG9fcGFnZShhZGRyKTsKKworCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwZXJmX21tYXBfZGF0YV9mcmVlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YTsKKwl2b2lkICpiYXNlOworCWludCBpLCBucjsKKworCWRhdGEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBlcmZfbW1hcF9kYXRhLCB3b3JrKTsKKwluciA9IDEgPDwgZGF0YS0+ZGF0YV9vcmRlcjsKKworCWJhc2UgPSBkYXRhLT51c2VyX3BhZ2U7CisJZm9yIChpID0gMDsgaSA8IG5yICsgMTsgaSsrKQorCQlwZXJmX21tYXBfdW5tYXJrX3BhZ2UoYmFzZSArIChpICogUEFHRV9TSVpFKSk7CisKKwl2ZnJlZShiYXNlKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9tbWFwX2RhdGFfZnJlZShzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEpCit7CisJc2NoZWR1bGVfd29yaygmZGF0YS0+d29yayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKgorcGVyZl9tbWFwX2RhdGFfYWxsb2Moc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbnJfcGFnZXMpCit7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl2b2lkICphbGxfYnVmOworCisJV0FSTl9PTihhdG9taWNfcmVhZCgmZXZlbnQtPm1tYXBfY291bnQpKTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IHBlcmZfbW1hcF9kYXRhKTsKKwlzaXplICs9IHNpemVvZih2b2lkICopOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlnb3RvIGZhaWw7CisKKwlJTklUX1dPUksoJmRhdGEtPndvcmssIHBlcmZfbW1hcF9kYXRhX2ZyZWVfd29yayk7CisKKwlhbGxfYnVmID0gdm1hbGxvY191c2VyKChucl9wYWdlcyArIDEpICogUEFHRV9TSVpFKTsKKwlpZiAoIWFsbF9idWYpCisJCWdvdG8gZmFpbF9hbGxfYnVmOworCisJZGF0YS0+dXNlcl9wYWdlID0gYWxsX2J1ZjsKKwlkYXRhLT5kYXRhX3BhZ2VzWzBdID0gYWxsX2J1ZiArIFBBR0VfU0laRTsKKwlkYXRhLT5kYXRhX29yZGVyID0gaWxvZzIobnJfcGFnZXMpOworCWRhdGEtPm5yX3BhZ2VzID0gMTsKKworCXJldHVybiBkYXRhOworCitmYWlsX2FsbF9idWY6CisJa2ZyZWUoZGF0YSk7CisKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHBlcmZfbW1hcF9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCWludCByZXQgPSBWTV9GQVVMVF9TSUdCVVM7CisKKwlpZiAodm1mLT5mbGFncyAmIEZBVUxUX0ZMQUdfTUtXUklURSkgeworCQlpZiAodm1mLT5wZ29mZiA9PSAwKQorCQkJcmV0ID0gMDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZGF0YSA9IHJjdV9kZXJlZmVyZW5jZShldmVudC0+ZGF0YSk7CisJaWYgKCFkYXRhKQorCQlnb3RvIHVubG9jazsKKworCWlmICh2bWYtPnBnb2ZmICYmICh2bWYtPmZsYWdzICYgRkFVTFRfRkxBR19XUklURSkpCisJCWdvdG8gdW5sb2NrOworCisJdm1mLT5wYWdlID0gcGVyZl9tbWFwX3RvX3BhZ2UoZGF0YSwgdm1mLT5wZ29mZik7CisJaWYgKCF2bWYtPnBhZ2UpCisJCWdvdG8gdW5sb2NrOworCisJZ2V0X3BhZ2Uodm1mLT5wYWdlKTsKKwl2bWYtPnBhZ2UtPm1hcHBpbmcgPSB2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZzsKKwl2bWYtPnBhZ2UtPmluZGV4ICAgPSB2bWYtPnBnb2ZmOworCisJcmV0ID0gMDsKK3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitwZXJmX21tYXBfZGF0YV9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhKQoreworCWxvbmcgbWF4X3NpemUgPSBwZXJmX2RhdGFfc2l6ZShkYXRhKTsKKworCWF0b21pY19zZXQoJmRhdGEtPmxvY2ssIC0xKTsKKworCWlmIChldmVudC0+YXR0ci53YXRlcm1hcmspIHsKKwkJZGF0YS0+d2F0ZXJtYXJrID0gbWluX3QobG9uZywgbWF4X3NpemUsCisJCQkJCWV2ZW50LT5hdHRyLndha2V1cF93YXRlcm1hcmspOworCX0KKworCWlmICghZGF0YS0+d2F0ZXJtYXJrKQorCQlkYXRhLT53YXRlcm1hcmsgPSBtYXhfdChsb25nLCBQQUdFX1NJWkUsIG1heF9zaXplIC8gMik7CisKKworCXJjdV9hc3NpZ25fcG9pbnRlcihldmVudC0+ZGF0YSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfbW1hcF9kYXRhX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1X2hlYWQpCit7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCisJZGF0YSA9IGNvbnRhaW5lcl9vZihyY3VfaGVhZCwgc3RydWN0IHBlcmZfbW1hcF9kYXRhLCByY3VfaGVhZCk7CisJcGVyZl9tbWFwX2RhdGFfZnJlZShkYXRhKTsKIAlrZnJlZShkYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9tbWFwX2RhdGFfZnJlZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCitzdGF0aWMgdm9pZCBwZXJmX21tYXBfZGF0YV9yZWxlYXNlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEgPSBldmVudC0+ZGF0YTsKIAogCVdBUk5fT04oYXRvbWljX3JlYWQoJmV2ZW50LT5tbWFwX2NvdW50KSk7CiAKIAlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPmRhdGEsIE5VTEwpOwotCWNhbGxfcmN1KCZkYXRhLT5yY3VfaGVhZCwgX19wZXJmX21tYXBfZGF0YV9mcmVlKTsKKwljYWxsX3JjdSgmZGF0YS0+cmN1X2hlYWQsIHBlcmZfbW1hcF9kYXRhX2ZyZWVfcmN1KTsKIH0KIAogc3RhdGljIHZvaWQgcGVyZl9tbWFwX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCkBAIC0yMjQ0LDE2ICsyMzQ1LDE3IEBACiAKIAlXQVJOX09OX09OQ0UoZXZlbnQtPmN0eC0+cGFyZW50X2N0eCk7CiAJaWYgKGF0b21pY19kZWNfYW5kX211dGV4X2xvY2soJmV2ZW50LT5tbWFwX2NvdW50LCAmZXZlbnQtPm1tYXBfbXV0ZXgpKSB7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHBlcmZfZGF0YV9zaXplKGV2ZW50LT5kYXRhKTsKIAkJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyID0gY3VycmVudF91c2VyKCk7CiAKLQkJYXRvbWljX2xvbmdfc3ViKGV2ZW50LT5kYXRhLT5ucl9wYWdlcyArIDEsICZ1c2VyLT5sb2NrZWRfdm0pOworCQlhdG9taWNfbG9uZ19zdWIoKHNpemUgPj4gUEFHRV9TSElGVCkgKyAxLCAmdXNlci0+bG9ja2VkX3ZtKTsKIAkJdm1hLT52bV9tbS0+bG9ja2VkX3ZtIC09IGV2ZW50LT5kYXRhLT5ucl9sb2NrZWQ7Ci0JCXBlcmZfbW1hcF9kYXRhX2ZyZWUoZXZlbnQpOworCQlwZXJmX21tYXBfZGF0YV9yZWxlYXNlKGV2ZW50KTsKIAkJbXV0ZXhfdW5sb2NrKCZldmVudC0+bW1hcF9tdXRleCk7CiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHBlcmZfbW1hcF92bW9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgcGVyZl9tbWFwX3Ztb3BzID0gewogCS5vcGVuCQk9IHBlcmZfbW1hcF9vcGVuLAogCS5jbG9zZQkJPSBwZXJmX21tYXBfY2xvc2UsCiAJLmZhdWx0CQk9IHBlcmZfbW1hcF9mYXVsdCwKQEAgLTIyNjYsNiArMjM2OCw3IEBACiAJdW5zaWduZWQgbG9uZyB1c2VyX2xvY2tlZCwgdXNlcl9sb2NrX2xpbWl0OwogCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IGN1cnJlbnRfdXNlcigpOwogCXVuc2lnbmVkIGxvbmcgbG9ja2VkLCBsb2NrX2xpbWl0OworCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YTsKIAl1bnNpZ25lZCBsb25nIHZtYV9zaXplOwogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CiAJbG9uZyB1c2VyX2V4dHJhLCBleHRyYTsKQEAgLTIzMjgsMTAgKzI0MzEsMTUgQEAKIAl9CiAKIAlXQVJOX09OKGV2ZW50LT5kYXRhKTsKLQlyZXQgPSBwZXJmX21tYXBfZGF0YV9hbGxvYyhldmVudCwgbnJfcGFnZXMpOwotCWlmIChyZXQpCisKKwlkYXRhID0gcGVyZl9tbWFwX2RhdGFfYWxsb2MoZXZlbnQsIG5yX3BhZ2VzKTsKKwlyZXQgPSAtRU5PTUVNOworCWlmICghZGF0YSkKIAkJZ290byB1bmxvY2s7CiAKKwlyZXQgPSAwOworCXBlcmZfbW1hcF9kYXRhX2luaXQoZXZlbnQsIGRhdGEpOworCiAJYXRvbWljX3NldCgmZXZlbnQtPm1tYXBfY291bnQsIDEpOwogCWF0b21pY19sb25nX2FkZCh1c2VyX2V4dHJhLCAmdXNlci0+bG9ja2VkX3ZtKTsKIAl2bWEtPnZtX21tLT5sb2NrZWRfdm0gKz0gZXh0cmE7CkBAIC0yNTE5LDcgKzI2MjcsNyBAQAogCWlmICghZGF0YS0+d3JpdGFibGUpCiAJCXJldHVybiB0cnVlOwogCi0JbWFzayA9IChkYXRhLT5ucl9wYWdlcyA8PCBQQUdFX1NISUZUKSAtIDE7CisJbWFzayA9IHBlcmZfZGF0YV9zaXplKGRhdGEpIC0gMTsKIAogCW9mZnNldCA9IChvZmZzZXQgLSB0YWlsKSAmIG1hc2s7CiAJaGVhZCAgID0gKGhlYWQgICAtIHRhaWwpICYgbWFzazsKQEAgLTI2MjQsNyArMjczMiw3IEBACiAJCSAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgcGFnZXNfbWFzazsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGludCBzaXplOwogCXZvaWQgKipwYWdlczsKIApAQCAtMjYzMywxMiArMjc0MSwxNCBAQAogCXBhZ2VzCQk9IGhhbmRsZS0+ZGF0YS0+ZGF0YV9wYWdlczsKIAogCWRvIHsKLQkJdW5zaWduZWQgaW50IHBhZ2Vfb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKIAkJaW50IG5yOwogCiAJCW5yCSAgICA9IChvZmZzZXQgPj4gUEFHRV9TSElGVCkgJiBwYWdlc19tYXNrOwotCQlwYWdlX29mZnNldCA9IG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKTsKLQkJc2l6ZQkgICAgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIFBBR0VfU0laRSAtIHBhZ2Vfb2Zmc2V0LCBsZW4pOworCQlwYWdlX3NpemUgICA9IDFVTCA8PCAoaGFuZGxlLT5kYXRhLT5kYXRhX29yZGVyICsgUEFHRV9TSElGVCk7CisJCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgKHBhZ2Vfc2l6ZSAtIDEpOworCQlzaXplCSAgICA9IG1pbl90KHVuc2lnbmVkIGludCwgcGFnZV9zaXplIC0gcGFnZV9vZmZzZXQsIGxlbik7CiAKIAkJbWVtY3B5KHBhZ2VzW25yXSArIHBhZ2Vfb2Zmc2V0LCBidWYsIHNpemUpOwogCkBAIC0zODQ5LDggKzM5NTksOSBAQAogCQlyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCiAJaWYgKHJlZ3MpIHsKLQkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDAsICZkYXRhLCByZWdzKSkKLQkJCXJldCA9IEhSVElNRVJfTk9SRVNUQVJUOworCQlpZiAoIShldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgJiYgY3VycmVudC0+cGlkID09IDApKQorCQkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDAsICZkYXRhLCByZWdzKSkKKwkJCQlyZXQgPSBIUlRJTUVSX05PUkVTVEFSVDsKIAl9CiAKIAlwZXJpb2QgPSBtYXhfdCh1NjQsIDEwMDAwLCBldmVudC0+aHcuc2FtcGxlX3BlcmlvZCk7CkBAIC0zODU5LDYgKzM5NzAsNDIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBwZXJmX3N3ZXZlbnRfc3RhcnRfaHJ0aW1lcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisKKwlocnRpbWVyX2luaXQoJmh3Yy0+aHJ0aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwlod2MtPmhydGltZXIuZnVuY3Rpb24gPSBwZXJmX3N3ZXZlbnRfaHJ0aW1lcjsKKwlpZiAoaHdjLT5zYW1wbGVfcGVyaW9kKSB7CisJCXU2NCBwZXJpb2Q7CisKKwkJaWYgKGh3Yy0+cmVtYWluaW5nKSB7CisJCQlpZiAoaHdjLT5yZW1haW5pbmcgPCAwKQorCQkJCXBlcmlvZCA9IDEwMDAwOworCQkJZWxzZQorCQkJCXBlcmlvZCA9IGh3Yy0+cmVtYWluaW5nOworCQkJaHdjLT5yZW1haW5pbmcgPSAwOworCQl9IGVsc2UgeworCQkJcGVyaW9kID0gbWF4X3QodTY0LCAxMDAwMCwgaHdjLT5zYW1wbGVfcGVyaW9kKTsKKwkJfQorCQlfX2hydGltZXJfc3RhcnRfcmFuZ2VfbnMoJmh3Yy0+aHJ0aW1lciwKKwkJCQluc190b19rdGltZShwZXJpb2QpLCAwLAorCQkJCUhSVElNRVJfTU9ERV9SRUwsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgcGVyZl9zd2V2ZW50X2NhbmNlbF9ocnRpbWVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKworCWlmIChod2MtPnNhbXBsZV9wZXJpb2QpIHsKKwkJa3RpbWVfdCByZW1haW5pbmcgPSBocnRpbWVyX2dldF9yZW1haW5pbmcoJmh3Yy0+aHJ0aW1lcik7CisJCWh3Yy0+cmVtYWluaW5nID0ga3RpbWVfdG9fbnMocmVtYWluaW5nKTsKKworCQlocnRpbWVyX2NhbmNlbCgmaHdjLT5ocnRpbWVyKTsKKwl9Cit9CisKIC8qCiAgKiBTb2Z0d2FyZSBldmVudDogY3B1IHdhbGwgdGltZSBjbG9jawogICovCkBAIC0zODgxLDIyICs0MDI4LDE0IEBACiAJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlhdG9taWM2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgY3B1X2Nsb2NrKGNwdSkpOwotCWhydGltZXJfaW5pdCgmaHdjLT5ocnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwotCWh3Yy0+aHJ0aW1lci5mdW5jdGlvbiA9IHBlcmZfc3dldmVudF9ocnRpbWVyOwotCWlmIChod2MtPnNhbXBsZV9wZXJpb2QpIHsKLQkJdTY0IHBlcmlvZCA9IG1heF90KHU2NCwgMTAwMDAsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7Ci0JCV9faHJ0aW1lcl9zdGFydF9yYW5nZV9ucygmaHdjLT5ocnRpbWVyLAotCQkJCW5zX3RvX2t0aW1lKHBlcmlvZCksIDAsCi0JCQkJSFJUSU1FUl9NT0RFX1JFTCwgMCk7Ci0JfQorCXBlcmZfc3dldmVudF9zdGFydF9ocnRpbWVyKGV2ZW50KTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBjcHVfY2xvY2tfcGVyZl9ldmVudF9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlpZiAoZXZlbnQtPmh3LnNhbXBsZV9wZXJpb2QpCi0JCWhydGltZXJfY2FuY2VsKCZldmVudC0+aHcuaHJ0aW1lcik7CisJcGVyZl9zd2V2ZW50X2NhbmNlbF9ocnRpbWVyKGV2ZW50KTsKIAljcHVfY2xvY2tfcGVyZl9ldmVudF91cGRhdGUoZXZlbnQpOwogfQogCkBAIC0zOTMzLDIyICs0MDcyLDE1IEBACiAJbm93ID0gZXZlbnQtPmN0eC0+dGltZTsKIAogCWF0b21pYzY0X3NldCgmaHdjLT5wcmV2X2NvdW50LCBub3cpOwotCWhydGltZXJfaW5pdCgmaHdjLT5ocnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwotCWh3Yy0+aHJ0aW1lci5mdW5jdGlvbiA9IHBlcmZfc3dldmVudF9ocnRpbWVyOwotCWlmIChod2MtPnNhbXBsZV9wZXJpb2QpIHsKLQkJdTY0IHBlcmlvZCA9IG1heF90KHU2NCwgMTAwMDAsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7Ci0JCV9faHJ0aW1lcl9zdGFydF9yYW5nZV9ucygmaHdjLT5ocnRpbWVyLAotCQkJCW5zX3RvX2t0aW1lKHBlcmlvZCksIDAsCi0JCQkJSFJUSU1FUl9NT0RFX1JFTCwgMCk7Ci0JfQorCisJcGVyZl9zd2V2ZW50X3N0YXJ0X2hydGltZXIoZXZlbnQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHRhc2tfY2xvY2tfcGVyZl9ldmVudF9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlpZiAoZXZlbnQtPmh3LnNhbXBsZV9wZXJpb2QpCi0JCWhydGltZXJfY2FuY2VsKCZldmVudC0+aHcuaHJ0aW1lcik7CisJcGVyZl9zd2V2ZW50X2NhbmNlbF9ocnRpbWVyKGV2ZW50KTsKIAl0YXNrX2Nsb2NrX3BlcmZfZXZlbnRfdXBkYXRlKGV2ZW50LCBldmVudC0+Y3R4LT50aW1lKTsKIAogfQpAQCAtNDc4MSw5ICs0OTEzLDcgQEAKIAkgKiBXZSBkb250IGhhdmUgdG8gZGlzYWJsZSBOTUlzIC0gd2UgYXJlIG9ubHkgbG9va2luZyBhdAogCSAqIHRoZSBsaXN0LCBub3QgbWFuaXB1bGF0aW5nIGl0OgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGV2ZW50LCAmcGFyZW50X2N0eC0+ZXZlbnRfbGlzdCwgZXZlbnRfZW50cnkpIHsKLQkJaWYgKGV2ZW50ICE9IGV2ZW50LT5ncm91cF9sZWFkZXIpCi0JCQljb250aW51ZTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2ZW50LCAmcGFyZW50X2N0eC0+Z3JvdXBfbGlzdCwgZ3JvdXBfZW50cnkpIHsKIAogCQlpZiAoIWV2ZW50LT5hdHRyLmluaGVyaXQpIHsKIAkJCWluaGVyaXRlZF9hbGwgPSAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BpZF9uYW1lc3BhY2UuYyBiL2tlcm5lbC9waWRfbmFtZXNwYWNlLmMKaW5kZXggODIxNzIyYS4uODZiMzc5NiAxMDA2NDQKLS0tIGEva2VybmVsL3BpZF9uYW1lc3BhY2UuYworKysgYi9rZXJuZWwvcGlkX25hbWVzcGFjZS5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIHsKIAlpZiAoIShmbGFncyAmIENMT05FX05FV1BJRCkpCiAJCXJldHVybiBnZXRfcGlkX25zKG9sZF9ucyk7Ci0JaWYgKGZsYWdzICYgQ0xPTkVfVEhSRUFEKQorCWlmIChmbGFncyAmIChDTE9ORV9USFJFQUR8Q0xPTkVfUEFSRU5UKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJcmV0dXJuIGNyZWF0ZV9waWRfbmFtZXNwYWNlKG9sZF9ucyk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKaW5kZXggMDRiM2E4My4uMDRhOWU5MCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCisrKyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwpAQCAtNjkzLDIxICs2OTMsMjIgQEAKIAkvKiBUaGUgc25hcHNob3QgZGV2aWNlIHNob3VsZCBub3QgYmUgb3BlbmVkIHdoaWxlIHdlJ3JlIHJ1bm5pbmcgKi8KIAlpZiAoIWF0b21pY19hZGRfdW5sZXNzKCZzbmFwc2hvdF9kZXZpY2VfYXZhaWxhYmxlLCAtMSwgMCkpIHsKIAkJZXJyb3IgPSAtRUJVU1k7CisJCXN3c3VzcF9jbG9zZShGTU9ERV9SRUFEKTsKIAkJZ290byBVbmxvY2s7CiAJfQogCiAJcG1fcHJlcGFyZV9jb25zb2xlKCk7CiAJZXJyb3IgPSBwbV9ub3RpZmllcl9jYWxsX2NoYWluKFBNX1JFU1RPUkVfUFJFUEFSRSk7CiAJaWYgKGVycm9yKQotCQlnb3RvIEZpbmlzaDsKKwkJZ290byBjbG9zZV9maW5pc2g7CiAKIAllcnJvciA9IHVzZXJtb2RlaGVscGVyX2Rpc2FibGUoKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gRmluaXNoOworCQlnb3RvIGNsb3NlX2ZpbmlzaDsKIAogCWVycm9yID0gY3JlYXRlX2Jhc2ljX21lbW9yeV9iaXRtYXBzKCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIEZpbmlzaDsKKwkJZ290byBjbG9zZV9maW5pc2g7CiAKIAlwcl9kZWJ1ZygiUE06IFByZXBhcmluZyBwcm9jZXNzZXMgZm9yIHJlc3RvcmUuXG4iKTsKIAllcnJvciA9IHByZXBhcmVfcHJvY2Vzc2VzKCk7CkBAIC03MTksNiArNzIwLDcgQEAKIAlwcl9kZWJ1ZygiUE06IFJlYWRpbmcgaGliZXJuYXRpb24gaW1hZ2UuXG4iKTsKIAogCWVycm9yID0gc3dzdXNwX3JlYWQoJmZsYWdzKTsKKwlzd3N1c3BfY2xvc2UoRk1PREVfUkVBRCk7CiAJaWYgKCFlcnJvcikKIAkJaGliZXJuYXRpb25fcmVzdG9yZShmbGFncyAmIFNGX1BMQVRGT1JNX01PREUpOwogCkBAIC03MzcsNiArNzM5LDkgQEAKIAltdXRleF91bmxvY2soJnBtX211dGV4KTsKIAlwcl9kZWJ1ZygiUE06IFJlc3VtZSBmcm9tIGRpc2sgZmFpbGVkLlxuIik7CiAJcmV0dXJuIGVycm9yOworY2xvc2VfZmluaXNoOgorCXN3c3VzcF9jbG9zZShGTU9ERV9SRUFEKTsKKwlnb3RvIEZpbmlzaDsKIH0KIAogbGF0ZV9pbml0Y2FsbChzb2Z0d2FyZV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N1c3BlbmRfdGVzdC5jIGIva2VybmVsL3Bvd2VyL3N1c3BlbmRfdGVzdC5jCmluZGV4IDE3ZDhiYjEuLjI1NTk2ZTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zdXNwZW5kX3Rlc3QuYworKysgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZF90ZXN0LmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqIFRoZSB0aW1lIGl0IHRha2VzIGlzIHN5c3RlbS1zcGVjaWZpYyB0aG91Z2gsIHNvIHdoZW4gd2UgdGVzdCB0aGlzCiAgKiBkdXJpbmcgc3lzdGVtIGJvb3R1cCB3ZSBhbGxvdyBhIExPVCBvZiB0aW1lLgogICovCi0jZGVmaW5lIFRFU1RfU1VTUEVORF9TRUNPTkRTCTUKKyNkZWZpbmUgVEVTVF9TVVNQRU5EX1NFQ09ORFMJMTAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3VzcGVuZF90ZXN0X3N0YXJ0X3RpbWU7CiAKQEAgLTQ5LDcgKzQ5LDggQEAKIAkgKiBoYXMgc29tZSBwZXJmb3JtYW5jZSBpc3N1ZXMuICBUaGUgc3RhY2sgZHVtcCBvZiBhIFdBUk5fT04KIAkgKiBpcyBtb3JlIGxpa2VseSB0byBnZXQgdGhlIHJpZ2h0IGF0dGVudGlvbiB0aGFuIGEgcHJpbnRrLi4uCiAJICovCi0JV0FSTihtc2VjID4gKFRFU1RfU1VTUEVORF9TRUNPTkRTICogMTAwMCksICJDb21wb25lbnQ6ICVzXG4iLCBsYWJlbCk7CisJV0FSTihtc2VjID4gKFRFU1RfU1VTUEVORF9TRUNPTkRTICogMTAwMCksCisJICAgICAiQ29tcG9uZW50OiAlcywgdGltZTogJXVcbiIsIGxhYmVsLCBtc2VjKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zd2FwLmMgYi9rZXJuZWwvcG93ZXIvc3dhcC5jCmluZGV4IDhiYTA1MmMuLjg5MGY2YjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zd2FwLmMKKysrIGIva2VybmVsL3Bvd2VyL3N3YXAuYwpAQCAtMTMsNyArMTMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CkBAIC0zMTUsNyArMzE0LDYgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbTsKIAlpbnQgcmV0OwotCWludCBlcnJvciA9IDA7CiAJaW50IG5yX3BhZ2VzOwogCWludCBlcnIyOwogCXN0cnVjdCBiaW8gKmJpbzsKQEAgLTMzMCwyNiArMzI4LDI3IEBACiAJbnJfcGFnZXMgPSAwOwogCWJpbyA9IE5VTEw7CiAJZG9fZ2V0dGltZW9mZGF5KCZzdGFydCk7Ci0JZG8geworCXdoaWxlICgxKSB7CiAJCXJldCA9IHNuYXBzaG90X3JlYWRfbmV4dChzbmFwc2hvdCwgUEFHRV9TSVpFKTsKLQkJaWYgKHJldCA+IDApIHsKLQkJCWVycm9yID0gc3dhcF93cml0ZV9wYWdlKGhhbmRsZSwgZGF0YV9vZigqc25hcHNob3QpLAotCQkJCQkJJmJpbyk7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIShucl9wYWdlcyAlIG0pKQotCQkJCXByaW50aygiXGJcYlxiXGIlM2QlJSIsIG5yX3BhZ2VzIC8gbSk7Ci0JCQlucl9wYWdlcysrOwotCQl9Ci0JfSB3aGlsZSAocmV0ID4gMCk7CisJCWlmIChyZXQgPD0gMCkKKwkJCWJyZWFrOworCQlyZXQgPSBzd2FwX3dyaXRlX3BhZ2UoaGFuZGxlLCBkYXRhX29mKCpzbmFwc2hvdCksICZiaW8pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCWlmICghKG5yX3BhZ2VzICUgbSkpCisJCQlwcmludGsoIlxiXGJcYlxiJTNkJSUiLCBucl9wYWdlcyAvIG0pOworCQlucl9wYWdlcysrOworCX0KIAllcnIyID0gd2FpdF9vbl9iaW9fY2hhaW4oJmJpbyk7CiAJZG9fZ2V0dGltZW9mZGF5KCZzdG9wKTsKLQlpZiAoIWVycm9yKQotCQllcnJvciA9IGVycjI7Ci0JaWYgKCFlcnJvcikKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyMjsKKwlpZiAoIXJldCkKIAkJcHJpbnRrKCJcYlxiXGJcYmRvbmVcbiIpOworCWVsc2UKKwkJcHJpbnRrKCJcbiIpOwogCXN3c3VzcF9zaG93X3NwZWVkKCZzdGFydCwgJnN0b3AsIG5yX3RvX3dyaXRlLCAiV3JvdGUiKTsKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC01MzcsNyArNTM2LDggQEAKIAkJc25hcHNob3Rfd3JpdGVfZmluYWxpemUoc25hcHNob3QpOwogCQlpZiAoIXNuYXBzaG90X2ltYWdlX2xvYWRlZChzbmFwc2hvdCkpCiAJCQllcnJvciA9IC1FTk9EQVRBOwotCX0KKwl9IGVsc2UKKwkJcHJpbnRrKCJcbiIpOwogCXN3c3VzcF9zaG93X3NwZWVkKCZzdGFydCwgJnN0b3AsIG5yX3RvX3JlYWQsICJSZWFkIik7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNTczLDggKzU3Myw2IEBACiAJCWVycm9yID0gbG9hZF9pbWFnZSgmaGFuZGxlLCAmc25hcHNob3QsIGhlYWRlci0+cGFnZXMgLSAxKTsKIAlyZWxlYXNlX3N3YXBfcmVhZGVyKCZoYW5kbGUpOwogCi0JYmxrZGV2X3B1dChyZXN1bWVfYmRldiwgRk1PREVfUkVBRCk7Ci0KIAlpZiAoIWVycm9yKQogCQlwcl9kZWJ1ZygiUE06IEltYWdlIHN1Y2Nlc3NmdWxseSBsb2FkZWRcbiIpOwogCWVsc2UKQEAgLTU5Nyw3ICs1OTUsNyBAQAogCQllcnJvciA9IGJpb19yZWFkX3BhZ2Uoc3dzdXNwX3Jlc3VtZV9ibG9jaywKIAkJCQkJc3dzdXNwX2hlYWRlciwgTlVMTCk7CiAJCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKKwkJCWdvdG8gcHV0OwogCiAJCWlmICghbWVtY21wKFNXU1VTUF9TSUcsIHN3c3VzcF9oZWFkZXItPnNpZywgMTApKSB7CiAJCQltZW1jcHkoc3dzdXNwX2hlYWRlci0+c2lnLCBzd3N1c3BfaGVhZGVyLT5vcmlnX3NpZywgMTApOwpAQCAtNjA1LDggKzYwMywxMCBAQAogCQkJZXJyb3IgPSBiaW9fd3JpdGVfcGFnZShzd3N1c3BfcmVzdW1lX2Jsb2NrLAogCQkJCQkJc3dzdXNwX2hlYWRlciwgTlVMTCk7CiAJCX0gZWxzZSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWVycm9yID0gLUVJTlZBTDsKIAkJfQorCitwdXQ6CiAJCWlmIChlcnJvcikKIAkJCWJsa2Rldl9wdXQocmVzdW1lX2JkZXYsIEZNT0RFX1JFQUQpOwogCQllbHNlCmRpZmYgLS1naXQgYS9rZXJuZWwvcHRyYWNlLmMgYi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMzA3YzI4NS4uMjNiZDA5YyAxMDA2NDQKLS0tIGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2tlcm5lbC9wdHJhY2UuYwpAQCAtMjY2LDkgKzI2NiwxMCBAQAogICogb3Igc2VsZi1yZWFwaW5nLiAgRG8gbm90aWZpY2F0aW9uIG5vdyBpZiBpdCB3b3VsZCBoYXZlIGhhcHBlbmVkIGVhcmxpZXIuCiAgKiBJZiBpdCBzaG91bGQgcmVhcCBpdHNlbGYsIHJldHVybiB0cnVlLgogICoKLSAqIElmIGl0J3Mgb3VyIG93biBjaGlsZCwgdGhlcmUgaXMgbm8gbm90aWZpY2F0aW9uIHRvIGRvLgotICogQnV0IGlmIG91ciBub3JtYWwgY2hpbGRyZW4gc2VsZi1yZWFwLCB0aGVuIHRoaXMgY2hpbGQKLSAqIHdhcyBwcmV2ZW50ZWQgYnkgcHRyYWNlIGFuZCB3ZSBtdXN0IHJlYXAgaXQgbm93LgorICogSWYgaXQncyBvdXIgb3duIGNoaWxkLCB0aGVyZSBpcyBubyBub3RpZmljYXRpb24gdG8gZG8uIEJ1dCBpZiBvdXIgbm9ybWFsCisgKiBjaGlsZHJlbiBzZWxmLXJlYXAsIHRoZW4gdGhpcyBjaGlsZCB3YXMgcHJldmVudGVkIGJ5IHB0cmFjZSBhbmQgd2UgbXVzdAorICogcmVhcCBpdCBub3csIGluIHRoYXQgY2FzZSB3ZSBtdXN0IGFsc28gd2FrZSB1cCBzdWItdGhyZWFkcyBzbGVlcGluZyBpbgorICogZG9fd2FpdCgpLgogICovCiBzdGF0aWMgYm9vbCBfX3B0cmFjZV9kZXRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0cmFjZXIsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKQEAgLTI3OCw4ICsyNzksMTAgQEAKIAkJaWYgKCF0YXNrX2RldGFjaGVkKHApICYmIHRocmVhZF9ncm91cF9lbXB0eShwKSkgewogCQkJaWYgKCFzYW1lX3RocmVhZF9ncm91cChwLT5yZWFsX3BhcmVudCwgdHJhY2VyKSkKIAkJCQlkb19ub3RpZnlfcGFyZW50KHAsIHAtPmV4aXRfc2lnbmFsKTsKLQkJCWVsc2UgaWYgKGlnbm9yaW5nX2NoaWxkcmVuKHRyYWNlci0+c2lnaGFuZCkpCisJCQllbHNlIGlmIChpZ25vcmluZ19jaGlsZHJlbih0cmFjZXItPnNpZ2hhbmQpKSB7CisJCQkJX193YWtlX3VwX3BhcmVudChwLCB0cmFjZXIpOwogCQkJCXAtPmV4aXRfc2lnbmFsID0gLTE7CisJCQl9CiAJCX0KIAkJaWYgKHRhc2tfZGV0YWNoZWQocCkpIHsKIAkJCS8qIE1hcmsgaXQgYXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVhcGVkLiAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXBkYXRlLmMgYi9rZXJuZWwvcmN1cGRhdGUuYwppbmRleCAzN2FjNDU0Li40MDAxODMzIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1cGRhdGUuYworKysgYi9rZXJuZWwvcmN1cGRhdGUuYwpAQCAtNDYsMjIgKzQ2LDE1IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KIAotZW51bSByY3VfYmFycmllciB7Ci0JUkNVX0JBUlJJRVJfU1RELAotCVJDVV9CQVJSSUVSX0JILAotCVJDVV9CQVJSSUVSX1NDSEVELAotfTsKKyNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQworc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSByY3VfbG9ja19rZXk7CitzdHJ1Y3QgbG9ja2RlcF9tYXAgcmN1X2xvY2tfbWFwID0KKwlTVEFUSUNfTE9DS0RFUF9NQVBfSU5JVCgicmN1X3JlYWRfbG9jayIsICZyY3VfbG9ja19rZXkpOworRVhQT1JUX1NZTUJPTF9HUEwocmN1X2xvY2tfbWFwKTsKKyNlbmRpZgogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9oZWFkLCByY3VfYmFycmllcl9oZWFkKSA9IHtOVUxMfTsKLXN0YXRpYyBhdG9taWNfdCByY3VfYmFycmllcl9jcHVfY291bnQ7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHJjdV9iYXJyaWVyX211dGV4KTsKLXN0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiByY3VfYmFycmllcl9jb21wbGV0aW9uOwogaW50IHJjdV9zY2hlZHVsZXJfYWN0aXZlIF9fcmVhZF9tb3N0bHk7CiAKLXN0YXRpYyBhdG9taWNfdCByY3VfbWlncmF0ZV90eXBlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7Ci1zdGF0aWMgc3RydWN0IHJjdV9oZWFkIHJjdV9taWdyYXRlX2hlYWRbM107Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocmN1X21pZ3JhdGVfd3EpOwotCiAvKgogICogQXdha2VuIHRoZSBjb3JyZXNwb25kaW5nIHN5bmNocm9uaXplX3JjdSgpIGluc3RhbmNlIG5vdyB0aGF0IGEKICAqIGdyYWNlIHBlcmlvZCBoYXMgZWxhcHNlZC4KQEAgLTE2NCwxMjkgKzE1NywxMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3luY2hyb25pemVfcmN1X2JoKTsKIAotc3RhdGljIHZvaWQgcmN1X2JhcnJpZXJfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpub3R1c2VkKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyY3VfYmFycmllcl9jcHVfY291bnQpKQotCQljb21wbGV0ZSgmcmN1X2JhcnJpZXJfY29tcGxldGlvbik7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkLCBhbmQgZnJvbSBjcm9zcy1jcHUgSVJRIGNvbnRleHQuCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV9iYXJyaWVyX2Z1bmModm9pZCAqdHlwZSkKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCByY3VfaGVhZCAqaGVhZCA9ICZwZXJfY3B1KHJjdV9iYXJyaWVyX2hlYWQsIGNwdSk7Ci0KLQlhdG9taWNfaW5jKCZyY3VfYmFycmllcl9jcHVfY291bnQpOwotCXN3aXRjaCAoKGVudW0gcmN1X2JhcnJpZXIpdHlwZSkgewotCWNhc2UgUkNVX0JBUlJJRVJfU1REOgotCQljYWxsX3JjdShoZWFkLCByY3VfYmFycmllcl9jYWxsYmFjayk7Ci0JCWJyZWFrOwotCWNhc2UgUkNVX0JBUlJJRVJfQkg6Ci0JCWNhbGxfcmN1X2JoKGhlYWQsIHJjdV9iYXJyaWVyX2NhbGxiYWNrKTsKLQkJYnJlYWs7Ci0JY2FzZSBSQ1VfQkFSUklFUl9TQ0hFRDoKLQkJY2FsbF9yY3Vfc2NoZWQoaGVhZCwgcmN1X2JhcnJpZXJfY2FsbGJhY2spOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X21pZ3JhdGVkX2NhbGxiYWNrcyh2b2lkKQotewotCXdhaXRfZXZlbnQocmN1X21pZ3JhdGVfd3EsICFhdG9taWNfcmVhZCgmcmN1X21pZ3JhdGVfdHlwZV9jb3VudCkpOwotCXNtcF9tYigpOyAvKiBJbiBjYXNlIHdlIGRpZG4ndCBzbGVlcC4gKi8KLX0KLQotLyoKLSAqIE9yY2hlc3RyYXRlIHRoZSBzcGVjaWZpZWQgdHlwZSBvZiBSQ1UgYmFycmllciwgd2FpdGluZyBmb3IgYWxsCi0gKiBSQ1UgY2FsbGJhY2tzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0byBjb21wbGV0ZS4KLSAqLwotc3RhdGljIHZvaWQgX3JjdV9iYXJyaWVyKGVudW0gcmN1X2JhcnJpZXIgdHlwZSkKLXsKLQlCVUdfT04oaW5faW50ZXJydXB0KCkpOwotCS8qIFRha2UgY3B1Y29udHJvbCBtdXRleCB0byBwcm90ZWN0IGFnYWluc3QgQ1BVIGhvdHBsdWcgKi8KLQltdXRleF9sb2NrKCZyY3VfYmFycmllcl9tdXRleCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZyY3VfYmFycmllcl9jb21wbGV0aW9uKTsKLQkvKgotCSAqIEluaXRpYWxpemUgcmN1X2JhcnJpZXJfY3B1X2NvdW50IHRvIDEsIHRoZW4gaW52b2tlCi0JICogcmN1X2JhcnJpZXJfZnVuYygpIG9uIGVhY2ggQ1BVLCBzbyB0aGF0IGVhY2ggQ1BVIGFsc28gaGFzCi0JICogaW5jcmVtZW50ZWQgcmN1X2JhcnJpZXJfY3B1X2NvdW50LiAgT25seSB0aGVuIGlzIGl0IHNhZmUgdG8KLQkgKiBkZWNyZW1lbnQgcmN1X2JhcnJpZXJfY3B1X2NvdW50IC0tIG90aGVyd2lzZSB0aGUgZmlyc3QgQ1BVCi0JICogbWlnaHQgY29tcGxldGUgaXRzIGdyYWNlIHBlcmlvZCBiZWZvcmUgYWxsIG9mIHRoZSBvdGhlciBDUFVzCi0JICogZGlkIHRoZWlyIGluY3JlbWVudCwgY2F1c2luZyB0aGlzIGZ1bmN0aW9uIHRvIHJldHVybiB0b28KLQkgKiBlYXJseS4KLQkgKi8KLQlhdG9taWNfc2V0KCZyY3VfYmFycmllcl9jcHVfY291bnQsIDEpOwotCW9uX2VhY2hfY3B1KHJjdV9iYXJyaWVyX2Z1bmMsICh2b2lkICopdHlwZSwgMSk7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJjdV9iYXJyaWVyX2NwdV9jb3VudCkpCi0JCWNvbXBsZXRlKCZyY3VfYmFycmllcl9jb21wbGV0aW9uKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyY3VfYmFycmllcl9jb21wbGV0aW9uKTsKLQltdXRleF91bmxvY2soJnJjdV9iYXJyaWVyX211dGV4KTsKLQl3YWl0X21pZ3JhdGVkX2NhbGxiYWNrcygpOwotfQotCi0vKioKLSAqIHJjdV9iYXJyaWVyIC0gV2FpdCB1bnRpbCBhbGwgaW4tZmxpZ2h0IGNhbGxfcmN1KCkgY2FsbGJhY2tzIGNvbXBsZXRlLgotICovCi12b2lkIHJjdV9iYXJyaWVyKHZvaWQpCi17Ci0JX3JjdV9iYXJyaWVyKFJDVV9CQVJSSUVSX1NURCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChyY3VfYmFycmllcik7Ci0KLS8qKgotICogcmN1X2JhcnJpZXJfYmggLSBXYWl0IHVudGlsIGFsbCBpbi1mbGlnaHQgY2FsbF9yY3VfYmgoKSBjYWxsYmFja3MgY29tcGxldGUuCi0gKi8KLXZvaWQgcmN1X2JhcnJpZXJfYmgodm9pZCkKLXsKLQlfcmN1X2JhcnJpZXIoUkNVX0JBUlJJRVJfQkgpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocmN1X2JhcnJpZXJfYmgpOwotCi0vKioKLSAqIHJjdV9iYXJyaWVyX3NjaGVkIC0gV2FpdCBmb3IgaW4tZmxpZ2h0IGNhbGxfcmN1X3NjaGVkKCkgY2FsbGJhY2tzLgotICovCi12b2lkIHJjdV9iYXJyaWVyX3NjaGVkKHZvaWQpCi17Ci0JX3JjdV9iYXJyaWVyKFJDVV9CQVJSSUVSX1NDSEVEKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHJjdV9iYXJyaWVyX3NjaGVkKTsKLQotc3RhdGljIHZvaWQgcmN1X21pZ3JhdGVfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpub3R1c2VkKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyY3VfbWlncmF0ZV90eXBlX2NvdW50KSkKLQkJd2FrZV91cCgmcmN1X21pZ3JhdGVfd3EpOwotfQotCi1leHRlcm4gaW50IHJjdV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpOwotCiBzdGF0aWMgaW50IF9fY3B1aW5pdCByY3VfYmFycmllcl9jcHVfaG90cGx1ZyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewotCXJjdV9jcHVfbm90aWZ5KHNlbGYsIGFjdGlvbiwgaGNwdSk7Ci0JaWYgKGFjdGlvbiA9PSBDUFVfRFlJTkcpIHsKLQkJLyoKLQkJICogcHJlZW1wdF9kaXNhYmxlKCkgaW4gb25fZWFjaF9jcHUoKSBwcmV2ZW50cyBzdG9wX21hY2hpbmUoKSwKLQkJICogc28gd2hlbiAib25fZWFjaF9jcHUocmN1X2JhcnJpZXJfZnVuYywgKHZvaWQgKil0eXBlLCAxKTsiCi0JCSAqIHJldHVybnMsIGFsbCBvbmxpbmUgY3B1cyBoYXZlIHF1ZXVlZCByY3VfYmFycmllcl9mdW5jKCksCi0JCSAqIGFuZCB0aGUgZGVhZCBjcHUoaWYgaXQgZXhpc3QpIHF1ZXVlcyByY3VfbWlncmF0ZV9jYWxsYmFjaygpcy4KLQkJICoKLQkJICogVGhlc2UgY2FsbGJhY2tzIGVuc3VyZSBfcmN1X2JhcnJpZXIoKSB3YWl0cyBmb3IgYWxsCi0JCSAqIFJDVSBjYWxsYmFja3Mgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRvIGNvbXBsZXRlLgotCQkgKi8KLQkJYXRvbWljX3NldCgmcmN1X21pZ3JhdGVfdHlwZV9jb3VudCwgMyk7Ci0JCWNhbGxfcmN1X2JoKHJjdV9taWdyYXRlX2hlYWQsIHJjdV9taWdyYXRlX2NhbGxiYWNrKTsKLQkJY2FsbF9yY3Vfc2NoZWQocmN1X21pZ3JhdGVfaGVhZCArIDEsIHJjdV9taWdyYXRlX2NhbGxiYWNrKTsKLQkJY2FsbF9yY3UocmN1X21pZ3JhdGVfaGVhZCArIDIsIHJjdV9taWdyYXRlX2NhbGxiYWNrKTsKLQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBDUFVfRE9XTl9QUkVQQVJFKSB7Ci0JCS8qIERvbid0IG5lZWQgdG8gd2FpdCB1bnRpbCBuZXh0IHJlbW92YWwgb3BlcmF0aW9uLiAqLwotCQkvKiByY3VfbWlncmF0ZV9oZWFkIGlzIHByb3RlY3RlZCBieSBjcHVfYWRkX3JlbW92ZV9sb2NrICovCi0JCXdhaXRfbWlncmF0ZWRfY2FsbGJhY2tzKCk7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gcmN1X2NwdV9ub3RpZnkoc2VsZiwgYWN0aW9uLCBoY3B1KTsKIH0KIAogdm9pZCBfX2luaXQgcmN1X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0b3J0dXJlLmMgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCmluZGV4IDIzMzc2OGYuLjY5N2MwYTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0b3J0dXJlLmMKKysrIGIva2VybmVsL3JjdXRvcnR1cmUuYwpAQCAtNjA2LDggKzYwNiw2IEBACiAJLm5hbWUJCT0gInNjaGVkX3N5bmMiCiB9OwogCi1leHRlcm4gaW50IHJjdV9leHBlZGl0ZWRfdG9ydHVyZV9zdGF0cyhjaGFyICpwYWdlKTsKLQogc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZV9vcHMgc2NoZWRfZXhwZWRpdGVkX29wcyA9IHsKIAkuaW5pdAkJPSByY3Vfc3luY190b3J0dXJlX2luaXQsCiAJLmNsZWFudXAJPSBOVUxMLApAQCAtNjUwLDcgKzY0OCw3IEBACiAJCW9sZF9ycCA9IHJjdV90b3J0dXJlX2N1cnJlbnQ7CiAJCXJwLT5ydG9ydF9tYnRlc3QgPSAxOwogCQlyY3VfYXNzaWduX3BvaW50ZXIocmN1X3RvcnR1cmVfY3VycmVudCwgcnApOwotCQlzbXBfd21iKCk7CisJCXNtcF93bWIoKTsgLyogTW9kcyB0byBvbGRfcnAgbXVzdCBmb2xsb3cgcmN1X2Fzc2lnbl9wb2ludGVyKCkgKi8KIAkJaWYgKG9sZF9ycCkgewogCQkJaSA9IG9sZF9ycC0+cnRvcnRfcGlwZV9jb3VudDsKIAkJCWlmIChpID4gUkNVX1RPUlRVUkVfUElQRV9MRU4pCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZS5jIGIva2VybmVsL3JjdXRyZWUuYwppbmRleCA1MmIwNmY2Li4wNTM2MTI1IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZS5jCisrKyBiL2tlcm5lbC9yY3V0cmVlLmMKQEAgLTQ5LDEzICs0OSw2IEBACiAKICNpbmNsdWRlICJyY3V0cmVlLmgiCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwotc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSByY3VfbG9ja19rZXk7Ci1zdHJ1Y3QgbG9ja2RlcF9tYXAgcmN1X2xvY2tfbWFwID0KLQlTVEFUSUNfTE9DS0RFUF9NQVBfSU5JVCgicmN1X3JlYWRfbG9jayIsICZyY3VfbG9ja19rZXkpOwotRVhQT1JUX1NZTUJPTF9HUEwocmN1X2xvY2tfbWFwKTsKLSNlbmRpZgotCiAvKiBEYXRhIHN0cnVjdHVyZXMuICovCiAKICNkZWZpbmUgUkNVX1NUQVRFX0lOSVRJQUxJWkVSKG5hbWUpIHsgXApAQCAtNzAsNiArNjMsOSBAQAogCS5ncG51bSA9IC0zMDAsIFwKIAkuY29tcGxldGVkID0gLTMwMCwgXAogCS5vbm9mZmxvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRCgmbmFtZS5vbm9mZmxvY2spLCBcCisJLm9ycGhhbl9jYnNfbGlzdCA9IE5VTEwsIFwKKwkub3JwaGFuX2Nic190YWlsID0gJm5hbWUub3JwaGFuX2Nic19saXN0LCBcCisJLm9ycGhhbl9xbGVuID0gMCwgXAogCS5mcXNsb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoJm5hbWUuZnFzbG9jayksIFwKIAkubl9mb3JjZV9xcyA9IDAsIFwKIAkubl9mb3JjZV9xc19uZ3AgPSAwLCBcCkBAIC04MSwyNCArNzcsMTYgQEAKIHN0cnVjdCByY3Vfc3RhdGUgcmN1X2JoX3N0YXRlID0gUkNVX1NUQVRFX0lOSVRJQUxJWkVSKHJjdV9iaF9zdGF0ZSk7CiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2RhdGEsIHJjdV9iaF9kYXRhKTsKIAotZXh0ZXJuIGxvbmcgcmN1X2JhdGNoZXNfY29tcGxldGVkX3NjaGVkKHZvaWQpOwotc3RhdGljIHN0cnVjdCByY3Vfbm9kZSAqcmN1X2dldF9yb290KHN0cnVjdCByY3Vfc3RhdGUgKnJzcCk7Ci1zdGF0aWMgdm9pZCBjcHVfcXVpZXRfbXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAotCQkJICBzdHJ1Y3QgcmN1X25vZGUgKnJucCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1zdGF0aWMgdm9pZCBjcHVfcXVpZXRfbXNrX2ZpbmlzaChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIHZvaWQgX19yY3Vfb2ZmbGluZV9jcHUoaW50IGNwdSwgc3RydWN0IHJjdV9zdGF0ZSAqcnNwKTsKLSNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCi1zdGF0aWMgdm9pZCBfX3JjdV9wcm9jZXNzX2NhbGxiYWNrcyhzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCi0JCQkJICAgIHN0cnVjdCByY3VfZGF0YSAqcmRwKTsKLXN0YXRpYyB2b2lkIF9fY2FsbF9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkLAotCQkgICAgICAgdm9pZCAoKmZ1bmMpKHN0cnVjdCByY3VfaGVhZCAqcmN1KSwKLQkJICAgICAgIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCk7Ci1zdGF0aWMgaW50IF9fcmN1X3BlbmRpbmcoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCk7Ci1zdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X2luaXRfcGVyY3B1X2RhdGEoaW50IGNwdSwgc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAotCQkJCQkgICBpbnQgcHJlZW1wdGFibGUpOwogCi0jaW5jbHVkZSAicmN1dHJlZV9wbHVnaW4uaCIKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBhbiBSQ1UgZ3JhY2UgcGVyaW9kIGlzIGluIHByb2dyZXNzLiAgVGhlIEFDQ0VTU19PTkNFKClzCisgKiBwZXJtaXQgdGhpcyBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHdpdGhvdXQgaG9sZGluZyB0aGUgcm9vdCByY3Vfbm9kZQorICogc3RydWN0dXJlJ3MgLT5sb2NrLCBidXQgb2YgY291cnNlIHJlc3VsdHMgY2FuIGJlIHN1YmplY3QgdG8gY2hhbmdlLgorICovCitzdGF0aWMgaW50IHJjdV9ncF9pbl9wcm9ncmVzcyhzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7CisJcmV0dXJuIEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSAhPSBBQ0NFU1NfT05DRShyc3AtPmdwbnVtKTsKK30KIAogLyoKICAqIE5vdGUgYSBxdWllc2NlbnQgc3RhdGUuICBCZWNhdXNlIHdlIGRvIG5vdCBuZWVkIHRvIGtub3cKQEAgLTEzNyw2ICsxMjUsMTAgQEAKIHN0YXRpYyBpbnQgcWhpbWFyayA9IDEwMDAwOwkvKiBJZiB0aGlzIG1hbnkgcGVuZGluZywgaWdub3JlIGJsaW1pdC4gKi8KIHN0YXRpYyBpbnQgcWxvd21hcmsgPSAxMDA7CS8qIE9uY2Ugb25seSB0aGlzIG1hbnkgcGVuZGluZywgdXNlIGJsaW1pdC4gKi8KIAorbW9kdWxlX3BhcmFtKGJsaW1pdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShxaGltYXJrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHFsb3dtYXJrLCBpbnQsIDApOworCiBzdGF0aWMgdm9pZCBmb3JjZV9xdWllc2NlbnRfc3RhdGUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBpbnQgcmVsYXhlZCk7CiBzdGF0aWMgaW50IHJjdV9wZW5kaW5nKGludCBjcHUpOwogCkBAIC0xNzMsOSArMTY1LDcgQEAKIHN0YXRpYyBpbnQKIGNwdV9uZWVkc19hbm90aGVyX2dwKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7Ci0JLyogQUNDRVNTX09OQ0UoKSBiZWNhdXNlIHdlIGFyZSBhY2Nlc3Npbmcgb3V0c2lkZSBvZiBsb2NrLiAqLwotCXJldHVybiAqcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdICYmCi0JICAgICAgIEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSA9PSBBQ0NFU1NfT05DRShyc3AtPmdwbnVtKTsKKwlyZXR1cm4gKnJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSAmJiAhcmN1X2dwX2luX3Byb2dyZXNzKHJzcCk7CiB9CiAKIC8qCkBAIC0zNjksNyArMzU5LDcgQEAKIC8qCiAgKiBTbmFwc2hvdCB0aGUgc3BlY2lmaWVkIENQVSdzIGR5bnRpY2tzIGNvdW50ZXIgc28gdGhhdCB3ZSBjYW4gbGF0ZXIKICAqIGNyZWRpdCB0aGVtIHdpdGggYW4gaW1wbGljaXQgcXVpZXNjZW50IHN0YXRlLiAgUmV0dXJuIDEgaWYgdGhpcyBDUFUKLSAqIGlzIGFscmVhZHkgaW4gYSBxdWllc2NlbnQgc3RhdGUgY291cnRlc3kgb2YgZHludGlja3MgaWRsZSBtb2RlLgorICogaXMgaW4gZHludGlja3MgaWRsZSBtb2RlLCB3aGljaCBpcyBhbiBleHRlbmRlZCBxdWllc2NlbnQgc3RhdGUuCiAgKi8KIHN0YXRpYyBpbnQgZHludGlja19zYXZlX3Byb2dyZXNzX2NvdW50ZXIoc3RydWN0IHJjdV9kYXRhICpyZHApCiB7CkBAIC00NzUsMzAgKzQ2NSwzNCBAQAogCWxvbmcgZGVsdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJjdV9nZXRfcm9vdChyc3ApOwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wX2N1ciA9IHJzcC0+bGV2ZWxbTlVNX1JDVV9MVkxTIC0gMV07Ci0Jc3RydWN0IHJjdV9ub2RlICpybnBfZW5kID0gJnJzcC0+bm9kZVtOVU1fUkNVX05PREVTXTsKIAogCS8qIE9ubHkgbGV0IG9uZSBDUFUgY29tcGxhaW4gYWJvdXQgb3RoZXJzIHBlciB0aW1lIGludGVydmFsLiAqLwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCWRlbHRhID0gamlmZmllcyAtIHJzcC0+amlmZmllc19zdGFsbDsKLQlpZiAoZGVsdGEgPCBSQ1VfU1RBTExfUkFUX0RFTEFZIHx8IHJzcC0+Z3BudW0gPT0gcnNwLT5jb21wbGV0ZWQpIHsKKwlpZiAoZGVsdGEgPCBSQ1VfU1RBTExfUkFUX0RFTEFZIHx8ICFyY3VfZ3BfaW5fcHJvZ3Jlc3MocnNwKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAlyc3AtPmppZmZpZXNfc3RhbGwgPSBqaWZmaWVzICsgUkNVX1NFQ09ORFNfVElMTF9TVEFMTF9SRUNIRUNLOworCisJLyoKKwkgKiBOb3cgcmF0IG9uIGFueSB0YXNrcyB0aGF0IGdvdCBraWNrZWQgdXAgdG8gdGhlIHJvb3QgcmN1X25vZGUKKwkgKiBkdWUgdG8gQ1BVIG9mZmxpbmluZy4KKwkgKi8KKwlyY3VfcHJpbnRfdGFza19zdGFsbChybnApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCiAJLyogT0ssIHRpbWUgdG8gcmF0IG9uIG91ciBidWRkeS4uLiAqLwogCiAJcHJpbnRrKEtFUk5fRVJSICJJTkZPOiBSQ1UgZGV0ZWN0ZWQgQ1BVIHN0YWxsczoiKTsKLQlmb3IgKDsgcm5wX2N1ciA8IHJucF9lbmQ7IHJucF9jdXIrKykgeworCXJjdV9mb3JfZWFjaF9sZWFmX25vZGUocnNwLCBybnApIHsKIAkJcmN1X3ByaW50X3Rhc2tfc3RhbGwocm5wKTsKLQkJaWYgKHJucF9jdXItPnFzbWFzayA9PSAwKQorCQlpZiAocm5wLT5xc21hc2sgPT0gMCkKIAkJCWNvbnRpbnVlOwotCQlmb3IgKGNwdSA9IDA7IGNwdSA8PSBybnBfY3VyLT5ncnBoaSAtIHJucF9jdXItPmdycGxvOyBjcHUrKykKLQkJCWlmIChybnBfY3VyLT5xc21hc2sgJiAoMVVMIDw8IGNwdSkpCi0JCQkJcHJpbnRrKCIgJWQiLCBybnBfY3VyLT5ncnBsbyArIGNwdSk7CisJCWZvciAoY3B1ID0gMDsgY3B1IDw9IHJucC0+Z3JwaGkgLSBybnAtPmdycGxvOyBjcHUrKykKKwkJCWlmIChybnAtPnFzbWFzayAmICgxVUwgPDwgY3B1KSkKKwkJCQlwcmludGsoIiAlZCIsIHJucC0+Z3JwbG8gKyBjcHUpOwogCX0KIAlwcmludGsoIiAoZGV0ZWN0ZWQgYnkgJWQsIHQ9JWxkIGppZmZpZXMpXG4iLAogCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksIChsb25nKShqaWZmaWVzIC0gcnNwLT5ncF9zdGFydCkpOwpAQCAtNTM3LDggKzUzMSw3IEBACiAJCS8qIFdlIGhhdmVuJ3QgY2hlY2tlZCBpbiwgc28gZ28gZHVtcCBzdGFjay4gKi8KIAkJcHJpbnRfY3B1X3N0YWxsKHJzcCk7CiAKLQl9IGVsc2UgaWYgKHJzcC0+Z3BudW0gIT0gcnNwLT5jb21wbGV0ZWQgJiYKLQkJICAgZGVsdGEgPj0gUkNVX1NUQUxMX1JBVF9ERUxBWSkgeworCX0gZWxzZSBpZiAocmN1X2dwX2luX3Byb2dyZXNzKHJzcCkgJiYgZGVsdGEgPj0gUkNVX1NUQUxMX1JBVF9ERUxBWSkgewogCiAJCS8qIFRoZXkgaGFkIHR3byB0aW1lIHVuaXRzIHRvIGR1bXAgc3RhY2ssIHNvIGNvbXBsYWluLiAqLwogCQlwcmludF9vdGhlcl9jcHVfc3RhbGwocnNwKTsKQEAgLTYxNyw5ICs2MTAsMTUgQEAKIAlub3RlX25ld19ncG51bShyc3AsIHJkcCk7CiAKIAkvKgotCSAqIEJlY2F1c2Ugd2UgYXJlIGZpcnN0LCB3ZSBrbm93IHRoYXQgYWxsIG91ciBjYWxsYmFja3Mgd2lsbAotCSAqIGJlIGNvdmVyZWQgYnkgdGhpcyB1cGNvbWluZyBncmFjZSBwZXJpb2QsIGV2ZW4gdGhlIG9uZXMKLQkgKiB0aGF0IHdlcmUgcmVnaXN0ZXJlZCBhcmJpdHJhcmlseSByZWNlbnRseS4KKwkgKiBCZWNhdXNlIHRoaXMgQ1BVIGp1c3Qgbm93IHN0YXJ0ZWQgdGhlIG5ldyBncmFjZSBwZXJpb2QsIHdlIGtub3cKKwkgKiB0aGF0IGFsbCBvZiBpdHMgY2FsbGJhY2tzIHdpbGwgYmUgY292ZXJlZCBieSB0aGlzIHVwY29taW5nIGdyYWNlCisJICogcGVyaW9kLCBldmVuIHRoZSBvbmVzIHRoYXQgd2VyZSByZWdpc3RlcmVkIGFyYml0cmFyaWx5IHJlY2VudGx5LgorCSAqIFRoZXJlZm9yZSwgYWR2YW5jZSBhbGwgb3V0c3RhbmRpbmcgY2FsbGJhY2tzIHRvIFJDVV9XQUlUX1RBSUwuCisJICoKKwkgKiBPdGhlciBDUFVzIGNhbm5vdCBiZSBzdXJlIGV4YWN0bHkgd2hlbiB0aGUgZ3JhY2UgcGVyaW9kIHN0YXJ0ZWQuCisJICogVGhlcmVmb3JlLCB0aGVpciByZWNlbnRseSByZWdpc3RlcmVkIGNhbGxiYWNrcyBtdXN0IHBhc3MgdGhyb3VnaAorCSAqIGFuIGFkZGl0aW9uYWwgUkNVX05FWFRfUkVBRFkgc3RhZ2UsIHNvIHRoYXQgdGhleSB3aWxsIGJlIGhhbmRsZWQKKwkgKiBieSB0aGUgbmV4dCBSQ1UgZ3JhY2UgcGVyaW9kLgogCSAqLwogCXJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXSA9IHJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9UQUlMXTsKIAlyZHAtPm54dHRhaWxbUkNVX1dBSVRfVEFJTF0gPSByZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF07CkBAIC02NTcsNyArNjU2LDcgQEAKIAkgKiBvbmUgY29ycmVzcG9uZGluZyB0byB0aGlzIENQVSwgZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZQogCSAqIGlycXMgZGlzYWJsZWQuCiAJICovCi0JZm9yIChybnAgPSAmcnNwLT5ub2RlWzBdOyBybnAgPCAmcnNwLT5ub2RlW05VTV9SQ1VfTk9ERVNdOyBybnArKykgeworCXJjdV9mb3JfZWFjaF9ub2RlX2JyZWFkdGhfZmlyc3QocnNwLCBybnApIHsKIAkJc3Bpbl9sb2NrKCZybnAtPmxvY2spOwkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQuICovCiAJCXJjdV9wcmVlbXB0X2NoZWNrX2Jsb2NrZWRfdGFza3Mocm5wKTsKIAkJcm5wLT5xc21hc2sgPSBybnAtPnFzbWFza2luaXQ7CkBAIC03MDMsOSArNzAyLDkgQEAKICAqIGhvbGQgcm5wLT5sb2NrLCBhcyByZXF1aXJlZCBieSByY3Vfc3RhcnRfZ3AoKSwgd2hpY2ggd2lsbCByZWxlYXNlIGl0LgogICovCiBzdGF0aWMgdm9pZCBjcHVfcXVpZXRfbXNrX2ZpbmlzaChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JX19yZWxlYXNlcyhybnAtPmxvY2spCisJX19yZWxlYXNlcyhyY3VfZ2V0X3Jvb3QocnNwKS0+bG9jaykKIHsKLQlXQVJOX09OX09OQ0UocnNwLT5jb21wbGV0ZWQgPT0gcnNwLT5ncG51bSk7CisJV0FSTl9PTl9PTkNFKCFyY3VfZ3BfaW5fcHJvZ3Jlc3MocnNwKSk7CiAJcnNwLT5jb21wbGV0ZWQgPSByc3AtPmdwbnVtOwogCXJjdV9wcm9jZXNzX2dwX2VuZChyc3AsIHJzcC0+cmRhW3NtcF9wcm9jZXNzb3JfaWQoKV0pOwogCXJjdV9zdGFydF9ncChyc3AsIGZsYWdzKTsgIC8qIHJlbGVhc2VzIHJvb3Qgbm9kZSdzIHJucC0+bG9jay4gKi8KQEAgLTg0MiwxNyArODQxLDYzIEBACiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAKIC8qCisgKiBNb3ZlIGEgZHlpbmcgQ1BVJ3MgUkNVIGNhbGxiYWNrcyB0byB0aGUgLT5vcnBoYW5fY2JzX2xpc3QgZm9yIHRoZQorICogc3BlY2lmaWVkIGZsYXZvciBvZiBSQ1UuICBUaGUgY2FsbGJhY2tzIHdpbGwgYmUgYWRvcHRlZCBieSB0aGUgbmV4dAorICogX3JjdV9iYXJyaWVyKCkgaW52b2NhdGlvbiBvciBieSB0aGUgQ1BVX0RFQUQgbm90aWZpZXIsIHdoaWNoZXZlcgorICogY29tZXMgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgaW52b2tlZCBmcm9tIHRoZSBDUFVfRFlJTkcgbm90aWZpZXIsCisgKiBpcnFzIGFyZSBhbHJlYWR5IGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCByY3Vfc2VuZF9jYnNfdG9fb3JwaGFuYWdlKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHJzcC0+cmRhW3NtcF9wcm9jZXNzb3JfaWQoKV07CisKKwlpZiAocmRwLT5ueHRsaXN0ID09IE5VTEwpCisJCXJldHVybjsgIC8qIGlycXMgZGlzYWJsZWQsIHNvIGNvbXBhcmlzb24gaXMgc3RhYmxlLiAqLworCXNwaW5fbG9jaygmcnNwLT5vbm9mZmxvY2spOyAgLyogaXJxcyBhbHJlYWR5IGRpc2FibGVkLiAqLworCSpyc3AtPm9ycGhhbl9jYnNfdGFpbCA9IHJkcC0+bnh0bGlzdDsKKwlyc3AtPm9ycGhhbl9jYnNfdGFpbCA9IHJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9UQUlMXTsKKwlyZHAtPm54dGxpc3QgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBSQ1VfTkVYVF9TSVpFOyBpKyspCisJCXJkcC0+bnh0dGFpbFtpXSA9ICZyZHAtPm54dGxpc3Q7CisJcnNwLT5vcnBoYW5fcWxlbiArPSByZHAtPnFsZW47CisJcmRwLT5xbGVuID0gMDsKKwlzcGluX3VubG9jaygmcnNwLT5vbm9mZmxvY2spOyAgLyogaXJxcyByZW1haW4gZGlzYWJsZWQuICovCit9CisKKy8qCisgKiBBZG9wdCBwcmV2aW91c2x5IG9ycGhhbmVkIFJDVSBjYWxsYmFja3MuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV9hZG9wdF9vcnBoYW5fY2JzKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByY3VfZGF0YSAqcmRwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJzcC0+b25vZmZsb2NrLCBmbGFncyk7CisJcmRwID0gcnNwLT5yZGFbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlpZiAocnNwLT5vcnBoYW5fY2JzX2xpc3QgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc3AtPm9ub2ZmbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCSpyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF0gPSByc3AtPm9ycGhhbl9jYnNfbGlzdDsKKwlyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF0gPSByc3AtPm9ycGhhbl9jYnNfdGFpbDsKKwlyZHAtPnFsZW4gKz0gcnNwLT5vcnBoYW5fcWxlbjsKKwlyc3AtPm9ycGhhbl9jYnNfbGlzdCA9IE5VTEw7CisJcnNwLT5vcnBoYW5fY2JzX3RhaWwgPSAmcnNwLT5vcnBoYW5fY2JzX2xpc3Q7CisJcnNwLT5vcnBoYW5fcWxlbiA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwLT5vbm9mZmxvY2ssIGZsYWdzKTsKK30KKworLyoKICAqIFJlbW92ZSB0aGUgb3V0Z29pbmcgQ1BVIGZyb20gdGhlIGJpdG1hc2tzIGluIHRoZSByY3Vfbm9kZSBoaWVyYXJjaHkKICAqIGFuZCBtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgb3V0Z29pbmcgQ1BVIHRvIHRoZSBjdXJyZW50IG9uZS4KICAqLwogc3RhdGljIHZvaWQgX19yY3Vfb2ZmbGluZV9jcHUoaW50IGNwdSwgc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQogewotCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJbG9uZyBsYXN0Y29tcDsKIAl1bnNpZ25lZCBsb25nIG1hc2s7CiAJc3RydWN0IHJjdV9kYXRhICpyZHAgPSByc3AtPnJkYVtjcHVdOwotCXN0cnVjdCByY3VfZGF0YSAqcmRwX21lOwogCXN0cnVjdCByY3Vfbm9kZSAqcm5wOwogCiAJLyogRXhjbHVkZSBhbnkgYXR0ZW1wdHMgdG8gc3RhcnQgYSBuZXcgZ3JhY2UgcGVyaW9kLiAqLwpAQCAtODY4LDM5ICs5MTMsMjkgQEAKIAkJCXNwaW5fdW5sb2NrKCZybnAtPmxvY2spOyAvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gKi8KIAkJCWJyZWFrOwogCQl9Ci0JCXJjdV9wcmVlbXB0X29mZmxpbmVfdGFza3MocnNwLCBybnAsIHJkcCk7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgd2FzIGEgdGFzayBibG9ja2luZyB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QsCisJCSAqIGFuZCBpZiBhbGwgQ1BVcyBoYXZlIGNoZWNrZWQgaW4sIHdlIG5lZWQgdG8gcHJvcGFnYXRlCisJCSAqIHRoZSBxdWllc2NlbnQgc3RhdGUgdXAgdGhlIHJjdV9ub2RlIGhpZXJhcmNoeS4gIEJ1dCB0aGF0CisJCSAqIGlzIGluY29udmVuaWVudCBhdCB0aGUgbW9tZW50IGR1ZSB0byBkZWFkbG9jayBpc3N1ZXMgaWYKKwkJICogdGhpcyBzaG91bGQgZW5kIHRoZSBjdXJyZW50IGdyYWNlIHBlcmlvZC4gIFNvIHNldCB0aGUKKwkJICogb2ZmbGluZWQgQ1BVJ3MgYml0IGluIC0+cXNtYXNrIGluIG9yZGVyIHRvIGZvcmNlIHRoZQorCQkgKiBuZXh0IGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpIGludm9jYXRpb24gdG8gY2xlYW4gdXAgdGhpcworCQkgKiBtZXNzIGluIGEgZGVhZGxvY2stZnJlZSBtYW5uZXIuCisJCSAqLworCQlpZiAocmN1X3ByZWVtcHRfb2ZmbGluZV90YXNrcyhyc3AsIHJucCwgcmRwKSAmJiAhcm5wLT5xc21hc2spCisJCQlybnAtPnFzbWFzayB8PSBtYXNrOworCiAJCW1hc2sgPSBybnAtPmdycG1hc2s7CiAJCXNwaW5fdW5sb2NrKCZybnAtPmxvY2spOwkvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gKi8KIAkJcm5wID0gcm5wLT5wYXJlbnQ7CiAJfSB3aGlsZSAocm5wICE9IE5VTEwpOwogCWxhc3Rjb21wID0gcnNwLT5jb21wbGV0ZWQ7CiAKLQlzcGluX3VubG9jaygmcnNwLT5vbm9mZmxvY2spOwkJLyogaXJxcyByZW1haW4gZGlzYWJsZWQuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwLT5vbm9mZmxvY2ssIGZsYWdzKTsKIAotCS8qCi0JICogTW92ZSBjYWxsYmFja3MgZnJvbSB0aGUgb3V0Z29pbmcgQ1BVIHRvIHRoZSBydW5uaW5nIENQVS4KLQkgKiBOb3RlIHRoYXQgdGhlIG91dGdvaW5nIENQVSBpcyBub3cgcXVpc2NlbnQsIHNvIGl0IGlzIG5vdwotCSAqICh1bmNoYXJhY3RlcmlzdGljYWxseSkgc2FmZSB0byBhY2Nlc3MgaXRzIHJjdV9kYXRhIHN0cnVjdHVyZS4KLQkgKiBOb3RlIGFsc28gdGhhdCB3ZSBtdXN0IGNhcmVmdWxseSByZXRhaW4gdGhlIG9yZGVyIG9mIHRoZQotCSAqIG91dGdvaW5nIENQVSdzIGNhbGxiYWNrcyBpbiBvcmRlciBmb3IgcmN1X2JhcnJpZXIoKSB0byB3b3JrCi0JICogY29ycmVjdGx5LiAgRmluYWxseSwgbm90ZSB0aGF0IHdlIHN0YXJ0IGFsbCB0aGUgY2FsbGJhY2tzCi0JICogYWZyZXNoLCBldmVuIHRob3NlIHRoYXQgaGF2ZSBwYXNzZWQgdGhyb3VnaCBhIGdyYWNlIHBlcmlvZAotCSAqIGFuZCBhcmUgdGhlcmVmb3JlIHJlYWR5IHRvIGludm9rZS4gIFRoZSB0aGVvcnkgaXMgdGhhdCBob3RwbHVnCi0JICogZXZlbnRzIGFyZSByYXJlLCBhbmQgdGhhdCBpZiB0aGV5IGFyZSBmcmVxdWVudCBlbm91Z2ggdG8KLQkgKiBpbmRlZmluaXRlbHkgZGVsYXkgY2FsbGJhY2tzLCB5b3UgaGF2ZSBmYXIgd29yc2UgdGhpbmdzIHRvCi0JICogYmUgd29ycnlpbmcgYWJvdXQuCi0JICovCi0JcmRwX21lID0gcnNwLT5yZGFbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQlpZiAocmRwLT5ueHRsaXN0ICE9IE5VTEwpIHsKLQkJKnJkcF9tZS0+bnh0dGFpbFtSQ1VfTkVYVF9UQUlMXSA9IHJkcC0+bnh0bGlzdDsKLQkJcmRwX21lLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdID0gcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdOwotCQlyZHAtPm54dGxpc3QgPSBOVUxMOwotCQlmb3IgKGkgPSAwOyBpIDwgUkNVX05FWFRfU0laRTsgaSsrKQotCQkJcmRwLT5ueHR0YWlsW2ldID0gJnJkcC0+bnh0bGlzdDsKLQkJcmRwX21lLT5xbGVuICs9IHJkcC0+cWxlbjsKLQkJcmRwLT5xbGVuID0gMDsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJjdV9hZG9wdF9vcnBoYW5fY2JzKHJzcCk7CiB9CiAKIC8qCkBAIC05MTgsNiArOTUzLDE0IEBACiAKICNlbHNlIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAorc3RhdGljIHZvaWQgcmN1X3NlbmRfY2JzX3RvX29ycGhhbmFnZShzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7Cit9CisKK3N0YXRpYyB2b2lkIHJjdV9hZG9wdF9vcnBoYW5fY2JzKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKK30KKwogc3RhdGljIHZvaWQgcmN1X29mZmxpbmVfY3B1KGludCBjcHUpCiB7CiB9CkBAIC05MjgsNyArOTcxLDcgQEAKICAqIEludm9rZSBhbnkgUkNVIGNhbGxiYWNrcyB0aGF0IGhhdmUgbWFkZSBpdCB0byB0aGUgZW5kIG9mIHRoZWlyIGdyYWNlCiAgKiBwZXJpb2QuICBUaG90dGxlIGFzIHNwZWNpZmllZCBieSByZHAtPmJsaW1pdC4KICAqLwotc3RhdGljIHZvaWQgcmN1X2RvX2JhdGNoKHN0cnVjdCByY3VfZGF0YSAqcmRwKQorc3RhdGljIHZvaWQgcmN1X2RvX2JhdGNoKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcmN1X2hlYWQgKm5leHQsICpsaXN0LCAqKnRhaWw7CkBAIC05ODEsNiArMTAyNCwxMyBAQAogCWlmIChyZHAtPmJsaW1pdCA9PSBMT05HX01BWCAmJiByZHAtPnFsZW4gPD0gcWxvd21hcmspCiAJCXJkcC0+YmxpbWl0ID0gYmxpbWl0OwogCisJLyogUmVzZXQgLT5xbGVuX2xhc3RfZnFzX2NoZWNrIHRyaWdnZXIgaWYgZW5vdWdoIENCcyBoYXZlIGRyYWluZWQuICovCisJaWYgKHJkcC0+cWxlbiA9PSAwICYmIHJkcC0+cWxlbl9sYXN0X2Zxc19jaGVjayAhPSAwKSB7CisJCXJkcC0+cWxlbl9sYXN0X2Zxc19jaGVjayA9IDA7CisJCXJkcC0+bl9mb3JjZV9xc19zbmFwID0gcnNwLT5uX2ZvcmNlX3FzOworCX0gZWxzZSBpZiAocmRwLT5xbGVuIDwgcmRwLT5xbGVuX2xhc3RfZnFzX2NoZWNrIC0gcWhpbWFyaykKKwkJcmRwLT5xbGVuX2xhc3RfZnFzX2NoZWNrID0gcmRwLT5xbGVuOworCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJLyogUmUtcmFpc2UgdGhlIFJDVSBzb2Z0aXJxIGlmIHRoZXJlIGFyZSBjYWxsYmFja3MgcmVtYWluaW5nLiAqLwpAQCAtMTA1MCwzMyArMTEwMCwzMiBAQAogCWludCBjcHU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIG1hc2s7Ci0Jc3RydWN0IHJjdV9ub2RlICpybnBfY3VyID0gcnNwLT5sZXZlbFtOVU1fUkNVX0xWTFMgLSAxXTsKLQlzdHJ1Y3QgcmN1X25vZGUgKnJucF9lbmQgPSAmcnNwLT5ub2RlW05VTV9SQ1VfTk9ERVNdOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wOwogCi0JZm9yICg7IHJucF9jdXIgPCBybnBfZW5kOyBybnBfY3VyKyspIHsKKwlyY3VfZm9yX2VhY2hfbGVhZl9ub2RlKHJzcCwgcm5wKSB7CiAJCW1hc2sgPSAwOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcm5wX2N1ci0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJCWlmIChyc3AtPmNvbXBsZXRlZCAhPSBsYXN0Y29tcCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wX2N1ci0+bG9jaywgZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gMTsKIAkJfQotCQlpZiAocm5wX2N1ci0+cXNtYXNrID09IDApIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucF9jdXItPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHJucC0+cXNtYXNrID09IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCQkJY29udGludWU7CiAJCX0KLQkJY3B1ID0gcm5wX2N1ci0+Z3JwbG87CisJCWNwdSA9IHJucC0+Z3JwbG87CiAJCWJpdCA9IDE7Ci0JCWZvciAoOyBjcHUgPD0gcm5wX2N1ci0+Z3JwaGk7IGNwdSsrLCBiaXQgPDw9IDEpIHsKLQkJCWlmICgocm5wX2N1ci0+cXNtYXNrICYgYml0KSAhPSAwICYmIGYocnNwLT5yZGFbY3B1XSkpCisJCWZvciAoOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyssIGJpdCA8PD0gMSkgeworCQkJaWYgKChybnAtPnFzbWFzayAmIGJpdCkgIT0gMCAmJiBmKHJzcC0+cmRhW2NwdV0pKQogCQkJCW1hc2sgfD0gYml0OwogCQl9CiAJCWlmIChtYXNrICE9IDAgJiYgcnNwLT5jb21wbGV0ZWQgPT0gbGFzdGNvbXApIHsKIAotCQkJLyogY3B1X3F1aWV0X21zaygpIHJlbGVhc2VzIHJucF9jdXItPmxvY2suICovCi0JCQljcHVfcXVpZXRfbXNrKG1hc2ssIHJzcCwgcm5wX2N1ciwgZmxhZ3MpOworCQkJLyogY3B1X3F1aWV0X21zaygpIHJlbGVhc2VzIHJucC0+bG9jay4gKi8KKwkJCWNwdV9xdWlldF9tc2sobWFzaywgcnNwLCBybnAsIGZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucF9jdXItPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTA5Miw3ICsxMTQxLDcgQEAKIAlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJjdV9nZXRfcm9vdChyc3ApOwogCXU4IHNpZ25hbGVkOwogCi0JaWYgKEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSA9PSBBQ0NFU1NfT05DRShyc3AtPmdwbnVtKSkKKwlpZiAoIXJjdV9ncF9pbl9wcm9ncmVzcyhyc3ApKQogCQlyZXR1cm47ICAvKiBObyBncmFjZSBwZXJpb2QgaW4gcHJvZ3Jlc3MsIG5vdGhpbmcgdG8gZm9yY2UuICovCiAJaWYgKCFzcGluX3RyeWxvY2tfaXJxc2F2ZSgmcnNwLT5mcXNsb2NrLCBmbGFncykpIHsKIAkJcnNwLT5uX2ZvcmNlX3FzX2xoKys7IC8qIEluZXhhY3QsIGNhbiBsb3NlIGNvdW50cy4gIFRvdWdoISAqLwpAQCAtMTE5NSw3ICsxMjQ0LDcgQEAKIAl9CiAKIAkvKiBJZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHJlYWR5LCBpbnZva2UgdGhlbS4gKi8KLQlyY3VfZG9fYmF0Y2gocmRwKTsKKwlyY3VfZG9fYmF0Y2gocnNwLCByZHApOwogfQogCiAvKgpAQCAtMTI1MSw3ICsxMzAwLDcgQEAKIAlyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF0gPSAmaGVhZC0+bmV4dDsKIAogCS8qIFN0YXJ0IGEgbmV3IGdyYWNlIHBlcmlvZCBpZiBvbmUgbm90IGFscmVhZHkgc3RhcnRlZC4gKi8KLQlpZiAoQUNDRVNTX09OQ0UocnNwLT5jb21wbGV0ZWQpID09IEFDQ0VTU19PTkNFKHJzcC0+Z3BudW0pKSB7CisJaWYgKCFyY3VfZ3BfaW5fcHJvZ3Jlc3MocnNwKSkgewogCQl1bnNpZ25lZCBsb25nIG5lc3RmbGFnOwogCQlzdHJ1Y3QgcmN1X25vZGUgKnJucF9yb290ID0gcmN1X2dldF9yb290KHJzcCk7CiAKQEAgLTEyNTksMTAgKzEzMDgsMjAgQEAKIAkJcmN1X3N0YXJ0X2dwKHJzcCwgbmVzdGZsYWcpOyAgLyogcmVsZWFzZXMgcm5wX3Jvb3QtPmxvY2suICovCiAJfQogCi0JLyogRm9yY2UgdGhlIGdyYWNlIHBlcmlvZCBpZiB0b28gbWFueSBjYWxsYmFja3Mgb3IgdG9vIGxvbmcgd2FpdGluZy4gKi8KLQlpZiAodW5saWtlbHkoKytyZHAtPnFsZW4gPiBxaGltYXJrKSkgeworCS8qCisJICogRm9yY2UgdGhlIGdyYWNlIHBlcmlvZCBpZiB0b28gbWFueSBjYWxsYmFja3Mgb3IgdG9vIGxvbmcgd2FpdGluZy4KKwkgKiBFbmZvcmNlIGh5c3RlcmVzaXMsIGFuZCBkb24ndCBpbnZva2UgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCkKKwkgKiBpZiBzb21lIG90aGVyIENQVSBoYXMgcmVjZW50bHkgZG9uZSBzby4gIEFsc28sIGRvbid0IGJvdGhlcgorCSAqIGludm9raW5nIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpIGlmIHRoZSBuZXdseSBlbnF1ZXVlZCBjYWxsYmFjaworCSAqIGlzIHRoZSBvbmx5IG9uZSB3YWl0aW5nIGZvciBhIGdyYWNlIHBlcmlvZCB0byBjb21wbGV0ZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoKytyZHAtPnFsZW4gPiByZHAtPnFsZW5fbGFzdF9mcXNfY2hlY2sgKyBxaGltYXJrKSkgewogCQlyZHAtPmJsaW1pdCA9IExPTkdfTUFYOwotCQlmb3JjZV9xdWllc2NlbnRfc3RhdGUocnNwLCAwKTsKKwkJaWYgKHJzcC0+bl9mb3JjZV9xcyA9PSByZHAtPm5fZm9yY2VfcXNfc25hcCAmJgorCQkgICAgKnJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSAhPSBoZWFkKQorCQkJZm9yY2VfcXVpZXNjZW50X3N0YXRlKHJzcCwgMCk7CisJCXJkcC0+bl9mb3JjZV9xc19zbmFwID0gcnNwLT5uX2ZvcmNlX3FzOworCQlyZHAtPnFsZW5fbGFzdF9mcXNfY2hlY2sgPSByZHAtPnFsZW47CiAJfSBlbHNlIGlmICgobG9uZykoQUNDRVNTX09OQ0UocnNwLT5qaWZmaWVzX2ZvcmNlX3FzKSAtIGppZmZpZXMpIDwgMCkKIAkJZm9yY2VfcXVpZXNjZW50X3N0YXRlKHJzcCwgMSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMTMzMSw3ICsxMzkwLDcgQEAKIAl9CiAKIAkvKiBIYXMgYW4gUkNVIEdQIGdvbmUgbG9uZyBlbm91Z2ggdG8gc2VuZCByZXNjaGVkIElQSXMgJmM/ICovCi0JaWYgKEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSAhPSBBQ0NFU1NfT05DRShyc3AtPmdwbnVtKSAmJgorCWlmIChyY3VfZ3BfaW5fcHJvZ3Jlc3MocnNwKSAmJgogCSAgICAoKGxvbmcpKEFDQ0VTU19PTkNFKHJzcC0+amlmZmllc19mb3JjZV9xcykgLSBqaWZmaWVzKSA8IDApKSB7CiAJCXJkcC0+bl9ycF9uZWVkX2ZxcysrOwogCQlyZXR1cm4gMTsKQEAgLTEzNjgsNiArMTQyNyw4MiBAQAogCSAgICAgICByY3VfcHJlZW1wdF9uZWVkc19jcHUoY3B1KTsKIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCByY3VfaGVhZCwgcmN1X2JhcnJpZXJfaGVhZCkgPSB7TlVMTH07CitzdGF0aWMgYXRvbWljX3QgcmN1X2JhcnJpZXJfY3B1X2NvdW50Oworc3RhdGljIERFRklORV9NVVRFWChyY3VfYmFycmllcl9tdXRleCk7CitzdGF0aWMgc3RydWN0IGNvbXBsZXRpb24gcmN1X2JhcnJpZXJfY29tcGxldGlvbjsKKworc3RhdGljIHZvaWQgcmN1X2JhcnJpZXJfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpub3R1c2VkKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyY3VfYmFycmllcl9jcHVfY291bnQpKQorCQljb21wbGV0ZSgmcmN1X2JhcnJpZXJfY29tcGxldGlvbik7Cit9CisKKy8qCisgKiBDYWxsZWQgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkLCBhbmQgZnJvbSBjcm9zcy1jcHUgSVJRIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV9iYXJyaWVyX2Z1bmModm9pZCAqdHlwZSkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCByY3VfaGVhZCAqaGVhZCA9ICZwZXJfY3B1KHJjdV9iYXJyaWVyX2hlYWQsIGNwdSk7CisJdm9pZCAoKmNhbGxfcmN1X2Z1bmMpKHN0cnVjdCByY3VfaGVhZCAqaGVhZCwKKwkJCSAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpKTsKKworCWF0b21pY19pbmMoJnJjdV9iYXJyaWVyX2NwdV9jb3VudCk7CisJY2FsbF9yY3VfZnVuYyA9IHR5cGU7CisJY2FsbF9yY3VfZnVuYyhoZWFkLCByY3VfYmFycmllcl9jYWxsYmFjayk7Cit9CisKKy8qCisgKiBPcmNoZXN0cmF0ZSB0aGUgc3BlY2lmaWVkIHR5cGUgb2YgUkNVIGJhcnJpZXIsIHdhaXRpbmcgZm9yIGFsbAorICogUkNVIGNhbGxiYWNrcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdG8gY29tcGxldGUuCisgKi8KK3N0YXRpYyB2b2lkIF9yY3VfYmFycmllcihzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCisJCQkgdm9pZCAoKmNhbGxfcmN1X2Z1bmMpKHN0cnVjdCByY3VfaGVhZCAqaGVhZCwKKwkJCQkJICAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpKSkKK3sKKwlCVUdfT04oaW5faW50ZXJydXB0KCkpOworCS8qIFRha2UgbXV0ZXggdG8gc2VyaWFsaXplIGNvbmN1cnJlbnQgcmN1X2JhcnJpZXIoKSByZXF1ZXN0cy4gKi8KKwltdXRleF9sb2NrKCZyY3VfYmFycmllcl9tdXRleCk7CisJaW5pdF9jb21wbGV0aW9uKCZyY3VfYmFycmllcl9jb21wbGV0aW9uKTsKKwkvKgorCSAqIEluaXRpYWxpemUgcmN1X2JhcnJpZXJfY3B1X2NvdW50IHRvIDEsIHRoZW4gaW52b2tlCisJICogcmN1X2JhcnJpZXJfZnVuYygpIG9uIGVhY2ggQ1BVLCBzbyB0aGF0IGVhY2ggQ1BVIGFsc28gaGFzCisJICogaW5jcmVtZW50ZWQgcmN1X2JhcnJpZXJfY3B1X2NvdW50LiAgT25seSB0aGVuIGlzIGl0IHNhZmUgdG8KKwkgKiBkZWNyZW1lbnQgcmN1X2JhcnJpZXJfY3B1X2NvdW50IC0tIG90aGVyd2lzZSB0aGUgZmlyc3QgQ1BVCisJICogbWlnaHQgY29tcGxldGUgaXRzIGdyYWNlIHBlcmlvZCBiZWZvcmUgYWxsIG9mIHRoZSBvdGhlciBDUFVzCisJICogZGlkIHRoZWlyIGluY3JlbWVudCwgY2F1c2luZyB0aGlzIGZ1bmN0aW9uIHRvIHJldHVybiB0b28KKwkgKiBlYXJseS4KKwkgKi8KKwlhdG9taWNfc2V0KCZyY3VfYmFycmllcl9jcHVfY291bnQsIDEpOworCXByZWVtcHRfZGlzYWJsZSgpOyAvKiBzdG9wIENQVV9EWUlORyBmcm9tIGZpbGxpbmcgb3JwaGFuX2Nic19saXN0ICovCisJcmN1X2Fkb3B0X29ycGhhbl9jYnMocnNwKTsKKwlvbl9lYWNoX2NwdShyY3VfYmFycmllcl9mdW5jLCAodm9pZCAqKWNhbGxfcmN1X2Z1bmMsIDEpOworCXByZWVtcHRfZW5hYmxlKCk7IC8qIENQVV9EWUlORyBjYW4gYWdhaW4gZmlsbCBvcnBoYW5fY2JzX2xpc3QgKi8KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmN1X2JhcnJpZXJfY3B1X2NvdW50KSkKKwkJY29tcGxldGUoJnJjdV9iYXJyaWVyX2NvbXBsZXRpb24pOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJjdV9iYXJyaWVyX2NvbXBsZXRpb24pOworCW11dGV4X3VubG9jaygmcmN1X2JhcnJpZXJfbXV0ZXgpOworfQorCisvKioKKyAqIHJjdV9iYXJyaWVyX2JoIC0gV2FpdCB1bnRpbCBhbGwgaW4tZmxpZ2h0IGNhbGxfcmN1X2JoKCkgY2FsbGJhY2tzIGNvbXBsZXRlLgorICovCit2b2lkIHJjdV9iYXJyaWVyX2JoKHZvaWQpCit7CisJX3JjdV9iYXJyaWVyKCZyY3VfYmhfc3RhdGUsIGNhbGxfcmN1X2JoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJjdV9iYXJyaWVyX2JoKTsKKworLyoqCisgKiByY3VfYmFycmllcl9zY2hlZCAtIFdhaXQgZm9yIGluLWZsaWdodCBjYWxsX3JjdV9zY2hlZCgpIGNhbGxiYWNrcy4KKyAqLwordm9pZCByY3VfYmFycmllcl9zY2hlZCh2b2lkKQoreworCV9yY3VfYmFycmllcigmcmN1X3NjaGVkX3N0YXRlLCBjYWxsX3JjdV9zY2hlZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyY3VfYmFycmllcl9zY2hlZCk7CisKIC8qCiAgKiBEbyBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gb2YgYSBDUFUncyBwZXItQ1BVIFJDVSBkYXRhLgogICovCkBAIC0xNDE4LDYgKzE1NTMsOCBAQAogCXJkcC0+YmVlbm9ubGluZSA9IDE7CSAvKiBXZSBoYXZlIG5vdyBiZWVuIG9ubGluZS4gKi8KIAlyZHAtPnByZWVtcHRhYmxlID0gcHJlZW1wdGFibGU7CiAJcmRwLT5wYXNzZWRfcXVpZXNjX2NvbXBsZXRlZCA9IGxhc3Rjb21wIC0gMTsKKwlyZHAtPnFsZW5fbGFzdF9mcXNfY2hlY2sgPSAwOworCXJkcC0+bl9mb3JjZV9xc19zbmFwID0gcnNwLT5uX2ZvcmNlX3FzOwogCXJkcC0+YmxpbWl0ID0gYmxpbWl0OwogCXNwaW5fdW5sb2NrKCZybnAtPmxvY2spOwkJLyogaXJxcyByZW1haW4gZGlzYWJsZWQuICovCiAKQEAgLTE0NjQsNiArMTYwMSwyMiBAQAogCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgogCQlyY3Vfb25saW5lX2NwdShjcHUpOwogCQlicmVhazsKKwljYXNlIENQVV9EWUlORzoKKwljYXNlIENQVV9EWUlOR19GUk9aRU46CisJCS8qCisJCSAqIHByZWVtcHRfZGlzYWJsZSgpIGluIF9yY3VfYmFycmllcigpIHByZXZlbnRzIHN0b3BfbWFjaGluZSgpLAorCQkgKiBzbyB3aGVuICJvbl9lYWNoX2NwdShyY3VfYmFycmllcl9mdW5jLCAodm9pZCAqKXR5cGUsIDEpOyIKKwkJICogcmV0dXJucywgYWxsIG9ubGluZSBjcHVzIGhhdmUgcXVldWVkIHJjdV9iYXJyaWVyX2Z1bmMoKS4KKwkJICogVGhlIGR5aW5nIENQVSBjbGVhcnMgaXRzIGNwdV9vbmxpbmVfbWFzayBiaXQgYW5kCisJCSAqIG1vdmVzIGFsbCBvZiBpdHMgUkNVIGNhbGxiYWNrcyB0byAtPm9ycGhhbl9jYnNfbGlzdAorCQkgKiBpbiB0aGUgY29udGV4dCBvZiBzdG9wX21hY2hpbmUoKSwgc28gc3Vic2VxdWVudCBjYWxscworCQkgKiB0byBfcmN1X2JhcnJpZXIoKSB3aWxsIGFkb3B0IHRoZXNlIGNhbGxiYWNrcyBhbmQgb25seQorCQkgKiB0aGVuIHF1ZXVlIHJjdV9iYXJyaWVyX2Z1bmMoKSBvbiBhbGwgcmVtYWluaW5nIENQVXMuCisJCSAqLworCQlyY3Vfc2VuZF9jYnNfdG9fb3JwaGFuYWdlKCZyY3VfYmhfc3RhdGUpOworCQlyY3Vfc2VuZF9jYnNfdG9fb3JwaGFuYWdlKCZyY3Vfc2NoZWRfc3RhdGUpOworCQlyY3VfcHJlZW1wdF9zZW5kX2Nic190b19vcnBoYW5hZ2UoKTsKKwkJYnJlYWs7CiAJY2FzZSBDUFVfREVBRDoKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKIAljYXNlIENQVV9VUF9DQU5DRUxFRDoKQEAgLTE1MjYsNyArMTY3OSw4IEBACiAJCWNwdXN0cmlkZSAqPSByc3AtPmxldmVsc3ByZWFkW2ldOwogCQlybnAgPSByc3AtPmxldmVsW2ldOwogCQlmb3IgKGogPSAwOyBqIDwgcnNwLT5sZXZlbGNudFtpXTsgaisrLCBybnArKykgewotCQkJc3Bpbl9sb2NrX2luaXQoJnJucC0+bG9jayk7CisJCQlpZiAocm5wICE9IHJjdV9nZXRfcm9vdChyc3ApKQorCQkJCXNwaW5fbG9ja19pbml0KCZybnAtPmxvY2spOwogCQkJcm5wLT5ncG51bSA9IDA7CiAJCQlybnAtPnFzbWFzayA9IDA7CiAJCQlybnAtPnFzbWFza2luaXQgPSAwOwpAQCAtMTU0OSw2ICsxNzAzLDcgQEAKIAkJCUlOSVRfTElTVF9IRUFEKCZybnAtPmJsb2NrZWRfdGFza3NbMV0pOwogCQl9CiAJfQorCXNwaW5fbG9ja19pbml0KCZyY3VfZ2V0X3Jvb3QocnNwKS0+bG9jayk7CiB9CiAKIC8qCkBAIC0xNTU4LDYgKzE3MTMsMTAgQEAKICAqLwogI2RlZmluZSBSQ1VfSU5JVF9GTEFWT1IocnNwLCByY3VfZGF0YSkgXAogZG8geyBcCisJaW50IGk7IFwKKwlpbnQgajsgXAorCXN0cnVjdCByY3Vfbm9kZSAqcm5wOyBcCisJXAogCXJjdV9pbml0X29uZShyc3ApOyBcCiAJcm5wID0gKHJzcCktPmxldmVsW05VTV9SQ1VfTFZMUyAtIDFdOyBcCiAJaiA9IDA7IFwKQEAgLTE1NzAsMzEgKzE3MjksOCBAQAogCX0gXAogfSB3aGlsZSAoMCkKIAotI2lmZGVmIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVCi0KLXZvaWQgX19pbml0IF9fcmN1X2luaXRfcHJlZW1wdCh2b2lkKQotewotCWludCBpOwkJCS8qIEFsbCB1c2VkIGJ5IFJDVV9JTklUX0ZMQVZPUigpLiAqLwotCWludCBqOwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wOwotCi0JUkNVX0lOSVRfRkxBVk9SKCZyY3VfcHJlZW1wdF9zdGF0ZSwgcmN1X3ByZWVtcHRfZGF0YSk7Ci19Ci0KLSNlbHNlIC8qICNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSAqLwotCi12b2lkIF9faW5pdCBfX3JjdV9pbml0X3ByZWVtcHQodm9pZCkKLXsKLX0KLQotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSAqLwotCiB2b2lkIF9faW5pdCBfX3JjdV9pbml0KHZvaWQpCiB7Ci0JaW50IGk7CQkJLyogQWxsIHVzZWQgYnkgUkNVX0lOSVRfRkxBVk9SKCkuICovCi0JaW50IGo7Ci0Jc3RydWN0IHJjdV9ub2RlICpybnA7Ci0KIAlyY3VfYm9vdHVwX2Fubm91bmNlKCk7CiAjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKIAlwcmludGsoS0VSTl9JTkZPICJSQ1UtYmFzZWQgZGV0ZWN0aW9uIG9mIHN0YWxsZWQgQ1BVcyBpcyBlbmFibGVkLlxuIik7CkBAIC0xNjA1LDYgKzE3NDEsNCBAQAogCW9wZW5fc29mdGlycShSQ1VfU09GVElSUSwgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKTsKIH0KIAotbW9kdWxlX3BhcmFtKGJsaW1pdCwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShxaGltYXJrLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKHFsb3dtYXJrLCBpbnQsIDApOworI2luY2x1ZGUgInJjdXRyZWVfcGx1Z2luLmgiCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZS5oIGIva2VybmVsL3JjdXRyZWUuaAppbmRleCA4ZTgyODdhLi4xODIzYzZlIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZS5oCisrKyBiL2tlcm5lbC9yY3V0cmVlLmgKQEAgLTQ4LDE0ICs0OCwxNCBAQAogI2VsaWYgTlJfQ1BVUyA8PSBSQ1VfRkFOT1VUX1NRCiAjICBkZWZpbmUgTlVNX1JDVV9MVkxTCSAgICAgIDIKICMgIGRlZmluZSBOVU1fUkNVX0xWTF8wCSAgICAgIDEKLSMgIGRlZmluZSBOVU1fUkNVX0xWTF8xCSAgICAgICgoKE5SX0NQVVMpICsgUkNVX0ZBTk9VVCAtIDEpIC8gUkNVX0ZBTk9VVCkKKyMgIGRlZmluZSBOVU1fUkNVX0xWTF8xCSAgICAgIERJVl9ST1VORF9VUChOUl9DUFVTLCBSQ1VfRkFOT1VUKQogIyAgZGVmaW5lIE5VTV9SQ1VfTFZMXzIJICAgICAgKE5SX0NQVVMpCiAjICBkZWZpbmUgTlVNX1JDVV9MVkxfMwkgICAgICAwCiAjZWxpZiBOUl9DUFVTIDw9IFJDVV9GQU5PVVRfQ1VCRQogIyAgZGVmaW5lIE5VTV9SQ1VfTFZMUwkgICAgICAzCiAjICBkZWZpbmUgTlVNX1JDVV9MVkxfMAkgICAgICAxCi0jICBkZWZpbmUgTlVNX1JDVV9MVkxfMQkgICAgICAoKChOUl9DUFVTKSArIFJDVV9GQU5PVVRfU1EgLSAxKSAvIFJDVV9GQU5PVVRfU1EpCi0jICBkZWZpbmUgTlVNX1JDVV9MVkxfMgkgICAgICAoKChOUl9DUFVTKSArIChSQ1VfRkFOT1VUKSAtIDEpIC8gKFJDVV9GQU5PVVQpKQorIyAgZGVmaW5lIE5VTV9SQ1VfTFZMXzEJICAgICAgRElWX1JPVU5EX1VQKE5SX0NQVVMsIFJDVV9GQU5PVVRfU1EpCisjICBkZWZpbmUgTlVNX1JDVV9MVkxfMgkgICAgICBESVZfUk9VTkRfVVAoTlJfQ1BVUywgUkNVX0ZBTk9VVCkKICMgIGRlZmluZSBOVU1fUkNVX0xWTF8zCSAgICAgIE5SX0NQVVMKICNlbHNlCiAjIGVycm9yICJDT05GSUdfUkNVX0ZBTk9VVCBpbnN1ZmZpY2llbnQgZm9yIE5SX0NQVVMiCkBAIC03OSwxNSArNzksMjEgQEAKICAqIERlZmluaXRpb24gZm9yIG5vZGUgd2l0aGluIHRoZSBSQ1UgZ3JhY2UtcGVyaW9kLWRldGVjdGlvbiBoaWVyYXJjaHkuCiAgKi8KIHN0cnVjdCByY3Vfbm9kZSB7Ci0Jc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3QgbG9jazsJLyogUm9vdCByY3Vfbm9kZSdzIGxvY2sgcHJvdGVjdHMgc29tZSAqLworCQkJCS8qICByY3Vfc3RhdGUgZmllbGRzIGFzIHdlbGwgYXMgZm9sbG93aW5nLiAqLwogCWxvbmcJZ3BudW07CQkvKiBDdXJyZW50IGdyYWNlIHBlcmlvZCBmb3IgdGhpcyBub2RlLiAqLwogCQkJCS8qICBUaGlzIHdpbGwgZWl0aGVyIGJlIGVxdWFsIHRvIG9yIG9uZSAqLwogCQkJCS8qICBiZWhpbmQgdGhlIHJvb3QgcmN1X25vZGUncyBncG51bS4gKi8KIAl1bnNpZ25lZCBsb25nIHFzbWFzazsJLyogQ1BVcyBvciBncm91cHMgdGhhdCBuZWVkIHRvIHN3aXRjaCBpbiAqLwogCQkJCS8qICBvcmRlciBmb3IgY3VycmVudCBncmFjZSBwZXJpb2QgdG8gcHJvY2VlZC4qLworCQkJCS8qICBJbiBsZWFmIHJjdV9ub2RlLCBlYWNoIGJpdCBjb3JyZXNwb25kcyB0byAqLworCQkJCS8qICBhbiByY3VfZGF0YSBzdHJ1Y3R1cmUsIG90aGVyd2lzZSwgZWFjaCAqLworCQkJCS8qICBiaXQgY29ycmVzcG9uZHMgdG8gYSBjaGlsZCByY3Vfbm9kZSAqLworCQkJCS8qICBzdHJ1Y3R1cmUuICovCiAJdW5zaWduZWQgbG9uZyBxc21hc2tpbml0OwogCQkJCS8qIFBlci1HUCBpbml0aWFsaXphdGlvbiBmb3IgcXNtYXNrLiAqLwogCXVuc2lnbmVkIGxvbmcgZ3JwbWFzazsJLyogTWFzayB0byBhcHBseSB0byBwYXJlbnQgcXNtYXNrLiAqLworCQkJCS8qICBPbmx5IG9uZSBiaXQgd2lsbCBiZSBzZXQgaW4gdGhpcyBtYXNrLiAqLwogCWludAlncnBsbzsJCS8qIGxvd2VzdC1udW1iZXJlZCBDUFUgb3IgZ3JvdXAgaGVyZS4gKi8KIAlpbnQJZ3JwaGk7CQkvKiBoaWdoZXN0LW51bWJlcmVkIENQVSBvciBncm91cCBoZXJlLiAqLwogCXU4CWdycG51bTsJCS8qIENQVS9ncm91cCBudW1iZXIgZm9yIG5leHQgbGV2ZWwgdXAuICovCkBAIC05NSw4ICsxMDEsMjMgQEAKIAlzdHJ1Y3QgcmN1X25vZGUgKnBhcmVudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJsb2NrZWRfdGFza3NbMl07CiAJCQkJLyogVGFza3MgYmxvY2tlZCBpbiBSQ1UgcmVhZC1zaWRlIGNyaXRzZWN0LiAqLworCQkJCS8qICBHcmFjZSBwZXJpb2QgbnVtYmVyICgtPmdwbnVtKSB4IGJsb2NrZWQgKi8KKwkJCQkvKiAgYnkgdGFza3Mgb24gdGhlICh4ICYgMHgxKSBlbGVtZW50IG9mIHRoZSAqLworCQkJCS8qICBibG9ja2VkX3Rhc2tzW10gYXJyYXkuICovCiB9IF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXA7CiAKKy8qCisgKiBEbyBhIGZ1bGwgYnJlYWR0aC1maXJzdCBzY2FuIG9mIHRoZSByY3Vfbm9kZSBzdHJ1Y3R1cmVzIGZvciB0aGUKKyAqIHNwZWNpZmllZCByY3Vfc3RhdGUgc3RydWN0dXJlLgorICovCisjZGVmaW5lIHJjdV9mb3JfZWFjaF9ub2RlX2JyZWFkdGhfZmlyc3QocnNwLCBybnApIFwKKwlmb3IgKChybnApID0gJihyc3ApLT5ub2RlWzBdOyBcCisJICAgICAocm5wKSA8ICYocnNwKS0+bm9kZVtOVU1fUkNVX05PREVTXTsgKHJucCkrKykKKworI2RlZmluZSByY3VfZm9yX2VhY2hfbGVhZl9ub2RlKHJzcCwgcm5wKSBcCisJZm9yICgocm5wKSA9IChyc3ApLT5sZXZlbFtOVU1fUkNVX0xWTFMgLSAxXTsgXAorCSAgICAgKHJucCkgPCAmKHJzcCktPm5vZGVbTlVNX1JDVV9OT0RFU107IChybnApKyspCisKIC8qIEluZGV4IHZhbHVlcyBmb3Igbnh0dGFpbCBhcnJheSBpbiBzdHJ1Y3QgcmN1X2RhdGEuICovCiAjZGVmaW5lIFJDVV9ET05FX1RBSUwJCTAJLyogQWxzbyBSQ1VfV0FJVCBoZWFkLiAqLwogI2RlZmluZSBSQ1VfV0FJVF9UQUlMCQkxCS8qIEFsc28gUkNVX05FWFRfUkVBRFkgaGVhZC4gKi8KQEAgLTEyNiwyMyArMTQ3LDMwIEBACiAJICogQW55IG9mIHRoZSBwYXJ0aXRpb25zIG1pZ2h0IGJlIGVtcHR5LCBpbiB3aGljaCBjYXNlIHRoZQogCSAqIHBvaW50ZXIgdG8gdGhhdCBwYXJ0aXRpb24gd2lsbCBiZSBlcXVhbCB0byB0aGUgcG9pbnRlciBmb3IKIAkgKiB0aGUgZm9sbG93aW5nIHBhcnRpdGlvbi4gIFdoZW4gdGhlIGxpc3QgaXMgZW1wdHksIGFsbCBvZgotCSAqIHRoZSBueHR0YWlsIGVsZW1lbnRzIHBvaW50IHRvIG54dGxpc3QsIHdoaWNoIGlzIE5VTEwuCisJICogdGhlIG54dHRhaWwgZWxlbWVudHMgcG9pbnQgdG8gdGhlIC0+bnh0bGlzdCBwb2ludGVyIGl0c2VsZiwKKwkgKiB3aGljaCBpbiB0aGF0IGNhc2UgaXMgTlVMTC4KIAkgKgotCSAqIFsqbnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXSwgTlVMTCA9ICpueHR0YWlsW1JDVV9ORVhUX1RBSUxdKToKLQkgKglFbnRyaWVzIHRoYXQgbWlnaHQgaGF2ZSBhcnJpdmVkIGFmdGVyIGN1cnJlbnQgR1AgZW5kZWQKLQkgKiBbKm54dHRhaWxbUkNVX1dBSVRfVEFJTF0sICpueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdKToKLQkgKglFbnRyaWVzIGtub3duIHRvIGhhdmUgYXJyaXZlZCBiZWZvcmUgY3VycmVudCBHUCBlbmRlZAotCSAqIFsqbnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSwgKm54dHRhaWxbUkNVX1dBSVRfVEFJTF0pOgotCSAqCUVudHJpZXMgdGhhdCBiYXRjaCAjIDw9IC0+Y29tcGxldGVkIC0gMTogd2FpdGluZyBmb3IgY3VycmVudCBHUAogCSAqIFtueHRsaXN0LCAqbnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSk6CiAJICoJRW50cmllcyB0aGF0IGJhdGNoICMgPD0gLT5jb21wbGV0ZWQKIAkgKglUaGUgZ3JhY2UgcGVyaW9kIGZvciB0aGVzZSBlbnRyaWVzIGhhcyBjb21wbGV0ZWQsIGFuZAogCSAqCXRoZSBvdGhlciBncmFjZS1wZXJpb2QtY29tcGxldGVkIGVudHJpZXMgbWF5IGJlIG1vdmVkCiAJICoJaGVyZSB0ZW1wb3JhcmlseSBpbiByY3VfcHJvY2Vzc19jYWxsYmFja3MoKS4KKwkgKiBbKm54dHRhaWxbUkNVX0RPTkVfVEFJTF0sICpueHR0YWlsW1JDVV9XQUlUX1RBSUxdKToKKwkgKglFbnRyaWVzIHRoYXQgYmF0Y2ggIyA8PSAtPmNvbXBsZXRlZCAtIDE6IHdhaXRpbmcgZm9yIGN1cnJlbnQgR1AKKwkgKiBbKm54dHRhaWxbUkNVX1dBSVRfVEFJTF0sICpueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdKToKKwkgKglFbnRyaWVzIGtub3duIHRvIGhhdmUgYXJyaXZlZCBiZWZvcmUgY3VycmVudCBHUCBlbmRlZAorCSAqIFsqbnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXSwgKm54dHRhaWxbUkNVX05FWFRfVEFJTF0pOgorCSAqCUVudHJpZXMgdGhhdCBtaWdodCBoYXZlIGFycml2ZWQgYWZ0ZXIgY3VycmVudCBHUCBlbmRlZAorCSAqCU5vdGUgdGhhdCB0aGUgdmFsdWUgb2YgKm54dHRhaWxbUkNVX05FWFRfVEFJTF0gd2lsbAorCSAqCWFsd2F5cyBiZSBOVUxMLCBhcyB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QuCiAJICovCiAJc3RydWN0IHJjdV9oZWFkICpueHRsaXN0OwogCXN0cnVjdCByY3VfaGVhZCAqKm54dHRhaWxbUkNVX05FWFRfU0laRV07CiAJbG9uZwkJcWxlbjsJCS8qICMgb2YgcXVldWVkIGNhbGxiYWNrcyAqLworCWxvbmcJCXFsZW5fbGFzdF9mcXNfY2hlY2s7CisJCQkJCS8qIHFsZW4gYXQgbGFzdCBjaGVjayBmb3IgUVMgZm9yY2luZyAqLworCXVuc2lnbmVkIGxvbmcJbl9mb3JjZV9xc19zbmFwOworCQkJCQkvKiBkaWQgb3RoZXIgQ1BVIGZvcmNlIFFTIHJlY2VudGx5PyAqLwogCWxvbmcJCWJsaW1pdDsJCS8qIFVwcGVyIGxpbWl0IG9uIGEgcHJvY2Vzc2VkIGJhdGNoICovCiAKICNpZmRlZiBDT05GSUdfTk9fSFoKQEAgLTIxNiw4ICsyNDQsMTkgQEAKIAkJCQkJCS8qIEZvcmNlIFFTIHN0YXRlLiAqLwogCWxvbmcJZ3BudW07CQkJCS8qIEN1cnJlbnQgZ3AgbnVtYmVyLiAqLwogCWxvbmcJY29tcGxldGVkOwkJCS8qICMgb2YgbGFzdCBjb21wbGV0ZWQgZ3AuICovCisKKwkvKiBFbmQgIG9mIGZpZWxkcyBndWFyZGVkIGJ5IHJvb3QgcmN1X25vZGUncyBsb2NrLiAqLworCiAJc3BpbmxvY2tfdCBvbm9mZmxvY2s7CQkJLyogZXhjbHVkZSBvbi9vZmZsaW5lIGFuZCAqLwotCQkJCQkJLyogIHN0YXJ0aW5nIG5ldyBHUC4gKi8KKwkJCQkJCS8qICBzdGFydGluZyBuZXcgR1AuICBBbHNvICovCisJCQkJCQkvKiAgcHJvdGVjdHMgdGhlIGZvbGxvd2luZyAqLworCQkJCQkJLyogIG9ycGhhbl9jYnMgZmllbGRzLiAqLworCXN0cnVjdCByY3VfaGVhZCAqb3JwaGFuX2Nic19saXN0OwkvKiBsaXN0IG9mIHJjdV9oZWFkIHN0cnVjdHMgKi8KKwkJCQkJCS8qICBvcnBoYW5lZCBieSBhbGwgQ1BVcyBpbiAqLworCQkJCQkJLyogIGEgZ2l2ZW4gbGVhZiByY3Vfbm9kZSAqLworCQkJCQkJLyogIGdvaW5nIG9mZmxpbmUuICovCisJc3RydWN0IHJjdV9oZWFkICoqb3JwaGFuX2Nic190YWlsOwkvKiBBbmQgdGFpbCBwb2ludGVyLiAqLworCWxvbmcgb3JwaGFuX3FsZW47CQkJLyogTnVtYmVyIG9mIG9ycGhhbmVkIGNicy4gKi8KIAlzcGlubG9ja190IGZxc2xvY2s7CQkJLyogT25seSBvbmUgdGFzayBmb3JjaW5nICovCiAJCQkJCQkvKiAgcXVpZXNjZW50IHN0YXRlcy4gKi8KIAl1bnNpZ25lZCBsb25nIGppZmZpZXNfZm9yY2VfcXM7CQkvKiBUaW1lIGF0IHdoaWNoIHRvIGludm9rZSAqLwpAQCAtMjU1LDUgKzI5NCwzMCBAQAogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCByY3VfZGF0YSwgcmN1X3ByZWVtcHRfZGF0YSk7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVICovCiAKLSNlbmRpZiAvKiAjaWZkZWYgUkNVX1RSRUVfTk9OQ09SRSAqLworI2Vsc2UgLyogI2lmZGVmIFJDVV9UUkVFX05PTkNPUkUgKi8KIAorLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHJjdXRyZWVfcGx1Z2luLmggKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY3VfYm9vdHVwX2Fubm91bmNlKHZvaWQpOworbG9uZyByY3VfYmF0Y2hlc19jb21wbGV0ZWQodm9pZCk7CitzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9ub3RlX2NvbnRleHRfc3dpdGNoKGludCBjcHUpOworc3RhdGljIGludCByY3VfcHJlZW1wdGVkX3JlYWRlcnMoc3RydWN0IHJjdV9ub2RlICpybnApOworI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SCitzdGF0aWMgdm9pZCByY3VfcHJpbnRfdGFza19zdGFsbChzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICovCitzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9jaGVja19ibG9ja2VkX3Rhc2tzKHN0cnVjdCByY3Vfbm9kZSAqcm5wKTsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgcmN1X3ByZWVtcHRfb2ZmbGluZV90YXNrcyhzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCisJCQkJICAgICBzdHJ1Y3QgcmN1X25vZGUgKnJucCwKKwkJCQkgICAgIHN0cnVjdCByY3VfZGF0YSAqcmRwKTsKK3N0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X29mZmxpbmVfY3B1KGludCBjcHUpOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KK3N0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X2NoZWNrX2NhbGxiYWNrcyhpbnQgY3B1KTsKK3N0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X3Byb2Nlc3NfY2FsbGJhY2tzKHZvaWQpOwordm9pZCBjYWxsX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkpOworc3RhdGljIGludCByY3VfcHJlZW1wdF9wZW5kaW5nKGludCBjcHUpOworc3RhdGljIGludCByY3VfcHJlZW1wdF9uZWVkc19jcHUoaW50IGNwdSk7CitzdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X3ByZWVtcHRfaW5pdF9wZXJjcHVfZGF0YShpbnQgY3B1KTsKK3N0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X3NlbmRfY2JzX3RvX29ycGhhbmFnZSh2b2lkKTsKK3N0YXRpYyB2b2lkIF9faW5pdCBfX3JjdV9pbml0X3ByZWVtcHQodm9pZCk7CisKKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgUkNVX1RSRUVfTk9OQ09SRSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWVfcGx1Z2luLmggYi9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaAppbmRleCAxY2VlMDRmLi5lZjJhNThjIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaAorKysgYi9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaApAQCAtMTUwLDYgKzE1MCwxNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19yY3VfcmVhZF9sb2NrKTsKIAorLyoKKyAqIENoZWNrIGZvciBwcmVlbXB0ZWQgUkNVIHJlYWRlcnMgYmxvY2tpbmcgdGhlIGN1cnJlbnQgZ3JhY2UgcGVyaW9kCisgKiBmb3IgdGhlIHNwZWNpZmllZCByY3Vfbm9kZSBzdHJ1Y3R1cmUuICBJZiB0aGUgY2FsbGVyIG5lZWRzIGEgcmVsaWFibGUKKyAqIGFuc3dlciwgaXQgbXVzdCBob2xkIHRoZSByY3Vfbm9kZSdzIC0+bG9jay4KKyAqLworc3RhdGljIGludCByY3VfcHJlZW1wdGVkX3JlYWRlcnMoc3RydWN0IHJjdV9ub2RlICpybnApCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZybnAtPmJsb2NrZWRfdGFza3Nbcm5wLT5ncG51bSAmIDB4MV0pOworfQorCiBzdGF0aWMgdm9pZCByY3VfcmVhZF91bmxvY2tfc3BlY2lhbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCiB7CiAJaW50IGVtcHR5OwpAQCAtMTk2LDcgKzIwNiw3IEBACiAJCQkJYnJlYWs7CiAJCQlzcGluX3VubG9jaygmcm5wLT5sb2NrKTsgIC8qIGlycXMgcmVtYWluIGRpc2FibGVkLiAqLwogCQl9Ci0JCWVtcHR5ID0gbGlzdF9lbXB0eSgmcm5wLT5ibG9ja2VkX3Rhc2tzW3JucC0+Z3BudW0gJiAweDFdKTsKKwkJZW1wdHkgPSAhcmN1X3ByZWVtcHRlZF9yZWFkZXJzKHJucCk7CiAJCWxpc3RfZGVsX2luaXQoJnQtPnJjdV9ub2RlX2VudHJ5KTsKIAkJdC0+cmN1X2Jsb2NrZWRfbm9kZSA9IE5VTEw7CiAKQEAgLTIwNyw3ICsyMTcsNyBAQAogCQkgKiBkcm9wIHJucC0+bG9jayBhbmQgcmVzdG9yZSBpcnEuCiAJCSAqLwogCQlpZiAoIWVtcHR5ICYmIHJucC0+cXNtYXNrID09IDAgJiYKLQkJICAgIGxpc3RfZW1wdHkoJnJucC0+YmxvY2tlZF90YXNrc1tybnAtPmdwbnVtICYgMHgxXSkpIHsKKwkJICAgICFyY3VfcHJlZW1wdGVkX3JlYWRlcnMocm5wKSkgewogCQkJc3RydWN0IHJjdV9ub2RlICpybnBfcDsKIAogCQkJaWYgKHJucC0+cGFyZW50ID09IE5VTEwpIHsKQEAgLTI1NywxMiArMjY3LDEyIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpscDsKLQlpbnQgcGhhc2UgPSBybnAtPmdwbnVtICYgMHgxOworCWludCBwaGFzZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJnJucC0+YmxvY2tlZF90YXNrc1twaGFzZV0pKSB7CisJaWYgKHJjdV9wcmVlbXB0ZWRfcmVhZGVycyhybnApKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKLQkJcGhhc2UgPSBybnAtPmdwbnVtICYgMHgxOyAvKiByZS1yZWFkIHVuZGVyIGxvY2suICovCisJCXBoYXNlID0gcm5wLT5ncG51bSAmIDB4MTsKIAkJbHAgPSAmcm5wLT5ibG9ja2VkX3Rhc2tzW3BoYXNlXTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCBscCwgcmN1X25vZGVfZW50cnkpCiAJCQlwcmludGsoIiBQJWQiLCB0LT5waWQpOwpAQCAtMjgxLDIwICsyOTEsMTAgQEAKICAqLwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfY2hlY2tfYmxvY2tlZF90YXNrcyhzdHJ1Y3QgcmN1X25vZGUgKnJucCkKIHsKLQlXQVJOX09OX09OQ0UoIWxpc3RfZW1wdHkoJnJucC0+YmxvY2tlZF90YXNrc1tybnAtPmdwbnVtICYgMHgxXSkpOworCVdBUk5fT05fT05DRShyY3VfcHJlZW1wdGVkX3JlYWRlcnMocm5wKSk7CiAJV0FSTl9PTl9PTkNFKHJucC0+cXNtYXNrKTsKIH0KIAotLyoKLSAqIENoZWNrIGZvciBwcmVlbXB0ZWQgUkNVIHJlYWRlcnMgZm9yIHRoZSBzcGVjaWZpZWQgcmN1X25vZGUgc3RydWN0dXJlLgotICogSWYgdGhlIGNhbGxlciBuZWVkcyBhIHJlbGlhYmxlIGFuc3dlciwgaXQgbXVzdCBob2xkIHRoZSByY3Vfbm9kZSdzCi0gKiA+bG9jay4KLSAqLwotc3RhdGljIGludCByY3VfcHJlZW1wdGVkX3JlYWRlcnMoc3RydWN0IHJjdV9ub2RlICpybnApCi17Ci0JcmV0dXJuICFsaXN0X2VtcHR5KCZybnAtPmJsb2NrZWRfdGFza3Nbcm5wLT5ncG51bSAmIDB4MV0pOwotfQotCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAKIC8qCkBAIC0zMDQsMjEgKzMwNCwyNSBAQAogICogcGFyZW50IGlzIHRvIHJlbW92ZSB0aGUgbmVlZCBmb3IgcmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwoKSB0bwogICogbWFrZSBtb3JlIHRoYW4gdHdvIGF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIHRhcmdldCByY3Vfbm9kZSdzIGxvY2suCiAgKgorICogUmV0dXJucyAxIGlmIHRoZXJlIHdhcyBwcmV2aW91c2x5IGEgdGFzayBibG9ja2luZyB0aGUgY3VycmVudCBncmFjZQorICogcGVyaW9kIG9uIHRoZSBzcGVjaWZpZWQgcmN1X25vZGUgc3RydWN0dXJlLgorICoKICAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHJucC0+bG9jayB3aXRoIGlycXMgZGlzYWJsZWQuCiAgKi8KLXN0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X29mZmxpbmVfdGFza3Moc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAotCQkJCSAgICAgIHN0cnVjdCByY3Vfbm9kZSAqcm5wLAotCQkJCSAgICAgIHN0cnVjdCByY3VfZGF0YSAqcmRwKQorc3RhdGljIGludCByY3VfcHJlZW1wdF9vZmZsaW5lX3Rhc2tzKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKKwkJCQkgICAgIHN0cnVjdCByY3Vfbm9kZSAqcm5wLAorCQkJCSAgICAgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7CiAJaW50IGk7CiAJc3RydWN0IGxpc3RfaGVhZCAqbHA7CiAJc3RydWN0IGxpc3RfaGVhZCAqbHBfcm9vdDsKKwlpbnQgcmV0dmFsID0gcmN1X3ByZWVtcHRlZF9yZWFkZXJzKHJucCk7CiAJc3RydWN0IHJjdV9ub2RlICpybnBfcm9vdCA9IHJjdV9nZXRfcm9vdChyc3ApOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHA7CiAKIAlpZiAocm5wID09IHJucF9yb290KSB7CiAJCVdBUk5fT05DRSgxLCAiTGFzdCBDUFUgdGhvdWdodCB0byBiZSBvZmZsaW5lZD8iKTsKLQkJcmV0dXJuOyAgLyogU2hvdWxkbid0IGhhcHBlbjogYXQgbGVhc3Qgb25lIENQVSBvbmxpbmUuICovCisJCXJldHVybiAwOyAgLyogU2hvdWxkbid0IGhhcHBlbjogYXQgbGVhc3Qgb25lIENQVSBvbmxpbmUuICovCiAJfQogCVdBUk5fT05fT05DRShybnAgIT0gcmRwLT5teW5vZGUgJiYKIAkJICAgICAoIWxpc3RfZW1wdHkoJnJucC0+YmxvY2tlZF90YXNrc1swXSkgfHwKQEAgLTM0Miw2ICszNDYsOCBAQAogCQkJc3Bpbl91bmxvY2soJnJucF9yb290LT5sb2NrKTsgLyogaXJxcyByZW1haW4gZGlzYWJsZWQgKi8KIAkJfQogCX0KKworCXJldHVybiByZXR2YWw7CiB9CiAKIC8qCkBAIC0zOTMsNiArMzk5LDE3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChjYWxsX3JjdSk7CiAKIC8qCisgKiBXYWl0IGZvciBhbiByY3UtcHJlZW1wdCBncmFjZSBwZXJpb2QuICBXZSBhcmUgc3VwcG9zZWQgdG8gZXhwZWRpdGUgdGhlCisgKiBncmFjZSBwZXJpb2QsIGJ1dCB0aGlzIGlzIHRoZSBjcnVkZSBzbG93IGNvbXBhdGFiaWxpdHkgaGFjaywgc28ganVzdAorICogaW52b2tlIHN5bmNocm9uaXplX3JjdSgpLgorICovCit2b2lkIHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQodm9pZCkKK3sKKwlzeW5jaHJvbml6ZV9yY3UoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQpOworCisvKgogICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBpbW1lZGlhdGUgcHJlZW1wdGFibGUtUkNVLXJlbGF0ZWQgd29yawogICogdG8gYmUgZG9uZS4KICAqLwpAQCAtNDEwLDYgKzQyNywxNSBAQAogCXJldHVybiAhIXBlcl9jcHUocmN1X3ByZWVtcHRfZGF0YSwgY3B1KS5ueHRsaXN0OwogfQogCisvKioKKyAqIHJjdV9iYXJyaWVyIC0gV2FpdCB1bnRpbCBhbGwgaW4tZmxpZ2h0IGNhbGxfcmN1KCkgY2FsbGJhY2tzIGNvbXBsZXRlLgorICovCit2b2lkIHJjdV9iYXJyaWVyKHZvaWQpCit7CisJX3JjdV9iYXJyaWVyKCZyY3VfcHJlZW1wdF9zdGF0ZSwgY2FsbF9yY3UpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmN1X2JhcnJpZXIpOworCiAvKgogICogSW5pdGlhbGl6ZSBwcmVlbXB0YWJsZSBSQ1UncyBwZXItQ1BVIGRhdGEuCiAgKi8KQEAgLTQxOSw2ICs0NDUsMjIgQEAKIH0KIAogLyoKKyAqIE1vdmUgcHJlZW1wdGFibGUgUkNVJ3MgY2FsbGJhY2tzIHRvIC0+b3JwaGFuX2Nic19saXN0LgorICovCitzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9zZW5kX2Nic190b19vcnBoYW5hZ2Uodm9pZCkKK3sKKwlyY3Vfc2VuZF9jYnNfdG9fb3JwaGFuYWdlKCZyY3VfcHJlZW1wdF9zdGF0ZSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHByZWVtcHRhYmxlIFJDVSdzIHN0YXRlIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBfX3JjdV9pbml0X3ByZWVtcHQodm9pZCkKK3sKKwlSQ1VfSU5JVF9GTEFWT1IoJnJjdV9wcmVlbXB0X3N0YXRlLCByY3VfcHJlZW1wdF9kYXRhKTsKK30KKworLyoKICAqIENoZWNrIGZvciBhIHRhc2sgZXhpdGluZyB3aGlsZSBpbiBhIHByZWVtcHRhYmxlLVJDVSByZWFkLXNpZGUKICAqIGNyaXRpY2FsIHNlY3Rpb24sIGNsZWFuIHVwIGlmIHNvLiAgTm8gbmVlZCB0byBpc3N1ZSB3YXJuaW5ncywKICAqIGFzIGRlYnVnX2NoZWNrX25vX2xvY2tzX2hlbGQoKSBhbHJlYWR5IGRvZXMgdGhpcyBpZiBsb2NrZGVwCkBAIC00NjEsNiArNTAzLDE1IEBACiB7CiB9CiAKKy8qCisgKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgdGhlcmUgYXJlIG5ldmVyIGFueSBwcmVlbXB0ZWQKKyAqIFJDVSByZWFkZXJzLgorICovCitzdGF0aWMgaW50IHJjdV9wcmVlbXB0ZWRfcmVhZGVycyhzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3sKKwlyZXR1cm4gMDsKK30KKwogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SCiAKIC8qCkBAIC00ODMsMjUgKzUzNCwxOSBAQAogCVdBUk5fT05fT05DRShybnAtPnFzbWFzayk7CiB9CiAKLS8qCi0gKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgdGhlcmUgYXJlIG5ldmVyIGFueSBwcmVlbXB0ZWQKLSAqIFJDVSByZWFkZXJzLgotICovCi1zdGF0aWMgaW50IHJjdV9wcmVlbXB0ZWRfcmVhZGVycyhzdHJ1Y3QgcmN1X25vZGUgKnJucCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCiAvKgogICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIGl0IG5ldmVyIG5lZWRzIHRvIG1pZ3JhdGUKLSAqIHRhc2tzIHRoYXQgd2VyZSBibG9ja2VkIHdpdGhpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLgorICogdGFza3MgdGhhdCB3ZXJlIGJsb2NrZWQgd2l0aGluIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMsIGFuZAorICogc3VjaCBub24tZXhpc3RlbnQgdGFza3MgY2Fubm90IHBvc3NpYmx5IGhhdmUgYmVlbiBibG9ja2luZyB0aGUgY3VycmVudAorICogZ3JhY2UgcGVyaW9kLgogICovCi1zdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9vZmZsaW5lX3Rhc2tzKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKLQkJCQkgICAgICBzdHJ1Y3QgcmN1X25vZGUgKnJucCwKLQkJCQkgICAgICBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3N0YXRpYyBpbnQgcmN1X3ByZWVtcHRfb2ZmbGluZV90YXNrcyhzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCisJCQkJICAgICBzdHJ1Y3QgcmN1X25vZGUgKnJucCwKKwkJCQkgICAgIHN0cnVjdCByY3VfZGF0YSAqcmRwKQogeworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNTE4LDcgKzU2Myw3IEBACiAgKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmV2ZXIgaGFzIGFueSBjYWxsYmFja3MKICAqIHRvIGNoZWNrLgogICovCi12b2lkIHJjdV9wcmVlbXB0X2NoZWNrX2NhbGxiYWNrcyhpbnQgY3B1KQorc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfY2hlY2tfY2FsbGJhY2tzKGludCBjcHUpCiB7CiB9CiAKQEAgLTUyNiw3ICs1NzEsNyBAQAogICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIGl0IG5ldmVyIGhhcyBhbnkgY2FsbGJhY2tzCiAgKiB0byBwcm9jZXNzLgogICovCi12b2lkIHJjdV9wcmVlbXB0X3Byb2Nlc3NfY2FsbGJhY2tzKHZvaWQpCitzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9wcm9jZXNzX2NhbGxiYWNrcyh2b2lkKQogewogfQogCkBAIC01NDAsNiArNTg1LDE2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChjYWxsX3JjdSk7CiAKIC8qCisgKiBXYWl0IGZvciBhbiByY3UtcHJlZW1wdCBncmFjZSBwZXJpb2QsIGJ1dCBtYWtlIGl0IGhhcHBlbiBxdWlja2x5LgorICogQnV0IGJlY2F1c2UgcHJlZW1wdGFibGUgUkNVIGRvZXMgbm90IGV4aXN0LCBtYXAgdG8gcmN1LXNjaGVkLgorICovCit2b2lkIHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQodm9pZCkKK3sKKwlzeW5jaHJvbml6ZV9zY2hlZF9leHBlZGl0ZWQoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQpOworCisvKgogICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIGl0IG5ldmVyIGhhcyBhbnkgd29yayB0byBkby4KICAqLwogc3RhdGljIGludCByY3VfcHJlZW1wdF9wZW5kaW5nKGludCBjcHUpCkBAIC01NTYsNiArNjExLDE2IEBACiB9CiAKIC8qCisgKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgcmN1X2JhcnJpZXIoKSBpcyBqdXN0CisgKiBhbm90aGVyIG5hbWUgZm9yIHJjdV9iYXJyaWVyX3NjaGVkKCkuCisgKi8KK3ZvaWQgcmN1X2JhcnJpZXIodm9pZCkKK3sKKwlyY3VfYmFycmllcl9zY2hlZCgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmN1X2JhcnJpZXIpOworCisvKgogICogQmVjYXVzZSBwcmVlbXB0YWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIHRoZXJlIGlzIG5vIHBlci1DUFUKICAqIGRhdGEgdG8gaW5pdGlhbGl6ZS4KICAqLwpAQCAtNTYzLDQgKzYyOCwxOCBAQAogewogfQogCisvKgorICogQmVjYXVzZSB0aGVyZSBpcyBubyBwcmVlbXB0YWJsZSBSQ1UsIHRoZXJlIGFyZSBubyBjYWxsYmFja3MgdG8gbW92ZS4KKyAqLworc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfc2VuZF9jYnNfdG9fb3JwaGFuYWdlKHZvaWQpCit7Cit9CisKKy8qCisgKiBCZWNhdXNlIHByZWVtcHRhYmxlIFJDVSBkb2VzIG5vdCBleGlzdCwgaXQgbmVlZCBub3QgYmUgaW5pdGlhbGl6ZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBfX3JjdV9pbml0X3ByZWVtcHQodm9pZCkKK3sKK30KKwogI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWVfdHJhY2UuYyBiL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMKaW5kZXggYzg5ZjVlOS4uNGIzMWM3NyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWVfdHJhY2UuYworKysgYi9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCkBAIC05Myw3ICs5Myw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfcmN1ZGF0YSwgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJjdWRhdGFfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJjdWRhdGFfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHJjdWRhdGFfb3BlbiwKIAkucmVhZCA9IHNlcV9yZWFkLApAQCAtMTQ1LDcgKzE0NSw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfcmN1ZGF0YV9jc3YsIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByY3VkYXRhX2Nzdl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmN1ZGF0YV9jc3ZfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHJjdWRhdGFfY3N2X29wZW4sCiAJLnJlYWQgPSBzZXFfcmVhZCwKQEAgLTE1OSwxMyArMTU5LDEzIEBACiAJc3RydWN0IHJjdV9ub2RlICpybnA7CiAKIAlzZXFfcHJpbnRmKG0sICJjPSVsZCBnPSVsZCBzPSVkIGpmcT0lbGQgaj0leCAiCi0JICAgICAgICAgICAgICAibmZxcz0lbHUvbmZxc25nPSVsdSglbHUpIGZxbGg9JWx1XG4iLAorCQkgICAgICAibmZxcz0lbHUvbmZxc25nPSVsdSglbHUpIGZxbGg9JWx1IG9xbGVuPSVsZFxuIiwKIAkJICAgcnNwLT5jb21wbGV0ZWQsIHJzcC0+Z3BudW0sIHJzcC0+c2lnbmFsZWQsCiAJCSAgIChsb25nKShyc3AtPmppZmZpZXNfZm9yY2VfcXMgLSBqaWZmaWVzKSwKIAkJICAgKGludCkoamlmZmllcyAmIDB4ZmZmZiksCiAJCSAgIHJzcC0+bl9mb3JjZV9xcywgcnNwLT5uX2ZvcmNlX3FzX25ncCwKIAkJICAgcnNwLT5uX2ZvcmNlX3FzIC0gcnNwLT5uX2ZvcmNlX3FzX25ncCwKLQkJICAgcnNwLT5uX2ZvcmNlX3FzX2xoKTsKKwkJICAgcnNwLT5uX2ZvcmNlX3FzX2xoLCByc3AtPm9ycGhhbl9xbGVuKTsKIAlmb3IgKHJucCA9ICZyc3AtPm5vZGVbMF07IHJucCAtICZyc3AtPm5vZGVbMF0gPCBOVU1fUkNVX05PREVTOyBybnArKykgewogCQlpZiAocm5wLT5sZXZlbCAhPSBsZXZlbCkgewogCQkJc2VxX3B1dHMobSwgIlxuIik7CkBAIC0xOTYsNyArMTk2LDcgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2hvd19yY3VoaWVyLCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmN1aGllcl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmN1aGllcl9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5vcGVuID0gcmN1aGllcl9vcGVuLAogCS5yZWFkID0gc2VxX3JlYWQsCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2hvd19yY3VncCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJjdWdwX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByY3VncF9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5vcGVuID0gcmN1Z3Bfb3BlbiwKIAkucmVhZCA9IHNlcV9yZWFkLApAQCAtMjc2LDcgKzI3Niw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfcmN1X3BlbmRpbmcsIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByY3VfcGVuZGluZ19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmN1X3BlbmRpbmdfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHJjdV9wZW5kaW5nX29wZW4sCiAJLnJlYWQgPSBzZXFfcmVhZCwKZGlmZiAtLWdpdCBhL2tlcm5lbC9yZWxheS5jIGIva2VybmVsL3JlbGF5LmMKaW5kZXggYmMxODg1NC4uNzYwYzI2MiAxMDA2NDQKLS0tIGEva2VybmVsL3JlbGF5LmMKKysrIGIva2VybmVsL3JlbGF5LmMKQEAgLTYwLDcgKzYwLDcgQEAKIC8qCiAgKiB2bV9vcHMgZm9yIHJlbGF5IGZpbGUgbWFwcGluZ3MuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgcmVsYXlfZmlsZV9tbWFwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgcmVsYXlfZmlsZV9tbWFwX29wcyA9IHsKIAkuZmF1bHQgPSByZWxheV9idWZfZmF1bHQsCiAJLmNsb3NlID0gcmVsYXlfZmlsZV9tbWFwX2Nsb3NlLAogfTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yZXNfY291bnRlci5jIGIva2VybmVsL3Jlc19jb3VudGVyLmMKaW5kZXggZTEzMzhmMC4uYmNkYWJmMyAxMDA2NDQKLS0tIGEva2VybmVsL3Jlc19jb3VudGVyLmMKKysrIGIva2VybmVsL3Jlc19jb3VudGVyLmMKQEAgLTE5LDYgKzE5LDcgQEAKIHsKIAlzcGluX2xvY2tfaW5pdCgmY291bnRlci0+bG9jayk7CiAJY291bnRlci0+bGltaXQgPSBSRVNPVVJDRV9NQVg7CisJY291bnRlci0+c29mdF9saW1pdCA9IFJFU09VUkNFX01BWDsKIAljb3VudGVyLT5wYXJlbnQgPSBwYXJlbnQ7CiB9CiAKQEAgLTEwMSw2ICsxMDIsOCBAQAogCQlyZXR1cm4gJmNvdW50ZXItPmxpbWl0OwogCWNhc2UgUkVTX0ZBSUxDTlQ6CiAJCXJldHVybiAmY291bnRlci0+ZmFpbGNudDsKKwljYXNlIFJFU19TT0ZUX0xJTUlUOgorCQlyZXR1cm4gJmNvdW50ZXItPnNvZnRfbGltaXQ7CiAJfTsKIAogCUJVRygpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCAyZjc2ZTA2Yi4uMjhkZDRmNCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTY3Niw2ICs2NzYsNyBAQAogCiAvKioKICAqIHJ1bnF1ZXVlX2lzX2xvY2tlZAorICogQGNwdTogdGhlIHByb2Nlc3NvciBpbiBxdWVzdGlvbi4KICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgY3B1IHJ1bnF1ZXVlIGlzIGxvY2tlZC4KICAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBwcmludGsgdG8gYmUgY2FsbGVkIHdpdGggdGhlIHJ1bnF1ZXVlIGxvY2sKQEAgLTc4MCw3ICs3ODEsNyBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxwLCBzY2hlZF9mZWF0X3Nob3csIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY2hlZF9mZWF0X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY2hlZF9mZWF0X2ZvcHMgPSB7CiAJLm9wZW4JCT0gc2NoZWRfZmVhdF9vcGVuLAogCS53cml0ZQkJPSBzY2hlZF9mZWF0X3dyaXRlLAogCS5yZWFkCQk9IHNlcV9yZWFkLApAQCAtMTU2MywxMSArMTU2NCw3IEBACiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCi1zdHJ1Y3QgdXBkYXRlX3NoYXJlc19kYXRhIHsKLQl1bnNpZ25lZCBsb25nIHJxX3dlaWdodFtOUl9DUFVTXTsKLX07Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdXBkYXRlX3NoYXJlc19kYXRhLCB1cGRhdGVfc2hhcmVzX2RhdGEpOworc3RhdGljIF9fcmVhZF9tb3N0bHkgdW5zaWduZWQgbG9uZyAqdXBkYXRlX3NoYXJlc19kYXRhOwogCiBzdGF0aWMgdm9pZCBfX3NldF9zZV9zaGFyZXMoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIHVuc2lnbmVkIGxvbmcgc2hhcmVzKTsKIApAQCAtMTU3NywxMiArMTU3NCwxMiBAQAogc3RhdGljIHZvaWQgdXBkYXRlX2dyb3VwX3NoYXJlc19jcHUoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBpbnQgY3B1LAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHNkX3NoYXJlcywKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBzZF9ycV93ZWlnaHQsCi0JCQkJICAgIHN0cnVjdCB1cGRhdGVfc2hhcmVzX2RhdGEgKnVzZCkKKwkJCQkgICAgdW5zaWduZWQgbG9uZyAqdXNkX3JxX3dlaWdodCkKIHsKIAl1bnNpZ25lZCBsb25nIHNoYXJlcywgcnFfd2VpZ2h0OwogCWludCBib29zdCA9IDA7CiAKLQlycV93ZWlnaHQgPSB1c2QtPnJxX3dlaWdodFtjcHVdOworCXJxX3dlaWdodCA9IHVzZF9ycV93ZWlnaHRbY3B1XTsKIAlpZiAoIXJxX3dlaWdodCkgewogCQlib29zdCA9IDE7CiAJCXJxX3dlaWdodCA9IE5JQ0VfMF9MT0FEOwpAQCAtMTYxNyw3ICsxNjE0LDcgQEAKIHN0YXRpYyBpbnQgdGdfc2hhcmVzX3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgdm9pZCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nIHdlaWdodCwgcnFfd2VpZ2h0ID0gMCwgc2hhcmVzID0gMDsKLQlzdHJ1Y3QgdXBkYXRlX3NoYXJlc19kYXRhICp1c2Q7CisJdW5zaWduZWQgbG9uZyAqdXNkX3JxX3dlaWdodDsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IGRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKQEAgLTE2MjYsMTEgKzE2MjMsMTEgQEAKIAkJcmV0dXJuIDA7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdXNkID0gJl9fZ2V0X2NwdV92YXIodXBkYXRlX3NoYXJlc19kYXRhKTsKKwl1c2RfcnFfd2VpZ2h0ID0gcGVyX2NwdV9wdHIodXBkYXRlX3NoYXJlc19kYXRhLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCiAJZm9yX2VhY2hfY3B1KGksIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkgewogCQl3ZWlnaHQgPSB0Zy0+Y2ZzX3JxW2ldLT5sb2FkLndlaWdodDsKLQkJdXNkLT5ycV93ZWlnaHRbaV0gPSB3ZWlnaHQ7CisJCXVzZF9ycV93ZWlnaHRbaV0gPSB3ZWlnaHQ7CiAKIAkJLyoKIAkJICogSWYgdGhlcmUgYXJlIGN1cnJlbnRseSBubyB0YXNrcyBvbiB0aGUgY3B1IHByZXRlbmQgdGhlcmUKQEAgLTE2NTEsNyArMTY0OCw3IEBACiAJCXNoYXJlcyA9IHRnLT5zaGFyZXM7CiAKIAlmb3JfZWFjaF9jcHUoaSwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKQotCQl1cGRhdGVfZ3JvdXBfc2hhcmVzX2NwdSh0ZywgaSwgc2hhcmVzLCBycV93ZWlnaHQsIHVzZCk7CisJCXVwZGF0ZV9ncm91cF9zaGFyZXNfY3B1KHRnLCBpLCBzaGFyZXMsIHJxX3dlaWdodCwgdXNkX3JxX3dlaWdodCk7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKQEAgLTE5OTUsNiArMTk5MiwzOCBAQAogCQlwLT5zY2hlZF9jbGFzcy0+cHJpb19jaGFuZ2VkKHJxLCBwLCBvbGRwcmlvLCBydW5uaW5nKTsKIH0KIAorLyoqCisgKiBrdGhyZWFkX2JpbmQgLSBiaW5kIGEganVzdC1jcmVhdGVkIGt0aHJlYWQgdG8gYSBjcHUuCisgKiBAazogdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KKyAqIEBjcHU6IGNwdSAobWlnaHQgbm90IGJlIG9ubGluZSwgbXVzdCBiZSBwb3NzaWJsZSkgZm9yIEBrIHRvIHJ1biBvbi4KKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldF9jcHVzX2FsbG93ZWQoKSwKKyAqIGV4Y2VwdCB0aGF0IEBjcHUgZG9lc24ndCBuZWVkIHRvIGJlIG9ubGluZSwgYW5kIHRoZSB0aHJlYWQgbXVzdCBiZQorICogc3RvcHBlZCAoaS5lLiwganVzdCByZXR1cm5lZCBmcm9tIGt0aHJlYWRfY3JlYXRlKCkpLgorICoKKyAqIEZ1bmN0aW9uIGxpdmVzIGhlcmUgaW5zdGVhZCBvZiBrdGhyZWFkLmMgYmVjYXVzZSBpdCBtZXNzZXMgd2l0aAorICogc2NoZWR1bGVyIGludGVybmFscyB3aGljaCByZXF1aXJlIGxvY2tpbmcuCisgKi8KK3ZvaWQga3RocmVhZF9iaW5kKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIE11c3QgaGF2ZSBkb25lIHNjaGVkdWxlKCkgaW4ga3RocmVhZCgpIGJlZm9yZSB3ZSBzZXRfdGFza19jcHUgKi8KKwlpZiAoIXdhaXRfdGFza19pbmFjdGl2ZShwLCBUQVNLX1VOSU5URVJSVVBUSUJMRSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZycS0+bG9jaywgZmxhZ3MpOworCXNldF90YXNrX2NwdShwLCBjcHUpOworCXAtPmNwdXNfYWxsb3dlZCA9IGNwdW1hc2tfb2ZfY3B1KGNwdSk7CisJcC0+cnQubnJfY3B1c19hbGxvd2VkID0gMTsKKwlwLT5mbGFncyB8PSBQRl9USFJFQURfQk9VTkQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woa3RocmVhZF9iaW5kKTsKKwogI2lmZGVmIENPTkZJR19TTVAKIC8qCiAgKiBJcyB0aGlzIHRhc2sgbGlrZWx5IGNhY2hlLWhvdDoKQEAgLTIwMDcsNyArMjAzNiw3IEBACiAJLyoKIAkgKiBCdWRkeSBjYW5kaWRhdGVzIGFyZSBjYWNoZSBob3Q6CiAJICovCi0JaWYgKHNjaGVkX2ZlYXQoQ0FDSEVfSE9UX0JVRERZKSAmJgorCWlmIChzY2hlZF9mZWF0KENBQ0hFX0hPVF9CVUREWSkgJiYgdGhpc19ycSgpLT5ucl9ydW5uaW5nICYmCiAJCQkoJnAtPnNlID09IGNmc19ycV9vZigmcC0+c2UpLT5uZXh0IHx8CiAJCQkgJnAtPnNlID09IGNmc19ycV9vZigmcC0+c2UpLT5sYXN0KSkKIAkJcmV0dXJuIDE7CkBAIC0yMzExLDcgKzIzNDAsNyBAQAogewogCWludCBjcHUsIG9yaWdfY3B1LCB0aGlzX2NwdSwgc3VjY2VzcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcnEgKnJxOworCXN0cnVjdCBycSAqcnEsICpvcmlnX3JxOwogCiAJaWYgKCFzY2hlZF9mZWF0KFNZTkNfV0FLRVVQUykpCiAJCXdha2VfZmxhZ3MgJj0gfldGX1NZTkM7CkBAIC0yMzE5LDcgKzIzNDgsNyBAQAogCXRoaXNfY3B1ID0gZ2V0X2NwdSgpOwogCiAJc21wX3dtYigpOwotCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CisJcnEgPSBvcmlnX3JxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CiAJdXBkYXRlX3JxX2Nsb2NrKHJxKTsKIAlpZiAoIShwLT5zdGF0ZSAmIHN0YXRlKSkKIAkJZ290byBvdXQ7CkBAIC0yMzUwLDYgKzIzNzksMTAgQEAKIAkJc2V0X3Rhc2tfY3B1KHAsIGNwdSk7CiAKIAlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOworCisJaWYgKHJxICE9IG9yaWdfcnEpCisJCXVwZGF0ZV9ycV9jbG9jayhycSk7CisKIAlXQVJOX09OKHAtPnN0YXRlICE9IFRBU0tfV0FLSU5HKTsKIAljcHUgPSB0YXNrX2NwdShwKTsKIApAQCAtMjUxNSwyMiArMjU0OCwxNyBAQAogCV9fc2NoZWRfZm9yayhwKTsKIAogCS8qCi0JICogTWFrZSBzdXJlIHdlIGRvIG5vdCBsZWFrIFBJIGJvb3N0aW5nIHByaW9yaXR5IHRvIHRoZSBjaGlsZC4KLQkgKi8KLQlwLT5wcmlvID0gY3VycmVudC0+bm9ybWFsX3ByaW87Ci0KLQkvKgogCSAqIFJldmVydCB0byBkZWZhdWx0IHByaW9yaXR5L3BvbGljeSBvbiBmb3JrIGlmIHJlcXVlc3RlZC4KIAkgKi8KIAlpZiAodW5saWtlbHkocC0+c2NoZWRfcmVzZXRfb25fZm9yaykpIHsKLQkJaWYgKHAtPnBvbGljeSA9PSBTQ0hFRF9GSUZPIHx8IHAtPnBvbGljeSA9PSBTQ0hFRF9SUikKKwkJaWYgKHAtPnBvbGljeSA9PSBTQ0hFRF9GSUZPIHx8IHAtPnBvbGljeSA9PSBTQ0hFRF9SUikgewogCQkJcC0+cG9saWN5ID0gU0NIRURfTk9STUFMOwotCi0JCWlmIChwLT5ub3JtYWxfcHJpbyA8IERFRkFVTFRfUFJJTykKLQkJCXAtPnByaW8gPSBERUZBVUxUX1BSSU87CisJCQlwLT5ub3JtYWxfcHJpbyA9IHAtPnN0YXRpY19wcmlvOworCQl9CiAKIAkJaWYgKFBSSU9fVE9fTklDRShwLT5zdGF0aWNfcHJpbykgPCAwKSB7CiAJCQlwLT5zdGF0aWNfcHJpbyA9IE5JQ0VfVE9fUFJJTygwKTsKKwkJCXAtPm5vcm1hbF9wcmlvID0gcC0+c3RhdGljX3ByaW87CiAJCQlzZXRfbG9hZF93ZWlnaHQocCk7CiAJCX0KIApAQCAtMjU0MSw2ICsyNTY5LDExIEBACiAJCXAtPnNjaGVkX3Jlc2V0X29uX2ZvcmsgPSAwOwogCX0KIAorCS8qCisJICogTWFrZSBzdXJlIHdlIGRvIG5vdCBsZWFrIFBJIGJvb3N0aW5nIHByaW9yaXR5IHRvIHRoZSBjaGlsZC4KKwkgKi8KKwlwLT5wcmlvID0gY3VycmVudC0+bm9ybWFsX3ByaW87CisKIAlpZiAoIXJ0X3ByaW8ocC0+cHJpbykpCiAJCXAtPnNjaGVkX2NsYXNzID0gJmZhaXJfc2NoZWRfY2xhc3M7CiAKQEAgLTI1ODEsOCArMjYxNCw2IEBACiAJQlVHX09OKHAtPnN0YXRlICE9IFRBU0tfUlVOTklORyk7CiAJdXBkYXRlX3JxX2Nsb2NrKHJxKTsKIAotCXAtPnByaW8gPSBlZmZlY3RpdmVfcHJpbyhwKTsKLQogCWlmICghcC0+c2NoZWRfY2xhc3MtPnRhc2tfbmV3IHx8ICFjdXJyZW50LT5zZS5vbl9ycSkgewogCQlhY3RpdmF0ZV90YXNrKHJxLCBwLCAwKTsKIAl9IGVsc2UgewpAQCAtMzY1OCw2ICszNjg5LDcgQEAKIAogLyoqCiAgKiB1cGRhdGVfc2dfbGJfc3RhdHMgLSBVcGRhdGUgc2NoZWRfZ3JvdXAncyBzdGF0aXN0aWNzIGZvciBsb2FkIGJhbGFuY2luZy4KKyAqIEBzZDogVGhlIHNjaGVkX2RvbWFpbiB3aG9zZSBzdGF0aXN0aWNzIGFyZSB0byBiZSB1cGRhdGVkLgogICogQGdyb3VwOiBzY2hlZF9ncm91cCB3aG9zZSBzdGF0aXN0aWNzIGFyZSB0byBiZSB1cGRhdGVkLgogICogQHRoaXNfY3B1OiBDcHUgZm9yIHdoaWNoIGxvYWQgYmFsYW5jZSBpcyBjdXJyZW50bHkgcGVyZm9ybWVkLgogICogQGlkbGU6IElkbGUgc3RhdHVzIG9mIHRoaXNfY3B1CkBAIC02NzIwLDkgKzY3NTIsNiBAQAogLyoKICAqIFRoaXMgdGFzayBpcyBhYm91dCB0byBnbyB0byBzbGVlcCBvbiBJTy4gSW5jcmVtZW50IHJxLT5ucl9pb3dhaXQgc28KICAqIHRoYXQgcHJvY2VzcyBhY2NvdW50aW5nIGtub3dzIHRoYXQgdGhpcyBpcyBhIHRhc2sgaW4gSU8gd2FpdCBzdGF0ZS4KLSAqCi0gKiBCdXQgZG9uJ3QgZG8gdGhhdCBpZiBpdCBpcyBhIGRlbGliZXJhdGUsIHRocm90dGxpbmcgSU8gd2FpdCAodGhpcyB0YXNrCi0gKiBoYXMgc2V0IGl0cyBiYWNraW5nX2Rldl9pbmZvOiB0aGUgcXVldWUgYWdhaW5zdCB3aGljaCBpdCBzaG91bGQgdGhyb3R0bGUpCiAgKi8KIHZvaWQgX19zY2hlZCBpb19zY2hlZHVsZSh2b2lkKQogewpAQCAtOTQwNiw2ICs5NDM1LDEwIEBACiAjZW5kaWYgLyogQ09ORklHX1VTRVJfU0NIRUQgKi8KICNlbmRpZiAvKiBDT05GSUdfR1JPVVBfU0NIRUQgKi8KIAorI2lmIGRlZmluZWQgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgJiYgZGVmaW5lZCBDT05GSUdfU01QCisJdXBkYXRlX3NoYXJlc19kYXRhID0gX19hbGxvY19wZXJjcHUobnJfY3B1X2lkcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkJICAgIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcpKTsKKyNlbmRpZgogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXN0cnVjdCBycSAqcnE7CiAKQEAgLTk1MzEsMTMgKzk1NjQsMTMgQEAKIAljdXJyZW50LT5zY2hlZF9jbGFzcyA9ICZmYWlyX3NjaGVkX2NsYXNzOwogCiAJLyogQWxsb2NhdGUgdGhlIG5vaHpfY3B1X21hc2sgaWYgQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0sgKi8KLQlhbGxvY19jcHVtYXNrX3Zhcigmbm9oel9jcHVfbWFzaywgR0ZQX05PV0FJVCk7CisJemFsbG9jX2NwdW1hc2tfdmFyKCZub2h6X2NwdV9tYXNrLCBHRlBfTk9XQUlUKTsKICNpZmRlZiBDT05GSUdfU01QCiAjaWZkZWYgQ09ORklHX05PX0haCi0JYWxsb2NfY3B1bWFza192YXIoJm5vaHouY3B1X21hc2ssIEdGUF9OT1dBSVQpOworCXphbGxvY19jcHVtYXNrX3Zhcigmbm9oei5jcHVfbWFzaywgR0ZQX05PV0FJVCk7CiAJYWxsb2NfY3B1bWFza192YXIoJm5vaHouaWxiX2dycF9ub2h6X21hc2ssIEdGUF9OT1dBSVQpOwogI2VuZGlmCi0JYWxsb2NfY3B1bWFza192YXIoJmNwdV9pc29sYXRlZF9tYXAsIEdGUF9OT1dBSVQpOworCXphbGxvY19jcHVtYXNrX3ZhcigmY3B1X2lzb2xhdGVkX21hcCwgR0ZQX05PV0FJVCk7CiAjZW5kaWYgLyogU01QICovCiAKIAlwZXJmX2V2ZW50X2luaXQoKTsKQEAgLTEwMzEyLDcgKzEwMzQ1LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfUlRfR1JPVVBfU0NIRUQgKi8KIAogaW50IHNjaGVkX3J0X2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IHJldDsKQEAgLTEwMzIzLDcgKzEwMzU2LDcgQEAKIAlvbGRfcGVyaW9kID0gc3lzY3RsX3NjaGVkX3J0X3BlcmlvZDsKIAlvbGRfcnVudGltZSA9IHN5c2N0bF9zY2hlZF9ydF9ydW50aW1lOwogCi0JcmV0ID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAlpZiAoIXJldCAmJiB3cml0ZSkgewogCQlyZXQgPSBzY2hlZF9ydF9nbG9iYWxfY29uc3RyYWludHMoKTsKQEAgLTEwMzc3LDggKzEwNDEwLDcgQEAKIH0KIAogc3RhdGljIGludAotY3B1X2Nncm91cF9jYW5fYXR0YWNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCwKLQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitjcHVfY2dyb3VwX2Nhbl9hdHRhY2hfdGFzayhzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKICNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKIAlpZiAoIXNjaGVkX3J0X2Nhbl9hdHRhY2goY2dyb3VwX3RnKGNncnApLCB0c2spKQpAQCAtMTAzODgsMTUgKzEwNDIwLDQ1IEBACiAJaWYgKHRzay0+c2NoZWRfY2xhc3MgIT0gJmZhaXJfc2NoZWRfY2xhc3MpCiAJCXJldHVybiAtRUlOVkFMOwogI2VuZGlmCisJcmV0dXJuIDA7Cit9CiAKK3N0YXRpYyBpbnQKK2NwdV9jZ3JvdXBfY2FuX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCisJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBib29sIHRocmVhZGdyb3VwKQoreworCWludCByZXR2YWwgPSBjcHVfY2dyb3VwX2Nhbl9hdHRhY2hfdGFzayhjZ3JwLCB0c2spOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKHRocmVhZGdyb3VwKSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqYzsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjLCAmdHNrLT50aHJlYWRfZ3JvdXAsIHRocmVhZF9ncm91cCkgeworCQkJcmV0dmFsID0gY3B1X2Nncm91cF9jYW5fYXR0YWNoX3Rhc2soY2dycCwgYyk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBjcHVfY2dyb3VwX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCi0JCQlzdHJ1Y3QgY2dyb3VwICpvbGRfY29udCwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCisJCSAgc3RydWN0IGNncm91cCAqb2xkX2NvbnQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkgIGJvb2wgdGhyZWFkZ3JvdXApCiB7CiAJc2NoZWRfbW92ZV90YXNrKHRzayk7CisJaWYgKHRocmVhZGdyb3VwKSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqYzsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjLCAmdHNrLT50aHJlYWRfZ3JvdXAsIHRocmVhZF9ncm91cCkgeworCQkJc2NoZWRfbW92ZV90YXNrKGMpOworCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0KIH0KIAogI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfY2xvY2suYyBiL2tlcm5lbC9zY2hlZF9jbG9jay5jCmluZGV4IGFjMmUxZGMuLjQ3OWNlNTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9jbG9jay5jCisrKyBiL2tlcm5lbC9zY2hlZF9jbG9jay5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAljbG9jayA9IHdyYXBfbWF4KGNsb2NrLCBtaW5fY2xvY2spOwogCWNsb2NrID0gd3JhcF9taW4oY2xvY2ssIG1heF9jbG9jayk7CiAKLQlpZiAoY21weGNoZygmc2NkLT5jbG9jaywgb2xkX2Nsb2NrLCBjbG9jaykgIT0gb2xkX2Nsb2NrKQorCWlmIChjbXB4Y2hnNjQoJnNjZC0+Y2xvY2ssIG9sZF9jbG9jaywgY2xvY2spICE9IG9sZF9jbG9jaykKIAkJZ290byBhZ2FpbjsKIAogCXJldHVybiBjbG9jazsKQEAgLTE2Myw3ICsxNjMsNyBAQAogCQl2YWwgPSByZW1vdGVfY2xvY2s7CiAJfQogCi0JaWYgKGNtcHhjaGcocHRyLCBvbGRfdmFsLCB2YWwpICE9IG9sZF92YWwpCisJaWYgKGNtcHhjaGc2NChwdHIsIG9sZF92YWwsIHZhbCkgIT0gb2xkX3ZhbCkKIAkJZ290byBhZ2FpbjsKIAogCXJldHVybiB2YWw7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmFpci5jIGIva2VybmVsL3NjaGVkX2ZhaXIuYwppbmRleCBlY2M2MzdhLi4zNzA4N2E3IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfZmFpci5jCisrKyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKQEAgLTM4NCwxMCArMzg0LDEwIEBACiAKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKIGludCBzY2hlZF9ucl9sYXRlbmN5X2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IHJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpbnQgcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJaWYgKHJldCB8fCAhd3JpdGUpCiAJCXJldHVybiByZXQ7CkBAIC04MjIsNiArODIyLDI2IEBACiAJCSAqIHJlLWVsZWN0ZWQgZHVlIHRvIGJ1ZGR5IGZhdm91cnMuCiAJCSAqLwogCQljbGVhcl9idWRkaWVzKGNmc19ycSwgY3Vycik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IGEgdGFzayB0aGF0IG1pc3NlZCB3YWtldXAgcHJlZW1wdGlvbiBieSBhCisJICogbmFycm93IG1hcmdpbiBkb2Vzbid0IGhhdmUgdG8gd2FpdCBmb3IgYSBmdWxsIHNsaWNlLgorCSAqIFRoaXMgYWxzbyBtaXRpZ2F0ZXMgYnVkZHkgaW5kdWNlZCBsYXRlbmNpZXMgdW5kZXIgbG9hZC4KKwkgKi8KKwlpZiAoIXNjaGVkX2ZlYXQoV0FLRVVQX1BSRUVNUFQpKQorCQlyZXR1cm47CisKKwlpZiAoZGVsdGFfZXhlYyA8IHN5c2N0bF9zY2hlZF9taW5fZ3JhbnVsYXJpdHkpCisJCXJldHVybjsKKworCWlmIChjZnNfcnEtPm5yX3J1bm5pbmcgPiAxKSB7CisJCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gX19waWNrX25leHRfZW50aXR5KGNmc19ycSk7CisJCXM2NCBkZWx0YSA9IGN1cnItPnZydW50aW1lIC0gc2UtPnZydW50aW1lOworCisJCWlmIChkZWx0YSA+IGlkZWFsX3J1bnRpbWUpCisJCQlyZXNjaGVkX3Rhc2socnFfb2YoY2ZzX3JxKS0+Y3Vycik7CiAJfQogfQogCkBAIC04NjEsMTIgKzg4MSwxOCBAQAogc3RhdGljIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnBpY2tfbmV4dF9lbnRpdHkoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gX19waWNrX25leHRfZW50aXR5KGNmc19ycSk7CisJc3RydWN0IHNjaGVkX2VudGl0eSAqbGVmdCA9IHNlOwogCi0JaWYgKGNmc19ycS0+bmV4dCAmJiB3YWtldXBfcHJlZW1wdF9lbnRpdHkoY2ZzX3JxLT5uZXh0LCBzZSkgPCAxKQotCQlyZXR1cm4gY2ZzX3JxLT5uZXh0OworCWlmIChjZnNfcnEtPm5leHQgJiYgd2FrZXVwX3ByZWVtcHRfZW50aXR5KGNmc19ycS0+bmV4dCwgbGVmdCkgPCAxKQorCQlzZSA9IGNmc19ycS0+bmV4dDsKIAotCWlmIChjZnNfcnEtPmxhc3QgJiYgd2FrZXVwX3ByZWVtcHRfZW50aXR5KGNmc19ycS0+bGFzdCwgc2UpIDwgMSkKLQkJcmV0dXJuIGNmc19ycS0+bGFzdDsKKwkvKgorCSAqIFByZWZlciBsYXN0IGJ1ZGR5LCB0cnkgdG8gcmV0dXJuIHRoZSBDUFUgdG8gYSBwcmVlbXB0ZWQgdGFzay4KKwkgKi8KKwlpZiAoY2ZzX3JxLT5sYXN0ICYmIHdha2V1cF9wcmVlbXB0X2VudGl0eShjZnNfcnEtPmxhc3QsIGxlZnQpIDwgMSkKKwkJc2UgPSBjZnNfcnEtPmxhc3Q7CisKKwljbGVhcl9idWRkaWVzKGNmc19ycSwgc2UpOwogCiAJcmV0dXJuIHNlOwogfQpAQCAtMTU2OCw2ICsxNTk0LDcgQEAKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZjdXJyLT5zZSwgKnBzZSA9ICZwLT5zZTsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSB0YXNrX2Nmc19ycShjdXJyKTsKIAlpbnQgc3luYyA9IHdha2VfZmxhZ3MgJiBXRl9TWU5DOworCWludCBzY2FsZSA9IGNmc19ycS0+bnJfcnVubmluZyA+PSBzY2hlZF9ucl9sYXRlbmN5OwogCiAJdXBkYXRlX2N1cnIoY2ZzX3JxKTsKIApAQCAtMTU4MiwxOCArMTYwOSw3IEBACiAJaWYgKHVubGlrZWx5KHNlID09IHBzZSkpCiAJCXJldHVybjsKIAotCS8qCi0JICogT25seSBzZXQgdGhlIGJhY2t3YXJkIGJ1ZGR5IHdoZW4gdGhlIGN1cnJlbnQgdGFzayBpcyBzdGlsbCBvbiB0aGUKLQkgKiBycS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSB3YWtldXAgZ2V0cyBpbnRlcmxlYXZlZCB3aXRoIHNjaGVkdWxlIG9uCi0JICogdGhlIC0+cHJlX3NjaGVkdWxlKCkgb3IgaWRsZV9iYWxhbmNlKCkgcG9pbnQsIGVpdGhlciBvZiB3aGljaCBjYW4KLQkgKiBkcm9wIHRoZSBycSBsb2NrLgotCSAqCi0JICogQWxzbywgZHVyaW5nIGVhcmx5IGJvb3QgdGhlIGlkbGUgdGhyZWFkIGlzIGluIHRoZSBmYWlyIGNsYXNzLCBmb3IKLQkgKiBvYnZpb3VzIHJlYXNvbnMgaXRzIGEgYmFkIGlkZWEgdG8gc2NoZWR1bGUgYmFjayB0byB0aGUgaWRsZSB0aHJlYWQuCi0JICovCi0JaWYgKHNjaGVkX2ZlYXQoTEFTVF9CVUREWSkgJiYgbGlrZWx5KHNlLT5vbl9ycSAmJiBjdXJyICE9IHJxLT5pZGxlKSkKLQkJc2V0X2xhc3RfYnVkZHkoc2UpOwotCWlmIChzY2hlZF9mZWF0KE5FWFRfQlVERFkpICYmICEod2FrZV9mbGFncyAmIFdGX0ZPUkspKQorCWlmIChzY2hlZF9mZWF0KE5FWFRfQlVERFkpICYmIHNjYWxlICYmICEod2FrZV9mbGFncyAmIFdGX0ZPUkspKQogCQlzZXRfbmV4dF9idWRkeShwc2UpOwogCiAJLyoKQEAgLTE2MzksOCArMTY1NSwyMiBAQAogCiAJQlVHX09OKCFwc2UpOwogCi0JaWYgKHdha2V1cF9wcmVlbXB0X2VudGl0eShzZSwgcHNlKSA9PSAxKQorCWlmICh3YWtldXBfcHJlZW1wdF9lbnRpdHkoc2UsIHBzZSkgPT0gMSkgewogCQlyZXNjaGVkX3Rhc2soY3Vycik7CisJCS8qCisJCSAqIE9ubHkgc2V0IHRoZSBiYWNrd2FyZCBidWRkeSB3aGVuIHRoZSBjdXJyZW50IHRhc2sgaXMgc3RpbGwKKwkJICogb24gdGhlIHJxLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIHdha2V1cCBnZXRzIGludGVybGVhdmVkCisJCSAqIHdpdGggc2NoZWR1bGUgb24gdGhlIC0+cHJlX3NjaGVkdWxlKCkgb3IgaWRsZV9iYWxhbmNlKCkKKwkJICogcG9pbnQsIGVpdGhlciBvZiB3aGljaCBjYW4gKiBkcm9wIHRoZSBycSBsb2NrLgorCQkgKgorCQkgKiBBbHNvLCBkdXJpbmcgZWFybHkgYm9vdCB0aGUgaWRsZSB0aHJlYWQgaXMgaW4gdGhlIGZhaXIgY2xhc3MsCisJCSAqIGZvciBvYnZpb3VzIHJlYXNvbnMgaXRzIGEgYmFkIGlkZWEgdG8gc2NoZWR1bGUgYmFjayB0byBpdC4KKwkJICovCisJCWlmICh1bmxpa2VseSghc2UtPm9uX3JxIHx8IGN1cnIgPT0gcnEtPmlkbGUpKQorCQkJcmV0dXJuOworCQlpZiAoc2NoZWRfZmVhdChMQVNUX0JVRERZKSAmJiBzY2FsZSAmJiBlbnRpdHlfaXNfdGFzayhzZSkpCisJCQlzZXRfbGFzdF9idWRkeShzZSk7CisJfQogfQogCiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19mYWlyKHN0cnVjdCBycSAqcnEpCkBAIC0xNjU0LDE2ICsxNjg0LDYgQEAKIAogCWRvIHsKIAkJc2UgPSBwaWNrX25leHRfZW50aXR5KGNmc19ycSk7Ci0JCS8qCi0JCSAqIElmIHNlIHdhcyBhIGJ1ZGR5LCBjbGVhciBpdCBzbyB0aGF0IGl0IHdpbGwgaGF2ZSB0byBlYXJuCi0JCSAqIHRoZSBmYXZvdXIgYWdhaW4uCi0JCSAqCi0JCSAqIElmIHNlIHdhcyBub3QgYSBidWRkeSwgY2xlYXIgdGhlIGJ1ZGRpZXMgYmVjYXVzZSBuZWl0aGVyCi0JCSAqIHdhcyBlbGVnaWJsZSB0byBydW4sIGxldCB0aGVtIGVhcm4gaXQgYWdhaW4uCi0JCSAqCi0JCSAqIElPVy4gdW5jb25kaXRpb25hbGx5IGNsZWFyIGJ1ZGRpZXMuCi0JCSAqLwotCQlfX2NsZWFyX2J1ZGRpZXMoY2ZzX3JxLCBOVUxMKTsKIAkJc2V0X25leHRfZW50aXR5KGNmc19ycSwgc2UpOwogCQljZnNfcnEgPSBncm91cF9jZnNfcnEoc2UpOwogCX0gd2hpbGUgKGNmc19ycSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNjRjNWRlZS4uNjcwNTMyMCAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtNzA1LDcgKzcwNSw3IEBACiAKIAkJaWYgKHdoeSkgewogCQkJLyoKLQkJCSAqIFRoZSBmaXJzdCB0aHJlYWQgd2hpY2ggcmV0dXJucyBmcm9tIGZpbmlzaF9zdG9wKCkKKwkJCSAqIFRoZSBmaXJzdCB0aHJlYWQgd2hpY2ggcmV0dXJucyBmcm9tIGRvX3NpZ25hbF9zdG9wKCkKIAkJCSAqIHdpbGwgdGFrZSAtPnNpZ2xvY2ssIG5vdGljZSBTSUdOQUxfQ0xEX01BU0ssIGFuZAogCQkJICogbm90aWZ5IGl0cyBwYXJlbnQuIFNlZSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoKS4KIAkJCSAqLwpAQCAtOTcxLDYgKzk3MSwyMCBAQAogCXJldHVybiBzZW5kX3NpZ25hbChzaWcsIGluZm8sIHQsIDApOwogfQogCitpbnQgZG9fc2VuZF9zaWdfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJYm9vbCBncm91cCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtRVNSQ0g7CisKKwlpZiAobG9ja190YXNrX3NpZ2hhbmQocCwgJmZsYWdzKSkgeworCQlyZXQgPSBzZW5kX3NpZ25hbChzaWcsIGluZm8sIHAsIGdyb3VwKTsKKwkJdW5sb2NrX3Rhc2tfc2lnaGFuZChwLCAmZmxhZ3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBGb3JjZSBhIHNpZ25hbCB0aGF0IHRoZSBwcm9jZXNzIGNhbid0IGlnbm9yZTogaWYgbmVjZXNzYXJ5CiAgKiB3ZSB1bmJsb2NrIHRoZSBzaWduYWwgYW5kIGNoYW5nZSBhbnkgU0lHX0lHTiB0byBTSUdfREZMLgpAQCAtMTAzNiwxMiArMTA1MCw2IEBACiAJfQogfQogCi1pbnQgX19mYXRhbF9zaWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlyZXR1cm4gc2lnaXNtZW1iZXIoJnRzay0+cGVuZGluZy5zaWduYWwsIFNJR0tJTEwpOwotfQotRVhQT1JUX1NZTUJPTChfX2ZhdGFsX3NpZ25hbF9wZW5kaW5nKTsKLQogc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpsb2NrX3Rhc2tfc2lnaGFuZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kOwpAQCAtMTA2OCwxOCArMTA3NiwxMCBAQAogICovCiBpbnQgZ3JvdXBfc2VuZF9zaWdfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gY2hlY2tfa2lsbF9wZXJtaXNzaW9uKHNpZywgaW5mbywgcCk7CiAKLQlyZXQgPSBjaGVja19raWxsX3Blcm1pc3Npb24oc2lnLCBpbmZvLCBwKTsKLQotCWlmICghcmV0ICYmIHNpZykgewotCQlyZXQgPSAtRVNSQ0g7Ci0JCWlmIChsb2NrX3Rhc2tfc2lnaGFuZChwLCAmZmxhZ3MpKSB7Ci0JCQlyZXQgPSBfX2dyb3VwX3NlbmRfc2lnX2luZm8oc2lnLCBpbmZvLCBwKTsKLQkJCXVubG9ja190YXNrX3NpZ2hhbmQocCwgJmZsYWdzKTsKLQkJfQotCX0KKwlpZiAoIXJldCAmJiBzaWcpCisJCXJldCA9IGRvX3NlbmRfc2lnX2luZm8oc2lnLCBpbmZvLCBwLCB0cnVlKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMjI0LDE1ICsxMjI0LDkgQEAKICAqIFRoZXNlIGFyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwgc291cmNlLgogICovCiAKLS8qCi0gKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoZSB0YXNrIGNhbid0IGV4aXQuCi0gKi8KIGludAogc2VuZF9zaWdfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCS8qCiAJICogTWFrZSBzdXJlIGxlZ2FjeSBrZXJuZWwgdXNlcnMgZG9uJ3Qgc2VuZCBpbiBiYWQgdmFsdWVzCiAJICogKG5vcm1hbCBwYXRocyBjaGVjayB0aGlzIGluIGNoZWNrX2tpbGxfcGVybWlzc2lvbikuCkBAIC0xMjQwLDEwICsxMjM0LDcgQEAKIAlpZiAoIXZhbGlkX3NpZ25hbChzaWcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JcmV0ID0gc3BlY2lmaWNfc2VuZF9zaWdfaW5mbyhzaWcsIGluZm8sIHApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBkb19zZW5kX3NpZ19pbmZvKHNpZywgaW5mbywgcCwgZmFsc2UpOwogfQogCiAjZGVmaW5lIF9fc2lfc3BlY2lhbChwcml2KSBcCkBAIC0xMzgzLDE1ICsxMzc0LDYgQEAKIH0KIAogLyoKLSAqIFdha2UgdXAgYW55IHRocmVhZHMgaW4gdGhlIHBhcmVudCBibG9ja2VkIGluIHdhaXQqIHN5c2NhbGxzLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX193YWtlX3VwX3BhcmVudChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCi0JCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGFyZW50KQotewotCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jKCZwYXJlbnQtPnNpZ25hbC0+d2FpdF9jaGxkZXhpdCk7Ci19Ci0KLS8qCiAgKiBMZXQgYSBwYXJlbnQga25vdyBhYm91dCB0aGUgZGVhdGggb2YgYSBjaGlsZC4KICAqIEZvciBhIHN0b3BwZWQvY29udGludWVkIHN0YXR1cyBjaGFuZ2UsIHVzZSBkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AgaW5zdGVhZC4KICAqCkBAIC0xNjczLDI5ICsxNjU1LDYgQEAKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogfQogCi1zdGF0aWMgdm9pZAotZmluaXNoX3N0b3AoaW50IHN0b3BfY291bnQpCi17Ci0JLyoKLQkgKiBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgdGhyZWFkcyBpbiB0aGUgZ3JvdXAsIG9yIGlmIHRoZXJlIGlzCi0JICogYSBncm91cCBzdG9wIGluIHByb2dyZXNzIGFuZCB3ZSBhcmUgdGhlIGxhc3QgdG8gc3RvcCwKLQkgKiByZXBvcnQgdG8gdGhlIHBhcmVudC4gIFdoZW4gcHRyYWNlZCwgZXZlcnkgdGhyZWFkIHJlcG9ydHMgaXRzZWxmLgotCSAqLwotCWlmICh0cmFjZWhvb2tfbm90aWZ5X2pjdGwoc3RvcF9jb3VudCA9PSAwLCBDTERfU1RPUFBFRCkpIHsKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQsIENMRF9TVE9QUEVEKTsKLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCX0KLQotCWRvIHsKLQkJc2NoZWR1bGUoKTsKLQl9IHdoaWxlICh0cnlfdG9fZnJlZXplKCkpOwotCS8qCi0JICogTm93IHdlIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCBjb250aW51ZWQuCi0JICovCi0JY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKLX0KLQogLyoKICAqIFRoaXMgcGVyZm9ybXMgdGhlIHN0b3BwaW5nIGZvciBTSUdTVE9QIGFuZCBvdGhlciBzdG9wIHNpZ25hbHMuCiAgKiBXZSBoYXZlIHRvIHN0b3AgYWxsIHRocmVhZHMgaW4gdGhlIHRocmVhZCBncm91cC4KQEAgLTE3MDUsMTUgKzE2NjQsOSBAQAogc3RhdGljIGludCBkb19zaWduYWxfc3RvcChpbnQgc2lnbnIpCiB7CiAJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyA9IGN1cnJlbnQtPnNpZ25hbDsKLQlpbnQgc3RvcF9jb3VudDsKKwlpbnQgbm90aWZ5OwogCi0JaWYgKHNpZy0+Z3JvdXBfc3RvcF9jb3VudCA+IDApIHsKLQkJLyoKLQkJICogVGhlcmUgaXMgYSBncm91cCBzdG9wIGluIHByb2dyZXNzLiAgV2UgZG9uJ3QgbmVlZCB0bwotCQkgKiBzdGFydCBhbm90aGVyIG9uZS4KLQkJICovCi0JCXN0b3BfY291bnQgPSAtLXNpZy0+Z3JvdXBfc3RvcF9jb3VudDsKLQl9IGVsc2UgeworCWlmICghc2lnLT5ncm91cF9zdG9wX2NvdW50KSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKIAogCQlpZiAoIWxpa2VseShzaWctPmZsYWdzICYgU0lHTkFMX1NUT1BfREVRVUVVRUQpIHx8CkBAIC0xNzI1LDcgKzE2NzgsNyBAQAogCQkgKi8KIAkJc2lnLT5ncm91cF9leGl0X2NvZGUgPSBzaWducjsKIAotCQlzdG9wX2NvdW50ID0gMDsKKwkJc2lnLT5ncm91cF9zdG9wX2NvdW50ID0gMTsKIAkJZm9yICh0ID0gbmV4dF90aHJlYWQoY3VycmVudCk7IHQgIT0gY3VycmVudDsgdCA9IG5leHRfdGhyZWFkKHQpKQogCQkJLyoKIAkJCSAqIFNldHRpbmcgc3RhdGUgdG8gVEFTS19TVE9QUEVEIGZvciBhIGdyb3VwCkBAIC0xNzM0LDE5ICsxNjg3LDQ0IEBACiAJCQkgKi8KIAkJCWlmICghKHQtPmZsYWdzICYgUEZfRVhJVElORykgJiYKIAkJCSAgICAhdGFza19pc19zdG9wcGVkX29yX3RyYWNlZCh0KSkgewotCQkJCXN0b3BfY291bnQrKzsKKwkJCQlzaWctPmdyb3VwX3N0b3BfY291bnQrKzsKIAkJCQlzaWduYWxfd2FrZV91cCh0LCAwKTsKIAkJCX0KLQkJc2lnLT5ncm91cF9zdG9wX2NvdW50ID0gc3RvcF9jb3VudDsKKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgdGhyZWFkcyBpbiB0aGUgZ3JvdXAsIG9yIGlmIHRoZXJlIGlzCisJICogYSBncm91cCBzdG9wIGluIHByb2dyZXNzIGFuZCB3ZSBhcmUgdGhlIGxhc3QgdG8gc3RvcCwgcmVwb3J0CisJICogdG8gdGhlIHBhcmVudC4gIFdoZW4gcHRyYWNlZCwgZXZlcnkgdGhyZWFkIHJlcG9ydHMgaXRzZWxmLgorCSAqLworCW5vdGlmeSA9IHNpZy0+Z3JvdXBfc3RvcF9jb3VudCA9PSAxID8gQ0xEX1NUT1BQRUQgOiAwOworCW5vdGlmeSA9IHRyYWNlaG9va19ub3RpZnlfamN0bChub3RpZnksIENMRF9TVE9QUEVEKTsKKwkvKgorCSAqIHRyYWNlaG9va19ub3RpZnlfamN0bCgpIGNhbiBkcm9wIGFuZCByZWFjcXVpcmUgc2lnbG9jaywgc28KKwkgKiB3ZSBrZWVwIC0+Z3JvdXBfc3RvcF9jb3VudCAhPSAwIGJlZm9yZSB0aGUgY2FsbC4gSWYgU0lHQ09OVAorCSAqIG9yIFNJR0tJTEwgY29tZXMgaW4gYmV0d2VlbiAtPmdyb3VwX3N0b3BfY291bnQgPT0gMC4KKwkgKi8KKwlpZiAoc2lnLT5ncm91cF9zdG9wX2NvdW50KSB7CisJCWlmICghLS1zaWctPmdyb3VwX3N0b3BfY291bnQpCisJCQlzaWctPmZsYWdzID0gU0lHTkFMX1NUT1BfU1RPUFBFRDsKKwkJY3VycmVudC0+ZXhpdF9jb2RlID0gc2lnLT5ncm91cF9leGl0X2NvZGU7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19TVE9QUEVEKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWlmIChub3RpZnkpIHsKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQsIG5vdGlmeSk7CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAl9CiAKLQlpZiAoc3RvcF9jb3VudCA9PSAwKQotCQlzaWctPmZsYWdzID0gU0lHTkFMX1NUT1BfU1RPUFBFRDsKLQljdXJyZW50LT5leGl0X2NvZGUgPSBzaWctPmdyb3VwX2V4aXRfY29kZTsKLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfU1RPUFBFRCk7CisJLyogTm93IHdlIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCB3b2tlbiBieSBTSUdDT05UIG9yIFNJR0tJTEwgKi8KKwlkbyB7CisJCXNjaGVkdWxlKCk7CisJfSB3aGlsZSAodHJ5X3RvX2ZyZWV6ZSgpKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JZmluaXNoX3N0b3Aoc3RvcF9jb3VudCk7CisJdHJhY2Vob29rX2ZpbmlzaF9qY3RsKCk7CisJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKKwogCXJldHVybiAxOwogfQogCkBAIC0xODE1LDE0ICsxNzkzLDE1IEBACiAJCWludCB3aHkgPSAoc2lnbmFsLT5mbGFncyAmIFNJR05BTF9TVE9QX0NPTlRJTlVFRCkKIAkJCQk/IENMRF9DT05USU5VRUQgOiBDTERfU1RPUFBFRDsKIAkJc2lnbmFsLT5mbGFncyAmPSB+U0lHTkFMX0NMRF9NQVNLOworCisJCXdoeSA9IHRyYWNlaG9va19ub3RpZnlfamN0bCh3aHksIENMRF9DT05USU5VRUQpOwogCQlzcGluX3VubG9ja19pcnEoJnNpZ2hhbmQtPnNpZ2xvY2spOwogCi0JCWlmICh1bmxpa2VseSghdHJhY2Vob29rX25vdGlmeV9qY3RsKDEsIHdoeSkpKQotCQkJZ290byByZWxvY2s7Ci0KLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQtPmdyb3VwX2xlYWRlciwgd2h5KTsKLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlpZiAod2h5KSB7CisJCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQtPmdyb3VwX2xlYWRlciwgd2h5KTsKKwkJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJfQogCQlnb3RvIHJlbG9jazsKIAl9CiAKQEAgLTE5ODcsMTQgKzE5NjYsMTQgQEAKIAlpZiAodW5saWtlbHkodHNrLT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQpICYmCiAJCQkhLS10c2stPnNpZ25hbC0+Z3JvdXBfc3RvcF9jb3VudCkgewogCQl0c2stPnNpZ25hbC0+ZmxhZ3MgPSBTSUdOQUxfU1RPUF9TVE9QUEVEOwotCQlncm91cF9zdG9wID0gMTsKKwkJZ3JvdXBfc3RvcCA9IHRyYWNlaG9va19ub3RpZnlfamN0bChDTERfU1RPUFBFRCwgQ0xEX1NUT1BQRUQpOwogCX0KIG91dDoKIAlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CiAKLQlpZiAodW5saWtlbHkoZ3JvdXBfc3RvcCkgJiYgdHJhY2Vob29rX25vdGlmeV9qY3RsKDEsIENMRF9TVE9QUEVEKSkgeworCWlmICh1bmxpa2VseShncm91cF9zdG9wKSkgewogCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCQlkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AodHNrLCBDTERfU1RPUFBFRCk7CisJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcCh0c2ssIGdyb3VwX3N0b3ApOwogCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJfQogfQpAQCAtMjI5MCw3ICsyMjY5LDYgQEAKIGRvX3NlbmRfc3BlY2lmaWMocGlkX3QgdGdpZCwgcGlkX3QgcGlkLCBpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyb3IgPSAtRVNSQ0g7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0yMzAwLDE0ICsyMjc4LDE2IEBACiAJCS8qCiAJCSAqIFRoZSBudWxsIHNpZ25hbCBpcyBhIHBlcm1pc3Npb25zIGFuZCBwcm9jZXNzIGV4aXN0ZW5jZQogCQkgKiBwcm9iZS4gIE5vIHNpZ25hbCBpcyBhY3R1YWxseSBkZWxpdmVyZWQuCi0JCSAqCi0JCSAqIElmIGxvY2tfdGFza19zaWdoYW5kKCkgZmFpbHMgd2UgcHJldGVuZCB0aGUgdGFzayBkaWVzCi0JCSAqIGFmdGVyIHJlY2VpdmluZyB0aGUgc2lnbmFsLiBUaGUgd2luZG93IGlzIHRpbnksIGFuZCB0aGUKLQkJICogc2lnbmFsIGlzIHByaXZhdGUgYW55d2F5LgogCQkgKi8KLQkJaWYgKCFlcnJvciAmJiBzaWcgJiYgbG9ja190YXNrX3NpZ2hhbmQocCwgJmZsYWdzKSkgewotCQkJZXJyb3IgPSBzcGVjaWZpY19zZW5kX3NpZ19pbmZvKHNpZywgaW5mbywgcCk7Ci0JCQl1bmxvY2tfdGFza19zaWdoYW5kKHAsICZmbGFncyk7CisJCWlmICghZXJyb3IgJiYgc2lnKSB7CisJCQllcnJvciA9IGRvX3NlbmRfc2lnX2luZm8oc2lnLCBpbmZvLCBwLCBmYWxzZSk7CisJCQkvKgorCQkJICogSWYgbG9ja190YXNrX3NpZ2hhbmQoKSBmYWlsZWQgd2UgcHJldGVuZCB0aGUgdGFzaworCQkJICogZGllcyBhZnRlciByZWNlaXZpbmcgdGhlIHNpZ25hbC4gVGhlIHdpbmRvdyBpcyB0aW55LAorCQkJICogYW5kIHRoZSBzaWduYWwgaXMgcHJpdmF0ZSBhbnl3YXkuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseShlcnJvciA9PSAtRVNSQ0gpKQorCQkJCWVycm9yID0gMDsKIAkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zbG93LXdvcmsuYyBiL2tlcm5lbC9zbG93LXdvcmsuYwppbmRleCAwOWQ3NTE5Li4wZDMxMTM1IDEwMDY0NAotLS0gYS9rZXJuZWwvc2xvdy13b3JrLmMKKysrIGIva2VybmVsL3Nsb3ctd29yay5jCkBAIC0yNiwxMCArMjYsMTAgQEAKIHN0YXRpYyB2b2lkIHNsb3dfd29ya19vb21fdGltZW91dCh1bnNpZ25lZCBsb25nKTsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKLXN0YXRpYyBpbnQgc2xvd193b3JrX21pbl90aHJlYWRzX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKK3N0YXRpYyBpbnQgc2xvd193b3JrX21pbl90aHJlYWRzX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAotc3RhdGljIGludCBzbG93X3dvcmtfbWF4X3RocmVhZHNfc3lzY3RsKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50ICwgc3RydWN0IGZpbGUgKiwKK3N0YXRpYyBpbnQgc2xvd193b3JrX21heF90aHJlYWRzX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICosIGludCAsCiAJCQkJCXZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiAjZW5kaWYKIApAQCAtNDkzLDEwICs0OTMsMTAgQEAKICAqIEhhbmRsZSBhZGp1c3RtZW50IG9mIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0aHJlYWRzCiAgKi8KIHN0YXRpYyBpbnQgc2xvd193b3JrX21pbl90aHJlYWRzX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCQkJc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IHJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpbnQgcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWludCBuOwogCiAJaWYgKHJldCA9PSAwKSB7CkBAIC01MjEsMTAgKzUyMSwxMCBAQAogICogSGFuZGxlIGFkanVzdG1lbnQgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMKICAqLwogc3RhdGljIGludCBzbG93X3dvcmtfbWF4X3RocmVhZHNfc3lzY3RsKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCQlzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlpbnQgcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWludCByZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJaW50IG47CiAKIAlpZiAocmV0ID09IDApIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zbXAuYyBiL2tlcm5lbC9zbXAuYwppbmRleCBmZDQ3YTI1Li5jOWQxYzc4IDEwMDY0NAotLS0gYS9rZXJuZWwvc21wLmMKKysrIGIva2VybmVsL3NtcC5jCkBAIC0zNDcsMTMgKzM0Nyw2IEBACiAJZ2VuZXJpY19leGVjX3NpbmdsZShjcHUsIGRhdGEsIHdhaXQpOwogfQogCi0vKiBEZXByZWNhdGVkOiBzaGltIGZvciBhcmNocyB1c2luZyBvbGQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpIEFQSS4gKi8KLQotI2lmbmRlZiBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzawotIyBkZWZpbmUgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2sobWFza3ApIFwKLQkgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpKCoobWFza3ApKQotI2VuZGlmCi0KIC8qKgogICogc21wX2NhbGxfZnVuY3Rpb25fbWFueSgpOiBSdW4gYSBmdW5jdGlvbiBvbiBhIHNldCBvZiBvdGhlciBDUFVzLgogICogQG1hc2s6IFRoZSBzZXQgb2YgY3B1cyB0byBydW4gb24gKG9ubHkgcnVucyBvbiBvbmxpbmUgc3Vic2V0KS4KZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMgYi9rZXJuZWwvc29mdGxvY2t1cC5jCmluZGV4IDg4Nzk2YzMuLjgxMzI0ZDEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMKKysrIGIva2VybmVsL3NvZnRsb2NrdXAuYwpAQCAtOTAsMTEgKzkwLDExIEBACiBFWFBPUlRfU1lNQk9MKHRvdWNoX2FsbF9zb2Z0bG9ja3VwX3dhdGNoZG9ncyk7CiAKIGludCBwcm9jX2Rvc29mdGxvY2t1cF90aHJlc2goc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsCisJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsCiAJCQkgICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXRvdWNoX2FsbF9zb2Z0bG9ja3VwX3dhdGNoZG9ncygpOwotCXJldHVybiBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0dXJuIHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCBlYmNiMTU2Li5jZTE3NzYwIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC0xMTEwLDYgKzExMTAsOCBAQAogCWVyciA9IHNlc3Npb247CiBvdXQ6CiAJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJaWYgKGVyciA+IDApCisJCXByb2Nfc2lkX2Nvbm5lY3Rvcihncm91cF9sZWFkZXIpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE1NDIsNiArMTU0NCw0MSBAQAogCQkJCWN1cnJlbnQtPnRpbWVyX3NsYWNrX25zID0gYXJnMjsKIAkJCWVycm9yID0gMDsKIAkJCWJyZWFrOworCQljYXNlIFBSX01DRV9LSUxMOgorCQkJaWYgKGFyZzQgfCBhcmc1KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3dpdGNoIChhcmcyKSB7CisJCQljYXNlIFBSX01DRV9LSUxMX0NMRUFSOgorCQkJCWlmIChhcmczICE9IDApCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9NQ0VfUFJPQ0VTUzsKKwkJCQlicmVhazsKKwkJCWNhc2UgUFJfTUNFX0tJTExfU0VUOgorCQkJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01DRV9QUk9DRVNTOworCQkJCWlmIChhcmczID09IFBSX01DRV9LSUxMX0VBUkxZKQorCQkJCQljdXJyZW50LT5mbGFncyB8PSBQRl9NQ0VfRUFSTFk7CisJCQkJZWxzZSBpZiAoYXJnMyA9PSBQUl9NQ0VfS0lMTF9MQVRFKQorCQkJCQljdXJyZW50LT5mbGFncyAmPSB+UEZfTUNFX0VBUkxZOworCQkJCWVsc2UgaWYgKGFyZzMgPT0gUFJfTUNFX0tJTExfREVGQVVMVCkKKwkJCQkJY3VycmVudC0+ZmxhZ3MgJj0KKwkJCQkJCX4oUEZfTUNFX0VBUkxZfFBGX01DRV9QUk9DRVNTKTsKKwkJCQllbHNlCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWVycm9yID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFBSX01DRV9LSUxMX0dFVDoKKwkJCWlmIChhcmcyIHwgYXJnMyB8IGFyZzQgfCBhcmc1KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUNFX1BST0NFU1MpCisJCQkJZXJyb3IgPSAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NQ0VfRUFSTFkpID8KKwkJCQkJUFJfTUNFX0tJTExfRUFSTFkgOiBQUl9NQ0VfS0lMTF9MQVRFOworCQkJZWxzZQorCQkJCWVycm9yID0gUFJfTUNFX0tJTExfREVGQVVMVDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZXJyb3IgPSAtRUlOVkFMOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzX25pLmMgYi9rZXJuZWwvc3lzX25pLmMKaW5kZXggNTE1YmMyMy4uZTA2ZDBiOCAxMDA2NDQKLS0tIGEva2VybmVsL3N5c19uaS5jCisrKyBiL2tlcm5lbC9zeXNfbmkuYwpAQCAtNDksNiArNDksNyBAQAogY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfc2VuZG1zZyk7CiBjb25kX3N5c2NhbGwoc3lzX3JlY3Ztc2cpOwogY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfcmVjdm1zZyk7Citjb25kX3N5c2NhbGwoY29tcGF0X3N5c19yZWN2ZnJvbSk7CiBjb25kX3N5c2NhbGwoc3lzX3NvY2tldGNhbGwpOwogY29uZF9zeXNjYWxsKHN5c19mdXRleCk7CiBjb25kX3N5c2NhbGwoY29tcGF0X3N5c19mdXRleCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggMGRmYWE0Ny4uMGQ5NDljNSAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ttZW1jaGVjay5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTc3LDYgKzc2LDcgQEAKIGV4dGVybiBpbnQgY29yZV91c2VzX3BpZDsKIGV4dGVybiBpbnQgc3VpZF9kdW1wYWJsZTsKIGV4dGVybiBjaGFyIGNvcmVfcGF0dGVybltdOworZXh0ZXJuIHVuc2lnbmVkIGludCBjb3JlX3BpcGVfbGltaXQ7CiBleHRlcm4gaW50IHBpZF9tYXg7CiBleHRlcm4gaW50IG1pbl9mcmVlX2tieXRlczsKIGV4dGVybiBpbnQgcGlkX21heF9taW4sIHBpZF9tYXhfbWF4OwpAQCAtMTYzLDkgKzE2Myw5IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTAotc3RhdGljIGludCBwcm9jX2RvX2NhZF9waWQoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IHByb2NfZG9fY2FkX3BpZChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKLXN0YXRpYyBpbnQgcHJvY190YWludChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgcHJvY190YWludChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKICNlbmRpZgogCkBAIC00MjQsNiArNDI0LDE0IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3N0cmluZywKIAkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9zdHJpbmcsCiAJfSwKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAiY29yZV9waXBlX2xpbWl0IiwKKwkJLmRhdGEJCT0gJmNvcmVfcGlwZV9saW1pdCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCiAjaWZkZWYgQ09ORklHX1BST0NfU1lTQ1RMCiAJewogCQkucHJvY25hbWUJPSAidGFpbnRlZCIsCkBAIC0xMzkwLDYgKzEzOTgsMzEgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZzY2FuX3VuZXZpY3RhYmxlX2hhbmRsZXIsCiAJfSwKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkUKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibWVtb3J5X2ZhaWx1cmVfZWFybHlfa2lsbCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfZWFybHlfa2lsbCwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX21lbW9yeV9mYWlsdXJlX2Vhcmx5X2tpbGwpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmemVybywKKwkJLmV4dHJhMgkJPSAmb25lLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm1lbW9yeV9mYWlsdXJlX3JlY292ZXJ5IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9tZW1vcnlfZmFpbHVyZV9yZWNvdmVyeSwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX21lbW9yeV9mYWlsdXJlX3JlY292ZXJ5KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJnplcm8sCisJCS5leHRyYTIJCT0gJm9uZSwKKwl9LAorI2VuZGlmCisKIC8qCiAgKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKICAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dApAQCAtMjIxOCw3ICsyMjUxLDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19TWVNDVEwKIAogc3RhdGljIGludCBfcHJvY19kb19zdHJpbmcodm9pZCogZGF0YSwgaW50IG1heGxlbiwgaW50IHdyaXRlLAotCQkJICAgc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsCisJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc2l6ZV90IGxlbjsKQEAgLTIyNzksNyArMjMxMiw2IEBACiAgKiBwcm9jX2Rvc3RyaW5nIC0gcmVhZCBhIHN0cmluZyBzeXNjdGwKICAqIEB0YWJsZTogdGhlIHN5c2N0bCB0YWJsZQogICogQHdyaXRlOiAlVFJVRSBpZiB0aGlzIGlzIGEgd3JpdGUgdG8gdGhlIHN5c2N0bCBmaWxlCi0gKiBAZmlscDogdGhlIGZpbGUgc3RydWN0dXJlCiAgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXIKICAqIEBsZW5wOiB0aGUgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXIKICAqIEBwcG9zOiBmaWxlIHBvc2l0aW9uCkBAIC0yMjkzLDEwICsyMzI1LDEwIEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCBwcm9jX2Rvc3RyaW5nKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAoraW50IHByb2NfZG9zdHJpbmcoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlyZXR1cm4gX3Byb2NfZG9fc3RyaW5nKHRhYmxlLT5kYXRhLCB0YWJsZS0+bWF4bGVuLCB3cml0ZSwgZmlscCwKKwlyZXR1cm4gX3Byb2NfZG9fc3RyaW5nKHRhYmxlLT5kYXRhLCB0YWJsZS0+bWF4bGVuLCB3cml0ZSwKIAkJCSAgICAgICBidWZmZXIsIGxlbnAsIHBwb3MpOwogfQogCkBAIC0yMzIxLDcgKzIzNTMsNyBAQAogfQogCiBzdGF0aWMgaW50IF9fZG9fcHJvY19kb2ludHZlYyh2b2lkICp0YmxfZGF0YSwgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCi0JCSAgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJICBpbnQgd3JpdGUsIHZvaWQgX191c2VyICpidWZmZXIsCiAJCSAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsCiAJCSAgaW50ICgqY29udikoaW50ICpuZWdwLCB1bnNpZ25lZCBsb25nICpsdmFscCwgaW50ICp2YWxwLAogCQkJICAgICAgaW50IHdyaXRlLCB2b2lkICpkYXRhKSwKQEAgLTI0MjgsMTMgKzI0NjAsMTMgQEAKICN1bmRlZiBUTVBCVUZMRU4KIH0KIAotc3RhdGljIGludCBkb19wcm9jX2RvaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBkb19wcm9jX2RvaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsCiAJCSAgaW50ICgqY29udikoaW50ICpuZWdwLCB1bnNpZ25lZCBsb25nICpsdmFscCwgaW50ICp2YWxwLAogCQkJICAgICAgaW50IHdyaXRlLCB2b2lkICpkYXRhKSwKIAkJICB2b2lkICpkYXRhKQogewotCXJldHVybiBfX2RvX3Byb2NfZG9pbnR2ZWModGFibGUtPmRhdGEsIHRhYmxlLCB3cml0ZSwgZmlscCwKKwlyZXR1cm4gX19kb19wcm9jX2RvaW50dmVjKHRhYmxlLT5kYXRhLCB0YWJsZSwgd3JpdGUsCiAJCQlidWZmZXIsIGxlbnAsIHBwb3MsIGNvbnYsIGRhdGEpOwogfQogCkBAIC0yNDQyLDcgKzI0NzQsNiBAQAogICogcHJvY19kb2ludHZlYyAtIHJlYWQgYSB2ZWN0b3Igb2YgaW50ZWdlcnMKICAqIEB0YWJsZTogdGhlIHN5c2N0bCB0YWJsZQogICogQHdyaXRlOiAlVFJVRSBpZiB0aGlzIGlzIGEgd3JpdGUgdG8gdGhlIHN5c2N0bCBmaWxlCi0gKiBAZmlscDogdGhlIGZpbGUgc3RydWN0dXJlCiAgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXIKICAqIEBsZW5wOiB0aGUgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXIKICAqIEBwcG9zOiBmaWxlIHBvc2l0aW9uCkBAIC0yNDUyLDEwICsyNDgzLDEwIEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCBwcm9jX2RvaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAoraW50IHByb2NfZG9pbnR2ZWMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLSAgICByZXR1cm4gZG9fcHJvY19kb2ludHZlYyh0YWJsZSx3cml0ZSxmaWxwLGJ1ZmZlcixsZW5wLHBwb3MsCisgICAgcmV0dXJuIGRvX3Byb2NfZG9pbnR2ZWModGFibGUsd3JpdGUsYnVmZmVyLGxlbnAscHBvcywKIAkJICAgIAkgICAgTlVMTCxOVUxMKTsKIH0KIApAQCAtMjQ2Myw3ICsyNDk0LDcgQEAKICAqIFRhaW50IHZhbHVlcyBjYW4gb25seSBiZSBpbmNyZWFzZWQKICAqIFRoaXMgbWVhbnMgd2UgY2FuIHNhZmVseSB1c2UgYSB0ZW1wb3JhcnkuCiAgKi8KLXN0YXRpYyBpbnQgcHJvY190YWludChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgcHJvY190YWludChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBjdGxfdGFibGUgdDsKQEAgLTI0NzUsNyArMjUwNiw3IEBACiAKIAl0ID0gKnRhYmxlOwogCXQuZGF0YSA9ICZ0bXB0YWludDsKLQllcnIgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KCZ0LCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwllcnIgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KCZ0LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjUyNyw3ICsyNTU4LDYgQEAKICAqIHByb2NfZG9pbnR2ZWNfbWlubWF4IC0gcmVhZCBhIHZlY3RvciBvZiBpbnRlZ2VycyB3aXRoIG1pbi9tYXggdmFsdWVzCiAgKiBAdGFibGU6IHRoZSBzeXNjdGwgdGFibGUKICAqIEB3cml0ZTogJVRSVUUgaWYgdGhpcyBpcyBhIHdyaXRlIHRvIHRoZSBzeXNjdGwgZmlsZQotICogQGZpbHA6IHRoZSBmaWxlIHN0cnVjdHVyZQogICogQGJ1ZmZlcjogdGhlIHVzZXIgYnVmZmVyCiAgKiBAbGVucDogdGhlIHNpemUgb2YgdGhlIHVzZXIgYnVmZmVyCiAgKiBAcHBvczogZmlsZSBwb3NpdGlvbgpAQCAtMjU0MCwxOSArMjU3MCwxOCBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCi1pbnQgcHJvY19kb2ludHZlY19taW5tYXgoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19kb2ludHZlY19taW5tYXgoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZG9fcHJvY19kb2ludHZlY19taW5tYXhfY29udl9wYXJhbSBwYXJhbSA9IHsKIAkJLm1pbiA9IChpbnQgKikgdGFibGUtPmV4dHJhMSwKIAkJLm1heCA9IChpbnQgKikgdGFibGUtPmV4dHJhMiwKIAl9OwotCXJldHVybiBkb19wcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zLAorCXJldHVybiBkb19wcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zLAogCQkJCWRvX3Byb2NfZG9pbnR2ZWNfbWlubWF4X2NvbnYsICZwYXJhbSk7CiB9CiAKIHN0YXRpYyBpbnQgX19kb19wcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHZvaWQgKmRhdGEsIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsCiAJCQkJICAgICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcywKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udm11bCwKQEAgLTI2NTcsMjEgKzI2ODYsMTkgQEAKIH0KIAogc3RhdGljIGludCBkb19wcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsCiAJCQkJICAgICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcywKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udm11bCwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udmRpdikKIHsKIAlyZXR1cm4gX19kb19wcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLT5kYXRhLCB0YWJsZSwgd3JpdGUsCi0JCQlmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MsIGNvbnZtdWwsIGNvbnZkaXYpOworCQkJYnVmZmVyLCBsZW5wLCBwcG9zLCBjb252bXVsLCBjb252ZGl2KTsKIH0KIAogLyoqCiAgKiBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4IC0gcmVhZCBhIHZlY3RvciBvZiBsb25nIGludGVnZXJzIHdpdGggbWluL21heCB2YWx1ZXMKICAqIEB0YWJsZTogdGhlIHN5c2N0bCB0YWJsZQogICogQHdyaXRlOiAlVFJVRSBpZiB0aGlzIGlzIGEgd3JpdGUgdG8gdGhlIHN5c2N0bCBmaWxlCi0gKiBAZmlscDogdGhlIGZpbGUgc3RydWN0dXJlCiAgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXIKICAqIEBsZW5wOiB0aGUgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXIKICAqIEBwcG9zOiBmaWxlIHBvc2l0aW9uCkBAIC0yNjg0LDE3ICsyNzExLDE2IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAoraW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewotICAgIHJldHVybiBkb19wcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zLCAxbCwgMWwpOworICAgIHJldHVybiBkb19wcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zLCAxbCwgMWwpOwogfQogCiAvKioKICAqIHByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heCAtIHJlYWQgYSB2ZWN0b3Igb2YgbWlsbGlzZWNvbmQgdmFsdWVzIHdpdGggbWluL21heCB2YWx1ZXMKICAqIEB0YWJsZTogdGhlIHN5c2N0bCB0YWJsZQogICogQHdyaXRlOiAlVFJVRSBpZiB0aGlzIGlzIGEgd3JpdGUgdG8gdGhlIHN5c2N0bCBmaWxlCi0gKiBAZmlscDogdGhlIGZpbGUgc3RydWN0dXJlCiAgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXIKICAqIEBsZW5wOiB0aGUgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXIKICAqIEBwcG9zOiBmaWxlIHBvc2l0aW9uCkBAIC0yNzA5LDExICsyNzM1LDEwIEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50IHByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSAgICAgIHZvaWQgX191c2VyICpidWZmZXIsCiAJCQkJICAgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0gICAgcmV0dXJuIGRvX3Byb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsCisgICAgcmV0dXJuIGRvX3Byb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsCiAJCQkJICAgICBsZW5wLCBwcG9zLCBIWiwgMTAwMGwpOwogfQogCkBAIC0yNzg5LDcgKzI4MTQsNiBAQAogICogcHJvY19kb2ludHZlY19qaWZmaWVzIC0gcmVhZCBhIHZlY3RvciBvZiBpbnRlZ2VycyBhcyBzZWNvbmRzCiAgKiBAdGFibGU6IHRoZSBzeXNjdGwgdGFibGUKICAqIEB3cml0ZTogJVRSVUUgaWYgdGhpcyBpcyBhIHdyaXRlIHRvIHRoZSBzeXNjdGwgZmlsZQotICogQGZpbHA6IHRoZSBmaWxlIHN0cnVjdHVyZQogICogQGJ1ZmZlcjogdGhlIHVzZXIgYnVmZmVyCiAgKiBAbGVucDogdGhlIHNpemUgb2YgdGhlIHVzZXIgYnVmZmVyCiAgKiBAcHBvczogZmlsZSBwb3NpdGlvbgpAQCAtMjgwMSwxMCArMjgyNSwxMCBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCi1pbnQgcHJvY19kb2ludHZlY19qaWZmaWVzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAoraW50IHByb2NfZG9pbnR2ZWNfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLSAgICByZXR1cm4gZG9fcHJvY19kb2ludHZlYyh0YWJsZSx3cml0ZSxmaWxwLGJ1ZmZlcixsZW5wLHBwb3MsCisgICAgcmV0dXJuIGRvX3Byb2NfZG9pbnR2ZWModGFibGUsd3JpdGUsYnVmZmVyLGxlbnAscHBvcywKIAkJICAgIAkgICAgZG9fcHJvY19kb2ludHZlY19qaWZmaWVzX2NvbnYsTlVMTCk7CiB9CiAKQEAgLTI4MTIsNyArMjgzNiw2IEBACiAgKiBwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzIC0gcmVhZCBhIHZlY3RvciBvZiBpbnRlZ2VycyBhcyAxL1VTRVJfSFogc2Vjb25kcwogICogQHRhYmxlOiB0aGUgc3lzY3RsIHRhYmxlCiAgKiBAd3JpdGU6ICVUUlVFIGlmIHRoaXMgaXMgYSB3cml0ZSB0byB0aGUgc3lzY3RsIGZpbGUKLSAqIEBmaWxwOiB0aGUgZmlsZSBzdHJ1Y3R1cmUKICAqIEBidWZmZXI6IHRoZSB1c2VyIGJ1ZmZlcgogICogQGxlbnA6IHRoZSBzaXplIG9mIHRoZSB1c2VyIGJ1ZmZlcgogICogQHBwb3M6IHBvaW50ZXIgdG8gdGhlIGZpbGUgcG9zaXRpb24KQEAgLTI4MjQsMTAgKzI4NDcsMTAgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLSAgICByZXR1cm4gZG9fcHJvY19kb2ludHZlYyh0YWJsZSx3cml0ZSxmaWxwLGJ1ZmZlcixsZW5wLHBwb3MsCisgICAgcmV0dXJuIGRvX3Byb2NfZG9pbnR2ZWModGFibGUsd3JpdGUsYnVmZmVyLGxlbnAscHBvcywKIAkJICAgIAkgICAgZG9fcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllc19jb252LE5VTEwpOwogfQogCkBAIC0yODM1LDcgKzI4NTgsNiBAQAogICogcHJvY19kb2ludHZlY19tc19qaWZmaWVzIC0gcmVhZCBhIHZlY3RvciBvZiBpbnRlZ2VycyBhcyAxIG1pbGxpc2Vjb25kcwogICogQHRhYmxlOiB0aGUgc3lzY3RsIHRhYmxlCiAgKiBAd3JpdGU6ICVUUlVFIGlmIHRoaXMgaXMgYSB3cml0ZSB0byB0aGUgc3lzY3RsIGZpbGUKLSAqIEBmaWxwOiB0aGUgZmlsZSBzdHJ1Y3R1cmUKICAqIEBidWZmZXI6IHRoZSB1c2VyIGJ1ZmZlcgogICogQGxlbnA6IHRoZSBzaXplIG9mIHRoZSB1c2VyIGJ1ZmZlcgogICogQHBwb3M6IGZpbGUgcG9zaXRpb24KQEAgLTI4NDgsMTQgKzI4NzAsMTQgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2ludCBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MsCisJcmV0dXJuIGRvX3Byb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MsCiAJCQkJZG9fcHJvY19kb2ludHZlY19tc19qaWZmaWVzX2NvbnYsIE5VTEwpOwogfQogCi1zdGF0aWMgaW50IHByb2NfZG9fY2FkX3BpZChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgcHJvY19kb19jYWRfcGlkKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgcGlkICpuZXdfcGlkOwpAQCAtMjg2NCw3ICsyODg2LDcgQEAKIAogCXRtcCA9IHBpZF92bnIoY2FkX3BpZCk7CiAKLQlyID0gX19kb19wcm9jX2RvaW50dmVjKCZ0bXAsIHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLAorCXIgPSBfX2RvX3Byb2NfZG9pbnR2ZWMoJnRtcCwgdGFibGUsIHdyaXRlLCBidWZmZXIsCiAJCQkgICAgICAgbGVucCwgcHBvcywgTlVMTCwgTlVMTCk7CiAJaWYgKHIgfHwgIXdyaXRlKQogCQlyZXR1cm4gcjsKQEAgLTI4NzksNTAgKzI5MDEsNDkgQEAKIAogI2Vsc2UgLyogQ09ORklHX1BST0NfRlMgKi8KIAotaW50IHByb2NfZG9zdHJpbmcoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19kb3N0cmluZyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXJldHVybiAtRU5PU1lTOwogfQogCi1pbnQgcHJvY19kb2ludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2ludCBwcm9jX2RvaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKLWludCBwcm9jX2RvaW50dmVjX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2ludCBwcm9jX2RvaW50dmVjX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKLWludCBwcm9jX2RvaW50dmVjX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19kb2ludHZlY19qaWZmaWVzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAotaW50IHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKLWludCBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgcHJvY19kb2ludHZlY19tc19qaWZmaWVzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXJldHVybiAtRU5PU1lTOwogfQogCi1pbnQgcHJvY19kb3Vsb25ndmVjX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2ludCBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAogaW50IHByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSAgICAgIHZvaWQgX191c2VyICpidWZmZXIsCiAJCQkJICAgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsX2NoZWNrLmMgYi9rZXJuZWwvc3lzY3RsX2NoZWNrLmMKaW5kZXggYjM4NDIzYy4uYjZlN2FhZSAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bF9jaGVjay5jCisrKyBiL2tlcm5lbC9zeXNjdGxfY2hlY2suYwpAQCAtMTUyMSw3ICsxNTIxLDcgQEAKIAkJCWlmICghdGFibGUtPmN0bF9uYW1lICYmIHRhYmxlLT5zdHJhdGVneSkKIAkJCQlzZXRfZmFpbCgmZmFpbCwgdGFibGUsICJTdHJhdGVneSB3aXRob3V0IGN0bF9uYW1lIik7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUFJPQ19GUworI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTAogCQkJaWYgKHRhYmxlLT5wcm9jbmFtZSAmJiAhdGFibGUtPnByb2NfaGFuZGxlcikKIAkJCQlzZXRfZmFpbCgmZmFpbCwgdGFibGUsICJObyBwcm9jX2hhbmRsZXIiKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvTWFrZWZpbGUgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQppbmRleCAwYjBhNjM2Li5lZTI2NjYyIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9NYWtlZmlsZQorKysgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLW9iai15ICs9IHRpbWVrZWVwaW5nLm8gbnRwLm8gY2xvY2tzb3VyY2UubyBqaWZmaWVzLm8gdGltZXJfbGlzdC5vIHRpbWVjb21wYXJlLm8KK29iai15ICs9IHRpbWVrZWVwaW5nLm8gbnRwLm8gY2xvY2tzb3VyY2UubyBqaWZmaWVzLm8gdGltZXJfbGlzdC5vIHRpbWVjb21wYXJlLm8gdGltZWNvbnYubwogCiBvYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRCkJCSs9IGNsb2NrZXZlbnRzLm8KIG9iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTKQkJKz0gdGljay1jb21tb24ubwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKaW5kZXggMDkxMTMzNC4uNWUxOGM2YSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYworKysgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCkBAIC0zOTQsMTUgKzM5NCwxMSBAQAogewogCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3M7CiAKLQltdXRleF9sb2NrKCZjbG9ja3NvdXJjZV9tdXRleCk7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNzLCAmY2xvY2tzb3VyY2VfbGlzdCwgbGlzdCkKIAkJaWYgKGNzLT5yZXN1bWUpCiAJCQljcy0+cmVzdW1lKCk7CiAKIAljbG9ja3NvdXJjZV9yZXN1bWVfd2F0Y2hkb2coKTsKLQotCW11dGV4X3VubG9jaygmY2xvY2tzb3VyY2VfbXV0ZXgpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYyBiL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYwppbmRleCBlMGY1OWEyLi44OWFlZDU5IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKKysrIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCkBAIC0yMzEsNiArMjMxLDEzIEBACiAJaWYgKCFpbmlkbGUgJiYgIXRzLT5pbmlkbGUpCiAJCWdvdG8gZW5kOwogCisJLyoKKwkgKiBTZXQgdHMtPmluaWRsZSB1bmNvbmRpdGlvbmFsbHkuIEV2ZW4gaWYgdGhlIHN5c3RlbSBkaWQgbm90CisJICogc3dpdGNoIHRvIE5PSFogbW9kZSB0aGUgY3B1IGZyZXF1ZW5jeSBnb3Zlcm5lcnMgcmVseSBvbiB0aGUKKwkgKiB1cGRhdGUgb2YgdGhlIGlkbGUgdGltZSBhY2NvdW50aW5nIGluIHRpY2tfbm9oel9zdGFydF9pZGxlKCkuCisJICovCisJdHMtPmluaWRsZSA9IDE7CisKIAlub3cgPSB0aWNrX25vaHpfc3RhcnRfaWRsZSh0cyk7CiAKIAkvKgpAQCAtMjQ4LDggKzI1NSw2IEBACiAJaWYgKHVubGlrZWx5KHRzLT5ub2h6X21vZGUgPT0gTk9IWl9NT0RFX0lOQUNUSVZFKSkKIAkJZ290byBlbmQ7CiAKLQl0cy0+aW5pZGxlID0gMTsKLQogCWlmIChuZWVkX3Jlc2NoZWQoKSkKIAkJZ290byBlbmQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVjb252LmMgYi9rZXJuZWwvdGltZS90aW1lY29udi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjI4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdGltZS90aW1lY29udi5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgKiBDb250cmlidXRlZCBieSBQYXVsIEVnZ2VydCAoZWdnZXJ0QHR3aW5zdW4uY29tKS4KKyAqCisgKiBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgKiB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKgorICogQ29udmVydHMgdGhlIGNhbGVuZGFyIHRpbWUgdG8gYnJva2VuLWRvd24gdGltZSByZXByZXNlbnRhdGlvbgorICogQmFzZWQgb24gY29kZSBmcm9tIGdsaWJjLTIuNgorICoKKyAqIDIwMDktNy0xNDoKKyAqICAgTW92ZWQgZnJvbSBnbGliYy0yLjYgdG8ga2VybmVsIGJ5IFpoYW9sZWk8emhhb2xlaUBjbi5mdWppdHN1LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKgorICogTm9uemVybyBpZiBZRUFSIGlzIGEgbGVhcCB5ZWFyIChldmVyeSA0IHllYXJzLAorICogZXhjZXB0IGV2ZXJ5IDEwMHRoIGlzbid0LCBhbmQgZXZlcnkgNDAwdGggaXMpLgorICovCitzdGF0aWMgaW50IF9faXNsZWFwKGxvbmcgeWVhcikKK3sKKwlyZXR1cm4gKHllYXIpICUgNCA9PSAwICYmICgoeWVhcikgJSAxMDAgIT0gMCB8fCAoeWVhcikgJSA0MDAgPT0gMCk7Cit9CisKKy8qIGRvIGEgbWF0aGRpdiBmb3IgbG9uZyB0eXBlICovCitzdGF0aWMgbG9uZyBtYXRoX2Rpdihsb25nIGEsIGxvbmcgYikKK3sKKwlyZXR1cm4gYSAvIGIgLSAoYSAlIGIgPCAwKTsKK30KKworLyogSG93IG1hbnkgbGVhcCB5ZWFycyBiZXR3ZWVuIHkxIGFuZCB5MiwgeTEgbXVzdCBsZXNzIG9yIGVxdWFsIHRvIHkyICovCitzdGF0aWMgbG9uZyBsZWFwc19iZXR3ZWVuKGxvbmcgeTEsIGxvbmcgeTIpCit7CisJbG9uZyBsZWFwczEgPSBtYXRoX2Rpdih5MSAtIDEsIDQpIC0gbWF0aF9kaXYoeTEgLSAxLCAxMDApCisJCSsgbWF0aF9kaXYoeTEgLSAxLCA0MDApOworCWxvbmcgbGVhcHMyID0gbWF0aF9kaXYoeTIgLSAxLCA0KSAtIG1hdGhfZGl2KHkyIC0gMSwgMTAwKQorCQkrIG1hdGhfZGl2KHkyIC0gMSwgNDAwKTsKKwlyZXR1cm4gbGVhcHMyIC0gbGVhcHMxOworfQorCisvKiBIb3cgbWFueSBkYXlzIGNvbWUgYmVmb3JlIGVhY2ggbW9udGggKDAtMTIpLiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IF9fbW9uX3lkYXlbMl1bMTNdID0geworCS8qIE5vcm1hbCB5ZWFycy4gKi8KKwl7MCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NX0sCisJLyogTGVhcCB5ZWFycy4gKi8KKwl7MCwgMzEsIDYwLCA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzUsIDM2Nn0KK307CisKKyNkZWZpbmUgU0VDU19QRVJfSE9VUgkoNjAgKiA2MCkKKyNkZWZpbmUgU0VDU19QRVJfREFZCShTRUNTX1BFUl9IT1VSICogMjQpCisKKy8qKgorICogdGltZV90b190bSAtIGNvbnZlcnRzIHRoZSBjYWxlbmRhciB0aW1lIHRvIGxvY2FsIGJyb2tlbi1kb3duIHRpbWUKKyAqCisgKiBAdG90YWxzZWNzCXRoZSBudW1iZXIgb2Ygc2Vjb25kcyBlbGFwc2VkIHNpbmNlIDAwOjAwOjAwIG9uIEphbnVhcnkgMSwgMTk3MCwKKyAqCQlDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSAoVVRDKS4KKyAqIEBvZmZzZXQJb2Zmc2V0IHNlY29uZHMgYWRkaW5nIHRvIHRvdGFsc2Vjcy4KKyAqIEByZXN1bHQJcG9pbnRlciB0byBzdHJ1Y3QgdG0gdmFyaWFibGUgdG8gcmVjZWl2ZSBicm9rZW4tZG93biB0aW1lCisgKi8KK3ZvaWQgdGltZV90b190bSh0aW1lX3QgdG90YWxzZWNzLCBpbnQgb2Zmc2V0LCBzdHJ1Y3QgdG0gKnJlc3VsdCkKK3sKKwlsb25nIGRheXMsIHJlbSwgeTsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqaXA7CisKKwlkYXlzID0gdG90YWxzZWNzIC8gU0VDU19QRVJfREFZOworCXJlbSA9IHRvdGFsc2VjcyAlIFNFQ1NfUEVSX0RBWTsKKwlyZW0gKz0gb2Zmc2V0OworCXdoaWxlIChyZW0gPCAwKSB7CisJCXJlbSArPSBTRUNTX1BFUl9EQVk7CisJCS0tZGF5czsKKwl9CisJd2hpbGUgKHJlbSA+PSBTRUNTX1BFUl9EQVkpIHsKKwkJcmVtIC09IFNFQ1NfUEVSX0RBWTsKKwkJKytkYXlzOworCX0KKworCXJlc3VsdC0+dG1faG91ciA9IHJlbSAvIFNFQ1NfUEVSX0hPVVI7CisJcmVtICU9IFNFQ1NfUEVSX0hPVVI7CisJcmVzdWx0LT50bV9taW4gPSByZW0gLyA2MDsKKwlyZXN1bHQtPnRtX3NlYyA9IHJlbSAlIDYwOworCisJLyogSmFudWFyeSAxLCAxOTcwIHdhcyBhIFRodXJzZGF5LiAqLworCXJlc3VsdC0+dG1fd2RheSA9ICg0ICsgZGF5cykgJSA3OworCWlmIChyZXN1bHQtPnRtX3dkYXkgPCAwKQorCQlyZXN1bHQtPnRtX3dkYXkgKz0gNzsKKworCXkgPSAxOTcwOworCisJd2hpbGUgKGRheXMgPCAwIHx8IGRheXMgPj0gKF9faXNsZWFwKHkpID8gMzY2IDogMzY1KSkgeworCQkvKiBHdWVzcyBhIGNvcnJlY3RlZCB5ZWFyLCBhc3N1bWluZyAzNjUgZGF5cyBwZXIgeWVhci4gKi8KKwkJbG9uZyB5ZyA9IHkgKyBtYXRoX2RpdihkYXlzLCAzNjUpOworCisJCS8qIEFkanVzdCBEQVlTIGFuZCBZIHRvIG1hdGNoIHRoZSBndWVzc2VkIHllYXIuICovCisJCWRheXMgLT0gKHlnIC0geSkgKiAzNjUgKyBsZWFwc19iZXR3ZWVuKHksIHlnKTsKKwkJeSA9IHlnOworCX0KKworCXJlc3VsdC0+dG1feWVhciA9IHkgLSAxOTAwOworCisJcmVzdWx0LT50bV95ZGF5ID0gZGF5czsKKworCWlwID0gX19tb25feWRheVtfX2lzbGVhcCh5KV07CisJZm9yICh5ID0gMTE7IGRheXMgPCBpcFt5XTsgeS0tKQorCQljb250aW51ZTsKKwlkYXlzIC09IGlwW3ldOworCisJcmVzdWx0LT50bV9tb24gPSB5OworCXJlc3VsdC0+dG1fbWRheSA9IGRheXMgKyAxOworfQorRVhQT1JUX1NZTUJPTCh0aW1lX3RvX3RtKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCmluZGV4IGZiMGY0NmYuLmMzYTRlMjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKaW5kZXggZmRkZDY5ZC4uMWI1YjdhYSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbHAsIHRpbWVyX2xpc3Rfc2hvdywgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRpbWVyX2xpc3RfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRpbWVyX2xpc3RfZm9wcyA9IHsKIAkub3BlbgkJPSB0aW1lcl9saXN0X29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jIGIva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYwppbmRleCA0Y2RlOGI5Li5lZTU2ODFmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMKQEAgLTM5NSw3ICszOTUsNyBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxwLCB0c3RhdHNfc2hvdywgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRzdGF0c19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHN0YXRzX2ZvcHMgPSB7CiAJLm9wZW4JCT0gdHN0YXRzX29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLndyaXRlCQk9IHRzdGF0c193cml0ZSwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jIGIva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKaW5kZXggM2ViMTU5Yy4uZDlkNjIwNiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKQEAgLTg1Niw2ICs4NTYsMzcgQEAKIH0KIAogLyoqCisgKiBibGtfYWRkX3RyYWNlX3JxX3JlbWFwIC0gQWRkIGEgdHJhY2UgZm9yIGEgcmVxdWVzdC1yZW1hcCBvcGVyYXRpb24KKyAqIEBxOgkJcXVldWUgdGhlIGlvIGlzIGZvcgorICogQHJxOgkJdGhlIHNvdXJjZSByZXF1ZXN0CisgKiBAZGV2Ogl0YXJnZXQgZGV2aWNlCisgKiBAZnJvbToJc291cmNlIHNlY3RvcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIERldmljZSBtYXBwZXIgcmVtYXBzIHJlcXVlc3QgdG8gb3RoZXIgZGV2aWNlcy4KKyAqICAgICBBZGQgYSB0cmFjZSBmb3IgdGhhdCBhY3Rpb24uCisgKgorICoqLworc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9ycV9yZW1hcChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCQkgICBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGRldl90IGRldiwKKwkJCQkgICBzZWN0b3JfdCBmcm9tKQoreworCXN0cnVjdCBibGtfdHJhY2UgKmJ0ID0gcS0+YmxrX3RyYWNlOworCXN0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgcjsKKworCWlmIChsaWtlbHkoIWJ0KSkKKwkJcmV0dXJuOworCisJci5kZXZpY2VfZnJvbSA9IGNwdV90b19iZTMyKGRldik7CisJci5kZXZpY2VfdG8gICA9IGNwdV90b19iZTMyKGRpc2tfZGV2dChycS0+cnFfZGlzaykpOworCXIuc2VjdG9yX2Zyb20gPSBjcHVfdG9fYmU2NChmcm9tKTsKKworCV9fYmxrX2FkZF90cmFjZShidCwgYmxrX3JxX3BvcyhycSksIGJsa19ycV9ieXRlcyhycSksCisJCQlycV9kYXRhX2RpcihycSksIEJMS19UQV9SRU1BUCwgISFycS0+ZXJyb3JzLAorCQkJc2l6ZW9mKHIpLCAmcik7Cit9CisKKy8qKgogICogYmxrX2FkZF9kcml2ZXJfZGF0YSAtIEFkZCBiaW5hcnkgbWVzc2FnZSB3aXRoIGRyaXZlci1zcGVjaWZpYyBkYXRhCiAgKiBAcToJCXF1ZXVlIHRoZSBpbyBpcyBmb3IKICAqIEBycToJCWlvIHJlcXVlc3QKQEAgLTkyMiwxMCArOTUzLDEzIEBACiAJV0FSTl9PTihyZXQpOwogCXJldCA9IHJlZ2lzdGVyX3RyYWNlX2Jsb2NrX3JlbWFwKGJsa19hZGRfdHJhY2VfcmVtYXApOwogCVdBUk5fT04ocmV0KTsKKwlyZXQgPSByZWdpc3Rlcl90cmFjZV9ibG9ja19ycV9yZW1hcChibGtfYWRkX3RyYWNlX3JxX3JlbWFwKTsKKwlXQVJOX09OKHJldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa191bnJlZ2lzdGVyX3RyYWNlcG9pbnRzKHZvaWQpCiB7CisJdW5yZWdpc3Rlcl90cmFjZV9ibG9ja19ycV9yZW1hcChibGtfYWRkX3RyYWNlX3JxX3JlbWFwKTsKIAl1bnJlZ2lzdGVyX3RyYWNlX2Jsb2NrX3JlbWFwKGJsa19hZGRfdHJhY2VfcmVtYXApOwogCXVucmVnaXN0ZXJfdHJhY2VfYmxvY2tfc3BsaXQoYmxrX2FkZF90cmFjZV9zcGxpdCk7CiAJdW5yZWdpc3Rlcl90cmFjZV9ibG9ja191bnBsdWdfaW8oYmxrX2FkZF90cmFjZV91bnBsdWdfaW8pOwpAQCAtMTY1Nyw2ICsxNjkxLDExIEBACiAJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmYmxrX3RyYWNlX2F0dHJfZ3JvdXApOwogfQogCit2b2lkIGJsa190cmFjZV9yZW1vdmVfc3lzZnMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmYmxrX3RyYWNlX2F0dHJfZ3JvdXApOworfQorCiAjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgKi8KIAogI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKaW5kZXggMjNkZjc3Ny4uNmRjNGU1ZSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2Z0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwpAQCAtMjI1LDcgKzIyNSwxMSBAQAogCWlmIChmdHJhY2VfdHJhY2VfZnVuY3Rpb24gPT0gZnRyYWNlX3N0dWIpCiAJCXJldHVybjsKIAorI2lmZGVmIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUCiAJZnVuYyA9IGZ0cmFjZV90cmFjZV9mdW5jdGlvbjsKKyNlbHNlCisJZnVuYyA9IF9fZnRyYWNlX3RyYWNlX2Z1bmN0aW9uOworI2VuZGlmCiAKIAlpZiAoZnRyYWNlX3BpZF90cmFjZSkgewogCQlzZXRfZnRyYWNlX3BpZF9mdW5jdGlvbihmdW5jKTsKQEAgLTczNiw3ICs3NDAsNyBAQAogIG91dDoKIAltdXRleF91bmxvY2soJmZ0cmFjZV9wcm9maWxlX2xvY2spOwogCi0JZmlscC0+Zl9wb3MgKz0gY250OworCSpwcG9zICs9IGNudDsKIAogCXJldHVybiBjbnQ7CiB9CkBAIC0xMDc0LDE0ICsxMDc4LDkgQEAKIAkJZmFpbGVkID0gX19mdHJhY2VfcmVwbGFjZV9jb2RlKHJlYywgZW5hYmxlKTsKIAkJaWYgKGZhaWxlZCkgewogCQkJcmVjLT5mbGFncyB8PSBGVFJBQ0VfRkxfRkFJTEVEOwotCQkJaWYgKChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHx8Ci0JCQkgICAgIWNvcmVfa2VybmVsX3RleHQocmVjLT5pcCkpIHsKLQkJCQlmdHJhY2VfZnJlZV9yZWMocmVjKTsKLQkJCQl9IGVsc2UgewotCQkJCWZ0cmFjZV9idWcoZmFpbGVkLCByZWMtPmlwKTsKLQkJCQkJLyogU3RvcCBwcm9jZXNzaW5nICovCi0JCQkJCXJldHVybjsKLQkJCQl9CisJCQlmdHJhY2VfYnVnKGZhaWxlZCwgcmVjLT5pcCk7CisJCQkvKiBTdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybjsKIAkJfQogCX0gd2hpbGVfZm9yX2VhY2hfZnRyYWNlX3JlYygpOwogfQpAQCAtMTYyMSw4ICsxNjIwLDEwIEBACiAJCWlmICghcmV0KSB7CiAJCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJCQltLT5wcml2YXRlID0gaXRlcjsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CisJCQl0cmFjZV9wYXJzZXJfcHV0KCZpdGVyLT5wYXJzZXIpOwogCQkJa2ZyZWUoaXRlcik7CisJCX0KIAl9IGVsc2UKIAkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaXRlcjsKIAltdXRleF91bmxvY2soJmZ0cmFjZV9yZWdleF9sb2NrKTsKQEAgLTIyMDIsNyArMjIwMyw3IEBACiAJc3RydWN0IHRyYWNlX3BhcnNlciAqcGFyc2VyOwogCXNzaXplX3QgcmV0LCByZWFkOwogCi0JaWYgKCFjbnQgfHwgY250IDwgMCkKKwlpZiAoIWNudCkKIAkJcmV0dXJuIDA7CiAKIAltdXRleF9sb2NrKCZmdHJhY2VfcmVnZXhfbG9jayk7CkBAIC0yMjE2LDIwICsyMjE3LDIwIEBACiAJcGFyc2VyID0gJml0ZXItPnBhcnNlcjsKIAlyZWFkID0gdHJhY2VfZ2V0X3VzZXIocGFyc2VyLCB1YnVmLCBjbnQsIHBwb3MpOwogCi0JaWYgKHRyYWNlX3BhcnNlcl9sb2FkZWQocGFyc2VyKSAmJgorCWlmIChyZWFkID49IDAgJiYgdHJhY2VfcGFyc2VyX2xvYWRlZChwYXJzZXIpICYmCiAJICAgICF0cmFjZV9wYXJzZXJfY29udChwYXJzZXIpKSB7CiAJCXJldCA9IGZ0cmFjZV9wcm9jZXNzX3JlZ2V4KHBhcnNlci0+YnVmZmVyLAogCQkJCQkgICBwYXJzZXItPmlkeCwgZW5hYmxlKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfdW5sb2NrOwogCiAJCXRyYWNlX3BhcnNlcl9jbGVhcihwYXJzZXIpOwogCX0KIAogCXJldCA9IHJlYWQ7Ci0KK291dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfcmVnZXhfbG9jayk7Ci1vdXQ6CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNTUyLDggKzI1NTMsNyBAQAogCQkgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHRyYWNlX3BhcnNlciBwYXJzZXI7Ci0Jc2l6ZV90IHJlYWQgPSAwOwotCXNzaXplX3QgcmV0OworCXNzaXplX3QgcmVhZCwgcmV0OwogCiAJaWYgKCFjbnQgfHwgY250IDwgMCkKIAkJcmV0dXJuIDA7CkBAIC0yNTYyLDI5ICsyNTYyLDMxIEBACiAKIAlpZiAoZnRyYWNlX2dyYXBoX2NvdW50ID49IEZUUkFDRV9HUkFQSF9NQVhfRlVOQ1MpIHsKIAkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWlmICh0cmFjZV9wYXJzZXJfZ2V0X2luaXQoJnBhcnNlciwgRlRSQUNFX0JVRkZfTUFYKSkgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCXJlYWQgPSB0cmFjZV9nZXRfdXNlcigmcGFyc2VyLCB1YnVmLCBjbnQsIHBwb3MpOwogCi0JaWYgKHRyYWNlX3BhcnNlcl9sb2FkZWQoKCZwYXJzZXIpKSkgeworCWlmIChyZWFkID49IDAgJiYgdHJhY2VfcGFyc2VyX2xvYWRlZCgoJnBhcnNlcikpKSB7CiAJCXBhcnNlci5idWZmZXJbcGFyc2VyLmlkeF0gPSAwOwogCiAJCS8qIHdlIGFsbG93IG9ubHkgb25lIGV4cHJlc3Npb24gYXQgYSB0aW1lICovCiAJCXJldCA9IGZ0cmFjZV9zZXRfZnVuYyhmdHJhY2VfZ3JhcGhfZnVuY3MsICZmdHJhY2VfZ3JhcGhfY291bnQsCiAJCQkJCXBhcnNlci5idWZmZXIpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9mcmVlOwogCX0KIAogCXJldCA9IHJlYWQ7Ci0gb3V0OgorCitvdXRfZnJlZToKIAl0cmFjZV9wYXJzZXJfcHV0KCZwYXJzZXIpOworb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJmdyYXBoX2xvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTI2NTUsMTkgKzI2NTcsMTcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19NT0RVTEVTCi12b2lkIGZ0cmFjZV9yZWxlYXNlKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpCit2b2lkIGZ0cmFjZV9yZWxlYXNlX21vZChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJc3RydWN0IGR5bl9mdHJhY2UgKnJlYzsKIAlzdHJ1Y3QgZnRyYWNlX3BhZ2UgKnBnOwotCXVuc2lnbmVkIGxvbmcgcyA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZSA9ICh1bnNpZ25lZCBsb25nKWVuZDsKIAotCWlmIChmdHJhY2VfZGlzYWJsZWQgfHwgIXN0YXJ0IHx8IHN0YXJ0ID09IGVuZCkKKwlpZiAoZnRyYWNlX2Rpc2FibGVkKQogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZmdHJhY2VfbG9jayk7CiAJZG9fZm9yX2VhY2hfZnRyYWNlX3JlYyhwZywgcmVjKSB7Ci0JCWlmICgocmVjLT5pcCA+PSBzKSAmJiAocmVjLT5pcCA8IGUpKSB7CisJCWlmICh3aXRoaW5fbW9kdWxlX2NvcmUocmVjLT5pcCwgbW9kKSkgewogCQkJLyoKIAkJCSAqIHJlYy0+aXAgaXMgY2hhbmdlZCBpbiBmdHJhY2VfZnJlZV9yZWMoKQogCQkJICogSXQgc2hvdWxkIG5vdCBiZXR3ZWVuIHMgYW5kIGUgaWYgcmVjb3JkIHdhcyBmcmVlZC4KQEAgLTI2OTksOSArMjY5OSw3IEBACiAJCQkJICAgbW9kLT5udW1fZnRyYWNlX2NhbGxzaXRlcyk7CiAJCWJyZWFrOwogCWNhc2UgTU9EVUxFX1NUQVRFX0dPSU5HOgotCQlmdHJhY2VfcmVsZWFzZShtb2QtPmZ0cmFjZV9jYWxsc2l0ZXMsCi0JCQkgICAgICAgbW9kLT5mdHJhY2VfY2FsbHNpdGVzICsKLQkJCSAgICAgICBtb2QtPm51bV9mdHJhY2VfY2FsbHNpdGVzKTsKKwkJZnRyYWNlX3JlbGVhc2VfbW9kKG1vZCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzAxNSw3ICszMDEzLDcgQEAKIAogaW50CiBmdHJhY2VfZW5hYmxlX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQkgICAgIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgcmV0OwpAQCAtMzAyNSw3ICszMDIzLDcgQEAKIAogCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKIAotCXJldCAgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlsZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXQgID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAlpZiAocmV0IHx8ICF3cml0ZSB8fCAobGFzdF9mdHJhY2VfZW5hYmxlZCA9PSAhIWZ0cmFjZV9lbmFibGVkKSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2Uva21lbXRyYWNlLmMgYi9rZXJuZWwvdHJhY2Uva21lbXRyYWNlLmMKaW5kZXggODFiMTY0NS4uYTkxZGE2OSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2ttZW10cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9rbWVtdHJhY2UuYwpAQCAtNTAxLDcgKzUwMSw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCWlmICghcmVnaXN0ZXJfdHJhY2VyKCZrbWVtX3RyYWNlcikpIHsKKwlpZiAocmVnaXN0ZXJfdHJhY2VyKCZrbWVtX3RyYWNlcikgIT0gMCkgewogCQlwcl93YXJuaW5nKCJXYXJuaW5nOiBjb3VsZCBub3QgcmVnaXN0ZXIgdGhlIGttZW0gdHJhY2VyXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwppbmRleCBkNGZmMDE5Li41ZGQwMTdmIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYworKysgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwpAQCAtNDgzLDcgKzQ4Myw3IEBACiAvKiBVcCB0aGlzIGlmIHlvdSB3YW50IHRvIHRlc3QgdGhlIFRJTUVfRVhURU5UUyBhbmQgbm9ybWFsaXphdGlvbiAqLwogI2RlZmluZSBERUJVR19TSElGVCAwCiAKLXN0YXRpYyBpbmxpbmUgdTY0IHJiX3RpbWVfc3RhbXAoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpCitzdGF0aWMgaW5saW5lIHU2NCByYl90aW1lX3N0YW1wKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyKQogewogCS8qIHNoaWZ0IHRvIGRlYnVnL3Rlc3Qgbm9ybWFsaXphdGlvbiBhbmQgVElNRV9FWFRFTlRTICovCiAJcmV0dXJuIGJ1ZmZlci0+Y2xvY2soKSA8PCBERUJVR19TSElGVDsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCXU2NCB0aW1lOwogCiAJcHJlZW1wdF9kaXNhYmxlX25vdHJhY2UoKTsKLQl0aW1lID0gcmJfdGltZV9zdGFtcChidWZmZXIsIGNwdSk7CisJdGltZSA9IHJiX3RpbWVfc3RhbXAoYnVmZmVyKTsKIAlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkX25vdHJhY2UoKTsKIAogCXJldHVybiB0aW1lOwpAQCAtNTk5LDcgKzU5OSw3IEBACiB9CiAKIC8qCi0gKiByYl9pc19oZWFkX3BhZ2UgLSB0ZXN0IGlmIHRoZSBnaXZlIHBhZ2UgaXMgdGhlIGhlYWQgcGFnZQorICogcmJfaXNfaGVhZF9wYWdlIC0gdGVzdCBpZiB0aGUgZ2l2ZW4gcGFnZSBpcyB0aGUgaGVhZCBwYWdlCiAgKgogICogQmVjYXVzZSB0aGUgcmVhZGVyIG1heSBtb3ZlIHRoZSBoZWFkX3BhZ2UgcG9pbnRlciwgd2UgY2FuCiAgKiBub3QgdHJ1c3Qgd2hhdCB0aGUgaGVhZCBwYWdlIGlzIChpdCBtYXkgYmUgcG9pbnRpbmcgdG8KQEAgLTExOTMsNiArMTE5Myw3IEBACiAJYXRvbWljX2luYygmY3B1X2J1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKTsKIAlzeW5jaHJvbml6ZV9zY2hlZCgpOwogCisJc3Bpbl9sb2NrX2lycSgmY3B1X2J1ZmZlci0+cmVhZGVyX2xvY2spOwogCXJiX2hlYWRfcGFnZV9kZWFjdGl2YXRlKGNwdV9idWZmZXIpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKQEAgLTEyMDcsNiArMTIwOCw3IEBACiAJCXJldHVybjsKIAogCXJiX3Jlc2V0X2NwdShjcHVfYnVmZmVyKTsKKwlzcGluX3VubG9ja19pcnEoJmNwdV9idWZmZXItPnJlYWRlcl9sb2NrKTsKIAogCXJiX2NoZWNrX3BhZ2VzKGNwdV9idWZmZXIpOwogCkBAIC0xODY4LDcgKzE4NzAsNyBAQAogCQkgKiBOZXN0ZWQgY29tbWl0cyBhbHdheXMgaGF2ZSB6ZXJvIGRlbHRhcywgc28KIAkJICoganVzdCByZXJlYWQgdGhlIHRpbWUgc3RhbXAKIAkJICovCi0JCSp0cyA9IHJiX3RpbWVfc3RhbXAoYnVmZmVyLCBjcHVfYnVmZmVyLT5jcHUpOworCQkqdHMgPSByYl90aW1lX3N0YW1wKGJ1ZmZlcik7CiAJCW5leHRfcGFnZS0+cGFnZS0+dGltZV9zdGFtcCA9ICp0czsKIAl9CiAKQEAgLTIxMTEsNyArMjExMyw3IEBACiAJaWYgKFJCX1dBUk5fT04oY3B1X2J1ZmZlciwgKytucl9sb29wcyA+IDEwMDApKQogCQlnb3RvIG91dF9mYWlsOwogCi0JdHMgPSByYl90aW1lX3N0YW1wKGNwdV9idWZmZXItPmJ1ZmZlciwgY3B1X2J1ZmZlci0+Y3B1KTsKKwl0cyA9IHJiX3RpbWVfc3RhbXAoY3B1X2J1ZmZlci0+YnVmZmVyKTsKIAogCS8qCiAJICogT25seSB0aGUgZmlyc3QgY29tbWl0IGNhbiB1cGRhdGUgdGhlIHRpbWVzdGFtcC4KQEAgLTI2ODEsNyArMjY4Myw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9lbnRyaWVzKTsKIAogLyoqCi0gKiByaW5nX2J1ZmZlcl9vdmVycnVuX2NwdSAtIGdldCB0aGUgbnVtYmVyIG9mIG92ZXJydW5zIGluIGJ1ZmZlcgorICogcmluZ19idWZmZXJfb3ZlcnJ1bnMgLSBnZXQgdGhlIG51bWJlciBvZiBvdmVycnVucyBpbiBidWZmZXIKICAqIEBidWZmZXI6IFRoZSByaW5nIGJ1ZmZlcgogICoKICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBvdmVycnVucyBpbiB0aGUgcmluZyBidWZmZXIKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggNmMwZjZhOC4uYjIwZDNlYyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogCiAJLyogcmVhZCB0aGUgbm9uLXNwYWNlIGlucHV0ICovCiAJd2hpbGUgKGNudCAmJiAhaXNzcGFjZShjaCkpIHsKLQkJaWYgKHBhcnNlci0+aWR4IDwgcGFyc2VyLT5zaXplKQorCQlpZiAocGFyc2VyLT5pZHggPCBwYXJzZXItPnNpemUgLSAxKQogCQkJcGFyc2VyLT5idWZmZXJbcGFyc2VyLT5pZHgrK10gPSBjaDsKIAkJZWxzZSB7CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTM5Myw3ICsxMzkzLDcgQEAKIAogaW50IHRyYWNlX3ZwcmludGsodW5zaWduZWQgbG9uZyBpcCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCiB7Ci0JcmV0dXJuIHRyYWNlX2FycmF5X3ByaW50aygmZ2xvYmFsX3RyYWNlLCBpcCwgZm10LCBhcmdzKTsKKwlyZXR1cm4gdHJhY2VfYXJyYXlfdnByaW50aygmZ2xvYmFsX3RyYWNlLCBpcCwgZm10LCBhcmdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRyYWNlX3ZwcmludGspOwogCkBAIC0xOTg0LDExICsxOTg0LDkgQEAKIAlpZiAoY3VycmVudF90cmFjZSkKIAkJKml0ZXItPnRyYWNlID0gKmN1cnJlbnRfdHJhY2U7CiAKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZpdGVyLT5zdGFydGVkLCBHRlBfS0VSTkVMKSkKKwlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmaXRlci0+c3RhcnRlZCwgR0ZQX0tFUk5FTCkpCiAJCWdvdG8gZmFpbDsKIAotCWNwdW1hc2tfY2xlYXIoaXRlci0+c3RhcnRlZCk7Ci0KIAlpZiAoY3VycmVudF90cmFjZSAmJiBjdXJyZW50X3RyYWNlLT5wcmludF9tYXgpCiAJCWl0ZXItPnRyID0gJm1heF90cjsKIAllbHNlCkBAIC0yNDQyLDcgKzI0NDAsNyBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlmaWxwLT5mX3BvcyArPSBjbnQ7CisJKnBwb3MgKz0gY250OwogCiAJcmV0dXJuIGNudDsKIH0KQEAgLTI1ODQsNyArMjU4Miw3IEBACiAJfQogCW11dGV4X3VubG9jaygmdHJhY2VfdHlwZXNfbG9jayk7CiAKLQlmaWxwLT5mX3BvcyArPSBjbnQ7CisJKnBwb3MgKz0gY250OwogCiAJcmV0dXJuIGNudDsKIH0KQEAgLTI3NjYsNyArMjc2NCw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWZpbHAtPmZfcG9zICs9IHJldDsKKwkqcHBvcyArPSByZXQ7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzMwMSw3ICszMjk5LDcgQEAKIAkJfQogCX0KIAotCWZpbHAtPmZfcG9zICs9IGNudDsKKwkqcHBvcyArPSBjbnQ7CiAKIAkvKiBJZiBjaGVjayBwYWdlcyBmYWlsZWQsIHJldHVybiBFTk9NRU0gKi8KIAlpZiAodHJhY2luZ19kaXNhYmxlZCkKQEAgLTQzODksNyArNDM4Nyw3IEBACiAJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmdHJhY2luZ19jcHVtYXNrLCBHRlBfS0VSTkVMKSkKIAkJZ290byBvdXRfZnJlZV9idWZmZXJfbWFzazsKIAotCWlmICghYWxsb2NfY3B1bWFza192YXIoJnRyYWNpbmdfcmVhZGVyX2NwdW1hc2ssIEdGUF9LRVJORUwpKQorCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZ0cmFjaW5nX3JlYWRlcl9jcHVtYXNrLCBHRlBfS0VSTkVMKSkKIAkJZ290byBvdXRfZnJlZV90cmFjaW5nX2NwdW1hc2s7CiAKIAkvKiBUbyBzYXZlIG1lbW9yeSwga2VlcCB0aGUgcmluZyBidWZmZXIgc2l6ZSB0byBpdHMgbWluaW11bSAqLwpAQCAtNDQwMCw3ICs0Mzk4LDYgQEAKIAogCWNwdW1hc2tfY29weSh0cmFjaW5nX2J1ZmZlcl9tYXNrLCBjcHVfcG9zc2libGVfbWFzayk7CiAJY3B1bWFza19jb3B5KHRyYWNpbmdfY3B1bWFzaywgY3B1X2FsbF9tYXNrKTsKLQljcHVtYXNrX2NsZWFyKHRyYWNpbmdfcmVhZGVyX2NwdW1hc2spOwogCiAJLyogVE9ETzogbWFrZSB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaG90IHBsdWdnYWJsZSB3aXRoIENQVVMgKi8KIAlnbG9iYWxfdHJhY2UuYnVmZmVyID0gcmluZ19idWZmZXJfYWxsb2MocmluZ19idWZfc2l6ZSwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9icmFuY2guYyBiL2tlcm5lbC90cmFjZS90cmFjZV9icmFuY2guYwppbmRleCA3YTdhOWZkLi40YTE5NGYwIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfYnJhbmNoLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2JyYW5jaC5jCkBAIC0zNCw2ICszNCw3IEBACiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGJyYW5jaF90cmFjZXI7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgdHJhY2VfYnJhbmNoICplbnRyeTsKKwlzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjcHUsIHBjOwogCWNvbnN0IGNoYXIgKnA7CkBAIC01NCw3ICs1NSw4IEBACiAJCWdvdG8gb3V0OwogCiAJcGMgPSBwcmVlbXB0X2NvdW50KCk7Ci0JZXZlbnQgPSB0cmFjZV9idWZmZXJfbG9ja19yZXNlcnZlKHRyLCBUUkFDRV9CUkFOQ0gsCisJYnVmZmVyID0gdHItPmJ1ZmZlcjsKKwlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9CUkFOQ0gsCiAJCQkJCSAgc2l6ZW9mKCplbnRyeSksIGZsYWdzLCBwYyk7CiAJaWYgKCFldmVudCkKIAkJZ290byBvdXQ7CkBAIC03NCw4ICs3Niw4IEBACiAJZW50cnktPmxpbmUgPSBmLT5saW5lOwogCWVudHJ5LT5jb3JyZWN0ID0gdmFsID09IGV4cGVjdDsKIAotCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKLQkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CisJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgYnVmZmVyLCBldmVudCkpCisJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCk7CiAKICBvdXQ6CiAJYXRvbWljX2RlYygmdHItPmRhdGFbY3B1XS0+ZGlzYWJsZWQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3Byb2ZpbGUuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wcm9maWxlLmMKaW5kZXggZGQ0NGI4Ny4uOGQ1YzE3MSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3Byb2ZpbGUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfcHJvZmlsZS5jCkBAIC0zMSw3ICszMSw3IEBACiAJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZldmVudC0+cHJvZmlsZV9jb3VudCkpCiAJCXJldHVybiAwOwogCi0JaWYgKCF0b3RhbF9wcm9maWxlX2NvdW50KyspIHsKKwlpZiAoIXRvdGFsX3Byb2ZpbGVfY291bnQpIHsKIAkJYnVmID0gKGNoYXIgKilhbGxvY19wZXJjcHUocHJvZmlsZV9idWZfdCk7CiAJCWlmICghYnVmKQogCQkJZ290byBmYWlsX2J1ZjsKQEAgLTQ2LDE0ICs0NiwxOSBAQAogCX0KIAogCXJldCA9IGV2ZW50LT5wcm9maWxlX2VuYWJsZSgpOwotCWlmICghcmV0KQorCWlmICghcmV0KSB7CisJCXRvdGFsX3Byb2ZpbGVfY291bnQrKzsKIAkJcmV0dXJuIDA7CisJfQogCi0Ja2ZyZWUodHJhY2VfcHJvZmlsZV9idWZfbm1pKTsKIGZhaWxfYnVmX25taToKLQlrZnJlZSh0cmFjZV9wcm9maWxlX2J1Zik7CisJaWYgKCF0b3RhbF9wcm9maWxlX2NvdW50KSB7CisJCWZyZWVfcGVyY3B1KHRyYWNlX3Byb2ZpbGVfYnVmX25taSk7CisJCWZyZWVfcGVyY3B1KHRyYWNlX3Byb2ZpbGVfYnVmKTsKKwkJdHJhY2VfcHJvZmlsZV9idWZfbm1pID0gTlVMTDsKKwkJdHJhY2VfcHJvZmlsZV9idWYgPSBOVUxMOworCX0KIGZhaWxfYnVmOgotCXRvdGFsX3Byb2ZpbGVfY291bnQtLTsKIAlhdG9taWNfZGVjKCZldmVudC0+cHJvZmlsZV9jb3VudCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCmluZGV4IDZmMDNjOGEuLmQxMjhmNjUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKQEAgLTIzMiwxMCArMjMyLDkgQEAKIAkJICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB0cmFjZV9wYXJzZXIgcGFyc2VyOwotCXNpemVfdCByZWFkID0gMDsKLQlzc2l6ZV90IHJldDsKKwlzc2l6ZV90IHJlYWQsIHJldDsKIAotCWlmICghY250IHx8IGNudCA8IDApCisJaWYgKCFjbnQpCiAJCXJldHVybiAwOwogCiAJcmV0ID0gdHJhY2luZ191cGRhdGVfYnVmZmVycygpOwpAQCAtMjQ3LDcgKzI0Niw3IEBACiAKIAlyZWFkID0gdHJhY2VfZ2V0X3VzZXIoJnBhcnNlciwgdWJ1ZiwgY250LCBwcG9zKTsKIAotCWlmICh0cmFjZV9wYXJzZXJfbG9hZGVkKCgmcGFyc2VyKSkpIHsKKwlpZiAocmVhZCA+PSAwICYmIHRyYWNlX3BhcnNlcl9sb2FkZWQoKCZwYXJzZXIpKSkgewogCQlpbnQgc2V0ID0gMTsKIAogCQlpZiAoKnBhcnNlci5idWZmZXIgPT0gJyEnKQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMKaW5kZXggMjMyNDU3OC4uOThhNmNjNSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jCkBAIC05MzMsOCArOTMzLDkgQEAKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcHMtPnBvc3RmaXgpKSB7CiAJCWVsdCA9IGxpc3RfZmlyc3RfZW50cnkoJnBzLT5wb3N0Zml4LCBzdHJ1Y3QgcG9zdGZpeF9lbHQsIGxpc3QpOwotCQlrZnJlZShlbHQtPm9wZXJhbmQpOwogCQlsaXN0X2RlbCgmZWx0LT5saXN0KTsKKwkJa2ZyZWUoZWx0LT5vcGVyYW5kKTsKKwkJa2ZyZWUoZWx0KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9od19icmFuY2hlcy5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKaW5kZXggMjNiNjM4NS4uNjk1NDNhOSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKQEAgLTE2NSw2ICsxNjUsNyBAQAogCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9od19icmFuY2g7CiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGh3X2JyYW5jaF90cmFjZTsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OworCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmOwogCXN0cnVjdCBod19icmFuY2hfZW50cnkgKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgaXJxMTsKIAlpbnQgY3B1OwpAQCAtMTgwLDcgKzE4MSw4IEBACiAJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZ0ci0+ZGF0YVtjcHVdLT5kaXNhYmxlZCkgIT0gMSkKIAkJZ290byBvdXQ7CiAKLQlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUodHIsIFRSQUNFX0hXX0JSQU5DSEVTLAorCWJ1ZiA9IHRyLT5idWZmZXI7CisJZXZlbnQgPSB0cmFjZV9idWZmZXJfbG9ja19yZXNlcnZlKGJ1ZiwgVFJBQ0VfSFdfQlJBTkNIRVMsCiAJCQkJCSAgc2l6ZW9mKCplbnRyeSksIDAsIDApOwogCWlmICghZXZlbnQpCiAJCWdvdG8gb3V0OwpAQCAtMTg5LDggKzE5MSw4IEBACiAJZW50cnktPmVudC50eXBlID0gVFJBQ0VfSFdfQlJBTkNIRVM7CiAJZW50cnktPmZyb20gPSBmcm9tOwogCWVudHJ5LT50byAgID0gdG87Ci0JaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgdHItPmJ1ZmZlciwgZXZlbnQpKQotCQl0cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdCh0ciwgZXZlbnQsIDAsIDApOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIGJ1ZiwgZXZlbnQpKQorCQl0cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdChidWYsIGV2ZW50LCAwLCAwKTsKIAogIG91dDoKIAlhdG9taWNfZGVjKCZ0ci0+ZGF0YVtjcHVdLT5kaXNhYmxlZCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKaW5kZXggZjU3MmY0NC4uYjZjMTJjNiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYwpAQCAtNjksNiArNjksOSBAQAogICogQHM6IHRyYWNlIHNlcXVlbmNlIGRlc2NyaXB0b3IKICAqIEBmbXQ6IHByaW50ZiBmb3JtYXQgc3RyaW5nCiAgKgorICogSXQgcmV0dXJucyAwIGlmIHRoZSB0cmFjZSBvdmVyc2l6ZXMgdGhlIGJ1ZmZlcidzIGZyZWUKKyAqIHNwYWNlLCAxIG90aGVyd2lzZS4KKyAqCiAgKiBUaGUgdHJhY2VyIG1heSB1c2UgZWl0aGVyIHNlcXVlbmNlIG9wZXJhdGlvbnMgb3IgaXRzIG93bgogICogY29weSB0byB1c2VyIHJvdXRpbmVzLiBUbyBzaW1wbGlmeSBmb3JtYXRpbmcgb2YgYSB0cmFjZQogICogdHJhY2Vfc2VxX3ByaW50ZiBpcyB1c2VkIHRvIHN0b3JlIHN0cmluZ3MgaW50byBhIHNwZWNpYWwKQEAgLTk1LDcgKzk4LDcgQEAKIAogCXMtPmxlbiArPSByZXQ7CiAKLQlyZXR1cm4gbGVuOworCXJldHVybiAxOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodHJhY2Vfc2VxX3ByaW50Zik7CiAKQEAgLTQ4NiwxNiArNDg5LDE4IEBACiAJCQkJaGFyZGlycSA/ICdoJyA6IHNvZnRpcnEgPyAncycgOiAnLicpKQogCQlyZXR1cm4gMDsKIAotCWlmIChlbnRyeS0+bG9ja19kZXB0aCA8IDApCi0JCXJldCA9IHRyYWNlX3NlcV9wdXRjKHMsICcuJyk7CisJaWYgKGVudHJ5LT5wcmVlbXB0X2NvdW50KQorCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIleCIsIGVudHJ5LT5wcmVlbXB0X2NvdW50KTsKIAllbHNlCi0JCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiVkIiwgZW50cnktPmxvY2tfZGVwdGgpOworCQlyZXQgPSB0cmFjZV9zZXFfcHV0YyhzLCAnLicpOworCiAJaWYgKCFyZXQpCiAJCXJldHVybiAwOwogCi0JaWYgKGVudHJ5LT5wcmVlbXB0X2NvdW50KQotCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJXgiLCBlbnRyeS0+cHJlZW1wdF9jb3VudCk7Ci0JcmV0dXJuIHRyYWNlX3NlcV9wdXRjKHMsICcuJyk7CisJaWYgKGVudHJ5LT5sb2NrX2RlcHRoIDwgMCkKKwkJcmV0dXJuIHRyYWNlX3NlcV9wdXRjKHMsICcuJyk7CisKKwlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJWQiLCBlbnRyeS0+bG9ja19kZXB0aCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTg4Myw3ICs4ODgsNyBAQAogCXRyYWNlX2Fzc2lnbl90eXBlKGZpZWxkLCBpdGVyLT5lbnQpOwogCiAJaWYgKCFTKQotCQl0YXNrX3N0YXRlX2NoYXIoZmllbGQtPnByZXZfc3RhdGUpOworCQlTID0gdGFza19zdGF0ZV9jaGFyKGZpZWxkLT5wcmV2X3N0YXRlKTsKIAlUID0gdGFza19zdGF0ZV9jaGFyKGZpZWxkLT5uZXh0X3N0YXRlKTsKIAlpZiAoIXRyYWNlX3NlcV9wcmludGYoJml0ZXItPnNlcSwgIiVkICVkICVjICVkICVkICVkICVjXG4iLAogCQkJICAgICAgZmllbGQtPnByZXZfcGlkLApAQCAtOTE4LDcgKzkyMyw3IEBACiAJdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGl0ZXItPmVudCk7CiAKIAlpZiAoIVMpCi0JCXRhc2tfc3RhdGVfY2hhcihmaWVsZC0+cHJldl9zdGF0ZSk7CisJCVMgPSB0YXNrX3N0YXRlX2NoYXIoZmllbGQtPnByZXZfc3RhdGUpOwogCVQgPSB0YXNrX3N0YXRlX2NoYXIoZmllbGQtPm5leHRfc3RhdGUpOwogCiAJU0VRX1BVVF9IRVhfRklFTERfUkVUKHMsIGZpZWxkLT5wcmV2X3BpZCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYyBiL2tlcm5lbC90cmFjZS90cmFjZV9zdGFjay5jCmluZGV4IDBmNmZhY2IuLjg1MDRhYzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zdGFjay5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zdGFjay5jCkBAIC0yOTYsMTQgKzI5NiwxNCBAQAogCiBpbnQKIHN0YWNrX3RyYWNlX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCiAJCSAgIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmc3RhY2tfc3lzY3RsX211dGV4KTsKIAotCXJldCA9IHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldCA9IHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJaWYgKHJldCB8fCAhd3JpdGUgfHwKIAkgICAgKGxhc3Rfc3RhY2tfdHJhY2VyX2VuYWJsZWQgPT0gISFzdGFja190cmFjZXJfZW5hYmxlZCkpCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9zeXNjYWxscy5jCmluZGV4IDlmYmNlNmMuLjUyN2UxN2UgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zeXNjYWxscy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zeXNjYWxscy5jCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJCSAgICAgICAiXHRmaWVsZDolcyAlcztcdG9mZnNldDolenU7XHRzaXplOiV6dTtcbiIKIAkJCSAgICAgICAiXHRmaWVsZDolcyAlcztcdG9mZnNldDolenU7XHRzaXplOiV6dTtcbiIsCiAJCQkgICAgICAgU1lTQ0FMTF9GSUVMRChpbnQsIG5yKSwKLQkJCSAgICAgICBTWVNDQUxMX0ZJRUxEKHVuc2lnbmVkIGxvbmcsIHJldCkpOworCQkJICAgICAgIFNZU0NBTExfRklFTEQobG9uZywgcmV0KSk7CiAJaWYgKCFyZXQpCiAJCXJldHVybiAwOwogCkBAIC0yMTIsNyArMjEyLDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGNhbGwsIFNZU0NBTExfRklFTEQodW5zaWduZWQgbG9uZywgcmV0KSwgMCwKKwlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoY2FsbCwgU1lTQ0FMTF9GSUVMRChsb25nLCByZXQpLCAwLAogCQkJCSBGSUxURVJfT1RIRVIpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2tlcm5lbC91aWQxNi5jIGIva2VybmVsL3VpZDE2LmMKaW5kZXggMDMxNDUwMS4uNDE5MjA5OCAxMDA2NDQKLS0tIGEva2VybmVsL3VpZDE2LmMKKysrIGIva2VybmVsL3VpZDE2LmMKQEAgLTQsNyArNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3V0c25hbWVfc3lzY3RsLmMgYi9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYwppbmRleCA5MjM1OWNjLi42OWVhZTM1IDEwMDY0NAotLS0gYS9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYworKysgYi9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYwpAQCAtNDIsMTQgKzQyLDE0IEBACiAgKglTcGVjaWFsIGNhc2Ugb2YgZG9zdHJpbmcgZm9yIHRoZSBVVFMgc3RydWN0dXJlLiBUaGlzIGhhcyBsb2NrcwogICoJdG8gb2JzZXJ2ZS4gU2hvdWxkIHRoaXMgYmUgaW4ga2VybmVsL3N5cy5jID8/Pz8KICAqLwotc3RhdGljIGludCBwcm9jX2RvX3V0c19zdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgcHJvY19kb191dHNfc3RyaW5nKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgY3RsX3RhYmxlIHV0c190YWJsZTsKIAlpbnQgcjsKIAltZW1jcHkoJnV0c190YWJsZSwgdGFibGUsIHNpemVvZih1dHNfdGFibGUpKTsKIAl1dHNfdGFibGUuZGF0YSA9IGdldF91dHModGFibGUsIHdyaXRlKTsKLQlyID0gcHJvY19kb3N0cmluZygmdXRzX3RhYmxlLHdyaXRlLGZpbHAsYnVmZmVyLGxlbnAsIHBwb3MpOworCXIgPSBwcm9jX2Rvc3RyaW5nKCZ1dHNfdGFibGUsd3JpdGUsYnVmZmVyLGxlbnAsIHBwb3MpOwogCXB1dF91dHModGFibGUsIHdyaXRlLCB1dHNfdGFibGUuZGF0YSk7CiAJcmV0dXJuIHI7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggYWRkZmUyZC4uMTIzMjgxNCAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtNjQwLDYgKzY0MCwyNCBAQAogRVhQT1JUX1NZTUJPTChzY2hlZHVsZV9kZWxheWVkX3dvcmspOwogCiAvKioKKyAqIGZsdXNoX2RlbGF5ZWRfd29yayAtIGJsb2NrIHVudGlsIGEgZHdvcmtfc3RydWN0J3MgY2FsbGJhY2sgaGFzIHRlcm1pbmF0ZWQKKyAqIEBkd29yazogdGhlIGRlbGF5ZWQgd29yayB3aGljaCBpcyB0byBiZSBmbHVzaGVkCisgKgorICogQW55IHRpbWVvdXQgaXMgY2FuY2VsbGVkLCBhbmQgYW55IHBlbmRpbmcgd29yayBpcyBydW4gaW1tZWRpYXRlbHkuCisgKi8KK3ZvaWQgZmx1c2hfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrKQoreworCWlmIChkZWxfdGltZXJfc3luYygmZHdvcmstPnRpbWVyKSkgeworCQlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cTsKKwkJY3dxID0gd3FfcGVyX2NwdShrZXZlbnRkX3dxLCBnZXRfY3B1KCkpOworCQlfX3F1ZXVlX3dvcmsoY3dxLCAmZHdvcmstPndvcmspOworCQlwdXRfY3B1KCk7CisJfQorCWZsdXNoX3dvcmsoJmR3b3JrLT53b3JrKTsKK30KK0VYUE9SVF9TWU1CT0woZmx1c2hfZGVsYXllZF93b3JrKTsKKworLyoqCiAgKiBzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24gLSBxdWV1ZSB3b3JrIGluIGdsb2JhbCB3b3JrcXVldWUgb24gQ1BVIGFmdGVyIGRlbGF5CiAgKiBAY3B1OiBjcHUgdG8gdXNlCiAgKiBAZHdvcms6IGpvYiB0byBiZSBkb25lCkBAIC02NjcsMjEgKzY4NSwzOCBAQAogaW50IHNjaGVkdWxlX29uX2VhY2hfY3B1KHdvcmtfZnVuY190IGZ1bmMpCiB7CiAJaW50IGNwdTsKKwlpbnQgb3JpZyA9IC0xOwogCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya3M7CiAKIAl3b3JrcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgd29ya19zdHJ1Y3QpOwogCWlmICghd29ya3MpCiAJCXJldHVybiAtRU5PTUVNOwogCisJLyoKKwkgKiB3aGVuIHJ1bm5pbmcgaW4ga2V2ZW50ZCBkb24ndCBzY2hlZHVsZSBhIHdvcmsgaXRlbSBvbiBpdHNlbGYuCisJICogQ2FuIGp1c3QgY2FsbCBkaXJlY3RseSBiZWNhdXNlIHRoZSB3b3JrIHF1ZXVlIGlzIGFscmVhZHkgYm91bmQuCisJICogVGhpcyBhbHNvIGlzIGZhc3Rlci4KKwkgKiBNYWtlIHRoaXMgYSBnZW5lcmljIHBhcmFtZXRlciBmb3Igb3RoZXIgd29ya3F1ZXVlcz8KKwkgKi8KKwlpZiAoY3VycmVudF9pc19rZXZlbnRkKCkpIHsKKwkJb3JpZyA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJCUlOSVRfV09SSyhwZXJfY3B1X3B0cih3b3Jrcywgb3JpZyksIGZ1bmMpOworCQlmdW5jKHBlcl9jcHVfcHRyKHdvcmtzLCBvcmlnKSk7CisJfQorCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrID0gcGVyX2NwdV9wdHIod29ya3MsIGNwdSk7CiAKKwkJaWYgKGNwdSA9PSBvcmlnKQorCQkJY29udGludWU7CiAJCUlOSVRfV09SSyh3b3JrLCBmdW5jKTsKIAkJc2NoZWR1bGVfd29ya19vbihjcHUsIHdvcmspOwogCX0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJZmx1c2hfd29yayhwZXJfY3B1X3B0cih3b3JrcywgY3B1KSk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNwdSAhPSBvcmlnKQorCQkJZmx1c2hfd29yayhwZXJfY3B1X3B0cih3b3JrcywgY3B1KSk7CisJfQogCXB1dF9vbmxpbmVfY3B1cygpOwogCWZyZWVfcGVyY3B1KHdvcmtzKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggZDU3YjEyZi4uMjM0Y2ViMSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTUwLDYgKzUwLDE0IEBACiAJICBrZXlzIGFyZSBkb2N1bWVudGVkIGluIDxmaWxlOkRvY3VtZW50YXRpb24vc3lzcnEudHh0Pi4gRG9uJ3Qgc2F5IFkKIAkgIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB0aGlzIGhhY2sgZG9lcy4KIAorY29uZmlnIFNUUklQX0FTTV9TWU1TCisJYm9vbCAiU3RyaXAgYXNzZW1ibGVyLWdlbmVyYXRlZCBzeW1ib2xzIGR1cmluZyBsaW5rIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFN0cmlwIGludGVybmFsIGFzc2VtYmxlci1nZW5lcmF0ZWQgc3ltYm9scyBkdXJpbmcgYSBsaW5rIChzeW1ib2xzCisJICB0aGF0IGxvb2sgbGlrZSAnLkx4eHgnKSBzbyB0aGV5IGRvbid0IHBvbGx1dGUgdGhlIG91dHB1dCBvZgorCSAgZ2V0X3djaGFuKCkgYW5kIHN1Y2hsaWtlLgorCiBjb25maWcgVU5VU0VEX1NZTUJPTFMKIAlib29sICJFbmFibGUgdW51c2VkL29ic29sZXRlIGV4cG9ydGVkIHN5bWJvbHMiCiAJZGVmYXVsdCB5IGlmIFg4NgpAQCAtMzM4LDggKzM0Niw5IEBACiAKIGNvbmZpZyBERUJVR19LTUVNTEVBSwogCWJvb2wgIktlcm5lbCBtZW1vcnkgbGVhayBkZXRlY3RvciIKLQlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBFWFBFUklNRU5UQUwgJiYgKFg4NiB8fCBBUk0gfHwgUFBDKSAmJiBcCi0JCSFNRU1PUllfSE9UUExVRworCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIEVYUEVSSU1FTlRBTCAmJiAhTUVNT1JZX0hPVFBMVUcgJiYgXAorCQkoWDg2IHx8IEFSTSB8fCBQUEMgfHwgUzM5MCkKKwogCXNlbGVjdCBERUJVR19GUyBpZiBTWVNGUwogCXNlbGVjdCBTVEFDS1RSQUNFIGlmIFNUQUNLVFJBQ0VfU1VQUE9SVAogCXNlbGVjdCBLQUxMU1lNUwpAQCAtMzYyLDcgKzM3MSw3IEBACiBjb25maWcgREVCVUdfS01FTUxFQUtfRUFSTFlfTE9HX1NJWkUKIAlpbnQgIk1heGltdW0ga21lbWxlYWsgZWFybHkgbG9nIGVudHJpZXMiCiAJZGVwZW5kcyBvbiBERUJVR19LTUVNTEVBSwotCXJhbmdlIDIwMCAyMDAwCisJcmFuZ2UgMjAwIDQwMDAwCiAJZGVmYXVsdCA0MDAKIAloZWxwCiAJICBLbWVtbGVhayBtdXN0IHRyYWNrIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRpb25zIHRvIGF2b2lkCkBAIC0zODMsNyArMzkyLDcgQEAKIAogY29uZmlnIERFQlVHX1BSRUVNUFQKIAlib29sICJEZWJ1ZyBwcmVlbXB0aWJsZSBrZXJuZWwiCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgUFJFRU1QVCAmJiAoVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVCB8fCBQUEM2NCkKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBQUkVFTVBUICYmIFRSQUNFX0lSUUZMQUdTX1NVUFBPUlQKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSB0aGVuIHRoZSBrZXJuZWwgd2lsbCB1c2UgYSBkZWJ1ZyB2YXJpYW50IG9mIHRoZQpkaWZmIC0tZ2l0IGEvbGliL2RlYnVnb2JqZWN0cy5jIGIvbGliL2RlYnVnb2JqZWN0cy5jCmluZGV4IDI3NTVhM2IuLmVhZTU2ZmQgMTAwNjQ0Ci0tLSBhL2xpYi9kZWJ1Z29iamVjdHMuYworKysgYi9saWIvZGVidWdvYmplY3RzLmMKQEAgLTksNiArOSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z29iamVjdHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KZGlmZiAtLWdpdCBhL2xpYi9kZWNvbXByZXNzX2luZmxhdGUuYyBiL2xpYi9kZWNvbXByZXNzX2luZmxhdGUuYwppbmRleCA2OGRmY2U1Li5mYzY4NmM3IDEwMDY0NAotLS0gYS9saWIvZGVjb21wcmVzc19pbmZsYXRlLmMKKysrIGIvbGliL2RlY29tcHJlc3NfaW5mbGF0ZS5jCkBAIC0yNyw2ICsyNywxMSBAQAogCiAjZGVmaW5lIEdaSVBfSU9CVUZfU0laRSAoMTYqMTAyNCkKIAorc3RhdGljIGludCBub2ZpbGwodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJldHVybiAtMTsKK30KKwogLyogSW5jbHVkZWQgZnJvbSBpbml0cmFtZnMgZXQgYWwgY29kZSAqLwogU1RBVElDIGludCBJTklUIGd1bnppcCh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sCiAJCSAgICAgICBpbnQoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBpbnQpLApAQCAtNzYsNiArODEsOSBAQAogCQlnb3RvIGd1bnppcF9ub21lbTQ7CiAJfQogCisJaWYgKCFmaWxsKQorCQlmaWxsID0gbm9maWxsOworCiAJaWYgKGxlbiA9PSAwKQogCQlsZW4gPSBmaWxsKHpidWYsIEdaSVBfSU9CVUZfU0laRSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWNvbXByZXNzX3VubHptYS5jIGIvbGliL2RlY29tcHJlc3NfdW5sem1hLmMKaW5kZXggMGI5NTRlMC4uY2E4MmZkZSAxMDA2NDQKLS0tIGEvbGliL2RlY29tcHJlc3NfdW5sem1hLmMKKysrIGIvbGliL2RlY29tcHJlc3NfdW5sem1hLmMKQEAgLTgyLDYgKzgyLDExIEBACiAjZGVmaW5lIFJDX01PREVMX1RPVEFMX0JJVFMgMTEKIAogCitzdGF0aWMgaW50IG5vZmlsbCh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJcmV0dXJuIC0xOworfQorCiAvKiBDYWxsZWQgdHdpY2U6IG9uY2UgYXQgc3RhcnR1cCBhbmQgb25jZSBpbiByY19ub3JtYWxpemUoKSAqLwogc3RhdGljIHZvaWQgSU5JVCByY19yZWFkKHN0cnVjdCByYyAqcmMpCiB7CkBAIC05Nyw3ICsxMDIsMTAgQEAKIAkJCQkgICAgICAgaW50ICgqZmlsbCkodm9pZCosIHVuc2lnbmVkIGludCksCiAJCQkJICAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQogewotCXJjLT5maWxsID0gZmlsbDsKKwlpZiAoZmlsbCkKKwkJcmMtPmZpbGwgPSBmaWxsOworCWVsc2UKKwkJcmMtPmZpbGwgPSBub2ZpbGw7CiAJcmMtPmJ1ZmZlciA9ICh1aW50OF90ICopYnVmZmVyOwogCXJjLT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOwogCXJjLT5idWZmZXJfZW5kID0gcmMtPmJ1ZmZlciArIHJjLT5idWZmZXJfc2l6ZTsKZGlmZiAtLWdpdCBhL2xpYi9kbWEtZGVidWcuYyBiL2xpYi9kbWEtZGVidWcuYwppbmRleCA1OGE5ZjlmLi5jZTZiN2VhIDEwMDY0NAotLS0gYS9saWIvZG1hLWRlYnVnLmMKKysrIGIvbGliL2RtYS1kZWJ1Zy5jCkBAIC04MTksOSArODE5LDExIEBACiAJCWVycl9wcmludGsocmVmLT5kZXYsIGVudHJ5LCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBmcmVlcyAiCiAJCQkgICAiRE1BIG1lbW9yeSB3aXRoIGRpZmZlcmVudCBDUFUgYWRkcmVzcyAiCiAJCQkgICAiW2RldmljZSBhZGRyZXNzPTB4JTAxNmxseF0gW3NpemU9JWxsdSBieXRlc10gIgotCQkJICAgIltjcHUgYWxsb2MgYWRkcmVzcz0lcF0gW2NwdSBmcmVlIGFkZHJlc3M9JXBdIiwKKwkJCSAgICJbY3B1IGFsbG9jIGFkZHJlc3M9MHglMDE2bGx4XSAiCisJCQkgICAiW2NwdSBmcmVlIGFkZHJlc3M9MHglMDE2bGx4XSIsCiAJCQkgICByZWYtPmRldl9hZGRyLCByZWYtPnNpemUsCi0JCQkgICAodm9pZCAqKWVudHJ5LT5wYWRkciwgKHZvaWQgKilyZWYtPnBhZGRyKTsKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpZW50cnktPnBhZGRyLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWYtPnBhZGRyKTsKIAl9CiAKIAlpZiAocmVmLT5zZ19jYWxsX2VudHMgJiYgcmVmLT50eXBlID09IGRtYV9kZWJ1Z19zZyAmJgpkaWZmIC0tZ2l0IGEvbGliL2ZhdWx0LWluamVjdC5jIGIvbGliL2ZhdWx0LWluamVjdC5jCmluZGV4IGY5N2FmNTViLi43ZTY1YWY3IDEwMDY0NAotLS0gYS9saWIvZmF1bHQtaW5qZWN0LmMKKysrIGIvbGliL2ZhdWx0LWluamVjdC5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9saWIvdnNwcmludGYuYyBiL2xpYi92c3ByaW50Zi5jCmluZGV4IDczYTE0YjguLjMzYmVkNWUgMTAwNjQ0Ci0tLSBhL2xpYi92c3ByaW50Zi5jCisrKyBiL2xpYi92c3ByaW50Zi5jCkBAIC02NzEsNyArNjcxLDcgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGNoYXIgKmlwNl9jb21wcmVzc2VkX3N0cmluZyhjaGFyICpwLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCitzdGF0aWMgY2hhciAqaXA2X2NvbXByZXNzZWRfc3RyaW5nKGNoYXIgKnAsIGNvbnN0IGNoYXIgKmFkZHIpCiB7CiAJaW50IGk7CiAJaW50IGo7CkBAIC02ODMsNyArNjgzLDEyIEBACiAJdTggaGk7CiAJdTggbG87CiAJYm9vbCBuZWVkY29sb24gPSBmYWxzZTsKLQlib29sIHVzZUlQdjQgPSBpcHY2X2FkZHJfdjRtYXBwZWQoYWRkcikgfHwgaXB2Nl9hZGRyX2lzX2lzYXRhcChhZGRyKTsKKwlib29sIHVzZUlQdjQ7CisJc3RydWN0IGluNl9hZGRyIGluNjsKKworCW1lbWNweSgmaW42LCBhZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisKKwl1c2VJUHY0ID0gaXB2Nl9hZGRyX3Y0bWFwcGVkKCZpbjYpIHx8IGlwdjZfYWRkcl9pc19pc2F0YXAoJmluNik7CiAKIAltZW1zZXQoemVyb2xlbmd0aCwgMCwgc2l6ZW9mKHplcm9sZW5ndGgpKTsKIApAQCAtNjk1LDcgKzcwMCw3IEBACiAJLyogZmluZCBwb3NpdGlvbiBvZiBsb25nZXN0IDAgcnVuICovCiAJZm9yIChpID0gMDsgaSA8IHJhbmdlOyBpKyspIHsKIAkJZm9yIChqID0gaTsgaiA8IHJhbmdlOyBqKyspIHsKLQkJCWlmIChhZGRyLT5zNl9hZGRyMTZbal0gIT0gMCkKKwkJCWlmIChpbjYuczZfYWRkcjE2W2pdICE9IDApCiAJCQkJYnJlYWs7CiAJCQl6ZXJvbGVuZ3RoW2ldKys7CiAJCX0KQEAgLTcyMiw3ICs3MjcsNyBAQAogCQkJbmVlZGNvbG9uID0gZmFsc2U7CiAJCX0KIAkJLyogaGV4IHUxNiB3aXRob3V0IGxlYWRpbmcgMHMgKi8KLQkJd29yZCA9IG50b2hzKGFkZHItPnM2X2FkZHIxNltpXSk7CisJCXdvcmQgPSBudG9ocyhpbjYuczZfYWRkcjE2W2ldKTsKIAkJaGkgPSB3b3JkID4+IDg7CiAJCWxvID0gd29yZCAmIDB4ZmY7CiAJCWlmIChoaSkgewpAQCAtNzQxLDE5ICs3NDYsMTkgQEAKIAlpZiAodXNlSVB2NCkgewogCQlpZiAobmVlZGNvbG9uKQogCQkJKnArKyA9ICc6JzsKLQkJcCA9IGlwNF9zdHJpbmcocCwgJmFkZHItPnM2X2FkZHJbMTJdLCBmYWxzZSk7CisJCXAgPSBpcDRfc3RyaW5nKHAsICZpbjYuczZfYWRkclsxMl0sIGZhbHNlKTsKIAl9CiAKIAkqcCA9ICdcMCc7CiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBjaGFyICppcDZfc3RyaW5nKGNoYXIgKnAsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkciwgY29uc3QgY2hhciAqZm10KQorc3RhdGljIGNoYXIgKmlwNl9zdHJpbmcoY2hhciAqcCwgY29uc3QgY2hhciAqYWRkciwgY29uc3QgY2hhciAqZm10KQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgYWRkci0+czZfYWRkclsyICogaV0pOwotCQlwID0gcGFja19oZXhfYnl0ZShwLCBhZGRyLT5zNl9hZGRyWzIgKiBpICsgMV0pOworCQlwID0gcGFja19oZXhfYnl0ZShwLCAqYWRkcisrKTsKKwkJcCA9IHBhY2tfaGV4X2J5dGUocCwgKmFkZHIrKyk7CiAJCWlmIChmbXRbMF0gPT0gJ0knICYmIGkgIT0gNykKIAkJCSpwKysgPSAnOic7CiAJfQpAQCAtNzY4LDkgKzc3Myw5IEBACiAJY2hhciBpcDZfYWRkcltzaXplb2YoInh4eHg6eHh4eDp4eHh4Onh4eHg6eHh4eDp4eHh4OjI1NS4yNTUuMjU1LjI1NSIpXTsKIAogCWlmIChmbXRbMF0gPT0gJ0knICYmIGZtdFsyXSA9PSAnYycpCi0JCWlwNl9jb21wcmVzc2VkX3N0cmluZyhpcDZfYWRkciwgKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqKWFkZHIpOworCQlpcDZfY29tcHJlc3NlZF9zdHJpbmcoaXA2X2FkZHIsIGFkZHIpOwogCWVsc2UKLQkJaXA2X3N0cmluZyhpcDZfYWRkciwgKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqKWFkZHIsIGZtdCk7CisJCWlwNl9zdHJpbmcoaXA2X2FkZHIsIGFkZHIsIGZtdCk7CiAKIAlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCBpcDZfYWRkciwgc3BlYyk7CiB9CkBAIC0xNzY2LDcgKzE3NzEsNyBAQAogCQkgKiBhZHZhbmNlIGJvdGggc3RyaW5ncyB0byBuZXh0IHdoaXRlIHNwYWNlCiAJCSAqLwogCQlpZiAoKmZtdCA9PSAnKicpIHsKLQkJCXdoaWxlICghaXNzcGFjZSgqZm10KSAmJiAqZm10KQorCQkJd2hpbGUgKCFpc3NwYWNlKCpmbXQpICYmICpmbXQgIT0gJyUnICYmICpmbXQpCiAJCQkJZm10Kys7CiAJCQl3aGlsZSAoIWlzc3BhY2UoKnN0cikgJiYgKnN0cikKIAkJCQlzdHIrKzsKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IDcxZWIwYjQuLmZkMzM4NjIgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtNjcsNyArNjcsNyBAQAogCiBjb25maWcgU1BBUlNFTUVNCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gU1BBUlNFTUVNX01BTlVBTAorCWRlcGVuZHMgb24gKCFTRUxFQ1RfTUVNT1JZX01PREVMICYmIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRSkgfHwgU1BBUlNFTUVNX01BTlVBTAogCiBjb25maWcgRkxBVE1FTQogCWRlZl9ib29sIHkKQEAgLTEyOSw3ICsxMjksNyBAQAogCWJvb2wgIkFsbG93IGZvciBtZW1vcnkgaG90LWFkZCIKIAlkZXBlbmRzIG9uIFNQQVJTRU1FTSB8fCBYODZfNjRfQUNQSV9OVU1BCiAJZGVwZW5kcyBvbiBIT1RQTFVHICYmICEoSElCRVJOQVRJT04gJiYgIVMzOTApICYmIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHCi0JZGVwZW5kcyBvbiAoSUE2NCB8fCBYODYgfHwgUFBDNjQgfHwgU1VQRVJIIHx8IFMzOTApCisJZGVwZW5kcyBvbiAoSUE2NCB8fCBYODYgfHwgUFBDX0JPT0szU182NCB8fCBTVVBFUkggfHwgUzM5MCkKIAogY29tbWVudCAiTWVtb3J5IGhvdHBsdWcgaXMgY3VycmVudGx5IGluY29tcGF0aWJsZSB3aXRoIFNvZnR3YXJlIFN1c3BlbmQiCiAJZGVwZW5kcyBvbiBTUEFSU0VNRU0gJiYgSE9UUExVRyAmJiBISUJFUk5BVElPTiAmJiAhUzM5MApAQCAtMjI0LDcgKzIyNCw5IEBACiAJICB0aGUgbWFueSBpbnN0YW5jZXMgYnkgYSBzaW5nbGUgcmVzaWRlbnQgcGFnZSB3aXRoIHRoYXQgY29udGVudCwgc28KIAkgIHNhdmluZyBtZW1vcnkgdW50aWwgb25lIG9yIGFub3RoZXIgYXBwIG5lZWRzIHRvIG1vZGlmeSB0aGUgY29udGVudC4KIAkgIFJlY29tbWVuZGVkIGZvciB1c2Ugd2l0aCBLVk0sIG9yIHdpdGggb3RoZXIgZHVwbGljYXRpdmUgYXBwbGljYXRpb25zLgotCSAgU2VlIERvY3VtZW50YXRpb24vdm0va3NtLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwkgIFNlZSBEb2N1bWVudGF0aW9uL3ZtL2tzbS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb246IEtTTSBpcyBpbmFjdGl2ZQorCSAgdW50aWwgYSBwcm9ncmFtIGhhcyBtYWR2aXNlZCB0aGF0IGFuIGFyZWEgaXMgTUFEVl9NRVJHRUFCTEUsIGFuZAorCSAgcm9vdCBoYXMgc2V0IC9zeXMva2VybmVsL21tL2tzbS9ydW4gdG8gMSAoaWYgQ09ORklHX1NZU0ZTIGlzIHNldCkuCiAKIGNvbmZpZyBERUZBVUxUX01NQVBfTUlOX0FERFIKICAgICAgICAgaW50ICJMb3cgYWRkcmVzcyBzcGFjZSB0byBwcm90ZWN0IGZyb20gdXNlciBhbGxvY2F0aW9uIgpAQCAtMjQ0LDYgKzI0NiwyMiBAQAogCSAgVGhpcyB2YWx1ZSBjYW4gYmUgY2hhbmdlZCBhZnRlciBib290IHVzaW5nIHRoZQogCSAgL3Byb2Mvc3lzL3ZtL21tYXBfbWluX2FkZHIgdHVuYWJsZS4KIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfTUVNT1JZX0ZBSUxVUkUKKwlib29sCisKK2NvbmZpZyBNRU1PUllfRkFJTFVSRQorCWRlcGVuZHMgb24gTU1VCisJZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFCisJYm9vbCAiRW5hYmxlIHJlY292ZXJ5IGZyb20gaGFyZHdhcmUgbWVtb3J5IGVycm9ycyIKKwloZWxwCisJICBFbmFibGVzIGNvZGUgdG8gcmVjb3ZlciBmcm9tIHNvbWUgbWVtb3J5IGZhaWx1cmVzIG9uIHN5c3RlbXMKKwkgIHdpdGggTUNBIHJlY292ZXJ5LiBUaGlzIGFsbG93cyBhIHN5c3RlbSB0byBjb250aW51ZSBydW5uaW5nCisJICBldmVuIHdoZW4gc29tZSBvZiBpdHMgbWVtb3J5IGhhcyB1bmNvcnJlY3RlZCBlcnJvcnMuIFRoaXMgcmVxdWlyZXMKKwkgIHNwZWNpYWwgaGFyZHdhcmUgc3VwcG9ydCBhbmQgdHlwaWNhbGx5IEVDQyBtZW1vcnkuCisKK2NvbmZpZyBIV1BPSVNPTl9JTkpFQ1QKKwl0cmlzdGF0ZSAiUG9pc29uIHBhZ2VzIGluamVjdG9yIgorCWRlcGVuZHMgb24gTUVNT1JZX0ZBSUxVUkUgJiYgREVCVUdfS0VSTkVMCiAKIGNvbmZpZyBOT01NVV9JTklUSUFMX1RSSU1fRVhDRVNTCiAJaW50ICJUdXJuIG9uIG1tYXAoKSBleGNlc3Mgc3BhY2UgdHJpbW1pbmcgYmVmb3JlIGJvb3RpbmciCmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IDg4MTkzZDcuLmViZjg0OTAgMTAwNjQ0Ci0tLSBhL21tL01ha2VmaWxlCisrKyBiL21tL01ha2VmaWxlCkBAIC01LDE0ICs1LDE0IEBACiBtbXUteQkJCTo9IG5vbW11Lm8KIG1tdS0kKENPTkZJR19NTVUpCTo9IGZyZW1hcC5vIGhpZ2htZW0ubyBtYWR2aXNlLm8gbWVtb3J5Lm8gbWluY29yZS5vIFwKIAkJCSAgIG1sb2NrLm8gbW1hcC5vIG1wcm90ZWN0Lm8gbXJlbWFwLm8gbXN5bmMubyBybWFwLm8gXAotCQkJICAgdm1hbGxvYy5vCisJCQkgICB2bWFsbG9jLm8gcGFnZXdhbGsubwogCiBvYmoteQkJCTo9IGJvb3RtZW0ubyBmaWxlbWFwLm8gbWVtcG9vbC5vIG9vbV9raWxsLm8gZmFkdmlzZS5vIFwKIAkJCSAgIG1hY2Nlc3MubyBwYWdlX2FsbG9jLm8gcGFnZS13cml0ZWJhY2subyBcCiAJCQkgICByZWFkYWhlYWQubyBzd2FwLm8gdHJ1bmNhdGUubyB2bXNjYW4ubyBzaG1lbS5vIFwKIAkJCSAgIHByaW9fdHJlZS5vIHV0aWwubyBtbXpvbmUubyB2bXN0YXQubyBiYWNraW5nLWRldi5vIFwKIAkJCSAgIHBhZ2VfaXNvbGF0aW9uLm8gbW1faW5pdC5vIG1tdV9jb250ZXh0Lm8gXAotCQkJICAgcGFnZXdhbGsubyAkKG1tdS15KQorCQkJICAgJChtbXUteSkKIG9iai15ICs9IGluaXQtbW0ubwogCiBvYmotJChDT05GSUdfQk9VTkNFKQkrPSBib3VuY2UubwpAQCAtNDEsNSArNDEsNyBAQAogZW5kaWYKIG9iai0kKENPTkZJR19RVUlDS0xJU1QpICs9IHF1aWNrbGlzdC5vCiBvYmotJChDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUikgKz0gbWVtY29udHJvbC5vIHBhZ2VfY2dyb3VwLm8KK29iai0kKENPTkZJR19NRU1PUllfRkFJTFVSRSkgKz0gbWVtb3J5LWZhaWx1cmUubworb2JqLSQoQ09ORklHX0hXUE9JU09OX0lOSkVDVCkgKz0gaHdwb2lzb24taW5qZWN0Lm8KIG9iai0kKENPTkZJR19ERUJVR19LTUVNTEVBSykgKz0ga21lbWxlYWsubwogb2JqLSQoQ09ORklHX0RFQlVHX0tNRU1MRUFLX1RFU1QpICs9IGttZW1sZWFrLXRlc3QubwpkaWZmIC0tZ2l0IGEvbW0vYmFja2luZy1kZXYuYyBiL21tL2JhY2tpbmctZGV2LmMKaW5kZXggM2QzYWNjYi4uMTFhZWUwOSAxMDA2NDQKLS0tIGEvbW0vYmFja2luZy1kZXYuYworKysgYi9tbS9iYWNraW5nLWRldi5jCkBAIC05Miw3ICs5Miw3IEBACiAJCSAgICJCZGlEaXJ0eVRocmVzaDogICAlOGx1IGtCXG4iCiAJCSAgICJEaXJ0eVRocmVzaDogICAgICAlOGx1IGtCXG4iCiAJCSAgICJCYWNrZ3JvdW5kVGhyZXNoOiAlOGx1IGtCXG4iCi0JCSAgICJXcml0ZUJhY2sgdGhyZWFkczolOGx1XG4iCisJCSAgICJXcml0ZWJhY2tUaHJlYWRzOiAlOGx1XG4iCiAJCSAgICJiX2RpcnR5OiAgICAgICAgICAlOGx1XG4iCiAJCSAgICJiX2lvOiAgICAgICAgICAgICAlOGx1XG4iCiAJCSAgICJiX21vcmVfaW86ICAgICAgICAlOGx1XG4iCkBAIC02MTAsOSArNjEwLDI2IEBACiAJCWt0aHJlYWRfc3RvcCh3Yi0+dGFzayk7CiB9CiAKKy8qCisgKiBUaGlzIGJkaSBpcyBnb2luZyBhd2F5IG5vdywgbWFrZSBzdXJlIHRoYXQgbm8gc3VwZXJfYmxvY2tzIHBvaW50IHRvIGl0CisgKi8KK3N0YXRpYyB2b2lkIGJkaV9wcnVuZV9zYihzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwlzcGluX2xvY2soJnNiX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZzdXBlcl9ibG9ja3MsIHNfbGlzdCkgeworCQlpZiAoc2ItPnNfYmRpID09IGJkaSkKKwkJCXNiLT5zX2JkaSA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKK30KKwogdm9pZCBiZGlfdW5yZWdpc3RlcihzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKQogewogCWlmIChiZGktPmRldikgeworCQliZGlfcHJ1bmVfc2IoYmRpKTsKKwogCQlpZiAoIWJkaV9jYXBfZmx1c2hfZm9ya2VyKGJkaSkpCiAJCQliZGlfd2Jfc2h1dGRvd24oYmRpKTsKIAkJYmRpX2RlYnVnX3VucmVnaXN0ZXIoYmRpKTsKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBiY2M3MzcyLi5lZjE2OWYzIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC01OCw3ICs1OCw3IEBACiAvKgogICogTG9jayBvcmRlcmluZzoKICAqCi0gKiAgLT5pX21tYXBfbG9jawkJKHZtdHJ1bmNhdGUpCisgKiAgLT5pX21tYXBfbG9jawkJKHRydW5jYXRlX3BhZ2VjYWNoZSkKICAqICAgIC0+cHJpdmF0ZV9sb2NrCQkoX19mcmVlX3B0ZS0+X19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKQogICogICAgICAtPnN3YXBfbG9jawkJKGV4Y2x1c2l2ZV9zd2FwX3BhZ2UsIG90aGVycykKICAqICAgICAgICAtPm1hcHBpbmctPnRyZWVfbG9jawpAQCAtMTA0LDYgKzEwNCwxMCBAQAogICoKICAqICAtPnRhc2stPnByb2NfbG9jawogICogICAgLT5kY2FjaGVfbG9jawkJKHByb2NfcGlkX2xvb2t1cCkKKyAqCisgKiAgKGNvZGUgZG9lc24ndCByZWx5IG9uIHRoYXQgb3JkZXIsIHNvIHlvdSBjb3VsZCBzd2l0Y2ggaXQgYXJvdW5kKQorICogIC0+dGFza2xpc3RfbG9jayAgICAgICAgICAgICAobWVtb3J5X2ZhaWx1cmUsIGNvbGxlY3RfcHJvY3NfYW8pCisgKiAgICAtPmlfbW1hcF9sb2NrCiAgKi8KIAogLyoKQEAgLTE2MDcsNyArMTYxMSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZpbGVtYXBfZmF1bHQpOwogCi1zdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ2VuZXJpY19maWxlX3ZtX29wcyA9IHsKK2NvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBnZW5lcmljX2ZpbGVfdm1fb3BzID0gewogCS5mYXVsdAkJPSBmaWxlbWFwX2ZhdWx0LAogfTsKIApkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcF94aXAuYyBiL21tL2ZpbGVtYXBfeGlwLmMKaW5kZXggNDI3ZGZlMy4uMTg4OGIyZCAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcF94aXAuYworKysgYi9tbS9maWxlbWFwX3hpcC5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgeGlwX2ZpbGVfdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB4aXBfZmlsZV92bV9vcHMgPSB7CiAJLmZhdWx0CT0geGlwX2ZpbGVfZmF1bHQsCiB9OwogCmRpZmYgLS1naXQgYS9tbS9odWdldGxiLmMgYi9tbS9odWdldGxiLmMKaW5kZXggODE1ZGJkNC4uNWQ3NjAxYiAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtMTUzNyw3ICsxNTM3LDcgQEAKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKIGludCBodWdldGxiX3N5c2N0bF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsCiAJCQkgICBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBoc3RhdGUgKmggPSAmZGVmYXVsdF9oc3RhdGU7CkBAIC0xNTQ4LDcgKzE1NDgsNyBAQAogCiAJdGFibGUtPmRhdGEgPSAmdG1wOwogCXRhYmxlLT5tYXhsZW4gPSBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCiAJaWYgKHdyaXRlKQogCQloLT5tYXhfaHVnZV9wYWdlcyA9IHNldF9tYXhfaHVnZV9wYWdlcyhoLCB0bXApOwpAQCAtMTU1NywxMCArMTU1NywxMCBAQAogfQogCiBpbnQgaHVnZXRsYl90cmVhdF9tb3ZhYmxlX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCXNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCWlmIChodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSkKIAkJaHRsYl9hbGxvY19tYXNrID0gR0ZQX0hJR0hVU0VSX01PVkFCTEU7CiAJZWxzZQpAQCAtMTU2OSw3ICsxNTY5LDcgQEAKIH0KIAogaW50IGh1Z2V0bGJfb3ZlcmNvbW1pdF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCXZvaWQgX191c2VyICpidWZmZXIsCiAJCQlzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBoc3RhdGUgKmggPSAmZGVmYXVsdF9oc3RhdGU7CkBAIC0xNTgwLDcgKzE1ODAsNyBAQAogCiAJdGFibGUtPmRhdGEgPSAmdG1wOwogCXRhYmxlLT5tYXhsZW4gPSBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCiAJaWYgKHdyaXRlKSB7CiAJCXNwaW5fbG9jaygmaHVnZXRsYl9sb2NrKTsKQEAgLTE3MjEsNyArMTcyMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBodWdldGxiX3ZtX29wcyA9IHsKK2NvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBodWdldGxiX3ZtX29wcyA9IHsKIAkuZmF1bHQgPSBodWdldGxiX3ZtX29wX2ZhdWx0LAogCS5vcGVuID0gaHVnZXRsYl92bV9vcF9vcGVuLAogCS5jbG9zZSA9IGh1Z2V0bGJfdm1fb3BfY2xvc2UsCmRpZmYgLS1naXQgYS9tbS9od3BvaXNvbi1pbmplY3QuYyBiL21tL2h3cG9pc29uLWluamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDg1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tbS9od3BvaXNvbi1pbmplY3QuYwpAQCAtMCwwICsxLDQxIEBACisvKiBJbmplY3QgYSBod3BvaXNvbiBtZW1vcnkgZmFpbHVyZSBvbiBhIGFyYml0YXJ5IHBmbiAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqaHdwb2lzb25fZGlyLCAqY29ycnVwdF9wZm47CisKK3N0YXRpYyBpbnQgaHdwb2lzb25faW5qZWN0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXByaW50ayhLRVJOX0lORk8gIkluamVjdGluZyBtZW1vcnkgZmFpbHVyZSBhdCBwZm4gJUx4XG4iLCB2YWwpOworCXJldHVybiBfX21lbW9yeV9mYWlsdXJlKHZhbCwgMTgsIDApOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShod3BvaXNvbl9mb3BzLCBOVUxMLCBod3BvaXNvbl9pbmplY3QsICIlbGxpXG4iKTsKKworc3RhdGljIHZvaWQgcGZuX2luamVjdF9leGl0KHZvaWQpCit7CisJaWYgKGh3cG9pc29uX2RpcikKKwkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGh3cG9pc29uX2Rpcik7Cit9CisKK3N0YXRpYyBpbnQgcGZuX2luamVjdF9pbml0KHZvaWQpCit7CisJaHdwb2lzb25fZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJod3BvaXNvbiIsIE5VTEwpOworCWlmIChod3BvaXNvbl9kaXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY29ycnVwdF9wZm4gPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjb3JydXB0LXBmbiIsIDA2MDAsIGh3cG9pc29uX2RpciwKKwkJCQkJICBOVUxMLCAmaHdwb2lzb25fZm9wcyk7CisJaWYgKGNvcnJ1cHRfcGZuID09IE5VTEwpIHsKKwkJcGZuX2luamVjdF9leGl0KCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQocGZuX2luamVjdF9pbml0KTsKK21vZHVsZV9leGl0KHBmbl9pbmplY3RfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9tbS9rbWVtbGVhay5jIGIvbW0va21lbWxlYWsuYwppbmRleCA0ZWE0NTEwLi44YmY3NjVjIDEwMDY0NAotLS0gYS9tbS9rbWVtbGVhay5jCisrKyBiL21tL2ttZW1sZWFrLmMKQEAgLTgzMywxMiArODMzLDE1IEBACiAJICovCiAJcmN1X3JlYWRfbG9jaygpOwogCW9iamVjdCA9IGNyZWF0ZV9vYmplY3QoKHVuc2lnbmVkIGxvbmcpbG9nLT5wdHIsIGxvZy0+c2l6ZSwKLQkJCSAgICAgICBsb2ctPm1pbl9jb3VudCwgR0ZQX0tFUk5FTCk7CisJCQkgICAgICAgbG9nLT5taW5fY291bnQsIEdGUF9BVE9NSUMpOworCWlmICghb2JqZWN0KQorCQlnb3RvIG91dDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IGxvZy0+dHJhY2VfbGVuOyBpKyspCiAJCW9iamVjdC0+dHJhY2VbaV0gPSBsb2ctPnRyYWNlW2ldOwogCW9iamVjdC0+dHJhY2VfbGVuID0gbG9nLT50cmFjZV9sZW47CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CitvdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKZGlmZiAtLWdpdCBhL21tL2tzbS5jIGIvbW0va3NtLmMKaW5kZXggMzdjYzM3My4uYmVmMWFmNCAxMDA2NDQKLS0tIGEvbW0va3NtLmMKKysrIGIvbW0va3NtLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L2tzbS5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CkBAIC0xNjIsMTAgKzE2MywxMCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcga3NtX3JtYXBfaXRlbXM7CiAKIC8qIExpbWl0IG9uIHRoZSBudW1iZXIgb2YgdW5zd2FwcGFibGUgcGFnZXMgdXNlZCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcga3NtX21heF9rZXJuZWxfcGFnZXMgPSAyMDAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcga3NtX21heF9rZXJuZWxfcGFnZXM7CiAKIC8qIE51bWJlciBvZiBwYWdlcyBrc21kIHNob3VsZCBzY2FuIGluIG9uZSBiYXRjaCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBrc21fdGhyZWFkX3BhZ2VzX3RvX3NjYW4gPSAyMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGtzbV90aHJlYWRfcGFnZXNfdG9fc2NhbiA9IDEwMDsKIAogLyogTWlsbGlzZWNvbmRzIGtzbWQgc2hvdWxkIHNsZWVwIGJldHdlZW4gYmF0Y2hlcyAqLwogc3RhdGljIHVuc2lnbmVkIGludCBrc21fdGhyZWFkX3NsZWVwX21pbGxpc2VjcyA9IDIwOwpAQCAtMTczLDcgKzE3NCw3IEBACiAjZGVmaW5lIEtTTV9SVU5fU1RPUAkwCiAjZGVmaW5lIEtTTV9SVU5fTUVSR0UJMQogI2RlZmluZSBLU01fUlVOX1VOTUVSR0UJMgotc3RhdGljIHVuc2lnbmVkIGludCBrc21fcnVuID0gS1NNX1JVTl9NRVJHRTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQga3NtX3J1biA9IEtTTV9SVU5fU1RPUDsKIAogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtzbV90aHJlYWRfd2FpdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKGtzbV90aHJlYWRfbXV0ZXgpOwpAQCAtMTY2Nyw2ICsxNjY4LDggQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmtzbV90aHJlYWQ7CiAJaW50IGVycjsKIAorCWtzbV9tYXhfa2VybmVsX3BhZ2VzID0gdG90YWxyYW1fcGFnZXMgLyA0OworCiAJZXJyID0ga3NtX3NsYWJfaW5pdCgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMTY4OSw2ICsxNjkyLDkgQEAKIAkJa3RocmVhZF9zdG9wKGtzbV90aHJlYWQpOwogCQlnb3RvIG91dF9mcmVlMjsKIAl9CisjZWxzZQorCWtzbV9ydW4gPSBLU01fUlVOX01FUkdFOwkvKiBubyB3YXkgZm9yIHVzZXIgdG8gc3RhcnQgaXQgKi8KKwogI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9tbS9tYWR2aXNlLmMgYi9tbS9tYWR2aXNlLmMKaW5kZXggZDlhZTIwNi4uMzViMTQ3OSAxMDA2NDQKLS0tIGEvbW0vbWFkdmlzZS5jCisrKyBiL21tL21hZHZpc2UuYwpAQCAtMjE4LDYgKzIxOCwzMiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQorLyoKKyAqIEVycm9yIGluamVjdGlvbiBzdXBwb3J0IGZvciBtZW1vcnkgZXJyb3IgaGFuZGxpbmcuCisgKi8KK3N0YXRpYyBpbnQgbWFkdmlzZV9od3BvaXNvbih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlmb3IgKDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IFBBR0VfU0laRSkgeworCQlzdHJ1Y3QgcGFnZSAqcDsKKwkJaW50IHJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCBzdGFydCwgMSwKKwkJCQkJCTAsIDAsICZwLCBOVUxMKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJcmV0dXJuIHJldDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSW5qZWN0aW5nIG1lbW9yeSBmYWlsdXJlIGZvciBwYWdlICVseCBhdCAlbHhcbiIsCisJCSAgICAgICBwYWdlX3RvX3BmbihwKSwgc3RhcnQpOworCQkvKiBJZ25vcmUgcmV0dXJuIHZhbHVlIGZvciBub3cgKi8KKwkJX19tZW1vcnlfZmFpbHVyZShwYWdlX3RvX3BmbihwKSwgMCwgMSk7CisJCXB1dF9wYWdlKHApOworCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKIHN0YXRpYyBsb25nCiBtYWR2aXNlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqcHJldiwKIAkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIGludCBiZWhhdmlvcikKQEAgLTMwOCw2ICszMzQsMTAgQEAKIAlpbnQgd3JpdGU7CiAJc2l6ZV90IGxlbjsKIAorI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQorCWlmIChiZWhhdmlvciA9PSBNQURWX0hXUE9JU09OKQorCQlyZXR1cm4gbWFkdmlzZV9od3BvaXNvbihzdGFydCwgc3RhcnQrbGVuX2luKTsKKyNlbmRpZgogCWlmICghbWFkdmlzZV9iZWhhdmlvcl92YWxpZChiZWhhdmlvcikpCiAJCXJldHVybiBlcnJvcjsKIApkaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jCmluZGV4IDliMTBkODcuLmY5OWY1OTkgMTAwNjQ0Ci0tLSBhL21tL21lbWNvbnRyb2wuYworKysgYi9tbS9tZW1jb250cm9sLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtNDMsNiArNDQsNyBAQAogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBtZW1fY2dyb3VwX3N1YnN5cyBfX3JlYWRfbW9zdGx5OwogI2RlZmluZSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUwk1CitzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW1fY2dyb3VwIF9fcmVhZF9tb3N0bHk7CiAKICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCiAvKiBUdXJuZWQgb24gb25seSB3aGVuIG1lbW9yeSBjZ3JvdXAgaXMgZW5hYmxlZCAmJiByZWFsbHlfZG9fc3dhcF9hY2NvdW50ID0gMSAqLwpAQCAtNTMsNiArNTUsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBERUZJTkVfTVVURVgobWVtY2dfdGFza2xpc3QpOwkvKiBjYW4gYmUgaG9sZCB1bmRlciBjZ3JvdXBfbXV0ZXggKi8KKyNkZWZpbmUgU09GVExJTUlUX0VWRU5UU19USFJFU0ggKDEwMDApCiAKIC8qCiAgKiBTdGF0aXN0aWNzIGZvciBtZW1vcnkgY2dyb3VwLgpAQCAtNjYsNiArNjksOCBAQAogCU1FTV9DR1JPVVBfU1RBVF9NQVBQRURfRklMRSwgIC8qICMgb2YgcGFnZXMgY2hhcmdlZCBhcyBmaWxlIHJzcyAqLwogCU1FTV9DR1JPVVBfU1RBVF9QR1BHSU5fQ09VTlQsCS8qICMgb2YgcGFnZXMgcGFnZWQgaW4gKi8KIAlNRU1fQ0dST1VQX1NUQVRfUEdQR09VVF9DT1VOVCwJLyogIyBvZiBwYWdlcyBwYWdlZCBvdXQgKi8KKwlNRU1fQ0dST1VQX1NUQVRfRVZFTlRTLAkvKiBzdW0gb2YgcGFnZWluICsgcGFnZW91dCBmb3IgaW50ZXJuYWwgdXNlICovCisJTUVNX0NHUk9VUF9TVEFUX1NXQVBPVVQsIC8qICMgb2YgcGFnZXMsIHN3YXBwZWQgb3V0ICovCiAKIAlNRU1fQ0dST1VQX1NUQVRfTlNUQVRTLAogfTsKQEAgLTc4LDYgKzgzLDIwIEBACiAJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgY3B1c3RhdFswXTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19tZW1fY2dyb3VwX3N0YXRfcmVzZXRfc2FmZShzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2NwdSAqc3RhdCwKKwkJCQllbnVtIG1lbV9jZ3JvdXBfc3RhdF9pbmRleCBpZHgpCit7CisJc3RhdC0+Y291bnRbaWR4XSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgczY0CitfX21lbV9jZ3JvdXBfc3RhdF9yZWFkX2xvY2FsKHN0cnVjdCBtZW1fY2dyb3VwX3N0YXRfY3B1ICpzdGF0LAorCQkJCWVudW0gbWVtX2Nncm91cF9zdGF0X2luZGV4IGlkeCkKK3sKKwlyZXR1cm4gc3RhdC0+Y291bnRbaWR4XTsKK30KKwogLyoKICAqIEZvciBhY2NvdW50aW5nIHVuZGVyIGlycSBkaXNhYmxlLCBubyBuZWVkIGZvciBpbmNyZW1lbnQgcHJlZW1wdCBjb3VudC4KICAqLwpAQCAtMTE3LDYgKzEzNiwxMiBAQAogCXVuc2lnbmVkIGxvbmcJCWNvdW50W05SX0xSVV9MSVNUU107CiAKIAlzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgcmVjbGFpbV9zdGF0OworCXN0cnVjdCByYl9ub2RlCQl0cmVlX25vZGU7CS8qIFJCIHRyZWUgbm9kZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZwl1c2FnZV9pbl9leGNlc3M7LyogU2V0IHRvIHRoZSB2YWx1ZSBieSB3aGljaCAqLworCQkJCQkJLyogdGhlIHNvZnQgbGltaXQgaXMgZXhjZWVkZWQqLworCWJvb2wJCQlvbl90cmVlOworCXN0cnVjdCBtZW1fY2dyb3VwCSptZW07CQkvKiBCYWNrIHBvaW50ZXIsIHdlIGNhbm5vdCAqLworCQkJCQkJLyogdXNlIGNvbnRhaW5lcl9vZgkgICAqLwogfTsKIC8qIE1hY3JvIGZvciBhY2Nlc3NpbmcgY291bnRlciAqLwogI2RlZmluZSBNRU1fQ0dST1VQX1pTVEFUKG16LCBpZHgpCSgobXopLT5jb3VudFsoaWR4KV0pCkBAIC0xMzAsNiArMTU1LDI2IEBACiB9OwogCiAvKgorICogQ2dyb3VwcyBhYm92ZSB0aGVpciBsaW1pdHMgYXJlIG1haW50YWluZWQgaW4gYSBSQi1UcmVlLCBpbmRlcGVuZGVudCBvZgorICogdGhlaXIgaGllcmFyY2h5IHJlcHJlc2VudGF0aW9uCisgKi8KKworc3RydWN0IG1lbV9jZ3JvdXBfdHJlZV9wZXJfem9uZSB7CisJc3RydWN0IHJiX3Jvb3QgcmJfcm9vdDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl9ub2RlIHsKKwlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lIHJiX3RyZWVfcGVyX3pvbmVbTUFYX05SX1pPTkVTXTsKK307CisKK3N0cnVjdCBtZW1fY2dyb3VwX3RyZWUgeworCXN0cnVjdCBtZW1fY2dyb3VwX3RyZWVfcGVyX25vZGUgKnJiX3RyZWVfcGVyX25vZGVbTUFYX05VTU5PREVTXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cF90cmVlIHNvZnRfbGltaXRfdHJlZSBfX3JlYWRfbW9zdGx5OworCisvKgogICogVGhlIG1lbW9yeSBjb250cm9sbGVyIGRhdGEgc3RydWN0dXJlLiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgY29udHJvbHMgYm90aAogICogcGFnZSBjYWNoZSBhbmQgUlNTIHBlciBjZ3JvdXAuIFdlIHdvdWxkIGV2ZW50dWFsbHkgbGlrZSB0byBwcm92aWRlCiAgKiBzdGF0aXN0aWNzIGJhc2VkIG9uIHRoZSBzdGF0aXN0aWNzIGRldmVsb3BlZCBieSBSaWsgVmFuIFJpZWwgZm9yIGNsb2NrLXBybywKQEAgLTE4Niw2ICsyMzEsMTMgQEAKIAlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0IHN0YXQ7CiB9OwogCisvKgorICogTWF4aW11bSBsb29wcyBpbiBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKCksIHVzZWQgZm9yIHNvZnQKKyAqIGxpbWl0IHJlY2xhaW0gdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcywgaWYgdGhleSBldmVyIG9jY3VyLgorICovCisjZGVmaW5lCU1FTV9DR1JPVVBfTUFYX1JFQ0xBSU1fTE9PUFMJCSgxMDApCisjZGVmaW5lCU1FTV9DR1JPVVBfTUFYX1NPRlRfTElNSVRfUkVDTEFJTV9MT09QUwkoMikKKwogZW51bSBjaGFyZ2VfdHlwZSB7CiAJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9DQUNIRSA9IDAsCiAJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQsCkBAIC0yMDAsMTMgKzI1Miw4IEBACiAjZGVmaW5lIFBDR0ZfQ0FDSEUJKDFVTCA8PCBQQ0dfQ0FDSEUpCiAjZGVmaW5lIFBDR0ZfVVNFRAkoMVVMIDw8IFBDR19VU0VEKQogI2RlZmluZSBQQ0dGX0xPQ0sJKDFVTCA8PCBQQ0dfTE9DSykKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nCi1wY2dfZGVmYXVsdF9mbGFnc1tOUl9DSEFSR0VfVFlQRV0gPSB7Ci0JUENHRl9DQUNIRSB8IFBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogRmlsZSBDYWNoZSAqLwotCVBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogQW5vbiAqLwotCVBDR0ZfQ0FDSEUgfCBQQ0dGX1VTRUQgfCBQQ0dGX0xPQ0ssIC8qIFNobWVtICovCi0JMCwgLyogRk9SQ0UgKi8KLX07CisvKiBOb3QgdXNlZCwgYnV0IGFkZGVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcyAqLworI2RlZmluZSBQQ0dGX0FDQ1QJKDFVTCA8PCBQQ0dfQUNDVCkKIAogLyogZm9yIGVuY29kaW5nIGNmdC0+cHJpdmF0ZSB2YWx1ZSBvbiBmaWxlICovCiAjZGVmaW5lIF9NRU0JCQkoMCkKQEAgLTIxNSwzNCArMjYyLDIwIEBACiAjZGVmaW5lIE1FTUZJTEVfVFlQRSh2YWwpCSgoKHZhbCkgPj4gMTYpICYgMHhmZmZmKQogI2RlZmluZSBNRU1GSUxFX0FUVFIodmFsKQkoKHZhbCkgJiAweGZmZmYpCiAKKy8qCisgKiBSZWNsYWltIGZsYWdzIGZvciBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltCisgKi8KKyNkZWZpbmUgTUVNX0NHUk9VUF9SRUNMQUlNX05PU1dBUF9CSVQJMHgwCisjZGVmaW5lIE1FTV9DR1JPVVBfUkVDTEFJTV9OT1NXQVAJKDEgPDwgTUVNX0NHUk9VUF9SRUNMQUlNX05PU1dBUF9CSVQpCisjZGVmaW5lIE1FTV9DR1JPVVBfUkVDTEFJTV9TSFJJTktfQklUCTB4MQorI2RlZmluZSBNRU1fQ0dST1VQX1JFQ0xBSU1fU0hSSU5LCSgxIDw8IE1FTV9DR1JPVVBfUkVDTEFJTV9TSFJJTktfQklUKQorI2RlZmluZSBNRU1fQ0dST1VQX1JFQ0xBSU1fU09GVF9CSVQJMHgyCisjZGVmaW5lIE1FTV9DR1JPVVBfUkVDTEFJTV9TT0ZUCQkoMSA8PCBNRU1fQ0dST1VQX1JFQ0xBSU1fU09GVF9CSVQpCisKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZ2V0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW1fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwogCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCi0JCQkJCSBzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLAotCQkJCQkgYm9vbCBjaGFyZ2UpCi17Ci0JaW50IHZhbCA9IChjaGFyZ2UpPyAxIDogLTE7Ci0Jc3RydWN0IG1lbV9jZ3JvdXBfc3RhdCAqc3RhdCA9ICZtZW0tPnN0YXQ7Ci0Jc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgKmNwdXN0YXQ7Ci0JaW50IGNwdSA9IGdldF9jcHUoKTsKLQotCWNwdXN0YXQgPSAmc3RhdC0+Y3B1c3RhdFtjcHVdOwotCWlmIChQYWdlQ2dyb3VwQ2FjaGUocGMpKQotCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShjcHVzdGF0LCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUsIHZhbCk7Ci0JZWxzZQotCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShjcHVzdGF0LCBNRU1fQ0dST1VQX1NUQVRfUlNTLCB2YWwpOwotCi0JaWYgKGNoYXJnZSkKLQkJX19tZW1fY2dyb3VwX3N0YXRfYWRkX3NhZmUoY3B1c3RhdCwKLQkJCQlNRU1fQ0dST1VQX1NUQVRfUEdQR0lOX0NPVU5ULCAxKTsKLQllbHNlCi0JCV9fbWVtX2Nncm91cF9zdGF0X2FkZF9zYWZlKGNwdXN0YXQsCi0JCQkJTUVNX0NHUk9VUF9TVEFUX1BHUEdPVVRfQ09VTlQsIDEpOwotCXB1dF9jcHUoKTsKLX0KLQogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKIG1lbV9jZ3JvdXBfem9uZWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IG5pZCwgaW50IHppZCkKIHsKQEAgLTI2Miw2ICsyOTUsMjI0IEBACiAJcmV0dXJuIG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICoKK3NvZnRfbGltaXRfdHJlZV9ub2RlX3pvbmUoaW50IG5pZCwgaW50IHppZCkKK3sKKwlyZXR1cm4gJnNvZnRfbGltaXRfdHJlZS5yYl90cmVlX3Blcl9ub2RlW25pZF0tPnJiX3RyZWVfcGVyX3pvbmVbemlkXTsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwX3RyZWVfcGVyX3pvbmUgKgorc29mdF9saW1pdF90cmVlX2Zyb21fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgbmlkID0gcGFnZV90b19uaWQocGFnZSk7CisJaW50IHppZCA9IHBhZ2Vfem9uZW51bShwYWdlKTsKKworCXJldHVybiAmc29mdF9saW1pdF90cmVlLnJiX3RyZWVfcGVyX25vZGVbbmlkXS0+cmJfdHJlZV9wZXJfem9uZVt6aWRdOworfQorCitzdGF0aWMgdm9pZAorX19tZW1fY2dyb3VwX2luc2VydF9leGNlZWRlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKKwkJCQlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICptY3R6LAorCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfdXNhZ2VfaW5fZXhjZXNzKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZtY3R6LT5yYl9yb290LnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16X25vZGU7CisKKwlpZiAobXotPm9uX3RyZWUpCisJCXJldHVybjsKKworCW16LT51c2FnZV9pbl9leGNlc3MgPSBuZXdfdXNhZ2VfaW5fZXhjZXNzOworCWlmICghbXotPnVzYWdlX2luX2V4Y2VzcykKKwkJcmV0dXJuOworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJbXpfbm9kZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUsCisJCQkJCXRyZWVfbm9kZSk7CisJCWlmIChtei0+dXNhZ2VfaW5fZXhjZXNzIDwgbXpfbm9kZS0+dXNhZ2VfaW5fZXhjZXNzKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQkvKgorCQkgKiBXZSBjYW4ndCBhdm9pZCBtZW0gY2dyb3VwcyB0aGF0IGFyZSBvdmVyIHRoZWlyIHNvZnQKKwkJICogbGltaXQgYnkgdGhlIHNhbWUgYW1vdW50CisJCSAqLworCQllbHNlIGlmIChtei0+dXNhZ2VfaW5fZXhjZXNzID49IG16X25vZGUtPnVzYWdlX2luX2V4Y2VzcykKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCXJiX2xpbmtfbm9kZSgmbXotPnRyZWVfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJm16LT50cmVlX25vZGUsICZtY3R6LT5yYl9yb290KTsKKwltei0+b25fdHJlZSA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCitfX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16LAorCQkJCXN0cnVjdCBtZW1fY2dyb3VwX3RyZWVfcGVyX3pvbmUgKm1jdHopCit7CisJaWYgKCFtei0+b25fdHJlZSkKKwkJcmV0dXJuOworCXJiX2VyYXNlKCZtei0+dHJlZV9ub2RlLCAmbWN0ei0+cmJfcm9vdCk7CisJbXotPm9uX3RyZWUgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQKK21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16LAorCQkJCXN0cnVjdCBtZW1fY2dyb3VwX3RyZWVfcGVyX3pvbmUgKm1jdHopCit7CisJc3Bpbl9sb2NrKCZtY3R6LT5sb2NrKTsKKwlfX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKG1lbSwgbXosIG1jdHopOworCXNwaW5fdW5sb2NrKCZtY3R6LT5sb2NrKTsKK30KKworc3RhdGljIGJvb2wgbWVtX2Nncm91cF9zb2Z0X2xpbWl0X2NoZWNrKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJYm9vbCByZXQgPSBmYWxzZTsKKwlpbnQgY3B1OworCXM2NCB2YWw7CisJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgKmNwdXN0YXQ7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJY3B1c3RhdCA9ICZtZW0tPnN0YXQuY3B1c3RhdFtjcHVdOworCXZhbCA9IF9fbWVtX2Nncm91cF9zdGF0X3JlYWRfbG9jYWwoY3B1c3RhdCwgTUVNX0NHUk9VUF9TVEFUX0VWRU5UUyk7CisJaWYgKHVubGlrZWx5KHZhbCA+IFNPRlRMSU1JVF9FVkVOVFNfVEhSRVNIKSkgeworCQlfX21lbV9jZ3JvdXBfc3RhdF9yZXNldF9zYWZlKGNwdXN0YXQsIE1FTV9DR1JPVVBfU1RBVF9FVkVOVFMpOworCQlyZXQgPSB0cnVlOworCX0KKwlwdXRfY3B1KCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWVtX2Nncm91cF91cGRhdGVfdHJlZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgZXhjZXNzOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKwlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICptY3R6OworCWludCBuaWQgPSBwYWdlX3RvX25pZChwYWdlKTsKKwlpbnQgemlkID0gcGFnZV96b25lbnVtKHBhZ2UpOworCW1jdHogPSBzb2Z0X2xpbWl0X3RyZWVfZnJvbV9wYWdlKHBhZ2UpOworCisJLyoKKwkgKiBOZWNlc3NhcnkgdG8gdXBkYXRlIGFsbCBhbmNlc3RvcnMgd2hlbiBoaWVyYXJjaHkgaXMgdXNlZC4KKwkgKiBiZWNhdXNlIHRoZWlyIGV2ZW50IGNvdW50ZXIgaXMgbm90IHRvdWNoZWQuCisJICovCisJZm9yICg7IG1lbTsgbWVtID0gcGFyZW50X21lbV9jZ3JvdXAobWVtKSkgeworCQlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7CisJCWV4Y2VzcyA9IHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZtZW0tPnJlcyk7CisJCS8qCisJCSAqIFdlIGhhdmUgdG8gdXBkYXRlIHRoZSB0cmVlIGlmIG16IGlzIG9uIFJCLXRyZWUgb3IKKwkJICogbWVtIGlzIG92ZXIgaXRzIHNvZnRsaW1pdC4KKwkJICovCisJCWlmIChleGNlc3MgfHwgbXotPm9uX3RyZWUpIHsKKwkJCXNwaW5fbG9jaygmbWN0ei0+bG9jayk7CisJCQkvKiBpZiBvbi10cmVlLCByZW1vdmUgaXQgKi8KKwkJCWlmIChtei0+b25fdHJlZSkKKwkJCQlfX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKG1lbSwgbXosIG1jdHopOworCQkJLyoKKwkJCSAqIEluc2VydCBhZ2Fpbi4gbXotPnVzYWdlX2luX2V4Y2VzcyB3aWxsIGJlIHVwZGF0ZWQuCisJCQkgKiBJZiBleGNlc3MgaXMgMCwgbm8gdHJlZSBvcHMuCisJCQkgKi8KKwkJCV9fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQobWVtLCBteiwgbWN0eiwgZXhjZXNzKTsKKwkJCXNwaW5fdW5sb2NrKCZtY3R6LT5sb2NrKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbWVtX2Nncm91cF9yZW1vdmVfZnJvbV90cmVlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWludCBub2RlLCB6b25lOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKwlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICptY3R6OworCisJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKSB7CisJCWZvciAoem9uZSA9IDA7IHpvbmUgPCBNQVhfTlJfWk9ORVM7IHpvbmUrKykgeworCQkJbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbm9kZSwgem9uZSk7CisJCQltY3R6ID0gc29mdF9saW1pdF90cmVlX25vZGVfem9uZShub2RlLCB6b25lKTsKKwkJCW1lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKG1lbSwgbXosIG1jdHopOworCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9nZXRfZXhjZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJcmV0dXJuIHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZtZW0tPnJlcykgPj4gUEFHRV9TSElGVDsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKK19fbWVtX2Nncm91cF9sYXJnZXN0X3NvZnRfbGltaXRfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICptY3R6KQoreworCXN0cnVjdCByYl9ub2RlICpyaWdodG1vc3QgPSBOVUxMOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKworcmV0cnk6CisJbXogPSBOVUxMOworCXJpZ2h0bW9zdCA9IHJiX2xhc3QoJm1jdHotPnJiX3Jvb3QpOworCWlmICghcmlnaHRtb3N0KQorCQlnb3RvIGRvbmU7CQkvKiBOb3RoaW5nIHRvIHJlY2xhaW0gZnJvbSAqLworCisJbXogPSByYl9lbnRyeShyaWdodG1vc3QsIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lLCB0cmVlX25vZGUpOworCS8qCisJICogUmVtb3ZlIHRoZSBub2RlIG5vdyBidXQgc29tZW9uZSBlbHNlIGNhbiBhZGQgaXQgYmFjaywKKwkgKiB3ZSB3aWxsIHRvIGFkZCBpdCBiYWNrIGF0IHRoZSBlbmQgb2YgcmVjbGFpbSB0byBpdHMgY29ycmVjdAorCSAqIHBvc2l0aW9uIGluIHRoZSB0cmVlLgorCSAqLworCV9fbWVtX2Nncm91cF9yZW1vdmVfZXhjZWVkZWQobXotPm1lbSwgbXosIG1jdHopOworCWlmICghcmVzX2NvdW50ZXJfc29mdF9saW1pdF9leGNlc3MoJm16LT5tZW0tPnJlcykgfHwKKwkJIWNzc190cnlnZXQoJm16LT5tZW0tPmNzcykpCisJCWdvdG8gcmV0cnk7Citkb25lOgorCXJldHVybiBtejsKK30KKworc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKK21lbV9jZ3JvdXBfbGFyZ2VzdF9zb2Z0X2xpbWl0X25vZGUoc3RydWN0IG1lbV9jZ3JvdXBfdHJlZV9wZXJfem9uZSAqbWN0eikKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisKKwlzcGluX2xvY2soJm1jdHotPmxvY2spOworCW16ID0gX19tZW1fY2dyb3VwX2xhcmdlc3Rfc29mdF9saW1pdF9ub2RlKG1jdHopOworCXNwaW5fdW5sb2NrKCZtY3R6LT5sb2NrKTsKKwlyZXR1cm4gbXo7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfc3dhcF9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJCSBib29sIGNoYXJnZSkKK3sKKwlpbnQgdmFsID0gKGNoYXJnZSkgPyAxIDogLTE7CisJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdCAqc3RhdCA9ICZtZW0tPnN0YXQ7CisJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgKmNwdXN0YXQ7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKworCWNwdXN0YXQgPSAmc3RhdC0+Y3B1c3RhdFtjcHVdOworCV9fbWVtX2Nncm91cF9zdGF0X2FkZF9zYWZlKGNwdXN0YXQsIE1FTV9DR1JPVVBfU1RBVF9TV0FQT1VULCB2YWwpOworCXB1dF9jcHUoKTsKK30KKworc3RhdGljIHZvaWQgbWVtX2Nncm91cF9jaGFyZ2Vfc3RhdGlzdGljcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCQkgc3RydWN0IHBhZ2VfY2dyb3VwICpwYywKKwkJCQkJIGJvb2wgY2hhcmdlKQoreworCWludCB2YWwgPSAoY2hhcmdlKSA/IDEgOiAtMTsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0ICpzdGF0ID0gJm1lbS0+c3RhdDsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2NwdSAqY3B1c3RhdDsKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCisJY3B1c3RhdCA9ICZzdGF0LT5jcHVzdGF0W2NwdV07CisJaWYgKFBhZ2VDZ3JvdXBDYWNoZShwYykpCisJCV9fbWVtX2Nncm91cF9zdGF0X2FkZF9zYWZlKGNwdXN0YXQsIE1FTV9DR1JPVVBfU1RBVF9DQUNIRSwgdmFsKTsKKwllbHNlCisJCV9fbWVtX2Nncm91cF9zdGF0X2FkZF9zYWZlKGNwdXN0YXQsIE1FTV9DR1JPVVBfU1RBVF9SU1MsIHZhbCk7CisKKwlpZiAoY2hhcmdlKQorCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShjcHVzdGF0LAorCQkJCU1FTV9DR1JPVVBfU1RBVF9QR1BHSU5fQ09VTlQsIDEpOworCWVsc2UKKwkJX19tZW1fY2dyb3VwX3N0YXRfYWRkX3NhZmUoY3B1c3RhdCwKKwkJCQlNRU1fQ0dST1VQX1NUQVRfUEdQR09VVF9DT1VOVCwgMSk7CisJX19tZW1fY2dyb3VwX3N0YXRfYWRkX3NhZmUoY3B1c3RhdCwgTUVNX0NHUk9VUF9TVEFUX0VWRU5UUywgMSk7CisJcHV0X2NwdSgpOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX2dldF9sb2NhbF96b25lc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAogCQkJCQllbnVtIGxydV9saXN0IGlkeCkKIHsKQEAgLTM1NCw2ICs2MDUsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF9pc19yb290KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJcmV0dXJuIChtZW0gPT0gcm9vdF9tZW1fY2dyb3VwKTsKK30KKwogLyoKICAqIEZvbGxvd2luZyBMUlUgZnVuY3Rpb25zIGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQgd2l0aG91dCBQQ0dfTE9DSy4KICAqIE9wZXJhdGlvbnMgYXJlIGNhbGxlZCBieSByb3V0aW5lIG9mIGdsb2JhbCBMUlUgaW5kZXBlbmRlbnRseSBmcm9tIG1lbWNnLgpAQCAtMzcxLDIyICs2MjcsMjQgQEAKIHZvaWQgbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgbHJ1KQogewogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CiAKIAlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm47CiAJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJLyogY2FuIGhhcHBlbiB3aGlsZSB3ZSBoYW5kbGUgc3dhcGNhY2hlLiAqLwotCWlmIChsaXN0X2VtcHR5KCZwYy0+bHJ1KSB8fCAhcGMtPm1lbV9jZ3JvdXApCisJaWYgKCFUZXN0Q2xlYXJQYWdlQ2dyb3VwQWNjdExSVShwYykpCiAJCXJldHVybjsKKwlWTV9CVUdfT04oIXBjLT5tZW1fY2dyb3VwKTsKIAkvKgogCSAqIFdlIGRvbid0IGNoZWNrIFBDR19VU0VEIGJpdC4gSXQncyBjbGVhcmVkIHdoZW4gdGhlICJwYWdlIiBpcyBmaW5hbGx5CiAJICogcmVtb3ZlZCBmcm9tIGdsb2JhbCBMUlUuCiAJICovCiAJbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7Ci0JbWVtID0gcGMtPm1lbV9jZ3JvdXA7CiAJTUVNX0NHUk9VUF9aU1RBVChteiwgbHJ1KSAtPSAxOworCWlmIChtZW1fY2dyb3VwX2lzX3Jvb3QocGMtPm1lbV9jZ3JvdXApKQorCQlyZXR1cm47CisJVk1fQlVHX09OKGxpc3RfZW1wdHkoJnBjLT5scnUpKTsKIAlsaXN0X2RlbF9pbml0KCZwYy0+bHJ1KTsKIAlyZXR1cm47CiB9CkBAIC00MTAsOCArNjY4LDggQEAKIAkgKiBGb3IgbWFraW5nIHBjLT5tZW1fY2dyb3VwIHZpc2libGUsIGluc2VydCBzbXBfcm1iKCkgaGVyZS4KIAkgKi8KIAlzbXBfcm1iKCk7Ci0JLyogdW51c2VkIHBhZ2UgaXMgbm90IHJvdGF0ZWQuICovCi0JaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJLyogdW51c2VkIG9yIHJvb3QgcGFnZSBpcyBub3Qgcm90YXRlZC4gKi8KKwlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSB8fCBtZW1fY2dyb3VwX2lzX3Jvb3QocGMtPm1lbV9jZ3JvdXApKQogCQlyZXR1cm47CiAJbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7CiAJbGlzdF9tb3ZlKCZwYy0+bHJ1LCAmbXotPmxpc3RzW2xydV0pOwpAQCAtNDI1LDYgKzY4Myw3IEBACiAJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwogCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOworCVZNX0JVR19PTihQYWdlQ2dyb3VwQWNjdExSVShwYykpOwogCS8qCiAJICogVXNlZCBiaXQgaXMgc2V0IHdpdGhvdXQgYXRvbWljIG9wcyBidXQgYWZ0ZXIgc21wX3dtYigpLgogCSAqIEZvciBtYWtpbmcgcGMtPm1lbV9jZ3JvdXAgdmlzaWJsZSwgaW5zZXJ0IHNtcF9ybWIoKSBoZXJlLgpAQCAtNDM1LDYgKzY5NCw5IEBACiAKIAlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKIAlNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpICs9IDE7CisJU2V0UGFnZUNncm91cEFjY3RMUlUocGMpOworCWlmIChtZW1fY2dyb3VwX2lzX3Jvb3QocGMtPm1lbV9jZ3JvdXApKQorCQlyZXR1cm47CiAJbGlzdF9hZGQoJnBjLT5scnUsICZtei0+bGlzdHNbbHJ1XSk7CiB9CiAKQEAgLTQ2OSw3ICs3MzEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7CiAJLyogbGluayB3aGVuIHRoZSBwYWdlIGlzIGxpbmtlZCB0byBMUlUgYnV0IHBhZ2VfY2dyb3VwIGlzbid0ICovCi0JaWYgKFBhZ2VMUlUocGFnZSkgJiYgbGlzdF9lbXB0eSgmcGMtPmxydSkpCisJaWYgKFBhZ2VMUlUocGFnZSkgJiYgIVBhZ2VDZ3JvdXBBY2N0TFJVKHBjKSkKIAkJbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3QocGFnZSwgcGFnZV9scnUocGFnZSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7CiB9CkBAIC04NTUsMjggKzExMTcsNjIgQEAKICAqIElmIHNocmluaz09dHJ1ZSwgZm9yIGF2b2lkaW5nIHRvIGZyZWUgdG9vIG11Y2gsIHRoaXMgcmV0dXJucyBpbW1lZGllYXRlbHkuCiAgKi8KIHN0YXRpYyBpbnQgbWVtX2Nncm91cF9oaWVyYXJjaGljYWxfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0sCi0JCQkJICAgZ2ZwX3QgZ2ZwX21hc2ssIGJvb2wgbm9zd2FwLCBib29sIHNocmluaykKKwkJCQkJCXN0cnVjdCB6b25lICp6b25lLAorCQkJCQkJZ2ZwX3QgZ2ZwX21hc2ssCisJCQkJCQl1bnNpZ25lZCBsb25nIHJlY2xhaW1fb3B0aW9ucykKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqdmljdGltOwogCWludCByZXQsIHRvdGFsID0gMDsKIAlpbnQgbG9vcCA9IDA7CisJYm9vbCBub3N3YXAgPSByZWNsYWltX29wdGlvbnMgJiBNRU1fQ0dST1VQX1JFQ0xBSU1fTk9TV0FQOworCWJvb2wgc2hyaW5rID0gcmVjbGFpbV9vcHRpb25zICYgTUVNX0NHUk9VUF9SRUNMQUlNX1NIUklOSzsKKwlib29sIGNoZWNrX3NvZnQgPSByZWNsYWltX29wdGlvbnMgJiBNRU1fQ0dST1VQX1JFQ0xBSU1fU09GVDsKKwl1bnNpZ25lZCBsb25nIGV4Y2VzcyA9IG1lbV9jZ3JvdXBfZ2V0X2V4Y2Vzcyhyb290X21lbSk7CiAKIAkvKiBJZiBtZW1zd19pc19taW5pbXVtPT0xLCBzd2FwLW91dCBpcyBvZi1uby11c2UuICovCiAJaWYgKHJvb3RfbWVtLT5tZW1zd19pc19taW5pbXVtKQogCQlub3N3YXAgPSB0cnVlOwogCi0Jd2hpbGUgKGxvb3AgPCAyKSB7CisJd2hpbGUgKDEpIHsKIAkJdmljdGltID0gbWVtX2Nncm91cF9zZWxlY3RfdmljdGltKHJvb3RfbWVtKTsKLQkJaWYgKHZpY3RpbSA9PSByb290X21lbSkKKwkJaWYgKHZpY3RpbSA9PSByb290X21lbSkgewogCQkJbG9vcCsrOworCQkJaWYgKGxvb3AgPj0gMikgeworCQkJCS8qCisJCQkJICogSWYgd2UgaGF2ZSBub3QgYmVlbiBhYmxlIHRvIHJlY2xhaW0KKwkJCQkgKiBhbnl0aGluZywgaXQgbWlnaHQgYmVjYXVzZSB0aGVyZSBhcmUKKwkJCQkgKiBubyByZWNsYWltYWJsZSBwYWdlcyB1bmRlciB0aGlzIGhpZXJhcmNoeQorCQkJCSAqLworCQkJCWlmICghY2hlY2tfc29mdCB8fCAhdG90YWwpIHsKKwkJCQkJY3NzX3B1dCgmdmljdGltLT5jc3MpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBXZSB3YW50IHRvIGRvIG1vcmUgdGFyZ2V0dGVkIHJlY2xhaW0uCisJCQkJICogZXhjZXNzID4+IDIgaXMgbm90IHRvIGV4Y2Vzc2l2ZSBzbyBhcyB0bworCQkJCSAqIHJlY2xhaW0gdG9vIG11Y2gsIG5vciB0b28gbGVzcyB0aGF0IHdlIGtlZXAKKwkJCQkgKiBjb21pbmcgYmFjayB0byByZWNsYWltIGZyb20gdGhpcyBjZ3JvdXAKKwkJCQkgKi8KKwkJCQlpZiAodG90YWwgPj0gKGV4Y2VzcyA+PiAyKSB8fAorCQkJCQkobG9vcCA+IE1FTV9DR1JPVVBfTUFYX1JFQ0xBSU1fTE9PUFMpKSB7CisJCQkJCWNzc19wdXQoJnZpY3RpbS0+Y3NzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CiAJCWlmICghbWVtX2Nncm91cF9sb2NhbF91c2FnZSgmdmljdGltLT5zdGF0KSkgewogCQkJLyogdGhpcyBjZ3JvdXAncyBsb2NhbCB1c2FnZSA9PSAwICovCiAJCQljc3NfcHV0KCZ2aWN0aW0tPmNzcyk7CiAJCQljb250aW51ZTsKIAkJfQogCQkvKiB3ZSB1c2Ugc3dhcHBpbmVzcyBvZiBsb2NhbCBjZ3JvdXAgKi8KLQkJcmV0ID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyh2aWN0aW0sIGdmcF9tYXNrLCBub3N3YXAsCi0JCQkJCQkgICBnZXRfc3dhcHBpbmVzcyh2aWN0aW0pKTsKKwkJaWYgKGNoZWNrX3NvZnQpCisJCQlyZXQgPSBtZW1fY2dyb3VwX3Nocmlua19ub2RlX3pvbmUodmljdGltLCBnZnBfbWFzaywKKwkJCQlub3N3YXAsIGdldF9zd2FwcGluZXNzKHZpY3RpbSksIHpvbmUsCisJCQkJem9uZS0+em9uZV9wZ2RhdC0+bm9kZV9pZCk7CisJCWVsc2UKKwkJCXJldCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXModmljdGltLCBnZnBfbWFzaywKKwkJCQkJCW5vc3dhcCwgZ2V0X3N3YXBwaW5lc3ModmljdGltKSk7CiAJCWNzc19wdXQoJnZpY3RpbS0+Y3NzKTsKIAkJLyoKIAkJICogQXQgc2hyaW5raW5nIHVzYWdlLCB3ZSBjYW4ndCBjaGVjayB3ZSBzaG91bGQgc3RvcCBoZXJlIG9yCkBAIC04ODYsNyArMTE4MiwxMCBAQAogCQlpZiAoc2hyaW5rKQogCQkJcmV0dXJuIHJldDsKIAkJdG90YWwgKz0gcmV0OwotCQlpZiAobWVtX2Nncm91cF9jaGVja191bmRlcl9saW1pdChyb290X21lbSkpCisJCWlmIChjaGVja19zb2Z0KSB7CisJCQlpZiAocmVzX2NvdW50ZXJfY2hlY2tfdW5kZXJfc29mdF9saW1pdCgmcm9vdF9tZW0tPnJlcykpCisJCQkJcmV0dXJuIHRvdGFsOworCQl9IGVsc2UgaWYgKG1lbV9jZ3JvdXBfY2hlY2tfdW5kZXJfbGltaXQocm9vdF9tZW0pKQogCQkJcmV0dXJuIDEgKyB0b3RhbDsKIAl9CiAJcmV0dXJuIHRvdGFsOwpAQCAtOTY1LDcgKzEyNjQsNyBAQAogICovCiBzdGF0aWMgaW50IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBtZW1fY2dyb3VwICoqbWVtY2csCi0JCQlib29sIG9vbSkKKwkJCWJvb2wgb29tLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCAqbWVtX292ZXJfbGltaXQ7CiAJaW50IG5yX3JldHJpZXMgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKQEAgLTk5Niw5ICsxMjk1LDExIEBACiAJVk1fQlVHX09OKGNzc19pc19yZW1vdmVkKCZtZW0tPmNzcykpOwogCiAJd2hpbGUgKDEpIHsKLQkJaW50IHJldDsKLQkJYm9vbCBub3N3YXAgPSBmYWxzZTsKKwkJaW50IHJldCA9IDA7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCisJCWlmIChtZW1fY2dyb3VwX2lzX3Jvb3QobWVtKSkKKwkJCWdvdG8gZG9uZTsKIAkJcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFLCAmZmFpbF9yZXMpOwogCQlpZiAobGlrZWx5KCFyZXQpKSB7CiAJCQlpZiAoIWRvX3N3YXBfYWNjb3VudCkKQEAgLTEwMDksNyArMTMxMCw3IEBACiAJCQkJYnJlYWs7CiAJCQkvKiBtZW0rc3dhcCBjb3VudGVyIGZhaWxzICovCiAJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSk7Ci0JCQlub3N3YXAgPSB0cnVlOworCQkJZmxhZ3MgfD0gTUVNX0NHUk9VUF9SRUNMQUlNX05PU1dBUDsKIAkJCW1lbV9vdmVyX2xpbWl0ID0gbWVtX2Nncm91cF9mcm9tX3Jlc19jb3VudGVyKGZhaWxfcmVzLAogCQkJCQkJCQkJbWVtc3cpOwogCQl9IGVsc2UKQEAgLTEwMjAsOCArMTMyMSw4IEBACiAJCWlmICghKGdmcF9tYXNrICYgX19HRlBfV0FJVCkpCiAJCQlnb3RvIG5vbWVtOwogCi0JCXJldCA9IG1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0obWVtX292ZXJfbGltaXQsIGdmcF9tYXNrLAotCQkJCQkJCW5vc3dhcCwgZmFsc2UpOworCQlyZXQgPSBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKG1lbV9vdmVyX2xpbWl0LCBOVUxMLAorCQkJCQkJZ2ZwX21hc2ssIGZsYWdzKTsKIAkJaWYgKHJldCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xMDQ2LDEzICsxMzQ3LDE5IEBACiAJCQlnb3RvIG5vbWVtOwogCQl9CiAJfQorCS8qCisJICogSW5zZXJ0IGFuY2VzdG9yIChhbmQgYW5jZXN0b3IncyBhbmNlc3RvcnMpLCB0byBzb2Z0bGltaXQgUkItdHJlZS4KKwkgKiBpZiB0aGV5IGV4Y2VlZHMgc29mdGxpbWl0LgorCSAqLworCWlmIChtZW1fY2dyb3VwX3NvZnRfbGltaXRfY2hlY2sobWVtKSkKKwkJbWVtX2Nncm91cF91cGRhdGVfdHJlZShtZW0sIHBhZ2UpOworZG9uZToKIAlyZXR1cm4gMDsKIG5vbWVtOgogCWNzc19wdXQoJm1lbS0+Y3NzKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotCiAvKgogICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1lbV9jZ3JvdXAgZnJvbSBJRC4gbXVzdCBiZSBjYWxsZWQgdW5kZXIKICAqIHJjdV9yZWFkX2xvY2soKS4gVGhlIGNhbGxlciBtdXN0IGNoZWNrIGNzc19pc19yZW1vdmVkKCkgb3Igc29tZSBpZgpAQCAtMTExOSwxNSArMTQyNiwzNyBAQAogCWxvY2tfcGFnZV9jZ3JvdXAocGMpOwogCWlmICh1bmxpa2VseShQYWdlQ2dyb3VwVXNlZChwYykpKSB7CiAJCXVubG9ja19wYWdlX2Nncm91cChwYyk7Ci0JCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKLQkJaWYgKGRvX3N3YXBfYWNjb3VudCkKLQkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUpOworCQlpZiAoIW1lbV9jZ3JvdXBfaXNfcm9vdChtZW0pKSB7CisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSk7CisJCQlpZiAoZG9fc3dhcF9hY2NvdW50KQorCQkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUpOworCQl9CiAJCWNzc19wdXQoJm1lbS0+Y3NzKTsKIAkJcmV0dXJuOwogCX0KKwogCXBjLT5tZW1fY2dyb3VwID0gbWVtOworCS8qCisJICogV2UgYWNjZXNzIGEgcGFnZV9jZ3JvdXAgYXN5bmNocm9ub3VzbHkgd2l0aG91dCBsb2NrX3BhZ2VfY2dyb3VwKCkuCisJICogRXNwZWNpYWxseSB3aGVuIGEgcGFnZV9jZ3JvdXAgaXMgdGFrZW4gZnJvbSBhIHBhZ2UsIHBjLT5tZW1fY2dyb3VwCisJICogaXMgYWNjZXNzZWQgYWZ0ZXIgdGVzdGluZyBVU0VEIGJpdC4gVG8gbWFrZSBwYy0+bWVtX2Nncm91cCB2aXNpYmxlCisJICogYmVmb3JlIFVTRUQgYml0LCB3ZSBuZWVkIG1lbW9yeSBiYXJyaWVyIGhlcmUuCisJICogU2VlIG1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KCksIGV0Yy4KKyAJICovCiAJc21wX3dtYigpOwotCXBjLT5mbGFncyA9IHBjZ19kZWZhdWx0X2ZsYWdzW2N0eXBlXTsKKwlzd2l0Y2ggKGN0eXBlKSB7CisJY2FzZSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0NBQ0hFOgorCWNhc2UgTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTToKKwkJU2V0UGFnZUNncm91cENhY2hlKHBjKTsKKwkJU2V0UGFnZUNncm91cFVzZWQocGMpOworCQlicmVhazsKKwljYXNlIE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEOgorCQlDbGVhclBhZ2VDZ3JvdXBDYWNoZShwYyk7CisJCVNldFBhZ2VDZ3JvdXBVc2VkKHBjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCiAJbWVtX2Nncm91cF9jaGFyZ2Vfc3RhdGlzdGljcyhtZW0sIHBjLCB0cnVlKTsKIApAQCAtMTE3OCw3ICsxNTA3LDggQEAKIAlpZiAocGMtPm1lbV9jZ3JvdXAgIT0gZnJvbSkKIAkJZ290byBvdXQ7CiAKLQlyZXNfY291bnRlcl91bmNoYXJnZSgmZnJvbS0+cmVzLCBQQUdFX1NJWkUpOworCWlmICghbWVtX2Nncm91cF9pc19yb290KGZyb20pKQorCQlyZXNfY291bnRlcl91bmNoYXJnZSgmZnJvbS0+cmVzLCBQQUdFX1NJWkUpOwogCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MoZnJvbSwgcGMsIGZhbHNlKTsKIAogCXBhZ2UgPSBwYy0+cGFnZTsKQEAgLTExOTcsNyArMTUyNyw3IEBACiAJCQkJCQkxKTsKIAl9CiAKLQlpZiAoZG9fc3dhcF9hY2NvdW50KQorCWlmIChkb19zd2FwX2FjY291bnQgJiYgIW1lbV9jZ3JvdXBfaXNfcm9vdChmcm9tKSkKIAkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJmZyb20tPm1lbXN3LCBQQUdFX1NJWkUpOwogCWNzc19wdXQoJmZyb20tPmNzcyk7CiAKQEAgLTEyMzgsNyArMTU2OCw3IEBACiAJcGFyZW50ID0gbWVtX2Nncm91cF9mcm9tX2NvbnQocGNnKTsKIAogCi0JcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgZ2ZwX21hc2ssICZwYXJlbnQsIGZhbHNlKTsKKwlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBnZnBfbWFzaywgJnBhcmVudCwgZmFsc2UsIHBhZ2UpOwogCWlmIChyZXQgfHwgIXBhcmVudCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTI2OCw5ICsxNTk4LDExIEBACiAJLyogZHJvcCBleHRyYSByZWZjbnQgYnkgdHJ5X2NoYXJnZSgpICovCiAJY3NzX3B1dCgmcGFyZW50LT5jc3MpOwogCS8qIHVuY2hhcmdlIGlmIG1vdmUgZmFpbHMgKi8KLQlyZXNfY291bnRlcl91bmNoYXJnZSgmcGFyZW50LT5yZXMsIFBBR0VfU0laRSk7Ci0JaWYgKGRvX3N3YXBfYWNjb3VudCkKLQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJnBhcmVudC0+bWVtc3csIFBBR0VfU0laRSk7CisJaWYgKCFtZW1fY2dyb3VwX2lzX3Jvb3QocGFyZW50KSkgeworCQlyZXNfY291bnRlcl91bmNoYXJnZSgmcGFyZW50LT5yZXMsIFBBR0VfU0laRSk7CisJCWlmIChkb19zd2FwX2FjY291bnQpCisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmcGFyZW50LT5tZW1zdywgUEFHRV9TSVpFKTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTI5NSw3ICsxNjI3LDcgQEAKIAlwcmVmZXRjaHcocGMpOwogCiAJbWVtID0gbWVtY2c7Ci0JcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UobW0sIGdmcF9tYXNrLCAmbWVtLCB0cnVlKTsKKwlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShtbSwgZ2ZwX21hc2ssICZtZW0sIHRydWUsIHBhZ2UpOwogCWlmIChyZXQgfHwgIW1lbSkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTQxNCwxNCArMTc0NiwxNCBAQAogCWlmICghbWVtKQogCQlnb3RvIGNoYXJnZV9jdXJfbW07CiAJKnB0ciA9IG1lbTsKLQlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBtYXNrLCBwdHIsIHRydWUpOworCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsIG1hc2ssIHB0ciwgdHJ1ZSwgcGFnZSk7CiAJLyogZHJvcCBleHRyYSByZWZjbnQgZnJvbSB0cnlnZXQgKi8KIAljc3NfcHV0KCZtZW0tPmNzcyk7CiAJcmV0dXJuIHJldDsKIGNoYXJnZV9jdXJfbW06CiAJaWYgKHVubGlrZWx5KCFtbSkpCiAJCW1tID0gJmluaXRfbW07Ci0JcmV0dXJuIF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBtYXNrLCBwdHIsIHRydWUpOworCXJldHVybiBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShtbSwgbWFzaywgcHRyLCB0cnVlLCBwYWdlKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE0NTksNyArMTc5MSw5IEBACiAJCQkgKiBUaGlzIHJlY29yZGVkIG1lbWNnIGNhbiBiZSBvYnNvbGV0ZSBvbmUuIFNvLCBhdm9pZAogCQkJICogY2FsbGluZyBjc3NfdHJ5Z2V0CiAJCQkgKi8KLQkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW1jZy0+bWVtc3csIFBBR0VfU0laRSk7CisJCQlpZiAoIW1lbV9jZ3JvdXBfaXNfcm9vdChtZW1jZykpCisJCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbWNnLT5tZW1zdywgUEFHRV9TSVpFKTsKKwkJCW1lbV9jZ3JvdXBfc3dhcF9zdGF0aXN0aWNzKG1lbWNnLCBmYWxzZSk7CiAJCQltZW1fY2dyb3VwX3B1dChtZW1jZyk7CiAJCX0KIAkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNDg0LDkgKzE4MTgsMTEgQEAKIAkJcmV0dXJuOwogCWlmICghbWVtKQogCQlyZXR1cm47Ci0JcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpOwotCWlmIChkb19zd2FwX2FjY291bnQpCi0JCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUpOworCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbSkpIHsKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpOworCQlpZiAoZG9fc3dhcF9hY2NvdW50KQorCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+bWVtc3csIFBBR0VfU0laRSk7CisJfQogCWNzc19wdXQoJm1lbS0+Y3NzKTsKIH0KIApAQCAtMTUzOCw5ICsxODc0LDE0IEBACiAJCWJyZWFrOwogCX0KIAotCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKLQlpZiAoZG9fc3dhcF9hY2NvdW50ICYmIChjdHlwZSAhPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NXQVBPVVQpKQotCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5tZW1zdywgUEFHRV9TSVpFKTsKKwlpZiAoIW1lbV9jZ3JvdXBfaXNfcm9vdChtZW0pKSB7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKKwkJaWYgKGRvX3N3YXBfYWNjb3VudCAmJgorCQkJCShjdHlwZSAhPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NXQVBPVVQpKQorCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+bWVtc3csIFBBR0VfU0laRSk7CisJfQorCWlmIChjdHlwZSA9PSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NXQVBPVVQpCisJCW1lbV9jZ3JvdXBfc3dhcF9zdGF0aXN0aWNzKG1lbSwgdHJ1ZSk7CiAJbWVtX2Nncm91cF9jaGFyZ2Vfc3RhdGlzdGljcyhtZW0sIHBjLCBmYWxzZSk7CiAKIAlDbGVhclBhZ2VDZ3JvdXBVc2VkKHBjKTsKQEAgLTE1NTQsNiArMTg5NSw4IEBACiAJbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7CiAJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKIAorCWlmIChtZW1fY2dyb3VwX3NvZnRfbGltaXRfY2hlY2sobWVtKSkKKwkJbWVtX2Nncm91cF91cGRhdGVfdHJlZShtZW0sIHBhZ2UpOwogCS8qIGF0IHN3YXBvdXQsIHRoaXMgbWVtY2cgd2lsbCBiZSBhY2Nlc3NlZCB0byByZWNvcmQgdG8gc3dhcCAqLwogCWlmIChjdHlwZSAhPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NXQVBPVVQpCiAJCWNzc19wdXQoJm1lbS0+Y3NzKTsKQEAgLTE2MjksNyArMTk3Miw5IEBACiAJCSAqIFdlIHVuY2hhcmdlIHRoaXMgYmVjYXVzZSBzd2FwIGlzIGZyZWVkLgogCQkgKiBUaGlzIG1lbWNnIGNhbiBiZSBvYnNvbGV0ZSBvbmUuIFdlIGF2b2lkIGNhbGxpbmcgY3NzX3RyeWdldAogCQkgKi8KLQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbWNnLT5tZW1zdywgUEFHRV9TSVpFKTsKKwkJaWYgKCFtZW1fY2dyb3VwX2lzX3Jvb3QobWVtY2cpKQorCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbWNnLT5tZW1zdywgUEFHRV9TSVpFKTsKKwkJbWVtX2Nncm91cF9zd2FwX3N0YXRpc3RpY3MobWVtY2csIGZhbHNlKTsKIAkJbWVtX2Nncm91cF9wdXQobWVtY2cpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTE2NTgsNyArMjAwMyw4IEBACiAJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKIAogCWlmIChtZW0pIHsKLQkJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgR0ZQX0tFUk5FTCwgJm1lbSwgZmFsc2UpOworCQlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBHRlBfS0VSTkVMLCAmbWVtLCBmYWxzZSwKKwkJCQkJCXBhZ2UpOwogCQljc3NfcHV0KCZtZW0tPmNzcyk7CiAJfQogCSpwdHIgPSBtZW07CkBAIC0xNzk4LDggKzIxNDQsOSBAQAogCQlpZiAoIXJldCkKIAkJCWJyZWFrOwogCi0JCXByb2dyZXNzID0gbWVtX2Nncm91cF9oaWVyYXJjaGljYWxfcmVjbGFpbShtZW1jZywgR0ZQX0tFUk5FTCwKLQkJCQkJCSAgIGZhbHNlLCB0cnVlKTsKKwkJcHJvZ3Jlc3MgPSBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKG1lbWNnLCBOVUxMLAorCQkJCQkJR0ZQX0tFUk5FTCwKKwkJCQkJCU1FTV9DR1JPVVBfUkVDTEFJTV9TSFJJTkspOwogCQljdXJ1c2FnZSA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+cmVzLCBSRVNfVVNBR0UpOwogCQkvKiBVc2FnZSBpcyByZWR1Y2VkID8gKi8KICAgCQlpZiAoY3VydXNhZ2UgPj0gb2xkdXNhZ2UpCkBAIC0xODUxLDcgKzIxOTgsOSBAQAogCQlpZiAoIXJldCkKIAkJCWJyZWFrOwogCi0JCW1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0obWVtY2csIEdGUF9LRVJORUwsIHRydWUsIHRydWUpOworCQltZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKG1lbWNnLCBOVUxMLCBHRlBfS0VSTkVMLAorCQkJCQkJTUVNX0NHUk9VUF9SRUNMQUlNX05PU1dBUCB8CisJCQkJCQlNRU1fQ0dST1VQX1JFQ0xBSU1fU0hSSU5LKTsKIAkJY3VydXNhZ2UgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPm1lbXN3LCBSRVNfVVNBR0UpOwogCQkvKiBVc2FnZSBpcyByZWR1Y2VkID8gKi8KIAkJaWYgKGN1cnVzYWdlID49IG9sZHVzYWdlKQpAQCAtMTg2Miw2ICsyMjExLDk3IEBACiAJcmV0dXJuIHJldDsKIH0KIAordW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3NvZnRfbGltaXRfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG9yZGVyLAorCQkJCQkJZ2ZwX3QgZ2ZwX21hc2ssIGludCBuaWQsCisJCQkJCQlpbnQgemlkKQoreworCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gMDsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXosICpuZXh0X216ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHJlY2xhaW1lZDsKKwlpbnQgbG9vcCA9IDA7CisJc3RydWN0IG1lbV9jZ3JvdXBfdHJlZV9wZXJfem9uZSAqbWN0ejsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZXhjZXNzOworCisJaWYgKG9yZGVyID4gMCkKKwkJcmV0dXJuIDA7CisKKwltY3R6ID0gc29mdF9saW1pdF90cmVlX25vZGVfem9uZShuaWQsIHppZCk7CisJLyoKKwkgKiBUaGlzIGxvb3AgY2FuIHJ1biBhIHdoaWxlLCBzcGVjaWFsbHkgaWYgbWVtX2Nncm91cCdzIGNvbnRpbnVvdXNseQorCSAqIGtlZXAgZXhjZWVkaW5nIHRoZWlyIHNvZnQgbGltaXQgYW5kIHB1dHRpbmcgdGhlIHN5c3RlbSB1bmRlcgorCSAqIHByZXNzdXJlCisJICovCisJZG8geworCQlpZiAobmV4dF9teikKKwkJCW16ID0gbmV4dF9tejsKKwkJZWxzZQorCQkJbXogPSBtZW1fY2dyb3VwX2xhcmdlc3Rfc29mdF9saW1pdF9ub2RlKG1jdHopOworCQlpZiAoIW16KQorCQkJYnJlYWs7CisKKwkJcmVjbGFpbWVkID0gbWVtX2Nncm91cF9oaWVyYXJjaGljYWxfcmVjbGFpbShtei0+bWVtLCB6b25lLAorCQkJCQkJZ2ZwX21hc2ssCisJCQkJCQlNRU1fQ0dST1VQX1JFQ0xBSU1fU09GVCk7CisJCW5yX3JlY2xhaW1lZCArPSByZWNsYWltZWQ7CisJCXNwaW5fbG9jaygmbWN0ei0+bG9jayk7CisKKwkJLyoKKwkJICogSWYgd2UgZmFpbGVkIHRvIHJlY2xhaW0gYW55dGhpbmcgZnJvbSB0aGlzIG1lbW9yeSBjZ3JvdXAKKwkJICogaXQgaXMgdGltZSB0byBtb3ZlIG9uIHRvIHRoZSBuZXh0IGNncm91cAorCQkgKi8KKwkJbmV4dF9teiA9IE5VTEw7CisJCWlmICghcmVjbGFpbWVkKSB7CisJCQlkbyB7CisJCQkJLyoKKwkJCQkgKiBMb29wIHVudGlsIHdlIGZpbmQgeWV0IGFub3RoZXIgb25lLgorCQkJCSAqCisJCQkJICogQnkgdGhlIHRpbWUgd2UgZ2V0IHRoZSBzb2Z0X2xpbWl0IGxvY2sKKwkJCQkgKiBhZ2Fpbiwgc29tZW9uZSBtaWdodCBoYXZlIGFkZWQgdGhlCisJCQkJICogZ3JvdXAgYmFjayBvbiB0aGUgUkIgdHJlZS4gSXRlcmF0ZSB0bworCQkJCSAqIG1ha2Ugc3VyZSB3ZSBnZXQgYSBkaWZmZXJlbnQgbWVtLgorCQkJCSAqIG1lbV9jZ3JvdXBfbGFyZ2VzdF9zb2Z0X2xpbWl0X25vZGUgcmV0dXJucworCQkJCSAqIE5VTEwgaWYgbm8gb3RoZXIgY2dyb3VwIGlzIHByZXNlbnQgb24KKwkJCQkgKiB0aGUgdHJlZQorCQkJCSAqLworCQkJCW5leHRfbXogPQorCQkJCV9fbWVtX2Nncm91cF9sYXJnZXN0X3NvZnRfbGltaXRfbm9kZShtY3R6KTsKKwkJCQlpZiAobmV4dF9teiA9PSBteikgeworCQkJCQljc3NfcHV0KCZuZXh0X216LT5tZW0tPmNzcyk7CisJCQkJCW5leHRfbXogPSBOVUxMOworCQkJCX0gZWxzZSAvKiBuZXh0X216ID09IE5VTEwgb3Igb3RoZXIgbWVtY2cgKi8KKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlICgxKTsKKwkJfQorCQlfX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKG16LT5tZW0sIG16LCBtY3R6KTsKKwkJZXhjZXNzID0gcmVzX2NvdW50ZXJfc29mdF9saW1pdF9leGNlc3MoJm16LT5tZW0tPnJlcyk7CisJCS8qCisJCSAqIE9uZSBzY2hvb2wgb2YgdGhvdWdodCBzYXlzIHRoYXQgd2Ugc2hvdWxkIG5vdCBhZGQKKwkJICogYmFjayB0aGUgbm9kZSB0byB0aGUgdHJlZSBpZiByZWNsYWltIHJldHVybnMgMC4KKwkJICogQnV0IG91ciByZWNsYWltIGNvdWxkIHJldHVybiAwLCBzaW1wbHkgYmVjYXVzZSBkdWUKKwkJICogdG8gcHJpb3JpdHkgd2UgYXJlIGV4cG9zaW5nIGEgc21hbGxlciBzdWJzZXQgb2YKKwkJICogbWVtb3J5IHRvIHJlY2xhaW0gZnJvbS4gQ29uc2lkZXIgdGhpcyBhcyBhIGxvbmdlcgorCQkgKiB0ZXJtIFRPRE8uCisJCSAqLworCQkvKiBJZiBleGNlc3MgPT0gMCwgbm8gdHJlZSBvcHMgKi8KKwkJX19tZW1fY2dyb3VwX2luc2VydF9leGNlZWRlZChtei0+bWVtLCBteiwgbWN0eiwgZXhjZXNzKTsKKwkJc3Bpbl91bmxvY2soJm1jdHotPmxvY2spOworCQljc3NfcHV0KCZtei0+bWVtLT5jc3MpOworCQlsb29wKys7CisJCS8qCisJCSAqIENvdWxkIG5vdCByZWNsYWltIGFueXRoaW5nIGFuZCB0aGVyZSBhcmUgbm8gbW9yZQorCQkgKiBtZW0gY2dyb3VwcyB0byB0cnkgb3Igd2Ugc2VlbSB0byBiZSBsb29waW5nIHdpdGhvdXQKKwkJICogcmVjbGFpbWluZyBhbnl0aGluZy4KKwkJICovCisJCWlmICghbnJfcmVjbGFpbWVkICYmCisJCQkobmV4dF9teiA9PSBOVUxMIHx8CisJCQlsb29wID4gTUVNX0NHUk9VUF9NQVhfU09GVF9MSU1JVF9SRUNMQUlNX0xPT1BTKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCFucl9yZWNsYWltZWQpOworCWlmIChuZXh0X216KQorCQljc3NfcHV0KCZuZXh0X216LT5tZW0tPmNzcyk7CisJcmV0dXJuIG5yX3JlY2xhaW1lZDsKK30KKwogLyoKICAqIFRoaXMgcm91dGluZSB0cmF2ZXJzZSBwYWdlX2Nncm91cCBpbiBnaXZlbiBsaXN0IGFuZCBkcm9wIHRoZW0gYWxsLgogICogKkFuZCogdGhpcyByb3V0aW5lIGRvZXNuJ3QgcmVjbGFpbSBwYWdlIGl0c2VsZiwganVzdCByZW1vdmVzIHBhZ2VfY2dyb3VwLgpAQCAtMjA0NiwyMCArMjQ4Niw2NCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0cnVjdCBtZW1fY2dyb3VwX2lkeF9kYXRhIHsKKwlzNjQgdmFsOworCWVudW0gbWVtX2Nncm91cF9zdGF0X2luZGV4IGlkeDsKK307CisKK3N0YXRpYyBpbnQKK21lbV9jZ3JvdXBfZ2V0X2lkeF9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1lbV9jZ3JvdXBfaWR4X2RhdGEgKmQgPSBkYXRhOworCWQtPnZhbCArPSBtZW1fY2dyb3VwX3JlYWRfc3RhdCgmbWVtLT5zdGF0LCBkLT5pZHgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbWVtX2Nncm91cF9nZXRfcmVjdXJzaXZlX2lkeF9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJZW51bSBtZW1fY2dyb3VwX3N0YXRfaW5kZXggaWR4LCBzNjQgKnZhbCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cF9pZHhfZGF0YSBkOworCWQuaWR4ID0gaWR4OworCWQudmFsID0gMDsKKwltZW1fY2dyb3VwX3dhbGtfdHJlZShtZW0sICZkLCBtZW1fY2dyb3VwX2dldF9pZHhfc3RhdCk7CisJKnZhbCA9IGQudmFsOworfQorCiBzdGF0aWMgdTY0IG1lbV9jZ3JvdXBfcmVhZChzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpOwotCXU2NCB2YWwgPSAwOworCXU2NCBpZHhfdmFsLCB2YWw7CiAJaW50IHR5cGUsIG5hbWU7CiAKIAl0eXBlID0gTUVNRklMRV9UWVBFKGNmdC0+cHJpdmF0ZSk7CiAJbmFtZSA9IE1FTUZJTEVfQVRUUihjZnQtPnByaXZhdGUpOwogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgX01FTToKLQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbS0+cmVzLCBuYW1lKTsKKwkJaWYgKG5hbWUgPT0gUkVTX1VTQUdFICYmIG1lbV9jZ3JvdXBfaXNfcm9vdChtZW0pKSB7CisJCQltZW1fY2dyb3VwX2dldF9yZWN1cnNpdmVfaWR4X3N0YXQobWVtLAorCQkJCU1FTV9DR1JPVVBfU1RBVF9DQUNIRSwgJmlkeF92YWwpOworCQkJdmFsID0gaWR4X3ZhbDsKKwkJCW1lbV9jZ3JvdXBfZ2V0X3JlY3Vyc2l2ZV9pZHhfc3RhdChtZW0sCisJCQkJTUVNX0NHUk9VUF9TVEFUX1JTUywgJmlkeF92YWwpOworCQkJdmFsICs9IGlkeF92YWw7CisJCQl2YWwgPDw9IFBBR0VfU0hJRlQ7CisJCX0gZWxzZQorCQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbS0+cmVzLCBuYW1lKTsKIAkJYnJlYWs7CiAJY2FzZSBfTUVNU1dBUDoKLQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbS0+bWVtc3csIG5hbWUpOworCQlpZiAobmFtZSA9PSBSRVNfVVNBR0UgJiYgbWVtX2Nncm91cF9pc19yb290KG1lbSkpIHsKKwkJCW1lbV9jZ3JvdXBfZ2V0X3JlY3Vyc2l2ZV9pZHhfc3RhdChtZW0sCisJCQkJTUVNX0NHUk9VUF9TVEFUX0NBQ0hFLCAmaWR4X3ZhbCk7CisJCQl2YWwgPSBpZHhfdmFsOworCQkJbWVtX2Nncm91cF9nZXRfcmVjdXJzaXZlX2lkeF9zdGF0KG1lbSwKKwkJCQlNRU1fQ0dST1VQX1NUQVRfUlNTLCAmaWR4X3ZhbCk7CisJCQl2YWwgKz0gaWR4X3ZhbDsKKwkJCW1lbV9jZ3JvdXBfZ2V0X3JlY3Vyc2l2ZV9pZHhfc3RhdChtZW0sCisJCQkJTUVNX0NHUk9VUF9TVEFUX1NXQVBPVVQsICZpZHhfdmFsKTsKKwkJCXZhbCA8PD0gUEFHRV9TSElGVDsKKwkJfSBlbHNlCisJCQl2YWwgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtLT5tZW1zdywgbmFtZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtMjA4Myw2ICsyNTY3LDEwIEBACiAJbmFtZSA9IE1FTUZJTEVfQVRUUihjZnQtPnByaXZhdGUpOwogCXN3aXRjaCAobmFtZSkgewogCWNhc2UgUkVTX0xJTUlUOgorCQlpZiAobWVtX2Nncm91cF9pc19yb290KG1lbWNnKSkgeyAvKiBDYW4ndCBzZXQgbGltaXQgb24gcm9vdCAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAJCS8qIFRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgbmVjZXNzYXJ5IHBhcnNlLi4ucmV1c2UgaXQgKi8KIAkJcmV0ID0gcmVzX2NvdW50ZXJfbWVtcGFyc2Vfd3JpdGVfc3RyYXRlZ3koYnVmZmVyLCAmdmFsKTsKIAkJaWYgKHJldCkKQEAgLTIwOTIsNiArMjU4MCwyMCBAQAogCQllbHNlCiAJCQlyZXQgPSBtZW1fY2dyb3VwX3Jlc2l6ZV9tZW1zd19saW1pdChtZW1jZywgdmFsKTsKIAkJYnJlYWs7CisJY2FzZSBSRVNfU09GVF9MSU1JVDoKKwkJcmV0ID0gcmVzX2NvdW50ZXJfbWVtcGFyc2Vfd3JpdGVfc3RyYXRlZ3koYnVmZmVyLCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBGb3IgbWVtc3csIHNvZnQgbGltaXRzIGFyZSBoYXJkIHRvIGltcGxlbWVudCBpbiB0ZXJtcworCQkgKiBvZiBzZW1hbnRpY3MsIGZvciBub3csIHdlIHN1cHBvcnQgc29mdCBsaW1pdHMgZm9yCisJCSAqIGNvbnRyb2wgd2l0aG91dCBzd2FwCisJCSAqLworCQlpZiAodHlwZSA9PSBfTUVNKQorCQkJcmV0ID0gcmVzX2NvdW50ZXJfc2V0X3NvZnRfbGltaXQoJm1lbWNnLT5yZXMsIHZhbCk7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7IC8qIHNob3VsZCBiZSBCVUcoKSA/ICovCiAJCWJyZWFrOwpAQCAtMjE0OSw2ICsyNjUxLDcgQEAKIAkJCXJlc19jb3VudGVyX3Jlc2V0X2ZhaWxjbnQoJm1lbS0+bWVtc3cpOwogCQlicmVhazsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE2MCw2ICsyNjYzLDcgQEAKIAlNQ1NfTUFQUEVEX0ZJTEUsCiAJTUNTX1BHUEdJTiwKIAlNQ1NfUEdQR09VVCwKKwlNQ1NfU1dBUCwKIAlNQ1NfSU5BQ1RJVkVfQU5PTiwKIAlNQ1NfQUNUSVZFX0FOT04sCiAJTUNTX0lOQUNUSVZFX0ZJTEUsCkBAIC0yMTgxLDYgKzI2ODUsNyBAQAogCXsibWFwcGVkX2ZpbGUiLCAidG90YWxfbWFwcGVkX2ZpbGUifSwKIAl7InBncGdpbiIsICJ0b3RhbF9wZ3BnaW4ifSwKIAl7InBncGdvdXQiLCAidG90YWxfcGdwZ291dCJ9LAorCXsic3dhcCIsICJ0b3RhbF9zd2FwIn0sCiAJeyJpbmFjdGl2ZV9hbm9uIiwgInRvdGFsX2luYWN0aXZlX2Fub24ifSwKIAl7ImFjdGl2ZV9hbm9uIiwgInRvdGFsX2FjdGl2ZV9hbm9uIn0sCiAJeyJpbmFjdGl2ZV9maWxlIiwgInRvdGFsX2luYWN0aXZlX2ZpbGUifSwKQEAgLTIyMDUsNiArMjcxMCwxMCBAQAogCXMtPnN0YXRbTUNTX1BHUEdJTl0gKz0gdmFsOwogCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KCZtZW0tPnN0YXQsIE1FTV9DR1JPVVBfU1RBVF9QR1BHT1VUX0NPVU5UKTsKIAlzLT5zdGF0W01DU19QR1BHT1VUXSArPSB2YWw7CisJaWYgKGRvX3N3YXBfYWNjb3VudCkgeworCQl2YWwgPSBtZW1fY2dyb3VwX3JlYWRfc3RhdCgmbWVtLT5zdGF0LCBNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVCk7CisJCXMtPnN0YXRbTUNTX1NXQVBdICs9IHZhbCAqIFBBR0VfU0laRTsKKwl9CiAKIAkvKiBwZXIgem9uZSBzdGF0ICovCiAJdmFsID0gbWVtX2Nncm91cF9nZXRfbG9jYWxfem9uZXN0YXQobWVtLCBMUlVfSU5BQ1RJVkVfQU5PTik7CkBAIC0yMjM2LDggKzI3NDUsMTEgQEAKIAltZW1zZXQoJm15c3RhdCwgMCwgc2l6ZW9mKG15c3RhdCkpOwogCW1lbV9jZ3JvdXBfZ2V0X2xvY2FsX3N0YXQobWVtX2NvbnQsICZteXN0YXQpOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX01DU19TVEFUOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE5SX01DU19TVEFUOyBpKyspIHsKKwkJaWYgKGkgPT0gTUNTX1NXQVAgJiYgIWRvX3N3YXBfYWNjb3VudCkKKwkJCWNvbnRpbnVlOwogCQljYi0+ZmlsbChjYiwgbWVtY2dfc3RhdF9zdHJpbmdzW2ldLmxvY2FsX25hbWUsIG15c3RhdC5zdGF0W2ldKTsKKwl9CiAKIAkvKiBIaWVyYXJjaGljYWwgaW5mb3JtYXRpb24gKi8KIAl7CkBAIC0yMjUwLDkgKzI3NjIsMTEgQEAKIAogCW1lbXNldCgmbXlzdGF0LCAwLCBzaXplb2YobXlzdGF0KSk7CiAJbWVtX2Nncm91cF9nZXRfdG90YWxfc3RhdChtZW1fY29udCwgJm15c3RhdCk7Ci0JZm9yIChpID0gMDsgaSA8IE5SX01DU19TVEFUOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE5SX01DU19TVEFUOyBpKyspIHsKKwkJaWYgKGkgPT0gTUNTX1NXQVAgJiYgIWRvX3N3YXBfYWNjb3VudCkKKwkJCWNvbnRpbnVlOwogCQljYi0+ZmlsbChjYiwgbWVtY2dfc3RhdF9zdHJpbmdzW2ldLnRvdGFsX25hbWUsIG15c3RhdC5zdGF0W2ldKTsKLQorCX0KIAogI2lmZGVmIENPTkZJR19ERUJVR19WTQogCWNiLT5maWxsKGNiLCAiaW5hY3RpdmVfcmF0aW8iLCBjYWxjX2luYWN0aXZlX3JhdGlvKG1lbV9jb250LCBOVUxMKSk7CkBAIC0yMzQ1LDYgKzI4NTksMTIgQEAKIAkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAogCX0sCiAJeworCQkubmFtZSA9ICJzb2Z0X2xpbWl0X2luX2J5dGVzIiwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTSwgUkVTX1NPRlRfTElNSVQpLAorCQkud3JpdGVfc3RyaW5nID0gbWVtX2Nncm91cF93cml0ZSwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCisJewogCQkubmFtZSA9ICJmYWlsY250IiwKIAkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTSwgUkVTX0ZBSUxDTlQpLAogCQkudHJpZ2dlciA9IG1lbV9jZ3JvdXBfcmVzZXQsCkBAIC0yNDM4LDYgKzI5NTgsOSBAQAogCQlteiA9ICZwbi0+em9uZWluZm9bem9uZV07CiAJCWZvcl9lYWNoX2xydShsKQogCQkJSU5JVF9MSVNUX0hFQUQoJm16LT5saXN0c1tsXSk7CisJCW16LT51c2FnZV9pbl9leGNlc3MgPSAwOworCQltei0+b25fdHJlZSA9IGZhbHNlOworCQltei0+bWVtID0gbWVtOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI0ODMsNiArMzAwNiw3IEBACiB7CiAJaW50IG5vZGU7CiAKKwltZW1fY2dyb3VwX3JlbW92ZV9mcm9tX3RyZWVzKG1lbSk7CiAJZnJlZV9jc3NfaWQoJm1lbV9jZ3JvdXBfc3Vic3lzLCAmbWVtLT5jc3MpOwogCiAJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQpAQCAtMjUzMSw2ICszMDU1LDMxIEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGludCBtZW1fY2dyb3VwX3NvZnRfbGltaXRfdHJlZV9pbml0KHZvaWQpCit7CisJc3RydWN0IG1lbV9jZ3JvdXBfdHJlZV9wZXJfbm9kZSAqcnRwbjsKKwlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICpydHB6OworCWludCB0bXAsIG5vZGUsIHpvbmU7CisKKwlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpIHsKKwkJdG1wID0gbm9kZTsKKwkJaWYgKCFub2RlX3N0YXRlKG5vZGUsIE5fTk9STUFMX01FTU9SWSkpCisJCQl0bXAgPSAtMTsKKwkJcnRwbiA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKnJ0cG4pLCBHRlBfS0VSTkVMLCB0bXApOworCQlpZiAoIXJ0cG4pCisJCQlyZXR1cm4gMTsKKworCQlzb2Z0X2xpbWl0X3RyZWUucmJfdHJlZV9wZXJfbm9kZVtub2RlXSA9IHJ0cG47CisKKwkJZm9yICh6b25lID0gMDsgem9uZSA8IE1BWF9OUl9aT05FUzsgem9uZSsrKSB7CisJCQlydHB6ID0gJnJ0cG4tPnJiX3RyZWVfcGVyX3pvbmVbem9uZV07CisJCQlydHB6LT5yYl9yb290ID0gUkJfUk9PVDsKKwkJCXNwaW5fbG9ja19pbml0KCZydHB6LT5sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICogX19yZWYKIG1lbV9jZ3JvdXBfY3JlYXRlKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY29udCkKIHsKQEAgLTI1NDUsMTAgKzMwOTQsMTUgQEAKIAlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpCiAJCWlmIChhbGxvY19tZW1fY2dyb3VwX3Blcl96b25lX2luZm8obWVtLCBub2RlKSkKIAkJCWdvdG8gZnJlZV9vdXQ7CisKIAkvKiByb290ID8gKi8KIAlpZiAoY29udC0+cGFyZW50ID09IE5VTEwpIHsKIAkJZW5hYmxlX3N3YXBfY2dyb3VwKCk7CiAJCXBhcmVudCA9IE5VTEw7CisJCXJvb3RfbWVtX2Nncm91cCA9IG1lbTsKKwkJaWYgKG1lbV9jZ3JvdXBfc29mdF9saW1pdF90cmVlX2luaXQoKSkKKwkJCWdvdG8gZnJlZV9vdXQ7CisKIAl9IGVsc2UgewogCQlwYXJlbnQgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250LT5wYXJlbnQpOwogCQltZW0tPnVzZV9oaWVyYXJjaHkgPSBwYXJlbnQtPnVzZV9oaWVyYXJjaHk7CkBAIC0yNTc3LDYgKzMxMzEsNyBAQAogCXJldHVybiAmbWVtLT5jc3M7CiBmcmVlX291dDoKIAlfX21lbV9jZ3JvdXBfZnJlZShtZW0pOworCXJvb3RfbWVtX2Nncm91cCA9IE5VTEw7CiAJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogfQogCkBAIC0yNjEyLDcgKzMxNjcsOCBAQAogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9tb3ZlX3Rhc2soc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJCXN0cnVjdCBjZ3JvdXAgKmNvbnQsCiAJCQkJc3RydWN0IGNncm91cCAqb2xkX2NvbnQsCi0JCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwKQorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCQlib29sIHRocmVhZGdyb3VwKQogewogCW11dGV4X2xvY2soJm1lbWNnX3Rhc2tsaXN0KTsKIAkvKgpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21tL21lbW9yeS1mYWlsdXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjYzY0MQotLS0gL2Rldi9udWxsCisrKyBiL21tL21lbW9yeS1mYWlsdXJlLmMKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcnM6IEFuZGkgS2xlZW4sIEZlbmdndWFuZyBXdQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIG9ubHkgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEhpZ2ggbGV2ZWwgbWFjaGluZSBjaGVjayBoYW5kbGVyLiBIYW5kbGVzIHBhZ2VzIHJlcG9ydGVkIGJ5IHRoZQorICogaGFyZHdhcmUgYXMgYmVpbmcgY29ycnVwdGVkIHVzdWFsbHkgZHVlIHRvIGEgMmJpdCBFQ0MgbWVtb3J5IG9yIGNhY2hlCisgKiBmYWlsdXJlLgorICoKKyAqIEhhbmRsZXMgcGFnZSBjYWNoZSBwYWdlcyBpbiB2YXJpb3VzIHN0YXRlcy4JVGhlIHRyaWNreSBwYXJ0CisgKiBoZXJlIGlzIHRoYXQgd2UgY2FuIGFjY2VzcyBhbnkgcGFnZSBhc3luY2hyb25vdXMgdG8gb3RoZXIgVk0KKyAqIHVzZXJzLCBiZWNhdXNlIG1lbW9yeSBmYWlsdXJlcyBjb3VsZCBoYXBwZW4gYW55dGltZSBhbmQgYW55d2hlcmUsCisgKiBwb3NzaWJseSB2aW9sYXRpbmcgc29tZSBvZiB0aGVpciBhc3N1bXB0aW9ucy4gVGhpcyBpcyB3aHkgdGhpcyBjb2RlCisgKiBoYXMgdG8gYmUgZXh0cmVtZWx5IGNhcmVmdWwuIEdlbmVyYWxseSBpdCB0cmllcyB0byB1c2Ugbm9ybWFsIGxvY2tpbmcKKyAqIHJ1bGVzLCBhcyBpbiBnZXQgdGhlIHN0YW5kYXJkIGxvY2tzLCBldmVuIGlmIHRoYXQgbWVhbnMgdGhlCisgKiBlcnJvciBoYW5kbGluZyB0YWtlcyBwb3RlbnRpYWxseSBhIGxvbmcgdGltZS4KKyAqCisgKiBUaGUgb3BlcmF0aW9uIHRvIG1hcCBiYWNrIGZyb20gUk1BUCBjaGFpbnMgdG8gcHJvY2Vzc2VzIGhhcyB0byB3YWxrCisgKiB0aGUgY29tcGxldGUgcHJvY2VzcyBsaXN0IGFuZCBoYXMgbm9uIGxpbmVhciBjb21wbGV4aXR5IHdpdGggdGhlIG51bWJlcgorICogbWFwcGluZ3MuIEluIHNob3J0IGl0IGNhbiBiZSBxdWl0ZSBzbG93LiBCdXQgc2luY2UgbWVtb3J5IGNvcnJ1cHRpb25zCisgKiBhcmUgcmFyZSB3ZSBob3BlIHRvIGdldCBhd2F5IHdpdGggdGhpcy4KKyAqLworCisvKgorICogTm90ZWJvb2s6CisgKiAtIGh1Z2V0bGIgbmVlZHMgbW9yZSBjb2RlCisgKiAtIGtjb3JlL29sZG1lbS92bWNvcmUvbWVtL2ttZW0gY2hlY2sgZm9yIGh3cG9pc29uIHBhZ2VzCisgKiAtIHBhc3MgYmFkIHBhZ2VzIHRvIGtkdW1wIG5leHQga2VybmVsCisgKi8KKyNkZWZpbmUgREVCVUcgMQkJLyogcmVtb3ZlIG1lIGluIDIuNi4zNCAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva3NtLmg+CisjaW5jbHVkZSA8bGludXgvcm1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitpbnQgc3lzY3RsX21lbW9yeV9mYWlsdXJlX2Vhcmx5X2tpbGwgX19yZWFkX21vc3RseSA9IDA7CisKK2ludCBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfcmVjb3ZlcnkgX19yZWFkX21vc3RseSA9IDE7CisKK2F0b21pY19sb25nX3QgbWNlX2JhZF9wYWdlcyBfX3JlYWRfbW9zdGx5ID0gQVRPTUlDX0xPTkdfSU5JVCgwKTsKKworLyoKKyAqIFNlbmQgYWxsIHRoZSBwcm9jZXNzZXMgd2hvIGhhdmUgdGhlIHBhZ2UgbWFwcGVkIGFuIGBgYWN0aW9uIG9wdGlvbmFsJycKKyAqIHNpZ25hbC4KKyAqLworc3RhdGljIGludCBraWxsX3Byb2NfYW8oc3RydWN0IHRhc2tfc3RydWN0ICp0LCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCB0cmFwbm8sCisJCQl1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlzdHJ1Y3Qgc2lnaW5mbyBzaTsKKwlpbnQgcmV0OworCisJcHJpbnRrKEtFUk5fRVJSCisJCSJNQ0UgJSNseDogS2lsbGluZyAlczolZCBlYXJseSBkdWUgdG8gaGFyZHdhcmUgbWVtb3J5IGNvcnJ1cHRpb25cbiIsCisJCXBmbiwgdC0+Y29tbSwgdC0+cGlkKTsKKwlzaS5zaV9zaWdubyA9IFNJR0JVUzsKKwlzaS5zaV9lcnJubyA9IDA7CisJc2kuc2lfY29kZSA9IEJVU19NQ0VFUlJfQU87CisJc2kuc2lfYWRkciA9ICh2b2lkICopYWRkcjsKKyNpZmRlZiBfX0FSQ0hfU0lfVFJBUE5PCisJc2kuc2lfdHJhcG5vID0gdHJhcG5vOworI2VuZGlmCisJc2kuc2lfYWRkcl9sc2IgPSBQQUdFX1NISUZUOworCS8qCisJICogRG9uJ3QgdXNlIGZvcmNlIGhlcmUsIGl0J3MgY29udmVuaWVudCBpZiB0aGUgc2lnbmFsCisJICogY2FuIGJlIHRlbXBvcmFyaWx5IGJsb2NrZWQuCisJICogVGhpcyBjb3VsZCBjYXVzZSBhIGxvb3Agd2hlbiB0aGUgdXNlciBzZXRzIFNJR0JVUworCSAqIHRvIFNJR19JR04sIGJ1dCBob3BlZnVsbHkgbm9vbmUgd2lsbCBkbyB0aGF0PworCSAqLworCXJldCA9IHNlbmRfc2lnX2luZm8oU0lHQlVTLCAmc2ksIHQpOyAgLyogc3luY2hyb25vdXM/ICovCisJaWYgKHJldCA8IDApCisJCXByaW50ayhLRVJOX0lORk8gIk1DRTogRXJyb3Igc2VuZGluZyBzaWduYWwgdG8gJXM6JWQ6ICVkXG4iLAorCQkgICAgICAgdC0+Y29tbSwgdC0+cGlkLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBLaWxsIGFsbCBwcm9jZXNzZXMgdGhhdCBoYXZlIGEgcG9pc29uZWQgcGFnZSBtYXBwZWQgYW5kIHRoZW4gaXNvbGF0ZQorICogdGhlIHBhZ2UuCisgKgorICogR2VuZXJhbCBzdHJhdGVneToKKyAqIEZpbmQgYWxsIHByb2Nlc3NlcyBoYXZpbmcgdGhlIHBhZ2UgbWFwcGVkIGFuZCBraWxsIHRoZW0uCisgKiBCdXQgd2Uga2VlcCBhIHBhZ2UgcmVmZXJlbmNlIGFyb3VuZCBzbyB0aGF0IHRoZSBwYWdlIGlzIG5vdAorICogYWN0dWFsbHkgZnJlZWQgeWV0LgorICogVGhlbiBzdGFzaCB0aGUgcGFnZSBhd2F5CisgKgorICogVGhlcmUncyBubyBjb252ZW5pZW50IHdheSB0byBnZXQgYmFjayB0byBtYXBwZWQgcHJvY2Vzc2VzCisgKiBmcm9tIHRoZSBWTUFzLiBTbyBkbyBhIGJydXRlLWZvcmNlIHNlYXJjaCBvdmVyIGFsbAorICogcnVubmluZyBwcm9jZXNzZXMuCisgKgorICogUmVtZW1iZXIgdGhhdCBtYWNoaW5lIGNoZWNrcyBhcmUgbm90IGNvbW1vbiAob3IgcmF0aGVyCisgKiBpZiB0aGV5IGFyZSBjb21tb24geW91IGhhdmUgb3RoZXIgcHJvYmxlbXMpLCBzbyB0aGlzIHNob3VsZG4ndAorICogYmUgYSBwZXJmb3JtYW5jZSBpc3N1ZS4KKyAqCisgKiBBbHNvIHRoZXJlIGFyZSBzb21lIHJhY2VzIHBvc3NpYmxlIHdoaWxlIHdlIGdldCBmcm9tIHRoZQorICogZXJyb3IgZGV0ZWN0aW9uIHRvIGFjdHVhbGx5IGhhbmRsZSBpdC4KKyAqLworCitzdHJ1Y3QgdG9fa2lsbCB7CisJc3RydWN0IGxpc3RfaGVhZCBuZDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgYWRkcl92YWxpZDoxOworfTsKKworLyoKKyAqIEZhaWx1cmUgaGFuZGxpbmc6IGlmIHdlIGNhbid0IGZpbmQgb3IgY2FuJ3Qga2lsbCBhIHByb2Nlc3MgdGhlcmUncworICogbm90IG11Y2ggd2UgY2FuIGRvLglXZSBqdXN0IHByaW50IGEgbWVzc2FnZSBhbmQgaWdub3JlIG90aGVyd2lzZS4KKyAqLworCisvKgorICogU2NoZWR1bGUgYSBwcm9jZXNzIGZvciBsYXRlciBraWxsLgorICogVXNlcyBHRlBfQVRPTUlDIGFsbG9jYXRpb25zIHRvIGF2b2lkIHBvdGVudGlhbCByZWN1cnNpb25zIGluIHRoZSBWTS4KKyAqIFRCRCB3b3VsZCBHRlBfTk9JTyBiZSBlbm91Z2g/CisgKi8KK3N0YXRpYyB2b2lkIGFkZF90b19raWxsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcGFnZSAqcCwKKwkJICAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqdG9fa2lsbCwKKwkJICAgICAgIHN0cnVjdCB0b19raWxsICoqdGtjKQoreworCXN0cnVjdCB0b19raWxsICp0azsKKworCWlmICgqdGtjKSB7CisJCXRrID0gKnRrYzsKKwkJKnRrYyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJdGsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdG9fa2lsbCksIEdGUF9BVE9NSUMpOworCQlpZiAoIXRrKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJIk1DRTogT3V0IG9mIG1lbW9yeSB3aGlsZSBtYWNoaW5lIGNoZWNrIGhhbmRsaW5nXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwl0ay0+YWRkciA9IHBhZ2VfYWRkcmVzc19pbl92bWEocCwgdm1hKTsKKwl0ay0+YWRkcl92YWxpZCA9IDE7CisKKwkvKgorCSAqIEluIHRoZW9yeSB3ZSBkb24ndCBoYXZlIHRvIGtpbGwgd2hlbiB0aGUgcGFnZSB3YXMKKwkgKiBtdW5tYXBlZC4gQnV0IGl0IGNvdWxkIGJlIGFsc28gYSBtcmVtYXAuIFNpbmNlIHRoYXQncworCSAqIGxpa2VseSB2ZXJ5IHJhcmUga2lsbCBhbnl3YXlzIGp1c3Qgb3V0IG9mIHBhcmFub2lhLCBidXQgdXNlCisJICogYSBTSUdLSUxMIGJlY2F1c2UgdGhlIGVycm9yIGlzIG5vdCBjb250YWluZWQgYW55bW9yZS4KKwkgKi8KKwlpZiAodGstPmFkZHIgPT0gLUVGQVVMVCkgeworCQlwcl9kZWJ1ZygiTUNFOiBVbmFibGUgdG8gZmluZCB1c2VyIHNwYWNlIGFkZHJlc3MgJWx4IGluICVzXG4iLAorCQkJcGFnZV90b19wZm4ocCksIHRzay0+Y29tbSk7CisJCXRrLT5hZGRyX3ZhbGlkID0gMDsKKwl9CisJZ2V0X3Rhc2tfc3RydWN0KHRzayk7CisJdGstPnRzayA9IHRzazsKKwlsaXN0X2FkZF90YWlsKCZ0ay0+bmQsIHRvX2tpbGwpOworfQorCisvKgorICogS2lsbCB0aGUgcHJvY2Vzc2VzIHRoYXQgaGF2ZSBiZWVuIGNvbGxlY3RlZCBlYXJsaWVyLgorICoKKyAqIE9ubHkgZG8gYW55dGhpbmcgd2hlbiBET0lUIGlzIHNldCwgb3RoZXJ3aXNlIGp1c3QgZnJlZSB0aGUgbGlzdAorICogKHRoaXMgaXMgdXNlZCBmb3IgY2xlYW4gcGFnZXMgd2hpY2ggZG8gbm90IG5lZWQga2lsbGluZykKKyAqIEFsc28gd2hlbiBGQUlMIGlzIHNldCBkbyBhIGZvcmNlIGtpbGwgYmVjYXVzZSBzb21ldGhpbmcgd2VudAorICogd3JvbmcgZWFybGllci4KKyAqLworc3RhdGljIHZvaWQga2lsbF9wcm9jc19hbyhzdHJ1Y3QgbGlzdF9oZWFkICp0b19raWxsLCBpbnQgZG9pdCwgaW50IHRyYXBubywKKwkJCSAgaW50IGZhaWwsIHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXN0cnVjdCB0b19raWxsICp0aywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKHRrLCBuZXh0LCB0b19raWxsLCBuZCkgeworCQlpZiAoZG9pdCkgeworCQkJLyoKKwkJCSAqIEluIGNhc2Ugc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBtdW5tYXBpbmcKKwkJCSAqIG1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBkb2Vzbid0IGNhdGNoIHRoZQorCQkJICogc2lnbmFsIGFuZCB0aGVuIGFjY2VzcyB0aGUgbWVtb3J5LiBKdXN0IGtpbGwgaXQuCisJCQkgKiB0aGUgc2lnbmFsIGhhbmRsZXJzCisJCQkgKi8KKwkJCWlmIChmYWlsIHx8IHRrLT5hZGRyX3ZhbGlkID09IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJIk1DRSAlI2x4OiBmb3JjaWJseSBraWxsaW5nICVzOiVkIGJlY2F1c2Ugb2YgZmFpbHVyZSB0byB1bm1hcCBjb3JydXB0ZWQgcGFnZVxuIiwKKwkJCQkJcGZuLCB0ay0+dHNrLT5jb21tLCB0ay0+dHNrLT5waWQpOworCQkJCWZvcmNlX3NpZyhTSUdLSUxMLCB0ay0+dHNrKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEluIHRoZW9yeSB0aGUgcHJvY2VzcyBjb3VsZCBoYXZlIG1hcHBlZAorCQkJICogc29tZXRoaW5nIGVsc2Ugb24gdGhlIGFkZHJlc3MgaW4tYmV0d2Vlbi4gV2UgY291bGQKKwkJCSAqIGNoZWNrIGZvciB0aGF0LCBidXQgd2UgbmVlZCB0byB0ZWxsIHRoZQorCQkJICogcHJvY2VzcyBhbnl3YXlzLgorCQkJICovCisJCQllbHNlIGlmIChraWxsX3Byb2NfYW8odGstPnRzaywgdGstPmFkZHIsIHRyYXBubywKKwkJCQkJICAgICAgcGZuKSA8IDApCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCSJNQ0UgJSNseDogQ2Fubm90IHNlbmQgYWR2aXNvcnkgbWFjaGluZSBjaGVjayBzaWduYWwgdG8gJXM6JWRcbiIsCisJCQkJCXBmbiwgdGstPnRzay0+Y29tbSwgdGstPnRzay0+cGlkKTsKKwkJfQorCQlwdXRfdGFza19zdHJ1Y3QodGstPnRzayk7CisJCWtmcmVlKHRrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGFza19lYXJseV9raWxsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCWlmICghdHNrLT5tbSkKKwkJcmV0dXJuIDA7CisJaWYgKHRzay0+ZmxhZ3MgJiBQRl9NQ0VfUFJPQ0VTUykKKwkJcmV0dXJuICEhKHRzay0+ZmxhZ3MgJiBQRl9NQ0VfRUFSTFkpOworCXJldHVybiBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfZWFybHlfa2lsbDsKK30KKworLyoKKyAqIENvbGxlY3QgcHJvY2Vzc2VzIHdoZW4gdGhlIGVycm9yIGhpdCBhbiBhbm9ueW1vdXMgcGFnZS4KKyAqLworc3RhdGljIHZvaWQgY29sbGVjdF9wcm9jc19hbm9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICp0b19raWxsLAorCQkJICAgICAgc3RydWN0IHRvX2tpbGwgKip0a2MpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJc3RydWN0IGFub25fdm1hICphdjsKKworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJYXYgPSBwYWdlX2xvY2tfYW5vbl92bWEocGFnZSk7CisJaWYgKGF2ID09IE5VTEwpCS8qIE5vdCBhY3R1YWxseSBtYXBwZWQgYW55bW9yZSAqLworCQlnb3RvIG91dDsKKwlmb3JfZWFjaF9wcm9jZXNzICh0c2spIHsKKwkJaWYgKCF0YXNrX2Vhcmx5X2tpbGwodHNrKSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5ICh2bWEsICZhdi0+aGVhZCwgYW5vbl92bWFfbm9kZSkgeworCQkJaWYgKCFwYWdlX21hcHBlZF9pbl92bWEocGFnZSwgdm1hKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh2bWEtPnZtX21tID09IHRzay0+bW0pCisJCQkJYWRkX3RvX2tpbGwodHNrLCBwYWdlLCB2bWEsIHRvX2tpbGwsIHRrYyk7CisJCX0KKwl9CisJcGFnZV91bmxvY2tfYW5vbl92bWEoYXYpOworb3V0OgorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKK30KKworLyoKKyAqIENvbGxlY3QgcHJvY2Vzc2VzIHdoZW4gdGhlIGVycm9yIGhpdCBhIGZpbGUgbWFwcGVkIHBhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGNvbGxlY3RfcHJvY3NfZmlsZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqdG9fa2lsbCwKKwkJCSAgICAgIHN0cnVjdCB0b19raWxsICoqdGtjKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCXN0cnVjdCBwcmlvX3RyZWVfaXRlciBpdGVyOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKworCS8qCisJICogQSBub3RlIG9uIHRoZSBsb2NraW5nIG9yZGVyIGJldHdlZW4gdGhlIHR3byBsb2Nrcy4KKwkgKiBXZSBkb24ndCByZWx5IG9uIHRoaXMgcGFydGljdWxhciBvcmRlci4KKwkgKiBJZiB5b3UgaGF2ZSBzb21lIG90aGVyIGNvZGUgdGhhdCBuZWVkcyBhIGRpZmZlcmVudCBvcmRlcgorCSAqIGZlZWwgZnJlZSB0byBzd2l0Y2ggdGhlbSBhcm91bmQuIE9yIGFkZCBhIHJldmVyc2UgbGluaworCSAqIGZyb20gbW1fc3RydWN0IHRvIHRhc2tfc3RydWN0LCB0aGVuIHRoaXMgY291bGQgYmUgYWxsCisJICogZG9uZSB3aXRob3V0IHRha2luZyB0YXNrbGlzdF9sb2NrIGFuZCBsb29waW5nIG92ZXIgYWxsIHRhc2tzLgorCSAqLworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlzcGluX2xvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKKwlmb3JfZWFjaF9wcm9jZXNzKHRzaykgeworCQlwZ29mZl90IHBnb2ZmID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBQQUdFX1NISUZUKTsKKworCQlpZiAoIXRhc2tfZWFybHlfa2lsbCh0c2spKQorCQkJY29udGludWU7CisKKwkJdm1hX3ByaW9fdHJlZV9mb3JlYWNoKHZtYSwgJml0ZXIsICZtYXBwaW5nLT5pX21tYXAsIHBnb2ZmLAorCQkJCSAgICAgIHBnb2ZmKSB7CisJCQkvKgorCQkJICogU2VuZCBlYXJseSBraWxsIHNpZ25hbCB0byB0YXNrcyB3aGVyZSBhIHZtYSBjb3ZlcnMKKwkJCSAqIHRoZSBwYWdlIGJ1dCB0aGUgY29ycnVwdGVkIHBhZ2UgaXMgbm90IG5lY2Vzc2FyaWx5CisJCQkgKiBtYXBwZWQgaXQgaW4gaXRzIHB0ZS4KKwkJCSAqIEFzc3VtZSBhcHBsaWNhdGlvbnMgd2hvIHJlcXVlc3RlZCBlYXJseSBraWxsIHdhbnQKKwkJCSAqIHRvIGJlIGluZm9ybWVkIG9mIGFsbCBzdWNoIGRhdGEgY29ycnVwdGlvbnMuCisJCQkgKi8KKwkJCWlmICh2bWEtPnZtX21tID09IHRzay0+bW0pCisJCQkJYWRkX3RvX2tpbGwodHNrLCBwYWdlLCB2bWEsIHRvX2tpbGwsIHRrYyk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Cit9CisKKy8qCisgKiBDb2xsZWN0IHRoZSBwcm9jZXNzZXMgd2hvIGhhdmUgdGhlIGNvcnJ1cHRlZCBwYWdlIG1hcHBlZCB0byBraWxsLgorICogVGhpcyBpcyBkb25lIGluIHR3byBzdGVwcyBmb3IgbG9ja2luZyByZWFzb25zLgorICogRmlyc3QgcHJlYWxsb2NhdGUgb25lIHRva2lsbCBzdHJ1Y3R1cmUgb3V0c2lkZSB0aGUgc3BpbiBsb2NrcywKKyAqIHNvIHRoYXQgd2UgY2FuIGtpbGwgYXQgbGVhc3Qgb25lIHByb2Nlc3MgcmVhc29uYWJseSByZWxpYWJsZS4KKyAqLworc3RhdGljIHZvaWQgY29sbGVjdF9wcm9jcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqdG9raWxsKQoreworCXN0cnVjdCB0b19raWxsICp0azsKKworCWlmICghcGFnZS0+bWFwcGluZykKKwkJcmV0dXJuOworCisJdGsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdG9fa2lsbCksIEdGUF9OT0lPKTsKKwlpZiAoIXRrKQorCQlyZXR1cm47CisJaWYgKFBhZ2VBbm9uKHBhZ2UpKQorCQljb2xsZWN0X3Byb2NzX2Fub24ocGFnZSwgdG9raWxsLCAmdGspOworCWVsc2UKKwkJY29sbGVjdF9wcm9jc19maWxlKHBhZ2UsIHRva2lsbCwgJnRrKTsKKwlrZnJlZSh0ayk7Cit9CisKKy8qCisgKiBFcnJvciBoYW5kbGVycyBmb3IgdmFyaW91cyB0eXBlcyBvZiBwYWdlcy4KKyAqLworCitlbnVtIG91dGNvbWUgeworCUZBSUxFRCwJCS8qIEVycm9yIGhhbmRsaW5nIGZhaWxlZCAqLworCURFTEFZRUQsCS8qIFdpbGwgYmUgaGFuZGxlZCBsYXRlciAqLworCUlHTk9SRUQsCS8qIEVycm9yIHNhZmVseSBpZ25vcmVkICovCisJUkVDT1ZFUkVELAkvKiBTdWNjZXNzZnVsbHkgcmVjb3ZlcmVkICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYWN0aW9uX25hbWVbXSA9IHsKKwlbRkFJTEVEXSA9ICJGYWlsZWQiLAorCVtERUxBWUVEXSA9ICJEZWxheWVkIiwKKwlbSUdOT1JFRF0gPSAiSWdub3JlZCIsCisJW1JFQ09WRVJFRF0gPSAiUmVjb3ZlcmVkIiwKK307CisKKy8qCisgKiBFcnJvciBoaXQga2VybmVsIHBhZ2UuCisgKiBEbyBub3RoaW5nLCB0cnkgdG8gYmUgbHVja3kgYW5kIG5vdCB0b3VjaCB0aGlzIGluc3RlYWQuIEZvciBhIGZldyBjYXNlcyB3ZQorICogY291bGQgYmUgbW9yZSBzb3BoaXN0aWNhdGVkLgorICovCitzdGF0aWMgaW50IG1lX2tlcm5lbChzdHJ1Y3QgcGFnZSAqcCwgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJcmV0dXJuIERFTEFZRUQ7Cit9CisKKy8qCisgKiBBbHJlYWR5IHBvaXNvbmVkIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbWVfaWdub3JlKHN0cnVjdCBwYWdlICpwLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlyZXR1cm4gSUdOT1JFRDsKK30KKworLyoKKyAqIFBhZ2UgaW4gdW5rbm93biBzdGF0ZS4gRG8gbm90aGluZy4KKyAqLworc3RhdGljIGludCBtZV91bmtub3duKHN0cnVjdCBwYWdlICpwLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlwcmludGsoS0VSTl9FUlIgIk1DRSAlI2x4OiBVbmtub3duIHBhZ2Ugc3RhdGVcbiIsIHBmbik7CisJcmV0dXJuIEZBSUxFRDsKK30KKworLyoKKyAqIEZyZWUgbWVtb3J5CisgKi8KK3N0YXRpYyBpbnQgbWVfZnJlZShzdHJ1Y3QgcGFnZSAqcCwgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJcmV0dXJuIERFTEFZRUQ7Cit9CisKKy8qCisgKiBDbGVhbiAob3IgY2xlYW5lZCkgcGFnZSBjYWNoZSBwYWdlLgorICovCitzdGF0aWMgaW50IG1lX3BhZ2VjYWNoZV9jbGVhbihzdHJ1Y3QgcGFnZSAqcCwgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJaW50IGVycjsKKwlpbnQgcmV0ID0gRkFJTEVEOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCisJLyoKKwkgKiBGb3IgYW5vbnltb3VzIHBhZ2VzIHdlJ3JlIGRvbmUgdGhlIG9ubHkgcmVmZXJlbmNlIGxlZnQKKwkgKiBzaG91bGQgYmUgdGhlIG9uZSBtX2YoKSBob2xkcy4KKwkgKi8KKwlpZiAoUGFnZUFub24ocCkpCisJCXJldHVybiBSRUNPVkVSRUQ7CisKKwkvKgorCSAqIE5vdyB0cnVuY2F0ZSB0aGUgcGFnZSBpbiB0aGUgcGFnZSBjYWNoZS4gVGhpcyBpcyByZWFsbHkKKwkgKiBtb3JlIGxpa2UgYSAidGVtcG9yYXJ5IGhvbGUgcHVuY2giCisJICogRG9uJ3QgZG8gdGhpcyBmb3IgYmxvY2sgZGV2aWNlcyB3aGVuIHNvbWVvbmUgZWxzZQorCSAqIGhhcyBhIHJlZmVyZW5jZSwgYmVjYXVzZSBpdCBjb3VsZCBiZSBmaWxlIHN5c3RlbSBtZXRhZGF0YQorCSAqIGFuZCB0aGF0J3Mgbm90IHNhZmUgdG8gdHJ1bmNhdGUuCisJICovCisJbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwKTsKKwlpZiAoIW1hcHBpbmcpIHsKKwkJLyoKKwkJICogUGFnZSBoYXMgYmVlbiB0ZWFyZWQgZG93biBpbiB0aGUgbWVhbndoaWxlCisJCSAqLworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCS8qCisJICogVHJ1bmNhdGlvbiBpcyBhIGJpdCB0cmlja3kuIEVuYWJsZSBpdCBwZXIgZmlsZSBzeXN0ZW0gZm9yIG5vdy4KKwkgKgorCSAqIE9wZW46IHRvIHRha2UgaV9tdXRleCBvciBub3QgZm9yIHRoaXM/IFJpZ2h0IG5vdyB3ZSBkb24ndC4KKwkgKi8KKwlpZiAobWFwcGluZy0+YV9vcHMtPmVycm9yX3JlbW92ZV9wYWdlKSB7CisJCWVyciA9IG1hcHBpbmctPmFfb3BzLT5lcnJvcl9yZW1vdmVfcGFnZShtYXBwaW5nLCBwKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJNQ0UgJSNseDogRmFpbGVkIHRvIHB1bmNoIHBhZ2U6ICVkXG4iLAorCQkJCQlwZm4sIGVycik7CisJCX0gZWxzZSBpZiAocGFnZV9oYXNfcHJpdmF0ZShwKSAmJgorCQkJCSF0cnlfdG9fcmVsZWFzZV9wYWdlKHAsIEdGUF9OT0lPKSkgeworCQkJcHJfZGVidWcoIk1DRSAlI2x4OiBmYWlsZWQgdG8gcmVsZWFzZSBidWZmZXJzXG4iLCBwZm4pOworCQl9IGVsc2UgeworCQkJcmV0ID0gUkVDT1ZFUkVEOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgdGhlIGZpbGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdCBqdXN0IGludmFsaWRhdGUKKwkJICogVGhpcyBmYWlscyBvbiBkaXJ0eSBvciBhbnl0aGluZyB3aXRoIHByaXZhdGUgcGFnZXMKKwkJICovCisJCWlmIChpbnZhbGlkYXRlX2lub2RlX3BhZ2UocCkpCisJCQlyZXQgPSBSRUNPVkVSRUQ7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIk1DRSAlI2x4OiBGYWlsZWQgdG8gaW52YWxpZGF0ZVxuIiwKKwkJCQlwZm4pOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRGlydHkgY2FjaGUgcGFnZSBwYWdlCisgKiBJc3N1ZXM6IHdoZW4gdGhlIGVycm9yIGhpdCBhIGhvbGUgcGFnZSB0aGUgZXJyb3IgaXMgbm90IHByb3Blcmx5CisgKiBwcm9wYWdhdGVkLgorICovCitzdGF0aWMgaW50IG1lX3BhZ2VjYWNoZV9kaXJ0eShzdHJ1Y3QgcGFnZSAqcCwgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocCk7CisKKwlTZXRQYWdlRXJyb3IocCk7CisJLyogVEJEOiBwcmludCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlLiAqLworCWlmIChtYXBwaW5nKSB7CisJCS8qCisJCSAqIElPIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYnkgd3JpdGUoKSwgZnN5bmMoKSwgZXRjLgorCQkgKiB3aG8gY2hlY2sgdGhlIG1hcHBpbmcuCisJCSAqIFRoaXMgd2F5IHRoZSBhcHBsaWNhdGlvbiBrbm93cyB0aGF0IHNvbWV0aGluZyB3ZW50CisJCSAqIHdyb25nIHdpdGggaXRzIGRpcnR5IGZpbGUgZGF0YS4KKwkJICoKKwkJICogVGhlcmUncyBvbmUgb3BlbiBpc3N1ZToKKwkJICoKKwkJICogVGhlIEVJTyB3aWxsIGJlIG9ubHkgcmVwb3J0ZWQgb24gdGhlIG5leHQgSU8KKwkJICogb3BlcmF0aW9uIGFuZCB0aGVuIGNsZWFyZWQgdGhyb3VnaCB0aGUgSU8gbWFwLgorCQkgKiBOb3JtYWxseSBMaW51eCBoYXMgdHdvIG1lY2hhbmlzbXMgdG8gcGFzcyBJTyBlcnJvcgorCQkgKiBmaXJzdCB0aHJvdWdoIHRoZSBBU19FSU8gZmxhZyBpbiB0aGUgYWRkcmVzcyBzcGFjZQorCQkgKiBhbmQgdGhlbiB0aHJvdWdoIHRoZSBQYWdlRXJyb3IgZmxhZyBpbiB0aGUgcGFnZS4KKwkJICogU2luY2Ugd2UgZHJvcCBwYWdlcyBvbiBtZW1vcnkgZmFpbHVyZSBoYW5kbGluZyB0aGUKKwkJICogb25seSBtZWNoYW5pc20gb3BlbiB0byB1c2UgaXMgdGhyb3VnaCBBU19BSU8uCisJCSAqCisJCSAqIFRoaXMgaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCBpdCBnZXRzIGNsZWFyZWQgb24KKwkJICogdGhlIGZpcnN0IG9wZXJhdGlvbiB0aGF0IHJldHVybnMgYW4gZXJyb3IsIHdoaWxlCisJCSAqIHRoZSBQYWdlRXJyb3IgYml0IGlzIG1vcmUgc3RpY2t5IGFuZCBvbmx5IGNsZWFyZWQKKwkJICogd2hlbiB0aGUgcGFnZSBpcyByZXJlYWQgb3IgZHJvcHBlZC4gIElmIGFuCisJCSAqIGFwcGxpY2F0aW9uIGFzc3VtZXMgaXQgd2lsbCBhbHdheXMgZ2V0IGVycm9yIG9uCisJCSAqIGZzeW5jLCBidXQgZG9lcyBvdGhlciBvcGVyYXRpb25zIG9uIHRoZSBmZCBiZWZvcmUKKwkJICogYW5kIHRoZSBwYWdlIGlzIGRyb3BwZWQgaW5iZXR3ZWVuIHRoZW4gdGhlIGVycm9yCisJCSAqIHdpbGwgbm90IGJlIHByb3Blcmx5IHJlcG9ydGVkLgorCQkgKgorCQkgKiBUaGlzIGNhbiBhbHJlYWR5IGhhcHBlbiBldmVuIHdpdGhvdXQgaHdwb2lzb25lZAorCQkgKiBwYWdlczogZmlyc3Qgb24gbWV0YWRhdGEgSU8gZXJyb3JzICh3aGljaCBvbmx5CisJCSAqIHJlcG9ydCB0aHJvdWdoIEFTX0VJTykgb3Igd2hlbiB0aGUgcGFnZSBpcyBkcm9wcGVkCisJCSAqIGF0IHRoZSB3cm9uZyB0aW1lLgorCQkgKgorCQkgKiBTbyByaWdodCBub3cgd2UgYXNzdW1lIHRoYXQgdGhlIGFwcGxpY2F0aW9uIERUUlQgb24KKwkJICogdGhlIGZpcnN0IEVJTywgYnV0IHdlJ3JlIG5vdCB3b3JzZSB0aGFuIG90aGVyIHBhcnRzCisJCSAqIG9mIHRoZSBrZXJuZWwuCisJCSAqLworCQltYXBwaW5nX3NldF9lcnJvcihtYXBwaW5nLCBFSU8pOworCX0KKworCXJldHVybiBtZV9wYWdlY2FjaGVfY2xlYW4ocCwgcGZuKTsKK30KKworLyoKKyAqIENsZWFuIGFuZCBkaXJ0eSBzd2FwIGNhY2hlLgorICoKKyAqIERpcnR5IHN3YXAgY2FjaGUgcGFnZSBpcyB0cmlja3kgdG8gaGFuZGxlLiBUaGUgcGFnZSBjb3VsZCBsaXZlIGJvdGggaW4gcGFnZQorICogY2FjaGUgYW5kIHN3YXAgY2FjaGUoaWUuIHBhZ2UgaXMgZnJlc2hseSBzd2FwcGVkIGluKS4gU28gaXQgY291bGQgYmUKKyAqIHJlZmVyZW5jZWQgY29uY3VycmVudGx5IGJ5IDIgdHlwZXMgb2YgUFRFczoKKyAqIG5vcm1hbCBQVEVzIGFuZCBzd2FwIFBURXMuIFdlIHRyeSB0byBoYW5kbGUgdGhlbSBjb25zaXN0ZW50bHkgYnkgY2FsbGluZworICogdHJ5X3RvX3VubWFwKFRUVV9JR05PUkVfSFdQT0lTT04pIHRvIGNvbnZlcnQgdGhlIG5vcm1hbCBQVEVzIHRvIHN3YXAgUFRFcywKKyAqIGFuZCB0aGVuCisgKiAgICAgIC0gY2xlYXIgZGlydHkgYml0IHRvIHByZXZlbnQgSU8KKyAqICAgICAgLSByZW1vdmUgZnJvbSBMUlUKKyAqICAgICAgLSBidXQga2VlcCBpbiB0aGUgc3dhcCBjYWNoZSwgc28gdGhhdCB3aGVuIHdlIHJldHVybiB0byBpdCBvbgorICogICAgICAgIGEgbGF0ZXIgcGFnZSBmYXVsdCwgd2Uga25vdyB0aGUgYXBwbGljYXRpb24gaXMgYWNjZXNzaW5nCisgKiAgICAgICAgY29ycnVwdGVkIGRhdGEgYW5kIHNoYWxsIGJlIGtpbGxlZCAod2UgaW5zdGFsbGVkIHNpbXBsZQorICogICAgICAgIGludGVyY2VwdGlvbiBjb2RlIGluIGRvX3N3YXBfcGFnZSB0byBjYXRjaCBpdCkuCisgKgorICogQ2xlYW4gc3dhcCBjYWNoZSBwYWdlcyBjYW4gYmUgZGlyZWN0bHkgaXNvbGF0ZWQuIEEgbGF0ZXIgcGFnZSBmYXVsdCB3aWxsCisgKiBicmluZyBpbiB0aGUga25vd24gZ29vZCBkYXRhIGZyb20gZGlzay4KKyAqLworc3RhdGljIGludCBtZV9zd2FwY2FjaGVfZGlydHkoc3RydWN0IHBhZ2UgKnAsIHVuc2lnbmVkIGxvbmcgcGZuKQoreworCUNsZWFyUGFnZURpcnR5KHApOworCS8qIFRyaWdnZXIgRUlPIGluIHNobWVtOiAqLworCUNsZWFyUGFnZVVwdG9kYXRlKHApOworCisJcmV0dXJuIERFTEFZRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3dhcGNhY2hlX2NsZWFuKHN0cnVjdCBwYWdlICpwLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHApOworCisJcmV0dXJuIFJFQ09WRVJFRDsKK30KKworLyoKKyAqIEh1Z2UgcGFnZXMuIE5lZWRzIHdvcmsuCisgKiBJc3N1ZXM6CisgKiBObyBybWFwIHN1cHBvcnQgc28gd2UgY2Fubm90IGZpbmQgdGhlIG9yaWdpbmFsIG1hcHBlci4gSW4gdGhlb3J5IGNvdWxkIHdhbGsKKyAqIGFsbCBNTXMgYW5kIGxvb2sgZm9yIHRoZSBtYXBwaW5ncywgYnV0IHRoYXQgd291bGQgYmUgbm9uIGF0b21pYyBhbmQgcmFjeS4KKyAqIE5lZWQgcm1hcCBmb3IgaHVnZXBhZ2VzIGZvciB0aGlzLiBBbHRlcm5hdGl2ZWx5IHdlIGNvdWxkIGVtcGxveSBhIGhldXJpc3RpYywKKyAqIGxpa2UganVzdCB3YWxraW5nIHRoZSBjdXJyZW50IHByb2Nlc3MgYW5kIGhvcGluZyBpdCBoYXMgaXQgbWFwcGVkICh0aGF0CisgKiBzaG91bGQgYmUgdXN1YWxseSB0cnVlIGZvciB0aGUgY29tbW9uICJzaGFyZWQgZGF0YWJhc2UgY2FjaGUiIGNhc2UpCisgKiBTaG91bGQgaGFuZGxlIGZyZWUgaHVnZSBwYWdlcyBhbmQgZGVxdWV1ZSB0aGVtIHRvbywgYnV0IHRoaXMgbmVlZHMgdG8KKyAqIGhhbmRsZSBodWdlIHBhZ2UgYWNjb3VudGluZyBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyBpbnQgbWVfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCisvKgorICogVmFyaW91cyBwYWdlIHN0YXRlcyB3ZSBjYW4gaGFuZGxlLgorICoKKyAqIEEgcGFnZSBzdGF0ZSBpcyBkZWZpbmVkIGJ5IGl0cyBjdXJyZW50IHBhZ2UtPmZsYWdzIGJpdHMuCisgKiBUaGUgdGFibGUgbWF0Y2hlcyB0aGVtIGluIG9yZGVyIGFuZCBjYWxscyB0aGUgcmlnaHQgaGFuZGxlci4KKyAqCisgKiBUaGlzIGlzIHF1aXRlIHRyaWNreSBiZWNhdXNlIHdlIGNhbiBhY2Nlc3MgcGFnZSBhdCBhbnkgdGltZQorICogaW4gaXRzIGxpdmUgY3ljbGUsIHNvIGFsbCBhY2Nlc3NlcyBoYXZlIHRvIGJlIGV4dHJlbWx5IGNhcmVmdWwuCisgKgorICogVGhpcyBpcyBub3QgY29tcGxldGUuIE1vcmUgc3RhdGVzIGNvdWxkIGJlIGFkZGVkLgorICogRm9yIGFueSBtaXNzaW5nIHN0YXRlIGRvbid0IGF0dGVtcHQgcmVjb3ZlcnkuCisgKi8KKworI2RlZmluZSBkaXJ0eQkJKDFVTCA8PCBQR19kaXJ0eSkKKyNkZWZpbmUgc2MJCSgxVUwgPDwgUEdfc3dhcGNhY2hlKQorI2RlZmluZSB1bmV2aWN0CQkoMVVMIDw8IFBHX3VuZXZpY3RhYmxlKQorI2RlZmluZSBtbG9jawkJKDFVTCA8PCBQR19tbG9ja2VkKQorI2RlZmluZSB3cml0ZWJhY2sJKDFVTCA8PCBQR193cml0ZWJhY2spCisjZGVmaW5lIGxydQkJKDFVTCA8PCBQR19scnUpCisjZGVmaW5lIHN3YXBiYWNrZWQJKDFVTCA8PCBQR19zd2FwYmFja2VkKQorI2RlZmluZSBoZWFkCQkoMVVMIDw8IFBHX2hlYWQpCisjZGVmaW5lIHRhaWwJCSgxVUwgPDwgUEdfdGFpbCkKKyNkZWZpbmUgY29tcG91bmQJKDFVTCA8PCBQR19jb21wb3VuZCkKKyNkZWZpbmUgc2xhYgkJKDFVTCA8PCBQR19zbGFiKQorI2RlZmluZSBidWRkeQkJKDFVTCA8PCBQR19idWRkeSkKKyNkZWZpbmUgcmVzZXJ2ZWQJKDFVTCA8PCBQR19yZXNlcnZlZCkKKworc3RhdGljIHN0cnVjdCBwYWdlX3N0YXRlIHsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyByZXM7CisJY2hhciAqbXNnOworCWludCAoKmFjdGlvbikoc3RydWN0IHBhZ2UgKnAsIHVuc2lnbmVkIGxvbmcgcGZuKTsKK30gZXJyb3Jfc3RhdGVzW10gPSB7CisJeyByZXNlcnZlZCwJcmVzZXJ2ZWQsCSJyZXNlcnZlZCBrZXJuZWwiLAltZV9pZ25vcmUgfSwKKwl7IGJ1ZGR5LAlidWRkeSwJCSJmcmVlIGtlcm5lbCIsCW1lX2ZyZWUgfSwKKworCS8qCisJICogQ291bGQgaW4gdGhlb3J5IGNoZWNrIGlmIHNsYWIgcGFnZSBpcyBmcmVlIG9yIGlmIHdlIGNhbiBkcm9wCisJICogY3VycmVudGx5IHVudXNlZCBvYmplY3RzIHdpdGhvdXQgdG91Y2hpbmcgdGhlbS4gQnV0IGp1c3QKKwkgKiB0cmVhdCBpdCBhcyBzdGFuZGFyZCBrZXJuZWwgZm9yIG5vdy4KKwkgKi8KKwl7IHNsYWIsCQlzbGFiLAkJImtlcm5lbCBzbGFiIiwJbWVfa2VybmVsIH0sCisKKyNpZmRlZiBDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVECisJeyBoZWFkLAkJaGVhZCwJCSJodWdlIiwJCW1lX2h1Z2VfcGFnZSB9LAorCXsgdGFpbCwJCXRhaWwsCQkiaHVnZSIsCQltZV9odWdlX3BhZ2UgfSwKKyNlbHNlCisJeyBjb21wb3VuZCwJY29tcG91bmQsCSJodWdlIiwJCW1lX2h1Z2VfcGFnZSB9LAorI2VuZGlmCisKKwl7IHNjfGRpcnR5LAlzY3xkaXJ0eSwJInN3YXBjYWNoZSIsCW1lX3N3YXBjYWNoZV9kaXJ0eSB9LAorCXsgc2N8ZGlydHksCXNjLAkJInN3YXBjYWNoZSIsCW1lX3N3YXBjYWNoZV9jbGVhbiB9LAorCisJeyB1bmV2aWN0fGRpcnR5LCB1bmV2aWN0fGRpcnR5LAkidW5ldmljdGFibGUgTFJVIiwgbWVfcGFnZWNhY2hlX2RpcnR5fSwKKwl7IHVuZXZpY3QsCXVuZXZpY3QsCSJ1bmV2aWN0YWJsZSBMUlUiLCBtZV9wYWdlY2FjaGVfY2xlYW59LAorCisjaWZkZWYgQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVAorCXsgbWxvY2t8ZGlydHksCW1sb2NrfGRpcnR5LAkibWxvY2tlZCBMUlUiLAltZV9wYWdlY2FjaGVfZGlydHkgfSwKKwl7IG1sb2NrLAltbG9jaywJCSJtbG9ja2VkIExSVSIsCW1lX3BhZ2VjYWNoZV9jbGVhbiB9LAorI2VuZGlmCisKKwl7IGxydXxkaXJ0eSwJbHJ1fGRpcnR5LAkiTFJVIiwJCW1lX3BhZ2VjYWNoZV9kaXJ0eSB9LAorCXsgbHJ1fGRpcnR5LAlscnUsCQkiY2xlYW4gTFJVIiwJbWVfcGFnZWNhY2hlX2NsZWFuIH0sCisJeyBzd2FwYmFja2VkLAlzd2FwYmFja2VkLAkiYW5vbnltb3VzIiwJbWVfcGFnZWNhY2hlX2NsZWFuIH0sCisKKwkvKgorCSAqIENhdGNoYWxsIGVudHJ5OiBtdXN0IGJlIGF0IGVuZC4KKwkgKi8KKwl7IDAsCQkwLAkJInVua25vd24gcGFnZSBzdGF0ZSIsCW1lX3Vua25vd24gfSwKK307CisKK3N0YXRpYyB2b2lkIGFjdGlvbl9yZXN1bHQodW5zaWduZWQgbG9uZyBwZm4sIGNoYXIgKm1zZywgaW50IHJlc3VsdCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJaWYgKHBmbl92YWxpZChwZm4pKQorCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKworCXByaW50ayhLRVJOX0VSUiAiTUNFICUjbHg6ICVzJXMgcGFnZSByZWNvdmVyeTogJXNcbiIsCisJCXBmbiwKKwkJcGFnZSAmJiBQYWdlRGlydHkocGFnZSkgPyAiZGlydHkgIiA6ICIiLAorCQltc2csIGFjdGlvbl9uYW1lW3Jlc3VsdF0pOworfQorCitzdGF0aWMgaW50IHBhZ2VfYWN0aW9uKHN0cnVjdCBwYWdlX3N0YXRlICpwcywgc3RydWN0IHBhZ2UgKnAsCisJCQl1bnNpZ25lZCBsb25nIHBmbiwgaW50IHJlZikKK3sKKwlpbnQgcmVzdWx0OworCWludCBjb3VudDsKKworCXJlc3VsdCA9IHBzLT5hY3Rpb24ocCwgcGZuKTsKKwlhY3Rpb25fcmVzdWx0KHBmbiwgcHMtPm1zZywgcmVzdWx0KTsKKworCWNvdW50ID0gcGFnZV9jb3VudChwKSAtIDEgLSByZWY7CisJaWYgKGNvdW50ICE9IDApCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIk1DRSAlI2x4OiAlcyBwYWdlIHN0aWxsIHJlZmVyZW5jZWQgYnkgJWQgdXNlcnNcbiIsCisJCSAgICAgICBwZm4sIHBzLT5tc2csIGNvdW50KTsKKworCS8qIENvdWxkIGRvIG1vcmUgY2hlY2tzIGhlcmUgaWYgcGFnZSBsb29rcyBvayAqLworCS8qCisJICogQ291bGQgYWRqdXN0IHpvbmUgY291bnRlcnMgaGVyZSB0byBjb3JyZWN0IGZvciB0aGUgbWlzc2luZyBwYWdlLgorCSAqLworCisJcmV0dXJuIHJlc3VsdCA9PSBSRUNPVkVSRUQgPyAwIDogLUVCVVNZOworfQorCisjZGVmaW5lIE5fVU5NQVBfVFJJRVMgNQorCisvKgorICogRG8gYWxsIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIHJlbW92ZSB1c2VyIHNwYWNlIG1hcHBpbmdzLiBVbm1hcAorICogdGhlIHBhZ2VzIGFuZCBzZW5kIFNJR0JVUyB0byB0aGUgcHJvY2Vzc2VzIGlmIHRoZSBkYXRhIHdhcyBkaXJ0eS4KKyAqLworc3RhdGljIHZvaWQgaHdwb2lzb25fdXNlcl9tYXBwaW5ncyhzdHJ1Y3QgcGFnZSAqcCwgdW5zaWduZWQgbG9uZyBwZm4sCisJCQkJICBpbnQgdHJhcG5vKQoreworCWVudW0gdHR1X2ZsYWdzIHR0dSA9IFRUVV9VTk1BUCB8IFRUVV9JR05PUkVfTUxPQ0sgfCBUVFVfSUdOT1JFX0FDQ0VTUzsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlMSVNUX0hFQUQodG9raWxsKTsKKwlpbnQgcmV0OworCWludCBpOworCWludCBraWxsID0gMTsKKworCWlmIChQYWdlUmVzZXJ2ZWQocCkgfHwgUGFnZUNvbXBvdW5kKHApIHx8IFBhZ2VTbGFiKHApIHx8IFBhZ2VLc20ocCkpCisJCXJldHVybjsKKworCS8qCisJICogVGhpcyBjaGVjayBpbXBsaWVzIHdlIGRvbid0IGtpbGwgcHJvY2Vzc2VzIGlmIHRoZWlyIHBhZ2VzCisJICogYXJlIGluIHRoZSBzd2FwIGNhY2hlIGVhcmx5LiBUaG9zZSBhcmUgYWx3YXlzIGxhdGUga2lsbHMuCisJICovCisJaWYgKCFwYWdlX21hcHBlZChwKSkKKwkJcmV0dXJuOworCisJaWYgKFBhZ2VTd2FwQ2FjaGUocCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiTUNFICUjbHg6IGtlZXBpbmcgcG9pc29uZWQgcGFnZSBpbiBzd2FwIGNhY2hlXG4iLCBwZm4pOworCQl0dHUgfD0gVFRVX0lHTk9SRV9IV1BPSVNPTjsKKwl9CisKKwkvKgorCSAqIFByb3BhZ2F0ZSB0aGUgZGlydHkgYml0IGZyb20gUFRFcyB0byBzdHJ1Y3QgcGFnZSBmaXJzdCwgYmVjYXVzZSB3ZQorCSAqIG5lZWQgdGhpcyB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIGtpbGwgb3IganVzdCBkcm9wIHRoZSBwYWdlLgorCSAqLworCW1hcHBpbmcgPSBwYWdlX21hcHBpbmcocCk7CisJaWYgKCFQYWdlRGlydHkocCkgJiYgbWFwcGluZyAmJiBtYXBwaW5nX2NhcF93cml0ZWJhY2tfZGlydHkobWFwcGluZykpIHsKKwkJaWYgKHBhZ2VfbWtjbGVhbihwKSkgeworCQkJU2V0UGFnZURpcnR5KHApOworCQl9IGVsc2UgeworCQkJa2lsbCA9IDA7CisJCQl0dHUgfD0gVFRVX0lHTk9SRV9IV1BPSVNPTjsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkiTUNFICUjbHg6IGNvcnJ1cHRlZCBwYWdlIHdhcyBjbGVhbjogZHJvcHBlZCB3aXRob3V0IHNpZGUgZWZmZWN0c1xuIiwKKwkJCQlwZm4pOworCQl9CisJfQorCisJLyoKKwkgKiBGaXJzdCBjb2xsZWN0IGFsbCB0aGUgcHJvY2Vzc2VzIHRoYXQgaGF2ZSB0aGUgcGFnZQorCSAqIG1hcHBlZCBpbiBkaXJ0eSBmb3JtLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgdHJ5X3RvX3VubWFwLAorCSAqIGJlY2F1c2UgdHR1IHRha2VzIHRoZSBybWFwIGRhdGEgc3RydWN0dXJlcyBkb3duLgorCSAqCisJICogRXJyb3IgaGFuZGxpbmc6IFdlIGlnbm9yZSBlcnJvcnMgaGVyZSBiZWNhdXNlCisJICogdGhlcmUncyBub3RoaW5nIHRoYXQgY2FuIGJlIGRvbmUuCisJICovCisJaWYgKGtpbGwpCisJCWNvbGxlY3RfcHJvY3MocCwgJnRva2lsbCk7CisKKwkvKgorCSAqIHRyeV90b191bm1hcCBjYW4gZmFpbCB0ZW1wb3JhcmlseSBkdWUgdG8gcmFjZXMuCisJICogVHJ5IGEgZmV3IHRpbWVzIChSRUQtUEVOIGJldHRlciBzdHJhdGVneT8pCisJICovCisJZm9yIChpID0gMDsgaSA8IE5fVU5NQVBfVFJJRVM7IGkrKykgeworCQlyZXQgPSB0cnlfdG9fdW5tYXAocCwgdHR1KTsKKwkJaWYgKHJldCA9PSBTV0FQX1NVQ0NFU1MpCisJCQlicmVhazsKKwkJcHJfZGVidWcoIk1DRSAlI2x4OiB0cnlfdG9fdW5tYXAgcmV0cnkgbmVlZGVkICVkXG4iLCBwZm4sICByZXQpOworCX0KKworCWlmIChyZXQgIT0gU1dBUF9TVUNDRVNTKQorCQlwcmludGsoS0VSTl9FUlIgIk1DRSAlI2x4OiBmYWlsZWQgdG8gdW5tYXAgcGFnZSAobWFwY291bnQ9JWQpXG4iLAorCQkJCXBmbiwgcGFnZV9tYXBjb3VudChwKSk7CisKKwkvKgorCSAqIE5vdyB0aGF0IHRoZSBkaXJ0eSBiaXQgaGFzIGJlZW4gcHJvcGFnYXRlZCB0byB0aGUKKwkgKiBzdHJ1Y3QgcGFnZSBhbmQgYWxsIHVubWFwcyBkb25lIHdlIGNhbiBkZWNpZGUgaWYKKwkgKiBraWxsaW5nIGlzIG5lZWRlZCBvciBub3QuICBPbmx5IGtpbGwgd2hlbiB0aGUgcGFnZQorCSAqIHdhcyBkaXJ0eSwgb3RoZXJ3aXNlIHRoZSB0b2tpbGwgbGlzdCBpcyBtZXJlbHkKKwkgKiBmcmVlZC4gIFdoZW4gdGhlcmUgd2FzIGEgcHJvYmxlbSB1bm1hcHBpbmcgZWFybGllcgorCSAqIHVzZSBhIG1vcmUgZm9yY2UtZnVsbCB1bmNhdGNoYWJsZSBraWxsIHRvIHByZXZlbnQKKwkgKiBhbnkgYWNjZXNzZXMgdG8gdGhlIHBvaXNvbmVkIG1lbW9yeS4KKwkgKi8KKwlraWxsX3Byb2NzX2FvKCZ0b2tpbGwsICEhUGFnZURpcnR5KHApLCB0cmFwbm8sCisJCSAgICAgIHJldCAhPSBTV0FQX1NVQ0NFU1MsIHBmbik7Cit9CisKK2ludCBfX21lbW9yeV9mYWlsdXJlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgdHJhcG5vLCBpbnQgcmVmKQoreworCXVuc2lnbmVkIGxvbmcgbHJ1X2ZsYWc7CisJc3RydWN0IHBhZ2Vfc3RhdGUgKnBzOworCXN0cnVjdCBwYWdlICpwOworCWludCByZXM7CisKKwlpZiAoIXN5c2N0bF9tZW1vcnlfZmFpbHVyZV9yZWNvdmVyeSkKKwkJcGFuaWMoIk1lbW9yeSBmYWlsdXJlIGZyb20gdHJhcCAlZCBvbiBwYWdlICVseCIsIHRyYXBubywgcGZuKTsKKworCWlmICghcGZuX3ZhbGlkKHBmbikpIHsKKwkJYWN0aW9uX3Jlc3VsdChwZm4sICJtZW1vcnkgb3V0c2lkZSBrZXJuZWwgY29udHJvbCIsIElHTk9SRUQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlpZiAoVGVzdFNldFBhZ2VIV1BvaXNvbihwKSkgeworCQlhY3Rpb25fcmVzdWx0KHBmbiwgImFscmVhZHkgaGFyZHdhcmUgcG9pc29uZWQiLCBJR05PUkVEKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXRvbWljX2xvbmdfYWRkKDEsICZtY2VfYmFkX3BhZ2VzKTsKKworCS8qCisJICogV2UgbmVlZC9jYW4gZG8gbm90aGluZyBhYm91dCBjb3VudD0wIHBhZ2VzLgorCSAqIDEpIGl0J3MgYSBmcmVlIHBhZ2UsIGFuZCB0aGVyZWZvcmUgaW4gc2FmZSBoYW5kOgorCSAqICAgIHByZXBfbmV3X3BhZ2UoKSB3aWxsIGJlIHRoZSBnYXRlIGtlZXBlci4KKwkgKiAyKSBpdCdzIHBhcnQgb2YgYSBub24tY29tcG91bmQgaGlnaCBvcmRlciBwYWdlLgorCSAqICAgIEltcGxpZXMgc29tZSBrZXJuZWwgdXNlcjogY2Fubm90IHN0b3AgdGhlbSBmcm9tCisJICogICAgUi9XIHRoZSBwYWdlOyBsZXQncyBwcmF5IHRoYXQgdGhlIHBhZ2UgaGFzIGJlZW4KKwkgKiAgICB1c2VkIGFuZCB3aWxsIGJlIGZyZWVkIHNvbWUgdGltZSBsYXRlci4KKwkgKiBJbiBmYWN0IGl0J3MgZGFuZ2Vyb3VzIHRvIGRpcmVjdGx5IGJ1bXAgdXAgcGFnZSBjb3VudCBmcm9tIDAsCisJICogdGhhdCBtYXkgbWFrZSBwYWdlX2ZyZWV6ZV9yZWZzKCkvcGFnZV91bmZyZWV6ZV9yZWZzKCkgbWlzbWF0Y2guCisJICovCisJaWYgKCFnZXRfcGFnZV91bmxlc3NfemVybyhjb21wb3VuZF9oZWFkKHApKSkgeworCQlhY3Rpb25fcmVzdWx0KHBmbiwgImZyZWUgb3IgaGlnaCBvcmRlciBrZXJuZWwiLCBJR05PUkVEKTsKKwkJcmV0dXJuIFBhZ2VCdWRkeShjb21wb3VuZF9oZWFkKHApKSA/IDAgOiAtRUJVU1k7CisJfQorCisJLyoKKwkgKiBXZSBpZ25vcmUgbm9uLUxSVSBwYWdlcyBmb3IgZ29vZCByZWFzb25zLgorCSAqIC0gUEdfbG9ja2VkIGlzIG9ubHkgd2VsbCBkZWZpbmVkIGZvciBMUlUgcGFnZXMgYW5kIGEgZmV3IG90aGVycworCSAqIC0gdG8gYXZvaWQgcmFjZXMgd2l0aCBfX3NldF9wYWdlX2xvY2tlZCgpCisJICogLSB0byBhdm9pZCByYWNlcyB3aXRoIF9fU2V0UGFnZVNsYWIqKCkgKGFuZCBtb3JlIG5vbi1hdG9taWMgb3BzKQorCSAqIFRoZSBjaGVjayAodW5uZWNlc3NhcmlseSkgaWdub3JlcyBMUlUgcGFnZXMgYmVpbmcgaXNvbGF0ZWQgYW5kCisJICogd2Fsa2VkIGJ5IHRoZSBwYWdlIHJlY2xhaW0gY29kZSwgaG93ZXZlciB0aGF0J3Mgbm90IGEgYmlnIGxvc3MuCisJICovCisJaWYgKCFQYWdlTFJVKHApKQorCQlscnVfYWRkX2RyYWluX2FsbCgpOworCWxydV9mbGFnID0gcC0+ZmxhZ3MgJiBscnU7CisJaWYgKGlzb2xhdGVfbHJ1X3BhZ2UocCkpIHsKKwkJYWN0aW9uX3Jlc3VsdChwZm4sICJub24gTFJVIiwgSUdOT1JFRCk7CisJCXB1dF9wYWdlKHApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlwYWdlX2NhY2hlX3JlbGVhc2UocCk7CisKKwkvKgorCSAqIExvY2sgdGhlIHBhZ2UgYW5kIHdhaXQgZm9yIHdyaXRlYmFjayB0byBmaW5pc2guCisJICogSXQncyB2ZXJ5IGRpZmZpY3VsdCB0byBtZXNzIHdpdGggcGFnZXMgY3VycmVudGx5IHVuZGVyIElPCisJICogYW5kIGluIG1hbnkgY2FzZXMgaW1wb3NzaWJsZSwgc28gd2UganVzdCBhdm9pZCBpdCBoZXJlLgorCSAqLworCWxvY2tfcGFnZV9ub3N5bmMocCk7CisJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwKTsKKworCS8qCisJICogTm93IHRha2UgY2FyZSBvZiB1c2VyIHNwYWNlIG1hcHBpbmdzLgorCSAqLworCWh3cG9pc29uX3VzZXJfbWFwcGluZ3MocCwgcGZuLCB0cmFwbm8pOworCisJLyoKKwkgKiBUb3JuIGRvd24gYnkgc29tZW9uZSBlbHNlPworCSAqLworCWlmICgobHJ1X2ZsYWcgJiBscnUpICYmICFQYWdlU3dhcENhY2hlKHApICYmIHAtPm1hcHBpbmcgPT0gTlVMTCkgeworCQlhY3Rpb25fcmVzdWx0KHBmbiwgImFscmVhZHkgdHJ1bmNhdGVkIExSVSIsIElHTk9SRUQpOworCQlyZXMgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXMgPSAtRUJVU1k7CisJZm9yIChwcyA9IGVycm9yX3N0YXRlczs7IHBzKyspIHsKKwkJaWYgKCgocC0+ZmxhZ3MgfCBscnVfZmxhZykmIHBzLT5tYXNrKSA9PSBwcy0+cmVzKSB7CisJCQlyZXMgPSBwYWdlX2FjdGlvbihwcywgcCwgcGZuLCByZWYpOworCQkJYnJlYWs7CisJCX0KKwl9CitvdXQ6CisJdW5sb2NrX3BhZ2UocCk7CisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbWVtb3J5X2ZhaWx1cmUpOworCisvKioKKyAqIG1lbW9yeV9mYWlsdXJlIC0gSGFuZGxlIG1lbW9yeSBmYWlsdXJlIG9mIGEgcGFnZS4KKyAqIEBwZm46IFBhZ2UgTnVtYmVyIG9mIHRoZSBjb3JydXB0ZWQgcGFnZQorICogQHRyYXBubzogVHJhcCBudW1iZXIgcmVwb3J0ZWQgaW4gdGhlIHNpZ25hbCB0byB1c2VyIHNwYWNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBsb3cgbGV2ZWwgbWFjaGluZSBjaGVjayBjb2RlCisgKiBvZiBhbiBhcmNoaXRlY3R1cmUgd2hlbiBpdCBkZXRlY3RzIGhhcmR3YXJlIG1lbW9yeSBjb3JydXB0aW9uCisgKiBvZiBhIHBhZ2UuIEl0IHRyaWVzIGl0cyBiZXN0IHRvIHJlY292ZXIsIHdoaWNoIGluY2x1ZGVzCisgKiBkcm9wcGluZyBwYWdlcywga2lsbGluZyBwcm9jZXNzZXMgZXRjLgorICoKKyAqIFRoZSBmdW5jdGlvbiBpcyBwcmltYXJpbHkgb2YgdXNlIGZvciBjb3JydXB0aW9ucyB0aGF0CisgKiBoYXBwZW4gb3V0c2lkZSB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCAoZS5nLiB3aGVuCisgKiBkZXRlY3RlZCBieSBhIGJhY2tncm91bmQgc2NydWJiZXIpCisgKgorICogTXVzdCBydW4gaW4gcHJvY2VzcyBjb250ZXh0IChlLmcuIGEgd29yayBxdWV1ZSkgd2l0aCBpbnRlcnJ1cHRzCisgKiBlbmFibGVkIGFuZCBubyBzcGlubG9ja3MgaG9sZC4KKyAqLwordm9pZCBtZW1vcnlfZmFpbHVyZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IHRyYXBubykKK3sKKwlfX21lbW9yeV9mYWlsdXJlKHBmbiwgdHJhcG5vLCAwKTsKK30KZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggYjE0NDNhYzA3Li42YWIxOWRkIDEwMDY0NAotLS0gYS9tbS9tZW1vcnkuYworKysgYi9tbS9tZW1vcnkuYwpAQCAtMjk3LDcgKzI5Nyw4IEBACiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZtYS0+dm1fc3RhcnQ7CiAKIAkJLyoKLQkJICogSGlkZSB2bWEgZnJvbSBybWFwIGFuZCB2bXRydW5jYXRlIGJlZm9yZSBmcmVlaW5nIHBndGFibGVzCisJCSAqIEhpZGUgdm1hIGZyb20gcm1hcCBhbmQgdHJ1bmNhdGVfcGFnZWNhY2hlIGJlZm9yZSBmcmVlaW5nCisJCSAqIHBndGFibGVzCiAJCSAqLwogCQlhbm9uX3ZtYV91bmxpbmsodm1hKTsKIAkJdW5saW5rX2ZpbGVfdm1hKHZtYSk7CkBAIC02NDAsNiArNjQxLDcgQEAKIAkJcG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKKwlwdGVfdCAqb3JpZ19zcmNfcHRlLCAqb3JpZ19kc3RfcHRlOwogCXB0ZV90ICpzcmNfcHRlLCAqZHN0X3B0ZTsKIAlzcGlubG9ja190ICpzcmNfcHRsLCAqZHN0X3B0bDsKIAlpbnQgcHJvZ3Jlc3MgPSAwOwpAQCAtNjUzLDYgKzY1NSw4IEBACiAJc3JjX3B0ZSA9IHB0ZV9vZmZzZXRfbWFwX25lc3RlZChzcmNfcG1kLCBhZGRyKTsKIAlzcmNfcHRsID0gcHRlX2xvY2twdHIoc3JjX21tLCBzcmNfcG1kKTsKIAlzcGluX2xvY2tfbmVzdGVkKHNyY19wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwlvcmlnX3NyY19wdGUgPSBzcmNfcHRlOworCW9yaWdfZHN0X3B0ZSA9IGRzdF9wdGU7CiAJYXJjaF9lbnRlcl9sYXp5X21tdV9tb2RlKCk7CiAKIAlkbyB7CkBAIC02NzYsOSArNjgwLDkgQEAKIAogCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOwogCXNwaW5fdW5sb2NrKHNyY19wdGwpOwotCXB0ZV91bm1hcF9uZXN0ZWQoc3JjX3B0ZSAtIDEpOworCXB0ZV91bm1hcF9uZXN0ZWQob3JpZ19zcmNfcHRlKTsKIAlhZGRfbW1fcnNzKGRzdF9tbSwgcnNzWzBdLCByc3NbMV0pOwotCXB0ZV91bm1hcF91bmxvY2soZHN0X3B0ZSAtIDEsIGRzdF9wdGwpOworCXB0ZV91bm1hcF91bmxvY2sob3JpZ19kc3RfcHRlLCBkc3RfcHRsKTsKIAljb25kX3Jlc2NoZWQoKTsKIAlpZiAoYWRkciAhPSBlbmQpCiAJCWdvdG8gYWdhaW47CkBAIC0xMzI1LDcgKzEzMjksOCBAQAogCQkJCWlmIChyZXQgJiBWTV9GQVVMVF9FUlJPUikgewogCQkJCQlpZiAocmV0ICYgVk1fRkFVTFRfT09NKQogCQkJCQkJcmV0dXJuIGkgPyBpIDogLUVOT01FTTsKLQkJCQkJZWxzZSBpZiAocmV0ICYgVk1fRkFVTFRfU0lHQlVTKQorCQkJCQlpZiAocmV0ICYKKwkJCQkJICAgIChWTV9GQVVMVF9IV1BPSVNPTnxWTV9GQVVMVF9TSUdCVVMpKQogCQkJCQkJcmV0dXJuIGkgPyBpIDogLUVGQVVMVDsKIAkJCQkJQlVHKCk7CiAJCQkJfQpAQCAtMTgxOCwxMCArMTgyMywxMCBAQAogCXRva2VuID0gcG1kX3BndGFibGUoKnBtZCk7CiAKIAlkbyB7Ci0JCWVyciA9IGZuKHB0ZSwgdG9rZW4sIGFkZHIsIGRhdGEpOworCQllcnIgPSBmbihwdGUrKywgdG9rZW4sIGFkZHIsIGRhdGEpOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7Ci0JfSB3aGlsZSAocHRlKyssIGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CisJfSB3aGlsZSAoYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKIAogCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOwogCkBAIC0yNDA3LDcgKzI0MTIsNyBAQAogICogQG1hcHBpbmc6IHRoZSBhZGRyZXNzIHNwYWNlIGNvbnRhaW5pbmcgbW1hcHMgdG8gYmUgdW5tYXBwZWQuCiAgKiBAaG9sZWJlZ2luOiBieXRlIGluIGZpcnN0IHBhZ2UgdG8gdW5tYXAsIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgogICogdGhlIHVuZGVybHlpbmcgZmlsZS4gIFRoaXMgd2lsbCBiZSByb3VuZGVkIGRvd24gdG8gYSBQQUdFX1NJWkUKLSAqIGJvdW5kYXJ5LiAgTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdm10cnVuY2F0ZSgpLCB3aGljaAorICogYm91bmRhcnkuICBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0cnVuY2F0ZV9wYWdlY2FjaGUoKSwgd2hpY2gKICAqIG11c3Qga2VlcCB0aGUgcGFydGlhbCBwYWdlLiAgSW4gY29udHJhc3QsIHdlIG11c3QgZ2V0IHJpZCBvZgogICogcGFydGlhbCBwYWdlcy4KICAqIEBob2xlbGVuOiBzaXplIG9mIHByb3NwZWN0aXZlIGhvbGUgaW4gYnl0ZXMuICBUaGlzIHdpbGwgYmUgcm91bmRlZApAQCAtMjQ1OCw2MyArMjQ2Myw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHVubWFwX21hcHBpbmdfcmFuZ2UpOwogCi0vKioKLSAqIHZtdHJ1bmNhdGUgLSB1bm1hcCBtYXBwaW5ncyAiZnJlZWQiIGJ5IHRydW5jYXRlKCkgc3lzY2FsbAotICogQGlub2RlOiBpbm9kZSBvZiB0aGUgZmlsZSB1c2VkCi0gKiBAb2Zmc2V0OiBmaWxlIG9mZnNldCB0byBzdGFydCB0cnVuY2F0aW5nCi0gKgotICogTk9URSEgV2UgaGF2ZSB0byBiZSByZWFkeSB0byB1cGRhdGUgdGhlIG1lbW9yeSBzaGFyaW5nCi0gKiBiZXR3ZWVuIHRoZSBmaWxlIGFuZCB0aGUgbWVtb3J5IG1hcCBmb3IgYSBwb3RlbnRpYWwgbGFzdAotICogaW5jb21wbGV0ZSBwYWdlLiAgVWdseSwgYnV0IG5lY2Vzc2FyeS4KLSAqLwotaW50IHZtdHJ1bmNhdGUoc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBvZmZzZXQpCi17Ci0JaWYgKGlub2RlLT5pX3NpemUgPCBvZmZzZXQpIHsKLQkJdW5zaWduZWQgbG9uZyBsaW1pdDsKLQotCQlsaW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfRlNJWkVdLnJsaW1fY3VyOwotCQlpZiAobGltaXQgIT0gUkxJTV9JTkZJTklUWSAmJiBvZmZzZXQgPiBsaW1pdCkKLQkJCWdvdG8gb3V0X3NpZzsKLQkJaWYgKG9mZnNldCA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKQotCQkJZ290byBvdXRfYmlnOwotCQlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZnNldCk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCi0JCS8qCi0JCSAqIHRydW5jYXRpb24gb2YgaW4tdXNlIHN3YXBmaWxlcyBpcyBkaXNhbGxvd2VkIC0gaXQgd291bGQKLQkJICogY2F1c2Ugc3Vic2VxdWVudCBzd2Fwb3V0IHRvIHNjcmliYmxlIG9uIHRoZSBub3ctZnJlZWQKLQkJICogYmxvY2tzLgotCQkgKi8KLQkJaWYgKElTX1NXQVBGSUxFKGlub2RlKSkKLQkJCXJldHVybiAtRVRYVEJTWTsKLQkJaV9zaXplX3dyaXRlKGlub2RlLCBvZmZzZXQpOwotCi0JCS8qCi0JCSAqIHVubWFwX21hcHBpbmdfcmFuZ2UgaXMgY2FsbGVkIHR3aWNlLCBmaXJzdCBzaW1wbHkgZm9yCi0JCSAqIGVmZmljaWVuY3kgc28gdGhhdCB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBkb2VzIGZld2VyCi0JCSAqIHNpbmdsZS1wYWdlIHVubWFwcy4gIEhvd2V2ZXIgYWZ0ZXIgdGhpcyBmaXJzdCBjYWxsLCBhbmQKLQkJICogYmVmb3JlIHRydW5jYXRlX2lub2RlX3BhZ2VzIGZpbmlzaGVzLCBpdCBpcyBwb3NzaWJsZSBmb3IKLQkJICogcHJpdmF0ZSBwYWdlcyB0byBiZSBDT1dlZCwgd2hpY2ggcmVtYWluIGFmdGVyCi0JCSAqIHRydW5jYXRlX2lub2RlX3BhZ2VzIGZpbmlzaGVzLCBoZW5jZSB0aGUgc2Vjb25kCi0JCSAqIHVubWFwX21hcHBpbmdfcmFuZ2UgY2FsbCBtdXN0IGJlIG1hZGUgZm9yIGNvcnJlY3RuZXNzLgotCQkgKi8KLQkJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKLQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMobWFwcGluZywgb2Zmc2V0KTsKLQkJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKLQl9Ci0KLQlpZiAoaW5vZGUtPmlfb3AtPnRydW5jYXRlKQotCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOwotCXJldHVybiAwOwotCi1vdXRfc2lnOgotCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwotb3V0X2JpZzoKLQlyZXR1cm4gLUVGQklHOwotfQotRVhQT1JUX1NZTUJPTCh2bXRydW5jYXRlKTsKLQogaW50IHZtdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGVuZCkKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CkBAIC0yNTU5LDggKzI1MDcsMTUgQEAKIAkJZ290byBvdXQ7CiAKIAllbnRyeSA9IHB0ZV90b19zd3BfZW50cnkob3JpZ19wdGUpOwotCWlmIChpc19taWdyYXRpb25fZW50cnkoZW50cnkpKSB7Ci0JCW1pZ3JhdGlvbl9lbnRyeV93YWl0KG1tLCBwbWQsIGFkZHJlc3MpOworCWlmICh1bmxpa2VseShub25fc3dhcF9lbnRyeShlbnRyeSkpKSB7CisJCWlmIChpc19taWdyYXRpb25fZW50cnkoZW50cnkpKSB7CisJCQltaWdyYXRpb25fZW50cnlfd2FpdChtbSwgcG1kLCBhZGRyZXNzKTsKKwkJfSBlbHNlIGlmIChpc19od3BvaXNvbl9lbnRyeShlbnRyeSkpIHsKKwkJCXJldCA9IFZNX0ZBVUxUX0hXUE9JU09OOworCQl9IGVsc2UgeworCQkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHJlc3MsIG9yaWdfcHRlLCBOVUxMKTsKKwkJCXJldCA9IFZNX0ZBVUxUX09PTTsKKwkJfQogCQlnb3RvIG91dDsKIAl9CiAJZGVsYXlhY2N0X3NldF9mbGFnKERFTEFZQUNDVF9QRl9TV0FQSU4pOwpAQCAtMjU4NCw2ICsyNTM5LDEwIEBACiAJCS8qIEhhZCB0byByZWFkIHRoZSBwYWdlIGZyb20gc3dhcCBhcmVhOiBNYWpvciBmYXVsdCAqLwogCQlyZXQgPSBWTV9GQVVMVF9NQUpPUjsKIAkJY291bnRfdm1fZXZlbnQoUEdNQUpGQVVMVCk7CisJfSBlbHNlIGlmIChQYWdlSFdQb2lzb24ocGFnZSkpIHsKKwkJcmV0ID0gVk1fRkFVTFRfSFdQT0lTT047CisJCWRlbGF5YWNjdF9jbGVhcl9mbGFnKERFTEFZQUNDVF9QRl9TV0FQSU4pOworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCWxvY2tfcGFnZShwYWdlKTsKQEAgLTI2NTUsNiArMjYxNCw3IEBACiAJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOwogb3V0X3BhZ2U6CiAJdW5sb2NrX3BhZ2UocGFnZSk7CitvdXRfcmVsZWFzZToKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI3NjAsNiArMjcyMCwxMiBAQAogCWlmICh1bmxpa2VseShyZXQgJiAoVk1fRkFVTFRfRVJST1IgfCBWTV9GQVVMVF9OT1BBR0UpKSkKIAkJcmV0dXJuIHJldDsKIAorCWlmICh1bmxpa2VseShQYWdlSFdQb2lzb24odm1mLnBhZ2UpKSkgeworCQlpZiAocmV0ICYgVk1fRkFVTFRfTE9DS0VEKQorCQkJdW5sb2NrX3BhZ2Uodm1mLnBhZ2UpOworCQlyZXR1cm4gVk1fRkFVTFRfSFdQT0lTT047CisJfQorCiAJLyoKIAkgKiBGb3IgY29uc2lzdGVuY3kgaW4gc3Vic2VxdWVudCBjYWxscywgbWFrZSB0aGUgZmF1bHRlZCBwYWdlIGFsd2F5cwogCSAqIGxvY2tlZC4KZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggN2RkOWQ5Zi4uNDU0NWQ1OSAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTEwMjQsNyArMTAyNCw3IEBACiAKIAkJZXJyID0gbWlncmF0ZV9wcmVwKCk7CiAJCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOworCQkJZ290byBtcG9sX291dDsKIAl9CiAJewogCQlOT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpOwpAQCAtMTAzOSwxMCArMTAzOSw5IEBACiAJCQllcnIgPSAtRU5PTUVNOwogCQlOT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7CiAJfQotCWlmIChlcnIpIHsKLQkJbXBvbF9wdXQobmV3KTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaWYgKGVycikKKwkJZ290byBtcG9sX291dDsKKwogCXZtYSA9IGNoZWNrX3JhbmdlKG1tLCBzdGFydCwgZW5kLCBubWFzaywKIAkJCSAgZmxhZ3MgfCBNUE9MX01GX0lOVkVSVCwgJnBhZ2VsaXN0KTsKIApAQCAtMTA1OCw5ICsxMDU3LDExIEBACiAKIAkJaWYgKCFlcnIgJiYgbnJfZmFpbGVkICYmIChmbGFncyAmIE1QT0xfTUZfU1RSSUNUKSkKIAkJCWVyciA9IC1FSU87Ci0JfQorCX0gZWxzZQorCQlwdXRiYWNrX2xydV9wYWdlcygmcGFnZWxpc3QpOwogCiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisgbXBvbF9vdXQ6CiAJbXBvbF9wdXQobmV3KTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IDE2MDUyZTguLjFhNGJmNDggMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTY3NSw3ICs2NzUsNyBAQAogCX0KIAogCS8qIEVzdGFibGlzaCBtaWdyYXRpb24gcHRlcyBvciByZW1vdmUgcHRlcyAqLwotCXRyeV90b191bm1hcChwYWdlLCAxKTsKKwl0cnlfdG9fdW5tYXAocGFnZSwgVFRVX01JR1JBVElPTnxUVFVfSUdOT1JFX01MT0NLfFRUVV9JR05PUkVfQUNDRVNTKTsKIAogc2tpcF91bm1hcDoKIAlpZiAoIXBhZ2VfbWFwcGVkKHBhZ2UpKQpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IDIxZDQwMjkuLjczZjVlNGIgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTIyODIsNyArMjI4Miw3IEBACiB7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3BlY2lhbF9tYXBwaW5nX3Ztb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzcGVjaWFsX21hcHBpbmdfdm1vcHMgPSB7CiAJLmNsb3NlID0gc3BlY2lhbF9tYXBwaW5nX2Nsb3NlLAogCS5mYXVsdCA9IHNwZWNpYWxfbWFwcGluZ19mYXVsdCwKIH07CmRpZmYgLS1naXQgYS9tbS9tcmVtYXAuYyBiL21tL21yZW1hcC5jCmluZGV4IDIwYTA3ZGIuLjk3YmZmMjUgMTAwNjQ0Ci0tLSBhL21tL21yZW1hcC5jCisrKyBiL21tL21yZW1hcC5jCkBAIC04Niw4ICs4Niw4IEBACiAJaWYgKHZtYS0+dm1fZmlsZSkgewogCQkvKgogCQkgKiBTdWJ0bGUgcG9pbnQgZnJvbSBSYWplc2ggVmVua2F0YXN1YnJhbWFuaWFuOiBiZWZvcmUKLQkJICogbW92aW5nIGZpbGUtYmFzZWQgcHRlcywgd2UgbXVzdCBsb2NrIHZtdHJ1bmNhdGUgb3V0LAotCQkgKiBzaW5jZSBpdCBtaWdodCBjbGVhbiB0aGUgZHN0IHZtYSBiZWZvcmUgdGhlIHNyYyB2bWEsCisJCSAqIG1vdmluZyBmaWxlLWJhc2VkIHB0ZXMsIHdlIG11c3QgbG9jayB0cnVuY2F0ZV9wYWdlY2FjaGUKKwkJICogb3V0LCBzaW5jZSBpdCBtaWdodCBjbGVhbiB0aGUgZHN0IHZtYSBiZWZvcmUgdGhlIHNyYyB2bWEsCiAJCSAqIGFuZCB3ZSBwcm9wYWdhdGUgc3RhbGUgcGFnZXMgaW50byB0aGUgZHN0IGFmdGVyd2FyZC4KIAkJICovCiAJCW1hcHBpbmcgPSB2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZzsKZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IDhkNDg0MjQuLjk4NzZmYTAgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtNzksNTAgKzc5LDEwIEBACiBzdHJ1Y3QgcmJfcm9vdCBub21tdV9yZWdpb25fdHJlZSA9IFJCX1JPT1Q7CiBERUNMQVJFX1JXU0VNKG5vbW11X3JlZ2lvbl9zZW0pOwogCi1zdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZ2VuZXJpY19maWxlX3ZtX29wcyA9IHsKK2NvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBnZW5lcmljX2ZpbGVfdm1fb3BzID0gewogfTsKIAogLyoKLSAqIEhhbmRsZSBhbGwgbWFwcGluZ3MgdGhhdCBnb3QgdHJ1bmNhdGVkIGJ5IGEgInRydW5jYXRlKCkiCi0gKiBzeXN0ZW0gY2FsbC4KLSAqCi0gKiBOT1RFISBXZSBoYXZlIHRvIGJlIHJlYWR5IHRvIHVwZGF0ZSB0aGUgbWVtb3J5IHNoYXJpbmcKLSAqIGJldHdlZW4gdGhlIGZpbGUgYW5kIHRoZSBtZW1vcnkgbWFwIGZvciBhIHBvdGVudGlhbCBsYXN0Ci0gKiBpbmNvbXBsZXRlIHBhZ2UuICBVZ2x5LCBidXQgbmVjZXNzYXJ5LgotICovCi1pbnQgdm10cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0KQotewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OwotCi0JaWYgKGlub2RlLT5pX3NpemUgPCBvZmZzZXQpCi0JCWdvdG8gZG9fZXhwYW5kOwotCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0KTsKLQotCXRydW5jYXRlX2lub2RlX3BhZ2VzKG1hcHBpbmcsIG9mZnNldCk7Ci0JZ290byBvdXRfdHJ1bmNhdGU7Ci0KLWRvX2V4cGFuZDoKLQlsaW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfRlNJWkVdLnJsaW1fY3VyOwotCWlmIChsaW1pdCAhPSBSTElNX0lORklOSVRZICYmIG9mZnNldCA+IGxpbWl0KQotCQlnb3RvIG91dF9zaWc7Ci0JaWYgKG9mZnNldCA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKQotCQlnb3RvIG91dDsKLQlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZnNldCk7Ci0KLW91dF90cnVuY2F0ZToKLQlpZiAoaW5vZGUtPmlfb3AtPnRydW5jYXRlKQotCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOwotCXJldHVybiAwOwotb3V0X3NpZzoKLQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKLW91dDoKLQlyZXR1cm4gLUVGQklHOwotfQotCi1FWFBPUlRfU1lNQk9MKHZtdHJ1bmNhdGUpOwotCi0vKgogICogUmV0dXJuIHRoZSB0b3RhbCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGlzIHBvaW50ZXIsIG5vdAogICoganVzdCB3aGF0IHRoZSBjYWxsZXIgYXNrZWQgZm9yLgogICoKQEAgLTg2Niw3ICs4MjYsNyBAQAogCWludCByZXQ7CiAKIAkvKiBkbyB0aGUgc2ltcGxlIGNoZWNrcyBmaXJzdCAqLwotCWlmIChmbGFncyAmIE1BUF9GSVhFRCB8fCBhZGRyKSB7CisJaWYgKGZsYWdzICYgTUFQX0ZJWEVEKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHCiAJCSAgICAgICAiJWQ6IENhbid0IGRvIGZpeGVkLWFkZHJlc3Mvb3ZlcmxheSBtbWFwIG9mIFJBTVxuIiwKIAkJICAgICAgIGN1cnJlbnQtPnBpZCk7CkBAIC0xMDc0LDcgKzEwMzQsNyBAQAogCXJldCA9IHZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcCh2bWEtPnZtX2ZpbGUsIHZtYSk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCXZtYS0+dm1fcmVnaW9uLT52bV90b3AgPSB2bWEtPnZtX3JlZ2lvbi0+dm1fZW5kOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHJldCAhPSAtRU5PU1lTKQogCQlyZXR1cm4gcmV0OwpAQCAtMTA5MSw3ICsxMDUxLDggQEAKICAqLwogc3RhdGljIGludCBkb19tbWFwX3ByaXZhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkgICBzdHJ1Y3Qgdm1fcmVnaW9uICpyZWdpb24sCi0JCQkgICB1bnNpZ25lZCBsb25nIGxlbikKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJICAgdW5zaWduZWQgbG9uZyBjYXBhYmlsaXRpZXMpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2VzOwogCXVuc2lnbmVkIGxvbmcgdG90YWwsIHBvaW50LCBuLCBybGVuOwpAQCAtMTEwMiwxMyArMTA2MywxMyBAQAogCSAqIHNoYXJlZCBtYXBwaW5ncyBvbiBkZXZpY2VzIG9yIG1lbW9yeQogCSAqIC0gVk1fTUFZU0hBUkUgd2lsbCBiZSBzZXQgaWYgaXQgbWF5IGF0dGVtcHQgdG8gc2hhcmUKIAkgKi8KLQlpZiAodm1hLT52bV9maWxlKSB7CisJaWYgKGNhcGFiaWxpdGllcyAmIEJESV9DQVBfTUFQX0RJUkVDVCkgewogCQlyZXQgPSB2bWEtPnZtX2ZpbGUtPmZfb3AtPm1tYXAodm1hLT52bV9maWxlLCB2bWEpOwogCQlpZiAocmV0ID09IDApIHsKIAkJCS8qIHNob3VsZG4ndCByZXR1cm4gc3VjY2VzcyBpZiB3ZSdyZSBub3Qgc2hhcmluZyAqLwogCQkJQlVHX09OKCEodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSk7CiAJCQl2bWEtPnZtX3JlZ2lvbi0+dm1fdG9wID0gdm1hLT52bV9yZWdpb24tPnZtX2VuZDsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAocmV0ICE9IC1FTk9TWVMpCiAJCQlyZXR1cm4gcmV0OwpAQCAtMTIyMSw5ICsxMTgyLDYgQEAKIAogCWtlbnRlcigiLCVseCwlbHgsJWx4LCVseCwlbHgiLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7CiAKLQlpZiAoIShmbGFncyAmIE1BUF9GSVhFRCkpCi0JCWFkZHIgPSByb3VuZF9oaW50X3RvX21pbihhZGRyKTsKLQogCS8qIGRlY2lkZSB3aGV0aGVyIHdlIHNob3VsZCBhdHRlbXB0IHRoZSBtYXBwaW5nLCBhbmQgaWYgc28gd2hhdCBzb3J0IG9mCiAJICogbWFwcGluZyAqLwogCXJldCA9IHZhbGlkYXRlX21tYXBfcmVxdWVzdChmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZiwKQEAgLTEyMzMsNiArMTE5MSw5IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJLyogd2UgaWdub3JlIHRoZSBhZGRyZXNzIGhpbnQgKi8KKwlhZGRyID0gMDsKKwogCS8qIHdlJ3ZlIGRldGVybWluZWQgdGhhdCB3ZSBjYW4gbWFrZSB0aGUgbWFwcGluZywgbm93IHRyYW5zbGF0ZSB3aGF0IHdlCiAJICogbm93IGtub3cgaW50byBWTUEgZmxhZ3MgKi8KIAl2bV9mbGFncyA9IGRldGVybWluZV92bV9mbGFncyhmaWxlLCBwcm90LCBmbGFncywgY2FwYWJpbGl0aWVzKTsKQEAgLTEzNDYsNyArMTMwNyw3IEBACiAJCSAqIC0gdGhpcyBpcyB0aGUgaG9vayBmb3IgcXVhc2ktbWVtb3J5IGNoYXJhY3RlciBkZXZpY2VzIHRvCiAJCSAqICAgdGVsbCB1cyB0aGUgbG9jYXRpb24gb2YgYSBzaGFyZWQgbWFwcGluZwogCQkgKi8KLQkJaWYgKGZpbGUgJiYgZmlsZS0+Zl9vcC0+Z2V0X3VubWFwcGVkX2FyZWEpIHsKKwkJaWYgKGNhcGFiaWxpdGllcyAmIEJESV9DQVBfTUFQX0RJUkVDVCkgewogCQkJYWRkciA9IGZpbGUtPmZfb3AtPmdldF91bm1hcHBlZF9hcmVhKGZpbGUsIGFkZHIsIGxlbiwKIAkJCQkJCQkgICAgIHBnb2ZmLCBmbGFncyk7CiAJCQlpZiAoSVNfRVJSKCh2b2lkICopIGFkZHIpKSB7CkBAIC0xMzcwLDE1ICsxMzMxLDE3IEBACiAJfQogCiAJdm1hLT52bV9yZWdpb24gPSByZWdpb247Ci0JYWRkX25vbW11X3JlZ2lvbihyZWdpb24pOwogCi0JLyogc2V0IHVwIHRoZSBtYXBwaW5nICovCisJLyogc2V0IHVwIHRoZSBtYXBwaW5nCisJICogLSB0aGUgcmVnaW9uIGlzIGZpbGxlZCBpbiBpZiBCRElfQ0FQX01BUF9ESVJFQ1QgaXMgc3RpbGwgc2V0CisJICovCiAJaWYgKGZpbGUgJiYgdm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkKIAkJcmV0ID0gZG9fbW1hcF9zaGFyZWRfZmlsZSh2bWEpOwogCWVsc2UKLQkJcmV0ID0gZG9fbW1hcF9wcml2YXRlKHZtYSwgcmVnaW9uLCBsZW4pOworCQlyZXQgPSBkb19tbWFwX3ByaXZhdGUodm1hLCByZWdpb24sIGxlbiwgY2FwYWJpbGl0aWVzKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9wdXRfcmVnaW9uOworCQlnb3RvIGVycm9yX2p1c3RfZnJlZTsKKwlhZGRfbm9tbXVfcmVnaW9uKHJlZ2lvbik7CiAKIAkvKiBva2F5Li4uIHdlIGhhdmUgYSBtYXBwaW5nOyBub3cgd2UgaGF2ZSB0byByZWdpc3RlciBpdCAqLwogCXJlc3VsdCA9IHZtYS0+dm1fc3RhcnQ7CkBAIC0xMzk2LDI1ICsxMzU5LDE0IEBACiAJa2xlYXZlKCIgPSAlbHgiLCByZXN1bHQpOwogCXJldHVybiByZXN1bHQ7CiAKLWVycm9yX3B1dF9yZWdpb246Ci0JX19wdXRfbm9tbXVfcmVnaW9uKHJlZ2lvbik7Ci0JaWYgKHZtYSkgewotCQlpZiAodm1hLT52bV9maWxlKSB7Ci0JCQlmcHV0KHZtYS0+dm1fZmlsZSk7Ci0JCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUNVVEFCTEUpCi0JCQkJcmVtb3ZlZF9leGVfZmlsZV92bWEodm1hLT52bV9tbSk7Ci0JCX0KLQkJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwotCX0KLQlrbGVhdmUoIiA9ICVkIFtwcl0iLCByZXQpOwotCXJldHVybiByZXQ7Ci0KIGVycm9yX2p1c3RfZnJlZToKIAl1cF93cml0ZSgmbm9tbXVfcmVnaW9uX3NlbSk7CiBlcnJvcjoKLQlmcHV0KHJlZ2lvbi0+dm1fZmlsZSk7CisJaWYgKHJlZ2lvbi0+dm1fZmlsZSkKKwkJZnB1dChyZWdpb24tPnZtX2ZpbGUpOwogCWttZW1fY2FjaGVfZnJlZSh2bV9yZWdpb25famFyLCByZWdpb24pOwotCWZwdXQodm1hLT52bV9maWxlKTsKKwlpZiAodm1hLT52bV9maWxlKQorCQlmcHV0KHZtYS0+dm1fZmlsZSk7CiAJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDVVRBQkxFKQogCQlyZW1vdmVkX2V4ZV9maWxlX3ZtYSh2bWEtPnZtX21tKTsKIAlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIHZtYSk7CmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCA1ZjM3OGRkNS4uMmM1ZDc5MiAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC00NCwxOCArNDQsMjEgQEAKIC8qCiAgKiBXaGVuIGJhbGFuY2VfZGlydHlfcGFnZXMgZGVjaWRlcyB0aGF0IHRoZSBjYWxsZXIgbmVlZHMgdG8gcGVyZm9ybSBzb21lCiAgKiBub24tYmFja2dyb3VuZCB3cml0ZWJhY2ssIHRoaXMgaXMgaG93IG1hbnkgcGFnZXMgaXQgd2lsbCBhdHRlbXB0IHRvIHdyaXRlLgotICogSXQgc2hvdWxkIGJlIHNvbWV3aGF0IGxhcmdlciB0aGFuIFJBVEVMSU1JVF9QQUdFUyB0byBlbnN1cmUgdGhhdCByZWFzb25hYmx5CisgKiBJdCBzaG91bGQgYmUgc29tZXdoYXQgbGFyZ2VyIHRoYW4gZGlydGllZCBwYWdlcyB0byBlbnN1cmUgdGhhdCByZWFzb25hYmx5CiAgKiBsYXJnZSBhbW91bnRzIG9mIEkvTyBhcmUgc3VibWl0dGVkLgogICovCi1zdGF0aWMgaW5saW5lIGxvbmcgc3luY193cml0ZWJhY2tfcGFnZXModm9pZCkKK3N0YXRpYyBpbmxpbmUgbG9uZyBzeW5jX3dyaXRlYmFja19wYWdlcyh1bnNpZ25lZCBsb25nIGRpcnRpZWQpCiB7Ci0JcmV0dXJuIHJhdGVsaW1pdF9wYWdlcyArIHJhdGVsaW1pdF9wYWdlcyAvIDI7CisJaWYgKGRpcnRpZWQgPCByYXRlbGltaXRfcGFnZXMpCisJCWRpcnRpZWQgPSByYXRlbGltaXRfcGFnZXM7CisKKwlyZXR1cm4gZGlydGllZCArIGRpcnRpZWQgLyAyOwogfQogCiAvKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIGV4cG9ydGVkIHZpYSAvcHJvYy9zeXMvdm0gKi8KIAogLyoKLSAqIFN0YXJ0IGJhY2tncm91bmQgd3JpdGViYWNrICh2aWEgcGRmbHVzaCkgYXQgdGhpcyBwZXJjZW50YWdlCisgKiBTdGFydCBiYWNrZ3JvdW5kIHdyaXRlYmFjayAodmlhIHdyaXRlYmFjayB0aHJlYWRzKSBhdCB0aGlzIHBlcmNlbnRhZ2UKICAqLwogaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW8gPSAxMDsKIApAQCAtMTU1LDM3ICsxNTgsMzcgQEAKIH0KIAogaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCiAJCWxvZmZfdCAqcHBvcykKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAocmV0ID09IDAgJiYgd3JpdGUpCiAJCWRpcnR5X2JhY2tncm91bmRfYnl0ZXMgPSAwOwogCXJldHVybiByZXQ7CiB9CiAKIGludCBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldCA9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWlmIChyZXQgPT0gMCAmJiB3cml0ZSkKIAkJZGlydHlfYmFja2dyb3VuZF9yYXRpbyA9IDA7CiAJcmV0dXJuIHJldDsKIH0KIAogaW50IGRpcnR5X3JhdGlvX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IG9sZF9yYXRpbyA9IHZtX2RpcnR5X3JhdGlvOwogCWludCByZXQ7CiAKLQlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWlmIChyZXQgPT0gMCAmJiB3cml0ZSAmJiB2bV9kaXJ0eV9yYXRpbyAhPSBvbGRfcmF0aW8pIHsKIAkJdXBkYXRlX2NvbXBsZXRpb25fcGVyaW9kKCk7CiAJCXZtX2RpcnR5X2J5dGVzID0gMDsKQEAgLTE5NSwxMyArMTk4LDEzIEBACiAKIAogaW50IGRpcnR5X2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpCiB7CiAJdW5zaWduZWQgbG9uZyBvbGRfYnl0ZXMgPSB2bV9kaXJ0eV9ieXRlczsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJaWYgKHJldCA9PSAwICYmIHdyaXRlICYmIHZtX2RpcnR5X2J5dGVzICE9IG9sZF9ieXRlcykgewogCQl1cGRhdGVfY29tcGxldGlvbl9wZXJpb2QoKTsKIAkJdm1fZGlydHlfcmF0aW8gPSAwOwpAQCAtNDc0LDEwICs0NzcsMTEgQEAKICAqIGJhbGFuY2VfZGlydHlfcGFnZXMoKSBtdXN0IGJlIGNhbGxlZCBieSBwcm9jZXNzZXMgd2hpY2ggYXJlIGdlbmVyYXRpbmcgZGlydHkKICAqIGRhdGEuICBJdCBsb29rcyBhdCB0aGUgbnVtYmVyIG9mIGRpcnR5IHBhZ2VzIGluIHRoZSBtYWNoaW5lIGFuZCB3aWxsIGZvcmNlCiAgKiB0aGUgY2FsbGVyIHRvIHBlcmZvcm0gd3JpdGViYWNrIGlmIHRoZSBzeXN0ZW0gaXMgb3ZlciBgdm1fZGlydHlfcmF0aW8nLgotICogSWYgd2UncmUgb3ZlciBgYmFja2dyb3VuZF90aHJlc2gnIHRoZW4gcGRmbHVzaCBpcyB3b2tlbiB0byBwZXJmb3JtIHNvbWUKLSAqIHdyaXRlb3V0LgorICogSWYgd2UncmUgb3ZlciBgYmFja2dyb3VuZF90aHJlc2gnIHRoZW4gdGhlIHdyaXRlYmFjayB0aHJlYWRzIGFyZSB3b2tlbiB0bworICogcGVyZm9ybSBzb21lIHdyaXRlb3V0LgogICovCi1zdGF0aWMgdm9pZCBiYWxhbmNlX2RpcnR5X3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQorc3RhdGljIHZvaWQgYmFsYW5jZV9kaXJ0eV9wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQl1bnNpZ25lZCBsb25nIHdyaXRlX2NodW5rKQogewogCWxvbmcgbnJfcmVjbGFpbWFibGUsIGJkaV9ucl9yZWNsYWltYWJsZTsKIAlsb25nIG5yX3dyaXRlYmFjaywgYmRpX25yX3dyaXRlYmFjazsKQEAgLTQ4NSw3ICs0ODksNiBAQAogCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOwogCXVuc2lnbmVkIGxvbmcgYmRpX3RocmVzaDsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzX3dyaXR0ZW4gPSAwOwotCXVuc2lnbmVkIGxvbmcgd3JpdGVfY2h1bmsgPSBzeW5jX3dyaXRlYmFja19wYWdlcygpOwogCXVuc2lnbmVkIGxvbmcgcGF1c2UgPSAxOwogCiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CkBAIC01NjMsNyArNTY2LDggQEAKIAkJaWYgKHBhZ2VzX3dyaXR0ZW4gPj0gd3JpdGVfY2h1bmspCiAJCQlicmVhazsJCS8qIFdlJ3ZlIGRvbmUgb3VyIGR1dHkgKi8KIAotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUocGF1c2UpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlvX3NjaGVkdWxlX3RpbWVvdXQocGF1c2UpOwogCiAJCS8qCiAJCSAqIEluY3JlYXNlIHRoZSBkZWxheSBmb3IgZWFjaCBsb29wLCB1cCB0byBvdXIgcHJldmlvdXMKQEAgLTU3OSw3ICs1ODMsNyBAQAogCQliZGktPmRpcnR5X2V4Y2VlZGVkID0gMDsKIAogCWlmICh3cml0ZWJhY2tfaW5fcHJvZ3Jlc3MoYmRpKSkKLQkJcmV0dXJuOwkJLyogcGRmbHVzaCBpcyBhbHJlYWR5IHdvcmtpbmcgdGhpcyBxdWV1ZSAqLworCQlyZXR1cm47CiAKIAkvKgogCSAqIEluIGxhcHRvcCBtb2RlLCB3ZSB3YWl0IHVudGlsIGhpdHRpbmcgdGhlIGhpZ2hlciB0aHJlc2hvbGQgYmVmb3JlCkBAIC01OTAsMTAgKzU5NCwxMCBAQAogCSAqIGJhY2tncm91bmRfdGhyZXNoLCB0byBrZWVwIHRoZSBhbW91bnQgb2YgZGlydHkgbWVtb3J5IGxvdy4KIAkgKi8KIAlpZiAoKGxhcHRvcF9tb2RlICYmIHBhZ2VzX3dyaXR0ZW4pIHx8Ci0JICAgICghbGFwdG9wX21vZGUgJiYgKChucl93cml0ZWJhY2sgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKQotCQkJCQkgICsgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKSkKKwkgICAgKCFsYXB0b3BfbW9kZSAmJiAoKGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfRElSVFkpCisJCQkgICAgICAgKyBnbG9iYWxfcGFnZV9zdGF0ZShOUl9VTlNUQUJMRV9ORlMpKQogCQkJCQkgID4gYmFja2dyb3VuZF90aHJlc2gpKSkKLQkJYmRpX3N0YXJ0X3dyaXRlYmFjayhiZGksIG5yX3dyaXRlYmFjayk7CisJCWJkaV9zdGFydF93cml0ZWJhY2soYmRpLCBOVUxMLCAwKTsKIH0KIAogdm9pZCBzZXRfcGFnZV9kaXJ0eV9iYWxhbmNlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcGFnZV9ta3dyaXRlKQpAQCAtNjQwLDkgKzY0NCwxMCBAQAogCXAgPSAgJl9fZ2V0X2NwdV92YXIoYmRwX3JhdGVsaW1pdHMpOwogCSpwICs9IG5yX3BhZ2VzX2RpcnRpZWQ7CiAJaWYgKHVubGlrZWx5KCpwID49IHJhdGVsaW1pdCkpIHsKKwkJcmF0ZWxpbWl0ID0gc3luY193cml0ZWJhY2tfcGFnZXMoKnApOwogCQkqcCA9IDA7CiAJCXByZWVtcHRfZW5hYmxlKCk7Ci0JCWJhbGFuY2VfZGlydHlfcGFnZXMobWFwcGluZyk7CisJCWJhbGFuY2VfZGlydHlfcGFnZXMobWFwcGluZywgcmF0ZWxpbWl0KTsKIAkJcmV0dXJuOwogCX0KIAlwcmVlbXB0X2VuYWJsZSgpOwpAQCAtNjg2LDkgKzY5MSw5IEBACiAgKiBzeXNjdGwgaGFuZGxlciBmb3IgL3Byb2Mvc3lzL3ZtL2RpcnR5X3dyaXRlYmFja19jZW50aXNlY3MKICAqLwogaW50IGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3NfaGFuZGxlcihjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0Jc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCisJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKIHsKLQlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlsZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOworCXByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNDksNiArMTE1NCwxMyBAQAogRVhQT1JUX1NZTUJPTChyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSk7CiAKIC8qCisgKiBEaXJ0eSBhIHBhZ2UuCisgKgorICogRm9yIHBhZ2VzIHdpdGggYSBtYXBwaW5nIHRoaXMgc2hvdWxkIGJlIGRvbmUgdW5kZXIgdGhlIHBhZ2UgbG9jaworICogZm9yIHRoZSBiZW5lZml0IG9mIGFzeW5jaHJvbm91cyBtZW1vcnkgZXJyb3JzIHdobyBwcmVmZXIgYSBjb25zaXN0ZW50CisgKiBkaXJ0eSBzdGF0ZS4gVGhpcyBydWxlIGNhbiBiZSBicm9rZW4gaW4gc29tZSBzcGVjaWFsIGNhc2VzLAorICogYnV0IHNob3VsZCBiZSBiZXR0ZXIgbm90IHRvLgorICoKICAqIElmIHRoZSBtYXBwaW5nIGRvZXNuJ3QgcHJvdmlkZSBhIHNldF9wYWdlX2RpcnR5IGFfb3AsIHRoZW4KICAqIGp1c3QgZmFsbCB0aHJvdWdoIGFuZCBhc3N1bWUgdGhhdCBpdCB3YW50cyBidWZmZXJfaGVhZHMuCiAgKi8KZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCA1NzE3ZjI3Li5jZGNlZGY2IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0yMzQsNiArMjM0LDEyIEBACiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfc2hvd247CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfdW5zaG93bjsKIAorCS8qIERvbid0IGNvbXBsYWluIGFib3V0IHBvaXNvbmVkIHBhZ2VzICovCisJaWYgKFBhZ2VIV1BvaXNvbihwYWdlKSkgeworCQlfX0NsZWFyUGFnZUJ1ZGR5KHBhZ2UpOworCQlyZXR1cm47CisJfQorCiAJLyoKIAkgKiBBbGxvdyBhIGJ1cnN0IG9mIDYwIHJlcG9ydHMsIHRoZW4ga2VlcCBxdWlldCBmb3IgdGhhdCBtaW51dGU7CiAJICogb3IgYWxsb3cgYSBzdGVhZHkgZHJpcCBvZiBvbmUgcmVwb3J0IHBlciBzZWNvbmQuCkBAIC02NjYsNyArNjcyLDcgQEAKIC8qCiAgKiBUaGlzIHBhZ2UgaXMgYWJvdXQgdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGUgcGFnZSBhbGxvY2F0b3IKICAqLwotc3RhdGljIGludCBwcmVwX25ld19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIsIGdmcF90IGdmcF9mbGFncykKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX25ld19wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWlmICh1bmxpa2VseShwYWdlX21hcGNvdW50KHBhZ2UpIHwKIAkJKHBhZ2UtPm1hcHBpbmcgIT0gTlVMTCkgIHwKQEAgLTY3NSw2ICs2ODEsMTggQEAKIAkJYmFkX3BhZ2UocGFnZSk7CiAJCXJldHVybiAxOwogCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmVwX25ld19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIsIGdmcF90IGdmcF9mbGFncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBvcmRlcik7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcCA9IHBhZ2UgKyBpOworCQlpZiAodW5saWtlbHkoY2hlY2tfbmV3X3BhZ2UocCkpKQorCQkJcmV0dXJuIDE7CisJfQogCiAJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAwKTsKIAlzZXRfcGFnZV9yZWZjb3VudGVkKHBhZ2UpOwpAQCAtMjE2NSw3ICsyMTgzLDcgQEAKIAlwcmludGsoImFjdGl2ZV9hbm9uOiVsdSBpbmFjdGl2ZV9hbm9uOiVsdSBpc29sYXRlZF9hbm9uOiVsdVxuIgogCQkiIGFjdGl2ZV9maWxlOiVsdSBpbmFjdGl2ZV9maWxlOiVsdSBpc29sYXRlZF9maWxlOiVsdVxuIgogCQkiIHVuZXZpY3RhYmxlOiVsdSIKLQkJIiBkaXJ0eTolbHUgd3JpdGViYWNrOiVsdSB1bnN0YWJsZTolbHUgYnVmZmVyOiVsdVxuIgorCQkiIGRpcnR5OiVsdSB3cml0ZWJhY2s6JWx1IHVuc3RhYmxlOiVsdVxuIgogCQkiIGZyZWU6JWx1IHNsYWJfcmVjbGFpbWFibGU6JWx1IHNsYWJfdW5yZWNsYWltYWJsZTolbHVcbiIKIAkJIiBtYXBwZWQ6JWx1IHNobWVtOiVsdSBwYWdldGFibGVzOiVsdSBib3VuY2U6JWx1XG4iLAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9BQ1RJVkVfQU5PTiksCkBAIC0yMTc4LDcgKzIxOTYsNiBAQAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKSwKIAkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfV1JJVEVCQUNLKSwKIAkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKSwKLQkJbnJfYmxvY2tkZXZfcGFnZXMoKSwKIAkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRlJFRV9QQUdFUyksCiAJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1NMQUJfUkVDTEFJTUFCTEUpLAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9TTEFCX1VOUkVDTEFJTUFCTEUpLApAQCAtMjM3Myw3ICsyMzkwLDcgQEAKICAqIHN5c2N0bCBoYW5kbGVyIGZvciBudW1hX3pvbmVsaXN0X29yZGVyCiAgKi8KIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsCisJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLAogCQlsb2ZmX3QgKnBwb3MpCiB7CiAJY2hhciBzYXZlZF9zdHJpbmdbTlVNQV9aT05FTElTVF9PUkRFUl9MRU5dOwpAQCAtMjM4Miw3ICsyMzk5LDcgQEAKIAlpZiAod3JpdGUpCiAJCXN0cm5jcHkoc2F2ZWRfc3RyaW5nLCAoY2hhciopdGFibGUtPmRhdGEsCiAJCQlOVU1BX1pPTkVMSVNUX09SREVSX0xFTik7Ci0JcmV0ID0gcHJvY19kb3N0cmluZyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlyZXQgPSBwcm9jX2Rvc3RyaW5nKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKHdyaXRlKSB7CkBAIC00NzA2LDkgKzQ3MjMsOSBAQAogICoJY2hhbmdlcy4KICAqLwogaW50IG1pbl9mcmVlX2tieXRlc19zeXNjdGxfaGFuZGxlcihjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIAotCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQorCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCWlmICh3cml0ZSkKIAkJc2V0dXBfcGVyX3pvbmVfd21hcmtzKCk7CiAJcmV0dXJuIDA7CkBAIC00NzE2LDEyICs0NzMzLDEyIEBACiAKICNpZmRlZiBDT05GSUdfTlVNQQogaW50IHN5c2N0bF9taW5fdW5tYXBwZWRfcmF0aW9fc3lzY3RsX2hhbmRsZXIoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQorCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJaW50IHJjOwogCi0JcmMgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlyYyA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC00NzMyLDEyICs0NzQ5LDEyIEBACiB9CiAKIGludCBzeXNjdGxfbWluX3NsYWJfcmF0aW9fc3lzY3RsX2hhbmRsZXIoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQorCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJaW50IHJjOwogCi0JcmMgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlyYyA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC00NzU4LDkgKzQ3NzUsOSBAQAogICogaWYgaW4gZnVuY3Rpb24gb2YgdGhlIGJvb3QgdGltZSB6b25lIHNpemVzLgogICovCiBpbnQgbG93bWVtX3Jlc2VydmVfcmF0aW9fc3lzY3RsX2hhbmRsZXIoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQorCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CiAJc2V0dXBfcGVyX3pvbmVfbG93bWVtX3Jlc2VydmUoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3NzIsMTMgKzQ3ODksMTMgQEAKICAqLwogCiBpbnQgcGVyY3B1X3BhZ2VsaXN0X2ZyYWN0aW9uX3N5c2N0bF9oYW5kbGVyKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKKwl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB6b25lICp6b25lOwogCXVuc2lnbmVkIGludCBjcHU7CiAJaW50IHJldDsKIAotCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlsZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOworCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwogCWlmICghd3JpdGUgfHwgKHJldCA9PSAtRUlOVkFMKSkKIAkJcmV0dXJuIHJldDsKIAlmb3JfZWFjaF9wb3B1bGF0ZWRfem9uZSh6b25lKSB7CmRpZmYgLS1naXQgYS9tbS9wZXJjcHUuYyBiL21tL3BlcmNwdS5jCmluZGV4IDQzZDhjYWMuLmQ5MDc5NzEgMTAwNjQ0Ci0tLSBhL21tL3BlcmNwdS5jCisrKyBiL21tL3BlcmNwdS5jCkBAIC0xNTMsNyArMTUzLDEwIEBACiAgKgogICogRHVyaW5nIGFsbG9jYXRpb24sIHBjcHVfYWxsb2NfbXV0ZXggaXMga2VwdCBsb2NrZWQgYWxsIHRoZSB0aW1lIGFuZAogICogcGNwdV9sb2NrIGlzIGdyYWJiZWQgYW5kIHJlbGVhc2VkIGFzIG5lY2Vzc2FyeS4gIEFsbCBhY3R1YWwgbWVtb3J5Ci0gKiBhbGxvY2F0aW9ucyBhcmUgZG9uZSB1c2luZyBHRlBfS0VSTkVMIHdpdGggcGNwdV9sb2NrIHJlbGVhc2VkLgorICogYWxsb2NhdGlvbnMgYXJlIGRvbmUgdXNpbmcgR0ZQX0tFUk5FTCB3aXRoIHBjcHVfbG9jayByZWxlYXNlZC4gIEluCisgKiBnZW5lcmFsLCBwZXJjcHUgbWVtb3J5IGNhbid0IGJlIGFsbG9jYXRlZCB3aXRoIGlycSBvZmYgYnV0CisgKiBpcnFzYXZlL3Jlc3RvcmUgYXJlIHN0aWxsIHVzZWQgaW4gYWxsb2MgcGF0aCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkCisgKiBmcm9tIGVhcmx5IGluaXQgcGF0aCAtIHNjaGVkX2luaXQoKSBzcGVjaWZpY2FsbHkuCiAgKgogICogRnJlZSBwYXRoIGFjY2Vzc2VzIGFuZCBhbHRlcnMgb25seSB0aGUgaW5kZXggZGF0YSBzdHJ1Y3R1cmVzLCBzbyBpdAogICogY2FuIGJlIHNhZmVseSBjYWxsZWQgZnJvbSBhdG9taWMgY29udGV4dC4gIFdoZW4gbWVtb3J5IG5lZWRzIHRvIGJlCkBAIC0zNjYsNyArMzY5LDcgQEAKICAqIFJFVFVSTlM6CiAgKiAwIGlmIG5vb3AsIDEgaWYgc3VjY2Vzc2Z1bGx5IGV4dGVuZGVkLCAtZXJybm8gb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBwY3B1X2V4dGVuZF9hcmVhX21hcChzdHJ1Y3QgcGNwdV9jaHVuayAqY2h1bmspCitzdGF0aWMgaW50IHBjcHVfZXh0ZW5kX2FyZWFfbWFwKHN0cnVjdCBwY3B1X2NodW5rICpjaHVuaywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJaW50IG5ld19hbGxvYzsKIAlpbnQgKm5ldzsKQEAgLTM3Niw3ICszNzksNyBAQAogCWlmIChjaHVuay0+bWFwX2FsbG9jID49IGNodW5rLT5tYXBfdXNlZCArIDIpCiAJCXJldHVybiAwOwogCi0Jc3Bpbl91bmxvY2tfaXJxKCZwY3B1X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjcHVfbG9jaywgKmZsYWdzKTsKIAogCW5ld19hbGxvYyA9IFBDUFVfREZMX01BUF9BTExPQzsKIAl3aGlsZSAobmV3X2FsbG9jIDwgY2h1bmstPm1hcF91c2VkICsgMikKQEAgLTM4NCw3ICszODcsNyBAQAogCiAJbmV3ID0gcGNwdV9tZW1fYWxsb2MobmV3X2FsbG9jICogc2l6ZW9mKG5ld1swXSkpOwogCWlmICghbmV3KSB7Ci0JCXNwaW5fbG9ja19pcnEoJnBjcHVfbG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwY3B1X2xvY2ssICpmbGFncyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzkzLDcgKzM5Niw3IEBACiAJICogY291bGQgaGF2ZSBoYXBwZW5lZCBpbmJldHdlZW4sIHNvIG1hcF91c2VkIGNvdWxkbid0IGhhdmUKIAkgKiBncm93bi4KIAkgKi8KLQlzcGluX2xvY2tfaXJxKCZwY3B1X2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZwY3B1X2xvY2ssICpmbGFncyk7CiAJQlVHX09OKG5ld19hbGxvYyA8IGNodW5rLT5tYXBfdXNlZCArIDIpOwogCiAJc2l6ZSA9IGNodW5rLT5tYXBfYWxsb2MgKiBzaXplb2YoY2h1bmstPm1hcFswXSk7CkBAIC0xMDQzLDggKzEwNDYsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgKnBjcHVfYWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwgYm9vbCByZXNlcnZlZCkKIHsKKwlzdGF0aWMgaW50IHdhcm5fbGltaXQgPSAxMDsKIAlzdHJ1Y3QgcGNwdV9jaHVuayAqY2h1bms7CisJY29uc3QgY2hhciAqZXJyOwogCWludCBzbG90LCBvZmY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICh1bmxpa2VseSghc2l6ZSB8fCBzaXplID4gUENQVV9NSU5fVU5JVF9TSVpFIHx8IGFsaWduID4gUEFHRV9TSVpFKSkgewogCQlXQVJOKHRydWUsICJpbGxlZ2FsIHNpemUgKCV6dSkgb3IgYWxpZ24gKCV6dSkgZm9yICIKQEAgLTEwNTMsMTcgKzEwNTksMjAgQEAKIAl9CiAKIAltdXRleF9sb2NrKCZwY3B1X2FsbG9jX211dGV4KTsKLQlzcGluX2xvY2tfaXJxKCZwY3B1X2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZwY3B1X2xvY2ssIGZsYWdzKTsKIAogCS8qIHNlcnZlIHJlc2VydmVkIGFsbG9jYXRpb25zIGZyb20gdGhlIHJlc2VydmVkIGNodW5rIGlmIGF2YWlsYWJsZSAqLwogCWlmIChyZXNlcnZlZCAmJiBwY3B1X3Jlc2VydmVkX2NodW5rKSB7CiAJCWNodW5rID0gcGNwdV9yZXNlcnZlZF9jaHVuazsKIAkJaWYgKHNpemUgPiBjaHVuay0+Y29udGlnX2hpbnQgfHwKLQkJICAgIHBjcHVfZXh0ZW5kX2FyZWFfbWFwKGNodW5rKSA8IDApCisJCSAgICBwY3B1X2V4dGVuZF9hcmVhX21hcChjaHVuaywgJmZsYWdzKSA8IDApIHsKKwkJCWVyciA9ICJmYWlsZWQgdG8gZXh0ZW5kIGFyZWEgbWFwIG9mIHJlc2VydmVkIGNodW5rIjsKIAkJCWdvdG8gZmFpbF91bmxvY2s7CisJCX0KIAkJb2ZmID0gcGNwdV9hbGxvY19hcmVhKGNodW5rLCBzaXplLCBhbGlnbik7CiAJCWlmIChvZmYgPj0gMCkKIAkJCWdvdG8gYXJlYV9mb3VuZDsKKwkJZXJyID0gImFsbG9jIGZyb20gcmVzZXJ2ZWQgY2h1bmsgZmFpbGVkIjsKIAkJZ290byBmYWlsX3VubG9jazsKIAl9CiAKQEAgLTEwNzQsMTIgKzEwODMsMTMgQEAKIAkJCWlmIChzaXplID4gY2h1bmstPmNvbnRpZ19oaW50KQogCQkJCWNvbnRpbnVlOwogCi0JCQlzd2l0Y2ggKHBjcHVfZXh0ZW5kX2FyZWFfbWFwKGNodW5rKSkgeworCQkJc3dpdGNoIChwY3B1X2V4dGVuZF9hcmVhX21hcChjaHVuaywgJmZsYWdzKSkgewogCQkJY2FzZSAwOgogCQkJCWJyZWFrOwogCQkJY2FzZSAxOgogCQkJCWdvdG8gcmVzdGFydDsJLyogcGNwdV9sb2NrIGRyb3BwZWQsIHJlc3RhcnQgKi8KIAkJCWRlZmF1bHQ6CisJCQkJZXJyID0gImZhaWxlZCB0byBleHRlbmQgYXJlYSBtYXAiOwogCQkJCWdvdG8gZmFpbF91bmxvY2s7CiAJCQl9CiAKQEAgLTEwOTAsMjMgKzExMDAsMjYgQEAKIAl9CiAKIAkvKiBobW1tLi4uIG5vIHNwYWNlIGxlZnQsIGNyZWF0ZSBhIG5ldyBjaHVuayAqLwotCXNwaW5fdW5sb2NrX2lycSgmcGNwdV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3B1X2xvY2ssIGZsYWdzKTsKIAogCWNodW5rID0gYWxsb2NfcGNwdV9jaHVuaygpOwotCWlmICghY2h1bmspCisJaWYgKCFjaHVuaykgeworCQllcnIgPSAiZmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBjaHVuayI7CiAJCWdvdG8gZmFpbF91bmxvY2tfbXV0ZXg7CisJfQogCi0Jc3Bpbl9sb2NrX2lycSgmcGNwdV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNwdV9sb2NrLCBmbGFncyk7CiAJcGNwdV9jaHVua19yZWxvY2F0ZShjaHVuaywgLTEpOwogCWdvdG8gcmVzdGFydDsKIAogYXJlYV9mb3VuZDoKLQlzcGluX3VubG9ja19pcnEoJnBjcHVfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNwdV9sb2NrLCBmbGFncyk7CiAKIAkvKiBwb3B1bGF0ZSwgbWFwIGFuZCBjbGVhciB0aGUgYXJlYSAqLwogCWlmIChwY3B1X3BvcHVsYXRlX2NodW5rKGNodW5rLCBvZmYsIHNpemUpKSB7Ci0JCXNwaW5fbG9ja19pcnEoJnBjcHVfbG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwY3B1X2xvY2ssIGZsYWdzKTsKIAkJcGNwdV9mcmVlX2FyZWEoY2h1bmssIG9mZik7CisJCWVyciA9ICJmYWlsZWQgdG8gcG9wdWxhdGUiOwogCQlnb3RvIGZhaWxfdW5sb2NrOwogCX0KIApAQCAtMTExNiw5ICsxMTI5LDE2IEBACiAJcmV0dXJuIF9fYWRkcl90b19wY3B1X3B0cihjaHVuay0+YmFzZV9hZGRyICsgb2ZmKTsKIAogZmFpbF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwY3B1X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjcHVfbG9jaywgZmxhZ3MpOwogZmFpbF91bmxvY2tfbXV0ZXg6CiAJbXV0ZXhfdW5sb2NrKCZwY3B1X2FsbG9jX211dGV4KTsKKwlpZiAod2Fybl9saW1pdCkgeworCQlwcl93YXJuaW5nKCJQRVJDUFU6IGFsbG9jYXRpb24gZmFpbGVkLCBzaXplPSV6dSBhbGlnbj0lenUsICIKKwkJCSAgICIlc1xuIiwgc2l6ZSwgYWxpZ24sIGVycik7CisJCWR1bXBfc3RhY2soKTsKKwkJaWYgKCEtLXdhcm5fbGltaXQpCisJCQlwcl9pbmZvKCJQRVJDUFU6IGxpbWl0IHJlYWNoZWQsIGRpc2FibGUgd2FybmluZ1xuIik7CisJfQogCXJldHVybiBOVUxMOwogfQogCkBAIC0xMzQ3LDYgKzEzNjcsMTAgQEAKIAlzdHJ1Y3QgcGNwdV9hbGxvY19pbmZvICphaTsKIAl1bnNpZ25lZCBpbnQgKmNwdV9tYXA7CiAKKwkvKiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgKi8KKwltZW1zZXQoZ3JvdXBfbWFwLCAwLCBzaXplb2YoZ3JvdXBfbWFwKSk7CisJbWVtc2V0KGdyb3VwX2NudCwgMCwgc2l6ZW9mKGdyb3VwX21hcCkpOworCiAJLyoKIAkgKiBEZXRlcm1pbmUgbWluX3VuaXRfc2l6ZSwgYWxsb2Nfc2l6ZSBhbmQgbWF4X3VwYSBzdWNoIHRoYXQKIAkgKiBhbGxvY19zaXplIGlzIG11bHRpcGxlIG9mIGF0b21fc2l6ZSBhbmQgaXMgdGhlIHNtYWxsZXN0CkBAIC0xNTc0LDYgKzE1OTgsNyBAQAogaW50IF9faW5pdCBwY3B1X3NldHVwX2ZpcnN0X2NodW5rKGNvbnN0IHN0cnVjdCBwY3B1X2FsbG9jX2luZm8gKmFpLAogCQkJCSAgdm9pZCAqYmFzZV9hZGRyKQogeworCXN0YXRpYyBjaGFyIGNwdXNfYnVmWzQwOTZdIF9faW5pdGRhdGE7CiAJc3RhdGljIGludCBzbWFwWzJdLCBkbWFwWzJdOwogCXNpemVfdCBkeW5fc2l6ZSA9IGFpLT5keW5fc2l6ZTsKIAlzaXplX3Qgc2l6ZV9zdW0gPSBhaS0+c3RhdGljX3NpemUgKyBhaS0+cmVzZXJ2ZWRfc2l6ZSArIGR5bl9zaXplOwpAQCAtMTU4NSwxNyArMTYxMCwyNiBAQAogCWludCAqdW5pdF9tYXA7CiAJaW50IGdyb3VwLCB1bml0LCBpOwogCisJY3B1bWFza19zY25wcmludGYoY3B1c19idWYsIHNpemVvZihjcHVzX2J1ZiksIGNwdV9wb3NzaWJsZV9tYXNrKTsKKworI2RlZmluZSBQQ1BVX1NFVFVQX0JVR19PTihjb25kKQlkbyB7CQkJCQlcCisJaWYgKHVubGlrZWx5KGNvbmQpKSB7CQkJCQkJXAorCQlwcl9lbWVyZygiUEVSQ1BVOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSwgJXMiLCAjY29uZCk7CVwKKwkJcHJfZW1lcmcoIlBFUkNQVTogY3B1X3Bvc3NpYmxlX21hc2s9JXNcbiIsIGNwdXNfYnVmKTsJXAorCQlwY3B1X2R1bXBfYWxsb2NfaW5mbyhLRVJOX0VNRVJHLCBhaSk7CQkJXAorCQlCVUcoKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKIAkvKiBzYW5pdHkgY2hlY2tzICovCiAJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc21hcCkgPj0gUENQVV9ERkxfTUFQX0FMTE9DIHx8CiAJCSAgICAgQVJSQVlfU0laRShkbWFwKSA+PSBQQ1BVX0RGTF9NQVBfQUxMT0MpOwotCUJVR19PTihhaS0+bnJfZ3JvdXBzIDw9IDApOwotCUJVR19PTighYWktPnN0YXRpY19zaXplKTsKLQlCVUdfT04oIWJhc2VfYWRkcik7Ci0JQlVHX09OKGFpLT51bml0X3NpemUgPCBzaXplX3N1bSk7Ci0JQlVHX09OKGFpLT51bml0X3NpemUgJiB+UEFHRV9NQVNLKTsKLQlCVUdfT04oYWktPnVuaXRfc2l6ZSA8IFBDUFVfTUlOX1VOSVRfU0laRSk7Ci0KLQlwY3B1X2R1bXBfYWxsb2NfaW5mbyhLRVJOX0RFQlVHLCBhaSk7CisJUENQVV9TRVRVUF9CVUdfT04oYWktPm5yX2dyb3VwcyA8PSAwKTsKKwlQQ1BVX1NFVFVQX0JVR19PTighYWktPnN0YXRpY19zaXplKTsKKwlQQ1BVX1NFVFVQX0JVR19PTighYmFzZV9hZGRyKTsKKwlQQ1BVX1NFVFVQX0JVR19PTihhaS0+dW5pdF9zaXplIDwgc2l6ZV9zdW0pOworCVBDUFVfU0VUVVBfQlVHX09OKGFpLT51bml0X3NpemUgJiB+UEFHRV9NQVNLKTsKKwlQQ1BVX1NFVFVQX0JVR19PTihhaS0+dW5pdF9zaXplIDwgUENQVV9NSU5fVU5JVF9TSVpFKTsKIAogCS8qIHByb2Nlc3MgZ3JvdXAgaW5mb3JtYXRpb24gYW5kIGJ1aWxkIGNvbmZpZyB0YWJsZXMgYWNjb3JkaW5nbHkgKi8KIAlncm91cF9vZmZzZXRzID0gYWxsb2NfYm9vdG1lbShhaS0+bnJfZ3JvdXBzICogc2l6ZW9mKGdyb3VwX29mZnNldHNbMF0pKTsKQEAgLTE2MDQsNyArMTYzOCw3IEBACiAJdW5pdF9vZmYgPSBhbGxvY19ib290bWVtKG5yX2NwdV9pZHMgKiBzaXplb2YodW5pdF9vZmZbMF0pKTsKIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgbnJfY3B1X2lkczsgY3B1KyspCi0JCXVuaXRfbWFwW2NwdV0gPSBOUl9DUFVTOworCQl1bml0X21hcFtjcHVdID0gVUlOVF9NQVg7CiAJcGNwdV9maXJzdF91bml0X2NwdSA9IE5SX0NQVVM7CiAKIAlmb3IgKGdyb3VwID0gMCwgdW5pdCA9IDA7IGdyb3VwIDwgYWktPm5yX2dyb3VwczsgZ3JvdXArKywgdW5pdCArPSBpKSB7CkBAIC0xNjE4LDggKzE2NTIsOSBAQAogCQkJaWYgKGNwdSA9PSBOUl9DUFVTKQogCQkJCWNvbnRpbnVlOwogCi0JCQlCVUdfT04oY3B1ID4gbnJfY3B1X2lkcyB8fCAhY3B1X3Bvc3NpYmxlKGNwdSkpOwotCQkJQlVHX09OKHVuaXRfbWFwW2NwdV0gIT0gTlJfQ1BVUyk7CisJCQlQQ1BVX1NFVFVQX0JVR19PTihjcHUgPiBucl9jcHVfaWRzKTsKKwkJCVBDUFVfU0VUVVBfQlVHX09OKCFjcHVfcG9zc2libGUoY3B1KSk7CisJCQlQQ1BVX1NFVFVQX0JVR19PTih1bml0X21hcFtjcHVdICE9IFVJTlRfTUFYKTsKIAogCQkJdW5pdF9tYXBbY3B1XSA9IHVuaXQgKyBpOwogCQkJdW5pdF9vZmZbY3B1XSA9IGdpLT5iYXNlX29mZnNldCArIGkgKiBhaS0+dW5pdF9zaXplOwpAQCAtMTYzMiw3ICsxNjY3LDExIEBACiAJcGNwdV9ucl91bml0cyA9IHVuaXQ7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQotCQlCVUdfT04odW5pdF9tYXBbY3B1XSA9PSBOUl9DUFVTKTsKKwkJUENQVV9TRVRVUF9CVUdfT04odW5pdF9tYXBbY3B1XSA9PSBVSU5UX01BWCk7CisKKwkvKiB3ZSdyZSBkb25lIHBhcnNpbmcgdGhlIGlucHV0LCB1bmRlZmluZSBCVUcgbWFjcm8gYW5kIGR1bXAgY29uZmlnICovCisjdW5kZWYgUENQVV9TRVRVUF9CVUdfT04KKwlwY3B1X2R1bXBfYWxsb2NfaW5mbyhLRVJOX0lORk8sIGFpKTsKIAogCXBjcHVfbnJfZ3JvdXBzID0gYWktPm5yX2dyb3VwczsKIAlwY3B1X2dyb3VwX29mZnNldHMgPSBncm91cF9vZmZzZXRzOwpAQCAtMTc4Miw3ICsxODIxLDcgQEAKIAl2b2lkICpiYXNlID0gKHZvaWQgKilVTE9OR19NQVg7CiAJdm9pZCAqKmFyZWFzID0gTlVMTDsKIAlzdHJ1Y3QgcGNwdV9hbGxvY19pbmZvICphaTsKLQlzaXplX3Qgc2l6ZV9zdW0sIGFyZWFzX3NpemU7CisJc2l6ZV90IHNpemVfc3VtLCBhcmVhc19zaXplLCBtYXhfZGlzdGFuY2U7CiAJaW50IGdyb3VwLCBpLCByYzsKIAogCWFpID0gcGNwdV9idWlsZF9hbGxvY19pbmZvKHJlc2VydmVkX3NpemUsIGR5bl9zaXplLCBhdG9tX3NpemUsCkBAIC0xODMyLDggKzE4NzEsMjUgQEAKIAl9CiAKIAkvKiBiYXNlIGFkZHJlc3MgaXMgbm93IGtub3duLCBkZXRlcm1pbmUgZ3JvdXAgYmFzZSBvZmZzZXRzICovCi0JZm9yIChncm91cCA9IDA7IGdyb3VwIDwgYWktPm5yX2dyb3VwczsgZ3JvdXArKykKKwltYXhfZGlzdGFuY2UgPSAwOworCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IGFpLT5ucl9ncm91cHM7IGdyb3VwKyspIHsKIAkJYWktPmdyb3Vwc1tncm91cF0uYmFzZV9vZmZzZXQgPSBhcmVhc1tncm91cF0gLSBiYXNlOworCQltYXhfZGlzdGFuY2UgPSBtYXhfdChzaXplX3QsIG1heF9kaXN0YW5jZSwKKwkJCQkgICAgIGFpLT5ncm91cHNbZ3JvdXBdLmJhc2Vfb2Zmc2V0KTsKKwl9CisJbWF4X2Rpc3RhbmNlICs9IGFpLT51bml0X3NpemU7CisKKwkvKiB3YXJuIGlmIG1heGltdW0gZGlzdGFuY2UgaXMgZnVydGhlciB0aGFuIDc1JSBvZiB2bWFsbG9jIHNwYWNlICovCisJaWYgKG1heF9kaXN0YW5jZSA+IChWTUFMTE9DX0VORCAtIFZNQUxMT0NfU1RBUlQpICogMyAvIDQpIHsKKwkJcHJfd2FybmluZygiUEVSQ1BVOiBtYXhfZGlzdGFuY2U9MHglenggdG9vIGxhcmdlIGZvciB2bWFsbG9jICIKKwkJCSAgICJzcGFjZSAweCVseFxuIiwKKwkJCSAgIG1heF9kaXN0YW5jZSwgVk1BTExPQ19FTkQgLSBWTUFMTE9DX1NUQVJUKTsKKyNpZmRlZiBDT05GSUdfTkVFRF9QRVJfQ1BVX1BBR0VfRklSU1RfQ0hVTksKKwkJLyogYW5kIGZhaWwgaWYgd2UgaGF2ZSBmYWxsYmFjayAqLworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWU7CisjZW5kaWYKKwl9CiAKIAlwcl9pbmZvKCJQRVJDUFU6IEVtYmVkZGVkICV6dSBwYWdlcy9jcHUgQCVwIHMlenUgciV6dSBkJXp1IHUlenVcbiIsCiAJCVBGTl9ET1dOKHNpemVfc3VtKSwgYmFzZSwgYWktPnN0YXRpY19zaXplLCBhaS0+cmVzZXJ2ZWRfc2l6ZSwKZGlmZiAtLWdpdCBhL21tL3F1aWNrbGlzdC5jIGIvbW0vcXVpY2tsaXN0LmMKaW5kZXggNmVlZGY3ZS4uNjYzMzk2NSAxMDA2NDQKLS0tIGEvbW0vcXVpY2tsaXN0LmMKKysrIGIvbW0vcXVpY2tsaXN0LmMKQEAgLTI5LDcgKzI5LDYgQEAKIAlpbnQgbm9kZSA9IG51bWFfbm9kZV9pZCgpOwogCXN0cnVjdCB6b25lICp6b25lcyA9IE5PREVfREFUQShub2RlKS0+bm9kZV96b25lczsKIAlpbnQgbnVtX2NwdXNfb25fbm9kZTsKLQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFza19vbl9ub2RlID0gY3B1bWFza19vZl9ub2RlKG5vZGUpOwogCiAJbm9kZV9mcmVlX3BhZ2VzID0KICNpZmRlZiBDT05GSUdfWk9ORV9ETUEKQEAgLTQyLDcgKzQxLDcgQEAKIAogCW1heCA9IG5vZGVfZnJlZV9wYWdlcyAvIEZSQUNUSU9OX09GX05PREVfTUVNOwogCi0JbnVtX2NwdXNfb25fbm9kZSA9IGNwdXNfd2VpZ2h0X25yKCpjcHVtYXNrX29uX25vZGUpOworCW51bV9jcHVzX29uX25vZGUgPSBjcHVtYXNrX3dlaWdodChjcHVtYXNrX29mX25vZGUobm9kZSkpOwogCW1heCAvPSBudW1fY3B1c19vbl9ub2RlOwogCiAJcmV0dXJuIG1heChtYXgsIG1pbl9wYWdlcyk7CmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggNzIwZmMwMy4uZGQ0MzM3MyAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtMzYsNiArMzYsMTEgQEAKICAqICAgICAgICAgICAgICAgICBtYXBwaW5nLT50cmVlX2xvY2sgKHdpZGVseSB1c2VkLCBpbiBzZXRfcGFnZV9kaXJ0eSwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXJjaC1kZXBlbmRlbnQgZmx1c2hfZGNhY2hlX21tYXBfbG9jaywKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIGlub2RlX2xvY2sgaW4gX19zeW5jX3NpbmdsZV9pbm9kZSkKKyAqCisgKiAoY29kZSBkb2Vzbid0IHJlbHkgb24gdGhhdCBvcmRlciBzbyBpdCBjb3VsZCBiZSBzd2l0Y2hlZCBhcm91bmQpCisgKiAtPnRhc2tsaXN0X2xvY2sKKyAqICAgYW5vbl92bWEtPmxvY2sgICAgICAobWVtb3J5X2ZhaWx1cmUsIGNvbGxlY3RfcHJvY3NfYW5vbikKKyAqICAgICBwdGUgbWFwIGxvY2sKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTE5MSw3ICsxOTYsNyBAQAogICogR2V0dGluZyBhIGxvY2sgb24gYSBzdGFibGUgYW5vbl92bWEgZnJvbSBhIHBhZ2Ugb2ZmIHRoZSBMUlUgaXMKICAqIHRyaWNreTogcGFnZV9sb2NrX2Fub25fdm1hIHJlbHkgb24gUkNVIHRvIGd1YXJkIGFnYWluc3QgdGhlIHJhY2VzLgogICovCi1zdGF0aWMgc3RydWN0IGFub25fdm1hICpwYWdlX2xvY2tfYW5vbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UpCitzdHJ1Y3QgYW5vbl92bWEgKnBhZ2VfbG9ja19hbm9uX3ZtYShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hOwogCXVuc2lnbmVkIGxvbmcgYW5vbl9tYXBwaW5nOwpAQCAtMjExLDcgKzIxNiw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHBhZ2VfdW5sb2NrX2Fub25fdm1hKHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpCit2b2lkIHBhZ2VfdW5sb2NrX2Fub25fdm1hKHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpCiB7CiAJc3Bpbl91bmxvY2soJmFub25fdm1hLT5sb2NrKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTIzNyw4ICsyNDIsOCBAQAogfQogCiAvKgotICogQXQgd2hhdCB1c2VyIHZpcnR1YWwgYWRkcmVzcyBpcyBwYWdlIGV4cGVjdGVkIGluIHZtYT8gY2hlY2tpbmcgdGhhdCB0aGUKLSAqIHBhZ2UgbWF0Y2hlcyB0aGUgdm1hOiBjdXJyZW50bHkgb25seSB1c2VkIG9uIGFub24gcGFnZXMsIGJ5IHVudXNlX3ZtYTsKKyAqIEF0IHdoYXQgdXNlciB2aXJ0dWFsIGFkZHJlc3MgaXMgcGFnZSBleHBlY3RlZCBpbiB2bWE/CisgKiBjaGVja2luZyB0aGF0IHRoZSBwYWdlIG1hdGNoZXMgdGhlIHZtYS4KICAqLwogdW5zaWduZWQgbG9uZyBwYWdlX2FkZHJlc3NfaW5fdm1hKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKQEAgLTMxMSw3ICszMTYsNyBAQAogICogaWYgdGhlIHBhZ2UgaXMgbm90IG1hcHBlZCBpbnRvIHRoZSBwYWdlIHRhYmxlcyBvZiB0aGlzIFZNQS4gIE9ubHkKICAqIHZhbGlkIGZvciBub3JtYWwgZmlsZSBvciBhbm9ueW1vdXMgVk1Bcy4KICAqLwotc3RhdGljIGludCBwYWdlX21hcHBlZF9pbl92bWEoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoraW50IHBhZ2VfbWFwcGVkX2luX3ZtYShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCXB0ZV90ICpwdGU7CkBAIC03NTYsNyArNzYxLDcgQEAKICAqIHJlcGVhdGVkbHkgZnJvbSBlaXRoZXIgdHJ5X3RvX3VubWFwX2Fub24gb3IgdHJ5X3RvX3VubWFwX2ZpbGUuCiAgKi8KIHN0YXRpYyBpbnQgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJaW50IG1pZ3JhdGlvbikKKwkJCQllbnVtIHR0dV9mbGFncyBmbGFncykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwpAQCAtNzc4LDExICs3ODMsMTMgQEAKIAkgKiBJZiBpdCdzIHJlY2VudGx5IHJlZmVyZW5jZWQgKHBlcmhhcHMgcGFnZV9yZWZlcmVuY2VkCiAJICogc2tpcHBlZCBvdmVyIHRoaXMgbW0pIHRoZW4gd2Ugc2hvdWxkIHJlYWN0aXZhdGUgaXQuCiAJICovCi0JaWYgKCFtaWdyYXRpb24pIHsKKwlpZiAoIShmbGFncyAmIFRUVV9JR05PUkVfTUxPQ0spKSB7CiAJCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSB7CiAJCQlyZXQgPSBTV0FQX01MT0NLOwogCQkJZ290byBvdXRfdW5tYXA7CiAJCX0KKwl9CisJaWYgKCEoZmxhZ3MgJiBUVFVfSUdOT1JFX0FDQ0VTUykpIHsKIAkJaWYgKHB0ZXBfY2xlYXJfZmx1c2hfeW91bmdfbm90aWZ5KHZtYSwgYWRkcmVzcywgcHRlKSkgewogCQkJcmV0ID0gU1dBUF9GQUlMOwogCQkJZ290byBvdXRfdW5tYXA7CkBAIC04MDAsNyArODA3LDE0IEBACiAJLyogVXBkYXRlIGhpZ2ggd2F0ZXJtYXJrIGJlZm9yZSB3ZSBsb3dlciByc3MgKi8KIAl1cGRhdGVfaGl3YXRlcl9yc3MobW0pOwogCi0JaWYgKFBhZ2VBbm9uKHBhZ2UpKSB7CisJaWYgKFBhZ2VIV1BvaXNvbihwYWdlKSAmJiAhKGZsYWdzICYgVFRVX0lHTk9SRV9IV1BPSVNPTikpIHsKKwkJaWYgKFBhZ2VBbm9uKHBhZ2UpKQorCQkJZGVjX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKKwkJZWxzZQorCQkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKKwkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlLAorCQkJCXN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShwYWdlKSkpOworCX0gZWxzZSBpZiAoUGFnZUFub24ocGFnZSkpIHsKIAkJc3dwX2VudHJ5X3QgZW50cnkgPSB7IC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSkgfTsKIAogCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkgewpAQCAtODIyLDEyICs4MzYsMTIgQEAKIAkJCSAqIHB0ZS4gZG9fc3dhcF9wYWdlKCkgd2lsbCB3YWl0IHVudGlsIHRoZSBtaWdyYXRpb24KIAkJCSAqIHB0ZSBpcyByZW1vdmVkIGFuZCB0aGVuIHJlc3RhcnQgZmF1bHQgaGFuZGxpbmcuCiAJCQkgKi8KLQkJCUJVR19PTighbWlncmF0aW9uKTsKKwkJCUJVR19PTihUVFVfQUNUSU9OKGZsYWdzKSAhPSBUVFVfTUlHUkFUSU9OKTsKIAkJCWVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnkocGFnZSwgcHRlX3dyaXRlKHB0ZXZhbCkpOwogCQl9CiAJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB0ZSwgc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpOwogCQlCVUdfT04ocHRlX2ZpbGUoKnB0ZSkpOwotCX0gZWxzZSBpZiAoUEFHRV9NSUdSQVRJT04gJiYgbWlncmF0aW9uKSB7CisJfSBlbHNlIGlmIChQQUdFX01JR1JBVElPTiAmJiAoVFRVX0FDVElPTihmbGFncykgPT0gVFRVX01JR1JBVElPTikpIHsKIAkJLyogRXN0YWJsaXNoIG1pZ3JhdGlvbiBlbnRyeSBmb3IgYSBmaWxlIHBhZ2UgKi8KIAkJc3dwX2VudHJ5X3QgZW50cnk7CiAJCWVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnkocGFnZSwgcHRlX3dyaXRlKHB0ZXZhbCkpOwpAQCAtOTk2LDEyICsxMDEwLDEzIEBACiAgKiB2bV9mbGFncyBmb3IgdGhhdCBWTUEuICBUaGF0IHNob3VsZCBiZSBPSywgYmVjYXVzZSB0aGF0IHZtYSBzaG91bGRuJ3QgYmUKICAqICdMT0NLRUQuCiAgKi8KLXN0YXRpYyBpbnQgdHJ5X3RvX3VubWFwX2Fub24oc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB1bmxvY2ssIGludCBtaWdyYXRpb24pCitzdGF0aWMgaW50IHRyeV90b191bm1hcF9hbm9uKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIHR0dV9mbGFncyBmbGFncykKIHsKIAlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXVuc2lnbmVkIGludCBtbG9ja2VkID0gMDsKIAlpbnQgcmV0ID0gU1dBUF9BR0FJTjsKKwlpbnQgdW5sb2NrID0gVFRVX0FDVElPTihmbGFncykgPT0gVFRVX01VTkxPQ0s7CiAKIAlpZiAoTUxPQ0tfUEFHRVMgJiYgdW5saWtlbHkodW5sb2NrKSkKIAkJcmV0ID0gU1dBUF9TVUNDRVNTOwkvKiBkZWZhdWx0IGZvciB0cnlfdG9fbXVubG9jaygpICovCkBAIC0xMDE3LDcgKzEwMzIsNyBAQAogCQkJCWNvbnRpbnVlOyAgLyogbXVzdCB2aXNpdCBhbGwgdW5sb2NrZWQgdm1hcyAqLwogCQkJcmV0ID0gU1dBUF9NTE9DSzsgIC8qIHNhdyBhdCBsZWFzdCBvbmUgbWxvY2tlZCB2bWEgKi8KIAkJfSBlbHNlIHsKLQkJCXJldCA9IHRyeV90b191bm1hcF9vbmUocGFnZSwgdm1hLCBtaWdyYXRpb24pOworCQkJcmV0ID0gdHJ5X3RvX3VubWFwX29uZShwYWdlLCB2bWEsIGZsYWdzKTsKIAkJCWlmIChyZXQgPT0gU1dBUF9GQUlMIHx8ICFwYWdlX21hcHBlZChwYWdlKSkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTA0MSw4ICsxMDU2LDcgQEAKIC8qKgogICogdHJ5X3RvX3VubWFwX2ZpbGUgLSB1bm1hcC91bmxvY2sgZmlsZSBwYWdlIHVzaW5nIHRoZSBvYmplY3QtYmFzZWQgcm1hcCBtZXRob2QKICAqIEBwYWdlOiB0aGUgcGFnZSB0byB1bm1hcC91bmxvY2sKLSAqIEB1bmxvY2s6ICByZXF1ZXN0IGZvciB1bmxvY2sgcmF0aGVyIHRoYW4gdW5tYXAgW3VubGlrZWx5XQotICogQG1pZ3JhdGlvbjogIHVubWFwcGluZyBmb3IgbWlncmF0aW9uIC0gaWdub3JlZCBpZiBAdW5sb2NrCisgKiBAZmxhZ3M6IGFjdGlvbiBhbmQgZmxhZ3MKICAqCiAgKiBGaW5kIGFsbCB0aGUgbWFwcGluZ3Mgb2YgYSBwYWdlIHVzaW5nIHRoZSBtYXBwaW5nIHBvaW50ZXIgYW5kIHRoZSB2bWEgY2hhaW5zCiAgKiBjb250YWluZWQgaW4gdGhlIGFkZHJlc3Nfc3BhY2Ugc3RydWN0IGl0IHBvaW50cyB0by4KQEAgLTEwNTQsNyArMTA2OCw3IEBACiAgKiB2bV9mbGFncyBmb3IgdGhhdCBWTUEuICBUaGF0IHNob3VsZCBiZSBPSywgYmVjYXVzZSB0aGF0IHZtYSBzaG91bGRuJ3QgYmUKICAqICdMT0NLRUQuCiAgKi8KLXN0YXRpYyBpbnQgdHJ5X3RvX3VubWFwX2ZpbGUoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB1bmxvY2ssIGludCBtaWdyYXRpb24pCitzdGF0aWMgaW50IHRyeV90b191bm1hcF9maWxlKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIHR0dV9mbGFncyBmbGFncykKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CiAJcGdvZmZfdCBwZ29mZiA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gUEFHRV9TSElGVCk7CkBAIC0xMDY2LDYgKzEwODAsNyBAQAogCXVuc2lnbmVkIGxvbmcgbWF4X25sX3NpemUgPSAwOwogCXVuc2lnbmVkIGludCBtYXBjb3VudDsKIAl1bnNpZ25lZCBpbnQgbWxvY2tlZCA9IDA7CisJaW50IHVubG9jayA9IFRUVV9BQ1RJT04oZmxhZ3MpID09IFRUVV9NVU5MT0NLOwogCiAJaWYgKE1MT0NLX1BBR0VTICYmIHVubGlrZWx5KHVubG9jaykpCiAJCXJldCA9IFNXQVBfU1VDQ0VTUzsJLyogZGVmYXVsdCBmb3IgdHJ5X3RvX211bmxvY2soKSAqLwpAQCAtMTA3OCw3ICsxMDkzLDcgQEAKIAkJCQljb250aW51ZTsJLyogbXVzdCB2aXNpdCBhbGwgdm1hcyAqLwogCQkJcmV0ID0gU1dBUF9NTE9DSzsKIAkJfSBlbHNlIHsKLQkJCXJldCA9IHRyeV90b191bm1hcF9vbmUocGFnZSwgdm1hLCBtaWdyYXRpb24pOworCQkJcmV0ID0gdHJ5X3RvX3VubWFwX29uZShwYWdlLCB2bWEsIGZsYWdzKTsKIAkJCWlmIChyZXQgPT0gU1dBUF9GQUlMIHx8ICFwYWdlX21hcHBlZChwYWdlKSkKIAkJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTEwMyw3ICsxMTE4LDggQEAKIAkJCXJldCA9IFNXQVBfTUxPQ0s7CS8qIGxlYXZlIG1sb2NrZWQgPT0gMCAqLwogCQkJZ290byBvdXQ7CQkvKiBubyBuZWVkIHRvIGxvb2sgZnVydGhlciAqLwogCQl9Ci0JCWlmICghTUxPQ0tfUEFHRVMgJiYgIW1pZ3JhdGlvbiAmJiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkpCisJCWlmICghTUxPQ0tfUEFHRVMgJiYgIShmbGFncyAmIFRUVV9JR05PUkVfTUxPQ0spICYmCisJCQkodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkpCiAJCQljb250aW51ZTsKIAkJY3Vyc29yID0gKHVuc2lnbmVkIGxvbmcpIHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwogCQlpZiAoY3Vyc29yID4gbWF4X25sX2N1cnNvcikKQEAgLTExMzcsNyArMTE1Myw3IEBACiAJZG8gewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZtYSwgJm1hcHBpbmctPmlfbW1hcF9ub25saW5lYXIsCiAJCQkJCQlzaGFyZWQudm1fc2V0Lmxpc3QpIHsKLQkJCWlmICghTUxPQ0tfUEFHRVMgJiYgIW1pZ3JhdGlvbiAmJgorCQkJaWYgKCFNTE9DS19QQUdFUyAmJiAhKGZsYWdzICYgVFRVX0lHTk9SRV9NTE9DSykgJiYKIAkJCSAgICAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkpCiAJCQkJY29udGludWU7CiAJCQljdXJzb3IgPSAodW5zaWduZWQgbG9uZykgdm1hLT52bV9wcml2YXRlX2RhdGE7CkBAIC0xMTc3LDcgKzExOTMsNyBAQAogLyoqCiAgKiB0cnlfdG9fdW5tYXAgLSB0cnkgdG8gcmVtb3ZlIGFsbCBwYWdlIHRhYmxlIG1hcHBpbmdzIHRvIGEgcGFnZQogICogQHBhZ2U6IHRoZSBwYWdlIHRvIGdldCB1bm1hcHBlZAotICogQG1pZ3JhdGlvbjogbWlncmF0aW9uIGZsYWcKKyAqIEBmbGFnczogYWN0aW9uIGFuZCBmbGFncwogICoKICAqIFRyaWVzIHRvIHJlbW92ZSBhbGwgdGhlIHBhZ2UgdGFibGUgZW50cmllcyB3aGljaCBhcmUgbWFwcGluZyB0aGlzCiAgKiBwYWdlLCB1c2VkIGluIHRoZSBwYWdlb3V0IHBhdGguICBDYWxsZXIgbXVzdCBob2xkIHRoZSBwYWdlIGxvY2suCkBAIC0xMTg4LDE2ICsxMjA0LDE2IEBACiAgKiBTV0FQX0ZBSUwJLSB0aGUgcGFnZSBpcyB1bnN3YXBwYWJsZQogICogU1dBUF9NTE9DSwktIHBhZ2UgaXMgbWxvY2tlZC4KICAqLwotaW50IHRyeV90b191bm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1pZ3JhdGlvbikKK2ludCB0cnlfdG9fdW5tYXAoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gdHR1X2ZsYWdzIGZsYWdzKQogewogCWludCByZXQ7CiAKIAlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCiAJaWYgKFBhZ2VBbm9uKHBhZ2UpKQotCQlyZXQgPSB0cnlfdG9fdW5tYXBfYW5vbihwYWdlLCAwLCBtaWdyYXRpb24pOworCQlyZXQgPSB0cnlfdG9fdW5tYXBfYW5vbihwYWdlLCBmbGFncyk7CiAJZWxzZQotCQlyZXQgPSB0cnlfdG9fdW5tYXBfZmlsZShwYWdlLCAwLCBtaWdyYXRpb24pOworCQlyZXQgPSB0cnlfdG9fdW5tYXBfZmlsZShwYWdlLCBmbGFncyk7CiAJaWYgKHJldCAhPSBTV0FQX01MT0NLICYmICFwYWdlX21hcHBlZChwYWdlKSkKIAkJcmV0ID0gU1dBUF9TVUNDRVNTOwogCXJldHVybiByZXQ7CkBAIC0xMjIyLDggKzEyMzgsOCBAQAogCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSB8fCBQYWdlTFJVKHBhZ2UpKTsKIAogCWlmIChQYWdlQW5vbihwYWdlKSkKLQkJcmV0dXJuIHRyeV90b191bm1hcF9hbm9uKHBhZ2UsIDEsIDApOworCQlyZXR1cm4gdHJ5X3RvX3VubWFwX2Fub24ocGFnZSwgVFRVX01VTkxPQ0spOwogCWVsc2UKLQkJcmV0dXJuIHRyeV90b191bm1hcF9maWxlKHBhZ2UsIDEsIDApOworCQlyZXR1cm4gdHJ5X3RvX3VubWFwX2ZpbGUocGFnZSwgVFRVX01VTkxPQ0spOwogfQogCmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCBiMjA2YTdhLi4zNTZkZDk5NSAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc2htZW1fdm1fb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzaG1lbV92bV9vcHM7CiAKIHN0YXRpYyBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyBzaG1lbV9iYWNraW5nX2Rldl9pbmZvICBfX3JlYWRfbW9zdGx5ID0gewogCS5yYV9wYWdlcwk9IDAsCS8qIE5vIHJlYWRhaGVhZCAqLwpAQCAtMTA0Niw4ICsxMDQ2LDkgQEAKIAkgKiBzeW5jIGZyb20gZXZlciBjYWxsaW5nIHNobWVtX3dyaXRlcGFnZTsgYnV0IGEgc3RhY2tpbmcgZmlsZXN5c3RlbQogCSAqIG1heSB1c2UgdGhlIC0+d3JpdGVwYWdlIG9mIGl0cyB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0sIGluIHdoaWNoIGNhc2UKIAkgKiB0bXBmcyBzaG91bGQgd3JpdGUgb3V0IHRvIHN3YXAgb25seSBpbiByZXNwb25zZSB0byBtZW1vcnkgcHJlc3N1cmUsCi0JICogYW5kIG5vdCBmb3IgcGRmbHVzaCBvciBzeW5jLiAgSG93ZXZlciwgaW4gdGhvc2UgY2FzZXMsIHdlIGRvIHN0aWxsCi0JICogd2FudCB0byBjaGVjayBpZiB0aGVyZSdzIGEgcmVkdW5kYW50IHN3YXBwYWdlIHRvIGJlIGRpc2NhcmRlZC4KKwkgKiBhbmQgbm90IGZvciB0aGUgd3JpdGViYWNrIHRocmVhZHMgb3Igc3luYy4gIEhvd2V2ZXIsIGluIHRob3NlIGNhc2VzLAorCSAqIHdlIGRvIHN0aWxsIHdhbnQgdG8gY2hlY2sgaWYgdGhlcmUncyBhIHJlZHVuZGFudCBzd2FwcGFnZSB0byBiZQorCSAqIGRpc2NhcmRlZC4KIAkgKi8KIAlpZiAod2JjLT5mb3JfcmVjbGFpbSkKIAkJc3dhcCA9IGdldF9zd2FwX3BhZ2UoKTsKQEAgLTE2MzMsOCArMTYzNCw4IEBACiAJaWYgKHBvcyArIGNvcGllZCA+IGlub2RlLT5pX3NpemUpCiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zICsgY29waWVkKTsKIAotCXVubG9ja19wYWdlKHBhZ2UpOwogCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAogCXJldHVybiBjb3BpZWQ7CkBAIC0xOTcxLDEzICsxOTcyLDEzIEBACiAJCQlpcHV0KGlub2RlKTsKIAkJCXJldHVybiBlcnJvcjsKIAkJfQotCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmc2htZW1fYW9wczsKIAkJaW5vZGUtPmlfb3AgPSAmc2htZW1fc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwogCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKIAkJbWVtY3B5KGthZGRyLCBzeW1uYW1lLCBsZW4pOwogCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCX0KIAlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKQpAQCAtMjQyMCw2ICsyNDIxLDcgQEAKIAkud3JpdGVfZW5kCT0gc2htZW1fd3JpdGVfZW5kLAogI2VuZGlmCiAJLm1pZ3JhdGVwYWdlCT0gbWlncmF0ZV9wYWdlLAorCS5lcnJvcl9yZW1vdmVfcGFnZSA9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaG1lbV9maWxlX29wZXJhdGlvbnMgPSB7CkBAIC0yNDk2LDcgKzI0OTgsNyBAQAogCS5wdXRfc3VwZXIJPSBzaG1lbV9wdXRfc3VwZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNobWVtX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc2htZW1fdm1fb3BzID0gewogCS5mYXVsdAkJPSBzaG1lbV9mYXVsdCwKICNpZmRlZiBDT05GSUdfTlVNQQogCS5zZXRfcG9saWN5ICAgICA9IHNobWVtX3NldF9wb2xpY3ksCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCBmMWJmMTlkLi45YzU5MGVlIDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTY5OSw3ICs2OTksNyBAQAogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAotCWlmIChpc19taWdyYXRpb25fZW50cnkoZW50cnkpKQorCWlmIChub25fc3dhcF9lbnRyeShlbnRyeSkpCiAJCXJldHVybiAxOwogCiAJcCA9IHN3YXBfaW5mb19nZXQoZW50cnkpOwpAQCAtMTE1MSw4ICsxMTUxLDcgQEAKIAkJCQl9IGVsc2UKIAkJCQkJcmV0dmFsID0gdW51c2VfbW0obW0sIGVudHJ5LCBwYWdlKTsKIAotCQkJCWlmIChzZXRfc3RhcnRfbW0gJiYKLQkJCQkgICAgc3dhcF9jb3VudCgqc3dhcF9tYXApIDwgc3djb3VudCkgeworCQkJCWlmIChzZXRfc3RhcnRfbW0gJiYgKnN3YXBfbWFwIDwgc3djb3VudCkgewogCQkJCQltbXB1dChuZXdfc3RhcnRfbW0pOwogCQkJCQlhdG9taWNfaW5jKCZtbS0+bW1fdXNlcnMpOwogCQkJCQluZXdfc3RhcnRfbW0gPSBtbTsKQEAgLTE5NzQsMTIgKzE5NzMsMTQgQEAKIAkJZ290byBiYWRfc3dhcDsKIAl9CiAKLQlpZiAoYmxrX3F1ZXVlX25vbnJvdChiZGV2X2dldF9xdWV1ZShwLT5iZGV2KSkpIHsKLQkJcC0+ZmxhZ3MgfD0gU1dQX1NPTElEU1RBVEU7Ci0JCXAtPmNsdXN0ZXJfbmV4dCA9IDEgKyAocmFuZG9tMzIoKSAlIHAtPmhpZ2hlc3RfYml0KTsKKwlpZiAocC0+YmRldikgeworCQlpZiAoYmxrX3F1ZXVlX25vbnJvdChiZGV2X2dldF9xdWV1ZShwLT5iZGV2KSkpIHsKKwkJCXAtPmZsYWdzIHw9IFNXUF9TT0xJRFNUQVRFOworCQkJcC0+Y2x1c3Rlcl9uZXh0ID0gMSArIChyYW5kb20zMigpICUgcC0+aGlnaGVzdF9iaXQpOworCQl9CisJCWlmIChkaXNjYXJkX3N3YXAocCkgPT0gMCkKKwkJCXAtPmZsYWdzIHw9IFNXUF9ESVNDQVJEQUJMRTsKIAl9Ci0JaWYgKGRpc2NhcmRfc3dhcChwKSA9PSAwKQotCQlwLT5mbGFncyB8PSBTV1BfRElTQ0FSREFCTEU7CiAKIAltdXRleF9sb2NrKCZzd2Fwb25fbXV0ZXgpOwogCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKQEAgLTIwODUsNyArMjA4Niw3IEBACiAJaW50IGNvdW50OwogCWJvb2wgaGFzX2NhY2hlOwogCi0JaWYgKGlzX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpCisJaWYgKG5vbl9zd2FwX2VudHJ5KGVudHJ5KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl0eXBlID0gc3dwX3R5cGUoZW50cnkpOwpkaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmMKaW5kZXggY2NjM2VjZi4uNDUwY2ViZCAxMDA2NDQKLS0tIGEvbW0vdHJ1bmNhdGUuYworKysgYi9tbS90cnVuY2F0ZS5jCkBAIC05MywxMSArOTMsMTEgQEAKICAqIGl0cyBsb2NrLCBiKSB3aGVuIGEgY29uY3VycmVudCBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMgZ290IHRoZXJlIGZpcnN0IGFuZAogICogYykgd2hlbiB0bXBmcyBzd2l6emxlcyBhIHBhZ2UgYmV0d2VlbiBhIHRtcGZzIGlub2RlIGFuZCBzd2FwcGVyX3NwYWNlLgogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogdHJ1bmNhdGVfY29tcGxldGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaWYgKHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTzsKIAogCWlmIChwYWdlX2hhc19wcml2YXRlKHBhZ2UpKQogCQlkb19pbnZhbGlkYXRlcGFnZShwYWdlLCAwKTsKQEAgLTEwOCw2ICsxMDgsNyBAQAogCXJlbW92ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7CiAJQ2xlYXJQYWdlTWFwcGVkVG9EaXNrKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsJLyogcGFnZWNhY2hlIHJlZiAqLworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTM1LDYgKzEzNiw1MSBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCB0cnVuY2F0ZV9pbm9kZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAocGFnZV9tYXBwZWQocGFnZSkpIHsKKwkJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLAorCQkJCSAgIChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCwKKwkJCQkgICBQQUdFX0NBQ0hFX1NJWkUsIDApOworCX0KKwlyZXR1cm4gdHJ1bmNhdGVfY29tcGxldGVfcGFnZShtYXBwaW5nLCBwYWdlKTsKK30KKworLyoKKyAqIFVzZWQgdG8gZ2V0IHJpZCBvZiBwYWdlcyBvbiBoYXJkd2FyZSBtZW1vcnkgY29ycnVwdGlvbi4KKyAqLworaW50IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWlmICghbWFwcGluZykKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBPbmx5IHB1bmNoIGZvciBub3JtYWwgZGF0YSBwYWdlcyBmb3Igbm93LgorCSAqIEhhbmRsaW5nIG90aGVyIHR5cGVzIGxpa2UgZGlyZWN0b3JpZXMgd291bGQgbmVlZCBtb3JlIGF1ZGl0aW5nLgorCSAqLworCWlmICghU19JU1JFRyhtYXBwaW5nLT5ob3N0LT5pX21vZGUpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gdHJ1bmNhdGVfaW5vZGVfcGFnZShtYXBwaW5nLCBwYWdlKTsKK30KK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19lcnJvcl9yZW1vdmVfcGFnZSk7CisKKy8qCisgKiBTYWZlbHkgaW52YWxpZGF0ZSBvbmUgcGFnZSBmcm9tIGl0cyBwYWdlY2FjaGUgbWFwcGluZy4KKyAqIEl0IG9ubHkgZHJvcHMgY2xlYW4sIHVudXNlZCBwYWdlcy4gVGhlIHBhZ2UgbXVzdCBiZSBsb2NrZWQuCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBwYWdlIGlzIHN1Y2Nlc3NmdWxseSBpbnZhbGlkYXRlZCwgb3RoZXJ3aXNlIDAuCisgKi8KK2ludCBpbnZhbGlkYXRlX2lub2RlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisJaWYgKCFtYXBwaW5nKQorCQlyZXR1cm4gMDsKKwlpZiAoUGFnZURpcnR5KHBhZ2UpIHx8IFBhZ2VXcml0ZWJhY2socGFnZSkpCisJCXJldHVybiAwOworCWlmIChwYWdlX21hcHBlZChwYWdlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGludmFsaWRhdGVfY29tcGxldGVfcGFnZShtYXBwaW5nLCBwYWdlKTsKK30KKwogLyoqCiAgKiB0cnVuY2F0ZV9pbm9kZV9wYWdlcyAtIHRydW5jYXRlIHJhbmdlIG9mIHBhZ2VzIHNwZWNpZmllZCBieSBzdGFydCAmIGVuZCBieXRlIG9mZnNldHMKICAqIEBtYXBwaW5nOiBtYXBwaW5nIHRvIHRydW5jYXRlCkBAIC0xOTYsMTIgKzI0Miw3IEBACiAJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAocGFnZV9tYXBwZWQocGFnZSkpIHsKLQkJCQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsCi0JCQkJICAobG9mZl90KXBhZ2VfaW5kZXg8PFBBR0VfQ0FDSEVfU0hJRlQsCi0JCQkJICBQQUdFX0NBQ0hFX1NJWkUsIDApOwotCQkJfQotCQkJdHJ1bmNhdGVfY29tcGxldGVfcGFnZShtYXBwaW5nLCBwYWdlKTsKKwkJCXRydW5jYXRlX2lub2RlX3BhZ2UobWFwcGluZywgcGFnZSk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJfQogCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwpAQCAtMjM4LDE1ICsyNzksMTAgQEAKIAkJCQlicmVhazsKIAkJCWxvY2tfcGFnZShwYWdlKTsKIAkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JCQlpZiAocGFnZV9tYXBwZWQocGFnZSkpIHsKLQkJCQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsCi0JCQkJICAobG9mZl90KXBhZ2UtPmluZGV4PDxQQUdFX0NBQ0hFX1NISUZULAotCQkJCSAgUEFHRV9DQUNIRV9TSVpFLCAwKTsKLQkJCX0KKwkJCXRydW5jYXRlX2lub2RlX3BhZ2UobWFwcGluZywgcGFnZSk7CiAJCQlpZiAocGFnZS0+aW5kZXggPiBuZXh0KQogCQkJCW5leHQgPSBwYWdlLT5pbmRleDsKIAkJCW5leHQrKzsKLQkJCXRydW5jYXRlX2NvbXBsZXRlX3BhZ2UobWFwcGluZywgcGFnZSk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJfQogCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwpAQCAtMzExLDEyICszNDcsOCBAQAogCQkJaWYgKGxvY2tfZmFpbGVkKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAoUGFnZURpcnR5KHBhZ2UpIHx8IFBhZ2VXcml0ZWJhY2socGFnZSkpCi0JCQkJZ290byB1bmxvY2s7Ci0JCQlpZiAocGFnZV9tYXBwZWQocGFnZSkpCi0JCQkJZ290byB1bmxvY2s7Ci0JCQlyZXQgKz0gaW52YWxpZGF0ZV9jb21wbGV0ZV9wYWdlKG1hcHBpbmcsIHBhZ2UpOwotdW5sb2NrOgorCQkJcmV0ICs9IGludmFsaWRhdGVfaW5vZGVfcGFnZShwYWdlKTsKKwogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQlpZiAobmV4dCA+IGVuZCkKIAkJCQlicmVhazsKQEAgLTQ2NSwzICs0OTcsNjcgQEAKIAlyZXR1cm4gaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UobWFwcGluZywgMCwgLTEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIpOworCisvKioKKyAqIHRydW5jYXRlX3BhZ2VjYWNoZSAtIHVubWFwIGFuZCByZW1vdmUgcGFnZWNhY2hlIHRoYXQgaGFzIGJlZW4gdHJ1bmNhdGVkCisgKiBAaW5vZGU6IGlub2RlCisgKiBAb2xkOiBvbGQgZmlsZSBvZmZzZXQKKyAqIEBuZXc6IG5ldyBmaWxlIG9mZnNldAorICoKKyAqIGlub2RlJ3MgbmV3IGlfc2l6ZSBtdXN0IGFscmVhZHkgYmUgd3JpdHRlbiBiZWZvcmUgdHJ1bmNhdGVfcGFnZWNhY2hlCisgKiBpcyBjYWxsZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgdHlwaWNhbGx5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZpbGVzeXN0ZW0KKyAqIHJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZyZWVkIHJhbmdlIChlZy4gZGVhbGxvY2F0ZXMKKyAqIGJsb2NrcykuIFRoaXMgd2F5LCBwYWdlY2FjaGUgd2lsbCBhbHdheXMgc3RheSBsb2dpY2FsbHkgY29oZXJlbnQKKyAqIHdpdGggb24tZGlzayBmb3JtYXQsIGFuZCB0aGUgZmlsZXN5c3RlbSB3b3VsZCBub3QgaGF2ZSB0byBkZWFsIHdpdGgKKyAqIHNpdHVhdGlvbnMgc3VjaCBhcyB3cml0ZXBhZ2UgYmVpbmcgY2FsbGVkIGZvciBhIHBhZ2UgdGhhdCBoYXMgYWxyZWFkeQorICogaGFkIGl0cyB1bmRlcmx5aW5nIGJsb2NrcyBkZWFsbG9jYXRlZC4KKyAqLwordm9pZCB0cnVuY2F0ZV9wYWdlY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9sZCwgbG9mZl90IG5ldykKK3sKKwlpZiAobmV3IDwgb2xkKSB7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKworCQkvKgorCQkgKiB1bm1hcF9tYXBwaW5nX3JhbmdlIGlzIGNhbGxlZCB0d2ljZSwgZmlyc3Qgc2ltcGx5IGZvcgorCQkgKiBlZmZpY2llbmN5IHNvIHRoYXQgdHJ1bmNhdGVfaW5vZGVfcGFnZXMgZG9lcyBmZXdlcgorCQkgKiBzaW5nbGUtcGFnZSB1bm1hcHMuICBIb3dldmVyIGFmdGVyIHRoaXMgZmlyc3QgY2FsbCwgYW5kCisJCSAqIGJlZm9yZSB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBmaW5pc2hlcywgaXQgaXMgcG9zc2libGUgZm9yCisJCSAqIHByaXZhdGUgcGFnZXMgdG8gYmUgQ09XZWQsIHdoaWNoIHJlbWFpbiBhZnRlcgorCQkgKiB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBmaW5pc2hlcywgaGVuY2UgdGhlIHNlY29uZAorCQkgKiB1bm1hcF9tYXBwaW5nX3JhbmdlIGNhbGwgbXVzdCBiZSBtYWRlIGZvciBjb3JyZWN0bmVzcy4KKwkJICovCisJCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgbmV3ICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7CisJCXRydW5jYXRlX2lub2RlX3BhZ2VzKG1hcHBpbmcsIG5ldyk7CisJCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgbmV3ICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh0cnVuY2F0ZV9wYWdlY2FjaGUpOworCisvKioKKyAqIHZtdHJ1bmNhdGUgLSB1bm1hcCBtYXBwaW5ncyAiZnJlZWQiIGJ5IHRydW5jYXRlKCkgc3lzY2FsbAorICogQGlub2RlOiBpbm9kZSBvZiB0aGUgZmlsZSB1c2VkCisgKiBAb2Zmc2V0OiBmaWxlIG9mZnNldCB0byBzdGFydCB0cnVuY2F0aW5nCisgKgorICogTk9URSEgV2UgaGF2ZSB0byBiZSByZWFkeSB0byB1cGRhdGUgdGhlIG1lbW9yeSBzaGFyaW5nCisgKiBiZXR3ZWVuIHRoZSBmaWxlIGFuZCB0aGUgbWVtb3J5IG1hcCBmb3IgYSBwb3RlbnRpYWwgbGFzdAorICogaW5jb21wbGV0ZSBwYWdlLiAgVWdseSwgYnV0IG5lY2Vzc2FyeS4KKyAqLworaW50IHZtdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCkKK3sKKwlsb2ZmX3Qgb2xkc2l6ZTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGlub2RlX25ld3NpemVfb2soaW5vZGUsIG9mZnNldCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJb2xkc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJaV9zaXplX3dyaXRlKGlub2RlLCBvZmZzZXQpOworCXRydW5jYXRlX3BhZ2VjYWNoZShpbm9kZSwgb2xkc2l6ZSwgb2Zmc2V0KTsKKwlpZiAoaW5vZGUtPmlfb3AtPnRydW5jYXRlKQorCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOworCisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTCh2bXRydW5jYXRlKTsKZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCA2OTUxMWU2Li4wZjU1MWE0IDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTI1LDEwICsyNiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CiAKIAogLyoqKiBQYWdlIHRhYmxlIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKioqLwpAQCAtMTE1NiwxMiArMTE1NywxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqX19nZXRfdm1fYXJlYV9ub2RlKHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCi0JCWludCBub2RlLCBnZnBfdCBnZnBfbWFzaywgdm9pZCAqY2FsbGVyKQorCQl1bnNpZ25lZCBsb25nIGFsaWduLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQl1bnNpZ25lZCBsb25nIGVuZCwgaW50IG5vZGUsIGdmcF90IGdmcF9tYXNrLCB2b2lkICpjYWxsZXIpCiB7CiAJc3RhdGljIHN0cnVjdCB2bWFwX2FyZWEgKnZhOwogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0JdW5zaWduZWQgbG9uZyBhbGlnbiA9IDE7CiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCWlmIChmbGFncyAmIFZNX0lPUkVNQVApIHsKQEAgLTEyMDEsNyArMTIwMSw3IEBACiBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2dldF92bV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlyZXR1cm4gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIGZsYWdzLCBzdGFydCwgZW5kLCAtMSwgR0ZQX0tFUk5FTCwKKwlyZXR1cm4gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIDEsIGZsYWdzLCBzdGFydCwgZW5kLCAtMSwgR0ZQX0tFUk5FTCwKIAkJCQkJCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2dldF92bV9hcmVhKTsKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAogCQkJCSAgICAgICB2b2lkICpjYWxsZXIpCiB7Ci0JcmV0dXJuIF9fZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCBmbGFncywgc3RhcnQsIGVuZCwgLTEsIEdGUF9LRVJORUwsCisJcmV0dXJuIF9fZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCAxLCBmbGFncywgc3RhcnQsIGVuZCwgLTEsIEdGUF9LRVJORUwsCiAJCQkJICBjYWxsZXIpOwogfQogCkBAIC0xMjI1LDIyICsxMjI1LDIyIEBACiAgKi8KIHN0cnVjdCB2bV9zdHJ1Y3QgKmdldF92bV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlyZXR1cm4gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIGZsYWdzLCBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCwKKwlyZXR1cm4gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIDEsIGZsYWdzLCBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCwKIAkJCQktMSwgR0ZQX0tFUk5FTCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIAogc3RydWN0IHZtX3N0cnVjdCAqZ2V0X3ZtX2FyZWFfY2FsbGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQl2b2lkICpjYWxsZXIpCiB7Ci0JcmV0dXJuIF9fZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCBmbGFncywgVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQsCisJcmV0dXJuIF9fZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCAxLCBmbGFncywgVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQsCiAJCQkJCQktMSwgR0ZQX0tFUk5FTCwgY2FsbGVyKTsKIH0KIAogc3RydWN0IHZtX3N0cnVjdCAqZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkJICAgaW50IG5vZGUsIGdmcF90IGdmcF9tYXNrKQogewotCXJldHVybiBfX2dldF92bV9hcmVhX25vZGUoc2l6ZSwgZmxhZ3MsIFZNQUxMT0NfU1RBUlQsIFZNQUxMT0NfRU5ELCBub2RlLAotCQkJCSAgZ2ZwX21hc2ssIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJcmV0dXJuIF9fZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCAxLCBmbGFncywgVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQsCisJCQkJICBub2RlLCBnZnBfbWFzaywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIAogc3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKmZpbmRfdm1fYXJlYShjb25zdCB2b2lkICphZGRyKQpAQCAtMTQwMyw3ICsxNDAzLDggQEAKIH0KIEVYUE9SVF9TWU1CT0wodm1hcCk7CiAKLXN0YXRpYyB2b2lkICpfX3ZtYWxsb2Nfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsIGdmcF90IGdmcF9tYXNrLCBwZ3Byb3RfdCBwcm90LAorc3RhdGljIHZvaWQgKl9fdm1hbGxvY19ub2RlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJCSAgICBnZnBfdCBnZnBfbWFzaywgcGdwcm90X3QgcHJvdCwKIAkJCSAgICBpbnQgbm9kZSwgdm9pZCAqY2FsbGVyKTsKIHN0YXRpYyB2b2lkICpfX3ZtYWxsb2NfYXJlYV9ub2RlKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEsIGdmcF90IGdmcF9tYXNrLAogCQkJCSBwZ3Byb3RfdCBwcm90LCBpbnQgbm9kZSwgdm9pZCAqY2FsbGVyKQpAQCAtMTQxNyw3ICsxNDE4LDcgQEAKIAlhcmVhLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOwogCS8qIFBsZWFzZSBub3RlIHRoYXQgdGhlIHJlY3Vyc2lvbiBpcyBzdHJpY3RseSBib3VuZGVkLiAqLwogCWlmIChhcnJheV9zaXplID4gUEFHRV9TSVpFKSB7Ci0JCXBhZ2VzID0gX192bWFsbG9jX25vZGUoYXJyYXlfc2l6ZSwgZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQlwYWdlcyA9IF9fdm1hbGxvY19ub2RlKGFycmF5X3NpemUsIDEsIGdmcF9tYXNrIHwgX19HRlBfWkVSTywKIAkJCQlQQUdFX0tFUk5FTCwgbm9kZSwgY2FsbGVyKTsKIAkJYXJlYS0+ZmxhZ3MgfD0gVk1fVlBBR0VTOwogCX0gZWxzZSB7CkBAIC0xNDc2LDYgKzE0NzcsNyBAQAogLyoqCiAgKglfX3ZtYWxsb2Nfbm9kZSAgLSAgYWxsb2NhdGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5CiAgKglAc2l6ZToJCWFsbG9jYXRpb24gc2l6ZQorICoJQGFsaWduOgkJZGVzaXJlZCBhbGlnbm1lbnQKICAqCUBnZnBfbWFzazoJZmxhZ3MgZm9yIHRoZSBwYWdlIGxldmVsIGFsbG9jYXRvcgogICoJQHByb3Q6CQlwcm90ZWN0aW9uIG1hc2sgZm9yIHRoZSBhbGxvY2F0ZWQgcGFnZXMKICAqCUBub2RlOgkJbm9kZSB0byB1c2UgZm9yIGFsbG9jYXRpb24gb3IgLTEKQEAgLTE0ODUsOCArMTQ4Nyw5IEBACiAgKglhbGxvY2F0b3Igd2l0aCBAZ2ZwX21hc2sgZmxhZ3MuICBNYXAgdGhlbSBpbnRvIGNvbnRpZ3VvdXMKICAqCWtlcm5lbCB2aXJ0dWFsIHNwYWNlLCB1c2luZyBhIHBhZ2V0YWJsZSBwcm90ZWN0aW9uIG9mIEBwcm90LgogICovCi1zdGF0aWMgdm9pZCAqX192bWFsbG9jX25vZGUodW5zaWduZWQgbG9uZyBzaXplLCBnZnBfdCBnZnBfbWFzaywgcGdwcm90X3QgcHJvdCwKLQkJCQkJCWludCBub2RlLCB2b2lkICpjYWxsZXIpCitzdGF0aWMgdm9pZCAqX192bWFsbG9jX25vZGUodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduLAorCQkJICAgIGdmcF90IGdmcF9tYXNrLCBwZ3Byb3RfdCBwcm90LAorCQkJICAgIGludCBub2RlLCB2b2lkICpjYWxsZXIpCiB7CiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKIAl2b2lkICphZGRyOwpAQCAtMTQ5Niw4ICsxNDk5LDggQEAKIAlpZiAoIXNpemUgfHwgKHNpemUgPj4gUEFHRV9TSElGVCkgPiB0b3RhbHJhbV9wYWdlcykKIAkJcmV0dXJuIE5VTEw7CiAKLQlhcmVhID0gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIFZNX0FMTE9DLCBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCwKLQkJCQkJCW5vZGUsIGdmcF9tYXNrLCBjYWxsZXIpOworCWFyZWEgPSBfX2dldF92bV9hcmVhX25vZGUoc2l6ZSwgYWxpZ24sIFZNX0FMTE9DLCBWTUFMTE9DX1NUQVJULAorCQkJCSAgVk1BTExPQ19FTkQsIG5vZGUsIGdmcF9tYXNrLCBjYWxsZXIpOwogCiAJaWYgKCFhcmVhKQogCQlyZXR1cm4gTlVMTDsKQEAgLTE1MTYsNyArMTUxOSw3IEBACiAKIHZvaWQgKl9fdm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIGdmcF90IGdmcF9tYXNrLCBwZ3Byb3RfdCBwcm90KQogewotCXJldHVybiBfX3ZtYWxsb2Nfbm9kZShzaXplLCBnZnBfbWFzaywgcHJvdCwgLTEsCisJcmV0dXJuIF9fdm1hbGxvY19ub2RlKHNpemUsIDEsIGdmcF9tYXNrLCBwcm90LCAtMSwKIAkJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogRVhQT1JUX1NZTUJPTChfX3ZtYWxsb2MpOwpAQCAtMTUzMiw3ICsxNTM1LDcgQEAKICAqLwogdm9pZCAqdm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JcmV0dXJuIF9fdm1hbGxvY19ub2RlKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNLCBQQUdFX0tFUk5FTCwKKwlyZXR1cm4gX192bWFsbG9jX25vZGUoc2l6ZSwgMSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMLAogCQkJCQktMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1hbGxvYyk7CkBAIC0xNTQ5LDcgKzE1NTIsOCBAQAogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CiAJdm9pZCAqcmV0OwogCi0JcmV0ID0gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLAorCXJldCA9IF9fdm1hbGxvY19ub2RlKHNpemUsIFNITUxCQSwKKwkJCSAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLAogCQkJICAgICBQQUdFX0tFUk5FTCwgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAJaWYgKHJldCkgewogCQlhcmVhID0gZmluZF92bV9hcmVhKHJldCk7CkBAIC0xNTcyLDcgKzE1NzYsNyBAQAogICovCiB2b2lkICp2bWFsbG9jX25vZGUodW5zaWduZWQgbG9uZyBzaXplLCBpbnQgbm9kZSkKIHsKLQlyZXR1cm4gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMLAorCXJldHVybiBfX3ZtYWxsb2Nfbm9kZShzaXplLCAxLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUwsCiAJCQkJCW5vZGUsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiBFWFBPUlRfU1lNQk9MKHZtYWxsb2Nfbm9kZSk7CkBAIC0xNTk1LDcgKzE1OTksNyBAQAogCiB2b2lkICp2bWFsbG9jX2V4ZWModW5zaWduZWQgbG9uZyBzaXplKQogewotCXJldHVybiBfX3ZtYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUxfRVhFQywKKwlyZXR1cm4gX192bWFsbG9jX25vZGUoc2l6ZSwgMSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMX0VYRUMsCiAJCQkgICAgICAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIApAQCAtMTYxNiw3ICsxNjIwLDcgQEAKICAqLwogdm9pZCAqdm1hbGxvY18zMih1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JcmV0dXJuIF9fdm1hbGxvY19ub2RlKHNpemUsIEdGUF9WTUFMTE9DMzIsIFBBR0VfS0VSTkVMLAorCXJldHVybiBfX3ZtYWxsb2Nfbm9kZShzaXplLCAxLCBHRlBfVk1BTExPQzMyLCBQQUdFX0tFUk5FTCwKIAkJCSAgICAgIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogRVhQT1JUX1NZTUJPTCh2bWFsbG9jXzMyKTsKQEAgLTE2MzMsNyArMTYzNyw3IEBACiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKIAl2b2lkICpyZXQ7CiAKLQlyZXQgPSBfX3ZtYWxsb2Nfbm9kZShzaXplLCBHRlBfVk1BTExPQzMyIHwgX19HRlBfWkVSTywgUEFHRV9LRVJORUwsCisJcmV0ID0gX192bWFsbG9jX25vZGUoc2l6ZSwgMSwgR0ZQX1ZNQUxMT0MzMiB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMLAogCQkJICAgICAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAlpZiAocmV0KSB7CiAJCWFyZWEgPSBmaW5kX3ZtX2FyZWEocmV0KTsKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggNjEzZTg5Zi4uNzc3YWY1NyAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTU0NCw2ICs1NDQsMTYgQEAKIAkJICovCiAJCWxydSA9IExSVV9VTkVWSUNUQUJMRTsKIAkJYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChwYWdlKTsKKwkJLyoKKwkJICogV2hlbiByYWNpbmcgd2l0aCBhbiBtbG9jayBjbGVhcmluZyAocGFnZSBpcworCQkgKiB1bmxvY2tlZCksIG1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBvdGhlciB0aHJlYWQgZG9lcworCQkgKiBub3Qgb2JzZXJ2ZSBvdXIgc2V0dGluZyBvZiBQR19scnUgYW5kIGZhaWxzCisJCSAqIGlzb2xhdGlvbiwgd2Ugc2VlIFBHX21sb2NrZWQgY2xlYXJlZCBiZWxvdyBhbmQgbW92ZQorCQkgKiB0aGUgcGFnZSBiYWNrIHRvIHRoZSBldmljdGFibGUgbGlzdC4KKwkJICoKKwkJICogVGhlIG90aGVyIHNpZGUgaXMgVGVzdENsZWFyUGFnZU1sb2NrZWQoKS4KKwkJICovCisJCXNtcF9tYigpOwogCX0KIAogCS8qCkBAIC02NjMsNyArNjczLDcgQEAKIAkJICogcHJvY2Vzc2VzLiBUcnkgdG8gdW5tYXAgaXQgaGVyZS4KIAkJICovCiAJCWlmIChwYWdlX21hcHBlZChwYWdlKSAmJiBtYXBwaW5nKSB7Ci0JCQlzd2l0Y2ggKHRyeV90b191bm1hcChwYWdlLCAwKSkgeworCQkJc3dpdGNoICh0cnlfdG9fdW5tYXAocGFnZSwgVFRVX1VOTUFQKSkgewogCQkJY2FzZSBTV0FQX0ZBSUw6CiAJCQkJZ290byBhY3RpdmF0ZV9sb2NrZWQ7CiAJCQljYXNlIFNXQVBfQUdBSU46CkBAIC0xMDg4LDcgKzEwOTgsNyBAQAogCWludCBsdW1weV9yZWNsYWltID0gMDsKIAogCXdoaWxlICh1bmxpa2VseSh0b29fbWFueV9pc29sYXRlZCh6b25lLCBmaWxlLCBzYykpKSB7Ci0JCWNvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWi8xMCk7CiAKIAkJLyogV2UgYXJlIGFib3V0IHRvIGRpZSBhbmQgZnJlZSBvdXIgbWVtb3J5LiBSZXR1cm4gbm93LiAqLwogCQlpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCkBAIC0xMzU2LDcgKzEzNjYsNyBAQAogCQkJICogSU8sIHBsdXMgSlZNIGNhbiBjcmVhdGUgbG90cyBvZiBhbm9uIFZNX0VYRUMgcGFnZXMsCiAJCQkgKiBzbyB3ZSBpZ25vcmUgdGhlbSBoZXJlLgogCQkJICovCi0JCQlpZiAoKHZtX2ZsYWdzICYgVk1fRVhFQykgJiYgIVBhZ2VBbm9uKHBhZ2UpKSB7CisJCQlpZiAoKHZtX2ZsYWdzICYgVk1fRVhFQykgJiYgcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKSB7CiAJCQkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJmxfYWN0aXZlKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTE3MDksMTAgKzE3MTksMTAgQEAKICAqCiAgKiBJZiB0aGUgY2FsbGVyIGlzICFfX0dGUF9GUyB0aGVuIHRoZSBwcm9iYWJpbGl0eSBvZiBhIGZhaWx1cmUgaXMgcmVhc29uYWJseQogICogaGlnaCAtIHRoZSB6b25lIG1heSBiZSBmdWxsIG9mIGRpcnR5IG9yIHVuZGVyLXdyaXRlYmFjayBwYWdlcywgd2hpY2ggdGhpcwotICogY2FsbGVyIGNhbid0IGRvIG11Y2ggYWJvdXQuICBXZSBraWNrIHBkZmx1c2ggYW5kIHRha2UgZXhwbGljaXQgbmFwcyBpbiB0aGUKLSAqIGhvcGUgdGhhdCBzb21lIG9mIHRoZXNlIHBhZ2VzIGNhbiBiZSB3cml0dGVuLiAgQnV0IGlmIHRoZSBhbGxvY2F0aW5nIHRhc2sKLSAqIGhvbGRzIGZpbGVzeXN0ZW0gbG9ja3Mgd2hpY2ggcHJldmVudCB3cml0ZW91dCB0aGlzIG1pZ2h0IG5vdCB3b3JrLCBhbmQgdGhlCi0gKiBhbGxvY2F0aW9uIGF0dGVtcHQgd2lsbCBmYWlsLgorICogY2FsbGVyIGNhbid0IGRvIG11Y2ggYWJvdXQuICBXZSBraWNrIHRoZSB3cml0ZWJhY2sgdGhyZWFkcyBhbmQgdGFrZSBleHBsaWNpdAorICogbmFwcyBpbiB0aGUgaG9wZSB0aGF0IHNvbWUgb2YgdGhlc2UgcGFnZXMgY2FuIGJlIHdyaXR0ZW4uICBCdXQgaWYgdGhlCisgKiBhbGxvY2F0aW5nIHRhc2sgaG9sZHMgZmlsZXN5c3RlbSBsb2NrcyB3aGljaCBwcmV2ZW50IHdyaXRlb3V0IHRoaXMgbWlnaHQgbm90CisgKiB3b3JrLCBhbmQgdGhlIGFsbG9jYXRpb24gYXR0ZW1wdCB3aWxsIGZhaWwuCiAgKgogICogcmV0dXJuczoJMCwgaWYgbm8gcGFnZXMgcmVjbGFpbWVkCiAgKiAJCWVsc2UsIHRoZSBudW1iZXIgb2YgcGFnZXMgcmVjbGFpbWVkCkBAIC0xODM2LDExICsxODQ2LDQ1IEBACiAKICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgogCit1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfc2hyaW5rX25vZGVfem9uZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCQkJZ2ZwX3QgZ2ZwX21hc2ssIGJvb2wgbm9zd2FwLAorCQkJCQkJdW5zaWduZWQgaW50IHN3YXBwaW5lc3MsCisJCQkJCQlzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG5pZCkKK3sKKwlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0geworCQkubWF5X3dyaXRlcGFnZSA9ICFsYXB0b3BfbW9kZSwKKwkJLm1heV91bm1hcCA9IDEsCisJCS5tYXlfc3dhcCA9ICFub3N3YXAsCisJCS5zd2FwX2NsdXN0ZXJfbWF4ID0gU1dBUF9DTFVTVEVSX01BWCwKKwkJLnN3YXBwaW5lc3MgPSBzd2FwcGluZXNzLAorCQkub3JkZXIgPSAwLAorCQkubWVtX2Nncm91cCA9IG1lbSwKKwkJLmlzb2xhdGVfcGFnZXMgPSBtZW1fY2dyb3VwX2lzb2xhdGVfcGFnZXMsCisJfTsKKwlub2RlbWFza190IG5tICA9IG5vZGVtYXNrX29mX25vZGUobmlkKTsKKworCXNjLmdmcF9tYXNrID0gKGdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSykgfAorCQkJKEdGUF9ISUdIVVNFUl9NT1ZBQkxFICYgfkdGUF9SRUNMQUlNX01BU0spOworCXNjLm5vZGVtYXNrID0gJm5tOworCXNjLm5yX3JlY2xhaW1lZCA9IDA7CisJc2MubnJfc2Nhbm5lZCA9IDA7CisJLyoKKwkgKiBOT1RFOiBBbHRob3VnaCB3ZSBjYW4gZ2V0IHRoZSBwcmlvcml0eSBmaWVsZCwgdXNpbmcgaXQKKwkgKiBoZXJlIGlzIG5vdCBhIGdvb2QgaWRlYSwgc2luY2UgaXQgbGltaXRzIHRoZSBwYWdlcyB3ZSBjYW4gc2Nhbi4KKwkgKiBpZiB3ZSBkb24ndCByZWNsYWltIGhlcmUsIHRoZSBzaHJpbmtfem9uZSBmcm9tIGJhbGFuY2VfcGdkYXQKKwkgKiB3aWxsIHBpY2sgdXAgcGFnZXMgZnJvbSBvdGhlciBtZW0gY2dyb3VwJ3MgYXMgd2VsbC4gV2UgaGFjaworCSAqIHRoZSBwcmlvcml0eSBhbmQgbWFrZSBpdCB6ZXJvLgorCSAqLworCXNocmlua196b25lKDAsIHpvbmUsICZzYyk7CisJcmV0dXJuIHNjLm5yX3JlY2xhaW1lZDsKK30KKwogdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY29udCwKIAkJCQkJICAgZ2ZwX3QgZ2ZwX21hc2ssCiAJCQkJCSAgIGJvb2wgbm9zd2FwLAogCQkJCQkgICB1bnNpZ25lZCBpbnQgc3dhcHBpbmVzcykKIHsKKwlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0OwogCXN0cnVjdCBzY2FuX2NvbnRyb2wgc2MgPSB7CiAJCS5tYXlfd3JpdGVwYWdlID0gIWxhcHRvcF9tb2RlLAogCQkubWF5X3VubWFwID0gMSwKQEAgLTE4NTIsNyArMTg5Niw2IEBACiAJCS5pc29sYXRlX3BhZ2VzID0gbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzLAogCQkubm9kZW1hc2sgPSBOVUxMLCAvKiB3ZSBkb24ndCBjYXJlIHRoZSBwbGFjZW1lbnQgKi8KIAl9OwotCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3Q7CiAKIAlzYy5nZnBfbWFzayA9IChnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0spIHwKIAkJCShHRlBfSElHSFVTRVJfTU9WQUJMRSAmIH5HRlBfUkVDTEFJTV9NQVNLKTsKQEAgLTE5NzQsNiArMjAxNyw3IEBACiAJCWZvciAoaSA9IDA7IGkgPD0gZW5kX3pvbmU7IGkrKykgewogCQkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7CiAJCQlpbnQgbnJfc2xhYjsKKwkJCWludCBuaWQsIHppZDsKIAogCQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKIAkJCQljb250aW51ZTsKQEAgLTE5ODgsNiArMjAzMiwxNSBAQAogCQkJdGVtcF9wcmlvcml0eVtpXSA9IHByaW9yaXR5OwogCQkJc2MubnJfc2Nhbm5lZCA9IDA7CiAJCQlub3RlX3pvbmVfc2Nhbm5pbmdfcHJpb3JpdHkoem9uZSwgcHJpb3JpdHkpOworCisJCQluaWQgPSBwZ2RhdC0+bm9kZV9pZDsKKwkJCXppZCA9IHpvbmVfaWR4KHpvbmUpOworCQkJLyoKKwkJCSAqIENhbGwgc29mdCBsaW1pdCByZWNsYWltIGJlZm9yZSBjYWxsaW5nIHNocmlua196b25lLgorCQkJICogRm9yIG5vdyB3ZSBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZQorCQkJICovCisJCQltZW1fY2dyb3VwX3NvZnRfbGltaXRfcmVjbGFpbSh6b25lLCBvcmRlciwgc2MuZ2ZwX21hc2ssCisJCQkJCQkJbmlkLCB6aWQpOwogCQkJLyoKIAkJCSAqIFdlIHB1dCBlcXVhbCBwcmVzc3VyZSBvbiBldmVyeSB6b25lLCB1bmxlc3Mgb25lCiAJCQkgKiB6b25lIGhhcyB3YXkgdG9vIG1hbnkgcGFnZXMgZnJlZSBhbHJlYWR5LgpAQCAtMjgwMSwxMCArMjg1NCwxMCBAQAogdW5zaWduZWQgbG9uZyBzY2FuX3VuZXZpY3RhYmxlX3BhZ2VzOwogCiBpbnQgc2Nhbl91bmV2aWN0YWJsZV9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsCiAJCQkgICBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQogewotCXByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKIAogCWlmICh3cml0ZSAmJiAqKHVuc2lnbmVkIGxvbmcgKil0YWJsZS0+ZGF0YSkKIAkJc2Nhbl9hbGxfem9uZXNfdW5ldmljdGFibGVfcGFnZXMoKTsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX25ldGxpbmsuYyBiL25ldC84MDIxcS92bGFuX25ldGxpbmsuYwppbmRleCAzNDMxNDZlLi5hOTE1MDQ4IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9uZXRsaW5rLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fbmV0bGluay5jCkBAIC0xNjksNiArMTY5LDcgQEAKIAlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKIAogCXJldHVybiBubGFfdG90YWxfc2l6ZSgyKSArCS8qIElGTEFfVkxBTl9JRCAqLworCSAgICAgICBzaXplb2Yoc3RydWN0IGlmbGFfdmxhbl9mbGFncykgKyAvKiBJRkxBX1ZMQU5fRkxBR1MgKi8KIAkgICAgICAgdmxhbl9xb3NfbWFwX3NpemUodmxhbi0+bnJfaW5ncmVzc19tYXBwaW5ncykgKwogCSAgICAgICB2bGFuX3Fvc19tYXBfc2l6ZSh2bGFuLT5ucl9lZ3Jlc3NfbWFwcGluZ3MpOwogfQpkaWZmIC0tZ2l0IGEvbmV0LzlwL2NsaWVudC5jIGIvbmV0LzlwL2NsaWVudC5jCmluZGV4IDViZjVmMjIuLjhhZjk1YjIgMTAwNjQ0Ci0tLSBhL25ldC85cC9jbGllbnQuYworKysgYi9uZXQvOXAvY2xpZW50LmMKQEAgLTU4MiwxMSArNTgyLDkgQEAKIAogCW1lbXNldCgmZmlkLT5xaWQsIDAsIHNpemVvZihzdHJ1Y3QgcDlfcWlkKSk7CiAJZmlkLT5tb2RlID0gLTE7Ci0JZmlkLT5yZGlyX2Zwb3MgPSAwOwogCWZpZC0+dWlkID0gY3VycmVudF9mc3VpZCgpOwogCWZpZC0+Y2xudCA9IGNsbnQ7Ci0JZmlkLT5hdXggPSBOVUxMOwotCisJZmlkLT5yZGlyID0gTlVMTDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xudC0+bG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkKCZmaWQtPmZsaXN0LCAmY2xudC0+ZmlkbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xudC0+bG9jaywgZmxhZ3MpOwpAQCAtNjA5LDYgKzYwNyw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNsbnQtPmxvY2ssIGZsYWdzKTsKIAlsaXN0X2RlbCgmZmlkLT5mbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xudC0+bG9jaywgZmxhZ3MpOworCWtmcmVlKGZpZC0+cmRpcik7CiAJa2ZyZWUoZmlkKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0LzlwL3RyYW5zX3ZpcnRpby5jIGIvbmV0LzlwL3RyYW5zX3ZpcnRpby5jCmluZGV4IGIyZTA3ZjAuLmVhMWUzZGEgMTAwNjQ0Ci0tLSBhL25ldC85cC90cmFuc192aXJ0aW8uYworKysgYi9uZXQvOXAvdHJhbnNfdmlydGlvLmMKQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxuZXQvOXAvdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW8uaD4KLSNpbmNsdWRlIDxsaW51eC92aXJ0aW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvXzlwLmg+CiAKICNkZWZpbmUgVklSVFFVRVVFX05VTQkxMjgKZGlmZiAtLWdpdCBhL25ldC9hdG0vY29tbW9uLmMgYi9uZXQvYXRtL2NvbW1vbi5jCmluZGV4IDhjNGQ4NDMuLjk1MGJkMTYgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY29tbW9uLmMKKysrIGIvbmV0L2F0bS9jb21tb24uYwpAQCAtNjc5LDcgKzY3OSw3IEBACiB9CiAKIGludCB2Y2Nfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBhdG1fdmNjICp2Y2M7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vY29tbW9uLmggYi9uZXQvYXRtL2NvbW1vbi5oCmluZGV4IDkyZTI5ODEuLmY0OGE3NmIgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY29tbW9uLmgKKysrIGIvbmV0L2F0bS9jb21tb24uaApAQCAtMjEsNyArMjEsNyBAQAogaW50IHZjY19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBpbnQgdmNjX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBpbnQgdmNjX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CisJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogaW50IHZjY19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7CiAKZGlmZiAtLWdpdCBhL25ldC9hdG0vcHZjLmMgYi9uZXQvYXRtL3B2Yy5jCmluZGV4IGUxZDIyZDkuLmQ0YzAyNDUgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vcHZjLmMKKysrIGIvbmV0L2F0bS9wdmMuYwpAQCAtNTksNyArNTksNyBAQAogfQogCiBzdGF0aWMgaW50IHB2Y19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJaW50IGVycm9yOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9zdmMuYyBiL25ldC9hdG0vc3ZjLmMKaW5kZXggN2I4MzFiNS4uZjkwZDE0MyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9zdmMuYworKysgYi9uZXQvYXRtL3N2Yy5jCkBAIC00NDYsNyArNDQ2LDcgQEAKIAogCiBzdGF0aWMgaW50IHN2Y19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGF0bV92Y2MgKnZjYyA9IEFUTV9TRChzb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9heDI1L2FmX2F4MjUuYyBiL25ldC9heDI1L2FmX2F4MjUuYwppbmRleCBkYTBmNjRmLi5mNDU0NjA3IDEwMDY0NAotLS0gYS9uZXQvYXgyNS9hZl9heDI1LmMKKysrIGIvbmV0L2F4MjUvYWZfYXgyNS5jCkBAIC0zNTgsNiArMzU4LDcgQEAKIAlheDI1X2RldiAqYXgyNV9kZXY7CiAJYXgyNV9jYiAqYXgyNTsKIAl1bnNpZ25lZCBpbnQgazsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmYXgyNV9jdGwsIGFyZywgc2l6ZW9mKGF4MjVfY3RsKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMzg4LDU3ICszODksNjMgQEAKIAljYXNlIEFYMjVfV0lORE9XOgogCQlpZiAoYXgyNS0+bW9kdWx1cyA9PSBBWDI1X01PRFVMVVMpIHsKIAkJCWlmIChheDI1X2N0bC5hcmcgPCAxIHx8IGF4MjVfY3RsLmFyZyA+IDcpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJZ290byBlaW52YWxfcHV0OwogCQl9IGVsc2UgewogCQkJaWYgKGF4MjVfY3RsLmFyZyA8IDEgfHwgYXgyNV9jdGwuYXJnID4gNjMpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJZ290byBlaW52YWxfcHV0OwogCQl9CiAJCWF4MjUtPndpbmRvdyA9IGF4MjVfY3RsLmFyZzsKIAkJYnJlYWs7CiAKIAljYXNlIEFYMjVfVDE6CiAJCWlmIChheDI1X2N0bC5hcmcgPCAxKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnb3RvIGVpbnZhbF9wdXQ7CiAJCWF4MjUtPnJ0dCA9IChheDI1X2N0bC5hcmcgKiBIWikgLyAyOwogCQlheDI1LT50MSAgPSBheDI1X2N0bC5hcmcgKiBIWjsKIAkJYnJlYWs7CiAKIAljYXNlIEFYMjVfVDI6CiAJCWlmIChheDI1X2N0bC5hcmcgPCAxKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnb3RvIGVpbnZhbF9wdXQ7CiAJCWF4MjUtPnQyID0gYXgyNV9jdGwuYXJnICogSFo7CiAJCWJyZWFrOwogCiAJY2FzZSBBWDI1X04yOgogCQlpZiAoYXgyNV9jdGwuYXJnIDwgMSB8fCBheDI1X2N0bC5hcmcgPiAzMSkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZ290byBlaW52YWxfcHV0OwogCQlheDI1LT5uMmNvdW50ID0gMDsKIAkJYXgyNS0+bjIgPSBheDI1X2N0bC5hcmc7CiAJCWJyZWFrOwogCiAJY2FzZSBBWDI1X1QzOgogCQlpZiAoYXgyNV9jdGwuYXJnIDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZ290byBlaW52YWxfcHV0OwogCQlheDI1LT50MyA9IGF4MjVfY3RsLmFyZyAqIEhaOwogCQlicmVhazsKIAogCWNhc2UgQVgyNV9JRExFOgogCQlpZiAoYXgyNV9jdGwuYXJnIDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZ290byBlaW52YWxfcHV0OwogCQlheDI1LT5pZGxlID0gYXgyNV9jdGwuYXJnICogNjAgKiBIWjsKIAkJYnJlYWs7CiAKIAljYXNlIEFYMjVfUEFDTEVOOgogCQlpZiAoYXgyNV9jdGwuYXJnIDwgMTYgfHwgYXgyNV9jdGwuYXJnID4gNjU1MzUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWdvdG8gZWludmFsX3B1dDsKIAkJYXgyNS0+cGFjbGVuID0gYXgyNV9jdGwuYXJnOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIGVpbnZhbF9wdXQ7CiAJICB9CiAKLQlyZXR1cm4gMDsKK291dF9wdXQ6CisJYXgyNV9jYl9wdXQoYXgyNSk7CisJcmV0dXJuIHJldDsKKworZWludmFsX3B1dDoKKwlyZXQgPSAtRUlOVkFMOworCWdvdG8gb3V0X3B1dDsKIH0KIAogc3RhdGljIHZvaWQgYXgyNV9maWxsaW5fY2JfZnJvbV9kZXYoYXgyNV9jYiAqYXgyNSwgYXgyNV9kZXYgKmF4MjVfZGV2KQpAQCAtNTI3LDcgKzUzNCw3IEBACiAgKi8KIAogc3RhdGljIGludCBheDI1X3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJYXgyNV9jYiAqYXgyNTsKQEAgLTYzNCwxNSArNjQxLDEwIEBACiAKIAljYXNlIFNPX0JJTkRUT0RFVklDRToKIAkJaWYgKG9wdGxlbiA+IElGTkFNU0laKQotCQkJb3B0bGVuPUlGTkFNU0laOwotCQlpZiAoY29weV9mcm9tX3VzZXIoZGV2bmFtZSwgb3B0dmFsLCBvcHRsZW4pKSB7Ci0JCXJlcyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQorCQkJb3B0bGVuID0gSUZOQU1TSVo7CiAKLQkJZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgZGV2bmFtZSk7Ci0JCWlmIChkZXYgPT0gTlVMTCkgewotCQkJcmVzID0gLUVOT0RFVjsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRldm5hbWUsIG9wdHZhbCwgb3B0bGVuKSkgeworCQkJcmVzID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTY1MCwxMiArNjUyLDE4IEBACiAJCSAgIChzb2NrLT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCB8fAogCQkgICAgc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pKSB7CiAJCQlyZXMgPSAtRUFERFJOT1RBVkFJTDsKLQkJCWRldl9wdXQoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgZGV2bmFtZSk7CisJCWlmICghZGV2KSB7CisJCQlyZXMgPSAtRU5PREVWOwogCQkJYnJlYWs7CiAJCX0KIAogCQlheDI1LT5heDI1X2RldiA9IGF4MjVfZGV2X2F4MjVkZXYoZGV2KTsKIAkJYXgyNV9maWxsaW5fY2IoYXgyNSwgYXgyNS0+YXgyNV9kZXYpOworCQlkZXZfcHV0KGRldik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTg5Myw3ICs5MDEsNiBAQAogCiAJc29ja19pbml0X2RhdGEoTlVMTCwgc2spOwogCi0Jc2stPnNrX2Rlc3RydWN0ID0gYXgyNV9mcmVlX3NvY2s7CiAJc2stPnNrX3R5cGUgICAgID0gb3NrLT5za190eXBlOwogCXNrLT5za19wcmlvcml0eSA9IG9zay0+c2tfcHJpb3JpdHk7CiAJc2stPnNrX3Byb3RvY29sID0gb3NrLT5za19wcm90b2NvbDsKQEAgLTkzMSw2ICs5MzgsNyBAQAogCX0KIAogCXNrLT5za19wcm90aW5mbyA9IGF4MjU7CisJc2stPnNrX2Rlc3RydWN0ID0gYXgyNV9mcmVlX3NvY2s7CiAJYXgyNS0+c2sgICAgPSBzazsKIAogCXJldHVybiBzazsKQEAgLTE3ODEsOCArMTc4OSw4IEBACiAJCWF4MjVfaW5mby5pZGxldGltZXIgPSBheDI1X2Rpc3BsYXlfdGltZXIoJmF4MjUtPmlkbGV0aW1lcikgLyAoNjAgKiBIWik7CiAJCWF4MjVfaW5mby5uMmNvdW50ICAgPSBheDI1LT5uMmNvdW50OwogCQlheDI1X2luZm8uc3RhdGUgICAgID0gYXgyNS0+c3RhdGU7Ci0JCWF4MjVfaW5mby5yY3ZfcSAgICAgPSBza193bWVtX2FsbG9jX2dldChzayk7Ci0JCWF4MjVfaW5mby5zbmRfcSAgICAgPSBza19ybWVtX2FsbG9jX2dldChzayk7CisJCWF4MjVfaW5mby5yY3ZfcSAgICAgPSBza19ybWVtX2FsbG9jX2dldChzayk7CisJCWF4MjVfaW5mby5zbmRfcSAgICAgPSBza193bWVtX2FsbG9jX2dldChzayk7CiAJCWF4MjVfaW5mby52cyAgICAgICAgPSBheDI1LT52czsKIAkJYXgyNV9pbmZvLnZyICAgICAgICA9IGF4MjUtPnZyOwogCQlheDI1X2luZm8udmEgICAgICAgID0gYXgyNS0+dmE7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKaW5kZXggNGY5NjIxZi4uNzUzMDJhOSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJZ290byBkb25lOwogfQogCi1zdGF0aWMgaW50IGhjaV9zb2NrX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IGxlbikKK3N0YXRpYyBpbnQgaGNpX3NvY2tfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBoY2lfdWZpbHRlciB1ZiA9IHsgLm9wY29kZSA9IDAgfTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jCmluZGV4IDdmOTM5Y2UuLjJiYzZmNmEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYwpAQCAtOTIsNiArOTIsOCBAQAogCiAJZGV2X3NldF9uYW1lKCZjb25uLT5kZXYsICIlczolZCIsIGhkZXYtPm5hbWUsIGNvbm4tPmhhbmRsZSk7CiAKKwlkZXZfc2V0X2RydmRhdGEoJmNvbm4tPmRldiwgY29ubik7CisKIAlpZiAoZGV2aWNlX2FkZCgmY29ubi0+ZGV2KSA8IDApIHsKIAkJQlRfRVJSKCJGYWlsZWQgdG8gcmVnaXN0ZXIgY29ubmVjdGlvbiBkZXZpY2UiKTsKIAkJcmV0dXJuOwpAQCAtMTQ0LDggKzE0Niw2IEBACiAJY29ubi0+ZGV2LmNsYXNzID0gYnRfY2xhc3M7CiAJY29ubi0+ZGV2LnBhcmVudCA9ICZoZGV2LT5kZXY7CiAKLQlkZXZfc2V0X2RydmRhdGEoJmNvbm4tPmRldiwgY29ubik7Ci0KIAlkZXZpY2VfaW5pdGlhbGl6ZSgmY29ubi0+ZGV2KTsKIAogCUlOSVRfV09SSygmY29ubi0+d29ya19hZGQsIGFkZF9jb25uKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXAuYyBiL25ldC9ibHVldG9vdGgvbDJjYXAuYwppbmRleCBiMDMwMTI1Li43N2U5ZmIxIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcC5jCkBAIC01NTUsMTIgKzU1NSwxMiBAQAogCiAJY29ubi0+ZmVhdF9tYXNrID0gMDsKIAotCXNldHVwX3RpbWVyKCZjb25uLT5pbmZvX3RpbWVyLCBsMmNhcF9pbmZvX3RpbWVvdXQsCi0JCQkJCQkodW5zaWduZWQgbG9uZykgY29ubik7Ci0KIAlzcGluX2xvY2tfaW5pdCgmY29ubi0+bG9jayk7CiAJcndsb2NrX2luaXQoJmNvbm4tPmNoYW5fbGlzdC5sb2NrKTsKIAorCXNldHVwX3RpbWVyKCZjb25uLT5pbmZvX3RpbWVyLCBsMmNhcF9pbmZvX3RpbWVvdXQsCisJCQkJCQkodW5zaWduZWQgbG9uZykgY29ubik7CisKIAljb25uLT5kaXNjX3JlYXNvbiA9IDB4MTM7CiAKIAlyZXR1cm4gY29ubjsKQEAgLTc4Myw2ICs3ODMsOSBAQAogCS8qIERlZmF1bHQgY29uZmlnIG9wdGlvbnMgKi8KIAlwaS0+Y29uZl9sZW4gPSAwOwogCXBpLT5mbHVzaF90byA9IEwyQ0FQX0RFRkFVTFRfRkxVU0hfVE87CisJc2tiX3F1ZXVlX2hlYWRfaW5pdChUWF9RVUVVRShzaykpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoU1JFSl9RVUVVRShzaykpOworCUlOSVRfTElTVF9IRUFEKFNSRUpfTElTVChzaykpOwogfQogCiBzdGF0aWMgc3RydWN0IHByb3RvIGwyY2FwX3Byb3RvID0gewpAQCAtMTY5OCw3ICsxNzAxLDcgQEAKIAlyZXR1cm4gYnRfc29ja19yZWN2bXNnKGlvY2IsIHNvY2ssIG1zZywgbGVuLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgbDJjYXBfc29ja19zZXRzb2Nrb3B0X29sZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19zZXRzb2Nrb3B0X29sZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgbDJjYXBfb3B0aW9ucyBvcHRzOwpAQCAtMTc1NSw3ICsxNzU4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGwyY2FwX3NvY2tfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorc3RhdGljIGludCBsMmNhcF9zb2NrX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgYnRfc2VjdXJpdHkgc2VjOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCmluZGV4IDBiODVlODEuLjhhMjBhYWYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKQEAgLTczMCw3ICs3MzAsNyBAQAogCXJldHVybiBjb3BpZWQgPyA6IGVycjsKIH0KIAotc3RhdGljIGludCByZmNvbW1fc29ja19zZXRzb2Nrb3B0X29sZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfc2V0c29ja29wdF9vbGQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJaW50IGVyciA9IDA7CkBAIC03NjYsNyArNzY2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJmY29tbV9zb2NrX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBidF9zZWN1cml0eSBzZWM7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3Njby5jIGIvbmV0L2JsdWV0b290aC9zY28uYwppbmRleCAxM2MyN2YxLi43N2Y0MTUzIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3Njby5jCisrKyBiL25ldC9ibHVldG9vdGgvc2NvLmMKQEAgLTY0NCw3ICs2NDQsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgc2NvX3NvY2tfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorc3RhdGljIGludCBzY29fc29ja19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJaW50IGVyciA9IDA7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggMTQyZWJhYy4uYjFiM2IwZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtNDMyLDYgKzQzMiw3IEBACiAJYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KGJyLCBwLCAxKTsKIGVycjE6CiAJa29iamVjdF9wdXQoJnAtPmtvYmopOworCXAgPSBOVUxMOyAvKiBrb2JqZWN0X3B1dCBmcmVlcyAqLwogZXJyMDoKIAlkZXZfc2V0X3Byb21pc2N1aXR5KGRldiwgLTEpOwogcHV0X2JhY2s6CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwppbmRleCA5MDdhODJlLi5hMTZhMjM0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTk2NSwxMiArOTY1LDEyIEBACiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiBzdGF0aWMKLWludCBicm5mX3N5c2N0bF9jYWxsX3RhYmxlcyhjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgYnJuZl9zeXNjdGxfY2FsbF90YWJsZXMoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsCiAJCQkgICAgdm9pZCBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqIHBwb3MpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAlpZiAod3JpdGUgJiYgKihpbnQgKikoY3RsLT5kYXRhKSkKIAkJKihpbnQgKikoY3RsLT5kYXRhKSA9IDE7CmRpZmYgLS1naXQgYS9uZXQvY2FuL3Jhdy5jIGIvbmV0L2Nhbi9yYXcuYwppbmRleCBkYjMxNTJkLi5iNWU4OTc5IDEwMDY0NAotLS0gYS9uZXQvY2FuL3Jhdy5jCisrKyBiL25ldC9jYW4vcmF3LmMKQEAgLTQxMSw3ICs0MTEsNyBAQAogfQogCiBzdGF0aWMgaW50IHJhd19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHJhd19zb2NrICpybyA9IHJhd19zayhzayk7CmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggMTI3MjhiMS4uYTQwN2MzYSAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiB9OwogCiBzdGF0aWMgaW50IGRvX3NldF9hdHRhY2hfZmlsdGVyKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBjb21wYXRfc29ja19mcHJvZyBfX3VzZXIgKmZwcm9nMzIgPSAoc3RydWN0IGNvbXBhdF9zb2NrX2Zwcm9nIF9fdXNlciAqKW9wdHZhbDsKIAlzdHJ1Y3Qgc29ja19mcHJvZyBfX3VzZXIgKmtmcHJvZyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3Qgc29ja19mcHJvZykpOwpAQCAtMzUxLDcgKzM1MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZG9fc2V0X3NvY2tfdGltZW91dChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsCi0JCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp1cCA9IChzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICopIG9wdHZhbDsKIAlzdHJ1Y3QgdGltZXZhbCBrdGltZTsKQEAgLTM3Myw3ICszNzMsNyBAQAogfQogCiBzdGF0aWMgaW50IGNvbXBhdF9zb2NrX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaWYgKG9wdG5hbWUgPT0gU09fQVRUQUNIX0ZJTFRFUikKIAkJcmV0dXJuIGRvX3NldF9hdHRhY2hfZmlsdGVyKHNvY2ssIGxldmVsLCBvcHRuYW1lLApAQCAtMzg1LDcgKzM4NSw3IEBACiB9CiAKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NldHNvY2tvcHQoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CkBAIC01NTgsOCArNTU4LDggQEAKIAogCiBpbnQgY29tcGF0X21jX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbiwKLQlpbnQgKCpzZXRzb2Nrb3B0KShzdHJ1Y3Qgc29jayAqLGludCxpbnQsY2hhciBfX3VzZXIgKixpbnQpKQorCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4sCisJaW50ICgqc2V0c29ja29wdCkoc3RydWN0IHNvY2sgKixpbnQsaW50LGNoYXIgX191c2VyICosdW5zaWduZWQgaW50KSkKIHsKIAljaGFyIF9fdXNlcgkqa29wdHZhbCA9IG9wdHZhbDsKIAlpbnQJCWtvcHRsZW4gPSBvcHRsZW47CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kYXRhZ3JhbS5jIGIvbmV0L2NvcmUvZGF0YWdyYW0uYwppbmRleCAxYzZjZjNhLi40YWRlMzAxIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kYXRhZ3JhbS5jCisrKyBiL25ldC9jb3JlL2RhdGFncmFtLmMKQEAgLTIyNCw2ICsyMjQsMTUgQEAKIAljb25zdW1lX3NrYihza2IpOwogCXNrX21lbV9yZWNsYWltX3BhcnRpYWwoc2spOwogfQorRVhQT1JUX1NZTUJPTChza2JfZnJlZV9kYXRhZ3JhbSk7CisKK3ZvaWQgc2tiX2ZyZWVfZGF0YWdyYW1fbG9ja2VkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsb2NrX3NvY2soc2spOworCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworCXJlbGVhc2Vfc29jayhzayk7Cit9CitFWFBPUlRfU1lNQk9MKHNrYl9mcmVlX2RhdGFncmFtX2xvY2tlZCk7CiAKIC8qKgogICoJc2tiX2tpbGxfZGF0YWdyYW0gLSBGcmVlIGEgZGF0YWdyYW0gc2tidWZmIGZvcmNpYmx5CkBAIC03NTIsNSArNzYxLDQgQEAKIEVYUE9SVF9TWU1CT0woZGF0YWdyYW1fcG9sbCk7CiBFWFBPUlRfU1lNQk9MKHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtX2lvdmVjKTsKIEVYUE9SVF9TWU1CT0woc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMpOwotRVhQT1JUX1NZTUJPTChza2JfZnJlZV9kYXRhZ3JhbSk7CiBFWFBPUlRfU1lNQk9MKHNrYl9yZWN2X2RhdGFncmFtKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggNTYwYzhjOS4uYjhmNzRjZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTIyODgsNiArMjI4OCw5IEBACiAJaW50IHJldCA9IE5FVF9SWF9EUk9QOwogCV9fYmUxNiB0eXBlOwogCisJaWYgKCFza2ItPnRzdGFtcC50djY0KQorCQluZXRfdGltZXN0YW1wKHNrYik7CisKIAlpZiAoc2tiLT52bGFuX3RjaSAmJiB2bGFuX2h3YWNjZWxfZG9fcmVjZWl2ZShza2IpKQogCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CiAKQEAgLTIyOTUsOSArMjI5OCw2IEBACiAJaWYgKG5ldHBvbGxfcmVjZWl2ZV9za2Ioc2tiKSkKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCi0JaWYgKCFza2ItPnRzdGFtcC50djY0KQotCQluZXRfdGltZXN0YW1wKHNrYik7Ci0KIAlpZiAoIXNrYi0+aWlmKQogCQlza2ItPmlpZiA9IHNrYi0+ZGV2LT5pZmluZGV4OwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXQtc3lzZnMuYyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCmluZGV4IDdkNGM1NzUuLjQyN2RlZDggMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldC1zeXNmcy5jCisrKyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjaW5jbHVkZSA8bmV0L3dleHQuaD4KIAogI2luY2x1ZGUgIm5ldC1zeXNmcy5oIgogCkBAIC0zNjMsMTggKzM2MywxNiBAQAogCQkJCQkgICAgICAgY2hhciAqKSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihkKTsKLQljb25zdCBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqaXcgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpd19zdGF0aXN0aWNzICppdzsKIAlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKLQlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCXJ0bmxfbG9jaygpOwogCWlmIChkZXZfaXNhbGl2ZShkZXYpKSB7Ci0JCWlmIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzICYmCi0JCSAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMpCi0JCQlpdyA9IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cyhkZXYpOwotCQlpZiAoaXcgIT0gTlVMTCkKKwkJaXcgPSBnZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KTsKKwkJaWYgKGl3KQogCQkJcmV0ID0gKCpmb3JtYXQpKGl3LCBidWYpOwogCX0KLQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJcnRubF91bmxvY2soKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01MDUsNyArNTAzLDcgQEAKIAkqZ3JvdXBzKysgPSAmbmV0c3RhdF9ncm91cDsKIAogI2lmZGVmIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlMKLQlpZiAobmV0LT53aXJlbGVzc19oYW5kbGVycyAmJiBuZXQtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMpCisJaWYgKG5ldC0+d2lyZWxlc3NfaGFuZGxlcnMgfHwgbmV0LT5pZWVlODAyMTFfcHRyKQogCQkqZ3JvdXBzKysgPSAmd2lyZWxlc3NfZ3JvdXA7CiAjZW5kaWYKICNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggMGJjZWNiZi4uNmViOGQ0NyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTE5MiwxMSArMTkyLDEwIEBACiAjZGVmaW5lIEZfUVVFVUVfTUFQX0NQVSAoMTw8MTQpCS8qIHF1ZXVlIG1hcCBtaXJyb3JzIHNtcF9wcm9jZXNzb3JfaWQoKSAqLwogCiAvKiBUaHJlYWQgY29udHJvbCBmbGFnIGJpdHMgKi8KLSNkZWZpbmUgVF9URVJNSU5BVEUgICAoMTw8MCkKLSNkZWZpbmUgVF9TVE9QICAgICAgICAoMTw8MSkJLyogU3RvcCBydW4gKi8KLSNkZWZpbmUgVF9SVU4gICAgICAgICAoMTw8MikJLyogU3RhcnQgcnVuICovCi0jZGVmaW5lIFRfUkVNREVWQUxMICAgKDE8PDMpCS8qIFJlbW92ZSBhbGwgZGV2cyAqLwotI2RlZmluZSBUX1JFTURFViAgICAgICgxPDw0KQkvKiBSZW1vdmUgb25lIGRldiAqLworI2RlZmluZSBUX1NUT1AgICAgICAgICgxPDwwKQkvKiBTdG9wIHJ1biAqLworI2RlZmluZSBUX1JVTiAgICAgICAgICgxPDwxKQkvKiBTdGFydCBydW4gKi8KKyNkZWZpbmUgVF9SRU1ERVZBTEwgICAoMTw8MikJLyogUmVtb3ZlIGFsbCBkZXZzICovCisjZGVmaW5lIFRfUkVNREVWICAgICAgKDE8PDMpCS8qIFJlbW92ZSBvbmUgZGV2ICovCiAKIC8qIElmIGxvY2sgLS0gY2FuIGJlIHJlbW92ZWQgYWZ0ZXIgc29tZSB3b3JrICovCiAjZGVmaW5lICAgaWZfbG9jayh0KSAgICAgICAgICAgc3Bpbl9sb2NrKCYodC0+aWZfbG9jaykpOwpAQCAtMzM2LDYgKzMzNSw3IEBACiAJX191MzIgY3VyX3NyY19tYWNfb2Zmc2V0OwogCV9fYmUzMiBjdXJfc2FkZHI7CiAJX19iZTMyIGN1cl9kYWRkcjsKKwlfX3UxNiBpcF9pZDsKIAlfX3UxNiBjdXJfdWRwX2RzdDsKIAlfX3UxNiBjdXJfdWRwX3NyYzsKIAlfX3UxNiBjdXJfcXVldWVfbWFwOwpAQCAtOTY1LDcgKzk2NSw3IEBACiAJCWlmICh2YWx1ZSA9PSAweDdGRkZGRkZGKQogCQkJcGt0X2Rldi0+ZGVsYXkgPSBVTExPTkdfTUFYOwogCQllbHNlCi0JCQlwa3RfZGV2LT5kZWxheSA9ICh1NjQpdmFsdWUgKiBOU0VDX1BFUl9VU0VDOworCQkJcGt0X2Rldi0+ZGVsYXkgPSAodTY0KXZhbHVlOwogCiAJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRlbGF5PSVsbHUiLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+ZGVsYXkpOwpAQCAtMjEwNSwxOCArMjEwNSwyMCBAQAogCiBzdGF0aWMgdm9pZCBzcGluKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2LCBrdGltZV90IHNwaW5fdW50aWwpCiB7Ci0Ja3RpbWVfdCBzdGFydDsKLQlzMzIgcmVtYWluaW5nOworCWt0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7CisJczY0IHJlbWFpbmluZzsKIAlzdHJ1Y3QgaHJ0aW1lcl9zbGVlcGVyIHQ7CiAKIAlocnRpbWVyX2luaXRfb25fc3RhY2soJnQudGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CiAJaHJ0aW1lcl9zZXRfZXhwaXJlcygmdC50aW1lciwgc3Bpbl91bnRpbCk7CiAKIAlyZW1haW5pbmcgPSBrdGltZV90b191cyhocnRpbWVyX2V4cGlyZXNfcmVtYWluaW5nKCZ0LnRpbWVyKSk7Ci0JaWYgKHJlbWFpbmluZyA8PSAwKQorCWlmIChyZW1haW5pbmcgPD0gMCkgeworCQlwa3RfZGV2LT5uZXh0X3R4ID0ga3RpbWVfYWRkX25zKHNwaW5fdW50aWwsIHBrdF9kZXYtPmRlbGF5KTsKIAkJcmV0dXJuOworCX0KIAotCXN0YXJ0ID0ga3RpbWVfbm93KCk7CisJc3RhcnRfdGltZSA9IGt0aW1lX25vdygpOwogCWlmIChyZW1haW5pbmcgPCAxMDApCiAJCXVkZWxheShyZW1haW5pbmcpOyAJLyogcmVhbGx5IHNtYWxsIGp1c3Qgc3BpbiAqLwogCWVsc2UgewpAQCAtMjEzNSw3ICsyMTM3LDEwIEBACiAJCX0gd2hpbGUgKHQudGFzayAmJiBwa3RfZGV2LT5ydW5uaW5nICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CiAJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAl9Ci0JcGt0X2Rldi0+aWRsZV9hY2MgKz0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKGt0aW1lX25vdygpLCBzdGFydCkpOworCWVuZF90aW1lID0ga3RpbWVfbm93KCk7CisKKwlwa3RfZGV2LT5pZGxlX2FjYyArPSBrdGltZV90b19ucyhrdGltZV9zdWIoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpKTsKKwlwa3RfZGV2LT5uZXh0X3R4ID0ga3RpbWVfYWRkX25zKGVuZF90aW1lLCBwa3RfZGV2LT5kZWxheSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGt0X292ZXJoZWFkKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQpAQCAtMjIwOCw3ICsyMjEzLDcgQEAKIAlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1FVRVVFX01BUF9DUFUpCiAJCXBrdF9kZXYtPmN1cl9xdWV1ZV9tYXAgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQllbHNlIGlmIChwa3RfZGV2LT5xdWV1ZV9tYXBfbWluIDwgcGt0X2Rldi0+cXVldWVfbWFwX21heCkgeworCWVsc2UgaWYgKHBrdF9kZXYtPnF1ZXVlX21hcF9taW4gPD0gcGt0X2Rldi0+cXVldWVfbWFwX21heCkgewogCQlfX3UxNiB0OwogCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1FVRVVFX01BUF9STkQpIHsKIAkJCXQgPSByYW5kb20zMigpICUKQEAgLTI2MjYsNiArMjYzMSw4IEBACiAJaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fVURQOwkvKiBVRFAgKi8KIAlpcGgtPnNhZGRyID0gcGt0X2Rldi0+Y3VyX3NhZGRyOwogCWlwaC0+ZGFkZHIgPSBwa3RfZGV2LT5jdXJfZGFkZHI7CisJaXBoLT5pZCA9IGh0b25zKHBrdF9kZXYtPmlwX2lkKTsKKwlwa3RfZGV2LT5pcF9pZCsrOwogCWlwaC0+ZnJhZ19vZmYgPSAwOwogCWlwbGVuID0gMjAgKyA4ICsgZGF0YWxlbjsKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhpcGxlbik7CkBAIC0yNjM3LDI0ICsyNjQ0LDI2IEBACiAJc2tiLT5kZXYgPSBvZGV2OwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAotCWlmIChwa3RfZGV2LT5uZnJhZ3MgPD0gMCkKKwlpZiAocGt0X2Rldi0+bmZyYWdzIDw9IDApIHsKIAkJcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyICopc2tiX3B1dChza2IsIGRhdGFsZW4pOwotCWVsc2UgeworCQltZW1zZXQocGdoICsgMSwgMCwgZGF0YWxlbiAtIHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcikpOworCX0gZWxzZSB7CiAJCWludCBmcmFncyA9IHBrdF9kZXYtPm5mcmFnczsKLQkJaW50IGk7CisJCWludCBpLCBsZW47CiAKIAkJcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyICopKCgoY2hhciAqKSh1ZHBoKSkgKyA4KTsKIAogCQlpZiAoZnJhZ3MgPiBNQVhfU0tCX0ZSQUdTKQogCQkJZnJhZ3MgPSBNQVhfU0tCX0ZSQUdTOwogCQlpZiAoZGF0YWxlbiA+IGZyYWdzICogUEFHRV9TSVpFKSB7Ci0JCQlza2JfcHV0KHNrYiwgZGF0YWxlbiAtIGZyYWdzICogUEFHRV9TSVpFKTsKKwkJCWxlbiA9IGRhdGFsZW4gLSBmcmFncyAqIFBBR0VfU0laRTsKKwkJCW1lbXNldChza2JfcHV0KHNrYiwgbGVuKSwgMCwgbGVuKTsKIAkJCWRhdGFsZW4gPSBmcmFncyAqIFBBR0VfU0laRTsKIAkJfQogCiAJCWkgPSAwOwogCQl3aGlsZSAoZGF0YWxlbiA+IDApIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCAwKTsKIAkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHBhZ2U7CiAJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ID0gMDsKIAkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA9CkBAIC0zMzY1LDE4ICszMzc0LDI4IEBACiAJbXV0ZXhfdW5sb2NrKCZwa3RnZW5fdGhyZWFkX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBpZGxlKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQorc3RhdGljIHZvaWQgcGt0Z2VuX3Jlc2NoZWQoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCiB7CiAJa3RpbWVfdCBpZGxlX3N0YXJ0ID0ga3RpbWVfbm93KCk7Ci0KLQlpZiAobmVlZF9yZXNjaGVkKCkpCi0JCXNjaGVkdWxlKCk7Ci0JZWxzZQotCQljcHVfcmVsYXgoKTsKLQorCXNjaGVkdWxlKCk7CiAJcGt0X2Rldi0+aWRsZV9hY2MgKz0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKGt0aW1lX25vdygpLCBpZGxlX3N0YXJ0KSk7CiB9CiAKK3N0YXRpYyB2b2lkIHBrdGdlbl93YWl0X2Zvcl9za2Ioc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCit7CisJa3RpbWVfdCBpZGxlX3N0YXJ0ID0ga3RpbWVfbm93KCk7CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJihwa3RfZGV2LT5za2ItPnVzZXJzKSkgIT0gMSkgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKworCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlwa3RnZW5fcmVzY2hlZChwa3RfZGV2KTsKKwkJZWxzZQorCQkJY3B1X3JlbGF4KCk7CisJfQorCXBrdF9kZXYtPmlkbGVfYWNjICs9IGt0aW1lX3RvX25zKGt0aW1lX3N1YihrdGltZV9ub3coKSwgaWRsZV9zdGFydCkpOworfQogCiBzdGF0aWMgdm9pZCBwa3RnZW5feG1pdChzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKIHsKQEAgLTMzODcsMzYgKzM0MDYsMjEgQEAKIAl1MTYgcXVldWVfbWFwOwogCWludCByZXQ7CiAKLQlpZiAocGt0X2Rldi0+ZGVsYXkpIHsKLQkJc3Bpbihwa3RfZGV2LCBwa3RfZGV2LT5uZXh0X3R4KTsKLQotCQkvKiBUaGlzIGlzIG1heCBERUxBWSwgdGhpcyBoYXMgc3BlY2lhbCBtZWFuaW5nIG9mCi0JCSAqICJuZXZlciB0cmFuc21pdCIKLQkJICovCi0JCWlmIChwa3RfZGV2LT5kZWxheSA9PSBVTExPTkdfTUFYKSB7Ci0JCQlwa3RfZGV2LT5uZXh0X3R4ID0ga3RpbWVfYWRkX25zKGt0aW1lX25vdygpLCBVTE9OR19NQVgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JaWYgKCFwa3RfZGV2LT5za2IpIHsKLQkJc2V0X2N1cl9xdWV1ZV9tYXAocGt0X2Rldik7Ci0JCXF1ZXVlX21hcCA9IHBrdF9kZXYtPmN1cl9xdWV1ZV9tYXA7Ci0JfSBlbHNlIHsKLQkJcXVldWVfbWFwID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHBrdF9kZXYtPnNrYik7Ci0JfQotCi0JdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShvZGV2LCBxdWV1ZV9tYXApOwotCS8qIERpZCB3ZSBzYXR1cmF0ZSB0aGUgcXVldWUgYWxyZWFkeT8gKi8KLQlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpIHx8IG5ldGlmX3R4X3F1ZXVlX2Zyb3plbih0eHEpKSB7Ci0JCS8qIElmIGRldmljZSBpcyBkb3duLCB0aGVuIGFsbCBxdWV1ZXMgYXJlIHBlcm1uYW50bHkgZnJvemVuICovCi0JCWlmIChuZXRpZl9ydW5uaW5nKG9kZXYpKQotCQkJaWRsZShwa3RfZGV2KTsKLQkJZWxzZQotCQkJcGt0Z2VuX3N0b3BfZGV2aWNlKHBrdF9kZXYpOworCS8qIElmIGRldmljZSBpcyBvZmZsaW5lLCB0aGVuIGRvbid0IHNlbmQgKi8KKwlpZiAodW5saWtlbHkoIW5ldGlmX3J1bm5pbmcob2RldikgfHwgIW5ldGlmX2NhcnJpZXJfb2sob2RldikpKSB7CisJCXBrdGdlbl9zdG9wX2RldmljZShwa3RfZGV2KTsKIAkJcmV0dXJuOwogCX0KIAorCS8qIFRoaXMgaXMgbWF4IERFTEFZLCB0aGlzIGhhcyBzcGVjaWFsIG1lYW5pbmcgb2YKKwkgKiAibmV2ZXIgdHJhbnNtaXQiCisJICovCisJaWYgKHVubGlrZWx5KHBrdF9kZXYtPmRlbGF5ID09IFVMTE9OR19NQVgpKSB7CisJCXBrdF9kZXYtPm5leHRfdHggPSBrdGltZV9hZGRfbnMoa3RpbWVfbm93KCksIFVMT05HX01BWCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBubyBza2Igb3IgY2xvbmUgY291bnQgZXhoYXVzdGVkIHRoZW4gZ2V0IG5ldyBvbmUgKi8KIAlpZiAoIXBrdF9kZXYtPnNrYiB8fCAocGt0X2Rldi0+bGFzdF9vayAmJgogCQkJICAgICAgKytwa3RfZGV2LT5jbG9uZV9jb3VudCA+PSBwa3RfZGV2LT5jbG9uZV9za2IpKSB7CiAJCS8qIGJ1aWxkIGEgbmV3IHBrdCAqLwpAQCAtMzQzNSw1NCArMzQzOSw0NSBAQAogCQlwa3RfZGV2LT5jbG9uZV9jb3VudCA9IDA7CS8qIHJlc2V0IGNvdW50ZXIgKi8KIAl9CiAKLQkvKiBmaWxsX3BhY2tldCgpIG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGUgcXVldWUgKi8KKwlpZiAocGt0X2Rldi0+ZGVsYXkgJiYgcGt0X2Rldi0+bGFzdF9vaykKKwkJc3Bpbihwa3RfZGV2LCBwa3RfZGV2LT5uZXh0X3R4KTsKKwogCXF1ZXVlX21hcCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhwa3RfZGV2LT5za2IpOwogCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUob2RldiwgcXVldWVfbWFwKTsKIAogCV9fbmV0aWZfdHhfbG9ja19iaCh0eHEpOworCWF0b21pY19pbmMoJihwa3RfZGV2LT5za2ItPnVzZXJzKSk7CisKIAlpZiAodW5saWtlbHkobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpIHx8IG5ldGlmX3R4X3F1ZXVlX2Zyb3plbih0eHEpKSkKLQkJcGt0X2Rldi0+bGFzdF9vayA9IDA7Ci0JZWxzZSB7Ci0JCWF0b21pY19pbmMoJihwa3RfZGV2LT5za2ItPnVzZXJzKSk7Ci0KLQlyZXRyeV9ub3c6CisJCXJldCA9IE5FVERFVl9UWF9CVVNZOworCWVsc2UKIAkJcmV0ID0gKCp4bWl0KShwa3RfZGV2LT5za2IsIG9kZXYpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIE5FVERFVl9UWF9PSzoKLQkJCXR4cV90cmFuc191cGRhdGUodHhxKTsKLQkJCXBrdF9kZXYtPmxhc3Rfb2sgPSAxOwotCQkJcGt0X2Rldi0+c29mYXIrKzsKLQkJCXBrdF9kZXYtPnNlcV9udW0rKzsKLQkJCXBrdF9kZXYtPnR4X2J5dGVzICs9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZTsKLQkJCWJyZWFrOwotCQljYXNlIE5FVERFVl9UWF9MT0NLRUQ6Ci0JCQljcHVfcmVsYXgoKTsKLQkJCWdvdG8gcmV0cnlfbm93OwotCQlkZWZhdWx0OiAvKiBEcml2ZXJzIGFyZSBub3Qgc3VwcG9zZWQgdG8gcmV0dXJuIG90aGVyIHZhbHVlcyEgKi8KLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJcHJfaW5mbygicGt0Z2VuOiAlcyB4bWl0IGVycm9yOiAlZFxuIiwKLQkJCQkJb2Rldi0+bmFtZSwgcmV0KTsKLQkJCXBrdF9kZXYtPmVycm9ycysrOwotCQkJLyogZmFsbHRocnUgKi8KLQkJY2FzZSBORVRERVZfVFhfQlVTWToKLQkJCS8qIFJldHJ5IGl0IG5leHQgdGltZSAqLwotCQkJYXRvbWljX2RlYygmKHBrdF9kZXYtPnNrYi0+dXNlcnMpKTsKLQkJCXBrdF9kZXYtPmxhc3Rfb2sgPSAwOwotCQl9CiAKLQkJaWYgKHBrdF9kZXYtPmRlbGF5KQotCQkJcGt0X2Rldi0+bmV4dF90eCA9IGt0aW1lX2FkZF9ucyhrdGltZV9ub3coKSwKLQkJCQkJCQlwa3RfZGV2LT5kZWxheSk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIE5FVERFVl9UWF9PSzoKKwkJdHhxX3RyYW5zX3VwZGF0ZSh0eHEpOworCQlwa3RfZGV2LT5sYXN0X29rID0gMTsKKwkJcGt0X2Rldi0+c29mYXIrKzsKKwkJcGt0X2Rldi0+c2VxX251bSsrOworCQlwa3RfZGV2LT50eF9ieXRlcyArPSBwa3RfZGV2LT5jdXJfcGt0X3NpemU7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIERyaXZlcnMgYXJlIG5vdCBzdXBwb3NlZCB0byByZXR1cm4gb3RoZXIgdmFsdWVzISAqLworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJfaW5mbygicGt0Z2VuOiAlcyB4bWl0IGVycm9yOiAlZFxuIiwKKwkJCQlvZGV2LT5uYW1lLCByZXQpOworCQlwa3RfZGV2LT5lcnJvcnMrKzsKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIE5FVERFVl9UWF9MT0NLRUQ6CisJY2FzZSBORVRERVZfVFhfQlVTWToKKwkJLyogUmV0cnkgaXQgbmV4dCB0aW1lICovCisJCWF0b21pY19kZWMoJihwa3RfZGV2LT5za2ItPnVzZXJzKSk7CisJCXBrdF9kZXYtPmxhc3Rfb2sgPSAwOwogCX0KIAlfX25ldGlmX3R4X3VubG9ja19iaCh0eHEpOwogCiAJLyogSWYgcGt0X2Rldi0+Y291bnQgaXMgemVybywgdGhlbiBydW4gZm9yZXZlciAqLwogCWlmICgocGt0X2Rldi0+Y291bnQgIT0gMCkgJiYgKHBrdF9kZXYtPnNvZmFyID49IHBrdF9kZXYtPmNvdW50KSkgewotCQl3aGlsZSAoYXRvbWljX3JlYWQoJihwa3RfZGV2LT5za2ItPnVzZXJzKSkgIT0gMSkgewotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCWJyZWFrOwotCQkJaWRsZShwa3RfZGV2KTsKLQkJfQorCQlwa3RnZW5fd2FpdF9mb3Jfc2tiKHBrdF9kZXYpOwogCiAJCS8qIERvbmUgd2l0aCB0aGlzICovCiAJCXBrdGdlbl9zdG9wX2RldmljZShwa3RfZGV2KTsKQEAgLTM1MTUsMjAgKzM1MTAsMjQgQEAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlwa3RfZGV2ID0gbmV4dF90b19ydW4odCk7CiAKLQkJaWYgKCFwa3RfZGV2ICYmCi0JCSAgICAodC0+Y29udHJvbCAmIChUX1NUT1AgfCBUX1JVTiB8IFRfUkVNREVWQUxMIHwgVF9SRU1ERVYpKQotCQkgICAgPT0gMCkgewotCQkJcHJlcGFyZV90b193YWl0KCYodC0+cXVldWUpLCAmd2FpdCwKLQkJCQkJVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCk7Ci0JCQlmaW5pc2hfd2FpdCgmKHQtPnF1ZXVlKSwgJndhaXQpOworCQlpZiAodW5saWtlbHkoIXBrdF9kZXYgJiYgdC0+Y29udHJvbCA9PSAwKSkgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodC0+cXVldWUsCisJCQkJCQkJIHQtPmNvbnRyb2wgIT0gMCwKKwkJCQkJCQkgSFovMTApOworCQkJY29udGludWU7CiAJCX0KIAogCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAKLQkJaWYgKHBrdF9kZXYpCisJCWlmIChsaWtlbHkocGt0X2RldikpIHsKIAkJCXBrdGdlbl94bWl0KHBrdF9kZXYpOwogCisJCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQkJcGt0Z2VuX3Jlc2NoZWQocGt0X2Rldik7CisJCQllbHNlCisJCQkJY3B1X3JlbGF4KCk7CisJCX0KKwogCQlpZiAodC0+Y29udHJvbCAmIFRfU1RPUCkgewogCQkJcGt0Z2VuX3N0b3AodCk7CiAJCQl0LT5jb250cm9sICY9IH4oVF9TVE9QKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCA1MjQ3MTJhLi43NjI2YjZhIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC00NDYsNyArNDQ2LDcgQEAKICAqLwogCiBpbnQgc29ja19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlpbnQgdmFsOwpAQCAtMTIyOCwxNyArMTIyOCwyMiBAQAogdm9pZCBzb2NrX3dmcmVlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKLQlpbnQgcmVzOworCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPnRydWVzaXplOwogCi0JLyogSW4gY2FzZSBpdCBtaWdodCBiZSB3YWl0aW5nIGZvciBtb3JlIG1lbW9yeS4gKi8KLQlyZXMgPSBhdG9taWNfc3ViX3JldHVybihza2ItPnRydWVzaXplLCAmc2stPnNrX3dtZW1fYWxsb2MpOwotCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1VTRV9XUklURV9RVUVVRSkpCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfVVNFX1dSSVRFX1FVRVVFKSkgeworCQkvKgorCQkgKiBLZWVwIGEgcmVmZXJlbmNlIG9uIHNrX3dtZW1fYWxsb2MsIHRoaXMgd2lsbCBiZSByZWxlYXNlZAorCQkgKiBhZnRlciBza193cml0ZV9zcGFjZSgpIGNhbGwKKwkJICovCisJCWF0b21pY19zdWIobGVuIC0gMSwgJnNrLT5za193bWVtX2FsbG9jKTsKIAkJc2stPnNrX3dyaXRlX3NwYWNlKHNrKTsKKwkJbGVuID0gMTsKKwl9CiAJLyoKLQkgKiBpZiBza193bWVtX2FsbG9jIHJlYWNoZWQgMCwgd2UgYXJlIGxhc3QgdXNlciBhbmQgc2hvdWxkCi0JICogZnJlZSB0aGlzIHNvY2ssIGFzIHNrX2ZyZWUoKSBjYWxsIGNvdWxkIG5vdCBkbyBpdC4KKwkgKiBpZiBza193bWVtX2FsbG9jIHJlYWNoZXMgMCwgd2UgbXVzdCBmaW5pc2ggd2hhdCBza19mcmVlKCkKKwkgKiBjb3VsZCBub3QgZG8gYmVjYXVzZSBvZiBpbi1mbGlnaHQgcGFja2V0cwogCSAqLwotCWlmIChyZXMgPT0gMCkKKwlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdChsZW4sICZzay0+c2tfd21lbV9hbGxvYykpCiAJCV9fc2tfZnJlZShzayk7CiB9CiBFWFBPUlRfU1lNQk9MKHNvY2tfd2ZyZWUpOwpAQCAtMTY5Nyw3ICsxNzAyLDcgQEAKIEVYUE9SVF9TWU1CT0woc29ja19ub19zaHV0ZG93bik7CiAKIGludCBzb2NrX25vX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTIwMTgsNyArMjAyMyw3IEBACiAgKglTZXQgc29ja2V0IG9wdGlvbnMgb24gYW4gaW5ldCBzb2NrZXQuCiAgKi8KIGludCBzb2NrX2NvbW1vbl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIApAQCAtMjAyOCw3ICsyMDMzLDcgQEAKIAogI2lmZGVmIENPTkZJR19DT01QQVQKIGludCBjb21wYXRfc29ja19jb21tb25fc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAKZGlmZiAtLWdpdCBhL25ldC9kY2IvZGNibmwuYyBiL25ldC9kY2IvZGNibmwuYwppbmRleCBlMDg3OWJmLi5hYzEyMDVkIDEwMDY0NAotLS0gYS9uZXQvZGNiL2RjYm5sLmMKKysrIGIvbmV0L2RjYi9kY2JubC5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAlubG1zZ19lbmQoZGNibmxfc2tiLCBubGgpOwogCXJldCA9IHJ0bmxfdW5pY2FzdChkY2JubF9za2IsICZpbml0X25ldCwgcGlkKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKIG5sbXNnX2ZhaWx1cmU6CkBAIC0yNzUsNyArMjc1LDcgQEAKIAogCXJldCA9IHJ0bmxfdW5pY2FzdChkY2JubF9za2IsICZpbml0X25ldCwgcGlkKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfb3V0OwogCiAJcmV0dXJuIDA7CiBubG1zZ19mYWlsdXJlOgpAQCAtMzE2LDEyICszMTYsMTEgQEAKIAogCXJldCA9IHJ0bmxfdW5pY2FzdChkY2JubF9za2IsICZpbml0X25ldCwgcGlkKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfb3V0OwogCiAJcmV0dXJuIDA7CiAKIG5sbXNnX2ZhaWx1cmU6Ci1lcnI6CiAJa2ZyZWVfc2tiKGRjYm5sX3NrYik7CiBlcnJfb3V0OgogCXJldHVybiAtRUlOVkFMOwpAQCAtMzgzLDcgKzM4Miw3IEBACiAKIAlyZXQgPSBydG5sX3VuaWNhc3QoZGNibmxfc2tiLCAmaW5pdF9uZXQsIHBpZCk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCWdvdG8gZXJyX291dDsKIAogCXJldHVybiAwOwogbmxtc2dfZmFpbHVyZToKQEAgLTQ2MCw3ICs0NTksNyBAQAogCXJldCA9IHJ0bmxfdW5pY2FzdChkY2JubF9za2IsICZpbml0X25ldCwgcGlkKTsKIAlpZiAocmV0KSB7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOworCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC03OTksNyArNzk4LDcgQEAKIAogCXJldCA9IHJ0bmxfdW5pY2FzdChkY2JubF9za2IsICZpbml0X25ldCwgcGlkKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfb3V0OwogCiAJcmV0dXJuIDA7CiAKQEAgLTEwNjMsNyArMTA2Miw3IEBACiAKIAlyZXQgPSBydG5sX3VuaWNhc3QoZGNibmxfc2tiLCAmaW5pdF9uZXQsIHBpZCk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCWdvdG8gZXJyX291dDsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9kY2NwLmggYi9uZXQvZGNjcC9kY2NwLmgKaW5kZXggZDZiYzQ3My4uNWVmMzJjMiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZGNjcC5oCisrKyBiL25ldC9kY2NwL2RjY3AuaApAQCAtMjkwLDE0ICsyOTAsMTQgQEAKIGV4dGVybiBpbnQJICAgZGNjcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwogZXh0ZXJuIGludAkgICBkY2NwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogI2lmZGVmIENPTkZJR19DT01QQVQKIGV4dGVybiBpbnQJICAgY29tcGF0X2RjY3BfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwogZXh0ZXJuIGludAkgICBjb21wYXRfZGNjcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywKIAkJCQlpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogI2VuZGlmCiBleHRlcm4gaW50CSAgIGRjY3BfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50CSAgIGRjY3Bfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKZGlmZiAtLWdpdCBhL25ldC9kY2NwL3Byb3RvLmMgYi9uZXQvZGNjcC9wcm90by5jCmluZGV4IGJjNDQ2NzAuLmExNTYzMTkgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3Byb3RvLmMKKysrIGIvbmV0L2RjY3AvcHJvdG8uYwpAQCAtMzkzLDcgKzM5Myw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChkY2NwX2lvY3RsKTsKIAogc3RhdGljIGludCBkY2NwX3NldHNvY2tvcHRfc2VydmljZShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IF9fYmUzMiBzZXJ2aWNlLAotCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBkY2NwX3NlcnZpY2VfbGlzdCAqc2wgPSBOVUxMOwpAQCAtNDY0LDcgKzQ2NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZGNjcF9zZXRzb2Nrb3B0X2NjaWQoc3RydWN0IHNvY2sgKnNrLCBpbnQgdHlwZSwKLQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJdTggKnZhbDsKIAlpbnQgcmMgPSAwOwpAQCAtNDk0LDcgKzQ5NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZG9fZGNjcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCWludCB2YWwsIGVyciA9IDA7CkBAIC01NDYsNyArNTQ2LDcgQEAKIH0KIAogaW50IGRjY3Bfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpZiAobGV2ZWwgIT0gU09MX0RDQ1ApCiAJCXJldHVybiBpbmV0X2NzayhzayktPmljc2tfYWZfb3BzLT5zZXRzb2Nrb3B0KHNrLCBsZXZlbCwKQEAgLTU1OSw3ICs1NTksNyBAQAogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogaW50IGNvbXBhdF9kY2NwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaWYgKGxldmVsICE9IFNPTF9EQ0NQKQogCQlyZXR1cm4gaW5ldF9jc2tfY29tcGF0X3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKaW5kZXggNzdkNDAyOC4uN2E1OGM4NyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYworKysgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBkbl93aWxkX3NrOwogc3RhdGljIGF0b21pY190IGRlY25ldF9tZW1vcnlfYWxsb2NhdGVkOwogCi1zdGF0aWMgaW50IF9fZG5fc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBfX2RuX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbiwgaW50IGZsYWdzKTsKIHN0YXRpYyBpbnQgX19kbl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbiwgaW50IGZsYWdzKTsKIAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpkbl9maW5kX2xpc3Qoc3RydWN0IHNvY2sgKnNrKQpAQCAtMTMyNSw3ICsxMzI1LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGRuX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3N0YXRpYyBpbnQgZG5fc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCWludCBlcnI7CkBAIC0xMzM3LDcgKzEzMzcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kbl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCxpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbiwgaW50IGZsYWdzKQorc3RhdGljIGludCBfX2RuX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0CXNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9kZXYuYyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKaW5kZXggMWM2YTViYi4uNmUxZjA4NSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9kZXYuYworKysgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIHN0YXRpYyBpbnQgbWluX3ByaW9yaXR5WzFdOwogc3RhdGljIGludCBtYXhfcHJpb3JpdHlbXSA9IHsgMTI3IH07IC8qIEZyb20gREVDbmV0IHNwZWMgKi8KIAotc3RhdGljIGludCBkbl9mb3J3YXJkaW5nX3Byb2MoY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKK3N0YXRpYyBpbnQgZG5fZm9yd2FyZGluZ19wcm9jKGN0bF90YWJsZSAqLCBpbnQsCiAJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogc3RhdGljIGludCBkbl9mb3J3YXJkaW5nX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLAogCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKQEAgLTI3NCw3ICsyNzQsNiBAQAogfQogCiBzdGF0aWMgaW50IGRuX2ZvcndhcmRpbmdfcHJvYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJc3RydWN0IGZpbGUgKmZpbGVwLAogCQkJCXZvaWQgX191c2VyICpidWZmZXIsCiAJCQkJc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0yOTAsNyArMjg5LDcgQEAKIAlkbl9kYiA9IGRldi0+ZG5fcHRyOwogCW9sZCA9IGRuX2RiLT5wYXJtcy5mb3J3YXJkaW5nOwogCi0JZXJyID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbGVwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWVyciA9IHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJaWYgKChlcnIgPj0gMCkgJiYgd3JpdGUpIHsKIAkJaWYgKGRuX2RiLT5wYXJtcy5mb3J3YXJkaW5nIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvc3lzY3RsX25ldF9kZWNuZXQuYyBiL25ldC9kZWNuZXQvc3lzY3RsX25ldF9kZWNuZXQuYwppbmRleCA1YmNkNTkyLi4yNmIwYWIxIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L3N5c2N0bF9uZXRfZGVjbmV0LmMKKysrIGIvbmV0L2RlY25ldC9zeXNjdGxfbmV0X2RlY25ldC5jCkBAIC0xNjUsNyArMTY1LDYgQEAKIH0KIAogc3RhdGljIGludCBkbl9ub2RlX2FkZHJlc3NfaGFuZGxlcihjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCQlzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTI3Niw3ICsyNzUsNiBAQAogCiAKIHN0YXRpYyBpbnQgZG5fZGVmX2Rldl9oYW5kbGVyKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCQlzdHJ1Y3QgZmlsZSAqIGZpbHAsCiAJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCQlzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L2RncmFtLmMgYi9uZXQvaWVlZTgwMjE1NC9kZ3JhbS5jCmluZGV4IDUxNTkzYTQuLmE0MTNiMWIgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0L2RncmFtLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvZGdyYW0uYwpAQCAtNDE0LDcgKzQxNCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZGdyYW1fc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3QgZGdyYW1fc29jayAqcm8gPSBkZ3JhbV9zayhzayk7CiAJaW50IHZhbDsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L3Jhdy5jIGIvbmV0L2llZWU4MDIxNTQvcmF3LmMKaW5kZXggMTMxOTg4NS4uMzBlNzRlZSAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvcmF3LmMKKysrIGIvbmV0L2llZWU4MDIxNTQvcmF3LmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogfQogCiBzdGF0aWMgaW50IHJhd19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FmX2luZXQuYyBiL25ldC9pcHY0L2FmX2luZXQuYwppbmRleCA1OGM0YjBmLi41NzczN2I4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hZl9pbmV0LmMKKysrIGIvbmV0L2lwdjQvYWZfaW5ldC5jCkBAIC0xMTE5LDYgKzExMTksNyBAQAogewogCXN0cnVjdCBmbG93aSBmbCA9IHsKIAkJLm9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWYsCisJCS5tYXJrID0gc2stPnNrX21hcmssCiAJCS5ubF91ID0gewogCQkJLmlwNF91ID0gewogCQkJCS5kYWRkcgk9IGRhZGRyLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGV2aW5ldC5jIGIvbmV0L2lwdjQvZGV2aW5ldC5jCmluZGV4IDA3MzM2YzYuLjVkZjJmNmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2RldmluZXQuYworKysgYi9uZXQvaXB2NC9kZXZpbmV0LmMKQEAgLTEwNzcsMTIgKzEwNzcsMTYgQEAKIAkJaXBfbWNfdXAoaW5fZGV2KTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKLQkJaWYgKElOX0RFVl9BUlBfTk9USUZZKGluX2RldikpCi0JCQlhcnBfc2VuZChBUlBPUF9SRVFVRVNULCBFVEhfUF9BUlAsCi0JCQkJIGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzLAotCQkJCSBkZXYsCi0JCQkJIGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzLAotCQkJCSBOVUxMLCBkZXYtPmRldl9hZGRyLCBOVUxMKTsKKwkJLyogU2VuZCBncmF0dWl0b3VzIEFSUCB0byBub3RpZnkgb2YgbGluayBjaGFuZ2UgKi8KKwkJaWYgKElOX0RFVl9BUlBfTk9USUZZKGluX2RldikpIHsKKwkJCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IGluX2Rldi0+aWZhX2xpc3Q7CisKKwkJCWlmIChpZmEpCisJCQkJYXJwX3NlbmQoQVJQT1BfUkVRVUVTVCwgRVRIX1BfQVJQLAorCQkJCQkgaWZhLT5pZmFfYWRkcmVzcywgZGV2LAorCQkJCQkgaWZhLT5pZmFfYWRkcmVzcywgTlVMTCwKKwkJCQkJIGRldi0+ZGV2X2FkZHIsIE5VTEwpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX0RPV046CiAJCWlwX21jX2Rvd24oaW5fZGV2KTsKQEAgLTEyNzAsMTAgKzEyNzQsMTAgQEAKIH0KIAogc3RhdGljIGludCBkZXZpbmV0X2NvbmZfcHJvYyhjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAotCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCSAgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IHJldCA9IHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpbnQgcmV0ID0gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJaWYgKHdyaXRlKSB7CiAJCXN0cnVjdCBpcHY0X2RldmNvbmYgKmNuZiA9IGN0bC0+ZXh0cmExOwpAQCAtMTM0MiwxMiArMTM0NiwxMiBAQAogfQogCiBzdGF0aWMgaW50IGRldmluZXRfc3lzY3RsX2ZvcndhcmQoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKLQkJCQkgIHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCQkgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWludCAqdmFscCA9IGN0bC0+ZGF0YTsKIAlpbnQgdmFsID0gKnZhbHA7Ci0JaW50IHJldCA9IHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpbnQgcmV0ID0gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJaWYgKHdyaXRlICYmICp2YWxwICE9IHZhbCkgewogCQlzdHJ1Y3QgbmV0ICpuZXQgPSBjdGwtPmV4dHJhMjsKQEAgLTEzNzIsMTIgKzEzNzYsMTIgQEAKIH0KIAogaW50IGlwdjRfZG9pbnRfYW5kX2ZsdXNoKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCi0JCQkgc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsCisJCQkgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCSBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgKnZhbHAgPSBjdGwtPmRhdGE7CiAJaW50IHZhbCA9ICp2YWxwOwotCWludCByZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaW50IHJldCA9IHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBjdGwtPmV4dHJhMjsKIAogCWlmICh3cml0ZSAmJiAqdmFscCAhPSB2YWwpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCmluZGV4IGUyZjk1MDUuLmFhMDAzOTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCisrKyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCkBAIC0yMjksMTQgKzIyOSwxNyBAQAogICovCiAKIGludCBmaWJfdmFsaWRhdGVfc291cmNlKF9fYmUzMiBzcmMsIF9fYmUzMiBkc3QsIHU4IHRvcywgaW50IG9pZiwKLQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiAqc3BlY19kc3QsIHUzMiAqaXRhZykKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiAqc3BlY19kc3QsCisJCQl1MzIgKml0YWcsIHUzMiBtYXJrKQogewogCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKIAlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPQogCQkJCSAgICAgIHsgLmRhZGRyID0gc3JjLAogCQkJCQkuc2FkZHIgPSBkc3QsCiAJCQkJCS50b3MgPSB0b3MgfSB9LAorCQkJICAgIC5tYXJrID0gbWFyaywKIAkJCSAgICAuaWlmID0gb2lmIH07CisKIAlzdHJ1Y3QgZmliX3Jlc3VsdCByZXM7CiAJaW50IG5vX2FkZHIsIHJwZjsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYyBiL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMKaW5kZXggMjJjZDE5ZS4uNTM3NzMxYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYworKysgYi9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCkBAIC00NDYsNiArNDQ2LDI4IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3NrX3JlcXNrX3F1ZXVlX2hhc2hfYWRkKTsKIAorLyogRGVjaWRlIHdoZW4gdG8gZXhwaXJlIHRoZSByZXF1ZXN0IGFuZCB3aGVuIHRvIHJlc2VuZCBTWU4tQUNLICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3luX2Fja19yZWNhbGMoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCBjb25zdCBpbnQgdGhyZXNoLAorCQkJCSAgY29uc3QgaW50IG1heF9yZXRyaWVzLAorCQkJCSAgY29uc3QgdTggcnNrcV9kZWZlcl9hY2NlcHQsCisJCQkJICBpbnQgKmV4cGlyZSwgaW50ICpyZXNlbmQpCit7CisJaWYgKCFyc2txX2RlZmVyX2FjY2VwdCkgeworCQkqZXhwaXJlID0gcmVxLT5yZXRyYW5zID49IHRocmVzaDsKKwkJKnJlc2VuZCA9IDE7CisJCXJldHVybjsKKwl9CisJKmV4cGlyZSA9IHJlcS0+cmV0cmFucyA+PSB0aHJlc2ggJiYKKwkJICAoIWluZXRfcnNrKHJlcSktPmFja2VkIHx8IHJlcS0+cmV0cmFucyA+PSBtYXhfcmV0cmllcyk7CisJLyoKKwkgKiBEbyBub3QgcmVzZW5kIHdoaWxlIHdhaXRpbmcgZm9yIGRhdGEgYWZ0ZXIgQUNLLAorCSAqIHN0YXJ0IHRvIHJlc2VuZCBvbiBlbmQgb2YgZGVmZXJyaW5nIHBlcmlvZCB0byBnaXZlCisJICogbGFzdCBjaGFuY2UgZm9yIGRhdGEgb3IgQUNLIHRvIGNyZWF0ZSBlc3RhYmxpc2hlZCBzb2NrZXQuCisJICovCisJKnJlc2VuZCA9ICFpbmV0X3JzayhyZXEpLT5hY2tlZCB8fAorCQkgIHJlcS0+cmV0cmFucyA+PSByc2txX2RlZmVyX2FjY2VwdCAtIDE7Cit9CisKIHZvaWQgaW5ldF9jc2tfcmVxc2tfcXVldWVfcHJ1bmUoc3RydWN0IHNvY2sgKnBhcmVudCwKIAkJCQljb25zdCB1bnNpZ25lZCBsb25nIGludGVydmFsLAogCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGltZW91dCwKQEAgLTUwMSw5ICs1MjMsMTUgQEAKIAkJcmVxcD0mbG9wdC0+c3luX3RhYmxlW2ldOwogCQl3aGlsZSAoKHJlcSA9ICpyZXFwKSAhPSBOVUxMKSB7CiAJCQlpZiAodGltZV9hZnRlcl9lcShub3csIHJlcS0+ZXhwaXJlcykpIHsKLQkJCQlpZiAoKHJlcS0+cmV0cmFucyA8IHRocmVzaCB8fAotCQkJCSAgICAgKGluZXRfcnNrKHJlcSktPmFja2VkICYmIHJlcS0+cmV0cmFucyA8IG1heF9yZXRyaWVzKSkKLQkJCQkgICAgJiYgIXJlcS0+cnNrX29wcy0+cnR4X3N5bl9hY2socGFyZW50LCByZXEpKSB7CisJCQkJaW50IGV4cGlyZSA9IDAsIHJlc2VuZCA9IDA7CisKKwkJCQlzeW5fYWNrX3JlY2FsYyhyZXEsIHRocmVzaCwgbWF4X3JldHJpZXMsCisJCQkJCSAgICAgICBxdWV1ZS0+cnNrcV9kZWZlcl9hY2NlcHQsCisJCQkJCSAgICAgICAmZXhwaXJlLCAmcmVzZW5kKTsKKwkJCQlpZiAoIWV4cGlyZSAmJgorCQkJCSAgICAoIXJlc2VuZCB8fAorCQkJCSAgICAgIXJlcS0+cnNrX29wcy0+cnR4X3N5bl9hY2socGFyZW50LCByZXEpIHx8CisJCQkJICAgICBpbmV0X3JzayhyZXEpLT5hY2tlZCkpIHsKIAkJCQkJdW5zaWduZWQgbG9uZyB0aW1lbzsKIAogCQkJCQlpZiAocmVxLT5yZXRyYW5zKysgPT0gMCkKQEAgLTcxNCw3ICs3NDIsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9jc2tfY29tcGF0X2dldHNvY2tvcHQpOwogCiBpbnQgaW5ldF9jc2tfY29tcGF0X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2dyZS5jIGIvbmV0L2lwdjQvaXBfZ3JlLmMKaW5kZXggZDk2NDVjOS4uMTQzMzMzOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZ3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfZ3JlLmMKQEAgLTY2LDEwICs2Niw3IEBACiAgICBzb2x1dGlvbiwgYnV0IGl0IHN1cHBvc2VzIG1haW50YWluZyBuZXcgdmFyaWFibGUgaW4gQUxMCiAgICBza2IsIGV2ZW4gaWYgbm8gdHVubmVsaW5nIGlzIHVzZWQuCiAKLSAgIEN1cnJlbnQgc29sdXRpb246IHQtPnJlY3Vyc2lvbiBsb2NrIGJyZWFrcyBkZWFkIGxvb3BzLiBJdCBsb29rcwotICAgbGlrZSBkZXYtPnRidXN5IGZsYWcsIGJ1dCBJIHByZWZlcnJlZCBuZXcgdmFyaWFibGUsIGJlY2F1c2UKLSAgIHRoZSBzZW1hbnRpY3MgaXMgZGlmZmVyZW50LiBPbmUgZGF5LCB3aGVuIGhhcmRfc3RhcnRfeG1pdAotICAgd2lsbCBiZSBtdWx0aXRocmVhZGVkIHdlIHdpbGwgaGF2ZSB0byB1c2Ugc2tiLT5lbmNhcHN1bGF0aW9uLgorICAgQ3VycmVudCBzb2x1dGlvbjogSEFSRF9UWF9MT0NLIGxvY2sgYnJlYWtzIGRlYWQgbG9vcHMuCiAKIAogCkBAIC02NzgsMTEgKzY3NSw2IEBACiAJX19iZTMyIGRzdDsKIAlpbnQgICAgbXR1OwogCi0JaWYgKHR1bm5lbC0+cmVjdXJzaW9uKyspIHsKLQkJc3RhdHMtPmNvbGxpc2lvbnMrKzsKLQkJZ290byB0eF9lcnJvcjsKLQl9Ci0KIAlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikKIAkJSVBDQihza2IpLT5mbGFncyA9IDA7CiAKQEAgLTgyMCw3ICs4MTIsNiBAQAogCQkJaXBfcnRfcHV0KHJ0KTsKIAkJCXN0YXRzLT50eF9kcm9wcGVkKys7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQl0dW5uZWwtPnJlY3Vyc2lvbi0tOwogCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJfQogCQlpZiAoc2tiLT5zaykKQEAgLTg4OCw3ICs4NzksNiBAQAogCW5mX3Jlc2V0KHNrYik7CiAKIAlJUFRVTk5FTF9YTUlUKCk7Ci0JdHVubmVsLT5yZWN1cnNpb24tLTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCiB0eF9lcnJvcl9pY21wOgpAQCAtODk3LDcgKzg4Nyw2IEBACiB0eF9lcnJvcjoKIAlzdGF0cy0+dHhfZXJyb3JzKys7CiAJZGV2X2tmcmVlX3NrYihza2IpOwotCXR1bm5lbC0+cmVjdXJzaW9uLS07CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApAQCAtMTQ3NSw3ICsxNDY0LDcgQEAKIAogCWV0aGVyX3NldHVwKGRldik7CiAKLQlkZXYtPm5ldGRldl9vcHMJCT0gJmlwZ3JlX25ldGRldl9vcHM7CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZpcGdyZV90YXBfbmV0ZGV2X29wczsKIAlkZXYtPmRlc3RydWN0b3IgCT0gZnJlZV9uZXRkZXY7CiAKIAlkZXYtPmlmbGluawkJPSAwOwpAQCAtMTUzNiwyNSArMTUyNSwyOSBAQAogCQlpZiAodC0+ZGV2ICE9IGRldikKIAkJCXJldHVybiAtRUVYSVNUOwogCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIG5mbGFncyA9IDA7Ci0KIAkJdCA9IG50OwogCi0JCWlmIChpcHY0X2lzX211bHRpY2FzdChwLmlwaC5kYWRkcikpCi0JCQluZmxhZ3MgPSBJRkZfQlJPQURDQVNUOwotCQllbHNlIGlmIChwLmlwaC5kYWRkcikKLQkJCW5mbGFncyA9IElGRl9QT0lOVE9QT0lOVDsKKwkJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpIHsKKwkJCXVuc2lnbmVkIG5mbGFncyA9IDA7CiAKLQkJaWYgKChkZXYtPmZsYWdzIF4gbmZsYWdzKSAmCi0JCSAgICAoSUZGX1BPSU5UT1BPSU5UIHwgSUZGX0JST0FEQ0FTVCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChpcHY0X2lzX211bHRpY2FzdChwLmlwaC5kYWRkcikpCisJCQkJbmZsYWdzID0gSUZGX0JST0FEQ0FTVDsKKwkJCWVsc2UgaWYgKHAuaXBoLmRhZGRyKQorCQkJCW5mbGFncyA9IElGRl9QT0lOVE9QT0lOVDsKKworCQkJaWYgKChkZXYtPmZsYWdzIF4gbmZsYWdzKSAmCisJCQkgICAgKElGRl9QT0lOVE9QT0lOVCB8IElGRl9CUk9BRENBU1QpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKIAkJaXBncmVfdHVubmVsX3VubGluayhpZ24sIHQpOwogCQl0LT5wYXJtcy5pcGguc2FkZHIgPSBwLmlwaC5zYWRkcjsKIAkJdC0+cGFybXMuaXBoLmRhZGRyID0gcC5pcGguZGFkZHI7CiAJCXQtPnBhcm1zLmlfa2V5ID0gcC5pX2tleTsKLQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZwLmlwaC5zYWRkciwgNCk7Ci0JCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgJnAuaXBoLmRhZGRyLCA0KTsKKwkJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpIHsKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLCAmcC5pcGguc2FkZHIsIDQpOworCQkJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmcC5pcGguZGFkZHIsIDQpOworCQl9CiAJCWlwZ3JlX3R1bm5lbF9saW5rKGlnbiwgdCk7CiAJCW5ldGRldl9zdGF0ZV9jaGFuZ2UoZGV2KTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9vdXRwdXQuYyBiL25ldC9pcHY0L2lwX291dHB1dC5jCmluZGV4IDlmZTVkN2IuLmY5ODk1MTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L2lwX291dHB1dC5jCkBAIC0zMzUsNiArMzM1LDcgQEAKIAogCQl7CiAJCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmLAorCQkJCQkgICAgLm1hcmsgPSBzay0+c2tfbWFyaywKIAkJCQkJICAgIC5ubF91ID0geyAuaXA0X3UgPQogCQkJCQkJICAgICAgeyAuZGFkZHIgPSBkYWRkciwKIAkJCQkJCQkuc2FkZHIgPSBpbmV0LT5zYWRkciwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCmluZGV4IGZjNzk5M2UuLmU5ODJiNWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgKi8KIAogc3RhdGljIGludCBkb19pcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLAotCQkJICAgIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJICAgIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlpbnQgdmFsID0gMCwgZXJyOwpAQCAtNjExLDYgKzYxMSw5IEBACiAJCSAqCUNoZWNrIHRoZSBhcmd1bWVudHMgYXJlIGFsbG93YWJsZQogCQkgKi8KIAorCQlpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkKKwkJCWdvdG8gZV9pbnZhbDsKKwogCQllcnIgPSAtRUZBVUxUOwogCQlpZiAob3B0bGVuID49IHNpemVvZihzdHJ1Y3QgaXBfbXJlcW4pKSB7CiAJCQlpZiAoY29weV9mcm9tX3VzZXIoJm1yZXEsIG9wdHZhbCwgc2l6ZW9mKG1yZXEpKSkKQEAgLTYzMSwxNyArNjM0LDE2IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlkZXYgPSBpcF9kZXZfZmluZChzb2NrX25ldChzayksIG1yZXEuaW1yX2FkZHJlc3Muc19hZGRyKTsKLQkJCWlmIChkZXYpIHsKKwkJCWlmIChkZXYpCiAJCQkJbXJlcS5pbXJfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKLQkJCQlkZXZfcHV0KGRldik7Ci0JCQl9CiAJCX0gZWxzZQotCQkJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KHNvY2tfbmV0KHNrKSwgbXJlcS5pbXJfaWZpbmRleCk7CisJCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KHNvY2tfbmV0KHNrKSwgbXJlcS5pbXJfaWZpbmRleCk7CiAKIAogCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKIAkJaWYgKCFkZXYpCiAJCQlicmVhazsKKwkJZGV2X3B1dChkZXYpOwogCiAJCWVyciA9IC1FSU5WQUw7CiAJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmICYmCkBAIC05NDcsNyArOTQ5LDcgQEAKIH0KIAogaW50IGlwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsCi0JCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpbnQgZXJyOwogCkBAIC05NzIsNyArOTc0LDcgQEAKIAogI2lmZGVmIENPTkZJR19DT01QQVQKIGludCBjb21wYXRfaXBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwaXAuYyBiL25ldC9pcHY0L2lwaXAuYwppbmRleCA2MjU0OGNiLi4wOGNjZDM0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGlwLmMKKysrIGIvbmV0L2lwdjQvaXBpcC5jCkBAIC00MDIsMTEgKzQwMiw2IEBACiAJX19iZTMyIGRzdCA9IHRpcGgtPmRhZGRyOwogCWludCAgICBtdHU7CiAKLQlpZiAodHVubmVsLT5yZWN1cnNpb24rKykgewotCQlzdGF0cy0+Y29sbGlzaW9ucysrOwotCQlnb3RvIHR4X2Vycm9yOwotCX0KLQogCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSkKIAkJZ290byB0eF9lcnJvcjsKIApAQCAtNDg1LDcgKzQ4MCw2IEBACiAJCQlpcF9ydF9wdXQocnQpOwogCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCXR1bm5lbC0+cmVjdXJzaW9uLS07CiAJCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCQl9CiAJCWlmIChza2ItPnNrKQpAQCAtNTIzLDcgKzUxNyw2IEBACiAJbmZfcmVzZXQoc2tiKTsKIAogCUlQVFVOTkVMX1hNSVQoKTsKLQl0dW5uZWwtPnJlY3Vyc2lvbi0tOwogCXJldHVybiBORVRERVZfVFhfT0s7CiAKIHR4X2Vycm9yX2ljbXA6CkBAIC01MzEsNyArNTI0LDYgQEAKIHR4X2Vycm9yOgogCXN0YXRzLT50eF9lcnJvcnMrKzsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JdHVubmVsLT5yZWN1cnNpb24tLTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcG1yLmMgYi9uZXQvaXB2NC9pcG1yLmMKaW5kZXggYzQzZWMyZC4uNjMwYTU2ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBtci5jCisrKyBiL25ldC9pcHY0L2lwbXIuYwpAQCAtOTMxLDcgKzkzMSw3IEBACiAgKglNT1NQRi9QSU0gcm91dGVyIHNldCB1cCB3ZSBjYW4gY2xlYW4gdGhpcyB1cC4KICAqLwogCi1pbnQgaXBfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK2ludCBpcF9tcm91dGVfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCWludCByZXQ7CiAJc3RydWN0IHZpZmN0bCB2aWY7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yYXcuYyBiL25ldC9pcHY0L3Jhdy5jCmluZGV4IGViYjFlNTguLmFiOTk2ZjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Jhdy5jCisrKyBiL25ldC9pcHY0L3Jhdy5jCkBAIC0zNTIsMTMgKzM1MiwyNCBAQAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAogCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7Ci0JZXJyID0gbWVtY3B5X2Zyb21pb3ZlY2VuZCgodm9pZCAqKWlwaCwgZnJvbSwgMCwgbGVuZ3RoKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycm9yX2ZhdWx0OworCWVyciA9IC1FRkFVTFQ7CisJaWYgKG1lbWNweV9mcm9taW92ZWNlbmQoKHZvaWQgKilpcGgsIGZyb20sIDAsIGxlbmd0aCkpCisJCWdvdG8gZXJyb3JfZnJlZTsKIAotCS8qIFdlIGRvbid0IG1vZGlmeSBpbnZhbGlkIGhlYWRlciAqLwogCWlwaGxlbiA9IGlwaC0+aWhsICogNDsKLQlpZiAoaXBobGVuID49IHNpemVvZigqaXBoKSAmJiBpcGhsZW4gPD0gbGVuZ3RoKSB7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gbW9kaWZ5IHRoZSBpcCBoZWFkZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvCisJICogYmUgc3VyZSB0aGF0IGl0IHdvbid0IGNhdXNlIHByb2JsZW1zIGxhdGVyIGFsb25nIHRoZSBuZXR3b3JrCisJICogc3RhY2suICBTcGVjaWZpY2FsbHkgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBpcGgtPmlobCBpcyBhCisJICogc2FuZSB2YWx1ZS4gIElmIGlobCBwb2ludHMgYmV5b25kIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBwYXNzZWQKKwkgKiBpbiwgcmVqZWN0IHRoZSBmcmFtZSBhcyBpbnZhbGlkCisJICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaXBobGVuID4gbGVuZ3RoKQorCQlnb3RvIGVycm9yX2ZyZWU7CisKKwlpZiAoaXBobGVuID49IHNpemVvZigqaXBoKSkgewogCQlpZiAoIWlwaC0+c2FkZHIpCiAJCQlpcGgtPnNhZGRyID0gcnQtPnJ0X3NyYzsKIAkJaXBoLT5jaGVjayAgID0gMDsKQEAgLTM4MSw4ICszOTIsNyBAQAogb3V0OgogCXJldHVybiAwOwogCi1lcnJvcl9mYXVsdDoKLQllcnIgPSAtRUZBVUxUOworZXJyb3JfZnJlZToKIAlrZnJlZV9za2Ioc2tiKTsKIGVycm9yOgogCUlQX0lOQ19TVEFUUyhuZXQsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKQEAgLTc0MSw3ICs3NTEsNyBAQAogfQogCiBzdGF0aWMgaW50IGRvX3Jhd19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpZiAob3B0bmFtZSA9PSBJQ01QX0ZJTFRFUikgewogCQlpZiAoaW5ldF9zayhzayktPm51bSAhPSBJUFBST1RPX0lDTVApCkBAIC03NTMsNyArNzYzLDcgQEAKIH0KIAogc3RhdGljIGludCByYXdfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaWYgKGxldmVsICE9IFNPTF9SQVcpCiAJCXJldHVybiBpcF9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwpAQCAtNzYyLDcgKzc3Miw3IEBACiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBzdGF0aWMgaW50IGNvbXBhdF9yYXdfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkJIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkJIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaWYgKGxldmVsICE9IFNPTF9SQVcpCiAJCXJldHVybiBjb21wYXRfaXBfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IGRmOTM0NzMuLjViMTA1MGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtMTg1NCw3ICsxODU0LDcgQEAKIAkJCWdvdG8gZV9pbnZhbDsKIAkJc3BlY19kc3QgPSBpbmV0X3NlbGVjdF9hZGRyKGRldiwgMCwgUlRfU0NPUEVfTElOSyk7CiAJfSBlbHNlIGlmIChmaWJfdmFsaWRhdGVfc291cmNlKHNhZGRyLCAwLCB0b3MsIDAsCi0JCQkJCWRldiwgJnNwZWNfZHN0LCAmaXRhZykgPCAwKQorCQkJCQlkZXYsICZzcGVjX2RzdCwgJml0YWcsIDApIDwgMCkKIAkJZ290byBlX2ludmFsOwogCiAJcnRoID0gZHN0X2FsbG9jKCZpcHY0X2RzdF9vcHMpOwpAQCAtMTk2Nyw3ICsxOTY3LDcgQEAKIAogCiAJZXJyID0gZmliX3ZhbGlkYXRlX3NvdXJjZShzYWRkciwgZGFkZHIsIHRvcywgRklCX1JFU19PSUYoKnJlcyksCi0JCQkJICBpbl9kZXYtPmRldiwgJnNwZWNfZHN0LCAmaXRhZyk7CisJCQkJICBpbl9kZXYtPmRldiwgJnNwZWNfZHN0LCAmaXRhZywgc2tiLT5tYXJrKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpcF9oYW5kbGVfbWFydGlhbl9zb3VyY2UoaW5fZGV2LT5kZXYsIGluX2Rldiwgc2tiLCBkYWRkciwKIAkJCQkJIHNhZGRyKTsKQEAgLTIxNDEsNyArMjE0MSw3IEBACiAJCWludCByZXN1bHQ7CiAJCXJlc3VsdCA9IGZpYl92YWxpZGF0ZV9zb3VyY2Uoc2FkZHIsIGRhZGRyLCB0b3MsCiAJCQkJCSAgICAgbmV0LT5sb29wYmFja19kZXYtPmlmaW5kZXgsCi0JCQkJCSAgICAgZGV2LCAmc3BlY19kc3QsICZpdGFnKTsKKwkJCQkJICAgICBkZXYsICZzcGVjX2RzdCwgJml0YWcsIHNrYi0+bWFyayk7CiAJCWlmIChyZXN1bHQgPCAwKQogCQkJZ290byBtYXJ0aWFuX3NvdXJjZTsKIAkJaWYgKHJlc3VsdCkKQEAgLTIxNzAsNyArMjE3MCw3IEBACiAJCXNwZWNfZHN0ID0gaW5ldF9zZWxlY3RfYWRkcihkZXYsIDAsIFJUX1NDT1BFX0xJTkspOwogCWVsc2UgewogCQllcnIgPSBmaWJfdmFsaWRhdGVfc291cmNlKHNhZGRyLCAwLCB0b3MsIDAsIGRldiwgJnNwZWNfZHN0LAotCQkJCQkgICZpdGFnKTsKKwkJCQkJICAmaXRhZywgc2tiLT5tYXJrKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIG1hcnRpYW5fc291cmNlOwogCQlpZiAoZXJyKQpAQCAtMzAzNiw3ICszMDM2LDcgQEAKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKIHN0YXRpYyBpbnQgaXB2NF9zeXNjdGxfcnRjYWNoZV9mbHVzaChjdGxfdGFibGUgKl9fY3RsLCBpbnQgd3JpdGUsCi0JCQkJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCQlzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpZiAod3JpdGUpIHsKQEAgLTMwNDYsNyArMzA0Niw3IEBACiAKIAkJbWVtY3B5KCZjdGwsIF9fY3RsLCBzaXplb2YoY3RsKSk7CiAJCWN0bC5kYXRhID0gJmZsdXNoX2RlbGF5OwotCQlwcm9jX2RvaW50dmVjKCZjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCQlwcm9jX2RvaW50dmVjKCZjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJCW5ldCA9IChzdHJ1Y3QgbmV0ICopX19jdGwtPmV4dHJhMTsKIAkJcnRfY2FjaGVfZmx1c2gobmV0LCBmbHVzaF9kZWxheSk7CkBAIC0zMTA2LDEyICszMTA2LDExIEBACiB9CiAKIHN0YXRpYyBpbnQgaXB2NF9zeXNjdGxfcnRfc2VjcmV0X2ludGVydmFsKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCi0JCQkJCSAgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQkJCQkgIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgb2xkID0gaXBfcnRfc2VjcmV0X2ludGVydmFsOwotCWludCByZXQgPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpbnQgcmV0ID0gcHJvY19kb2ludHZlY19qaWZmaWVzKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAlydF9zZWNyZXRfcmVzY2hlZHVsZShvbGQpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCmluZGV4IDQ3MTBkMjEuLjJkY2YwNGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCisrKyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCkBAIC0zNiw3ICszNiw3IEBACiB9CiAKIC8qIFZhbGlkYXRlIGNoYW5nZXMgZnJvbSAvcHJvYyBpbnRlcmZhY2UuICovCi1zdGF0aWMgaW50IGlwdjRfbG9jYWxfcG9ydF9yYW5nZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBpcHY0X2xvY2FsX3BvcnRfcmFuZ2UoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCSBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTUxLDcgKzUxLDcgQEAKIAl9OwogCiAJaW5ldF9nZXRfbG9jYWxfcG9ydF9yYW5nZShyYW5nZSwgcmFuZ2UgKyAxKTsKLQlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCgmdG1wLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCgmdG1wLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAogCWlmICh3cml0ZSAmJiByZXQgPT0gMCkgewogCQlpZiAocmFuZ2VbMV0gPCByYW5nZVswXSkKQEAgLTkxLDcgKzkxLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IHByb2NfdGNwX2Nvbmdlc3Rpb25fY29udHJvbChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCitzdGF0aWMgaW50IHByb2NfdGNwX2Nvbmdlc3Rpb25fY29udHJvbChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAogCQkJCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAljaGFyIHZhbFtUQ1BfQ0FfTkFNRV9NQVhdOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAKIAl0Y3BfZ2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKHZhbCk7CiAKLQlyZXQgPSBwcm9jX2Rvc3RyaW5nKCZ0YmwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldCA9IHByb2NfZG9zdHJpbmcoJnRibCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJaWYgKHdyaXRlICYmIHJldCA9PSAwKQogCQlyZXQgPSB0Y3Bfc2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKHZhbCk7CiAJcmV0dXJuIHJldDsKQEAgLTEyOSw3ICsxMjksNyBAQAogfQogCiBzdGF0aWMgaW50IHByb2NfdGNwX2F2YWlsYWJsZV9jb25nZXN0aW9uX2NvbnRyb2woY3RsX3RhYmxlICpjdGwsCi0JCQkJCQkgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkJCQkgaW50IHdyaXRlLAogCQkJCQkJIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKIAkJCQkJCSBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0xNDAsMTMgKzE0MCwxMyBAQAogCWlmICghdGJsLmRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCXRjcF9nZXRfYXZhaWxhYmxlX2Nvbmdlc3Rpb25fY29udHJvbCh0YmwuZGF0YSwgVENQX0NBX0JVRl9NQVgpOwotCXJldCA9IHByb2NfZG9zdHJpbmcoJnRibCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb3N0cmluZygmdGJsLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlrZnJlZSh0YmwuZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBwcm9jX2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sKGN0bF90YWJsZSAqY3RsLAotCQkJCQkgICBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCQkJICAgaW50IHdyaXRlLAogCQkJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCiAJCQkJCSAgIGxvZmZfdCAqcHBvcykKIHsKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXRjcF9nZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wodGJsLmRhdGEsIHRibC5tYXhsZW4pOwotCXJldCA9IHByb2NfZG9zdHJpbmcoJnRibCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb3N0cmluZygmdGJsLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAod3JpdGUgJiYgcmV0ID09IDApCiAJCXJldCA9IHRjcF9zZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wodGJsLmRhdGEpOwogCWtmcmVlKHRibC5kYXRhKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggMjEzODdlYi4uOTg0NDBhZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTMyNiw2ICszMjYsNDMgQEAKIAogRVhQT1JUX1NZTUJPTCh0Y3BfZW50ZXJfbWVtb3J5X3ByZXNzdXJlKTsKIAorLyogQ29udmVydCBzZWNvbmRzIHRvIHJldHJhbnNtaXRzIGJhc2VkIG9uIGluaXRpYWwgYW5kIG1heCB0aW1lb3V0ICovCitzdGF0aWMgdTggc2Vjc190b19yZXRyYW5zKGludCBzZWNvbmRzLCBpbnQgdGltZW91dCwgaW50IHJ0b19tYXgpCit7CisJdTggcmVzID0gMDsKKworCWlmIChzZWNvbmRzID4gMCkgeworCQlpbnQgcGVyaW9kID0gdGltZW91dDsKKworCQlyZXMgPSAxOworCQl3aGlsZSAoc2Vjb25kcyA+IHBlcmlvZCAmJiByZXMgPCAyNTUpIHsKKwkJCXJlcysrOworCQkJdGltZW91dCA8PD0gMTsKKwkJCWlmICh0aW1lb3V0ID4gcnRvX21heCkKKwkJCQl0aW1lb3V0ID0gcnRvX21heDsKKwkJCXBlcmlvZCArPSB0aW1lb3V0OworCQl9CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qIENvbnZlcnQgcmV0cmFuc21pdHMgdG8gc2Vjb25kcyBiYXNlZCBvbiBpbml0aWFsIGFuZCBtYXggdGltZW91dCAqLworc3RhdGljIGludCByZXRyYW5zX3RvX3NlY3ModTggcmV0cmFucywgaW50IHRpbWVvdXQsIGludCBydG9fbWF4KQoreworCWludCBwZXJpb2QgPSAwOworCisJaWYgKHJldHJhbnMgPiAwKSB7CisJCXBlcmlvZCA9IHRpbWVvdXQ7CisJCXdoaWxlICgtLXJldHJhbnMpIHsKKwkJCXRpbWVvdXQgPDw9IDE7CisJCQlpZiAodGltZW91dCA+IHJ0b19tYXgpCisJCQkJdGltZW91dCA9IHJ0b19tYXg7CisJCQlwZXJpb2QgKz0gdGltZW91dDsKKwkJfQorCX0KKwlyZXR1cm4gcGVyaW9kOworfQorCiAvKgogICoJV2FpdCBmb3IgYSBUQ1AgZXZlbnQuCiAgKgpAQCAtNTgwLDcgKzYxNyw3IEBACiAKIAlsb2NrX3NvY2soc2spOwogCi0JdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBmbGFncyAmIFNQTElDRV9GX05PTkJMT0NLKTsKKwl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIHNvY2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAl3aGlsZSAodHNzLmxlbikgewogCQlyZXQgPSBfX3RjcF9zcGxpY2VfcmVhZChzaywgJnRzcyk7CiAJCWlmIChyZXQgPCAwKQpAQCAtMTQwNSw3ICsxNDQyLDkgQEAKIAkJCQlnb3RvIGZvdW5kX29rX3NrYjsKIAkJCWlmICh0Y3BfaGRyKHNrYiktPmZpbikKIAkJCQlnb3RvIGZvdW5kX2Zpbl9vazsKLQkJCVdBUk5fT04oIShmbGFncyAmIE1TR19QRUVLKSk7CisJCQlXQVJOKCEoZmxhZ3MgJiBNU0dfUEVFSyksIEtFUk5fSU5GTyAicmVjdm1zZyBidWcgMjogIgorCQkJCQkiY29waWVkICVYIHNlcSAlWFxuIiwgKnNlcSwKKwkJCQkJVENQX1NLQl9DQihza2IpLT5zZXEpOwogCQl9CiAKIAkJLyogV2VsbCwgaWYgd2UgaGF2ZSBiYWNrbG9nLCB0cnkgdG8gcHJvY2VzcyBpdCBub3cgeWV0LiAqLwpAQCAtMjAzMiw3ICsyMDcxLDcgQEAKICAqCVNvY2tldCBvcHRpb24gY29kZSBmb3IgVENQLgogICovCiBzdGF0aWMgaW50IGRvX3RjcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLAotCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwpAQCAtMjA0Nyw3ICsyMDg2LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCXZhbCA9IHN0cm5jcHlfZnJvbV91c2VyKG5hbWUsIG9wdHZhbCwKLQkJCQkJbWluKFRDUF9DQV9OQU1FX01BWC0xLCBvcHRsZW4pKTsKKwkJCQkJbWluX3QobG9uZywgVENQX0NBX05BTUVfTUFYLTEsIG9wdGxlbikpOwogCQlpZiAodmFsIDwgMCkKIAkJCXJldHVybiAtRUZBVUxUOwogCQluYW1lW3ZhbF0gPSAwOwpAQCAtMjE2MywxNiArMjIwMiwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgVENQX0RFRkVSX0FDQ0VQVDoKLQkJaWNzay0+aWNza19hY2NlcHRfcXVldWUucnNrcV9kZWZlcl9hY2NlcHQgPSAwOwotCQlpZiAodmFsID4gMCkgewotCQkJLyogVHJhbnNsYXRlIHZhbHVlIGluIHNlY29uZHMgdG8gbnVtYmVyIG9mCi0JCQkgKiByZXRyYW5zbWl0cyAqLwotCQkJd2hpbGUgKGljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnJza3FfZGVmZXJfYWNjZXB0IDwgMzIgJiYKLQkJCSAgICAgICB2YWwgPiAoKFRDUF9USU1FT1VUX0lOSVQgLyBIWikgPDwKLQkJCQkgICAgICAgaWNzay0+aWNza19hY2NlcHRfcXVldWUucnNrcV9kZWZlcl9hY2NlcHQpKQotCQkJCWljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnJza3FfZGVmZXJfYWNjZXB0Kys7Ci0JCQlpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5yc2txX2RlZmVyX2FjY2VwdCsrOwotCQl9CisJCS8qIFRyYW5zbGF0ZSB2YWx1ZSBpbiBzZWNvbmRzIHRvIG51bWJlciBvZiByZXRyYW5zbWl0cyAqLworCQlpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5yc2txX2RlZmVyX2FjY2VwdCA9CisJCQlzZWNzX3RvX3JldHJhbnModmFsLCBUQ1BfVElNRU9VVF9JTklUIC8gSFosCisJCQkJCVRDUF9SVE9fTUFYIC8gSFopOwogCQlicmVhazsKIAogCWNhc2UgVENQX1dJTkRPV19DTEFNUDoKQEAgLTIyMjAsNyArMjI1Myw3IEBACiB9CiAKIGludCB0Y3Bfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsCi0JCSAgIGludCBvcHRsZW4pCisJCSAgIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCkBAIC0yMjMyLDcgKzIyNjUsNyBAQAogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogaW50IGNvbXBhdF90Y3Bfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaWYgKGxldmVsICE9IFNPTF9UQ1ApCiAJCXJldHVybiBpbmV0X2Nza19jb21wYXRfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCkBAIC0yMzUzLDggKzIzODYsOCBAQAogCQkJdmFsID0gKHZhbCA/IDogc3lzY3RsX3RjcF9maW5fdGltZW91dCkgLyBIWjsKIAkJYnJlYWs7CiAJY2FzZSBUQ1BfREVGRVJfQUNDRVBUOgotCQl2YWwgPSAhaWNzay0+aWNza19hY2NlcHRfcXVldWUucnNrcV9kZWZlcl9hY2NlcHQgPyAwIDoKLQkJCSgoVENQX1RJTUVPVVRfSU5JVCAvIEhaKSA8PCAoaWNzay0+aWNza19hY2NlcHRfcXVldWUucnNrcV9kZWZlcl9hY2NlcHQgLSAxKSk7CisJCXZhbCA9IHJldHJhbnNfdG9fc2VjcyhpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5yc2txX2RlZmVyX2FjY2VwdCwKKwkJCQkgICAgICBUQ1BfVElNRU9VVF9JTklUIC8gSFosIFRDUF9SVE9fTUFYIC8gSFopOwogCQlicmVhazsKIAljYXNlIFRDUF9XSU5ET1dfQ0xBTVA6CiAJCXZhbCA9IHRwLT53aW5kb3dfY2xhbXA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKaW5kZXggNjI0YzNjOS4uNGMwMzU5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCisrKyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwpAQCAtNjQxLDggKzY0MSw4IEBACiAJaWYgKCEoZmxnICYgVENQX0ZMQUdfQUNLKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQkvKiBJZiBUQ1BfREVGRVJfQUNDRVBUIGlzIHNldCwgZHJvcCBiYXJlIEFDSy4gKi8KLQlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2FjY2VwdF9xdWV1ZS5yc2txX2RlZmVyX2FjY2VwdCAmJgorCS8qIFdoaWxlIFRDUF9ERUZFUl9BQ0NFUFQgaXMgYWN0aXZlLCBkcm9wIGJhcmUgQUNLLiAqLworCWlmIChyZXEtPnJldHJhbnMgPCBpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlLnJza3FfZGVmZXJfYWNjZXB0ICYmCiAJICAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9PSB0Y3BfcnNrKHJlcSktPnJjdl9pc24gKyAxKSB7CiAJCWluZXRfcnNrKHJlcSktPmFja2VkID0gMTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggNTIwMGFhYi4uZmNkMjc4YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtMzYxLDYgKzM2MSw3IEBACiAjZGVmaW5lIE9QVElPTl9TQUNLX0FEVkVSVElTRQkoMSA8PCAwKQogI2RlZmluZSBPUFRJT05fVFMJCSgxIDw8IDEpCiAjZGVmaW5lIE9QVElPTl9NRDUJCSgxIDw8IDIpCisjZGVmaW5lIE9QVElPTl9XU0NBTEUJCSgxIDw8IDMpCiAKIHN0cnVjdCB0Y3Bfb3V0X29wdGlvbnMgewogCXU4IG9wdGlvbnM7CQkvKiBiaXQgZmllbGQgb2YgT1BUSU9OXyogKi8KQEAgLTQyNyw3ICs0MjgsNyBAQAogCQkJICAgICAgIFRDUE9MRU5fU0FDS19QRVJNKTsKIAl9CiAKLQlpZiAodW5saWtlbHkob3B0cy0+d3MpKSB7CisJaWYgKHVubGlrZWx5KE9QVElPTl9XU0NBTEUgJiBvcHRzLT5vcHRpb25zKSkgewogCQkqcHRyKysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAogCQkJICAgICAgIChUQ1BPUFRfV0lORE9XIDw8IDE2KSB8CiAJCQkgICAgICAgKFRDUE9MRU5fV0lORE9XIDw8IDgpIHwKQEAgLTQ5NCw4ICs0OTUsOCBAQAogCX0KIAlpZiAobGlrZWx5KHN5c2N0bF90Y3Bfd2luZG93X3NjYWxpbmcpKSB7CiAJCW9wdHMtPndzID0gdHAtPnJ4X29wdC5yY3Zfd3NjYWxlOwotCQlpZiAobGlrZWx5KG9wdHMtPndzKSkKLQkJCXNpemUgKz0gVENQT0xFTl9XU0NBTEVfQUxJR05FRDsKKwkJb3B0cy0+b3B0aW9ucyB8PSBPUFRJT05fV1NDQUxFOworCQlzaXplICs9IFRDUE9MRU5fV1NDQUxFX0FMSUdORUQ7CiAJfQogCWlmIChsaWtlbHkoc3lzY3RsX3RjcF9zYWNrKSkgewogCQlvcHRzLT5vcHRpb25zIHw9IE9QVElPTl9TQUNLX0FEVkVSVElTRTsKQEAgLTUzNyw4ICs1MzgsOCBAQAogCiAJaWYgKGxpa2VseShpcmVxLT53c2NhbGVfb2spKSB7CiAJCW9wdHMtPndzID0gaXJlcS0+cmN2X3dzY2FsZTsKLQkJaWYgKGxpa2VseShvcHRzLT53cykpCi0JCQlzaXplICs9IFRDUE9MRU5fV1NDQUxFX0FMSUdORUQ7CisJCW9wdHMtPm9wdGlvbnMgfD0gT1BUSU9OX1dTQ0FMRTsKKwkJc2l6ZSArPSBUQ1BPTEVOX1dTQ0FMRV9BTElHTkVEOwogCX0KIAlpZiAobGlrZWx5KGRvaW5nX3RzKSkgewogCQlvcHRzLT5vcHRpb25zIHw9IE9QVElPTl9UUzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmMKaW5kZXggZWJhYWE3Zi4uMGZhOWY3MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwLmMKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTY5Niw2ICs2OTYsNyBAQAogCiAJaWYgKHJ0ID09IE5VTEwpIHsKIAkJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gaXBjLm9pZiwKKwkJCQkgICAgLm1hcmsgPSBzay0+c2tfbWFyaywKIAkJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9CiAJCQkJCSAgICAgIHsgLmRhZGRyID0gZmFkZHIsCiAJCQkJCQkuc2FkZHIgPSBzYWRkciwKQEAgLTg0MCw2ICs4NDEsNDIgQEAKIAlyZXR1cm4gcmV0OwogfQogCisKKy8qKgorICoJZmlyc3RfcGFja2V0X2xlbmd0aAktIHJldHVybiBsZW5ndGggb2YgZmlyc3QgcGFja2V0IGluIHJlY2VpdmUgcXVldWUKKyAqCUBzazogc29ja2V0CisgKgorICoJRHJvcHMgYWxsIGJhZCBjaGVja3N1bSBmcmFtZXMsIHVudGlsIGEgdmFsaWQgb25lIGlzIGZvdW5kLgorICoJUmV0dXJucyB0aGUgbGVuZ3RoIG9mIGZvdW5kIHNrYiwgb3IgMCBpZiBub25lIGlzIGZvdW5kLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZpcnN0X3BhY2tldF9sZW5ndGgoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmX2hlYWQgbGlzdF9raWxsLCAqcmN2cSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCByZXM7CisKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmxpc3Rfa2lsbCk7CisKKwlzcGluX2xvY2tfYmgoJnJjdnEtPmxvY2spOworCXdoaWxlICgoc2tiID0gc2tiX3BlZWsocmN2cSkpICE9IE5VTEwgJiYKKwkJdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7CisJCVVEUF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBVRFBfTUlCX0lORVJST1JTLAorCQkJCSBJU19VRFBMSVRFKHNrKSk7CisJCV9fc2tiX3VubGluayhza2IsIHJjdnEpOworCQlfX3NrYl9xdWV1ZV90YWlsKCZsaXN0X2tpbGwsIHNrYik7CisJfQorCXJlcyA9IHNrYiA/IHNrYi0+bGVuIDogMDsKKwlzcGluX3VubG9ja19iaCgmcmN2cS0+bG9jayk7CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbGlzdF9raWxsKSkgeworCQlsb2NrX3NvY2soc2spOworCQlfX3NrYl9xdWV1ZV9wdXJnZSgmbGlzdF9raWxsKTsKKwkJc2tfbWVtX3JlY2xhaW1fcGFydGlhbChzayk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJfQorCXJldHVybiByZXM7Cit9CisKIC8qCiAgKglJT0NUTCByZXF1ZXN0cyBhcHBsaWNhYmxlIHRvIHRoZSBVRFAgcHJvdG9jb2wKICAqLwpAQCAtODU2LDIxICs4OTMsMTYgQEAKIAogCWNhc2UgU0lPQ0lOUToKIAl7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCXVuc2lnbmVkIGxvbmcgYW1vdW50OworCQl1bnNpZ25lZCBpbnQgYW1vdW50ID0gZmlyc3RfcGFja2V0X2xlbmd0aChzayk7CiAKLQkJYW1vdW50ID0gMDsKLQkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQkJc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKLQkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCWlmIChhbW91bnQpCiAJCQkvKgogCQkJICogV2Ugd2lsbCBvbmx5IHJldHVybiB0aGUgYW1vdW50CiAJCQkgKiBvZiB0aGlzIHBhY2tldCBzaW5jZSB0aGF0IGlzIGFsbAogCQkJICogdGhhdCB3aWxsIGJlIHJlYWQuCiAJCQkgKi8KLQkJCWFtb3VudCA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJCWFtb3VudCAtPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisKIAkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOwogCX0KIApAQCAtOTY3LDkgKzk5OSw3IEBACiAJCWVyciA9IHVsZW47CiAKIG91dF9mcmVlOgotCWxvY2tfc29jayhzayk7Ci0Jc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7Ci0JcmVsZWFzZV9zb2NrKHNrKTsKKwlza2JfZnJlZV9kYXRhZ3JhbV9sb2NrZWQoc2ssIHNrYik7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIApAQCAtMTM1OSw3ICsxMzg5LDcgQEAKICAqCVNvY2tldCBvcHRpb24gY29kZSBmb3IgVURQCiAgKi8KIGludCB1ZHBfbGliX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbiwKKwkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4sCiAJCSAgICAgICBpbnQgKCpwdXNoX3BlbmRpbmdfZnJhbWVzKShzdHJ1Y3Qgc29jayAqKSkKIHsKIAlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKQEAgLTE0NDEsNyArMTQ3MSw3IEBACiBFWFBPUlRfU1lNQk9MKHVkcF9saWJfc2V0c29ja29wdCk7CiAKIGludCB1ZHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaWYgKGxldmVsID09IFNPTF9VRFAgIHx8ICBsZXZlbCA9PSBTT0xfVURQTElURSkKIAkJcmV0dXJuIHVkcF9saWJfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuLApAQCAtMTQ1MSw3ICsxNDgxLDcgQEAKIAogI2lmZGVmIENPTkZJR19DT01QQVQKIGludCBjb21wYXRfdWRwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCiAJCXJldHVybiB1ZHBfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKQEAgLTE1MzksMjkgKzE1NjksMTEgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IGRhdGFncmFtX3BvbGwoZmlsZSwgc29jaywgd2FpdCk7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7Ci0JaW50IAlpc19saXRlID0gSVNfVURQTElURShzayk7CiAKIAkvKiBDaGVjayBmb3IgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byBjaGVja3N1bSBlcnJvcnMgKi8KLQlpZiAoKG1hc2sgJiBQT0xMUkROT1JNKSAmJgotCSAgICAhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJgotCSAgICAhKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikpIHsKLQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcmN2cSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCQlzcGluX2xvY2tfYmgoJnJjdnEtPmxvY2spOwotCQl3aGlsZSAoKHNrYiA9IHNrYl9wZWVrKHJjdnEpKSAhPSBOVUxMICYmCi0JCSAgICAgICB1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKLQkJCVVEUF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLAotCQkJCQlVRFBfTUlCX0lORVJST1JTLCBpc19saXRlKTsKLQkJCV9fc2tiX3VubGluayhza2IsIHJjdnEpOwotCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnJjdnEtPmxvY2spOwotCi0JCS8qIG5vdGhpbmcgdG8gc2VlLCBtb3ZlIGFsb25nICovCi0JCWlmIChza2IgPT0gTlVMTCkKLQkJCW1hc2sgJj0gfihQT0xMSU4gfCBQT0xMUkROT1JNKTsKLQl9CisJaWYgKChtYXNrICYgUE9MTFJETk9STSkgJiYgIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYKKwkgICAgIShzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pICYmICFmaXJzdF9wYWNrZXRfbGVuZ3RoKHNrKSkKKwkJbWFzayAmPSB+KFBPTExJTiB8IFBPTExSRE5PUk0pOwogCiAJcmV0dXJuIG1hc2s7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcF9pbXBsLmggYi9uZXQvaXB2NC91ZHBfaW1wbC5oCmluZGV4IDlmNGE2MTYuLmFhYWQ2NTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcF9pbXBsLmgKKysrIGIvbmV0L2lwdjQvdWRwX2ltcGwuaApAQCAtMTEsMTMgKzExLDEzIEBACiBleHRlcm4gaW50CXVkcF92NF9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0pOwogCiBleHRlcm4gaW50CXVkcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKKwkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIGV4dGVybiBpbnQJdWRwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBleHRlcm4gaW50CWNvbXBhdF91ZHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkJICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CisJCQkJICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbik7CiBleHRlcm4gaW50CWNvbXBhdF91ZHBfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkJICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggNTVmNDg2ZC4uMWZkMGEzZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0zOTg2LDE0ICszOTg2LDE0IEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCiBzdGF0aWMKLWludCBhZGRyY29uZl9zeXNjdGxfZm9yd2FyZChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCitpbnQgYWRkcmNvbmZfc3lzY3RsX2ZvcndhcmQoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWludCAqdmFscCA9IGN0bC0+ZGF0YTsKIAlpbnQgdmFsID0gKnZhbHA7CiAJaW50IHJldDsKIAotCXJldCA9IHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAlpZiAod3JpdGUpCiAJCXJldCA9IGFkZHJjb25mX2ZpeHVwX2ZvcndhcmRpbmcoY3RsLCB2YWxwLCB2YWwpOwpAQCAtNDA5MCwxNCArNDA5MCwxNCBAQAogfQogCiBzdGF0aWMKLWludCBhZGRyY29uZl9zeXNjdGxfZGlzYWJsZShjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCitpbnQgYWRkcmNvbmZfc3lzY3RsX2Rpc2FibGUoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgKnZhbHAgPSBjdGwtPmRhdGE7CiAJaW50IHZhbCA9ICp2YWxwOwogCWludCByZXQ7CiAKLQlyZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJaWYgKHdyaXRlKQogCQlyZXQgPSBhZGRyY29uZl9kaXNhYmxlX2lwdjYoY3RsLCB2YWxwLCB2YWwpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCmluZGV4IDdkMjViYmUuLmM1OTViYmUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTEwNDMsMTEgKzEwNDMsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0LT5kZXYtPnN0YXRzOwogCWludCByZXQ7CiAKLQlpZiAodC0+cmVjdXJzaW9uKyspIHsKLQkJc3RhdHMtPmNvbGxpc2lvbnMrKzsKLQkJZ290byB0eF9lcnI7Ci0JfQotCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CiAJY2FzZSBodG9ucyhFVEhfUF9JUCk6CiAJCXJldCA9IGlwNGlwNl90bmxfeG1pdChza2IsIGRldik7CkBAIC0xMDYyLDE0ICsxMDU3LDEyIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gdHhfZXJyOwogCi0JdC0+cmVjdXJzaW9uLS07CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogdHhfZXJyOgogCXN0YXRzLT50eF9lcnJvcnMrKzsKIAlzdGF0cy0+dHhfZHJvcHBlZCsrOwogCWtmcmVlX3NrYihza2IpOwotCXQtPnJlY3Vyc2lvbi0tOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jCmluZGV4IDA5MDY3NWUuLjcxNjE1MzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNm1yLmMKKysrIGIvbmV0L2lwdjYvaXA2bXIuYwpAQCAtMTI4MSw3ICsxMjgxLDcgQEAKICAqCU1PU1BGL1BJTSByb3V0ZXIgc2V0IHVwIHdlIGNhbiBjbGVhbiB0aGlzIHVwLgogICovCiAKLWludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK2ludCBpcDZfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBtaWY2Y3RsIHZpZjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwppbmRleCBmNWUwNjgyLi40ZjdhYWY2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIH0KIAogc3RhdGljIGludCBkb19pcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKQEAgLTQ5NiwxMyArNDk2LDE3IEBACiAJCQlnb3RvIGVfaW52YWw7CiAKIAkJaWYgKHZhbCkgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwogCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYgc2stPnNrX2JvdW5kX2Rldl9pZiAhPSB2YWwpCiAJCQkJZ290byBlX2ludmFsOwogCi0JCQlpZiAoX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgdmFsKSA9PSBOVUxMKSB7CisJCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgdmFsKTsKKwkJCWlmICghZGV2KSB7CiAJCQkJcmV0diA9IC1FTk9ERVY7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQlkZXZfcHV0KGRldik7CiAJCX0KIAkJbnAtPm1jYXN0X29pZiA9IHZhbDsKIAkJcmV0diA9IDA7CkBAIC03NzMsNyArNzc3LDcgQEAKIH0KIAogaW50IGlwdjZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpbnQgZXJyOwogCkBAIC04MDEsNyArODA1LDcgQEAKIAogI2lmZGVmIENPTkZJR19DT01QQVQKIGludCBjb21wYXRfaXB2Nl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IDcwMTU0NzguLmY3NGU0ZTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtNjU4LDcgKzY1OCw2IEBACiAJCSAgICAgJmljbXA2aCwgTlVMTCwKIAkJICAgICBzZW5kX3NsbGFvID8gTkRfT1BUX1NPVVJDRV9MTF9BRERSIDogMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKG5kaXNjX3NlbmRfcnMpOwogCiAKIHN0YXRpYyB2b2lkIG5kaXNjX2Vycm9yX3JlcG9ydChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTE3MzUsNyArMTczNCw3IEBACiAJfQogfQogCi1pbnQgbmRpc2NfaWZpbmZvX3N5c2N0bF9jaGFuZ2Uoc3RydWN0IGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCitpbnQgbmRpc2NfaWZpbmZvX3N5c2N0bF9jaGFuZ2Uoc3RydWN0IGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjdGwtPmV4dHJhMTsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwpAQCAtMTc0NiwxNiArMTc0NSwxNiBAQAogCQluZGlzY193YXJuX2RlcHJlY2F0ZWRfc3lzY3RsKGN0bCwgInN5c2NhbGwiLCBkZXYgPyBkZXYtPm5hbWUgOiAiZGVmYXVsdCIpOwogCiAJaWYgKHN0cmNtcChjdGwtPnByb2NuYW1lLCAicmV0cmFuc190aW1lIikgPT0gMCkKLQkJcmV0ID0gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCQlyZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAllbHNlIGlmIChzdHJjbXAoY3RsLT5wcm9jbmFtZSwgImJhc2VfcmVhY2hhYmxlX3RpbWUiKSA9PSAwKQogCQlyZXQgPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMoY3RsLCB3cml0ZSwKLQkJCQkJICAgIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCQkJCSAgICBidWZmZXIsIGxlbnAsIHBwb3MpOwogCiAJZWxzZSBpZiAoKHN0cmNtcChjdGwtPnByb2NuYW1lLCAicmV0cmFuc190aW1lX21zIikgPT0gMCkgfHwKIAkJIChzdHJjbXAoY3RsLT5wcm9jbmFtZSwgImJhc2VfcmVhY2hhYmxlX3RpbWVfbXMiKSA9PSAwKSkKIAkJcmV0ID0gcHJvY19kb2ludHZlY19tc19qaWZmaWVzKGN0bCwgd3JpdGUsCi0JCQkJCSAgICAgICBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCQkJCQkgICAgICAgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAllbHNlCiAJCXJldCA9IC0xOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDdkNjc1YjguLjRmMjQ1NzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC05NTcsNyArOTU3LDcgQEAKIAogCiBzdGF0aWMgaW50IGRvX3Jhd3Y2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3QgcmF3Nl9zb2NrICpycCA9IHJhdzZfc2soc2spOwogCWludCB2YWw7CkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogfQogCiBzdGF0aWMgaW50IHJhd3Y2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN3aXRjaChsZXZlbCkgewogCQljYXNlIFNPTF9SQVc6CkBAIC0xMDI0LDcgKzEwMjQsNyBAQAogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogc3RhdGljIGludCBjb21wYXRfcmF3djZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNPTF9SQVc6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCA3N2FlY2JlLi5kNmZlNzY0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTI1MjQsMTMgKzI1MjQsMTMgQEAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAKIHN0YXRpYwotaW50IGlwdjZfc3lzY3RsX3J0Y2FjaGVfZmx1c2goY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKiBmaWxwLAoraW50IGlwdjZfc3lzY3RsX3J0Y2FjaGVfZmx1c2goY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJCSAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKIAlpbnQgZGVsYXkgPSBuZXQtPmlwdjYuc3lzY3RsLmZsdXNoX2RlbGF5OwogCWlmICh3cml0ZSkgewotCQlwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCXByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAkJZmliNl9ydW5fZ2MoZGVsYXkgPD0gMCA/IH4wVUwgOiAodW5zaWduZWQgbG9uZylkZWxheSwgbmV0KTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zaXQuYyBiL25ldC9pcHY2L3NpdC5jCmluZGV4IDBhZTRmNjQuLmRiZDE5YTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3NpdC5jCisrKyBiL25ldC9pcHY2L3NpdC5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKiBSb2dlciBWZW5uaW5nIDxyLnZlbm5pbmdAdGVsc3RyYS5jb20+Ogk2dG80IHN1cHBvcnQKICAqIE5hdGUgVGhvbXBzb24gPG5hdGVAdGhlYm9nLm5ldD46CQk2dG80IHN1cHBvcnQKICAqIEZyZWQgVGVtcGxpbiA8ZnJlZC5sLnRlbXBsaW5AYm9laW5nLmNvbT46CWlzYXRhcCBzdXBwb3J0Ci0gKiBTYXNjaGEgSGx1c2lhayA8bWFpbEBzYXNjaGFobHVzaWFrLmRlPjoJc3RhdGVsZXNzIGF1dG9jb25mIGZvciBpc2F0YXAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yMjMsNDQgKzIyMiw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGlwaXA2X3R1bm5lbF9yc190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGlwX3R1bm5lbF9wcmxfZW50cnkgKnAgPSAoc3RydWN0IGlwX3R1bm5lbF9wcmxfZW50cnkgKikgZGF0YTsKLQlzdHJ1Y3QgaW5ldDZfZGV2ICppZnA7Ci0Jc3RydWN0IGluZXQ2X2lmYWRkciAqYWRkcjsKLQotCXNwaW5fbG9jaygmcC0+bG9jayk7Ci0JaWZwID0gX19pbjZfZGV2X2dldChwLT50dW5uZWwtPmRldik7Ci0KLQlyZWFkX2xvY2tfYmgoJmlmcC0+bG9jayk7Ci0JZm9yIChhZGRyID0gaWZwLT5hZGRyX2xpc3Q7IGFkZHI7IGFkZHIgPSBhZGRyLT5pZl9uZXh0KSB7Ci0JCXN0cnVjdCBpbjZfYWRkciBydHI7Ci0KLQkJaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJmFkZHItPmFkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkpCi0JCQljb250aW51ZTsKLQotCQkvKiBTZW5kIFJTIHRvIGd1ZXNzZWQgbGlua2xvY2FsIGFkZHJlc3Mgb2Ygcm91dGVyCi0JCSAqCi0JCSAqIEJldHRlcjogc2VuZCB0byBmZjAyOjoyIGVuY2Fwc3VsZWQgaW4gdW5pY2FzdCBkaXJlY3RseQotCQkgKiB0byByb3V0ZXItdjQgaW5zdGVhZCBvZiBndWVzc2luZyB0aGUgdjYgYWRkcmVzcy4KLQkJICoKLQkJICogQ2lzY28vV2luZG93cyBzZWVtIHRvIG5vdCBzZXQgdGhlIHUvbCBiaXQgY29ycmVjdGx5LAotCQkgKiBzbyB3ZSB3b24ndCBndWVzcyByaWdodC4KLQkJICovCi0JCWlwdjZfYWRkcl9zZXQoJnJ0ciwgIGh0b25sKDB4RkU4MDAwMDApLCAwLCAwLCAwKTsKLQkJaWYgKCFfX2lwdjZfaXNhdGFwX2lmaWQocnRyLnM2X2FkZHIgKyA4LAotCQkJCQlwLT5hZGRyKSkgewotCQkJbmRpc2Nfc2VuZF9ycyhwLT50dW5uZWwtPmRldiwgJmFkZHItPmFkZHIsICZydHIpOwotCQl9Ci0JfQotCXJlYWRfdW5sb2NrX2JoKCZpZnAtPmxvY2spOwotCi0JbW9kX3RpbWVyKCZwLT5yc190aW1lciwgamlmZmllcyArIEhaICogcC0+cnNfZGVsYXkpOwotCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKLQotCXJldHVybjsKLX0KLQogc3RhdGljIHN0cnVjdCBpcF90dW5uZWxfcHJsX2VudHJ5ICoKIF9faXBpcDZfdHVubmVsX2xvY2F0ZV9wcmwoc3RydWN0IGlwX3R1bm5lbCAqdCwgX19iZTMyIGFkZHIpCiB7CkBAIC0zMTMsMTMgKzI3NCwxMiBAQAogCiAJYyA9IDA7CiAJZm9yIChwcmwgPSB0LT5wcmw7IHBybDsgcHJsID0gcHJsLT5uZXh0KSB7Ci0JCWlmIChjID4gY21heCkKKwkJaWYgKGMgPj0gY21heCkKIAkJCWJyZWFrOwogCQlpZiAoa3BybC5hZGRyICE9IGh0b25sKElOQUREUl9BTlkpICYmIHBybC0+YWRkciAhPSBrcHJsLmFkZHIpCiAJCQljb250aW51ZTsKIAkJa3BbY10uYWRkciA9IHBybC0+YWRkcjsKIAkJa3BbY10uZmxhZ3MgPSBwcmwtPmZsYWdzOwotCQlrcFtjXS5yc19kZWxheSA9IHBybC0+cnNfZGVsYXk7CiAJCWMrKzsKIAkJaWYgKGtwcmwuYWRkciAhPSBodG9ubChJTkFERFJfQU5ZKSkKIAkJCWJyZWFrOwpAQCAtMzY5LDIzICszMjksMTEgQEAKIAl9CiAKIAlwLT5uZXh0ID0gdC0+cHJsOwotCXAtPnR1bm5lbCA9IHQ7CiAJdC0+cHJsID0gcDsKIAl0LT5wcmxfY291bnQrKzsKLQotCXNwaW5fbG9ja19pbml0KCZwLT5sb2NrKTsKLQlzZXR1cF90aW1lcigmcC0+cnNfdGltZXIsIGlwaXA2X3R1bm5lbF9yc190aW1lciwgKHVuc2lnbmVkIGxvbmcpIHApOwogdXBkYXRlOgogCXAtPmFkZHIgPSBhLT5hZGRyOwogCXAtPmZsYWdzID0gYS0+ZmxhZ3M7Ci0JcC0+cnNfZGVsYXkgPSBhLT5yc19kZWxheTsKLQlpZiAocC0+cnNfZGVsYXkgPT0gMCkKLQkJcC0+cnNfZGVsYXkgPSBJUFRVTk5FTF9SU19ERUZBVUxUX0RFTEFZOwotCXNwaW5fbG9jaygmcC0+bG9jayk7Ci0JZGVsX3RpbWVyKCZwLT5yc190aW1lcik7Ci0JaWYgKHAtPmZsYWdzICYgUFJMX0RFRkFVTFQpCi0JCW1vZF90aW1lcigmcC0+cnNfdGltZXIsIGppZmZpZXMgKyAxKTsKLQlzcGluX3VubG9jaygmcC0+bG9jayk7CiBvdXQ6CiAJd3JpdGVfdW5sb2NrKCZpcGlwNl9sb2NrKTsKIAlyZXR1cm4gZXJyOwpAQCAtNDA0LDkgKzM1Miw2IEBACiAJCQlpZiAoKCpwKS0+YWRkciA9PSBhLT5hZGRyKSB7CiAJCQkJeCA9ICpwOwogCQkJCSpwID0geC0+bmV4dDsKLQkJCQlzcGluX2xvY2soJngtPmxvY2spOwotCQkJCWRlbF90aW1lcigmeC0+cnNfdGltZXIpOwotCQkJCXNwaW5fdW5sb2NrKCZ4LT5sb2NrKTsKIAkJCQlrZnJlZSh4KTsKIAkJCQl0LT5wcmxfY291bnQtLTsKIAkJCQlnb3RvIG91dDsKQEAgLTQxNyw5ICszNjIsNiBAQAogCQl3aGlsZSAodC0+cHJsKSB7CiAJCQl4ID0gdC0+cHJsOwogCQkJdC0+cHJsID0gdC0+cHJsLT5uZXh0OwotCQkJc3Bpbl9sb2NrKCZ4LT5sb2NrKTsKLQkJCWRlbF90aW1lcigmeC0+cnNfdGltZXIpOwotCQkJc3Bpbl91bmxvY2soJngtPmxvY2spOwogCQkJa2ZyZWUoeCk7CiAJCQl0LT5wcmxfY291bnQtLTsKIAkJfQpAQCAtNjI2LDExICs1NjgsNiBAQAogCXN0cnVjdCBpbjZfYWRkciAqYWRkcjY7CiAJaW50IGFkZHJfdHlwZTsKIAotCWlmICh0dW5uZWwtPnJlY3Vyc2lvbisrKSB7Ci0JCXN0YXRzLT5jb2xsaXNpb25zKys7Ci0JCWdvdG8gdHhfZXJyb3I7Ci0JfQotCiAJaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVBWNikpCiAJCWdvdG8gdHhfZXJyb3I7CiAKQEAgLTc1Myw3ICs2OTAsNiBAQAogCQkJaXBfcnRfcHV0KHJ0KTsKIAkJCXN0YXRzLT50eF9kcm9wcGVkKys7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQl0dW5uZWwtPnJlY3Vyc2lvbi0tOwogCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJfQogCQlpZiAoc2tiLT5zaykKQEAgLTc5NCw3ICs3MzAsNiBAQAogCW5mX3Jlc2V0KHNrYik7CiAKIAlJUFRVTk5FTF9YTUlUKCk7Ci0JdHVubmVsLT5yZWN1cnNpb24tLTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCiB0eF9lcnJvcl9pY21wOgpAQCAtODAyLDcgKzczNyw2IEBACiB0eF9lcnJvcjoKIAlzdGF0cy0+dHhfZXJyb3JzKys7CiAJZGV2X2tmcmVlX3NrYihza2IpOwotCXR1bm5lbC0+cmVjdXJzaW9uLS07CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCBiMjY1YjcwLi5jZjUzOGVkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtMjg4LDkgKzI4OCw3IEBACiAJCWVyciA9IHVsZW47CiAKIG91dF9mcmVlOgotCWxvY2tfc29jayhzayk7Ci0Jc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7Ci0JcmVsZWFzZV9zb2NrKHNrKTsKKwlza2JfZnJlZV9kYXRhZ3JhbV9sb2NrZWQoc2ssIHNrYik7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIApAQCAtMTA0NCw3ICsxMDQyLDcgQEAKICAqCVNvY2tldCBvcHRpb24gY29kZSBmb3IgVURQCiAgKi8KIGludCB1ZHB2Nl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaWYgKGxldmVsID09IFNPTF9VRFAgIHx8ICBsZXZlbCA9PSBTT0xfVURQTElURSkKIAkJcmV0dXJuIHVkcF9saWJfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuLApAQCAtMTA1NCw3ICsxMDUyLDcgQEAKIAogI2lmZGVmIENPTkZJR19DT01QQVQKIGludCBjb21wYXRfdWRwdjZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCiAJCXJldHVybiB1ZHBfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcF9pbXBsLmggYi9uZXQvaXB2Ni91ZHBfaW1wbC5oCmluZGV4IDZiYjMwMzQuLmQ3NTcxMDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcF9pbXBsLmgKKysrIGIvbmV0L2lwdjYvdWRwX2ltcGwuaApAQCAtMTYsMTAgKzE2LDEwIEBACiBleHRlcm4gaW50CXVkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJCSBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwogZXh0ZXJuIGludAl1ZHB2Nl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCQkgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CisJCQkJIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogI2lmZGVmIENPTkZJR19DT01QQVQKIGV4dGVybiBpbnQJY29tcGF0X3VkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKKwkJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbik7CiBleHRlcm4gaW50CWNvbXBhdF91ZHB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lweC9hZl9pcHguYyBiL25ldC9pcHgvYWZfaXB4LmMKaW5kZXggZjExMThkOS4uNjZjN2EyMCAxMDA2NDQKLS0tIGEvbmV0L2lweC9hZl9pcHguYworKysgYi9uZXQvaXB4L2FmX2lweC5jCkBAIC0xMjkyLDcgKzEyOTIsNyBAQAogICogc29ja2V0IG9iamVjdC4gKi8KIAogc3RhdGljIGludCBpcHhfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCWludCBvcHQ7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9hZl9pcmRhLmMgYi9uZXQvaXJkYS9hZl9pcmRhLmMKaW5kZXggNTBiNDNjNS4uZGQzNTY0MSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvYWZfaXJkYS5jCisrKyBiL25ldC9pcmRhL2FmX2lyZGEuYwpAQCAtMTgyNiw3ICsxODI2LDcgQEAKICAqCiAgKi8KIHN0YXRpYyBpbnQgaXJkYV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9hdHRhY2guYyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2F0dGFjaC5jCmluZGV4IGVhZmMwMTAuLjNjMTc1NDAgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2F0dGFjaC5jCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2F0dGFjaC5jCkBAIC0zMCw2ICszMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KICNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwppbmRleCA2MjExNjgyLi4zMTVlYWQzIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYworKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldGguYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2V0aC5jCmluZGV4IDdiNmI2MzEuLmQzNDAxMTAgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFuL2lybGFuX2V0aC5jCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2V0aC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L2FycC5oPgogCiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJuZXQvaXJuZXRfaXJkYS5jIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXRfaXJkYS5jCmluZGV4IGNmOWE0YjUuLmNjY2MyZTkgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybmV0L2lybmV0X2lyZGEuYworKysgYi9uZXQvaXJkYS9pcm5ldC9pcm5ldF9pcmRhLmMKQEAgLTksNiArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImlybmV0X2lyZGEuaCIJCS8qIFByaXZhdGUgaGVhZGVyICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJuZXQvaXJuZXRfcHBwLmMgYi9uZXQvaXJkYS9pcm5ldC9pcm5ldF9wcHAuYwppbmRleCA2OGNiY2IxLi43ZGVhODgyIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcm5ldC9pcm5ldF9wcHAuYworKysgYi9uZXQvaXJkYS9pcm5ldC9pcm5ldF9wcHAuYwpAQCAtMTMsNiArMTMsNyBAQAogICoJMikgYXMgYSBjb250cm9sIGNoYW5uZWwgKHdyaXRlIGNvbW1hbmRzLCByZWFkIGV2ZW50cykKICAqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgImlybmV0X3BwcC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KIC8qIFBsZWFzZSBwdXQgb3RoZXIgaGVhZGVycyBpbiBpcm5ldC5oIC0gVGhhbmtzICovCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcnN5c2N0bC5jIGIvbmV0L2lyZGEvaXJzeXNjdGwuYwppbmRleCA1N2Y4ODE3Li41Yzg2NTY3IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcnN5c2N0bC5jCisrKyBiL25ldC9pcmRhL2lyc3lzY3RsLmMKQEAgLTczLDEyICs3MywxMiBAQAogLyogRm9yIG90aGVyIHN5c2N0bCwgSSd2ZSBubyBpZGVhIG9mIHRoZSByYW5nZS4gTWF5YmUgRGFnIGNvdWxkIGhlbHAKICAqIHVzIG9uIHRoYXQgLSBKZWFuIElJICovCiAKLXN0YXRpYyBpbnQgZG9fZGV2bmFtZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBkb19kZXZuYW1lKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldCA9IHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWlmIChyZXQgPT0gMCAmJiB3cml0ZSkgewogCQlzdHJ1Y3QgaWFzX3ZhbHVlICp2YWw7CiAKQEAgLTkwLDEyICs5MCwxMiBAQAogfQogCiAKLXN0YXRpYyBpbnQgZG9fZGlzY292ZXJ5KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IGRvX2Rpc2NvdmVyeShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogICAgICAgIGludCByZXQ7CiAKLSAgICAgICByZXQgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKyAgICAgICByZXQgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKICAgICAgICBpZiAocmV0KQogCSAgICAgICByZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9uZXQvaXVjdi9hZl9pdWN2LmMgYi9uZXQvaXVjdi9hZl9pdWN2LmMKaW5kZXggZDk4NWQxNi4uYmFkYTFiOSAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvYWZfaXVjdi5jCisrKyBiL25ldC9pdWN2L2FmX2l1Y3YuYwpAQCAtMTM4Nyw3ICsxMzg3LDcgQEAKIAogLyogZ2V0c29ja29wdCBhbmQgc2V0c29ja29wdCAqLwogc3RhdGljIGludCBpdWN2X3NvY2tfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaXVjdl9zb2NrICppdWN2ID0gaXVjdl9zayhzayk7CmRpZmYgLS1naXQgYS9uZXQvbGxjL2FmX2xsYy5jIGIvbmV0L2xsYy9hZl9sbGMuYwppbmRleCBjNDVlZWUxLi43YWE0ZmQxIDEwMDY0NAotLS0gYS9uZXQvbGxjL2FmX2xsYy5jCisrKyBiL25ldC9sbGMvYWZfbGxjLmMKQEAgLTk3Myw3ICs5NzMsNyBAQAogICoJU2V0IHZhcmlvdXMgY29ubmVjdGlvbiBzcGVjaWZpYyBwYXJhbWV0ZXJzLgogICovCiBzdGF0aWMgaW50IGxsY191aV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy10eC5jIGIvbmV0L21hYzgwMjExL2FnZy10eC5jCmluZGV4IGJkNzY1ZjMuLmIwOTk0OGMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctdHguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKQEAgLTY2NiwyNiArNjY2LDI1IEBACiAKIAlzdGF0ZSA9ICZzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W3RpZF07CiAKKwlkZWxfdGltZXJfc3luYygmc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5hZGRiYV9yZXNwX3RpbWVyKTsKKwogCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKIAotCWlmICghKCpzdGF0ZSAmIEhUX0FEREJBX1JFUVVFU1RFRF9NU0spKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQlyZXR1cm47Ci0JfQorCWlmICghKCpzdGF0ZSAmIEhUX0FEREJBX1JFUVVFU1RFRF9NU0spKQorCQlnb3RvIHRpbWVyX3N0aWxsX25lZWRlZDsKIAogCWlmIChtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuZGlhbG9nX3Rva2VuICE9CiAJCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+ZGlhbG9nX3Rva2VuKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAid3JvbmcgYWRkQkEgcmVzcG9uc2UgdG9rZW4sIHRpZCAlZFxuIiwgdGlkKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KLQkJcmV0dXJuOworCQlnb3RvIHRpbWVyX3N0aWxsX25lZWRlZDsKIAl9CiAKLQlkZWxfdGltZXJfc3luYygmc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5hZGRiYV9yZXNwX3RpbWVyKTsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAic3dpdGNoZWQgb2ZmIGFkZEJBIHRpbWVyIGZvciB0aWQgJWQgXG4iLCB0aWQpOwogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCiAJaWYgKGxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5zdGF0dXMpCiAJCQk9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7CiAJCXU4IGN1cnN0YXRlID0gKnN0YXRlOwpAQCAtNjk5LDUgKzY5OCwxMSBAQAogCX0gZWxzZSB7CiAJCV9fX2llZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3RhLCB0aWQsIFdMQU5fQkFDS19JTklUSUFUT1IpOwogCX0KKworCWdvdG8gb3V0OworCisgdGltZXJfc3RpbGxfbmVlZGVkOgorCWFkZF90aW1lcigmc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5hZGRiYV9yZXNwX3RpbWVyKTsKKyBvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2ZnLmMgYi9uZXQvbWFjODAyMTEvY2ZnLmMKaW5kZXggNTYwOGY2Yy4uN2I1MTMxYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2NmZy5jCisrKyBiL25ldC9tYWM4MDIxMS9jZmcuYwpAQCAtNzIsNiArNzIsOSBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCWludCByZXQ7CiAKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCiAJaWYgKCFubDgwMjExX3R5cGVfY2hlY2sodHlwZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC04MSw5ICs4NCw2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChuZXRpZl9ydW5uaW5nKHNkYXRhLT5kZXYpKQotCQlyZXR1cm4gLUVCVVNZOwotCiAJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikgJiYgcGFyYW1zLT5tZXNoX2lkX2xlbikKIAkJaWVlZTgwMjExX3NkYXRhX3NldF9tZXNoX2lkKHNkYXRhLAogCQkJCQkgICAgcGFyYW1zLT5tZXNoX2lkX2xlbiwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9odC5jIGIvbmV0L21hYzgwMjExL2h0LmMKaW5kZXggMDg5MWJmYi4uNDhlZjFhMiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2h0LmMKKysrIGIvbmV0L21hYzgwMjExL2h0LmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCXByaW50ayhLRVJOX0RFQlVHICJkZWxiYSBmcm9tICVwTSAoJXMpIHRpZCAlZCByZWFzb24gY29kZSAlZFxuIiwKIAkJCW1nbXQtPnNhLCBpbml0aWF0b3IgPyAiaW5pdGlhdG9yIiA6ICJyZWNpcGllbnQiLCB0aWQsCi0JCQltZ210LT51LmFjdGlvbi51LmRlbGJhLnJlYXNvbl9jb2RlKTsKKwkJCWxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUpKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KIAogCWlmIChpbml0aWF0b3IgPT0gV0xBTl9CQUNLX0lOSVRJQVRPUikKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pYnNzLmMgYi9uZXQvbWFjODAyMTEvaWJzcy5jCmluZGV4IDkyMGVjODcuLmYxMzYyZjMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pYnNzLmMKKysrIGIvbmV0L21hYzgwMjExL2lic3MuYwpAQCAtNzMsNiArNzMsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKIAl1OCAqcG9zOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAl1MzIgYnNzX2NoYW5nZTsKIAl1OCBzdXBwX3JhdGVzW0lFRUU4MDIxMV9NQVhfU1VQUF9SQVRFU107CiAKQEAgLTE3Nyw4ICsxNzgsOSBAQAogCW1vZF90aW1lcigmaWZpYnNzLT50aW1lciwKIAkJICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBJRUVFODAyMTFfSUJTU19NRVJHRV9JTlRFUlZBTCkpOwogCi0JY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZShsb2NhbC0+aHcud2lwaHksIGxvY2FsLT5ody5jb25mLmNoYW5uZWwsCi0JCQkJICBtZ210LCBza2ItPmxlbiwgMCwgR0ZQX0tFUk5FTCk7CisJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZShsb2NhbC0+aHcud2lwaHksIGxvY2FsLT5ody5jb25mLmNoYW5uZWwsCisJCQkJCW1nbXQsIHNrYi0+bGVuLCAwLCBHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CiAJY2ZnODAyMTFfaWJzc19qb2luZWQoc2RhdGEtPmRldiwgaWZpYnNzLT5ic3NpZCwgR0ZQX0tFUk5FTCk7CiB9CiAKQEAgLTUzOCwxMyArNTQwLDEyIEBACiAJCQkJICAgICAgIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZLAogCQkJCSAgICAgICBjYXBhYmlsaXR5KTsKIAorCWlmIChic3MpIHsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRwotCWlmIChic3MpCiAJCXByaW50ayhLRVJOX0RFQlVHICIgICBzdGFfZmluZF9pYnNzOiBzZWxlY3RlZCAlcE0gY3VycmVudCAiCiAJCSAgICAgICAiJXBNXG4iLCBic3MtPmNic3MuYnNzaWQsIGlmaWJzcy0+YnNzaWQpOwogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHICovCiAKLQlpZiAoYnNzICYmIG1lbWNtcChpZmlic3MtPmJzc2lkLCBic3MtPmNic3MuYnNzaWQsIEVUSF9BTEVOKSkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNlbGVjdGVkIElCU1MgQlNTSUQgJXBNIgogCQkgICAgICAgIiBiYXNlZCBvbiBjb25maWd1cmVkIFNTSURcbiIsCiAJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBic3MtPmNic3MuYnNzaWQpOwpAQCAtNTUyLDggKzU1Myw3IEBACiAJCWllZWU4MDIxMV9zdGFfam9pbl9pYnNzKHNkYXRhLCBic3MpOwogCQlpZWVlODAyMTFfcnhfYnNzX3B1dChsb2NhbCwgYnNzKTsKIAkJcmV0dXJuOwotCX0gZWxzZSBpZiAoYnNzKQotCQlpZWVlODAyMTFfcnhfYnNzX3B1dChsb2NhbCwgYnNzKTsKKwl9CiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICIgICBkaWQgbm90IHRyeSB0byBqb2luIGlic3NcbiIpOwpAQCAtODI5LDcgKzgyOSw3IEBACiAJCWlmICghc2RhdGEtPnUuaWJzcy5zc2lkX2xlbikKIAkJCWNvbnRpbnVlOwogCQlzZGF0YS0+dS5pYnNzLmxhc3Rfc2Nhbl9jb21wbGV0ZWQgPSBqaWZmaWVzOwotCQlpZWVlODAyMTFfc3RhX2ZpbmRfaWJzcyhzZGF0YSk7CisJCW1vZF90aW1lcigmc2RhdGEtPnUuaWJzcy50aW1lciwgMCk7CiAJfQogCW11dGV4X3VubG9jaygmbG9jYWwtPmlmbGlzdF9tdHgpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jIGIvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCmluZGV4IGUxMmE3ODYuLjI5YjgyZTkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogICogQGh3bXBfaWU6IGh3bXAgaW5mb3JtYXRpb24gZWxlbWVudCAoUFJFUCBvciBQUkVRKQogICoKICAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgcGF0aCByb3V0aW5nIGluZm9ybWF0aW9uIHRvIHRoZSBvcmlnaW5hdG9yIGFuZCB0aGUKLSAqIHRyYW5zbWl0dGVyIG9mIGEgSFdNUCBQUkVRIG9yIFBSRVAgZnJhbS4KKyAqIHRyYW5zbWl0dGVyIG9mIGEgSFdNUCBQUkVRIG9yIFBSRVAgZnJhbWUuCiAgKgogICogUmV0dXJuczogbWV0cmljIHRvIGZyYW1lIG9yaWdpbmF0b3Igb3IgMCBpZiB0aGUgZnJhbWUgc2hvdWxkIG5vdCBiZSBmdXJ0aGVyCiAgKiBwcm9jZXNzZWQKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tbG1lLmMgYi9uZXQvbWFjODAyMTEvbWxtZS5jCmluZGV4IDk3YTI3OGEuLmRjNTA0OWQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tbG1lLmMKKysrIGIvbmV0L21hYzgwMjExL21sbWUuYwpAQCAtMTM4OCw4ICsxMzg4LDggQEAKIAogCXJlYXNvbl9jb2RlID0gbGUxNl90b19jcHUobWdtdC0+dS5kaXNhc3NvYy5yZWFzb25fY29kZSk7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRpc2Fzc29jaWF0ZWQgKFJlYXNvbjogJXUpXG4iLAotCQkJc2RhdGEtPmRldi0+bmFtZSwgcmVhc29uX2NvZGUpOworCXByaW50ayhLRVJOX0RFQlVHICIlczogZGlzYXNzb2NpYXRlZCBmcm9tICVwTSAoUmVhc29uOiAldSlcbiIsCisJCQlzZGF0YS0+ZGV2LT5uYW1lLCBtZ210LT5zYSwgcmVhc29uX2NvZGUpOwogCiAJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgZmFsc2UpOwogCXJldHVybiBSWF9NR01UX0NGRzgwMjExX0RJU0FTU09DOwpAQCAtMTQ1Nyw4ICsxNDU3LDcgQEAKIAlpZiAoc3RhdHVzX2NvZGUgIT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFQIGRlbmllZCBhc3NvY2lhdGlvbiAoY29kZT0lZClcbiIsCiAJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBzdGF0dXNfY29kZSk7Ci0JCWxpc3RfZGVsKCZ3ay0+bGlzdCk7Ci0JCWtmcmVlKHdrKTsKKwkJd2stPnN0YXRlID0gSUVFRTgwMjExX01HRF9TVEFURV9JRExFOwogCQlyZXR1cm4gUlhfTUdNVF9DRkc4MDIxMV9BU1NPQzsKIAl9CiAKQEAgLTE2NzUsNyArMTY3NCw3IEBACiAKIAkvKiBkaXJlY3QgcHJvYmUgbWF5IGJlIHBhcnQgb2YgdGhlIGFzc29jaWF0aW9uIGZsb3cgKi8KIAlpZiAod2sgJiYgd2stPnN0YXRlID09IElFRUU4MDIxMV9NR0RfU1RBVEVfUFJPQkUpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGRpcmVjdCBwcm9iZSByZXNwb25kZWRcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZGlyZWN0IHByb2JlIHJlc3BvbmRlZFxuIiwKIAkJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUpOwogCQl3ay0+dHJpZXMgPSAwOwogCQl3ay0+c3RhdGUgPSBJRUVFODAyMTFfTUdEX1NUQVRFX0FVVEg7CkBAIC0yNTAyLDkgKzI1MDEsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfbWdkX3dvcmsgKndrOwogCWNvbnN0IHU4ICpic3NpZCA9IE5VTEw7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRlYXV0aGVudGljYXRpbmcgYnkgbG9jYWwgY2hvaWNlIChyZWFzb249JWQpXG4iLAotCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCByZXEtPnJlYXNvbl9jb2RlKTsKLQogCW11dGV4X2xvY2soJmlmbWdkLT5tdHgpOwogCiAJaWYgKGlmbWdkLT5hc3NvY2lhdGVkICYmICZpZm1nZC0+YXNzb2NpYXRlZC0+Y2JzcyA9PSByZXEtPmJzcykgewpAQCAtMjUzMiw2ICsyNTI4LDkgQEAKIAogCW11dGV4X3VubG9jaygmaWZtZ2QtPm10eCk7CiAKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRlYXV0aGVudGljYXRpbmcgZnJvbSAlcE0gYnkgbG9jYWwgY2hvaWNlIChyZWFzb249JWQpXG4iLAorCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBic3NpZCwgcmVxLT5yZWFzb25fY29kZSk7CisKIAlpZWVlODAyMTFfc2VuZF9kZWF1dGhfZGlzYXNzb2Moc2RhdGEsIGJzc2lkLAogCQkJSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwgcmVxLT5yZWFzb25fY29kZSwKIAkJCWNvb2tpZSk7CkBAIC0yNTQ1LDkgKzI1NDQsNiBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkaXNhc3NvY2lhdGluZyBieSBsb2NhbCBjaG9pY2UgKHJlYXNvbj0lZClcbiIsCi0JICAgICAgIHNkYXRhLT5kZXYtPm5hbWUsIHJlcS0+cmVhc29uX2NvZGUpOwotCiAJbXV0ZXhfbG9jaygmaWZtZ2QtPm10eCk7CiAKIAkvKgpAQCAtMjU2MSw2ICsyNTU3LDkgQEAKIAkJcmV0dXJuIC1FTk9MSU5LOwogCX0KIAorCXByaW50ayhLRVJOX0RFQlVHICIlczogZGlzYXNzb2NpYXRpbmcgZnJvbSAlcE0gYnkgbG9jYWwgY2hvaWNlIChyZWFzb249JWQpXG4iLAorCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCByZXEtPmJzcy0+YnNzaWQsIHJlcS0+cmVhc29uX2NvZGUpOworCiAJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgZmFsc2UpOwogCiAJbXV0ZXhfdW5sb2NrKCZpZm1nZC0+bXR4KTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZF9kZWJ1Z2ZzLmMgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWRfZGVidWdmcy5jCmluZGV4IGE1OTA0M2ZiLi40NTY2NzA1IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWRfZGVidWdmcy5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZF9kZWJ1Z2ZzLmMKQEAgLTYsNiArNiw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yeC5jIGIvbmV0L21hYzgwMjExL3J4LmMKaW5kZXggYzAxNTg4Zi4uNzE3MGJmNCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3J4LmMKKysrIGIvbmV0L21hYzgwMjExL3J4LmMKQEAgLTIxNjQsMTEgKzIxNjQsMTcgQEAKIAogCXNrYiA9IHJ4LnNrYjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpIHsKKwlpZiAocnguc2RhdGEgJiYgaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQlyeC5mbGFncyB8PSBJRUVFODAyMTFfUlhfUkFfTUFUQ0g7CisJCXByZXBhcmVzID0gcHJlcGFyZV9mb3JfaGFuZGxlcnMocnguc2RhdGEsICZyeCwgaGRyKTsKKwkJaWYgKHByZXBhcmVzKQorCQkJcHJldiA9IHJ4LnNkYXRhOworCX0gZWxzZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CiAJCWlmICghbmV0aWZfcnVubmluZyhzZGF0YS0+ZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKKwkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SIHx8CisJCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKIAkJCWNvbnRpbnVlOwogCiAJCXJ4LmZsYWdzIHw9IElFRUU4MDIxMV9SWF9SQV9NQVRDSDsKQEAgLTI0NDcsNiArMjQ1Myw4IEBACiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOwogCisJV0FSTl9PTl9PTkNFKHNvZnRpcnFfY291bnQoKSA9PSAwKTsKKwogCWlmIChXQVJOX09OKHN0YXR1cy0+YmFuZCA8IDAgfHwKIAkJICAgIHN0YXR1cy0+YmFuZCA+PSBJRUVFODAyMTFfTlVNX0JBTkRTKSkKIAkJZ290byBkcm9wOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3NjYW4uYyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKaW5kZXggMDM5OTAxMS4uNzFlMTBjYSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3NjYW4uYworKysgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCkBAIC05MCw4ICs5MCw4IEBACiAJCWJzcy0+ZHRpbV9wZXJpb2QgPSB0aW1faWUtPmR0aW1fcGVyaW9kOwogCX0KIAotCS8qIHNldCBkZWZhdWx0IHZhbHVlIGZvciBidWdneSBBUHMgKi8KLQlpZiAoIWVsZW1zLT50aW0gfHwgYnNzLT5kdGltX3BlcmlvZCA9PSAwKQorCS8qIHNldCBkZWZhdWx0IHZhbHVlIGZvciBidWdneSBBUC9ubyBUSU0gZWxlbWVudCAqLworCWlmIChic3MtPmR0aW1fcGVyaW9kID09IDApCiAJCWJzcy0+ZHRpbV9wZXJpb2QgPSAxOwogCiAJYnNzLT5zdXBwX3JhdGVzX2xlbiA9IDA7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCmluZGV4IGVlYzAwMTQuLjU5NGYyMzEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCisrKyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCkBAIC0zNjEsNiArMzYxLDcgQEAKIAkJCQkJICAgICB1LmFwKTsKIAogCQlkcnZfc3RhX25vdGlmeShsb2NhbCwgJnNkYXRhLT52aWYsIFNUQV9OT1RJRllfQURELCAmc3RhLT5zdGEpOworCQlzZGF0YSA9IHN0YS0+c2RhdGE7CiAJfQogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKQEAgLTQ5Niw2ICs0OTcsNyBAQAogCiAJCWRydl9zdGFfbm90aWZ5KGxvY2FsLCAmc2RhdGEtPnZpZiwgU1RBX05PVElGWV9SRU1PVkUsCiAJCQkgICAgICAgJigqc3RhKS0+c3RhKTsKKwkJc2RhdGEgPSAoKnN0YSktPnNkYXRhOwogCX0KIAogCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKSB7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHguYyBiL25ldC9tYWM4MDIxMS90eC5jCmluZGV4IDUxNDNkMjAuLmVhYTQxMTggMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90eC5jCisrKyBiL25ldC9tYWM4MDIxMS90eC5jCkBAIC0zNjcsNyArMzY3LDEwIEBACiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4LT5za2ItPmRhdGE7CiAJdTMyIHN0YWZsYWdzOwogCi0JaWYgKHVubGlrZWx5KCFzdGEgfHwgaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoaGRyLT5mcmFtZV9jb250cm9sKSkpCisJaWYgKHVubGlrZWx5KCFzdGEgfHwgaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoaGRyLT5mcmFtZV9jb250cm9sKQorCQkJfHwgaWVlZTgwMjExX2lzX2F1dGgoaGRyLT5mcmFtZV9jb250cm9sKQorCQkJfHwgaWVlZTgwMjExX2lzX2Fzc29jX3Jlc3AoaGRyLT5mcmFtZV9jb250cm9sKQorCQkJfHwgaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVzcChoZHItPmZyYW1lX2NvbnRyb2wpKSkKIAkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCiAJc3RhZmxhZ3MgPSBnZXRfc3RhX2ZsYWdzKHN0YSk7CkBAIC0xNDQyLDcgKzE0NDUsNyBAQAogCQkJCWlmICh0bXBfc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKHRtcF9zZGF0YS0+ZGV2LT5kZXZfYWRkciwKLQkJCQkJCSAgICAgICBoZHItPmFkZHIyKSkgeworCQkJCQkJICAgICAgIGhkci0+YWRkcjIpID09IDApIHsKIAkJCQkJZGV2X2hvbGQodG1wX3NkYXRhLT5kZXYpOwogCQkJCQlkZXZfcHV0KHNkYXRhLT5kZXYpOwogCQkJCQlzZGF0YSA9IHRtcF9zZGF0YTsKQEAgLTE3MDEsNyArMTcwNCw4IEBACiAJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHIuYWRkcjEpKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHIuYWRkcjEpOwotCQlpZiAoc3RhKQorCQkvKiBYWFg6IGluIHRoZSBmdXR1cmUsIHVzZSBzZGF0YSB0byBsb29rIHVwIHRoZSBzdGEgKi8KKwkJaWYgKHN0YSAmJiBzdGEtPnNkYXRhID09IHNkYXRhKQogCQkJc3RhX2ZsYWdzID0gZ2V0X3N0YV9mbGFncyhzdGEpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdXRpbC5jIGIvbmV0L21hYzgwMjExL3V0aWwuYwppbmRleCBkZDY1NjQzLi5hZWI2NWIzIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdXRpbC5jCisrKyBiL25ldC9tYWM4MDIxMS91dGlsLmMKQEAgLTMzOSw3ICszMzksNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAogCWlmIChXQVJOX09OKCFpbmZvLT5jb250cm9sLnZpZikpIHsKLQkJa2ZyZWUoc2tiKTsKKwkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM2Nyw3ICszNjcsNyBAQAogCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAKIAkJaWYgKFdBUk5fT04oIWluZm8tPmNvbnRyb2wudmlmKSkgewotCQkJa2ZyZWUoc2tiKTsKKwkJCWtmcmVlX3NrYihza2IpOwogCQkJY29udGludWU7CiAJCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jCmluZGV4IGZiYTI4OTIuLjQ0NmU5YmQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKQEAgLTE0OTYsMTQgKzE0OTYsMTQgQEAKIAogCiBzdGF0aWMgaW50Ci1wcm9jX2RvX2RlZmVuc2VfbW9kZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICogZmlscCwKK3Byb2NfZG9fZGVmZW5zZV9tb2RlKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgKnZhbHAgPSB0YWJsZS0+ZGF0YTsKIAlpbnQgdmFsID0gKnZhbHA7CiAJaW50IHJjOwogCi0JcmMgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyYyA9IHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWlmICh3cml0ZSAmJiAoKnZhbHAgIT0gdmFsKSkgewogCQlpZiAoKCp2YWxwIDwgMCkgfHwgKCp2YWxwID4gMykpIHsKIAkJCS8qIFJlc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKi8KQEAgLTE1MTcsNyArMTUxNyw3IEBACiAKIAogc3RhdGljIGludAotcHJvY19kb19zeW5jX3RocmVzaG9sZChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorcHJvY19kb19zeW5jX3RocmVzaG9sZChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgKnZhbHAgPSB0YWJsZS0+ZGF0YTsKQEAgLTE1MjcsNyArMTUyNyw3IEBACiAJLyogYmFja3VwIHRoZSB2YWx1ZSBmaXJzdCAqLwogCW1lbWNweSh2YWwsIHZhbHAsIHNpemVvZih2YWwpKTsKIAotCXJjID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmMgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAod3JpdGUgJiYgKHZhbHBbMF0gPCAwIHx8IHZhbHBbMV0gPCAwIHx8IHZhbHBbMF0gPj0gdmFscFsxXSkpIHsKIAkJLyogUmVzdG9yZSB0aGUgY29ycmVjdCB2YWx1ZSAqLwogCQltZW1jcHkodmFscCwgdmFsLCBzaXplb2YodmFsKSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggN2M5ZWMzZC4uY2E2ZTY4ZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmMKaW5kZXggNGU2MjAzMC4uYzkzNDk0ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2xvZy5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5mX2xvZ19zeXNjdGxfdGFibGVbTkZQUk9UT19OVU1QUk9UTysxXTsKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqbmZfbG9nX2Rpcl9oZWFkZXI7CiAKLXN0YXRpYyBpbnQgbmZfbG9nX3Byb2NfZG9zdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgbmZfbG9nX3Byb2NfZG9zdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcjsKQEAgLTI2MCw3ICsyNjAsNyBAQAogCQkJdGFibGUtPmRhdGEgPSAiTk9ORSI7CiAJCWVsc2UKIAkJCXRhYmxlLT5kYXRhID0gbG9nZ2VyLT5uYW1lOwotCQlyID0gcHJvY19kb3N0cmluZyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCXIgPSBwcm9jX2Rvc3RyaW5nKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAkJbXV0ZXhfdW5sb2NrKCZuZl9sb2dfbXV0ZXgpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9zb2Nrb3B0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX3NvY2tvcHQuYwppbmRleCA4YWI4MjlmLi5mMDQyYWU1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX3NvY2tvcHQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX3NvY2tvcHQuYwpAQCAtMTEzLDcgKzExMyw3IEBACiB9CiAKIGludCBuZl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgdV9pbnQ4X3QgcGYsIGludCB2YWwsIGNoYXIgX191c2VyICpvcHQsCi0JCSAgaW50IGxlbikKKwkJICB1bnNpZ25lZCBpbnQgbGVuKQogewogCXJldHVybiBuZl9zb2Nrb3B0KHNrLCBwZiwgdmFsLCBvcHQsICZsZW4sIDApOwogfQpAQCAtMTU0LDcgKzE1NCw3IEBACiB9CiAKIGludCBjb21wYXRfbmZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIHVfaW50OF90IHBmLAotCQlpbnQgdmFsLCBjaGFyIF9fdXNlciAqb3B0LCBpbnQgbGVuKQorCQlpbnQgdmFsLCBjaGFyIF9fdXNlciAqb3B0LCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXJldHVybiBjb21wYXRfbmZfc29ja29wdChzaywgcGYsIHZhbCwgb3B0LCAmbGVuLCAwKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwppbmRleCA1NTE4MGI5Li4xOWU5ODAwIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC0xMTUwLDcgKzExNTAsNyBAQAogfQogCiBzdGF0aWMgaW50IG5ldGxpbmtfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKQEAgLTE2MDksNiArMTYwOSwxNiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3ZvaWQgX19uZXRsaW5rX2NsZWFyX211bHRpY2FzdF91c2VycyhzdHJ1Y3Qgc29jayAqa3NrLCB1bnNpZ25lZCBpbnQgZ3JvdXApCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBuZXRsaW5rX3RhYmxlICp0YmwgPSAmbmxfdGFibGVba3NrLT5za19wcm90b2NvbF07CisKKwlza19mb3JfZWFjaF9ib3VuZChzaywgbm9kZSwgJnRibC0+bWNfbGlzdCkKKwkJbmV0bGlua191cGRhdGVfc29ja2V0X21jKG5sa19zayhzayksIGdyb3VwLCAwKTsKK30KKwogLyoqCiAgKiBuZXRsaW5rX2NsZWFyX211bHRpY2FzdF91c2VycyAtIGtpY2sgb2ZmIG11bHRpY2FzdCBsaXN0ZW5lcnMKICAqCkBAIC0xNjE5LDE1ICsxNjI5LDggQEAKICAqLwogdm9pZCBuZXRsaW5rX2NsZWFyX211bHRpY2FzdF91c2VycyhzdHJ1Y3Qgc29jayAqa3NrLCB1bnNpZ25lZCBpbnQgZ3JvdXApCiB7Ci0Jc3RydWN0IHNvY2sgKnNrOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXN0cnVjdCBuZXRsaW5rX3RhYmxlICp0YmwgPSAmbmxfdGFibGVba3NrLT5za19wcm90b2NvbF07Ci0KIAluZXRsaW5rX3RhYmxlX2dyYWIoKTsKLQotCXNrX2Zvcl9lYWNoX2JvdW5kKHNrLCBub2RlLCAmdGJsLT5tY19saXN0KQotCQluZXRsaW5rX3VwZGF0ZV9zb2NrZXRfbWMobmxrX3NrKHNrKSwgZ3JvdXAsIDApOwotCisJX19uZXRsaW5rX2NsZWFyX211bHRpY2FzdF91c2Vycyhrc2ssIGdyb3VwKTsKIAluZXRsaW5rX3RhYmxlX3VuZ3JhYigpOwogfQogCkBAIC0xNzg1LDcgKzE3ODgsNyBAQAogCX0KIAogCXJlcCA9IF9fbmxtc2dfcHV0KHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsCi0JCQkgIE5MTVNHX0VSUk9SLCBzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSwgMCk7CisJCQkgIE5MTVNHX0VSUk9SLCBwYXlsb2FkLCAwKTsKIAllcnJtc2cgPSBubG1zZ19kYXRhKHJlcCk7CiAJZXJybXNnLT5lcnJvciA9IGVycjsKIAltZW1jcHkoJmVycm1zZy0+bXNnLCBubGgsIGVyciA/IG5saC0+bmxtc2dfbGVuIDogc2l6ZW9mKCpubGgpKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jIGIvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKaW5kZXggNTY2OTQxZS4uNDRmZjNmMyAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKQEAgLTIyMCwxMCArMjIwLDEyIEBACiAJc3RydWN0IG5ldCAqbmV0OwogCUJVR19PTihncnAtPmZhbWlseSAhPSBmYW1pbHkpOwogCisJbmV0bGlua190YWJsZV9ncmFiKCk7CiAJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX25ldF9yY3UobmV0KQotCQluZXRsaW5rX2NsZWFyX211bHRpY2FzdF91c2VycyhuZXQtPmdlbmxfc29jaywgZ3JwLT5pZCk7CisJCV9fbmV0bGlua19jbGVhcl9tdWx0aWNhc3RfdXNlcnMobmV0LT5nZW5sX3NvY2ssIGdycC0+aWQpOwogCXJjdV9yZWFkX3VubG9jaygpOworCW5ldGxpbmtfdGFibGVfdW5ncmFiKCk7CiAKIAljbGVhcl9iaXQoZ3JwLT5pZCwgbWNfZ3JvdXBzKTsKIAlsaXN0X2RlbCgmZ3JwLT5saXN0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vYWZfbmV0cm9tLmMgYi9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCmluZGV4IGNlMWEzNGIuLjdhODM0OTUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKKysrIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwpAQCAtMzAxLDcgKzMwMSw3IEBACiAgKi8KIAogc3RhdGljIGludCBucl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwljaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IGQzZDUyYzYuLmYyZDExNmEgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtOTgyLDEwICs5ODIsNyBAQAogCQlnb3RvIG91dF9wdXQ7CiAKIAlzaXplX21heCA9IHBvLT50eF9yaW5nLmZyYW1lX3NpemUKLQkJLSBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbykKLQkJLSBwby0+dHBfaGRybGVuCi0JCS0gTExfQUxMT0NBVEVEX1NQQUNFKGRldikKLQkJLSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKTsKKwkJLSAocG8tPnRwX2hkcmxlbiAtIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpKTsKIAogCWlmIChzaXplX21heCA+IGRldi0+bXR1ICsgcmVzZXJ2ZSkKIAkJc2l6ZV9tYXggPSBkZXYtPm10dSArIHJlc2VydmU7CkBAIC0xNzAxLDcgKzE2OTgsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1wYWNrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorcGFja2V0X3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKQEAgLTIwODQsNyArMjA4MSw3IEBACiAJCWF0b21pY19kZWMoJnBrdF9zayhzayktPm1hcHBlZCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgcGFja2V0X21tYXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBwYWNrZXRfbW1hcF9vcHMgPSB7CiAJLm9wZW4JPQlwYWNrZXRfbW1fb3BlbiwKIAkuY2xvc2UJPQlwYWNrZXRfbW1fY2xvc2UsCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L3Bob25ldC9hZl9waG9uZXQuYyBiL25ldC9waG9uZXQvYWZfcGhvbmV0LmMKaW5kZXggYTY2MmU2Mi4uZjYwYzBjMiAxMDA2NDQKLS0tIGEvbmV0L3Bob25ldC9hZl9waG9uZXQuYworKysgYi9uZXQvcGhvbmV0L2FmX3Bob25ldC5jCkBAIC0xNjgsNiArMTY4LDEyIEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKKwkvKiBCcm9hZGNhc3Qgc2VuZGluZyBpcyBub3QgaW1wbGVtZW50ZWQgKi8KKwlpZiAocG5fYWRkcihkc3QpID09IFBOQUREUl9CUk9BRENBU1QpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZHJvcDsKKwl9CisKIAlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCVdBUk5fT04oc2tiX2hlYWRyb29tKHNrYikgJiAxKTsgLyogSFcgYXNzdW1lcyB3b3JkIGFsaWdubWVudCAqLwogCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBwaG9uZXRoZHIpKTsKZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvcGVwLmMgYi9uZXQvcGhvbmV0L3BlcC5jCmluZGV4IGI4MjUyZDIuLjVmMzJkMjEgMTAwNjQ0Ci0tLSBhL25ldC9waG9uZXQvcGVwLmMKKysrIGIvbmV0L3Bob25ldC9wZXAuYwpAQCAtNzQyLDcgKzc0Miw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcGVwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3QgcGVwX3NvY2sgKnBuID0gcGVwX3NrKHNrKTsKIAlpbnQgdmFsID0gMCwgZXJyID0gMDsKZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvc29ja2V0LmMgYi9uZXQvcGhvbmV0L3NvY2tldC5jCmluZGV4IDdhNGVlMzkuLmFhNWI1YTkgMTAwNjQ0Ci0tLSBhL25ldC9waG9uZXQvc29ja2V0LmMKKysrIGIvbmV0L3Bob25ldC9zb2NrZXQuYwpAQCAtMTEzLDYgKzExMyw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBuX3NvY2tfdW5oYXNoKTsKIAorc3RhdGljIERFRklORV9NVVRFWChwb3J0X211dGV4KTsKKwogc3RhdGljIGludCBwbl9zb2NrZXRfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CkBAIC0xNDAsOSArMTQyLDExIEBACiAJCWVyciA9IC1FSU5WQUw7IC8qIGF0dGVtcHQgdG8gcmViaW5kICovCiAJCWdvdG8gb3V0OwogCX0KKwlXQVJOX09OKHNrX2hhc2hlZChzaykpOworCW11dGV4X2xvY2soJnBvcnRfbXV0ZXgpOwogCWVyciA9IHNrLT5za19wcm90LT5nZXRfcG9ydChzaywgcG5fcG9ydChoYW5kbGUpKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcG9ydDsKIAogCS8qIGdldF9wb3J0KCkgc2V0cyB0aGUgcG9ydCwgYmluZCgpIHNldHMgdGhlIGFkZHJlc3MgaWYgYXBwbGljYWJsZSAqLwogCXBuLT5zb2JqZWN0ID0gcG5fb2JqZWN0KHNhZGRyLCBwbl9wb3J0KHBuLT5zb2JqZWN0KSk7CkBAIC0xNTAsNiArMTU0LDggQEAKIAogCS8qIEVuYWJsZSBSWCBvbiB0aGUgc29ja2V0ICovCiAJc2stPnNrX3Byb3QtPmhhc2goc2spOworb3V0X3BvcnQ6CisJbXV0ZXhfdW5sb2NrKCZwb3J0X211dGV4KTsKIG91dDoKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CkBAIC0zNTcsOCArMzYzLDYgQEAKIH07CiBFWFBPUlRfU1lNQk9MKHBob25ldF9zdHJlYW1fb3BzKTsKIAotc3RhdGljIERFRklORV9NVVRFWChwb3J0X211dGV4KTsKLQogLyogYWxsb2NhdGUgcG9ydCBmb3IgYSBzb2NrZXQgKi8KIGludCBwbl9zb2NrX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc3BvcnQpCiB7CkBAIC0zNzAsOSArMzc0LDcgQEAKIAogCW1lbXNldCgmdHJ5X3NhLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3BuKSk7CiAJdHJ5X3NhLnNwbl9mYW1pbHkgPSBBRl9QSE9ORVQ7Ci0KLQltdXRleF9sb2NrKCZwb3J0X211dGV4KTsKLQorCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmcG9ydF9tdXRleCkpOwogCWlmICghc3BvcnQpIHsKIAkJLyogc2VhcmNoIGZyZWUgcG9ydCAqLwogCQlpbnQgcG9ydCwgcG1pbiwgcG1heDsKQEAgLTQwMSwxMyArNDAzLDEwIEBACiAJCWVsc2UKIAkJCXNvY2tfcHV0KHRtcHNrKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwb3J0X211dGV4KTsKLQogCS8qIHRoZSBwb3J0IG11c3QgYmUgaW4gdXNlIGFscmVhZHkgKi8KIAlyZXR1cm4gLUVBRERSSU5VU0U7CiAKIGZvdW5kOgotCW11dGV4X3VubG9jaygmcG9ydF9tdXRleCk7CiAJcG4tPnNvYmplY3QgPSBwbl9vYmplY3QocG5fYWRkcihwbi0+c29iamVjdCksIHNwb3J0KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvc3lzY3RsLmMgYi9uZXQvcGhvbmV0L3N5c2N0bC5jCmluZGV4IDdiNTc0OWUuLjIyMjBmMzMgMTAwNjQ0Ci0tLSBhL25ldC9waG9uZXQvc3lzY3RsLmMKKysrIGIvbmV0L3Bob25ldC9zeXNjdGwuYwpAQCAtNTYsNyArNTYsNyBAQAogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJmxvY2FsX3BvcnRfcmFuZ2VfbG9jaywgc2VxKSk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19sb2NhbF9wb3J0X3JhbmdlKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitzdGF0aWMgaW50IHByb2NfbG9jYWxfcG9ydF9yYW5nZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCQlzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTcwLDcgKzcwLDcgQEAKIAkJLmV4dHJhMiA9ICZsb2NhbF9wb3J0X3JhbmdlX21heCwKIAl9OwogCi0JcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgoJnRtcCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgoJnRtcCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAlpZiAod3JpdGUgJiYgcmV0ID09IDApIHsKIAkJaWYgKHJhbmdlWzFdIDwgcmFuZ2VbMF0pCmRpZmYgLS1naXQgYS9uZXQvcmRzL2FmX3Jkcy5jIGIvbmV0L3Jkcy9hZl9yZHMuYwppbmRleCA2YjU4YWVmLi45OGUwNTM4IDEwMDY0NAotLS0gYS9uZXQvcmRzL2FmX3Jkcy5jCisrKyBiL25ldC9yZHMvYWZfcmRzLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogfQogCiBzdGF0aWMgaW50IHJkc19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHJkc19zb2NrICpycyA9IHJkc19za190b19ycyhzb2NrLT5zayk7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL25ldC9yZmtpbGwvY29yZS5jIGIvbmV0L3Jma2lsbC9jb3JlLmMKaW5kZXggZGJlYWYyOS4uYmEyZWZiOSAxMDA2NDQKLS0tIGEvbmV0L3Jma2lsbC9jb3JlLmMKKysrIGIvbmV0L3Jma2lsbC9jb3JlLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KZGlmZiAtLWdpdCBhL25ldC9yb3NlL2FmX3Jvc2UuYyBiL25ldC9yb3NlL2FmX3Jvc2UuYwppbmRleCAxZTE2NmM5Li41MDJjY2U3IDEwMDY0NAotLS0gYS9uZXQvcm9zZS9hZl9yb3NlLmMKKysrIGIvbmV0L3Jvc2UvYWZfcm9zZS5jCkBAIC0zNzAsNyArMzcwLDcgQEAKICAqLwogCiBzdGF0aWMgaW50IHJvc2Vfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYWZfcnhycGMuYyBiL25ldC9yeHJwYy9hZl9yeHJwYy5jCmluZGV4IGJmZTQ5M2UuLmE4NmFmY2UgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hZl9yeHJwYy5jCisrKyBiL25ldC9yeHJwYy9hZl9yeHJwYy5jCkBAIC01MDcsNyArNTA3LDcgQEAKICAqIHNldCBSeFJQQyBzb2NrZXQgb3B0aW9ucwogICovCiBzdGF0aWMgaW50IHJ4cnBjX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc29jay0+c2spOwogCXVuc2lnbmVkIG1pbl9zZWNfbGV2ZWw7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3BlZGl0LmMgYi9uZXQvc2NoZWQvYWN0X3BlZGl0LmMKaW5kZXggOTZjMGVkMS4uNmIwMzU5YSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9wZWRpdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfcGVkaXQuYwpAQCAtMzQsNyArMzQsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHBlZGl0X3BvbGljeVtUQ0FfUEVESVRfTUFYICsgMV0gPSB7Ci0JW1RDQV9QRURJVF9QQVJNU10JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjZl9wZWRpdCkgfSwKKwlbVENBX1BFRElUX1BBUk1TXQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgdGNfcGVkaXQpIH0sCiB9OwogCiBzdGF0aWMgaW50IHRjZl9wZWRpdF9pbml0KHN0cnVjdCBubGF0dHIgKm5sYSwgc3RydWN0IG5sYXR0ciAqZXN0LApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19hcGkuYyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKaW5kZXggNmE1MzY5NC4uN2NmNmMwZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19hcGkuYworKysgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCkBAIC0zNTAsNyArMzUwLDcgQEAKIAl0Y20gPSBOTE1TR19EQVRBKG5saCk7CiAJdGNtLT50Y21fZmFtaWx5ID0gQUZfVU5TUEVDOwogCXRjbS0+dGNtX19wYWQxID0gMDsKLQl0Y20tPnRjbV9fcGFkMSA9IDA7CisJdGNtLT50Y21fX3BhZDIgPSAwOwogCXRjbS0+dGNtX2lmaW5kZXggPSBxZGlzY19kZXYodHAtPnEpLT5pZmluZGV4OwogCXRjbS0+dGNtX3BhcmVudCA9IHRwLT5jbGFzc2lkOwogCXRjbS0+dGNtX2luZm8gPSBUQ19IX01BS0UodHAtPnByaW8sIHRwLT5wcm90b2NvbCk7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IDg5YWYzN2EuLmM4ZDA1NzUgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC0yMDI3LDcgKzIwMjcsOCBAQAogICogaW5zdGVhZCBhIGVycm9yIHdpbGwgYmUgaW5kaWNhdGVkIHRvIHRoZSB1c2VyLgogICovCiBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kaXNhYmxlX2ZyYWdtZW50cyhzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpbnQgdmFsOwogCkBAIC0yMDQzLDcgKzIwNDQsNyBAQAogfQogCiBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ldmVudHMoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLAotCQkJCQlpbnQgb3B0bGVuKQorCQkJCSAgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpZiAob3B0bGVuID4gc2l6ZW9mKHN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjA2NCw3ICsyMDY1LDcgQEAKICAqIGFzc29jaWF0aW9uIGlzIGNsb3NlZC4KICAqLwogc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXV0b2Nsb3NlKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwKLQkJCQkJICAgIGludCBvcHRsZW4pCisJCQkJICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CiAKQEAgLTIzMTgsNyArMjMxOSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3BlZXJfYWRkcl9wYXJhbXMoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzY3RwX3BhZGRycGFyYW1zICBwYXJhbXM7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICAgKnRyYW5zID0gTlVMTDsKQEAgLTI0MzAsNyArMjQzMiw3IEBACiAgKi8KIAogc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfZGVsYXllZF9hY2soc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc2N0cF9zYWNrX2luZm8gICAgcGFyYW1zOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAgICp0cmFucyA9IE5VTEw7CkBAIC0yNTQ2LDcgKzI1NDgsNyBAQAogICogYnkgdGhlIGNoYW5nZSkuICBXaXRoIFRDUC1zdHlsZSBzb2NrZXRzLCB0aGlzIG9wdGlvbiBpcyBpbmhlcml0ZWQgYnkKICAqIHNvY2tldHMgZGVyaXZlZCBmcm9tIGEgbGlzdGVuZXIgc29ja2V0LgogICovCi1zdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9pbml0bXNnKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2luaXRtc2coc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzY3RwX2luaXRtc2cgc2luaXQ7CiAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKQEAgLTI1ODMsNyArMjU4NSw4IEBACiAgKiAgIHRvIHRoaXMgY2FsbCBpZiB0aGUgY2FsbGVyIGlzIHVzaW5nIHRoZSBVRFAgbW9kZWwuCiAgKi8KIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2RlZmF1bHRfc2VuZF9wYXJhbShzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gaW5mbzsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKQEAgLTI2MjIsNyArMjYyNSw3IEBACiAgKiBhc3NvY2lhdGlvbiBwZWVyJ3MgYWRkcmVzc2VzLgogICovCiBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wcmltYXJ5X2FkZHIoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLAotCQkJCQlpbnQgb3B0bGVuKQorCQkJCQl1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzY3RwX3ByaW0gcHJpbTsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zOwpAQCAtMjY1MSw3ICsyNjU0LDcgQEAKICAqICBpbnRlZ2VyIGJvb2xlYW4gZmxhZy4KICAqLwogc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfbm9kZWxheShzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCi0JCQkJCWludCBvcHRsZW4pCisJCQkJICAgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpbnQgdmFsOwogCkBAIC0yNjc2LDcgKzI2NzksOCBAQAogICogYmUgY2hhbmdlZC4KICAqCiAgKi8KLXN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3J0b2luZm8oc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKSB7CitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ydG9pbmZvKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKK3sKIAlzdHJ1Y3Qgc2N0cF9ydG9pbmZvIHJ0b2luZm87CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAKQEAgLTI3MjgsNyArMjczMiw3IEBACiAgKiBTZWUgW1NDVFBdIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKICAqLwotc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXNzb2NpbmZvKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Fzc29jaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAKIAlzdHJ1Y3Qgc2N0cF9hc3NvY3BhcmFtcyBhc3NvY3BhcmFtczsKQEAgLTI4MDAsNyArMjgwNCw3IEBACiAgKiBhZGRyZXNzZXMgYW5kIGEgdXNlciB3aWxsIHJlY2VpdmUgYm90aCBQRl9JTkVUNiBhbmQgUEZfSU5FVCB0eXBlCiAgKiBhZGRyZXNzZXMgb24gdGhlIHNvY2tldC4KICAqLwotc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfbWFwcGVkdjQoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfbWFwcGVkdjQoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCWludCB2YWw7CiAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKQEAgLTI4NDQsNyArMjg0OCw3IEBACiAgKiAgICBjaGFuZ2VkIChlZmZlY3RpbmcgZnV0dXJlIGFzc29jaWF0aW9ucyBvbmx5KS4KICAqIGFzc29jX3ZhbHVlOiAgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgaW4gYnl0ZXMuCiAgKi8KLXN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X21heHNlZyhzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhzZWcoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBhcmFtczsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKQEAgLTI4OTksNyArMjkwMyw3IEBACiAgKiAgIHNldCBwcmltYXJ5IHJlcXVlc3Q6CiAgKi8KIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3BlZXJfcHJpbWFyeV9hZGRyKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwKLQkJCQkJICAgICBpbnQgb3B0bGVuKQorCQkJCQkgICAgIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNjdHBfc29jawkqc3A7CiAJc3RydWN0IHNjdHBfZW5kcG9pbnQJKmVwOwpAQCAtMjk1MCw3ICsyOTU0LDcgQEAKIH0KIAogc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYWRhcHRhdGlvbl9sYXllcihzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCi0JCQkJCSAgaW50IG9wdGxlbikKKwkJCQkJICAgIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNjdHBfc2V0YWRhcHRhdGlvbiBhZGFwdGF0aW9uOwogCkBAIC0yOTc5LDcgKzI5ODMsNyBAQAogICogc2F2ZWQgd2l0aCBvdXRib3VuZCBtZXNzYWdlcy4KICAqLwogc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfY29udGV4dChzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCi0JCQkJICAgaW50IG9wdGxlbikKKwkJCQkgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBhcmFtczsKIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcDsKQEAgLTMwMzAsNyArMzAzNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2ZyYWdtZW50X2ludGVybGVhdmUoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwKLQkJCQkJICAgICAgIGludCBvcHRsZW4pCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCWludCB2YWw7CiAKQEAgLTMwNjMsNyArMzA2Nyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3BhcnRpYWxfZGVsaXZlcnlfcG9pbnQoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLAotCQkJCQkJICBpbnQgb3B0bGVuKQorCQkJCQkJICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXUzMiB2YWw7CiAKQEAgLTMwOTYsNyArMzEwMCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X21heGJ1cnN0KHN0cnVjdCBzb2NrICpzaywKIAkJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwKLQkJCQkgICAgaW50IG9wdGxlbikKKwkJCQkgICAgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY192YWx1ZSBwYXJhbXM7CiAJc3RydWN0IHNjdHBfc29jayAqc3A7CkBAIC0zMTQwLDggKzMxNDQsOCBAQAogICogd2lsbCBvbmx5IGVmZmVjdCBmdXR1cmUgYXNzb2NpYXRpb25zIG9uIHRoZSBzb2NrZXQuCiAgKi8KIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2F1dGhfY2h1bmsoc3RydWN0IHNvY2sgKnNrLAotCQkJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAotCQkJCSAgICBpbnQgb3B0bGVuKQorCQkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc2N0cF9hdXRoY2h1bmsgdmFsOwogCkBAIC0zMTcyLDggKzMxNzYsOCBAQAogICogZW5kcG9pbnQgcmVxdWlyZXMgdGhlIHBlZXIgdG8gdXNlLgogICovCiBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9obWFjX2lkZW50KHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwKLQkJCQkgICAgaW50IG9wdGxlbikKKwkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNjdHBfaG1hY2FsZ28gKmhtYWNzOwogCXUzMiBpZGVudHM7CkBAIC0zMjE1LDcgKzMyMTksNyBAQAogICovCiBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hdXRoX2tleShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsCi0JCQkJICAgIGludCBvcHRsZW4pCisJCQkJICAgIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNjdHBfYXV0aGtleSAqYXV0aGtleTsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKQEAgLTMyNjAsOCArMzI2NCw4IEBACiAgKiB0aGUgYXNzb2NpYXRpb24gc2hhcmVkIGtleS4KICAqLwogc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYWN0aXZlX2tleShzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCWNoYXIgX191c2VyICpvcHR2YWwsCi0JCQkJCWludCBvcHRsZW4pCisJCQkJICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzY3RwX2F1dGhrZXlpZCB2YWw7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CkBAIC0zMjg4LDggKzMyOTIsOCBAQAogICogVGhpcyBzZXQgb3B0aW9uIHdpbGwgZGVsZXRlIGEgc2hhcmVkIHNlY3JldCBrZXkgZnJvbSB1c2UuCiAgKi8KIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2RlbF9rZXkoc3RydWN0IHNvY2sgKnNrLAotCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLAotCQkJCQlpbnQgb3B0bGVuKQorCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJICAgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3Qgc2N0cF9hdXRoa2V5aWQgdmFsOwogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwpAQCAtMzMzMiw3ICszMzM2LDcgQEAKICAqICAgb3B0bGVuICAtIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuCiAgKi8KIFNDVFBfU1RBVElDIGludCBzY3RwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpbnQgcmV0dmFsID0gMDsKIApkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDQ5OTE3YTEuLjc1NjU1MzYgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTIwOTgsMTIgKzIwOTgsMTcgQEAKIAl1bnNpZ25lZCBsb25nIGFbNl07CiAJdW5zaWduZWQgbG9uZyBhMCwgYTE7CiAJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCiAJaWYgKGNhbGwgPCAxIHx8IGNhbGwgPiBTWVNfQUNDRVBUNCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlsZW4gPSBuYXJnc1tjYWxsXTsKKwlpZiAobGVuID4gc2l6ZW9mKGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIGNvcHlfZnJvbV91c2VyIHNob3VsZCBiZSBTTVAgc2FmZS4gKi8KLQlpZiAoY29weV9mcm9tX3VzZXIoYSwgYXJncywgbmFyZ3NbY2FsbF0pKQorCWlmIChjb3B5X2Zyb21fdXNlcihhLCBhcmdzLCBsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWF1ZGl0X3NvY2tldGNhbGwobmFyZ3NbY2FsbF0gLyBzaXplb2YodW5zaWduZWQgbG9uZyksIGEpOwpAQCAtMjM4Niw3ICsyMzkxLDcgQEAKIH0KIAogaW50IGtlcm5lbF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQljaGFyICpvcHR2YWwsIGludCBvcHRsZW4pCisJCQljaGFyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9udWxsLmMgYi9uZXQvc3VucnBjL2F1dGhfbnVsbC5jCmluZGV4IGM3MGRkN2YuLjFkYjYxOGYgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9udWxsLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX251bGwuYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAKICNpZmRlZiBSUENfREVCVUcKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvY2xudC5jIGIvbmV0L3N1bnJwYy9jbG50LmMKaW5kZXggYTQxN2Q1YS4uMzg4MjllMiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jbG50LmMKKysrIGIvbmV0L3N1bnJwYy9jbG50LmMKQEAgLTY0MCwxMCArNjQwLDExIEBACiAvKioKICAqIHJwY19ydW5fYmNfdGFzayAtIEFsbG9jYXRlIGEgbmV3IFJQQyB0YXNrIGZvciBiYWNrY2hhbm5lbCB1c2UsIHRoZW4gcnVuCiAgKiBycGNfZXhlY3V0ZSBhZ2FpbnN0IGl0Ci0gKiBAb3BzOiBSUEMgY2FsbCBvcHMKKyAqIEByZXE6IFJQQyByZXF1ZXN0CisgKiBAdGtfb3BzOiBSUEMgY2FsbCBvcHMKICAqLwogc3RydWN0IHJwY190YXNrICpycGNfcnVuX2JjX3Rhc2soc3RydWN0IHJwY19ycXN0ICpyZXEsCi0JCQkJCWNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgKnRrX29wcykKKwkJCQljb25zdCBzdHJ1Y3QgcnBjX2NhbGxfb3BzICp0a19vcHMpCiB7CiAJc3RydWN0IHJwY190YXNrICp0YXNrOwogCXN0cnVjdCB4ZHJfYnVmICp4YnVmcCA9ICZyZXEtPnJxX3NuZF9idWY7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY19waXBlLmMgYi9uZXQvc3VucnBjL3JwY19waXBlLmMKaW5kZXggODU4YTQ0My4uNDkyNzhmOCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCisrKyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwpAQCAtODYwLDcgKzg2MCw4IEBACiAKIC8qKgogICogcnBjX2NyZWF0ZV9jbGllbnRfZGlyIC0gQ3JlYXRlIGEgbmV3IHJwY19jbGllbnQgZGlyZWN0b3J5IGluIHJwY19waXBlZnMKLSAqIEBwYXRoOiBwYXRoIGZyb20gdGhlIHJwY19waXBlZnMgcm9vdCB0byB0aGUgbmV3IGRpcmVjdG9yeQorICogQGRlbnRyeTogZGVudHJ5IGZyb20gdGhlIHJwY19waXBlZnMgcm9vdCB0byB0aGUgbmV3IGRpcmVjdG9yeQorICogQG5hbWU6ICZzdHJ1Y3QgcXN0ciBmb3IgdGhlIG5hbWUKICAqIEBycGNfY2xpZW50OiBycGMgY2xpZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgZGlyZWN0b3J5CiAgKgogICogVGhpcyBjcmVhdGVzIGEgZGlyZWN0b3J5IGF0IHRoZSBnaXZlbiBAcGF0aCBhc3NvY2lhdGVkIHdpdGgKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKaW5kZXggY2NjNWU4My4uMWMyNDZhNCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCQlycXN0cC0+cnFfeHBydF9jdHh0ID0gTlVMTDsKIAogCQlkcHJpbnRrKCJzdmM6IHNlcnZpY2UgJXAsIHJlbGVhc2luZyBza2IgJXBcbiIsIHJxc3RwLCBza2IpOwotCQlza2JfZnJlZV9kYXRhZ3JhbShzdnNrLT5za19zaywgc2tiKTsKKwkJc2tiX2ZyZWVfZGF0YWdyYW1fbG9ja2VkKHN2c2stPnNrX3NrLCBza2IpOwogCX0KIH0KIApAQCAtNTc4LDcgKzU3OCw3IEBACiAJCQkJInN2YzogcmVjZWl2ZWQgdW5rbm93biBjb250cm9sIG1lc3NhZ2UgJWQvJWQ7ICIKIAkJCQkiZHJvcHBpbmcgUlBDIHJlcGx5IGRhdGFncmFtXG4iLAogCQkJCQljbWgtPmNtc2dfbGV2ZWwsIGNtaC0+Y21zZ190eXBlKTsKLQkJc2tiX2ZyZWVfZGF0YWdyYW0oc3Zzay0+c2tfc2ssIHNrYik7CisJCXNrYl9mcmVlX2RhdGFncmFtX2xvY2tlZChzdnNrLT5za19zaywgc2tiKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01ODgsMTggKzU4OCwxOCBAQAogCQlpZiAoY3N1bV9wYXJ0aWFsX2NvcHlfdG9feGRyKCZycXN0cC0+cnFfYXJnLCBza2IpKSB7CiAJCQlsb2NhbF9iaF9lbmFibGUoKTsKIAkJCS8qIGNoZWNrc3VtIGVycm9yICovCi0JCQlza2JfZnJlZV9kYXRhZ3JhbShzdnNrLT5za19zaywgc2tiKTsKKwkJCXNrYl9mcmVlX2RhdGFncmFtX2xvY2tlZChzdnNrLT5za19zaywgc2tiKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWxvY2FsX2JoX2VuYWJsZSgpOwotCQlza2JfZnJlZV9kYXRhZ3JhbShzdnNrLT5za19zaywgc2tiKTsKKwkJc2tiX2ZyZWVfZGF0YWdyYW1fbG9ja2VkKHN2c2stPnNrX3NrLCBza2IpOwogCX0gZWxzZSB7CiAJCS8qIHdlIGNhbiB1c2UgaXQgaW4tcGxhY2UgKi8KIAkJcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlID0gc2tiLT5kYXRhICsKIAkJCXNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAkJcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9sZW4gPSBsZW47CiAJCWlmIChza2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewotCQkJc2tiX2ZyZWVfZGF0YWdyYW0oc3Zzay0+c2tfc2ssIHNrYik7CisJCQlza2JfZnJlZV9kYXRhZ3JhbV9sb2NrZWQoc3Zzay0+c2tfc2ssIHNrYik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlycXN0cC0+cnFfeHBydF9jdHh0ID0gc2tiOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zeXNjdGwuYyBiL25ldC9zdW5ycGMvc3lzY3RsLmMKaW5kZXggNTIzMWY3YS4uNDJmOTc0OCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zeXNjdGwuYworKysgYi9uZXQvc3VucnBjL3N5c2N0bC5jCkBAIC01Niw3ICs1Niw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHByb2NfZG9feHBydChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGludCBwcm9jX2RvX3hwcnQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJY2hhciB0bXBidWZbMjU2XTsKQEAgLTcxLDcgKzcxLDcgQEAKIH0KIAogc3RhdGljIGludAotcHJvY19kb2RlYnVnKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbGUsCitwcm9jX2RvZGVidWcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWNoYXIJCXRtcGJ1ZlsyMF0sIGMsICpzOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYS5jIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYS5jCmluZGV4IDg3MTAxMTcuLjM1ZmI2OGIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWEuYworKysgYi9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hLmMKQEAgLTgwLDcgKzgwLDcgQEAKICAqIGN1cnJlbnQgdmFsdWUuCiAgKi8KIHN0YXRpYyBpbnQgcmVhZF9yZXNldF9zdGF0KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCSAgIHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCiAJCQkgICBsb2ZmX3QgKnBwb3MpCiB7CiAJYXRvbWljX3QgKnN0YXQgPSAoYXRvbWljX3QgKil0YWJsZS0+ZGF0YTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfdHJhbnNwb3J0LmMgYi9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3RyYW5zcG9ydC5jCmluZGV4IDBjZjVlOGMuLjNmYTU3NTEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfdHJhbnNwb3J0LmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV90cmFuc3BvcnQuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNfeHBydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9kZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcmRtYS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hX2NtLmg+CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKaW5kZXggYmVlNDE1NC4uMzdjNTQ3NSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0c29jay5jCisrKyBiL25ldC9zdW5ycGMveHBydHNvY2suYwpAQCAtNzczLDYgKzc3Myw3IEBACiAJZHByaW50aygiUlBDOiAgICAgICB4c19jbG9zZSB4cHJ0ICVwXG4iLCB4cHJ0KTsKIAogCXhzX3Jlc2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpOworCXhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgPSAwOwogCiAJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7CiAJY2xlYXJfYml0KFhQUlRfQ09OTkVDVElPTl9BQk9SVCwgJnhwcnQtPnN0YXRlKTsKQEAgLTEyNjQsNiArMTI2NSwxMiBAQAogCWlmICh4cHJ0LT5zaHV0ZG93bikKIAkJZ290byBvdXQ7CiAKKwkvKiBBbnkgZGF0YSBtZWFucyB3ZSBoYWQgYSB1c2VmdWwgY29udmVyc2F0aW9uLCBzbworCSAqIHRoZSB3ZSBkb24ndCBuZWVkIHRvIGRlbGF5IHRoZSBuZXh0IHJlY29ubmVjdAorCSAqLworCWlmICh4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0KQorCQl4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0ID0gMDsKKwogCS8qIFdlIHVzZSByZF9kZXNjIHRvIHBhc3Mgc3RydWN0IHhwcnQgdG8geHNfdGNwX2RhdGFfcmVjdiAqLwogCXJkX2Rlc2MuYXJnLmRhdGEgPSB4cHJ0OwogCWRvIHsKQEAgLTIwMzQsNiArMjA0MSw4IEBACiAJCQkJICAgJnRyYW5zcG9ydC0+Y29ubmVjdF93b3JrZXIsCiAJCQkJICAgeHBydC0+cmVlc3RhYmxpc2hfdGltZW91dCk7CiAJCXhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgPDw9IDE7CisJCWlmICh4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0IDwgWFNfVENQX0lOSVRfUkVFU1RfVE8pCisJCQl4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0ID0gWFNfVENQX0lOSVRfUkVFU1RfVE87CiAJCWlmICh4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0ID4gWFNfVENQX01BWF9SRUVTVF9UTykKIAkJCXhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgPSBYU19UQ1BfTUFYX1JFRVNUX1RPOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zb2NrZXQuYyBiL25ldC90aXBjL3NvY2tldC5jCmluZGV4IGU4MjU0ZTguLmU2ZDlhYmYgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3NvY2tldC5jCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC0xNjU4LDcgKzE2NTgsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkgICAgICBpbnQgbHZsLCBpbnQgb3B0LCBjaGFyIF9fdXNlciAqb3YsIGludCBvbCkKKwkJICAgICAgaW50IGx2bCwgaW50IG9wdCwgY2hhciBfX3VzZXIgKm92LCB1bnNpZ25lZCBpbnQgb2wpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQgPSB0aXBjX3NrX3BvcnQoc2spOwpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IDUxYWI0OTcuLmZjODIwY2QgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTEwNzQsNiArMTA3NCw4IEBACiAJZXJyID0gLUVDT05OUkVGVVNFRDsKIAlpZiAob3RoZXItPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pCiAJCWdvdG8gb3V0X3VubG9jazsKKwlpZiAob3RoZXItPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQorCQlnb3RvIG91dF91bmxvY2s7CiAKIAlpZiAodW5peF9yZWN2cV9mdWxsKG90aGVyKSkgewogCQllcnIgPSAtRUFHQUlOOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuYyBiL25ldC93aXJlbGVzcy9jb3JlLmMKaW5kZXggNDViMmJlMy4uYTU5NWY3MSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuYworKysgYi9uZXQvd2lyZWxlc3MvY29yZS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlICJubDgwMjExLmgiCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY29yZS5oIGIvbmV0L3dpcmVsZXNzL2NvcmUuaAppbmRleCAyYTMzZDhiLi42OGIzMjE5IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY29yZS5oCisrKyBiL25ldC93aXJlbGVzcy9jb3JlLmgKQEAgLTM1OCw2ICszNTgsNyBAQAogCQkJICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7CiAKIHZvaWQgY2ZnODAyMTFfY29ubl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIGNmZzgwMjExX3NtZV9mYWlsZWRfYXNzb2Moc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7CiBib29sIGNmZzgwMjExX3NtZV9mYWlsZWRfcmVhc3NvYyhzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKIAogLyogaW50ZXJuYWwgaGVscGVycyAqLwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL21sbWUuYyBiL25ldC93aXJlbGVzcy9tbG1lLmMKaW5kZXggNzlkMmVlYy4uMGE2YjdhMCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL21sbWUuYworKysgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCkBAIC02Miw2ICs2Miw3IEBACiAJdTggKmllID0gbWdtdC0+dS5hc3NvY19yZXNwLnZhcmlhYmxlOwogCWludCBpLCBpZW9mZnMgPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXNzb2NfcmVzcC52YXJpYWJsZSk7CiAJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqYnNzID0gTlVMTDsKKwlib29sIG5lZWRfY29ubmVjdF9yZXN1bHQgPSB0cnVlOwogCiAJd2Rldl9sb2NrKHdkZXYpOwogCkBAIC05NCw2ICs5NSwxNCBAQAogCQl9CiAKIAkJV0FSTl9PTighYnNzKTsKKwl9IGVsc2UgaWYgKHdkZXYtPmNvbm4pIHsKKwkJY2ZnODAyMTFfc21lX2ZhaWxlZF9hc3NvYyh3ZGV2KTsKKwkJbmVlZF9jb25uZWN0X3Jlc3VsdCA9IGZhbHNlOworCQkvKgorCQkgKiBkbyBub3QgY2FsbCBjb25uZWN0X3Jlc3VsdCgpIG5vdyBiZWNhdXNlIHRoZQorCQkgKiBzbWUgd2lsbCBzY2hlZHVsZSB3b3JrIHRoYXQgZG9lcyBpdCBsYXRlci4KKwkJICovCisJCWdvdG8gb3V0OwogCX0KIAogCWlmICghd2Rldi0+Y29ubiAmJiB3ZGV2LT5zbWVfc3RhdGUgPT0gQ0ZHODAyMTFfU01FX0lETEUpIHsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCmluZGV4IGVkZGFiMDkuLmNhM2M5MmEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtNDAyOSw3ICs0MDI5LDcgQEAKIAlyZGV2ID0gY2ZnODAyMTFfZ2V0X2Rldl9mcm9tX2luZm8oaW5mbyk7CiAJaWYgKElTX0VSUihyZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKHJkZXYpOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcnRubDsKIAl9CiAKIAluZXQgPSBnZXRfbmV0X25zX2J5X3BpZChwaWQpOwpAQCAtNDA0OSw2ICs0MDQ5LDcgQEAKIAlwdXRfbmV0KG5ldCk7CiAgb3V0OgogCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOworIG91dF9ydG5sOgogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zbWUuYyBiL25ldC93aXJlbGVzcy9zbWUuYwppbmRleCA3ZmFlN2VlLi45ZjBiMjgwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvc21lLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NtZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAJCUNGRzgwMjExX0NPTk5fQVVUSEVOVElDQVRJTkcsCiAJCUNGRzgwMjExX0NPTk5fQVNTT0NJQVRFX05FWFQsCiAJCUNGRzgwMjExX0NPTk5fQVNTT0NJQVRJTkcsCisJCUNGRzgwMjExX0NPTk5fREVBVVRIX0FTU09DX0ZBSUwsCiAJfSBzdGF0ZTsKIAl1OCBic3NpZFtFVEhfQUxFTl0sIHByZXZfYnNzaWRbRVRIX0FMRU5dOwogCXU4ICppZTsKQEAgLTE0OCw2ICsxNDksMTIgQEAKIAkJCQkJICAgICAgIE5VTEwsIDAsCiAJCQkJCSAgICAgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJCXJldHVybiBlcnI7CisJY2FzZSBDRkc4MDIxMV9DT05OX0RFQVVUSF9BU1NPQ19GQUlMOgorCQlfX2NmZzgwMjExX21sbWVfZGVhdXRoKHJkZXYsIHdkZXYtPm5ldGRldiwgcGFyYW1zLT5ic3NpZCwKKwkJCQkgICAgICAgTlVMTCwgMCwKKwkJCQkgICAgICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOworCQkvKiByZXR1cm4gYW4gZXJyb3Igc28gdGhhdCB3ZSBjYWxsIF9fY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQoKSAqLworCQlyZXR1cm4gLUVJTlZBTDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNTgsNiArMTY1LDcgQEAKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlLCBjb25uX3dvcmspOwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CisJdTggYnNzaWRfYnVmW0VUSF9BTEVOXSwgKmJzc2lkID0gTlVMTDsKIAogCXJ0bmxfbG9jaygpOwogCWNmZzgwMjExX2xvY2tfcmRldihyZGV2KTsKQEAgLTE3MywxMCArMTgxLDEzIEBACiAJCQl3ZGV2X3VubG9jayh3ZGV2KTsKIAkJCWNvbnRpbnVlOwogCQl9CisJCWlmICh3ZGV2LT5jb25uLT5wYXJhbXMuYnNzaWQpIHsKKwkJCW1lbWNweShic3NpZF9idWYsIHdkZXYtPmNvbm4tPnBhcmFtcy5ic3NpZCwgRVRIX0FMRU4pOworCQkJYnNzaWQgPSBic3NpZF9idWY7CisJCX0KIAkJaWYgKGNmZzgwMjExX2Nvbm5fZG9fd29yayh3ZGV2KSkKIAkJCV9fY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQoCi0JCQkJCXdkZXYtPm5ldGRldiwKLQkJCQkJd2Rldi0+Y29ubi0+cGFyYW1zLmJzc2lkLAorCQkJCQl3ZGV2LT5uZXRkZXYsIGJzc2lkLAogCQkJCQlOVUxMLCAwLCBOVUxMLCAwLAogCQkJCQlXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFLAogCQkJCQlmYWxzZSwgTlVMTCk7CkBAIC0zMzcsNiArMzQ4LDE1IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgY2ZnODAyMTFfc21lX2ZhaWxlZF9hc3NvYyhzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCisJd2Rldi0+Y29ubi0+c3RhdGUgPSBDRkc4MDIxMV9DT05OX0RFQVVUSF9BU1NPQ19GQUlMOworCXNjaGVkdWxlX3dvcmsoJnJkZXYtPmNvbm5fd29yayk7Cit9CisKIHZvaWQgX19jZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqYnNzaWQsCiAJCQkgICAgICAgY29uc3QgdTggKnJlcV9pZSwgc2l6ZV90IHJlcV9pZV9sZW4sCiAJCQkgICAgICAgY29uc3QgdTggKnJlc3BfaWUsIHNpemVfdCByZXNwX2llX2xlbiwKQEAgLTc2Miw5ICs3ODIsOCBAQAogCQl3ZGV2LT5jb25uLT5wYXJhbXMuc3NpZCA9IHdkZXYtPnNzaWQ7CiAJCXdkZXYtPmNvbm4tPnBhcmFtcy5zc2lkX2xlbiA9IGNvbm5lY3QtPnNzaWRfbGVuOwogCi0JCS8qIGRvbid0IGNhcmUgYWJvdXQgcmVzdWx0IC0tIGJ1dCBmaWxsIGJzc2lkICYgY2hhbm5lbCAqLwotCQlpZiAoIXdkZXYtPmNvbm4tPnBhcmFtcy5ic3NpZCB8fCAhd2Rldi0+Y29ubi0+cGFyYW1zLmNoYW5uZWwpCi0JCQlic3MgPSBjZmc4MDIxMV9nZXRfY29ubl9ic3Mod2Rldik7CisJCS8qIHNlZSBpZiB3ZSBoYXZlIHRoZSBic3MgYWxyZWFkeSAqLworCQlic3MgPSBjZmc4MDIxMV9nZXRfY29ubl9ic3Mod2Rldik7CiAKIAkJd2Rldi0+c21lX3N0YXRlID0gQ0ZHODAyMTFfU01FX0NPTk5FQ1RJTkc7CiAJCXdkZXYtPmNvbm5lY3Rfa2V5cyA9IGNvbm5rZXlzOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYwppbmRleCBkMTZjZDllLi41NjE1YTg4IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYwpAQCAtMjYsMTEgKzI2LDEyIEBACiAKIAl3ZGV2LT53ZXh0LmNvbm5lY3QuaWUgPSB3ZGV2LT53ZXh0LmllOwogCXdkZXYtPndleHQuY29ubmVjdC5pZV9sZW4gPSB3ZGV2LT53ZXh0LmllX2xlbjsKLQl3ZGV2LT53ZXh0LmNvbm5lY3QucHJpdmFjeSA9IHdkZXYtPndleHQuZGVmYXVsdF9rZXkgIT0gLTE7CiAKIAlpZiAod2Rldi0+d2V4dC5rZXlzKSB7CiAJCXdkZXYtPndleHQua2V5cy0+ZGVmID0gd2Rldi0+d2V4dC5kZWZhdWx0X2tleTsKIAkJd2Rldi0+d2V4dC5rZXlzLT5kZWZtZ210ID0gd2Rldi0+d2V4dC5kZWZhdWx0X21nbXRfa2V5OworCQlpZiAod2Rldi0+d2V4dC5kZWZhdWx0X2tleSAhPSAtMSkKKwkJCXdkZXYtPndleHQuY29ubmVjdC5wcml2YWN5ID0gdHJ1ZTsKIAl9CiAKIAlpZiAoIXdkZXYtPndleHQuY29ubmVjdC5zc2lkX2xlbikKQEAgLTIyOSw4ICsyMzAsNyBAQAogCQlkYXRhLT5mbGFncyA9IDE7CiAJCWRhdGEtPmxlbmd0aCA9IHdkZXYtPndleHQuY29ubmVjdC5zc2lkX2xlbjsKIAkJbWVtY3B5KHNzaWQsIHdkZXYtPndleHQuY29ubmVjdC5zc2lkLCBkYXRhLT5sZW5ndGgpOwotCX0gZWxzZQotCQlkYXRhLT5mbGFncyA9IDA7CisJfQogCXdkZXZfdW5sb2NrKHdkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0zMDYsOCArMzA2LDYgQEAKIAl3ZGV2X2xvY2sod2Rldik7CiAJaWYgKHdkZXYtPmN1cnJlbnRfYnNzKQogCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgd2Rldi0+Y3VycmVudF9ic3MtPnB1Yi5ic3NpZCwgRVRIX0FMRU4pOwotCWVsc2UgaWYgKHdkZXYtPndleHQuY29ubmVjdC5ic3NpZCkKLQkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsIHdkZXYtPndleHQuY29ubmVjdC5ic3NpZCwgRVRIX0FMRU4pOwogCWVsc2UKIAkJbWVtc2V0KGFwX2FkZHItPnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKIAl3ZGV2X3VubG9jayh3ZGV2KTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC5jCmluZGV4IDViNGEwY2UuLjYwZmU1NzcgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQuYwpAQCAtNDcwLDcgKzQ3MCw3IEBACiAvKgogICogR2V0IHN0YXRpc3RpY3Mgb3V0IG9mIHRoZSBkcml2ZXIKICAqLwotc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpnZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpnZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAkvKiBOZXcgbG9jYXRpb24gKi8KIAlpZiAoKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgIT0gTlVMTCkgJiYKQEAgLTc3MywxMCArNzczLDEzIEBACiAJCQllc3NpZF9jb21wYXQgPSAxOwogCQllbHNlIGlmIChJV19JU19TRVQoY21kKSAmJiAoaXdwLT5sZW5ndGggIT0gMCkpIHsKIAkJCWNoYXIgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwkJCXVuc2lnbmVkIGludCBsZW47CisJCQlsZW4gPSBpd3AtPmxlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplOwogCi0JCQllcnIgPSBjb3B5X2Zyb21fdXNlcihlc3NpZCwgaXdwLT5wb2ludGVyLAotCQkJCQkgICAgIGl3cC0+bGVuZ3RoICoKLQkJCQkJICAgICBkZXNjci0+dG9rZW5fc2l6ZSk7CisJCQlpZiAobGVuID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWVyciA9IGNvcHlfZnJvbV91c2VyKGVzc2lkLCBpd3AtPnBvaW50ZXIsIGxlbik7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiAtRUZBVUxUOwogCmRpZmYgLS1naXQgYS9uZXQveDI1L2FmX3gyNS5jIGIvbmV0L3gyNS9hZl94MjUuYwppbmRleCA1ZTZjMDcyLi43ZmE5YzdhIDEwMDY0NAotLS0gYS9uZXQveDI1L2FmX3gyNS5jCisrKyBiL25ldC94MjUvYWZfeDI1LmMKQEAgLTQwOSw3ICs0MDksNyBAQAogICovCiAKIHN0YXRpYyBpbnQgeDI1X3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKKwkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlpbnQgb3B0OwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXNhbXBsZS5jIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXNhbXBsZS5jCmluZGV4IDljZjgwYTEuLjI2ZmFiMzMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1zYW1wbGUuYworKysgYi9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtc2FtcGxlLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAlyZXR1cm4gLUVQRVJNOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtYXJrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1hcmtfb3BzID0gewogCS5vcGVuID0gbXlfb3BlbiwKIH07CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUgYi9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCmluZGV4IGMyOWJlOGYuLmM2N2U3M2UgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKysrIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpAQCAtODMsMTEgKzgzLDEyIEBACiAjIGlzIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cC4KIHRyeS1ydW4gPSAkKHNoZWxsIHNldCAtZTsJCVwKIAlUTVA9IiQoVE1QT1VUKS4kJCQkLnRtcCI7CVwKKwlUTVBPPSIkKFRNUE9VVCkuJCQkJC5vIjsJXAogCWlmICgkKDEpKSA+L2Rldi9udWxsIDI+JjE7CVwKIAl0aGVuIGVjaG8gIiQoMikiOwkJXAogCWVsc2UgZWNobyAiJCgzKSI7CQlcCiAJZmk7CQkJCVwKLQlybSAtZiAiJCRUTVAiKQorCXJtIC1mICIkJFRNUCIgIiQkVE1QTyIpCiAKICMgYXMtb3B0aW9uCiAjIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgYXMtb3B0aW9uLC1XYSQoY29tbWEpLWlzYT1mb28sKQpAQCAtOTksMTggKzEwMCwxOCBAQAogIyBVc2FnZTogY2ZsYWdzLXkgKz0gJChjYWxsIGFzLWluc3RyLGluc3RyLG9wdGlvbjEsb3B0aW9uMikKIAogYXMtaW5zdHIgPSAkKGNhbGwgdHJ5LXJ1bixcCi0JZWNobyAtZSAiJCgxKSIgfCAkKENDKSAkKEtCVUlMRF9BRkxBR1MpIC1jIC14YXNzZW1ibGVyIC1vICIkJFRNUCIgLSwkKDIpLCQoMykpCisJL2Jpbi9lY2hvIC1lICIkKDEpIiB8ICQoQ0MpICQoS0JVSUxEX0FGTEFHUykgLWMgLXhhc3NlbWJsZXIgLW8gIiQkVE1QIiAtLCQoMiksJCgzKSkKIAogIyBjYy1vcHRpb24KICMgVXNhZ2U6IGNmbGFncy15ICs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXdpbmNoaXAtYzYsLW1hcmNoPWk1ODYpCiAKIGNjLW9wdGlvbiA9ICQoY2FsbCB0cnktcnVuLFwKLQkkKENDKSAkKEtCVUlMRF9DRkxBR1MpICQoMSkgLWMgLXhjIC9kZXYvbnVsbCAtbyAiJCRUTVAiLCQoMSksJCgyKSkKKwkkKENDKSAkKEtCVUlMRF9DUFBGTEFHUykgJChLQlVJTERfQ0ZMQUdTKSAkKDEpIC1jIC14YyAvZGV2L251bGwgLW8gIiQkVE1QIiwkKDEpLCQoMikpCiAKICMgY2Mtb3B0aW9uLXluCiAjIFVzYWdlOiBmbGFnIDo9ICQoY2FsbCBjYy1vcHRpb24teW4sLW1hcmNoPXdpbmNoaXAtYzYpCiBjYy1vcHRpb24teW4gPSAkKGNhbGwgdHJ5LXJ1bixcCi0JJChDQykgJChLQlVJTERfQ0ZMQUdTKSAkKDEpIC1jIC14YyAvZGV2L251bGwgLW8gIiQkVE1QIix5LG4pCisJJChDQykgJChLQlVJTERfQ1BQRkxBR1MpICQoS0JVSUxEX0NGTEFHUykgJCgxKSAtYyAteGMgL2Rldi9udWxsIC1vICIkJFRNUCIseSxuKQogCiAjIGNjLW9wdGlvbi1hbGlnbgogIyBQcmVmaXggYWxpZ24gd2l0aCBlaXRoZXIgLWZhbGlnbiBvciAtbWFsaWduCkBAIC0xMzAsMTEgKzEzMSwxNiBAQAogIyBVc2FnZTogIEVYVFJBX0NGTEFHUyArPSAkKGNhbGwgY2MtaWZ2ZXJzaW9uLCAtbHQsIDA0MDIsIC1PMSkKIGNjLWlmdmVyc2lvbiA9ICQoc2hlbGwgWyAkKGNhbGwgY2MtdmVyc2lvbiwgJChDQykpICQoMSkgJCgyKSBdICYmIGVjaG8gJCgzKSkKIAotIyBsZC1vcHRpb24KLSMgVXNhZ2U6IGxkZmxhZ3MgKz0gJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9Ym90aCkKLWxkLW9wdGlvbiA9ICQoY2FsbCB0cnktcnVuLFwKKyMgY2MtbGRvcHRpb24KKyMgVXNhZ2U6IGxkZmxhZ3MgKz0gJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1ib3RoKQorY2MtbGRvcHRpb24gPSAkKGNhbGwgdHJ5LXJ1bixcCiAJJChDQykgJCgxKSAtbm9zdGRsaWIgLXhjIC9kZXYvbnVsbCAtbyAiJCRUTVAiLCQoMSksJCgyKSkKIAorIyBsZC1vcHRpb24KKyMgVXNhZ2U6IExERkxBR1MgKz0gJChjYWxsIGxkLW9wdGlvbiwgLVgpCitsZC1vcHRpb24gPSAkKGNhbGwgdHJ5LXJ1bixcCisJJChDQykgL2Rldi9udWxsIC1jIC1vICIkJFRNUE8iIDsgJChMRCkgJCgxKSAiJCRUTVBPIiAtbyAiJCRUTVAiLCQoMSksJCgyKSkKKwogIyMjIyMjCiAKICMjIwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKaW5kZXggNWM0YjdhNC4uMzQxYjU4OSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCkBAIC0yMDYsNyArMjA2LDcgQEAKIGVuZGlmCiAKIGlmZGVmIENPTkZJR19GVFJBQ0VfTUNPVU5UX1JFQ09SRAotY21kX3JlY29yZF9tY291bnQgPSBwZXJsICQoc3JjdHJlZSkvc2NyaXB0cy9yZWNvcmRtY291bnQucGwgIiQoQVJDSCkiIFwKK2NtZF9yZWNvcmRfbWNvdW50ID0gc2V0IC1lIDsgcGVybCAkKHNyY3RyZWUpL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsICIkKEFSQ0gpIiBcCiAJIiQoaWYgJChDT05GSUdfNjRCSVQpLDY0LDMyKSIgXAogCSIkKE9CSkRVTVApIiAiJChPQkpDT1BZKSIgIiQoQ0MpIiAiJChMRCkiICIkKE5NKSIgIiQoUk0pIiAiJChNVikiIFwKIAkiJChpZiAkKHBhcnQtb2YtbW9kdWxlKSwxLDApIiAiJChAKSI7CkBAIC0yMTYsNiArMjE2LDcgQEAKIAkkKGNhbGwgZWNoby1jbWQsY2hlY2tzcmMpICQoY21kX2NoZWNrc3JjKQkJCSAgXAogCSQoY2FsbCBlY2hvLWNtZCxjY19vX2MpICQoY21kX2NjX29fYyk7CQkJCSAgXAogCSQoY21kX21vZHZlcnNpb25zKQkJCQkJCSAgXAorCSQoY2FsbCBlY2hvLWNtZCxyZWNvcmRfbWNvdW50KQkJCQkJICBcCiAJJChjbWRfcmVjb3JkX21jb3VudCkJCQkJCQkgIFwKIAlzY3JpcHRzL2Jhc2ljL2ZpeGRlcCAkKGRlcGZpbGUpICRAICckKGNhbGwgbWFrZS1jbWQsY2Nfb19jKScgPiAgICBcCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG90LXRhcmdldCkudG1wOyAgXApAQCAtMjY5LDcgKzI3MCw4IEBACiAjIExpbmtlciBzY3JpcHRzIHByZXByb2Nlc3NvciAoLmxkcy5TIC0+IC5sZHMpCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogcXVpZXRfY21kX2NwcF9sZHNfUyA9IExEUyAgICAgJEAKLSAgICAgIGNtZF9jcHBfbGRzX1MgPSAkKENQUCkgJChjcHBfZmxhZ3MpIC1EX19BU1NFTUJMWV9fIC1vICRAICQ8CisgICAgICBjbWRfY3BwX2xkc19TID0gJChDUFApICQoY3BwX2ZsYWdzKSAtUCAtQyAtVSQoQVJDSCkgXAorCSAgICAgICAgICAgICAgICAgICAgIC1EX19BU1NFTUJMWV9fIC1ETElOS0VSX1NDUklQVCAtbyAkQCAkPAogCiAkKG9iaikvJS5sZHM6ICQoc3JjKS8lLmxkcy5TIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNwcF9sZHNfUykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKaW5kZXggN2E3Nzc4Ny4uZmZkYWZiMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5saWIKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAjIEJ6aXAyIGFuZCBMWk1BIGRvIG5vdCBpbmNsdWRlIHNpemUgaW4gZmlsZS4uLiBzbyB3ZSBoYXZlIHRvIGZha2UgdGhhdDsKICMgYXBwZW5kIHRoZSBzaXplIGFzIGEgMzItYml0IGxpdHRsZWVuZGlhbiBudW1iZXIgYXMgZ3ppcCBkb2VzLgotc2l6ZV9hcHBlbmQgPSBlY2hvIC1uZSAkKHNoZWxsCQkJCQkJXAorc2l6ZV9hcHBlbmQgPSAvYmluL2VjaG8gLW5lICQoc2hlbGwJCQkJCVwKIGRlY19zaXplPTA7CQkJCQkJCQlcCiBmb3IgRiBpbiAkMTsgZG8JCQkJCQkJCVwKIAlmc2l6ZT0kJChzdGF0IC1jICIlcyIgJCRGKTsJCQkJCVwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKaW5kZXggOTljYTdhNi4uNzlhYjk3MyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKKysrIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAogc3RhdGljIGNoYXIgKnNyY3RyZWUsICprZXJuc3JjdHJlZTsKIAotdm9pZCB1c2FnZSAodm9pZCkKK3N0YXRpYyB2b2lkIHVzYWdlICh2b2lkKQogewogCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGRvY3Byb2Mge2RvY3xkZXBlbmR9IGZpbGVcbiIpOwogCWZwcmludGYoc3RkZXJyLCAiSW5wdXQgaXMgcmVhZCBmcm9tIGZpbGUudG1wbC4gT3V0cHV0IGlzIHNlbnQgdG8gc3Rkb3V0XG4iKTsKQEAgLTg0LDcgKzg0LDcgQEAKIC8qCiAgKiBFeGVjdXRlIGtlcm5lbC1kb2Mgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIGluIHN2ZWMKICAqLwotdm9pZCBleGVjX2tlcm5lbF9kb2MoY2hhciAqKnN2ZWMpCitzdGF0aWMgdm9pZCBleGVjX2tlcm5lbF9kb2MoY2hhciAqKnN2ZWMpCiB7CiAJcGlkX3QgcGlkOwogCWludCByZXQ7CkBAIC0xMjksNyArMTI5LDcgQEAKIHN0cnVjdCBzeW1maWxlIHN5bWZpbGVsaXN0W01BWEZJTEVTXTsKIGludCBzeW1maWxlY250ID0gMDsKIAotdm9pZCBhZGRfbmV3X3N5bWJvbChzdHJ1Y3Qgc3ltZmlsZSAqc3ltLCBjaGFyICogc3ltbmFtZSkKK3N0YXRpYyB2b2lkIGFkZF9uZXdfc3ltYm9sKHN0cnVjdCBzeW1maWxlICpzeW0sIGNoYXIgKiBzeW1uYW1lKQogewogCXN5bS0+c3ltYm9sbGlzdCA9CiAgICAgICAgICAgcmVhbGxvYyhzeW0tPnN5bWJvbGxpc3QsIChzeW0tPnN5bWJvbGNudCArIDEpICogc2l6ZW9mKGNoYXIgKikpOwpAQCAtMTM3LDE0ICsxMzcsMTQgQEAKIH0KIAogLyogQWRkIGEgZmlsZW5hbWUgdG8gdGhlIGxpc3QgKi8KLXN0cnVjdCBzeW1maWxlICogYWRkX25ld19maWxlKGNoYXIgKiBmaWxlbmFtZSkKK3N0YXRpYyBzdHJ1Y3Qgc3ltZmlsZSAqIGFkZF9uZXdfZmlsZShjaGFyICogZmlsZW5hbWUpCiB7CiAJc3ltZmlsZWxpc3Rbc3ltZmlsZWNudCsrXS5maWxlbmFtZSA9IHN0cmR1cChmaWxlbmFtZSk7CiAJcmV0dXJuICZzeW1maWxlbGlzdFtzeW1maWxlY250IC0gMV07CiB9CiAKIC8qIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBhcmUgcHJlc2VudCBpbiB0aGUgbGlzdCAqLwotc3RydWN0IHN5bWZpbGUgKiBmaWxlbmFtZV9leGlzdChjaGFyICogZmlsZW5hbWUpCitzdGF0aWMgc3RydWN0IHN5bWZpbGUgKiBmaWxlbmFtZV9leGlzdChjaGFyICogZmlsZW5hbWUpCiB7CiAJaW50IGk7CiAJZm9yIChpPTA7IGkgPCBzeW1maWxlY250OyBpKyspCkBAIC0xNTcsMjAgKzE1NywyMCBAQAogICogTGlzdCBhbGwgZmlsZXMgcmVmZXJlbmNlZCB3aXRoaW4gdGhlIHRlbXBsYXRlIGZpbGUuCiAgKiBGaWxlcyBhcmUgc2VwYXJhdGVkIGJ5IHRhYnMuCiAgKi8KLXZvaWQgYWRkZGVwKGNoYXIgKiBmaWxlKQkJICAgeyBwcmludGYoIlx0JXMiLCBmaWxlKTsgfQotdm9pZCBhZGRkZXAyKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSkgICAgIHsgbGluZSA9IGxpbmU7IGFkZGRlcChmaWxlKTsgfQotdm9pZCBub2FjdGlvbihjaGFyICogbGluZSkJCSAgIHsgbGluZSA9IGxpbmU7IH0KLXZvaWQgbm9hY3Rpb24yKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSkgICB7IGZpbGUgPSBmaWxlOyBsaW5lID0gbGluZTsgfQorc3RhdGljIHZvaWQgYWRkZGVwKGNoYXIgKiBmaWxlKQkJICAgeyBwcmludGYoIlx0JXMiLCBmaWxlKTsgfQorc3RhdGljIHZvaWQgYWRkZGVwMihjaGFyICogZmlsZSwgY2hhciAqIGxpbmUpICAgICB7IGxpbmUgPSBsaW5lOyBhZGRkZXAoZmlsZSk7IH0KK3N0YXRpYyB2b2lkIG5vYWN0aW9uKGNoYXIgKiBsaW5lKQkJICAgeyBsaW5lID0gbGluZTsgfQorc3RhdGljIHZvaWQgbm9hY3Rpb24yKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSkgICB7IGZpbGUgPSBmaWxlOyBsaW5lID0gbGluZTsgfQogCiAvKiBFY2hvIHRoZSBsaW5lIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gKi8KLXZvaWQgcHJpbnRsaW5lKGNoYXIgKiBsaW5lKSAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlcyIsIGxpbmUpOyB9CitzdGF0aWMgdm9pZCBwcmludGxpbmUoY2hhciAqIGxpbmUpICAgICAgICAgICAgICAgeyBwcmludGYoIiVzIiwgbGluZSk7IH0KIAogLyoKICAqIEZpbmQgYWxsIHN5bWJvbHMgaW4gZmlsZW5hbWUgdGhhdCBhcmUgZXhwb3J0ZWQgd2l0aCBFWFBPUlRfU1lNQk9MICYKICAqIEVYUE9SVF9TWU1CT0xfR1BMICgmIEVYUE9SVF9TWU1CT0xfR1BMX0ZVVFVSRSBpbXBsaWNpdGx5KS4KICAqIEFsbCBzeW1ib2xzIGxvY2F0ZWQgYXJlIHN0b3JlZCBpbiBzeW1maWxlbGlzdC4KICAqLwotdm9pZCBmaW5kX2V4cG9ydF9zeW1ib2xzKGNoYXIgKiBmaWxlbmFtZSkKK3N0YXRpYyB2b2lkIGZpbmRfZXhwb3J0X3N5bWJvbHMoY2hhciAqIGZpbGVuYW1lKQogewogCUZJTEUgKiBmcDsKIAlzdHJ1Y3Qgc3ltZmlsZSAqc3ltOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAgKiBpbnRmdW5jIHVzZXMgLW5vZnVuY3Rpb24KICAqIGV4dGZ1bmMgdXNlcyAtZnVuY3Rpb24KICAqLwotdm9pZCBkb2NmdW5jdGlvbnMoY2hhciAqIGZpbGVuYW1lLCBjaGFyICogdHlwZSkKK3N0YXRpYyB2b2lkIGRvY2Z1bmN0aW9ucyhjaGFyICogZmlsZW5hbWUsIGNoYXIgKiB0eXBlKQogewogCWludCBpLGo7CiAJaW50IHN5bWNudCA9IDA7CkBAIC0yNTgsMTUgKzI1OCwxNSBAQAogCWZmbHVzaChzdGRvdXQpOwogCWZyZWUodmVjKTsKIH0KLXZvaWQgaW50ZnVuYyhjaGFyICogZmlsZW5hbWUpIHsJZG9jZnVuY3Rpb25zKGZpbGVuYW1lLCBOT0ZVTkNUSU9OKTsgfQotdm9pZCBleHRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgeyBkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIEZVTkNUSU9OKTsgICB9CitzdGF0aWMgdm9pZCBpbnRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgewlkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIE5PRlVOQ1RJT04pOyB9CitzdGF0aWMgdm9pZCBleHRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgeyBkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIEZVTkNUSU9OKTsgICB9CiAKIC8qCiAgKiBEb2N1bWVudCBzcGVjaWZpYyBmdW5jdGlvbihzKSBpbiBhIGZpbGUuCiAgKiBDYWxsIGtlcm5lbC1kb2Mgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAgKiBrZXJuZWwtZG9jIC1kb2Nib29rIC1mdW5jdGlvbiBmdW5jdGlvbjEgWy1mdW5jdGlvbiBmdW5jdGlvbjJdCiAgKi8KLXZvaWQgc2luZ2Z1bmMoY2hhciAqIGZpbGVuYW1lLCBjaGFyICogbGluZSkKK3N0YXRpYyB2b2lkIHNpbmdmdW5jKGNoYXIgKiBmaWxlbmFtZSwgY2hhciAqIGxpbmUpCiB7CiAJY2hhciAqdmVjWzIwMF07IC8qIEVub3VnaCBmb3Igc3BlY2lmaWMgZnVuY3Rpb25zICovCiAgICAgICAgIGludCBpLCBpZHggPSAwOwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAgKiBDYWxsIGtlcm5lbC1kb2Mgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAgKiBrZXJuZWwtZG9jIC1kb2Nib29rIC1mdW5jdGlvbiAiZG9jIHNlY3Rpb24iIGZpbGVuYW1lCiAgKi8KLXZvaWQgZG9jc2VjdChjaGFyICpmaWxlbmFtZSwgY2hhciAqbGluZSkKK3N0YXRpYyB2b2lkIGRvY3NlY3QoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmxpbmUpCiB7CiAJY2hhciAqdmVjWzZdOyAvKiBrZXJuZWxkb2MgLWRvY2Jvb2sgLWZ1bmN0aW9uICJzZWN0aW9uIiBmaWxlIE5VTEwgKi8KIAljaGFyICpzOwpAQCAtMzI0LDcgKzMyNCw3IEBACiAgKiA1KSBMaW5lcyBjb250YWluaW5nICFQCiAgKiA2KSBEZWZhdWx0IGxpbmVzIC0gbGluZXMgbm90IG1hdGNoaW5nIHRoZSBhYm92ZQogICovCi12b2lkIHBhcnNlX2ZpbGUoRklMRSAqaW5maWxlKQorc3RhdGljIHZvaWQgcGFyc2VfZmlsZShGSUxFICppbmZpbGUpCiB7CiAJY2hhciBsaW5lW01BWExJTkVTWl07CiAJY2hhciAqIHM7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jIGIvc2NyaXB0cy9iYXNpYy9maXhkZXAuYwppbmRleCA4YWI0NDg2Li42YmYyMWY4IDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCisrKyBiL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogY2hhciAqZGVwZmlsZTsKIGNoYXIgKmNtZGxpbmU7CiAKLXZvaWQgdXNhZ2Uodm9pZCkKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiB7CiAJZnByaW50ZihzdGRlcnIsICJVc2FnZTogZml4ZGVwIDxkZXBmaWxlPiA8dGFyZ2V0PiA8Y21kbGluZT5cbiIpOwogCWV4aXQoMSk7CkBAIC0xMzMsNyArMTMzLDcgQEAKIC8qCiAgKiBQcmludCBvdXQgdGhlIGNvbW1hbmRsaW5lIHByZWZpeGVkIHdpdGggY21kXzx0YXJnZXQgZmlsZW5hbWU+IDo9CiAgKi8KLXZvaWQgcHJpbnRfY21kbGluZSh2b2lkKQorc3RhdGljIHZvaWQgcHJpbnRfY21kbGluZSh2b2lkKQogewogCXByaW50ZigiY21kXyVzIDo9ICVzXG5cbiIsIHRhcmdldCwgY21kbGluZSk7CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAqIEdyb3cgdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nIHRvIGEgZGVzaXJlZCBsZW5ndGguCiAgKiBVc3VhbGx5IHRoZSBmaXJzdCBncm93dGggaXMgcGxlbnR5LgogICovCi12b2lkIGdyb3dfY29uZmlnKGludCBsZW4pCitzdGF0aWMgdm9pZCBncm93X2NvbmZpZyhpbnQgbGVuKQogewogCXdoaWxlIChsZW5fY29uZmlnICsgbGVuID4gc2l6ZV9jb25maWcpIHsKIAkJaWYgKHNpemVfY29uZmlnID09IDApCkBAIC0xNjIsNyArMTYyLDcgQEAKIC8qCiAgKiBMb29rdXAgYSB2YWx1ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBzdHJpbmcuCiAgKi8KLWludCBpc19kZWZpbmVkX2NvbmZpZyhjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3N0YXRpYyBpbnQgaXNfZGVmaW5lZF9jb25maWcoY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4pCiB7CiAJY29uc3QgY2hhciAqIHBjb25maWc7CiAJY29uc3QgY2hhciAqIHBsYXN0ID0gc3RyX2NvbmZpZyArIGxlbl9jb25maWcgLSBsZW47CkBAIC0xNzgsNyArMTc4LDcgQEAKIC8qCiAgKiBBZGQgYSBuZXcgdmFsdWUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgogICovCi12b2lkIGRlZmluZV9jb25maWcoY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4pCitzdGF0aWMgdm9pZCBkZWZpbmVfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQogewogCWdyb3dfY29uZmlnKGxlbiArIDEpOwogCkBAIC0xOTAsNyArMTkwLDcgQEAKIC8qCiAgKiBDbGVhciB0aGUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gc3RyaW5ncy4KICAqLwotdm9pZCBjbGVhcl9jb25maWcodm9pZCkKK3N0YXRpYyB2b2lkIGNsZWFyX2NvbmZpZyh2b2lkKQogewogCWxlbl9jb25maWcgPSAwOwogCWRlZmluZV9jb25maWcoIiIsIDApOwpAQCAtMTk5LDcgKzE5OSw3IEBACiAvKgogICogUmVjb3JkIHRoZSB1c2Ugb2YgYSBDT05GSUdfKiB3b3JkLgogICovCi12b2lkIHVzZV9jb25maWcoY2hhciAqbSwgaW50IHNsZW4pCitzdGF0aWMgdm9pZCB1c2VfY29uZmlnKGNoYXIgKm0sIGludCBzbGVuKQogewogCWNoYXIgc1tQQVRIX01BWF07CiAJY2hhciAqcDsKQEAgLTIyMCw3ICsyMjAsNyBAQAogCXByaW50ZigiICAgICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvJXMuaCkgXFxcbiIsIHMpOwogfQogCi12b2lkIHBhcnNlX2NvbmZpZ19maWxlKGNoYXIgKm1hcCwgc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIHBhcnNlX2NvbmZpZ19maWxlKGNoYXIgKm1hcCwgc2l6ZV90IGxlbikKIHsKIAlpbnQgKmVuZCA9IChpbnQgKikgKG1hcCArIGxlbik7CiAJLyogc3RhcnQgYXQgKzEsIHNvIHRoYXQgcCBjYW4gbmV2ZXIgYmUgPCBtYXAgKi8KQEAgLTI1NCw3ICsyNTQsNyBAQAogfQogCiAvKiB0ZXN0IGlzIHMgZW5kcyBpbiBzdWIgKi8KLWludCBzdHJyY21wKGNoYXIgKnMsIGNoYXIgKnN1YikKK3N0YXRpYyBpbnQgc3RycmNtcChjaGFyICpzLCBjaGFyICpzdWIpCiB7CiAJaW50IHNsZW4gPSBzdHJsZW4ocyk7CiAJaW50IHN1YmxlbiA9IHN0cmxlbihzdWIpOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJcmV0dXJuIG1lbWNtcChzICsgc2xlbiAtIHN1Ymxlbiwgc3ViLCBzdWJsZW4pOwogfQogCi12b2lkIGRvX2NvbmZpZ19maWxlKGNoYXIgKmZpbGVuYW1lKQorc3RhdGljIHZvaWQgZG9fY29uZmlnX2ZpbGUoY2hhciAqZmlsZW5hbWUpCiB7CiAJc3RydWN0IHN0YXQgc3Q7CiAJaW50IGZkOwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJY2xvc2UoZmQpOwogfQogCi12b2lkIHBhcnNlX2RlcF9maWxlKHZvaWQgKm1hcCwgc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIHBhcnNlX2RlcF9maWxlKHZvaWQgKm1hcCwgc2l6ZV90IGxlbikKIHsKIAljaGFyICptID0gbWFwOwogCWNoYXIgKmVuZCA9IG0gKyBsZW47CkBAIC0zMzYsNyArMzM2LDcgQEAKIAlwcmludGYoIiQoZGVwc18lcyk6XG4iLCB0YXJnZXQpOwogfQogCi12b2lkIHByaW50X2RlcHModm9pZCkKK3N0YXRpYyB2b2lkIHByaW50X2RlcHModm9pZCkKIHsKIAlzdHJ1Y3Qgc3RhdCBzdDsKIAlpbnQgZmQ7CkBAIC0zNjgsNyArMzY4LDcgQEAKIAljbG9zZShmZCk7CiB9CiAKLXZvaWQgdHJhcHModm9pZCkKK3N0YXRpYyB2b2lkIHRyYXBzKHZvaWQpCiB7CiAJc3RhdGljIGNoYXIgdGVzdFtdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGludCkpKSkgPSAiQ09ORiI7CiAJaW50ICpwID0gKGludCAqKXRlc3Q7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL2hhc2guYyBiL3NjcmlwdHMvYmFzaWMvaGFzaC5jCmluZGV4IDMyOTlhZDcuLjJlZjVkM2YgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvYmFzaWMvaGFzaC5jCisrKyBiL3NjcmlwdHMvYmFzaWMvaGFzaC5jCkBAIC0yMSw3ICsyMSw3IEBACiAgKiBodHRwOi8vd3d3LmNzZS55b3JrdS5jYS9+b3ovaGFzaC5odG1sCiAgKi8KIAotdW5zaWduZWQgaW50IGRqYjJfaGFzaChjaGFyICpzdHIpCitzdGF0aWMgdW5zaWduZWQgaW50IGRqYjJfaGFzaChjaGFyICpzdHIpCiB7CiAJdW5zaWduZWQgbG9uZyBoYXNoID0gNTM4MTsKIAlpbnQgYzsKQEAgLTM0LDcgKzM0LDcgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGludCkoaGFzaCAmICgoMSA8PCBEWU5BTUlDX0RFQlVHX0hBU0hfQklUUykgLSAxKSk7CiB9CiAKLXVuc2lnbmVkIGludCByNV9oYXNoKGNoYXIgKnN0cikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcjVfaGFzaChjaGFyICpzdHIpCiB7CiAJdW5zaWduZWQgbG9uZyBoYXNoID0gMDsKIAlpbnQgYzsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2tpbmNsdWRlcy5wbCBiL3NjcmlwdHMvY2hlY2tpbmNsdWRlcy5wbAppbmRleCA4ZTZiNzE2Li42NzZkZGMwIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNraW5jbHVkZXMucGwKKysrIGIvc2NyaXB0cy9jaGVja2luY2x1ZGVzLnBsCkBAIC0xLDI0ICsxLDg1IEBACiAjIS91c3IvYmluL3BlcmwKICMKLSMgY2hlY2tpbmNsdWRlczogRmluZCBmaWxlcyBpbmNsdWRlZCBtb3JlIHRoYW4gb25jZSBpbiAob3RoZXIpIGZpbGVzLgorIyBjaGVja2luY2x1ZGVzOiBmaW5kL3JlbW92ZSBmaWxlcyBpbmNsdWRlZCBtb3JlIHRoYW4gb25jZQorIwogIyBDb3B5cmlnaHQgYWJhbmRvbmVkLCAyMDAwLCBOaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbiA8bmtiakBpbWFnZS5kaz4uCisjIENvcHlyaWdodCAyMDA5IEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAZ21haWwuY29tPgorIworIyBUaGlzIHNjcmlwdCBjaGVja3MgZm9yIGR1cGxpY2F0ZSBpbmNsdWRlcy4gSXQgYWxzbyBoYXMgc3VwcG9ydAorIyB0byByZW1vdmUgdGhlbSBpbiBwbGFjZS4gTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgdGFrZSBpbnRvCisjIGNvbnNpZGVyYXRpb24gbWFjcm9zIHNvIHlvdSBzaG91bGQgcnVuIHRoaXMgb25seSBpZiB5b3Uga25vdworIyB5b3UgZG8gaGF2ZSByZWFsIGR1cHMgYW5kIGRvIG5vdCBoYXZlIHRoZW0gdW5kZXIgI2lmZGVmJ3MuIFlvdQorIyBjb3VsZCBhbHNvIGp1c3QgcmV2aWV3IHRoZSByZXN1bHRzLgorCitzdWIgdXNhZ2UgeworCXByaW50ICJVc2FnZTogY2hlY2tpbmNsdWRlcy5wbCBbLXJdXG4iOworCXByaW50ICJCeSBkZWZhdWx0IHdlIGp1c3Qgd2FybiBvZiBkdXBsaWNhdGVzXG4iOworCXByaW50ICJUbyByZW1vdmUgZHVwbGljYXRlZCBpbmNsdWRlcyBpbiBwbGFjZSB1c2UgLXJcbiI7CisJZXhpdCAxOworfQorCitteSAkcmVtb3ZlID0gMDsKKworaWYgKCQjQVJHViA8IDApIHsKKwl1c2FnZSgpOworfQorCitpZiAoJCNBUkdWID49IDEpIHsKKwlpZiAoJEFSR1ZbMF0gPX4gL14tLykgeworCQlpZiAoJEFSR1ZbMF0gZXEgIi1yIikgeworCQkJJHJlbW92ZSA9IDE7CisJCQlzaGlmdDsKKwkJfSBlbHNlIHsKKwkJCXVzYWdlKCk7CisJCX0KKwl9Cit9CiAKIGZvcmVhY2ggJGZpbGUgKEBBUkdWKSB7CiAJb3BlbihGSUxFLCAkZmlsZSkgb3IgZGllICJDYW5ub3Qgb3BlbiAkZmlsZTogJCEuXG4iOwogCiAJbXkgJWluY2x1ZGVkZmlsZXMgPSAoKTsKKwlteSBAZmlsZV9saW5lcyA9ICgpOwogCiAJd2hpbGUgKDxGSUxFPikgewogCQlpZiAobS9eXHMqI1xzKmluY2x1ZGVccypbPCJdKFxTKilbPiJdL28pIHsKIAkJCSsrJGluY2x1ZGVkZmlsZXN7JDF9OwogCQl9Ci0JfQotCQotCWZvcmVhY2ggJGZpbGVuYW1lIChrZXlzICVpbmNsdWRlZGZpbGVzKSB7Ci0JCWlmICgkaW5jbHVkZWRmaWxlc3skZmlsZW5hbWV9ID4gMSkgewotCQkJcHJpbnQgIiRmaWxlOiAkZmlsZW5hbWUgaXMgaW5jbHVkZWQgbW9yZSB0aGFuIG9uY2UuXG4iOwotCQl9CisJCXB1c2goQGZpbGVfbGluZXMsICRfKTsKIAl9CiAKIAljbG9zZShGSUxFKTsKKworCWlmICghJHJlbW92ZSkgeworCQlmb3JlYWNoICRmaWxlbmFtZSAoa2V5cyAlaW5jbHVkZWRmaWxlcykgeworCQkJaWYgKCRpbmNsdWRlZGZpbGVzeyRmaWxlbmFtZX0gPiAxKSB7CisJCQkJcHJpbnQgIiRmaWxlOiAkZmlsZW5hbWUgaXMgaW5jbHVkZWQgbW9yZSB0aGFuIG9uY2UuXG4iOworCQkJfQorCQl9CisJCW5leHQ7CisJfQorCisJb3BlbihGSUxFLCI+JGZpbGUiKSB8fCBkaWUoIkNhbm5vdCB3cml0ZSB0byAkZmlsZTogJCEiKTsKKworCW15ICRkdXBzID0gMDsKKwlmb3JlYWNoIChAZmlsZV9saW5lcykgeworCQlpZiAobS9eXHMqI1xzKmluY2x1ZGVccypbPCJdKFxTKilbPiJdL28pIHsKKwkJCWZvcmVhY2ggJGZpbGVuYW1lIChrZXlzICVpbmNsdWRlZGZpbGVzKSB7CisJCQkJaWYgKCQxIGVxICRmaWxlbmFtZSkgeworCQkJCQlpZiAoJGluY2x1ZGVkZmlsZXN7JGZpbGVuYW1lfSA+IDEpIHsKKwkJCQkJCSRpbmNsdWRlZGZpbGVzeyRmaWxlbmFtZX0tLTsKKwkJCQkJCSRkdXBzKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludCBGSUxFICRfOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnQgRklMRSAkXzsKKwkJfQorCX0KKwlpZiAoJGR1cHMgPiAwKSB7CisJCXByaW50ICIkZmlsZTogcmVtb3ZlZCAkZHVwcyBkdXBsaWNhdGUgaW5jbHVkZXNcbiI7CisJfQorCWNsb3NlKEZJTEUpOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja2tjb25maWdzeW1ib2xzLnNoIGIvc2NyaXB0cy9jaGVja2tjb25maWdzeW1ib2xzLnNoCmluZGV4IDM5Njc3YzguLjQ2YmUzYzUgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2trY29uZmlnc3ltYm9scy5zaAorKysgYi9zY3JpcHRzL2NoZWNra2NvbmZpZ3N5bWJvbHMuc2gKQEAgLTksNyArOSw3IEBACiAjIERvaW5nIHRoaXMgb25jZSBhdCB0aGUgYmVnaW5uaW5nIHNhdmVzIGEgbG90IG9mIHRpbWUsIG9uIGEgY2FjaGUtaG90IHRyZWUuCiBLY29uZmlncz0iYGZpbmQgLiAtbmFtZSAnS2NvbmZpZycgLW8gLW5hbWUgJ0tjb25maWcqW15+XSdgIgogCi1lY2hvIC1lICJGaWxlIGxpc3QgXHR1bmRlZmluZWQgc3ltYm9sIHVzZWQiCisvYmluL2VjaG8gLWUgIkZpbGUgbGlzdCBcdHVuZGVmaW5lZCBzeW1ib2wgdXNlZCIKIGZpbmQgJHBhdGhzIC1uYW1lICcqLltjaFNdJyAtbyAtbmFtZSAnTWFrZWZpbGUnIC1vIC1uYW1lICdNYWtlZmlsZSpbXn5dJ3wgd2hpbGUgcmVhZCBpCiBkbwogCSMgT3V0cHV0IHRoZSBiYXJlIEtjb25maWcgdmFyaWFibGUgYW5kIHRoZSBmaWxlbmFtZTsgdGhlIF9NT0RVTEUgcGFydCBhdApAQCAtNTQsNiArNTQsNiBAQAogCSMgYmV5b25kIHRoZSBwdXJwb3NlIG9mIHRoaXMgc2NyaXB0LgogCXN5bWJfYmFyZT1gZWNobyAkc3ltYiB8IHNlZCAtZSAncy9fTU9EVUxFLy8nYAogCWlmICEgZ3JlcCAtcSAiXDwkc3ltYl9iYXJlXD4iICRLY29uZmlnczsgdGhlbgotCQllY2hvIC1lICIkZmlsZXM6IFx0JHN5bWIiCisJCS9iaW4vZWNobyAtZSAiJGZpbGVzOiBcdCRzeW1iIgogCWZpCiBkb25lfHNvcnQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCA4N2JiYjhiLi5iYzQxMTRmIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC0yLDcgKzIsNyBAQAogIyAoYykgMjAwMSwgRGF2ZSBKb25lcy4gPGRhdmVqQHJlZGhhdC5jb20+ICh0aGUgZmlsZSBoYW5kbGluZyBiaXQpCiAjIChjKSAyMDA1LCBKb2VsIFNjaG9wcCA8anNjaG9wcEBhdXN0aW4uaWJtLmNvbT4gKHRoZSB1Z2x5IGJpdCkKICMgKGMpIDIwMDcsMjAwOCwgQW5keSBXaGl0Y3JvZnQgPGFwd0B1ay5pYm0uY29tPiAobmV3IGNvbmRpdGlvbnMsIHRlc3Qgc3VpdGUpCi0jIChjKSAyMDA4LCBBbmR5IFdoaXRjcm9mdCA8YXB3QGNhbm9uaWNhbC5jb20+CisjIChjKSAyMDA4LDIwMDksIEFuZHkgV2hpdGNyb2Z0IDxhcHdAY2Fub25pY2FsLmNvbT4KICMgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyCiAKIHVzZSBzdHJpY3Q7CkBAIC0xMCw3ICsxMCw3IEBACiBteSAkUCA9ICQwOwogJFAgPX4gc0AuKi9AQGc7CiAKLW15ICRWID0gJzAuMjknOworbXkgJFYgPSAnMC4zMCc7CiAKIHVzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBub19hdXRvX2FiYnJldik7CiAKQEAgLTEzMCw3ICsxMzAsMTAgQEAKIAogbXkgJGVtaXR0ZWRfY29ycnVwdCA9IDA7CiAKLW91ciAkSWRlbnQgICAgICAgPSBxcntbQS1aYS16X11bQS1aYS16XGRfXSp9Oworb3VyICRJZGVudAk9IHFyeworCQkJW0EtWmEtel9dW0EtWmEtelxkX10qCisJCQkoPzpccypcI1wjXHMqW0EtWmEtel9dW0EtWmEtelxkX10qKSoKKwkJfXg7CiBvdXIgJFN0b3JhZ2UJPSBxcntleHRlcm58c3RhdGljfGFzbWxpbmthZ2V9Owogb3VyICRTcGFyc2UJPSBxcnsKIAkJCV9fdXNlcnwKQEAgLTk5NywyMyArMTAwMCwyNSBAQAogCiBzdWIgcG9zc2libGUgewogCW15ICgkcG9zc2libGUsICRsaW5lKSA9IEBfOwotCi0JcHJpbnQgIkNIRUNLPCRwb3NzaWJsZT4gKCRsaW5lKVxuIiBpZiAoJGRiZ19wb3NzaWJsZSA+IDIpOwotCWlmICgkcG9zc2libGUgIX4gLyg/OgorCW15ICRub3RQZXJtaXR0ZWQgPSBxcnsoPzoKIAkJXig/OgogCQkJJE1vZGlmaWVyfAogCQkJJFN0b3JhZ2V8CiAJCQkkVHlwZXwKLQkJCURFRklORV9cUyt8CisJCQlERUZJTkVfXFMrCisJCSkkfAorCQleKD86CiAJCQlnb3RvfAogCQkJcmV0dXJufAogCQkJY2FzZXwKIAkJCWVsc2V8CiAJCQlhc218X19hc21fX3wKIAkJCWRvCi0JCSkkfAorCQkpKD86XHN8JCl8CiAJCV4oPzp0eXBlZGVmfHN0cnVjdHxlbnVtKVxiCi0JICAgICkveCkgeworCSAgICApfXg7CisJd2FybiAiQ0hFQ0s8JHBvc3NpYmxlPiAoJGxpbmUpXG4iIGlmICgkZGJnX3Bvc3NpYmxlID4gMik7CisJaWYgKCRwb3NzaWJsZSAhfiAkbm90UGVybWl0dGVkKSB7CiAJCSMgQ2hlY2sgZm9yIG1vZGlmaWVycy4KIAkJJHBvc3NpYmxlID1+IHMvXHMqJFN0b3JhZ2VccyovL2c7CiAJCSRwb3NzaWJsZSA9fiBzL1xzKiRTcGFyc2VccyovL2c7CkBAIC0xMDIyLDggKzEwMjcsMTAgQEAKIAkJfSBlbHNpZiAoJHBvc3NpYmxlID1+IC9ccy8pIHsKIAkJCSRwb3NzaWJsZSA9fiBzL1xzKiRUeXBlXHMqLy9nOwogCQkJZm9yIG15ICRtb2RpZmllciAoc3BsaXQoJyAnLCAkcG9zc2libGUpKSB7Ci0JCQkJd2FybiAiTU9ESUZJRVI6ICRtb2RpZmllciAoJHBvc3NpYmxlKSAoJGxpbmUpXG4iIGlmICgkZGJnX3Bvc3NpYmxlKTsKLQkJCQlwdXNoKEBtb2RpZmllckxpc3QsICRtb2RpZmllcik7CisJCQkJaWYgKCRtb2RpZmllciAhfiAkbm90UGVybWl0dGVkKSB7CisJCQkJCXdhcm4gIk1PRElGSUVSOiAkbW9kaWZpZXIgKCRwb3NzaWJsZSkgKCRsaW5lKVxuIiBpZiAoJGRiZ19wb3NzaWJsZSk7CisJCQkJCXB1c2goQG1vZGlmaWVyTGlzdCwgJG1vZGlmaWVyKTsKKwkJCQl9CiAJCQl9CiAKIAkJfSBlbHNlIHsKQEAgLTExMzgsNiArMTE0NSw3IEBACiAJIyBzdXBwcmVzc2lvbiBmbGFncwogCW15ICVzdXBwcmVzc19pZmJyYWNlczsKIAlteSAlc3VwcHJlc3Nfd2hpbGV0cmFpbGVyczsKKwlteSAlc3VwcHJlc3NfZXhwb3J0OwogCiAJIyBQcmUtc2NhbiB0aGUgcGF0Y2ggc2FuaXRpemluZyB0aGUgbGluZXMuCiAJIyBQcmUtc2NhbiB0aGUgcGF0Y2ggbG9va2luZyBmb3IgYW55IF9fc2V0dXAgZG9jdW1lbnRhdGlvbi4KQEAgLTEyMzAsNyArMTIzOCw2IEBACiAJCSRsaW5lbnIrKzsKIAogCQlteSAkcmF3bGluZSA9ICRyYXdsaW5lc1skbGluZW5yIC0gMV07Ci0JCW15ICRodW5rX2xpbmUgPSAoJHJlYWxjbnQgIT0gMCk7CiAKICNleHRyYWN0IHRoZSBsaW5lIHJhbmdlIGluIHRoZSBmaWxlIGFmdGVyIHRoZSBwYXRjaCBpcyBhcHBsaWVkCiAJCWlmICgkbGluZT1+L15cQFxAIC1cZCsoPzosXGQrKT8gXCsoXGQrKSgsKFxkKykpPyBcQFxALykgewpAQCAtMTI0Nyw2ICsxMjU0LDcgQEAKIAogCQkJJXN1cHByZXNzX2lmYnJhY2VzID0gKCk7CiAJCQklc3VwcHJlc3Nfd2hpbGV0cmFpbGVycyA9ICgpOworCQkJJXN1cHByZXNzX2V4cG9ydCA9ICgpOwogCQkJbmV4dDsKIAogIyB0cmFjayB0aGUgbGluZSBudW1iZXIgYXMgd2UgbW92ZSB0aHJvdWdoIHRoZSBodW5rLCBub3RlIHRoYXQKQEAgLTEyNzAsNiArMTI3OCw4IEBACiAJCQkkcmVhbGNudC0tOwogCQl9CiAKKwkJbXkgJGh1bmtfbGluZSA9ICgkcmVhbGNudCAhPSAwKTsKKwogI21ha2UgdXAgdGhlIGhhbmRsZSBmb3IgYW55IGVycm9yIHdlIHJlcG9ydCBvbiB0aGlzIGxpbmUKIAkJJHByZWZpeCA9ICIkZmlsZW5hbWU6JHJlYWxsaW5lOiAiIGlmICgkZW1hY3MgJiYgJGZpbGUpOwogCQkkcHJlZml4ID0gIiRmaWxlbmFtZTokbGluZW5yOiAiIGlmICgkZW1hY3MgJiYgISRmaWxlKTsKQEAgLTE0MjAsMTMgKzE0MzAsMjIgQEAKIAkJfQogCiAjIENoZWNrIGZvciBwb3RlbnRpYWwgJ2JhcmUnIHR5cGVzCi0JCW15ICgkc3RhdCwgJGNvbmQsICRsaW5lX25yX25leHQsICRyZW1haW5fbmV4dCwgJG9mZl9uZXh0KTsKKwkJbXkgKCRzdGF0LCAkY29uZCwgJGxpbmVfbnJfbmV4dCwgJHJlbWFpbl9uZXh0LCAkb2ZmX25leHQsCisJCSAgICAkcmVhbGxpbmVfbmV4dCk7CiAJCWlmICgkcmVhbGNudCAmJiAkbGluZSA9fiAvLlxzKlxTLykgewogCQkJKCRzdGF0LCAkY29uZCwgJGxpbmVfbnJfbmV4dCwgJHJlbWFpbl9uZXh0LCAkb2ZmX25leHQpID0KIAkJCQljdHhfc3RhdGVtZW50X2Jsb2NrKCRsaW5lbnIsICRyZWFsY250LCAwKTsKIAkJCSRzdGF0ID1+IHMvXG4uL1xuIC9nOwogCQkJJGNvbmQgPX4gcy9cbi4vXG4gL2c7CiAKKwkJCSMgRmluZCB0aGUgcmVhbCBuZXh0IGxpbmUuCisJCQkkcmVhbGxpbmVfbmV4dCA9ICRsaW5lX25yX25leHQ7CisJCQlpZiAoZGVmaW5lZCAkcmVhbGxpbmVfbmV4dCAmJgorCQkJICAgICghZGVmaW5lZCAkbGluZXNbJHJlYWxsaW5lX25leHQgLSAxXSB8fAorCQkJICAgICBzdWJzdHIoJGxpbmVzWyRyZWFsbGluZV9uZXh0IC0gMV0sICRvZmZfbmV4dCkgPX4gL15ccyokLykpIHsKKwkJCQkkcmVhbGxpbmVfbmV4dCsrOworCQkJfQorCiAJCQlteSAkcyA9ICRzdGF0OwogCQkJJHMgPX4gcy97LiokLy9zOwogCkBAIC0xNjYxLDggKzE2ODAsOCBAQAogCQl9CiAKICMgY2hlY2sgZm9yIGluaXRpYWxpc2F0aW9uIHRvIGFnZ3JlZ2F0ZXMgb3BlbiBicmFjZSBvbiB0aGUgbmV4dCBsaW5lCi0JCWlmICgkcHJldmxpbmUgPX4gLyREZWNsYXJlXHMqJElkZW50XHMqPVxzKiQvICYmCi0JCSAgICAkbGluZSA9fiAvXi5ccyp7LykgeworCQlpZiAoJGxpbmUgPX4gL14uXHMqey8gJiYKKwkJICAgICRwcmV2bGluZSA9fiAvKD86XnxbXj1dKT1ccyokLykgewogCQkJRVJST1IoInRoYXQgb3BlbiBicmFjZSB7IHNob3VsZCBiZSBvbiB0aGUgcHJldmlvdXMgbGluZVxuIiAuICRoZXJlcHJldik7CiAJCX0KIApAQCAtMTY4NywyMSArMTcwNiw0MCBAQAogCQkkbGluZSA9fiBzQC8vLipAQDsKIAkJJG9wbGluZSA9fiBzQC8vLipAQDsKIAotI0VYUE9SVF9TWU1CT0wgc2hvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdyBpdHMgZnVuY3Rpb24gY2xvc2luZyB9LgotCQlpZiAoKCRsaW5lID1+IC9FWFBPUlRfU1lNQk9MLipcKCguKilcKS8pIHx8Ci0JCSAgICAoJGxpbmUgPX4gL0VYUE9SVF9VTlVTRURfU1lNQk9MLipcKCguKilcKS8pKSB7CisjIEVYUE9SVF9TWU1CT0wgc2hvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgdGhpbmcgaXQgaXMgZXhwb3J0aW5nLCBjb25zaWRlcgorIyB0aGUgd2hvbGUgc3RhdGVtZW50LgorI3ByaW50ICJBUFcgPCRsaW5lc1skcmVhbGxpbmVfbmV4dCAtIDFdPlxuIjsKKwkJaWYgKGRlZmluZWQgJHJlYWxsaW5lX25leHQgJiYKKwkJICAgIGV4aXN0cyAkbGluZXNbJHJlYWxsaW5lX25leHQgLSAxXSAmJgorCQkgICAgIWRlZmluZWQgJHN1cHByZXNzX2V4cG9ydHskcmVhbGxpbmVfbmV4dH0gJiYKKwkJICAgICgkbGluZXNbJHJlYWxsaW5lX25leHQgLSAxXSA9fiAvRVhQT1JUX1NZTUJPTC4qXCgoLiopXCkvIHx8CisJCSAgICAgJGxpbmVzWyRyZWFsbGluZV9uZXh0IC0gMV0gPX4gL0VYUE9SVF9VTlVTRURfU1lNQk9MLipcKCguKilcKS8pKSB7CiAJCQlteSAkbmFtZSA9ICQxOwotCQkJaWYgKCRwcmV2bGluZSAhfiAvKD86Ci0JCQkJXi59fAorCQkJaWYgKCRzdGF0ICF+IC8oPzoKKwkJCQlcbi59XHMqJHwKIAkJCQleLkRFRklORV8kSWRlbnRcKFxRJG5hbWVcRVwpfAogCQkJCV4uREVDTEFSRV8kSWRlbnRcKFxRJG5hbWVcRVwpfAogCQkJCV4uTElTVF9IRUFEXChcUSRuYW1lXEVcKXwKLQkJCQleLiRUeXBlXHMqXChccypcKlxzKlxRJG5hbWVcRVxzKlwpXHMqXCh8Ci0JCQkJXGJcUSRuYW1lXEUoPzpccyskQXR0cmlidXRlKT9ccyooPzo7fD18XFspCisJCQkJXi4oPzokU3RvcmFnZVxzKyk/JFR5cGVccypcKFxzKlwqXHMqXFEkbmFtZVxFXHMqXClccypcKHwKKwkJCQlcYlxRJG5hbWVcRSg/OlxzKyRBdHRyaWJ1dGUpKlxzKig/Ojt8PXxcW3xcKCkKIAkJCSAgICApL3gpIHsKLQkJCQlXQVJOKCJFWFBPUlRfU1lNQk9MKGZvbyk7IHNob3VsZCBpbW1lZGlhdGVseSBmb2xsb3cgaXRzIGZ1bmN0aW9uL3ZhcmlhYmxlXG4iIC4gJGhlcmVjdXJyKTsKKyNwcmludCAiRk9PIEE8JGxpbmVzWyRyZWFsbGluZV9uZXh0IC0gMV0+IHN0YXQ8JHN0YXQ+IG5hbWU8JG5hbWU+XG4iOworCQkJCSRzdXBwcmVzc19leHBvcnR7JHJlYWxsaW5lX25leHR9ID0gMjsKKwkJCX0gZWxzZSB7CisJCQkJJHN1cHByZXNzX2V4cG9ydHskcmVhbGxpbmVfbmV4dH0gPSAxOwogCQkJfQogCQl9CisJCWlmICghZGVmaW5lZCAkc3VwcHJlc3NfZXhwb3J0eyRsaW5lbnJ9ICYmCisJCSAgICAkcHJldmxpbmUgPX4gL14uXHMqJC8gJiYKKwkJICAgICgkbGluZSA9fiAvRVhQT1JUX1NZTUJPTC4qXCgoLiopXCkvIHx8CisJCSAgICAgJGxpbmUgPX4gL0VYUE9SVF9VTlVTRURfU1lNQk9MLipcKCguKilcKS8pKSB7CisjcHJpbnQgIkZPTyBCIDwkbGluZXNbJGxpbmVuciAtIDFdPlxuIjsKKwkJCSRzdXBwcmVzc19leHBvcnR7JGxpbmVucn0gPSAyOworCQl9CisJCWlmIChkZWZpbmVkICRzdXBwcmVzc19leHBvcnR7JGxpbmVucn0gJiYKKwkJICAgICRzdXBwcmVzc19leHBvcnR7JGxpbmVucn0gPT0gMikgeworCQkJV0FSTigiRVhQT1JUX1NZTUJPTChmb28pOyBzaG91bGQgaW1tZWRpYXRlbHkgZm9sbG93IGl0cyBmdW5jdGlvbi92YXJpYWJsZVxuIiAuICRoZXJlY3Vycik7CisJCX0KIAogIyBjaGVjayBmb3IgZXh0ZXJuYWwgaW5pdGlhbGlzZXJzLgogCQlpZiAoJGxpbmUgPX4gL14uJFR5cGVccyokSWRlbnRccyooPzpccyskTW9kaWZpZXIpKlxzKj1ccyooMHxOVUxMfGZhbHNlKVxzKjsvKSB7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsIGIvc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAppbmRleCBjZGI0NGI2Li4xMDJiNzY2IDEwMDc1NQotLS0gYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsCisrKyBiL3NjcmlwdHMvZ2V0X21haW50YWluZXIucGwKQEAgLTEzLDcgKzEzLDcgQEAKIHVzZSBzdHJpY3Q7CiAKIG15ICRQID0gJDA7Ci1teSAkViA9ICcwLjIwJzsKK215ICRWID0gJzAuMjEnOwogCiB1c2UgR2V0b3B0OjpMb25nIHF3KDpjb25maWcgbm9fYXV0b19hYmJyZXYpOwogCkBAIC0zNyw2ICszNyw3IEBACiBteSAkd2ViID0gMDsKIG15ICRzdWJzeXN0ZW0gPSAwOwogbXkgJHN0YXR1cyA9IDA7CitteSAka2V5d29yZHMgPSAxOwogbXkgJGZyb21fZmlsZW5hbWUgPSAwOwogbXkgJHBhdHRlcm5fZGVwdGggPSAwOwogbXkgJHZlcnNpb24gPSAwOwpAQCAtODQsNiArODUsNyBAQAogCQknc2NtIScgPT4gXCRzY20sCiAJCSd3ZWIhJyA9PiBcJHdlYiwKIAkJJ3BhdHRlcm4tZGVwdGg9aScgPT4gXCRwYXR0ZXJuX2RlcHRoLAorCQkna3xrZXl3b3JkcyEnID0+IFwka2V5d29yZHMsCiAJCSdmfGZpbGUnID0+IFwkZnJvbV9maWxlbmFtZSwKIAkJJ3Z8dmVyc2lvbicgPT4gXCR2ZXJzaW9uLAogCQknaHxoZWxwJyA9PiBcJGhlbHAsCkBAIC0xMzIsNiArMTM0LDggQEAKICMjIFJlYWQgTUFJTlRBSU5FUlMgZm9yIHR5cGUvdmFsdWUgcGFpcnMKIAogbXkgQHR5cGV2YWx1ZSA9ICgpOworbXkgJWtleXdvcmRfaGFzaDsKKwogb3BlbihNQUlOVCwgIjwke2xrX3BhdGh9TUFJTlRBSU5FUlMiKSB8fCBkaWUgIiRQOiBDYW4ndCBvcGVuIE1BSU5UQUlORVJTXG4iOwogd2hpbGUgKDxNQUlOVD4pIHsKICAgICBteSAkbGluZSA9ICRfOwpAQCAtMTQ5LDYgKzE1Myw4IEBACiAJICAgIGlmICgoLWQgJHZhbHVlKSkgewogCQkkdmFsdWUgPX4gc0AoW14vXSkkQCQxL0A7CiAJICAgIH0KKwl9IGVsc2lmICgkdHlwZSBlcSAiSyIpIHsKKwkgICAgJGtleXdvcmRfaGFzaHtAdHlwZXZhbHVlfSA9ICR2YWx1ZTsKIAl9CiAJcHVzaChAdHlwZXZhbHVlLCAiJHR5cGU6JHZhbHVlIik7CiAgICAgfSBlbHNpZiAoIS9eKFxzKSokLykgewpAQCAtMTg4LDYgKzE5NCw3IEBACiAKIG15IEBmaWxlcyA9ICgpOwogbXkgQHJhbmdlID0gKCk7CitteSBAa2V5d29yZF90dmkgPSAoKTsKIAogZm9yZWFjaCBteSAkZmlsZSAoQEFSR1YpIHsKICAgICAjI2lmICRmaWxlIGlzIGEgZGlyZWN0b3J5IGFuZCBpdCBsYWNrcyBhIHRyYWlsaW5nIHNsYXNoLCBhZGQgb25lCkBAIC0xOTgsMTEgKzIwNSwyNCBAQAogICAgIH0KICAgICBpZiAoJGZyb21fZmlsZW5hbWUpIHsKIAlwdXNoKEBmaWxlcywgJGZpbGUpOworCWlmICgtZiAkZmlsZSAmJiAka2V5d29yZHMpIHsKKwkgICAgb3BlbihGSUxFLCAiPCRmaWxlIikgb3IgZGllICIkUDogQ2FuJ3Qgb3BlbiAke2ZpbGV9XG4iOworCSAgICB3aGlsZSAoPEZJTEU+KSB7CisJCW15ICRwYXRjaF9saW5lID0gJF87CisJCWZvcmVhY2ggbXkgJGxpbmUgKGtleXMgJWtleXdvcmRfaGFzaCkgeworCQkgICAgaWYgKCRwYXRjaF9saW5lID1+IG0vXi4qJGtleXdvcmRfaGFzaHskbGluZX0veCkgeworCQkJcHVzaChAa2V5d29yZF90dmksICRsaW5lKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIGNsb3NlKEZJTEUpOworCX0KICAgICB9IGVsc2UgewogCW15ICRmaWxlX2NudCA9IEBmaWxlczsKIAlteSAkbGFzdGZpbGU7CiAJb3BlbihQQVRDSCwgIjwkZmlsZSIpIG9yIGRpZSAiJFA6IENhbid0IG9wZW4gJHtmaWxlfVxuIjsKIAl3aGlsZSAoPFBBVENIPikgeworCSAgICBteSAkcGF0Y2hfbGluZSA9ICRfOwogCSAgICBpZiAobS9eXCtcK1wrXHMrKFxTKykvKSB7CiAJCW15ICRmaWxlbmFtZSA9ICQxOwogCQkkZmlsZW5hbWUgPX4gc0BeW14vXSovQEA7CkBAIC0yMTMsNiArMjMzLDEyIEBACiAJCWlmICgkZW1haWxfZ2l0X2JsYW1lKSB7CiAJCSAgICBwdXNoKEByYW5nZSwgIiRsYXN0ZmlsZTokMTokMiIpOwogCQl9CisJICAgIH0gZWxzaWYgKCRrZXl3b3JkcykgeworCQlmb3JlYWNoIG15ICRsaW5lIChrZXlzICVrZXl3b3JkX2hhc2gpIHsKKwkJICAgIGlmICgkcGF0Y2hfbGluZSA9fiBtL15bKy1dLioka2V5d29yZF9oYXNoeyRsaW5lfS94KSB7CisJCQlwdXNoKEBrZXl3b3JkX3R2aSwgJGxpbmUpOworCQkgICAgfQorCQl9CiAJICAgIH0KIAl9CiAJY2xvc2UoUEFUQ0gpOwpAQCAtMjg2LDYgKzMxMiwxMyBAQAogICAgIH0KIH0KIAoraWYgKCRrZXl3b3JkcykgeworICAgIEBrZXl3b3JkX3R2aSA9IHNvcnRfYW5kX3VuaXEoQGtleXdvcmRfdHZpKTsKKyAgICBmb3JlYWNoIG15ICRsaW5lIChAa2V5d29yZF90dmkpIHsKKwlhZGRfY2F0ZWdvcmllcygkbGluZSk7CisgICAgfQorfQorCiBpZiAoJGVtYWlsKSB7CiAgICAgZm9yZWFjaCBteSAkY2hpZWYgKEBwZW5ndWluX2NoaWVmKSB7CiAJaWYgKCRjaGllZiA9fiBtL14oLiopOiguKikvKSB7CkBAIC0zODQsNiArNDE3LDcgQEAKIAogT3RoZXIgb3B0aW9uczoKICAgLS1wYXR0ZXJuLWRlcHRoID0+IE51bWJlciBvZiBwYXR0ZXJuIGRpcmVjdG9yeSB0cmF2ZXJzYWxzIChkZWZhdWx0OiAwIChhbGwpKQorICAtLWtleXdvcmRzID0+IHNjYW4gcGF0Y2ggZm9yIGtleXdvcmRzIChkZWZhdWx0OiAxIChvbikpCiAgIC0tdmVyc2lvbiA9PiBzaG93IHZlcnNpb24KICAgLS1oZWxwID0+IHNob3cgdGhpcyBoZWxwIGluZm9ybWF0aW9uCiAKQEAgLTQ4Niw3ICs1MjAsNiBAQAogfQogCiBzdWIgZmluZF9zdGFydGluZ19pbmRleCB7Ci0KICAgICBteSAoJGluZGV4KSA9IEBfOwogCiAgICAgd2hpbGUgKCRpbmRleCA+IDApIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvaGVhZGVyc19pbnN0YWxsLnBsIGIvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKaW5kZXggYzZhZTQwNS4uYjg5Y2EyYyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKKysrIGIvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKQEAgLTIwLDcgKzIwLDcgQEAKIAogbXkgKCRyZWFkZGlyLCAkaW5zdGFsbGRpciwgJGFyY2gsIEBmaWxlcykgPSBAQVJHVjsKIAotbXkgJHVuaWZkZWYgPSAic2NyaXB0cy91bmlmZGVmIC1VX19LRVJORUxfXyI7CitteSAkdW5pZmRlZiA9ICJzY3JpcHRzL3VuaWZkZWYgLVVfX0tFUk5FTF9fIC1EX19FWFBPUlRFRF9IRUFERVJTX18iOwogCiBmb3JlYWNoIG15ICRmaWxlIChAZmlsZXMpIHsKIAlsb2NhbCAqSU5GSUxFOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKaW5kZXggM2JhYWFlYy4uOTk2MGQxYyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCkBAIC0zOCwxNCArMzgsMTQgQEAKIHN0YXRpYyBjaGFyIGxpbmVbMTI4XTsKIHN0YXRpYyBzdHJ1Y3QgbWVudSAqcm9vdEVudHJ5OwogCi1zdGF0aWMgY2hhciBub2hlbHBfdGV4dFtdID0gTl8oIlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LlxuIik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpCiB7Ci0JaWYgKG1lbnVfaGFzX2hlbHAobWVudSkpCi0JCXJldHVybiBfKG1lbnVfZ2V0X2hlbHAobWVudSkpOwotCWVsc2UKLQkJcmV0dXJuIG5vaGVscF90ZXh0OworCXN0cnVjdCBnc3RyIGhlbHAgPSBzdHJfbmV3KCk7CisKKwltZW51X2dldF9leHRfaGVscChtZW51LCAmaGVscCk7CisKKwlwcmludGYoIlxuJXNcbiIsIHN0cl9nZXQoJmhlbHApKTsKKwlzdHJfZnJlZSgmaGVscCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN0cmlwKGNoYXIgKnN0cikKQEAgLTEyMSw3ICsxMjEsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpCitzdGF0aWMgaW50IGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KQogewogCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKIAljb25zdCBjaGFyICpkZWY7CkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJY2FzZSAnPyc6CiAJCQkvKiBwcmludCBoZWxwICovCiAJCQlpZiAobGluZVsxXSA9PSAnXG4nKSB7Ci0JCQkJcHJpbnRmKCJcbiVzXG4iLCBnZXRfaGVscChtZW51KSk7CisJCQkJcHJpbnRfaGVscChtZW51KTsKIAkJCQlkZWYgPSBOVUxMOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjIwLDcgKzIyMCw3IEBACiAJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKSkKIAkJCXJldHVybiAwOwogaGVscDoKLQkJcHJpbnRmKCJcbiVzXG4iLCBnZXRfaGVscChtZW51KSk7CisJCXByaW50X2hlbHAobWVudSk7CiAJfQogfQogCkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJCWZnZXRzKGxpbmUsIDEyOCwgc3RkaW4pOwogCQkJc3RyaXAobGluZSk7CiAJCQlpZiAobGluZVswXSA9PSAnPycpIHsKLQkJCQlwcmludGYoIlxuJXNcbiIsIGdldF9oZWxwKG1lbnUpKTsKKwkJCQlwcmludF9oZWxwKG1lbnUpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKCFsaW5lWzBdKQpAQCAtMzMxLDcgKzMzMSw3IEBACiAJCWlmICghY2hpbGQpCiAJCQljb250aW51ZTsKIAkJaWYgKGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPT0gJz8nKSB7Ci0JCQlwcmludGYoIlxuJXNcbiIsIGdldF9oZWxwKGNoaWxkKSk7CisJCQlwcmludF9oZWxwKGNoaWxkKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXN5bV9zZXRfY2hvaWNlX3ZhbHVlKHN5bSwgY2hpbGQtPnN5bSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCmluZGV4IGEwNGRhMzQuLmI1NWU3MmYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC01NjAsNyArNTYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNvbmZfc3BsaXRfY29uZmlnKHZvaWQpCitzdGF0aWMgaW50IGNvbmZfc3BsaXRfY29uZmlnKHZvaWQpCiB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAljaGFyIHBhdGhbMTI4XTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCmluZGV4IDU3OWVjZTQuLmVkZDNmMzkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAvKgogICogZTEgfHwgZTIgLT4gPwogICovCi1zdHJ1Y3QgZXhwciAqZXhwcl9qb2luX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQorc3RhdGljIHN0cnVjdCBleHByICpleHByX2pvaW5fb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCiB7CiAJc3RydWN0IGV4cHIgKnRtcDsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW0xLCAqc3ltMjsKQEAgLTQxMiw3ICs0MTIsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgZXhwciAqZXhwcl9qb2luX2FuZChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3N0YXRpYyBzdHJ1Y3QgZXhwciAqZXhwcl9qb2luX2FuZChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKIHsKIAlzdHJ1Y3QgZXhwciAqdG1wOwogCXN0cnVjdCBzeW1ib2wgKnN5bTEsICpzeW0yOwpAQCAtMTA5OCw2ICsxMDk4LDggQEAKIHN0YXRpYyB2b2lkIGV4cHJfcHJpbnRfZ3N0cl9oZWxwZXIodm9pZCAqZGF0YSwgc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpCiB7CiAJc3RyX2FwcGVuZCgoc3RydWN0IGdzdHIqKWRhdGEsIHN0cik7CisJaWYgKHN5bSkKKwkJc3RyX3ByaW50Zigoc3RydWN0IGdzdHIqKWRhdGEsICIgWz0lc10iLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKIH0KIAogdm9pZCBleHByX2dzdHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHN0cnVjdCBnc3RyICpncykKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKaW5kZXggMTk5YjIyYi4uNjU0NjQzNiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTQ1NiwxOSArNDU2LDkgQEAKIAlHdGtUZXh0QnVmZmVyICpidWZmZXI7CiAJR3RrVGV4dEl0ZXIgc3RhcnQsIGVuZDsKIAljb25zdCBjaGFyICpwcm9tcHQgPSBfKG1lbnVfZ2V0X3Byb21wdChtZW51KSk7Ci0JZ2NoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqaGVscDsKKwlzdHJ1Y3QgZ3N0ciBoZWxwID0gc3RyX25ldygpOwogCi0JaGVscCA9IG1lbnVfZ2V0X2hlbHAobWVudSk7Ci0KLQkvKiBHZXR0ZXh0aXplIGlmIHRoZSBoZWxwIHRleHQgbm90IGVtcHR5ICovCi0JaWYgKChoZWxwICE9IDApICYmIChoZWxwWzBdICE9IDApKQotCQloZWxwID0gXyhoZWxwKTsKLQotCWlmIChtZW51LT5zeW0gJiYgbWVudS0+c3ltLT5uYW1lKQotCQluYW1lID0gZ19zdHJkdXBfcHJpbnRmKG1lbnUtPnN5bS0+bmFtZSk7Ci0JZWxzZQotCQluYW1lID0gZ19zdHJkdXAoIiIpOworCW1lbnVfZ2V0X2V4dF9oZWxwKG1lbnUsICZoZWxwKTsKIAogCWJ1ZmZlciA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOwogCWd0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKQEAgLTQ3OCwxNCArNDY4LDExIEBACiAJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOwogCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgcHJvbXB0LCAtMSwgdGFnMSwKIAkJCQkJIE5VTEwpOwotCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfYXRfY3Vyc29yKGJ1ZmZlciwgIiAiLCAxKTsKLQlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7Ci0JZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCBuYW1lLCAtMSwgdGFnMSwKLQkJCQkJIE5VTEwpOwogCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfYXRfY3Vyc29yKGJ1ZmZlciwgIlxuXG4iLCAyKTsKIAlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7Ci0JZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCBoZWxwLCAtMSwgdGFnMiwKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIHN0cl9nZXQoJmhlbHApLCAtMSwgdGFnMiwKIAkJCQkJIE5VTEwpOworCXN0cl9mcmVlKCZoZWxwKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUKaW5kZXggODAzMjMzZi4uYjFjODZjMSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlCisrKyBiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5nbGFkZQpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJCSAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnNfdmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CiAJCSAgPHByb3BlcnR5IG5hbWU9InJ1bGVzX2hpbnQiPkZhbHNlPC9wcm9wZXJ0eT4KIAkJICA8cHJvcGVydHkgbmFtZT0icmVvcmRlcmFibGUiPkZhbHNlPC9wcm9wZXJ0eT4KLQkJICA8cHJvcGVydHkgbmFtZT0iZW5hYmxlX3NlYXJjaCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImVuYWJsZV9zZWFyY2giPkZhbHNlPC9wcm9wZXJ0eT4KIAkJICA8c2lnbmFsIG5hbWU9ImN1cnNvcl9jaGFuZ2VkIiBoYW5kbGVyPSJvbl90cmVldmlldzJfY3Vyc29yX2NoYW5nZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTg6MjIgR01UIi8+CiAJCSAgPHNpZ25hbCBuYW1lPSJidXR0b25fcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3MV9idXR0b25fcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTY6MDM6NTIgR01UIi8+CiAJCSAgPHNpZ25hbCBuYW1lPSJrZXlfcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9rZXlfcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTY6MTE6NDQgR01UIi8+CkBAIC01ODIsNyArNTgyLDcgQEAKIAkJICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnNfdmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CiAJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJydWxlc19oaW50Ij5GYWxzZTwvcHJvcGVydHk+CiAJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZW9yZGVyYWJsZSI+RmFsc2U8L3Byb3BlcnR5PgotCQkgICAgICA8cHJvcGVydHkgbmFtZT0iZW5hYmxlX3NlYXJjaCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVfc2VhcmNoIj5GYWxzZTwvcHJvcGVydHk+CiAJCSAgICAgIDxzaWduYWwgbmFtZT0iY3Vyc29yX2NoYW5nZWQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9jdXJzb3JfY2hhbmdlZCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNTo1Nzo1NSBHTVQiLz4KIAkJICAgICAgPHNpZ25hbCBuYW1lPSJidXR0b25fcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9idXR0b25fcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTc6NTggR01UIi8+CiAJCSAgICAgIDxzaWduYWwgbmFtZT0ia2V5X3ByZXNzX2V2ZW50IiBoYW5kbGVyPSJvbl90cmVldmlldzJfa2V5X3ByZXNzX2V2ZW50IiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE1OjU4OjAxIEdNVCIvPgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jIGIvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jCmluZGV4IDhkOWNlMjIuLmRjYzNmY2MgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYworKysgYi9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZCBtZW51X2J1aWxkX21lc3NhZ2VfbGlzdChzdHJ1Y3QgbWVudSAqbWVudSkKK3N0YXRpYyB2b2lkIG1lbnVfYnVpbGRfbWVzc2FnZV9saXN0KHN0cnVjdCBtZW51ICptZW51KQogewogCXN0cnVjdCBtZW51ICpjaGlsZDsKIApAQCAtMjExLDcgKzIxMSw3IEBACiAJICAgICAgICJtc2dzdHIgXCJcIlxuIiwgc2VsZi0+bXNnKTsKIH0KIAotdm9pZCBtZW51X194Z2V0dGV4dCh2b2lkKQorc3RhdGljIHZvaWQgbWVudV9feGdldHRleHQodm9pZCkKIHsKIAlzdHJ1Y3QgbWVzc2FnZSAqbSA9IG1lc3NhZ2VfX2xpc3Q7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaCBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaAppbmRleCA4ZTY5NDYxLi5mZmViNTMyIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCkBAIC0xNyw2ICsxNyw4IEBACiBQKG1lbnVfZ2V0X3BhcmVudF9tZW51LHN0cnVjdCBtZW51ICosKHN0cnVjdCBtZW51ICptZW51KSk7CiBQKG1lbnVfaGFzX2hlbHAsYm9vbCwoc3RydWN0IG1lbnUgKm1lbnUpKTsKIFAobWVudV9nZXRfaGVscCxjb25zdCBjaGFyICosKHN0cnVjdCBtZW51ICptZW51KSk7CitQKGdldF9zeW1ib2xfc3RyLHZvaWQsKHN0cnVjdCBnc3RyICpyLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1AobWVudV9nZXRfZXh0X2hlbHAsdm9pZCwoc3RydWN0IG1lbnUgKm1lbnUsIHN0cnVjdCBnc3RyICpoZWxwKSk7CiAKIC8qIHN5bWJvbC5jICovCiBQKHN5bWJvbF9oYXNoLHN0cnVjdCBzeW1ib2wgKixbU1lNQk9MX0hBU0hTSVpFXSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCmluZGV4IDI1YjYwYmMuLmQ4Mjk1MzUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCkBAIC0xOTksOCArMTk5LDYgQEAKIHNldG1vZF90ZXh0W10gPSBOXygKIAkiVGhpcyBmZWF0dXJlIGRlcGVuZHMgb24gYW5vdGhlciB3aGljaCBoYXMgYmVlbiBjb25maWd1cmVkIGFzIGEgbW9kdWxlLlxuIgogCSJBcyBhIHJlc3VsdCwgdGhpcyBmZWF0dXJlIHdpbGwgYmUgYnVpbHQgYXMgYSBtb2R1bGUuIiksCi1ub2hlbHBfdGV4dFtdID0gTl8oCi0JIlRoZXJlIGlzIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIGtlcm5lbCBvcHRpb24uXG4iKSwKIGxvYWRfY29uZmlnX3RleHRbXSA9IE5fKAogCSJFbnRlciB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHlvdSB3aXNoIHRvIGxvYWQuICAiCiAJIkFjY2VwdCB0aGUgbmFtZSBzaG93biB0byByZXN0b3JlIHRoZSBjb25maWd1cmF0aW9uIHlvdSAiCkBAIC0yODQsNjYgKzI4Miw2IEBACiBzdGF0aWMgdm9pZCBzaG93X2hlbHB0ZXh0KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0KTsKIHN0YXRpYyB2b2lkIHNob3dfaGVscChzdHJ1Y3QgbWVudSAqbWVudSk7CiAKLXN0YXRpYyB2b2lkIGdldF9wcm9tcHRfc3RyKHN0cnVjdCBnc3RyICpyLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCi17Ci0JaW50IGksIGo7Ci0Jc3RydWN0IG1lbnUgKnN1Ym1lbnVbOF0sICptZW51OwotCi0Jc3RyX3ByaW50ZihyLCBfKCJQcm9tcHQ6ICVzXG4iKSwgXyhwcm9wLT50ZXh0KSk7Ci0Jc3RyX3ByaW50ZihyLCBfKCIgIERlZmluZWQgYXQgJXM6JWRcbiIpLCBwcm9wLT5tZW51LT5maWxlLT5uYW1lLAotCQlwcm9wLT5tZW51LT5saW5lbm8pOwotCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgewotCQlzdHJfYXBwZW5kKHIsIF8oIiAgRGVwZW5kcyBvbjogIikpOwotCQlleHByX2dzdHJfcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCByKTsKLQkJc3RyX2FwcGVuZChyLCAiXG4iKTsKLQl9Ci0JbWVudSA9IHByb3AtPm1lbnUtPnBhcmVudDsKLQlmb3IgKGkgPSAwOyBtZW51ICE9ICZyb290bWVudSAmJiBpIDwgODsgbWVudSA9IG1lbnUtPnBhcmVudCkKLQkJc3VibWVudVtpKytdID0gbWVudTsKLQlpZiAoaSA+IDApIHsKLQkJc3RyX3ByaW50ZihyLCBfKCIgIExvY2F0aW9uOlxuIikpOwotCQlmb3IgKGogPSA0OyAtLWkgPj0gMDsgaiArPSAyKSB7Ci0JCQltZW51ID0gc3VibWVudVtpXTsKLQkJCXN0cl9wcmludGYociwgIiUqYy0+ICVzIiwgaiwgJyAnLCBfKG1lbnVfZ2V0X3Byb21wdChtZW51KSkpOwotCQkJaWYgKG1lbnUtPnN5bSkgewotCQkJCXN0cl9wcmludGYociwgIiAoJXMgWz0lc10pIiwgbWVudS0+c3ltLT5uYW1lID8KLQkJCQkJbWVudS0+c3ltLT5uYW1lIDogXygiPGNob2ljZT4iKSwKLQkJCQkJc3ltX2dldF9zdHJpbmdfdmFsdWUobWVudS0+c3ltKSk7Ci0JCQl9Ci0JCQlzdHJfYXBwZW5kKHIsICJcbiIpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBnZXRfc3ltYm9sX3N0cihzdHJ1Y3QgZ3N0ciAqciwgc3RydWN0IHN5bWJvbCAqc3ltKQotewotCWJvb2wgaGl0OwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQotCWlmIChzeW0gJiYgc3ltLT5uYW1lKQotCQlzdHJfcHJpbnRmKHIsICJTeW1ib2w6ICVzIFs9JXNdXG4iLCBzeW0tPm5hbWUsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOwotCWZvcl9hbGxfcHJvbXB0cyhzeW0sIHByb3ApCi0JCWdldF9wcm9tcHRfc3RyKHIsIHByb3ApOwotCWhpdCA9IGZhbHNlOwotCWZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHByb3AsIFBfU0VMRUNUKSB7Ci0JCWlmICghaGl0KSB7Ci0JCQlzdHJfYXBwZW5kKHIsICIgIFNlbGVjdHM6ICIpOwotCQkJaGl0ID0gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlzdHJfcHJpbnRmKHIsICIgJiYgIik7Ci0JCWV4cHJfZ3N0cl9wcmludChwcm9wLT5leHByLCByKTsKLQl9Ci0JaWYgKGhpdCkKLQkJc3RyX2FwcGVuZChyLCAiXG4iKTsKLQlpZiAoc3ltLT5yZXZfZGVwLmV4cHIpIHsKLQkJc3RyX2FwcGVuZChyLCBfKCIgIFNlbGVjdGVkIGJ5OiAiKSk7Ci0JCWV4cHJfZ3N0cl9wcmludChzeW0tPnJldl9kZXAuZXhwciwgcik7Ci0JCXN0cl9hcHBlbmQociwgIlxuIik7Ci0JfQotCXN0cl9hcHBlbmQociwgIlxuXG4iKTsKLX0KLQogc3RhdGljIHN0cnVjdCBnc3RyIGdldF9yZWxhdGlvbnNfc3RyKHN0cnVjdCBzeW1ib2wgKipzeW1fYXJyKQogewogCXN0cnVjdCBzeW1ib2wgKnN5bTsKQEAgLTY5OSwxOSArNjM3LDkgQEAKIHN0YXRpYyB2b2lkIHNob3dfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKIHsKIAlzdHJ1Y3QgZ3N0ciBoZWxwID0gc3RyX25ldygpOwotCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKIAotCWlmIChtZW51X2hhc19oZWxwKG1lbnUpKQotCXsKLQkJaWYgKHN5bS0+bmFtZSkgewotCQkJc3RyX3ByaW50ZigmaGVscCwgIkNPTkZJR18lczpcblxuIiwgc3ltLT5uYW1lKTsKLQkJCXN0cl9hcHBlbmQoJmhlbHAsIF8obWVudV9nZXRfaGVscChtZW51KSkpOwotCQkJc3RyX2FwcGVuZCgmaGVscCwgIlxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlzdHJfYXBwZW5kKCZoZWxwLCBub2hlbHBfdGV4dCk7Ci0JfQotCWdldF9zeW1ib2xfc3RyKCZoZWxwLCBzeW0pOworCW1lbnVfZ2V0X2V4dF9oZWxwKG1lbnUsICZoZWxwKTsKKwogCXNob3dfaGVscHRleHQoXyhtZW51X2dldF9wcm9tcHQobWVudSkpLCBzdHJfZ2V0KCZoZWxwKSk7CiAJc3RyX2ZyZWUoJmhlbHApOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKaW5kZXggMDdmZjhkMS4uMDU5YTI0NiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCkBAIC05LDYgKzksOSBAQAogI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAorc3RhdGljIGNvbnN0IGNoYXIgbm9oZWxwX3RleHRbXSA9IE5fKAorCSJUaGVyZSBpcyBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBrZXJuZWwgb3B0aW9uLlxuIik7CisKIHN0cnVjdCBtZW51IHJvb3RtZW51Owogc3RhdGljIHN0cnVjdCBtZW51ICoqbGFzdF9lbnRyeV9wdHI7CiAKQEAgLTc0LDcgKzc3LDcgQEAKIAljdXJyZW50X21lbnUgPSBjdXJyZW50X21lbnUtPnBhcmVudDsKIH0KIAotc3RydWN0IGV4cHIgKm1lbnVfY2hlY2tfZGVwKHN0cnVjdCBleHByICplKQorc3RhdGljIHN0cnVjdCBleHByICptZW51X2NoZWNrX2RlcChzdHJ1Y3QgZXhwciAqZSkKIHsKIAlpZiAoIWUpCiAJCXJldHVybiBlOwpAQCAtMTg0LDcgKzE4Nyw3IEBACiAJICAgICAgIChzeW0yLT50eXBlID09IFNfVU5LTk9XTiAmJiBzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3ltMi0+bmFtZSkpOwogfQogCi12b2lkIHN5bV9jaGVja19wcm9wKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3N0YXRpYyB2b2lkIHN5bV9jaGVja19wcm9wKHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJc3RydWN0IHN5bWJvbCAqc3ltMjsKQEAgLTQ1MSwzICs0NTQsODAgQEAKIAllbHNlCiAJCXJldHVybiAiIjsKIH0KKworc3RhdGljIHZvaWQgZ2V0X3Byb21wdF9zdHIoc3RydWN0IGdzdHIgKnIsIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgbWVudSAqc3VibWVudVs4XSwgKm1lbnU7CisKKwlzdHJfcHJpbnRmKHIsIF8oIlByb21wdDogJXNcbiIpLCBfKHByb3AtPnRleHQpKTsKKwlzdHJfcHJpbnRmKHIsIF8oIiAgRGVmaW5lZCBhdCAlczolZFxuIiksIHByb3AtPm1lbnUtPmZpbGUtPm5hbWUsCisJCXByb3AtPm1lbnUtPmxpbmVubyk7CisJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCXN0cl9hcHBlbmQociwgXygiICBEZXBlbmRzIG9uOiAiKSk7CisJCWV4cHJfZ3N0cl9wcmludChwcm9wLT52aXNpYmxlLmV4cHIsIHIpOworCQlzdHJfYXBwZW5kKHIsICJcbiIpOworCX0KKwltZW51ID0gcHJvcC0+bWVudS0+cGFyZW50OworCWZvciAoaSA9IDA7IG1lbnUgIT0gJnJvb3RtZW51ICYmIGkgPCA4OyBtZW51ID0gbWVudS0+cGFyZW50KQorCQlzdWJtZW51W2krK10gPSBtZW51OworCWlmIChpID4gMCkgeworCQlzdHJfcHJpbnRmKHIsIF8oIiAgTG9jYXRpb246XG4iKSk7CisJCWZvciAoaiA9IDQ7IC0taSA+PSAwOyBqICs9IDIpIHsKKwkJCW1lbnUgPSBzdWJtZW51W2ldOworCQkJc3RyX3ByaW50ZihyLCAiJSpjLT4gJXMiLCBqLCAnICcsIF8obWVudV9nZXRfcHJvbXB0KG1lbnUpKSk7CisJCQlpZiAobWVudS0+c3ltKSB7CisJCQkJc3RyX3ByaW50ZihyLCAiICglcyBbPSVzXSkiLCBtZW51LT5zeW0tPm5hbWUgPworCQkJCQltZW51LT5zeW0tPm5hbWUgOiBfKCI8Y2hvaWNlPiIpLAorCQkJCQlzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pKTsKKwkJCX0KKwkJCXN0cl9hcHBlbmQociwgIlxuIik7CisJCX0KKwl9Cit9CisKK3ZvaWQgZ2V0X3N5bWJvbF9zdHIoc3RydWN0IGdzdHIgKnIsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlib29sIGhpdDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlpZiAoc3ltICYmIHN5bS0+bmFtZSkKKwkJc3RyX3ByaW50ZihyLCAiU3ltYm9sOiAlcyBbPSVzXVxuIiwgc3ltLT5uYW1lLAorCQkJICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisJZm9yX2FsbF9wcm9tcHRzKHN5bSwgcHJvcCkKKwkJZ2V0X3Byb21wdF9zdHIociwgcHJvcCk7CisJaGl0ID0gZmFsc2U7CisJZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgcHJvcCwgUF9TRUxFQ1QpIHsKKwkJaWYgKCFoaXQpIHsKKwkJCXN0cl9hcHBlbmQociwgIiAgU2VsZWN0czogIik7CisJCQloaXQgPSB0cnVlOworCQl9IGVsc2UKKwkJCXN0cl9wcmludGYociwgIiAmJiAiKTsKKwkJZXhwcl9nc3RyX3ByaW50KHByb3AtPmV4cHIsIHIpOworCX0KKwlpZiAoaGl0KQorCQlzdHJfYXBwZW5kKHIsICJcbiIpOworCWlmIChzeW0tPnJldl9kZXAuZXhwcikgeworCQlzdHJfYXBwZW5kKHIsIF8oIiAgU2VsZWN0ZWQgYnk6ICIpKTsKKwkJZXhwcl9nc3RyX3ByaW50KHN5bS0+cmV2X2RlcC5leHByLCByKTsKKwkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwl9CisJc3RyX2FwcGVuZChyLCAiXG5cbiIpOworfQorCit2b2lkIG1lbnVfZ2V0X2V4dF9oZWxwKHN0cnVjdCBtZW51ICptZW51LCBzdHJ1Y3QgZ3N0ciAqaGVscCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisKKwlpZiAobWVudV9oYXNfaGVscChtZW51KSkgeworCQlpZiAoc3ltLT5uYW1lKSB7CisJCQlzdHJfcHJpbnRmKGhlbHAsICJDT05GSUdfJXM6XG5cbiIsIHN5bS0+bmFtZSk7CisJCQlzdHJfYXBwZW5kKGhlbHAsIF8obWVudV9nZXRfaGVscChtZW51KSkpOworCQkJc3RyX2FwcGVuZChoZWxwLCAiXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cl9hcHBlbmQoaGVscCwgbm9oZWxwX3RleHQpOworCX0KKwlpZiAoc3ltKQorCQlnZXRfc3ltYm9sX3N0cihoZWxwLCBzeW0pOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCmluZGV4IGNlN2Q1MDguLjAwYzUxNTAgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYworKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKQEAgLTEwNDIsMTIgKzEwNDIsMTAgQEAKIAkJaWYgKHNob3dEZWJ1ZygpKQogCQkJZGVidWcgPSBkZWJ1Z19pbmZvKHN5bSk7CiAKLQkJaGVscCA9IG1lbnVfZ2V0X2hlbHAobWVudSk7Ci0JCS8qIEdldHRleHRpemUgaWYgdGhlIGhlbHAgdGV4dCBub3QgZW1wdHkgKi8KLQkJaWYgKGhlbHAuaXNFbXB0eSgpKQotCQkJaGVscCA9IHByaW50X2ZpbHRlcihtZW51X2dldF9oZWxwKG1lbnUpKTsKLQkJZWxzZQotCQkJaGVscCA9IHByaW50X2ZpbHRlcihfKG1lbnVfZ2V0X2hlbHAobWVudSkpKTsKKwkJc3RydWN0IGdzdHIgaGVscF9nc3RyID0gc3RyX25ldygpOworCQltZW51X2dldF9leHRfaGVscChtZW51LCAmaGVscF9nc3RyKTsKKwkJaGVscCA9IHByaW50X2ZpbHRlcihzdHJfZ2V0KCZoZWxwX2dzdHIpKTsKKwkJc3RyX2ZyZWUoJmhlbHBfZ3N0cik7CiAJfSBlbHNlIGlmIChtZW51LT5wcm9tcHQpIHsKIAkJaGVhZCArPSAiPGJpZz48Yj4iOwogCQloZWFkICs9IHByaW50X2ZpbHRlcihfKG1lbnUtPnByb21wdC0+dGV4dCkpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jIGIvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCmluZGV4IDE4ZjNlNWMuLjZjOGZiYmIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYworKysgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogc3RydWN0IGV4cHIgKnN5bV9lbnZfbGlzdDsKIAotdm9pZCBzeW1fYWRkX2RlZmF1bHQoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpkZWYpCitzdGF0aWMgdm9pZCBzeW1fYWRkX2RlZmF1bHQoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpkZWYpCiB7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gcHJvcF9hbGxvYyhQX0RFRkFVTFQsIHN5bSk7CiAKQEAgLTEyNSw3ICsxMjUsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgcHJvcGVydHkgKnN5bV9nZXRfcmFuZ2VfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCitzdGF0aWMgc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X3JhbmdlX3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQogewogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIApAQCAtOTQzLDcgKzk0Myw3IEBACiAJcmV0dXJuICJ1bmtub3duIjsKIH0KIAotdm9pZCBwcm9wX2FkZF9lbnYoY29uc3QgY2hhciAqZW52KQorc3RhdGljIHZvaWQgcHJvcF9hZGRfZW52KGNvbnN0IGNoYXIgKmVudikKIHsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW0sICpzeW0yOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFya3VwX29vcHMucGwgYi9zY3JpcHRzL21hcmt1cF9vb3BzLnBsCmluZGV4IDg5Nzc0MDEuLjVmMGZjYjcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbWFya3VwX29vcHMucGwKKysrIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbApAQCAtMTg0LDEwICsxODQsNyBAQAogCiAjIGlmIGl0J3MgYSBtb2R1bGUsIHdlIG5lZWQgdG8gZmluZCB0aGUgLmtvIGZpbGUgYW5kIGNhbGN1bGF0ZSBhIGxvYWQgb2Zmc2V0CiBpZiAoJG1vZHVsZSBuZSAiIikgewotCW15ICRkaXIgPSBkaXJuYW1lKCRmaWxlbmFtZSk7Ci0JJGRpciA9ICRkaXIgLiAiLyI7Ci0JbXkgJG1vZCA9ICRtb2R1bGUgLiAiLmtvIjsKLQlteSAkbW9kdWxlZmlsZSA9IGBmaW5kICRkaXIgLW5hbWUgJG1vZCB8IGhlYWQgLTFgOworCW15ICRtb2R1bGVmaWxlID0gYG1vZGluZm8gJG1vZHVsZSB8IGdyZXAgJ15maWxlbmFtZTonIHwgYXdrICd7IHByaW50IFwkMiB9J2A7CiAJY2hvbXAoJG1vZHVsZWZpbGUpOwogCSRmaWxlbmFtZSA9ICRtb2R1bGVmaWxlOwogCWlmICgkZmlsZW5hbWUgZXEgIiIpIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWtjb21waWxlX2ggYi9zY3JpcHRzL21rY29tcGlsZV9oCmluZGV4IDZhMTJkZDkuLmJjZTNkMGYgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvbWtjb21waWxlX2gKKysrIGIvc2NyaXB0cy9ta2NvbXBpbGVfaApAQCAtMSwzICsxLDUgQEAKKyMhL2Jpbi9zaAorCiBUQVJHRVQ9JDEKIEFSQ0g9JDIKIFNNUD0kMwpAQCAtNTAsNyArNTIsNyBAQAogIyBUcnVuY2F0ZSB0byBtYXhpbXVtIGxlbmd0aAogCiBVVFNfTEVOPTY0Ci1VVFNfVFJVTkNBVEU9InNlZCAtZSBzL1woLlx7MSwkVVRTX0xFTlx9XCkuKi9cMS8iCitVVFNfVFJVTkNBVEU9ImN1dCAtYiAtJFVUU19MRU4iCiAKICMgR2VuZXJhdGUgYSB0ZW1wb3JhcnkgY29tcGlsZS5oCiAKQEAgLTY2LDkgKzY4LDEzIEBACiAgIGVjaG8gXCNkZWZpbmUgTElOVVhfQ09NUElMRV9IT1NUIFwiYGhvc3RuYW1lIHwgJFVUU19UUlVOQ0FURWBcIgogCiAgIGlmIFsgLXggL2Jpbi9kbnNkb21haW5uYW1lIF07IHRoZW4KLSAgICBlY2hvIFwjZGVmaW5lIExJTlVYX0NPTVBJTEVfRE9NQUlOIFwiYGRuc2RvbWFpbm5hbWUgfCAkVVRTX1RSVU5DQVRFYFwiCisgICAgZG9tYWluPWBkbnNkb21haW5uYW1lIDI+IC9kZXYvbnVsbGAKICAgZWxpZiBbIC14IC9iaW4vZG9tYWlubmFtZSBdOyB0aGVuCi0gICAgZWNobyBcI2RlZmluZSBMSU5VWF9DT01QSUxFX0RPTUFJTiBcImBkb21haW5uYW1lIHwgJFVUU19UUlVOQ0FURWBcIgorICAgIGRvbWFpbj1gZG9tYWlubmFtZSAyPiAvZGV2L251bGxgCisgIGZpCisKKyAgaWYgWyAtbiAiJGRvbWFpbiIgXTsgdGhlbgorICAgIGVjaG8gXCNkZWZpbmUgTElOVVhfQ09NUElMRV9ET01BSU4gXCJgZWNobyAkZG9tYWluIHwgJFVUU19UUlVOQ0FURWBcIgogICBlbHNlCiAgICAgZWNobyBcI2RlZmluZSBMSU5VWF9DT01QSUxFX0RPTUFJTgogICBmaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlIGIvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlCmluZGV4IGZhNGEwYTEuLmY2N2NjODggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9NYWtlZmlsZQorKysgYi9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDkgQEAKICMgZSkgZ2VuZXJhdGUgdGhlIHJwbSBmaWxlcywgYmFzZWQgb24ga2VybmVsLnNwZWMKICMgLSBVc2UgLy4gdG8gYXZvaWQgdGFyIHBhY2tpbmcganVzdCB0aGUgc3ltbGluawogCisjIE5vdGUgdGhhdCB0aGUgcnBtLXBrZyB0YXJnZXQgY2Fubm90IGJlIHVzZWQgd2l0aCBLQlVJTERfT1VUUFVULAorIyBidXQgdGhlIGJpbnJwbS1wa2cgdGFyZ2V0IGNhbjsgZm9yIHNvbWUgcmVhc29uIE89IGdldHMgaWdub3JlZC4KKwogIyBEbyB3ZSBoYXZlIHJwbWJ1aWxkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBvbGRlciBycG0KIFJQTSA6PSAkKHNoZWxsIGlmIFsgLXggIi91c3IvYmluL3JwbWJ1aWxkIiBdOyB0aGVuIGVjaG8gcnBtYnVpbGQ7IFwKIAkgICAgICAgICAgIGVsc2UgZWNobyBycG07IGZpKQpAQCAtMzMsNiArMzYsMTIgQEAKIAkkKENPTkZJR19TSEVMTCkgJChNS1NQRUMpID4gJEAKIAogcnBtLXBrZyBycG06ICQob2JqdHJlZSkva2VybmVsLnNwZWMgRk9SQ0UKKwlAaWYgdGVzdCAtbiAiJChLQlVJTERfT1VUUFVUKSI7IHRoZW4gXAorCQllY2hvICJCdWlsZGluZyBzb3VyY2UgKyBiaW5hcnkgUlBNIGlzIG5vdCBwb3NzaWJsZSBvdXRzaWRlIHRoZSI7IFwKKwkJZWNobyAia2VybmVsIHNvdXJjZSB0cmVlLiBEb24ndCBzZXQgS0JVSUxEX09VVFBVVCwgb3IgdXNlIHRoZSI7IFwKKwkJZWNobyAiYmlucnBtLXBrZyB0YXJnZXQgaW5zdGVhZC4iOyBcCisJCWZhbHNlOyBcCisJZmkKIAkkKE1BS0UpIGNsZWFuCiAJJChQUkVWKSBsbiAtc2YgJChzcmN0cmVlKSAkKEtFUk5FTFBBVEgpCiAJJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24gPiAkKG9ianRyZWUpLy5zY212ZXJzaW9uCkBAIC02MSw3ICs3MCw3IEBACiAJc2V0IC1lOyBcCiAJbXYgLWYgJChvYmp0cmVlKS8udG1wX3ZlcnNpb24gJChvYmp0cmVlKS8udmVyc2lvbgogCi0JJChSUE0pICQoUlBNT1BUUykgLS1kZWZpbmUgIl9idWlsZGRpciAkKHNyY3RyZWUpIiAtLXRhcmdldCBcCisJJChSUE0pICQoUlBNT1BUUykgLS1kZWZpbmUgIl9idWlsZGRpciAkKG9ianRyZWUpIiAtLXRhcmdldCBcCiAJCSQoVVRTX01BQ0hJTkUpIC1iYiAkPAogCiBjbGVhbi1maWxlcyArPSAkKG9ianRyZWUpL2Jpbmtlcm5lbC5zcGVjCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjIGIvc2NyaXB0cy9wYWNrYWdlL21rc3BlYwppbmRleCAzZDkzZjhjLi40N2JkZDJmIDEwMDc1NQotLS0gYS9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjCisrKyBiL3NjcmlwdHMvcGFja2FnZS9ta3NwZWMKQEAgLTcwLDcgKzcwLDcgQEAKIGVjaG8gJ21rZGlyIC1wICRSUE1fQlVJTERfUk9PVC9saWIvZmlybXdhcmUnCiBlY2hvICIlZW5kaWYiCiAKLWVjaG8gJ0lOU1RBTExfTU9EX1BBVEg9JFJQTV9CVUlMRF9ST09UIG1ha2UgJXtfc21wX21mbGFnc30gbW9kdWxlc19pbnN0YWxsJworZWNobyAnSU5TVEFMTF9NT0RfUEFUSD0kUlBNX0JVSUxEX1JPT1QgbWFrZSAle19zbXBfbWZsYWdzfSBLQlVJTERfU1JDPSBtb2R1bGVzX2luc3RhbGwnCiBlY2hvICIlaWZhcmNoIGlhNjQiCiBlY2hvICdjcCAkS0JVSUxEX0lNQUdFICRSUE1fQlVJTERfUk9PVCciL2Jvb3QvZWZpL3ZtbGludXotJEtFUk5FTFJFTEVBU0UiCiBlY2hvICdsbiAtcyAnImVmaS92bWxpbnV6LSRLRVJORUxSRUxFQVNFIiAnJFJQTV9CVUlMRF9ST09UJyIvYm9vdC8iCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RhZ3Muc2ggYi9zY3JpcHRzL3RhZ3Muc2gKaW5kZXggNGEzNGVjNS4uZDUyZjdhMCAxMDA3NTUKLS0tIGEvc2NyaXB0cy90YWdzLnNoCisrKyBiL3NjcmlwdHMvdGFncy5zaApAQCAtMTAxLDcgKzEwMSw4IEBACiAJLUkgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJLUkgX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcCAgICAgICAgICAgICAgICBcCiAJLUkgRVhQT1JUX1NZTUJPTCxFWFBPUlRfU1lNQk9MX0dQTCAgICAgICAgICAgICAgICAgICAgICBcCi0JLS1leHRyYT0rZiAtLWMta2luZHM9K3B4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJLUkgREVGSU5FX1RSQUNFLEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTCxFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMIFwKKwktLWV4dHJhPStmIC0tYy1raW5kcz0tcHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAktLXJlZ2V4LWFzbT0nL15FTlRSWVwoKFteKV0qKVwpLiovXDEvJyAgICAgICAgICAgICAgICAgIFwKIAktLXJlZ2V4LWM9Jy9eU1lTQ0FMTF9ERUZJTkVbWzpkaWdpdDpdXT9cKChbXiwpXSopLiovc3lzX1wxLycKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jIGIvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jCmluZGV4IGI4MTg2YmEuLjZjZjhmZDIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYworKysgYi9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMKQEAgLTYxLDcgKzYxLDggQEAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzIGRldmljZXNfc3Vic3lzOwogCiBzdGF0aWMgaW50IGRldmNncm91cF9jYW5fYXR0YWNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKLQkJc3RydWN0IGNncm91cCAqbmV3X2Nncm91cCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorCQlzdHJ1Y3QgY2dyb3VwICpuZXdfY2dyb3VwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCWJvb2wgdGhyZWFkZ3JvdXApCiB7CiAJaWYgKGN1cnJlbnQgIT0gdGFzayAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07CmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9mcy5jIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfZnMuYwppbmRleCA4ZTk3NzdiLi4wYzcyYzljIDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9mcy5jCisrKyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2ZzLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAlyZXR1cm4gaW1hX3Nob3dfaHRhYmxlX3ZhbHVlKGJ1ZiwgY291bnQsIHBwb3MsICZpbWFfaHRhYmxlLnZpb2xhdGlvbnMpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbWFfaHRhYmxlX3Zpb2xhdGlvbnNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW1hX2h0YWJsZV92aW9sYXRpb25zX29wcyA9IHsKIAkucmVhZCA9IGltYV9zaG93X2h0YWJsZV92aW9sYXRpb25zCiB9OwogCkBAIC01NSw3ICs1NSw3IEBACiAKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW1hX21lYXN1cmVtZW50c19jb3VudF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbWFfbWVhc3VyZW1lbnRzX2NvdW50X29wcyA9IHsKIAkucmVhZCA9IGltYV9zaG93X21lYXN1cmVtZW50c19jb3VudAogfTsKIApAQCAtMTU4LDcgKzE1OCw3IEBACiAJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpbWFfbWVhc3VybWVudHNfc2Vxb3BzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW1hX21lYXN1cmVtZW50c19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbWFfbWVhc3VyZW1lbnRzX29wcyA9IHsKIAkub3BlbiA9IGltYV9tZWFzdXJlbWVudHNfb3BlbiwKIAkucmVhZCA9IHNlcV9yZWFkLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCkBAIC0yMzMsNyArMjMzLDcgQEAKIAlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmltYV9hc2NpaV9tZWFzdXJlbWVudHNfc2Vxb3BzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW1hX2FzY2lpX21lYXN1cmVtZW50c19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbWFfYXNjaWlfbWVhc3VyZW1lbnRzX29wcyA9IHsKIAkub3BlbiA9IGltYV9hc2NpaV9tZWFzdXJlbWVudHNfb3BlbiwKIAkucmVhZCA9IHNlcV9yZWFkLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCkBAIC0zMTMsNyArMzEzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW1hX21lYXN1cmVfcG9saWN5X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGltYV9tZWFzdXJlX3BvbGljeV9vcHMgPSB7CiAJLm9wZW4gPSBpbWFfb3Blbl9wb2xpY3ksCiAJLndyaXRlID0gaW1hX3dyaXRlX3BvbGljeSwKIAkucmVsZWFzZSA9IGltYV9yZWxlYXNlX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9nYy5jIGIvc2VjdXJpdHkva2V5cy9nYy5jCmluZGV4IDQ4NWZjNjIuLjQ3NzBiZTMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvZ2MuYworKysgYi9zZWN1cml0eS9rZXlzL2djLmMKQEAgLTE2OSw5ICsxNjksOSBAQAogCiAJLyogdHJhd2wgdGhyb3VnaCB0aGUga2V5cyBsb29raW5nIGZvciBrZXlyaW5ncyAqLwogCWZvciAoOzspIHsKLQkJaWYgKGtleS0+ZXhwaXJ5ID4gbm93ICYmIGtleS0+ZXhwaXJ5IDwgbmV3X3RpbWVyKSB7CisJCWlmIChrZXktPmV4cGlyeSA+IGxpbWl0ICYmIGtleS0+ZXhwaXJ5IDwgbmV3X3RpbWVyKSB7CiAJCQlrZGVidWcoIndpbGwgZXhwaXJlICV4IGluICVsZCIsCi0JCQkgICAgICAga2V5X3NlcmlhbChrZXkpLCBrZXktPmV4cGlyeSAtIG5vdyk7CisJCQkgICAgICAga2V5X3NlcmlhbChrZXkpLCBrZXktPmV4cGlyeSAtIGxpbWl0KTsKIAkJCW5ld190aW1lciA9IGtleS0+ZXhwaXJ5OwogCQl9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMgYi9zZWN1cml0eS9rZXlzL2tleWN0bC5jCmluZGV4IDJmYjI4ZWYuLjA2ZWM3MjIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwpAQCAtODczLDcgKzg3Myw3IEBACiAJLyogb3RoZXJ3aXNlIHNwZWNpZnkgdGhlIGRlc3RpbmF0aW9uIGtleXJpbmcgcmVjb3JkZWQgaW4gdGhlCiAJICogYXV0aG9yaXNhdGlvbiBrZXkgKGFueSBLRVlfU1BFQ18qX0tFWVJJTkcpICovCiAJaWYgKHJpbmdpZCA+PSBLRVlfU1BFQ19SRVFVRVNUT1JfS0VZUklORykgewotCQkqX2Rlc3Rfa2V5cmluZyA9IHJrYS0+ZGVzdF9rZXlyaW5nOworCQkqX2Rlc3Rfa2V5cmluZyA9IGtleV9nZXQocmthLT5kZXN0X2tleXJpbmcpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2xzbV9hdWRpdC5jIGIvc2VjdXJpdHkvbHNtX2F1ZGl0LmMKaW5kZXggNTAwYWFkMC4uM2JiOTBiNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvbHNtX2F1ZGl0LmMKKysrIGIvc2VjdXJpdHkvbHNtX2F1ZGl0LmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQkJCSAgIGNoYXIgKm5hbWUxLCBjaGFyICpuYW1lMikKIHsKIAlpZiAoIWlwdjZfYWRkcl9hbnkoYWRkcikpCi0JCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9JXBJNiIsIG5hbWUxLCBhZGRyKTsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiAlcz0lcEk2YyIsIG5hbWUxLCBhZGRyKTsKIAlpZiAocG9ydCkKIAkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiAlcz0lZCIsIG5hbWUyLCBudG9ocyhwb3J0KSk7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9taW5fYWRkci5jIGIvc2VjdXJpdHkvbWluX2FkZHIuYwppbmRleCAxNGNjN2IzLi5jODQ0ZWVkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9taW5fYWRkci5jCisrKyBiL3NlY3VyaXR5L21pbl9hZGRyLmMKQEAgLTI4LDEyICsyOCwxMiBAQAogICogc3lzY3RsIGhhbmRsZXIgd2hpY2gganVzdCBzZXRzIGRhY19tbWFwX21pbl9hZGRyID0gdGhlIG5ldyB2YWx1ZSBhbmQgdGhlbgogICogY2FsbHMgdXBkYXRlX21tYXBfbWluX2FkZHIoKSBzbyBub24gTUFQX0ZJWEVEIGhpbnRzIGdldCByb3VuZGVkIHByb3Blcmx5CiAgKi8KLWludCBtbWFwX21pbl9hZGRyX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCitpbnQgbW1hcF9taW5fYWRkcl9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWludCByZXQ7CiAKLQlyZXQgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXQgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAogCXVwZGF0ZV9tbWFwX21pbl9hZGRyKCk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCmluZGV4IDFlZDBmMDc2Li5iNGI1ZGExIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKQEAgLTg2OCw4ICs4NjgsMTkgQEAKIAogdm9pZCBhdmNfZGlzYWJsZSh2b2lkKQogewotCWF2Y19mbHVzaCgpOwotCXN5bmNocm9uaXplX3JjdSgpOwotCWlmIChhdmNfbm9kZV9jYWNoZXApCi0JCWttZW1fY2FjaGVfZGVzdHJveShhdmNfbm9kZV9jYWNoZXApOworCS8qCisJICogSWYgeW91IGFyZSBsb29raW5nIGF0IHRoaXMgYmVjYXVzZSB5b3UgaGF2ZSByZWFsaXplZCB0aGF0IHdlIGFyZQorCSAqIG5vdCBkZXN0cm95aW5nIHRoZSBhdmNfbm9kZV9jYWNoZXAgaXQgbWlnaHQgYmUgZWFzeSB0byBmaXgsIGJ1dAorCSAqIEkgZG9uJ3Qga25vdyB0aGUgbWVtb3J5IGJhcnJpZXIgc2VtYW50aWNzIHdlbGwgZW5vdWdoIHRvIGtub3cuICBJdCdzCisJICogcG9zc2libGUgdGhhdCBzb21lIG90aGVyIHRhc2sgZGVyZWZlcmVuY2VkIHNlY3VyaXR5X29wcyB3aGVuCisJICogaXQgc3RpbGwgcG9pbnRlZCB0byBzZWxpbnV4IG9wZXJhdGlvbnMuICBJZiB0aGF0IGlzIHRoZSBjYXNlIGl0J3MKKwkgKiBwb3NzaWJsZSB0aGF0IGl0IGlzIGFib3V0IHRvIHVzZSB0aGUgYXZjIGFuZCBpcyBhYm91dCB0byBuZWVkIHRoZQorCSAqIGF2Y19ub2RlX2NhY2hlcC4gIEkga25vdyBJIGNvdWxkIHdyYXAgdGhlIHNlY3VyaXR5LmMgc2VjdXJpdHlfb3BzIGNhbGwKKwkgKiBpbiBhbiByY3VfbG9jaywgYnV0IHNlcmlvdXNseSwgaXQncyBub3Qgd29ydGggaXQuICBJbnN0ZWFkIEkganVzdCBmbHVzaAorCSAqIHRoZSBjYWNoZSBhbmQgZ2V0IHRoYXQgbWVtb3J5IGJhY2suCisJICovCisJaWYgKGF2Y19ub2RlX2NhY2hlcCkgeworCQlhdmNfZmx1c2goKTsKKwkJLyoga21lbV9jYWNoZV9kZXN0cm95KGF2Y19ub2RlX2NhY2hlcCk7ICovCisJfQogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IDQxN2Y3YzkuLmJiMjMwZDUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTI0MTEsNyArMjQxMSw3IEBACiAJLyogV2FrZSB1cCB0aGUgcGFyZW50IGlmIGl0IGlzIHdhaXRpbmcgc28gdGhhdCBpdCBjYW4gcmVjaGVjawogCSAqIHdhaXQgcGVybWlzc2lvbiB0byB0aGUgbmV3IHRhc2sgU0lELiAqLwogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdXJyZW50LT5yZWFsX3BhcmVudC0+c2lnbmFsLT53YWl0X2NobGRleGl0KTsKKwlfX3dha2VfdXBfcGFyZW50KGN1cnJlbnQsIGN1cnJlbnQtPnJlYWxfcGFyZW50KTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3MvdGFzLmMgYi9zb3VuZC9hb2EvY29kZWNzL3Rhcy5jCmluZGV4IGYwZWJjOTcxLi4xZGQ2NmRkIDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29kZWNzL3Rhcy5jCisrKyBiL3NvdW5kL2FvYS9jb2RlY3MvdGFzLmMKQEAgLTg5Nyw2ICs4OTcsMTUgQEAKIAljbGllbnQgPSBpMmNfbmV3X2RldmljZShhZGFwdGVyLCAmaW5mbyk7CiAJaWYgKCFjbGllbnQpCiAJCXJldHVybiAtRU5PREVWOworCS8qCisJICogV2Uga25vdyB0aGUgZHJpdmVyIGlzIGFscmVhZHkgbG9hZGVkLCBzbyB0aGUgZGV2aWNlIHNob3VsZCBiZQorCSAqIGFscmVhZHkgYm91bmQuIElmIG5vdCBpdCBtZWFucyBiaW5kaW5nIGZhaWxlZCwgYW5kIHRoZW4gdGhlcmUKKwkgKiBpcyBubyBwb2ludCBpbiBrZWVwaW5nIHRoZSBkZXZpY2UgaW5zdGFudGlhdGVkLgorCSAqLworCWlmICghY2xpZW50LT5kcml2ZXIpIHsKKwkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGNsaWVudCk7CisJCXJldHVybiAtRU5PREVWOworCX0KIAogCS8qCiAJICogTGV0IGkyYy1jb3JlIGRlbGV0ZSB0aGF0IGRldmljZSBvbiBkcml2ZXIgcmVtb3ZhbC4KZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9hYWNpLmMgYi9zb3VuZC9hcm0vYWFjaS5jCmluZGV4IGRjNzgyNzIuLjFmMGY4MjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9hYWNpLmMKKysrIGIvc291bmQvYXJtL2FhY2kuYwpAQCAtOTM3LDYgKzkzNyw3IEBACiAJc3RydWN0IHNuZF9hYzk3ICphYzk3OwogCWludCByZXQ7CiAKKwl3cml0ZWwoMCwgYWFjaS0+YmFzZSArIEFDOTdfUE9XRVJET1dOKTsKIAkvKgogCSAqIEFzc2VydCBBQUNJUkVTRVQgZm9yIDJ1cwogCSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMgYi9zb3VuZC9hcm0vcHhhMnh4LWFjOTcuYwppbmRleCA0ZTM0ZDE5Li5iNGI0OGFmIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTcuYworKysgYi9zb3VuZC9hcm0vcHhhMnh4LWFjOTcuYwpAQCAtMTM3LDkgKzEzNyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHhhMnh4X2FjOTdfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhMnh4X2FjOTdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChjYXJkKQpAQCAtMTQ4LDkgKzE0OCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBweGEyeHhfYWM5N19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBweGEyeHhfYWM5N19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoY2FyZCkKQEAgLTE1OSw5ICsxNTksMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZWxzZQotI2RlZmluZSBweGEyeHhfYWM5N19zdXNwZW5kCU5VTEwKLSNkZWZpbmUgcHhhMnh4X2FjOTdfcmVzdW1lCU5VTEwKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBweGEyeHhfYWM5N19wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBweGEyeHhfYWM5N19zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHhhMnh4X2FjOTdfcmVzdW1lLAorfTsKICNlbmRpZgogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBweGEyeHhfYWM5N19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCkBAIC0yNDEsMTEgKzI0MiwxMiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHhhMnh4X2FjOTdfZHJpdmVyID0gewogCS5wcm9iZQkJPSBweGEyeHhfYWM5N19wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHB4YTJ4eF9hYzk3X3JlbW92ZSksCi0JLnN1c3BlbmQJPSBweGEyeHhfYWM5N19zdXNwZW5kLAotCS5yZXN1bWUJCT0gcHhhMnh4X2FjOTdfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJweGEyeHgtYWM5NyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmcHhhMnh4X2FjOTdfcG1fb3BzLAorI2VuZGlmCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtLmMgYi9zb3VuZC9jb3JlL3BjbS5jCmluZGV4IDBjMTQ0MDEuLmM2OWM2MGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtLmMKKysrIGIvc291bmQvY29yZS9wY20uYwpAQCAtOTUzLDExICs5NTMsMTIgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAlzdHJ1Y3Qgc25kX3BjbV9ub3RpZnkgKm5vdGlmeTsKIAljaGFyIHN0clsxNl07Ci0Jc3RydWN0IHNuZF9wY20gKnBjbSA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlpZiAoc25kX0JVR19PTighcGNtIHx8ICFkZXZpY2UpKQorCWlmIChzbmRfQlVHX09OKCFkZXZpY2UgfHwgIWRldmljZS0+ZGV2aWNlX2RhdGEpKQogCQlyZXR1cm4gLUVOWElPOworCXBjbSA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCWVyciA9IHNuZF9wY21fYWRkKHBjbSk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCA1NjFkNmQ5Li5hYjczZWRmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtMjk4NSw3ICsyOTg1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzbmRfcGNtX3ZtX29wc19zdGF0dXMgPQorc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzbmRfcGNtX3ZtX29wc19zdGF0dXMgPQogewogCS5mYXVsdCA9CXNuZF9wY21fbW1hcF9zdGF0dXNfZmF1bHQsCiB9OwpAQCAtMzAyNCw3ICszMDI0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzbmRfcGNtX3ZtX29wc19jb250cm9sID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc25kX3BjbV92bV9vcHNfY29udHJvbCA9CiB7CiAJLmZhdWx0ID0Jc25kX3BjbV9tbWFwX2NvbnRyb2xfZmF1bHQsCiB9OwpAQCAtMzA5NCw3ICszMDk0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzbmRfcGNtX3ZtX29wc19kYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc25kX3BjbV92bV9vcHNfZGF0YSA9CiB7CiAJLm9wZW4gPQkJc25kX3BjbV9tbWFwX2RhdGFfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcGNtX21tYXBfZGF0YV9jbG9zZSwKQEAgLTMxMTgsNyArMzExOCw3IEBACiAgKiBtbWFwIHRoZSBETUEgYnVmZmVyIG9uIEkvTyBtZW1vcnkgYXJlYQogICovCiAjaWYgU05EUlZfUENNX0lORk9fTU1BUF9JT01FTQotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzbmRfcGNtX3ZtX29wc19kYXRhX21taW8gPQorc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzbmRfcGNtX3ZtX29wc19kYXRhX21taW8gPQogewogCS5vcGVuID0JCXNuZF9wY21fbW1hcF9kYXRhX29wZW4sCiAJLmNsb3NlID0Jc25kX3BjbV9tbWFwX2RhdGFfY2xvc2UsCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL2R1bW15LmMgYi9zb3VuZC9kcml2ZXJzL2R1bW15LmMKaW5kZXggNmJhMDY2Yy4uMjUyZTA0YyAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9kdW1teS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvZHVtbXkuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiBtb2R1bGVfcGFyYW1fYXJyYXkocGNtX2RldnMsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBjbV9kZXZzLCAiUENNIGRldmljZXMgIyAoMC00KSBmb3IgZHVtbXkgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KHBjbV9zdWJzdHJlYW1zLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhwY21fc3Vic3RyZWFtcywgIlBDTSBzdWJzdHJlYW1zICMgKDEtMTYpIGZvciBkdW1teSBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKHBjbV9zdWJzdHJlYW1zLCAiUENNIHN1YnN0cmVhbXMgIyAoMS0xMjgpIGZvciBkdW1teSBkcml2ZXIuIik7CiAvL21vZHVsZV9wYXJhbV9hcnJheShtaWRpX2RldnMsIGludCwgTlVMTCwgMDQ0NCk7CiAvL01PRFVMRV9QQVJNX0RFU0MobWlkaV9kZXZzLCAiTUlESSBkZXZpY2VzICMgKDAtMikgZm9yIGR1bW15IGRyaXZlci4iKTsKIG1vZHVsZV9wYXJhbShmYWtlX2J1ZmZlciwgYm9vbCwgMDQ0NCk7CkBAIC04MDgsOCArODA4LDYgQEAKIAl1bnNpZ25lZCBpbnQgaWR4OwogCWludCBlcnI7CiAKLQlpZiAoc25kX0JVR19PTighZHVtbXkpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlzcGluX2xvY2tfaW5pdCgmZHVtbXktPm1peGVyX2xvY2spOwogCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJEdW1teSBNaXhlciIpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19taWRpLmMgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19taWRpLmMKaW5kZXggNmU3ZDA5YS4uN2Q3MjJhMCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbWlkaS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX21pZGkuYwpAQCAtMjksNiArMjksOCBAQAogCiBleHRlcm4gaW50IHVzZV9pbnRlcm5hbF9kcnVtczsKIAorc3RhdGljIHZvaWQgc25kX29wbDNfbm90ZV9vZmZfdW5zYWZlKHZvaWQgKnAsIGludCBub3RlLCBpbnQgdmVsLAorCQkJCSAgICAgc3RydWN0IHNuZF9taWRpX2NoYW5uZWwgKmNoYW4pOwogLyoKICAqIFRoZSBuZXh0IHRhYmxlIGxvb2tzIG1hZ2ljYWwsIGJ1dCBpdCBjZXJ0YWlubHkgaXMgbm90LiBJdHMgdmFsdWVzIGhhdmUKICAqIGJlZW4gY2FsY3VsYXRlZCBhcyB0YWJsZVtpXT04KmxvZyhpLzY0KS9sb2coMikgd2l0aCBhbiBvYnZpb3VzIGV4Y2VwdGlvbgpAQCAtMjQyLDE2ICsyNDQsMjAgQEAKIAlpbnQgYWdhaW4gPSAwOwogCWludCBpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm9wbDMtPnN5c190aW1lcl9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm9wbDMtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSAwOyBpIDwgb3BsMy0+bWF4X3ZvaWNlczsgaSsrKSB7CiAJCXN0cnVjdCBzbmRfb3BsM192b2ljZSAqdnAgPSAmb3BsMy0+dm9pY2VzW2ldOwogCQlpZiAodnAtPnN0YXRlID4gMCAmJiB2cC0+bm90ZV9vZmZfY2hlY2spIHsKIAkJCWlmICh2cC0+bm90ZV9vZmYgPT0gamlmZmllcykKLQkJCQlzbmRfb3BsM19ub3RlX29mZihvcGwzLCB2cC0+bm90ZSwgMCwgdnAtPmNoYW4pOworCQkJCXNuZF9vcGwzX25vdGVfb2ZmX3Vuc2FmZShvcGwzLCB2cC0+bm90ZSwgMCwKKwkJCQkJCQkgdnAtPmNoYW4pOwogCQkJZWxzZQogCQkJCWFnYWluKys7CiAJCX0KIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BsMy0+dm9pY2VfbG9jaywgZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9wbDMtPnN5c190aW1lcl9sb2NrLCBmbGFncyk7CiAJaWYgKGFnYWluKSB7CiAJCW9wbDMtPnRsaXN0LmV4cGlyZXMgPSBqaWZmaWVzICsgMTsJLyogaW52b2tlIGFnYWluICovCiAJCWFkZF90aW1lcigmb3BsMy0+dGxpc3QpOwpAQCAtNjU4LDE1ICs2NjQsMTQgQEAKIC8qCiAgKiBSZWxlYXNlIGEgbm90ZSBpbiByZXNwb25zZSB0byBhIG1pZGkgbm90ZSBvZmYuCiAgKi8KLXZvaWQgc25kX29wbDNfbm90ZV9vZmYodm9pZCAqcCwgaW50IG5vdGUsIGludCB2ZWwsIHN0cnVjdCBzbmRfbWlkaV9jaGFubmVsICpjaGFuKQorc3RhdGljIHZvaWQgc25kX29wbDNfbm90ZV9vZmZfdW5zYWZlKHZvaWQgKnAsIGludCBub3RlLCBpbnQgdmVsLAorCQkJCSAgICAgc3RydWN0IHNuZF9taWRpX2NoYW5uZWwgKmNoYW4pCiB7CiAgIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAKIAlpbnQgdm9pY2U7CiAJc3RydWN0IHNuZF9vcGwzX3ZvaWNlICp2cDsKIAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlvcGwzID0gcDsKIAogI2lmZGVmIERFQlVHX01JREkKQEAgLTY3NCwxMiArNjc5LDkgQEAKIAkJICAgY2hhbi0+bnVtYmVyLCBjaGFuLT5taWRpX3Byb2dyYW0sIG5vdGUpOwogI2VuZGlmCiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmb3BsMy0+dm9pY2VfbG9jaywgZmxhZ3MpOwotCiAJaWYgKG9wbDMtPnN5bnRoX21vZGUgPT0gU05EUlZfT1BMM19NT0RFX1NFUSkgewogCQlpZiAoY2hhbi0+ZHJ1bV9jaGFubmVsICYmIHVzZV9pbnRlcm5hbF9kcnVtcykgewogCQkJc25kX29wbDNfZHJ1bV9zd2l0Y2gob3BsMywgbm90ZSwgdmVsLCAwLCBjaGFuKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wbDMtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybjsKIAkJfQogCQkvKiB0aGlzIGxvb3Agd2lsbCBob3BlZnVsbHkga2lsbCBhbGwgZXh0cmEgdm9pY2VzLCBiZWNhdXNlCkBAIC02OTcsNiArNjk5LDE2IEBACiAJCQlzbmRfb3BsM19raWxsX3ZvaWNlKG9wbDMsIHZvaWNlKTsKIAkJfQogCX0KK30KKwordm9pZCBzbmRfb3BsM19ub3RlX29mZih2b2lkICpwLCBpbnQgbm90ZSwgaW50IHZlbCwKKwkJICAgICAgIHN0cnVjdCBzbmRfbWlkaV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBzbmRfb3BsMyAqb3BsMyA9IHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvcGwzLT52b2ljZV9sb2NrLCBmbGFncyk7CisJc25kX29wbDNfbm90ZV9vZmZfdW5zYWZlKHAsIG5vdGUsIHZlbCwgY2hhbik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BsMy0+dm9pY2VfbG9jaywgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcF9saWIuYyBiL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwX2xpYi5jCmluZGV4IDg0Y2MyNjUuLmUxMTQ1YWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwX2xpYi5jCisrKyBiL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwX2xpYi5jCkBAIC0zOSwyNSArMzksMjAgQEAKIC8qIHdyaXRlIHRoZSBwb3J0IGFuZCByZXR1cm5zIHRoZSBuZXh0IGV4cGlyZSB0aW1lIGluIG5zOwogICogY2FsbGVkIGF0IHRoZSB0cmlnZ2VyLXN0YXJ0IGFuZCBpbiBocnRpbWVyIGNhbGxiYWNrCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBjc3BfdGltZXJfdXBkYXRlKHN0cnVjdCBocnRpbWVyICpoYW5kbGUpCitzdGF0aWMgdTY0IHBjc3BfdGltZXJfdXBkYXRlKHN0cnVjdCBzbmRfcGNzcCAqY2hpcCkKIHsKIAl1bnNpZ25lZCBjaGFyIHRpbWVyX2NudCwgdmFsOwogCXU2NCBuczsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwotCXN0cnVjdCBzbmRfcGNzcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCBzbmRfcGNzcCwgdGltZXIpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY2hpcC0+dGhhbGYpIHsKIAkJb3V0YihjaGlwLT52YWw2MSwgMHg2MSk7CiAJCWNoaXAtPnRoYWxmID0gMDsKLQkJaWYgKCFhdG9taWNfcmVhZCgmY2hpcC0+dGltZXJfYWN0aXZlKSkKLQkJCXJldHVybiAwOwogCQlyZXR1cm4gY2hpcC0+bnNfcmVtOwogCX0KIAotCWlmICghYXRvbWljX3JlYWQoJmNoaXAtPnRpbWVyX2FjdGl2ZSkpCi0JCXJldHVybiAwOwogCXN1YnN0cmVhbSA9IGNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbTsKIAlpZiAoIXN1YnN0cmVhbSkKIAkJcmV0dXJuIDA7CkBAIC04OCwyNCArODMsMTcgQEAKIAlyZXR1cm4gbnM7CiB9CiAKLWVudW0gaHJ0aW1lcl9yZXN0YXJ0IHBjc3BfZG9fdGltZXIoc3RydWN0IGhydGltZXIgKmhhbmRsZSkKK3N0YXRpYyB2b2lkIHBjc3BfcG9pbnRlcl91cGRhdGUoc3RydWN0IHNuZF9wY3NwICpjaGlwKQogewotCXN0cnVjdCBzbmRfcGNzcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCBzbmRfcGNzcCwgdGltZXIpOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwotCWludCBwZXJpb2RzX2VsYXBzZWQsIHBvaW50ZXJfdXBkYXRlOwogCXNpemVfdCBwZXJpb2RfYnl0ZXMsIGJ1ZmZlcl9ieXRlczsKLQl1bnNpZ25lZCBsb25nIG5zOworCWludCBwZXJpb2RzX2VsYXBzZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXBvaW50ZXJfdXBkYXRlID0gIWNoaXAtPnRoYWxmOwotCW5zID0gcGNzcF90aW1lcl91cGRhdGUoaGFuZGxlKTsKLQlpZiAoIW5zKQotCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Ci0KIAkvKiB1cGRhdGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uICovCiAJc3Vic3RyZWFtID0gY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtOwogCWlmICghc3Vic3RyZWFtKQotCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CisJCXJldHVybjsKIAogCXBlcmlvZF9ieXRlcyA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwogCWJ1ZmZlcl9ieXRlcyA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwpAQCAtMTM0LDYgKzEyMiwyNiBAQAogCiAJaWYgKHBlcmlvZHNfZWxhcHNlZCkKIAkJdGFza2xldF9zY2hlZHVsZSgmcGNzcF9wY21fdGFza2xldCk7Cit9CisKK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IHBjc3BfZG9fdGltZXIoc3RydWN0IGhydGltZXIgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qgc25kX3Bjc3AgKmNoaXAgPSBjb250YWluZXJfb2YoaGFuZGxlLCBzdHJ1Y3Qgc25kX3Bjc3AsIHRpbWVyKTsKKwlpbnQgcG9pbnRlcl91cGRhdGU7CisJdTY0IG5zOworCisJaWYgKCFhdG9taWNfcmVhZCgmY2hpcC0+dGltZXJfYWN0aXZlKSB8fCAhY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKQorCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CisKKwlwb2ludGVyX3VwZGF0ZSA9ICFjaGlwLT50aGFsZjsKKwlucyA9IHBjc3BfdGltZXJfdXBkYXRlKGNoaXApOworCWlmICghbnMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENTUDogdW5leHBlY3RlZCBzdG9wXG4iKTsKKwkJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOworCX0KKworCWlmIChwb2ludGVyX3VwZGF0ZSkKKwkJcGNzcF9wb2ludGVyX3VwZGF0ZShjaGlwKTsKIAogCWhydGltZXJfZm9yd2FyZChoYW5kbGUsIGhydGltZXJfZ2V0X2V4cGlyZXMoaGFuZGxlKSwgbnNfdG9fa3RpbWUobnMpKTsKIApAQCAtMTQyLDggKzE1MCw2IEBACiAKIHN0YXRpYyBpbnQgcGNzcF9zdGFydF9wbGF5aW5nKHN0cnVjdCBzbmRfcGNzcCAqY2hpcCkKIHsKLQl1bnNpZ25lZCBsb25nIG5zOwotCiAjaWYgUENTUF9ERUJVRwogCXByaW50ayhLRVJOX0lORk8gIlBDU1A6IHN0YXJ0X3BsYXlpbmcgY2FsbGVkXG4iKTsKICNlbmRpZgpAQCAtMTU5LDExICsxNjUsNyBAQAogCWF0b21pY19zZXQoJmNoaXAtPnRpbWVyX2FjdGl2ZSwgMSk7CiAJY2hpcC0+dGhhbGYgPSAwOwogCi0JbnMgPSBwY3NwX3RpbWVyX3VwZGF0ZSgmcGNzcF9jaGlwLnRpbWVyKTsKLQlpZiAoIW5zKQotCQlyZXR1cm4gLUVJTzsKLQotCWhydGltZXJfc3RhcnQoJnBjc3BfY2hpcC50aW1lciwga3RpbWVfc2V0KDAsIG5zKSwgSFJUSU1FUl9NT0RFX1JFTCk7CisJaHJ0aW1lcl9zdGFydCgmcGNzcF9jaGlwLnRpbWVyLCBrdGltZV9zZXQoMCwgMCksIEhSVElNRVJfTU9ERV9SRUwpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzIsMjEgKzIzNCwyMiBAQAogc3RhdGljIGludCBzbmRfcGNzcF9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfcGNzcCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLSNpZiBQQ1NQX0RFQlVHCi0JcHJpbnRrKEtFUk5fSU5GTyAiUENTUDogcHJlcGFyZSBjYWxsZWQsICIKLQkJCSJzaXplPSV6aSBwc2l6ZT0lemkgZj0lemkgZjE9JWlcbiIsCi0JCQlzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSwKLQkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pLAotCQkJc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkgLwotCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSksCi0JCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHMpOwotI2VuZGlmCiAJcGNzcF9zeW5jX3N0b3AoY2hpcCk7CiAJY2hpcC0+cGxheWJhY2tfcHRyID0gMDsKIAljaGlwLT5wZXJpb2RfcHRyID0gMDsKIAljaGlwLT5mbXRfc2l6ZSA9CiAJCXNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKHN1YnN0cmVhbS0+cnVudGltZS0+Zm9ybWF0KSA+PiAzOwogCWNoaXAtPmlzX3NpZ25lZCA9IHNuZF9wY21fZm9ybWF0X3NpZ25lZChzdWJzdHJlYW0tPnJ1bnRpbWUtPmZvcm1hdCk7CisjaWYgUENTUF9ERUJVRworCXByaW50ayhLRVJOX0lORk8gIlBDU1A6IHByZXBhcmUgY2FsbGVkLCAiCisJCQkic2l6ZT0lemkgcHNpemU9JXppIGY9JXppIGYxPSVpIGZzaXplPSVpXG4iLAorCQkJc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSksCisJCQlzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSwKKwkJCXNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pIC8KKwkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pLAorCQkJc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzLAorCQkJY2hpcC0+Zm10X3NpemUpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwX21peGVyLmMgYi9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcF9taXhlci5jCmluZGV4IDE5OWIwMzMuLjkwM2JjODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwX21peGVyLmMKKysrIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3BfbWl4ZXIuYwpAQCAtNzIsNyArNzIsNyBAQAogCWlmICh0cmVibGUgIT0gY2hpcC0+dHJlYmxlKSB7CiAJCWNoaXAtPnRyZWJsZSA9IHRyZWJsZTsKICNpZiBQQ1NQX0RFQlVHCi0JCXByaW50ayhLRVJOX0lORk8gIlBDU1A6IHJhdGUgc2V0IHRvICVpXG4iLCBQQ1NQX1JBVEUoKSk7CisJCXByaW50ayhLRVJOX0lORk8gIlBDU1A6IHJhdGUgc2V0IHRvICVsaVxuIiwgUENTUF9SQVRFKCkpOwogI2VuZGlmCiAJCWNoYW5nZWQgPSAxOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL21pcHMvaGFsMi5jIGIvc291bmQvbWlwcy9oYWwyLmMKaW5kZXggYzUyNjkxYy4uOWE4OGNkZiAxMDA2NDQKLS0tIGEvc291bmQvbWlwcy9oYWwyLmMKKysrIGIvc291bmQvbWlwcy9oYWwyLmMKQEAgLTkxNSw3ICs5MTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBoYWwyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgaGFsMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIApkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9zZ2lvMmF1ZGlvLmMgYi9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYwppbmRleCBlNDk3NTI1Li44NjkxZjRjIDEwMDY0NAotLS0gYS9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYworKysgYi9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYwpAQCAtOTczLDcgKzk3Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19leGl0IHNuZF9zZ2lvMmF1ZGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgc25kX3NnaW8yYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BhcmlzYy9oYXJtb255LmMgYi9zb3VuZC9wYXJpc2MvaGFybW9ueS5jCmluZGV4IGU5MjQ0OTIuLmY0N2Y5ZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BhcmlzYy9oYXJtb255LmMKKysrIGIvc291bmQvcGFyaXNjL2hhcm1vbnkuYwpAQCAtNjI0LDYgKzYyNCw5IEBACiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlpbnQgZXJyOwogCisJaWYgKHNuZF9CVUdfT04oIWgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWhhcm1vbnlfZGlzYWJsZV9pbnRlcnJ1cHRzKGgpOwogCQogICAgCWVyciA9IHNuZF9wY21fbmV3KGgtPmNhcmQsICJoYXJtb255IiwgMCwgMSwgMSwgJnBjbSk7CkBAIC04NjUsMTEgKzg2OCwxMiBAQAogc3RhdGljIGludCBfX2RldmluaXQKIHNuZF9oYXJtb255X21peGVyX2luaXQoc3RydWN0IHNuZF9oYXJtb255ICpoKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGgtPmNhcmQ7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBpZHgsIGVycjsKIAogCWlmIChzbmRfQlVHX09OKCFoKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJY2FyZCA9IGgtPmNhcmQ7CiAJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgIkhhcm1vbnkgR2FpbiBjb250cm9sIGludGVyZmFjZSIpOwogCiAJZm9yIChpZHggPSAwOyBpZHggPCBIQVJNT05ZX0NPTlRST0xTOyBpZHgrKykgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL0tjb25maWcgYi9zb3VuZC9wY2kvS2NvbmZpZwppbmRleCBmYjVlZTNjLi43NWM2MDJiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvS2NvbmZpZworKysgYi9zb3VuZC9wY2kvS2NvbmZpZwpAQCAtMjU5LDcgKzI1OSw2IEBACiAKIGNvbmZpZyBTTkRfQ1M1NTM1QVVESU8KIAl0cmlzdGF0ZSAiQ1M1NTM1L0NTNTUzNiBBdWRpbyIKLQlkZXBlbmRzIG9uIFg4NiAmJiAhWDg2XzY0CiAJc2VsZWN0IFNORF9QQ00KIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKIAloZWxwCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKaW5kZXggYjQ1OGQyMC4uYWFmNGRhNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCisrKyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwpAQCAtOTczLDcgKzk3Myw3IEBACiAJdm9pZCAqcHJpdmF0ZV9kYXRhOwogCiAJc25kX2FsaV9wcmludGsoImZyZWVfdm9pY2U6IGNoYW5uZWw9JWRcbiIscHZvaWNlLT5udW1iZXIpOwotCWlmIChwdm9pY2UgPT0gTlVMTCB8fCAhcHZvaWNlLT51c2UpCisJaWYgKCFwdm9pY2UtPnVzZSkKIAkJcmV0dXJuOwogCXNuZF9hbGlfY2xlYXJfdm9pY2VzKGNvZGVjLCBwdm9pY2UtPm51bWJlciwgcHZvaWNlLT5udW1iZXIpOwogCXNwaW5fbG9ja19pcnEoJmNvZGVjLT52b2ljZV9hbGxvYyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYnQ4N3guYyBiL3NvdW5kL3BjaS9idDg3eC5jCmluZGV4IDI0NTg1YzYuLjRlMmI5MjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9idDg3eC5jCisrKyBiL3NvdW5kL3BjaS9idDg3eC5jCkBAIC04MDgsNiArODA4LDggQEAKIAlCVF9ERVZJQ0UoUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc4LCAweDEwMDIsIDB4MDAwMSwgR0VORVJJQyksCiAJLyogTGVhZHRlayBXaW5mYXN0IHR2IDIwMDB4cCBkZWx1eCAqLwogCUJUX0RFVklDRShQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzgsIDB4MTA3ZCwgMHg2NjA2LCBHRU5FUklDKSwKKwkvKiBQaW5uYWNsZSBQQ1RWICovCisJQlRfREVWSUNFKFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg3OCwgMHgxMWJkLCAweDAwMTIsIEdFTkVSSUMpLAogCS8qIFZvb2RvbyBUViAyMDAgKi8KIAlCVF9ERVZJQ0UoUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc4LCAweDEyMWEsIDB4MzAwMCwgR0VORVJJQyksCiAJLyogQXNrZXkgQ29tcHV0ZXIgQ29ycC4gTWFnaWNUVmlldyc5OSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMgYi9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYwppbmRleCBiMWIzYTY0Li43NTQ1NDY0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYworKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYwpAQCAtMTAzNyw3ICsxMDM3LDcgQEAKIAogc3RhdGljIGludCBhdGNfbGluZV9zdXJyb3VuZF91bm11dGUoc3RydWN0IGN0X2F0YyAqYXRjLCB1bnNpZ25lZCBjaGFyIHN0YXRlKQogewotCXJldHVybiBhdGNfZGFpb191bm11dGUoYXRjLCBzdGF0ZSwgTElORU80KTsKKwlyZXR1cm4gYXRjX2RhaW9fdW5tdXRlKGF0Yywgc3RhdGUsIExJTkVPMik7CiB9CiAKIHN0YXRpYyBpbnQgYXRjX2xpbmVfY2xmZV91bm11dGUoc3RydWN0IGN0X2F0YyAqYXRjLCB1bnNpZ25lZCBjaGFyIHN0YXRlKQpAQCAtMTA0Nyw3ICsxMDQ3LDcgQEAKIAogc3RhdGljIGludCBhdGNfbGluZV9yZWFyX3VubXV0ZShzdHJ1Y3QgY3RfYXRjICphdGMsIHVuc2lnbmVkIGNoYXIgc3RhdGUpCiB7Ci0JcmV0dXJuIGF0Y19kYWlvX3VubXV0ZShhdGMsIHN0YXRlLCBMSU5FTzIpOworCXJldHVybiBhdGNfZGFpb191bm11dGUoYXRjLCBzdGF0ZSwgTElORU80KTsKIH0KIAogc3RhdGljIGludCBhdGNfbGluZV9pbl91bm11dGUoc3RydWN0IGN0X2F0YyAqYXRjLCB1bnNpZ25lZCBjaGFyIHN0YXRlKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKaW5kZXggZGEyMDY1Yy4uMTMwNWY3YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCkBAIC05NTAsNyArOTUwLDcgQEAKIAlDb250cm9sIGludGVyZmFjZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIEVDSE9DQVJEX0hBU19WTUlYRVIKKyNpZiAhZGVmaW5lZChFQ0hPQ0FSRF9IQVNfVk1JWEVSKSB8fCBkZWZpbmVkKEVDSE9DQVJEX0hBU19MSU5FX09VVF9HQUlOKQogCiAvKioqKioqKioqKioqKioqKioqKiBQQ00gb3V0cHV0IHZvbHVtZSAqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBzbmRfZWNob19vdXRwdXRfZ2Fpbl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMTAwMyw2ICsxMDAzLDE5IEBACiAJcmV0dXJuIGNoYW5nZWQ7CiB9CiAKKyNpZmRlZiBFQ0hPQ0FSRF9IQVNfTElORV9PVVRfR0FJTgorLyogT24gdGhlIE1pYSB0aGlzIG9uZSBjb250cm9scyB0aGUgbGluZS1vdXQgdm9sdW1lICovCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2VjaG9fbGluZV9vdXRwdXRfZ2FpbiBfX2RldmluaXRkYXRhID0geworCS5uYW1lID0gIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAorCS5pbmZvID0gc25kX2VjaG9fb3V0cHV0X2dhaW5faW5mbywKKwkuZ2V0ID0gc25kX2VjaG9fb3V0cHV0X2dhaW5fZ2V0LAorCS5wdXQgPSBzbmRfZWNob19vdXRwdXRfZ2Fpbl9wdXQsCisJLnRsdiA9IHsucCA9IGRiX3NjYWxlX291dHB1dF9nYWlufSwKK307CisjZWxzZQogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lY2hvX3BjbV9vdXRwdXRfZ2FpbiBfX2RldmluaXRkYXRhID0gewogCS5uYW1lID0gIlBDTSBQbGF5YmFjayBWb2x1bWUiLAogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApAQCAtMTAxMiw5ICsxMDI1LDEwIEBACiAJLnB1dCA9IHNuZF9lY2hvX291dHB1dF9nYWluX3B1dCwKIAkudGx2ID0gey5wID0gZGJfc2NhbGVfb3V0cHV0X2dhaW59LAogfTsKLQogI2VuZGlmCiAKKyNlbmRpZiAvKiAhRUNIT0NBUkRfSEFTX1ZNSVhFUiB8fCBFQ0hPQ0FSRF9IQVNfTElORV9PVVRfR0FJTiAqLworCiAKIAogI2lmZGVmIEVDSE9DQVJEX0hBU19JTlBVVF9HQUlOCkBAIC0yMDMwLDEwICsyMDQ0LDE4IEBACiAJc25kX2VjaG9fdm1peGVyLmNvdW50ID0gbnVtX3BpcGVzX291dChjaGlwKSAqIG51bV9idXNzZXNfb3V0KGNoaXApOwogCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZWNob192bWl4ZXIsIGNoaXApKSkgPCAwKQogCQlnb3RvIGN0bF9lcnJvcjsKLSNlbHNlCi0JaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9lY2hvX3BjbV9vdXRwdXRfZ2FpbiwgY2hpcCkpKSA8IDApCisjaWZkZWYgRUNIT0NBUkRfSEFTX0xJTkVfT1VUX0dBSU4KKwllcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLAorCQkJICBzbmRfY3RsX25ldzEoJnNuZF9lY2hvX2xpbmVfb3V0cHV0X2dhaW4sIGNoaXApKTsKKwlpZiAoZXJyIDwgMCkKIAkJZ290byBjdGxfZXJyb3I7CiAjZW5kaWYKKyNlbHNlIC8qIEVDSE9DQVJEX0hBU19WTUlYRVIgKi8KKwllcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLAorCQkJICBzbmRfY3RsX25ldzEoJnNuZF9lY2hvX3BjbV9vdXRwdXRfZ2FpbiwgY2hpcCkpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGN0bF9lcnJvcjsKKyNlbmRpZiAvKiBFQ0hPQ0FSRF9IQVNfVk1JWEVSICovCiAKICNpZmRlZiBFQ0hPQ0FSRF9IQVNfSU5QVVRfR0FJTgogCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZWNob19saW5lX2lucHV0X2dhaW4sIGNoaXApKSkgPCAwKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhLmMKaW5kZXggZjNiOWI0NS4uZjA1YzhjMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21pYS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjZGVmaW5lIEVDSE9DQVJEX0hBU19BREFUCUZBTFNFCiAjZGVmaW5lIEVDSE9DQVJEX0hBU19TVEVSRU9fQklHX0VORElBTjMyCiAjZGVmaW5lIEVDSE9DQVJEX0hBU19NSURJCisjZGVmaW5lIEVDSE9DQVJEX0hBU19MSU5FX09VVF9HQUlOCiAKIC8qIFBpcGUgaW5kZXhlcyAqLwogI2RlZmluZSBQWF9BTkFMT0dfT1VUCTAJLyogOCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKaW5kZXggMjBhNjZmOC4uZTM0MDc5MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC0yMzAzLDYgKzIzMDMsNyBAQAogICogd2hpdGUtbGlzdCBmb3IgZW5hYmxlX21zaQogICovCiBzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgbXNpX3doaXRlX2xpc3RbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwZjcsICJIUCBQYXZpbGlvbiBkdjR0LTEzMDAiLCAxKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzNjA3LCAiSFAgQ29tcGEgQ1E0MCIsIDEpLAogCXt9CiB9OwpAQCAtMjY3Myw2ICsyNjc0LDcgQEAKIAl7IFBDSV9ERVZJQ0UoMHgxMGRlLCAweDA0NGIpLCAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX05WSURJQSB9LAogCXsgUENJX0RFVklDRSgweDEwZGUsIDB4MDU1YyksIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfTlZJRElBIH0sCiAJeyBQQ0lfREVWSUNFKDB4MTBkZSwgMHgwNTVkKSwgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9OVklESUEgfSwKKwl7IFBDSV9ERVZJQ0UoMHgxMGRlLCAweDA1OTApLCAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX05WSURJQSB9LAogCXsgUENJX0RFVklDRSgweDEwZGUsIDB4MDc3NCksIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfTlZJRElBIH0sCiAJeyBQQ0lfREVWSUNFKDB4MTBkZSwgMHgwNzc1KSwgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9OVklESUEgfSwKIAl7IFBDSV9ERVZJQ0UoMHgxMGRlLCAweDA3NzYpLCAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX05WSURJQSB9LApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggMjE1ZTcyYS4uMmQ2MDNmNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC00MDMyLDYgKzQwMzIsMTI3IEBACiB9CiAKIC8qCisgKiBIUCBUb3VjaHNtYXJ0CisgKiBwb3J0LUEgKDB4MTEpICAgICAgLSBmcm9udCBocC1vdXQKKyAqIHBvcnQtQiAoMHgxNCkgICAgICAtIHVudXNlZAorICogcG9ydC1DICgweDE1KSAgICAgIC0gdW51c2VkCisgKiBwb3J0LUQgKDB4MTIpICAgICAgLSByZWFyIGxpbmUgb3V0CisgKiBwb3J0LUUgKDB4MWMpICAgICAgLSBmcm9udCBtaWMtaW4KKyAqIHBvcnQtRiAoMHgxNikgICAgICAtIEludGVybmFsIHNwZWFrZXJzCisgKiBkaWdpdGFsLW1pYyAoMHgxNykgLSBJbnRlcm5hbCBtaWMKKyAqLworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFkMTk4NGFfdG91Y2hzbWFydF92ZXJic1tdID0geworCS8qIERBQ3M7IHVubXV0ZSBhcyBkZWZhdWx0ICovCisJezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4Mjd9LCAvKiAwZEIgKi8KKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgyN30sIC8qIDBkQiAqLworCS8qIFBvcnQtQSAoSFApIG1peGVyIC0gcm91dGUgb25seSBmcm9tIGFuYWxvZyBtaXhlciAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCS8qIFBvcnQtQSBwaW4gKi8KKwl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCS8qIFBvcnQtQSAoSFApIHBpbiAtIGFsd2F5cyB1bm11dGVkICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwkvKiBQb3J0LUUgKGludCBzcGVha2VyKSBtaXhlciAtIHJvdXRlIG9ubHkgZnJvbSBhbmFsb2cgbWl4ZXIgKi8KKwl7MHgyNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwM30sCisJLyogUG9ydC1FIHBpbiAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwkvKiBQb3J0LUYgKGludCBzcGVha2VyKSBtaXhlciAtIHJvdXRlIG9ubHkgZnJvbSBhbmFsb2cgbWl4ZXIgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkvKiBQb3J0LUYgcGluICovCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBBbmFsb2cgbWl4ZXI7IG11dGUgYXMgZGVmYXVsdCAqLworCXsweDIwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgyMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MjAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwl7MHgyMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNSl9LAorCS8qIEFuYWxvZyBNaXggb3V0cHV0IGFtcCAqLworCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIGNhcHR1cmUgc291cmNlcyAqLworCS8qIHsweDBjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwgKi8gLyogc2V0IHZpYSB1bnNvbCAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgcGluLXNlbnNlICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBRDE4ODRBX0hQX0VWRU5UfSwKKwl7MHgxYywgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFEMTg4NEFfTUlDX0VWRU5UfSwKKwkvKiBhbGxvdyB0byB0b3VjaCBHUElPMSAoZm9yIG11dGUgY29udHJvbCkgKi8KKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDAyfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDJ9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDJ9LCAvKiBmaXJzdCBtdXRlZCAqLworCS8qIGludGVybmFsIG1pYyAtIGRtaWMgKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCS8qIHNldCBtYWdpYyBDT0VGcyBmb3IgZG1pYyAqLworCXsweDAxLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDEzZjd9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4MDh9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZDE5ODRhX3RvdWNoc21hcnRfbWl4ZXJzW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCisvKglIREFfQ09ERUNfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksKi8KKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKKwkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCisJCS5wdXQgPSBhZDE4ODRhX21vYmlsZV9tYXN0ZXJfc3dfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgyMSwgMywgMCwgSERBX09VVFBVVCksCisJfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMHgyMCwgMHg1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMHgyMCwgMHg1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MjUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIHN3aXRjaCB0byBleHRlcm5hbCBtaWMgaWYgcGx1Z2dlZCAqLworc3RhdGljIHZvaWQgYWQxOTg0YV90b3VjaHNtYXJ0X2F1dG9taWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaWYgKHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxYywgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwKSB7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MGMsIDAsCisJCQkJICAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHg0KTsKKwl9IGVsc2UgeworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDBjLCAwLAorCQkJCSAgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4NSk7CisJfQorfQorCisKKy8qIHVuc29saWNpdGVkIGV2ZW50IGZvciBIUCBqYWNrIHNlbnNpbmcgKi8KK3N0YXRpYyB2b2lkIGFkMTk4NGFfdG91Y2hzbWFydF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVzKQoreworCXN3aXRjaCAocmVzID4+IDI2KSB7CisJY2FzZSBBRDE4ODRBX0hQX0VWRU5UOgorCQlhZDE4ODRhX2hwX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBBRDE4ODRBX01JQ19FVkVOVDoKKwkJYWQxOTg0YV90b3VjaHNtYXJ0X2F1dG9taWMoY29kZWMpOworCQlicmVhazsKKwl9Cit9CisKKy8qIGluaXRpYWxpemUgamFjay1zZW5zaW5nLCB0b28gKi8KK3N0YXRpYyBpbnQgYWQxOTg0YV90b3VjaHNtYXJ0X2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWQxOTh4X2luaXQoY29kZWMpOworCWFkMTg4NGFfaHBfYXV0b211dGUoY29kZWMpOworCWFkMTk4NGFfdG91Y2hzbWFydF9hdXRvbWljKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgogICovCiAKIGVudW0gewpAQCAtNDAzOSw2ICs0MTYwLDcgQEAKIAlBRDE4ODRBX0xBUFRPUCwKIAlBRDE4ODRBX01PQklMRSwKIAlBRDE4ODRBX1RISU5LUEFELAorCUFEMTk4NEFfVE9VQ0hTTUFSVCwKIAlBRDE4ODRBX01PREVMUwogfTsKIApAQCAtNDA0Nyw2ICs0MTY5LDcgQEAKIAlbQUQxODg0QV9MQVBUT1BdCT0gImxhcHRvcCIsCiAJW0FEMTg4NEFfTU9CSUxFXQk9ICJtb2JpbGUiLAogCVtBRDE4ODRBX1RISU5LUEFEXQk9ICJ0aGlua3BhZCIsCisJW0FEMTk4NEFfVE9VQ0hTTUFSVF0JPSAidG91Y2hzbWFydCIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWQxODg0YV9jZmdfdGJsW10gPSB7CkBAIC00MDU5LDYgKzQxODIsNyBAQAogCVNORF9QQ0lfUVVJUktfTUFTSygweDEwM2MsIDB4ZmYwMCwgMHgzNjAwLCAiSFAgbGFwdG9wIiwgQUQxODg0QV9MQVBUT1ApLAogCVNORF9QQ0lfUVVJUktfTUFTSygweDEwM2MsIDB4ZmZmMCwgMHg3MDEwLCAiSFAgbGFwdG9wIiwgQUQxODg0QV9NT0JJTEUpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIwYWMsICJUaGlua3BhZCBYMzAwIiwgQUQxODg0QV9USElOS1BBRCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE4MiwgIlRvdWNoc21hcnQiLCBBRDE5ODRBX1RPVUNIU01BUlQpLAogCXt9CiB9OwogCkBAIC00MTQyLDYgKzQyNjYsMjEgQEAKIAkJY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IGFkMTk4NGFfdGhpbmtwYWRfdW5zb2xfZXZlbnQ7CiAJCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IGFkMTk4NGFfdGhpbmtwYWRfaW5pdDsKIAkJYnJlYWs7CisJY2FzZSBBRDE5ODRBX1RPVUNIU01BUlQ6CisJCXNwZWMtPm1peGVyc1swXSA9IGFkMTk4NGFfdG91Y2hzbWFydF9taXhlcnM7CisJCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBhZDE5ODRhX3RvdWNoc21hcnRfdmVyYnM7CisJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gMDsKKwkJY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IGFkMTk4NGFfdG91Y2hzbWFydF91bnNvbF9ldmVudDsKKwkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gYWQxOTg0YV90b3VjaHNtYXJ0X2luaXQ7CisJCS8qIHNldCB0aGUgdXBwZXItbGltaXQgZm9yIG1peGVyIGFtcCB0byAwZEIgZm9yIGF2b2lkaW5nIHRoZQorCQkgKiBwb3NzaWJsZSBkYW1hZ2UgYnkgb3ZlcmxvYWRpbmcKKwkJICovCisJCXNuZF9oZGFfb3ZlcnJpZGVfYW1wX2NhcHMoY29kZWMsIDB4MjAsIEhEQV9JTlBVVCwKKwkJCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfT0ZGU0VUX1NISUZUKSB8CisJCQkJCSAgKDB4MTcgPDwgQUNfQU1QQ0FQX05VTV9TVEVQU19TSElGVCkgfAorCQkJCQkgICgweDA1IDw8IEFDX0FNUENBUF9TVEVQX1NJWkVfU0hJRlQpIHwKKwkJCQkJICAoMSA8PCBBQ19BTVBDQVBfTVVURV9TSElGVCkpOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwppbmRleCA5ZDg5OWVkLi4zZmJiYzhjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCkBAIC02ODIsMTEgKzY4MiwxMyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGN4dDUwNDVfY2FwdHVyZV9zb3VyY2VfYmVucSA9IHsKLQkubnVtX2l0ZW1zID0gMywKKwkubnVtX2l0ZW1zID0gNSwKIAkuaXRlbXMgPSB7CiAJCXsgIkludE1pYyIsIDB4MSB9LAogCQl7ICJFeHRNaWMiLCAweDIgfSwKIAkJeyAiTGluZUluIiwgMHgzIH0sCisJCXsgIkNEIiwgICAgIDB4NCB9LAorCQl7ICJNaXhlciIsICAweDAgfSwKIAl9CiB9OwogCkBAIC04MTEsMTEgKzgxMywxOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNDVfYmVucV9taXhlcnNbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIENhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4NCwgSERBX0lOUFVUKSwKKwogCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgSW4gQ2FwdHVyZSBWb2x1bWUiLCAweDFhLCAweDAzLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIEluIENhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MywgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTGluZSBJbiBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDMsIEhEQV9JTlBVVCksCiAKKwlIREFfQ09ERUNfVk9MVU1FKCJNaXhlciBDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWl4ZXIgQ2FwdHVyZSBTd2l0Y2giLCAweDFhLCAweDAsIEhEQV9JTlBVVCksCisKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9udmhkbWkuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfbnZoZG1pLmMKaW5kZXggYzg0MzVjOS4uOWZiNjAyNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9udmhkbWkuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX252aGRtaS5jCkBAIC0yOSw2ICsyOSw5IEBACiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCiAKKy8qIGRlZmluZSBiZWxvdyB0byByZXN0cmljdCB0aGUgc3VwcG9ydGVkIHJhdGVzIGFuZCBmb3JtYXRzICovCisvKiAjZGVmaW5lIExJTUlURURfUkFURV9GTVRfU1VQUE9SVCAqLworCiBzdHJ1Y3QgbnZoZG1pX3NwZWMgewogCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OwogCkBAIC02MCw2ICs2MywyMiBAQAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKKyNpZmRlZiBMSU1JVEVEX1JBVEVfRk1UX1NVUFBPUlQKKy8qIHN1cHBvcnQgb25seSB0aGUgc2FmZSBmb3JtYXQgYW5kIHJhdGUgKi8KKyNkZWZpbmUgU1VQUE9SVEVEX1JBVEVTCQlTTkRSVl9QQ01fUkFURV80ODAwMAorI2RlZmluZSBTVVBQT1JURURfTUFYQlBTCTE2CisjZGVmaW5lIFNVUFBPUlRFRF9GT1JNQVRTCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFCisjZWxzZQorLyogc3VwcG9ydCBhbGwgcmF0ZXMgYW5kIGZvcm1hdHMgKi8KKyNkZWZpbmUgU1VQUE9SVEVEX1JBVEVTIFwKKwkoU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHxcCisJU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8IFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8XAorCSBTTkRSVl9QQ01fUkFURV8xOTIwMDApCisjZGVmaW5lIFNVUFBPUlRFRF9NQVhCUFMJMjQKKyNkZWZpbmUgU1VQUE9SVEVEX0ZPUk1BVFMgXAorCShTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorI2VuZGlmCisKIC8qCiAgKiBDb250cm9scwogICovCkBAIC0yNTgsOSArMjc3LDkgQEAKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gOCwKIAkubmlkID0gTnZfTWFzdGVyX0NvbnZlcnRfbmlkLAotCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCS5tYXhicHMgPSAxNiwKLQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9IFNVUFBPUlRFRF9SQVRFUywKKwkubWF4YnBzID0gU1VQUE9SVEVEX01BWEJQUywKKwkuZm9ybWF0cyA9IFNVUFBPUlRFRF9GT1JNQVRTLAogCS5vcHMgPSB7CiAJCS5vcGVuID0gbnZoZG1pX2RpZ19wbGF5YmFja19wY21fb3BlbiwKIAkJLmNsb3NlID0gbnZoZG1pX2RpZ19wbGF5YmFja19wY21fY2xvc2VfOGNoLApAQCAtMjczLDkgKzI5Miw5IEBACiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDIsCiAJLm5pZCA9IE52X01hc3Rlcl9Db252ZXJ0X25pZCwKLQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkubWF4YnBzID0gMTYsCi0JLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPSBTVVBQT1JURURfUkFURVMsCisJLm1heGJwcyA9IFNVUFBPUlRFRF9NQVhCUFMsCisJLmZvcm1hdHMgPSBTVVBQT1JURURfRk9STUFUUywKIAkub3BzID0gewogCQkub3BlbiA9IG52aGRtaV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCiAJCS5jbG9zZSA9IG52aGRtaV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlXzJjaCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggMTI5NjA1OC4uZmYyMDA0OCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTI3NSw3ICsyNzUsNyBAQAogCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjYXBfbWl4ZXI7CS8qIGNhcHR1cmUgbWl4ZXIgKi8KIAl1bnNpZ25lZCBpbnQgYmVlcF9hbXA7CS8qIGJlZXAgYW1wIHZhbHVlLCBzZXQgdmlhIHNldF9iZWVwX2FtcCgpICovCiAKLQljb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgKmluaXRfdmVyYnNbNV07CS8qIGluaXRpYWxpemF0aW9uIHZlcmJzCisJY29uc3Qgc3RydWN0IGhkYV92ZXJiICppbml0X3ZlcmJzWzEwXTsJLyogaW5pdGlhbGl6YXRpb24gdmVyYnMKIAkJCQkJCSAqIGRvbid0IGZvcmdldCBOVUxMCiAJCQkJCQkgKiB0ZXJtaW5hdGlvbiEKIAkJCQkJCSAqLwpAQCAtOTY1LDYgKzk2NSw4IEBACiAJdW5zaWduZWQgaW50IG5pZCA9IHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXTsKIAlpbnQgaTsKIAorCWlmICghbmlkKQorCQlyZXR1cm47CiAJcGluY2FwID0gc25kX2hkYV9xdWVyeV9waW5fY2Fwcyhjb2RlYywgbmlkKTsKIAlpZiAocGluY2FwICYgQUNfUElOQ0FQX1RSSUdfUkVRKSAvKiBuZWVkIHRyaWdnZXI/ICovCiAJCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fU0VOU0UsIDApOwpAQCAtMTMzMiwxNSArMTMzNCwyMCBAQAogCSAqCSAgICAgICAgd2hlbiB0aGUgZXh0ZXJuYWwgaGVhZHBob25lIG91dCBqYWNrIGlzIHBsdWdnZWQiCiAJICovCiAJaWYgKCFzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pIHsKKwkJaGRhX25pZF90IG5pZDsKIAkJdG1wID0gKGFzcyA+PiAxMSkgJiAweDM7CS8qIEhQIHRvIGNoYXNzaXMgKi8KIAkJaWYgKHRtcCA9PSAwKQotCQkJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gcG9ydGE7CisJCQluaWQgPSBwb3J0YTsKIAkJZWxzZSBpZiAodG1wID09IDEpCi0JCQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSBwb3J0ZTsKKwkJCW5pZCA9IHBvcnRlOwogCQllbHNlIGlmICh0bXAgPT0gMikKLQkJCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IHBvcnRkOworCQkJbmlkID0gcG9ydGQ7CiAJCWVsc2UKIAkJCXJldHVybiAxOworCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5saW5lX291dHM7IGkrKykKKwkJCWlmIChzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV0gPT0gbmlkKQorCQkJCXJldHVybiAxOworCQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSBuaWQ7CiAJfQogCiAJYWxjX2luaXRfYXV0b19ocChjb2RlYyk7CkBAIC0xMzYyLDcgKzEzNjksNyBAQAogfQogCiAvKgotICogRml4LXVwIHBpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zCisgKiBGaXgtdXAgcGluIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgYW5kIGFkZCBkZWZhdWx0IHZlcmJzCiAgKi8KIAogc3RydWN0IGFsY19waW5jZmcgewpAQCAtMTM3MCw5ICsxMzc3LDE0IEBACiAJdTMyIHZhbDsKIH07CiAKLXN0YXRpYyB2b2lkIGFsY19maXhfcGluY2ZnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorc3RydWN0IGFsY19maXh1cCB7CisJY29uc3Qgc3RydWN0IGFsY19waW5jZmcgKnBpbnM7CisJY29uc3Qgc3RydWN0IGhkYV92ZXJiICp2ZXJiczsKK307CisKK3N0YXRpYyB2b2lkIGFsY19waWNrX2ZpeHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJICAgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnF1aXJrLAotCQkJICAgY29uc3Qgc3RydWN0IGFsY19waW5jZmcgKipwaW5maXgpCisJCQkgICBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgpCiB7CiAJY29uc3Qgc3RydWN0IGFsY19waW5jZmcgKmNmZzsKIApAQCAtMTM4MCw5ICsxMzkyLDE0IEBACiAJaWYgKCFxdWlyaykKIAkJcmV0dXJuOwogCi0JY2ZnID0gcGluZml4W3F1aXJrLT52YWx1ZV07Ci0JZm9yICg7IGNmZy0+bmlkOyBjZmcrKykKLQkJc25kX2hkYV9jb2RlY19zZXRfcGluY2ZnKGNvZGVjLCBjZmctPm5pZCwgY2ZnLT52YWwpOworCWZpeCArPSBxdWlyay0+dmFsdWU7CisJY2ZnID0gZml4LT5waW5zOworCWlmIChjZmcpIHsKKwkJZm9yICg7IGNmZy0+bmlkOyBjZmcrKykKKwkJCXNuZF9oZGFfY29kZWNfc2V0X3BpbmNmZyhjb2RlYywgY2ZnLT5uaWQsIGNmZy0+dmFsKTsKKwl9CisJaWYgKGZpeC0+dmVyYnMpCisJCWFkZF92ZXJiKGNvZGVjLT5zcGVjLCBmaXgtPnZlcmJzKTsKIH0KIAogLyoKQEAgLTk1OTMsMTEgKzk2MTAsMTMgQEAKIAl7IH0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZyAqYWxjODgyX3Bpbl9maXhlc1tdID0gewotCVtQSU5GSVhfQUJJVF9BVzlEX01BWF0gPSBhbGM4ODJfYWJpdF9hdzlkX3BpbmZpeCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzg4Ml9maXh1cHNbXSA9IHsKKwlbUElORklYX0FCSVRfQVc5RF9NQVhdID0geworCQkucGlucyA9IGFsYzg4Ml9hYml0X2F3OWRfcGluZml4CisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4ODJfcGluZml4X3RibFtdID0geworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg4Ml9maXh1cF90YmxbXSA9IHsKIAlTTkRfUENJX1FVSVJLKDB4MTQ3YiwgMHgxMDdhLCAiQWJpdCBBVzlELU1BWCIsIFBJTkZJWF9BQklUX0FXOURfTUFYKSwKIAl7fQogfTsKQEAgLTk4NjksNyArOTg4OCw3IEBACiAJCWJvYXJkX2NvbmZpZyA9IEFMQzg4Ml9BVVRPOwogCX0KIAotCWFsY19maXhfcGluY2ZnKGNvZGVjLCBhbGM4ODJfcGluZml4X3RibCwgYWxjODgyX3Bpbl9maXhlcyk7CisJYWxjX3BpY2tfZml4dXAoY29kZWMsIGFsYzg4Ml9maXh1cF90YmwsIGFsYzg4Ml9maXh1cHMpOwogCiAJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM4ODJfQVVUTykgewogCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KQEAgLTEyNTg1LDcgKzEyNjA0LDggQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTViLCAiQWNlciBBc3BpcmUgT25lIiwKIAkJCQkJCUFMQzI2OF9BQ0VSX0FTUElSRV9PTkUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAyNTMsICJEZWxsIE9FTSIsIEFMQzI2OF9ERUxMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmIwLCAiRGVsbCBJbnNwaXJvbiBNaW5pOSIsIEFMQzI2OF9ERUxMKSwKKwlTTkRfUENJX1FVSVJLX01BU0soMHgxMDI4LCAweGZmZjAsIDB4MDJiMCwKKwkJCSJEZWxsIEluc3Bpcm9uIE1pbmk5L1Zvc3RybyBBOTAiLCBBTEMyNjhfREVMTCksCiAJLyogYWxtb3N0IGNvbXBhdGlibGUgd2l0aCB0b3NoaWJhIGJ1dCB3aXRoIG9wdGlvbmFsIGRpZ2l0YWwgb3V0czsKIAkgKiBhdXRvLXByb2Jpbmcgc2VlbXMgd29ya2luZyBmaW5lCiAJICovCkBAIC0xMjY2MCw3ICsxMjY4MCw3IEBACiAJCS5pbml0X2hvb2sgPSBhbGMyNjhfdG9zaGliYV9hdXRvbXV0ZSwKIAl9LAogCVtBTEMyNjhfQUNFUl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OF9hY2VyX21peGVyLCBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciwKKwkJLm1peGVycyA9IHsgYWxjMjY4X2FjZXJfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKIAkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAogCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCiAJCQkJYWxjMjY4X2FjZXJfdmVyYnMgfSwKQEAgLTEyODQyLDEyICsxMjg2MiwxNSBAQAogCQl1bnNpZ25lZCBpbnQgd2NhcCA9IGdldF93Y2Fwcyhjb2RlYywgMHgwNyk7CiAJCWludCBpOwogCisJCXNwZWMtPmNhcHNyY19uaWRzID0gYWxjMjY4X2NhcHNyY19uaWRzOwogCQkvKiBnZXQgdHlwZSAqLwogCQl3Y2FwID0gZ2V0X3djYXBzX3R5cGUod2NhcCk7CiAJCWlmIChzcGVjLT5hdXRvX21pYyB8fAogCQkgICAgd2NhcCAhPSBBQ19XSURfQVVEX0lOIHx8IHNwZWMtPmlucHV0X211eC0+bnVtX2l0ZW1zID09IDEpIHsKIAkJCXNwZWMtPmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdDsKIAkJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCk7CisJCQlpZiAoc3BlYy0+YXV0b19taWMpCisJCQkJZml4dXBfYXV0b21pY19hZGMoY29kZWMpOwogCQkJaWYgKHNwZWMtPmF1dG9fbWljIHx8IHNwZWMtPmlucHV0X211eC0+bnVtX2l0ZW1zID09IDEpCiAJCQkJYWRkX21peGVyKHNwZWMsIGFsYzI2OF9jYXB0dXJlX25vc3JjX21peGVyKTsKIAkJCWVsc2UKQEAgLTEyODU3LDcgKzEyODgwLDYgQEAKIAkJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzKTsKIAkJCWFkZF9taXhlcihzcGVjLCBhbGMyNjhfY2FwdHVyZV9taXhlcik7CiAJCX0KLQkJc3BlYy0+Y2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHM7CiAJCS8qIHNldCBkZWZhdWx0IGlucHV0IHNvdXJjZSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBpKyspCiAJCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBhbGMyNjhfY2Fwc3JjX25pZHNbaV0sCkBAIC0xNDM1NywxNSArMTQzNzksMTYgQEAKIHN0YXRpYyB2b2lkIGFsYzg2MV9hdXRvX2luaXRfaHBfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBwaW47CiAKLQlwaW4gPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF07Ci0JaWYgKHBpbikKLQkJYWxjODYxX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCwKKwlpZiAoc3BlYy0+YXV0b2NmZy5ocF9vdXRzKQorCQlhbGM4NjFfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsCisJCQkJCQkgIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKKwkJCQkJCSAgUElOX0hQLAogCQkJCQkJICBzcGVjLT5tdWx0aW91dC5ocF9uaWQpOwotCXBpbiA9IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdOwotCWlmIChwaW4pCi0JCWFsYzg2MV9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fT1VULAorCWlmIChzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfb3V0cykKKwkJYWxjODYxX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLAorCQkJCQkJICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKKwkJCQkJCSAgUElOX09VVCwKIAkJCQkJCSAgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0pOwogfQogCkBAIC0xNTE1OCw3ICsxNTE4MSw3IEBACiAJU05EX1BDSV9RVUlSSygweDEwMTksIDB4YTg4ZCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwYmYsICJIUCBUWDEwMDAiLCBBTEM4NjFWRF9IUCksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJlMiwgIkFzdXMgejM1bSIsIEFMQzY2MFZEXzNTVCksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFzdXMgRzEiLCBBTEM2NjBWRF8zU1QpLAorCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFzdXMgRzEiLCBBTEM2NjBWRF8zU1QpLCovIC8qIGF1dG8gKi8KIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjMzLCAiQXN1cyBWMVNuIiwgQUxDNjYwVkRfQVNVU19WMVMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZTcsICJBU1VTIiwgQUxDNjYwVkRfM1NUX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDEwZGUsIDB4MDNmMCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLApAQCAtMTU1NTEsNiArMTU1NzQsMjkgQEAKIAkJYWxjX2luaXRob29rKGNvZGVjKTsKIH0KIAorZW51bSB7CisJQUxDNjYwVkRfRklYX0FTVVNfR1BJTzEKK307CisKKy8qIHJlc2V0IEdQSU8xICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2MHZkX2ZpeF9hc3VzX2dwaW8xX3ZlcmJzW10gPSB7CisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwM30sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAxfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAweDAxfSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzg2MXZkX2ZpeHVwc1tdID0geworCVtBTEM2NjBWRF9GSVhfQVNVU19HUElPMV0gPSB7CisJCS52ZXJicyA9IGFsYzY2MHZkX2ZpeF9hc3VzX2dwaW8xX3ZlcmJzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfZml4dXBfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFTVVMgQTctSyIsIEFMQzY2MFZEX0ZJWF9BU1VTX0dQSU8xKSwKKwl7fQorfTsKKwogc3RhdGljIGludCBwYXRjaF9hbGM4NjF2ZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7CkBAIC0xNTU3Miw2ICsxNTYxOCw4IEBACiAJCWJvYXJkX2NvbmZpZyA9IEFMQzg2MVZEX0FVVE87CiAJfQogCisJYWxjX3BpY2tfZml4dXAoY29kZWMsIGFsYzg2MXZkX2ZpeHVwX3RibCwgYWxjODYxdmRfZml4dXBzKTsKKwogCWlmIChib2FyZF9jb25maWcgPT0gQUxDODYxVkRfQVVUTykgewogCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KIAkJZXJyID0gYWxjODYxdmRfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwpAQCAtMTY4NTIsNiArMTY5MDAsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBjZDYsICJGb3hjb25uIiwgQUxDNjYyX0VDUyksCiAJU05EX1BDSV9RVUlSSygweDEwNWIsIDB4MGQ0NywgIkZveGNvbm4gNDVDTVgvNDVHTVgvNDVDTVgtSyIsCiAJCSAgICAgIEFMQzY2Ml8zU1RfNmNoX0RJRyksCisJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmY2ZSwgIlRvc2hpYmEgTkIyMDAiLCBBTEM2NjNfQVNVU19NT0RFNCksCiAJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4Y2EwMCwgIlNhbXN1bmcgTkMxMCIsIEFMQzI3Ml9TQU1TVU5HX05DMTApLAogCVNORF9QQ0lfUVVJUksoMHgxNDU4LCAweGEwMDIsICJHaWdhYnl0ZSA5NDVHQ00tUzJMIiwKIAkJICAgICAgQUxDNjYyXzNTVF82Y2hfRElHKSwKQEAgLTE3MTQ1LDcwICsxNzE5NCwxNDUgQEAKICAqIEJJT1MgYXV0byBjb25maWd1cmF0aW9uCiAgKi8KIAotLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KLXN0YXRpYyBpbnQgYWxjNjYyX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywKLQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCisvKiBjb252ZXJ0IGZyb20gTUlYIG5pZCB0byBEQUMgKi8KK3N0YXRpYyBpbmxpbmUgaGRhX25pZF90IGFsYzY2Ml9taXhfdG9fZGFjKGhkYV9uaWRfdCBuaWQpCit7CisJaWYgKG5pZCA9PSAweDBmKQorCQlyZXR1cm4gMHgwMjsKKwllbHNlIGlmIChuaWQgPj0gMHgwYyAmJiBuaWQgPD0gMHgwZSkKKwkJcmV0dXJuIG5pZCAtIDB4MGMgKyAweDAyOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIGdldCBNSVggbmlkIGNvbm5lY3RlZCB0byB0aGUgZ2l2ZW4gcGluIHRhcmdldGVkIHRvIERBQyAqLworc3RhdGljIGhkYV9uaWRfdCBhbGM2NjJfZGFjX3RvX21peChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbiwKKwkJCQkgICBoZGFfbmlkX3QgZGFjKQoreworCWhkYV9uaWRfdCBtaXhbNF07CisJaW50IGksIG51bTsKKworCW51bSA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBwaW4sIG1peCwgQVJSQVlfU0laRShtaXgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKGFsYzY2Ml9taXhfdG9fZGFjKG1peFtpXSkgPT0gZGFjKQorCQkJcmV0dXJuIG1peFtpXTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGxvb2sgZm9yIGFuIGVtcHR5IERBQyBzbG90ICovCitzdGF0aWMgaGRhX25pZF90IGFsYzY2Ml9sb29rX2Zvcl9kYWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4pCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IHNyY3NbNV07CisJaW50IGksIGosIG51bTsKKworCW51bSA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBwaW4sIHNyY3MsIEFSUkFZX1NJWkUoc3JjcykpOworCWlmIChudW0gPCAwKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaGRhX25pZF90IG5pZCA9IGFsYzY2Ml9taXhfdG9fZGFjKHNyY3NbaV0pOworCQlpZiAoIW5pZCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgc3BlYy0+bXVsdGlvdXQubnVtX2RhY3M7IGorKykKKwkJCWlmIChzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tqXSA9PSBuaWQpCisJCQkJYnJlYWs7CisJCWlmIChqID49IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzKQorCQkJcmV0dXJuIG5pZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBhbGM2NjJfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpOworCWhkYV9uaWRfdCBkYWM7CisKKwlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7CisJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKKwkJZGFjID0gYWxjNjYyX2xvb2tfZm9yX2RhYyhjb2RlYywgY2ZnLT5saW5lX291dF9waW5zW2ldKTsKKwkJaWYgKCFkYWMpCisJCQljb250aW51ZTsKKwkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MrK10gPSBkYWM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsYzY2Ml9hZGRfdm9sX2N0bChzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsIGNvbnN0IGNoYXIgKnBmeCwKKwkJCSAgICAgIGhkYV9uaWRfdCBuaWQsIHVuc2lnbmVkIGludCBjaHMpCiB7CiAJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBwZngpOworCXJldHVybiBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgY2hzLCAwLCBIREFfT1VUUFVUKSk7Cit9CisKK3N0YXRpYyBpbnQgYWxjNjYyX2FkZF9zd19jdGwoc3RydWN0IGFsY19zcGVjICpzcGVjLCBjb25zdCBjaGFyICpwZngsCisJCQkgICAgIGhkYV9uaWRfdCBuaWQsIHVuc2lnbmVkIGludCBjaHMpCit7CisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOworCXJldHVybiBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIGNocywgMCwgSERBX0lOUFVUKSk7Cit9CisKKyNkZWZpbmUgYWxjNjYyX2FkZF9zdGVyZW9fdm9sKHNwZWMsIHBmeCwgbmlkKSBcCisJYWxjNjYyX2FkZF92b2xfY3RsKHNwZWMsIHBmeCwgbmlkLCAzKQorI2RlZmluZSBhbGM2NjJfYWRkX3N0ZXJlb19zdyhzcGVjLCBwZngsIG5pZCkgXAorCWFsYzY2Ml9hZGRfc3dfY3RsKHNwZWMsIHBmeCwgbmlkLCAzKQorCisvKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLworc3RhdGljIGludCBhbGM2NjJfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXN0YXRpYyBjb25zdCBjaGFyICpjaG5hbWVbNF0gPSB7CiAJCSJGcm9udCIsICJTdXJyb3VuZCIsIE5VTEwgLypDTEZFKi8sICJTaWRlIgogCX07Ci0JaGRhX25pZF90IG5pZDsKKwloZGFfbmlkX3QgbmlkLCBtaXg7CiAJaW50IGksIGVycjsKIAogCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7Ci0JCWlmICghc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0pCisJCW5pZCA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldOworCQlpZiAoIW5pZCkKIAkJCWNvbnRpbnVlOwotCQluaWQgPSBhbGM4ODBfaWR4X3RvX2RhYyhpKTsKKwkJbWl4ID0gYWxjNjYyX2RhY190b19taXgoY29kZWMsIGNmZy0+bGluZV9vdXRfcGluc1tpXSwgbmlkKTsKKwkJaWYgKCFtaXgpCisJCQljb250aW51ZTsKIAkJaWYgKGkgPT0gMikgewogCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAotCQkJCQkgICJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMSwgMCwKLQkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7CisJCQllcnIgPSBhbGM2NjJfYWRkX3ZvbF9jdGwoc3BlYywgIkNlbnRlciIsIG5pZCwgMSk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAotCQkJCQkgICJMRkUgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMiwgMCwKLQkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7CisJCQllcnIgPSBhbGM2NjJfYWRkX3ZvbF9jdGwoc3BlYywgIkxGRSIsIG5pZCwgMik7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwKLQkJCQkJICAiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBlLCAxLCAwLAotCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOworCQkJZXJyID0gYWxjNjYyX2FkZF9zd19jdGwoc3BlYywgIkNlbnRlciIsIG1peCwgMSk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwKLQkJCQkJICAiTEZFIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBlLCAyLCAwLAotCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOworCQkJZXJyID0gYWxjNjYyX2FkZF9zd19jdGwoc3BlYywgIkxGRSIsIG1peCwgMik7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQl9IGVsc2UgewogCQkJY29uc3QgY2hhciAqcGZ4OwogCQkJaWYgKGNmZy0+bGluZV9vdXRzID09IDEgJiYKIAkJCSAgICBjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpIHsKLQkJCQlpZiAoIWNmZy0+aHBfcGlucykKKwkJCQlpZiAoY2ZnLT5ocF9vdXRzKQogCQkJCQlwZnggPSAiU3BlYWtlciI7CiAJCQkJZWxzZQogCQkJCQlwZnggPSAiUENNIjsKIAkJCX0gZWxzZQogCQkJCXBmeCA9IGNobmFtZVtpXTsKLQkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIHBmeCk7Ci0JCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsCi0JCQkJCQkJICAgICAgSERBX09VVFBVVCkpOworCQkJZXJyID0gYWxjNjYyX2FkZF92b2xfY3RsKHNwZWMsIHBmeCwgbmlkLCAzKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCQlpZiAoY2ZnLT5saW5lX291dHMgPT0gMSAmJgogCQkJICAgIGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCkKIAkJCQlwZnggPSAiU3BlYWtlciI7Ci0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOwotCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKGFsYzg4MF9pZHhfdG9fbWl4ZXIoaSksCi0JCQkJCQkgICAgMywgMCwgSERBX0lOUFVUKSk7CisJCQllcnIgPSBhbGM2NjJfYWRkX3N3X2N0bChzcGVjLCBwZngsIG1peCwgMyk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC0xNzIxNyw4NiArMTczNDEsNzUgQEAKIH0KIAogLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZvciBzcGVha2VyIGFuZCBIUCBvdXRwdXRzICovCi1zdGF0aWMgaW50IGFsYzY2Ml9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3RydWN0IGFsY19zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluLAorLyogcmV0dXJuIERBQyBuaWQgaWYgYW55IG5ldyBEQUMgaXMgYXNzaWduZWQgKi8KK3N0YXRpYyBpbnQgYWxjNjYyX2F1dG9fY3JlYXRlX2V4dHJhX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbiwKIAkJCQkJY29uc3QgY2hhciAqcGZ4KQogewotCWhkYV9uaWRfdCBuaWQ7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IG5pZCwgbWl4OwogCWludCBlcnI7Ci0JY2hhciBuYW1lWzMyXTsKIAogCWlmICghcGluKQogCQlyZXR1cm4gMDsKLQotCWlmIChwaW4gPT0gMHgxNykgewotCQkvKiBBTEM2NjMgaGFzIGEgbW9ubyBvdXRwdXQgcGluIG9uIDB4MTcgKi8KKwluaWQgPSBhbGM2NjJfbG9va19mb3JfZGFjKGNvZGVjLCBwaW4pOworCWlmICghbmlkKSB7CisJCWNoYXIgbmFtZVszMl07CisJCS8qIHRoZSBjb3JyZXNwb25kaW5nIERBQyBpcyBhbHJlYWR5IG9jY3VwaWVkICovCisJCWlmICghKGdldF93Y2Fwcyhjb2RlYywgcGluKSAmIEFDX1dDQVBfT1VUX0FNUCkpCisJCQlyZXR1cm4gMDsgLyogbm8gd2F5ICovCisJCS8qIGNyZWF0ZSBhIHN3aXRjaCBvbmx5ICovCiAJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIHBmeCk7Ci0JCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIG5hbWUsCi0JCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMiwgMCwgSERBX09VVFBVVCkpOworCQlyZXR1cm4gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCQkgICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwgSERBX09VVFBVVCkpOworCX0KKworCW1peCA9IGFsYzY2Ml9kYWNfdG9fbWl4KGNvZGVjLCBwaW4sIG5pZCk7CisJaWYgKCFtaXgpCisJCXJldHVybiAwOworCWVyciA9IGFsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCBwZngsIG5pZCwgMyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGFsYzg4MF9pc19maXhlZF9waW4ocGluKSkgewotCQluaWQgPSBhbGM4ODBfaWR4X3RvX2RhYyhhbGM4ODBfZml4ZWRfcGluX2lkeChwaW4pKTsKLQkJLyogcHJpbnRrKEtFUk5fREVCVUcgIkRBQyBuaWQ9JXhcbiIsbmlkKTsgKi8KLQkJLyogc3BlY2lmeSB0aGUgREFDIGFzIHRoZSBleHRyYSBvdXRwdXQgKi8KLQkJaWYgKCFzcGVjLT5tdWx0aW91dC5ocF9uaWQpCi0JCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBuaWQ7Ci0JCWVsc2UKLQkJCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0gPSBuaWQ7Ci0JCS8qIGNvbnRyb2wgSFAgdm9sdW1lL3N3aXRjaCBvbiB0aGUgb3V0cHV0IG1peGVyIGFtcCAqLwotCQluaWQgPSBhbGM4ODBfaWR4X3RvX2RhYyhhbGM4ODBfZml4ZWRfcGluX2lkeChwaW4pKTsKLQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgcGZ4KTsKLQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBuYW1lLAotCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOwotCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgbmFtZSwKLQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAyLCBIREFfSU5QVVQpKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0gZWxzZSBpZiAoYWxjODgwX2lzX211bHRpX3BpbihwaW4pKSB7Ci0JCS8qIHNldCBtYW51YWwgY29ubmVjdGlvbiAqLwotCQkvKiB3ZSBoYXZlIG9ubHkgYSBzd2l0Y2ggb24gSFAtb3V0IFBJTiAqLwotCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOwotCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAotCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKKwllcnIgPSBhbGM2NjJfYWRkX3N3X2N0bChzcGVjLCBwZngsIG1peCwgMyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIG5pZDsKIH0KIAogLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgKi8KICNkZWZpbmUgYWxjNjYyX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMgXAotCWFsYzg4MF9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzCisJYWxjODgyX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMKIAogc3RhdGljIHZvaWQgYWxjNjYyX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCQkgICAgICBoZGFfbmlkX3QgbmlkLCBpbnQgcGluX3R5cGUsCi0JCQkJCSAgICAgIGludCBkYWNfaWR4KQorCQkJCQkgICAgICBoZGFfbmlkX3QgZGFjKQogeworCWludCBpLCBudW07CisJaGRhX25pZF90IHNyY3NbNF07CisKIAlhbGNfc2V0X3Bpbl9vdXRwdXQoY29kZWMsIG5pZCwgcGluX3R5cGUpOwogCS8qIG5lZWQgdGhlIG1hbnVhbCBjb25uZWN0aW9uPyAqLwotCWlmIChhbGM4ODBfaXNfbXVsdGlfcGluKG5pZCkpIHsKLQkJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JCWludCBpZHggPSBhbGM4ODBfbXVsdGlfcGluX2lkeChuaWQpOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBhbGM4ODBfaWR4X3RvX3NlbGVjdG9yKGlkeCksIDAsCi0JCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAotCQkJCSAgICBhbGM4ODBfZGFjX3RvX2lkeChzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tkYWNfaWR4XSkpOworCW51bSA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIHNyY3MsIEFSUkFZX1NJWkUoc3JjcykpOworCWlmIChudW0gPD0gMSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpZiAoYWxjNjYyX21peF90b19kYWMoc3Jjc1tpXSkgIT0gZGFjKQorCQkJY29udGludWU7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIGkpOworCQlyZXR1cm47CiAJfQogfQogCiBzdGF0aWMgdm9pZCBhbGM2NjJfYXV0b19pbml0X211bHRpX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgcGluX3R5cGUgPSBnZXRfcGluX3R5cGUoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlKTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPD0gSERBX1NJREU7IGkrKykgewogCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldOwotCQlpbnQgcGluX3R5cGUgPSBnZXRfcGluX3R5cGUoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlKTsKIAkJaWYgKG5pZCkKIAkJCWFsYzY2Ml9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBwaW5fdHlwZSwKLQkJCQkJCQkgIGkpOworCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSk7CiAJfQogfQogCkBAIC0xNzMwNiwxMiArMTc0MTksMTMgQEAKIAloZGFfbmlkX3QgcGluOwogCiAJcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwotCWlmIChwaW4pIC8qIGNvbm5lY3QgdG8gZnJvbnQgKi8KLQkJLyogdXNlIGRhYyAwICovCi0JCWFsYzY2Ml9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fSFAsIDApOworCWlmIChwaW4pCisJCWFsYzY2Ml9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fSFAsCisJCQkJCQkgIHNwZWMtPm11bHRpb3V0LmhwX25pZCk7CiAJcGluID0gc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF07CiAJaWYgKHBpbikKLQkJYWxjNjYyX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9PVVQsIDApOworCQlhbGM2NjJfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX09VVCwKKwkJCQkJc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXSk7CiB9CiAKICNkZWZpbmUgQUxDNjYyX1BJTl9DRF9OSUQJCUFMQzg4MF9QSU5fQ0RfTklECkBAIC0xNzM0OSwyMSArMTc0NjMsMjUgQEAKIAlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQogCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KIAotCWVyciA9IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWVyciA9IGFsYzY2Ml9hdXRvX2ZpbGxfZGFjX25pZHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM2NjJfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWVyciA9IGFsYzY2Ml9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsYzY2Ml9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3BlYywKKwllcnIgPSBhbGM2NjJfYXV0b19jcmVhdGVfZXh0cmFfb3V0KGNvZGVjLAogCQkJCQkgICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKIAkJCQkJICAgIlNwZWFrZXIiKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM2NjJfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKKwlpZiAoZXJyKQorCQlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0gZXJyOworCWVyciA9IGFsYzY2Ml9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKIAkJCQkJICAgIkhlYWRwaG9uZSIpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWlmIChlcnIpCisJCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IGVycjsKIAllcnIgPSBhbGM2NjJfYXV0b19jcmVhdGVfaW5wdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDgyNjEzN2UuLjY2YzA4NzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTE1OCw2ICsxNTgsNyBAQAogCVNUQUNfRDk2NV81U1RfTk9fRlAsCiAJU1RBQ19ERUxMXzNTVCwKIAlTVEFDX0RFTExfQklPUywKKwlTVEFDXzkyN1hfVk9MS05PQiwKIAlTVEFDXzkyN1hfTU9ERUxTCiB9OwogCkBAIC0xODIsOCArMTgzLDggQEAKIAogc3RydWN0IHNpZ21hdGVsX21pY19yb3V0ZSB7CiAJaGRhX25pZF90IHBpbjsKLQl1bnNpZ25lZCBjaGFyIG11eF9pZHg7Ci0JdW5zaWduZWQgY2hhciBkbXV4X2lkeDsKKwlzaWduZWQgY2hhciBtdXhfaWR4OworCXNpZ25lZCBjaGFyIGRtdXhfaWR4OwogfTsKIAogc3RydWN0IHNpZ21hdGVsX3NwZWMgewpAQCAtOTA3LDYgKzkwOCwxNiBAQAogCXt9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGRlbGxfM3N0X2NvcmVfaW5pdFtdID0geworCS8qIGRvbid0IHNldCBkZWx0YSBiaXQgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfVk9MVU1FX0tOT0JfQ09OVFJPTCwgMHg3Zn0sCisJLyogdW5tdXRlIG5vZGUgMHgxYiAqLworCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCS8qIHNlbGVjdCBub2RlIDB4MDMgYXMgREFDICovCisJezB4MGIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwl7fQorfTsKKwogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBzdGFjOTI3eF9jb3JlX2luaXRbXSA9IHsKIAkvKiBzZXQgbWFzdGVyIHZvbHVtZSBhbmQgZGlyZWN0IGNvbnRyb2wgKi8JCiAJeyAweDI0LCBBQ19WRVJCX1NFVF9WT0xVTUVfS05PQl9DT05UUk9MLCAweGZmfSwKQEAgLTkxNSw2ICs5MjYsMTQgQEAKIAl7fQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBzdGFjOTI3eF92b2xrbm9iX2NvcmVfaW5pdFtdID0geworCS8qIGRvbid0IHNldCBkZWx0YSBiaXQgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfVk9MVU1FX0tOT0JfQ09OVFJPTCwgMHg3Zn0sCisJLyogZW5hYmxlIGFuYWxvZyBwYyBiZWVwIHBhdGggKi8KKwl7MHgwMSwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzIsIDEgPDwgNX0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgc3RhYzkyMDVfY29yZV9pbml0W10gPSB7CiAJLyogc2V0IG1hc3RlciB2b2x1bWUgYW5kIGRpcmVjdCBjb250cm9sICovCQogCXsgMHgyNCwgQUNfVkVSQl9TRVRfVk9MVU1FX0tOT0JfQ09OVFJPTCwgMHhmZn0sCkBAIC0xOTk5LDYgKzIwMTgsNyBAQAogCVtTVEFDX0Q5NjVfNVNUX05PX0ZQXSAgPSBkOTY1XzVzdF9ub19mcF9waW5fY29uZmlncywKIAlbU1RBQ19ERUxMXzNTVF0gID0gZGVsbF8zc3RfcGluX2NvbmZpZ3MsCiAJW1NUQUNfREVMTF9CSU9TXSA9IE5VTEwsCisJW1NUQUNfOTI3WF9WT0xLTk9CXSA9IE5VTEwsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyN3hfbW9kZWxzW1NUQUNfOTI3WF9NT0RFTFNdID0gewpAQCAtMjAxMCw2ICsyMDMwLDcgQEAKIAlbU1RBQ19EOTY1XzVTVF9OT19GUF0JPSAiNXN0YWNrLW5vLWZwIiwKIAlbU1RBQ19ERUxMXzNTVF0JCT0gImRlbGwtM3N0YWNrIiwKIAlbU1RBQ19ERUxMX0JJT1NdCT0gImRlbGwtYmlvcyIsCisJW1NUQUNfOTI3WF9WT0xLTk9CXQk9ICJ2b2xrbm9iIiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzdGFjOTI3eF9jZmdfdGJsW10gPSB7CkBAIC0yMDQ1LDYgKzIwNjYsOCBAQAogCQkJICAgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKIAlTTkRfUENJX1FVSVJLX01BU0soUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHhmZjAwLCAweDI1MDAsCiAJCQkgICAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCS8qIHZvbHVtZS1rbm9iIGZpeGVzICovCisJU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxMGNmLCAiRlNDIiwgU1RBQ185MjdYX1ZPTEtOT0IpLAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKQEAgLTM0NjksMTggKzM0OTIsMjYgQEAKIAkJCWJyZWFrOwogCWlmIChpIDw9IEFVVE9fUElOX0ZST05UX01JQykgewogCQkvKiBhbmFsb2cgcGluICovCi0JCW1pYy0+ZG11eF9pZHggPSAwOwogCQlpID0gZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIHNwZWMtPm11eF9uaWRzWzBdLCBwaW4pOwogCQlpZiAoaSA8IDApCiAJCQlyZXR1cm4gLTE7CiAJCW1pYy0+bXV4X2lkeCA9IGk7CisJCW1pYy0+ZG11eF9pZHggPSAtMTsKKwkJaWYgKHNwZWMtPmRtdXhfbmlkcykKKwkJCW1pYy0+ZG11eF9pZHggPSBnZXRfY29ubmVjdGlvbl9pbmRleChjb2RlYywKKwkJCQkJCQkgICAgIHNwZWMtPmRtdXhfbmlkc1swXSwKKwkJCQkJCQkgICAgIHNwZWMtPm11eF9uaWRzWzBdKTsKIAl9ICBlbHNlIGlmIChzcGVjLT5kbXV4X25pZHMpIHsKIAkJLyogZGlnaXRhbCBwaW4gKi8KLQkJbWljLT5tdXhfaWR4ID0gMDsKIAkJaSA9IGdldF9jb25uZWN0aW9uX2luZGV4KGNvZGVjLCBzcGVjLT5kbXV4X25pZHNbMF0sIHBpbik7CiAJCWlmIChpIDwgMCkKIAkJCXJldHVybiAtMTsKIAkJbWljLT5kbXV4X2lkeCA9IGk7CisJCW1pYy0+bXV4X2lkeCA9IC0xOworCQlpZiAoc3BlYy0+bXV4X25pZHMpCisJCQltaWMtPm11eF9pZHggPSBnZXRfY29ubmVjdGlvbl9pbmRleChjb2RlYywKKwkJCQkJCQkgICAgc3BlYy0+bXV4X25pZHNbMF0sCisJCQkJCQkJICAgIHNwZWMtPmRtdXhfbmlkc1swXSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNDU1NywxMSArNDU4OCwxMSBAQAogCQltaWMgPSAmc3BlYy0+ZXh0X21pYzsKIAllbHNlCiAJCW1pYyA9ICZzcGVjLT5pbnRfbWljOwotCWlmIChtaWMtPmRtdXhfaWR4KQorCWlmIChtaWMtPmRtdXhfaWR4ID49IDApCiAJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIHNwZWMtPmRtdXhfbmlkc1swXSwgMCwKIAkJCQkJICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKIAkJCQkJICBtaWMtPmRtdXhfaWR4KTsKLQllbHNlCisJaWYgKG1pYy0+bXV4X2lkeCA+PSAwKQogCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBzcGVjLT5tdXhfbmlkc1swXSwgMCwKIAkJCQkJICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKIAkJCQkJICBtaWMtPm11eF9pZHgpOwpAQCAtNTYwNCwxMCArNTYzNSwxNCBAQAogCQlzcGVjLT5kbWljX25pZHMgPSBzdGFjOTI3eF9kbWljX25pZHM7CiAJCXNwZWMtPm51bV9kbWljcyA9IFNUQUM5MjdYX05VTV9ETUlDUzsKIAotCQlzcGVjLT5pbml0ID0gZDk2NV9jb3JlX2luaXQ7CisJCXNwZWMtPmluaXQgPSBkZWxsXzNzdF9jb3JlX2luaXQ7CiAJCXNwZWMtPmRtdXhfbmlkcyA9IHN0YWM5Mjd4X2RtdXhfbmlkczsKIAkJc3BlYy0+bnVtX2RtdXhlcyA9IEFSUkFZX1NJWkUoc3RhYzkyN3hfZG11eF9uaWRzKTsKIAkJYnJlYWs7CisJY2FzZSBTVEFDXzkyN1hfVk9MS05PQjoKKwkJc3BlYy0+bnVtX2RtaWNzID0gMDsKKwkJc3BlYy0+aW5pdCA9IHN0YWM5Mjd4X3ZvbGtub2JfY29yZV9pbml0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlzcGVjLT5udW1fZG1pY3MgPSAwOwogCQlzcGVjLT5pbml0ID0gc3RhYzkyN3hfY29yZV9pbml0OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYW1wLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuYwppbmRleCAzNzU2NDMwLi42ZGEyMWEyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuYwpAQCAtNTIsMTEgKzUyLDEzIEBACiAKIAkvKiBvbmx5IHVzZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciBub3cgKi8KIAotCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOwkvKiBvbmx5IFBTRE9VVDAgaXMgY29ubmVjdGVkICovCisJLyogVlQxNjE2IDZjaCBjb2RlYyBjb25uZWN0ZWQgdG8gUFNET1VUMCB1c2luZyBwYWNrZWQgbW9kZSAqLworCWljZS0+bnVtX3RvdGFsX2RhY3MgPSA2OwogCWljZS0+bnVtX3RvdGFsX2FkY3MgPSAyOwogCi0JLyogQ2hhaW50ZWNoIEFWLTcxMCBoYXMgYW5vdGhlciBjb2RlY3MsIHdoaWNoIG5lZWQgaW5pdGlhbGl6YXRpb24gKi8KLQkvKiBpbml0aWFsaXplIFdNODcyOCBjb2RlYyAqLworCS8qIENoYWludGVjaCBBVi03MTAgaGFzIGFub3RoZXIgV004NzI4IGNvZGVjIGNvbm5lY3RlZCB0byBQU0RPVVQ0CisJICAgKHNoYXJlZCB3aXRoIHRoZSBTUERJRiBvdXRwdXQpLiBNaXhlciBjb250cm9sIGZvciB0aGlzIGNvZGVjCisJICAgaXMgbm90IHlldCBzdXBwb3J0ZWQuICovCiAJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX0FWNzEwKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtX2luaXRzKTsgaSArPSAyKQogCQkJd21fcHV0KGljZSwgd21faW5pdHNbaV0sIHdtX2luaXRzW2krMV0pOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCmluZGV4IGNlY2YxZmYuLmQ3NDAzM2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKQEAgLTIyNTksNyArMjI1OSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fcGVhayBfX2RldmluaXRkYXRhID0gewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBQZWFrIiwKIAkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fcGVha19pbmZvLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCmluZGV4IGFmNmUwMDEuLjEwZmM5MmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKQEAgLTY0OCw3ICs2NDgsNyBAQAogCSAgICAoaW5iKElDRU1UMTcyNChpY2UsIERNQV9QQVVTRSkpICYgRE1BX1BBVVNFUykpIHsKIAkJLyogcnVubmluZz8gd2UgY2Fubm90IGNoYW5nZSB0aGUgcmF0ZSBub3cuLi4gKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWNlLT5yZWdfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gKChyYXRlID09IGljZS0+Y3VyX3JhdGUpICYmICFmb3JjZSkgPyAwIDogLUVCVVNZOwogCX0KIAlpZiAoIWZvcmNlICYmIGlzX3Byb19yYXRlX2xvY2tlZChpY2UpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTEyOTQsNyArMTI5NCw3IEBACiAKIAlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAogCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGljZS0+cGNpKSwKLQkJCQkJICAgICAgNjQqMTAyNCwgNjQqMTAyNCk7CisJCQkJCSAgICAgIDI1NioxMDI0LCAyNTYqMTAyNCk7CiAKIAlpY2UtPnBjbSA9IHBjbTsKIApAQCAtMTQwOCw3ICsxNDA4LDcgQEAKIAogCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCiAJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoaWNlLT5wY2kpLAotCQkJCQkgICAgICA2NCoxMDI0LCA2NCoxMDI0KTsKKwkJCQkJICAgICAgMjU2KjEwMjQsIDI1NioxMDI0KTsKIAogCWljZS0+cGNtX2RzID0gcGNtOwogCkBAIC0yMTEwLDcgKzIxMTAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9taXhlcl9wcm9fcGVhayBfX2RldmluaXRkYXRhID0gewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBQZWFrIiwKIAkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCiAJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19wZWFrX2luZm8sCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaW50ZWw4eDAuYyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCmluZGV4IDE3MWFkYTUuLjc1NDg2N2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jCisrKyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCkBAIC0xOTU0LDYgKzE5NTQsMTggQEAKIAkJLm5hbWUgPSAiU29ueSBTMVhQIiwKIAkJLnR5cGUgPSBBQzk3X1RVTkVfSU5WX0VBUEQKIAl9LAorCXsKKwkJLnN1YnZlbmRvciA9IDB4MTA0ZCwKKwkJLnN1YmRldmljZSA9IDB4ODFjMCwKKwkJLm5hbWUgPSAiU29ueSBWQUlPIFZHTi1UMzUwUCIsIC8qQUQxOTgxQiovCisJCS50eXBlID0gQUM5N19UVU5FX0lOVl9FQVBECisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSAweDEwNGQsCisJCS5zdWJkZXZpY2UgPSAweDgxYzUsCisJCS5uYW1lID0gIlNvbnkgVkFJTyBWR04tQjFWUCIsIC8qQUQxOTgxQiovCisJCS50eXBlID0gQUM5N19UVU5FX0lOVl9FQVBECisJfSwKICAJewogCQkuc3VidmVuZG9yID0gMHgxMDQzLAogCQkuc3ViZGV2aWNlID0gMHg4MGYzLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ZpYTgyeHguYyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKaW5kZXggYWNmYTQ3Ni4uOGEzMzJkMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ZpYTgyeHguYworKysgYi9zb3VuZC9wY2kvdmlhODJ4eC5jCkBAIC0zODYsNiArMzg2LDcgQEAKIAogCXN0cnVjdCBzbmRfcGNtICpwY21zWzJdOwogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcm1pZGk7CisJc3RydWN0IHNuZF9rY29udHJvbCAqZHhzX2NvbnRyb2xzWzRdOwogCiAJc3RydWN0IHNuZF9hYzk3X2J1cyAqYWM5N19idXM7CiAJc3RydWN0IHNuZF9hYzk3ICphYzk3OwpAQCAtMTIxNiw5ICsxMjE3LDkgQEAKIAogCiAvKgotICogb3BlbiBjYWxsYmFjayBmb3IgcGxheWJhY2sgb24gdmlhNjg2IGFuZCB2aWE4MjN4IERTWAorICogb3BlbiBjYWxsYmFjayBmb3IgcGxheWJhY2sgb24gdmlhNjg2CiAgKi8KLXN0YXRpYyBpbnQgc25kX3ZpYTgyeHhfcGxheWJhY2tfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3N0YXRpYyBpbnQgc25kX3ZpYTY4Nl9wbGF5YmFja19vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCB2aWE4Mnh4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXN0cnVjdCB2aWFkZXYgKnZpYWRldiA9ICZjaGlwLT5kZXZzW2NoaXAtPnBsYXliYWNrX2Rldm5vICsgc3Vic3RyZWFtLT5udW1iZXJdOwpAQCAtMTIzMCw2ICsxMjMxLDMyIEBACiB9CiAKIC8qCisgKiBvcGVuIGNhbGxiYWNrIGZvciBwbGF5YmFjayBvbiB2aWE4MjN4IERYUworICovCitzdGF0aWMgaW50IHNuZF92aWE4MjMzX3BsYXliYWNrX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHZpYTgyeHggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHZpYWRldiAqdmlhZGV2OworCXVuc2lnbmVkIGludCBzdHJlYW07CisJaW50IGVycjsKKworCXZpYWRldiA9ICZjaGlwLT5kZXZzW2NoaXAtPnBsYXliYWNrX2Rldm5vICsgc3Vic3RyZWFtLT5udW1iZXJdOworCWlmICgoZXJyID0gc25kX3ZpYTgyeHhfcGNtX29wZW4oY2hpcCwgdmlhZGV2LCBzdWJzdHJlYW0pKSA8IDApCisJCXJldHVybiBlcnI7CisJc3RyZWFtID0gdmlhZGV2LT5yZWdfb2Zmc2V0IC8gMHgxMDsKKwlpZiAoY2hpcC0+ZHhzX2NvbnRyb2xzW3N0cmVhbV0pIHsKKwkJY2hpcC0+cGxheWJhY2tfdm9sdW1lW3N0cmVhbV1bMF0gPSAwOworCQljaGlwLT5wbGF5YmFja192b2x1bWVbc3RyZWFtXVsxXSA9IDA7CisJCWNoaXAtPmR4c19jb250cm9sc1tzdHJlYW1dLT52ZFswXS5hY2Nlc3MgJj0KKwkJCX5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkU7CisJCXNuZF9jdGxfbm90aWZ5KGNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFIHwKKwkJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLAorCQkJICAgICAgICZjaGlwLT5keHNfY29udHJvbHNbc3RyZWFtXS0+aWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKICAqIG9wZW4gY2FsbGJhY2sgZm9yIHBsYXliYWNrIG9uIHZpYTgyM3ggbXVsdGktY2hhbm5lbAogICovCiBzdGF0aWMgaW50IHNuZF92aWE4MjMzX211bHRpX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC0xMzAyLDEwICsxMzI5LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc25kX3ZpYTgyMzNfcGxheWJhY2tfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHZpYTgyeHggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHZpYWRldiAqdmlhZGV2ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHN0cmVhbTsKKworCXN0cmVhbSA9IHZpYWRldi0+cmVnX29mZnNldCAvIDB4MTA7CisJaWYgKGNoaXAtPmR4c19jb250cm9sc1tzdHJlYW1dKSB7CisJCWNoaXAtPmR4c19jb250cm9sc1tzdHJlYW1dLT52ZFswXS5hY2Nlc3MgfD0KKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywKKwkJCSAgICAgICAmY2hpcC0+ZHhzX2NvbnRyb2xzW3N0cmVhbV0tPmlkKTsKKwl9CisJcmV0dXJuIHNuZF92aWE4Mnh4X3BjbV9jbG9zZShzdWJzdHJlYW0pOworfQorCiAKIC8qIHZpYTY4NiBwbGF5YmFjayBjYWxsYmFja3MgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9wbGF5YmFja19vcHMgPSB7Ci0JLm9wZW4gPQkJc25kX3ZpYTgyeHhfcGxheWJhY2tfb3BlbiwKKwkub3BlbiA9CQlzbmRfdmlhNjg2X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAogCS5od19wYXJhbXMgPQlzbmRfdmlhODJ4eF9od19wYXJhbXMsCkBAIC0xMzMxLDggKzEzNzQsOCBAQAogCiAvKiB2aWE4MjN4IERTWCBwbGF5YmFjayBjYWxsYmFja3MgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTgyMzNfcGxheWJhY2tfb3BzID0gewotCS5vcGVuID0JCXNuZF92aWE4Mnh4X3BsYXliYWNrX29wZW4sCi0JLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAorCS5vcGVuID0JCXNuZF92aWE4MjMzX3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0Jc25kX3ZpYTgyMzNfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCiAJLmh3X3BhcmFtcyA9CXNuZF92aWE4Mnh4X2h3X3BhcmFtcywKIAkuaHdfZnJlZSA9CXNuZF92aWE4Mnh4X2h3X2ZyZWUsCkBAIC0xNjI2LDcgKzE2NjksNyBAQAogCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCB2aWE4Mnh4ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmKGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0ga2NvbnRyb2wtPmlkLnN1YmRldmljZTsKIAogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gVklBX0RYU19NQVhfVk9MVU1FIC0gY2hpcC0+cGxheWJhY2tfdm9sdW1lW2lkeF1bMF07CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBWSUFfRFhTX01BWF9WT0xVTUUgLSBjaGlwLT5wbGF5YmFja192b2x1bWVbaWR4XVsxXTsKQEAgLTE2NDYsNyArMTY4OSw3IEBACiAJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHZpYTgyeHggKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmYoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCXVuc2lnbmVkIGludCBpZHggPSBrY29udHJvbC0+aWQuc3ViZGV2aWNlOwogCXVuc2lnbmVkIGxvbmcgcG9ydCA9IGNoaXAtPnBvcnQgKyAweDEwICogaWR4OwogCXVuc2lnbmVkIGNoYXIgdmFsOwogCWludCBpLCBjaGFuZ2UgPSAwOwpAQCAtMTcwNSwxMSArMTc0OCwxMyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92aWE4MjMzX2R4c192b2x1bWVfY29udHJvbCBfX2RldmluaXRkYXRhID0gewotCS5uYW1lID0gIlZJQSBEWFMgUGxheWJhY2sgVm9sdW1lIiwKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAotCS5jb3VudCA9IDQsCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5kZXZpY2UgPSAwLAorCS8qIC5zdWJkZXZpY2Ugc2V0IGxhdGVyICovCisJLm5hbWUgPSAiUENNIFBsYXliYWNrIFZvbHVtZSIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAorCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8CisJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFLAogCS5pbmZvID0gc25kX3ZpYTgyMzNfZHhzX3ZvbHVtZV9pbmZvLAogCS5nZXQgPSBzbmRfdmlhODIzM19keHNfdm9sdW1lX2dldCwKIAkucHV0ID0gc25kX3ZpYTgyMzNfZHhzX3ZvbHVtZV9wdXQsCkBAIC0xOTM2LDEwICsxOTgxLDE5IEBACiAJCX0KIAkJZWxzZSAvKiBVc2luZyBEWFMgd2hlbiBQQ00gZW11bGF0aW9uIGlzIGVuYWJsZWQgaXMgcmVhbGx5IHdlaXJkICovCiAJCXsKLQkJCS8qIFN0YW5kYWxvbmUgRFhTIGNvbnRyb2xzICovCi0JCQllcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnNuZF92aWE4MjMzX2R4c192b2x1bWVfY29udHJvbCwgY2hpcCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKKwkJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCisJCQkJa2N0bCA9IHNuZF9jdGxfbmV3MSgKKwkJCQkJJnNuZF92aWE4MjMzX2R4c192b2x1bWVfY29udHJvbCwgY2hpcCk7CisJCQkJaWYgKCFrY3RsKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQlrY3RsLT5pZC5zdWJkZXZpY2UgPSBpOworCQkJCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIGtjdGwpOworCQkJCWlmIChlcnIgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWNoaXAtPmR4c19jb250cm9sc1tpXSA9IGtjdGw7CisJCQl9CiAJCX0KIAl9CiAJLyogc2VsZWN0IHNwZGlmIGRhdGEgc2xvdCAxMC8xMSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggN2RlYTc0Yi4uNjRiODU5OSAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0yMTcsMjAgKzIxNywyNSBAQAogICogY29uZmlndXJhdGlvbiBjYWxsYmFjawogICovCiAKLSNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAotZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKLQogc3RhdGljIGludCBwZGFjZl9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAJc3RydWN0IHNuZF9wZGFjZiAqcGRhY2YgPSBsaW5rLT5wcml2OwotCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKKwlpbnQgcmV0OwogCiAJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAicGRhY2ZfY29uZmlnIGNhbGxlZFxuIik7CiAJbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4NTsKIAotCUNTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSk7Ci0JQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpKTsKLQlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZikpOworCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxlZDsKIAogCWlmIChzbmRfcGRhY2ZfYXNzaWduX3Jlc291cmNlcyhwZGFjZiwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpIDwgMCkKIAkJZ290byBmYWlsZWQ7CkBAIC0yMzgsOCArMjQzLDYgQEAKIAlsaW5rLT5kZXZfbm9kZSA9ICZwZGFjZi0+bm9kZTsKIAlyZXR1cm4gMDsKIAotY3NfZmFpbGVkOgotCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKIGZhaWxlZDoKIAlwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCmluZGV4IDc0NDVjYzguLjE0OTI3NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCkBAIC0yMTMsMTQgKzIxMywxMSBAQAogICogY29uZmlndXJhdGlvbiBjYWxsYmFjawogICovCiAKLSNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAotZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKLQogc3RhdGljIGludCB2eHBvY2tldF9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAJc3RydWN0IHZ4X2NvcmUgKmNoaXAgPSBsaW5rLT5wcml2OwogCXN0cnVjdCBzbmRfdnhwb2NrZXQgKnZ4cCA9IChzdHJ1Y3Qgc25kX3Z4cG9ja2V0ICopY2hpcDsKLQlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CisJaW50IHJldDsKIAogCXNuZF9wcmludGRkKEtFUk5fREVCVUcgInZ4cG9ja2V0X2NvbmZpZyBjYWxsZWRcbiIpOwogCkBAIC0yMzUsOSArMjMyLDE3IEBACiAJCXN0cmNweShjaGlwLT5jYXJkLT5kcml2ZXIsIHZ4cDQ0MF9ody5uYW1lKTsKIAl9CiAKLQlDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykpOwotCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKSk7Ci0JQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOworCWlmIChyZXQpCisJCWdvdG8gZmFpbGVkOworCisJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbGVkOworCisJcmV0ID0gcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsZWQ7CiAKIAljaGlwLT5kZXYgPSAmaGFuZGxlX3RvX2RldihsaW5rKTsKIAlzbmRfY2FyZF9zZXRfZGV2KGNoaXAtPmNhcmQsIGNoaXAtPmRldik7CkBAIC0yNDgsOCArMjUzLDYgQEAKIAlsaW5rLT5kZXZfbm9kZSA9ICZ2eHAtPm5vZGU7CiAJcmV0dXJuIDA7CiAKLWNzX2ZhaWxlZDoKLQljc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7CiBmYWlsZWQ6CiAJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwogCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL0tjb25maWcgYi9zb3VuZC9wcGMvS2NvbmZpZwppbmRleCBiZDIzMzhhLi4wNTE5YzYwIDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvS2NvbmZpZworKysgYi9zb3VuZC9wcGMvS2NvbmZpZwpAQCAtMiw3ICsyLDcgQEAKIAogbWVudWNvbmZpZyBTTkRfUFBDCiAJYm9vbCAiUG93ZXJQQyBzb3VuZCBkZXZpY2VzIgotCWRlcGVuZHMgb24gUFBDNjQgfHwgUFBDMzIKKwlkZXBlbmRzIG9uIFBQQwogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHNvdW5kIGRldmljZXMgc3BlY2lmaWMgdG8gUG93ZXJQQyBhcmNoaXRlY3R1cmVzLgpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL2tleXdlc3QuYyBiL3NvdW5kL3BwYy9rZXl3ZXN0LmMKaW5kZXggODM1ZmExOS4uZDA2Zjc4MCAxMDA2NDQKLS0tIGEvc291bmQvcHBjL2tleXdlc3QuYworKysgYi9zb3VuZC9wcGMva2V5d2VzdC5jCkBAIC01OSw2ICs1OSwxOCBAQAogCXN0cmxjcHkoaW5mby50eXBlLCAia2V5d2VzdCIsIEkyQ19OQU1FX1NJWkUpOwogCWluZm8uYWRkciA9IGtleXdlc3RfY3R4LT5hZGRyOwogCWtleXdlc3RfY3R4LT5jbGllbnQgPSBpMmNfbmV3X2RldmljZShhZGFwdGVyLCAmaW5mbyk7CisJaWYgKCFrZXl3ZXN0X2N0eC0+Y2xpZW50KQorCQlyZXR1cm4gLUVOT0RFVjsKKwkvKgorCSAqIFdlIGtub3cgdGhlIGRyaXZlciBpcyBhbHJlYWR5IGxvYWRlZCwgc28gdGhlIGRldmljZSBzaG91bGQgYmUKKwkgKiBhbHJlYWR5IGJvdW5kLiBJZiBub3QgaXQgbWVhbnMgYmluZGluZyBmYWlsZWQsIGFuZCB0aGVuIHRoZXJlCisJICogaXMgbm8gcG9pbnQgaW4ga2VlcGluZyB0aGUgZGV2aWNlIGluc3RhbnRpYXRlZC4KKwkgKi8KKwlpZiAoIWtleXdlc3RfY3R4LT5jbGllbnQtPmRyaXZlcikgeworCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2Uoa2V5d2VzdF9jdHgtPmNsaWVudCk7CisJCWtleXdlc3RfY3R4LT5jbGllbnQgPSBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJCiAJLyoKIAkgKiBMZXQgaTJjLWNvcmUgZGVsZXRlIHRoYXQgZGV2aWNlIG9uIGRyaXZlciByZW1vdmFsLgpAQCAtODYsNyArOTgsNyBAQAogCXsgfQogfTsKIAotc3RydWN0IGkyY19kcml2ZXIga2V5d2VzdF9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIga2V5d2VzdF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiUE1hYyBLZXl3ZXN0IEF1ZGlvIiwKIAl9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL0tjb25maWcgYi9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZwppbmRleCBhYzkyN2ZmLi45N2YxYTI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZwpAQCAtNywxNSArNyw2IEBACiAJICBtb2RlIChzdXBwb3J0cyBzaW5nbGUgc3RlcmVvIEluL091dCkuCiAJICBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gc2VsZWN0IHRoZSBhdWRpbyBpbnRlcmZhY2VzIHRvIHN1cHBvcnQgYmVsb3cuCiAKLWNvbmZpZyBTTkRfQkY1WFhfVERNCi0JdHJpc3RhdGUgIlNvQyBJMlMoVERNIG1vZGUpIEF1ZGlvIGZvciB0aGUgQURJIEJGNXh4IGNoaXAiCi0JZGVwZW5kcyBvbiAoQkxBQ0tGSU4gJiYgU05EX1NPQykKLQloZWxwCi0JICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KLQkgIHRoZSBCbGFja2ZpbiBTUE9SVCAoc3luY2hyb25vdXMgc2VyaWFsIHBvcnRzKSBpbnRlcmZhY2UgaW4gVERNCi0JICBtb2RlLgotCSAgWW91IHdpbGwgYWxzbyBuZWVkIHRvIHNlbGVjdCB0aGUgYXVkaW8gaW50ZXJmYWNlcyB0byBzdXBwb3J0IGJlbG93LgotCiBjb25maWcgU05EX0JGNVhYX1NPQ19TU00yNjAyCiAJdHJpc3RhdGUgIlNvQyBTU00yNjAyIEF1ZGlvIHN1cHBvcnQgZm9yIEJGNTJ4IGV6a2l0IgogCWRlcGVuZHMgb24gU05EX0JGNVhYX0kyUwpAQCAtNDEsNiArMzIsMzEgQEAKIAkgIEVudGVyIHRoZSBHUElPIHVzZWQgdG8gY29udHJvbCBBRDczMzExJ3MgU0UgcGluLiBBY2NlcHRhYmxlCiAJICB2YWx1ZXMgYXJlIDAgdG8gNwogCitjb25maWcgU05EX0JGNVhYX1RETQorCXRyaXN0YXRlICJTb0MgSTJTKFRETSBtb2RlKSBBdWRpbyBmb3IgdGhlIEFESSBCRjV4eCBjaGlwIgorCWRlcGVuZHMgb24gKEJMQUNLRklOICYmIFNORF9TT0MpCisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgY29kZWNzIGF0dGFjaGVkIHRvCisJICB0aGUgQmxhY2tmaW4gU1BPUlQgKHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0cykgaW50ZXJmYWNlIGluIFRETQorCSAgbW9kZS4KKwkgIFlvdSB3aWxsIGFsc28gbmVlZCB0byBzZWxlY3QgdGhlIGF1ZGlvIGludGVyZmFjZXMgdG8gc3VwcG9ydCBiZWxvdy4KKworY29uZmlnIFNORF9CRjVYWF9TT0NfQUQxODM2CisJdHJpc3RhdGUgIlNvQyBBRDE4MzYgQXVkaW8gc3VwcG9ydCBmb3IgQkY1eHgiCisJZGVwZW5kcyBvbiBTTkRfQkY1WFhfVERNCisJc2VsZWN0IFNORF9CRjVYWF9TT0NfVERNCisJc2VsZWN0IFNORF9TT0NfQUQxODM2CisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBCRjV4eCBTVEFNUC9FWktJVC4KKworY29uZmlnIFNORF9CRjVYWF9TT0NfQUQxOTM4CisJdHJpc3RhdGUgIlNvQyBBRDE5MzggQXVkaW8gc3VwcG9ydCBmb3IgQmxhY2tmaW4iCisJZGVwZW5kcyBvbiBTTkRfQkY1WFhfVERNCisJc2VsZWN0IFNORF9CRjVYWF9TT0NfVERNCisJc2VsZWN0IFNORF9TT0NfQUQxOTM4CisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEFEMTkzOCBjb2RlYyBvbiBCbGFja2Zpbi4KKwogY29uZmlnIFNORF9CRjVYWF9BQzk3CiAJdHJpc3RhdGUgIlNvQyBBQzk3IEF1ZGlvIGZvciB0aGUgQURJIEJGNXh4IGNoaXAiCiAJZGVwZW5kcyBvbiBCTEFDS0ZJTgpAQCAtNzEsNiArODcsMzAgQEAKIAkgIFNheSB5IGlmIHlvdSB3YW50IEFDOTcgZHJpdmVyIHRvIHN1cHBvcnQgdXAgdG8gNS4xIGNoYW5uZWwgYXVkaW8uCiAJICB0aGlzIG1vZGUgd2lsbCBjb25zdW1lIG11Y2ggbW9yZSBtZW1vcnkgZm9yIERNQS4KIAorY29uZmlnIFNORF9CRjVYWF9IQVZFX0NPTERfUkVTRVQKKwlib29sICJCT0FSRCBoYXMgQ09MRCBSZXNldCBHUElPIgorCWRlcGVuZHMgb24gU05EX0JGNVhYX0FDOTcKKwlkZWZhdWx0IHkgaWYgQkZJTjU0OF9FWktJVAorCWRlZmF1bHQgbiBpZiAhQkZJTjU0OF9FWktJVAorCitjb25maWcgU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNCisJaW50ICJTZXQgYSBHUElPIGZvciBjb2xkIHJlc2V0IgorCWRlcGVuZHMgb24gU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVAorCXJhbmdlIDAgMTU5CisJZGVmYXVsdCAxOSBpZiBCRklONTQ4X0VaS0lUCisJZGVmYXVsdCA1IGlmIEJGSU41MzdfU1RBTVAKKwlkZWZhdWx0IDAKKwloZWxwCisJICBTZXQgdGhlIGNvcnJlY3QgR1BJTyBmb3IgUkVTRVQgdGhlIHNvdW5kIGNoaXAuCisKK2NvbmZpZyBTTkRfQkY1WFhfU09DX0FEMTk4MAorCXRyaXN0YXRlICJTb0MgQUQxOTgwLzEgQXVkaW8gc3VwcG9ydCBmb3IgQkY1eHgiCisJZGVwZW5kcyBvbiBTTkRfQkY1WFhfQUM5NworCXNlbGVjdCBTTkRfQkY1WFhfU09DX0FDOTcKKwlzZWxlY3QgU05EX1NPQ19BRDE5ODAKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIEJGNXh4IFNUQU1QL0VaS0lULgorCiBjb25maWcgU05EX0JGNVhYX1NPQ19TUE9SVAogCXRyaXN0YXRlCiAKQEAgLTg4LDMwICsxMjgsNiBAQAogCXNlbGVjdCBTTkRfU09DX0FDOTdfQlVTCiAJc2VsZWN0IFNORF9CRjVYWF9TT0NfU1BPUlQKIAotY29uZmlnIFNORF9CRjVYWF9TT0NfQUQxODM2Ci0JdHJpc3RhdGUgIlNvQyBBRDE4MzYgQXVkaW8gc3VwcG9ydCBmb3IgQkY1eHgiCi0JZGVwZW5kcyBvbiBTTkRfQkY1WFhfVERNCi0Jc2VsZWN0IFNORF9CRjVYWF9TT0NfVERNCi0Jc2VsZWN0IFNORF9TT0NfQUQxODM2Ci0JaGVscAotCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBCRjV4eCBTVEFNUC9FWktJVC4KLQotY29uZmlnIFNORF9CRjVYWF9TT0NfQUQxOTgwCi0JdHJpc3RhdGUgIlNvQyBBRDE5ODAvMSBBdWRpbyBzdXBwb3J0IGZvciBCRjV4eCIKLQlkZXBlbmRzIG9uIFNORF9CRjVYWF9BQzk3Ci0Jc2VsZWN0IFNORF9CRjVYWF9TT0NfQUM5NwotCXNlbGVjdCBTTkRfU09DX0FEMTk4MAotCWhlbHAKLQkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gQkY1eHggU1RBTVAvRVpLSVQuCi0KLWNvbmZpZyBTTkRfQkY1WFhfU09DX0FEMTkzOAotICAgICAgICB0cmlzdGF0ZSAiU29DIEFEMTkzOCBBdWRpbyBzdXBwb3J0IGZvciBCbGFja2ZpbiIKLSAgICAgICAgZGVwZW5kcyBvbiBTTkRfQkY1WFhfVERNCi0gICAgICAgIHNlbGVjdCBTTkRfQkY1WFhfU09DX1RETQotICAgICAgICBzZWxlY3QgU05EX1NPQ19BRDE5MzgKLSAgICAgICAgaGVscAotICAgICAgICAgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBBRDE5MzggY29kZWMgb24gQmxhY2tmaW4uCi0KIGNvbmZpZyBTTkRfQkY1WFhfU1BPUlRfTlVNCiAJaW50ICJTZXQgYSBTUE9SVCBmb3IgU291bmQgY2hpcCIKIAlkZXBlbmRzIG9uIChTTkRfQkY1WFhfSTJTIHx8IFNORF9CRjVYWF9BQzk3IHx8IFNORF9CRjVYWF9URE0pCkBAIC0xMjAsMTkgKzEzNiwzIEBACiAJZGVmYXVsdCAwCiAJaGVscAogCSAgU2V0IHRoZSBjb3JyZWN0IFNQT1JUIGZvciBzb3VuZCBjaGlwLgotCi1jb25maWcgU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVAotCWJvb2wgIkJPQVJEIGhhcyBDT0xEIFJlc2V0IEdQSU8iCi0JZGVwZW5kcyBvbiBTTkRfQkY1WFhfQUM5NwotCWRlZmF1bHQgeSBpZiBCRklONTQ4X0VaS0lUCi0JZGVmYXVsdCBuIGlmICFCRklONTQ4X0VaS0lUCi0KLWNvbmZpZyBTTkRfQkY1WFhfUkVTRVRfR1BJT19OVU0KLQlpbnQgIlNldCBhIEdQSU8gZm9yIGNvbGQgcmVzZXQiCi0JZGVwZW5kcyBvbiBTTkRfQkY1WFhfSEFWRV9DT0xEX1JFU0VUCi0JcmFuZ2UgMCAxNTkKLQlkZWZhdWx0IDE5IGlmIEJGSU41NDhfRVpLSVQKLQlkZWZhdWx0IDUgaWYgQkZJTjUzN19TVEFNUAotCWRlZmF1bHQgMAotCWhlbHAKLQkgIFNldCB0aGUgY29ycmVjdCBHUElPIGZvciBSRVNFVCB0aGUgc291bmQgY2hpcC4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMuYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMuYwppbmRleCAxZTlkMTYxLi4wODRiNjg4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy5jCkBAIC03NywxMiArNzcsMTIgQEAKICAqIFRGUy4gV2hlbiBQb3J0IEcgaXMgc2VsZWN0ZWQgYW5kIEVNQUMgdGhlbiB0aGVyZSBpcyBhIGNvbmZsaWN0IGJldHdlZW4KICAqIHRoZSBQSFkgaW50ZXJydXB0IGxpbmUgYW5kIFRGUy4gIEN1cnJlbnQgc2V0dGluZ3MgcHJldmVudCB0aGUgY29uZmxpY3QKICAqIGJ5IGlnbm9yaW5nIHRoZSBURlMgcGluIHdoZW4gUG9ydCBHIGlzIHNlbGVjdGVkLiBUaGlzIGFsbG93cyBib3RoCi0gKiBzc20yNjAyIHVzaW5nIFBvcnQgRyBhbmQgRU1BQyBjb25jdXJyZW50bHkuCisgKiBjb2RlY3MgYW5kIEVNQUMgdXNpbmcgUG9ydCBHIGNvbmN1cnJlbnRseS4KICAqLwotI2lmZGVmIENPTkZJR19CRjUyN19TUE9SVDBfUE9SVEYKLSNkZWZpbmUgTE9DQUxfU1BPUlQwX1RGUyAoUF9TUE9SVDBfVEZTKQotI2Vsc2UKKyNpZmRlZiBDT05GSUdfQkY1MjdfU1BPUlQwX1BPUlRHCiAjZGVmaW5lIExPQ0FMX1NQT1JUMF9URlMgKDApCisjZWxzZQorI2RlZmluZSBMT0NBTF9TUE9SVDBfVEZTIChQX1NQT1JUMF9URlMpCiAjZW5kaWYKIAogc3RhdGljIHUxNiBzcG9ydF9yZXFbXVs3XSA9IHsge1BfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LXRkbS5jIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LXRkbS5jCmluZGV4IDMwOTZiYWQuLmZmNTQ2ZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC10ZG0uYworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtdGRtLmMKQEAgLTc4LDEyICs3OCwxMiBAQAogICogVEZTLiBXaGVuIFBvcnQgRyBpcyBzZWxlY3RlZCBhbmQgRU1BQyB0aGVuIHRoZXJlIGlzIGEgY29uZmxpY3QgYmV0d2VlbgogICogdGhlIFBIWSBpbnRlcnJ1cHQgbGluZSBhbmQgVEZTLiAgQ3VycmVudCBzZXR0aW5ncyBwcmV2ZW50IHRoZSBjb25mbGljdAogICogYnkgaWdub3JpbmcgdGhlIFRGUyBwaW4gd2hlbiBQb3J0IEcgaXMgc2VsZWN0ZWQuIFRoaXMgYWxsb3dzIGJvdGgKLSAqIHNzbTI2MDIgdXNpbmcgUG9ydCBHIGFuZCBFTUFDIGNvbmN1cnJlbnRseS4KKyAqIGNvZGVjcyBhbmQgRU1BQyB1c2luZyBQb3J0IEcgY29uY3VycmVudGx5LgogICovCi0jaWZkZWYgQ09ORklHX0JGNTI3X1NQT1JUMF9QT1JURgotI2RlZmluZSBMT0NBTF9TUE9SVDBfVEZTIChQX1NQT1JUMF9URlMpCi0jZWxzZQorI2lmZGVmIENPTkZJR19CRjUyN19TUE9SVDBfUE9SVEcKICNkZWZpbmUgTE9DQUxfU1BPUlQwX1RGUyAoMCkKKyNlbHNlCisjZGVmaW5lIExPQ0FMX1NQT1JUMF9URlMgKFBfU1BPUlQwX1RGUykKICNlbmRpZgogCiBzdGF0aWMgdTE2IHNwb3J0X3JlcVtdWzddID0geyB7UF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYwppbmRleCAzZmYwMzczLi41OTNkNWI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogCVNPQ19EQVBNX1NJTkdMRV9UTFYoIkwzIENhcHR1cmUgVm9sdW1lIiwKIAkJCSAgICBXTTgzNTBfSU5QVVRfTUlYRVJfVk9MVU1FX0wsIDksIDcsIDAsIG91dF9taXhfdGx2KSwKIAlTT0NfREFQTV9TSU5HTEUoIlBHQSBDYXB0dXJlIFN3aXRjaCIsCi0JCQlXTTgzNTBfTEVGVF9JTlBVVF9WT0xVTUUsIDE0LCAxLCAwKSwKKwkJCVdNODM1MF9MRUZUX0lOUFVUX1ZPTFVNRSwgMTQsIDEsIDEpLAogfTsKIAogLyogUmlnaHQgSW5wdXQgTWl4ZXIgKi8KQEAgLTU4OSw3ICs1ODksNyBAQAogCVNPQ19EQVBNX1NJTkdMRV9UTFYoIkwzIENhcHR1cmUgVm9sdW1lIiwKIAkJCSAgICBXTTgzNTBfSU5QVVRfTUlYRVJfVk9MVU1FX1IsIDEzLCA3LCAwLCBvdXRfbWl4X3RsdiksCiAJU09DX0RBUE1fU0lOR0xFKCJQR0EgQ2FwdHVyZSBTd2l0Y2giLAotCQkJV004MzUwX1JJR0hUX0lOUFVUX1ZPTFVNRSwgMTQsIDEsIDApLAorCQkJV004MzUwX1JJR0hUX0lOUFVUX1ZPTFVNRSwgMTQsIDEsIDEpLAogfTsKIAogLyogTGVmdCBNaWMgTWl4ZXIgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCmluZGV4IGRhOTdhYWUuLjFlZjI0NTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYwpAQCAtNzkwLDcgKzc5MCw3IEBACiAJY29kZWMtPnJlZ19jYWNoZSA9ICZ3bTg5NDAtPnJlZ19jYWNoZTsKIAogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgY29udHJvbCk7Ci0JaWYgKHJldCA9PSAwKSB7CisJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktaTJzLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5jCmluZGV4IDEyYTZjNTQuLjRhZTcwNzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktaTJzLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1pMnMuYwpAQCAtOTcsMjIgKzk3LDE5IEBACiAJREFWSU5DSV9NQ0JTUF9XT1JEXzMyLAogfTsKIAotc3RhdGljIHN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zIGRhdmluY2lfaTJzX3BjbV9vdXQgPSB7Ci0JLm5hbWUgPSAiSTJTIFBDTSBTdGVyZW8gb3V0IiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyBkYXZpbmNpX2kyc19wY21faW4gPSB7Ci0JLm5hbWUgPSAiSTJTIFBDTSBTdGVyZW8gaW4iLAotfTsKLQogc3RydWN0IGRhdmluY2lfbWNic3BfZGV2IHsKKwkvKgorCSAqIGRtYV9wYXJhbXMgbXVzdCBiZSBmaXJzdCBiZWNhdXNlIHJ0ZC0+ZGFpLT5jcHVfZGFpLT5wcml2YXRlX2RhdGEKKwkgKiBpcyBjYXN0IHRvIGEgcG9pbnRlciBvZiBhbiBhcnJheSBvZiBzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyBpbgorCSAqIGRhdmluY2lfcGNtX29wZW4uCisJICovCisJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMJZG1hX3BhcmFtc1syXTsKIAl2b2lkIF9faW9tZW0JCQkqYmFzZTsKICNkZWZpbmUgTU9EX0RTUF9BCTAKICNkZWZpbmUgTU9EX0RTUF9CCTEKIAlpbnQJCQkJbW9kZTsKIAl1MzIJCQkJcGNyOwogCXN0cnVjdCBjbGsJCQkqY2xrOwotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zCSpkbWFfcGFyYW1zWzJdOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGRhdmluY2lfbWNic3Bfd3JpdGVfcmVnKHN0cnVjdCBkYXZpbmNpX21jYnNwX2RldiAqZGV2LApAQCAtMjE1LDE0ICsyMTIsNiBAQAogCXRvZ2dsZV9jbG9jayhkZXYsIHBsYXliYWNrKTsKIH0KIAotc3RhdGljIGludCBkYXZpbmNpX2kyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSkKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9tY2JzcF9kZXYgKmRldiA9IGNwdV9kYWktPnByaXZhdGVfZGF0YTsKLQljcHVfZGFpLT5kbWFfZGF0YSA9IGRldi0+ZG1hX3BhcmFtc1tzdWJzdHJlYW0tPnN0cmVhbV07Ci0JcmV0dXJuIDA7Ci19Ci0KICNkZWZpbmUgREVGQVVMVF9CSVRQRVJTQU1QTEUJMTYKIAogc3RhdGljIGludCBkYXZpbmNpX2kyc19zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCkBAIC0zNTMsOCArMzQyLDkgQEAKIAkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zID0gZGFpLT5kbWFfZGF0YTsKIAlzdHJ1Y3QgZGF2aW5jaV9tY2JzcF9kZXYgKmRldiA9IGRhaS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zID0KKwkJCQkJJmRldi0+ZG1hX3BhcmFtc1tzdWJzdHJlYW0tPnN0cmVhbV07CiAJc3RydWN0IHNuZF9pbnRlcnZhbCAqaSA9IE5VTEw7CiAJaW50IG1jYnNwX3dvcmRfbGVuZ3RoOwogCXVuc2lnbmVkIGludCByY3IsIHhjciwgc3JncjsKQEAgLTQ3Miw3ICs0NjIsNiBAQAogI2RlZmluZSBEQVZJTkNJX0kyU19SQVRFUwlTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGRhdmluY2lfaTJzX2RhaV9vcHMgPSB7Ci0JLnN0YXJ0dXAgCT0gZGF2aW5jaV9pMnNfc3RhcnR1cCwKIAkuc2h1dGRvd24JPSBkYXZpbmNpX2kyc19zaHV0ZG93biwKIAkucHJlcGFyZQk9IGRhdmluY2lfaTJzX3ByZXBhcmUsCiAJLnRyaWdnZXIJPSBkYXZpbmNpX2kyc190cmlnZ2VyLApAQCAtNTM0LDEyICs1MjMsMTAgQEAKIAogCWRldi0+YmFzZSA9ICh2b2lkIF9faW9tZW0gKilJT19BRERSRVNTKG1lbS0+c3RhcnQpOwogCi0JZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gJmRhdmluY2lfaTJzX3BjbV9vdXQ7Ci0JZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLT5kbWFfYWRkciA9CisJZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmRtYV9hZGRyID0KIAkgICAgKGRtYV9hZGRyX3QpKGlvX3YycChkZXYtPmJhc2UpICsgREFWSU5DSV9NQ0JTUF9EWFJfUkVHKTsKIAotCWRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gJmRhdmluY2lfaTJzX3BjbV9pbjsKLQlkZXYtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS0+ZG1hX2FkZHIgPQorCWRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmRtYV9hZGRyID0KIAkgICAgKGRtYV9hZGRyX3QpKGlvX3YycChkZXYtPmJhc2UpICsgREFWSU5DSV9NQ0JTUF9EUlJfUkVHKTsKIAogCS8qIGZpcnN0IFRYLCB0aGVuIFJYICovCkBAIC01NDksNyArNTM2LDcgQEAKIAkJcmV0ID0gLUVOWElPOwogCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9Ci0JZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLT5jaGFubmVsID0gcmVzLT5zdGFydDsKKwlkZXYtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uY2hhbm5lbCA9IHJlcy0+c3RhcnQ7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOwogCWlmICghcmVzKSB7CkBAIC01NTcsNyArNTQ0LDcgQEAKIAkJcmV0ID0gLUVOWElPOwogCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9Ci0JZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0tPmNoYW5uZWwgPSByZXMtPnN0YXJ0OworCWRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmNoYW5uZWwgPSByZXMtPnN0YXJ0OwogCiAJZGF2aW5jaV9pMnNfZGFpLnByaXZhdGVfZGF0YSA9IGRldjsKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaSgmZGF2aW5jaV9pMnNfZGFpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYwppbmRleCA3YTA2YzBhLi41ZDFmOThhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCkBAIC0zMzIsMTQgKzMzMiw2IEBACiAJCXByaW50ayhLRVJOX0VSUiAiR0JMQ1RMIHdyaXRlIGVycm9yXG4iKTsKIH0KIAotc3RhdGljIGludCBkYXZpbmNpX21jYXNwX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCi17Ci0Jc3RydWN0IGRhdmluY2lfYXVkaW9fZGV2ICpkZXYgPSBjcHVfZGFpLT5wcml2YXRlX2RhdGE7Ci0JY3B1X2RhaS0+ZG1hX2RhdGEgPSBkZXYtPmRtYV9wYXJhbXNbc3Vic3RyZWFtLT5zdHJlYW1dOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBtY2FzcF9zdGFydF9yeChzdHJ1Y3QgZGF2aW5jaV9hdWRpb19kZXYgKmRldikKIHsKIAltY2FzcF9zZXRfY3RsX3JlZyhkZXYtPmJhc2UgKyBEQVZJTkNJX01DQVNQX0dCTENUTFJfUkVHLCBSWEhDTEtSU1QpOwpAQCAtMzg2LDE3ICszNzgsMTcgQEAKIAogc3RhdGljIHZvaWQgZGF2aW5jaV9tY2FzcF9zdGFydChzdHJ1Y3QgZGF2aW5jaV9hdWRpb19kZXYgKmRldiwgaW50IHN0cmVhbSkKIHsKLQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWlmIChkZXYtPnR4bnVtZXZ0KQkvKiBlbmFibGUgRklGTyAqLworCQkJbWNhc3Bfc2V0X2JpdHMoZGV2LT5iYXNlICsgREFWSU5DSV9NQ0FTUF9XRklGT0NUTCwKKwkJCQkJCQkJRklGT19FTkFCTEUpOwogCQltY2FzcF9zdGFydF90eChkZXYpOwotCWVsc2UKKwl9IGVsc2UgeworCQlpZiAoZGV2LT5yeG51bWV2dCkJLyogZW5hYmxlIEZJRk8gKi8KKwkJCW1jYXNwX3NldF9iaXRzKGRldi0+YmFzZSArIERBVklOQ0lfTUNBU1BfUkZJRk9DVEwsCisJCQkJCQkJCUZJRk9fRU5BQkxFKTsKIAkJbWNhc3Bfc3RhcnRfcngoZGV2KTsKLQotCS8qIGVuYWJsZSBGSUZPICovCi0JaWYgKGRldi0+dHhudW1ldnQpCi0JCW1jYXNwX3NldF9iaXRzKGRldi0+YmFzZSArIERBVklOQ0lfTUNBU1BfV0ZJRk9DVEwsIEZJRk9fRU5BQkxFKTsKLQotCWlmIChkZXYtPnJ4bnVtZXZ0KQotCQltY2FzcF9zZXRfYml0cyhkZXYtPmJhc2UgKyBEQVZJTkNJX01DQVNQX1JGSUZPQ1RMLCBGSUZPX0VOQUJMRSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBtY2FzcF9zdG9wX3J4KHN0cnVjdCBkYXZpbmNpX2F1ZGlvX2RldiAqZGV2KQpAQCAtNDEzLDE3ICs0MDUsMTcgQEAKIAogc3RhdGljIHZvaWQgZGF2aW5jaV9tY2FzcF9zdG9wKHN0cnVjdCBkYXZpbmNpX2F1ZGlvX2RldiAqZGV2LCBpbnQgc3RyZWFtKQogewotCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJaWYgKGRldi0+dHhudW1ldnQpCS8qIGRpc2FibGUgRklGTyAqLworCQkJbWNhc3BfY2xyX2JpdHMoZGV2LT5iYXNlICsgREFWSU5DSV9NQ0FTUF9XRklGT0NUTCwKKwkJCQkJCQkJRklGT19FTkFCTEUpOwogCQltY2FzcF9zdG9wX3R4KGRldik7Ci0JZWxzZQorCX0gZWxzZSB7CisJCWlmIChkZXYtPnJ4bnVtZXZ0KQkvKiBkaXNhYmxlIEZJRk8gKi8KKwkJCW1jYXNwX2Nscl9iaXRzKGRldi0+YmFzZSArIERBVklOQ0lfTUNBU1BfUkZJRk9DVEwsCisJCQkJCQkJCUZJRk9fRU5BQkxFKTsKIAkJbWNhc3Bfc3RvcF9yeChkZXYpOwotCi0JLyogZGlzYWJsZSBGSUZPICovCi0JaWYgKGRldi0+dHhudW1ldnQpCi0JCW1jYXNwX2Nscl9iaXRzKGRldi0+YmFzZSArIERBVklOQ0lfTUNBU1BfV0ZJRk9DVEwsIEZJRk9fRU5BQkxFKTsKLQotCWlmIChkZXYtPnJ4bnVtZXZ0KQotCQltY2FzcF9jbHJfYml0cyhkZXYtPmJhc2UgKyBEQVZJTkNJX01DQVNQX1JGSUZPQ1RMLCBGSUZPX0VOQUJMRSk7CisJfQogfQogCiBzdGF0aWMgaW50IGRhdmluY2lfbWNhc3Bfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpLApAQCAtNzIwLDcgKzcxMiw3IEBACiB7CiAJc3RydWN0IGRhdmluY2lfYXVkaW9fZGV2ICpkZXYgPSBjcHVfZGFpLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXMgPQotCQkJCQlkZXYtPmRtYV9wYXJhbXNbc3Vic3RyZWFtLT5zdHJlYW1dOworCQkJCQkmZGV2LT5kbWFfcGFyYW1zW3N1YnN0cmVhbS0+c3RyZWFtXTsKIAlpbnQgd29yZF9sZW5ndGg7CiAJdTggbnVtZXZ0OwogCkBAIC03OTgsNyArNzkwLDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgZGF2aW5jaV9tY2FzcF9kYWlfb3BzID0gewotCS5zdGFydHVwIAk9IGRhdmluY2lfbWNhc3Bfc3RhcnR1cCwKIAkudHJpZ2dlcgk9IGRhdmluY2lfbWNhc3BfdHJpZ2dlciwKIAkuaHdfcGFyYW1zCT0gZGF2aW5jaV9tY2FzcF9od19wYXJhbXMsCiAJLnNldF9mbXQJPSBkYXZpbmNpX21jYXNwX3NldF9kYWlfZm10LApAQCAtODQ5LDIwICs4NDAsMTIgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKmlvYXJlYSwgKnJlczsKIAlzdHJ1Y3Qgc25kX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBkYXZpbmNpX2F1ZGlvX2RldiAqZGV2OwotCWludCBjb3VudCA9IDA7CiAJaW50IHJldCA9IDA7CiAKIAlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGF2aW5jaV9hdWRpb19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuCS1FTk9NRU07CiAKLQlkbWFfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zKSAqIDIsCi0JCQkJCQkJCUdGUF9LRVJORUwpOwotCWlmICghZG1hX2RhdGEpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfcmVsZWFzZV9kZXY7Ci0JfQotCiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIW1lbSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW0gcmVzb3VyY2U/XG4iKTsKQEAgLTg5NywxMSArODgwLDEwIEBACiAJZGV2LT50eG51bWV2dCA9IHBkYXRhLT50eG51bWV2dDsKIAlkZXYtPnJ4bnVtZXZ0ID0gcGRhdGEtPnJ4bnVtZXZ0OwogCi0JZG1hX2RhdGFbY291bnRdLm5hbWUgPSAiSTJTIFBDTSBTdGVyZW8gb3V0IjsKLQlkbWFfZGF0YVtjb3VudF0uZXZlbnRxX25vID0gcGRhdGEtPmV2ZW50cV9ubzsKLQlkbWFfZGF0YVtjb3VudF0uZG1hX2FkZHIgPSAoZG1hX2FkZHJfdCkgKHBkYXRhLT50eF9kbWFfb2Zmc2V0ICsKKwlkbWFfZGF0YSA9ICZkZXYtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107CisJZG1hX2RhdGEtPmV2ZW50cV9ubyA9IHBkYXRhLT5ldmVudHFfbm87CisJZG1hX2RhdGEtPmRtYV9hZGRyID0gKGRtYV9hZGRyX3QpIChwZGF0YS0+dHhfZG1hX29mZnNldCArCiAJCQkJCQkJaW9fdjJwKGRldi0+YmFzZSkpOwotCWRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9ICZkbWFfZGF0YVtjb3VudF07CiAKIAkvKiBmaXJzdCBUWCwgdGhlbiBSWCAqLwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CkBAIC05MTAsMTMgKzg5MiwxMiBAQAogCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKIAl9CiAKLQlkbWFfZGF0YVtjb3VudF0uY2hhbm5lbCA9IHJlcy0+c3RhcnQ7Ci0JY291bnQrKzsKLQlkbWFfZGF0YVtjb3VudF0ubmFtZSA9ICJJMlMgUENNIFN0ZXJlbyBpbiI7Ci0JZG1hX2RhdGFbY291bnRdLmV2ZW50cV9ubyA9IHBkYXRhLT5ldmVudHFfbm87Ci0JZG1hX2RhdGFbY291bnRdLmRtYV9hZGRyID0gKGRtYV9hZGRyX3QpKHBkYXRhLT5yeF9kbWFfb2Zmc2V0ICsKKwlkbWFfZGF0YS0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7CisKKwlkbWFfZGF0YSA9ICZkZXYtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXTsKKwlkbWFfZGF0YS0+ZXZlbnRxX25vID0gcGRhdGEtPmV2ZW50cV9ubzsKKwlkbWFfZGF0YS0+ZG1hX2FkZHIgPSAoZG1hX2FkZHJfdCkocGRhdGEtPnJ4X2RtYV9vZmZzZXQgKwogCQkJCQkJCWlvX3YycChkZXYtPmJhc2UpKTsKLQlkZXYtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9ICZkbWFfZGF0YVtjb3VudF07CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOwogCWlmICghcmVzKSB7CkBAIC05MjQsNyArOTA1LDcgQEAKIAkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CiAJfQogCi0JZG1hX2RhdGFbY291bnRdLmNoYW5uZWwgPSByZXMtPnN0YXJ0OworCWRtYV9kYXRhLT5jaGFubmVsID0gcmVzLT5zdGFydDsKIAlkYXZpbmNpX21jYXNwX2RhaVtwZGF0YS0+b3BfbW9kZV0ucHJpdmF0ZV9kYXRhID0gZGV2OwogCWRhdmluY2lfbWNhc3BfZGFpW3BkYXRhLT5vcF9tb2RlXS5kZXYgPSAmcGRldi0+ZGV2OwogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfZGFpKCZkYXZpbmNpX21jYXNwX2RhaVtwZGF0YS0+b3BfbW9kZV0pOwpAQCAtOTM2LDggKzkxNyw2IEBACiBlcnJfcmVsZWFzZV9yZWdpb246CiAJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMSk7CiBlcnJfcmVsZWFzZV9kYXRhOgotCWtmcmVlKGRtYV9kYXRhKTsKLWVycl9yZWxlYXNlX2RldjoKIAlrZnJlZShkZXYpOwogCiAJcmV0dXJuIHJldDsKQEAgLTk0Niw3ICs5MjUsNiBAQAogc3RhdGljIGludCBkYXZpbmNpX21jYXNwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqZG1hX2RhdGE7CiAJc3RydWN0IGRhdmluY2lfYXVkaW9fZGV2ICpkZXY7CiAJc3RydWN0IHJlc291cmNlICptZW07CiAKQEAgLTk1OSw4ICs5MzcsNiBAQAogCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMSk7CiAKLQlkbWFfZGF0YSA9IGRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKLQlrZnJlZShkbWFfZGF0YSk7CiAJa2ZyZWUoZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5oIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5oCmluZGV4IDU1NDM1NGMuLjlkMTc5Y2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuaAorKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmgKQEAgLTM5LDEwICszOSwxNSBAQAogfTsKIAogc3RydWN0IGRhdmluY2lfYXVkaW9fZGV2IHsKKwkvKgorCSAqIGRtYV9wYXJhbXMgbXVzdCBiZSBmaXJzdCBiZWNhdXNlIHJ0ZC0+ZGFpLT5jcHVfZGFpLT5wcml2YXRlX2RhdGEKKwkgKiBpcyBjYXN0IHRvIGEgcG9pbnRlciBvZiBhbiBhcnJheSBvZiBzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyBpbgorCSAqIGRhdmluY2lfcGNtX29wZW4uCisJICovCisJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgZG1hX3BhcmFtc1syXTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IHNhbXBsZV9yYXRlOwogCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqZG1hX3BhcmFtc1syXTsKIAl1bnNpZ25lZCBpbnQgY29kZWNfZm10OwogCiAJLyogTWNBU1Agc3BlY2lmaWMgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMKaW5kZXggMmY3ZGE0OS4uYzczYTkxNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCkBAIC0xMjYsMTYgKzEyNiw5IEBACiBzdGF0aWMgaW50IGRhdmluY2lfcGNtX2RtYV9yZXF1ZXN0KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqZG1hX2RhdGEgPSBydGQtPmRhaS0+Y3B1X2RhaS0+ZG1hX2RhdGE7CiAJc3RydWN0IGVkbWFjY19wYXJhbSBwX3JhbTsKIAlpbnQgcmV0OwogCi0JaWYgKCFkbWFfZGF0YSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwcnRkLT5wYXJhbXMgPSBkbWFfZGF0YTsKLQogCS8qIFJlcXVlc3QgbWFzdGVyIERNQSBjaGFubmVsICovCiAJcmV0ID0gZWRtYV9hbGxvY19jaGFubmVsKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwKIAkJCQkgIGRhdmluY2lfcGNtX2RtYV9pcnEsIHN1YnN0cmVhbSwKQEAgLTI0NCw2ICsyMzcsMTEgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZDsKIAlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgKnBhID0gcnRkLT5kYWktPmNwdV9kYWktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zID0gJnBhW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwlpZiAoIXBhcmFtcykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJmRhdmluY2lfcGNtX2hhcmR3YXJlKTsKIAkvKiBlbnN1cmUgdGhhdCBidWZmZXIgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHBlcmlvZCBzaXplICovCkBAIC0yNTcsNiArMjU1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaW5pdCgmcHJ0ZC0+bG9jayk7CisJcHJ0ZC0+cGFyYW1zID0gcGFyYW1zOwogCiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uaCBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmgKaW5kZXggNjNkOTYyNS4uODc0NjYwNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uaAorKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5oCkBAIC0xNyw3ICsxNyw2IEBACiAKIAogc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgewotCWNoYXIgKm5hbWU7CQkJLyogc3RyZWFtIGlkZW50aWZpZXIgKi8KIAlpbnQgY2hhbm5lbDsJCQkvKiBzeW5jIGRtYSBjaGFubmVsIElEICovCiAJdW5zaWduZWQgc2hvcnQgYWNudDsKIAlkbWFfYWRkcl90IGRtYV9hZGRyOwkJLyogZGV2aWNlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIERNQSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9teGMtc3NpLmMgYi9zb3VuZC9zb2MvaW14L214Yy1zc2kuYwppbmRleCAzODA2ZmYyLi5jY2RlZmU2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L214Yy1zc2kuYworKysgYi9zb3VuZC9zb2MvaW14L214Yy1zc2kuYwpAQCAtMzk3LDE0ICszOTcsNiBAQAogCQlicmVhazsKIAl9CiAKLQkvKiBzeW5jICovCi0JaWYgKCEoZm10ICYgU05EX1NPQ19EQUlGTVRfQVNZTkMpKQotCQlzY3IgfD0gU1NJX1NDUl9TWU47Ci0KLQkvKiB0ZG0gLSBvbmx5IGZvciBzdGVyZW8gYXRtICovCi0JaWYgKGZtdCAmIFNORF9TT0NfREFJRk1UX1RETSkKLQkJc2NyIHw9IFNTSV9TQ1JfTkVUOwotCiAJaWYgKGNwdV9kYWktPmlkID09IElNWF9EQUlfU1NJMCB8fCBjcHVfZGFpLT5pZCA9PSBJTVhfREFJX1NTSTIpIHsKIAkJU1NJMV9TVENSID0gc3RjcjsKIAkJU1NJMV9TUkNSID0gc3JjcjsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcgYi9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCmluZGV4IDJkZWU5ODMuLjY1M2EzNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKKysrIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwpAQCAtMjEsNyArMjEsMTggQEAKIAlzZWxlY3QgU05EX09NQVBfU09DX01DQlNQCiAJc2VsZWN0IFNORF9TT0NfQ1gyMDQ0MgogCWhlbHAKLQkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gQW1zdHJhZCBEZWx0YS4KKwkgIFNheSBZICBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCAgZm9yIFNvQyBhdWRpbyBkZXZpY2UgIGNvbm5lY3RlZCB0bworCSAgYSBoYW5kc2V0IGFuZCBhIHNwZWFrZXJwaG9uZSBmb3VuZCBvbiBBbXN0cmFkIEUzIChEZWx0YSkgdmlkZW9waG9uZS4KKworCSAgTm90ZSB0aGF0IGluIG9yZGVyIHRvIGdldCB0aG9zZSBkZXZpY2VzIGZ1bGx5IHN1cHBvcnRlZCwgIHlvdSBoYXZlIHRvCisJICBidWlsZCAgdGhlIGtlcm5lbCAgd2l0aCAgc3RhbmRhcmQgIHNlcmlhbCBwb3J0ICBkcml2ZXIgIGluY2x1ZGVkICBhbmQKKwkgIGNvbmZpZ3VyZWQgZm9yIGF0IGxlYXN0IDQgcG9ydHMuICBUaGVuLCBmcm9tIHVzZXJzcGFjZSwgeW91IG11c3QgbG9hZAorCSAgYSBsaW5lIGRpc2NpcGxpbmUgIzE5IG9uIHRoZSBtb2RlbSAodHR5UzMpIHNlcmlhbCBsaW5lLiAgVGhlIHNpbXBsZXN0CisJICB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIGluc3RhbGwgdXRpbC1saW51eC1uZyAgYW5kIHVzZSB0aGUgaW5jbHVkZWQKKwkgIGxkYXR0YWNoICB1dGlsaXR5LiAgVGhpcyAgY2FuIGJlICBzdGFydGVkICBhdXRvbWF0aWNhbGx5ICBmcm9tICB1ZGV2LAorCSAgYSBzaW1wbGUgcnVsZSBsaWtlIHRoaXMgb25lIHNob3VsZCBkbyB0aGUgdHJpY2sgKGl0IGRvZXMgZm9yIG1lKToKKwkgIAlBQ1RJT049PSJhZGQiLCBLRVJORUw9PSJjb250cm9sQzAiLCBcCisJCQkJUlVOKz0iL3Vzci9zYmluL2xkYXR0YWNoIDE5IC9kZXYvdHR5UzMiCiAKIGNvbmZpZyBTTkRfT01BUF9TT0NfT1NLNTkxMgogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3Igb21hcCBvc2s1OTEyIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9LY29uZmlnIGIvc291bmQvc29jL3B4YS9LY29uZmlnCmluZGV4IDYzNzViNGUuLmRjYjMxODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvcHhhL0tjb25maWcKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiBjb25maWcgU05EX1BYQTJYWF9TT0NfSU1PVEUyCiAgICAgICAgdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBJTW90ZSAyIgotICAgICAgIGRlcGVuZHMgb24gU05EX1BYQTJYWF9TT0MgJiYgTUFDSF9JTlRFTE1PVEUyCisgICAgICAgZGVwZW5kcyBvbiBTTkRfUFhBMlhYX1NPQyAmJiBNQUNIX0lOVEVMTU9URTIgJiYgSTJDCiAgICAgICAgc2VsZWN0IFNORF9QWEEyWFhfU09DX0kyUwogICAgICAgIHNlbGVjdCBTTkRfU09DX1dNODk0MAogICAgICAgIGhlbHAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtcGNtLmMgYi9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4LXBjbS5jCmluZGV4IDVjYmJkYzguLjFmMzVjNmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtcGNtLmMKKysrIGIvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eC1wY20uYwpAQCAtNzUsMTEgKzc1LDE5IEBACiB7CiAJc3RydWN0IHMzYzI0eHhfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJZG1hX2FkZHJfdCBwb3MgPSBwcnRkLT5kbWFfcG9zOworCXVuc2lnbmVkIGludCBsaW1pdDsKIAlpbnQgcmV0OwogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAotCXdoaWxlIChwcnRkLT5kbWFfbG9hZGVkIDwgcHJ0ZC0+ZG1hX2xpbWl0KSB7CisJaWYgKHMzY19kbWFfaGFzX2NpcmN1bGFyKCkpIHsKKwkJbGltaXQgPSAocHJ0ZC0+ZG1hX2VuZCAtIHBydGQtPmRtYV9zdGFydCkgLyBwcnRkLT5kbWFfcGVyaW9kOworCX0gZWxzZQorCQlsaW1pdCA9IHBydGQtPmRtYV9saW1pdDsKKworCXByX2RlYnVnKCIlczogbG9hZGVkICVkLCBsaW1pdCAlZFxuIiwgX19mdW5jX18sIHBydGQtPmRtYV9sb2FkZWQsIGxpbWl0KTsKKworCXdoaWxlIChwcnRkLT5kbWFfbG9hZGVkIDwgbGltaXQpIHsKIAkJdW5zaWduZWQgbG9uZyBsZW4gPSBwcnRkLT5kbWFfcGVyaW9kOwogCiAJCXByX2RlYnVnKCJkbWFfbG9hZGVkOiAlZFxuIiwgcHJ0ZC0+ZG1hX2xvYWRlZCk7CkBAIC0xMjMsNyArMTMxLDcgQEAKIAkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwogCiAJc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKLQlpZiAocHJ0ZC0+c3RhdGUgJiBTVF9SVU5OSU5HKSB7CisJaWYgKHBydGQtPnN0YXRlICYgU1RfUlVOTklORyAmJiAhczNjX2RtYV9oYXNfY2lyY3VsYXIoKSkgewogCQlwcnRkLT5kbWFfbG9hZGVkLS07CiAJCXMzYzI0eHhfcGNtX2VucXVldWUoc3Vic3RyZWFtKTsKIAl9CkBAIC0xNjQsNiArMTcyLDExIEBACiAJCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBnZXQgZG1hIGNoYW5uZWxcbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQorCisJCS8qIHVzZSB0aGUgY2lyY3VsYXIgYnVmZmVyaW5nIGlmIHdlIGhhdmUgaXQgYXZhaWxhYmxlLiAqLworCQlpZiAoczNjX2RtYV9oYXNfY2lyY3VsYXIoKSkKKwkJCXMzYzI0MTBfZG1hX3NldGZsYWdzKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwKKwkJCQkJICAgICBTM0MyNDEwX0RNQUZfQ0lSQ1VMQVIpOwogCX0KIAogCXMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihwcnRkLT5wYXJhbXMtPmNoYW5uZWwsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IDdmZjA0YWQuLjBhMWIyZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC04MzQsNiArODM0LDkgQEAKICNkZWZpbmUgc29jX3Jlc3VtZQlOVUxMCiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbnVsbF9kYWlfb3BzID0geworfTsKKwogc3RhdGljIHZvaWQgc25kX3NvY19pbnN0YW50aWF0ZV9jYXJkKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNvbnRhaW5lcl9vZihjYXJkLT5kZXYsCkBAIC04NzcsNiArODgwLDExIEBACiAJCQlhYzk3ID0gMTsKIAl9CiAKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX2xpbmtzOyBpKyspIHsKKwkJaWYgKCFjYXJkLT5kYWlfbGlua1tpXS5jb2RlY19kYWktPm9wcykKKwkJCWNhcmQtPmRhaV9saW5rW2ldLmNvZGVjX2RhaS0+b3BzID0gJm51bGxfZGFpX29wczsKKwl9CisKIAkvKiBJZiB3ZSBoYXZlIEFDOTcgaW4gdGhlIHN5c3RlbSB0aGVuIGRvbid0IHdhaXQgZm9yIHRoZQogCSAqIGNvZGVjLiAgVGhpcyB3aWxsIG5lZWQgcmV2aXNpdGluZyBpZiB3ZSBoYXZlIHRvIGhhbmRsZQogCSAqIHN5c3RlbXMgd2l0aCBtaXhlZCBBQzk3IGFuZCBub24tQUM5NyBwYXJ0cy4gIE9ubHkgY2hlY2sgZm9yCkBAIC0yMzI5LDkgKzIzMzcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBudWxsX2RhaV9vcHMgPSB7Ci19OwotCiAvKioKICAqIHNuZF9zb2NfcmVnaXN0ZXJfZGFpIC0gUmVnaXN0ZXIgYSBEQUkgd2l0aCB0aGUgQVNvQyBjb3JlCiAgKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCBmNzk3MTFiLi5kODlmNmRjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtNTI0LDcgKzUyNCw3IEBACiAKIAkJLyogY29ubmVjdGVkIGphY2sgb3Igc3BrID8gKi8KIAkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2hwIHx8IHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3NwayB8fAotCQkJd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fbGluZSkKKwkJICAgICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9saW5lICYmICFsaXN0X2VtcHR5KCZ3aWRnZXQtPnNvdXJjZXMpKSkKIAkJCXJldHVybiAxOwogCX0KIApAQCAtNTczLDcgKzU3Myw4IEBACiAJCQlyZXR1cm4gMTsKIAogCQkvKiBjb25uZWN0ZWQgamFjayA/ICovCi0JCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9taWMgfHwgd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fbGluZSkKKwkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fAorCQkgICAgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2xpbmUgJiYgIWxpc3RfZW1wdHkoJndpZGdldC0+c2lua3MpKSkKIAkJCXJldHVybiAxOwogCX0KIApAQCAtMjA3MSw5ICsyMDcyLDkgQEAKIAkJCX0KIAkJfQogCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CiAKIAlkYXBtX3Bvd2VyX3dpZGdldHMoY29kZWMsIGV2ZW50KTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CiAJZHVtcF9kYXBtKGNvZGVjLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvYXVkaW8uYyBiL3NvdW5kL3VzYi9jYWlhcS9hdWRpby5jCmluZGV4IDEyMWFmMDYuLjg2YjJjM2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYWlhcS9hdWRpby5jCisrKyBiL3NvdW5kL3VzYi9jYWlhcS9hdWRpby5jCkBAIC02MiwxMCArNjIsMTQgQEAKIGFjdGl2YXRlX3N1YnN0cmVhbShzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LAogCSAgICAgICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWIpCiB7CisJc3Bpbl9sb2NrKCZkZXYtPnNwaW5sb2NrKTsKKwogCWlmIChzdWItPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQogCQlkZXYtPnN1Yl9wbGF5YmFja1tzdWItPm51bWJlcl0gPSBzdWI7CiAJZWxzZQogCQlkZXYtPnN1Yl9jYXB0dXJlW3N1Yi0+bnVtYmVyXSA9IHN1YjsKKworCXNwaW5fdW5sb2NrKCZkZXYtPnNwaW5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTI2OSwxNiArMjczLDIyIEBACiB7CiAJaW50IGluZGV4ID0gc3ViLT5udW1iZXI7CiAJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3ViKTsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwdHI7CisKKwlzcGluX2xvY2soJmRldi0+c3BpbmxvY2spOwogCiAJaWYgKGRldi0+aW5wdXRfcGFuaWMgfHwgZGV2LT5vdXRwdXRfcGFuaWMpCi0JCXJldHVybiBTTkRSVl9QQ01fUE9TX1hSVU47CisJCXB0ciA9IFNORFJWX1BDTV9QT1NfWFJVTjsKIAogCWlmIChzdWItPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1Yi0+cnVudGltZSwKKwkJcHRyID0gYnl0ZXNfdG9fZnJhbWVzKHN1Yi0+cnVudGltZSwKIAkJCQkJZGV2LT5hdWRpb19vdXRfYnVmX3Bvc1tpbmRleF0pOwogCWVsc2UKLQkJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWItPnJ1bnRpbWUsCisJCXB0ciA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWItPnJ1bnRpbWUsCiAJCQkJCWRldi0+YXVkaW9faW5fYnVmX3Bvc1tpbmRleF0pOworCisJc3Bpbl91bmxvY2soJmRldi0+c3BpbmxvY2spOworCXJldHVybiBwdHI7CiB9CiAKIC8qIG9wZXJhdG9ycyBmb3IgYm90aCBwbGF5YmFjayBhbmQgY2FwdHVyZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2NhaWFxL2RldmljZS5jIGIvc291bmQvdXNiL2NhaWFxL2RldmljZS5jCmluZGV4IDgzZTZjMTMuLmEzZjAyZGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuYworKysgYi9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlICJpbnB1dC5oIgogCiBNT0RVTEVfQVVUSE9SKCJEYW5pZWwgTWFjayA8ZGFuaWVsQGNhaWFxLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJjYWlhcSBVU0IgYXVkaW8sIHZlcnNpb24gMS4zLjE5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImNhaWFxIFVTQiBhdWRpbywgdmVyc2lvbiAxLjMuMjAiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e05hdGl2ZSBJbnN0cnVtZW50cywgUmlnS29udHJvbDJ9LCIKIAkJCSAie05hdGl2ZSBJbnN0cnVtZW50cywgUmlnS29udHJvbDN9LCIKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JtaXhlci5jIGIvc291bmQvdXNiL3VzYm1peGVyLmMKaW5kZXggYWI1YTNhYy4uOWVmY2ZkMCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYm1peGVyLmMKKysrIGIvc291bmQvdXNiL3VzYm1peGVyLmMKQEAgLTg5OCw2ICs4OTgsMTEgQEAKICAqIGJ1aWxkIGEgZmVhdHVyZSBjb250cm9sCiAgKi8KIAorc3RhdGljIHNpemVfdCBhcHBlbmRfY3RsX25hbWUoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwgY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiBzdHJsY2F0KGtjdGwtPmlkLm5hbWUsIHN0ciwgc2l6ZW9mKGtjdGwtPmlkLm5hbWUpKTsKK30KKwogc3RhdGljIHZvaWQgYnVpbGRfZmVhdHVyZV9jdGwoc3RydWN0IG1peGVyX2J1aWxkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqZGVzYywKIAkJCSAgICAgIHVuc2lnbmVkIGludCBjdGxfbWFzaywgaW50IGNvbnRyb2wsCiAJCQkgICAgICBzdHJ1Y3QgdXNiX2F1ZGlvX3Rlcm0gKml0ZXJtLCBpbnQgdW5pdGlkKQpAQCAtOTc4LDEzICs5ODMsMTMgQEAKIAkJICovCiAJCWlmICghIG1hcHBlZF9uYW1lICYmICEgKHN0YXRlLT5vdGVybS50eXBlID4+IDE2KSkgewogCQkJaWYgKChzdGF0ZS0+b3Rlcm0udHlwZSAmIDB4ZmYwMCkgPT0gMHgwMTAwKSB7Ci0JCQkJbGVuID0gc3RybGNhdChrY3RsLT5pZC5uYW1lLCAiIENhcHR1cmUiLCBzaXplb2Yoa2N0bC0+aWQubmFtZSkpOworCQkJCWxlbiA9IGFwcGVuZF9jdGxfbmFtZShrY3RsLCAiIENhcHR1cmUiKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbGVuID0gc3RybGNhdChrY3RsLT5pZC5uYW1lICsgbGVuLCAiIFBsYXliYWNrIiwgc2l6ZW9mKGtjdGwtPmlkLm5hbWUpKTsKKwkJCQlsZW4gPSBhcHBlbmRfY3RsX25hbWUoa2N0bCwgIiBQbGF5YmFjayIpOwogCQkJfQogCQl9Ci0JCXN0cmxjYXQoa2N0bC0+aWQubmFtZSArIGxlbiwgY29udHJvbCA9PSBVU0JfRkVBVFVSRV9NVVRFID8gIiBTd2l0Y2giIDogIiBWb2x1bWUiLAotCQkJc2l6ZW9mKGtjdGwtPmlkLm5hbWUpKTsKKwkJYXBwZW5kX2N0bF9uYW1lKGtjdGwsIGNvbnRyb2wgPT0gVVNCX0ZFQVRVUkVfTVVURSA/CisJCQkJIiBTd2l0Y2giIDogIiBWb2x1bWUiKTsKIAkJaWYgKGNvbnRyb2wgPT0gVVNCX0ZFQVRVUkVfVk9MVU1FKSB7CiAJCQlrY3RsLT50bHYuYyA9IG1peGVyX3ZvbF90bHY7CiAJCQlrY3RsLT52ZFswXS5hY2Nlc3MgfD0gCkBAIC0xMTQzLDcgKzExNDgsNyBAQAogCQlsZW4gPSBnZXRfdGVybV9uYW1lKHN0YXRlLCBpdGVybSwga2N0bC0+aWQubmFtZSwgc2l6ZW9mKGtjdGwtPmlkLm5hbWUpLCAwKTsKIAlpZiAoISBsZW4pCiAJCWxlbiA9IHNwcmludGYoa2N0bC0+aWQubmFtZSwgIk1peGVyIFNvdXJjZSAlZCIsIGluX2NoICsgMSk7Ci0Jc3RybGNhdChrY3RsLT5pZC5uYW1lICsgbGVuLCAiIFZvbHVtZSIsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7CisJYXBwZW5kX2N0bF9uYW1lKGtjdGwsICIgVm9sdW1lIik7CiAKIAlzbmRfcHJpbnRkZChLRVJOX0lORk8gIlslZF0gTVUgWyVzXSBjaCA9ICVkLCB2YWwgPSAlZC8lZFxuIiwKIAkJICAgIGN2YWwtPmlkLCBrY3RsLT5pZC5uYW1lLCBjdmFsLT5jaGFubmVscywgY3ZhbC0+bWluLCBjdmFsLT5tYXgpOwpAQCAtMTQwMCw4ICsxNDA1LDggQEAKIAkJCWlmICghIGxlbikKIAkJCQlzdHJsY3B5KGtjdGwtPmlkLm5hbWUsIG5hbWUsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7CiAJCX0KLQkJc3RybGNhdChrY3RsLT5pZC5uYW1lLCAiICIsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7Ci0JCXN0cmxjYXQoa2N0bC0+aWQubmFtZSwgdmFsaW5mby0+c3VmZml4LCBzaXplb2Yoa2N0bC0+aWQubmFtZSkpOworCQlhcHBlbmRfY3RsX25hbWUoa2N0bCwgIiAiKTsKKwkJYXBwZW5kX2N0bF9uYW1lKGtjdGwsIHZhbGluZm8tPnN1ZmZpeCk7CiAKIAkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJbJWRdIFBVIFslc10gY2ggPSAlZCwgdmFsID0gJWQvJWRcbiIsCiAJCQkgICAgY3ZhbC0+aWQsIGtjdGwtPmlkLm5hbWUsIGN2YWwtPmNoYW5uZWxzLCBjdmFsLT5taW4sIGN2YWwtPm1heCk7CkBAIC0xNjEwLDkgKzE2MTUsOSBAQAogCQkJc3RybGNweShrY3RsLT5pZC5uYW1lLCAiVVNCIiwgc2l6ZW9mKGtjdGwtPmlkLm5hbWUpKTsKIAogCQlpZiAoKHN0YXRlLT5vdGVybS50eXBlICYgMHhmZjAwKSA9PSAweDAxMDApCi0JCQlzdHJsY2F0KGtjdGwtPmlkLm5hbWUsICIgQ2FwdHVyZSBTb3VyY2UiLCBzaXplb2Yoa2N0bC0+aWQubmFtZSkpOworCQkJYXBwZW5kX2N0bF9uYW1lKGtjdGwsICIgQ2FwdHVyZSBTb3VyY2UiKTsKIAkJZWxzZQotCQkJc3RybGNhdChrY3RsLT5pZC5uYW1lLCAiIFBsYXliYWNrIFNvdXJjZSIsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7CisJCQlhcHBlbmRfY3RsX25hbWUoa2N0bCwgIiBQbGF5YmFjayBTb3VyY2UiKTsKIAl9CiAKIAlzbmRfcHJpbnRkZChLRVJOX0lORk8gIlslZF0gU1UgWyVzXSBpdGVtcyA9ICVkXG4iLApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCmluZGV4IGZkNDQ5NDYuLjk5ZjMzNzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIiVpXG4iLCBhdG9taWNfcmVhZCgmdXMxMjJsLT5tbWFwX2NvdW50KSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdXNiX3N0cmVhbV9od2RlcF92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHVzYl9zdHJlYW1faHdkZXBfdm1fb3BzID0gewogCS5vcGVuID0gdXNiX3N0cmVhbV9od2RlcF92bV9vcGVuLAogCS5mYXVsdCA9IHVzYl9zdHJlYW1faHdkZXBfdm1fZmF1bHQsCiAJLmNsb3NlID0gdXNiX3N0cmVhbV9od2RlcF92bV9jbG9zZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c1gyWWh3ZGVwLmMgYi9zb3VuZC91c2IvdXN4MnkvdXNYMllod2RlcC5jCmluZGV4IGYzZDhmNzEuLjUyZTA0YjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c1gyWWh3ZGVwLmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzWDJZaHdkZXAuYwpAQCAtNTMsNyArNTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHVzNDI4Y3Rsc192bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHVzNDI4Y3Rsc192bV9vcHMgPSB7CiAJLmZhdWx0ID0gc25kX3VzNDI4Y3Rsc192bV9mYXVsdCwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMgYi9zb3VuZC91c2IvdXN4MnkvdXN4Mnlod2RlcHBjbS5jCmluZGV4IDExNzk0NmYuLjRiMjMwNGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzeDJ5aHdkZXBwY20uYwpAQCAtNjk3LDcgKzY5Nyw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzbmRfdXNYMllfaHdkZXBfcGNtX3ZtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc25kX3VzWDJZX2h3ZGVwX3BjbV92bV9vcHMgPSB7CiAJLm9wZW4gPSBzbmRfdXNYMllfaHdkZXBfcGNtX3ZtX29wZW4sCiAJLmNsb3NlID0gc25kX3VzWDJZX2h3ZGVwX3BjbV92bV9jbG9zZSwKIAkuZmF1bHQgPSBzbmRfdXNYMllfaHdkZXBfcGNtX3ZtX2ZhdWx0LApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi8uZ2l0aWdub3JlIGIvdG9vbHMvcGVyZi8uZ2l0aWdub3JlCmluZGV4IGQ2OWE3NTkuLjA4NTRmMTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvLmdpdGlnbm9yZQorKysgYi90b29scy9wZXJmLy5naXRpZ25vcmUKQEAgLTEwLDYgKzEwLDcgQEAKIHBlcmYtdG9wCiBwZXJmKi4xCiBwZXJmKi54bWwKK3BlcmYqLmh0bWwKIGNvbW1vbi1jbWRzLmgKIHRhZ3MKIFRBR1MKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRpbWVjaGFydC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10aW1lY2hhcnQudHh0CmluZGV4IDFjMmVkMzAuLmE3OTEwMDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRpbWVjaGFydC50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdGltZWNoYXJ0LnR4dApAQCAtMzEsNiArMzEsOSBAQAogLXc6OgogLS13aWR0aD06OgogICAgICAgICBTZWxlY3QgdGhlIHdpZHRoIG9mIHRoZSBTVkcgZmlsZSAoZGVmYXVsdDogMTAwMCkKKy1wOjoKKy0tcG93ZXItb25seTo6CisgICAgICAgIE9ubHkgb3V0cHV0IHRoZSBDUFUgcG93ZXIgc2VjdGlvbiBvZiB0aGUgZGlhZ3JhbQogCiAKIFNFRSBBTFNPCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQppbmRleCBiNWYxOTUzLi43ZTE5MGQ1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKQEAgLTE1NywxMSArMTU3LDE4IEBACiB1bmFtZV9QIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1wIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKIHVuYW1lX1YgOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLXYgMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQogCi0jIElmIHdlJ3JlIG9uIGEgNjQtYml0IGtlcm5lbCwgdXNlIC1tNjQKLWlmbmRlZiBOT182NEJJVAotCWlmbmVxICgkKHBhdHN1YnN0ICU2NCwlLCQodW5hbWVfTSkpLCQodW5hbWVfTSkpCi0JICBNNjQgOj0gLW02NAotCWVuZGlmCisjCisjIEFkZCAtbTMyIGZvciBjcm9zcy1idWlsZHM6CisjCitpZmRlZiBOT182NEJJVAorICBNQklUUyA6PSAtbTMyCitlbHNlCisgICMKKyAgIyBJZiB3ZSdyZSBvbiBhIDY0LWJpdCBrZXJuZWwsIHVzZSAtbTY0OgorICAjCisgIGlmbmVxICgkKHBhdHN1YnN0ICU2NCwlLCQodW5hbWVfTSkpLCQodW5hbWVfTSkpCisgICAgTUJJVFMgOj0gLW02NAorICBlbmRpZgogZW5kaWYKIAogIyBDRkxBR1MgYW5kIExERkxBR1MgYXJlIGZvciB0aGUgdXNlcnMgdG8gb3ZlcnJpZGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgpAQCAtMTcwLDggKzE3Nyw3IEBACiAjIEluY2x1ZGUgc2FuZXIgd2FybmluZ3MgaGVyZSwgd2hpY2ggY2FuIGNhdGNoIGJ1Z3M6CiAjCiAKLUVYVFJBX1dBUk5JTkdTIDo9IC1XY2FzdC1hbGlnbgotRVhUUkFfV0FSTklOR1MgOj0gJChFWFRSQV9XQVJOSU5HUykgLVdmb3JtYXQKK0VYVFJBX1dBUk5JTkdTIDo9IC1XZm9ybWF0CiBFWFRSQV9XQVJOSU5HUyA6PSAkKEVYVFJBX1dBUk5JTkdTKSAtV2Zvcm1hdC1zZWN1cml0eQogRVhUUkFfV0FSTklOR1MgOj0gJChFWFRSQV9XQVJOSU5HUykgLVdmb3JtYXQteTJrCiBFWFRSQV9XQVJOSU5HUyA6PSAkKEVYVFJBX1dBUk5JTkdTKSAtV3NoYWRvdwpAQCAtMTk0LDcgKzIwMCw3IEBACiBFWFRSQV9XQVJOSU5HUyA6PSAkKEVYVFJBX1dBUk5JTkdTKSAtV3N0cmljdC1wcm90b3R5cGVzCiBFWFRSQV9XQVJOSU5HUyA6PSAkKEVYVFJBX1dBUk5JTkdTKSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAogCi1DRkxBR1MgPSAkKE02NCkgLWdnZGIzIC1XYWxsIC1XZXh0cmEgLXN0ZD1nbnU5OSAtV2Vycm9yIC1PNiAtZnN0YWNrLXByb3RlY3Rvci1hbGwgLURfRk9SVElGWV9TT1VSQ0U9MiAkKEVYVFJBX1dBUk5JTkdTKQorQ0ZMQUdTID0gJChNQklUUykgLWdnZGIzIC1XYWxsIC1XZXh0cmEgLXN0ZD1nbnU5OSAtV2Vycm9yIC1PNiAtZnN0YWNrLXByb3RlY3Rvci1hbGwgLURfRk9SVElGWV9TT1VSQ0U9MiAkKEVYVFJBX1dBUk5JTkdTKQogTERGTEFHUyA9IC1scHRocmVhZCAtbHJ0IC1sZWxmIC1sbQogQUxMX0NGTEFHUyA9ICQoQ0ZMQUdTKQogQUxMX0xERkxBR1MgPSAkKExERkxBR1MpCkBAIC00MTUsOCArNDIxLDEyIEBACiAJUFRIUkVBRF9MSUJTID0KIGVuZGlmCiAKLWlmbmVxICgkKHNoZWxsIHNoIC1jICIoZWNobyAnXCNpbmNsdWRlIDxsaWJlbGYuaD4nOyBlY2hvICdpbnQgbWFpbih2b2lkKSB7IEVsZiAqIGVsZiA9IGVsZl9iZWdpbigwLCBFTEZfQ19SRUFEX01NQVAsIDApOyByZXR1cm4gKGxvbmcpZWxmOyB9JykgfCAkKENDKSAteCBjIC0gJChBTExfQ0ZMQUdTKSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NCAtbyAvZGV2L251bGwgJChBTExfTERGTEFHUykgPiAvZGV2L251bGwgMj4mMSAmJiBlY2hvIHkiKSwgeSkKLQltc2cgOj0gJChlcnJvciBObyBsaWJlbGYuaC9saWJlbGYgZm91bmQsIHBsZWFzZSBpbnN0YWxsIGxpYmVsZi1kZXYvZWxmdXRpbHMtbGliZWxmLWRldmVsKTsKK2lmZXEgKCQoc2hlbGwgc2ggLWMgIihlY2hvICdcI2luY2x1ZGUgPGxpYmVsZi5oPic7IGVjaG8gJ2ludCBtYWluKHZvaWQpIHsgRWxmICogZWxmID0gZWxmX2JlZ2luKDAsIEVMRl9DX1JFQUQsIDApOyByZXR1cm4gKGxvbmcpZWxmOyB9JykgfCAkKENDKSAteCBjIC0gJChBTExfQ0ZMQUdTKSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NCAtbyAvZGV2L251bGwgJChBTExfTERGTEFHUykgPiAvZGV2L251bGwgMj4mMSAmJiBlY2hvIHkiKSwgeSkKKwlpZm5lcSAoJChzaGVsbCBzaCAtYyAiKGVjaG8gJ1wjaW5jbHVkZSA8bGliZWxmLmg+JzsgZWNobyAnaW50IG1haW4odm9pZCkgeyBFbGYgKiBlbGYgPSBlbGZfYmVnaW4oMCwgRUxGX0NfUkVBRF9NTUFQLCAwKTsgcmV0dXJuIChsb25nKWVsZjsgfScpIHwgJChDQykgLXggYyAtICQoQUxMX0NGTEFHUykgLURfTEFSR0VGSUxFNjRfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLW8gL2Rldi9udWxsICQoQUxMX0xERkxBR1MpID4gL2Rldi9udWxsIDI+JjEgJiYgZWNobyB5IiksIHkpCisJCUJBU0lDX0NGTEFHUyArPSAtRExJQkVMRl9OT19NTUFQCisJZW5kaWYKK2Vsc2UKKwltc2cgOj0gJChlcnJvciBObyBsaWJlbGYuaC9saWJlbGYgZm91bmQsIHBsZWFzZSBpbnN0YWxsIGxpYmVsZi1kZXYvZWxmdXRpbHMtbGliZWxmLWRldmVsIGFuZCBnbGliYy1kZXZbZWxdKTsKIGVuZGlmCiAKIGlmZGVmIE5PX0RFTUFOR0xFCkBAIC03MjgsNyArNzM4LDcgQEAKIGNvbW1vbi1jbWRzLmg6IHV0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaCBjb21tYW5kLWxpc3QudHh0CiAKIGNvbW1vbi1jbWRzLmg6ICQod2lsZGNhcmQgRG9jdW1lbnRhdGlvbi9wZXJmLSoudHh0KQotCSQoUVVJRVRfR0VOKXV0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaCA+ICRAKyAmJiBtdiAkQCsgJEAKKwkkKFFVSUVUX0dFTikuIHV0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaCA+ICRAKyAmJiBtdiAkQCsgJEAKIAogJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKSA6ICUgOiAlLnNoCiAJJChRVUlFVF9HRU4pJChSTSkgJEAgJEArICYmIFwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwppbmRleCBhNWEwNTBhLi4zZWVlZjMzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCkBAIC00MSw2ICs0MSw3IEBACiBzdGF0aWMgaW50CQkJc3lzdGVtX3dpZGUJCQk9IDA7CiBzdGF0aWMgaW50CQkJcHJvZmlsZV9jcHUJCQk9IC0xOwogc3RhdGljIHBpZF90CQkJdGFyZ2V0X3BpZAkJCT0gLTE7CitzdGF0aWMgcGlkX3QJCQljaGlsZF9waWQJCQk9IC0xOwogc3RhdGljIGludAkJCWluaGVyaXQJCQkJPSAxOwogc3RhdGljIGludAkJCWZvcmNlCQkJCT0gMDsKIHN0YXRpYyBpbnQJCQlhcHBlbmRfZmlsZQkJCT0gMDsKQEAgLTE4NCw2ICsxODUsOSBAQAogCiBzdGF0aWMgdm9pZCBzaWdfYXRleGl0KHZvaWQpCiB7CisJaWYgKGNoaWxkX3BpZCAhPSAtMSkKKwkJa2lsbChjaGlsZF9waWQsIFNJR1RFUk0pOworCiAJaWYgKHNpZ25yID09IC0xKQogCQlyZXR1cm47CiAKQEAgLTYxMCw2ICs2MTQsOCBAQAogCQkJCWV4aXQoLTEpOwogCQkJfQogCQl9CisKKwkJY2hpbGRfcGlkID0gcGlkOwogCX0KIAogCWlmIChyZWFsdGltZV9wcmlvKSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCmluZGV4IGVhOWMxNWMuLmNlMmQ1YmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCkBAIC0xMjg3LDcgKzEyODcsNyBAQAogCiBzdGF0aWMgTElTVF9IRUFEKHNvcnRfbGlzdCk7CiAKLXN0YXRpYyBpbnQgc29ydF9kaW1lbnNpb25fX2FkZChjaGFyICp0b2ssIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCitzdGF0aWMgaW50IHNvcnRfZGltZW5zaW9uX19hZGQoY29uc3QgY2hhciAqdG9rLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewogCWludCBpOwogCkBAIC0xOTE3LDcgKzE5MTcsNyBAQAogCiAJZnJlZShzdHIpOwogCi0Jc29ydF9kaW1lbnNpb25fX2FkZCgoY2hhciAqKSJwaWQiLCAmY21wX3BpZCk7CisJc29ydF9kaW1lbnNpb25fX2FkZCgicGlkIiwgJmNtcF9waWQpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqcmVjb3JkX2FyZ3NbXSA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCmluZGV4IDE2YWYyZDguLjNkYjMxZTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwpAQCAtNjksNyArNjksOCBAQAogc3RhdGljIGludAkJCXJ1bl9jb3VudAkJCT0gIDE7CiBzdGF0aWMgaW50CQkJaW5oZXJpdAkJCQk9ICAxOwogc3RhdGljIGludAkJCXNjYWxlCQkJCT0gIDE7Ci1zdGF0aWMgaW50CQkJdGFyZ2V0X3BpZAkJCT0gLTE7CitzdGF0aWMgcGlkX3QJCQl0YXJnZXRfcGlkCQkJPSAtMTsKK3N0YXRpYyBwaWRfdAkJCWNoaWxkX3BpZAkJCT0gLTE7CiBzdGF0aWMgaW50CQkJbnVsbF9ydW4JCQk9ICAwOwogCiBzdGF0aWMgaW50CQkJZmRbTUFYX05SX0NQVVNdW01BWF9DT1VOVEVSU107CkBAIC0yODUsNiArMjg2LDggQEAKIAkJZXhpdCgtMSk7CiAJfQogCisJY2hpbGRfcGlkID0gcGlkOworCiAJLyoKIAkgKiBXYWl0IGZvciB0aGUgY2hpbGQgdG8gYmUgcmVhZHkgdG8gZXhlYy4KIAkgKi8KQEAgLTMzOCwxNCArMzQxLDI0IEBACiAKIHN0YXRpYyB2b2lkIGFic19wcmludG91dChpbnQgY291bnRlciwgZG91YmxlIGF2ZykKIHsKKwlkb3VibGUgdG90YWwsIHJhdGlvID0gMC4wOworCiAJZnByaW50ZihzdGRlcnIsICIgJTE0LjBmICAlLTI0cyIsIGF2ZywgZXZlbnRfbmFtZShjb3VudGVyKSk7CiAKIAlpZiAoTUFUQ0hfRVZFTlQoSEFSRFdBUkUsIEhXX0lOU1RSVUNUSU9OUywgY291bnRlcikpIHsKLQkJZnByaW50ZihzdGRlcnIsICIgIyAlMTAuM2YgSVBDICAiLAotCQkJCWF2ZyAvIGF2Z19zdGF0cygmcnVudGltZV9jeWNsZXNfc3RhdHMpKTsKKwkJdG90YWwgPSBhdmdfc3RhdHMoJnJ1bnRpbWVfY3ljbGVzX3N0YXRzKTsKKworCQlpZiAodG90YWwpCisJCQlyYXRpbyA9IGF2ZyAvIHRvdGFsOworCisJCWZwcmludGYoc3RkZXJyLCAiICMgJTEwLjNmIElQQyAgIiwgcmF0aW8pOwogCX0gZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiICMgJTEwLjNmIE0vc2VjIiwKLQkJCQkxMDAwLjAgKiBhdmcgLyBhdmdfc3RhdHMoJnJ1bnRpbWVfbnNlY3Nfc3RhdHMpKTsKKwkJdG90YWwgPSBhdmdfc3RhdHMoJnJ1bnRpbWVfbnNlY3Nfc3RhdHMpOworCisJCWlmICh0b3RhbCkKKwkJCXJhdGlvID0gMTAwMC4wICogYXZnIC8gdG90YWw7CisKKwkJZnByaW50ZihzdGRlcnIsICIgIyAlMTAuM2YgTS9zZWMiLCByYXRpbyk7CiAJfQogfQogCkBAIC00MjMsNiArNDM2LDkgQEAKIAogc3RhdGljIHZvaWQgc2lnX2F0ZXhpdCh2b2lkKQogeworCWlmIChjaGlsZF9waWQgIT0gLTEpCisJCWtpbGwoY2hpbGRfcGlkLCBTSUdURVJNKTsKKwogCWlmIChzaWduciA9PSAtMSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKaW5kZXggNDQwNTY4MS4uZThhNTEwZDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKQEAgLTQ2LDYgKzQ2LDggQEAKIAogc3RhdGljIHU2NAkJZmlyc3RfdGltZSwgbGFzdF90aW1lOwogCitzdGF0aWMgaW50CQlwb3dlcl9vbmx5OworCiAKIHN0YXRpYyBzdHJ1Y3QgcGVyZl9oZWFkZXIJKmhlYWRlcjsKIApAQCAtNTQ3LDcgKzU0OSw3IEBACiAJdTY0IGNwdTsKIAlzdHJ1Y3QgcG93ZXJfZXZlbnQgKnB3cjsKIAotCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtY3B1czsgY3B1KyspIHsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8PSBudW1jcHVzOyBjcHUrKykgewogCQlwd3IgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwb3dlcl9ldmVudCkpOwogCQlpZiAoIXB3cikKIAkJCXJldHVybjsKQEAgLTc2MywxOSArNzY1LDQwIEBACiAJCQkJCWlmIChjLT5ZICYmIGMtPnN0YXJ0X3RpbWUgPD0gd2UtPnRpbWUgJiYgYy0+ZW5kX3RpbWUgPj0gd2UtPnRpbWUpIHsKIAkJCQkJCWlmIChwLT5waWQgPT0gd2UtPndha2VyKSB7CiAJCQkJCQkJZnJvbSA9IGMtPlk7Ci0JCQkJCQkJdGFza19mcm9tID0gYy0+Y29tbTsKKwkJCQkJCQl0YXNrX2Zyb20gPSBzdHJkdXAoYy0+Y29tbSk7CiAJCQkJCQl9CiAJCQkJCQlpZiAocC0+cGlkID09IHdlLT53YWtlZSkgewogCQkJCQkJCXRvID0gYy0+WTsKLQkJCQkJCQl0YXNrX3RvID0gYy0+Y29tbTsKKwkJCQkJCQl0YXNrX3RvID0gc3RyZHVwKGMtPmNvbW0pOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJCWMgPSBjLT5uZXh0OwogCQkJCX0KKwkJCQljID0gcC0+YWxsOworCQkJCXdoaWxlIChjKSB7CisJCQkJCWlmIChwLT5waWQgPT0gd2UtPndha2VyICYmICFmcm9tKSB7CisJCQkJCQlmcm9tID0gYy0+WTsKKwkJCQkJCXRhc2tfZnJvbSA9IHN0cmR1cChjLT5jb21tKTsKKwkJCQkJfQorCQkJCQlpZiAocC0+cGlkID09IHdlLT53YWtlZSAmJiAhdG8pIHsKKwkJCQkJCXRvID0gYy0+WTsKKwkJCQkJCXRhc2tfdG8gPSBzdHJkdXAoYy0+Y29tbSk7CisJCQkJCX0KKwkJCQkJYyA9IGMtPm5leHQ7CisJCQkJfQogCQkJfQogCQkJcCA9IHAtPm5leHQ7CiAJCX0KIAorCQlpZiAoIXRhc2tfZnJvbSkgeworCQkJdGFza19mcm9tID0gbWFsbG9jKDQwKTsKKwkJCXNwcmludGYodGFza19mcm9tLCAiWyVpXSIsIHdlLT53YWtlcik7CisJCX0KKwkJaWYgKCF0YXNrX3RvKSB7CisJCQl0YXNrX3RvID0gbWFsbG9jKDQwKTsKKwkJCXNwcmludGYodGFza190bywgIlslaV0iLCB3ZS0+d2FrZWUpOworCQl9CisKIAkJaWYgKHdlLT53YWtlciA9PSAtMSkKIAkJCXN2Z19pbnRlcnJ1cHQod2UtPnRpbWUsIHRvKTsKIAkJZWxzZSBpZiAoZnJvbSAmJiB0byAmJiBhYnMoZnJvbSAtIHRvKSA9PSAxKQpAQCAtNzgzLDYgKzgwNiw5IEBACiAJCWVsc2UKIAkJCXN2Z19wYXJ0aWFsX3dha2VsaW5lKHdlLT50aW1lLCBmcm9tLCB0YXNrX2Zyb20sIHRvLCB0YXNrX3RvKTsKIAkJd2UgPSB3ZS0+bmV4dDsKKworCQlmcmVlKHRhc2tfZnJvbSk7CisJCWZyZWUodGFza190byk7CiAJfQogfQogCkBAIC04NzEsNyArODk3LDcgQEAKIAkJLyogbm8gZXhpdCBtYXJrZXIsIHRhc2sga2VwdCBydW5uaW5nIHRvIHRoZSBlbmQgKi8KIAkJaWYgKHAtPmVuZF90aW1lID09IDApCiAJCQlwLT5lbmRfdGltZSA9IGxhc3RfdGltZTsKLQkJaWYgKHAtPnRvdGFsX3RpbWUgPj0gdGhyZXNob2xkKQorCQlpZiAocC0+dG90YWxfdGltZSA+PSB0aHJlc2hvbGQgJiYgIXBvd2VyX29ubHkpCiAJCQlwLT5kaXNwbGF5ID0gMTsKIAogCQljID0gcC0+YWxsOwpAQCAtODgyLDcgKzkwOCw3IEBACiAJCQlpZiAoYy0+c3RhcnRfdGltZSA9PSAxKQogCQkJCWMtPnN0YXJ0X3RpbWUgPSBmaXJzdF90aW1lOwogCi0JCQlpZiAoYy0+dG90YWxfdGltZSA+PSB0aHJlc2hvbGQpIHsKKwkJCWlmIChjLT50b3RhbF90aW1lID49IHRocmVzaG9sZCAmJiAhcG93ZXJfb25seSkgewogCQkJCWMtPmRpc3BsYXkgPSAxOwogCQkJCWNvdW50Kys7CiAJCQl9CkBAIC0xMTM0LDYgKzExNjAsOCBAQAogCQkgICAgIm91dHB1dCBmaWxlIG5hbWUiKSwKIAlPUFRfSU5URUdFUigndycsICJ3aWR0aCIsICZzdmdfcGFnZV93aWR0aCwKIAkJICAgICJwYWdlIHdpZHRoIiksCisJT1BUX0JPT0xFQU4oJ3AnLCAicG93ZXItb25seSIsICZwb3dlcl9vbmx5LAorCQkgICAgIm91dHB1dCBwb3dlciBkYXRhIG9ubHkiKSwKIAlPUFRfRU5EKCkKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYwppbmRleCAxY2E4ODg5Li5hMWIxZDEwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCkBAIC02ODYsNiArNjg2LDggQEAKIAlzd2l0Y2ggKGMpIHsKIAkJY2FzZSAnZCc6CiAJCQlwcm9tcHRfaW50ZWdlcigmZGVsYXlfc2VjcywgIkVudGVyIGRpc3BsYXkgZGVsYXkiKTsKKwkJCWlmIChkZWxheV9zZWNzIDwgMSkKKwkJCQlkZWxheV9zZWNzID0gMTsKIAkJCWJyZWFrOwogCQljYXNlICdlJzoKIAkJCXByb21wdF9pbnRlZ2VyKCZwcmludF9lbnRyaWVzLCAiRW50ZXIgZGlzcGxheSBlbnRyaWVzIChsaW5lcykiKTsKQEAgLTc4Miw2ICs3ODQsNyBAQAogCSJleGl0X2lkbGUiLAogCSJtd2FpdF9pZGxlIiwKIAkibXdhaXRfaWRsZV93aXRoX2hpbnRzIiwKKwkicG9sbF9pZGxlIiwKIAkicHBjNjRfcnVubGF0Y2hfb2ZmIiwKIAkicHNlcmllc19kZWRpY2F0ZWRfaWRsZV9zbGVlcCIsCiAJTlVMTApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRyYWNlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwppbmRleCBlOWQyNTZlLi4wYzVlNGY3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwpAQCAtMjE5LDEwICsyMTksNiBAQAogbW9yZToKIAlldmVudCA9IChldmVudF90ICopKGJ1ZiArIGhlYWQpOwogCi0Jc2l6ZSA9IGV2ZW50LT5oZWFkZXIuc2l6ZTsKLQlpZiAoIXNpemUpCi0JCXNpemUgPSA4OwotCiAJaWYgKGhlYWQgKyBldmVudC0+aGVhZGVyLnNpemUgPj0gcGFnZV9zaXplICogbW1hcF93aW5kb3cpIHsKIAkJdW5zaWduZWQgbG9uZyBzaGlmdCA9IHBhZ2Vfc2l6ZSAqIChoZWFkIC8gcGFnZV9zaXplKTsKIAkJaW50IHJlczsKQEAgLTIzNyw3ICsyMzMsNiBAQAogCiAJc2l6ZSA9IGV2ZW50LT5oZWFkZXIuc2l6ZTsKIAotCiAJaWYgKCFzaXplIHx8IHByb2Nlc3NfZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCkgPCAwKSB7CiAKIAkJLyoKQEAgLTI5MCw3ICsyODUsNiBAQAogCQkJdXNhZ2Vfd2l0aF9vcHRpb25zKGFubm90YXRlX3VzYWdlLCBvcHRpb25zKTsKIAl9CiAKLQogCXNldHVwX3BhZ2VyKCk7CiAKIAlyZXR1cm4gX19jbWRfdHJhY2UoKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvZGVzaWduLnR4dCBiL3Rvb2xzL3BlcmYvZGVzaWduLnR4dAppbmRleCBmMTk0NmQxLi5mZGQ0MmE4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2Rlc2lnbi50eHQKKysrIGIvdG9vbHMvcGVyZi9kZXNpZ24udHh0CkBAIC00NTUsMyArNDU1LDYgQEAKIAogSWYgeW91ciBhcmNoaXRlY3R1cmUgZG9lcyBoYXZlIGhhcmR3YXJlIGNhcGFiaWxpdGllcywgeW91IGNhbiBvdmVycmlkZSB0aGUKIHdlYWsgc3R1YiBod19wZXJmX2V2ZW50X2luaXQoKSB0byByZWdpc3RlciBoYXJkd2FyZSBjb3VudGVycy4KKworQXJjaGl0ZWN0dXJlcyB0aGF0IGhhdmUgZC1jYWNoZSBhbGlhc3NpbmcgaXNzdWVzLCBzdWNoIGFzIFNwYXJjIGFuZCBBUk0sCitzaG91bGQgc2VsZWN0IFBFUkZfVVNFX1ZNQUxMT0MgaW4gb3JkZXIgdG8gYXZvaWQgdGhlc2UgZm9yIHBlcmYgbW1hcCgpLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL1BFUkYtVkVSU0lPTi1HRU4gYi90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTgppbmRleCBjNTYxZDE1Li41NDU1MmEwIDEwMDc1NQotLS0gYS90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTgorKysgYi90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTgpAQCAtMSw3ICsxLDcgQEAKICMhL2Jpbi9zaAogCiBHVkY9UEVSRi1WRVJTSU9OLUZJTEUKLURFRl9WRVI9djAuMC4xLlBFUkYKK0RFRl9WRVI9djAuMC4yLlBFUkYKIAogTEY9JwogJwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL21vZHVsZS5jIGIvdG9vbHMvcGVyZi91dGlsL21vZHVsZS5jCmluZGV4IDNkNTY3ZmUuLjBkOGM4NWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tb2R1bGUuYworKysgYi90b29scy9wZXJmL3V0aWwvbW9kdWxlLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAKICNpbmNsdWRlIDxsaWJlbGYuaD4KKyNpbmNsdWRlIDxsaWJnZW4uaD4KICNpbmNsdWRlIDxnZWxmLmg+CiAjaW5jbHVkZSA8ZWxmLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CkBAIC00MDksMzUgKzQxMCw0MCBAQAogc3RhdGljIGludCBtb2RfZHNvX19sb2FkX21vZHVsZV9wYXRocyhzdHJ1Y3QgbW9kX2RzbyAqc2VsZikKIHsKIAlzdHJ1Y3QgdXRzbmFtZSB1dHM7Ci0JaW50IGNvdW50ID0gMCwgbGVuOworCWludCBjb3VudCA9IDAsIGxlbiwgZXJyID0gLTE7CiAJY2hhciAqbGluZSA9IE5VTEw7CiAJRklMRSAqZmlsZTsKLQljaGFyICpwYXRoOworCWNoYXIgKmRwYXRoLCAqZGlyOwogCXNpemVfdCBuOwogCiAJaWYgKHVuYW1lKCZ1dHMpIDwgMCkKLQkJZ290byBvdXRfZmFpbHVyZTsKKwkJcmV0dXJuIGVycjsKIAogCWxlbiA9IHN0cmxlbigiL2xpYi9tb2R1bGVzLyIpOwogCWxlbiArPSBzdHJsZW4odXRzLnJlbGVhc2UpOwogCWxlbiArPSBzdHJsZW4oIi9tb2R1bGVzLmRlcCIpOwogCi0JcGF0aCA9IGNhbGxvYygxLCBsZW4pOwotCWlmIChwYXRoID09IE5VTEwpCi0JCWdvdG8gb3V0X2ZhaWx1cmU7CisJZHBhdGggPSBjYWxsb2MoMSwgbGVuICsgMSk7CisJaWYgKGRwYXRoID09IE5VTEwpCisJCXJldHVybiBlcnI7CiAKLQlzdHJjYXQocGF0aCwgIi9saWIvbW9kdWxlcy8iKTsKLQlzdHJjYXQocGF0aCwgdXRzLnJlbGVhc2UpOwotCXN0cmNhdChwYXRoLCAiL21vZHVsZXMuZGVwIik7CisJc3RyY2F0KGRwYXRoLCAiL2xpYi9tb2R1bGVzLyIpOworCXN0cmNhdChkcGF0aCwgdXRzLnJlbGVhc2UpOworCXN0cmNhdChkcGF0aCwgIi9tb2R1bGVzLmRlcCIpOwogCi0JZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7Ci0JZnJlZShwYXRoKTsKKwlmaWxlID0gZm9wZW4oZHBhdGgsICJyIik7CiAJaWYgKGZpbGUgPT0gTlVMTCkKIAkJZ290byBvdXRfZmFpbHVyZTsKIAorCWRpciA9IGRpcm5hbWUoZHBhdGgpOworCWlmICghZGlyKQorCQlnb3RvIG91dF9mYWlsdXJlOworCXN0cmNhdChkaXIsICIvIik7CisKIAl3aGlsZSAoIWZlb2YoZmlsZSkpIHsKLQkJY2hhciAqbmFtZSwgKnRtcDsKIAkJc3RydWN0IG1vZHVsZSAqbW9kdWxlOworCQljaGFyICpuYW1lLCAqcGF0aCwgKnRtcDsKKwkJRklMRSAqbW9kZmlsZTsKIAkJaW50IGxpbmVfbGVuOwogCiAJCWxpbmVfbGVuID0gZ2V0bGluZSgmbGluZSwgJm4sIGZpbGUpOwpAQCAtNDQ1LDE3ICs0NTEsNDEgQEAKIAkJCWJyZWFrOwogCiAJCWlmICghbGluZSkKLQkJCWdvdG8gb3V0X2ZhaWx1cmU7CisJCQlicmVhazsKIAogCQlsaW5lWy0tbGluZV9sZW5dID0gJ1wwJzsgLyogXG4gKi8KIAotCQlwYXRoID0gc3RydG9rKGxpbmUsICI6Iik7CisJCXBhdGggPSBzdHJjaHIobGluZSwgJzonKTsKIAkJaWYgKCFwYXRoKQotCQkJZ290byBvdXRfZmFpbHVyZTsKKwkJCWJyZWFrOworCQkqcGF0aCA9ICdcMCc7CisKKwkJcGF0aCA9IHN0cmR1cChsaW5lKTsKKwkJaWYgKCFwYXRoKQorCQkJYnJlYWs7CisKKwkJaWYgKCFzdHJzdHIocGF0aCwgZGlyKSkgeworCQkJaWYgKHN0cm5jbXAocGF0aCwgImtlcm5lbC8iLCA3KSkKKwkJCQlicmVhazsKKworCQkJZnJlZShwYXRoKTsKKwkJCXBhdGggPSBjYWxsb2MoMSwgc3RybGVuKGRpcikgKyBzdHJsZW4obGluZSkgKyAxKTsKKwkJCWlmICghcGF0aCkKKwkJCQlicmVhazsKKwkJCXN0cmNhdChwYXRoLCBkaXIpOworCQkJc3RyY2F0KHBhdGgsIGxpbmUpOworCQl9CisKKwkJbW9kZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7CisJCWlmIChtb2RmaWxlID09IE5VTEwpCisJCQlicmVhazsKKwkJZmNsb3NlKG1vZGZpbGUpOwogCiAJCW5hbWUgPSBzdHJkdXAocGF0aCk7Ci0JCW5hbWUgPSBzdHJ0b2sobmFtZSwgIi8iKTsKKwkJaWYgKCFuYW1lKQorCQkJYnJlYWs7CiAKKwkJbmFtZSA9IHN0cnRvayhuYW1lLCAiLyIpOwogCQl0bXAgPSBuYW1lOwogCiAJCXdoaWxlICh0bXApIHsKQEAgLTQ2MywyNiArNDkzLDI1IEBACiAJCQlpZiAodG1wKQogCQkJCW5hbWUgPSB0bXA7CiAJCX0KLQkJbmFtZSA9IHN0cnNlcCgmbmFtZSwgIi4iKTsKIAotCQkvKiBRdWlyazogcmVwbGFjZSAnLScgd2l0aCAnXycgaW4gc291bmQgbW9kdWxlcyAqLworCQluYW1lID0gc3Ryc2VwKCZuYW1lLCAiLiIpOworCQlpZiAoIW5hbWUpCisJCQlicmVhazsKKworCQkvKiBRdWlyazogcmVwbGFjZSAnLScgd2l0aCAnXycgaW4gYWxsIG1vZHVsZXMgKi8KIAkJZm9yIChsZW4gPSBzdHJsZW4obmFtZSk7IGxlbjsgbGVuLS0pIHsKIAkJCWlmICgqKG5hbWUrbGVuKSA9PSAnLScpCiAJCQkJKihuYW1lK2xlbikgPSAnXyc7CiAJCX0KIAogCQltb2R1bGUgPSBtb2R1bGVfX25ldyhuYW1lLCBwYXRoKTsKLQkJaWYgKCFtb2R1bGUpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAibG9hZF9tb2R1bGVfcGF0aHM6IGFsbG9jYXRpb24gZXJyb3JcbiIpOwotCQkJZ290byBvdXRfZmFpbHVyZTsKLQkJfQorCQlpZiAoIW1vZHVsZSkKKwkJCWJyZWFrOwogCQltb2RfZHNvX19pbnNlcnRfbW9kdWxlKHNlbGYsIG1vZHVsZSk7CiAKIAkJbW9kdWxlLT5zZWN0aW9ucyA9IHNlY19kc29fX25ld19kc28oInNlY3Rpb25zIik7Ci0JCWlmICghbW9kdWxlLT5zZWN0aW9ucykgewotCQkJZnByaW50ZihzdGRlcnIsICJsb2FkX21vZHVsZV9wYXRoczogYWxsb2NhdGlvbiBlcnJvclxuIik7Ci0JCQlnb3RvIG91dF9mYWlsdXJlOwotCQl9CisJCWlmICghbW9kdWxlLT5zZWN0aW9ucykKKwkJCWJyZWFrOwogCiAJCW1vZHVsZS0+YWN0aXZlID0gbW9kX2Rzb19fbG9hZF9zZWN0aW9ucyhtb2R1bGUpOwogCkBAIC00OTAsMTMgKzUxOSwyMCBAQAogCQkJY291bnQrKzsKIAl9CiAKLQlmcmVlKGxpbmUpOwotCWZjbG9zZShmaWxlKTsKLQotCXJldHVybiBjb3VudDsKKwlpZiAoZmVvZihmaWxlKSkKKwkJZXJyID0gY291bnQ7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgImxvYWRfbW9kdWxlX3BhdGhzOiBtb2R1bGVzLmRlcCBwYXJzaW5nIGZhaWx1cmUhXG4iKTsKIAogb3V0X2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOworCWlmIChkcGF0aCkKKwkJZnJlZShkcGF0aCk7CisJaWYgKGZpbGUpCisJCWZjbG9zZShmaWxlKTsKKwlpZiAobGluZSkKKwkJZnJlZShsaW5lKTsKKworCXJldHVybiBlcnI7CiB9CiAKIGludCBtb2RfZHNvX19sb2FkX21vZHVsZXMoc3RydWN0IG1vZF9kc28gKmRzbykKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwppbmRleCAxM2FiNGI4Li44Y2ZiNDhjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCkBAIC0xNjUsMzMgKzE2NSwzMSBAQAogCURJUiAqc3lzX2RpciwgKmV2dF9kaXI7CiAJc3RydWN0IGRpcmVudCAqc3lzX25leHQsICpldnRfbmV4dCwgc3lzX2RpcmVudCwgZXZ0X2RpcmVudDsKIAljaGFyIGlkX2J1Zls0XTsKLQlpbnQgc3lzX2Rpcl9mZCwgZmQ7CisJaW50IGZkOwogCXU2NCBpZDsKIAljaGFyIGV2dF9wYXRoW01BWFBBVEhMRU5dOworCWNoYXIgZGlyX3BhdGhbTUFYUEFUSExFTl07CiAKIAlpZiAodmFsaWRfZGVidWdmc19tb3VudChkZWJ1Z2ZzX3BhdGgpKQogCQlyZXR1cm4gTlVMTDsKIAogCXN5c19kaXIgPSBvcGVuZGlyKGRlYnVnZnNfcGF0aCk7CiAJaWYgKCFzeXNfZGlyKQotCQlnb3RvIGNsZWFudXA7Ci0Jc3lzX2Rpcl9mZCA9IGRpcmZkKHN5c19kaXIpOworCQlyZXR1cm4gTlVMTDsKIAogCWZvcl9lYWNoX3N1YnN5c3RlbShzeXNfZGlyLCBzeXNfZGlyZW50LCBzeXNfbmV4dCkgewotCQlpbnQgZGZkID0gb3BlbmF0KHN5c19kaXJfZmQsIHN5c19kaXJlbnQuZF9uYW1lLAotCQkJCSBPX1JET05MWXxPX0RJUkVDVE9SWSksIGV2dF9kaXJfZmQ7Ci0JCWlmIChkZmQgPT0gLTEpCisKKwkJc25wcmludGYoZGlyX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIGRlYnVnZnNfcGF0aCwKKwkJCSBzeXNfZGlyZW50LmRfbmFtZSk7CisJCWV2dF9kaXIgPSBvcGVuZGlyKGRpcl9wYXRoKTsKKwkJaWYgKCFldnRfZGlyKQogCQkJY29udGludWU7Ci0JCWV2dF9kaXIgPSBmZG9wZW5kaXIoZGZkKTsKLQkJaWYgKCFldnRfZGlyKSB7Ci0JCQljbG9zZShkZmQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZXZ0X2Rpcl9mZCA9IGRpcmZkKGV2dF9kaXIpOworCiAJCWZvcl9lYWNoX2V2ZW50KHN5c19kaXJlbnQsIGV2dF9kaXIsIGV2dF9kaXJlbnQsIGV2dF9uZXh0KSB7Ci0JCQlzbnByaW50ZihldnRfcGF0aCwgTUFYUEFUSExFTiwgIiVzL2lkIiwKKworCQkJc25wcmludGYoZXZ0X3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcy9pZCIsIGRpcl9wYXRoLAogCQkJCSBldnRfZGlyZW50LmRfbmFtZSk7Ci0JCQlmZCA9IG9wZW5hdChldnRfZGlyX2ZkLCBldnRfcGF0aCwgT19SRE9OTFkpOworCQkJZmQgPSBvcGVuKGV2dF9wYXRoLCBPX1JET05MWSk7CiAJCQlpZiAoZmQgPCAwKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHJlYWQoZmQsIGlkX2J1Ziwgc2l6ZW9mKGlkX2J1ZikpIDwgMCkgewpAQCAtMjI1LDcgKzIyMyw2IEBACiAJCWNsb3NlZGlyKGV2dF9kaXIpOwogCX0KIAotY2xlYW51cDoKIAljbG9zZWRpcihzeXNfZGlyKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTY5NCw3ICs2OTEsMTAgQEAKIAlGSUxFICpmaWxlOwogCWludCBpZDsKIAotCXNwcmludGYoZmlsZW5hbWUsICIvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy8lcy9pZCIsIG9yZ25hbWUpOworCXNwcmludGYoZmlsZW5hbWUsICIlcy8iLCBkZWJ1Z2ZzX3BhdGgpOworCXN0cm5jYXQoZmlsZW5hbWUsIG9yZ25hbWUsIHN0cmxlbihvcmduYW1lKSk7CisJc3RyY2F0KGZpbGVuYW1lLCAiL2lkIik7CisKIAljID0gc3RyY2hyKGZpbGVuYW1lLCAnOicpOwogCWlmIChjKQogCQkqYyA9ICcvJzsKQEAgLTc2MSwyOCArNzYxLDI0IEBACiB7CiAJRElSICpzeXNfZGlyLCAqZXZ0X2RpcjsKIAlzdHJ1Y3QgZGlyZW50ICpzeXNfbmV4dCwgKmV2dF9uZXh0LCBzeXNfZGlyZW50LCBldnRfZGlyZW50OwotCWludCBzeXNfZGlyX2ZkOwogCWNoYXIgZXZ0X3BhdGhbTUFYUEFUSExFTl07CisJY2hhciBkaXJfcGF0aFtNQVhQQVRITEVOXTsKIAogCWlmICh2YWxpZF9kZWJ1Z2ZzX21vdW50KGRlYnVnZnNfcGF0aCkpCiAJCXJldHVybjsKIAogCXN5c19kaXIgPSBvcGVuZGlyKGRlYnVnZnNfcGF0aCk7CiAJaWYgKCFzeXNfZGlyKQotCQlnb3RvIGNsZWFudXA7Ci0Jc3lzX2Rpcl9mZCA9IGRpcmZkKHN5c19kaXIpOworCQlyZXR1cm47CiAKIAlmb3JfZWFjaF9zdWJzeXN0ZW0oc3lzX2Rpciwgc3lzX2RpcmVudCwgc3lzX25leHQpIHsKLQkJaW50IGRmZCA9IG9wZW5hdChzeXNfZGlyX2ZkLCBzeXNfZGlyZW50LmRfbmFtZSwKLQkJCQkgT19SRE9OTFl8T19ESVJFQ1RPUlkpLCBldnRfZGlyX2ZkOwotCQlpZiAoZGZkID09IC0xKQorCisJCXNucHJpbnRmKGRpcl9wYXRoLCBNQVhQQVRITEVOLCAiJXMvJXMiLCBkZWJ1Z2ZzX3BhdGgsCisJCQkgc3lzX2RpcmVudC5kX25hbWUpOworCQlldnRfZGlyID0gb3BlbmRpcihkaXJfcGF0aCk7CisJCWlmICghZXZ0X2RpcikKIAkJCWNvbnRpbnVlOwotCQlldnRfZGlyID0gZmRvcGVuZGlyKGRmZCk7Ci0JCWlmICghZXZ0X2RpcikgewotCQkJY2xvc2UoZGZkKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWV2dF9kaXJfZmQgPSBkaXJmZChldnRfZGlyKTsKKwogCQlmb3JfZWFjaF9ldmVudChzeXNfZGlyZW50LCBldnRfZGlyLCBldnRfZGlyZW50LCBldnRfbmV4dCkgewogCQkJc25wcmludGYoZXZ0X3BhdGgsIE1BWFBBVEhMRU4sICIlczolcyIsCiAJCQkJIHN5c19kaXJlbnQuZF9uYW1lLCBldnRfZGlyZW50LmRfbmFtZSk7CkBAIC03OTEsOCArNzg3LDYgQEAKIAkJfQogCQljbG9zZWRpcihldnRfZGlyKTsKIAl9Ci0KLWNsZWFudXA6CiAJY2xvc2VkaXIoc3lzX2Rpcik7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zdmdoZWxwZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zdmdoZWxwZXIuYwppbmRleCBhNzc4ZmQwLi5iMzYzN2RiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ZnaGVscGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N2Z2hlbHBlci5jCkBAIC0yOCw3ICsyOCw3IEBACiAKIGludCBzdmdfcGFnZV93aWR0aCA9IDEwMDA7CiAKLSNkZWZpbmUgTUlOX1RFWFRfU0laRSAwLjAwMQorI2RlZmluZSBNSU5fVEVYVF9TSVpFIDAuMDEKIAogc3RhdGljIHU2NCB0b3RhbF9oZWlnaHQ7CiBzdGF0aWMgRklMRSAqc3ZnZmlsZTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogCWZwcmludGYoc3ZnZmlsZSwgIiAgICAgIHJlY3QucHJvY2VzczIgeyBmaWxsOnJnYigxODAsMTgwLDE4MCk7IGZpbGwtb3BhY2l0eTowLjk7IHN0cm9rZS13aWR0aDowOyAgIHN0cm9rZTpyZ2IoICAwLCAgMCwgIDApOyB9IFxuIik7CiAJZnByaW50ZihzdmdmaWxlLCAiICAgICAgcmVjdC5zYW1wbGUgICB7IGZpbGw6cmdiKCAgMCwgIDAsMjU1KTsgZmlsbC1vcGFjaXR5OjAuODsgc3Ryb2tlLXdpZHRoOjA7ICAgc3Ryb2tlOnJnYiggIDAsICAwLCAgMCk7IH0gXG4iKTsKIAlmcHJpbnRmKHN2Z2ZpbGUsICIgICAgICByZWN0LmJsb2NrZWQgIHsgZmlsbDpyZ2IoMjU1LCAgMCwgIDApOyBmaWxsLW9wYWNpdHk6MC41OyBzdHJva2Utd2lkdGg6MDsgICBzdHJva2U6cmdiKCAgMCwgIDAsICAwKTsgfSBcbiIpOwotCWZwcmludGYoc3ZnZmlsZSwgIiAgICAgIHJlY3Qud2FpdGluZyAgeyBmaWxsOnJnYigyMTQsMjE0LCAgMCk7IGZpbGwtb3BhY2l0eTowLjM7IHN0cm9rZS13aWR0aDowOyAgIHN0cm9rZTpyZ2IoICAwLCAgMCwgIDApOyB9IFxuIik7CisJZnByaW50ZihzdmdmaWxlLCAiICAgICAgcmVjdC53YWl0aW5nICB7IGZpbGw6cmdiKDIyNCwyMTQsICAwKTsgZmlsbC1vcGFjaXR5OjAuODsgc3Ryb2tlLXdpZHRoOjA7ICAgc3Ryb2tlOnJnYiggIDAsICAwLCAgMCk7IH0gXG4iKTsKIAlmcHJpbnRmKHN2Z2ZpbGUsICIgICAgICByZWN0LldBSVRJTkcgIHsgZmlsbDpyZ2IoMjU1LDIxNCwgNDgpOyBmaWxsLW9wYWNpdHk6MC42OyBzdHJva2Utd2lkdGg6MDsgICBzdHJva2U6cmdiKCAgMCwgIDAsICAwKTsgfSBcbiIpOwogCWZwcmludGYoc3ZnZmlsZSwgIiAgICAgIHJlY3QuY3B1ICAgICAgeyBmaWxsOnJnYigxOTIsMTkyLDE5Mik7IGZpbGwtb3BhY2l0eTowLjI7IHN0cm9rZS13aWR0aDowLjU7IHN0cm9rZTpyZ2IoMTI4LDEyOCwxMjgpOyB9IFxuIik7CiAJZnByaW50ZihzdmdmaWxlLCAiICAgICAgcmVjdC5wc3RhdGUgICB7IGZpbGw6cmdiKDEyOCwxMjgsMTI4KTsgZmlsbC1vcGFjaXR5OjAuODsgc3Ryb2tlLXdpZHRoOjA7IH0gXG4iKTsKQEAgLTIxNyw2ICsyMTcsMTggQEAKIAkJfQogCQlmY2xvc2UoZmlsZSk7CiAJfQorCisJLyogQ1BVIHR5cGUgKi8KKwlmaWxlID0gZm9wZW4oIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTAvY3B1ZnJlcS9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxdWVuY2llcyIsICJyIik7CisJaWYgKGZpbGUpIHsKKwkJd2hpbGUgKGZnZXRzKGJ1ZiwgMjU1LCBmaWxlKSkgeworCQkJdW5zaWduZWQgaW50IGZyZXE7CisJCQlmcmVxID0gc3RydG91bGwoYnVmLCBOVUxMLCAxMCk7CisJCQlpZiAoZnJlcSA+IG1heF9mcmVxKQorCQkJCW1heF9mcmVxID0gZnJlcTsKKwkJfQorCQlmY2xvc2UoZmlsZSk7CisJfQogCXJldHVybiBjcHVfbTsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCmluZGV4IGZkM2Q5YzguLjIyNmY0NGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKQEAgLTMyNCw4ICszMjQsNyBAQAogewogCXJldHVybiBlbGZfc3ltX190eXBlKHN5bSkgPT0gU1RUX0ZVTkMgJiYKIAkgICAgICAgc3ltLT5zdF9uYW1lICE9IDAgJiYKLQkgICAgICAgc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYgJiYKLQkgICAgICAgc3ltLT5zdF9zaXplICE9IDA7CisJICAgICAgIHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBlbGZfc3ltX19pc19sYWJlbChjb25zdCBHRWxmX1N5bSAqc3ltKQpAQCAtNDE0LDcgKzQxMyw3IEBACiAJaWYgKGZkIDwgMCkKIAkJZ290byBvdXQ7CiAKLQllbGYgPSBlbGZfYmVnaW4oZmQsIEVMRl9DX1JFQURfTU1BUCwgTlVMTCk7CisJZWxmID0gZWxmX2JlZ2luKGZkLCBQRVJGX0VMRl9DX1JFQURfTU1BUCwgTlVMTCk7CiAJaWYgKGVsZiA9PSBOVUxMKQogCQlnb3RvIG91dF9jbG9zZTsKIApAQCAtNTM0LDcgKzUzMyw3IEBACiAJRWxmICplbGY7CiAJaW50IG5yID0gMCwga2VybmVsID0gIXN0cmNtcCgiW2tlcm5lbF0iLCBzZWxmLT5uYW1lKTsKIAotCWVsZiA9IGVsZl9iZWdpbihmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKKwllbGYgPSBlbGZfYmVnaW4oZmQsIFBFUkZfRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKIAlpZiAoZWxmID09IE5VTEwpIHsKIAkJaWYgKHYpCiAJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgcmVhZCAlcyBFTEYgZmlsZS5cbiIsCkBAIC02NzYsNyArNjc1LDcgQEAKIAlpZiAoZmQgPCAwKQogCQlnb3RvIG91dDsKIAotCWVsZiA9IGVsZl9iZWdpbihmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKKwllbGYgPSBlbGZfYmVnaW4oZmQsIFBFUkZfRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKIAlpZiAoZWxmID09IE5VTEwpIHsKIAkJaWYgKHYpCiAJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgcmVhZCAlcyBFTEYgZmlsZS5cbiIsCkBAIC04MzMsNyArODMyLDcgQEAKIAlzdHJ1Y3QgbW9kX2RzbyAqbW9kcyA9IG1vZF9kc29fX25ld19kc28oIm1vZHVsZXMiKTsKIAlzdHJ1Y3QgbW9kdWxlICpwb3M7CiAJc3RydWN0IHJiX25vZGUgKm5leHQ7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBjb3VudCA9IDA7CiAKIAllcnIgPSBtb2RfZHNvX19sb2FkX21vZHVsZXMobW9kcyk7CiAKQEAgLTg1MiwxNCArODUxLDE2IEBACiAJCQlicmVhazsKIAogCQluZXh0ID0gcmJfbmV4dCgmcG9zLT5yYl9ub2RlKTsKKwkJY291bnQgKz0gZXJyOwogCX0KIAogCWlmIChlcnIgPCAwKSB7CiAJCW1vZF9kc29fX2RlbGV0ZV9tb2R1bGVzKG1vZHMpOwogCQltb2RfZHNvX19kZWxldGVfc2VsZihtb2RzKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKLQlyZXR1cm4gZXJyOworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRzb19fZmlsbF9zeW1ib2xfaG9sZXMoc3RydWN0IGRzbyAqc2VsZikKQEAgLTkxMyw4ICs5MTQsMTUgQEAKIAogCWlmICh2bWxpbnV4KSB7CiAJCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KHNlbGYsIHZtbGludXgsIGZpbHRlciwgdik7Ci0JCWlmIChlcnIgPiAwICYmIHVzZV9tb2R1bGVzKQotCQkJZXJyID0gZHNvX19sb2FkX21vZHVsZXMoc2VsZiwgZmlsdGVyLCB2KTsKKwkJaWYgKGVyciA+IDAgJiYgdXNlX21vZHVsZXMpIHsKKwkJCWludCBzeW1zID0gZHNvX19sb2FkX21vZHVsZXMoc2VsZiwgZmlsdGVyLCB2KTsKKworCQkJaWYgKHN5bXMgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJkc29fX2xvYWRfbW9kdWxlcyBmYWlsZWQhXG4iKTsKKwkJCQlyZXR1cm4gc3ltczsKKwkJCX0KKwkJCWVyciArPSBzeW1zOworCQl9CiAJfQogCiAJaWYgKGVyciA8PSAwKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCmluZGV4IDZlODQ5MDcuLjgyOWRhOWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAorKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKQEAgLTI3LDYgKzI3LDE2IEBACiAjZW5kaWYKICNlbmRpZgogCisvKgorICogbGliZWxmIDAuOC54IGFuZCBlYXJsaWVyIGRvIG5vdCBzdXBwb3J0IEVMRl9DX1JFQURfTU1BUDsKKyAqIGZvciBuZXdlciB2ZXJzaW9ucyB3ZSBjYW4gdXNlIG1tYXAgdG8gcmVkdWNlIG1lbW9yeSB1c2FnZToKKyAqLworI2lmZGVmIExJQkVMRl9OT19NTUFQCisjIGRlZmluZSBQRVJGX0VMRl9DX1JFQURfTU1BUCBFTEZfQ19SRUFECisjZWxzZQorIyBkZWZpbmUgUEVSRl9FTEZfQ19SRUFEX01NQVAgRUxGX0NfUkVBRF9NTUFQCisjZW5kaWYKKwogI2lmbmRlZiBETUdMX1BBUkFNUwogI2RlZmluZSBETUdMX1BBUkFNUyAgICAgICgxIDw8IDApICAgICAgIC8qIEluY2x1ZGUgZnVuY3Rpb24gYXJncyAqLwogI2RlZmluZSBETUdMX0FOU0kgICAgICAgICgxIDw8IDEpICAgICAgIC8qIEluY2x1ZGUgY29uc3QsIHZvbGF0aWxlLCBldGMgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKaW5kZXggZjZhODQzNy4uNTVjOTY1OSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKQEAgLTYxOCw3ICs2MTgsNyBAQAogfQogCiBzdGF0aWMgaW50IHRlc3RfdHlwZV90b2tlbihlbnVtIGV2ZW50X3R5cGUgdHlwZSwgY2hhciAqdG9rZW4sCi0JCSAgICBlbnVtIGV2ZW50X3R5cGUgZXhwZWN0LCBjaGFyICpleHBlY3RfdG9rKQorCQkgICAgZW51bSBldmVudF90eXBlIGV4cGVjdCwgY29uc3QgY2hhciAqZXhwZWN0X3RvaykKIHsKIAlpZiAodHlwZSAhPSBleHBlY3QpIHsKIAkJZGllKCJFcnJvcjogZXhwZWN0ZWQgdHlwZSAlZCBidXQgcmVhZCAlZCIsCkBAIC02NTAsNyArNjUwLDcgQEAKIAlyZXR1cm4gX19yZWFkX2V4cGVjdF90eXBlKGV4cGVjdCwgdG9rLCAxKTsKIH0KIAotc3RhdGljIGludCBfX3JlYWRfZXhwZWN0ZWQoZW51bSBldmVudF90eXBlIGV4cGVjdCwgY2hhciAqc3RyLCBpbnQgbmV3bGluZV9vaykKK3N0YXRpYyBpbnQgX19yZWFkX2V4cGVjdGVkKGVudW0gZXZlbnRfdHlwZSBleHBlY3QsIGNvbnN0IGNoYXIgKnN0ciwgaW50IG5ld2xpbmVfb2spCiB7CiAJZW51bSBldmVudF90eXBlIHR5cGU7CiAJY2hhciAqdG9rZW47CkBAIC02NjgsMTIgKzY2OCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlYWRfZXhwZWN0ZWQoZW51bSBldmVudF90eXBlIGV4cGVjdCwgY2hhciAqc3RyKQorc3RhdGljIGludCByZWFkX2V4cGVjdGVkKGVudW0gZXZlbnRfdHlwZSBleHBlY3QsIGNvbnN0IGNoYXIgKnN0cikKIHsKIAlyZXR1cm4gX19yZWFkX2V4cGVjdGVkKGV4cGVjdCwgc3RyLCAxKTsKIH0KIAotc3RhdGljIGludCByZWFkX2V4cGVjdGVkX2l0ZW0oZW51bSBldmVudF90eXBlIGV4cGVjdCwgY2hhciAqc3RyKQorc3RhdGljIGludCByZWFkX2V4cGVjdGVkX2l0ZW0oZW51bSBldmVudF90eXBlIGV4cGVjdCwgY29uc3QgY2hhciAqc3RyKQogewogCXJldHVybiBfX3JlYWRfZXhwZWN0ZWQoZXhwZWN0LCBzdHIsIDApOwogfQpAQCAtMTk2OCwxMCArMTk2OCwxMSBAQAogCXsgIk5FVF9UWF9TT0ZUSVJRIiwgMiB9LAogCXsgIk5FVF9SWF9TT0ZUSVJRIiwgMyB9LAogCXsgIkJMT0NLX1NPRlRJUlEiLCA0IH0sCi0JeyAiVEFTS0xFVF9TT0ZUSVJRIiwgNSB9LAotCXsgIlNDSEVEX1NPRlRJUlEiLCA2IH0sCi0JeyAiSFJUSU1FUl9TT0ZUSVJRIiwgNyB9LAotCXsgIlJDVV9TT0ZUSVJRIiwgOCB9LAorCXsgIkJMT0NLX0lPUE9MTF9TT0ZUSVJRIiwgNSB9LAorCXsgIlRBU0tMRVRfU09GVElSUSIsIDYgfSwKKwl7ICJTQ0hFRF9TT0ZUSVJRIiwgNyB9LAorCXsgIkhSVElNRVJfU09GVElSUSIsIDggfSwKKwl7ICJSQ1VfU09GVElSUSIsIDkgfSwKIAogCXsgIkhSVElNRVJfTk9SRVNUQVJUIiwgMCB9LAogCXsgIkhSVElNRVJfUkVTVEFSVCIsIDEgfSwKZGlmZiAtLWdpdCBhL3Vzci8uZ2l0aWdub3JlIGIvdXNyLy5naXRpZ25vcmUKaW5kZXggNjliMmU4OS4uOGU0ODExNyAxMDA2NDQKLS0tIGEvdXNyLy5naXRpZ25vcmUKKysrIGIvdXNyLy5naXRpZ25vcmUKQEAgLTQsNSArNCw3IEBACiBnZW5faW5pdF9jcGlvCiBpbml0cmFtZnNfZGF0YS5jcGlvCiBpbml0cmFtZnNfZGF0YS5jcGlvLmd6Citpbml0cmFtZnNfZGF0YS5jcGlvLmJ6MgoraW5pdHJhbWZzX2RhdGEuY3Bpby5sem1hCiBpbml0cmFtZnNfbGlzdAogaW5jbHVkZQpkaWZmIC0tZ2l0IGEvdXNyL01ha2VmaWxlIGIvdXNyL01ha2VmaWxlCmluZGV4IDI0NTE0NWEuLjFlNmE5ZTQgMTAwNjQ0Ci0tLSBhL3Vzci9NYWtlZmlsZQorKysgYi91c3IvTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBACiBQSE9OWSArPSBrbGliY2RpcnMKIAogCi0jIEd6aXAsIGJ1dCBubyBiemlwMgorIyBHemlwCiBzdWZmaXhfJChDT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX0daSVApICAgPSAuZ3oKIAogIyBCemlwMgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggODk3YmZmMy4uNzQ5NWNlMyAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYworKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC03MzgsOCArNzM4LDcgQEAKIAlib29sIGNhbGxlZCA9IHRydWU7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwogCi0JaWYgKGFsbG9jX2NwdW1hc2tfdmFyKCZjcHVzLCBHRlBfQVRPTUlDKSkKLQkJY3B1bWFza19jbGVhcihjcHVzKTsKKwl6YWxsb2NfY3B1bWFza192YXIoJmNwdXMsIEdGUF9BVE9NSUMpOwogCiAJc3Bpbl9sb2NrKCZrdm0tPnJlcXVlc3RzX2xvY2spOwogCW1lID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtODUxLDYgKzg1MCwxOSBAQAogCiB9CiAKK3N0YXRpYyB2b2lkIGt2bV9tbXVfbm90aWZpZXJfY2hhbmdlX3B0ZShzdHJ1Y3QgbW11X25vdGlmaWVyICptbiwKKwkJCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkJcHRlX3QgcHRlKQoreworCXN0cnVjdCBrdm0gKmt2bSA9IG1tdV9ub3RpZmllcl90b19rdm0obW4pOworCisJc3Bpbl9sb2NrKCZrdm0tPm1tdV9sb2NrKTsKKwlrdm0tPm1tdV9ub3RpZmllcl9zZXErKzsKKwlrdm1fc2V0X3NwdGVfaHZhKGt2bSwgYWRkcmVzcywgcHRlKTsKKwlzcGluX3VubG9jaygma3ZtLT5tbXVfbG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIGt2bV9tbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChzdHJ1Y3QgbW11X25vdGlmaWVyICptbiwKIAkJCQkJCSAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LApAQCAtOTMwLDYgKzk0Miw3IEBACiAJLmludmFsaWRhdGVfcmFuZ2Vfc3RhcnQJPSBrdm1fbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQsCiAJLmludmFsaWRhdGVfcmFuZ2VfZW5kCT0ga3ZtX21tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZCwKIAkuY2xlYXJfZmx1c2hfeW91bmcJPSBrdm1fbW11X25vdGlmaWVyX2NsZWFyX2ZsdXNoX3lvdW5nLAorCS5jaGFuZ2VfcHRlCQk9IGt2bV9tbXVfbm90aWZpZXJfY2hhbmdlX3B0ZSwKIAkucmVsZWFzZQkJPSBrdm1fbW11X25vdGlmaWVyX3JlbGVhc2UsCiB9OwogI2VuZGlmIC8qIENPTkZJR19NTVVfTk9USUZJRVIgJiYgS1ZNX0FSQ0hfV0FOVF9NTVVfTk9USUZJRVIgKi8KQEAgLTE3MTQsNyArMTcyNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX3ZjcHVfdm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fdmNwdV92bV9vcHMgPSB7CiAJLmZhdWx0ID0ga3ZtX3ZjcHVfZmF1bHQsCiB9OwogCkBAIC0yMzE4LDcgKzIzMzEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV92bV92bV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV92bV92bV9vcHMgPSB7CiAJLmZhdWx0ID0ga3ZtX3ZtX2ZhdWx0LAogfTsKIApAQCAtMjYyNiw3ICsyNjM5LDcgQEAKIAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUodmNwdV9zdGF0X2ZvcHMsIHZjcHVfc3RhdF9nZXQsIE5VTEwsICIlbGx1XG4iKTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnN0YXRfZm9wc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnN0YXRfZm9wc1tdID0gewogCVtLVk1fU1RBVF9WQ1BVXSA9ICZ2Y3B1X3N0YXRfZm9wcywKIAlbS1ZNX1NUQVRfVk1dICAgPSAmdm1fc3RhdF9mb3BzLAogfTsKQEAgLTI3MDQsOCArMjcxNyw2IEBACiAJaW50IHI7CiAJaW50IGNwdTsKIAotCWt2bV9pbml0X2RlYnVnKCk7Ci0KIAlyID0ga3ZtX2FyY2hfaW5pdChvcGFxdWUpOwogCWlmIChyKQogCQlnb3RvIG91dF9mYWlsOwpAQCAtMjc3Miw2ICsyNzgzLDggQEAKIAlrdm1fcHJlZW1wdF9vcHMuc2NoZWRfaW4gPSBrdm1fc2NoZWRfaW47CiAJa3ZtX3ByZWVtcHRfb3BzLnNjaGVkX291dCA9IGt2bV9zY2hlZF9vdXQ7CiAKKwlrdm1faW5pdF9kZWJ1ZygpOworCiAJcmV0dXJuIDA7CiAKIG91dF9mcmVlOgpAQCAtMjc5NCw3ICsyODA3LDYgQEAKIG91dDoKIAlrdm1fYXJjaF9leGl0KCk7CiBvdXRfZmFpbDoKLQlrdm1fZXhpdF9kZWJ1ZygpOwogCXJldHVybiByOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2luaXQpOwpAQCAtMjgwMiw2ICsyODE0LDcgQEAKIHZvaWQga3ZtX2V4aXQodm9pZCkKIHsKIAl0cmFjZXBvaW50X3N5bmNocm9uaXplX3VucmVnaXN0ZXIoKTsKKwlrdm1fZXhpdF9kZWJ1ZygpOwogCW1pc2NfZGVyZWdpc3Rlcigma3ZtX2Rldik7CiAJa21lbV9jYWNoZV9kZXN0cm95KGt2bV92Y3B1X2NhY2hlKTsKIAlzeXNkZXZfdW5yZWdpc3Rlcigma3ZtX3N5c2Rldik7CkBAIC0yODExLDcgKzI4MjQsNiBAQAogCW9uX2VhY2hfY3B1KGhhcmR3YXJlX2Rpc2FibGUsIE5VTEwsIDEpOwogCWt2bV9hcmNoX2hhcmR3YXJlX3Vuc2V0dXAoKTsKIAlrdm1fYXJjaF9leGl0KCk7Ci0Ja3ZtX2V4aXRfZGVidWcoKTsKIAlmcmVlX2NwdW1hc2tfdmFyKGNwdXNfaGFyZHdhcmVfZW5hYmxlZCk7CiAJX19mcmVlX3BhZ2UoYmFkX3BhZ2UpOwogfQo=